ZGlmZiAtLWdpdCBhL2FwZXgvQW5kcm9pZC5icCBiL2FwZXgvQW5kcm9pZC5icAppbmRleCA1NzU2MDNmLi42MDRiMjY4IDEwMDY0NAotLS0gYS9hcGV4L0FuZHJvaWQuYnAKKysrIGIvYXBleC9BbmRyb2lkLmJwCkBAIC0yNywxNCArMjcsMjkgQEAKICAgICAgICAgImxpYm1wZWcyZXh0cmFjdG9yIiwKICAgICAgICAgImxpYm9nZ2V4dHJhY3RvciIsCiAgICAgICAgICJsaWJ3YXZleHRyYWN0b3IiLAotICAgICAgICAvLyBNZWRpYVBsYXllcjIKLSAgICAgICAgImxpYm1lZGlhMl9qbmkiLAogICAgIF0sCiAgICAga2V5OiAiY29tLmFuZHJvaWQubWVkaWEua2V5IiwKIH0KIAorYXBleCB7CisgICAgbmFtZTogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCisgICAgbWFuaWZlc3Q6ICJtYW5pZmVzdF9jb2RlYy5qc29uIiwKKyAgICBuYXRpdmVfc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhX2NvZGVjc2VydmljZXJlZ2lzdHJhbnQiLAorICAgIF0sCisgICAgdXNlX3ZlbmRvcjogdHJ1ZSwKKyAgICBrZXk6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLmtleSIsCit9CisKIGFwZXhfa2V5IHsKICAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEua2V5IiwKICAgICBwdWJsaWNfa2V5OiAiY29tLmFuZHJvaWQubWVkaWEuYXZicHVia2V5IiwKICAgICBwcml2YXRlX2tleTogImNvbS5hbmRyb2lkLm1lZGlhLnBlbSIsCiB9CisKK2FwZXhfa2V5IHsKKyAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5rZXkiLAorICAgIHB1YmxpY19rZXk6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLmF2YnB1YmtleSIsCisgICAgcHJpdmF0ZV9rZXk6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLnBlbSIsCit9CmRpZmYgLS1naXQgYS9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMuYXZicHVia2V5IGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLmF2YnB1YmtleQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDU5NzIzCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLmF2YnB1YmtleQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMucGVtIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzc5Y2QzCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLnBlbQpAQCAtMCwwICsxLDUxIEBACistLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tCitNSUlKS2dJQkFBS0NBZ0VBdkI2bE9FRU9SNThLTWNGbGF5RVpqc1h1UGdjZkhpL09QeGN2ZnBpR0xDcE9jSzNsCitPUENoV1V2RFJjSUhNQjdCTytDc2Z4czBIZ3NIdnZaZk55b05JbTk5V2NqRmJib2lPN1dyQkJBcklzelByMTRYCitjZlkyTnh6VDlMQmorRXFBbmJkTCs0T1FXMS9ucExITkUwcXREY3hMNzFpcGJqU3VLTmI1OEU5cUdMMEt3dmtTCitmd3d1ZVdqKytiZy9pejdkcTBtejdpS3BueFlzY05tNFJoSmpxY0cyVXNtZzRFamhyOGg1VW1PVW1USmJPYkMvCit2ekNsWFFxZWV1elM4TlR0R1ZnUS9DSTlnQzJXTjl1cHEycC8yVDdQNFUzbzNDV3ZCeXRVb0xLUjBVeUM4M2V5CitTOFhKZ09hNDJ1V1IzVC9lSk9JMVpTNEg2U3JnMW8yWEM4WWI4RXByRkkvTk02LysvNURYL0ZnRGltc3NsQVA2CitRcTQrcFN0ZTl2L0ZqV0dxeTdRQlFhZWZGUkdSdVM2M3hIY1NaaFhDOUoyQ0ZkbnhvOCs2NVFUOHI0eWZRRWVpCitBeC8wUTk0eUI3VklMMXBJSnhIRW9uS2p0ZDNpS2RGRUtRekFESjNlZHNtdEh5YkVSZEpLQ3hjbTlRSXJEQ3NDCis0WVZUOW5YME9vQzlSRDVkNUVWRDdXNUk2ZUVuUnU2aWdyS0lLZ1VWcHBlWUZRTlpEK28rZWlOSmE0eW9nZ1JsCitoOHNUMC94TEtqTVJ4QVE3ZmFmaTFqK0xCMk83VWdKbUlEREFuaWRxOEFvejdoM3BOaTEzOXJOV3JqTmZ3aHVzCituTWNadkw5ZFRWdjI2SldlRVNIUC96QWZBWDdqMXJma0R3UjAyb2NSTHF1d0VVczErVUhBMjdXaTFiTUNBd0VBCitBUUtDQWdBTzNQVDgzdGI3L2FyV2g0czF6YVd4VEI0b3RITlc5VHY4YkI2S2lBNkJ5czNyeFRHSk1DbnZYamNOCitlZWtMZWtLV01vZ3VlcjNCYWVtd3d0Si9EMGwrWVFTc1pWcUQ4dUxsaU5MOFBUTExTeGRWcWI5OGQ1R05CVEFSCis4eVhTNWtBSE5nWkExd0krMWZMOVpqYm53VXl1L0djN2YrdlRFMEozWTVUWDBjNTJLZW1Cd2lBZC9aNW1aVTlQCis5Nmk5bmJmeDRwN2V2OHBiRVd0dGR5WkNFdzNneWJkWUR5b3d6bEZXakNaWnhoaGxpajcrN2VJWWZ3Vnh0bmNUCitDMGNYVkJ0dmx5K3dYQnd6MW1ZNS81Y0dQaUhmemtDcWNuZGxmV3k0eWttamNMaG9xdnpsczUxWXMwWGFjMkJECittMFBORVZEQjVVV0d1djVSQTl4RDEyZ0p2QnRVM0Q3Z2dNdzZDNVJjWEpUK2pTWW1TRnREMmtsV2krSXQ4QS9OCitIdjQyc29Lc2t0NkpxWUFXRTFjdkozUEVxSDlBU0VKTnEyUjBaL1BtdU0wMDBVSnl6VTlLSWQzU053alhBMVhjCitLbjloUmdhNHVmOWVsSFRqa1REdDc5LzgrWHY3aGplcjlzRi9TL25wN2cwNHJVaklXa3VGa0MvN05LMnRRU2gxCittbGpWMXNEOVNGNERQZlZLNzVMd0pKYVFVbEk3VHRHZDVLSjdGelp3dmIrdzhPRHJwVzNoa3Q2RmNJNkt3RS9hCitRVDFUMlo5RGtuWEpTWU5kV0dyajZ2TUhzWU1peXo4SWRBSFNDck9CNmVYQ1F4cGl0Ym42VzcxUmF3N2Y5VWFaCitWREs1QWhUVTQ5M2hrR2oxbm80Y0p3ZWNYSW5NaWdnL2M0eXdrMkliaDZJVjhPMG5rUUtDQVFFQTIrZFFRMElGCit2dlZnbVEyV3hIQkQ3TTJtYk95ZjQzWUJZNkthNm9QQk5HUFZwWkU4WDhMb1RhdlFMVitTZ0NrSDhUNmdZN1hTCis1TDRaZTBKRnhmdWEwbzFybTYrTDJYck94NUYvQTJZNDBZY1BjbEVpazVoMXdvU3dIL0oxaUhHaUVoWThOcWV1Cis5R0N2alFvamtnWHgvUm4zTnorbHB2WjMyOU8zSDg1UldXR0YwbDYwUndMT2tpZzBad1ViNjE5dDhhZmZtR0lsCitzeGREdjJuZnk3T3RKWDhpR0R1YTdLZjY0ZHZWV1FLS3RBQ1drQVJybGtjV1gzdW9FU3hrcFNEeHVlK3o3bmRICitvN3VITGZNOFR4K1JuK1F2WVd1Ulc1VFBMYkVETWJJWXJYNjVJU3Qyci9UN3YvMDRYZEFDOFlwQ1FSeXRscVBJCitmcERtMTVodHlIQml6UUtDQVFFQTJ2KzVvdFJvWTU2SmR1SVNhVkdsc0ovSWJ2S3pEQUl5V21NMTRFcFJDUjVFCitsdStNcFRjUkFpRlFBYkhHWHIxdE1sVEZkVkZEMDkwV0F6SUthS3RBREZWTFhvYklIZUdzcG5SQ3E1T3BWcDlXCitSdkx0VndMeGZsSEFjMnlOOS9MTnRuQnFIVWd0K1MwMUxCUEVseWJkR0hRUlR0cUFLWGhrcDMxc00yMU8zNEdvCitQcmkvSXhndXBXeHlrTWFXNDRLaWcxQ3I1REt2Yzhjd1VzR3V5RGRKbThvQlFlTlBUTVdxU25YdHFvVFdTYVlnCisya3hpTVRGb2tya1NYZ3VmYjh3bmc2T1h0L1FlbHl3cmhHM2hBc2xkUE8zR2RLaWREU3hoV1pTZ3BVWFhGZEFYCit5NEdPMEljUkpCRi9XSnRZVFl0UitsODRuUUEyLzFZZTR1akZsVDBhZndLQ0FRRUFtWHJYcFNtMmN2STJDbnpXCitocUpJZGtXT2E2VzNibjFWT09JcnQ1UmZ5NTRHWm5sNHB1bVZVMmlnY3BxcTJISkt6ZERGQnZMSGo4a3laYm42CitrdFVwMk56Rmh6SzlxL3V2eU5BKzB2T01vb2plZWc0dzBNenZHK1dhTzZIdzhGdEhIOUtQRWlKMDFMR0t0U2luCitiT3BqWENDOFQ3NUhjc0hCSkJlZlR6Nmp2bnQzZUQyTEc2alUzbVBiTnkvMHJaRzhYWmFxVTJQbEpoc051TkkvCitWYUJCTDlPTXkxY0dxVGdRdllTK1lsS0kxbHMydXF1ckg0YmNFYVp2eGhTeTVpR1pOUW9kRGtvSUlUbm9mbVN1Cis2aGFCZ0JRMkVZdVBOMWtrUktLd05RWTFmUm5lUWsxZ21DeW5iUGRpV08rdXJrQ3VQMTJ4dGxyM3U0YU01MXJHCisvTWViM1FLQ0FRRUExMlN4Wm05WGhMT0hMSUJKNzRBNFlMR201MGlaeFhQYnBuN3huSG83bmFaQmU5cDhFSHRLCitwVGV5Z3hnZ3JVbk9QclNWeVQ5MllNaVFQL0JWd0lDK2ErTHdVRFpzV01kL2tlL0RLeEgrZVk0Wnc0cG0yUyt4Cis2YlhxZlJ3RnZocjNMVHIvZzNGY2xqbGFsTkdVaDczWHM1ZGs5cE45Zmt4RlkxNitydzRSaDA3MDlVdXI0bzZFCitRbnVaYXIrSDVKaTEwa1hqNm52WGlSNGVieWJFQzNRbFY2Nms4ZkxxS2U0NEFTaGY2MWpma214czM0aEZBM0UvCitFeUFuNm91djhydHZHZEFyQnVoNXRlSGhvMHlYQkxDY25iS1hnR0hlcGZoQ2YyTHBaZVI5R1owajZpcXhGblBoCis3Z0d2cUt5UmV5Tk9LOXkveDl0UVBHNnR6aXQzT2NOeGJRS0NBUUVBdURoZURPU2tYUG9wWE12TEFLT0hCSWRaCityYlE3b0ZUREh0NTlnYnVjTTdVOC9sMll0YXh1S09RRkJMbnpRYS9hbUlra3J0a2xZd09zejhFMjRkN05tMzl3Cit5a0xId1gwWHJtakFtNk00WEttRHY2NmEra1NuU1Y2TEViS1pkanZYUDAyRFYrdEdlWjVWc25OdkpEcXV4TXNECitmdlJUc3BCOGo4Q3BVOTZzemVreGwvdENSaHFiZHcvNGtWVFNqNUJGKytPYVJSY0pyQXlqMUIycWYxeW5BWkUxCitnVXZWUGtFWWE5MTR6Y3J4ZzlYSVhUNE03eXFCN2k4S0plZ090T3RjV2pKN3VUaVArNjM4QXZ5Z0pMTUpuU3JWCisrSGpGWldHNlA5YnRabUxIU0VCUnZ3R09BaWxwMHFlalhvODY2bDBmbW5sR3k3ZWhLejh1M1B6dm5sUFlqUT09CistLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvYXBleC9tYW5pZmVzdF9jb2RlYy5qc29uIGIvYXBleC9tYW5pZmVzdF9jb2RlYy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYmNlZWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L21hbmlmZXN0X2NvZGVjLmpzb24KQEAgLTAsMCArMSw0IEBACit7CisgICJuYW1lIjogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAidmVyc2lvbiI6IDEKK30KZGlmZiAtLWdpdCBhL2NhbWVyYS9BbmRyb2lkLmJwIGIvY2FtZXJhL0FuZHJvaWQuYnAKaW5kZXggMjRiMzkxOC4uMjE1ODhkNCAxMDA2NDQKLS0tIGEvY2FtZXJhL0FuZHJvaWQuYnAKKysrIGIvY2FtZXJhL0FuZHJvaWQuYnAKQEAgLTQzLDYgKzQzLDcgQEAKICAgICAgICAgIklDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyLmNwcCIsCiAgICAgICAgICJjYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmNwcCIsCiAgICAgICAgICJjYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uY3BwIiwKKyAgICAgICAgImNhbWVyYTIvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uY3BwIiwKICAgICAgICAgImNhbWVyYTIvU3VibWl0SW5mby5jcHAiLAogICAgICAgICAiQ2FtZXJhQmFzZS5jcHAiLAogICAgICAgICAiQ2FtZXJhVXRpbHMuY3BwIiwKZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5jcHAgYi9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuY3BwCmluZGV4IGUxNDNlMDUuLjkyZmU4NGIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmNwcApAQCAtMjIsNyArMjIsNiBAQAogCiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgotI2luY2x1ZGUgPGNhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDA5LDYgKzQwOCw3OSBAQAogICAgIHJldHVybiByZXM7CiB9CiAKK3N0YXR1c190IENhbWVyYU1ldGFkYXRhOjpyZW1vdmVQZXJtaXNzaW9uRW50cmllcyhtZXRhZGF0YV92ZW5kb3JfaWRfdCB2ZW5kb3JJZCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gKnRhZ3NSZW1vdmVkKSB7CisgICAgdWludDMyX3QgdGFnQ291bnQgPSAwOworICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiB0YWdzVG9SZW1vdmU7CisKKyAgICBpZiAodGFnc1JlbW92ZWQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IHZUYWdzID0gVmVuZG9yVGFnRGVzY3JpcHRvcjo6Z2V0R2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcigpOworICAgIGlmICgobnVsbHB0ciA9PSB2VGFncy5nZXQoKSkgfHwgKDAgPj0gdlRhZ3MtPmdldFRhZ0NvdW50KCkpKSB7CisgICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZT4gY2FjaGUgPQorICAgICAgICAgICAgVmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlOjpnZXRHbG9iYWxWZW5kb3JUYWdDYWNoZSgpOworICAgICAgICBpZiAoY2FjaGUuZ2V0KCkpIHsKKyAgICAgICAgICAgIGNhY2hlLT5nZXRWZW5kb3JUYWdEZXNjcmlwdG9yKHZlbmRvcklkLCAmdlRhZ3MpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChudWxscHRyICE9IHZUYWdzLmdldCgpKSAmJiAodlRhZ3MtPmdldFRhZ0NvdW50KCkgPiAwKSkgeworICAgICAgICB0YWdDb3VudCA9IHZUYWdzLT5nZXRUYWdDb3VudCgpOworICAgICAgICB1aW50MzJfdCAqdmVuZG9yVGFncyA9IG5ldyB1aW50MzJfdFt0YWdDb3VudF07CisgICAgICAgIGlmIChudWxscHRyID09IHZlbmRvclRhZ3MpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgdlRhZ3MtPmdldFRhZ0FycmF5KHZlbmRvclRhZ3MpOworCisgICAgICAgIHRhZ3NUb1JlbW92ZS5yZXNlcnZlKHRhZ0NvdW50KTsKKyAgICAgICAgdGFnc1RvUmVtb3ZlLmluc2VydCh0YWdzVG9SZW1vdmUuYmVnaW4oKSwgdmVuZG9yVGFncywgdmVuZG9yVGFncyArIHRhZ0NvdW50KTsKKworICAgICAgICBkZWxldGUgW10gdmVuZG9yVGFnczsKKyAgICAgICAgdGFnQ291bnQgPSAwOworICAgIH0KKworICAgIGF1dG8gdGFnc05lZWRpbmdQZXJtaXNzaW9uID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9wZXJtaXNzaW9uX25lZWRlZCgmdGFnQ291bnQpOworICAgIGlmICh0YWdDb3VudCA+IDApIHsKKyAgICAgICAgdGFnc1RvUmVtb3ZlLnJlc2VydmUodGFnc1RvUmVtb3ZlLmNhcGFjaXR5KCkgKyB0YWdDb3VudCk7CisgICAgICAgIHRhZ3NUb1JlbW92ZS5pbnNlcnQodGFnc1RvUmVtb3ZlLmVuZCgpLCB0YWdzTmVlZGluZ1Blcm1pc3Npb24sCisgICAgICAgICAgICAgICAgdGFnc05lZWRpbmdQZXJtaXNzaW9uICsgdGFnQ291bnQpOworICAgIH0KKworICAgIHRhZ3NSZW1vdmVkLT5yZXNlcnZlKHRhZ3NUb1JlbW92ZS5zaXplKCkpOworICAgIGZvciAoY29uc3QgYXV0byAmaXQgOiB0YWdzVG9SZW1vdmUpIHsKKyAgICAgICAgaWYgKGV4aXN0cyhpdCkpIHsKKyAgICAgICAgICAgIGF1dG8gcmMgPSBlcmFzZShpdCk7CisgICAgICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBlcmFzZSB0YWc6ICV4IiwgX19mdW5jX18sIGl0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0YWdzUmVtb3ZlZC0+cHVzaF9iYWNrKGl0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFVwZGF0ZSB0aGUgYXZhaWxhYmxlIGNoYXJhY3RlcnN0aWNzIGFjY29yZGluZ2x5CisgICAgaWYgKGV4aXN0cyhBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTKSkgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gY3VycmVudEtleXM7CisKKyAgICAgICAgc3RkOjpzb3J0KHRhZ3NSZW1vdmVkLT5iZWdpbigpLCB0YWdzUmVtb3ZlZC0+ZW5kKCkpOworICAgICAgICBhdXRvIGtleXMgPSBmaW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0hBUkFDVEVSSVNUSUNTX0tFWVMpOworICAgICAgICBjdXJyZW50S2V5cy5yZXNlcnZlKGtleXMuY291bnQpOworICAgICAgICBjdXJyZW50S2V5cy5pbnNlcnQoY3VycmVudEtleXMuZW5kKCksIGtleXMuZGF0YS5pMzIsIGtleXMuZGF0YS5pMzIgKyBrZXlzLmNvdW50KTsKKyAgICAgICAgc3RkOjpzb3J0KGN1cnJlbnRLZXlzLmJlZ2luKCksIGN1cnJlbnRLZXlzLmVuZCgpKTsKKworICAgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBuZXdLZXlzKGtleXMuY291bnQpOworICAgICAgICBhdXRvIGVuZCA9IHN0ZDo6c2V0X2RpZmZlcmVuY2UoY3VycmVudEtleXMuYmVnaW4oKSwgY3VycmVudEtleXMuZW5kKCksIHRhZ3NSZW1vdmVkLT5iZWdpbigpLAorICAgICAgICAgICAgICAgIHRhZ3NSZW1vdmVkLT5lbmQoKSwgbmV3S2V5cy5iZWdpbigpKTsKKyAgICAgICAgbmV3S2V5cy5yZXNpemUoZW5kIC0gbmV3S2V5cy5iZWdpbigpKTsKKworICAgICAgICB1cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DSEFSQUNURVJJU1RJQ1NfS0VZUywgbmV3S2V5cy5kYXRhKCksIG5ld0tleXMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKIHZvaWQgQ2FtZXJhTWV0YWRhdGE6OmR1bXAoaW50IGZkLCBpbnQgdmVyYm9zaXR5LCBpbnQgaW5kZW50YXRpb24pIGNvbnN0IHsKICAgICBkdW1wX2luZGVudGVkX2NhbWVyYV9tZXRhZGF0YShtQnVmZmVyLCBmZCwgdmVyYm9zaXR5LCBpbmRlbnRhdGlvbik7CiB9CmRpZmYgLS1naXQgYS9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5jcHAgYi9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5jcHAKaW5kZXggYTg2Y2M4Ny4uZDcxM2QyZCAxMDA2NDQKLS0tIGEvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuY3BwCisrKyBiL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmNwcApAQCAtMzE1LDYgKzMxNSwxMCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3NpemVfdCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpnZXRTZWN0aW9uSW5kZXgodWludDMyX3QgdGFnKSBjb25zdCB7CisgICAgcmV0dXJuIG1UYWdUb1NlY3Rpb25NYXAudmFsdWVGb3IodGFnKTsKK30KKwogdm9pZCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpkdW1wKGludCBmZCwgaW50IHZlcmJvc2l0eSwgaW50IGluZGVudGF0aW9uKSBjb25zdCB7CiAKICAgICBzaXplX3Qgc2l6ZSA9IG1UYWdUb05hbWVNYXAuc2l6ZSgpOwpAQCAtNDA3LDYgKzQxMSwxMSBAQAogICAgIHJldHVybiByZXM7CiB9CiAKK2NvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxtZXRhZGF0YV92ZW5kb3JfaWRfdCwgc3A8YW5kcm9pZDo6VmVuZG9yVGFnRGVzY3JpcHRvcj4+ICYKKyAgICAgICAgICAgIFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZTo6Z2V0VmVuZG9ySWRzQW5kVGFnRGVzY3JpcHRvcnMoKSB7CisgICAgcmV0dXJuIG1WZW5kb3JNYXA7Cit9CisKIGludCBWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGU6OmdldFRhZ0NvdW50KG1ldGFkYXRhX3ZlbmRvcl9pZF90IGlkKSBjb25zdCB7CiAgICAgaW50IHJldCA9IDA7CiAgICAgYXV0byBkZXNjID0gbVZlbmRvck1hcC5maW5kKGlkKTsKZGlmZiAtLWdpdCBhL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuYWlkbCBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuYWlkbAppbmRleCA5YzBmMjhiLi5jMDM4MzE0IDEwMDY0NAotLS0gYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmFpZGwKKysrIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZS5haWRsCkBAIC0xNDksOCArMTQ5LDEwIEBACiAgICAgY29uc3QgaW50IEFQSV9WRVJTSU9OXzEgPSAxOwogICAgIGNvbnN0IGludCBBUElfVkVSU0lPTl8yID0gMjsKIAotICAgIC8vIERldGVybWluZXMgaWYgYSBwYXJ0aWN1bGFyIEFQSSB2ZXJzaW9uIGlzIHN1cHBvcnRlZCBkaXJlY3RseQorICAgIC8vIERldGVybWluZXMgaWYgYSBwYXJ0aWN1bGFyIEFQSSB2ZXJzaW9uIGlzIHN1cHBvcnRlZCBkaXJlY3RseSBmb3IgYSBjYW1lcmFJZC4KICAgICBib29sZWFuIHN1cHBvcnRzQ2FtZXJhQXBpKFN0cmluZyBjYW1lcmFJZCwgaW50IGFwaVZlcnNpb24pOworICAgIC8vIERldGVybWluZXMgaWYgYSBjYW1lcmFJZCBpcyBhIGhpZGRlbiBwaHlzaWNhbCBjYW1lcmEgb2YgYSBsb2dpY2FsIG11bHRpLWNhbWVyYS4KKyAgICBib29sZWFuIGlzSGlkZGVuUGh5c2ljYWxDYW1lcmEoU3RyaW5nIGNhbWVyYUlkKTsKIAogICAgIHZvaWQgc2V0VG9yY2hNb2RlKFN0cmluZyBjYW1lcmFJZCwgYm9vbGVhbiBlbmFibGVkLCBJQmluZGVyIGNsaWVudEJpbmRlcik7CiAKZGlmZiAtLWdpdCBhL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5haWRsIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmFpZGwKaW5kZXggNGNlZDA4Yy4uNDlkZmRlOCAxMDA2NDQKLS0tIGEvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmFpZGwKKysrIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmFpZGwKQEAgLTE5LDYgKzE5LDcgQEAKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FwdHVyZVJlcXVlc3Q7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLmltcGwuQ2FtZXJhTWV0YWRhdGFOYXRpdmU7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLnBhcmFtcy5PdXRwdXRDb25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5wYXJhbXMuU2Vzc2lvbkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLnV0aWxzLlN1Ym1pdEluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7CiAKQEAgLTgzLDYgKzg0LDE2IEBACiAgICAgICovCiAgICAgdm9pZCBlbmRDb25maWd1cmUoaW50IG9wZXJhdGluZ01vZGUsIGluIENhbWVyYU1ldGFkYXRhTmF0aXZlIHNlc3Npb25QYXJhbXMpOwogCisgICAgLyoqCisgICAgICAqIENoZWNrIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIHNlc3Npb24gY29uZmlndXJhdGlvbiBoYXMgY2FtZXJhIGRldmljZQorICAgICAgKiBzdXBwb3J0LgorICAgICAgKgorICAgICAgKiBAcGFyYW0gc2Vzc2lvbkNvbmZpZ3VyYXRpb24gU3BlY2lmaWMgc2Vzc2lvbiBjb25maWd1cmF0aW9uIHRvIGJlIHZlcmlmaWVkLgorICAgICAgKiBAcmV0dXJuIHRydWUgIC0gaW4gY2FzZSB0aGUgc3RyZWFtIGNvbWJpbmF0aW9uIGlzIHN1cHBvcnRlZC4KKyAgICAgICogICAgICAgICBmYWxzZSAtIGluIGNhc2UgdGhlcmUgaXMgbm8gZGV2aWNlIHN1cHBvcnQuCisgICAgICAqLworICAgIGJvb2xlYW4gaXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZChpbiBTZXNzaW9uQ29uZmlndXJhdGlvbiBzZXNzaW9uQ29uZmlndXJhdGlvbik7CisKICAgICB2b2lkIGRlbGV0ZVN0cmVhbShpbnQgc3RyZWFtSWQpOwogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvcGFyYW1zL1Nlc3Npb25Db25maWd1cmF0aW9uLmFpZGwgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvcGFyYW1zL1Nlc3Npb25Db25maWd1cmF0aW9uLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJmMTU1NgotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9wYXJhbXMvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uYWlkbApAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIucGFyYW1zOworCisvKiogQGhpZGUgKi8KK3BhcmNlbGFibGUgU2Vzc2lvbkNvbmZpZ3VyYXRpb24gY3BwX2hlYWRlciAiY2FtZXJhL2NhbWVyYTIvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uaCI7CmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmNwcCBiL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uY3BwCmluZGV4IGZlYjA0YzIuLjRlOWIyN2QgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uY3BwCisrKyBiL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uY3BwCkBAIC0xNjcsMTQgKzE2NywyNCBAQAogfQogCiBPdXRwdXRDb25maWd1cmF0aW9uOjpPdXRwdXRDb25maWd1cmF0aW9uKHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnAsIGludCByb3RhdGlvbiwKKyAgICAgICAgY29uc3QgU3RyaW5nMTYmIHBoeXNpY2FsSWQsCiAgICAgICAgIGludCBzdXJmYWNlU2V0SUQsIGJvb2wgaXNTaGFyZWQpIHsKICAgICBtR2Jwcy5wdXNoX2JhY2soZ2JwKTsKICAgICBtUm90YXRpb24gPSByb3RhdGlvbjsKICAgICBtU3VyZmFjZVNldElEID0gc3VyZmFjZVNldElEOwogICAgIG1Jc0RlZmVycmVkID0gZmFsc2U7CiAgICAgbUlzU2hhcmVkID0gaXNTaGFyZWQ7CisgICAgbVBoeXNpY2FsQ2FtZXJhSWQgPSBwaHlzaWNhbElkOwogfQogCitPdXRwdXRDb25maWd1cmF0aW9uOjpPdXRwdXRDb25maWd1cmF0aW9uKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPj4mIGdicHMsCisgICAgaW50IHJvdGF0aW9uLCBjb25zdCBTdHJpbmcxNiYgcGh5c2ljYWxDYW1lcmFJZCwgaW50IHN1cmZhY2VTZXRJRCwgIGludCBzdXJmYWNlVHlwZSwKKyAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGJvb2wgaXNTaGFyZWQpCisgIDogbUdicHMoZ2JwcyksIG1Sb3RhdGlvbihyb3RhdGlvbiksIG1TdXJmYWNlU2V0SUQoc3VyZmFjZVNldElEKSwgbVN1cmZhY2VUeXBlKHN1cmZhY2VUeXBlKSwKKyAgICBtV2lkdGgod2lkdGgpLCBtSGVpZ2h0KGhlaWdodCksIG1Jc0RlZmVycmVkKGZhbHNlKSwgbUlzU2hhcmVkKGlzU2hhcmVkKSwKKyAgICBtUGh5c2ljYWxDYW1lcmFJZChwaHlzaWNhbENhbWVyYUlkKSB7IH0KKwogc3RhdHVzX3QgT3V0cHV0Q29uZmlndXJhdGlvbjo6d3JpdGVUb1BhcmNlbChhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgY29uc3QgewogCiAgICAgaWYgKHBhcmNlbCA9PSBudWxscHRyKSByZXR1cm4gQkFEX1ZBTFVFOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL2NhbWVyYTIvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uY3BwIGIvY2FtZXJhL2NhbWVyYTIvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MzFhMzMKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5jcHAKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNkZWZpbmUgTE9HX1RBRyAiU2Vzc2lvbkNvbmZpZ3VyYXRpb24iCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL1Nlc3Npb25Db25maWd1cmF0aW9uLmg+CisjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0dXNfdCBTZXNzaW9uQ29uZmlndXJhdGlvbjo6cmVhZEZyb21QYXJjZWwoY29uc3QgYW5kcm9pZDo6UGFyY2VsKiBwYXJjZWwpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBpbnQgb3BlcmF0aW5nTW9kZSA9IDA7CisKKyAgICBpZiAocGFyY2VsID09IG51bGxwdHIpIHJldHVybiBCQURfVkFMVUU7CisKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZvcGVyYXRpbmdNb2RlKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBvcGVyYXRpbmcgbW9kZSBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50IGlucHV0V2lkdGggPSAwOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoJmlucHV0V2lkdGgpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIGlucHV0IHdpZHRoIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpbnQgaW5wdXRIZWlnaHQgPSAwOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoJmlucHV0SGVpZ2h0KSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBpbnB1dCBoZWlnaHQgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludCBpbnB1dEZvcm1hdCA9IC0xOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoJmlucHV0Rm9ybWF0KSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBpbnB1dCBmb3JtYXQgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPE91dHB1dENvbmZpZ3VyYXRpb24+IG91dHB1dFN0cmVhbXM7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRQYXJjZWxhYmxlVmVjdG9yKCZvdXRwdXRTdHJlYW1zKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBvdXRwdXQgY29uZmlndXJhdGlvbnMgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIG1PcGVyYXRpbmdNb2RlID0gb3BlcmF0aW5nTW9kZTsKKyAgICBtSW5wdXRXaWR0aCA9IGlucHV0V2lkdGg7CisgICAgbUlucHV0SGVpZ2h0ID0gaW5wdXRIZWlnaHQ7CisgICAgbUlucHV0Rm9ybWF0ID0gaW5wdXRGb3JtYXQ7CisgICAgZm9yIChhdXRvJiBzdHJlYW0gOiBvdXRwdXRTdHJlYW1zKSB7CisgICAgICAgIG1PdXRwdXRTdHJlYW1zLnB1c2hfYmFjayhzdHJlYW0pOworICAgIH0KKworCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb246OndyaXRlVG9QYXJjZWwoYW5kcm9pZDo6UGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKKworICAgIGlmIChwYXJjZWwgPT0gbnVsbHB0cikgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKworICAgIGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihtT3BlcmF0aW5nTW9kZSk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihtSW5wdXRXaWR0aCk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihtSW5wdXRIZWlnaHQpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIobUlucHV0Rm9ybWF0KTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgZXJyID0gcGFyY2VsLT53cml0ZVBhcmNlbGFibGVWZWN0b3IobU91dHB1dFN0cmVhbXMpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgU2Vzc2lvbkNvbmZpZ3VyYXRpb246Om91dHB1dHNFcXVhbChjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0IHsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxPdXRwdXRDb25maWd1cmF0aW9uPiYgb3RoZXJPdXRwdXRTdHJlYW1zID0KKyAgICAgICAgICAgIG90aGVyLmdldE91dHB1dENvbmZpZ3VyYXRpb25zKCk7CisKKyAgICBpZiAobU91dHB1dFN0cmVhbXMuc2l6ZSgpICE9ICBvdGhlck91dHB1dFN0cmVhbXMuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRTdHJlYW1zLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtT3V0cHV0U3RyZWFtc1tpXSAhPSBvdGhlck91dHB1dFN0cmVhbXNbaV0pIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFNlc3Npb25Db25maWd1cmF0aW9uOjpvdXRwdXRzTGVzc1RoYW4oY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24mIG90aGVyKSBjb25zdCB7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8T3V0cHV0Q29uZmlndXJhdGlvbj4mIG90aGVyT3V0cHV0U3RyZWFtcyA9CisgICAgICAgICAgICBvdGhlci5nZXRPdXRwdXRDb25maWd1cmF0aW9ucygpOworCisgICAgaWYgKG1PdXRwdXRTdHJlYW1zLnNpemUoKSAhPSAgb3RoZXJPdXRwdXRTdHJlYW1zLnNpemUoKSkgeworICAgICAgICByZXR1cm4gbU91dHB1dFN0cmVhbXMuc2l6ZSgpIDwgb3RoZXJPdXRwdXRTdHJlYW1zLnNpemUoKTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRTdHJlYW1zLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtT3V0cHV0U3RyZWFtc1tpXSAhPSBvdGhlck91dHB1dFN0cmVhbXNbaV0pIHsKKyAgICAgICAgICAgIHJldHVybiBtT3V0cHV0U3RyZWFtc1tpXSA8IG90aGVyT3V0cHV0U3RyZWFtc1tpXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5icCBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODhhMmM1Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL2NhbWVyYXNlcnZlci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDcgQEAKKy8vIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogImNhbWVyYXNlcnZlciIsCisKKyAgICBzcmNzOiBbIm1haW5fY2FtZXJhc2VydmVyLmNwcCJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmNhbWVyYXNlcnZpY2UiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5jb21tb25AMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjIiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNCIsCisgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCisgICAgXSwKKworICAgIGluaXRfcmM6IFsiY2FtZXJhc2VydmVyLnJjIl0sCisKKyAgICB2aW50Zl9mcmFnbWVudHM6IFsKKyAgICAgICAgIm1hbmlmZXN0X2FuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4wLnhtbCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5tayBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhjOTRlNi4uMDAwMDAwMAotLS0gYS9jYW1lcmEvY2FtZXJhc2VydmVyL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotCW1haW5fY2FtZXJhc2VydmVyLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJjYW1lcmFzZXJ2aWNlIFwKLQlsaWJsb2cgXAotCWxpYnV0aWxzIFwKLQlsaWJ1aSBcCi0JbGliZ3VpIFwKLQlsaWJiaW5kZXIgXAotCWxpYmhpZGx0cmFuc3BvcnQgXAotCWFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmNvbW1vbkAxLjAgXAotCWFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNCBcCi0JYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDEuMCBcCi0JYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMgotCi1MT0NBTF9NT0RVTEU6PSBjYW1lcmFzZXJ2ZXIKLUxPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKLQotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXh0cmEgLVdlcnJvciAtV25vLXVudXNlZC1wYXJhbWV0ZXIKLQotTE9DQUxfSU5JVF9SQyA6PSBjYW1lcmFzZXJ2ZXIucmMKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhc2VydmVyL21haW5fY2FtZXJhc2VydmVyLmNwcCBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvbWFpbl9jYW1lcmFzZXJ2ZXIuY3BwCmluZGV4IDM5NzI0MzYuLjUzYjNkODQgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvbWFpbl9jYW1lcmFzZXJ2ZXIuY3BwCisrKyBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvbWFpbl9jYW1lcmFzZXJ2ZXIuY3BwCkBAIC0yNiw4ICsyNiw5IEBACiB7CiAgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOwogCi0gICAgLy8gU2V0IDMgdGhyZWFkcyBmb3IgSElETCBjYWxscwotICAgIGhhcmR3YXJlOjpjb25maWd1cmVScGNUaHJlYWRwb29sKDMsIC8qd2lsbGpvaW4qLyBmYWxzZSk7CisgICAgLy8gU2V0IDUgdGhyZWFkcyBmb3IgSElETCBjYWxscy4gTm93IGNhbWVyYXNlcnZlciB3aWxsIHNlcnZlIEhJREwgY2FsbHMgaW4KKyAgICAvLyBhZGRpdGlvbiB0byBjb25zdW1pbmcgdGhlbSBmcm9tIHRoZSBDYW1lcmEgSEFMIGFzIHdlbGwuCisgICAgaGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2woNSwgLyp3aWxsam9pbiovIGZhbHNlKTsKIAogICAgIHNwPFByb2Nlc3NTdGF0ZT4gcHJvYyhQcm9jZXNzU3RhdGU6OnNlbGYoKSk7CiAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL2NhbWVyYXNlcnZlci9tYW5pZmVzdF9hbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlQDIuMC54bWwgYi9jYW1lcmEvY2FtZXJhc2VydmVyL21hbmlmZXN0X2FuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDFjNzE3Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL2NhbWVyYXNlcnZlci9tYW5pZmVzdF9hbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlQDIuMC54bWwKQEAgLTAsMCArMSwxMSBAQAorPG1hbmlmZXN0IHZlcnNpb249IjEuMCIgdHlwZT0iZnJhbWV3b3JrIj4KKyAgICA8aGFsPgorICAgICAgICA8bmFtZT5hbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlPC9uYW1lPgorICAgICAgICA8dHJhbnNwb3J0Pmh3YmluZGVyPC90cmFuc3BvcnQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KKyAgICAgICAgPGludGVyZmFjZT4KKyAgICAgICAgICAgIDxuYW1lPklDYW1lcmFTZXJ2aWNlPC9uYW1lPgorICAgICAgICAgICAgPGluc3RhbmNlPmRlZmF1bHQ8L2luc3RhbmNlPgorICAgICAgICA8L2ludGVyZmFjZT4KKyAgICA8L2hhbD4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaCBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5oCmluZGV4IGQyODQ0NzcuLjg0NGJiODAgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5oCisrKyBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5oCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CisjaW5jbHVkZSA8Y2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0xNzAsNiArMTcxLDEyIEBACiAgICAgc3RhdHVzX3QgZXJhc2UodWludDMyX3QgdGFnKTsKIAogICAgIC8qKgorICAgICAqIFJlbW92ZSBtZXRhZGF0YSBlbnRyaWVzIHRoYXQgbmVlZCBhZGRpdGlvbmFsIHBlcm1pc3Npb25zLgorICAgICAqLworICAgIHN0YXR1c190IHJlbW92ZVBlcm1pc3Npb25FbnRyaWVzKG1ldGFkYXRhX3ZlbmRvcl9pZF90IHZlbmRvcklkLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gKnRhZ3NSZW1vdmVkIC8qb3V0Ki8pOworCisgICAgLyoqCiAgICAgICogU3dhcCB0aGUgdW5kZXJseWluZyBjYW1lcmEgbWV0YWRhdGEgYmV0d2VlbiB0aGlzIGFuZCB0aGUgb3RoZXIKICAgICAgKiBtZXRhZGF0YSBvYmplY3QuCiAgICAgICovCmRpZmYgLS1naXQgYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaAppbmRleCA5MDRmYmEyLi42ZjU1ODkwIDEwMDY0NAotLS0gYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oCisrKyBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmgKQEAgLTk5LDYgKzk5LDExIEBACiAgICAgICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCB2ZXJib3NpdHksIGludCBpbmRlbnRhdGlvbikgY29uc3Q7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBTZWN0aW9uIGZvciBjb3JyZXNwb25kaW5nIHRhZy4KKyAgICAgICAgICovCisgICAgICAgIHNzaXplX3QgZ2V0U2VjdGlvbkluZGV4KHVpbnQzMl90IHRhZykgY29uc3Q7CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFJlYWQgdmFsdWVzIFZlbmRvclRhZ0Rlc2NyaXB0b3Igb2JqZWN0IGZyb20gdGhlIGdpdmVuIHBhcmNlbC4KICAgICAgICAgICoKICAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCkBAIC0yMDYsNiArMjExLDkgQEAKICAgICAgKi8KICAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgdmVyYm9zaXR5LCBpbnQgaW5kZW50YXRpb24pIGNvbnN0OwogCisgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPG1ldGFkYXRhX3ZlbmRvcl9pZF90LCBzcDxhbmRyb2lkOjpWZW5kb3JUYWdEZXNjcmlwdG9yPj4gJgorICAgICAgICAgICAgZ2V0VmVuZG9ySWRzQW5kVGFnRGVzY3JpcHRvcnMoKTsKKwogICBwcm90ZWN0ZWQ6CiAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPG1ldGFkYXRhX3ZlbmRvcl9pZF90LCBzcDxhbmRyb2lkOjpWZW5kb3JUYWdEZXNjcmlwdG9yPj4gbVZlbmRvck1hcDsKICAgICBzdHJ1Y3QgdmVuZG9yX3RhZ19jYWNoZV9vcHMgbVZlbmRvckNhY2hlT3BzOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oCmluZGV4IGE4MGY0NGIuLjk1YzRmMzkgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaAorKysgYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmgKQEAgLTY1LDggKzY1LDE1IEBACiAgICAgT3V0cHV0Q29uZmlndXJhdGlvbihjb25zdCBhbmRyb2lkOjpQYXJjZWwmIHBhcmNlbCk7CiAKICAgICBPdXRwdXRDb25maWd1cmF0aW9uKHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnAsIGludCByb3RhdGlvbiwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBwaHlzaWNhbENhbWVyYUlkLAogICAgICAgICAgICAgaW50IHN1cmZhY2VTZXRJRCA9IElOVkFMSURfU0VUX0lELCBib29sIGlzU2hhcmVkID0gZmFsc2UpOwogCisgICAgT3V0cHV0Q29uZmlndXJhdGlvbihjb25zdCBzdGQ6OnZlY3RvcjxzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPj4mIGdicHMsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm90YXRpb24sIGNvbnN0IFN0cmluZzE2JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1cmZhY2VTZXRJRCA9IElOVkFMSURfU0VUX0lELAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1cmZhY2VUeXBlID0gT3V0cHV0Q29uZmlndXJhdGlvbjo6U1VSRkFDRV9UWVBFX1VOS05PV04sIGludCB3aWR0aCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gMCwgYm9vbCBpc1NoYXJlZCA9IGZhbHNlKTsKKwogICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24mIG90aGVyKSBjb25zdCB7CiAgICAgICAgIHJldHVybiAoIG1Sb3RhdGlvbiA9PSBvdGhlci5tUm90YXRpb24gJiYKICAgICAgICAgICAgICAgICBtU3VyZmFjZVNldElEID09IG90aGVyLm1TdXJmYWNlU2V0SUQgJiYKZGlmZiAtLWdpdCBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL1Nlc3Npb25Db25maWd1cmF0aW9uLmggYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0Mjg4ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0NBTUVSQTJfU0VTU0lPTkNPTkZJR1VSQVRJT05fSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0NBTUVSQTJfU0VTU0lPTkNPTkZJR1VSQVRJT05fSAorCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGNhbWVyYTIgeworbmFtZXNwYWNlIHBhcmFtcyB7CisKK2NsYXNzIE91dHB1dENvbmZpZ3VyYXRpb247CisKK2NsYXNzIFNlc3Npb25Db25maWd1cmF0aW9uIDogcHVibGljIGFuZHJvaWQ6OlBhcmNlbGFibGUgeworcHVibGljOgorCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8T3V0cHV0Q29uZmlndXJhdGlvbj4mIGdldE91dHB1dENvbmZpZ3VyYXRpb25zKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU91dHB1dFN0cmVhbXM7CisgICAgfQorCisgICAgaW50IGdldElucHV0V2lkdGgoKSBjb25zdCB7IHJldHVybiBtSW5wdXRXaWR0aDsgfQorICAgIGludCBnZXRJbnB1dEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1JbnB1dEhlaWdodDsgfQorICAgIGludCBnZXRJbnB1dEZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1JbnB1dEZvcm1hdDsgfQorICAgIGludCBnZXRPcGVyYXRpbmdNb2RlKCkgY29uc3QgeyByZXR1cm4gbU9wZXJhdGluZ01vZGU7IH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7CisKKyAgICBTZXNzaW9uQ29uZmlndXJhdGlvbigpIDoKKyAgICAgICAgICAgIG1JbnB1dFdpZHRoKDApLAorICAgICAgICAgICAgbUlucHV0SGVpZ2h0KDApLAorICAgICAgICAgICAgbUlucHV0Rm9ybWF0KC0xKSwKKyAgICAgICAgICAgIG1PcGVyYXRpbmdNb2RlKC0xKSB7fQorCisgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb24oY29uc3QgYW5kcm9pZDo6UGFyY2VsJiBwYXJjZWwpIHsKKyAgICAgICAgcmVhZEZyb21QYXJjZWwoJnBhcmNlbCk7CisgICAgfQorCisgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb24oaW50IGlucHV0V2lkdGgsIGludCBpbnB1dEhlaWdodCwgaW50IGlucHV0Rm9ybWF0LCBpbnQgb3BlcmF0aW5nTW9kZSkgOgorICAgICAgICBtSW5wdXRXaWR0aChpbnB1dFdpZHRoKSwgbUlucHV0SGVpZ2h0KGlucHV0SGVpZ2h0KSwgbUlucHV0Rm9ybWF0KGlucHV0Rm9ybWF0KSwKKyAgICAgICAgbU9wZXJhdGluZ01vZGUob3BlcmF0aW5nTW9kZSkge30KKworICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gKG91dHB1dHNFcXVhbChvdGhlcikgJiYKKyAgICAgICAgICAgICAgICBtSW5wdXRXaWR0aCA9PSBvdGhlci5tSW5wdXRXaWR0aCAmJgorICAgICAgICAgICAgICAgIG1JbnB1dEhlaWdodCA9PSBvdGhlci5tSW5wdXRIZWlnaHQgJiYKKyAgICAgICAgICAgICAgICBtSW5wdXRGb3JtYXQgPT0gb3RoZXIubUlucHV0Rm9ybWF0ICYmCisgICAgICAgICAgICAgICAgbU9wZXJhdGluZ01vZGUgPT0gb3RoZXIubU9wZXJhdGluZ01vZGUpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgaWYgKCp0aGlzID09IG90aGVyKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKG1JbnB1dFdpZHRoICE9IG90aGVyLm1JbnB1dFdpZHRoKSB7CisgICAgICAgICAgICByZXR1cm4gbUlucHV0V2lkdGggPCBvdGhlci5tSW5wdXRXaWR0aDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtSW5wdXRIZWlnaHQgIT0gb3RoZXIubUlucHV0SGVpZ2h0KSB7CisgICAgICAgICAgICByZXR1cm4gbUlucHV0SGVpZ2h0IDwgb3RoZXIubUlucHV0SGVpZ2h0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1JbnB1dEZvcm1hdCAhPSBvdGhlci5tSW5wdXRGb3JtYXQpIHsKKyAgICAgICAgICAgIHJldHVybiBtSW5wdXRGb3JtYXQgPCBvdGhlci5tSW5wdXRGb3JtYXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAobU9wZXJhdGluZ01vZGUgIT0gb3RoZXIubU9wZXJhdGluZ01vZGUpIHsKKyAgICAgICAgICAgIHJldHVybiBtT3BlcmF0aW5nTW9kZSA8IG90aGVyLm1PcGVyYXRpbmdNb2RlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG91dHB1dHNMZXNzVGhhbihvdGhlcik7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciA+IChjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICgqdGhpcyAhPSBvdGhlciAmJiAhKCp0aGlzIDwgb3RoZXIpKTsKKyAgICB9CisKKyAgICBib29sIG91dHB1dHNFcXVhbChjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0OworICAgIGJvb2wgb3V0cHV0c0xlc3NUaGFuKGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBvdGhlcikgY29uc3Q7CisgICAgdm9pZCBhZGRPdXRwdXRDb25maWd1cmF0aW9uKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJmNvbmZpZykgeworICAgICAgICBtT3V0cHV0U3RyZWFtcy5wdXNoX2JhY2soY29uZmlnKTsKKyAgICB9CisKK3ByaXZhdGU6CisKKyAgICBzdGQ6OnZlY3RvcjxPdXRwdXRDb25maWd1cmF0aW9uPiBtT3V0cHV0U3RyZWFtczsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRXaWR0aCwgbUlucHV0SGVpZ2h0LCBtSW5wdXRGb3JtYXQsIG1PcGVyYXRpbmdNb2RlOworfTsKK30gLy8gbmFtZXNwYWNlIHBhcmFtcworfSAvLyBuYW1lc3BhY2UgY2FtZXJhMgorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKKwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OnBhcmFtczo6U2Vzc2lvbkNvbmZpZ3VyYXRpb247CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9BbmRyb2lkLmJwIGIvY2FtZXJhL25kay9BbmRyb2lkLmJwCmluZGV4IDk3Y2Y2YmYuLjYwYzlmODUgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvQW5kcm9pZC5icAorKysgYi9jYW1lcmEvbmRrL0FuZHJvaWQuYnAKQEAgLTMwLDMgKzMwLDEyMSBAQAogICAgIHNyY3M6IFsiaW5jbHVkZS9jYW1lcmEvKiovKi5oIl0sCiAgICAgbGljZW5zZTogIk5PVElDRSIsCiB9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY2FtZXJhMm5kayIsCisgICAgc3JjczogWworICAgICAgICAiTmRrQ2FtZXJhTWFuYWdlci5jcHAiLAorICAgICAgICAiTmRrQ2FtZXJhTWV0YWRhdGEuY3BwIiwKKyAgICAgICAgIk5ka0NhbWVyYURldmljZS5jcHAiLAorICAgICAgICAiTmRrQ2FwdHVyZVJlcXVlc3QuY3BwIiwKKyAgICAgICAgIk5ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcCIsCisgICAgICAgICJpbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcCIsCisgICAgICAgICJpbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAiLAorICAgICAgICAiaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcCIsCisgICAgICAgICJpbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmFuZHJvaWRfcnVudGltZSIsCisgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmNhbWVyYV9tZXRhZGF0YSIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKKyAgICAgICAgIi1ERVhQT1JUPV9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5IChcImRlZmF1bHRcIikpKSIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGlibmF0aXZld2luZG93IiwKKyAgICBdLAorICAgIHZlcnNpb25fc2NyaXB0OiAibGliY2FtZXJhMm5kay5tYXAudHh0IiwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjYW1lcmEybmRrX3ZlbmRvciIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBzcmNzOiBbCisgICAgICAgICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5jcHAiLAorICAgICAgICAibmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcCIsCisgICAgICAgICJuZGtfdmVuZG9yL2ltcGwvdXRpbHMuY3BwIiwKKyAgICAgICAgImltcGwvQUNhbWVyYU1ldGFkYXRhLmNwcCIsCisgICAgICAgICJpbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAiLAorICAgICAgICAiTmRrQ2FtZXJhTWV0YWRhdGEuY3BwIiwKKyAgICAgICAgIk5ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcCIsCisgICAgICAgICJOZGtDYW1lcmFNYW5hZ2VyLmNwcCIsCisgICAgICAgICJOZGtDYW1lcmFEZXZpY2UuY3BwIiwKKyAgICAgICAgIk5ka0NhcHR1cmVSZXF1ZXN0LmNwcCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgXSwKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgIi4iLAorICAgICAgICAiaW5jbHVkZSIsCisgICAgICAgICJpbXBsIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisgICAgICAgICItREVYUE9SVD1fX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KFwiZGVmYXVsdFwiKSkpIiwKKyAgICAgICAgIi1EX19BTkRST0lEX1ZOREtfXyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJod2JpbmRlciIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaGFyZHdhcmUiLAorICAgICAgICAibGlibmF0aXZld2luZG93IiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJjYW1lcmFfbWV0YWRhdGEiLAorICAgICAgICAibGlibWVkaWFuZGsiLAorICAgICAgICAiYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2UuZGV2aWNlQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5jb21tb25AMi4wIiwKKyAgICAgICAgImFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4wIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmNvbW1vbkAxLjAtaGVscGVyIiwKKyAgICAgICAgImxpYmFyZWN0IiwKKyAgICBdLAorICAgIHByb2R1Y3RfdmFyaWFibGVzOiB7CisgICAgICAgIHBkazogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIkFJbWFnZVJlYWRlclZlbmRvclRlc3QiLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmNzOiBbIm5ka192ZW5kb3IvdGVzdHMvQUltYWdlUmVhZGVyVmVuZG9yVGVzdC5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGliY2FtZXJhMm5ka192ZW5kb3IiLAorICAgICAgICAibGlibWVkaWFuZGsiLAorICAgICAgICAibGlibmF0aXZld2luZG93IiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRF9fQU5EUk9JRF9WTkRLX18iLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL0FuZHJvaWQubWsgYi9jYW1lcmEvbmRrL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYWRkZjEuLjAwMDAwMDAKLS0tIGEvY2FtZXJhL25kay9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWlmbmVxICgkKFRBUkdFVF9CVUlMRF9QREspLCB0cnVlKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICAgICBcCi0gICAgTmRrQ2FtZXJhTWFuYWdlci5jcHAgICAgICAgICAgIFwKLSAgICBOZGtDYW1lcmFNZXRhZGF0YS5jcHAgICAgICAgICAgXAotICAgIE5ka0NhbWVyYURldmljZS5jcHAgICAgICAgICAgICBcCi0gICAgTmRrQ2FwdHVyZVJlcXVlc3QuY3BwICAgICAgICAgIFwKLSAgICBOZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAgICAgXAotICAgIGltcGwvQUNhbWVyYU1hbmFnZXIuY3BwICAgICAgICBcCi0gICAgaW1wbC9BQ2FtZXJhTWV0YWRhdGEuY3BwICAgICAgIFwKLSAgICBpbXBsL0FDYW1lcmFEZXZpY2UuY3BwICAgICAgICAgXAotICAgIGltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcAotCi1MT0NBTF9NT0RVTEU6PSBsaWJjYW1lcmEybmRrCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gJChMT0NBTF9QQVRIKS9pbmNsdWRlCi1MT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gJChMT0NBTF9QQVRIKS9pbmNsdWRlCi0KLUxPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuIC1EIEVYUE9SVD0nX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKScKLUxPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2V4dHJhIC1XZXJyb3IKLQotTE9DQUxfTERGTEFHUyArPSAtV2wsLS12ZXJzaW9uLXNjcmlwdD0kKExPQ0FMX1BBVEgpL2xpYmNhbWVyYTJuZGsubWFwLnR4dAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJiaW5kZXIgXAotICAgIGxpYmxvZyBcCi0gICAgbGliZ3VpIFwKLSAgICBsaWJ1dGlscyBcCi0gICAgbGliYW5kcm9pZF9ydW50aW1lIFwKLSAgICBsaWJjYW1lcmFfY2xpZW50IFwKLSAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKLSAgICBsaWJjdXRpbHMgXAotICAgIGxpYmNhbWVyYV9tZXRhZGF0YSBcCi0gICAgbGlibWVkaWFuZGsKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCi1lbmRpZgpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAgYi9jYW1lcmEvbmRrL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcAppbmRleCBmZDk1Mjk2Li41NDBkODRlIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcAorKysgYi9jYW1lcmEvbmRrL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcApAQCAtMjgsNiArMjgsOCBAQAogI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oPgogI2luY2x1ZGUgImltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmgiCiAKKyNpbmNsdWRlICJpbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5pbmMiCisKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCiBFWFBPUlQKQEAgLTgyLDcgKzg0LDMxIEBACiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOwogICAgIH0KIAotICAgIHJldHVybiBzZXNzaW9uLT5jYXB0dXJlKGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7CisgICAgcmV0dXJuIHNlc3Npb24tPmNhcHR1cmUoCisgICAgICAgICAgICBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQpOworfQorCitFWFBPUlQKK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlKAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24sCisgICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3MqIGxjYnMsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChzZXNzaW9uID09IG51bGxwdHIgfHwgcmVxdWVzdHMgPT0gbnVsbHB0ciB8fCBudW1SZXF1ZXN0cyA8IDEpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogaW52YWxpZCBpbnB1dDogc2Vzc2lvbiAlcCwgbnVtUmVxdWVzdCAlZCwgcmVxdWVzdHMgJXAiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2Vzc2lvbiwgbnVtUmVxdWVzdHMsIHJlcXVlc3RzKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgaWYgKHNlc3Npb24tPmlzQ2xvc2VkKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBzZXNzaW9uICVwIGlzIGFscmVhZHkgY2xvc2VkIiwgX19GVU5DVElPTl9fLCBzZXNzaW9uKTsKKyAgICAgICAgKmNhcHR1cmVTZXF1ZW5jZUlkID0gQ0FQVFVSRV9TRVFVRU5DRV9JRF9OT05FOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKKyAgICB9CisKKyAgICByZXR1cm4gc2Vzc2lvbi0+Y2FwdHVyZSgKKyAgICAgICAgICAgIGxjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQpOwogfQogCiBFWFBPUlQKQEAgLTEwNyw2ICsxMzMsMjggQEAKIH0KIAogRVhQT1JUCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfc2V0UmVwZWF0aW5nUmVxdWVzdCgKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzKiBsY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpZiAoc2Vzc2lvbiA9PSBudWxscHRyIHx8IHJlcXVlc3RzID09IG51bGxwdHIgfHwgbnVtUmVxdWVzdHMgPCAxKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IGludmFsaWQgaW5wdXQ6IHNlc3Npb24gJXAsIG51bVJlcXVlc3QgJWQsIHJlcXVlc3RzICVwIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNlc3Npb24sIG51bVJlcXVlc3RzLCByZXF1ZXN0cyk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIGlmIChzZXNzaW9uLT5pc0Nsb3NlZCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogc2Vzc2lvbiAlcCBpcyBhbHJlYWR5IGNsb3NlZCIsIF9fRlVOQ1RJT05fXywgc2Vzc2lvbik7CisgICAgICAgICpjYXB0dXJlU2VxdWVuY2VJZCA9IENBUFRVUkVfU0VRVUVOQ0VfSURfTk9ORTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfU0VTU0lPTl9DTE9TRUQ7CisgICAgfQorCisgICAgcmV0dXJuIHNlc3Npb24tPnNldFJlcGVhdGluZ1JlcXVlc3QobGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7Cit9CisKK0VYUE9SVAogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdG9wUmVwZWF0aW5nKEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKHNlc3Npb24gPT0gbnVsbHB0cikgewpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9OZGtDYW1lcmFEZXZpY2UuY3BwIGIvY2FtZXJhL25kay9OZGtDYW1lcmFEZXZpY2UuY3BwCmluZGV4IDgxMmEzMTIuLjk4NjA4ZGEgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvTmRrQ2FtZXJhRGV2aWNlLmNwcAorKysgYi9jYW1lcmEvbmRrL05ka0NhbWVyYURldmljZS5jcHAKQEAgLTI0LDcgKzI0LDE1IEBACiAjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYURldmljZS5oPgogI2luY2x1ZGUgImltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmgiCiAKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmFjYW07CisKK2Jvb2wgYXJlV2luZG93VHlwZXNFcXVhbChBQ2FtZXJhV2luZG93VHlwZSAqYSwgQUNhbWVyYVdpbmRvd1R5cGUgKmIpIHsKKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisgICAgcmV0dXJuIHV0aWxzOjppc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKGEsIGIpOworI2Vsc2UKKyAgICByZXR1cm4gYSA9PSBiOworI2VuZGlmCit9CiAKIEVYUE9SVAogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFEZXZpY2VfY2xvc2UoQUNhbWVyYURldmljZSogZGV2aWNlKSB7CkBAIC05Niw3ICsxMDQsNyBAQAogCiBFWFBPUlQKIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfY3JlYXRlKAotICAgICAgICBBTmF0aXZlV2luZG93KiB3aW5kb3csIC8qb3V0Ki9BQ2FwdHVyZVNlc3Npb25PdXRwdXQqKiBvdXQpIHsKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdywgLypvdXQqL0FDYXB0dXJlU2Vzc2lvbk91dHB1dCoqIG91dCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKHdpbmRvdyA9PSBudWxscHRyIHx8IG91dCA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IGJhZCBhcmd1bWVudC4gd2luZG93ICVwLCBvdXQgJXAiLApAQCAtMTA5LDcgKzExNyw3IEBACiAKIEVYUE9SVAogY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9jcmVhdGUoCi0gICAgICAgIEFOYXRpdmVXaW5kb3cqIHdpbmRvdywgLypvdXQqL0FDYXB0dXJlU2Vzc2lvbk91dHB1dCoqIG91dCkgeworICAgICAgICBBQ2FtZXJhV2luZG93VHlwZSogd2luZG93LCAvKm91dCovQUNhcHR1cmVTZXNzaW9uT3V0cHV0Kiogb3V0KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBpZiAod2luZG93ID09IG51bGxwdHIgfHwgb3V0ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogYmFkIGFyZ3VtZW50LiB3aW5kb3cgJXAsIG91dCAlcCIsCkBAIC0xMjEsOCArMTI5LDIyIEBACiB9CiAKIEVYUE9SVAorY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblBoeXNpY2FsT3V0cHV0X2NyZWF0ZSgKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdywgY29uc3QgY2hhciogcGh5c2ljYWxJZCwKKyAgICAgICAgLypvdXQqL0FDYXB0dXJlU2Vzc2lvbk91dHB1dCoqIG91dCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKHdpbmRvdyA9PSBudWxscHRyIHx8IHBoeXNpY2FsSWQgPT0gbnVsbHB0ciB8fCBvdXQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBiYWQgYXJndW1lbnQuIHdpbmRvdyAlcCwgcGh5c2ljYWxJZCAlcCwgb3V0ICVwIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHdpbmRvdywgcGh5c2ljYWxJZCwgb3V0KTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgICpvdXQgPSBuZXcgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KHdpbmRvdywgZmFsc2UsIHBoeXNpY2FsSWQpOworICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCitFWFBPUlQKIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfYWRkKEFDYXB0dXJlU2Vzc2lvbk91dHB1dCAqb3V0LAotICAgICAgICBBTmF0aXZlV2luZG93KiB3aW5kb3cpIHsKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKCh3aW5kb3cgPT0gbnVsbHB0cikgfHwgKG91dCA9PSBudWxscHRyKSkgewogICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBiYWQgYXJndW1lbnQuIHdpbmRvdyAlcCwgb3V0ICVwIiwKQEAgLTEzNCw3ICsxNTYsNyBAQAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBpZiAob3V0LT5tV2luZG93ID09IHdpbmRvdykgeworICAgIGlmIChhcmVXaW5kb3dUeXBlc0VxdWFsKG91dC0+bVdpbmRvdywgd2luZG93KSkgewogICAgICAgICBBTE9HRSgiJXM6IEVycm9yIHRyeWluZyB0byBhZGQgdGhlIHNhbWUgd2luZG93IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3V0cHV0IGNvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwpAQCAtMTQ3LDcgKzE2OSw3IEBACiAKIEVYUE9SVAogY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9yZW1vdmUoQUNhcHR1cmVTZXNzaW9uT3V0cHV0ICpvdXQsCi0gICAgICAgIEFOYXRpdmVXaW5kb3cqIHdpbmRvdykgeworICAgICAgICBBQ2FtZXJhV2luZG93VHlwZSogd2luZG93KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBpZiAoKHdpbmRvdyA9PSBudWxscHRyKSB8fCAob3V0ID09IG51bGxwdHIpKSB7CiAgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IGJhZCBhcmd1bWVudC4gd2luZG93ICVwLCBvdXQgJXAiLApAQCAtMTU5LDcgKzE4MSw3IEBACiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIGlmIChvdXQtPm1XaW5kb3cgPT0gd2luZG93KSB7CisgICAgaWYgKGFyZVdpbmRvd1R5cGVzRXF1YWwob3V0LT5tV2luZG93LCB3aW5kb3cpKSB7CiAgICAgICAgIEFMT0dFKCIlczogRXJyb3IgdHJ5aW5nIHRvIHJlbW92ZSB0aGUgc2FtZSB3aW5kb3cgYXNzb2NpYXRlZCB3aXRoIHRoZSBvdXRwdXQgY29uZmlndXJhdGlvbiIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL05ka0NhbWVyYU1hbmFnZXIuY3BwIGIvY2FtZXJhL25kay9OZGtDYW1lcmFNYW5hZ2VyLmNwcAppbmRleCA2MGI0NzYzLi44NzQyZDljIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL05ka0NhbWVyYU1hbmFnZXIuY3BwCisrKyBiL2NhbWVyYS9uZGsvTmRrQ2FtZXJhTWFuYWdlci5jcHAKQEAgLTIyLDkgKzIyLDE1IEBACiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KIAogI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFNYW5hZ2VyLmg+Ci0jaW5jbHVkZSAiaW1wbC9BQ2FtZXJhTWFuYWdlci5oIgogCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisjaW5jbHVkZSAibmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmgiCisjZWxzZQorI2luY2x1ZGUgImltcGwvQUNhbWVyYU1hbmFnZXIuaCIKKyNlbmRpZgorI2luY2x1ZGUgImltcGwvQUNhbWVyYU1ldGFkYXRhLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjphY2FtOwogCiBFWFBPUlQKIEFDYW1lcmFNYW5hZ2VyKiBBQ2FtZXJhTWFuYWdlcl9jcmVhdGUoKSB7CkBAIC0xMDcsNyArMTEzLDE0IEBACiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtZ3IsIGNhbWVyYUlkLCBjaGFycyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwogICAgIH0KLSAgICByZXR1cm4gbWdyLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY2FtZXJhSWQsIGNoYXJzKTsKKyAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IHNwQ2hhcnM7CisgICAgY2FtZXJhX3N0YXR1c190IHN0YXR1cyA9IG1nci0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNhbWVyYUlkLCAmc3BDaGFycyk7CisgICAgaWYgKHN0YXR1cyAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHNwQ2hhcnMtPmluY1N0cm9uZygodm9pZCopIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljcyk7CisgICAgKmNoYXJzID0gc3BDaGFycy5nZXQoKTsKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKIH0KIAogRVhQT1JUCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL05ka0NhbWVyYU1ldGFkYXRhLmNwcCBiL2NhbWVyYS9uZGsvTmRrQ2FtZXJhTWV0YWRhdGEuY3BwCmluZGV4IDY1ZGU4MWYuLjlhMzllZDggMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvTmRrQ2FtZXJhTWV0YWRhdGEuY3BwCisrKyBiL2NhbWVyYS9uZGsvTmRrQ2FtZXJhTWV0YWRhdGEuY3BwCkBAIC01NywxMyArNTcsMzIgQEAKICAgICAgICAgQUxPR0UoIiVzOiBzcmMgaXMgbnVsbCEiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9Ci0gICAgcmV0dXJuIG5ldyBBQ2FtZXJhTWV0YWRhdGEoKnNyYyk7CisgICAgQUNhbWVyYU1ldGFkYXRhKiBjb3B5ID0gbmV3IEFDYW1lcmFNZXRhZGF0YSgqc3JjKTsKKyAgICBjb3B5LT5pbmNTdHJvbmcoKHZvaWQqKSBBQ2FtZXJhTWV0YWRhdGFfY29weSk7CisgICAgcmV0dXJuIGNvcHk7CiB9CiAKIEVYUE9SVAogdm9pZCBBQ2FtZXJhTWV0YWRhdGFfZnJlZShBQ2FtZXJhTWV0YWRhdGEqIG1ldGFkYXRhKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBpZiAobWV0YWRhdGEgIT0gbnVsbHB0cikgewotICAgICAgICBkZWxldGUgbWV0YWRhdGE7CisgICAgICAgIG1ldGFkYXRhLT5kZWNTdHJvbmcoKHZvaWQqKSBBQ2FtZXJhTWV0YWRhdGFfZnJlZSk7CiAgICAgfQogfQorCitFWFBPUlQKK2Jvb2wgQUNhbWVyYU1ldGFkYXRhX2lzTG9naWNhbE11bHRpQ2FtZXJhKGNvbnN0IEFDYW1lcmFNZXRhZGF0YSogc3RhdGljTWV0YWRhdGEsCisgICAgICAgIC8qb3V0Ki9zaXplX3QqIG51bVBoeXNpY2FsQ2FtZXJhcywgLypvdXQqL2NvbnN0IGNoYXIqY29uc3QqKiBwaHlzaWNhbENhbWVyYUlkcykgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKG51bVBoeXNpY2FsQ2FtZXJhcyA9PSBudWxscHRyIHx8IHBoeXNpY2FsQ2FtZXJhSWRzID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGlucHV0OiBudW1QaHlzaWNhbENhbWVyYXMgJXAsIHBoeXNpY2FsQ2FtZXJhSWRzICVwIiwKKyAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBudW1QaHlzaWNhbENhbWVyYXMsIHBoeXNpY2FsQ2FtZXJhSWRzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoc3RhdGljTWV0YWRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgaW5wdXQ6IHN0YXRpY01ldGFkYXRhIGlzIG51bGwuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiBzdGF0aWNNZXRhZGF0YS0+aXNMb2dpY2FsTXVsdGlDYW1lcmEobnVtUGh5c2ljYWxDYW1lcmFzLCBwaHlzaWNhbENhbWVyYUlkcyk7Cit9CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL05ka0NhcHR1cmVSZXF1ZXN0LmNwcCBiL2NhbWVyYS9uZGsvTmRrQ2FwdHVyZVJlcXVlc3QuY3BwCmluZGV4IGFjMTg1NmIuLmM2NGRlM2UgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvTmRrQ2FwdHVyZVJlcXVlc3QuY3BwCisrKyBiL2NhbWVyYS9uZGsvTmRrQ2FwdHVyZVJlcXVlc3QuY3BwCkBAIC0yNyw3ICsyNyw3IEBACiAKIEVYUE9SVAogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFPdXRwdXRUYXJnZXRfY3JlYXRlKAotICAgICAgICBBTmF0aXZlV2luZG93KiB3aW5kb3csIEFDYW1lcmFPdXRwdXRUYXJnZXQqKiBvdXQpIHsKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdywgQUNhbWVyYU91dHB1dFRhcmdldCoqIG91dCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKHdpbmRvdyA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IGlucHV0IHdpbmRvdyBpcyBudWxsIiwgX19GVU5DVElPTl9fKTsKQEAgLTEzNyw3ICsxMzcsNyBAQAogICAgIGlmIChyZXF1ZXN0ID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBkZWxldGUgcmVxdWVzdC0+c2V0dGluZ3M7CisgICAgcmVxdWVzdC0+c2V0dGluZ3MuY2xlYXIoKTsKICAgICBkZWxldGUgcmVxdWVzdC0+dGFyZ2V0czsKICAgICBkZWxldGUgcmVxdWVzdDsKICAgICByZXR1cm47CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCmluZGV4IGY2MGU1ZmQuLmQ2ZjE0MTIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCkBAIC0yMyw3ICsyMyw3IEBACiAKIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6fkFDYW1lcmFDYXB0dXJlU2Vzc2lvbigpIHsKICAgICBBTE9HVigifkFDYW1lcmFDYXB0dXJlU2Vzc2lvbjogJXAgbm90aWZ5IGRldmljZSBlbmQgb2YgbGlmZSIsIHRoaXMpOwotICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKKyAgICBzcDxhY2FtOjpDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CiAgICAgaWYgKGRldiAhPSBudWxscHRyICYmICFkZXYtPmlzQ2xvc2VkKCkpIHsKICAgICAgICAgZGV2LT5sb2NrRGV2aWNlRm9yU2Vzc2lvbk9wcygpOwogICAgICAgICB7CkBAIC00OCw3ICs0OCw3IEBACiAgICAgICAgIG1DbG9zZWRCeUFwcCA9IHRydWU7CiAgICAgfQogCi0gICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOworICAgIHNwPGFjYW06OkNhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKICAgICBpZiAoZGV2ICE9IG51bGxwdHIpIHsKICAgICAgICAgZGV2LT5sb2NrRGV2aWNlRm9yU2Vzc2lvbk9wcygpOwogICAgIH0KQEAgLTczLDcgKzczLDcgQEAKIAogY2FtZXJhX3N0YXR1c190CiBBQ2FtZXJhQ2FwdHVyZVNlc3Npb246OnN0b3BSZXBlYXRpbmcoKSB7Ci0gICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOworICAgIHNwPGFjYW06OkNhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKICAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIkVycm9yOiBEZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHNlc3Npb24gJXAgaGFzIGJlZW4gY2xvc2VkISIsIHRoaXMpOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKQEAgLTkxLDcgKzkxLDcgQEAKIAogY2FtZXJhX3N0YXR1c190CiBBQ2FtZXJhQ2FwdHVyZVNlc3Npb246OmFib3J0Q2FwdHVyZXMoKSB7Ci0gICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOworICAgIHNwPGFjYW06OkNhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKICAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIkVycm9yOiBEZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHNlc3Npb24gJXAgaGFzIGJlZW4gY2xvc2VkISIsIHRoaXMpOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKQEAgLTEwNyw0OSArMTA3LDggQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1jYW1lcmFfc3RhdHVzX3QKLUFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6c2V0UmVwZWF0aW5nUmVxdWVzdCgKLSAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKLSAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKLSAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgewotICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKLSAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIkVycm9yOiBEZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHNlc3Npb24gJXAgaGFzIGJlZW4gY2xvc2VkISIsIHRoaXMpOwotICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKLSAgICB9Ci0KLSAgICBjYW1lcmFfc3RhdHVzX3QgcmV0OwotICAgIGRldi0+bG9ja0RldmljZUZvclNlc3Npb25PcHMoKTsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vzc2lvbkxvY2spOwotICAgICAgICByZXQgPSBkZXYtPnNldFJlcGVhdGluZ1JlcXVlc3RzTG9ja2VkKAotICAgICAgICAgICAgICAgIHRoaXMsIGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7Ci0gICAgfQotICAgIGRldi0+dW5sb2NrRGV2aWNlKCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6Y2FwdHVyZSgKLSAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKLSAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKLSAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgewotICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKLSAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIkVycm9yOiBEZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHNlc3Npb24gJXAgaGFzIGJlZW4gY2xvc2VkISIsIHRoaXMpOwotICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKLSAgICB9Ci0gICAgY2FtZXJhX3N0YXR1c190IHJldDsKLSAgICBkZXYtPmxvY2tEZXZpY2VGb3JTZXNzaW9uT3BzKCk7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNlc3Npb25Mb2NrKTsKLSAgICAgICAgcmV0ID0gZGV2LT5jYXB0dXJlTG9ja2VkKHRoaXMsIGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7Ci0gICAgfQotICAgIGRldi0+dW5sb2NrRGV2aWNlKCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6dXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbihBQ2FwdHVyZVNlc3Npb25PdXRwdXQgKm91dHB1dCkgewotICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKKyAgICBzcDxhY2FtOjpDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CiAgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJFcnJvcjogRGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBzZXNzaW9uICVwIGhhcyBiZWVuIGNsb3NlZCEiLCB0aGlzKTsKICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfU0VTU0lPTl9DTE9TRUQ7CkBAIC0xNjgsNyArMTI3LDcgQEAKIEFDYW1lcmFEZXZpY2UqCiBBQ2FtZXJhQ2FwdHVyZVNlc3Npb246OmdldERldmljZSgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNlc3Npb25Mb2NrKTsKLSAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOwogICAgIGlmIChkZXYgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiRXJyb3I6IERldmljZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvbiAlcCBoYXMgYmVlbiBjbG9zZWQhIiwgdGhpcyk7CiAgICAgICAgIHJldHVybiBudWxscHRyOwpAQCAtMTgyLDkgKzE0MSw5IEBACiAgICAgbUlzQ2xvc2VkID0gdHJ1ZTsKIH0KIAotc3A8Q2FtZXJhRGV2aWNlPgorc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPgogQUNhbWVyYUNhcHR1cmVTZXNzaW9uOjpnZXREZXZpY2VTcCgpIHsKLSAgICBzcDxDYW1lcmFEZXZpY2U+IGRldmljZSA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgIHNwPGFjYW06OkNhbWVyYURldmljZT4gZGV2aWNlID0gbURldmljZS5wcm9tb3RlKCk7CiAgICAgaWYgKGRldmljZSA9PSBudWxscHRyIHx8IGRldmljZS0+aXNDbG9zZWQoKSkgewogICAgICAgICBBTE9HVygiRGV2aWNlIGlzIGNsb3NlZCBidXQgc2Vzc2lvbiAlZCBpcyBub3Qgbm90aWZpZWQiLCBtSWQpOwogICAgICAgICByZXR1cm4gbnVsbHB0cjsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaAppbmRleCBhMjA2OGU3Li4wOGE5MjI2IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmgKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oCkBAIC0xNywxNSArMTcsMjIgQEAKICNkZWZpbmUgX0FDQU1FUkFfQ0FQVFVSRV9TRVNTSU9OX0gKIAogI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhMy5oPgogI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFEZXZpY2UuaD4KKworI2lmZGVmIF9fQU5EUk9JRF9WTkRLX18KKyNpbmNsdWRlICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5oIgorI2luY2x1ZGUgIm5ka192ZW5kb3IvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25WZW5kb3IuaCIKKyNlbHNlCiAjaW5jbHVkZSAiQUNhbWVyYURldmljZS5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAogc3RydWN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCB7Ci0gICAgZXhwbGljaXQgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KEFOYXRpdmVXaW5kb3cqIHdpbmRvdywgYm9vbCBpc1NoYXJlZCA9IGZhbHNlKSA6Ci0gICAgICAgICAgICBtV2luZG93KHdpbmRvdyksIG1Jc1NoYXJlZChpc1NoYXJlZCkge307CisgICAgZXhwbGljaXQgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KEFDYW1lcmFXaW5kb3dUeXBlKiB3aW5kb3csIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBoeXNpY2FsQ2FtZXJhSWQgPSAiIikgOgorICAgICAgICAgICAgbVdpbmRvdyh3aW5kb3cpLCBtSXNTaGFyZWQoaXNTaGFyZWQpLCBtUGh5c2ljYWxDYW1lcmFJZChwaHlzaWNhbENhbWVyYUlkKSB7fTsKIAogICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCYgb3RoZXIpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1XaW5kb3cgPT0gb3RoZXIubVdpbmRvdzsKQEAgLTQwLDExICs0NywxMyBAQAogICAgICAgICByZXR1cm4gbVdpbmRvdyA+IG90aGVyLm1XaW5kb3c7CiAgICAgfQogCi0gICAgQU5hdGl2ZVdpbmRvdyogbVdpbmRvdzsKLSAgICBzdGQ6OnNldDxBTmF0aXZlV2luZG93ICo+IG1TaGFyZWRXaW5kb3dzOworICAgIEFDYW1lcmFXaW5kb3dUeXBlKiBtV2luZG93OworICAgIHN0ZDo6c2V0PEFDYW1lcmFXaW5kb3dUeXBlICo+IG1TaGFyZWRXaW5kb3dzOwogICAgIGJvb2wgICAgICAgICAgIG1Jc1NoYXJlZDsKICAgICBpbnQgICAgICAgICAgICBtUm90YXRpb24gPSBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wOworICAgIHN0ZDo6c3RyaW5nIG1QaHlzaWNhbENhbWVyYUlkOwogfTsKKyNlbmRpZgogCiBzdHJ1Y3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyIHsKICAgICBzdGQ6OnNldDxBQ2FwdHVyZVNlc3Npb25PdXRwdXQ+IG1PdXRwdXRzOwpAQCAtNjAsNyArNjksNyBAQAogICAgICAgICAgICAgaW50IGlkLAogICAgICAgICAgICAgY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBvdXRwdXRzLAogICAgICAgICAgICAgY29uc3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzKiBjYiwKLSAgICAgICAgICAgIENhbWVyYURldmljZSogZGV2aWNlKSA6CisgICAgICAgICAgICBhbmRyb2lkOjphY2FtOjpDYW1lcmFEZXZpY2UqIGRldmljZSkgOgogICAgICAgICAgICAgbUlkKGlkKSwgbU91dHB1dCgqb3V0cHV0cyksIG1Vc2VyU2Vzc2lvbkNhbGxiYWNrKCpjYiksCiAgICAgICAgICAgICBtRGV2aWNlKGRldmljZSkge30KIApAQCAtODIsMTMgKzkxLDE1IEBACiAKICAgICBjYW1lcmFfc3RhdHVzX3QgYWJvcnRDYXB0dXJlcygpOwogCisgICAgdGVtcGxhdGU8Y2xhc3MgVD4KICAgICBjYW1lcmFfc3RhdHVzX3Qgc2V0UmVwZWF0aW5nUmVxdWVzdCgKLSAgICAgICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMsCisgICAgICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCiAgICAgICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAogICAgICAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCk7CiAKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPgogICAgIGNhbWVyYV9zdGF0dXNfdCBjYXB0dXJlKAotICAgICAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKICAgICAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCiAgICAgICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKTsKIApAQCAtOTcsMTggKzEwOCwxOCBAQAogICAgIEFDYW1lcmFEZXZpY2UqIGdldERldmljZSgpOwogCiAgIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIENhbWVyYURldmljZTsKKyAgICBmcmllbmQgY2xhc3MgYW5kcm9pZDo6YWNhbTo6Q2FtZXJhRGV2aWNlOwogCiAgICAgLy8gQ2xvc2Ugc2Vzc2lvbiBiZWNhdXNlIGFwcCBjbG9zZSBjYW1lcmEgZGV2aWNlLCBjYW1lcmEgZGV2aWNlIGdvdCBFUlJPUl9ESVNDT05ORUNURUQsCiAgICAgLy8gb3IgYSBuZXcgc2Vzc2lvbiBpcyByZXBsYWNpbmcgdGhpcyBzZXNzaW9uLgogICAgIHZvaWQgY2xvc2VCeURldmljZSgpOwogCi0gICAgc3A8Q2FtZXJhRGV2aWNlPiBnZXREZXZpY2VTcCgpOworICAgIHNwPGFuZHJvaWQ6OmFjYW06OkNhbWVyYURldmljZT4gZ2V0RGV2aWNlU3AoKTsKIAogICAgIGNvbnN0IGludCBtSWQ7CiAgICAgY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyIG1PdXRwdXQ7CiAgICAgY29uc3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzIG1Vc2VyU2Vzc2lvbkNhbGxiYWNrOwotICAgIGNvbnN0IHdwPENhbWVyYURldmljZT4gbURldmljZTsKKyAgICBjb25zdCB3cDxhbmRyb2lkOjphY2FtOjpDYW1lcmFEZXZpY2U+IG1EZXZpY2U7CiAgICAgYm9vbCAgbUlzQ2xvc2VkID0gZmFsc2U7CiAgICAgYm9vbCAgbUNsb3NlZEJ5QXBwID0gZmFsc2U7CiAgICAgTXV0ZXggbVNlc3Npb25Mb2NrOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5pbmMgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmJmOGE1Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5pbmMKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJBQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKKworI2lmZGVmIF9fQU5EUk9JRF9WTkRLX18KKyNpbmNsdWRlICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZVZlbmRvci5pbmMiCisjZWxzZQorI2luY2x1ZGUgIkFDYW1lcmFEZXZpY2UuaW5jIgorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NhbWVyYV9zdGF0dXNfdAorQUNhbWVyYUNhcHR1cmVTZXNzaW9uOjpzZXRSZXBlYXRpbmdSZXF1ZXN0KAorICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICBzcDxhY2FtOjpDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJFcnJvcjogRGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBzZXNzaW9uICVwIGhhcyBiZWVuIGNsb3NlZCEiLCB0aGlzKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfU0VTU0lPTl9DTE9TRUQ7CisgICAgfQorCisgICAgY2FtZXJhX3N0YXR1c190IHJldDsKKyAgICBkZXYtPmxvY2tEZXZpY2VGb3JTZXNzaW9uT3BzKCk7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNlc3Npb25Mb2NrKTsKKyAgICAgICAgcmV0ID0gZGV2LT5zZXRSZXBlYXRpbmdSZXF1ZXN0c0xvY2tlZCgKKyAgICAgICAgICAgICAgICB0aGlzLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQpOworICAgIH0KKyAgICBkZXYtPnVubG9ja0RldmljZSgpOworICAgIHJldHVybiByZXQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6Y2FwdHVyZSgKKyAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOworICAgIGlmIChkZXYgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiRXJyb3I6IERldmljZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvbiAlcCBoYXMgYmVlbiBjbG9zZWQhIiwgdGhpcyk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOworICAgIH0KKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0OworICAgIGRldi0+bG9ja0RldmljZUZvclNlc3Npb25PcHMoKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vzc2lvbkxvY2spOworICAgICAgICByZXQgPSBkZXYtPmNhcHR1cmVMb2NrZWQodGhpcywgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkKTsKKyAgICB9CisgICAgZGV2LT51bmxvY2tEZXZpY2UoKTsKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCmluZGV4IGZmYWJmN2IuLmQ4YTU3NjUgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5jcHAKQEAgLTIwLDE2ICsyMCwxNyBAQAogI2luY2x1ZGUgPHZlY3Rvcj4KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuaD4KLSNpbmNsdWRlIDxjYW1lcmEyL1N1Ym1pdEluZm8uaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogI2luY2x1ZGUgIkFDYW1lcmFEZXZpY2UuaCIKICNpbmNsdWRlICJBQ2FtZXJhTWV0YWRhdGEuaCIKICNpbmNsdWRlICJBQ2FwdHVyZVJlcXVlc3QuaCIKICNpbmNsdWRlICJBQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKIAotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisjaW5jbHVkZSAiQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmluYyIKIAogbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0geworCiAvLyBTdGF0aWMgbWVtYmVyIGRlZmluaXRpb25zCiBjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtDb250ZXh0S2V5ICAgICAgICA9ICJDb250ZXh0IjsKIGNvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0RldmljZUtleSAgICAgICAgID0gIkRldmljZSI7CkBAIC0zOSw2ICs0MCw3IEBACiBjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtDYXB0dXJlUmVxdWVzdEtleSA9ICJDYXB0dXJlUmVxdWVzdCI7CiBjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtUaW1lU3RhbXBLZXkgICAgICA9ICJUaW1lU3RhbXAiOwogY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprQ2FwdHVyZVJlc3VsdEtleSAgPSAiQ2FwdHVyZVJlc3VsdCI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtQaHlzaWNhbENhcHR1cmVSZXN1bHRLZXkgPSAiUGh5c2ljYWxDYXB0dXJlUmVzdWx0IjsKIGNvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0NhcHR1cmVGYWlsdXJlS2V5ID0gIkNhcHR1cmVGYWlsdXJlIjsKIGNvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a1NlcXVlbmNlSWRLZXkgICAgID0gIlNlcXVlbmNlSWQiOwogY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprRnJhbWVOdW1iZXJLZXkgICAgPSAiRnJhbWVOdW1iZXIiOwpAQCAtNTAsMTEgKzUyLDExIEBACiBDYW1lcmFEZXZpY2U6OkNhbWVyYURldmljZSgKICAgICAgICAgY29uc3QgY2hhciogaWQsCiAgICAgICAgIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNiLAotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QUNhbWVyYU1ldGFkYXRhPiBjaGFycywKKyAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBjaGFycywKICAgICAgICAgQUNhbWVyYURldmljZSogd3JhcHBlcikgOgogICAgICAgICBtQ2FtZXJhSWQoaWQpLAogICAgICAgICBtQXBwQ2FsbGJhY2tzKCpjYiksCi0gICAgICAgIG1DaGFycyhzdGQ6Om1vdmUoY2hhcnMpKSwKKyAgICAgICAgbUNoYXJzKGNoYXJzKSwKICAgICAgICAgbVNlcnZpY2VDYWxsYmFjayhuZXcgU2VydmljZUNhbGxiYWNrKHRoaXMpKSwKICAgICAgICAgbVdyYXBwZXIod3JhcHBlciksCiAgICAgICAgIG1JbkVycm9yKGZhbHNlKSwKQEAgLTE5MCwxMDYgKzE5Miw2IEBACiAgICAgcmV0dXJuIEFDQU1FUkFfT0s7CiB9CiAKLWNhbWVyYV9zdGF0dXNfdAotQ2FtZXJhRGV2aWNlOjpjYXB0dXJlTG9ja2VkKAotICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCi0gICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMsCi0gICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCi0gICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKLSAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNMb2NrZWQoCi0gICAgICAgICAgICBzZXNzaW9uLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQsIC8qaXNSZXBlYXRpbmcqL2ZhbHNlKTsKLX0KLQotY2FtZXJhX3N0YXR1c190Ci1DYW1lcmFEZXZpY2U6OnNldFJlcGVhdGluZ1JlcXVlc3RzTG9ja2VkKAotICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCi0gICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMsCi0gICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCi0gICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKLSAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNMb2NrZWQoCi0gICAgICAgICAgICBzZXNzaW9uLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQsIC8qaXNSZXBlYXRpbmcqL3RydWUpOwotfQotCi1jYW1lcmFfc3RhdHVzX3QKLUNhbWVyYURldmljZTo6c3VibWl0UmVxdWVzdHNMb2NrZWQoCi0gICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKLSAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKLSAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKLSAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCwKLSAgICAgICAgYm9vbCBpc1JlcGVhdGluZykgewotICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKLSAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKLSAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBzdWJtaXQgY2FwdHVyZSByZXF1ZXN0IGZhaWxlZCEgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICAvLyBGb3JtIHR3byB2ZWN0b3JzIG9mIGNhcHR1cmUgcmVxdWVzdCwgb25lIGZvciBpbnRlcm5hbCB0cmFja2luZwotICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpjYW1lcmEyOjpDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdExpc3Q7Ci0gICAgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+IHJlcXVlc3RzVjsKLSAgICByZXF1ZXN0c1Yuc2V0Q2FwYWNpdHkobnVtUmVxdWVzdHMpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUmVxdWVzdHM7IGkrKykgewotICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxOwotICAgICAgICByZXQgPSBhbGxvY2F0ZUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RzW2ldLCByZXEpOwotICAgICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJDb252ZXJ0IGNhcHR1cmUgcmVxdWVzdCB0byBpbnRlcm5hbCBmb3JtYXQgZmFpbHVyZSEgcmV0ICVkIiwgcmV0KTsKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlcS0+bVN1cmZhY2VMaXN0LmVtcHR5KCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJDYXB0dXJlIHJlcXVlc3Qgd2l0aG91dCBvdXRwdXQgdGFyZ2V0IGNhbm5vdCBiZSBzdWJtaXR0ZWQhIik7Ci0gICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKLSAgICAgICAgfQotICAgICAgICByZXF1ZXN0TGlzdC5wdXNoX2JhY2soKihyZXEuZ2V0KCkpKTsKLSAgICAgICAgcmVxdWVzdHNWLnB1c2hfYmFjayhyZXEpOwotICAgIH0KLQotICAgIGlmIChpc1JlcGVhdGluZykgewotICAgICAgICByZXQgPSBzdG9wUmVwZWF0aW5nTG9ja2VkKCk7Ci0gICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgewotICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBzdG9wIHJlcGVhdGluZyBmYWlsZWQhIHJldCAlZCIsIGdldElkKCksIHJldCk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYmluZGVyOjpTdGF0dXMgcmVtb3RlUmV0OwotICAgIGhhcmR3YXJlOjpjYW1lcmEyOjp1dGlsczo6U3VibWl0SW5mbyBpbmZvOwotICAgIHJlbW90ZVJldCA9IG1SZW1vdGUtPnN1Ym1pdFJlcXVlc3RMaXN0KHJlcXVlc3RMaXN0LCBpc1JlcGVhdGluZywgJmluZm8pOwotICAgIGludCBzZXF1ZW5jZUlkID0gaW5mby5tUmVxdWVzdElkOwotICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyID0gaW5mby5tTGFzdEZyYW1lTnVtYmVyOwotICAgIGlmIChzZXF1ZW5jZUlkIDwgMCkgewotICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN1Ym1pdCByZXF1ZXN0IHJlbW90ZSBmYWlsdXJlOiByZXQgJWQiLCBnZXRJZCgpLCBzZXF1ZW5jZUlkKTsKLSAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKLSAgICB9Ci0KLSAgICBDYWxsYmFja0hvbGRlciBjYkhvbGRlcihzZXNzaW9uLCByZXF1ZXN0c1YsIGlzUmVwZWF0aW5nLCBjYnMpOwotICAgIG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihzZXF1ZW5jZUlkLCBjYkhvbGRlcikpOwotCi0gICAgaWYgKGlzUmVwZWF0aW5nKSB7Ci0gICAgICAgIC8vIHN0b3BSZXBlYXRpbmcgYWJvdmUgc2hvdWxkIGhhdmUgY2xlYW51cCByZXBlYXRpbmcgc2VxdWVuY2UgaWQKLSAgICAgICAgaWYgKG1SZXBlYXRpbmdTZXF1ZW5jZUlkICE9IFJFUVVFU1RfSURfTk9ORSkgewotICAgICAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFKTsKLSAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0U7Ci0gICAgICAgIH0KLSAgICAgICAgbVJlcGVhdGluZ1NlcXVlbmNlSWQgPSBzZXF1ZW5jZUlkOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1TZXF1ZW5jZUxhc3RGcmFtZU51bWJlck1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoc2VxdWVuY2VJZCwgbGFzdEZyYW1lTnVtYmVyKSk7Ci0gICAgfQotCi0gICAgaWYgKG1JZGxlKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXNzaW9uU3RhdGVDYiwgbUhhbmRsZXIpOwotICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOwotICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKLSAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLm9uQWN0aXZlKTsKLSAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7Ci0gICAgfQotICAgIG1JZGxlID0gZmFsc2U7Ci0gICAgbUJ1c3lTZXNzaW9uID0gc2Vzc2lvbjsKLQotICAgIGlmIChjYXB0dXJlU2VxdWVuY2VJZCkgewotICAgICAgICAqY2FwdHVyZVNlcXVlbmNlSWQgPSBzZXF1ZW5jZUlkOwotICAgIH0KLSAgICByZXR1cm4gQUNBTUVSQV9PSzsKLX0KLQogY2FtZXJhX3N0YXR1c190IENhbWVyYURldmljZTo6dXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbkxvY2tlZChBQ2FwdHVyZVNlc3Npb25PdXRwdXQgKm91dHB1dCkgewogICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKQEAgLTMyNSw4ICsyMjcsOSBAQAogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAotICAgIE91dHB1dENvbmZpZ3VyYXRpb24gb3V0Q29uZmlnKGlHQlAsIG91dHB1dC0+bVJvdGF0aW9uLCBPdXRwdXRDb25maWd1cmF0aW9uOjpJTlZBTElEX1NFVF9JRCwKLSAgICAgICAgICAgIHRydWUpOworICAgIFN0cmluZzE2IHBoeXNpY2FsSWQxNihvdXRwdXQtPm1QaHlzaWNhbENhbWVyYUlkLmNfc3RyKCkpOworICAgIE91dHB1dENvbmZpZ3VyYXRpb24gb3V0Q29uZmlnKGlHQlAsIG91dHB1dC0+bVJvdGF0aW9uLCBwaHlzaWNhbElkMTYsCisgICAgICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uOjpJTlZBTElEX1NFVF9JRCwgdHJ1ZSk7CiAKICAgICBmb3IgKGF1dG8mIGFudyA6IG91dHB1dC0+bVNoYXJlZFdpbmRvd3MpIHsKICAgICAgICAgcmV0ID0gZ2V0SUdCUGZyb21BbncoYW53LCBpR0JQKTsKQEAgLTQzNiw3ICszMzksNyBAQAogICAgIGlmIChyZXEgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGRlbGV0ZSByZXEtPnNldHRpbmdzOworICAgIHJlcS0+c2V0dGluZ3MuY2xlYXIoKTsKICAgICBkZWxldGUgcmVxLT50YXJnZXRzOwogICAgIGRlbGV0ZSByZXE7CiB9CkBAIC02NDAsOCArNTQzLDkgQEAKICAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9CisgICAgICAgIFN0cmluZzE2IHBoeXNpY2FsSWQxNihvdXRDb25maWcubVBoeXNpY2FsQ2FtZXJhSWQuY19zdHIoKSk7CiAgICAgICAgIG91dHB1dFNldC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCi0gICAgICAgICAgICAgICAgYW53LCBPdXRwdXRDb25maWd1cmF0aW9uKGlHQlAsIG91dENvbmZpZy5tUm90YXRpb24sCisgICAgICAgICAgICAgICAgYW53LCBPdXRwdXRDb25maWd1cmF0aW9uKGlHQlAsIG91dENvbmZpZy5tUm90YXRpb24sIHBoeXNpY2FsSWQxNiwKICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dENvbmZpZ3VyYXRpb246OklOVkFMSURfU0VUX0lELCBvdXRDb25maWcubUlzU2hhcmVkKSkpOwogICAgIH0KICAgICBhdXRvIGFkZFNldCA9IG91dHB1dFNldDsKQEAgLTgyOSw3ICs3MzMsNyBAQAogICAgIGlmIChlcnJvckNvZGUgPT0gaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9CVUZGRVIpIHsKICAgICAgICAgaW50MzJfdCBzdHJlYW1JZCA9IHJlc3VsdEV4dHJhcy5lcnJvclN0cmVhbUlkOwogICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2J1ZmZlckxvc3Qgb25CdWZmZXJMb3N0ID0KLSAgICAgICAgICAgICAgICBjYmgubUNhbGxiYWNrcy5vbkNhcHR1cmVCdWZmZXJMb3N0OworICAgICAgICAgICAgICAgIGNiaC5tT25DYXB0dXJlQnVmZmVyTG9zdDsKICAgICAgICAgYXV0byBvdXRwdXRQYWlySXQgPSBtQ29uZmlndXJlZE91dHB1dHMuZmluZChzdHJlYW1JZCk7CiAgICAgICAgIGlmIChvdXRwdXRQYWlySXQgPT0gbUNvbmZpZ3VyZWRPdXRwdXRzLmVuZCgpKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBzdHJlYW0gaWQgJWQgZG9lcyBub3QgZXhpc3QiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKQEAgLTg0Niw3ICs3NTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldElkKCksIGFudywgZnJhbWVOdW1iZXIpOwogCiAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlQnVmZmVyTG9zdCwgbUhhbmRsZXIpOwotICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ2FsbGJhY2tzLmNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOwogICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgb25CdWZmZXJMb3N0KTsKICAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKQEAgLTg1OCw3ICs3NjIsNyBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIHsgLy8gSGFuZGxlIG90aGVyIGNhcHR1cmUgZmFpbHVyZXMKICAgICAgICAgLy8gRmlyZSBjYXB0dXJlIGZhaWx1cmUgY2FsbGJhY2sgaWYgdGhlcmUgaXMgb25lIHJlZ2lzdGVyZWQKLSAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgb25FcnJvciA9IGNiaC5tQ2FsbGJhY2tzLm9uQ2FwdHVyZUZhaWxlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgb25FcnJvciA9IGNiaC5tT25DYXB0dXJlRmFpbGVkOwogICAgICAgICBzcDxDYW1lcmFDYXB0dXJlRmFpbHVyZT4gZmFpbHVyZShuZXcgQ2FtZXJhQ2FwdHVyZUZhaWx1cmUoKSk7CiAgICAgICAgIGZhaWx1cmUtPmZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CiAgICAgICAgIC8vIFRPRE86IHJlZmluZSB0aGlzIHdoZW4gaW1wbGVtZW50aW5nIGZsdXNoCkBAIC04NjgsNyArNzcyLDcgQEAKICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFU1VMVCk7CiAKICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENhcHR1cmVGYWlsLCBtSGFuZGxlcik7Ci0gICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1DYWxsYmFja3MuY29udGV4dCk7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7CiAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvbkVycm9yKTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKQEAgLTg5MCw2ICs3OTQsNyBAQAogICAgICAgICBjYXNlIGtXaGF0U2Vzc2lvblN0YXRlQ2I6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU3RhcnQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgorICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTZXFFbmQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxQWJvcnQ6CkBAIC05NjAsNiArODY1LDcgQEAKICAgICAgICAgY2FzZSBrV2hhdFNlc3Npb25TdGF0ZUNiOgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0OgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVJlc3VsdDoKKyAgICAgICAgY2FzZSBrV2hhdExvZ2ljYWxDYXB0dXJlUmVzdWx0OgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUZhaWw6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxRW5kOgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVNlcUFib3J0OgpAQCAtOTc3LDYgKzg4Myw3IEBACiAgICAgICAgICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTdGFydDoKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVJlc3VsdDoKKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVGYWlsOgogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlQnVmZmVyTG9zdDoKICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCAmb2JqKTsKQEAgLTEwNDgsNiArOTU1LDY0IEBACiAgICAgICAgICAgICAgICAgICAgIGZyZWVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG9uUmVzdWx0OworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvblJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgbG9naWNhbENhbWVyYSBjYXB0dXJlIHJlc3VsdCBjYWxsYmFjayEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvblJlc3VsdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrQ2FwdHVyZVJlc3VsdEtleSwgJm9iaik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSByZXN1bHQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IHJlc3VsdChzdGF0aWNfY2FzdDxBQ2FtZXJhTWV0YWRhdGEqPihvYmouZ2V0KCkpKTsKKworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrUGh5c2ljYWxDYXB0dXJlUmVzdWx0S2V5LCAmb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBwaHlzaWNhbCBjYXB0dXJlIHJlc3VsdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBwaHlzaWNhbFJlc3VsdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyo+KG9iai5nZXQoKSkpOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgcGh5c2ljYWxSZXN1bHRJbmZvID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbFJlc3VsdC0+bVBoeXNpY2FsUmVzdWx0SW5mbzsKKworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGh5c2ljYWxDYW1lcmFJZHM7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNwPEFDYW1lcmFNZXRhZGF0YT4+IHBoeXNpY2FsTWV0YWRhdGFDb3B5OworICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBoeXNpY2FsUmVzdWx0SW5mby5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBwaHlzaWNhbElkOChwaHlzaWNhbFJlc3VsdEluZm9baV0ubVBoeXNpY2FsQ2FtZXJhSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZHMucHVzaF9iYWNrKHBoeXNpY2FsSWQ4LmNfc3RyKCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBjbG9uZSA9IHBoeXNpY2FsUmVzdWx0SW5mb1tpXS5tUGh5c2ljYWxDYW1lcmFNZXRhZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lLnVwZGF0ZShBTkRST0lEX1NZTkNfRlJBTUVfTlVNQkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5c2ljYWxSZXN1bHQtPm1GcmFtZU51bWJlciwgLypkYXRhX2NvdW50Ki8xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gbWV0YWRhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQUNhbWVyYU1ldGFkYXRhKGNsb25lLnJlbGVhc2UoKSwgQUNhbWVyYU1ldGFkYXRhOjpBQ01fUkVTVUxUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsTWV0YWRhdGFDb3B5LnB1c2hfYmFjayhtZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gcGh5c2ljYWxDYW1lcmFJZFB0cnM7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEFDYW1lcmFNZXRhZGF0YSo+IHBoeXNpY2FsTWV0YWRhdGFDb3B5UHRyczsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaHlzaWNhbFJlc3VsdEluZm8uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWRQdHJzLnB1c2hfYmFjayhwaHlzaWNhbENhbWVyYUlkc1tpXS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsTWV0YWRhdGFDb3B5UHRycy5wdXNoX2JhY2socGh5c2ljYWxNZXRhZGF0YUNvcHlbaV0uZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwKTsKKyAgICAgICAgICAgICAgICAgICAgKCpvblJlc3VsdCkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgcmVxdWVzdCwgcmVzdWx0LmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsUmVzdWx0SW5mby5zaXplKCksIHBoeXNpY2FsQ2FtZXJhSWRQdHJzLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbE1ldGFkYXRhQ29weVB0cnMuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfZmFpbGVkIG9uRmFpbDsKQEAgLTExNTgsMTIgKzExMjMsMzQgQEAKIH0KIAogQ2FtZXJhRGV2aWNlOjpDYWxsYmFja0hvbGRlcjo6Q2FsbGJhY2tIb2xkZXIoCi0gICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgICAgICAgICBzZXNzaW9uLAotICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiYgcmVxdWVzdHMsCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlcGVhdGluZywKLSAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzKSA6Ci0gICAgbVNlc3Npb24oc2Vzc2lvbiksIG1SZXF1ZXN0cyhyZXF1ZXN0cyksCi0gICAgbUlzUmVwZWF0aW5nKGlzUmVwZWF0aW5nKSwgbUNhbGxiYWNrcyhmaWxsQ2IoY2JzKSkge30KKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgICAgICAgICBzZXNzaW9uLAorICAgICAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4mIHJlcXVlc3RzLAorICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0aW5nLAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzKSA6CisgICAgICAgIG1TZXNzaW9uKHNlc3Npb24pLCBtUmVxdWVzdHMocmVxdWVzdHMpLAorICAgICAgICBtSXNSZXBlYXRpbmcoaXNSZXBlYXRpbmcpLAorICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2soZmFsc2UpIHsKKyAgICBpbml0Q2FwdHVyZUNhbGxiYWNrcyhjYnMpOworCisgICAgaWYgKGNicyAhPSBudWxscHRyKSB7CisgICAgICAgIG1PbkNhcHR1cmVDb21wbGV0ZWQgPSBjYnMtPm9uQ2FwdHVyZUNvbXBsZXRlZDsKKyAgICB9Cit9CisKK0NhbWVyYURldmljZTo6Q2FsbGJhY2tIb2xkZXI6OkNhbGxiYWNrSG9sZGVyKAorICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiYgcmVxdWVzdHMsCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3MqIGxjYnMpIDoKKyAgICAgICAgbVNlc3Npb24oc2Vzc2lvbiksIG1SZXF1ZXN0cyhyZXF1ZXN0cyksCisgICAgICAgIG1Jc1JlcGVhdGluZyhpc1JlcGVhdGluZyksCisgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjayh0cnVlKSB7CisgICAgaW5pdENhcHR1cmVDYWxsYmFja3MobGNicyk7CisKKyAgICBpZiAobGNicyAhPSBudWxscHRyKSB7CisgICAgICAgIG1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkID0gbGNicy0+b25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZDsKKyAgICB9Cit9CiAKIHZvaWQKIENhbWVyYURldmljZTo6Y2hlY2tSZXBlYXRpbmdTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKApAQCAtMTE4MCw5ICsxMTY3LDkgQEAKICAgICAgICAgbVNlcXVlbmNlQ2FsbGJhY2tNYXAuZXJhc2UoY2JJdCk7CiAgICAgICAgIC8vIHNlbmQgc2VxIGFib3J0ZWQgY2FsbGJhY2sKICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENhcHR1cmVTZXFBYm9ydCwgbUhhbmRsZXIpOwotICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ2FsbGJhY2tzLmNvbnRleHQpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ29udGV4dCk7CiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIGNiaC5tU2Vzc2lvbik7Ci0gICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBjYmgubUNhbGxiYWNrcy5vbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgY2JoLm1PbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQpOwogICAgICAgICBtc2ctPnNldEludDMyKGtTZXF1ZW5jZUlkS2V5LCBzZXF1ZW5jZUlkKTsKICAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CiAgICAgfSBlbHNlIHsKQEAgLTEyMzAsOSArMTIxNyw5IEBACiAgICAgICAgICAgICBtU2VxdWVuY2VDYWxsYmFja01hcC5lcmFzZShjYkl0KTsKICAgICAgICAgICAgIC8vIHNlbmQgc2VxIGNvbXBsZXRlIGNhbGxiYWNrCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVNlcUVuZCwgbUhhbmRsZXIpOwotICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNhbGxiYWNrcy5jb250ZXh0KTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKICAgICAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIGNiaC5tU2Vzc2lvbik7Ci0gICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgY2JoLm1DYWxsYmFja3Mub25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGNiaC5tT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQpOwogICAgICAgICAgICAgbXNnLT5zZXRJbnQzMihrU2VxdWVuY2VJZEtleSwgc2VxdWVuY2VJZCk7CiAgICAgICAgICAgICBtc2ctPnNldEludDY0KGtGcmFtZU51bWJlcktleSwgbGFzdEZyYW1lTnVtYmVyKTsKIApAQCAtMTM4OSw3ICsxMzc2LDcgQEAKICAgICBhdXRvIGl0ID0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5maW5kKHNlcXVlbmNlSWQpOwogICAgIGlmIChpdCAhPSBkZXYtPm1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVuZCgpKSB7CiAgICAgICAgIENhbGxiYWNrSG9sZGVyIGNiaCA9ICgqaXQpLnNlY29uZDsKLSAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydCBvblN0YXJ0ID0gY2JoLm1DYWxsYmFja3Mub25DYXB0dXJlU3RhcnRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydCBvblN0YXJ0ID0gY2JoLm1PbkNhcHR1cmVTdGFydGVkOwogICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24gPSBjYmgubVNlc3Npb247CiAgICAgICAgIGlmICgoc2l6ZV90KSBidXJzdElkID49IGNiaC5tUmVxdWVzdHMuc2l6ZSgpKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiByZXF1ZXN0IGluZGV4ICVkIG91dCBvZiBib3VuZCAoc2l6ZSAlenUpIiwKQEAgLTEzOTgsNyArMTM4NSw3IEBACiAgICAgICAgIH0KICAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QgPSBjYmgubVJlcXVlc3RzW2J1cnN0SWRdOwogICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVN0YXJ0LCBkZXYtPm1IYW5kbGVyKTsKLSAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNhbGxiYWNrcy5jb250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNvbnRleHQpOwogICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIG9uU3RhcnQpOwogICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZVJlcXVlc3RLZXksIHJlcXVlc3QpOwpAQCAtMTQxMyw3ICsxNDAwLDYgQEAKICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhLAogICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+JiBwaHlzaWNhbFJlc3VsdEluZm9zKSB7Ci0gICAgKHZvaWQpIHBoeXNpY2FsUmVzdWx0SW5mb3M7CiAgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiAKICAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IG1EZXZpY2UucHJvbW90ZSgpOwpAQCAtMTQ0OSw5ICsxNDM1LDYgQEAKICAgICBhdXRvIGl0ID0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5maW5kKHNlcXVlbmNlSWQpOwogICAgIGlmIChpdCAhPSBkZXYtPm1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVuZCgpKSB7CiAgICAgICAgIENhbGxiYWNrSG9sZGVyIGNiaCA9ICgqaXQpLnNlY29uZDsKLSAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgb25SZXN1bHQgPSBpc1BhcnRpYWxSZXN1bHQgPwotICAgICAgICAgICAgICAgIGNiaC5tQ2FsbGJhY2tzLm9uQ2FwdHVyZVByb2dyZXNzZWQgOgotICAgICAgICAgICAgICAgIGNiaC5tQ2FsbGJhY2tzLm9uQ2FwdHVyZUNvbXBsZXRlZDsKICAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uID0gY2JoLm1TZXNzaW9uOwogICAgICAgICBpZiAoKHNpemVfdCkgYnVyc3RJZCA+PSBjYmgubVJlcXVlc3RzLnNpemUoKSkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogcmVxdWVzdCBpbmRleCAlZCBvdXQgb2YgYm91bmQgKHNpemUgJXp1KSIsCkBAIC0xNDYxLDEzICsxNDQ0LDI3IEBACiAgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0ID0gY2JoLm1SZXF1ZXN0c1tidXJzdElkXTsKICAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiByZXN1bHQobmV3IEFDYW1lcmFNZXRhZGF0YSgKICAgICAgICAgICAgICAgICBtZXRhZGF0YUNvcHkucmVsZWFzZSgpLCBBQ2FtZXJhTWV0YWRhdGE6OkFDTV9SRVNVTFQpKTsKKyAgICAgICAgc3A8QUNhbWVyYVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+IHBoeXNpY2FsUmVzdWx0KAorICAgICAgICAgICAgICAgIG5ldyBBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyhwaHlzaWNhbFJlc3VsdEluZm9zLCBmcmFtZU51bWJlcikpOwogCi0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlUmVzdWx0LCBkZXYtPm1IYW5kbGVyKTsKLSAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNhbGxiYWNrcy5jb250ZXh0KTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBjYmgubUlzTG9naWNhbENhbWVyYUNhbGxiYWNrID8ga1doYXRMb2dpY2FsQ2FwdHVyZVJlc3VsdCA6IGtXaGF0Q2FwdHVyZVJlc3VsdCwKKyAgICAgICAgICAgICAgICBkZXYtPm1IYW5kbGVyKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNvbnRleHQpOwogICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKLSAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIG9uUmVzdWx0KTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXN1bHRLZXksIHJlc3VsdCk7CisgICAgICAgIGlmIChpc1BhcnRpYWxSZXN1bHQpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiljYmgubU9uQ2FwdHVyZVByb2dyZXNzZWQpOworICAgICAgICB9IGVsc2UgaWYgKGNiaC5tSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2spIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiljYmgubU9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQpOworICAgICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1BoeXNpY2FsQ2FwdHVyZVJlc3VsdEtleSwgcGh5c2ljYWxSZXN1bHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWNiaC5tT25DYXB0dXJlQ29tcGxldGVkKTsKKyAgICAgICAgfQogICAgICAgICBkZXYtPnBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOwogICAgIH0KIApAQCAtMTUxMyw1ICsxNTEwLDUgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi0KK30gLy8gbmFtZXNwYWNlIGFjYW0KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmggYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5oCmluZGV4IDEzNjkxNDguLmQwZjM2M2IgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmgKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDxhdG9taWM+CiAjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgogI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgpAQCAtNDEsMTQgKzQyLDI1IEBACiAjaW5jbHVkZSAiQUNhbWVyYU1ldGFkYXRhLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKIAogLy8gV3JhcCBBQ2FtZXJhQ2FwdHVyZUZhaWx1cmUgc28gaXQgY2FuIGJlIHJlZi1jb3VudGVkCiBzdHJ1Y3QgQ2FtZXJhQ2FwdHVyZUZhaWx1cmUgOiBwdWJsaWMgUmVmQmFzZSwgcHVibGljIEFDYW1lcmFDYXB0dXJlRmFpbHVyZSB7fTsKIAorLy8gV3JhcCBQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvIHNvIHRoYXQgaXQgY2FuIGJlIHJlZi1jb3VudGVkCitzdHJ1Y3QgQUNhbWVyYVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm86IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyhjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgaW5mbywKKyAgICAgICAgICAgIGludDY0X3QgZnJhbWVOdW1iZXIpIDoKKyAgICAgICAgbVBoeXNpY2FsUmVzdWx0SW5mbyhpbmZvKSwgbUZyYW1lTnVtYmVyKGZyYW1lTnVtYmVyKSB7fQorCisgICAgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gbVBoeXNpY2FsUmVzdWx0SW5mbzsKKyAgICBpbnQ2NF90IG1GcmFtZU51bWJlcjsKK307CisKIGNsYXNzIENhbWVyYURldmljZSBmaW5hbCA6IHB1YmxpYyBSZWZCYXNlIHsKICAgcHVibGljOgogICAgIENhbWVyYURldmljZShjb25zdCBjaGFyKiBpZCwgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyogY2IsCi0gICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QUNhbWVyYU1ldGFkYXRhPiBjaGFycywKKyAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMsCiAgICAgICAgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlKiB3cmFwcGVyKTsKICAgICB+Q2FtZXJhRGV2aWNlKCk7CiAKQEAgLTEwOCwxOSArMTIwLDIyIEBACiAgICAgY2FtZXJhX3N0YXR1c190IHdhaXRVbnRpbElkbGVMb2NrZWQoKTsKIAogCisgICAgdGVtcGxhdGU8Y2xhc3MgVD4KICAgICBjYW1lcmFfc3RhdHVzX3QgY2FwdHVyZUxvY2tlZChzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCi0gICAgICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzLAorICAgICAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAogICAgICAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKICAgICAgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpOwogCisgICAgdGVtcGxhdGU8Y2xhc3MgVD4KICAgICBjYW1lcmFfc3RhdHVzX3Qgc2V0UmVwZWF0aW5nUmVxdWVzdHNMb2NrZWQoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAotICAgICAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKICAgICAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCiAgICAgICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKTsKIAorICAgIHRlbXBsYXRlPGNsYXNzIFQ+CiAgICAgY2FtZXJhX3N0YXR1c190IHN1Ym1pdFJlcXVlc3RzTG9ja2VkKAogICAgICAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAotICAgICAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKICAgICAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCiAgICAgICAgICAgICAvKm91dCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCwKICAgICAgICAgICAgIGJvb2wgaXNSZXBlYXRpbmcpOwpAQCAtMTU2LDcgKzE3MSw3IEBACiAgICAgbXV0YWJsZSBNdXRleCBtRGV2aWNlTG9jazsKICAgICBjb25zdCBTdHJpbmc4IG1DYW1lcmFJZDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbWVyYSBJRAogICAgIGNvbnN0IEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MgbUFwcENhbGxiYWNrczsgLy8gQ2FsbGJhY2sgdG8gYXBwCi0gICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEFDYW1lcmFNZXRhZGF0YT4gbUNoYXJzOyAgICAvLyBDYW1lcmEgY2hhcmFjdGVyaXN0aWNzCisgICAgY29uc3Qgc3A8QUNhbWVyYU1ldGFkYXRhPiBtQ2hhcnM7ICAgICAgICAgICAgICAgICAvLyBDYW1lcmEgY2hhcmFjdGVyaXN0aWNzCiAgICAgY29uc3Qgc3A8U2VydmljZUNhbGxiYWNrPiBtU2VydmljZUNhbGxiYWNrOwogICAgIEFDYW1lcmFEZXZpY2UqIG1XcmFwcGVyOwogCkBAIC0xOTEsNiArMjA2LDcgQEAKICAgICAgICAgLy8gQ2FwdHVyZSBjYWxsYmFja3MKICAgICAgICAga1doYXRDYXB0dXJlU3RhcnQsICAgICAvLyBvbkNhcHR1cmVTdGFydGVkCiAgICAgICAgIGtXaGF0Q2FwdHVyZVJlc3VsdCwgICAgLy8gb25DYXB0dXJlUHJvZ3Jlc3NlZCwgb25DYXB0dXJlQ29tcGxldGVkCisgICAgICAgIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQsIC8vIG9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQKICAgICAgICAga1doYXRDYXB0dXJlRmFpbCwgICAgICAvLyBvbkNhcHR1cmVGYWlsZWQKICAgICAgICAga1doYXRDYXB0dXJlU2VxRW5kLCAgICAvLyBvbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZAogICAgICAgICBrV2hhdENhcHR1cmVTZXFBYm9ydCwgIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZApAQCAtMjA2LDYgKzIyMiw3IEBACiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYXB0dXJlUmVxdWVzdEtleTsKICAgICBzdGF0aWMgY29uc3QgY2hhcioga1RpbWVTdGFtcEtleTsKICAgICBzdGF0aWMgY29uc3QgY2hhcioga0NhcHR1cmVSZXN1bHRLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtQaHlzaWNhbENhcHR1cmVSZXN1bHRLZXk7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYXB0dXJlRmFpbHVyZUtleTsKICAgICBzdGF0aWMgY29uc3QgY2hhcioga1NlcXVlbmNlSWRLZXk7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtGcmFtZU51bWJlcktleTsKQEAgLTI0NCwxOSArMjYxLDQ2IEBACiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiYgcmVxdWVzdHMsCiAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMpOworICAgICAgICBDYWxsYmFja0hvbGRlcihzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiYgcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3MqIGxjYnMpOwogCi0gICAgICAgIHN0YXRpYyBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyBmaWxsQ2IoCi0gICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicykgeworICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICAgICAgdm9pZCBpbml0Q2FwdHVyZUNhbGxiYWNrcyhUKiBjYnMpIHsKKyAgICAgICAgICAgIG1Db250ZXh0ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVTdGFydGVkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVQcm9ncmVzc2VkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVDb21wbGV0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZUZhaWxlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlQnVmZmVyTG9zdCA9IG51bGxwdHI7CiAgICAgICAgICAgICBpZiAoY2JzICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKmNiczsKKyAgICAgICAgICAgICAgICBtQ29udGV4dCA9IGNicy0+Y29udGV4dDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlU3RhcnRlZCA9IGNicy0+b25DYXB0dXJlU3RhcnRlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlUHJvZ3Jlc3NlZCA9IGNicy0+b25DYXB0dXJlUHJvZ3Jlc3NlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlRmFpbGVkID0gY2JzLT5vbkNhcHR1cmVGYWlsZWQ7CisgICAgICAgICAgICAgICAgbU9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkID0gY2JzLT5vbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkID0gY2JzLT5vbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQ7CisgICAgICAgICAgICAgICAgbU9uQ2FwdHVyZUJ1ZmZlckxvc3QgPSBjYnMtPm9uQ2FwdHVyZUJ1ZmZlckxvc3Q7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4geyBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyIH07CiAgICAgICAgIH0KLQogICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgbVNlc3Npb247CiAgICAgICAgIFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiBtUmVxdWVzdHM7CiAgICAgICAgIGNvbnN0IGJvb2wgICAgICAgICAgICAgICAgICBtSXNSZXBlYXRpbmc7Ci0gICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzIG1DYWxsYmFja3M7CisgICAgICAgIGNvbnN0IGJvb2wgICAgICAgICAgICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2s7CisKKyAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0OworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3N0YXJ0IG1PbkNhcHR1cmVTdGFydGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBtT25DYXB0dXJlUHJvZ3Jlc3NlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgbU9uQ2FwdHVyZUNvbXBsZXRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBtT25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgbU9uQ2FwdHVyZUZhaWxlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zZXF1ZW5jZUVuZCBtT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc2VxdWVuY2VBYm9ydCBtT25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2J1ZmZlckxvc3QgbU9uQ2FwdHVyZUJ1ZmZlckxvc3Q7CiAgICAgfTsKICAgICAvLyBzZXF1ZW5jZSBpZCAtPiBjYWxsYmFja3MgbWFwCiAgICAgc3RkOjptYXA8aW50LCBDYWxsYmFja0hvbGRlcj4gbVNlcXVlbmNlQ2FsbGJhY2tNYXA7CkBAIC0yODYsNiArMzMwLDcgQEAKIAogfTsKIAorfSAvLyBuYW1lc3BhY2UgYWNhbTsKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQ7CiAKIC8qKgpAQCAtMjk0LDggKzMzOSw4IEBACiAgKi8KIHN0cnVjdCBBQ2FtZXJhRGV2aWNlIHsKICAgICBBQ2FtZXJhRGV2aWNlKGNvbnN0IGNoYXIqIGlkLCBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzKiBjYiwKLSAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBQ2FtZXJhTWV0YWRhdGE+IGNoYXJzKSA6Ci0gICAgICAgICAgICBtRGV2aWNlKG5ldyBDYW1lcmFEZXZpY2UoaWQsIGNiLCBzdGQ6Om1vdmUoY2hhcnMpLCB0aGlzKSkge30KKyAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMpIDoKKyAgICAgICAgICAgIG1EZXZpY2UobmV3IGFuZHJvaWQ6OmFjYW06OkNhbWVyYURldmljZShpZCwgY2IsIGNoYXJzLCB0aGlzKSkge30KIAogICAgIH5BQ2FtZXJhRGV2aWNlKCkge307CiAKQEAgLTMzMSw3ICszNzYsNyBAQAogICAgIH0KIAogICBwcml2YXRlOgotICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OkNhbWVyYURldmljZT4gbURldmljZTsKKyAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjphY2FtOjpDYW1lcmFEZXZpY2U+IG1EZXZpY2U7CiB9OwogCiAjZW5kaWYgLy8gX0FDQU1FUkFfREVWSUNFX0gKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmluYyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmM1MzUyCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaW5jCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgIkFDYW1lcmFEZXZpY2UuaCIKKyNpbmNsdWRlICJBQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJBQ2FwdHVyZVJlcXVlc3QuaCIKKyNpbmNsdWRlICJBQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0geworCit0ZW1wbGF0ZTxjbGFzcyBUPgorY2FtZXJhX3N0YXR1c190CitDYW1lcmFEZXZpY2U6OmNhcHR1cmVMb2NrZWQoCisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgcmV0dXJuIHN1Ym1pdFJlcXVlc3RzTG9ja2VkKAorICAgICAgICAgICAgc2Vzc2lvbiwgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkLCAvKmlzUmVwZWF0aW5nKi9mYWxzZSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6c2V0UmVwZWF0aW5nUmVxdWVzdHNMb2NrZWQoCisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgcmV0dXJuIHN1Ym1pdFJlcXVlc3RzTG9ja2VkKAorICAgICAgICAgICAgc2Vzc2lvbiwgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkLCAvKmlzUmVwZWF0aW5nKi90cnVlKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVD4KK2NhbWVyYV9zdGF0dXNfdCBDYW1lcmFEZXZpY2U6OnN1Ym1pdFJlcXVlc3RzTG9ja2VkKAorICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCisgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKKyAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCwKKyAgICAgICAgYm9vbCBpc1JlcGVhdGluZykgeworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBzdWJtaXQgY2FwdHVyZSByZXF1ZXN0IGZhaWxlZCEgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvLyBGb3JtIHR3byB2ZWN0b3JzIG9mIGNhcHR1cmUgcmVxdWVzdCwgb25lIGZvciBpbnRlcm5hbCB0cmFja2luZworICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpjYW1lcmEyOjpDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdExpc3Q7CisgICAgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+IHJlcXVlc3RzVjsKKyAgICByZXF1ZXN0c1Yuc2V0Q2FwYWNpdHkobnVtUmVxdWVzdHMpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUmVxdWVzdHM7IGkrKykgeworICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxOworICAgICAgICByZXQgPSBhbGxvY2F0ZUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RzW2ldLCByZXEpOworICAgICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb252ZXJ0IGNhcHR1cmUgcmVxdWVzdCB0byBpbnRlcm5hbCBmb3JtYXQgZmFpbHVyZSEgcmV0ICVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlcS0+bVN1cmZhY2VMaXN0LmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYXB0dXJlIHJlcXVlc3Qgd2l0aG91dCBvdXRwdXQgdGFyZ2V0IGNhbm5vdCBiZSBzdWJtaXR0ZWQhIik7CisgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0TGlzdC5wdXNoX2JhY2soKihyZXEuZ2V0KCkpKTsKKyAgICAgICAgcmVxdWVzdHNWLnB1c2hfYmFjayhyZXEpOworICAgIH0KKworICAgIGlmIChpc1JlcGVhdGluZykgeworICAgICAgICByZXQgPSBzdG9wUmVwZWF0aW5nTG9ja2VkKCk7CisgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBzdG9wIHJlcGVhdGluZyBmYWlsZWQhIHJldCAlZCIsIGdldElkKCksIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgYmluZGVyOjpTdGF0dXMgcmVtb3RlUmV0OworICAgIGhhcmR3YXJlOjpjYW1lcmEyOjp1dGlsczo6U3VibWl0SW5mbyBpbmZvOworICAgIHJlbW90ZVJldCA9IG1SZW1vdGUtPnN1Ym1pdFJlcXVlc3RMaXN0KHJlcXVlc3RMaXN0LCBpc1JlcGVhdGluZywgJmluZm8pOworICAgIGludCBzZXF1ZW5jZUlkID0gaW5mby5tUmVxdWVzdElkOworICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyID0gaW5mby5tTGFzdEZyYW1lTnVtYmVyOworICAgIGlmIChzZXF1ZW5jZUlkIDwgMCkgeworICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN1Ym1pdCByZXF1ZXN0IHJlbW90ZSBmYWlsdXJlOiByZXQgJWQiLCBnZXRJZCgpLCBzZXF1ZW5jZUlkKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBDYWxsYmFja0hvbGRlciBjYkhvbGRlcihzZXNzaW9uLCByZXF1ZXN0c1YsIGlzUmVwZWF0aW5nLCBjYnMpOworICAgIG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihzZXF1ZW5jZUlkLCBjYkhvbGRlcikpOworCisgICAgaWYgKGlzUmVwZWF0aW5nKSB7CisgICAgICAgIC8vIHN0b3BSZXBlYXRpbmcgYWJvdmUgc2hvdWxkIGhhdmUgY2xlYW51cCByZXBlYXRpbmcgc2VxdWVuY2UgaWQKKyAgICAgICAgaWYgKG1SZXBlYXRpbmdTZXF1ZW5jZUlkICE9IFJFUVVFU1RfSURfTk9ORSkgeworICAgICAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFKTsKKyAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0U7CisgICAgICAgIH0KKyAgICAgICAgbVJlcGVhdGluZ1NlcXVlbmNlSWQgPSBzZXF1ZW5jZUlkOworICAgIH0gZWxzZSB7CisgICAgICAgIG1TZXF1ZW5jZUxhc3RGcmFtZU51bWJlck1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoc2VxdWVuY2VJZCwgbGFzdEZyYW1lTnVtYmVyKSk7CisgICAgfQorCisgICAgaWYgKG1JZGxlKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXNzaW9uU3RhdGVDYiwgbUhhbmRsZXIpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOworICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLm9uQWN0aXZlKTsKKyAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisgICAgfQorICAgIG1JZGxlID0gZmFsc2U7CisgICAgbUJ1c3lTZXNzaW9uID0gc2Vzc2lvbjsKKworICAgIGlmIChjYXB0dXJlU2VxdWVuY2VJZCkgeworICAgICAgICAqY2FwdHVyZVNlcXVlbmNlSWQgPSBzZXF1ZW5jZUlkOworICAgIH0KKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworfSAvLyBuYW1lc3BhY2UgYWNhbQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5jcHAKaW5kZXggYzU5ZDBlNy4uN2Q2ZWNhYyAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwCkBAIC0yNiw5ICsyNiwxMCBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPGNhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmg+CiAKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmFjYW07CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKIC8vIFN0YXRpYyBtZW1iZXIgZGVmaW5pdGlvbnMKIGNvbnN0IGNoYXIqIENhbWVyYU1hbmFnZXJHbG9iYWw6OmtDYW1lcmFJZEtleSAgID0gIkNhbWVyYUlkIjsKIGNvbnN0IGNoYXIqIENhbWVyYU1hbmFnZXJHbG9iYWw6OmtDYWxsYmFja0ZwS2V5ID0gIkNhbGxiYWNrRnAiOwpAQCAtMzQ1LDYgKzM0Niw3IEBACiAgICAgfQogfQogCit9IC8vIG5hbWVzcGFjZSBhY2FtCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKIC8qKgpAQCAtNDAyLDcgKzQwNCw3IEBACiB9CiAKIGNhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhTWFuYWdlcjo6Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAotICAgICAgICBjb25zdCBjaGFyICpjYW1lcmFJZFN0ciwgQUNhbWVyYU1ldGFkYXRhICoqY2hhcmFjdGVyaXN0aWNzKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIGNhbWVyYUlkU3RyLCBzcDxBQ2FtZXJhTWV0YWRhdGE+KiBjaGFyYWN0ZXJpc3RpY3MpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCiAgICAgc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlPiBjcyA9IENhbWVyYU1hbmFnZXJHbG9iYWw6OmdldEluc3RhbmNlKCkuZ2V0Q2FtZXJhU2VydmljZSgpOwpAQCAtNDM3LDE4ICs0MzksMTYgQEAKICAgICAgICAgY29uc3QgY2hhciogY2FtZXJhSWQsCiAgICAgICAgIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNhbGxiYWNrLAogICAgICAgICAvKm91dCovQUNhbWVyYURldmljZSoqIG91dERldmljZSkgewotICAgIEFDYW1lcmFNZXRhZGF0YSogcmF3Q2hhcnM7Ci0gICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZCwgJnJhd0NoYXJzKTsKKyAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IGNoYXJzOworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY2FtZXJhSWQsICZjaGFycyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgZ2V0IGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgZm9yIGNhbWVyYSAlcy4gZXJyICVkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLCByZXQpOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKICAgICB9Ci0gICAgc3RkOjp1bmlxdWVfcHRyPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMocmF3Q2hhcnMpOwotICAgIHJhd0NoYXJzID0gbnVsbHB0cjsKIAotICAgIEFDYW1lcmFEZXZpY2UqIGRldmljZSA9IG5ldyBBQ2FtZXJhRGV2aWNlKGNhbWVyYUlkLCBjYWxsYmFjaywgc3RkOjptb3ZlKGNoYXJzKSk7CisgICAgQUNhbWVyYURldmljZSogZGV2aWNlID0gbmV3IEFDYW1lcmFEZXZpY2UoY2FtZXJhSWQsIGNhbGxiYWNrLCBjaGFycyk7CiAKICAgICBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U+IGNzID0gQ2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0SW5zdGFuY2UoKS5nZXRDYW1lcmFTZXJ2aWNlKCk7CiAgICAgaWYgKGNzID09IG51bGxwdHIpIHsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5oIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmgKaW5kZXggY2M0MmY3Ny4uNTViZmE3ZSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmgKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmgKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxtYXA+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKIAogLyoqCiAgKiBQZXItcHJvY2VzcyBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgQ2FtZXJhTWFuZ2VyLiBTaGFyZWQgYnkgYWxsIEFDYW1lcmFNYW5hZ2VyCkBAIC0xNzIsNiArMTczLDcgQEAKICAgICB+Q2FtZXJhTWFuYWdlckdsb2JhbCgpOwogfTsKIAorfSAvLyBuYW1lc3BhY2UgYWNhbTsKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQ7CiAKIC8qKgpAQCAtMTgwLDEzICsxODIsMTMgQEAKICAqLwogc3RydWN0IEFDYW1lcmFNYW5hZ2VyIHsKICAgICBBQ2FtZXJhTWFuYWdlcigpIDoKLSAgICAgICAgICAgIG1HbG9iYWxNYW5hZ2VyKCYoYW5kcm9pZDo6Q2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0SW5zdGFuY2UoKSkpIHt9CisgICAgICAgICAgICBtR2xvYmFsTWFuYWdlcigmKGFuZHJvaWQ6OmFjYW06OkNhbWVyYU1hbmFnZXJHbG9iYWw6OmdldEluc3RhbmNlKCkpKSB7fQogICAgIH5BQ2FtZXJhTWFuYWdlcigpOwogICAgIGNhbWVyYV9zdGF0dXNfdCBnZXRDYW1lcmFJZExpc3QoQUNhbWVyYUlkTGlzdCoqIGNhbWVyYUlkTGlzdCk7CiAgICAgc3RhdGljIHZvaWQgICAgIGRlbGV0ZUNhbWVyYUlkTGlzdChBQ2FtZXJhSWRMaXN0KiBjYW1lcmFJZExpc3QpOwogCiAgICAgY2FtZXJhX3N0YXR1c190IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcygKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNhbWVyYUlkLCBBQ2FtZXJhTWV0YWRhdGEgKipjaGFyYWN0ZXJpc3RpY3MpOworICAgICAgICAgICAgY29uc3QgY2hhciogY2FtZXJhSWQsIGFuZHJvaWQ6OnNwPEFDYW1lcmFNZXRhZGF0YT4qIGNoYXJhY3RlcmlzdGljcyk7CiAgICAgY2FtZXJhX3N0YXR1c190IG9wZW5DYW1lcmEoY29uc3QgY2hhciogY2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqL0FDYW1lcmFEZXZpY2UqKiBkZXZpY2UpOwpAQCAtMTk2LDcgKzE5OCw3IEBACiAgICAgICAgIGtDYW1lcmFJZExpc3ROb3RJbml0ID0gLTEKICAgICB9OwogICAgIGFuZHJvaWQ6Ok11dGV4ICAgICAgICAgbUxvY2s7Ci0gICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6Q2FtZXJhTWFuYWdlckdsb2JhbD4gbUdsb2JhbE1hbmFnZXI7CisgICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6YWNhbTo6Q2FtZXJhTWFuYWdlckdsb2JhbD4gbUdsb2JhbE1hbmFnZXI7CiB9OwogCiAjZW5kaWYgLy9fQUNBTUVSQV9NQU5BR0VSX0gKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWV0YWRhdGEuY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAKaW5kZXggZmMwMGEyZC4uYzY2MTIzMyAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAKQEAgLTMyLDYgKzMyLDEwIEBACiAgICAgaWYgKG1UeXBlID09IEFDTV9DSEFSQUNURVJJU1RJQ1MpIHsKICAgICAgICAgZmlsdGVyVW5zdXBwb3J0ZWRGZWF0dXJlcygpOwogICAgICAgICBmaWx0ZXJTdHJlYW1Db25maWd1cmF0aW9ucygpOworICAgICAgICBmaWx0ZXJEdXJhdGlvbnMoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX01JTl9GUkFNRV9EVVJBVElPTlMpOworICAgICAgICBmaWx0ZXJEdXJhdGlvbnMoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OUyk7CisgICAgICAgIGZpbHRlckR1cmF0aW9ucyhBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9NSU5fRlJBTUVfRFVSQVRJT05TKTsKKyAgICAgICAgZmlsdGVyRHVyYXRpb25zKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUQUxMX0RVUkFUSU9OUyk7CiAgICAgfQogICAgIC8vIFRPRE86IGZpbHRlciByZXF1ZXN0L3Jlc3VsdCBrZXlzCiB9CkBAIC00Niw2ICs1MCw3IEBACiAgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfUkVBRF9TRU5TT1JfU0VUVElOR1M6CiAgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfQlVSU1RfQ0FQVFVSRToKICAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19ERVBUSF9PVVRQVVQ6CisgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTE9HSUNBTF9NVUxUSV9DQU1FUkE6CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19ZVVZfUkVQUk9DRVNTSU5HOgogICAgICAgICBjYXNlIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1BSSVZBVEVfUkVQUk9DRVNTSU5HOgpAQCAtNzUsMTEgKzgwLDEwNyBAQAogICAgICAgICB1aW50OF90IGNhcGFiaWxpdHkgPSBlbnRyeS5kYXRhLnU4W2ldOwogICAgICAgICBpZiAoaXNOZGtTdXBwb3J0ZWRDYXBhYmlsaXR5KGNhcGFiaWxpdHkpKSB7CiAgICAgICAgICAgICBjYXBhYmlsaXRpZXMucHVzaChjYXBhYmlsaXR5KTsKKworICAgICAgICAgICAgaWYgKGNhcGFiaWxpdHkgPT0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTE9HSUNBTF9NVUxUSV9DQU1FUkEpIHsKKyAgICAgICAgICAgICAgICBkZXJpdmVQaHlzaWNhbENhbWVyYUlkcygpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIG1EYXRhLnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUywgY2FwYWJpbGl0aWVzKTsKIH0KIAordm9pZAorQUNhbWVyYU1ldGFkYXRhOjpkZXJpdmVQaHlzaWNhbENhbWVyYUlkcygpIHsKKyAgICBBQ2FtZXJhTWV0YWRhdGFfY29uc3RfZW50cnkgZW50cnk7CisgICAgYXV0byByZXQgPSBnZXRDb25zdEVudHJ5KEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfUEhZU0lDQUxfSURTLCAmZW50cnkpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiJXM6IEdldCBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX1BIWVNJQ0FMX0lEUyBrZXkgZmFpbGVkLiByZXQgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmV0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IHVpbnQ4X3QqIGlkcyA9IGVudHJ5LmRhdGEudTg7CisgICAgc2l6ZV90IHN0YXJ0ID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyArK2kpIHsKKyAgICAgICAgaWYgKGlkc1tpXSA9PSAnXDAnKSB7CisgICAgICAgICAgICBpZiAoc3RhcnQgIT0gaSkgeworICAgICAgICAgICAgICAgIG1TdGF0aWNQaHlzaWNhbENhbWVyYUlkcy5wdXNoX2JhY2soKGNvbnN0IGNoYXIqKWlkcytzdGFydCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGFydCA9IGkrMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtU3RhdGljUGh5c2ljYWxDYW1lcmFJZHMuc2l6ZSgpIDwgMikgeworICAgICAgICBBTE9HVygiJXM6IExvZ2ljYWwgbXVsdGktY2FtZXJhIGRldmljZSBvbmx5IGhhcyAlenUgcGh5c2ljYWwgY2FtZXJhcyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtU3RhdGljUGh5c2ljYWxDYW1lcmFJZHMuc2l6ZSgpKTsKKyAgICB9Cit9CisKK3ZvaWQKK0FDYW1lcmFNZXRhZGF0YTo6ZmlsdGVyRHVyYXRpb25zKHVpbnQzMl90IHRhZykgeworICAgIGNvbnN0IGludCBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFID0gNDsKKyAgICBjb25zdCBpbnQgU1RSRUFNX0ZPUk1BVF9PRkZTRVQgPSAwOworICAgIGNvbnN0IGludCBTVFJFQU1fV0lEVEhfT0ZGU0VUID0gMTsKKyAgICBjb25zdCBpbnQgU1RSRUFNX0hFSUdIVF9PRkZTRVQgPSAyOworICAgIGNvbnN0IGludCBTVFJFQU1fRFVSQVRJT05fT0ZGU0VUID0gMzsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgZW50cnkgPSBtRGF0YS5maW5kKHRhZyk7CisgICAgaWYgKGVudHJ5LmNvdW50ID09IDAgfHwgZW50cnkuY291bnQgJSA0IHx8IGVudHJ5LnR5cGUgIT0gVFlQRV9JTlQ2NCkgeworICAgICAgICBBTE9HRSgiJXM6IG1hbGZvcm1lZCBkdXJhdGlvbiBrZXkgJWQhIGNvdW50ICV6dSwgdHlwZSAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB0YWcsIGVudHJ5LmNvdW50LCBlbnRyeS50eXBlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBWZWN0b3I8aW50NjRfdD4gZmlsdGVyZWREdXJhdGlvbnM7CisgICAgZmlsdGVyZWREdXJhdGlvbnMuc2V0Q2FwYWNpdHkoZW50cnkuY291bnQgKiAyKTsKKworICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGVudHJ5LmNvdW50OyBpICs9IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUpIHsKKyAgICAgICAgaW50NjRfdCBmb3JtYXQgPSBlbnRyeS5kYXRhLmk2NFtpICsgU1RSRUFNX0ZPUk1BVF9PRkZTRVRdOworICAgICAgICBpbnQ2NF90IHdpZHRoID0gZW50cnkuZGF0YS5pNjRbaSArIFNUUkVBTV9XSURUSF9PRkZTRVRdOworICAgICAgICBpbnQ2NF90IGhlaWdodCA9IGVudHJ5LmRhdGEuaTY0W2kgKyBTVFJFQU1fSEVJR0hUX09GRlNFVF07CisgICAgICAgIGludDY0X3QgZHVyYXRpb24gPSBlbnRyeS5kYXRhLmkzMltpICsgU1RSRUFNX0RVUkFUSU9OX09GRlNFVF07CisKKyAgICAgICAgLy8gTGVhdmUgdGhlIHVuZmlsdGVyZWQgZm9ybWF0IGluIHNvIGFwcHMgZGVwZW5kaW5nIG9uIHByZXZpb3VzIHdyb25nCisgICAgICAgIC8vIGZpbHRlciBiZWhhdmlvciBjb250aW51ZSB0byB3b3JrCisgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayhmb3JtYXQpOworICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2sod2lkdGgpOworICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2soaGVpZ2h0KTsKKyAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKGR1cmF0aW9uKTsKKworICAgICAgICAvLyBUcmFuc2xhdGUgSEFMIGZvcm1hdHMgdG8gTkRLIGZvcm1hdAorICAgICAgICBzd2l0Y2ggKHRhZykgeworICAgICAgICAgICAgY2FzZSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfTUlOX0ZSQU1FX0RVUkFUSU9OUzoKKyAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OUzoKKyAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBBSU1BR0VfRk9STUFUX0pQRUc7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayhmb3JtYXQpOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2sod2lkdGgpOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2soaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKGR1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX01JTl9GUkFNRV9EVVJBVElPTlM6CisgICAgICAgICAgICBjYXNlIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUQUxMX0RVUkFUSU9OUzoKKyAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBBSU1BR0VfRk9STUFUX0RFUFRIX1BPSU5UX0NMT1VEOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2soZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayhkdXJhdGlvbik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9ZMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQUlNQUdFX0ZPUk1BVF9ERVBUSDE2OworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2soZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayhkdXJhdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBTaG91bGQgbm90IHJlYWNoIGhlcmUKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVua293biB0YWcgMHgleCIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1EYXRhLnVwZGF0ZSh0YWcsIGZpbHRlcmVkRHVyYXRpb25zKTsKK30KIAogdm9pZAogQUNhbWVyYU1ldGFkYXRhOjpmaWx0ZXJTdHJlYW1Db25maWd1cmF0aW9ucygpIHsKQEAgLTIzOSw2ICszNDAsMjcgQEAKICAgICByZXR1cm4gbURhdGE7CiB9CiAKK2Jvb2wKK0FDYW1lcmFNZXRhZGF0YTo6aXNMb2dpY2FsTXVsdGlDYW1lcmEoc2l6ZV90KiBjb3VudCwgY29uc3QgY2hhcipjb25zdCoqIHBoeXNpY2FsQ2FtZXJhSWRzKSBjb25zdCB7CisgICAgaWYgKG1UeXBlICE9IEFDTV9DSEFSQUNURVJJU1RJQ1MpIHsKKyAgICAgICAgQUxPR0UoIiVzIG11c3QgYmUgY2FsbGVkIGZvciBhIHN0YXRpYyBtZXRhZGF0YSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChjb3VudCA9PSBudWxscHRyIHx8IHBoeXNpY2FsQ2FtZXJhSWRzID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGlucHV0IGNvdW50OiAlcCwgcGh5c2ljYWxDYW1lcmFJZHM6ICVwIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGNvdW50LCBwaHlzaWNhbENhbWVyYUlkcyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobVN0YXRpY1BoeXNpY2FsQ2FtZXJhSWRzLnNpemUoKSA+PSAyKSB7CisgICAgICAgICpjb3VudCA9IG1TdGF0aWNQaHlzaWNhbENhbWVyYUlkcy5zaXplKCk7CisgICAgICAgICpwaHlzaWNhbENhbWVyYUlkcyA9IG1TdGF0aWNQaHlzaWNhbENhbWVyYUlkcy5kYXRhKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKwogLy8gVE9ETzogc29tZSBvZiBrZXkgYmVsb3cgc2hvdWxkIGJlIGhpZGRlbiBmcm9tIHVzZXIKIC8vIGV4OiBBQ0FNRVJBX1JFUVVFU1RfSUQgYW5kIEFDQU1FUkFfUkVQUk9DRVNTX0VGRkVDVElWRV9FWFBPU1VSRV9GQUNUT1IKIC8qQE9+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+CkBAIC0zNjAsNiArNDgyLDcgQEAKICAgICBBTkRST0lEX1NUQVRJU1RJQ1NfSU5GT19NQVhfSElTVE9HUkFNX0NPVU5ULAogICAgIEFORFJPSURfU1RBVElTVElDU19JTkZPX01BWF9TSEFSUE5FU1NfTUFQX1ZBTFVFLAogICAgIEFORFJPSURfU1RBVElTVElDU19JTkZPX1NIQVJQTkVTU19NQVBfU0laRSwKKyAgICBBTkRST0lEX0lORk9fU1VQUE9SVEVEX0JVRkZFUl9NQU5BR0VNRU5UX1ZFUlNJT04sCiAgICAgQU5EUk9JRF9ERVBUSF9NQVhfREVQVEhfU0FNUExFUywKIH0pOwogCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1ldGFkYXRhLmggYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1ldGFkYXRhLmgKaW5kZXggMGZkN2VmYS4uNzA0OWM0YiAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5oCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWV0YWRhdGEuaApAQCAtMTcsMTIgKzE3LDE5IEBACiAjZGVmaW5lIF9BQ0FNRVJBX01FVEFEQVRBX0gKIAogI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisjaW5jbHVkZSA8Q2FtZXJhTWV0YWRhdGEuaD4KK3VzaW5nIENhbWVyYU1ldGFkYXRhID0gYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpoZWxwZXI6OkNhbWVyYU1ldGFkYXRhOworI2Vsc2UKICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KKyNlbmRpZgogCiAjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhLmg+CiAKQEAgLTU4LDEzICs2NSwxOCBAQAogICAgIGNhbWVyYV9zdGF0dXNfdCBnZXRUYWdzKC8qb3V0Ki9pbnQzMl90KiBudW1UYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki9jb25zdCB1aW50MzJfdCoqIHRhZ3MpIGNvbnN0OwogCisgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGdldEludGVybmFsRGF0YSgpIGNvbnN0OworICAgIGJvb2wgaXNMb2dpY2FsTXVsdGlDYW1lcmEoc2l6ZV90KiBjb3VudCwgY29uc3QgY2hhciogY29uc3QqKiBwaHlzaWNhbENhbWVyYUlkcykgY29uc3Q7CisKKyAgcHJpdmF0ZToKKwogICAgIGJvb2wgaXNOZGtTdXBwb3J0ZWRDYXBhYmlsaXR5KGNvbnN0IGludDMyX3QgY2FwYWJpbGl0eSk7CiAgICAgc3RhdGljIGlubGluZSBib29sIGlzVmVuZG9yVGFnKGNvbnN0IHVpbnQzMl90IHRhZyk7CiAgICAgc3RhdGljIGJvb2wgaXNDYXB0dXJlUmVxdWVzdFRhZyhjb25zdCB1aW50MzJfdCB0YWcpOwogICAgIHZvaWQgZmlsdGVyVW5zdXBwb3J0ZWRGZWF0dXJlcygpOyAvLyBIaWRlIGZlYXR1cmVzIG5vdCB5ZXQgc3VwcG9ydGVkIGJ5IE5ESwogICAgIHZvaWQgZmlsdGVyU3RyZWFtQ29uZmlndXJhdGlvbnMoKTsgLy8gSGlkZSBpbnB1dCBzdHJlYW1zLCB0cmFuc2xhdGUgaGFsIGZvcm1hdCB0byBOREsgZm9ybWF0cwotCi0gICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGdldEludGVybmFsRGF0YSgpIGNvbnN0OworICAgIHZvaWQgZmlsdGVyRHVyYXRpb25zKHVpbnQzMl90IHRhZyk7IC8vIHRyYW5zbGF0ZSBoYWwgZm9ybWF0IHRvIE5ESyBmb3JtYXRzCisgICAgdm9pZCBkZXJpdmVQaHlzaWNhbENhbWVyYUlkcygpOyAvLyBEZXJpdmUgYXJyYXkgb2YgcGh5c2ljYWwgaWRzLgogCiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgSU5URVJOQUxfVCwgdHlwZW5hbWUgTkRLX1Q+CiAgICAgY2FtZXJhX3N0YXR1c190IHVwZGF0ZUltcGwodWludDMyX3QgdGFnLCB1aW50MzJfdCBjb3VudCwgY29uc3QgTkRLX1QqIGRhdGEpIHsKQEAgLTk2LDcgKzEwOCw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgcHJpdmF0ZToKICAgICAvLyBndWFyZCBhY2Nlc3Mgb2YgcHVibGljIEFQSXM6IGdldC91cGRhdGUvZ2V0VGFncwogICAgIG11dGFibGUgTXV0ZXggICAgbUxvY2s7CiAgICAgQ2FtZXJhTWV0YWRhdGEgICBtRGF0YTsKQEAgLTEwNCw2ICsxMTUsOCBAQAogICAgIGNvbnN0IEFDQU1FUkFfTUVUQURBVEFfVFlQRSBtVHlwZTsKIAogICAgIHN0YXRpYyBzdGQ6OnVub3JkZXJlZF9zZXQ8dWludDMyX3Q+IHNTeXN0ZW1UYWdzOworCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+IG1TdGF0aWNQaHlzaWNhbENhbWVyYUlkczsKIH07CiAKICNlbmRpZiAvLyBfQUNBTUVSQV9NRVRBREFUQV9ICmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhcHR1cmVSZXF1ZXN0LmggYi9jYW1lcmEvbmRrL2ltcGwvQUNhcHR1cmVSZXF1ZXN0LmgKaW5kZXggMDZiMmNjMy4uNWM4MmFiNyAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYXB0dXJlUmVxdWVzdC5oCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FwdHVyZVJlcXVlc3QuaApAQCAtMjEsOCArMjEsMTEgQEAKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisjaW5jbHVkZSAibmRrX3ZlbmRvci9pbXBsL0FDYXB0dXJlUmVxdWVzdFZlbmRvci5oIgorI2Vsc2UKIHN0cnVjdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0IHsKLSAgICBleHBsaWNpdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0KEFOYXRpdmVXaW5kb3cqIHdpbmRvdykgOiBtV2luZG93KHdpbmRvdykge307CisgICAgZXhwbGljaXQgQUNhbWVyYU91dHB1dFRhcmdldChBQ2FtZXJhV2luZG93VHlwZSogd2luZG93KSA6IG1XaW5kb3cod2luZG93KSB7fTsKIAogICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IEFDYW1lcmFPdXRwdXRUYXJnZXQmIG90aGVyKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtV2luZG93ID09IG90aGVyLm1XaW5kb3c7CkBAIC0zNyw4ICs0MCw5IEBACiAgICAgICAgIHJldHVybiBtV2luZG93ID4gb3RoZXIubVdpbmRvdzsKICAgICB9CiAKLSAgICBBTmF0aXZlV2luZG93KiBtV2luZG93OworICAgIEFDYW1lcmFXaW5kb3dUeXBlKiBtV2luZG93OwogfTsKKyNlbmRpZgogCiBzdHJ1Y3QgQUNhbWVyYU91dHB1dFRhcmdldHMgewogICAgIHN0ZDo6c2V0PEFDYW1lcmFPdXRwdXRUYXJnZXQ+IG1PdXRwdXRzOwpAQCAtNTUsNyArNTksNyBAQAogICAgICAgICByZXR1cm4gQUNBTUVSQV9PSzsKICAgICB9CiAKLSAgICBBQ2FtZXJhTWV0YWRhdGEqICAgICAgc2V0dGluZ3M7CisgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiAgIHNldHRpbmdzOwogICAgIEFDYW1lcmFPdXRwdXRUYXJnZXRzKiB0YXJnZXRzOwogICAgIHZvaWQqICAgICAgICAgICAgICAgICBjb250ZXh0OwogfTsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaAppbmRleCA1ZTBkYjYwLi5kMTNhODE4IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmgKKysrIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oCkBAIC0zNSwxMCArMzUsMTAgQEAKICNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KICNpbmNsdWRlIDxzdGRib29sLmg+CiAKLSNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3cuaD4KICNpbmNsdWRlICJOZGtDYW1lcmFFcnJvci5oIgogI2luY2x1ZGUgIk5ka0NhbWVyYU1ldGFkYXRhLmgiCiAjaW5jbHVkZSAiTmRrQ2FwdHVyZVJlcXVlc3QuaCIKKyNpbmNsdWRlICJOZGtDYW1lcmFXaW5kb3dUeXBlLmgiCiAKICNpZm5kZWYgX05ES19DQU1FUkFfQ0FQVFVSRV9TRVNTSU9OX0gKICNkZWZpbmUgX05ES19DQU1FUkFfQ0FQVFVSRV9TRVNTSU9OX0gKQEAgLTI0Niw3ICsyNDYsNyBAQAogICovCiB0eXBlZGVmIHZvaWQgKCpBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2J1ZmZlckxvc3QpKAogICAgICAgICB2b2lkKiBjb250ZXh0LCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24sCi0gICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgQU5hdGl2ZVdpbmRvdyogd2luZG93LCBpbnQ2NF90IGZyYW1lTnVtYmVyKTsKKyAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCBBQ2FtZXJhV2luZG93VHlwZSogd2luZG93LCBpbnQ2NF90IGZyYW1lTnVtYmVyKTsKIAogdHlwZWRlZiBzdHJ1Y3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MgewogICAgIC8vLyBvcHRpb25hbCBhcHBsaWNhdGlvbiBjb250ZXh0LgpAQCAtNjQzLDYgKzY0MywxMDMgQEAKICAgICAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KiBvdXRwdXQpIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI4ICovCiAKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjkKKy8qKgorICogVGhlIGRlZmluaXRpb24gb2YgZmluYWwgY2FwdHVyZSByZXN1bHQgY2FsbGJhY2sgd2l0aCBsb2dpY2FsIG11bHRpLWNhbWVyYSBzdXBwb3J0LgorICoKKyAqIFRoaXMgaGFzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgZmluYWwgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQsIHdpdGgKKyAqIGFkZGVkIGFiaWxpdHkgdG8gcmV0dXJuIHBoeXNpY2FsIGNhbWVyYSByZXN1bHQgbWV0YWRhdGEgd2l0aGluIGEgbG9naWNhbCBtdWx0aS1jYW1lcmEuCisgKgorICogRm9yIGEgbG9naWNhbCBtdWx0aS1jYW1lcmEsIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgSWQgYW5kIHJlc3VsdCBtZXRhZGF0YQorICogb2YgdGhlIHVuZGVybHlpbmcgcGh5c2ljYWwgY2FtZXJhcywgd2hpY2ggdGhlIGNvcnJlc3BvbmRpbmcgY2FwdHVyZSByZXF1ZXN0IGNvbnRhaW5zIHRhcmdldHMgZm9yLgorICogSWYgdGhlIGNhcHR1cmUgcmVxdWVzdCBkb2Vzbid0IGNvbnRhaW4gdGFyZ2V0cyBzcGVjaWZpYyB0byBhbnkgcGh5c2ljYWwgY2FtZXJhLCBvciB0aGUgY3VycmVudAorICogY2FtZXJhIGRldmljZSBpc24ndCBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhLCBwaHlzaWNhbFJlc3VsdENvdW50IHdpbGwgYmUgMC4KKyAqCisgKiBAcGFyYW0gY29udGV4dCBUaGUgb3B0aW9uYWwgYXBwbGljYXRpb24gY29udGV4dCBwcm92aWRlZCBieSB1c2VyIGluCisgKiAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3N9LgorICogQHBhcmFtIHNlc3Npb24gVGhlIGNhbWVyYSBjYXB0dXJlIHNlc3Npb24gb2YgaW50ZXJlc3QuCisgKiBAcGFyYW0gcmVxdWVzdCBUaGUgY2FwdHVyZSByZXF1ZXN0IG9mIGludGVyZXN0LiBOb3RlIHRoYXQgdGhpcyBwb2ludGVyIHBvaW50cyB0byBhIGNvcHkgb2YKKyAqICAgICAgICAgICAgICAgIGNhcHR1cmUgcmVxdWVzdCBzZW50IGJ5IGFwcGxpY2F0aW9uLCBzbyB0aGUgYWRkcmVzcyBpcyBkaWZmZXJlbnQgdG8gd2hhdAorICogICAgICAgICAgICAgICAgYXBwbGljYXRpb24gc2VudCBidXQgdGhlIGNvbnRlbnQgd2lsbCBtYXRjaC4gVGhpcyByZXF1ZXN0IHdpbGwgYmUgZnJlZWQgYnkKKyAqICAgICAgICAgICAgICAgIGZyYW1ld29yayBpbW1lZGlhdGVseSBhZnRlciB0aGlzIGNhbGxiYWNrIHJldHVybnMuCisgKiBAcGFyYW0gcmVzdWx0IFRoZSBjYXB0dXJlIHJlc3VsdCBtZXRhZGF0YSByZXBvcnRlZCBieSBjYW1lcmEgZGV2aWNlLiBUaGUgbWVtb3J5IGlzIG1hbmFnZWQgYnkKKyAqICAgICAgICAgICAgICAgIGNhbWVyYSBmcmFtZXdvcmsuIERvIG5vdCBhY2Nlc3MgdGhpcyBwb2ludGVyIGFmdGVyIHRoaXMgY2FsbGJhY2sgcmV0dXJucy4KKyAqIEBwYXJhbSBwaHlzaWNhbFJlc3VsdENvdW50IFRoZSBudW1iZXIgb2YgcGh5c2ljYWwgY2FtZXJhIHJlc3VsdCBtZXRhZGF0YQorICogQHBhcmFtIHBoeXNpY2FsQ2FtZXJhSWRzIFRoZSBhcnJheSBvZiBwaHlzaWNhbCBjYW1lcmEgSURzIG9uIHdoaWNoIHRoZQorICogICAgICAgICAgICAgICAgcGh5c2ljYWwgcmVzdWx0IG1ldGFkYXRhIGFyZSByZXBvcnRlZC4KKyAqIEBwYXJhbSBwaHlzaWNhbFJlc3VsdHMgVGhlIGFycmF5IG9mIGNhcHR1cmUgcmVzdWx0IG1ldGFkYXRhIHJlcG9ydGVkIGJ5IHRoZQorICogICAgICAgICAgICAgICAgcGh5c2ljYWwgY2FtZXJhIGRldmljZXMuCisgKi8KK3R5cGVkZWYgdm9pZCAoKkFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja19yZXN1bHQpKAorICAgICAgICB2b2lkKiBjb250ZXh0LCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24sCisgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgY29uc3QgQUNhbWVyYU1ldGFkYXRhKiByZXN1bHQsCisgICAgICAgIHNpemVfdCBwaHlzaWNhbFJlc3VsdENvdW50LCBjb25zdCBjaGFyKiogcGh5c2ljYWxDYW1lcmFJZHMsCisgICAgICAgIGNvbnN0IEFDYW1lcmFNZXRhZGF0YSoqIHBoeXNpY2FsUmVzdWx0cyk7CisKKy8qKgorICogVGhpcyBoYXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcywKKyAqIHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0IGFuIG9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQgY2FsbGJhY2sgaXMKKyAqIHVzZWQsIGluc3RlYWQgb2Ygb25DYXB0dXJlQ29tcGxldGVkLCB0byBzdXBwb3J0IGxvZ2ljYWwgbXVsdGktY2FtZXJhLgorICovCit0eXBlZGVmIHN0cnVjdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzIHsKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzCisgICAgICovCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ7CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydCAgICAgICAgIG9uQ2FwdHVyZVN0YXJ0ZWQ7CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgICAgICAgIG9uQ2FwdHVyZVByb2dyZXNzZWQ7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNhbGxiYWNrIGlzIGNhbGxlZCB3aGVuIGFuIGltYWdlIGNhcHR1cmUgaGFzIGZ1bGx5IGNvbXBsZXRlZCBhbmQgYWxsIHRoZQorICAgICAqIHJlc3VsdCBtZXRhZGF0YSBpcyBhdmFpbGFibGUuIEZvciBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhLCB0aGlzIGNhbGxiYWNrCisgICAgICogYWxzbyByZXR1cm5zIHRoZSByZXN1bHQgbWV0YWRhdGEgZm9yIGFsbCBwaHlzaWNhbCBjYW1lcmFzIGJlaW5nCisgICAgICogZXhwbGljaXRseSByZXF1ZXN0ZWQgb24uCisgICAgICoKKyAgICAgKiA8cD5UaGlzIGNhbGxiYWNrIHdpbGwgYWx3YXlzIGZpcmUgYWZ0ZXIgdGhlIGxhc3Qge0BsaW5rIG9uQ2FwdHVyZVByb2dyZXNzZWR9OworICAgICAqIGluIG90aGVyIHdvcmRzLCBubyBtb3JlIHBhcnRpYWwgcmVzdWx0cyB3aWxsIGJlIGRlbGl2ZXJlZCBvbmNlIHRoZSBjb21wbGV0ZWQgcmVzdWx0CisgICAgICogaXMgYXZhaWxhYmxlLjwvcD4KKyAgICAgKgorICAgICAqIDxwPkZvciBwZXJmb3JtYW5jZS1pbnRlbnNpdmUgdXNlLWNhc2VzIHdoZXJlIGxhdGVuY3kgaXMgYSBmYWN0b3IsIGNvbnNpZGVyCisgICAgICogdXNpbmcge0BsaW5rIG9uQ2FwdHVyZVByb2dyZXNzZWR9IGluc3RlYWQuPC9wPgorICAgICAqCisgICAgICogPHA+Tm90ZSB0aGF0IHRoZSBBQ2FwdHVyZVJlcXVlc3QgcG9pbnRlciBpbiB0aGUgY2FsbGJhY2sgd2lsbCBub3QgbWF0Y2ggd2hhdCBhcHBsaWNhdGlvbiBoYXMKKyAgICAgKiBzdWJtaXR0ZWQsIGJ1dCB0aGUgY29udGVudHMgdGhlIEFDYXB0dXJlUmVxdWVzdCB3aWxsIG1hdGNoIHdoYXQgYXBwbGljYXRpb24gc3VibWl0dGVkLjwvcD4KKyAgICAgKi8KKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQ7CisKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzCisgICAgICovCisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgICAgICAgIG9uQ2FwdHVyZUZhaWxlZDsKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3NlcXVlbmNlRW5kICAgb25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQ7CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zZXF1ZW5jZUFib3J0IG9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZDsKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2J1ZmZlckxvc3QgICAgb25DYXB0dXJlQnVmZmVyTG9zdDsKK30gQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrczsKKworLyoqCisgKiBUaGlzIGhhcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlLCB3aXRoIGFkZGVkCisgKiBzdXBwb3J0IGZvciBsb2dpY2FsIG11bHRpLWNhbWVyYSB3aGVyZSB0aGUgY2FwdHVyZSBjYWxsYmFja3Mgc3VwcG9ydHMgcmVzdWx0IG1ldGFkYXRhIGZvcgorICogcGh5c2ljYWwgY2FtZXJhcy4KKyAqLworY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmUoCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrcyogY2FsbGJhY2tzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisvKioKKyAqIFRoaXMgaGFzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3NldFJlcGVhdGluZ1JlcXVlc3QsIHdpdGggYWRkZWQKKyAqIHN1cHBvcnQgZm9yIGxvZ2ljYWwgbXVsdGktY2FtZXJhIHdoZXJlIHRoZSBjYXB0dXJlIGNhbGxiYWNrcyBzdXBwb3J0cyByZXN1bHQgbWV0YWRhdGEgZm9yCisgKiBwaHlzaWNhbCBjYW1lcmFzLgorICovCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfc2V0UmVwZWF0aW5nUmVxdWVzdCgKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzKiBjYWxsYmFja3MsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKyNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjkgKi8KKwogX19FTkRfREVDTFMKIAogI2VuZGlmIC8qIF9OREtfQ0FNRVJBX0NBUFRVUkVfU0VTU0lPTl9IICovCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYURldmljZS5oIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFEZXZpY2UuaAppbmRleCA3YzEzYjM0Li4yNmFmNGY4IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYURldmljZS5oCisrKyBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhRGV2aWNlLmgKQEAgLTM0LDEwICszNCwxMCBAQAogICovCiAjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CiAKLSNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3cuaD4KICNpbmNsdWRlICJOZGtDYW1lcmFFcnJvci5oIgogI2luY2x1ZGUgIk5ka0NhcHR1cmVSZXF1ZXN0LmgiCiAjaW5jbHVkZSAiTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKKyNpbmNsdWRlICJOZGtDYW1lcmFXaW5kb3dUeXBlLmgiCiAKICNpZm5kZWYgX05ES19DQU1FUkFfREVWSUNFX0gKICNkZWZpbmUgX05ES19DQU1FUkFfREVWSUNFX0gKQEAgLTM0NSw3ICszNDUsNyBAQAogICogQHNlZSBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfYWRkCiAgKi8KIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfY3JlYXRlKAotICAgICAgICBBTmF0aXZlV2luZG93KiBhbncsIC8qb3V0Ki9BQ2FwdHVyZVNlc3Npb25PdXRwdXQqKiBvdXRwdXQpIF9fSU5UUk9EVUNFRF9JTigyNCk7CisgICAgICAgIEFDYW1lcmFXaW5kb3dUeXBlKiBhbncsIC8qb3V0Ki9BQ2FwdHVyZVNlc3Npb25PdXRwdXQqKiBvdXRwdXQpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKIC8qKgogICogRnJlZSBhIEFDYXB0dXJlU2Vzc2lvbk91dHB1dCBvYmplY3QuCkBAIC02OTQsNyArNjk0LDcgQEAKICAqIEBzZWUgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2FkZAogICovCiBjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVTZXNzaW9uU2hhcmVkT3V0cHV0X2NyZWF0ZSgKLSAgICAgICAgQU5hdGl2ZVdpbmRvdyogYW53LCAvKm91dCovQUNhcHR1cmVTZXNzaW9uT3V0cHV0Kiogb3V0cHV0KSBfX0lOVFJPRFVDRURfSU4oMjgpOworICAgICAgICBBQ2FtZXJhV2luZG93VHlwZSogYW53LCAvKm91dCovQUNhcHR1cmVTZXNzaW9uT3V0cHV0Kiogb3V0cHV0KSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCiAvKioKICAqIEFkZCBhIG5hdGl2ZSB3aW5kb3cgdG8gc2hhcmVkIEFDYXB0dXJlU2Vzc2lvbk91dHB1dC4KQEAgLTcxMiw3ICs3MTIsNyBAQAogICogICAgICAgICAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0LjwvbGk+PC91bD4KICAqLwogY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9hZGQoQUNhcHR1cmVTZXNzaW9uT3V0cHV0ICpvdXRwdXQsCi0gICAgICAgIEFOYXRpdmVXaW5kb3cgKmFudykgX19JTlRST0RVQ0VEX0lOKDI4KTsKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUgKmFudykgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAogLyoqCiAgKiBSZW1vdmUgYSBuYXRpdmUgd2luZG93IGZyb20gc2hhcmVkIEFDYXB0dXJlU2Vzc2lvbk91dHB1dC4KQEAgLTcyOCw3ICs3MjgsNyBAQAogICogICAgICAgICAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0LjwvbGk+PC91bD4KICAqLwogY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9yZW1vdmUoQUNhcHR1cmVTZXNzaW9uT3V0cHV0ICpvdXRwdXQsCi0gICAgICAgIEFOYXRpdmVXaW5kb3cqIGFudykgX19JTlRST0RVQ0VEX0lOKDI4KTsKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIGFudykgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAogLyoqCiAgKiBDcmVhdGUgYSBuZXcgY2FtZXJhIGNhcHR1cmUgc2Vzc2lvbiBzaW1pbGFyIHRvIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVTZXNzaW9ufS4gVGhpcwpAQCAtNzY1LDYgKzc2NSwzNiBAQAogCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI4ICovCiAKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjkKKworLyoqCisgKiBDcmVhdGUgYSBBQ2FwdHVyZVNlc3Npb25PdXRwdXQgb2JqZWN0IHVzZWQgZm9yIHN0cmVhbWluZyBmcm9tIGEgcGh5c2ljYWwKKyAqIGNhbWVyYSBhcyBwYXJ0IG9mIGEgbG9naWNhbCBjYW1lcmEgZGV2aWNlLgorICoKKyAqIDxwPlRoZSBBQ2FwdHVyZVNlc3Npb25PdXRwdXQgaXMgdXNlZCBpbiB7QGxpbmsgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2FkZH0gbWV0aG9kIHRvIGFkZAorICogYW4gb3V0cHV0IHtAbGluayBBTmF0aXZlV2luZG93fSB0byBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIuIFVzZQorICoge0BsaW5rIEFDYXB0dXJlU2Vzc2lvbk91dHB1dF9mcmVlfSB0byBmcmVlIHRoZSBvYmplY3QgYW5kIGl0cyBtZW1vcnkgYWZ0ZXIgYXBwbGljYXRpb24gbm8gbG9uZ2VyCisgKiBuZWVkcyB0aGUge0BsaW5rIEFDYXB0dXJlU2Vzc2lvbk91dHB1dH0uPC9wPgorICoKKyAqIEBwYXJhbSBhbncgdGhlIHtAbGluayBBTmF0aXZlV2luZG93fSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHtAbGluayBBQ2FwdHVyZVNlc3Npb25PdXRwdXR9CisgKiBAcGFyYW0gcGh5c2ljYWxJZCB0aGUgSWQgb2YgdGhlIHBoeXNpY2FsIGNhbWVyYSB0aGlzIG91dHB1dCBpcyBhc3NvY2lhdGVkCisgKiAgICAgICAgICAgICAgICAgIHdpdGguCisgKiBAcGFyYW0gb3V0cHV0IHRoZSBvdXRwdXQge0BsaW5rIEFDYXB0dXJlU2Vzc2lvbk91dHB1dH0gd2lsbCBiZSBzdG9yZWQgaGVyZSBpZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgbWV0aG9kIGNhbGwgc3VjY2VlZHMuCisgKgorICogQHJldHVybiA8dWw+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9PS30gaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLiBUaGUgY3JlYXRlZCBjb250YWluZXIgd2lsbCBiZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxlZCBpbiB0aGUgb3V0cHV0IGFyZ3VtZW50LjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgYW53LCBwaHlzaWNhbElkIG9yIG91dHB1dCBpcyBOVUxMLjwvbGk+PC91bD4KKyAqCisgKiBAc2VlIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9hZGQKKyAqLworY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblBoeXNpY2FsT3V0cHV0X2NyZWF0ZSgKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIGFudywgY29uc3QgY2hhciogcGh5c2ljYWxJZCwKKyAgICAgICAgLypvdXQqL0FDYXB0dXJlU2Vzc2lvbk91dHB1dCoqIG91dHB1dCkgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOSAqLworCiBfX0VORF9ERUNMUwogCiAjZW5kaWYgLyogX05ES19DQU1FUkFfREVWSUNFX0ggKi8KZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGEuaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGEuaAppbmRleCA2MTFlMjcwLi45YmJmYjgzIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhLmgKKysrIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YS5oCkBAIC0yMzMsNiArMjMzLDI4IEBACiAKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjQgKi8KIAorI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOQorCisvKioKKyAqIEhlbHBlciBmdW5jdGlvbiB0byBjaGVjayBpZiBhIGNhbWVyYSBpcyBsb2dpY2FsIG11bHRpLWNhbWVyYS4KKyAqCisgKiA8cD4gQ2hlY2sgd2hldGhlciBhIGNhbWVyYSBkZXZpY2UgaXMgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSBiYXNlZCBvbiBpdHMKKyAqIHN0YXRpYyBtZXRhZGF0YS4gSWYgaXQgaXMsIGFsc28gcmV0dXJucyBpdHMgcGh5c2ljYWwgc3ViIGNhbWVyYSBJZHMuPC9wPgorICoKKyAqIEBwYXJhbSBzdGF0aWNNZXRhZGF0YSB0aGUgc3RhdGljIG1ldGFkYXRhIG9mIHRoZSBjYW1lcmEgYmVpbmcgY2hlY2tlZC4KKyAqIEBwYXJhbSBudW1QaHlzaWNhbENhbWVyYXMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHBoeXNpY2FsIGNhbWVyYXMuCisgKiBAcGFyYW0gcGh5c2ljYWxDYW1lcmFJZHMgcmV0dXJucyB0aGUgYXJyYXkgb2YgcGh5c2ljYWwgY2FtZXJhIElkcyBiYWNraW5nIHRoaXMgbG9naWNhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYSBkZXZpY2UuIE5vdGUgdGhhdCB0aGlzIHBvaW50ZXIgaXMgb25seSB2YWxpZAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgdGhlIHN0YXRpY01ldGFkYXRhIG9iamVjdC4KKyAqCisgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhLCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK2Jvb2wgQUNhbWVyYU1ldGFkYXRhX2lzTG9naWNhbE11bHRpQ2FtZXJhKGNvbnN0IEFDYW1lcmFNZXRhZGF0YSogc3RhdGljTWV0YWRhdGEsCisgICAgICAgIC8qb3V0Ki9zaXplX3QqIG51bVBoeXNpY2FsQ2FtZXJhcywgLypvdXQqL2NvbnN0IGNoYXIqIGNvbnN0KiogcGh5c2ljYWxDYW1lcmFJZHMpCisgICAgICAgIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKyNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjkgKi8KKwogX19FTkRfREVDTFMKIAogI2VuZGlmIC8qIF9OREtfQ0FNRVJBX01FVEFEQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGFUYWdzLmggYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhVGFncy5oCmluZGV4IGE5YWY3N2UuLjRiYjc0Y2IgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGFUYWdzLmgKKysrIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YVRhZ3MuaApAQCAtMjc4Myw3ICsyNzgzLDcgQEAKICAgICAgKiAgIHtAbGluayBBSU1BR0VfRk9STUFUX1JBVzEyIFJBVzEyfS48L2xpPgogICAgICAqIDxsaT5Qcm9jZXNzZWQgKGJ1dCBub3Qtc3RhbGxpbmcpOiBhbnkgbm9uLVJBVyBmb3JtYXQgd2l0aG91dCBhIHN0YWxsIGR1cmF0aW9uLiAgVHlwaWNhbGx5CiAgICAgICogICB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9ZVVZfNDIwXzg4OCBZVVZfNDIwXzg4OH0sCi0gICAgICogICA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9ncmFwaGljcy9JbWFnZUZvcm1hdC5odG1sI05WMjEiPk5WMjE8L2E+LCBvciA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9ncmFwaGljcy9JbWFnZUZvcm1hdC5odG1sI1lWMTIiPllWMTI8L2E+LjwvbGk+CisgICAgICogICA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9ncmFwaGljcy9JbWFnZUZvcm1hdC5odG1sI05WMjEiPk5WMjE8L2E+LCA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9ncmFwaGljcy9JbWFnZUZvcm1hdC5odG1sI1lWMTIiPllWMTI8L2E+LCBvciB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9ZOCBZOH0gLjwvbGk+CiAgICAgICogPC91bD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUwpAQCAtMzI1MSw2ICszMjUxLDcgQEAKICAgICAgKiA8bGk+e0BsaW5rIEFJTUFHRV9GT1JNQVRfWVVWXzQyMF84ODggfTwvbGk+CiAgICAgICogPGxpPntAbGluayBBSU1BR0VfRk9STUFUX1JBVzEwIH08L2xpPgogICAgICAqIDxsaT57QGxpbmsgQUlNQUdFX0ZPUk1BVF9SQVcxMiB9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIEFJTUFHRV9GT1JNQVRfWTggfTwvbGk+CiAgICAgICogPC91bD4KICAgICAgKiA8cD5BbGwgb3RoZXIgZm9ybWF0cyBtYXkgb3IgbWF5IG5vdCBoYXZlIGFuIGFsbG93ZWQgc3RhbGwgZHVyYXRpb24gb24KICAgICAgKiBhIHBlci1jYXBhYmlsaXR5IGJhc2lzOyByZWZlciB0byBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUwpAQCAtMzI4OCw2ICszMjg5LDgxIEBACiAgICAgICovCiAgICAgQUNBTUVSQV9TQ0FMRVJfQ1JPUFBJTkdfVFlQRSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnl0ZSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX2Nyb3BwaW5nX3R5cGVfdCkKICAgICAgICAgICAgIEFDQU1FUkFfU0NBTEVSX1NUQVJUICsgMTMsCisgICAgLyoqCisgICAgICogPHA+UmVjb21tZW5kZWQgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIGZvciBjb21tb24gY2xpZW50IHVzZSBjYXNlcy48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQzMltuKjVdIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zY2FsZXJfYXZhaWxhYmxlX3JlY29tbWVuZGVkX3N0cmVhbV9jb25maWd1cmF0aW9uc190KTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5PcHRpb25hbCBzdWJzZXQgb2YgdGhlIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMgdGhhdCBjb250YWlucworICAgICAqIHNpbWlsYXIgdHVwbGVzIGxpc3RlZCBhcworICAgICAqIChpLmUuIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgb3V0cHV0L2lucHV0IHN0cmVhbSwgdXNlY2FzZSBiaXQgZmllbGQpLgorICAgICAqIENhbWVyYSBkZXZpY2VzIHdpbGwgYmUgYWJsZSB0byBzdWdnZXN0IHBhcnRpY3VsYXIgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIHdoaWNoIGFyZQorICAgICAqIHBvd2VyIGFuZCBwZXJmb3JtYW5jZSBlZmZpY2llbnQgZm9yIHNwZWNpZmljIHVzZSBjYXNlcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQKKyAgICAgKiByZXRyaWV2aW5nIHRoZSBzdWdnZXN0aW9ucyBzZWUKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYUNoYXJhY3RlcmlzdGljcy5odG1sI2dldFJlY29tbWVuZGVkU3RyZWFtQ29uZmlndXJhdGlvbk1hcCI+Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzI2dldFJlY29tbWVuZGVkU3RyZWFtQ29uZmlndXJhdGlvbk1hcDwvYT4uPC9wPgorICAgICAqIDxwPlRoZSBkYXRhIHJlcHJlc2VudGF0aW9uIGlzIGludFs1XSwgd2hpY2ggbWFwcyB0bworICAgICAqICh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIG91dHB1dC9pbnB1dCBzdHJlYW0sIHVzZWNhc2UgYml0IGZpZWxkKS4gVGhlIGFycmF5IGNhbiBiZQorICAgICAqIHBhcnNlZCB1c2luZyB0aGUgZm9sbG93aW5nIHBzZXVkbyBjb2RlOjwvcD4KKyAgICAgKiA8cD5zdHJ1Y3QgU3RyZWFtQ29uZmlndXJhdGlvbiB7CisgICAgICogaW50MzJfdCBmb3JtYXQ7CisgICAgICogaW50MzJfdCB3aWR0aDsKKyAgICAgKiBpbnQzMl90IGhlaWdodDsKKyAgICAgKiBpbnQzMl90IGlzSW5wdXQ7IH07PC9wPgorICAgICAqIDxwPnZvaWQgZ2V0UHJlZmVycmVkU3RyZWFtQ29uZmlndXJhdGlvbnMoCisgICAgICogICAgIGludDMyX3QgKmFycmF5LCBzaXplX3QgY291bnQsIGludDMyX3QgdXNlY2FzZUlkLAorICAgICAqICAgICBWZWN0b3IgJmx0OyBTdHJlYW1Db25maWd1cmF0aW9uICZndDsgKiBzY3MpIHsKKyAgICAgKiAgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUgPSA1OworICAgICAqICAgICBjb25zdCBzaXplX3QgU1RSRUFNX1dJRFRIX09GRlNFVCA9IDA7CisgICAgICogICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fSEVJR0hUX09GRlNFVCA9IDE7CisgICAgICogICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fRk9STUFUX09GRlNFVCA9IDI7CisgICAgICogICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUID0gMzsKKyAgICAgKiAgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9VU0VDQVNFX0JJVE1BUF9PRkZTRVQgPSA0OzwvcD4KKyAgICAgKiA8cHJlPjxjb2RlPmZvciAoc2l6ZV90IGkgPSAwOyBpICZsdDsgY291bnQ7IGkrPSBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFKSB7CisgICAgICogICAgIGludDMyX3Qgd2lkdGggPSBhcnJheVtpICsgU1RSRUFNX1dJRFRIX09GRlNFVF07CisgICAgICogICAgIGludDMyX3QgaGVpZ2h0ID0gYXJyYXlbaSArIFNUUkVBTV9IRUlHSFRfT0ZGU0VUXTsKKyAgICAgKiAgICAgaW50MzJfdCBmb3JtYXQgPSBhcnJheVtpICsgU1RSRUFNX0ZPUk1BVF9PRkZTRVRdOworICAgICAqICAgICBpbnQzMl90IGlzSW5wdXQgPSBhcnJheVtpICsgU1RSRUFNX0lTX0lOUFVUX09GRlNFVF07CisgICAgICogICAgIGludDMyX3Qgc3VwcG9ydGVkVXNlY2FzZXMgPSBhcnJheVtpICsgU1RSRUFNX1VTRUNBU0VfQklUTUFQX09GRlNFVF07CisgICAgICogICAgIGlmIChzdXBwb3J0ZWRVc2VjYXNlcyAmYW1wOyAoMSAmbHQ7Jmx0OyB1c2VjYXNlSWQpKSB7CisgICAgICogICAgICAgICBTdHJlYW1Db25maWd1cmF0aW9uIHNjID0ge2Zvcm1hdCwgd2lkdGgsIGhlaWdodCwgaXNJbnB1dH07CisgICAgICogICAgICAgICBzY3MtJmd0O2FkZChzYyk7CisgICAgICogICAgIH0KKyAgICAgKiB9CisgICAgICogPC9jb2RlPjwvcHJlPgorICAgICAqIDxwPn08L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMKKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50MzJbbio1XSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX2F2YWlsYWJsZV9yZWNvbW1lbmRlZF9zdHJlYW1fY29uZmlndXJhdGlvbnNfdCkKKyAgICAgICAgICAgIEFDQU1FUkFfU0NBTEVSX1NUQVJUICsgMTQsCisgICAgLyoqCisgICAgICogPHA+UmVjb21tZW5kZWQgbWFwcGluZ3Mgb2YgaW1hZ2UgZm9ybWF0cyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhpcworICAgICAqIGNhbWVyYSBkZXZpY2UgZm9yIGlucHV0IHN0cmVhbXMsIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgb3V0cHV0IGZvcm1hdHMuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogaW50MzI8L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyBpcyBhIHJlY29tbWVuZGVkIHN1YnNldCBvZiB0aGUgY29tcGxldGUgbGlzdCBvZiBtYXBwaW5ncyBmb3VuZCBpbgorICAgICAqIGFuZHJvaWQuc2NhbGVyLmF2YWlsYWJsZUlucHV0T3V0cHV0Rm9ybWF0c01hcC4gVGhlIHNhbWUgcmVxdWlyZW1lbnRzIGFwcGx5IGhlcmUgYXMgd2VsbC4KKyAgICAgKiBUaGUgbGlzdCBob3dldmVyIGRvZXNuJ3QgbmVlZCB0byBjb250YWluIGFsbCBhdmFpbGFibGUgYW5kIHN1cHBvcnRlZCBtYXBwaW5ncy4gSW5zdGVhZCBvZgorICAgICAqIHRoaXMgZGV2ZWxvcGVycyBtdXN0IGxpc3Qgb25seSByZWNvbW1lbmRlZCBhbmQgZWZmaWNpZW50IGVudHJpZXMuCisgICAgICogSWYgc2V0LCB0aGUgaW5mb3JtYXRpb24gd2lsbCBiZSBhdmFpbGFibGUgaW4gdGhlIFpFUk9fU0hVVFRFUl9MQUcgcmVjb21tZW5kZWQgc3RyZWFtCisgICAgICogY29uZmlndXJhdGlvbiBzZWUKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYUNoYXJhY3RlcmlzdGljcy5odG1sI2dldFJlY29tbWVuZGVkU3RyZWFtQ29uZmlndXJhdGlvbk1hcCI+Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzI2dldFJlY29tbWVuZGVkU3RyZWFtQ29uZmlndXJhdGlvbk1hcDwvYT4uPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9JTlBVVF9PVVRQVVRfRk9STUFUU19NQVAgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnQzMgorICAgICAgICAgICAgQUNBTUVSQV9TQ0FMRVJfU1RBUlQgKyAxNSwKICAgICBBQ0FNRVJBX1NDQUxFUl9FTkQsCiAKICAgICAvKioKQEAgLTM0NDgsNiArMzUyNCw4IEBACiAgICAgICogPHA+U29tZSBkZXZpY2VzIG1heSBjaG9vc2UgdG8gcHJvdmlkZSBhIHNlY29uZCBzZXQgb2YgY2FsaWJyYXRpb24KICAgICAgKiBpbmZvcm1hdGlvbiBmb3IgaW1wcm92ZWQgcXVhbGl0eSwgaW5jbHVkaW5nCiAgICAgICogQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQyIGFuZCBpdHMgY29ycmVzcG9uZGluZyBtYXRyaWNlcy48L3A+CisgICAgICogPHA+U3RhcnRpbmcgZnJvbSBBbmRyb2lkIFEsIHRoaXMga2V5IHdpbGwgbm90IGJlIHByZXNlbnQgZm9yIGEgTU9OT0NIUk9NRSBjYW1lcmEsIGV2ZW4gaWYKKyAgICAgKiB0aGUgY2FtZXJhIGRldmljZSBoYXMgUkFXIGNhcGFiaWxpdHkuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9DQUxJQlJBVElPTl9UUkFOU0ZPUk0xCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9DT0xPUl9UUkFOU0ZPUk0xCkBAIC0zNDc3LDYgKzM1NTUsOCBAQAogICAgICAqIDxwPklmIHRoaXMga2V5IGlzIHByZXNlbnQsIHRoZW4gQUNBTUVSQV9TRU5TT1JfQ09MT1JfVFJBTlNGT1JNMiwKICAgICAgKiBBQ0FNRVJBX1NFTlNPUl9DQUxJQlJBVElPTl9UUkFOU0ZPUk0yLCBhbmQKICAgICAgKiBBQ0FNRVJBX1NFTlNPUl9GT1JXQVJEX01BVFJJWDIgd2lsbCBhbHNvIGJlIHByZXNlbnQuPC9wPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBldmVuIGlmCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgaGFzIFJBVyBjYXBhYmlsaXR5LjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfQ0FMSUJSQVRJT05fVFJBTlNGT1JNMgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfQ09MT1JfVFJBTlNGT1JNMgpAQCAtMzUwNCw2ICszNTg0LDggQEAKICAgICAgKiBjb2xvcnNwYWNlKSBpbnRvIHRoaXMgY2FtZXJhIGRldmljZSdzIG5hdGl2ZSBzZW5zb3IgY29sb3IKICAgICAgKiBzcGFjZSB1bmRlciB0aGUgZmlyc3QgcmVmZXJlbmNlIGlsbHVtaW5hbnQKICAgICAgKiAoQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxKS48L3A+CisgICAgICogPHA+U3RhcnRpbmcgZnJvbSBBbmRyb2lkIFEsIHRoaXMga2V5IHdpbGwgbm90IGJlIHByZXNlbnQgZm9yIGEgTU9OT0NIUk9NRSBjYW1lcmEsIGV2ZW4gaWYKKyAgICAgKiB0aGUgY2FtZXJhIGRldmljZSBoYXMgUkFXIGNhcGFiaWxpdHkuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDEKICAgICAgKi8KQEAgLTM1MzEsNiArMzYxMyw4IEBACiAgICAgICogKEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMikuPC9wPgogICAgICAqIDxwPlRoaXMgbWF0cml4IHdpbGwgb25seSBiZSBwcmVzZW50IGlmIHRoZSBzZWNvbmQgcmVmZXJlbmNlCiAgICAgICogaWxsdW1pbmFudCBpcyBwcmVzZW50LjwvcD4KKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhpcyBrZXkgd2lsbCBub3QgYmUgcHJlc2VudCBmb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgZXZlbiBpZgorICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBSQVcgY2FwYWJpbGl0eS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMgogICAgICAqLwpAQCAtMzU1OSw2ICszNjQzLDggQEAKICAgICAgKiBhbmQgdGhlIENJRSBYWVogY29sb3JzcGFjZSB3aGVuIGNhbGN1bGF0aW5nIHRoaXMgdHJhbnNmb3JtIHdpbGwKICAgICAgKiBtYXRjaCB0aGUgc3RhbmRhcmQgd2hpdGUgcG9pbnQgZm9yIHRoZSBmaXJzdCByZWZlcmVuY2UgaWxsdW1pbmFudAogICAgICAqIChpLmUuIG5vIGNocm9tYXRpYyBhZGFwdGF0aW9uIHdpbGwgYmUgYXBwbGllZCBieSB0aGlzIHRyYW5zZm9ybSkuPC9wPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBldmVuIGlmCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgaGFzIFJBVyBjYXBhYmlsaXR5LjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxCiAgICAgICovCkBAIC0zNTg5LDYgKzM2NzUsOCBAQAogICAgICAqIChpLmUuIG5vIGNocm9tYXRpYyBhZGFwdGF0aW9uIHdpbGwgYmUgYXBwbGllZCBieSB0aGlzIHRyYW5zZm9ybSkuPC9wPgogICAgICAqIDxwPlRoaXMgbWF0cml4IHdpbGwgb25seSBiZSBwcmVzZW50IGlmIHRoZSBzZWNvbmQgcmVmZXJlbmNlCiAgICAgICogaWxsdW1pbmFudCBpcyBwcmVzZW50LjwvcD4KKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhpcyBrZXkgd2lsbCBub3QgYmUgcHJlc2VudCBmb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgZXZlbiBpZgorICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBSQVcgY2FwYWJpbGl0eS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMgogICAgICAqLwpAQCAtMzYxNSw2ICszNzAzLDggQEAKICAgICAgKiB0aGlzIG1hdHJpeCBpcyBjaG9zZW4gc28gdGhhdCB0aGUgc3RhbmRhcmQgd2hpdGUgcG9pbnQgZm9yIHRoaXMgcmVmZXJlbmNlCiAgICAgICogaWxsdW1pbmFudCBpbiB0aGUgcmVmZXJlbmNlIHNlbnNvciBjb2xvcnNwYWNlIGlzIG1hcHBlZCB0byBENTAgaW4gdGhlCiAgICAgICogQ0lFIFhZWiBjb2xvcnNwYWNlLjwvcD4KKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhpcyBrZXkgd2lsbCBub3QgYmUgcHJlc2VudCBmb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgZXZlbiBpZgorICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBSQVcgY2FwYWJpbGl0eS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMQogICAgICAqLwpAQCAtMzY0Myw2ICszNzMzLDggQEAKICAgICAgKiBDSUUgWFlaIGNvbG9yc3BhY2UuPC9wPgogICAgICAqIDxwPlRoaXMgbWF0cml4IHdpbGwgb25seSBiZSBwcmVzZW50IGlmIHRoZSBzZWNvbmQgcmVmZXJlbmNlCiAgICAgICogaWxsdW1pbmFudCBpcyBwcmVzZW50LjwvcD4KKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhpcyBrZXkgd2lsbCBub3QgYmUgcHJlc2VudCBmb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgZXZlbiBpZgorICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBSQVcgY2FwYWJpbGl0eS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMgogICAgICAqLwpAQCAtMzY3NSw2ICszNzY3LDcgQEAKICAgICAgKiBsZXZlbCB2YWx1ZXMuIEZvciByYXcgY2FwdHVyZSBpbiBwYXJ0aWN1bGFyLCBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UKICAgICAgKiBwaXhlbHMgZnJvbSBBQ0FNRVJBX1NFTlNPUl9PUFRJQ0FMX0JMQUNLX1JFR0lPTlMgdG8gY2FsY3VsYXRlIGJsYWNrCiAgICAgICogbGV2ZWwgdmFsdWVzIGZvciBlYWNoIGZyYW1lLjwvcD4KKyAgICAgKiA8cD5Gb3IgYSBNT05PQ0hST01FIGNhbWVyYSBkZXZpY2UsIGFsbCBvZiB0aGUgMngyIGNoYW5uZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSB2YWx1ZXMuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9EWU5BTUlDX0JMQUNLX0xFVkVMCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVApAQCAtMzc2OSw2ICszODYyLDggQEAKICAgICAgKiB1c2VkIHRvIGludGVycG9sYXRlIGJldHdlZW4gdGhlIHByb3ZpZGVkIGNvbG9yIHRyYW5zZm9ybXMgd2hlbgogICAgICAqIHByb2Nlc3NpbmcgcmF3IHNlbnNvciBkYXRhLjwvcD4KICAgICAgKiA8cD5UaGUgb3JkZXIgb2YgdGhlIHZhbHVlcyBpcyBSLCBHLCBCOyB3aGVyZSBSIGlzIGluIHRoZSBsb3dlc3QgaW5kZXguPC9wPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBldmVuIGlmCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgaGFzIFJBVyBjYXBhYmlsaXR5LjwvcD4KICAgICAgKi8KICAgICBBQ0FNRVJBX1NFTlNPUl9ORVVUUkFMX0NPTE9SX1BPSU5UID0gICAgICAgICAgICAgICAgICAgICAgICAvLyByYXRpb25hbFszXQogICAgICAgICAgICAgQUNBTUVSQV9TRU5TT1JfU1RBUlQgKyAxOCwKQEAgLTM3OTksNiArMzg5NCw4IEBACiAgICAgICogdGhhdCBjaGFubmVsLjwvcD4KICAgICAgKiA8cD5BIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIG5vaXNlIG1vZGVsIGNhbiBiZSBmb3VuZCBpbiB0aGUKICAgICAgKiBBZG9iZSBETkcgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIE5vaXNlUHJvZmlsZSB0YWcuPC9wPgorICAgICAqIDxwPkZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCB0aGVyZSBpcyBvbmx5IG9uZSBjb2xvciBjaGFubmVsLiBTbyB0aGUgbm9pc2UgbW9kZWwgY29lZmZpY2llbnRzCisgICAgICogd2lsbCBvbmx5IGNvbnRhaW4gb25lIFMgYW5kIG9uZSBPLjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlQKICAgICAgKi8KQEAgLTM4NDQsNiArMzk0MSw4IEBACiAgICAgICogPGxpPlIgJmd0OyAxLjIwIHdpbGwgcmVxdWlyZSBzdHJvbmcgc29mdHdhcmUgY29ycmVjdGlvbiB0byBwcm9kdWNlCiAgICAgICogYSB1c3VhYmxlIGltYWdlICgmZ3Q7MjAlIGRpdmVyZ2VuY2UpLjwvbGk+CiAgICAgICogPC91bD4KKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhpcyBrZXkgd2lsbCBub3QgYmUgcHJlc2VudCBmb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgZXZlbiBpZgorICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBSQVcgY2FwYWJpbGl0eS48L3A+CiAgICAgICovCiAgICAgQUNBTUVSQV9TRU5TT1JfR1JFRU5fU1BMSVQgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxvYXQKICAgICAgICAgICAgIEFDQU1FUkFfU0VOU09SX1NUQVJUICsgMjIsCkBAIC0zOTk2LDYgKzQwOTUsNyBAQAogICAgICAqIGxheW91dCBrZXkgKHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVCksIGkuZS4gdGhlCiAgICAgICogbnRoIHZhbHVlIGdpdmVuIGNvcnJlc3BvbmRzIHRvIHRoZSBibGFjayBsZXZlbCBvZmZzZXQgZm9yIHRoZSBudGgKICAgICAgKiBjb2xvciBjaGFubmVsIGxpc3RlZCBpbiB0aGUgQ0ZBLjwvcD4KKyAgICAgKiA8cD5Gb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgYWxsIG9mIHRoZSAyeDIgY2hhbm5lbHMgbXVzdCBoYXZlIHRoZSBzYW1lIHZhbHVlcy48L3A+CiAgICAgICogPHA+VGhpcyBrZXkgd2lsbCBiZSBhdmFpbGFibGUgaWYgQUNBTUVSQV9TRU5TT1JfT1BUSUNBTF9CTEFDS19SRUdJT05TIGlzIGF2YWlsYWJsZSBvciB0aGUKICAgICAgKiBjYW1lcmEgZGV2aWNlIGFkdmVydGlzZXMgdGhpcyBrZXkgdmlhIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1JFU1VMVF9LRVlTIH0uPC9wPgogICAgICAqCkBAIC00MDk4LDcgKzQxOTgsOCBAQAogICAgIC8qKgogICAgICAqIDxwPlRoZSBhcnJhbmdlbWVudCBvZiBjb2xvciBmaWx0ZXJzIG9uIHNlbnNvcjsKICAgICAgKiByZXByZXNlbnRzIHRoZSBjb2xvcnMgaW4gdGhlIHRvcC1sZWZ0IDJ4MiBzZWN0aW9uIG9mCi0gICAgICogdGhlIHNlbnNvciwgaW4gcmVhZGluZyBvcmRlci48L3A+CisgICAgICogdGhlIHNlbnNvciwgaW4gcmVhZGluZyBvcmRlciwgZm9yIGEgQmF5ZXIgY2FtZXJhLCBvciB0aGUKKyAgICAgKiBsaWdodCBzcGVjdHJ1bSBpdCBjYXB0dXJlcyBmb3IgTU9OT0NIUk9NRSBjYW1lcmEuPC9wPgogICAgICAqCiAgICAgICogPHA+VHlwZTogYnl0ZSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2Vuc29yX2luZm9fY29sb3JfZmlsdGVyX2FycmFuZ2VtZW50X3QpPC9wPgogICAgICAqCkBAIC00NTY3LDEzICs0NjY4LDEzIEBACiAgICAgICogKHgseSkgz7UgKDAgLi4uIE4tMSwgMCAuLi4gTS0xKSBpcyB0aGUgdmFsdWUgb2YgdGhlIHNoYWRpbmcgbWFwIGF0CiAgICAgICogcGl4ZWwgKCAoKFctMSkvKE4tMSkpICogeCwgKChILTEpLyhNLTEpKSAqIHkpIGZvciB0aGUgZm91ciBjb2xvciBjaGFubmVscy4KICAgICAgKiBUaGUgbWFwIGlzIGFzc3VtZWQgdG8gYmUgYmlsaW5lYXJseSBpbnRlcnBvbGF0ZWQgYmV0d2VlbiB0aGUgc2FtcGxlIHBvaW50cy48L3A+Ci0gICAgICogPHA+VGhlIGNoYW5uZWwgb3JkZXIgaXMgW1IsIEdldmVuLCBHb2RkLCBCXSwgd2hlcmUgR2V2ZW4gaXMgdGhlIGdyZWVuCi0gICAgICogY2hhbm5lbCBmb3IgdGhlIGV2ZW4gcm93cyBvZiBhIEJheWVyIHBhdHRlcm4sIGFuZCBHb2RkIGlzIHRoZSBvZGQgcm93cy4KKyAgICAgKiA8cD5Gb3IgYSBCYXllciBjYW1lcmEsIHRoZSBjaGFubmVsIG9yZGVyIGlzIFtSLCBHZXZlbiwgR29kZCwgQl0sIHdoZXJlIEdldmVuIGlzCisgICAgICogdGhlIGdyZWVuIGNoYW5uZWwgZm9yIHRoZSBldmVuIHJvd3Mgb2YgYSBCYXllciBwYXR0ZXJuLCBhbmQgR29kZCBpcyB0aGUgb2RkIHJvd3MuCiAgICAgICogVGhlIHNoYWRpbmcgbWFwIGlzIHN0b3JlZCBpbiBhIGZ1bGx5IGludGVybGVhdmVkIGZvcm1hdCwgYW5kIGl0cyBzaXplCiAgICAgICogaXMgcHJvdmlkZWQgaW4gdGhlIGNhbWVyYSBzdGF0aWMgbWV0YWRhdGEgYnkgQUNBTUVSQV9MRU5TX0lORk9fU0hBRElOR19NQVBfU0laRS48L3A+CiAgICAgICogPHA+VGhlIHNoYWRpbmcgbWFwIHdpbGwgZ2VuZXJhbGx5IGhhdmUgb24gdGhlIG9yZGVyIG9mIDMwLTQwIHJvd3MgYW5kIGNvbHVtbnMsCiAgICAgICogYW5kIHdpbGwgYmUgc21hbGxlciB0aGFuIDY0eDY0LjwvcD4KLSAgICAgKiA8cD5BcyBhbiBleGFtcGxlLCBnaXZlbiBhIHZlcnkgc21hbGwgbWFwIGRlZmluZWQgYXM6PC9wPgorICAgICAqIDxwPkFzIGFuIGV4YW1wbGUsIGdpdmVuIGEgdmVyeSBzbWFsbCBtYXAgZm9yIGEgQmF5ZXIgY2FtZXJhIGRlZmluZWQgYXM6PC9wPgogICAgICAqIDxwcmU+PGNvZGU+QUNBTUVSQV9MRU5TX0lORk9fU0hBRElOR19NQVBfU0laRSA9IFsgNCwgMyBdCiAgICAgICogQUNBTUVSQV9TVEFUSVNUSUNTX0xFTlNfU0hBRElOR19NQVAgPQogICAgICAqIFsgMS4zLCAxLjIsIDEuMTUsIDEuMiwgIDEuMiwgMS4yLCAxLjE1LCAxLjIsCkBAIC00NTkzLDYgKzQ2OTQsMTcgQEAKICAgICAgKiBpbWFnZSBvZiBhIGdyYXkgd2FsbCAodXNpbmcgYmljdWJpYyBpbnRlcnBvbGF0aW9uIGZvciB2aXN1YWwgcXVhbGl0eSkKICAgICAgKiBhcyBjYXB0dXJlZCBieSB0aGUgc2Vuc29yIGdpdmVzOjwvcD4KICAgICAgKiA8cD48aW1nIGFsdD0iSW1hZ2Ugb2YgYSB1bmlmb3JtIHdoaXRlIHdhbGwgKGludmVyc2Ugc2hhZGluZyBtYXApIiBzcmM9Ii4uL2ltYWdlcy9jYW1lcmEyL21ldGFkYXRhL2FuZHJvaWQuc3RhdGlzdGljcy5sZW5zU2hhZGluZ01hcC9pbnZfc2hhZGluZy5wbmciIC8+PC9wPgorICAgICAqIDxwPkZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBhbGwgb2YgdGhlIDJ4MiBjaGFubmVscyBtdXN0IGhhdmUgdGhlIHNhbWUgdmFsdWVzLiBBbiBleGFtcGxlCisgICAgICogc2hhZGluZyBtYXAgZm9yIHN1Y2ggYSBjYW1lcmEgaXMgZGVmaW5lZCBhczo8L3A+CisgICAgICogPHByZT48Y29kZT5BQ0FNRVJBX0xFTlNfSU5GT19TSEFESU5HX01BUF9TSVpFID0gWyA0LCAzIF0KKyAgICAgKiBBQ0FNRVJBX1NUQVRJU1RJQ1NfTEVOU19TSEFESU5HX01BUCA9CisgICAgICogWyAxLjMsIDEuMywgMS4zLCAxLjMsICAxLjIsIDEuMiwgMS4yLCAxLjIsCisgICAgICogICAgIDEuMSwgMS4xLCAxLjEsIDEuMSwgIDEuMywgMS4zLCAxLjMsIDEuMywKKyAgICAgKiAgIDEuMiwgMS4yLCAxLjIsIDEuMiwgIDEuMSwgMS4xLCAxLjEsIDEuMSwKKyAgICAgKiAgICAgMS4wLCAxLjAsIDEuMCwgMS4wLCAgMS4yLCAxLjIsIDEuMiwgMS4yLAorICAgICAqICAgMS4zLCAxLjMsIDEuMywgMS4zLCAgIDEuMiwgMS4yLCAxLjIsIDEuMiwKKyAgICAgKiAgICAgMS4yLCAxLjIsIDEuMiwgMS4yLCAgMS4zLCAxLjMsIDEuMywgMS4zIF0KKyAgICAgKiA8L2NvZGU+PC9wcmU+CiAgICAgICogPHA+Tm90ZSB0aGF0IHRoZSBSQVcgaW1hZ2UgZGF0YSBtaWdodCBiZSBzdWJqZWN0IHRvIGxlbnMgc2hhZGluZwogICAgICAqIGNvcnJlY3Rpb24gbm90IHJlcG9ydGVkIG9uIHRoaXMgbWFwLiBRdWVyeQogICAgICAqIEFDQU1FUkFfU0VOU09SX0lORk9fTEVOU19TSEFESU5HX0FQUExJRUQgdG8gc2VlIGlmIFJBVyBpbWFnZSBkYXRhIGhhcyBzdWJqZWN0CkBAIC00OTM2LDggKzUwNDgsOCBAQAogICAgICAqIG9mIHBvaW50cyBjYW4gYmUgbGVzcyB0aGFuIG1heCAodGhhdCBpcywgdGhlIHJlcXVlc3QgZG9lc24ndCBoYXZlIHRvCiAgICAgICogYWx3YXlzIHByb3ZpZGUgYSBjdXJ2ZSB3aXRoIG51bWJlciBvZiBwb2ludHMgZXF1aXZhbGVudCB0bwogICAgICAqIEFDQU1FUkFfVE9ORU1BUF9NQVhfQ1VSVkVfUE9JTlRTKS48L3A+Ci0gICAgICogPHA+Rm9yIGRldmljZXMgd2l0aCBNT05PQ0hST01FIGNhcGFiaWxpdHksIG9ubHkgcmVkIGNoYW5uZWwgaXMgdXNlZC4gR3JlZW4gYW5kIGJsdWUgY2hhbm5lbHMKLSAgICAgKiBhcmUgaWdub3JlZC48L3A+CisgICAgICogPHA+Rm9yIGRldmljZXMgd2l0aCBNT05PQ0hST01FIGNhcGFiaWxpdHksIGFsbCB0aHJlZSBjaGFubmVscyBtdXN0IGhhdmUgdGhlIHNhbWUgc2V0IG9mCisgICAgICogY29udHJvbCBwb2ludHMuPC9wPgogICAgICAqIDxwPkEgZmV3IGV4YW1wbGVzLCBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBncmFwaGljYWwgbWFwcGluZ3M7IHRoZXNlCiAgICAgICogb25seSBzcGVjaWZ5IHRoZSByZWQgY2hhbm5lbCBhbmQgdGhlIHByZWNpc2lvbiBpcyBsaW1pdGVkIHRvIDQKICAgICAgKiBkaWdpdHMsIGZvciBjb25jaXNlbmVzcy48L3A+CkBAIC01NDExLDkgKzU1MjMsNTQgQEAKICAgICAgKi8KICAgICBBQ0FNRVJBX0RFUFRIX0RFUFRIX0lTX0VYQ0xVU0lWRSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieXRlIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9kZXB0aF9kZXB0aF9pc19leGNsdXNpdmVfdCkKICAgICAgICAgICAgIEFDQU1FUkFfREVQVEhfU1RBUlQgKyA0LAorICAgIC8qKgorICAgICAqIDxwPlJlY29tbWVuZGVkIGRlcHRoIHN0cmVhbSBjb25maWd1cmF0aW9ucyBmb3IgY29tbW9uIGNsaWVudCB1c2UgY2FzZXMuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogaW50MzJbbio1XTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5PcHRpb25hbCBzdWJzZXQgb2YgdGhlIEFDQU1FUkFfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUyB0aGF0CisgICAgICogY29udGFpbnMgc2ltaWxhciB0dXBsZXMgbGlzdGVkIGFzCisgICAgICogKGkuZS4gd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBvdXRwdXQvaW5wdXQgc3RyZWFtLCB1c2VjYXNlIGJpdCBmaWVsZCkuCisgICAgICogQ2FtZXJhIGRldmljZXMgd2lsbCBiZSBhYmxlIHRvIHN1Z2dlc3QgcGFydGljdWxhciBkZXB0aCBzdHJlYW0gY29uZmlndXJhdGlvbnMgd2hpY2ggYXJlCisgICAgICogcG93ZXIgYW5kIHBlcmZvcm1hbmNlIGVmZmljaWVudCBmb3Igc3BlY2lmaWMgdXNlIGNhc2VzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dAorICAgICAqIHJldHJpZXZpbmcgdGhlIHN1Z2dlc3Rpb25zIHNlZQorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmh0bWwjZ2V0UmVjb21tZW5kZWRTdHJlYW1Db25maWd1cmF0aW9uTWFwIj5DYW1lcmFDaGFyYWN0ZXJpc3RpY3MjZ2V0UmVjb21tZW5kZWRTdHJlYW1Db25maWd1cmF0aW9uTWFwPC9hPi48L3A+CisgICAgICogPHA+Rm9yIGRhdGEgcmVwcmVzZW50YXRpb24gcGxlYXNlIHJlZmVyIHRvCisgICAgICogQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OUzwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TCisgICAgICogQHNlZSBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TCisgICAgICovCisgICAgQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfUkVDT01NRU5ERURfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50MzJbbio1XQorICAgICAgICAgICAgQUNBTUVSQV9ERVBUSF9TVEFSVCArIDUsCiAgICAgQUNBTUVSQV9ERVBUSF9FTkQsCiAKICAgICAvKioKKyAgICAgKiA8cD5TdHJpbmcgY29udGFpbmluZyB0aGUgaWRzIG9mIHRoZSB1bmRlcmx5aW5nIHBoeXNpY2FsIGNhbWVyYXMuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogYnl0ZVtuXTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5Gb3IgYSBsb2dpY2FsIGNhbWVyYSwgdGhpcyBpcyBjb25jYXRlbmF0aW9uIG9mIGFsbCB1bmRlcmx5aW5nIHBoeXNpY2FsIGNhbWVyYSBpZHMuCisgICAgICogVGhlIG51bGwgdGVybWluYXRvciBmb3IgcGh5c2ljYWwgY2FtZXJhIGlkIG11c3QgYmUgcHJlc2VydmVkIHNvIHRoYXQgdGhlIHdob2xlIHN0cmluZworICAgICAqIGNhbiBiZSB0b2tlbml6ZWQgdXNpbmcgJ1wwJyB0byBnZW5lcmF0ZSBsaXN0IG9mIHBoeXNpY2FsIGNhbWVyYSBpZHMuPC9wPgorICAgICAqIDxwPkZvciBleGFtcGxlLCBpZiB0aGUgcGh5c2ljYWwgY2FtZXJhIGlkcyBvZiB0aGUgbG9naWNhbCBjYW1lcmEgYXJlICIyIiBhbmQgIjMiLCB0aGUKKyAgICAgKiB2YWx1ZSBvZiB0aGlzIHRhZyB3aWxsIGJlIFsnMicsICdcMCcsICczJywgJ1wwJ10uPC9wPgorICAgICAqIDxwPlRoZSBudW1iZXIgb2YgcGh5c2ljYWwgY2FtZXJhIGlkcyBtdXN0IGJlIG5vIGxlc3MgdGhhbiAyLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX1BIWVNJQ0FMX0lEUyA9ICAgICAgICAgICAgICAgICAvLyBieXRlW25dCisgICAgICAgICAgICBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX1NUQVJULAorICAgIC8qKgogICAgICAqIDxwPlRoZSBhY2N1cmFjeSBvZiBmcmFtZSB0aW1lc3RhbXAgc3luY2hyb25pemF0aW9uIGJldHdlZW4gcGh5c2ljYWwgY2FtZXJhczwvcD4KICAgICAgKgogICAgICAqIDxwPlR5cGU6IGJ5dGUgKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2xvZ2ljYWxfbXVsdGlfY2FtZXJhX3NlbnNvcl9zeW5jX3R5cGVfdCk8L3A+CkBAIC01NDU3LDggKzU2MTQsOCBAQAogICAgICAqIHdpbGwgbm90IHNsb3cgZG93biBjYXB0dXJlIHJhdGUgd2hlbiBhcHBseWluZyBjb3JyZWN0aW9uLiBGQVNUIG1heSBiZSB0aGUgc2FtZSBhcyBPRkYgaWYKICAgICAgKiBhbnkgY29ycmVjdGlvbiBhdCBhbGwgd291bGQgc2xvdyBkb3duIGNhcHR1cmUgcmF0ZS4gIEV2ZXJ5IG91dHB1dCBzdHJlYW0gd2lsbCBoYXZlIGEKICAgICAgKiBzaW1pbGFyIGFtb3VudCBvZiBlbmhhbmNlbWVudCBhcHBsaWVkLjwvcD4KLSAgICAgKiA8cD5UaGUgY29ycmVjdGlvbiBvbmx5IGFwcGxpZXMgdG8gcHJvY2Vzc2VkIG91dHB1dHMgc3VjaCBhcyBZVVYsIEpQRUcsIG9yIERFUFRIMTY7IGl0IGlzIG5vdAotICAgICAqIGFwcGxpZWQgdG8gYW55IFJBVyBvdXRwdXQuPC9wPgorICAgICAqIDxwPlRoZSBjb3JyZWN0aW9uIG9ubHkgYXBwbGllcyB0byBwcm9jZXNzZWQgb3V0cHV0cyBzdWNoIGFzIFlVViwgWTgsIEpQRUcsIG9yIERFUFRIMTY7IGl0IGlzCisgICAgICogbm90IGFwcGxpZWQgdG8gYW55IFJBVyBvdXRwdXQuPC9wPgogICAgICAqIDxwPlRoaXMgY29udHJvbCB3aWxsIGJlIG9uIGJ5IGRlZmF1bHQgb24gZGV2aWNlcyB0aGF0IHN1cHBvcnQgdGhpcyBjb250cm9sLiBBcHBsaWNhdGlvbnMKICAgICAgKiBkaXNhYmxpbmcgZGlzdG9ydGlvbiBjb3JyZWN0aW9uIG5lZWQgdG8gcGF5IGV4dHJhIGF0dGVudGlvbiB3aXRoIHRoZSBjb29yZGluYXRlIHN5c3RlbSBvZgogICAgICAqIG1ldGVyaW5nIHJlZ2lvbnMsIGNyb3AgcmVnaW9uLCBhbmQgZmFjZSByZWN0YW5nbGVzLiBXaGVuIGRpc3RvcnRpb24gY29ycmVjdGlvbiBpcyBPRkYsCkBAIC03MTQzLDcgKzczMDAsNyBAQAogICAgICAqIGNhbWVyYSBkZXZpY2UgY2FuIGNhcHR1cmUgdGhpcyBzaXplIGZvciBhdCBsZWFzdCAxMCBmcmFtZXMgcGVyIHNlY29uZC4gIEFsc28gdGhlCiAgICAgICogQUNBTUVSQV9DT05UUk9MX0FFX0FWQUlMQUJMRV9UQVJHRVRfRlBTX1JBTkdFUyBlbnRyeSBsaXN0cyBhdCBsZWFzdCBvbmUgRlBTIHJhbmdlIHdoZXJlCiAgICAgICogdGhlIG1pbmltdW0gRlBTIGlzICZndDs9IDEgLyBtaW5pbXVtRnJhbWVEdXJhdGlvbiBmb3IgdGhlIGxhcmdlc3QgWVVWXzQyMF84ODggc2l6ZS48L3A+Ci0gICAgICogPHA+SWYgdGhlIGRldmljZSBzdXBwb3J0cyB0aGUge0BsaW5rIEFJTUFHRV9GT1JNQVRfUkFXMTAgfSwge0BsaW5rIEFJTUFHRV9GT1JNQVRfUkFXMTIgfSwgdGhlbiB0aG9zZSBjYW4gYWxzbyBiZQorICAgICAqIDxwPklmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgdGhlIHtAbGluayBBSU1BR0VfRk9STUFUX1JBVzEwIH0sIHtAbGluayBBSU1BR0VfRk9STUFUX1JBVzEyIH0sIHtAbGluayBBSU1BR0VfRk9STUFUX1k4IH0sIHRoZW4gdGhvc2UgY2FuIGFsc28gYmUKICAgICAgKiBjYXB0dXJlZCBhdCB0aGUgc2FtZSByYXRlIGFzIHRoZSBtYXhpbXVtLXNpemUgWVVWXzQyMF84ODggcmVzb2x1dGlvbiBpcy48L3A+CiAgICAgICogPHA+SW4gYWRkaXRpb24sIHRoZSBBQ0FNRVJBX1NZTkNfTUFYX0xBVEVOQ1kgZmllbGQgaXMgZ3VhcmFudGVkIHRvIGhhdmUgYSB2YWx1ZSBiZXR3ZWVuIDAKICAgICAgKiBhbmQgNCwgaW5jbHVzaXZlLiBBQ0FNRVJBX0NPTlRST0xfQUVfTE9DS19BVkFJTEFCTEUgYW5kIEFDQU1FUkFfQ09OVFJPTF9BV0JfTE9DS19BVkFJTEFCTEUKQEAgLTcxNzcsOCArNzMzNCw4IEBACiAgICAgICogPGxpPlRoZSBBQ0FNRVJBX0RFUFRIX0RFUFRIX0lTX0VYQ0xVU0lWRSBlbnRyeSBpcyBsaXN0ZWQgYnkgdGhpcyBkZXZpY2UuPC9saT4KICAgICAgKiA8bGk+QXMgb2YgQW5kcm9pZCBQLCB0aGUgQUNBTUVSQV9MRU5TX1BPU0VfUkVGRVJFTkNFIGVudHJ5IGlzIGxpc3RlZCBieSB0aGlzIGRldmljZS48L2xpPgogICAgICAqIDxsaT5BIExJTUlURUQgY2FtZXJhIHdpdGggb25seSB0aGUgREVQVEhfT1VUUFVUIGNhcGFiaWxpdHkgZG9lcyBub3QgaGF2ZSB0byBzdXBwb3J0Ci0gICAgICogICBub3JtYWwgWVVWXzQyMF84ODgsIEpQRUcsIGFuZCBQUklWLWZvcm1hdCBvdXRwdXRzLiBJdCBvbmx5IGhhcyB0byBzdXBwb3J0IHRoZSBERVBUSDE2Ci0gICAgICogICBmb3JtYXQuPC9saT4KKyAgICAgKiAgIG5vcm1hbCBZVVZfNDIwXzg4OCwgWTgsIEpQRUcsIGFuZCBQUklWLWZvcm1hdCBvdXRwdXRzLiBJdCBvbmx5IGhhcyB0byBzdXBwb3J0IHRoZQorICAgICAqICAgREVQVEgxNiBmb3JtYXQuPC9saT4KICAgICAgKiA8L3VsPgogICAgICAqIDxwPkdlbmVyYWxseSwgZGVwdGggb3V0cHV0IG9wZXJhdGVzIGF0IGEgc2xvd2VyIGZyYW1lIHJhdGUgdGhhbiBzdGFuZGFyZCBjb2xvciBjYXB0dXJlLAogICAgICAqIHNvIHRoZSBERVBUSDE2IGFuZCBERVBUSF9QT0lOVF9DTE9VRCBmb3JtYXRzIHdpbGwgY29tbW9ubHkgaGF2ZSBhIHN0YWxsIGR1cmF0aW9uIHRoYXQKQEAgLTcyMDksOCArNzM2NiwxNCBAQAogICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX01PVElPTl9UUkFDS0lORyAgICAgICAgICAgPSAxMCwKIAogICAgIC8qKgotICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGlzIGEgbG9naWNhbCBjYW1lcmEgYmFja2VkIGJ5IHR3byBvciBtb3JlIHBoeXNpY2FsIGNhbWVyYXMgdGhhdCBhcmUKLSAgICAgKiBhbHNvIGV4cG9zZWQgdG8gdGhlIGFwcGxpY2F0aW9uLjwvcD4KKyAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBpcyBhIGxvZ2ljYWwgY2FtZXJhIGJhY2tlZCBieSB0d28gb3IgbW9yZSBwaHlzaWNhbCBjYW1lcmFzLiBJbgorICAgICAqIEFQSSBsZXZlbCAyOCwgdGhlIHBoeXNpY2FsIGNhbWVyYXMgbXVzdCBhbHNvIGJlIGV4cG9zZWQgdG8gdGhlIGFwcGxpY2F0aW9uIHZpYQorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWFuYWdlci5odG1sI2dldENhbWVyYUlkTGlzdCI+Q2FtZXJhTWFuYWdlciNnZXRDYW1lcmFJZExpc3Q8L2E+LiBTdGFydGluZyBmcm9tIEFQSQorICAgICAqIGxldmVsIDI5LCBzb21lIG9yIGFsbCBwaHlzaWNhbCBjYW1lcmFzIG1heSBub3QgYmUgaW5kZXBlbmRlbnRseSBleHBvc2VkIHRvIHRoZQorICAgICAqIGFwcGxpY2F0aW9uLCBpbiB3aGljaCBjYXNlIHRoZSBwaHlzaWNhbCBjYW1lcmEgSURzIHdpbGwgbm90IGJlIGF2YWlsYWJsZSBpbgorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWFuYWdlci5odG1sI2dldENhbWVyYUlkTGlzdCI+Q2FtZXJhTWFuYWdlciNnZXRDYW1lcmFJZExpc3Q8L2E+LiBCdXQgdGhlIGFwcGxpY2F0aW9uCisgICAgICogY2FuIHN0aWxsIHF1ZXJ5IHRoZSBwaHlzaWNhbCBjYW1lcmFzJyBjaGFyYWN0ZXJpc3RpY3MgYnkgY2FsbGluZworICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWFuYWdlci5odG1sI2dldENhbWVyYUNoYXJhY3RlcmlzdGljcyI+Q2FtZXJhTWFuYWdlciNnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2E+LjwvcD4KICAgICAgKiA8cD5DYW1lcmEgYXBwbGljYXRpb24gc2hvdWxkbid0IGFzc3VtZSB0aGF0IHRoZXJlIGFyZSBhdCBtb3N0IDEgcmVhciBjYW1lcmEgYW5kIDEgZnJvbnQKICAgICAgKiBjYW1lcmEgaW4gdGhlIHN5c3RlbS4gRm9yIGFuIGFwcGxpY2F0aW9uIHRoYXQgc3dpdGNoZXMgYmV0d2VlbiBmcm9udCBhbmQgYmFjayBjYW1lcmFzLAogICAgICAqIHRoZSByZWNvbW1lbmRhdGlvbiBpcyB0byBzd2l0Y2ggYmV0d2VlbiB0aGUgZmlyc3QgcmVhciBjYW1lcmEgYW5kIHRoZSBmaXJzdCBmcm9udApAQCAtNzI2NSw3ICs3NDI4LDE1IEBACiAKICAgICAvKioKICAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBpcyBhIG1vbm9jaHJvbWUgY2FtZXJhIHRoYXQgZG9lc24ndCBjb250YWluIGEgY29sb3IgZmlsdGVyIGFycmF5LAotICAgICAqIGFuZCB0aGUgcGl4ZWwgdmFsdWVzIG9uIFUgYW5kIFYgcGxhbmVzIGFyZSBhbGwgMTI4LjwvcD4KKyAgICAgKiBhbmQgZm9yIFlVVl80MjBfODg4IHN0cmVhbSwgdGhlIHBpeGVsIHZhbHVlcyBvbiBVIGFuZCBWIHBsYW5lcyBhcmUgYWxsIDEyOC48L3A+CisgICAgICogPHA+QSBNT05PQ0hST01FIGNhbWVyYSBtdXN0IHN1cHBvcnQgdGhlIGd1YXJhbnRlZWQgc3RyZWFtIGNvbWJpbmF0aW9ucyByZXF1aXJlZCBmb3IKKyAgICAgKiBpdHMgZGV2aWNlIGxldmVsIGFuZCBjYXBhYmlsaXRpZXMuIEFkZGl0aW9uYWxseSwgaWYgdGhlIG1vbm9jaHJvbWUgY2FtZXJhIGRldmljZQorICAgICAqIHN1cHBvcnRzIFk4IGZvcm1hdCwgYWxsIG1hbmRhdG9yeSBzdHJlYW0gY29tYmluYXRpb24gcmVxdWlyZW1lbnRzIHJlbGF0ZWQgdG8ge0BsaW5rIEFJTUFHRV9GT1JNQVRfWVVWXzQyMF84ODggWVVWXzQyMF84ODh9IGFwcGx5CisgICAgICogdG8ge0BsaW5rIEFJTUFHRV9GT1JNQVRfWTggWTh9IGFzIHdlbGwuIFRoZXJlIGFyZSBubworICAgICAqIG1hbmRhdG9yeSBzdHJlYW0gY29tYmluYXRpb24gcmVxdWlyZW1lbnRzIHdpdGggcmVnYXJkIHRvCisgICAgICoge0BsaW5rIEFJTUFHRV9GT1JNQVRfWTggWTh9IGZvciBCYXllciBjYW1lcmEgZGV2aWNlcy48L3A+CisgICAgICogPHA+U3RhcnRpbmcgZnJvbSBBbmRyb2lkIFEsIHRoZSBTRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlQgb2YgYSBNT05PQ0hST01FCisgICAgICogY2FtZXJhIHdpbGwgYmUgZWl0aGVyIE1PTk8gb3IgTklSLjwvcD4KICAgICAgKi8KICAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19NT05PQ0hST01FICAgICAgICAgICAgICAgID0gMTIsCiAKQEAgLTcyOTQsNiArNzQ2NSw2NyBAQAogCiB9IGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3NjYWxlcl9jcm9wcGluZ190eXBlX3Q7CiAKKy8vIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlMKK3R5cGVkZWYgZW51bSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYWNhbWVyYV9zY2FsZXJfYXZhaWxhYmxlX3JlY29tbWVuZGVkX3N0cmVhbV9jb25maWd1cmF0aW9ucyB7CisgICAgLyoqCisgICAgICogPHA+UHJldmlldyBtdXN0IG9ubHkgaW5jbHVkZSBub24tc3RhbGxpbmcgcHJvY2Vzc2VkIHN0cmVhbSBjb25maWd1cmF0aW9ucyB3aXRoCisgICAgICogb3V0cHV0IGZvcm1hdHMgbGlrZSBZVVZfNDIwXzg4OCwgSU1QTEVNRU5UQVRJT05fREVGSU5FRCwgZXRjLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1BSRVZJRVcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MCwKKworICAgIC8qKgorICAgICAqIDxwPlZpZGVvIHJlY29yZCBtdXN0IGluY2x1ZGUgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIHRoYXQgbWF0Y2ggdGhlIGFkdmVydGlzZWQKKyAgICAgKiBzdXBwb3J0ZWQgbWVkaWEgcHJvZmlsZXMgPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvbWVkaWEvQ2FtY29yZGVyUHJvZmlsZS5odG1sIj5DYW1jb3JkZXJQcm9maWxlPC9hPiB3aXRoCisgICAgICogSU1QTEVNRU5UQVRJT05fREVGSU5FRCBmb3JtYXQuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfUkVDT1JECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEsCisKKyAgICAvKioKKyAgICAgKiA8cD5WaWRlbyBzbmFwc2hvdCBtdXN0IGluY2x1ZGUgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIGF0IGxlYXN0IGFzIGJpZyBhcworICAgICAqIHRoZSBtYXhpbXVtIFJFQ09SRCByZXNvbHV0aW9ucyBhbmQgb25seSB3aXRoIGZvcm1hdCBCTE9CICsgREFUQVNQQUNFX0pGSUYKKyAgICAgKiBmb3JtYXQvZGF0YXNwYWNlIGNvbWJpbmF0aW9uIChKUEVHKS4gQWRkaXRpb25hbGx5IHRoZSBjb25maWd1cmF0aW9ucyBzaG91bGRuJ3QgY2F1c2UKKyAgICAgKiBwcmV2aWV3IGdsaXRjaGVzIGFuZCBhbHNvIGJlIGFibGUgdG8gcnVuIGF0IDMwIGZwcy48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19WSURFT19TTkFQU0hPVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyLAorCisgICAgLyoqCisgICAgICogPHA+UmVjb21tZW5kZWQgc25hcHNob3Qgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIG11c3QgaW5jbHVkZSBhdCBsZWFzdCBvbmUgd2l0aAorICAgICAqIHNpemUgY2xvc2UgdG8gQUNBTUVSQV9TRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRSB3aXRoIEJMT0IgKyBEQVRBU1BBQ0VfSkZJRgorICAgICAqIGZvcm1hdC9kYXRhc3BhY2UgY29tYmluYXRpb24gKEpQRUcpLiBUYWtpbmcgaW50byBhY2NvdW50IHJlc3RyaWN0aW9ucyBvbiBhc3BlY3QKKyAgICAgKiByYXRpbywgYWxpZ25tZW50IGV0Yy4gdGhlIGFyZWEgb2YgdGhlIG1heGltdW0gc3VnZ2VzdGVkIHNpemUgc2hvdWxkbuKAmXQgYmUgbGVzcyB0aGFuCisgICAgICogOTclIG9mIHRoZSBzZW5zb3IgYXJyYXkgc2l6ZSBhcmVhLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRQorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfU05BUFNIT1QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MywKKworICAgIC8qKgorICAgICAqIDxwPklmIHN1cHBvcnRlZCwgcmVjb21tZW5kZWQgaW5wdXQgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIG11c3Qgb25seSBiZSBhZHZlcnRpc2VkIHdpdGgKKyAgICAgKiBaU0wgYWxvbmcgd2l0aCBvdGhlciBwcm9jZXNzZWQgYW5kL29yIHN0YWxsaW5nIG91dHB1dCBmb3JtYXRzLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1pTTCAgID0gMHg0LAorCisgICAgLyoqCisgICAgICogPHA+SWYgc3VwcG9ydGVkLCByZWNvbW1lbmRlZCByYXcgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIG11c3Qgb25seSBpbmNsdWRlIFJBVyBiYXNlZAorICAgICAqIG91dHB1dCBmb3JtYXRzLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1JBVyAgID0gMHg1LAorCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19QVUJMSUNfRU5ECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDYsCisKKyAgICAvKioKKyAgICAgKiA8cD5WZW5kb3IgZGVmaW5lZCB1c2UgY2FzZXMuIFRoZXNlIGRlcGVuZCBvbiB0aGUgdmVuZG9yIGltcGxlbWVudGF0aW9uLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1ZFTkRPUl9TVEFSVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOCwKKworfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zY2FsZXJfYXZhaWxhYmxlX3JlY29tbWVuZGVkX3N0cmVhbV9jb25maWd1cmF0aW9uc190OworCiAKIC8vIEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMQogdHlwZWRlZiBlbnVtIGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hY2FtZXJhX3NlbnNvcl9yZWZlcmVuY2VfaWxsdW1pbmFudDEgewpAQCAtNzQ3MCw2ICs3NzAyLDIxIEBACiAgICAgICovCiAgICAgQUNBTUVSQV9TRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlRfUkdCICAgICAgICAgICAgICAgICA9IDQsCiAKKyAgICAvKioKKyAgICAgKiA8cD5TZW5zb3IgZG9lc24ndCBoYXZlIGFueSBCYXllciBjb2xvciBmaWx0ZXIuCisgICAgICogU3VjaCBzZW5zb3IgY2FwdHVyZXMgdmlzaWJsZSBsaWdodCBpbiBtb25vY2hyb21lLiBUaGUgZXhhY3Qgd2VpZ2h0aW5nIGFuZAorICAgICAqIHdhdmVsZW5ndGhzIGNhcHR1cmVkIGlzIG5vdCBzcGVjaWZpZWQsIGJ1dCBnZW5lcmFsbHkgb25seSBpbmNsdWRlcyB0aGUgdmlzaWJsZQorICAgICAqIGZyZXF1ZW5jaWVzLiBUaGlzIHZhbHVlIGltcGxpZXMgYSBNT05PQ0hST01FIGNhbWVyYS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlRfTU9OTyAgICAgICAgICAgICAgICA9IDUsCisKKyAgICAvKioKKyAgICAgKiA8cD5TZW5zb3IgaGFzIGEgbmVhciBpbmZyYXJlZCBmaWx0ZXIgY2FwdHVyaW5nIGxpZ2h0IHdpdGggd2F2ZWxlbmd0aCBiZXR3ZWVuCisgICAgICogcm91Z2hseSA3NTBubSBhbmQgMTQwMG5tLCBhbmQgdGhlIHNhbWUgZmlsdGVyIGNvdmVycyB0aGUgd2hvbGUgc2Vuc29yIGFycmF5LiBUaGlzCisgICAgICogdmFsdWUgaW1wbGllcyBhIE1PTk9DSFJPTUUgY2FtZXJhLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVF9OSVIgICAgICAgICAgICAgICAgID0gNiwKKwogfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zZW5zb3JfaW5mb19jb2xvcl9maWx0ZXJfYXJyYW5nZW1lbnRfdDsKIAogLy8gQUNBTUVSQV9TRU5TT1JfSU5GT19USU1FU1RBTVBfU09VUkNFCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYVdpbmRvd1R5cGUuaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhV2luZG93VHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZjY3ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYVdpbmRvd1R5cGUuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTkRLX0NBTUVSQV9XSU5ET1dfVFlQRV9ICisjZGVmaW5lIF9OREtfQ0FNRVJBX1dJTkRPV19UWVBFX0gKKworLyoqCisgKiBAYWRkdG9ncm91cCBDYW1lcmEKKyAqIEB7CisgKi8KKworLyoqCisgKiBAZmlsZSBOZGtDYW1lcmFXaW5kb3dUeXBlLmgKKyAqLworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgYW4gTkRLIEFQSS4KKyAqIERvIG5vdCByZW1vdmUgbWV0aG9kcy4KKyAqIERvIG5vdCBjaGFuZ2UgbWV0aG9kIHNpZ25hdHVyZXMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBjb25zdGFudHMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSBzaXplIG9mIGFueSBvZiB0aGUgY2xhc3NlcyBkZWZpbmVkIGluIGhlcmUuCisgKiBEbyBub3QgcmVmZXJlbmNlIHR5cGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBOREsuCisgKiBEbyBub3QgI2luY2x1ZGUgZmlsZXMgdGhhdCBhcmVuJ3QgcGFydCBvZiB0aGUgTkRLLgorICovCisKKy8qKgorICogVGhpcyBmaWxlIGRlZmluZXMgdGhlIHdpbmRvdyB0eXBlIHVzZWQgYnkgTkRLIGFuZCB0aGUgVk5ESyB2YXJpYW50cyBvZiB0aGUKKyAqIGNhbWVyYTIgTkRLLiBUaGlzIGVuYWJsZXMgdXMgdG8gc2hhcmUgdGhlIGFwaSBkZWZpbml0aW9uIGhlYWRlcnMgYW5kIGF2b2lkCisgKiBjb2RlIGR1cGxpY2F0aW9uIChzaW5jZSB0aGUgVk5ESyB2YXJpYW50IGRvZXNuJ3QgdXNlIEFOYXRpdmVXaW5kb3cgdW5saWtlIHRoZQorICogTkRLIHZhcmlhbnQpLgorICovCisjaWZkZWYgX19BTkRST0lEX1ZOREtfXworI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+Cit0eXBlZGVmIG5hdGl2ZV9oYW5kbGVfdCBBQ2FtZXJhV2luZG93VHlwZTsKKyNlbHNlCisjaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfd2luZG93Lmg+Cit0eXBlZGVmIEFOYXRpdmVXaW5kb3cgQUNhbWVyYVdpbmRvd1R5cGU7CisjZW5kaWYKKworI2VuZGlmIC8vX05ES19DQU1FUkFfV0lORE9XX1RZUEVfSApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYXB0dXJlUmVxdWVzdC5oIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYXB0dXJlUmVxdWVzdC5oCmluZGV4IDUzNDBlNzYuLjEzNjk4OWEgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FwdHVyZVJlcXVlc3QuaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhcHR1cmVSZXF1ZXN0LmgKQEAgLTM1LDkgKzM1LDkgQEAKIAogI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgogCi0jaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfd2luZG93Lmg+CiAjaW5jbHVkZSAiTmRrQ2FtZXJhRXJyb3IuaCIKICNpbmNsdWRlICJOZGtDYW1lcmFNZXRhZGF0YS5oIgorI2luY2x1ZGUgIk5ka0NhbWVyYVdpbmRvd1R5cGUuaCIKIAogI2lmbmRlZiBfTkRLX0NBUFRVUkVfUkVRVUVTVF9ICiAjZGVmaW5lIF9OREtfQ0FQVFVSRV9SRVFVRVNUX0gKQEAgLTEwMSw3ICsxMDEsNyBAQAogICoKICAqIEBzZWUgQUNhcHR1cmVSZXF1ZXN0X2FkZFRhcmdldAogICovCi1jYW1lcmFfc3RhdHVzX3QgQUNhbWVyYU91dHB1dFRhcmdldF9jcmVhdGUoQU5hdGl2ZVdpbmRvdyogd2luZG93LAorY2FtZXJhX3N0YXR1c190IEFDYW1lcmFPdXRwdXRUYXJnZXRfY3JlYXRlKEFDYW1lcmFXaW5kb3dUeXBlKiB3aW5kb3csCiAgICAgICAgIEFDYW1lcmFPdXRwdXRUYXJnZXQqKiBvdXRwdXQpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9saWJjYW1lcmEybmRrLm1hcC50eHQgYi9jYW1lcmEvbmRrL2xpYmNhbWVyYTJuZGsubWFwLnR4dAppbmRleCBhMjllOTZkLi41YTAwMDIyIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2xpYmNhbWVyYTJuZGsubWFwLnR4dAorKysgYi9jYW1lcmEvbmRrL2xpYmNhbWVyYTJuZGsubWFwLnR4dApAQCAtMiw5ICsyLDExIEBACiAgIGdsb2JhbDoKICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fYWJvcnRDYXB0dXJlczsKICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZTsKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlOyAjIGludHJvZHVjZWQ9MjkKICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2xvc2U7CiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2dldERldmljZTsKICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc2V0UmVwZWF0aW5nUmVxdWVzdDsKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9zZXRSZXBlYXRpbmdSZXF1ZXN0OyAjIGludHJvZHVjZWQ9MjkKICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RvcFJlcGVhdGluZzsKICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fdXBkYXRlU2hhcmVkT3V0cHV0OyAjIGludHJvZHVjZWQ9MjgKICAgICBBQ2FtZXJhRGV2aWNlX2Nsb3NlOwpAQCAtMjQsNiArMjYsNyBAQAogICAgIEFDYW1lcmFNZXRhZGF0YV9mcmVlOwogICAgIEFDYW1lcmFNZXRhZGF0YV9nZXRBbGxUYWdzOwogICAgIEFDYW1lcmFNZXRhZGF0YV9nZXRDb25zdEVudHJ5OworICAgIEFDYW1lcmFNZXRhZGF0YV9pc0xvZ2ljYWxNdWx0aUNhbWVyYTsgIyBpbnRyb2R1Y2VkPTI5CiAgICAgQUNhbWVyYU91dHB1dFRhcmdldF9jcmVhdGU7CiAgICAgQUNhbWVyYU91dHB1dFRhcmdldF9mcmVlOwogICAgIEFDYXB0dXJlUmVxdWVzdF9hZGRUYXJnZXQ7CkBAIC00OCw2ICs1MSw3IEBACiAgICAgQUNhcHR1cmVTZXNzaW9uU2hhcmVkT3V0cHV0X2NyZWF0ZTsgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQUNhcHR1cmVTZXNzaW9uU2hhcmVkT3V0cHV0X2FkZDsgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQUNhcHR1cmVTZXNzaW9uU2hhcmVkT3V0cHV0X3JlbW92ZTsgIyBpbnRyb2R1Y2VkPTI4CisgICAgQUNhcHR1cmVTZXNzaW9uUGh5c2ljYWxPdXRwdXRfY3JlYXRlOyAjIGludHJvZHVjZWQ9MjkKICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfZnJlZTsKICAgbG9jYWw6CiAgICAgKjsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvblZlbmRvci5oIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uVmVuZG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFhZjhjMQotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvblZlbmRvci5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgInV0aWxzLmgiCisKK3N0cnVjdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQgeworICAgIGV4cGxpY2l0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dChuYXRpdmVfaGFuZGxlX3QqIHdpbmRvdywgYm9vbCBpc1NoYXJlZCA9IGZhbHNlLAorICAgICAgICAgICAgY29uc3QgY2hhciogcGh5c2ljYWxDYW1lcmFJZCA9ICIiKSA6CisgICAgICAgICAgICBtV2luZG93KHdpbmRvdyksIG1Jc1NoYXJlZChpc1NoYXJlZCksIG1QaHlzaWNhbENhbWVyYUlkKHBoeXNpY2FsQ2FtZXJhSWQpIHt9OworCisgICAgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0JiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gKG1XaW5kb3cgPT0gb3RoZXIubVdpbmRvdyk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0JiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gbVdpbmRvdyAhPSBvdGhlci5tV2luZG93OworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgPCAoY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0JiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gbVdpbmRvdyA8IG90aGVyLm1XaW5kb3c7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciA+IChjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQmIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtV2luZG93ID4gb3RoZXIubVdpbmRvdzsKKyAgICB9CisKKyAgICBhbmRyb2lkOjphY2FtOjp1dGlsczo6bmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlciBtV2luZG93OworICAgIHN0ZDo6c2V0PGFuZHJvaWQ6OmFjYW06OnV0aWxzOjpuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyPiBtU2hhcmVkV2luZG93czsKKyAgICBib29sICAgICAgICAgICBtSXNTaGFyZWQ7CisgICAgaW50ICAgICAgICAgICAgbVJvdGF0aW9uID0gQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMDsKKyAgICBzdGQ6OnN0cmluZyBtUGh5c2ljYWxDYW1lcmFJZDsKK307CisKKwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5jcHAgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzg2M2E1Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5jcHAKQEAgLTAsMCArMSwxNTk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBQ2FtZXJhRGV2aWNlVmVuZG9yIgorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjAvSUNhbWVyYVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8Q2FtZXJhTWV0YWRhdGEuaD4KKworI2luY2x1ZGUgIm5ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmgiCisjaW5jbHVkZSAiQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmgiCisjaW5jbHVkZSAiQUNhbWVyYU1ldGFkYXRhLmgiCisjaW5jbHVkZSAiQUNhcHR1cmVSZXF1ZXN0LmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKworI2luY2x1ZGUgIkFDYW1lcmFDYXB0dXJlU2Vzc2lvbi5pbmMiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CisKK3VzaW5nIEhDYW1lcmFNZXRhZGF0YSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FtZXJhTWV0YWRhdGE7Cit1c2luZyBPdXRwdXRDb25maWd1cmF0aW9uID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpPdXRwdXRDb25maWd1cmF0aW9uOwordXNpbmcgaGFyZHdhcmU6OlZvaWQ7CisKKy8vIFN0YXRpYyBtZW1iZXIgZGVmaW5pdGlvbnMKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0NvbnRleHRLZXkgICAgICAgID0gIkNvbnRleHQiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprRGV2aWNlS2V5ICAgICAgICAgPSAiRGV2aWNlIjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0Vycm9yQ29kZUtleSAgICAgID0gIkVycm9yQ29kZSI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtDYWxsYmFja0ZwS2V5ICAgICA9ICJDYWxsYmFjayI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtTZXNzaW9uU3BLZXkgICAgICA9ICJTZXNzaW9uU3AiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprQ2FwdHVyZVJlcXVlc3RLZXkgPSAiQ2FwdHVyZVJlcXVlc3QiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprVGltZVN0YW1wS2V5ICAgICAgPSAiVGltZVN0YW1wIjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0NhcHR1cmVSZXN1bHRLZXkgID0gIkNhcHR1cmVSZXN1bHQiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprUGh5c2ljYWxDYXB0dXJlUmVzdWx0S2V5ID0gIlBoeXNpY2FsQ2FwdHVyZVJlc3VsdCI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtDYXB0dXJlRmFpbHVyZUtleSA9ICJDYXB0dXJlRmFpbHVyZSI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtTZXF1ZW5jZUlkS2V5ICAgICA9ICJTZXF1ZW5jZUlkIjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0ZyYW1lTnVtYmVyS2V5ICAgID0gIkZyYW1lTnVtYmVyIjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0Fud0tleSAgICAgICAgICAgID0gIkFudyI7CisKKy8qKgorICogQ2FtZXJhRGV2aWNlIEltcGxlbWVudGF0aW9uCisgKi8KK0NhbWVyYURldmljZTo6Q2FtZXJhRGV2aWNlKAorICAgICAgICBjb25zdCBjaGFyKiBpZCwKKyAgICAgICAgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyogY2IsCisgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMsCisgICAgICAgIEFDYW1lcmFEZXZpY2UqIHdyYXBwZXIpIDoKKyAgICAgICAgbUNhbWVyYUlkKGlkKSwKKyAgICAgICAgbUFwcENhbGxiYWNrcygqY2IpLAorICAgICAgICBtQ2hhcnMoc3RkOjptb3ZlKGNoYXJzKSksCisgICAgICAgIG1TZXJ2aWNlQ2FsbGJhY2sobmV3IFNlcnZpY2VDYWxsYmFjayh0aGlzKSksCisgICAgICAgIG1XcmFwcGVyKHdyYXBwZXIpLAorICAgICAgICBtSW5FcnJvcihmYWxzZSksCisgICAgICAgIG1FcnJvcihBQ0FNRVJBX09LKSwKKyAgICAgICAgbUlkbGUodHJ1ZSksCisgICAgICAgIG1DdXJyZW50U2Vzc2lvbihudWxscHRyKSB7CisgICAgbUNsb3NpbmcgPSBmYWxzZTsKKyAgICAvLyBTZXR1cCBsb29wZXIgdGhyZWFkIHRvIHBlcmZyb20gZGV2aWNlIGNhbGxiYWNrcyB0byBhcHAKKyAgICBtQ2JMb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBtQ2JMb29wZXItPnNldE5hbWUoIkMyTi1kZXYtbG9vcGVyIik7CisgICAgc3RhdHVzX3QgZXJyID0gbUNiTG9vcGVyLT5zdGFydCgKKyAgICAgICAgICAgIC8qcnVuT25DYWxsaW5nVGhyZWFkKi9mYWxzZSwKKyAgICAgICAgICAgIC8qY2FuQ2FsbEphdmEqLyAgICAgICB0cnVlLAorICAgICAgICAgICAgUFJJT1JJVFlfREVGQVVMVCk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBzdGFydCBjYW1lcmEgZGV2aWNlIGNhbGxiYWNrIGxvb3BlcjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtZXJyKSwgZXJyKTsKKyAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFKTsKKyAgICB9CisgICAgbUhhbmRsZXIgPSBuZXcgQ2FsbGJhY2tIYW5kbGVyKCk7CisgICAgbUNiTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXIpOworCisgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhID0gbUNoYXJzLT5nZXRJbnRlcm5hbERhdGEoKTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgZW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfUkVRVUVTVF9QQVJUSUFMX1JFU1VMVF9DT1VOVCk7CisgICAgaWYgKGVudHJ5LmNvdW50ICE9IDEpIHsKKyAgICAgICAgQUxPR1coIiVzOiBiYWQgY291bnQgJXp1IGZvciBwYXJ0aWFsIHJlc3VsdCBjb3VudCIsIF9fRlVOQ1RJT05fXywgZW50cnkuY291bnQpOworICAgICAgICBtUGFydGlhbFJlc3VsdENvdW50ID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBtUGFydGlhbFJlc3VsdENvdW50ID0gZW50cnkuZGF0YS5pMzJbMF07CisgICAgfQorCisgICAgZW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfTEVOU19JTkZPX1NIQURJTkdfTUFQX1NJWkUpOworICAgIGlmIChlbnRyeS5jb3VudCAhPSAyKSB7CisgICAgICAgIEFMT0dXKCIlczogYmFkIGNvdW50ICV6dSBmb3Igc2hhZGluZyBtYXAgc2l6ZSIsIF9fRlVOQ1RJT05fXywgZW50cnkuY291bnQpOworICAgICAgICBtU2hhZGluZ01hcFNpemVbMF0gPSAwOworICAgICAgICBtU2hhZGluZ01hcFNpemVbMV0gPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIG1TaGFkaW5nTWFwU2l6ZVswXSA9IGVudHJ5LmRhdGEuaTMyWzBdOworICAgICAgICBtU2hhZGluZ01hcFNpemVbMV0gPSBlbnRyeS5kYXRhLmkzMlsxXTsKKyAgICB9Cit9CisKKy8vIERldmljZSBjbG9zZSBpbXBsZW1lbnRhaXRvbgorQ2FtZXJhRGV2aWNlOjp+Q2FtZXJhRGV2aWNlKCkgeworICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiA9IG1DdXJyZW50U2Vzc2lvbi5wcm9tb3RlKCk7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURldmljZUxvY2spOworICAgICAgICBpZiAoIWlzQ2xvc2VkKCkpIHsKKyAgICAgICAgICAgIGRpc2Nvbm5lY3RMb2NrZWQoc2Vzc2lvbik7CisgICAgICAgIH0KKyAgICAgICAgbUN1cnJlbnRTZXNzaW9uID0gbnVsbHB0cjsKKyAgICAgICAgaWYgKG1DYkxvb3BlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtQ2JMb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyLT5pZCgpKTsKKyAgICAgICAgICAgIG1DYkxvb3Blci0+c3RvcCgpOworICAgICAgICB9CisgICAgfQorICAgIG1DYkxvb3Blci5jbGVhcigpOworICAgIG1IYW5kbGVyLmNsZWFyKCk7Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6cG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKHNwPEFNZXNzYWdlPiYgbXNnKSB7CisgICAgbXNnLT5wb3N0KCk7CisgICAgbXNnLmNsZWFyKCk7CisgICAgc3A8QU1lc3NhZ2U+IGNsZWFudXBNc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDbGVhblVwU2Vzc2lvbnMsIG1IYW5kbGVyKTsKKyAgICBjbGVhbnVwTXNnLT5wb3N0KCk7Cit9CisKKy8vIFRPRE86IGNhY2hlZCBjcmVhdGVkIHJlcXVlc3Q/CitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6Y3JlYXRlQ2FwdHVyZVJlcXVlc3QoCisgICAgICAgIEFDYW1lcmFEZXZpY2VfcmVxdWVzdF90ZW1wbGF0ZSB0ZW1wbGF0ZUlkLAorICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0KSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZXZpY2VMb2NrKTsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGlmIChtUmVtb3RlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRDsKKyAgICB9CisgICAgQ2FtZXJhTWV0YWRhdGEgcmF3UmVxdWVzdDsKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpOT19FUlJPUjsKKyAgICBhdXRvIHJlbW90ZVJldCA9IG1SZW1vdGUtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KAorICAgICAgICB1dGlsczo6Y29udmVydFRvSGlkbCh0ZW1wbGF0ZUlkKSwKKyAgICAgICAgWyZzdGF0dXMsICZyYXdSZXF1ZXN0XShhdXRvIHMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+ICZtZXRhZGF0YSkgeworICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpOT19FUlJPUiAmJiB1dGlsczo6Y29udmVydEZyb21IaWRsQ2xvbmVkKG1ldGFkYXRhLCAmcmF3UmVxdWVzdCkpIHsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDb3VsZG4ndCBjcmVhdGUgZGVmYXVsdCByZXF1ZXN0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgaWYgKCFyZW1vdGVSZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3Igd2hpbGUgdHJ5aW5nIHRvIGNyZWF0ZSBkZWZhdWx0IHJlcXVlc3QgJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgIHJlbW90ZVJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9VTktOT1dOOworICAgIH0KKyAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGwoc3RhdHVzKTsKKyAgICB9CisgICAgQUNhcHR1cmVSZXF1ZXN0KiBvdXRSZXEgPSBuZXcgQUNhcHR1cmVSZXF1ZXN0KCk7CisgICAgb3V0UmVxLT5zZXR0aW5ncyA9IG5ldyBBQ2FtZXJhTWV0YWRhdGEocmF3UmVxdWVzdC5yZWxlYXNlKCksIEFDYW1lcmFNZXRhZGF0YTo6QUNNX1JFUVVFU1QpOworICAgIG91dFJlcS0+dGFyZ2V0cyAgPSBuZXcgQUNhbWVyYU91dHB1dFRhcmdldHMoKTsKKyAgICAqcmVxdWVzdCA9IG91dFJlcTsKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworY2FtZXJhX3N0YXR1c190CitDYW1lcmFEZXZpY2U6OmNyZWF0ZUNhcHR1cmVTZXNzaW9uKAorICAgICAgICBjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqICAgICAgIG91dHB1dHMsCisgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMsCisgICAgICAgIGNvbnN0IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2tzLAorICAgICAgICAvKm91dCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiogc2Vzc2lvbikgeworICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gY3VycmVudFNlc3Npb24gPSBtQ3VycmVudFNlc3Npb24ucHJvbW90ZSgpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGV2aWNlTG9jayk7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChjdXJyZW50U2Vzc2lvbiAhPSBudWxscHRyKSB7CisgICAgICAgIGN1cnJlbnRTZXNzaW9uLT5jbG9zZUJ5RGV2aWNlKCk7CisgICAgICAgIHN0b3BSZXBlYXRpbmdMb2NrZWQoKTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgbmV3IHNlc3Npb24KKyAgICByZXQgPSBjb25maWd1cmVTdHJlYW1zTG9ja2VkKG91dHB1dHMsIHNlc3Npb25QYXJhbWV0ZXJzKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWwgdG8gY3JlYXRlIG5ldyBzZXNzaW9uLiBjYW5ub3QgY29uZmlndXJlIHN0cmVhbXMiKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIG5ld1Nlc3Npb24gPSBuZXcgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKAorICAgICAgICAgICAgbU5leHRTZXNzaW9uSWQrKywgb3V0cHV0cywgY2FsbGJhY2tzLCB0aGlzKTsKKworICAgIC8vIHNldCBuZXcgc2Vzc2lvbiBhcyBjdXJyZW50IHNlc3Npb24KKyAgICBuZXdTZXNzaW9uLT5pbmNTdHJvbmcoKHZvaWQgKikgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbik7CisgICAgbUN1cnJlbnRTZXNzaW9uID0gbmV3U2Vzc2lvbjsKKyAgICBtRmx1c2hpbmcgPSBmYWxzZTsKKyAgICAqc2Vzc2lvbiA9IG5ld1Nlc3Npb247CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK3ZvaWQgQ2FtZXJhRGV2aWNlOjphZGRSZXF1ZXN0U2V0dGluZ3NNZXRhZGF0YShBQ2FwdHVyZVJlcXVlc3QgKmFDYXB0dXJlUmVxdWVzdCwKKyAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+ICZyZXEpIHsKKyAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YUNvcHkgPSBhQ2FwdHVyZVJlcXVlc3QtPnNldHRpbmdzLT5nZXRJbnRlcm5hbERhdGEoKTsKKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqY2FtZXJhX21ldGFkYXRhID0gbWV0YWRhdGFDb3B5LmdldEFuZExvY2soKTsKKyAgICBIQ2FtZXJhTWV0YWRhdGEgaENhbWVyYU1ldGFkYXRhOworICAgIHV0aWxzOjpjb252ZXJ0VG9IaWRsKGNhbWVyYV9tZXRhZGF0YSwgJmhDYW1lcmFNZXRhZGF0YSk7CisgICAgbWV0YWRhdGFDb3B5LnVubG9jayhjYW1lcmFfbWV0YWRhdGEpOworICAgIHJlcS0+bVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MucmVzaXplKDEpOworICAgIHJlcS0+bVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NbMF0uc2V0dGluZ3MubWV0YWRhdGEoc3RkOjptb3ZlKGhDYW1lcmFNZXRhZGF0YSkpOworfQorCitjYW1lcmFfc3RhdHVzX3QgQ2FtZXJhRGV2aWNlOjp1cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uTG9ja2VkKEFDYXB0dXJlU2Vzc2lvbk91dHB1dCAqb3V0cHV0KSB7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChvdXRwdXQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBpZiAoIW91dHB1dC0+bUlzU2hhcmVkKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBvdXRwdXQgY29uZmlndXJhdGlvbiBpcyBub3Qgc2hhcmVkIik7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGludDMyX3Qgc3RyZWFtSWQgPSAtMTsKKyAgICBmb3IgKGF1dG8mIGt2UGFpciA6IG1Db25maWd1cmVkT3V0cHV0cykgeworICAgICAgICBpZiAodXRpbHM6OmlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwoa3ZQYWlyLnNlY29uZC5maXJzdCwgb3V0cHV0LT5tV2luZG93KSkgeworICAgICAgICAgICAgc3RyZWFtSWQgPSBrdlBhaXIuZmlyc3Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3RyZWFtSWQgPCAwKSB7CisgICAgICAgIEFMT0dFKCJFcnJvcjogSW52YWxpZCBvdXRwdXQgY29uZmlndXJhdGlvbiIpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlciBvdXRDb25maWdXOworICAgIE91dHB1dENvbmZpZ3VyYXRpb24gJm91dENvbmZpZyA9IG91dENvbmZpZ1cubU91dHB1dENvbmZpZ3VyYXRpb247CisgICAgb3V0Q29uZmlnLnJvdGF0aW9uID0gdXRpbHM6OmNvbnZlcnRUb0hpZGwob3V0cHV0LT5tUm90YXRpb24pOworICAgIG91dENvbmZpZy53aW5kb3dHcm91cElkID0gLTE7IC8vIG5kayBkb2Vzbid0IHN1cHBvcnQgaW50ZXIgT3V0cHV0Q29uZmlndXJhdGlvbiBidWZmZXIgc2hhcmluZy4KKyAgICBvdXRDb25maWcud2luZG93SGFuZGxlcy5yZXNpemUob3V0cHV0LT5tU2hhcmVkV2luZG93cy5zaXplKCkgKyAxKTsKKyAgICBvdXRDb25maWcud2luZG93SGFuZGxlc1swXSA9IG91dHB1dC0+bVdpbmRvdzsKKyAgICBvdXRDb25maWcucGh5c2ljYWxDYW1lcmFJZCA9IG91dHB1dC0+bVBoeXNpY2FsQ2FtZXJhSWQ7CisgICAgaW50IGkgPSAxOworICAgIGZvciAoYXV0byYgYW53IDogb3V0cHV0LT5tU2hhcmVkV2luZG93cykgeworICAgICAgICBvdXRDb25maWcud2luZG93SGFuZGxlc1tpKytdID0gYW53OworICAgIH0KKworICAgIGF1dG8gcmVtb3RlUmV0ID0gbVJlbW90ZS0+dXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbihzdHJlYW1JZCwgb3V0Q29uZmlnKTsKKyAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBpbiB1cGRhdGluZyBPdXRwdXRDb25maWd1cmF0aW9uOiAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgcmVtb3RlUmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1VOS05PV047CisgICAgfQorCisgICAgc3dpdGNoIChyZW1vdGVSZXQpIHsKKyAgICAgICAgICAgIGNhc2UgU3RhdHVzOjpOT19FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU3RhdHVzOjpJTlZBTElEX09QRVJBVElPTjoKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhIGRldmljZSAlcyBpbnZhbGlkIG9wZXJhdGlvbiIsIGdldElkKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgY2FzZSBTdGF0dXM6OkFMUkVBRFlfRVhJU1RTOgorICAgICAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIG91dHB1dCBzdXJmYWNlIGFscmVhZHkgZXhpc3RzIiwgZ2V0SWQoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgICAgICBjYXNlIFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhIGRldmljZSAlcyBpbnZhbGlkIGlucHV0IGFyZ3VtZW50IiwgZ2V0SWQoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIGZhaWxlZCB0byBhZGQgc2hhcmVkIG91dHB1dCIsIGdldElkKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1VOS05PV047CisgICAgfQorCisgICAgbUNvbmZpZ3VyZWRPdXRwdXRzW3N0cmVhbUlkXSA9IHN0ZDo6bWFrZV9wYWlyKG91dHB1dC0+bVdpbmRvdywgb3V0Q29uZmlnVyk7CisKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworY2FtZXJhX3N0YXR1c190CitDYW1lcmFEZXZpY2U6OmFsbG9jYXRlQ2FwdHVyZVJlcXVlc3QoCisgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgLypvdXQqL3NwPENhcHR1cmVSZXF1ZXN0PiAmb3V0UmVxKSB7CisgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcShuZXcgQ2FwdHVyZVJlcXVlc3QoKSk7CisgICAgcmVxLT5tQ2FwdHVyZVJlcXVlc3QucGh5c2ljYWxDYW1lcmFTZXR0aW5ncy5yZXNpemUoMSk7CisgICAgcmVxLT5tQ2FwdHVyZVJlcXVlc3QucGh5c2ljYWxDYW1lcmFTZXR0aW5nc1swXS5pZCA9IG1DYW1lcmFJZDsKKyAgICAvLyBUT0RPOiBEbyB3ZSByZWFsbHkgbmVlZCB0byBjb3B5IHRoZSBtZXRhZGF0YSBoZXJlID8KKyAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YUNvcHkgPSByZXF1ZXN0LT5zZXR0aW5ncy0+Z2V0SW50ZXJuYWxEYXRhKCk7CisgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKmNhbWVyYU1ldGFkYXRhID0gbWV0YWRhdGFDb3B5LmdldEFuZExvY2soKTsKKyAgICBIQ2FtZXJhTWV0YWRhdGEgaENhbWVyYU1ldGFkYXRhOworICAgIHV0aWxzOjpjb252ZXJ0VG9IaWRsKGNhbWVyYU1ldGFkYXRhLCAmaENhbWVyYU1ldGFkYXRhKTsKKyAgICBtZXRhZGF0YUNvcHkudW5sb2NrKGNhbWVyYU1ldGFkYXRhKTsKKyAgICBpZiAocmVxdWVzdC0+c2V0dGluZ3MgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAoaENhbWVyYU1ldGFkYXRhLmRhdGEoKSAhPSBudWxscHRyICYmCisgICAgICAgICAgICBtQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlICE9IG51bGxwdHIgJiYKKyAgICAgICAgICAgIG1DYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUtPndyaXRlKAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPihoQ2FtZXJhTWV0YWRhdGEuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICBoQ2FtZXJhTWV0YWRhdGEuc2l6ZSgpKSkgeworICAgICAgICAgICAgLy8gVGhlIG1ldGFkYXRhIGZpZWxkIG9mIHRoZSB1bmlvbiB3b3VsZCd2ZSBiZWVuIGRlc3RydWN0dWVkLCBzbyBubyBuZWVkCisgICAgICAgICAgICAvLyB0byByZS1zaXplIGl0LgorICAgICAgICAgICAgcmVxLT5tQ2FwdHVyZVJlcXVlc3QucGh5c2ljYWxDYW1lcmFTZXR0aW5nc1swXS5zZXR0aW5ncy5mbXFNZXRhZGF0YVNpemUoCisgICAgICAgICAgICAgICAgaENhbWVyYU1ldGFkYXRhLnNpemUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiRm1xIHdyaXRlIGNhcHR1cmUgcmVzdWx0IGZhaWxlZCwgZmFsbGluZyBiYWNrIHRvIGh3YmluZGVyIik7CisgICAgICAgICAgICByZXEtPm1DYXB0dXJlUmVxdWVzdC5waHlzaWNhbENhbWVyYVNldHRpbmdzWzBdLnNldHRpbmdzLm1ldGFkYXRhKAorICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShoQ2FtZXJhTWV0YWRhdGEpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHJlcXVlc3RTdHJlYW1JZHhMaXN0OworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHJlcXVlc3RTdXJmYWNlSWR4TGlzdDsKKyAgICBmb3IgKGF1dG8gb3V0cHV0VGFyZ2V0IDogcmVxdWVzdC0+dGFyZ2V0cy0+bU91dHB1dHMpIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBhbncgPSBvdXRwdXRUYXJnZXQubVdpbmRvdzsKKyAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICByZXEtPm1TdXJmYWNlTGlzdC5wdXNoX2JhY2soYW53KTsKKyAgICAgICAgLy8gbG9va3VwIHN0cmVhbS9zdXJmYWNlIElECisgICAgICAgIGZvciAoY29uc3QgYXV0byYga3ZQYWlyIDogbUNvbmZpZ3VyZWRPdXRwdXRzKSB7CisgICAgICAgICAgICBpbnQgc3RyZWFtSWQgPSBrdlBhaXIuZmlyc3Q7CisgICAgICAgICAgICBjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlciYgb3V0Q29uZmlnID0ga3ZQYWlyLnNlY29uZC5zZWNvbmQ7CisgICAgICAgICAgICBjb25zdCBhdXRvJiB3aW5kb3dIYW5kbGVzID0gb3V0Q29uZmlnLm1PdXRwdXRDb25maWd1cmF0aW9uLndpbmRvd0hhbmRsZXM7CisgICAgICAgICAgICBmb3IgKGludCBzdXJmYWNlSWQgPSAwOyBzdXJmYWNlSWQgPCAoaW50KSB3aW5kb3dIYW5kbGVzLnNpemUoKTsgc3VyZmFjZUlkKyspIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB0d28gbmF0aXZlIGhhbmRsZXMgYXJlIGVxdWl2YWxlbnQsIHNvIGFyZSB0aGVpciBzdXJmYWNlcy4KKyAgICAgICAgICAgICAgICBpZiAodXRpbHM6OmlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwod2luZG93SGFuZGxlc1tzdXJmYWNlSWRdLmdldE5hdGl2ZUhhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW53KSkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RTdHJlYW1JZHhMaXN0LnB1c2hfYmFjayhzdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RTdXJmYWNlSWR4TGlzdC5wdXNoX2JhY2soc3VyZmFjZUlkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZvdW5kKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgQUxPR0UoIlVuY29uZmlndXJlZCBvdXRwdXQgdGFyZ2V0ICVwIGluIGNhcHR1cmUgcmVxdWVzdCEiLCBhbncpOworICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmVxLT5tQ2FwdHVyZVJlcXVlc3Quc3RyZWFtQW5kV2luZG93SWRzLnJlc2l6ZShyZXF1ZXN0U3RyZWFtSWR4TGlzdC5zaXplKCkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVxdWVzdFN0cmVhbUlkeExpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgcmVxLT5tQ2FwdHVyZVJlcXVlc3Quc3RyZWFtQW5kV2luZG93SWRzW2ldLnN0cmVhbUlkID0gcmVxdWVzdFN0cmVhbUlkeExpc3RbaV07CisgICAgICAgIHJlcS0+bUNhcHR1cmVSZXF1ZXN0LnN0cmVhbUFuZFdpbmRvd0lkc1tpXS53aW5kb3dJZCA9IHJlcXVlc3RTdXJmYWNlSWR4TGlzdFtpXTsKKyAgICB9CisgICAgb3V0UmVxID0gcmVxOworICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCitBQ2FwdHVyZVJlcXVlc3QqCitDYW1lcmFEZXZpY2U6OmFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHNwPENhcHR1cmVSZXF1ZXN0PiYgcmVxKSB7CisgICAgQUNhcHR1cmVSZXF1ZXN0KiBwUmVxdWVzdCA9IG5ldyBBQ2FwdHVyZVJlcXVlc3QoKTsKKyAgICBDYW1lcmFNZXRhZGF0YSBjbG9uZTsKKyAgICB1dGlsczo6Y29udmVydEZyb21IaWRsQ2xvbmVkKHJlcS0+bVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NbMF0uc2V0dGluZ3MubWV0YWRhdGEoKSwgJmNsb25lKTsKKyAgICBwUmVxdWVzdC0+c2V0dGluZ3MgPSBuZXcgQUNhbWVyYU1ldGFkYXRhKGNsb25lLnJlbGVhc2UoKSwgQUNhbWVyYU1ldGFkYXRhOjpBQ01fUkVRVUVTVCk7CisgICAgcFJlcXVlc3QtPnRhcmdldHMgID0gbmV3IEFDYW1lcmFPdXRwdXRUYXJnZXRzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXEtPm1TdXJmYWNlTGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGFudyA9IHJlcS0+bVN1cmZhY2VMaXN0W2ldOworICAgICAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0IG91dHB1dFRhcmdldChhbncpOworICAgICAgICBwUmVxdWVzdC0+dGFyZ2V0cy0+bU91dHB1dHMuaW5zZXJ0KG91dHB1dFRhcmdldCk7CisgICAgfQorICAgIHJldHVybiBwUmVxdWVzdDsKK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpmcmVlQUNhcHR1cmVSZXF1ZXN0KEFDYXB0dXJlUmVxdWVzdCogcmVxKSB7CisgICAgaWYgKHJlcSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcmVxLT5zZXR0aW5ncy5jbGVhcigpOworICAgIGRlbGV0ZSByZXEtPnRhcmdldHM7CisgICAgZGVsZXRlIHJlcTsKK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpub3RpZnlTZXNzaW9uRW5kT2ZMaWZlTG9ja2VkKEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbikgeworICAgIGlmIChpc0Nsb3NlZCgpKSB7CisgICAgICAgIC8vIERldmljZSBpcyBjbG9zaW5nIGFscmVhZHkuIGRvIG5vdGhpbmcKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtQ3VycmVudFNlc3Npb24gIT0gc2Vzc2lvbikgeworICAgICAgICAvLyBTZXNzaW9uIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IG90aGVyIHNlZXNpb24gb3IgZGV2aWNlIGlzIGNsb3NlZAorICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1DdXJyZW50U2Vzc2lvbiA9IG51bGxwdHI7CisKKyAgICAvLyBTaG91bGQgbm90IGhhcHBlbgorICAgIGlmICghc2Vzc2lvbi0+bUlzQ2xvc2VkKSB7CisgICAgICAgIEFMT0dFKCJFcnJvcjogdW5jbG9zZWQgc2Vzc2lvbiAlcCByZWFjaGVzIGVuZCBvZiBsaWZlISIsIHNlc3Npb24pOworICAgICAgICBzZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0UpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gTm8gbmV3IHNlc3Npb24sIHVuY29uZmlndXJlIG5vdworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjb25maWd1cmVTdHJlYW1zTG9ja2VkKG51bGxwdHIsIG51bGxwdHIpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiVW5jb25maWd1cmUgc3RyZWFtIGZhaWxlZC4gRGV2aWNlIG1pZ2h0IHN0aWxsIGJlIGNvbmZpZ3VyZWQhIHJldCAlZCIsIHJldCk7CisgICAgfQorfQorCit2b2lkCitDYW1lcmFEZXZpY2U6OmRpc2Nvbm5lY3RMb2NrZWQoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiYgc2Vzc2lvbikgeworICAgIGlmIChtQ2xvc2luZy5leGNoYW5nZSh0cnVlKSkgeworICAgICAgICAvLyBBbHJlYWR5IGNsb3NpbmcsIGp1c3QgcmV0dXJuCisgICAgICAgIEFMT0dXKCJDYW1lcmEgZGV2aWNlICVzIGlzIGFscmVhZHkgY2xvc2luZy4iLCBnZXRJZCgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtUmVtb3RlICE9IG51bGxwdHIpIHsKKyAgICAgICAgYXV0byByZXQgPSBtUmVtb3RlLT5kaXNjb25uZWN0KCk7CisgICAgICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciB3aGlsZSBkaXNjb25uZWN0aW5nIGRldmljZSAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorICAgIG1SZW1vdGUgPSBudWxscHRyOworCisgICAgaWYgKHNlc3Npb24gIT0gbnVsbHB0cikgeworICAgICAgICBzZXNzaW9uLT5jbG9zZUJ5RGV2aWNlKCk7CisgICAgfQorfQorCitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6c3RvcFJlcGVhdGluZ0xvY2tlZCgpIHsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCJDYW1lcmEgJXMgc3RvcCByZXBlYXRpbmcgZmFpbGVkISByZXQgJWQiLCBnZXRJZCgpLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAobVJlcGVhdGluZ1NlcXVlbmNlSWQgIT0gUkVRVUVTVF9JRF9OT05FKSB7CisgICAgICAgIGludCByZXBlYXRpbmdTZXF1ZW5jZUlkID0gbVJlcGVhdGluZ1NlcXVlbmNlSWQ7CisgICAgICAgIG1SZXBlYXRpbmdTZXF1ZW5jZUlkID0gUkVRVUVTVF9JRF9OT05FOworCisgICAgICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyOworICAgICAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpOT19FUlJPUjsKKyAgICAgICAgYXV0byByZW1vdGVSZXQgPSBtUmVtb3RlLT5jYW5jZWxSZXBlYXRpbmdSZXF1ZXN0KAorICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmbGFzdEZyYW1lTnVtYmVyXShTdGF0dXMgcywgYXV0byBmcmFtZU51bWJlcikgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgICAgICBsYXN0RnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCFyZW1vdGVSZXQuaXNPaygpIHx8IHN0YXR1cyAhPSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjYW5jZWwgYWN0aXZlIHJlcGVhdGluZyByZXF1ZXN0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiB1dGlsczo6Y29udmVydEZyb21IaWRsKHN0YXR1cyk7CisgICAgICAgIH0KKyAgICAgICAgY2hlY2tSZXBlYXRpbmdTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKHJlcGVhdGluZ1NlcXVlbmNlSWQsIGxhc3RGcmFtZU51bWJlcik7CisgICAgfQorICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6Zmx1c2hMb2NrZWQoQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uKSB7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIGFib3J0IGNhcHR1cmVzIGZhaWxlZCEgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gYmVjYXVzZSBjcmVhdGluZyBhIG5ldyBzZXNzaW9uIHdpbGwgY2xvc2UKKyAgICAvLyBwcmV2aW91cyBvbmUgYW5kIHRodXMgcmVqZWN0IGFueSBBUEkgY2FsbCBmcm9tIHByZXZpb3VzIHNlc3Npb24uCisgICAgLy8gQnV0IHN0aWxsIGdvb2QgdG8gY2hlY2sgaGVyZSBpbiBjYXNlIHNvbWV0aGluZyB1bmV4cGVjdGVkIGhhcHBlbi4KKyAgICBpZiAobUN1cnJlbnRTZXNzaW9uICE9IHNlc3Npb24pIHsKKyAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBzZXNzaW9uICVwIGlzIG5vdCBjdXJyZW50IGFjdGl2ZSBzZXNzaW9uISIsIGdldElkKCksIHNlc3Npb24pOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAobUZsdXNoaW5nKSB7CisgICAgICAgIEFMT0dXKCJDYW1lcmEgJXMgaXMgYWxyZWFkeSBhYm9ydGluZyBjYXB0dXJlcyIsIGdldElkKCkpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9PSzsKKyAgICB9CisKKyAgICBtRmx1c2hpbmcgPSB0cnVlOworCisgICAgLy8gU2VuZCBvbkFjdGl2ZSBjYWxsYmFjayB0byBndWFyYW50ZWUgdGhlcmUgaXMgYWx3YXlzIGFjdGl2ZS0+cmVhZHkgdHJhbnNpdGlvbgorICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXNzaW9uU3RhdGVDYiwgbUhhbmRsZXIpOworICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgc2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2suY29udGV4dCk7CisgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7CisgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLm9uQWN0aXZlKTsKKyAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKworICAgIC8vIElmIGRldmljZSBpcyBhbHJlYWR5IGlkbGluZywgc2VuZCBjYWxsYmFjayBhbmQgZXhpdCBlYXJseQorICAgIGlmIChtSWRsZSkgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2Vzc2lvblN0YXRlQ2IsIG1IYW5kbGVyKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBzZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5jb250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBzZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5vblJlYWR5KTsKKyAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisgICAgICAgIG1GbHVzaGluZyA9IGZhbHNlOworICAgICAgICByZXR1cm4gQUNBTUVSQV9PSzsKKyAgICB9CisKKyAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlcjsKKyAgICBTdGF0dXMgc3RhdHVzOworICAgIGF1dG8gcmVtb3RlUmV0ID0gbVJlbW90ZS0+Zmx1c2goWyZzdGF0dXMsICZsYXN0RnJhbWVOdW1iZXJdKGF1dG8gcywgYXV0byBmcmFtZU51bWJlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBYm9ydCBjYXB0dXJlcyBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gdXRpbHM6OmNvbnZlcnRGcm9tSGlkbChzdGF0dXMpOworICAgIH0KKyAgICBpZiAobVJlcGVhdGluZ1NlcXVlbmNlSWQgIT0gUkVRVUVTVF9JRF9OT05FKSB7CisgICAgICAgIGNoZWNrUmVwZWF0aW5nU2VxdWVuY2VDb21wbGV0ZUxvY2tlZChtUmVwZWF0aW5nU2VxdWVuY2VJZCwgbGFzdEZyYW1lTnVtYmVyKTsKKyAgICB9CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjp3YWl0VW50aWxJZGxlTG9ja2VkKCkgeworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIldhaXQgdW50aWwgY2FtZXJhICVzIGlkbGUgZmFpbGVkISByZXQgJWQiLCBnZXRJZCgpLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChtUmVwZWF0aW5nU2VxdWVuY2VJZCAhPSBSRVFVRVNUX0lEX05PTkUpIHsKKyAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgd29uJ3QgZ28gdG8gaWRsZSB3aGVuIHRoZXJlIGlzIHJlcGVhdGluZyByZXF1ZXN0ISIsIGdldElkKCkpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBhdXRvIHJlbW90ZVJldCA9IG1SZW1vdGUtPndhaXRVbnRpbElkbGUoKTsKKyAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiB3YWl0VW50aWxJZGxlIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiB1dGlsczo6Y29udmVydEZyb21IaWRsKHJlbW90ZVJldCk7CisgICAgfQorICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6Y29uZmlndXJlU3RyZWFtc0xvY2tlZChjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqIG91dHB1dHMsCisgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMpIHsKKyAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIgZW1wdHlPdXRwdXQ7CisgICAgaWYgKG91dHB1dHMgPT0gbnVsbHB0cikgeworICAgICAgICBvdXRwdXRzID0gJmVtcHR5T3V0cHV0OworICAgIH0KKworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBzdGQ6OnNldDxzdGQ6OnBhaXI8bmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlciwgT3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXI+PiBvdXRwdXRTZXQ7CisgICAgZm9yIChhdXRvIG91dENvbmZpZyA6IG91dHB1dHMtPm1PdXRwdXRzKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogYW53ID0gb3V0Q29uZmlnLm1XaW5kb3c7CisgICAgICAgIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyIG91dENvbmZpZ0luc2VydFc7CisgICAgICAgIE91dHB1dENvbmZpZ3VyYXRpb24gJm91dENvbmZpZ0luc2VydCA9IG91dENvbmZpZ0luc2VydFcubU91dHB1dENvbmZpZ3VyYXRpb247CisgICAgICAgIG91dENvbmZpZ0luc2VydC5yb3RhdGlvbiA9IHV0aWxzOjpjb252ZXJ0VG9IaWRsKG91dENvbmZpZy5tUm90YXRpb24pOworICAgICAgICBvdXRDb25maWdJbnNlcnQud2luZG93R3JvdXBJZCA9IC0xOworICAgICAgICBvdXRDb25maWdJbnNlcnQud2luZG93SGFuZGxlcy5yZXNpemUob3V0Q29uZmlnLm1TaGFyZWRXaW5kb3dzLnNpemUoKSArIDEpOworICAgICAgICBvdXRDb25maWdJbnNlcnQud2luZG93SGFuZGxlc1swXSA9IGFudzsKKyAgICAgICAgb3V0Q29uZmlnSW5zZXJ0LnBoeXNpY2FsQ2FtZXJhSWQgPSBvdXRDb25maWcubVBoeXNpY2FsQ2FtZXJhSWQ7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIgd3JhcChhbncpOworICAgICAgICBvdXRwdXRTZXQuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGFudywgb3V0Q29uZmlnSW5zZXJ0VykpOworICAgIH0KKyAgICBzdGQ6OnNldDxzdGQ6OnBhaXI8bmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlciwgT3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXI+PiBhZGRTZXQgPSBvdXRwdXRTZXQ7CisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gZGVsZXRlTGlzdDsKKworICAgIC8vIERldGVybWluZSB3aGljaCBzdHJlYW1zIG5lZWQgdG8gYmUgY3JlYXRlZCwgd2hpY2ggdG8gYmUgZGVsZXRlZAorICAgIGZvciAoYXV0byYga3ZQYWlyIDogbUNvbmZpZ3VyZWRPdXRwdXRzKSB7CisgICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSBrdlBhaXIuZmlyc3Q7CisgICAgICAgIGF1dG8mIG91dHB1dFBhaXIgPSBrdlBhaXIuc2Vjb25kOworICAgICAgICBpZiAob3V0cHV0U2V0LmNvdW50KG91dHB1dFBhaXIpKSB7CisgICAgICAgICAgICBkZWxldGVMaXN0LnB1c2hfYmFjayhzdHJlYW1JZCk7IC8vIE5lZWQgdG8gZGVsZXRlIGEgbm8gbG9uZ2VyIG5lZWRlZCBzdHJlYW0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFkZFNldC5lcmFzZShvdXRwdXRQYWlyKTsgICAgICAgIC8vIE5vIG5lZWQgdG8gYWRkIGFscmVhZHkgZXhpc3Rpbmcgc3RyZWFtCisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXQgPSBzdG9wUmVwZWF0aW5nTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIHN0b3AgcmVwZWF0aW5nIGZhaWxlZCwgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXQgPSB3YWl0VW50aWxJZGxlTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIHdhaXQgdW50aWwgaWRsZSBmYWlsZWQsIHJldCAlZCIsIGdldElkKCksIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLy8gU2VuZCBvblJlYWR5IHRvIHByZXZpb3VzIHNlc3Npb24KKyAgICAvLyBDdXJyZW50U2Vzc2lvbiB3aWxsIGJlIHVwZGF0ZWQgYWZ0ZXIgY29uZmlndXJlU3RyZWFtTG9ja2VkLCBzbyBoZXJlCisgICAgLy8gbUN1cnJlbnRTZXNzaW9uIGlzIHRoZSBzZXNzaW9uIHRvIGJlIHJlcGxhY2VkIGJ5IGEgbmV3IHNlc3Npb24KKyAgICBpZiAoIW1JZGxlICYmIG1DdXJyZW50U2Vzc2lvbiAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChtQnVzeVNlc3Npb24gIT0gbUN1cnJlbnRTZXNzaW9uKSB7CisgICAgICAgICAgICBBTE9HRSgiQ3VycmVudCBzZXNzaW9uICE9IGJ1c3kgc2Vzc2lvbiIpOworICAgICAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFKTsKKyAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0U7CisgICAgICAgIH0KKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlc3Npb25TdGF0ZUNiLCBtSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgbUJ1c3lTZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5jb250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgbUJ1c3lTZXNzaW9uKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIG1CdXN5U2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2sub25SZWFkeSk7CisgICAgICAgIG1CdXN5U2Vzc2lvbi5jbGVhcigpOworICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICB9CisgICAgbUlkbGUgPSB0cnVlOworCisgICAgYXV0byByZW1vdGVSZXQgPSBtUmVtb3RlLT5iZWdpbkNvbmZpZ3VyZSgpOworICAgIGlmICghcmVtb3RlUmV0LmlzT2soKXx8IHJlbW90ZVJldCAhPSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIGJlZ2luIGNvbmZpZ3VyZSBmYWlsZWQiLCBnZXRJZCgpKTsKKyAgICAgICAgcmV0dXJuIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGwocmVtb3RlUmV0KTsKKyAgICB9CisKKyAgICAvLyBkZWxldGUgdG8tYmUtZGVsZXRlZCBzdHJlYW1zCisgICAgZm9yIChhdXRvIHN0cmVhbUlkIDogZGVsZXRlTGlzdCkgeworICAgICAgICByZW1vdGVSZXQgPSBtUmVtb3RlLT5kZWxldGVTdHJlYW0oc3RyZWFtSWQpOworICAgICAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkgfHwgcmVtb3RlUmV0ICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIGZhaWxlZCB0byByZW1vdmUgc3RyZWFtICVkIiwgZ2V0SWQoKSwgc3RyZWFtSWQpOworICAgICAgICAgICAgcmV0dXJuIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGwocmVtb3RlUmV0KTsKKyAgICAgICAgfQorICAgICAgICBtQ29uZmlndXJlZE91dHB1dHMuZXJhc2Uoc3RyZWFtSWQpOworICAgIH0KKworICAgIC8vIGFkZCBuZXcgc3RyZWFtcworICAgIGZvciAoYXV0byBvdXRwdXRQYWlyIDogYWRkU2V0KSB7CisgICAgICAgIGludCBzdHJlYW1JZDsKKyAgICAgICAgU3RhdHVzIHN0YXR1czsKKyAgICAgICAgYXV0byByZXQgPSBtUmVtb3RlLT5jcmVhdGVTdHJlYW0ob3V0cHV0UGFpci5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmc3RyZWFtSWRdKFN0YXR1cyBzLCBhdXRvIHN0cmVhbV9pZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlkID0gc3RyZWFtX2lkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCFyZW1vdGVSZXQuaXNPaygpIHx8IHN0YXR1cyAhPSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhIGRldmljZSAlcyBmYWlsZWQgdG8gY3JlYXRlIHN0cmVhbSIsIGdldElkKCkpOworICAgICAgICAgICAgcmV0dXJuIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGwoc3RhdHVzKTsKKyAgICAgICAgfQorICAgICAgICBtQ29uZmlndXJlZE91dHB1dHMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHN0cmVhbUlkLCBvdXRwdXRQYWlyKSk7CisgICAgfQorCisgICAgQ2FtZXJhTWV0YWRhdGEgcGFyYW1zOworICAgIEhDYW1lcmFNZXRhZGF0YSBoaWRsUGFyYW1zOworICAgIGlmICgoc2Vzc2lvblBhcmFtZXRlcnMgIT0gbnVsbHB0cikgJiYgKHNlc3Npb25QYXJhbWV0ZXJzLT5zZXR0aW5ncyAhPSBudWxscHRyKSkgeworICAgICAgICBwYXJhbXMuYXBwZW5kKHNlc3Npb25QYXJhbWV0ZXJzLT5zZXR0aW5ncy0+Z2V0SW50ZXJuYWxEYXRhKCkpOworICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcGFyYW1zX21ldGFkYXRhID0gcGFyYW1zLmdldEFuZExvY2soKTsKKyAgICAgICAgdXRpbHM6OmNvbnZlcnRUb0hpZGwocGFyYW1zX21ldGFkYXRhLCAmaGlkbFBhcmFtcyk7CisgICAgICAgIHBhcmFtcy51bmxvY2socGFyYW1zX21ldGFkYXRhKTsKKyAgICB9CisgICAgcmVtb3RlUmV0ID0gbVJlbW90ZS0+ZW5kQ29uZmlndXJlKFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlOjpOT1JNQUxfTU9ERSwgaGlkbFBhcmFtcyk7CisgICAgaWYgKCFyZW1vdGVSZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJUcmFuc2FjdGlvbiBlcnJvcjogZW5kQ29uZmlndXJlIGZhaWxlZCAlcyIsIHJlbW90ZVJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgIH0KKworICAgIHJldHVybiB1dGlsczo6Y29udmVydEZyb21IaWRsKHJlbW90ZVJldCk7Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6c2V0UmVtb3RlRGV2aWNlKHNwPElDYW1lcmFEZXZpY2VVc2VyPiByZW1vdGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobURldmljZUxvY2spOworICAgIG1SZW1vdGUgPSByZW1vdGU7Cit9CisKK2Jvb2wKK0NhbWVyYURldmljZTo6c2V0RGV2aWNlTWV0YWRhdGFRdWV1ZXMoKSB7CisgICAgICAgIGlmIChtUmVtb3RlID09IG51bGxwdHIpIHsKKyAgICAgICAgICBBTE9HRSgibVJlbW90ZSBtdXN0IG5vdCBiZSBudWxsIHdoaWxlIHRyeWluZyB0byBmZXRjaCBtZXRhZGF0YSBxdWV1ZXMiKTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiAmcmVxUXVldWUgPSBtQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlOworICAgICAgICBhdXRvIHJldCA9CisgICAgICAgICAgICBtUmVtb3RlLT5nZXRDYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUoCisgICAgICAgICAgICAgICAgWyZyZXFRdWV1ZV0oY29uc3QgYXV0byAmbXFEZXNjcmlwdG9yKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcVF1ZXVlID0gc3RkOjptYWtlX3NoYXJlZDxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4obXFEZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXFRdWV1ZS0+aXNWYWxpZCgpIHx8IHJlcVF1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPD0wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRW1wdHkgZm1xIGZyb20gY2FtZXJhc2VydmVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXFRdWV1ZSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiVHJhbnNhY3Rpb24gZXJyb3IgdHJ5aW5nIHRvIGdldCBjYXB0dXJlIHJlcXVlc3QgbWV0YWRhdGEgcXVldWUiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVzdWx0TWV0YWRhdGFRdWV1ZT4gJnJlc1F1ZXVlID0gbUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlOworICAgICAgICByZXQgPQorICAgICAgICAgICAgICAgIG1SZW1vdGUtPmdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKAorICAgICAgICAgICAgICAgICAgICAgICAgWyZyZXNRdWV1ZV0oY29uc3QgYXV0byAmbXFEZXNjcmlwdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzUXVldWUgPSBzdGQ6Om1ha2Vfc2hhcmVkPFJlc3VsdE1ldGFkYXRhUXVldWU+KG1xRGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNRdWV1ZS0+aXNWYWxpZCgpIHx8IHJlc1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPD0wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJFbXB0eSBmbXEgZnJvbSBjYW1lcmFzZXJ2ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiVHJhbnNhY3Rpb24gZXJyb3IgdHJ5aW5nIHRvIGdldCBjYXB0dXJlIHJlc3VsdCBtZXRhZGF0YSBxdWV1ZSIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworfQorCitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6Y2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCkgY29uc3QgeworICAgIGlmIChtUmVtb3RlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjYW1lcmEgZGV2aWNlIGFscmVhZHkgY2xvc2VkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRDsKKyAgICB9CisgICAgaWYgKG1JbkVycm9yKSB7Ly8gdHJpZ2dlcmVkIGJ5IG9uRGV2aWNlRXJyb3IKKyAgICAgICAgQUxPR0UoIiVzOiBjYW1lcmEgZGV2aWNlIGhhcyBlbmNvdW50ZXJlZCBhIHNlcmlvdXMgZXJyb3IiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gbUVycm9yOworICAgIH0KKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpzZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChjYW1lcmFfc3RhdHVzX3QgZXJyb3IpIHsKKyAgICBtSW5FcnJvciA9IHRydWU7CisgICAgbUVycm9yID0gZXJyb3I7CisgICAgcmV0dXJuOworfQorCit2b2lkCitDYW1lcmFEZXZpY2U6OkZyYW1lTnVtYmVyVHJhY2tlcjo6dXBkYXRlVHJhY2tlcihpbnQ2NF90IGZyYW1lTnVtYmVyLCBib29sIGlzRXJyb3IpIHsKKyAgICBBTE9HVigidXBkYXRlVHJhY2tlciBmcmFtZSAlIiBQUklkNjQgIiBpc0Vycm9yICVkIiwgZnJhbWVOdW1iZXIsIGlzRXJyb3IpOworICAgIGlmIChpc0Vycm9yKSB7CisgICAgICAgIG1GdXR1cmVFcnJvclNldC5pbnNlcnQoZnJhbWVOdW1iZXIpOworICAgIH0gZWxzZSBpZiAoZnJhbWVOdW1iZXIgPD0gbUNvbXBsZXRlZEZyYW1lTnVtYmVyKSB7CisgICAgICAgIEFMT0dFKCJGcmFtZSBudW1iZXIgJSIgUFJJZDY0ICIgZGVjcmVhc2VkISBjdXJyZW50IGZuICUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICBmcmFtZU51bWJlciwgbUNvbXBsZXRlZEZyYW1lTnVtYmVyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChmcmFtZU51bWJlciAhPSBtQ29tcGxldGVkRnJhbWVOdW1iZXIgKyAxKSB7CisgICAgICAgICAgICBBTE9HRSgiRnJhbWUgbnVtYmVyIG91dCBvZiBvcmRlci4gRXhwZWN0ICUiIFBSSWQ2NCAiIGJ1dCBnZXQgJSIgUFJJZDY0LAorICAgICAgICAgICAgICAgICAgICBtQ29tcGxldGVkRnJhbWVOdW1iZXIgKyAxLCBmcmFtZU51bWJlcik7CisgICAgICAgICAgICAvLyBEbyBub3QgYXNzZXJ0IGFzIGluIGphdmEgaW1wbGVtZW50YXRpb24KKyAgICAgICAgfQorICAgICAgICBtQ29tcGxldGVkRnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICB9CisgICAgdXBkYXRlKCk7Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6RnJhbWVOdW1iZXJUcmFja2VyOjp1cGRhdGUoKSB7CisgICAgZm9yIChhdXRvIGl0ID0gbUZ1dHVyZUVycm9yU2V0LmJlZ2luKCk7IGl0ICE9IG1GdXR1cmVFcnJvclNldC5lbmQoKTspIHsKKyAgICAgICAgaW50NjRfdCBlcnJvckZyYW1lTnVtYmVyID0gKml0OworICAgICAgICBpZiAoZXJyb3JGcmFtZU51bWJlciA9PSBtQ29tcGxldGVkRnJhbWVOdW1iZXIgKyAxKSB7CisgICAgICAgICAgICBtQ29tcGxldGVkRnJhbWVOdW1iZXIrKzsKKyAgICAgICAgICAgIGl0ID0gbUZ1dHVyZUVycm9yU2V0LmVyYXNlKGl0KTsKKyAgICAgICAgfSBlbHNlIGlmIChlcnJvckZyYW1lTnVtYmVyIDw9IG1Db21wbGV0ZWRGcmFtZU51bWJlcikgeworICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IGRlYWwgd2l0aCBpdCBhbnl3YXkKKyAgICAgICAgICAgIEFMT0dFKCJDb21wbGV0ZCBmcmFtZSBudW1iZXIgcGFzc2VkIHRocm91Z2ggY3VycmVudCBmcmFtZSBudW1iZXIhIik7CisgICAgICAgICAgICAvLyBlcmFzZSB0aGUgb2xkIGVycm9yIHNpbmNlIGl0J3Mgbm8gbG9uZ2VyIHVzZWZ1bAorICAgICAgICAgICAgaXQgPSBtRnV0dXJlRXJyb3JTZXQuZXJhc2UoaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gTm9ybWFsIHJlcXVlc3RzIGhhc24ndCBjYXRjaGVkIHVwIGVycm9yIGZyYW1lcywganVzdCBicmVhaworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoIlVwZGF0ZSBjb21wbGV0ZSBmcmFtZSAlIiBQUklkNjQsIG1Db21wbGV0ZWRGcmFtZU51bWJlcik7Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6b25DYXB0dXJlRXJyb3JMb2NrZWQoCisgICAgICAgIEVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgeworICAgIGludCBzZXF1ZW5jZUlkID0gcmVzdWx0RXh0cmFzLnJlcXVlc3RJZDsKKyAgICBpbnQ2NF90IGZyYW1lTnVtYmVyID0gcmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyOworICAgIGludDMyX3QgYnVyc3RJZCA9IHJlc3VsdEV4dHJhcy5idXJzdElkOworICAgIGF1dG8gaXQgPSBtU2VxdWVuY2VDYWxsYmFja01hcC5maW5kKHNlcXVlbmNlSWQpOworICAgIGlmIChpdCA9PSBtU2VxdWVuY2VDYWxsYmFja01hcC5lbmQoKSkgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBjYXB0dXJlIHNlcXVlbmNlIGluZGV4ICVkIG5vdCBmb3VuZCEiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2VxdWVuY2VJZCk7CisgICAgICAgIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX1NFUlZJQ0UpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ2FsbGJhY2tIb2xkZXIgY2JoID0gKCppdCkuc2Vjb25kOworICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiA9IGNiaC5tU2Vzc2lvbjsKKyAgICBpZiAoKHNpemVfdCkgYnVyc3RJZCA+PSBjYmgubVJlcXVlc3RzLnNpemUoKSkgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiByZXF1ZXN0IGluZGV4ICVkIG91dCBvZiBib3VuZCAoc2l6ZSAlenUpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1cnN0SWQsIGNiaC5tUmVxdWVzdHMuc2l6ZSgpKTsKKyAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfU0VSVklDRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QgPSBjYmgubVJlcXVlc3RzW2J1cnN0SWRdOworCisgICAgLy8gSGFuZGxlIGJ1ZmZlciBlcnJvcgorICAgIGlmIChlcnJvckNvZGUgPT0gRXJyb3JDb2RlOjpDQU1FUkFfQlVGRkVSKSB7CisgICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSByZXN1bHRFeHRyYXMuZXJyb3JTdHJlYW1JZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19idWZmZXJMb3N0IG9uQnVmZmVyTG9zdCA9CisgICAgICAgICAgICAgICAgY2JoLm1PbkNhcHR1cmVCdWZmZXJMb3N0OworICAgICAgICBhdXRvIG91dHB1dFBhaXJJdCA9IG1Db25maWd1cmVkT3V0cHV0cy5maW5kKHN0cmVhbUlkKTsKKyAgICAgICAgaWYgKG91dHB1dFBhaXJJdCA9PSBtQ29uZmlndXJlZE91dHB1dHMuZW5kKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IHN0cmVhbSBpZCAlZCBkb2VzIG5vdCBleGlzdCIsIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOworICAgICAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfU0VSVklDRSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBhdXRvJiB3aW5kb3dIYW5kbGVzID0gb3V0cHV0UGFpckl0LT5zZWNvbmQuc2Vjb25kLm1PdXRwdXRDb25maWd1cmF0aW9uLndpbmRvd0hhbmRsZXM7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgb3V0SGFuZGxlIDogd2luZG93SGFuZGxlcykgeworICAgICAgICAgICAgZm9yIChhdXRvIHN0cmVhbUFuZFdpbmRvd0lkIDogcmVxdWVzdC0+bUNhcHR1cmVSZXF1ZXN0LnN0cmVhbUFuZFdpbmRvd0lkcykgeworICAgICAgICAgICAgICAgIGludDMyX3Qgd2luZG93SWQgPSBzdHJlYW1BbmRXaW5kb3dJZC53aW5kb3dJZDsKKyAgICAgICAgICAgICAgICBpZiAodXRpbHM6OmlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwod2luZG93SGFuZGxlc1t3aW5kb3dJZF0sb3V0SGFuZGxlKSkgeworICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGFudyA9CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPih3aW5kb3dIYW5kbGVzW3dpbmRvd0lkXS5nZXROYXRpdmVIYW5kbGUoKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJDYW1lcmEgJXMgTG9zdCBvdXRwdXQgYnVmZmVyIGZvciBBTlcgJXAgZnJhbWUgJSIgUFJJZDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldElkKCksIGFudywgZnJhbWVOdW1iZXIpOworCisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlQnVmZmVyTG9zdCwgbUhhbmRsZXIpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgb25CdWZmZXJMb3N0KTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtBbndLZXksICh2b2lkKikgYW53KTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQ2NChrRnJhbWVOdW1iZXJLZXksIGZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsgLy8gSGFuZGxlIG90aGVyIGNhcHR1cmUgZmFpbHVyZXMKKyAgICAgICAgLy8gRmlyZSBjYXB0dXJlIGZhaWx1cmUgY2FsbGJhY2sgaWYgdGhlcmUgaXMgb25lIHJlZ2lzdGVyZWQKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgb25FcnJvciA9IGNiaC5tT25DYXB0dXJlRmFpbGVkOworICAgICAgICBzcDxDYW1lcmFDYXB0dXJlRmFpbHVyZT4gZmFpbHVyZShuZXcgQ2FtZXJhQ2FwdHVyZUZhaWx1cmUoKSk7CisgICAgICAgIGZhaWx1cmUtPmZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CisgICAgICAgIC8vIFRPRE86IHJlZmluZSB0aGlzIHdoZW4gaW1wbGVtZW50aW5nIGZsdXNoCisgICAgICAgIGZhaWx1cmUtPnJlYXNvbiAgICAgID0gQ0FQVFVSRV9GQUlMVVJFX1JFQVNPTl9FUlJPUjsKKyAgICAgICAgZmFpbHVyZS0+c2VxdWVuY2VJZCAgPSBzZXF1ZW5jZUlkOworICAgICAgICBmYWlsdXJlLT53YXNJbWFnZUNhcHR1cmVkID0gKGVycm9yQ29kZSA9PSBFcnJvckNvZGU6OkNBTUVSQV9SRVNVTFQpOworCisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlRmFpbCwgbUhhbmRsZXIpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ29udGV4dCk7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgb25FcnJvcik7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgcmVxdWVzdCk7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlRmFpbHVyZUtleSwgZmFpbHVyZSk7CisgICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworCisgICAgICAgIC8vIFVwZGF0ZSB0cmFja2VyCisgICAgICAgIG1GcmFtZU51bWJlclRyYWNrZXIudXBkYXRlVHJhY2tlcihmcmFtZU51bWJlciwgLyppc0Vycm9yKi90cnVlKTsKKyAgICAgICAgY2hlY2tBbmRGaXJlU2VxdWVuY2VDb21wbGV0ZUxvY2tlZCgpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgQ2FtZXJhRGV2aWNlOjpDYWxsYmFja0hhbmRsZXI6Om9uTWVzc2FnZVJlY2VpdmVkKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdE9uRGlzY29ubmVjdGVkOgorICAgICAgICBjYXNlIGtXaGF0T25FcnJvcjoKKyAgICAgICAgY2FzZSBrV2hhdFNlc3Npb25TdGF0ZUNiOgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0OgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVJlc3VsdDoKKyAgICAgICAgY2FzZSBrV2hhdExvZ2ljYWxDYXB0dXJlUmVzdWx0OgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUZhaWw6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxRW5kOgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVNlcUFib3J0OgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUJ1ZmZlckxvc3Q6CisgICAgICAgICAgICBBTE9HVigiJXM6IFJlY2VpdmVkIG1zZyAlZCIsIF9fRlVOQ1RJT05fXywgbXNnLT53aGF0KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga1doYXRDbGVhblVwU2Vzc2lvbnM6CisgICAgICAgICAgICBtQ2FjaGVkU2Vzc2lvbnMuY2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlczpFcnJvcjogdW5rbm93biBkZXZpY2UgY2FsbGJhY2sgJWQiLCBfX0ZVTkNUSU9OX18sIG1zZy0+d2hhdCgpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gQ2hlY2sgdGhlIGNvbW1vbiBwYXJ0IG9mIGFsbCBtZXNzYWdlCisgICAgdm9pZCogY29udGV4dDsKKyAgICBib29sIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ29udGV4dEtleSwgJmNvbnRleHQpOworICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYWxsYmFjayBjb250ZXh0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0T25EaXNjb25uZWN0ZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFDYW1lcmFEZXZpY2UqIGRldjsKKyAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrRGV2aWNlS2V5LCAodm9pZCoqKSAmZGV2KTsKKyAgICAgICAgICAgIGlmICghZm91bmQgfHwgZGV2ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGRldmljZSBwb2ludGVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrIG9uRGlzY29ubmVjdGVkOworICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmb25EaXNjb25uZWN0ZWQpOworICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgb25EaXNjb25uZWN0ZWQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob25EaXNjb25uZWN0ZWQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICgqb25EaXNjb25uZWN0ZWQpKGNvbnRleHQsIGRldik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0T25FcnJvcjoKKyAgICAgICAgeworICAgICAgICAgICAgQUNhbWVyYURldmljZSogZGV2OworICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtEZXZpY2VLZXksICh2b2lkKiopICZkZXYpOworICAgICAgICAgICAgaWYgKCFmb3VuZCB8fCBkZXYgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgZGV2aWNlIHBvaW50ZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX0Vycm9yU3RhdGVDYWxsYmFjayBvbkVycm9yOworICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmb25FcnJvcik7CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBvbkVycm9yISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGVycm9yQ29kZTsKKyAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kSW50MzIoa0Vycm9yQ29kZUtleSwgJmVycm9yQ29kZSk7CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBlcnJvciBjb2RlISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9uRXJyb3IgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICgqb25FcnJvcikoY29udGV4dCwgZGV2LCBlcnJvckNvZGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFNlc3Npb25TdGF0ZUNiOgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0OgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVJlc3VsdDoKKyAgICAgICAgY2FzZSBrV2hhdExvZ2ljYWxDYXB0dXJlUmVzdWx0OgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUZhaWw6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxRW5kOgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVNlcUFib3J0OgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUJ1ZmZlckxvc3Q6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kT2JqZWN0KGtTZXNzaW9uU3BLZXksICZvYmopOworICAgICAgICAgICAgaWYgKCFmb3VuZCB8fCBvYmogPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgc2Vzc2lvbiBwb2ludGVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uKHN0YXRpY19jYXN0PEFDYW1lcmFDYXB0dXJlU2Vzc2lvbio+KG9iai5nZXQoKSkpOworICAgICAgICAgICAgbUNhY2hlZFNlc3Npb25zLnB1c2goc2Vzc2lvbik7CisgICAgICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdFNwID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0OgorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRMb2dpY2FsQ2FwdHVyZVJlc3VsdDoKKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUZhaWw6CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVCdWZmZXJMb3N0OgorICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrQ2FwdHVyZVJlcXVlc3RLZXksICZvYmopOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhcHR1cmUgcmVxdWVzdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RTcCA9IHN0YXRpY19jYXN0PENhcHR1cmVSZXF1ZXN0Kj4ob2JqLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0U2Vzc2lvblN0YXRlQ2I6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RhdGVDYWxsYmFjayBvblN0YXRlOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvblN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBzdGF0ZSBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvblN0YXRlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAoKm9uU3RhdGUpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTdGFydDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnQgb25TdGFydDsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmb25TdGFydCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSBzdGFydCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvblN0YXJ0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcDsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRJbnQ2NChrVGltZVN0YW1wS2V5LCAmdGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCB0aW1lc3RhbXAhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QgPSBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0U3ApOworICAgICAgICAgICAgICAgICAgICAoKm9uU3RhcnQpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHJlcXVlc3QsIHRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgICAgIGZyZWVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVJlc3VsdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG9uUmVzdWx0OworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvblJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSByZXN1bHQgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAob25SZXN1bHQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRPYmplY3Qoa0NhcHR1cmVSZXN1bHRLZXksICZvYmopOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhcHR1cmUgcmVzdWx0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiByZXN1bHQoc3RhdGljX2Nhc3Q8QUNhbWVyYU1ldGFkYXRhKj4ob2JqLmdldCgpKSk7CisgICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCk7CisgICAgICAgICAgICAgICAgICAgICgqb25SZXN1bHQpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHJlcXVlc3QsIHJlc3VsdC5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIGZyZWVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG9uUmVzdWx0OworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvblJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSByZXN1bHQgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAob25SZXN1bHQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRPYmplY3Qoa0NhcHR1cmVSZXN1bHRLZXksICZvYmopOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhcHR1cmUgcmVzdWx0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiByZXN1bHQoc3RhdGljX2Nhc3Q8QUNhbWVyYU1ldGFkYXRhKj4ob2JqLmdldCgpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRPYmplY3Qoa1BoeXNpY2FsQ2FwdHVyZVJlc3VsdEtleSwgJm9iaik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgcGh5c2ljYWwgY2FwdHVyZSByZXN1bHQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gcGh5c2ljYWxSZXN1bHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QUNhbWVyYVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8qPihvYmouZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb0xvY2FsPiYgcGh5c2ljYWxSZXN1bHRJbmZvID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbFJlc3VsdC0+bVBoeXNpY2FsUmVzdWx0SW5mbzsKKworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGh5c2ljYWxDYW1lcmFJZHM7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNwPEFDYW1lcmFNZXRhZGF0YT4+IHBoeXNpY2FsTWV0YWRhdGFDb3B5OworICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBoeXNpY2FsUmVzdWx0SW5mby5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZHMucHVzaF9iYWNrKHBoeXNpY2FsUmVzdWx0SW5mb1tpXS5waHlzaWNhbENhbWVyYUlkKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgY2xvbmUgPSBwaHlzaWNhbFJlc3VsdEluZm9baV0ucGh5c2ljYWxNZXRhZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lLnVwZGF0ZShBTkRST0lEX1NZTkNfRlJBTUVfTlVNQkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5c2ljYWxSZXN1bHQtPm1GcmFtZU51bWJlciwgLypkYXRhX2NvdW50Ki8xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gbWV0YWRhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQUNhbWVyYU1ldGFkYXRhKGNsb25lLnJlbGVhc2UoKSwgQUNhbWVyYU1ldGFkYXRhOjpBQ01fUkVTVUxUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsTWV0YWRhdGFDb3B5LnB1c2hfYmFjayhtZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+IHBoeXNpY2FsQ2FtZXJhSWRQdHJzOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBBQ2FtZXJhTWV0YWRhdGEqPiBwaHlzaWNhbE1ldGFkYXRhQ29weVB0cnM7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGh5c2ljYWxSZXN1bHRJbmZvLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkUHRycy5wdXNoX2JhY2socGh5c2ljYWxDYW1lcmFJZHNbaV0uY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbE1ldGFkYXRhQ29weVB0cnMucHVzaF9iYWNrKHBoeXNpY2FsTWV0YWRhdGFDb3B5W2ldLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCk7CisgICAgICAgICAgICAgICAgICAgICgqb25SZXN1bHQpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHJlcXVlc3QsIHJlc3VsdC5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbFJlc3VsdEluZm8uc2l6ZSgpLCBwaHlzaWNhbENhbWVyYUlkUHRycy5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxNZXRhZGF0YUNvcHlQdHJzLmRhdGEoKSk7CisgICAgICAgICAgICAgICAgICAgIGZyZWVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfZmFpbGVkIG9uRmFpbDsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmb25GYWlsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYXB0dXJlIGZhaWwgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAob25GYWlsID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kT2JqZWN0KGtDYXB0dXJlRmFpbHVyZUtleSwgJm9iaik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSBmYWlsdXJlISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3A8Q2FtZXJhQ2FwdHVyZUZhaWx1cmU+IGZhaWx1cmVTcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDYW1lcmFDYXB0dXJlRmFpbHVyZSo+KG9iai5nZXQoKSkpOworICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZUZhaWx1cmUqIGZhaWx1cmUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFDYW1lcmFDYXB0dXJlRmFpbHVyZSo+KGZhaWx1cmVTcC5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCk7CisgICAgICAgICAgICAgICAgICAgICgqb25GYWlsKShjb250ZXh0LCBzZXNzaW9uLmdldCgpLCByZXF1ZXN0LCBmYWlsdXJlKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxRW5kOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zZXF1ZW5jZUVuZCBvblNlcUVuZDsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmb25TZXFFbmQpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIHNlcXVlbmNlIGVuZCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvblNlcUVuZCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50IHNlcUlkOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZEludDMyKGtTZXF1ZW5jZUlkS2V5LCAmc2VxSWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGZyYW1lIG51bWJlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZnJhbWVOdW1iZXI7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kSW50NjQoa0ZyYW1lTnVtYmVyS2V5LCAmZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGZyYW1lIG51bWJlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICgqb25TZXFFbmQpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHNlcUlkLCBmcmFtZU51bWJlcik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVNlcUFib3J0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zZXF1ZW5jZUFib3J0IG9uU2VxQWJvcnQ7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKikgJm9uU2VxQWJvcnQpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIHNlcXVlbmNlIGVuZCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvblNlcUFib3J0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQgc2VxSWQ7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kSW50MzIoa1NlcXVlbmNlSWRLZXksICZzZXFJZCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgZnJhbWUgbnVtYmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKCpvblNlcUFib3J0KShjb250ZXh0LCBzZXNzaW9uLmdldCgpLCBzZXFJZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUJ1ZmZlckxvc3Q6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2J1ZmZlckxvc3Qgb25CdWZmZXJMb3N0OworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvbkJ1ZmZlckxvc3QpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGJ1ZmZlciBsb3N0IGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9uQnVmZmVyTG9zdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGFudzsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtBbndLZXksICh2b2lkKiopICZhbncpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIG5hdGl2ZV9oYW5kbGVfdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBmcmFtZU51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRJbnQ2NChrRnJhbWVOdW1iZXJLZXksICZmcmFtZU51bWJlcik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgZnJhbWUgbnVtYmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QgPSBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0U3ApOworICAgICAgICAgICAgICAgICAgICAoKm9uQnVmZmVyTG9zdCkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgcmVxdWVzdCwgYW53LCBmcmFtZU51bWJlcik7CisgICAgICAgICAgICAgICAgICAgIGZyZWVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitDYW1lcmFEZXZpY2U6OkNhbGxiYWNrSG9sZGVyOjpDYWxsYmFja0hvbGRlcigKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgICAgICAgICBzZXNzaW9uLAorICAgICAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4mIHJlcXVlc3RzLAorICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0aW5nLAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzKSA6CisgICAgICAgIG1TZXNzaW9uKHNlc3Npb24pLCBtUmVxdWVzdHMocmVxdWVzdHMpLAorICAgICAgICBtSXNSZXBlYXRpbmcoaXNSZXBlYXRpbmcpLAorICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2soZmFsc2UpIHsKKyAgICBpbml0Q2FwdHVyZUNhbGxiYWNrcyhjYnMpOworCisgICAgaWYgKGNicyAhPSBudWxscHRyKSB7CisgICAgICAgIG1PbkNhcHR1cmVDb21wbGV0ZWQgPSBjYnMtPm9uQ2FwdHVyZUNvbXBsZXRlZDsKKyAgICB9Cit9CisKK0NhbWVyYURldmljZTo6Q2FsbGJhY2tIb2xkZXI6OkNhbGxiYWNrSG9sZGVyKAorICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiYgcmVxdWVzdHMsCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3MqIGxjYnMpIDoKKyAgICAgICAgbVNlc3Npb24oc2Vzc2lvbiksIG1SZXF1ZXN0cyhyZXF1ZXN0cyksCisgICAgICAgIG1Jc1JlcGVhdGluZyhpc1JlcGVhdGluZyksCisgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjayh0cnVlKSB7CisgICAgaW5pdENhcHR1cmVDYWxsYmFja3MobGNicyk7CisKKyAgICBpZiAobGNicyAhPSBudWxscHRyKSB7CisgICAgICAgIG1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkID0gbGNicy0+b25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZDsKKyAgICB9Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6Y2hlY2tSZXBlYXRpbmdTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKAorICAgIGNvbnN0IGludCBzZXF1ZW5jZUlkLCBjb25zdCBpbnQ2NF90IGxhc3RGcmFtZU51bWJlcikgeworICAgIEFMT0dWKCJSZXBlYXRpbmcgc2VxSWQgJWQgbGFzdEZyYW1lTnVtZXIgJSIgUFJJZDY0LCBzZXF1ZW5jZUlkLCBsYXN0RnJhbWVOdW1iZXIpOworICAgIGlmIChsYXN0RnJhbWVOdW1iZXIgPT0gTk9fRlJBTUVTX0NBUFRVUkVEKSB7CisgICAgICAgIGlmIChtU2VxdWVuY2VDYWxsYmFja01hcC5jb3VudChzZXF1ZW5jZUlkKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVygiTm8gY2FsbGJhY2sgZm91bmQgZm9yIHNlcXVlbmNlSWQgJWQiLCBzZXF1ZW5jZUlkKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyByZW1vdmUgY2FsbGJhY2sgaG9sZGVyIGZyb20gY2FsbGJhY2sgbWFwCisgICAgICAgIGF1dG8gY2JJdCA9IG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmZpbmQoc2VxdWVuY2VJZCk7CisgICAgICAgIENhbGxiYWNrSG9sZGVyIGNiaCA9IGNiSXQtPnNlY29uZDsKKyAgICAgICAgbVNlcXVlbmNlQ2FsbGJhY2tNYXAuZXJhc2UoY2JJdCk7CisgICAgICAgIC8vIHNlbmQgc2VxIGFib3J0ZWQgY2FsbGJhY2sKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENhcHR1cmVTZXFBYm9ydCwgbUhhbmRsZXIpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ29udGV4dCk7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIGNiaC5tU2Vzc2lvbik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBjYmgubU9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZCk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoa1NlcXVlbmNlSWRLZXksIHNlcXVlbmNlSWQpOworICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBVc2UgbVNlcXVlbmNlTGFzdEZyYW1lTnVtYmVyTWFwIHRvIHRyYWNrCisgICAgICAgIG1TZXF1ZW5jZUxhc3RGcmFtZU51bWJlck1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoc2VxdWVuY2VJZCwgbGFzdEZyYW1lTnVtYmVyKSk7CisKKyAgICAgICAgLy8gTGFzdCBmcmFtZSBtaWdodCBoYXZlIGFycml2ZWQuIENoZWNrIG5vdworICAgICAgICBjaGVja0FuZEZpcmVTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKCk7CisgICAgfQorfQorCit2b2lkCitDYW1lcmFEZXZpY2U6OmNoZWNrQW5kRmlyZVNlcXVlbmNlQ29tcGxldGVMb2NrZWQoKSB7CisgICAgaW50NjRfdCBjb21wbGV0ZWRGcmFtZU51bWJlciA9IG1GcmFtZU51bWJlclRyYWNrZXIuZ2V0Q29tcGxldGVkRnJhbWVOdW1iZXIoKTsKKyAgICBhdXRvIGl0ID0gbVNlcXVlbmNlTGFzdEZyYW1lTnVtYmVyTWFwLmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ICE9IG1TZXF1ZW5jZUxhc3RGcmFtZU51bWJlck1hcC5lbmQoKSkgeworICAgICAgICBpbnQgc2VxdWVuY2VJZCA9IGl0LT5maXJzdDsKKyAgICAgICAgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIgPSBpdC0+c2Vjb25kOworICAgICAgICBib29sIHNlcUNvbXBsZXRlZCA9IGZhbHNlOworICAgICAgICBib29sIGhhc0NhbGxiYWNrICA9IHRydWU7CisKKyAgICAgICAgaWYgKG1SZW1vdGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR1coIkNhbWVyYSAlcyBjbG9zZWQgd2hpbGUgY2hlY2tpbmcgc2VxdWVuY2UgY29tcGxldGUiLCBnZXRJZCgpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGNhbGxiYWNrIGZvciB0aGlzIHNlcXVlbmNlCisgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gYmVjYXVzZSB3ZSBhbHdheXMgcmVnaXN0ZXIgY2FsbGJhY2sgKHdpdGggbnVsbHB0ciBpbnNpZGUpCisgICAgICAgIGlmIChtU2VxdWVuY2VDYWxsYmFja01hcC5jb3VudChzZXF1ZW5jZUlkKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVygiTm8gY2FsbGJhY2sgZm91bmQgZm9yIHNlcXVlbmNlSWQgJWQiLCBzZXF1ZW5jZUlkKTsKKyAgICAgICAgICAgIGhhc0NhbGxiYWNrID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAobGFzdEZyYW1lTnVtYmVyIDw9IGNvbXBsZXRlZEZyYW1lTnVtYmVyKSB7CisgICAgICAgICAgICBBTE9HVigic2VxICVkIHJlYWNoZWQgbGFzdCBmcmFtZSAlIiBQUklkNjQgIiwgY29tcGxldGVkICUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSWQsIGxhc3RGcmFtZU51bWJlciwgY29tcGxldGVkRnJhbWVOdW1iZXIpOworICAgICAgICAgICAgc2VxQ29tcGxldGVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZXFDb21wbGV0ZWQgJiYgaGFzQ2FsbGJhY2spIHsKKyAgICAgICAgICAgIC8vIHJlbW92ZSBjYWxsYmFjayBob2xkZXIgZnJvbSBjYWxsYmFjayBtYXAKKyAgICAgICAgICAgIGF1dG8gY2JJdCA9IG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmZpbmQoc2VxdWVuY2VJZCk7CisgICAgICAgICAgICBDYWxsYmFja0hvbGRlciBjYmggPSBjYkl0LT5zZWNvbmQ7CisgICAgICAgICAgICBtU2VxdWVuY2VDYWxsYmFja01hcC5lcmFzZShjYkl0KTsKKyAgICAgICAgICAgIC8vIHNlbmQgc2VxIGNvbXBsZXRlIGNhbGxiYWNrCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVNlcUVuZCwgbUhhbmRsZXIpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNvbnRleHQpOworICAgICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgY2JoLm1TZXNzaW9uKTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBjYmgubU9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkKTsKKyAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoa1NlcXVlbmNlSWRLZXksIHNlcXVlbmNlSWQpOworICAgICAgICAgICAgbXNnLT5zZXRJbnQ2NChrRnJhbWVOdW1iZXJLZXksIGxhc3RGcmFtZU51bWJlcik7CisKKyAgICAgICAgICAgIC8vIENsZWFyIHRoZSBzZXNzaW9uIHNwIGJlZm9yZSB3ZSBzZW5kIG91dCB0aGUgbWVzc2FnZQorICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGd1YXJhbnRlZSB0aGUgcmFyZSBjYXNlIHdoZXJlIHRoZSBtZXNzYWdlIGlzIHByb2Nlc3NlZAorICAgICAgICAgICAgLy8gYmVmb3JlIGNiaCBnb2VzIG91dCBvZiBzY29wZSBhbmQgY2F1c2luZyB3ZSBjYWxsIHRoZSBzZXNzaW9uCisgICAgICAgICAgICAvLyBkZXN0cnVjdG9yIHdoaWxlIGhvbGRpbmcgZGV2aWNlIGxvY2sKKyAgICAgICAgICAgIGNiaC5tU2Vzc2lvbi5jbGVhcigpOworICAgICAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBObyBuZWVkIHRvIHRyYWNrIHNlcXVlbmNlIGNvbXBsZXRlIGlmIHRoZXJlIGlzIG5vIGNhbGxiYWNrIHJlZ2lzdGVyZWQKKyAgICAgICAgaWYgKHNlcUNvbXBsZXRlZCB8fCAhaGFzQ2FsbGJhY2spIHsKKyAgICAgICAgICAgIGl0ID0gbVNlcXVlbmNlTGFzdEZyYW1lTnVtYmVyTWFwLmVyYXNlKGl0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICsraXQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICAqIENhbWVyYSBzZXJ2aWNlIGNhbGxiYWNrIGltcGxlbWVudGF0aW9uCisgICovCithbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+CitDYW1lcmFEZXZpY2U6OlNlcnZpY2VDYWxsYmFjazo6b25EZXZpY2VFcnJvcigKKyAgICAgICAgRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CisgICAgQUxPR0QoIkRldmljZSBlcnJvciByZWNlaXZlZCwgY29kZSAlZCwgZnJhbWUgbnVtYmVyICUiIFBSSWQ2NCAiLCByZXF1ZXN0IElEICVkLCBzdWJzZXEgSUQgJWQiLAorICAgICAgICAgICAgZXJyb3JDb2RlLCByZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIsIHJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQsIHJlc3VsdEV4dHJhcy5idXJzdElkKTsKKyAgICBhdXRvIHJldCA9IFZvaWQoKTsKKyAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgIGlmIChkZXYgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmV0OyAvLyBkZXZpY2UgaGFzIGJlZW4gY2xvc2VkCisgICAgfQorCisgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uID0gZGV2LT5tQ3VycmVudFNlc3Npb24ucHJvbW90ZSgpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChkZXYtPm1EZXZpY2VMb2NrKTsKKyAgICBpZiAoZGV2LT5tUmVtb3RlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJldDsgLy8gZGV2aWNlIGhhcyBiZWVuIGNsb3NlZAorICAgIH0KKyAgICBzd2l0Y2ggKGVycm9yQ29kZSkgeworICAgICAgICBjYXNlIEVycm9yQ29kZTo6Q0FNRVJBX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQ2FtZXJhIGlzIGRpc2Nvbm5lY3RlZCwgY2xvc2UgdGhlIHNlc3Npb24gYW5kIGV4cGVjdCBubyBtb3JlIGNhbGxiYWNrcworICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHNlc3Npb24tPmNsb3NlQnlEZXZpY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRldi0+bUN1cnJlbnRTZXNzaW9uID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPbkRpc2Nvbm5lY3RlZCwgZGV2LT5tSGFuZGxlcik7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGRldi0+bUFwcENhbGxiYWNrcy5jb250ZXh0KTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrRGV2aWNlS2V5LCAodm9pZCopIGRldi0+Z2V0V3JhcHBlcigpKTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBkZXYtPm1BcHBDYWxsYmFja3Mub25EaXNjb25uZWN0ZWQpOworICAgICAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIlVua25vd24gZXJyb3IgZnJvbSBjYW1lcmEgZGV2aWNlOiAlZCIsIGVycm9yQ29kZSk7CisgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpDQU1FUkFfREVWSUNFOgorICAgICAgICBjYXNlIEVycm9yQ29kZTo6Q0FNRVJBX1NFUlZJQ0U6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgZXJyb3JWYWwgPSA6OkVSUk9SX0NBTUVSQV9ERVZJQ0U7CisgICAgICAgICAgICAvLyBXZSBrZWVwIHRoaXMgc3dpdGNoIHNpbmNlIHRoaXMgYmxvY2sgbWlnaHQgYmUgZW5jb3VudGVyZWQgd2l0aAorICAgICAgICAgICAgLy8gbW9yZSB0aGFuIGp1c3QgMiBzdGF0ZXMuIFRoZSBkZWZhdWx0IGZhbGx0aHJvdWdoIGNvdWxkIGhhdmUgdXMKKyAgICAgICAgICAgIC8vIGhhbmRsaW5nIG1vcmUgdW5tYXRjaGVkIGVycm9yIGNhc2VzLgorICAgICAgICAgICAgc3dpdGNoIChlcnJvckNvZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEVycm9yQ29kZTo6Q0FNRVJBX0RFVklDRToKKyAgICAgICAgICAgICAgICAgICAgZGV2LT5zZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEVycm9yQ29kZTo6Q0FNRVJBX1NFUlZJQ0U6CisgICAgICAgICAgICAgICAgICAgIGRldi0+c2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfU0VSVklDRSk7CisgICAgICAgICAgICAgICAgICAgIGVycm9yVmFsID0gOjpFUlJPUl9DQU1FUkFfU0VSVklDRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgZGV2LT5zZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX1VOS05PV04pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPbkVycm9yLCBkZXYtPm1IYW5kbGVyKTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgZGV2LT5tQXBwQ2FsbGJhY2tzLmNvbnRleHQpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtEZXZpY2VLZXksICh2b2lkKikgZGV2LT5nZXRXcmFwcGVyKCkpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGRldi0+bUFwcENhbGxiYWNrcy5vbkVycm9yKTsKKyAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoa0Vycm9yQ29kZUtleSwgZXJyb3JWYWwpOworICAgICAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEVycm9yQ29kZTo6Q0FNRVJBX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpDQU1FUkFfUkVTVUxUOgorICAgICAgICBjYXNlIEVycm9yQ29kZTo6Q0FNRVJBX0JVRkZFUjoKKyAgICAgICAgICAgIGRldi0+b25DYXB0dXJlRXJyb3JMb2NrZWQoZXJyb3JDb2RlLCByZXN1bHRFeHRyYXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2FuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4KK0NhbWVyYURldmljZTo6U2VydmljZUNhbGxiYWNrOjpvbkRldmljZUlkbGUoKSB7CisgICAgQUxPR1YoIkNhbWVyYSBpcyBub3cgaWRsZSIpOworICAgIGF1dG8gcmV0ID0gVm9pZCgpOworICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXQ7IC8vIGRldmljZSBoYXMgYmVlbiBjbG9zZWQKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woZGV2LT5tRGV2aWNlTG9jayk7CisgICAgaWYgKGRldi0+aXNDbG9zZWQoKSB8fCBkZXYtPm1SZW1vdGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChkZXYtPm1JZGxlKSB7CisgICAgICAgIC8vIEFscmVhZHkgaW4gaWRsZSBzdGF0ZS4gUG9zc2libHkgb3RoZXIgdGhyZWFkIGRpZCB3YWl0VW50aWxJZGxlCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKGRldi0+bUN1cnJlbnRTZXNzaW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIm9uRGV2aWNlSWRsZSBzZW5kaW5nIHN0YXRlIGNiIik7CisgICAgICAgIGlmIChkZXYtPm1CdXN5U2Vzc2lvbiAhPSBkZXYtPm1DdXJyZW50U2Vzc2lvbikgeworICAgICAgICAgICAgQUxPR0UoIkN1cnJlbnQgc2Vzc2lvbiAhPSBidXN5IHNlc3Npb24iKTsKKyAgICAgICAgICAgIGRldi0+c2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2Vzc2lvblN0YXRlQ2IsIGRldi0+bUhhbmRsZXIpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGRldi0+bUJ1c3lTZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5jb250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgZGV2LT5tQnVzeVNlc3Npb24pOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgZGV2LT5tQnVzeVNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLm9uUmVhZHkpOworICAgICAgICAvLyBNYWtlIHN1cmUgd2UgY2xlYXIgdGhlIHNwIGZpcnN0IHNvIHRoZSBzZXNzaW9uIGRlc3RydWN0b3IgY2FuCisgICAgICAgIC8vIG9ubHkgaGFwcGVuIG9uIGhhbmRsZXIgdGhyZWFkICh3aGVyZSB3ZSBkb24ndCBob2xkIGRldmljZS9zZXNzaW9uIGxvY2spCisgICAgICAgIGRldi0+bUJ1c3lTZXNzaW9uLmNsZWFyKCk7CisgICAgICAgIGRldi0+cG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisgICAgfQorICAgIGRldi0+bUlkbGUgPSB0cnVlOworICAgIGRldi0+bUZsdXNoaW5nID0gZmFsc2U7CisgICAgcmV0dXJuIHJldDsKK30KKworYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPgorQ2FtZXJhRGV2aWNlOjpTZXJ2aWNlQ2FsbGJhY2s6Om9uQ2FwdHVyZVN0YXJ0ZWQoCisgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKKyAgICAgICAgdWludDY0X3QgdGltZXN0YW1wKSB7CisgICAgYXV0byByZXQgPSBWb2lkKCk7CisKKyAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgIGlmIChkZXYgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmV0OyAvLyBkZXZpY2UgaGFzIGJlZW4gY2xvc2VkCisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChkZXYtPm1EZXZpY2VMb2NrKTsKKyAgICBpZiAoZGV2LT5pc0Nsb3NlZCgpIHx8IGRldi0+bVJlbW90ZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaW50MzJfdCBzZXF1ZW5jZUlkID0gcmVzdWx0RXh0cmFzLnJlcXVlc3RJZDsKKyAgICBpbnQzMl90IGJ1cnN0SWQgPSByZXN1bHRFeHRyYXMuYnVyc3RJZDsKKworICAgIGF1dG8gaXQgPSBkZXYtPm1TZXF1ZW5jZUNhbGxiYWNrTWFwLmZpbmQoc2VxdWVuY2VJZCk7CisgICAgaWYgKGl0ICE9IGRldi0+bVNlcXVlbmNlQ2FsbGJhY2tNYXAuZW5kKCkpIHsKKyAgICAgICAgQ2FsbGJhY2tIb2xkZXIgY2JoID0gKCppdCkuc2Vjb25kOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3N0YXJ0IG9uU3RhcnQgPSBjYmgubU9uQ2FwdHVyZVN0YXJ0ZWQ7CisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiA9IGNiaC5tU2Vzc2lvbjsKKyAgICAgICAgaWYgKChzaXplX3QpIGJ1cnN0SWQgPj0gY2JoLm1SZXF1ZXN0cy5zaXplKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IHJlcXVlc3QgaW5kZXggJWQgb3V0IG9mIGJvdW5kIChzaXplICV6dSkiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1cnN0SWQsIGNiaC5tUmVxdWVzdHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGRldi0+c2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfU0VSVklDRSk7CisgICAgICAgIH0KKyAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QgPSBjYmgubVJlcXVlc3RzW2J1cnN0SWRdOworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVN0YXJ0LCBkZXYtPm1IYW5kbGVyKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNvbnRleHQpOworICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIG9uU3RhcnQpOworICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZVJlcXVlc3RLZXksIHJlcXVlc3QpOworICAgICAgICBtc2ctPnNldEludDY0KGtUaW1lU3RhbXBLZXksIHRpbWVzdGFtcCk7CisgICAgICAgIGRldi0+cG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2FuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4KK0NhbWVyYURldmljZTo6U2VydmljZUNhbGxiYWNrOjpvblJlc3VsdFJlY2VpdmVkKAorICAgICAgICBjb25zdCBGbXFTaXplT3JNZXRhZGF0YSYgcmVzdWx0TWV0YWRhdGEsCisgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4mIHBoeXNpY2FsUmVzdWx0SW5mb3MpIHsKKyAgICBhdXRvIHJldCA9IFZvaWQoKTsKKworICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXQ7IC8vIGRldmljZSBoYXMgYmVlbiBjbG9zZWQKKyAgICB9CisgICAgaW50MzJfdCBzZXF1ZW5jZUlkID0gcmVzdWx0RXh0cmFzLnJlcXVlc3RJZDsKKyAgICBpbnQ2NF90IGZyYW1lTnVtYmVyID0gcmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyOworICAgIGludDMyX3QgYnVyc3RJZCA9IHJlc3VsdEV4dHJhcy5idXJzdElkOworICAgIGJvb2wgICAgaXNQYXJ0aWFsUmVzdWx0ID0gKHJlc3VsdEV4dHJhcy5wYXJ0aWFsUmVzdWx0Q291bnQgPCBkZXYtPm1QYXJ0aWFsUmVzdWx0Q291bnQpOworCisgICAgaWYgKCFpc1BhcnRpYWxSZXN1bHQpIHsKKyAgICAgICAgQUxPR1YoIlNlcUlkICVkIGZyYW1lICUiIFBSSWQ2NCAiIHJlc3VsdCBhcnJpdmUuIiwgc2VxdWVuY2VJZCwgZnJhbWVOdW1iZXIpOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChkZXYtPm1EZXZpY2VMb2NrKTsKKyAgICBpZiAoZGV2LT5tUmVtb3RlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJldDsgLy8gZGV2aWNlIGhhcyBiZWVuIGRpc2Nvbm5lY3RlZAorICAgIH0KKworICAgIGlmIChkZXYtPmlzQ2xvc2VkKCkpIHsKKyAgICAgICAgaWYgKCFpc1BhcnRpYWxSZXN1bHQpIHsKKyAgICAgICAgICAgIGRldi0+bUZyYW1lTnVtYmVyVHJhY2tlci51cGRhdGVUcmFja2VyKGZyYW1lTnVtYmVyLCAvKmlzRXJyb3IqL2ZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICAvLyBlYXJseSByZXR1cm4gdG8gYXZvaWQgY2FsbGJhY2sgc2VudCB0byBjbG9zZWQgZGV2aWNlcworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhQ29weTsKKyAgICBjYW1lcmFfc3RhdHVzX3Qgc3RhdHVzID0gcmVhZE9uZVJlc3VsdE1ldGFkYXRhKHJlc3VsdE1ldGFkYXRhLAorICAgICAgICAgICAgZGV2LT5tQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUuZ2V0KCksICZtZXRhZGF0YUNvcHkpOworICAgIGlmIChzdGF0dXMgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiJXM6IHJlc3VsdCBtZXRhZGF0YSBjb3VsZG4ndCBiZSBjb252ZXJ0ZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIG1ldGFkYXRhQ29weS51cGRhdGUoQU5EUk9JRF9MRU5TX0lORk9fU0hBRElOR19NQVBfU0laRSwgZGV2LT5tU2hhZGluZ01hcFNpemUsIC8qZGF0YV9jb3VudCovMik7CisgICAgbWV0YWRhdGFDb3B5LnVwZGF0ZShBTkRST0lEX1NZTkNfRlJBTUVfTlVNQkVSLCAmZnJhbWVOdW1iZXIsIC8qZGF0YV9jb3VudCovMSk7CisKKyAgICBhdXRvIGl0ID0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5maW5kKHNlcXVlbmNlSWQpOworICAgIGlmIChpdCAhPSBkZXYtPm1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVuZCgpKSB7CisgICAgICAgIENhbGxiYWNrSG9sZGVyIGNiaCA9ICgqaXQpLnNlY29uZDsKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uID0gY2JoLm1TZXNzaW9uOworICAgICAgICBpZiAoKHNpemVfdCkgYnVyc3RJZCA+PSBjYmgubVJlcXVlc3RzLnNpemUoKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogcmVxdWVzdCBpbmRleCAlZCBvdXQgb2YgYm91bmQgKHNpemUgJXp1KSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVyc3RJZCwgY2JoLm1SZXF1ZXN0cy5zaXplKCkpOworICAgICAgICAgICAgZGV2LT5zZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9TRVJWSUNFKTsKKyAgICAgICAgfQorICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCA9IGNiaC5tUmVxdWVzdHNbYnVyc3RJZF07CisgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gcmVzdWx0KG5ldyBBQ2FtZXJhTWV0YWRhdGEoCisgICAgICAgICAgICAgICAgbWV0YWRhdGFDb3B5LnJlbGVhc2UoKSwgQUNhbWVyYU1ldGFkYXRhOjpBQ01fUkVTVUxUKSk7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb0xvY2FsPiBsb2NhbFBoeXNpY2FsUmVzdWx0OworICAgICAgICBsb2NhbFBoeXNpY2FsUmVzdWx0LnJlc2l6ZShwaHlzaWNhbFJlc3VsdEluZm9zLnNpemUoKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGh5c2ljYWxSZXN1bHRJbmZvcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgbG9jYWxQaHlzaWNhbFJlc3VsdFtpXS5waHlzaWNhbENhbWVyYUlkID0gcGh5c2ljYWxSZXN1bHRJbmZvc1tpXS5waHlzaWNhbENhbWVyYUlkOworICAgICAgICAgICAgc3RhdHVzID0gcmVhZE9uZVJlc3VsdE1ldGFkYXRhKHBoeXNpY2FsUmVzdWx0SW5mb3NbaV0ucGh5c2ljYWxDYW1lcmFNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgZGV2LT5tQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICZsb2NhbFBoeXNpY2FsUmVzdWx0W2ldLnBoeXNpY2FsTWV0YWRhdGEpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBwaHlzaWNhbCBjYW1lcmEgcmVzdWx0IG1ldGFkYXRhIGNvdWxkbid0IGJlIGNvbnZlcnRlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzcDxBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gcGh5c2ljYWxSZXN1bHQoCisgICAgICAgICAgICAgICAgbmV3IEFDYW1lcmFQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvKGxvY2FsUGh5c2ljYWxSZXN1bHQsIGZyYW1lTnVtYmVyKSk7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBjYmgubUlzTG9naWNhbENhbWVyYUNhbGxiYWNrID8ga1doYXRMb2dpY2FsQ2FwdHVyZVJlc3VsdCA6IGtXaGF0Q2FwdHVyZVJlc3VsdCwKKyAgICAgICAgICAgICAgICBkZXYtPm1IYW5kbGVyKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNvbnRleHQpOworICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXN1bHRLZXksIHJlc3VsdCk7CisgICAgICAgIGlmIChpc1BhcnRpYWxSZXN1bHQpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiljYmgubU9uQ2FwdHVyZVByb2dyZXNzZWQpOworICAgICAgICB9IGVsc2UgaWYgKGNiaC5tSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2spIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiljYmgubU9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQpOworICAgICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1BoeXNpY2FsQ2FwdHVyZVJlc3VsdEtleSwgcGh5c2ljYWxSZXN1bHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWNiaC5tT25DYXB0dXJlQ29tcGxldGVkKTsKKyAgICAgICAgfQorICAgICAgICBkZXYtPnBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworICAgIH0KKworICAgIGlmICghaXNQYXJ0aWFsUmVzdWx0KSB7CisgICAgICAgIGRldi0+bUZyYW1lTnVtYmVyVHJhY2tlci51cGRhdGVUcmFja2VyKGZyYW1lTnVtYmVyLCAvKmlzRXJyb3IqL2ZhbHNlKTsKKyAgICAgICAgZGV2LT5jaGVja0FuZEZpcmVTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKCk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPgorQ2FtZXJhRGV2aWNlOjpTZXJ2aWNlQ2FsbGJhY2s6Om9uUmVwZWF0aW5nUmVxdWVzdEVycm9yKAorICAgICAgICB1aW50NjRfdCBsYXN0RnJhbWVOdW1iZXIsIGludDMyX3Qgc3RvcHBlZFNlcXVlbmNlSWQpIHsKKyAgICBhdXRvIHJldCA9IFZvaWQoKTsKKworICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXQ7IC8vIGRldmljZSBoYXMgYmVlbiBjbG9zZWQKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woZGV2LT5tRGV2aWNlTG9jayk7CisKKyAgICBpbnQgcmVwZWF0aW5nU2VxdWVuY2VJZCA9IGRldi0+bVJlcGVhdGluZ1NlcXVlbmNlSWQ7CisgICAgaWYgKHN0b3BwZWRTZXF1ZW5jZUlkID09IHJlcGVhdGluZ1NlcXVlbmNlSWQpIHsKKyAgICAgICAgZGV2LT5tUmVwZWF0aW5nU2VxdWVuY2VJZCA9IFJFUVVFU1RfSURfTk9ORTsKKyAgICB9CisKKyAgICBkZXYtPmNoZWNrUmVwZWF0aW5nU2VxdWVuY2VDb21wbGV0ZUxvY2tlZChyZXBlYXRpbmdTZXF1ZW5jZUlkLCBsYXN0RnJhbWVOdW1iZXIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworY2FtZXJhX3N0YXR1c190IENhbWVyYURldmljZTo6U2VydmljZUNhbGxiYWNrOjpyZWFkT25lUmVzdWx0TWV0YWRhdGEoCisgICAgICAgIGNvbnN0IEZtcVNpemVPck1ldGFkYXRhJiBmbXFTaXplT3JNZXRhZGF0YSwgUmVzdWx0TWV0YWRhdGFRdWV1ZSogbWV0YWRhdGFRdWV1ZSwKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEqIG1ldGFkYXRhKSB7CisgICAgaWYgKG1ldGFkYXRhUXVldWUgPT0gbnVsbHB0ciB8fCBtZXRhZGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICBib29sIGNvbnZlcnRlZDsKKyAgICBIQ2FtZXJhTWV0YWRhdGEgaENhbWVyYU1ldGFkYXRhOworICAgIGlmIChmbXFTaXplT3JNZXRhZGF0YS5nZXREaXNjcmltaW5hdG9yKCkgPT0KKyAgICAgICAgICAgIEZtcVNpemVPck1ldGFkYXRhOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmZtcU1ldGFkYXRhU2l6ZSkgeworICAgICAgICBoQ2FtZXJhTWV0YWRhdGEucmVzaXplKGZtcVNpemVPck1ldGFkYXRhLmZtcU1ldGFkYXRhU2l6ZSgpKTsKKyAgICAgICAgYm9vbCByZWFkID0gbWV0YWRhdGFRdWV1ZS0+cmVhZCgKKyAgICAgICAgICAgICAgICBoQ2FtZXJhTWV0YWRhdGEuZGF0YSgpLCBmbXFTaXplT3JNZXRhZGF0YS5mbXFNZXRhZGF0YVNpemUoKSk7CisgICAgICAgIGlmICghcmVhZCkgeworICAgICAgICAgICAgQUxPR0UoIiVzIGNhcHR1cmUgcmVxdWVzdCBzZXR0aW5ncyBjb3VsZCd0IGJlIHJlYWQgZnJvbSBmbXEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPOiBEbyB3ZSBhY3R1YWxseSBuZWVkIHRvIGNsb25lIGhlcmUgPworICAgICAgICBjb252ZXJ0ZWQgPSB1dGlsczo6Y29udmVydEZyb21IaWRsQ2xvbmVkKGhDYW1lcmFNZXRhZGF0YSwgbWV0YWRhdGEpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnZlcnRlZCA9IHV0aWxzOjpjb252ZXJ0RnJvbUhpZGxDbG9uZWQoZm1xU2l6ZU9yTWV0YWRhdGEubWV0YWRhdGEoKSwgbWV0YWRhdGEpOworICAgIH0KKworICAgIHJldHVybiBjb252ZXJ0ZWQgPyBBQ0FNRVJBX09LIDogQUNBTUVSQV9FUlJPUl9VTktOT1dOOworfQorCit9IC8vIG5hbWVzcGFjZSBhY2FtCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmggYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYzYjk3ZgotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuaApAQCAtMCwwICsxLDQwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIF9BQ0FNRVJBX0RFVklDRV9ICisjZGVmaW5lIF9BQ0FNRVJBX0RFVklDRV9ICisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvSUNhbWVyYURldmljZVVzZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL0lDYW1lcmFEZXZpY2VDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFNYW5hZ2VyLmg+CisjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmg+CisjaW5jbHVkZSAiQUNhbWVyYU1ldGFkYXRhLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0geworCit1c2luZyBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2sgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OklDYW1lcmFEZXZpY2VDYWxsYmFjazsKK3VzaW5nIElDYW1lcmFEZXZpY2VVc2VyID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpJQ2FtZXJhRGV2aWNlVXNlcjsKK3VzaW5nIENhcHR1cmVSZXN1bHRFeHRyYXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXN1bHRFeHRyYXM7Cit1c2luZyBQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvOwordXNpbmcgUGh5c2ljYWxDYW1lcmFTZXR0aW5ncyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6UGh5c2ljYWxDYW1lcmFTZXR0aW5nczsKK3VzaW5nIFN1Ym1pdEluZm8gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlN1Ym1pdEluZm87Cit1c2luZyBDYXB0dXJlUmVzdWx0RXh0cmFzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYXB0dXJlUmVzdWx0RXh0cmFzOwordXNpbmcgRXJyb3JDb2RlID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpFcnJvckNvZGU7Cit1c2luZyBGbXFTaXplT3JNZXRhZGF0YSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Rm1xU2l6ZU9yTWV0YWRhdGE7Cit1c2luZyBTdHJlYW1Db25maWd1cmF0aW9uTW9kZSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6U3RyZWFtQ29uZmlndXJhdGlvbk1vZGU7Cit1c2luZyBTdGF0dXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlN0YXR1czsKK3VzaW5nIFJlc3VsdE1ldGFkYXRhUXVldWUgPSBoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPjsKK3VzaW5nIFJlcXVlc3RNZXRhZGF0YVF1ZXVlID0gaGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT47Cit1c2luZyBDYW1lcmFTdGF0dXNBbmRJZCA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OkNhbWVyYVN0YXR1c0FuZElkOworCit1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyB1dGlsczo6bmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlcjsKK3VzaW5nIHV0aWxzOjpDYXB0dXJlUmVxdWVzdDsKK3VzaW5nIHV0aWxzOjpPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlcjsKKworLy8gV3JhcCBBQ2FtZXJhQ2FwdHVyZUZhaWx1cmUgc28gaXQgY2FuIGJlIHJlZi1jb3VudGVkCitzdHJ1Y3QgQ2FtZXJhQ2FwdHVyZUZhaWx1cmUgOiBwdWJsaWMgUmVmQmFzZSwgcHVibGljIEFDYW1lcmFDYXB0dXJlRmFpbHVyZSB7IH07CisKKy8vIFdyYXAgUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyBzbyB0aGF0IGl0IGNhbiBiZSByZWYtY291bnRlZAorc3RydWN0IFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9Mb2NhbCB7CisgICAgc3RkOjpzdHJpbmcgcGh5c2ljYWxDYW1lcmFJZDsKKyAgICBDYW1lcmFNZXRhZGF0YSBwaHlzaWNhbE1ldGFkYXRhOworfTsKKworc3RydWN0IEFDYW1lcmFQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgQUNhbWVyYVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8oY29uc3Qgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb0xvY2FsPiYgaW5mbywKKyAgICAgICAgICAgIGludDY0X3QgZnJhbWVOdW1iZXIpIDoKKyAgICAgICAgbVBoeXNpY2FsUmVzdWx0SW5mbyhpbmZvKSwgbUZyYW1lTnVtYmVyKGZyYW1lTnVtYmVyKSB7fQorCisgICAgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb0xvY2FsPiBtUGh5c2ljYWxSZXN1bHRJbmZvOworICAgIGludDY0X3QgbUZyYW1lTnVtYmVyOworfTsKKworY2xhc3MgQ2FtZXJhRGV2aWNlIGZpbmFsIDogcHVibGljIFJlZkJhc2UgeworICBwdWJsaWM6CisgICAgQ2FtZXJhRGV2aWNlKGNvbnN0IGNoYXIqIGlkLCBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzKiBjYiwKKyAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMsCisgICAgICAgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlKiB3cmFwcGVyKTsKKyAgICB+Q2FtZXJhRGV2aWNlKCk7CisKKyAgICBpbmxpbmUgY29uc3QgY2hhciogZ2V0SWQoKSBjb25zdCB7IHJldHVybiBtQ2FtZXJhSWQuY19zdHIoKTsgfQorCisgICAgY2FtZXJhX3N0YXR1c190IGNyZWF0ZUNhcHR1cmVSZXF1ZXN0KAorICAgICAgICAgICAgQUNhbWVyYURldmljZV9yZXF1ZXN0X3RlbXBsYXRlIHRlbXBsYXRlSWQsCisgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0KSBjb25zdDsKKworICAgIGNhbWVyYV9zdGF0dXNfdCBjcmVhdGVDYXB0dXJlU2Vzc2lvbigKKyAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogICAgICAgb3V0cHV0cywKKyAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMsCisgICAgICAgICAgICBjb25zdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RhdGVDYWxsYmFja3MqIGNhbGxiYWNrcywKKyAgICAgICAgICAgIC8qb3V0Ki9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24qKiBzZXNzaW9uKTsKKworICAgIC8vIENhbGxiYWNrcyBmcm9tIGNhbWVyYSBzZXJ2aWNlCisgICAgY2xhc3MgU2VydmljZUNhbGxiYWNrIDogcHVibGljIElDYW1lcmFEZXZpY2VDYWxsYmFjayB7CisgICAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IFNlcnZpY2VDYWxsYmFjayhDYW1lcmFEZXZpY2UqIGRldmljZSkgOiBtRGV2aWNlKGRldmljZSkge30KKyAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiBvbkRldmljZUVycm9yKEVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIG92ZXJyaWRlOworICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IG9uRGV2aWNlSWRsZSgpIG92ZXJyaWRlOworICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IG9uQ2FwdHVyZVN0YXJ0ZWQoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdGltZXN0YW1wKSBvdmVycmlkZTsKKyAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiBvblJlc3VsdFJlY2VpdmVkKGNvbnN0IEZtcVNpemVPck1ldGFkYXRhJiByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgcGh5c2ljYWxSZXN1bHRJbmZvcykgb3ZlcnJpZGU7CisgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gb25SZXBlYXRpbmdSZXF1ZXN0RXJyb3IodWludDY0X3QgbGFzdEZyYW1lTnVtYmVyLAorICAgICAgICAgICAgICAgIGludDMyX3Qgc3RvcHBlZFNlcXVlbmNlSWQpIG92ZXJyaWRlOworICAgICAgcHJpdmF0ZToKKyAgICAgICAgY2FtZXJhX3N0YXR1c190IHJlYWRPbmVSZXN1bHRNZXRhZGF0YShjb25zdCBGbXFTaXplT3JNZXRhZGF0YSYgZm1xU2l6ZU9yTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgUmVzdWx0TWV0YWRhdGFRdWV1ZSogbWV0YWRhdGFRdWV1ZSwgQ2FtZXJhTWV0YWRhdGEqIG1ldGFkYXRhKTsKKyAgICAgICAgY29uc3Qgd3A8Q2FtZXJhRGV2aWNlPiBtRGV2aWNlOworICAgIH07CisgICAgaW5saW5lIHNwPElDYW1lcmFEZXZpY2VDYWxsYmFjaz4gZ2V0U2VydmljZUNhbGxiYWNrKCkgeworICAgICAgICByZXR1cm4gbVNlcnZpY2VDYWxsYmFjazsKKyAgICB9OworCisgICAgLy8gQ2FtZXJhIGRldmljZSBpcyBvbmx5IGZ1bmN0aW9uYWwgYWZ0ZXIgcmVtb3RlIGJlaW5nIHNldAorICAgIHZvaWQgc2V0UmVtb3RlRGV2aWNlKHNwPElDYW1lcmFEZXZpY2VVc2VyPiByZW1vdGUpOworCisgICAgYm9vbCBzZXREZXZpY2VNZXRhZGF0YVF1ZXVlcygpOworICAgIGlubGluZSBBQ2FtZXJhRGV2aWNlKiBnZXRXcmFwcGVyKCkgY29uc3QgeyByZXR1cm4gbVdyYXBwZXI7IH07CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgQUNhbWVyYUNhcHR1cmVTZXNzaW9uOworCisgICAgY2FtZXJhX3N0YXR1c190IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpIGNvbnN0OworCisgICAgLy8gZGV2aWNlIGdvZXMgaW50byBmYXRhbCBlcnJvciBzdGF0ZSBhZnRlciB0aGlzCisgICAgdm9pZCBzZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChjYW1lcmFfc3RhdHVzX3QgZXJyb3IpOworCisgICAgdm9pZCBkaXNjb25uZWN0TG9ja2VkKHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4mIHNlc3Npb24pOyAvLyBkaXNjb25uZWN0IGZyb20gY2FtZXJhIHNlcnZpY2UKKworICAgIGNhbWVyYV9zdGF0dXNfdCBzdG9wUmVwZWF0aW5nTG9ja2VkKCk7CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgZmx1c2hMb2NrZWQoQUNhbWVyYUNhcHR1cmVTZXNzaW9uKik7CisKKyAgICBjYW1lcmFfc3RhdHVzX3Qgd2FpdFVudGlsSWRsZUxvY2tlZCgpOworCisgICAgdGVtcGxhdGU8Y2xhc3MgVD4KKyAgICBjYW1lcmFfc3RhdHVzX3QgY2FwdHVyZUxvY2tlZChzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCisgICAgICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCisgICAgICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCk7CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPgorICAgIGNhbWVyYV9zdGF0dXNfdCBzZXRSZXBlYXRpbmdSZXF1ZXN0c0xvY2tlZChzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCisgICAgICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCisgICAgICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCk7CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPgorICAgIGNhbWVyYV9zdGF0dXNfdCBzdWJtaXRSZXF1ZXN0c0xvY2tlZCgKKyAgICAgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKKyAgICAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgICAgICAvKm91dCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCwKKyAgICAgICAgICAgIGJvb2wgaXNSZXBlYXRpbmcpOworCisgICAgdm9pZCBhZGRSZXF1ZXN0U2V0dGluZ3NNZXRhZGF0YShBQ2FwdHVyZVJlcXVlc3QgKmFDYXB0dXJlUmVxdWVzdCwgc3A8Q2FwdHVyZVJlcXVlc3Q+ICZyZXEpOworCisgICAgY2FtZXJhX3N0YXR1c190IHVwZGF0ZU91dHB1dENvbmZpZ3VyYXRpb25Mb2NrZWQoQUNhcHR1cmVTZXNzaW9uT3V0cHV0ICpvdXRwdXQpOworCisgICAgY2FtZXJhX3N0YXR1c190IGFsbG9jYXRlQ2FwdHVyZVJlcXVlc3QoCisgICAgICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIHNwPENhcHR1cmVSZXF1ZXN0PiYgb3V0UmVxKTsKKworICAgIHN0YXRpYyBBQ2FwdHVyZVJlcXVlc3QqIGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHNwPENhcHR1cmVSZXF1ZXN0PiYgcmVxKTsKKyAgICBzdGF0aWMgdm9pZCBmcmVlQUNhcHR1cmVSZXF1ZXN0KEFDYXB0dXJlUmVxdWVzdCopOworCisgICAgLy8gb25seSBGb3Igc2Vzc2lvbiB0byBob2xkIGRldmljZSBsb2NrCisgICAgLy8gQWx3YXlzIGdyYWIgZGV2aWNlIGxvY2sgYmVmb3JlIGdyYWJiaW5nIHNlc3Npb24gbG9jaworICAgIHZvaWQgbG9ja0RldmljZUZvclNlc3Npb25PcHMoKSBjb25zdCB7IG1EZXZpY2VMb2NrLmxvY2soKTsgfTsKKyAgICB2b2lkIHVubG9ja0RldmljZSgpIGNvbnN0IHsgbURldmljZUxvY2sudW5sb2NrKCk7IH07CisKKyAgICAvLyBGb3IgY2FwdHVyZSBzZXNzaW9uIHRvIG5vdGlmeSBpdHMgZW5kIG9mIGxpZmUKKyAgICB2b2lkIG5vdGlmeVNlc3Npb25FbmRPZkxpZmVMb2NrZWQoQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uKTsKKworICAgIGNhbWVyYV9zdGF0dXNfdCBjb25maWd1cmVTdHJlYW1zTG9ja2VkKGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogb3V0cHV0cywKKyAgICAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiBzZXNzaW9uUGFyYW1ldGVycyk7CisKKyAgICAvLyBJbnB1dCBtZXNzYWdlIHdpbGwgYmUgcG9zdGVkIGFuZCBjbGVhcmVkIGFmdGVyIHRoaXMgcmV0dXJucworICAgIHZvaWQgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKHNwPEFNZXNzYWdlPiYgbXNnKTsKKworICAgIG11dGFibGUgTXV0ZXggbURldmljZUxvY2s7CisgICAgY29uc3QgaGlkbF9zdHJpbmcgbUNhbWVyYUlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FtZXJhIElECisgICAgY29uc3QgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyBtQXBwQ2FsbGJhY2tzOyAvLyBDYWxsYmFjayB0byBhcHAKKyAgICBjb25zdCBzcDxBQ2FtZXJhTWV0YWRhdGE+IG1DaGFyczsgICAgLy8gQ2FtZXJhIGNoYXJhY3RlcmlzdGljcworICAgIGNvbnN0IHNwPFNlcnZpY2VDYWxsYmFjaz4gbVNlcnZpY2VDYWxsYmFjazsKKyAgICBBQ2FtZXJhRGV2aWNlKiBtV3JhcHBlcjsKKworICAgIC8vIHN0cmVhbSBpZCAtPiBwYWlyIG9mIChBQ2FtZXJhV2luZG93VHlwZSogZnJvbSBhcHBsaWNhdGlvbiwgT3V0cHV0Q29uZmlndXJhdGlvbiB1c2VkIGZvcgorICAgIC8vIGNhbWVyYSBzZXJ2aWNlKQorICAgIHN0ZDo6bWFwPGludCwgc3RkOjpwYWlyPG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIsIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyPj4gbUNvbmZpZ3VyZWRPdXRwdXRzOworCisgICAgLy8gVE9ETzogbWF5YmUgYSBib29sIHdpbGwgc3VmZmljZSBmb3Igc3luY2hyb25vdXMgaW1wbGVtZW50YXRpb24/CisgICAgc3RkOjphdG9taWNfYm9vbCBtQ2xvc2luZzsKKyAgICBpbmxpbmUgYm9vbCBpc0Nsb3NlZCgpIHsgcmV0dXJuIG1DbG9zaW5nOyB9CisKKyAgICBib29sIG1JbkVycm9yID0gZmFsc2U7CisgICAgY2FtZXJhX3N0YXR1c190IG1FcnJvciA9IEFDQU1FUkFfT0s7CisgICAgdm9pZCBvbkNhcHR1cmVFcnJvckxvY2tlZCgKKyAgICAgICAgICAgIEVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpOworCisgICAgYm9vbCBtSWRsZSA9IHRydWU7CisgICAgLy8gVGhpcyB3aWxsIGF2b2lkIGEgYnVzeSBzZXNzaW9uIGJlaW5nIGRlbGV0ZWQgYmVmb3JlIGl0J3MgYmFjayB0byBpZGxlIHN0YXRlCisgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBtQnVzeVNlc3Npb247CisKKyAgICBzcDxJQ2FtZXJhRGV2aWNlVXNlcj4gbVJlbW90ZTsKKworICAgIC8vIExvb3BlciB0aHJlYWQgdG8gaGFuZGxlIGNhbGxiYWNrIHRvIGFwcAorICAgIHNwPEFMb29wZXI+IG1DYkxvb3BlcjsKKyAgICAvLyBkZWZpbml0aW9uIG9mIGhhbmRsZXIgYW5kIG1lc3NhZ2UKKyAgICBlbnVtIHsKKyAgICAgICAgLy8gRGV2aWNlIHN0YXRlIGNhbGxiYWNrcworICAgICAgICBrV2hhdE9uRGlzY29ubmVjdGVkLCAgIC8vIG9uRGlzY29ubmVjdGVkCisgICAgICAgIGtXaGF0T25FcnJvciwgICAgICAgICAgLy8gb25FcnJvcgorICAgICAgICAvLyBTZXNzaW9uIHN0YXRlIGNhbGxiYWNrcworICAgICAgICBrV2hhdFNlc3Npb25TdGF0ZUNiLCAgIC8vIG9uUmVhZHksIG9uQWN0aXZlCisgICAgICAgIC8vIENhcHR1cmUgY2FsbGJhY2tzCisgICAgICAgIGtXaGF0Q2FwdHVyZVN0YXJ0LCAgICAgLy8gb25DYXB0dXJlU3RhcnRlZAorICAgICAgICBrV2hhdENhcHR1cmVSZXN1bHQsICAgIC8vIG9uQ2FwdHVyZVByb2dyZXNzZWQsIG9uQ2FwdHVyZUNvbXBsZXRlZAorICAgICAgICBrV2hhdExvZ2ljYWxDYXB0dXJlUmVzdWx0LCAvLyBvbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkCisgICAgICAgIGtXaGF0Q2FwdHVyZUZhaWwsICAgICAgLy8gb25DYXB0dXJlRmFpbGVkCisgICAgICAgIGtXaGF0Q2FwdHVyZVNlcUVuZCwgICAgLy8gb25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQKKyAgICAgICAga1doYXRDYXB0dXJlU2VxQWJvcnQsICAvLyBvbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQKKyAgICAgICAga1doYXRDYXB0dXJlQnVmZmVyTG9zdCwvLyBvbkNhcHR1cmVCdWZmZXJMb3N0CisgICAgICAgIC8vIEludGVybmFsIGNsZWFudXAKKyAgICAgICAga1doYXRDbGVhblVwU2Vzc2lvbnMgICAvLyBDbGVhbnVwIGNhY2hlZCBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+CisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0NvbnRleHRLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtEZXZpY2VLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtFcnJvckNvZGVLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYWxsYmFja0ZwS2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrU2Vzc2lvblNwS2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ2FwdHVyZVJlcXVlc3RLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtUaW1lU3RhbXBLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYXB0dXJlUmVzdWx0S2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrUGh5c2ljYWxDYXB0dXJlUmVzdWx0S2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ2FwdHVyZUZhaWx1cmVLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtTZXF1ZW5jZUlkS2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrRnJhbWVOdW1iZXJLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtBbndLZXk7CisKKyAgICBjbGFzcyBDYWxsYmFja0hhbmRsZXIgOiBwdWJsaWMgQUhhbmRsZXIgeworICAgICAgcHVibGljOgorICAgICAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKKworICAgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gVGhpcyBoYW5kbGVyIHdpbGwgY2FjaGUgYWxsIGNhcHR1cmUgc2Vzc2lvbiBzcCB1bnRpbCBrV2hhdENsZWFuVXBTZXNzaW9ucworICAgICAgICAvLyBpcyBwcm9jZXNzZWQuIFRoaXMgaXMgdXNlZCB0byBndWFyYW50ZWUgdGhlIGxhc3Qgc2Vzc2lvbiByZWZlcmVuY2UgaXMgYWx3YXlzCisgICAgICAgIC8vIGJlaW5nIHJlbW92ZWQgaW4gY2FsbGJhY2sgdGhyZWFkIHdpdGhvdXQgaG9sZGluZyBjYW1lcmEgZGV2aWNlIGxvY2sKKyAgICAgICAgVmVjdG9yPHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4+IG1DYWNoZWRTZXNzaW9uczsKKyAgICB9OworICAgIHNwPENhbGxiYWNrSGFuZGxlcj4gbUhhbmRsZXI7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBDYXB0dXJlIHNlc3Npb24gcmVsYXRlZCBtZW1iZXJzICoKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLy8gVGhlIGN1cnJlbnQgYWN0aXZlIHNlc3Npb24KKyAgICB3cDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IG1DdXJyZW50U2Vzc2lvbjsKKyAgICBib29sIG1GbHVzaGluZyA9IGZhbHNlOworCisgICAgaW50IG1OZXh0U2Vzc2lvbklkID0gMDsKKyAgICAvLyBUT0RPOiBtaWdodCBuZWVkIGFub3RoZXIgbG9vcGVyL2hhbmRsZXIgdG8gaGFuZGxlIGNhbGxiYWNrcyBmcm9tIHNlcnZpY2UKKworICAgIHN0YXRpYyBjb25zdCBpbnQgUkVRVUVTVF9JRF9OT05FID0gLTE7CisgICAgaW50IG1SZXBlYXRpbmdTZXF1ZW5jZUlkID0gUkVRVUVTVF9JRF9OT05FOworCisgICAgLy8gc2VxdWVuY2UgaWQgLT4gbGFzdCBmcmFtZSBudW1iZXIgbWFwCisgICAgc3RkOjptYXA8aW50MzJfdCwgaW50NjRfdD4gbVNlcXVlbmNlTGFzdEZyYW1lTnVtYmVyTWFwOworCisgICAgc3RydWN0IENhbGxiYWNrSG9sZGVyIHsKKyAgICAgICAgQ2FsbGJhY2tIb2xkZXIoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgICAgICAgICBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+PiYgIHJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzKTsKKyAgICAgICAgQ2FsbGJhY2tIb2xkZXIoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgICAgICAgICBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+PiYgIHJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzKiBsY2JzKTsKKworICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICAgICAgdm9pZCBpbml0Q2FwdHVyZUNhbGxiYWNrcyhUKiBjYnMpIHsKKyAgICAgICAgICAgIG1Db250ZXh0ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVTdGFydGVkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVQcm9ncmVzc2VkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVDb21wbGV0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZUZhaWxlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlQnVmZmVyTG9zdCA9IG51bGxwdHI7CisgICAgICAgICAgICBpZiAoY2JzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBtQ29udGV4dCA9IGNicy0+Y29udGV4dDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlU3RhcnRlZCA9IGNicy0+b25DYXB0dXJlU3RhcnRlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlUHJvZ3Jlc3NlZCA9IGNicy0+b25DYXB0dXJlUHJvZ3Jlc3NlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlRmFpbGVkID0gY2JzLT5vbkNhcHR1cmVGYWlsZWQ7CisgICAgICAgICAgICAgICAgbU9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkID0gY2JzLT5vbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkID0gY2JzLT5vbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQ7CisgICAgICAgICAgICAgICAgbU9uQ2FwdHVyZUJ1ZmZlckxvc3QgPSBjYnMtPm9uQ2FwdHVyZUJ1ZmZlckxvc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgbVNlc3Npb247CisgICAgICAgIFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4+ICBtUmVxdWVzdHM7CisgICAgICAgIGNvbnN0IGJvb2wgICAgICAgICAgICAgICAgICBtSXNSZXBlYXRpbmc7CisgICAgICAgIGNvbnN0IGJvb2wgICAgICAgICAgICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2s7CisKKyAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0OworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3N0YXJ0IG1PbkNhcHR1cmVTdGFydGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBtT25DYXB0dXJlUHJvZ3Jlc3NlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgbU9uQ2FwdHVyZUNvbXBsZXRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBtT25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgbU9uQ2FwdHVyZUZhaWxlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zZXF1ZW5jZUVuZCBtT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc2VxdWVuY2VBYm9ydCBtT25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2J1ZmZlckxvc3QgbU9uQ2FwdHVyZUJ1ZmZlckxvc3Q7CisgICAgfTsKKyAgICAvLyBzZXF1ZW5jZSBpZCAtPiBjYWxsYmFja3MgbWFwCisgICAgc3RkOjptYXA8aW50LCBDYWxsYmFja0hvbGRlcj4gbVNlcXVlbmNlQ2FsbGJhY2tNYXA7CisKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBOT19GUkFNRVNfQ0FQVFVSRUQgPSAtMTsKKyAgICBjbGFzcyBGcmFtZU51bWJlclRyYWNrZXIgeworICAgICAgcHVibGljOgorICAgICAgICAvLyBUT0RPOiBDYWxsZWQgaW4gb25SZXN1bHRSZWNlaXZlZCBhbmQgb25DYXB0dXJlRXJyb3JMb2NrZWQKKyAgICAgICAgdm9pZCB1cGRhdGVUcmFja2VyKGludDY0X3QgZnJhbWVOdW1iZXIsIGJvb2wgaXNFcnJvcik7CisgICAgICAgIGlubGluZSBpbnQ2NF90IGdldENvbXBsZXRlZEZyYW1lTnVtYmVyKCkgeyByZXR1cm4gbUNvbXBsZXRlZEZyYW1lTnVtYmVyOyB9CisgICAgICBwcml2YXRlOgorICAgICAgICB2b2lkIHVwZGF0ZSgpOworICAgICAgICB2b2lkIHVwZGF0ZUNvbXBsZXRlZEZyYW1lTnVtYmVyKGludDY0X3QgZnJhbWVOdW1iZXIpOworCisgICAgICAgIGludDY0X3QgbUNvbXBsZXRlZEZyYW1lTnVtYmVyID0gTk9fRlJBTUVTX0NBUFRVUkVEOworICAgICAgICBMaXN0PGludDY0X3Q+IG1Ta2lwcGVkRnJhbWVOdW1iZXJzOworICAgICAgICBzdGQ6OnNldDxpbnQ2NF90PiBtRnV0dXJlRXJyb3JTZXQ7CisgICAgfTsKKyAgICBGcmFtZU51bWJlclRyYWNrZXIgbUZyYW1lTnVtYmVyVHJhY2tlcjsKKworICAgIHZvaWQgY2hlY2tSZXBlYXRpbmdTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKGNvbnN0IGludCBzZXF1ZW5jZUlkLCBjb25zdCBpbnQ2NF90IGxhc3RGcmFtZU51bWJlcik7CisgICAgdm9pZCBjaGVja0FuZEZpcmVTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKCk7CisKKyAgICAvLyBNaXNjIHZhcmlhYmxlcworICAgIGludDMyX3QgbVNoYWRpbmdNYXBTaXplWzJdOyAgIC8vIGNvbnN0IGFmdGVyIGNvbnN0cnVjdG9yCisgICAgaW50MzJfdCBtUGFydGlhbFJlc3VsdENvdW50OyAgLy8gY29uc3QgYWZ0ZXIgY29uc3RydWN0b3IKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UmVzdWx0TWV0YWRhdGFRdWV1ZT4gbUNhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZSA9IG51bGxwdHI7CisgICAgc3RkOjpzaGFyZWRfcHRyPFJlc3VsdE1ldGFkYXRhUXVldWU+IG1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IG51bGxwdHI7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhY2FtOworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZDsKKworLyoqCisgKiBBQ2FtZXJhRGV2aWNlIG9wYXF1ZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICogTGVhdmUgb3V0c2lkZSBvZiBhbmRyb2lkIG5hbWVzcGFjZSBiZWNhdXNlIGl0J3MgTkRLIHN0cnVjdAorICovCitzdHJ1Y3QgQUNhbWVyYURldmljZSB7CisgICAgQUNhbWVyYURldmljZShjb25zdCBjaGFyKiBpZCwgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyogY2IsCisgICAgICAgICAgICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IGNoYXJzKSA6CisgICAgICAgICAgICBtRGV2aWNlKG5ldyBhbmRyb2lkOjphY2FtOjpDYW1lcmFEZXZpY2UoaWQsIGNiLCBzdGQ6Om1vdmUoY2hhcnMpLCB0aGlzKSkge30KKworICAgIH5BQ2FtZXJhRGV2aWNlKCkge307CisKKyAgICAvKioqKioqKioqKioqKioqKioqKgorICAgICAqIE5ESyBwdWJsaWMgQVBJcyAqCisgICAgICoqKioqKioqKioqKioqKioqKiovCisgICAgaW5saW5lIGNvbnN0IGNoYXIqIGdldElkKCkgY29uc3QgeyByZXR1cm4gbURldmljZS0+Z2V0SWQoKTsgfQorCisgICAgY2FtZXJhX3N0YXR1c190IGNyZWF0ZUNhcHR1cmVSZXF1ZXN0KAorICAgICAgICAgICAgQUNhbWVyYURldmljZV9yZXF1ZXN0X3RlbXBsYXRlIHRlbXBsYXRlSWQsCisgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0KSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRGV2aWNlLT5jcmVhdGVDYXB0dXJlUmVxdWVzdCh0ZW1wbGF0ZUlkLCByZXF1ZXN0KTsKKyAgICB9CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgY3JlYXRlQ2FwdHVyZVNlc3Npb24oCisgICAgICAgICAgICBjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqICAgICAgIG91dHB1dHMsCisgICAgICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHNlc3Npb25QYXJhbWV0ZXJzLAorICAgICAgICAgICAgY29uc3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzKiBjYWxsYmFja3MsCisgICAgICAgICAgICAvKm91dCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiogc2Vzc2lvbikgeworICAgICAgICByZXR1cm4gbURldmljZS0+Y3JlYXRlQ2FwdHVyZVNlc3Npb24ob3V0cHV0cywgc2Vzc2lvblBhcmFtZXRlcnMsIGNhbGxiYWNrcywgc2Vzc2lvbik7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogRGV2aWNlIGludGVyYWwgQVBJcyAqCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlubGluZSBhbmRyb2lkOjpzcDxhbmRyb2lkOjphY2FtOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+IGdldFNlcnZpY2VDYWxsYmFjaygpIHsKKyAgICAgICAgcmV0dXJuIG1EZXZpY2UtPmdldFNlcnZpY2VDYWxsYmFjaygpOworICAgIH07CisKKyAgICAvLyBDYW1lcmEgZGV2aWNlIGlzIG9ubHkgZnVuY3Rpb25hbCBhZnRlciByZW1vdGUgYmVpbmcgc2V0CisgICAgaW5saW5lIHZvaWQgc2V0UmVtb3RlRGV2aWNlKGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OmFjYW06OklDYW1lcmFEZXZpY2VVc2VyPiByZW1vdGUpIHsKKyAgICAgICAgbURldmljZS0+c2V0UmVtb3RlRGV2aWNlKHJlbW90ZSk7CisgICAgfQorICAgIGlubGluZSBib29sIHNldERldmljZU1ldGFkYXRhUXVldWVzKCkgeworICAgICAgICByZXR1cm4gbURldmljZS0+c2V0RGV2aWNlTWV0YWRhdGFRdWV1ZXMoKTsKKyAgICB9CisgIHByaXZhdGU6CisgICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6YWNhbTo6Q2FtZXJhRGV2aWNlPiBtRGV2aWNlOworfTsKKworI2VuZGlmIC8vIF9BQ0FNRVJBX0RFVklDRV9ICmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlVmVuZG9yLmluYyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2VWZW5kb3IuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMjMwNGUKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlVmVuZG9yLmluYwpAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC9JQ2FtZXJhU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxDYW1lcmFNZXRhZGF0YS5oPgorCisjaW5jbHVkZSAibmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuaCIKKyNpbmNsdWRlICJBQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKKyNpbmNsdWRlICJBQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJBQ2FwdHVyZVJlcXVlc3QuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0geworCit0ZW1wbGF0ZTxjbGFzcyBUPgorY2FtZXJhX3N0YXR1c190CitDYW1lcmFEZXZpY2U6OmNhcHR1cmVMb2NrZWQoCisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgcmV0dXJuIHN1Ym1pdFJlcXVlc3RzTG9ja2VkKAorICAgICAgICAgICAgc2Vzc2lvbiwgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkLCAvKmlzUmVwZWF0aW5nKi9mYWxzZSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6c2V0UmVwZWF0aW5nUmVxdWVzdHNMb2NrZWQoCisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgcmV0dXJuIHN1Ym1pdFJlcXVlc3RzTG9ja2VkKAorICAgICAgICAgICAgc2Vzc2lvbiwgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkLCAvKmlzUmVwZWF0aW5nKi90cnVlKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVD4KK2NhbWVyYV9zdGF0dXNfdCBDYW1lcmFEZXZpY2U6OnN1Ym1pdFJlcXVlc3RzTG9ja2VkKAorICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCisgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKKyAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgLypvdXQqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQsCisgICAgICAgIGJvb2wgaXNSZXBlYXRpbmcpCit7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN1Ym1pdCBjYXB0dXJlIHJlcXVlc3QgZmFpbGVkISByZXQgJWQiLCBnZXRJZCgpLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8vIEZvcm0gdHdvIHZlY3RvcnMgb2YgY2FwdHVyZSByZXF1ZXN0LCBvbmUgZm9yIGludGVybmFsIHRyYWNraW5nCisgICAgc3RkOjp2ZWN0b3I8ZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdExpc3Q7CisgICAgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0Pj4gcmVxdWVzdHNWOworICAgIHJlcXVlc3RzVi5zZXRDYXBhY2l0eShudW1SZXF1ZXN0cyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1SZXF1ZXN0czsgaSsrKSB7CisgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXE7CisgICAgICAgIHJldCA9IGFsbG9jYXRlQ2FwdHVyZVJlcXVlc3QocmVxdWVzdHNbaV0sIHJlcSk7CisgICAgICAgIC8vIFdlIG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCBzaW5jZSBhZnRlciBzdWJtaXRSZXF1ZXN0TGlzdCBpcyBjYWxsZWQsCisgICAgICAgIC8vIHRoZSByZXF1ZXN0IG1ldGFkYXRhIHF1ZXVlIG1pZ2h0IGhhdmUgcmVtb3ZlZCB0aGUgY2FwdHVyZSByZXF1ZXN0CisgICAgICAgIC8vIG1ldGFkYXRhLiBUaGVyZWZvcmUgd2Ugc2ltcGx5IGFkZCB0aGUgbWV0YWRhdGEgdG8gaXRzIHdyYXBwZXIgY2xhc3MsCisgICAgICAgIC8vIHNvIHRoYXQgaXQgY2FuIGJlIHJldHJpZXZlZCBsYXRlci4KKyAgICAgICAgYWRkUmVxdWVzdFNldHRpbmdzTWV0YWRhdGEocmVxdWVzdHNbaV0sIHJlcSk7CisgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkNvbnZlcnQgY2FwdHVyZSByZXF1ZXN0IHRvIGludGVybmFsIGZvcm1hdCBmYWlsdXJlISByZXQgJWQiLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVxLT5tQ2FwdHVyZVJlcXVlc3Quc3RyZWFtQW5kV2luZG93SWRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2FwdHVyZSByZXF1ZXN0IHdpdGhvdXQgb3V0cHV0IHRhcmdldCBjYW5ub3QgYmUgc3VibWl0dGVkISIpOworICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgIH0KKyAgICAgICAgcmVxdWVzdExpc3QucHVzaF9iYWNrKHV0aWxzOjpjb252ZXJ0VG9IaWRsKHJlcS5nZXQoKSkpOworICAgICAgICByZXF1ZXN0c1YucHVzaF9iYWNrKHJlcSk7CisgICAgfQorICAgIGlmIChpc1JlcGVhdGluZykgeworICAgICAgICByZXQgPSBzdG9wUmVwZWF0aW5nTG9ja2VkKCk7CisgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBzdG9wIHJlcGVhdGluZyBmYWlsZWQhIHJldCAlZCIsIGdldElkKCksIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgU3VibWl0SW5mbyBpbmZvOworICAgIFN0YXR1cyBzdGF0dXM7CisgICAgYXV0byByZW1vdGVSZXQgPSBtUmVtb3RlLT5zdWJtaXRSZXF1ZXN0TGlzdChyZXF1ZXN0TGlzdCwgaXNSZXBlYXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJnN0YXR1cywgJmluZm9dKGF1dG8gcywgYXV0byAmc3VibWl0SW5mbykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IHN1Ym1pdEluZm87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBmb3Igc3VibWl0UmVxdWVzdExpc3QgY2FsbDogJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgIHJlbW90ZVJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgIH0KKyAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGwoc3RhdHVzKTsKKyAgICB9CisgICAgaW50MzJfdCBzZXF1ZW5jZUlkID0gaW5mby5yZXF1ZXN0SWQ7CisgICAgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIgPSBpbmZvLmxhc3RGcmFtZU51bWJlcjsKKyAgICBpZiAoc2VxdWVuY2VJZCA8IDApIHsKKyAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBzdWJtaXQgcmVxdWVzdCByZW1vdGUgZmFpbHVyZTogcmV0ICVkIiwgZ2V0SWQoKSwgc2VxdWVuY2VJZCk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1VOS05PV047CisgICAgfQorCisgICAgQ2FsbGJhY2tIb2xkZXIgY2JIb2xkZXIoc2Vzc2lvbiwgcmVxdWVzdHNWLCBpc1JlcGVhdGluZywgY2JzKTsKKyAgICBtU2VxdWVuY2VDYWxsYmFja01hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoc2VxdWVuY2VJZCwgY2JIb2xkZXIpKTsKKyAgICBpZiAoaXNSZXBlYXRpbmcpIHsKKyAgICAgICAgLy8gc3RvcFJlcGVhdGluZyBhYm92ZSBzaG91bGQgaGF2ZSBjbGVhbnVwIHJlcGVhdGluZyBzZXF1ZW5jZSBpZAorICAgICAgICBpZiAobVJlcGVhdGluZ1NlcXVlbmNlSWQgIT0gUkVRVUVTVF9JRF9OT05FKSB7CisgICAgICAgICAgICBzZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0UpOworICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRTsKKyAgICAgICAgfQorICAgICAgICBtUmVwZWF0aW5nU2VxdWVuY2VJZCA9IHNlcXVlbmNlSWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVNlcXVlbmNlTGFzdEZyYW1lTnVtYmVyTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihzZXF1ZW5jZUlkLCBsYXN0RnJhbWVOdW1iZXIpKTsKKyAgICB9CisKKyAgICBpZiAobUlkbGUpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlc3Npb25TdGF0ZUNiLCBtSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgc2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2suY29udGV4dCk7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgc2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2sub25BY3RpdmUpOworICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICB9CisgICAgbUlkbGUgPSBmYWxzZTsKKyAgICBtQnVzeVNlc3Npb24gPSBzZXNzaW9uOworCisgICAgaWYgKGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgICAgICpjYXB0dXJlU2VxdWVuY2VJZCA9IHNlcXVlbmNlSWQ7CisgICAgfQorICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCit9IC8vIG5hbWVzcGFjZSBhY2FtCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhTWFuYWdlci5jcHAgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhTWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM5NWI0NAotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcApAQCAtMCwwICsxLDQ1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQUNhbWVyYU1hbmFnZXJWZW5kb3IiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSAibmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmgiCisjaW5jbHVkZSAiQUNhbWVyYU1ldGFkYXRhLmgiCisjaW5jbHVkZSAibmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPFZlbmRvclRhZ0Rlc2NyaXB0b3IuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmFjYW07CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKKwordXNpbmcgQ2FtZXJhU3RhdHVzQW5kSWQgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFTdGF0dXNBbmRJZDsKKworLy8gU3RhdGljIG1lbWJlciBkZWZpbml0aW9ucworY29uc3QgY2hhciogQ2FtZXJhTWFuYWdlckdsb2JhbDo6a0NhbWVyYUlkS2V5ICAgPSAiQ2FtZXJhSWQiOworY29uc3QgY2hhciogQ2FtZXJhTWFuYWdlckdsb2JhbDo6a0NhbGxiYWNrRnBLZXkgPSAiQ2FsbGJhY2tGcCI7Citjb25zdCBjaGFyKiBDYW1lcmFNYW5hZ2VyR2xvYmFsOjprQ29udGV4dEtleSAgICA9ICJDYWxsYmFja0NvbnRleHQiOworTXV0ZXggICAgICAgICAgICAgICAgQ2FtZXJhTWFuYWdlckdsb2JhbDo6c0xvY2s7CitDYW1lcmFNYW5hZ2VyR2xvYmFsKiBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpzSW5zdGFuY2UgPSBudWxscHRyOworCitDYW1lcmFNYW5hZ2VyR2xvYmFsJgorQ2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0SW5zdGFuY2UoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHNMb2NrKTsKKyAgICBDYW1lcmFNYW5hZ2VyR2xvYmFsKiBpbnN0YW5jZSA9IHNJbnN0YW5jZTsKKyAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbHB0cikgeworICAgICAgICBpbnN0YW5jZSA9IG5ldyBDYW1lcmFNYW5hZ2VyR2xvYmFsKCk7CisgICAgICAgIHNJbnN0YW5jZSA9IGluc3RhbmNlOworICAgIH0KKyAgICByZXR1cm4gKmluc3RhbmNlOworfQorCitDYW1lcmFNYW5hZ2VyR2xvYmFsOjp+Q2FtZXJhTWFuYWdlckdsb2JhbCgpIHsKKyAgICAvLyBjbGVhciBzSW5zdGFuY2Ugc28gbmV4dCBnZXRJbnN0YW5jZSBjYWxsIGtub3dzIHRvIGNyZWF0ZSBhIG5ldyBvbmUKKyAgICBNdXRleDo6QXV0b2xvY2sgX3NsKHNMb2NrKTsKKyAgICBzSW5zdGFuY2UgPSBudWxscHRyOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1DYW1lcmFTZXJ2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUNhbWVyYVNlcnZpY2UtPnVubGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIpOworICAgICAgICBtQ2FtZXJhU2VydmljZS0+cmVtb3ZlTGlzdGVuZXIobUNhbWVyYVNlcnZpY2VMaXN0ZW5lcik7CisgICAgfQorICAgIG1EZWF0aE5vdGlmaWVyLmNsZWFyKCk7CisgICAgaWYgKG1DYkxvb3BlciAhPSBudWxscHRyKSB7CisgICAgICAgIG1DYkxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXItPmlkKCkpOworICAgICAgICBtQ2JMb29wZXItPnN0b3AoKTsKKyAgICB9CisgICAgbUNiTG9vcGVyLmNsZWFyKCk7CisgICAgbUhhbmRsZXIuY2xlYXIoKTsKKyAgICBtQ2FtZXJhU2VydmljZUxpc3RlbmVyLmNsZWFyKCk7CisgICAgbUNhbWVyYVNlcnZpY2UuY2xlYXIoKTsKK30KKworc3RhdGljIGJvb2wgaXNDYW1lcmFTZXJ2aWNlRGlzYWJsZWQoKSB7CisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIHByb3BlcnR5X2dldCgiY29uZmlnLmRpc2FibGVfY2FtZXJhc2VydmljZSIsIHZhbHVlLCAiMCIpOworICAgIHJldHVybiAoc3RybmNtcCh2YWx1ZSwgIjAiLCAyKSAhPSAwICYmIHN0cm5jYXNlY21wKHZhbHVlLCAiZmFsc2UiLCA2KSAhPSAwKTsKK30KKworLy8gVE9ETzogQWRkIGJhY2sgd2hlbiB2ZW5kb3IgdGFncyBhcmUgc3VwcG9ydGVkIGZvciBsaWJjYW1lcmEybmRrX3ZlbmRvciB3aGVuCisvLyAgICAgICB0aGUgSElETCBpbnRlcmZhY2Ugc3VwcG9ydHMgcXVlcnlpbmcgYnkgdmVuZG9yIGlkLgorCitzcDxJQ2FtZXJhU2VydmljZT4gQ2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0Q2FtZXJhU2VydmljZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtQ2FtZXJhU2VydmljZS5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIGlmIChpc0NhbWVyYVNlcnZpY2VEaXNhYmxlZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbUNhbWVyYVNlcnZpY2U7CisgICAgICAgIH0KKworICAgICAgICBzcDxJQ2FtZXJhU2VydmljZT4gY2FtZXJhU2VydmljZUJpbmRlcjsKKyAgICAgICAgZG8geworICAgICAgICAgICAgY2FtZXJhU2VydmljZUJpbmRlciA9IElDYW1lcmFTZXJ2aWNlOjpnZXRTZXJ2aWNlKCk7CisgICAgICAgICAgICBpZiAoY2FtZXJhU2VydmljZUJpbmRlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVygiQ2FtZXJhU2VydmljZSBub3QgcHVibGlzaGVkLCB3YWl0aW5nLi4uIik7CisgICAgICAgICAgICB1c2xlZXAoa0NhbWVyYVNlcnZpY2VQb2xsRGVsYXkpOworICAgICAgICB9IHdoaWxlKHRydWUpOworICAgICAgICBpZiAobURlYXRoTm90aWZpZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgbURlYXRoTm90aWZpZXIgPSBuZXcgRGVhdGhOb3RpZmllcih0aGlzKTsKKyAgICAgICAgfQorICAgICAgICBjYW1lcmFTZXJ2aWNlQmluZGVyLT5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgMCk7CisgICAgICAgIG1DYW1lcmFTZXJ2aWNlID0gY2FtZXJhU2VydmljZUJpbmRlcjsKKworICAgICAgICAvLyBTZXR1cCBsb29wZXIgdGhyZWFkIHRvIHBlcmZyb20gYXZhaWxpYWJpbGl0eSBjYWxsYmFja3MKKyAgICAgICAgaWYgKG1DYkxvb3BlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtQ2JMb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICAgICAgICAgIG1DYkxvb3Blci0+c2V0TmFtZSgiQzJOLW1nci1sb29wZXIiKTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1DYkxvb3Blci0+c3RhcnQoCisgICAgICAgICAgICAgICAgICAgIC8qcnVuT25DYWxsaW5nVGhyZWFkKi9mYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgLypjYW5DYWxsSmF2YSovICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgIFBSSU9SSVRZX0RFRkFVTFQpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHN0YXJ0IGNhbWVyYSBzZXJ2aWNlIGxpc3RlbmVyIGxvb3BlcjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1lcnIpLCBlcnIpOworICAgICAgICAgICAgICAgIG1DYkxvb3Blci5jbGVhcigpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1IYW5kbGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBDYWxsYmFja0hhbmRsZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DYkxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlZ2lzdGVyIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXIKKyAgICAgICAgaWYgKG1DYW1lcmFTZXJ2aWNlTGlzdGVuZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUNhbWVyYVNlcnZpY2VMaXN0ZW5lciA9IG5ldyBDYW1lcmFTZXJ2aWNlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgaGlkbF92ZWM8Q2FtZXJhU3RhdHVzQW5kSWQ+IGNhbWVyYVN0YXR1c2Vze307CisgICAgICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6Ok5PX0VSUk9SOworICAgICAgICBhdXRvIHJlbW90ZVJldCA9IG1DYW1lcmFTZXJ2aWNlLT5hZGRMaXN0ZW5lcihtQ2FtZXJhU2VydmljZUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJnN0YXR1cywgJmNhbWVyYVN0YXR1c2VzXShTdGF0dXMgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0byAmcmV0U3RhdHVzZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFTdGF0dXNlcyA9IHJldFN0YXR1c2VzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCFyZW1vdGVSZXQuaXNPaygpIHx8IHN0YXR1cyAhPSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFkZCBsaXN0ZW5lciB0byBjYW1lcmEgc2VydmljZSAlcyIsIHJlbW90ZVJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoYXV0byYgYyA6IGNhbWVyYVN0YXR1c2VzKSB7CisgICAgICAgICAgICBvblN0YXR1c0NoYW5nZWRMb2NrZWQoYyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1DYW1lcmFTZXJ2aWNlOworfQorCit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6OkRlYXRoTm90aWZpZXI6OnNlcnZpY2VEaWVkKHVpbnQ2NF90IGNvb2tpZSwgY29uc3Qgd3A8SUJhc2U+ICZ3aG8pIHsKKyAgICAodm9pZCkgY29va2llOworICAgICh2b2lkKSB3aG87CisgICAgQUxPR0UoIkNhbWVyYSBzZXJ2aWNlIGJpbmRlckRpZWQhIik7CisgICAgc3A8Q2FtZXJhTWFuYWdlckdsb2JhbD4gY20gPSBtQ2FtZXJhTWFuYWdlci5wcm9tb3RlKCk7CisgICAgaWYgKGNtICE9IG51bGxwdHIpIHsKKyAgICAgICAgQXV0b011dGV4IGxvY2soY20tPm1Mb2NrKTsKKyAgICAgICAgZm9yIChhdXRvJiBwYWlyIDogY20tPm1EZXZpY2VTdGF0dXNNYXApIHsKKyAgICAgICAgICAgIENhbWVyYVN0YXR1c0FuZElkIGNhbWVyYVN0YXR1c0FuZElkOworICAgICAgICAgICAgY2FtZXJhU3RhdHVzQW5kSWQuY2FtZXJhSWQgPSBwYWlyLmZpcnN0OworICAgICAgICAgICAgY2FtZXJhU3RhdHVzQW5kSWQuZGV2aWNlU3RhdHVzID0gcGFpci5zZWNvbmQ7CisgICAgICAgICAgICBjbS0+b25TdGF0dXNDaGFuZ2VkTG9ja2VkKGNhbWVyYVN0YXR1c0FuZElkKTsKKyAgICAgICAgfQorICAgICAgICBjbS0+bUNhbWVyYVNlcnZpY2UuY2xlYXIoKTsKKyAgICAgICAgLy8gVE9ETzogY29uc2lkZXIgYWRkaW5nIHJlLWNvbm5lY3QgY2FsbCBoZXJlPworICAgIH0KK30KKwordm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpyZWdpc3RlckF2YWlsYWJpbGl0eUNhbGxiYWNrKAorICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3MgKmNhbGxiYWNrKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBDYWxsYmFjayBjYihjYWxsYmFjayk7CisgICAgYXV0byBwYWlyID0gbUNhbGxiYWNrcy5pbnNlcnQoY2IpOworICAgIC8vIFNlbmQgaW5pdGlhbCBjYWxsYmFja3MgaWYgY2FsbGJhY2sgaXMgbmV3bHkgcmVnaXN0ZXJlZAorICAgIGlmIChwYWlyLnNlY29uZCkgeworICAgICAgICBmb3IgKGF1dG8mIHBhaXIgOiBtRGV2aWNlU3RhdHVzTWFwKSB7CisgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgY2FtZXJhSWQgPSBwYWlyLmZpcnN0OworICAgICAgICAgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIHN0YXR1cyA9IHBhaXIuc2Vjb25kOworCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VuZFNpbmdsZUNhbGxiYWNrLCBtSGFuZGxlcik7CisgICAgICAgICAgICBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFjayBjYiA9IGlzU3RhdHVzQXZhaWxhYmxlKHN0YXR1cykgPworICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay0+b25DYW1lcmFBdmFpbGFibGUgOiBjYWxsYmFjay0+b25DYW1lcmFVbmF2YWlsYWJsZTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQgKikgY2IpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYWxsYmFjay0+Y29udGV4dCk7CisgICAgICAgICAgICBtc2ctPnNldFN0cmluZyhrQ2FtZXJhSWRLZXksIEFTdHJpbmcoY2FtZXJhSWQuY19zdHIoKSkpOworICAgICAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhTWFuYWdlckdsb2JhbDo6dW5yZWdpc3RlckF2YWlsYWJpbGl0eUNhbGxiYWNrKAorICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3MgKmNhbGxiYWNrKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBDYWxsYmFjayBjYihjYWxsYmFjayk7CisgICAgbUNhbGxiYWNrcy5lcmFzZShjYik7Cit9CisKK3ZvaWQgQ2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0Q2FtZXJhSWRMaXN0KHN0ZDo6dmVjdG9yPGhpZGxfc3RyaW5nPiogY2FtZXJhSWRzKSB7CisgICAgLy8gRW5zdXJlIHRoYXQgd2UgaGF2ZSBpbml0aWFsaXplZC9yZWZyZXNoZWQgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGRldmljZXMKKyAgICBhdXRvIGNzID0gZ2V0Q2FtZXJhU2VydmljZSgpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICBmb3IoYXV0byYgZGV2aWNlU3RhdHVzIDogbURldmljZVN0YXR1c01hcCkgeworICAgICAgICBpZiAoZGV2aWNlU3RhdHVzLnNlY29uZCA9PSBDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19OT1RfUFJFU0VOVCB8fAorICAgICAgICAgICAgICAgIGRldmljZVN0YXR1cy5zZWNvbmQgPT0gQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfRU5VTUVSQVRJTkcpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGNhbWVyYUlkcy0+cHVzaF9iYWNrKGRldmljZVN0YXR1cy5maXJzdCk7CisgICAgfQorfQorCitib29sIENhbWVyYU1hbmFnZXJHbG9iYWw6OnZhbGlkU3RhdHVzKENhbWVyYURldmljZVN0YXR1cyBzdGF0dXMpIHsKKyAgICBzd2l0Y2ggKHN0YXR1cykgeworICAgICAgICBjYXNlIENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX05PVF9QUkVTRU5UOgorICAgICAgICBjYXNlIENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX1BSRVNFTlQ6CisgICAgICAgIGNhc2UgQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfRU5VTUVSQVRJTkc6CisgICAgICAgIGNhc2UgQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfTk9UX0FWQUlMQUJMRToKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworYm9vbCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjppc1N0YXR1c0F2YWlsYWJsZShDYW1lcmFEZXZpY2VTdGF0dXMgc3RhdHVzKSB7CisgICAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICAgICAgY2FzZSBDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19QUkVTRU5UOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6OkNhbGxiYWNrSGFuZGxlcjo6b25NZXNzYWdlUmVjZWl2ZWQoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0U2VuZFNpbmdsZUNhbGxiYWNrOgorICAgICAgICB7CisgICAgICAgICAgICBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFjayBjYjsKKyAgICAgICAgICAgIHZvaWQqIGNvbnRleHQ7CisgICAgICAgICAgICBBU3RyaW5nIGNhbWVyYUlkOworICAgICAgICAgICAgYm9vbCBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZjYik7CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYW1lcmEgY2FsbGJhY2sgZnAhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NvbnRleHRLZXksICZjb250ZXh0KTsKKyAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhbGxiYWNrIGNvbnRleHQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFN0cmluZyhrQ2FtZXJhSWRLZXksICZjYW1lcmFJZCk7CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYW1lcmEgSUQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAoKmNiKShjb250ZXh0LCBjYW1lcmFJZC5jX3N0cigpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiJXM6IHVua25vd24gbWVzc2FnZSB0eXBlICVkIiwgX19GVU5DVElPTl9fLCBtc2ctPndoYXQoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK2hhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhTWFuYWdlckdsb2JhbDo6Q2FtZXJhU2VydmljZUxpc3RlbmVyOjpvblN0YXR1c0NoYW5nZWQoCisgICAgICAgIGNvbnN0IENhbWVyYVN0YXR1c0FuZElkICZzdGF0dXNBbmRJZCkgeworICAgIHNwPENhbWVyYU1hbmFnZXJHbG9iYWw+IGNtID0gbUNhbWVyYU1hbmFnZXIucHJvbW90ZSgpOworICAgIGlmIChjbSAhPSBudWxscHRyKSB7CisgICAgICAgIGNtLT5vblN0YXR1c0NoYW5nZWQoc3RhdHVzQW5kSWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJDYW5ub3QgZGVsaXZlciBzdGF0dXMgY2hhbmdlLiBHbG9iYWwgY2FtZXJhIG1hbmFnZXIgZGllZCIpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6Om9uU3RhdHVzQ2hhbmdlZCgKKyAgICAgICAgY29uc3QgQ2FtZXJhU3RhdHVzQW5kSWQgJnN0YXR1c0FuZElkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBvblN0YXR1c0NoYW5nZWRMb2NrZWQoc3RhdHVzQW5kSWQpOworfQorCit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6Om9uU3RhdHVzQ2hhbmdlZExvY2tlZCgKKyAgICAgICAgY29uc3QgQ2FtZXJhU3RhdHVzQW5kSWQgJnN0YXR1c0FuZElkKSB7CisgICAgaGlkbF9zdHJpbmcgY2FtZXJhSWQgPSBzdGF0dXNBbmRJZC5jYW1lcmFJZDsKKyAgICBDYW1lcmFEZXZpY2VTdGF0dXMgc3RhdHVzID0gc3RhdHVzQW5kSWQuZGV2aWNlU3RhdHVzOworICAgIGlmICghdmFsaWRTdGF0dXMoc3RhdHVzKSkgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgc3RhdHVzICVkIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBmaXJzdFN0YXR1cyA9IChtRGV2aWNlU3RhdHVzTWFwLmNvdW50KGNhbWVyYUlkKSA9PSAwKTsKKyAgICBDYW1lcmFEZXZpY2VTdGF0dXMgb2xkU3RhdHVzID0gZmlyc3RTdGF0dXMgPworICAgICAgICAgICAgc3RhdHVzIDogLy8gZmlyc3Qgc3RhdHVzCisgICAgICAgICAgICBtRGV2aWNlU3RhdHVzTWFwW2NhbWVyYUlkXTsKKworICAgIGlmICghZmlyc3RTdGF0dXMgJiYKKyAgICAgICAgICAgIGlzU3RhdHVzQXZhaWxhYmxlKHN0YXR1cykgPT0gaXNTdGF0dXNBdmFpbGFibGUob2xkU3RhdHVzKSkgeworICAgICAgICAvLyBObyBzdGF0dXMgdXBkYXRlLiBObyBuZWVkIHRvIHNlbmQgY2FsbGJhY2sKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgcmVnaXN0ZXJlZCBjYWxsYmFja3MKKyAgICBtRGV2aWNlU3RhdHVzTWFwW2NhbWVyYUlkXSA9IHN0YXR1czsKKyAgICBmb3IgKGF1dG8gY2IgOiBtQ2FsbGJhY2tzKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZW5kU2luZ2xlQ2FsbGJhY2ssIG1IYW5kbGVyKTsKKyAgICAgICAgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2sgY2JGcCA9IGlzU3RhdHVzQXZhaWxhYmxlKHN0YXR1cykgPworICAgICAgICAgICAgICAgIGNiLm1BdmFpbGFibGUgOiBjYi5tVW5hdmFpbGFibGU7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQgKikgY2JGcCk7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2IubUNvbnRleHQpOworICAgICAgICBtc2ctPnNldFN0cmluZyhrQ2FtZXJhSWRLZXksIEFTdHJpbmcoY2FtZXJhSWQuY19zdHIoKSkpOworICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICB9CisgICAgaWYgKHN0YXR1cyA9PSBDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19OT1RfUFJFU0VOVCkgeworICAgICAgICBtRGV2aWNlU3RhdHVzTWFwLmVyYXNlKGNhbWVyYUlkKTsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIGFjYW0KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworLyoqCisgKiBBQ2FtZXJhTWFuZ2VyIEltcGxlbWVudGF0aW9uCisgKi8KK2NhbWVyYV9zdGF0dXNfdAorQUNhbWVyYU1hbmFnZXI6OmdldENhbWVyYUlkTGlzdChBQ2FtZXJhSWRMaXN0KiogY2FtZXJhSWRMaXN0KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIHN0ZDo6dmVjdG9yPGhpZGxfc3RyaW5nPiBpZExpc3Q7CisgICAgQ2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0SW5zdGFuY2UoKS5nZXRDYW1lcmFJZExpc3QoJmlkTGlzdCk7CisKKyAgICBpbnQgbnVtQ2FtZXJhcyA9IGlkTGlzdC5zaXplKCk7CisgICAgQUNhbWVyYUlkTGlzdCAqb3V0ID0gbmV3IEFDYW1lcmFJZExpc3Q7CisgICAgaWYgKCFvdXQpIHsKKyAgICAgICAgQUxPR0UoIkFsbG9jYXRlIG1lbW9yeSBmb3IgQUNhbWVyYUlkTGlzdCBmYWlsZWQhIik7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX05PVF9FTk9VR0hfTUVNT1JZOworICAgIH0KKyAgICBvdXQtPm51bUNhbWVyYXMgPSBudW1DYW1lcmFzOworICAgIG91dC0+Y2FtZXJhSWRzID0gbmV3IGNvbnN0IGNoYXIqW251bUNhbWVyYXNdOworICAgIGlmICghb3V0LT5jYW1lcmFJZHMpIHsKKyAgICAgICAgQUxPR0UoIkFsbG9jYXRlIG1lbW9yeSBmb3IgQUNhbWVyYUlkTGlzdCBmYWlsZWQhIik7CisgICAgICAgIGRlbGV0ZUNhbWVyYUlkTGlzdChvdXQpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9OT1RfRU5PVUdIX01FTU9SWTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DYW1lcmFzOyBpKyspIHsKKyAgICAgICAgY29uc3QgY2hhciogc3JjID0gaWRMaXN0W2ldLmNfc3RyKCk7CisgICAgICAgIHNpemVfdCBkc3RTaXplID0gc3RybGVuKHNyYykgKyAxOworICAgICAgICBjaGFyKiBkc3QgPSBuZXcgY2hhcltkc3RTaXplXTsKKyAgICAgICAgaWYgKCFkc3QpIHsKKyAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0ZSBtZW1vcnkgZm9yIEFDYW1lcmFJZExpc3QgZmFpbGVkISIpOworICAgICAgICAgICAgZGVsZXRlQ2FtZXJhSWRMaXN0KG91dCk7CisgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9OT1RfRU5PVUdIX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICBzdHJsY3B5KGRzdCwgc3JjLCBkc3RTaXplKTsKKyAgICAgICAgb3V0LT5jYW1lcmFJZHNbaV0gPSBkc3Q7CisgICAgfQorICAgICpjYW1lcmFJZExpc3QgPSBvdXQ7CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK3ZvaWQKK0FDYW1lcmFNYW5hZ2VyOjpkZWxldGVDYW1lcmFJZExpc3QoQUNhbWVyYUlkTGlzdCogY2FtZXJhSWRMaXN0KSB7CisgICAgaWYgKGNhbWVyYUlkTGlzdCAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChjYW1lcmFJZExpc3QtPmNhbWVyYUlkcyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbWVyYUlkTGlzdC0+bnVtQ2FtZXJhczsgaSArKykgeworICAgICAgICAgICAgICAgIGlmIChjYW1lcmFJZExpc3QtPmNhbWVyYUlkc1tpXSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZVtdIGNhbWVyYUlkTGlzdC0+Y2FtZXJhSWRzW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlbGV0ZVtdIGNhbWVyYUlkTGlzdC0+Y2FtZXJhSWRzOworICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBjYW1lcmFJZExpc3Q7CisgICAgfQorfQorCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYU1hbmFnZXI6OmdldENhbWVyYUNoYXJhY3RlcmlzdGljcygKKyAgICAgICAgY29uc3QgY2hhciAqY2FtZXJhSWRTdHIsIHNwPEFDYW1lcmFNZXRhZGF0YT4gKmNoYXJhY3RlcmlzdGljcykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICBzcDxJQ2FtZXJhU2VydmljZT4gY3MgPSBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRJbnN0YW5jZSgpLmdldENhbWVyYVNlcnZpY2UoKTsKKyAgICBpZiAoY3MgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCByZWFjaCBjYW1lcmEgc2VydmljZSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEOworICAgIH0KKyAgICBDYW1lcmFNZXRhZGF0YSByYXdNZXRhZGF0YTsKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpOT19FUlJPUjsKKyAgICBhdXRvIHNlcnZpY2VSZXQgPQorICAgICAgICBjcy0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNhbWVyYUlkU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmcmF3TWV0YWRhdGFdIChhdXRvIHMgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiAmbWV0YWRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsczo6Y29udmVydEZyb21IaWRsQ2xvbmVkKG1ldGFkYXRhLCAmcmF3TWV0YWRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgIGlmICghc2VydmljZVJldC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIkdldCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGZyb20gY2FtZXJhIHNlcnZpY2UgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1VOS05PV047IC8vIHNob3VsZCBub3QgcmVhY2ggaGVyZQorICAgIH0KKworICAgICpjaGFyYWN0ZXJpc3RpY3MgPSBuZXcgQUNhbWVyYU1ldGFkYXRhKAorICAgICAgICAgICAgcmF3TWV0YWRhdGEucmVsZWFzZSgpLCBBQ2FtZXJhTWV0YWRhdGE6OkFDTV9DSEFSQUNURVJJU1RJQ1MpOworICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCitjYW1lcmFfc3RhdHVzX3QKK0FDYW1lcmFNYW5hZ2VyOjpvcGVuQ2FtZXJhKAorICAgICAgICBjb25zdCBjaGFyKiBjYW1lcmFJZCwKKyAgICAgICAgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2ssCisgICAgICAgIC8qb3V0Ki9BQ2FtZXJhRGV2aWNlKiogb3V0RGV2aWNlKSB7CisgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiByYXdDaGFyczsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNhbWVyYUlkLCAmcmF3Q2hhcnMpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCIlczogY2Fubm90IGdldCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGZvciBjYW1lcmEgJXMuIGVyciAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCwgcmV0KTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgQUNhbWVyYURldmljZSogZGV2aWNlID0gbmV3IEFDYW1lcmFEZXZpY2UoY2FtZXJhSWQsIGNhbGxiYWNrLCBzdGQ6Om1vdmUocmF3Q2hhcnMpKTsKKworICAgIHNwPElDYW1lcmFTZXJ2aWNlPiBjcyA9IENhbWVyYU1hbmFnZXJHbG9iYWw6OmdldEluc3RhbmNlKCkuZ2V0Q2FtZXJhU2VydmljZSgpOworICAgIGlmIChjcyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IHJlYWNoIGNhbWVyYSBzZXJ2aWNlISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGRlbGV0ZSBkZXZpY2U7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQ7CisgICAgfQorCisgICAgc3A8SUNhbWVyYURldmljZUNhbGxiYWNrPiBjYWxsYmFja3MgPSBkZXZpY2UtPmdldFNlcnZpY2VDYWxsYmFjaygpOworICAgIHNwPElDYW1lcmFEZXZpY2VVc2VyPiBkZXZpY2VSZW1vdGU7CisKKyAgICAvLyBObyB3YXkgdG8gZ2V0IHBhY2thZ2UgbmFtZSBmcm9tIG5hdGl2ZS4KKyAgICAvLyBTZW5kIGEgemVybyBsZW5ndGggcGFja2FnZSBuYW1lIGFuZCBsZXQgY2FtZXJhIHNlcnZpY2UgZmlndXJlIGl0IG91dCBmcm9tIFVJRAorICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6Ok5PX0VSUk9SOworICAgIGF1dG8gc2VydmljZVJldCA9IGNzLT5jb25uZWN0RGV2aWNlKAorICAgICAgICAgICAgY2FsbGJhY2tzLCBjYW1lcmFJZCwgWyZzdGF0dXMsICZkZXZpY2VSZW1vdGVdKGF1dG8gcywgYXV0byAmZGV2aWNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VSZW1vdGUgPSBkZXZpY2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgIGlmICghc2VydmljZVJldC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjb25uZWN0IGNhbWVyYSBkZXZpY2UgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgLy8gVE9ETzogQ29udmVydCBzZXJ2aWNlUmV0IHRvIGNhbWVyYV9zdGF0dXNfdAorICAgICAgICBkZWxldGUgZGV2aWNlOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9VTktOT1dOOworICAgIH0KKyAgICBpZiAoZGV2aWNlUmVtb3RlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjb25uZWN0IGNhbWVyYSBkZXZpY2UgZmFpbGVkISByZW1vdGUgZGV2aWNlIGlzIG51bGwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBkZWxldGUgZGV2aWNlOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEOworICAgIH0KKyAgICBkZXZpY2UtPnNldFJlbW90ZURldmljZShkZXZpY2VSZW1vdGUpOworICAgIGRldmljZS0+c2V0RGV2aWNlTWV0YWRhdGFRdWV1ZXMoKTsKKyAgICAqb3V0RGV2aWNlID0gZGV2aWNlOworICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCitBQ2FtZXJhTWFuYWdlcjo6fkFDYW1lcmFNYW5hZ2VyKCkgeworCit9CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhTWFuYWdlci5oIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGQ2NDBmCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuaApAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0FDQU1FUkFfTUFOQUdFUl9ICisjZGVmaW5lIF9BQ0FNRVJBX01BTkFHRVJfSAorCisjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYU1hbmFnZXIuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wYXJzZWludC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL0lDYW1lcmFTZXJ2aWNlLmg+CisKKyNpbmNsdWRlIDxDYW1lcmFNZXRhZGF0YS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxtYXA+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKKwordXNpbmcgSUNhbWVyYVNlcnZpY2UgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpJQ2FtZXJhU2VydmljZTsKK3VzaW5nIENhbWVyYURldmljZVN0YXR1cyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OkNhbWVyYURldmljZVN0YXR1czsKK3VzaW5nIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXIgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyOwordXNpbmcgQ2FtZXJhU3RhdHVzQW5kSWQgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFTdGF0dXNBbmRJZDsKK3VzaW5nIFN0YXR1cyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6U3RhdHVzOwordXNpbmcgVmVuZG9yVGFnU2VjdGlvbiA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6VmVuZG9yVGFnU2VjdGlvbjsKK3VzaW5nIFZlbmRvclRhZyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6VmVuZG9yVGFnOwordXNpbmcgSUJhc2UgPSBhbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIGhhcmR3YXJlOjpWb2lkOworCisvKioKKyAqIFBlci1wcm9jZXNzIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiBDYW1lcmFNYW5nZXIuIFNoYXJlZCBieSBhbGwgQUNhbWVyYU1hbmFnZXIKKyAqIGluc3RhbmNlcy4gQ3JlYXRlZCB3aGVuIGZpcnN0IEFDYW1lcmFNYW5hZ2VyIGlzIGNyZWF0ZWQgYW5kIGRlc3Ryb3llZCB3aGVuCisgKiBhbGwgQUNhbWVyYU1hbmFnZXIgaW5zdGFuY2VzIGFyZSBkZWxldGVkLgorICoKKyAqIFRPRE86IG1heWJlIENhbWVyYU1hbmFnZXJHbG9iYWwgaXMgYmV0dGVyIHN1aXRlZCBpbiBsaWJjYW1lcmFjbGllbnQ/CisgKi8KK2NsYXNzIENhbWVyYU1hbmFnZXJHbG9iYWwgZmluYWwgOiBwdWJsaWMgUmVmQmFzZSB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgQ2FtZXJhTWFuYWdlckdsb2JhbCYgZ2V0SW5zdGFuY2UoKTsKKyAgICBzcDxJQ2FtZXJhU2VydmljZT4gZ2V0Q2FtZXJhU2VydmljZSgpOworCisgICAgdm9pZCByZWdpc3RlckF2YWlsYWJpbGl0eUNhbGxiYWNrKAorICAgICAgICAgICAgY29uc3QgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2tzICpjYWxsYmFjayk7CisgICAgdm9pZCB1bnJlZ2lzdGVyQXZhaWxhYmlsaXR5Q2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3MgKmNhbGxiYWNrKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBjYW1lcmEgSURzIHRoYXQgc3VwcG9ydCBjYW1lcmEyCisgICAgICovCisgICAgdm9pZCBnZXRDYW1lcmFJZExpc3Qoc3RkOjp2ZWN0b3I8aGlkbF9zdHJpbmc+ICpjYW1lcmFJZHMpOworCisgIHByaXZhdGU6CisgICAgc3A8SUNhbWVyYVNlcnZpY2U+IG1DYW1lcmFTZXJ2aWNlOworICAgIGNvbnN0IGludCAgICAgICAgICBrQ2FtZXJhU2VydmljZVBvbGxEZWxheSA9IDUwMDAwMDsgLy8gMC41cworICAgIE11dGV4ICAgICAgICAgICAgICBtTG9jazsKKyAgICBjbGFzcyBEZWF0aE5vdGlmaWVyIDogcHVibGljIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2RlYXRoX3JlY2lwaWVudCB7CisgICAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IERlYXRoTm90aWZpZXIoQ2FtZXJhTWFuYWdlckdsb2JhbCogY20pIDogbUNhbWVyYU1hbmFnZXIoY20pIHt9CisgICAgICBwcm90ZWN0ZWQ6CisgICAgICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IGltcGxlbWVudGF0aW9uCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXJ2aWNlRGllZCh1aW50NjRfdCBjb29raWUsIGNvbnN0IHdwPElCYXNlPiAmd2hvKTsKKyAgICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IHdwPENhbWVyYU1hbmFnZXJHbG9iYWw+IG1DYW1lcmFNYW5hZ2VyOworICAgIH07CisgICAgc3A8RGVhdGhOb3RpZmllcj4gbURlYXRoTm90aWZpZXI7CisKKyAgICBjbGFzcyBDYW1lcmFTZXJ2aWNlTGlzdGVuZXIgZmluYWwgOiBwdWJsaWMgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lciB7CisgICAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IENhbWVyYVNlcnZpY2VMaXN0ZW5lcihDYW1lcmFNYW5hZ2VyR2xvYmFsKiBjbSkgOiBtQ2FtZXJhTWFuYWdlcihjbSkge30KKyAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiBvblN0YXR1c0NoYW5nZWQoCisgICAgICAgICAgICBjb25zdCBDYW1lcmFTdGF0dXNBbmRJZCAmc3RhdHVzQW5kSWQpIG92ZXJyaWRlOworCisgICAgICBwcml2YXRlOgorICAgICAgICBjb25zdCB3cDxDYW1lcmFNYW5hZ2VyR2xvYmFsPiBtQ2FtZXJhTWFuYWdlcjsKKyAgICB9OworICAgIHNwPENhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gbUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjsKKworICAgIC8vIFdyYXBwZXIgb2YgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2tzIHNvIHdlIGNhbiBzdG9yZSBpdCBpbiBzdGQ6OnNldAorICAgIHN0cnVjdCBDYWxsYmFjayB7CisgICAgICAgIGV4cGxpY2l0IENhbGxiYWNrKGNvbnN0IEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrcyAqY2FsbGJhY2spIDoKKyAgICAgICAgICAgIG1BdmFpbGFibGUoY2FsbGJhY2stPm9uQ2FtZXJhQXZhaWxhYmxlKSwKKyAgICAgICAgICAgIG1VbmF2YWlsYWJsZShjYWxsYmFjay0+b25DYW1lcmFVbmF2YWlsYWJsZSksCisgICAgICAgICAgICBtQ29udGV4dChjYWxsYmFjay0+Y29udGV4dCkge30KKworICAgICAgICBib29sIG9wZXJhdG9yID09IChjb25zdCBDYWxsYmFjayYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAobUF2YWlsYWJsZSA9PSBvdGhlci5tQXZhaWxhYmxlICYmCisgICAgICAgICAgICAgICAgICAgIG1VbmF2YWlsYWJsZSA9PSBvdGhlci5tVW5hdmFpbGFibGUgJiYKKyAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQgPT0gb3RoZXIubUNvbnRleHQpOworICAgICAgICB9CisgICAgICAgIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IENhbGxiYWNrJiBvdGhlcikgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICAgICAgICB9CisgICAgICAgIGJvb2wgb3BlcmF0b3IgPCAoY29uc3QgQ2FsbGJhY2smIG90aGVyKSBjb25zdCB7CisgICAgICAgICAgICBpZiAoKnRoaXMgPT0gb3RoZXIpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmIChtQ29udGV4dCAhPSBvdGhlci5tQ29udGV4dCkgcmV0dXJuIG1Db250ZXh0IDwgb3RoZXIubUNvbnRleHQ7CisgICAgICAgICAgICBpZiAobUF2YWlsYWJsZSAhPSBvdGhlci5tQXZhaWxhYmxlKSByZXR1cm4gbUF2YWlsYWJsZSA8IG90aGVyLm1BdmFpbGFibGU7CisgICAgICAgICAgICByZXR1cm4gbVVuYXZhaWxhYmxlIDwgb3RoZXIubVVuYXZhaWxhYmxlOworICAgICAgICB9CisgICAgICAgIGJvb2wgb3BlcmF0b3IgPiAoY29uc3QgQ2FsbGJhY2smIG90aGVyKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gKCp0aGlzICE9IG90aGVyICYmICEoKnRoaXMgPCBvdGhlcikpOworICAgICAgICB9CisgICAgICAgIEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrIG1BdmFpbGFibGU7CisgICAgICAgIEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrIG1VbmF2YWlsYWJsZTsKKyAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQ7CisgICAgfTsKKyAgICBzdGQ6OnNldDxDYWxsYmFjaz4gbUNhbGxiYWNrczsKKworICAgIC8vIGRlZmluaXRpb24gb2YgaGFuZGxlciBhbmQgbWVzc2FnZQorICAgIGVudW0geworICAgICAgICBrV2hhdFNlbmRTaW5nbGVDYWxsYmFjaworICAgIH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYW1lcmFJZEtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0NhbGxiYWNrRnBLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDb250ZXh0S2V5OworICAgIGNsYXNzIENhbGxiYWNrSGFuZGxlciA6IHB1YmxpYyBBSGFuZGxlciB7CisgICAgICBwdWJsaWM6CisgICAgICAgIENhbGxiYWNrSGFuZGxlcigpIHt9CisgICAgICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIG92ZXJyaWRlOworICAgIH07CisgICAgc3A8Q2FsbGJhY2tIYW5kbGVyPiBtSGFuZGxlcjsKKyAgICBzcDxBTG9vcGVyPiAgICAgICAgIG1DYkxvb3BlcjsgLy8gTG9vcGVyIHRocmVhZCB3aGVyZSBjYWxsYmFja3MgYWN0dWFsbHkgaGFwcGVuIG9uCisKKyAgICB2b2lkIG9uU3RhdHVzQ2hhbmdlZChjb25zdCBDYW1lcmFTdGF0dXNBbmRJZCAmc3RhdHVzQW5kSWQpOworICAgIHZvaWQgb25TdGF0dXNDaGFuZ2VkTG9ja2VkKGNvbnN0IENhbWVyYVN0YXR1c0FuZElkICZzdGF0dXNBbmRJZCk7CisgICAgLy8gVXRpbHMgZm9yIHN0YXR1cworICAgIHN0YXRpYyBib29sIHZhbGlkU3RhdHVzKENhbWVyYURldmljZVN0YXR1cyBzdGF0dXMpOworICAgIHN0YXRpYyBib29sIGlzU3RhdHVzQXZhaWxhYmxlKENhbWVyYURldmljZVN0YXR1cyBzdGF0dXMpOworCisgICAgLy8gVGhlIHNvcnQgbG9naWMgbXVzdCBtYXRjaCB0aGUgbG9naWMgaW4KKyAgICAvLyBsaWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwOjpnZXRBUEkxQ29tcGF0aWJsZUNhbWVyYURldmljZUlkcworICAgIHN0cnVjdCBDYW1lcmFJZENvbXBhcmF0b3IgeworICAgICAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgaGlkbF9zdHJpbmcmIGEsIGNvbnN0IGhpZGxfc3RyaW5nJiBiKSBjb25zdCB7CisgICAgICAgICAgICB1aW50MzJfdCBhVWludCA9IDAsIGJVaW50ID0gMDsKKyAgICAgICAgICAgIGJvb2wgYUlzVWludCA9IGJhc2U6OlBhcnNlVWludChhLmNfc3RyKCksICZhVWludCk7CisgICAgICAgICAgICBib29sIGJJc1VpbnQgPSBiYXNlOjpQYXJzZVVpbnQoYi5jX3N0cigpLCAmYlVpbnQpOworCisgICAgICAgICAgICAvLyBVaW50IGRldmljZSBJRHMgZmlyc3QKKyAgICAgICAgICAgIGlmIChhSXNVaW50ICYmIGJJc1VpbnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYVVpbnQgPCBiVWludDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYUlzVWludCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChiSXNVaW50KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gU2ltcGxlIHN0cmluZyBjb21wYXJlIGlmIGJvdGggaWQgYXJlIG5vdCB1aW50CisgICAgICAgICAgICByZXR1cm4gYSA8IGI7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLy8gTWFwIGNhbWVyYV9pZCAtPiBzdGF0dXMKKyAgICBzdGQ6Om1hcDxoaWRsX3N0cmluZywgQ2FtZXJhRGV2aWNlU3RhdHVzLCBDYW1lcmFJZENvbXBhcmF0b3I+IG1EZXZpY2VTdGF0dXNNYXA7CisKKyAgICAvLyBGb3IgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZQorICAgIHN0YXRpYyBNdXRleCBzTG9jazsKKyAgICBzdGF0aWMgQ2FtZXJhTWFuYWdlckdsb2JhbCogc0luc3RhbmNlOworICAgIENhbWVyYU1hbmFnZXJHbG9iYWwoKSB7fTsKKyAgICB+Q2FtZXJhTWFuYWdlckdsb2JhbCgpOworfTsKKworfSAvLyBuYW1lc3BhY2UgYWNhbTsKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQ7CisKKy8qKgorICogQUNhbWVyYU1hbmFnZXIgb3BhcXVlIHN0cnVjdCBkZWZpbml0aW9uCisgKiBMZWF2ZSBvdXRzaWRlIG9mIGFuZHJvaWQgbmFtZXNwYWNlIGJlY2F1c2UgaXQncyBOREsgc3RydWN0CisgKi8KK3N0cnVjdCBBQ2FtZXJhTWFuYWdlciB7CisgICAgQUNhbWVyYU1hbmFnZXIoKSA6CisgICAgICAgICAgICBtR2xvYmFsTWFuYWdlcigmKGFuZHJvaWQ6OmFjYW06OkNhbWVyYU1hbmFnZXJHbG9iYWw6OmdldEluc3RhbmNlKCkpKSB7fQorICAgIH5BQ2FtZXJhTWFuYWdlcigpOworICAgIGNhbWVyYV9zdGF0dXNfdCBnZXRDYW1lcmFJZExpc3QoQUNhbWVyYUlkTGlzdCoqIGNhbWVyYUlkTGlzdCk7CisgICAgc3RhdGljIHZvaWQgICAgIGRlbGV0ZUNhbWVyYUlkTGlzdChBQ2FtZXJhSWRMaXN0KiBjYW1lcmFJZExpc3QpOworCisgICAgY2FtZXJhX3N0YXR1c190IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcygKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNhbWVyYUlkLCBhbmRyb2lkOjpzcDxBQ2FtZXJhTWV0YWRhdGE+KiBjaGFyYWN0ZXJpc3RpY3MpOworCisgICAgY2FtZXJhX3N0YXR1c190IG9wZW5DYW1lcmEoY29uc3QgY2hhciogY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqL0FDYW1lcmFEZXZpY2UqKiBkZXZpY2UpOworCisgIHByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtDYW1lcmFJZExpc3ROb3RJbml0ID0gLTEKKyAgICB9OworICAgIGFuZHJvaWQ6Ok11dGV4ICAgICAgICAgbUxvY2s7CisgICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6YWNhbTo6Q2FtZXJhTWFuYWdlckdsb2JhbD4gbUdsb2JhbE1hbmFnZXI7Cit9OworCisjZW5kaWYgLy9fQUNBTUVSQV9NQU5BR0VSX0gKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYXB0dXJlUmVxdWVzdFZlbmRvci5oIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhcHR1cmVSZXF1ZXN0VmVuZG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ2NzYxNQotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYXB0dXJlUmVxdWVzdFZlbmRvci5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAidXRpbHMuaCIKKworc3RydWN0IEFDYW1lcmFPdXRwdXRUYXJnZXQgeworICAgIGV4cGxpY2l0IEFDYW1lcmFPdXRwdXRUYXJnZXQobmF0aXZlX2hhbmRsZV90KiB3aW5kb3cpIDogbVdpbmRvdyh3aW5kb3cpIHt9OworCisgICAgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQUNhbWVyYU91dHB1dFRhcmdldCYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1XaW5kb3cgPT0gb3RoZXIubVdpbmRvdzsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgQUNhbWVyYU91dHB1dFRhcmdldCYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1XaW5kb3cgIT0gb3RoZXIubVdpbmRvdzsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0JiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gbVdpbmRvdyA8IG90aGVyLm1XaW5kb3c7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3IgPiAoY29uc3QgQUNhbWVyYU91dHB1dFRhcmdldCYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1XaW5kb3cgPiBvdGhlci5tV2luZG93OworICAgIH0KKworICAgIGFuZHJvaWQ6OmFjYW06OnV0aWxzOjpuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyIG1XaW5kb3c7Cit9OwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvdXRpbHMuY3BwIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvdXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxOTMwMDYKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5jcHAKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFDYW1lcmFWZW5kb3JVdGlscyIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0geworbmFtZXNwYWNlIHV0aWxzIHsKKworLy8gQ29udmVydCBDYXB0dXJlUmVxdWVzdCB3cmFwcGFibGUgYnkgc3A8PiB0byBoaWRsIENhcHR1cmVSZXF1ZXN0LgorZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYXB0dXJlUmVxdWVzdAorY29udmVydFRvSGlkbChjb25zdCBDYXB0dXJlUmVxdWVzdCAqY2FwdHVyZVJlcXVlc3QpIHsKKyAgICBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXF1ZXN0IGhDYXB0dXJlUmVxdWVzdDsKKyAgICBoQ2FwdHVyZVJlcXVlc3QucGh5c2ljYWxDYW1lcmFTZXR0aW5ncyA9IGNhcHR1cmVSZXF1ZXN0LT5tQ2FwdHVyZVJlcXVlc3QucGh5c2ljYWxDYW1lcmFTZXR0aW5nczsKKyAgICBoQ2FwdHVyZVJlcXVlc3Quc3RyZWFtQW5kV2luZG93SWRzID0gY2FwdHVyZVJlcXVlc3QtPm1DYXB0dXJlUmVxdWVzdC5zdHJlYW1BbmRXaW5kb3dJZHM7CisgICAgcmV0dXJuIGhDYXB0dXJlUmVxdWVzdDsKK30KKworSFJvdGF0aW9uIGNvbnZlcnRUb0hpZGwoaW50IHJvdGF0aW9uKSB7CisgICAgSFJvdGF0aW9uIGhSb3RhdGlvbiA9IEhSb3RhdGlvbjo6UjA7CisgICAgc3dpdGNoKHJvdGF0aW9uKSB7CisgICAgICAgIGNhc2UgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fOTA6CisgICAgICAgICAgICBoUm90YXRpb24gPSBIUm90YXRpb246OlI5MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzE4MDoKKyAgICAgICAgICAgIGhSb3RhdGlvbiA9IEhSb3RhdGlvbjo6UjE4MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzI3MDoKKyAgICAgICAgICAgIGhSb3RhdGlvbiA9IEhSb3RhdGlvbjo6UjI3MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBoUm90YXRpb247Cit9CisKK2Jvb2wgY29udmVydEZyb21IaWRsQ2xvbmVkKGNvbnN0IEhDYW1lcmFNZXRhZGF0YSAmbWV0YWRhdGEsIENhbWVyYU1ldGFkYXRhICpyYXdNZXRhZGF0YSkgeworICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YSAqYnVmZmVyID0gKGNhbWVyYV9tZXRhZGF0YV90KikobWV0YWRhdGEuZGF0YSgpKTsKKyAgICBzaXplX3QgZXhwZWN0ZWRTaXplID0gbWV0YWRhdGEuc2l6ZSgpOworICAgIGludCByZXQgPSB2YWxpZGF0ZV9jYW1lcmFfbWV0YWRhdGFfc3RydWN0dXJlKGJ1ZmZlciwgJmV4cGVjdGVkU2l6ZSk7CisgICAgaWYgKHJldCA9PSBPSyB8fCByZXQgPT0gQ0FNRVJBX01FVEFEQVRBX1ZBTElEQVRJT05fU0hJRlRFRCkgeworICAgICAgICAqcmF3TWV0YWRhdGEgPSBidWZmZXI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBNYWxmb3JtZWQgY2FtZXJhIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gY2FsbGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gTm90ZTogZXhpc3RpbmcgZGF0YSBpbiBkc3Qgd2lsbCBiZSBnb25lLiBDYWxsZXIgc3RpbGwgb3ducyB0aGUgbWVtb3J5IG9mIHNyYwordm9pZCBjb252ZXJ0VG9IaWRsKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpzcmMsIEhDYW1lcmFNZXRhZGF0YSogZHN0KSB7CisgICAgaWYgKHNyYyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2l6ZV90IHNpemUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUoc3JjKTsKKyAgICBBTE9HRSgiQ29udmVydGluZyBtZXRhZGF0YSBzaXplOiAlZCIsIChpbnQpc2l6ZSk7CisgICAgZHN0LT5zZXRUb0V4dGVybmFsKCh1aW50OF90ICopIHNyYywgc2l6ZSk7CisgICAgcmV0dXJuOworfQorCitUZW1wbGF0ZUlkIGNvbnZlcnRUb0hpZGwoQUNhbWVyYURldmljZV9yZXF1ZXN0X3RlbXBsYXRlIHRlbXBsYXRlSWQpIHsKKyAgICBzd2l0Y2godGVtcGxhdGVJZCkgeworICAgICAgICBjYXNlIFRFTVBMQVRFX1NUSUxMX0NBUFRVUkU6CisgICAgICAgICAgICByZXR1cm4gVGVtcGxhdGVJZDo6U1RJTExfQ0FQVFVSRTsKKyAgICAgICAgY2FzZSBURU1QTEFURV9SRUNPUkQ6CisgICAgICAgICAgICByZXR1cm4gVGVtcGxhdGVJZDo6UkVDT1JEOworICAgICAgICBjYXNlIFRFTVBMQVRFX1ZJREVPX1NOQVBTSE9UOgorICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlSWQ6OlZJREVPX1NOQVBTSE9UOworICAgICAgICBjYXNlIFRFTVBMQVRFX1pFUk9fU0hVVFRFUl9MQUc6CisgICAgICAgICAgICByZXR1cm4gVGVtcGxhdGVJZDo6WkVST19TSFVUVEVSX0xBRzsKKyAgICAgICAgY2FzZSBURU1QTEFURV9NQU5VQUw6CisgICAgICAgICAgICByZXR1cm4gVGVtcGxhdGVJZDo6TUFOVUFMOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlSWQ6OlBSRVZJRVc7CisgICAgfQorfQorCitjYW1lcmFfc3RhdHVzX3QgY29udmVydEZyb21IaWRsKFN0YXR1cyBzdGF0dXMpIHsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gQUNBTUVSQV9PSzsKKyAgICBzd2l0Y2goc3RhdHVzKSB7CisgICAgICAgIGNhc2UgU3RhdHVzOjpOT19FUlJPUjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0YXR1czo6RElTQ09OTkVDVEVEOgorICAgICAgICAgICAgcmV0ID0gQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU3RhdHVzOjpDQU1FUkFfSU5fVVNFOgorICAgICAgICAgICAgcmV0ID0gQUNBTUVSQV9FUlJPUl9DQU1FUkFfSU5fVVNFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU3RhdHVzOjpNQVhfQ0FNRVJBU19JTl9VU0U6CisgICAgICAgICAgICByZXQgPSBBQ0FNRVJBX0VSUk9SX01BWF9DQU1FUkFfSU5fVVNFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5UOgorICAgICAgICAgICAgcmV0ID0gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0YXR1czo6REVQUkVDQVRFRF9IQUw6CisgICAgICAgICAgICAvLyBTaG91bGQgbm90IHJlYWNoIGhlcmUgc2luY2Ugd2UgZmlsdGVyZWQgbGVnYWN5IEhBTHMgZWFybGllcgorICAgICAgICAgICAgcmV0ID0gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0YXR1czo6RElTQUJMRUQ6CisgICAgICAgICAgICByZXQgPSBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ESVNBQkxFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0YXR1czo6UEVSTUlTU0lPTl9ERU5JRUQ6CisgICAgICAgICAgICByZXQgPSBBQ0FNRVJBX0VSUk9SX1BFUk1JU1NJT05fREVOSUVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU3RhdHVzOjpJTlZBTElEX09QRVJBVElPTjoKKyAgICAgICAgICAgIHJldCA9IEFDQU1FUkFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldCA9IEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitib29sIGlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDEsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgyKSB7CisgICAgaWYgKG5oMS0+bnVtRmRzICE9MCB8fCBuaDItPm51bUZkcyAhPTApIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgd2luZG93IG5hdGl2ZSBoYW5kbGVzIGJlaW5nIGNvbXBhcmVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKG5oMS0+dmVyc2lvbiAhPSBuaDItPnZlcnNpb24gfHwgbmgxLT5udW1GZHMgIT0gbmgyLT5udW1GZHMgfHwKKyAgICAgICAgbmgxLT5udW1JbnRzICE9IG5oMi0+bnVtSW50cykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmgxLT5udW1JbnRzOyBpKyspIHsKKyAgICAgICAgaWYobmgxLT5kYXRhW2ldICE9IG5oMi0+ZGF0YVtpXSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIGlzV2luZG93TmF0aXZlSGFuZGxlTGVzc1RoYW4oY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDEsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgyKSB7CisgICAgaWYgKGlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwobmgxLCBuaDIpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKG5oMS0+bnVtSW50cyAhPSBuaDItPm51bUludHMpIHsKKyAgICAgICAgcmV0dXJuIG5oMS0+bnVtSW50cyA8IG5oMi0+bnVtSW50czsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5oMS0+bnVtSW50czsgaSsrKSB7CisgICAgICAgIGlmIChuaDEtPmRhdGFbaV0gIT0gbmgyLT5kYXRhW2ldKSB7CisgICAgICAgICAgICByZXR1cm4gbmgxLT5kYXRhW2ldIDwgbmgyLT5kYXRhW2ldOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBpc1dpbmRvd05hdGl2ZUhhbmRsZUdyZWF0ZXJUaGFuKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgxLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMikgeworICAgIHJldHVybiAhaXNXaW5kb3dOYXRpdmVIYW5kbGVMZXNzVGhhbihuaDEsIG5oMikgJiYgIWlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwobmgxLCBuaDIpOworfQorCitib29sIGFyZVdpbmRvd05hdGl2ZUhhbmRsZXNFcXVhbChoaWRsX3ZlYzxoaWRsX2hhbmRsZT4gaGFuZGxlczEsIGhpZGxfdmVjPGhpZGxfaGFuZGxlPiBoYW5kbGVzMikgeworICAgIGlmIChoYW5kbGVzMS5zaXplKCkgIT0gaGFuZGxlczIuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYW5kbGVzMS5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoIWlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwoaGFuZGxlczFbaV0sIGhhbmRsZXMyW2ldKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIGFyZVdpbmRvd05hdGl2ZUhhbmRsZXNMZXNzVGhhbihoaWRsX3ZlYzxoaWRsX2hhbmRsZT4gaGFuZGxlczEsIGhpZGxfdmVjPGhpZGxfaGFuZGxlPmhhbmRsZXMyKSB7CisgICAgaWYgKGhhbmRsZXMxLnNpemUoKSAhPSBoYW5kbGVzMi5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIGhhbmRsZXMxLnNpemUoKSA8IGhhbmRsZXMyLnNpemUoKTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYW5kbGVzMS5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZTEgPSBoYW5kbGVzMVtpXS5nZXROYXRpdmVIYW5kbGUoKTsKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUyID0gaGFuZGxlczJbaV0uZ2V0TmF0aXZlSGFuZGxlKCk7CisgICAgICAgIGlmICghaXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbChoYW5kbGUxLCBoYW5kbGUyKSkgeworICAgICAgICAgICAgcmV0dXJuIGlzV2luZG93TmF0aXZlSGFuZGxlTGVzc1RoYW4oaGFuZGxlMSwgaGFuZGxlMik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit9IC8vIG5hbWVzcGFjZSB1dGlscworfSAvLyBuYW1lc3BhY2UgYWNhbQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvdXRpbHMuaCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYxMDA2ZAotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL3V0aWxzLmgKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjAvSUNhbWVyYVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL0lDYW1lcmFEZXZpY2VVc2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFEZXZpY2UuaD4KKyNpbmNsdWRlIDxDYW1lcmFNZXRhZGF0YS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYTMuaD4KKworI2lmbmRlZiBDQU1FUkFfTkRLX1ZFTkRPUl9ICisjZGVmaW5lIENBTUVSQV9OREtfVkVORE9SX0gKKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyBDYW1lcmFNZXRhZGF0YSA9IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6aGVscGVyOjpDYW1lcmFNZXRhZGF0YTsKK3VzaW5nIEhDYW1lcmFNZXRhZGF0YSAgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFNZXRhZGF0YTsKK3VzaW5nIFN0YXR1cyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6U3RhdHVzOwordXNpbmcgVGVtcGxhdGVJZCA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6VGVtcGxhdGVJZDsKK3VzaW5nIFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M7Cit1c2luZyBIUm90YXRpb24gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6Ok91dHB1dENvbmZpZ3VyYXRpb246OlJvdGF0aW9uOwordXNpbmcgT3V0cHV0Q29uZmlndXJhdGlvbiA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6T3V0cHV0Q29uZmlndXJhdGlvbjsKKworLy8gVXRpbGl0eSBjbGFzcyBzbyB0aGF0IENhcHR1cmVSZXF1ZXN0IGNhbiBiZSBzdG9yZWQgYnkgc3A8Pgorc3RydWN0IENhcHR1cmVSZXF1ZXN0IDogcHVibGljIFJlZkJhc2UgeworICBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXF1ZXN0IG1DYXB0dXJlUmVxdWVzdDsKKyAgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90ICo+IG1TdXJmYWNlTGlzdDsKKyAgLy9QaHlzaWNhbCBjYW1lcmEgc2V0dGluZ3MgbWV0YWRhdGEgaXMgc3RvcmVkIGhlcmUsIHNpbmNlIHRoZSBjYXB0dXJlIHJlcXVlc3QKKyAgLy9taWdodCBub3QgY29udGFpbiBpdC4gVGhhdCdzIHNpbmNlLCBmbXEgbWlnaHQgaGF2ZSBjb25zdW1lZCBpdC4KKyAgaGlkbF92ZWM8UGh5c2ljYWxDYW1lcmFTZXR0aW5ncz4gbVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M7Cit9OworCitib29sIGFyZVdpbmRvd05hdGl2ZUhhbmRsZXNFcXVhbChoaWRsX3ZlYzxoaWRsX2hhbmRsZT4gaGFuZGxlczEsIGhpZGxfdmVjPGhpZGxfaGFuZGxlPmhhbmRsZXMyKTsKKworYm9vbCBhcmVXaW5kb3dOYXRpdmVIYW5kbGVzTGVzc1RoYW4oaGlkbF92ZWM8aGlkbF9oYW5kbGU+IGhhbmRsZXMxLCBoaWRsX3ZlYzxoaWRsX2hhbmRsZT5oYW5kbGVzMik7CisKK2Jvb2wgaXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMSwgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDIpOworCitib29sIGlzV2luZG93TmF0aXZlSGFuZGxlTGVzc1RoYW4oY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDEsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgyKTsKKworLy8gQ29udmVuaWVuY2Ugd3JhcHBlciBvdmVyIGlzV2luZG93TmF0aXZlSGFuZGxlTGVzc1RoYW4gYW5kIGlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwKK2Jvb2wgaXNXaW5kb3dOYXRpdmVIYW5kbGVHcmVhdGVyVGhhbihjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMSwgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDIpOworCisvLyBVdGlsaXR5IGNsYXNzIHNvIHRoZSBuYXRpdmVfaGFuZGxlX3QgY2FuIGJlIGNvbXBhcmVkIHdpdGggIGl0cyBjb250ZW50cyBpbnN0ZWFkCisvLyBvZiBqdXN0IHJhdyBwb2ludGVyIGNvbXBhcmlzb25zLgorc3RydWN0IG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIgeworICAgIG5hdGl2ZV9oYW5kbGVfdCAqbVdpbmRvdyA9IG51bGxwdHI7CisKKyAgICBuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyKG5hdGl2ZV9oYW5kbGVfdCAqbmgpIDogbVdpbmRvdyhuaCkgeyB9CisKKyAgICBuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyKCkgPSBkZWZhdWx0OworCisgICAgb3BlcmF0b3IgbmF0aXZlX2hhbmRsZV90ICooKSBjb25zdCB7IHJldHVybiBtV2luZG93OyB9CisKKyAgICBib29sIG9wZXJhdG9yID09KGNvbnN0IG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwobVdpbmRvdywgb3RoZXIubVdpbmRvdyk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgbmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlciYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKG1XaW5kb3csIG90aGVyLm1XaW5kb3cpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgPCAoY29uc3QgbmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlciYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGlzV2luZG93TmF0aXZlSGFuZGxlTGVzc1RoYW4obVdpbmRvdywgb3RoZXIubVdpbmRvdyk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciA+IChjb25zdCBuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyJiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gIWlzV2luZG93TmF0aXZlSGFuZGxlR3JlYXRlclRoYW4obVdpbmRvdywgb3RoZXIubVdpbmRvdyk7CisgICAgfQorCit9OworCisvLyBXcmFwcGVyIGFyb3VuZCBPdXRwdXRDb25maWd1cmF0aW9uLiBUaGlzIGlzIG5lZWRlZCBzaW5jZSBISURMCisvLyBPdXRwdXRDb25maWd1cmF0aW9uIGlzIGF1dG8tZ2VuZXJhdGVkIGFuZCBtYXJrZWQgZmluYWwuIFRoZXJlZm9yZSwgb3BlcmF0b3IKKy8vIG92ZXJsb2FkcyBvdXRzaWRlIHRoZSBjbGFzcywgd2lsbCBub3QgZ2V0IHBpY2tlZCBieSBjbGFuZyB3aGlsZSB0cnlpbmcgdG8KKy8vIHN0b3JlIE91dHB1dENvbmZpZ3VyYXRpb24gaW4gbWFwcy9zZXRzLgorc3RydWN0IE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyIHsKKyAgICBPdXRwdXRDb25maWd1cmF0aW9uIG1PdXRwdXRDb25maWd1cmF0aW9uOworCisgICAgb3BlcmF0b3IgY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbiAmKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU91dHB1dENvbmZpZ3VyYXRpb247CisgICAgfQorCisgICAgT3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXIoKSA9IGRlZmF1bHQ7CisKKyAgICBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlcihPdXRwdXRDb25maWd1cmF0aW9uICZvdXRwdXRDb25maWd1cmF0aW9uKQorICAgICAgICAgICAgOiBtT3V0cHV0Q29uZmlndXJhdGlvbigob3V0cHV0Q29uZmlndXJhdGlvbikpIHsgfQorCisgICAgYm9vbCBvcGVyYXRvciA9PShjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uICZvdGhlcikgY29uc3QgeworICAgICAgICBjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uICZzZWxmID0gbU91dHB1dENvbmZpZ3VyYXRpb247CisgICAgICAgIHJldHVybiBzZWxmLnJvdGF0aW9uID09IG90aGVyLnJvdGF0aW9uICYmIHNlbGYud2luZG93R3JvdXBJZCA9PSBvdGhlci53aW5kb3dHcm91cElkICYmCisgICAgICAgICAgICAgICAgc2VsZi5waHlzaWNhbENhbWVyYUlkID09IG90aGVyLnBoeXNpY2FsQ2FtZXJhSWQgJiYgc2VsZi53aWR0aCA9PSBvdGhlci53aWR0aCAmJgorICAgICAgICAgICAgICAgIHNlbGYuaGVpZ2h0ID09IG90aGVyLmhlaWdodCAmJiBzZWxmLmlzRGVmZXJyZWQgPT0gb3RoZXIuaXNEZWZlcnJlZCAmJgorICAgICAgICAgICAgICAgIGFyZVdpbmRvd05hdGl2ZUhhbmRsZXNFcXVhbChzZWxmLndpbmRvd0hhbmRsZXMsIG90aGVyLndpbmRvd0hhbmRsZXMpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgPCAoY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbiAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgaWYgKCp0aGlzID09IG90aGVyKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbiAmc2VsZiA9IG1PdXRwdXRDb25maWd1cmF0aW9uOworICAgICAgICBpZiAoc2VsZi53aW5kb3dHcm91cElkICE9IG90aGVyLndpbmRvd0dyb3VwSWQpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWxmLndpbmRvd0dyb3VwSWQgPCBvdGhlci53aW5kb3dHcm91cElkOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlbGYud2lkdGggIT0gb3RoZXIud2lkdGgpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWxmLndpZHRoIDwgb3RoZXIud2lkdGg7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VsZi5oZWlnaHQgIT0gb3RoZXIuaGVpZ2h0KSB7CisgICAgICAgICAgICByZXR1cm4gc2VsZi5oZWlnaHQgPCBvdGhlci5oZWlnaHQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VsZi5yb3RhdGlvbiAhPSBvdGhlci5yb3RhdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90PihzZWxmLnJvdGF0aW9uKSA8IHN0YXRpY19jYXN0PHVpbnQzMl90PihvdGhlci5yb3RhdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VsZi5pc0RlZmVycmVkICE9IG90aGVyLmlzRGVmZXJyZWQpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmlzRGVmZXJyZWQgPCBvdGhlci5pc0RlZmVycmVkOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlbGYucGh5c2ljYWxDYW1lcmFJZCAhPSBvdGhlci5waHlzaWNhbENhbWVyYUlkKSB7CisgICAgICAgICAgICByZXR1cm4gc2VsZi5waHlzaWNhbENhbWVyYUlkIDwgb3RoZXIucGh5c2ljYWxDYW1lcmFJZDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXJlV2luZG93TmF0aXZlSGFuZGxlc0xlc3NUaGFuKHNlbGYud2luZG93SGFuZGxlcywgb3RoZXIud2luZG93SGFuZGxlcyk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbiAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgPiAoY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbiAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICgqdGhpcyAhPSBvdGhlcikgJiYgISgqdGhpcyA8IG90aGVyKTsKKyAgICB9Cit9OworCisvLyBDb252ZXJ0IENhcHR1cmVSZXF1ZXN0IHdyYXBwYWJsZSBieSBzcDw+IHRvIGhpZGwgQ2FwdHVyZVJlcXVlc3QuCitmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXF1ZXN0IGNvbnZlcnRUb0hpZGwoCisgICAgY29uc3QgQ2FwdHVyZVJlcXVlc3QgKmNhcHR1cmVSZXF1ZXN0KTsKKworSFJvdGF0aW9uIGNvbnZlcnRUb0hpZGwoaW50IHJvdGF0aW9uKTsKKworYm9vbCBjb252ZXJ0RnJvbUhpZGxDbG9uZWQoY29uc3QgSENhbWVyYU1ldGFkYXRhICZtZXRhZGF0YSwgQ2FtZXJhTWV0YWRhdGEgKnJhd01ldGFkYXRhKTsKKworLy8gTm90ZTogZXhpc3RpbmcgZGF0YSBpbiBkc3Qgd2lsbCBiZSBnb25lLiBDYWxsZXIgc3RpbGwgb3ducyB0aGUgbWVtb3J5IG9mIHNyYwordm9pZCBjb252ZXJ0VG9IaWRsKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpzcmMsIEhDYW1lcmFNZXRhZGF0YSogZHN0KTsKKworVGVtcGxhdGVJZCBjb252ZXJ0VG9IaWRsKEFDYW1lcmFEZXZpY2VfcmVxdWVzdF90ZW1wbGF0ZSB0ZW1wbGF0ZUlkKTsKKworY2FtZXJhX3N0YXR1c190IGNvbnZlcnRGcm9tSGlkbChTdGF0dXMgc3RhdHVzKTsKKworfSAvLyBuYW1lc3BhY2UgdXRpbHMKK30gLy8gbmFtZXNwYWNlIGFjYW0KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIENBTUVSQV9OREtfVkVORE9SX0gKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci90ZXN0cy9BSW1hZ2VSZWFkZXJWZW5kb3JUZXN0LmNwcCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci90ZXN0cy9BSW1hZ2VSZWFkZXJWZW5kb3JUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWJiM2FjCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL3Rlc3RzL0FJbWFnZVJlYWRlclZlbmRvclRlc3QuY3BwCkBAIC0wLDAgKzEsNzg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBSW1hZ2VSZWFkZXJWZW5kb3JUZXN0IgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9sb2cuaD4KKyNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhRXJyb3IuaD4KKyNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhTWFuYWdlci5oPgorI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFEZXZpY2UuaD4KKyNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtJbWFnZS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka0ltYWdlUmVhZGVyLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKworLy8jZGVmaW5lIEFMT0dWKC4uLikgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19WRVJCT1NFLCBMT0dfVEFHLCBfX1ZBX0FSR1NfXykKKy8vI2RlZmluZSBBTE9HRCguLi4pIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfREVCVUcsIExPR19UQUcsIF9fVkFfQVJHU19fKQorI2RlZmluZSBBTE9HSSguLi4pIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgTE9HX1RBRywgX19WQV9BUkdTX18pCisjZGVmaW5lIEFMT0dXKC4uLikgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19XQVJOLCBMT0dfVEFHLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgQUxPR0UoLi4uKSBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0VSUk9SLCBMT0dfVEFHLCBfX1ZBX0FSR1NfXykKKworbmFtZXNwYWNlIHsKKworc3RhdGljIGNvbnN0ZXhwciBpbnQga0R1bW15RmVuY2VGZCA9IC0xOworc3RhdGljIGNvbnN0ZXhwciBpbnQga0NhcHR1cmVXYWl0VXMgPSAxMDAgKiAxMDAwOworc3RhdGljIGNvbnN0ZXhwciBpbnQga0NhcHR1cmVXYWl0UmV0cnkgPSAxMDsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtUZXN0SW1hZ2VXaWR0aCA9IDY0MDsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtUZXN0SW1hZ2VIZWlnaHQgPSA0ODA7CitzdGF0aWMgY29uc3RleHByIGludCBrVGVzdEltYWdlRm9ybWF0ID0gQUlNQUdFX0ZPUk1BVF9ZVVZfNDIwXzg4ODsKKworY2xhc3MgQ2FtZXJhSGVscGVyIHsKKyAgIHB1YmxpYzoKKyAgICBDYW1lcmFIZWxwZXIoY29uc3QgY2hhciogaWQsIEFDYW1lcmFNYW5hZ2VyICptYW5hZ2VyKSA6CisgICAgICAgICAgICBtSW1nUmVhZGVyQW53KG51bGxwdHIpLCBtQ2FtZXJhSWQoaWQpLCBtQ2FtZXJhTWFuYWdlcihtYW5hZ2VyKSB7fQorICAgIH5DYW1lcmFIZWxwZXIoKSB7IGNsb3NlQ2FtZXJhKCk7IH0KKworICAgIHN0cnVjdCBQaHlzaWNhbEltZ1JlYWRlckluZm8geworICAgICAgICBjb25zdCBjaGFyKiBwaHlzaWNhbENhbWVyYUlkOworICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGFudzsKKyAgICB9OworICAgIGludCBpbml0Q2FtZXJhKG5hdGl2ZV9oYW5kbGVfdCogaW1nUmVhZGVyQW53LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UGh5c2ljYWxJbWdSZWFkZXJJbmZvPiYgcGh5c2ljYWxJbWdSZWFkZXJzKSB7CisgICAgICAgIGlmIChpbWdSZWFkZXJBbncgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBpbml0aWFsaXplIGNhbWVyYSBiZWZvcmUgaW1hZ2UgcmVhZGVyIGdldCBpbml0aWFsaXplZC4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUlzQ2FtZXJhUmVhZHkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJpbml0Q2FtZXJhIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlLiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgaW50IHJldDsKKyAgICAgICAgbUltZ1JlYWRlckFudyA9IGltZ1JlYWRlckFudzsKKworICAgICAgICByZXQgPSBBQ2FtZXJhTWFuYWdlcl9vcGVuQ2FtZXJhKG1DYW1lcmFNYW5hZ2VyLCBtQ2FtZXJhSWQsICZtRGV2aWNlQ2IsICZtRGV2aWNlKTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0sgfHwgbURldmljZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9wZW4gY2FtZXJhLCByZXQ9JWQsIG1EZXZpY2U9JXAuIiwgcmV0LCBtRGV2aWNlKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSBjYXB0dXJlIHNlc3Npb24KKyAgICAgICAgcmV0ID0gQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2NyZWF0ZSgmbU91dHB1dHMpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9jcmVhdGUgZmFpbGVkLCByZXQ9JWQiLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfY3JlYXRlKG1JbWdSZWFkZXJBbncsICZtSW1nUmVhZGVyT3V0cHV0KTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQ2FwdHVyZVNlc3Npb25PdXRwdXRfY3JlYXRlIGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2FkZChtT3V0cHV0cywgbUltZ1JlYWRlck91dHB1dCk7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2FkZCBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgZm9yIChhdXRvJiBwaHlzaWNhbFN0cmVhbSA6IHBoeXNpY2FsSW1nUmVhZGVycykgeworICAgICAgICAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KiBzZXNzaW9uT3V0cHV0ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHJldCA9IEFDYXB0dXJlU2Vzc2lvblBoeXNpY2FsT3V0cHV0X2NyZWF0ZShwaHlzaWNhbFN0cmVhbS5hbncsCisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsU3RyZWFtLnBoeXNpY2FsQ2FtZXJhSWQsICZzZXNzaW9uT3V0cHV0KTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBQ2FwdHVyZVNlc3Npb25QaHlzaWNhbE91dHB1dF9jcmVhdGUgZmFpbGVkLCByZXQ9JWQiLCByZXQpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXQgPSBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfYWRkKG1PdXRwdXRzLCBzZXNzaW9uT3V0cHV0KTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9hZGQgZmFpbGVkLCByZXQ9JWQiLCByZXQpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRXh0cmFPdXRwdXRzLnB1c2hfYmFjayhzZXNzaW9uT3V0cHV0KTsKKyAgICAgICAgICAgIC8vIEFzc3VtZSB0aGF0IGF0IG1vc3Qgb25lIHBoeXNpY2FsIHN0cmVhbSBwZXIgcGh5c2ljYWwgY2FtZXJhLgorICAgICAgICAgICAgbVBoeXNpY2FsQ2FtZXJhSWRzLnB1c2hfYmFjayhwaHlzaWNhbFN0cmVhbS5waHlzaWNhbENhbWVyYUlkKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb24obURldmljZSwgbU91dHB1dHMsICZtU2Vzc2lvbkNiLCAmbVNlc3Npb24pOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb24gZmFpbGVkLCByZXQ9JWQiLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSBjYXB0dXJlIHJlcXVlc3QKKyAgICAgICAgcmV0ID0gQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdChtRGV2aWNlLCBURU1QTEFURV9TVElMTF9DQVBUVVJFLCAmbVN0aWxsUmVxdWVzdCk7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdCBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHJldCA9IEFDYW1lcmFPdXRwdXRUYXJnZXRfY3JlYXRlKG1JbWdSZWFkZXJBbncsICZtUmVxSW1nUmVhZGVyT3V0cHV0KTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQ2FtZXJhT3V0cHV0VGFyZ2V0X2NyZWF0ZSBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHJldCA9IEFDYXB0dXJlUmVxdWVzdF9hZGRUYXJnZXQobVN0aWxsUmVxdWVzdCwgbVJlcUltZ1JlYWRlck91dHB1dCk7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQUNhcHR1cmVSZXF1ZXN0X2FkZFRhcmdldCBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgZm9yIChhdXRvJiBwaHlzaWNhbFN0cmVhbSA6IHBoeXNpY2FsSW1nUmVhZGVycykgeworICAgICAgICAgICAgQUNhbWVyYU91dHB1dFRhcmdldCogb3V0cHV0VGFyZ2V0ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHJldCA9IEFDYW1lcmFPdXRwdXRUYXJnZXRfY3JlYXRlKHBoeXNpY2FsU3RyZWFtLmFudywgJm91dHB1dFRhcmdldCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBQ2FtZXJhT3V0cHV0VGFyZ2V0X2NyZWF0ZSBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldCA9IEFDYXB0dXJlUmVxdWVzdF9hZGRUYXJnZXQobVN0aWxsUmVxdWVzdCwgb3V0cHV0VGFyZ2V0KTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkFDYXB0dXJlUmVxdWVzdF9hZGRUYXJnZXQgZmFpbGVkLCByZXQ9JWQiLCByZXQpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUmVxRXh0cmFPdXRwdXRzLnB1c2hfYmFjayhvdXRwdXRUYXJnZXQpOworICAgICAgICB9CisKKyAgICAgICAgbUlzQ2FtZXJhUmVhZHkgPSB0cnVlOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKworICAgIGJvb2wgaXNDYW1lcmFSZWFkeSgpIHsgcmV0dXJuIG1Jc0NhbWVyYVJlYWR5OyB9CisKKyAgICB2b2lkIGNsb3NlQ2FtZXJhKCkgeworICAgICAgICAvLyBEZXN0cm95IGNhcHR1cmUgcmVxdWVzdAorICAgICAgICBpZiAobVJlcUltZ1JlYWRlck91dHB1dCkgeworICAgICAgICAgICAgQUNhbWVyYU91dHB1dFRhcmdldF9mcmVlKG1SZXFJbWdSZWFkZXJPdXRwdXQpOworICAgICAgICAgICAgbVJlcUltZ1JlYWRlck91dHB1dCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChhdXRvJiBvdXRwdXRUYXJnZXQgOiBtUmVxRXh0cmFPdXRwdXRzKSB7CisgICAgICAgICAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2ZyZWUob3V0cHV0VGFyZ2V0KTsKKyAgICAgICAgfQorICAgICAgICBtUmVxRXh0cmFPdXRwdXRzLmNsZWFyKCk7CisgICAgICAgIGlmIChtU3RpbGxSZXF1ZXN0KSB7CisgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3RfZnJlZShtU3RpbGxSZXF1ZXN0KTsKKyAgICAgICAgICAgIG1TdGlsbFJlcXVlc3QgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIC8vIERlc3Ryb3kgY2FwdHVyZSBzZXNzaW9uCisgICAgICAgIGlmIChtU2Vzc2lvbiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2xvc2UobVNlc3Npb24pOworICAgICAgICAgICAgbVNlc3Npb24gPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGlmIChtSW1nUmVhZGVyT3V0cHV0KSB7CisgICAgICAgICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfZnJlZShtSW1nUmVhZGVyT3V0cHV0KTsKKyAgICAgICAgICAgIG1JbWdSZWFkZXJPdXRwdXQgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGZvciAoYXV0byYgZXh0cmFPdXRwdXQgOiBtRXh0cmFPdXRwdXRzKSB7CisgICAgICAgICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfZnJlZShleHRyYU91dHB1dCk7CisgICAgICAgIH0KKyAgICAgICAgbUV4dHJhT3V0cHV0cy5jbGVhcigpOworICAgICAgICBpZiAobU91dHB1dHMpIHsKKyAgICAgICAgICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9mcmVlKG1PdXRwdXRzKTsKKyAgICAgICAgICAgIG1PdXRwdXRzID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICAvLyBEZXN0cm95IGNhbWVyYSBkZXZpY2UKKyAgICAgICAgaWYgKG1EZXZpY2UpIHsKKyAgICAgICAgICAgIEFDYW1lcmFEZXZpY2VfY2xvc2UobURldmljZSk7CisgICAgICAgICAgICBtRGV2aWNlID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBtSXNDYW1lcmFSZWFkeSA9IGZhbHNlOworICAgIH0KKworICAgIGludCB0YWtlUGljdHVyZSgpIHsKKyAgICAgICAgaW50IHNlcUlkOworICAgICAgICByZXR1cm4gQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmUobVNlc3Npb24sICZtQ2FwdHVyZUNhbGxiYWNrcywgMSwgJm1TdGlsbFJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VxSWQpOworICAgIH0KKworICAgIGludCB0YWtlTG9naWNhbENhbWVyYVBpY3R1cmUoKSB7CisgICAgICAgIGludCBzZXFJZDsKKyAgICAgICAgcmV0dXJuIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmUobVNlc3Npb24sICZtTG9naWNhbENhcHR1cmVDYWxsYmFja3MsCisgICAgICAgICAgICAgICAgMSwgJm1TdGlsbFJlcXVlc3QsICZzZXFJZCk7CisgICAgfQorCisgICAgYm9vbCBjaGVja0NhbGxiYWNrcyhpbnQgcGljdHVyZUNvdW50KSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIGlmIChtQ29tcGxldGVkQ2FwdHVyZUNhbGxiYWNrQ291bnQgIT0gcGljdHVyZUNvdW50KSB7CisgICAgICAgICAgICBBTE9HRSgiQ29tcGxldGVkIGNhcHR1cmUgY2FsbGFiYWNrIGNvdW50IG5vdCBhcyBleHBlY3RlZC4gZXhwZWN0ZWQgJWQgYWN0dWFsICVkIiwKKyAgICAgICAgICAgICAgICAgIHBpY3R1cmVDb3VudCwgbUNvbXBsZXRlZENhcHR1cmVDYWxsYmFja0NvdW50KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBvbkRldmljZURpc2Nvbm5lY3RlZCh2b2lkKiAvKm9iaiovLCBBQ2FtZXJhRGV2aWNlKiAvKmRldmljZSovKSB7fQorCisgICAgc3RhdGljIHZvaWQgb25EZXZpY2VFcnJvcih2b2lkKiAvKm9iaiovLCBBQ2FtZXJhRGV2aWNlKiAvKmRldmljZSovLCBpbnQgLyplcnJvckNvZGUqLykge30KKworICAgIHN0YXRpYyB2b2lkIG9uU2Vzc2lvbkNsb3NlZCh2b2lkKiAvKm9iaiovLCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIC8qc2Vzc2lvbiovKSB7fQorCisgICAgc3RhdGljIHZvaWQgb25TZXNzaW9uUmVhZHkodm9pZCogLypvYmoqLywgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiAvKnNlc3Npb24qLykge30KKworICAgIHN0YXRpYyB2b2lkIG9uU2Vzc2lvbkFjdGl2ZSh2b2lkKiAvKm9iaiovLCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIC8qc2Vzc2lvbiovKSB7fQorCisgICBwcml2YXRlOgorICAgIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MgbURldmljZUNie3RoaXMsIG9uRGV2aWNlRGlzY29ubmVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRGV2aWNlRXJyb3J9OworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrcyBtU2Vzc2lvbkNieworICAgICAgICB0aGlzLCBvblNlc3Npb25DbG9zZWQsIG9uU2Vzc2lvblJlYWR5LCBvblNlc3Npb25BY3RpdmV9OworCisgICAgbmF0aXZlX2hhbmRsZV90KiBtSW1nUmVhZGVyQW53ID0gbnVsbHB0cjsgIC8vIG5vdCBvd25lZCBieSB1cy4KKworICAgIC8vIENhbWVyYSBkZXZpY2UKKyAgICBBQ2FtZXJhRGV2aWNlKiBtRGV2aWNlID0gbnVsbHB0cjsKKyAgICAvLyBDYXB0dXJlIHNlc3Npb24KKyAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqIG1PdXRwdXRzID0gbnVsbHB0cjsKKyAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXQqIG1JbWdSZWFkZXJPdXRwdXQgPSBudWxscHRyOworICAgIHN0ZDo6dmVjdG9yPEFDYXB0dXJlU2Vzc2lvbk91dHB1dCo+IG1FeHRyYU91dHB1dHM7CisKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIG1TZXNzaW9uID0gbnVsbHB0cjsKKyAgICAvLyBDYXB0dXJlIHJlcXVlc3QKKyAgICBBQ2FwdHVyZVJlcXVlc3QqIG1TdGlsbFJlcXVlc3QgPSBudWxscHRyOworICAgIEFDYW1lcmFPdXRwdXRUYXJnZXQqIG1SZXFJbWdSZWFkZXJPdXRwdXQgPSBudWxscHRyOworICAgIHN0ZDo6dmVjdG9yPEFDYW1lcmFPdXRwdXRUYXJnZXQqPiBtUmVxRXh0cmFPdXRwdXRzOworCisgICAgYm9vbCBtSXNDYW1lcmFSZWFkeSA9IGZhbHNlOworICAgIGNvbnN0IGNoYXIqIG1DYW1lcmFJZDsKKyAgICBBQ2FtZXJhTWFuYWdlciogbUNhbWVyYU1hbmFnZXI7CisgICAgaW50IG1Db21wbGV0ZWRDYXB0dXJlQ2FsbGJhY2tDb3VudCA9IDA7CisgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MgbUNhcHR1cmVDYWxsYmFja3MgPSB7CisgICAgICAgIC8vIFRPRE86IEFkZCB0ZXN0cyBmb3Igb3RoZXIgY2FsbGJhY2tzCisgICAgICAgIHRoaXMsIC8vIGNvbnRleHQKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlU3RhcnRlZAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVQcm9ncmVzc2VkCisgICAgICAgIFtdKHZvaWQqIGN0eCAsIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiAqLCBBQ2FwdHVyZVJlcXVlc3QgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFNZXRhZGF0YSAqKSB7CisgICAgICAgICAgICBDYW1lcmFIZWxwZXIgKmNoID0gc3RhdGljX2Nhc3Q8Q2FtZXJhSGVscGVyICo+KGN0eCk7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhjaC0+bU11dGV4KTsKKyAgICAgICAgICAgIGNoLT5tQ29tcGxldGVkQ2FwdHVyZUNhbGxiYWNrQ291bnQrKzsKKyAgICAgICAgfSwKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlRmFpbGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVCdWZmZXJMb3N0CisgICAgfTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtUGh5c2ljYWxDYW1lcmFJZHM7CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrcyBtTG9naWNhbENhcHR1cmVDYWxsYmFja3MgPSB7CisgICAgICAgIC8vIFRPRE86IEFkZCB0ZXN0cyBmb3Igb3RoZXIgY2FsbGJhY2tzCisgICAgICAgIHRoaXMsIC8vIGNvbnRleHQKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlU3RhcnRlZAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVQcm9ncmVzc2VkCisgICAgICAgIFtdKHZvaWQqIGN0eCAsIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiAqLCBBQ2FwdHVyZVJlcXVlc3QgKiwKKyAgICAgICAgICAgICAgICBjb25zdCBBQ2FtZXJhTWV0YWRhdGEgKiwgc2l6ZV90IHBoeXNpY2FsUmVzdWx0Q291bnQsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhcioqIHBoeXNpY2FsQ2FtZXJhSWRzLCBjb25zdCBBQ2FtZXJhTWV0YWRhdGEqKiBwaHlzaWNhbFJlc3VsdHMpIHsKKyAgICAgICAgICAgIENhbWVyYUhlbHBlciAqY2ggPSBzdGF0aWNfY2FzdDxDYW1lcmFIZWxwZXIgKj4oY3R4KTsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGNoLT5tTXV0ZXgpOworICAgICAgICAgICAgQVNTRVJUX0VRKHBoeXNpY2FsUmVzdWx0Q291bnQsIGNoLT5tUGh5c2ljYWxDYW1lcmFJZHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGh5c2ljYWxSZXN1bHRDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUocGh5c2ljYWxDYW1lcmFJZHNbaV0gIT0gbnVsbHB0cik7CisgICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUocGh5c2ljYWxSZXN1bHRzW2ldICE9IG51bGxwdHIpOworICAgICAgICAgICAgICAgIEFTU0VSVF9ORShzdGQ6OmZpbmQoY2gtPm1QaHlzaWNhbENhbWVyYUlkcy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgY2gtPm1QaHlzaWNhbENhbWVyYUlkcy5lbmQoKSwgcGh5c2ljYWxDYW1lcmFJZHNbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgY2gtPm1QaHlzaWNhbENhbWVyYUlkcy5lbmQoKSk7CisKKyAgICAgICAgICAgICAgICAvLyBWZXJpZnkgZnJhbWVOdW1iZXIgYW5kIHNlbnNvclRpbWVzdGFtcCBleGlzdCBpbiBwaHlzaWNhbAorICAgICAgICAgICAgICAgIC8vIHJlc3VsdCBtZXRhZGF0YQorICAgICAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9jb25zdF9lbnRyeSBlbnRyeTsKKyAgICAgICAgICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfZ2V0Q29uc3RFbnRyeSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsUmVzdWx0c1tpXSwgQUNBTUVSQV9TWU5DX0ZSQU1FX05VTUJFUiwgJmVudHJ5KTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoZW50cnkuY291bnQsIDEpOworICAgICAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9nZXRDb25zdEVudHJ5KAorICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxSZXN1bHRzW2ldLCBBQ0FNRVJBX1NFTlNPUl9USU1FU1RBTVAsICZlbnRyeSk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKGVudHJ5LmNvdW50LCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoLT5tQ29tcGxldGVkQ2FwdHVyZUNhbGxiYWNrQ291bnQrKzsKKyAgICAgICAgfSwKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlRmFpbGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVCdWZmZXJMb3N0CisgICAgfTsKK307CisKK2NsYXNzIEltYWdlUmVhZGVyVGVzdENhc2UgeworICAgcHVibGljOgorICAgIEltYWdlUmVhZGVyVGVzdENhc2UoaW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWF4SW1hZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhc3luYykKKyAgICAgICAgOiBtV2lkdGgod2lkdGgpLAorICAgICAgICAgIG1IZWlnaHQoaGVpZ2h0KSwKKyAgICAgICAgICBtRm9ybWF0KGZvcm1hdCksCisgICAgICAgICAgbVVzYWdlKHVzYWdlKSwKKyAgICAgICAgICBtTWF4SW1hZ2VzKG1heEltYWdlcyksCisgICAgICAgICAgbUFzeW5jKGFzeW5jKSB7fQorCisgICAgfkltYWdlUmVhZGVyVGVzdENhc2UoKSB7CisgICAgICAgIGlmIChtSW1nUmVhZGVyQW53KSB7CisgICAgICAgICAgICBBSW1hZ2VSZWFkZXJfZGVsZXRlKG1JbWdSZWFkZXIpOworICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBjYWxsIG5hdGl2ZV9oYW5kbGVfdF9yZWxlYXNlIG9uIGltYWdlUmVhZGVyQW53CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQgaW5pdEltYWdlUmVhZGVyKCkgeworICAgICAgICBpZiAobUltZ1JlYWRlciAhPSBudWxscHRyIHx8IG1JbWdSZWFkZXJBbncgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCByZS1pbml0YWxpemUgaW1hZ2UgcmVhZGVyLCBtSW1nUmVhZGVyPSVwLCBtSW1nUmVhZGVyQW53PSVwIiwgbUltZ1JlYWRlciwKKyAgICAgICAgICAgICAgICAgIG1JbWdSZWFkZXJBbncpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0gQUltYWdlUmVhZGVyX25ld1dpdGhVc2FnZSgKKyAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQsIG1Gb3JtYXQsIG1Vc2FnZSwgbU1heEltYWdlcywgJm1JbWdSZWFkZXIpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSyB8fCBtSW1nUmVhZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIG5ldyBBSW1hZ2VSZWFkZXIsIHJldD0lZCwgbUltZ1JlYWRlcj0lcCIsIHJldCwgbUltZ1JlYWRlcik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBBSW1hZ2VSZWFkZXJfc2V0SW1hZ2VMaXN0ZW5lcihtSW1nUmVhZGVyLCAmbVJlYWRlckF2YWlsYWJsZUNiKTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IGltYWdlIGF2YWlsYWJsZSBsaXN0ZW5lciwgcmV0PSVkLiIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gQUltYWdlUmVhZGVyX3NldEJ1ZmZlclJlbW92ZWRMaXN0ZW5lcihtSW1nUmVhZGVyLCAmbVJlYWRlckRldGFjaGVkQ2IpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgYnVmZmVyIGRldGFjaGluZyBsaXN0ZW5lciwgcmV0PSVkLiIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gQUltYWdlUmVhZGVyX2dldFdpbmRvd05hdGl2ZUhhbmRsZShtSW1nUmVhZGVyLCAmbUltZ1JlYWRlckFudyk7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LIHx8IG1JbWdSZWFkZXJBbncgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgbmF0aXZlX2hhbmRsZV90IGZyb20gQUltYWdlUmVhZGVyLCByZXQ9JWQsIG1JbWdSZWFkZXJBbnc9JXAuIiwgcmV0LAorICAgICAgICAgICAgICAgICAgbUltZ1JlYWRlckFudyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBuYXRpdmVfaGFuZGxlX3QqIGdldE5hdGl2ZVdpbmRvdygpIHsgcmV0dXJuIG1JbWdSZWFkZXJBbnc7IH0KKworICAgIGludCBnZXRBY3F1aXJlZEltYWdlQ291bnQoKSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIHJldHVybiBtQWNxdWlyZWRJbWFnZUNvdW50OworICAgIH0KKworICAgIHZvaWQgSGFuZGxlSW1hZ2VBdmFpbGFibGUoQUltYWdlUmVhZGVyKiByZWFkZXIpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKworICAgICAgICBBSW1hZ2UqIG91dEltYWdlID0gbnVsbHB0cjsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgcmV0OworCisgICAgICAgIC8vIE1ha2Ugc3VyZSBBSW1hZ2Ugd2lsbCBiZSBkZWxldGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBpdCBnb2VzIG91dCBvZgorICAgICAgICAvLyBzY29wZS4KKyAgICAgICAgYXV0byBpbWFnZURlbGV0ZXIgPSBbdGhpc10oQUltYWdlKiBpbWcpIHsKKyAgICAgICAgICAgIGlmIChtQXN5bmMpIHsKKyAgICAgICAgICAgICAgICBBSW1hZ2VfZGVsZXRlQXN5bmMoaW1nLCBrRHVtbXlGZW5jZUZkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUltYWdlX2RlbGV0ZShpbWcpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QUltYWdlLCBkZWNsdHlwZShpbWFnZURlbGV0ZXIpPiBpbWcobnVsbHB0ciwgaW1hZ2VEZWxldGVyKTsKKworICAgICAgICBpZiAobUFzeW5jKSB7CisgICAgICAgICAgICBpbnQgb3V0RmVuY2VGZCA9IDA7CisgICAgICAgICAgICAvLyBWZXJpdHkgdGhhdCBvdXRGZW5jZUZkJ3MgdmFsdWUgd2lsbCBiZSBjaGFuZ2VkIGJ5CisgICAgICAgICAgICAvLyBBSW1hZ2VSZWFkZXJfYWNxdWlyZU5leHRJbWFnZUFzeW5jLgorICAgICAgICAgICAgcmV0ID0gQUltYWdlUmVhZGVyX2FjcXVpcmVOZXh0SW1hZ2VBc3luYyhyZWFkZXIsICZvdXRJbWFnZSwgJm91dEZlbmNlRmQpOworICAgICAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0sgfHwgb3V0SW1hZ2UgPT0gbnVsbHB0ciB8fCBvdXRGZW5jZUZkID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFjcXVpcmUgaW1hZ2UsIHJldD0lZCwgb3V0SWFtZ2U9JXAsIG91dEZlbmNlRmQ9JWQuIiwgcmV0LCBvdXRJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICBvdXRGZW5jZUZkKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbWcucmVzZXQob3V0SW1hZ2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gQUltYWdlUmVhZGVyX2FjcXVpcmVOZXh0SW1hZ2UocmVhZGVyLCAmb3V0SW1hZ2UpOworICAgICAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0sgfHwgb3V0SW1hZ2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWNxdWlyZSBpbWFnZSwgcmV0PSVkLCBvdXRJYW1nZT0lcC4iLCByZXQsIG91dEltYWdlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbWcucmVzZXQob3V0SW1hZ2UpOworICAgICAgICB9CisKKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyKiBvdXRCdWZmZXIgPSBudWxscHRyOworICAgICAgICByZXQgPSBBSW1hZ2VfZ2V0SGFyZHdhcmVCdWZmZXIoaW1nLmdldCgpLCAmb3V0QnVmZmVyKTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0sgfHwgb3V0QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZCB0byBnZXQgaGFyZHdhcmUgYnVmZmVyLCByZXQ9JWQsIG91dEJ1ZmZlcj0lcC4iLCByZXQsIG91dEJ1ZmZlcik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBObyBuZWVkIHRvIHJlbGVhc2UgQUhhcmR3YXJlQnVmZmVyLCBzaW5jZSB3ZSBkb24ndCBhY3F1aXJlIGFkZGl0aW9uYWwKKyAgICAgICAgLy8gcmVmZXJlbmNlIHRvIGl0LgorICAgICAgICBBSGFyZHdhcmVCdWZmZXJfRGVzYyBvdXREZXNjOworICAgICAgICBBSGFyZHdhcmVCdWZmZXJfZGVzY3JpYmUob3V0QnVmZmVyLCAmb3V0RGVzYyk7CisgICAgICAgIGludDMyX3QgaW1hZ2VXaWR0aCA9IDA7CisgICAgICAgIGludDMyX3QgaW1hZ2VIZWlnaHQgPSAwOworICAgICAgICBpbnQzMl90IGJ1ZmZlcldpZHRoID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4ob3V0RGVzYy53aWR0aCk7CisgICAgICAgIGludDMyX3QgYnVmZmVySGVpZ2h0ID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4ob3V0RGVzYy5oZWlnaHQpOworCisgICAgICAgIEFJbWFnZV9nZXRXaWR0aChvdXRJbWFnZSwgJmltYWdlV2lkdGgpOworICAgICAgICBBSW1hZ2VfZ2V0SGVpZ2h0KG91dEltYWdlLCAmaW1hZ2VIZWlnaHQpOworICAgICAgICBpZiAoaW1hZ2VXaWR0aCAhPSBtV2lkdGggfHwgaW1hZ2VIZWlnaHQgIT0gbUhlaWdodCkgeworICAgICAgICAgICAgQUxPR0UoIk1pc21hdGNoZWQgb3V0cHV0IGltYWdlIGRpbWVuc2lvbjogZXhwZWN0ZWQ9JWR4JWQsIGFjdHVhbD0lZHglZCIsIG1XaWR0aCwKKyAgICAgICAgICAgICAgICAgIG1IZWlnaHQsIGltYWdlV2lkdGgsIGltYWdlSGVpZ2h0KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRm9ybWF0ID09IEFJTUFHRV9GT1JNQVRfUkdCQV84ODg4IHx8CisgICAgICAgICAgICBtRm9ybWF0ID09IEFJTUFHRV9GT1JNQVRfUkdCWF84ODg4IHx8CisgICAgICAgICAgICBtRm9ybWF0ID09IEFJTUFHRV9GT1JNQVRfUkdCXzg4OCB8fAorICAgICAgICAgICAgbUZvcm1hdCA9PSBBSU1BR0VfRk9STUFUX1JHQl81NjUgfHwKKyAgICAgICAgICAgIG1Gb3JtYXQgPT0gQUlNQUdFX0ZPUk1BVF9SR0JBX0ZQMTYgfHwKKyAgICAgICAgICAgIG1Gb3JtYXQgPT0gQUlNQUdFX0ZPUk1BVF9ZVVZfNDIwXzg4OCB8fAorICAgICAgICAgICAgbUZvcm1hdCA9PSBBSU1BR0VfRk9STUFUX1k4KSB7CisgICAgICAgICAgICAvLyBDaGVjayBvdXRwdXQgYnVmZmVyIGRpbWVuc2lvbiBmb3IgY2VydGFpbiBmb3JtYXRzLiBEb24ndCBkbyB0aGlzIGZvciBibG9iIGJhc2VkCisgICAgICAgICAgICAvLyBmb3JtYXRzLgorICAgICAgICAgICAgaWYgKGJ1ZmZlcldpZHRoICE9IG1XaWR0aCB8fCBidWZmZXJIZWlnaHQgIT0gbUhlaWdodCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJNaXNtYXRjaGVkIG91dHB1dCBidWZmZXIgZGltZW5zaW9uOiBleHBlY3RlZD0lZHglZCwgYWN0dWFsPSVkeCVkIiwgbVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgIG1IZWlnaHQsIGJ1ZmZlcldpZHRoLCBidWZmZXJIZWlnaHQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICgob3V0RGVzYy51c2FnZSAmIG1Vc2FnZSkgIT0gbVVzYWdlKSB7CisgICAgICAgICAgICBBTE9HRSgiTWlzbWF0Y2hlZCBvdXRwdXQgYnVmZmVyIHVzYWdlOiBhY3R1YWwgKCUiIFBSSXU2NCAiKSwgZXhwZWN0ZWQgKCUiIFBSSXU2NCAiKSIsCisgICAgICAgICAgICAgICAgICBvdXREZXNjLnVzYWdlLCBtVXNhZ2UpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdWludDhfdCogZGF0YSA9IG51bGxwdHI7CisgICAgICAgIGludCBkYXRhTGVuZ3RoID0gMDsKKyAgICAgICAgcmV0ID0gQUltYWdlX2dldFBsYW5lRGF0YShpbWcuZ2V0KCksIDAsICZkYXRhLCAmZGF0YUxlbmd0aCk7CisgICAgICAgIGlmIChtVXNhZ2UgJiBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfQ1BVX1JFQURfT0ZURU4pIHsKKyAgICAgICAgICAgIC8vIFdoZW4gd2UgaGF2ZSBDUFVfUkVBRF9PRlRFTiB1c2FnZSBiaXRzLCB3ZSBjYW4gbG9jayB0aGUgaW1hZ2UuCisgICAgICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSyB8fCBkYXRhID09IG51bGxwdHIgfHwgZGF0YUxlbmd0aCA8IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFjY2VzcyBDUFUgZGF0YSwgcmV0PSVkLCBkYXRhPSVwLCBkYXRhTGVuZ3RoPSVkIiwgcmV0LCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgIGRhdGFMZW5ndGgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX0lNR1JFQURFUl9DQU5OT1RfTE9DS19JTUFHRSB8fCBkYXRhICE9IG51bGxwdHIgfHwgZGF0YUxlbmd0aCAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlNob3VsZG4ndCBiZSBhYmxlIHRvIGFjY2VzcyBDUFUgZGF0YSwgcmV0PSVkLCBkYXRhPSVwLCBkYXRhTGVuZ3RoPSVkIiwgcmV0LAorICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIGRhdGFMZW5ndGgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBPbmx5IGluY3JlYXNlIG1BY3F1aXJlZEltYWdlQ291bnQgaWYgYWxsIGNoZWNrcyBwYXNzLgorICAgICAgICBtQWNxdWlyZWRJbWFnZUNvdW50Kys7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgb25JbWFnZUF2YWlsYWJsZSh2b2lkKiBvYmosIEFJbWFnZVJlYWRlciogcmVhZGVyKSB7CisgICAgICAgIEltYWdlUmVhZGVyVGVzdENhc2UqIHRoaXogPSByZWludGVycHJldF9jYXN0PEltYWdlUmVhZGVyVGVzdENhc2UqPihvYmopOworICAgICAgICB0aGl6LT5IYW5kbGVJbWFnZUF2YWlsYWJsZShyZWFkZXIpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkCisgICAgb25CdWZmZXJSZW1vdmVkKHZvaWQqIC8qb2JqKi8sIEFJbWFnZVJlYWRlciogLypyZWFkZXIqLywgQUhhcmR3YXJlQnVmZmVyKiAvKmJ1ZmZlciovKSB7CisgICAgICAgIC8vIE5vLW9wLCBqdXN0IHRvIGNoZWNrIHRoZSBsaXN0ZW5lciBjYW4gYmUgc2V0IHByb3Blcmx5LgorICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBpbnQzMl90IG1XaWR0aDsKKyAgICBpbnQzMl90IG1IZWlnaHQ7CisgICAgaW50MzJfdCBtRm9ybWF0OworICAgIHVpbnQ2NF90IG1Vc2FnZTsKKyAgICBpbnQzMl90IG1NYXhJbWFnZXM7CisgICAgYm9vbCBtQXN5bmM7CisKKyAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBpbnQgbUFjcXVpcmVkSW1hZ2VDb3VudHswfTsKKworICAgIEFJbWFnZVJlYWRlciogbUltZ1JlYWRlciA9IG51bGxwdHI7CisgICAgbmF0aXZlX2hhbmRsZV90KiBtSW1nUmVhZGVyQW53ID0gbnVsbHB0cjsKKworICAgIEFJbWFnZVJlYWRlcl9JbWFnZUxpc3RlbmVyIG1SZWFkZXJBdmFpbGFibGVDYnt0aGlzLCBvbkltYWdlQXZhaWxhYmxlfTsKKyAgICBBSW1hZ2VSZWFkZXJfQnVmZmVyUmVtb3ZlZExpc3RlbmVyIG1SZWFkZXJEZXRhY2hlZENie3RoaXMsIG9uQnVmZmVyUmVtb3ZlZH07Cit9OworCisKK2NsYXNzIEFJbWFnZVJlYWRlclZlbmRvclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyAgcHVibGljOgorICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIG1DYW1lcmFNYW5hZ2VyID0gQUNhbWVyYU1hbmFnZXJfY3JlYXRlKCk7CisgICAgICAgIGlmIChtQ2FtZXJhTWFuYWdlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBBQ2FtZXJhTWFuYWdlci4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFJZExpc3QobUNhbWVyYU1hbmFnZXIsICZtQ2FtZXJhSWRMaXN0KTsKKyAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBjYW1lcmFJZExpc3Q6IHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1DYW1lcmFJZExpc3QtPm51bUNhbWVyYXMgPCAxKSB7CisgICAgICAgICAgICBBTE9HVygiRGV2aWNlIGhhcyBubyBjYW1lcmEgb24gYm9hcmQuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gRGVzdHJveSBjYW1lcmEgbWFuYWdlcgorICAgICAgICBpZiAobUNhbWVyYUlkTGlzdCkgeworICAgICAgICAgICAgQUNhbWVyYU1hbmFnZXJfZGVsZXRlQ2FtZXJhSWRMaXN0KG1DYW1lcmFJZExpc3QpOworICAgICAgICAgICAgbUNhbWVyYUlkTGlzdCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1DYW1lcmFNYW5hZ2VyKSB7CisgICAgICAgICAgICBBQ2FtZXJhTWFuYWdlcl9kZWxldGUobUNhbWVyYU1hbmFnZXIpOworICAgICAgICAgICAgbUNhbWVyYU1hbmFnZXIgPSBudWxscHRyOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCB0YWtlUGljdHVyZXMoY29uc3QgY2hhciogaWQsIHVpbnQ2NF90IHJlYWRlclVzYWdlLCBpbnQgcmVhZGVyTWF4SW1hZ2VzLAorICAgICAgICAgICAgYm9vbCByZWFkZXJBc3luYywgaW50IHBpY3R1cmVDb3VudCkgeworICAgICAgICBpbnQgcmV0ID0gMDsKKworICAgICAgICBJbWFnZVJlYWRlclRlc3RDYXNlIHRlc3RDYXNlKAorICAgICAgICAgICAgICAgIGtUZXN0SW1hZ2VXaWR0aCwga1Rlc3RJbWFnZUhlaWdodCwga1Rlc3RJbWFnZUZvcm1hdCwgcmVhZGVyVXNhZ2UsIHJlYWRlck1heEltYWdlcywKKyAgICAgICAgICAgICAgICByZWFkZXJBc3luYyk7CisgICAgICAgIHJldCA9IHRlc3RDYXNlLmluaXRJbWFnZVJlYWRlcigpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBpbml0aWFsaXplIEltYWdlUmVhZGVyIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBDYW1lcmFIZWxwZXIgY2FtZXJhSGVscGVyKGlkLCBtQ2FtZXJhTWFuYWdlcik7CisgICAgICAgIHJldCA9IGNhbWVyYUhlbHBlci5pbml0Q2FtZXJhKHRlc3RDYXNlLmdldE5hdGl2ZVdpbmRvdygpLCB7fSk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGluaXRpYWxpemUgY2FtZXJhIGhlbHBlciIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFjYW1lcmFIZWxwZXIuaXNDYW1lcmFSZWFkeSgpKSB7CisgICAgICAgICAgICBBTE9HVygiQ2FtZXJhIGlzIG5vdCByZWFkeSBhZnRlciBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uLiBJdCdzIGVpdGhlciBkdWUgdG8gY2FtZXJhICIKKyAgICAgICAgICAgICAgICAgICJvbiBib2FyZCBsYWNrcyBCQUNLV0FSRFNfQ09NUEFUSUJMRSBjYXBhYmlsaXR5IG9yIHRoZSBkZXZpY2UgZG9lcyBub3QgaGF2ZSAiCisgICAgICAgICAgICAgICAgICAiY2FtZXJhIG9uIGJvYXJkLiIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpY3R1cmVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICByZXQgPSBjYW1lcmFIZWxwZXIudGFrZVBpY3R1cmUoKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byB0YWtlIHBpY3R1cmUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTbGVlcCB1bnRpbCBhbGwgY2FwdHVyZSBmaW5pc2hlZAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtDYXB0dXJlV2FpdFJldHJ5ICogcGljdHVyZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHVzbGVlcChrQ2FwdHVyZVdhaXRVcyk7CisgICAgICAgICAgICBpZiAodGVzdENhc2UuZ2V0QWNxdWlyZWRJbWFnZUNvdW50KCkgPT0gcGljdHVyZUNvdW50KSB7CisgICAgICAgICAgICAgICAgQUxPR0koIlNlc3Npb24gdGFrZSB+JWQgbXMgdG8gY2FwdHVyZSAlZCBpbWFnZXMiLCBpICoga0NhcHR1cmVXYWl0VXMgLyAxMDAwLAorICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmVDb3VudCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRlc3RDYXNlLmdldEFjcXVpcmVkSW1hZ2VDb3VudCgpID09IHBpY3R1cmVDb3VudCAmJgorICAgICAgICAgICAgICAgIGNhbWVyYUhlbHBlci5jaGVja0NhbGxiYWNrcyhwaWN0dXJlQ291bnQpOworICAgIH0KKworICAgIGJvb2wgdGVzdFRha2VQaWN0dXJlc05hdGl2ZShjb25zdCBjaGFyKiBpZCkgeworICAgICAgICBmb3IgKGF1dG8mIHJlYWRlclVzYWdlIDoKKyAgICAgICAgICAgICB7QUhBUkRXQVJFQlVGRkVSX1VTQUdFX0NQVV9SRUFEX09GVEVOfSkgeworICAgICAgICAgICAgZm9yIChhdXRvJiByZWFkZXJNYXhJbWFnZXMgOiB7MSwgNCwgOH0pIHsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIHJlYWRlckFzeW5jIDoge3RydWUsIGZhbHNlfSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIHBpY3R1cmVDb3VudCA6IHsxLCA0LCA4fSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWtlUGljdHVyZXMoaWQsIHJlYWRlclVzYWdlLCByZWFkZXJNYXhJbWFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlckFzeW5jLCBwaWN0dXJlQ291bnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlRlc3QgdGFrZVBpY3R1cmVzIGZhaWxlZCBmb3IgdGVzdCBjYXNlIHVzYWdlPSUiIFBSSXU2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIG1heEltYWdlcz0lZCwgYXN5bmM9JWQsIHBpY3R1cmVDb3VudD0lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyVXNhZ2UsIHJlYWRlck1heEltYWdlcywgcmVhZGVyQXN5bmMsIHBpY3R1cmVDb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIENhbWVyYSBtYW5hZ2VyCisgICAgQUNhbWVyYU1hbmFnZXIqIG1DYW1lcmFNYW5hZ2VyID0gbnVsbHB0cjsKKyAgICBBQ2FtZXJhSWRMaXN0KiBtQ2FtZXJhSWRMaXN0ID0gbnVsbHB0cjsKKworICAgIGJvb2wgaXNDYXBhYmlsaXR5U3VwcG9ydGVkKEFDYW1lcmFNZXRhZGF0YSogc3RhdGljSW5mbywKKyAgICAgICAgICAgIGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3JlcXVlc3RfYXZhaWxhYmxlX2NhcGFiaWxpdGllc190IGNhcCkgeworICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfY29uc3RfZW50cnkgZW50cnk7CisgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9nZXRDb25zdEVudHJ5KAorICAgICAgICAgICAgICAgIHN0YXRpY0luZm8sIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTLCAmZW50cnkpOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZW50cnkuY291bnQ7IGkrKykgeworICAgICAgICAgICAgaWYgKGVudHJ5LmRhdGEudThbaV0gPT0gY2FwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgaXNTaXplU3VwcG9ydGVkRm9yRm9ybWF0KEFDYW1lcmFNZXRhZGF0YSogc3RhdGljSW5mbywKKyAgICAgICAgICAgIGludDMyX3QgZm9ybWF0LCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgeworICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfY29uc3RfZW50cnkgZW50cnk7CisgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9nZXRDb25zdEVudHJ5KHN0YXRpY0luZm8sCisgICAgICAgICAgICAgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUywgJmVudHJ5KTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyBpICs9IDQpIHsKKyAgICAgICAgICAgIGlmIChlbnRyeS5kYXRhLmkzMltpXSA9PSBmb3JtYXQgJiYKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuZGF0YS5pMzJbaSszXSA9PSBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX09VVFBVVCAmJgorICAgICAgICAgICAgICAgICAgICBlbnRyeS5kYXRhLmkzMltpKzFdID09IHdpZHRoICYmCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LmRhdGEuaTMyW2krMl0gPT0gaGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZvaWQgZmluZENhbmRpZGF0ZUxvZ2ljYWxDYW1lcmEoY29uc3QgY2hhciAqKmNhbWVyYUlkLAorICAgICAgICAgICAgQUNhbWVyYU1ldGFkYXRhKiogc3RhdGljTWV0YWRhdGEsCisgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4qIGNhbmRpZGF0ZVBoeXNpY2FsSWRzKSB7CisgICAgICAgIC8vIEZpbmQgZmlyc3QgYXZhaWxhYmxlIGxvZ2ljYWwgY2FtZXJhCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUNhbWVyYUlkTGlzdC0+bnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgICAgICBjYW1lcmFfc3RhdHVzX3QgcmV0OworICAgICAgICAgICAgcmV0ID0gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAorICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhTWFuYWdlciwgbUNhbWVyYUlkTGlzdC0+Y2FtZXJhSWRzW2ldLCBzdGF0aWNNZXRhZGF0YSk7CisgICAgICAgICAgICBBU1NFUlRfRVEocmV0LCBBQ0FNRVJBX09LKTsKKyAgICAgICAgICAgIEFTU0VSVF9ORSgqc3RhdGljTWV0YWRhdGEsIG51bGxwdHIpOworCisgICAgICAgICAgICBpZiAoIWlzQ2FwYWJpbGl0eVN1cHBvcnRlZCgqc3RhdGljTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX0xPR0lDQUxfTVVMVElfQ0FNRVJBKSkgeworICAgICAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9mcmVlKCpzdGF0aWNNZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgKnN0YXRpY01ldGFkYXRhID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2hlY2sgcmV0dXJuZWQgcGh5c2ljYWwgY2FtZXJhIElkcyBhcmUgdmFsaWQKKyAgICAgICAgICAgIHNpemVfdCBwaHlzaWNhbENhbWVyYUlkQ250ID0gMDsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqY29uc3QqIHBoeXNpY2FsQ2FtZXJhSWRzID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGJvb2wgaXNMb2dpY2FsQ2FtZXJhID0gQUNhbWVyYU1ldGFkYXRhX2lzTG9naWNhbE11bHRpQ2FtZXJhKCpzdGF0aWNNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgJnBoeXNpY2FsQ2FtZXJhSWRDbnQsICZwaHlzaWNhbENhbWVyYUlkcyk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShpc0xvZ2ljYWxDYW1lcmEpOworICAgICAgICAgICAgQVNTRVJUX0dFKHBoeXNpY2FsQ2FtZXJhSWRDbnQsIDIpOworICAgICAgICAgICAgQUNhbWVyYU1ldGFkYXRhKiBwaHlzaWNhbENhbWVyYU1ldGFkYXRhID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGNhbmRpZGF0ZVBoeXNpY2FsSWRzLT5jbGVhcigpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBwaHlzaWNhbENhbWVyYUlkQ250ICYmIGNhbmRpZGF0ZVBoeXNpY2FsSWRzLT5zaXplKCkgPCAyOyBqKyspIHsKKyAgICAgICAgICAgICAgICBBU1NFUlRfR1Qoc3RybGVuKHBoeXNpY2FsQ2FtZXJhSWRzW2pdKSwgMCk7CisgICAgICAgICAgICAgICAgcmV0ID0gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAorICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYU1hbmFnZXIsIHBoeXNpY2FsQ2FtZXJhSWRzW2pdLCAmcGh5c2ljYWxDYW1lcmFNZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKHJldCwgQUNBTUVSQV9PSyk7CisgICAgICAgICAgICAgICAgQVNTRVJUX05FKHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEsIG51bGxwdHIpOworCisgICAgICAgICAgICAgICAgaWYgKGlzU2l6ZVN1cHBvcnRlZEZvckZvcm1hdChwaHlzaWNhbENhbWVyYU1ldGFkYXRhLCBrVGVzdEltYWdlRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAga1Rlc3RJbWFnZVdpZHRoLCBrVGVzdEltYWdlSGVpZ2h0KSkgeworICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVQaHlzaWNhbElkcy0+cHVzaF9iYWNrKHBoeXNpY2FsQ2FtZXJhSWRzW2pdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2ZyZWUocGh5c2ljYWxDYW1lcmFNZXRhZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2FuZGlkYXRlUGh5c2ljYWxJZHMtPnNpemUoKSA9PSAyKSB7CisgICAgICAgICAgICAgICAgKmNhbWVyYUlkID0gbUNhbWVyYUlkTGlzdC0+Y2FtZXJhSWRzW2ldOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2ZyZWUoKnN0YXRpY01ldGFkYXRhKTsKKyAgICAgICAgICAgICAgICAqc3RhdGljTWV0YWRhdGEgPSBudWxscHRyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICpjYW1lcmFJZCA9IG51bGxwdHI7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9OworCitURVNUX0YoQUltYWdlUmVhZGVyVmVuZG9yVGVzdCwgQ3JlYXRlV2luZG93TmF0aXZlSGFuZGxlKSB7CisgICAgLy8gV2UgYWx3YXlzIHVzZSB0aGUgZmlyc3QgY2FtZXJhLgorICAgIGNvbnN0IGNoYXIqIGNhbWVyYUlkID0gbUNhbWVyYUlkTGlzdC0+Y2FtZXJhSWRzWzBdOworICAgIEFTU0VSVF9UUlVFKGNhbWVyYUlkICE9IG51bGxwdHIpOworCisgICAgQUNhbWVyYU1ldGFkYXRhKiBzdGF0aWNNZXRhZGF0YSA9IG51bGxwdHI7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljcygKKyAgICAgICAgICAgIG1DYW1lcmFNYW5hZ2VyLCBjYW1lcmFJZCwgJnN0YXRpY01ldGFkYXRhKTsKKyAgICBBU1NFUlRfRVEocmV0LCBBQ0FNRVJBX09LKTsKKyAgICBBU1NFUlRfTkUoc3RhdGljTWV0YWRhdGEsIG51bGxwdHIpOworCisgICAgYm9vbCBpc0JDID0gaXNDYXBhYmlsaXR5U3VwcG9ydGVkKHN0YXRpY01ldGFkYXRhLAorICAgICAgICAgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfQkFDS1dBUkRfQ09NUEFUSUJMRSk7CisKKyAgICBBQ2FtZXJhTWV0YWRhdGFfZnJlZShzdGF0aWNNZXRhZGF0YSk7CisKKyAgICBpZiAoIWlzQkMpIHsKKyAgICAgICAgQUxPR1coIkNhbWVyYSBkb2VzIG5vdCBzdXBwb3J0IEJBQ0tXQVJEX0NPTVBBVElCTEUuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0VGFrZVBpY3R1cmVzTmF0aXZlKGNhbWVyYUlkKSk7Cit9CisKK1RFU1RfRihBSW1hZ2VSZWFkZXJWZW5kb3JUZXN0LCBMb2dpY2FsQ2FtZXJhUGh5c2ljYWxTdHJlYW0pIHsKKyAgICBjb25zdCBjaGFyKiBjYW1lcmFJZCA9IG51bGxwdHI7CisgICAgQUNhbWVyYU1ldGFkYXRhKiBzdGF0aWNNZXRhZGF0YSA9IG51bGxwdHI7CisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+IHBoeXNpY2FsQ2FtZXJhSWRzOworCisgICAgZmluZENhbmRpZGF0ZUxvZ2ljYWxDYW1lcmEoJmNhbWVyYUlkLCAmc3RhdGljTWV0YWRhdGEsICZwaHlzaWNhbENhbWVyYUlkcyk7CisgICAgaWYgKGNhbWVyYUlkID09IG51bGxwdHIpIHsKKyAgICAgICAgLy8gQ291bGRuJ3QgZmluZCBsb2dpY2FsIGNhbWVyYSB0byB0ZXN0CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBUZXN0IHN0cmVhbWluZyB0aGUgbG9naWNhbCBtdWx0aS1jYW1lcmEKKyAgICB1aW50NjRfdCByZWFkZXJVc2FnZSA9IEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfUkVBRF9PRlRFTjsKKyAgICBpbnQzMl90IHJlYWRlck1heEltYWdlcyA9IDg7CisgICAgYm9vbCByZWFkZXJBc3luYyA9IGZhbHNlOworICAgIGNvbnN0IGludCBwaWN0dXJlQ291bnQgPSA2OworICAgIHN0ZDo6dmVjdG9yPEltYWdlUmVhZGVyVGVzdENhc2UqPiB0ZXN0Q2FzZXM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgSW1hZ2VSZWFkZXJUZXN0Q2FzZSogdGVzdENhc2UgPSBuZXcgSW1hZ2VSZWFkZXJUZXN0Q2FzZSgKKyAgICAgICAgICAgICAgICBrVGVzdEltYWdlV2lkdGgsIGtUZXN0SW1hZ2VIZWlnaHQsIGtUZXN0SW1hZ2VGb3JtYXQsIHJlYWRlclVzYWdlLCByZWFkZXJNYXhJbWFnZXMsCisgICAgICAgICAgICAgICAgcmVhZGVyQXN5bmMpOworICAgICAgICBBU1NFUlRfRVEodGVzdENhc2UtPmluaXRJbWFnZVJlYWRlcigpLCAwKTsKKyAgICAgICAgdGVzdENhc2VzLnB1c2hfYmFjayh0ZXN0Q2FzZSk7CisgICAgfQorCisgICAgQ2FtZXJhSGVscGVyIGNhbWVyYUhlbHBlcihjYW1lcmFJZCwgbUNhbWVyYU1hbmFnZXIpOworICAgIHN0ZDo6dmVjdG9yPENhbWVyYUhlbHBlcjo6UGh5c2ljYWxJbWdSZWFkZXJJbmZvPiBwaHlzaWNhbEltZ1JlYWRlckluZm87CisgICAgcGh5c2ljYWxJbWdSZWFkZXJJbmZvLnB1c2hfYmFjayh7cGh5c2ljYWxDYW1lcmFJZHNbMF0sIHRlc3RDYXNlc1sxXS0+Z2V0TmF0aXZlV2luZG93KCl9KTsKKyAgICBwaHlzaWNhbEltZ1JlYWRlckluZm8ucHVzaF9iYWNrKHtwaHlzaWNhbENhbWVyYUlkc1sxXSwgdGVzdENhc2VzWzJdLT5nZXROYXRpdmVXaW5kb3coKX0pOworCisgICAgaW50IHJldCA9IGNhbWVyYUhlbHBlci5pbml0Q2FtZXJhKHRlc3RDYXNlc1swXS0+Z2V0TmF0aXZlV2luZG93KCksIHBoeXNpY2FsSW1nUmVhZGVySW5mbyk7CisgICAgQVNTRVJUX0VRKHJldCwgMCk7CisKKyAgICBpZiAoIWNhbWVyYUhlbHBlci5pc0NhbWVyYVJlYWR5KCkpIHsKKyAgICAgICAgQUxPR1coIkNhbWVyYSBpcyBub3QgcmVhZHkgYWZ0ZXIgc3VjY2Vzc2Z1bCBpbml0aWFsaXphdGlvbi4gSXQncyBlaXRoZXIgZHVlIHRvIGNhbWVyYSBvbiAiCisgICAgICAgICAgICAgICJib2FyZCBsYWNrcyBCQUNLV0FSRFNfQ09NUEFUSUJMRSBjYXBhYmlsaXR5IG9yIHRoZSBkZXZpY2UgZG9lcyBub3QgaGF2ZSBjYW1lcmEgb24gIgorICAgICAgICAgICAgICAiYm9hcmQuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpY3R1cmVDb3VudDsgaSsrKSB7CisgICAgICAgIHJldCA9IGNhbWVyYUhlbHBlci50YWtlTG9naWNhbENhbWVyYVBpY3R1cmUoKTsKKyAgICAgICAgQVNTRVJUX0VRKHJldCwgMCk7CisgICAgfQorCisgICAgLy8gU2xlZXAgdW50aWwgYWxsIGNhcHR1cmUgZmluaXNoZWQKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtDYXB0dXJlV2FpdFJldHJ5ICogcGljdHVyZUNvdW50OyBpKyspIHsKKyAgICAgICAgdXNsZWVwKGtDYXB0dXJlV2FpdFVzKTsKKyAgICAgICAgaWYgKHRlc3RDYXNlc1swXS0+Z2V0QWNxdWlyZWRJbWFnZUNvdW50KCkgPT0gcGljdHVyZUNvdW50KSB7CisgICAgICAgICAgICBBTE9HSSgiU2Vzc2lvbiB0YWtlIH4lZCBtcyB0byBjYXB0dXJlICVkIGltYWdlcyIsIGkgKiBrQ2FwdHVyZVdhaXRVcyAvIDEwMDAsCisgICAgICAgICAgICAgICAgICBwaWN0dXJlQ291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKHRlc3RDYXNlc1swXS0+Z2V0QWNxdWlyZWRJbWFnZUNvdW50KCksIHBpY3R1cmVDb3VudCk7CisgICAgQVNTRVJUX0VRKHRlc3RDYXNlc1sxXS0+Z2V0QWNxdWlyZWRJbWFnZUNvdW50KCksIHBpY3R1cmVDb3VudCk7CisgICAgQVNTRVJUX0VRKHRlc3RDYXNlc1syXS0+Z2V0QWNxdWlyZWRJbWFnZUNvdW50KCksIHBpY3R1cmVDb3VudCk7CisgICAgQVNTRVJUX1RSVUUoY2FtZXJhSGVscGVyLmNoZWNrQ2FsbGJhY2tzKHBpY3R1cmVDb3VudCkpOworCisgICAgQUNhbWVyYU1ldGFkYXRhX2ZyZWUoc3RhdGljTWV0YWRhdGEpOworfQorCit9ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL2NhbWVyYS90ZXN0cy9BbmRyb2lkLm1rIGIvY2FtZXJhL3Rlc3RzL0FuZHJvaWQubWsKaW5kZXggNjU5NDg0Zi4uZTVjMTYzMSAxMDA2NDQKLS0tIGEvY2FtZXJhL3Rlc3RzL0FuZHJvaWQubWsKKysrIGIvY2FtZXJhL3Rlc3RzL0FuZHJvaWQubWsKQEAgLTE5LDcgKzE5LDggQEAKIExPQ0FMX1NSQ19GSUxFUzo9IFwKIAlWZW5kb3JUYWdEZXNjcmlwdG9yVGVzdHMuY3BwIFwKIAlDYW1lcmFCaW5kZXJUZXN0cy5jcHAgXAotCUNhbWVyYVpTTFRlc3RzLmNwcAorCUNhbWVyYVpTTFRlc3RzLmNwcCBcCisJQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzUGVybWlzc2lvbi5jcHAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAJbGlibG9nIFwKZGlmZiAtLWdpdCBhL2NhbWVyYS90ZXN0cy9DYW1lcmFCaW5kZXJUZXN0cy5jcHAgYi9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwCmluZGV4IDFkZTcwMTMuLjg1MzRiMjggMTAwNjQ0Ci0tLSBhL2NhbWVyYS90ZXN0cy9DYW1lcmFCaW5kZXJUZXN0cy5jcHAKKysrIGIvY2FtZXJhL3Rlc3RzL0NhbWVyYUJpbmRlclRlc3RzLmNwcApAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPHV0aWxzL0NvbmRpdGlvbi5oPgogI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhMy5oPgogI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KIAogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgpAQCAtNDAsNiArNDEsNyBAQAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9CbkNhbWVyYURldmljZUNhbGxiYWNrcy5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL0NhcHR1cmVSZXF1ZXN0Lmg+CiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL1Nlc3Npb25Db25maWd1cmF0aW9uLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvU3VibWl0SW5mby5oPgogCiAjaW5jbHVkZSA8Z3VpL0J1ZmZlckl0ZW1Db25zdW1lci5oPgpAQCAtNTUsNiArNTcsOCBAQAogI2luY2x1ZGUgPGFsZ29yaXRobT4KIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZURlZmF1bHQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjsKIAogI2RlZmluZSBBU1NFUlRfTk9UX05VTEwoeCkgXAogICAgIEFTU0VSVF9UUlVFKCh4KSAhPSBudWxscHRyKQpAQCAtNDc2LDcgKzQ4MCw4IEBACiAKICAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZShuZXcgU3VyZmFjZShnYlByb2R1Y2VyLCAvKmNvbnRyb2xsZWRCeUFwcCovZmFsc2UpKTsKIAotICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uIG91dHB1dChnYlByb2R1Y2VyLCAvKnJvdGF0aW9uKi8wKTsKKyAgICAgICAgU3RyaW5nMTYgbm9QaHlzaWNhbElkOworICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uIG91dHB1dChnYlByb2R1Y2VyLCAvKnJvdGF0aW9uKi8wLCBub1BoeXNpY2FsSWQpOwogCiAgICAgICAgIC8vIENhbiB3ZSBjb25maWd1cmU/CiAgICAgICAgIHJlcyA9IGRldmljZS0+YmVnaW5Db25maWd1cmUoKTsKQEAgLTQ5MCw2ICs0OTUsMTkgQEAKICAgICAgICAgRVhQRUNUX1RSVUUocmVzLmlzT2soKSkgPDwgcmVzOwogICAgICAgICBFWFBFQ1RfRkFMU0UoY2FsbGJhY2tzLT5oYWRFcnJvcigpKTsKIAorICAgICAgICAvLyBTZXNzaW9uIGNvbmZpZ3VyYXRpb24gbXVzdCBhbHNvIGJlIHN1cHBvcnRlZCBpbiB0aGlzIGNhc2UKKyAgICAgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb24gc2Vzc2lvbkNvbmZpZ3VyYXRpb24gPSB7IC8qaW5wdXRXaWR0aCovIDAsIC8qaW5wdXRIZWlnaHQqLzAsCisgICAgICAgICAgICAgICAgLyppbnB1dEZvcm1hdCovIC0xLCBDQU1FUkEzX1NUUkVBTV9DT05GSUdVUkFUSU9OX05PUk1BTF9NT0RFfTsKKyAgICAgICAgc2Vzc2lvbkNvbmZpZ3VyYXRpb24uYWRkT3V0cHV0Q29uZmlndXJhdGlvbihvdXRwdXQpOworICAgICAgICBib29sIHF1ZXJ5U3RhdHVzOworICAgICAgICByZXMgPSBkZXZpY2UtPmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoc2Vzc2lvbkNvbmZpZ3VyYXRpb24sICZxdWVyeVN0YXR1cyk7CisgICAgICAgIEVYUEVDVF9UUlVFKHJlcy5pc09rKCkgfHwKKyAgICAgICAgICAgICAgICAocmVzLnNlcnZpY2VTcGVjaWZpY0Vycm9yQ29kZSgpID09IElDYW1lcmFTZXJ2aWNlRGVmYXVsdDo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04pKQorICAgICAgICAgICAgICAgIDw8IHJlczsKKyAgICAgICAgaWYgKHJlcy5pc09rKCkpIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHF1ZXJ5U3RhdHVzKTsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIENhbiB3ZSBtYWtlIHJlcXVlc3RzPwogICAgICAgICBDYW1lcmFNZXRhZGF0YSByZXF1ZXN0VGVtcGxhdGU7CiAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlRGVmYXVsdFJlcXVlc3QoLypwcmV2aWV3IHRlbXBsYXRlKi8xLApkaWZmIC0tZ2l0IGEvY2FtZXJhL3Rlc3RzL0NhbWVyYUNoYXJhY3RlcmlzdGljc1Blcm1pc3Npb24uY3BwIGIvY2FtZXJhL3Rlc3RzL0NhbWVyYUNoYXJhY3RlcmlzdGljc1Blcm1pc3Npb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNWQyYTMKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvdGVzdHMvQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzUGVybWlzc2lvbi5jcHAKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYUNoYXJhY3RlcmlzdGljc1Blcm1pc3Npb24iCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmEuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOworCitjbGFzcyBDYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uIDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Citwcm90ZWN0ZWQ6CisKKyAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uKCkgOiBudW1DYW1lcmFzKDApe30KKyAgICAvL0d0ZXN0IGludGVyZmFjZQorICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZTsKKyAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGU7CisKKyAgICBpbnQzMl90IG51bUNhbWVyYXM7CisgICAgc3A8SUNhbWVyYVNlcnZpY2U+IG1DYW1lcmFTZXJ2aWNlOworfTsKKwordm9pZCBDYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uOjpTZXRVcCgpIHsKKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIHJjOworICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKKyAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CisgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmNhbWVyYSIpKTsKKyAgICBtQ2FtZXJhU2VydmljZSA9IGludGVyZmFjZV9jYXN0PElDYW1lcmFTZXJ2aWNlPihiaW5kZXIpOworICAgIHJjID0gbUNhbWVyYVNlcnZpY2UtPmdldE51bWJlck9mQ2FtZXJhcygKKyAgICAgICAgICAgIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6Q0FNRVJBX1RZUEVfQUxMLCAmbnVtQ2FtZXJhcyk7CisgICAgRVhQRUNUX1RSVUUocmMuaXNPaygpKTsKK30KKwordm9pZCBDYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uOjpUZWFyRG93bigpIHsKKyAgICBtQ2FtZXJhU2VydmljZS5jbGVhcigpOworfQorCisvLyBSZXZva2luZyBhbmQgYWNxdWlyaW5nIHBlcm1pc3Npb25zIGF1dG9tYXRpY2FsbHkgbWlnaHQgbm90IGJlIHBvc3NpYmxlLgorLy8gVGVzdCB0aGUgZnVuY3Rpb25hbGl0eSBmb3IgcmVtb3ZhbCBvZiBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIG5lZWRpbmcKKy8vIGEgY2FtZXJhIHBlcm1pc3Npb24uCitURVNUX0YoQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzUGVybWlzc2lvbiwgVGVzdENhbWVyYVBlcm1pc3Npb24pIHsKKyAgICBmb3IgKGludDMyX3QgY2FtZXJhSWQgPSAwOyBjYW1lcmFJZCA8IG51bUNhbWVyYXM7IGNhbWVyYUlkKyspIHsKKworICAgICAgICBTdHJpbmcxNiBjYW1lcmFJZFN0ciA9IFN0cmluZzE2KFN0cmluZzg6OmZvcm1hdCgiJWQiLCBjYW1lcmFJZCkpOworICAgICAgICBib29sIGlzU3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgIGF1dG8gcmMgPSBtQ2FtZXJhU2VydmljZS0+c3VwcG9ydHNDYW1lcmFBcGkoY2FtZXJhSWRTdHIsCisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpBUElfVkVSU0lPTl8yLCAmaXNTdXBwb3J0ZWQpOworICAgICAgICBFWFBFQ1RfVFJVRShyYy5pc09rKCkpOworICAgICAgICBpZiAoIWlzU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhOworICAgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiB0YWdzTmVlZGluZ1Blcm1pc3Npb247CisgICAgICAgIHJjID0gbUNhbWVyYVNlcnZpY2UtPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZFN0ciwgJm1ldGFkYXRhKTsKKyAgICAgICAgQVNTRVJUX1RSVUUocmMuaXNPaygpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG1ldGFkYXRhLmlzRW1wdHkoKSk7CisgICAgICAgIEVYUEVDVF9FUShtZXRhZGF0YS5yZW1vdmVQZXJtaXNzaW9uRW50cmllcyhDQU1FUkFfTUVUQURBVEFfSU5WQUxJRF9WRU5ET1JfSUQsCisgICAgICAgICAgICAgICAgICAgICZ0YWdzTmVlZGluZ1Blcm1pc3Npb24pLCBOT19FUlJPUik7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGF2YWlsYWJsZUNoYXJhY3RlcmlzdGljcyA9CisgICAgICAgICAgICAgICAgbWV0YWRhdGEuZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoMCA8IGF2YWlsYWJsZUNoYXJhY3RlcmlzdGljcy5jb3VudCk7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IGF2YWlsYWJsZUtleXM7CisgICAgICAgIGF2YWlsYWJsZUtleXMucmVzZXJ2ZShhdmFpbGFibGVDaGFyYWN0ZXJpc3RpY3MuY291bnQpOworICAgICAgICBhdmFpbGFibGVLZXlzLmluc2VydChhdmFpbGFibGVLZXlzLmJlZ2luKCksIGF2YWlsYWJsZUNoYXJhY3RlcmlzdGljcy5kYXRhLmkzMiwKKyAgICAgICAgICAgICAgICBhdmFpbGFibGVDaGFyYWN0ZXJpc3RpY3MuZGF0YS5pMzIgKyBhdmFpbGFibGVDaGFyYWN0ZXJpc3RpY3MuY291bnQpOworCisgICAgICAgIGZvciAoY29uc3QgYXV0byAma2V5IDogdGFnc05lZWRpbmdQZXJtaXNzaW9uKSB7CisgICAgICAgICAgICBBU1NFUlRfRkFMU0UobWV0YWRhdGEuZXhpc3RzKGtleSkpOworICAgICAgICAgICAgYXV0byBpdCA9IHN0ZDo6ZmluZChhdmFpbGFibGVLZXlzLmJlZ2luKCksIGF2YWlsYWJsZUtleXMuZW5kKCksIGtleSk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShpdCA9PSBhdmFpbGFibGVLZXlzLmVuZCgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAgYi9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwCmluZGV4IGI3Mzk1MWYuLjc4MDNjY2MgMTAwNjQ0Ci0tLSBhL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAKKysrIGIvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmNwcApAQCAtMTAyLDcgKzEwMiw3IEBACiBzdGF0aWMgYm9vbCBnTW9ub3RvbmljVGltZSA9IGZhbHNlOyAgICAgLy8gdXNlIHN5c3RlbSBtb25vdG9uaWMgdGltZSBmb3IgdGltZXN0YW1wcwogc3RhdGljIGJvb2wgZ1BlcnNpc3RlbnRTdXJmYWNlID0gZmFsc2U7IC8vIHVzZSBwZXJzaXN0ZW50IHN1cmZhY2UKIHN0YXRpYyBlbnVtIHsKLSAgICBGT1JNQVRfTVA0LCBGT1JNQVRfSDI2NCwgRk9STUFUX0ZSQU1FUywgRk9STUFUX1JBV19GUkFNRVMKKyAgICBGT1JNQVRfTVA0LCBGT1JNQVRfSDI2NCwgRk9STUFUX1dFQk0sIEZPUk1BVF8zR1BQLCBGT1JNQVRfRlJBTUVTLCBGT1JNQVRfUkFXX0ZSQU1FUwogfSBnT3V0cHV0Rm9ybWF0ID0gRk9STUFUX01QNDsgICAgICAgICAgIC8vIGRhdGEgZm9ybWF0IGZvciBvdXRwdXQKIHN0YXRpYyBBU3RyaW5nIGdDb2RlY05hbWUgPSAiIjsgICAgICAgICAvLyBjb2RlYyBuYW1lIG92ZXJyaWRlCiBzdGF0aWMgYm9vbCBnU2l6ZVNwZWNpZmllZCA9IGZhbHNlOyAgICAgLy8gd2FzIHNpemUgZXhwbGljaXRseSByZXF1ZXN0ZWQ/CkBAIC0xOTEsNyArMTkxLDcgQEAKICAgICBmb3JtYXQtPnNldEZsb2F0KCJmcmFtZS1yYXRlIiwgZGlzcGxheUZwcyk7CiAgICAgZm9ybWF0LT5zZXRJbnQzMigiaS1mcmFtZS1pbnRlcnZhbCIsIDEwKTsKIAotICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIHNwPGFuZHJvaWQ6OkFMb29wZXI+IGxvb3BlciA9IG5ldyBhbmRyb2lkOjpBTG9vcGVyOwogICAgIGxvb3Blci0+c2V0TmFtZSgic2NyZWVucmVjb3JkX2xvb3BlciIpOwogICAgIGxvb3Blci0+c3RhcnQoKTsKICAgICBBTE9HVigiQ3JlYXRpbmcgY29kZWMiKTsKQEAgLTI2NCwxMCArMjY0LDEwIEBACiAKICAgICAvLyBTZXQgdGhlIHJlZ2lvbiBvZiB0aGUgbGF5ZXIgc3RhY2sgd2UncmUgaW50ZXJlc3RlZCBpbiwgd2hpY2ggaW4gb3VyCiAgICAgLy8gY2FzZSBpcyAiYWxsIG9mIGl0Ii4KLSAgICBSZWN0IGxheWVyU3RhY2tSZWN0KG1haW5EcHlJbmZvLncsIG1haW5EcHlJbmZvLmgpOworICAgIFJlY3QgbGF5ZXJTdGFja1JlY3QobWFpbkRweUluZm8udmlld3BvcnRXLCBtYWluRHB5SW5mby52aWV3cG9ydEgpOwogCiAgICAgLy8gV2UgbmVlZCB0byBwcmVzZXJ2ZSB0aGUgYXNwZWN0IHJhdGlvIG9mIHRoZSBkaXNwbGF5LgotICAgIGZsb2F0IGRpc3BsYXlBc3BlY3QgPSAoZmxvYXQpIG1haW5EcHlJbmZvLmggLyAoZmxvYXQpIG1haW5EcHlJbmZvLnc7CisgICAgZmxvYXQgZGlzcGxheUFzcGVjdCA9IChmbG9hdCkgbWFpbkRweUluZm8udmlld3BvcnRIIC8gKGZsb2F0KSBtYWluRHB5SW5mby52aWV3cG9ydFc7CiAKIAogICAgIC8vIFNldCB0aGUgd2F5IHdlIG1hcCB0aGUgb3V0cHV0IG9udG8gdGhlIGRpc3BsYXkgc3VyZmFjZSAod2hpY2ggd2lsbApAQCAtMzQ0LDIyICszNDQsNiBAQAogfQogCiAvKgotICogU2V0IHRoZSBtYWluIGRpc3BsYXkgd2lkdGggYW5kIGhlaWdodCB0byB0aGUgYWN0dWFsIHdpZHRoIGFuZCBoZWlnaHQKLSAqLwotc3RhdGljIHN0YXR1c190IGdldEFjdHVhbERpc3BsYXlTaXplKGNvbnN0IHNwPElCaW5kZXI+JiBtYWluRHB5LCBEaXNwbGF5SW5mbyogbWFpbkRweUluZm8pIHsKLSAgICBSZWN0IHZpZXdwb3J0OwotICAgIHN0YXR1c190IGVyciA9IFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0RGlzcGxheVZpZXdwb3J0KG1haW5EcHksICZ2aWV3cG9ydCk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiB1bmFibGUgdG8gZ2V0IGRpc3BsYXkgdmlld3BvcnRcbiIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBtYWluRHB5SW5mby0+dyA9IHZpZXdwb3J0LndpZHRoKCk7Ci0gICAgbWFpbkRweUluZm8tPmggPSB2aWV3cG9ydC5oZWlnaHQoKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLyoKICAqIFJ1bnMgdGhlIE1lZGlhQ29kZWMgZW5jb2Rlciwgc2VuZGluZyB0aGUgb3V0cHV0IHRvIHRoZSBNZWRpYU11eGVyLiAgVGhlCiAgKiBpbnB1dCBmcmFtZXMgYXJlIGNvbWluZyBmcm9tIHRoZSB2aXJ0dWFsIGRpc3BsYXkgYXMgZmFzdCBhcyBTdXJmYWNlRmxpbmdlcgogICogd2FudHMgdG8gc2VuZCB0aGVtLgpAQCAtNDI5LDIyICs0MTMsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gdXNlZnVsIHN0dWZmIGlzIGhhcmQgdG8gZ2V0IGF0IHdpdGhvdXQgYSBEYWx2aWsgVk0uCiAgICAgICAgICAgICAgICAgICAgIGVyciA9IFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0RGlzcGxheUluZm8obWFpbkRweSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFpbkRweUluZm8pOwotICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBnZXRBY3R1YWxEaXNwbGF5U2l6ZShtYWluRHB5LCAmbWFpbkRweUluZm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IHVuYWJsZSB0byBzZXQgYWN0dWFsIGRpc3BsYXkgc2l6ZVxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uICE9IG1haW5EcHlJbmZvLm9yaWVudGF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIm9yaWVudGF0aW9uIGNoYW5nZWQsIG5vdyAlZCIsIG1haW5EcHlJbmZvLm9yaWVudGF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OlRyYW5zYWN0aW9uIHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGlzcGxheVByb2plY3Rpb24odCwgdmlydHVhbERweSwgbWFpbkRweUluZm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuYXBwbHkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9IG1haW5EcHlJbmZvLm9yaWVudGF0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiZ2V0RGlzcGxheUluZm8obWFpbikgZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3JpZW50YXRpb24gIT0gbWFpbkRweUluZm8ub3JpZW50YXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJvcmllbnRhdGlvbiBjaGFuZ2VkLCBub3cgJWQiLCBtYWluRHB5SW5mby5vcmllbnRhdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OlRyYW5zYWN0aW9uIHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXREaXNwbGF5UHJvamVjdGlvbih0LCB2aXJ0dWFsRHB5LCBtYWluRHB5SW5mbyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0LmFwcGx5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9IG1haW5EcHlJbmZvLm9yaWVudGF0aW9uOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCkBAIC02MTgsMjUgKzU5NCwxOSBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIGVyciA9IGdldEFjdHVhbERpc3BsYXlTaXplKG1haW5EcHksICZtYWluRHB5SW5mbyk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiB1bmFibGUgdG8gc2V0IGFjdHVhbCBkaXNwbGF5IHNpemVcbiIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQogICAgIGlmIChnVmVyYm9zZSkgewogICAgICAgICBwcmludGYoIk1haW4gZGlzcGxheSBpcyAlZHglZCBAJS4yZmZwcyAob3JpZW50YXRpb249JXUpXG4iLAotICAgICAgICAgICAgICAgIG1haW5EcHlJbmZvLncsIG1haW5EcHlJbmZvLmgsIG1haW5EcHlJbmZvLmZwcywKKyAgICAgICAgICAgICAgICBtYWluRHB5SW5mby52aWV3cG9ydFcsIG1haW5EcHlJbmZvLnZpZXdwb3J0SCwgbWFpbkRweUluZm8uZnBzLAogICAgICAgICAgICAgICAgIG1haW5EcHlJbmZvLm9yaWVudGF0aW9uKTsKICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CiAgICAgfQogCiAgICAgLy8gRW5jb2RlciBjYW4ndCB0YWtlIG9kZCBudW1iZXIgYXMgY29uZmlnCiAgICAgaWYgKGdWaWRlb1dpZHRoID09IDApIHsKLSAgICAgICAgZ1ZpZGVvV2lkdGggPSBmbG9vclRvRXZlbihtYWluRHB5SW5mby53KTsKKyAgICAgICAgZ1ZpZGVvV2lkdGggPSBmbG9vclRvRXZlbihtYWluRHB5SW5mby52aWV3cG9ydFcpOwogICAgIH0KICAgICBpZiAoZ1ZpZGVvSGVpZ2h0ID09IDApIHsKLSAgICAgICAgZ1ZpZGVvSGVpZ2h0ID0gZmxvb3JUb0V2ZW4obWFpbkRweUluZm8uaCk7CisgICAgICAgIGdWaWRlb0hlaWdodCA9IGZsb29yVG9FdmVuKG1haW5EcHlJbmZvLnZpZXdwb3J0SCk7CiAgICAgfQogCiAgICAgLy8gQ29uZmlndXJlIGFuZCBzdGFydCB0aGUgZW5jb2Rlci4KQEAgLTcxNCw3ICs2ODQsOSBAQAogICAgIHNwPE1lZGlhTXV4ZXI+IG11eGVyID0gTlVMTDsKICAgICBGSUxFKiByYXdGcCA9IE5VTEw7CiAgICAgc3dpdGNoIChnT3V0cHV0Rm9ybWF0KSB7Ci0gICAgICAgIGNhc2UgRk9STUFUX01QNDogeworICAgICAgICBjYXNlIEZPUk1BVF9NUDQ6CisgICAgICAgIGNhc2UgRk9STUFUX1dFQk06CisgICAgICAgIGNhc2UgRk9STUFUXzNHUFA6IHsKICAgICAgICAgICAgIC8vIENvbmZpZ3VyZSBtdXhlci4gIFdlIGhhdmUgdG8gd2FpdCBmb3IgdGhlIENTRCBibG9iIGZyb20gdGhlIGVuY29kZXIKICAgICAgICAgICAgIC8vIGJlZm9yZSB3ZSBjYW4gc3RhcnQgaXQuCiAgICAgICAgICAgICBlcnIgPSB1bmxpbmsoZmlsZU5hbWUpOwpAQCAtNzI3LDcgKzY5OSwxMyBAQAogICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IGNvdWxkbid0IG9wZW4gZmlsZVxuIik7CiAgICAgICAgICAgICAgICAgYWJvcnQoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG11eGVyID0gbmV3IE1lZGlhTXV4ZXIoZmQsIE1lZGlhTXV4ZXI6Ok9VVFBVVF9GT1JNQVRfTVBFR180KTsKKyAgICAgICAgICAgIGlmIChnT3V0cHV0Rm9ybWF0ID09IEZPUk1BVF9NUDQpIHsKKyAgICAgICAgICAgICAgICBtdXhlciA9IG5ldyBNZWRpYU11eGVyKGZkLCBNZWRpYU11eGVyOjpPVVRQVVRfRk9STUFUX01QRUdfNCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGdPdXRwdXRGb3JtYXQgPT0gRk9STUFUX1dFQk0pIHsKKyAgICAgICAgICAgICAgICBtdXhlciA9IG5ldyBNZWRpYU11eGVyKGZkLCBNZWRpYU11eGVyOjpPVVRQVVRfRk9STUFUX1dFQk0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtdXhlciA9IG5ldyBNZWRpYU11eGVyKGZkLCBNZWRpYU11eGVyOjpPVVRQVVRfRk9STUFUX1RIUkVFX0dQUCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjbG9zZShmZCk7CiAgICAgICAgICAgICBpZiAoZ1JvdGF0ZSkgewogICAgICAgICAgICAgICAgIG11eGVyLT5zZXRPcmllbnRhdGlvbkhpbnQoOTApOyAgLy8gVE9ETzogZG9lcyB0aGlzIGRvIGFueXRoaW5nPwpAQCAtMTA0Nyw2ICsxMDI1LDEwIEBACiAgICAgICAgICAgICAgICAgZ091dHB1dEZvcm1hdCA9IEZPUk1BVF9NUDQ7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChvcHRhcmcsICJoMjY0IikgPT0gMCkgewogICAgICAgICAgICAgICAgIGdPdXRwdXRGb3JtYXQgPSBGT1JNQVRfSDI2NDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG9wdGFyZywgIndlYm0iKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZ091dHB1dEZvcm1hdCA9IEZPUk1BVF9XRUJNOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAob3B0YXJnLCAiM2dwcCIpID09IDApIHsKKyAgICAgICAgICAgICAgICBnT3V0cHV0Rm9ybWF0ID0gRk9STUFUXzNHUFA7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChvcHRhcmcsICJmcmFtZXMiKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgZ091dHB1dEZvcm1hdCA9IEZPUk1BVF9GUkFNRVM7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChvcHRhcmcsICJyYXctZnJhbWVzIikgPT0gMCkgewpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9jb2RlYy5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L2NvZGVjLmNwcAppbmRleCA5ODBkMWQyLi5hNDYzZWM1IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L2NvZGVjLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L2NvZGVjLmNwcApAQCAtMTM4LDcgKzEzOCw3IEBACiAKICAgICBDSEVDSyghc3RhdGVCeVRyYWNrLmlzRW1wdHkoKSk7CiAKLSAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gYW5kcm9pZDo6QUxvb3Blcjo6R2V0Tm93VXMoKTsKICAgICBpbnQ2NF90IHN0YXJ0VGltZVJlbmRlciA9IC0xOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0ZUJ5VHJhY2suc2l6ZSgpOyArK2kpIHsKQEAgLTMwNyw3ICszMDcsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaW50NjRfdCBlbGFwc2VkVGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZVVzOworICAgIGludDY0X3QgZWxhcHNlZFRpbWVVcyA9IGFuZHJvaWQ6OkFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWVVczsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RhdGVCeVRyYWNrLnNpemUoKTsgKytpKSB7CiAgICAgICAgIENvZGVjU3RhdGUgKnN0YXRlID0gJnN0YXRlQnlUcmFjay5lZGl0VmFsdWVBdChpKTsKQEAgLTQwMCw3ICs0MDAsNyBAQAogCiAgICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwogCi0gICAgc3A8QUxvb3Blcj4gbG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgc3A8YW5kcm9pZDo6QUxvb3Blcj4gbG9vcGVyID0gbmV3IGFuZHJvaWQ6OkFMb29wZXI7CiAgICAgbG9vcGVyLT5zdGFydCgpOwogCiAgICAgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiBjb21wb3NlckNsaWVudDsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvbWVkaWFmaWx0ZXIuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9tZWRpYWZpbHRlci5jcHAKaW5kZXggNjMwZGUyNS4uZjBlZTBlMSAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9tZWRpYWZpbHRlci5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9tZWRpYWZpbHRlci5jcHAKQEAgLTMxMCw3ICszMTAsNyBAQAogfQogCiBzdGF0aWMgaW50IGRlY29kZSgKLSAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwKKyAgICAgICAgY29uc3Qgc3A8YW5kcm9pZDo6QUxvb3Blcj4gJmxvb3BlciwKICAgICAgICAgY29uc3QgY2hhciAqcGF0aCwKICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UsCiAgICAgICAgIGJvb2wgcmVuZGVyU3VyZmFjZSwKQEAgLTQ2NSw3ICs0NjUsNyBAQAogICAgIGZpbHRlclN0YXRlLT5tU2lnbmFsbGVkSW5wdXRFT1MgPSBmYWxzZTsKICAgICBmaWx0ZXJTdGF0ZS0+bVNhd091dHB1dEVPUyA9IGZhbHNlOwogCi0gICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IGFuZHJvaWQ6OkFMb29wZXI6OkdldE5vd1VzKCk7CiAgICAgaW50NjRfdCBzdGFydFRpbWVSZW5kZXIgPSAtMTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RhdGVCeVRyYWNrLnNpemUoKTsgKytpKSB7CkBAIC02NDMsNyArNjQzLDcgQEAKICAgICAgICAgICAgICAgICB1c2VUaW1lc3RhbXAsICZzdGFydFRpbWVSZW5kZXIpOwogICAgIH0KIAotICAgIGludDY0X3QgZWxhcHNlZFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWVVczsKKyAgICBpbnQ2NF90IGVsYXBzZWRUaW1lVXMgPSBhbmRyb2lkOjpBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRUaW1lVXM7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0YXRlQnlUcmFjay5zaXplKCk7ICsraSkgewogICAgICAgICBDb2RlY1N0YXRlICpzdGF0ZSA9ICZzdGF0ZUJ5VHJhY2suZWRpdFZhbHVlQXQoaSk7CkBAIC03MzcsNyArNzM3LDcgQEAKIAogICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKIAotICAgIGFuZHJvaWQ6OnNwPEFMb29wZXI+IGxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OkFMb29wZXI+IGxvb3BlciA9IG5ldyBhbmRyb2lkOjpBTG9vcGVyOwogICAgIGxvb3Blci0+c3RhcnQoKTsKIAogICAgIGFuZHJvaWQ6OnNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4gY29tcG9zZXJDbGllbnQ7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAKaW5kZXggNDRiMDAxNS4uOTVhMTZmMyAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9yZWNvcmQuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkLmNwcApAQCAtMTcsNyArMTcsNiBAQAogI2luY2x1ZGUgIlNpbmVTb3VyY2UuaCIKIAogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgpAQCAtMjgsNiArMjcsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TaW1wbGVEZWNvZGluZ1NvdXJjZS5oPgpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAppbmRleCAwMzExNjc3Li4zNGE5YTQwIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcApAQCAtMzIsNyArMzIsNiBAQAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KQEAgLTUwLDYgKzQ5LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1NpbXBsZURlY29kaW5nU291cmNlLmg+CkBAIC03OCw2ICs3OCw3IEBACiBzdGF0aWMgYm9vbCBnUGxheWJhY2tBdWRpbzsKIHN0YXRpYyBib29sIGdXcml0ZU1QNDsKIHN0YXRpYyBib29sIGdEaXNwbGF5SGlzdG9ncmFtOworc3RhdGljIGJvb2wgZ1ZlcmJvc2UgPSBmYWxzZTsKIHN0YXRpYyBib29sIHNob3dQcm9ncmVzcyA9IHRydWU7CiBzdGF0aWMgU3RyaW5nOCBnV3JpdGVNUDRGaWxlbmFtZTsKIHN0YXRpYyBTdHJpbmc4IGdDb21wb25lbnROYW1lT3ZlcnJpZGU7CkBAIC0xNTksNiArMTYwLDExIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGlmIChnVmVyYm9zZSkgeworICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhID0gbWJ1Zi0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgInNhbXBsZSBmb3JtYXQ6ICVzXG4iLCBtZXRhLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIH0KKwogICAgICAgICBDSEVDS19FUSgKICAgICAgICAgICAgICAgICBmd3JpdGUoKGNvbnN0IHVpbnQ4X3QgKiltYnVmLT5kYXRhKCkgKyBtYnVmLT5yYW5nZV9vZmZzZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgMSwKQEAgLTIxOCwxMSArMjI0LDE1IEBACiAgICAgICAgIHBsYXllci0+c2V0U291cmNlKHJhd1NvdXJjZSk7CiAgICAgICAgIHJhd1NvdXJjZS5jbGVhcigpOwogCi0gICAgICAgIHBsYXllci0+c3RhcnQodHJ1ZSAvKiBzb3VyY2VBbHJlYWR5U3RhcnRlZCAqLyk7CisgICAgICAgIGVyciA9IHBsYXllci0+c3RhcnQodHJ1ZSAvKiBzb3VyY2VBbHJlYWR5U3RhcnRlZCAqLyk7CiAKLSAgICAgICAgc3RhdHVzX3QgZmluYWxTdGF0dXM7Ci0gICAgICAgIHdoaWxlICghcGxheWVyLT5yZWFjaGVkRU9TKCZmaW5hbFN0YXR1cykpIHsKLSAgICAgICAgICAgIHVzbGVlcCgxMDAwMDBsbCk7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIHN0YXR1c190IGZpbmFsU3RhdHVzOworICAgICAgICAgICAgd2hpbGUgKCFwbGF5ZXItPnJlYWNoZWRFT1MoJmZpbmFsU3RhdHVzKSkgeworICAgICAgICAgICAgICAgIHVzbGVlcCgxMDAwMDBsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVuYWJsZSB0byBzdGFydCBwbGF5YmFjayBlcnI9JWQgKDB4JTA4eClcbiIsIGVyciwgZXJyKTsKICAgICAgICAgfQogCiAgICAgICAgIGRlbGV0ZSBwbGF5ZXI7CkBAIC0zNDgsNyArMzU4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIGRlY29kZVRpbWVzVXMucHVzaChkZWxheURlY29kZVVzKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoc2hvd1Byb2dyZXNzICYmIChuKysgJSAxNikgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChnVmVyYm9zZSkgeworICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIiVsZCBzYW1wbGUgZm9ybWF0OiAlc1xuIiwgbnVtRnJhbWVzLCBtZXRhLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzaG93UHJvZ3Jlc3MgJiYgKG4rKyAlIDE2KSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLiIpOwogICAgICAgICAgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKICAgICAgICAgICAgICAgICB9CkBAIC01NzksMTIgKzU5MiwxMiBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBDSEVDSyhidWZmZXIgIT0gTlVMTCk7CisKICAgICAgICAgICAgIGlmIChidWZmZXItPnJhbmdlX2xlbmd0aCgpID4gMCkgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBDSEVDSyhidWZmZXIgIT0gTlVMTCk7Ci0KICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKICAgICAgICAgfQpAQCAtNjMwLDYgKzY0Myw3IEBACiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLVQgYWxsb2NhdGUgYnVmZmVycyBmcm9tIGEgc3VyZmFjZSB0ZXh0dXJlXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtZCh1bXApIG91dHB1dF9maWxlbmFtZSAocmF3IHN0cmVhbSBkYXRhIHRvIGEgZmlsZSlcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1EKHVtcCkgb3V0cHV0X2ZpbGVuYW1lIChkZWNvZGVkIFBDTSBkYXRhIHRvIGEgZmlsZSlcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC12IGJlIG1vcmUgdmVyYm9zZVxuIik7CiB9CiAKIHN0YXRpYyB2b2lkIGR1bXBDb2RlY1Byb2ZpbGVzKGJvb2wgcXVlcnlEZWNvZGVycykgewpAQCAtNjQwLDcgKzY1NCw5IEBACiAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcsIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVywKICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXLCBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMsCiAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCwgTUVESUFfTUlNRVRZUEVfVklERU9fVlA5LAotICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04sIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMKKyAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fRE9MQllfVklTSU9OLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDLAorICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQzQsCisgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMQogICAgIH07CiAKICAgICBjb25zdCBjaGFyICpjb2RlY1R5cGUgPSBxdWVyeURlY29kZXJzPyAiZGVjb2RlciIgOiAiZW5jb2RlciI7CkBAIC03MDUsMTAgKzcyMSwxMCBAQAogICAgIGdXcml0ZU1QNCA9IGZhbHNlOwogICAgIGdEaXNwbGF5SGlzdG9ncmFtID0gZmFsc2U7CiAKLSAgICBzcDxBTG9vcGVyPiBsb29wZXI7CisgICAgc3A8YW5kcm9pZDo6QUxvb3Blcj4gbG9vcGVyOwogCiAgICAgaW50IHJlczsKLSAgICB3aGlsZSAoKHJlcyA9IGdldG9wdChhcmdjLCBhcmd2LCAiaGFxbjpsbTpiOnB0c3JvdzprTjp4U1RkOkQ6IikpID49IDApIHsKKyAgICB3aGlsZSAoKHJlcyA9IGdldG9wdChhcmdjLCBhcmd2LCAidmhhcW46bG06YjpwdHNyb3c6a046eFNUZDpEOiIpKSA+PSAwKSB7CiAgICAgICAgIHN3aXRjaCAocmVzKSB7CiAgICAgICAgICAgICBjYXNlICdhJzoKICAgICAgICAgICAgIHsKQEAgLTgzMiw2ICs4NDgsMTIgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgY2FzZSAndic6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ1ZlcmJvc2UgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBjYXNlICc/JzoKICAgICAgICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICAgZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvc3RyZWFtLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvc3RyZWFtLmNwcAppbmRleCBiMDE5OWQ4Li5iMmYzOWRjIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3N0cmVhbS5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9zdHJlYW0uY3BwCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSVN0cmVhbVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC0zMiw2ICszMSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01QRUcyVFNXcml0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAKZGlmZiAtLWdpdCBhL2RybS9jb21tb24vRHJtRW5naW5lQmFzZS5jcHAgYi9kcm0vY29tbW9uL0RybUVuZ2luZUJhc2UuY3BwCmluZGV4IGY3MzQ5MDUuLmFlYzU5NTkgMTAwNjQ0Ci0tLSBhL2RybS9jb21tb24vRHJtRW5naW5lQmFzZS5jcHAKKysrIGIvZHJtL2NvbW1vbi9Ecm1FbmdpbmVCYXNlLmNwcApAQCAtNzksMTIgKzc5LDEyIEBACiB9CiAKIHN0YXR1c190IERybUVuZ2luZUJhc2U6OmNvbnN1bWVSaWdodHMoCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKICAgICByZXR1cm4gb25Db25zdW1lUmlnaHRzKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBhY3Rpb24sIHJlc2VydmUpOwogfQogCiBzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpzZXRQbGF5YmFja1N0YXR1cygKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgeworICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgewogICAgIHJldHVybiBvblNldFBsYXliYWNrU3RhdHVzKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBwbGF5YmFja1N0YXR1cywgcG9zaXRpb24pOwogfQogCkBAIC0xMjAsNyArMTIwLDcgQEAKIH0KIAogc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAotICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoLCBjb25zdCBjaGFyKiBtaW1lKSB7CiAKICAgICBpZiAoIW1pbWUgfHwgbWltZVswXSA9PSAnXDAnKSB7CkBAIC0xMzEsNyArMTMxLDcgQEAKIH0KIAogc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAotICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSkgewogICAgIGlmICghbWltZSB8fCBtaW1lWzBdID09ICdcMCcpIHsKICAgICAgICAgcmV0dXJuIG9uT3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCB1cmkpOwpAQCAtMTM5LDMzICsxMzksMzMgQEAKICAgICByZXR1cm4gb25PcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIHVyaSwgbWltZSk7CiB9CiAKLXN0YXR1c190IERybUVuZ2luZUJhc2U6Om9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCitzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgY29uc3QgRHJtQnVmZmVyJiBidWYsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CiAgICAgcmV0dXJuIG9uT3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBidWYsIG1pbWVUeXBlKTsKIH0KIAotc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6Y2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpIHsKK3N0YXR1c190IERybUVuZ2luZUJhc2U6OmNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSkgewogICAgIHJldHVybiBvbkNsb3NlRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUpOwogfQogCiBzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjppbml0aWFsaXplRGVjcnlwdFVuaXQoCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSB7CisgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgewogICAgIHJldHVybiBvbkluaXRpYWxpemVEZWNyeXB0VW5pdCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCwgaGVhZGVySW5mbyk7CiB9CiAKIHN0YXR1c190IERybUVuZ2luZUJhc2U6OmRlY3J5cHQoCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKSB7CiAgICAgcmV0dXJuIG9uRGVjcnlwdCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCwgZW5jQnVmZmVyLCBkZWNCdWZmZXIsIElWKTsKIH0KIAogc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6ZmluYWxpemVEZWNyeXB0VW5pdCgKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CisgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKICAgICByZXR1cm4gb25GaW5hbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkKTsKIH0KIAogc3NpemVfdCBEcm1FbmdpbmVCYXNlOjpwcmVhZCgKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpIHsKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KSB7CiAgICAgcmV0dXJuIG9uUHJlYWQodW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGJ1ZmZlciwgbnVtQnl0ZXMsIG9mZnNldCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RybS9jb21tb24vSURybU1hbmFnZXJTZXJ2aWNlLmNwcCBiL2RybS9jb21tb24vSURybU1hbmFnZXJTZXJ2aWNlLmNwcAppbmRleCA0NGY5OGRkLi5hNmQzM2IwIDEwMDY0NAotLS0gYS9kcm0vY29tbW9uL0lEcm1NYW5hZ2VyU2VydmljZS5jcHAKKysrIGIvZHJtL2NvbW1vbi9JRHJtTWFuYWdlclNlcnZpY2UuY3BwCkBAIC0zOSw3ICszOSw3IEBACiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAogc3RhdGljIHZvaWQgd3JpdGVEZWNyeXB0SGFuZGxlVG9QYXJjZWxEYXRhKAotICAgICAgICBjb25zdCBEZWNyeXB0SGFuZGxlKiBoYW5kbGUsIFBhcmNlbCogZGF0YSkgeworICAgICAgICBjb25zdCBzcDxEZWNyeXB0SGFuZGxlPiYgaGFuZGxlLCBQYXJjZWwqIGRhdGEpIHsKICAgICBkYXRhLT53cml0ZUludDMyKGhhbmRsZS0+ZGVjcnlwdElkKTsKICAgICBkYXRhLT53cml0ZVN0cmluZzgoaGFuZGxlLT5taW1lVHlwZSk7CiAgICAgZGF0YS0+d3JpdGVJbnQzMihoYW5kbGUtPmRlY3J5cHRBcGlUeXBlKTsKQEAgLTY3LDcgKzY3LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YSgKLSAgICAgICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlLCBjb25zdCBQYXJjZWwmIGRhdGEpIHsKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGhhbmRsZSwgY29uc3QgUGFyY2VsJiBkYXRhKSB7CiAgICAgaWYgKDAgPT0gZGF0YS5kYXRhQXZhaWwoKSkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtOTksNyArOTksNyBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgY2xlYXJEZWNyeXB0SGFuZGxlKERlY3J5cHRIYW5kbGUqIGhhbmRsZSkgeworc3RhdGljIHZvaWQgY2xlYXJEZWNyeXB0SGFuZGxlKHNwPERlY3J5cHRIYW5kbGU+ICZoYW5kbGUpIHsKICAgICBpZiAoaGFuZGxlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTQxNCw3ICs0MTQsNyBAQAogfQogCiBzdGF0dXNfdCBCcERybU1hbmFnZXJTZXJ2aWNlOjpjb25zdW1lUmlnaHRzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgewogICAgIEFMT0dWKCJjb25zdW1lUmlnaHRzIik7CiAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogCkBAIC00MzEsNyArNDMxLDcgQEAKIH0KIAogc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6c2V0UGxheWJhY2tTdGF0dXMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgeworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSB7CiAgICAgQUxPR1YoInNldFBsYXliYWNrU3RhdHVzIik7CiAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogCkBAIC02MDMsNyArNjAzLDcgQEAKICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiB9CiAKLURlY3J5cHRIYW5kbGUqIEJwRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKK3NwPERlY3J5cHRIYW5kbGU+IEJwRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgsIGNvbnN0IGNoYXIqIG1pbWUpIHsKICAgICBBTE9HVigiRW50ZXJpbmcgQnBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uIik7CiAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtNjIxLDcgKzYyMSw3IEBACiAKICAgICByZW1vdGUoKS0+dHJhbnNhY3QoT1BFTl9ERUNSWVBUX1NFU1NJT04sIGRhdGEsICZyZXBseSk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBOVUxMOworICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZTsKICAgICBpZiAoMCAhPSByZXBseS5kYXRhQXZhaWwoKSkgewogICAgICAgICBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOwogICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKGhhbmRsZSwgcmVwbHkpOwpAQCAtNjI5LDcgKzYyOSw3IEBACiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIAotRGVjcnlwdEhhbmRsZSogQnBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAorc3A8RGVjcnlwdEhhbmRsZT4gQnBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSkgewogCiAgICAgQUxPR1YoIkVudGVyaW5nIEJwRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbjogbWltZT0lcyIsIG1pbWU/IG1pbWU6ICJOVUxMIik7CkBAIC02NDYsNyArNjQ2LDcgQEAKIAogICAgIHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX0RFQ1JZUFRfU0VTU0lPTl9GUk9NX1VSSSwgZGF0YSwgJnJlcGx5KTsKIAotICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IE5VTEw7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlOwogICAgIGlmICgwICE9IHJlcGx5LmRhdGFBdmFpbCgpKSB7CiAgICAgICAgIGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CiAgICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoaGFuZGxlLCByZXBseSk7CkBAIC02NTYsNyArNjU2LDcgQEAKICAgICByZXR1cm4gaGFuZGxlOwogfQogCi1EZWNyeXB0SGFuZGxlKiBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCitzcDxEZWNyeXB0SGFuZGxlPiBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IERybUJ1ZmZlciYgYnVmLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgewogICAgIEFMT0dWKCJFbnRlcmluZyBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24iKTsKICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC02NzMsNyArNjczLDcgQEAKIAogICAgIHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX0RFQ1JZUFRfU0VTU0lPTl9GT1JfU1RSRUFNSU5HLCBkYXRhLCAmcmVwbHkpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gTlVMTDsKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGU7CiAgICAgaWYgKDAgIT0gcmVwbHkuZGF0YUF2YWlsKCkpIHsKICAgICAgICAgaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKICAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YShoYW5kbGUsIHJlcGx5KTsKQEAgLTY4Myw3ICs2ODMsNyBAQAogICAgIHJldHVybiBoYW5kbGU7CiB9CiAKLXN0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OmNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSB7CitzdGF0dXNfdCBCcERybU1hbmFnZXJTZXJ2aWNlOjpjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpIHsKICAgICBBTE9HVigiY2xvc2VEZWNyeXB0U2Vzc2lvbiIpOwogICAgIFBhcmNlbCBkYXRhLCByZXBseTsKIApAQCAtNjk4LDcgKzY5OCw3IEBACiB9CiAKIHN0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OmluaXRpYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSB7CiAgICAgQUxPR1YoImluaXRpYWxpemVEZWNyeXB0VW5pdCIpOwogICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTcxOCw3ICs3MTgsNyBAQAogfQogCiBzdGF0dXNfdCBCcERybU1hbmFnZXJTZXJ2aWNlOjpkZWNyeXB0KAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgewogICAgIEFMT0dWKCJkZWNyeXB0Iik7CiAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtNzU0LDcgKzc1NCw3IEBACiB9CiAKIHN0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OmZpbmFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgewogICAgIEFMT0dWKCJmaW5hbGl6ZURlY3J5cHRVbml0Iik7CiAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogCkBAIC03NzAsNyArNzcwLDcgQEAKIH0KIAogc3NpemVfdCBCcERybU1hbmFnZXJTZXJ2aWNlOjpwcmVhZCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgdm9pZCogYnVmZmVyLAogICAgICAgICAgICAgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpIHsKICAgICBBTE9HVigicmVhZCIpOwogICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTExMjgsMTYgKzExMjgsMTYgQEAKIAogICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOwogCi0gICAgICAgIERlY3J5cHRIYW5kbGUgaGFuZGxlOwotICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKCZoYW5kbGUsIGRhdGEpOworICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOworICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKGhhbmRsZSwgZGF0YSk7CiAKICAgICAgICAgY29uc3QgaW50IGFjdGlvbiA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgIGNvbnN0IGJvb2wgcmVzZXJ2ZSA9IHN0YXRpY19jYXN0PGJvb2w+KGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMKLSAgICAgICAgICAgID0gY29uc3VtZVJpZ2h0cyh1bmlxdWVJZCwgJmhhbmRsZSwgYWN0aW9uLCByZXNlcnZlKTsKKyAgICAgICAgICAgID0gY29uc3VtZVJpZ2h0cyh1bmlxdWVJZCwgaGFuZGxlLCBhY3Rpb24sIHJlc2VydmUpOwogICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogCi0gICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZSgmaGFuZGxlKTsKKyAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKGhhbmRsZSk7CiAgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiAgICAgfQogCkBAIC0xMTQ4LDE2ICsxMTQ4LDE2IEBACiAKICAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKIAotICAgICAgICBEZWNyeXB0SGFuZGxlIGhhbmRsZTsKLSAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YSgmaGFuZGxlLCBkYXRhKTsKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKKyAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YShoYW5kbGUsIGRhdGEpOwogCiAgICAgICAgIGNvbnN0IGludCBwbGF5YmFja1N0YXR1cyA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgIGNvbnN0IGludDY0X3QgcG9zaXRpb24gPSBkYXRhLnJlYWRJbnQ2NCgpOwogICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMKLSAgICAgICAgICAgID0gc2V0UGxheWJhY2tTdGF0dXModW5pcXVlSWQsICZoYW5kbGUsIHBsYXliYWNrU3RhdHVzLCBwb3NpdGlvbik7CisgICAgICAgICAgICA9IHNldFBsYXliYWNrU3RhdHVzKHVuaXF1ZUlkLCBoYW5kbGUsIHBsYXliYWNrU3RhdHVzLCBwb3NpdGlvbik7CiAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAKLSAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKCZoYW5kbGUpOworICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKICAgICB9CiAKQEAgLTEzMjksMTMgKzEzMjksMTMgQEAKICAgICAgICAgY29uc3Qgb2ZmNjRfdCBsZW5ndGggPSBkYXRhLnJlYWRJbnQ2NCgpOwogICAgICAgICBjb25zdCBTdHJpbmc4IG1pbWUgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlCisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZQogICAgICAgICAgICAgPSBvcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGZkLCBvZmZzZXQsIGxlbmd0aCwgbWltZS5zdHJpbmcoKSk7CiAKLSAgICAgICAgaWYgKE5VTEwgIT0gaGFuZGxlKSB7Ci0gICAgICAgICAgICB3cml0ZURlY3J5cHRIYW5kbGVUb1BhcmNlbERhdGEoaGFuZGxlLCByZXBseSk7CisgICAgICAgIGlmIChOVUxMICE9IGhhbmRsZS5nZXQoKSkgeworICAgICAgICAgICAgd3JpdGVEZWNyeXB0SGFuZGxlVG9QYXJjZWxEYXRhKGhhbmRsZS5nZXQoKSwgcmVwbHkpOwogICAgICAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKGhhbmRsZSk7Ci0gICAgICAgICAgICBkZWxldGUgaGFuZGxlOyBoYW5kbGUgPSBOVUxMOworICAgICAgICAgICAgaGFuZGxlLmNsZWFyKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKICAgICB9CkBAIC0xMzQ5LDEzICsxMzQ5LDEzIEBACiAgICAgICAgIGNvbnN0IFN0cmluZzggdXJpID0gZGF0YS5yZWFkU3RyaW5nOCgpOwogICAgICAgICBjb25zdCBTdHJpbmc4IG1pbWUgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gb3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCB1cmkuc3RyaW5nKCksIG1pbWUuc3RyaW5nKCkpOworICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBvcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIHVyaS5zdHJpbmcoKSwgbWltZS5zdHJpbmcoKSk7CiAKLSAgICAgICAgaWYgKE5VTEwgIT0gaGFuZGxlKSB7Ci0gICAgICAgICAgICB3cml0ZURlY3J5cHRIYW5kbGVUb1BhcmNlbERhdGEoaGFuZGxlLCByZXBseSk7CisgICAgICAgIGlmIChOVUxMICE9IGhhbmRsZS5nZXQoKSkgeworICAgICAgICAgICAgd3JpdGVEZWNyeXB0SGFuZGxlVG9QYXJjZWxEYXRhKGhhbmRsZS5nZXQoKSwgcmVwbHkpOwogCiAgICAgICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKLSAgICAgICAgICAgIGRlbGV0ZSBoYW5kbGU7IGhhbmRsZSA9IE5VTEw7CisgICAgICAgICAgICBoYW5kbGUuY2xlYXIoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dWKCJOVUxMIGRlY3J5cHRIYW5kbGUgaXMgcmV0dXJuZWQiKTsKICAgICAgICAgfQpAQCAtMTM3MywxMyArMTM3MywxMiBAQAogICAgICAgICAgICAgICAgIGJ1ZmZlclNpemUpOwogICAgICAgICBjb25zdCBTdHJpbmc4IG1pbWVUeXBlKGRhdGEucmVhZFN0cmluZzgoKSk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gb3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBidWYsIG1pbWVUeXBlKTsKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gb3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBidWYsIG1pbWVUeXBlKTsKIAogICAgICAgICBpZiAoaGFuZGxlICE9IE5VTEwpIHsKICAgICAgICAgICAgIHdyaXRlRGVjcnlwdEhhbmRsZVRvUGFyY2VsRGF0YShoYW5kbGUsIHJlcGx5KTsKICAgICAgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwotICAgICAgICAgICAgZGVsZXRlIGhhbmRsZTsKLSAgICAgICAgICAgIGhhbmRsZSA9IE5VTEw7CisgICAgICAgICAgICBoYW5kbGUuY2xlYXIoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dWKCJOVUxMIGRlY3J5cHRIYW5kbGUgaXMgcmV0dXJuZWQiKTsKICAgICAgICAgfQpAQCAtMTM5Myw3ICsxMzkyLDcgQEAKIAogICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOwogCi0gICAgICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CiAgICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoaGFuZGxlLCBkYXRhKTsKIAogICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPSBjbG9zZURlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBoYW5kbGUpOwpAQCAtMTQwOCw4ICsxNDA3LDggQEAKIAogICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOwogCi0gICAgICAgIERlY3J5cHRIYW5kbGUgaGFuZGxlOwotICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKCZoYW5kbGUsIGRhdGEpOworICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOworICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKGhhbmRsZSwgZGF0YSk7CiAKICAgICAgICAgY29uc3QgaW50IGRlY3J5cHRVbml0SWQgPSBkYXRhLnJlYWRJbnQzMigpOwogCkBAIC0xNDE3LDE3ICsxNDE2LDE3IEBACiAgICAgICAgIGNvbnN0IHVpbnQzMl90IGJ1ZmZlclNpemUgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICBpZiAoYnVmZmVyU2l6ZSA+IGRhdGEuZGF0YUF2YWlsKCkpIHsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKEJBRF9WQUxVRSk7Ci0gICAgICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoJmhhbmRsZSk7CisgICAgICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiAgICAgICAgIH0KICAgICAgICAgRHJtQnVmZmVyKiBoZWFkZXJJbmZvID0gTlVMTDsKICAgICAgICAgaGVhZGVySW5mbyA9IG5ldyBEcm1CdWZmZXIoKGNoYXIgKilkYXRhLnJlYWRJbnBsYWNlKGJ1ZmZlclNpemUpLCBidWZmZXJTaXplKTsKIAogICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMKLSAgICAgICAgICAgID0gaW5pdGlhbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLCAmaGFuZGxlLCBkZWNyeXB0VW5pdElkLCBoZWFkZXJJbmZvKTsKKyAgICAgICAgICAgID0gaW5pdGlhbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLCBoYW5kbGUsIGRlY3J5cHRVbml0SWQsIGhlYWRlckluZm8pOwogICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogCi0gICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZSgmaGFuZGxlKTsKKyAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKGhhbmRsZSk7CiAgICAgICAgIGRlbGV0ZSBoZWFkZXJJbmZvOyBoZWFkZXJJbmZvID0gTlVMTDsKICAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKICAgICB9CkBAIC0xNDM5LDggKzE0MzgsOCBAQAogCiAgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSBoYW5kbGU7Ci0gICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoJmhhbmRsZSwgZGF0YSk7CisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlOworICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKGhhbmRsZSwgZGF0YSk7CiAKICAgICAgICAgY29uc3QgaW50IGRlY3J5cHRVbml0SWQgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICBjb25zdCB1aW50MzJfdCBkZWNCdWZmZXJTaXplID0gZGF0YS5yZWFkSW50MzIoKTsKQEAgLTE0NTAsNyArMTQ0OSw3IEBACiAgICAgICAgICAgICBkZWNCdWZmZXJTaXplID4gTUFYX0JJTkRFUl9UUkFOU0FDVElPTl9TSVpFKSB7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihCQURfVkFMVUUpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMCk7Ci0gICAgICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoJmhhbmRsZSk7CisgICAgICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiAgICAgICAgIH0KIApAQCAtMTQ3MCw3ICsxNDY5LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cwotICAgICAgICAgICAgPSBkZWNyeXB0KHVuaXF1ZUlkLCAmaGFuZGxlLCBkZWNyeXB0VW5pdElkLCBlbmNCdWZmZXIsICZkZWNCdWZmZXIsIElWKTsKKyAgICAgICAgICAgID0gZGVjcnlwdCh1bmlxdWVJZCwgaGFuZGxlLCBkZWNyeXB0VW5pdElkLCBlbmNCdWZmZXIsICZkZWNCdWZmZXIsIElWKTsKIAogICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogCkBAIC0xNDgwLDcgKzE0NzksNyBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlKGRlY0J1ZmZlci0+ZGF0YSwgc2l6ZSk7CiAgICAgICAgIH0KIAotICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoJmhhbmRsZSk7CisgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwogICAgICAgICBkZWxldGUgZW5jQnVmZmVyOyBlbmNCdWZmZXIgPSBOVUxMOwogICAgICAgICBkZWxldGUgZGVjQnVmZmVyOyBkZWNCdWZmZXIgPSBOVUxMOwogICAgICAgICBkZWxldGUgW10gYnVmZmVyOyBidWZmZXIgPSBOVUxMOwpAQCAtMTQ5NSwxMyArMTQ5NCwxMyBAQAogCiAgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSBoYW5kbGU7Ci0gICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoJmhhbmRsZSwgZGF0YSk7CisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CisgICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoaGFuZGxlLCBkYXRhKTsKIAotICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPSBmaW5hbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLCAmaGFuZGxlLCBkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzID0gZmluYWxpemVEZWNyeXB0VW5pdCh1bmlxdWVJZCwgaGFuZGxlLCBkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKIAotICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoJmhhbmRsZSk7CisgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwogICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogICAgIH0KIApAQCAtMTUxMiw4ICsxNTExLDggQEAKIAogICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOwogCi0gICAgICAgIERlY3J5cHRIYW5kbGUgaGFuZGxlOwotICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKCZoYW5kbGUsIGRhdGEpOworICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOworICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKGhhbmRsZSwgZGF0YSk7CiAKICAgICAgICAgY29uc3QgdWludDMyX3QgbnVtQnl0ZXMgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICBpZiAobnVtQnl0ZXMgPiBNQVhfQklOREVSX1RSQU5TQUNUSU9OX1NJWkUpIHsKQEAgLTE1MjQsMTMgKzE1MjMsMTMgQEAKIAogICAgICAgICBjb25zdCBvZmY2NF90IG9mZnNldCA9IGRhdGEucmVhZEludDY0KCk7CiAKLSAgICAgICAgc3NpemVfdCByZXN1bHQgPSBwcmVhZCh1bmlxdWVJZCwgJmhhbmRsZSwgYnVmZmVyLCBudW1CeXRlcywgb2Zmc2V0KTsKKyAgICAgICAgc3NpemVfdCByZXN1bHQgPSBwcmVhZCh1bmlxdWVJZCwgaGFuZGxlLCBidWZmZXIsIG51bUJ5dGVzLCBvZmZzZXQpOwogICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwogICAgICAgICBpZiAoMCA8IHJlc3VsdCkgewogICAgICAgICAgICAgcmVwbHktPndyaXRlKGJ1ZmZlciwgcmVzdWx0KTsKICAgICAgICAgfQogCi0gICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZSgmaGFuZGxlKTsKKyAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKGhhbmRsZSk7CiAgICAgICAgIGRlbGV0ZSBbXSBidWZmZXIsIGJ1ZmZlciA9IE5VTEw7CiAgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9pbmNsdWRlL0RybUVuZ2luZUJhc2UuaCBiL2RybS9jb21tb24vaW5jbHVkZS9Ecm1FbmdpbmVCYXNlLmgKaW5kZXggNDE3MTA3Zi4uNzNmMTFhNCAxMDA2NDQKLS0tIGEvZHJtL2NvbW1vbi9pbmNsdWRlL0RybUVuZ2luZUJhc2UuaAorKysgYi9kcm0vY29tbW9uL2luY2x1ZGUvRHJtRW5naW5lQmFzZS5oCkBAIC01OSwxMCArNTksMTEgQEAKIAogICAgIGludCBjaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24pOwogCi0gICAgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSk7CisgICAgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLAorICAgICAgICAgICAgYm9vbCByZXNlcnZlKTsKIAogICAgIHN0YXR1c190IHNldFBsYXliYWNrU3RhdHVzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKIAogICAgIGJvb2wgdmFsaWRhdGVBY3Rpb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CkBAIC04MCwyNyArODEsMjggQEAKICAgICBEcm1TdXBwb3J0SW5mbyogZ2V0U3VwcG9ydEluZm8oaW50IHVuaXF1ZUlkKTsKIAogICAgIHN0YXR1c190IG9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCwgY29uc3QgY2hhciogbWltZSk7CiAKICAgICBzdGF0dXNfdCBvcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKTsKIAotICAgIHN0YXR1c190IG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgc3RhdHVzX3Qgb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXImIGJ1ZiwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpOwogCi0gICAgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpOworICAgIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSk7CiAKLSAgICBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbyk7CiAKLSAgICBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpOwogCi0gICAgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKTsKKyAgICBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCk7CiAKLSAgICBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KTsKIAogcHJvdGVjdGVkOgpAQCAtMjY1LDcgKzI2Nyw3IEBACiAgICAgICogQHJldHVybiBzdGF0dXNfdAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9uQ29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgdmlydHVhbCBzdGF0dXNfdCBvbkNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgPSAwOwogCiAgICAgLyoqCkBAIC0yODAsNyArMjgyLDggQEAKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvblNldFBsYXliYWNrU3RhdHVzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pID0gMDsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywKKyAgICAgICAgICAgIGludDY0X3QgcG9zaXRpb24pID0gMDsKIAogICAgIC8qKgogICAgICAqIFZhbGlkYXRlcyB3aGV0aGVyIGFuIGFjdGlvbiBvbiB0aGUgRFJNIGNvbnRlbnQgaXMgYWxsb3dlZCBvciBub3QuCkBAIC0zODEsNyArMzg0LDcgQEAKICAgICAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcwogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgpID0gMDsKIAogICAgIC8qKgpAQCAtMzk4LDcgKzQwMSw3IEBACiAgICAgICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKAotICAgICAgICAgICAgaW50IC8qIHVuaXF1ZUlkICovLCBEZWNyeXB0SGFuZGxlKiAvKiBkZWNyeXB0SGFuZGxlICovLAorICAgICAgICAgICAgaW50IC8qIHVuaXF1ZUlkICovLCBzcDxEZWNyeXB0SGFuZGxlPiYgLyogZGVjcnlwdEhhbmRsZSAqLywKICAgICAgICAgICAgIGludCAvKiBmZCAqLywgb2ZmNjRfdCAvKiBvZmZzZXQgKi8sIG9mZjY0X3QgLyogbGVuZ3RoICovLAogICAgICAgICAgICAgY29uc3QgY2hhciogLyogbWltZSAqLykgewogCkBAIC00MTUsNyArNDE4LDcgQEAKICAgICAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcwogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgY29uc3QgY2hhciogdXJpKSA9IDA7CiAKICAgICAvKioKQEAgLTQzMCw3ICs0MzMsNyBAQAogICAgICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgIGludCAvKiB1bmlxdWVJZCAqLywgRGVjcnlwdEhhbmRsZSogLyogZGVjcnlwdEhhbmRsZSAqLywKKyAgICAgICAgICAgIGludCAvKiB1bmlxdWVJZCAqLywgc3A8RGVjcnlwdEhhbmRsZT4mIC8qIGRlY3J5cHRIYW5kbGUgKi8sCiAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKiB1cmkgKi8sIGNvbnN0IGNoYXIqIC8qIG1pbWUgKi8pIHsKIAogICAgICAgICByZXR1cm4gRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEU7CkBAIC00NDcsNyArNDUwLDcgQEAKICAgICAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcwogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oaW50IC8qIHVuaXF1ZUlkICovLAotICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogLyogZGVjcnlwdEhhbmRsZSAqLywKKyAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKiBkZWNyeXB0SGFuZGxlICovLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyJiAvKiBidWYgKi8sCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiAvKiBtaW1lVHlwZSAqLykgewogICAgICAgICByZXR1cm4gRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEU7CkBAIC00NjEsNyArNDY0LDcgQEAKICAgICAgKiBAcmV0dXJuIHN0YXR1c190CiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25DbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25DbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpID0gMDsKIAogICAgIC8qKgogICAgICAqIEluaXRpYWxpemUgZGVjcnlwdGlvbiBmb3IgdGhlIGdpdmVuIHVuaXQgb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CkBAIC00NzMsNyArNDc2LDcgQEAKICAgICAgKiBAcmV0dXJuIHN0YXR1c190CiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25Jbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25Jbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pID0gMDsKIAogICAgIC8qKgpAQCAtNDkzLDcgKzQ5Niw3IEBACiAgICAgICogICAgIERSTV9FUlJPUl9TRVNTSU9OX05PVF9PUEVORUQsIERSTV9FUlJPUl9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVELAogICAgICAqICAgICBEUk1fRVJST1JfREVDUllQVCBmb3IgZmFpbHVyZS4KICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9uRGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25EZWNyeXB0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgPSAwOwogCiAgICAgLyoqCkBAIC01MDYsNyArNTA5LDcgQEAKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvbkZpbmFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSA9IDA7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgPSAwOwogCiAgICAgLyoqCiAgICAgICogUmVhZHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgZnJvbSBhbiBvcGVuIERSTSBmaWxlLgpAQCAtNTE5LDcgKzUyMiw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIE51bWJlciBvZiBieXRlcyByZWFkLiBSZXR1cm5zIC0xIGZvciBGYWlsdXJlLgogICAgICAqLwotICAgIHZpcnR1YWwgc3NpemVfdCBvblByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHNzaXplX3Qgb25QcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCkgPSAwOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9pbmNsdWRlL0lEcm1FbmdpbmUuaCBiL2RybS9jb21tb24vaW5jbHVkZS9JRHJtRW5naW5lLmgKaW5kZXggYWNjOGVkOS4uMTgzN2ExMSAxMDA2NDQKLS0tIGEvZHJtL2NvbW1vbi9pbmNsdWRlL0lEcm1FbmdpbmUuaAorKysgYi9kcm0vY29tbW9uL2luY2x1ZGUvSURybUVuZ2luZS5oCkBAIC0yMTAsNyArMjEwLDcgQEAKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpID0gMDsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgPSAwOwogCiAgICAgLyoqCiAgICAgICogSW5mb3JtcyB0aGUgRFJNIEVuZ2luZSBhYm91dCB0aGUgcGxheWJhY2sgYWN0aW9ucyBwZXJmb3JtZWQgb24gdGhlIERSTSBmaWxlcy4KQEAgLTIyMyw3ICsyMjMsNyBAQAogICAgICAqIEByZXR1cm4gc3RhdHVzX3QKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cyhpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSA9IDA7CiAKICAgICAvKioKQEAgLTMyNyw3ICszMjcsNyBAQAogICAgICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgsIGNvbnN0IGNoYXIqIG1pbWUpID0gMDsKIAogICAgIC8qKgpAQCAtMzQyLDcgKzM0Miw3IEBACiAgICAgICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpID0gMDsKIAogICAgIC8qKgpAQCAtMzU1LDcgKzM1NSw3IEBACiAgICAgICogQHJldHVybgogICAgICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXImIGJ1ZiwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpID0gMDsKIAogICAgIC8qKgpAQCAtMzY2LDcgKzM2Niw3IEBACiAgICAgICogQHJldHVybiBzdGF0dXNfdAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpID0gMDsKIAogICAgIC8qKgogICAgICAqIEluaXRpYWxpemUgZGVjcnlwdGlvbiBmb3IgdGhlIGdpdmVuIHVuaXQgb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CkBAIC0zNzgsNyArMzc4LDcgQEAKICAgICAgKiBAcmV0dXJuIHN0YXR1c190CiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgPSAwOwogCiAgICAgLyoqCkBAIC0zOTgsNyArMzk4LDcgQEAKICAgICAgKiAgICAgRFJNX0VSUk9SX1NFU1NJT05fTk9UX09QRU5FRCwgRFJNX0VSUk9SX0RFQ1JZUFRfVU5JVF9OT1RfSU5JVElBTElaRUQsCiAgICAgICogICAgIERSTV9FUlJPUl9ERUNSWVBUIGZvciBmYWlsdXJlLgogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpID0gMDsKIAogICAgIC8qKgpAQCAtNDExLDcgKzQxMSw3IEBACiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpID0gMDsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBmcm9tIGFuIG9wZW4gRFJNIGZpbGUuCkBAIC00MjQsNyArNDI0LDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gTnVtYmVyIG9mIGJ5dGVzIHJlYWQuIFJldHVybnMgLTEgZm9yIEZhaWx1cmUuCiAgICAgICovCi0gICAgdmlydHVhbCBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpID0gMDsKIH07CiAKZGlmZiAtLWdpdCBhL2RybS9jb21tb24vaW5jbHVkZS9JRHJtTWFuYWdlclNlcnZpY2UuaCBiL2RybS9jb21tb24vaW5jbHVkZS9JRHJtTWFuYWdlclNlcnZpY2UuaAppbmRleCAwMzc2YjQ5Li44MzZhZTBhIDEwMDY0NAotLS0gYS9kcm0vY29tbW9uL2luY2x1ZGUvSURybU1hbmFnZXJTZXJ2aWNlLmgKKysrIGIvZHJtL2NvbW1vbi9pbmNsdWRlL0lEcm1NYW5hZ2VyU2VydmljZS5oCkBAIC0xMTUsMTAgKzExNSwxMSBAQAogICAgIHZpcnR1YWwgaW50IGNoZWNrUmlnaHRzU3RhdHVzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbikgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpID0gMDsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSA9IDA7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsCisgICAgICAgICAgICBpbnQ2NF90IHBvc2l0aW9uKSA9IDA7CiAKICAgICB2aXJ0dWFsIGJvb2wgdmFsaWRhdGVBY3Rpb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsCkBAIC0xMzgsMjggKzEzOSwyOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWxsU3VwcG9ydEluZm8oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCogbGVuZ3RoLCBEcm1TdXBwb3J0SW5mbyoqIGRybVN1cHBvcnRJbmZvQXJyYXkpID0gMDsKIAotICAgIHZpcnR1YWwgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKAorICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwKICAgICAgICAgICAgICAgICBvZmY2NF90IGxlbmd0aCwgY29uc3QgY2hhciogbWltZSkgPSAwOwogCi0gICAgdmlydHVhbCBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpID0gMDsKIAotICAgIHZpcnR1YWwgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKAorICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1CdWZmZXImIGJ1ZiwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSkgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSA9IDA7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgPSAwOwogCi0gICAgdmlydHVhbCBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcyxvZmY2NF90IG9mZnNldCkgPSAwOwogfTsKIApAQCAtMjAzLDEwICsyMDQsMTAgQEAKICAgICB2aXJ0dWFsIGludCBjaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24pOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tTdGF0dXMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOwogCiAgICAgdmlydHVhbCBib29sIHZhbGlkYXRlQWN0aW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uLCBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pOwpAQCAtMjI1LDI4ICsyMjYsMjggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFsbFN1cHBvcnRJbmZvKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQqIGxlbmd0aCwgRHJtU3VwcG9ydEluZm8qKiBkcm1TdXBwb3J0SW5mb0FycmF5KTsKIAotICAgIHZpcnR1YWwgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKAorICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgsCiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWltZSk7CiAKLSAgICB2aXJ0dWFsIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSk7CiAKLSAgICB2aXJ0dWFsIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgRHJtQnVmZmVyJiBidWYsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpOwogCi0gICAgdmlydHVhbCBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmNwcCBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAKaW5kZXggYmYwNGE4OS4uYWZiY2IzOSAxMDA2NDQKLS0tIGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmNwcAorKysgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwCkBAIC0yNjcsNyArMjY3LDcgQEAKIH0KIAogc3RhdHVzX3QgRHJtTWFuYWdlcjo6Y29uc3VtZVJpZ2h0cygKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgeworICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgewogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOwogICAgIGlmIChtRGVjcnlwdFNlc3Npb25NYXAuaW5kZXhPZktleShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpICE9IE5BTUVfTk9UX0ZPVU5EKSB7CkBAIC0yNzgsNyArMjc4LDcgQEAKIH0KIAogc3RhdHVzX3QgRHJtTWFuYWdlcjo6c2V0UGxheWJhY2tTdGF0dXMoCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pIHsKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pIHsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlY3J5cHRMb2NrKTsKICAgICBpZiAobURlY3J5cHRTZXNzaW9uTWFwLmluZGV4T2ZLZXkoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSAhPSBOQU1FX05PVF9GT1VORCkgewpAQCAtMzk2LDE1ICszOTYsMTUgQEAKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQogCi1EZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyOjpvcGVuRGVjcnlwdFNlc3Npb24oCitzcDxEZWNyeXB0SGFuZGxlPiBEcm1NYW5hZ2VyOjpvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgsIGNvbnN0IGNoYXIqIG1pbWUpIHsKIAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOwogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9DQU5OT1RfSEFORExFOwogICAgIFZlY3RvcjxTdHJpbmc4PiBwbHVnSW5JZExpc3QgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW5JZExpc3QoKTsKIAotICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7Ci0gICAgaWYgKE5VTEwgIT0gaGFuZGxlKSB7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKKyAgICBpZiAoTlVMTCAhPSBoYW5kbGUuZ2V0KCkpIHsKICAgICAgICAgaGFuZGxlLT5kZWNyeXB0SWQgPSBtRGVjcnlwdFNlc3Npb25JZCArIDE7CiAKICAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHBsdWdJbklkTGlzdC5zaXplKCk7IGluZGV4KyspIHsKQEAgLTQyMCwxOSArNDIwLDE5IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKERSTV9OT19FUlJPUiAhPSByZXN1bHQpIHsKLSAgICAgICAgZGVsZXRlIGhhbmRsZTsgaGFuZGxlID0gTlVMTDsKKyAgICAgICAgaGFuZGxlLmNsZWFyKCk7CiAgICAgfQogICAgIHJldHVybiBoYW5kbGU7CiB9CiAKLURlY3J5cHRIYW5kbGUqIERybU1hbmFnZXI6Om9wZW5EZWNyeXB0U2Vzc2lvbigKK3NwPERlY3J5cHRIYW5kbGU+IERybU1hbmFnZXI6Om9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlY3J5cHRMb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRTsKICAgICBWZWN0b3I8U3RyaW5nOD4gcGx1Z0luSWRMaXN0ID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luSWRMaXN0KCk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOwotICAgIGlmIChOVUxMICE9IGhhbmRsZSkgeworICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CisgICAgaWYgKE5VTEwgIT0gaGFuZGxlLmdldCgpKSB7CiAgICAgICAgIGhhbmRsZS0+ZGVjcnlwdElkID0gbURlY3J5cHRTZXNzaW9uSWQgKyAxOwogCiAgICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBwbHVnSW5JZExpc3Quc2l6ZSgpOyBpbmRleCsrKSB7CkBAIC00NDgsMjAgKzQ0OCwyMCBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChEUk1fTk9fRVJST1IgIT0gcmVzdWx0KSB7Ci0gICAgICAgIGRlbGV0ZSBoYW5kbGU7IGhhbmRsZSA9IE5VTEw7CisgICAgICAgIGhhbmRsZS5jbGVhcigpOwogICAgICAgICBBTE9HVigiRHJtTWFuYWdlcjo6b3BlbkRlY3J5cHRTZXNzaW9uOiBubyBjYXBhYmxlIHBsdWctaW4gZm91bmQiKTsKICAgICB9CiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIAotRGVjcnlwdEhhbmRsZSogRHJtTWFuYWdlcjo6b3BlbkRlY3J5cHRTZXNzaW9uKAorc3A8RGVjcnlwdEhhbmRsZT4gRHJtTWFuYWdlcjo6b3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IERybUJ1ZmZlciYgYnVmLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOwogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9DQU5OT1RfSEFORExFOwogICAgIFZlY3RvcjxTdHJpbmc4PiBwbHVnSW5JZExpc3QgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW5JZExpc3QoKTsKIAotICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7Ci0gICAgaWYgKE5VTEwgIT0gaGFuZGxlKSB7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKKyAgICBpZiAoTlVMTCAhPSBoYW5kbGUuZ2V0KCkpIHsKICAgICAgICAgaGFuZGxlLT5kZWNyeXB0SWQgPSBtRGVjcnlwdFNlc3Npb25JZCArIDE7CiAKICAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHBsdWdJbklkTGlzdC5zaXplKCk7IGluZGV4KyspIHsKQEAgLTQ3NywyMCArNDc3LDE5IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKERSTV9OT19FUlJPUiAhPSByZXN1bHQpIHsKLSAgICAgICAgZGVsZXRlIGhhbmRsZTsKLSAgICAgICAgaGFuZGxlID0gTlVMTDsKKyAgICAgICAgaGFuZGxlLmNsZWFyKCk7CiAgICAgICAgIEFMT0dWKCJEcm1NYW5hZ2VyOjpvcGVuRGVjcnlwdFNlc3Npb246IG5vIGNhcGFibGUgcGx1Zy1pbiBmb3VuZCIpOwogICAgIH0KICAgICByZXR1cm4gaGFuZGxlOwogfQogCi1zdGF0dXNfdCBEcm1NYW5hZ2VyOjpjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgeworc3RhdHVzX3QgRHJtTWFuYWdlcjo6Y2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZWNyeXB0TG9jayk7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgaWYgKG1EZWNyeXB0U2Vzc2lvbk1hcC5pbmRleE9mS2V5KGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkgIT0gTkFNRV9OT1RfRk9VTkQpIHsKICAgICAgICAgSURybUVuZ2luZSogZHJtRW5naW5lID0gbURlY3J5cHRTZXNzaW9uTWFwLnZhbHVlRm9yKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CiAgICAgICAgIHJlc3VsdCA9IGRybUVuZ2luZS0+Y2xvc2VEZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSk7Ci0gICAgICAgIGlmIChEUk1fTk9fRVJST1IgPT0gcmVzdWx0KSB7CisgICAgICAgIGlmIChEUk1fTk9fRVJST1IgPT0gcmVzdWx0ICYmIE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgewogICAgICAgICAgICAgbURlY3J5cHRTZXNzaW9uTWFwLnJlbW92ZUl0ZW0oZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKICAgICAgICAgfQogICAgIH0KQEAgLTQ5OCw3ICs0OTcsOCBAQAogfQogCiBzdGF0dXNfdCBEcm1NYW5hZ2VyOjppbml0aWFsaXplRGVjcnlwdFVuaXQoCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSB7CisgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pIHsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlY3J5cHRMb2NrKTsKICAgICBpZiAobURlY3J5cHRTZXNzaW9uTWFwLmluZGV4T2ZLZXkoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSAhPSBOQU1FX05PVF9GT1VORCkgewpAQCAtNTA4LDcgKzUwOCw3IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdHVzX3QgRHJtTWFuYWdlcjo6ZGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorc3RhdHVzX3QgRHJtTWFuYWdlcjo6ZGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpIHsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKIApAQCAtNTIyLDcgKzUyMiw3IEBACiB9CiAKIHN0YXR1c190IERybU1hbmFnZXI6OmZpbmFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgewogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOwogICAgIGlmIChtRGVjcnlwdFNlc3Npb25NYXAuaW5kZXhPZktleShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpICE9IE5BTUVfTk9UX0ZPVU5EKSB7CkBAIC01MzIsNyArNTMyLDcgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zc2l6ZV90IERybU1hbmFnZXI6OnByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKK3NzaXplX3QgRHJtTWFuYWdlcjo6cHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpIHsKICAgICBzc2l6ZV90IHJlc3VsdCA9IERFQ1JZUFRfRklMRV9FUlJPUjsKIApkaWZmIC0tZ2l0IGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmggYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuaAppbmRleCBlN2NkZDM2Li4yNjIyMmJjIDEwMDY0NAotLS0gYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuaAorKysgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuaApAQCAtODksMTAgKzg5LDExIEBACiAKICAgICBpbnQgY2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uKTsKIAotICAgIHN0YXR1c190IGNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpOworICAgIHN0YXR1c190IGNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwKKyAgICAgICAgICAgIGJvb2wgcmVzZXJ2ZSk7CiAKICAgICBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CiAKICAgICBib29sIHZhbGlkYXRlQWN0aW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uLCBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pOwpAQCAtMTA5LDI1ICsxMTAsMjYgQEAKIAogICAgIHN0YXR1c190IGdldEFsbFN1cHBvcnRJbmZvKGludCB1bmlxdWVJZCwgaW50KiBsZW5ndGgsIERybVN1cHBvcnRJbmZvKiogZHJtU3VwcG9ydEluZm9BcnJheSk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCwgY29uc3QgY2hhciogbWltZSk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpOworICAgIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1CdWZmZXImIGJ1ZiwKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1CdWZmZXImIGJ1ZiwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKIAotICAgIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKTsKKyAgICBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpOwogCi0gICAgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pOwogCi0gICAgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKTsKIAotICAgIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCk7CisgICAgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQpOwogCi0gICAgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCk7CiAKICAgICB2b2lkIG9uSW5mbyhjb25zdCBEcm1JbmZvRXZlbnQmIGV2ZW50KTsKZGlmZiAtLWdpdCBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuY3BwIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5jcHAKaW5kZXggZGFkNTk5Yi4uMjUzMjI3NSAxMDA2NDQKLS0tIGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5jcHAKKysrIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5jcHAKQEAgLTIwNiw3ICsyMDYsNyBAQAogfQogCiBzdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6Y29uc3VtZVJpZ2h0cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSB7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKICAgICBBTE9HVigiRW50ZXJpbmcgY29uc3VtZVJpZ2h0cyIpOwogICAgIGlmICghaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChDT05TVU1FX1JJR0hUUykpIHsKICAgICAgICAgcmV0dXJuIERSTV9FUlJPUl9OT19QRVJNSVNTSU9OOwpAQCAtMjE1LDcgKzIxNSw3IEBACiB9CiAKIHN0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjpzZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSB7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pIHsKICAgICBBTE9HVigiRW50ZXJpbmcgc2V0UGxheWJhY2tTdGF0dXMiKTsKICAgICBpZiAoIWlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoU0VUX1BMQVlCQUNLX1NUQVRVUykpIHsKICAgICAgICAgcmV0dXJuIERSTV9FUlJPUl9OT19QRVJNSVNTSU9OOwpAQCAtMjYyLDcgKzI2Miw3IEBACiAgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5nZXRBbGxTdXBwb3J0SW5mbyh1bmlxdWVJZCwgbGVuZ3RoLCBkcm1TdXBwb3J0SW5mb0FycmF5KTsKIH0KIAotRGVjcnlwdEhhbmRsZSogRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKK3NwPERlY3J5cHRIYW5kbGU+IERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoLCBjb25zdCBjaGFyKiBtaW1lKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24iKTsKICAgICBpZiAoaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChPUEVOX0RFQ1JZUFRfU0VTU0lPTikpIHsKQEAgLTI3Miw3ICsyNzIsNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1EZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAorc3A8RGVjcnlwdEhhbmRsZT4gRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24gd2l0aCB1cmkiKTsKICAgICBpZiAoaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChPUEVOX0RFQ1JZUFRfU0VTU0lPTikpIHsKQEAgLTI4Miw3ICsyODIsNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1EZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAorc3A8RGVjcnlwdEhhbmRsZT4gRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgRHJtQnVmZmVyJiBidWYsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24gZm9yIHN0cmVhbWluZyIpOwogICAgIGlmIChpc1Byb3RlY3RlZENhbGxBbGxvd2VkKE9QRU5fREVDUllQVF9TRVNTSU9OKSkgewpAQCAtMjkyLDcgKzI5Miw3IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjpjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgeworc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OmNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSkgewogICAgIEFMT0dWKCJFbnRlcmluZyBjbG9zZURlY3J5cHRTZXNzaW9uIik7CiAgICAgaWYgKCFpc1Byb3RlY3RlZENhbGxBbGxvd2VkKENMT1NFX0RFQ1JZUFRfU0VTU0lPTikpIHsKICAgICAgICAgcmV0dXJuIERSTV9FUlJPUl9OT19QRVJNSVNTSU9OOwpAQCAtMzAwLDcgKzMwMCw3IEBACiAgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5jbG9zZURlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlKTsKIH0KIAotc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OmluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCitzdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6aW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIGluaXRpYWxpemVEZWNyeXB0VW5pdCIpOwogICAgIGlmICghaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChJTklUSUFMSVpFX0RFQ1JZUFRfVU5JVCkpIHsKQEAgLTMxMCw3ICszMTAsNyBAQAogfQogCiBzdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6ZGVjcnlwdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpIHsKICAgICBBTE9HVigiRW50ZXJpbmcgZGVjcnlwdCIpOwogICAgIGlmICghaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChERUNSWVBUKSkgewpAQCAtMzIwLDcgKzMyMCw3IEBACiB9CiAKIHN0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjpmaW5hbGl6ZURlY3J5cHRVbml0KAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgeworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKICAgICBBTE9HVigiRW50ZXJpbmcgZmluYWxpemVEZWNyeXB0VW5pdCIpOwogICAgIGlmICghaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChGSU5BTElaRV9ERUNSWVBUX1VOSVQpKSB7CiAgICAgICAgIHJldHVybiBEUk1fRVJST1JfTk9fUEVSTUlTU0lPTjsKQEAgLTMyOCw3ICszMjgsNyBAQAogICAgIHJldHVybiBtRHJtTWFuYWdlci0+ZmluYWxpemVEZWNyeXB0VW5pdCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCk7CiB9CiAKLXNzaXplX3QgRHJtTWFuYWdlclNlcnZpY2U6OnByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKK3NzaXplX3QgRHJtTWFuYWdlclNlcnZpY2U6OnByZWFkKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIHByZWFkIik7CiAgICAgaWYgKCFpc1Byb3RlY3RlZENhbGxBbGxvd2VkKFBSRUFEKSkgewpkaWZmIC0tZ2l0IGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5oIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5oCmluZGV4IDQ1Y2VlMmUuLjdhYWVhYjUgMTAwNjQ0Ci0tLSBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuaAorKysgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmgKQEAgLTk1LDEwICs5NSwxMSBAQAogCiAgICAgaW50IGNoZWNrUmlnaHRzU3RhdHVzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCxpbnQgYWN0aW9uKTsKIAotICAgIHN0YXR1c190IGNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpOworICAgIHN0YXR1c190IGNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwKKyAgICAgICAgICAgIGJvb2wgcmVzZXJ2ZSk7CiAKICAgICBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CiAKICAgICBib29sIHZhbGlkYXRlQWN0aW9uKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwKICAgICAgICAgICAgIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CkBAIC0xMTUsMjYgKzExNiwyNyBAQAogCiAgICAgc3RhdHVzX3QgZ2V0QWxsU3VwcG9ydEluZm8oaW50IHVuaXF1ZUlkLCBpbnQqIGxlbmd0aCwgRHJtU3VwcG9ydEluZm8qKiBkcm1TdXBwb3J0SW5mb0FycmF5KTsKIAotICAgIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgsIGNvbnN0IGNoYXIgKm1pbWUpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKAorICAgIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgRHJtQnVmZmVyJiBidWYsCisgICAgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgRHJtQnVmZmVyJiBidWYsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CiAKLSAgICBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSk7CisgICAgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKTsKIAotICAgIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKTsKIAotICAgIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVik7CiAKLSAgICBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpOworICAgIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkKTsKIAotICAgIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnRJbXBsLmNwcCBiL2RybS9saWJkcm1mcmFtZXdvcmsvRHJtTWFuYWdlckNsaWVudEltcGwuY3BwCmluZGV4IGMwNDdlYjEuLmIwYTQ0MWIgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvRHJtTWFuYWdlckNsaWVudEltcGwuY3BwCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvRHJtTWFuYWdlckNsaWVudEltcGwuY3BwCkBAIC0xODMsNyArMTgzLDcgQEAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSB7CiAgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmNvbnN1bWVSaWdodHMoCi0gICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUuZ2V0KCksIGFjdGlvbiwgcmVzZXJ2ZSk7CisgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGFjdGlvbiwgcmVzZXJ2ZSk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CkBAIC0xOTQsNyArMTk0LDcgQEAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSB7CiAgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPnNldFBsYXliYWNrU3RhdHVzKAotICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLmdldCgpLCBwbGF5YmFja1N0YXR1cywgcG9zaXRpb24pOworICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBwbGF5YmFja1N0YXR1cywgcG9zaXRpb24pOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtMjY3LDcgKzI2Nyw3IEBACiBzcDxEZWNyeXB0SGFuZGxlPiBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6b3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSkgewogCi0gICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gTlVMTDsKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGU7CiAgICAgaWYgKE5VTEwgIT0gdXJpKSB7CiAgICAgICAgIGhhbmRsZSA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPm9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgdXJpLCBtaW1lKTsKICAgICB9CkBAIC0yODQsNyArMjg0LDcgQEAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSB7CiAgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmNsb3NlRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUuZ2V0KCkpOworICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTI5NSw3ICsyOTUsNyBAQAogICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIGlmICgoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSAmJiAoTlVMTCAhPSBoZWFkZXJJbmZvKSkgewogICAgICAgICBzdGF0dXMgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5pbml0aWFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUuZ2V0KCksIGRlY3J5cHRVbml0SWQsIGhlYWRlckluZm8pOworICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkLCBoZWFkZXJJbmZvKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTMwOCw3ICszMDgsNyBAQAogICAgIGlmICgoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSAmJiAoTlVMTCAhPSBlbmNCdWZmZXIpCiAgICAgICAgICYmIChOVUxMICE9IGRlY0J1ZmZlcikgJiYgKE5VTEwgIT0gKmRlY0J1ZmZlcikpIHsKICAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+ZGVjcnlwdCgKLSAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZS5nZXQoKSwgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgICAgICBlbmNCdWZmZXIsIGRlY0J1ZmZlciwgSVYpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwpAQCAtMzE5LDcgKzMxOSw3IEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgewogICAgICAgICBzdGF0dXMgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5maW5hbGl6ZURlY3J5cHRVbml0KAotICAgICAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZS5nZXQoKSwgZGVjcnlwdFVuaXRJZCk7CisgICAgICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTMyOSw3ICszMjksNyBAQAogICAgIHNzaXplX3QgcmV0Q29kZSA9IElOVkFMSURfVkFMVUU7CiAgICAgaWYgKChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpICYmIChOVUxMICE9IGJ1ZmZlcikgJiYgKDAgPCBudW1CeXRlcykpIHsKICAgICAgICAgcmV0Q29kZSA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPnByZWFkKAotICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLmdldCgpLCBidWZmZXIsIG51bUJ5dGVzLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBidWZmZXIsIG51bUJ5dGVzLCBvZmZzZXQpOwogICAgIH0KICAgICByZXR1cm4gcmV0Q29kZTsKIH0KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9pbmNsdWRlL0Z3ZExvY2tFbmdpbmUuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9pbmNsdWRlL0Z3ZExvY2tFbmdpbmUuaAppbmRleCBhNTcxYjNhLi5iNjJkZGI5IDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvaW5jbHVkZS9Gd2RMb2NrRW5naW5lLmgKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL2luY2x1ZGUvRndkTG9ja0VuZ2luZS5oCkBAIC0xOTgsNyArMTk4LDcgQEAKICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAqLwogc3RhdHVzX3Qgb25Db25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXNlcnZlKTsKIApAQCAtMjE1LDEyICsyMTUsMTIgQEAKICAqLwogI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCiBzdGF0dXNfdCBvblNldFBsYXliYWNrU3RhdHVzKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwbGF5YmFja1N0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwb3NpdGlvbik7CiAjZWxzZQogc3RhdHVzX3Qgb25TZXRQbGF5YmFja1N0YXR1cyhpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGxheWJhY2tTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbik7CiAjZW5kaWYKQEAgLTMzMCwxMSArMzMwLDExIEBACiAgKi8KICNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQogc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgpOwogI2Vsc2UKIHN0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCk7CiAjZW5kaWYKIApAQCAtMzQ4LDcgKzM0OCw3IEBACiAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcwogICovCiBzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmkpOwogCiAvKioKQEAgLTM2MCw3ICszNjAsNyBAQAogICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICovCiBzdGF0dXNfdCBvbkNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKTsKIAogLyoqCiAgKiBJbml0aWFsaXplIGRlY3J5cHRpb24gZm9yIHRoZSBnaXZlbiB1bml0IG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudC4KQEAgLTM3Myw3ICszNzMsNyBAQAogICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKICAqLwogc3RhdHVzX3Qgb25Jbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pOwogCkBAIC0zOTQsNyArMzk0LDcgQEAKICAqICAgICBEUk1fRVJST1JfREVDUllQVCBmb3IgZmFpbHVyZS4KICAqLwogc3RhdHVzX3Qgb25EZWNyeXB0KGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLAogICAgICAgICAgICAgICAgICAgIERybUJ1ZmZlcioqIGRlY0J1ZmZlcik7CkBAIC00MTYsNyArNDE2LDcgQEAKICAqICAgICBEUk1fRVJST1JfU0VTU0lPTl9OT1RfT1BFTkVELCBEUk1fRVJST1JfREVDUllQVF9VTklUX05PVF9JTklUSUFMSVpFRCwKICAqICAgICBEUk1fRVJST1JfREVDUllQVCBmb3IgZmFpbHVyZS4KICAqLwotc3RhdHVzX3Qgb25EZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKK3N0YXR1c190IG9uRGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwKICAgICAgICAgICAgICAgICAgICBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpOwogCkBAIC00MzAsNyArNDMwLDcgQEAKICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgKi8KIHN0YXR1c190IG9uRmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCk7CiAKIC8qKgpAQCAtNDQ1LDcgKzQ0NSw3IEBACiAgKiBAcmV0dmFsIC0xIEZhaWx1cmUuCiAgKi8KIHNzaXplX3Qgb25SZWFkKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgIHZvaWQqIHBCdWZmZXIsCiAgICAgICAgICAgICAgICBpbnQgbnVtQnl0ZXMpOwogCkBAIC00NjMsMTIgKzQ2MywxMiBAQAogICovCiAjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKIG9mZjY0X3Qgb25Mc2VlayhpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCwKICAgICAgICAgICAgICAgICBpbnQgd2hlbmNlKTsKICNlbHNlCiBvZmZfdCBvbkxzZWVrKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgIG9mZl90IG9mZnNldCwKICAgICAgICAgICAgICAgaW50IHdoZW5jZSk7CiAjZW5kaWYKQEAgLTQ4NiwxMyArNDg2LDEzIEBACiAgKi8KICNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQogc3NpemVfdCBvblByZWFkKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKICAgICAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzLAogICAgICAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0KTsKICNlbHNlCiBzc2l6ZV90IG9uUHJlYWQoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAogICAgICAgICAgICAgICAgIHNzaXplX3QgbnVtQnl0ZXMsCiAgICAgICAgICAgICAgICAgb2ZmX3Qgb2Zmc2V0KTsKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvc3JjL0Z3ZExvY2tFbmdpbmUuY3BwCmluZGV4IDczZWVhODkuLjc2OWRlMGMgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL3NyYy9Gd2RMb2NrRW5naW5lLmNwcApAQCAtMjk0LDcgKzI5NCw3IEBACiB9CiAKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uQ29uc3VtZVJpZ2h0cyhpbnQgLyogdW5pcXVlSWQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogLyogZGVjcnlwdEhhbmRsZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLyogZGVjcnlwdEhhbmRsZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogYWN0aW9uICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgLyogcmVzZXJ2ZSAqLykgewogICAgIC8vIE5vIHJpZ2h0cyBjb25zdW1wdGlvbgpAQCAtMzcyLDExICszNzIsMTMgQEAKIH0KIAogI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCi1zdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvblNldFBsYXliYWNrU3RhdHVzKGludCAvKiB1bmlxdWVJZCAqLywgRGVjcnlwdEhhbmRsZSogLyogZGVjcnlwdEhhbmRsZSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIHBsYXliYWNrU3RhdHVzICovLCBpbnQ2NF90IC8qIHBvc2l0aW9uICovKSB7CitzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvblNldFBsYXliYWNrU3RhdHVzKGludCAvKiB1bmlxdWVJZCAqLywKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIC8qIGRlY3J5cHRIYW5kbGUgKi8sIGludCAvKiBwbGF5YmFja1N0YXR1cyAqLywKKyAgICAgICAgaW50NjRfdCAvKiBwb3NpdGlvbiAqLykgewogI2Vsc2UKLXN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uU2V0UGxheWJhY2tTdGF0dXMoaW50IC8qIHVuaXF1ZUlkICovLCBEZWNyeXB0SGFuZGxlKiAvKiBkZWNyeXB0SGFuZGxlICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogcGxheWJhY2tTdGF0dXMgKi8sIGludCAvKiBwb3NpdGlvbiAqLykgeworc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25TZXRQbGF5YmFja1N0YXR1cyhpbnQgLyogdW5pcXVlSWQgKi8sCisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKiBkZWNyeXB0SGFuZGxlICovLAorICAgICAgICBpbnQgLyogcGxheWJhY2tTdGF0dXMgKi8sIGludCAvKiBwb3NpdGlvbiAqLykgewogI2VuZGlmCiAgICAgLy8gTm90IHVzZWQKICAgICBMT0dfVkVSQk9TRSgiRndkTG9ja0VuZ2luZTo6b25TZXRQbGF5YmFja1N0YXR1cyIpOwpAQCAtNDcwLDEzICs0NzIsMTMgQEAKIAogI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCiBzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgLyogdW5pcXVlSWQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3QgLyogbGVuZ3RoICovKSB7CiAjZWxzZQogc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24oaW50IC8qIHVuaXF1ZUlkICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBsZW5ndGggKi8pIHsKQEAgLTQ4Nyw3ICs0ODksNyBAQAogICAgIExPR19WRVJCT1NFKCJGd2RMb2NrRW5naW5lOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbiIpOwogCiAgICAgaWYgKCgtMSA8IGZkKSAmJgotICAgICAgICAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlKSAmJgorICAgICAgICAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSAmJgogICAgICAgICAoIWRlY29kZVNlc3Npb25NYXAuaXNDcmVhdGVkKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkpKSB7CiAgICAgICAgIGZpbGVEZXNjID0gZHVwKGZkKTsKICAgICB9IGVsc2UgewpAQCAtNTMzLDEyICs1MzUsMTIgQEAKIH0KIAogc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdXJpKSB7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEU7CiAgICAgY29uc3QgY2hhciBmaWxlVGFnIFtdID0gImZpbGU6Ly8iOwogCi0gICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSAmJiBOVUxMICE9IHVyaSAmJiBzdHJsZW4odXJpKSA+IHNpemVvZihmaWxlVGFnKSkgeworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkgJiYgTlVMTCAhPSB1cmkgJiYgc3RybGVuKHVyaSkgPiBzaXplb2YoZmlsZVRhZykpIHsKICAgICAgICAgU3RyaW5nOCB1cmlUYWcgPSBTdHJpbmc4KHVyaSk7CiAgICAgICAgIHVyaVRhZy50b0xvd2VyKCk7CiAKQEAgLTU2MiwxMSArNTY0LDExIEBACiB9CiAKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgLyogdW5pcXVlSWQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKSB7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgTE9HX1ZFUkJPU0UoIkZ3ZExvY2tFbmdpbmU6Om9uQ2xvc2VEZWNyeXB0U2Vzc2lvbiIpOwogCi0gICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSAmJiBkZWNvZGVTZXNzaW9uTWFwLmlzQ3JlYXRlZChkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpKSB7CisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSAmJiBkZWNvZGVTZXNzaW9uTWFwLmlzQ3JlYXRlZChkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpKSB7CiAgICAgICAgIERlY29kZVNlc3Npb24qIHNlc3Npb24gPSBkZWNvZGVTZXNzaW9uTWFwLmdldFZhbHVlKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CiAgICAgICAgIGlmIChOVUxMICE9IHNlc3Npb24gJiYgc2Vzc2lvbi0+ZmlsZURlc2MgPiAtMSkgewogICAgICAgICAgICAgRndkTG9ja0ZpbGVfZGV0YWNoKHNlc3Npb24tPmZpbGVEZXNjKTsKQEAgLTU3Niw3ICs1NzgsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSkgeworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpIHsKICAgICAgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8pIHsKICAgICAgICAgICAgIGRlbGV0ZSBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbzsKICAgICAgICAgICAgIGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvID0gTlVMTDsKQEAgLTU4NCw5ICs1ODYsNyBAQAogCiAgICAgICAgIGRlY3J5cHRIYW5kbGUtPmNvcHlDb250cm9sVmVjdG9yLmNsZWFyKCk7CiAgICAgICAgIGRlY3J5cHRIYW5kbGUtPmV4dGVuZGVkRGF0YS5jbGVhcigpOwotCi0gICAgICAgIGRlbGV0ZSBkZWNyeXB0SGFuZGxlOwotICAgICAgICBkZWNyeXB0SGFuZGxlID0gTlVMTDsKKyAgICAgICAgZGVjcnlwdEhhbmRsZS5jbGVhcigpOwogICAgIH0KIAogICAgIExPR19WRVJCT1NFKCJGd2RMb2NrRW5naW5lOjpvbkNsb3NlRGVjcnlwdFNlc3Npb24gRXhpdCIpOwpAQCAtNTk0LDcgKzU5NCw3IEBACiB9CiAKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIC8qIGRlY3J5cHRIYW5kbGUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLyogZGVjcnlwdEhhbmRsZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBkZWNyeXB0VW5pdElkICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiAvKiBoZWFkZXJJbmZvICovKSB7CiAgICAgQUxPR0UoIkZ3ZExvY2tFbmdpbmU6Om9uSW5pdGlhbGl6ZURlY3J5cHRVbml0IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgRFJNIHNjaGVtZSIpOwpAQCAtNjAzLDcgKzYwMyw3IEBACiAKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uRGVjcnlwdCgKICAgICAgICAgICAgIGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIC8qIGRlY3J5cHRIYW5kbGUgKi8sCisgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLyogZGVjcnlwdEhhbmRsZSAqLywKICAgICAgICAgICAgIGludCAvKiBkZWNyeXB0VW5pdElkICovLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiAvKiBlbmNCdWZmZXIgKi8sCiAgICAgICAgICAgICBEcm1CdWZmZXIqKiAvKiBkZWNCdWZmZXIgKi8sCkBAIC02MTMsNyArNjEzLDcgQEAKIH0KIAogc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25EZWNyeXB0KGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiAvKiBkZWNyeXB0SGFuZGxlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKiBkZWNyeXB0SGFuZGxlICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBkZWNyeXB0VW5pdElkICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogLyogZW5jQnVmZmVyICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybUJ1ZmZlcioqIC8qIGRlY0J1ZmZlciAqLykgewpAQCAtNjIyLDE5ICs2MjIsMTkgQEAKIH0KIAogc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25GaW5hbGl6ZURlY3J5cHRVbml0KGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiAvKiBkZWNyeXB0SGFuZGxlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKiBkZWNyeXB0SGFuZGxlICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBkZWNyeXB0VW5pdElkICovKSB7CiAgICAgQUxPR0UoIkZ3ZExvY2tFbmdpbmU6Om9uRmluYWxpemVEZWNyeXB0VW5pdCBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIERSTSBzY2hlbWUiKTsKICAgICByZXR1cm4gRFJNX0VSUk9SX1VOS05PV047CiB9CiAKIHNzaXplX3QgRndkTG9ja0VuZ2luZTo6b25SZWFkKGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1CeXRlcykgewogICAgIHNzaXplX3Qgc2l6ZSA9IC0xOwogCi0gICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSAmJgorICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkgJiYKICAgICAgICAgZGVjb2RlU2Vzc2lvbk1hcC5pc0NyZWF0ZWQoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSAmJgogICAgICAgICBOVUxMICE9IGJ1ZmZlciAmJgogICAgICAgICBudW1CeXRlcyA+IC0xKSB7CkBAIC02NTQsMTUgKzY1NCwxNSBAQAogfQogCiAjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKLW9mZjY0X3QgRndkTG9ja0VuZ2luZTo6b25Mc2VlayhpbnQgLyogdW5pcXVlSWQgKi8sIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCitvZmY2NF90IEZ3ZExvY2tFbmdpbmU6Om9uTHNlZWsoaW50IC8qIHVuaXF1ZUlkICovLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCwgaW50IHdoZW5jZSkgewogI2Vsc2UKLW9mZl90IEZ3ZExvY2tFbmdpbmU6Om9uTHNlZWsoaW50IC8qIHVuaXF1ZUlkICovLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorb2ZmX3QgRndkTG9ja0VuZ2luZTo6b25Mc2VlayhpbnQgLyogdW5pcXVlSWQgKi8sIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZfdCBvZmZzZXQsIGludCB3aGVuY2UpIHsKICNlbmRpZgogICAgIG9mZl90IG9mZnZhbCA9IC0xOwogCi0gICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSAmJiBkZWNvZGVTZXNzaW9uTWFwLmlzQ3JlYXRlZChkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpKSB7CisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSAmJiBkZWNvZGVTZXNzaW9uTWFwLmlzQ3JlYXRlZChkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpKSB7CiAgICAgICAgIERlY29kZVNlc3Npb24qIHNlc3Npb24gPSBkZWNvZGVTZXNzaW9uTWFwLmdldFZhbHVlKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CiAgICAgICAgIGlmIChOVUxMICE9IHNlc3Npb24gJiYgc2Vzc2lvbi0+ZmlsZURlc2MgPiAtMSkgewogICAgICAgICAgICAgb2ZmdmFsID0gRndkTG9ja0ZpbGVfbHNlZWsoc2Vzc2lvbi0+ZmlsZURlc2MsIG9mZnNldCwgd2hlbmNlKTsKQEAgLTY3NSwxMyArNjc1LDEzIEBACiAKICNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQogc3NpemVfdCBGd2RMb2NrRW5naW5lOjpvblByZWFkKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0KSB7CiAjZWxzZQogc3NpemVfdCBGd2RMb2NrRW5naW5lOjpvblByZWFkKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl90IG9mZnNldCkgewpAQCAtNjkwLDcgKzY5MCw3IEBACiAKICAgICBEZWNvZGVTZXNzaW9uKiBkZWNvZGVyU2Vzc2lvbiA9IE5VTEw7CiAKLSAgICBpZiAoKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSkgJiYKKyAgICBpZiAoKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgJiYKICAgICAgICAgKE5VTEwgIT0gKGRlY29kZXJTZXNzaW9uID0gZGVjb2RlU2Vzc2lvbk1hcC5nZXRWYWx1ZShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpKSkgJiYKICAgICAgICAgKE5VTEwgIT0gYnVmZmVyKSAmJgogICAgICAgICAobnVtQnl0ZXMgPiAtMSkgJiYKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9pbmNsdWRlL0RybVBhc3N0aHJ1UGx1Z0luLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvaW5jbHVkZS9Ecm1QYXNzdGhydVBsdWdJbi5oCmluZGV4IDdiNjZkYzcuLjRhYjUyNzIgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9pbmNsdWRlL0RybVBhc3N0aHJ1UGx1Z0luLmgKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L2luY2x1ZGUvRHJtUGFzc3RocnVQbHVnSW4uaApAQCAtNTMsMTAgKzUzLDExIEBACiAKICAgICBpbnQgb25DaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24pOwogCi0gICAgc3RhdHVzX3Qgb25Db25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKTsKKyAgICBzdGF0dXNfdCBvbkNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSk7CiAKICAgICBzdGF0dXNfdCBvblNldFBsYXliYWNrU3RhdHVzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKIAogICAgIGJvb2wgb25WYWxpZGF0ZUFjdGlvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbiwgY29uc3QgQWN0aW9uRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKTsKQEAgLTc0LDI2ICs3NSwyNSBAQAogICAgIERybVN1cHBvcnRJbmZvKiBvbkdldFN1cHBvcnRJbmZvKGludCB1bmlxdWVJZCk7CiAKICAgICBzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgpOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwKKyAgICAgICAgICAgIG9mZjY0X3QgbGVuZ3RoKTsKIAogICAgIHN0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBjb25zdCBjaGFyKiB1cmkpOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgY29uc3QgY2hhciogdXJpKTsKIAotICAgIHN0YXR1c190IG9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpOworICAgIHN0YXR1c190IG9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKTsKIAotICAgIHN0YXR1c190IG9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBzdGF0dXNfdCBvbkluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbyk7CiAKLSAgICBzdGF0dXNfdCBvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICBzdGF0dXNfdCBvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKTsKIAotICAgIHN0YXR1c190IG9uRmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKTsKKyAgICBzdGF0dXNfdCBvbkZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkKTsKIAotICAgIHNzaXplX3Qgb25QcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgc3NpemVfdCBvblByZWFkKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KTsKLQotcHJpdmF0ZToKLSAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb25JbXBsKCk7CiB9OwogCiB9OwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L3NyYy9Ecm1QYXNzdGhydVBsdWdJbi5jcHAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvc3JjL0RybVBhc3N0aHJ1UGx1Z0luLmNwcAppbmRleCBkN2YyZDI4Li4wZmEzNDc4IDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvc3JjL0RybVBhc3N0aHJ1UGx1Z0luLmNwcAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvc3JjL0RybVBhc3N0aHJ1UGx1Z0luLmNwcApAQCAtMTgzLDEzICsxODMsMTMgQEAKIH0KIAogc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uQ29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiAvKmRlY3J5cHRIYW5kbGUqLywgaW50IC8qYWN0aW9uKi8sIGJvb2wgLypyZXNlcnZlKi8pIHsKKyAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKmRlY3J5cHRIYW5kbGUqLywgaW50IC8qYWN0aW9uKi8sIGJvb2wgLypyZXNlcnZlKi8pIHsKICAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uQ29uc3VtZVJpZ2h0cygpIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIAogc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uU2V0UGxheWJhY2tTdGF0dXMoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogLypkZWNyeXB0SGFuZGxlKi8sIGludCAvKnBsYXliYWNrU3RhdHVzKi8sIGludDY0X3QgLypwb3NpdGlvbiovKSB7CisgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLypkZWNyeXB0SGFuZGxlKi8sIGludCAvKnBsYXliYWNrU3RhdHVzKi8sIGludDY0X3QgLypwb3NpdGlvbiovKSB7CiAgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblNldFBsYXliYWNrU3RhdHVzKCkgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQpAQCAtMjM2LDcgKzIzNiw4IEBACiB9CiAKIHN0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IC8qZmQqLywgb2ZmNjRfdCAvKm9mZnNldCovLCBvZmY2NF90IC8qbGVuZ3RoKi8pIHsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCAvKmZkKi8sIG9mZjY0X3QgLypvZmZzZXQqLywKKyAgICAgICAgICAgIG9mZjY0X3QgLypsZW5ndGgqLykgewogICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25PcGVuRGVjcnlwdFNlc3Npb24oKSA6ICVkIiwgdW5pcXVlSWQpOwogCiAjaWZkZWYgRU5BQkxFX1BBU1NUSFJVX0RFQ1JZUFRJT04KQEAgLTI0NiwzNiArMjQ3LDM4IEBACiAgICAgZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8gPSBOVUxMOwogICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiAjZWxzZQotICAgICh2b2lkKShkZWNyeXB0SGFuZGxlKTsgLy8gdW51c2VkCisgICAgKHZvaWQpKGRlY3J5cHRIYW5kbGUuZ2V0KCkpOyAvLyB1bnVzZWQKICNlbmRpZgogCiAgICAgcmV0dXJuIERSTV9FUlJPUl9DQU5OT1RfSEFORExFOwogfQogCiBzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25PcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICBpbnQgLyp1bmlxdWVJZCovLCBEZWNyeXB0SGFuZGxlKiAvKmRlY3J5cHRIYW5kbGUqLywgY29uc3QgY2hhciogLyp1cmkqLykgeworICAgICAgICAgICAgaW50IC8qdW5pcXVlSWQqLywgc3A8RGVjcnlwdEhhbmRsZT4mIC8qZGVjcnlwdEhhbmRsZSovLCBjb25zdCBjaGFyKiAvKnVyaSovKSB7CiAgICAgcmV0dXJuIERSTV9FUlJPUl9DQU5OT1RfSEFORExFOwogfQogCi1zdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25DbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgeworc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKSB7CiAgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkNsb3NlRGVjcnlwdFNlc3Npb24oKSA6ICVkIiwgdW5pcXVlSWQpOwotICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUpIHsKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSB7CiAgICAgICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvKSB7CiAgICAgICAgICAgICBkZWxldGUgZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm87IGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvID0gTlVMTDsKICAgICAgICAgfQotICAgICAgICBkZWxldGUgZGVjcnlwdEhhbmRsZTsgZGVjcnlwdEhhbmRsZSA9IE5VTEw7CisgICAgICAgIGRlY3J5cHRIYW5kbGUuY2xlYXIoKTsKICAgICB9CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogLypkZWNyeXB0SGFuZGxlKi8sCi0gICAgICAgICAgICBpbnQgLypkZWNyeXB0VW5pdElkKi8sIGNvbnN0IERybUJ1ZmZlciogLypoZWFkZXJJbmZvKi8pIHsKK3N0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbkluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsCisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKmRlY3J5cHRIYW5kbGUqLywKKyAgICAgICAgaW50IC8qZGVjcnlwdFVuaXRJZCovLCBjb25zdCBEcm1CdWZmZXIqIC8qaGVhZGVySW5mbyovKSB7CiAgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkluaXRpYWxpemVEZWNyeXB0VW5pdCgpIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uRGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIC8qZGVjcnlwdEhhbmRsZSovLAotICAgICAgICAgICAgaW50IC8qZGVjcnlwdFVuaXRJZCovLCBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIC8qSVYqLykgeworc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uRGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiAvKmRlY3J5cHRIYW5kbGUqLywKKyAgICAgICAgaW50IC8qZGVjcnlwdFVuaXRJZCovLCBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLAorICAgICAgICBEcm1CdWZmZXIqIC8qSVYqLykgewogICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25EZWNyeXB0KCkgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICAvKioKICAgICAgKiBBcyBhIHdvcmthcm91bmQgaW1wbGVtZW50YXRpb24gcGFzc3RocnUgd291bGQgY29weSB0aGUgZ2l2ZW4KQEAgLTI5NiwxMiArMjk5LDEyIEBACiB9CiAKIHN0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbkZpbmFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIC8qZGVjcnlwdEhhbmRsZSovLCBpbnQgLypkZWNyeXB0VW5pdElkKi8pIHsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIC8qZGVjcnlwdEhhbmRsZSovLCBpbnQgLypkZWNyeXB0VW5pdElkKi8pIHsKICAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uRmluYWxpemVEZWNyeXB0VW5pdCgpIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIAotc3NpemVfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25QcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIC8qZGVjcnlwdEhhbmRsZSovLAorc3NpemVfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25QcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiAvKmRlY3J5cHRIYW5kbGUqLywKICAgICAgICAgICAgIHZvaWQqIC8qYnVmZmVyKi8sIHNzaXplX3QgLypudW1CeXRlcyovLCBvZmY2NF90IC8qb2Zmc2V0Ki8pIHsKICAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uUHJlYWQoKSA6ICVkIiwgdW5pcXVlSWQpOwogICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAgYi9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icAppbmRleCA5MWQxZjdlLi4wMWVmYjIyIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icAorKysgYi9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icApAQCAtMjcsMTEgKzI3LDExIEBACiAgICAgICAgICJsaWJtZWRpYWRybW1ldHJpY3NfbGl0ZSIsCiAgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAogICAgICAgICAibGlibWVkaWF1dGlscyIsCi0gICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yIiwKICAgICAgICAgImxpYmhpZGxhbGxvY2F0b3J1dGlscyIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCiAgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKQEAgLTU5LDEzICs1OSwxMSBAQAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xIiwKLSAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAogICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKICAgICBjZmxhZ3M6IFsKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9Ecm1IYWwuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0RybUhhbC5jcHAKaW5kZXggY2YwODYxMC4uNjZjNTA5ZiAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0RybUhhbC5jcHAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL0RybUhhbC5jcHAKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAKLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvdHlwZXMuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWFuYWdlci8xLjAvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8aGlkbC9TZXJ2aWNlTWFuYWdlbWVudC5oPgogCkBAIC00MywxMiArNDMsMTMgQEAKIHVzaW5nIGRybTo6VjFfMDo6S2V5U3RhdHVzVHlwZTsKIHVzaW5nIGRybTo6VjFfMDo6S2V5VHlwZTsKIHVzaW5nIGRybTo6VjFfMDo6S2V5VmFsdWU7Ci11c2luZyBkcm06OlYxXzE6OkhkY3BMZXZlbDs7CiB1c2luZyBkcm06OlYxXzA6OlNlY3VyZVN0b3A7Ci11c2luZyBkcm06OlYxXzE6OlNlY3VyZVN0b3BSZWxlYXNlOwogdXNpbmcgZHJtOjpWMV8wOjpTZWN1cmVTdG9wSWQ7Ci11c2luZyBkcm06OlYxXzE6OlNlY3VyaXR5TGV2ZWw7CiB1c2luZyBkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIGRybTo6VjFfMTo6SGRjcExldmVsOwordXNpbmcgZHJtOjpWMV8xOjpTZWN1cmVTdG9wUmVsZWFzZTsKK3VzaW5nIGRybTo6VjFfMTo6U2VjdXJpdHlMZXZlbDsKK3VzaW5nIGRybTo6VjFfMjo6S2V5U2V0SWQ7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OkRybU1ldHJpY0dyb3VwOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwpAQCAtMTM5LDYgKzE0MCwxOCBAQAogICAgIH0KIH0KIAorc3RhdGljIERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSB0b09mZmxpbmVMaWNlbnNlU3RhdGUoCisgICAgICAgIE9mZmxpbmVMaWNlbnNlU3RhdGUgbGljZW5zZVN0YXRlKSB7CisgICAgc3dpdGNoKGxpY2Vuc2VTdGF0ZSkgeworICAgIGNhc2UgT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6VVNBQkxFOgorICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprT2ZmbGluZUxpY2Vuc2VTdGF0ZVVzYWJsZTsKKyAgICBjYXNlIE9mZmxpbmVMaWNlbnNlU3RhdGU6OklOQUNUSVZFOgorICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprT2ZmbGluZUxpY2Vuc2VTdGF0ZUluYWN0aXZlOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtPZmZsaW5lTGljZW5zZVN0YXRlVW5rbm93bjsKKyAgICB9Cit9CisKIHN0YXRpYyBEcm1QbHVnaW46OkhkY3BMZXZlbCB0b0hkY3BMZXZlbChIZGNwTGV2ZWwgbGV2ZWwpIHsKICAgICBzd2l0Y2gobGV2ZWwpIHsKICAgICBjYXNlIEhkY3BMZXZlbDo6SERDUF9OT05FOgpAQCAtMTk5LDYgKzIxMiwxNSBAQAogICAgIHJldHVybiBzZWN1cmVTdG9wSWRzOwogfQogCitzdGF0aWMgTGlzdDxWZWN0b3I8dWludDhfdD4+IHRvS2V5U2V0SWRzKGNvbnN0IGhpZGxfdmVjPEtleVNldElkPiYKKyAgICAgICAgaEtleVNldElkcykgeworICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiBrZXlTZXRJZHM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoS2V5U2V0SWRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGtleVNldElkcy5wdXNoX2JhY2sodG9WZWN0b3IoaEtleVNldElkc1tpXSkpOworICAgIH0KKyAgICByZXR1cm4ga2V5U2V0SWRzOworfQorCiBzdGF0aWMgc3RhdHVzX3QgdG9TdGF0dXNUKFN0YXR1cyBzdGF0dXMpIHsKICAgICBzd2l0Y2ggKHN0YXR1cykgewogICAgIGNhc2UgU3RhdHVzOjpPSzoKQEAgLTMwNSw2ICszMjcsNyBAQAogICAgIH0KICAgICBtUGx1Z2luLmNsZWFyKCk7CiAgICAgbVBsdWdpblYxXzEuY2xlYXIoKTsKKyAgICBtUGx1Z2luVjFfMi5jbGVhcigpOwogfQogCiBWZWN0b3I8c3A8SURybUZhY3Rvcnk+PiBEcm1IYWw6Om1ha2VEcm1GYWN0b3JpZXMoKSB7CkBAIC0zMTgsNyArMzQxLDYgQEAKICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZpbnN0YW5jZSA6IHJlZ2lzdGVyZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gZmFjdG9yeSA9IGRybTo6VjFfMDo6SURybUZhY3Rvcnk6OmdldFNlcnZpY2UoaW5zdGFuY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJmb3VuZCBkcm1AMS4wIElEcm1GYWN0b3J5ICVzIiwgaW5zdGFuY2UuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yaWVzLnB1c2hfYmFjayhmYWN0b3J5KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMzI5LDcgKzM1MSwxNiBAQAogICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmluc3RhbmNlIDogcmVnaXN0ZXJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBmYWN0b3J5ID0gZHJtOjpWMV8xOjpJRHJtRmFjdG9yeTo6Z2V0U2VydmljZShpbnN0YW5jZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoImZvdW5kIGRybUAxLjEgSURybUZhY3RvcnkgJXMiLCBpbnN0YW5jZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKGZhY3RvcnkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKTsKKyAgICAgICAgbWFuYWdlci0+bGlzdEJ5SW50ZXJmYWNlKGRybTo6VjFfMjo6SURybUZhY3Rvcnk6OmRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgWyZmYWN0b3JpZXNdKGNvbnN0IGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAmcmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmluc3RhbmNlIDogcmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBmYWN0b3J5ID0gZHJtOjpWMV8yOjpJRHJtRmFjdG9yeTo6Z2V0U2VydmljZShpbnN0YW5jZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yaWVzLnB1c2hfYmFjayhmYWN0b3J5KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNTIyLDExICs1NTMsMTQgQEAKICAgICAgICAgY29uc3QgU3RyaW5nOCYgYXBwUGFja2FnZU5hbWUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmFjdG9yaWVzLnNpemUoKTsgaSsrKSB7CisgICAgZm9yIChzaXplX3QgaSA9IG1GYWN0b3JpZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgaWYgKG1GYWN0b3JpZXNbaV0tPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpKSB7Ci0gICAgICAgICAgICBtUGx1Z2luID0gbWFrZURybVBsdWdpbihtRmFjdG9yaWVzW2ldLCB1dWlkLCBhcHBQYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICBpZiAobVBsdWdpbiAhPSBOVUxMKSB7CisgICAgICAgICAgICBhdXRvIHBsdWdpbiA9IG1ha2VEcm1QbHVnaW4obUZhY3Rvcmllc1tpXSwgdXVpZCwgYXBwUGFja2FnZU5hbWUpOworICAgICAgICAgICAgaWYgKHBsdWdpbiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbVBsdWdpbiA9IHBsdWdpbjsKICAgICAgICAgICAgICAgICBtUGx1Z2luVjFfMSA9IGRybTo6VjFfMTo6SURybVBsdWdpbjo6Y2FzdEZyb20obVBsdWdpbik7CisgICAgICAgICAgICAgICAgbVBsdWdpblYxXzIgPSBkcm06OlYxXzI6OklEcm1QbHVnaW46OmNhc3RGcm9tKG1QbHVnaW4pOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNTM1LDYgKzU2OSw5IEBACiAgICAgICAgIG1Jbml0Q2hlY2sgPSBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICB9IGVsc2UgewogICAgICAgICBpZiAoIW1QbHVnaW4tPnNldExpc3RlbmVyKHRoaXMpLmlzT2soKSkgeworICAgICAgICAgICAgbVBsdWdpbiA9IE5VTEw7CisgICAgICAgICAgICBtUGx1Z2luVjFfMSA9IE5VTEw7CisgICAgICAgICAgICBtUGx1Z2luVjFfMiA9IE5VTEw7CiAgICAgICAgICAgICBtSW5pdENoZWNrID0gREVBRF9PQkpFQ1Q7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtSW5pdENoZWNrID0gT0s7CkBAIC0xMDY1LDYgKzExMDIsNzMgQEAKICAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKIH0KIAorc3RhdHVzX3QgRHJtSGFsOjpnZXRPZmZsaW5lTGljZW5zZUtleVNldElkcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4gJmtleVNldElkcykgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBpZiAobVBsdWdpblYxXzIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpblYxXzItPmdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKAorICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPEtleVNldElkPiYgaEtleVNldElkcykgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBrZXlTZXRJZHMgPSB0b0tleVNldElkcyhoS2V5U2V0SWRzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgKTsKKworICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWw6OnJlbW92ZU9mZmxpbmVMaWNlbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaWYgKG1QbHVnaW5WMV8yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW5WMV8yLT5yZW1vdmVPZmZsaW5lTGljZW5zZSh0b0hpZGxWZWMoa2V5U2V0SWQpKTsKKyAgICByZXR1cm4gc3RhdHVzLmlzT2soKSA/IHRvU3RhdHVzVChzdGF0dXMpIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0YXR1c190IERybUhhbDo6Z2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkLAorICAgICAgICBEcm1QbHVnaW46Ok9mZmxpbmVMaWNlbnNlU3RhdGUgKmxpY2Vuc2VTdGF0ZSkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBpZiAobVBsdWdpblYxXzIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorICAgICpsaWNlbnNlU3RhdGUgPSBEcm1QbHVnaW46OmtPZmZsaW5lTGljZW5zZVN0YXRlVW5rbm93bjsKKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRPZmZsaW5lTGljZW5zZVN0YXRlKHRvSGlkbFZlYyhrZXlTZXRJZCksCisgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgT2ZmbGluZUxpY2Vuc2VTdGF0ZSBoTGljZW5zZVN0YXRlKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpsaWNlbnNlU3RhdGUgPSB0b09mZmxpbmVMaWNlbnNlU3RhdGUoaExpY2Vuc2VTdGF0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgfQorICAgICk7CisKKyAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK30KKwogc3RhdHVzX3QgRHJtSGFsOjpnZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4ICZ2YWx1ZSApIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIHJldHVybiBnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKG5hbWUsIHZhbHVlKTsKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9JRHJtLmNwcCBiL2RybS9saWJtZWRpYWRybS9JRHJtLmNwcAppbmRleCA1MDk5NjFmLi44YzI2MzE3IDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vSURybS5jcHAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL0lEcm0uY3BwCkBAIC02MSw3ICs2MSwxMCBAQAogICAgIEdFVF9OVU1CRVJfT0ZfU0VTU0lPTlMsCiAgICAgR0VUX1NFQ1VSSVRZX0xFVkVMLAogICAgIFJFTU9WRV9TRUNVUkVfU1RPUCwKLSAgICBHRVRfU0VDVVJFX1NUT1BfSURTCisgICAgR0VUX1NFQ1VSRV9TVE9QX0lEUywKKyAgICBHRVRfT0ZGTElORV9MSUNFTlNFX0tFWVNFVF9JRFMsCisgICAgUkVNT1ZFX09GRkxJTkVfTElDRU5TRSwKKyAgICBHRVRfT0ZGTElORV9MSUNFTlNFX1NUQVRFCiB9OwogCiBzdHJ1Y3QgQnBEcm0gOiBwdWJsaWMgQnBJbnRlcmZhY2U8SURybT4gewpAQCAtMzc2LDYgKzM3OSw1MiBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPZmZsaW5lTGljZW5zZUtleVNldElkcyhMaXN0PFZlY3Rvcjx1aW50OF90PiA+ICZrZXlTZXRJZHMpIGNvbnN0IHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX09GRkxJTkVfTElDRU5TRV9LRVlTRVRfSURTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisKKyAgICAgICAga2V5U2V0SWRzLmNsZWFyKCk7CisgICAgICAgIHVpbnQzMl90IGNvdW50ID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGtleVNldElkOworICAgICAgICAgICAgcmVhZFZlY3RvcihyZXBseSwga2V5U2V0SWQpOworICAgICAgICAgICAga2V5U2V0SWRzLnB1c2hfYmFjayhrZXlTZXRJZCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlT2ZmbGluZUxpY2Vuc2UoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCkgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIHdyaXRlVmVjdG9yKGRhdGEsIGtleVNldElkKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFJFTU9WRV9PRkZMSU5FX0xJQ0VOU0UsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkLAorICAgICAgICAgICAgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlICpsaWNlbnNlU3RhdGUpIGNvbnN0IHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICB3cml0ZVZlY3RvcihkYXRhLCBrZXlTZXRJZCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfT0ZGTElORV9MSUNFTlNFX1NUQVRFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICAqbGljZW5zZVN0YXRlID0gRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlOjprT2ZmbGluZUxpY2Vuc2VTdGF0ZVVua25vd247CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgICpsaWNlbnNlU3RhdGUgPSBzdGF0aWNfY2FzdDxEcm1QbHVnaW46Ok9mZmxpbmVMaWNlbnNlU3RhdGU+KHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUpIGNvbnN0IHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKQEAgLTk4MCw2ICsxMDI5LDQ1IEBACiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIEdFVF9PRkZMSU5FX0xJQ0VOU0VfS0VZU0VUX0lEUzoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm0sIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4ga2V5U2V0SWRzOworICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gZ2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoa2V5U2V0SWRzKTsKKyAgICAgICAgICAgIHNpemVfdCBjb3VudCA9IGtleVNldElkcy5zaXplKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihjb3VudCk7CisgICAgICAgICAgICBMaXN0PFZlY3Rvcjx1aW50OF90PiA+OjppdGVyYXRvciBpdGVyID0ga2V5U2V0SWRzLmJlZ2luKCk7CisgICAgICAgICAgICB3aGlsZShpdGVyICE9IGtleVNldElkcy5lbmQoKSkgeworICAgICAgICAgICAgICAgIHNpemVfdCBzaXplID0gaXRlci0+c2l6ZSgpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNpemUpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShpdGVyLT5hcnJheSgpLCBpdGVyLT5zaXplKCkpOworICAgICAgICAgICAgICAgIGl0ZXIrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFJFTU9WRV9PRkZMSU5FX0xJQ0VOU0U6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4ga2V5U2V0SWQ7CisgICAgICAgICAgICByZWFkVmVjdG9yKGRhdGEsIGtleVNldElkKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlbW92ZU9mZmxpbmVMaWNlbnNlKGtleVNldElkKSk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEdFVF9PRkZMSU5FX0xJQ0VOU0VfU1RBVEU6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4ga2V5U2V0SWQ7CisgICAgICAgICAgICByZWFkVmVjdG9yKGRhdGEsIGtleVNldElkKTsKKyAgICAgICAgICAgIERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSBzdGF0ZTsKKyAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IGdldE9mZmxpbmVMaWNlbnNlU3RhdGUoa2V5U2V0SWQsICZzdGF0ZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxEcm1QbHVnaW46Ok9mZmxpbmVMaWNlbnNlU3RhdGU+KHN0YXRlKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBHRVRfUFJPUEVSVFlfU1RSSU5HOgogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybSwgZGF0YSwgcmVwbHkpOwpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0FuZHJvaWQuYnAgYi9kcm0vbGlibWVkaWFkcm0vdGVzdHMvQW5kcm9pZC5icAppbmRleCA3NjI4OTY4Li45ZTAxMTVlIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vdGVzdHMvQW5kcm9pZC5icAorKysgYi9kcm0vbGlibWVkaWFkcm0vdGVzdHMvQW5kcm9pZC5icApAQCAtMTcsNiArMTcsNyBAQAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wIiwKICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEiLAorICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMiIsCiAgICAgICAibGliYmluZGVyIiwKICAgICAgICJsaWJoaWRsYmFzZSIsCiAgICAgICAibGlibG9nIiwKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9VdGlscy5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vVXRpbHMuY3BwCmluZGV4IDkzYzY0M2IuLmQ0OGIwYTggMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9VdGlscy5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL1V0aWxzLmNwcApAQCAtMjcsNCArMjcsMTggQEAKICAgICByZXR1cm4gbWVtY21wKCh2b2lkICopbGhzLmFycmF5KCksICh2b2lkICopcmhzLmFycmF5KCksIHJocy5zaXplKCkpIDwgMDsKIH0KIAorc3RkOjpzdHJpbmcgQnl0ZUFycmF5VG9IZXhTdHJpbmcoY29uc3QgdWludDhfdCogaW5fYnVmZmVyLCBzaXplX3QgbGVuZ3RoKSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga0hleENoYXJzW10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7CisKKyAgICAvLyBFYWNoIGlucHV0IGJ5dGUgY3JlYXRlcyB0d28gb3V0cHV0IGhleCBjaGFyYWN0ZXJzLgorICAgIHN0ZDo6c3RyaW5nIG91dF9idWZmZXIobGVuZ3RoICogMiwgJ1wwJyk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICAgIGNoYXIgYnl0ZSA9IGluX2J1ZmZlcltpXTsKKyAgICAgICAgb3V0X2J1ZmZlclsoaSAqIDIpXSA9IGtIZXhDaGFyc1soYnl0ZSA+PiA0KSAmIDB4Zl07CisgICAgICAgIG91dF9idWZmZXJbKGkgKiAyKSArIDFdID0ga0hleENoYXJzW2J5dGUgJiAweGZdOworICAgIH0KKyAgICByZXR1cm4gb3V0X2J1ZmZlcjsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvVXRpbHMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL1V0aWxzLmgKaW5kZXggMjU0MzEyNC4uYWE1NzFjMCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvVXRpbHMuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9VdGlscy5oCkBAIC0xNywxNCArMTcsMTYgQEAKICNpZm5kZWYgQ0xFQVJLRVlfVVRJTFNfSF8KICNkZWZpbmUgQ0xFQVJLRVlfVVRJTFNfSF8KIAorI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAorbmFtZXNwYWNlIGFuZHJvaWQgewogLy8gQWRkIGEgY29tcGFyaXNvbiBvcGVyYXRvciBmb3IgdGhpcyBWZWN0b3Igc3BlY2lhbGl6YXRpb24gc28gdGhhdCBpdCBjYW4gYmUKIC8vIHVzZWQgYXMgYSBrZXkgaW4gYSBLZXllZFZlY3Rvci4KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQogYm9vbCBvcGVyYXRvcjwoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZsaHMsIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmcmhzKTsKIAorc3RkOjpzdHJpbmcgQnl0ZUFycmF5VG9IZXhTdHJpbmcoY29uc3QgdWludDhfdCogaW5fYnVmZmVyLCBzaXplX3QgbGVuZ3RoKTsKKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCk7CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0Flc0N0ckRlY3J5cHRvci5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0Flc0N0ckRlY3J5cHRvci5jcHAKaW5kZXggMmZjZTA3OTAuLjBhYzg3OWMgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQWVzQ3RyRGVjcnlwdG9yLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0Flc0N0ckRlY3J5cHRvci5jcHAKQEAgLTI2LDcgKzI2LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3ViU2FtcGxlOwpAQCAtNzksNyArNzksNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BbmRyb2lkLmJwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BbmRyb2lkLmJwCmluZGV4IDM0MWQ0ZjYuLmI0NGE2YzcgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQW5kcm9pZC5icAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0FuZHJvaWQuYnAKQEAgLTE1LDcgKzE1LDcgQEAKIC8vCiAKIGNjX2JpbmFyeSB7Ci0gICAgbmFtZTogImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS1zZXJ2aWNlLmNsZWFya2V5IiwKKyAgICBuYW1lOiAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UuY2xlYXJrZXkiLAogICAgIHZlbmRvcjogdHJ1ZSwKIAogICAgIHNyY3M6IFsKQEAgLTI1LDEwICsyNSwxMiBAQAogICAgICAgICAiQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcCIsCiAgICAgICAgICJDcnlwdG9GYWN0b3J5LmNwcCIsCiAgICAgICAgICJDcnlwdG9QbHVnaW4uY3BwIiwKKyAgICAgICAgIkRldmljZUZpbGVzLmNwcCIsCiAgICAgICAgICJEcm1GYWN0b3J5LmNwcCIsCiAgICAgICAgICJEcm1QbHVnaW4uY3BwIiwKICAgICAgICAgIkluaXREYXRhUGFyc2VyLmNwcCIsCiAgICAgICAgICJKc29uV2ViS2V5LmNwcCIsCisgICAgICAgICJNZW1vcnlGaWxlU3lzdGVtLmNwcCIsCiAgICAgICAgICJTZXNzaW9uLmNwcCIsCiAgICAgICAgICJTZXNzaW9uTGlicmFyeS5jcHAiLAogICAgICAgICAic2VydmljZS5jcHAiLApAQCAtMzcsMTEgKzM5LDEyIEBACiAgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiaHciLAogCiAgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKLSAgICBpbml0X3JjOiBbImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS1zZXJ2aWNlLmNsZWFya2V5LnJjIl0sCisgICAgaW5pdF9yYzogWyJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS5jbGVhcmtleS5yYyJdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yIiwKICAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmNyeXB0byIsCkBAIC00OSwxMSArNTIsMTMgQEAKICAgICAgICAgImxpYmhpZGxtZW1vcnkiLAogICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCiAgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGliY2xlYXJrZXljb21tb24iLAorICAgICAgICAibGliY2xlYXJrZXlkZXZpY2VmaWxlcy1wcm90b3MiLAogICAgICAgICAibGlianNtbiIsCiAgICAgXSwKIApAQCAtNjUsNCArNzAsMTMgQEAKICAgICAgICAgaW50ZWdlcl9vdmVyZmxvdzogdHJ1ZSwKICAgICB9LAogfQorY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJjbGVhcmtleWRldmljZWZpbGVzLXByb3RvcyIsCisgICAgdmVuZG9yOiB0cnVlLAogCisgICAgcHJvdG86IHsKKyAgICAgICAgZXhwb3J0X3Byb3RvX2hlYWRlcnM6IHRydWUsCisgICAgICAgIHR5cGU6ICJsaXRlIiwKKyAgICB9LAorICAgIHNyY3M6IFsicHJvdG9zL0RldmljZUZpbGVzLnByb3RvIl0sCit9CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0Jhc2U2NC5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0Jhc2U2NC5jcHAKaW5kZXggYzJlZDc1MS4uNjU3YTQyZiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9CYXNlNjQuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQmFzZTY0LmNwcApAQCAtMjEsNyArMjEsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogc3A8QnVmZmVyPiBkZWNvZGVCYXNlNjQoY29uc3Qgc3RkOjpzdHJpbmcgJnMpIHsKQEAgLTE2OSw3ICsxNjksNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9CdWZmZXIuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9CdWZmZXIuY3BwCmluZGV4IGU1OGY1OGEuLjc1ZjgzOTUgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQnVmZmVyLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0J1ZmZlci5jcHAKQEAgLTIxLDcgKzIxLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIEJ1ZmZlcjo6QnVmZmVyKHNpemVfdCBjYXBhY2l0eSkKQEAgLTQ3LDcgKzQ3LDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcAppbmRleCAxYmE1YzZhLi4xNDEwZDc3IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuY3BwCkBAIC0yMiw3ICsyMiw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiBleHRlcm4gIkMiIHsKQEAgLTM4LDcgKzM4LDcgQEAKIH0gLy8gZXh0ZXJuICJDIgogCiB9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gIC8vIG5hbWVzcGFjZSBWMV8xCit9ICAvLyBuYW1lc3BhY2UgVjFfMgogfSAgLy8gbmFtZXNwYWNlIGRybQogfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcnlwdG9GYWN0b3J5LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3J5cHRvRmFjdG9yeS5jcHAKaW5kZXggMDg0OGNlZi4uMmE0OGRiNiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcnlwdG9GYWN0b3J5LmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyeXB0b0ZhY3RvcnkuY3BwCkBAIC0yNyw3ICsyNyw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiBSZXR1cm48Ym9vbD4gQ3J5cHRvRmFjdG9yeTo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoCkBAIC02MCw3ICs2MCw3IEBACiB9CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyeXB0b1BsdWdpbi5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyeXB0b1BsdWdpbi5jcHAKaW5kZXggZjMzZjk0ZS4uYTQ4OGY4NiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcnlwdG9QbHVnaW4uY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3J5cHRvUGx1Z2luLmNwcApAQCAtMjcsNyArMjcsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpCdWZmZXJUeXBlOwpAQCAtMTc5LDcgKzE3OSw3IEBACiB9CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RldmljZUZpbGVzLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRGV2aWNlRmlsZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MTViNmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RldmljZUZpbGVzLmNwcApAQCAtMCwwICsxLDI1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBmaWxlIGFuZCBwcm9wcmlldGFyeQorLy8gc291cmNlIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFdpZGV2aW5lIE1hc3RlcgorLy8gTGljZW5zZSBBZ3JlZW1lbnQuCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSAiRGV2aWNlRmlsZXMuaCIKKyNpbmNsdWRlICJVdGlscy5oIgorCisjaW5jbHVkZSA8b3BlbnNzbC9zaGEuaD4KKworLy8gUHJvdG9idWYgZ2VuZXJhdGVkIGNsYXNzZXMuCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpjbGVhcmtleTo6T2ZmbGluZUZpbGU7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpjbGVhcmtleTo6SGFzaGVkRmlsZTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OmNsZWFya2V5OjpMaWNlbnNlOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6Y2xlYXJrZXk6OkxpY2Vuc2VfTGljZW5zZVN0YXRlX0FDVElWRTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OmNsZWFya2V5OjpMaWNlbnNlX0xpY2Vuc2VTdGF0ZV9SRUxFQVNJTkc7CisKK25hbWVzcGFjZSB7Citjb25zdCBjaGFyIGtMaWNlbnNlRmlsZU5hbWVFeHRbXSA9ICIubGljIjsKKworYm9vbCBIYXNoKGNvbnN0IHN0ZDo6c3RyaW5nJiBkYXRhLCBzdGQ6OnN0cmluZyogaGFzaCkgeworICAgIGlmICghaGFzaCkgcmV0dXJuIGZhbHNlOworCisgICAgaGFzaC0+cmVzaXplKFNIQTI1Nl9ESUdFU1RfTEVOR1RIKTsKKworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGlucHV0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oZGF0YS5kYXRhKCkpOworICAgIHVuc2lnbmVkIGNoYXIqIG91dHB1dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KCYoKmhhc2gpWzBdKTsKKyAgICBTSEEyNTYoaW5wdXQsIGRhdGEuc2l6ZSgpLCBvdXRwdXQpOworICAgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBkcm0geworbmFtZXNwYWNlIFYxXzIgeworbmFtZXNwYWNlIGNsZWFya2V5IHsKKworYm9vbCBEZXZpY2VGaWxlczo6U3RvcmVMaWNlbnNlKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQsIExpY2Vuc2VTdGF0ZSBzdGF0ZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxpY2Vuc2VSZXNwb25zZSkgeworCisgICAgT2ZmbGluZUZpbGUgZmlsZTsKKyAgICBmaWxlLnNldF90eXBlKE9mZmxpbmVGaWxlOjpMSUNFTlNFKTsKKyAgICBmaWxlLnNldF92ZXJzaW9uKE9mZmxpbmVGaWxlOjpWRVJTSU9OXzEpOworCisgICAgTGljZW5zZSogbGljZW5zZSA9IGZpbGUubXV0YWJsZV9saWNlbnNlKCk7CisgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICBjYXNlIGtMaWNlbnNlU3RhdGVBY3RpdmU6CisgICAgICAgICAgICBsaWNlbnNlLT5zZXRfc3RhdGUoTGljZW5zZV9MaWNlbnNlU3RhdGVfQUNUSVZFKTsKKyAgICAgICAgICAgIGxpY2Vuc2UtPnNldF9saWNlbnNlKGxpY2Vuc2VSZXNwb25zZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrTGljZW5zZVN0YXRlUmVsZWFzaW5nOgorICAgICAgICAgICAgbGljZW5zZS0+c2V0X3N0YXRlKExpY2Vuc2VfTGljZW5zZVN0YXRlX1JFTEVBU0lORyk7CisgICAgICAgICAgICBsaWNlbnNlLT5zZXRfbGljZW5zZShsaWNlbnNlUmVzcG9uc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HVygiU3RvcmVMaWNlbnNlOiBVbmtub3duIGxpY2Vuc2Ugc3RhdGU6ICV1Iiwgc3RhdGUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWRGaWxlOworICAgIGZpbGUuU2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbGl6ZWRGaWxlKTsKKworICAgIHJldHVybiBTdG9yZUZpbGVXaXRoSGFzaChrZXlTZXRJZCArIGtMaWNlbnNlRmlsZU5hbWVFeHQsIHNlcmlhbGl6ZWRGaWxlKTsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6U3RvcmVGaWxlV2l0aEhhc2goY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2VyaWFsaXplZEZpbGUpIHsKKyAgICBzdGQ6OnN0cmluZyBoYXNoOworICAgIGlmICghSGFzaChzZXJpYWxpemVkRmlsZSwgJmhhc2gpKSB7CisgICAgICAgIEFMT0dFKCJTdG9yZUZpbGVXaXRoSGFzaDogRmFpbGVkIHRvIGNvbXB1dGUgaGFzaCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgSGFzaGVkRmlsZSBoYXNoRmlsZTsKKyAgICBoYXNoRmlsZS5zZXRfZmlsZShzZXJpYWxpemVkRmlsZSk7CisgICAgaGFzaEZpbGUuc2V0X2hhc2goaGFzaCk7CisKKyAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkSGFzaEZpbGU7CisgICAgaGFzaEZpbGUuU2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbGl6ZWRIYXNoRmlsZSk7CisKKyAgICByZXR1cm4gU3RvcmVGaWxlUmF3KGZpbGVOYW1lLCBzZXJpYWxpemVkSGFzaEZpbGUpOworfQorCitib29sIERldmljZUZpbGVzOjpTdG9yZUZpbGVSYXcoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VyaWFsaXplZEhhc2hGaWxlKSB7CisgICAgTWVtb3J5RmlsZVN5c3RlbTo6TWVtb3J5RmlsZSBtZW1GaWxlOworICAgIG1lbUZpbGUuc2V0RmlsZU5hbWUoZmlsZU5hbWUpOworICAgIG1lbUZpbGUuc2V0Q29udGVudChzZXJpYWxpemVkSGFzaEZpbGUpOworICAgIG1lbUZpbGUuc2V0RmlsZVNpemUoc2VyaWFsaXplZEhhc2hGaWxlLnNpemUoKSk7CisgICAgc2l6ZV90IGxlbiA9IG1GaWxlSGFuZGxlLldyaXRlKGZpbGVOYW1lLCBtZW1GaWxlKTsKKworICAgIGlmIChsZW4gIT0gc3RhdGljX2Nhc3Q8c2l6ZV90PihzZXJpYWxpemVkSGFzaEZpbGUuc2l6ZSgpKSkgeworICAgICAgICBBTE9HRSgiU3RvcmVGaWxlUmF3OiBGYWlsZWQgdG8gd3JpdGUgJXMiLCBmaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgQUxPR0QoIlN0b3JlRmlsZVJhdzogZXhwZWN0ZWQ9JXpkLCBhY3R1YWw9JXp1Iiwgc2VyaWFsaXplZEhhc2hGaWxlLnNpemUoKSwgbGVuKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEFMT0dEKCJTdG9yZUZpbGVSYXc6IHdyb3RlICV6dSBieXRlcyB0byAlcyIsIHNlcmlhbGl6ZWRIYXNoRmlsZS5zaXplKCksIGZpbGVOYW1lLmNfc3RyKCkpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIERldmljZUZpbGVzOjpSZXRyaWV2ZUxpY2Vuc2UoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleVNldElkLCBMaWNlbnNlU3RhdGUqIHN0YXRlLCBzdGQ6OnN0cmluZyogb2ZmbGluZUxpY2Vuc2UpIHsKKworICAgIE9mZmxpbmVGaWxlIGZpbGU7CisgICAgaWYgKCFSZXRyaWV2ZUhhc2hlZEZpbGUoa2V5U2V0SWQgKyBrTGljZW5zZUZpbGVOYW1lRXh0LCAmZmlsZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChmaWxlLnR5cGUoKSAhPSBPZmZsaW5lRmlsZTo6TElDRU5TRSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVMaWNlbnNlOiBJbnZhbGlkIGZpbGUgdHlwZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGZpbGUudmVyc2lvbigpICE9IE9mZmxpbmVGaWxlOjpWRVJTSU9OXzEpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlTGljZW5zZTogSW52YWxpZCBmaWxlIHZlcnNpb24iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghZmlsZS5oYXNfbGljZW5zZSgpKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUxpY2Vuc2U6IExpY2Vuc2Ugbm90IHByZXNlbnQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIExpY2Vuc2UgbGljZW5zZSA9IGZpbGUubGljZW5zZSgpOworICAgIHN3aXRjaCAobGljZW5zZS5zdGF0ZSgpKSB7CisgICAgICAgIGNhc2UgTGljZW5zZV9MaWNlbnNlU3RhdGVfQUNUSVZFOgorICAgICAgICAgICAgKnN0YXRlID0ga0xpY2Vuc2VTdGF0ZUFjdGl2ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExpY2Vuc2VfTGljZW5zZVN0YXRlX1JFTEVBU0lORzoKKyAgICAgICAgICAgICpzdGF0ZSA9IGtMaWNlbnNlU3RhdGVSZWxlYXNpbmc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJSZXRyaWV2ZUxpY2Vuc2U6IFVucmVjb2duaXplZCBsaWNlbnNlIHN0YXRlOiAldSIsCisgICAgICAgICAgICAgICAgICAgIGtMaWNlbnNlU3RhdGVVbmtub3duKTsKKyAgICAgICAgICAgICpzdGF0ZSA9IGtMaWNlbnNlU3RhdGVVbmtub3duOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgICpvZmZsaW5lTGljZW5zZSA9IGxpY2Vuc2UubGljZW5zZSgpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIERldmljZUZpbGVzOjpEZWxldGVMaWNlbnNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlTZXRJZCkgeworICAgIHJldHVybiBtRmlsZUhhbmRsZS5SZW1vdmVGaWxlKGtleVNldElkICsga0xpY2Vuc2VGaWxlTmFtZUV4dCk7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OkRlbGV0ZUFsbExpY2Vuc2VzKCkgeworICAgIHJldHVybiBtRmlsZUhhbmRsZS5SZW1vdmVBbGxGaWxlcygpOworfQorCitib29sIERldmljZUZpbGVzOjpMaWNlbnNlRXhpc3RzKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlTZXRJZCkgeworICAgIHJldHVybiBtRmlsZUhhbmRsZS5GaWxlRXhpc3RzKGtleVNldElkICsga0xpY2Vuc2VGaWxlTmFtZUV4dCk7Cit9CisKK3N0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBEZXZpY2VGaWxlczo6TGlzdExpY2Vuc2VzKCkgY29uc3QgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBsaWNlbnNlcyA9IG1GaWxlSGFuZGxlLkxpc3RGaWxlcygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGljZW5zZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3RkOjpzdHJpbmcmIGxpY2Vuc2UgPSBsaWNlbnNlc1tpXTsKKyAgICAgICAgbGljZW5zZSA9IGxpY2Vuc2Uuc3Vic3RyKDAsIGxpY2Vuc2Uuc2l6ZSgpIC0gc3RybGVuKGtMaWNlbnNlRmlsZU5hbWVFeHQpKTsKKyAgICB9CisgICAgcmV0dXJuIGxpY2Vuc2VzOworfQorCitib29sIERldmljZUZpbGVzOjpSZXRyaWV2ZUhhc2hlZEZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lLCBPZmZsaW5lRmlsZSogZGVTZXJpYWxpemVkRmlsZSkgeworICAgIGlmICghZGVTZXJpYWxpemVkRmlsZSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiBpbnZhbGlkIGZpbGUgcGFyYW1ldGVyIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIUZpbGVFeGlzdHMoZmlsZU5hbWUpKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUhhc2hlZEZpbGU6ICVzIGRvZXMgbm90IGV4aXN0IiwgZmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzc2l6ZV90IGJ5dGVzID0gR2V0RmlsZVNpemUoZmlsZU5hbWUpOworICAgIGlmIChieXRlcyA8PSAwKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IGludmFsaWQgZmlsZSBzaXplOiAlcyIsIGZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICAvLyBSZW1vdmUgdGhlIGNvcnJ1cHRlZCBmaWxlIHNvIHRoZSBjYWxsZXIgd2lsbCBub3QgZ2V0IHRoZSBzYW1lIGVycm9yCisgICAgICAgIC8vIHdoZW4gdHJ5aW5nIHRvIGFjY2VzcyB0aGUgZmlsZSByZXBlYXRlZGx5LCBjYXVzaW5nIHRoZSBzeXN0ZW0gdG8gc3RhbGwuCisgICAgICAgIFJlbW92ZUZpbGUoZmlsZU5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZEhhc2hGaWxlOworICAgIHNlcmlhbGl6ZWRIYXNoRmlsZS5yZXNpemUoYnl0ZXMpOworICAgIGJ5dGVzID0gbUZpbGVIYW5kbGUuUmVhZChmaWxlTmFtZSwgJnNlcmlhbGl6ZWRIYXNoRmlsZSk7CisKKyAgICBpZiAoYnl0ZXMgIT0gc3RhdGljX2Nhc3Q8c3NpemVfdD4oc2VyaWFsaXplZEhhc2hGaWxlLnNpemUoKSkpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlSGFzaGVkRmlsZTogRmFpbGVkIHRvIHJlYWQgZnJvbSAlcyIsIGZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICBBTE9HVigiUmV0cmlldmVIYXNoZWRGaWxlOiBleHBlY3RlZDogJXpkLCBhY3R1YWw6ICV6ZCIsIHNlcmlhbGl6ZWRIYXNoRmlsZS5zaXplKCksIGJ5dGVzKTsKKyAgICAgICAgLy8gUmVtb3ZlIHRoZSBjb3JydXB0ZWQgZmlsZSBzbyB0aGUgY2FsbGVyIHdpbGwgbm90IGdldCB0aGUgc2FtZSBlcnJvcgorICAgICAgICAvLyB3aGVuIHRyeWluZyB0byBhY2Nlc3MgdGhlIGZpbGUgcmVwZWF0ZWRseSwgY2F1c2luZyB0aGUgc3lzdGVtIHRvIHN0YWxsLgorICAgICAgICBSZW1vdmVGaWxlKGZpbGVOYW1lKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEFMT0dWKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IHJlYWQgJXpkIGZyb20gJXMiLCBieXRlcywgZmlsZU5hbWUuY19zdHIoKSk7CisKKyAgICBIYXNoZWRGaWxlIGhhc2hGaWxlOworICAgIGlmICghaGFzaEZpbGUuUGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWRIYXNoRmlsZSkpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlSGFzaGVkRmlsZTogVW5hYmxlIHRvIHBhcnNlIGhhc2ggZmlsZSIpOworICAgICAgICAvLyBSZW1vdmUgY29ycnVwdCBmaWxlLgorICAgICAgICBSZW1vdmVGaWxlKGZpbGVOYW1lKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGhhc2g7CisgICAgaWYgKCFIYXNoKGhhc2hGaWxlLmZpbGUoKSwgJmhhc2gpKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IEhhc2ggY29tcHV0YXRpb24gZmFpbGVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoaGFzaCAhPSBoYXNoRmlsZS5oYXNoKCkpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlSGFzaGVkRmlsZTogSGFzaCBtaXNtYXRjaCIpOworICAgICAgICAvLyBSZW1vdmUgY29ycnVwdCBmaWxlLgorICAgICAgICBSZW1vdmVGaWxlKGZpbGVOYW1lKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghZGVTZXJpYWxpemVkRmlsZS0+UGFyc2VGcm9tU3RyaW5nKGhhc2hGaWxlLmZpbGUoKSkpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlSGFzaGVkRmlsZTogVW5hYmxlIHRvIHBhcnNlIGZpbGUiKTsKKyAgICAgICAgLy8gUmVtb3ZlIGNvcnJ1cHQgZmlsZS4KKyAgICAgICAgUmVtb3ZlRmlsZShmaWxlTmFtZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6RmlsZUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIGNvbnN0IHsKKyAgICByZXR1cm4gbUZpbGVIYW5kbGUuRmlsZUV4aXN0cyhmaWxlTmFtZSk7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OlJlbW92ZUZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSB7CisgICAgcmV0dXJuIG1GaWxlSGFuZGxlLlJlbW92ZUZpbGUoZmlsZU5hbWUpOworfQorCitzc2l6ZV90IERldmljZUZpbGVzOjpHZXRGaWxlU2l6ZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIGNvbnN0IHsKKyAgICByZXR1cm4gbUZpbGVIYW5kbGUuR2V0RmlsZVNpemUoZmlsZU5hbWUpOworfQorCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAvLyBuYW1lc3BhY2UgVjFfMgorfSAvLyBuYW1lc3BhY2UgZHJtCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1GYWN0b3J5LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtRmFjdG9yeS5jcHAKaW5kZXggNzc1NTdmOS4uOWQwNDBhOCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1GYWN0b3J5LmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RybUZhY3RvcnkuY3BwCkBAIC0zMCw3ICszMCw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN0YXR1czsKQEAgLTcxLDcgKzcxLDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtUGx1Z2luLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtUGx1Z2luLmNwcAppbmRleCBkNTFlMjlkLi43MTg0YjUzIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RybVBsdWdpbi5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1QbHVnaW4uY3BwCkBAIC0yNSwxMSArMjUsMTUgQEAKICNpbmNsdWRlICJDbGVhcktleURybVByb3BlcnRpZXMuaCIKICNpbmNsdWRlICJTZXNzaW9uLmgiCiAjaW5jbHVkZSAiVHlwZUNvbnZlcnQuaCIKKyNpbmNsdWRlICJVdGlscy5oIgogCiBuYW1lc3BhY2UgeworY29uc3Qgc3RkOjpzdHJpbmcga0tleVNldElkUHJlZml4KCJja2lkIik7Citjb25zdCBpbnQga0tleVNldElkTGVuZ3RoID0gMTY7CiBjb25zdCBpbnQga1NlY3VyZVN0b3BJZFN0YXJ0ID0gMTAwOworY29uc3Qgc3RkOjpzdHJpbmcga09mZmxpbmVMaWNlbnNlKCJcInR5cGVcIjpcInBlcnNpc3RlbnQtbGljZW5zZVwiIik7CiBjb25zdCBzdGQ6OnN0cmluZyBrU3RyZWFtaW5nKCJTdHJlYW1pbmciKTsKLWNvbnN0IHN0ZDo6c3RyaW5nIGtPZmZsaW5lKCJPZmZsaW5lIik7Citjb25zdCBzdGQ6OnN0cmluZyBrVGVtcG9yYXJ5TGljZW5zZSgiXCJ0eXBlXCI6XCJ0ZW1wb3JhcnlcIiIpOwogY29uc3Qgc3RkOjpzdHJpbmcga1RydWUoIlRydWUiKTsKIAogY29uc3Qgc3RkOjpzdHJpbmcga1F1ZXJ5S2V5TGljZW5zZVR5cGUoIkxpY2Vuc2VUeXBlIik7CkBAIC01NCw5ICs1OCwxMiBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpLZXlTZXRJZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZTsKKwogRHJtUGx1Z2luOjpEcm1QbHVnaW4oU2Vzc2lvbkxpYnJhcnkqIHNlc3Npb25MaWJyYXJ5KQogICAgICAgICA6IG1TZXNzaW9uTGlicmFyeShzZXNzaW9uTGlicmFyeSksCiAgICAgICAgICAgbU9wZW5TZXNzaW9uT2tDb3VudCgwKSwKQEAgLTY2LDYgKzczLDggQEAKICAgICBtUGxheVBvbGljeS5jbGVhcigpOwogICAgIGluaXRQcm9wZXJ0aWVzKCk7CiAgICAgbVNlY3VyZVN0b3BzLmNsZWFyKCk7CisgICAgbVJlbGVhc2VLZXlzTWFwLmNsZWFyKCk7CisgICAgc3RkOjpzcmFuZChzdGQ6OnRpbWUobnVsbHB0cikpOwogfQogCiB2b2lkIERybVBsdWdpbjo6aW5pdFByb3BlcnRpZXMoKSB7CkBAIC0xNDcsMjUgKzE1Niw2MSBAQAogICAgICAgICBzdGQ6OnN0cmluZyAqZGVmYXVsdFVybCkgewogICAgICAgICBVTlVTRUQob3B0aW9uYWxQYXJhbWV0ZXJzKTsKIAorICAgIC8vIEdldEtleVJlcXVlc3RPZmZsaW5lS2V5VHlwZU5vdFN1cHBvcnRlZCgpIGluIHZ0cyAxLjAgYW5kIDEuMSBleHBlY3RzCisgICAgLy8gS2V5VHlwZTo6T0ZGTElORSB0byByZXR1cm4gRVJST1JfRFJNX0NBTk5PVF9IQU5ETEUgaW4gY2xlYXJrZXkgcGx1Z2luLgorICAgIC8vIFRob3NlIHRlc3RzIHBhc3MgaW4gYW4gZW1wdHkgaW5pdERhdGEsIHdlIHVzZSB0aGUgZW1wdHkgaW5pdERhdGEgdG8KKyAgICAvLyBzaWduYWwgc3VjaCBzcGVjaWZpYyB1c2UgY2FzZS4KKyAgICBpZiAoa2V5VHlwZSA9PSBLZXlUeXBlOjpPRkZMSU5FICYmIDAgPT0gaW5pdERhdGEuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKwogICAgICpkZWZhdWx0VXJsID0gIiI7CiAgICAgKmtleVJlcXVlc3RUeXBlID0gS2V5UmVxdWVzdFR5cGU6OlVOS05PV047CiAgICAgKnJlcXVlc3QgPSBzdGQ6OnZlY3Rvcjx1aW50OF90PigpOwogCi0gICAgaWYgKHNjb3BlLnNpemUoKSA9PSAwKSB7CisgICAgaWYgKHNjb3BlLnNpemUoKSA9PSAwIHx8CisgICAgICAgICAgICAoa2V5VHlwZSAhPSBLZXlUeXBlOjpTVFJFQU1JTkcgJiYKKyAgICAgICAgICAgIGtleVR5cGUgIT0gS2V5VHlwZTo6T0ZGTElORSAmJgorICAgICAgICAgICAga2V5VHlwZSAhPSBLZXlUeXBlOjpSRUxFQVNFKSkgewogICAgICAgICByZXR1cm4gU3RhdHVzOjpCQURfVkFMVUU7CiAgICAgfQogCi0gICAgaWYgKGtleVR5cGUgIT0gS2V5VHlwZTo6U1RSRUFNSU5HKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNjb3BlSWQgPSB0b1ZlY3RvcihzY29wZSk7CisgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbjsKKyAgICBpZiAoa2V5VHlwZSA9PSBLZXlUeXBlOjpTVFJFQU1JTkcgfHwga2V5VHlwZSA9PSBLZXlUeXBlOjpPRkZMSU5FKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZChzY29wZUlkLmJlZ2luKCksIHNjb3BlSWQuZW5kKCkpOworICAgICAgICBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5maW5kU2Vzc2lvbihzZXNzaW9uSWQpOworICAgICAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgICAgIH0KKyAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gS2V5UmVxdWVzdFR5cGU6OklOSVRJQUw7CiAgICAgfQogCi0gICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24odG9WZWN0b3Ioc2NvcGUpKTsKLSAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKLSAgICB9CisgICAgU3RhdHVzIHN0YXR1cyA9IHNlc3Npb24tPmdldEtleVJlcXVlc3QoaW5pdERhdGEsIG1pbWVUeXBlLCBrZXlUeXBlLCByZXF1ZXN0KTsKIAotICAgIFN0YXR1cyBzdGF0dXMgPSBzZXNzaW9uLT5nZXRLZXlSZXF1ZXN0KGluaXREYXRhLCBtaW1lVHlwZSwgcmVxdWVzdCk7Ci0gICAgKmtleVJlcXVlc3RUeXBlID0gS2V5UmVxdWVzdFR5cGU6OklOSVRJQUw7CisgICAgaWYgKGtleVR5cGUgPT0gS2V5VHlwZTo6UkVMRUFTRSkgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlTZXRJZChzY29wZUlkLmJlZ2luKCksIHNjb3BlSWQuZW5kKCkpOworICAgICAgICBzdGQ6OnN0cmluZyByZXF1ZXN0U3RyaW5nKHJlcXVlc3QtPmJlZ2luKCksIHJlcXVlc3QtPmVuZCgpKTsKKyAgICAgICAgaWYgKHJlcXVlc3RTdHJpbmcuZmluZChrT2ZmbGluZUxpY2Vuc2UpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBlbXB0eVJlc3BvbnNlOworICAgICAgICAgICAgc3RkOjpzdHJpbmcga2V5U2V0SWRTdHJpbmcoa2V5U2V0SWQuYmVnaW4oKSwga2V5U2V0SWQuZW5kKCkpOworICAgICAgICAgICAgaWYgKCFtRmlsZUhhbmRsZS5TdG9yZUxpY2Vuc2Uoa2V5U2V0SWRTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgIERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlUmVsZWFzaW5nLAorICAgICAgICAgICAgICAgICAgICBlbXB0eVJlc3BvbnNlKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJQcm9ibGVtIHJlbGVhc2luZyBvZmZsaW5lIGxpY2Vuc2UiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fVU5LTk9XTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUmVsZWFzZUtleXNNYXAuZmluZChrZXlTZXRJZFN0cmluZykgPT0gbVJlbGVhc2VLZXlzTWFwLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+Y3JlYXRlU2Vzc2lvbigpOworICAgICAgICAgICAgICAgIG1SZWxlYXNlS2V5c01hcFtrZXlTZXRJZFN0cmluZ10gPSBzZXNzaW9uLT5zZXNzaW9uSWQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0koImtleSBpcyBpbiB1c2UsIGlnbm9yZSByZWxlYXNlIHJlcXVlc3QiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJPZmZsaW5lIGxpY2Vuc2Ugbm90IGZvdW5kLCBub3RoaW5nIHRvIHJlbGVhc2UiKTsKKyAgICAgICAgfQorICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBLZXlSZXF1ZXN0VHlwZTo6UkVMRUFTRTsKKyAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMjI3LDYgKzI3MiwzMCBAQAogICAgIG1QbGF5UG9saWN5LnB1c2hfYmFjayhwb2xpY3kpOwogfQogCitib29sIERybVBsdWdpbjo6bWFrZUtleVNldElkKHN0ZDo6c3RyaW5nKiBrZXlTZXRJZCkgeworICAgIGlmICgha2V5U2V0SWQpIHsKKyAgICAgICAgQUxPR0UoImtleVNldElkIGRlc3RpbmF0aW9uIG5vdCBwcm92aWRlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGtzaWQoa0tleVNldElkUHJlZml4LmJlZ2luKCksIGtLZXlTZXRJZFByZWZpeC5lbmQoKSk7CisgICAga3NpZC5yZXNpemUoa0tleVNldElkTGVuZ3RoKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByYW5kb21EYXRhKChrS2V5U2V0SWRMZW5ndGggLSBrS2V5U2V0SWRQcmVmaXguc2l6ZSgpKSAvIDIsIDApOworCisgICAgd2hpbGUgKGtleVNldElkLT5lbXB0eSgpKSB7CisgICAgICAgIGZvciAoYXV0byBpdHIgPSByYW5kb21EYXRhLmJlZ2luKCk7IGl0ciAhPSByYW5kb21EYXRhLmVuZCgpOyArK2l0cikgeworICAgICAgICAgICAgKml0ciA9IHN0ZDo6cmFuZCgpICUgMHhmZjsKKyAgICAgICAgfQorICAgICAgICAqa2V5U2V0SWQgPSBrS2V5U2V0SWRQcmVmaXggKyBCeXRlQXJyYXlUb0hleFN0cmluZygKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYW5kb21EYXRhLmRhdGEoKSksIHJhbmRvbURhdGEuc2l6ZSgpKTsKKyAgICAgICAgaWYgKG1GaWxlSGFuZGxlLkxpY2Vuc2VFeGlzdHMoKmtleVNldElkKSkgeworICAgICAgICAgICAgLy8gY29sbGlzaW9uLCByZWdlbmVyYXRlCisgICAgICAgICAgICBBTE9HVigiUmV0cnkgZ2VuZXJhdGluZyBLZXlTZXRJZCIpOworICAgICAgICAgICAga2V5U2V0SWQtPmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKIFJldHVybjx2b2lkPiBEcm1QbHVnaW46OnByb3ZpZGVLZXlSZXNwb25zZSgKICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNjb3BlLAogICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgcmVzcG9uc2UsCkBAIC0yMzcsMjggKzMwNiwxMTkgQEAKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9CiAKLSAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5maW5kU2Vzc2lvbih0b1ZlY3RvcihzY29wZSkpOworICAgIHN0ZDo6c3RyaW5nIHJlc3BvbnNlU3RyaW5nKAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4ocmVzcG9uc2UuZGF0YSgpKSwgcmVzcG9uc2Uuc2l6ZSgpKTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzY29wZUlkID0gdG9WZWN0b3Ioc2NvcGUpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZDsKKyAgICBzdGQ6OnN0cmluZyBrZXlTZXRJZDsKKworICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6Ok9LOworICAgIGJvb2wgaXNPZmZsaW5lTGljZW5zZSA9IHJlc3BvbnNlU3RyaW5nLmZpbmQoa09mZmxpbmVMaWNlbnNlKSAhPSBzdGQ6OnN0cmluZzo6bnBvczsKKyAgICBib29sIGlzUmVsZWFzZSA9IChtZW1jbXAoc2NvcGVJZC5kYXRhKCksIGtLZXlTZXRJZFByZWZpeC5kYXRhKCksIGtLZXlTZXRJZFByZWZpeC5zaXplKCkpID09IDApOworICAgIGlmIChpc1JlbGVhc2UpIHsKKyAgICAgICAga2V5U2V0SWQuYXNzaWduKHNjb3BlSWQuYmVnaW4oKSwgc2NvcGVJZC5lbmQoKSk7CisKKyAgICAgICAgYXV0byBpdGVyID0gbVJlbGVhc2VLZXlzTWFwLmZpbmQoc3RkOjpzdHJpbmcoa2V5U2V0SWQuYmVnaW4oKSwga2V5U2V0SWQuZW5kKCkpKTsKKyAgICAgICAgaWYgKGl0ZXIgIT0gbVJlbGVhc2VLZXlzTWFwLmVuZCgpKSB7CisgICAgICAgICAgICBzZXNzaW9uSWQuYXNzaWduKGl0ZXItPnNlY29uZC5iZWdpbigpLCBpdGVyLT5zZWNvbmQuZW5kKCkpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2Vzc2lvbklkLmFzc2lnbihzY29wZUlkLmJlZ2luKCksIHNjb3BlSWQuZW5kKCkpOworICAgICAgICAvLyBub24gb2ZmbGluZSBsaWNlbnNlIHJldHVybnMgZW1wdHkga2V5U2V0SWQKKyAgICAgICAga2V5U2V0SWQuY2xlYXIoKTsKKyAgICB9CisKKyAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5maW5kU2Vzc2lvbihzZXNzaW9uSWQpOwogICAgIGlmICghc2Vzc2lvbi5nZXQoKSkgewogICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQsIGhpZGxfdmVjPHVpbnQ4X3Q+KCkpOwogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KLQogICAgIHNldFBsYXlQb2xpY3koKTsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlTZXRJZDsKLSAgICBTdGF0dXMgc3RhdHVzID0gc2Vzc2lvbi0+cHJvdmlkZUtleVJlc3BvbnNlKHJlc3BvbnNlKTsKKworICAgIHN0YXR1cyA9IHNlc3Npb24tPnByb3ZpZGVLZXlSZXNwb25zZShyZXNwb25zZSk7CiAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgIC8vIFRoaXMgaXMgZm9yIHRlc3RpbmcgQU1lZGlhRHJtX3NldE9uRXZlbnRMaXN0ZW5lciBvbmx5LgotICAgICAgICBzZW5kRXZlbnQoRXZlbnRUeXBlOjpWRU5ET1JfREVGSU5FRCwgMCwgc2NvcGUpOwotICAgICAgICBrZXlTZXRJZC5jbGVhcigpOworICAgICAgICBpZiAoaXNPZmZsaW5lTGljZW5zZSkgeworICAgICAgICAgICAgaWYgKGlzUmVsZWFzZSkgeworICAgICAgICAgICAgICAgIG1GaWxlSGFuZGxlLkRlbGV0ZUxpY2Vuc2Uoa2V5U2V0SWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1ha2VLZXlTZXRJZCgma2V5U2V0SWQpKSB7CisgICAgICAgICAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX1VOS05PV04sIGhpZGxfdmVjPHVpbnQ4X3Q+KCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJvb2wgb2sgPSBtRmlsZUhhbmRsZS5TdG9yZUxpY2Vuc2UoCisgICAgICAgICAgICAgICAgICAgICAgICBrZXlTZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlQWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcocmVzcG9uc2UuYmVnaW4oKSwgcmVzcG9uc2UuZW5kKCkpKTsKKyAgICAgICAgICAgICAgICBpZiAoIW9rKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc3RvcmUgb2ZmbGluZSBsaWNlbnNlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVGVzdCBjYWxsaW5nIEFNZWRpYURybSBsaXN0ZW5lcnMuCisgICAgICAgIHNlbmRFdmVudChFdmVudFR5cGU6OlZFTkRPUl9ERUZJTkVELCBzZXNzaW9uSWQsIHNlc3Npb25JZCk7CisKKyAgICAgICAgc2VuZEV4cGlyYXRpb25VcGRhdGUoc2Vzc2lvbklkLCAxMDApOworCisgICAgICAgIHN0ZDo6dmVjdG9yPEtleVN0YXR1cz4ga2V5c1N0YXR1czsKKyAgICAgICAgS2V5U3RhdHVzIGtleVN0YXR1czsKKworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlJZDEgPSB7IDB4QSwgMHhCLCAweEMgfTsKKyAgICAgICAga2V5U3RhdHVzLmtleUlkID0ga2V5SWQxOworICAgICAgICBrZXlTdGF0dXMudHlwZSA9IFYxXzA6OktleVN0YXR1c1R5cGU6OlVTQUJMRTsKKyAgICAgICAga2V5c1N0YXR1cy5wdXNoX2JhY2soa2V5U3RhdHVzKTsKKworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlJZDIgPSB7IDB4RCwgMHhFLCAweEYgfTsKKyAgICAgICAga2V5U3RhdHVzLmtleUlkID0ga2V5SWQyOworICAgICAgICBrZXlTdGF0dXMudHlwZSA9IFYxXzA6OktleVN0YXR1c1R5cGU6OkVYUElSRUQ7CisgICAgICAgIGtleXNTdGF0dXMucHVzaF9iYWNrKGtleVN0YXR1cyk7CisKKyAgICAgICAgc2VuZEtleXNDaGFuZ2Uoc2Vzc2lvbklkLCBrZXlzU3RhdHVzLCB0cnVlKTsKKworICAgICAgICBpbnN0YWxsU2VjdXJlU3RvcChzZXNzaW9uSWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJwcm92aWRlS2V5UmVzcG9uc2UgcmV0dXJucyBlcnJvcj0lZCIsIHN0YXR1cyk7CiAgICAgfQogCi0gICAgaW5zdGFsbFNlY3VyZVN0b3Aoc2NvcGUpOwotCi0gICAgLy8gUmV0dXJucyBzdGF0dXMgYW5kIGVtcHR5IGtleVNldElkCi0gICAgX2hpZGxfY2Ioc3RhdHVzLCB0b0hpZGxWZWMoa2V5U2V0SWQpKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlTZXRJZFZlYyhrZXlTZXRJZC5iZWdpbigpLCBrZXlTZXRJZC5lbmQoKSk7CisgICAgX2hpZGxfY2Ioc3RhdHVzLCB0b0hpZGxWZWMoa2V5U2V0SWRWZWMpKTsKICAgICByZXR1cm4gVm9pZCgpOwogfQogCitSZXR1cm48U3RhdHVzPiBEcm1QbHVnaW46OnJlc3RvcmVLZXlzKAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYga2V5U2V0SWQpIHsKKyAgICAgICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCB8fCBrZXlTZXRJZC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgRGV2aWNlRmlsZXM6OkxpY2Vuc2VTdGF0ZSBsaWNlbnNlU3RhdGU7CisgICAgICAgIHN0ZDo6c3RyaW5nIG9mZmxpbmVMaWNlbnNlOworICAgICAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKKyAgICAgICAgaWYgKCFtRmlsZUhhbmRsZS5SZXRyaWV2ZUxpY2Vuc2Uoc3RkOjpzdHJpbmcoa2V5U2V0SWQuYmVnaW4oKSwga2V5U2V0SWQuZW5kKCkpLAorICAgICAgICAgICAgICAgICZsaWNlbnNlU3RhdGUsICZvZmZsaW5lTGljZW5zZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVzdG9yZSBvZmZsaW5lIGxpY2Vuc2UiKTsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9OT19MSUNFTlNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlVW5rbm93biA9PSBsaWNlbnNlU3RhdGUgfHwKKyAgICAgICAgICAgICAgICBEZXZpY2VGaWxlczo6a0xpY2Vuc2VTdGF0ZVJlbGVhc2luZyA9PSBsaWNlbnNlU3RhdGUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGxpY2Vuc2Ugc3RhdGU9JWQiLCBsaWNlbnNlU3RhdGUpOworICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX05PX0xJQ0VOU0U7CisgICAgICAgIH0KKworICAgICAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5maW5kU2Vzc2lvbih0b1ZlY3RvcihzZXNzaW9uSWQpKTsKKyAgICAgICAgaWYgKCFzZXNzaW9uLmdldCgpKSB7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHNlc3Npb24tPnByb3ZpZGVLZXlSZXNwb25zZShzdGQ6OnZlY3Rvcjx1aW50OF90PihvZmZsaW5lTGljZW5zZS5iZWdpbigpLAorICAgICAgICAgICAgICAgIG9mZmxpbmVMaWNlbnNlLmVuZCgpKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZXN0b3JlIGtleXMiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworfQorCiBSZXR1cm48dm9pZD4gRHJtUGx1Z2luOjpnZXRQcm9wZXJ0eVN0cmluZygKICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIHByb3BlcnR5TmFtZSwgZ2V0UHJvcGVydHlTdHJpbmdfY2IgX2hpZGxfY2IpIHsKICAgICBzdGQ6OnN0cmluZyBuYW1lKHByb3BlcnR5TmFtZS5jX3N0cigpKTsKQEAgLTMyOCw2ICs0ODgsOSBAQAogICAgaWYgKG5hbWUgPT0ga0RldmljZUlkS2V5KSB7CiAgICAgICBBTE9HRCgiQ2Fubm90IHNldCBpbW11dGFibGUgcHJvcGVydHk6ICVzIiwgbmFtZS5jX3N0cigpKTsKICAgICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKKyAgIH0gZWxzZSBpZiAobmFtZSA9PSBrQ2xpZW50SWRLZXkpIHsKKyAgICAgICBtQnl0ZUFycmF5UHJvcGVydGllc1trQ2xpZW50SWRLZXldID0gdG9WZWN0b3IodmFsdWUpOworICAgICAgIHJldHVybiBTdGF0dXM6Ok9LOwogICAgfQogCiAgICAvLyBTZXR0aW5nIG9mIHVuZGVmaW5lZCBwcm9wZXJ0aWVzIGlzIG5vdCBzdXBwb3J0ZWQKQEAgLTQ2NSw2ICs2MjgsNTEgQEAKICAgICByZXR1cm4gVm9pZCgpOwogfQogCitSZXR1cm48dm9pZD4gRHJtUGx1Z2luOjpnZXRPZmZsaW5lTGljZW5zZUtleVNldElkcyhnZXRPZmZsaW5lTGljZW5zZUtleVNldElkc19jYiBfaGlkbF9jYikgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBsaWNlbnNlTmFtZXMgPSBtRmlsZUhhbmRsZS5MaXN0TGljZW5zZXMoKTsKKyAgICBzdGQ6OnZlY3RvcjxLZXlTZXRJZD4ga2V5U2V0SWRzOworICAgIGZvciAoY29uc3QgYXV0byYgbmFtZSA6IGxpY2Vuc2VOYW1lcykgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlTZXRJZChuYW1lLmJlZ2luKCksIG5hbWUuZW5kKCkpOworICAgICAgICBrZXlTZXRJZHMucHVzaF9iYWNrKGtleVNldElkKTsKKyAgICB9CisgICAgX2hpZGxfY2IoU3RhdHVzOjpPSywga2V5U2V0SWRzKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCisKK1JldHVybjxTdGF0dXM+IERybVBsdWdpbjo6cmVtb3ZlT2ZmbGluZUxpY2Vuc2UoY29uc3QgS2V5U2V0SWQmIGtleVNldElkKSB7CisgICAgc3RkOjpzdHJpbmcgbGljZW5zZU5hbWUoa2V5U2V0SWQuYmVnaW4oKSwga2V5U2V0SWQuZW5kKCkpOworICAgIGlmIChtRmlsZUhhbmRsZS5EZWxldGVMaWNlbnNlKGxpY2Vuc2VOYW1lKSkgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpPSzsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworfQorCitSZXR1cm48dm9pZD4gRHJtUGx1Z2luOjpnZXRPZmZsaW5lTGljZW5zZVN0YXRlKGNvbnN0IEtleVNldElkJiBrZXlTZXRJZCwKKyAgICAgICAgZ2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZV9jYiBfaGlkbF9jYikgeworICAgIHN0ZDo6c3RyaW5nIGxpY2Vuc2VOYW1lKGtleVNldElkLmJlZ2luKCksIGtleVNldElkLmVuZCgpKTsKKyAgICBEZXZpY2VGaWxlczo6TGljZW5zZVN0YXRlIHN0YXRlOworICAgIHN0ZDo6c3RyaW5nIGxpY2Vuc2U7CisgICAgT2ZmbGluZUxpY2Vuc2VTdGF0ZSBoTGljZW5zZVN0YXRlOworICAgIGlmIChtRmlsZUhhbmRsZS5SZXRyaWV2ZUxpY2Vuc2UobGljZW5zZU5hbWUsICZzdGF0ZSwgJmxpY2Vuc2UpKSB7CisgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgY2FzZSBEZXZpY2VGaWxlczo6a0xpY2Vuc2VTdGF0ZUFjdGl2ZToKKyAgICAgICAgICAgIGhMaWNlbnNlU3RhdGUgPSBPZmZsaW5lTGljZW5zZVN0YXRlOjpVU0FCTEU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEZXZpY2VGaWxlczo6a0xpY2Vuc2VTdGF0ZVJlbGVhc2luZzoKKyAgICAgICAgICAgIGhMaWNlbnNlU3RhdGUgPSBPZmZsaW5lTGljZW5zZVN0YXRlOjpJTkFDVElWRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlVW5rbm93bjoKKyAgICAgICAgICAgIGhMaWNlbnNlU3RhdGUgPSBPZmZsaW5lTGljZW5zZVN0YXRlOjpVTktOT1dOOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpPSywgaExpY2Vuc2VTdGF0ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpCQURfVkFMVUUsIE9mZmxpbmVMaWNlbnNlU3RhdGU6OlVOS05PV04pOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCiBSZXR1cm48dm9pZD4gRHJtUGx1Z2luOjpnZXRTZWN1cmVTdG9wcyhnZXRTZWN1cmVTdG9wc19jYiBfaGlkbF9jYikgewogICAgIHN0ZDo6dmVjdG9yPFNlY3VyZVN0b3A+IHN0b3BzOwogICAgIGZvciAoYXV0byBpdHIgPSBtU2VjdXJlU3RvcHMuYmVnaW4oKTsgaXRyICE9IG1TZWN1cmVTdG9wcy5lbmQoKTsgKytpdHIpIHsKQEAgLTU2Nyw3ICs3NzUsNyBAQAogfQogCiB9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gIC8vIG5hbWVzcGFjZSBWMV8xCit9ICAvLyBuYW1lc3BhY2UgVjFfMgogfSAgLy8gbmFtZXNwYWNlIGRybQogfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Jbml0RGF0YVBhcnNlci5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0luaXREYXRhUGFyc2VyLmNwcAppbmRleCBlMmJiNjUxLi44ZWJiNDJiIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0luaXREYXRhUGFyc2VyLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0luaXREYXRhUGFyc2VyLmNwcApAQCAtMzEsNyArMzEsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogbmFtZXNwYWNlIHsKQEAgLTQ1LDIxICs0NSwyMiBAQAogfQogCiBTdGF0dXMgSW5pdERhdGFQYXJzZXI6OnBhcnNlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lVHlwZSwKKyAgICAgICAgVjFfMDo6S2V5VHlwZSBrZXlUeXBlLAogICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiogbGljZW5zZVJlcXVlc3QpIHsKICAgICAvLyBCdWlsZCBhIGxpc3Qgb2YgdGhlIGtleSBJRHMKICAgICBzdGQ6OnZlY3Rvcjxjb25zdCB1aW50OF90Kj4ga2V5SWRzOwogCi0gICAgaWYgKHR5cGUgPT0ga0lzb0JtZmZWaWRlb01pbWVUeXBlIHx8Ci0gICAgICAgIHR5cGUgPT0ga0lzb0JtZmZBdWRpb01pbWVUeXBlIHx8Ci0gICAgICAgIHR5cGUgPT0ga0NlbmNJbml0RGF0YUZvcm1hdCkgeworICAgIGlmIChtaW1lVHlwZSA9PSBrSXNvQm1mZlZpZGVvTWltZVR5cGUgfHwKKyAgICAgICAgbWltZVR5cGUgPT0ga0lzb0JtZmZBdWRpb01pbWVUeXBlIHx8CisgICAgICAgIG1pbWVUeXBlID09IGtDZW5jSW5pdERhdGFGb3JtYXQpIHsKICAgICAgICAgU3RhdHVzIHJlcyA9IHBhcnNlUHNzaChpbml0RGF0YSwgJmtleUlkcyk7CiAgICAgICAgIGlmIChyZXMgIT0gU3RhdHVzOjpPSykgewogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZSA9PSBrV2VibVZpZGVvTWltZVR5cGUgfHwKLSAgICAgICAgdHlwZSA9PSBrV2VibUF1ZGlvTWltZVR5cGUgfHwKLSAgICAgICAgdHlwZSA9PSBrV2VibUluaXREYXRhRm9ybWF0KSB7CisgICAgfSBlbHNlIGlmIChtaW1lVHlwZSA9PSBrV2VibVZpZGVvTWltZVR5cGUgfHwKKyAgICAgICAgbWltZVR5cGUgPT0ga1dlYm1BdWRpb01pbWVUeXBlIHx8CisgICAgICAgIG1pbWVUeXBlID09IGtXZWJtSW5pdERhdGFGb3JtYXQpIHsKICAgICAgICAgLy8gV2ViTSAiaW5pdCBkYXRhIiBpcyBqdXN0IGEgc2luZ2xlIGtleSBJRAogICAgICAgICBpZiAoaW5pdERhdGEuc2l6ZSgpICE9IGtLZXlJZFNpemUpIHsKICAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwpAQCAtNjksOCArNzAsMTIgQEAKICAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CiAgICAgfQogCisgICAgaWYgKGtleVR5cGUgPT0gVjFfMDo6S2V5VHlwZTo6UkVMRUFTRSkgeworICAgICAgICAvLyByZXN0b3JlIGtleQorICAgIH0KKwogICAgIC8vIEJ1aWxkIHRoZSByZXF1ZXN0Ci0gICAgc3RkOjpzdHJpbmcgcmVxdWVzdEpzb24gPSBnZW5lcmF0ZVJlcXVlc3Qoa2V5SWRzKTsKKyAgICBzdGQ6OnN0cmluZyByZXF1ZXN0SnNvbiA9IGdlbmVyYXRlUmVxdWVzdChrZXlUeXBlLCBrZXlJZHMpOwogICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlcXVlc3RKc29uVmVjID0gU3RyVG9WZWN0b3IocmVxdWVzdEpzb24pOwogCiAgICAgbGljZW5zZVJlcXVlc3QtPmNsZWFyKCk7CkBAIC0xMzEsOSArMTM2LDExIEBACiAgICAgcmV0dXJuIFN0YXR1czo6T0s7CiB9CiAKLXN0ZDo6c3RyaW5nIEluaXREYXRhUGFyc2VyOjpnZW5lcmF0ZVJlcXVlc3QoY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgdWludDhfdCo+JiBrZXlJZHMpIHsKK3N0ZDo6c3RyaW5nIEluaXREYXRhUGFyc2VyOjpnZW5lcmF0ZVJlcXVlc3QoVjFfMDo6S2V5VHlwZSBrZXlUeXBlLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCB1aW50OF90Kj4mIGtleUlkcykgewogICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGtSZXF1ZXN0UHJlZml4KCJ7XCJraWRzXCI6WyIpOwotICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGtSZXF1ZXN0U3VmZml4KCJdLFwidHlwZVwiOlwidGVtcG9yYXJ5XCJ9Iik7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcga1RlbXBvcmFyeVNlc3Npb24oIl0sXCJ0eXBlXCI6XCJ0ZW1wb3JhcnlcIn0iKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBrUGVyc2lzdGVudFNlc3Npb24oIl0sXCJ0eXBlXCI6XCJwZXJzaXN0ZW50LWxpY2Vuc2VcIn0iKTsKIAogICAgIHN0ZDo6c3RyaW5nIHJlcXVlc3Qoa1JlcXVlc3RQcmVmaXgpOwogICAgIHN0ZDo6c3RyaW5nIGVuY29kZWRJZDsKQEAgLTE0Nyw3ICsxNTQsMTIgQEAKICAgICAgICAgcmVxdWVzdC5hcHBlbmQoZW5jb2RlZElkKTsKICAgICAgICAgcmVxdWVzdC5wdXNoX2JhY2soJ1wiJyk7CiAgICAgfQotICAgIHJlcXVlc3QuYXBwZW5kKGtSZXF1ZXN0U3VmZml4KTsKKyAgICBpZiAoa2V5VHlwZSA9PSBWMV8wOjpLZXlUeXBlOjpTVFJFQU1JTkcpIHsKKyAgICAgICAgcmVxdWVzdC5hcHBlbmQoa1RlbXBvcmFyeVNlc3Npb24pOworICAgIH0gZWxzZSBpZiAoa2V5VHlwZSA9PSBWMV8wOjpLZXlUeXBlOjpPRkZMSU5FIHx8CisgICAgICAgICAgICAgICAgICAga2V5VHlwZSA9PSBWMV8wOjpLZXlUeXBlOjpSRUxFQVNFKSB7CisgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChrUGVyc2lzdGVudFNlc3Npb24pOworICAgIH0KIAogICAgIC8vIEFuZHJvaWQncyBCYXNlNjQgZW5jb2RlciBwcm9kdWNlcyBwYWRkaW5nLiBFTUUgZm9yYmlkcyBwYWRkaW5nLgogICAgIGNvbnN0IGNoYXIga0Jhc2U2NFBhZGRpbmcgPSAnPSc7CkBAIC0xNTcsNyArMTY5LDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSnNvbldlYktleS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0pzb25XZWJLZXkuY3BwCmluZGV4IGNjY2I0MWUuLmQ5Mzc3N2QgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSnNvbldlYktleS5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Kc29uV2ViS2V5LmNwcApAQCAtMjIsMTggKzIyLDIxIEBACiAjaW5jbHVkZSAiQmFzZTY0LmgiCiAKIG5hbWVzcGFjZSB7Citjb25zdCBzdGQ6OnN0cmluZyBrQmFzZTY0UGFkZGluZygiPSIpOwogY29uc3Qgc3RkOjpzdHJpbmcga0tleXNUYWcoImtleXMiKTsKIGNvbnN0IHN0ZDo6c3RyaW5nIGtLZXlUeXBlVGFnKCJrdHkiKTsKLWNvbnN0IHN0ZDo6c3RyaW5nIGtTeW1tZXRyaWNLZXlWYWx1ZSgib2N0Iik7CiBjb25zdCBzdGQ6OnN0cmluZyBrS2V5VGFnKCJrIik7CiBjb25zdCBzdGQ6OnN0cmluZyBrS2V5SWRUYWcoImtpZCIpOwotY29uc3Qgc3RkOjpzdHJpbmcga0Jhc2U2NFBhZGRpbmcoIj0iKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtNZWRpYVNlc3Npb25UeXBlKCJ0eXBlIik7Citjb25zdCBzdGQ6OnN0cmluZyBrUGVyc2lzdGVudExpY2Vuc2VTZXNzaW9uKCJwZXJzaXN0ZW50LWxpY2Vuc2UiKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtTeW1tZXRyaWNLZXlWYWx1ZSgib2N0Iik7Citjb25zdCBzdGQ6OnN0cmluZyBrVGVtcG9yYXJ5TGljZW5zZVNlc3Npb24oInRlbXBvcmFyeSIpOwogfQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiBKc29uV2ViS2V5OjpKc29uV2ViS2V5KCkgewpAQCAtMjY4LDcgKzI3MSw3IEBACiB9CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL01lbW9yeUZpbGVTeXN0ZW0uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9NZW1vcnlGaWxlU3lzdGVtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGNkMDBmCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9NZW1vcnlGaWxlU3lzdGVtLmNwcApAQCAtMCwwICsxLDkyIEBACisvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIGZpbGUgYW5kIHByb3ByaWV0YXJ5CisvLyBzb3VyY2UgY29kZSBtYXkgb25seSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgV2lkZXZpbmUgTWFzdGVyCisvLyBMaWNlbnNlIEFncmVlbWVudC4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgIk1lbW9yeUZpbGVTeXN0ZW0uaCIKKyNpbmNsdWRlICJVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfMiB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCitzdGQ6OnN0cmluZyBNZW1vcnlGaWxlU3lzdGVtOjpHZXRGaWxlTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgeworICAgIHNpemVfdCBpbmRleCA9IHBhdGguZmluZF9sYXN0X29mKCIvIik7CisgICAgaWYgKGluZGV4ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIHJldHVybiBwYXRoLnN1YnN0cihpbmRleCsxKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gcGF0aDsKKyAgICB9Cit9CisKK2Jvb2wgTWVtb3J5RmlsZVN5c3RlbTo6RmlsZUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIGNvbnN0IHsKKyAgICBhdXRvIHJlc3VsdCA9IG1NZW1vcnlGaWxlU3lzdGVtLmZpbmQoZmlsZU5hbWUpOworICAgIHJldHVybiByZXN1bHQgIT0gbU1lbW9yeUZpbGVTeXN0ZW0uZW5kKCk7Cit9CisKK3NzaXplX3QgTWVtb3J5RmlsZVN5c3RlbTo6R2V0RmlsZVNpemUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSBjb25zdCB7CisgICAgYXV0byByZXN1bHQgPSBtTWVtb3J5RmlsZVN5c3RlbS5maW5kKGZpbGVOYW1lKTsKKyAgICBpZiAocmVzdWx0ICE9IG1NZW1vcnlGaWxlU3lzdGVtLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzc2l6ZV90PihyZXN1bHQtPnNlY29uZC5nZXRGaWxlU2l6ZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBzaXplIGZvciAlcyIsIGZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorCitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gTWVtb3J5RmlsZVN5c3RlbTo6TGlzdEZpbGVzKCkgY29uc3QgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBsaXN0OworICAgIGZvciAoY29uc3QgYXV0byYgZmlsZW5hbWUgOiBtTWVtb3J5RmlsZVN5c3RlbSkgeworICAgICAgICBsaXN0LnB1c2hfYmFjayhmaWxlbmFtZS5maXJzdCk7CisgICAgfQorICAgIHJldHVybiBsaXN0OworfQorCitzaXplX3QgTWVtb3J5RmlsZVN5c3RlbTo6UmVhZChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgc3RkOjpzdHJpbmcqIGJ1ZmZlcikgeworICAgIHN0ZDo6c3RyaW5nIGtleSA9IEdldEZpbGVOYW1lKHBhdGgpOworICAgIGF1dG8gcmVzdWx0ID0gbU1lbW9yeUZpbGVTeXN0ZW0uZmluZChrZXkpOworICAgIGlmIChyZXN1bHQgIT0gbU1lbW9yeUZpbGVTeXN0ZW0uZW5kKCkpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZEhhc2hGaWxlID0gcmVzdWx0LT5zZWNvbmQuZ2V0Q29udGVudCgpOworICAgICAgICBidWZmZXItPmFzc2lnbihzZXJpYWxpemVkSGFzaEZpbGUpOworICAgICAgICByZXR1cm4gYnVmZmVyLT5zaXplKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZWFkIGZyb20gJXMiLCBwYXRoLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorCitzaXplX3QgTWVtb3J5RmlsZVN5c3RlbTo6V3JpdGUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIGNvbnN0IE1lbW9yeUZpbGUmIG1lbW9yeUZpbGUpIHsKKyAgICBzdGQ6OnN0cmluZyBrZXkgPSBHZXRGaWxlTmFtZShwYXRoKTsKKyAgICBhdXRvIHJlc3VsdCA9IG1NZW1vcnlGaWxlU3lzdGVtLmZpbmQoa2V5KTsKKyAgICBpZiAocmVzdWx0ICE9IG1NZW1vcnlGaWxlU3lzdGVtLmVuZCgpKSB7CisgICAgICAgIG1NZW1vcnlGaWxlU3lzdGVtLmVyYXNlKGtleSk7CisgICAgfQorICAgIG1NZW1vcnlGaWxlU3lzdGVtLmluc2VydChzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIE1lbW9yeUZpbGU+KGtleSwgbWVtb3J5RmlsZSkpOworICAgIHJldHVybiBtZW1vcnlGaWxlLmdldEZpbGVTaXplKCk7Cit9CisKK2Jvb2wgTWVtb3J5RmlsZVN5c3RlbTo6UmVtb3ZlRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIHsKKyAgICBhdXRvIHJlc3VsdCA9IG1NZW1vcnlGaWxlU3lzdGVtLmZpbmQoZmlsZU5hbWUpOworICAgIGlmIChyZXN1bHQgIT0gbU1lbW9yeUZpbGVTeXN0ZW0uZW5kKCkpIHsKKyAgICAgICAgbU1lbW9yeUZpbGVTeXN0ZW0uZXJhc2UocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBmaW5kIGxpY2Vuc2UgdG8gcmVtb3ZlOiAlcyIsIGZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitib29sIE1lbW9yeUZpbGVTeXN0ZW06OlJlbW92ZUFsbEZpbGVzKCkgeworICAgIG1NZW1vcnlGaWxlU3lzdGVtLmNsZWFyKCk7CisgICAgcmV0dXJuIG1NZW1vcnlGaWxlU3lzdGVtLmVtcHR5KCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9IC8vIG5hbWVzcGFjZSBWMV8yCit9IC8vIG5hbWVzcGFjZSBkcm0KK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL1Nlc3Npb24uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9TZXNzaW9uLmNwcAppbmRleCAwN2M5MjY5Li5mNGM0OWI5IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL1Nlc3Npb24uY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvU2Vzc2lvbi5jcHAKQEAgLTI4LDcgKzI4LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6S2V5VmFsdWU7CkBAIC00Miw5ICs0MiwxMCBAQAogU3RhdHVzIFNlc3Npb246OmdldEtleVJlcXVlc3QoCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVUeXBlLAorICAgICAgICBWMV8wOjpLZXlUeXBlIGtleVR5cGUsCiAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBrZXlSZXF1ZXN0KSBjb25zdCB7CiAgICAgSW5pdERhdGFQYXJzZXIgcGFyc2VyOwotICAgIHJldHVybiBwYXJzZXIucGFyc2UoaW5pdERhdGEsIG1pbWVUeXBlLCBrZXlSZXF1ZXN0KTsKKyAgICByZXR1cm4gcGFyc2VyLnBhcnNlKGluaXREYXRhLCBtaW1lVHlwZSwga2V5VHlwZSwga2V5UmVxdWVzdCk7CiB9CiAKIFN0YXR1cyBTZXNzaW9uOjpwcm92aWRlS2V5UmVzcG9uc2UoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHJlc3BvbnNlKSB7CkBAIC04OSw3ICs5MCw3IEBACiB9CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL1Nlc3Npb25MaWJyYXJ5LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvU2Vzc2lvbkxpYnJhcnkuY3BwCmluZGV4IGI0MzE5ZTYuLjk5ZmIzMGYgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvU2Vzc2lvbkxpYnJhcnkuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvU2Vzc2lvbkxpYnJhcnkuY3BwCkBAIC0yNCw3ICsyNCw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKQEAgLTU5LDcgKzU5LDggQEAKIAogICAgIG1TZXNzaW9ucy5pbnNlcnQoc3RkOjpwYWlyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LAogICAgICAgICAgICAgc3A8U2Vzc2lvbj4gPihzZXNzaW9uSWQsIG5ldyBTZXNzaW9uKHNlc3Npb25JZCkpKTsKLSAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90Piwgc3A8U2Vzc2lvbj4gPjo6aXRlcmF0b3IgaXRyID0gbVNlc3Npb25zLmZpbmQoc2Vzc2lvbklkKTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90Piwgc3A8U2Vzc2lvbj4gPjo6aXRlcmF0b3IgaXRyID0KKyAgICAgICAgICAgIG1TZXNzaW9ucy5maW5kKHNlc3Npb25JZCk7CiAgICAgaWYgKGl0ciAhPSBtU2Vzc2lvbnMuZW5kKCkpIHsKICAgICAgICAgcmV0dXJuIGl0ci0+c2Vjb25kOwogICAgIH0gZWxzZSB7CkBAIC03MCw3ICs3MSw4IEBACiBzcDxTZXNzaW9uPiBTZXNzaW9uTGlicmFyeTo6ZmluZFNlc3Npb24oCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2Vzc2lvbnNMb2NrKTsKLSAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90Piwgc3A8U2Vzc2lvbj4gPjo6aXRlcmF0b3IgaXRyID0gbVNlc3Npb25zLmZpbmQoc2Vzc2lvbklkKTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90Piwgc3A8U2Vzc2lvbj4gPjo6aXRlcmF0b3IgaXRyID0KKyAgICAgICAgICAgIG1TZXNzaW9ucy5maW5kKHNlc3Npb25JZCk7CiAgICAgaWYgKGl0ciAhPSBtU2Vzc2lvbnMuZW5kKCkpIHsKICAgICAgICAgcmV0dXJuIGl0ci0+c2Vjb25kOwogICAgIH0gZWxzZSB7CkBAIC04NCw3ICs4Niw3IEBACiB9CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS1zZXJ2aWNlLmNsZWFya2V5LnJjIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEtc2VydmljZS5jbGVhcmtleS5yYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZlODU2YS4uMDAwMDAwMAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS1zZXJ2aWNlLmNsZWFya2V5LnJjCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zZXJ2aWNlIHZlbmRvci5kcm0tY2xlYXJrZXktaGFsLTEtMSAvdmVuZG9yL2Jpbi9ody9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEtc2VydmljZS5jbGVhcmtleQotICAgIGNsYXNzIGhhbAotICAgIHVzZXIgbWVkaWEKLSAgICBncm91cCBtZWRpYSBtZWRpYWRybQotICAgIGlvcHJpbyBydCA0Ci0gICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS5jbGVhcmtleS5yYyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UuY2xlYXJrZXkucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxODRmNwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UuY2xlYXJrZXkucmMKQEAgLTAsMCArMSw2IEBACitzZXJ2aWNlIHZlbmRvci5kcm0tY2xlYXJrZXktaGFsLTEtMiAvdmVuZG9yL2Jpbi9ody9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS5jbGVhcmtleQorICAgIGNsYXNzIGhhbAorICAgIHVzZXIgbWVkaWEKKyAgICBncm91cCBtZWRpYSBtZWRpYWRybQorICAgIGlvcHJpbyBydCA0CisgICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0Flc0N0ckRlY3J5cHRvci5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0Flc0N0ckRlY3J5cHRvci5oCmluZGV4IDBjN2VmMjAuLjcyMWY0YzAgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9BZXNDdHJEZWNyeXB0b3IuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQWVzQ3RyRGVjcnlwdG9yLmgKQEAgLTIyLDcgKzIyLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3RhdHVzOwpAQCAtNDIsNyArNDIsNyBAQAogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9CYXNlNjQuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9CYXNlNjQuaAppbmRleCA0YTM4NWJkLi5lYzMwY2MxIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQmFzZTY0LmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0Jhc2U2NC5oCkBAIC0yNSw3ICsyNSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OnNwOwpAQCAtMzgsNyArMzgsNyBAQAogdm9pZCBlbmNvZGVCYXNlNjRVcmwoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIHN0ZDo6c3RyaW5nICpvdXQpOwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0J1ZmZlci5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0J1ZmZlci5oCmluZGV4IDViYmIyOGEuLmM0OTdlMzcgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9CdWZmZXIuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQnVmZmVyLmgKQEAgLTI1LDcgKzI1LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6c3A7CkBAIC01NCw3ICs1NCw3IEBACiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NsZWFyS2V5RHJtUHJvcGVydGllcy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NsZWFyS2V5RHJtUHJvcGVydGllcy5oCmluZGV4IGQ2NWIyNWMuLmY4MzkwM2MgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DbGVhcktleURybVByb3BlcnRpZXMuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ2xlYXJLZXlEcm1Qcm9wZXJ0aWVzLmgKQEAgLTIyLDEzICsyMiwxMyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtWZW5kb3JLZXkoInZlbmRvciIpOwogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtWZW5kb3JWYWx1ZSgiR29vZ2xlIik7CiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1ZlcnNpb25LZXkoInZlcnNpb24iKTsKLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVmVyc2lvblZhbHVlKCIxLjEiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVmVyc2lvblZhbHVlKCIxLjIiKTsKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrUGx1Z2luRGVzY3JpcHRpb25LZXkoImRlc2NyaXB0aW9uIik7CiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1BsdWdpbkRlc2NyaXB0aW9uVmFsdWUoIkNsZWFyS2V5IENETSIpOwogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtBbGdvcml0aG1zS2V5KCJhbGdvcml0aG1zIik7CkBAIC00MCwxMiArNDAsMTYgQEAKIHN0YXRpYyBjb25zdCB1aW50OF90IGtUZXN0RGV2aWNlSWREYXRhW10gPQogICAgICAgICB7MHgwLCAweDEsIDB4MiwgMHgzLCAweDQsIDB4NSwgMHg2LCAweDcsCiAgICAgICAgICAweDgsIDB4OSwgMHhhLCAweGIsIDB4YywgMHhkLCAweGUsIDB4Zn07CisKKy8vIHNldHRhYmxlIGJ5dGUgYXJyYXkgcHJvcGVydHkKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQ2xpZW50SWRLZXkoImNsaWVudElkIik7CisKIC8vIFRPRE8gc3R1YiBvdXQgbWV0cmljcyBmb3IgbncKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrTWV0cmljc0tleSgibWV0cmljcyIpOwogc3RhdGljIGNvbnN0IHVpbnQ4X3Qga01ldHJpY3NEYXRhW10gPSB7IDAgfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DbGVhcktleVR5cGVzLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ2xlYXJLZXlUeXBlcy5oCmluZGV4IDQ2Y2I1ZTQuLjdlOWI2YmQgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DbGVhcktleVR5cGVzLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NsZWFyS2V5VHlwZXMuaApAQCAtMjQsNyArMjQsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlWYWx1ZTsKQEAgLTQ3LDcgKzQ3LDcgQEAKICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVHlwZU5hbWUmKSA9IGRlbGV0ZTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuaAppbmRleCA5OTUyMDI3Li42MzY4ZjNkIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oCkBAIC0xNywxNyArMTcsMTcgQEAKICNpZm5kZWYgQ0xFQVJLRVlfQ1JFQVRFX1BMVUdJTl9GQUNUT1JJRVNfSF8KICNkZWZpbmUgQ0xFQVJLRVlfQ1JFQVRFX1BMVUdJTl9GQUNUT1JJRVNfSF8KIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JQ3J5cHRvRmFjdG9yeS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JRHJtRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JQ3J5cHRvRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtRmFjdG9yeS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OklDcnlwdG9GYWN0b3J5OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpJRHJtRmFjdG9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6SUNyeXB0b0ZhY3Rvcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OklEcm1GYWN0b3J5OwogCiBleHRlcm4gIkMiIHsKICAgICBJRHJtRmFjdG9yeSogY3JlYXRlRHJtRmFjdG9yeSgpOwpAQCAtMzUsNyArMzUsNyBAQAogfQogCiB9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gIC8vIG5hbWVzcGFjZSBWMV8xCit9ICAvLyBuYW1lc3BhY2UgVjFfMgogfSAgLy8gbmFtZXNwYWNlIGRybQogfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyeXB0b0ZhY3RvcnkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcnlwdG9GYWN0b3J5LmgKaW5kZXggMTc1YWI3Ni4uMjAzYmIyZCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyeXB0b0ZhY3RvcnkuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3J5cHRvRmFjdG9yeS5oCkBAIC0xOCwxNyArMTgsMTcgQEAKICNkZWZpbmUgQ0xFQVJLRVlfQ1JZUFRPX0ZBQ1RPUllfSF8KIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JQ3J5cHRvUGx1Z2luLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4xL0lDcnlwdG9GYWN0b3J5Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lDcnlwdG9GYWN0b3J5Lmg+CiAKICNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6SUNyeXB0b0ZhY3Rvcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OklDcnlwdG9GYWN0b3J5OwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpJQ3J5cHRvUGx1Z2luOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwpAQCAtNTIsNyArNTIsNyBAQAogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcnlwdG9QbHVnaW4uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcnlwdG9QbHVnaW4uaAppbmRleCA2YTczODA2Li40ODBkYzdlIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3J5cHRvUGx1Z2luLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyeXB0b1BsdWdpbi5oCkBAIC0zMiw3ICszMiw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OkRlc3RpbmF0aW9uQnVmZmVyOwpAQCAtOTYsNyArOTYsNyBAQAogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9EZXZpY2VGaWxlcy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RldmljZUZpbGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU0YWU1OQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9EZXZpY2VGaWxlcy5oCkBAIC0wLDAgKzEsNzEgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgZmlsZSBhbmQgcHJvcHJpZXRhcnkKKy8vIHNvdXJjZSBjb2RlIG1heSBvbmx5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXaWRldmluZSBNYXN0ZXIKKy8vIExpY2Vuc2UgQWdyZWVtZW50LgorLy8KKyNpZm5kZWYgQ0xFQVJLRVlfREVWSUNFX0ZJTEVTX0hfCisjZGVmaW5lIENMRUFSS0VZX0RFVklDRV9GSUxFU19IXworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJwcm90b3MvRGV2aWNlRmlsZXMucGIuaCIKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisjaW5jbHVkZSAiTWVtb3J5RmlsZVN5c3RlbS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfMiB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCitjbGFzcyBEZXZpY2VGaWxlcyB7CisgcHVibGljOgorICAgIHR5cGVkZWYgZW51bSB7CisgICAgICAgIGtMaWNlbnNlU3RhdGVVbmtub3duLAorICAgICAgICBrTGljZW5zZVN0YXRlQWN0aXZlLAorICAgICAgICBrTGljZW5zZVN0YXRlUmVsZWFzaW5nLAorICAgIH0gTGljZW5zZVN0YXRlOworCisgICAgRGV2aWNlRmlsZXMoKSB7fTsKKyAgICB2aXJ0dWFsIH5EZXZpY2VGaWxlcygpIHt9OworCisgICAgdmlydHVhbCBib29sIFN0b3JlTGljZW5zZShjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQsIExpY2Vuc2VTdGF0ZSBzdGF0ZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlSZXNwb25zZSk7CisKKyAgICB2aXJ0dWFsIGJvb2wgUmV0cmlldmVMaWNlbnNlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zZXRfaWQsIExpY2Vuc2VTdGF0ZSogc3RhdGUsIHN0ZDo6c3RyaW5nKiBvZmZsaW5lTGljZW5zZSk7CisKKyAgICB2aXJ0dWFsIGJvb2wgTGljZW5zZUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQpOworCisgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gTGlzdExpY2Vuc2VzKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJvb2wgRGVsZXRlTGljZW5zZShjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQpOworCisgICAgdmlydHVhbCBib29sIERlbGV0ZUFsbExpY2Vuc2VzKCk7CisKKyBwcml2YXRlOgorICAgIGJvb2wgRmlsZUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgY29uc3Q7CisgICAgc3NpemVfdCBHZXRGaWxlU2l6ZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIGNvbnN0OworICAgIGJvb2wgUmVtb3ZlRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpOworCisgICAgYm9vbCBSZXRyaWV2ZUhhc2hlZEZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lLCBPZmZsaW5lRmlsZSogZGVTZXJpYWxpemVkRmlsZSk7CisgICAgYm9vbCBTdG9yZUZpbGVSYXcoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VyaWFsaXplZEZpbGUpOworICAgIGJvb2wgU3RvcmVGaWxlV2l0aEhhc2goY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VyaWFsaXplZEZpbGUpOworCisgICAgTWVtb3J5RmlsZVN5c3RlbSBtRmlsZUhhbmRsZTsKKworICAgIENMRUFSS0VZX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihEZXZpY2VGaWxlcyk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAvLyBuYW1lc3BhY2UgVjFfMgorfSAvLyBuYW1lc3BhY2UgZHJtCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENMRUFSS0VZX0RFVklDRV9GSUxFU19IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybUZhY3RvcnkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1GYWN0b3J5LmgKaW5kZXggNmY1ODE5NS4uZmY3MTVlYSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybUZhY3RvcnkuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRHJtRmFjdG9yeS5oCkBAIC0xNywxNSArMTcsMTUgQEAKICNpZm5kZWYgQ0xFQVJLRVlfRFJNX0ZBQ1RPUllfSF8KICNkZWZpbmUgQ0xFQVJLRVlfRFJNX0ZBQ1RPUllfSF8KIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JRHJtUGx1Z2luLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4xL0lEcm1GYWN0b3J5Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1QbHVnaW4uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvSURybUZhY3RvcnkuaD4KIAogI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKQEAgLTUyLDcgKzUyLDcgQEAKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRHJtUGx1Z2luLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRHJtUGx1Z2luLmgKaW5kZXggZmIwNjk1YS4uMjU2YzVkNiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybVBsdWdpbi5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1QbHVnaW4uaApAQCAtMTcsMTggKzE3LDIxIEBACiAjaWZuZGVmIENMRUFSS0VZX0RSTV9QTFVHSU5fSF8KICNkZWZpbmUgQ0xFQVJLRVlfRFJNX1BMVUdJTl9IXwogCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4xL0lEcm1QbHVnaW4uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvSURybVBsdWdpbi5oPgogCi0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RkaW8uaD4KIAorI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KKworI2luY2x1ZGUgIkRldmljZUZpbGVzLmgiCiAjaW5jbHVkZSAiU2Vzc2lvbkxpYnJhcnkuaCIKICNpbmNsdWRlICJVdGlscy5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OkV2ZW50VHlwZTsKQEAgLTQxLDggKzQ0LDEyIEBACiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlNlc3Npb25JZDsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3RhdHVzOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpEcm1NZXRyaWNHcm91cDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6SURybVBsdWdpbjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6SGRjcExldmVsOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpLZXlSZXF1ZXN0VHlwZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6U2VjdXJlU3RvcFJlbGVhc2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OlNlY3VyaXR5TGV2ZWw7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OklEcm1QbHVnaW47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6Ok9mZmxpbmVMaWNlbnNlU3RhdGU7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CkBAIC01Myw3ICs2MCw3IEBACiBzdHJ1Y3QgRHJtUGx1Z2luIDogcHVibGljIElEcm1QbHVnaW4gewogICAgIGV4cGxpY2l0IERybVBsdWdpbihTZXNzaW9uTGlicmFyeSogc2Vzc2lvbkxpYnJhcnkpOwogCi0gICAgdmlydHVhbCB+RHJtUGx1Z2luKCkge30KKyAgICB2aXJ0dWFsIH5Ecm1QbHVnaW4oKSB7IG1GaWxlSGFuZGxlLkRlbGV0ZUFsbExpY2Vuc2VzKCk7IH0KIAogICAgIFJldHVybjx2b2lkPiBvcGVuU2Vzc2lvbihvcGVuU2Vzc2lvbl9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CiAgICAgUmV0dXJuPHZvaWQ+IG9wZW5TZXNzaW9uXzFfMShTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsCkBAIC05MSwxMyArOTgsNyBAQAogCiAgICAgUmV0dXJuPFN0YXR1cz4gcmVzdG9yZUtleXMoCiAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCi0gICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBrZXlTZXRJZCkgewotCi0gICAgICAgIGlmIChzZXNzaW9uSWQuc2l6ZSgpID09IDAgfHwga2V5U2V0SWQuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKLSAgICB9CisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBrZXlTZXRJZCkgb3ZlcnJpZGU7CiAKICAgICBSZXR1cm48dm9pZD4gcXVlcnlLZXlTdGF0dXMoCiAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCkBAIC0xNDEsNiArMTQyLDEzIEBACiAKICAgICBSZXR1cm48dm9pZD4gZ2V0TWV0cmljcyhnZXRNZXRyaWNzX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKIAorICAgIFJldHVybjx2b2lkPiBnZXRPZmZsaW5lTGljZW5zZUtleVNldElkcyhnZXRPZmZsaW5lTGljZW5zZUtleVNldElkc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48U3RhdHVzPiByZW1vdmVPZmZsaW5lTGljZW5zZShjb25zdCBLZXlTZXRJZCAma2V5U2V0SWQpIG92ZXJyaWRlOworCisgICAgUmV0dXJuPHZvaWQ+IGdldE9mZmxpbmVMaWNlbnNlU3RhdGUoY29uc3QgS2V5U2V0SWQgJmtleVNldElkLAorICAgICAgICAgICAgZ2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKICAgICBSZXR1cm48dm9pZD4gZ2V0UHJvcGVydHlTdHJpbmcoCiAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBuYW1lLAogICAgICAgICBnZXRQcm9wZXJ0eVN0cmluZ19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CkBAIC0zMDAsNiArMzA4LDcgQEAKIHByaXZhdGU6CiAgICAgdm9pZCBpbml0UHJvcGVydGllcygpOwogICAgIHZvaWQgaW5zdGFsbFNlY3VyZVN0b3AoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCk7CisgICAgYm9vbCBtYWtlS2V5U2V0SWQoc3RkOjpzdHJpbmcqIGtleVNldElkKTsKICAgICB2b2lkIHNldFBsYXlQb2xpY3koKTsKIAogICAgIFJldHVybjxTdGF0dXM+IHNldFNlY3VyaXR5TGV2ZWwoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKQEAgLTMyMyw2ICszMzIsNyBAQAogICAgIHN0ZDo6dmVjdG9yPEtleVZhbHVlPiBtUGxheVBvbGljeTsKICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IG1TdHJpbmdQcm9wZXJ0aWVzOwogICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiA+IG1CeXRlQXJyYXlQcm9wZXJ0aWVzOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiA+IG1SZWxlYXNlS2V5c01hcDsKICAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90PiwgU2VjdXJpdHlMZXZlbD4gbVNlY3VyaXR5TGV2ZWw7CiAgICAgc3A8SURybVBsdWdpbkxpc3RlbmVyPiBtTGlzdGVuZXI7CiAgICAgU2Vzc2lvbkxpYnJhcnkgKm1TZXNzaW9uTGlicmFyeTsKQEAgLTMzMSwxMSArMzQxLDEzIEBACiAgICAgaW50NjRfdCBtQ2xvc2VTZXNzaW9uTm90T3BlbmVkQ291bnQ7CiAgICAgdWludDMyX3QgbU5leHRTZWN1cmVTdG9wSWQ7CiAKKyAgICBEZXZpY2VGaWxlcyBtRmlsZUhhbmRsZTsKKwogICAgIENMRUFSS0VZX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl9BTkRfTkVXKERybVBsdWdpbik7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0luaXREYXRhUGFyc2VyLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvSW5pdERhdGFQYXJzZXIuaAppbmRleCAzMTg5YzRhLi44ODlmNTExIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvSW5pdERhdGFQYXJzZXIuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvSW5pdERhdGFQYXJzZXIuaApAQCAtMjQsNyArMjQsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdGF0dXM7CkBAIC0zNCw3ICszNCw4IEBACiAgICAgSW5pdERhdGFQYXJzZXIoKSB7fQogCiAgICAgU3RhdHVzIHBhcnNlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVUeXBlLAorICAgICAgICAgICAgVjFfMDo6S2V5VHlwZSBrZXlUeXBlLAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGxpY2Vuc2VSZXF1ZXN0KTsKIAogcHJpdmF0ZToKQEAgLTQzLDEyICs0NCwxMiBAQAogICAgIFN0YXR1cyBwYXJzZVBzc2goY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgdWludDhfdCo+KiBrZXlJZHMpOwogCi0gICAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVSZXF1ZXN0KAorICAgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlUmVxdWVzdChWMV8wOjpLZXlUeXBlIGtleVR5cGUsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCB1aW50OF90Kj4mIGtleUlkcyk7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0pzb25XZWJLZXkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Kc29uV2ViS2V5LmgKaW5kZXggNGFiMDM0Yy4uZTU3NDcwYyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0pzb25XZWJLZXkuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvSnNvbldlYktleS5oCkBAIC0yMyw3ICsyMyw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiBjbGFzcyBKc29uV2ViS2V5IHsKQEAgLTU0LDcgKzU0LDcgQEAKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvTWVtb3J5RmlsZVN5c3RlbS5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL01lbW9yeUZpbGVTeXN0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2Q5ZmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL01lbW9yeUZpbGVTeXN0ZW0uaApAQCAtMCwwICsxLDY4IEBACisvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIGZpbGUgYW5kIHByb3ByaWV0YXJ5CisvLyBzb3VyY2UgY29kZSBtYXkgb25seSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgV2lkZXZpbmUgTWFzdGVyCisvLyBMaWNlbnNlIEFncmVlbWVudC4KKy8vCisjaWZuZGVmIENMRUFSS0VZX01FTU9SWV9GSUxFX1NZU1RFTV9IXworI2RlZmluZSBDTEVBUktFWV9NRU1PUllfRklMRV9TWVNURU1fSF8KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBWMV8yIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKKy8vIFVzaW5nIGFuZHJvaWQgZmlsZSBzeXN0ZW0gcmVxdWlyZXMgY2xlYXJrZXkgcGx1Z2luIHRvIHVwZGF0ZQorLy8gaXRzIHNlcG9saWN5LiBIb3dldmVyLCB3ZSBhcmUgdW5hYmxlIHRvIHVwZGF0ZSBzZXBvbGljeSBmb3IKKy8vIG9sZGVyIHZlbmRvciBwYXJ0aXRpb25zLiBUbyBwcm92aWRlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksCisvLyBjbGVhcmtleSBwbHVnaW4gaW1wbGVtZW50cyBhIHZlcnkgc2ltcGxlIGZpbGUgc3lzdGVtIGluIG1lbW9yeS4KKy8vIFRoaXMgbWVtb3J5IGZpbGUgc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgZGlyZWN0b3J5IHN0cnVjdHVyZS4KK2NsYXNzIE1lbW9yeUZpbGVTeXN0ZW0geworIHB1YmxpYzoKKyAgICBzdHJ1Y3QgTWVtb3J5RmlsZSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGZpbGVOYW1lOyAgLy8gZXhjbHVkZXMgcGF0aAorICAgICAgICBzdGQ6OnN0cmluZyBjb250ZW50OworICAgICAgICBzaXplX3QgZmlsZVNpemU7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgZ2V0Q29udGVudCgpIGNvbnN0IHsgcmV0dXJuIGNvbnRlbnQ7IH0KKyAgICAgICAgc2l6ZV90IGdldEZpbGVTaXplKCkgY29uc3QgeyByZXR1cm4gZmlsZVNpemU7IH0KKyAgICAgICAgdm9pZCBzZXRDb250ZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlKSB7IGNvbnRlbnQgPSBmaWxlOyB9CisgICAgICAgIHZvaWQgc2V0RmlsZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsgZmlsZU5hbWUgPSBuYW1lOyB9CisgICAgICAgIHZvaWQgc2V0RmlsZVNpemUoc2l6ZV90IHNpemUpIHsKKyAgICAgICAgICAgIGNvbnRlbnQucmVzaXplKHNpemUpOyBmaWxlU2l6ZSA9IHNpemU7CisgICAgICAgIH0KKyAgICB9OworCisgICAgTWVtb3J5RmlsZVN5c3RlbSgpIHt9OworICAgIHZpcnR1YWwgfk1lbW9yeUZpbGVTeXN0ZW0oKSB7fTsKKworICAgIGJvb2wgRmlsZUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIGNvbnN0OworICAgIHNzaXplX3QgR2V0RmlsZVNpemUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSBjb25zdDsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gTGlzdEZpbGVzKCkgY29uc3Q7CisgICAgc2l6ZV90IFJlYWQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGhOYW1lLCBzdGQ6OnN0cmluZyogYnVmZmVyKTsKKyAgICBib29sIFJlbW92ZUFsbEZpbGVzKCk7CisgICAgYm9vbCBSZW1vdmVGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSk7CisgICAgc2l6ZV90IFdyaXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoTmFtZSwgY29uc3QgTWVtb3J5RmlsZSYgbWVtb3J5RmlsZSk7CisKKyBwcml2YXRlOgorICAgIC8vIExpY2Vuc2UgZmlsZSBuYW1lIGlzIG1hZGUgdXAgb2YgYSB1bmlxdWUga2V5U2V0SWQsIHRoZXJlZm9yZSwKKyAgICAvLyB0aGUgZmlsZW5hbWUgY2FuIGJlIHVzZWQgYXMgdGhlIGtleSB0byBsb2NhdGUgbGljZW5zZXMgaW4gdGhlCisgICAgLy8gbWVtb3J5IGZpbGUgc3lzdGVtLgorICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBNZW1vcnlGaWxlPiBtTWVtb3J5RmlsZVN5c3RlbTsKKworICAgIHN0ZDo6c3RyaW5nIEdldEZpbGVOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKTsKKworICAgIENMRUFSS0VZX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNZW1vcnlGaWxlU3lzdGVtKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9IC8vIG5hbWVzcGFjZSBWMV8yCit9IC8vIG5hbWVzcGFjZSBkcm0KK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ0xFQVJLRVlfTUVNT1JZX0ZJTEVfU1lTVEVNX0hfCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvU2Vzc2lvbi5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1Nlc3Npb24uaAppbmRleCBjZGRmY2E1Li5mMzU1NjBkIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvU2Vzc2lvbi5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uLmgKQEAgLTI3LDcgKzI3LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3RhdHVzOwpAQCAtNDIsOCArNDIsOSBAQAogICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQoKSBjb25zdCB7IHJldHVybiBtU2Vzc2lvbklkOyB9CiAKICAgICBTdGF0dXMgZ2V0S2V5UmVxdWVzdCgKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBtaW1lVHlwZSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbml0RGF0YVR5cGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGFUeXBlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVUeXBlLAorICAgICAgICAgICAgVjFfMDo6S2V5VHlwZSBrZXlUeXBlLAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGtleVJlcXVlc3QpIGNvbnN0OwogCiAgICAgU3RhdHVzIHByb3ZpZGVLZXlSZXNwb25zZSgKQEAgLTYzLDcgKzY0LDcgQEAKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvU2Vzc2lvbkxpYnJhcnkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uTGlicmFyeS5oCmluZGV4IDMyNmEwYzEuLjFlNTY3YjggMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uTGlicmFyeS5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uTGlicmFyeS5oCkBAIC0yNiw3ICsyNiw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OnNwOwpAQCAtNTgsNyArNTgsNyBAQAogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9UeXBlQ29udmVydC5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1R5cGVDb252ZXJ0LmgKaW5kZXggY2MwNjMyOS4uZjZkMzBjOSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1R5cGVDb252ZXJ0LmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1R5cGVDb252ZXJ0LmgKQEAgLTI0LDcgKzI0LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7CkBAIC02OSw3ICs2OSw3IEBACiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAgLy8gbmFtZXNwYWNlIFYxXzEKK30gIC8vIG5hbWVzcGFjZSBWMV8yCiB9ICAvLyBuYW1lc3BhY2UgZHJtCiB9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3Byb3Rvcy9EZXZpY2VGaWxlcy5wcm90byBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvcHJvdG9zL0RldmljZUZpbGVzLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMTFmMGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3Byb3Rvcy9EZXZpY2VGaWxlcy5wcm90bwpAQCAtMCwwICsxLDQ3IEBACisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBkZXZpY2VfZmlsZXMucHJvdG8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgZmlsZSBhbmQgcHJvcHJpZXRhcnkKKy8vIHNvdXJjZSBjb2RlIG1heSBvbmx5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXaWRldmluZSBNYXN0ZXIKKy8vIExpY2Vuc2UgQWdyZWVtZW50LgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8gICBGb3JtYXQgb2YgdmFyaW91cyBmaWxlcyBzdG9yZWQgYXQgdGhlIGRldmljZS4KKy8vCitzeW50YXggPSAicHJvdG8yIjsKKworcGFja2FnZSBhbmRyb2lkLmhhcmR3YXJlLmRybS5WMV8yLmNsZWFya2V5OworCisvLyBuZWVkIHRoaXMgaWYgd2UgYXJlIHVzaW5nIGxpYnByb3RvYnVmLWNwcC0yLjMuMC1saXRlCitvcHRpb24gb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FOworCittZXNzYWdlIExpY2Vuc2UgeworICBlbnVtIExpY2Vuc2VTdGF0ZSB7CisgICAgQUNUSVZFID0gMTsKKyAgICBSRUxFQVNJTkcgPSAyOworICB9CisKKyAgb3B0aW9uYWwgTGljZW5zZVN0YXRlIHN0YXRlID0gMTsKKyAgb3B0aW9uYWwgYnl0ZXMgbGljZW5zZSA9IDI7Cit9CisKK21lc3NhZ2UgT2ZmbGluZUZpbGUgeworICBlbnVtIEZpbGVUeXBlIHsKKyAgICBMSUNFTlNFID0gMTsKKyAgfQorCisgIGVudW0gRmlsZVZlcnNpb24geworICAgIFZFUlNJT05fMSA9IDE7CisgIH0KKworICBvcHRpb25hbCBGaWxlVHlwZSB0eXBlID0gMTsKKyAgb3B0aW9uYWwgRmlsZVZlcnNpb24gdmVyc2lvbiA9IDIgW2RlZmF1bHQgPSBWRVJTSU9OXzFdOworICBvcHRpb25hbCBMaWNlbnNlIGxpY2Vuc2UgPSAzOworCit9CisKK21lc3NhZ2UgSGFzaGVkRmlsZSB7CisgIG9wdGlvbmFsIGJ5dGVzIGZpbGUgPSAxOworICAvLyBBIHJhdyAobm90IGhleC1lbmNvZGVkKSBTSEEyNTYsIHRha2VuIG92ZXIgdGhlIGJ5dGVzIG9mICdmaWxlJy4KKyAgb3B0aW9uYWwgYnl0ZXMgaGFzaCA9IDI7Cit9CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3NlcnZpY2UuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9zZXJ2aWNlLmNwcAppbmRleCA2YTk3YjcyLi40Y2EzMWYzIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3NlcnZpY2UuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvc2VydmljZS5jcHAKQEAgLTEzLDcgKzEzLDcgQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCi0jZGVmaW5lIExPR19UQUcgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS1zZXJ2aWNlLmNsZWFya2V5IgorI2RlZmluZSBMT0dfVEFHICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS5jbGVhcmtleSIKIAogI2luY2x1ZGUgPENyeXB0b0ZhY3RvcnkuaD4KICNpbmNsdWRlIDxEcm1GYWN0b3J5Lmg+CkBAIC0yNiwxNCArMjYsMTQgQEAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmpvaW5ScGNUaHJlYWRwb29sOwogdXNpbmcgOjphbmRyb2lkOjpzcDsKIAotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6SUNyeXB0b0ZhY3Rvcnk7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpJRHJtRmFjdG9yeTsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OmNsZWFya2V5OjpDcnlwdG9GYWN0b3J5OwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6Y2xlYXJrZXk6OkRybUZhY3Rvcnk7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpJQ3J5cHRvRmFjdG9yeTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OklEcm1GYWN0b3J5OwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6Y2xlYXJrZXk6OkNyeXB0b0ZhY3Rvcnk7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpjbGVhcmtleTo6RHJtRmFjdG9yeTsKIAogCiBpbnQgbWFpbihpbnQgLyogYXJnYyAqLywgY2hhcioqIC8qIGFyZ3YgKi8pIHsKLSAgICBBTE9HRCgiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xLXNlcnZpY2UuY2xlYXJrZXkgc3RhcnRpbmcuLi4iKTsKKyAgICBBTE9HRCgiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UuY2xlYXJrZXkgc3RhcnRpbmcuLi4iKTsKIAogICAgIC8vIFRoZSBEUk0gSEFMIG1heSBjb21tdW5pY2F0ZSB0byBvdGhlciB2ZW5kb3IgY29tcG9uZW50cyB2aWEKICAgICAvLyAvZGV2L3ZuZGJpbmRlcgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1ByZXNlbnRhdGlvbkluZm8uaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9QcmVzZW50YXRpb25JbmZvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MWE5OTIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb1ByZXNlbnRhdGlvbkluZm8uaAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFVRElPX1BSRVNFTlRBVElPTl9JTkZPX0hfCi0jZGVmaW5lIEFVRElPX1BSRVNFTlRBVElPTl9JTkZPX0hfCi0KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWVudW0gbWFzdGVyaW5nX2luZGljYXRpb24gewotICAgIE1BU1RFUklOR19OT1RfSU5ESUNBVEVELAotICAgIE1BU1RFUkVEX0ZPUl9TVEVSRU8sCi0gICAgTUFTVEVSRURfRk9SX1NVUlJPVU5ELAotICAgIE1BU1RFUkVEX0ZPUl8zRCwKLSAgICBNQVNURVJFRF9GT1JfSEVBRFBIT05FLAotfTsKLQotc3RydWN0IEF1ZGlvUHJlc2VudGF0aW9uIDogcHVibGljIFJlZkJhc2UgewotICAgIGludDMyX3QgbVByZXNlbnRhdGlvbklkOwotICAgIGludDMyX3QgbVByb2dyYW1JZDsKLSAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtTGFiZWxzOwotICAgIFN0cmluZzggbUxhbmd1YWdlOwotICAgIGludDMyX3QgbU1hc3RlcmluZ0luZGljYXRpb247Ci0gICAgYm9vbCBtQXVkaW9EZXNjcmlwdGlvbkF2YWlsYWJsZTsKLSAgICBib29sIG1TcG9rZW5TdWJ0aXRsZXNBdmFpbGFibGU7Ci0gICAgYm9vbCBtRGlhbG9ndWVFbmhhbmNlbWVudEF2YWlsYWJsZTsKLQotICAgIEF1ZGlvUHJlc2VudGF0aW9uKCkgewotICAgICAgICBtUHJlc2VudGF0aW9uSWQgPSAtMTsKLSAgICAgICAgbVByb2dyYW1JZCA9IC0xOwotICAgICAgICBtTGFuZ3VhZ2UgPSAiIjsKLSAgICAgICAgbU1hc3RlcmluZ0luZGljYXRpb24gPSBNQVNURVJJTkdfTk9UX0lORElDQVRFRDsKLSAgICAgICAgbUF1ZGlvRGVzY3JpcHRpb25BdmFpbGFibGUgPSBmYWxzZTsKLSAgICAgICAgbVNwb2tlblN1YnRpdGxlc0F2YWlsYWJsZSA9IGZhbHNlOwotICAgICAgICBtRGlhbG9ndWVFbmhhbmNlbWVudEF2YWlsYWJsZSA9IGZhbHNlOwotICAgIH0KLX07Ci0KLXR5cGVkZWYgVmVjdG9yPHNwPEF1ZGlvUHJlc2VudGF0aW9uPj4gQXVkaW9QcmVzZW50YXRpb25zOwotCi1jbGFzcyBBdWRpb1ByZXNlbnRhdGlvbkluZm8gOiBwdWJsaWMgUmVmQmFzZSB7Ci0gcHVibGljOgotICAgIEF1ZGlvUHJlc2VudGF0aW9uSW5mbygpOwotCi0gICAgfkF1ZGlvUHJlc2VudGF0aW9uSW5mbygpOwotCi0gICAgdm9pZCBhZGRQcmVzZW50YXRpb24oc3A8QXVkaW9QcmVzZW50YXRpb24+IHByZXNlbnRhdGlvbik7Ci0KLSAgICBzaXplX3QgY291bnRQcmVzZW50YXRpb25zKCkgY29uc3Q7Ci0KLSAgICBjb25zdCBzcDxBdWRpb1ByZXNlbnRhdGlvbj4gZ2V0UHJlc2VudGF0aW9uKHNpemVfdCBpbmRleCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICAgIEF1ZGlvUHJlc2VudGF0aW9ucyBtUHJlc2VudGF0aW9uczsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQVVESU9fUFJFU0VOVEFUSU9OX0lORk9fSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvRXZlbnRMb2cuaCBiL2luY2x1ZGUvbWVkaWEvRXZlbnRMb2cuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi45YjJjNGJmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9FdmVudExvZy5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9FdmVudExvZy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3Rvci5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3Rvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCA0YjM1ZmUxLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3IuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTY0NzJjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9FWFRSQUNUT1JfUExVR0lOX0FQSV9IXworI2RlZmluZSBNRURJQV9FWFRSQUNUT1JfUExVR0lOX0FQSV9IXworCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+IC8vIGZvciBzdGF0dXNfdAorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KK3N0cnVjdCBBTWVkaWFGb3JtYXQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE1lZGlhVHJhY2s7CitjbGFzcyBNZXRhRGF0YUJhc2U7CitjbGFzcyBNZWRpYUJ1ZmZlckJhc2U7CisKK2V4dGVybiAiQyIgeworCitzdHJ1Y3QgQ0RhdGFTb3VyY2UgeworICAgIHNzaXplX3QgKCpyZWFkQXQpKHZvaWQgKmhhbmRsZSwgb2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICBzdGF0dXNfdCAoKmdldFNpemUpKHZvaWQgKmhhbmRsZSwgb2ZmNjRfdCAqc2l6ZSk7CisgICAgdWludDMyX3QgKCpmbGFncykodm9pZCAqaGFuZGxlICk7CisgICAgYm9vbCAoKmdldFVyaSkodm9pZCAqaGFuZGxlLCBjaGFyICp1cmlTdHJpbmcsIHNpemVfdCBidWZmZXJTaXplKTsKKyAgICB2b2lkICpoYW5kbGU7Cit9OworCitlbnVtIENNZWRpYVRyYWNrUmVhZE9wdGlvbnMgOiB1aW50MzJfdCB7CisgICAgU0VFS19QUkVWSU9VU19TWU5DID0gMCwKKyAgICBTRUVLX05FWFRfU1lOQyA9IDEsCisgICAgU0VFS19DTE9TRVNUX1NZTkMgPSAyLAorICAgIFNFRUtfQ0xPU0VTVCA9IDMsCisgICAgU0VFS19GUkFNRV9JTkRFWCA9IDQsCisgICAgU0VFSyA9IDgsCisgICAgTk9OQkxPQ0tJTkcgPSAxNgorfTsKKworLyoqCisgKiBvbmx5IHVzZSBDTWVkaWFCdWZmZXIgYWxsb2NhdGVkIGZyb20gdGhlIENNZWRpYUJ1ZmZlckdyb3VwIHRoYXQgaXMKKyAqIHByb3ZpZGVkIHRvIENNZWRpYVRyYWNrOjpzdGFydCgpCisgKi8KK3N0cnVjdCBDTWVkaWFCdWZmZXIgeworICAgIHZvaWQgKmhhbmRsZTsKKyAgICB2b2lkICgqcmVsZWFzZSkodm9pZCAqaGFuZGxlKTsKKyAgICB2b2lkKiAoKmRhdGEpKHZvaWQgKmhhbmRsZSk7CisgICAgc2l6ZV90ICgqc2l6ZSkodm9pZCAqaGFuZGxlKTsKKyAgICBzaXplX3QgKCpyYW5nZV9vZmZzZXQpKHZvaWQgKmhhbmRsZSk7CisgICAgc2l6ZV90ICgqcmFuZ2VfbGVuZ3RoKSh2b2lkICpoYW5kbGUpOworICAgIHZvaWQgKCpzZXRfcmFuZ2UpKHZvaWQgKmhhbmRsZSwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGxlbmd0aCk7CisgICAgQU1lZGlhRm9ybWF0KiAoKm1ldGFfZGF0YSkodm9pZCAqaGFuZGxlKTsKK307CisKK3N0cnVjdCBDTWVkaWFCdWZmZXJHcm91cCB7CisgICAgdm9pZCAqaGFuZGxlOworICAgIGJvb2wgKCppbml0KSh2b2lkICpoYW5kbGUsIHNpemVfdCBidWZmZXJzLCBzaXplX3QgYnVmZmVyX3NpemUsIHNpemVfdCBncm93dGhMaW1pdCk7CisgICAgdm9pZCAoKmFkZF9idWZmZXIpKHZvaWQgKmhhbmRsZSwgc2l6ZV90IHNpemUpOworICAgIG1lZGlhX3N0YXR1c190ICgqYWNxdWlyZV9idWZmZXIpKHZvaWQgKmhhbmRsZSwKKyAgICAgICAgICAgIENNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgYm9vbCBub25CbG9ja2luZywgc2l6ZV90IHJlcXVlc3RlZFNpemUpOworICAgIGJvb2wgKCpoYXNfYnVmZmVycykodm9pZCAqaGFuZGxlKTsKK307CisKK3N0cnVjdCBDTWVkaWFUcmFjayB7CisgICAgdm9pZCAqZGF0YTsKKyAgICB2b2lkICgqZnJlZSkodm9pZCAqZGF0YSk7CisKKyAgICBtZWRpYV9zdGF0dXNfdCAoKnN0YXJ0KSh2b2lkICpkYXRhLCBDTWVkaWFCdWZmZXJHcm91cCAqYnVmZmVyR3JvdXApOworICAgIG1lZGlhX3N0YXR1c190ICgqc3RvcCkodm9pZCAqZGF0YSk7CisgICAgbWVkaWFfc3RhdHVzX3QgKCpnZXRGb3JtYXQpKHZvaWQgKmRhdGEsIEFNZWRpYUZvcm1hdCAqZm9ybWF0KTsKKyAgICBtZWRpYV9zdGF0dXNfdCAoKnJlYWQpKHZvaWQgKmRhdGEsIENNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgdWludDMyX3Qgb3B0aW9ucywgaW50NjRfdCBzZWVrUG9zVXMpOworICAgIGJvb2wgICAgICgqc3VwcG9ydHNOb25CbG9ja2luZ1JlYWQpKHZvaWQgKmRhdGEpOworfTsKKworc3RydWN0IENNZWRpYUV4dHJhY3RvciB7CisgICAgdm9pZCAqZGF0YTsKKworICAgIHZvaWQgKCpmcmVlKSh2b2lkICpkYXRhKTsKKyAgICBzaXplX3QgKCpjb3VudFRyYWNrcykodm9pZCAqZGF0YSk7CisgICAgQ01lZGlhVHJhY2sqICgqZ2V0VHJhY2spKHZvaWQgKmRhdGEsIHNpemVfdCBpbmRleCk7CisgICAgbWVkaWFfc3RhdHVzX3QgKCpnZXRUcmFja01ldGFEYXRhKSgKKyAgICAgICAgICAgIHZvaWQgKmRhdGEsCisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCisgICAgICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKworICAgIG1lZGlhX3N0YXR1c190ICgqZ2V0TWV0YURhdGEpKHZvaWQgKmRhdGEsIEFNZWRpYUZvcm1hdCAqbWV0YSk7CisgICAgdWludDMyX3QgKCpmbGFncykodm9pZCAqZGF0YSk7CisgICAgbWVkaWFfc3RhdHVzX3QgKCpzZXRNZWRpYUNhcykodm9pZCAqZGF0YSwgY29uc3QgdWludDhfdCogY2FzVG9rZW4sIHNpemVfdCBzaXplKTsKKyAgICBjb25zdCBjaGFyICogKCpuYW1lKSh2b2lkICpkYXRhKTsKK307CisKK3R5cGVkZWYgQ01lZGlhRXh0cmFjdG9yKiAoKkNyZWF0b3JGdW5jKShDRGF0YVNvdXJjZSAqc291cmNlLCB2b2lkICptZXRhKTsKK3R5cGVkZWYgdm9pZCAoKkZyZWVNZXRhRnVuYykodm9pZCAqbWV0YSk7CisKKy8vIFRoZSBzbmlmZmVyIGNhbiBvcHRpb25hbGx5IGZpbGwgaW4gYW4gb3BhcXVlIG9iamVjdCwgIm1ldGEiLCB0aGF0IGhlbHBzCisvLyB0aGUgY29ycmVzcG9uZGluZyBleHRyYWN0b3IgaW5pdGlhbGl6ZSBpdHMgc3RhdGUgd2l0aG91dCBkdXBsaWNhdGluZworLy8gZWZmb3J0IGFscmVhZHkgZXhlcnRlZCBieSB0aGUgc25pZmZlci4gSWYgImZyZWVNZXRhIiBpcyBnaXZlbiwgaXQgd2lsbCBiZQorLy8gY2FsbGVkIGFnYWluc3QgdGhlIG9wYXF1ZSBvYmplY3Qgd2hlbiBpdCBpcyBubyBsb25nZXIgdXNlZC4KK3R5cGVkZWYgQ3JlYXRvckZ1bmMgKCpTbmlmZmVyRnVuYykoCisgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICB2b2lkICoqbWV0YSwgRnJlZU1ldGFGdW5jICpmcmVlTWV0YSk7CisKK3R5cGVkZWYgQ01lZGlhRXh0cmFjdG9yIENNZWRpYUV4dHJhY3RvcjsKK3R5cGVkZWYgQ3JlYXRvckZ1bmMgQ3JlYXRvckZ1bmM7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IHVpbnQ4X3QgYlsxNl07Cit9IG1lZGlhX3V1aWRfdDsKKworc3RydWN0IEV4dHJhY3RvckRlZiB7CisgICAgLy8gdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBzdHJ1Y3R1cmUKKyAgICBjb25zdCB1aW50MzJfdCBkZWZfdmVyc2lvbjsKKworICAgIC8vIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0cmFjdG9yLgorICAgIC8vIFNlZSBiZWxvdyBmb3IgYSBjb252ZW5pZW5jZSBtYWNybyB0byBjcmVhdGUgdGhpcyBmcm9tIGEgc3RyaW5nLgorICAgIG1lZGlhX3V1aWRfdCBleHRyYWN0b3JfdXVpZDsKKworICAgIC8vIFZlcnNpb24gbnVtYmVyIG9mIHRoaXMgZXh0cmFjdG9yLiBXaGVuIHR3byBleHRyYWN0b3JzIHdpdGggdGhlIHNhbWUKKyAgICAvLyB1dWlkIGFyZSBlbmNvdW50ZXJlZCwgdGhlIG9uZSB3aXRoIHRoZSBsYXJnZXN0IHZlcnNpb24gbnVtYmVyIHdpbGwKKyAgICAvLyBiZSB1c2VkLgorICAgIGNvbnN0IHVpbnQzMl90IGV4dHJhY3Rvcl92ZXJzaW9uOworCisgICAgLy8gYSBodW1hbiByZWFkYWJsZSBuYW1lCisgICAgY29uc3QgY2hhciAqZXh0cmFjdG9yX25hbWU7CisKKyAgICB1bmlvbiB7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICBTbmlmZmVyRnVuYyBzbmlmZjsKKyAgICAgICAgfSB2MjsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIFNuaWZmZXJGdW5jIHNuaWZmOworICAgICAgICAgICAgLy8gYSBOVUxMIHRlcm1pbmF0ZWQgbGlzdCBvZiBjb250YWluZXIgbWltZSB0eXBlcyBhbmQvb3IgZmlsZSBleHRlbnNpb25zCisgICAgICAgICAgICAvLyB0aGF0IHRoaXMgZXh0cmFjdG9yIHN1cHBvcnRzCisgICAgICAgICAgICBjb25zdCBjaGFyICoqc3VwcG9ydGVkX3R5cGVzOworICAgICAgICB9IHYzOworICAgIH0gdTsKK307CisKKy8vIHRoZSBDKysgYmFzZWQgQVBJIHdoaWNoIGZpcnN0IHNoaXBwZWQgaW4gUCBhbmQgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZAorY29uc3QgdWludDMyX3QgRVhUUkFDVE9SREVGX1ZFUlNJT05fTEVHQUNZID0gMTsKKworLy8gdGhlIGZpcnN0IEMvTkRLIGJhc2VkIEFQSQorY29uc3QgdWludDMyX3QgRVhUUkFDVE9SREVGX1ZFUlNJT05fTkRLX1YxID0gMjsKKworLy8gdGhlIHNlY29uZCBDL05ESyBiYXNlZCBBUEkKK2NvbnN0IHVpbnQzMl90IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX05ES19WMiA9IDM7CisKK2NvbnN0IHVpbnQzMl90IEVYVFJBQ1RPUkRFRl9WRVJTSU9OID0gRVhUUkFDVE9SREVGX1ZFUlNJT05fTkRLX1YyOworCisvLyBlYWNoIHBsdWdpbiBsaWJyYXJ5IGV4cG9ydHMgb25lIGZ1bmN0aW9uIG9mIHRoaXMgdHlwZQordHlwZWRlZiBFeHRyYWN0b3JEZWYgKCpHZXRFeHRyYWN0b3JEZWYpKCk7CisKK30gLy8gZXh0ZXJuICJDIgorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX0VYVFJBQ1RPUl9QTFVHSU5fQVBJX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmggYi9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRkNGRhNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaApAQCAtMCwwICsxLDQ5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfRVhUUkFDVE9SX1BMVUdJTl9IRUxQRVJfSF8KKworI2RlZmluZSBNRURJQV9FWFRSQUNUT1JfUExVR0lOX0hFTFBFUl9IXworCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXA+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIERhdGFTb3VyY2VCYXNlOworY2xhc3MgTWV0YURhdGFCYXNlOworc3RydWN0IE1lZGlhVHJhY2s7CisKKworY2xhc3MgTWVkaWFUcmFja0hlbHBlcjsKKworY2xhc3MgTWVkaWFCdWZmZXJIZWxwZXIgeworcHJpdmF0ZToKKyAgICBmcmllbmQgQ01lZGlhVHJhY2sgKndyYXAoTWVkaWFUcmFja0hlbHBlciAqKTsKKyAgICBDTWVkaWFCdWZmZXIgKm1CdWZmZXI7CitwdWJsaWM6CisgICAgTWVkaWFCdWZmZXJIZWxwZXIoQ01lZGlhQnVmZmVyICpidWYpIHsKKyAgICAgICAgbUJ1ZmZlciA9IGJ1ZjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5NZWRpYUJ1ZmZlckhlbHBlcigpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpIHsKKyAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZShtQnVmZmVyLT5oYW5kbGUpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCogZGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIG1CdWZmZXItPmRhdGEobUJ1ZmZlci0+aGFuZGxlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNpemVfdCBzaXplKCkgeworICAgICAgICByZXR1cm4gbUJ1ZmZlci0+c2l6ZShtQnVmZmVyLT5oYW5kbGUpOworICAgIH0KKworICAgIHZpcnR1YWwgc2l6ZV90IHJhbmdlX29mZnNldCgpIHsKKyAgICAgICAgcmV0dXJuIG1CdWZmZXItPnJhbmdlX29mZnNldChtQnVmZmVyLT5oYW5kbGUpOworICAgIH0KKworICAgIHZpcnR1YWwgc2l6ZV90IHJhbmdlX2xlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIG1CdWZmZXItPnJhbmdlX2xlbmd0aChtQnVmZmVyLT5oYW5kbGUpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBzZXRfcmFuZ2Uoc2l6ZV90IG9mZnNldCwgc2l6ZV90IGxlbmd0aCkgeworICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UobUJ1ZmZlci0+aGFuZGxlLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgfQorICAgIHZpcnR1YWwgQU1lZGlhRm9ybWF0ICptZXRhX2RhdGEoKSB7CisgICAgICAgIHJldHVybiBtQnVmZmVyLT5tZXRhX2RhdGEobUJ1ZmZlci0+aGFuZGxlKTsKKyAgICB9Cit9OworCitjbGFzcyBNZWRpYUJ1ZmZlckdyb3VwSGVscGVyIHsKK3ByaXZhdGU6CisgICAgQ01lZGlhQnVmZmVyR3JvdXAgKm1Hcm91cDsKKyAgICBzdGQ6Om1hcDxDTWVkaWFCdWZmZXIqLCBNZWRpYUJ1ZmZlckhlbHBlcio+IG1CdWZmZXJIZWxwZXJzOworcHVibGljOgorICAgIE1lZGlhQnVmZmVyR3JvdXBIZWxwZXIoQ01lZGlhQnVmZmVyR3JvdXAgKmdyb3VwKSB7CisgICAgICAgIG1Hcm91cCA9IGdyb3VwOworICAgIH0KKyAgICB+TWVkaWFCdWZmZXJHcm91cEhlbHBlcigpIHsKKyAgICAgICAgLy8gZGVsZXRlIGFsbCBlbnRyaWVzIGluIG1hcAorICAgICAgICBBTE9HVigiYnVmZmVyZ3JvdXAgJXAgbWFwIGhhcyAlenUgZW50cmllcyIsIHRoaXMsIG1CdWZmZXJIZWxwZXJzLnNpemUoKSk7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1CdWZmZXJIZWxwZXJzLmJlZ2luKCk7IGl0ICE9IG1CdWZmZXJIZWxwZXJzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBkZWxldGUgaXQtPnNlY29uZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIGluaXQoc2l6ZV90IGJ1ZmZlcnMsIHNpemVfdCBidWZmZXJfc2l6ZSwgc2l6ZV90IGdyb3d0aExpbWl0ID0gMCkgeworICAgICAgICByZXR1cm4gbUdyb3VwLT5pbml0KG1Hcm91cC0+aGFuZGxlLCBidWZmZXJzLCBidWZmZXJfc2l6ZSwgZ3Jvd3RoTGltaXQpOworICAgIH0KKyAgICB2b2lkIGFkZF9idWZmZXIoc2l6ZV90IHNpemUpIHsKKyAgICAgICAgbUdyb3VwLT5hZGRfYnVmZmVyKG1Hcm91cC0+aGFuZGxlLCBzaXplKTsKKyAgICB9CisgICAgbWVkaWFfc3RhdHVzX3QgYWNxdWlyZV9idWZmZXIoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgYm9vbCBub25CbG9ja2luZyA9IGZhbHNlLCBzaXplX3QgcmVxdWVzdGVkU2l6ZSA9IDApIHsKKyAgICAgICAgQ01lZGlhQnVmZmVyICpidWYgPSBudWxscHRyOworICAgICAgICBtZWRpYV9zdGF0dXNfdCByZXQgPQorICAgICAgICAgICAgICAgIG1Hcm91cC0+YWNxdWlyZV9idWZmZXIobUdyb3VwLT5oYW5kbGUsICZidWYsIG5vbkJsb2NraW5nLCByZXF1ZXN0ZWRTaXplKTsKKyAgICAgICAgaWYgKHJldCA9PSBBTUVESUFfT0sgJiYgYnVmICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGF1dG8gaGVscGVyID0gbUJ1ZmZlckhlbHBlcnMuZmluZChidWYpOworICAgICAgICAgICAgaWYgKGhlbHBlciA9PSBtQnVmZmVySGVscGVycy5lbmQoKSkgeworICAgICAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyKiBuZXdIZWxwZXIgPSBuZXcgTWVkaWFCdWZmZXJIZWxwZXIoYnVmKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVySGVscGVycy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoYnVmLCBuZXdIZWxwZXIpKTsKKyAgICAgICAgICAgICAgICAqYnVmZmVyID0gbmV3SGVscGVyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqYnVmZmVyID0gaGVscGVyLT5zZWNvbmQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBib29sIGhhc19idWZmZXJzKCkgeworICAgICAgICByZXR1cm4gbUdyb3VwLT5oYXNfYnVmZmVycyhtR3JvdXAtPmhhbmRsZSk7CisgICAgfQorfTsKKworY2xhc3MgTWVkaWFUcmFja0hlbHBlciB7CitwdWJsaWM6CisgICAgTWVkaWFUcmFja0hlbHBlcigpIDogbUJ1ZmZlckdyb3VwKG51bGxwdHIpIHsKKyAgICB9CisgICAgdmlydHVhbCB+TWVkaWFUcmFja0hlbHBlcigpIHsKKyAgICAgICAgZGVsZXRlIG1CdWZmZXJHcm91cDsKKyAgICB9CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpID0gMDsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0b3AoKSA9IDA7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICpmb3JtYXQpID0gMDsKKworICAgIGNsYXNzIFJlYWRPcHRpb25zIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGVudW0gU2Vla01vZGUgOiBpbnQzMl90IHsKKyAgICAgICAgICAgIFNFRUtfUFJFVklPVVNfU1lOQywKKyAgICAgICAgICAgIFNFRUtfTkVYVF9TWU5DLAorICAgICAgICAgICAgU0VFS19DTE9TRVNUX1NZTkMsCisgICAgICAgICAgICBTRUVLX0NMT1NFU1QsCisgICAgICAgICAgICBTRUVLX0ZSQU1FX0lOREVYLAorICAgICAgICB9OworCisgICAgICAgIFJlYWRPcHRpb25zKHVpbnQzMl90IG9wdGlvbnMsIGludDY0X3Qgc2Vla1Bvc1VzKSB7CisgICAgICAgICAgICBtT3B0aW9ucyA9IG9wdGlvbnM7CisgICAgICAgICAgICBtU2Vla1Bvc1VzID0gc2Vla1Bvc1VzOworICAgICAgICB9CisgICAgICAgIGJvb2wgZ2V0U2Vla1RvKGludDY0X3QgKnRpbWVfdXMsIFNlZWtNb2RlICptb2RlKSBjb25zdCB7CisgICAgICAgICAgICBpZiAoKG1PcHRpb25zICYgQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFSykgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICp0aW1lX3VzID0gbVNlZWtQb3NVczsKKyAgICAgICAgICAgICptb2RlID0gKFNlZWtNb2RlKSAobU9wdGlvbnMgJiA3KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGJvb2wgZ2V0Tm9uQmxvY2tpbmcoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbU9wdGlvbnMgJiBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpOT05CTE9DS0lORzsKKyAgICAgICAgfQorICAgIHByaXZhdGU6CisgICAgICAgIHVpbnQzMl90IG1PcHRpb25zOworICAgICAgICBpbnQ2NF90IG1TZWVrUG9zVXM7CisgICAgfTsKKworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNOb25CbG9ja2luZ1JlYWQoKSB7IHJldHVybiBmYWxzZTsgfQorcHJvdGVjdGVkOgorICAgIGZyaWVuZCBDTWVkaWFUcmFjayAqd3JhcChNZWRpYVRyYWNrSGVscGVyICp0cmFjayk7CisgICAgTWVkaWFCdWZmZXJHcm91cEhlbHBlciAqbUJ1ZmZlckdyb3VwOworfTsKKworaW5saW5lIENNZWRpYVRyYWNrICp3cmFwKE1lZGlhVHJhY2tIZWxwZXIgKnRyYWNrKSB7CisgICAgQ01lZGlhVHJhY2sgKndyYXBwZXIgPSAoQ01lZGlhVHJhY2sqKSBtYWxsb2Moc2l6ZW9mKENNZWRpYVRyYWNrKSk7CisgICAgd3JhcHBlci0+ZGF0YSA9IHRyYWNrOworICAgIHdyYXBwZXItPmZyZWUgPSBbXSh2b2lkICpkYXRhKSAtPiB2b2lkIHsKKyAgICAgICAgZGVsZXRlIChNZWRpYVRyYWNrSGVscGVyKikoZGF0YSk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5zdGFydCA9IFtdKHZvaWQgKmRhdGEsIENNZWRpYUJ1ZmZlckdyb3VwICpidWZmZXJHcm91cCkgLT4gbWVkaWFfc3RhdHVzX3QgeworICAgICAgICBpZiAoKChNZWRpYVRyYWNrSGVscGVyKilkYXRhKS0+bUJ1ZmZlckdyb3VwKSB7CisgICAgICAgICAgICAvLyB0aGlzIHNob3VsZG4ndCBoYXBwZW4sIGJ1dCBoYW5kbGUgaXQgYW55d2F5CisgICAgICAgICAgICBkZWxldGUgKChNZWRpYVRyYWNrSGVscGVyKilkYXRhKS0+bUJ1ZmZlckdyb3VwOworICAgICAgICB9CisgICAgICAgICgoTWVkaWFUcmFja0hlbHBlciopZGF0YSktPm1CdWZmZXJHcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwSGVscGVyKGJ1ZmZlckdyb3VwKTsKKyAgICAgICAgcmV0dXJuICgoTWVkaWFUcmFja0hlbHBlciopZGF0YSktPnN0YXJ0KCk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5zdG9wID0gW10odm9pZCAqZGF0YSkgLT4gbWVkaWFfc3RhdHVzX3QgeworICAgICAgICByZXR1cm4gKChNZWRpYVRyYWNrSGVscGVyKilkYXRhKS0+c3RvcCgpOworICAgIH07CisgICAgd3JhcHBlci0+Z2V0Rm9ybWF0ID0gW10odm9pZCAqZGF0YSwgQU1lZGlhRm9ybWF0ICptZXRhKSAtPiBtZWRpYV9zdGF0dXNfdCB7CisgICAgICAgIHJldHVybiAoKE1lZGlhVHJhY2tIZWxwZXIqKWRhdGEpLT5nZXRGb3JtYXQobWV0YSk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5yZWFkID0gW10odm9pZCAqZGF0YSwgQ01lZGlhQnVmZmVyICoqYnVmZmVyLCAgdWludDMyX3Qgb3B0aW9ucywgaW50NjRfdCBzZWVrUG9zVXMpCisgICAgICAgICAgICAtPiBtZWRpYV9zdGF0dXNfdCB7CisgICAgICAgIE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zIG9wdHMob3B0aW9ucywgc2Vla1Bvc1VzKTsKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZiA9IE5VTEw7CisgICAgICAgIG1lZGlhX3N0YXR1c190IHJldCA9ICgoTWVkaWFUcmFja0hlbHBlciopZGF0YSktPnJlYWQoJmJ1ZiwgJm9wdHMpOworICAgICAgICBpZiAocmV0ID09IEFNRURJQV9PSyAmJiBidWYgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgKmJ1ZmZlciA9IGJ1Zi0+bUJ1ZmZlcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH07CisgICAgd3JhcHBlci0+c3VwcG9ydHNOb25CbG9ja2luZ1JlYWQgPSBbXSh2b2lkICpkYXRhKSAtPiBib29sIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKChNZWRpYVRyYWNrSGVscGVyKilkYXRhKS0+c3VwcG9ydHNOb25CbG9ja2luZ1JlYWQoKTsKKyAgICB9OworICAgIHJldHVybiB3cmFwcGVyOworfQorCisKKy8vIGV4dHJhY3RvciBwbHVnaW5zIGNhbiBkZXJpdmUgZnJvbSB0aGlzIGNsYXNzIHdoaWNoIGxvb2tzIHJlbWFya2FibHkKKy8vIGxpa2UgTWVkaWFFeHRyYWN0b3IgYW5kIGNhbiBiZSBlYXNpbHkgd3JhcHBlZCBpbiB0aGUgcmVxdWlyZWQgQyBBUEkKK2NsYXNzIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB+TWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIoKSB7fQorICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCkgPSAwOworICAgIHZpcnR1YWwgTWVkaWFUcmFja0hlbHBlciAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KSA9IDA7CisKKyAgICBlbnVtIEdldFRyYWNrTWV0YURhdGFGbGFncyB7CisgICAgICAgIGtJbmNsdWRlRXh0ZW5zaXZlTWV0YURhdGEgPSAxCisgICAgfTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoCisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCisgICAgICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzID0gMCkgPSAwOworCisgICAgLy8gUmV0dXJuIGNvbnRhaW5lciBzcGVjaWZpYyBtZXRhLWRhdGEuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCisgICAgLy8gcmV0dXJucyBhbiBlbXB0eSBtZXRhZGF0YSBvYmplY3QuCisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpID0gMDsKKworICAgIGVudW0gRmxhZ3MgeworICAgICAgICBDQU5fU0VFS19CQUNLV0FSRCAgPSAxLCAgLy8gdGhlICJzZWVrIDEwc2VjcyBiYWNrIGJ1dHRvbiIKKyAgICAgICAgQ0FOX1NFRUtfRk9SV0FSRCAgID0gMiwgIC8vIHRoZSAic2VlayAxMHNlY3MgZm9yd2FyZCBidXR0b24iCisgICAgICAgIENBTl9QQVVTRSAgICAgICAgICA9IDQsCisgICAgICAgIENBTl9TRUVLICAgICAgICAgICA9IDgsICAvLyB0aGUgInNlZWsgYmFyIgorICAgIH07CisKKyAgICAvLyBJZiBzdWJjbGFzc2VzIGRvIF9ub3RfIG92ZXJyaWRlIHRoaXMsIHRoZSBkZWZhdWx0IGlzCisgICAgLy8gQ0FOX1NFRUtfQkFDS1dBUkQgfCBDQU5fU0VFS19GT1JXQVJEIHwgQ0FOX1NFRUsgfCBDQU5fUEFVU0UKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gQ0FOX1NFRUtfQkFDS1dBUkQgfCBDQU5fU0VFS19GT1JXQVJEIHwgQ0FOX1NFRUsgfCBDQU5fUEFVU0U7CisgICAgfTsKKworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgdWludDhfdCogLypjYXNUb2tlbiovLCBzaXplX3QgLypzaXplKi8pIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIjx1bnNwZWNpZmllZD4iOyB9CisKK3Byb3RlY3RlZDoKKyAgICBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlcigpIHt9CisKK3ByaXZhdGU6CisgICAgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIoY29uc3QgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgJik7CisgICAgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgJm9wZXJhdG9yPShjb25zdCBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciAmKTsKK307CisKK2lubGluZSBDTWVkaWFFeHRyYWN0b3IgKndyYXAoTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgKmV4dHJhY3RvcikgeworICAgIENNZWRpYUV4dHJhY3RvciAqd3JhcHBlciA9IChDTWVkaWFFeHRyYWN0b3IqKSBtYWxsb2Moc2l6ZW9mKENNZWRpYUV4dHJhY3RvcikpOworICAgIHdyYXBwZXItPmRhdGEgPSBleHRyYWN0b3I7CisgICAgd3JhcHBlci0+ZnJlZSA9IFtdKHZvaWQgKmRhdGEpIC0+IHZvaWQgeworICAgICAgICBkZWxldGUgKE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyKikoZGF0YSk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5jb3VudFRyYWNrcyA9IFtdKHZvaWQgKmRhdGEpIC0+IHNpemVfdCB7CisgICAgICAgIHJldHVybiAoKE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyKilkYXRhKS0+Y291bnRUcmFja3MoKTsKKyAgICB9OworICAgIHdyYXBwZXItPmdldFRyYWNrID0gW10odm9pZCAqZGF0YSwgc2l6ZV90IGluZGV4KSAtPiBDTWVkaWFUcmFjayogeworICAgICAgICByZXR1cm4gd3JhcCgoKE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyKilkYXRhKS0+Z2V0VHJhY2soaW5kZXgpKTsKKyAgICB9OworICAgIHdyYXBwZXItPmdldFRyYWNrTWV0YURhdGEgPSBbXSgKKyAgICAgICAgICAgIHZvaWQgKmRhdGEsCisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCisgICAgICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKSAtPiBtZWRpYV9zdGF0dXNfdCB7CisgICAgICAgIHJldHVybiAoKE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyKilkYXRhKS0+Z2V0VHJhY2tNZXRhRGF0YShtZXRhLCBpbmRleCwgZmxhZ3MpOworICAgIH07CisgICAgd3JhcHBlci0+Z2V0TWV0YURhdGEgPSBbXSgKKyAgICAgICAgICAgIHZvaWQgKmRhdGEsCisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEpIC0+IG1lZGlhX3N0YXR1c190IHsKKyAgICAgICAgcmV0dXJuICgoTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIqKWRhdGEpLT5nZXRNZXRhRGF0YShtZXRhKTsKKyAgICB9OworICAgIHdyYXBwZXItPmZsYWdzID0gW10oCisgICAgICAgICAgICB2b2lkICpkYXRhKSAtPiB1aW50MzJfdCB7CisgICAgICAgIHJldHVybiAoKE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyKilkYXRhKS0+ZmxhZ3MoKTsKKyAgICB9OworICAgIHdyYXBwZXItPnNldE1lZGlhQ2FzID0gW10oCisgICAgICAgICAgICB2b2lkICpkYXRhLCBjb25zdCB1aW50OF90ICpjYXNUb2tlbiwgc2l6ZV90IHNpemUpIC0+IG1lZGlhX3N0YXR1c190IHsKKyAgICAgICAgcmV0dXJuICgoTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIqKWRhdGEpLT5zZXRNZWRpYUNhcyhjYXNUb2tlbiwgc2l6ZSk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5uYW1lID0gW10oCisgICAgICAgICAgICB2b2lkICpkYXRhKSAtPiBjb25zdCBjaGFyICogeworICAgICAgICByZXR1cm4gKChNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciopZGF0YSktPm5hbWUoKTsKKyAgICB9OworICAgIHJldHVybiB3cmFwcGVyOworfQorCisvKiBhZGRzIHNvbWUgY29udmllbmNlIG1ldGhvZHMgKi8KK2NsYXNzIERhdGFTb3VyY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IERhdGFTb3VyY2VIZWxwZXIoQ0RhdGFTb3VyY2UgKmNzb3VyY2UpIHsKKyAgICAgICAgbVNvdXJjZSA9IGNzb3VyY2U7CisgICAgfQorCisgICAgZXhwbGljaXQgRGF0YVNvdXJjZUhlbHBlcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpIHsKKyAgICAgICAgbVNvdXJjZSA9IHNvdXJjZS0+bVNvdXJjZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5EYXRhU291cmNlSGVscGVyKCkge30KKworICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgICAgIHJldHVybiBtU291cmNlLT5yZWFkQXQobVNvdXJjZS0+aGFuZGxlLCBvZmZzZXQsIGRhdGEsIHNpemUpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKSB7CisgICAgICAgIHJldHVybiBtU291cmNlLT5nZXRTaXplKG1Tb3VyY2UtPmhhbmRsZSwgc2l6ZSk7CisgICAgfQorCisgICAgYm9vbCBnZXRVcmkoY2hhciAqdXJpU3RyaW5nLCBzaXplX3QgYnVmZmVyU2l6ZSkgeworICAgICAgICByZXR1cm4gbVNvdXJjZS0+Z2V0VXJpKG1Tb3VyY2UtPmhhbmRsZSwgdXJpU3RyaW5nLCBidWZmZXJTaXplKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgeworICAgICAgICByZXR1cm4gbVNvdXJjZS0+ZmxhZ3MobVNvdXJjZS0+aGFuZGxlKTsKKyAgICB9CisKKyAgICAvLyBDb252ZW5pZW5jZSBtZXRob2RzOgorICAgIGJvb2wgZ2V0VUludDE2KG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCkgeworICAgICAgICAqeCA9IDA7CisKKyAgICAgICAgdWludDhfdCBieXRlWzJdOworICAgICAgICBpZiAocmVhZEF0KG9mZnNldCwgYnl0ZSwgMikgIT0gMikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgKnggPSAoYnl0ZVswXSA8PCA4KSB8IGJ5dGVbMV07CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gMyBieXRlIGludCwgcmV0dXJuZWQgYXMgYSAzMi1iaXQgaW50CisgICAgYm9vbCBnZXRVSW50MjQob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KSB7CisgICAgICAgICp4ID0gMDsKKworICAgICAgICB1aW50OF90IGJ5dGVbM107CisgICAgICAgIGlmIChyZWFkQXQob2Zmc2V0LCBieXRlLCAzKSAhPSAzKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAqeCA9IChieXRlWzBdIDw8IDE2KSB8IChieXRlWzFdIDw8IDgpIHwgYnl0ZVsyXTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIGdldFVJbnQzMihvZmY2NF90IG9mZnNldCwgdWludDMyX3QgKngpIHsKKyAgICAgICAgKnggPSAwOworCisgICAgICAgIHVpbnQzMl90IHRtcDsKKyAgICAgICAgaWYgKHJlYWRBdChvZmZzZXQsICZ0bXAsIDQpICE9IDQpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgICp4ID0gbnRvaGwodG1wKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIGdldFVJbnQ2NChvZmY2NF90IG9mZnNldCwgdWludDY0X3QgKngpIHsKKyAgICAgICAgKnggPSAwOworCisgICAgICAgIHVpbnQ2NF90IHRtcDsKKyAgICAgICAgaWYgKHJlYWRBdChvZmZzZXQsICZ0bXAsIDgpICE9IDgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgICp4ID0gKCh1aW50NjRfdCludG9obCh0bXAgJiAweGZmZmZmZmZmKSA8PCAzMikgfCBudG9obCh0bXAgPj4gMzIpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIHJlYWQgZWl0aGVyIGludDxOPiBvciBpbnQ8Mk4+IGludG8gYSB1aW50PDJOPl90LCBzaXplIGlzIHRoZSBpbnQgc2l6ZSBpbiBieXRlcy4KKyAgICBib29sIGdldFVJbnQxNlZhcihvZmY2NF90IG9mZnNldCwgdWludDE2X3QgKngsIHNpemVfdCBzaXplKSB7CisgICAgICAgIGlmIChzaXplID09IDIpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRVSW50MTYob2Zmc2V0LCB4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2l6ZSA9PSAxKSB7CisgICAgICAgICAgICB1aW50OF90IHRtcDsKKyAgICAgICAgICAgIGlmIChyZWFkQXQob2Zmc2V0LCAmdG1wLCAxKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgKnggPSB0bXA7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgZ2V0VUludDMyVmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCAqeCwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgaWYgKHNpemUgPT0gNCkgeworICAgICAgICAgICAgcmV0dXJuIGdldFVJbnQzMihvZmZzZXQsIHgpOworICAgICAgICB9CisgICAgICAgIGlmIChzaXplID09IDIpIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHRtcDsKKyAgICAgICAgICAgIGlmIChnZXRVSW50MTYob2Zmc2V0LCAmdG1wKSkgeworICAgICAgICAgICAgICAgICp4ID0gdG1wOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIGdldFVJbnQ2NFZhcihvZmY2NF90IG9mZnNldCwgdWludDY0X3QgKngsIHNpemVfdCBzaXplKSB7CisgICAgICAgIGlmIChzaXplID09IDgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRVSW50NjQob2Zmc2V0LCB4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2l6ZSA9PSA0KSB7CisgICAgICAgICAgICB1aW50MzJfdCB0bXA7CisgICAgICAgICAgICBpZiAoZ2V0VUludDMyKG9mZnNldCwgJnRtcCkpIHsKKyAgICAgICAgICAgICAgICAqeCA9IHRtcDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgQ0RhdGFTb3VyY2UgKm1Tb3VyY2U7Cit9OworCisKKworLy8gaGVscGVycyB0byBjcmVhdGUgYSBtZWRpYV91dWlkX3QgZnJvbSBhIHN0cmluZyBsaXRlcmFsCisKKy8vIHB1cnBvc2VseSBub3QgZGVmaW5lZCBhbnl3aGVyZSBzbyB0aGF0IHRoaXMgd2lsbCBmYWlsIHRvIGxpbmsgaWYKKy8vIGV4cHJlc3Npb25zIGJlbG93IGFyZSBub3QgZXZhbHVhdGVkIGF0IGNvbXBpbGUgdGltZQoraW50IGludmFsaWRfdXVpZF9zdHJpbmcoY29uc3QgY2hhciAqKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgorY29uc3RleHByIHVpbnQ4X3QgX2RpZ2l0QXRfKGNvbnN0IFQgKCZzKVtOXSwgY29uc3Qgc2l6ZV90IG4pIHsKKyAgICByZXR1cm4gc1tuXSA+PSAnMCcgJiYgc1tuXSA8PSAnOScgPyBzW25dIC0gJzAnCisgICAgICAgICAgICA6IHNbbl0gPj0gJ2EnICYmIHNbbl0gPD0gJ2YnID8gc1tuXSAtICdhJyArIDEwCisgICAgICAgICAgICAgICAgICAgIDogc1tuXSA+PSAnQScgJiYgc1tuXSA8PSAnRicgPyBzW25dIC0gJ0EnICsgMTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGludmFsaWRfdXVpZF9zdHJpbmcoInV1aWQ6IGJhZCBkaWdpdHMiKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgorY29uc3RleHByIHVpbnQ4X3QgX2hleEJ5dGVBdF8oY29uc3QgVCAoJnMpW05dLCBzaXplX3QgbikgeworICAgIHJldHVybiAoX2RpZ2l0QXRfKHMsIG4pIDw8IDQpICsgX2RpZ2l0QXRfKHMsIG4gKyAxKTsKK30KKworY29uc3RleHByIGJvb2wgX2Fzc2VydElzRGFzaF8oY2hhciBjKSB7CisgICAgcmV0dXJuIGMgPT0gJy0nID8gdHJ1ZSA6IGludmFsaWRfdXVpZF9zdHJpbmcoIldyb25nIGZvcm1hdCIpOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IE4+Citjb25zdGV4cHIgbWVkaWFfdXVpZF90IGNvbnN0VVVJRChjb25zdCBjaGFyICgmcykgW05dKSB7CisgICAgc3RhdGljX2Fzc2VydChOID09IDM3LCAidXVpZDogd3JvbmcgbGVuZ3RoIik7CisgICAgcmV0dXJuCisgICAgICAgICAgICBfYXNzZXJ0SXNEYXNoXyhzWzhdKSwKKyAgICAgICAgICAgIF9hc3NlcnRJc0Rhc2hfKHNbMTNdKSwKKyAgICAgICAgICAgIF9hc3NlcnRJc0Rhc2hfKHNbMThdKSwKKyAgICAgICAgICAgIF9hc3NlcnRJc0Rhc2hfKHNbMjNdKSwKKyAgICAgICAgICAgIG1lZGlhX3V1aWRfdCB7eworICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDApLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDIpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDQpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDYpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDkpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDExKSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAxNCksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMTYpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDE5KSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAyMSksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMjQpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDI2KSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAyOCksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMzApLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDMyKSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAzNCksCisgICAgICAgICAgICB9fTsKK30KKy8vIENvbnZlbmllbmNlIG1hY3JvIHRvIGNyZWF0ZSBhIG1lZGlhX3V1aWRfdCBmcm9tIGEgc3RyaW5nIGxpdGVyYWwsIHdoaWNoIHNob3VsZAorLy8gYmUgZm9ybWF0dGVkIGFzICIxMjM0NTY3OC0xMjM0LTEyMzQtMTIzNC0xMjM0NTY3ODlhYmMiLCBhcyBnZW5lcmF0ZWQgYnkKKy8vIGUuZy4gaHR0cHM6Ly93d3cudXVpZGdlbmVyYXRvci5uZXQvIG9yIHRoZSAndXVpZGdlbicgbGludXggY29tbWFuZC4KKy8vIEhleCBkaWdpdHMgbWF5IGJlIHVwcGVyIG9yIGxvd2VyIGNhc2UuCisvLworLy8gVGhlIG1hY3JvIGNhbGwgaXMgb3RoZXJ3aXNlIGVxdWl2YWxlbnQgdG8gc3BlY2lmeWluZyB0aGUgc3RydWN0dXJlIGRpcmVjdGx5CisvLyAoZS5nLiBVVUlEKCI3ZDYxMzg1OC01ODM3LTRhMzgtODRjNS0zMzJkMWNkZGVlMjciKSBpcyB0aGUgc2FtZSBhcworLy8gICAgICAge3sweDdkLCAweDYxLCAweDM4LCAweDU4LCAweDU4LCAweDM3LCAweDRhLCAweDM4LAorLy8gICAgICAgICAweDg0LCAweGM1LCAweDMzLCAweDJkLCAweDFjLCAweGRkLCAweGVlLCAweDI3fX0pCisKKyNkZWZpbmUgVVVJRChzdHIpIFtdeyBjb25zdGV4cHIgbWVkaWFfdXVpZF90IHV1aWQgPSBjb25zdFVVSUQoc3RyKTsgcmV0dXJuIHV1aWQ7IH0oKQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX0VYVFJBQ1RPUl9QTFVHSU5fSEVMUEVSX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhTWV0cmljcy5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldHJpY3MuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi41Zjc1N2U0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldHJpY3MuaApAQCAtMCwwICsxIEBACisuLi8uLi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9NZWRpYU1ldHJpY3MuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDVhNjMyODdhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2suaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MjhhN2YKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2suaApAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfU09VUkNFX0JBU0VfSF8KKworI2RlZmluZSBNRURJQV9TT1VSQ0VfQkFTRV9IXworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTWVkaWFCdWZmZXJCYXNlOworc3RydWN0IENNZWRpYVRyYWNrOworCitjbGFzcyBTb3VyY2VCYXNlQWxsb2NUcmFja2VyIHsKK3B1YmxpYzoKKyAgICBTb3VyY2VCYXNlQWxsb2NUcmFja2VyKCkgeworICAgICAgICBBTE9HRCgic291cmNlYmFzZSBhbGxvY2F0ZWQ6ICVwIiwgdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgflNvdXJjZUJhc2VBbGxvY1RyYWNrZXIoKSB7CisgICAgICAgIEFMT0dEKCJzb3VyY2ViYXNlIGZyZWVkOiAlcCIsIHRoaXMpOworICAgIH0KK307CisKK3N0cnVjdCBNZWRpYVRyYWNrCisvLyAgICA6IHB1YmxpYyBTb3VyY2VCYXNlQWxsb2NUcmFja2VyCit7CisgICAgTWVkaWFUcmFjaygpOworCisgICAgLy8gVG8gYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgbWV0aG9kcyBvbiB0aGlzIG9iamVjdCwgZXhjZXB0CisgICAgLy8gZ2V0Rm9ybWF0KCkuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpID0gMDsKKworICAgIC8vIEFueSBibG9ja2luZyByZWFkIGNhbGwgcmV0dXJucyBpbW1lZGlhdGVseSB3aXRoIGEgcmVzdWx0IG9mIE5PX0lOSVQuCisgICAgLy8gSXQgaXMgYW4gZXJyb3IgdG8gY2FsbCBhbnkgbWV0aG9kcyBvdGhlciB0aGFuIHN0YXJ0IGFmdGVyIHRoaXMgY2FsbAorICAgIC8vIHJldHVybnMuIEFueSBidWZmZXJzIHRoZSBvYmplY3QgbWF5IGJlIGhvbGRpbmcgb250byBhdCB0aGUgdGltZSBvZgorICAgIC8vIHRoZSBzdG9wKCkgY2FsbCBhcmUgcmVsZWFzZWQuCisgICAgLy8gQWxzbywgaXQgaXMgaW1wZXJhdGl2ZSB0aGF0IGFueSBidWZmZXJzIG91dHB1dCBieSB0aGlzIG9iamVjdCBhbmQKKyAgICAvLyBoZWxkIG9udG8gYnkgY2FsbGVycyBiZSByZWxlYXNlZCBiZWZvcmUgYSBjYWxsIHRvIHN0b3AoKSAhISEKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSA9IDA7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBmb3JtYXQgb2YgdGhlIGRhdGEgb3V0cHV0IGJ5IHRoaXMgbWVkaWEgdHJhY2suCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlJiBmb3JtYXQpID0gMDsKKworICAgIC8vIE9wdGlvbnMgdGhhdCBtb2RpZnkgcmVhZCgpIGJlaGF2aW91ci4gVGhlIGRlZmF1bHQgaXMgdG8KKyAgICAvLyBhKSBub3QgcmVxdWVzdCBhIHNlZWsKKyAgICAvLyBiKSBub3QgYmUgbGF0ZSwgaS5lLiBsYXRlbmVzc191cyA9IDAKKyAgICBzdHJ1Y3QgUmVhZE9wdGlvbnMgeworICAgICAgICBlbnVtIFNlZWtNb2RlIDogaW50MzJfdCB7CisgICAgICAgICAgICBTRUVLX1BSRVZJT1VTX1NZTkMgPSBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkMsCisgICAgICAgICAgICBTRUVLX05FWFRfU1lOQyA9IENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUtfTkVYVF9TWU5DLAorICAgICAgICAgICAgU0VFS19DTE9TRVNUX1NZTkMgPSBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQywKKyAgICAgICAgICAgIFNFRUtfQ0xPU0VTVCA9IENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVCwKKyAgICAgICAgICAgIFNFRUtfRlJBTUVfSU5ERVggPSBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX0ZSQU1FX0lOREVYLAorICAgICAgICB9OworCisgICAgICAgIFJlYWRPcHRpb25zKCkgeworICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlc2V0IGV2ZXJ5dGhpbmcgYmFjayB0byBkZWZhdWx0cy4KKyAgICAgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgIG1PcHRpb25zID0gMDsKKyAgICAgICAgICAgIG1TZWVrVGltZVVzID0gMDsKKyAgICAgICAgICAgIG1Ob25CbG9ja2luZyA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRTZWVrVG8oaW50NjRfdCB0aW1lX3VzLCBTZWVrTW9kZSBtb2RlID0gU0VFS19DTE9TRVNUX1NZTkMpOworICAgICAgICB2b2lkIGNsZWFyU2Vla1RvKCkgeworICAgICAgICAgICAgbU9wdGlvbnMgJj0gfmtTZWVrVG9fT3B0aW9uOworICAgICAgICAgICAgbVNlZWtUaW1lVXMgPSAwOworICAgICAgICAgICAgbVNlZWtNb2RlID0gU0VFS19DTE9TRVNUX1NZTkM7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBnZXRTZWVrVG8oaW50NjRfdCAqdGltZV91cywgU2Vla01vZGUgKm1vZGUpIGNvbnN0OworCisgICAgICAgIHZvaWQgc2V0Tm9uQmxvY2tpbmcoKTsKKyAgICAgICAgdm9pZCBjbGVhck5vbkJsb2NraW5nKCk7CisgICAgICAgIGJvb2wgZ2V0Tm9uQmxvY2tpbmcoKSBjb25zdDsKKworICAgICAgICAvLyBVc2VkIHRvIGNsZWFyIGFsbCBub24tcGVyc2lzdGVudCBvcHRpb25zIGZvciBtdWx0aXBsZSBidWZmZXIgcmVhZHMuCisgICAgICAgIHZvaWQgY2xlYXJOb25QZXJzaXN0ZW50KCkgeworICAgICAgICAgICAgY2xlYXJTZWVrVG8oKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgZW51bSBPcHRpb25zIHsKKyAgICAgICAgICAgIGtTZWVrVG9fT3B0aW9uICAgICAgPSAxLAorICAgICAgICB9OworCisgICAgICAgIHVpbnQzMl90IG1PcHRpb25zOworICAgICAgICBpbnQ2NF90IG1TZWVrVGltZVVzOworICAgICAgICBTZWVrTW9kZSBtU2Vla01vZGU7CisgICAgICAgIGJvb2wgbU5vbkJsb2NraW5nOworICAgIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7IC8vIHNlbnQgdGhyb3VnaCBCaW5kZXIKKworICAgIC8vIFJldHVybnMgYSBuZXcgYnVmZmVyIG9mIGRhdGEuIENhbGwgYmxvY2tzIHVudGlsIGEKKyAgICAvLyBidWZmZXIgaXMgYXZhaWxhYmxlLCBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZCBvZiB0aGUgZW5kIG9mIHRoZSBzdHJlYW0KKyAgICAvLyBpcyByZWFjaGVkLgorICAgIC8vIEVuZCBvZiBzdHJlYW0gaXMgc2lnbmFsbGVkIGJ5IGEgcmVzdWx0IG9mIEVSUk9SX0VORF9PRl9TVFJFQU0uCisgICAgLy8gQSByZXN1bHQgb2YgSU5GT19GT1JNQVRfQ0hBTkdFRCBpbmRpY2F0ZXMgdGhhdCB0aGUgZm9ybWF0IG9mIHRoaXMKKyAgICAvLyBNZWRpYVNvdXJjZSBoYXMgY2hhbmdlZCBtaWQtc3RyZWFtLCB0aGUgY2xpZW50IGNhbiBjb250aW51ZSByZWFkaW5nCisgICAgLy8gYnV0IHNob3VsZCBiZSBwcmVwYXJlZCBmb3IgYnVmZmVycyBvZiB0aGUgbmV3IGNvbmZpZ3VyYXRpb24uCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpID0gMDsKKworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB8cmVhZHwgc3VwcG9ydHMgbm9uYmxvY2tpbmcgb3B0aW9uLCBvdGhlcndpc2UgZmFsc2UuCisgICAgLy8gfHJlYWRNdWx0aXBsZXwgaWYgc3VwcG9ydGVkLCBhbHdheXMgYWxsb3dzIHRoZSBub25ibG9ja2luZyBvcHRpb24uCisgICAgdmlydHVhbCBib29sIHN1cHBvcnROb25ibG9ja2luZ1JlYWQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5NZWRpYVRyYWNrKCk7CisKK3ByaXZhdGU6CisgICAgTWVkaWFUcmFjayhjb25zdCBNZWRpYVRyYWNrICYpOworICAgIE1lZGlhVHJhY2sgJm9wZXJhdG9yPShjb25zdCBNZWRpYVRyYWNrICYpOworfTsKKworY2xhc3MgTWVkaWFUcmFja0NVbndyYXBwZXIgOiBwdWJsaWMgTWVkaWFUcmFjayB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgTWVkaWFUcmFja0NVbndyYXBwZXIoQ01lZGlhVHJhY2sgKndyYXBwZXIpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSYgZm9ybWF0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworCisgICAgdmlydHVhbCBib29sIHN1cHBvcnROb25ibG9ja2luZ1JlYWQoKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk1lZGlhVHJhY2tDVW53cmFwcGVyKCk7CisKK3ByaXZhdGU6CisgICAgQ01lZGlhVHJhY2sgKndyYXBwZXI7CisgICAgTWVkaWFCdWZmZXJHcm91cCAqYnVmZmVyR3JvdXA7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX1NPVVJDRV9CQVNFX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL05ka01lZGlhRXJyb3JQcml2LmggYi9pbmNsdWRlL21lZGlhL05ka01lZGlhRXJyb3JQcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JiYmE3OQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFcnJvclByaXYuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTkRLX01FRElBX0VSUk9SX1BSSVZfSAorI2RlZmluZSBfTkRLX01FRElBX0VSUk9SX1BSSVZfSAorCisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvci5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCittZWRpYV9zdGF0dXNfdCB0cmFuc2xhdGVfZXJyb3IoYW5kcm9pZDo6c3RhdHVzX3QpOworCithbmRyb2lkOjpzdGF0dXNfdCByZXZlcnNlX3RyYW5zbGF0ZV9lcnJvcihtZWRpYV9zdGF0dXNfdCk7CisKKyNlbmRpZiAvLyBfTkRLX01FRElBX0VSUk9SX1BSSVZfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaCBiL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZkYTRhOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2LmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyBhbiBOREsgQVBJLgorICogRG8gbm90IHJlbW92ZSBtZXRob2RzLgorICogRG8gbm90IGNoYW5nZSBtZXRob2Qgc2lnbmF0dXJlcy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGNvbnN0YW50cy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHNpemUgb2YgYW55IG9mIHRoZSBjbGFzc2VzIGRlZmluZWQgaW4gaGVyZS4KKyAqIERvIG5vdCByZWZlcmVuY2UgdHlwZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIE5ESy4KKyAqIERvIG5vdCAjaW5jbHVkZSBmaWxlcyB0aGF0IGFyZW4ndCBwYXJ0IG9mIHRoZSBOREsuCisgKi8KKworI2lmbmRlZiBfTkRLX01FRElBX0ZPUk1BVF9QUklWX0gKKyNkZWZpbmUgX05ES19NRURJQV9GT1JNQVRfUFJJVl9ICisKKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBBTWVkaWFGb3JtYXQgeworICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OkFNZXNzYWdlPiBtRm9ybWF0OworICAgIGFuZHJvaWQ6OlN0cmluZzggbURlYnVnOworICAgIGFuZHJvaWQ6OktleWVkVmVjdG9yPGFuZHJvaWQ6OlN0cmluZzgsIGFuZHJvaWQ6OlN0cmluZzg+IG1TdHJpbmdDYWNoZTsKK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitBTWVkaWFGb3JtYXQqIEFNZWRpYUZvcm1hdF9mcm9tTXNnKHNwPEFNZXNzYWdlPiAqKTsKK3ZvaWQgQU1lZGlhRm9ybWF0X2dldEZvcm1hdChjb25zdCBBTWVkaWFGb3JtYXQqIG1EYXRhLCBzcDxBTWVzc2FnZT4gKmRlc3QpOworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTkRLX01FRElBX0ZPUk1BVF9QUklWX0gKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9UaW1lQ2hlY2suaCBiL2luY2x1ZGUvbWVkaWEvVGltZUNoZWNrLmgKaW5kZXggZTNlZjEzNC4uODVlMTdmOSAxMjAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9UaW1lQ2hlY2suaAorKysgYi9pbmNsdWRlL21lZGlhL1RpbWVDaGVjay5oCkBAIC0xICsxIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1RpbWVDaGVjay5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorLi4vLi4vbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1RpbWVDaGVjay5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9Wb3JiaXNDb21tZW50LmggYi9pbmNsdWRlL21lZGlhL1ZvcmJpc0NvbW1lbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggYWRhYTQ4OS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL1ZvcmJpc0NvbW1lbnQuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvVm9yYmlzQ29tbWVudC5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaCBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKaW5kZXggY2ExMTlkNS4uNWYxOWY3NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaAorKysgYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCkBAIC01MzgsNiArNTM4LDEwIEBACiAgICAgICAgIG1UaW1lc3RhbXBNdXRhdG9yLnB1c2godGltZXN0YW1wKTsKICAgICB9CiAKKyAgICB2aXJ0dWFsIEV4dGVuZGVkVGltZXN0YW1wIGdldFRpbWVzdGFtcCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UaW1lc3RhbXBNdXRhdG9yLmxhc3QoKTsKKyAgICB9CisKICAgICAvLyBGbHVzaGVzIHRoZSBzaGFyZWQgcmluZyBidWZmZXIgaWYgdGhlIGNsaWVudCBoYWQgcmVxdWVzdGVkIGl0IHVzaW5nIG1TdHJlYW1pbmcubUZsdXNoLgogICAgIC8vIElmIGZsdXNoIG9jY3VycyB0aGVuOgogICAgIC8vICAgY2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udCwgU2VydmVyUHJveHk6Om1GbHVzaCBhbmQgU2VydmVyUHJveHk6Om1GbHVzaGVkIHdpbGwgYmUgbW9kaWZpZWQKQEAgLTU1MSw2ICs1NTUsOSBAQAogICAgIC8vIFRvdGFsIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgZmx1c2hlZCBmcmFtZXMgc2luY2UgY3JlYXRpb24gKG5ldmVyIHJlc2V0KS4KICAgICB2aXJ0dWFsIGludDY0X3QgICAgIGZyYW1lc0ZsdXNoZWQoKSBjb25zdCB7IHJldHVybiBtRmx1c2hlZDsgfQogCisgICAgLy8gU2FmZSBmcmFtZXMgcmVhZHkgcXVlcnkgd2l0aCBubyBzaWRlIGVmZmVjdHMuCisgICAgdmlydHVhbCBzaXplX3QgICAgICBmcmFtZXNSZWFkeVNhZmUoKSBjb25zdCA9IDA7CisKICAgICAvLyBHZXQgZHluYW1pYyBidWZmZXIgc2l6ZSBmcm9tIHRoZSBzaGFyZWQgY29udHJvbCBibG9jay4KICAgICB1aW50MzJfdCAgICAgICAgICAgIGdldEJ1ZmZlclNpemVJbkZyYW1lcygpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCgoaW50MzJfdCAqKSZtQ2Jsay0+bUJ1ZmZlclNpemVJbkZyYW1lcyk7CkBAIC01ODgsOCArNTk1LDcgQEAKICAgICAvLyB3aGljaCBtYXkgaW5jbHVkZSBub24tY29udGlndW91cyBmcmFtZXMKICAgICB2aXJ0dWFsIHNpemVfdCAgICAgIGZyYW1lc1JlYWR5KCk7CiAKLSAgICAvLyBTYWZlIGZyYW1lcyByZWFkeSBxdWVyeSB1c2VkIGJ5IGR1bXAoKSAtIHRoaXMgaGFzIG5vIHNpZGUgZWZmZWN0cy4KLSAgICB2aXJ0dWFsIHNpemVfdCAgICAgIGZyYW1lc1JlYWR5U2FmZSgpIGNvbnN0OworICAgIHNpemVfdCAgICAgICAgICAgICAgZnJhbWVzUmVhZHlTYWZlKCkgY29uc3Qgb3ZlcnJpZGU7IC8vIGZyYW1lcyBhdmFpbGFibGUgdG8gcmVhZCBieSBzZXJ2ZXIuCiAKICAgICAvLyBDdXJyZW50bHkgQXVkaW9GbGluZ2VyIHdpbGwgY2FsbCBmcmFtZXNSZWFkeSgpIGZvciBhIGZhc3QgdHJhY2sgZnJvbSB0d28gdGhyZWFkczoKICAgICAvLyBGYXN0TWl4ZXIgdGhyZWFkLCBhbmQgbm9ybWFsIG1peGVyIHRocmVhZC4gIFRoaXMgaXMgZGFuZ2Vyb3VzLCBhcyB0aGUgcHJveHkgaXMgaW50ZW5kZWQKQEAgLTY5Myw2ICs2OTksOCBAQAogICAgICAgICByZXR1cm4gbUNibGstPnUubVN0cmVhbWluZy5tUmVhcjsgLy8gRm9yIGNvbXBsZXRlbmVzcyBvbmx5OyBtUmVhciB3cml0dGVuIGJ5IHNlcnZlci4KICAgICB9CiAKKyAgICBzaXplX3QgZnJhbWVzUmVhZHlTYWZlKCkgY29uc3Qgb3ZlcnJpZGU7IC8vIGZyYW1lcyBhdmFpbGFibGUgdG8gcmVhZCBieSBjbGllbnQuCisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BdWRpb1JlY29yZFNlcnZlclByb3h5KCkgeyB9CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5oIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5oCmluZGV4IDVmZDhlYjIuLmMzNTdjYWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuaAorKysgYi9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmgKQEAgLTQwLDYgKzQwLDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0UmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YU1lbW9yeSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpID0gMDsKIAogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmggYi9pbmNsdWRlL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuaAppbmRleCA3YTI5ZTMxLi4yZTJmZjdhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuaAorKysgYi9pbmNsdWRlL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuaApAQCAtNTIsNiArNTIsNyBAQAogCiAgICAgICAgICAgICBzdGF0dXNfdCBzdGFydFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSwgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFNZW1vcnkpOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RvcFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CisgICAgICAgICAgICBzdGF0dXNfdCBnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CiAKICAgICAgICAgICAgIC8vIEJwU291bmRUcmlnZ2VyQ2xpZW50CiAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgb25SZWNvZ25pdGlvbkV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSk7CmRpZmYgLS1naXQgYS9tZWRpYS9PV05FUlMgYi9tZWRpYS9PV05FUlMKaW5kZXggMWY2ODdhMi4uMWUyZDEyMyAxMDA2NDQKLS0tIGEvbWVkaWEvT1dORVJTCisrKyBiL21lZGlhL09XTkVSUwpAQCAtMiw4ICsyLDEwIEBACiBkd2thbmdAZ29vZ2xlLmNvbQogZWxhdXJlbnRAZ29vZ2xlLmNvbQogZXNzaWNrQGdvb2dsZS5jb20KK2drYXN0ZW5AZ29vZ2xlLmNvbQogaGt1YW5nQGdvb2dsZS5jb20KIGh1bmdhQGdvb2dsZS5jb20KK2ppYWJpbkBnb29nbGUuY29tCiBqbXRyaXZpQGdvb2dsZS5jb20KIGtyb2NhcmRAZ29vZ2xlLmNvbQogbGFqb3NAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5tayBiL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsKaW5kZXggNzBjMjgxYS4uZjA1Yzg0YiAxMDA2NDQKLS0tIGEvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5taworKysgYi9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLm1rCkBAIC00LDcgKzQsNiBAQAogCiBMT0NBTF9TUkNfRklMRVMgOj0gXAogCW1haW5fYXVkaW9zZXJ2ZXIuY3BwIFwKLQkuLi9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvUmVjb3JkLmFpZGwKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAJbGliYWF1ZGlvc2VydmljZSBcCkBAIC0xOCw2ICsxNyw3IEBACiAJbGlibWVkaWEgXAogCWxpYm1lZGlhbG9nc2VydmljZSBcCiAJbGlibmJhaW8gXAorCWxpYm5ibG9nIFwKIAlsaWJzb3VuZHRyaWdnZXJzZXJ2aWNlIFwKIAlsaWJ1dGlscwogCkBAIC00MCw5ICs0MCw2IEBACiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCiAJZXh0ZXJuYWwvc29uaWMgXAogCi1MT0NBTF9BSURMX0lOQ0xVREVTIDo9IFwKLSAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsCi0KICMgSWYgQVVESU9TRVJWRVJfTVVMVElMSUIgaW4gZGV2aWNlLm1rIGlzIG5vbi1lbXB0eSB0aGVuIGl0IGlzIHVzZWQgdG8gY29udHJvbAogIyB0aGUgTE9DQUxfTVVMVElMSUIgZm9yIGFsbCBhdWRpb3NlcnZlciBleGNsdXNpdmUgbGlicmFyaWVzLgogIyBUaGlzIGlzIHJlbGV2YW50IGZvciA2NCBiaXQgYXJjaGl0ZWN0dXJlcyB3aGVyZSBlaXRoZXIgb3IgYm90aApAQCAtNTQsMTMgKzUxLDkgQEAKICMgICBib3RoICAgIHRvIGJ1aWxkIGJvdGggMzIgYml0IGFuZCA2NCBiaXQgbGlicmFyaWVzLAogIyAgICAgICAgICAgYW5kIHVzZSBwcmltYXJ5IHRhcmdldCBhcmNoaXRlY3R1cmUgKDMyIG9yIDY0KSBmb3IgYXVkaW9zZXJ2ZXIuCiAjICAgZmlyc3QgICB0byBidWlsZCBsaWJyYXJpZXMgYW5kIGF1ZGlvc2VydmVyIGZvciB0aGUgcHJpbWFyeSB0YXJnZXQgYXJjaGl0ZWN0dXJlIG9ubHkuCi0jICAgPGVtcHR5PiB0byBidWlsZCBib3RoIDMyIGFuZCA2NCBiaXQgbGlicmFyaWVzIGFuZCAzMiBiaXQgYXVkaW9zZXJ2ZXIuCisjICAgPGVtcHR5PiB0byBidWlsZCBib3RoIDMyIGFuZCA2NCBiaXQgbGlicmFyaWVzIGFuZCBwcmltYXJ5IHRhcmdldCBhdWRpb3NlcnZlci4KIAotaWZlcSAoJChzdHJpcCAkKEFVRElPU0VSVkVSX01VTFRJTElCKSksKQotTE9DQUxfTVVMVElMSUIgOj0gMzIKLWVsc2UKIExPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCi1lbmRpZgogCiBMT0NBTF9NT0RVTEUgOj0gYXVkaW9zZXJ2ZXIKIApkaWZmIC0tZ2l0IGEvbWVkaWEvYXVkaW9zZXJ2ZXIvYXVkaW9zZXJ2ZXIucmMgYi9tZWRpYS9hdWRpb3NlcnZlci9hdWRpb3NlcnZlci5yYwppbmRleCAxZjJlODJmLi5mMWU4MTViIDEwMDY0NAotLS0gYS9tZWRpYS9hdWRpb3NlcnZlci9hdWRpb3NlcnZlci5yYworKysgYi9tZWRpYS9hdWRpb3NlcnZlci9hdWRpb3NlcnZlci5yYwpAQCAtNyw2ICs3LDcgQEAKICAgICBpb3ByaW8gcnQgNAogICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MgL2Rldi9zdHVuZS9mb3JlZ3JvdW5kL3Rhc2tzCiAgICAgb25yZXN0YXJ0IHJlc3RhcnQgdmVuZG9yLmF1ZGlvLWhhbC0yLTAKKyAgICBvbnJlc3RhcnQgcmVzdGFydCB2ZW5kb3IuYXVkaW8taGFsLTQtMC1tc2QKICAgICAjIEtlZXAgdGhlIG9yaWdpbmFsIHNlcnZpY2UgbmFtZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aGVuIHVwZ3JhZGluZwogICAgICMgTy1NUjEgZGV2aWNlcyB3aXRoIGZyYW1ld29yay1vbmx5LgogICAgIG9ucmVzdGFydCByZXN0YXJ0IGF1ZGlvLWhhbC0yLTAKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29yLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWRmYzA4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3IuY3BwCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbENvbm5lY3Rpb24iCisKKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorI2luY2x1ZGUgIkFjY2Vzc29ySW1wbC5oIgorI2luY2x1ZGUgIkNvbm5lY3Rpb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit2b2lkIENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDo6YWRkKAorICAgICAgICBpbnQ2NF90IGNvbm5lY3Rpb25JZCwKKyAgICAgICAgY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvcikgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobUFjY2Vzc29ycy5maW5kKGNvbm5lY3Rpb25JZCkgPT0gbUFjY2Vzc29ycy5lbmQoKSkgeworICAgICAgICBtQWNjZXNzb3JzLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25uZWN0aW9uSWQsIGFjY2Vzc29yKSk7CisgICAgfQorfQorCit2b2lkIENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDo6cmVtb3ZlKGludDY0X3QgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIG1BY2Nlc3NvcnMuZXJhc2UoY29ubmVjdGlvbklkKTsKKyAgICBhdXRvIGl0ID0gbUNvbm5lY3Rpb25Ub0Nvb2tpZS5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgaWYgKGl0ICE9IG1Db25uZWN0aW9uVG9Db29raWUuZW5kKCkpIHsKKyAgICAgICAgdWludDY0X3QgY29va2llID0gaXQtPnNlY29uZDsKKyAgICAgICAgbUNvbm5lY3Rpb25Ub0Nvb2tpZS5lcmFzZShpdCk7CisgICAgICAgIGF1dG8gY2l0ID0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZmluZChjb29raWUpOworICAgICAgICBpZiAoY2l0ICE9IG1Db29raWVUb0Nvbm5lY3Rpb25zLmVuZCgpKSB7CisgICAgICAgICAgICBjaXQtPnNlY29uZC5lcmFzZShjb25uZWN0aW9uSWQpOworICAgICAgICAgICAgaWYgKGNpdC0+c2Vjb25kLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbUNvb2tpZVRvQ29ubmVjdGlvbnMuZXJhc2UoY2l0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ6OmFkZENvb2tpZVRvQ29ubmVjdGlvbigKKyAgICAgICAgdWludDY0X3QgY29va2llLAorICAgICAgICBpbnQ2NF90IGNvbm5lY3Rpb25JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobUFjY2Vzc29ycy5maW5kKGNvbm5lY3Rpb25JZCkgPT0gbUFjY2Vzc29ycy5lbmQoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1Db25uZWN0aW9uVG9Db29raWUuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvbm5lY3Rpb25JZCwgY29va2llKSk7CisgICAgYXV0byBpdCA9IG1Db29raWVUb0Nvbm5lY3Rpb25zLmZpbmQoY29va2llKTsKKyAgICBpZiAoaXQgIT0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgaXQtPnNlY29uZC5pbnNlcnQoY29ubmVjdGlvbklkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQ29va2llVG9Db25uZWN0aW9ucy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgY29va2llLCBzdGQ6OnNldDxpbnQ2NF90Pntjb25uZWN0aW9uSWR9KSk7CisgICAgfQorfQorCit2b2lkIENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDo6c2VydmljZURpZWQoCisgICAgICAgIHVpbnQ2NF90IGNvb2tpZSwKKyAgICAgICAgY29uc3Qgd3A8OjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIC8qIHdobyAqLworICAgICAgICApIHsKKyAgICBzdGQ6Om1hcDxpbnQ2NF90LCBjb25zdCB3cDxBY2Nlc3Nvcj4+IGNvbm5lY3Rpb25zVG9DbG9zZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKworICAgICAgICBhdXRvIGl0ID0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZmluZChjb29raWUpOworICAgICAgICBpZiAoaXQgIT0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byBjb25JdCA9IGl0LT5zZWNvbmQuYmVnaW4oKTsgY29uSXQgIT0gaXQtPnNlY29uZC5lbmQoKTsgKytjb25JdCkgeworICAgICAgICAgICAgICAgIGF1dG8gYWNjZXNzb3JJdCA9IG1BY2Nlc3NvcnMuZmluZCgqY29uSXQpOworICAgICAgICAgICAgICAgIGlmIChhY2Nlc3Nvckl0ICE9IG1BY2Nlc3NvcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnNUb0Nsb3NlLmluc2VydChzdGQ6Om1ha2VfcGFpcigqY29uSXQsIGFjY2Vzc29ySXQtPnNlY29uZCkpOworICAgICAgICAgICAgICAgICAgICBtQWNjZXNzb3JzLmVyYXNlKGFjY2Vzc29ySXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ29ubmVjdGlvblRvQ29va2llLmVyYXNlKCpjb25JdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29va2llVG9Db25uZWN0aW9ucy5lcmFzZShpdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY29ubmVjdGlvbnNUb0Nsb3NlLnNpemUoKSA+IDApIHsKKyAgICAgICAgc3A8QWNjZXNzb3I+IGFjY2Vzc29yOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBjb25uZWN0aW9uc1RvQ2xvc2UuYmVnaW4oKTsgaXQgIT0gY29ubmVjdGlvbnNUb0Nsb3NlLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBhY2Nlc3NvciA9IGl0LT5zZWNvbmQucHJvbW90ZSgpOworCisgICAgICAgICAgICBpZiAoYWNjZXNzb3IpIHsKKyAgICAgICAgICAgICAgICBhY2Nlc3Nvci0+Y2xvc2UoaXQtPmZpcnN0KTsKKyAgICAgICAgICAgICAgICBBTE9HRCgiY29ubmVjdGlvbiAlbGxkIGNsb3NlZCBvbiBkZWF0aCIsIChsb25nIGxvbmcpaXQtPmZpcnN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworbmFtZXNwYWNlIHsKK3N0YXRpYyBzcDxDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ+IHNDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQgPQorICAgICAgICBuZXcgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50KCk7Cit9CisKK3NwPENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudD4gQWNjZXNzb3I6OmdldENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCgpIHsKKyAgICByZXR1cm4gc0Nvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDsKK30KKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQWNjZXNzb3IgZm9sbG93LgorUmV0dXJuPHZvaWQ+IEFjY2Vzc29yOjpjb25uZWN0KGNvbm5lY3RfY2IgX2hpZGxfY2IpIHsKKyAgICBzcDxDb25uZWN0aW9uPiBjb25uZWN0aW9uOworICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQ7CisgICAgY29uc3QgUXVldWVEZXNjcmlwdG9yKiBmbXFEZXNjOworCisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IGNvbm5lY3QoJmNvbm5lY3Rpb24sICZjb25uZWN0aW9uSWQsICZmbXFEZXNjLCBmYWxzZSk7CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIF9oaWRsX2NiKHN0YXR1cywgY29ubmVjdGlvbiwgY29ubmVjdGlvbklkLCAqZm1xRGVzYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBudWxscHRyLCAtMUxMLAorICAgICAgICAgICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzxCdWZmZXJTdGF0dXNNZXNzYWdlPigKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhbmRyb2lkOjpoYXJkd2FyZTo6R3JhbnRvckRlc2NyaXB0b3I+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBuaGFuZGxlICovLCAwIC8qIHNpemUgKi8pKTsKKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworQWNjZXNzb3I6OkFjY2Vzc29yKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yKQorICAgIDogbUltcGwobmV3IEltcGwoYWxsb2NhdG9yKSkge30KKworQWNjZXNzb3I6On5BY2Nlc3NvcigpIHsKK30KKworYm9vbCBBY2Nlc3Nvcjo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gKGJvb2wpbUltcGw7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6YWxsb2NhdGUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+YWxsb2NhdGUoY29ubmVjdGlvbklkLCBwYXJhbXMsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpmZXRjaCgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+ZmV0Y2goY29ubmVjdGlvbklkLCB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6Y29ubmVjdCgKKyAgICAgICAgc3A8Q29ubmVjdGlvbj4gKmNvbm5lY3Rpb24sIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCwKKyAgICAgICAgY29uc3QgUXVldWVEZXNjcmlwdG9yKiogZm1xRGVzY1B0ciwgYm9vbCBsb2NhbCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUltcGwtPmNvbm5lY3QodGhpcywgY29ubmVjdGlvbiwgcENvbm5lY3Rpb25JZCwgZm1xRGVzY1B0cik7CisgICAgICAgIGlmICghbG9jYWwgJiYgc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIHNwPEFjY2Vzc29yPiBhY2Nlc3Nvcih0aGlzKTsKKyAgICAgICAgICAgIHNDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQtPmFkZCgqcENvbm5lY3Rpb25JZCwgYWNjZXNzb3IpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OmNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1JbXBsLT5jbG9zZShjb25uZWN0aW9uSWQpOworICAgICAgICBzQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50LT5yZW1vdmUoY29ubmVjdGlvbklkKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIG1JbXBsLT5jbGVhblVwKGNsZWFyQ2FjaGUpOworICAgIH0KK30KKworLy9JQWNjZXNzb3IqIEhJRExfRkVUQ0hfSUFjY2Vzc29yKGNvbnN0IGNoYXIqIC8qIG5hbWUgKi8pIHsKKy8vICAgIHJldHVybiBuZXcgQWNjZXNzb3IoKTsKKy8vfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3Nvci5oIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjg2ZjdiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3IuaApAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQUNDRVNTT1JfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9BQ0NFU1NPUl9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0lBY2Nlc3Nvci5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgIkJ1ZmZlclN0YXR1cy5oIgorCisjaW5jbHVkZSA8c2V0PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworc3RydWN0IEFjY2Vzc29yOworc3RydWN0IENvbm5lY3Rpb247CisKKy8qKgorICogUmVjZWl2ZXMgZGVhdGggbm90aWZpY2F0aW9ucyBmcm9tIHJlbW90ZSBjb25uZWN0aW9ucy4KKyAqIE9uIGRlYXRoIG5vdGlmaWNhdGlvbnMsIHRoZSBjb25uZWN0aW9ucyBhcmUgY2xvc2VkIGFuZCB1c2VkIHJlc291cmNlcworICogYXJlIHJlbGVhc2VkLgorICovCitzdHJ1Y3QgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50IDogcHVibGljIGhhcmR3YXJlOjpoaWRsX2RlYXRoX3JlY2lwaWVudCB7CisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgbmV3bHkgY29ubmVjdGVkIGNvbm5lY3Rpb24gZnJvbSByZW1vdGUgcHJvY2Vzc2VzLgorICAgICAqLworICAgIHZvaWQgYWRkKGludDY0X3QgY29ubmVjdGlvbklkLCBjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYSBjb25uZWN0aW9uLgorICAgICAqLworICAgIHZvaWQgcmVtb3ZlKGludDY0X3QgY29ubmVjdGlvbklkKTsKKworICAgIHZvaWQgYWRkQ29va2llVG9Db25uZWN0aW9uKHVpbnQ2NF90IGNvb2tpZSwgaW50NjRfdCBjb25uZWN0aW9uSWQpOworCisgICAgdmlydHVhbCB2b2lkIHNlcnZpY2VEaWVkKAorICAgICAgICAgICAgdWludDY0X3QgLyogY29va2llICovLAorICAgICAgICAgICAgY29uc3Qgd3A8OjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIC8qIHdobyAqLworICAgICAgICAgICAgKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgIHN0ZDo6bWFwPHVpbnQ2NF90LCBzdGQ6OnNldDxpbnQ2NF90Pj4gIG1Db29raWVUb0Nvbm5lY3Rpb25zOworICAgIHN0ZDo6bWFwPGludDY0X3QsIHVpbnQ2NF90PiBtQ29ubmVjdGlvblRvQ29va2llOworICAgIHN0ZDo6bWFwPGludDY0X3QsIGNvbnN0IHdwPEFjY2Vzc29yPj4gbUFjY2Vzc29yczsKK307CisKKy8qKgorICogQSBidWZmZXIgcG9vbCBhY2Nlc3NvciB3aGljaCBlbmFibGVzIGEgYnVmZmVyIHBvb2wgdG8gY29tbXVuaWNhdGUgd2l0aCBidWZmZXIKKyAqIHBvb2wgY2xpZW50cy4gMToxIGNvcnJlc3BvbmRlbnNlIGhvbGRzIGJldHdlZW4gYSBidWZmZXIgcG9vbCBhbmQgYW4gYWNjZXNzb3IuCisgKi8KK3N0cnVjdCBBY2Nlc3NvciA6IHB1YmxpYyBJQWNjZXNzb3IgeworICAgIC8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUFjY2Vzc29yIGZvbGxvdy4KKyAgICBSZXR1cm48dm9pZD4gY29ubmVjdChjb25uZWN0X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBidWZmZXIgcG9vbCBhY2Nlc3NvciB3aGljaCB1c2VzIHRoZSBzcGVjaWZpZWQgYWxsb2NhdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGFsbG9jYXRvciBidWZmZXIgYWxsb2NhdG9yLgorICAgICAqLworICAgIGV4cGxpY2l0IEFjY2Vzc29yKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yKTsKKworICAgIC8qKiBEZXN0cnVjdHMgYSBidWZmZXIgcG9vbCBhY2Nlc3Nvci4gKi8KKyAgICB+QWNjZXNzb3IoKTsKKworICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGFjY2Vzc29yIGlzIHZhbGlkLiAqLworICAgIGJvb2wgaXNWYWxpZCgpOworCisgICAgLyoqIEFsbG9jYXRlcyBhIGJ1ZmZlciBmcm9tIGEgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgY29ubmVjdGlvbiBpZCBvZiB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSBwYXJhbXMgICAgICAgIHRoZSBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgdGhlIGlkIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgICAgIHRoZSBuYXRpdmUgaGFuZGxlIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIGlzIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsCisgICAgICAgICAgICBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpOworCisgICAgLyoqCisgICAgICogRmV0Y2hlcyBhIGJ1ZmZlciBmb3IgdGhlIHNwZWNpZmllZCB0cmFuc2FjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiByZWNlaXZpbmcgY29ubmVjdGlvbihjbGllbnQpLgorICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbklkIHRoZSBpZCBvZiB0aGUgdHJhbnNmZXIgdHJhbnNhY3Rpb24uCisgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgdGhlIGlkIG9mIHRoZSBidWZmZXIgdG8gYmUgZmV0Y2hlZC4KKyAgICAgKiBAcGFyYW0gaGFuZGxlICAgICAgICB0aGUgbmF0aXZlIGhhbmRsZSBvZiB0aGUgZmV0Y2hlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgaXMgc3VjY2Vzc2Z1bGx5IGZldGNoZWQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGZldGNoKAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIE1ha2VzIGEgY29ubmVjdGlvbiB0byB0aGUgYnVmZmVyIHBvb2wuIFRoZSBidWZmZXIgcG9vbCBjbGllbnQgdXNlcyB0aGUKKyAgICAgKiBjcmVhdGVkIGNvbm5lY3Rpb24gaW4gb3JkZXIgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgYnVmZmVyIHBvb2wuIEFuCisgICAgICogRk1RIGZvciBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgaXMgYWxzbyBjcmVhdGVkIGZvciB0aGUgY2xpZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb24gICAgY3JlYXRlZCBjb25uZWN0aW9uCisgICAgICogQHBhcmFtIHBDb25uZWN0aW9uSWQgdGhlIGlkIG9mIHRoZSBjcmVhdGVkIGNvbm5lY3Rpb24KKyAgICAgKiBAcGFyYW0gZm1xRGVzY1B0ciAgICBGTVEgZGVzY3JpcHRvciBmb3Igc2hhcmVkIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlIGJldHdlZW4gYSBidWZmZXIgcG9vbCBhbmQgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gbG9jYWwgICAgICAgICB0cnVlIHdoZW4gYSBjb25uZWN0aW9uIHJlcXVlc3QgY29tZXMgZnJvbSBsb2NhbCBwcm9jZXNzLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGNvbm5lY3Rpb24gaXMgc3VjY2Vzc2Z1bGx5IG1hZGUuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNvbm5lY3QoCisgICAgICAgICAgICBzcDxDb25uZWN0aW9uPiAqY29ubmVjdGlvbiwgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkLAorICAgICAgICAgICAgY29uc3QgUXVldWVEZXNjcmlwdG9yKiogZm1xRGVzY1B0ciwgYm9vbCBsb2NhbCk7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIHRvIHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgaWQgb2YgdGhlIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkLgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIC8qKgorICAgICAqIFByb2Nlc3NlcyBwZW5kaW5nIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMgYW5kIHBlcmZvbXMgcGVyaW9kaWMgY2FjaGUKKyAgICAgKiBjbGVhbmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGVhckNhY2hlICAgIGlmIGNsZWFyQ2FjaGUgaXMgdHJ1ZSwgaXQgZnJlZXMgYWxsIGJ1ZmZlcnMgd2FpdGluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlY3ljbGVkLgorICAgICAqLworICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUpOworCisgICAgLyoqCisgICAgICogR2V0cyBhIGhpZGxfZGVhdGhfcmVjaXBpZW50IGZvciByZW1vdGUgY29ubmVjdGlvbiBkZWF0aC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3A8Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50PiBnZXRDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQoKTsKKworcHJpdmF0ZToKKyAgICBjbGFzcyBJbXBsOworICAgIHN0ZDo6dW5pcXVlX3B0cjxJbXBsPiBtSW1wbDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9BQ0NFU1NPUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3NvckltcGwuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3JJbXBsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTE3ZjE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3JJbXBsLmNwcApAQCAtMCwwICsxLDU0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbEFjY2Vzc29yIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgIkFjY2Vzc29ySW1wbC5oIgorI2luY2x1ZGUgIkNvbm5lY3Rpb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCituYW1lc3BhY2UgeworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrQ2xlYW5VcER1cmF0aW9uVXMgPSA1MDAwMDA7IC8vIFRPRE8gdHVuZSAwLjUgc2VjCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtMb2dEdXJhdGlvblVzID0gNTAwMDAwMDsgLy8gNSBzZWNzCisKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWluQWxsb2NCeXRlc0ZvckV2aWN0aW9uID0gMTAyNCoxMDI0KjE1OworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNaW5CdWZmZXJDb3VudEZvckV2aWN0aW9uID0gNDA7Cit9CisKKy8vIEJ1ZmZlciBzdHJ1Y3R1cmUgaW4gYnVmZmVycG9vbCBwcm9jZXNzCitzdHJ1Y3QgSW50ZXJuYWxCdWZmZXIgeworICAgIEJ1ZmZlcklkIG1JZDsKKyAgICBzaXplX3QgbU93bmVyQ291bnQ7CisgICAgc2l6ZV90IG1UcmFuc2FjdGlvbkNvdW50OworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gbUFsbG9jYXRpb247CisgICAgY29uc3Qgc2l6ZV90IG1BbGxvY1NpemU7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gbUNvbmZpZzsKKworICAgIEludGVybmFsQnVmZmVyKAorICAgICAgICAgICAgQnVmZmVySWQgaWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhbGxvY1NpemUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmYWxsb2NDb25maWcpCisgICAgICAgICAgICA6IG1JZChpZCksIG1Pd25lckNvdW50KDApLCBtVHJhbnNhY3Rpb25Db3VudCgwKSwKKyAgICAgICAgICAgIG1BbGxvY2F0aW9uKGFsbG9jKSwgbUFsbG9jU2l6ZShhbGxvY1NpemUpLCBtQ29uZmlnKGFsbG9jQ29uZmlnKSB7fQorCisgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUoKSB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdGlvbi0+aGFuZGxlKCk7CisgICAgfQorfTsKKworc3RydWN0IFRyYW5zYWN0aW9uU3RhdHVzIHsKKyAgICBUcmFuc2FjdGlvbklkIG1JZDsKKyAgICBCdWZmZXJJZCBtQnVmZmVySWQ7CisgICAgQ29ubmVjdGlvbklkIG1TZW5kZXI7CisgICAgQ29ubmVjdGlvbklkIG1SZWNlaXZlcjsKKyAgICBCdWZmZXJTdGF0dXMgbVN0YXR1czsKKyAgICBpbnQ2NF90IG1UaW1lc3RhbXBVczsKKyAgICBib29sIG1TZW5kZXJWYWxpZGF0ZWQ7CisKKyAgICBUcmFuc2FjdGlvblN0YXR1cyhjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlLCBpbnQ2NF90IHRpbWVzdGFtcFVzKSB7CisgICAgICAgIG1JZCA9IG1lc3NhZ2UudHJhbnNhY3Rpb25JZDsKKyAgICAgICAgbUJ1ZmZlcklkID0gbWVzc2FnZS5idWZmZXJJZDsKKyAgICAgICAgbVN0YXR1cyA9IG1lc3NhZ2UubmV3U3RhdHVzOworICAgICAgICBtVGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKKyAgICAgICAgaWYgKG1TdGF0dXMgPT0gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9UTykgeworICAgICAgICAgICAgbVNlbmRlciA9IG1lc3NhZ2UuY29ubmVjdGlvbklkOworICAgICAgICAgICAgbVJlY2VpdmVyID0gbWVzc2FnZS50YXJnZXRDb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBtU2VuZGVyVmFsaWRhdGVkID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TZW5kZXIgPSAtMUxMOworICAgICAgICAgICAgbVJlY2VpdmVyID0gbWVzc2FnZS5jb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBtU2VuZGVyVmFsaWRhdGVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9Cit9OworCisvLyBIZWxwZXIgdGVtcGxhdGUgbWV0aG9kcyBmb3IgaGFuZGxpbmcgbWFwIG9mIHNldC4KK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+Citib29sIGluc2VydChzdGQ6Om1hcDxULCBzdGQ6OnNldDxVPj4gKm1hcE9mU2V0LCBUIGtleSwgVSB2YWx1ZSkgeworICAgIGF1dG8gaXRlciA9IG1hcE9mU2V0LT5maW5kKGtleSk7CisgICAgaWYgKGl0ZXIgPT0gbWFwT2ZTZXQtPmVuZCgpKSB7CisgICAgICAgIHN0ZDo6c2V0PFU+IHZhbHVlU2V0e3ZhbHVlfTsKKyAgICAgICAgbWFwT2ZTZXQtPmluc2VydChzdGQ6Om1ha2VfcGFpcihrZXksIHZhbHVlU2V0KSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoaXRlci0+c2Vjb25kLmZpbmQodmFsdWUpICA9PSBpdGVyLT5zZWNvbmQuZW5kKCkpIHsKKyAgICAgICAgaXRlci0+c2Vjb25kLmluc2VydCh2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+Citib29sIGVyYXNlKHN0ZDo6bWFwPFQsIHN0ZDo6c2V0PFU+PiAqbWFwT2ZTZXQsIFQga2V5LCBVIHZhbHVlKSB7CisgICAgYm9vbCByZXQgPSBmYWxzZTsKKyAgICBhdXRvIGl0ZXIgPSBtYXBPZlNldC0+ZmluZChrZXkpOworICAgIGlmIChpdGVyICE9IG1hcE9mU2V0LT5lbmQoKSkgeworICAgICAgICBpZiAoaXRlci0+c2Vjb25kLmVyYXNlKHZhbHVlKSA+IDApIHsKKyAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGl0ZXItPnNlY29uZC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgbWFwT2ZTZXQtPmVyYXNlKGl0ZXIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+Citib29sIGNvbnRhaW5zKHN0ZDo6bWFwPFQsIHN0ZDo6c2V0PFU+PiAqbWFwT2ZTZXQsIFQga2V5LCBVIHZhbHVlKSB7CisgICAgYXV0byBpdGVyID0gbWFwT2ZTZXQtPmZpbmQoa2V5KTsKKyAgICBpZiAoaXRlciAhPSBtYXBPZlNldC0+ZW5kKCkpIHsKKyAgICAgICAgYXV0byBzZXRJdGVyID0gaXRlci0+c2Vjb25kLmZpbmQodmFsdWUpOworICAgICAgICByZXR1cm4gc2V0SXRlciAhPSBpdGVyLT5zZWNvbmQuZW5kKCk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworaW50MzJfdCBBY2Nlc3Nvcjo6SW1wbDo6c1BpZCA9IGdldHBpZCgpOwordWludDMyX3QgQWNjZXNzb3I6OkltcGw6OnNTZXFJZCA9IHRpbWUobnVsbHB0cik7CisKK0FjY2Vzc29yOjpJbXBsOjpJbXBsKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvcikKKyAgICAgICAgOiBtQWxsb2NhdG9yKGFsbG9jYXRvcikge30KKworQWNjZXNzb3I6OkltcGw6On5JbXBsKCkgeworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OkltcGw6OmNvbm5lY3QoCisgICAgICAgIGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsIHNwPENvbm5lY3Rpb24+ICpjb25uZWN0aW9uLAorICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQsIGNvbnN0IFF1ZXVlRGVzY3JpcHRvcioqIGZtcURlc2NQdHIpIHsKKyAgICBzcDxDb25uZWN0aW9uPiBuZXdDb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oKTsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgICAgIGlmIChuZXdDb25uZWN0aW9uKSB7CisgICAgICAgICAgICBDb25uZWN0aW9uSWQgaWQgPSAoaW50NjRfdClzUGlkIDw8IDMyIHwgc1NlcUlkOworICAgICAgICAgICAgc3RhdHVzID0gbUJ1ZmZlclBvb2wubU9ic2VydmVyLm9wZW4oaWQsIGZtcURlc2NQdHIpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgbmV3Q29ubmVjdGlvbi0+aW5pdGlhbGl6ZShhY2Nlc3NvciwgaWQpOworICAgICAgICAgICAgICAgICpjb25uZWN0aW9uID0gbmV3Q29ubmVjdGlvbjsKKyAgICAgICAgICAgICAgICAqcENvbm5lY3Rpb25JZCA9IGlkOworICAgICAgICAgICAgICAgICsrc1NlcUlkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1CdWZmZXJQb29sLnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworICAgICAgICBtQnVmZmVyUG9vbC5jbGVhblVwKCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6Y2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgbUJ1ZmZlclBvb2wuaGFuZGxlQ2xvc2UoY29ubmVjdGlvbklkKTsKKyAgICBtQnVmZmVyUG9vbC5tT2JzZXJ2ZXIuY2xvc2UoY29ubmVjdGlvbklkKTsKKyAgICAvLyBTaW5jZSBjbG9zZSMgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgYWxsIHdvcmtzIGFyZSBmaW5pc2hlZCwgaXQgaXMgT0sgdG8KKyAgICAvLyBldmljdCB1bnVzZWQgYnVmZmVycy4KKyAgICBtQnVmZmVyUG9vbC5jbGVhblVwKHRydWUpOworICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OkltcGw6OmFsbG9jYXRlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGFyYW1zLAorICAgICAgICBCdWZmZXJJZCAqYnVmZmVySWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgIG1CdWZmZXJQb29sLnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6Ok9LOworICAgIGlmICghbUJ1ZmZlclBvb2wuZ2V0RnJlZUJ1ZmZlcihtQWxsb2NhdG9yLCBwYXJhbXMsIGJ1ZmZlcklkLCBoYW5kbGUpKSB7CisgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgICAgIHNpemVfdCBhbGxvY1NpemU7CisgICAgICAgIHN0YXR1cyA9IG1BbGxvY2F0b3ItPmFsbG9jYXRlKHBhcmFtcywgJmFsbG9jLCAmYWxsb2NTaXplKTsKKyAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgc3RhdHVzID0gbUJ1ZmZlclBvb2wuYWRkTmV3QnVmZmVyKGFsbG9jLCBhbGxvY1NpemUsIHBhcmFtcywgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImNyZWF0ZSBhIGJ1ZmZlciAlZCA6ICV1ICVwIiwKKyAgICAgICAgICAgICAgc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0ssICpidWZmZXJJZCwgKmhhbmRsZSk7CisgICAgfQorICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAvLyBUT0RPOiBoYW5kbGUgb3duQnVmZmVyIGZhaWx1cmUKKyAgICAgICAgbUJ1ZmZlclBvb2wuaGFuZGxlT3duQnVmZmVyKGNvbm5lY3Rpb25JZCwgKmJ1ZmZlcklkKTsKKyAgICB9CisgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcCgpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6ZmV0Y2goCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgYXV0byBmb3VuZCA9IG1CdWZmZXJQb29sLm1UcmFuc2FjdGlvbnMuZmluZCh0cmFuc2FjdGlvbklkKTsKKyAgICBpZiAoZm91bmQgIT0gbUJ1ZmZlclBvb2wubVRyYW5zYWN0aW9ucy5lbmQoKSAmJgorICAgICAgICAgICAgY29udGFpbnMoJm1CdWZmZXJQb29sLm1QZW5kaW5nVHJhbnNhY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbklkLCB0cmFuc2FjdGlvbklkKSkgeworICAgICAgICBpZiAoZm91bmQtPnNlY29uZC0+bVNlbmRlclZhbGlkYXRlZCAmJgorICAgICAgICAgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TdGF0dXMgPT0gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GUk9NICYmCisgICAgICAgICAgICAgICAgZm91bmQtPnNlY29uZC0+bUJ1ZmZlcklkID09IGJ1ZmZlcklkKSB7CisgICAgICAgICAgICBmb3VuZC0+c2Vjb25kLT5tU3RhdHVzID0gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GRVRDSDsKKyAgICAgICAgICAgIGF1dG8gYnVmZmVySXQgPSBtQnVmZmVyUG9vbC5tQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgICAgIGlmIChidWZmZXJJdCAhPSBtQnVmZmVyUG9vbC5tQnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgICAgIG1CdWZmZXJQb29sLm1TdGF0cy5vbkJ1ZmZlckZldGNoZWQoKTsKKyAgICAgICAgICAgICAgICAqaGFuZGxlID0gYnVmZmVySXQtPnNlY29uZC0+aGFuZGxlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcCgpOworICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSkgeworICAgIC8vIHRyYW5zYWN0aW9uIHRpbWVvdXQsIGJ1ZmZlciBjYWNoZWluZyBUVEwgaGFuZGxpbmcKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgIG1CdWZmZXJQb29sLnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworICAgIG1CdWZmZXJQb29sLmNsZWFuVXAoY2xlYXJDYWNoZSk7Cit9CisKK0FjY2Vzc29yOjpJbXBsOjpJbXBsOjpCdWZmZXJQb29sOjpCdWZmZXJQb29sKCkKKyAgICA6IG1UaW1lc3RhbXBVcyhnZXRUaW1lc3RhbXBOb3coKSksCisgICAgICBtTGFzdENsZWFuVXBVcyhtVGltZXN0YW1wVXMpLAorICAgICAgbUxhc3RMb2dVcyhtVGltZXN0YW1wVXMpLAorICAgICAgbVNlcSgwKSB7fQorCisKKy8vIFN0YXRpc3RpY3MgaGVscGVyCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTPgoraW50IHBlcmNlbnRhZ2UoVCBiYXNlLCBTIHRvdGFsKSB7CisgICAgcmV0dXJuIGludCh0b3RhbCA/IDAuNSArIDEwMC4gKiBzdGF0aWNfY2FzdDxTPihiYXNlKSAvIHRvdGFsIDogMCk7Cit9CisKK0FjY2Vzc29yOjpJbXBsOjpJbXBsOjpCdWZmZXJQb29sOjp+QnVmZmVyUG9vbCgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIEFMT0dEKCJEZXN0cnVjdGlvbiAtIGJ1ZmZlcnBvb2wgJXAgIgorICAgICAgICAgICJjYWNoZWQ6ICV6dS8lenVNLCAlenUvJWQlJSBpbiB1c2U7ICIKKyAgICAgICAgICAiYWxsb2NzOiAlenUsICVkJSUgcmVjeWNsZWQ7ICIKKyAgICAgICAgICAidHJhbnNmZXJzOiAlenUsICVkJSUgdW5mZXRjZWQiLAorICAgICAgICAgIHRoaXMsIG1TdGF0cy5tQnVmZmVyc0NhY2hlZCwgbVN0YXRzLm1TaXplQ2FjaGVkID4+IDIwLAorICAgICAgICAgIG1TdGF0cy5tQnVmZmVyc0luVXNlLCBwZXJjZW50YWdlKG1TdGF0cy5tQnVmZmVyc0luVXNlLCBtU3RhdHMubUJ1ZmZlcnNDYWNoZWQpLAorICAgICAgICAgIG1TdGF0cy5tVG90YWxBbGxvY2F0aW9ucywgcGVyY2VudGFnZShtU3RhdHMubVRvdGFsUmVjeWNsZXMsIG1TdGF0cy5tVG90YWxBbGxvY2F0aW9ucyksCisgICAgICAgICAgbVN0YXRzLm1Ub3RhbFRyYW5zZmVycywKKyAgICAgICAgICBwZXJjZW50YWdlKG1TdGF0cy5tVG90YWxUcmFuc2ZlcnMgLSBtU3RhdHMubVRvdGFsRmV0Y2hlcywgbVN0YXRzLm1Ub3RhbFRyYW5zZmVycykpOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVPd25CdWZmZXIoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkKSB7CisKKyAgICBib29sIGFkZGVkID0gaW5zZXJ0KCZtVXNpbmdCdWZmZXJzLCBjb25uZWN0aW9uSWQsIGJ1ZmZlcklkKTsKKyAgICBpZiAoYWRkZWQpIHsKKyAgICAgICAgYXV0byBpdGVyID0gbUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgIGl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQrKzsKKyAgICB9CisgICAgaW5zZXJ0KCZtVXNpbmdDb25uZWN0aW9ucywgYnVmZmVySWQsIGNvbm5lY3Rpb25JZCk7CisgICAgcmV0dXJuIGFkZGVkOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVSZWxlYXNlQnVmZmVyKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCkgeworICAgIGJvb2wgZGVsZXRlZCA9IGVyYXNlKCZtVXNpbmdCdWZmZXJzLCBjb25uZWN0aW9uSWQsIGJ1ZmZlcklkKTsKKyAgICBpZiAoZGVsZXRlZCkgeworICAgICAgICBhdXRvIGl0ZXIgPSBtQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgaXRlci0+c2Vjb25kLT5tT3duZXJDb3VudC0tOworICAgICAgICBpZiAoaXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwICYmCisgICAgICAgICAgICAgICAgaXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCA9PSAwKSB7CisgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoaXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgIG1GcmVlQnVmZmVycy5pbnNlcnQoYnVmZmVySWQpOworICAgICAgICB9CisgICAgfQorICAgIGVyYXNlKCZtVXNpbmdDb25uZWN0aW9ucywgYnVmZmVySWQsIGNvbm5lY3Rpb25JZCk7CisgICAgQUxPR1YoInJlbGVhc2UgYnVmZmVyICV1IDogJWQiLCBidWZmZXJJZCwgZGVsZXRlZCk7CisgICAgcmV0dXJuIGRlbGV0ZWQ7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZVRyYW5zZmVyVG8oY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSkgeworICAgIGF1dG8gY29tcGxldGVkID0gbUNvbXBsZXRlZFRyYW5zYWN0aW9ucy5maW5kKAorICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICBpZiAoY29tcGxldGVkICE9IG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgLy8gYWxyZWFkeSBjb21wbGV0ZWQKKyAgICAgICAgbUNvbXBsZXRlZFRyYW5zYWN0aW9ucy5lcmFzZShjb21wbGV0ZWQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gdGhlIGJ1ZmZlciBzaG91bGQgZXhpc3QgYW5kIGJlIG93bmVkLgorICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQobWVzc2FnZS5idWZmZXJJZCk7CisgICAgaWYgKGJ1ZmZlckl0ZXIgPT0gbUJ1ZmZlcnMuZW5kKCkgfHwKKyAgICAgICAgICAgICFjb250YWlucygmbVVzaW5nQnVmZmVycywgbWVzc2FnZS5jb25uZWN0aW9uSWQsIG1lc3NhZ2UuYnVmZmVySWQpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgYXV0byBmb3VuZCA9IG1UcmFuc2FjdGlvbnMuZmluZChtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgIGlmIChmb3VuZCAhPSBtVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIC8vIHRyYW5zZmVyX2Zyb20gd2FzIHJlY2VpdmVkIGVhcmxpZXIuCisgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TZW5kZXIgPSBtZXNzYWdlLmNvbm5lY3Rpb25JZDsKKyAgICAgICAgZm91bmQtPnNlY29uZC0+bVNlbmRlclZhbGlkYXRlZCA9IHRydWU7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyBUT0RPOiB2ZXJpZnkgdGhlcmUgaXMgdGFyZ2V0IGNvbm5lY3Rpb24gSWQKKyAgICBtU3RhdHMub25CdWZmZXJTZW50KCk7CisgICAgbVRyYW5zYWN0aW9ucy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPFRyYW5zYWN0aW9uU3RhdHVzPihtZXNzYWdlLCBtVGltZXN0YW1wVXMpKSk7CisgICAgaW5zZXJ0KCZtUGVuZGluZ1RyYW5zYWN0aW9ucywgbWVzc2FnZS50YXJnZXRDb25uZWN0aW9uSWQsCisgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCsrOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVUcmFuc2ZlckZyb20oY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSkgeworICAgIGF1dG8gZm91bmQgPSBtVHJhbnNhY3Rpb25zLmZpbmQobWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICBpZiAoZm91bmQgPT0gbVRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICAvLyBUT0RPOiBpcyBpdCBmZWFzaWJsZSB0byBjaGVjayBvd25lcnNoaXAgaGVyZT8KKyAgICAgICAgbVN0YXRzLm9uQnVmZmVyU2VudCgpOworICAgICAgICBtVHJhbnNhY3Rpb25zLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxUcmFuc2FjdGlvblN0YXR1cz4obWVzc2FnZSwgbVRpbWVzdGFtcFVzKSkpOworICAgICAgICBpbnNlcnQoJm1QZW5kaW5nVHJhbnNhY3Rpb25zLCBtZXNzYWdlLmNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQobWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQrKzsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobWVzc2FnZS5jb25uZWN0aW9uSWQgPT0gZm91bmQtPnNlY29uZC0+bVJlY2VpdmVyKSB7CisgICAgICAgICAgICBmb3VuZC0+c2Vjb25kLT5tU3RhdHVzID0gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GUk9NOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVUcmFuc2ZlclJlc3VsdChjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKSB7CisgICAgYXV0byBmb3VuZCA9IG1UcmFuc2FjdGlvbnMuZmluZChtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgIGlmIChmb3VuZCAhPSBtVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIGJvb2wgZGVsZXRlZCA9IGVyYXNlKCZtUGVuZGluZ1RyYW5zYWN0aW9ucywgbWVzc2FnZS5jb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgICAgIGlmIChkZWxldGVkKSB7CisgICAgICAgICAgICBpZiAoIWZvdW5kLT5zZWNvbmQtPm1TZW5kZXJWYWxpZGF0ZWQpIHsKKyAgICAgICAgICAgICAgICBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmluc2VydChtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV0byBidWZmZXJJdGVyID0gbUJ1ZmZlcnMuZmluZChtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlLm5ld1N0YXR1cyA9PSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX09LKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlT3duQnVmZmVyKG1lc3NhZ2UuY29ubmVjdGlvbklkLCBtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQtLTsKKyAgICAgICAgICAgIGlmIChidWZmZXJJdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAKKyAgICAgICAgICAgICAgICAmJiBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICBtRnJlZUJ1ZmZlcnMuaW5zZXJ0KG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVRyYW5zYWN0aW9ucy5lcmFzZShmb3VuZCk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoInRyYW5zZmVyIGZpbmlzaGVkICVsbHUgJXUgLSAlZCIsICh1bnNpZ25lZCBsb25nIGxvbmcpbWVzc2FnZS50cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICBtZXNzYWdlLmJ1ZmZlcklkLCBkZWxldGVkKTsKKyAgICAgICAgcmV0dXJuIGRlbGV0ZWQ7CisgICAgfQorICAgIEFMT0dWKCJ0cmFuc2ZlciBub3QgZm91bmQgJWxsdSAldSIsICh1bnNpZ25lZCBsb25nIGxvbmcpbWVzc2FnZS50cmFuc2FjdGlvbklkLAorICAgICAgICAgIG1lc3NhZ2UuYnVmZmVySWQpOworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6cHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCkgeworICAgIHN0ZDo6dmVjdG9yPEJ1ZmZlclN0YXR1c01lc3NhZ2U+IG1lc3NhZ2VzOworICAgIG1PYnNlcnZlci5nZXRCdWZmZXJTdGF0dXNDaGFuZ2VzKG1lc3NhZ2VzKTsKKyAgICBtVGltZXN0YW1wVXMgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICBmb3IgKEJ1ZmZlclN0YXR1c01lc3NhZ2UmIG1lc3NhZ2U6IG1lc3NhZ2VzKSB7CisgICAgICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgICAgIHN3aXRjaCAobWVzc2FnZS5uZXdTdGF0dXMpIHsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpOT1RfVVNFRDoKKyAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVSZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jb25uZWN0aW9uSWQsIG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlVTRUQ6CisgICAgICAgICAgICAgICAgLy8gbm90IGhhcHBlbmluZworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX1RPOgorICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZVRyYW5zZmVyVG8obWVzc2FnZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRlJPTToKKyAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVUcmFuc2ZlckZyb20obWVzc2FnZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVElNRU9VVDoKKyAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfTE9TVDoKKyAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRkVUQ0g6CisgICAgICAgICAgICAgICAgLy8gbm90IGhhcHBlbmluZworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX09LOgorICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0VSUk9SOgorICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZVRyYW5zZmVyUmVzdWx0KG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChyZXQgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgIEFMT0dXKCJidWZmZXIgc3RhdHVzIG1lc3NhZ2UgcHJvY2Vzc2luZyBmYWlsdXJlIC0gbWVzc2FnZSA6ICVkIGNvbm5lY3Rpb24gOiAlbGxkIiwKKyAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubmV3U3RhdHVzLCAobG9uZyBsb25nKW1lc3NhZ2UuY29ubmVjdGlvbklkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtZXNzYWdlcy5jbGVhcigpOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVDbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgLy8gQ2xlYW5pbmcgYnVmZmVycworICAgIGF1dG8gYnVmZmVycyA9IG1Vc2luZ0J1ZmZlcnMuZmluZChjb25uZWN0aW9uSWQpOworICAgIGlmIChidWZmZXJzICE9IG1Vc2luZ0J1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgZm9yIChjb25zdCBCdWZmZXJJZCYgYnVmZmVySWQgOiBidWZmZXJzLT5zZWNvbmQpIHsKKyAgICAgICAgICAgIGJvb2wgZGVsZXRlZCA9IGVyYXNlKCZtVXNpbmdDb25uZWN0aW9ucywgYnVmZmVySWQsIGNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICBpZiAoZGVsZXRlZCkgeworICAgICAgICAgICAgICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQtLTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVySXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGZyZWVidWZmZXIgaW5zZXJ0IGZhaWwKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1GcmVlQnVmZmVycy5pbnNlcnQoYnVmZmVySWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtVXNpbmdCdWZmZXJzLmVyYXNlKGJ1ZmZlcnMpOworICAgIH0KKworICAgIC8vIENsZWFuaW5nIHRyYW5zYWN0aW9ucworICAgIGF1dG8gcGVuZGluZyA9IG1QZW5kaW5nVHJhbnNhY3Rpb25zLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICBpZiAocGVuZGluZyAhPSBtUGVuZGluZ1RyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICBmb3IgKGNvbnN0IFRyYW5zYWN0aW9uSWQmIHRyYW5zYWN0aW9uSWQgOiBwZW5kaW5nLT5zZWNvbmQpIHsKKyAgICAgICAgICAgIGF1dG8gaXRlciA9IG1UcmFuc2FjdGlvbnMuZmluZCh0cmFuc2FjdGlvbklkKTsKKyAgICAgICAgICAgIGlmIChpdGVyICE9IG1UcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWl0ZXItPnNlY29uZC0+bVNlbmRlclZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgICAgICBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmluc2VydCh0cmFuc2FjdGlvbklkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQgPSBpdGVyLT5zZWNvbmQtPm1CdWZmZXJJZDsKKyAgICAgICAgICAgICAgICBhdXRvIGJ1ZmZlckl0ZXIgPSBtQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50LS07CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlckl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGZyZWVidWZmZXIgaW5zZXJ0IGZhaWwKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1GcmVlQnVmZmVycy5pbnNlcnQoYnVmZmVySWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtVHJhbnNhY3Rpb25zLmVyYXNlKGl0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpnZXRGcmVlQnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywgQnVmZmVySWQgKnBJZCwKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgYXV0byBidWZmZXJJdCA9IG1GcmVlQnVmZmVycy5iZWdpbigpOworICAgIGZvciAoO2J1ZmZlckl0ICE9IG1GcmVlQnVmZmVycy5lbmQoKTsgKytidWZmZXJJdCkgeworICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCA9ICpidWZmZXJJdDsKKyAgICAgICAgaWYgKGFsbG9jYXRvci0+Y29tcGF0aWJsZShwYXJhbXMsIG1CdWZmZXJzW2J1ZmZlcklkXS0+bUNvbmZpZykpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChidWZmZXJJdCAhPSBtRnJlZUJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgQnVmZmVySWQgaWQgPSAqYnVmZmVySXQ7CisgICAgICAgIG1GcmVlQnVmZmVycy5lcmFzZShidWZmZXJJdCk7CisgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclJlY3ljbGVkKG1CdWZmZXJzW2lkXS0+bUFsbG9jU2l6ZSk7CisgICAgICAgICpoYW5kbGUgPSBtQnVmZmVyc1tpZF0tPmhhbmRsZSgpOworICAgICAgICAqcElkID0gaWQ7CisgICAgICAgIEFMT0dWKCJyZWN5Y2xlIGEgYnVmZmVyICV1ICVwIiwgaWQsICpoYW5kbGUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmFkZE5ld0J1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgIGNvbnN0IHNpemVfdCBhbGxvY1NpemUsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIEJ1ZmZlcklkICpwSWQsCisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworCisgICAgQnVmZmVySWQgYnVmZmVySWQgPSBtU2VxKys7CisgICAgaWYgKG1TZXEgPT0gQ29ubmVjdGlvbjo6U1lOQ19CVUZGRVJJRCkgeworICAgICAgICBtU2VxID0gMDsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPEludGVybmFsQnVmZmVyPiBidWZmZXIgPQorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxJbnRlcm5hbEJ1ZmZlcj4oCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcklkLCBhbGxvYywgYWxsb2NTaXplLCBwYXJhbXMpOworICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgYXV0byByZXMgPSBtQnVmZmVycy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgYnVmZmVySWQsIHN0ZDo6bW92ZShidWZmZXIpKSk7CisgICAgICAgIGlmIChyZXMuc2Vjb25kKSB7CisgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJBbGxvY2F0ZWQoYWxsb2NTaXplKTsKKyAgICAgICAgICAgICpoYW5kbGUgPSBhbGxvYy0+aGFuZGxlKCk7CisgICAgICAgICAgICAqcElkID0gYnVmZmVySWQ7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaWYgKGNsZWFyQ2FjaGUgfHwgbVRpbWVzdGFtcFVzID4gbUxhc3RDbGVhblVwVXMgKyBrQ2xlYW5VcER1cmF0aW9uVXMpIHsKKyAgICAgICAgbUxhc3RDbGVhblVwVXMgPSBtVGltZXN0YW1wVXM7CisgICAgICAgIGlmIChtVGltZXN0YW1wVXMgPiBtTGFzdExvZ1VzICsga0xvZ0R1cmF0aW9uVXMpIHsKKyAgICAgICAgICAgIG1MYXN0TG9nVXMgPSBtVGltZXN0YW1wVXM7CisgICAgICAgICAgICBBTE9HRCgiYnVmZmVycG9vbCAlcCA6ICV6dSglenUgc2l6ZSkgdG90YWwgYnVmZmVycyAtICIKKyAgICAgICAgICAgICAgICAgICIlenUoJXp1IHNpemUpIHVzZWQgYnVmZmVycyAtICV6dS8lenUgKHJlY3ljbGUvYWxsb2MpIC0gIgorICAgICAgICAgICAgICAgICAgIiV6dS8lenUgKGZldGNoL3RyYW5zZmVyKSIsCisgICAgICAgICAgICAgICAgICB0aGlzLCBtU3RhdHMubUJ1ZmZlcnNDYWNoZWQsIG1TdGF0cy5tU2l6ZUNhY2hlZCwKKyAgICAgICAgICAgICAgICAgIG1TdGF0cy5tQnVmZmVyc0luVXNlLCBtU3RhdHMubVNpemVJblVzZSwKKyAgICAgICAgICAgICAgICAgIG1TdGF0cy5tVG90YWxSZWN5Y2xlcywgbVN0YXRzLm1Ub3RhbEFsbG9jYXRpb25zLAorICAgICAgICAgICAgICAgICAgbVN0YXRzLm1Ub3RhbEZldGNoZXMsIG1TdGF0cy5tVG90YWxUcmFuc2ZlcnMpOworICAgICAgICB9CisgICAgICAgIGZvciAoYXV0byBmcmVlSXQgPSBtRnJlZUJ1ZmZlcnMuYmVnaW4oKTsgZnJlZUl0ICE9IG1GcmVlQnVmZmVycy5lbmQoKTspIHsKKyAgICAgICAgICAgIGlmICghY2xlYXJDYWNoZSAmJiBtU3RhdHMubVNpemVDYWNoZWQgPCBrTWluQWxsb2NCeXRlc0ZvckV2aWN0aW9uCisgICAgICAgICAgICAgICAgICAgICYmIG1CdWZmZXJzLnNpemUoKSA8IGtNaW5CdWZmZXJDb3VudEZvckV2aWN0aW9uKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdXRvIGl0ID0gbUJ1ZmZlcnMuZmluZCgqZnJlZUl0KTsKKyAgICAgICAgICAgIGlmIChpdCAhPSBtQnVmZmVycy5lbmQoKSAmJgorICAgICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwICYmIGl0LT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJFdmljdGVkKGl0LT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgIG1CdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICBmcmVlSXQgPSBtRnJlZUJ1ZmZlcnMuZXJhc2UoZnJlZUl0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKytmcmVlSXQ7CisgICAgICAgICAgICAgICAgQUxPR1coImJ1ZmZlcnBvb2wgaW5jb25zaXN0ZW50ISIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3NvckltcGwuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29ySW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNGRiZjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3NvckltcGwuaApAQCAtMCwwICsxLDMwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQUNDRVNTT1JJTVBMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQUNDRVNTT1JJTVBMX0gKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSAiQWNjZXNzb3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCitzdHJ1Y3QgSW50ZXJuYWxCdWZmZXI7CitzdHJ1Y3QgVHJhbnNhY3Rpb25TdGF0dXM7CisKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgYSBidWZmZXIgcG9vbCBhY2Nlc3NvcihvciBhIGJ1ZmZlciBwb29sIGltcGxlbWVudGF0aW9uLikgKi8KK2NsYXNzIEFjY2Vzc29yOjpJbXBsIHsKK3B1YmxpYzoKKyAgICBJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yKTsKKworICAgIH5JbXBsKCk7CisKKyAgICBSZXN1bHRTdGF0dXMgY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsIHNwPENvbm5lY3Rpb24+ICpjb25uZWN0aW9uLAorICAgICAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkLCBjb25zdCBRdWV1ZURlc2NyaXB0b3IqKiBmbXFEZXNjUHRyKTsKKworICAgIFJlc3VsdFN0YXR1cyBjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSk7CisKKyAgICBSZXN1bHRTdGF0dXMgZmV0Y2goQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKTsKKworICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUpOworCitwcml2YXRlOgorICAgIC8vIENvbm5lY3Rpb25JZCA9IHBpZCA6ICh0aW1lc3RhbXBfY3JlYXRlZCArIHNlcUlkKQorICAgIC8vIGluIG9yZGVyIHRvIGd1YXJhbnRlZSB1bmlxdWVuZXNzIGZvciBlYWNoIGNvbm5lY3Rpb24KKyAgICBzdGF0aWMgdWludDMyX3Qgc1NlcUlkOworICAgIHN0YXRpYyBpbnQzMl90IHNQaWQ7CisKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKworICAgIC8qKgorICAgICAqIEJ1ZmZlciBwb29sIGltcGxlbWVudGF0aW9uLgorICAgICAqCisgICAgICogSGFuZGxlcyBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzLiBIYW5kbGVzIGJ1ZmZlciBhbGxvY2F0aW9uL3JlY3ljbGluZy4KKyAgICAgKiBIYW5kbGVzIGJ1ZmZlciB0cmFuc2ZlciBiZXR3ZWVuIGJ1ZmZlciBwb29sIGNsaWVudHMuCisgICAgICovCisgICAgc3RydWN0IEJ1ZmZlclBvb2wgeworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgICAgICBpbnQ2NF90IG1UaW1lc3RhbXBVczsKKyAgICAgICAgaW50NjRfdCBtTGFzdENsZWFuVXBVczsKKyAgICAgICAgaW50NjRfdCBtTGFzdExvZ1VzOworICAgICAgICBCdWZmZXJJZCBtU2VxOworICAgICAgICBCdWZmZXJTdGF0dXNPYnNlcnZlciBtT2JzZXJ2ZXI7CisKKyAgICAgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBzdGQ6OnNldDxCdWZmZXJJZD4+IG1Vc2luZ0J1ZmZlcnM7CisgICAgICAgIHN0ZDo6bWFwPEJ1ZmZlcklkLCBzdGQ6OnNldDxDb25uZWN0aW9uSWQ+PiBtVXNpbmdDb25uZWN0aW9uczsKKworICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIHN0ZDo6c2V0PFRyYW5zYWN0aW9uSWQ+PiBtUGVuZGluZ1RyYW5zYWN0aW9uczsKKyAgICAgICAgLy8gVHJhbnNhY3Rpb25zIGNvbXBsZXRlZCBiZWZvcmUgVFJBTlNGRVJfVE8gbWVzc2FnZSBhcnJpdmFsLgorICAgICAgICAvLyBGZXRjaCBkb2VzIG5vdCBvY2N1ciBmb3IgdGhlIHRyYW5zYWN0aW9ucy4KKyAgICAgICAgLy8gT25seSB0cmFuc2FjdGlvbiBpZCBpcyBrZXB0IGZvciB0aGUgdHJhbnNhY3Rpb25zIGluIHNob3J0IGR1cmF0aW9uLgorICAgICAgICBzdGQ6OnNldDxUcmFuc2FjdGlvbklkPiBtQ29tcGxldGVkVHJhbnNhY3Rpb25zOworICAgICAgICAvLyBDdXJyZW50bHkgYWN0aXZlKHBlbmRpbmcpIHRyYW5zYXRpb25zJyBzdGF0dXMgJiBpbmZvcm1hdGlvbi4KKyAgICAgICAgc3RkOjptYXA8VHJhbnNhY3Rpb25JZCwgc3RkOjp1bmlxdWVfcHRyPFRyYW5zYWN0aW9uU3RhdHVzPj4KKyAgICAgICAgICAgICAgICBtVHJhbnNhY3Rpb25zOworCisgICAgICAgIHN0ZDo6bWFwPEJ1ZmZlcklkLCBzdGQ6OnVuaXF1ZV9wdHI8SW50ZXJuYWxCdWZmZXI+PiBtQnVmZmVyczsKKyAgICAgICAgc3RkOjpzZXQ8QnVmZmVySWQ+IG1GcmVlQnVmZmVyczsKKworICAgICAgICAvLy8gQnVmZmVyIHBvb2wgc3RhdGlzdGljcyB3aGljaCB0cmFja3MgYWxsb2NhdGlvbiBhbmQgdHJhbnNmZXIgc3RhdGlzdGljcy4KKyAgICAgICAgc3RydWN0IFN0YXRzIHsKKyAgICAgICAgICAgIC8vLyBUb3RhbCBzaXplIG9mIGFsbG9jYXRpb25zIHdoaWNoIGFyZSB1c2VkIG9yIGF2YWlsYWJsZSB0byB1c2UuCisgICAgICAgICAgICAvLy8gKGJ5dGVzIG9yIHBpeGVscykKKyAgICAgICAgICAgIHNpemVfdCBtU2l6ZUNhY2hlZDsKKyAgICAgICAgICAgIC8vLyAjIG9mIGNhY2hlZCBidWZmZXJzIHdoaWNoIGFyZSB1c2VkIG9yIGF2YWlsYWJsZSB0byB1c2UuCisgICAgICAgICAgICBzaXplX3QgbUJ1ZmZlcnNDYWNoZWQ7CisgICAgICAgICAgICAvLy8gVG90YWwgc2l6ZSBvZiBhbGxvY2F0aW9ucyB3aGljaCBhcmUgY3VycmVudGx5IHVzZWQuIChieXRlcyBvciBwaXhlbHMpCisgICAgICAgICAgICBzaXplX3QgbVNpemVJblVzZTsKKyAgICAgICAgICAgIC8vLyAjIG9mIGN1cnJlbnRseSB1c2VkIGJ1ZmZlcnMKKyAgICAgICAgICAgIHNpemVfdCBtQnVmZmVyc0luVXNlOworCisgICAgICAgICAgICAvLy8gIyBvZiBhbGxvY2F0aW9ucyBjYWxsZWQgb24gYnVmZmVycG9vbC4gKCMgb2YgZmV0Y2hlZCBmcm9tIEJsb2NrUG9vbCkKKyAgICAgICAgICAgIHNpemVfdCBtVG90YWxBbGxvY2F0aW9uczsKKyAgICAgICAgICAgIC8vLyAjIG9mIGFsbG9jYXRpb25zIHRoYXQgd2VyZSBzZXJ2ZWQgZnJvbSB0aGUgY2FjaGUuCisgICAgICAgICAgICAvLy8gKCMgb2YgYWxsb2NhdG9yIGFsbG9jIHByZXZlbnRlZCkKKyAgICAgICAgICAgIHNpemVfdCBtVG90YWxSZWN5Y2xlczsKKyAgICAgICAgICAgIC8vLyAjIG9mIGJ1ZmZlciB0cmFuc2ZlcnMgaW5pdGlhdGVkLgorICAgICAgICAgICAgc2l6ZV90IG1Ub3RhbFRyYW5zZmVyczsKKyAgICAgICAgICAgIC8vLyAjIG9mIHRyYW5zZmVycyB0aGF0IGhhZCB0byBiZSBmZXRjaGVkLgorICAgICAgICAgICAgc2l6ZV90IG1Ub3RhbEZldGNoZXM7CisKKyAgICAgICAgICAgIFN0YXRzKCkKKyAgICAgICAgICAgICAgICA6IG1TaXplQ2FjaGVkKDApLCBtQnVmZmVyc0NhY2hlZCgwKSwgbVNpemVJblVzZSgwKSwgbUJ1ZmZlcnNJblVzZSgwKSwKKyAgICAgICAgICAgICAgICAgIG1Ub3RhbEFsbG9jYXRpb25zKDApLCBtVG90YWxSZWN5Y2xlcygwKSwgbVRvdGFsVHJhbnNmZXJzKDApLCBtVG90YWxGZXRjaGVzKDApIHt9CisKKyAgICAgICAgICAgIC8vLyBBIG5ldyBidWZmZXIgaXMgYWxsb2NhdGVkIG9uIGFuIGFsbG9jYXRpb24gcmVxdWVzdC4KKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJBbGxvY2F0ZWQoc2l6ZV90IGFsbG9jU2l6ZSkgeworICAgICAgICAgICAgICAgIG1TaXplQ2FjaGVkICs9IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0NhY2hlZCsrOworCisgICAgICAgICAgICAgICAgbVNpemVJblVzZSArPSBhbGxvY1NpemU7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNJblVzZSsrOworCisgICAgICAgICAgICAgICAgbVRvdGFsQWxsb2NhdGlvbnMrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIEEgYnVmZmVyIGlzIGV2aWN0ZWQgYW5kIGRlc3Ryb3llZC4KKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJFdmljdGVkKHNpemVfdCBhbGxvY1NpemUpIHsKKyAgICAgICAgICAgICAgICBtU2l6ZUNhY2hlZCAtPSBhbGxvY1NpemU7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNDYWNoZWQtLTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIEEgYnVmZmVyIGlzIHJlY3ljbGVkIG9uIGFuIGFsbG9jYXRpb24gcmVxdWVzdC4KKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJSZWN5Y2xlZChzaXplX3QgYWxsb2NTaXplKSB7CisgICAgICAgICAgICAgICAgbVNpemVJblVzZSArPSBhbGxvY1NpemU7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNJblVzZSsrOworCisgICAgICAgICAgICAgICAgbVRvdGFsQWxsb2NhdGlvbnMrKzsKKyAgICAgICAgICAgICAgICBtVG90YWxSZWN5Y2xlcysrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgaXMgYXZhaWxhYmxlIHRvIGJlIHJlY3ljbGVkLgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlclVudXNlZChzaXplX3QgYWxsb2NTaXplKSB7CisgICAgICAgICAgICAgICAgbVNpemVJblVzZSAtPSBhbGxvY1NpemU7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNJblVzZS0tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgdHJhbnNmZXIgaXMgaW5pdGlhdGVkLgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlclNlbnQoKSB7CisgICAgICAgICAgICAgICAgbVRvdGFsVHJhbnNmZXJzKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciBmZXRjaCBpcyBpbnZva2VkIGJ5IGEgYnVmZmVyIHRyYW5zZmVyLgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlckZldGNoZWQoKSB7CisgICAgICAgICAgICAgICAgbVRvdGFsRmV0Y2hlcysrOworICAgICAgICAgICAgfQorICAgICAgICB9IG1TdGF0czsKKworICAgIHB1YmxpYzoKKyAgICAgICAgLyoqIENyZWF0ZXMgYSBidWZmZXIgcG9vbC4gKi8KKyAgICAgICAgQnVmZmVyUG9vbCgpOworCisgICAgICAgIC8qKiBEZXN0cm95cyBhIGJ1ZmZlciBwb29sLiAqLworICAgICAgICB+QnVmZmVyUG9vbCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQcm9jZXNzZXMgYWxsIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcywgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4KKyAgICAgICAgICogRWFjaCBzdGF0dXMgbWVzc2FnZSBpcyBoYW5kbGVkIGJ5IG1ldGhvZHMgd2l0aCAnaGFuZGxlJyBwcmVmaXguCisgICAgICAgICAqLworICAgICAgICB2b2lkIHByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgYnVmZmVyIGJlaW5nIG93bmVkIGJ5IGEgY29ubmVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgdGhlIGlkIG9mIHRoZSBidWZmZXIgb3duaW5nIGNvbm5lY3Rpb24uCisgICAgICAgICAqIEBwYXJhbSBidWZmZXJJZCAgICAgIHRoZSBpZCBvZiB0aGUgYnVmZmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB3aGVuIHRoZSBidWZmZXIgaXMgb3duZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZU93bkJ1ZmZlcihDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSBidWZmZXIgYmVpbmcgcmVsZWFzZWQgYnkgYSBjb25uZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgaWQgb2YgdGhlIGJ1ZmZlciBvd25pbmcgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgdGhlIGlkIG9mIHRoZSBidWZmZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHdoZW4gdGhlIGJ1ZmZlciBvd25lcnNoaXAgaXMgcmVsZWFzZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZVJlbGVhc2VCdWZmZXIoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gc3RhcnQgbWVzc2FnZSBmcm9tIHRoZSBzZW5kZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtZXNzYWdlICAgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJlc3VsdCB7QGNvZGUgdHJ1ZX0gd2hlbiB0cmFuc2Zlcl90byBtZXNzYWdlIGlzIGFja25vd2xlZGdlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlVHJhbnNmZXJUbyhjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIGJlaW5nIGFja2VkIGJ5IHRoZSByZWNlaXZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1lc3NhZ2UgICBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBmb3IgdGhlIHRyYW5zYWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmVzdWx0IHtAY29kZSB0cnVlfSB3aGVuIHRyYW5zZmVyX2Zyb20gbWVzc2FnZSBpcyBhY2tub3dsZWRnZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZVRyYW5zZmVyRnJvbShjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHJlc3VsdCBtZXNzYWdlIGZyb20gdGhlIHJlY2VpdmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZSAgIGEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIGZvciB0aGUgdHJhbnNhY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXN1bHQge0Bjb2RlIHRydWV9IHdoZW4gdGhlIGV4aXNpdG5nIHRyYW5zYWN0aW9uIGlzIGZpbmlzaGVkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVUcmFuc2ZlclJlc3VsdChjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIGNvbm5lY3Rpb24gYmVpbmcgY2xvc2VkLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LiBBbGwgdGhlCisgICAgICAgICAqIGJ1ZmZlcnMgYW5kIHRyYW5zYWN0aW9ucyBvd25lZCBieSB0aGUgY29ubmVjdGlvbiB3aWxsIGJlIGNsZWFuZWQgdXAuCisgICAgICAgICAqIFRoZSByZWxhdGVkIEZNUSB3aWxsIGJlIGNsZWFuZWQgdXAgdG9vLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgaWQgb2YgdGhlIGNvbm5lY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXN1bHQge0Bjb2RlIHRydWV9IHdoZW4gdGhlIGNvbm5lY3Rpb24gZXhpc3RlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlQ2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlY3ljbGVzIGEgZXhpc3RpbmcgZnJlZSBidWZmZXIgaWYgaXQgaXMgcG9zc2libGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbGxvY2F0b3IgdGhlIGJ1ZmZlciBhbGxvY2F0b3IKKyAgICAgICAgICogQHBhcmFtIHBhcmFtcyAgICB0aGUgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAgICAgKiBAcGFyYW0gcElkICAgICAgIHRoZSBpZCBvZiB0aGUgcmVjeWNsZWQgYnVmZmVyLgorICAgICAgICAgKiBAcGFyYW0gaGFuZGxlICAgIHRoZSBuYXRpdmUgaGFuZGxlIG9mIHRoZSByZWN5Y2xlZCBidWZmZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHdoZW4gYSBidWZmZXIgaXMgcmVjeWNsZWQsIHtAY29kZSBmYWxzZX0KKyAgICAgICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGdldEZyZWVCdWZmZXIoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICBCdWZmZXJJZCAqcElkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIGEgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciB0byBidWZmZXJwb29sLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYWxsb2MgICAgIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAgICAgKiBAcGFyYW0gYWxsb2NTaXplIHRoZSBzaXplIG9mIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAgICAgKiBAcGFyYW0gcGFyYW1zICAgIHRoZSBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICAgICAqIEBwYXJhbSBwSWQgICAgICAgdGhlIGJ1ZmZlciBpZCBmb3IgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBoYW5kbGUgICAgdGhlIG5hdGl2ZSBoYW5kbGUgZm9yIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYW4gYWxsb2NhdGlvbiBpcyBzdWNjZXNzZnVsbHkgYWxsb2NhdGVkLgorICAgICAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBSZXN1bHRTdGF0dXMgYWRkTmV3QnVmZmVyKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhbGxvY1NpemUsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICBCdWZmZXJJZCAqcElkLAorICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByb2Nlc3NlcyBwZW5kaW5nIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMgYW5kIHBlcmZvcm1zIHBlcmlvZGljIGNhY2hlCisgICAgICAgICAqIGNsZWFuaW5nLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY2xlYXJDYWNoZSAgICBpZiBjbGVhckNhY2hlIGlzIHRydWUsIGl0IGZyZWVzIGFsbCBidWZmZXJzCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdhaXRpbmcgdG8gYmUgcmVjeWNsZWQuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGNsZWFuVXAoYm9vbCBjbGVhckNhY2hlID0gZmFsc2UpOworCisgICAgICAgIGZyaWVuZCBjbGFzcyBBY2Nlc3Nvcjo6SW1wbDsKKyAgICB9IG1CdWZmZXJQb29sOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIHVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQUNDRVNTT1JJTVBMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FuZHJvaWQuYnAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZWE3MGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjkgQEAKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDEuMCIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBzcmNzOiBbCisgICAgICAgICJBY2Nlc3Nvci5jcHAiLAorICAgICAgICAiQWNjZXNzb3JJbXBsLmNwcCIsCisgICAgICAgICJCdWZmZXJQb29sQ2xpZW50LmNwcCIsCisgICAgICAgICJCdWZmZXJTdGF0dXMuY3BwIiwKKyAgICAgICAgIkNsaWVudE1hbmFnZXIuY3BwIiwKKyAgICAgICAgIkNvbm5lY3Rpb24uY3BwIiwKKyAgICBdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDEuMCIsCisgICAgXSwKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDEuMCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclBvb2xDbGllbnQuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyUG9vbENsaWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE1MjBjYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclBvb2xDbGllbnQuY3BwCkBAIC0wLDAgKzEsNzA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQb29sQ2xpZW50IgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgIkJ1ZmZlclBvb2xDbGllbnQuaCIKKyNpbmNsdWRlICJDb25uZWN0aW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtSZWNlaXZlVGltZW91dFVzID0gMTAwMDAwMDsgLy8gMTAwbXMKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtQb3N0TWF4UmV0cnkgPSAzOworc3RhdGljIGNvbnN0ZXhwciBpbnQga0NhY2hlVHRsVXMgPSAxMDAwMDAwOyAvLyBUT0RPOiB0dW5lCisKK2NsYXNzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGwKKyAgICAgICAgOiBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxCdWZmZXJQb29sQ2xpZW50OjpJbXBsPiB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW1wbChjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yKTsKKworICAgIGV4cGxpY2l0IEltcGwoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IpOworCisgICAgYm9vbCBpc1ZhbGlkKCkgeworICAgICAgICByZXR1cm4gbVZhbGlkOworICAgIH0KKworICAgIGJvb2wgaXNMb2NhbCgpIHsKKyAgICAgICAgcmV0dXJuIG1WYWxpZCAmJiBtTG9jYWw7CisgICAgfQorCisgICAgQ29ubmVjdGlvbklkIGdldENvbm5lY3Rpb25JZCgpIHsKKyAgICAgICAgcmV0dXJuIG1Db25uZWN0aW9uSWQ7CisgICAgfQorCisgICAgc3A8SUFjY2Vzc29yPiAmZ2V0QWNjZXNzb3IoKSB7CisgICAgICAgIHJldHVybiBtQWNjZXNzb3I7CisgICAgfQorCisgICAgYm9vbCBpc0FjdGl2ZShpbnQ2NF90ICpsYXN0VHJhbnNhY3Rpb25VcywgYm9vbCBjbGVhckNhY2hlKTsKKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICBSZXN1bHRTdGF0dXMgcmVjZWl2ZSgKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgdm9pZCBwb3N0QnVmZmVyUmVsZWFzZShCdWZmZXJJZCBidWZmZXJJZCk7CisKKyAgICBib29sIHBvc3RTZW5kKAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIENvbm5lY3Rpb25JZCByZWNlaXZlciwKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsIGludDY0X3QgKnRpbWVzdGFtcFVzKTsKK3ByaXZhdGU6CisKKyAgICBib29sIHBvc3RSZWNlaXZlKAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMpOworCisgICAgYm9vbCBwb3N0UmVjZWl2ZVJlc3VsdCgKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIGJvb2wgcmVzdWx0LCBib29sICpuZWVkc1N5bmMpOworCisgICAgdm9pZCB0cnlTeW5jRnJvbVJlbW90ZSgpOworCisgICAgYm9vbCBzeW5jUmVsZWFzZWQoKTsKKworICAgIHZvaWQgZXZpY3RDYWNoZXMoYm9vbCBjbGVhckNhY2hlID0gZmFsc2UpOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlQnVmZmVySGFuZGxlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywgQnVmZmVySWQgKmJ1ZmZlcklkLAorICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKworICAgIFJlc3VsdFN0YXR1cyBmZXRjaEJ1ZmZlckhhbmRsZSgKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCisgICAgc3RydWN0IEJsb2NrUG9vbERhdGFEdG9yOworICAgIHN0cnVjdCBDbGllbnRCdWZmZXI7CisKKyAgICBib29sIG1Mb2NhbDsKKyAgICBib29sIG1WYWxpZDsKKyAgICBzcDxJQWNjZXNzb3I+IG1BY2Nlc3NvcjsKKyAgICBzcDxDb25uZWN0aW9uPiBtTG9jYWxDb25uZWN0aW9uOworICAgIHNwPElDb25uZWN0aW9uPiBtUmVtb3RlQ29ubmVjdGlvbjsKKyAgICB1aW50MzJfdCBtU2VxSWQ7CisgICAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7CisgICAgaW50NjRfdCBtTGFzdEV2aWN0Q2FjaGVVczsKKworICAgIC8vIENhY2hlZEJ1ZmZlcnMKKyAgICBzdHJ1Y3QgQnVmZmVyQ2FjaGUgeworICAgICAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgICAgICBib29sIG1DcmVhdGluZzsKKyAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbUNyZWF0ZUN2OworICAgICAgICBzdGQ6Om1hcDxCdWZmZXJJZCwgc3RkOjp1bmlxdWVfcHRyPENsaWVudEJ1ZmZlcj4+IG1CdWZmZXJzOworICAgICAgICBpbnQgbUFjdGl2ZTsKKyAgICAgICAgaW50NjRfdCBtTGFzdENoYW5nZVVzOworCisgICAgICAgIEJ1ZmZlckNhY2hlKCkgOiBtQ3JlYXRpbmcoZmFsc2UpLCBtQWN0aXZlKDApLCBtTGFzdENoYW5nZVVzKGdldFRpbWVzdGFtcE5vdygpKSB7fQorCisgICAgICAgIHZvaWQgaW5jQWN0aXZlX2woKSB7CisgICAgICAgICAgICArK21BY3RpdmU7CisgICAgICAgICAgICBtTGFzdENoYW5nZVVzID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGRlY0FjdGl2ZV9sKCkgeworICAgICAgICAgICAgLS1tQWN0aXZlOworICAgICAgICAgICAgbUxhc3RDaGFuZ2VVcyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgICAgICB9CisgICAgfSBtQ2FjaGU7CisKKyAgICAvLyBGTVEgLSByZWxlYXNlIG5vdGlmaWVyCisgICAgc3RydWN0IHsKKyAgICAgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICAgICAgLy8gVE9ETzogdXNlIG9ubHkgb25lIGxpc3Q/KHVzaW5nIG9uZSBsaXN0IG1heSBkZWFseSBzZW5kaW5nIG1lc3NhZ2VzPykKKyAgICAgICAgc3RkOjpsaXN0PEJ1ZmZlcklkPiBtUmVsZWFzaW5nSWRzOworICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+IG1SZWxlYXNlZElkczsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c0NoYW5uZWw+IG1TdGF0dXNDaGFubmVsOworICAgIH0gbVJlbGVhc2luZzsKKworICAgIC8vIFRoaXMgbG9jayBpcyBoZWxkIGR1cmluZyBzeW5jaHJvbml6YXRpb24gZnJvbSByZW1vdGUgc2lkZS4KKyAgICAvLyBJbiBvcmRlciB0byBtaW5pbWl6ZSByZW1vdGUgY2FsbHMgYW5kIGxvY2tpbmcgZHVydGFpb24sIHRoaXMgbG9jayBpcyBoZWxkCisgICAgLy8gYnkgYmVzdCBlZmZvcnQgYXBwcm9hY2ggdXNpbmcgdHJ5X2xvY2soKS4KKyAgICBzdGQ6Om11dGV4IG1SZW1vdGVTeW5jTG9jazsKK307CisKK3N0cnVjdCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpCbG9ja1Bvb2xEYXRhRHRvciB7CisgICAgQmxvY2tQb29sRGF0YUR0b3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw+ICZpbXBsKQorICAgICAgICAgICAgOiBtSW1wbChpbXBsKSB7fQorCisgICAgdm9pZCBvcGVyYXRvcigpKEJ1ZmZlclBvb2xEYXRhICpidWZmZXIpIHsKKyAgICAgICAgQnVmZmVySWQgaWQgPSBidWZmZXItPm1JZDsKKyAgICAgICAgZGVsZXRlIGJ1ZmZlcjsKKworICAgICAgICBhdXRvIGltcGwgPSBtSW1wbC5sb2NrKCk7CisgICAgICAgIGlmIChpbXBsICYmIGltcGwtPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgaW1wbC0+cG9zdEJ1ZmZlclJlbGVhc2UoaWQpOworICAgICAgICB9CisgICAgfQorICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudDo6SW1wbD4gbUltcGw7Cit9OworCitzdHJ1Y3QgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6Q2xpZW50QnVmZmVyIHsKK3ByaXZhdGU6CisgICAgYm9vbCBtSW52YWxpZGF0ZWQ7IC8vIFRPRE86IGltcGxlbWVudAorICAgIGludDY0X3QgbUV4cGlyZVVzOworICAgIGJvb2wgbUhhc0NhY2hlOworICAgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworICAgIEJ1ZmZlcklkIG1JZDsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKm1IYW5kbGU7CisgICAgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sRGF0YT4gbUNhY2hlOworCisgICAgdm9pZCB1cGRhdGVFeHBpcmUoKSB7CisgICAgICAgIG1FeHBpcmVVcyA9IGdldFRpbWVzdGFtcE5vdygpICsga0NhY2hlVHRsVXM7CisgICAgfQorCitwdWJsaWM6CisgICAgQ2xpZW50QnVmZmVyKAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQnVmZmVySWQgaWQsIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKQorICAgICAgICAgICAgOiBtSW52YWxpZGF0ZWQoZmFsc2UpLCBtSGFzQ2FjaGUoZmFsc2UpLAorICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkKGNvbm5lY3Rpb25JZCksIG1JZChpZCksIG1IYW5kbGUoaGFuZGxlKSB7CisgICAgICAgICh2b2lkKW1JbnZhbGlkYXRlZDsKKyAgICAgICAgbUV4cGlyZVVzID0gZ2V0VGltZXN0YW1wTm93KCkgKyBrQ2FjaGVUdGxVczsKKyAgICB9CisKKyAgICB+Q2xpZW50QnVmZmVyKCkgeworICAgICAgICBpZiAobUhhbmRsZSkgeworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShtSGFuZGxlKTsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG1IYW5kbGUpOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBleHBpcmUoKSBjb25zdCB7CisgICAgICAgIGludDY0X3Qgbm93ID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgIHJldHVybiBub3cgPj0gbUV4cGlyZVVzOworICAgIH0KKworICAgIGJvb2wgaGFzQ2FjaGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSGFzQ2FjaGU7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBmZXRjaENhY2hlKG5hdGl2ZV9oYW5kbGVfdCAqKnBIYW5kbGUpIHsKKyAgICAgICAgaWYgKG1IYXNDYWNoZSkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBjYWNoZSA9IG1DYWNoZS5sb2NrKCk7CisgICAgICAgICAgICBpZiAoY2FjaGUpIHsKKyAgICAgICAgICAgICAgICAqcEhhbmRsZSA9IG1IYW5kbGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY2FjaGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBjcmVhdGVDYWNoZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50OjpJbXBsPiAmaW1wbCwKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKnBIYW5kbGUpIHsKKyAgICAgICAgaWYgKCFtSGFzQ2FjaGUpIHsKKyAgICAgICAgICAgIC8vIEFsbG9jYXRlcyBhIHJhdyBwdHIgaW4gb3JkZXIgdG8gYXZvaWQgc2VuZGluZyAjcG9zdEJ1ZmZlclJlbGVhc2UKKyAgICAgICAgICAgIC8vIGZyb20gZGVsZXRlciwgaW4gY2FzZSBvZiBuYXRpdmVfaGFuZGxlX2Nsb25lIGZhaWx1cmUuCisgICAgICAgICAgICBCdWZmZXJQb29sRGF0YSAqcHRyID0gbmV3IEJ1ZmZlclBvb2xEYXRhKG1Db25uZWN0aW9uSWQsIG1JZCk7CisgICAgICAgICAgICBpZiAocHRyKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBjYWNoZShwdHIsIEJsb2NrUG9vbERhdGFEdG9yKGltcGwpKTsKKyAgICAgICAgICAgICAgICBpZiAoY2FjaGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhY2hlID0gY2FjaGU7CisgICAgICAgICAgICAgICAgICAgIG1IYXNDYWNoZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICpwSGFuZGxlID0gbUhhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwdHIpIHsKKyAgICAgICAgICAgICAgICBkZWxldGUgcHRyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGJvb2wgb25DYWNoZVJlbGVhc2UoKSB7CisgICAgICAgIGlmIChtSGFzQ2FjaGUpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHZlcmlmeSBtQ2FjaGUgaXMgbm90IHZhbGlkOworICAgICAgICAgICAgdXBkYXRlRXhwaXJlKCk7CisgICAgICAgICAgICBtSGFzQ2FjaGUgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9OworCitCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpJbXBsKGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IpCisgICAgOiBtTG9jYWwodHJ1ZSksIG1WYWxpZChmYWxzZSksIG1BY2Nlc3NvcihhY2Nlc3NvciksIG1TZXFJZCgwKSwKKyAgICAgIG1MYXN0RXZpY3RDYWNoZVVzKGdldFRpbWVzdGFtcE5vdygpKSB7CisgICAgY29uc3QgUXVldWVEZXNjcmlwdG9yICpmbXFEZXNjOworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBhY2Nlc3Nvci0+Y29ubmVjdCgKKyAgICAgICAgICAgICZtTG9jYWxDb25uZWN0aW9uLCAmbUNvbm5lY3Rpb25JZCwgJmZtcURlc2MsIHRydWUpOworICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsID0KKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlclN0YXR1c0NoYW5uZWw+KCpmbXFEZXNjKTsKKyAgICAgICAgbVZhbGlkID0gbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbCAmJgorICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPmlzVmFsaWQoKTsKKyAgICB9Cit9CisKK0J1ZmZlclBvb2xDbGllbnQ6OkltcGw6OkltcGwoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IpCisgICAgOiBtTG9jYWwoZmFsc2UpLCBtVmFsaWQoZmFsc2UpLCBtQWNjZXNzb3IoYWNjZXNzb3IpLCBtU2VxSWQoMCksCisgICAgICBtTGFzdEV2aWN0Q2FjaGVVcyhnZXRUaW1lc3RhbXBOb3coKSkgeworICAgIGJvb2wgdmFsaWQgPSBmYWxzZTsKKyAgICBzcDxJQ29ubmVjdGlvbj4mIG91dENvbm5lY3Rpb24gPSBtUmVtb3RlQ29ubmVjdGlvbjsKKyAgICBDb25uZWN0aW9uSWQmIGlkID0gbUNvbm5lY3Rpb25JZDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzQ2hhbm5lbD4mIG91dENoYW5uZWwgPQorICAgICAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbDsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPSBhY2Nlc3Nvci0+Y29ubmVjdCgKKyAgICAgICAgICAgIFsmdmFsaWQsICZvdXRDb25uZWN0aW9uLCAmaWQsICZvdXRDaGFubmVsXQorICAgICAgICAgICAgKFJlc3VsdFN0YXR1cyBzdGF0dXMsIHNwPElDb25uZWN0aW9uPiBjb25uZWN0aW9uLAorICAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIGNvbnN0IFF1ZXVlRGVzY3JpcHRvciYgZGVzYykgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBvdXRDb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgaWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICAgICAgICAgIG91dENoYW5uZWwgPSBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlclN0YXR1c0NoYW5uZWw+KGRlc2MpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0Q2hhbm5lbCAmJiBvdXRDaGFubmVsLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIG1WYWxpZCA9IHRyYW5zUmVzdWx0LmlzT2soKSAmJiB2YWxpZDsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjppc0FjdGl2ZShpbnQ2NF90ICpsYXN0VHJhbnNhY3Rpb25VcywgYm9vbCBjbGVhckNhY2hlKSB7CisgICAgYm9vbCBhY3RpdmUgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTG9jayk7CisgICAgICAgIHN5bmNSZWxlYXNlZCgpOworICAgICAgICBldmljdENhY2hlcyhjbGVhckNhY2hlKTsKKyAgICAgICAgKmxhc3RUcmFuc2FjdGlvblVzID0gbUNhY2hlLm1MYXN0Q2hhbmdlVXM7CisgICAgICAgIGFjdGl2ZSA9IG1DYWNoZS5tQWN0aXZlID4gMDsKKyAgICB9CisgICAgaWYgKG1WYWxpZCAmJiBtTG9jYWwgJiYgbUxvY2FsQ29ubmVjdGlvbikgeworICAgICAgICBtTG9jYWxDb25uZWN0aW9uLT5jbGVhblVwKGNsZWFyQ2FjaGUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGFjdGl2ZTsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmFsbG9jYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipwSGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAoIW1Mb2NhbCB8fCAhbUxvY2FsQ29ubmVjdGlvbiB8fCAhbVZhbGlkKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBCdWZmZXJJZCBidWZmZXJJZDsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSA9IG51bGxwdHI7CisgICAgYnVmZmVyLT5yZXNldCgpOworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBhbGxvY2F0ZUJ1ZmZlckhhbmRsZShwYXJhbXMsICZidWZmZXJJZCwgJmhhbmRsZSk7CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubUxvY2spOworICAgICAgICAgICAgc3luY1JlbGVhc2VkKCk7CisgICAgICAgICAgICBldmljdENhY2hlcygpOworICAgICAgICAgICAgYXV0byBjYWNoZUl0ID0gbUNhY2hlLm1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICAgICAgaWYgKGNhY2hlSXQgIT0gbUNhY2hlLm1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogdmVyaWZ5IGl0IGlzIHJlY3ljbGVkLiAobm90IGhhdmluZyBhY3RpdmUgcmVmKQorICAgICAgICAgICAgICAgIG1DYWNoZS5tQnVmZmVycy5lcmFzZShjYWNoZUl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gY2xpZW50QnVmZmVyID0gc3RkOjptYWtlX3VuaXF1ZTxDbGllbnRCdWZmZXI+KAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChjbGllbnRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IG1DYWNoZS5tQnVmZmVycy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJJZCwgc3RkOjptb3ZlKGNsaWVudEJ1ZmZlcikpKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnNlY29uZCkgeworICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gcmVzdWx0LmZpcnN0LT5zZWNvbmQtPmNyZWF0ZUNhY2hlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9mcm9tX3RoaXMoKSwgcEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FjaGUuaW5jQWN0aXZlX2woKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoISpidWZmZXIpIHsKKyAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgY2FjaGUgY3JlYXRpb24gZmFpbHVyZSAlZDogJWxsZCIsCisgICAgICAgICAgICAgICAgICBoYW5kbGUgIT0gbnVsbHB0ciwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgICAgICAgICAgcG9zdEJ1ZmZlclJlbGVhc2UoYnVmZmVySWQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpyZWNlaXZlKAorICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipwSGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAoIW1WYWxpZCkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgaWYgKHRpbWVzdGFtcFVzICE9IDApIHsKKyAgICAgICAgdGltZXN0YW1wVXMgKz0ga1JlY2VpdmVUaW1lb3V0VXM7CisgICAgfQorICAgIGlmICghcG9zdFJlY2VpdmUoYnVmZmVySWQsIHRyYW5zYWN0aW9uSWQsIHRpbWVzdGFtcFVzKSkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgYnVmZmVyLT5yZXNldCgpOworICAgIHdoaWxlKDEpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTG9jayk7CisgICAgICAgIHN5bmNSZWxlYXNlZCgpOworICAgICAgICBldmljdENhY2hlcygpOworICAgICAgICBhdXRvIGNhY2hlSXQgPSBtQ2FjaGUubUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgIGlmIChjYWNoZUl0ICE9IG1DYWNoZS5tQnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgaWYgKGNhY2hlSXQtPnNlY29uZC0+aGFzQ2FjaGUoKSkgeworICAgICAgICAgICAgICAgICpidWZmZXIgPSBjYWNoZUl0LT5zZWNvbmQtPmZldGNoQ2FjaGUocEhhbmRsZSk7CisgICAgICAgICAgICAgICAgaWYgKCEqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRyYW5zZmVyIHRpbWVfb3V0CisgICAgICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnlpZWxkKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigiY2xpZW50IHJlY2VpdmUgZnJvbSByZWZlcmVuY2UgJWxsZCIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICpidWZmZXIgPSBjYWNoZUl0LT5zZWNvbmQtPmNyZWF0ZUNhY2hlKHNoYXJlZF9mcm9tX3RoaXMoKSwgcEhhbmRsZSk7CisgICAgICAgICAgICAgICAgaWYgKCpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhY2hlLmluY0FjdGl2ZV9sKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgcmVjZWl2ZSBmcm9tIGNhY2hlICVsbGQiLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFtQ2FjaGUubUNyZWF0aW5nKSB7CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DcmVhdGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gZmV0Y2hCdWZmZXJIYW5kbGUodHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsICZoYW5kbGUpOworICAgICAgICAgICAgICAgIGxvY2subG9jaygpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGNsaWVudEJ1ZmZlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q2xpZW50QnVmZmVyPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0byByZXN1bHQgPSBtQ2FjaGUubUJ1ZmZlcnMuaW5zZXJ0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoYnVmZmVySWQsIHN0ZDo6bW92ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50QnVmZmVyKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc2Vjb25kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSByZXN1bHQuZmlyc3QtPnNlY29uZC0+Y3JlYXRlQ2FjaGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX2Zyb21fdGhpcygpLCBwSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWNoZS5pbmNBY3RpdmVfbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghKmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DcmVhdGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DcmVhdGVDdi5ub3RpZnlfYWxsKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2FjaGUubUNyZWF0ZUN2LndhaXQobG9jayk7CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBuZWVkc1N5bmMgPSBmYWxzZTsKKyAgICBib29sIHBvc3RlZCA9IHBvc3RSZWNlaXZlUmVzdWx0KGJ1ZmZlcklkLCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID8gdHJ1ZSA6IGZhbHNlLCAmbmVlZHNTeW5jKTsKKyAgICBBTE9HVigiY2xpZW50IHJlY2VpdmUgJWxsZCAtICV1IDogJXMgKCVkKSIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgKmJ1ZmZlciA/ICJvayIgOiAiZmFpbCIsIHBvc3RlZCk7CisgICAgaWYgKG1WYWxpZCAmJiBtTG9jYWwgJiYgbUxvY2FsQ29ubmVjdGlvbikgeworICAgICAgICBtTG9jYWxDb25uZWN0aW9uLT5jbGVhblVwKGZhbHNlKTsKKyAgICB9CisgICAgaWYgKG5lZWRzU3luYyAmJiBtUmVtb3RlQ29ubmVjdGlvbikgeworICAgICAgICB0cnlTeW5jRnJvbVJlbW90ZSgpOworICAgIH0KKyAgICBpZiAoKmJ1ZmZlcikgeworICAgICAgICBpZiAoIXBvc3RlZCkgeworICAgICAgICAgICAgYnVmZmVyLT5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKwordm9pZCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpwb3N0QnVmZmVyUmVsZWFzZShCdWZmZXJJZCBidWZmZXJJZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcy5wdXNoX2JhY2soYnVmZmVySWQpOworICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJSZWxlYXNlKAorICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLCBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7Cit9CisKKy8vIFRPRE86IHJldmlzZSBhZC1ob2MgcG9zdGluZyBkYXRhIHN0cnVjdHVyZQorYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpwb3N0U2VuZCgKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIENvbm5lY3Rpb25JZCByZWNlaXZlciwKKyAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwgaW50NjRfdCAqdGltZXN0YW1wVXMpIHsKKyAgICBib29sIHJldCA9IGZhbHNlOworICAgIGJvb2wgbmVlZHNTeW5jID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAgICAgKnRpbWVzdGFtcFVzID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgICp0cmFuc2FjdGlvbklkID0gKG1Db25uZWN0aW9uSWQgPDwgMzIpIHwgbVNlcUlkKys7CisgICAgICAgIC8vIFRPRE86IHJldHJ5LCBhZGQgdGltZW91dCwgdGFyZ2V0PworICAgICAgICByZXQgPSAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgICAgICAgICAgKnRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX1RPLCBtQ29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgIHJlY2VpdmVyLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKKyAgICAgICAgbmVlZHNTeW5jID0gIW1Mb2NhbCAmJiBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5uZWVkc1N5bmMoKTsKKyAgICB9CisgICAgaWYgKG1WYWxpZCAmJiBtTG9jYWwgJiYgbUxvY2FsQ29ubmVjdGlvbikgeworICAgICAgICBtTG9jYWxDb25uZWN0aW9uLT5jbGVhblVwKGZhbHNlKTsKKyAgICB9CisgICAgaWYgKG5lZWRzU3luYyAmJiBtUmVtb3RlQ29ubmVjdGlvbikgeworICAgICAgICB0cnlTeW5jRnJvbVJlbW90ZSgpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnBvc3RSZWNlaXZlKAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrUG9zdE1heFJldHJ5OyArK2kpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgICAgICBpbnQ2NF90IG5vdyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgICAgICBpZiAodGltZXN0YW1wVXMgPT0gMCB8fCBub3cgPCB0aW1lc3RhbXBVcykgeworICAgICAgICAgICAgYm9vbCByZXN1bHQgPSBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRlJPTSwKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgLTEsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywKKyAgICAgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgICAgICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnlpZWxkKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgLTEsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywKKyAgICAgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpwb3N0UmVjZWl2ZVJlc3VsdCgKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgYm9vbCByZXN1bHQsIGJvb2wgKm5lZWRzU3luYykgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgIC8vIFRPRE86IHJldHJ5LCBhZGQgdGltZW91dAorICAgIGJvb2wgcmV0ID0gbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwKKyAgICAgICAgICAgIHJlc3VsdCA/IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfT0sgOiBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0VSUk9SLAorICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgLTEsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywKKyAgICAgICAgICAgIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKKyAgICAqbmVlZHNTeW5jID0gIW1Mb2NhbCAmJiBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5uZWVkc1N5bmMoKTsKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnRyeVN5bmNGcm9tUmVtb3RlKCkgeworICAgIGlmIChtUmVtb3RlU3luY0xvY2sudHJ5X2xvY2soKSkgeworICAgICAgICBib29sIG5lZWRzU3luYyA9IGZhbHNlOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAgICAgICAgIG5lZWRzU3luYyA9IG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPm5lZWRzU3luYygpOworICAgICAgICB9CisgICAgICAgIGlmIChuZWVkc1N5bmMpIHsKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCA9IChtQ29ubmVjdGlvbklkIDw8IDMyKTsKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkID0gQ29ubmVjdGlvbjo6U1lOQ19CVUZGRVJJRDsKKyAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1Jlc3VsdCA9IG1SZW1vdGVDb25uZWN0aW9uLT5mZXRjaCgKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgIFtdCisgICAgICAgICAgICAgICAgICAgIChSZXN1bHRTdGF0dXMgb3V0U3RhdHVzLCBCdWZmZXIgb3V0QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgb3V0U3RhdHVzOworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIG91dEJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgbVJlbW90ZVN5bmNMb2NrLnVubG9jaygpOworICAgIH0KK30KKworLy8gc2hvdWxkIGhhdmUgbUNhY2hlLm1Mb2NrCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnN5bmNSZWxlYXNlZCgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICBpZiAobVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclJlbGVhc2UoCisgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLAorICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKKyAgICB9CisgICAgaWYgKG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgZm9yIChCdWZmZXJJZCYgaWQ6IG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKSB7CisgICAgICAgICAgICBBTE9HVigiY2xpZW50IHJlbGVhc2UgYnVmZmVyICVsbGQgLSAldSIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgaWQpOworICAgICAgICAgICAgYXV0byBmb3VuZCA9IG1DYWNoZS5tQnVmZmVycy5maW5kKGlkKTsKKyAgICAgICAgICAgIGlmIChmb3VuZCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZm91bmQtPnNlY29uZC0+b25DYWNoZVJlbGVhc2UoKSkgeworICAgICAgICAgICAgICAgICAgICBtQ2FjaGUuZGVjQWN0aXZlX2woKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgbm90IGhhcHBlbiEKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImNsaWVudCAlbGxkIGNhY2hlIHJlbGVhc2Ugc3RhdHVzIGluY29uc2l0ZW50ISIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBzaG91bGQgbm90IGhhcHBlbiEKKyAgICAgICAgICAgICAgICBBTE9HVygiY2xpZW50ICVsbGQgY2FjaGUgc3RhdHVzIGluY29uc2l0ZW50ISIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLy8gc2hvdWxkIGhhdmUgbUNhY2hlLm1Mb2NrCit2b2lkIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmV2aWN0Q2FjaGVzKGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGludDY0X3Qgbm93ID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgaWYgKG5vdyA+PSBtTGFzdEV2aWN0Q2FjaGVVcyArIGtDYWNoZVR0bFVzIHx8IGNsZWFyQ2FjaGUpIHsKKyAgICAgICAgc2l6ZV90IGV2aWN0ZWQgPSAwOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQ2FjaGUubUJ1ZmZlcnMuYmVnaW4oKTsgaXQgIT0gbUNhY2hlLm1CdWZmZXJzLmVuZCgpOykgeworICAgICAgICAgICAgaWYgKCFpdC0+c2Vjb25kLT5oYXNDYWNoZSgpICYmIChpdC0+c2Vjb25kLT5leHBpcmUoKSB8fCBjbGVhckNhY2hlKSkgeworICAgICAgICAgICAgICAgIGl0ID0gbUNhY2hlLm1CdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICArK2V2aWN0ZWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImNhY2hlIGNvdW50ICVsbGQgOiB0b3RhbCAlenUsIGFjdGl2ZSAlZCwgZXZpY3RlZCAlenUiLAorICAgICAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsIG1DYWNoZS5tQnVmZmVycy5zaXplKCksIG1DYWNoZS5tQWN0aXZlLCBldmljdGVkKTsKKyAgICAgICAgbUxhc3RFdmljdENhY2hlVXMgPSBub3c7CisgICAgfQorfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6YWxsb2NhdGVCdWZmZXJIYW5kbGUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgaWYgKG1Mb2NhbENvbm5lY3Rpb24pIHsKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiBhbGxvY0hhbmRsZSA9IG51bGxwdHI7CisgICAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtTG9jYWxDb25uZWN0aW9uLT5hbGxvY2F0ZSgKKyAgICAgICAgICAgICAgICBwYXJhbXMsIGJ1ZmZlcklkLCAmYWxsb2NIYW5kbGUpOworICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICpoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2Nsb25lKGFsbG9jSGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiY2xpZW50IGFsbG9jYXRlIHJlc3VsdCAlbGxkICVkIDogJXUgY2xvbmUgJXAiLAorICAgICAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsIHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LLAorICAgICAgICAgICAgICAqaGFuZGxlID8gKmJ1ZmZlcklkIDogMCAsICpoYW5kbGUpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmZldGNoQnVmZmVySGFuZGxlKAorICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpIHsKKyAgICBzcDxJQ29ubmVjdGlvbj4gY29ubmVjdGlvbjsKKyAgICBpZiAobUxvY2FsKSB7CisgICAgICAgIGNvbm5lY3Rpb24gPSBtTG9jYWxDb25uZWN0aW9uOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbm5lY3Rpb24gPSBtUmVtb3RlQ29ubmVjdGlvbjsKKyAgICB9CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPSBjb25uZWN0aW9uLT5mZXRjaCgKKyAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLAorICAgICAgICAgICAgWyZzdGF0dXMsICZoYW5kbGVdCisgICAgICAgICAgICAoUmVzdWx0U3RhdHVzIG91dFN0YXR1cywgQnVmZmVyIG91dEJ1ZmZlcikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IG91dFN0YXR1czsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKmhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY2xvbmUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLmJ1ZmZlci5nZXROYXRpdmVIYW5kbGUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHRyYW5zUmVzdWx0LmlzT2soKSA/IHN0YXR1cyA6IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKKworQnVmZmVyUG9vbENsaWVudDo6QnVmZmVyUG9vbENsaWVudChjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yKSB7CisgICAgbUltcGwgPSBzdGQ6Om1ha2Vfc2hhcmVkPEltcGw+KGFjY2Vzc29yKTsKK30KKworQnVmZmVyUG9vbENsaWVudDo6QnVmZmVyUG9vbENsaWVudChjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3NvcikgeworICAgIG1JbXBsID0gc3RkOjptYWtlX3NoYXJlZDxJbXBsPihhY2Nlc3Nvcik7Cit9CisKK0J1ZmZlclBvb2xDbGllbnQ6On5CdWZmZXJQb29sQ2xpZW50KCkgeworICAgIC8vIFRPRE86IGhvdyB0byBoYW5kbGUgb3JwaGFuZWQgYnVmZmVycz8KK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50Ojppc1ZhbGlkKCkgeworICAgIHJldHVybiBtSW1wbCAmJiBtSW1wbC0+aXNWYWxpZCgpOworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OmlzTG9jYWwoKSB7CisgICAgcmV0dXJuIG1JbXBsICYmIG1JbXBsLT5pc0xvY2FsKCk7Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6aXNBY3RpdmUoaW50NjRfdCAqbGFzdFRyYW5zYWN0aW9uVXMsIGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGlmICghaXNWYWxpZCgpKSB7CisgICAgICAgICpsYXN0VHJhbnNhY3Rpb25VcyA9IDA7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIG1JbXBsLT5pc0FjdGl2ZShsYXN0VHJhbnNhY3Rpb25VcywgY2xlYXJDYWNoZSk7Cit9CisKK0Nvbm5lY3Rpb25JZCBCdWZmZXJQb29sQ2xpZW50OjpnZXRDb25uZWN0aW9uSWQoKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gbUltcGwtPmdldENvbm5lY3Rpb25JZCgpOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpnZXRBY2Nlc3NvcihzcDxJQWNjZXNzb3I+ICphY2Nlc3NvcikgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgKmFjY2Vzc29yID0gbUltcGwtPmdldEFjY2Vzc29yKCk7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OmFsbG9jYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5hbGxvY2F0ZShwYXJhbXMsIGhhbmRsZSwgYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpyZWNlaXZlKAorICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5yZWNlaXZlKHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCB0aW1lc3RhbXBVcywgaGFuZGxlLCBidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OnBvc3RTZW5kKAorICAgICAgICBDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLAorICAgICAgICBpbnQ2NF90ICp0aW1lc3RhbXBVcykgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgYm9vbCByZXN1bHQgPSBtSW1wbC0+cG9zdFNlbmQoCisgICAgICAgICAgICAgICAgYnVmZmVyLT5tSWQsIHJlY2VpdmVySWQsIHRyYW5zYWN0aW9uSWQsIHRpbWVzdGFtcFVzKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdCA/IFJlc3VsdFN0YXR1czo6T0sgOiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyUG9vbENsaWVudC5oIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyUG9vbENsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3N2VmZWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJQb29sQ2xpZW50LmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0JVRkZFUlBPT0xDTElFTlRfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9CVUZGRVJQT09MQ0xJRU5UX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0lBY2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8xLjAvSUNvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oPgorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSAiQWNjZXNzb3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUFjY2Vzc29yOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklDb25uZWN0aW9uOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKKy8qKgorICogQSBidWZmZXIgcG9vbCBjbGllbnQgZm9yIGEgYnVmZmVyIHBvb2wuIEZvciBhIHNwZWNpZmljIGJ1ZmZlciBwb29sLCBhdCBtb3N0CisgKiBvbmUgYnVmZmVyIHBvb2wgY2xpZW50IGV4aXN0cyBwZXIgcHJvY2Vzcy4gVGhpcyBjbGFzcyB3aWxsIG5vdCBiZSBleHBvc2VkCisgKiBvdXRzaWRlLiBBIGJ1ZmZlciBwb29sIGNsaWVudCB3aWxsIGJlIHVzZWQgdmlhIENsaWVudE1hbmFnZXIuCisgKi8KK2NsYXNzIEJ1ZmZlclBvb2xDbGllbnQgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBidWZmZXIgcG9vbCBjbGllbnQgZnJvbSBhIGxvY2FsIGJ1ZmZlciBwb29sCisgICAgICogKHZpYSBDbGllbnRNYW5hZ2VyI2NyZWF0ZSkuCisgICAgICovCisgICAgZXhwbGljaXQgQnVmZmVyUG9vbENsaWVudChjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBidWZmZXIgcG9vbCBjbGllbnQgZnJvbSBhIHJlbW90ZSBidWZmZXIgcG9vbAorICAgICAqICh2aWEgQ2xpZW50TWFuYWdlciNyZWdpc3RlclNlbmRlcikuCisgICAgICogTm90ZTogQSBidWZmZXIgcG9vbCBjbGllbnQgY3JlYXRlZCB3aXRoIHJlbW90ZSBidWZmZXIgcG9vbCBjYW5ub3QKKyAgICAgKiBhbGxvY2F0ZSBhIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBleHBsaWNpdCBCdWZmZXJQb29sQ2xpZW50KGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yKTsKKworICAgIC8qKiBEZXN0cnVjdHMgYSBidWZmZXIgcG9vbCBjbGllbnQuICovCisgICAgfkJ1ZmZlclBvb2xDbGllbnQoKTsKKworcHJpdmF0ZToKKyAgICBib29sIGlzVmFsaWQoKTsKKworICAgIGJvb2wgaXNMb2NhbCgpOworCisgICAgYm9vbCBpc0FjdGl2ZShpbnQ2NF90ICpsYXN0VHJhbnNhY3Rpb25VcywgYm9vbCBjbGVhckNhY2hlKTsKKworICAgIENvbm5lY3Rpb25JZCBnZXRDb25uZWN0aW9uSWQoKTsKKworICAgIFJlc3VsdFN0YXR1cyBnZXRBY2Nlc3NvcihzcDxJQWNjZXNzb3I+ICphY2Nlc3Nvcik7CisKKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgUmVzdWx0U3RhdHVzIHJlY2VpdmUoVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICBSZXN1bHRTdGF0dXMgcG9zdFNlbmQoQ29ubmVjdGlvbklkIHJlY2VpdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVzdGFtcFVzKTsKKworICAgIGNsYXNzIEltcGw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOworCisgICAgZnJpZW5kIHN0cnVjdCBDbGllbnRNYW5hZ2VyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0JVRkZFUlBPT0xDTElFTlRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyU3RhdHVzLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclN0YXR1cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY5YWJjZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclN0YXR1cy5jcHAKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclBvb2xTdGF0dXMiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSAiQnVmZmVyU3RhdHVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworaW50NjRfdCBnZXRUaW1lc3RhbXBOb3coKSB7CisgICAgaW50NjRfdCBzdGFtcDsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7CisgICAgLy8gVE9ETzogQ0xPQ0tfTU9OT1RPTklDX0NPQVJTRT8KKyAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnRzKTsKKyAgICBzdGFtcCA9IHRzLnR2X25zZWMgLyAxMDAwOworICAgIHN0YW1wICs9ICh0cy50dl9zZWMgKiAxMDAwMDAwTEwpOworICAgIHJldHVybiBzdGFtcDsKK30KKworc3RhdGljIGNvbnN0ZXhwciBpbnQga051bUVsZW1lbnRzSW5RdWV1ZSA9IDEwMjQqMTY7CitzdGF0aWMgY29uc3RleHByIGludCBrTWluRWxlbWVudHNUb1N5bmNJblF1ZXVlID0gMTI4OworCitSZXN1bHRTdGF0dXMgQnVmZmVyU3RhdHVzT2JzZXJ2ZXI6Om9wZW4oCisgICAgICAgIENvbm5lY3Rpb25JZCBpZCwgY29uc3QgUXVldWVEZXNjcmlwdG9yKiogZm1xRGVzY1B0cikgeworICAgIGlmIChtQnVmZmVyU3RhdHVzUXVldWVzLmZpbmQoaWQpICE9IG1CdWZmZXJTdGF0dXNRdWV1ZXMuZW5kKCkpIHsKKyAgICAgICAgLy8gVE9ETzogaWQgY29sbGlzaW9uIGxvZz8KKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNRdWV1ZT4gcXVldWUgPQorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJTdGF0dXNRdWV1ZT4oa051bUVsZW1lbnRzSW5RdWV1ZSk7CisgICAgaWYgKCFxdWV1ZSB8fCBxdWV1ZS0+aXNWYWxpZCgpID09IGZhbHNlKSB7CisgICAgICAgICpmbXFEZXNjUHRyID0gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgIH0gZWxzZSB7CisgICAgICAgICpmbXFEZXNjUHRyID0gcXVldWUtPmdldERlc2MoKTsKKyAgICB9CisgICAgYXV0byByZXN1bHQgPSBtQnVmZmVyU3RhdHVzUXVldWVzLmluc2VydCgKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKGlkLCBzdGQ6Om1vdmUocXVldWUpKSk7CisgICAgaWYgKCFyZXN1bHQuc2Vjb25kKSB7CisgICAgICAgICpmbXFEZXNjUHRyID0gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclN0YXR1c09ic2VydmVyOjpjbG9zZShDb25uZWN0aW9uSWQgaWQpIHsKKyAgICBpZiAobUJ1ZmZlclN0YXR1c1F1ZXVlcy5maW5kKGlkKSA9PSBtQnVmZmVyU3RhdHVzUXVldWVzLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBtQnVmZmVyU3RhdHVzUXVldWVzLmVyYXNlKGlkKTsKKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKK30KKwordm9pZCBCdWZmZXJTdGF0dXNPYnNlcnZlcjo6Z2V0QnVmZmVyU3RhdHVzQ2hhbmdlcyhzdGQ6OnZlY3RvcjxCdWZmZXJTdGF0dXNNZXNzYWdlPiAmbWVzc2FnZXMpIHsKKyAgICBmb3IgKGF1dG8gaXQgPSBtQnVmZmVyU3RhdHVzUXVldWVzLmJlZ2luKCk7IGl0ICE9IG1CdWZmZXJTdGF0dXNRdWV1ZXMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgQnVmZmVyU3RhdHVzTWVzc2FnZSBtZXNzYWdlOworICAgICAgICBzaXplX3QgYXZhaWwgPSBpdC0+c2Vjb25kLT5hdmFpbGFibGVUb1JlYWQoKTsKKyAgICAgICAgd2hpbGUgKGF2YWlsID4gMCkgeworICAgICAgICAgICAgaWYgKCFpdC0+c2Vjb25kLT5yZWFkKCZtZXNzYWdlLCAxKSkgeworICAgICAgICAgICAgICAgIC8vIFNpbmNlIGF2YWxpYWJsZSAjIG9mIHJlYWRzIGFyZSBhbHJlYWR5IGNvbmZpcm1lZCwKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nIChzcHVyaW91cyBjbGllbnQ/KQorICAgICAgICAgICAgICAgIEFMT0dXKCJGTVEgbWVzc2FnZSBjYW5ub3QgYmUgcmVhZCBmcm9tICVsbGQiLCAobG9uZyBsb25nKWl0LT5maXJzdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVzc2FnZS5jb25uZWN0aW9uSWQgPSBpdC0+Zmlyc3Q7CisgICAgICAgICAgICBtZXNzYWdlcy5wdXNoX2JhY2sobWVzc2FnZSk7CisgICAgICAgICAgICAtLWF2YWlsOworICAgICAgICB9CisgICAgfQorfQorCitCdWZmZXJTdGF0dXNDaGFubmVsOjpCdWZmZXJTdGF0dXNDaGFubmVsKAorICAgICAgICBjb25zdCBRdWV1ZURlc2NyaXB0b3IgJmZtcURlc2MpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzUXVldWU+IHF1ZXVlID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVyU3RhdHVzUXVldWU+KGZtcURlc2MpOworICAgIGlmICghcXVldWUgfHwgcXVldWUtPmlzVmFsaWQoKSA9PSBmYWxzZSkgeworICAgICAgICBtVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtVmFsaWQgID0gdHJ1ZTsKKyAgICBtQnVmZmVyU3RhdHVzUXVldWUgPSBzdGQ6Om1vdmUocXVldWUpOworfQorCitib29sIEJ1ZmZlclN0YXR1c0NoYW5uZWw6OmlzVmFsaWQoKSB7CisgICAgcmV0dXJuIG1WYWxpZDsKK30KKworYm9vbCBCdWZmZXJTdGF0dXNDaGFubmVsOjpuZWVkc1N5bmMoKSB7CisgICAgaWYgKG1WYWxpZCkgeworICAgICAgICBzaXplX3QgYXZhaWwgPSBtQnVmZmVyU3RhdHVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKTsKKyAgICAgICAgcmV0dXJuIGF2YWlsICsga01pbkVsZW1lbnRzVG9TeW5jSW5RdWV1ZSA8IGtOdW1FbGVtZW50c0luUXVldWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBCdWZmZXJTdGF0dXNDaGFubmVsOjpwb3N0QnVmZmVyUmVsZWFzZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcGVuZGluZywgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcG9zdGVkKSB7CisgICAgaWYgKG1WYWxpZCAmJiBwZW5kaW5nLnNpemUoKSA+IDApIHsKKyAgICAgICAgc2l6ZV90IGF2YWlsID0gbUJ1ZmZlclN0YXR1c1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCk7CisgICAgICAgIGF2YWlsID0gc3RkOjptaW4oYXZhaWwsIHBlbmRpbmcuc2l6ZSgpKTsKKyAgICAgICAgQnVmZmVyU3RhdHVzTWVzc2FnZSBtZXNzYWdlOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMCA7IGkgPCBhdmFpbDsgKytpKSB7CisgICAgICAgICAgICBCdWZmZXJJZCBpZCA9IHBlbmRpbmcuZnJvbnQoKTsKKyAgICAgICAgICAgIG1lc3NhZ2UubmV3U3RhdHVzID0gQnVmZmVyU3RhdHVzOjpOT1RfVVNFRDsKKyAgICAgICAgICAgIG1lc3NhZ2UuYnVmZmVySWQgPSBpZDsKKyAgICAgICAgICAgIG1lc3NhZ2UuY29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICAgICAgICAgICAgaWYgKCFtQnVmZmVyU3RhdHVzUXVldWUtPndyaXRlKCZtZXNzYWdlLCAxKSkgeworICAgICAgICAgICAgICAgIC8vIFNpbmNlIGF2YWxpYWJsZSAjIG9mIHdyaXRlcyBhcmUgYWxyZWFkeSBjb25maXJtZWQsCisgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kaW5nPworICAgICAgICAgICAgICAgIEFMT0dXKCJGTVEgbWVzc2FnZSBjYW5ub3QgYmUgc2VudCBmcm9tICVsbGQiLCAobG9uZyBsb25nKWNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGVuZGluZy5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgIHBvc3RlZC5wdXNoX2JhY2soaWQpOworICAgICAgICB9CisgICAgfQorfQorCitib29sIEJ1ZmZlclN0YXR1c0NoYW5uZWw6OnBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICBCdWZmZXJTdGF0dXMgc3RhdHVzLCBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBDb25uZWN0aW9uSWQgdGFyZ2V0SWQsCisgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBlbmRpbmcsIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBvc3RlZCkgeworICAgIGlmIChtVmFsaWQpIHsKKyAgICAgICAgc2l6ZV90IGF2YWlsID0gbUJ1ZmZlclN0YXR1c1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCk7CisgICAgICAgIHNpemVfdCBudW1QZW5kaW5nID0gcGVuZGluZy5zaXplKCk7CisgICAgICAgIGlmIChhdmFpbCA+PSBudW1QZW5kaW5nICsgMSkgeworICAgICAgICAgICAgQnVmZmVyU3RhdHVzTWVzc2FnZSByZWxlYXNlLCBtZXNzYWdlOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1QZW5kaW5nOyArK2kpIHsKKyAgICAgICAgICAgICAgICBCdWZmZXJJZCBpZCA9IHBlbmRpbmcuZnJvbnQoKTsKKyAgICAgICAgICAgICAgICByZWxlYXNlLm5ld1N0YXR1cyA9IEJ1ZmZlclN0YXR1czo6Tk9UX1VTRUQ7CisgICAgICAgICAgICAgICAgcmVsZWFzZS5idWZmZXJJZCA9IGlkOworICAgICAgICAgICAgICAgIHJlbGVhc2UuY29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICAgICAgICAgICAgICAgIGlmICghbUJ1ZmZlclN0YXR1c1F1ZXVlLT53cml0ZSgmcmVsZWFzZSwgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgYXZhbGlhYmxlICMgb2Ygd3JpdGVzIGFyZSBhbHJlYWR5IGNvbmZpcm1lZCwKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmc/CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJGTVEgbWVzc2FnZSBjYW5ub3QgYmUgc2VudCBmcm9tICVsbGQiLCAobG9uZyBsb25nKWNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGVuZGluZy5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgICAgICBwb3N0ZWQucHVzaF9iYWNrKGlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCA9IHRyYW5zYWN0aW9uSWQ7CisgICAgICAgICAgICBtZXNzYWdlLmJ1ZmZlcklkID0gYnVmZmVySWQ7CisgICAgICAgICAgICBtZXNzYWdlLm5ld1N0YXR1cyA9IHN0YXR1czsKKyAgICAgICAgICAgIG1lc3NhZ2UuY29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICAgICAgICAgICAgbWVzc2FnZS50YXJnZXRDb25uZWN0aW9uSWQgPSB0YXJnZXRJZDsKKyAgICAgICAgICAgIC8vIFRPRE8gOiB0aW1lc2F0YW1wCisgICAgICAgICAgICBtZXNzYWdlLnRpbWVzdGFtcFVzID0gMDsKKyAgICAgICAgICAgIGlmICghbUJ1ZmZlclN0YXR1c1F1ZXVlLT53cml0ZSgmbWVzc2FnZSwgMSkpIHsKKyAgICAgICAgICAgICAgICAvLyBTaW5jZSBhdmFsaWFibGUgIyBvZiB3cml0ZXMgYXJlIGFscmVhZHkgY29uZmlybWVkLAorICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCisgICAgICAgICAgICAgICAgQUxPR1coIkZNUSBtZXNzYWdlIGNhbm5vdCBiZSBzZW50IGZyb20gJWxsZCIsIChsb25nIGxvbmcpY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyU3RhdHVzLmggYi9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJTdGF0dXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMThhOTIxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyU3RhdHVzLmgKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0JVRkZFUlNUQVRVU19ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0JVRkZFUlNUQVRVU19ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bGlzdD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCisvKiogUmV0dXJucyBtb25vdG9uaWMgdGltZXN0YW1wIGluIFVzIHNpbmNlIGZpeGVkIHBvaW50IGluIHRpbWUuICovCitpbnQ2NF90IGdldFRpbWVzdGFtcE5vdygpOworCisvKioKKyAqIEEgY29sbGVjdGlvbiBvZiBGTVEgZm9yIGEgYnVmZmVyIHBvb2wuIGJ1ZmZlciBvd25lcnNoaXAvc3RhdHVzIGNoYW5nZQorICogbWVzc2FnZXMgYXJlIHNlbnQgdmlhIHRoZSBGTVFzIGZyb20gdGhlIGNsaWVudHMuCisgKi8KK2NsYXNzIEJ1ZmZlclN0YXR1c09ic2VydmVyIHsKK3ByaXZhdGU6CisgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzUXVldWU+PgorICAgICAgICAgICAgbUJ1ZmZlclN0YXR1c1F1ZXVlczsKKworcHVibGljOgorICAgIC8qKiBDcmVhdGVzIGFuIEZNUSBmb3IgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uKGNsaWVudCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBjb25uZWN0aW9uIElkIG9mIHRoZSBzcGVjaWZpZWQgY2xpZW50LgorICAgICAqIEBwYXJhbSBmbXFEZXNjUHRyICAgIGRvdWJsZSBwdHIgb2YgY3JlYXRlZCBGTVEncyBkZXNjcmlwdG9yLgorICAgICAqCisgICAgICogQHJldHVybiBPSyBpZiBGTVEgaXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIG9wZW4oQ29ubmVjdGlvbklkIGlkLCBjb25zdCBRdWV1ZURlc2NyaXB0b3IqKiBmbXFEZXNjUHRyKTsKKworICAgIC8qKiBDbG9zZXMgYW4gRk1RIGZvciB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24oY2xpZW50KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIHNwZWNpZmllZCBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIGlmIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiBpcyBjbG9zZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBjbG9zZShDb25uZWN0aW9uSWQgaWQpOworCisgICAgLyoqIFJldHJpZXZlcyBhbGwgcGVuZGluZyBGTVEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcyBmcm9tIGNsaWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZXMgIHJldHJpZXZlZCBwZW5kaW5nIG1lc3NhZ2VzLgorICAgICAqLworICAgIHZvaWQgZ2V0QnVmZmVyU3RhdHVzQ2hhbmdlcyhzdGQ6OnZlY3RvcjxCdWZmZXJTdGF0dXNNZXNzYWdlPiAmbWVzc2FnZXMpOworfTsKKworLyoqCisgKiBBbiBGTVEgZm9yIGEgYnVmZmVyIHBvb2wgY2xpZW50LiBCdWZmZXIgb3duZXJzaGlwL3N0YXR1cyBjaGFuZ2UgbWVzc2FnZXMKKyAqIGFyZSBzZW50IHZpYSB0aGUgZm1xIHRvIHRoZSBidWZmZXIgcG9vbC4KKyAqLworY2xhc3MgQnVmZmVyU3RhdHVzQ2hhbm5lbCB7Citwcml2YXRlOgorICAgIGJvb2wgbVZhbGlkOworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNRdWV1ZT4gbUJ1ZmZlclN0YXR1c1F1ZXVlOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29ubmVjdHMgdG8gYW4gRk1RIGZyb20gYSBkZXNjcmlwdG9yIG9mIHRoZSBjcmVhdGVkIEZNUS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbXFEZXNjICAgRGVzY3JpcHRvciBvZiB0aGUgY3JlYXRlZCBGTVEuCisgICAgICovCisgICAgQnVmZmVyU3RhdHVzQ2hhbm5lbChjb25zdCBRdWV1ZURlc2NyaXB0b3IgJmZtcURlc2MpOworCisgICAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgRk1RIGlzIGNvbm5lY3RlZCBzdWNjZXNzZnVsbHkuICovCisgICAgYm9vbCBpc1ZhbGlkKCk7CisKKyAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBGTVEgbmVlZHMgdG8gYmUgc3luY2VkIGZyb20gdGhlIGJ1ZmZlciBwb29sICovCisgICAgYm9vbCBuZWVkc1N5bmMoKTsKKworICAgIC8qKgorICAgICAqIFBvc3RzIGEgYnVmZmVyIHJlbGVhc2UgbWVzc2FnZSB0byB0aGUgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBjb25uZWN0aW9uIElkIG9mIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIHBlbmRpbmcgICAgICAgY3VycmVudGx5IHBlbmRpbmcgYnVmZmVyIHJlbGVhc2UgbWVzc2FnZXMuCisgICAgICogQHBhcmFtIHBvc3RlZCAgICAgICAgcG9zdGVkIGJ1ZmZlciByZWxlYXNlIG1lc3NhZ2VzLgorICAgICAqLworICAgIHZvaWQgcG9zdEJ1ZmZlclJlbGVhc2UoCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcGVuZGluZywgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcG9zdGVkKTsKKworICAgIC8qKgorICAgICAqIFBvc3RzIGEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIHJlZ2FyZGluZyB0aGUgc3BlY2lmaWVkIGJ1ZmZlcgorICAgICAqIHRyYW5zZmVyIHRyYW5zYWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uSWQgSWQgb2YgdGhlIHNwZWNpZmllZCB0cmFuc2FjdGlvbi4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICBidWZmZXIgSWQgb2YgdGhlIHNwZWNpZmllZCB0cmFuc2FjdGlvbi4KKyAgICAgKiBAcGFyYW0gc3RhdHVzICAgICAgICBuZXcgc3RhdHVzIG9mIHRoZSBidWZmZXIuCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgY29ubmVjdGlvbiBJZCBvZiB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSB0YXJnZXRJZCAgICAgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIHJlY2VpdmVyKG9ubHkgd2hlbiB0aGUgc2VuZGVyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcG9zdHMgYSBzdGF0dXMgbWVzc2FnZSkuCisgICAgICogQHBhcmFtIHBlbmRpbmcgICAgICAgY3VycmVudGx5IHBlbmRpbmcgYnVmZmVyIHJlbGVhc2UgbWVzc2FnZXMuCisgICAgICogQHBhcmFtIHBvc3RlZCAgICAgICAgcG9zdGVkIGJ1ZmZlciByZWxlYXNlIG1lc3NhZ2VzLgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgaXMgcG9zdGVkLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbCBwb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgQnVmZmVyU3RhdHVzIHN0YXR1cywKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgdGFyZ2V0SWQsCisgICAgICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwZW5kaW5nLCBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwb3N0ZWQpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0JVRkZFUlNUQVRVU19ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9DbGllbnRNYW5hZ2VyLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0NsaWVudE1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZWEwYTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9DbGllbnRNYW5hZ2VyLmNwcApAQCAtMCwwICsxLDUwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclBvb2xNYW5hZ2VyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8YnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlICJCdWZmZXJQb29sQ2xpZW50LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtSZWdpc3RlclRpbWVvdXRVcyA9IDUwMDAwMDsgLy8gMC41IHNlYworc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtDbGVhblVwRHVyYXRpb25VcyA9IDEwMDAwMDA7IC8vIFRPRE86IDEgc2VjIHR1bmUKK3N0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrQ2xpZW50VGltZW91dFVzID0gNTAwMDAwMDsgLy8gVE9ETzogNSBzZWNzIHR1bmUKKworLyoqCisgKiBUaGUgaG9sZGVyIG9mIHRoZSBjb29raWUgb2YgcmVtb3RlIElDbGllbnRNYW5hZ2VyLgorICogVGhlIGNvb2tpZSBpcyBwcm9jZXNzIGxvY2FsbHkgdW5pcXVlIGZvciBlYWNoIElDbGllbnRNYW5hZ2VyLgorICogKFRoZSBjb29raWUgaXMgdXNlZCB0byBub3RpZnkgZGVhdGggb2YgY2xpZW50cyB0byBidWZmZXJwb29sIHByb2Nlc3MuKQorICovCitjbGFzcyBDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgY29va2llIGhvbGRlciBmb3IgcmVtb3RlIElDbGllbnRNYW5hZ2VyKHMpLgorICAgICAqLworICAgIENsaWVudE1hbmFnZXJDb29raWVIb2xkZXIoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgYSBjb29raWUgZm9yIGEgcmVtb3RlIElDbGllbnRNYW5hZ2VyLgorICAgICAqCisgICAgICogQHBhcmFtIG1hbmFnZXIgICB0aGUgc3BlY2lmaWVkIHJlbW90ZSBJQ2xpZW50TWFuYWdlci4KKyAgICAgKiBAcGFyYW0gYWRkZWQgICAgIHRydWUgd2hlbiB0aGUgc3BlY2lmaWVkIHJlbW90ZSBJQ2xpZW50TWFuYWdlciBpcyBhZGRlZAorICAgICAqICAgICAgICAgICAgICAgICAgbmV3bHksIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHByb2Nlc3MgbG9jYWxseSB1bmlxdWUgY29va2llIGZvciB0aGUgc3BlY2lmaWVkIElDbGllbnRNYW5hZ2VyLgorICAgICAqLworICAgIHVpbnQ2NF90IGdldENvb2tpZShjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJm1hbmFnZXIsIGJvb2wgKmFkZGVkKTsKKworcHJpdmF0ZToKKyAgICB1aW50NjRfdCBtU2VxSWQ7CisgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICBzdGQ6Omxpc3Q8c3RkOjpwYWlyPGNvbnN0IHdwPElDbGllbnRNYW5hZ2VyPiwgdWludDY0X3Q+PiBtTWFuYWdlcnM7Cit9OworCitDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyOjpDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyKCkgOiBtU2VxSWQoMCl7fQorCit1aW50NjRfdCBDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyOjpnZXRDb29raWUoCisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmbWFuYWdlciwKKyAgICAgICAgYm9vbCAqYWRkZWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgZm9yIChhdXRvIGl0ID0gbU1hbmFnZXJzLmJlZ2luKCk7IGl0ICE9IG1NYW5hZ2Vycy5lbmQoKTspIHsKKyAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+IGtleSA9IGl0LT5maXJzdC5wcm9tb3RlKCk7CisgICAgICAgIGlmIChrZXkpIHsKKyAgICAgICAgICAgIGlmIChpbnRlcmZhY2VzRXF1YWwoa2V5LCBtYW5hZ2VyKSkgeworICAgICAgICAgICAgICAgICphZGRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGl0ID0gbU1hbmFnZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICB1aW50NjRfdCBpZCA9IG1TZXFJZCsrOworICAgICphZGRlZCA9IHRydWU7CisgICAgbU1hbmFnZXJzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihtYW5hZ2VyLCBpZCkpOworICAgIHJldHVybiBpZDsKK30KKworY2xhc3MgQ2xpZW50TWFuYWdlcjo6SW1wbCB7CitwdWJsaWM6CisgICAgSW1wbCgpOworCisgICAgLy8gQm5SZWdpc3RlclNlbmRlcgorICAgIFJlc3VsdFN0YXR1cyByZWdpc3RlclNlbmRlcihjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKTsKKworICAgIC8vIEJwUmVnaXN0ZXJTZW5kZXIKKyAgICBSZXN1bHRTdGF0dXMgcmVnaXN0ZXJTZW5kZXIoY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+ICZyZWNlaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkIHNlbmRlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnJlY2VpdmVySWQpOworCisgICAgUmVzdWx0U3RhdHVzIGNyZWF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCk7CisKKyAgICBSZXN1bHRTdGF0dXMgY2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgUmVzdWx0U3RhdHVzIHJlY2VpdmUoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIFJlc3VsdFN0YXR1cyBwb3N0U2VuZChDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lc3RhbXBVcyk7CisKKyAgICBSZXN1bHRTdGF0dXMgZ2V0QWNjZXNzb3IoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SUFjY2Vzc29yPiAqYWNjZXNzb3IpOworCisgICAgdm9pZCBjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSA9IGZhbHNlKTsKKworcHJpdmF0ZToKKyAgICAvLyBJbiBvcmRlciB0byBwcmV2ZW50IGRlYWRsb2NrIGJldHdlZW4gbXVsdGlwbGUgbG9ja3MsCisgICAgLy8gYWx3YXlzIGxvY2sgQ2xpZW50Q2FjaGUubG9jayBiZWZvcmUgbG9ja2luZyBBY3RpdmVDbGllbnRzLmxvY2suCisgICAgc3RydWN0IENsaWVudENhY2hlIHsKKyAgICAgICAgLy8gVGhpcyBsb2NrIGlzIGhlbGQgZm9yIGJyaWVmIGR1cmF0aW9uLgorICAgICAgICAvLyBCbG9ja2luZyBvcGVyYXRpb24gaXMgbm90IHBlcmZvcm1lZCB3aGlsZSBob2xkaW5nIHRoZSBsb2NrLgorICAgICAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6cGFpcjxjb25zdCB3cDxJQWNjZXNzb3I+LCBjb25zdCBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+Pj4KKyAgICAgICAgICAgICAgICBtQ2xpZW50czsKKyAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbUNvbm5lY3RDdjsKKyAgICAgICAgYm9vbCBtQ29ubmVjdGluZzsKKyAgICAgICAgaW50NjRfdCBtTGFzdENsZWFuVXBVczsKKworICAgICAgICBDbGllbnRDYWNoZSgpIDogbUNvbm5lY3RpbmcoZmFsc2UpLCBtTGFzdENsZWFuVXBVcyhnZXRUaW1lc3RhbXBOb3coKSkge30KKyAgICB9IG1DYWNoZTsKKworICAgIC8vIEFjdGl2ZSBjbGllbnRzIHdoaWNoIGNhbiBiZSByZXRyaWV2ZWQgdmlhIENvbm5lY3Rpb25JZAorICAgIHN0cnVjdCBBY3RpdmVDbGllbnRzIHsKKyAgICAgICAgLy8gVGhpcyBsb2NrIGlzIGhlbGQgZm9yIGJyaWVmIGR1cmF0aW9uLgorICAgICAgICAvLyBCbG9ja2luZyBvcGVyYXRpb24gaXMgbm90IHBlcmZvcm1lZCBob2xkaW5nIHRoZSBsb2NrLgorICAgICAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICAgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4+CisgICAgICAgICAgICAgICAgbUNsaWVudHM7CisgICAgfSBtQWN0aXZlOworCisgICAgQ2xpZW50TWFuYWdlckNvb2tpZUhvbGRlciBtUmVtb3RlQ2xpZW50Q29va2llczsKK307CisKK0NsaWVudE1hbmFnZXI6OkltcGw6OkltcGwoKSB7fQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6cmVnaXN0ZXJTZW5kZXIoCisgICAgICAgIGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpIHsKKyAgICBjbGVhblVwKCk7CisgICAgaW50NjRfdCB0aW1lb3V0VXMgPSBnZXRUaW1lc3RhbXBOb3coKSArIGtSZWdpc3RlclRpbWVvdXRVczsKKyAgICBkbyB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubU11dGV4KTsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbUNhY2hlLm1DbGllbnRzLmJlZ2luKCk7IGl0ICE9IG1DYWNoZS5tQ2xpZW50cy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgc3A8SUFjY2Vzc29yPiBzQWNjZXNzb3IgPSBpdC0+Zmlyc3QucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKHNBY2Nlc3NvciAmJiBpbnRlcmZhY2VzRXF1YWwoc0FjY2Vzc29yLCBhY2Nlc3NvcikpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50ID0gaXQtPnNlY29uZC5sb2NrKCk7CisgICAgICAgICAgICAgICAgaWYgKGNsaWVudCkgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgICAgICAgICAgICAgICpwQ29ubmVjdGlvbklkID0gY2xpZW50LT5nZXRDb25uZWN0aW9uSWQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BY3RpdmUubUNsaWVudHMuZmluZCgqcENvbm5lY3Rpb25JZCkgIT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInJlZ2lzdGVyIGV4aXN0aW5nIGNvbm5lY3Rpb24gJWxsZCIsIChsb25nIGxvbmcpKnBDb25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6QUxSRUFEWV9FWElTVFM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DbGllbnRzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIW1DYWNoZS5tQ29ubmVjdGluZykgeworICAgICAgICAgICAgbUNhY2hlLm1Db25uZWN0aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICBSZXN1bHRTdGF0dXMgcmVzdWx0ID0gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEJ1ZmZlclBvb2xDbGllbnQ+KGFjY2Vzc29yKTsKKyAgICAgICAgICAgIGxvY2subG9jaygpOworICAgICAgICAgICAgaWYgKCFjbGllbnQpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNsaWVudC0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IGhhbmRsZSBpbnNlcnQgZmFpbC4gKG1hbGxvYyBmYWlsKQorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudD4gd2NsaWVudCA9IGNsaWVudDsKKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNsaWVudHMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGFjY2Vzc29yLCB3Y2xpZW50KSk7CisgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbklkID0gY2xpZW50LT5nZXRDb25uZWN0aW9uSWQoKTsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZS5tQ2xpZW50cy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY29uSWQsIGNsaWVudCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqcENvbm5lY3Rpb25JZCA9IGNvbklkOworICAgICAgICAgICAgICAgIEFMT0dWKCJyZWdpc3RlciBuZXcgY29ubmVjdGlvbiAlbGxkIiwgKGxvbmcgbG9uZykqcENvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2FjaGUubUNvbm5lY3RpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICBtQ2FjaGUubUNvbm5lY3RDdi5ub3RpZnlfYWxsKCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIG1DYWNoZS5tQ29ubmVjdEN2LndhaXRfZm9yKAorICAgICAgICAgICAgICAgIGxvY2ssIHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHMoa1JlZ2lzdGVyVGltZW91dFVzKSk7CisgICAgfSB3aGlsZSAoZ2V0VGltZXN0YW1wTm93KCkgPCB0aW1lb3V0VXMpOworICAgIC8vIFRPRE86IHJldHVybiB0aW1lb3V0IGVycm9yCisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpyZWdpc3RlclNlbmRlcigKKyAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+ICZyZWNlaXZlciwKKyAgICAgICAgQ29ubmVjdGlvbklkIHNlbmRlcklkLAorICAgICAgICBDb25uZWN0aW9uSWQgKnJlY2VpdmVySWQpIHsKKyAgICBzcDxJQWNjZXNzb3I+IGFjY2Vzc29yOworICAgIGJvb2wgbG9jYWwgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuZmluZChzZW5kZXJJZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgaXQtPnNlY29uZC0+Z2V0QWNjZXNzb3IoJmFjY2Vzc29yKTsKKyAgICAgICAgbG9jYWwgPSBpdC0+c2Vjb25kLT5pc0xvY2FsKCk7CisgICAgfQorICAgIFJlc3VsdFN0YXR1cyBycyA9IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgaWYgKGFjY2Vzc29yKSB7CisgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0ID0gcmVjZWl2ZXItPnJlZ2lzdGVyU2VuZGVyKAorICAgICAgICAgICAgICAgIGFjY2Vzc29yLAorICAgICAgICAgICAgICAgIFsmcnMsIHJlY2VpdmVySWRdKAorICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY29ubmVjdGlvbklkKSB7CisgICAgICAgICAgICAgICAgICAgIHJzID0gc3RhdHVzOworICAgICAgICAgICAgICAgICAgICAqcmVjZWl2ZXJJZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCF0cmFuc1Jlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgICAgICB9IGVsc2UgaWYgKGxvY2FsICYmIHJzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIHNwPENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudD4gcmVjaXBpZW50ID0gQWNjZXNzb3I6OmdldENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCgpOworICAgICAgICAgICAgaWYgKHJlY2lwaWVudCkgIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiY2xpZW50IGRlYXRoIHJlY2lwaWVudCByZWdpc3RlcmVkICVsbGQiLCAobG9uZyBsb25nKSpyZWNlaXZlcklkKTsKKyAgICAgICAgICAgICAgICBib29sIGFkZGVkOworICAgICAgICAgICAgICAgIHVpbnQ2NF90IGNvb2tpZSA9IG1SZW1vdGVDbGllbnRDb29raWVzLmdldENvb2tpZShyZWNlaXZlciwgJmFkZGVkKTsKKyAgICAgICAgICAgICAgICByZWNpcGllbnQtPmFkZENvb2tpZVRvQ29ubmVjdGlvbihjb29raWUsICpyZWNlaXZlcklkKTsKKyAgICAgICAgICAgICAgICBpZiAoYWRkZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgUmV0dXJuPGJvb2w+IHRyYW5zUmVzdWx0ID0gcmVjZWl2ZXItPmxpbmtUb0RlYXRoKHJlY2lwaWVudCwgY29va2llKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJzOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6Y3JlYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKSB7CisgICAgY29uc3Qgc3A8QWNjZXNzb3I+IGFjY2Vzc29yID0gbmV3IEFjY2Vzc29yKGFsbG9jYXRvcik7CisgICAgaWYgKCFhY2Nlc3NvciB8fCAhYWNjZXNzb3ItPmlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudCA9CisgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEJ1ZmZlclBvb2xDbGllbnQ+KGFjY2Vzc29yKTsKKyAgICBpZiAoIWNsaWVudCB8fCAhY2xpZW50LT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIC8vIFNpbmNlIGEgbmV3IGJ1ZmZlcnBvb2wgaXMgY3JlYXRlZCwgZXZpY3QgbWVtb3JpZXMgd2hpY2ggYXJlIHVzZWQgYnkKKyAgICAvLyBleGlzdGluZyBidWZmZXJwb29scyBhbmQgY2xpZW50cy4KKyAgICBjbGVhblVwKHRydWUpOworICAgIHsKKyAgICAgICAgLy8gVE9ETzogaGFuZGxlIGluc2VydCBmYWlsLiAobWFsbG9jIGZhaWwpCisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTXV0ZXgpOworICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IHdjbGllbnQgPSBjbGllbnQ7CisgICAgICAgIG1DYWNoZS5tQ2xpZW50cy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYWNjZXNzb3IsIHdjbGllbnQpKTsKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbklkID0gY2xpZW50LT5nZXRDb25uZWN0aW9uSWQoKTsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICAgICAgbUFjdGl2ZS5tQ2xpZW50cy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY29uSWQsIGNsaWVudCkpOworICAgICAgICB9CisgICAgICAgICpwQ29ubmVjdGlvbklkID0gY29uSWQ7CisgICAgICAgIEFMT0dWKCJjcmVhdGUgbmV3IGNvbm5lY3Rpb24gJWxsZCIsIChsb25nIGxvbmcpKnBDb25uZWN0aW9uSWQpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OmNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jazEobUNhY2hlLm1NdXRleCk7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2syKG1BY3RpdmUubU11dGV4KTsKKyAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgaWYgKGl0ICE9IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgc3A8SUFjY2Vzc29yPiBhY2Nlc3NvcjsKKyAgICAgICAgaXQtPnNlY29uZC0+Z2V0QWNjZXNzb3IoJmFjY2Vzc29yKTsKKyAgICAgICAgbUFjdGl2ZS5tQ2xpZW50cy5lcmFzZShjb25uZWN0aW9uSWQpOworICAgICAgICBmb3IgKGF1dG8gY2l0ID0gbUNhY2hlLm1DbGllbnRzLmJlZ2luKCk7IGNpdCAhPSBtQ2FjaGUubUNsaWVudHMuZW5kKCk7KSB7CisgICAgICAgICAgICAvLyBjbGVhbiB1cCBkZWFkIGNsaWVudCBjYWNoZXMKKyAgICAgICAgICAgIHNwPElBY2Nlc3Nvcj4gY0FjY2Vzc29yID0gY2l0LT5maXJzdC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoIWNBY2Nlc3NvciB8fCAoYWNjZXNzb3IgJiYgaW50ZXJmYWNlc0VxdWFsKGNBY2Nlc3NvciwgYWNjZXNzb3IpKSkgeworICAgICAgICAgICAgICAgIGNpdCA9IG1DYWNoZS5tQ2xpZW50cy5lcmFzZShjaXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjaXQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6YWxsb2NhdGUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudDsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuZmluZChjb25uZWN0aW9uSWQpOworICAgICAgICBpZiAoaXQgPT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGNsaWVudCA9IGl0LT5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBjbGllbnQtPmFsbG9jYXRlKHBhcmFtcywgaGFuZGxlLCBidWZmZXIpOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6cmVjZWl2ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudC0+cmVjZWl2ZSh0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgdGltZXN0YW1wVXMsIGhhbmRsZSwgYnVmZmVyKTsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OnBvc3RTZW5kKAorICAgICAgICBDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLCBpbnQ2NF90ICp0aW1lc3RhbXBVcykgeworICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQgPSBidWZmZXItPm1Db25uZWN0aW9uSWQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudDsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuZmluZChjb25uZWN0aW9uSWQpOworICAgICAgICBpZiAoaXQgPT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGNsaWVudCA9IGl0LT5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBjbGllbnQtPnBvc3RTZW5kKHJlY2VpdmVySWQsIGJ1ZmZlciwgdHJhbnNhY3Rpb25JZCwgdGltZXN0YW1wVXMpOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6Z2V0QWNjZXNzb3IoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIHNwPElBY2Nlc3Nvcj4gKmFjY2Vzc29yKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudDsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuZmluZChjb25uZWN0aW9uSWQpOworICAgICAgICBpZiAoaXQgPT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGNsaWVudCA9IGl0LT5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBjbGllbnQtPmdldEFjY2Vzc29yKGFjY2Vzc29yKTsKK30KKwordm9pZCBDbGllbnRNYW5hZ2VyOjpJbXBsOjpjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGludDY0X3Qgbm93ID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgaW50NjRfdCBsYXN0VHJhbnNhY3Rpb25VczsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jazEobUNhY2hlLm1NdXRleCk7CisgICAgaWYgKGNsZWFyQ2FjaGUgfHwgbUNhY2hlLm1MYXN0Q2xlYW5VcFVzICsga0NsZWFuVXBEdXJhdGlvblVzIDwgbm93KSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrMihtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGludCBjbGVhbmVkID0gMDsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5iZWdpbigpOyBpdCAhPSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpOykgeworICAgICAgICAgICAgaWYgKCFpdC0+c2Vjb25kLT5pc0FjdGl2ZSgmbGFzdFRyYW5zYWN0aW9uVXMsIGNsZWFyQ2FjaGUpKSB7CisgICAgICAgICAgICAgICAgaWYgKGxhc3RUcmFuc2FjdGlvblVzICsga0NsaWVudFRpbWVvdXRVcyA8IG5vdykgeworICAgICAgICAgICAgICAgICAgICBzcDxJQWNjZXNzb3I+IGFjY2Vzc29yOworICAgICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLT5nZXRBY2Nlc3NvcigmYWNjZXNzb3IpOworICAgICAgICAgICAgICAgICAgICBpdCA9IG1BY3RpdmUubUNsaWVudHMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgICAgICArK2NsZWFuZWQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsraXQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChhdXRvIGNpdCA9IG1DYWNoZS5tQ2xpZW50cy5iZWdpbigpOyBjaXQgIT0gbUNhY2hlLm1DbGllbnRzLmVuZCgpOykgeworICAgICAgICAgICAgLy8gY2xlYW4gdXAgZGVhZCBjbGllbnQgY2FjaGVzCisgICAgICAgICAgICBzcDxJQWNjZXNzb3I+IGNBY2Nlc3NvciA9IGNpdC0+Zmlyc3QucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKCFjQWNjZXNzb3IpIHsKKyAgICAgICAgICAgICAgICBjaXQgPSBtQ2FjaGUubUNsaWVudHMuZXJhc2UoY2l0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKytjaXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIiMgb2YgY2xlYW5lZCBjb25uZWN0aW9uczogJWQiLCBjbGVhbmVkKTsKKyAgICAgICAgbUNhY2hlLm1MYXN0Q2xlYW5VcFVzID0gbm93OworICAgIH0KK30KKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQ2xpZW50TWFuYWdlciBmb2xsb3cuCitSZXR1cm48dm9pZD4gQ2xpZW50TWFuYWdlcjo6cmVnaXN0ZXJTZW5kZXIoY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklBY2Nlc3Nvcj4mIGJ1ZmZlclBvb2wsIHJlZ2lzdGVyU2VuZGVyX2NiIF9oaWRsX2NiKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQgPSAtMTsKKyAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1JbXBsLT5yZWdpc3RlclNlbmRlcihidWZmZXJQb29sLCAmY29ubmVjdGlvbklkKTsKKyAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBjb25uZWN0aW9uSWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9oaWRsX2NiKFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1IsIC0xKTsKKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworLy8gTWV0aG9kcyBmb3IgbG9jYWwgdXNlLgorc3A8Q2xpZW50TWFuYWdlcj4gQ2xpZW50TWFuYWdlcjo6c0luc3RhbmNlOworc3RkOjptdXRleCBDbGllbnRNYW5hZ2VyOjpzSW5zdGFuY2VMb2NrOworCitzcDxDbGllbnRNYW5hZ2VyPiBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhzSW5zdGFuY2VMb2NrKTsKKyAgICBpZiAoIXNJbnN0YW5jZSkgeworICAgICAgICBzSW5zdGFuY2UgPSBuZXcgQ2xpZW50TWFuYWdlcigpOworICAgIH0KKyAgICByZXR1cm4gc0luc3RhbmNlOworfQorCitDbGllbnRNYW5hZ2VyOjpDbGllbnRNYW5hZ2VyKCkgOiBtSW1wbChuZXcgSW1wbCgpKSB7fQorCitDbGllbnRNYW5hZ2VyOjp+Q2xpZW50TWFuYWdlcigpIHsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OmNyZWF0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IsCisgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmNyZWF0ZShhbGxvY2F0b3IsIHBDb25uZWN0aW9uSWQpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OnJlZ2lzdGVyU2VuZGVyKAorICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJnJlY2VpdmVyLAorICAgICAgICBDb25uZWN0aW9uSWQgc2VuZGVySWQsCisgICAgICAgIENvbm5lY3Rpb25JZCAqcmVjZWl2ZXJJZCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPnJlZ2lzdGVyU2VuZGVyKHJlY2VpdmVyLCBzZW5kZXJJZCwgcmVjZWl2ZXJJZCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6Y2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmNsb3NlKGNvbm5lY3Rpb25JZCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6YWxsb2NhdGUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+YWxsb2NhdGUoY29ubmVjdGlvbklkLCBwYXJhbXMsIGhhbmRsZSwgYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpyZWNlaXZlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPnJlY2VpdmUoY29ubmVjdGlvbklkLCB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcFVzLCBoYW5kbGUsIGJ1ZmZlcik7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6cG9zdFNlbmQoCisgICAgICAgIENvbm5lY3Rpb25JZCByZWNlaXZlcklkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsIGludDY0X3QqIHRpbWVzdGFtcFVzKSB7CisgICAgaWYgKG1JbXBsICYmIGJ1ZmZlcikgeworICAgICAgICByZXR1cm4gbUltcGwtPnBvc3RTZW5kKHJlY2VpdmVySWQsIGJ1ZmZlciwgdHJhbnNhY3Rpb25JZCwgdGltZXN0YW1wVXMpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKwordm9pZCBDbGllbnRNYW5hZ2VyOjpjbGVhblVwKCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBtSW1wbC0+Y2xlYW5VcCh0cnVlKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0Nvbm5lY3Rpb24uY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQ29ubmVjdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU4ZjU5NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0Nvbm5lY3Rpb24uY3BwCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQ29ubmVjdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKKy8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUNvbm5lY3Rpb24gZm9sbG93LgorUmV0dXJuPHZvaWQ+IENvbm5lY3Rpb246OmZldGNoKHVpbnQ2NF90IHRyYW5zYWN0aW9uSWQsIHVpbnQzMl90IGJ1ZmZlcklkLCBmZXRjaF9jYiBfaGlkbF9jYikgeworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIGlmIChtSW5pdGlhbGl6ZWQgJiYgbUFjY2Vzc29yKSB7CisgICAgICAgIGlmIChidWZmZXJJZCAhPSBTWU5DX0JVRkZFUklEKSB7CisgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSA9IG51bGxwdHI7CisgICAgICAgICAgICBzdGF0dXMgPSBtQWNjZXNzb3ItPmZldGNoKAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgJmhhbmRsZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICBfaGlkbF9jYihzdGF0dXMsIEJ1ZmZlcntidWZmZXJJZCwgaGFuZGxlfSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1BY2Nlc3Nvci0+Y2xlYW5VcChmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgX2hpZGxfY2Ioc3RhdHVzLCBCdWZmZXJ7MCwgbnVsbHB0cn0pOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK0Nvbm5lY3Rpb246OkNvbm5lY3Rpb24oKSA6IG1Jbml0aWFsaXplZChmYWxzZSksIG1Db25uZWN0aW9uSWQoLTFMTCkge30KKworQ29ubmVjdGlvbjo6fkNvbm5lY3Rpb24oKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCAmJiBtQWNjZXNzb3IpIHsKKyAgICAgICAgbUFjY2Vzc29yLT5jbG9zZShtQ29ubmVjdGlvbklkKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29ubmVjdGlvbjo6aW5pdGlhbGl6ZSgKKyAgICAgICAgY29uc3Qgc3A8QWNjZXNzb3I+JiBhY2Nlc3NvciwgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIGlmICghbUluaXRpYWxpemVkKSB7CisgICAgICAgIG1BY2Nlc3NvciA9IGFjY2Vzc29yOworICAgICAgICBtQ29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIH0KK30KKworUmVzdWx0U3RhdHVzIENvbm5lY3Rpb246OmFsbG9jYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLCBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQgJiYgbUFjY2Vzc29yKSB7CisgICAgICAgIHJldHVybiBtQWNjZXNzb3ItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHBhcmFtcywgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit2b2lkIENvbm5lY3Rpb246OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCAmJiBtQWNjZXNzb3IpIHsKKyAgICAgICAgbUFjY2Vzc29yLT5jbGVhblVwKGNsZWFyQ2FjaGUpOworICAgIH0KK30KKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2UgZm9sbG93LgorCisvL0lDb25uZWN0aW9uKiBISURMX0ZFVENIX0lDb25uZWN0aW9uKGNvbnN0IGNoYXIqIC8qIG5hbWUgKi8pIHsKKy8vICAgIHJldHVybiBuZXcgQ29ubmVjdGlvbigpOworLy99CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0Nvbm5lY3Rpb24uaCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0Nvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTljYjY3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQ29ubmVjdGlvbi5oCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9DT05ORUNUSU9OX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQ09OTkVDVElPTl9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0lDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSAiQWNjZXNzb3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjpBY2Nlc3NvcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQ29ubmVjdGlvbiA6IHB1YmxpYyBJQ29ubmVjdGlvbiB7CisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQ29ubmVjdGlvbiBmb2xsb3cuCisgICAgUmV0dXJuPHZvaWQ+IGZldGNoKHVpbnQ2NF90IHRyYW5zYWN0aW9uSWQsIHVpbnQzMl90IGJ1ZmZlcklkLCBmZXRjaF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZXMgYSBidWZmZXIgdXNpbmcgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLiBSZWN5Y2xlcyBhIGJ1ZmZlciBpZgorICAgICAqIGl0IGlzIHBvc3NpYmxlLiBUaGUgcmV0dXJuZWQgYnVmZmVyIGNhbiBiZSB0cmFuc2ZlcnJlZCB0byBvdGhlciByZW1vdGUKKyAgICAgKiBjbGllbnRzKENvbm5lY3Rpb24pLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtcyAgICBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICogQHBhcmFtIGJ1ZmZlcklkICBJZCBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gaGFuZGxlICAgIG5hdGl2ZSBoYW5kbGUgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIGlmIGEgYnVmZmVyIGlzIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIFByb2Nlc3NlcyBwZW5kaW5nIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMgYW5kIHBlcmZvcm1zIHBlcmlvZGljIGNhY2hlIGNsZWFuaW5nCisgICAgICogZnJvbSBidWZmZXJwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGNsZWFyQ2FjaGUgICAgaWYgY2xlYXJDYWNoZSBpcyB0cnVlLCBidWZmZXJwb29sIGZyZWVzIGFsbCBidWZmZXJzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgd2FpdGluZyB0byBiZSByZWN5Y2xlZC4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKTsKKworICAgIC8qKiBEZXN0cnVjdHMgYSBjb25uZWN0aW9uLiAqLworICAgIH5Db25uZWN0aW9uKCk7CisKKyAgICAvKiogQ3JlYXRlcyBhIGNvbm5lY3Rpb24uICovCisgICAgQ29ubmVjdGlvbigpOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgd2l0aCB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBwb29sIGFuZCB0aGUgY29ubmVjdGlvbiBpZC4KKyAgICAgKiBUaGUgY29ubmVjdGlvbiBpZCBzaG91bGQgYmUgdW5pcXVlIGluIHRoZSB3aG9sZSBzeXN0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWNjZXNzb3IgICAgICB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBwb29sLgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIElkLgorICAgICAqLworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIGVudW0gOiB1aW50MzJfdCB7CisgICAgICAgIFNZTkNfQlVGRkVSSUQgPSBVSU5UMzJfTUFYLAorICAgIH07CisKK3ByaXZhdGU6CisgICAgYm9vbCBtSW5pdGlhbGl6ZWQ7CisgICAgc3A8QWNjZXNzb3I+IG1BY2Nlc3NvcjsKKyAgICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9DT05ORUNUSU9OX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL2luY2x1ZGUvYnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL2luY2x1ZGUvYnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTBmMDE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvaW5jbHVkZS9idWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9CVUZGRVJQT09MVFlQRVNfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9CVUZGRVJQT09MVFlQRVNfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzEuMC90eXBlcy5oPgorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CisKK3N0cnVjdCBCdWZmZXJQb29sRGF0YSB7CisgICAgLy8gRm9yIGxvY2FsIHVzZSwgdG8gc3BlY2lmeSBhIGJ1ZmZlcnBvb2wgKGNsaWVudCBjb25uZWN0aW9uKSBmb3IgYnVmZmVycy4KKyAgICAvLyBSZXR1cm4gdmFsdWUgZnJvbSBjb25uZWN0I0lBY2Nlc3NvcihhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMS4wKS4KKyAgICBpbnQ2NF90IG1Db25uZWN0aW9uSWQ7CisgICAgLy8gQnVmZmVySWQKKyAgICB1aW50MzJfdCBtSWQ7CisKKyAgICBCdWZmZXJQb29sRGF0YSgpIDogbUNvbm5lY3Rpb25JZCgwKSwgbUlkKDApIHt9CisKKyAgICBCdWZmZXJQb29sRGF0YSgKKyAgICAgICAgICAgIGludDY0X3QgY29ubmVjdGlvbklkLCB1aW50MzJfdCBpZCkKKyAgICAgICAgICAgIDogbUNvbm5lY3Rpb25JZChjb25uZWN0aW9uSWQpLCBtSWQoaWQpIHt9CisKKyAgICB+QnVmZmVyUG9vbERhdGEoKSB7fQorfTsKKworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZTsKKwordHlwZWRlZiB1aW50MzJfdCBCdWZmZXJJZDsKK3R5cGVkZWYgdWludDY0X3QgVHJhbnNhY3Rpb25JZDsKK3R5cGVkZWYgaW50NjRfdCBDb25uZWN0aW9uSWQ7CisKK2VudW0gOiBDb25uZWN0aW9uSWQgeworICAgIElOVkFMSURfQ09OTkVDVElPTklEID0gMCwKK307CisKK3R5cGVkZWYgYW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTxCdWZmZXJTdGF0dXNNZXNzYWdlLCBrU3luY2hyb25pemVkUmVhZFdyaXRlPiBCdWZmZXJTdGF0dXNRdWV1ZTsKK3R5cGVkZWYgQnVmZmVyU3RhdHVzUXVldWU6OkRlc2NyaXB0b3IgUXVldWVEZXNjcmlwdG9yOworCisvKioKKyAqIEFsbG9jYXRpb24gd3JhcHBlciBjbGFzcyBmb3IgYnVmZmVyIHBvb2wuCisgKi8KK3N0cnVjdCBCdWZmZXJQb29sQWxsb2NhdGlvbiB7CisgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICptSGFuZGxlOworCisgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUoKSB7CisgICAgICAgIHJldHVybiBtSGFuZGxlOworICAgIH0KKworICAgIEJ1ZmZlclBvb2xBbGxvY2F0aW9uKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKSA6IG1IYW5kbGUoaGFuZGxlKSB7fQorCisgICAgfkJ1ZmZlclBvb2xBbGxvY2F0aW9uKCkge307Cit9OworCisvKioKKyAqIEFsbG9jYXRvciB3cmFwcGVyIGNsYXNzIGZvciBidWZmZXIgcG9vbC4KKyAqLworY2xhc3MgQnVmZmVyUG9vbEFsbG9jYXRvciB7CitwdWJsaWM6CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBhbiBhbGxvY2F0aW9uKGJ1ZmZlcikgZm9yIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtcyAgICBhbGxvY2F0aW9uIHBhcmFtZXRlcnMKKyAgICAgKiBAcGFyYW0gYWxsb2MgICAgIGNyZWF0ZWQgYWxsb2NhdGlvbgorICAgICAqIEBwYXJhbSBhbGxvY1NpemUgc2l6ZSBvZiBjcmVhdGVkIGFsbG9jYXRpb24KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhbiBhbGxvY2F0aW9uIGlzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqLworICAgIHZpcnR1YWwgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gKmFsbG9jLAorICAgICAgICAgICAgc2l6ZV90ICphbGxvY1NpemUpID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBhbGxvY2F0aW9uIHBhcmFtZXRlcnMgb2YgYW4gb2xkIGFsbG9jYXRpb24gYXJlCisgICAgICogY29tcGF0aWJsZSB3aXRoIG5ldyBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICovCisgICAgdmlydHVhbCBib29sIGNvbXBhdGlibGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm5ld1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmb2xkUGFyYW1zKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICBCdWZmZXJQb29sQWxsb2NhdG9yKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCB+QnVmZmVyUG9vbEFsbG9jYXRvcigpID0gZGVmYXVsdDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9CVUZGRVJQT09MVFlQRVNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvaW5jbHVkZS9idWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL2luY2x1ZGUvYnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU1Nzc5ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL2luY2x1ZGUvYnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmgKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0NMSUVOVE1BTkFHRVJfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9DTElFTlRNQU5BR0VSX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8xLjAvSUNsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgIkJ1ZmZlclBvb2xUeXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUFjY2Vzc29yOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQ2xpZW50TWFuYWdlciA6IHB1YmxpYyBJQ2xpZW50TWFuYWdlciB7CisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQ2xpZW50TWFuYWdlciBmb2xsb3cuCisgICAgUmV0dXJuPHZvaWQ+IHJlZ2lzdGVyU2VuZGVyKGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQWNjZXNzb3I+JiBidWZmZXJQb29sLCByZWdpc3RlclNlbmRlcl9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICAvKiogR2V0cyBhbiBpbnN0YW5jZS4gKi8KKyAgICBzdGF0aWMgc3A8Q2xpZW50TWFuYWdlcj4gZ2V0SW5zdGFuY2UoKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBsb2NhbCBjb25uZWN0aW9uIHdpdGggYSBuZXdseSBjcmVhdGVkIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGFsbG9jYXRvciAgICAgZm9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbi4KKyAgICAgKiBAcGFyYW0gcENvbm5lY3Rpb25JZCBJZCBvZiB0aGUgY3JlYXRlZCBjb25uZWN0aW9uLiBUaGlzIGlzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgc3lzdGVtLXdpZGUgdW5pcXVlLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIHBvb2wgYW5kIGEgbG9jYWwgY29ubmVjdGlvbiBpcyBzdWNjZXNzZnVsbHkKKyAgICAgKiAgICAgICAgIGNyZWF0ZWQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNyZWF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCk7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIGNyZWF0ZWQgY29ubmVjdGlvbiBhcyBzZW5kZXIgZm9yIHJlbW90ZSBwcm9jZXNzLgorICAgICAqCisgICAgICogQHBhcmFtIHJlY2VpdmVyICAgICAgVGhlIHJlbW90ZSByZWNlaXZpbmcgcHJvY2Vzcy4KKyAgICAgKiBAcGFyYW0gc2VuZGVySWQgICAgICBBIGxvY2FsIGNvbm5lY3Rpb24gd2hpY2ggd2lsbCBzZW5kIGJ1ZmZlcnMgdG8uCisgICAgICogQHBhcmFtIHJlY2VpdmVySWQgICAgSWQgb2YgdGhlIGNyZWF0ZWQgcmVjZWl2aW5nIGNvbm5lY3Rpb24gb24gdGhlIHJlY2VpdmVyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiB0aGUgcmVjZWl2aW5nIGNvbm5lY3Rpb24gaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgb24gdGhlCisgICAgICogICAgICAgICByZWNlaXZlciBwcm9jZXNzLgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNlbmRlciBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBBTFJFQURZX0VYSVNUUyB0aGUgcmVjZWl2aW5nIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBtYWRlLgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyByZWdpc3RlclNlbmRlcihjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJnJlY2VpdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgc2VuZGVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcmVjZWl2ZXJJZCk7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgVGhlIGlkIG9mIHRoZSBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC4KKyAgICAgKiAgICAgICAgIE5PVF9GT1VORCB3aGVuIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiB3YXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlcyBhIGJ1ZmZlciBmcm9tIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIFRoZSBpZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgICAgICBUaGUgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgICAgIFRoZSBuYXRpdmUgaGFuZGxlIHRvIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLiBoYW5kbGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgY2xvbmVkIGJlZm9yZSB1c2UuCisgICAgICogQHBhcmFtIGJ1ZmZlciAgICAgICAgVGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgd2FzIGFsbG9jYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgLyoqCisgICAgICogUmVjZWl2ZXMgYSBidWZmZXIgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIFRoZSBpZCBvZiB0aGUgcmVjZWl2aW5nIGNvbm5lY3Rpb24uCisgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uSWQgVGhlIGlkIGZvciB0aGUgdHJhbnNhY3Rpb24uCisgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgVGhlIGlkIGZvciB0aGUgYnVmZmVyLgorICAgICAqIEBwYXJhbSB0aW1lc3RhbXBVcyAgIFRoZSB0aW1lc3RhbXAgb2YgdGhlIGJ1ZmZlciBpcyBiZWluZyBzZW50LgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgICAgIFRoZSBuYXRpdmUgaGFuZGxlIHRvIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLiBoYW5kbGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgY2xvbmVkIGJlZm9yZSB1c2UuCisgICAgICogQHBhcmFtIGJ1ZmZlciAgICAgICAgVGhlIHJlY2VpdmVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciB3YXMgcmVjZWl2ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIHJlY2VpdmUoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICAvKioKKyAgICAgKiBQb3N0cyBhIGJ1ZmZlciB0cmFuc2ZlciB0cmFuc2FjdGlvbiB0byB0aGUgYnVmZmVyIHBvb2wuIFNlbmRzIGEgYnVmZmVyCisgICAgICogdG8gb3RoZXIgcmVtb3RlIGNsaWVudHMoY29ubmVjdGlvbikgYWZ0ZXIgdGhpcyBjYWxsIGhhcyBiZWVuIHN1Y2NlZWRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWNlaXZlcklkICAgIFRoZSBpZCBvZiB0aGUgcmVjZWl2aW5nIGNvbm5lY3Rpb24uCisgICAgICogQHBhcmFtIGJ1ZmZlciAgICAgICAgdG8gdHJhbnNmZXIKKyAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCBJZCBvZiB0aGUgdHJhbnNmZXIgdHJhbnNhY3Rpb24uCisgICAgICogQHBhcmFtIHRpbWVzdGFtcFVzICAgVGhlIHRpbWVzdGFtcCBvZiB0aGUgYnVmZmVyIHRyYW5zYWN0aW9uIGlzIGJlaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcG9zdGVkLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIHRyYW5zYWN0aW9uIHdhcyBwb3N0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNlbmRpbmcgY29ubmVjdGlvbiB3YXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBwb3N0U2VuZChDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lc3RhbXBVcyk7CisKKyAgICAvKioKKyAgICAgKiAgVGltZSBvdXQgaW5hY3RpdmUgbGluZ2VyaW5nIGNvbm5lY3Rpb25zIGFuZCBjbG9zZS4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFuVXAoKTsKKworICAgIC8qKiBEZXN0cnVjdHMgdGhlIG1hbmFnZXIgb2YgYnVmZmVyIHBvb2wgY2xpZW50cy4gICovCisgICAgfkNsaWVudE1hbmFnZXIoKTsKK3ByaXZhdGU6CisgICAgc3RhdGljIHNwPENsaWVudE1hbmFnZXI+IHNJbnN0YW5jZTsKKyAgICBzdGF0aWMgc3RkOjptdXRleCBzSW5zdGFuY2VMb2NrOworCisgICAgY2xhc3MgSW1wbDsKKyAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8SW1wbD4gbUltcGw7CisKKyAgICBDbGllbnRNYW5hZ2VyKCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQ0xJRU5UTUFOQUdFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvQW5kcm9pZC5icCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNWE3NTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlZ0c1ZuZGtIaWRsQnVmZmVycG9vbFYxXzBUYXJnZXRTaW5nbGVUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNIYWxUYXJnZXRUZXN0RGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJhbGxvY2F0b3IuY3BwIiwKKyAgICAgICAgInNpbmdsZS5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAxLjAiLAorICAgICAgICAibGliaW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMS4wIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJmbXEiLAorICAgIF0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogImJvdGgiLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiVnRzVm5ka0hpZGxCdWZmZXJwb29sVjFfMFRhcmdldE11bHRpVGVzdCIsCisgICAgZGVmYXVsdHM6IFsiVnRzSGFsVGFyZ2V0VGVzdERlZmF1bHRzIl0sCisgICAgc3JjczogWworICAgICAgICAiYWxsb2NhdG9yLmNwcCIsCisgICAgICAgICJtdWx0aS5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAxLjAiLAorICAgICAgICAibGliaW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMS4wIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJmbXEiLAorICAgIF0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogImJvdGgiLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL09XTkVSUyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczM2UwYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9PV05FUlMKQEAgLTAsMCArMSw5IEBACisjIE1lZGlhIHRlYW0KK2xham9zQGdvb2dsZS5jb20KK3Bhd2luQGdvb2dsZS5jb20KK3Rha2xlZUBnb29nbGUuY29tCit3b25zaWtAZ29vZ2xlLmNvbQorCisjIFZUUyB0ZWFtCit5aW1AZ29vZ2xlLmNvbQoremh1b3lhb0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvYWxsb2NhdG9yLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9hbGxvY2F0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0M2Y3ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvYWxsb2NhdG9yLmNwcApAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxjdXRpbHMvYXNobWVtLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlICJhbGxvY2F0b3IuaCIKKwordW5pb24gUGFyYW1zIHsKKyAgc3RydWN0IHsKKyAgICB1aW50MzJfdCBjYXBhY2l0eTsKKyAgfSBkYXRhOworICB1aW50OF90IGFycmF5WzBdOworICBQYXJhbXMoKSA6IGRhdGF7MH0ge30KKyAgUGFyYW1zKHVpbnQzMl90IHNpemUpCisgICAgICA6IGRhdGF7c2l6ZX0ge30KK307CisKKworbmFtZXNwYWNlIHsKKworc3RydWN0IEhhbmRsZUFzaG1lbSA6IHB1YmxpYyBuYXRpdmVfaGFuZGxlX3QgeworICBIYW5kbGVBc2htZW0oaW50IGFzaG1lbUZkLCBzaXplX3Qgc2l6ZSkKKyAgICA6IG5hdGl2ZV9oYW5kbGVfdChjSGVhZGVyKSwKKyAgICBtRmRzeyBhc2htZW1GZCB9LAorICAgIG1JbnRzeyBpbnQgKHNpemUgJiAweEZGRkZGRkZGKSwgaW50KCh1aW50NjRfdChzaXplKSA+PiAzMikgJiAweEZGRkZGRkZGKSwga01hZ2ljIH0ge30KKworICBpbnQgYXNobWVtRmQoKSBjb25zdCB7IHJldHVybiBtRmRzLm1Bc2htZW07IH0KKyAgc2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIHNpemVfdCh1bnNpZ25lZChtSW50cy5tU2l6ZUxvKSkKKyAgICAgICAgfCBzaXplX3QodWludDY0X3QodW5zaWduZWQobUludHMubVNpemVIaSkpIDw8IDMyKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzVmFsaWQoY29uc3QgbmF0aXZlX2hhbmRsZV90ICogY29uc3Qgbyk7CisKK3Byb3RlY3RlZDoKKyAgc3RydWN0IHsKKyAgICBpbnQgbUFzaG1lbTsKKyAgfSBtRmRzOworICBzdHJ1Y3QgeworICAgIGludCBtU2l6ZUxvOworICAgIGludCBtU2l6ZUhpOworICAgIGludCBtTWFnaWM7CisgIH0gbUludHM7CisKK3ByaXZhdGU6CisgIGVudW0geworICAgIGtNYWdpYyA9ICdhaG1ceDAwJywKKyAgICBudW1GZHMgPSBzaXplb2YobUZkcykgLyBzaXplb2YoaW50KSwKKyAgICBudW1JbnRzID0gc2l6ZW9mKG1JbnRzKSAvIHNpemVvZihpbnQpLAorICAgIHZlcnNpb24gPSBzaXplb2YobmF0aXZlX2hhbmRsZV90KQorICB9OworICBjb25zdCBzdGF0aWMgbmF0aXZlX2hhbmRsZV90IGNIZWFkZXI7Cit9OworCitjb25zdCBuYXRpdmVfaGFuZGxlX3QgSGFuZGxlQXNobWVtOjpjSGVhZGVyID0geworICBIYW5kbGVBc2htZW06OnZlcnNpb24sCisgIEhhbmRsZUFzaG1lbTo6bnVtRmRzLAorICBIYW5kbGVBc2htZW06Om51bUludHMsCisgIHt9Cit9OworCitib29sIEhhbmRsZUFzaG1lbTo6aXNWYWxpZChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKiBjb25zdCBvKSB7CisgIGlmICghbyB8fCBtZW1jbXAobywgJmNIZWFkZXIsIHNpemVvZihjSGVhZGVyKSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSGFuZGxlQXNobWVtICpvdGhlciA9IHN0YXRpY19jYXN0PGNvbnN0IEhhbmRsZUFzaG1lbSo+KG8pOworICByZXR1cm4gb3RoZXItPm1JbnRzLm1NYWdpYyA9PSBrTWFnaWM7Cit9CisKK2NsYXNzIEFsbG9jYXRpb25Bc2htZW0geworcHJpdmF0ZToKKyAgQWxsb2NhdGlvbkFzaG1lbShpbnQgYXNobWVtRmQsIHNpemVfdCBjYXBhY2l0eSwgYm9vbCByZXMpCisgICAgOiBtSGFuZGxlKGFzaG1lbUZkLCBjYXBhY2l0eSksCisgICAgICBtSW5pdChyZXMpIHt9CisKK3B1YmxpYzoKKyAgc3RhdGljIEFsbG9jYXRpb25Bc2htZW0gKkFsbG9jKHNpemVfdCBzaXplKSB7CisgICAgY29uc3RleHByIHN0YXRpYyBjb25zdCBjaGFyICprQWxsb2NhdGlvblRhZyA9ICJidWZmZXJwb29sX3Rlc3QiOworICAgIGludCBhc2htZW1GZCA9IGFzaG1lbV9jcmVhdGVfcmVnaW9uKGtBbGxvY2F0aW9uVGFnLCBzaXplKTsKKyAgICByZXR1cm4gbmV3IEFsbG9jYXRpb25Bc2htZW0oYXNobWVtRmQsIHNpemUsIGFzaG1lbUZkID49IDApOworICB9CisKKyAgfkFsbG9jYXRpb25Bc2htZW0oKSB7CisgICAgaWYgKG1Jbml0KSB7CisgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKCZtSGFuZGxlKTsKKyAgICB9CisgIH0KKworICBjb25zdCBIYW5kbGVBc2htZW0gKmhhbmRsZSgpIHsKKyAgICByZXR1cm4gJm1IYW5kbGU7CisgIH0KKworcHJpdmF0ZToKKyAgSGFuZGxlQXNobWVtIG1IYW5kbGU7CisgIGJvb2wgbUluaXQ7CisgIC8vIFRPRE86IG1hcHBpbmcgYW5kIG1hcCBmZAorfTsKKworc3RydWN0IEFsbG9jYXRpb25EdG9yIHsKKyAgQWxsb2NhdGlvbkR0b3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFsbG9jYXRpb25Bc2htZW0+ICZhbGxvYykKKyAgICAgIDogbUFsbG9jKGFsbG9jKSB7fQorCisgIHZvaWQgb3BlcmF0b3IoKShCdWZmZXJQb29sQWxsb2NhdGlvbiAqcG9vbEFsbG9jKSB7IGRlbGV0ZSBwb29sQWxsb2M7IH0KKworICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWxsb2NhdGlvbkFzaG1lbT4gbUFsbG9jOworfTsKKworfQorCisKK1Jlc3VsdFN0YXR1cyBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6YWxsb2NhdGUoCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICphbGxvYywKKyAgICBzaXplX3QgKmFsbG9jU2l6ZSkgeworICBQYXJhbXMgYXNobWVtUGFyYW1zOworICBtZW1jcHkoJmFzaG1lbVBhcmFtcywgcGFyYW1zLmRhdGEoKSwgc3RkOjptaW4oc2l6ZW9mKFBhcmFtcyksIHBhcmFtcy5zaXplKCkpKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8QWxsb2NhdGlvbkFzaG1lbT4gYXNobWVtQWxsb2MgPQorICAgICAgc3RkOjpzaGFyZWRfcHRyPEFsbG9jYXRpb25Bc2htZW0+KAorICAgICAgICAgIEFsbG9jYXRpb25Bc2htZW06OkFsbG9jKGFzaG1lbVBhcmFtcy5kYXRhLmNhcGFjaXR5KSk7CisgIGlmIChhc2htZW1BbGxvYykgeworICAgIEJ1ZmZlclBvb2xBbGxvY2F0aW9uICpwdHIgPSBuZXcgQnVmZmVyUG9vbEFsbG9jYXRpb24oYXNobWVtQWxsb2MtPmhhbmRsZSgpKTsKKyAgICBpZiAocHRyKSB7CisgICAgICAqYWxsb2MgPSBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+KHB0ciwgQWxsb2NhdGlvbkR0b3IoYXNobWVtQWxsb2MpKTsKKyAgICAgIGlmICgqYWxsb2MpIHsKKyAgICAgICAgICAqYWxsb2NTaXplID0gYXNobWVtUGFyYW1zLmRhdGEuY2FwYWNpdHk7CisgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgICB9CisgICAgICBkZWxldGUgcHRyOworICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgIH0KKyAgfQorICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworYm9vbCBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6Y29tcGF0aWJsZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmbmV3UGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZvbGRQYXJhbXMpIHsKKyAgc2l6ZV90IG5ld1NpemUgPSBuZXdQYXJhbXMuc2l6ZSgpOworICBzaXplX3Qgb2xkU2l6ZSA9IG9sZFBhcmFtcy5zaXplKCk7CisgIGlmIChuZXdTaXplID09IG9sZFNpemUpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5ld1NpemU7ICsraSkgeworICAgICAgaWYgKG5ld1BhcmFtc1tpXSAhPSBvbGRQYXJhbXNbaV0pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OkZpbGwoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgdmFsKSB7CisgIGlmICghSGFuZGxlQXNobWVtOjppc1ZhbGlkKGhhbmRsZSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSGFuZGxlQXNobWVtICpvID0gc3RhdGljX2Nhc3Q8Y29uc3QgSGFuZGxlQXNobWVtKj4oaGFuZGxlKTsKKyAgdW5zaWduZWQgY2hhciAqcHRyID0gKHVuc2lnbmVkIGNoYXIgKiltbWFwKAorICAgICAgTlVMTCwgby0+c2l6ZSgpLCBQUk9UX1JFQUR8UFJPVF9XUklURSwgTUFQX1NIQVJFRCwgby0+YXNobWVtRmQoKSwgMCk7CisKKyAgaWYgKHB0ciAhPSBNQVBfRkFJTEVEKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvLT5zaXplKCk7ICsraSkgeworICAgICAgcHRyW2ldID0gdmFsOworICAgIH0KKyAgICBtdW5tYXAocHRyLCBvLT5zaXplKCkpOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6VmVyaWZ5KGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlLCBjb25zdCB1bnNpZ25lZCBjaGFyIHZhbCkgeworICBpZiAoIUhhbmRsZUFzaG1lbTo6aXNWYWxpZChoYW5kbGUpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEhhbmRsZUFzaG1lbSAqbyA9IHN0YXRpY19jYXN0PGNvbnN0IEhhbmRsZUFzaG1lbSo+KGhhbmRsZSk7CisgIHVuc2lnbmVkIGNoYXIgKnB0ciA9ICh1bnNpZ25lZCBjaGFyICopbW1hcCgKKyAgICAgIE5VTEwsIG8tPnNpemUoKSwgUFJPVF9SRUFELCBNQVBfU0hBUkVELCBvLT5hc2htZW1GZCgpLCAwKTsKKworICBpZiAocHRyICE9IE1BUF9GQUlMRUQpIHsKKyAgICBib29sIHJlcyA9IHRydWU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvLT5zaXplKCk7ICsraSkgeworICAgICAgaWYgKHB0cltpXSAhPSB2YWwpIHsKKyAgICAgICAgcmVzID0gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBtdW5tYXAocHRyLCBvLT5zaXplKCkpOworICAgIHJldHVybiByZXM7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoc3RkOjp2ZWN0b3I8dWludDhfdD4gKnBhcmFtcykgeworICBjb25zdGV4cHIgc3RhdGljIGludCBrQWxsb2NhdGlvblNpemUgPSAxMDI0ICogMTA7CisgIFBhcmFtcyBhc2htZW1QYXJhbXMoa0FsbG9jYXRpb25TaXplKTsKKworICBwYXJhbXMtPmFzc2lnbihhc2htZW1QYXJhbXMuYXJyYXksIGFzaG1lbVBhcmFtcy5hcnJheSArIHNpemVvZihhc2htZW1QYXJhbXMpKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9hbGxvY2F0b3IuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9hbGxvY2F0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODZlNWYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL2FsbG9jYXRvci5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFZOREtfSElETF9CVUZGRVJQT09MX1YxXzBfQUxMT0NBVE9SX0gKKyNkZWZpbmUgVk5ES19ISURMX0JVRkZFUlBPT0xfVjFfMF9BTExPQ0FUT1JfSAorCisjaW5jbHVkZSA8YnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaD4KKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpSZXN1bHRTdGF0dXM7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjoKKyAgICBCdWZmZXJQb29sQWxsb2NhdGlvbjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OgorICAgIEJ1ZmZlclBvb2xBbGxvY2F0b3I7CisKKy8vIGJ1ZmZlciBhbGxvY2F0b3IgZm9yIHRoZSB0ZXN0cworY2xhc3MgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3IgOiBwdWJsaWMgQnVmZmVyUG9vbEFsbG9jYXRvciB7CisgcHVibGljOgorICBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcigpIHt9CisKKyAgflRlc3RCdWZmZXJQb29sQWxsb2NhdG9yKCkgb3ZlcnJpZGUge30KKworICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gKmFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICphbGxvY1NpemUpIG92ZXJyaWRlOworCisgIGJvb2wgY29tcGF0aWJsZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmbmV3UGFyYW1zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm9sZFBhcmFtcykgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgRmlsbChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSwgY29uc3QgdW5zaWduZWQgY2hhciB2YWwpOworCisgIHN0YXRpYyBib29sIFZlcmlmeShjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSwgY29uc3QgdW5zaWduZWQgY2hhciB2YWwpOworCit9OworCisvLyByZXRyaWV2ZSBidWZmZXIgYWxsb2NhdG9yIHBhcmFtdGVycwordm9pZCBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpwYXJhbXMpOworCisjZW5kaWYgIC8vIFZOREtfSElETF9CVUZGRVJQT09MX1YxXzBfQUxMT0NBVE9SX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9tdWx0aS5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvbXVsdGkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OTY4MTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvbXVsdGkuY3BwCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJidWZmZmVycG9vbF91bml0X3Rlc3QiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL0xlZ2FjeVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJhbGxvY2F0b3IuaCIKKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2w7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklDbGllbnRNYW5hZ2VyOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpSZXN1bHRTdGF0dXM7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjpCdWZmZXJJZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OkNsaWVudE1hbmFnZXI7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjpDb25uZWN0aW9uSWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjpUcmFuc2FjdGlvbklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpCdWZmZXJQb29sRGF0YTsKKworbmFtZXNwYWNlIHsKKworLy8gY29tbXVuaWNhdGlvbiBtZXNzYWdlIHR5cGVzIGJldHdlZW4gcHJvY2Vzc2VzLgorZW51bSBQaXBlQ29tbWFuZCA6IGludDMyX3QgeworICAgIElOSVRfT0sgPSAwLAorICAgIElOSVRfRVJST1IsCisgICAgU0VORCwKKyAgICBSRUNFSVZFX09LLAorICAgIFJFQ0VJVkVfRVJST1IsCit9OworCisvLyBjb21tdW5pY2F0aW9uIG1lc3NhZ2UgYmV0d2VlbiBwcm9jZXNzZXMuCit1bmlvbiBQaXBlTWVzc2FnZSB7CisgICAgc3RydWN0ICB7CisgICAgICAgIGludDMyX3QgY29tbWFuZDsKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQ7CisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQ7CisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZDsKKyAgICAgICAgaW50NjRfdCAgdGltZXN0YW1wVXM7CisgICAgfSBkYXRhOworICAgIGNoYXIgYXJyYXlbMF07Cit9OworCisvLyBtZWRpYS5idWZmZXJwb29sIHRlc3Qgc2V0dXAKK2NsYXNzIEJ1ZmZlcnBvb2xNdWx0aVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICAgIG1SZWNlaXZlclBpZCA9IC0xOworICAgIG1Db25uZWN0aW9uVmFsaWQgPSBmYWxzZTsKKworICAgIEFTU0VSVF9UUlVFKHBpcGUobUNvbW1hbmRQaXBlRmRzKSA9PSAwKTsKKyAgICBBU1NFUlRfVFJVRShwaXBlKG1SZXN1bHRQaXBlRmRzKSA9PSAwKTsKKworICAgIG1SZWNlaXZlclBpZCA9IGZvcmsoKTsKKyAgICBBU1NFUlRfVFJVRShtUmVjZWl2ZXJQaWQgPj0gMCk7CisKKyAgICBpZiAobVJlY2VpdmVyUGlkID09IDApIHsKKyAgICAgIGRvUmVjZWl2ZXIoKTsKKyAgICAgIC8vIEluIG9yZGVyIHRvIGlnbm9yZSBndGVzdCBiZWhhdmlvdXIsIHdhaXQgZm9yIGJlaW5nIGtpbGxlZCBmcm9tCisgICAgICAvLyB0ZWFyRG93bgorICAgICAgcGF1c2UoKTsKKyAgICB9CisKKyAgICBtTWFuYWdlciA9IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgQVNTRVJUX05FKG1NYW5hZ2VyLCBudWxscHRyKTsKKworICAgIG1BbGxvY2F0b3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yPigpOworICAgIEFTU0VSVF9UUlVFKChib29sKW1BbGxvY2F0b3IpOworCisgICAgc3RhdHVzID0gbU1hbmFnZXItPmNyZWF0ZShtQWxsb2NhdG9yLCAmbUNvbm5lY3Rpb25JZCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICAgIG1Db25uZWN0aW9uVmFsaWQgPSB0cnVlOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgIGlmIChtUmVjZWl2ZXJQaWQgPiAwKSB7CisgICAgICBraWxsKG1SZWNlaXZlclBpZCwgU0lHS0lMTCk7CisgICAgICBpbnQgd3N0YXR1czsKKyAgICAgIHdhaXQoJndzdGF0dXMpOworICAgIH0KKworICAgIGlmIChtQ29ubmVjdGlvblZhbGlkKSB7CisgICAgICBtTWFuYWdlci0+Y2xvc2UobUNvbm5lY3Rpb25JZCk7CisgICAgfQorICB9CisKKyBwcm90ZWN0ZWQ6CisgIHN0YXRpYyB2b2lkIGRlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjcmlwdGlvbikgeworICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgfQorCisgIGFuZHJvaWQ6OnNwPENsaWVudE1hbmFnZXI+IG1NYW5hZ2VyOworICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKyAgYm9vbCBtQ29ubmVjdGlvblZhbGlkOworICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKKyAgcGlkX3QgbVJlY2VpdmVyUGlkOworICBpbnQgbUNvbW1hbmRQaXBlRmRzWzJdOworICBpbnQgbVJlc3VsdFBpcGVGZHNbMl07CisKKyAgYm9vbCBzZW5kTWVzc2FnZShpbnQgKnBpcGVzLCBjb25zdCBQaXBlTWVzc2FnZSAmbWVzc2FnZSkgeworICAgIGludCByZXQgPSB3cml0ZShwaXBlc1sxXSwgbWVzc2FnZS5hcnJheSwgc2l6ZW9mKFBpcGVNZXNzYWdlKSk7CisgICAgcmV0dXJuIHJldCA9PSBzaXplb2YoUGlwZU1lc3NhZ2UpOworICB9CisKKyAgYm9vbCByZWNlaXZlTWVzc2FnZShpbnQgKnBpcGVzLCBQaXBlTWVzc2FnZSAqbWVzc2FnZSkgeworICAgIGludCByZXQgPSByZWFkKHBpcGVzWzBdLCBtZXNzYWdlLT5hcnJheSwgc2l6ZW9mKFBpcGVNZXNzYWdlKSk7CisgICAgcmV0dXJuIHJldCA9PSBzaXplb2YoUGlwZU1lc3NhZ2UpOworICB9CisKKyAgdm9pZCBkb1JlY2VpdmVyKCkgeworICAgIGNvbmZpZ3VyZVJwY1RocmVhZHBvb2woMSwgZmFsc2UpOworICAgIFBpcGVNZXNzYWdlIG1lc3NhZ2U7CisgICAgbU1hbmFnZXIgPSBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworICAgIGlmICghbU1hbmFnZXIpIHsKKyAgICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OklOSVRfRVJST1I7CisgICAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGFuZHJvaWQ6OnN0YXR1c190IHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWdpc3RlckFzU2VydmljZSgpOworICAgIGlmIChzdGF0dXMgIT0gYW5kcm9pZDo6T0spIHsKKyAgICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OklOSVRfRVJST1I7CisgICAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OklOSVRfT0s7CisgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworCisgICAgcmVjZWl2ZU1lc3NhZ2UobUNvbW1hbmRQaXBlRmRzLCAmbWVzc2FnZSk7CisgICAgeworICAgICAgbmF0aXZlX2hhbmRsZV90ICpyaGFuZGxlID0gbnVsbHB0cjsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gcmJ1ZmZlcjsKKyAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtTWFuYWdlci0+cmVjZWl2ZSgKKyAgICAgICAgICBtZXNzYWdlLmRhdGEuY29ubmVjdGlvbklkLCBtZXNzYWdlLmRhdGEudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICBtZXNzYWdlLmRhdGEuYnVmZmVySWQsIG1lc3NhZ2UuZGF0YS50aW1lc3RhbXBVcywgJnJoYW5kbGUsICZyYnVmZmVyKTsKKyAgICAgIG1NYW5hZ2VyLT5jbG9zZShtZXNzYWdlLmRhdGEuY29ubmVjdGlvbklkKTsKKyAgICAgIGlmIChzdGF0dXMgIT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICBpZiAoIVRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpWZXJpZnkocmhhbmRsZSwgMHg3NykpIHsKKyAgICAgICAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpSRUNFSVZFX0VSUk9SOworICAgICAgICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6UkVDRUlWRV9PSzsKKyAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgIH0KK307CisKKy8vIEJ1ZmZlciB0cmFuc2ZlciB0ZXN0IGJldHdlZW4gcHJvY2Vzc2VzLgorVEVTVF9GKEJ1ZmZlcnBvb2xNdWx0aVRlc3QsIFRyYW5zZmVyQnVmZmVyKSB7CisgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgIFBpcGVNZXNzYWdlIG1lc3NhZ2U7CisKKyAgQVNTRVJUX1RSVUUocmVjZWl2ZU1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsICZtZXNzYWdlKSk7CisKKyAgYW5kcm9pZDo6c3A8SUNsaWVudE1hbmFnZXI+IHJlY2VpdmVyID0gSUNsaWVudE1hbmFnZXI6OmdldFNlcnZpY2UoKTsKKyAgQ29ubmVjdGlvbklkIHJlY2VpdmVySWQ7CisgIEFTU0VSVF9UUlVFKChib29sKXJlY2VpdmVyKTsKKworICBzdGF0dXMgPSBtTWFuYWdlci0+cmVnaXN0ZXJTZW5kZXIocmVjZWl2ZXIsIG1Db25uZWN0aW9uSWQsICZyZWNlaXZlcklkKTsKKyAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICB7CisgICAgbmF0aXZlX2hhbmRsZV90ICpzaGFuZGxlID0gbnVsbHB0cjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IHNidWZmZXI7CisgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkOworICAgIGludDY0X3QgcG9zdFVzOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlY1BhcmFtczsKKworICAgIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoJnZlY1BhcmFtcyk7CisgICAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJnNoYW5kbGUsICZzYnVmZmVyKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisKKyAgICBBU1NFUlRfVFJVRShUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6RmlsbChzaGFuZGxlLCAweDc3KSk7CisKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+cG9zdFNlbmQocmVjZWl2ZXJJZCwgc2J1ZmZlciwgJnRyYW5zYWN0aW9uSWQsICZwb3N0VXMpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKworICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OlNFTkQ7CisgICAgbWVzc2FnZS5kYXRhLmJ1ZmZlcklkID0gc2J1ZmZlci0+bUlkOworICAgIG1lc3NhZ2UuZGF0YS5jb25uZWN0aW9uSWQgPSByZWNlaXZlcklkOworICAgIG1lc3NhZ2UuZGF0YS50cmFuc2FjdGlvbklkID0gdHJhbnNhY3Rpb25JZDsKKyAgICBtZXNzYWdlLmRhdGEudGltZXN0YW1wVXMgPSBwb3N0VXM7CisgICAgc2VuZE1lc3NhZ2UobUNvbW1hbmRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgfQorICBFWFBFQ1RfVFJVRShyZWNlaXZlTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgJm1lc3NhZ2UpKTsKK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgc2V0ZW52KCJUUkVCTEVfVEVTVElOR19PVkVSUklERSIsICJ0cnVlIiwgdHJ1ZSk7CisgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICBMT0coSU5GTykgPDwgIlRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CisgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvc2luZ2xlLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9zaW5nbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3M2ViNjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvc2luZ2xlLmNwcApAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiYnVmZmZlcnBvb2xfdW5pdF90ZXN0IgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9MZWdhY3lTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgImFsbG9jYXRvci5oIgorCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OkJ1ZmZlcklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6Q2xpZW50TWFuYWdlcjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OkNvbm5lY3Rpb25JZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OlRyYW5zYWN0aW9uSWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OkJ1ZmZlclBvb2xEYXRhOworCituYW1lc3BhY2UgeworCisvLyBOdW1iZXIgb2YgaXRlcmF0aW9uIGZvciBidWZmZXIgYWxsb2NhdGlvbiB0ZXN0LgorY29uc3RleHByIHN0YXRpYyBpbnQga051bUFsbG9jYXRpb25UZXN0ID0gMzsKKworLy8gTnVtYmVyIG9mIGl0ZXJhdGlvbiBmb3IgYnVmZmVyIHJlY3ljbGluZyB0ZXN0LgorY29uc3RleHByIHN0YXRpYyBpbnQga051bVJlY3ljbGVUZXN0ID0gMzsKKworLy8gbWVkaWEuYnVmZmVycG9vbCB0ZXN0IHNldHVwCitjbGFzcyBCdWZmZXJwb29sU2luZ2xlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgICAgbUNvbm5lY3Rpb25WYWxpZCA9IGZhbHNlOworCisgICAgbU1hbmFnZXIgPSBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworICAgIEFTU0VSVF9ORShtTWFuYWdlciwgbnVsbHB0cik7CisKKyAgICBtQWxsb2NhdG9yID0gc3RkOjptYWtlX3NoYXJlZDxUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcj4oKTsKKyAgICBBU1NFUlRfVFJVRSgoYm9vbCltQWxsb2NhdG9yKTsKKworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5jcmVhdGUobUFsbG9jYXRvciwgJm1Db25uZWN0aW9uSWQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKworICAgIG1Db25uZWN0aW9uVmFsaWQgPSB0cnVlOworCisgICAgc3RhdHVzID0gbU1hbmFnZXItPnJlZ2lzdGVyU2VuZGVyKG1NYW5hZ2VyLCBtQ29ubmVjdGlvbklkLCAmbVJlY2VpdmVySWQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6OkFMUkVBRFlfRVhJU1RTICYmCisgICAgICAgICAgICAgICAgbVJlY2VpdmVySWQgPT0gbUNvbm5lY3Rpb25JZCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgaWYgKG1Db25uZWN0aW9uVmFsaWQpIHsKKyAgICAgIG1NYW5hZ2VyLT5jbG9zZShtQ29ubmVjdGlvbklkKTsKKyAgICB9CisgIH0KKworIHByb3RlY3RlZDoKKyAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgUmVjb3JkUHJvcGVydHkoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworICB9CisKKyAgYW5kcm9pZDo6c3A8Q2xpZW50TWFuYWdlcj4gbU1hbmFnZXI7CisgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworICBib29sIG1Db25uZWN0aW9uVmFsaWQ7CisgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworICBDb25uZWN0aW9uSWQgbVJlY2VpdmVySWQ7CisKK307CisKKy8vIEJ1ZmZlciBhbGxvY2F0aW9uIHRlc3QuCisvLyBDaGVjayB3aGV0aGVyIGVhY2ggYnVmZmVyIGFsbG9jYXRpb24gaXMgZG9uZSBzdWNjZXNzZnVsbHkgd2l0aAorLy8gdW5pcXVlIGJ1ZmZlciBpZC4KK1RFU1RfRihCdWZmZXJwb29sU2luZ2xlVGVzdCwgQWxsb2NhdGVCdWZmZXIpIHsKKyAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworICBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKCZ2ZWNQYXJhbXMpOworCisgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gYnVmZmVyW2tOdW1BbGxvY2F0aW9uVGVzdF07CisgIG5hdGl2ZV9oYW5kbGVfdCAqYWxsb2NIYW5kbGUgPSBudWxscHRyOworICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1BbGxvY2F0aW9uVGVzdDsgKytpKSB7CisgICAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJmFsbG9jSGFuZGxlLCAmYnVmZmVyW2ldKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtQWxsb2NhdGlvblRlc3Q7ICsraSkgeworICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IGtOdW1BbGxvY2F0aW9uVGVzdDsgKytqKSB7CisgICAgICBBU1NFUlRfVFJVRShidWZmZXJbaV0tPm1JZCAhPSBidWZmZXJbal0tPm1JZCk7CisgICAgfQorICB9CisgIEVYUEVDVF9UUlVFKGtOdW1BbGxvY2F0aW9uVGVzdCA+IDEpOworfQorCisvLyBCdWZmZXIgcmVjeWNsZSB0ZXN0LgorLy8gQ2hlY2sgd2hldGhlciBkZS1hbGxvY2F0ZWQgYnVmZmVycyBhcmUgcmVjeWNsZWQuCitURVNUX0YoQnVmZmVycG9vbFNpbmdsZVRlc3QsIFJlY3ljbGVCdWZmZXIpIHsKKyAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworICBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKCZ2ZWNQYXJhbXMpOworCisgIEJ1ZmZlcklkIGJpZFtrTnVtUmVjeWNsZVRlc3RdOworICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1SZWN5Y2xlVGVzdDsgKytpKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBidWZmZXI7CisgICAgbmF0aXZlX2hhbmRsZV90ICphbGxvY0hhbmRsZSA9IG51bGxwdHI7CisgICAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJmFsbG9jSGFuZGxlLCAmYnVmZmVyKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgICAgYmlkW2ldID0gYnVmZmVyLT5tSWQ7CisgIH0KKyAgZm9yIChpbnQgaSA9IDE7IGkgPCBrTnVtUmVjeWNsZVRlc3Q7ICsraSkgeworICAgIEFTU0VSVF9UUlVFKGJpZFtpIC0gMV0gPT0gYmlkW2ldKTsKKyAgfQorICBFWFBFQ1RfVFJVRShrTnVtUmVjeWNsZVRlc3QgPiAxKTsKK30KKworLy8gQnVmZmVyIHRyYW5zZmVyIHRlc3QuCisvLyBDaGVjayB3aGV0aGVyIGJ1ZmZlciBpcyB0cmFuc2ZlcnJlZCB0byBhbm90aGVyIGNsaWVudCBzdWNjZXNzZnVsbHkuCitURVNUX0YoQnVmZmVycG9vbFNpbmdsZVRlc3QsIFRyYW5zZmVyQnVmZmVyKSB7CisgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlY1BhcmFtczsKKyAgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcygmdmVjUGFyYW1zKTsKKyAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBzYnVmZmVyLCByYnVmZmVyOworICBuYXRpdmVfaGFuZGxlX3QgKmFsbG9jSGFuZGxlID0gbnVsbHB0cjsKKyAgbmF0aXZlX2hhbmRsZV90ICpyZWN2SGFuZGxlID0gbnVsbHB0cjsKKworICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQ7CisgIGludDY0X3QgcG9zdFVzOworCisgIHN0YXR1cyA9IG1NYW5hZ2VyLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCB2ZWNQYXJhbXMsICZhbGxvY0hhbmRsZSwgJnNidWZmZXIpOworICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIEFTU0VSVF9UUlVFKFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpGaWxsKGFsbG9jSGFuZGxlLCAweDc3KSk7CisgIHN0YXR1cyA9IG1NYW5hZ2VyLT5wb3N0U2VuZChtUmVjZWl2ZXJJZCwgc2J1ZmZlciwgJnRyYW5zYWN0aW9uSWQsICZwb3N0VXMpOworICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWNlaXZlKG1SZWNlaXZlcklkLCB0cmFuc2FjdGlvbklkLCBzYnVmZmVyLT5tSWQsIHBvc3RVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY3ZIYW5kbGUsICZyYnVmZmVyKTsKKyAgRVhQRUNUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICBBU1NFUlRfVFJVRShUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6VmVyaWZ5KHJlY3ZIYW5kbGUsIDB4NzcpKTsKK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgIExPRyhJTkZPKSA8PCAiVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29yLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2I0NjA5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3IuY3BwCkBAIC0wLDAgKzEsMjI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbENvbm5lY3Rpb24iCisKKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorI2luY2x1ZGUgIkFjY2Vzc29ySW1wbC5oIgorI2luY2x1ZGUgIkNvbm5lY3Rpb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit2b2lkIENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDo6YWRkKAorICAgICAgICBpbnQ2NF90IGNvbm5lY3Rpb25JZCwKKyAgICAgICAgY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvcikgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobUFjY2Vzc29ycy5maW5kKGNvbm5lY3Rpb25JZCkgPT0gbUFjY2Vzc29ycy5lbmQoKSkgeworICAgICAgICBtQWNjZXNzb3JzLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25uZWN0aW9uSWQsIGFjY2Vzc29yKSk7CisgICAgfQorfQorCit2b2lkIENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDo6cmVtb3ZlKGludDY0X3QgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIG1BY2Nlc3NvcnMuZXJhc2UoY29ubmVjdGlvbklkKTsKKyAgICBhdXRvIGl0ID0gbUNvbm5lY3Rpb25Ub0Nvb2tpZS5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgaWYgKGl0ICE9IG1Db25uZWN0aW9uVG9Db29raWUuZW5kKCkpIHsKKyAgICAgICAgdWludDY0X3QgY29va2llID0gaXQtPnNlY29uZDsKKyAgICAgICAgbUNvbm5lY3Rpb25Ub0Nvb2tpZS5lcmFzZShpdCk7CisgICAgICAgIGF1dG8gY2l0ID0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZmluZChjb29raWUpOworICAgICAgICBpZiAoY2l0ICE9IG1Db29raWVUb0Nvbm5lY3Rpb25zLmVuZCgpKSB7CisgICAgICAgICAgICBjaXQtPnNlY29uZC5lcmFzZShjb25uZWN0aW9uSWQpOworICAgICAgICAgICAgaWYgKGNpdC0+c2Vjb25kLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbUNvb2tpZVRvQ29ubmVjdGlvbnMuZXJhc2UoY2l0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ6OmFkZENvb2tpZVRvQ29ubmVjdGlvbigKKyAgICAgICAgdWludDY0X3QgY29va2llLAorICAgICAgICBpbnQ2NF90IGNvbm5lY3Rpb25JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobUFjY2Vzc29ycy5maW5kKGNvbm5lY3Rpb25JZCkgPT0gbUFjY2Vzc29ycy5lbmQoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1Db25uZWN0aW9uVG9Db29raWUuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvbm5lY3Rpb25JZCwgY29va2llKSk7CisgICAgYXV0byBpdCA9IG1Db29raWVUb0Nvbm5lY3Rpb25zLmZpbmQoY29va2llKTsKKyAgICBpZiAoaXQgIT0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgaXQtPnNlY29uZC5pbnNlcnQoY29ubmVjdGlvbklkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQ29va2llVG9Db25uZWN0aW9ucy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgY29va2llLCBzdGQ6OnNldDxpbnQ2NF90Pntjb25uZWN0aW9uSWR9KSk7CisgICAgfQorfQorCit2b2lkIENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDo6c2VydmljZURpZWQoCisgICAgICAgIHVpbnQ2NF90IGNvb2tpZSwKKyAgICAgICAgY29uc3Qgd3A8OjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIC8qIHdobyAqLworICAgICAgICApIHsKKyAgICBzdGQ6Om1hcDxpbnQ2NF90LCBjb25zdCB3cDxBY2Nlc3Nvcj4+IGNvbm5lY3Rpb25zVG9DbG9zZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKworICAgICAgICBhdXRvIGl0ID0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZmluZChjb29raWUpOworICAgICAgICBpZiAoaXQgIT0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byBjb25JdCA9IGl0LT5zZWNvbmQuYmVnaW4oKTsgY29uSXQgIT0gaXQtPnNlY29uZC5lbmQoKTsgKytjb25JdCkgeworICAgICAgICAgICAgICAgIGF1dG8gYWNjZXNzb3JJdCA9IG1BY2Nlc3NvcnMuZmluZCgqY29uSXQpOworICAgICAgICAgICAgICAgIGlmIChhY2Nlc3Nvckl0ICE9IG1BY2Nlc3NvcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnNUb0Nsb3NlLmluc2VydChzdGQ6Om1ha2VfcGFpcigqY29uSXQsIGFjY2Vzc29ySXQtPnNlY29uZCkpOworICAgICAgICAgICAgICAgICAgICBtQWNjZXNzb3JzLmVyYXNlKGFjY2Vzc29ySXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ29ubmVjdGlvblRvQ29va2llLmVyYXNlKCpjb25JdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29va2llVG9Db25uZWN0aW9ucy5lcmFzZShpdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY29ubmVjdGlvbnNUb0Nsb3NlLnNpemUoKSA+IDApIHsKKyAgICAgICAgc3A8QWNjZXNzb3I+IGFjY2Vzc29yOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBjb25uZWN0aW9uc1RvQ2xvc2UuYmVnaW4oKTsgaXQgIT0gY29ubmVjdGlvbnNUb0Nsb3NlLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBhY2Nlc3NvciA9IGl0LT5zZWNvbmQucHJvbW90ZSgpOworCisgICAgICAgICAgICBpZiAoYWNjZXNzb3IpIHsKKyAgICAgICAgICAgICAgICBhY2Nlc3Nvci0+Y2xvc2UoaXQtPmZpcnN0KTsKKyAgICAgICAgICAgICAgICBBTE9HRCgiY29ubmVjdGlvbiAlbGxkIGNsb3NlZCBvbiBkZWF0aCIsIChsb25nIGxvbmcpaXQtPmZpcnN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworbmFtZXNwYWNlIHsKK3N0YXRpYyBzcDxDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ+IHNDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQgPQorICAgICAgICBuZXcgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50KCk7Cit9CisKK3NwPENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudD4gQWNjZXNzb3I6OmdldENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCgpIHsKKyAgICByZXR1cm4gc0Nvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDsKK30KKwordm9pZCBBY2Nlc3Nvcjo6Y3JlYXRlSW52YWxpZGF0b3IoKSB7CisgICAgQWNjZXNzb3I6OkltcGw6OmNyZWF0ZUludmFsaWRhdG9yKCk7Cit9CisKKy8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUFjY2Vzc29yIGZvbGxvdy4KK1JldHVybjx2b2lkPiBBY2Nlc3Nvcjo6Y29ubmVjdCgKKyAgICAgICAgY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklPYnNlcnZlcj4mIG9ic2VydmVyLAorICAgICAgICBjb25uZWN0X2NiIF9oaWRsX2NiKSB7CisgICAgc3A8Q29ubmVjdGlvbj4gY29ubmVjdGlvbjsKKyAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkOworICAgIHVpbnQzMl90IG1zZ0lkOworICAgIGNvbnN0IFN0YXR1c0Rlc2NyaXB0b3IqIGZtcURlc2M7CisgICAgY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvciogaW52RGVzYzsKKworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBjb25uZWN0KAorICAgICAgICAgICAgb2JzZXJ2ZXIsIGZhbHNlLCAmY29ubmVjdGlvbiwgJmNvbm5lY3Rpb25JZCwgJm1zZ0lkLCAmZm1xRGVzYywgJmludkRlc2MpOworICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICBfaGlkbF9jYihzdGF0dXMsIGNvbm5lY3Rpb24sIGNvbm5lY3Rpb25JZCwgbXNnSWQsICpmbXFEZXNjLCAqaW52RGVzYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBudWxscHRyLCAtMUxMLCAwLAorICAgICAgICAgICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzxCdWZmZXJTdGF0dXNNZXNzYWdlPigKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhbmRyb2lkOjpoYXJkd2FyZTo6R3JhbnRvckRlc2NyaXB0b3I+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBuaGFuZGxlICovLCAwIC8qIHNpemUgKi8pLAorICAgICAgICAgICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yVW5zeW5jPEJ1ZmZlckludmFsaWRhdGlvbk1lc3NhZ2U+KAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OmhhcmR3YXJlOjpHcmFudG9yRGVzY3JpcHRvcj4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIG5oYW5kbGUgKi8sIDAgLyogc2l6ZSAqLykpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCitBY2Nlc3Nvcjo6QWNjZXNzb3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IpCisgICAgOiBtSW1wbChuZXcgSW1wbChhbGxvY2F0b3IpKSB7fQorCitBY2Nlc3Nvcjo6fkFjY2Vzc29yKCkgeworfQorCitib29sIEFjY2Vzc29yOjppc1ZhbGlkKCkgeworICAgIHJldHVybiAoYm9vbCltSW1wbCAmJiBtSW1wbC0+aXNWYWxpZCgpOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OmZsdXNoKCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBtSW1wbC0+Zmx1c2goKTsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OmFsbG9jYXRlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBCdWZmZXJJZCAqYnVmZmVySWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmFsbG9jYXRlKGNvbm5lY3Rpb25JZCwgcGFyYW1zLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6ZmV0Y2goCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmZldGNoKGNvbm5lY3Rpb25JZCwgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OmNvbm5lY3QoCisgICAgICAgIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyLCBib29sIGxvY2FsLAorICAgICAgICBzcDxDb25uZWN0aW9uPiAqY29ubmVjdGlvbiwgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkLAorICAgICAgICB1aW50MzJfdCAqcE1zZ0lkLAorICAgICAgICBjb25zdCBTdGF0dXNEZXNjcmlwdG9yKiogc3RhdHVzRGVzY1B0ciwKKyAgICAgICAgY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvcioqIGludkRlc2NQdHIpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1JbXBsLT5jb25uZWN0KAorICAgICAgICAgICAgICAgIHRoaXMsIG9ic2VydmVyLCBjb25uZWN0aW9uLCBwQ29ubmVjdGlvbklkLCBwTXNnSWQsCisgICAgICAgICAgICAgICAgc3RhdHVzRGVzY1B0ciwgaW52RGVzY1B0cik7CisgICAgICAgIGlmICghbG9jYWwgJiYgc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIHNwPEFjY2Vzc29yPiBhY2Nlc3Nvcih0aGlzKTsKKyAgICAgICAgICAgIHNDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQtPmFkZCgqcENvbm5lY3Rpb25JZCwgYWNjZXNzb3IpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OmNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1JbXBsLT5jbG9zZShjb25uZWN0aW9uSWQpOworICAgICAgICBzQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50LT5yZW1vdmUoY29ubmVjdGlvbklkKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIG1JbXBsLT5jbGVhblVwKGNsZWFyQ2FjaGUpOworICAgIH0KK30KKworLy9JQWNjZXNzb3IqIEhJRExfRkVUQ0hfSUFjY2Vzc29yKGNvbnN0IGNoYXIqIC8qIG5hbWUgKi8pIHsKKy8vICAgIHJldHVybiBuZXcgQWNjZXNzb3IoKTsKKy8vfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3Nvci5oIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDAyNTE5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3IuaApAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQUNDRVNTT1JfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9BQ0NFU1NPUl9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lBY2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSU9ic2VydmVyLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSAiQnVmZmVyU3RhdHVzLmgiCisKKyNpbmNsdWRlIDxzZXQ+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQWNjZXNzb3I7CitzdHJ1Y3QgQ29ubmVjdGlvbjsKKworLyoqCisgKiBSZWNlaXZlcyBkZWF0aCBub3RpZmljYXRpb25zIGZyb20gcmVtb3RlIGNvbm5lY3Rpb25zLgorICogT24gZGVhdGggbm90aWZpY2F0aW9ucywgdGhlIGNvbm5lY3Rpb25zIGFyZSBjbG9zZWQgYW5kIHVzZWQgcmVzb3VyY2VzCisgKiBhcmUgcmVsZWFzZWQuCisgKi8KK3N0cnVjdCBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQgOiBwdWJsaWMgaGFyZHdhcmU6OmhpZGxfZGVhdGhfcmVjaXBpZW50IHsKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBuZXdseSBjb25uZWN0ZWQgY29ubmVjdGlvbiBmcm9tIHJlbW90ZSBwcm9jZXNzZXMuCisgICAgICovCisgICAgdm9pZCBhZGQoaW50NjRfdCBjb25uZWN0aW9uSWQsIGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhIGNvbm5lY3Rpb24uCisgICAgICovCisgICAgdm9pZCByZW1vdmUoaW50NjRfdCBjb25uZWN0aW9uSWQpOworCisgICAgdm9pZCBhZGRDb29raWVUb0Nvbm5lY3Rpb24odWludDY0X3QgY29va2llLCBpbnQ2NF90IGNvbm5lY3Rpb25JZCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2VydmljZURpZWQoCisgICAgICAgICAgICB1aW50NjRfdCAvKiBjb29raWUgKi8sCisgICAgICAgICAgICBjb25zdCB3cDw6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgLyogd2hvICovCisgICAgICAgICAgICApIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6c2V0PGludDY0X3Q+PiAgbUNvb2tpZVRvQ29ubmVjdGlvbnM7CisgICAgc3RkOjptYXA8aW50NjRfdCwgdWludDY0X3Q+IG1Db25uZWN0aW9uVG9Db29raWU7CisgICAgc3RkOjptYXA8aW50NjRfdCwgY29uc3Qgd3A8QWNjZXNzb3I+PiBtQWNjZXNzb3JzOworfTsKKworLyoqCisgKiBBIGJ1ZmZlciBwb29sIGFjY2Vzc29yIHdoaWNoIGVuYWJsZXMgYSBidWZmZXIgcG9vbCB0byBjb21tdW5pY2F0ZSB3aXRoIGJ1ZmZlcgorICogcG9vbCBjbGllbnRzLiAxOjEgY29ycmVzcG9uZGVuc2UgaG9sZHMgYmV0d2VlbiBhIGJ1ZmZlciBwb29sIGFuZCBhbiBhY2Nlc3Nvci4KKyAqLworc3RydWN0IEFjY2Vzc29yIDogcHVibGljIElBY2Nlc3NvciB7CisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQWNjZXNzb3IgZm9sbG93LgorICAgIFJldHVybjx2b2lkPiBjb25uZWN0KGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJT2JzZXJ2ZXI+JiBvYnNlcnZlciwgY29ubmVjdF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgYnVmZmVyIHBvb2wgYWNjZXNzb3Igd2hpY2ggdXNlcyB0aGUgc3BlY2lmaWVkIGFsbG9jYXRvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbGxvY2F0b3IgYnVmZmVyIGFsbG9jYXRvci4KKyAgICAgKi8KKyAgICBleHBsaWNpdCBBY2Nlc3Nvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvcik7CisKKyAgICAvKiogRGVzdHJ1Y3RzIGEgYnVmZmVyIHBvb2wgYWNjZXNzb3IuICovCisgICAgfkFjY2Vzc29yKCk7CisKKyAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBhY2Nlc3NvciBpcyB2YWxpZC4gKi8KKyAgICBib29sIGlzVmFsaWQoKTsKKworICAgIC8qKiBJbnZhbGlkYXRlcyBhbGwgYnVmZmVycyB3aGljaCBhcmUgb3duZWQgYnkgYnVmZmVycG9vbCAqLworICAgIFJlc3VsdFN0YXR1cyBmbHVzaCgpOworCisgICAgLyoqIEFsbG9jYXRlcyBhIGJ1ZmZlciBmcm9tIGEgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgY29ubmVjdGlvbiBpZCBvZiB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSBwYXJhbXMgICAgICAgIHRoZSBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgdGhlIGlkIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgICAgIHRoZSBuYXRpdmUgaGFuZGxlIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIGlzIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsCisgICAgICAgICAgICBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpOworCisgICAgLyoqCisgICAgICogRmV0Y2hlcyBhIGJ1ZmZlciBmb3IgdGhlIHNwZWNpZmllZCB0cmFuc2FjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiByZWNlaXZpbmcgY29ubmVjdGlvbihjbGllbnQpLgorICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbklkIHRoZSBpZCBvZiB0aGUgdHJhbnNmZXIgdHJhbnNhY3Rpb24uCisgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgdGhlIGlkIG9mIHRoZSBidWZmZXIgdG8gYmUgZmV0Y2hlZC4KKyAgICAgKiBAcGFyYW0gaGFuZGxlICAgICAgICB0aGUgbmF0aXZlIGhhbmRsZSBvZiB0aGUgZmV0Y2hlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgaXMgc3VjY2Vzc2Z1bGx5IGZldGNoZWQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGZldGNoKAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIE1ha2VzIGEgY29ubmVjdGlvbiB0byB0aGUgYnVmZmVyIHBvb2wuIFRoZSBidWZmZXIgcG9vbCBjbGllbnQgdXNlcyB0aGUKKyAgICAgKiBjcmVhdGVkIGNvbm5lY3Rpb24gaW4gb3JkZXIgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgYnVmZmVyIHBvb2wuIEFuCisgICAgICogRk1RIGZvciBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgaXMgYWxzbyBjcmVhdGVkIGZvciB0aGUgY2xpZW50LgorICAgICAqCisgICAgICogQHBhcmFtIG9ic2VydmVyICAgICAgY2xpZW50IG9ic2VydmVyIGZvciBidWZmZXIgaW52YWxpZGF0aW9uCisgICAgICogQHBhcmFtIGxvY2FsICAgICAgICAgdHJ1ZSB3aGVuIGEgY29ubmVjdGlvbiByZXF1ZXN0IGNvbWVzIGZyb20gbG9jYWwgcHJvY2VzcywKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb24gICAgY3JlYXRlZCBjb25uZWN0aW9uCisgICAgICogQHBhcmFtIHBDb25uZWN0aW9uSWQgdGhlIGlkIG9mIHRoZSBjcmVhdGVkIGNvbm5lY3Rpb24KKyAgICAgKiBAcGFyYW0gcE1zZ0lkICAgICAgICB0aGUgaWQgb2YgdGhlIHJlY2VudCBidWZmZXIgcG9vbCBtZXNzYWdlCisgICAgICogQHBhcmFtIHN0YXR1c0Rlc2NQdHIgRk1RIGRlc2NyaXB0b3IgZm9yIHNoYXJlZCBidWZmZXIgc3RhdHVzIG1lc3NhZ2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSBiZXR3ZWVuIGEgYnVmZmVyIHBvb2wgYW5kIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIGludkRlc2NQdHIgICAgRk1RIGRlc2NyaXB0b3IgZm9yIGJ1ZmZlciBpbnZhbGlkYXRpb24gbWVzc2FnZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlIGZyb20gYSBidWZmZXIgcG9vbCB0byB0aGUgY2xpZW50LgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgY29ubmVjdGlvbiBpcyBzdWNjZXNzZnVsbHkgbWFkZS4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IHNwPElPYnNlcnZlcj4mIG9ic2VydmVyLAorICAgICAgICAgICAgYm9vbCBsb2NhbCwKKyAgICAgICAgICAgIHNwPENvbm5lY3Rpb24+ICpjb25uZWN0aW9uLCBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQsCisgICAgICAgICAgICB1aW50MzJfdCAqcE1zZ0lkLAorICAgICAgICAgICAgY29uc3QgU3RhdHVzRGVzY3JpcHRvcioqIHN0YXR1c0Rlc2NQdHIsCisgICAgICAgICAgICBjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yKiogaW52RGVzY1B0cik7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIHRvIHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgaWQgb2YgdGhlIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkLgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIC8qKgorICAgICAqIFByb2Nlc3NlcyBwZW5kaW5nIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMgYW5kIHBlcmZvbXMgcGVyaW9kaWMgY2FjaGUKKyAgICAgKiBjbGVhbmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGVhckNhY2hlICAgIGlmIGNsZWFyQ2FjaGUgaXMgdHJ1ZSwgaXQgZnJlZXMgYWxsIGJ1ZmZlcnMgd2FpdGluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlY3ljbGVkLgorICAgICAqLworICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUpOworCisgICAgLyoqCisgICAgICogR2V0cyBhIGhpZGxfZGVhdGhfcmVjaXBpZW50IGZvciByZW1vdGUgY29ubmVjdGlvbiBkZWF0aC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3A8Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50PiBnZXRDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQoKTsKKworICAgIHN0YXRpYyB2b2lkIGNyZWF0ZUludmFsaWRhdG9yKCk7CisKK3ByaXZhdGU6CisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQUNDRVNTT1JfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3JJbXBsLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29ySW1wbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI2MDkwOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29ySW1wbC5jcHAKQEAgLTAsMCArMSw4NTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclBvb2xBY2Nlc3NvciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSAiQWNjZXNzb3JJbXBsLmgiCisjaW5jbHVkZSAiQ29ubmVjdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK25hbWVzcGFjZSB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtDbGVhblVwRHVyYXRpb25VcyA9IDUwMDAwMDsgLy8gVE9ETyB0dW5lIDAuNSBzZWMKKyAgICBzdGF0aWMgY29uc3RleHByIGludDY0X3Qga0xvZ0R1cmF0aW9uVXMgPSA1MDAwMDAwOyAvLyA1IHNlY3MKKworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNaW5BbGxvY0J5dGVzRm9yRXZpY3Rpb24gPSAxMDI0KjEwMjQqMTU7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01pbkJ1ZmZlckNvdW50Rm9yRXZpY3Rpb24gPSA0MDsKK30KKworLy8gQnVmZmVyIHN0cnVjdHVyZSBpbiBidWZmZXJwb29sIHByb2Nlc3MKK3N0cnVjdCBJbnRlcm5hbEJ1ZmZlciB7CisgICAgQnVmZmVySWQgbUlkOworICAgIHNpemVfdCBtT3duZXJDb3VudDsKKyAgICBzaXplX3QgbVRyYW5zYWN0aW9uQ291bnQ7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiBtQWxsb2NhdGlvbjsKKyAgICBjb25zdCBzaXplX3QgbUFsbG9jU2l6ZTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtQ29uZmlnOworICAgIGJvb2wgbUludmFsaWRhdGVkOworCisgICAgSW50ZXJuYWxCdWZmZXIoCisgICAgICAgICAgICBCdWZmZXJJZCBpZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jU2l6ZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZhbGxvY0NvbmZpZykKKyAgICAgICAgICAgIDogbUlkKGlkKSwgbU93bmVyQ291bnQoMCksIG1UcmFuc2FjdGlvbkNvdW50KDApLAorICAgICAgICAgICAgbUFsbG9jYXRpb24oYWxsb2MpLCBtQWxsb2NTaXplKGFsbG9jU2l6ZSksIG1Db25maWcoYWxsb2NDb25maWcpLAorICAgICAgICAgICAgbUludmFsaWRhdGVkKGZhbHNlKSB7fQorCisgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUoKSB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdGlvbi0+aGFuZGxlKCk7CisgICAgfQorCisgICAgdm9pZCBpbnZhbGlkYXRlKCkgeworICAgICAgICBtSW52YWxpZGF0ZWQgPSB0cnVlOworICAgIH0KK307CisKK3N0cnVjdCBUcmFuc2FjdGlvblN0YXR1cyB7CisgICAgVHJhbnNhY3Rpb25JZCBtSWQ7CisgICAgQnVmZmVySWQgbUJ1ZmZlcklkOworICAgIENvbm5lY3Rpb25JZCBtU2VuZGVyOworICAgIENvbm5lY3Rpb25JZCBtUmVjZWl2ZXI7CisgICAgQnVmZmVyU3RhdHVzIG1TdGF0dXM7CisgICAgaW50NjRfdCBtVGltZXN0YW1wVXM7CisgICAgYm9vbCBtU2VuZGVyVmFsaWRhdGVkOworCisgICAgVHJhbnNhY3Rpb25TdGF0dXMoY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSwgaW50NjRfdCB0aW1lc3RhbXBVcykgeworICAgICAgICBtSWQgPSBtZXNzYWdlLnRyYW5zYWN0aW9uSWQ7CisgICAgICAgIG1CdWZmZXJJZCA9IG1lc3NhZ2UuYnVmZmVySWQ7CisgICAgICAgIG1TdGF0dXMgPSBtZXNzYWdlLm5ld1N0YXR1czsKKyAgICAgICAgbVRpbWVzdGFtcFVzID0gdGltZXN0YW1wVXM7CisgICAgICAgIGlmIChtU3RhdHVzID09IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVE8pIHsKKyAgICAgICAgICAgIG1TZW5kZXIgPSBtZXNzYWdlLmNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgIG1SZWNlaXZlciA9IG1lc3NhZ2UudGFyZ2V0Q29ubmVjdGlvbklkOworICAgICAgICAgICAgbVNlbmRlclZhbGlkYXRlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU2VuZGVyID0gLTFMTDsKKyAgICAgICAgICAgIG1SZWNlaXZlciA9IG1lc3NhZ2UuY29ubmVjdGlvbklkOworICAgICAgICAgICAgbVNlbmRlclZhbGlkYXRlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorfTsKKworLy8gSGVscGVyIHRlbXBsYXRlIG1ldGhvZHMgZm9yIGhhbmRsaW5nIG1hcCBvZiBzZXQuCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgorYm9vbCBpbnNlcnQoc3RkOjptYXA8VCwgc3RkOjpzZXQ8VT4+ICptYXBPZlNldCwgVCBrZXksIFUgdmFsdWUpIHsKKyAgICBhdXRvIGl0ZXIgPSBtYXBPZlNldC0+ZmluZChrZXkpOworICAgIGlmIChpdGVyID09IG1hcE9mU2V0LT5lbmQoKSkgeworICAgICAgICBzdGQ6OnNldDxVPiB2YWx1ZVNldHt2YWx1ZX07CisgICAgICAgIG1hcE9mU2V0LT5pbnNlcnQoc3RkOjptYWtlX3BhaXIoa2V5LCB2YWx1ZVNldCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKGl0ZXItPnNlY29uZC5maW5kKHZhbHVlKSAgPT0gaXRlci0+c2Vjb25kLmVuZCgpKSB7CisgICAgICAgIGl0ZXItPnNlY29uZC5pbnNlcnQodmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgorYm9vbCBlcmFzZShzdGQ6Om1hcDxULCBzdGQ6OnNldDxVPj4gKm1hcE9mU2V0LCBUIGtleSwgVSB2YWx1ZSkgeworICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgYXV0byBpdGVyID0gbWFwT2ZTZXQtPmZpbmQoa2V5KTsKKyAgICBpZiAoaXRlciAhPSBtYXBPZlNldC0+ZW5kKCkpIHsKKyAgICAgICAgaWYgKGl0ZXItPnNlY29uZC5lcmFzZSh2YWx1ZSkgPiAwKSB7CisgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChpdGVyLT5zZWNvbmQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIG1hcE9mU2V0LT5lcmFzZShpdGVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgorYm9vbCBjb250YWlucyhzdGQ6Om1hcDxULCBzdGQ6OnNldDxVPj4gKm1hcE9mU2V0LCBUIGtleSwgVSB2YWx1ZSkgeworICAgIGF1dG8gaXRlciA9IG1hcE9mU2V0LT5maW5kKGtleSk7CisgICAgaWYgKGl0ZXIgIT0gbWFwT2ZTZXQtPmVuZCgpKSB7CisgICAgICAgIGF1dG8gc2V0SXRlciA9IGl0ZXItPnNlY29uZC5maW5kKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHNldEl0ZXIgIT0gaXRlci0+c2Vjb25kLmVuZCgpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2ludDMyX3QgQWNjZXNzb3I6OkltcGw6OnNQaWQgPSBnZXRwaWQoKTsKK3VpbnQzMl90IEFjY2Vzc29yOjpJbXBsOjpzU2VxSWQgPSB0aW1lKG51bGxwdHIpOworCitBY2Nlc3Nvcjo6SW1wbDo6SW1wbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IpCisgICAgICAgIDogbUFsbG9jYXRvcihhbGxvY2F0b3IpIHt9CisKK0FjY2Vzc29yOjpJbXBsOjp+SW1wbCgpIHsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpJbXBsOjpjb25uZWN0KAorICAgICAgICBjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlciwKKyAgICAgICAgc3A8Q29ubmVjdGlvbj4gKmNvbm5lY3Rpb24sCisgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCwKKyAgICAgICAgdWludDMyX3QgKnBNc2dJZCwKKyAgICAgICAgY29uc3QgU3RhdHVzRGVzY3JpcHRvcioqIHN0YXR1c0Rlc2NQdHIsCisgICAgICAgIGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3IqKiBpbnZEZXNjUHRyKSB7CisgICAgc3A8Q29ubmVjdGlvbj4gbmV3Q29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKCk7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgICAgICBpZiAobmV3Q29ubmVjdGlvbikgeworICAgICAgICAgICAgQ29ubmVjdGlvbklkIGlkID0gKGludDY0X3Qpc1BpZCA8PCAzMiB8IHNTZXFJZDsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1CdWZmZXJQb29sLm1PYnNlcnZlci5vcGVuKGlkLCBzdGF0dXNEZXNjUHRyKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIG5ld0Nvbm5lY3Rpb24tPmluaXRpYWxpemUoYWNjZXNzb3IsIGlkKTsKKyAgICAgICAgICAgICAgICAqY29ubmVjdGlvbiA9IG5ld0Nvbm5lY3Rpb247CisgICAgICAgICAgICAgICAgKnBDb25uZWN0aW9uSWQgPSBpZDsKKyAgICAgICAgICAgICAgICAqcE1zZ0lkID0gbUJ1ZmZlclBvb2wubUludmFsaWRhdGlvbi5tSW52YWxpZGF0aW9uSWQ7CisgICAgICAgICAgICAgICAgbUJ1ZmZlclBvb2wubUludmFsaWRhdGlvbkNoYW5uZWwuZ2V0RGVzYyhpbnZEZXNjUHRyKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyUG9vbC5tSW52YWxpZGF0aW9uLm9uQ29ubmVjdChpZCwgb2JzZXJ2ZXIpOworICAgICAgICAgICAgICAgICsrc1NlcUlkOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgICAgIG1CdWZmZXJQb29sLmNsZWFuVXAoKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpJbXBsOjpjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICBBTE9HVigiY29ubmVjdGlvbiBjbG9zZSAlbGxkOiAldSIsIChsb25nIGxvbmcpY29ubmVjdGlvbklkLCBtQnVmZmVyUG9vbC5tSW52YWxpZGF0aW9uLm1JZCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgbUJ1ZmZlclBvb2wuaGFuZGxlQ2xvc2UoY29ubmVjdGlvbklkKTsKKyAgICBtQnVmZmVyUG9vbC5tT2JzZXJ2ZXIuY2xvc2UoY29ubmVjdGlvbklkKTsKKyAgICBtQnVmZmVyUG9vbC5tSW52YWxpZGF0aW9uLm9uQ2xvc2UoY29ubmVjdGlvbklkKTsKKyAgICAvLyBTaW5jZSBjbG9zZSMgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgYWxsIHdvcmtzIGFyZSBmaW5pc2hlZCwgaXQgaXMgT0sgdG8KKyAgICAvLyBldmljdCB1bnVzZWQgYnVmZmVycy4KKyAgICBtQnVmZmVyUG9vbC5jbGVhblVwKHRydWUpOworICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OkltcGw6OmFsbG9jYXRlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGFyYW1zLAorICAgICAgICBCdWZmZXJJZCAqYnVmZmVySWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgIG1CdWZmZXJQb29sLnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6Ok9LOworICAgIGlmICghbUJ1ZmZlclBvb2wuZ2V0RnJlZUJ1ZmZlcihtQWxsb2NhdG9yLCBwYXJhbXMsIGJ1ZmZlcklkLCBoYW5kbGUpKSB7CisgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgICAgIHNpemVfdCBhbGxvY1NpemU7CisgICAgICAgIHN0YXR1cyA9IG1BbGxvY2F0b3ItPmFsbG9jYXRlKHBhcmFtcywgJmFsbG9jLCAmYWxsb2NTaXplKTsKKyAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgc3RhdHVzID0gbUJ1ZmZlclBvb2wuYWRkTmV3QnVmZmVyKGFsbG9jLCBhbGxvY1NpemUsIHBhcmFtcywgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImNyZWF0ZSBhIGJ1ZmZlciAlZCA6ICV1ICVwIiwKKyAgICAgICAgICAgICAgc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0ssICpidWZmZXJJZCwgKmhhbmRsZSk7CisgICAgfQorICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAvLyBUT0RPOiBoYW5kbGUgb3duQnVmZmVyIGZhaWx1cmUKKyAgICAgICAgbUJ1ZmZlclBvb2wuaGFuZGxlT3duQnVmZmVyKGNvbm5lY3Rpb25JZCwgKmJ1ZmZlcklkKTsKKyAgICB9CisgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcCgpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6ZmV0Y2goCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgYXV0byBmb3VuZCA9IG1CdWZmZXJQb29sLm1UcmFuc2FjdGlvbnMuZmluZCh0cmFuc2FjdGlvbklkKTsKKyAgICBpZiAoZm91bmQgIT0gbUJ1ZmZlclBvb2wubVRyYW5zYWN0aW9ucy5lbmQoKSAmJgorICAgICAgICAgICAgY29udGFpbnMoJm1CdWZmZXJQb29sLm1QZW5kaW5nVHJhbnNhY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbklkLCB0cmFuc2FjdGlvbklkKSkgeworICAgICAgICBpZiAoZm91bmQtPnNlY29uZC0+bVNlbmRlclZhbGlkYXRlZCAmJgorICAgICAgICAgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TdGF0dXMgPT0gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GUk9NICYmCisgICAgICAgICAgICAgICAgZm91bmQtPnNlY29uZC0+bUJ1ZmZlcklkID09IGJ1ZmZlcklkKSB7CisgICAgICAgICAgICBmb3VuZC0+c2Vjb25kLT5tU3RhdHVzID0gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GRVRDSDsKKyAgICAgICAgICAgIGF1dG8gYnVmZmVySXQgPSBtQnVmZmVyUG9vbC5tQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgICAgIGlmIChidWZmZXJJdCAhPSBtQnVmZmVyUG9vbC5tQnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgICAgIG1CdWZmZXJQb29sLm1TdGF0cy5vbkJ1ZmZlckZldGNoZWQoKTsKKyAgICAgICAgICAgICAgICAqaGFuZGxlID0gYnVmZmVySXQtPnNlY29uZC0+aGFuZGxlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcCgpOworICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSkgeworICAgIC8vIHRyYW5zYWN0aW9uIHRpbWVvdXQsIGJ1ZmZlciBjYWNoZWluZyBUVEwgaGFuZGxpbmcKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgIG1CdWZmZXJQb29sLnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworICAgIG1CdWZmZXJQb29sLmNsZWFuVXAoY2xlYXJDYWNoZSk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OmZsdXNoKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgbUJ1ZmZlclBvb2wuZmx1c2goc2hhcmVkX2Zyb21fdGhpcygpKTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6aGFuZGxlSW52YWxpZGF0ZUFjaygpIHsKKyAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIGNvbnN0IHNwPElPYnNlcnZlcj4+IG9ic2VydmVyczsKKyAgICB1aW50MzJfdCBpbnZhbGlkYXRpb25JZDsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgICAgIG1CdWZmZXJQb29sLnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworICAgICAgICBtQnVmZmVyUG9vbC5tSW52YWxpZGF0aW9uLm9uSGFuZGxlQWNrKCZvYnNlcnZlcnMsICZpbnZhbGlkYXRpb25JZCk7CisgICAgfQorICAgIC8vIERvIG5vdCBob2xkIGxvY2sgZm9yIHNlbmQgaW52YWxpZGF0aW9ucworICAgIGZvciAoYXV0byBpdCA9IG9ic2VydmVycy5iZWdpbigpOyBpdCAhPSBvYnNlcnZlcnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgY29uc3Qgc3A8SU9ic2VydmVyPiBvYnNlcnZlciA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGlmIChvYnNlcnZlcikgeworICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0ID0gb2JzZXJ2ZXItPm9uTWVzc2FnZShpdC0+Zmlyc3QsIGludmFsaWRhdGlvbklkKTsKKyAgICAgICAgICAgICh2b2lkKSB0cmFuc1Jlc3VsdDsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gbUJ1ZmZlclBvb2wuaXNWYWxpZCgpOworfQorCitBY2Nlc3Nvcjo6SW1wbDo6SW1wbDo6QnVmZmVyUG9vbDo6QnVmZmVyUG9vbCgpCisgICAgOiBtVGltZXN0YW1wVXMoZ2V0VGltZXN0YW1wTm93KCkpLAorICAgICAgbUxhc3RDbGVhblVwVXMobVRpbWVzdGFtcFVzKSwKKyAgICAgIG1MYXN0TG9nVXMobVRpbWVzdGFtcFVzKSwKKyAgICAgIG1TZXEoMCksCisgICAgICBtU3RhcnRTZXEoMCkgeworICAgIG1WYWxpZCA9IG1JbnZhbGlkYXRpb25DaGFubmVsLmlzVmFsaWQoKTsKK30KKworCisvLyBTdGF0aXN0aWNzIGhlbHBlcgordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUz4KK2ludCBwZXJjZW50YWdlKFQgYmFzZSwgUyB0b3RhbCkgeworICAgIHJldHVybiBpbnQodG90YWwgPyAwLjUgKyAxMDAuICogc3RhdGljX2Nhc3Q8Uz4oYmFzZSkgLyB0b3RhbCA6IDApOworfQorCitzdGQ6OmF0b21pYzxzdGQ6OnVpbnQzMl90PiBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6SW52YWxpZGF0aW9uOjpzSW52U2VxSWQoMCk7CisKK0FjY2Vzc29yOjpJbXBsOjpJbXBsOjpCdWZmZXJQb29sOjp+QnVmZmVyUG9vbCgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIEFMT0dEKCJEZXN0cnVjdGlvbiAtIGJ1ZmZlcnBvb2wyICVwICIKKyAgICAgICAgICAiY2FjaGVkOiAlenUvJXp1TSwgJXp1LyVkJSUgaW4gdXNlOyAiCisgICAgICAgICAgImFsbG9jczogJXp1LCAlZCUlIHJlY3ljbGVkOyAiCisgICAgICAgICAgInRyYW5zZmVyczogJXp1LCAlZCUlIHVuZmV0Y2VkIiwKKyAgICAgICAgICB0aGlzLCBtU3RhdHMubUJ1ZmZlcnNDYWNoZWQsIG1TdGF0cy5tU2l6ZUNhY2hlZCA+PiAyMCwKKyAgICAgICAgICBtU3RhdHMubUJ1ZmZlcnNJblVzZSwgcGVyY2VudGFnZShtU3RhdHMubUJ1ZmZlcnNJblVzZSwgbVN0YXRzLm1CdWZmZXJzQ2FjaGVkKSwKKyAgICAgICAgICBtU3RhdHMubVRvdGFsQWxsb2NhdGlvbnMsIHBlcmNlbnRhZ2UobVN0YXRzLm1Ub3RhbFJlY3ljbGVzLCBtU3RhdHMubVRvdGFsQWxsb2NhdGlvbnMpLAorICAgICAgICAgIG1TdGF0cy5tVG90YWxUcmFuc2ZlcnMsCisgICAgICAgICAgcGVyY2VudGFnZShtU3RhdHMubVRvdGFsVHJhbnNmZXJzIC0gbVN0YXRzLm1Ub3RhbEZldGNoZXMsIG1TdGF0cy5tVG90YWxUcmFuc2ZlcnMpKTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6SW52YWxpZGF0aW9uOjpvbkNvbm5lY3QoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25JZCwgY29uc3Qgc3A8SU9ic2VydmVyPiYgb2JzZXJ2ZXIpIHsKKyAgICBtQWNrc1tjb25JZF0gPSBtSW52YWxpZGF0aW9uSWQ7IC8vIHN0YXJ0cyBmcm9tIGN1cnJlbnQgaW52YWxpZGF0aW9uSWQKKyAgICBtT2JzZXJ2ZXJzLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25JZCwgb2JzZXJ2ZXIpKTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6SW52YWxpZGF0aW9uOjpvbkNsb3NlKENvbm5lY3Rpb25JZCBjb25JZCkgeworICAgIG1BY2tzLmVyYXNlKGNvbklkKTsKKyAgICBtT2JzZXJ2ZXJzLmVyYXNlKGNvbklkKTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6SW52YWxpZGF0aW9uOjpvbkFjaygKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbklkLAorICAgICAgICB1aW50MzJfdCBtc2dJZCkgeworICAgIGF1dG8gaXQgPSBtQWNrcy5maW5kKGNvbklkKTsKKyAgICBpZiAoaXQgPT0gbUFja3MuZW5kKCkpIHsKKyAgICAgICAgQUxPR1coIkFDSyBmcm9tIGluY29uc2lzdGVudCBjb25uZWN0aW9uISAlbGxkIiwgKGxvbmcgbG9uZyljb25JZCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGlzTWVzc2FnZUxhdGVyKG1zZ0lkLCBpdC0+c2Vjb25kKSkgeworICAgICAgICBtQWNrc1tjb25JZF0gPSBtc2dJZDsKKyAgICB9Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OkludmFsaWRhdGlvbjo6b25CdWZmZXJJbnZhbGlkYXRlZCgKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWwgJmNoYW5uZWwpIHsKKyAgICBmb3IgKGF1dG8gaXQgPSBtUGVuZGluZ3MuYmVnaW4oKTsgaXQgIT0gbVBlbmRpbmdzLmVuZCgpOykgeworICAgICAgICBpZiAoaXQtPmlzSW52YWxpZGF0ZWQoYnVmZmVySWQpKSB7CisgICAgICAgICAgICB1aW50MzJfdCBtc2dJZCA9IDA7CisgICAgICAgICAgICBpZiAoaXQtPm1OZWVkc0FjaykgeworICAgICAgICAgICAgICAgIG1zZ0lkID0gKyttSW52YWxpZGF0aW9uSWQ7CisgICAgICAgICAgICAgICAgaWYgKG1zZ0lkID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd3JhcCBoYXBwZW5zCisgICAgICAgICAgICAgICAgICAgIG1zZ0lkID0gKyttSW52YWxpZGF0aW9uSWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hhbm5lbC5wb3N0SW52YWxpZGF0aW9uKG1zZ0lkLCBpdC0+bUZyb20sIGl0LT5tVG8pOworICAgICAgICAgICAgaXQgPSBtUGVuZGluZ3MuZXJhc2UoaXQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgKytpdDsKKyAgICB9Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OkludmFsaWRhdGlvbjo6b25JbnZhbGlkYXRpb25SZXF1ZXN0KAorICAgICAgICBib29sIG5lZWRzQWNrLAorICAgICAgICB1aW50MzJfdCBmcm9tLAorICAgICAgICB1aW50MzJfdCB0bywKKyAgICAgICAgc2l6ZV90IGxlZnQsCisgICAgICAgIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWwgJmNoYW5uZWwsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gJmltcGwpIHsKKyAgICAgICAgdWludDMyX3QgbXNnSWQgPSAwOworICAgIGlmIChuZWVkc0FjaykgeworICAgICAgICBtc2dJZCA9ICsrbUludmFsaWRhdGlvbklkOworICAgICAgICBpZiAobXNnSWQgPT0gMCkgeworICAgICAgICAgICAgLy8gd3JhcCBoYXBwZW5zCisgICAgICAgICAgICBtc2dJZCA9ICsrbUludmFsaWRhdGlvbklkOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCJidWZmZXJwb29sMiBpbnZhbGlkYXRpb24gcmVxdWVzdGVkIGFuZCBxdWV1ZWQiKTsKKyAgICBpZiAobGVmdCA9PSAwKSB7CisgICAgICAgIGNoYW5uZWwucG9zdEludmFsaWRhdGlvbihtc2dJZCwgZnJvbSwgdG8pOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRPRE86IHNlbmRpbmcgaGludCBtZXNzYWdlPworICAgICAgICBBTE9HVigiYnVmZmVycG9vMiBpbnZhbGlkYXRpb24gcmVxdWVzdGVkIGFuZCBwZW5kaW5nIik7CisgICAgICAgIFBlbmRpbmcgcGVuZGluZyhuZWVkc0FjaywgZnJvbSwgdG8sIGxlZnQsIGltcGwpOworICAgICAgICBtUGVuZGluZ3MucHVzaF9iYWNrKHBlbmRpbmcpOworICAgIH0KKyAgICBzSW52YWxpZGF0b3ItPmFkZEFjY2Vzc29yKG1JZCwgaW1wbCk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OkludmFsaWRhdGlvbjo6b25IYW5kbGVBY2soCisgICAgICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgY29uc3Qgc3A8SU9ic2VydmVyPj4gKm9ic2VydmVycywKKyAgICAgICAgdWludDMyX3QgKmludmFsaWRhdGlvbklkKSB7CisgICAgaWYgKG1JbnZhbGlkYXRpb25JZCAhPSAwKSB7CisgICAgICAgICppbnZhbGlkYXRpb25JZCA9IG1JbnZhbGlkYXRpb25JZDsKKyAgICAgICAgc3RkOjpzZXQ8aW50PiBkZWFkczsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbUFja3MuYmVnaW4oKTsgaXQgIT0gbUFja3MuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGlmIChpdC0+c2Vjb25kICE9IG1JbnZhbGlkYXRpb25JZCkgeworICAgICAgICAgICAgICAgIGNvbnN0IHNwPElPYnNlcnZlcj4gb2JzZXJ2ZXIgPSBtT2JzZXJ2ZXJzW2l0LT5maXJzdF07CisgICAgICAgICAgICAgICAgaWYgKG9ic2VydmVyKSB7CisgICAgICAgICAgICAgICAgICAgIG9ic2VydmVycy0+ZW1wbGFjZShpdC0+Zmlyc3QsIG9ic2VydmVyKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNvbm5lY3Rpb24gJWxsZCB3aWxsIGNhbGwgb2JzZXJ2ZXIgKCV1OiAldSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWl0LT5maXJzdCwgaXQtPnNlY29uZCwgbUludmFsaWRhdGlvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gTi5COiBvbk1lc3NhZ2Ugd2lsbCBiZSBjYWxsZWQgbGF0ZXIuIGlnbm9yZSBwb3NzaWJpbGl0eSBvZgorICAgICAgICAgICAgICAgICAgICAvLyBvbk1lc3NhZ2UjIG9uZXdheSBjYWxsIGJlaW5nIGxvc3QuCisgICAgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQgPSBtSW52YWxpZGF0aW9uSWQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImJ1ZmZlcnBvb2wyIG9ic2VydmVyIGRpZWQgJWxsZCIsIChsb25nIGxvbmcpaXQtPmZpcnN0KTsKKyAgICAgICAgICAgICAgICAgICAgZGVhZHMuaW5zZXJ0KGl0LT5maXJzdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChkZWFkcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBkZWFkcy5iZWdpbigpOyBpdCAhPSBkZWFkcy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgICAgIG9uQ2xvc2UoKml0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobVBlbmRpbmdzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIC8vIEFsbCBpbnZhbGlkYXRpb24gSWRzIGFyZSBzeW5jZWQgYW5kIG5vIG1vcmUgcGVuZGluZyBpbnZhbGlkYXRpb25zLgorICAgICAgICBzSW52YWxpZGF0b3ItPmRlbEFjY2Vzc29yKG1JZCk7CisgICAgfQorfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVPd25CdWZmZXIoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkKSB7CisKKyAgICBib29sIGFkZGVkID0gaW5zZXJ0KCZtVXNpbmdCdWZmZXJzLCBjb25uZWN0aW9uSWQsIGJ1ZmZlcklkKTsKKyAgICBpZiAoYWRkZWQpIHsKKyAgICAgICAgYXV0byBpdGVyID0gbUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgIGl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQrKzsKKyAgICB9CisgICAgaW5zZXJ0KCZtVXNpbmdDb25uZWN0aW9ucywgYnVmZmVySWQsIGNvbm5lY3Rpb25JZCk7CisgICAgcmV0dXJuIGFkZGVkOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVSZWxlYXNlQnVmZmVyKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCkgeworICAgIGJvb2wgZGVsZXRlZCA9IGVyYXNlKCZtVXNpbmdCdWZmZXJzLCBjb25uZWN0aW9uSWQsIGJ1ZmZlcklkKTsKKyAgICBpZiAoZGVsZXRlZCkgeworICAgICAgICBhdXRvIGl0ZXIgPSBtQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgaXRlci0+c2Vjb25kLT5tT3duZXJDb3VudC0tOworICAgICAgICBpZiAoaXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwICYmCisgICAgICAgICAgICAgICAgaXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCA9PSAwKSB7CisgICAgICAgICAgICBpZiAoIWl0ZXItPnNlY29uZC0+bUludmFsaWRhdGVkKSB7CisgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgbUZyZWVCdWZmZXJzLmluc2VydChidWZmZXJJZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChpdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckV2aWN0ZWQoaXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVycy5lcmFzZShpdGVyKTsKKyAgICAgICAgICAgICAgICBtSW52YWxpZGF0aW9uLm9uQnVmZmVySW52YWxpZGF0ZWQoYnVmZmVySWQsIG1JbnZhbGlkYXRpb25DaGFubmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlcmFzZSgmbVVzaW5nQ29ubmVjdGlvbnMsIGJ1ZmZlcklkLCBjb25uZWN0aW9uSWQpOworICAgIEFMT0dWKCJyZWxlYXNlIGJ1ZmZlciAldSA6ICVkIiwgYnVmZmVySWQsIGRlbGV0ZWQpOworICAgIHJldHVybiBkZWxldGVkOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVUcmFuc2ZlclRvKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpIHsKKyAgICBhdXRvIGNvbXBsZXRlZCA9IG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuZmluZCgKKyAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgaWYgKGNvbXBsZXRlZCAhPSBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIC8vIGFscmVhZHkgY29tcGxldGVkCisgICAgICAgIG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuZXJhc2UoY29tcGxldGVkKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIC8vIHRoZSBidWZmZXIgc2hvdWxkIGV4aXN0IGFuZCBiZSBvd25lZC4KKyAgICBhdXRvIGJ1ZmZlckl0ZXIgPSBtQnVmZmVycy5maW5kKG1lc3NhZ2UuYnVmZmVySWQpOworICAgIGlmIChidWZmZXJJdGVyID09IG1CdWZmZXJzLmVuZCgpIHx8CisgICAgICAgICAgICAhY29udGFpbnMoJm1Vc2luZ0J1ZmZlcnMsIG1lc3NhZ2UuY29ubmVjdGlvbklkLCBtZXNzYWdlLmJ1ZmZlcklkKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGF1dG8gZm91bmQgPSBtVHJhbnNhY3Rpb25zLmZpbmQobWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICBpZiAoZm91bmQgIT0gbVRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICAvLyB0cmFuc2Zlcl9mcm9tIHdhcyByZWNlaXZlZCBlYXJsaWVyLgorICAgICAgICBmb3VuZC0+c2Vjb25kLT5tU2VuZGVyID0gbWVzc2FnZS5jb25uZWN0aW9uSWQ7CisgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TZW5kZXJWYWxpZGF0ZWQgPSB0cnVlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gVE9ETzogdmVyaWZ5IHRoZXJlIGlzIHRhcmdldCBjb25uZWN0aW9uIElkCisgICAgbVN0YXRzLm9uQnVmZmVyU2VudCgpOworICAgIG1UcmFuc2FjdGlvbnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxUcmFuc2FjdGlvblN0YXR1cz4obWVzc2FnZSwgbVRpbWVzdGFtcFVzKSkpOworICAgIGluc2VydCgmbVBlbmRpbmdUcmFuc2FjdGlvbnMsIG1lc3NhZ2UudGFyZ2V0Q29ubmVjdGlvbklkLAorICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQrKzsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlVHJhbnNmZXJGcm9tKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpIHsKKyAgICBhdXRvIGZvdW5kID0gbVRyYW5zYWN0aW9ucy5maW5kKG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgaWYgKGZvdW5kID09IG1UcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgLy8gVE9ETzogaXMgaXQgZmVhc2libGUgdG8gY2hlY2sgb3duZXJzaGlwIGhlcmU/CisgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclNlbnQoKTsKKyAgICAgICAgbVRyYW5zYWN0aW9ucy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8VHJhbnNhY3Rpb25TdGF0dXM+KG1lc3NhZ2UsIG1UaW1lc3RhbXBVcykpKTsKKyAgICAgICAgaW5zZXJ0KCZtUGVuZGluZ1RyYW5zYWN0aW9ucywgbWVzc2FnZS5jb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgICAgICBhdXRvIGJ1ZmZlckl0ZXIgPSBtQnVmZmVycy5maW5kKG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50Kys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1lc3NhZ2UuY29ubmVjdGlvbklkID09IGZvdW5kLT5zZWNvbmQtPm1SZWNlaXZlcikgeworICAgICAgICAgICAgZm91bmQtPnNlY29uZC0+bVN0YXR1cyA9IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRlJPTTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlVHJhbnNmZXJSZXN1bHQoY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSkgeworICAgIGF1dG8gZm91bmQgPSBtVHJhbnNhY3Rpb25zLmZpbmQobWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICBpZiAoZm91bmQgIT0gbVRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICBib29sIGRlbGV0ZWQgPSBlcmFzZSgmbVBlbmRpbmdUcmFuc2FjdGlvbnMsIG1lc3NhZ2UuY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgICAgICBpZiAoZGVsZXRlZCkgeworICAgICAgICAgICAgaWYgKCFmb3VuZC0+c2Vjb25kLT5tU2VuZGVyVmFsaWRhdGVkKSB7CisgICAgICAgICAgICAgICAgbUNvbXBsZXRlZFRyYW5zYWN0aW9ucy5pbnNlcnQobWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQobWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZS5uZXdTdGF0dXMgPT0gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9PSykgeworICAgICAgICAgICAgICAgIGhhbmRsZU93bkJ1ZmZlcihtZXNzYWdlLmNvbm5lY3Rpb25JZCwgbWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50LS07CisgICAgICAgICAgICBpZiAoYnVmZmVySXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwCisgICAgICAgICAgICAgICAgJiYgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKCFidWZmZXJJdGVyLT5zZWNvbmQtPm1JbnZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgbUZyZWVCdWZmZXJzLmluc2VydChtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyRXZpY3RlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICBtQnVmZmVycy5lcmFzZShidWZmZXJJdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgbUludmFsaWRhdGlvbi5vbkJ1ZmZlckludmFsaWRhdGVkKG1lc3NhZ2UuYnVmZmVySWQsIG1JbnZhbGlkYXRpb25DaGFubmVsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtVHJhbnNhY3Rpb25zLmVyYXNlKGZvdW5kKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigidHJhbnNmZXIgZmluaXNoZWQgJWxsdSAldSAtICVkIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyltZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgIG1lc3NhZ2UuYnVmZmVySWQsIGRlbGV0ZWQpOworICAgICAgICByZXR1cm4gZGVsZXRlZDsKKyAgICB9CisgICAgQUxPR1YoInRyYW5zZmVyIG5vdCBmb3VuZCAlbGx1ICV1IiwgKHVuc2lnbmVkIGxvbmcgbG9uZyltZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgbWVzc2FnZS5idWZmZXJJZCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpwcm9jZXNzU3RhdHVzTWVzc2FnZXMoKSB7CisgICAgc3RkOjp2ZWN0b3I8QnVmZmVyU3RhdHVzTWVzc2FnZT4gbWVzc2FnZXM7CisgICAgbU9ic2VydmVyLmdldEJ1ZmZlclN0YXR1c0NoYW5nZXMobWVzc2FnZXMpOworICAgIG1UaW1lc3RhbXBVcyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgIGZvciAoQnVmZmVyU3RhdHVzTWVzc2FnZSYgbWVzc2FnZTogbWVzc2FnZXMpIHsKKyAgICAgICAgYm9vbCByZXQgPSBmYWxzZTsKKyAgICAgICAgc3dpdGNoIChtZXNzYWdlLm5ld1N0YXR1cykgeworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6Ok5PVF9VU0VEOgorICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZVJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNvbm5lY3Rpb25JZCwgbWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VVNFRDoKKyAgICAgICAgICAgICAgICAvLyBub3QgaGFwcGVuaW5nCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVE86CisgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlVHJhbnNmZXJUbyhtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GUk9NOgorICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZVRyYW5zZmVyRnJvbShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9USU1FT1VUOgorICAgICAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9MT1NUOgorICAgICAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GRVRDSDoKKyAgICAgICAgICAgICAgICAvLyBub3QgaGFwcGVuaW5nCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfT0s6CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRVJST1I6CisgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlVHJhbnNmZXJSZXN1bHQobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6SU5WQUxJREFUSU9OX0FDSzoKKyAgICAgICAgICAgICAgICBtSW52YWxpZGF0aW9uLm9uQWNrKG1lc3NhZ2UuY29ubmVjdGlvbklkLCBtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChyZXQgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgIEFMT0dXKCJidWZmZXIgc3RhdHVzIG1lc3NhZ2UgcHJvY2Vzc2luZyBmYWlsdXJlIC0gbWVzc2FnZSA6ICVkIGNvbm5lY3Rpb24gOiAlbGxkIiwKKyAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubmV3U3RhdHVzLCAobG9uZyBsb25nKW1lc3NhZ2UuY29ubmVjdGlvbklkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtZXNzYWdlcy5jbGVhcigpOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVDbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgLy8gQ2xlYW5pbmcgYnVmZmVycworICAgIGF1dG8gYnVmZmVycyA9IG1Vc2luZ0J1ZmZlcnMuZmluZChjb25uZWN0aW9uSWQpOworICAgIGlmIChidWZmZXJzICE9IG1Vc2luZ0J1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgZm9yIChjb25zdCBCdWZmZXJJZCYgYnVmZmVySWQgOiBidWZmZXJzLT5zZWNvbmQpIHsKKyAgICAgICAgICAgIGJvb2wgZGVsZXRlZCA9IGVyYXNlKCZtVXNpbmdDb25uZWN0aW9ucywgYnVmZmVySWQsIGNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICBpZiAoZGVsZXRlZCkgeworICAgICAgICAgICAgICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQtLTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVySXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGZyZWVidWZmZXIgaW5zZXJ0IGZhaWwKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFidWZmZXJJdGVyLT5zZWNvbmQtPm1JbnZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRnJlZUJ1ZmZlcnMuaW5zZXJ0KGJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyRXZpY3RlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlcnMuZXJhc2UoYnVmZmVySXRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBtSW52YWxpZGF0aW9uLm9uQnVmZmVySW52YWxpZGF0ZWQoYnVmZmVySWQsIG1JbnZhbGlkYXRpb25DaGFubmVsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtVXNpbmdCdWZmZXJzLmVyYXNlKGJ1ZmZlcnMpOworICAgIH0KKworICAgIC8vIENsZWFuaW5nIHRyYW5zYWN0aW9ucworICAgIGF1dG8gcGVuZGluZyA9IG1QZW5kaW5nVHJhbnNhY3Rpb25zLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICBpZiAocGVuZGluZyAhPSBtUGVuZGluZ1RyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICBmb3IgKGNvbnN0IFRyYW5zYWN0aW9uSWQmIHRyYW5zYWN0aW9uSWQgOiBwZW5kaW5nLT5zZWNvbmQpIHsKKyAgICAgICAgICAgIGF1dG8gaXRlciA9IG1UcmFuc2FjdGlvbnMuZmluZCh0cmFuc2FjdGlvbklkKTsKKyAgICAgICAgICAgIGlmIChpdGVyICE9IG1UcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWl0ZXItPnNlY29uZC0+bVNlbmRlclZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgICAgICBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmluc2VydCh0cmFuc2FjdGlvbklkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQgPSBpdGVyLT5zZWNvbmQtPm1CdWZmZXJJZDsKKyAgICAgICAgICAgICAgICBhdXRvIGJ1ZmZlckl0ZXIgPSBtQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50LS07CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlckl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGZyZWVidWZmZXIgaW5zZXJ0IGZhaWwKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFidWZmZXJJdGVyLT5zZWNvbmQtPm1JbnZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRnJlZUJ1ZmZlcnMuaW5zZXJ0KGJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyRXZpY3RlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlcnMuZXJhc2UoYnVmZmVySXRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBtSW52YWxpZGF0aW9uLm9uQnVmZmVySW52YWxpZGF0ZWQoYnVmZmVySWQsIG1JbnZhbGlkYXRpb25DaGFubmVsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtVHJhbnNhY3Rpb25zLmVyYXNlKGl0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpnZXRGcmVlQnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywgQnVmZmVySWQgKnBJZCwKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgYXV0byBidWZmZXJJdCA9IG1GcmVlQnVmZmVycy5iZWdpbigpOworICAgIGZvciAoO2J1ZmZlckl0ICE9IG1GcmVlQnVmZmVycy5lbmQoKTsgKytidWZmZXJJdCkgeworICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCA9ICpidWZmZXJJdDsKKyAgICAgICAgaWYgKGFsbG9jYXRvci0+Y29tcGF0aWJsZShwYXJhbXMsIG1CdWZmZXJzW2J1ZmZlcklkXS0+bUNvbmZpZykpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChidWZmZXJJdCAhPSBtRnJlZUJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgQnVmZmVySWQgaWQgPSAqYnVmZmVySXQ7CisgICAgICAgIG1GcmVlQnVmZmVycy5lcmFzZShidWZmZXJJdCk7CisgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclJlY3ljbGVkKG1CdWZmZXJzW2lkXS0+bUFsbG9jU2l6ZSk7CisgICAgICAgICpoYW5kbGUgPSBtQnVmZmVyc1tpZF0tPmhhbmRsZSgpOworICAgICAgICAqcElkID0gaWQ7CisgICAgICAgIEFMT0dWKCJyZWN5Y2xlIGEgYnVmZmVyICV1ICVwIiwgaWQsICpoYW5kbGUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmFkZE5ld0J1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgIGNvbnN0IHNpemVfdCBhbGxvY1NpemUsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIEJ1ZmZlcklkICpwSWQsCisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworCisgICAgQnVmZmVySWQgYnVmZmVySWQgPSBtU2VxKys7CisgICAgaWYgKG1TZXEgPT0gQ29ubmVjdGlvbjo6U1lOQ19CVUZGRVJJRCkgeworICAgICAgICBtU2VxID0gMDsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPEludGVybmFsQnVmZmVyPiBidWZmZXIgPQorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxJbnRlcm5hbEJ1ZmZlcj4oCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcklkLCBhbGxvYywgYWxsb2NTaXplLCBwYXJhbXMpOworICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgYXV0byByZXMgPSBtQnVmZmVycy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgYnVmZmVySWQsIHN0ZDo6bW92ZShidWZmZXIpKSk7CisgICAgICAgIGlmIChyZXMuc2Vjb25kKSB7CisgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJBbGxvY2F0ZWQoYWxsb2NTaXplKTsKKyAgICAgICAgICAgICpoYW5kbGUgPSBhbGxvYy0+aGFuZGxlKCk7CisgICAgICAgICAgICAqcElkID0gYnVmZmVySWQ7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaWYgKGNsZWFyQ2FjaGUgfHwgbVRpbWVzdGFtcFVzID4gbUxhc3RDbGVhblVwVXMgKyBrQ2xlYW5VcER1cmF0aW9uVXMpIHsKKyAgICAgICAgbUxhc3RDbGVhblVwVXMgPSBtVGltZXN0YW1wVXM7CisgICAgICAgIGlmIChtVGltZXN0YW1wVXMgPiBtTGFzdExvZ1VzICsga0xvZ0R1cmF0aW9uVXMpIHsKKyAgICAgICAgICAgIG1MYXN0TG9nVXMgPSBtVGltZXN0YW1wVXM7CisgICAgICAgICAgICBBTE9HRCgiYnVmZmVycG9vbDIgJXAgOiAlenUoJXp1IHNpemUpIHRvdGFsIGJ1ZmZlcnMgLSAiCisgICAgICAgICAgICAgICAgICAiJXp1KCV6dSBzaXplKSB1c2VkIGJ1ZmZlcnMgLSAlenUvJXp1IChyZWN5Y2xlL2FsbG9jKSAtICIKKyAgICAgICAgICAgICAgICAgICIlenUvJXp1IChmZXRjaC90cmFuc2ZlcikiLAorICAgICAgICAgICAgICAgICAgdGhpcywgbVN0YXRzLm1CdWZmZXJzQ2FjaGVkLCBtU3RhdHMubVNpemVDYWNoZWQsCisgICAgICAgICAgICAgICAgICBtU3RhdHMubUJ1ZmZlcnNJblVzZSwgbVN0YXRzLm1TaXplSW5Vc2UsCisgICAgICAgICAgICAgICAgICBtU3RhdHMubVRvdGFsUmVjeWNsZXMsIG1TdGF0cy5tVG90YWxBbGxvY2F0aW9ucywKKyAgICAgICAgICAgICAgICAgIG1TdGF0cy5tVG90YWxGZXRjaGVzLCBtU3RhdHMubVRvdGFsVHJhbnNmZXJzKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGF1dG8gZnJlZUl0ID0gbUZyZWVCdWZmZXJzLmJlZ2luKCk7IGZyZWVJdCAhPSBtRnJlZUJ1ZmZlcnMuZW5kKCk7KSB7CisgICAgICAgICAgICBpZiAoIWNsZWFyQ2FjaGUgJiYgbVN0YXRzLm1TaXplQ2FjaGVkIDwga01pbkFsbG9jQnl0ZXNGb3JFdmljdGlvbgorICAgICAgICAgICAgICAgICAgICAmJiBtQnVmZmVycy5zaXplKCkgPCBrTWluQnVmZmVyQ291bnRGb3JFdmljdGlvbikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV0byBpdCA9IG1CdWZmZXJzLmZpbmQoKmZyZWVJdCk7CisgICAgICAgICAgICBpZiAoaXQgIT0gbUJ1ZmZlcnMuZW5kKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgaXQtPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMCAmJiBpdC0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyRXZpY3RlZChpdC0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgZnJlZUl0ID0gbUZyZWVCdWZmZXJzLmVyYXNlKGZyZWVJdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICsrZnJlZUl0OworICAgICAgICAgICAgICAgIEFMT0dXKCJidWZmZXJwb29sMiBpbmNvbnNpc3RlbnQhIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmludmFsaWRhdGUoCisgICAgICAgIGJvb2wgbmVlZHNBY2ssIEJ1ZmZlcklkIGZyb20sIEJ1ZmZlcklkIHRvLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzb3I6OkltcGw+ICZpbXBsKSB7CisgICAgZm9yIChhdXRvIGZyZWVJdCA9IG1GcmVlQnVmZmVycy5iZWdpbigpOyBmcmVlSXQgIT0gbUZyZWVCdWZmZXJzLmVuZCgpOykgeworICAgICAgICBpZiAoaXNCdWZmZXJJblJhbmdlKGZyb20sIHRvLCAqZnJlZUl0KSkgeworICAgICAgICAgICAgYXV0byBpdCA9IG1CdWZmZXJzLmZpbmQoKmZyZWVJdCk7CisgICAgICAgICAgICBpZiAoaXQgIT0gbUJ1ZmZlcnMuZW5kKCkgJiYKKyAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwICYmIGl0LT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJFdmljdGVkKGl0LT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgIG1CdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICBmcmVlSXQgPSBtRnJlZUJ1ZmZlcnMuZXJhc2UoZnJlZUl0KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coImJ1ZmZlcnBvb2wyIGluY29uc2lzdGVudCEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICArK2ZyZWVJdDsKKyAgICB9CisKKyAgICBzaXplX3QgbGVmdCA9IDA7CisgICAgZm9yIChhdXRvIGl0ID0gbUJ1ZmZlcnMuYmVnaW4oKTsgaXQgIT0gbUJ1ZmZlcnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKGlzQnVmZmVySW5SYW5nZShmcm9tLCB0bywgaXQtPmZpcnN0KSkgeworICAgICAgICAgICAgaXQtPnNlY29uZC0+aW52YWxpZGF0ZSgpOworICAgICAgICAgICAgKytsZWZ0OworICAgICAgICB9CisgICAgfQorICAgIG1JbnZhbGlkYXRpb24ub25JbnZhbGlkYXRpb25SZXF1ZXN0KG5lZWRzQWNrLCBmcm9tLCB0bywgbGVmdCwgbUludmFsaWRhdGlvbkNoYW5uZWwsIGltcGwpOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpmbHVzaChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzb3I6OkltcGw+ICZpbXBsKSB7CisgICAgQnVmZmVySWQgZnJvbSA9IG1TdGFydFNlcTsKKyAgICBCdWZmZXJJZCB0byA9IG1TZXE7CisgICAgbVN0YXJ0U2VxID0gbVNlcTsKKyAgICAvLyBUT0RPOiBuZWVkc0FjayBwYXJhbXMgCisgICAgQUxPR1YoImJ1ZmZlciBpbnZhbGlkYXRpb24gcmVxdWVzdCBicDoldSAldSAldSIsIG1JbnZhbGlkYXRpb24ubUlkLCBmcm9tLCB0byk7CisgICAgaWYgKGZyb20gIT0gdG8pIHsKKyAgICAgICAgaW52YWxpZGF0ZSh0cnVlLCBmcm9tLCB0bywgaW1wbCk7CisgICAgfQorfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjppbnZhbGlkYXRvclRocmVhZCgKKyAgICAgICAgICAgIHN0ZDo6bWFwPHVpbnQzMl90LCBjb25zdCBzdGQ6OndlYWtfcHRyPEFjY2Vzc29yOjpJbXBsPj4gJmFjY2Vzc29ycywKKyAgICAgICAgICAgIHN0ZDo6bXV0ZXggJm11dGV4LAorICAgICAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgJmN2LAorICAgICAgICAgICAgYm9vbCAmcmVhZHkpIHsKKyAgICB3aGlsZSh0cnVlKSB7CisgICAgICAgIHN0ZDo6bWFwPHVpbnQzMl90LCBjb25zdCBzdGQ6OndlYWtfcHRyPEFjY2Vzc29yOjpJbXBsPj4gY29waWVkOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXgpOworICAgICAgICAgICAgaWYgKCFyZWFkeSkgeworICAgICAgICAgICAgICAgIGN2LndhaXQobG9jayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb3BpZWQuaW5zZXJ0KGFjY2Vzc29ycy5iZWdpbigpLCBhY2Nlc3NvcnMuZW5kKCkpOworICAgICAgICB9CisgICAgICAgIHN0ZDo6bGlzdDxDb25uZWN0aW9uSWQ+IGVyYXNlZDsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gY29waWVkLmJlZ2luKCk7IGl0ICE9IGNvcGllZC5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc29yOjpJbXBsPiBpbXBsID0gaXQtPnNlY29uZC5sb2NrKCk7CisgICAgICAgICAgICBpZiAoIWltcGwpIHsKKyAgICAgICAgICAgICAgICBlcmFzZWQucHVzaF9iYWNrKGl0LT5maXJzdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGltcGwtPmhhbmRsZUludmFsaWRhdGVBY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXgpOworICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gZXJhc2VkLmJlZ2luKCk7IGl0ICE9IGVyYXNlZC5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgICAgIGFjY2Vzc29ycy5lcmFzZSgqaXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFjY2Vzc29ycy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHJlYWR5ID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgZHJhaW5pbmcgY3B1LgorICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6eWllbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworQWNjZXNzb3I6OkltcGw6OkFjY2Vzc29ySW52YWxpZGF0b3I6OkFjY2Vzc29ySW52YWxpZGF0b3IoKSA6IG1SZWFkeShmYWxzZSkgeworICAgIHN0ZDo6dGhyZWFkIGludmFsaWRhdG9yKAorICAgICAgICAgICAgaW52YWxpZGF0b3JUaHJlYWQsCisgICAgICAgICAgICBzdGQ6OnJlZihtQWNjZXNzb3JzKSwKKyAgICAgICAgICAgIHN0ZDo6cmVmKG1NdXRleCksCisgICAgICAgICAgICBzdGQ6OnJlZihtQ3YpLAorICAgICAgICAgICAgc3RkOjpyZWYobVJlYWR5KSk7CisgICAgaW52YWxpZGF0b3IuZGV0YWNoKCk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkFjY2Vzc29ySW52YWxpZGF0b3I6OmFkZEFjY2Vzc29yKAorICAgICAgICB1aW50MzJfdCBhY2Nlc3NvcklkLCBjb25zdCBzdGQ6OndlYWtfcHRyPEFjY2Vzc29yOjpJbXBsPiAmaW1wbCkgeworICAgIGJvb2wgbm90aWZ5ID0gZmFsc2U7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgaWYgKG1BY2Nlc3NvcnMuZmluZChhY2Nlc3NvcklkKSA9PSBtQWNjZXNzb3JzLmVuZCgpKSB7CisgICAgICAgIGlmICghbVJlYWR5KSB7CisgICAgICAgICAgICBtUmVhZHkgPSB0cnVlOworICAgICAgICAgICAgbm90aWZ5ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBtQWNjZXNzb3JzLmluc2VydChzdGQ6Om1ha2VfcGFpcihhY2Nlc3NvcklkLCBpbXBsKSk7CisgICAgICAgIEFMT0dWKCJidWZmZXIgaW52YWxpZGF0aW9uIGFkZGVkIGJwOiV1ICVkIiwgYWNjZXNzb3JJZCwgbm90aWZ5KTsKKyAgICB9CisgICAgbG9jay51bmxvY2soKTsKKyAgICBpZiAobm90aWZ5KSB7CisgICAgICAgIG1Ddi5ub3RpZnlfb25lKCk7CisgICAgfQorfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpBY2Nlc3NvckludmFsaWRhdG9yOjpkZWxBY2Nlc3Nvcih1aW50MzJfdCBhY2Nlc3NvcklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBtQWNjZXNzb3JzLmVyYXNlKGFjY2Vzc29ySWQpOworICAgIEFMT0dWKCJidWZmZXIgaW52YWxpZGF0aW9uIGRlbGV0ZWQgYnA6JXUiLCBhY2Nlc3NvcklkKTsKKyAgICBpZiAobUFjY2Vzc29ycy5zaXplKCkgPT0gMCkgeworICAgICAgICBtUmVhZHkgPSBmYWxzZTsKKyAgICB9Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxBY2Nlc3Nvcjo6SW1wbDo6QWNjZXNzb3JJbnZhbGlkYXRvcj4gQWNjZXNzb3I6OkltcGw6OnNJbnZhbGlkYXRvcjsKKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6Y3JlYXRlSW52YWxpZGF0b3IoKSB7CisgICAgaWYgKCFzSW52YWxpZGF0b3IpIHsKKyAgICAgICAgc0ludmFsaWRhdG9yID0gc3RkOjptYWtlX3VuaXF1ZTxBY2Nlc3Nvcjo6SW1wbDo6QWNjZXNzb3JJbnZhbGlkYXRvcj4oKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29ySW1wbC5oIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3JJbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVhNzJiOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29ySW1wbC5oCkBAIC0wLDAgKzEsNDAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9BQ0NFU1NPUklNUExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9BQ0NFU1NPUklNUExfSAorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+CisjaW5jbHVkZSAiQWNjZXNzb3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCitzdHJ1Y3QgSW50ZXJuYWxCdWZmZXI7CitzdHJ1Y3QgVHJhbnNhY3Rpb25TdGF0dXM7CisKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgYSBidWZmZXIgcG9vbCBhY2Nlc3NvcihvciBhIGJ1ZmZlciBwb29sIGltcGxlbWVudGF0aW9uLikgKi8KK2NsYXNzIEFjY2Vzc29yOjpJbXBsCisgICAgOiBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxBY2Nlc3Nvcjo6SW1wbD4geworcHVibGljOgorICAgIEltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IpOworCisgICAgfkltcGwoKTsKKworICAgIFJlc3VsdFN0YXR1cyBjb25uZWN0KAorICAgICAgICAgICAgY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvciwgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIsCisgICAgICAgICAgICBzcDxDb25uZWN0aW9uPiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIHVpbnQzMl90ICpwTXNnSWQsCisgICAgICAgICAgICBjb25zdCBTdGF0dXNEZXNjcmlwdG9yKiogc3RhdHVzRGVzY1B0ciwKKyAgICAgICAgICAgIGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3IqKiBpbnZEZXNjUHRyKTsKKworICAgIFJlc3VsdFN0YXR1cyBjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSk7CisKKyAgICBSZXN1bHRTdGF0dXMgZmV0Y2goQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKTsKKworICAgIHZvaWQgZmx1c2goKTsKKworICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUpOworCisgICAgYm9vbCBpc1ZhbGlkKCk7CisKKyAgICB2b2lkIGhhbmRsZUludmFsaWRhdGVBY2soKTsKKworICAgIHN0YXRpYyB2b2lkIGNyZWF0ZUludmFsaWRhdG9yKCk7CisKK3ByaXZhdGU6CisgICAgLy8gQ29ubmVjdGlvbklkID0gcGlkIDogKHRpbWVzdGFtcF9jcmVhdGVkICsgc2VxSWQpCisgICAgLy8gaW4gb3JkZXIgdG8gZ3VhcmFudGVlIHVuaXF1ZW5lc3MgZm9yIGVhY2ggY29ubmVjdGlvbgorICAgIHN0YXRpYyB1aW50MzJfdCBzU2VxSWQ7CisgICAgc3RhdGljIGludDMyX3Qgc1BpZDsKKworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworCisgICAgLyoqCisgICAgICogQnVmZmVyIHBvb2wgaW1wbGVtZW50YXRpb24uCisgICAgICoKKyAgICAgKiBIYW5kbGVzIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMuIEhhbmRsZXMgYnVmZmVyIGFsbG9jYXRpb24vcmVjeWNsaW5nLgorICAgICAqIEhhbmRsZXMgYnVmZmVyIHRyYW5zZmVyIGJldHdlZW4gYnVmZmVyIHBvb2wgY2xpZW50cy4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgQnVmZmVyUG9vbCB7CisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgICAgIGludDY0X3QgbVRpbWVzdGFtcFVzOworICAgICAgICBpbnQ2NF90IG1MYXN0Q2xlYW5VcFVzOworICAgICAgICBpbnQ2NF90IG1MYXN0TG9nVXM7CisgICAgICAgIEJ1ZmZlcklkIG1TZXE7CisgICAgICAgIEJ1ZmZlcklkIG1TdGFydFNlcTsKKyAgICAgICAgYm9vbCBtVmFsaWQ7CisgICAgICAgIEJ1ZmZlclN0YXR1c09ic2VydmVyIG1PYnNlcnZlcjsKKyAgICAgICAgQnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbCBtSW52YWxpZGF0aW9uQ2hhbm5lbDsKKworICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIHN0ZDo6c2V0PEJ1ZmZlcklkPj4gbVVzaW5nQnVmZmVyczsKKyAgICAgICAgc3RkOjptYXA8QnVmZmVySWQsIHN0ZDo6c2V0PENvbm5lY3Rpb25JZD4+IG1Vc2luZ0Nvbm5lY3Rpb25zOworCisgICAgICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgc3RkOjpzZXQ8VHJhbnNhY3Rpb25JZD4+IG1QZW5kaW5nVHJhbnNhY3Rpb25zOworICAgICAgICAvLyBUcmFuc2FjdGlvbnMgY29tcGxldGVkIGJlZm9yZSBUUkFOU0ZFUl9UTyBtZXNzYWdlIGFycml2YWwuCisgICAgICAgIC8vIEZldGNoIGRvZXMgbm90IG9jY3VyIGZvciB0aGUgdHJhbnNhY3Rpb25zLgorICAgICAgICAvLyBPbmx5IHRyYW5zYWN0aW9uIGlkIGlzIGtlcHQgZm9yIHRoZSB0cmFuc2FjdGlvbnMgaW4gc2hvcnQgZHVyYXRpb24uCisgICAgICAgIHN0ZDo6c2V0PFRyYW5zYWN0aW9uSWQ+IG1Db21wbGV0ZWRUcmFuc2FjdGlvbnM7CisgICAgICAgIC8vIEN1cnJlbnRseSBhY3RpdmUocGVuZGluZykgdHJhbnNhdGlvbnMnIHN0YXR1cyAmIGluZm9ybWF0aW9uLgorICAgICAgICBzdGQ6Om1hcDxUcmFuc2FjdGlvbklkLCBzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNhY3Rpb25TdGF0dXM+PgorICAgICAgICAgICAgICAgIG1UcmFuc2FjdGlvbnM7CisKKyAgICAgICAgc3RkOjptYXA8QnVmZmVySWQsIHN0ZDo6dW5pcXVlX3B0cjxJbnRlcm5hbEJ1ZmZlcj4+IG1CdWZmZXJzOworICAgICAgICBzdGQ6OnNldDxCdWZmZXJJZD4gbUZyZWVCdWZmZXJzOworCisgICAgICAgIHN0cnVjdCBJbnZhbGlkYXRpb24geworICAgICAgICAgICAgc3RhdGljIHN0ZDo6YXRvbWljPHN0ZDo6dWludDMyX3Q+IHNJbnZTZXFJZDsKKworICAgICAgICAgICAgc3RydWN0IFBlbmRpbmcgeworICAgICAgICAgICAgICAgIGJvb2wgbU5lZWRzQWNrOworICAgICAgICAgICAgICAgIHVpbnQzMl90IG1Gcm9tOworICAgICAgICAgICAgICAgIHVpbnQzMl90IG1UbzsKKyAgICAgICAgICAgICAgICBzaXplX3QgbUxlZnQ7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gbUltcGw7CisgICAgICAgICAgICAgICAgUGVuZGluZyhib29sIG5lZWRzQWNrLCB1aW50MzJfdCBmcm9tLCB1aW50MzJfdCB0bywgc2l6ZV90IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzb3I6OkltcGw+ICZpbXBsKQorICAgICAgICAgICAgICAgICAgICAgICAgOiBtTmVlZHNBY2sobmVlZHNBY2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtRnJvbShmcm9tKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvKHRvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUxlZnQobGVmdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbXBsKGltcGwpCisgICAgICAgICAgICAgICAge30KKworICAgICAgICAgICAgICAgIGJvb2wgaXNJbnZhbGlkYXRlZCh1aW50MzJfdCBidWZmZXJJZCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNCdWZmZXJJblJhbmdlKG1Gcm9tLCBtVG8sIGJ1ZmZlcklkKSAmJiAtLW1MZWZ0ID09IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc3RkOjpsaXN0PFBlbmRpbmc+IG1QZW5kaW5nczsKKyAgICAgICAgICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgdWludDMyX3Q+IG1BY2tzOworICAgICAgICAgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBjb25zdCBzcDxJT2JzZXJ2ZXI+PiBtT2JzZXJ2ZXJzOworICAgICAgICAgICAgdWludDMyX3QgbUludmFsaWRhdGlvbklkOworICAgICAgICAgICAgdWludDMyX3QgbUlkOworCisgICAgICAgICAgICBJbnZhbGlkYXRpb24oKSA6IG1JbnZhbGlkYXRpb25JZCgwKSwgbUlkKHNJbnZTZXFJZC5mZXRjaF9hZGQoMSkpIHt9CisKKyAgICAgICAgICAgIHZvaWQgb25Db25uZWN0KENvbm5lY3Rpb25JZCBjb25JZCwgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIpOworCisgICAgICAgICAgICB2b2lkIG9uQ2xvc2UoQ29ubmVjdGlvbklkIGNvbklkKTsKKworICAgICAgICAgICAgdm9pZCBvbkFjayhDb25uZWN0aW9uSWQgY29uSWQsIHVpbnQzMl90IG1zZ0lkKTsKKworICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlckludmFsaWRhdGVkKAorICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgQnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbCAmY2hhbm5lbCk7CisKKyAgICAgICAgICAgIHZvaWQgb25JbnZhbGlkYXRpb25SZXF1ZXN0KAorICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRzQWNrLCB1aW50MzJfdCBmcm9tLCB1aW50MzJfdCB0bywgc2l6ZV90IGxlZnQsCisgICAgICAgICAgICAgICAgICAgIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWwgJmNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gJmltcGwpOworCisgICAgICAgICAgICB2b2lkIG9uSGFuZGxlQWNrKAorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIGNvbnN0IHNwPElPYnNlcnZlcj4+ICpvYnNlcnZlcnMsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICppbnZhbGlkYXRpb25JZCk7CisgICAgICAgIH0gbUludmFsaWRhdGlvbjsKKyAgICAgICAgLy8vIEJ1ZmZlciBwb29sIHN0YXRpc3RpY3Mgd2hpY2ggdHJhY2tzIGFsbG9jYXRpb24gYW5kIHRyYW5zZmVyIHN0YXRpc3RpY3MuCisgICAgICAgIHN0cnVjdCBTdGF0cyB7CisgICAgICAgICAgICAvLy8gVG90YWwgc2l6ZSBvZiBhbGxvY2F0aW9ucyB3aGljaCBhcmUgdXNlZCBvciBhdmFpbGFibGUgdG8gdXNlLgorICAgICAgICAgICAgLy8vIChieXRlcyBvciBwaXhlbHMpCisgICAgICAgICAgICBzaXplX3QgbVNpemVDYWNoZWQ7CisgICAgICAgICAgICAvLy8gIyBvZiBjYWNoZWQgYnVmZmVycyB3aGljaCBhcmUgdXNlZCBvciBhdmFpbGFibGUgdG8gdXNlLgorICAgICAgICAgICAgc2l6ZV90IG1CdWZmZXJzQ2FjaGVkOworICAgICAgICAgICAgLy8vIFRvdGFsIHNpemUgb2YgYWxsb2NhdGlvbnMgd2hpY2ggYXJlIGN1cnJlbnRseSB1c2VkLiAoYnl0ZXMgb3IgcGl4ZWxzKQorICAgICAgICAgICAgc2l6ZV90IG1TaXplSW5Vc2U7CisgICAgICAgICAgICAvLy8gIyBvZiBjdXJyZW50bHkgdXNlZCBidWZmZXJzCisgICAgICAgICAgICBzaXplX3QgbUJ1ZmZlcnNJblVzZTsKKworICAgICAgICAgICAgLy8vICMgb2YgYWxsb2NhdGlvbnMgY2FsbGVkIG9uIGJ1ZmZlcnBvb2wuICgjIG9mIGZldGNoZWQgZnJvbSBCbG9ja1Bvb2wpCisgICAgICAgICAgICBzaXplX3QgbVRvdGFsQWxsb2NhdGlvbnM7CisgICAgICAgICAgICAvLy8gIyBvZiBhbGxvY2F0aW9ucyB0aGF0IHdlcmUgc2VydmVkIGZyb20gdGhlIGNhY2hlLgorICAgICAgICAgICAgLy8vICgjIG9mIGFsbG9jYXRvciBhbGxvYyBwcmV2ZW50ZWQpCisgICAgICAgICAgICBzaXplX3QgbVRvdGFsUmVjeWNsZXM7CisgICAgICAgICAgICAvLy8gIyBvZiBidWZmZXIgdHJhbnNmZXJzIGluaXRpYXRlZC4KKyAgICAgICAgICAgIHNpemVfdCBtVG90YWxUcmFuc2ZlcnM7CisgICAgICAgICAgICAvLy8gIyBvZiB0cmFuc2ZlcnMgdGhhdCBoYWQgdG8gYmUgZmV0Y2hlZC4KKyAgICAgICAgICAgIHNpemVfdCBtVG90YWxGZXRjaGVzOworCisgICAgICAgICAgICBTdGF0cygpCisgICAgICAgICAgICAgICAgOiBtU2l6ZUNhY2hlZCgwKSwgbUJ1ZmZlcnNDYWNoZWQoMCksIG1TaXplSW5Vc2UoMCksIG1CdWZmZXJzSW5Vc2UoMCksCisgICAgICAgICAgICAgICAgICBtVG90YWxBbGxvY2F0aW9ucygwKSwgbVRvdGFsUmVjeWNsZXMoMCksIG1Ub3RhbFRyYW5zZmVycygwKSwgbVRvdGFsRmV0Y2hlcygwKSB7fQorCisgICAgICAgICAgICAvLy8gQSBuZXcgYnVmZmVyIGlzIGFsbG9jYXRlZCBvbiBhbiBhbGxvY2F0aW9uIHJlcXVlc3QuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyQWxsb2NhdGVkKHNpemVfdCBhbGxvY1NpemUpIHsKKyAgICAgICAgICAgICAgICBtU2l6ZUNhY2hlZCArPSBhbGxvY1NpemU7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNDYWNoZWQrKzsKKworICAgICAgICAgICAgICAgIG1TaXplSW5Vc2UgKz0gYWxsb2NTaXplOworICAgICAgICAgICAgICAgIG1CdWZmZXJzSW5Vc2UrKzsKKworICAgICAgICAgICAgICAgIG1Ub3RhbEFsbG9jYXRpb25zKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciBpcyBldmljdGVkIGFuZCBkZXN0cm95ZWQuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyRXZpY3RlZChzaXplX3QgYWxsb2NTaXplKSB7CisgICAgICAgICAgICAgICAgbVNpemVDYWNoZWQgLT0gYWxsb2NTaXplOworICAgICAgICAgICAgICAgIG1CdWZmZXJzQ2FjaGVkLS07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciBpcyByZWN5Y2xlZCBvbiBhbiBhbGxvY2F0aW9uIHJlcXVlc3QuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyUmVjeWNsZWQoc2l6ZV90IGFsbG9jU2l6ZSkgeworICAgICAgICAgICAgICAgIG1TaXplSW5Vc2UgKz0gYWxsb2NTaXplOworICAgICAgICAgICAgICAgIG1CdWZmZXJzSW5Vc2UrKzsKKworICAgICAgICAgICAgICAgIG1Ub3RhbEFsbG9jYXRpb25zKys7CisgICAgICAgICAgICAgICAgbVRvdGFsUmVjeWNsZXMrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIEEgYnVmZmVyIGlzIGF2YWlsYWJsZSB0byBiZSByZWN5Y2xlZC4KKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJVbnVzZWQoc2l6ZV90IGFsbG9jU2l6ZSkgeworICAgICAgICAgICAgICAgIG1TaXplSW5Vc2UgLT0gYWxsb2NTaXplOworICAgICAgICAgICAgICAgIG1CdWZmZXJzSW5Vc2UtLTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIEEgYnVmZmVyIHRyYW5zZmVyIGlzIGluaXRpYXRlZC4KKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJTZW50KCkgeworICAgICAgICAgICAgICAgIG1Ub3RhbFRyYW5zZmVycysrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgZmV0Y2ggaXMgaW52b2tlZCBieSBhIGJ1ZmZlciB0cmFuc2Zlci4KKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJGZXRjaGVkKCkgeworICAgICAgICAgICAgICAgIG1Ub3RhbEZldGNoZXMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBtU3RhdHM7CisKKyAgICAgICAgYm9vbCBpc1ZhbGlkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1WYWxpZDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgaW52YWxpZGF0ZShib29sIG5lZWRzQWNrLCBCdWZmZXJJZCBmcm9tLCBCdWZmZXJJZCB0bywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gJmltcGwpOworCisgICAgICAgIHN0YXRpYyB2b2lkIGNyZWF0ZUludmFsaWRhdG9yKCk7CisKKyAgICBwdWJsaWM6CisgICAgICAgIC8qKiBDcmVhdGVzIGEgYnVmZmVyIHBvb2wuICovCisgICAgICAgIEJ1ZmZlclBvb2woKTsKKworICAgICAgICAvKiogRGVzdHJveXMgYSBidWZmZXIgcG9vbC4gKi8KKyAgICAgICAgfkJ1ZmZlclBvb2woKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUHJvY2Vzc2VzIGFsbCBwZW5kaW5nIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMsIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuCisgICAgICAgICAqIEVhY2ggc3RhdHVzIG1lc3NhZ2UgaXMgaGFuZGxlZCBieSBtZXRob2RzIHdpdGggJ2hhbmRsZScgcHJlZml4LgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBwcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIGJ1ZmZlciBiZWluZyBvd25lZCBieSBhIGNvbm5lY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiB0aGUgYnVmZmVyIG93bmluZyBjb25uZWN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICB0aGUgaWQgb2YgdGhlIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgYnVmZmVyIGlzIG93bmVkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVPd25CdWZmZXIoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgYnVmZmVyIGJlaW5nIHJlbGVhc2VkIGJ5IGEgY29ubmVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgdGhlIGlkIG9mIHRoZSBidWZmZXIgb3duaW5nIGNvbm5lY3Rpb24uCisgICAgICAgICAqIEBwYXJhbSBidWZmZXJJZCAgICAgIHRoZSBpZCBvZiB0aGUgYnVmZmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB3aGVuIHRoZSBidWZmZXIgb3duZXJzaGlwIGlzIHJlbGVhc2VkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVSZWxlYXNlQnVmZmVyKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHN0YXJ0IG1lc3NhZ2UgZnJvbSB0aGUgc2VuZGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZSAgIGEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIGZvciB0aGUgdHJhbnNhY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXN1bHQge0Bjb2RlIHRydWV9IHdoZW4gdHJhbnNmZXJfdG8gbWVzc2FnZSBpcyBhY2tub3dsZWRnZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZVRyYW5zZmVyVG8oY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiBiZWluZyBhY2tlZCBieSB0aGUgcmVjZWl2ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtZXNzYWdlICAgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJlc3VsdCB7QGNvZGUgdHJ1ZX0gd2hlbiB0cmFuc2Zlcl9mcm9tIG1lc3NhZ2UgaXMgYWNrbm93bGVkZ2VkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVUcmFuc2ZlckZyb20oY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiByZXN1bHQgbWVzc2FnZSBmcm9tIHRoZSByZWNlaXZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1lc3NhZ2UgICBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBmb3IgdGhlIHRyYW5zYWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmVzdWx0IHtAY29kZSB0cnVlfSB3aGVuIHRoZSBleGlzaXRuZyB0cmFuc2FjdGlvbiBpcyBmaW5pc2hlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlVHJhbnNmZXJSZXN1bHQoY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSBjb25uZWN0aW9uIGJlaW5nIGNsb3NlZCwgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4gQWxsIHRoZQorICAgICAgICAgKiBidWZmZXJzIGFuZCB0cmFuc2FjdGlvbnMgb3duZWQgYnkgdGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBjbGVhbmVkIHVwLgorICAgICAgICAgKiBUaGUgcmVsYXRlZCBGTVEgd2lsbCBiZSBjbGVhbmVkIHVwIHRvby4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgdGhlIGlkIG9mIHRoZSBjb25uZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmVzdWx0IHtAY29kZSB0cnVlfSB3aGVuIHRoZSBjb25uZWN0aW9uIGV4aXN0ZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZUNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZWN5Y2xlcyBhIGV4aXN0aW5nIGZyZWUgYnVmZmVyIGlmIGl0IGlzIHBvc3NpYmxlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYWxsb2NhdG9yIHRoZSBidWZmZXIgYWxsb2NhdG9yCisgICAgICAgICAqIEBwYXJhbSBwYXJhbXMgICAgdGhlIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgICAgICogQHBhcmFtIHBJZCAgICAgICB0aGUgaWQgb2YgdGhlIHJlY3ljbGVkIGJ1ZmZlci4KKyAgICAgICAgICogQHBhcmFtIGhhbmRsZSAgICB0aGUgbmF0aXZlIGhhbmRsZSBvZiB0aGUgcmVjeWNsZWQgYnVmZmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB3aGVuIGEgYnVmZmVyIGlzIHJlY3ljbGVkLCB7QGNvZGUgZmFsc2V9CisgICAgICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBnZXRGcmVlQnVmZmVyKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgQnVmZmVySWQgKnBJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyBhIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIgdG8gYnVmZmVycG9vbC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFsbG9jICAgICB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgICAgICogQHBhcmFtIGFsbG9jU2l6ZSB0aGUgc2l6ZSBvZiB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgICAgICogQHBhcmFtIHBhcmFtcyAgICB0aGUgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAgICAgKiBAcGFyYW0gcElkICAgICAgIHRoZSBidWZmZXIgaWQgZm9yIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAgICAgKiBAcGFyYW0gaGFuZGxlICAgIHRoZSBuYXRpdmUgaGFuZGxlIGZvciB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBPSyB3aGVuIGFuIGFsbG9jYXRpb24gaXMgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZC4KKyAgICAgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgUmVzdWx0U3RhdHVzIGFkZE5ld0J1ZmZlcigKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgYWxsb2NTaXplLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgQnVmZmVySWQgKnBJZCwKKyAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQcm9jZXNzZXMgcGVuZGluZyBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzIGFuZCBwZXJmb3JtcyBwZXJpb2RpYyBjYWNoZQorICAgICAgICAgKiBjbGVhbmluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNsZWFyQ2FjaGUgICAgaWYgY2xlYXJDYWNoZSBpcyB0cnVlLCBpdCBmcmVlcyBhbGwgYnVmZmVycworICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3YWl0aW5nIHRvIGJlIHJlY3ljbGVkLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSA9IGZhbHNlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUHJvY2Vzc2VzIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcyBhbmQgaW52YWxpZGF0ZSBhbGwgY3VycmVudAorICAgICAgICAgKiBmcmVlIGJ1ZmZlcnMuIEFjdGl2ZSBidWZmZXJzIGFyZSBpbnZhbGlkYXRlZCBhZnRlciBiZWluZyBpbmFjdGl2ZS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgZmx1c2goY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc29yOjpJbXBsPiAmaW1wbCk7CisKKyAgICAgICAgZnJpZW5kIGNsYXNzIEFjY2Vzc29yOjpJbXBsOworICAgIH0gbUJ1ZmZlclBvb2w7CisKKyAgICBzdHJ1Y3QgIEFjY2Vzc29ySW52YWxpZGF0b3IgeworICAgICAgICBzdGQ6Om1hcDx1aW50MzJfdCwgY29uc3Qgc3RkOjp3ZWFrX3B0cjxBY2Nlc3Nvcjo6SW1wbD4+IG1BY2Nlc3NvcnM7CisgICAgICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ3Y7CisgICAgICAgIGJvb2wgbVJlYWR5OworCisgICAgICAgIEFjY2Vzc29ySW52YWxpZGF0b3IoKTsKKyAgICAgICAgdm9pZCBhZGRBY2Nlc3Nvcih1aW50MzJfdCBhY2Nlc3NvcklkLCBjb25zdCBzdGQ6OndlYWtfcHRyPEFjY2Vzc29yOjpJbXBsPiAmaW1wbCk7CisgICAgICAgIHZvaWQgZGVsQWNjZXNzb3IodWludDMyX3QgYWNjZXNzb3JJZCk7CisgICAgfTsKKworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QWNjZXNzb3JJbnZhbGlkYXRvcj4gc0ludmFsaWRhdG9yOworCisgICAgc3RhdGljIHZvaWQgaW52YWxpZGF0b3JUaHJlYWQoCisgICAgICAgIHN0ZDo6bWFwPHVpbnQzMl90LCBjb25zdCBzdGQ6OndlYWtfcHRyPEFjY2Vzc29yOjpJbXBsPj4gJmFjY2Vzc29ycywKKyAgICAgICAgc3RkOjptdXRleCAmbXV0ZXgsCisgICAgICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlICZjdiwKKyAgICAgICAgYm9vbCAmcmVhZHkpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIHVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQUNDRVNTT1JJTVBMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FuZHJvaWQuYnAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNGUwNmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzAgQEAKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMCIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBzcmNzOiBbCisgICAgICAgICJBY2Nlc3Nvci5jcHAiLAorICAgICAgICAiQWNjZXNzb3JJbXBsLmNwcCIsCisgICAgICAgICJCdWZmZXJQb29sQ2xpZW50LmNwcCIsCisgICAgICAgICJCdWZmZXJTdGF0dXMuY3BwIiwKKyAgICAgICAgIkNsaWVudE1hbmFnZXIuY3BwIiwKKyAgICAgICAgIkNvbm5lY3Rpb24uY3BwIiwKKyAgICAgICAgIk9ic2VydmVyLmNwcCIsCisgICAgXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZm1xIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmh3YmluZGVyIiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgIF0sCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGliZm1xIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJQb29sQ2xpZW50LmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclBvb2xDbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MDdkZTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJQb29sQ2xpZW50LmNwcApAQCAtMCwwICsxLDg2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbENsaWVudCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlICJCdWZmZXJQb29sQ2xpZW50LmgiCisjaW5jbHVkZSAiQ29ubmVjdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3N0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrUmVjZWl2ZVRpbWVvdXRVcyA9IDEwMDAwMDA7IC8vIDEwMG1zCitzdGF0aWMgY29uc3RleHByIGludCBrUG9zdE1heFJldHJ5ID0gMzsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtDYWNoZVR0bFVzID0gMTAwMDAwMDsgLy8gVE9ETzogdHVuZQorCitjbGFzcyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsCisgICAgICAgIDogcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8QnVmZmVyUG9vbENsaWVudDo6SW1wbD4geworcHVibGljOgorICAgIGV4cGxpY2l0IEltcGwoY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvciwgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIpOworCisgICAgZXhwbGljaXQgSW1wbChjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3NvciwgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIpOworCisgICAgYm9vbCBpc1ZhbGlkKCkgeworICAgICAgICByZXR1cm4gbVZhbGlkOworICAgIH0KKworICAgIGJvb2wgaXNMb2NhbCgpIHsKKyAgICAgICAgcmV0dXJuIG1WYWxpZCAmJiBtTG9jYWw7CisgICAgfQorCisgICAgQ29ubmVjdGlvbklkIGdldENvbm5lY3Rpb25JZCgpIHsKKyAgICAgICAgcmV0dXJuIG1Db25uZWN0aW9uSWQ7CisgICAgfQorCisgICAgc3A8SUFjY2Vzc29yPiAmZ2V0QWNjZXNzb3IoKSB7CisgICAgICAgIHJldHVybiBtQWNjZXNzb3I7CisgICAgfQorCisgICAgYm9vbCBpc0FjdGl2ZShpbnQ2NF90ICpsYXN0VHJhbnNhY3Rpb25VcywgYm9vbCBjbGVhckNhY2hlKTsKKworICAgIHZvaWQgcmVjZWl2ZUludmFsaWRhdGlvbih1aW50MzJfdCBtc2dJRCk7CisKKyAgICBSZXN1bHRTdGF0dXMgZmx1c2goKTsKKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICBSZXN1bHRTdGF0dXMgcmVjZWl2ZSgKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgdm9pZCBwb3N0QnVmZmVyUmVsZWFzZShCdWZmZXJJZCBidWZmZXJJZCk7CisKKyAgICBib29sIHBvc3RTZW5kKAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIENvbm5lY3Rpb25JZCByZWNlaXZlciwKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsIGludDY0X3QgKnRpbWVzdGFtcFVzKTsKK3ByaXZhdGU6CisKKyAgICBib29sIHBvc3RSZWNlaXZlKAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMpOworCisgICAgYm9vbCBwb3N0UmVjZWl2ZVJlc3VsdCgKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIGJvb2wgcmVzdWx0LCBib29sICpuZWVkc1N5bmMpOworCisgICAgdm9pZCB0cnlTeW5jRnJvbVJlbW90ZSgpOworCisgICAgYm9vbCBzeW5jUmVsZWFzZWQodWludDMyX3QgbXNnSWQgPSAwKTsKKworICAgIHZvaWQgZXZpY3RDYWNoZXMoYm9vbCBjbGVhckNhY2hlID0gZmFsc2UpOworCisgICAgdm9pZCBpbnZhbGlkYXRlQnVmZmVyKEJ1ZmZlcklkIGlkKTsKKworICAgIHZvaWQgaW52YWxpZGF0ZVJhbmdlKEJ1ZmZlcklkIGZyb20sIEJ1ZmZlcklkIHRvKTsKKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZUJ1ZmZlckhhbmRsZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKKyAgICBSZXN1bHRTdGF0dXMgZmV0Y2hCdWZmZXJIYW5kbGUoCisgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKworICAgIHN0cnVjdCBCbG9ja1Bvb2xEYXRhRHRvcjsKKyAgICBzdHJ1Y3QgQ2xpZW50QnVmZmVyOworCisgICAgYm9vbCBtTG9jYWw7CisgICAgYm9vbCBtVmFsaWQ7CisgICAgc3A8SUFjY2Vzc29yPiBtQWNjZXNzb3I7CisgICAgc3A8Q29ubmVjdGlvbj4gbUxvY2FsQ29ubmVjdGlvbjsKKyAgICBzcDxJQ29ubmVjdGlvbj4gbVJlbW90ZUNvbm5lY3Rpb247CisgICAgdWludDMyX3QgbVNlcUlkOworICAgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworICAgIGludDY0X3QgbUxhc3RFdmljdENhY2hlVXM7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlckludmFsaWRhdGlvbkxpc3RlbmVyPiBtSW52YWxpZGF0aW9uTGlzdGVuZXI7CisKKyAgICAvLyBDYWNoZWRCdWZmZXJzCisgICAgc3RydWN0IEJ1ZmZlckNhY2hlIHsKKyAgICAgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICAgICAgYm9vbCBtQ3JlYXRpbmc7CisgICAgICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1DcmVhdGVDdjsKKyAgICAgICAgc3RkOjptYXA8QnVmZmVySWQsIHN0ZDo6dW5pcXVlX3B0cjxDbGllbnRCdWZmZXI+PiBtQnVmZmVyczsKKyAgICAgICAgaW50IG1BY3RpdmU7CisgICAgICAgIGludDY0X3QgbUxhc3RDaGFuZ2VVczsKKworICAgICAgICBCdWZmZXJDYWNoZSgpIDogbUNyZWF0aW5nKGZhbHNlKSwgbUFjdGl2ZSgwKSwgbUxhc3RDaGFuZ2VVcyhnZXRUaW1lc3RhbXBOb3coKSkge30KKworICAgICAgICB2b2lkIGluY0FjdGl2ZV9sKCkgeworICAgICAgICAgICAgKyttQWN0aXZlOworICAgICAgICAgICAgbUxhc3RDaGFuZ2VVcyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBkZWNBY3RpdmVfbCgpIHsKKyAgICAgICAgICAgIC0tbUFjdGl2ZTsKKyAgICAgICAgICAgIG1MYXN0Q2hhbmdlVXMgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgfQorICAgIH0gbUNhY2hlOworCisgICAgLy8gRk1RIC0gcmVsZWFzZSBub3RpZmllcgorICAgIHN0cnVjdCBSZWxlYXNlQ2FjaGUgeworICAgICAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgICAgICAvLyBUT0RPOiB1c2Ugb25seSBvbmUgbGlzdD8odXNpbmcgb25lIGxpc3QgbWF5IGRlYWx5IHNlbmRpbmcgbWVzc2FnZXM/KQorICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+IG1SZWxlYXNpbmdJZHM7CisgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gbVJlbGVhc2VkSWRzOworICAgICAgICB1aW50MzJfdCBtSW52YWxpZGF0ZUlkOyAvLyBUT0RPOiBpbnZhbGlkYXRpb24gQUNLIHRvIGJ1ZmZlcnBvb2wKKyAgICAgICAgYm9vbCBtSW52YWxpZGF0ZUFjazsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c0NoYW5uZWw+IG1TdGF0dXNDaGFubmVsOworCisgICAgICAgIFJlbGVhc2VDYWNoZSgpIDogbUludmFsaWRhdGVJZCgwKSwgbUludmFsaWRhdGVBY2sodHJ1ZSkge30KKyAgICB9IG1SZWxlYXNpbmc7CisKKyAgICAvLyBUaGlzIGxvY2sgaXMgaGVsZCBkdXJpbmcgc3luY2hyb25pemF0aW9uIGZyb20gcmVtb3RlIHNpZGUuCisgICAgLy8gSW4gb3JkZXIgdG8gbWluaW1pemUgcmVtb3RlIGNhbGxzIGFuZCBsb2NraW5nIGR1cnRhaW9uLCB0aGlzIGxvY2sgaXMgaGVsZAorICAgIC8vIGJ5IGJlc3QgZWZmb3J0IGFwcHJvYWNoIHVzaW5nIHRyeV9sb2NrKCkuCisgICAgc3RkOjptdXRleCBtUmVtb3RlU3luY0xvY2s7Cit9OworCitzdHJ1Y3QgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6QmxvY2tQb29sRGF0YUR0b3IgeworICAgIEJsb2NrUG9vbERhdGFEdG9yKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50OjpJbXBsPiAmaW1wbCkKKyAgICAgICAgICAgIDogbUltcGwoaW1wbCkge30KKworICAgIHZvaWQgb3BlcmF0b3IoKShCdWZmZXJQb29sRGF0YSAqYnVmZmVyKSB7CisgICAgICAgIEJ1ZmZlcklkIGlkID0gYnVmZmVyLT5tSWQ7CisgICAgICAgIGRlbGV0ZSBidWZmZXI7CisKKyAgICAgICAgYXV0byBpbXBsID0gbUltcGwubG9jaygpOworICAgICAgICBpZiAoaW1wbCAmJiBpbXBsLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIGltcGwtPnBvc3RCdWZmZXJSZWxlYXNlKGlkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjb25zdCBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw+IG1JbXBsOworfTsKKworc3RydWN0IEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OkNsaWVudEJ1ZmZlciB7Citwcml2YXRlOgorICAgIGludDY0X3QgbUV4cGlyZVVzOworICAgIGJvb2wgbUhhc0NhY2hlOworICAgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworICAgIEJ1ZmZlcklkIG1JZDsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKm1IYW5kbGU7CisgICAgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sRGF0YT4gbUNhY2hlOworCisgICAgdm9pZCB1cGRhdGVFeHBpcmUoKSB7CisgICAgICAgIG1FeHBpcmVVcyA9IGdldFRpbWVzdGFtcE5vdygpICsga0NhY2hlVHRsVXM7CisgICAgfQorCitwdWJsaWM6CisgICAgQ2xpZW50QnVmZmVyKAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQnVmZmVySWQgaWQsIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKQorICAgICAgICAgICAgOiBtSGFzQ2FjaGUoZmFsc2UpLCBtQ29ubmVjdGlvbklkKGNvbm5lY3Rpb25JZCksCisgICAgICAgICAgICAgIG1JZChpZCksIG1IYW5kbGUoaGFuZGxlKSB7CisgICAgICAgIG1FeHBpcmVVcyA9IGdldFRpbWVzdGFtcE5vdygpICsga0NhY2hlVHRsVXM7CisgICAgfQorCisgICAgfkNsaWVudEJ1ZmZlcigpIHsKKyAgICAgICAgaWYgKG1IYW5kbGUpIHsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UobUhhbmRsZSk7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShtSGFuZGxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEJ1ZmZlcklkIGlkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUlkOworICAgIH0KKworICAgIGJvb2wgZXhwaXJlKCkgY29uc3QgeworICAgICAgICBpbnQ2NF90IG5vdyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgICAgICByZXR1cm4gbm93ID49IG1FeHBpcmVVczsKKyAgICB9CisKKyAgICBib29sIGhhc0NhY2hlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUhhc0NhY2hlOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gZmV0Y2hDYWNoZShuYXRpdmVfaGFuZGxlX3QgKipwSGFuZGxlKSB7CisgICAgICAgIGlmIChtSGFzQ2FjaGUpIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gY2FjaGUgPSBtQ2FjaGUubG9jaygpOworICAgICAgICAgICAgaWYgKGNhY2hlKSB7CisgICAgICAgICAgICAgICAgKnBIYW5kbGUgPSBtSGFuZGxlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNhY2hlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gY3JlYXRlQ2FjaGUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudDo6SW1wbD4gJmltcGwsCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipwSGFuZGxlKSB7CisgICAgICAgIGlmICghbUhhc0NhY2hlKSB7CisgICAgICAgICAgICAvLyBBbGxvY2F0ZXMgYSByYXcgcHRyIGluIG9yZGVyIHRvIGF2b2lkIHNlbmRpbmcgI3Bvc3RCdWZmZXJSZWxlYXNlCisgICAgICAgICAgICAvLyBmcm9tIGRlbGV0ZXIsIGluIGNhc2Ugb2YgbmF0aXZlX2hhbmRsZV9jbG9uZSBmYWlsdXJlLgorICAgICAgICAgICAgQnVmZmVyUG9vbERhdGEgKnB0ciA9IG5ldyBCdWZmZXJQb29sRGF0YShtQ29ubmVjdGlvbklkLCBtSWQpOworICAgICAgICAgICAgaWYgKHB0cikgeworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gY2FjaGUocHRyLCBCbG9ja1Bvb2xEYXRhRHRvcihpbXBsKSk7CisgICAgICAgICAgICAgICAgaWYgKGNhY2hlKSB7CisgICAgICAgICAgICAgICAgICAgIG1DYWNoZSA9IGNhY2hlOworICAgICAgICAgICAgICAgICAgICBtSGFzQ2FjaGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAqcEhhbmRsZSA9IG1IYW5kbGU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocHRyKSB7CisgICAgICAgICAgICAgICAgZGVsZXRlIHB0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBib29sIG9uQ2FjaGVSZWxlYXNlKCkgeworICAgICAgICBpZiAobUhhc0NhY2hlKSB7CisgICAgICAgICAgICAvLyBUT0RPOiB2ZXJpZnkgbUNhY2hlIGlzIG5vdCB2YWxpZDsKKyAgICAgICAgICAgIHVwZGF0ZUV4cGlyZSgpOworICAgICAgICAgICAgbUhhc0NhY2hlID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfTsKKworQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6SW1wbChjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlcikKKyAgICA6IG1Mb2NhbCh0cnVlKSwgbVZhbGlkKGZhbHNlKSwgbUFjY2Vzc29yKGFjY2Vzc29yKSwgbVNlcUlkKDApLAorICAgICAgbUxhc3RFdmljdENhY2hlVXMoZ2V0VGltZXN0YW1wTm93KCkpIHsKKyAgICBjb25zdCBTdGF0dXNEZXNjcmlwdG9yICpzdGF0dXNEZXNjOworICAgIGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3IgKmludkRlc2M7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IGFjY2Vzc29yLT5jb25uZWN0KAorICAgICAgICAgICAgb2JzZXJ2ZXIsIHRydWUsCisgICAgICAgICAgICAmbUxvY2FsQ29ubmVjdGlvbiwgJm1Db25uZWN0aW9uSWQsICZtUmVsZWFzaW5nLm1JbnZhbGlkYXRlSWQsCisgICAgICAgICAgICAmc3RhdHVzRGVzYywgJmludkRlc2MpOworICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsID0KKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlclN0YXR1c0NoYW5uZWw+KCpzdGF0dXNEZXNjKTsKKyAgICAgICAgbUludmFsaWRhdGlvbkxpc3RlbmVyID0KKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlckludmFsaWRhdGlvbkxpc3RlbmVyPigqaW52RGVzYyk7CisgICAgICAgIG1WYWxpZCA9IG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwgJiYKKyAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5pc1ZhbGlkKCkgJiYKKyAgICAgICAgICAgICAgICBtSW52YWxpZGF0aW9uTGlzdGVuZXIgJiYKKyAgICAgICAgICAgICAgICBtSW52YWxpZGF0aW9uTGlzdGVuZXItPmlzVmFsaWQoKTsKKyAgICB9Cit9CisKK0J1ZmZlclBvb2xDbGllbnQ6OkltcGw6OkltcGwoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IsIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyKQorICAgIDogbUxvY2FsKGZhbHNlKSwgbVZhbGlkKGZhbHNlKSwgbUFjY2Vzc29yKGFjY2Vzc29yKSwgbVNlcUlkKDApLAorICAgICAgbUxhc3RFdmljdENhY2hlVXMoZ2V0VGltZXN0YW1wTm93KCkpIHsKKyAgICBib29sIHZhbGlkID0gZmFsc2U7CisgICAgc3A8SUNvbm5lY3Rpb24+JiBvdXRDb25uZWN0aW9uID0gbVJlbW90ZUNvbm5lY3Rpb247CisgICAgQ29ubmVjdGlvbklkJiBpZCA9IG1Db25uZWN0aW9uSWQ7CisgICAgdWludDMyX3QmIG91dE1zZ0lkID0gbVJlbGVhc2luZy5tSW52YWxpZGF0ZUlkOworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNDaGFubmVsPiYgb3V0Q2hhbm5lbCA9CisgICAgICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsOworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lcj4mIG91dE9ic2VydmVyID0KKyAgICAgICAgICAgIG1JbnZhbGlkYXRpb25MaXN0ZW5lcjsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPSBhY2Nlc3Nvci0+Y29ubmVjdCgKKyAgICAgICAgICAgIG9ic2VydmVyLAorICAgICAgICAgICAgWyZ2YWxpZCwgJm91dENvbm5lY3Rpb24sICZpZCwgJm91dE1zZ0lkLCAmb3V0Q2hhbm5lbCwgJm91dE9ic2VydmVyXQorICAgICAgICAgICAgKFJlc3VsdFN0YXR1cyBzdGF0dXMsIHNwPElDb25uZWN0aW9uPiBjb25uZWN0aW9uLAorICAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIHVpbnQzMl90IG1zZ0lkLAorICAgICAgICAgICAgIGNvbnN0IFN0YXR1c0Rlc2NyaXB0b3ImIHN0YXR1c0Rlc2MsCisgICAgICAgICAgICAgY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvciYgaW52RGVzYykgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBvdXRDb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgaWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICAgICAgICAgIG91dE1zZ0lkID0gbXNnSWQ7CisgICAgICAgICAgICAgICAgICAgIG91dENoYW5uZWwgPSBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlclN0YXR1c0NoYW5uZWw+KHN0YXR1c0Rlc2MpOworICAgICAgICAgICAgICAgICAgICBvdXRPYnNlcnZlciA9IHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVySW52YWxpZGF0aW9uTGlzdGVuZXI+KGludkRlc2MpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0Q2hhbm5lbCAmJiBvdXRDaGFubmVsLT5pc1ZhbGlkKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dE9ic2VydmVyICYmIG91dE9ic2VydmVyLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIG1WYWxpZCA9IHRyYW5zUmVzdWx0LmlzT2soKSAmJiB2YWxpZDsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjppc0FjdGl2ZShpbnQ2NF90ICpsYXN0VHJhbnNhY3Rpb25VcywgYm9vbCBjbGVhckNhY2hlKSB7CisgICAgYm9vbCBhY3RpdmUgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTG9jayk7CisgICAgICAgIHN5bmNSZWxlYXNlZCgpOworICAgICAgICBldmljdENhY2hlcyhjbGVhckNhY2hlKTsKKyAgICAgICAgKmxhc3RUcmFuc2FjdGlvblVzID0gbUNhY2hlLm1MYXN0Q2hhbmdlVXM7CisgICAgICAgIGFjdGl2ZSA9IG1DYWNoZS5tQWN0aXZlID4gMDsKKyAgICB9CisgICAgaWYgKG1WYWxpZCAmJiBtTG9jYWwgJiYgbUxvY2FsQ29ubmVjdGlvbikgeworICAgICAgICBtTG9jYWxDb25uZWN0aW9uLT5jbGVhblVwKGNsZWFyQ2FjaGUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGFjdGl2ZTsKK30KKwordm9pZCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpyZWNlaXZlSW52YWxpZGF0aW9uKHVpbnQzMl90IG1lc3NhZ2VJZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTG9jayk7CisgICAgc3luY1JlbGVhc2VkKG1lc3NhZ2VJZCk7CisgICAgLy8gVE9ETzogZXZpY3QgY2FjaGUgcmVxdWlyZWQ/Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpmbHVzaCgpIHsKKyAgICBpZiAoIW1Mb2NhbCB8fCAhbUxvY2FsQ29ubmVjdGlvbiB8fCAhbVZhbGlkKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubUxvY2spOworICAgICAgICBzeW5jUmVsZWFzZWQoKTsKKyAgICAgICAgZXZpY3RDYWNoZXMoKTsKKyAgICAgICAgcmV0dXJuIG1Mb2NhbENvbm5lY3Rpb24tPmZsdXNoKCk7CisgICAgfQorfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6YWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKnBIYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmICghbUxvY2FsIHx8ICFtTG9jYWxDb25uZWN0aW9uIHx8ICFtVmFsaWQpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIEJ1ZmZlcklkIGJ1ZmZlcklkOworICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gbnVsbHB0cjsKKyAgICBidWZmZXItPnJlc2V0KCk7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IGFsbG9jYXRlQnVmZmVySGFuZGxlKHBhcmFtcywgJmJ1ZmZlcklkLCAmaGFuZGxlKTsKKyAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgaWYgKGhhbmRsZSkgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTG9jayk7CisgICAgICAgICAgICBzeW5jUmVsZWFzZWQoKTsKKyAgICAgICAgICAgIGV2aWN0Q2FjaGVzKCk7CisgICAgICAgICAgICBhdXRvIGNhY2hlSXQgPSBtQ2FjaGUubUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgICAgICBpZiAoY2FjaGVJdCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiB2ZXJpZnkgaXQgaXMgcmVjeWNsZWQuIChub3QgaGF2aW5nIGFjdGl2ZSByZWYpCisgICAgICAgICAgICAgICAgbUNhY2hlLm1CdWZmZXJzLmVyYXNlKGNhY2hlSXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV0byBjbGllbnRCdWZmZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENsaWVudEJ1ZmZlcj4oCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgICAgICAgICAgaWYgKGNsaWVudEJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gbUNhY2hlLm1CdWZmZXJzLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcklkLCBzdGQ6Om1vdmUoY2xpZW50QnVmZmVyKSkpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc2Vjb25kKSB7CisgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSByZXN1bHQuZmlyc3QtPnNlY29uZC0+Y3JlYXRlQ2FjaGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX2Zyb21fdGhpcygpLCBwSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYWNoZS5pbmNBY3RpdmVfbCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghKmJ1ZmZlcikgeworICAgICAgICAgICAgQUxPR1YoImNsaWVudCBjYWNoZSBjcmVhdGlvbiBmYWlsdXJlICVkOiAlbGxkIiwKKyAgICAgICAgICAgICAgICAgIGhhbmRsZSAhPSBudWxscHRyLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQpOworICAgICAgICAgICAgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgICAgICAgICBwb3N0QnVmZmVyUmVsZWFzZShidWZmZXJJZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnJlY2VpdmUoCisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKnBIYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmICghbVZhbGlkKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBpZiAodGltZXN0YW1wVXMgIT0gMCkgeworICAgICAgICB0aW1lc3RhbXBVcyArPSBrUmVjZWl2ZVRpbWVvdXRVczsKKyAgICB9CisgICAgaWYgKCFwb3N0UmVjZWl2ZShidWZmZXJJZCwgdHJhbnNhY3Rpb25JZCwgdGltZXN0YW1wVXMpKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICBidWZmZXItPnJlc2V0KCk7CisgICAgd2hpbGUoMSkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1Mb2NrKTsKKyAgICAgICAgc3luY1JlbGVhc2VkKCk7CisgICAgICAgIGV2aWN0Q2FjaGVzKCk7CisgICAgICAgIGF1dG8gY2FjaGVJdCA9IG1DYWNoZS5tQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgaWYgKGNhY2hlSXQgIT0gbUNhY2hlLm1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICBpZiAoY2FjaGVJdC0+c2Vjb25kLT5oYXNDYWNoZSgpKSB7CisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGNhY2hlSXQtPnNlY29uZC0+ZmV0Y2hDYWNoZShwSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBpZiAoISpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdHJhbnNmZXIgdGltZV9vdXQKKyAgICAgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6eWllbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgcmVjZWl2ZSBmcm9tIHJlZmVyZW5jZSAlbGxkIiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGNhY2hlSXQtPnNlY29uZC0+Y3JlYXRlQ2FjaGUoc2hhcmVkX2Zyb21fdGhpcygpLCBwSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBpZiAoKmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICBtQ2FjaGUuaW5jQWN0aXZlX2woKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoImNsaWVudCByZWNlaXZlIGZyb20gY2FjaGUgJWxsZCIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIW1DYWNoZS5tQ3JlYXRpbmcpIHsKKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNyZWF0aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBmZXRjaEJ1ZmZlckhhbmRsZSh0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgJmhhbmRsZSk7CisgICAgICAgICAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gY2xpZW50QnVmZmVyID0gc3RkOjptYWtlX3VuaXF1ZTxDbGllbnRCdWZmZXI+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGllbnRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IG1DYWNoZS5tQnVmZmVycy5pbnNlcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihidWZmZXJJZCwgc3RkOjptb3ZlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRCdWZmZXIpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zZWNvbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IHJlc3VsdC5maXJzdC0+c2Vjb25kLT5jcmVhdGVDYWNoZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfZnJvbV90aGlzKCksIHBIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhY2hlLmluY0FjdGl2ZV9sKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCEqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNyZWF0aW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNyZWF0ZUN2Lm5vdGlmeV9hbGwoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DYWNoZS5tQ3JlYXRlQ3Yud2FpdChsb2NrKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIG5lZWRzU3luYyA9IGZhbHNlOworICAgIGJvb2wgcG9zdGVkID0gcG9zdFJlY2VpdmVSZXN1bHQoYnVmZmVySWQsIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPyB0cnVlIDogZmFsc2UsICZuZWVkc1N5bmMpOworICAgIEFMT0dWKCJjbGllbnQgcmVjZWl2ZSAlbGxkIC0gJXUgOiAlcyAoJWQpIiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCBidWZmZXJJZCwKKyAgICAgICAgICAqYnVmZmVyID8gIm9rIiA6ICJmYWlsIiwgcG9zdGVkKTsKKyAgICBpZiAobVZhbGlkICYmIG1Mb2NhbCAmJiBtTG9jYWxDb25uZWN0aW9uKSB7CisgICAgICAgIG1Mb2NhbENvbm5lY3Rpb24tPmNsZWFuVXAoZmFsc2UpOworICAgIH0KKyAgICBpZiAobmVlZHNTeW5jICYmIG1SZW1vdGVDb25uZWN0aW9uKSB7CisgICAgICAgIHRyeVN5bmNGcm9tUmVtb3RlKCk7CisgICAgfQorICAgIGlmICgqYnVmZmVyKSB7CisgICAgICAgIGlmICghcG9zdGVkKSB7CisgICAgICAgICAgICBidWZmZXItPnJlc2V0KCk7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCit2b2lkIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnBvc3RCdWZmZXJSZWxlYXNlKEJ1ZmZlcklkIGJ1ZmZlcklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLnB1c2hfYmFjayhidWZmZXJJZCk7CisgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclJlbGVhc2UoCisgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKK30KKworLy8gVE9ETzogcmV2aXNlIGFkLWhvYyBwb3N0aW5nIGRhdGEgc3RydWN0dXJlCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnBvc3RTZW5kKAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgQ29ubmVjdGlvbklkIHJlY2VpdmVyLAorICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLCBpbnQ2NF90ICp0aW1lc3RhbXBVcykgeworICAgIHsKKyAgICAgICAgLy8gVE9ETzogZG9uJ3QgbmVlZCB0byBjYWxsIHN5bmNSZWxlYXNlZCBldmVyeSB0aW1lCisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTG9jayk7CisgICAgICAgIHN5bmNSZWxlYXNlZCgpOworICAgIH0KKyAgICBib29sIHJldCA9IGZhbHNlOworICAgIGJvb2wgbmVlZHNTeW5jID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAgICAgKnRpbWVzdGFtcFVzID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgICp0cmFuc2FjdGlvbklkID0gKG1Db25uZWN0aW9uSWQgPDwgMzIpIHwgbVNlcUlkKys7CisgICAgICAgIC8vIFRPRE86IHJldHJ5LCBhZGQgdGltZW91dCwgdGFyZ2V0PworICAgICAgICByZXQgPSAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgICAgICAgICAgKnRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX1RPLCBtQ29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgIHJlY2VpdmVyLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKKyAgICAgICAgbmVlZHNTeW5jID0gIW1Mb2NhbCAmJiBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5uZWVkc1N5bmMoKTsKKyAgICB9CisgICAgaWYgKG1WYWxpZCAmJiBtTG9jYWwgJiYgbUxvY2FsQ29ubmVjdGlvbikgeworICAgICAgICBtTG9jYWxDb25uZWN0aW9uLT5jbGVhblVwKGZhbHNlKTsKKyAgICB9CisgICAgaWYgKG5lZWRzU3luYyAmJiBtUmVtb3RlQ29ubmVjdGlvbikgeworICAgICAgICB0cnlTeW5jRnJvbVJlbW90ZSgpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnBvc3RSZWNlaXZlKAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrUG9zdE1heFJldHJ5OyArK2kpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgICAgICBpbnQ2NF90IG5vdyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgICAgICBpZiAodGltZXN0YW1wVXMgPT0gMCB8fCBub3cgPCB0aW1lc3RhbXBVcykgeworICAgICAgICAgICAgYm9vbCByZXN1bHQgPSBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRlJPTSwKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgLTEsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywKKyAgICAgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgICAgICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnlpZWxkKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgLTEsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywKKyAgICAgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpwb3N0UmVjZWl2ZVJlc3VsdCgKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgYm9vbCByZXN1bHQsIGJvb2wgKm5lZWRzU3luYykgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgIC8vIFRPRE86IHJldHJ5LCBhZGQgdGltZW91dAorICAgIGJvb2wgcmV0ID0gbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwKKyAgICAgICAgICAgIHJlc3VsdCA/IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfT0sgOiBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0VSUk9SLAorICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgLTEsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywKKyAgICAgICAgICAgIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKKyAgICAqbmVlZHNTeW5jID0gIW1Mb2NhbCAmJiBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5uZWVkc1N5bmMoKTsKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnRyeVN5bmNGcm9tUmVtb3RlKCkgeworICAgIGlmIChtUmVtb3RlU3luY0xvY2sudHJ5X2xvY2soKSkgeworICAgICAgICBib29sIG5lZWRzU3luYyA9IGZhbHNlOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAgICAgICAgIG5lZWRzU3luYyA9IG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPm5lZWRzU3luYygpOworICAgICAgICB9CisgICAgICAgIGlmIChuZWVkc1N5bmMpIHsKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCA9IChtQ29ubmVjdGlvbklkIDw8IDMyKTsKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkID0gQ29ubmVjdGlvbjo6U1lOQ19CVUZGRVJJRDsKKyAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1Jlc3VsdCA9IG1SZW1vdGVDb25uZWN0aW9uLT5mZXRjaCgKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgIFtdCisgICAgICAgICAgICAgICAgICAgIChSZXN1bHRTdGF0dXMgb3V0U3RhdHVzLCBCdWZmZXIgb3V0QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgb3V0U3RhdHVzOworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIG91dEJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgbVJlbW90ZVN5bmNMb2NrLnVubG9jaygpOworICAgIH0KK30KKworLy8gc2hvdWxkIGhhdmUgbUNhY2hlLm1Mb2NrCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnN5bmNSZWxlYXNlZCh1aW50MzJfdCBtZXNzYWdlSWQpIHsKKyAgICBib29sIGNsZWFyZWQgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgICAgICBpZiAobVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJSZWxlYXNlKAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsCisgICAgICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVJlbGVhc2luZy5tUmVsZWFzZWRJZHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChCdWZmZXJJZCYgaWQ6IG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImNsaWVudCByZWxlYXNlIGJ1ZmZlciAlbGxkIC0gJXUiLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsIGlkKTsKKyAgICAgICAgICAgICAgICBhdXRvIGZvdW5kID0gbUNhY2hlLm1CdWZmZXJzLmZpbmQoaWQpOworICAgICAgICAgICAgICAgIGlmIChmb3VuZCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kLT5zZWNvbmQtPm9uQ2FjaGVSZWxlYXNlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYWNoZS5kZWNBY3RpdmVfbCgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW4hCisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2xpZW50ICVsbGQgY2FjaGUgcmVsZWFzZSBzdGF0dXMgaW5jb25zaXRlbnQhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW4hCisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjbGllbnQgJWxsZCBjYWNoZSBzdGF0dXMgaW5jb25zaXRlbnQhIiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcy5jbGVhcigpOworICAgICAgICAgICAgY2xlYXJlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8QnVmZmVySW52YWxpZGF0aW9uTWVzc2FnZT4gaW52YWxpZGF0aW9uczsKKyAgICBtSW52YWxpZGF0aW9uTGlzdGVuZXItPmdldEludmFsaWRhdGlvbnMoaW52YWxpZGF0aW9ucyk7CisgICAgdWludDMyX3QgbGFzdE1zZ0lkID0gMDsKKyAgICBpZiAoaW52YWxpZGF0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgICAgIGZvciAoYXV0byBpdCA9IGludmFsaWRhdGlvbnMuYmVnaW4oKTsgaXQgIT0gaW52YWxpZGF0aW9ucy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgaWYgKGl0LT5tZXNzYWdlSWQgIT0gMCkgeworICAgICAgICAgICAgICAgIGxhc3RNc2dJZCA9IGl0LT5tZXNzYWdlSWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXQtPmZyb21CdWZmZXJJZCA9PSBpdC0+dG9CdWZmZXJJZCkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IGhhbmRsZSBmcm9tQnVmZmVySWQgPSBVSU5UMzJfTUFYCisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZUJ1ZmZlcihpdC0+ZnJvbUJ1ZmZlcklkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVJhbmdlKGl0LT5mcm9tQnVmZmVySWQsIGl0LT50b0J1ZmZlcklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgICAgICBpZiAobGFzdE1zZ0lkICE9IDApIHsKKyAgICAgICAgICAgIGlmIChpc01lc3NhZ2VMYXRlcihsYXN0TXNnSWQsIG1SZWxlYXNpbmcubUludmFsaWRhdGVJZCkpIHsKKyAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1JbnZhbGlkYXRlSWQgPSBsYXN0TXNnSWQ7CisgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tSW52YWxpZGF0ZUFjayA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2VJZCAhPSAwKSB7CisgICAgICAgICAgICAvLyBtZXNzYWdlcyBhcmUgZHJhaW5lZC4KKyAgICAgICAgICAgIGlmIChpc01lc3NhZ2VMYXRlcihtZXNzYWdlSWQsIG1SZWxlYXNpbmcubUludmFsaWRhdGVJZCkpIHsKKyAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1JbnZhbGlkYXRlSWQgPSBtZXNzYWdlSWQ7CisgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tSW52YWxpZGF0ZUFjayA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtUmVsZWFzaW5nLm1JbnZhbGlkYXRlQWNrKSB7CisgICAgICAgICAgICAvLyBwb3N0IEFDSworICAgICAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlckludmFsaWRhdGVBY2soCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubUludmFsaWRhdGVJZCwgJm1SZWxlYXNpbmcubUludmFsaWRhdGVBY2spOworICAgICAgICAgICAgQUxPR1YoImNsaWVudCAlbGxkIGludmFsaWRhdGVpb24gYWNrICglZCkgJXUiLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1JbnZhbGlkYXRlQWNrLCBtUmVsZWFzaW5nLm1JbnZhbGlkYXRlSWQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjbGVhcmVkOworfQorCisvLyBzaG91bGQgaGF2ZSBtQ2FjaGUubUxvY2sKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6ZXZpY3RDYWNoZXMoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICBpZiAobm93ID49IG1MYXN0RXZpY3RDYWNoZVVzICsga0NhY2hlVHRsVXMgfHwgY2xlYXJDYWNoZSkgeworICAgICAgICBzaXplX3QgZXZpY3RlZCA9IDA7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1DYWNoZS5tQnVmZmVycy5iZWdpbigpOyBpdCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCk7KSB7CisgICAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPmhhc0NhY2hlKCkgJiYgKGl0LT5zZWNvbmQtPmV4cGlyZSgpIHx8IGNsZWFyQ2FjaGUpKSB7CisgICAgICAgICAgICAgICAgaXQgPSBtQ2FjaGUubUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgICsrZXZpY3RlZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVigiY2FjaGUgY291bnQgJWxsZCA6IHRvdGFsICV6dSwgYWN0aXZlICVkLCBldmljdGVkICV6dSIsCisgICAgICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgbUNhY2hlLm1CdWZmZXJzLnNpemUoKSwgbUNhY2hlLm1BY3RpdmUsIGV2aWN0ZWQpOworICAgICAgICBtTGFzdEV2aWN0Q2FjaGVVcyA9IG5vdzsKKyAgICB9Cit9CisKKy8vIHNob3VsZCBoYXZlIG1DYWNoZS5tTG9jawordm9pZCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjppbnZhbGlkYXRlQnVmZmVyKEJ1ZmZlcklkIGlkKSB7CisgICAgZm9yIChhdXRvIGl0ID0gbUNhY2hlLm1CdWZmZXJzLmJlZ2luKCk7IGl0ICE9IG1DYWNoZS5tQnVmZmVycy5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoaWQgPT0gaXQtPnNlY29uZC0+aWQoKSkgeworICAgICAgICAgICAgaWYgKCFpdC0+c2Vjb25kLT5oYXNDYWNoZSgpKSB7CisgICAgICAgICAgICAgICAgbUNhY2hlLm1CdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICBBTE9HVigiY2FjaGUgaW52YWxpZGF0ZWQgJWxsZCA6IGJ1ZmZlciAldSIsCisgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCBpZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJJbmNvbnNpdGVudCBpbnZhbGlkYXRpb24gJWxsZCA6IGFjdGl2ZXIgYnVmZmVyISEgJXUiLAorICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgKHVuc2lnbmVkIGludClpZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gc2hvdWxkIGhhdmUgbUNhY2hlLm1Mb2NrCit2b2lkIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmludmFsaWRhdGVSYW5nZShCdWZmZXJJZCBmcm9tLCBCdWZmZXJJZCB0bykgeworICAgIHNpemVfdCBpbnZhbGlkYXRlZCA9IDA7CisgICAgZm9yIChhdXRvIGl0ID0gbUNhY2hlLm1CdWZmZXJzLmJlZ2luKCk7IGl0ICE9IG1DYWNoZS5tQnVmZmVycy5lbmQoKTspIHsKKyAgICAgICAgaWYgKCFpdC0+c2Vjb25kLT5oYXNDYWNoZSgpKSB7CisgICAgICAgICAgICBCdWZmZXJJZCBiaWQgPSBpdC0+c2Vjb25kLT5pZCgpOworICAgICAgICAgICAgaWYgKGZyb20gPCB0bykgeworICAgICAgICAgICAgICAgIGlmIChmcm9tIDw9IGJpZCAmJiBiaWQgPCB0bykgeworICAgICAgICAgICAgICAgICAgICArK2ludmFsaWRhdGVkOworICAgICAgICAgICAgICAgICAgICBpdCA9IG1DYWNoZS5tQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGZyb20gPD0gYmlkIHx8IGJpZCA8IHRvKSB7CisgICAgICAgICAgICAgICAgICAgICsraW52YWxpZGF0ZWQ7CisgICAgICAgICAgICAgICAgICAgIGl0ID0gbUNhY2hlLm1CdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICsraXQ7CisgICAgfQorICAgIEFMT0dWKCJjYWNoZSBpbnZhbGlkYXRlZCAlbGxkIDogIyBvZiBpbnZhbGlkYXRlZCAlenUiLAorICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgaW52YWxpZGF0ZWQpOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6YWxsb2NhdGVCdWZmZXJIYW5kbGUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgaWYgKG1Mb2NhbENvbm5lY3Rpb24pIHsKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiBhbGxvY0hhbmRsZSA9IG51bGxwdHI7CisgICAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtTG9jYWxDb25uZWN0aW9uLT5hbGxvY2F0ZSgKKyAgICAgICAgICAgICAgICBwYXJhbXMsIGJ1ZmZlcklkLCAmYWxsb2NIYW5kbGUpOworICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICpoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2Nsb25lKGFsbG9jSGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiY2xpZW50IGFsbG9jYXRlIHJlc3VsdCAlbGxkICVkIDogJXUgY2xvbmUgJXAiLAorICAgICAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsIHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LLAorICAgICAgICAgICAgICAqaGFuZGxlID8gKmJ1ZmZlcklkIDogMCAsICpoYW5kbGUpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmZldGNoQnVmZmVySGFuZGxlKAorICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpIHsKKyAgICBzcDxJQ29ubmVjdGlvbj4gY29ubmVjdGlvbjsKKyAgICBpZiAobUxvY2FsKSB7CisgICAgICAgIGNvbm5lY3Rpb24gPSBtTG9jYWxDb25uZWN0aW9uOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbm5lY3Rpb24gPSBtUmVtb3RlQ29ubmVjdGlvbjsKKyAgICB9CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPSBjb25uZWN0aW9uLT5mZXRjaCgKKyAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLAorICAgICAgICAgICAgWyZzdGF0dXMsICZoYW5kbGVdCisgICAgICAgICAgICAoUmVzdWx0U3RhdHVzIG91dFN0YXR1cywgQnVmZmVyIG91dEJ1ZmZlcikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IG91dFN0YXR1czsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKmhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY2xvbmUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLmJ1ZmZlci5nZXROYXRpdmVIYW5kbGUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHRyYW5zUmVzdWx0LmlzT2soKSA/IHN0YXR1cyA6IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKKworQnVmZmVyUG9vbENsaWVudDo6QnVmZmVyUG9vbENsaWVudChjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlcikgeworICAgIG1JbXBsID0gc3RkOjptYWtlX3NoYXJlZDxJbXBsPihhY2Nlc3Nvciwgb2JzZXJ2ZXIpOworfQorCitCdWZmZXJQb29sQ2xpZW50OjpCdWZmZXJQb29sQ2xpZW50KGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlcikgeworICAgIG1JbXBsID0gc3RkOjptYWtlX3NoYXJlZDxJbXBsPihhY2Nlc3Nvciwgb2JzZXJ2ZXIpOworfQorCitCdWZmZXJQb29sQ2xpZW50Ojp+QnVmZmVyUG9vbENsaWVudCgpIHsKKyAgICAvLyBUT0RPOiBob3cgdG8gaGFuZGxlIG9ycGhhbmVkIGJ1ZmZlcnM/Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gbUltcGwgJiYgbUltcGwtPmlzVmFsaWQoKTsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50Ojppc0xvY2FsKCkgeworICAgIHJldHVybiBtSW1wbCAmJiBtSW1wbC0+aXNMb2NhbCgpOworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OmlzQWN0aXZlKGludDY0X3QgKmxhc3RUcmFuc2FjdGlvblVzLCBib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpZiAoIWlzVmFsaWQoKSkgeworICAgICAgICAqbGFzdFRyYW5zYWN0aW9uVXMgPSAwOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBtSW1wbC0+aXNBY3RpdmUobGFzdFRyYW5zYWN0aW9uVXMsIGNsZWFyQ2FjaGUpOworfQorCitDb25uZWN0aW9uSWQgQnVmZmVyUG9vbENsaWVudDo6Z2V0Q29ubmVjdGlvbklkKCkgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5nZXRDb25uZWN0aW9uSWQoKTsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6Z2V0QWNjZXNzb3Ioc3A8SUFjY2Vzc29yPiAqYWNjZXNzb3IpIHsKKyAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgICphY2Nlc3NvciA9IG1JbXBsLT5nZXRBY2Nlc3NvcigpOworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6cmVjZWl2ZUludmFsaWRhdGlvbih1aW50MzJfdCBtc2dJZCkgeworICAgIEFMT0dWKCJidWZmZXJwb29sMiBjbGllbnQgcmVjdiBpbnYgJXUiLCBtc2dJZCk7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICBtSW1wbC0+cmVjZWl2ZUludmFsaWRhdGlvbihtc2dJZCk7CisgICAgfQorfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6Zmx1c2goKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gbUltcGwtPmZsdXNoKCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6YWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gbUltcGwtPmFsbG9jYXRlKHBhcmFtcywgaGFuZGxlLCBidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OnJlY2VpdmUoCisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gbUltcGwtPnJlY2VpdmUodHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIHRpbWVzdGFtcFVzLCBoYW5kbGUsIGJ1ZmZlcik7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6cG9zdFNlbmQoCisgICAgICAgIENvbm5lY3Rpb25JZCByZWNlaXZlcklkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsCisgICAgICAgIGludDY0X3QgKnRpbWVzdGFtcFVzKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICBib29sIHJlc3VsdCA9IG1JbXBsLT5wb3N0U2VuZCgKKyAgICAgICAgICAgICAgICBidWZmZXItPm1JZCwgcmVjZWl2ZXJJZCwgdHJhbnNhY3Rpb25JZCwgdGltZXN0YW1wVXMpOworICAgICAgICByZXR1cm4gcmVzdWx0ID8gUmVzdWx0U3RhdHVzOjpPSyA6IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJQb29sQ2xpZW50LmggYi9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJQb29sQ2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThkOWFlNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclBvb2xDbGllbnQuaApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQlVGRkVSUE9PTENMSUVOVF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0JVRkZFUlBPT0xDTElFTlRfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSUFjY2Vzc29yLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSU9ic2VydmVyLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgIkFjY2Vzc29yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklBY2Nlc3NvcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQ29ubmVjdGlvbjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJT2JzZXJ2ZXI7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworLyoqCisgKiBBIGJ1ZmZlciBwb29sIGNsaWVudCBmb3IgYSBidWZmZXIgcG9vbC4gRm9yIGEgc3BlY2lmaWMgYnVmZmVyIHBvb2wsIGF0IG1vc3QKKyAqIG9uZSBidWZmZXIgcG9vbCBjbGllbnQgZXhpc3RzIHBlciBwcm9jZXNzLiBUaGlzIGNsYXNzIHdpbGwgbm90IGJlIGV4cG9zZWQKKyAqIG91dHNpZGUuIEEgYnVmZmVyIHBvb2wgY2xpZW50IHdpbGwgYmUgdXNlZCB2aWEgQ2xpZW50TWFuYWdlci4KKyAqLworY2xhc3MgQnVmZmVyUG9vbENsaWVudCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBwb29sIGNsaWVudCBmcm9tIGEgbG9jYWwgYnVmZmVyIHBvb2wKKyAgICAgKiAodmlhIENsaWVudE1hbmFnZXIjY3JlYXRlKS4KKyAgICAgKi8KKyAgICBleHBsaWNpdCBCdWZmZXJQb29sQ2xpZW50KGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlcik7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgYnVmZmVyIHBvb2wgY2xpZW50IGZyb20gYSByZW1vdGUgYnVmZmVyIHBvb2wKKyAgICAgKiAodmlhIENsaWVudE1hbmFnZXIjcmVnaXN0ZXJTZW5kZXIpLgorICAgICAqIE5vdGU6IEEgYnVmZmVyIHBvb2wgY2xpZW50IGNyZWF0ZWQgd2l0aCByZW1vdGUgYnVmZmVyIHBvb2wgY2Fubm90CisgICAgICogYWxsb2NhdGUgYSBidWZmZXIuCisgICAgICovCisgICAgZXhwbGljaXQgQnVmZmVyUG9vbENsaWVudChjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyKTsKKworICAgIC8qKiBEZXN0cnVjdHMgYSBidWZmZXIgcG9vbCBjbGllbnQuICovCisgICAgfkJ1ZmZlclBvb2xDbGllbnQoKTsKKworcHJpdmF0ZToKKyAgICBib29sIGlzVmFsaWQoKTsKKworICAgIGJvb2wgaXNMb2NhbCgpOworCisgICAgYm9vbCBpc0FjdGl2ZShpbnQ2NF90ICpsYXN0VHJhbnNhY3Rpb25VcywgYm9vbCBjbGVhckNhY2hlKTsKKworICAgIENvbm5lY3Rpb25JZCBnZXRDb25uZWN0aW9uSWQoKTsKKworICAgIFJlc3VsdFN0YXR1cyBnZXRBY2Nlc3NvcihzcDxJQWNjZXNzb3I+ICphY2Nlc3Nvcik7CisKKyAgICB2b2lkIHJlY2VpdmVJbnZhbGlkYXRpb24odWludDMyX3QgbXNnSWQpOworCisgICAgUmVzdWx0U3RhdHVzIGZsdXNoKCk7CisKKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgUmVzdWx0U3RhdHVzIHJlY2VpdmUoVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICBSZXN1bHRTdGF0dXMgcG9zdFNlbmQoQ29ubmVjdGlvbklkIHJlY2VpdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVzdGFtcFVzKTsKKworICAgIGNsYXNzIEltcGw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOworCisgICAgZnJpZW5kIHN0cnVjdCBDbGllbnRNYW5hZ2VyOworICAgIGZyaWVuZCBzdHJ1Y3QgT2JzZXJ2ZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQlVGRkVSUE9PTENMSUVOVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJTdGF0dXMuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyU3RhdHVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTM3MjYwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyU3RhdHVzLmNwcApAQCAtMCwwICsxLDMwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbFN0YXR1cyIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSAiQnVmZmVyU3RhdHVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworaW50NjRfdCBnZXRUaW1lc3RhbXBOb3coKSB7CisgICAgaW50NjRfdCBzdGFtcDsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7CisgICAgLy8gVE9ETzogQ0xPQ0tfTU9OT1RPTklDX0NPQVJTRT8KKyAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnRzKTsKKyAgICBzdGFtcCA9IHRzLnR2X25zZWMgLyAxMDAwOworICAgIHN0YW1wICs9ICh0cy50dl9zZWMgKiAxMDAwMDAwTEwpOworICAgIHJldHVybiBzdGFtcDsKK30KKworYm9vbCBpc01lc3NhZ2VMYXRlcih1aW50MzJfdCBjdXJNc2dJZCwgdWludDMyX3QgcHJldk1zZ0lkKSB7CisgICAgcmV0dXJuIGN1ck1zZ0lkICE9IHByZXZNc2dJZCAmJiBjdXJNc2dJZCAtIHByZXZNc2dJZCA8IHByZXZNc2dJZCAtIGN1ck1zZ0lkOworfQorCitib29sIGlzQnVmZmVySW5SYW5nZShCdWZmZXJJZCBmcm9tLCBCdWZmZXJJZCB0bywgQnVmZmVySWQgYnVmZmVySWQpIHsKKyAgICBpZiAoZnJvbSA8IHRvKSB7CisgICAgICAgIHJldHVybiBmcm9tIDw9IGJ1ZmZlcklkICYmIGJ1ZmZlcklkIDwgdG87CisgICAgfSBlbHNlIHsgLy8gd3JhcCBoYXBwZW5zCisgICAgICAgIHJldHVybiBmcm9tIDw9IGJ1ZmZlcklkIHx8IGJ1ZmZlcklkIDwgdG87CisgICAgfQorfQorCitzdGF0aWMgY29uc3RleHByIGludCBrTnVtRWxlbWVudHNJblF1ZXVlID0gMTAyNCoxNjsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtNaW5FbGVtZW50c1RvU3luY0luUXVldWUgPSAxMjg7CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJTdGF0dXNPYnNlcnZlcjo6b3BlbigKKyAgICAgICAgQ29ubmVjdGlvbklkIGlkLCBjb25zdCBTdGF0dXNEZXNjcmlwdG9yKiogZm1xRGVzY1B0cikgeworICAgIGlmIChtQnVmZmVyU3RhdHVzUXVldWVzLmZpbmQoaWQpICE9IG1CdWZmZXJTdGF0dXNRdWV1ZXMuZW5kKCkpIHsKKyAgICAgICAgLy8gVE9ETzogaWQgY29sbGlzaW9uIGxvZz8KKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNRdWV1ZT4gcXVldWUgPQorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJTdGF0dXNRdWV1ZT4oa051bUVsZW1lbnRzSW5RdWV1ZSk7CisgICAgaWYgKCFxdWV1ZSB8fCBxdWV1ZS0+aXNWYWxpZCgpID09IGZhbHNlKSB7CisgICAgICAgICpmbXFEZXNjUHRyID0gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgIH0gZWxzZSB7CisgICAgICAgICpmbXFEZXNjUHRyID0gcXVldWUtPmdldERlc2MoKTsKKyAgICB9CisgICAgYXV0byByZXN1bHQgPSBtQnVmZmVyU3RhdHVzUXVldWVzLmluc2VydCgKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKGlkLCBzdGQ6Om1vdmUocXVldWUpKSk7CisgICAgaWYgKCFyZXN1bHQuc2Vjb25kKSB7CisgICAgICAgICpmbXFEZXNjUHRyID0gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclN0YXR1c09ic2VydmVyOjpjbG9zZShDb25uZWN0aW9uSWQgaWQpIHsKKyAgICBpZiAobUJ1ZmZlclN0YXR1c1F1ZXVlcy5maW5kKGlkKSA9PSBtQnVmZmVyU3RhdHVzUXVldWVzLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBtQnVmZmVyU3RhdHVzUXVldWVzLmVyYXNlKGlkKTsKKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKK30KKwordm9pZCBCdWZmZXJTdGF0dXNPYnNlcnZlcjo6Z2V0QnVmZmVyU3RhdHVzQ2hhbmdlcyhzdGQ6OnZlY3RvcjxCdWZmZXJTdGF0dXNNZXNzYWdlPiAmbWVzc2FnZXMpIHsKKyAgICBmb3IgKGF1dG8gaXQgPSBtQnVmZmVyU3RhdHVzUXVldWVzLmJlZ2luKCk7IGl0ICE9IG1CdWZmZXJTdGF0dXNRdWV1ZXMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgQnVmZmVyU3RhdHVzTWVzc2FnZSBtZXNzYWdlOworICAgICAgICBzaXplX3QgYXZhaWwgPSBpdC0+c2Vjb25kLT5hdmFpbGFibGVUb1JlYWQoKTsKKyAgICAgICAgd2hpbGUgKGF2YWlsID4gMCkgeworICAgICAgICAgICAgaWYgKCFpdC0+c2Vjb25kLT5yZWFkKCZtZXNzYWdlLCAxKSkgeworICAgICAgICAgICAgICAgIC8vIFNpbmNlIGF2YWxpYWJsZSAjIG9mIHJlYWRzIGFyZSBhbHJlYWR5IGNvbmZpcm1lZCwKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nIChzcHVyaW91cyBjbGllbnQ/KQorICAgICAgICAgICAgICAgIEFMT0dXKCJGTVEgbWVzc2FnZSBjYW5ub3QgYmUgcmVhZCBmcm9tICVsbGQiLCAobG9uZyBsb25nKWl0LT5maXJzdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVzc2FnZS5jb25uZWN0aW9uSWQgPSBpdC0+Zmlyc3Q7CisgICAgICAgICAgICBtZXNzYWdlcy5wdXNoX2JhY2sobWVzc2FnZSk7CisgICAgICAgICAgICAtLWF2YWlsOworICAgICAgICB9CisgICAgfQorfQorCitCdWZmZXJTdGF0dXNDaGFubmVsOjpCdWZmZXJTdGF0dXNDaGFubmVsKAorICAgICAgICBjb25zdCBTdGF0dXNEZXNjcmlwdG9yICZmbXFEZXNjKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c1F1ZXVlPiBxdWV1ZSA9CisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlclN0YXR1c1F1ZXVlPihmbXFEZXNjKTsKKyAgICBpZiAoIXF1ZXVlIHx8IHF1ZXVlLT5pc1ZhbGlkKCkgPT0gZmFsc2UpIHsKKyAgICAgICAgbVZhbGlkID0gZmFsc2U7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbVZhbGlkICA9IHRydWU7CisgICAgbUJ1ZmZlclN0YXR1c1F1ZXVlID0gc3RkOjptb3ZlKHF1ZXVlKTsKK30KKworYm9vbCBCdWZmZXJTdGF0dXNDaGFubmVsOjppc1ZhbGlkKCkgeworICAgIHJldHVybiBtVmFsaWQ7Cit9CisKK2Jvb2wgQnVmZmVyU3RhdHVzQ2hhbm5lbDo6bmVlZHNTeW5jKCkgeworICAgIGlmIChtVmFsaWQpIHsKKyAgICAgICAgc2l6ZV90IGF2YWlsID0gbUJ1ZmZlclN0YXR1c1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCk7CisgICAgICAgIHJldHVybiBhdmFpbCArIGtNaW5FbGVtZW50c1RvU3luY0luUXVldWUgPCBrTnVtRWxlbWVudHNJblF1ZXVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQnVmZmVyU3RhdHVzQ2hhbm5lbDo6cG9zdEJ1ZmZlclJlbGVhc2UoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBlbmRpbmcsIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBvc3RlZCkgeworICAgIGlmIChtVmFsaWQgJiYgcGVuZGluZy5zaXplKCkgPiAwKSB7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IG1CdWZmZXJTdGF0dXNRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpOworICAgICAgICBhdmFpbCA9IHN0ZDo6bWluKGF2YWlsLCBwZW5kaW5nLnNpemUoKSk7CisgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UgbWVzc2FnZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDAgOyBpIDwgYXZhaWw7ICsraSkgeworICAgICAgICAgICAgQnVmZmVySWQgaWQgPSBwZW5kaW5nLmZyb250KCk7CisgICAgICAgICAgICBtZXNzYWdlLm5ld1N0YXR1cyA9IEJ1ZmZlclN0YXR1czo6Tk9UX1VTRUQ7CisgICAgICAgICAgICBtZXNzYWdlLmJ1ZmZlcklkID0gaWQ7CisgICAgICAgICAgICBtZXNzYWdlLmNvbm5lY3Rpb25JZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgIGlmICghbUJ1ZmZlclN0YXR1c1F1ZXVlLT53cml0ZSgmbWVzc2FnZSwgMSkpIHsKKyAgICAgICAgICAgICAgICAvLyBTaW5jZSBhdmFsaWFibGUgIyBvZiB3cml0ZXMgYXJlIGFscmVhZHkgY29uZmlybWVkLAorICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCisgICAgICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGluZz8KKyAgICAgICAgICAgICAgICBBTE9HVygiRk1RIG1lc3NhZ2UgY2Fubm90IGJlIHNlbnQgZnJvbSAlbGxkIiwgKGxvbmcgbG9uZyljb25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBlbmRpbmcucG9wX2Zyb250KCk7CisgICAgICAgICAgICBwb3N0ZWQucHVzaF9iYWNrKGlkKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBCdWZmZXJTdGF0dXNDaGFubmVsOjpwb3N0QnVmZmVySW52YWxpZGF0ZUFjaygKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgdWludDMyX3QgaW52YWxpZGF0ZUlkLAorICAgICAgICBib29sICppbnZhbGlkYXRlZCkgeworICAgIGlmIChtVmFsaWQgJiYgISppbnZhbGlkYXRlZCkgeworICAgICAgICBzaXplX3QgYXZhaWwgPSBtQnVmZmVyU3RhdHVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKTsKKyAgICAgICAgaWYgKGF2YWlsID4gMCkgeworICAgICAgICAgICAgQnVmZmVyU3RhdHVzTWVzc2FnZSBtZXNzYWdlOworICAgICAgICAgICAgbWVzc2FnZS5uZXdTdGF0dXMgPSBCdWZmZXJTdGF0dXM6OklOVkFMSURBVElPTl9BQ0s7CisgICAgICAgICAgICBtZXNzYWdlLmJ1ZmZlcklkID0gaW52YWxpZGF0ZUlkOworICAgICAgICAgICAgbWVzc2FnZS5jb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBpZiAoIW1CdWZmZXJTdGF0dXNRdWV1ZS0+d3JpdGUoJm1lc3NhZ2UsIDEpKSB7CisgICAgICAgICAgICAgICAgLy8gU2luY2UgYXZhbGlhYmxlICMgb2Ygd3JpdGVzIGFyZSBhbHJlYWR5IGNvbmZpcm1lZCwKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRpbmc/CisgICAgICAgICAgICAgICAgQUxPR1coIkZNUSBtZXNzYWdlIGNhbm5vdCBiZSBzZW50IGZyb20gJWxsZCIsIChsb25nIGxvbmcpY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqaW52YWxpZGF0ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfQorCitib29sIEJ1ZmZlclN0YXR1c0NoYW5uZWw6OnBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICBCdWZmZXJTdGF0dXMgc3RhdHVzLCBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBDb25uZWN0aW9uSWQgdGFyZ2V0SWQsCisgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBlbmRpbmcsIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBvc3RlZCkgeworICAgIGlmIChtVmFsaWQpIHsKKyAgICAgICAgc2l6ZV90IGF2YWlsID0gbUJ1ZmZlclN0YXR1c1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCk7CisgICAgICAgIHNpemVfdCBudW1QZW5kaW5nID0gcGVuZGluZy5zaXplKCk7CisgICAgICAgIGlmIChhdmFpbCA+PSBudW1QZW5kaW5nICsgMSkgeworICAgICAgICAgICAgQnVmZmVyU3RhdHVzTWVzc2FnZSByZWxlYXNlLCBtZXNzYWdlOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1QZW5kaW5nOyArK2kpIHsKKyAgICAgICAgICAgICAgICBCdWZmZXJJZCBpZCA9IHBlbmRpbmcuZnJvbnQoKTsKKyAgICAgICAgICAgICAgICByZWxlYXNlLm5ld1N0YXR1cyA9IEJ1ZmZlclN0YXR1czo6Tk9UX1VTRUQ7CisgICAgICAgICAgICAgICAgcmVsZWFzZS5idWZmZXJJZCA9IGlkOworICAgICAgICAgICAgICAgIHJlbGVhc2UuY29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICAgICAgICAgICAgICAgIGlmICghbUJ1ZmZlclN0YXR1c1F1ZXVlLT53cml0ZSgmcmVsZWFzZSwgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgYXZhbGlhYmxlICMgb2Ygd3JpdGVzIGFyZSBhbHJlYWR5IGNvbmZpcm1lZCwKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmc/CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJGTVEgbWVzc2FnZSBjYW5ub3QgYmUgc2VudCBmcm9tICVsbGQiLCAobG9uZyBsb25nKWNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGVuZGluZy5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgICAgICBwb3N0ZWQucHVzaF9iYWNrKGlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCA9IHRyYW5zYWN0aW9uSWQ7CisgICAgICAgICAgICBtZXNzYWdlLmJ1ZmZlcklkID0gYnVmZmVySWQ7CisgICAgICAgICAgICBtZXNzYWdlLm5ld1N0YXR1cyA9IHN0YXR1czsKKyAgICAgICAgICAgIG1lc3NhZ2UuY29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICAgICAgICAgICAgbWVzc2FnZS50YXJnZXRDb25uZWN0aW9uSWQgPSB0YXJnZXRJZDsKKyAgICAgICAgICAgIC8vIFRPRE8gOiB0aW1lc2F0YW1wCisgICAgICAgICAgICBtZXNzYWdlLnRpbWVzdGFtcFVzID0gMDsKKyAgICAgICAgICAgIGlmICghbUJ1ZmZlclN0YXR1c1F1ZXVlLT53cml0ZSgmbWVzc2FnZSwgMSkpIHsKKyAgICAgICAgICAgICAgICAvLyBTaW5jZSBhdmFsaWFibGUgIyBvZiB3cml0ZXMgYXJlIGFscmVhZHkgY29uZmlybWVkLAorICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCisgICAgICAgICAgICAgICAgQUxPR1coIkZNUSBtZXNzYWdlIGNhbm5vdCBiZSBzZW50IGZyb20gJWxsZCIsIChsb25nIGxvbmcpY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK0J1ZmZlckludmFsaWRhdGlvbkxpc3RlbmVyOjpCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lcigKKyAgICAgICAgY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvciAmZm1xRGVzYykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJJbnZhbGlkYXRpb25RdWV1ZT4gcXVldWUgPQorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJJbnZhbGlkYXRpb25RdWV1ZT4oZm1xRGVzYyk7CisgICAgaWYgKCFxdWV1ZSB8fCBxdWV1ZS0+aXNWYWxpZCgpID09IGZhbHNlKSB7CisgICAgICAgIG1WYWxpZCA9IGZhbHNlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1WYWxpZCAgPSB0cnVlOworICAgIG1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZSA9IHN0ZDo6bW92ZShxdWV1ZSk7CisgICAgLy8gZHJhaW4gcHJldmlvdXMgbWVzc2FnZXMKKyAgICBzaXplX3QgYXZhaWwgPSBzdGQ6Om1pbigKKyAgICAgICAgICAgIG1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZS0+YXZhaWxhYmxlVG9SZWFkKCksIChzaXplX3QpIGtOdW1FbGVtZW50c0luUXVldWUpOworICAgIHN0ZDo6dmVjdG9yPEJ1ZmZlckludmFsaWRhdGlvbk1lc3NhZ2U+IHRlbXAoYXZhaWwpOworICAgIGlmIChhdmFpbCA+IDApIHsKKyAgICAgICAgbUJ1ZmZlckludmFsaWRhdGlvblF1ZXVlLT5yZWFkKHRlbXAuZGF0YSgpLCBhdmFpbCk7CisgICAgfQorfQorCit2b2lkIEJ1ZmZlckludmFsaWRhdGlvbkxpc3RlbmVyOjpnZXRJbnZhbGlkYXRpb25zKAorICAgICAgICBzdGQ6OnZlY3RvcjxCdWZmZXJJbnZhbGlkYXRpb25NZXNzYWdlPiAmbWVzc2FnZXMpIHsKKyAgICAvLyBUcnkgdHdpY2UgaW4gY2FzZSBvZiBvdmVyZmxvdy4KKyAgICAvLyBUT0RPOiBoYW5kbGluZyBvdmVyZmxvdyB0aG91Z2ggaXQgbWF5IG5vdCBoYXBwZW4uCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICAgICAgc2l6ZV90IGF2YWlsID0gc3RkOjptaW4oCisgICAgICAgICAgICAgICAgbUJ1ZmZlckludmFsaWRhdGlvblF1ZXVlLT5hdmFpbGFibGVUb1JlYWQoKSwgKHNpemVfdCkga051bUVsZW1lbnRzSW5RdWV1ZSk7CisgICAgICAgIGlmIChhdmFpbCA+IDApIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEJ1ZmZlckludmFsaWRhdGlvbk1lc3NhZ2U+IHRlbXAoYXZhaWwpOworICAgICAgICAgICAgaWYgKG1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZS0+cmVhZCh0ZW1wLmRhdGEoKSwgYXZhaWwpKSB7CisgICAgICAgICAgICAgICAgbWVzc2FnZXMucmVzZXJ2ZShtZXNzYWdlcy5zaXplKCkgKyBhdmFpbCk7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gdGVtcC5iZWdpbigpOyBpdCAhPSB0ZW1wLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2hfYmFjaygqaXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lcjo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gbVZhbGlkOworfQorCitCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsOjpCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsKCkKKyAgICA6IG1WYWxpZCh0cnVlKSwKKyAgICAgIG1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZSgKKyAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJJbnZhbGlkYXRpb25RdWV1ZT4oa051bUVsZW1lbnRzSW5RdWV1ZSwgdHJ1ZSkpIHsKKyAgICBpZiAoIW1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZSB8fCBtQnVmZmVySW52YWxpZGF0aW9uUXVldWUtPmlzVmFsaWQoKSA9PSBmYWxzZSkgeworICAgICAgICBtVmFsaWQgPSBmYWxzZTsKKyAgICB9Cit9CisKK2Jvb2wgQnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbDo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gbVZhbGlkOworfQorCit2b2lkIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWw6OmdldERlc2MoY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvciAqKmZtcURlc2NQdHIpIHsKKyAgICBpZiAobVZhbGlkKSB7CisgICAgICAgICpmbXFEZXNjUHRyID0gbUJ1ZmZlckludmFsaWRhdGlvblF1ZXVlLT5nZXREZXNjKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmZtcURlc2NQdHIgPSBudWxscHRyOworICAgIH0KK30KKwordm9pZCBCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsOjpwb3N0SW52YWxpZGF0aW9uKAorICAgICAgICB1aW50MzJfdCBtc2dJZCwgQnVmZmVySWQgZnJvbUlkLCBCdWZmZXJJZCB0b0lkKSB7CisgICAgQnVmZmVySW52YWxpZGF0aW9uTWVzc2FnZSBtZXNzYWdlOworCisgICAgbWVzc2FnZS5tZXNzYWdlSWQgPSBtc2dJZDsKKyAgICBtZXNzYWdlLmZyb21CdWZmZXJJZCA9IGZyb21JZDsKKyAgICBtZXNzYWdlLnRvQnVmZmVySWQgPSB0b0lkOworICAgIC8vIFRPRE86IGhhbmRsZSBmYWlsdXJlIChpdCBkb2VzIG5vdCBoYXBwZW4gbm9ybWFsbHkuKQorICAgIG1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZS0+d3JpdGUoJm1lc3NhZ2UpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclN0YXR1cy5oIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyU3RhdHVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE2NTgzOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclN0YXR1cy5oCkBAIC0wLDAgKzEsMjMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9CVUZGRVJTVEFUVVNfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9CVUZGRVJTVEFUVVNfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGxpc3Q+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworLyoqIFJldHVybnMgbW9ub3RvbmljIHRpbWVzdGFtcCBpbiBVcyBzaW5jZSBmaXhlZCBwb2ludCBpbiB0aW1lLiAqLworaW50NjRfdCBnZXRUaW1lc3RhbXBOb3coKTsKKworYm9vbCBpc01lc3NhZ2VMYXRlcih1aW50MzJfdCBjdXJNc2dJZCwgdWludDMyX3QgcHJldk1zZ0lkKTsKKworYm9vbCBpc0J1ZmZlckluUmFuZ2UoQnVmZmVySWQgZnJvbSwgQnVmZmVySWQgdG8sIEJ1ZmZlcklkIGJ1ZmZlcklkKTsKKworLyoqCisgKiBBIGNvbGxlY3Rpb24gb2YgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIEZNUSBmb3IgYSBidWZmZXIgcG9vbC4gYnVmZmVyCisgKiBvd25lcnNoaXAvc3RhdHVzIGNoYW5nZSBtZXNzYWdlcyBhcmUgc2VudCB2aWEgdGhlIEZNUXMgZnJvbSB0aGUgY2xpZW50cy4KKyAqLworY2xhc3MgQnVmZmVyU3RhdHVzT2JzZXJ2ZXIgeworcHJpdmF0ZToKKyAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNRdWV1ZT4+CisgICAgICAgICAgICBtQnVmZmVyU3RhdHVzUXVldWVzOworCitwdWJsaWM6CisgICAgLyoqIENyZWF0ZXMgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgRk1RIGZvciB0aGUgc3BlY2lmaWVkCisgICAgICogY29ubmVjdGlvbihjbGllbnQpLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgY29ubmVjdGlvbiBJZCBvZiB0aGUgc3BlY2lmaWVkIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gZm1xRGVzY1B0ciAgICBkb3VibGUgcHRyIG9mIGNyZWF0ZWQgRk1RJ3MgZGVzY3JpcHRvci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgaWYgRk1RIGlzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBvcGVuKENvbm5lY3Rpb25JZCBpZCwgY29uc3QgU3RhdHVzRGVzY3JpcHRvcioqIGZtcURlc2NQdHIpOworCisgICAgLyoqIENsb3NlcyBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBGTVEgZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBjb25uZWN0aW9uKGNsaWVudCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBjb25uZWN0aW9uIElkIG9mIHRoZSBzcGVjaWZpZWQgY2xpZW50LgorICAgICAqCisgICAgICogQHJldHVybiBPSyBpZiB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gaXMgY2xvc2VkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgY2xvc2UoQ29ubmVjdGlvbklkIGlkKTsKKworICAgIC8qKiBSZXRyaWV2ZXMgYWxsIHBlbmRpbmcgRk1RIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMgZnJvbSBjbGllbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2VzICByZXRyaWV2ZWQgcGVuZGluZyBtZXNzYWdlcy4KKyAgICAgKi8KKyAgICB2b2lkIGdldEJ1ZmZlclN0YXR1c0NoYW5nZXMoc3RkOjp2ZWN0b3I8QnVmZmVyU3RhdHVzTWVzc2FnZT4gJm1lc3NhZ2VzKTsKK307CisKKy8qKgorICogQSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgRk1RIGZvciBhIGJ1ZmZlciBwb29sIGNsaWVudC4gQnVmZmVyIG93bmVyc2hpcC9zdGF0dXMKKyAqIGNoYW5nZSBtZXNzYWdlcyBhcmUgc2VudCB2aWEgdGhlIGZtcSB0byB0aGUgYnVmZmVyIHBvb2wuCisgKi8KK2NsYXNzIEJ1ZmZlclN0YXR1c0NoYW5uZWwgeworcHJpdmF0ZToKKyAgICBib29sIG1WYWxpZDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzUXVldWU+IG1CdWZmZXJTdGF0dXNRdWV1ZTsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbm5lY3RzIHRvIGEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIEZNUSBmcm9tIGEgZGVzY3JpcHRvciBvZgorICAgICAqIHRoZSBjcmVhdGVkIEZNUS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbXFEZXNjICAgRGVzY3JpcHRvciBvZiB0aGUgY3JlYXRlZCBGTVEuCisgICAgICovCisgICAgQnVmZmVyU3RhdHVzQ2hhbm5lbChjb25zdCBTdGF0dXNEZXNjcmlwdG9yICZmbXFEZXNjKTsKKworICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIEZNUSBpcyBjb25uZWN0ZWQgc3VjY2Vzc2Z1bGx5LiAqLworICAgIGJvb2wgaXNWYWxpZCgpOworCisgICAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgRk1RIG5lZWRzIHRvIGJlIHN5bmNlZCBmcm9tIHRoZSBidWZmZXIgcG9vbCAqLworICAgIGJvb2wgbmVlZHNTeW5jKCk7CisKKyAgICAvKioKKyAgICAgKiBQb3N0cyBhIGJ1ZmZlciByZWxlYXNlIG1lc3NhZ2UgdG8gdGhlIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgY29ubmVjdGlvbiBJZCBvZiB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSBwZW5kaW5nICAgICAgIGN1cnJlbnRseSBwZW5kaW5nIGJ1ZmZlciByZWxlYXNlIG1lc3NhZ2VzLgorICAgICAqIEBwYXJhbSBwb3N0ZWQgICAgICAgIHBvc3RlZCBidWZmZXIgcmVsZWFzZSBtZXNzYWdlcy4KKyAgICAgKi8KKyAgICB2b2lkIHBvc3RCdWZmZXJSZWxlYXNlKAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBlbmRpbmcsIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBvc3RlZCk7CisKKyAgICAvKioKKyAgICAgKiBQb3N0cyBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSByZWdhcmRpbmcgdGhlIHNwZWNpZmllZCBidWZmZXIKKyAgICAgKiB0cmFuc2ZlciB0cmFuc2FjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbklkIElkIG9mIHRoZSBzcGVjaWZpZWQgdHJhbnNhY3Rpb24uCisgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgYnVmZmVyIElkIG9mIHRoZSBzcGVjaWZpZWQgdHJhbnNhY3Rpb24uCisgICAgICogQHBhcmFtIHN0YXR1cyAgICAgICAgbmV3IHN0YXR1cyBvZiB0aGUgYnVmZmVyLgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0SWQgICAgICBjb25uZWN0aW9uIElkIG9mIHRoZSByZWNlaXZlcihvbmx5IHdoZW4gdGhlIHNlbmRlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBvc3RzIGEgc3RhdHVzIG1lc3NhZ2UpLgorICAgICAqIEBwYXJhbSBwZW5kaW5nICAgICAgIGN1cnJlbnRseSBwZW5kaW5nIGJ1ZmZlciByZWxlYXNlIG1lc3NhZ2VzLgorICAgICAqIEBwYXJhbSBwb3N0ZWQgICAgICAgIHBvc3RlZCBidWZmZXIgcmVsZWFzZSBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHdoZW4gdGhlIHNwZWNpZmllZCBtZXNzYWdlIGlzIHBvc3RlZCwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2wgcG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgIEJ1ZmZlclN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIHRhcmdldElkLAorICAgICAgICAgICAgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcGVuZGluZywgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcG9zdGVkKTsKKworICAgIC8qKgorICAgICAqIFBvc3RzIGEgYnVmZmVyIGludmFsaWFkYXRpb24gbWVzc2dlIHRvIHRoZSBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gaW52YWxpZGF0ZUlkICBpbnZhbGlkYXRpb24gYWNrIHRvIHRoZSBidWZmZXIgcG9vbC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpZiBpbnZhbGlkYXRpb24gaWQgaXMgemVybywgdGhlIGFjayB3aWxsIG5vdCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBvc3RlZC4KKyAgICAgKiBAcGFyYW0gaW52YWxpZGF0ZWQgICBzZXRzIHtAY29kZSB0cnVlfSBvbmx5IHdoZW4gdGhlIGludmFsaWRhdGlvbiBhY2sgaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwb3N0ZWQuCisgICAgICovCisgICAgdm9pZCBwb3N0QnVmZmVySW52YWxpZGF0ZUFjaygKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICB1aW50MzJfdCBpbnZhbGlkYXRlSWQsCisgICAgICAgICAgICBib29sICppbnZhbGlkYXRlZCk7Cit9OworCisvKioKKyAqIEEgYnVmZmVyIGludmFsaWRhdGlvbiBGTVEgZm9yIGEgYnVmZmVyIHBvb2wgY2xpZW50LiBCdWZmZXIgaW52YWxpZGF0aW9uCisgKiBtZXNzYWdlcyBhcmUgcmVjZWl2ZWQgdmlhIHRoZSBmbXEgZnJvbSB0aGUgYnVmZmVyIHBvb2wuIEJ1ZmZlciBpbnZhbGlkYXRpb24KKyAqIG1lc3NhZ2VzIGFyZSBoYW5kbGVkIGFzIHNvb24gYXMgcG9zc2libGUuCisgKi8KK2NsYXNzIEJ1ZmZlckludmFsaWRhdGlvbkxpc3RlbmVyIHsKK3ByaXZhdGU6CisgICAgYm9vbCBtVmFsaWQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlckludmFsaWRhdGlvblF1ZXVlPiBtQnVmZmVySW52YWxpZGF0aW9uUXVldWU7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25uZWN0cyB0byBhIGJ1ZmZlciBpbnZhbGlkYXRpb24gRk1RIGZyb20gYSBkZXNjcmlwdG9yIG9mIHRoZSBjcmVhdGVkIEZNUS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbXFEZXNjICAgRGVzY3JpcHRvciBvZiB0aGUgY3JlYXRlZCBGTVEuCisgICAgICovCisgICAgQnVmZmVySW52YWxpZGF0aW9uTGlzdGVuZXIoY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvciAmZm1xRGVzYyk7CisKKyAgICAvKiogUmV0cmlldmVzIGFsbCBwZW5kaW5nIGJ1ZmZlciBpbnZhbGlkYXRpb24gbWVzc2FnZXMgZnJvbSB0aGUgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZXMgIHJldHJpZXZlZCBwZW5kaW5nIG1lc3NhZ2VzLgorICAgICAqLworICAgIHZvaWQgZ2V0SW52YWxpZGF0aW9ucyhzdGQ6OnZlY3RvcjxCdWZmZXJJbnZhbGlkYXRpb25NZXNzYWdlPiAmbWVzc2FnZXMpOworCisgICAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgRk1RIGlzIGNvbm5lY3RlZCBzdWNjZXNmdWxseS4gKi8KKyAgICBib29sIGlzVmFsaWQoKTsKK307CisKKy8qKgorICogQSBidWZmZXIgaW52YWxpZGF0aW9uIEZNUSBmb3IgYSBidWZmZXIgcG9vbC4gQSBidWZmZXIgcG9vbCB3aWxsIHNlbmQgYnVmZmVyCisgKiBpbnZhbGlkYXRpb24gbWVzc2FnZXMgdG8gdGhlIGNsaWVudHMgdmlhIHRoZSBGTVEuIFRoZSBGTVEgaXMgc2hhcmVkIGFtb25nCisgKiBidWZmZXIgcG9vbCBjbGllbnRzLgorICovCitjbGFzcyBCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsIHsKK3ByaXZhdGU6CisgICAgYm9vbCBtVmFsaWQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlckludmFsaWRhdGlvblF1ZXVlPiBtQnVmZmVySW52YWxpZGF0aW9uUXVldWU7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgYnVmZmVyIGludmFsaWRhdGlvbiBGTVEgZm9yIGEgYnVmZmVyIHBvb2wuCisgICAgICovCisgICAgQnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbCgpOworCisgICAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgRk1RIGlzIGNvbm5lY3RlZCBzdWNjZXNmdWxseS4gKi8KKyAgICBib29sIGlzVmFsaWQoKTsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgZGVzY3JpcHRvciBvZiBhIGJ1ZmZlciBpbnZhbGlkYXRpb24gRk1RLiB0aGUgZGVzY3JpcHRvciBtYXkKKyAgICAgKiBiZSBwYXNzZWQgdG8gdGhlIGNsaWVudCBmb3IgYnVmZmVyIGludmFsaWRhdGlvbiBoYW5kbGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbXFEZXNjUHRyICAgIGRvdWJsZSBwdHIgb2YgY3JlYXRlZCBGTVEncyBkZXNjcmlwdG9yLgorICAgICAqLworICAgIHZvaWQgZ2V0RGVzYyhjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yICoqZm1xRGVzY1B0cik7CisKKyAgICAvKiogUG9zdHMgYSBidWZmZXIgaW52YWxpZGF0aW9uIGZvciBpbnZhbGlkYXRlZCBidWZmZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIG1zZ0lkICAgICBJbnZhbGlkYXRpb24gbWVzc2FnZSBpZCB3aGljaCBpcyB1c2VkIHdoZW4gY2xpZW50cyBzZW5kCisgICAgICogICAgICAgICAgICAgICAgICBhY2tzIGJhY2sgdmlhIEJ1ZmZlclN0YXR1c01lc3NhZ2UKKyAgICAgKiBAcGFyYW0gZnJvbUlkICAgIFRoZSBzdGFydCBidWZmZXJpZCBvZiB0aGUgaW52YWxpZGF0ZWQgYnVmZmVycyhpbmNsdXNpdmUpCisgICAgICogQHBhcmFtIHRvSWQgICAgICBUaGUgZW5kIGJ1ZmZlcklkIG9mIHRoZSBpbnZhbGlkYXRlZCBidWZmZXJzKGluY2x1c2l2ZSkKKyAgICAgKi8KKyAgICB2b2lkIHBvc3RJbnZhbGlkYXRpb24odWludDMyX3QgbXNnSWQsIEJ1ZmZlcklkIGZyb21JZCwgQnVmZmVySWQgdG9JZCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQlVGRkVSU1RBVFVTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0NsaWVudE1hbmFnZXIuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQ2xpZW50TWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMxZDMxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0NsaWVudE1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsNTM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbE1hbmFnZXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgIkJ1ZmZlclBvb2xDbGllbnQuaCIKKyNpbmNsdWRlICJPYnNlcnZlci5oIgorI2luY2x1ZGUgIkFjY2Vzc29yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtSZWdpc3RlclRpbWVvdXRVcyA9IDUwMDAwMDsgLy8gMC41IHNlYworc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtDbGVhblVwRHVyYXRpb25VcyA9IDEwMDAwMDA7IC8vIFRPRE86IDEgc2VjIHR1bmUKK3N0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrQ2xpZW50VGltZW91dFVzID0gNTAwMDAwMDsgLy8gVE9ETzogNSBzZWNzIHR1bmUKKworLyoqCisgKiBUaGUgaG9sZGVyIG9mIHRoZSBjb29raWUgb2YgcmVtb3RlIElDbGllbnRNYW5hZ2VyLgorICogVGhlIGNvb2tpZSBpcyBwcm9jZXNzIGxvY2FsbHkgdW5pcXVlIGZvciBlYWNoIElDbGllbnRNYW5hZ2VyLgorICogKFRoZSBjb29raWUgaXMgdXNlZCB0byBub3RpZnkgZGVhdGggb2YgY2xpZW50cyB0byBidWZmZXJwb29sIHByb2Nlc3MuKQorICovCitjbGFzcyBDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgY29va2llIGhvbGRlciBmb3IgcmVtb3RlIElDbGllbnRNYW5hZ2VyKHMpLgorICAgICAqLworICAgIENsaWVudE1hbmFnZXJDb29raWVIb2xkZXIoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgYSBjb29raWUgZm9yIGEgcmVtb3RlIElDbGllbnRNYW5hZ2VyLgorICAgICAqCisgICAgICogQHBhcmFtIG1hbmFnZXIgICB0aGUgc3BlY2lmaWVkIHJlbW90ZSBJQ2xpZW50TWFuYWdlci4KKyAgICAgKiBAcGFyYW0gYWRkZWQgICAgIHRydWUgd2hlbiB0aGUgc3BlY2lmaWVkIHJlbW90ZSBJQ2xpZW50TWFuYWdlciBpcyBhZGRlZAorICAgICAqICAgICAgICAgICAgICAgICAgbmV3bHksIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHByb2Nlc3MgbG9jYWxseSB1bmlxdWUgY29va2llIGZvciB0aGUgc3BlY2lmaWVkIElDbGllbnRNYW5hZ2VyLgorICAgICAqLworICAgIHVpbnQ2NF90IGdldENvb2tpZShjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJm1hbmFnZXIsIGJvb2wgKmFkZGVkKTsKKworcHJpdmF0ZToKKyAgICB1aW50NjRfdCBtU2VxSWQ7CisgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICBzdGQ6Omxpc3Q8c3RkOjpwYWlyPGNvbnN0IHdwPElDbGllbnRNYW5hZ2VyPiwgdWludDY0X3Q+PiBtTWFuYWdlcnM7Cit9OworCitDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyOjpDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyKCkgOiBtU2VxSWQoMCl7fQorCit1aW50NjRfdCBDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyOjpnZXRDb29raWUoCisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmbWFuYWdlciwKKyAgICAgICAgYm9vbCAqYWRkZWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgZm9yIChhdXRvIGl0ID0gbU1hbmFnZXJzLmJlZ2luKCk7IGl0ICE9IG1NYW5hZ2Vycy5lbmQoKTspIHsKKyAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+IGtleSA9IGl0LT5maXJzdC5wcm9tb3RlKCk7CisgICAgICAgIGlmIChrZXkpIHsKKyAgICAgICAgICAgIGlmIChpbnRlcmZhY2VzRXF1YWwoa2V5LCBtYW5hZ2VyKSkgeworICAgICAgICAgICAgICAgICphZGRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGl0ID0gbU1hbmFnZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICB1aW50NjRfdCBpZCA9IG1TZXFJZCsrOworICAgICphZGRlZCA9IHRydWU7CisgICAgbU1hbmFnZXJzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihtYW5hZ2VyLCBpZCkpOworICAgIHJldHVybiBpZDsKK30KKworY2xhc3MgQ2xpZW50TWFuYWdlcjo6SW1wbCB7CitwdWJsaWM6CisgICAgSW1wbCgpOworCisgICAgLy8gQm5SZWdpc3RlclNlbmRlcgorICAgIFJlc3VsdFN0YXR1cyByZWdpc3RlclNlbmRlcihjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKTsKKworICAgIC8vIEJwUmVnaXN0ZXJTZW5kZXIKKyAgICBSZXN1bHRTdGF0dXMgcmVnaXN0ZXJTZW5kZXIoY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+ICZyZWNlaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkIHNlbmRlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnJlY2VpdmVySWQpOworCisgICAgUmVzdWx0U3RhdHVzIGNyZWF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCk7CisKKyAgICBSZXN1bHRTdGF0dXMgY2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICBSZXN1bHRTdGF0dXMgZmx1c2goQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgUmVzdWx0U3RhdHVzIHJlY2VpdmUoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIFJlc3VsdFN0YXR1cyBwb3N0U2VuZChDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lc3RhbXBVcyk7CisKKyAgICBSZXN1bHRTdGF0dXMgZ2V0QWNjZXNzb3IoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SUFjY2Vzc29yPiAqYWNjZXNzb3IpOworCisgICAgdm9pZCBjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSA9IGZhbHNlKTsKKworcHJpdmF0ZToKKyAgICAvLyBJbiBvcmRlciB0byBwcmV2ZW50IGRlYWRsb2NrIGJldHdlZW4gbXVsdGlwbGUgbG9ja3MsCisgICAgLy8gYWx3YXlzIGxvY2sgQ2xpZW50Q2FjaGUubG9jayBiZWZvcmUgbG9ja2luZyBBY3RpdmVDbGllbnRzLmxvY2suCisgICAgc3RydWN0IENsaWVudENhY2hlIHsKKyAgICAgICAgLy8gVGhpcyBsb2NrIGlzIGhlbGQgZm9yIGJyaWVmIGR1cmF0aW9uLgorICAgICAgICAvLyBCbG9ja2luZyBvcGVyYXRpb24gaXMgbm90IHBlcmZvcm1lZCB3aGlsZSBob2xkaW5nIHRoZSBsb2NrLgorICAgICAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6cGFpcjxjb25zdCB3cDxJQWNjZXNzb3I+LCBjb25zdCBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+Pj4KKyAgICAgICAgICAgICAgICBtQ2xpZW50czsKKyAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbUNvbm5lY3RDdjsKKyAgICAgICAgYm9vbCBtQ29ubmVjdGluZzsKKyAgICAgICAgaW50NjRfdCBtTGFzdENsZWFuVXBVczsKKworICAgICAgICBDbGllbnRDYWNoZSgpIDogbUNvbm5lY3RpbmcoZmFsc2UpLCBtTGFzdENsZWFuVXBVcyhnZXRUaW1lc3RhbXBOb3coKSkge30KKyAgICB9IG1DYWNoZTsKKworICAgIC8vIEFjdGl2ZSBjbGllbnRzIHdoaWNoIGNhbiBiZSByZXRyaWV2ZWQgdmlhIENvbm5lY3Rpb25JZAorICAgIHN0cnVjdCBBY3RpdmVDbGllbnRzIHsKKyAgICAgICAgLy8gVGhpcyBsb2NrIGlzIGhlbGQgZm9yIGJyaWVmIGR1cmF0aW9uLgorICAgICAgICAvLyBCbG9ja2luZyBvcGVyYXRpb24gaXMgbm90IHBlcmZvcm1lZCBob2xkaW5nIHRoZSBsb2NrLgorICAgICAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICAgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4+CisgICAgICAgICAgICAgICAgbUNsaWVudHM7CisgICAgfSBtQWN0aXZlOworCisgICAgc3A8T2JzZXJ2ZXI+IG1PYnNlcnZlcjsKKworICAgIENsaWVudE1hbmFnZXJDb29raWVIb2xkZXIgbVJlbW90ZUNsaWVudENvb2tpZXM7Cit9OworCitDbGllbnRNYW5hZ2VyOjpJbXBsOjpJbXBsKCkKKyAgICA6IG1PYnNlcnZlcihuZXcgT2JzZXJ2ZXIoKSkge30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OnJlZ2lzdGVyU2VuZGVyKAorICAgICAgICBjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3NvciwgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKSB7CisgICAgY2xlYW5VcCgpOworICAgIGludDY0X3QgdGltZW91dFVzID0gZ2V0VGltZXN0YW1wTm93KCkgKyBrUmVnaXN0ZXJUaW1lb3V0VXM7CisgICAgZG8geworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1NdXRleCk7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1DYWNoZS5tQ2xpZW50cy5iZWdpbigpOyBpdCAhPSBtQ2FjaGUubUNsaWVudHMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIHNwPElBY2Nlc3Nvcj4gc0FjY2Vzc29yID0gaXQtPmZpcnN0LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChzQWNjZXNzb3IgJiYgaW50ZXJmYWNlc0VxdWFsKHNBY2Nlc3NvciwgYWNjZXNzb3IpKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudCA9IGl0LT5zZWNvbmQubG9jaygpOworICAgICAgICAgICAgICAgIGlmIChjbGllbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICAgICAgICAgICAgICAqcENvbm5lY3Rpb25JZCA9IGNsaWVudC0+Z2V0Q29ubmVjdGlvbklkKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQWN0aXZlLm1DbGllbnRzLmZpbmQoKnBDb25uZWN0aW9uSWQpICE9IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJyZWdpc3RlciBleGlzdGluZyBjb25uZWN0aW9uICVsbGQiLCAobG9uZyBsb25nKSpwQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkFMUkVBRFlfRVhJU1RTOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1DYWNoZS5tQ2xpZW50cy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtQ2FjaGUubUNvbm5lY3RpbmcpIHsKKyAgICAgICAgICAgIG1DYWNoZS5tQ29ubmVjdGluZyA9IHRydWU7CisgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgUmVzdWx0U3RhdHVzIHJlc3VsdCA9IFJlc3VsdFN0YXR1czo6T0s7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50ID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxCdWZmZXJQb29sQ2xpZW50PihhY2Nlc3NvciwgbU9ic2VydmVyKTsKKyAgICAgICAgICAgIGxvY2subG9jaygpOworICAgICAgICAgICAgaWYgKCFjbGllbnQpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNsaWVudC0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IGhhbmRsZSBpbnNlcnQgZmFpbC4gKG1hbGxvYyBmYWlsKQorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudD4gd2NsaWVudCA9IGNsaWVudDsKKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNsaWVudHMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGFjY2Vzc29yLCB3Y2xpZW50KSk7CisgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbklkID0gY2xpZW50LT5nZXRDb25uZWN0aW9uSWQoKTsKKyAgICAgICAgICAgICAgICBtT2JzZXJ2ZXItPmFkZENsaWVudChjb25JZCwgd2NsaWVudCk7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmUubUNsaWVudHMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvbklkLCBjbGllbnQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKnBDb25uZWN0aW9uSWQgPSBjb25JZDsKKyAgICAgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXIgbmV3IGNvbm5lY3Rpb24gJWxsZCIsIChsb25nIGxvbmcpKnBDb25uZWN0aW9uSWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNhY2hlLm1Db25uZWN0aW5nID0gZmFsc2U7CisgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgbUNhY2hlLm1Db25uZWN0Q3Yubm90aWZ5X2FsbCgpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBtQ2FjaGUubUNvbm5lY3RDdi53YWl0X2ZvcigKKyAgICAgICAgICAgICAgICBsb2NrLCBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzKGtSZWdpc3RlclRpbWVvdXRVcykpOworICAgIH0gd2hpbGUgKGdldFRpbWVzdGFtcE5vdygpIDwgdGltZW91dFVzKTsKKyAgICAvLyBUT0RPOiByZXR1cm4gdGltZW91dCBlcnJvcgorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6cmVnaXN0ZXJTZW5kZXIoCisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmcmVjZWl2ZXIsCisgICAgICAgIENvbm5lY3Rpb25JZCBzZW5kZXJJZCwKKyAgICAgICAgQ29ubmVjdGlvbklkICpyZWNlaXZlcklkKSB7CisgICAgc3A8SUFjY2Vzc29yPiBhY2Nlc3NvcjsKKyAgICBib29sIGxvY2FsID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoc2VuZGVySWQpOworICAgICAgICBpZiAoaXQgPT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGl0LT5zZWNvbmQtPmdldEFjY2Vzc29yKCZhY2Nlc3Nvcik7CisgICAgICAgIGxvY2FsID0gaXQtPnNlY29uZC0+aXNMb2NhbCgpOworICAgIH0KKyAgICBSZXN1bHRTdGF0dXMgcnMgPSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIGlmIChhY2Nlc3NvcikgeworICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1Jlc3VsdCA9IHJlY2VpdmVyLT5yZWdpc3RlclNlbmRlcigKKyAgICAgICAgICAgICAgICBhY2Nlc3NvciwKKyAgICAgICAgICAgICAgICBbJnJzLCByZWNlaXZlcklkXSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGNvbm5lY3Rpb25JZCkgeworICAgICAgICAgICAgICAgICAgICBycyA9IHN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgKnJlY2VpdmVySWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmICghdHJhbnNSZXN1bHQuaXNPaygpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICAgICAgfSBlbHNlIGlmIChsb2NhbCAmJiBycyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICBzcDxDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ+IHJlY2lwaWVudCA9IEFjY2Vzc29yOjpnZXRDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQoKTsKKyAgICAgICAgICAgIGlmIChyZWNpcGllbnQpICB7CisgICAgICAgICAgICAgICAgQUxPR1YoImNsaWVudCBkZWF0aCByZWNpcGllbnQgcmVnaXN0ZXJlZCAlbGxkIiwgKGxvbmcgbG9uZykqcmVjZWl2ZXJJZCk7CisgICAgICAgICAgICAgICAgYm9vbCBhZGRlZDsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBjb29raWUgPSBtUmVtb3RlQ2xpZW50Q29va2llcy5nZXRDb29raWUocmVjZWl2ZXIsICZhZGRlZCk7CisgICAgICAgICAgICAgICAgcmVjaXBpZW50LT5hZGRDb29raWVUb0Nvbm5lY3Rpb24oY29va2llLCAqcmVjZWl2ZXJJZCk7CisgICAgICAgICAgICAgICAgaWYgKGFkZGVkKSB7CisgICAgICAgICAgICAgICAgICAgIFJldHVybjxib29sPiB0cmFuc1Jlc3VsdCA9IHJlY2VpdmVyLT5saW5rVG9EZWF0aChyZWNpcGllbnQsIGNvb2tpZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByczsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OmNyZWF0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IsCisgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCkgeworICAgIGNvbnN0IHNwPEFjY2Vzc29yPiBhY2Nlc3NvciA9IG5ldyBBY2Nlc3NvcihhbGxvY2F0b3IpOworICAgIGlmICghYWNjZXNzb3IgfHwgIWFjY2Vzc29yLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIC8vIFRPRE86IG9ic2VydmVyIGlzIGxvY2FsLiB1c2UgZGlyZWN0IGNhbGwgaW5zdGVhZCBvZiBoaWRsIGNhbGwuCisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudCA9CisgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEJ1ZmZlclBvb2xDbGllbnQ+KGFjY2Vzc29yLCBtT2JzZXJ2ZXIpOworICAgIGlmICghY2xpZW50IHx8ICFjbGllbnQtPmlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgLy8gU2luY2UgYSBuZXcgYnVmZmVycG9vbCBpcyBjcmVhdGVkLCBldmljdCBtZW1vcmllcyB3aGljaCBhcmUgdXNlZCBieQorICAgIC8vIGV4aXN0aW5nIGJ1ZmZlcnBvb2xzIGFuZCBjbGllbnRzLgorICAgIGNsZWFuVXAodHJ1ZSk7CisgICAgeworICAgICAgICAvLyBUT0RPOiBoYW5kbGUgaW5zZXJ0IGZhaWwuIChtYWxsb2MgZmFpbCkKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1NdXRleCk7CisgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudD4gd2NsaWVudCA9IGNsaWVudDsKKyAgICAgICAgbUNhY2hlLm1DbGllbnRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhY2Nlc3Nvciwgd2NsaWVudCkpOworICAgICAgICBDb25uZWN0aW9uSWQgY29uSWQgPSBjbGllbnQtPmdldENvbm5lY3Rpb25JZCgpOworICAgICAgICBtT2JzZXJ2ZXItPmFkZENsaWVudChjb25JZCwgd2NsaWVudCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgICAgIG1BY3RpdmUubUNsaWVudHMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvbklkLCBjbGllbnQpKTsKKyAgICAgICAgfQorICAgICAgICAqcENvbm5lY3Rpb25JZCA9IGNvbklkOworICAgICAgICBBTE9HVigiY3JlYXRlIG5ldyBjb25uZWN0aW9uICVsbGQiLCAobG9uZyBsb25nKSpwQ29ubmVjdGlvbklkKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrMShtQ2FjaGUubU11dGV4KTsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2syKG1BY3RpdmUubU11dGV4KTsKKyAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgaWYgKGl0ICE9IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgc3A8SUFjY2Vzc29yPiBhY2Nlc3NvcjsKKyAgICAgICAgaXQtPnNlY29uZC0+Z2V0QWNjZXNzb3IoJmFjY2Vzc29yKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsb3NpbmcgPSBpdC0+c2Vjb25kOworICAgICAgICBtQWN0aXZlLm1DbGllbnRzLmVyYXNlKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGZvciAoYXV0byBjaXQgPSBtQ2FjaGUubUNsaWVudHMuYmVnaW4oKTsgY2l0ICE9IG1DYWNoZS5tQ2xpZW50cy5lbmQoKTspIHsKKyAgICAgICAgICAgIC8vIGNsZWFuIHVwIGRlYWQgY2xpZW50IGNhY2hlcworICAgICAgICAgICAgc3A8SUFjY2Vzc29yPiBjQWNjZXNzb3IgPSBjaXQtPmZpcnN0LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmICghY0FjY2Vzc29yIHx8IChhY2Nlc3NvciAmJiBpbnRlcmZhY2VzRXF1YWwoY0FjY2Vzc29yLCBhY2Nlc3NvcikpKSB7CisgICAgICAgICAgICAgICAgY2l0ID0gbUNhY2hlLm1DbGllbnRzLmVyYXNlKGNpdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNpdCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxvY2syLnVubG9jaygpOworICAgICAgICBsb2NrMS51bmxvY2soKTsKKyAgICAgICAgY2xvc2luZy0+Zmx1c2goKTsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OmZsdXNoKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudC0+Zmx1c2goKTsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OmFsbG9jYXRlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQ7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQgPSBpdC0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gY2xpZW50LT5hbGxvY2F0ZShwYXJhbXMsIGhhbmRsZSwgYnVmZmVyKTsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OnJlY2VpdmUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudDsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuZmluZChjb25uZWN0aW9uSWQpOworICAgICAgICBpZiAoaXQgPT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGNsaWVudCA9IGl0LT5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBjbGllbnQtPnJlY2VpdmUodHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIHRpbWVzdGFtcFVzLCBoYW5kbGUsIGJ1ZmZlcik7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpwb3N0U2VuZCgKKyAgICAgICAgQ29ubmVjdGlvbklkIHJlY2VpdmVySWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwgaW50NjRfdCAqdGltZXN0YW1wVXMpIHsKKyAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkID0gYnVmZmVyLT5tQ29ubmVjdGlvbklkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQ7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQgPSBpdC0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gY2xpZW50LT5wb3N0U2VuZChyZWNlaXZlcklkLCBidWZmZXIsIHRyYW5zYWN0aW9uSWQsIHRpbWVzdGFtcFVzKTsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OmdldEFjY2Vzc29yKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBzcDxJQWNjZXNzb3I+ICphY2Nlc3NvcikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQ7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQgPSBpdC0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gY2xpZW50LT5nZXRBY2Nlc3NvcihhY2Nlc3Nvcik7Cit9CisKK3ZvaWQgQ2xpZW50TWFuYWdlcjo6SW1wbDo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpbnQ2NF90IG5vdyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgIGludDY0X3QgbGFzdFRyYW5zYWN0aW9uVXM7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sxKG1DYWNoZS5tTXV0ZXgpOworICAgIGlmIChjbGVhckNhY2hlIHx8IG1DYWNoZS5tTGFzdENsZWFuVXBVcyArIGtDbGVhblVwRHVyYXRpb25VcyA8IG5vdykgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jazIobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBpbnQgY2xlYW5lZCA9IDA7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuYmVnaW4oKTsgaXQgIT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKTspIHsKKyAgICAgICAgICAgIGlmICghaXQtPnNlY29uZC0+aXNBY3RpdmUoJmxhc3RUcmFuc2FjdGlvblVzLCBjbGVhckNhY2hlKSkgeworICAgICAgICAgICAgICAgIGlmIChsYXN0VHJhbnNhY3Rpb25VcyArIGtDbGllbnRUaW1lb3V0VXMgPCBub3cpIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8SUFjY2Vzc29yPiBhY2Nlc3NvcjsKKyAgICAgICAgICAgICAgICAgICAgaXQtPnNlY29uZC0+Z2V0QWNjZXNzb3IoJmFjY2Vzc29yKTsKKyAgICAgICAgICAgICAgICAgICAgaXQgPSBtQWN0aXZlLm1DbGllbnRzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICAgICAgKytjbGVhbmVkOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2l0OworICAgICAgICB9CisgICAgICAgIGZvciAoYXV0byBjaXQgPSBtQ2FjaGUubUNsaWVudHMuYmVnaW4oKTsgY2l0ICE9IG1DYWNoZS5tQ2xpZW50cy5lbmQoKTspIHsKKyAgICAgICAgICAgIC8vIGNsZWFuIHVwIGRlYWQgY2xpZW50IGNhY2hlcworICAgICAgICAgICAgc3A8SUFjY2Vzc29yPiBjQWNjZXNzb3IgPSBjaXQtPmZpcnN0LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmICghY0FjY2Vzc29yKSB7CisgICAgICAgICAgICAgICAgY2l0ID0gbUNhY2hlLm1DbGllbnRzLmVyYXNlKGNpdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICsrY2l0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dWKCIjIG9mIGNsZWFuZWQgY29ubmVjdGlvbnM6ICVkIiwgY2xlYW5lZCk7CisgICAgICAgIG1DYWNoZS5tTGFzdENsZWFuVXBVcyA9IG5vdzsKKyAgICB9Cit9CisKKy8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUNsaWVudE1hbmFnZXIgZm9sbG93LgorUmV0dXJuPHZvaWQ+IENsaWVudE1hbmFnZXI6OnJlZ2lzdGVyU2VuZGVyKGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQWNjZXNzb3I+JiBidWZmZXJQb29sLCByZWdpc3RlclNlbmRlcl9jYiBfaGlkbF9jYikgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkID0gLTE7CisgICAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtSW1wbC0+cmVnaXN0ZXJTZW5kZXIoYnVmZmVyUG9vbCwgJmNvbm5lY3Rpb25JZCk7CisgICAgICAgIF9oaWRsX2NiKHN0YXR1cywgY29ubmVjdGlvbklkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfaGlkbF9jYihSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SLCAtMSk7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKKy8vIE1ldGhvZHMgZm9yIGxvY2FsIHVzZS4KK3NwPENsaWVudE1hbmFnZXI+IENsaWVudE1hbmFnZXI6OnNJbnN0YW5jZTsKK3N0ZDo6bXV0ZXggQ2xpZW50TWFuYWdlcjo6c0luc3RhbmNlTG9jazsKKworc3A8Q2xpZW50TWFuYWdlcj4gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soc0luc3RhbmNlTG9jayk7CisgICAgaWYgKCFzSW5zdGFuY2UpIHsKKyAgICAgICAgc0luc3RhbmNlID0gbmV3IENsaWVudE1hbmFnZXIoKTsKKyAgICB9CisgICAgQWNjZXNzb3I6OmNyZWF0ZUludmFsaWRhdG9yKCk7CisgICAgcmV0dXJuIHNJbnN0YW5jZTsKK30KKworQ2xpZW50TWFuYWdlcjo6Q2xpZW50TWFuYWdlcigpIDogbUltcGwobmV3IEltcGwoKSkge30KKworQ2xpZW50TWFuYWdlcjo6fkNsaWVudE1hbmFnZXIoKSB7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpjcmVhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5jcmVhdGUoYWxsb2NhdG9yLCBwQ29ubmVjdGlvbklkKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpyZWdpc3RlclNlbmRlcigKKyAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+ICZyZWNlaXZlciwKKyAgICAgICAgQ29ubmVjdGlvbklkIHNlbmRlcklkLAorICAgICAgICBDb25uZWN0aW9uSWQgKnJlY2VpdmVySWQpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5yZWdpc3RlclNlbmRlcihyZWNlaXZlciwgc2VuZGVySWQsIHJlY2VpdmVySWQpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OmNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5jbG9zZShjb25uZWN0aW9uSWQpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OmZsdXNoKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5mbHVzaChjb25uZWN0aW9uSWQpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OmFsbG9jYXRlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmFsbG9jYXRlKGNvbm5lY3Rpb25JZCwgcGFyYW1zLCBoYW5kbGUsIGJ1ZmZlcik7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6cmVjZWl2ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5yZWNlaXZlKGNvbm5lY3Rpb25JZCwgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcywgaGFuZGxlLCBidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OnBvc3RTZW5kKAorICAgICAgICBDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLCBpbnQ2NF90KiB0aW1lc3RhbXBVcykgeworICAgIGlmIChtSW1wbCAmJiBidWZmZXIpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5wb3N0U2VuZChyZWNlaXZlcklkLCBidWZmZXIsIHRyYW5zYWN0aW9uSWQsIHRpbWVzdGFtcFVzKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK3ZvaWQgQ2xpZW50TWFuYWdlcjo6Y2xlYW5VcCgpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgbUltcGwtPmNsZWFuVXAodHJ1ZSk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9Db25uZWN0aW9uLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0Nvbm5lY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZDBlNzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9Db25uZWN0aW9uLmNwcApAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkNvbm5lY3Rpb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklDb25uZWN0aW9uIGZvbGxvdy4KK1JldHVybjx2b2lkPiBDb25uZWN0aW9uOjpmZXRjaCh1aW50NjRfdCB0cmFuc2FjdGlvbklkLCB1aW50MzJfdCBidWZmZXJJZCwgZmV0Y2hfY2IgX2hpZGxfY2IpIHsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICBpZiAobUluaXRpYWxpemVkICYmIG1BY2Nlc3NvcikgeworICAgICAgICBpZiAoYnVmZmVySWQgIT0gU1lOQ19CVUZGRVJJRCkgeworICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBudWxscHRyOworICAgICAgICAgICAgc3RhdHVzID0gbUFjY2Vzc29yLT5mZXRjaCgKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsICZoYW5kbGUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBCdWZmZXJ7YnVmZmVySWQsIGhhbmRsZX0pOworICAgICAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQWNjZXNzb3ItPmNsZWFuVXAoZmFsc2UpOworICAgICAgICB9CisgICAgfQorICAgIF9oaWRsX2NiKHN0YXR1cywgQnVmZmVyezAsIG51bGxwdHJ9KTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitDb25uZWN0aW9uOjpDb25uZWN0aW9uKCkgOiBtSW5pdGlhbGl6ZWQoZmFsc2UpLCBtQ29ubmVjdGlvbklkKC0xTEwpIHt9CisKK0Nvbm5lY3Rpb246On5Db25uZWN0aW9uKCkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQgJiYgbUFjY2Vzc29yKSB7CisgICAgICAgIG1BY2Nlc3Nvci0+Y2xvc2UobUNvbm5lY3Rpb25JZCk7CisgICAgfQorfQorCit2b2lkIENvbm5lY3Rpb246OmluaXRpYWxpemUoCisgICAgICAgIGNvbnN0IHNwPEFjY2Vzc29yPiYgYWNjZXNzb3IsIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBpZiAoIW1Jbml0aWFsaXplZCkgeworICAgICAgICBtQWNjZXNzb3IgPSBhY2Nlc3NvcjsKKyAgICAgICAgbUNvbm5lY3Rpb25JZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICB9Cit9CisKK1Jlc3VsdFN0YXR1cyBDb25uZWN0aW9uOjpmbHVzaCgpIHsKKyAgICBpZiAobUluaXRpYWxpemVkICYmIG1BY2Nlc3NvcikgeworICAgICAgICByZXR1cm4gbUFjY2Vzc29yLT5mbHVzaCgpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENvbm5lY3Rpb246OmFsbG9jYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLCBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQgJiYgbUFjY2Vzc29yKSB7CisgICAgICAgIHJldHVybiBtQWNjZXNzb3ItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHBhcmFtcywgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit2b2lkIENvbm5lY3Rpb246OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCAmJiBtQWNjZXNzb3IpIHsKKyAgICAgICAgbUFjY2Vzc29yLT5jbGVhblVwKGNsZWFyQ2FjaGUpOworICAgIH0KK30KKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2UgZm9sbG93LgorCisvL0lDb25uZWN0aW9uKiBISURMX0ZFVENIX0lDb25uZWN0aW9uKGNvbnN0IGNoYXIqIC8qIG5hbWUgKi8pIHsKKy8vICAgIHJldHVybiBuZXcgQ29ubmVjdGlvbigpOworLy99CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0Nvbm5lY3Rpb24uaCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0Nvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTA3NzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQ29ubmVjdGlvbi5oCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9DT05ORUNUSU9OX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQ09OTkVDVElPTl9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSAiQWNjZXNzb3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpBY2Nlc3NvcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQ29ubmVjdGlvbiA6IHB1YmxpYyBJQ29ubmVjdGlvbiB7CisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQ29ubmVjdGlvbiBmb2xsb3cuCisgICAgUmV0dXJuPHZvaWQ+IGZldGNoKHVpbnQ2NF90IHRyYW5zYWN0aW9uSWQsIHVpbnQzMl90IGJ1ZmZlcklkLCBmZXRjaF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBJbnZhbGlkYXRlcyBhbGwgYnVmZmVycyB3aGljaCBhcmUgYWN0aXZlIGFuZC9vciBhcmUgcmVhZHkgdG8gYmUgcmVjeWNsZWQuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGZsdXNoKCk7CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZXMgYSBidWZmZXIgdXNpbmcgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLiBSZWN5Y2xlcyBhIGJ1ZmZlciBpZgorICAgICAqIGl0IGlzIHBvc3NpYmxlLiBUaGUgcmV0dXJuZWQgYnVmZmVyIGNhbiBiZSB0cmFuc2ZlcnJlZCB0byBvdGhlciByZW1vdGUKKyAgICAgKiBjbGllbnRzKENvbm5lY3Rpb24pLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtcyAgICBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICogQHBhcmFtIGJ1ZmZlcklkICBJZCBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gaGFuZGxlICAgIG5hdGl2ZSBoYW5kbGUgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIGlmIGEgYnVmZmVyIGlzIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIFByb2Nlc3NlcyBwZW5kaW5nIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMgYW5kIHBlcmZvcm1zIHBlcmlvZGljIGNhY2hlIGNsZWFuaW5nCisgICAgICogZnJvbSBidWZmZXJwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGNsZWFyQ2FjaGUgICAgaWYgY2xlYXJDYWNoZSBpcyB0cnVlLCBidWZmZXJwb29sIGZyZWVzIGFsbCBidWZmZXJzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgd2FpdGluZyB0byBiZSByZWN5Y2xlZC4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKTsKKworICAgIC8qKiBEZXN0cnVjdHMgYSBjb25uZWN0aW9uLiAqLworICAgIH5Db25uZWN0aW9uKCk7CisKKyAgICAvKiogQ3JlYXRlcyBhIGNvbm5lY3Rpb24uICovCisgICAgQ29ubmVjdGlvbigpOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgd2l0aCB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBwb29sIGFuZCB0aGUgY29ubmVjdGlvbiBpZC4KKyAgICAgKiBUaGUgY29ubmVjdGlvbiBpZCBzaG91bGQgYmUgdW5pcXVlIGluIHRoZSB3aG9sZSBzeXN0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWNjZXNzb3IgICAgICB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBwb29sLgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIElkLgorICAgICAqLworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIGVudW0gOiB1aW50MzJfdCB7CisgICAgICAgIFNZTkNfQlVGRkVSSUQgPSBVSU5UMzJfTUFYLAorICAgIH07CisKK3ByaXZhdGU6CisgICAgYm9vbCBtSW5pdGlhbGl6ZWQ7CisgICAgc3A8QWNjZXNzb3I+IG1BY2Nlc3NvcjsKKyAgICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9DT05ORUNUSU9OX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL09ic2VydmVyLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL09ic2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjIzMTYwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvT2JzZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiT2JzZXJ2ZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCitPYnNlcnZlcjo6T2JzZXJ2ZXIoKSB7Cit9CisKK09ic2VydmVyOjp+T2JzZXJ2ZXIoKSB7Cit9CisKKy8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SU9ic2VydmVyIGZvbGxvdy4KK1JldHVybjx2b2lkPiBPYnNlcnZlcjo6b25NZXNzYWdlKGludDY0X3QgY29ubmVjdGlvbklkLCB1aW50MzJfdCBtc2dJZCkgeworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgYXV0byBpdCA9IG1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICBpZiAoaXQgIT0gbUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudCA9IGl0LT5zZWNvbmQubG9jaygpOworICAgICAgICBpZiAoIWNsaWVudCkgeworICAgICAgICAgICAgbUNsaWVudHMuZXJhc2UoaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIGNsaWVudC0+cmVjZWl2ZUludmFsaWRhdGlvbihtc2dJZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKwordm9pZCBPYnNlcnZlcjo6YWRkQ2xpZW50KENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50PiAmd2NsaWVudCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBmb3IgKGF1dG8gaXQgPSBtQ2xpZW50cy5iZWdpbigpOyBpdCAhPSBtQ2xpZW50cy5lbmQoKTspIHsKKyAgICAgICAgaWYgKCFpdC0+c2Vjb25kLmxvY2soKSB8fCBpdC0+Zmlyc3QgPT0gY29ubmVjdGlvbklkKSB7CisgICAgICAgICAgICBpdCA9IG1DbGllbnRzLmVyYXNlKGl0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICsraXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgbUNsaWVudHMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvbm5lY3Rpb25JZCwgd2NsaWVudCkpOworCit9CisKK3ZvaWQgT2JzZXJ2ZXI6OmRlbENsaWVudChDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIG1DbGllbnRzLmVyYXNlKGNvbm5lY3Rpb25JZCk7Cit9CisKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvT2JzZXJ2ZXIuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL09ic2VydmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJiZDdjMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL09ic2VydmVyLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfT0JTRVJWRVJfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9PQlNFUlZFUl9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lPYnNlcnZlci5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlICJCdWZmZXJQb29sQ2xpZW50LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgT2JzZXJ2ZXIgOiBwdWJsaWMgSU9ic2VydmVyIHsKKyAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklPYnNlcnZlciBmb2xsb3cuCisgICAgUmV0dXJuPHZvaWQ+IG9uTWVzc2FnZShpbnQ2NF90IGNvbm5lY3Rpb25JZCwgdWludDMyX3QgbXNnSWQpIG92ZXJyaWRlOworCisgICAgfk9ic2VydmVyKCk7CisKKyAgICB2b2lkIGFkZENsaWVudChDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudD4gJndjbGllbnQpOworCisgICAgdm9pZCBkZWxDbGllbnQoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKK3ByaXZhdGU6CisgICAgT2JzZXJ2ZXIoKTsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQ2xpZW50TWFuYWdlcjsKKworICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBjb25zdCBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+PiBtQ2xpZW50czsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9PQlNFUlZFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmggYi9tZWRpYS9idWZmZXJwb29sLzIuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M5MDZjYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL2luY2x1ZGUvYnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaApAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQlVGRkVSUE9PTFRZUEVTX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQlVGRkVSUE9PTFRZUEVTX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworCitzdHJ1Y3QgQnVmZmVyUG9vbERhdGEgeworICAgIC8vIEZvciBsb2NhbCB1c2UsIHRvIHNwZWNpZnkgYSBidWZmZXJwb29sIChjbGllbnQgY29ubmVjdGlvbikgZm9yIGJ1ZmZlcnMuCisgICAgLy8gUmV0dXJuIHZhbHVlIGZyb20gY29ubmVjdCNJQWNjZXNzb3IoYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDIuMCkuCisgICAgaW50NjRfdCBtQ29ubmVjdGlvbklkOworICAgIC8vIEJ1ZmZlcklkCisgICAgdWludDMyX3QgbUlkOworCisgICAgQnVmZmVyUG9vbERhdGEoKSA6IG1Db25uZWN0aW9uSWQoMCksIG1JZCgwKSB7fQorCisgICAgQnVmZmVyUG9vbERhdGEoCisgICAgICAgICAgICBpbnQ2NF90IGNvbm5lY3Rpb25JZCwgdWludDMyX3QgaWQpCisgICAgICAgICAgICA6IG1Db25uZWN0aW9uSWQoY29ubmVjdGlvbklkKSwgbUlkKGlkKSB7fQorCisgICAgfkJ1ZmZlclBvb2xEYXRhKCkge30KK307CisKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjprVW5zeW5jaHJvbml6ZWRXcml0ZTsKKwordHlwZWRlZiB1aW50MzJfdCBCdWZmZXJJZDsKK3R5cGVkZWYgdWludDY0X3QgVHJhbnNhY3Rpb25JZDsKK3R5cGVkZWYgaW50NjRfdCBDb25uZWN0aW9uSWQ7CisKK2VudW0gOiBDb25uZWN0aW9uSWQgeworICAgIElOVkFMSURfQ09OTkVDVElPTklEID0gMCwKK307CisKK3R5cGVkZWYgYW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTxCdWZmZXJTdGF0dXNNZXNzYWdlLCBrU3luY2hyb25pemVkUmVhZFdyaXRlPiBCdWZmZXJTdGF0dXNRdWV1ZTsKK3R5cGVkZWYgQnVmZmVyU3RhdHVzUXVldWU6OkRlc2NyaXB0b3IgU3RhdHVzRGVzY3JpcHRvcjsKKwordHlwZWRlZiBhbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlPEJ1ZmZlckludmFsaWRhdGlvbk1lc3NhZ2UsIGtVbnN5bmNocm9uaXplZFdyaXRlPgorICAgICAgICBCdWZmZXJJbnZhbGlkYXRpb25RdWV1ZTsKK3R5cGVkZWYgQnVmZmVySW52YWxpZGF0aW9uUXVldWU6OkRlc2NyaXB0b3IgSW52YWxpZGF0aW9uRGVzY3JpcHRvcjsKKworLyoqCisgKiBBbGxvY2F0aW9uIHdyYXBwZXIgY2xhc3MgZm9yIGJ1ZmZlciBwb29sLgorICovCitzdHJ1Y3QgQnVmZmVyUG9vbEFsbG9jYXRpb24geworICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbUhhbmRsZTsKKworICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKCkgeworICAgICAgICByZXR1cm4gbUhhbmRsZTsKKyAgICB9CisKKyAgICBCdWZmZXJQb29sQWxsb2NhdGlvbihjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSkgOiBtSGFuZGxlKGhhbmRsZSkge30KKworICAgIH5CdWZmZXJQb29sQWxsb2NhdGlvbigpIHt9OworfTsKKworLyoqCisgKiBBbGxvY2F0b3Igd3JhcHBlciBjbGFzcyBmb3IgYnVmZmVyIHBvb2wuCisgKi8KK2NsYXNzIEJ1ZmZlclBvb2xBbGxvY2F0b3IgeworcHVibGljOgorCisgICAgLyoqCisgICAgICogQWxsb2NhdGUgYW4gYWxsb2NhdGlvbihidWZmZXIpIGZvciBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbXMgICAgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzCisgICAgICogQHBhcmFtIGFsbG9jICAgICBjcmVhdGVkIGFsbG9jYXRpb24KKyAgICAgKiBAcGFyYW0gYWxsb2NTaXplIHNpemUgb2YgY3JlYXRlZCBhbGxvY2F0aW9uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYW4gYWxsb2NhdGlvbiBpcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICphbGxvYywKKyAgICAgICAgICAgIHNpemVfdCAqYWxsb2NTaXplKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzIG9mIGFuIG9sZCBhbGxvY2F0aW9uIGFyZQorICAgICAqIGNvbXBhdGlibGUgd2l0aCBuZXcgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBjb21wYXRpYmxlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZuZXdQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm9sZFBhcmFtcykgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgQnVmZmVyUG9vbEFsbG9jYXRvcigpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgfkJ1ZmZlclBvb2xBbGxvY2F0b3IoKSA9IGRlZmF1bHQ7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQlVGRkVSUE9PTFRZUEVTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL2luY2x1ZGUvYnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmggYi9tZWRpYS9idWZmZXJwb29sLzIuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1M2MzMDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9DTElFTlRNQU5BR0VSX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQ0xJRU5UTUFOQUdFUl9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lDbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlICJCdWZmZXJQb29sVHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklBY2Nlc3NvcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpSZXN1bHRTdGF0dXM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworc3RydWN0IENsaWVudE1hbmFnZXIgOiBwdWJsaWMgSUNsaWVudE1hbmFnZXIgeworICAgIC8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUNsaWVudE1hbmFnZXIgZm9sbG93LgorICAgIFJldHVybjx2b2lkPiByZWdpc3RlclNlbmRlcihjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUFjY2Vzc29yPiYgYnVmZmVyUG9vbCwgcmVnaXN0ZXJTZW5kZXJfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgLyoqIEdldHMgYW4gaW5zdGFuY2UuICovCisgICAgc3RhdGljIHNwPENsaWVudE1hbmFnZXI+IGdldEluc3RhbmNlKCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbG9jYWwgY29ubmVjdGlvbiB3aXRoIGEgbmV3bHkgY3JlYXRlZCBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbGxvY2F0b3IgICAgIGZvciBuZXcgYnVmZmVyIGFsbG9jYXRpb24uCisgICAgICogQHBhcmFtIHBDb25uZWN0aW9uSWQgSWQgb2YgdGhlIGNyZWF0ZWQgY29ubmVjdGlvbi4gVGhpcyBpcworICAgICAqICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbS13aWRlIHVuaXF1ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciBwb29sIGFuZCBhIGxvY2FsIGNvbm5lY3Rpb24gaXMgc3VjY2Vzc2Z1bGx5CisgICAgICogICAgICAgICBjcmVhdGVkLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBjcmVhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpOworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYSBjcmVhdGVkIGNvbm5lY3Rpb24gYXMgc2VuZGVyIGZvciByZW1vdGUgcHJvY2Vzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWNlaXZlciAgICAgIFRoZSByZW1vdGUgcmVjZWl2aW5nIHByb2Nlc3MuCisgICAgICogQHBhcmFtIHNlbmRlcklkICAgICAgQSBsb2NhbCBjb25uZWN0aW9uIHdoaWNoIHdpbGwgc2VuZCBidWZmZXJzIHRvLgorICAgICAqIEBwYXJhbSByZWNlaXZlcklkICAgIElkIG9mIHRoZSBjcmVhdGVkIHJlY2VpdmluZyBjb25uZWN0aW9uIG9uIHRoZSByZWNlaXZlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gdGhlIHJlY2VpdmluZyBjb25uZWN0aW9uIGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIG9uIHRoZQorICAgICAqICAgICAgICAgcmVjZWl2ZXIgcHJvY2Vzcy4KKyAgICAgKiAgICAgICAgIE5PVF9GT1VORCB3aGVuIHRoZSBzZW5kZXIgY29ubmVjdGlvbiB3YXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgQUxSRUFEWV9FWElTVFMgdGhlIHJlY2VpdmluZyBjb25uZWN0aW9uIGlzIGFscmVhZHkgbWFkZS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgcmVnaXN0ZXJTZW5kZXIoY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+ICZyZWNlaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkIHNlbmRlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnJlY2VpdmVySWQpOworCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIFRoZSBpZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgY2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICAvKioKKyAgICAgKiBFdmljdHMgY2FjaGVkIGFsbG9jYXRpb25zLiBJZiBpdCdzIGxvY2FsIGNvbm5lY3Rpb24sIHJlbGVhc2UgdGhlCisgICAgICogcHJldmlvdXMgYWxsb2NhdGlvbnMgYW5kIGRvIG5vdCByZWN5Y2xlIGN1cnJlbnQgYWN0aXZlIGFsbG9jYXRpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCBUaGUgaWQgb2YgdGhlIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgcmVzZXR0ZWQuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgZmx1c2goQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZXMgYSBidWZmZXIgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBUaGUgaWQgb2YgdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHBhcmFtIHBhcmFtcyAgICAgICAgVGhlIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgKiBAcGFyYW0gaGFuZGxlICAgICAgICBUaGUgbmF0aXZlIGhhbmRsZSB0byB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4gaGFuZGxlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGNsb25lZCBiZWZvcmUgdXNlLgorICAgICAqIEBwYXJhbSBidWZmZXIgICAgICAgIFRoZSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIHdhcyBhbGxvY2F0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIC8qKgorICAgICAqIFJlY2VpdmVzIGEgYnVmZmVyIGZvciB0aGUgdHJhbnNhY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBUaGUgaWQgb2YgdGhlIHJlY2VpdmluZyBjb25uZWN0aW9uLgorICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbklkIFRoZSBpZCBmb3IgdGhlIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSBidWZmZXJJZCAgICAgIFRoZSBpZCBmb3IgdGhlIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gdGltZXN0YW1wVXMgICBUaGUgdGltZXN0YW1wIG9mIHRoZSBidWZmZXIgaXMgYmVpbmcgc2VudC4KKyAgICAgKiBAcGFyYW0gaGFuZGxlICAgICAgICBUaGUgbmF0aXZlIGhhbmRsZSB0byB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4gaGFuZGxlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGNsb25lZCBiZWZvcmUgdXNlLgorICAgICAqIEBwYXJhbSBidWZmZXIgICAgICAgIFRoZSByZWNlaXZlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgd2FzIHJlY2VpdmVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiAgICAgICAgIE5PVF9GT1VORCB3aGVuIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiB3YXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyByZWNlaXZlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgLyoqCisgICAgICogUG9zdHMgYSBidWZmZXIgdHJhbnNmZXIgdHJhbnNhY3Rpb24gdG8gdGhlIGJ1ZmZlciBwb29sLiBTZW5kcyBhIGJ1ZmZlcgorICAgICAqIHRvIG90aGVyIHJlbW90ZSBjbGllbnRzKGNvbm5lY3Rpb24pIGFmdGVyIHRoaXMgY2FsbCBoYXMgYmVlbiBzdWNjZWVkZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVjZWl2ZXJJZCAgICBUaGUgaWQgb2YgdGhlIHJlY2VpdmluZyBjb25uZWN0aW9uLgorICAgICAqIEBwYXJhbSBidWZmZXIgICAgICAgIHRvIHRyYW5zZmVyCisgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uSWQgSWQgb2YgdGhlIHRyYW5zZmVyIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSB0aW1lc3RhbXBVcyAgIFRoZSB0aW1lc3RhbXAgb2YgdGhlIGJ1ZmZlciB0cmFuc2FjdGlvbiBpcyBiZWluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBvc3RlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciB0cmFuc2FjdGlvbiB3YXMgcG9zdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiAgICAgICAgIE5PVF9GT1VORCB3aGVuIHRoZSBzZW5kaW5nIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgcG9zdFNlbmQoQ29ubmVjdGlvbklkIHJlY2VpdmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZXN0YW1wVXMpOworCisgICAgLyoqCisgICAgICogIFRpbWUgb3V0IGluYWN0aXZlIGxpbmdlcmluZyBjb25uZWN0aW9ucyBhbmQgY2xvc2UuCisgICAgICovCisgICAgdm9pZCBjbGVhblVwKCk7CisKKyAgICAvKiogRGVzdHJ1Y3RzIHRoZSBtYW5hZ2VyIG9mIGJ1ZmZlciBwb29sIGNsaWVudHMuICAqLworICAgIH5DbGllbnRNYW5hZ2VyKCk7Citwcml2YXRlOgorICAgIHN0YXRpYyBzcDxDbGllbnRNYW5hZ2VyPiBzSW5zdGFuY2U7CisgICAgc3RhdGljIHN0ZDo6bXV0ZXggc0luc3RhbmNlTG9jazsKKworICAgIGNsYXNzIEltcGw7CisgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEltcGw+IG1JbXBsOworCisgICAgQ2xpZW50TWFuYWdlcigpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0NMSUVOVE1BTkFHRVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI0NGY2MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNWbmRrSGlkbEJ1ZmZlcnBvb2xWMl8wVGFyZ2V0U2luZ2xlVGVzdCIsCisgICAgZGVmYXVsdHM6IFsiVnRzSGFsVGFyZ2V0VGVzdERlZmF1bHRzIl0sCisgICAgc3JjczogWworICAgICAgICAiYWxsb2NhdG9yLmNwcCIsCisgICAgICAgICJzaW5nbGUuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMCIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliZm1xIiwKKyAgICBdLAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJib3RoIiwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlZ0c1ZuZGtIaWRsQnVmZmVycG9vbFYyXzBUYXJnZXRNdWx0aVRlc3QiLAorICAgIGRlZmF1bHRzOiBbIlZ0c0hhbFRhcmdldFRlc3REZWZhdWx0cyJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgImFsbG9jYXRvci5jcHAiLAorICAgICAgICAibXVsdGkuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMCIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliZm1xIiwKKyAgICBdLAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJib3RoIiwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL09XTkVSUyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzMzZTBjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvT1dORVJTCkBAIC0wLDAgKzEsOSBAQAorIyBNZWRpYSB0ZWFtCitsYWpvc0Bnb29nbGUuY29tCitwYXdpbkBnb29nbGUuY29tCit0YWtsZWVAZ29vZ2xlLmNvbQord29uc2lrQGdvb2dsZS5jb20KKworIyBWVFMgdGVhbQoreWltQGdvb2dsZS5jb20KK3podW95YW9AZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvYWxsb2NhdG9yLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL2FsbG9jYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQzZjdlYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL2FsbG9jYXRvci5jcHAKQEAgLTAsMCArMSwyMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Y3V0aWxzL2FzaG1lbS5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSAiYWxsb2NhdG9yLmgiCisKK3VuaW9uIFBhcmFtcyB7CisgIHN0cnVjdCB7CisgICAgdWludDMyX3QgY2FwYWNpdHk7CisgIH0gZGF0YTsKKyAgdWludDhfdCBhcnJheVswXTsKKyAgUGFyYW1zKCkgOiBkYXRhezB9IHt9CisgIFBhcmFtcyh1aW50MzJfdCBzaXplKQorICAgICAgOiBkYXRhe3NpemV9IHt9Cit9OworCisKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBIYW5kbGVBc2htZW0gOiBwdWJsaWMgbmF0aXZlX2hhbmRsZV90IHsKKyAgSGFuZGxlQXNobWVtKGludCBhc2htZW1GZCwgc2l6ZV90IHNpemUpCisgICAgOiBuYXRpdmVfaGFuZGxlX3QoY0hlYWRlciksCisgICAgbUZkc3sgYXNobWVtRmQgfSwKKyAgICBtSW50c3sgaW50IChzaXplICYgMHhGRkZGRkZGRiksIGludCgodWludDY0X3Qoc2l6ZSkgPj4gMzIpICYgMHhGRkZGRkZGRiksIGtNYWdpYyB9IHt9CisKKyAgaW50IGFzaG1lbUZkKCkgY29uc3QgeyByZXR1cm4gbUZkcy5tQXNobWVtOyB9CisgIHNpemVfdCBzaXplKCkgY29uc3QgeworICAgIHJldHVybiBzaXplX3QodW5zaWduZWQobUludHMubVNpemVMbykpCisgICAgICAgIHwgc2l6ZV90KHVpbnQ2NF90KHVuc2lnbmVkKG1JbnRzLm1TaXplSGkpKSA8PCAzMik7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc1ZhbGlkKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqIGNvbnN0IG8pOworCitwcm90ZWN0ZWQ6CisgIHN0cnVjdCB7CisgICAgaW50IG1Bc2htZW07CisgIH0gbUZkczsKKyAgc3RydWN0IHsKKyAgICBpbnQgbVNpemVMbzsKKyAgICBpbnQgbVNpemVIaTsKKyAgICBpbnQgbU1hZ2ljOworICB9IG1JbnRzOworCitwcml2YXRlOgorICBlbnVtIHsKKyAgICBrTWFnaWMgPSAnYWhtXHgwMCcsCisgICAgbnVtRmRzID0gc2l6ZW9mKG1GZHMpIC8gc2l6ZW9mKGludCksCisgICAgbnVtSW50cyA9IHNpemVvZihtSW50cykgLyBzaXplb2YoaW50KSwKKyAgICB2ZXJzaW9uID0gc2l6ZW9mKG5hdGl2ZV9oYW5kbGVfdCkKKyAgfTsKKyAgY29uc3Qgc3RhdGljIG5hdGl2ZV9oYW5kbGVfdCBjSGVhZGVyOworfTsKKworY29uc3QgbmF0aXZlX2hhbmRsZV90IEhhbmRsZUFzaG1lbTo6Y0hlYWRlciA9IHsKKyAgSGFuZGxlQXNobWVtOjp2ZXJzaW9uLAorICBIYW5kbGVBc2htZW06Om51bUZkcywKKyAgSGFuZGxlQXNobWVtOjpudW1JbnRzLAorICB7fQorfTsKKworYm9vbCBIYW5kbGVBc2htZW06OmlzVmFsaWQoY29uc3QgbmF0aXZlX2hhbmRsZV90ICogY29uc3QgbykgeworICBpZiAoIW8gfHwgbWVtY21wKG8sICZjSGVhZGVyLCBzaXplb2YoY0hlYWRlcikpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEhhbmRsZUFzaG1lbSAqb3RoZXIgPSBzdGF0aWNfY2FzdDxjb25zdCBIYW5kbGVBc2htZW0qPihvKTsKKyAgcmV0dXJuIG90aGVyLT5tSW50cy5tTWFnaWMgPT0ga01hZ2ljOworfQorCitjbGFzcyBBbGxvY2F0aW9uQXNobWVtIHsKK3ByaXZhdGU6CisgIEFsbG9jYXRpb25Bc2htZW0oaW50IGFzaG1lbUZkLCBzaXplX3QgY2FwYWNpdHksIGJvb2wgcmVzKQorICAgIDogbUhhbmRsZShhc2htZW1GZCwgY2FwYWNpdHkpLAorICAgICAgbUluaXQocmVzKSB7fQorCitwdWJsaWM6CisgIHN0YXRpYyBBbGxvY2F0aW9uQXNobWVtICpBbGxvYyhzaXplX3Qgc2l6ZSkgeworICAgIGNvbnN0ZXhwciBzdGF0aWMgY29uc3QgY2hhciAqa0FsbG9jYXRpb25UYWcgPSAiYnVmZmVycG9vbF90ZXN0IjsKKyAgICBpbnQgYXNobWVtRmQgPSBhc2htZW1fY3JlYXRlX3JlZ2lvbihrQWxsb2NhdGlvblRhZywgc2l6ZSk7CisgICAgcmV0dXJuIG5ldyBBbGxvY2F0aW9uQXNobWVtKGFzaG1lbUZkLCBzaXplLCBhc2htZW1GZCA+PSAwKTsKKyAgfQorCisgIH5BbGxvY2F0aW9uQXNobWVtKCkgeworICAgIGlmIChtSW5pdCkgeworICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZSgmbUhhbmRsZSk7CisgICAgfQorICB9CisKKyAgY29uc3QgSGFuZGxlQXNobWVtICpoYW5kbGUoKSB7CisgICAgcmV0dXJuICZtSGFuZGxlOworICB9CisKK3ByaXZhdGU6CisgIEhhbmRsZUFzaG1lbSBtSGFuZGxlOworICBib29sIG1Jbml0OworICAvLyBUT0RPOiBtYXBwaW5nIGFuZCBtYXAgZmQKK307CisKK3N0cnVjdCBBbGxvY2F0aW9uRHRvciB7CisgIEFsbG9jYXRpb25EdG9yKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBbGxvY2F0aW9uQXNobWVtPiAmYWxsb2MpCisgICAgICA6IG1BbGxvYyhhbGxvYykge30KKworICB2b2lkIG9wZXJhdG9yKCkoQnVmZmVyUG9vbEFsbG9jYXRpb24gKnBvb2xBbGxvYykgeyBkZWxldGUgcG9vbEFsbG9jOyB9CisKKyAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFsbG9jYXRpb25Bc2htZW0+IG1BbGxvYzsKK307CisKK30KKworCitSZXN1bHRTdGF0dXMgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OmFsbG9jYXRlKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAqYWxsb2MsCisgICAgc2l6ZV90ICphbGxvY1NpemUpIHsKKyAgUGFyYW1zIGFzaG1lbVBhcmFtczsKKyAgbWVtY3B5KCZhc2htZW1QYXJhbXMsIHBhcmFtcy5kYXRhKCksIHN0ZDo6bWluKHNpemVvZihQYXJhbXMpLCBwYXJhbXMuc2l6ZSgpKSk7CisKKyAgc3RkOjpzaGFyZWRfcHRyPEFsbG9jYXRpb25Bc2htZW0+IGFzaG1lbUFsbG9jID0KKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxBbGxvY2F0aW9uQXNobWVtPigKKyAgICAgICAgICBBbGxvY2F0aW9uQXNobWVtOjpBbGxvYyhhc2htZW1QYXJhbXMuZGF0YS5jYXBhY2l0eSkpOworICBpZiAoYXNobWVtQWxsb2MpIHsKKyAgICBCdWZmZXJQb29sQWxsb2NhdGlvbiAqcHRyID0gbmV3IEJ1ZmZlclBvb2xBbGxvY2F0aW9uKGFzaG1lbUFsbG9jLT5oYW5kbGUoKSk7CisgICAgaWYgKHB0cikgeworICAgICAgKmFsbG9jID0gc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPihwdHIsIEFsbG9jYXRpb25EdG9yKGFzaG1lbUFsbG9jKSk7CisgICAgICBpZiAoKmFsbG9jKSB7CisgICAgICAgICAgKmFsbG9jU2l6ZSA9IGFzaG1lbVBhcmFtcy5kYXRhLmNhcGFjaXR5OworICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgfQorICAgICAgZGVsZXRlIHB0cjsKKyAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK2Jvb2wgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OmNvbXBhdGlibGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm5ld1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmb2xkUGFyYW1zKSB7CisgIHNpemVfdCBuZXdTaXplID0gbmV3UGFyYW1zLnNpemUoKTsKKyAgc2l6ZV90IG9sZFNpemUgPSBvbGRQYXJhbXMuc2l6ZSgpOworICBpZiAobmV3U2l6ZSA9PSBvbGRTaXplKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuZXdTaXplOyArK2kpIHsKKyAgICAgIGlmIChuZXdQYXJhbXNbaV0gIT0gb2xkUGFyYW1zW2ldKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpGaWxsKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlLCBjb25zdCB1bnNpZ25lZCBjaGFyIHZhbCkgeworICBpZiAoIUhhbmRsZUFzaG1lbTo6aXNWYWxpZChoYW5kbGUpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEhhbmRsZUFzaG1lbSAqbyA9IHN0YXRpY19jYXN0PGNvbnN0IEhhbmRsZUFzaG1lbSo+KGhhbmRsZSk7CisgIHVuc2lnbmVkIGNoYXIgKnB0ciA9ICh1bnNpZ25lZCBjaGFyICopbW1hcCgKKyAgICAgIE5VTEwsIG8tPnNpemUoKSwgUFJPVF9SRUFEfFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIG8tPmFzaG1lbUZkKCksIDApOworCisgIGlmIChwdHIgIT0gTUFQX0ZBSUxFRCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgby0+c2l6ZSgpOyArK2kpIHsKKyAgICAgIHB0cltpXSA9IHZhbDsKKyAgICB9CisgICAgbXVubWFwKHB0ciwgby0+c2l6ZSgpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OlZlcmlmeShjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSwgY29uc3QgdW5zaWduZWQgY2hhciB2YWwpIHsKKyAgaWYgKCFIYW5kbGVBc2htZW06OmlzVmFsaWQoaGFuZGxlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBIYW5kbGVBc2htZW0gKm8gPSBzdGF0aWNfY2FzdDxjb25zdCBIYW5kbGVBc2htZW0qPihoYW5kbGUpOworICB1bnNpZ25lZCBjaGFyICpwdHIgPSAodW5zaWduZWQgY2hhciAqKW1tYXAoCisgICAgICBOVUxMLCBvLT5zaXplKCksIFBST1RfUkVBRCwgTUFQX1NIQVJFRCwgby0+YXNobWVtRmQoKSwgMCk7CisKKyAgaWYgKHB0ciAhPSBNQVBfRkFJTEVEKSB7CisgICAgYm9vbCByZXMgPSB0cnVlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgby0+c2l6ZSgpOyArK2kpIHsKKyAgICAgIGlmIChwdHJbaV0gIT0gdmFsKSB7CisgICAgICAgIHJlcyA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgbXVubWFwKHB0ciwgby0+c2l6ZSgpKTsKKyAgICByZXR1cm4gcmVzOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpwYXJhbXMpIHsKKyAgY29uc3RleHByIHN0YXRpYyBpbnQga0FsbG9jYXRpb25TaXplID0gMTAyNCAqIDEwOworICBQYXJhbXMgYXNobWVtUGFyYW1zKGtBbGxvY2F0aW9uU2l6ZSk7CisKKyAgcGFyYW1zLT5hc3NpZ24oYXNobWVtUGFyYW1zLmFycmF5LCBhc2htZW1QYXJhbXMuYXJyYXkgKyBzaXplb2YoYXNobWVtUGFyYW1zKSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9hbGxvY2F0b3IuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL2FsbG9jYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyODFkYzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9hbGxvY2F0b3IuaApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBWTkRLX0hJRExfQlVGRkVSUE9PTF9WMl8wX0FMTE9DQVRPUl9ICisjZGVmaW5lIFZOREtfSElETF9CVUZGRVJQT09MX1YyXzBfQUxMT0NBVE9SX0gKKworI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmg+CisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6CisgICAgQnVmZmVyUG9vbEFsbG9jYXRpb247Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjoKKyAgICBCdWZmZXJQb29sQWxsb2NhdG9yOworCisvLyBidWZmZXIgYWxsb2NhdG9yIGZvciB0aGUgdGVzdHMKK2NsYXNzIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yIDogcHVibGljIEJ1ZmZlclBvb2xBbGxvY2F0b3IgeworIHB1YmxpYzoKKyAgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3IoKSB7fQorCisgIH5UZXN0QnVmZmVyUG9vbEFsbG9jYXRvcigpIG92ZXJyaWRlIHt9CisKKyAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICphbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqYWxsb2NTaXplKSBvdmVycmlkZTsKKworICBib29sIGNvbXBhdGlibGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm5ld1BhcmFtcywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZvbGRQYXJhbXMpIG92ZXJyaWRlOworCisgIHN0YXRpYyBib29sIEZpbGwoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgdmFsKTsKKworICBzdGF0aWMgYm9vbCBWZXJpZnkoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgdmFsKTsKKworfTsKKworLy8gcmV0cmlldmUgYnVmZmVyIGFsbG9jYXRvciBwYXJhbXRlcnMKK3ZvaWQgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcyhzdGQ6OnZlY3Rvcjx1aW50OF90PiAqcGFyYW1zKTsKKworI2VuZGlmICAvLyBWTkRLX0hJRExfQlVGRkVSUE9PTF9WMl8wX0FMTE9DQVRPUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9tdWx0aS5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9tdWx0aS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhiNjk5MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL211bHRpLmNwcApAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiYnVmZmZlcnBvb2xfdW5pdF90ZXN0IgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9MZWdhY3lTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSAiYWxsb2NhdG9yLmgiCisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjb25maWd1cmVScGNUaHJlYWRwb29sOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQ2xpZW50TWFuYWdlcjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6QnVmZmVySWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpDbGllbnRNYW5hZ2VyOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6Q29ubmVjdGlvbklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6VHJhbnNhY3Rpb25JZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6QnVmZmVyUG9vbERhdGE7CisKK25hbWVzcGFjZSB7CisKKy8vIGNvbW11bmljYXRpb24gbWVzc2FnZSB0eXBlcyBiZXR3ZWVuIHByb2Nlc3Nlcy4KK2VudW0gUGlwZUNvbW1hbmQgOiBpbnQzMl90IHsKKyAgICBJTklUX09LID0gMCwKKyAgICBJTklUX0VSUk9SLAorICAgIFNFTkQsCisgICAgUkVDRUlWRV9PSywKKyAgICBSRUNFSVZFX0VSUk9SLAorfTsKKworLy8gY29tbXVuaWNhdGlvbiBtZXNzYWdlIGJldHdlZW4gcHJvY2Vzc2VzLgordW5pb24gUGlwZU1lc3NhZ2UgeworICAgIHN0cnVjdCAgeworICAgICAgICBpbnQzMl90IGNvbW1hbmQ7CisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkOworICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkOworICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQ7CisgICAgICAgIGludDY0X3QgIHRpbWVzdGFtcFVzOworICAgIH0gZGF0YTsKKyAgICBjaGFyIGFycmF5WzBdOworfTsKKworLy8gbWVkaWEuYnVmZmVycG9vbCB0ZXN0IHNldHVwCitjbGFzcyBCdWZmZXJwb29sTXVsdGlUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgICBtUmVjZWl2ZXJQaWQgPSAtMTsKKyAgICBtQ29ubmVjdGlvblZhbGlkID0gZmFsc2U7CisKKyAgICBBU1NFUlRfVFJVRShwaXBlKG1Db21tYW5kUGlwZUZkcykgPT0gMCk7CisgICAgQVNTRVJUX1RSVUUocGlwZShtUmVzdWx0UGlwZUZkcykgPT0gMCk7CisKKyAgICBtUmVjZWl2ZXJQaWQgPSBmb3JrKCk7CisgICAgQVNTRVJUX1RSVUUobVJlY2VpdmVyUGlkID49IDApOworCisgICAgaWYgKG1SZWNlaXZlclBpZCA9PSAwKSB7CisgICAgICBkb1JlY2VpdmVyKCk7CisgICAgICAvLyBJbiBvcmRlciB0byBpZ25vcmUgZ3Rlc3QgYmVoYXZpb3VyLCB3YWl0IGZvciBiZWluZyBraWxsZWQgZnJvbQorICAgICAgLy8gdGVhckRvd24KKyAgICAgIHBhdXNlKCk7CisgICAgfQorCisgICAgbU1hbmFnZXIgPSBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworICAgIEFTU0VSVF9ORShtTWFuYWdlciwgbnVsbHB0cik7CisKKyAgICBtQWxsb2NhdG9yID0gc3RkOjptYWtlX3NoYXJlZDxUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcj4oKTsKKyAgICBBU1NFUlRfVFJVRSgoYm9vbCltQWxsb2NhdG9yKTsKKworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5jcmVhdGUobUFsbG9jYXRvciwgJm1Db25uZWN0aW9uSWQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgICBtQ29ubmVjdGlvblZhbGlkID0gdHJ1ZTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICBpZiAobVJlY2VpdmVyUGlkID4gMCkgeworICAgICAga2lsbChtUmVjZWl2ZXJQaWQsIFNJR0tJTEwpOworICAgICAgaW50IHdzdGF0dXM7CisgICAgICB3YWl0KCZ3c3RhdHVzKTsKKyAgICB9CisKKyAgICBpZiAobUNvbm5lY3Rpb25WYWxpZCkgeworICAgICAgbU1hbmFnZXItPmNsb3NlKG1Db25uZWN0aW9uSWQpOworICAgIH0KKyAgfQorCisgcHJvdGVjdGVkOgorICBzdGF0aWMgdm9pZCBkZXNjcmlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRpb24pIHsKKyAgICBSZWNvcmRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgIH0KKworICBhbmRyb2lkOjpzcDxDbGllbnRNYW5hZ2VyPiBtTWFuYWdlcjsKKyAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisgIGJvb2wgbUNvbm5lY3Rpb25WYWxpZDsKKyAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7CisgIHBpZF90IG1SZWNlaXZlclBpZDsKKyAgaW50IG1Db21tYW5kUGlwZUZkc1syXTsKKyAgaW50IG1SZXN1bHRQaXBlRmRzWzJdOworCisgIGJvb2wgc2VuZE1lc3NhZ2UoaW50ICpwaXBlcywgY29uc3QgUGlwZU1lc3NhZ2UgJm1lc3NhZ2UpIHsKKyAgICBpbnQgcmV0ID0gd3JpdGUocGlwZXNbMV0sIG1lc3NhZ2UuYXJyYXksIHNpemVvZihQaXBlTWVzc2FnZSkpOworICAgIHJldHVybiByZXQgPT0gc2l6ZW9mKFBpcGVNZXNzYWdlKTsKKyAgfQorCisgIGJvb2wgcmVjZWl2ZU1lc3NhZ2UoaW50ICpwaXBlcywgUGlwZU1lc3NhZ2UgKm1lc3NhZ2UpIHsKKyAgICBpbnQgcmV0ID0gcmVhZChwaXBlc1swXSwgbWVzc2FnZS0+YXJyYXksIHNpemVvZihQaXBlTWVzc2FnZSkpOworICAgIHJldHVybiByZXQgPT0gc2l6ZW9mKFBpcGVNZXNzYWdlKTsKKyAgfQorCisgIHZvaWQgZG9SZWNlaXZlcigpIHsKKyAgICBjb25maWd1cmVScGNUaHJlYWRwb29sKDEsIGZhbHNlKTsKKyAgICBQaXBlTWVzc2FnZSBtZXNzYWdlOworICAgIG1NYW5hZ2VyID0gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKKyAgICBpZiAoIW1NYW5hZ2VyKSB7CisgICAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpJTklUX0VSUk9SOworICAgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBhbmRyb2lkOjpzdGF0dXNfdCBzdGF0dXMgPSBtTWFuYWdlci0+cmVnaXN0ZXJBc1NlcnZpY2UoKTsKKyAgICBpZiAoc3RhdHVzICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpJTklUX0VSUk9SOworICAgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpJTklUX09LOworICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKworICAgIHJlY2VpdmVNZXNzYWdlKG1Db21tYW5kUGlwZUZkcywgJm1lc3NhZ2UpOworICAgIHsKKyAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqcmhhbmRsZSA9IG51bGxwdHI7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IHJidWZmZXI7CisgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbU1hbmFnZXItPnJlY2VpdmUoCisgICAgICAgICAgbWVzc2FnZS5kYXRhLmNvbm5lY3Rpb25JZCwgbWVzc2FnZS5kYXRhLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgbWVzc2FnZS5kYXRhLmJ1ZmZlcklkLCBtZXNzYWdlLmRhdGEudGltZXN0YW1wVXMsICZyaGFuZGxlLCAmcmJ1ZmZlcik7CisgICAgICBtTWFuYWdlci0+Y2xvc2UobWVzc2FnZS5kYXRhLmNvbm5lY3Rpb25JZCk7CisgICAgICBpZiAoc3RhdHVzICE9IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgaWYgKCFUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6VmVyaWZ5KHJoYW5kbGUsIDB4NzcpKSB7CisgICAgICAgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6UkVDRUlWRV9FUlJPUjsKKyAgICAgICAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OlJFQ0VJVkVfT0s7CisgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICB9Cit9OworCisvLyBCdWZmZXIgdHJhbnNmZXIgdGVzdCBiZXR3ZWVuIHByb2Nlc3Nlcy4KK1RFU1RfRihCdWZmZXJwb29sTXVsdGlUZXN0LCBUcmFuc2ZlckJ1ZmZlcikgeworICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICBQaXBlTWVzc2FnZSBtZXNzYWdlOworCisgIEFTU0VSVF9UUlVFKHJlY2VpdmVNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCAmbWVzc2FnZSkpOworCisgIGFuZHJvaWQ6OnNwPElDbGllbnRNYW5hZ2VyPiByZWNlaXZlciA9IElDbGllbnRNYW5hZ2VyOjpnZXRTZXJ2aWNlKCk7CisgIENvbm5lY3Rpb25JZCByZWNlaXZlcklkOworICBBU1NFUlRfVFJVRSgoYm9vbClyZWNlaXZlcik7CisKKyAgc3RhdHVzID0gbU1hbmFnZXItPnJlZ2lzdGVyU2VuZGVyKHJlY2VpdmVyLCBtQ29ubmVjdGlvbklkLCAmcmVjZWl2ZXJJZCk7CisgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgeworICAgIG5hdGl2ZV9oYW5kbGVfdCAqc2hhbmRsZSA9IG51bGxwdHI7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBzYnVmZmVyOworICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZDsKKyAgICBpbnQ2NF90IHBvc3RVczsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWNQYXJhbXM7CisKKyAgICBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKCZ2ZWNQYXJhbXMpOworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCB2ZWNQYXJhbXMsICZzaGFuZGxlLCAmc2J1ZmZlcik7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworCisgICAgQVNTRVJUX1RSVUUoVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OkZpbGwoc2hhbmRsZSwgMHg3NykpOworCisgICAgc3RhdHVzID0gbU1hbmFnZXItPnBvc3RTZW5kKHJlY2VpdmVySWQsIHNidWZmZXIsICZ0cmFuc2FjdGlvbklkLCAmcG9zdFVzKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisKKyAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpTRU5EOworICAgIG1lc3NhZ2UuZGF0YS5idWZmZXJJZCA9IHNidWZmZXItPm1JZDsKKyAgICBtZXNzYWdlLmRhdGEuY29ubmVjdGlvbklkID0gcmVjZWl2ZXJJZDsKKyAgICBtZXNzYWdlLmRhdGEudHJhbnNhY3Rpb25JZCA9IHRyYW5zYWN0aW9uSWQ7CisgICAgbWVzc2FnZS5kYXRhLnRpbWVzdGFtcFVzID0gcG9zdFVzOworICAgIHNlbmRNZXNzYWdlKG1Db21tYW5kUGlwZUZkcywgbWVzc2FnZSk7CisgIH0KKyAgRVhQRUNUX1RSVUUocmVjZWl2ZU1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsICZtZXNzYWdlKSk7Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIHNldGVudigiVFJFQkxFX1RFU1RJTkdfT1ZFUlJJREUiLCAidHJ1ZSIsIHRydWUpOworICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgTE9HKElORk8pIDw8ICJUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOworICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvc2luZ2xlLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL3NpbmdsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc3ZWRjZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL3NpbmdsZS5jcHAKQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgImJ1ZmZmZXJwb29sX3VuaXRfdGVzdCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvTGVnYWN5U3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJhbGxvY2F0b3IuaCIKKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpSZXN1bHRTdGF0dXM7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpCdWZmZXJJZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkNsaWVudE1hbmFnZXI7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpDb25uZWN0aW9uSWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpUcmFuc2FjdGlvbklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpCdWZmZXJQb29sRGF0YTsKKworbmFtZXNwYWNlIHsKKworLy8gTnVtYmVyIG9mIGl0ZXJhdGlvbiBmb3IgYnVmZmVyIGFsbG9jYXRpb24gdGVzdC4KK2NvbnN0ZXhwciBzdGF0aWMgaW50IGtOdW1BbGxvY2F0aW9uVGVzdCA9IDM7CisKKy8vIE51bWJlciBvZiBpdGVyYXRpb24gZm9yIGJ1ZmZlciByZWN5Y2xpbmcgdGVzdC4KK2NvbnN0ZXhwciBzdGF0aWMgaW50IGtOdW1SZWN5Y2xlVGVzdCA9IDM7CisKKy8vIG1lZGlhLmJ1ZmZlcnBvb2wgdGVzdCBzZXR1cAorY2xhc3MgQnVmZmVycG9vbFNpbmdsZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICAgIG1Db25uZWN0aW9uVmFsaWQgPSBmYWxzZTsKKworICAgIG1NYW5hZ2VyID0gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKKyAgICBBU1NFUlRfTkUobU1hbmFnZXIsIG51bGxwdHIpOworCisgICAgbUFsbG9jYXRvciA9IHN0ZDo6bWFrZV9zaGFyZWQ8VGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I+KCk7CisgICAgQVNTRVJUX1RSVUUoKGJvb2wpbUFsbG9jYXRvcik7CisKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+Y3JlYXRlKG1BbGxvY2F0b3IsICZtQ29ubmVjdGlvbklkKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisKKyAgICBtQ29ubmVjdGlvblZhbGlkID0gdHJ1ZTsKKworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWdpc3RlclNlbmRlcihtTWFuYWdlciwgbUNvbm5lY3Rpb25JZCwgJm1SZWNlaXZlcklkKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpBTFJFQURZX0VYSVNUUyAmJgorICAgICAgICAgICAgICAgIG1SZWNlaXZlcklkID09IG1Db25uZWN0aW9uSWQpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgIGlmIChtQ29ubmVjdGlvblZhbGlkKSB7CisgICAgICBtTWFuYWdlci0+Y2xvc2UobUNvbm5lY3Rpb25JZCk7CisgICAgfQorICB9CisKKyBwcm90ZWN0ZWQ6CisgIHN0YXRpYyB2b2lkIGRlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjcmlwdGlvbikgeworICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgfQorCisgIGFuZHJvaWQ6OnNwPENsaWVudE1hbmFnZXI+IG1NYW5hZ2VyOworICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKyAgYm9vbCBtQ29ubmVjdGlvblZhbGlkOworICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKKyAgQ29ubmVjdGlvbklkIG1SZWNlaXZlcklkOworCit9OworCisvLyBCdWZmZXIgYWxsb2NhdGlvbiB0ZXN0LgorLy8gQ2hlY2sgd2hldGhlciBlYWNoIGJ1ZmZlciBhbGxvY2F0aW9uIGlzIGRvbmUgc3VjY2Vzc2Z1bGx5IHdpdGgKKy8vIHVuaXF1ZSBidWZmZXIgaWQuCitURVNUX0YoQnVmZmVycG9vbFNpbmdsZVRlc3QsIEFsbG9jYXRlQnVmZmVyKSB7CisgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlY1BhcmFtczsKKyAgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcygmdmVjUGFyYW1zKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJ1ZmZlcltrTnVtQWxsb2NhdGlvblRlc3RdOworICBuYXRpdmVfaGFuZGxlX3QgKmFsbG9jSGFuZGxlID0gbnVsbHB0cjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtQWxsb2NhdGlvblRlc3Q7ICsraSkgeworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCB2ZWNQYXJhbXMsICZhbGxvY0hhbmRsZSwgJmJ1ZmZlcltpXSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwga051bUFsbG9jYXRpb25UZXN0OyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCBrTnVtQWxsb2NhdGlvblRlc3Q7ICsraikgeworICAgICAgQVNTRVJUX1RSVUUoYnVmZmVyW2ldLT5tSWQgIT0gYnVmZmVyW2pdLT5tSWQpOworICAgIH0KKyAgfQorICBFWFBFQ1RfVFJVRShrTnVtQWxsb2NhdGlvblRlc3QgPiAxKTsKK30KKworLy8gQnVmZmVyIHJlY3ljbGUgdGVzdC4KKy8vIENoZWNrIHdoZXRoZXIgZGUtYWxsb2NhdGVkIGJ1ZmZlcnMgYXJlIHJlY3ljbGVkLgorVEVTVF9GKEJ1ZmZlcnBvb2xTaW5nbGVUZXN0LCBSZWN5Y2xlQnVmZmVyKSB7CisgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlY1BhcmFtczsKKyAgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcygmdmVjUGFyYW1zKTsKKworICBCdWZmZXJJZCBiaWRba051bVJlY3ljbGVUZXN0XTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtUmVjeWNsZVRlc3Q7ICsraSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gYnVmZmVyOworICAgIG5hdGl2ZV9oYW5kbGVfdCAqYWxsb2NIYW5kbGUgPSBudWxscHRyOworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCB2ZWNQYXJhbXMsICZhbGxvY0hhbmRsZSwgJmJ1ZmZlcik7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICAgIGJpZFtpXSA9IGJ1ZmZlci0+bUlkOworICB9CisgIGZvciAoaW50IGkgPSAxOyBpIDwga051bVJlY3ljbGVUZXN0OyArK2kpIHsKKyAgICBBU1NFUlRfVFJVRShiaWRbaSAtIDFdID09IGJpZFtpXSk7CisgIH0KKyAgRVhQRUNUX1RSVUUoa051bVJlY3ljbGVUZXN0ID4gMSk7Cit9CisKKy8vIEJ1ZmZlciB0cmFuc2ZlciB0ZXN0LgorLy8gQ2hlY2sgd2hldGhlciBidWZmZXIgaXMgdHJhbnNmZXJyZWQgdG8gYW5vdGhlciBjbGllbnQgc3VjY2Vzc2Z1bGx5LgorVEVTVF9GKEJ1ZmZlcnBvb2xTaW5nbGVUZXN0LCBUcmFuc2ZlckJ1ZmZlcikgeworICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWNQYXJhbXM7CisgIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoJnZlY1BhcmFtcyk7CisgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gc2J1ZmZlciwgcmJ1ZmZlcjsKKyAgbmF0aXZlX2hhbmRsZV90ICphbGxvY0hhbmRsZSA9IG51bGxwdHI7CisgIG5hdGl2ZV9oYW5kbGVfdCAqcmVjdkhhbmRsZSA9IG51bGxwdHI7CisKKyAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkOworICBpbnQ2NF90IHBvc3RVczsKKworICBzdGF0dXMgPSBtTWFuYWdlci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgdmVjUGFyYW1zLCAmYWxsb2NIYW5kbGUsICZzYnVmZmVyKTsKKyAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICBBU1NFUlRfVFJVRShUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6RmlsbChhbGxvY0hhbmRsZSwgMHg3NykpOworICBzdGF0dXMgPSBtTWFuYWdlci0+cG9zdFNlbmQobVJlY2VpdmVySWQsIHNidWZmZXIsICZ0cmFuc2FjdGlvbklkLCAmcG9zdFVzKTsKKyAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICBzdGF0dXMgPSBtTWFuYWdlci0+cmVjZWl2ZShtUmVjZWl2ZXJJZCwgdHJhbnNhY3Rpb25JZCwgc2J1ZmZlci0+bUlkLCBwb3N0VXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWN2SGFuZGxlLCAmcmJ1ZmZlcik7CisgIEVYUEVDVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgQVNTRVJUX1RSVUUoVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OlZlcmlmeShyZWN2SGFuZGxlLCAweDc3KSk7Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICBMT0coSU5GTykgPDwgIlRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CisgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvQW5kcm9pZC5tayBiL21lZGlhL2NvZGVjMi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZDczOWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQ4IEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIERPQ1VNRU5UQVRJT04gR0VORVJBVElPTgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQzJfUk9PVCA6PSAkKGNhbGwgbXktZGlyKQorCitDMl9ET0NTX1JPT1QgOj0gJChPVVRfRElSKS90YXJnZXQvY29tbW9uL2RvY3MvY29kZWMyCisKK0MyX09VVF9URU1QIDo9ICQoUFJPRFVDVF9PVVQpL2dlbi9FVEMvQ29kZWMyLWRvY3NfaW50ZXJtZWRpYXRlcworCitDMl9ET1hZIDo9ICQob3IgJChzaGVsbCBjb21tYW5kIC12IGRveHlnZW4pLFwKKwkJJChzaGVsbCBjb21tYW5kIC12IC9BcHBsaWNhdGlvbnMvRG94eWdlbi5hcHAvQ29udGVudHMvUmVzb3VyY2VzL2RveHlnZW4pKQorCisuUEhPTlk6IGNoZWNrLWRveHlnZW4KK2NoZWNrLWRveHlnZW46CitpZm5kZWYgQzJfRE9YWQorCSQoZXJyb3IgJ2RveHlnZW4gaXMgbm90IGF2YWlsYWJsZScpCitlbmRpZgorCiskKEMyX09VVF9URU1QKS9kb3h5LWFwaS5jb25maWc6ICQoQzJfUk9PVCkvZG9jcy9kb3h5Z2VuLmNvbmZpZworCSMgb25seSBkb2N1bWVudCBpbmNsdWRlIGRpcmVjdG9yeSwgbm8gaW50ZXJuYWwgc2VjdGlvbnMKKwlzZWQgJ3MvXCheSU5QVVQgKj0uKlwpL1wxaW5jbHVkZVwvLzsgXAorCXMvXCheSU5URVJOQUxfRE9DUyAqPSAqXCkuKi9cMU5PLzsgXAorCXMvXCheRU5BQkxFRF9TRUNUSU9OUyAqPS4qXClJTlRFUk5BTFwoLipcKS4qL1wxXDIvOyBcCisJczpcKF5PVVRQVVRfRElSRUNUT1JZICo9IFwpb3V0OlwxJyQoT1VUX0RJUiknOjsnIFwKKwkJJChDMl9ST09UKS9kb2NzL2RveHlnZW4uY29uZmlnID4gJEAKKworJChDMl9PVVRfVEVNUCkvZG94eS1pbnRlcm5hbC5jb25maWc6ICQoQzJfUk9PVCkvZG9jcy9kb3h5Z2VuLmNvbmZpZworCXNlZCAnczpcKF5PVVRQVVRfRElSRUNUT1JZICo9IFwpb3V0XCguKlwpYXBpOlwxJyQoT1VUX0RJUiknXDJpbnRlcm5hbDo7JyBcCisJCSQoQzJfUk9PVCkvZG9jcy9kb3h5Z2VuLmNvbmZpZyA+ICRACisKKy5QSE9OWTogZG9jcy1hcGkKK2RvY3MtYXBpOiAkKEMyX09VVF9URU1QKS9kb3h5LWFwaS5jb25maWcgY2hlY2stZG94eWdlbgorCWVjaG8gQVBJIGRvY3MgYXJlIGJ1aWxkaW5nIGluICQoQzJfRE9DU19ST09UKS9hcGkKKwlybSAtcmYgJChDMl9ET0NTX1JPT1QpL2FwaQorCW1rZGlyIC1wICQoQzJfRE9DU19ST09UKS9hcGkKKwkkKEMyX0RPWFkpICQoQzJfT1VUX1RFTVApL2RveHktYXBpLmNvbmZpZworCisuUEhPTlk6IGRvY3MtaW50ZXJuYWwKK2RvY3MtaW50ZXJuYWw6ICQoQzJfT1VUX1RFTVApL2RveHktaW50ZXJuYWwuY29uZmlnIGNoZWNrLWRveHlnZW4KKwllY2hvIEludGVybmFsIGRvY3MgYXJlIGJ1aWxkaW5nIGluICQoQzJfRE9DU19ST09UKS9pbnRlcm5hbAorCXJtIC1yZiAkKEMyX0RPQ1NfUk9PVCkvaW50ZXJuYWwKKwlta2RpciAtcCAkKEMyX0RPQ1NfUk9PVCkvaW50ZXJuYWwKKwkkKEMyX0RPWFkpICQoQzJfT1VUX1RFTVApL2RveHktaW50ZXJuYWwuY29uZmlnCisKKy5QSE9OWTogZG9jcy1hbGwKK2RvY3MtYWxsOiBkb2NzLWFwaSBkb2NzLWludGVybmFsCisKK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChjYWxsIG15LWRpcikpCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllY2E1ODUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQW5kcm9pZC5icApAQCAtMCwwICsxLDMwIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2FhY2RlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkMyU29mdEFhY0RlYy5jcHAiLAorICAgICAgICAiRHJjUHJlc01vZGVXcmFwLmNwcCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJGcmF1bmhvZmVyQUFDIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2FhY2VuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0QWFjRW5jLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYkZyYXVuaG9mZXJBQUMiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3Yzg0NDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRGVjLmNwcApAQCAtMCwwICsxLDk0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0QWFjRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPG51bWVyaWM+CisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRBYWNEZWMuaCIKKworI2RlZmluZSBGSUxFUkVBRF9NQVhfTEFZRVJTIDIKKworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfUkVGX0xFVkVMIC0xNi4wICAvKiA2NCotMC4yNWRCID0gLTE2IGRCIGJlbG93IGZ1bGwgc2NhbGUgZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQ1VUICAgMS4wIC8qIG1heGltdW0gY29tcHJlc3Npb24gb2YgZHluYW1pYyByYW5nZSBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19CT09TVCAxLjAgLyogbWF4aW11bSBjb21wcmVzc2lvbiBvZiBkeW5hbWljIHJhbmdlIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0hFQVZZIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fSEVBVlkgICAvKiBzd2l0Y2ggZm9yIGhlYXZ5IGNvbXByZXNzaW9uIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0VGRkVDVCAzICAvKiBNUEVHLUQgRFJDIGVmZmVjdCB0eXBlOyAzID0+IExpbWl0ZWQgcGxheWJhY2sgcmFuZ2UgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0VOQ19MRVZFTCAoMC4yNSkgLyogZW5jb2RlciB0YXJnZXQgbGV2ZWw7IC0xID0+IHRoZSB2YWx1ZSBpcyB1bmtub3duLCBvdGhlcndpc2UgZEIgc3RlcCB2YWx1ZSAoZS5nLiA2NCBmb3IgLTE2IGRCKSAqLworI2RlZmluZSBNQVhfQ0hBTk5FTF9DT1VOVCAgICAgICAgICAgIDggIC8qIG1heGltdW0gbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzIHRoYXQgY2FuIGJlIGRlY29kZWQgKi8KKy8vIG5hbWVzIG9mIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBEUkMgc2V0dGluZ3MKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfUkVGX0xFVkVMICAiYWFjX2RyY19yZWZlcmVuY2VfbGV2ZWwiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0NVVCAgICAgICAgImFhY19kcmNfY3V0IgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9CT09TVCAgICAgICJhYWNfZHJjX2Jvb3N0IgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9IRUFWWSAgICAgICJhYWNfZHJjX2hlYXZ5IgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9FTkNfTEVWRUwgImFhY19kcmNfZW5jX3RhcmdldF9sZXZlbCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfRUZGRUNUICAgICAicm8uYWFjX2RyY19lZmZlY3RfdHlwZSIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDMlNvZnRBYWNEZWM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX05BTUVfSU5QVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Gb3JtYXRDb25maWc6OmlucHV0KDB1LCBDMkZvcm1hdENvbXByZXNzZWQpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfTkFNRV9PVVRQVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Gb3JtYXRDb25maWc6Om91dHB1dCgwdSwgQzJGb3JtYXRBdWRpbykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX05BTUVfSU5QVVRfUE9SVF9NSU1FX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1pbWVDb25maWc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9OQU1FX09VVFBVVF9QT1JUX01JTUVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWltZUNvbmZpZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfTkFNRV9TVFJFQU1fU0FNUExFX1JBVEVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgNDQxMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgIDczNTAsIDgwMDAsIDExMDI1LCAxMjAwMCwgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMAorICAgICAgICAgICAgICAgIH0pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX05BTUVfU1RSRUFNX0NIQU5ORUxfQ09VTlRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5pblJhbmdlKDEsIDgpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX05BTUVfU1RSRUFNX0JJVFJBVEVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyQml0cmF0ZVR1bmluZzo6aW5wdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg4MDAwLCA5NjAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA4MTkyKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BYWNGb3JtYXQsIEMyX05BTUVfU1RSRUFNX0FBQ19GT1JNQVRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQWFjRm9ybWF0SW5mbzo6aW5wdXQoMHUsIEMyQWFjU3RyZWFtRm9ybWF0UmF3KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1BYWNGb3JtYXQsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgIEMyQWFjU3RyZWFtRm9ybWF0UmF3LCBDMkFhY1N0cmVhbUZvcm1hdEFkdHMKKyAgICAgICAgICAgICAgICB9KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQWFjRm9ybWF0KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0KDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xDLCBDMkNvbmZpZzo6TEVWRUxfVU5VU0VEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19IRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEVfUFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FTEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0VSX1NDQUxBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19YSEV9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1VOVVNFRAorICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY0NvbXByZXNzTW9kZSwgQzJfUEFSQU1LRVlfRFJDX0NPTVBSRVNTSU9OX01PREUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY0NvbXByZXNzaW9uTW9kZVR1bmluZzo6aW5wdXQoMHUsIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fSEVBVlkpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EcmNDb21wcmVzc01vZGUsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9PRE1fREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9MSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbURyY0NvbXByZXNzTW9kZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjVGFyZ2V0UmVmTGV2ZWwsIEMyX1BBUkFNS0VZX0RSQ19UQVJHRVRfUkVGRVJFTkNFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNUYXJnZXRSZWZlcmVuY2VMZXZlbFR1bmluZzo6aW5wdXQoMHUsIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobURyY1RhcmdldFJlZkxldmVsLCB2YWx1ZSkuaW5SYW5nZSgtMzEuNzUsIDAuMjUpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNUYXJnZXRSZWZMZXZlbCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjRW5jVGFyZ2V0TGV2ZWwsIEMyX1BBUkFNS0VZX0RSQ19FTkNPREVEX1RBUkdFVF9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRHJjRW5jb2RlZFRhcmdldExldmVsVHVuaW5nOjppbnB1dCgwdSwgRFJDX0RFRkFVTFRfTU9CSUxFX0VOQ19MRVZFTCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRHJjRW5jVGFyZ2V0TGV2ZWwsIHZhbHVlKS5pblJhbmdlKC0zMS43NSwgMC4yNSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbURyY0VuY1RhcmdldExldmVsKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EcmNCb29zdEZhY3RvciwgQzJfUEFSQU1LRVlfRFJDX0JPT1NUX0ZBQ1RPUikKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRHJjQm9vc3RGYWN0b3JUdW5pbmc6OmlucHV0KDB1LCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0JPT1NUKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1EcmNCb29zdEZhY3RvciwgdmFsdWUpLmluUmFuZ2UoMCwgMS4pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNCb29zdEZhY3Rvcik+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjQXR0ZW51YXRpb25GYWN0b3IsIEMyX1BBUkFNS0VZX0RSQ19BVFRFTlVBVElPTl9GQUNUT1IpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY0F0dGVudWF0aW9uRmFjdG9yVHVuaW5nOjppbnB1dCgwdSwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19DVVQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobURyY0F0dGVudWF0aW9uRmFjdG9yLCB2YWx1ZSkuaW5SYW5nZSgwLCAxLil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbURyY0F0dGVudWF0aW9uRmFjdG9yKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EcmNFZmZlY3RUeXBlLCBDMl9QQVJBTUtFWV9EUkNfRUZGRUNUX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY0VmZmVjdFR5cGVUdW5pbmc6OmlucHV0KDB1LCBDMkNvbmZpZzo6RFJDX0VGRkVDVF9MSU1JVEVEX1BMQVlCQUNLX1JBTkdFKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtRHJjRWZmZWN0VHlwZSwgdmFsdWUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9PRE1fREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9PRkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9MQVRFX05JR0hULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX05PSVNZX0VOVklST05NRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX0xJTUlURURfUExBWUJBQ0tfUkFOR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfTE9XX1BMQVlCQUNLX0xFVkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX0RJQUxPR19FTkhBTkNFTUVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9HRU5FUkFMX0NPTVBSRVNTSU9OfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbURyY0VmZmVjdFR5cGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBib29sIGlzQWR0cygpIGNvbnN0IHsgcmV0dXJuIG1BYWNGb3JtYXQtPnZhbHVlID09IEMyQWFjU3RyZWFtRm9ybWF0QWR0czsgfQorICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisgICAgaW50MzJfdCBnZXREcmNDb21wcmVzc01vZGUoKSBjb25zdCB7IHJldHVybiBtRHJjQ29tcHJlc3NNb2RlLT52YWx1ZSA9PSBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZID8gMSA6IDA7IH0KKyAgICBpbnQzMl90IGdldERyY1RhcmdldFJlZkxldmVsKCkgY29uc3QgeyByZXR1cm4gKG1EcmNUYXJnZXRSZWZMZXZlbC0+dmFsdWUgPD0gMCA/IC1tRHJjVGFyZ2V0UmVmTGV2ZWwtPnZhbHVlICogNC4gKyAwLjUgOiAtMSk7IH0KKyAgICBpbnQzMl90IGdldERyY0VuY1RhcmdldExldmVsKCkgY29uc3QgeyByZXR1cm4gKG1EcmNFbmNUYXJnZXRMZXZlbC0+dmFsdWUgPD0gMCA/IC1tRHJjRW5jVGFyZ2V0TGV2ZWwtPnZhbHVlICogNC4gKyAwLjUgOiAtMSk7IH0KKyAgICBpbnQzMl90IGdldERyY0Jvb3N0RmFjdG9yKCkgY29uc3QgeyByZXR1cm4gbURyY0Jvb3N0RmFjdG9yLT52YWx1ZSAqIDEyNy4gKyAwLjU7IH0KKyAgICBpbnQzMl90IGdldERyY0F0dGVudWF0aW9uRmFjdG9yKCkgY29uc3QgeyByZXR1cm4gbURyY0F0dGVudWF0aW9uRmFjdG9yLT52YWx1ZSAqIDEyNy4gKyAwLjU7IH0KKyAgICBpbnQzMl90IGdldERyY0VmZmVjdFR5cGUoKSBjb25zdCB7IHJldHVybiBtRHJjRWZmZWN0VHlwZS0+dmFsdWU7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Gb3JtYXRDb25maWc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRm9ybWF0Q29uZmlnOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1pbWVDb25maWc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1pbWVDb25maWc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQml0cmF0ZVR1bmluZzo6aW5wdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1BYWNGb3JtYXRJbmZvOjppbnB1dD4gbUFhY0Zvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1EcmNDb21wcmVzc2lvbk1vZGVUdW5pbmc6OmlucHV0PiBtRHJjQ29tcHJlc3NNb2RlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbURyY1RhcmdldFJlZmVyZW5jZUxldmVsVHVuaW5nOjppbnB1dD4gbURyY1RhcmdldFJlZkxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbURyY0VuY29kZWRUYXJnZXRMZXZlbFR1bmluZzo6aW5wdXQ+IG1EcmNFbmNUYXJnZXRMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1EcmNCb29zdEZhY3RvclR1bmluZzo6aW5wdXQ+IG1EcmNCb29zdEZhY3RvcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1EcmNBdHRlbnVhdGlvbkZhY3RvclR1bmluZzo6aW5wdXQ+IG1EcmNBdHRlbnVhdGlvbkZhY3RvcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1EcmNFZmZlY3RUeXBlVHVuaW5nOjppbnB1dD4gbURyY0VmZmVjdFR5cGU7CisgICAgLy8gVE9ETyBBZGQgOiBDMlN0cmVhbUFhY1Nick1vZGVUdW5pbmcKK307CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5hYWMuZGVjb2RlciI7CisKK0MyU29mdEFhY0RlYzo6QzJTb2Z0QWFjRGVjKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1BQUNEZWNvZGVyKG51bGxwdHIpLAorICAgICAgbVN0cmVhbUluZm8obnVsbHB0ciksCisgICAgICBtU2lnbmFsbGVkRXJyb3IoZmFsc2UpLAorICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlcihudWxscHRyKSB7Cit9CisKK0MyU29mdEFhY0RlYzo6fkMyU29mdEFhY0RlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QWFjRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFhY0RlYzo6b25TdG9wKCkgeworICAgIGRyYWluRGVjb2RlcigpOworICAgIC8vIHJlc2V0IHRoZSAiY29uZmlndXJlZCIgc3RhdGUKKyAgICBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCA9IDA7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zID0gMDsKKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyA9IDA7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlckZpbGxlZCA9IDA7CisgICAgbUJ1ZmZlcnNJbmZvLmNsZWFyKCk7CisKKyAgICAvLyBUbyBtYWtlIHRoZSBjb2RlYyBiZWhhdmUgdGhlIHNhbWUgYmVmb3JlIGFuZCBhZnRlciBhIHJlc2V0LCB3ZSBuZWVkIHRvIGludmFsaWRhdGUgdGhlCisgICAgLy8gc3RyZWFtaW5mbyBzdHJ1Y3QuIFRoaXMgZG9lcyB0aGF0OgorICAgIG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlID0gMDsgLy8gVE9ETzogbVN0cmVhbUluZm8gaXMgcmVhZCBvbmx5CisKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBYWNEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0QWFjRGVjOjpvblJlbGVhc2UoKSB7CisgICAgaWYgKG1BQUNEZWNvZGVyKSB7CisgICAgICAgIGFhY0RlY29kZXJfQ2xvc2UobUFBQ0RlY29kZXIpOworICAgICAgICBtQUFDRGVjb2RlciA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyKSB7CisgICAgICAgIGRlbGV0ZVtdIG1PdXRwdXREZWxheVJpbmdCdWZmZXI7CisgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXIgPSBudWxscHRyOworICAgIH0KK30KKworc3RhdHVzX3QgQzJTb2Z0QWFjRGVjOjppbml0RGVjb2RlcigpIHsKKyAgICBBTE9HVigiaW5pdERlY29kZXIoKSIpOworICAgIHN0YXR1c190IHN0YXR1cyA9IFVOS05PV05fRVJST1I7CisgICAgbUFBQ0RlY29kZXIgPSBhYWNEZWNvZGVyX09wZW4oVFRfTVA0X0FESUYsIC8qIG51bSBsYXllcnMgKi8gMSk7CisgICAgaWYgKG1BQUNEZWNvZGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgbVN0cmVhbUluZm8gPSBhYWNEZWNvZGVyX0dldFN0cmVhbUluZm8obUFBQ0RlY29kZXIpOworICAgICAgICBpZiAobVN0cmVhbUluZm8gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc3RhdHVzID0gT0s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCA9IDA7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemUgPSAyMDQ4ICogTUFYX0NIQU5ORUxfQ09VTlQgKiBrTnVtRGVsYXlCbG9ja3NNYXg7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlciA9IG5ldyBzaG9ydFttT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZV07CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zID0gMDsKKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyA9IDA7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlckZpbGxlZCA9IDA7CisKKyAgICBpZiAobUFBQ0RlY29kZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQUFDIGRlY29kZXIgaXMgbnVsbC4gVE9ETzogQ2FuIG5vdCBjYWxsIGFhY0RlY29kZXJfU2V0UGFyYW0gaW4gdGhlIGZvbGxvd2luZyBjb2RlIik7CisgICAgfQorCisgICAgLy9hYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfUENNX0xJTUlURVJfRU5BQkxFLCAwKTsKKworICAgIC8vaW5pdCBEUkMgd3JhcHBlcgorICAgIG1EcmNXcmFwLnNldERlY29kZXJIYW5kbGUobUFBQ0RlY29kZXIpOworICAgIG1EcmNXcmFwLnN1Ym1pdFN0cmVhbURhdGEobVN0cmVhbUluZm8pOworCisgICAgLy8gZm9yIHN0cmVhbXMgdGhhdCBjb250YWluIG1ldGFkYXRhLCB1c2UgdGhlIG1vYmlsZSBwcm9maWxlIERSQyBzZXR0aW5ncyB1bmxlc3Mgb3ZlcnJpZGRlbiBieSBwbGF0Zm9ybSBwcm9wZXJ0aWVzCisgICAgLy8gVE9ETzogY2hhbmdlIHRoZSBEUkMgc2V0dGluZ3MgZGVwZW5kaW5nIG9uIGF1ZGlvIG91dHB1dCBkZXZpY2UgdHlwZSAoSERNSSwgbG9hZHNwZWFrZXIsIGhlYWRwaG9uZSkKKworICAgIC8vICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9UQVJHRVQKKyAgICBpbnQzMl90IHRhcmdldFJlZkxldmVsID0gbUludGYtPmdldERyY1RhcmdldFJlZkxldmVsKCk7CisgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIGRlc2lyZWQgRFJDIHRhcmdldCByZWZlcmVuY2UgbGV2ZWwgb2YgJWQiLCB0YXJnZXRSZWZMZXZlbCk7CisgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfVEFSR0VULCAodW5zaWduZWQpdGFyZ2V0UmVmTGV2ZWwpOworCisgICAgLy8gIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0FUVF9GQUNUT1IKKworICAgIGludDMyX3QgYXR0ZW51YXRpb25GYWN0b3IgPSBtSW50Zi0+Z2V0RHJjQXR0ZW51YXRpb25GYWN0b3IoKTsKKyAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZGVzaXJlZCBEUkMgYXR0ZW51YXRpb24gZmFjdG9yIG9mICVkIiwgYXR0ZW51YXRpb25GYWN0b3IpOworICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0FUVF9GQUNUT1IsICh1bnNpZ25lZClhdHRlbnVhdGlvbkZhY3Rvcik7CisKKyAgICAvLyAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQk9PU1RfRkFDVE9SCisgICAgaW50MzJfdCBib29zdEZhY3RvciA9IG1JbnRmLT5nZXREcmNCb29zdEZhY3RvcigpOworICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBkZXNpcmVkIERSQyBib29zdCBmYWN0b3Igb2YgJWQiLCBib29zdEZhY3Rvcik7CisgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQk9PU1RfRkFDVE9SLCAodW5zaWduZWQpYm9vc3RGYWN0b3IpOworCisgICAgLy8gIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0hFQVZZCisgICAgaW50MzJfdCBjb21wcmVzc01vZGUgPSBtSW50Zi0+Z2V0RHJjQ29tcHJlc3NNb2RlKCk7CisgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIGRlc3JpZWQgRFJDIGhlYXZ5IGNvbXByZXNzaW9uIHN3aXRjaCBvZiAlZCIsIGNvbXByZXNzTW9kZSk7CisgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfSEVBVlksICh1bnNpZ25lZCljb21wcmVzc01vZGUpOworCisgICAgLy8gRFJDX1BSRVNfTU9ERV9XUkFQX0VOQ09ERVJfVEFSR0VUCisgICAgaW50MzJfdCBlbmNUYXJnZXRMZXZlbCA9IG1JbnRmLT5nZXREcmNFbmNUYXJnZXRMZXZlbCgpOworICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBlbmNvZGVyLXNpZGUgRFJDIHJlZmVyZW5jZSBsZXZlbCBvZiAlZCIsIGVuY1RhcmdldExldmVsKTsKKyAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfRU5DT0RFUl9UQVJHRVQsICh1bnNpZ25lZCllbmNUYXJnZXRMZXZlbCk7CisKKyAgICAvLyBBQUNfVU5JRFJDX1NFVF9FRkZFQ1QKKyAgICBpbnQzMl90IGVmZmVjdFR5cGUgPSBtSW50Zi0+Z2V0RHJjRWZmZWN0VHlwZSgpOworICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBNUEVHLUQgRFJDIGVmZmVjdCB0eXBlICVkIiwgZWZmZWN0VHlwZSk7CisgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX1VOSURSQ19TRVRfRUZGRUNULCBlZmZlY3RUeXBlKTsKKworICAgIC8vIEJ5IGRlZmF1bHQsIHRoZSBkZWNvZGVyIGNyZWF0ZXMgYSA1LjEgY2hhbm5lbCBkb3dubWl4IHNpZ25hbC4KKyAgICAvLyBGb3Igc2V2ZW4gYW5kIGVpZ2h0IGNoYW5uZWwgaW5wdXQgc3RyZWFtcywgZW5hYmxlIDYuMSBhbmQgNy4xIGNoYW5uZWwgb3V0cHV0CisgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX1BDTV9NQVhfT1VUUFVUX0NIQU5ORUxTLCAtMSk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitib29sIEMyU29mdEFhY0RlYzo6b3V0cHV0RGVsYXlSaW5nQnVmZmVyUHV0U2FtcGxlcyhJTlRfUENNICpzYW1wbGVzLCBpbnQzMl90IG51bVNhbXBsZXMpIHsKKyAgICBpZiAobnVtU2FtcGxlcyA9PSAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAob3V0cHV0RGVsYXlSaW5nQnVmZmVyU3BhY2VMZWZ0KCkgPCBudW1TYW1wbGVzKSB7CisgICAgICAgIEFMT0dFKCJSSU5HIEJVRkZFUiBXT1VMRCBPVkVSRkxPVyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgKyBudW1TYW1wbGVzIDw9IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplCisgICAgICAgICAgICAmJiAobU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPD0gbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zCisgICAgICAgICAgICAgICAgICAgIHx8IG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zID4gbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zICsgbnVtU2FtcGxlcykpIHsKKyAgICAgICAgLy8gZmFzdGVyIG1lbWNvcHkgbG9vcCB3aXRob3V0IGNoZWNrcywgaWYgdGhlIHByZWNvbmRpdGlvbnMgYWxsb3cgdGhpcworICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJbbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zKytdID0gc2FtcGxlc1tpXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgPj0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemUpIHsKKyAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyAtPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJzbG93IEMyU29mdEFhY0RlYzo6b3V0cHV0RGVsYXlSaW5nQnVmZmVyUHV0U2FtcGxlcygpIik7CisKKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyW21PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvc10gPSBzYW1wbGVzW2ldOworICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zKys7CisgICAgICAgICAgICBpZiAobU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zID49IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplKSB7CisgICAgICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zIC09IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJGaWxsZWQgKz0gbnVtU2FtcGxlczsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworaW50MzJfdCBDMlNvZnRBYWNEZWM6Om91dHB1dERlbGF5UmluZ0J1ZmZlckdldFNhbXBsZXMoSU5UX1BDTSAqc2FtcGxlcywgaW50MzJfdCBudW1TYW1wbGVzKSB7CisKKyAgICBpZiAobnVtU2FtcGxlcyA+IG1PdXRwdXREZWxheVJpbmdCdWZmZXJGaWxsZWQpIHsKKyAgICAgICAgQUxPR0UoIlJJTkcgQlVGRkVSIFdPVUxEIFVOREVSUlVOIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAobU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgKyBudW1TYW1wbGVzIDw9IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplCisgICAgICAgICAgICAmJiAobU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zIDwgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MKKyAgICAgICAgICAgICAgICAgICAgfHwgbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zID49IG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zICsgbnVtU2FtcGxlcykpIHsKKyAgICAgICAgLy8gZmFzdGVyIG1lbWNvcHkgbG9vcCB3aXRob3V0IGNoZWNrcywgaWYgdGhlIHByZWNvbmRpdGlvbnMgYWxsb3cgdGhpcworICAgICAgICBpZiAoc2FtcGxlcyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzYW1wbGVzW2ldID0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclttT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcysrXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zICs9IG51bVNhbXBsZXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zID49IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplKSB7CisgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyAtPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJzbG93IEMyU29mdEFhY0RlYzo6b3V0cHV0RGVsYXlSaW5nQnVmZmVyR2V0U2FtcGxlcygpIik7CisKKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc2FtcGxlcyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgc2FtcGxlc1tpXSA9IG1PdXRwdXREZWxheVJpbmdCdWZmZXJbbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3NdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MrKzsKKyAgICAgICAgICAgIGlmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyA+PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zIC09IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJGaWxsZWQgLT0gbnVtU2FtcGxlczsKKyAgICByZXR1cm4gbnVtU2FtcGxlczsKK30KKworaW50MzJfdCBDMlNvZnRBYWNEZWM6Om91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKSB7CisgICAgcmV0dXJuIG1PdXRwdXREZWxheVJpbmdCdWZmZXJGaWxsZWQ7Cit9CisKK2ludDMyX3QgQzJTb2Z0QWFjRGVjOjpvdXRwdXREZWxheVJpbmdCdWZmZXJTcGFjZUxlZnQoKSB7CisgICAgcmV0dXJuIG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplIC0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpOworfQorCit2b2lkIEMyU29mdEFhY0RlYzo6ZHJhaW5SaW5nQnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgYm9vbCBlb3MpIHsKKyAgICB3aGlsZSAoIW1CdWZmZXJzSW5mby5lbXB0eSgpICYmIG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKQorICAgICAgICAgICAgPj0gbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscykgeworICAgICAgICBJbmZvICZvdXRJbmZvID0gbUJ1ZmZlcnNJbmZvLmZyb250KCk7CisgICAgICAgIEFMT0dWKCJvdXRJbmZvLmZyYW1lSW5kZXggPSAlIiBQUkl1NjQsIG91dEluZm8uZnJhbWVJbmRleCk7CisgICAgICAgIGludCBzYW1wbGVzaXplIF9fdW51c2VkID0gbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpOworCisgICAgICAgIGludCBhdmFpbGFibGUgPSBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCk7CisgICAgICAgIGludCBudW1GcmFtZXMgPSBvdXRJbmZvLmRlY29kZWRTaXplcy5zaXplKCk7CisgICAgICAgIGludCBudW1TYW1wbGVzID0gbnVtRnJhbWVzICogKG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpOworICAgICAgICBpZiAoYXZhaWxhYmxlIDwgbnVtU2FtcGxlcykgeworICAgICAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgICAgIG51bVNhbXBsZXMgPSBhdmFpbGFibGU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dWKCIlZCBzYW1wbGVzIGF2YWlsYWJsZSAoJWQpLCBvciAlZCBmcmFtZXMiLAorICAgICAgICAgICAgICAgIG51bVNhbXBsZXMsIGF2YWlsYWJsZSwgbnVtRnJhbWVzKTsKKyAgICAgICAgQUxPR1YoImdldHRpbmcgJWQgZnJvbSByaW5nYnVmZmVyIiwgbnVtU2FtcGxlcyk7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mKT4gZmlsbFdvcmsgPQorICAgICAgICAgICAgWyZibG9jaywgbnVtU2FtcGxlcywgcG9vbCwgdGhpc10oKQorICAgICAgICAgICAgICAgICAgICAtPiBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mKT4geworICAgICAgICAgICAgICAgIGF1dG8gZmlsbEVtcHR5V29yayA9IFtdKAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssIGMyX3N0YXR1c190IGVycikgeworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBlcnI7CisgICAgICAgICAgICAgICAgICAgIEMyRnJhbWVEYXRhICZvdXRwdXQgPSB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQ7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDo6cGxhY2Vob2xkZXJzOworICAgICAgICAgICAgICAgIGlmIChudW1TYW1wbGVzID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6YmluZChmaWxsRW1wdHlXb3JrLCBfMSwgQzJfT0spOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nLCBwcm9wZXIgdXNhZ2UsIGV0Yy4KKyAgICAgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMgKiBzaXplb2YoaW50MTZfdCksIHVzYWdlLCAmYmxvY2spOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoImZhaWxlZCB0byBmZXRjaCBhIGxpbmVhciBibG9jayAoJWQpIiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6YmluZChmaWxsRW1wdHlXb3JrLCBfMSwgQzJfTk9fTUVNT1JZKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgICAgICAgICAgLy8gVE9ETworICAgICAgICAgICAgICAgIElOVF9QQ00gKm91dEJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8SU5UX1BDTSAqPih3Vmlldy5kYXRhKCkpOworICAgICAgICAgICAgICAgIGludDMyX3QgbnMgPSBvdXRwdXREZWxheVJpbmdCdWZmZXJHZXRTYW1wbGVzKG91dEJ1ZmZlciwgbnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgaWYgKG5zICE9IG51bVNhbXBsZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIm5vdCBhIGNvbXBsZXRlIGZyYW1lIG9mIHNhbXBsZXMgYXZhaWxhYmxlIik7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6OmJpbmQoZmlsbEVtcHR5V29yaywgXzEsIEMyX0NPUlJVUFRFRCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBbYnVmZmVyID0gY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrKV0oCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGEgJm91dHB1dCA9IHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dDsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIH0oKTsKKworICAgICAgICBpZiAod29yayAmJiB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPT0gYzJfY250cjY0X3Qob3V0SW5mby5mcmFtZUluZGV4KSkgeworICAgICAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaW5pc2gob3V0SW5mby5mcmFtZUluZGV4LCBmaWxsV29yayk7CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigib3V0IHRpbWVzdGFtcCAlIiBQUkl1NjQgIiAvICV1Iiwgb3V0SW5mby50aW1lc3RhbXAsIGJsb2NrID8gYmxvY2stPmNhcGFjaXR5KCkgOiAwKTsKKyAgICAgICAgbUJ1ZmZlcnNJbmZvLnBvcF9mcm9udCgpOworICAgIH0KK30KKwordm9pZCBDMlNvZnRBYWNEZWM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvcikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVUNIQVIqIGluQnVmZmVyW0ZJTEVSRUFEX01BWF9MQVlFUlNdOworICAgIFVJTlQgaW5CdWZmZXJMZW5ndGhbRklMRVJFQURfTUFYX0xBWUVSU10gPSB7MH07CisgICAgVUlOVCBieXRlc1ZhbGlkW0ZJTEVSRUFEX01BWF9MQVlFUlNdID0gezB9OworCisgICAgSU5UX1BDTSB0bXBPdXRCdWZmZXJbMjA0OCAqIE1BWF9DSEFOTkVMX0NPVU5UXTsKKyAgICBDMlJlYWRWaWV3IHZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IHNpemUgPSAwdTsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICB2aWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIHNpemUgPSB2aWV3LmNhcGFjaXR5KCk7CisgICAgfQorCisgICAgYm9vbCBlb3MgPSAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwOworICAgIGJvb2wgY29kZWNDb25maWcgPSAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9IDA7CisKKyAgICAvL1RPRE8KKyNpZiAwCisgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50ID09IDAgJiYgIWNvZGVjQ29uZmlnKSB7CisgICAgICAgIEFMT0dXKCJmaXJzdCBidWZmZXIgc2hvdWxkIGhhdmUgRkxBR19DT0RFQ19DT05GSUcgc2V0Iik7CisgICAgICAgIGNvZGVjQ29uZmlnID0gdHJ1ZTsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoY29kZWNDb25maWcgJiYgc2l6ZSA+IDB1KSB7CisgICAgICAgIC8vIGNvbnN0X2Nhc3QgYmVjYXVzZSBvZiBsaWJBQUNkZWMgbWV0aG9kIHNpZ25hdHVyZS4KKyAgICAgICAgaW5CdWZmZXJbMF0gPSBjb25zdF9jYXN0PFVDSEFSICo+KHZpZXcuZGF0YSgpICsgb2Zmc2V0KTsKKyAgICAgICAgaW5CdWZmZXJMZW5ndGhbMF0gPSBzaXplOworCisgICAgICAgIEFBQ19ERUNPREVSX0VSUk9SIGRlY29kZXJFcnIgPQorICAgICAgICAgICAgYWFjRGVjb2Rlcl9Db25maWdSYXcobUFBQ0RlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyTGVuZ3RoKTsKKworICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBBQUNfREVDX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiYWFjRGVjb2Rlcl9Db25maWdSYXcgZGVjb2RlckVyciA9IDB4JTQuNHgiLCBkZWNvZGVyRXJyKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEluZm8gaW5JbmZvOworICAgIGluSW5mby5mcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgaW5JbmZvLnRpbWVzdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCk7CisgICAgaW5JbmZvLmJ1ZmZlclNpemUgPSBzaXplOworICAgIGluSW5mby5kZWNvZGVkU2l6ZXMuY2xlYXIoKTsKKyAgICB3aGlsZSAoc2l6ZSA+IDB1KSB7CisgICAgICAgIEFMT0dWKCJzaXplID0gJXp1Iiwgc2l6ZSk7CisgICAgICAgIGlmIChtSW50Zi0+aXNBZHRzKCkpIHsKKyAgICAgICAgICAgIHNpemVfdCBhZHRzSGVhZGVyU2l6ZSA9IDA7CisgICAgICAgICAgICAvLyBza2lwIDMwIGJpdHMsIGFhY19mcmFtZV9sZW5ndGggZm9sbG93cy4KKyAgICAgICAgICAgIC8vIHNzc3Nzc3NzIHNzc3NpaWlwIHBwZmZmZlBjIGNjb2hDQ2xsIGxsbGxsbGxsIGxsbD8/Pz8/CisKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmFkdHNIZWFkZXIgPSB2aWV3LmRhdGEoKSArIG9mZnNldDsKKworICAgICAgICAgICAgYm9vbCBzaWduYWxFcnJvciA9IGZhbHNlOworICAgICAgICAgICAgaWYgKHNpemUgPCA3KSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkF1ZGlvIGRhdGEgdG9vIHNob3J0IHRvIGNvbnRhaW4gZXZlbiB0aGUgQURUUyBoZWFkZXIuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJHb3QgJXp1IGJ5dGVzLiIsIHNpemUpOworICAgICAgICAgICAgICAgIGhleGR1bXAoYWR0c0hlYWRlciwgc2l6ZSk7CisgICAgICAgICAgICAgICAgc2lnbmFsRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBib29sIHByb3RlY3Rpb25BYnNlbnQgPSAoYWR0c0hlYWRlclsxXSAmIDEpOworCisgICAgICAgICAgICAgICAgdW5zaWduZWQgYWFjX2ZyYW1lX2xlbmd0aCA9CisgICAgICAgICAgICAgICAgICAgICgoYWR0c0hlYWRlclszXSAmIDMpIDw8IDExKQorICAgICAgICAgICAgICAgICAgICB8IChhZHRzSGVhZGVyWzRdIDw8IDMpCisgICAgICAgICAgICAgICAgICAgIHwgKGFkdHNIZWFkZXJbNV0gPj4gNSk7CisKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IGFhY19mcmFtZV9sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk5vdCBlbm91Z2ggYXVkaW8gZGF0YSBmb3IgdGhlIGNvbXBsZXRlIGZyYW1lLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdvdCAlenUgYnl0ZXMsIGZyYW1lIHNpemUgYWNjb3JkaW5nIHRvIHRoZSBBRFRTICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVhZGVyIGlzICV1IGJ5dGVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgYWFjX2ZyYW1lX2xlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIGhleGR1bXAoYWR0c0hlYWRlciwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIHNpZ25hbEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhZHRzSGVhZGVyU2l6ZSA9IChwcm90ZWN0aW9uQWJzZW50ID8gNyA6IDkpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWFjX2ZyYW1lX2xlbmd0aCA8IGFkdHNIZWFkZXJTaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWxFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdF9jYXN0IGJlY2F1c2Ugb2YgbGliQUFDZGVjIG1ldGhvZCBzaWduYXR1cmUuCisgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlclswXSA9IGNvbnN0X2Nhc3Q8VUNIQVIgKj4oYWR0c0hlYWRlciArIGFkdHNIZWFkZXJTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyTGVuZ3RoWzBdID0gYWFjX2ZyYW1lX2xlbmd0aCAtIGFkdHNIZWFkZXJTaXplOworCisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gYWR0c0hlYWRlclNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplIC09IGFkdHNIZWFkZXJTaXplOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2lnbmFsRXJyb3IpIHsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBjb25zdF9jYXN0IGJlY2F1c2Ugb2YgbGliQUFDZGVjIG1ldGhvZCBzaWduYXR1cmUuCisgICAgICAgICAgICBpbkJ1ZmZlclswXSA9IGNvbnN0X2Nhc3Q8VUNIQVIgKj4odmlldy5kYXRhKCkgKyBvZmZzZXQpOworICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGhbMF0gPSBzaXplOworICAgICAgICB9CisKKyAgICAgICAgLy8gRmlsbCBhbmQgZGVjb2RlCisgICAgICAgIGJ5dGVzVmFsaWRbMF0gPSBpbkJ1ZmZlckxlbmd0aFswXTsKKworICAgICAgICBJTlQgcHJldlNhbXBsZVJhdGUgPSBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZTsKKyAgICAgICAgSU5UIHByZXZOdW1DaGFubmVscyA9IG1TdHJlYW1JbmZvLT5udW1DaGFubmVsczsKKworICAgICAgICBhYWNEZWNvZGVyX0ZpbGwobUFBQ0RlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNWYWxpZCk7CisKKyAgICAgICAgLy8gcnVuIERSQyBjaGVjaworICAgICAgICBtRHJjV3JhcC5zdWJtaXRTdHJlYW1EYXRhKG1TdHJlYW1JbmZvKTsKKyAgICAgICAgbURyY1dyYXAudXBkYXRlKCk7CisKKyAgICAgICAgVUlOVCBpbkJ1ZmZlclVzZWRMZW5ndGggPSBpbkJ1ZmZlckxlbmd0aFswXSAtIGJ5dGVzVmFsaWRbMF07CisgICAgICAgIHNpemUgLT0gaW5CdWZmZXJVc2VkTGVuZ3RoOworICAgICAgICBvZmZzZXQgKz0gaW5CdWZmZXJVc2VkTGVuZ3RoOworCisgICAgICAgIEFBQ19ERUNPREVSX0VSUk9SIGRlY29kZXJFcnI7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmIChvdXRwdXREZWxheVJpbmdCdWZmZXJTcGFjZUxlZnQoKSA8CisgICAgICAgICAgICAgICAgICAgIChtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJza2lwcGluZyBkZWNvZGU6IG5vdCBlbm91Z2ggc3BhY2UgbGVmdCBpbiByaW5nYnVmZmVyIik7CisgICAgICAgICAgICAgICAgLy8gZGlzY2FyZCBidWZmZXIKKyAgICAgICAgICAgICAgICBzaXplID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IG51bUNvbnN1bWVkID0gbVN0cmVhbUluZm8tPm51bVRvdGFsQnl0ZXM7CisgICAgICAgICAgICBkZWNvZGVyRXJyID0gYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZShtQUFDRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcE91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwNDggKiBNQVhfQ0hBTk5FTF9DT1VOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogZmxhZ3MgKi8pOworCisgICAgICAgICAgICBudW1Db25zdW1lZCA9IG1TdHJlYW1JbmZvLT5udW1Ub3RhbEJ5dGVzIC0gbnVtQ29uc3VtZWQ7CisKKyAgICAgICAgICAgIGlmIChkZWNvZGVyRXJyID09IEFBQ19ERUNfTk9UX0VOT1VHSF9CSVRTKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbkluZm8uZGVjb2RlZFNpemVzLnB1c2hfYmFjayhudW1Db25zdW1lZCk7CisKKyAgICAgICAgICAgIGlmIChkZWNvZGVyRXJyICE9IEFBQ19ERUNfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSBkZWNvZGVyRXJyID0gMHglNC40eCIsIGRlY29kZXJFcnIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYnl0ZXNWYWxpZFswXSAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImJ5dGVzVmFsaWRbMF0gIT0gMCBzaG91bGQgbmV2ZXIgaGFwcGVuIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaXplX3QgbnVtT3V0Qnl0ZXMgPQorICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBzaXplb2YoaW50MTZfdCkgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisKKyAgICAgICAgICAgIGlmIChkZWNvZGVyRXJyID09IEFBQ19ERUNfT0spIHsKKyAgICAgICAgICAgICAgICBpZiAoIW91dHB1dERlbGF5UmluZ0J1ZmZlclB1dFNhbXBsZXModG1wT3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscykpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiQUFDIGRlY29kZXIgcmV0dXJuZWQgZXJyb3IgMHglNC40eCwgc3Vic3RpdHV0aW5nIHNpbGVuY2UiLCBkZWNvZGVyRXJyKTsKKworICAgICAgICAgICAgICAgIG1lbXNldCh0bXBPdXRCdWZmZXIsIDAsIG51bU91dEJ5dGVzKTsgLy8gVE9ETzogY2hlY2sgZm9yIG92ZXJmbG93CisKKyAgICAgICAgICAgICAgICBpZiAoIW91dHB1dERlbGF5UmluZ0J1ZmZlclB1dFNhbXBsZXModG1wT3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscykpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gRGlzY2FyZCBpbnB1dCBidWZmZXIuCisgICAgICAgICAgICAgICAgc2l6ZSA9IDA7CisKKyAgICAgICAgICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfVFBERUNfQ0xFQVJfQlVGRkVSLCAxKTsKKworICAgICAgICAgICAgICAgIC8vIEFmdGVyIGFuIGVycm9yLCByZXBsYWNlIGJ1ZmZlclNpemUgd2l0aCB0aGUgc3VtIG9mIHRoZQorICAgICAgICAgICAgICAgIC8vIGRlY29kZWRTaXplcyB0byByZXN5bmNocm9uaXplIHRoZSBpbi9vdXQgbGlzdHMuCisgICAgICAgICAgICAgICAgaW5JbmZvLmRlY29kZWRTaXplcy5wb3BfYmFjaygpOworICAgICAgICAgICAgICAgIGluSW5mby5idWZmZXJTaXplID0gc3RkOjphY2N1bXVsYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgaW5JbmZvLmRlY29kZWRTaXplcy5iZWdpbigpLCBpbkluZm8uZGVjb2RlZFNpemVzLmVuZCgpLCAwKTsKKworICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQUFDKy9lQUFDKyBzdHJlYW1zIGNhbiBiZSBzaWduYWxsZWQgaW4gdHdvIHdheXM6IGVpdGhlciBleHBsaWNpdGx5CisgICAgICAgICAgICAgKiBvciBpbXBsaWNpdGx5LCBhY2NvcmRpbmcgdG8gTVBFRzQgc3BlYy4gQUFDKy9lQUFDKyBpcyBhIGR1YWwKKyAgICAgICAgICAgICAqIHJhdGUgc3lzdGVtIGFuZCB0aGUgc2FtcGxpbmcgcmF0ZSBpbiB0aGUgZmluYWwgb3V0cHV0IGlzIGFjdHVhbGx5CisgICAgICAgICAgICAgKiBkb3VibGVkIGNvbXBhcmVkIHdpdGggdGhlIGNvcmUgQUFDIGRlY29kZXIgc2FtcGxpbmcgcmF0ZS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBFeHBsaWNpdCBzaWduYWxsaW5nIGlzIGRvbmUgYnkgZXhwbGljaXRseSBkZWZpbmluZyBTQlIgYXVkaW8gb2JqZWN0CisgICAgICAgICAgICAgKiB0eXBlIGluIHRoZSBiaXRzdHJlYW0uIEltcGxpY2l0IHNpZ25hbGxpbmcgaXMgZG9uZSBieSBlbWJlZGRpbmcKKyAgICAgICAgICAgICAqIFNCUiBjb250ZW50IGluIEFBQyBleHRlbnNpb24gcGF5bG9hZCBzcGVjaWZpYyB0byBTQlIsIGFuZCBoZW5jZQorICAgICAgICAgICAgICogcmVxdWlyZXMgYW4gQUFDIGRlY29kZXIgdG8gcGVyZm9ybSBwcmUtY2hlY2tzIG9uIGFjdHVhbCBhdWRpbyBmcmFtZXMuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGh1cywgd2UgY291bGQgbm90IHNheSBmb3Igc3VyZSB3aGV0aGVyIGEgc3RyZWFtIGlzCisgICAgICAgICAgICAgKiBBQUMrL2VBQUMrIHVudGlsIHRoZSBmaXJzdCBkYXRhIGZyYW1lIGlzIGRlY29kZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICghbVN0cmVhbUluZm8tPnNhbXBsZVJhdGUgfHwgIW1TdHJlYW1JbmZvLT5udW1DaGFubmVscykgeworICAgICAgICAgICAgICAgIC8vIGlmICgobUlucHV0QnVmZmVyQ291bnQgPiAyKSAmJiAobU91dHB1dEJ1ZmZlckNvdW50IDw9IDEpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJJbnZhbGlkIEFBQyBzdHJlYW0iKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIGRlY29kZXJFcnIsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAvLyBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIC8vIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlICE9IHByZXZTYW1wbGVSYXRlKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAobVN0cmVhbUluZm8tPm51bUNoYW5uZWxzICE9IHByZXZOdW1DaGFubmVscykpIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgiUmVjb25maWd1cmluZyBkZWNvZGVyOiAlZC0+JWQgSHosICVkLT4lZCBjaGFubmVscyIsCisgICAgICAgICAgICAgICAgICAgICAgcHJldlNhbXBsZVJhdGUsIG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgIHByZXZOdW1DaGFubmVscywgbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKTsKKworICAgICAgICAgICAgICAgIEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCBzYW1wbGVSYXRlSW5mbygwdSwgbVN0cmVhbUluZm8tPnNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscyk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbnRmLT5jb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICB7ICZzYW1wbGVSYXRlSW5mbywgJmNoYW5uZWxDb3VudEluZm8gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyX01BWV9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgICAgICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB0aGlzIGRvZXMgbm90IGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgdmFsdWVzIGFyZQorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBhbHRlcmVkIGR1cmluZyBjb25maWcuCisgICAgICAgICAgICAgICAgICAgIEMyRnJhbWVEYXRhICZvdXRwdXQgPSB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQ7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKEMyUGFyYW06OkNvcHkoc2FtcGxlUmF0ZUluZm8pKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShjaGFubmVsQ291bnRJbmZvKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvbmZpZyBVcGRhdGUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJzaXplID0gJXp1Iiwgc2l6ZSk7CisgICAgICAgIH0gd2hpbGUgKGRlY29kZXJFcnIgPT0gQUFDX0RFQ19PSyk7CisgICAgfQorCisgICAgaW50MzJfdCBvdXRwdXREZWxheSA9IG1TdHJlYW1JbmZvLT5vdXRwdXREZWxheSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVsczsKKworICAgIG1CdWZmZXJzSW5mby5wdXNoX2JhY2soc3RkOjptb3ZlKGluSW5mbykpOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMHU7CisgICAgaWYgKCFlb3MgJiYgbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQgPCBvdXRwdXREZWxheSkgeworICAgICAgICAvLyBkaXNjYXJkIG91dHB1dERlbGF5IGF0IHRoZSBiZWdpbm5pbmcKKyAgICAgICAgaW50MzJfdCB0b0NvbXBlbnNhdGUgPSBvdXRwdXREZWxheSAtIG1PdXRwdXREZWxheUNvbXBlbnNhdGVkOworICAgICAgICBpbnQzMl90IGRpc2NhcmQgPSBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCk7CisgICAgICAgIGlmIChkaXNjYXJkID4gdG9Db21wZW5zYXRlKSB7CisgICAgICAgICAgICBkaXNjYXJkID0gdG9Db21wZW5zYXRlOworICAgICAgICB9CisgICAgICAgIGludDMyX3QgZGlzY2FyZGVkID0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyR2V0U2FtcGxlcyhudWxscHRyLCBkaXNjYXJkKTsKKyAgICAgICAgbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQgKz0gZGlzY2FyZGVkOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGVvcykgeworICAgICAgICBkcmFpbkludGVybmFsKERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUywgcG9vbCwgd29yayk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHJhaW5SaW5nQnVmZmVyKHdvcmssIHBvb2wsIGZhbHNlIC8qIG5vdCBFT1MgKi8pOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QWFjRGVjOjpkcmFpbkludGVybmFsKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIGJvb2wgZW9zID0gKGRyYWluTW9kZSA9PSBEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MpOworCisgICAgZHJhaW5EZWNvZGVyKCk7CisgICAgZHJhaW5SaW5nQnVmZmVyKHdvcmssIHBvb2wsIGVvcyk7CisKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIGF1dG8gZmlsbEVtcHR5V29yayA9IFtdKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICB9OworICAgICAgICB3aGlsZSAobUJ1ZmZlcnNJbmZvLnNpemUoKSA+IDF1KSB7CisgICAgICAgICAgICBmaW5pc2gobUJ1ZmZlcnNJbmZvLmZyb250KCkuZnJhbWVJbmRleCwgZmlsbEVtcHR5V29yayk7CisgICAgICAgICAgICBtQnVmZmVyc0luZm8ucG9wX2Zyb250KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdvcmsgJiYgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPT0gMHUpIHsKKyAgICAgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIH0KKyAgICAgICAgbUJ1ZmZlcnNJbmZvLmNsZWFyKCk7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBYWNEZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICByZXR1cm4gZHJhaW5JbnRlcm5hbChkcmFpbk1vZGUsIHBvb2wsIG51bGxwdHIpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBYWNEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgZHJhaW5EZWNvZGVyKCk7CisgICAgbUJ1ZmZlcnNJbmZvLmNsZWFyKCk7CisKKyAgICBpbnQgYXZhaWw7CisgICAgd2hpbGUgKChhdmFpbCA9IG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKSkgPiAwKSB7CisgICAgICAgIGlmIChhdmFpbCA+IG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgIGF2YWlsID0gbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVsczsKKyAgICAgICAgfQorICAgICAgICBpbnQzMl90IG5zID0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyR2V0U2FtcGxlcyhudWxscHRyLCBhdmFpbCk7CisgICAgICAgIGlmIChucyAhPSBhdmFpbCkgeworICAgICAgICAgICAgQUxPR1coIm5vdCBhIGNvbXBsZXRlIGZyYW1lIG9mIHNhbXBsZXMgYXZhaWxhYmxlIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyA9IG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvczsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBYWNEZWM6OmRyYWluRGVjb2RlcigpIHsKKyAgICAvLyBmbHVzaCBkZWNvZGVyIHVudGlsIG91dHB1dERlbGF5IGlzIGNvbXBlbnNhdGVkCisgICAgd2hpbGUgKG1PdXRwdXREZWxheUNvbXBlbnNhdGVkID4gMCkgeworICAgICAgICAvLyBhIGJ1ZmZlciBiaWcgZW5vdWdoIGZvciBNQVhfQ0hBTk5FTF9DT1VOVCBjaGFubmVscyBvZiBkZWNvZGVkIEhFLUFBQworICAgICAgICBJTlRfUENNIHRtcE91dEJ1ZmZlclsyMDQ4ICogTUFYX0NIQU5ORUxfQ09VTlRdOworCisgICAgICAgIC8vIHJ1biBEUkMgY2hlY2sKKyAgICAgICAgbURyY1dyYXAuc3VibWl0U3RyZWFtRGF0YShtU3RyZWFtSW5mbyk7CisgICAgICAgIG1EcmNXcmFwLnVwZGF0ZSgpOworCisgICAgICAgIEFBQ19ERUNPREVSX0VSUk9SIGRlY29kZXJFcnIgPQorICAgICAgICAgICAgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZShtQUFDRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wT3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDQ4ICogTUFYX0NIQU5ORUxfQ09VTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBQ0RFQ19GTFVTSCk7CisgICAgICAgIGlmIChkZWNvZGVyRXJyICE9IEFBQ19ERUNfT0spIHsKKyAgICAgICAgICAgIEFMT0dXKCJhYWNEZWNvZGVyX0RlY29kZUZyYW1lIGRlY29kZXJFcnIgPSAweCU0LjR4IiwgZGVjb2RlckVycik7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IHRtcE91dEJ1ZmZlclNhbXBsZXMgPSBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzOworICAgICAgICBpZiAodG1wT3V0QnVmZmVyU2FtcGxlcyA+IG1PdXRwdXREZWxheUNvbXBlbnNhdGVkKSB7CisgICAgICAgICAgICB0bXBPdXRCdWZmZXJTYW1wbGVzID0gbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgb3V0cHV0RGVsYXlSaW5nQnVmZmVyUHV0U2FtcGxlcyh0bXBPdXRCdWZmZXIsIHRtcE91dEJ1ZmZlclNhbXBsZXMpOworCisgICAgICAgIG1PdXRwdXREZWxheUNvbXBlbnNhdGVkIC09IHRtcE91dEJ1ZmZlclNhbXBsZXM7CisgICAgfQorfQorCitjbGFzcyBDMlNvZnRBYWNEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0QWFjRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEFhY0RlYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBYWNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRBYWNEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBYWNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRBYWNEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRBYWNEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjVjMjllCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0RlYy5oCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfQUFDX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfQUFDX0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworCisjaW5jbHVkZSAiYWFjZGVjb2Rlcl9saWIuaCIKKyNpbmNsdWRlICJEcmNQcmVzTW9kZVdyYXAuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0QWFjRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEFhY0RlYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRBYWNEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtOdW1EZWxheUJsb2Nrc01heCAgICAgID0gOCwKKyAgICB9OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKworICAgIEhBTkRMRV9BQUNERUNPREVSIG1BQUNEZWNvZGVyOworICAgIENTdHJlYW1JbmZvICptU3RyZWFtSW5mbzsKKyAgICBib29sIG1Jc0ZpcnN0OworICAgIHNpemVfdCBtSW5wdXRCdWZmZXJDb3VudDsKKyAgICBzaXplX3QgbU91dHB1dEJ1ZmZlckNvdW50OworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIHN0cnVjdCBJbmZvIHsKKyAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleDsKKyAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemU7CisgICAgICAgIHVpbnQ2NF90IHRpbWVzdGFtcDsKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gZGVjb2RlZFNpemVzOworICAgIH07CisgICAgc3RkOjpsaXN0PEluZm8+IG1CdWZmZXJzSW5mbzsKKworICAgIENEcmNQcmVzTW9kZVdyYXBwZXIgbURyY1dyYXA7CisKKyAgICBlbnVtIHsKKyAgICAgICAgTk9ORSwKKyAgICAgICAgQVdBSVRJTkdfRElTQUJMRUQsCisgICAgICAgIEFXQUlUSU5HX0VOQUJMRUQKKyAgICB9IG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2U7CisKKyAgICB2b2lkIGluaXRQb3J0cygpOworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgYm9vbCBpc0NvbmZpZ3VyZWQoKSBjb25zdDsKKyAgICB2b2lkIGRyYWluRGVjb2RlcigpOworCisgICAgdm9pZCBkcmFpblJpbmdCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgICAgICBib29sIGVvcyk7CisgICAgYzJfc3RhdHVzX3QgZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisKKy8vICAgICAgZGVsYXkgY29tcGVuc2F0aW9uCisgICAgYm9vbCBtRW5kT2ZJbnB1dDsKKyAgICBib29sIG1FbmRPZk91dHB1dDsKKyAgICBpbnQzMl90IG1PdXRwdXREZWxheUNvbXBlbnNhdGVkOworICAgIGludDMyX3QgbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemU7CisgICAgc2hvcnQgKm1PdXRwdXREZWxheVJpbmdCdWZmZXI7CisgICAgaW50MzJfdCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3M7CisgICAgaW50MzJfdCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvczsKKyAgICBpbnQzMl90IG1PdXRwdXREZWxheVJpbmdCdWZmZXJGaWxsZWQ7CisgICAgYm9vbCBvdXRwdXREZWxheVJpbmdCdWZmZXJQdXRTYW1wbGVzKElOVF9QQ00gKnNhbXBsZXMsIGludCBudW1TYW1wbGVzKTsKKyAgICBpbnQzMl90IG91dHB1dERlbGF5UmluZ0J1ZmZlckdldFNhbXBsZXMoSU5UX1BDTSAqc2FtcGxlcywgaW50IG51bVNhbXBsZXMpOworICAgIGludDMyX3Qgb3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpOworICAgIGludDMyX3Qgb3V0cHV0RGVsYXlSaW5nQnVmZmVyU3BhY2VMZWZ0KCk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRBYWNEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfQUFDX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0VuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzczMGFlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0VuYy5jcHAKQEAgLTAsMCArMSw2MDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEFhY0VuYyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKworI2luY2x1ZGUgIkMyU29mdEFhY0VuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEMyU29mdEFhY0VuYzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfTkFNRV9JTlBVVF9TVFJFQU1fRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUZvcm1hdENvbmZpZzo6aW5wdXQoMHUsIEMyRm9ybWF0QXVkaW8pKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfTkFNRV9PVVRQVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Gb3JtYXRDb25maWc6Om91dHB1dCgwdSwgQzJGb3JtYXRDb21wcmVzc2VkKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfTkFNRV9JTlBVVF9QT1JUX01JTUVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX05BTUVfT1VUUFVUX1BPUlRfTUlNRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9OQU1FX1NUUkVBTV9TQU1QTEVfUkFURV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQoMHUsIDQ0MTAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICA4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAKKyAgICAgICAgICAgICAgICB9KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX05BTUVfU1RSRUFNX0NIQU5ORUxfQ09VTlRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgNil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfTkFNRV9TVFJFQU1fQklUUkFURV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJCaXRyYXRlVHVuaW5nOjpvdXRwdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg4MDAwLCA5NjAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA4MTkyKSkKKyAgICAgICAgICAgICAgICAuY2FsY3VsYXRlZEFzKE1heEJ1ZlNpemVDYWxjdWxhdG9yLCBtQ2hhbm5lbENvdW50KQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0KDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xDLCBDMkNvbmZpZzo6TEVWRUxfVU5VU0VEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19IRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEVfUFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FTER9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1VOVVNFRAorICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBnZXRTYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbVNhbXBsZVJhdGUtPnZhbHVlOyB9CisgICAgdWludDMyX3QgZ2V0Q2hhbm5lbENvdW50KCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxDb3VudC0+dmFsdWU7IH0KKyAgICB1aW50MzJfdCBnZXRCaXRyYXRlKCkgY29uc3QgeyByZXR1cm4gbUJpdHJhdGUtPnZhbHVlOyB9CisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heEJ1ZlNpemVDYWxjdWxhdG9yKAorICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgIEMyUDxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQ+ICZjaGFubmVsQ291bnQpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIG1lLnNldCgpLnZhbHVlID0gMTAyNCAqIHNpemVvZihzaG9ydCkgKiBjaGFubmVsQ291bnQudi52YWx1ZTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRm9ybWF0Q29uZmlnOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86OmlucHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCaXRyYXRlVHVuaW5nOjpvdXRwdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQ+IG1Qcm9maWxlTGV2ZWw7Cit9OworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuYWFjLmVuY29kZXIiOworCitDMlNvZnRBYWNFbmM6OkMyU29mdEFhY0VuYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtQUFDRW5jb2RlcihudWxscHRyKSwKKyAgICAgIG1TQlJNb2RlKC0xKSwKKyAgICAgIG1TQlJSYXRpbygwKSwKKyAgICAgIG1BQUNQcm9maWxlKEFPVF9BQUNfTEMpLAorICAgICAgbU51bUJ5dGVzUGVySW5wdXRGcmFtZSgwdSksCisgICAgICBtT3V0QnVmZmVyU2l6ZSgwdSksCisgICAgICBtU2VudENvZGVjU3BlY2lmaWNEYXRhKGZhbHNlKSwKKyAgICAgIG1JbnB1dFNpemUoMCksCisgICAgICBtSW5wdXRUaW1lVXMoLTFsbCksCisgICAgICBtU2lnbmFsbGVkRXJyb3IoZmFsc2UpLAorICAgICAgbU91dEluZGV4KDB1KSB7Cit9CisKK0MyU29mdEFhY0VuYzo6fkMyU29mdEFhY0VuYygpIHsKKyAgICBvblJlc2V0KCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFhY0VuYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXRFbmNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCitzdGF0dXNfdCBDMlNvZnRBYWNFbmM6OmluaXRFbmNvZGVyKCkgeworICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jT3BlbigmbUFBQ0VuY29kZXIsIDAsIDApKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdCBBQUMgZW5jb2RlciIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIHNldEF1ZGlvUGFyYW1zKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFhY0VuYzo6b25TdG9wKCkgeworICAgIG1TZW50Q29kZWNTcGVjaWZpY0RhdGEgPSBmYWxzZTsKKyAgICBtSW5wdXRTaXplID0gMHU7CisgICAgbUlucHV0VGltZVVzID0gLTFsbDsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QWFjRW5jOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworICAgIGFhY0VuY0Nsb3NlKCZtQUFDRW5jb2Rlcik7Cit9CisKK3ZvaWQgQzJTb2Z0QWFjRW5jOjpvblJlbGVhc2UoKSB7CisgICAgLy8gbm8tb3AKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QWFjRW5jOjpvbkZsdXNoX3NtKCkgeworICAgIG1TZW50Q29kZWNTcGVjaWZpY0RhdGEgPSBmYWxzZTsKKyAgICBtSW5wdXRTaXplID0gMHU7CisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGF0aWMgQ0hBTk5FTF9NT0RFIGdldENoYW5uZWxNb2RlKHVpbnQzMl90IG5DaGFubmVscykgeworICAgIENIQU5ORUxfTU9ERSBjaE1vZGUgPSBNT0RFX0lOVkFMSUQ7CisgICAgc3dpdGNoIChuQ2hhbm5lbHMpIHsKKyAgICAgICAgY2FzZSAxOiBjaE1vZGUgPSBNT0RFXzE7IGJyZWFrOworICAgICAgICBjYXNlIDI6IGNoTW9kZSA9IE1PREVfMjsgYnJlYWs7CisgICAgICAgIGNhc2UgMzogY2hNb2RlID0gTU9ERV8xXzI7IGJyZWFrOworICAgICAgICBjYXNlIDQ6IGNoTW9kZSA9IE1PREVfMV8yXzE7IGJyZWFrOworICAgICAgICBjYXNlIDU6IGNoTW9kZSA9IE1PREVfMV8yXzI7IGJyZWFrOworICAgICAgICBjYXNlIDY6IGNoTW9kZSA9IE1PREVfMV8yXzJfMTsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IGNoTW9kZSA9IE1PREVfSU5WQUxJRDsKKyAgICB9CisgICAgcmV0dXJuIGNoTW9kZTsKK30KKworLy9zdGF0aWMgQVVESU9fT0JKRUNUX1RZUEUgZ2V0QU9URnJvbVByb2ZpbGUoT01YX1UzMiBwcm9maWxlKSB7CisvLyAgICBpZiAocHJvZmlsZSA9PSBPTVhfQVVESU9fQUFDT2JqZWN0TEMpIHsKKy8vICAgICAgICByZXR1cm4gQU9UX0FBQ19MQzsKKy8vICAgIH0gZWxzZSBpZiAocHJvZmlsZSA9PSBPTVhfQVVESU9fQUFDT2JqZWN0SEUpIHsKKy8vICAgICAgICByZXR1cm4gQU9UX1NCUjsKKy8vICAgIH0gZWxzZSBpZiAocHJvZmlsZSA9PSBPTVhfQVVESU9fQUFDT2JqZWN0SEVfUFMpIHsKKy8vICAgICAgICByZXR1cm4gQU9UX1BTOworLy8gICAgfSBlbHNlIGlmIChwcm9maWxlID09IE9NWF9BVURJT19BQUNPYmplY3RMRCkgeworLy8gICAgICAgIHJldHVybiBBT1RfRVJfQUFDX0xEOworLy8gICAgfSBlbHNlIGlmIChwcm9maWxlID09IE9NWF9BVURJT19BQUNPYmplY3RFTEQpIHsKKy8vICAgICAgICByZXR1cm4gQU9UX0VSX0FBQ19FTEQ7CisvLyAgICB9IGVsc2UgeworLy8gICAgICAgIEFMT0dXKCJVbnN1cHBvcnRlZCBBQUMgcHJvZmlsZSAtIGRlZmF1bHRpbmcgdG8gQUFDLUxDIik7CisvLyAgICAgICAgcmV0dXJuIEFPVF9BQUNfTEM7CisvLyAgICB9CisvL30KKworc3RhdHVzX3QgQzJTb2Z0QWFjRW5jOjpzZXRBdWRpb1BhcmFtcygpIHsKKyAgICAvLyBXZSBjYWxsIHRoaXMgd2hlbmV2ZXIgc2FtcGxlIHJhdGUsIG51bWJlciBvZiBjaGFubmVscywgYml0cmF0ZSBvciBTQlIgbW9kZSBjaGFuZ2UKKyAgICAvLyBpbiByZXBvbnNlIHRvIHNldFBhcmFtZXRlciBjYWxscy4KKworICAgIEFMT0dWKCJzZXRBdWRpb1BhcmFtczogJXUgSHosICV1IGNoYW5uZWxzLCAldSBicHMsICVpIHNiciBtb2RlLCAlaSBzYnIgcmF0aW8iLAorICAgICAgICAgbUludGYtPmdldFNhbXBsZVJhdGUoKSwgbUludGYtPmdldENoYW5uZWxDb3VudCgpLCBtSW50Zi0+Z2V0Qml0cmF0ZSgpLCBtU0JSTW9kZSwgbVNCUlJhdGlvKTsKKworICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jb2Rlcl9TZXRQYXJhbShtQUFDRW5jb2RlciwgQUFDRU5DX0FPVCwgbUFBQ1Byb2ZpbGUpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFBQyBlbmNvZGVyIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNvZGVyX1NldFBhcmFtKG1BQUNFbmNvZGVyLCBBQUNFTkNfU0FNUExFUkFURSwgbUludGYtPmdldFNhbXBsZVJhdGUoKSkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgQUFDIGVuY29kZXIgcGFyYW1ldGVycyIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNvZGVyX1NldFBhcmFtKG1BQUNFbmNvZGVyLCBBQUNFTkNfQklUUkFURSwgbUludGYtPmdldEJpdHJhdGUoKSkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgQUFDIGVuY29kZXIgcGFyYW1ldGVycyIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNvZGVyX1NldFBhcmFtKG1BQUNFbmNvZGVyLCBBQUNFTkNfQ0hBTk5FTE1PREUsCisgICAgICAgICAgICBnZXRDaGFubmVsTW9kZShtSW50Zi0+Z2V0Q2hhbm5lbENvdW50KCkpKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBBQUMgZW5jb2RlciBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY29kZXJfU2V0UGFyYW0obUFBQ0VuY29kZXIsIEFBQ0VOQ19UUkFOU01VWCwgVFRfTVA0X1JBVykpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgQUFDIGVuY29kZXIgcGFyYW1ldGVycyIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAobVNCUk1vZGUgIT0gLTEgJiYgbUFBQ1Byb2ZpbGUgPT0gQU9UX0VSX0FBQ19FTEQpIHsKKyAgICAgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNvZGVyX1NldFBhcmFtKG1BQUNFbmNvZGVyLCBBQUNFTkNfU0JSX01PREUsIG1TQlJNb2RlKSkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgQUFDIGVuY29kZXIgcGFyYW1ldGVycyIpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTQlIgcmF0aW8gcGFyYW1ldGVyIGNvbmZpZ3VyYXRpb25zOgorICAgICAgIDA6IERlZmF1bHQgY29uZmlndXJhdGlvbiB3aGVyZWluIFNCUiByYXRpbyBpcyBjb25maWd1cmVkIGRlcGVuZGluZyBvbiBhdWRpbyBvYmplY3QgdHlwZSBieQorICAgICAgICAgIHRoZSBGREsuCisgICAgICAgMTogRG93bnNhbXBsZWQgU0JSIChkZWZhdWx0IGZvciBFTEQpCisgICAgICAgMjogRHVhbHJhdGUgU0JSIChkZWZhdWx0IGZvciBIRS1BQUMpCisgICAgICovCisgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNvZGVyX1NldFBhcmFtKG1BQUNFbmNvZGVyLCBBQUNFTkNfU0JSX1JBVElPLCBtU0JSUmF0aW8pKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFBQyBlbmNvZGVyIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEMyU29mdEFhY0VuYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBib29sIGVvcyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDA7CisKKyAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gbUludGYtPmdldFNhbXBsZVJhdGUoKTsKKyAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBtSW50Zi0+Z2V0Q2hhbm5lbENvdW50KCk7CisKKyAgICBpZiAoIW1TZW50Q29kZWNTcGVjaWZpY0RhdGEpIHsKKyAgICAgICAgLy8gVGhlIHZlcnkgZmlyc3QgdGhpbmcgd2Ugd2FudCB0byBvdXRwdXQgaXMgdGhlIGNvZGVjIHNwZWNpZmljCisgICAgICAgIC8vIGRhdGEuCisKKyAgICAgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNFbmNvZGUobUFBQ0VuY29kZXIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGluaXRpYWxpemUgZW5jb2RlciBmb3IgcHJvZmlsZSAvIHNhbXBsZS1yYXRlIC8gYml0LXJhdGUgLyBjaGFubmVscyIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IGJpdHJhdGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZSgpOworICAgICAgICB1aW50MzJfdCBhY3R1YWxCaXRSYXRlID0gYWFjRW5jb2Rlcl9HZXRQYXJhbShtQUFDRW5jb2RlciwgQUFDRU5DX0JJVFJBVEUpOworICAgICAgICBpZiAoYml0cmF0ZSAhPSBhY3R1YWxCaXRSYXRlKSB7CisgICAgICAgICAgICBBTE9HVygiUmVxdWVzdGVkIGJpdHJhdGUgJXUgdW5zdXBwb3J0ZWQsIHVzaW5nICV1IiwgYml0cmF0ZSwgYWN0dWFsQml0UmF0ZSk7CisgICAgICAgIH0KKworICAgICAgICBBQUNFTkNfSW5mb1N0cnVjdCBlbmNJbmZvOworICAgICAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY0luZm8obUFBQ0VuY29kZXIsICZlbmNJbmZvKSkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgQUFDIGVuY29kZXIgaW5mbyIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cmVhbUNzZEluZm86Om91dHB1dD4gY3NkID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ3NkSW5mbzo6b3V0cHV0OjpBbGxvY1VuaXF1ZShlbmNJbmZvLmNvbmZTaXplLCAwdSk7CisgICAgICAgIGlmICghY3NkKSB7CisgICAgICAgICAgICBBTE9HRSgiQ1NEIGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1lbWNweShjc2QtPm0udmFsdWUsIGVuY0luZm8uY29uZkJ1ZiwgZW5jSW5mby5jb25mU2l6ZSk7CisgICAgICAgIEFMT0dWKCJwdXQgY3NkIik7CisjaWYgZGVmaW5lZChMT0dfTkRFQlVHKSAmJiAhTE9HX05ERUJVRworICAgICAgICBoZXhkdW1wKGNzZC0+bS52YWx1ZSwgY3NkLT5mbGV4Q291bnQoKSk7CisjZW5kaWYKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soc3RkOjptb3ZlKGNzZCkpOworCisgICAgICAgIG1PdXRCdWZmZXJTaXplID0gZW5jSW5mby5tYXhPdXRCdWZCeXRlczsKKyAgICAgICAgbU51bUJ5dGVzUGVySW5wdXRGcmFtZSA9IGVuY0luZm8uZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCk7CisgICAgICAgIG1JbnB1dFRpbWVVcyA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wOworCisgICAgICAgIG1TZW50Q29kZWNTcGVjaWZpY0RhdGEgPSB0cnVlOworICAgIH0KKworICAgIHVpbnQ4X3QgdGVtcFsxXTsKKyAgICBDMlJlYWRWaWV3IHZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gdGVtcDsKKyAgICBzaXplX3QgY2FwYWNpdHkgPSAwdTsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICB2aWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGRhdGEgPSB2aWV3LmRhdGEoKTsKKyAgICAgICAgY2FwYWNpdHkgPSB2aWV3LmNhcGFjaXR5KCk7CisgICAgfQorCisgICAgc2l6ZV90IG51bUZyYW1lcyA9IChjYXBhY2l0eSArIG1JbnB1dFNpemUgKyAoZW9zID8gbU51bUJ5dGVzUGVySW5wdXRGcmFtZSAtIDEgOiAwKSkKKyAgICAgICAgICAgIC8gbU51bUJ5dGVzUGVySW5wdXRGcmFtZTsKKyAgICBBTE9HVigiY2FwYWNpdHkgPSAlenU7IG1JbnB1dFNpemUgPSAlenU7IG51bUZyYW1lcyA9ICV6dSBtTnVtQnl0ZXNQZXJJbnB1dEZyYW1lID0gJXUiLAorICAgICAgICAgIGNhcGFjaXR5LCBtSW5wdXRTaXplLCBudW1GcmFtZXMsIG1OdW1CeXRlc1BlcklucHV0RnJhbWUpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldyaXRlVmlldz4gd1ZpZXc7CisgICAgdWludDhfdCAqb3V0UHRyID0gdGVtcDsKKyAgICBzaXplX3Qgb3V0QXZhaWxhYmxlID0gMHU7CisgICAgdWludDY0X3QgaW5wdXRJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworCisgICAgQUFDRU5DX0luQXJncyBpbmFyZ3M7CisgICAgQUFDRU5DX091dEFyZ3Mgb3V0YXJnczsKKyAgICBtZW1zZXQoJmluYXJncywgMCwgc2l6ZW9mKGluYXJncykpOworICAgIG1lbXNldCgmb3V0YXJncywgMCwgc2l6ZW9mKG91dGFyZ3MpKTsKKyAgICBpbmFyZ3MubnVtSW5TYW1wbGVzID0gY2FwYWNpdHkgLyBzaXplb2YoaW50MTZfdCk7CisKKyAgICB2b2lkKiBpbkJ1ZmZlcltdICAgICAgICA9IHsgKHVuc2lnbmVkIGNoYXIgKilkYXRhIH07CisgICAgSU5UICAgaW5CdWZmZXJJZHNbXSAgICAgPSB7IElOX0FVRElPX0RBVEEgfTsKKyAgICBJTlQgICBpbkJ1ZmZlclNpemVbXSAgICA9IHsgKElOVCljYXBhY2l0eSB9OworICAgIElOVCAgIGluQnVmZmVyRWxTaXplW10gID0geyBzaXplb2YoaW50MTZfdCkgfTsKKworICAgIEFBQ0VOQ19CdWZEZXNjIGluQnVmRGVzYzsKKyAgICBpbkJ1ZkRlc2MubnVtQnVmcyAgICAgICAgICAgPSBzaXplb2YoaW5CdWZmZXIpIC8gc2l6ZW9mKHZvaWQqKTsKKyAgICBpbkJ1ZkRlc2MuYnVmcyAgICAgICAgICAgICAgPSAodm9pZCoqKSZpbkJ1ZmZlcjsKKyAgICBpbkJ1ZkRlc2MuYnVmZmVySWRlbnRpZmllcnMgPSBpbkJ1ZmZlcklkczsKKyAgICBpbkJ1ZkRlc2MuYnVmU2l6ZXMgICAgICAgICAgPSBpbkJ1ZmZlclNpemU7CisgICAgaW5CdWZEZXNjLmJ1ZkVsU2l6ZXMgICAgICAgID0gaW5CdWZmZXJFbFNpemU7CisKKyAgICB2b2lkKiBvdXRCdWZmZXJbXSAgICAgICA9IHsgb3V0UHRyIH07CisgICAgSU5UICAgb3V0QnVmZmVySWRzW10gICAgPSB7IE9VVF9CSVRTVFJFQU1fREFUQSB9OworICAgIElOVCAgIG91dEJ1ZmZlclNpemVbXSAgID0geyAwIH07CisgICAgSU5UICAgb3V0QnVmZmVyRWxTaXplW10gPSB7IHNpemVvZihVQ0hBUikgfTsKKworICAgIEFBQ0VOQ19CdWZEZXNjIG91dEJ1ZkRlc2M7CisgICAgb3V0QnVmRGVzYy5udW1CdWZzICAgICAgICAgICA9IHNpemVvZihvdXRCdWZmZXIpIC8gc2l6ZW9mKHZvaWQqKTsKKyAgICBvdXRCdWZEZXNjLmJ1ZnMgICAgICAgICAgICAgID0gKHZvaWQqKikmb3V0QnVmZmVyOworICAgIG91dEJ1ZkRlc2MuYnVmZmVySWRlbnRpZmllcnMgPSBvdXRCdWZmZXJJZHM7CisgICAgb3V0QnVmRGVzYy5idWZTaXplcyAgICAgICAgICA9IG91dEJ1ZmZlclNpemU7CisgICAgb3V0QnVmRGVzYy5idWZFbFNpemVzICAgICAgICA9IG91dEJ1ZmZlckVsU2l6ZTsKKworICAgIEFBQ0VOQ19FUlJPUiBlbmNvZGVyRXJyID0gQUFDRU5DX09LOworCisgICAgY2xhc3MgRmlsbFdvcmsgeworICAgIHB1YmxpYzoKKyAgICAgICAgRmlsbFdvcmsodWludDMyX3QgZmxhZ3MsIEMyV29ya09yZGluYWxTdHJ1Y3Qgb3JkaW5hbCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKQorICAgICAgICAgICAgOiBtRmxhZ3MoZmxhZ3MpLCBtT3JkaW5hbChvcmRpbmFsKSwgbUJ1ZmZlcihidWZmZXIpIHsKKyAgICAgICAgfQorICAgICAgICB+RmlsbFdvcmsoKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpbUZsYWdzOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gbU9yZGluYWw7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgICAgICAgICBpZiAobUJ1ZmZlcikgeworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhtQnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJ0aW1lc3RhbXAgPSAlbGxkLCBpbmRleCA9ICVsbGQsIHcvJXMgYnVmZmVyIiwKKyAgICAgICAgICAgICAgICAgIG1PcmRpbmFsLnRpbWVzdGFtcC5wZWVrbGwoKSwKKyAgICAgICAgICAgICAgICAgIG1PcmRpbmFsLmZyYW1lSW5kZXgucGVla2xsKCksCisgICAgICAgICAgICAgICAgICBtQnVmZmVyID8gIiIgOiAibyIpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCB1aW50MzJfdCBtRmxhZ3M7CisgICAgICAgIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgbU9yZGluYWw7CisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gbUJ1ZmZlcjsKKyAgICB9OworCisgICAgQzJXb3JrT3JkaW5hbFN0cnVjdCBvdXRPcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKworICAgIHdoaWxlIChlbmNvZGVyRXJyID09IEFBQ0VOQ19PSyAmJiBpbmFyZ3MubnVtSW5TYW1wbGVzID4gMCkgeworICAgICAgICBpZiAobnVtRnJhbWVzICYmICFibG9jaykgeworICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmcsIHByb3BlciB1c2FnZSwgZXRjLgorICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhtT3V0QnVmZmVyU2l6ZSwgdXNhZ2UsICZibG9jayk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZmFpbGVkIDogZXJyID0gJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdWaWV3LnJlc2V0KG5ldyBDMldyaXRlVmlldyhibG9jay0+bWFwKCkuZ2V0KCkpKTsKKyAgICAgICAgICAgIG91dFB0ciA9IHdWaWV3LT5kYXRhKCk7CisgICAgICAgICAgICBvdXRBdmFpbGFibGUgPSB3Vmlldy0+c2l6ZSgpOworICAgICAgICAgICAgLS1udW1GcmFtZXM7CisgICAgICAgIH0KKworICAgICAgICBtZW1zZXQoJm91dGFyZ3MsIDAsIHNpemVvZihvdXRhcmdzKSk7CisKKyAgICAgICAgb3V0QnVmZmVyWzBdID0gb3V0UHRyOworICAgICAgICBvdXRCdWZmZXJTaXplWzBdID0gb3V0QXZhaWxhYmxlOworCisgICAgICAgIGVuY29kZXJFcnIgPSBhYWNFbmNFbmNvZGUobUFBQ0VuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQnVmRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QnVmRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRhcmdzKTsKKworICAgICAgICBpZiAoZW5jb2RlckVyciA9PSBBQUNFTkNfT0spIHsKKyAgICAgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgICAgICBvdXRPcmRpbmFsLmZyYW1lSW5kZXggPSBtT3V0SW5kZXgrKzsKKyAgICAgICAgICAgICAgICBvdXRPcmRpbmFsLnRpbWVzdGFtcCA9IG1JbnB1dFRpbWVVczsKKyAgICAgICAgICAgICAgICBjbG9uZUFuZFNlbmQoCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGxXb3JrKEMyRnJhbWVEYXRhOjpGTEFHX0lOQ09NUExFVEUsIG91dE9yZGluYWwsIGJ1ZmZlcikpOworICAgICAgICAgICAgICAgIGJ1ZmZlci5yZXNldCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob3V0YXJncy5udW1PdXRCeXRlcyA+IDApIHsKKyAgICAgICAgICAgICAgICBtSW5wdXRTaXplID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgY29uc3VtZWQgPSAoY2FwYWNpdHkgLyBzaXplb2YoaW50MTZfdCkpIC0gaW5hcmdzLm51bUluU2FtcGxlcworICAgICAgICAgICAgICAgICAgICAgICAgKyBvdXRhcmdzLm51bUluU2FtcGxlczsKKyAgICAgICAgICAgICAgICBtSW5wdXRUaW1lVXMgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcAorICAgICAgICAgICAgICAgICAgICAgICAgKyAoY29uc3VtZWQgKiAxMDAwMDAwbGwgLyBjaGFubmVsQ291bnQgLyBzYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIDAsIG91dGFyZ3MubnVtT3V0Qnl0ZXMpOworI2lmIGRlZmluZWQoTE9HX05ERUJVRykgJiYgIUxPR19OREVCVUcKKyAgICAgICAgICAgICAgICBoZXhkdW1wKG91dFB0ciwgc3RkOjptaW4ob3V0YXJncy5udW1PdXRCeXRlcywgMjU2KSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBvdXRQdHIgPSB0ZW1wOworICAgICAgICAgICAgICAgIG91dEF2YWlsYWJsZSA9IDA7CisgICAgICAgICAgICAgICAgYmxvY2sucmVzZXQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUlucHV0U2l6ZSArPSBvdXRhcmdzLm51bUluU2FtcGxlcyAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG91dGFyZ3MubnVtSW5TYW1wbGVzID4gMCkgeworICAgICAgICAgICAgICAgIGluQnVmZmVyWzBdID0gKGludDE2X3QgKilpbkJ1ZmZlclswXSArIG91dGFyZ3MubnVtSW5TYW1wbGVzOworICAgICAgICAgICAgICAgIGluQnVmZmVyU2l6ZVswXSAtPSBvdXRhcmdzLm51bUluU2FtcGxlcyAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgICAgICBpbmFyZ3MubnVtSW5TYW1wbGVzIC09IG91dGFyZ3MubnVtSW5TYW1wbGVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dWKCJlbmNvZGVyRXJyID0gJWQgbUlucHV0U2l6ZSA9ICV6dSBpbmFyZ3MubnVtSW5TYW1wbGVzID0gJWQsIG1JbnB1dFRpbWVVcyA9ICVsbGQiLAorICAgICAgICAgICAgICBlbmNvZGVyRXJyLCBtSW5wdXRTaXplLCBpbmFyZ3MubnVtSW5TYW1wbGVzLCBtSW5wdXRUaW1lVXMucGVla2xsKCkpOworICAgIH0KKworICAgIGlmIChlb3MgJiYgaW5CdWZmZXJTaXplWzBdID4gMCkgeworICAgICAgICBpZiAobnVtRnJhbWVzICYmICFibG9jaykgeworICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmcsIHByb3BlciB1c2FnZSwgZXRjLgorICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhtT3V0QnVmZmVyU2l6ZSwgdXNhZ2UsICZibG9jayk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZmFpbGVkIDogZXJyID0gJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdWaWV3LnJlc2V0KG5ldyBDMldyaXRlVmlldyhibG9jay0+bWFwKCkuZ2V0KCkpKTsKKyAgICAgICAgICAgIG91dFB0ciA9IHdWaWV3LT5kYXRhKCk7CisgICAgICAgICAgICBvdXRBdmFpbGFibGUgPSB3Vmlldy0+c2l6ZSgpOworICAgICAgICAgICAgLS1udW1GcmFtZXM7CisgICAgICAgIH0KKworICAgICAgICBtZW1zZXQoJm91dGFyZ3MsIDAsIHNpemVvZihvdXRhcmdzKSk7CisKKyAgICAgICAgb3V0QnVmZmVyWzBdID0gb3V0UHRyOworICAgICAgICBvdXRCdWZmZXJTaXplWzBdID0gb3V0QXZhaWxhYmxlOworCisgICAgICAgIC8vIEZsdXNoCisgICAgICAgIGluYXJncy5udW1JblNhbXBsZXMgPSAtMTsKKworICAgICAgICAodm9pZClhYWNFbmNFbmNvZGUobUFBQ0VuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5CdWZEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEJ1ZkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dGFyZ3MpOworICAgIH0KKworICAgIG91dE9yZGluYWwuZnJhbWVJbmRleCA9IG1PdXRJbmRleCsrOworICAgIG91dE9yZGluYWwudGltZXN0YW1wID0gbUlucHV0VGltZVVzOworICAgIEZpbGxXb3JrKChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCkoZW9zID8gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSA6IDApLAorICAgICAgICAgICAgIG91dE9yZGluYWwsIGJ1ZmZlcikod29yayk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFhY0VuYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIHN3aXRjaCAoZHJhaW5Nb2RlKSB7CisgICAgICAgIGNhc2UgRFJBSU5fQ09NUE9ORU5UX05PX0VPUzoKKyAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgY2FzZSBOT19EUkFJTjoKKyAgICAgICAgICAgIC8vIG5vLW9wCisgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgIGNhc2UgRFJBSU5fQ0hBSU46CisgICAgICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICAgICAgY2FzZSBEUkFJTl9DT01QT05FTlRfV0lUSF9FT1M6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgKHZvaWQpcG9vbDsKKyAgICBtU2VudENvZGVjU3BlY2lmaWNEYXRhID0gZmFsc2U7CisgICAgbUlucHV0U2l6ZSA9IDB1OworCisgICAgLy8gVE9ETzogd2UgZG9uJ3QgaGF2ZSBhbnkgcGVuZGluZyB3b3JrIGF0IHRoaXMgdGltZSB0byBkcmFpbi4KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NsYXNzIEMyU29mdEFhY0VuY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRBYWNFbmNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0QWFjRW5jKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEFhY0VuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEFhY0VuYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEFhY0VuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEFhY0VuY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEFhY0VuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0VuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0VuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZmI0MzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRW5jLmgKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0FBQ19FTkNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0FBQ19FTkNfSF8KKworI2luY2x1ZGUgPGF0b21pYz4KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJhYWNlbmNfbGliLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQzJTb2Z0QWFjRW5jIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKK3B1YmxpYzoKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEFhY0VuYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRBYWNFbmMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKworICAgIEhBTkRMRV9BQUNFTkNPREVSIG1BQUNFbmNvZGVyOworCisgICAgaW50MzJfdCBtU0JSTW9kZTsKKyAgICBpbnQzMl90IG1TQlJSYXRpbzsKKyAgICBBVURJT19PQkpFQ1RfVFlQRSBtQUFDUHJvZmlsZTsKKyAgICBVSU5UIG1OdW1CeXRlc1BlcklucHV0RnJhbWU7CisgICAgVUlOVCBtT3V0QnVmZmVyU2l6ZTsKKworICAgIGJvb2wgbVNlbnRDb2RlY1NwZWNpZmljRGF0YTsKKyAgICBzaXplX3QgbUlucHV0U2l6ZTsKKyAgICBjMl9jbnRyNjRfdCBtSW5wdXRUaW1lVXM7CisKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBzdGQ6OmF0b21pY191aW50NjRfdCBtT3V0SW5kZXg7CisKKyAgICBzdGF0dXNfdCBpbml0RW5jb2RlcigpOworCisgICAgc3RhdHVzX3Qgc2V0QXVkaW9QYXJhbXMoKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEFhY0VuYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9BQUNfRU5DX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvRHJjUHJlc01vZGVXcmFwLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9EcmNQcmVzTW9kZVdyYXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViOWFlYmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvRHJjUHJlc01vZGVXcmFwLmNwcApAQCAtMCwwICsxLDM3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAiRHJjUHJlc01vZGVXcmFwLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2RlZmluZSBMT0dfVEFHICJDMlNvZnRBYWNEcmNXcmFwcGVyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisvLyNkZWZpbmUgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisKKyNkZWZpbmUgR1BNX0VOQ09ERVJfVEFSR0VUX0xFVkVMIDY0CisjZGVmaW5lIE1BWF9UQVJHRVRfTEVWRUwgNDAKKworQ0RyY1ByZXNNb2RlV3JhcHBlcjo6Q0RyY1ByZXNNb2RlV3JhcHBlcigpCit7CisgICAgbURhdGFVcGRhdGUgPSB0cnVlOworCisgICAgLyogRGF0YSBmcm9tIHN0cmVhbUluZm8uICovCisgICAgLyogSW5pdGlhbGl6ZWQgdG8gdGhlIHNhbWUgdmFsdWVzIGFzIGluIHRoZSBhYWMgZGVjb2RlciAqLworICAgIG1TdHJlYW1QUkwgPSAtMTsKKyAgICBtU3RyZWFtRFJDUHJlc01vZGUgPSAtMTsKKyAgICBtU3RyZWFtTnJBQUNDaGFuID0gMDsKKyAgICBtU3RyZWFtTnJPdXRDaGFuID0gMDsKKworICAgIC8qIERlc2lyZWQgdmFsdWVzIChzZXQgYnkgdXNlcikuICovCisgICAgLyogSW5pdGlhbGl6ZWQgdG8gdGhlIHNhbWUgdmFsdWVzIGFzIGluIHRoZSBhYWMgZGVjb2RlciAqLworICAgIG1EZXNUYXJnZXQgPSAtMTsKKyAgICBtRGVzQXR0RmFjdG9yID0gMDsKKyAgICBtRGVzQm9vc3RGYWN0b3IgPSAwOworICAgIG1EZXNIZWF2eSA9IDA7CisKKyAgICBtRW5jb2RlclRhcmdldCA9IC0xOworCisgICAgLyogVmFsdWVzIGZyb20gbGFzdCB0aW1lLiAqLworICAgIC8qIEluaXRpYWxpemVkIHRvIHRoZSBzYW1lIHZhbHVlcyBhcyB0aGUgZGVzaXJlZCB2YWx1ZXMgKi8KKyAgICBtTGFzdFRhcmdldCA9IC0xOworICAgIG1MYXN0QXR0RmFjdG9yID0gMDsKKyAgICBtTGFzdEJvb3N0RmFjdG9yID0gMDsKKyAgICBtTGFzdEhlYXZ5ID0gMDsKK30KKworQ0RyY1ByZXNNb2RlV3JhcHBlcjo6fkNEcmNQcmVzTW9kZVdyYXBwZXIoKQoreworfQorCit2b2lkCitDRHJjUHJlc01vZGVXcmFwcGVyOjpzZXREZWNvZGVySGFuZGxlKGNvbnN0IEhBTkRMRV9BQUNERUNPREVSIGhhbmRsZSkKK3sKKyAgICBtSGFuZGxlRGVjb2RlciA9IGhhbmRsZTsKK30KKwordm9pZAorQ0RyY1ByZXNNb2RlV3JhcHBlcjo6c3VibWl0U3RyZWFtRGF0YShDU3RyZWFtSW5mbyogcFN0cmVhbUluZm8pCit7CisgICAgYXNzZXJ0KHBTdHJlYW1JbmZvKTsKKworICAgIGlmIChtU3RyZWFtUFJMICE9IHBTdHJlYW1JbmZvLT5kcmNQcm9nUmVmTGV2KSB7CisgICAgICAgIG1TdHJlYW1QUkwgPSBwU3RyZWFtSW5mby0+ZHJjUHJvZ1JlZkxldjsKKyAgICAgICAgbURhdGFVcGRhdGUgPSB0cnVlOworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IGRyY1Byb2dSZWZMZXYgaXMgJWRcbiIsIG1TdHJlYW1QUkwpOworI2VuZGlmCisgICAgfQorCisgICAgaWYgKG1TdHJlYW1EUkNQcmVzTW9kZSAhPSBwU3RyZWFtSW5mby0+ZHJjUHJlc01vZGUpIHsKKyAgICAgICAgbVN0cmVhbURSQ1ByZXNNb2RlID0gcFN0cmVhbUluZm8tPmRyY1ByZXNNb2RlOworICAgICAgICBtRGF0YVVwZGF0ZSA9IHRydWU7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogZHJjUHJlc01vZGUgaXMgJWRcbiIsIG1TdHJlYW1EUkNQcmVzTW9kZSk7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAobVN0cmVhbU5yQUFDQ2hhbiAhPSBwU3RyZWFtSW5mby0+YWFjTnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgbVN0cmVhbU5yQUFDQ2hhbiA9IHBTdHJlYW1JbmZvLT5hYWNOdW1DaGFubmVsczsKKyAgICAgICAgbURhdGFVcGRhdGUgPSB0cnVlOworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IGFhY051bUNoYW5uZWxzIGlzICVkXG4iLCBtU3RyZWFtTnJBQUNDaGFuKTsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChtU3RyZWFtTnJPdXRDaGFuICE9IHBTdHJlYW1JbmZvLT5udW1DaGFubmVscykgeworICAgICAgICBtU3RyZWFtTnJPdXRDaGFuID0gcFN0cmVhbUluZm8tPm51bUNoYW5uZWxzOworICAgICAgICBtRGF0YVVwZGF0ZSA9IHRydWU7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogbnVtQ2hhbm5lbHMgaXMgJWRcbiIsIG1TdHJlYW1Ock91dENoYW4pOworI2VuZGlmCisgICAgfQorCisKKworICAgIGlmIChtU3RyZWFtTnJPdXRDaGFuPG1TdHJlYW1OckFBQ0NoYW4pIHsKKyAgICAgICAgbUlzRG93bm1peCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUlzRG93bm1peCA9IGZhbHNlOworICAgIH0KKworICAgIGlmIChtSXNEb3dubWl4ICYmIChtU3RyZWFtTnJPdXRDaGFuID09IDEpKSB7CisgICAgICAgIG1Jc01vbm9Eb3dubWl4ID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtSXNNb25vRG93bm1peCA9IGZhbHNlOworICAgIH0KKworICAgIGlmIChtSXNEb3dubWl4ICYmIG1TdHJlYW1Ock91dENoYW4gPT0gMil7CisgICAgICAgIG1Jc1N0ZXJlb0Rvd25taXggPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Jc1N0ZXJlb0Rvd25taXggPSBmYWxzZTsKKyAgICB9CisKK30KKwordm9pZAorQ0RyY1ByZXNNb2RlV3JhcHBlcjo6c2V0UGFyYW0oY29uc3QgRFJDX1BSRVNfTU9ERV9XUkFQX1BBUkFNIHBhcmFtLCBjb25zdCBpbnQgdmFsdWUpCit7CisgICAgc3dpdGNoIChwYXJhbSkgeworICAgIGNhc2UgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfVEFSR0VUOgorICAgICAgICBtRGVzVGFyZ2V0ID0gdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQVRUX0ZBQ1RPUjoKKyAgICAgICAgbURlc0F0dEZhY3RvciA9IHZhbHVlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0JPT1NUX0ZBQ1RPUjoKKyAgICAgICAgbURlc0Jvb3N0RmFjdG9yID0gdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfSEVBVlk6CisgICAgICAgIG1EZXNIZWF2eSA9IHZhbHVlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERSQ19QUkVTX01PREVfV1JBUF9FTkNPREVSX1RBUkdFVDoKKyAgICAgICAgbUVuY29kZXJUYXJnZXQgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIG1EYXRhVXBkYXRlID0gdHJ1ZTsKK30KKwordm9pZAorQ0RyY1ByZXNNb2RlV3JhcHBlcjo6dXBkYXRlKCkKK3sKKyAgICAvLyBHZXQgRGF0YSBmcm9tIERlY29kZXIKKyAgICBpbnQgcHJvZ1JlZkxldmVsID0gbVN0cmVhbVBSTDsKKyAgICBpbnQgZHJjUHJlc01vZGUgPSBtU3RyZWFtRFJDUHJlc01vZGU7CisKKyAgICAvLyBieSBkZWZhdWx0LCBkbyBhcyBkZXNpcmVkCisgICAgaW50IG5ld1RhcmdldCAgICAgICAgID0gbURlc1RhcmdldDsKKyAgICBpbnQgbmV3QXR0RmFjdG9yICAgICAgPSBtRGVzQXR0RmFjdG9yOworICAgIGludCBuZXdCb29zdEZhY3RvciAgICA9IG1EZXNCb29zdEZhY3RvcjsKKyAgICBpbnQgbmV3SGVhdnkgICAgICAgICAgPSBtRGVzSGVhdnk7CisKKyAgICBpZiAobURhdGFVcGRhdGUpIHsKKyAgICAgICAgLy8gc2FuaXR5IGNoZWNrCisgICAgICAgIGlmIChtRGVzVGFyZ2V0IDwgTUFYX1RBUkdFVF9MRVZFTCl7CisgICAgICAgICAgICBtRGVzVGFyZ2V0ID0gTUFYX1RBUkdFVF9MRVZFTDsgIC8vIGxpbWl0IHRhcmdldCBsZXZlbCB0byAtMTAgZEIgb3IgYmVsb3cKKyAgICAgICAgICAgIG5ld1RhcmdldCA9IE1BWF9UQVJHRVRfTEVWRUw7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUVuY29kZXJUYXJnZXQgIT0gLTEpIHsKKyAgICAgICAgICAgIGlmIChtRGVzVGFyZ2V0PDEyNCkgeyAvLyBpZiB0YXJnZXQgbGV2ZWwgPiAtMzEgZEIKKyAgICAgICAgICAgICAgICBpZiAoKG1Jc1N0ZXJlb0Rvd25taXggPT0gZmFsc2UpICYmIChtSXNNb25vRG93bm1peCA9PSBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm8gc3RlcmVvIG9yIG1vbm8gZG93bm1peGluZywgY2FsY3VsYXRlZCBzY2FsaW5nIG9mIGxpZ2h0IERSQworICAgICAgICAgICAgICAgICAgICAvKiB1c2UgYXMgbGl0dGxlIGNvbXByZXNzaW9uIGFzIHBvc3NpYmxlICovCisgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDA7CisgICAgICAgICAgICAgICAgICAgIG5ld0Jvb3N0RmFjdG9yID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1EZXNUYXJnZXQ8cHJvZ1JlZkxldmVsKSB7IC8vIGlmIHRhcmdldCBsZXZlbCA+IFBSTAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1FbmNvZGVyVGFyZ2V0IDwgbURlc1RhcmdldCkgeyAvLyBpZiBtRW5jb2RlclRhcmdldCA+IHRhcmdldCBsZXZlbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1FbmNvZGVyVGFyZ2V0ID4gdGFyZ2V0IGxldmVsID4gUFJMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhbGNGYWN0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY2FsY0ZhY3Rvcl9ub3JtOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAuMGYgPCBjYWxjRmFjdG9yX25vcm0gPCAxLjBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY0ZhY3Rvcl9ub3JtID0gKGZsb2F0KShtRGVzVGFyZ2V0IC0gcHJvZ1JlZkxldmVsKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpKG1FbmNvZGVyVGFyZ2V0IC0gcHJvZ1JlZkxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjRmFjdG9yID0gKGludCkoY2FsY0ZhY3Rvcl9ub3JtKjEyNy4wZik7IC8vIDAgPD0gY2FsY0ZhY3RvciA8IDEyNworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGNGYWN0b3IgaXMgdGhlIGxvd2VyIGxpbWl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gKGNhbGNGYWN0b3I+bmV3QXR0RmFjdG9yKSA/IGNhbGNGYWN0b3IgOiBuZXdBdHRGYWN0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3IEF0dEZhY3RvciB3aWxsIGJlIGFsd2F5cyA9IGNhbGNGYWN0b3IsIGFzIGl0IGlzIHNldCB0byAwIGJlZm9yZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdCb29zdEZhY3RvciA9IG5ld0F0dEZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGFyZ2V0IGxldmVsID4gbUVuY29kZXJUYXJnZXQgPiBQUkwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdURExpbWl0ZXJFbmFibGUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0aW1lIGRvbWFpbiBsaW1pdGVyIG11c3QgYWx3YXlzIGJlIGFjdGl2ZSBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgZnJhbWV3b3JrIGFjdGl2YXRlcyBpdCBieSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Jvb3N0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyB0YXJnZXQgbGV2ZWwgPD0gUFJMCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyByZXN0cmljdGlvbnMgcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld0F0dEZhY3RvciA9IG5ld0F0dEZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGRvd25taXhpbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGFyZ2V0IGxldmVsID4gLTIzIGRCIG9yIG1vbm8gZG93bm1peAorICAgICAgICAgICAgICAgICAgICBpZiAoIChtRGVzVGFyZ2V0PDkyKSB8fCBtSXNNb25vRG93bm1peCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHBlcmZvcm0gYSBkb3dubWl4LCBzbywgd2UgbmVlZCBhdCBsZWFzdCBmdWxsIGxpZ2h0IERSQworICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGFyZ2V0IGxldmVsIDw9IC0zMSBkQgorICAgICAgICAgICAgICAgIC8vIHBsYXliYWNrIC0zMSBkQjogbGlnaHQgRFJDIG9ubHkgbmVlZGVkIGlmIHdlIHBlcmZvcm0gZG93bm1peGluZworICAgICAgICAgICAgICAgIGlmIChtSXNEb3dubWl4KSB7ICAgLy8gd2UgZG8gZG93bm1peGluZworICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeyAvLyBoYW5kbGUgb3RoZXIgdXNlZCBlbmNvZGVyIHRhcmdldCBsZXZlbHMKKworICAgICAgICAgICAgLy8gU2FuaXR5IGNoZWNrOiBEUkMgcHJlc2VudGF0aW9uIG1vZGUgaXMgb25seSBzcGVjaWZpZWQgZm9yIG1heC4gNS4xIGNoYW5uZWxzCisgICAgICAgICAgICBpZiAobVN0cmVhbU5yQUFDQ2hhbiA+IDYpIHsKKyAgICAgICAgICAgICAgICBkcmNQcmVzTW9kZSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoZHJjUHJlc01vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGRlZmF1bHQ6IC8vIHByZXNlbnRhdGlvbiBtb2RlIG5vdCBpbmRpY2F0ZWQKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIGlmIChtRGVzVGFyZ2V0PDEyNCkgeyAvLyBpZiB0YXJnZXQgbGV2ZWwgPiAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgLy8gbm8gc3RlcmVvIG9yIG1vbm8gZG93bm1peGluZworICAgICAgICAgICAgICAgICAgICBpZiAoKG1Jc1N0ZXJlb0Rvd25taXggPT0gZmFsc2UpICYmIChtSXNNb25vRG93bm1peCA9PSBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVzVGFyZ2V0PHByb2dSZWZMZXZlbCkgeyAvLyBpZiB0YXJnZXQgbGV2ZWwgPiBQUkwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdURExpbWl0ZXJFbmFibGUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0aW1lIGRvbWFpbiBsaW1pdGVyIG11c3QgYWx3YXlzIGJlIGFjdGl2ZSBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZXdvcmsgYWN0aXZhdGVzIGl0IGJ5IGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7IC8vIGF0IGxlYXN0LCB1c2UgbGlnaHQgY29tcHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRhcmdldCBsZXZlbCA8PSBQUkwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyByZXN0cmljdGlvbnMgcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdBdHRGYWN0b3IgPSBuZXdBdHRGYWN0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGRvd25taXhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld1RETGltaXRlckVuYWJsZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGltZSBkb21haW4gbGltaXRlciBtdXN0IGFsd2F5cyBiZSBhY3RpdmUgaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZXdvcmsgYWN0aXZhdGVzIGl0IGJ5IGRlZmF1bHQKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGFyZ2V0IGxldmVsID4gLTIzIGRCIG9yIG1vbm8gZG93bm1peAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAobURlc1RhcmdldCA8IDkyKSB8fCBtSXNNb25vRG93bm1peCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWF2eSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgcGVyZm9ybSBhIGRvd25taXgsIHNvLCB3ZSBuZWVkIGF0IGxlYXN0IGZ1bGwgbGlnaHQgRFJDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGFyZ2V0IGxldmVsIDw9IC0zMSBkQgorICAgICAgICAgICAgICAgICAgICBpZiAobUlzRG93bm1peCkgeyAgIC8vIHdlIGRvIGRvd25taXhpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdURExpbWl0ZXJFbmFibGUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRpbWUgZG9tYWluIGxpbWl0ZXIgbXVzdCBhbHdheXMgYmUgYWN0aXZlIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgZnJhbWV3b3JrIGFjdGl2YXRlcyBpdCBieSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLy8gUHJlc2VudGF0aW9uIG1vZGUgMSBhbmQgMiBhY2NvcmRpbmcgdG8gRVRTSSBUUyAxMDEgMTU0OgorICAgICAgICAgICAgLy8gRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgKERWQik7IFNwZWNpZmljYXRpb24gZm9yIHRoZSB1c2Ugb2YgVmlkZW8gYW5kIEF1ZGlvIENvZGluZworICAgICAgICAgICAgLy8gaW4gQnJvYWRjYXN0aW5nIEFwcGxpY2F0aW9ucyBiYXNlZCBvbiB0aGUgTVBFRy0yIFRyYW5zcG9ydCBTdHJlYW0sCisgICAgICAgICAgICAvLyBzZWN0aW9uIEMuNS40LiwgIkRlY29kaW5nIiwgYW5kIFRhYmxlIEMuMzMKKyAgICAgICAgICAgIC8vIElTTyBEUkMgICAgICAgICAgICAtPiBuZXdIZWF2eSA9IDAgIChVc2UgbGlnaHQgY29tcHJlc3Npb24sIE1QRUctc3R5bGUpCisgICAgICAgICAgICAvLyBDb21wcmVzc2lvbl92YWx1ZSAgLT4gbmV3SGVhdnkgPSAxICAoVXNlIGhlYXZ5IGNvbXByZXNzaW9uLCBEVkItc3R5bGUpCisgICAgICAgICAgICAvLyBzY2FsaW5nIHJlc3RyaWN0ZWQgLT4gbmV3QXR0RmFjdG9yID0gMTI3CisKKyAgICAgICAgICAgIGNhc2UgMTogLy8gcHJlc2VudGF0aW9uIG1vZGUgMSwgTGlnaHQ6LTMxL0hlYXZ5Oi0yMworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtRGVzVGFyZ2V0IDwgMTI0KSB7IC8vIGlmIHRhcmdldCBsZXZlbCA+IC0zMSBkQgorICAgICAgICAgICAgICAgICAgICAvLyBwbGF5YmFjayB1cCB0byAtMjMgZEIKKyAgICAgICAgICAgICAgICAgICAgbmV3SGVhdnkgPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRhcmdldCBsZXZlbCA8PSAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgLy8gcGxheWJhY2sgLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIGlmIChtSXNEb3dubWl4KSB7ICAgLy8gd2UgZG8gZG93bm1peGluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDI6IC8vIHByZXNlbnRhdGlvbiBtb2RlIDIsIExpZ2h0Oi0yMy9IZWF2eTotMjMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobURlc1RhcmdldCA8IDEyNCkgeyAvLyBpZiB0YXJnZXQgbGV2ZWwgPiAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgLy8gcGxheWJhY2sgdXAgdG8gLTIzIGRCCisgICAgICAgICAgICAgICAgICAgIGlmIChtSXNNb25vRG93bm1peCkgeyAvLyBpZiBtb25vIGRvd25taXgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRhcmdldCBsZXZlbCA8PSAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgLy8gcGxheWJhY2sgLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc0Rvd25taXgpIHsgICAvLyB3ZSBkbyBkb3dubWl4aW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0gLy8gc3dpdGNoKCkKKyAgICAgICAgfSAvLyBpZiAobUVuY29kZXJUYXJnZXQgID09IEdQTV9FTkNPREVSX1RBUkdFVF9MRVZFTCkKKworICAgICAgICAvLyBzYW5pdHkgYWdhaW4KKyAgICAgICAgaWYgKG5ld0hlYXZ5ID09IDEpIHsKKyAgICAgICAgICAgIG5ld0Jvb3N0RmFjdG9yPTEyNzsgLy8gbm90IHJlYWxseSBuZWVkZWQgYXMgdGhlIHNhbWUgd291bGQgYmUgZG9uZSBieSB0aGUgZGVjb2RlciBhbnl3YXkKKyAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHVwZGF0ZSB0aGUgZGVjb2RlcgorICAgICAgICBpZiAobmV3VGFyZ2V0ICE9IG1MYXN0VGFyZ2V0KSB7CisgICAgICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1IYW5kbGVEZWNvZGVyLCBBQUNfRFJDX1JFRkVSRU5DRV9MRVZFTCwgbmV3VGFyZ2V0KTsKKyAgICAgICAgICAgIG1MYXN0VGFyZ2V0ID0gbmV3VGFyZ2V0OworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICAgICAgaWYgKG5ld1RhcmdldCAhPSBtRGVzVGFyZ2V0KQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogZm9yY2VkIHRhcmdldCBsZXZlbCB0byAlZCAoZnJvbSAlZClcbiIsIG5ld1RhcmdldCwgbURlc1RhcmdldCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBzZXQgdGFyZ2V0IGxldmVsIHRvICVkXG4iLCBuZXdUYXJnZXQpOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICBpZiAobmV3QXR0RmFjdG9yICE9IG1MYXN0QXR0RmFjdG9yKSB7CisgICAgICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1IYW5kbGVEZWNvZGVyLCBBQUNfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUiwgbmV3QXR0RmFjdG9yKTsKKyAgICAgICAgICAgIG1MYXN0QXR0RmFjdG9yID0gbmV3QXR0RmFjdG9yOworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICAgICAgaWYgKG5ld0F0dEZhY3RvciAhPSBtRGVzQXR0RmFjdG9yKQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogZm9yY2VkIGF0dGVudWF0aW9uIGZhY3RvciB0byAlZCAoZnJvbSAlZClcbiIsIG5ld0F0dEZhY3RvciwgbURlc0F0dEZhY3Rvcik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBzZXQgYXR0ZW51YXRpb24gZmFjdG9yIHRvICVkXG4iLCBuZXdBdHRGYWN0b3IpOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICBpZiAobmV3Qm9vc3RGYWN0b3IgIT0gbUxhc3RCb29zdEZhY3RvcikgeworICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtSGFuZGxlRGVjb2RlciwgQUFDX0RSQ19CT09TVF9GQUNUT1IsIG5ld0Jvb3N0RmFjdG9yKTsKKyAgICAgICAgICAgIG1MYXN0Qm9vc3RGYWN0b3IgPSBuZXdCb29zdEZhY3RvcjsKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgICAgIGlmIChuZXdCb29zdEZhY3RvciAhPSBtRGVzQm9vc3RGYWN0b3IpCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBmb3JjZWQgYm9vc3QgZmFjdG9yIHRvICVkIChmcm9tICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Jvb3N0RmFjdG9yLCBtRGVzQm9vc3RGYWN0b3IpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogc2V0IGJvb3N0IGZhY3RvciB0byAlZFxuIiwgbmV3Qm9vc3RGYWN0b3IpOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICBpZiAobmV3SGVhdnkgIT0gbUxhc3RIZWF2eSkgeworICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtSGFuZGxlRGVjb2RlciwgQUFDX0RSQ19IRUFWWV9DT01QUkVTU0lPTiwgbmV3SGVhdnkpOworICAgICAgICAgICAgbUxhc3RIZWF2eSA9IG5ld0hlYXZ5OworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICAgICAgaWYgKG5ld0hlYXZ5ICE9IG1EZXNIZWF2eSkKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IGZvcmNlZCBoZWF2eSBjb21wcmVzc2lvbiB0byAlZCAoZnJvbSAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWF2eSwgbURlc0hlYXZ5KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IHNldCBoZWF2eSBjb21wcmVzc2lvbiB0byAlZFxuIiwgbmV3SGVhdnkpOworI2VuZGlmCisgICAgICAgIH0KKworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICBBTE9HVigiRFJDIGNvbmZpZzogdGd0X2xldjogJTNkLCBjdXQ6ICUzZCwgYm9vc3Q6ICUzZCwgaGVhdnk6ICVkXG4iLCBuZXdUYXJnZXQsCisgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yLCBuZXdCb29zdEZhY3RvciwgbmV3SGVhdnkpOworI2VuZGlmCisgICAgICAgIG1EYXRhVXBkYXRlID0gZmFsc2U7CisKKyAgICB9IC8vIGlmIChtRGF0YVVwZGF0ZSkKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9EcmNQcmVzTW9kZVdyYXAuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9EcmNQcmVzTW9kZVdyYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGI2Y2YyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0RyY1ByZXNNb2RlV3JhcC5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3ByYWdtYSBvbmNlCisjaW5jbHVkZSAiYWFjZGVjb2Rlcl9saWIuaCIKKwordHlwZWRlZiBlbnVtCit7CisgICAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfVEFSR0VUICAgICAgICAgPSAweDAwMDAsCisgICAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQVRUX0ZBQ1RPUiAgICAgPSAweDAwMDEsCisgICAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQk9PU1RfRkFDVE9SICAgPSAweDAwMDIsCisgICAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfSEVBVlkgICAgICAgICAgPSAweDAwMDMsCisgICAgRFJDX1BSRVNfTU9ERV9XUkFQX0VOQ09ERVJfVEFSR0VUICAgICAgICAgPSAweDAwMDQKK30gRFJDX1BSRVNfTU9ERV9XUkFQX1BBUkFNOworCisKK2NsYXNzIENEcmNQcmVzTW9kZVdyYXBwZXIgeworcHVibGljOgorICAgIENEcmNQcmVzTW9kZVdyYXBwZXIoKTsKKyAgICB+Q0RyY1ByZXNNb2RlV3JhcHBlcigpOworICAgIHZvaWQgc2V0RGVjb2RlckhhbmRsZShjb25zdCBIQU5ETEVfQUFDREVDT0RFUiBoYW5kbGUpOworICAgIHZvaWQgc2V0UGFyYW0oY29uc3QgRFJDX1BSRVNfTU9ERV9XUkFQX1BBUkFNIHBhcmFtLCBjb25zdCBpbnQgdmFsdWUpOworICAgIHZvaWQgc3VibWl0U3RyZWFtRGF0YShDU3RyZWFtSW5mbyopOworICAgIHZvaWQgdXBkYXRlKCk7CisKK3Byb3RlY3RlZDoKKyAgICBIQU5ETEVfQUFDREVDT0RFUiBtSGFuZGxlRGVjb2RlcjsKKyAgICBpbnQgbURlc1RhcmdldDsKKyAgICBpbnQgbURlc0F0dEZhY3RvcjsKKyAgICBpbnQgbURlc0Jvb3N0RmFjdG9yOworICAgIGludCBtRGVzSGVhdnk7CisKKyAgICBpbnQgbUVuY29kZXJUYXJnZXQ7CisKKyAgICBpbnQgbUxhc3RUYXJnZXQ7CisgICAgaW50IG1MYXN0QXR0RmFjdG9yOworICAgIGludCBtTGFzdEJvb3N0RmFjdG9yOworICAgIGludCBtTGFzdEhlYXZ5OworCisgICAgU0NIQVIgbVN0cmVhbVBSTDsKKyAgICBTQ0hBUiBtU3RyZWFtRFJDUHJlc01vZGU7CisgICAgSU5UIG1TdHJlYW1OckFBQ0NoYW47CisgICAgSU5UIG1TdHJlYW1Ock91dENoYW47CisKKyAgICBib29sIG1Jc0Rvd25taXg7CisgICAgYm9vbCBtSXNNb25vRG93bm1peDsKKyAgICBib29sIG1Jc1N0ZXJlb0Rvd25taXg7CisKKyAgICBib29sIG1EYXRhVXBkYXRlOworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWIxZWZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL05PVElDRQpAQCAtMCwwICsxLDE5MCBAQAorCisgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9wYXRlbnRfZGlzY2xhaW1lci50eHQgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvcGF0ZW50X2Rpc2NsYWltZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YmYxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvcGF0ZW50X2Rpc2NsYWltZXIudHh0CkBAIC0wLDAgKzEsOSBAQAorCitUSElTIElTIE5PVCBBIEdSQU5UIE9GIFBBVEVOVCBSSUdIVFMuCisKK0dvb2dsZSBtYWtlcyBubyByZXByZXNlbnRhdGlvbiBvciB3YXJyYW50eSB0aGF0IHRoZSBjb2RlY3MgZm9yIHdoaWNoCitzb3VyY2UgY29kZSBpcyBtYWRlIGF2YWlsYWJsZSBoZXJldW5kZXIgYXJlIHVuZW5jdW1iZXJlZCBieQordGhpcmQtcGFydHkgcGF0ZW50cy4gIFRob3NlIGludGVuZGluZyB0byB1c2UgdGhpcyBzb3VyY2UgY29kZSBpbgoraGFyZHdhcmUgb3Igc29mdHdhcmUgcHJvZHVjdHMgYXJlIGFkdmlzZWQgdGhhdCBpbXBsZW1lbnRhdGlvbnMgb2YKK3RoZXNlIGNvZGVjcywgaW5jbHVkaW5nIGluIG9wZW4gc291cmNlIHNvZnR3YXJlIG9yIHNoYXJld2FyZSwgbWF5CityZXF1aXJlIHBhdGVudCBsaWNlbnNlcyBmcm9tIHRoZSByZWxldmFudCBwYXRlbnQgaG9sZGVycy4KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UyNWJjOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNzcgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYW1ybmJkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEFtckRlYy5jcHAiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURBTVJOQiIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYmRlYyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJ3YmRlYyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYW1yd2JkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEFtckRlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYmRlYyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJ3YmRlYyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYW1ybmJlbmMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEFtck5iRW5jLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZW5jIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbiIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hbXJ3YmVuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0QW1yV2JFbmMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1yd2JlbmMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZW5jX2NvbW1vbiIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtckRlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU5MWUyMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJEZWMuY3BwCkBAIC0wLDAgKzEsNDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2lmZGVmIEFNUk5CCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEFtck5iRGVjIgorI2Vsc2UKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0QW1yV2JEZWMiCisjZW5kaWYKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0QW1yRGVjLmgiCisjaW5jbHVkZSAiZ3NtYW1yX2RlYy5oIgorI2luY2x1ZGUgInB2YW1yd2JkZWNvZGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2lmZGVmIEFNUk5CCisgIGNvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5hbXJuYi5kZWNvZGVyIjsKKyNlbHNlCisgIGNvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5hbXJ3Yi5kZWNvZGVyIjsKKyNlbmRpZgorCitjbGFzcyBDMlNvZnRBbXJEZWM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX05BTUVfSU5QVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Gb3JtYXRDb25maWc6OmlucHV0KDB1LCBDMkZvcm1hdENvbXByZXNzZWQpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfTkFNRV9PVVRQVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Gb3JtYXRDb25maWc6Om91dHB1dCgwdSwgQzJGb3JtYXRBdWRpbykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX05BTUVfSU5QVVRfUE9SVF9NSU1FX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1pbWVDb25maWc6OmlucHV0PigKKyNpZmRlZiBBTVJOQgorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCCisjZW5kaWYKKyAgICAgICAgICAgICAgICApKS5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfTkFNRV9PVVRQVVRfUE9SVF9NSU1FX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1pbWVDb25maWc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX05BTUVfU1RSRUFNX1NBTVBMRV9SQVRFX1NFVFRJTkcpCisjaWZkZWYgQU1STkIKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgODAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmVxdWFsVG8oODAwMCl9KQorI2Vsc2UKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgMTYwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5lcXVhbFRvKDE2MDAwKX0pCisjZW5kaWYKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfTkFNRV9TVFJFQU1fQ0hBTk5FTF9DT1VOVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmVxdWFsVG8oMSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9OQU1FX1NUUkVBTV9CSVRSQVRFX1NFVFRJTkcpCisjaWZkZWYgQU1STkIKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyQml0cmF0ZVR1bmluZzo6aW5wdXQoMHUsIDQ3NTApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDQ3NTAsIDEyMjAwKX0pCisjZWxzZQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJCaXRyYXRlVHVuaW5nOjppbnB1dCgwdSwgNjYwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoNjYwMCwgMjM4NTApfSkKKyNlbmRpZgorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDgxOTIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRm9ybWF0Q29uZmlnOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJpdHJhdGVUdW5pbmc6OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRBbXJEZWM6OkMyU29mdEFtckRlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtQW1ySGFuZGxlKG51bGxwdHIpLAorICAgICAgbURlY29kZXJCdWYobnVsbHB0ciksCisgICAgICBtRGVjb2RlckNvb2tpZShudWxscHRyKSB7CisjaWZkZWYgQU1STkIKKyAgICBtSXNXaWRlID0gZmFsc2U7CisjZWxzZQorICAgIG1Jc1dpZGUgPSB0cnVlOworI2VuZGlmCit9CisKK0MyU29mdEFtckRlYzo6fkMyU29mdEFtckRlYygpIHsKKyAgICAodm9pZClvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW1yRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9OT19NRU1PUlk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtckRlYzo6b25TdG9wKCkgeworICAgIGlmICghbUlzV2lkZSkgeworICAgICAgICBTcGVlY2hfRGVjb2RlX0ZyYW1lX3Jlc2V0KG1BbXJIYW5kbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHB2RGVjb2Rlcl9BbXJXYl9SZXNldChtQW1ySGFuZGxlLCAwIC8qIHJlc2V0X2FsbCAqLyk7CisgICAgfQorICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBbXJEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0QW1yRGVjOjpvblJlbGVhc2UoKSB7CisgICAgaWYgKCFtSXNXaWRlKSB7CisgICAgICAgIGlmIChtQW1ySGFuZGxlKSB7CisgICAgICAgICAgICBHU01EZWNvZGVGcmFtZUV4aXQoJm1BbXJIYW5kbGUpOworICAgICAgICB9CisgICAgICAgIG1BbXJIYW5kbGUgPSBudWxscHRyOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtRGVjb2RlckJ1ZikgeworICAgICAgICAgICAgZnJlZShtRGVjb2RlckJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgbURlY29kZXJCdWYgPSBudWxscHRyOworICAgICAgICBtQW1ySGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgbURlY29kZXJDb29raWUgPSBudWxscHRyOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW1yRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBvblN0b3AoKTsKK30KKworc3RhdHVzX3QgQzJTb2Z0QW1yRGVjOjppbml0RGVjb2RlcigpIHsKKyAgICBpZiAoIW1Jc1dpZGUpIHsKKyAgICAgICAgaWYgKEdTTUluaXREZWNvZGUoJm1BbXJIYW5kbGUsIChpbnQ4X3QgKikiQU1STkJEZWNvZGVyIikpCisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICB1aW50MzJfdCBtZW1SZXEgPSBwdkRlY29kZXJfQW1yV2JNZW1SZXF1aXJlbWVudHMoKTsKKyAgICAgICAgbURlY29kZXJCdWYgPSBtYWxsb2MobWVtUmVxKTsKKyAgICAgICAgaWYgKG1EZWNvZGVyQnVmKSB7CisgICAgICAgICAgICBwdkRlY29kZXJfQW1yV2JfSW5pdCgmbUFtckhhbmRsZSwgbURlY29kZXJCdWYsICZtRGVjb2RlckNvb2tpZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgfQorICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdGljIHNpemVfdCBnZXRGcmFtZVNpemUoYm9vbCBpc1dpZGUsIHVuc2lnbmVkIEZNKSB7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrRnJhbWVTaXplTkJbMTZdID0geworICAgICAgICAxMiwgMTMsIDE1LCAxNywgMTksIDIwLCAyNiwgMzEsCisgICAgICAgIDUsIDYsIDUsIDUsIC8vIFNJRAorICAgICAgICAwLCAwLCAwLCAvLyBmdXR1cmUgdXNlCisgICAgICAgIDAgLy8gbm8gZGF0YQorICAgIH07CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrRnJhbWVTaXplV0JbMTZdID0geworICAgICAgICAxNywgMjMsIDMyLCAzNiwgNDAsIDQ2LCA1MCwgNTgsIDYwLAorICAgICAgICA1LCAvLyBTSUQKKyAgICAgICAgMCwgMCwgMCwgMCwgLy8gZnV0dXJlIHVzZQorICAgICAgICAwLCAvLyBzcGVlY2ggbG9zdAorICAgICAgICAwIC8vIG5vIGRhdGEKKyAgICB9OworCisgICAgaWYgKEZNID4gMTUgfHwgKGlzV2lkZSAmJiBGTSA+IDkgJiYgRk0gPCAxNCkgfHwgKCFpc1dpZGUgJiYgRk0gPiAxMSAmJiBGTSA8IDE1KSkgeworICAgICAgICBBTE9HRSgiaWxsZWdhbCBBTVIgZnJhbWUgbW9kZSAlZCIsIEZNKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8vIGFkZCAxIGZvciBoZWFkZXIgYnl0ZQorICAgIHJldHVybiAoaXNXaWRlID8ga0ZyYW1lU2l6ZVdCW0ZNXSA6IGtGcmFtZVNpemVOQltGTV0pICsgMTsKK30KKworc3RhdGljIHN0YXR1c190IGNhbGN1bGF0ZU51bUZyYW1lcyhjb25zdCB1aW50OCAqaW5wdXQsIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gKmZyYW1lU2l6ZUxpc3QsIGJvb2wgaXNXaWRlKSB7CisgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBpblNpemU7KSB7CisgICAgICAgIGludDE2X3QgRk0gPSAoKGlucHV0WzBdID4+IDMpICYgMHgwZik7CisgICAgICAgIHNpemVfdCBmcmFtZVNpemUgPSBnZXRGcmFtZVNpemUoaXNXaWRlLCBGTSk7CisgICAgICAgIGlmIChmcmFtZVNpemUgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChpblNpemUgLSBrKSA+PSBmcmFtZVNpemUpIHsKKyAgICAgICAgICAgIGlucHV0ICs9IGZyYW1lU2l6ZTsKKyAgICAgICAgICAgIGsgKz0gZnJhbWVTaXplOworICAgICAgICB9CisgICAgICAgIGVsc2UgYnJlYWs7CisgICAgICAgIGZyYW1lU2l6ZUxpc3QtPnB1c2hfYmFjayhmcmFtZVNpemUpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QW1yRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHJWaWV3LmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGVvcyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDA7CisgICAgaWYgKGluU2l6ZSA9PSAwKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCIsIGluU2l6ZSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworCisgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiBmcmFtZVNpemVMaXN0OworICAgIGlmIChPSyAhPSBjYWxjdWxhdGVOdW1GcmFtZXMoclZpZXcuZGF0YSgpICsgaW5PZmZzZXQsIGluU2l6ZSwgJmZyYW1lU2l6ZUxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSXNXaWRlKSkgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGZyYW1lU2l6ZUxpc3QuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiaW5wdXQgc2l6ZSBzbWFsbGVyIHRoYW4gZXhwZWN0ZWQiKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MTZfdCBvdXRTYW1wbGVzID0gbUlzV2lkZSA/IGtOdW1TYW1wbGVzUGVyRnJhbWVXQiA6IGtOdW1TYW1wbGVzUGVyRnJhbWVOQjsKKyAgICBzaXplX3QgY2FsT3V0U2l6ZSA9IG91dFNhbXBsZXMgKiBmcmFtZVNpemVMaXN0LnNpemUoKSAqIHNpemVvZihpbnQxNl90KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2soY2FsT3V0U2l6ZSwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IHdWaWV3LmVycm9yKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQxNl90ICpvdXRwdXQgPSByZWludGVycHJldF9jYXN0PGludDE2X3QgKj4od1ZpZXcuZGF0YSgpKTsKKyAgICBhdXRvIGl0ID0gZnJhbWVTaXplTGlzdC5iZWdpbigpOworICAgIGNvbnN0IHVpbnQ4X3QgKmluUHRyID0gclZpZXcuZGF0YSgpICsgaW5PZmZzZXQ7CisgICAgc2l6ZV90IGluUG9zID0gMDsKKyAgICB3aGlsZSAoaW5Qb3MgPCBpblNpemUpIHsKKyAgICAgICAgaWYgKGl0ID09IGZyYW1lU2l6ZUxpc3QuZW5kKCkpIHsKKyAgICAgICAgICAgIEFMT0dEKCJ1bmV4cGVjdGVkIHRyYWlsaW5nIGJ5dGVzLCBpZ25vcmluZyB0aGVtIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB1aW50OF90ICppbnB1dCA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihpblB0ciArIGluUG9zKTsKKyAgICAgICAgaW50MTZfdCBGTSA9ICgoKmlucHV0ID4+IDMpICYgMHgwZik7CisgICAgICAgIGlmICghbUlzV2lkZSkgeworICAgICAgICAgICAgaW50MzJfdCBudW1CeXRlc1JlYWQgPSBBTVJEZWNvZGUobUFtckhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGcmFtZV9UeXBlXzNHUFApIEZNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgKyAxLCBvdXRwdXQsIE1JTUVfSUVURik7CisgICAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90PihudW1CeXRlc1JlYWQgKyAxKSAhPSAqaXQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgicGFuaWMsIHBhcnNlZCBzaXplIGRvZXMgbm90IG1hdGNoIGRlY29kZWQgc2l6ZSIpOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChGTSA+PSA5KSB7CisgICAgICAgICAgICAgICAgLy8gUHJvZHVjZSBzaWxlbmNlIGluc3RlYWQgb2YgY29tZm9ydCBub2lzZSBhbmQgZm9yCisgICAgICAgICAgICAgICAgLy8gc3BlZWNoIGxvc3Qvbm8gZGF0YS4KKyAgICAgICAgICAgICAgICBtZW1zZXQob3V0cHV0LCAwLCBvdXRTYW1wbGVzICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50MTZfdCBGVDsKKyAgICAgICAgICAgICAgICBSWF9TdGF0ZV93YiByeF9zdGF0ZTsKKyAgICAgICAgICAgICAgICBpbnQxNl90IG51bVJlY1NhbXBsZXM7CisKKyAgICAgICAgICAgICAgICBtaW1lX3Vuc29ydGluZyhjb25zdF9jYXN0PHVpbnQ4X3QgKj4oJmlucHV0WzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRTYW1wbGVCdWZmZXIsICZGVCwgJkZNLCAxLCAmcnhfc3RhdGUpOworICAgICAgICAgICAgICAgIHB2RGVjb2Rlcl9BbXJXYihGTSwgbUlucHV0U2FtcGxlQnVmZmVyLCBvdXRwdXQsICZudW1SZWNTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVjb2RlckJ1ZiwgRlQsIG1EZWNvZGVyQ29va2llKTsKKyAgICAgICAgICAgICAgICBpZiAobnVtUmVjU2FtcGxlcyAhPSBvdXRTYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJTYW1wbGUgb3V0cHV0IHBlciBmcmFtZSBpbmNvcnJlY3QiKTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIERlbGV0ZSB0aGUgMiBMU0JzICgxNC1iaXQgb3V0cHV0KSAqLworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUmVjU2FtcGxlczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dFtpXSAmPSAweGZmZkM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGluUG9zICs9ICppdDsKKyAgICAgICAgb3V0cHV0ICs9IG91dFNhbXBsZXM7CisgICAgICAgICsraXQ7CisgICAgfQorCisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrKSk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBbXJEZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZClwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjbGFzcyBDMlNvZnRBTVJEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0QU1SRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEFtckRlYyhDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEFtckRlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRBbXJEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBbXJEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRBTVJEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRBTVJEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mzg0NDUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtckRlYy5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9BTVJfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9BTVJfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdEFtckRlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRBbXJEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0QW1yRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga051bVNhbXBsZXNQZXJGcmFtZU5CICAgPSAxNjAsCisgICAgICAgIGtOdW1TYW1wbGVzUGVyRnJhbWVXQiAgID0gMzIwLAorICAgIH07CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIHZvaWQgKm1BbXJIYW5kbGU7CisgICAgdm9pZCAqbURlY29kZXJCdWY7CisgICAgaW50MTZfdCAqbURlY29kZXJDb29raWU7CisKKyAgICBpbnQxNl90IG1JbnB1dFNhbXBsZUJ1ZmZlcls0NzddOworCisgICAgYm9vbCBtSXNXaWRlOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRBbXJEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfQU1SX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtck5iRW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJOYkVuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EyMTQ4MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJOYkVuYy5jcHAKQEAgLTAsMCArMSwzNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEFtck5iRW5jIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRBbXJOYkVuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5hbXJuYi5lbmNvZGVyIjsKKworY2xhc3MgQzJTb2Z0QW1yTmJFbmM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+JiBoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX05BTUVfSU5QVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEMyU3RyZWFtRm9ybWF0Q29uZmlnOjppbnB1dCgwdSwgQzJGb3JtYXRBdWRpbykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX05BTUVfT1VUUFVUX1NUUkVBTV9GT1JNQVRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0KDB1LCBDMkZvcm1hdENvbXByZXNzZWQpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX05BTUVfSU5QVVRfUE9SVF9NSU1FX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1pbWVDb25maWc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfTkFNRV9PVVRQVVRfUE9SVF9NSU1FX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1pbWVDb25maWc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9OQU1FX1NUUkVBTV9DSEFOTkVMX0NPVU5UX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86OmlucHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5lcXVhbFRvKDEpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9OQU1FX1NUUkVBTV9TQU1QTEVfUkFURV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQoMHUsIDgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5lcXVhbFRvKDgwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICAgICAgKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9OQU1FX1NUUkVBTV9CSVRSQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMkJpdHJhdGVUdW5pbmc6Om91dHB1dCgwdSwgNDc1MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoNDc1MCwgMTIyMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA4MTkyKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgdWludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1TYW1wbGVSYXRlLT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldENoYW5uZWxDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsQ291bnQtPnZhbHVlOyB9CisgICAgdWludDMyX3QgZ2V0Qml0cmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlLT52YWx1ZTsgfQorCisgICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZvcm1hdENvbmZpZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Gb3JtYXRDb25maWc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWltZUNvbmZpZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQml0cmF0ZVR1bmluZzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRBbXJOYkVuYzo6QzJTb2Z0QW1yTmJFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1FbmNTdGF0ZShudWxscHRyKSwKKyAgICAgIG1TaWRTdGF0ZShudWxscHRyKSB7Cit9CisKK0MyU29mdEFtck5iRW5jOjp+QzJTb2Z0QW1yTmJFbmMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtck5iRW5jOjpvbkluaXQoKSB7CisgICAgYm9vbCBkdHhfZW5hYmxlID0gZmFsc2U7CisKKyAgICBpZiAoQU1SRW5jb2RlSW5pdCgmbUVuY1N0YXRlLCAmbVNpZFN0YXRlLCBkdHhfZW5hYmxlKSAhPSAwKQorICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIC8vIFRPRE86IGdldCBtb2RlIGRpcmVjdGx5IGZyb20gY29uZmlnCisgICAgc3dpdGNoKG1JbnRmLT5nZXRCaXRyYXRlKCkpIHsKKyAgICAgICAgY2FzZSA0NzUwOiBtTW9kZSA9IE1SNDc1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNTE1MDogbU1vZGUgPSBNUjUxNTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU5MDA6IG1Nb2RlID0gTVI1OTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY3MDA6IG1Nb2RlID0gTVI2NzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc0MDA6IG1Nb2RlID0gTVI3NDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc5NTA6IG1Nb2RlID0gTVI3OTU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDIwMDogbU1vZGUgPSBNUjEwMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEyMjAwOiBtTW9kZSA9IE1SMTIyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IG1Nb2RlID0gTVI3OTU7CisgICAgfQorICAgIG1Jc0ZpcnN0ID0gdHJ1ZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDA7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwOworICAgIG1GaWxsZWRMZW4gPSAwOworCisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEFtck5iRW5jOjpvblJlbGVhc2UoKSB7CisgICAgaWYgKG1FbmNTdGF0ZSkgeworICAgICAgICBBTVJFbmNvZGVFeGl0KCZtRW5jU3RhdGUsICZtU2lkU3RhdGUpOworICAgICAgICBtRW5jU3RhdGUgPSBtU2lkU3RhdGUgPSBudWxscHRyOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW1yTmJFbmM6Om9uU3RvcCgpIHsKKyAgICBpZiAoQU1SRW5jb2RlUmVzZXQobUVuY1N0YXRlLCBtU2lkU3RhdGUpICE9IDApCisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgbUlzRmlyc3QgPSB0cnVlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDA7CisgICAgbUZpbGxlZExlbiA9IDA7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QW1yTmJFbmM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpIG9uU3RvcCgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBbXJOYkVuYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCit2b2lkIEMyU29mdEFtck5iRW5jOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQsIGZsYWdzICV4IiwKKyAgICAgICAgICBpblNpemUsIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLCB3b3JrLT5pbnB1dC5mbGFncyk7CisKKyAgICBzaXplX3Qgb3V0Q2FwYWNpdHkgPSBrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lOworICAgIG91dENhcGFjaXR5ICs9IG1GaWxsZWRMZW4gKyBpblNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IG91dHB1dEJsb2NrOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKG91dENhcGFjaXR5LCB1c2FnZSwgJm91dHB1dEJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gb3V0cHV0QmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHVpbnQ2NF90IG91dFRpbWVTdGFtcCA9CisgICAgICAgIG1Qcm9jZXNzZWRTYW1wbGVzICogMTAwMDAwMGxsIC8gbUludGYtPmdldFNhbXBsZVJhdGUoKTsKKyAgICBzaXplX3QgaW5Qb3MgPSAwOworICAgIHNpemVfdCBvdXRQb3MgPSAwOworICAgIHdoaWxlIChpblBvcyA8IGluU2l6ZSkgeworICAgICAgICBjb25zdCB1aW50OF90ICppblB0ciA9IHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0OworICAgICAgICBpbnQgdmFsaWRTYW1wbGVzID0gbUZpbGxlZExlbiAvIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgaWYgKChpblBvcyArIChrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbikpIDw9IGluU2l6ZSkgeworICAgICAgICAgICAgbWVtY3B5KG1JbnB1dEZyYW1lICsgdmFsaWRTYW1wbGVzLCBpblB0ciArIGluUG9zLAorICAgICAgICAgICAgICAgICAgIChrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbikpOworICAgICAgICAgICAgaW5Qb3MgKz0gKGtOdW1CeXRlc1BlcklucHV0RnJhbWUgLSBtRmlsbGVkTGVuKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweShtSW5wdXRGcmFtZSArIHZhbGlkU2FtcGxlcywgaW5QdHIgKyBpblBvcywgKGluU2l6ZSAtIGluUG9zKSk7CisgICAgICAgICAgICBtRmlsbGVkTGVuICs9IChpblNpemUgLSBpblBvcyk7CisgICAgICAgICAgICBpblBvcyArPSAoaW5TaXplIC0gaW5Qb3MpOworICAgICAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgICAgIHZhbGlkU2FtcGxlcyA9IG1GaWxsZWRMZW4gLyBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICAgICAgbWVtc2V0KG1JbnB1dEZyYW1lICsgdmFsaWRTYW1wbGVzLCAwLCAoa051bUJ5dGVzUGVySW5wdXRGcmFtZSAtIG1GaWxsZWRMZW4pKTsKKyAgICAgICAgICAgIH0gZWxzZSBicmVhazsKKworICAgICAgICB9CisgICAgICAgIEZyYW1lX1R5cGVfM0dQUCBmcmFtZVR5cGU7CisgICAgICAgIGludCBudW1FbmNCeXRlcyA9IEFNUkVuY29kZShtRW5jU3RhdGUsIG1TaWRTdGF0ZSwgbU1vZGUsIG1JbnB1dEZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1ZpZXcuZGF0YSgpICsgb3V0UG9zLCAmZnJhbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1SX1RYX1dNRik7CisgICAgICAgIGlmIChudW1FbmNCeXRlcyA8IDAgfHwgbnVtRW5jQnl0ZXMgPiAoKGludClvdXRDYXBhY2l0eSAtIChpbnQpb3V0UG9zKSkgeworICAgICAgICAgICAgQUxPR0UoImVuY29kZUZyYW1lIGNhbGwgZmFpbGVkLCBzdGF0ZSBbJWQgJXp1ICV6dV0iLCBudW1FbmNCeXRlcywgb3V0UG9zLCBvdXRDYXBhY2l0eSk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIENvbnZlcnQgaGVhZGVyIGJ5dGUgZnJvbSBXTUYgdG8gSUVURiBmb3JtYXQuCisgICAgICAgIGlmIChudW1FbmNCeXRlcyA+IDApCisgICAgICAgICAgICB3Vmlldy5kYXRhKClbb3V0UG9zXSA9ICgod1ZpZXcuZGF0YSgpW291dFBvc10gPDwgMykgfCA0KSAmIDB4N2M7CisgICAgICAgIG91dFBvcyArPSBudW1FbmNCeXRlczsKKyAgICAgICAgbVByb2Nlc3NlZFNhbXBsZXMgKz0ga051bVNhbXBsZXNQZXJGcmFtZTsKKyAgICAgICAgbUZpbGxlZExlbiA9IDA7CisgICAgfQorICAgIEFMT0dWKCJjYXVzYWwgc2FtcGxlIHNpemUgJWQiLCBtRmlsbGVkTGVuKTsKKyAgICBpZiAobUlzRmlyc3QpIHsKKyAgICAgICAgbUlzRmlyc3QgPSBmYWxzZTsKKyAgICAgICAgbUFuY2hvclRpbWVTdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1bGwoKTsKKyAgICB9CisgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICBpZiAob3V0UG9zICE9IDApIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIGNyZWF0ZUxpbmVhckJ1ZmZlcihzdGQ6Om1vdmUob3V0cHV0QmxvY2spLCAwLCBvdXRQb3MpKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wID0gbUFuY2hvclRpbWVTdGFtcCArIG91dFRpbWVTdGFtcDsKKworICAgIH0KKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICBpZiAobUZpbGxlZExlbikgQUxPR1YoIkRpc2NhcmRpbmcgdHJhaWxpbmcgJWQgYnl0ZXMiLCBtRmlsbGVkTGVuKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtck5iRW5jOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIG9uRmx1c2hfc20oKTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NsYXNzIEMyU29mdEFtck5iRW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEFtck5iRW5jRmFjdG9yeSgpCisgICAgICAgIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7fQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgIG5ldyBDMlNvZnRBbXJOYkVuYygKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBbXJOYkVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0QW1yTmJFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBbXJOYkVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0QW1yTmJFbmNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRBbXJOYkVuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtck5iRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yTmJFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWIxNGRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtck5iRW5jLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0FNUl9OQl9FTkNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0FNUl9OQl9FTkNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJnc21hbXJfZW5jLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQzJTb2Z0QW1yTmJFbmMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgcHVibGljOgorICAgIGNsYXNzIEludGZJbXBsOworICAgIEMyU29mdEFtck5iRW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0QW1yTmJFbmMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrTnVtU2FtcGxlc1BlckZyYW1lID0gTF9GUkFNRTsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lID0ga051bVNhbXBsZXNQZXJGcmFtZSAqIHNpemVvZihpbnQxNl90KTsKKworICAgIHZvaWQgKm1FbmNTdGF0ZTsKKyAgICB2b2lkICptU2lkU3RhdGU7CisgICAgTW9kZSBtTW9kZTsKKyAgICBib29sIG1Jc0ZpcnN0OworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICB1aW50NjRfdCBtQW5jaG9yVGltZVN0YW1wOworICAgIHVpbnQ2NF90IG1Qcm9jZXNzZWRTYW1wbGVzOworICAgIGludDMyX3QgbUZpbGxlZExlbjsKKyAgICBpbnQxNl90IG1JbnB1dEZyYW1lW2tOdW1TYW1wbGVzUGVyRnJhbWVdOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0QW1yTmJFbmMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfQU1SX05CX0VOQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtcldiRW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJXYkVuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUzODkyZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJXYkVuYy5jcHAKQEAgLTAsMCArMSw0MzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEFtcldiRW5jIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0QW1yV2JFbmMuaCIKKyNpbmNsdWRlICJjbW5NZW1vcnkuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuYW1yd2IuZW5jb2RlciI7CisKK2NsYXNzIEMyU29mdEFtcldiRW5jOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiYgaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9OQU1FX0lOUFVUX1NUUkVBTV9GT1JNQVRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbUZvcm1hdENvbmZpZzo6aW5wdXQoMHUsIEMyRm9ybWF0QXVkaW8pKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9OQU1FX09VVFBVVF9TVFJFQU1fRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKAorICAgICAgICAgICAgICAgICAgICBuZXcgQzJTdHJlYW1Gb3JtYXRDb25maWc6Om91dHB1dCgwdSwgQzJGb3JtYXRDb21wcmVzc2VkKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9OQU1FX0lOUFVUX1BPUlRfTUlNRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNaW1lQ29uZmlnOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX05BTUVfT1VUUFVUX1BPUlRfTUlNRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfTkFNRV9TVFJFQU1fQ0hBTk5FTF9DT1VOVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuZXF1YWxUbygxKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfTkFNRV9TVFJFQU1fU0FNUExFX1JBVEVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86OmlucHV0KDB1LCAxNjAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmVxdWFsVG8oMTYwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICAgICAgKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9OQU1FX1NUUkVBTV9CSVRSQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMkJpdHJhdGVUdW5pbmc6Om91dHB1dCgwdSwgNjYwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoNjYwMCwgMjM4NTApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA4MTkyKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgdWludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1TYW1wbGVSYXRlLT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldENoYW5uZWxDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsQ291bnQtPnZhbHVlOyB9CisgICAgdWludDMyX3QgZ2V0Qml0cmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlLT52YWx1ZTsgfQorCisgICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZvcm1hdENvbmZpZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Gb3JtYXRDb25maWc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWltZUNvbmZpZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQml0cmF0ZVR1bmluZzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRBbXJXYkVuYzo6QzJTb2Z0QW1yV2JFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1FbmNvZGVySGFuZGxlKG51bGxwdHIpLAorICAgICAgbUFwaUhhbmRsZShudWxscHRyKSwKKyAgICAgIG1NZW1PcGVyYXRvcihudWxscHRyKSB7Cit9CisKK0MyU29mdEFtcldiRW5jOjp+QzJTb2Z0QW1yV2JFbmMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtcldiRW5jOjpvbkluaXQoKSB7CisgICAgLy8gVE9ETzogZ2V0IG1vZGUgZGlyZWN0bHkgZnJvbSBjb25maWcKKyAgICBzd2l0Y2gobUludGYtPmdldEJpdHJhdGUoKSkgeworICAgICAgICBjYXNlIDY2MDA6IG1Nb2RlID0gVk9BTVJXQl9NRDY2OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgODg1MDogbU1vZGUgPSBWT0FNUldCX01EODg1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTI2NTA6IG1Nb2RlID0gVk9BTVJXQl9NRDEyNjU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNDI1MDogbU1vZGUgPSBWT0FNUldCX01EMTQyNTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE1ODUwOiBtTW9kZSA9IFZPQU1SV0JfTUQxNTg1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTgyNTA6IG1Nb2RlID0gVk9BTVJXQl9NRDE4MjU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOTg1MDogbU1vZGUgPSBWT0FNUldCX01EMTk4NTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDIzMDUwOiBtTW9kZSA9IFZPQU1SV0JfTUQyMzA1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjM4NTA6IG1Nb2RlID0gVk9BTVJXQl9NRDIzODU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogbU1vZGUgPSBWT0FNUldCX01EMjMwNTsKKyAgICB9CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdEVuY29kZXIoKTsKKyAgICBtSXNGaXJzdCA9IHRydWU7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMDsKKyAgICBtRmlsbGVkTGVuID0gMDsKKworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX05PX01FTU9SWTsKK30KKwordm9pZCBDMlNvZnRBbXJXYkVuYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtRW5jb2RlckhhbmRsZSkgeworICAgICAgICBDSEVDS19FUSgoVk9fVTMyKVZPX0VSUl9OT05FLCBtQXBpSGFuZGxlLT5VbmluaXQobUVuY29kZXJIYW5kbGUpKTsKKyAgICAgICAgbUVuY29kZXJIYW5kbGUgPSBudWxscHRyOworICAgIH0KKyAgICBpZiAobUFwaUhhbmRsZSkgeworICAgICAgICBkZWxldGUgbUFwaUhhbmRsZTsKKyAgICAgICAgbUFwaUhhbmRsZSA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtTWVtT3BlcmF0b3IpIHsKKyAgICAgICAgZGVsZXRlIG1NZW1PcGVyYXRvcjsKKyAgICAgICAgbU1lbU9wZXJhdG9yID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtcldiRW5jOjpvblN0b3AoKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtU2FtcGxlc1BlckZyYW1lOyBpKyspIHsKKyAgICAgICAgbUlucHV0RnJhbWVbaV0gPSAweDAwMDg7IC8qIEVIRl9NQVNLICovCisgICAgfQorICAgIHVpbnQ4X3Qgb3V0QnVmZmVyW2tOdW1CeXRlc1BlcklucHV0RnJhbWVdOworICAgICh2b2lkKSBlbmNvZGVJbnB1dChvdXRCdWZmZXIsIGtOdW1CeXRlc1BlcklucHV0RnJhbWUpOworICAgIG1Jc0ZpcnN0ID0gdHJ1ZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDA7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwOworICAgIG1GaWxsZWRMZW4gPSAwOworCisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEFtcldiRW5jOjpvblJlc2V0KCkgeworICAgICh2b2lkKSBvblN0b3AoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW1yV2JFbmM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCitzdGF0dXNfdCBDMlNvZnRBbXJXYkVuYzo6aW5pdEVuY29kZXIoKSB7CisgICAgbUFwaUhhbmRsZSA9IG5ldyBWT19BVURJT19DT0RFQ0FQSTsKKyAgICBpZiAoIW1BcGlIYW5kbGUpIHJldHVybiBOT19NRU1PUlk7CisKKyAgICBpZiAoVk9fRVJSX05PTkUgIT0gdm9HZXRBTVJXQkVuY0FQSShtQXBpSGFuZGxlKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBhcGkgaGFuZGxlIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIG1NZW1PcGVyYXRvciA9IG5ldyBWT19NRU1fT1BFUkFUT1I7CisgICAgaWYgKCFtTWVtT3BlcmF0b3IpIHJldHVybiBOT19NRU1PUlk7CisKKyAgICBtTWVtT3BlcmF0b3ItPkFsbG9jID0gY21uTWVtQWxsb2M7CisgICAgbU1lbU9wZXJhdG9yLT5Db3B5ID0gY21uTWVtQ29weTsKKyAgICBtTWVtT3BlcmF0b3ItPkZyZWUgPSBjbW5NZW1GcmVlOworICAgIG1NZW1PcGVyYXRvci0+U2V0ID0gY21uTWVtU2V0OworICAgIG1NZW1PcGVyYXRvci0+Q2hlY2sgPSBjbW5NZW1DaGVjazsKKworICAgIFZPX0NPREVDX0lOSVRfVVNFUkRBVEEgdXNlckRhdGE7CisgICAgbWVtc2V0KCZ1c2VyRGF0YSwgMCwgc2l6ZW9mKHVzZXJEYXRhKSk7CisgICAgdXNlckRhdGEubWVtZmxhZyA9IFZPX0lNRl9VU0VSTUVNT1BFUkFUT1I7CisgICAgdXNlckRhdGEubWVtRGF0YSA9IChWT19QVFIpIG1NZW1PcGVyYXRvcjsKKworICAgIGlmIChWT19FUlJfTk9ORSAhPSBtQXBpSGFuZGxlLT5Jbml0KAorICAgICAgICAgICAgICAgICZtRW5jb2RlckhhbmRsZSwgVk9fQVVESU9fQ29kaW5nQU1SV0IsICZ1c2VyRGF0YSkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0IEFNUldCIGVuY29kZXIiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgVk9BTVJXQkZSQU1FVFlQRSB0eXBlID0gVk9BTVJXQl9SRkMzMjY3OworICAgIGlmIChWT19FUlJfTk9ORSAhPSBtQXBpSGFuZGxlLT5TZXRQYXJhbSgKKyAgICAgICAgICAgICAgICBtRW5jb2RlckhhbmRsZSwgVk9fUElEX0FNUldCX0ZSQU1FVFlQRSwgJnR5cGUpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFNUldCIGVuY29kZXIgZnJhbWUgdHlwZSB0byAlZCIsIHR5cGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoVk9fRVJSX05PTkUgIT0KKyAgICAgICAgICAgIG1BcGlIYW5kbGUtPlNldFBhcmFtKAorICAgICAgICAgICAgICAgICAgICBtRW5jb2RlckhhbmRsZSwgVk9fUElEX0FNUldCX01PREUsICAmbU1vZGUpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFNUldCIGVuY29kZXIgbW9kZSB0byAlZCIsIG1Nb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitpbnQgQzJTb2Z0QW1yV2JFbmM6OmVuY29kZUlucHV0KHVpbnQ4X3QgKmJ1ZmZlciwgdWludDMyX3QgbGVuZ3RoKSB7CisgICAgVk9fQ09ERUNCVUZGRVIgaW5wdXREYXRhOworICAgIG1lbXNldCgmaW5wdXREYXRhLCAwLCBzaXplb2YoaW5wdXREYXRhKSk7CisgICAgaW5wdXREYXRhLkJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopIG1JbnB1dEZyYW1lOworICAgIGlucHV0RGF0YS5MZW5ndGggPSBrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lOworCisgICAgQ0hFQ0tfRVEoKFZPX1UzMilWT19FUlJfTk9ORSwKKyAgICAgICAgICAgICBtQXBpSGFuZGxlLT5TZXRJbnB1dERhdGEobUVuY29kZXJIYW5kbGUsICZpbnB1dERhdGEpKTsKKworICAgIFZPX0FVRElPX09VVFBVVElORk8gb3V0cHV0SW5mbzsKKyAgICBtZW1zZXQoJm91dHB1dEluZm8sIDAsIHNpemVvZihvdXRwdXRJbmZvKSk7CisgICAgVk9fQ09ERUNCVUZGRVIgb3V0cHV0RGF0YTsKKyAgICBtZW1zZXQoJm91dHB1dERhdGEsIDAsIHNpemVvZihvdXRwdXREYXRhKSk7CisgICAgb3V0cHV0RGF0YS5CdWZmZXIgPSBidWZmZXI7CisgICAgb3V0cHV0RGF0YS5MZW5ndGggPSBsZW5ndGg7CisgICAgVk9fVTMyIHJldCA9IG1BcGlIYW5kbGUtPkdldE91dHB1dERhdGEoCisgICAgICAgICAgICBtRW5jb2RlckhhbmRsZSwgJm91dHB1dERhdGEsICZvdXRwdXRJbmZvKTsKKyAgICBpZiAocmV0ICE9IFZPX0VSUl9OT05FICYmIHJldCAhPSBWT19FUlJfSU5QVVRfQlVGRkVSX1NNQUxMKSB7CisgICAgICAgIEFMT0dEKCJlbmNvdW50ZXJlZCBlcnJvciBkdXJpbmcgZW5jb2RlIGNhbGwiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gb3V0cHV0RGF0YS5MZW5ndGg7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCit2b2lkIEMyU29mdEFtcldiRW5jOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHJWaWV3LmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBlb3MgPSAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwOworCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCwgZmxhZ3MgJXgiLAorICAgICAgICAgIGluU2l6ZSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCksIHdvcmstPmlucHV0LmZsYWdzKTsKKworICAgIHNpemVfdCBvdXRDYXBhY2l0eSA9IGtOdW1CeXRlc1BlcklucHV0RnJhbWU7CisgICAgb3V0Q2FwYWNpdHkgKz0gbUZpbGxlZExlbiArIGluU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gb3V0cHV0QmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sob3V0Q2FwYWNpdHksIHVzYWdlLCAmb3V0cHV0QmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBvdXRwdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHVpbnQ2NF90IG91dFRpbWVTdGFtcCA9CisgICAgICAgIG1Qcm9jZXNzZWRTYW1wbGVzICogMTAwMDAwMGxsIC8gbUludGYtPmdldFNhbXBsZVJhdGUoKTsKKyAgICBzaXplX3QgaW5Qb3MgPSAwOworICAgIHNpemVfdCBvdXRQb3MgPSAwOworICAgIHdoaWxlIChpblBvcyA8IGluU2l6ZSkgeworICAgICAgICBjb25zdCB1aW50OF90ICppblB0ciA9IHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0OworICAgICAgICBpbnQgdmFsaWRTYW1wbGVzID0gbUZpbGxlZExlbiAvIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgaWYgKChpblBvcyArIChrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbikpIDw9IGluU2l6ZSkgeworICAgICAgICAgICAgbWVtY3B5KG1JbnB1dEZyYW1lICsgdmFsaWRTYW1wbGVzLCBpblB0ciArIGluUG9zLAorICAgICAgICAgICAgICAgICAgIChrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbikpOworICAgICAgICAgICAgaW5Qb3MgKz0gKGtOdW1CeXRlc1BlcklucHV0RnJhbWUgLSBtRmlsbGVkTGVuKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweShtSW5wdXRGcmFtZSArIHZhbGlkU2FtcGxlcywgaW5QdHIgKyBpblBvcywgKGluU2l6ZSAtIGluUG9zKSk7CisgICAgICAgICAgICBtRmlsbGVkTGVuICs9IChpblNpemUgLSBpblBvcyk7CisgICAgICAgICAgICBpblBvcyArPSAoaW5TaXplIC0gaW5Qb3MpOworICAgICAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgICAgIHZhbGlkU2FtcGxlcyA9IG1GaWxsZWRMZW4gLyBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICAgICAgbWVtc2V0KG1JbnB1dEZyYW1lICsgdmFsaWRTYW1wbGVzLCAwLCAoa051bUJ5dGVzUGVySW5wdXRGcmFtZSAtIG1GaWxsZWRMZW4pKTsKKyAgICAgICAgICAgIH0gZWxzZSBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpbnQgbnVtRW5jQnl0ZXMgPSBlbmNvZGVJbnB1dCgod1ZpZXcuZGF0YSgpICsgb3V0UG9zKSwgb3V0Q2FwYWNpdHkgLSBvdXRQb3MpOworICAgICAgICBpZiAobnVtRW5jQnl0ZXMgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiZW5jb2RlRnJhbWUgY2FsbCBmYWlsZWQsIHN0YXRlIFslZCAlenUgJXp1XSIsIG51bUVuY0J5dGVzLCBvdXRQb3MsIG91dENhcGFjaXR5KTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgb3V0UG9zICs9IG51bUVuY0J5dGVzOworICAgICAgICBtUHJvY2Vzc2VkU2FtcGxlcyArPSBrTnVtU2FtcGxlc1BlckZyYW1lOworICAgICAgICBtRmlsbGVkTGVuID0gMDsKKyAgICB9CisgICAgQUxPR1YoImNhdXNhbCBzYW1wbGUgc2l6ZSAlZCIsIG1GaWxsZWRMZW4pOworICAgIGlmIChtSXNGaXJzdCkgeworICAgICAgICBtSXNGaXJzdCA9IGZhbHNlOworICAgICAgICBtQW5jaG9yVGltZVN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3VsbCgpOworICAgIH0KKyAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIGlmIChvdXRQb3MgIT0gMCkgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgY3JlYXRlTGluZWFyQnVmZmVyKHN0ZDo6bW92ZShvdXRwdXRCbG9jayksIDAsIG91dFBvcykpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgPSBtQW5jaG9yVGltZVN0YW1wICsgb3V0VGltZVN0YW1wOworICAgIH0KKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICBpZiAobUZpbGxlZExlbikgQUxPR1YoIkRpc2NhcmRpbmcgdHJhaWxpbmcgJWQgYnl0ZXMiLCBtRmlsbGVkTGVuKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtcldiRW5jOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIG9uRmx1c2hfc20oKTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NsYXNzIEMyU29mdEFtcldiRW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEFtcldiRW5jRmFjdG9yeSgpCisgICAgICAgIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7fQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgIG5ldyBDMlNvZnRBbXJXYkVuYygKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBbXJXYkVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0QW1yV2JFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBbXJXYkVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0QW1yV2JFbmNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRBbXJXYkVuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtcldiRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yV2JFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2M5ZTlmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtcldiRW5jLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0FNUl9XQl9FTkNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0FNUl9XQl9FTkNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJ2b0FNUldCLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQzJTb2Z0QW1yV2JFbmMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworcHVibGljOgorICAgIGNsYXNzIEludGZJbXBsOworICAgIEMyU29mdEFtcldiRW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0QW1yV2JFbmMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrTnVtU2FtcGxlc1BlckZyYW1lID0gMzIwOworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtOdW1CeXRlc1BlcklucHV0RnJhbWUgPSBrTnVtU2FtcGxlc1BlckZyYW1lICogc2l6ZW9mKGludDE2X3QpOworCisgICAgdm9pZCAqbUVuY29kZXJIYW5kbGU7CisgICAgVk9fQVVESU9fQ09ERUNBUEkgKm1BcGlIYW5kbGU7CisgICAgVk9fTUVNX09QRVJBVE9SICptTWVtT3BlcmF0b3I7CisgICAgVk9BTVJXQk1PREUgbU1vZGU7CisgICAgYm9vbCBtSXNGaXJzdDsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgdWludDY0X3QgbUFuY2hvclRpbWVTdGFtcDsKKyAgICB1aW50NjRfdCBtUHJvY2Vzc2VkU2FtcGxlczsKKyAgICBpbnQzMl90IG1GaWxsZWRMZW47CisgICAgaW50MTZfdCBtSW5wdXRGcmFtZVtrTnVtU2FtcGxlc1BlckZyYW1lXTsKKworICAgIHN0YXR1c190IGluaXRFbmNvZGVyKCk7CisgICAgaW50IGVuY29kZUlucHV0KHVpbnQ4X3QgKmJ1ZmZlciwgdWludDMyX3QgbGVuZ3RoKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEFtcldiRW5jKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0FNUl9XQl9FTkNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWIxZWZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL05PVElDRQpAQCAtMCwwICsxLDE5MCBAQAorCisgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9wYXRlbnRfZGlzY2xhaW1lci50eHQgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvcGF0ZW50X2Rpc2NsYWltZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YmYxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvcGF0ZW50X2Rpc2NsYWltZXIudHh0CkBAIC0wLDAgKzEsOSBAQAorCitUSElTIElTIE5PVCBBIEdSQU5UIE9GIFBBVEVOVCBSSUdIVFMuCisKK0dvb2dsZSBtYWtlcyBubyByZXByZXNlbnRhdGlvbiBvciB3YXJyYW50eSB0aGF0IHRoZSBjb2RlY3MgZm9yIHdoaWNoCitzb3VyY2UgY29kZSBpcyBtYWRlIGF2YWlsYWJsZSBoZXJldW5kZXIgYXJlIHVuZW5jdW1iZXJlZCBieQordGhpcmQtcGFydHkgcGF0ZW50cy4gIFRob3NlIGludGVuZGluZyB0byB1c2UgdGhpcyBzb3VyY2UgY29kZSBpbgoraGFyZHdhcmUgb3Igc29mdHdhcmUgcHJvZHVjdHMgYXJlIGFkdmlzZWQgdGhhdCBpbXBsZW1lbnRhdGlvbnMgb2YKK3RoZXNlIGNvZGVjcywgaW5jbHVkaW5nIGluIG9wZW4gc291cmNlIHNvZnR3YXJlIG9yIHNoYXJld2FyZSwgbWF5CityZXF1aXJlIHBhdGVudCBsaWNlbnNlcyBmcm9tIHRoZSByZWxldmFudCBwYXRlbnQgaG9sZGVycy4KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZhYmY1YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTQgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYXYxZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRBb21EZWMuY3BwIl0sCisgICAgc3RhdGljX2xpYnM6IFsibGliYW9tIl0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImV4dGVybmFsL2xpYmFvbS8iLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZTE4MDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmNwcApAQCAtMCwwICsxLDc1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0QW9tRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRBb21EZWMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuYXYxLmRlY29kZXIiOworCitjbGFzcyBDMlNvZnRBb21EZWM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+JiBoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICBoZWxwZXIsIENPTVBPTkVOVF9OQU1FLCBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSLAorICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVjEpIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOyAgLy8gVE9ETzogYWNjb3VudCBmb3Igb3VyIGJ1ZmZlcnMgaGVyZQorICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworCisgICAgICAgIGFkZFBhcmFtZXRlcihEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCwgQzJDb25maWc6OkxFVkVMX0FWMV8yXzEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMX0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVYxXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWMV8yXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWMV8yXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWMV8zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9BVjFfM18xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9BVjFfM18yLAorICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKERlZmluZVBhcmFtKG1NYXhTaXplLCBDMl9QQVJBTUtFWV9NQVhfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFNldHRlcihNYXhQaWN0dXJlU2l6ZVNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhJbnB1dFNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMzIwICogMjQwICogMyAvIDQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1NYXhJbnB1dFNpemUsIHZhbHVlKS5hbnkoKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5jYWxjdWxhdGVkQXMoTWF4SW5wdXRTaXplU2V0dGVyLCBtTWF4U2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgbG9jYXRpb25zWzFdID0geworICAgICAgICAgICAgQzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKX07CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKDF1LCAwdSwgOHUgLyogYml0RGVwdGggKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgbWVtY3B5KGRlZmF1bHRDb2xvckluZm8tPm0ubG9jYXRpb25zLCBsb2NhdGlvbnMsIHNpemVvZihsb2NhdGlvbnMpKTsKKworICAgICAgICBkZWZhdWx0Q29sb3JJbmZvID0gQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICB7QzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKX0sIDB1LCA4dSAvKiBiaXREZXB0aCAqLywKKyAgICAgICAgICAgIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBoZWxwZXItPmFkZFN0cnVjdERlc2NyaXB0b3JzPEMyQ2hyb21hT2Zmc2V0U3RydWN0PigpOworCisgICAgICAgIGFkZFBhcmFtZXRlcihEZWZpbmVQYXJhbShtQ29sb3JJbmZvLCBDMl9QQVJBTUtFWV9DT0RFRF9DT0xPUl9JTkZPKQorICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShkZWZhdWx0Q29sb3JJbmZvKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURlZmF1bHRDb2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX0RFRkFVTFRfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsICAgICBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCAgICBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IG1vcmUgZm9ybWF0cz8KKyAgICAgICAgYWRkUGFyYW1ldGVyKERlZmluZVBhcmFtKG1QaXhlbEZvcm1hdCwgQzJfUEFSQU1LRVlfUElYRUxfRk9STUFUKQorICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4mIG9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJWaWRlb1NpemVTdHJlYW1JbmZvOjpvdXRwdXQ+JiBtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYud2lkdGgpLnN1cHBvcnRzQXRBbGwobWUudi53aWR0aCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi53aWR0aCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heFBpY3R1cmVTaXplU2V0dGVyKAorICAgICAgICBib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiYgbWUsCisgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiYgc2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gVE9ETzogZ2V0IG1heCB3aWR0aC9oZWlnaHQgZnJvbSB0aGUgc2l6ZSdzIGZpZWxkIGhlbHBlcnMgdnMuCisgICAgICAgIC8vIGhhcmRjb2RpbmcKKyAgICAgICAgbWUuc2V0KCkud2lkdGggPSBjMl9taW4oYzJfbWF4KG1lLnYud2lkdGgsIHNpemUudi53aWR0aCksIDQwOTZ1KTsKKyAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gYzJfbWluKGMyX21heChtZS52LmhlaWdodCwgc2l6ZS52LmhlaWdodCksIDQwOTZ1KTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heElucHV0U2l6ZVNldHRlcigKKyAgICAgICAgYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiYgbWUsCisgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+JiBtYXhTaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBhc3N1bWUgY29tcHJlc3Npb24gcmF0aW8gb2YgMgorICAgICAgICBtZS5zZXQoKS52YWx1ZSA9ICgoKG1heFNpemUudi53aWR0aCArIDYzKSAvIDY0KSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICgobWF4U2l6ZS52LmhlaWdodCArIDYzKSAvIDY0KSAqIDMwNzIpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKyAgICBzdGF0aWMgQzJSIERlZmF1bHRDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKG1lLnYucmFuZ2UgPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgICAgICAgbWUuc2V0KCkucmFuZ2UgPSBDMkNvbG9yOjpSQU5HRV9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5wcmltYXJpZXMgPiBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi50cmFuc2ZlciA+IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSB7CisgICAgICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52Lm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgbWUuc2V0KCkubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX09USEVSOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKXNpemU7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+IGdldERlZmF1bHRDb2xvckFzcGVjdHNfbCgpIHsKKyAgICAgICAgcmV0dXJuIG1EZWZhdWx0Q29sb3JBc3BlY3RzOworICAgIH0KKworICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiBtTWF4U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1NYXhJbnB1dFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IG1Db2xvckluZm87CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQ+IG1QaXhlbEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gbURlZmF1bHRDb2xvckFzcGVjdHM7Cit9OworCitDMlNvZnRBb21EZWM6OkMyU29mdEFvbURlYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KAorICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtQ29kZWNDdHgobnVsbHB0cil7CisKKyAgICBHRU5FUkFURV9GSUxFX05BTUVTKCk7CisgICAgQ1JFQVRFX0RVTVBfRklMRShtSW5GaWxlKTsKKyAgICBDUkVBVEVfRFVNUF9GSUxFKG1PdXRGaWxlKTsKKworICAgIGdldHRpbWVvZmRheSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CisgICAgZ2V0dGltZW9mZGF5KCZtVGltZUVuZCwgbnVsbHB0cik7Cit9CisKK0MyU29mdEFvbURlYzo6fkMyU29mdEFvbURlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW9tRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFvbURlYzo6b25TdG9wKCkgeworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QW9tRGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworICAgIGMyX3N0YXR1c190IGVyciA9IG9uRmx1c2hfc20oKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gZmx1c2ggZGVjb2Rlci4gVHJ5IHRvIGhhcmQgcmVzZXQgZGVjb2Rlci4iKTsKKyAgICAgICAgZGVzdHJveURlY29kZXIoKTsKKyAgICAgICAgKHZvaWQpaW5pdERlY29kZXIoKTsKKyAgICB9Cit9CisKK3ZvaWQgQzJTb2Z0QW9tRGVjOjpvblJlbGVhc2UoKSB7CisgICAgZGVzdHJveURlY29kZXIoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW9tRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIGlmIChhb21fY29kZWNfZGVjb2RlKG1Db2RlY0N0eCwgbnVsbHB0ciwgMCwgbnVsbHB0cikpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBmbHVzaCBhdjEgZGVjb2Rlci4iKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICBhb21fY29kZWNfaXRlcl90IGl0ZXIgPSBudWxscHRyOworICAgIHdoaWxlIChhb21fY29kZWNfZ2V0X2ZyYW1lKG1Db2RlY0N0eCwgJml0ZXIpKSB7CisgICAgfQorCisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworCisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGF0aWMgaW50IEdldENQVUNvcmVDb3VudCgpIHsKKyAgICBpbnQgY3B1Q29yZUNvdW50ID0gMTsKKyNpZiBkZWZpbmVkKF9TQ19OUFJPQ0VTU09SU19PTkxOKQorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworI2Vsc2UKKyAgICAvLyBfU0NfTlBST0NfT05MTiBtdXN0IGJlIGRlZmluZWQuLi4KKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ19PTkxOKTsKKyNlbmRpZgorICAgIENIRUNLKGNwdUNvcmVDb3VudCA+PSAxKTsKKyAgICBBTE9HVigiTnVtYmVyIG9mIENQVSBjb3JlczogJWQiLCBjcHVDb3JlQ291bnQpOworICAgIHJldHVybiBjcHVDb3JlQ291bnQ7Cit9CisKK3N0YXR1c190IEMyU29mdEFvbURlYzo6aW5pdERlY29kZXIoKSB7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIGlmICghbUNvZGVjQ3R4KSB7CisgICAgICAgIG1Db2RlY0N0eCA9IG5ldyBhb21fY29kZWNfY3R4X3Q7CisgICAgfQorCisgICAgaWYgKCFtQ29kZWNDdHgpIHsKKyAgICAgICAgQUxPR0UoIm1Db2RlY0N0eCBpcyBudWxsIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgYW9tX2NvZGVjX2RlY19jZmdfdCBjZmc7CisgICAgbWVtc2V0KCZjZmcsIDAsIHNpemVvZihhb21fY29kZWNfZGVjX2NmZ190KSk7CisgICAgY2ZnLnRocmVhZHMgPSBHZXRDUFVDb3JlQ291bnQoKTsKKyAgICBjZmcuYWxsb3dfbG93Yml0ZGVwdGggPSAxOworCisgICAgYW9tX2NvZGVjX2ZsYWdzX3QgZmxhZ3M7CisgICAgbWVtc2V0KCZmbGFncywgMCwgc2l6ZW9mKGFvbV9jb2RlY19mbGFnc190KSk7CisKKyAgICBhb21fY29kZWNfZXJyX3QgZXJyOworICAgIGlmICgoZXJyID0gYW9tX2NvZGVjX2RlY19pbml0KG1Db2RlY0N0eCwgYW9tX2NvZGVjX2F2MV9keCgpLCAmY2ZnLCAwKSkpIHsKKyAgICAgICAgQUxPR0UoImF2MSBkZWNvZGVyIGZhaWxlZCB0byBpbml0aWFsaXplLiAoJWQpIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRBb21EZWM6OmRlc3Ryb3lEZWNvZGVyKCkgeworICAgIGlmIChtQ29kZWNDdHgpIHsKKyAgICAgICAgYW9tX2NvZGVjX2Rlc3Ryb3kobUNvZGVjQ3R4KTsKKyAgICAgICAgZGVsZXRlIG1Db2RlY0N0eDsKKyAgICAgICAgbUNvZGVjQ3R4ID0gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspIHsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3ZvaWQgQzJTb2Z0QW9tRGVjOjpmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+JiBibG9jaykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0KKyAgICAgICAgY3JlYXRlR3JhcGhpY0J1ZmZlcihibG9jaywgQzJSZWN0KG1XaWR0aCwgbUhlaWdodCkpOworICAgIGF1dG8gZmlsbFdvcmsgPSBbYnVmZmVyLCBpbmRleF0oY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspIHsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBpZiAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgJiYKKyAgICAgICAgICAgIChjMl9jbnRyNjRfdChpbmRleCkgPT0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4KSkgeworICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICAgICAgICB9CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB9OworICAgIGlmICh3b3JrICYmIGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpIHsKKyAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmluaXNoKGluZGV4LCBmaWxsV29yayk7CisgICAgfQorfQorCit2b2lkIEMyU29mdEFvbURlYzo6cHJvY2Vzcyhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIHsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9CisgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgY29kZWNDb25maWcgPQorICAgICAgICAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwKTsKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQsIGZsYWdzICV4IiwKKyAgICAgICAgICBpblNpemUsIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLCB3b3JrLT5pbnB1dC5mbGFncyk7CisKKyAgICBpZiAoY29kZWNDb25maWcpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDY0X3QgZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrbGwoKTsKKyAgICBpZiAoaW5TaXplKSB7CisgICAgICAgIHVpbnQ4X3QqIGJpdHN0cmVhbSA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0KTsKKyAgICAgICAgaW50MzJfdCBkZWNvZGVUaW1lID0gMDsKKyAgICAgICAgaW50MzJfdCBkZWxheSA9IDA7CisKKyAgICAgICAgRFVNUF9UT19GSUxFKG1PdXRGaWxlLCBiaXRzdHJlYW0sIGluU2l6ZSk7CisgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgICAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIGRlbGF5KTsKKworICAgICAgICBhb21fY29kZWNfZXJyX3QgZXJyID0KKyAgICAgICAgICAgIGFvbV9jb2RlY19kZWNvZGUobUNvZGVjQ3R4LCBiaXRzdHJlYW0sIGluU2l6ZSwgJmZyYW1lSW5kZXgpOworCisgICAgICAgIEdFVFRJTUUoJm1UaW1lRW5kLCBudWxscHRyKTsKKyAgICAgICAgVElNRV9ESUZGKG1UaW1lU3RhcnQsIG1UaW1lRW5kLCBkZWNvZGVUaW1lKTsKKyAgICAgICAgQUxPR1YoImRlY29kZVRpbWU9JTRkIGRlbGF5PSU0ZFxuIiwgZGVjb2RlVGltZSwgZGVsYXkpOworCisgICAgICAgIGlmIChlcnIgIT0gQU9NX0NPREVDX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiYXYxIGRlY29kZXIgZmFpbGVkIHRvIGRlY29kZSBmcmFtZSBlcnI6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYW9tX2NvZGVjX2RlY29kZShtQ29kZWNDdHgsIG51bGxwdHIsIDAsIG51bGxwdHIpKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGZsdXNoIGF2MSBkZWNvZGVyLiIpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAodm9pZClvdXRwdXRCdWZmZXIocG9vbCwgd29yayk7CisKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TLCBwb29sLCB3b3JrKTsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgfSBlbHNlIGlmICghaW5TaXplKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb3B5T3V0cHV0QnVmZmVyVG9ZVjEyRnJhbWUodWludDhfdCAqZHN0LAorICAgICAgICBjb25zdCB1aW50OF90ICpzcmNZLCBjb25zdCB1aW50OF90ICpzcmNVLCBjb25zdCB1aW50OF90ICpzcmNWLAorICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7CisgICAgc2l6ZV90IGRzdFlTdHJpZGUgPSBhbGlnbih3aWR0aCwgMTYpOworICAgIHNpemVfdCBkc3RVVlN0cmlkZSA9IGFsaWduKGRzdFlTdHJpZGUgLyAyLCAxNik7CisgICAgdWludDhfdCogZHN0U3RhcnQgPSBkc3Q7CisKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0OyArK2kpIHsKKyAgICAgICAgbWVtY3B5KGRzdCwgc3JjWSwgd2lkdGgpOworICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGU7CisgICAgICAgIGRzdCArPSBkc3RZU3RyaWRlOworICAgIH0KKworICAgIGRzdCA9IGRzdFN0YXJ0ICsgZHN0WVN0cmlkZSAqIGhlaWdodDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgeworICAgICAgICAgbWVtY3B5KGRzdCwgc3JjViwgd2lkdGggLyAyKTsKKyAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOworICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgfQorCisgICAgZHN0ID0gZHN0U3RhcnQgKyAoZHN0WVN0cmlkZSAqIGhlaWdodCkgKyAoZHN0VVZTdHJpZGUgKiBoZWlnaHQgLyAyKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgeworICAgICAgICAgbWVtY3B5KGRzdCwgc3JjVSwgd2lkdGggLyAyKTsKKyAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOworICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1k0MTAodWludDMyX3QgKmRzdCwKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1ksIGNvbnN0IHVpbnQxNl90ICpzcmNVLCBjb25zdCB1aW50MTZfdCAqc3JjViwKKyAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKKyAgICAgICAgc2l6ZV90IGRzdFN0cmlkZSwgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KSB7CisKKyAgICAvLyBDb252ZXJ0aW5nIHR3byBsaW5lcyBhdCBhIHRpbWUsIHNsaWdodGx5IGZhc3RlcgorICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgaGVpZ2h0OyB5ICs9IDIpIHsKKyAgICAgICAgdWludDMyX3QgKmRzdFRvcCA9ICh1aW50MzJfdCAqKSBkc3Q7CisgICAgICAgIHVpbnQzMl90ICpkc3RCb3QgPSAodWludDMyX3QgKikgKGRzdCArIGRzdFN0cmlkZSk7CisgICAgICAgIHVpbnQxNl90ICp5U3JjVG9wID0gKHVpbnQxNl90Kikgc3JjWTsKKyAgICAgICAgdWludDE2X3QgKnlTcmNCb3QgPSAodWludDE2X3QqKSAoc3JjWSArIHNyY1lTdHJpZGUpOworICAgICAgICB1aW50MTZfdCAqdVNyYyA9ICh1aW50MTZfdCopIHNyY1U7CisgICAgICAgIHVpbnQxNl90ICp2U3JjID0gKHVpbnQxNl90Kikgc3JjVjsKKworICAgICAgICB1aW50MzJfdCB1MDEsIHYwMSwgeTAxLCB5MjMsIHk0NSwgeTY3LCB1djAsIHV2MTsKKyAgICAgICAgc2l6ZV90IHggPSAwOworICAgICAgICBmb3IgKDsgeCA8IHdpZHRoIC0gMzsgeCArPSA0KSB7CisKKyAgICAgICAgICAgIHUwMSA9ICooKHVpbnQzMl90Kil1U3JjKTsgdVNyYyArPSAyOworICAgICAgICAgICAgdjAxID0gKigodWludDMyX3QqKXZTcmMpOyB2U3JjICs9IDI7CisKKyAgICAgICAgICAgIHkwMSA9ICooKHVpbnQzMl90Kil5U3JjVG9wKTsgeVNyY1RvcCArPSAyOworICAgICAgICAgICAgeTIzID0gKigodWludDMyX3QqKXlTcmNUb3ApOyB5U3JjVG9wICs9IDI7CisgICAgICAgICAgICB5NDUgPSAqKCh1aW50MzJfdCopeVNyY0JvdCk7IHlTcmNCb3QgKz0gMjsKKyAgICAgICAgICAgIHk2NyA9ICooKHVpbnQzMl90Kil5U3JjQm90KTsgeVNyY0JvdCArPSAyOworCisgICAgICAgICAgICB1djAgPSAodTAxICYgMHgzRkYpIHwgKCh2MDEgJiAweDNGRikgPDwgMjApOworICAgICAgICAgICAgdXYxID0gKHUwMSA+PiAxNikgfCAoKHYwMSA+PiAxNikgPDwgMjApOworCisgICAgICAgICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKCh5MDEgJiAweDNGRikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTAxID4+IDE2KSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKCh5MjMgJiAweDNGRikgPDwgMTApIHwgdXYxOworICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTIzID4+IDE2KSA8PCAxMCkgfCB1djE7CisKKyAgICAgICAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoKHk0NSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NDUgPj4gMTYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoKHk2NyAmIDB4M0ZGKSA8PCAxMCkgfCB1djE7CisgICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NjcgPj4gMTYpIDw8IDEwKSB8IHV2MTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZXJlIHNob3VsZCBiZSBhdCBtb3N0IDIgbW9yZSBwaXhlbHMgdG8gcHJvY2Vzcy4gTm90ZSB0aGF0IHdlIGRvbid0CisgICAgICAgIC8vIG5lZWQgdG8gY29uc2lkZXIgb2RkIGNhc2UgYXMgdGhlIGJ1ZmZlciBpcyBhbHdheXMgYWxpZ25lZCB0byBldmVuLgorICAgICAgICBpZiAoeCA8IHdpZHRoKSB7CisgICAgICAgICAgICB1MDEgPSAqdVNyYzsKKyAgICAgICAgICAgIHYwMSA9ICp2U3JjOworICAgICAgICAgICAgeTAxID0gKigodWludDMyX3QqKXlTcmNUb3ApOworICAgICAgICAgICAgeTQ1ID0gKigodWludDMyX3QqKXlTcmNCb3QpOworICAgICAgICAgICAgdXYwID0gKHUwMSAmIDB4M0ZGKSB8ICgodjAxICYgMHgzRkYpIDw8IDIwKTsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9ICgoeTAxICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9ICgoeTAxID4+IDE2KSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0Qm90KysgPSAoKHk0NSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0Qm90KysgPSAoKHk0NSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgICB9CisKKyAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlICogMjsKKyAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOworICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7CisgICAgICAgIGRzdCArPSBkc3RTdHJpZGUgKiAyOworICAgIH0KKworICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIodWludDhfdCAqZHN0LAorICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjWSwgY29uc3QgdWludDE2X3QgKnNyY1UsIGNvbnN0IHVpbnQxNl90ICpzcmNWLAorICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAorICAgICAgICBzaXplX3QgZHN0U3RyaWRlLCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKKworICAgIHVpbnQ4X3QgKmRzdFkgPSAodWludDhfdCAqKWRzdDsKKyAgICBzaXplX3QgZHN0WVNpemUgPSBkc3RTdHJpZGUgKiBoZWlnaHQ7CisgICAgc2l6ZV90IGRzdFVWU3RyaWRlID0gYWxpZ24oZHN0U3RyaWRlIC8gMiwgMTYpOworICAgIHNpemVfdCBkc3RVVlNpemUgPSBkc3RVVlN0cmlkZSAqIGhlaWdodCAvIDI7CisgICAgdWludDhfdCAqZHN0ViA9IGRzdFkgKyBkc3RZU2l6ZTsKKyAgICB1aW50OF90ICpkc3RVID0gZHN0ViArIGRzdFVWU2l6ZTsKKworICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CisgICAgICAgICAgICBkc3RZW3hdID0gKHVpbnQ4X3QpKHNyY1lbeF0gPj4gMik7CisgICAgICAgIH0KKworICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGU7CisgICAgICAgIGRzdFkgKz0gZHN0U3RyaWRlOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgKGhlaWdodCArIDEpIC8gMjsgKyt5KSB7CisgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgKHdpZHRoICsgMSkgLyAyOyArK3gpIHsKKyAgICAgICAgICAgIGRzdFVbeF0gPSAodWludDhfdCkoc3JjVVt4XSA+PiAyKTsKKyAgICAgICAgICAgIGRzdFZbeF0gPSAodWludDhfdCkoc3JjVlt4XSA+PiAyKTsKKyAgICAgICAgfQorCisgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKKyAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOworICAgICAgICBkc3RVICs9IGRzdFVWU3RyaWRlOworICAgICAgICBkc3RWICs9IGRzdFVWU3RyaWRlOworICAgIH0KKyAgICByZXR1cm47Cit9Citib29sIEMyU29mdEFvbURlYzo6b3V0cHV0QnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykKK3sKKyAgICBpZiAoISh3b3JrICYmIHBvb2wpKSByZXR1cm4gZmFsc2U7CisKKyAgICBhb21fY29kZWNfaXRlcl90IGl0ZXIgPSBudWxscHRyOworICAgIGFvbV9pbWFnZV90KiBpbWcgPSBhb21fY29kZWNfZ2V0X2ZyYW1lKG1Db2RlY0N0eCwgJml0ZXIpOworCisgICAgaWYgKCFpbWcpIHJldHVybiBmYWxzZTsKKworICAgIGlmIChpbWctPmRfdyAhPSBtV2lkdGggfHwgaW1nLT5kX2ggIT0gbUhlaWdodCkgeworICAgICAgICBtV2lkdGggPSBpbWctPmRfdzsKKyAgICAgICAgbUhlaWdodCA9IGltZy0+ZF9oOworCisgICAgICAgIEMyVmlkZW9TaXplU3RyZWFtSW5mbzo6b3V0cHV0IHNpemUoMHUsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZyh7JnNpemV9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoc2l6ZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkNvbmZpZyB1cGRhdGUgc2l6ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgQ0hFQ0soaW1nLT5mbXQgPT0gQU9NX0lNR19GTVRfSTQyMCB8fCBpbWctPmZtdCA9PSBBT01fSU1HX0ZNVF9JNDIwMTYpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jazsKKyAgICB1aW50MzJfdCBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgICAgaWYgKGltZy0+Zm10ID09IEFPTV9JTUdfRk1UX0k0MjAxNikgeworICAgICAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+IGRlZmF1bHRDb2xvckFzcGVjdHMgPSBtSW50Zi0+Z2V0RGVmYXVsdENvbG9yQXNwZWN0c19sKCk7CisKKyAgICAgICAgaWYgKGRlZmF1bHRDb2xvckFzcGVjdHMtPnByaW1hcmllcyA9PSBDMkNvbG9yOjpQUklNQVJJRVNfQlQyMDIwICYmCisgICAgICAgICAgICBkZWZhdWx0Q29sb3JBc3BlY3RzLT5tYXRyaXggPT0gQzJDb2xvcjo6TUFUUklYX0JUMjAyMCAmJgorICAgICAgICAgICAgZGVmYXVsdENvbG9yQXNwZWN0cy0+dHJhbnNmZXIgPT0gQzJDb2xvcjo6VFJBTlNGRVJfU1QyMDg0KSB7CisgICAgICAgICAgICBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMjsKKyAgICAgICAgfQorICAgIH0KKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0ge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9OworCisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soYWxpZ24obVdpZHRoLCAxNiksIG1IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCB1c2FnZSwgJmJsb2NrKTsKKworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoR3JhcGhpY0Jsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gZXJyOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQzJHcmFwaGljVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBTE9HVigicHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJWR4JWQpLCBvdXQgZnJhbWVpbmRleCAlZCIsCisgICAgICAgICAgYmxvY2stPndpZHRoKCksIGJsb2NrLT5oZWlnaHQoKSwgbVdpZHRoLCBtSGVpZ2h0LAorICAgICAgICAgIChpbnQpKihpbnQ2NF90KilpbWctPnVzZXJfcHJpdik7CisKKyAgICB1aW50OF90KiBkc3QgPSBjb25zdF9jYXN0PHVpbnQ4X3QqPih3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldKTsKKyAgICBzaXplX3Qgc3JjWVN0cmlkZSA9IGltZy0+c3RyaWRlW0FPTV9QTEFORV9ZXTsKKyAgICBzaXplX3Qgc3JjVVN0cmlkZSA9IGltZy0+c3RyaWRlW0FPTV9QTEFORV9VXTsKKyAgICBzaXplX3Qgc3JjVlN0cmlkZSA9IGltZy0+c3RyaWRlW0FPTV9QTEFORV9WXTsKKworICAgIGlmIChpbWctPmZtdCA9PSBBT01fSU1HX0ZNVF9JNDIwMTYpIHsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1kgPSAoY29uc3QgdWludDE2X3QgKilpbWctPnBsYW5lc1tBT01fUExBTkVfWV07CisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNVID0gKGNvbnN0IHVpbnQxNl90ICopaW1nLT5wbGFuZXNbQU9NX1BMQU5FX1VdOworICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjViA9IChjb25zdCB1aW50MTZfdCAqKWltZy0+cGxhbmVzW0FPTV9QTEFORV9WXTsKKworICAgICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyKSB7CisgICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1k0MTAoKHVpbnQzMl90ICopZHN0LCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduKG1XaWR0aCwgMTYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKGRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbihtV2lkdGgsIDE2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNZID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tBT01fUExBTkVfWV07CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1UgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW0FPTV9QTEFORV9VXTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjViA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbQU9NX1BMQU5FX1ZdOworICAgICAgICBjb3B5T3V0cHV0QnVmZmVyVG9ZVjEyRnJhbWUoZHN0LCBzcmNZLCBzcmNVLCBzcmNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNZU3RyaWRlLCBzcmNVU3RyaWRlLCBzcmNWU3RyaWRlLCBtV2lkdGgsIG1IZWlnaHQpOworICAgIH0KKyAgICBmaW5pc2hXb3JrKCooaW50NjRfdCopaW1nLT51c2VyX3ByaXYsIHdvcmssIHN0ZDo6bW92ZShibG9jaykpOworICAgIGJsb2NrID0gbnVsbHB0cjsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW9tRGVjOjpkcmFpbkludGVybmFsKAorICAgIHVpbnQzMl90IGRyYWluTW9kZSwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCwKKyAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaykgeworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICBpZiAoYW9tX2NvZGVjX2RlY29kZShtQ29kZWNDdHgsIG51bGxwdHIsIDAsIG51bGxwdHIpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmx1c2ggYXYxIGRlY29kZXIuIik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgd2hpbGUgKChvdXRwdXRCdWZmZXIocG9vbCwgd29yaykpKSB7CisgICAgfQorCisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MgJiYgd29yayAmJgorICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9PSAwdSkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW9tRGVjOjpkcmFpbih1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIHsKKyAgICByZXR1cm4gZHJhaW5JbnRlcm5hbChkcmFpbk1vZGUsIHBvb2wsIG51bGxwdHIpOworfQorCitjbGFzcyBDMlNvZnRBb21GYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CisgICBwdWJsaWM6CisgICAgQzJTb2Z0QW9tRmFjdG9yeSgpCisgICAgICAgIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7fQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgIG5ldyBDMlNvZnRBb21EZWMoQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEFvbURlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0QW9tRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QW9tRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRBb21GYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRBb21GYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzgyNjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0MyU29mdEFvbURlYy5oCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfQVYxX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfQVYxX0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKyNpbmNsdWRlICJhb20vYW9tX2RlY29kZXIuaCIKKyNpbmNsdWRlICJhb20vYW9tZHguaCIKKworI2RlZmluZSBHRVRUSU1FKGEsIGIpIGdldHRpbWVvZmRheShhLCBiKTsKKyNkZWZpbmUgVElNRV9ESUZGKHN0YXJ0LCBlbmQsIGRpZmYpICAgICBcCisgICAgZGlmZiA9ICgoKGVuZCkudHZfc2VjIC0gKHN0YXJ0KS50dl9zZWMpICogMTAwMDAwMCkgKyBcCisgICAgICAgICAgICAoKGVuZCkudHZfdXNlYyAtIChzdGFydCkudHZfdXNlYyk7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdEFvbURlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRBb21EZWMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0QW9tRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbih1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkgb3ZlcnJpZGU7CisKKyAgIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBhb21fY29kZWNfY3R4X3QqIG1Db2RlY0N0eDsKKworICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKworICAgICNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCisgICAgY2hhciBtSW5GaWxlWzIwMF07CisgICAgY2hhciBtT3V0RmlsZVsyMDBdOworICAgICNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZVN0YXJ0OyAgIC8vIFRpbWUgYXQgdGhlIHN0YXJ0IG9mIGRlY29kZSgpCisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7ICAgICAvLyBUaW1lIGF0IHRoZSBlbmQgb2YgZGVjb2RlKCkKKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgc3RhdHVzX3QgZGVzdHJveURlY29kZXIoKTsKKyAgICB2b2lkIGZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+JiBibG9jayk7CisgICAgYm9vbCBvdXRwdXRCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayk7CisKKyAgICBjMl9zdGF0dXNfdCBkcmFpbkludGVybmFsKHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRBb21EZWMpOworfTsKKworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKworI2RlZmluZSBJTlBVVF9EVU1QX1BBVEggIi9kYXRhL2xvY2FsL3RtcC90ZW1wL2F2MSIKKyNkZWZpbmUgSU5QVVRfRFVNUF9FWFQgIndlYm0iCisjZGVmaW5lIE9VVFBVVF9EVU1QX1BBVEggIi9kYXRhL2xvY2FsL3RtcC90ZW1wL2F2MSIKKyNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUICJhdjEiCisjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0cmNweShtSW5GaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFMT0dEKCJHRU5FUkFURV9GSUxFX05BTUVTIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNwcmludGYobUluRmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBJTlBVVF9EVU1QX1BBVEgsIG1UaW1lU3RhcnQudHZfc2VjLCBcCisgICAgICAgICAgICAgICAgbVRpbWVTdGFydC50dl91c2VjLCBJTlBVVF9EVU1QX0VYVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0cmNweShtT3V0RmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNwcmludGYobU91dEZpbGUsICIlc18lbGQuJWxkLiVzIiwgT1VUUFVUX0RVTVBfUEFUSCwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgbVRpbWVTdGFydC50dl9zZWMsIG1UaW1lU3RhcnQudHZfdXNlYywgT1VUUFVUX0RVTVBfRVhUKTsgICAgICBcCisgICAgfQorCisjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEZJTEUqIGZwID0gZm9wZW4obV9maWxlbmFtZSwgIndiIik7ICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChmcCAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiT3BlbmVkIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTsgICAgICAgICBcCisgICAgICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiQ291bGQgbm90IG9wZW4gZmlsZSAlcyIsIG1fZmlsZW5hbWUpOyBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2RlZmluZSBEVU1QX1RPX0ZJTEUobV9maWxlbmFtZSwgbV9idWYsIG1fc2l6ZSkgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEZJTEUqIGZwID0gZm9wZW4obV9maWxlbmFtZSwgImFiIik7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZnAgIT0gTlVMTCAmJiBtX2J1ZiAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiRHVtcCB0byBmaWxlISIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaSA9IGZ3cml0ZShtX2J1ZiwgMSwgbV9zaXplLCBmcCk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChpICE9IChpbnQpbV9zaXplKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQUxPR0QoIkVycm9yIGluIGZ3cml0ZSwgcmV0dXJuZWQgJWQiLCBpKTsgICAgXAorICAgICAgICAgICAgICAgIHBlcnJvcigiRXJyb3IgaW4gd3JpdGUgdG8gZmlsZSIpOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJDb3VsZCBub3Qgd3JpdGUgdG8gZmlsZSAlcyIsIG1fZmlsZW5hbWUpOyBcCisgICAgICAgICAgICBpZiAoZnAgIT0gTlVMTCkgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZSAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisjZGVmaW5lIElOUFVUX0RVTVBfUEFUSAorI2RlZmluZSBJTlBVVF9EVU1QX0VYVAorI2RlZmluZSBPVVRQVVRfRFVNUF9QQVRICisjZGVmaW5lIE9VVFBVVF9EVU1QX0VYVAorI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkKKyNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKQorI2RlZmluZSBEVU1QX1RPX0ZJTEUobV9maWxlbmFtZSwgbV9idWYsIG1fc2l6ZSkKKyNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0FWMV9ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAyMTQ0NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzcgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYXZjZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKyAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJhdmNkZWMiXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0QXZjRGVjLmNwcCJdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJleHRlcm5hbC9saWJhdmMvZGVjb2RlciIsCisgICAgICAgICJleHRlcm5hbC9saWJhdmMvY29tbW9uIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2F2Y2VuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGliYXZjZW5jIl0sCisKKyAgICBzcmNzOiBbIkMyU29mdEF2Y0VuYy5jcHAiXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZXh0ZXJuYWwvbGliYXZjL2VuY29kZXIiLAorICAgICAgICAiZXh0ZXJuYWwvbGliYXZjL2NvbW1vbiIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVduby11bnVzZWQtdmFyaWFibGUiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNjI3NDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmNwcApAQCAtMCwwICsxLDk3OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRBdmNEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPENvZGVjMk1hcHBlci5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRBdmNEZWMuaCIKKyNpbmNsdWRlICJpaDI2NGQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuYXZjLmRlY29kZXIiOworCit9ICAvLyBuYW1lc3BhY2UKKworY2xhc3MgQzJTb2Z0QXZjRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTywKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOyAvLyBUT0RPOiBhY2NvdW50IGZvciBvdXIgYnVmZmVycyBoZXJlCisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisKKyAgICAgICAgLy8gVE9ETzogb3V0cHV0IGxhdGVuY3kgYW5kIHJlb3JkZXJpbmcKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBjb2RlZCBhbmQgb3V0cHV0IHBpY3R1cmUgc2l6ZSBpcyB0aGUgc2FtZSBmb3IgdGhpcyBjb2RlYworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgNDA4MCwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDQwODAsIDIpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2l6ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhTaXplLCBDMl9QQVJBTUtFWV9NQVhfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDQwODAsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCA0MDgwLCAyKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKE1heFBpY3R1cmVTaXplU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0KDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0JBU0VMSU5FLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzVfMikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9CQVNFTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQkFTRUxJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVZDX01BSU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0hJR0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVZDX1BST0dSRVNTSVZFX0hJR0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0h9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWQ18xLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzFCLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzFfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVZDXzFfMiwgQzJDb25maWc6OkxFVkVMX0FWQ18xXzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWQ18yLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzJfMSwgQzJDb25maWc6OkxFVkVMX0FWQ18yXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWQ18zLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzNfMSwgQzJDb25maWc6OkxFVkVMX0FWQ18zXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWQ180LCBDMkNvbmZpZzo6TEVWRUxfQVZDXzRfMSwgQzJDb25maWc6OkxFVkVMX0FWQ180XzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWQ181LCBDMkNvbmZpZzo6TEVWRUxfQVZDXzVfMSwgQzJDb25maWc6OkxFVkVMX0FWQ181XzIKKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4SW5wdXRTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMzIwICogMjQwICogMyAvIDQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1NYXhJbnB1dFNpemUsIHZhbHVlKS5hbnkoKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5jYWxjdWxhdGVkQXMoTWF4SW5wdXRTaXplU2V0dGVyLCBtTWF4U2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgbG9jYXRpb25zWzFdID0geyBDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpIH07CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICAxdSwgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgbWVtY3B5KGRlZmF1bHRDb2xvckluZm8tPm0ubG9jYXRpb25zLCBsb2NhdGlvbnMsIHNpemVvZihsb2NhdGlvbnMpKTsKKworICAgICAgICBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICB7IEMyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCkgfSwKKyAgICAgICAgICAgICAgICAgICAgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgaGVscGVyLT5hZGRTdHJ1Y3REZXNjcmlwdG9yczxDMkNocm9tYU9mZnNldFN0cnVjdD4oKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbG9ySW5mbywgQzJfUEFSQU1LRVlfQ09ERURfQ09MT1JfSU5GTykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoZGVmYXVsdENvbG9ySW5mbykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCAgICAgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoRGVmYXVsdENvbG9yQXNwZWN0c1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2RlZENvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfVlVJX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX0xJTUlURUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCAgICAgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQ29kZWRDb2xvckFzcGVjdHNTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKENvbG9yQXNwZWN0c1NldHRlciwgbURlZmF1bHRDb2xvckFzcGVjdHMsIG1Db2RlZENvbG9yQXNwZWN0cykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBtb3JlIGZvcm1hdHM/CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUGl4ZWxGb3JtYXQsIEMyX1BBUkFNS0VZX1BJWEVMX0ZPUk1BVCkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJWaWRlb1NpemVTdHJlYW1JbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYud2lkdGgpLnN1cHBvcnRzQXRBbGwobWUudi53aWR0aCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi53aWR0aCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heFBpY3R1cmVTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmc2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gVE9ETzogZ2V0IG1heCB3aWR0aC9oZWlnaHQgZnJvbSB0aGUgc2l6ZSdzIGZpZWxkIGhlbHBlcnMgdnMuIGhhcmRjb2RpbmcKKyAgICAgICAgbWUuc2V0KCkud2lkdGggPSBjMl9taW4oYzJfbWF4KG1lLnYud2lkdGgsIHNpemUudi53aWR0aCksIDQwODB1KTsKKyAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gYzJfbWluKGMyX21heChtZS52LmhlaWdodCwgc2l6ZS52LmhlaWdodCksIDQwODB1KTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heElucHV0U2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiAmbWF4U2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gYXNzdW1lIGNvbXByZXNzaW9uIHJhdGlvIG9mIDIKKyAgICAgICAgbWUuc2V0KCkudmFsdWUgPSAoKChtYXhTaXplLnYud2lkdGggKyAxNSkgLyAxNikgKiAoKG1heFNpemUudi5oZWlnaHQgKyAxNSkgLyAxNikgKiAxOTIpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZClzaXplOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmIChtZS52LnJhbmdlID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi50cmFuc2ZlciA+IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5tYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIENvZGVkQ29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmIChtZS52LnJhbmdlID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi50cmFuc2ZlciA+IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5tYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gJmRlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gJmNvZGVkKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyB0YWtlIGRlZmF1bHQgdmFsdWVzIGZvciBhbGwgdW5zcGVjaWZpZWQgZmllbGRzLCBhbmQgY29kZWQgdmFsdWVzIGZvciBzcGVjaWZpZWQgb25lcworICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IGNvZGVkLnYucmFuZ2UgPT0gUkFOR0VfVU5TUEVDSUZJRUQgPyBkZWYudi5yYW5nZSA6IGNvZGVkLnYucmFuZ2U7CisgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IGNvZGVkLnYucHJpbWFyaWVzID09IFBSSU1BUklFU19VTlNQRUNJRklFRAorICAgICAgICAgICAgICAgID8gZGVmLnYucHJpbWFyaWVzIDogY29kZWQudi5wcmltYXJpZXM7CisgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gY29kZWQudi50cmFuc2ZlciA9PSBUUkFOU0ZFUl9VTlNQRUNJRklFRAorICAgICAgICAgICAgICAgID8gZGVmLnYudHJhbnNmZXIgOiBjb2RlZC52LnRyYW5zZmVyOworICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBjb2RlZC52Lm1hdHJpeCA9PSBNQVRSSVhfVU5TUEVDSUZJRUQgPyBkZWYudi5tYXRyaXggOiBjb2RlZC52Lm1hdHJpeDsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+IGdldENvbG9yQXNwZWN0c19sKCkgeworICAgICAgICByZXR1cm4gbUNvbG9yQXNwZWN0czsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+IG1NYXhTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbU1heElucHV0U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gbUNvbG9ySW5mbzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gbUNvZGVkQ29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiBtRGVmYXVsdENvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+IG1Db2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQ+IG1QaXhlbEZvcm1hdDsKK307CisKK3N0YXRpYyBzaXplX3QgZ2V0Q3B1Q29yZUNvdW50KCkgeworICAgIGxvbmcgY3B1Q29yZUNvdW50ID0gMTsKKyNpZiBkZWZpbmVkKF9TQ19OUFJPQ0VTU09SU19PTkxOKQorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworI2Vsc2UKKyAgICAvLyBfU0NfTlBST0NfT05MTiBtdXN0IGJlIGRlZmluZWQuLi4KKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ19PTkxOKTsKKyNlbmRpZgorICAgIENIRUNLKGNwdUNvcmVDb3VudCA+PSAxKTsKKyAgICBBTE9HVigiTnVtYmVyIG9mIENQVSBjb3JlczogJWxkIiwgY3B1Q29yZUNvdW50KTsKKyAgICByZXR1cm4gKHNpemVfdCljcHVDb3JlQ291bnQ7Cit9CisKK3N0YXRpYyB2b2lkICppdmRfYWxpZ25lZF9tYWxsb2Modm9pZCAqY3R4dCwgV09SRDMyIGFsaWdubWVudCwgV09SRDMyIHNpemUpIHsKKyAgICAodm9pZCkgY3R4dDsKKyAgICByZXR1cm4gbWVtYWxpZ24oYWxpZ25tZW50LCBzaXplKTsKK30KKworc3RhdGljIHZvaWQgaXZkX2FsaWduZWRfZnJlZSh2b2lkICpjdHh0LCB2b2lkICptZW0pIHsKKyAgICAodm9pZCkgY3R4dDsKKyAgICBmcmVlKG1lbSk7Cit9CisKK0MyU29mdEF2Y0RlYzo6QzJTb2Z0QXZjRGVjKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1EZWNIYW5kbGUobnVsbHB0ciksCisgICAgICBtT3V0QnVmZmVyRmx1c2gobnVsbHB0ciksCisgICAgICBtSXZDb2xvckZvcm1hdChJVl9ZVVZfNDIwUCksCisgICAgICBtV2lkdGgoMzIwKSwKKyAgICAgIG1IZWlnaHQoMjQwKSwKKyAgICAgIG1IZWFkZXJEZWNvZGVkKGZhbHNlKSB7CisgICAgR0VORVJBVEVfRklMRV9OQU1FUygpOworICAgIENSRUFURV9EVU1QX0ZJTEUobUluRmlsZSk7Cit9CisKK0MyU29mdEF2Y0RlYzo6fkMyU29mdEF2Y0RlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0RlYzo6b25TdG9wKCkgeworICAgIGlmIChPSyAhPSByZXNldERlY29kZXIoKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICByZXNldFBsdWdpbigpOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBdmNEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpIG9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdEF2Y0RlYzo6b25SZWxlYXNlKCkgeworICAgICh2b2lkKSBkZWxldGVEZWNvZGVyKCk7CisgICAgaWYgKG1PdXRCdWZmZXJGbHVzaCkgeworICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG51bGxwdHIsIG1PdXRCdWZmZXJGbHVzaCk7CisgICAgICAgIG1PdXRCdWZmZXJGbHVzaCA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtT3V0QmxvY2spIHsKKyAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgaWYgKE9LICE9IHNldEZsdXNoTW9kZSgpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworCisgICAgdWludDMyX3QgYnVmZmVyU2l6ZSA9IG1TdHJpZGUgKiBtSGVpZ2h0ICogMyAvIDI7CisgICAgbU91dEJ1ZmZlckZsdXNoID0gKHVpbnQ4X3QgKilpdmRfYWxpZ25lZF9tYWxsb2MobnVsbHB0ciwgMTI4LCBidWZmZXJTaXplKTsKKyAgICBpZiAoIW1PdXRCdWZmZXJGbHVzaCkgeworICAgICAgICBBTE9HRSgiY291bGQgbm90IGFsbG9jYXRlIHRtcCBvdXRwdXQgYnVmZmVyIChmb3IgZmx1c2gpIG9mIHNpemUgJXUgIiwgYnVmZmVyU2l6ZSk7CisgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgfQorCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjb2RlX2lwOworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNvZGVfb3A7CisKKyAgICAgICAgc2V0RGVjb2RlQXJncygmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCwgbnVsbHB0ciwgbnVsbHB0ciwgMCwgMCwgMCk7CisgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICBpZiAoMCA9PSBzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1PdXRCdWZmZXJGbHVzaCkgeworICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG51bGxwdHIsIG1PdXRCdWZmZXJGbHVzaCk7CisgICAgICAgIG1PdXRCdWZmZXJGbHVzaCA9IG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGF0dXNfdCBDMlNvZnRBdmNEZWM6OmNyZWF0ZURlY29kZXIoKSB7CisgICAgaXZkZXh0X2NyZWF0ZV9pcF90IHNfY3JlYXRlX2lwOworICAgIGl2ZGV4dF9jcmVhdGVfb3BfdCBzX2NyZWF0ZV9vcDsKKworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2NyZWF0ZV9pcF90KTsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5lX2NtZCA9IElWRF9DTURfQ1JFQVRFOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnU0X3NoYXJlX2Rpc3BfYnVmID0gMDsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5lX291dHB1dF9mb3JtYXQgPSBtSXZDb2xvckZvcm1hdDsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5wZl9hbGlnbmVkX2FsbG9jID0gaXZkX2FsaWduZWRfbWFsbG9jOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnBmX2FsaWduZWRfZnJlZSA9IGl2ZF9hbGlnbmVkX2ZyZWU7CisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QucHZfbWVtX2N0eHQgPSBudWxscHRyOworICAgIHNfY3JlYXRlX29wLnNfaXZkX2NyZWF0ZV9vcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2NyZWF0ZV9vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfY3JlYXRlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19jcmVhdGVfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgc19jcmVhdGVfb3Auc19pdmRfY3JlYXRlX29wX3QudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtRGVjSGFuZGxlID0gKGl2X29ial90KilzX2NyZWF0ZV9vcC5zX2l2ZF9jcmVhdGVfb3BfdC5wdl9oYW5kbGU7CisgICAgbURlY0hhbmRsZS0+cHZfZnhucyA9ICh2b2lkICopaXZkZWNfYXBpX2Z1bmN0aW9uOworICAgIG1EZWNIYW5kbGUtPnU0X3NpemUgPSBzaXplb2YoaXZfb2JqX3QpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRBdmNEZWM6OnNldE51bUNvcmVzKCkgeworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90IHNfc2V0X251bV9jb3Jlc19pcDsKKyAgICBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCBzX3NldF9udW1fY29yZXNfb3A7CisKKyAgICBzX3NldF9udW1fY29yZXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCk7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLmVfc3ViX2NtZCA9IElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVM7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLnU0X251bV9jb3JlcyA9IG1OdW1Db3JlczsKKyAgICBzX3NldF9udW1fY29yZXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9udW1fY29yZXNfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9udW1fY29yZXNfb3ApOworICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRCgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19zZXRfbnVtX2NvcmVzX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEF2Y0RlYzo6c2V0UGFyYW1zKHNpemVfdCBzdHJpZGUsIElWRF9WSURFT19ERUNPREVfTU9ERV9UIGRlY19tb2RlKSB7CisgICAgaXZkX2N0bF9zZXRfY29uZmlnX2lwX3Qgc19zZXRfZHluX3BhcmFtc19pcDsKKyAgICBpdmRfY3RsX3NldF9jb25maWdfb3BfdCBzX3NldF9keW5fcGFyYW1zX29wOworCisgICAgc19zZXRfZHluX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19pcF90KTsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9TRVRQQVJBTVM7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC51NF9kaXNwX3dkID0gKFVXT1JEMzIpIHN0cmlkZTsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfZnJtX3NraXBfbW9kZSA9IElWRF9TS0lQX05PTkU7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX2ZybV9vdXRfbW9kZSA9IElWRF9ESVNQTEFZX0ZSQU1FX09VVDsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfdmlkX2RlY19tb2RlID0gZGVjX21vZGU7CisgICAgc19zZXRfZHluX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2R5bl9wYXJhbXNfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9keW5fcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfc2V0X2R5bl9wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDMlNvZnRBdmNEZWM6OmdldFZlcnNpb24oKSB7CisgICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90IHNfZ2V0X3ZlcnNpb25pbmZvX2lwOworICAgIGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCBzX2dldF92ZXJzaW9uaW5mb19vcDsKKyAgICBVV09SRDggYXUxX2J1Zls1MTJdOworCisgICAgc19nZXRfdmVyc2lvbmluZm9faXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2dldHZlcnNpb25pbmZvX2lwX3QpOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfR0VUVkVSU0lPTjsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC5wdl92ZXJzaW9uX2J1ZmZlciA9IGF1MV9idWY7CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAudTRfdmVyc2lvbl9idWZmZXJfc2l6ZSA9IHNpemVvZihhdTFfYnVmKTsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2dldF92ZXJzaW9uaW5mb19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZ2V0X3ZlcnNpb25pbmZvX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0QoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sCisgICAgICAgICAgICAgIHNfZ2V0X3ZlcnNpb25pbmZvX29wLnU0X2Vycm9yX2NvZGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJpdHRpYW0gZGVjb2RlciB2ZXJzaW9uIG51bWJlcjogJXMiLAorICAgICAgICAgICAgICAoY2hhciAqKSBzX2dldF92ZXJzaW9uaW5mb19pcC5wdl92ZXJzaW9uX2J1ZmZlcik7CisgICAgfQorfQorCitzdGF0dXNfdCBDMlNvZnRBdmNEZWM6OmluaXREZWNvZGVyKCkgeworICAgIGlmIChPSyAhPSBjcmVhdGVEZWNvZGVyKCkpIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIG1OdW1Db3JlcyA9IE1JTihnZXRDcHVDb3JlQ291bnQoKSwgTUFYX05VTV9DT1JFUyk7CisgICAgbVN0cmlkZSA9IEFMSUdONjQobVdpZHRoKTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICByZXNldFBsdWdpbigpOworICAgICh2b2lkKSBzZXROdW1Db3JlcygpOworICAgIGlmIChPSyAhPSBzZXRQYXJhbXMobVN0cmlkZSwgSVZEX0RFQ09ERV9GUkFNRSkpIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICh2b2lkKSBnZXRWZXJzaW9uKCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgQzJTb2Z0QXZjRGVjOjpzZXREZWNvZGVBcmdzKGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjb2RlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90ICpwc19kZWNvZGVfb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlJlYWRWaWV3ICppbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyR3JhcGhpY1ZpZXcgKm91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0c01hcmtlcikgeworICAgIHVpbnQzMl90IGRpc3BsYXlTdHJpZGUgPSBtU3RyaWRlOworICAgIHVpbnQzMl90IGRpc3BsYXlIZWlnaHQgPSBtSGVpZ2h0OworICAgIHNpemVfdCBsdW1hU2l6ZSA9IGRpc3BsYXlTdHJpZGUgKiBkaXNwbGF5SGVpZ2h0OworICAgIHNpemVfdCBjaHJvbWFTaXplID0gbHVtYVNpemUgPj4gMjsKKworICAgIHBzX2RlY29kZV9pcC0+dTRfc2l6ZSA9IHNpemVvZihpdmRfdmlkZW9fZGVjb2RlX2lwX3QpOworICAgIHBzX2RlY29kZV9pcC0+ZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0RFQ09ERTsKKyAgICBpZiAoaW5CdWZmZXIpIHsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF90cyA9IHRzTWFya2VyOworICAgICAgICBwc19kZWNvZGVfaXAtPnB2X3N0cmVhbV9idWZmZXIgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5CdWZmZXItPmRhdGEoKSArIGluT2Zmc2V0KTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF9udW1fQnl0ZXMgPSBpblNpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF90cyA9IDA7CisgICAgICAgIHBzX2RlY29kZV9pcC0+cHZfc3RyZWFtX2J1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfbnVtX0J5dGVzID0gMDsKKyAgICB9CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVswXSA9IGx1bWFTaXplOworICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMV0gPSBjaHJvbWFTaXplOworICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMl0gPSBjaHJvbWFTaXplOworICAgIGlmIChvdXRCdWZmZXIpIHsKKyAgICAgICAgaWYgKG91dEJ1ZmZlci0+d2lkdGgoKSA8IGRpc3BsYXlTdHJpZGUgfHwgb3V0QnVmZmVyLT5oZWlnaHQoKSA8IGRpc3BsYXlIZWlnaHQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJPdXRwdXQgYnVmZmVyIHRvbyBzbWFsbDogcHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJXV4JXUpIiwKKyAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+d2lkdGgoKSwgb3V0QnVmZmVyLT5oZWlnaHQoKSwgZGlzcGxheVN0cmlkZSwgZGlzcGxheUhlaWdodCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMF0gPSBvdXRCdWZmZXItPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzFdID0gb3V0QnVmZmVyLT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1syXSA9IG91dEJ1ZmZlci0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKyAgICB9IGVsc2UgeworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1swXSA9IG1PdXRCdWZmZXJGbHVzaDsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMV0gPSBtT3V0QnVmZmVyRmx1c2ggKyBsdW1hU2l6ZTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMl0gPSBtT3V0QnVmZmVyRmx1c2ggKyBsdW1hU2l6ZSArIGNocm9tYVNpemU7CisgICAgfQorICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X251bV9idWZzID0gMzsKKyAgICBwc19kZWNvZGVfb3AtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9vcF90KTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEMyU29mdEF2Y0RlYzo6Z2V0VnVpUGFyYW1zKCkgeworICAgIGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfaXBfdCBzX2dldF92dWlfcGFyYW1zX2lwOworICAgIGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdCBzX2dldF92dWlfcGFyYW1zX29wOworCisgICAgc19nZXRfdnVpX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfaXBfdCk7CisgICAgc19nZXRfdnVpX3BhcmFtc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfZ2V0X3Z1aV9wYXJhbXNfaXAuZV9zdWJfY21kID0KKyAgICAgICAgICAgIChJVkRfQ09OVFJPTF9BUElfQ09NTUFORF9UWVBFX1QpIElIMjY0RF9DTURfQ1RMX0dFVF9WVUlfUEFSQU1TOworICAgIHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19nZXRfdnVpX3BhcmFtc19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZ2V0X3Z1aV9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRCgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19nZXRfdnVpX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFZ1aUNvbG9yQXNwZWN0cyB2dWlDb2xvckFzcGVjdHM7CisgICAgdnVpQ29sb3JBc3BlY3RzLnByaW1hcmllcyA9IHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTFfY29sb3VyX3ByaW1hcmllczsKKyAgICB2dWlDb2xvckFzcGVjdHMudHJhbnNmZXIgPSBzX2dldF92dWlfcGFyYW1zX29wLnUxX3Rmcl9jaGFyczsKKyAgICB2dWlDb2xvckFzcGVjdHMuY29lZmZzID0gc19nZXRfdnVpX3BhcmFtc19vcC51MV9tYXRyaXhfY29lZmZzOworICAgIHZ1aUNvbG9yQXNwZWN0cy5mdWxsUmFuZ2UgPSBzX2dldF92dWlfcGFyYW1zX29wLnUxX3ZpZGVvX2Z1bGxfcmFuZ2VfZmxhZzsKKworICAgIC8vIGNvbnZlcnQgdnVpIGFzcGVjdHMgdG8gQzIgdmFsdWVzIGlmIGNoYW5nZWQKKyAgICBpZiAoISh2dWlDb2xvckFzcGVjdHMgPT0gbUJpdHN0cmVhbUNvbG9yQXNwZWN0cykpIHsKKyAgICAgICAgbUJpdHN0cmVhbUNvbG9yQXNwZWN0cyA9IHZ1aUNvbG9yQXNwZWN0czsKKyAgICAgICAgQ29sb3JBc3BlY3RzIHNmQXNwZWN0czsKKyAgICAgICAgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dCBjb2RlZEFzcGVjdHMgPSB7IDB1IH07CisgICAgICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cygKKyAgICAgICAgICAgICAgICB2dWlDb2xvckFzcGVjdHMucHJpbWFyaWVzLCB2dWlDb2xvckFzcGVjdHMudHJhbnNmZXIsIHZ1aUNvbG9yQXNwZWN0cy5jb2VmZnMsCisgICAgICAgICAgICAgICAgdnVpQ29sb3JBc3BlY3RzLmZ1bGxSYW5nZSwgc2ZBc3BlY3RzKTsKKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tUHJpbWFyaWVzLCAmY29kZWRBc3BlY3RzLnByaW1hcmllcykpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tUmFuZ2UsICZjb2RlZEFzcGVjdHMucmFuZ2UpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMucmFuZ2UgPSBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1NYXRyaXhDb2VmZnMsICZjb2RlZEFzcGVjdHMubWF0cml4KSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1UcmFuc2ZlciwgJmNvZGVkQXNwZWN0cy50cmFuc2ZlcikpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgKHZvaWQpbUludGYtPmNvbmZpZyh7JmNvZGVkQXNwZWN0c30sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXR1c190IEMyU29mdEF2Y0RlYzo6c2V0Rmx1c2hNb2RlKCkgeworICAgIGl2ZF9jdGxfZmx1c2hfaXBfdCBzX3NldF9mbHVzaF9pcDsKKyAgICBpdmRfY3RsX2ZsdXNoX29wX3Qgc19zZXRfZmx1c2hfb3A7CisKKyAgICBzX3NldF9mbHVzaF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZmx1c2hfaXBfdCk7CisgICAgc19zZXRfZmx1c2hfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3NldF9mbHVzaF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9GTFVTSDsKKyAgICBzX3NldF9mbHVzaF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZmx1c2hfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9mbHVzaF9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2ZsdXNoX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfc2V0X2ZsdXNoX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEF2Y0RlYzo6cmVzZXREZWNvZGVyKCkgeworICAgIGl2ZF9jdGxfcmVzZXRfaXBfdCBzX3Jlc2V0X2lwOworICAgIGl2ZF9jdGxfcmVzZXRfb3BfdCBzX3Jlc2V0X29wOworCisgICAgc19yZXNldF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfcmVzZXRfaXBfdCk7CisgICAgc19yZXNldF9pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfcmVzZXRfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfUkVTRVQ7CisgICAgc19yZXNldF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfcmVzZXRfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3Jlc2V0X2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19yZXNldF9vcCk7CisgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3Jlc2V0X29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgbVN0cmlkZSA9IDA7CisgICAgKHZvaWQpIHNldE51bUNvcmVzKCk7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbUhlYWRlckRlY29kZWQgPSBmYWxzZTsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDMlNvZnRBdmNEZWM6OnJlc2V0UGx1Z2luKCkgeworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVFbmQsIG51bGxwdHIpOworfQorCitzdGF0dXNfdCBDMlNvZnRBdmNEZWM6OmRlbGV0ZURlY29kZXIoKSB7CisgICAgaWYgKG1EZWNIYW5kbGUpIHsKKyAgICAgICAgaXZkZXh0X2RlbGV0ZV9pcF90IHNfZGVsZXRlX2lwOworICAgICAgICBpdmRleHRfZGVsZXRlX29wX3Qgc19kZWxldGVfb3A7CisKKyAgICAgICAgc19kZWxldGVfaXAuc19pdmRfZGVsZXRlX2lwX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfZGVsZXRlX2lwX3QpOworICAgICAgICBzX2RlbGV0ZV9pcC5zX2l2ZF9kZWxldGVfaXBfdC5lX2NtZCA9IElWRF9DTURfREVMRVRFOworICAgICAgICBzX2RlbGV0ZV9vcC5zX2l2ZF9kZWxldGVfb3BfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9kZWxldGVfb3BfdCk7CisgICAgICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZGVsZXRlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZGVsZXRlX29wKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgIHNfZGVsZXRlX29wLnNfaXZkX2RlbGV0ZV9vcF90LnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgbURlY0hhbmRsZSA9IG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0aWMgdm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgfQorICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCit2b2lkIEMyU29mdEF2Y0RlYzo6ZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IGNyZWF0ZUdyYXBoaWNCdWZmZXIoc3RkOjptb3ZlKG1PdXRCbG9jayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUmVjdChtV2lkdGgsIG1IZWlnaHQpKTsKKyAgICBtT3V0QmxvY2sgPSBudWxscHRyOworICAgIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIGJ1ZmZlci0+c2V0SW5mbyhtSW50Zi0+Z2V0Q29sb3JBc3BlY3RzX2woKSk7CisgICAgfQorCisgICAgYXV0byBmaWxsV29yayA9IFtidWZmZXJdKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCkwOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIH07CisgICAgaWYgKHdvcmsgJiYgYzJfY250cjY0X3QoaW5kZXgpID09IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCkgeworICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmaW5pc2goaW5kZXgsIGZpbGxXb3JrKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0RlYzo6ZW5zdXJlRGVjb2RlclN0YXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICBpZiAoIW1EZWNIYW5kbGUpIHsKKyAgICAgICAgQUxPR0UoIm5vdCBzdXBwb3NlZCB0byBiZSBoZXJlLCBpbnZhbGlkIGRlY29kZXIgY29udGV4dCIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICBpZiAobVN0cmlkZSAhPSBBTElHTjY0KG1XaWR0aCkpIHsKKyAgICAgICAgbVN0cmlkZSA9IEFMSUdONjQobVdpZHRoKTsKKyAgICAgICAgaWYgKE9LICE9IHNldFBhcmFtcyhtU3RyaWRlLCBJVkRfREVDT0RFX0ZSQU1FKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgaWYgKG1PdXRCbG9jayAmJgorICAgICAgICAgICAgKG1PdXRCbG9jay0+d2lkdGgoKSAhPSBtU3RyaWRlIHx8IG1PdXRCbG9jay0+aGVpZ2h0KCkgIT0gbUhlaWdodCkpIHsKKyAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CisgICAgfQorICAgIGlmICghbU91dEJsb2NrKSB7CisgICAgICAgIHVpbnQzMl90IGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaEdyYXBoaWNCbG9jayhtU3RyaWRlLCBtSGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCAmbU91dEJsb2NrKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoImZldGNoR3JhcGhpY0Jsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoInByb3ZpZGVkICglZHglZCkgcmVxdWlyZWQgKCVkeCVkKSIsCisgICAgICAgICAgICAgIG1PdXRCbG9jay0+d2lkdGgoKSwgbU91dEJsb2NrLT5oZWlnaHQoKSwgbVN0cmlkZSwgbUhlaWdodCk7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCisvLyBUT0RPOiBjYW4gb3ZlcmFsbCBlcnJvciBjaGVja2luZyBiZSBpbXByb3ZlZD8KKy8vIFRPRE86IGFsbG93IGNvbmZpZ3VyYXRpb24gb2YgY29sb3IgZm9ybWF0IGFuZCB1c2FnZSBmb3IgZ3JhcGhpYyBidWZmZXJzIGluc3RlYWQKKy8vICAgICAgIG9mIGhhcmQgY29kaW5nIHRoZW0gdG8gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyCisvLyBUT0RPOiBwYXNzIGNvbG9yYXNwZWN0cyBpbmZvcm1hdGlvbiB0byBzdXJmYWNlCisvLyBUT0RPOiB0ZXN0IHN1cHBvcnQgZm9yIGR5bmFtaWMgY2hhbmdlIGluIHJlc29sdXRpb24KKy8vIFRPRE86IHZlcmlmeSBpZiB0aGUgZGVjb2RlciBzZW50IGJhY2sgYWxsIGZyYW1lcwordm9pZCBDMlNvZnRBdmNEZWM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMHU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICB1aW50MzJfdCB3b3JrSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSAmIDB4RkZGRkZGRkY7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSByVmlldy5lcnJvcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIGJvb2wgaGFzUGljdHVyZSA9IGZhbHNlOworCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCwgZmxhZ3MgJXgiLAorICAgICAgICAgIGluU2l6ZSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCksIHdvcmstPmlucHV0LmZsYWdzKTsKKyAgICBzaXplX3QgaW5Qb3MgPSAwOworICAgIHdoaWxlIChpblBvcyA8IGluU2l6ZSkgeworICAgICAgICBpZiAoQzJfT0sgIT0gZW5zdXJlRGVjb2RlclN0YXRlKHBvb2wpKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY29kZV9pcDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjb2RlX29wOworICAgICAgICB7CisgICAgICAgICAgICBDMkdyYXBoaWNWaWV3IHdWaWV3ID0gbU91dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gd1ZpZXcuZXJyb3IoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXNldERlY29kZUFyZ3MoJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3AsICZyVmlldywgJndWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT2Zmc2V0ICsgaW5Qb3MsIGluU2l6ZSAtIGluUG9zLCB3b3JrSW5kZXgpKSB7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmYWxzZSA9PSBtSGVhZGVyRGVjb2RlZCkgeworICAgICAgICAgICAgICAgIC8qIERlY29kZSBoZWFkZXIgYW5kIGdldCBkaW1lbnNpb25zICovCisgICAgICAgICAgICAgICAgc2V0UGFyYW1zKG1TdHJpZGUsIElWRF9ERUNPREVfSEVBREVSKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgV09SRDMyIGRlbGF5OworICAgICAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CisgICAgICAgICAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIGRlbGF5KTsKKyAgICAgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICAgICAgV09SRDMyIGRlY29kZVRpbWU7CisgICAgICAgICAgICBHRVRUSU1FKCZtVGltZUVuZCwgbnVsbHB0cik7CisgICAgICAgICAgICBUSU1FX0RJRkYobVRpbWVTdGFydCwgbVRpbWVFbmQsIGRlY29kZVRpbWUpOworICAgICAgICAgICAgQUxPR1YoImRlY29kZVRpbWU9JTZkIGRlbGF5PSU2ZCBudW1CeXRlcz0lNmQiLCBkZWNvZGVUaW1lLCBkZWxheSwKKyAgICAgICAgICAgICAgICAgIHNfZGVjb2RlX29wLnU0X251bV9ieXRlc19jb25zdW1lZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKElWRF9NRU1fQUxMT0NfRkFJTEVEID09IChzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlICYgMHhGRikpIHsKKyAgICAgICAgICAgIEFMT0dFKCJhbGxvY2F0aW9uIGZhaWx1cmUgaW4gZGVjb2RlciIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAoSVZEX1NUUkVBTV9XSURUSF9IRUlHSFRfTk9UX1NVUFBPUlRFRCA9PSAoc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSAmIDB4RkYpKSB7CisgICAgICAgICAgICBBTE9HRSgidW5zdXBwb3J0ZWQgcmVzb2x1dGlvbiA6ICVkeCVkIiwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKElWRF9SRVNfQ0hBTkdFRCA9PSAoc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSAmIDB4RkYpKSB7CisgICAgICAgICAgICBBTE9HVigicmVzb2x1dGlvbiBjaGFuZ2VkIik7CisgICAgICAgICAgICBkcmFpbkludGVybmFsKERSQUlOX0NPTVBPTkVOVF9OT19FT1MsIHBvb2wsIHdvcmspOworICAgICAgICAgICAgcmVzZXREZWNvZGVyKCk7CisgICAgICAgICAgICByZXNldFBsdWdpbigpOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKworICAgICAgICAgICAgLyogRGVjb2RlIGhlYWRlciBhbmQgZ2V0IG5ldyBkaW1lbnNpb25zICovCisgICAgICAgICAgICBzZXRQYXJhbXMobVN0cmlkZSwgSVZEX0RFQ09ERV9IRUFERVIpOworICAgICAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKDAgPCBzX2RlY29kZV9vcC51NF9waWNfd2QgJiYgMCA8IHNfZGVjb2RlX29wLnU0X3BpY19odCkgeworICAgICAgICAgICAgaWYgKG1IZWFkZXJEZWNvZGVkID09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgbUhlYWRlckRlY29kZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHNldFBhcmFtcyhBTElHTjY0KHNfZGVjb2RlX29wLnU0X3BpY193ZCksIElWRF9ERUNPREVfRlJBTUUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X3BpY193ZCAhPSBtV2lkdGggfHwgc19kZWNvZGVfb3AudTRfcGljX2h0ICE9IG1IZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBtV2lkdGggPSBzX2RlY29kZV9vcC51NF9waWNfd2Q7CisgICAgICAgICAgICAgICAgbUhlaWdodCA9IHNfZGVjb2RlX29wLnU0X3BpY19odDsKKyAgICAgICAgICAgICAgICBDSEVDS19FUSgwdSwgc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpOworCisgICAgICAgICAgICAgICAgQzJWaWRlb1NpemVTdHJlYW1JbmZvOjpvdXRwdXQgc2l6ZSgwdSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZyh7JnNpemV9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoc2l6ZSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDYW5ub3Qgc2V0IHdpZHRoIGFuZCBoZWlnaHQiKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICh2b2lkKWdldFZ1aVBhcmFtcygpOworICAgICAgICBoYXNQaWN0dXJlIHw9ICgxID09IHNfZGVjb2RlX29wLnU0X2ZyYW1lX2RlY29kZWRfZmxhZyk7CisgICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgZmluaXNoV29yayhzX2RlY29kZV9vcC51NF90cywgd29yayk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKDAgPT0gc19kZWNvZGVfb3AudTRfbnVtX2J5dGVzX2NvbnN1bWVkKSB7CisgICAgICAgICAgICBBTE9HRCgiQnl0ZXMgY29uc3VtZWQgaXMgemVyby4gSWdub3JpbmcgcmVtYWluaW5nIGJ5dGVzIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpblBvcyArPSBzX2RlY29kZV9vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQ7CisgICAgICAgIGlmIChoYXNQaWN0dXJlICYmIChpblNpemUgLSBpblBvcykpIHsKKyAgICAgICAgICAgIEFMT0dEKCJkZWNvZGVkIGZyYW1lIGluIGN1cnJlbnQgYWNjZXNzIG5hbCwgaWdub3JpbmcgZnVydGhlciB0cmFpbGluZyBieXRlcyAlZCIsCisgICAgICAgICAgICAgICAgICAoaW50KWluU2l6ZSAtIChpbnQpaW5Qb3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGVvcykgeworICAgICAgICBkcmFpbkludGVybmFsKERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUywgcG9vbCwgd29yayk7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoIWhhc1BpY3R1cmUpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0RlYzo6ZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICBpZiAoT0sgIT0gc2V0Rmx1c2hNb2RlKCkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaWYgKEMyX09LICE9IGVuc3VyZURlY29kZXJTdGF0ZShwb29sKSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBtT3V0QmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY29kZV9pcDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjb2RlX29wOworICAgICAgICBpZiAoIXNldERlY29kZUFyZ3MoJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3AsIG51bGxwdHIsICZ3VmlldywgMCwgMCwgMCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICBmaW5pc2hXb3JrKHNfZGVjb2RlX29wLnU0X3RzLCB3b3JrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgcmV0dXJuIGRyYWluSW50ZXJuYWwoZHJhaW5Nb2RlLCBwb29sLCBudWxscHRyKTsKK30KKworY2xhc3MgQzJTb2Z0QXZjRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEF2Y0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEF2Y0RlYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBdmNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0QXZjRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QXZjRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0QXZjRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0QXZjRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEyN2E5MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuaApAQCAtMCwwICsxLDE5NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfQVZDX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfQVZDX0RFQ19IXworCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgorCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgImloMjY0X3R5cGVkZWZzLmgiCisjaW5jbHVkZSAiaXYuaCIKKyNpbmNsdWRlICJpdmQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjZGVmaW5lIGl2ZGVjX2FwaV9mdW5jdGlvbiAgICAgICAgICAgICAgaWgyNjRkX2FwaV9mdW5jdGlvbgorI2RlZmluZSBpdmRleHRfY3JlYXRlX2lwX3QgICAgICAgICAgICAgIGloMjY0ZF9jcmVhdGVfaXBfdAorI2RlZmluZSBpdmRleHRfY3JlYXRlX29wX3QgICAgICAgICAgICAgIGloMjY0ZF9jcmVhdGVfb3BfdAorI2RlZmluZSBpdmRleHRfZGVsZXRlX2lwX3QgICAgICAgICAgICAgIGloMjY0ZF9kZWxldGVfaXBfdAorI2RlZmluZSBpdmRleHRfZGVsZXRlX29wX3QgICAgICAgICAgICAgIGloMjY0ZF9kZWxldGVfb3BfdAorI2RlZmluZSBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCAgIGloMjY0ZF9jdGxfc2V0X251bV9jb3Jlc19pcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90ICAgaWgyNjRkX2N0bF9zZXRfbnVtX2NvcmVzX29wX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19pcF90ICBpaDI2NGRfY3RsX2dldF92dWlfcGFyYW1zX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19vcF90ICBpaDI2NGRfY3RsX2dldF92dWlfcGFyYW1zX29wX3QKKyNkZWZpbmUgQUxJR042NCh4KSAgICAgICAgICAgICAgICAgICAgICAoKCgoeCkgKyA2MykgPj4gNikgPDwgNikKKyNkZWZpbmUgTUFYX05VTV9DT1JFUyAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMgICAgXAorICAgICAgICAoSVZEX0NPTlRST0xfQVBJX0NPTU1BTkRfVFlQRV9UKUlIMjY0RF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMKKyNkZWZpbmUgTUlOKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisjZGVmaW5lIEdFVFRJTUUoYSwgYikgICAgICAgICAgICAgICAgICAgZ2V0dGltZW9mZGF5KGEsIGIpOworI2RlZmluZSBUSU1FX0RJRkYoc3RhcnQsIGVuZCwgZGlmZikgICAgIFwKKyAgICBkaWZmID0gKCgoZW5kKS50dl9zZWMgLSAoc3RhcnQpLnR2X3NlYykgKiAxMDAwMDAwKSArIFwKKyAgICAgICAgICAgICgoZW5kKS50dl91c2VjIC0gKHN0YXJ0KS50dl91c2VjKTsKKworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKyAgICAjZGVmaW5lIElOUFVUX0RVTVBfUEFUSCAgICAgIi9zZGNhcmQvY2xpcHMvYXZjZF9pbnB1dCIKKyAgICAjZGVmaW5lIElOUFVUX0RVTVBfRVhUICAgICAgImgyNjQiCisgICAgI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0cmNweShtSW5GaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNwcmludGYobUluRmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBJTlBVVF9EVU1QX1BBVEgsICBcCisgICAgICAgICAgICAgICAgbVRpbWVTdGFydC50dl9zZWMsIG1UaW1lU3RhcnQudHZfdXNlYywgICAgICBcCisgICAgICAgICAgICAgICAgSU5QVVRfRFVNUF9FWFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorICAgICNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKSB7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBGSUxFICpmcCA9IGZvcGVuKG1fZmlsZW5hbWUsICJ3YiIpOyAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZnAgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCBvcGVuIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTsgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyAgICAjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplLCBtX29mZnNldClcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEZJTEUgKmZwID0gZm9wZW4obV9maWxlbmFtZSwgImFiIik7ICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChmcCAhPSBOVUxMICYmIG1fYnVmICE9IE5VTEwgJiYgbV9vZmZzZXQgPT0gMCkgeyBcCisgICAgICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpID0gZndyaXRlKG1fYnVmLCAxLCBtX3NpemUsIGZwKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiZndyaXRlIHJldCAlZCB0byB3cml0ZSAlZCIsIGksIG1fc2l6ZSk7ICBcCisgICAgICAgICAgICBpZiAoaSAhPSAoaW50KSBtX3NpemUpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQUxPR0QoIkVycm9yIGluIGZ3cml0ZSwgcmV0dXJuZWQgJWQiLCBpKTsgICBcCisgICAgICAgICAgICAgICAgcGVycm9yKCJFcnJvciBpbiB3cml0ZSB0byBmaWxlIik7ICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSBpZiAoZnAgPT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiQ291bGQgbm90IHdyaXRlIHRvIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTtcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChmcCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UgLyogRklMRV9EVU1QX0VOQUJMRSAqLworICAgICNkZWZpbmUgSU5QVVRfRFVNUF9QQVRICisgICAgI2RlZmluZSBJTlBVVF9EVU1QX0VYVAorICAgICNkZWZpbmUgT1VUUFVUX0RVTVBfUEFUSAorICAgICNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUCisgICAgI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkKKyAgICAjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkKKyAgICAjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplLCBtX29mZnNldCkKKyNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKKworY2xhc3MgQzJTb2Z0QXZjRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKK3B1YmxpYzoKKyAgICBjbGFzcyBJbnRmSW1wbDsKKyAgICBDMlNvZnRBdmNEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0QXZjRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0YXR1c190IGNyZWF0ZURlY29kZXIoKTsKKyAgICBzdGF0dXNfdCBzZXROdW1Db3JlcygpOworICAgIHN0YXR1c190IHNldFBhcmFtcyhzaXplX3Qgc3RyaWRlLCBJVkRfVklERU9fREVDT0RFX01PREVfVCBkZWNfbW9kZSk7CisgICAgdm9pZCBnZXRWZXJzaW9uKCk7CisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBib29sIHNldERlY29kZUFyZ3MoaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNvZGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjb2RlX29wLAorICAgICAgICAgICAgICAgICAgICAgICBDMlJlYWRWaWV3ICppbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgQzJHcmFwaGljVmlldyAqb3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRzTWFya2VyKTsKKyAgICBib29sIGdldFZ1aVBhcmFtcygpOworICAgIGMyX3N0YXR1c190IGVuc3VyZURlY29kZXJTdGF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKTsKKyAgICB2b2lkIGZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKyAgICBzdGF0dXNfdCBzZXRGbHVzaE1vZGUoKTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbkludGVybmFsKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKyAgICBzdGF0dXNfdCByZXNldERlY29kZXIoKTsKKyAgICB2b2lkIHJlc2V0UGx1Z2luKCk7CisgICAgc3RhdHVzX3QgZGVsZXRlRGVjb2RlcigpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKworICAgIC8vIFRPRE86VGhpcyBpcyBub3QgdGhlIHJpZ2h0IHBsYWNlIGZvciB0aGlzIGVudW0uIFRoZXNlIHNob3VsZAorICAgIC8vIGJlIHBhcnQgb2YgYzItdm5kayBzbyB0aGF0IHRoZXkgY2FuIGJlIGFjY2Vzc2VkIGJ5IGFsbCB2aWRlbyBwbHVnaW5zCisgICAgLy8gdW50aWwgdGhlbiwgbWFrZSB0aGVtIGZlZWwgYXQgaG9tZQorICAgIGVudW0geworICAgICAgICBrTm90U3VwcG9ydGVkLAorICAgICAgICBrUHJlZmVyQml0c3RyZWFtLAorICAgICAgICBrUHJlZmVyQ29udGFpbmVyLAorICAgIH07CisKKyAgICBpdl9vYmpfdCAqbURlY0hhbmRsZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IG1PdXRCbG9jazsKKyAgICB1aW50OF90ICptT3V0QnVmZmVyRmx1c2g7CisKKyAgICBzaXplX3QgbU51bUNvcmVzOworICAgIElWX0NPTE9SX0ZPUk1BVF9UIG1JdkNvbG9yRm9ybWF0OworCisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7CisgICAgdWludDMyX3QgbVN0cmlkZTsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCBtSGVhZGVyRGVjb2RlZDsKKyAgICAvLyBDb2xvciBhc3BlY3RzLiBUaGVzZSBhcmUgSVNPIHZhbHVlcyBhbmQgYXJlIG1lYW50IHRvIGRldGVjdCBjaGFuZ2VzIGluIGFzcGVjdHMgdG8gYXZvaWQKKyAgICAvLyBjb252ZXJ0aW5nIHRoZW0gdG8gQzIgdmFsdWVzIGZvciBlYWNoIGZyYW1lCisgICAgc3RydWN0IFZ1aUNvbG9yQXNwZWN0cyB7CisgICAgICAgIHVpbnQ4X3QgcHJpbWFyaWVzOworICAgICAgICB1aW50OF90IHRyYW5zZmVyOworICAgICAgICB1aW50OF90IGNvZWZmczsKKyAgICAgICAgdWludDhfdCBmdWxsUmFuZ2U7CisKKyAgICAgICAgLy8gZGVmYXVsdCBjb2xvciBhc3BlY3RzCisgICAgICAgIFZ1aUNvbG9yQXNwZWN0cygpCisgICAgICAgICAgICA6IHByaW1hcmllcygyKSwgdHJhbnNmZXIoMiksIGNvZWZmcygyKSwgZnVsbFJhbmdlKDApIHsgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBWdWlDb2xvckFzcGVjdHMgJm8pIHsKKyAgICAgICAgICAgIHJldHVybiBwcmltYXJpZXMgPT0gby5wcmltYXJpZXMgJiYgdHJhbnNmZXIgPT0gby50cmFuc2ZlciAmJiBjb2VmZnMgPT0gby5jb2VmZnMKKyAgICAgICAgICAgICAgICAgICAgJiYgZnVsbFJhbmdlID09IG8uZnVsbFJhbmdlOworICAgICAgICB9CisgICAgfSBtQml0c3RyZWFtQ29sb3JBc3BlY3RzOworCisgICAgLy8gcHJvZmlsZQorICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lU3RhcnQ7CisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7CisjaWZkZWYgRklMRV9EVU1QX0VOQUJMRQorICAgIGNoYXIgbUluRmlsZVsyMDBdOworI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEF2Y0RlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9BVkNfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNFbmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMDY2MjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmNwcApAQCAtMCwwICsxLDE1NjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0QXZjRW5jIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8Q29kZWMyQnVmZmVyVXRpbHMuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworI2luY2x1ZGUgIkMyU29mdEF2Y0VuYy5oIgorI2luY2x1ZGUgImloMjY0ZS5oIgorI2luY2x1ZGUgImloMjY0ZV9lcnJvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEMyU29mdEF2Y0VuYzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfTkFNRV9JTlBVVF9TVFJFQU1fRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUZvcm1hdENvbmZpZzo6aW5wdXQoMHUsIEMyRm9ybWF0VmlkZW8pKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfTkFNRV9PVVRQVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Gb3JtYXRDb25maWc6Om91dHB1dCgwdSwgQzJGb3JtYXRDb21wcmVzc2VkKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfTkFNRV9JTlBVVF9QT1JUX01JTUVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX05BTUVfT1VUUFVUX1BPUlRfTUlNRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Vc2FnZSwgQzJfTkFNRV9JTlBVVF9TVFJFQU1fVVNBR0VfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsICh1aW50NjRfdClDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfTkFNRV9TVFJFQU1fVklERU9fU0laRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJWaWRlb1NpemVTdHJlYW1UdW5pbmc6OmlucHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDI1NjAsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAyNTYwLCAyKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNpemVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRnJhbWVSYXRlLCBDMl9OQU1FX1NUUkVBTV9GUkFNRV9SQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dCgwdSwgMzAuKSkKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBNb3JlIHJlc3RyaWN0aW9uPworICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUZyYW1lUmF0ZSwgdmFsdWUpLmdyZWF0ZXJUaGFuKDAuKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRnJhbWVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9OQU1FX1NUUkVBTV9CSVRSQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMkJpdHJhdGVUdW5pbmc6Om91dHB1dCgwdSwgNjQwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDQwOTYsIDEyMDAwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQml0cmF0ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnRyYVJlZnJlc2gsIEMyX1BBUkFNS0VZX0lOVFJBX1JFRlJFU0gpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0RJU0FCTEVELCAwLikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUludHJhUmVmcmVzaCwgbW9kZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OklOVFJBX1JFRlJFU0hfRElTQUJMRUQsIEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0FSQklUUkFSWSB9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1JbnRyYVJlZnJlc2gsIHBlcmlvZCkuYW55KCkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKEludHJhUmVmcmVzaFNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9CQVNFTElORSwgTEVWRUxfQVZDXzRfMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgUFJPRklMRV9BVkNfQkFTRUxJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICBQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9CQVNFTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBST0ZJTEVfQVZDX01BSU4sCisgICAgICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18xLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzFCLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzFfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18xXzIsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfMV8zLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzIsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfMl8xLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzJfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18zLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzNfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18zXzIsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ180XzEsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfNF8yLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzUsCisgICAgICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSwgbUZyYW1lUmF0ZSwgbUJpdHJhdGUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUmVxdWVzdFN5bmMsIEMyX1BBUkFNS0VZX1JFUVVFU1RfU1lOQ19GUkFNRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0KDB1LCBDMl9GQUxTRSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtUmVxdWVzdFN5bmMsIHZhbHVlKS5vbmVPZih7IEMyX0ZBTFNFLCBDMl9UUlVFIH0pIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptUmVxdWVzdFN5bmMpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVN5bmNGcmFtZVBlcmlvZCwgQzJfUEFSQU1LRVlfU1lOQ19GUkFNRV9JTlRFUlZBTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU3luY0ZyYW1lSW50ZXJ2YWxUdW5pbmc6Om91dHB1dCgwdSwgMTAwMDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU3luY0ZyYW1lUGVyaW9kLCB2YWx1ZSkuYW55KCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbVN5bmNGcmFtZVBlcmlvZCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgQml0cmF0ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmIChtZS52LnZhbHVlIDw9IDQwOTYpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnZhbHVlID0gNDA5NjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiAmb2xkTWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYud2lkdGgpLnN1cHBvcnRzQXRBbGwobWUudi53aWR0aCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi53aWR0aCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcigKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgIGNvbnN0IEMyUDxDMlZpZGVvU2l6ZVN0cmVhbVR1bmluZzo6aW5wdXQ+ICZzaXplLAorICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiAmZnJhbWVSYXRlLAorICAgICAgICAgICAgY29uc3QgQzJQPEMyQml0cmF0ZVR1bmluZzo6b3V0cHV0PiAmYml0cmF0ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYucHJvZmlsZSkuc3VwcG9ydHNBdEFsbChtZS52LnByb2ZpbGUpKSB7CisgICAgICAgICAgICBtZS5zZXQoKS5wcm9maWxlID0gUFJPRklMRV9BVkNfQ09OU1RSQUlORURfQkFTRUxJTkU7CisgICAgICAgIH0KKworICAgICAgICBzdHJ1Y3QgTGV2ZWxMaW1pdHMgeworICAgICAgICAgICAgQzJDb25maWc6OmxldmVsX3QgbGV2ZWw7CisgICAgICAgICAgICBmbG9hdCBtYnNQZXJTZWM7CisgICAgICAgICAgICB1aW50NjRfdCBtYnM7CisgICAgICAgICAgICB1aW50MzJfdCBiaXRyYXRlOworICAgICAgICB9OworICAgICAgICBjb25zdGV4cHIgTGV2ZWxMaW1pdHMga0xpbWl0c1tdID0geworICAgICAgICAgICAgeyBMRVZFTF9BVkNfMSwgICAgIDE0ODUsICAgIDk5LCAgICAgNjQwMDAgfSwKKyAgICAgICAgICAgIC8vIERlY29kZXIgZG9lcyBub3QgcHJvcGVybHkgaGFuZGxlIGxldmVsIDFiLgorICAgICAgICAgICAgLy8geyBMRVZFTF9BVkNfMUIsICAgIDE0ODUsICAgOTksICAgMTI4MDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18xXzEsICAgMzAwMCwgICAzOTYsICAgIDE5MjAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMV8yLCAgIDYwMDAsICAgMzk2LCAgICAzODQwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzFfMywgIDExODgwLCAgIDM5NiwgICAgNzY4MDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18yLCAgICAxMTg4MCwgICAzOTYsICAgMjAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMl8xLCAgMTk4MDAsICAgNzkyLCAgIDQwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzJfMiwgIDIwMjUwLCAgMTYyMCwgICA0MDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18zLCAgICA0MDUwMCwgIDE2MjAsICAxMDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfM18xLCAxMDgwMDAsICAzNjAwLCAgMTQwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzNfMiwgMjE2MDAwLCAgNTEyMCwgIDIwMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ180LCAgIDI0NTc2MCwgIDgxOTIsICAyMDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfNF8xLCAyNDU3NjAsICA4MTkyLCAgNTAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzRfMiwgNTIyMjQwLCAgODcwNCwgIDUwMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ181LCAgIDU4OTgyNCwgMjIwODAsIDEzNTAwMDAwMCB9LAorICAgICAgICB9OworCisgICAgICAgIHVpbnQ2NF90IG1icyA9IHVpbnQ2NF90KChzaXplLnYud2lkdGggKyAxNSkgLyAxNikgKiAoKHNpemUudi5oZWlnaHQgKyAxNSkgLyAxNik7CisgICAgICAgIGZsb2F0IG1ic1BlclNlYyA9IGZsb2F0KG1icykgLyBmcmFtZVJhdGUudi52YWx1ZTsKKworICAgICAgICAvLyBDaGVjayBpZiB0aGUgc3VwcGxpZWQgbGV2ZWwgbWVldHMgdGhlIE1CIC8gYml0cmF0ZSByZXF1aXJlbWVudHMuIElmCisgICAgICAgIC8vIG5vdCwgdXBkYXRlIHRoZSBsZXZlbCB3aXRoIHRoZSBsb3dlc3QgbGV2ZWwgbWVldGluZyB0aGUgcmVxdWlyZW1lbnRzLgorCisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgLy8gQnkgZGVmYXVsdCBuZWVkc1VwZGF0ZSA9IGZhbHNlIGluIGNhc2UgdGhlIHN1cHBsaWVkIGxldmVsIGRvZXMgbWVldAorICAgICAgICAvLyB0aGUgcmVxdWlyZW1lbnRzLiBGb3IgTGV2ZWwgMWIsIHdlIHdhbnQgdG8gdXBkYXRlIHRoZSBsZXZlbCBhbnl3YXksCisgICAgICAgIC8vIHNvIHdlIHNldCBpdCB0byB0cnVlIGluIHRoYXQgY2FzZS4KKyAgICAgICAgYm9vbCBuZWVkc1VwZGF0ZSA9IChtZS52LmxldmVsID09IExFVkVMX0FWQ18xQik7CisgICAgICAgIGZvciAoY29uc3QgTGV2ZWxMaW1pdHMgJmxpbWl0IDoga0xpbWl0cykgeworICAgICAgICAgICAgaWYgKG1icyA8PSBsaW1pdC5tYnMgJiYgbWJzUGVyU2VjIDw9IGxpbWl0Lm1ic1BlclNlYyAmJgorICAgICAgICAgICAgICAgICAgICBiaXRyYXRlLnYudmFsdWUgPD0gbGltaXQuYml0cmF0ZSkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGxvd2VzdCBsZXZlbCB0aGF0IG1lZXRzIHRoZSByZXF1aXJlbWVudHMsIGFuZCBpZgorICAgICAgICAgICAgICAgIC8vIHdlIGhhdmVuJ3Qgc2VlbiB0aGUgc3VwcGxpZWQgbGV2ZWwgeWV0LCB0aGF0IG1lYW5zIHdlIGRvbid0CisgICAgICAgICAgICAgICAgLy8gbmVlZCB0aGUgdXBkYXRlLgorICAgICAgICAgICAgICAgIGlmIChuZWVkc1VwZGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiR2l2ZW4gbGV2ZWwgJXggZG9lcyBub3QgY292ZXIgY3VycmVudCBjb25maWd1cmF0aW9uOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGp1c3RpbmcgdG8gJXgiLCBtZS52LmxldmVsLCBsaW1pdC5sZXZlbCk7CisgICAgICAgICAgICAgICAgICAgIG1lLnNldCgpLmxldmVsID0gbGltaXQubGV2ZWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtZS52LmxldmVsID09IGxpbWl0LmxldmVsKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgYnJlYWsgb3V0IG9mIHRoZSBsb29wIHdoZW4gdGhlIGxvd2VzdCBmZWFzaWJsZSBsZXZlbCBpcworICAgICAgICAgICAgICAgIC8vIGZvdW5kLiBUaGUgZmFjdCB0aGF0IHdlJ3JlIGhlcmUgbWVhbnMgdGhhdCBvdXIgbGV2ZWwgZG9lc24ndAorICAgICAgICAgICAgICAgIC8vIG1lZXQgdGhlIHJlcXVpcmVtZW50IGFuZCBuZWVkcyB0byBiZSB1cGRhdGVkLgorICAgICAgICAgICAgICAgIG5lZWRzVXBkYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAvLyBXZSBzZXQgdG8gdGhlIGhpZ2hlc3Qgc3VwcG9ydGVkIGxldmVsLgorICAgICAgICAgICAgbWUuc2V0KCkubGV2ZWwgPSBMRVZFTF9BVkNfNTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBJbnRyYVJlZnJlc2hTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtSW50cmFSZWZyZXNoVHVuaW5nOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKG1lLnYucGVyaW9kIDwgMSkgeworICAgICAgICAgICAgbWUuc2V0KCkubW9kZSA9IEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0RJU0FCTEVEOworICAgICAgICAgICAgbWUuc2V0KCkucGVyaW9kID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIG9ubHkgc3VwcG9ydCBhcmJpdHJhcnkgbW9kZSAoY3ljbGljIGluIG91ciBjYXNlKQorICAgICAgICAgICAgbWUuc2V0KCkubW9kZSA9IEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0FSQklUUkFSWTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIElWX1BST0ZJTEVfVCBnZXRQcm9maWxlX2woKSBjb25zdCB7CisgICAgICAgIHN3aXRjaCAobVByb2ZpbGVMZXZlbC0+cHJvZmlsZSkgeworICAgICAgICBjYXNlIFBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0JBU0VMSU5FOiAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICBjYXNlIFBST0ZJTEVfQVZDX0JBU0VMSU5FOiByZXR1cm4gSVZfUFJPRklMRV9CQVNFOworICAgICAgICBjYXNlIFBST0ZJTEVfQVZDX01BSU46ICAgICByZXR1cm4gSVZfUFJPRklMRV9NQUlOOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0QoIlVucmVjb2duaXplZCBwcm9maWxlOiAleCIsIG1Qcm9maWxlTGV2ZWwtPnByb2ZpbGUpOworICAgICAgICAgICAgcmV0dXJuIElWX1BST0ZJTEVfREVGQVVMVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIFVXT1JEMzIgZ2V0TGV2ZWxfbCgpIGNvbnN0IHsKKyAgICAgICAgc3RydWN0IExldmVsIHsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpsZXZlbF90IGMyTGV2ZWw7CisgICAgICAgICAgICBVV09SRDMyIGF2Y0xldmVsOworICAgICAgICB9OworICAgICAgICBjb25zdGV4cHIgTGV2ZWwgbGV2ZWxzW10gPSB7CisgICAgICAgICAgICB7IExFVkVMX0FWQ18xLCAgIDEwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18xQiwgICA5IH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18xXzEsIDExIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18xXzIsIDEyIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18xXzMsIDEzIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18yLCAgIDIwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18yXzEsIDIxIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18yXzIsIDIyIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18zLCAgIDMwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18zXzEsIDMxIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18zXzIsIDMyIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ180LCAgIDQwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ180XzEsIDQxIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ180XzIsIDQyIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ181LCAgIDUwIH0sCisgICAgICAgIH07CisgICAgICAgIGZvciAoY29uc3QgTGV2ZWwgJmxldmVsIDogbGV2ZWxzKSB7CisgICAgICAgICAgICBpZiAobVByb2ZpbGVMZXZlbC0+bGV2ZWwgPT0gbGV2ZWwuYzJMZXZlbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBsZXZlbC5hdmNMZXZlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HRCgiVW5yZWNvZ25pemVkIGxldmVsOiAleCIsIG1Qcm9maWxlTGV2ZWwtPmxldmVsKTsKKyAgICAgICAgcmV0dXJuIDQxOworICAgIH0KKyAgICB1aW50MzJfdCBnZXRTeW5jRnJhbWVQZXJpb2RfbCgpIGNvbnN0IHsKKyAgICAgICAgaWYgKG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlIDwgMCB8fCBtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSA9PSBJTlQ2NF9NQVgpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGRvdWJsZSBwZXJpb2QgPSBtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSAvIDFlNiAqIG1GcmFtZVJhdGUtPnZhbHVlOworICAgICAgICByZXR1cm4gKHVpbnQzMl90KWMyX21heChjMl9taW4ocGVyaW9kICsgMC41LCBkb3VibGUoVUlOVDMyX01BWCkpLCAxLik7CisgICAgfQorCisgICAgLy8gdW5zYWZlIGdldHRlcnMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiBnZXRTaXplX2woKSBjb25zdCB7IHJldHVybiBtU2l6ZTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiBnZXRJbnRyYVJlZnJlc2hfbCgpIGNvbnN0IHsgcmV0dXJuIG1JbnRyYVJlZnJlc2g7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IGdldEZyYW1lUmF0ZV9sKCkgY29uc3QgeyByZXR1cm4gbUZyYW1lUmF0ZTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IGdldEJpdHJhdGVfbCgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0PiBnZXRSZXF1ZXN0U3luY19sKCkgY29uc3QgeyByZXR1cm4gbVJlcXVlc3RTeW5jOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRm9ybWF0Q29uZmlnOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0PiBtVXNhZ2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyVmlkZW9TaXplU3RyZWFtVHVuaW5nOjppbnB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBtRnJhbWVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gbVJlcXVlc3RTeW5jOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiBtSW50cmFSZWZyZXNoOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJpdHJhdGVUdW5pbmc6Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVN5bmNGcmFtZUludGVydmFsVHVuaW5nOjpvdXRwdXQ+IG1TeW5jRnJhbWVQZXJpb2Q7Cit9OworCisjZGVmaW5lIGl2ZV9hcGlfZnVuY3Rpb24gIGloMjY0ZV9hcGlfZnVuY3Rpb24KKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmF2Yy5lbmNvZGVyIjsKKworbmFtZXNwYWNlIHsKKworLy8gRnJvbSBleHRlcm5hbC9saWJhdmMvZW5jb2Rlci9paDI2NGVfYml0c3RyZWFtLmgKK2NvbnN0ZXhwciB1aW50MzJfdCBNSU5fU1RSRUFNX1NJWkUgPSAweDgwMDsKKworc3RhdGljIHNpemVfdCBHZXRDUFVDb3JlQ291bnQoKSB7CisgICAgbG9uZyBjcHVDb3JlQ291bnQgPSAxOworI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIC8vIF9TQ19OUFJPQ19PTkxOIG11c3QgYmUgZGVmaW5lZC4uLgorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VuZGlmCisgICAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOworICAgIEFMT0dWKCJOdW1iZXIgb2YgQ1BVIGNvcmVzOiAlbGQiLCBjcHVDb3JlQ291bnQpOworICAgIHJldHVybiAoc2l6ZV90KWNwdUNvcmVDb3VudDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0MyU29mdEF2Y0VuYzo6QzJTb2Z0QXZjRW5jKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1JdlZpZGVvQ29sb3JGb3JtYXQoSVZfWVVWXzQyMFApLAorICAgICAgbUFWQ0VuY1Byb2ZpbGUoSVZfUFJPRklMRV9CQVNFKSwKKyAgICAgIG1BVkNFbmNMZXZlbCg0MSksCisgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtU2F3SW5wdXRFT1MoZmFsc2UpLAorICAgICAgbVNhd091dHB1dEVPUyhmYWxzZSksCisgICAgICBtU2lnbmFsbGVkRXJyb3IoZmFsc2UpLAorICAgICAgbUNvZGVjQ3R4KG51bGxwdHIpLAorICAgICAgLy8gVE9ETzogb3V0cHV0IGJ1ZmZlciBzaXplCisgICAgICBtT3V0QnVmZmVyU2l6ZSg1MjQyODgpIHsKKworICAgIC8vIElmIGR1bXAgaXMgZW5hYmxlZCwgdGhlbiBvcGVuIGNyZWF0ZSBhbiBlbXB0eSBmaWxlCisgICAgR0VORVJBVEVfRklMRV9OQU1FUygpOworICAgIENSRUFURV9EVU1QX0ZJTEUobUluRmlsZSk7CisgICAgQ1JFQVRFX0RVTVBfRklMRShtT3V0RmlsZSk7CisKKyAgICBpbml0RW5jUGFyYW1zKCk7Cit9CisKK0MyU29mdEF2Y0VuYzo6fkMyU29mdEF2Y0VuYygpIHsKKyAgICByZWxlYXNlRW5jb2RlcigpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6Om9uSW5pdCgpIHsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6b25TdG9wKCkgeworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBdmNFbmM6Om9uUmVzZXQoKSB7CisgICAgLy8gVE9ETzogdXNlIElWRV9DTURfQ1RMX1JFU0VUPworICAgIHJlbGVhc2VFbmNvZGVyKCk7CisgICAgaW5pdEVuY1BhcmFtcygpOworfQorCit2b2lkIEMyU29mdEF2Y0VuYzo6b25SZWxlYXNlKCkgeworICAgIHJlbGVhc2VFbmNvZGVyKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6b25GbHVzaF9zbSgpIHsKKyAgICAvLyBUT0RPOiB1c2UgSVZFX0NNRF9DVExfRkxVU0g/CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkICBDMlNvZnRBdmNFbmM6OmluaXRFbmNQYXJhbXMoKSB7CisgICAgbUNvZGVjQ3R4ID0gbnVsbHB0cjsKKyAgICBtTWVtUmVjb3JkcyA9IG51bGxwdHI7CisgICAgbU51bU1lbVJlY29yZHMgPSBERUZBVUxUX01FTV9SRUNfQ05UOworICAgIG1IZWFkZXJHZW5lcmF0ZWQgPSAwOworICAgIG1OdW1Db3JlcyA9IEdldENQVUNvcmVDb3VudCgpOworICAgIG1BcmNoID0gREVGQVVMVF9BUkNIOworICAgIG1TbGljZU1vZGUgPSBERUZBVUxUX1NMSUNFX01PREU7CisgICAgbVNsaWNlUGFyYW0gPSBERUZBVUxUX1NMSUNFX1BBUkFNOworICAgIG1IYWxmUGVsRW5hYmxlID0gREVGQVVMVF9IUEVMOworICAgIG1JSW50ZXJ2YWwgPSBERUZBVUxUX0lfSU5URVJWQUw7CisgICAgbUlEUkludGVydmFsID0gREVGQVVMVF9JRFJfSU5URVJWQUw7CisgICAgbURpc2FibGVEZWJsa0xldmVsID0gREVGQVVMVF9ESVNBQkxFX0RFQkxLX0xFVkVMOworICAgIG1FbmFibGVGYXN0U2FkID0gREVGQVVMVF9FTkFCTEVfRkFTVF9TQUQ7CisgICAgbUVuYWJsZUFsdFJlZiA9IERFRkFVTFRfRU5BQkxFX0FMVF9SRUY7CisgICAgbUVuY1NwZWVkID0gREVGQVVMVF9FTkNfU1BFRUQ7CisgICAgbUludHJhNHg0ID0gREVGQVVMVF9JTlRSQTR4NDsKKyAgICBtQ29uc3RyYWluZWRJbnRyYUZsYWcgPSBERUZBVUxUX0NPTlNUUkFJTkVEX0lOVFJBOworICAgIG1QU05SRW5hYmxlID0gREVGQVVMVF9QU05SX0VOQUJMRTsKKyAgICBtUmVjb25FbmFibGUgPSBERUZBVUxUX1JFQ09OX0VOQUJMRTsKKyAgICBtRW50cm9weU1vZGUgPSBERUZBVUxUX0VOVFJPUFlfTU9ERTsKKyAgICBtQmZyYW1lcyA9IERFRkFVTFRfQl9GUkFNRVM7CisKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVFbmQsIG51bGxwdHIpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldERpbWVuc2lvbnMoKSB7CisgICAgaXZlX2N0bF9zZXRfZGltZW5zaW9uc19pcF90IHNfZGltZW5zaW9uc19pcDsKKyAgICBpdmVfY3RsX3NldF9kaW1lbnNpb25zX29wX3Qgc19kaW1lbnNpb25zX29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfZGltZW5zaW9uc19pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfZGltZW5zaW9uc19pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfRElNRU5TSU9OUzsKKyAgICBzX2RpbWVuc2lvbnNfaXAudTRfaHQgPSBtU2l6ZS0+aGVpZ2h0OworICAgIHNfZGltZW5zaW9uc19pcC51NF93ZCA9IG1TaXplLT53aWR0aDsKKworICAgIHNfZGltZW5zaW9uc19pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfZGltZW5zaW9uc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2RpbWVuc2lvbnNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9kaW1lbnNpb25zX2lwX3QpOworICAgIHNfZGltZW5zaW9uc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2RpbWVuc2lvbnNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZGltZW5zaW9uc19pcCwgJnNfZGltZW5zaW9uc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IGZyYW1lIGRpbWVuc2lvbnMgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfZGltZW5zaW9uc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldE51bUNvcmVzKCkgeworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmVfY3RsX3NldF9udW1fY29yZXNfaXBfdCBzX251bV9jb3Jlc19pcDsKKyAgICBpdmVfY3RsX3NldF9udW1fY29yZXNfb3BfdCBzX251bV9jb3Jlc19vcDsKKyAgICBzX251bV9jb3Jlc19pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfbnVtX2NvcmVzX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9OVU1fQ09SRVM7CisgICAgc19udW1fY29yZXNfaXAudTRfbnVtX2NvcmVzID0gTUlOKG1OdW1Db3JlcywgQ09ERUNfTUFYX0NPUkVTKTsKKyAgICBzX251bV9jb3Jlc19pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfbnVtX2NvcmVzX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKyAgICBzX251bV9jb3Jlc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X251bV9jb3Jlc19pcF90KTsKKworICAgIHNfbnVtX2NvcmVzX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfbnVtX2NvcmVzX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbigKKyAgICAgICAgICAgIG1Db2RlY0N0eCwgKHZvaWQgKikgJnNfbnVtX2NvcmVzX2lwLCAodm9pZCAqKSAmc19udW1fY29yZXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBwcm9jZXNzb3IgcGFyYW1zID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX251bV9jb3Jlc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldEZyYW1lUmF0ZSgpIHsKKyAgICBpdmVfY3RsX3NldF9mcmFtZV9yYXRlX2lwX3Qgc19mcmFtZV9yYXRlX2lwOworICAgIGl2ZV9jdGxfc2V0X2ZyYW1lX3JhdGVfb3BfdCBzX2ZyYW1lX3JhdGVfb3A7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19mcmFtZV9yYXRlX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19mcmFtZV9yYXRlX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9GUkFNRVJBVEU7CisKKyAgICBzX2ZyYW1lX3JhdGVfaXAudTRfc3JjX2ZyYW1lX3JhdGUgPSBtRnJhbWVSYXRlLT52YWx1ZSArIDAuNTsKKyAgICBzX2ZyYW1lX3JhdGVfaXAudTRfdGd0X2ZyYW1lX3JhdGUgPSBtRnJhbWVSYXRlLT52YWx1ZSArIDAuNTsKKworICAgIHNfZnJhbWVfcmF0ZV9pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfZnJhbWVfcmF0ZV9pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2ZyYW1lX3JhdGVfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9mcmFtZV9yYXRlX2lwX3QpOworICAgIHNfZnJhbWVfcmF0ZV9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2ZyYW1lX3JhdGVfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZnJhbWVfcmF0ZV9pcCwgJnNfZnJhbWVfcmF0ZV9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IGZyYW1lIHJhdGUgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfZnJhbWVfcmF0ZV9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldElwZVBhcmFtcygpIHsKKyAgICBpdmVfY3RsX3NldF9pcGVfcGFyYW1zX2lwX3Qgc19pcGVfcGFyYW1zX2lwOworICAgIGl2ZV9jdGxfc2V0X2lwZV9wYXJhbXNfb3BfdCBzX2lwZV9wYXJhbXNfb3A7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19pcGVfcGFyYW1zX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19pcGVfcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9JUEVfUEFSQU1TOworCisgICAgc19pcGVfcGFyYW1zX2lwLnU0X2VuYWJsZV9pbnRyYV80eDQgPSBtSW50cmE0eDQ7CisgICAgc19pcGVfcGFyYW1zX2lwLnU0X2VuY19zcGVlZF9wcmVzZXQgPSBtRW5jU3BlZWQ7CisgICAgc19pcGVfcGFyYW1zX2lwLnU0X2NvbnN0cmFpbmVkX2ludHJhX3ByZWQgPSBtQ29uc3RyYWluZWRJbnRyYUZsYWc7CisKKyAgICBzX2lwZV9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2lwZV9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19pcGVfcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfaXBlX3BhcmFtc19pcF90KTsKKyAgICBzX2lwZV9wYXJhbXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9pcGVfcGFyYW1zX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2lwZV9wYXJhbXNfaXAsICZzX2lwZV9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBpcGUgcGFyYW1zID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX2lwZV9wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRCaXRSYXRlKCkgeworICAgIGl2ZV9jdGxfc2V0X2JpdHJhdGVfaXBfdCBzX2JpdHJhdGVfaXA7CisgICAgaXZlX2N0bF9zZXRfYml0cmF0ZV9vcF90IHNfYml0cmF0ZV9vcDsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX2JpdHJhdGVfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2JpdHJhdGVfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0JJVFJBVEU7CisKKyAgICBzX2JpdHJhdGVfaXAudTRfdGFyZ2V0X2JpdHJhdGUgPSBtQml0cmF0ZS0+dmFsdWU7CisKKyAgICBzX2JpdHJhdGVfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2JpdHJhdGVfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19iaXRyYXRlX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfYml0cmF0ZV9pcF90KTsKKyAgICBzX2JpdHJhdGVfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9iaXRyYXRlX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2JpdHJhdGVfaXAsICZzX2JpdHJhdGVfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBiaXQgcmF0ZSA9IDB4JXhcbiIsIHNfYml0cmF0ZV9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldEZyYW1lVHlwZShJVl9QSUNUVVJFX0NPRElOR19UWVBFX1QgZV9mcmFtZV90eXBlKSB7CisgICAgaXZlX2N0bF9zZXRfZnJhbWVfdHlwZV9pcF90IHNfZnJhbWVfdHlwZV9pcDsKKyAgICBpdmVfY3RsX3NldF9mcmFtZV90eXBlX29wX3Qgc19mcmFtZV90eXBlX29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBzX2ZyYW1lX3R5cGVfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2ZyYW1lX3R5cGVfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0ZSQU1FVFlQRTsKKworICAgIHNfZnJhbWVfdHlwZV9pcC5lX2ZyYW1lX3R5cGUgPSBlX2ZyYW1lX3R5cGU7CisKKyAgICBzX2ZyYW1lX3R5cGVfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2ZyYW1lX3R5cGVfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19mcmFtZV90eXBlX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZnJhbWVfdHlwZV9pcF90KTsKKyAgICBzX2ZyYW1lX3R5cGVfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9mcmFtZV90eXBlX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2ZyYW1lX3R5cGVfaXAsICZzX2ZyYW1lX3R5cGVfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBmcmFtZSB0eXBlID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX2ZyYW1lX3R5cGVfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRRcCgpIHsKKyAgICBpdmVfY3RsX3NldF9xcF9pcF90IHNfcXBfaXA7CisgICAgaXZlX2N0bF9zZXRfcXBfb3BfdCBzX3FwX29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfcXBfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3FwX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9RUDsKKworICAgIHNfcXBfaXAudTRfaV9xcCA9IERFRkFVTFRfSV9RUDsKKyAgICBzX3FwX2lwLnU0X2lfcXBfbWF4ID0gREVGQVVMVF9RUF9NQVg7CisgICAgc19xcF9pcC51NF9pX3FwX21pbiA9IERFRkFVTFRfUVBfTUlOOworCisgICAgc19xcF9pcC51NF9wX3FwID0gREVGQVVMVF9QX1FQOworICAgIHNfcXBfaXAudTRfcF9xcF9tYXggPSBERUZBVUxUX1FQX01BWDsKKyAgICBzX3FwX2lwLnU0X3BfcXBfbWluID0gREVGQVVMVF9RUF9NSU47CisKKyAgICBzX3FwX2lwLnU0X2JfcXAgPSBERUZBVUxUX1BfUVA7CisgICAgc19xcF9pcC51NF9iX3FwX21heCA9IERFRkFVTFRfUVBfTUFYOworICAgIHNfcXBfaXAudTRfYl9xcF9taW4gPSBERUZBVUxUX1FQX01JTjsKKworICAgIHNfcXBfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX3FwX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfcXBfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9xcF9pcF90KTsKKyAgICBzX3FwX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfcXBfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfcXBfaXAsICZzX3FwX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgcXAgMHgleFxuIiwgc19xcF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldEVuY01vZGUoSVZFX0VOQ19NT0RFX1QgZV9lbmNfbW9kZSkgeworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmVfY3RsX3NldF9lbmNfbW9kZV9pcF90IHNfZW5jX21vZGVfaXA7CisgICAgaXZlX2N0bF9zZXRfZW5jX21vZGVfb3BfdCBzX2VuY19tb2RlX29wOworCisgICAgc19lbmNfbW9kZV9pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfZW5jX21vZGVfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0VOQ19NT0RFOworCisgICAgc19lbmNfbW9kZV9pcC5lX2VuY19tb2RlID0gZV9lbmNfbW9kZTsKKworICAgIHNfZW5jX21vZGVfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2VuY19tb2RlX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfZW5jX21vZGVfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9lbmNfbW9kZV9pcF90KTsKKyAgICBzX2VuY19tb2RlX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZW5jX21vZGVfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZW5jX21vZGVfaXAsICZzX2VuY19tb2RlX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgaW4gaGVhZGVyIGVuY29kZSBtb2RlID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX2VuY19tb2RlX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0VmJ2UGFyYW1zKCkgeworICAgIGl2ZV9jdGxfc2V0X3Zidl9wYXJhbXNfaXBfdCBzX3Zidl9pcDsKKyAgICBpdmVfY3RsX3NldF92YnZfcGFyYW1zX29wX3Qgc192YnZfb3A7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc192YnZfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3Zidl9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfVkJWX1BBUkFNUzsKKworICAgIHNfdmJ2X2lwLnU0X3Zidl9idWZfc2l6ZSA9IDA7CisgICAgc192YnZfaXAudTRfdmJ2X2J1ZmZlcl9kZWxheSA9IDEwMDA7CisKKyAgICBzX3Zidl9pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfdmJ2X2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfdmJ2X2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfdmJ2X3BhcmFtc19pcF90KTsKKyAgICBzX3Zidl9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X3Zidl9wYXJhbXNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfdmJ2X2lwLCAmc192YnZfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBWQlYgcGFyYW1zID0gMHgleFxuIiwgc192YnZfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRBaXJQYXJhbXMoKSB7CisgICAgaXZlX2N0bF9zZXRfYWlyX3BhcmFtc19pcF90IHNfYWlyX2lwOworICAgIGl2ZV9jdGxfc2V0X2Fpcl9wYXJhbXNfb3BfdCBzX2Fpcl9vcDsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX2Fpcl9pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfYWlyX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9BSVJfUEFSQU1TOworCisgICAgc19haXJfaXAuZV9haXJfbW9kZSA9CisgICAgICAgIChtSW50cmFSZWZyZXNoLT5tb2RlID09IEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0RJU0FCTEVEIHx8IG1JbnRyYVJlZnJlc2gtPnBlcmlvZCA8IDEpCisgICAgICAgICAgICA/IElWRV9BSVJfTU9ERV9OT05FIDogSVZFX0FJUl9NT0RFX0NZQ0xJQzsKKyAgICBzX2Fpcl9pcC51NF9haXJfcmVmcmVzaF9wZXJpb2QgPSBtSW50cmFSZWZyZXNoLT5wZXJpb2Q7CisKKyAgICBzX2Fpcl9pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfYWlyX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfYWlyX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfYWlyX3BhcmFtc19pcF90KTsKKyAgICBzX2Fpcl9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2Fpcl9wYXJhbXNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfYWlyX2lwLCAmc19haXJfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBhaXIgcGFyYW1zID0gMHgleFxuIiwgc19haXJfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRNZVBhcmFtcygpIHsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgaXZlX2N0bF9zZXRfbWVfcGFyYW1zX2lwX3Qgc19tZV9wYXJhbXNfaXA7CisgICAgaXZlX2N0bF9zZXRfbWVfcGFyYW1zX29wX3Qgc19tZV9wYXJhbXNfb3A7CisKKyAgICBzX21lX3BhcmFtc19pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfbWVfcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9NRV9QQVJBTVM7CisKKyAgICBzX21lX3BhcmFtc19pcC51NF9lbmFibGVfZmFzdF9zYWQgPSBtRW5hYmxlRmFzdFNhZDsKKyAgICBzX21lX3BhcmFtc19pcC51NF9lbmFibGVfYWx0X3JlZiA9IG1FbmFibGVBbHRSZWY7CisKKyAgICBzX21lX3BhcmFtc19pcC51NF9lbmFibGVfaHBlbCA9IG1IYWxmUGVsRW5hYmxlOworICAgIHNfbWVfcGFyYW1zX2lwLnU0X2VuYWJsZV9xcGVsID0gREVGQVVMVF9RUEVMOworICAgIHNfbWVfcGFyYW1zX2lwLnU0X21lX3NwZWVkX3ByZXNldCA9IERFRkFVTFRfTUVfU1BFRUQ7CisgICAgc19tZV9wYXJhbXNfaXAudTRfc3JjaF9ybmdfeCA9IERFRkFVTFRfU1JDSF9STkdfWDsKKyAgICBzX21lX3BhcmFtc19pcC51NF9zcmNoX3JuZ195ID0gREVGQVVMVF9TUkNIX1JOR19ZOworCisgICAgc19tZV9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX21lX3BhcmFtc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX21lX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X21lX3BhcmFtc19pcF90KTsKKyAgICBzX21lX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X21lX3BhcmFtc19vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19tZV9wYXJhbXNfaXAsICZzX21lX3BhcmFtc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IG1lIHBhcmFtcyA9IDB4JXhcbiIsIHNfbWVfcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0R29wUGFyYW1zKCkgeworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmVfY3RsX3NldF9nb3BfcGFyYW1zX2lwX3Qgc19nb3BfcGFyYW1zX2lwOworICAgIGl2ZV9jdGxfc2V0X2dvcF9wYXJhbXNfb3BfdCBzX2dvcF9wYXJhbXNfb3A7CisKKyAgICBzX2dvcF9wYXJhbXNfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2dvcF9wYXJhbXNfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0dPUF9QQVJBTVM7CisKKyAgICBzX2dvcF9wYXJhbXNfaXAudTRfaV9mcm1faW50ZXJ2YWwgPSBtSUludGVydmFsOworICAgIHNfZ29wX3BhcmFtc19pcC51NF9pZHJfZnJtX2ludGVydmFsID0gbUlEUkludGVydmFsOworCisgICAgc19nb3BfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19nb3BfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfZ29wX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2dvcF9wYXJhbXNfaXBfdCk7CisgICAgc19nb3BfcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZ29wX3BhcmFtc19vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19nb3BfcGFyYW1zX2lwLCAmc19nb3BfcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgR09QIHBhcmFtcyA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19nb3BfcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0UHJvZmlsZVBhcmFtcygpIHsKKyAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmVfY3RsX3NldF9wcm9maWxlX3BhcmFtc19pcF90IHNfcHJvZmlsZV9wYXJhbXNfaXA7CisgICAgaXZlX2N0bF9zZXRfcHJvZmlsZV9wYXJhbXNfb3BfdCBzX3Byb2ZpbGVfcGFyYW1zX29wOworCisgICAgc19wcm9maWxlX3BhcmFtc19pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX1BST0ZJTEVfUEFSQU1TOworCisgICAgc19wcm9maWxlX3BhcmFtc19pcC5lX3Byb2ZpbGUgPSBtSW50Zi0+Z2V0UHJvZmlsZV9sKCk7CisgICAgaWYgKHNfcHJvZmlsZV9wYXJhbXNfaXAuZV9wcm9maWxlID09IElWX1BST0ZJTEVfQkFTRSkgeworICAgICAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLnU0X2VudHJvcHlfY29kaW5nX21vZGUgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAudTRfZW50cm9weV9jb2RpbmdfbW9kZSA9IDE7CisgICAgfQorICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9wcm9maWxlX3BhcmFtc19pcF90KTsKKyAgICBzX3Byb2ZpbGVfcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfcHJvZmlsZV9wYXJhbXNfb3BfdCk7CisgICAgbG9jay51bmxvY2soKTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19wcm9maWxlX3BhcmFtc19pcCwgJnNfcHJvZmlsZV9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBwcm9maWxlIHBhcmFtcyA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19wcm9maWxlX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldERlYmxvY2tQYXJhbXMoKSB7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworICAgIGl2ZV9jdGxfc2V0X2RlYmxvY2tfcGFyYW1zX2lwX3Qgc19kZWJsb2NrX3BhcmFtc19pcDsKKyAgICBpdmVfY3RsX3NldF9kZWJsb2NrX3BhcmFtc19vcF90IHNfZGVibG9ja19wYXJhbXNfb3A7CisKKyAgICBzX2RlYmxvY2tfcGFyYW1zX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19kZWJsb2NrX3BhcmFtc19pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfREVCTE9DS19QQVJBTVM7CisKKyAgICBzX2RlYmxvY2tfcGFyYW1zX2lwLnU0X2Rpc2FibGVfZGVibG9ja19sZXZlbCA9IG1EaXNhYmxlRGVibGtMZXZlbDsKKworICAgIHNfZGVibG9ja19wYXJhbXNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2RlYmxvY2tfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfZGVibG9ja19wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9kZWJsb2NrX3BhcmFtc19pcF90KTsKKyAgICBzX2RlYmxvY2tfcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZGVibG9ja19wYXJhbXNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZGVibG9ja19wYXJhbXNfaXAsICZzX2RlYmxvY2tfcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBlbmFibGUvZGlzYWJsZSBkZWJsb2NrIHBhcmFtcyA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19kZWJsb2NrX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEF2Y0VuYzo6bG9nVmVyc2lvbigpIHsKKyAgICBpdmVfY3RsX2dldHZlcnNpb25pbmZvX2lwX3Qgc19jdGxfaXA7CisgICAgaXZlX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90IHNfY3RsX29wOworICAgIFVXT1JEOCBhdTFfYnVmWzUxMl07CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19jdGxfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2N0bF9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9HRVRWRVJTSU9OOworICAgIHNfY3RsX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90KTsKKyAgICBzX2N0bF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCk7CisgICAgc19jdGxfaXAucHUxX3ZlcnNpb24gPSBhdTFfYnVmOworICAgIHNfY3RsX2lwLnU0X3ZlcnNpb25fYnVmc2l6ZSA9IHNpemVvZihhdTFfYnVmKTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSAmc19jdGxfaXAsICh2b2lkICopICZzX2N0bF9vcCk7CisKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIGdldHRpbmcgdmVyc2lvbjogMHgleCIsIHNfY3RsX29wLnU0X2Vycm9yX2NvZGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJJdHRpYW0gZW5jb2RlciB2ZXJzaW9uOiAlcyIsIChjaGFyICopc19jdGxfaXAucHUxX3ZlcnNpb24pOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6aW5pdEVuY29kZXIoKSB7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworICAgIFdPUkQzMiBsZXZlbDsKKworICAgIENIRUNLKCFtU3RhcnRlZCk7CisKKyAgICBjMl9zdGF0dXNfdCBlcnJUeXBlID0gQzJfT0s7CisKKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBtU2l6ZSA9IG1JbnRmLT5nZXRTaXplX2woKTsKKyAgICAgICAgbUJpdHJhdGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZV9sKCk7CisgICAgICAgIG1GcmFtZVJhdGUgPSBtSW50Zi0+Z2V0RnJhbWVSYXRlX2woKTsKKyAgICAgICAgbUludHJhUmVmcmVzaCA9IG1JbnRmLT5nZXRJbnRyYVJlZnJlc2hfbCgpOworICAgICAgICBtQVZDRW5jTGV2ZWwgPSBtSW50Zi0+Z2V0TGV2ZWxfbCgpOworICAgICAgICBtSUludGVydmFsID0gbUludGYtPmdldFN5bmNGcmFtZVBlcmlvZF9sKCk7CisgICAgICAgIG1JRFJJbnRlcnZhbCA9IG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2RfbCgpOworICAgIH0KKyAgICB1aW50MzJfdCB3aWR0aCA9IG1TaXplLT53aWR0aDsKKyAgICB1aW50MzJfdCBoZWlnaHQgPSBtU2l6ZS0+aGVpZ2h0OworCisgICAgbVN0cmlkZSA9IHdpZHRoOworCisgICAgLy8gVE9ETworICAgIG1JdlZpZGVvQ29sb3JGb3JtYXQgPSBJVl9ZVVZfNDIwUDsKKworICAgIEFMT0dEKCJQYXJhbXMgd2lkdGggJWQgaGVpZ2h0ICVkIGxldmVsICVkIGNvbG9yRm9ybWF0ICVkIiwgd2lkdGgsCisgICAgICAgICAgICBoZWlnaHQsIG1BVkNFbmNMZXZlbCwgbUl2VmlkZW9Db2xvckZvcm1hdCk7CisKKyAgICAvKiBHZXR0aW5nIE51bWJlciBvZiBNZW1SZWNvcmRzICovCisgICAgeworICAgICAgICBpdl9udW1fbWVtX3JlY19pcF90IHNfbnVtX21lbV9yZWNfaXA7CisgICAgICAgIGl2X251bV9tZW1fcmVjX29wX3Qgc19udW1fbWVtX3JlY19vcDsKKworICAgICAgICBzX251bV9tZW1fcmVjX2lwLnU0X3NpemUgPSBzaXplb2YoaXZfbnVtX21lbV9yZWNfaXBfdCk7CisgICAgICAgIHNfbnVtX21lbV9yZWNfb3AudTRfc2l6ZSA9IHNpemVvZihpdl9udW1fbWVtX3JlY19vcF90KTsKKworICAgICAgICBzX251bV9tZW1fcmVjX2lwLmVfY21kID0gSVZfQ01EX0dFVF9OVU1fTUVNX1JFQzsKKworICAgICAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG51bGxwdHIsICZzX251bV9tZW1fcmVjX2lwLCAmc19udW1fbWVtX3JlY19vcCk7CisKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgICAgICBBTE9HRSgiR2V0IG51bWJlciBvZiBtZW1vcnkgcmVjb3JkcyBmYWlsZWQgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICBzX251bV9tZW1fcmVjX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorCisgICAgICAgIG1OdW1NZW1SZWNvcmRzID0gc19udW1fbWVtX3JlY19vcC51NF9udW1fbWVtX3JlYzsKKyAgICB9CisKKyAgICAvKiBBbGxvY2F0ZSBhcnJheSB0byBob2xkIG1lbW9yeSByZWNvcmRzICovCisgICAgaWYgKG1OdW1NZW1SZWNvcmRzID4gU0laRV9NQVggLyBzaXplb2YoaXZfbWVtX3JlY190KSkgeworICAgICAgICBBTE9HRSgicmVxdWVzdGVkIG1lbW9yeSBzaXplIGlzIHRvbyBiaWcuIik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIG1NZW1SZWNvcmRzID0gKGl2X21lbV9yZWNfdCAqKW1hbGxvYyhtTnVtTWVtUmVjb3JkcyAqIHNpemVvZihpdl9tZW1fcmVjX3QpKTsKKyAgICBpZiAobnVsbHB0ciA9PSBtTWVtUmVjb3JkcykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgaG9sZCBtZW1vcnkgcmVjb3JkczogU2l6ZSAlenUiLAorICAgICAgICAgICAgICAgIG1OdW1NZW1SZWNvcmRzICogc2l6ZW9mKGl2X21lbV9yZWNfdCkpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIHsKKyAgICAgICAgaXZfbWVtX3JlY190ICpwc19tZW1fcmVjOworICAgICAgICBwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKykgeworICAgICAgICAgICAgcHNfbWVtX3JlYy0+dTRfc2l6ZSA9IHNpemVvZihpdl9tZW1fcmVjX3QpOworICAgICAgICAgICAgcHNfbWVtX3JlYy0+cHZfYmFzZSA9IG51bGxwdHI7CisgICAgICAgICAgICBwc19tZW1fcmVjLT51NF9tZW1fc2l6ZSA9IDA7CisgICAgICAgICAgICBwc19tZW1fcmVjLT51NF9tZW1fYWxpZ25tZW50ID0gMDsKKyAgICAgICAgICAgIHBzX21lbV9yZWMtPmVfbWVtX3R5cGUgPSBJVl9OQV9NRU1fVFlQRTsKKworICAgICAgICAgICAgcHNfbWVtX3JlYysrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogR2V0dGluZyBNZW1SZWNvcmRzIEF0dHJpYnV0ZXMgKi8KKyAgICB7CisgICAgICAgIGl2X2ZpbGxfbWVtX3JlY19pcF90IHNfZmlsbF9tZW1fcmVjX2lwOworICAgICAgICBpdl9maWxsX21lbV9yZWNfb3BfdCBzX2ZpbGxfbWVtX3JlY19vcDsKKworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9zaXplID0gc2l6ZW9mKGl2X2ZpbGxfbWVtX3JlY19pcF90KTsKKyAgICAgICAgc19maWxsX21lbV9yZWNfb3AudTRfc2l6ZSA9IHNpemVvZihpdl9maWxsX21lbV9yZWNfb3BfdCk7CisKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAuZV9jbWQgPSBJVl9DTURfRklMTF9OVU1fTUVNX1JFQzsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAucHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9udW1fbWVtX3JlYyA9IG1OdW1NZW1SZWNvcmRzOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9tYXhfd2QgPSB3aWR0aDsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfbWF4X2h0ID0gaGVpZ2h0OworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9tYXhfbGV2ZWwgPSBtQVZDRW5jTGV2ZWw7CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLmVfY29sb3JfZm9ybWF0ID0gREVGQVVMVF9JTlBfQ09MT1JfRk9STUFUOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9tYXhfcmVmX2NudCA9IERFRkFVTFRfTUFYX1JFRl9GUk07CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X21heF9yZW9yZGVyX2NudCA9IERFRkFVTFRfTUFYX1JFT1JERVJfRlJNOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9tYXhfc3JjaF9ybmdfeCA9IERFRkFVTFRfTUFYX1NSQ0hfUkFOR0VfWDsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfbWF4X3NyY2hfcm5nX3kgPSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1k7CisKKyAgICAgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihudWxscHRyLCAmc19maWxsX21lbV9yZWNfaXAsICZzX2ZpbGxfbWVtX3JlY19vcCk7CisKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgICAgICBBTE9HRSgiRmlsbCBtZW1vcnkgcmVjb3JkcyBmYWlsZWQgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICBzX2ZpbGxfbWVtX3JlY19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBBbGxvY2F0aW5nIE1lbW9yeSBmb3IgTWVtIFJlY29yZHMgKi8KKyAgICB7CisgICAgICAgIFdPUkQzMiB0b3RhbF9zaXplOworICAgICAgICBpdl9tZW1fcmVjX3QgKnBzX21lbV9yZWM7CisgICAgICAgIHRvdGFsX3NpemUgPSAwOworICAgICAgICBwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtTWVtUmVjb3JkczsgaSsrKSB7CisgICAgICAgICAgICBwc19tZW1fcmVjLT5wdl9iYXNlID0gaXZlX2FsaWduZWRfbWFsbG9jKAorICAgICAgICAgICAgICAgICAgICBwc19tZW1fcmVjLT51NF9tZW1fYWxpZ25tZW50LCBwc19tZW1fcmVjLT51NF9tZW1fc2l6ZSk7CisgICAgICAgICAgICBpZiAocHNfbWVtX3JlYy0+cHZfYmFzZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkFsbG9jYXRpb24gZmFpbHVyZSBmb3IgbWVtIHJlY29yZCBpZCAlenUgc2l6ZSAldVxuIiwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzX21lbV9yZWMtPnU0X21lbV9zaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0b3RhbF9zaXplICs9IHBzX21lbV9yZWMtPnU0X21lbV9zaXplOworCisgICAgICAgICAgICBwc19tZW1fcmVjKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDb2RlYyBJbnN0YW5jZSBDcmVhdGlvbiAqLworICAgIHsKKyAgICAgICAgaXZlX2luaXRfaXBfdCBzX2luaXRfaXA7CisgICAgICAgIGl2ZV9pbml0X29wX3Qgc19pbml0X29wOworCisgICAgICAgIG1Db2RlY0N0eCA9IChpdl9vYmpfdCAqKW1NZW1SZWNvcmRzWzBdLnB2X2Jhc2U7CisgICAgICAgIG1Db2RlY0N0eC0+dTRfc2l6ZSA9IHNpemVvZihpdl9vYmpfdCk7CisgICAgICAgIG1Db2RlY0N0eC0+cHZfZnhucyA9ICh2b2lkICopaXZlX2FwaV9mdW5jdGlvbjsKKworICAgICAgICBzX2luaXRfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfaW5pdF9pcF90KTsKKyAgICAgICAgc19pbml0X29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2luaXRfb3BfdCk7CisKKyAgICAgICAgc19pbml0X2lwLmVfY21kID0gSVZfQ01EX0lOSVQ7CisgICAgICAgIHNfaW5pdF9pcC51NF9udW1fbWVtX3JlYyA9IG1OdW1NZW1SZWNvcmRzOworICAgICAgICBzX2luaXRfaXAucHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworICAgICAgICBzX2luaXRfaXAudTRfbWF4X3dkID0gd2lkdGg7CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfaHQgPSBoZWlnaHQ7CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfcmVmX2NudCA9IERFRkFVTFRfTUFYX1JFRl9GUk07CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfcmVvcmRlcl9jbnQgPSBERUZBVUxUX01BWF9SRU9SREVSX0ZSTTsKKyAgICAgICAgc19pbml0X2lwLnU0X21heF9sZXZlbCA9IG1BVkNFbmNMZXZlbDsKKyAgICAgICAgc19pbml0X2lwLmVfaW5wX2NvbG9yX2ZtdCA9IG1JdlZpZGVvQ29sb3JGb3JtYXQ7CisKKyAgICAgICAgaWYgKG1SZWNvbkVuYWJsZSB8fCBtUFNOUkVuYWJsZSkgeworICAgICAgICAgICAgc19pbml0X2lwLnU0X2VuYWJsZV9yZWNvbiA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzX2luaXRfaXAudTRfZW5hYmxlX3JlY29uID0gMDsKKyAgICAgICAgfQorICAgICAgICBzX2luaXRfaXAuZV9yZWNvbl9jb2xvcl9mbXQgPSBERUZBVUxUX1JFQ09OX0NPTE9SX0ZPUk1BVDsKKyAgICAgICAgc19pbml0X2lwLmVfcmNfbW9kZSA9IERFRkFVTFRfUkNfTU9ERTsKKyAgICAgICAgc19pbml0X2lwLnU0X21heF9mcmFtZXJhdGUgPSBERUZBVUxUX01BWF9GUkFNRVJBVEU7CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfYml0cmF0ZSA9IERFRkFVTFRfTUFYX0JJVFJBVEU7CisgICAgICAgIHNfaW5pdF9pcC51NF9udW1fYmZyYW1lcyA9IG1CZnJhbWVzOworICAgICAgICBzX2luaXRfaXAuZV9jb250ZW50X3R5cGUgPSBJVl9QUk9HUkVTU0lWRTsKKyAgICAgICAgc19pbml0X2lwLnU0X21heF9zcmNoX3JuZ194ID0gREVGQVVMVF9NQVhfU1JDSF9SQU5HRV9YOworICAgICAgICBzX2luaXRfaXAudTRfbWF4X3NyY2hfcm5nX3kgPSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1k7CisgICAgICAgIHNfaW5pdF9pcC5lX3NsaWNlX21vZGUgPSBtU2xpY2VNb2RlOworICAgICAgICBzX2luaXRfaXAudTRfc2xpY2VfcGFyYW0gPSBtU2xpY2VQYXJhbTsKKyAgICAgICAgc19pbml0X2lwLmVfYXJjaCA9IG1BcmNoOworICAgICAgICBzX2luaXRfaXAuZV9zb2MgPSBERUZBVUxUX1NPQzsKKworICAgICAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfaW5pdF9pcCwgJnNfaW5pdF9vcCk7CisKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgICAgICBBTE9HRSgiSW5pdCBlbmNvZGVyIGZhaWxlZCA9IDB4JXhcbiIsIHNfaW5pdF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBHZXQgQ29kZWMgVmVyc2lvbiAqLworICAgIGxvZ1ZlcnNpb24oKTsKKworICAgIC8qIHNldCBwcm9jZXNzb3IgZGV0YWlscyAqLworICAgIHNldE51bUNvcmVzKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBGcmFtZSBkaW1lbnNpb25zICovCisgICAgc2V0RGltZW5zaW9ucygpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgRnJhbWUgcmF0ZXMgKi8KKyAgICBzZXRGcmFtZVJhdGUoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IElQRSBQYXJhbXMgKi8KKyAgICBzZXRJcGVQYXJhbXMoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IEJpdHJhdGUgKi8KKyAgICBzZXRCaXRSYXRlKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBRUCAqLworICAgIHNldFFwKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBBSVIgcGFyYW1zICovCisgICAgc2V0QWlyUGFyYW1zKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBWQlYgcGFyYW1zICovCisgICAgc2V0VmJ2UGFyYW1zKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBNb3Rpb24gZXN0aW1hdGlvbiBwYXJhbXMgKi8KKyAgICBzZXRNZVBhcmFtcygpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgR09QIHBhcmFtcyAqLworICAgIHNldEdvcFBhcmFtcygpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgRGVibG9jayBwYXJhbXMgKi8KKyAgICBzZXREZWJsb2NrUGFyYW1zKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBQcm9maWxlIHBhcmFtcyAqLworICAgIHNldFByb2ZpbGVQYXJhbXMoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IGluIEVuY29kZSBoZWFkZXIgbW9kZSAqLworICAgIHNldEVuY01vZGUoSVZFX0VOQ19NT0RFX0hFQURFUik7CisKKyAgICBBTE9HVigiaW5pdF9jb2RlYyBzdWNjZXNzZnVsbCIpOworCisgICAgbVNwc1Bwc0hlYWRlclJlY2VpdmVkID0gZmFsc2U7CisgICAgbVN0YXJ0ZWQgPSB0cnVlOworCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnJlbGVhc2VFbmNvZGVyKCkgeworICAgIElWX1NUQVRVU19UIHN0YXR1cyA9IElWX1NVQ0NFU1M7CisgICAgaXZfcmV0cmlldmVfbWVtX3JlY19pcF90IHNfcmV0cmlldmVfbWVtX2lwOworICAgIGl2X3JldHJpZXZlX21lbV9yZWNfb3BfdCBzX3JldHJpZXZlX21lbV9vcDsKKyAgICBpdl9tZW1fcmVjX3QgKnBzX21lbV9yZWM7CisKKyAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBzX3JldHJpZXZlX21lbV9pcC51NF9zaXplID0gc2l6ZW9mKGl2X3JldHJpZXZlX21lbV9yZWNfaXBfdCk7CisgICAgc19yZXRyaWV2ZV9tZW1fb3AudTRfc2l6ZSA9IHNpemVvZihpdl9yZXRyaWV2ZV9tZW1fcmVjX29wX3QpOworICAgIHNfcmV0cmlldmVfbWVtX2lwLmVfY21kID0gSVZfQ01EX1JFVFJJRVZFX01FTVJFQzsKKyAgICBzX3JldHJpZXZlX21lbV9pcC5wc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfcmV0cmlldmVfbWVtX2lwLCAmc19yZXRyaWV2ZV9tZW1fb3ApOworCisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gcmV0cmlldmUgbWVtb3J5IHJlY29yZHMgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfcmV0cmlldmVfbWVtX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIC8qIEZyZWUgbWVtb3J5IHJlY29yZHMgKi8KKyAgICBwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzX3JldHJpZXZlX21lbV9vcC51NF9udW1fbWVtX3JlY19maWxsZWQ7IGkrKykgeworICAgICAgICBpZiAocHNfbWVtX3JlYykgaXZlX2FsaWduZWRfZnJlZShwc19tZW1fcmVjLT5wdl9iYXNlKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgibWVtb3J5IHJlY29yZCBpcyBudWxsLiIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICBwc19tZW1fcmVjKys7CisgICAgfQorCisgICAgaWYgKG1NZW1SZWNvcmRzKSBmcmVlKG1NZW1SZWNvcmRzKTsKKworICAgIC8vIGNsZWFyIG90aGVyIHBvaW50ZXJzIGludG8gdGhlIHNwYWNlIGJlaW5nIGZyZWUoKWQKKyAgICBtQ29kZWNDdHggPSBudWxscHRyOworCisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRFbmNvZGVBcmdzKAorICAgICAgICBpdmVfdmlkZW9fZW5jb2RlX2lwX3QgKnBzX2VuY29kZV9pcCwKKyAgICAgICAgaXZlX3ZpZGVvX2VuY29kZV9vcF90ICpwc19lbmNvZGVfb3AsCisgICAgICAgIGNvbnN0IEMyR3JhcGhpY1ZpZXcgKmNvbnN0IGlucHV0LAorICAgICAgICB1aW50OF90ICpiYXNlLAorICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwKKyAgICAgICAgdWludDY0X3QgdGltZXN0YW1wKSB7CisgICAgaXZfcmF3X2J1Zl90ICpwc19pbnBfcmF3X2J1ZjsKKworICAgIHBzX2lucF9yYXdfYnVmID0gJnBzX2VuY29kZV9pcC0+c19pbnBfYnVmOworICAgIHBzX2VuY29kZV9pcC0+c19vdXRfYnVmLnB2X2J1ZiA9IGJhc2U7CisgICAgcHNfZW5jb2RlX2lwLT5zX291dF9idWYudTRfYnl0ZXMgPSAwOworICAgIHBzX2VuY29kZV9pcC0+c19vdXRfYnVmLnU0X2J1ZnNpemUgPSBjYXBhY2l0eTsKKyAgICBwc19lbmNvZGVfaXAtPnU0X3NpemUgPSBzaXplb2YoaXZlX3ZpZGVvX2VuY29kZV9pcF90KTsKKyAgICBwc19lbmNvZGVfb3AtPnU0X3NpemUgPSBzaXplb2YoaXZlX3ZpZGVvX2VuY29kZV9vcF90KTsKKworICAgIHBzX2VuY29kZV9pcC0+ZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0VOQ09ERTsKKyAgICBwc19lbmNvZGVfaXAtPnB2X2J1ZnMgPSBudWxscHRyOworICAgIHBzX2VuY29kZV9pcC0+cHZfbWJfaW5mbyA9IG51bGxwdHI7CisgICAgcHNfZW5jb2RlX2lwLT5wdl9waWNfaW5mbyA9IG51bGxwdHI7CisgICAgcHNfZW5jb2RlX2lwLT51NF9tYl9pbmZvX3R5cGUgPSAwOworICAgIHBzX2VuY29kZV9pcC0+dTRfcGljX2luZm9fdHlwZSA9IDA7CisgICAgcHNfZW5jb2RlX2lwLT51NF9pc19sYXN0ID0gMDsKKyAgICBwc19lbmNvZGVfaXAtPnU0X3RpbWVzdGFtcF9oaWdoID0gdGltZXN0YW1wID4+IDMyOworICAgIHBzX2VuY29kZV9pcC0+dTRfdGltZXN0YW1wX2xvdyA9IHRpbWVzdGFtcCAmIDB4RkZGRkZGRkY7CisgICAgcHNfZW5jb2RlX29wLT5zX291dF9idWYucHZfYnVmID0gbnVsbHB0cjsKKworICAgIC8qIEluaXRpYWxpemUgY29sb3IgZm9ybWF0cyAqLworICAgIG1lbXNldChwc19pbnBfcmF3X2J1ZiwgMCwgc2l6ZW9mKGl2X3Jhd19idWZfdCkpOworICAgIHBzX2lucF9yYXdfYnVmLT51NF9zaXplID0gc2l6ZW9mKGl2X3Jhd19idWZfdCk7CisgICAgcHNfaW5wX3Jhd19idWYtPmVfY29sb3JfZm10ID0gbUl2VmlkZW9Db2xvckZvcm1hdDsKKyAgICBpZiAoaW5wdXQgPT0gbnVsbHB0cikgeworICAgICAgICBpZiAobVNhd0lucHV0RU9TKXsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+dTRfaXNfbGFzdCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIGlmIChpbnB1dC0+d2lkdGgoKSA8IG1TaXplLT53aWR0aCB8fAorICAgICAgICBpbnB1dC0+aGVpZ2h0KCkgPCBtU2l6ZS0+aGVpZ2h0KSB7CisgICAgICAgIC8qIEV4cGVjdCB3aWR0aCBoZWlnaHQgdG8gYmUgY29uZmlndXJlZCAqLworICAgICAgICBBTE9HVygidW5leHBlY3RlZCBDYXBhY2l0eSBBc3BlY3QgJWQoJWQpIHggJWQoJWQpIiwgaW5wdXQtPndpZHRoKCksCisgICAgICAgICAgICAgIG1TaXplLT53aWR0aCwgaW5wdXQtPmhlaWdodCgpLCBtU2l6ZS0+aGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoIndpZHRoID0gJWQsIGhlaWdodCA9ICVkIiwgaW5wdXQtPndpZHRoKCksIGlucHV0LT5oZWlnaHQoKSk7CisgICAgY29uc3QgQzJQbGFuYXJMYXlvdXQgJmxheW91dCA9IGlucHV0LT5sYXlvdXQoKTsKKyAgICB1aW50OF90ICp5UGxhbmUgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5wdXQtPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV0pOworICAgIHVpbnQ4X3QgKnVQbGFuZSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihpbnB1dC0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSk7CisgICAgdWludDhfdCAqdlBsYW5lID0gY29uc3RfY2FzdDx1aW50OF90ICo+KGlucHV0LT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdKTsKKyAgICBpbnQzMl90IHlTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXS5yb3dJbmM7CisgICAgaW50MzJfdCB1U3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ucm93SW5jOworICAgIGludDMyX3QgdlN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdLnJvd0luYzsKKworICAgIHVpbnQzMl90IHdpZHRoID0gbVNpemUtPndpZHRoOworICAgIHVpbnQzMl90IGhlaWdodCA9IG1TaXplLT5oZWlnaHQ7CisgICAgLy8gd2lkdGggYW5kIGhlaWdodCBhcmUgYWx3YXlzIGV2ZW4gKGFzIGJsb2NrIHNpemUgaXMgMTZ4MTYpCisgICAgQ0hFQ0tfRVEoKHdpZHRoICYgMXUpLCAwdSk7CisgICAgQ0hFQ0tfRVEoKGhlaWdodCAmIDF1KSwgMHUpOworICAgIHNpemVfdCB5UGxhbmVTaXplID0gd2lkdGggKiBoZWlnaHQ7CisKKyAgICBzd2l0Y2ggKGxheW91dC50eXBlKSB7CisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCOgorICAgICAgICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQkE6IHsKKyAgICAgICAgICAgIEFMT0dWKCJ5UGxhbmVTaXplID0gJXp1IiwgeVBsYW5lU2l6ZSk7CisgICAgICAgICAgICBNZW1vcnlCbG9jayBjb252ZXJzaW9uQnVmZmVyID0gbUNvbnZlcnNpb25CdWZmZXJzLmZldGNoKHlQbGFuZVNpemUgKiAzIC8gMik7CisgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZS5lbXBsYWNlKGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpLCBjb252ZXJzaW9uQnVmZmVyKTsKKyAgICAgICAgICAgIHlQbGFuZSA9IGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpOworICAgICAgICAgICAgdVBsYW5lID0geVBsYW5lICsgeVBsYW5lU2l6ZTsKKyAgICAgICAgICAgIHZQbGFuZSA9IHVQbGFuZSArIHlQbGFuZVNpemUgLyA0OworICAgICAgICAgICAgeVN0cmlkZSA9IHdpZHRoOworICAgICAgICAgICAgdVN0cmlkZSA9IHZTdHJpZGUgPSB5U3RyaWRlIC8gMjsKKyAgICAgICAgICAgIENvbnZlcnRSR0JUb1BsYW5hcllVVih5UGxhbmUsIHlTdHJpZGUsIGhlaWdodCwgY29udmVyc2lvbkJ1ZmZlci5zaXplKCksICppbnB1dCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVjogeworICAgICAgICAgICAgaWYgKCFJc1lVVjQyMCgqaW5wdXQpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImlucHV0IGlzIG5vdCBZVVY0MjAiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfWV0uY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0uY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgdVN0cmlkZSA9PSB2U3RyaWRlCisgICAgICAgICAgICAgICAgICAgICYmIHlTdHJpZGUgPT0gMiAqIHZTdHJpZGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJNDIwIGNvbXBhdGlibGUgLSBhbHJlYWR5IHNldCB1cCBhYm92ZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjb3B5IHRvIEk0MjAKKyAgICAgICAgICAgIHlTdHJpZGUgPSB3aWR0aDsKKyAgICAgICAgICAgIHVTdHJpZGUgPSB2U3RyaWRlID0geVN0cmlkZSAvIDI7CisgICAgICAgICAgICBNZW1vcnlCbG9jayBjb252ZXJzaW9uQnVmZmVyID0gbUNvbnZlcnNpb25CdWZmZXJzLmZldGNoKHlQbGFuZVNpemUgKiAzIC8gMik7CisgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZS5lbXBsYWNlKGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpLCBjb252ZXJzaW9uQnVmZmVyKTsKKyAgICAgICAgICAgIE1lZGlhSW1hZ2UyIGltZyA9IENyZWF0ZVlVVjQyMFBsYW5hck1lZGlhSW1hZ2UyKHdpZHRoLCBoZWlnaHQsIHlTdHJpZGUsIGhlaWdodCk7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBJbWFnZUNvcHkoY29udmVyc2lvbkJ1ZmZlci5kYXRhKCksICZpbWcsICppbnB1dCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkJ1ZmZlciBjb252ZXJzaW9uIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB5UGxhbmUgPSBjb252ZXJzaW9uQnVmZmVyLmRhdGEoKTsKKyAgICAgICAgICAgIHVQbGFuZSA9IHlQbGFuZSArIHlQbGFuZVNpemU7CisgICAgICAgICAgICB2UGxhbmUgPSB1UGxhbmUgKyB5UGxhbmVTaXplIC8gNDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKworICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVkE6CisgICAgICAgICAgICBBTE9HRSgiWVVWQSBwbGFuZSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJVbnJlY29nbml6ZWQgcGxhbmUgdHlwZTogJWQiLCBsYXlvdXQudHlwZSk7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN3aXRjaCAobUl2VmlkZW9Db2xvckZvcm1hdCkgeworICAgICAgICBjYXNlIElWX1lVVl80MjBQOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBpbnB1dCBidWZmZXIgaXMgc3VwcG9zZWQgdG8gYmUgY29uc3QgYnV0IEl0dGlhbSBBUEkgd2FudHMgYmFyZSBwb2ludGVyLgorICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmFwdl9idWZzWzBdID0geVBsYW5lOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmFwdl9idWZzWzFdID0gdVBsYW5lOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmFwdl9idWZzWzJdID0gdlBsYW5lOworCisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3dkWzBdID0gaW5wdXQtPndpZHRoKCk7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3dkWzFdID0gaW5wdXQtPndpZHRoKCkgLyAyOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF93ZFsyXSA9IGlucHV0LT53aWR0aCgpIC8gMjsKKworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9odFswXSA9IGlucHV0LT5oZWlnaHQoKTsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfaHRbMV0gPSBpbnB1dC0+aGVpZ2h0KCkgLyAyOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9odFsyXSA9IGlucHV0LT5oZWlnaHQoKSAvIDI7CisKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfc3RyZFswXSA9IHlTdHJpZGU7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3N0cmRbMV0gPSB1U3RyaWRlOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9zdHJkWzJdID0gdlN0cmlkZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBJVl9ZVVZfNDIySUxFOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAvLyBwc19pbnBfcmF3X2J1Zi0+YXB2X2J1ZnNbMF0gPSBwdTFfYnVmOworICAgICAgICAgICAgLy8gcHNfaW5wX3Jhd19idWYtPmF1NF93ZFswXSA9IG1XaWR0aCAqIDI7CisgICAgICAgICAgICAvLyBwc19pbnBfcmF3X2J1Zi0+YXU0X2h0WzBdID0gbUhlaWdodDsKKyAgICAgICAgICAgIC8vIHBzX2lucF9yYXdfYnVmLT5hdTRfc3RyZFswXSA9IG1TdHJpZGUgKiAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIElWX1lVVl80MjBTUF9VVjoKKyAgICAgICAgY2FzZSBJVl9ZVVZfNDIwU1BfVlU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hcHZfYnVmc1swXSA9IHlQbGFuZTsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hcHZfYnVmc1sxXSA9IHVQbGFuZTsKKworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF93ZFswXSA9IGlucHV0LT53aWR0aCgpOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF93ZFsxXSA9IGlucHV0LT53aWR0aCgpOworCisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X2h0WzBdID0gaW5wdXQtPmhlaWdodCgpOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9odFsxXSA9IGlucHV0LT5oZWlnaHQoKSAvIDI7CisKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfc3RyZFswXSA9IHlTdHJpZGU7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3N0cmRbMV0gPSB1U3RyaWRlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEF2Y0VuYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBXT1JEMzIgdGltZURlbGF5LCB0aW1lVGFrZW47CisgICAgdWludDY0X3QgdGltZXN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3VsbCgpOworCisgICAgLy8gSW5pdGlhbGl6ZSBlbmNvZGVyIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpemVkCisgICAgaWYgKG1Db2RlY0N0eCA9PSBudWxscHRyKSB7CisgICAgICAgIGlmIChDMl9PSyAhPSBpbml0RW5jb2RlcigpKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgZW5jb2RlciIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobVNpZ25hbGxlZEVycm9yKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyB3aGlsZSAoIW1TYXdPdXRwdXRFT1MgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKKyAgICBjMl9zdGF0dXNfdCBlcnJvcjsKKyAgICBpdmVfdmlkZW9fZW5jb2RlX2lwX3Qgc19lbmNvZGVfaXA7CisgICAgaXZlX3ZpZGVvX2VuY29kZV9vcF90IHNfZW5jb2RlX29wOworCisgICAgaWYgKCFtU3BzUHBzSGVhZGVyUmVjZWl2ZWQpIHsKKyAgICAgICAgY29uc3RleHByIHVpbnQzMl90IGtIZWFkZXJMZW5ndGggPSBNSU5fU1RSRUFNX1NJWkU7CisgICAgICAgIHVpbnQ4X3QgaGVhZGVyW2tIZWFkZXJMZW5ndGhdOworICAgICAgICBlcnJvciA9IHNldEVuY29kZUFyZ3MoCisgICAgICAgICAgICAgICAgJnNfZW5jb2RlX2lwLCAmc19lbmNvZGVfb3AsIG51bGxwdHIsIGhlYWRlciwga0hlYWRlckxlbmd0aCwgdGltZXN0YW1wKTsKKyAgICAgICAgaWYgKGVycm9yICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgic2V0RW5jb2RlQXJncyBmYWlsZWQ6ICVkIiwgZXJyb3IpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZW5jb2RlX2lwLCAmc19lbmNvZGVfb3ApOworCisgICAgICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICAgICAgQUxPR0UoIkVuY29kZSBoZWFkZXIgZmFpbGVkID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgc19lbmNvZGVfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigiQnl0ZXMgR2VuZXJhdGVkIGluIGhlYWRlciAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgc19lbmNvZGVfb3Auc19vdXRfYnVmLnU0X2J5dGVzKTsKKyAgICAgICAgfQorCisgICAgICAgIG1TcHNQcHNIZWFkZXJSZWNlaXZlZCA9IHRydWU7CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RyZWFtQ3NkSW5mbzo6b3V0cHV0PiBjc2QgPQorICAgICAgICAgICAgQzJTdHJlYW1Dc2RJbmZvOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKHNfZW5jb2RlX29wLnNfb3V0X2J1Zi51NF9ieXRlcywgMHUpOworICAgICAgICBpZiAoIWNzZCkgeworICAgICAgICAgICAgQUxPR0UoIkNTRCBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoY3NkLT5tLnZhbHVlLCBoZWFkZXIsIHNfZW5jb2RlX29wLnNfb3V0X2J1Zi51NF9ieXRlcyk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKHN0ZDo6bW92ZShjc2QpKTsKKworICAgICAgICBEVU1QX1RPX0ZJTEUoCisgICAgICAgICAgICAgICAgbU91dEZpbGUsIGNzZC0+bS52YWx1ZSwgY3NkLT5mbGV4Q291bnQoKSk7CisgICAgfQorCisgICAgLy8gaGFuZGxlIGR5bmFtaWMgY29uZmlnIHBhcmFtZXRlcnMKKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dD4gaW50cmFSZWZyZXNoID0gbUludGYtPmdldEludHJhUmVmcmVzaF9sKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IGJpdHJhdGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZV9sKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gcmVxdWVzdFN5bmMgPSBtSW50Zi0+Z2V0UmVxdWVzdFN5bmNfbCgpOworICAgICAgICBsb2NrLnVubG9jaygpOworCisgICAgICAgIGlmIChiaXRyYXRlICE9IG1CaXRyYXRlKSB7CisgICAgICAgICAgICBtQml0cmF0ZSA9IGJpdHJhdGU7CisgICAgICAgICAgICBzZXRCaXRSYXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW50cmFSZWZyZXNoICE9IG1JbnRyYVJlZnJlc2gpIHsKKyAgICAgICAgICAgIG1JbnRyYVJlZnJlc2ggPSBpbnRyYVJlZnJlc2g7CisgICAgICAgICAgICBzZXRBaXJQYXJhbXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXF1ZXN0U3luYyAhPSBtUmVxdWVzdFN5bmMpIHsKKyAgICAgICAgICAgIC8vIHdlIGNhbiBoYW5kbGUgSURSIGltbWVkaWF0ZWx5CisgICAgICAgICAgICBpZiAocmVxdWVzdFN5bmMtPnZhbHVlKSB7CisgICAgICAgICAgICAgICAgLy8gdW5zZXQgcmVxdWVzdAorICAgICAgICAgICAgICAgIEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0IGNsZWFyU3luYygwdSwgQzJfRkFMU0UpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBtSW50Zi0+Y29uZmlnKHsgJmNsZWFyU3luYyB9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgQUxPR1YoIkdvdCBzeW5jIHJlcXVlc3QiKTsKKyAgICAgICAgICAgICAgICBzZXRGcmFtZVR5cGUoSVZfSURSX0ZSQU1FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1SZXF1ZXN0U3luYyA9IHJlcXVlc3RTeW5jOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBtU2F3SW5wdXRFT1MgPSB0cnVlOworICAgIH0KKworICAgIC8qIEluIG5vcm1hbCBtb2RlLCBzdG9yZSBpbnB1dEJ1ZmZlckluZm8gYW5kIHRoaXMgd2lsbCBiZSByZXR1cm5lZAorICAgICAgIHdoZW4gZW5jb2RlciBjb25zdW1lcyB0aGlzIGlucHV0ICovCisgICAgLy8gaWYgKCFtSW5wdXREYXRhSXNNZXRhICYmIChpbnB1dEJ1ZmZlckluZm8gIT0gTlVMTCkpIHsKKyAgICAvLyAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBNQVhfSU5QVVRfQlVGRkVSX0hFQURFUlM7IGkrKykgeworICAgIC8vICAgICAgICAgaWYgKE5VTEwgPT0gbUlucHV0QnVmZmVySW5mb1tpXSkgeworICAgIC8vICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlckluZm9baV0gPSBpbnB1dEJ1ZmZlckluZm87CisgICAgLy8gICAgICAgICAgICAgYnJlYWs7CisgICAgLy8gICAgICAgICB9CisgICAgLy8gICAgIH0KKyAgICAvLyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IHZpZXc7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBpbnB1dEJ1ZmZlcjsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICBpbnB1dEJ1ZmZlciA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF07CisgICAgICAgIHZpZXcgPSBzdGQ6Om1ha2Vfc2hhcmVkPGNvbnN0IEMyR3JhcGhpY1ZpZXc+KAorICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCkpOworICAgICAgICBpZiAodmlldy0+ZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZXJyID0gJWQiLCB2aWV3LT5lcnJvcigpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKworICAgIGRvIHsKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kbGluZywgcHJvcGVyIHVzYWdlLCBldGMuCisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sobU91dEJ1ZmZlclNpemUsIHVzYWdlLCAmYmxvY2spOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiZmV0Y2ggbGluZWFyIGJsb2NrIGVyciA9ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IGVycjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHdWaWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBlcnIgPSAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gd1ZpZXcuZXJyb3IoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGVycm9yID0gc2V0RW5jb2RlQXJncygKKyAgICAgICAgICAgICAgICAmc19lbmNvZGVfaXAsICZzX2VuY29kZV9vcCwgdmlldy5nZXQoKSwgd1ZpZXcuYmFzZSgpLCB3Vmlldy5jYXBhY2l0eSgpLCB0aW1lc3RhbXApOworICAgICAgICBpZiAoZXJyb3IgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJzZXRFbmNvZGVBcmdzIGZhaWxlZCA6ICVkIiwgZXJyb3IpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IGVycm9yOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gRFVNUF9UT19GSUxFKAorICAgICAgICAvLyAgICAgICAgIG1JbkZpbGUsIHNfZW5jb2RlX2lwLnNfaW5wX2J1Zi5hcHZfYnVmc1swXSwKKyAgICAgICAgLy8gICAgICAgICAobUhlaWdodCAqIG1TdHJpZGUgKiAzIC8gMikpOworCisgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgICAgICAvKiBDb21wdXRlIHRpbWUgZWxhcHNlZCBiZXR3ZWVuIGVuZCBvZiBwcmV2aW91cyBkZWNvZGUoKQorICAgICAgICAgKiB0byBzdGFydCBvZiBjdXJyZW50IGRlY29kZSgpICovCisgICAgICAgIFRJTUVfRElGRihtVGltZUVuZCwgbVRpbWVTdGFydCwgdGltZURlbGF5KTsKKyAgICAgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2VuY29kZV9pcCwgJnNfZW5jb2RlX29wKTsKKworICAgICAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgIGlmICgoc19lbmNvZGVfb3AudTRfZXJyb3JfY29kZSAmIDB4RkYpID09IElIMjY0RV9CSVRTVFJFQU1fQlVGRkVSX09WRVJGTE9XKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogdXNlIElWRV9DTURfQ1RMX0dFVEJVRklORk8gZm9yIHByb3BlciBtYXggaW5wdXQgc2l6ZT8KKyAgICAgICAgICAgICAgICBtT3V0QnVmZmVyU2l6ZSAqPSAyOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR0UoIkVuY29kZSBGcmFtZSBmYWlsZWQgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICBzX2VuY29kZV9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChJVl9TVUNDRVNTICE9IHN0YXR1cyk7CisKKyAgICAvLyBIb2xkIGlucHV0IGJ1ZmZlciByZWZlcmVuY2UKKyAgICBpZiAoaW5wdXRCdWZmZXIpIHsKKyAgICAgICAgbUJ1ZmZlcnNbc19lbmNvZGVfaXAuc19pbnBfYnVmLmFwdl9idWZzWzBdXSA9IGlucHV0QnVmZmVyOworICAgIH0KKworICAgIEdFVFRJTUUoJm1UaW1lRW5kLCBudWxscHRyKTsKKyAgICAvKiBDb21wdXRlIHRpbWUgdGFrZW4gZm9yIGRlY29kZSgpICovCisgICAgVElNRV9ESUZGKG1UaW1lU3RhcnQsIG1UaW1lRW5kLCB0aW1lVGFrZW4pOworCisgICAgQUxPR1YoInRpbWVUYWtlbj0lNmQgZGVsYXk9JTZkIG51bUJ5dGVzPSU2ZCIsIHRpbWVUYWtlbiwgdGltZURlbGF5LAorICAgICAgICAgICAgc19lbmNvZGVfb3Auc19vdXRfYnVmLnU0X2J5dGVzKTsKKworICAgIHZvaWQgKmZyZWVkID0gc19lbmNvZGVfb3Auc19pbnBfYnVmLmFwdl9idWZzWzBdOworICAgIC8qIElmIGVuY29kZXIgZnJlZXMgdXAgYW4gaW5wdXQgYnVmZmVyLCBtYXJrIGl0IGFzIGZyZWUgKi8KKyAgICBpZiAoZnJlZWQgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAobUJ1ZmZlcnMuY291bnQoZnJlZWQpID09IDB1KSB7CisgICAgICAgICAgICBBTE9HRCgiYnVmZmVyIG5vdCB0cmFja2VkIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBSZWxlYXNlIGlucHV0IGJ1ZmZlciByZWZlcmVuY2UKKyAgICAgICAgICAgIG1CdWZmZXJzLmVyYXNlKGZyZWVkKTsKKyAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyc0luVXNlLmVyYXNlKGZyZWVkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgPQorICAgICAgICAoKHVpbnQ2NF90KXNfZW5jb2RlX29wLnU0X3RpbWVzdGFtcF9oaWdoIDw8IDMyKSB8IHNfZW5jb2RlX29wLnU0X3RpbWVzdGFtcF9sb3c7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKworICAgIGlmIChzX2VuY29kZV9vcC5zX291dF9idWYudTRfYnl0ZXMpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPQorICAgICAgICAgICAgY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLCAwLCBzX2VuY29kZV9vcC5zX291dF9idWYudTRfYnl0ZXMpOworICAgICAgICBpZiAoSVZfSURSX0ZSQU1FID09IHNfZW5jb2RlX29wLnU0X2VuY29kZWRfZnJhbWVfdHlwZSkgeworICAgICAgICAgICAgQUxPR1YoIklEUiBmcmFtZSBwcm9kdWNlZCIpOworICAgICAgICAgICAgYnVmZmVyLT5zZXRJbmZvKHN0ZDo6bWFrZV9zaGFyZWQ8QzJTdHJlYW1QaWN0dXJlVHlwZU1hc2tJbmZvOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAwdSAvKiBzdHJlYW0gaWQgKi8sIEMyUGljdHVyZVR5cGVLZXlGcmFtZSkpOworICAgICAgICB9CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgIH0KKworICAgIGlmIChzX2VuY29kZV9vcC51NF9pc19sYXN0KSB7CisgICAgICAgIC8vIG91dHB1dEJ1ZmZlckhlYWRlci0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgbVNhd091dHB1dEVPUyA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gb3V0cHV0QnVmZmVySGVhZGVyLT5uRmxhZ3MgJj0gfk9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIFRPRE86IHVzZSBJVkVfQ01EX0NUTF9GTFVTSD8KKyAgICAodm9pZClkcmFpbk1vZGU7CisgICAgKHZvaWQpcG9vbDsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKworY2xhc3MgQzJTb2Z0QXZjRW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEF2Y0VuY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEF2Y0VuYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBdmNFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0QXZjRW5jOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QXZjRW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0QXZjRW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0QXZjRW5jRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEzY2E2MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNFbmMuaApAQCAtMCwwICsxLDI5NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfQVZDX0VOQ19IX18KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0FWQ19FTkNfSF9fCisKKyNpbmNsdWRlIDxtYXA+CisKKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJpaDI2NF90eXBlZGVmcy5oIgorI2luY2x1ZGUgIml2Mi5oIgorI2luY2x1ZGUgIml2ZTIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjZGVmaW5lIENPREVDX01BWF9DT1JFUyAgICAgICAgICA0CisjZGVmaW5lIExFTl9TVEFUVVNfQlVGRkVSICAgICAgICAoMTAgICogMTAyNCkKKyNkZWZpbmUgTUFYX1ZCVl9CVUZGX1NJWkUgICAgICAgICgxMjAgKiAxNjM4NCkKKyNkZWZpbmUgTUFYX05VTV9JT19CVUZTICAgICAgICAgICAzCisKKyNkZWZpbmUgREVGQVVMVF9NQVhfUkVGX0ZSTSAgICAgICAgIDIKKyNkZWZpbmUgREVGQVVMVF9NQVhfUkVPUkRFUl9GUk0gICAgIDAKKyNkZWZpbmUgREVGQVVMVF9RUF9NSU4gICAgICAgICAgICAgIDEwCisjZGVmaW5lIERFRkFVTFRfUVBfTUFYICAgICAgICAgICAgICA0MAorI2RlZmluZSBERUZBVUxUX01BWF9CSVRSQVRFICAgICAgICAgMjAwMDAwMDAKKyNkZWZpbmUgREVGQVVMVF9NQVhfU1JDSF9SQU5HRV9YICAgIDI1NgorI2RlZmluZSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1kgICAgMjU2CisjZGVmaW5lIERFRkFVTFRfTUFYX0ZSQU1FUkFURSAgICAgICAxMjAwMDAKKyNkZWZpbmUgREVGQVVMVF9OVU1fQ09SRVMgICAgICAgICAgIDEKKyNkZWZpbmUgREVGQVVMVF9OVU1fQ09SRVNfUFJFX0VOQyAgIDAKKyNkZWZpbmUgREVGQVVMVF9GUFMgICAgICAgICAgICAgICAgIDMwCisjZGVmaW5lIERFRkFVTFRfRU5DX1NQRUVEICAgICAgICAgICBJVkVfTk9STUFMCisKKyNkZWZpbmUgREVGQVVMVF9NRU1fUkVDX0NOVCAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9SRUNPTl9FTkFCTEUgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9DSEtTVU1fRU5BQkxFICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9TVEFSVF9GUk0gICAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9OVU1fRlJNUyAgICAgICAgICAgIDB4RkZGRkZGRkYKKyNkZWZpbmUgREVGQVVMVF9JTlBfQ09MT1JfRk9STUFUICAgICAgIElWX1lVVl80MjBTUF9WVQorI2RlZmluZSBERUZBVUxUX1JFQ09OX0NPTE9SX0ZPUk1BVCAgICAgSVZfWVVWXzQyMFAKKyNkZWZpbmUgREVGQVVMVF9MT09QQkFDSyAgICAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9TUkNfRlJBTUVfUkFURSAgICAgIDMwCisjZGVmaW5lIERFRkFVTFRfVEdUX0ZSQU1FX1JBVEUgICAgICAzMAorI2RlZmluZSBERUZBVUxUX01BWF9XRCAgICAgICAgICAgICAgMTkyMAorI2RlZmluZSBERUZBVUxUX01BWF9IVCAgICAgICAgICAgICAgMTkyMAorI2RlZmluZSBERUZBVUxUX01BWF9MRVZFTCAgICAgICAgICAgNDEKKyNkZWZpbmUgREVGQVVMVF9TVFJJREUgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9XRCAgICAgICAgICAgICAgICAgIDEyODAKKyNkZWZpbmUgREVGQVVMVF9IVCAgICAgICAgICAgICAgICAgIDcyMAorI2RlZmluZSBERUZBVUxUX1BTTlJfRU5BQkxFICAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX01FX1NQRUVEICAgICAgICAgICAgMTAwCisjZGVmaW5lIERFRkFVTFRfRU5BQkxFX0ZBU1RfU0FEICAgICAwCisjZGVmaW5lIERFRkFVTFRfRU5BQkxFX0FMVF9SRUYgICAgICAwCisjZGVmaW5lIERFRkFVTFRfUkNfTU9ERSAgICAgICAgICAgICBJVkVfUkNfU1RPUkFHRQorI2RlZmluZSBERUZBVUxUX0JJVFJBVEUgICAgICAgICAgICAgNjAwMDAwMAorI2RlZmluZSBERUZBVUxUX0lfUVAgICAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgREVGQVVMVF9JX1FQX01BWCAgICAgICAgICAgIERFRkFVTFRfUVBfTUFYCisjZGVmaW5lIERFRkFVTFRfSV9RUF9NSU4gICAgICAgICAgICBERUZBVUxUX1FQX01JTgorI2RlZmluZSBERUZBVUxUX1BfUVAgICAgICAgICAgICAgICAgMjgKKyNkZWZpbmUgREVGQVVMVF9QX1FQX01BWCAgICAgICAgICAgIERFRkFVTFRfUVBfTUFYCisjZGVmaW5lIERFRkFVTFRfUF9RUF9NSU4gICAgICAgICAgICBERUZBVUxUX1FQX01JTgorI2RlZmluZSBERUZBVUxUX0JfUVAgICAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgREVGQVVMVF9CX1FQX01BWCAgICAgICAgICAgIERFRkFVTFRfUVBfTUFYCisjZGVmaW5lIERFRkFVTFRfQl9RUF9NSU4gICAgICAgICAgICBERUZBVUxUX1FQX01JTgorI2RlZmluZSBERUZBVUxUX0FJUiAgICAgICAgICAgICAgICAgSVZFX0FJUl9NT0RFX05PTkUKKyNkZWZpbmUgREVGQVVMVF9BSVJfUkVGUkVTSF9QRVJJT0QgIDMwCisjZGVmaW5lIERFRkFVTFRfU1JDSF9STkdfWCAgICAgICAgICA2NAorI2RlZmluZSBERUZBVUxUX1NSQ0hfUk5HX1kgICAgICAgICAgNDgKKyNkZWZpbmUgREVGQVVMVF9JX0lOVEVSVkFMICAgICAgICAgIDMwCisjZGVmaW5lIERFRkFVTFRfSURSX0lOVEVSVkFMICAgICAgICAxMDAwCisjZGVmaW5lIERFRkFVTFRfQl9GUkFNRVMgICAgICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfRElTQUJMRV9ERUJMS19MRVZFTCAwCisjZGVmaW5lIERFRkFVTFRfSFBFTCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFRkFVTFRfUVBFTCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFRkFVTFRfSTQgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFRkFVTFRfRVBST0ZJTEUgICAgICAgICAgICBJVl9QUk9GSUxFX0JBU0UKKyNkZWZpbmUgREVGQVVMVF9FTlRST1BZX01PREUgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9TTElDRV9NT0RFICAgICAgICAgIElWRV9TTElDRV9NT0RFX05PTkUKKyNkZWZpbmUgREVGQVVMVF9TTElDRV9QQVJBTSAgICAgICAgIDI1NgorI2RlZmluZSBERUZBVUxUX0FSQ0ggICAgICAgICAgICAgICAgQVJDSF9BUk1fQTlRCisjZGVmaW5lIERFRkFVTFRfU09DICAgICAgICAgICAgICAgICBTT0NfR0VORVJJQworI2RlZmluZSBERUZBVUxUX0lOVFJBNHg0ICAgICAgICAgICAgMAorI2RlZmluZSBTVFJMRU5HVEggICAgICAgICAgICAgICAgICAgNTAwCisjZGVmaW5lIERFRkFVTFRfQ09OU1RSQUlORURfSU5UUkEgICAwCisKKyNkZWZpbmUgTUlOKGEsIGIpICgoYSkgPCAoYikpPyAoYSkgOiAoYikKKyNkZWZpbmUgTUFYKGEsIGIpICgoYSkgPiAoYikpPyAoYSkgOiAoYikKKyNkZWZpbmUgQUxJR04xNih4KSAoKCgoeCkgKyAxNSkgPj4gNCkgPDwgNCkKKyNkZWZpbmUgQUxJR04xMjgoeCkgKCgoKHgpICsgMTI3KSA+PiA3KSA8PCA3KQorI2RlZmluZSBBTElHTjQwOTYoeCkgKCgoKHgpICsgNDA5NSkgPj4gMTIpIDw8IDEyKQorCisvKiogVXNlZCB0byByZW1vdmUgd2FybmluZ3MgYWJvdXQgdW51c2VkIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgVU5VU0VEKHgpICgodm9pZCkoeCkpCisKKy8qKiBHZXQgdGltZSAqLworI2RlZmluZSBHRVRUSU1FKGEsIGIpIGdldHRpbWVvZmRheShhLCBiKTsKKworLyoqIENvbXB1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQgKi8KKyNkZWZpbmUgVElNRV9ESUZGKHN0YXJ0LCBlbmQsIGRpZmYpIFwKKyAgICBkaWZmID0gKCgoZW5kKS50dl9zZWMgLSAoc3RhcnQpLnR2X3NlYykgKiAxMDAwMDAwKSArIFwKKyAgICAgICAgICAgICgoZW5kKS50dl91c2VjIC0gKHN0YXJ0KS50dl91c2VjKTsKKworI2RlZmluZSBpdmVfYWxpZ25lZF9tYWxsb2MoYWxpZ25tZW50LCBzaXplKSBtZW1hbGlnbihhbGlnbm1lbnQsIHNpemUpCisjZGVmaW5lIGl2ZV9hbGlnbmVkX2ZyZWUoYnVmKSBmcmVlKGJ1ZikKKworc3RydWN0IEMyU29mdEF2Y0VuYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRBdmNFbmMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QzJTb2Z0QXZjRW5jKCk7CisKK3ByaXZhdGU6CisgICAgLy8gT01YIGlucHV0IGJ1ZmZlcidzIHRpbWVzdGFtcCBhbmQgZmxhZ3MKKyAgICB0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIGludDY0X3QgbVRpbWVVczsKKyAgICAgICAgaW50MzJfdCBtRmxhZ3M7CisgICAgfSBJbnB1dEJ1ZmZlckluZm87CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworCisgICAgaW50MzJfdCBtU3RyaWRlOworCisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVTdGFydDsgICAvLyBUaW1lIGF0IHRoZSBzdGFydCBvZiBkZWNvZGUoKQorICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lRW5kOyAgICAgLy8gVGltZSBhdCB0aGUgZW5kIG9mIGRlY29kZSgpCisKKyNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCisgICAgY2hhciBtSW5GaWxlWzIwMF07CisgICAgY2hhciBtT3V0RmlsZVsyMDBdOworI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKworICAgIElWX0NPTE9SX0ZPUk1BVF9UIG1JdlZpZGVvQ29sb3JGb3JtYXQ7CisKKyAgICBJVl9QUk9GSUxFX1QgbUFWQ0VuY1Byb2ZpbGUgX191bnVzZWQ7CisgICAgV09SRDMyICAgbUFWQ0VuY0xldmVsOworICAgIGJvb2wgICAgIG1TdGFydGVkOworICAgIGJvb2wgICAgIG1TcHNQcHNIZWFkZXJSZWNlaXZlZDsKKworICAgIGJvb2wgICAgIG1TYXdJbnB1dEVPUzsKKyAgICBib29sICAgICBtU2F3T3V0cHV0RU9TOworICAgIGJvb2wgICAgIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sICAgICBtSW50cmE0eDQ7CisgICAgYm9vbCAgICAgbUVuYWJsZUZhc3RTYWQ7CisgICAgYm9vbCAgICAgbUVuYWJsZUFsdFJlZjsKKyAgICBib29sICAgICBtUmVjb25FbmFibGU7CisgICAgYm9vbCAgICAgbVBTTlJFbmFibGU7CisgICAgYm9vbCAgICAgbUVudHJvcHlNb2RlOworICAgIGJvb2wgICAgIG1Db25zdHJhaW5lZEludHJhRmxhZzsKKyAgICBJVkVfU1BFRURfQ09ORklHICAgICBtRW5jU3BlZWQ7CisKKyAgICBpdl9vYmpfdCAqbUNvZGVjQ3R4OyAgICAgICAgIC8vIENvZGVjIGNvbnRleHQKKyAgICBpdl9tZW1fcmVjX3QgKm1NZW1SZWNvcmRzOyAgIC8vIE1lbW9yeSByZWNvcmRzIHJlcXVlc3RlZCBieSB0aGUgY29kZWMKKyAgICBzaXplX3QgbU51bU1lbVJlY29yZHM7ICAgICAgIC8vIE51bWJlciBvZiBtZW1vcnkgcmVjb3JkcyByZXF1ZXN0ZWQgYnkgY29kZWMKKyAgICBzaXplX3QgbU51bUNvcmVzOyAgICAgICAgICAgIC8vIE51bWJlciBvZiBjb3JlcyB1c2VkIGJ5IHRoZSBjb2RlYworCisgICAgLy8gY29uZmlndXJhdGlvbnMgdXNlZCBieSBjb21wb25lbnQgaW4gcHJvY2VzcworICAgIC8vIChUT0RPOiBrZWVwIHRoaXMgaW4gaW50ZiBidXQgbWFrZSB0aGVtIGludGVybmFsIG9ubHkpCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSW50cmFSZWZyZXNoVHVuaW5nOjpvdXRwdXQ+IG1JbnRyYVJlZnJlc2g7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBtRnJhbWVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gbVJlcXVlc3RTeW5jOworCisgICAgdWludDMyX3QgbU91dEJ1ZmZlclNpemU7CisgICAgVVdPUkQzMiBtSGVhZGVyR2VuZXJhdGVkOworICAgIFVXT1JEMzIgbUJmcmFtZXM7CisgICAgSVZfQVJDSF9UIG1BcmNoOworICAgIElWRV9TTElDRV9NT0RFX1QgbVNsaWNlTW9kZTsKKyAgICBVV09SRDMyIG1TbGljZVBhcmFtOworICAgIGJvb2wgbUhhbGZQZWxFbmFibGU7CisgICAgVVdPUkQzMiBtSUludGVydmFsOworICAgIFVXT1JEMzIgbUlEUkludGVydmFsOworICAgIFVXT1JEMzIgbURpc2FibGVEZWJsa0xldmVsOworICAgIHN0ZDo6bWFwPGNvbnN0IHZvaWQgKiwgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPj4gbUJ1ZmZlcnM7CisgICAgTWVtb3J5QmxvY2tQb29sIG1Db252ZXJzaW9uQnVmZmVyczsKKyAgICBzdGQ6Om1hcDxjb25zdCB2b2lkICosIE1lbW9yeUJsb2NrPiBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZTsKKworICAgIHZvaWQgaW5pdEVuY1BhcmFtcygpOworICAgIGMyX3N0YXR1c190IGluaXRFbmNvZGVyKCk7CisgICAgYzJfc3RhdHVzX3QgcmVsZWFzZUVuY29kZXIoKTsKKworICAgIGMyX3N0YXR1c190IHNldEZyYW1lVHlwZShJVl9QSUNUVVJFX0NPRElOR19UWVBFX1QgIGVfZnJhbWVfdHlwZSk7CisgICAgYzJfc3RhdHVzX3Qgc2V0UXAoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRFbmNNb2RlKElWRV9FTkNfTU9ERV9UIGVfZW5jX21vZGUpOworICAgIGMyX3N0YXR1c190IHNldERpbWVuc2lvbnMoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXROdW1Db3JlcygpOworICAgIGMyX3N0YXR1c190IHNldEZyYW1lUmF0ZSgpOworICAgIGMyX3N0YXR1c190IHNldElwZVBhcmFtcygpOworICAgIGMyX3N0YXR1c190IHNldEJpdFJhdGUoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRBaXJQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRNZVBhcmFtcygpOworICAgIGMyX3N0YXR1c190IHNldEdvcFBhcmFtcygpOworICAgIGMyX3N0YXR1c190IHNldFByb2ZpbGVQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXREZWJsb2NrUGFyYW1zKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0VmJ2UGFyYW1zKCk7CisgICAgdm9pZCBsb2dWZXJzaW9uKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0RW5jb2RlQXJncygKKyAgICAgICAgICAgIGl2ZV92aWRlb19lbmNvZGVfaXBfdCAqcHNfZW5jb2RlX2lwLAorICAgICAgICAgICAgaXZlX3ZpZGVvX2VuY29kZV9vcF90ICpwc19lbmNvZGVfb3AsCisgICAgICAgICAgICBjb25zdCBDMkdyYXBoaWNWaWV3ICpjb25zdCBpbnB1dCwKKyAgICAgICAgICAgIHVpbnQ4X3QgKmJhc2UsCisgICAgICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwKKyAgICAgICAgICAgIHVpbnQ2NF90IHRpbWVzdGFtcCk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRBdmNFbmMpOworfTsKKworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKworI2RlZmluZSBJTlBVVF9EVU1QX1BBVEggICAgICIvc2RjYXJkL21lZGlhL2F2Y2VfaW5wdXQiCisjZGVmaW5lIElOUFVUX0RVTVBfRVhUICAgICAgInl1diIKKyNkZWZpbmUgT1VUUFVUX0RVTVBfUEFUSCAgICAiL3NkY2FyZC9tZWRpYS9hdmNlX291dHB1dCIKKyNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUICAgICAiaDI2NCIKKworI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdHJjcHkobUluRmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNwcmludGYobUluRmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBJTlBVVF9EVU1QX1BBVEgsICBcCisgICAgICAgICAgICBtVGltZVN0YXJ0LnR2X3NlYywgbVRpbWVTdGFydC50dl91c2VjLCAgICAgIFwKKyAgICAgICAgICAgIElOUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cmNweShtT3V0RmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3ByaW50ZihtT3V0RmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBPVVRQVVRfRFVNUF9QQVRILFwKKyAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfc2VjLCBtVGltZVN0YXJ0LnR2X3VzZWMsICAgICAgXAorICAgICAgICAgICAgT1VUUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKSB7ICAgICAgICAgICAgICAgICAgXAorICAgIEZJTEUgKmZwID0gZm9wZW4obV9maWxlbmFtZSwgIndiIik7ICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZwICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIk9wZW5lZCBmaWxlICVzIiwgbV9maWxlbmFtZSk7ICAgICAgICAgICAgXAorICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCBvcGVuIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTsgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplKSAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTEUgKmZwID0gZm9wZW4obV9maWxlbmFtZSwgImFiIik7ICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZwICE9IE5VTEwgJiYgbV9idWYgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpID0gZndyaXRlKG1fYnVmLCAxLCBtX3NpemUsIGZwKTsgICAgICAgICAgICAgICBcCisgICAgICAgIEFMT0dEKCJmd3JpdGUgcmV0ICVkIHRvIHdyaXRlICVkIiwgaSwgbV9zaXplKTsgIFwKKyAgICAgICAgaWYgKGkgIT0gKGludCltX3NpemUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoIkVycm9yIGluIGZ3cml0ZSwgcmV0dXJuZWQgJWQiLCBpKTsgICBcCisgICAgICAgICAgICBwZXJyb3IoIkVycm9yIGluIHdyaXRlIHRvIGZpbGUiKTsgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCB3cml0ZSB0byBmaWxlICVzIiwgbV9maWxlbmFtZSk7XAorICAgICAgICBpZiAoZnAgIT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2Vsc2UgLyogRklMRV9EVU1QX0VOQUJMRSAqLworI2RlZmluZSBJTlBVVF9EVU1QX1BBVEgKKyNkZWZpbmUgSU5QVVRfRFVNUF9FWFQKKyNkZWZpbmUgT1VUUFVUX0RVTVBfUEFUSAorI2RlZmluZSBPVVRQVVRfRFVNUF9FWFQKKyNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpCisjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkKKyNkZWZpbmUgRFVNUF9UT19GSUxFKG1fZmlsZW5hbWUsIG1fYnVmLCBtX3NpemUpCisjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9BVkNfRU5DX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMmY1NDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMzggQEAKKy8vIERPIE5PVCBERVBFTkQgT04gVEhJUyBESVJFQ1RMWQorLy8gdXNlIGxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIGluc3RlYWQKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfY29tbW9uIiwKKyAgICBkZWZhdWx0czogWyJsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyJdLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJTaW1wbGVDMkNvbXBvbmVudC5jcHAiLAorICAgICAgICAiU2ltcGxlQzJJbnRlcmZhY2UuY3BwIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlY191dGlscyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjdXRpbHMiLCAvLyBmb3IgcHJvcGVydGllcworICAgICAgICAibGlibG9nIiwgICAgLy8gZm9yIEFMT0cKKyAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlY191dGlscyIsIC8vIGZvciBJbWFnZUNvcHkKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLCAvLyBmb3IgTXV0ZXhlZAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCisKKyAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCit9CisKKy8vIHB1YmxpYyBkZXBlbmRlbmN5IGZvciBzb2Z0d2FyZSBjb2RlYyBpbXBsZW1lbnRhdGlvbgorLy8gdG8gYmUgdXNlZCBieSBjb2RlIHVuZGVyIG1lZGlhL2NvZGVjcy8qIG9ubHkgYXMgaXRzIHN0YWJpbGl0eSBpcyBub3QgZ3VhcmFudGVlZAorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgZGVmYXVsdHM6IFsibGliY29kZWMyLWltcGwtZGVmYXVsdHMiXSwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGlic2ZwbHVnaW5fY2NvZGVjX3V0aWxzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2NvbW1vbiIsCisgICAgICAgICJsaWJjdXRpbHMiLCAvLyBmb3IgcHJvcGVydGllcworICAgICAgICAibGlibG9nIiwgLy8gZm9yIEFMT0cKKyAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlY191dGlscyIsIC8vIGZvciBJbWFnZUNvcHkKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLCAvLyBmb3IgQ29sb3JVdGlscyBhbmQgTUlNRQorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKKyAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCit9CisKKy8vIHB1YmxpYyBkZXBlbmRlbmN5IGZvciBzb2Z0d2FyZSBjb2RlYyBpbXBsZW1lbnRhdGlvbgorLy8gdG8gYmUgdXNlZCBieSBjb2RlIHVuZGVyIG1lZGlhL2NvZGVjcy8qIG9ubHkKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCisvLyBwdWJsaWMgZGVwZW5kZW5jeSBmb3Igc29mdHdhcmUgY29kZWMgaW1wbGVtZW50YXRpb24KKy8vIHRvIGJlIHVzZWQgYnkgY29kZSB1bmRlciBtZWRpYS9jb2RlY3MvKiBvbmx5CitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBkaWFnOiB7CisgICAgICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKK30KKworLy8gVEVNUDogdXNlZCBieSBjaGVldHMyIHByb2plY3QgLSByZW1vdmUgd2hlbiBubyBsb25nZXIgdXNlZAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc2ltcGxlX2NvbXBvbmVudCIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIlNpbXBsZUMySW50ZXJmYWNlLmNwcCIsCisgICAgXSwKKworICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorCisgICAgbGRmbGFnczogWyItV2wsLUJzeW1ib2xpYyJdLAorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL1NpbXBsZUMyQ29tcG9uZW50LmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJDb21wb25lbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YmFlYzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL1NpbXBsZUMyQ29tcG9uZW50LmNwcApAQCAtMCwwICsxLDYyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU2ltcGxlQzJDb21wb25lbnQiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0ZDo6dW5pcXVlX3B0cjxDMldvcms+IFNpbXBsZUMyQ29tcG9uZW50OjpXb3JrUXVldWU6OnBvcF9mcm9udCgpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrID0gc3RkOjptb3ZlKG1RdWV1ZS5mcm9udCgpLndvcmspOworICAgIG1RdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICByZXR1cm4gd29yazsKK30KKwordm9pZCBTaW1wbGVDMkNvbXBvbmVudDo6V29ya1F1ZXVlOjpwdXNoX2JhY2soc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yaykgeworICAgIG1RdWV1ZS5wdXNoX2JhY2soeyBzdGQ6Om1vdmUod29yayksIE5PX0RSQUlOIH0pOworfQorCitib29sIFNpbXBsZUMyQ29tcG9uZW50OjpXb3JrUXVldWU6OmVtcHR5KCkgY29uc3QgeworICAgIHJldHVybiBtUXVldWUuZW1wdHkoKTsKK30KKwordm9pZCBTaW1wbGVDMkNvbXBvbmVudDo6V29ya1F1ZXVlOjpjbGVhcigpIHsKKyAgICBtUXVldWUuY2xlYXIoKTsKK30KKwordWludDMyX3QgU2ltcGxlQzJDb21wb25lbnQ6OldvcmtRdWV1ZTo6ZHJhaW5Nb2RlKCkgY29uc3QgeworICAgIHJldHVybiBtUXVldWUuZnJvbnQoKS5kcmFpbk1vZGU7Cit9CisKK3ZvaWQgU2ltcGxlQzJDb21wb25lbnQ6OldvcmtRdWV1ZTo6bWFya0RyYWluKHVpbnQzMl90IGRyYWluTW9kZSkgeworICAgIG1RdWV1ZS5wdXNoX2JhY2soeyBudWxscHRyLCBkcmFpbk1vZGUgfSk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1NpbXBsZUMyQ29tcG9uZW50OjpXb3JrSGFuZGxlcjo6V29ya0hhbmRsZXIoKSA6IG1SdW5uaW5nKGZhbHNlKSB7fQorCit2b2lkIFNpbXBsZUMyQ29tcG9uZW50OjpXb3JrSGFuZGxlcjo6c2V0Q29tcG9uZW50KAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8U2ltcGxlQzJDb21wb25lbnQ+ICZ0aGl6KSB7CisgICAgbVRoaXogPSB0aGl6OworfQorCitzdGF0aWMgdm9pZCBSZXBseShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgaW50MzJfdCAqZXJyID0gbnVsbHB0cikgeworICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlkOworICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SWQpKTsKKyAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2U7CisgICAgaWYgKGVycikgeworICAgICAgICByZXBseS0+c2V0SW50MzIoImVyciIsICplcnIpOworICAgIH0KKyAgICByZXBseS0+cG9zdFJlcGx5KHJlcGx5SWQpOworfQorCit2b2lkIFNpbXBsZUMyQ29tcG9uZW50OjpXb3JrSGFuZGxlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2ltcGxlQzJDb21wb25lbnQ+IHRoaXogPSBtVGhpei5sb2NrKCk7CisgICAgaWYgKCF0aGl6KSB7CisgICAgICAgIEFMT0dEKCJjb21wb25lbnQgbm90IHlldCBzZXQ7IG1zZyA9ICVzIiwgbXNnLT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJZDsKKyAgICAgICAgaWYgKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SWQpKSB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXBseS0+c2V0SW50MzIoImVyciIsIEMyX0NPUlJVUFRFRCk7CisgICAgICAgICAgICByZXBseS0+cG9zdFJlcGx5KHJlcGx5SWQpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRQcm9jZXNzOiB7CisgICAgICAgICAgICBpZiAobVJ1bm5pbmcpIHsKKyAgICAgICAgICAgICAgICBpZiAodGhpei0+cHJvY2Vzc1F1ZXVlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFByb2Nlc3MsIHRoaXMpKS0+cG9zdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIklnbm9yZSBwcm9jZXNzIG1lc3NhZ2UgYXMgd2UncmUgbm90IHJ1bm5pbmciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRJbml0OiB7CisgICAgICAgICAgICBpbnQzMl90IGVyciA9IHRoaXotPm9uSW5pdCgpOworICAgICAgICAgICAgUmVwbHkobXNnLCAmZXJyKTsKKyAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0U3RhcnQ6IHsKKyAgICAgICAgICAgIG1SdW5uaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRTdG9wOiB7CisgICAgICAgICAgICBpbnQzMl90IGVyciA9IHRoaXotPm9uU3RvcCgpOworICAgICAgICAgICAgUmVwbHkobXNnLCAmZXJyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRSZXNldDogeworICAgICAgICAgICAgdGhpei0+b25SZXNldCgpOworICAgICAgICAgICAgbVJ1bm5pbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIFJlcGx5KG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0UmVsZWFzZTogeworICAgICAgICAgICAgdGhpei0+b25SZWxlYXNlKCk7CisgICAgICAgICAgICBtUnVubmluZyA9IGZhbHNlOworICAgICAgICAgICAgUmVwbHkobXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIEFMT0dEKCJVbnJlY29nbml6ZWQgbXNnOiAlZCIsIG1zZy0+d2hhdCgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitjbGFzcyBTaW1wbGVDMkNvbXBvbmVudDo6QmxvY2tpbmdCbG9ja1Bvb2wgOiBwdWJsaWMgQzJCbG9ja1Bvb2wgeworcHVibGljOgorICAgIEJsb2NraW5nQmxvY2tQb29sKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIGJhc2UpOiBtQmFzZXtiYXNlfSB7fQorCisgICAgdmlydHVhbCBsb2NhbF9pZF90IGdldExvY2FsSWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtQmFzZS0+Z2V0TG9jYWxJZCgpOworICAgIH0KKworICAgIHZpcnR1YWwgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtQmFzZS0+Z2V0QWxsb2NhdG9ySWQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4qIGJsb2NrKSB7CisgICAgICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICAgICAgZG8geworICAgICAgICAgICAgc3RhdHVzID0gbUJhc2UtPmZldGNoTGluZWFyQmxvY2soY2FwYWNpdHksIHVzYWdlLCBibG9jayk7CisgICAgICAgIH0gd2hpbGUgKHN0YXR1cyA9PSBDMl9USU1FRF9PVVQpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hDaXJjdWxhckJsb2NrKAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHksCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ2lyY3VsYXJCbG9jaz4qIGJsb2NrKSB7CisgICAgICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICAgICAgZG8geworICAgICAgICAgICAgc3RhdHVzID0gbUJhc2UtPmZldGNoQ2lyY3VsYXJCbG9jayhjYXBhY2l0eSwgdXNhZ2UsIGJsb2NrKTsKKyAgICAgICAgfSB3aGlsZSAoc3RhdHVzID09IEMyX1RJTUVEX09VVCk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+KiBibG9jaykgeworICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1CYXNlLT5mZXRjaEdyYXBoaWNCbG9jayh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrKTsKKyAgICAgICAgfSB3aGlsZSAoc3RhdHVzID09IEMyX1RJTUVEX09VVCk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gbUJhc2U7Cit9OworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCituYW1lc3BhY2UgeworCitzdHJ1Y3QgRHVtbXlSZWFkVmlldyA6IHB1YmxpYyBDMlJlYWRWaWV3IHsKKyAgICBEdW1teVJlYWRWaWV3KCkgOiBDMlJlYWRWaWV3KEMyX05PX0lOSVQpIHt9Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworU2ltcGxlQzJDb21wb25lbnQ6OlNpbXBsZUMyQ29tcG9uZW50KAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICZpbnRmKQorICAgIDogbUR1bW15UmVhZFZpZXcoRHVtbXlSZWFkVmlldygpKSwKKyAgICAgIG1JbnRmKGludGYpLAorICAgICAgbUxvb3BlcihuZXcgQUxvb3BlciksCisgICAgICBtSGFuZGxlcihuZXcgV29ya0hhbmRsZXIpIHsKKyAgICBtTG9vcGVyLT5zZXROYW1lKGludGYtPmdldE5hbWUoKS5jX3N0cigpKTsKKyAgICAodm9pZCltTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXIpOworICAgIG1Mb29wZXItPnN0YXJ0KGZhbHNlLCBmYWxzZSwgQU5EUk9JRF9QUklPUklUWV9WSURFTyk7Cit9CisKK1NpbXBsZUMyQ29tcG9uZW50Ojp+U2ltcGxlQzJDb21wb25lbnQoKSB7CisgICAgbUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXItPmlkKCkpOworICAgICh2b2lkKW1Mb29wZXItPnN0b3AoKTsKK30KKworYzJfc3RhdHVzX3QgU2ltcGxlQzJDb21wb25lbnQ6OnNldExpc3RlbmVyX3ZiKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiAmbGlzdGVuZXIsIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIHsKKyAgICBtSGFuZGxlci0+c2V0Q29tcG9uZW50KHNoYXJlZF9mcm9tX3RoaXMoKSk7CisKKyAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICBpZiAoc3RhdGUtPm1TdGF0ZSA9PSBSVU5OSU5HKSB7CisgICAgICAgIGlmIChsaXN0ZW5lcikgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9TVEFURTsKKyAgICAgICAgfSBlbHNlIGlmICghbWF5QmxvY2spIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9CTE9DS0lORzsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdGF0ZS0+bUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgLy8gVE9ETzogd2FpdCBmb3IgbGlzdGVuZXIgY2hhbmdlIHRvIGhhdmUgdGFrZW4gcGxhY2UgYmVmb3JlIHJldHVybmluZworICAgIC8vIChlLmcuIGlmIHRoZXJlIGlzIGFuIG9uZ29pbmcgbGlzdGVuZXIgY2FsbGJhY2spCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6cXVldWVfbmIoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAqIGNvbnN0IGl0ZW1zKSB7CisgICAgeworICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5tU3RhdGUgIT0gUlVOTklORykgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9TVEFURTsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIHF1ZXVlV2FzRW1wdHkgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8V29ya1F1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1Xb3JrUXVldWUpOworICAgICAgICBxdWV1ZVdhc0VtcHR5ID0gcXVldWUtPmVtcHR5KCk7CisgICAgICAgIHdoaWxlICghaXRlbXMtPmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHF1ZXVlLT5wdXNoX2JhY2soc3RkOjptb3ZlKGl0ZW1zLT5mcm9udCgpKSk7CisgICAgICAgICAgICBpdGVtcy0+cG9wX2Zyb250KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHF1ZXVlV2FzRW1wdHkpIHsKKyAgICAgICAgKG5ldyBBTWVzc2FnZShXb3JrSGFuZGxlcjo6a1doYXRQcm9jZXNzLCBtSGFuZGxlcikpLT5wb3N0KCk7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgU2ltcGxlQzJDb21wb25lbnQ6OmFubm91bmNlX25iKGNvbnN0IHN0ZDo6dmVjdG9yPEMyV29ya091dGxpbmU+ICZpdGVtcykgeworICAgICh2b2lkKWl0ZW1zOworICAgIHJldHVybiBDMl9PTUlUVEVEOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6Zmx1c2hfc20oCisgICAgICAgIGZsdXNoX21vZGVfdCBmbHVzaE1vZGUsIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGZsdXNoZWRXb3JrKSB7CisgICAgKHZvaWQpZmx1c2hNb2RlOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+bVN0YXRlICE9IFJVTk5JTkcpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfU1RBVEU7CisgICAgICAgIH0KKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPFdvcmtRdWV1ZT46OkxvY2tlZCBxdWV1ZShtV29ya1F1ZXVlKTsKKyAgICAgICAgcXVldWUtPmluY0dlbmVyYXRpb24oKTsKKyAgICAgICAgLy8gVE9ETzogcXVldWUtPnNwbGljZWRCeShmbHVzaGVkV29yaywgZmx1c2hlZFdvcmstPmVuZCgpKTsKKyAgICAgICAgd2hpbGUgKCFxdWV1ZS0+ZW1wdHkoKSkgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yayA9IHF1ZXVlLT5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgIGlmICh3b3JrKSB7CisgICAgICAgICAgICAgICAgZmx1c2hlZFdvcmstPnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXhlZDxQZW5kaW5nV29yaz46OkxvY2tlZCBwZW5kaW5nKG1QZW5kaW5nV29yayk7CisgICAgICAgIHdoaWxlICghcGVuZGluZy0+ZW1wdHkoKSkgeworICAgICAgICAgICAgZmx1c2hlZFdvcmstPnB1c2hfYmFjayhzdGQ6Om1vdmUocGVuZGluZy0+YmVnaW4oKS0+c2Vjb25kKSk7CisgICAgICAgICAgICBwZW5kaW5nLT5lcmFzZShwZW5kaW5nLT5iZWdpbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgU2ltcGxlQzJDb21wb25lbnQ6OmRyYWluX25iKGRyYWluX21vZGVfdCBkcmFpbk1vZGUpIHsKKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPm1TdGF0ZSAhPSBSVU5OSU5HKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1NUQVRFOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgcXVldWVXYXNFbXB0eSA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxXb3JrUXVldWU+OjpMb2NrZWQgcXVldWUobVdvcmtRdWV1ZSk7CisgICAgICAgIHF1ZXVlV2FzRW1wdHkgPSBxdWV1ZS0+ZW1wdHkoKTsKKyAgICAgICAgcXVldWUtPm1hcmtEcmFpbihkcmFpbk1vZGUpOworICAgIH0KKyAgICBpZiAocXVldWVXYXNFbXB0eSkgeworICAgICAgICAobmV3IEFNZXNzYWdlKFdvcmtIYW5kbGVyOjprV2hhdFByb2Nlc3MsIG1IYW5kbGVyKSktPnBvc3QoKTsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IFNpbXBsZUMyQ29tcG9uZW50OjpzdGFydCgpIHsKKyAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICBpZiAoc3RhdGUtPm1TdGF0ZSA9PSBSVU5OSU5HKSB7CisgICAgICAgIHJldHVybiBDMl9CQURfU1RBVEU7CisgICAgfQorICAgIGJvb2wgbmVlZHNJbml0ID0gKHN0YXRlLT5tU3RhdGUgPT0gVU5JTklUSUFMSVpFRCk7CisgICAgc3RhdGUudW5sb2NrKCk7CisgICAgaWYgKG5lZWRzSW5pdCkgeworICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHk7CisgICAgICAgIChuZXcgQU1lc3NhZ2UoV29ya0hhbmRsZXI6OmtXaGF0SW5pdCwgbUhhbmRsZXIpKS0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlcGx5KTsKKyAgICAgICAgaW50MzJfdCBlcnI7CisgICAgICAgIENIRUNLKHJlcGx5LT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIChjMl9zdGF0dXNfdCllcnI7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAobmV3IEFNZXNzYWdlKFdvcmtIYW5kbGVyOjprV2hhdFN0YXJ0LCBtSGFuZGxlcikpLT5wb3N0KCk7CisgICAgfQorICAgIHN0YXRlLmxvY2soKTsKKyAgICBzdGF0ZS0+bVN0YXRlID0gUlVOTklORzsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IFNpbXBsZUMyQ29tcG9uZW50OjpzdG9wKCkgeworICAgIEFMT0dWKCJzdG9wIik7CisgICAgeworICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5tU3RhdGUgIT0gUlVOTklORykgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9TVEFURTsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+bVN0YXRlID0gU1RPUFBFRDsKKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPFdvcmtRdWV1ZT46OkxvY2tlZCBxdWV1ZShtV29ya1F1ZXVlKTsKKyAgICAgICAgcXVldWUtPmNsZWFyKCk7CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXhlZDxQZW5kaW5nV29yaz46OkxvY2tlZCBwZW5kaW5nKG1QZW5kaW5nV29yayk7CisgICAgICAgIHBlbmRpbmctPmNsZWFyKCk7CisgICAgfQorICAgIHNwPEFNZXNzYWdlPiByZXBseTsKKyAgICAobmV3IEFNZXNzYWdlKFdvcmtIYW5kbGVyOjprV2hhdFN0b3AsIG1IYW5kbGVyKSktPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXBseSk7CisgICAgaW50MzJfdCBlcnI7CisgICAgQ0hFQ0socmVwbHktPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIChjMl9zdGF0dXNfdCllcnI7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgU2ltcGxlQzJDb21wb25lbnQ6OnJlc2V0KCkgeworICAgIEFMT0dWKCJyZXNldCIpOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgIHN0YXRlLT5tU3RhdGUgPSBVTklOSVRJQUxJWkVEOworICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8V29ya1F1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1Xb3JrUXVldWUpOworICAgICAgICBxdWV1ZS0+Y2xlYXIoKTsKKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPFBlbmRpbmdXb3JrPjo6TG9ja2VkIHBlbmRpbmcobVBlbmRpbmdXb3JrKTsKKyAgICAgICAgcGVuZGluZy0+Y2xlYXIoKTsKKyAgICB9CisgICAgc3A8QU1lc3NhZ2U+IHJlcGx5OworICAgIChuZXcgQU1lc3NhZ2UoV29ya0hhbmRsZXI6OmtXaGF0UmVzZXQsIG1IYW5kbGVyKSktPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXBseSk7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6cmVsZWFzZSgpIHsKKyAgICBBTE9HVigicmVsZWFzZSIpOworICAgIHNwPEFNZXNzYWdlPiByZXBseTsKKyAgICAobmV3IEFNZXNzYWdlKFdvcmtIYW5kbGVyOjprV2hhdFJlbGVhc2UsIG1IYW5kbGVyKSktPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXBseSk7CisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IFNpbXBsZUMyQ29tcG9uZW50OjppbnRmKCkgeworICAgIHJldHVybiBtSW50ZjsKK30KKworbmFtZXNwYWNlIHsKKworc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiB2ZWMoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHJldDsKKyAgICByZXQucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK3ZvaWQgU2ltcGxlQzJDb21wb25lbnQ6OmZpbmlzaCgKKyAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCwgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICYpPiBmaWxsV29yaykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgeworICAgICAgICBNdXRleGVkPFBlbmRpbmdXb3JrPjo6TG9ja2VkIHBlbmRpbmcobVBlbmRpbmdXb3JrKTsKKyAgICAgICAgaWYgKHBlbmRpbmctPmNvdW50KGZyYW1lSW5kZXgpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJ1bmtub3duIGZyYW1lIGluZGV4OiAlIiBQUkl1NjQsIGZyYW1lSW5kZXgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHdvcmsgPSBzdGQ6Om1vdmUocGVuZGluZy0+YXQoZnJhbWVJbmRleCkpOworICAgICAgICBwZW5kaW5nLT5lcmFzZShmcmFtZUluZGV4KTsKKyAgICB9CisgICAgaWYgKHdvcmspIHsKKyAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+IGxpc3RlbmVyID0gbUV4ZWNTdGF0ZS5sb2NrKCktPm1MaXN0ZW5lcjsKKyAgICAgICAgbGlzdGVuZXItPm9uV29ya0RvbmVfbmIoc2hhcmVkX2Zyb21fdGhpcygpLCB2ZWMod29yaykpOworICAgICAgICBBTE9HVigicmV0dXJuaW5nIHBlbmRpbmcgd29yayIpOworICAgIH0KK30KKwordm9pZCBTaW1wbGVDMkNvbXBvbmVudDo6Y2xvbmVBbmRTZW5kKAorICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmY3VycmVudFdvcmssCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmKT4gZmlsbFdvcmspIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrKG5ldyBDMldvcmspOworICAgIGlmIChjdXJyZW50V29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID09IGZyYW1lSW5kZXgpIHsKKyAgICAgICAgd29yay0+aW5wdXQuZmxhZ3MgPSBjdXJyZW50V29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwgPSBjdXJyZW50V29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB9IGVsc2UgeworICAgICAgICBNdXRleGVkPFBlbmRpbmdXb3JrPjo6TG9ja2VkIHBlbmRpbmcobVBlbmRpbmdXb3JrKTsKKyAgICAgICAgaWYgKHBlbmRpbmctPmNvdW50KGZyYW1lSW5kZXgpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJ1bmtub3duIGZyYW1lIGluZGV4OiAlIiBQUkl1NjQsIGZyYW1lSW5kZXgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHdvcmstPmlucHV0LmZsYWdzID0gcGVuZGluZy0+YXQoZnJhbWVJbmRleCktPmlucHV0LmZsYWdzOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsID0gcGVuZGluZy0+YXQoZnJhbWVJbmRleCktPmlucHV0Lm9yZGluYWw7CisgICAgfQorICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKyAgICBpZiAod29yaykgeworICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXIgPSBtRXhlY1N0YXRlLmxvY2soKS0+bUxpc3RlbmVyOworICAgICAgICBsaXN0ZW5lci0+b25Xb3JrRG9uZV9uYihzaGFyZWRfZnJvbV90aGlzKCksIHZlYyh3b3JrKSk7CisgICAgICAgIEFMT0dWKCJjbG9uZWQgYW5kIHNlbmRpbmcgd29yayIpOworICAgIH0KK30KKworYm9vbCBTaW1wbGVDMkNvbXBvbmVudDo6cHJvY2Vzc1F1ZXVlKCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgdWludDY0X3QgZ2VuZXJhdGlvbjsKKyAgICBpbnQzMl90IGRyYWluTW9kZTsKKyAgICBib29sIGlzRmx1c2hQZW5kaW5nID0gZmFsc2U7CisgICAgYm9vbCBoYXNRdWV1ZWRXb3JrID0gZmFsc2U7CisgICAgeworICAgICAgICBNdXRleGVkPFdvcmtRdWV1ZT46OkxvY2tlZCBxdWV1ZShtV29ya1F1ZXVlKTsKKyAgICAgICAgaWYgKHF1ZXVlLT5lbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBnZW5lcmF0aW9uID0gcXVldWUtPmdlbmVyYXRpb24oKTsKKyAgICAgICAgZHJhaW5Nb2RlID0gcXVldWUtPmRyYWluTW9kZSgpOworICAgICAgICBpc0ZsdXNoUGVuZGluZyA9IHF1ZXVlLT5wb3BQZW5kaW5nRmx1c2goKTsKKyAgICAgICAgd29yayA9IHF1ZXVlLT5wb3BfZnJvbnQoKTsKKyAgICAgICAgaGFzUXVldWVkV29yayA9ICFxdWV1ZS0+ZW1wdHkoKTsKKyAgICB9CisgICAgaWYgKGlzRmx1c2hQZW5kaW5nKSB7CisgICAgICAgIEFMT0dWKCJwcm9jZXNzaW5nIHBlbmRpbmcgZmx1c2giKTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gb25GbHVzaF9zbSgpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRCgiZmx1c2ggZXJyOiAlZCIsIGVycik7CisgICAgICAgICAgICAvLyBUT0RPOiBlcnJvcgorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFtT3V0cHV0QmxvY2tQb29sKSB7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IFt0aGlzXSB7CisgICAgICAgICAgICAvLyBUT0RPOiBkb24ndCB1c2UgcXVlcnlfdmIKKyAgICAgICAgICAgIEMyU3RyZWFtRm9ybWF0Q29uZmlnOjpvdXRwdXQgb3V0cHV0Rm9ybWF0KDB1KTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gaW50ZigpLT5xdWVyeV92YigKKyAgICAgICAgICAgICAgICAgICAgeyAmb3V0cHV0Rm9ybWF0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgQzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFIH0sCisgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICZwYXJhbXMpOworICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSyAmJiBlcnIgIT0gQzJfQkFEX0lOREVYKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoInF1ZXJ5IGVyciA9ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgcG9vbElkID0KKyAgICAgICAgICAgICAgICBvdXRwdXRGb3JtYXQudmFsdWUgPT0gQzJGb3JtYXRWaWRlbworICAgICAgICAgICAgICAgICAgICAgICAgPyBDMkJsb2NrUG9vbDo6QkFTSUNfR1JBUEhJQworICAgICAgICAgICAgICAgICAgICAgICAgOiBDMkJsb2NrUG9vbDo6QkFTSUNfTElORUFSOworICAgICAgICAgICAgaWYgKHBhcmFtcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQgKm91dHB1dFBvb2xzID0KKyAgICAgICAgICAgICAgICAgICAgQzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0OjpGcm9tKHBhcmFtc1swXS5nZXQoKSk7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dFBvb2xzICYmIG91dHB1dFBvb2xzLT5mbGV4Q291bnQoKSA+PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHBvb2xJZCA9IG91dHB1dFBvb2xzLT5tLnZhbHVlc1swXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gYmxvY2tQb29sOworICAgICAgICAgICAgZXJyID0gR2V0Q29kZWMyQmxvY2tQb29sKHBvb2xJZCwgc2hhcmVkX2Zyb21fdGhpcygpLCAmYmxvY2tQb29sKTsKKyAgICAgICAgICAgIEFMT0dEKCJVc2luZyBvdXRwdXQgYmxvY2sgcG9vbCB3aXRoIHBvb2xJRCAlbGx1ID0+IGdvdCAlbGx1IC0gJWQiLAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBvb2xJZCwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tQb29sID8gYmxvY2tQb29sLT5nZXRMb2NhbElkKCkgOiAxMTEwMDAxMTEpLAorICAgICAgICAgICAgICAgICAgICBlcnIpOworICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgIG1PdXRwdXRCbG9ja1Bvb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPEJsb2NraW5nQmxvY2tQb29sPihibG9ja1Bvb2wpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfSgpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+IGxpc3RlbmVyID0gc3RhdGUtPm1MaXN0ZW5lcjsKKyAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgbGlzdGVuZXItPm9uRXJyb3JfbmIoc2hhcmVkX2Zyb21fdGhpcygpLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGhhc1F1ZXVlZFdvcms7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXdvcmspIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gZHJhaW4oZHJhaW5Nb2RlLCBtT3V0cHV0QmxvY2tQb29sKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IHN0YXRlLT5tTGlzdGVuZXI7CisgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vbkVycm9yX25iKHNoYXJlZF9mcm9tX3RoaXMoKSwgZXJyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaGFzUXVldWVkV29yazsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0gKj4gdXBkYXRlczsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnBhcmFtOiB3b3JrLT5pbnB1dC5jb25maWdVcGRhdGUpIHsKKyAgICAgICAgICAgIGlmIChwYXJhbSkgeworICAgICAgICAgICAgICAgIHVwZGF0ZXMuZW1wbGFjZV9iYWNrKHBhcmFtLmdldCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXVwZGF0ZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gaW50ZigpLT5jb25maWdfdmIodXBkYXRlcywgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgQUxPR0QoImFwcGxpZWQgJXp1IGNvbmZpZ1VwZGF0ZXMgPT4gJXMgKCVkKSIsIHVwZGF0ZXMuc2l6ZSgpLCBhc1N0cmluZyhlcnIpLCBlcnIpOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoInN0YXJ0IHByb2Nlc3NpbmcgZnJhbWUgIyUiIFBSSXU2NCwgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworICAgIC8vIElmIGlucHV0IGJ1ZmZlciBsaXN0IGlzIG5vdCBlbXB0eSwgaXQgbWVhbnMgd2UgaGF2ZSBzb21lIGlucHV0IHRvIHByb2Nlc3Mgb24uCisgICAgLy8gSG93ZXZlciwgaW5wdXQgY291bGQgYmUgYSBudWxsIGJ1ZmZlci4gSW4gc3VjaCBjYXNlLCBjbGVhciB0aGUgYnVmZmVyIGxpc3QKKyAgICAvLyBiZWZvcmUgbWFraW5nIGNhbGwgdG8gcHJvY2VzcygpLgorICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpICYmICF3b3JrLT5pbnB1dC5idWZmZXJzWzBdKSB7CisgICAgICAgIEFMT0dEKCJFbmNvdW50ZXJlZCBudWxsIGlucHV0IGJ1ZmZlci4gQ2xlYXJpbmcgdGhlIGlucHV0IGJ1ZmZlciIpOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgfQorICAgIHByb2Nlc3Mod29yaywgbU91dHB1dEJsb2NrUG9vbCk7CisgICAgQUxPR1YoInByb2Nlc3NlZCBmcmFtZSAjJSIgUFJJdTY0LCB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgeworICAgICAgICBNdXRleGVkPFdvcmtRdWV1ZT46OkxvY2tlZCBxdWV1ZShtV29ya1F1ZXVlKTsKKyAgICAgICAgaWYgKHF1ZXVlLT5nZW5lcmF0aW9uKCkgIT0gZ2VuZXJhdGlvbikgeworICAgICAgICAgICAgQUxPR0QoIndvcmsgZm9ybSBvbGQgZ2VuZXJhdGlvbjogd2FzICUiIFBSSXU2NCAiIG5vdyAlIiBQUkl1NjQsCisgICAgICAgICAgICAgICAgICAgIHF1ZXVlLT5nZW5lcmF0aW9uKCksIGdlbmVyYXRpb24pOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9UX0ZPVU5EOworICAgICAgICAgICAgcXVldWUudW5sb2NrKCk7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXIgPSBzdGF0ZS0+bUxpc3RlbmVyOworICAgICAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5vbldvcmtEb25lX25iKHNoYXJlZF9mcm9tX3RoaXMoKSwgdmVjKHdvcmspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHF1ZXVlLmxvY2soKTsKKyAgICAgICAgICAgIHJldHVybiBoYXNRdWV1ZWRXb3JrOworICAgICAgICB9CisgICAgfQorICAgIGlmICh3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCAhPSAwdSkgeworICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgQUxPR1YoInJldHVybmluZyB0aGlzIHdvcmsiKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXIgPSBzdGF0ZS0+bUxpc3RlbmVyOworICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgbGlzdGVuZXItPm9uV29ya0RvbmVfbmIoc2hhcmVkX2Zyb21fdGhpcygpLCB2ZWMod29yaykpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJxdWV1ZSBwZW5kaW5nIHdvcmsiKTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB1bmV4cGVjdGVkOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleGVkPFBlbmRpbmdXb3JrPjo6TG9ja2VkIHBlbmRpbmcobVBlbmRpbmdXb3JrKTsKKyAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgICAgIGlmIChwZW5kaW5nLT5jb3VudChmcmFtZUluZGV4KSAhPSAwKSB7CisgICAgICAgICAgICAgICAgdW5leHBlY3RlZCA9IHN0ZDo6bW92ZShwZW5kaW5nLT5hdChmcmFtZUluZGV4KSk7CisgICAgICAgICAgICAgICAgcGVuZGluZy0+ZXJhc2UoZnJhbWVJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAodm9pZClwZW5kaW5nLT5pbnNlcnQoeyBmcmFtZUluZGV4LCBzdGQ6Om1vdmUod29yaykgfSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVuZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgIEFMT0dEKCJ1bmV4cGVjdGVkIHBlbmRpbmcgd29yayIpOworICAgICAgICAgICAgdW5leHBlY3RlZC0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IHN0YXRlLT5tTGlzdGVuZXI7CisgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vbldvcmtEb25lX25iKHNoYXJlZF9mcm9tX3RoaXMoKSwgdmVjKHVuZXhwZWN0ZWQpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaGFzUXVldWVkV29yazsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBTaW1wbGVDMkNvbXBvbmVudDo6Y3JlYXRlTGluZWFyQnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrKSB7CisgICAgcmV0dXJuIGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgYmxvY2stPm9mZnNldCgpLCBibG9jay0+c2l6ZSgpKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBTaW1wbGVDMkNvbXBvbmVudDo6Y3JlYXRlTGluZWFyQnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIHJldHVybiBDMkJ1ZmZlcjo6Q3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLT5zaGFyZShvZmZzZXQsIHNpemUsIDo6QzJGZW5jZSgpKSk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gU2ltcGxlQzJDb21wb25lbnQ6OmNyZWF0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrKSB7CisgICAgcmV0dXJuIGNyZWF0ZUdyYXBoaWNCdWZmZXIoYmxvY2ssIEMyUmVjdChibG9jay0+d2lkdGgoKSwgYmxvY2stPmhlaWdodCgpKSk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gU2ltcGxlQzJDb21wb25lbnQ6OmNyZWF0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrLCBjb25zdCBDMlJlY3QgJmNyb3ApIHsKKyAgICByZXR1cm4gQzJCdWZmZXI6OkNyZWF0ZUdyYXBoaWNCdWZmZXIoYmxvY2stPnNoYXJlKGNyb3AsIDo6QzJGZW5jZSgpKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJJbnRlcmZhY2UuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9TaW1wbGVDMkludGVyZmFjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg0OWE0ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJJbnRlcmZhY2UuY3BwCkBAIC0wLDAgKzEsMzE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTaW1wbGVDMkludGVyZmFjZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworLy8gdXNlIE1lZGlhRGVmcyBoZXJlIHZzLiBNZWRpYUNvZGVjQ29uc3RhbnRzIGFzIHRoaXMgaXMgbm90IE1lZGlhQ29kZWMgc3BlY2lmaWMvZGVwZW5kZW50CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyogU2ltcGxlSW50ZXJmYWNlICovCisKK1NpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtczo6QmFzZVBhcmFtcygKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmcmVmbGVjdG9yLAorICAgICAgICBDMlN0cmluZyBuYW1lLAorICAgICAgICBDMkNvbXBvbmVudDo6a2luZF90IGtpbmQsCisgICAgICAgIEMyQ29tcG9uZW50Ojpkb21haW5fdCBkb21haW4sCisgICAgICAgIEMyU3RyaW5nIG1lZGlhVHlwZSwKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IGFsaWFzZXMpCisgICAgOiBDMkludGVyZmFjZUhlbHBlcihyZWZsZWN0b3IpIHsKKyAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtTmFtZSwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX05BTUUpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJDb21wb25lbnROYW1lU2V0dGluZz4obmFtZS5jX3N0cigpKSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGlmIChhbGlhc2VzLnNpemUoKSkgeworICAgICAgICBDMlN0cmluZyBqb2luZWQ7CisgICAgICAgIGZvciAoY29uc3QgQzJTdHJpbmcgJmFsaWFzIDogYWxpYXNlcykgeworICAgICAgICAgICAgaWYgKGpvaW5lZC5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAgIGpvaW5lZCArPSAiLCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBqb2luZWQgKz0gYWxpYXM7CisgICAgICAgIH0KKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BbGlhc2VzLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQUxJQVNFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJDb21wb25lbnRBbGlhc2VzU2V0dGluZz4oam9pbmVkLmNfc3RyKCkpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtS2luZCwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0tJTkQpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50S2luZFNldHRpbmcoa2luZCkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtRG9tYWluLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfRE9NQUlOKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudERvbWFpblNldHRpbmcoZG9tYWluKSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIC8vIHNpbXBsZSBpbnRlcmZhY2VzIGhhdmUgc2luZ2xlIHN0cmVhbXMKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRTdHJlYW1Db3VudCwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX0NPVU5UKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlBvcnRTdHJlYW1Db3VudFR1bmluZzo6aW5wdXQoMSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0U3RyZWFtQ291bnQsIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQ09VTlQpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUG9ydFN0cmVhbUNvdW50VHVuaW5nOjpvdXRwdXQoMSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAvLyBzZXQgdXAgYnVmZmVyIGZvcm1hdHMgYW5kIGFsbG9jYXRvcnMKKworICAgIC8vIGRlZmF1bHQgdG8gbGluZWFyIGJ1ZmZlcnMgYW5kIG5vIG1lZGlhIHR5cGUKKyAgICBDMkJ1ZmZlckRhdGE6OnR5cGVfdCByYXdCdWZmZXJUeXBlID0gQzJCdWZmZXJEYXRhOjpMSU5FQVI7CisgICAgQzJTdHJpbmcgcmF3TWVkaWFUeXBlOworICAgIEMyQWxsb2NhdG9yOjppZF90IHJhd0FsbG9jYXRvciA9IEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSOworICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IHJhd1Bvb2xJZCA9IEMyQmxvY2tQb29sOjpCQVNJQ19MSU5FQVI7CisgICAgQzJCdWZmZXJEYXRhOjp0eXBlX3QgY29kZWRCdWZmZXJUeXBlID0gQzJCdWZmZXJEYXRhOjpMSU5FQVI7CisgICAgQzJBbGxvY2F0b3I6OmlkX3QgY29kZWRBbGxvY2F0b3IgPSBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUjsKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBjb2RlZFBvb2xJZCA9IEMyQmxvY2tQb29sOjpCQVNJQ19MSU5FQVI7CisKKyAgICBzd2l0Y2ggKGRvbWFpbikgeworICAgICAgICBjYXNlIEMyQ29tcG9uZW50OjpET01BSU5fSU1BR0U6CisgICAgICAgIGNhc2UgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTzoKKyAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBkZWZpbmUgcmF3IGltYWdlPyBUaGUgb25seSBkaWZmZXJlbmNlIGlzIHRpbWVzdGFtcCBoYW5kbGluZworICAgICAgICAgICAgcmF3QnVmZmVyVHlwZSA9IEMyQnVmZmVyRGF0YTo6R1JBUEhJQzsKKyAgICAgICAgICAgIHJhd01lZGlhVHlwZSA9IE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVzsKKyAgICAgICAgICAgIHJhd0FsbG9jYXRvciA9IEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfR1JBUEhJQzsKKyAgICAgICAgICAgIHJhd1Bvb2xJZCA9IEMyQmxvY2tQb29sOjpCQVNJQ19HUkFQSElDOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTzoKKyAgICAgICAgICAgIHJhd0J1ZmZlclR5cGUgPSBDMkJ1ZmZlckRhdGE6OkxJTkVBUjsKKyAgICAgICAgICAgIHJhd01lZGlhVHlwZSA9IE1FRElBX01JTUVUWVBFX0FVRElPX1JBVzsKKyAgICAgICAgICAgIHJhd0FsbG9jYXRvciA9IEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSOworICAgICAgICAgICAgcmF3UG9vbElkID0gQzJCbG9ja1Bvb2w6OkJBU0lDX0xJTkVBUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGJvb2wgaXNFbmNvZGVyID0ga2luZCA9PSBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSOworCisgICAgLy8gaGFuZGxlIHJhdyBkZWNvZGVycworICAgIGlmIChtZWRpYVR5cGUgPT0gcmF3TWVkaWFUeXBlKSB7CisgICAgICAgIGNvZGVkQnVmZmVyVHlwZSA9IHJhd0J1ZmZlclR5cGU7CisgICAgICAgIGNvZGVkQWxsb2NhdG9yID0gcmF3QWxsb2NhdG9yOworICAgICAgICBjb2RlZFBvb2xJZCA9IHJhd1Bvb2xJZDsKKyAgICB9CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgIDB1LCBpc0VuY29kZXIgPyByYXdCdWZmZXJUeXBlIDogY29kZWRCdWZmZXJUeXBlKSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgIGlzRW5jb2RlciA/IHJhd01lZGlhVHlwZSA6IG1lZGlhVHlwZSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgIDB1LCBpc0VuY29kZXIgPyBjb2RlZEJ1ZmZlclR5cGUgOiByYXdCdWZmZXJUeXBlKSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX09VVFBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgIGlzRW5jb2RlciA/IG1lZGlhVHlwZSA6IHJhd01lZGlhVHlwZSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBDMkFsbG9jYXRvcjo6aWRfdCBpbnB1dEFsbG9jYXRvcnNbMV0gPSB7IGlzRW5jb2RlciA/IHJhd0FsbG9jYXRvciA6IGNvZGVkQWxsb2NhdG9yIH07CisgICAgQzJBbGxvY2F0b3I6OmlkX3Qgb3V0cHV0QWxsb2NhdG9yc1sxXSA9IHsgaXNFbmNvZGVyID8gY29kZWRBbGxvY2F0b3IgOiByYXdBbGxvY2F0b3IgfTsKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBvdXRwdXRQb29sSWRzWzFdID0geyBpc0VuY29kZXIgPyBjb2RlZFBvb2xJZCA6IHJhd1Bvb2xJZCB9OworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0QWxsb2NhdG9ycywgQzJfUEFSQU1LRVlfSU5QVVRfQUxMT0NBVE9SUykKKyAgICAgICAgICAgIC53aXRoRGVmYXVsdChDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjppbnB1dDo6QWxsb2NTaGFyZWQoaW5wdXRBbGxvY2F0b3JzKSkKKyAgICAgICAgICAgIC53aXRoRmllbGRzKHsgQzJGKG1JbnB1dEFsbG9jYXRvcnMsIG0udmFsdWVzWzBdKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1JbnB1dEFsbG9jYXRvcnMsIG0udmFsdWVzKS5pblJhbmdlKDAsIDEpIH0pCisgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8QzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQ+OjpOb25TdHJpY3RWYWx1ZXNXaXRoTm9EZXBzKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEFsbG9jYXRvcnMsIEMyX1BBUkFNS0VZX09VVFBVVF9BTExPQ0FUT1JTKQorICAgICAgICAgICAgLndpdGhEZWZhdWx0KEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6Om91dHB1dDo6QWxsb2NTaGFyZWQob3V0cHV0QWxsb2NhdG9ycykpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7IEMyRihtT3V0cHV0QWxsb2NhdG9ycywgbS52YWx1ZXNbMF0pLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobU91dHB1dEFsbG9jYXRvcnMsIG0udmFsdWVzKS5pblJhbmdlKDAsIDEpIH0pCisgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8QzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6b3V0cHV0Pjo6Tm9uU3RyaWN0VmFsdWVzV2l0aE5vRGVwcykKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRQb29sSWRzLCBDMl9QQVJBTUtFWV9PVVRQVVRfQkxPQ0tfUE9PTFMpCisgICAgICAgICAgICAud2l0aERlZmF1bHQoQzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0OjpBbGxvY1NoYXJlZChvdXRwdXRQb29sSWRzKSkKKyAgICAgICAgICAgIC53aXRoRmllbGRzKHsgQzJGKG1PdXRwdXRQb29sSWRzLCBtLnZhbHVlc1swXSkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtT3V0cHV0UG9vbElkcywgbS52YWx1ZXMpLmluUmFuZ2UoMCwgMSkgfSkKKyAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQ+OjpOb25TdHJpY3RWYWx1ZXNXaXRoTm9EZXBzKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgLy8gYWRkIHN0YXRlbGVzcyBwYXJhbXMKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtU3Vic2NyaWJlZFBhcmFtSW5kaWNlcywgQzJfUEFSQU1LRVlfU1VCU0NSSUJFRF9QQVJBTV9JTkRJQ0VTKQorICAgICAgICAgICAgLndpdGhEZWZhdWx0KEMyU3Vic2NyaWJlZFBhcmFtSW5kaWNlc1R1bmluZzo6QWxsb2NTaGFyZWQoMHUpKQorICAgICAgICAgICAgLndpdGhGaWVsZHMoeyBDMkYobVN1YnNjcmliZWRQYXJhbUluZGljZXMsIG0udmFsdWVzWzBdKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1TdWJzY3JpYmVkUGFyYW1JbmRpY2VzLCBtLnZhbHVlcykuYW55KCkgfSkKKyAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxDMlN1YnNjcmliZWRQYXJhbUluZGljZXNUdW5pbmc+OjpOb25TdHJpY3RWYWx1ZXNXaXRoTm9EZXBzKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgLyogVE9ETworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUN1cnJlbnRXb3JrT3JkaW5hbCwgQzJfUEFSQU1LRVlfQ1VSUkVOVF9XT1JLKQorICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMkN1cnJlbnRXb3JrVHVuaW5nKCkpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7IEMyRihtQ3VycmVudFdvcmtPcmRpbmFsLCBtLnRpbWVTdGFtcCkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtQ3VycmVudFdvcmtPcmRpbmFsLCBtLmZyYW1lSW5kZXgpLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobUN1cnJlbnRXb3JrT3JkaW5hbCwgbS5jdXN0b21PcmRpbmFsKS5hbnkoKSB9KQorICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPEMyQ3VycmVudFdvcmtUdW5pbmc+OjpOb25TdHJpY3RWYWx1ZXNXaXRoTm9EZXBzKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUxhc3RJbnB1dFF1ZXVlZFdvcmtPcmRpbmFsLCBDMl9QQVJBTUtFWV9MQVNUX0lOUFVUX1FVRVVFRCkKKyAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJMYXN0V29ya1F1ZXVlZFR1bmluZzo6aW5wdXQoKSkKKyAgICAgICAgICAgIC53aXRoRmllbGRzKHsgQzJGKG1MYXN0SW5wdXRRdWV1ZWRXb3JrT3JkaW5hbCwgbS50aW1lU3RhbXApLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobUxhc3RJbnB1dFF1ZXVlZFdvcmtPcmRpbmFsLCBtLmZyYW1lSW5kZXgpLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobUxhc3RJbnB1dFF1ZXVlZFdvcmtPcmRpbmFsLCBtLmN1c3RvbU9yZGluYWwpLmFueSgpIH0pCisgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8QzJMYXN0V29ya1F1ZXVlZFR1bmluZzo6aW5wdXQ+OjpOb25TdHJpY3RWYWx1ZXNXaXRoTm9EZXBzKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUxhc3RPdXRwdXRRdWV1ZWRXb3JrT3JkaW5hbCwgQzJfUEFSQU1LRVlfTEFTVF9PVVRQVVRfUVVFVUVEKQorICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMkxhc3RXb3JrUXVldWVkVHVuaW5nOjpvdXRwdXQoKSkKKyAgICAgICAgICAgIC53aXRoRmllbGRzKHsgQzJGKG1MYXN0T3V0cHV0UXVldWVkV29ya09yZGluYWwsIG0udGltZVN0YW1wKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1MYXN0T3V0cHV0UXVldWVkV29ya09yZGluYWwsIG0uZnJhbWVJbmRleCkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtTGFzdE91dHB1dFF1ZXVlZFdvcmtPcmRpbmFsLCBtLmN1c3RvbU9yZGluYWwpLmFueSgpIH0pCisgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8QzJMYXN0V29ya1F1ZXVlZFR1bmluZzo6b3V0cHV0Pjo6Tm9uU3RyaWN0VmFsdWVzV2l0aE5vRGVwcykKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk91dE9mTWVtb3J5VHVuaW5nPiBtT3V0T2ZNZW1vcnk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0Q29uZmlnQ291bnRlclR1bmluZzo6aW5wdXQ+IG1JbnB1dENvbmZpZ0NvdW50ZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydENvbmZpZ0NvdW50ZXJUdW5pbmc6Om91dHB1dD4gbU91dHB1dENvbmZpZ0NvdW50ZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29uZmlnQ291bnRlclR1bmluZz4gbURpcmVjdENvbmZpZ0NvdW50ZXI7CisKKyAgICAqLworfQorCit2b2lkIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtczo6bm9JbnB1dExhdGVuY3koKSB7CisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVJlcXVlc3RlZElucHV0RGVsYXksIEMyX1BBUkFNS0VZX0lOUFVUX0RFTEFZX1JFUVVFU1QpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUG9ydFJlcXVlc3RlZERlbGF5VHVuaW5nOjppbnB1dCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWN0dWFsSW5wdXREZWxheSwgQzJfUEFSQU1LRVlfSU5QVVRfREVMQVkpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjppbnB1dCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7Cit9CisKK3ZvaWQgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zOjpub091dHB1dExhdGVuY3koKSB7CisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVJlcXVlc3RlZE91dHB1dERlbGF5LCBDMl9QQVJBTUtFWV9PVVRQVVRfREVMQVlfUkVRVUVTVCkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJQb3J0UmVxdWVzdGVkRGVsYXlUdW5pbmc6Om91dHB1dCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWN0dWFsT3V0cHV0RGVsYXksIEMyX1BBUkFNS0VZX09VVFBVVF9ERUxBWSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6Om91dHB1dCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7Cit9CisKK3ZvaWQgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zOjpub1BpcGVsaW5lTGF0ZW5jeSgpIHsKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtUmVxdWVzdGVkUGlwZWxpbmVEZWxheSwgQzJfUEFSQU1LRVlfUElQRUxJTkVfREVMQVlfUkVRVUVTVCkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJSZXF1ZXN0ZWRQaXBlbGluZURlbGF5VHVuaW5nKDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1BY3R1YWxQaXBlbGluZURlbGF5LCBDMl9QQVJBTUtFWV9QSVBFTElORV9ERUxBWSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJBY3R1YWxQaXBlbGluZURlbGF5VHVuaW5nKDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKK30KKwordm9pZCBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXM6Om5vUHJpdmF0ZUJ1ZmZlcnMoKSB7CisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByaXZhdGVBbGxvY2F0b3JzLCBDMl9QQVJBTUtFWV9QUklWQVRFX0FMTE9DQVRPUlMpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQzJQcml2YXRlQWxsb2NhdG9yc1R1bmluZzo6QWxsb2NTaGFyZWQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heFByaXZhdGVCdWZmZXJDb3VudCwgQzJfUEFSQU1LRVlfTUFYX1BSSVZBVEVfQlVGRkVSX0NPVU5UKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEMyTWF4UHJpdmF0ZUJ1ZmZlckNvdW50VHVuaW5nOjpBbGxvY1NoYXJlZCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJpdmF0ZVBvb2xJZHMsIEMyX1BBUkFNS0VZX1BSSVZBVEVfQkxPQ0tfUE9PTFMpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQzJQcml2YXRlQmxvY2tQb29sc1R1bmluZzo6QWxsb2NTaGFyZWQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworfQorCit2b2lkIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtczo6bm9JbnB1dFJlZmVyZW5jZXMoKSB7CisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heElucHV0UmVmZXJlbmNlQWdlLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfUkVGRVJFTkNFX0FHRSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhSZWZlcmVuY2VBZ2VUdW5pbmc6OmlucHV0KDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhJbnB1dFJlZmVyZW5jZUNvdW50LCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfUkVGRVJFTkNFX0NPVU5UKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heFJlZmVyZW5jZUNvdW50VHVuaW5nOjppbnB1dCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7Cit9CisKK3ZvaWQgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zOjpub091dHB1dFJlZmVyZW5jZXMoKSB7CisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heE91dHB1dFJlZmVyZW5jZUFnZSwgQzJfUEFSQU1LRVlfT1VUUFVUX01BWF9SRUZFUkVOQ0VfQUdFKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heFJlZmVyZW5jZUFnZVR1bmluZzo6b3V0cHV0KDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhPdXRwdXRSZWZlcmVuY2VDb3VudCwgQzJfUEFSQU1LRVlfT1VUUFVUX01BWF9SRUZFUkVOQ0VfQ09VTlQpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4UmVmZXJlbmNlQ291bnRUdW5pbmc6Om91dHB1dCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7Cit9CisKK3ZvaWQgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zOjpub1RpbWVTdHJldGNoKCkgeworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1UaW1lU3RyZXRjaCwgQzJfUEFSQU1LRVlfVElNRV9TVFJFVENIKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudFRpbWVTdHJldGNoVHVuaW5nKDEuZikpCisgICAgICAgICAgICAuYnVpbGQoKSk7Cit9CisKKy8qCisgICAgQ2xpZW50cyBuZWVkIHRvIGhhbmRsZSB0aGUgZm9sbG93aW5nIGJhc2UgcGFyYW1zIGR1ZSB0byBjdXN0b20gZGVwZW5kZW5jeS4KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFwaUxldmVsU2V0dGluZz4gbUFwaUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFwaUZlYXR1cmVzU2V0dGluZz4gbUFwaUZlYXR1cmVzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nPiBtQXR0cmliOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydFN1Z2dlc3RlZEJ1ZmZlckNvdW50VHVuaW5nOjppbnB1dD4gbVN1Z2dlc3RlZElucHV0QnVmZmVyQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydFN1Z2dlc3RlZEJ1ZmZlckNvdW50VHVuaW5nOjpvdXRwdXQ+IG1TdWdnZXN0ZWRPdXRwdXRCdWZmZXJDb3VudDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlRyaXBwZWRUdW5pbmc+IG1UcmlwcGVkOworCisqLworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL2luY2x1ZGUvU2ltcGxlQzJDb21wb25lbnQuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvaW5jbHVkZS9TaW1wbGVDMkNvbXBvbmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMDI5YTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL2luY2x1ZGUvU2ltcGxlQzJDb21wb25lbnQuaApAQCAtMCwwICsxLDI0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU0lNUExFX0MyX0NPTVBPTkVOVF9IXworI2RlZmluZSBTSU1QTEVfQzJfQ09NUE9ORU5UX0hfCisKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTXV0ZXhlZC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFNpbXBsZUMyQ29tcG9uZW50CisgICAgICAgIDogcHVibGljIEMyQ29tcG9uZW50LCBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxTaW1wbGVDMkNvbXBvbmVudD4geworcHVibGljOgorICAgIGV4cGxpY2l0IFNpbXBsZUMyQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAmaW50Zik7CisgICAgdmlydHVhbCB+U2ltcGxlQzJDb21wb25lbnQoKTsKKworICAgIC8vIEMyQ29tcG9uZW50CisgICAgLy8gRnJvbSBDMkNvbXBvbmVudAorICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgc2V0TGlzdGVuZXJfdmIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+ICZsaXN0ZW5lciwgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWV1ZV9uYihzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBpdGVtcykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBhbm5vdW5jZV9uYihjb25zdCBzdGQ6OnZlY3RvcjxDMldvcmtPdXRsaW5lPiAmaXRlbXMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmx1c2hfc20oCisgICAgICAgICAgICBmbHVzaF9tb2RlX3QgbW9kZSwgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgZmx1c2hlZFdvcmspIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZHJhaW5fbmIoZHJhaW5fbW9kZV90IG1vZGUpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgc3RhcnQoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHN0b3AoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCByZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYoKSBvdmVycmlkZTsKKworICAgIC8vIGZvciBoYW5kbGVyCisgICAgYm9vbCBwcm9jZXNzUXVldWUoKTsKKworcHJvdGVjdGVkOgorICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgaW50ZXJuYWwgc3RhdGVzIG9mIHRoZSBjb21wb25lbnQgYWNjb3JkaW5nIHRvIHRoZSBjb25maWcgc2V0CisgICAgICogaW4gdGhlIGludGVyZmFjZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBkdXJpbmcgc3RhcnQoKSwgYnV0IG9ubHkgYXQgdGhlIGZpcnN0IGludm9jYXRpb24gb3IKKyAgICAgKiBhZnRlciByZXNldCgpLgorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgb25Jbml0KCkgPSAwOworCisgICAgLyoqCisgICAgICogU3RvcCB0aGUgY29tcG9uZW50LgorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgb25TdG9wKCkgPSAwOworCisgICAgLyoqCisgICAgICogUmVzZXQgdGhlIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgb25SZXNldCgpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgdGhlIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgb25SZWxlYXNlKCkgPSAwOworCisgICAgLyoqCisgICAgICogRmx1c2ggdGhlIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBnaXZlbiB3b3JrIGFuZCBmaW5pc2ggcGVuZGluZyB3b3JrIHVzaW5nIGZpbmlzaCgpLgorICAgICAqCisgICAgICogXHBhcmFtW2luLG91dF0gICB3b3JrICAgIHRoZSB3b3JrIHRvIHByb2Nlc3MKKyAgICAgKiBccGFyYW1baW5dICAgICAgIHBvb2wgICAgdGhlIHBvb2wgdG8gdXNlIGZvciBhbGxvY2F0aW5nIG91dHB1dCBibG9ja3MuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpID0gMDsKKworICAgIC8qKgorICAgICAqIERyYWluIHRoZSBjb21wb25lbnQgYW5kIGZpbmlzaCBwZW5kaW5nIHdvcmsgdXNpbmcgZmluaXNoKCkuCisgICAgICoKKyAgICAgKiBccGFyYW1baW5dICAgZHJhaW5Nb2RlICAgbW9kZSBvZiBkcmFpbi4KKyAgICAgKiBccGFyYW1baW5dICAgcG9vbCAgICAgICAgdGhlIHBvb2wgdG8gdXNlIGZvciBhbGxvY2F0aW5nIG91dHB1dCBibG9ja3MuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICAgICAgVGhlIGNvbXBvbmVudCBoYXMgZHJhaW5lZCBhbGwgcGVuZGluZyBvdXRwdXQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgd29yay4KKyAgICAgKiBccmV0dmFsIEMyX09NSVRURUQgICAgICAgVW5zdXBwb3J0ZWQgbW9kZSAoZS5nLiBEUkFJTl9DSEFJTikKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgPSAwOworCisgICAgLy8gZm9yIGRlcml2ZWQgY2xhc3NlcworICAgIC8qKgorICAgICAqIEZpbmlzaCBwZW5kaW5nIHdvcmsuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHJpZXZlIHRoZSBwZW5kaW5nIHdvcmsgYWNjb3JkaW5nIHRvIHxmcmFtZUluZGV4fCBhbmQKKyAgICAgKiBmZWVkIHRoZSB3b3JrIGludG8gfGZpbGxXb3JrfCBmdW5jdGlvbi4gfGZpbGxXb3JrfCBtdXN0IGJlCisgICAgICogIm5vbi1ibG9ja2luZyIuIE9uY2UgfGZpbGxXb3JrfCByZXR1cm5zIHRoZSBmaWxsZWQgd29yayB3aWxsIGJlIHJldHVybmVkCisgICAgICogdG8gdGhlIGNsaWVudC4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gICBmcmFtZUluZGV4ICAgIHRoZSBpbmRleCBvZiB0aGUgcGVuZGluZyB3b3JrCisgICAgICogXHBhcmFtW2luXSAgIGZpbGxXb3JrICAgICAgdGhlIGZ1bmN0aW9uIHRvIGZpbGwgdGhlIHJldHJpZXZlZCB3b3JrLgorICAgICAqLworICAgIHZvaWQgZmluaXNoKHVpbnQ2NF90IGZyYW1lSW5kZXgsIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmKT4gZmlsbFdvcmspOworCisgICAgLyoqCisgICAgICogQ2xvbmUgcGVuZGluZyBvciBjdXJyZW50IHdvcmsgYW5kIHNlbmQgdGhlIHdvcmsgYmFjayB0byBjbGllbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHJpZXZlIGFuZCBjbG9uZSB0aGUgcGVuZGluZyBvciBjdXJyZW50IHdvcmsgYWNjb3JkaW5nCisgICAgICogdG8gfGZyYW1lSW5kZXh8IGFuZCBmZWVkIHRoZSB3b3JrIGludG8gfGZpbGxXb3JrfCBmdW5jdGlvbi4gfGZpbGxXb3JrfAorICAgICAqIG11c3QgYmUgIm5vbi1ibG9ja2luZyIuIE9uY2UgfGZpbGxXb3JrfCByZXR1cm5zIHRoZSBmaWxsZWQgd29yayB3aWxsIGJlCisgICAgICogcmV0dXJuZWQgdG8gdGhlIGNsaWVudC4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gICBmcmFtZUluZGV4ICAgIHRoZSBpbmRleCBvZiB0aGUgd29yaworICAgICAqIFxwYXJhbVtpbl0gICBjdXJyZW50V29yayAgIHRoZSBjdXJyZW50IHdvcmsgdW5kZXIgcHJvY2Vzc2luZworICAgICAqIFxwYXJhbVtpbl0gICBmaWxsV29yayAgICAgIHRoZSBmdW5jdGlvbiB0byBmaWxsIHRoZSByZXRyaWV2ZWQgd29yay4KKyAgICAgKi8KKyAgICB2b2lkIGNsb25lQW5kU2VuZCgKKyAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmY3VycmVudFdvcmssCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJik+IGZpbGxXb3JrKTsKKworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjcmVhdGVMaW5lYXJCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gY3JlYXRlTGluZWFyQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jaywgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjcmVhdGVHcmFwaGljQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2spOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjcmVhdGVHcmFwaGljQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2ssCisgICAgICAgICAgICBjb25zdCBDMlJlY3QgJmNyb3ApOworCisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBOT19EUkFJTiA9IH4wdTsKKworICAgIEMyUmVhZFZpZXcgbUR1bW15UmVhZFZpZXc7CisKK3ByaXZhdGU6CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBtSW50ZjsKKworICAgIGNsYXNzIFdvcmtIYW5kbGVyIDogcHVibGljIEFIYW5kbGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGVudW0geworICAgICAgICAgICAga1doYXRQcm9jZXNzLAorICAgICAgICAgICAga1doYXRJbml0LAorICAgICAgICAgICAga1doYXRTdGFydCwKKyAgICAgICAgICAgIGtXaGF0U3RvcCwKKyAgICAgICAgICAgIGtXaGF0UmVzZXQsCisgICAgICAgICAgICBrV2hhdFJlbGVhc2UsCisgICAgICAgIH07CisKKyAgICAgICAgV29ya0hhbmRsZXIoKTsKKyAgICAgICAgfldvcmtIYW5kbGVyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgICAgIHZvaWQgc2V0Q29tcG9uZW50KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxTaW1wbGVDMkNvbXBvbmVudD4gJnRoaXopOworCisgICAgcHJvdGVjdGVkOgorICAgICAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6d2Vha19wdHI8U2ltcGxlQzJDb21wb25lbnQ+IG1UaGl6OworICAgICAgICBib29sIG1SdW5uaW5nOworICAgIH07CisKKyAgICBlbnVtIHsKKyAgICAgICAgVU5JTklUSUFMSVpFRCwKKyAgICAgICAgU1RPUFBFRCwKKyAgICAgICAgUlVOTklORywKKyAgICB9OworCisgICAgc3RydWN0IEV4ZWNTdGF0ZSB7CisgICAgICAgIEV4ZWNTdGF0ZSgpIDogbVN0YXRlKFVOSU5JVElBTElaRUQpIHt9CisKKyAgICAgICAgaW50IG1TdGF0ZTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIH07CisgICAgTXV0ZXhlZDxFeGVjU3RhdGU+IG1FeGVjU3RhdGU7CisKKyAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOworICAgIHNwPFdvcmtIYW5kbGVyPiBtSGFuZGxlcjsKKworICAgIGNsYXNzIFdvcmtRdWV1ZSB7CisgICAgcHVibGljOgorICAgICAgICBpbmxpbmUgV29ya1F1ZXVlKCkgOiBtRmx1c2goZmFsc2UpLCBtR2VuZXJhdGlvbigwdWwpIHt9CisKKyAgICAgICAgaW5saW5lIHVpbnQ2NF90IGdlbmVyYXRpb24oKSBjb25zdCB7IHJldHVybiBtR2VuZXJhdGlvbjsgfQorICAgICAgICBpbmxpbmUgdm9pZCBpbmNHZW5lcmF0aW9uKCkgeyArK21HZW5lcmF0aW9uOyBtRmx1c2ggPSB0cnVlOyB9CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gcG9wX2Zyb250KCk7CisgICAgICAgIHZvaWQgcHVzaF9iYWNrKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmspOworICAgICAgICBib29sIGVtcHR5KCkgY29uc3Q7CisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSgpIGNvbnN0OworICAgICAgICB2b2lkIG1hcmtEcmFpbih1aW50MzJfdCBkcmFpbk1vZGUpOworICAgICAgICBpbmxpbmUgYm9vbCBwb3BQZW5kaW5nRmx1c2goKSB7CisgICAgICAgICAgICBib29sIGZsdXNoID0gbUZsdXNoOworICAgICAgICAgICAgbUZsdXNoID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gZmx1c2g7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBjbGVhcigpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RydWN0IEVudHJ5IHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGU7CisgICAgICAgIH07CisKKyAgICAgICAgYm9vbCBtRmx1c2g7CisgICAgICAgIHVpbnQ2NF90IG1HZW5lcmF0aW9uOworICAgICAgICBzdGQ6Omxpc3Q8RW50cnk+IG1RdWV1ZTsKKyAgICB9OworICAgIE11dGV4ZWQ8V29ya1F1ZXVlPiBtV29ya1F1ZXVlOworCisgICAgdHlwZWRlZiBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDY0X3QsIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBQZW5kaW5nV29yazsKKyAgICBNdXRleGVkPFBlbmRpbmdXb3JrPiBtUGVuZGluZ1dvcms7CisKKyAgICBjbGFzcyBCbG9ja2luZ0Jsb2NrUG9vbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QmxvY2tpbmdCbG9ja1Bvb2w+IG1PdXRwdXRCbG9ja1Bvb2w7CisKKyAgICBTaW1wbGVDMkNvbXBvbmVudCgpID0gZGVsZXRlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBTSU1QTEVfQzJfQ09NUE9ORU5UX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL2luY2x1ZGUvU2ltcGxlQzJJbnRlcmZhY2UuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvaW5jbHVkZS9TaW1wbGVDMkludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNTFkM2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL2luY2x1ZGUvU2ltcGxlQzJJbnRlcmZhY2UuaApAQCAtMCwwICsxLDIzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TSU1QTEVfQzJfSU5URVJGQUNFX0hfCisjZGVmaW5lIEFORFJPSURfU0lNUExFX0MyX0lOVEVSRkFDRV9IXworCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFdyYXAgYSBjb21tb24gaW50ZXJmYWNlIG9iamVjdCAoc3VjaCBhcyBDb2RlYzJDbGllbnQ6OkludGVyZmFjZSwgb3IgQzJJbnRlcmZhY2VIZWxwZXIgaW50bworICogYSBDMkNvbXBvbmVudEludGVyZmFjZS4KKyAqCisgKiBccGFyYW0gVCBjb21tb24gaW50ZXJmYWNlIHR5cGUKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBTaW1wbGVDMkludGVyZmFjZSA6IHB1YmxpYyBDMkNvbXBvbmVudEludGVyZmFjZSB7CitwdWJsaWM6CisgICAgU2ltcGxlQzJJbnRlcmZhY2UoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VD4gJmltcGwpCisgICAgICAgIDogbU5hbWUobmFtZSksCisgICAgICAgICAgbUlkKGlkKSwKKyAgICAgICAgICBtSW1wbChpbXBsKSB7CisgICAgfQorCisgICAgflNpbXBsZUMySW50ZXJmYWNlKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgLy8gRnJvbSBDMkNvbXBvbmVudEludGVyZmFjZQorICAgIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtTmFtZTsgfQorICAgIGMyX25vZGVfaWRfdCBnZXRJZCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1JZDsgfQorICAgIGMyX3N0YXR1c190IHF1ZXJ5X3ZiKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBoZWFwUGFyYW1zKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cXVlcnkoc3RhY2tQYXJhbXMsIGhlYXBQYXJhbUluZGljZXMsIG1heUJsb2NrLCBoZWFwUGFyYW1zKTsKKyAgICB9CisgICAgYzJfc3RhdHVzX3QgY29uZmlnX3ZiKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwtPmNvbmZpZyhwYXJhbXMsIG1heUJsb2NrLCBmYWlsdXJlcyk7CisgICAgfQorICAgIGMyX3N0YXR1c190IGNyZWF0ZVR1bm5lbF9zbShjMl9ub2RlX2lkX3QpIG92ZXJyaWRlIHsgcmV0dXJuIEMyX09NSVRURUQ7IH0KKyAgICBjMl9zdGF0dXNfdCByZWxlYXNlVHVubmVsX3NtKGMyX25vZGVfaWRfdCkgb3ZlcnJpZGUgeyByZXR1cm4gQzJfT01JVFRFRDsgfQorICAgIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKiBjb25zdCBwYXJhbXMpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5xdWVyeVN1cHBvcnRlZFBhcmFtcyhwYXJhbXMpOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlc192YigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5xdWVyeVN1cHBvcnRlZFZhbHVlcyhmaWVsZHMsIG1heUJsb2NrKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQzJTdHJpbmcgbU5hbWU7CisgICAgY29uc3QgYzJfbm9kZV9pZF90IG1JZDsKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VD4gbUltcGw7Cit9OworCisvKioKKyAqIFV0aWxpdHkgY2xhc3NlcyBmb3IgY29tbW9uIGludGVyZmFjZXMuCisgKi8KK3RlbXBsYXRlPD4KK2NsYXNzIFNpbXBsZUMySW50ZXJmYWNlPHZvaWQ+IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBCYXNlIENvZGVjIDIuMCBwYXJhbWV0ZXJzIHJlcXVpcmVkIGZvciBhbGwgY29tcG9uZW50cy4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgQmFzZVBhcmFtcyA6IEMySW50ZXJmYWNlSGVscGVyIHsKKyAgICAgICAgZXhwbGljaXQgQmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIsCisgICAgICAgICAgICAgICAgQzJTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6a2luZF90IGtpbmQsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OmRvbWFpbl90IGRvbWFpbiwKKyAgICAgICAgICAgICAgICBDMlN0cmluZyBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IGFsaWFzZXMgPSBzdGQ6OnZlY3RvcjxDMlN0cmluZz4oKSk7CisKKyAgICAgICAgLy8vIE1hcmtzIHRoYXQgdGhpcyBjb21wb25lbnQgaGFzIG5vIGlucHV0IGxhdGVuY3kuIE90aGVyd2lzZSwgY29tcG9uZW50IG11c3QKKyAgICAgICAgLy8vIGFkZCBzdXBwb3J0IGZvciBDMlBvcnRSZXF1ZXN0ZWREZWxheVR1bmluZzo6aW5wdXQgYW5kIEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjppbnB1dC4KKyAgICAgICAgdm9pZCBub0lucHV0TGF0ZW5jeSgpOworCisgICAgICAgIC8vLyBNYXJrcyB0aGF0IHRoaXMgY29tcG9uZW50IGhhcyBubyBvdXRwdXQgbGF0ZW5jeS4gT3RoZXJ3aXNlLCBjb21wb25lbnQgbXVzdAorICAgICAgICAvLy8gYWRkIHN1cHBvcnQgZm9yIEMyUG9ydFJlcXVlc3RlZERlbGF5VHVuaW5nOjpvdXRwdXQgYW5kIEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjpvdXRwdXQuCisgICAgICAgIHZvaWQgbm9PdXRwdXRMYXRlbmN5KCk7CisKKyAgICAgICAgLy8vIE1hcmtzIHRoYXQgdGhpcyBjb21wb25lbnQgaGFzIG5vIHBpcGVsaW5lIGxhdGVuY3kuIE90aGVyd2lzZSwgY29tcG9uZW50IG11c3QKKyAgICAgICAgLy8vIGFkZCBzdXBwb3J0IGZvciBDMlJlcXVlc3RlZFBpcGVsaW5lRGVsYXlUdW5pbmcgYW5kIEMyQWN0dWFsUGlwZWxpbmVEZWxheVR1bmluZy4KKyAgICAgICAgdm9pZCBub1BpcGVsaW5lTGF0ZW5jeSgpOworCisgICAgICAgIC8vLyBNYXJrcyB0aGF0IHRoaXMgY29tcG9uZW50IGhhcyBubyBuZWVkIGZvciBwcml2YXRlIGJ1ZmZlcnMuIE90aGVyd2lzZSwgY29tcG9uZW50IG11c3QKKyAgICAgICAgLy8vIGFkZCBzdXBwb3J0IGZvciBDMk1heFByaXZhdGVCdWZmZXJDb3VudFR1bmluZywgQzJQcml2YXRlQWxsb2NhdG9yc1R1bmluZyBhbmQKKyAgICAgICAgLy8vIEMyUHJpdmF0ZUJsb2NrUG9vbHNUdW5pbmcuCisgICAgICAgIHZvaWQgbm9Qcml2YXRlQnVmZmVycygpOworCisgICAgICAgIC8vLyBNYXJrcyB0aGF0IHRoaXMgY29tcG9uZW50IGhvbGRzIG5vIHJlZmVyZW5jZXMgdG8gaW5wdXQgYnVmZmVycy4gT3RoZXJ3aXNlLCBjb21wb25lbnQKKyAgICAgICAgLy8vIG11c3QgYWRkIHN1cHBvcnQgZm9yIEMyU3RyZWFtTWF4UmVmZXJlbmNlQWdlVHVuaW5nOjppbnB1dCBhbmQKKyAgICAgICAgLy8vIEMyU3RyZWFtTWF4UmVmZXJlbmNlQ291bnRUdW5pbmc6OmlucHV0LgorICAgICAgICB2b2lkIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisKKyAgICAgICAgLy8vIE1hcmtzIHRoYXQgdGhpcyBjb21wb25lbnQgaG9sZHMgbm8gcmVmZXJlbmNlcyB0byBvdXRwdXQgYnVmZmVycy4gT3RoZXJ3aXNlLCBjb21wb25lbnQKKyAgICAgICAgLy8vIG11c3QgYWRkIHN1cHBvcnQgZm9yIEMyU3RyZWFtTWF4UmVmZXJlbmNlQWdlVHVuaW5nOjpvdXRwdXQgYW5kCisgICAgICAgIC8vLyBDMlN0cmVhbU1heFJlZmVyZW5jZUNvdW50VHVuaW5nOjpvdXRwdXQuCisgICAgICAgIHZvaWQgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisKKyAgICAgICAgLy8vIE1hcmtzIHRoYXQgdGhpcyBjb21wb25lbnQgZG9lcyBub3Qgc3RyZXRjaCB0aW1lLiBPdGhlcndpc2UsIGNvbXBvbmVudAorICAgICAgICAvLy8gbXVzdCBhZGQgc3VwcG9ydCBmb3IgQzJDb21wb25lbnRUaW1lU3RyZXRjaFR1bmluZy4KKyAgICAgICAgdm9pZCBub1RpbWVTdHJldGNoKCk7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQXBpTGV2ZWxTZXR0aW5nPiBtQXBpTGV2ZWw7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFwaUZlYXR1cmVzU2V0dGluZz4gbUFwaUZlYXR1cmVzOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBsYXRmb3JtTGV2ZWxTZXR0aW5nPiBtUGxhdGZvcm1MZXZlbDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGxhdGZvcm1GZWF0dXJlc1NldHRpbmc+IG1QbGF0Zm9ybUZlYXR1cmVzOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudE5hbWVTZXR0aW5nPiBtTmFtZTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50QWxpYXNlc1NldHRpbmc+IG1BbGlhc2VzOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRLaW5kU2V0dGluZz4gbUtpbmQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudERvbWFpblNldHRpbmc+IG1Eb21haW47CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nPiBtQXR0cmliOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRUaW1lU3RyZXRjaFR1bmluZz4gbVRpbWVTdHJldGNoOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0UmVxdWVzdGVkRGVsYXlUdW5pbmc6OmlucHV0PiBtUmVxdWVzdGVkSW5wdXREZWxheTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydFJlcXVlc3RlZERlbGF5VHVuaW5nOjpvdXRwdXQ+IG1SZXF1ZXN0ZWRPdXRwdXREZWxheTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVxdWVzdGVkUGlwZWxpbmVEZWxheVR1bmluZz4gbVJlcXVlc3RlZFBpcGVsaW5lRGVsYXk7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjppbnB1dD4gbUFjdHVhbElucHV0RGVsYXk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0PiBtQWN0dWFsT3V0cHV0RGVsYXk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFjdHVhbFBpcGVsaW5lRGVsYXlUdW5pbmc+IG1BY3R1YWxQaXBlbGluZURlbGF5OworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFJlZmVyZW5jZUFnZVR1bmluZzo6aW5wdXQ+IG1NYXhJbnB1dFJlZmVyZW5jZUFnZTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4UmVmZXJlbmNlQ291bnRUdW5pbmc6OmlucHV0PiBtTWF4SW5wdXRSZWZlcmVuY2VDb3VudDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4UmVmZXJlbmNlQWdlVHVuaW5nOjpvdXRwdXQ+IG1NYXhPdXRwdXRSZWZlcmVuY2VBZ2U7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFJlZmVyZW5jZUNvdW50VHVuaW5nOjpvdXRwdXQ+IG1NYXhPdXRwdXRSZWZlcmVuY2VDb3VudDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTWF4UHJpdmF0ZUJ1ZmZlckNvdW50VHVuaW5nPiBtTWF4UHJpdmF0ZUJ1ZmZlckNvdW50OworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRTdHJlYW1Db3VudFR1bmluZzo6aW5wdXQ+IG1JbnB1dFN0cmVhbUNvdW50OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0U3RyZWFtQ291bnRUdW5pbmc6Om91dHB1dD4gbU91dHB1dFN0cmVhbUNvdW50OworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN1YnNjcmliZWRQYXJhbUluZGljZXNUdW5pbmc+IG1TdWJzY3JpYmVkUGFyYW1JbmRpY2VzOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0U3VnZ2VzdGVkQnVmZmVyQ291bnRUdW5pbmc6OmlucHV0PiBtU3VnZ2VzdGVkSW5wdXRCdWZmZXJDb3VudDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydFN1Z2dlc3RlZEJ1ZmZlckNvdW50VHVuaW5nOjpvdXRwdXQ+IG1TdWdnZXN0ZWRPdXRwdXRCdWZmZXJDb3VudDsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDdXJyZW50V29ya1R1bmluZz4gbUN1cnJlbnRXb3JrT3JkaW5hbDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGFzdFdvcmtRdWV1ZWRUdW5pbmc6OmlucHV0PiBtTGFzdElucHV0UXVldWVkV29ya09yZGluYWw7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxhc3RXb3JrUXVldWVkVHVuaW5nOjpvdXRwdXQ+IG1MYXN0T3V0cHV0UXVldWVkV29ya09yZGluYWw7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0PiBtSW5wdXRBbGxvY2F0b3JzOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6b3V0cHV0PiBtT3V0cHV0QWxsb2NhdG9yczsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUHJpdmF0ZUFsbG9jYXRvcnNUdW5pbmc+IG1Qcml2YXRlQWxsb2NhdG9yczsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dD4gbU91dHB1dFBvb2xJZHM7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlByaXZhdGVCbG9ja1Bvb2xzVHVuaW5nPiBtUHJpdmF0ZVBvb2xJZHM7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyVHJpcHBlZFR1bmluZz4gbVRyaXBwZWQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk91dE9mTWVtb3J5VHVuaW5nPiBtT3V0T2ZNZW1vcnk7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydENvbmZpZ0NvdW50ZXJUdW5pbmc6OmlucHV0PiBtSW5wdXRDb25maWdDb3VudGVyOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0Q29uZmlnQ291bnRlclR1bmluZzo6b3V0cHV0PiBtT3V0cHV0Q29uZmlnQ291bnRlcjsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29uZmlnQ291bnRlclR1bmluZz4gbURpcmVjdENvbmZpZ0NvdW50ZXI7CisgICAgfTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit1c2luZyBTaW1wbGVJbnRlcmZhY2UgPSBTaW1wbGVDMkludGVyZmFjZTxUPjsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgLi4uQXJncz4KK3N0ZDo6c2hhcmVkX3B0cjxUPiBBbGxvY1NoYXJlZFN0cmluZyhjb25zdCBBcmdzKCYuLi4gYXJncyksIGNvbnN0IGNoYXIgKnN0cikgeworICAgIHNpemVfdCBsZW4gPSBzdHJsZW4oc3RyKSArIDE7CisgICAgc3RkOjpzaGFyZWRfcHRyPFQ+IHJldCA9IFQ6OkFsbG9jU2hhcmVkKGxlbiwgYXJncy4uLik7CisgICAgc3RyY3B5KHJldC0+bS52YWx1ZSwgc3RyKTsKKyAgICByZXR1cm4gcmV0OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSAuLi5BcmdzPgorc3RkOjpzaGFyZWRfcHRyPFQ+IEFsbG9jU2hhcmVkU3RyaW5nKGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSwgY29uc3Qgc3RkOjpzdHJpbmcgJnN0cikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUPiByZXQgPSBUOjpBbGxvY1NoYXJlZChzdHIubGVuZ3RoKCkgKyAxLCBhcmdzLi4uKTsKKyAgICBzdHJjcHkocmV0LT5tLnZhbHVlLCBzdHIuY19zdHIoKSk7CisgICAgcmV0dXJuIHJldDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgU2V0dGVyIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxUPjo6dHlwZSB0eXBlOworCisgICAgc3RhdGljIEMyUiBOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMoCisgICAgICAgICAgICBib29sIG1heUJsb2NrLCBDMkludGVyZmFjZUhlbHBlcjo6QzJQPHR5cGU+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgcmV0dXJuIG1lLkYobWUudi52YWx1ZSkudmFsaWRhdGVQb3NzaWJsZShtZS52LnZhbHVlKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE5vblN0cmljdFZhbHVlc1dpdGhOb0RlcHMoCisgICAgICAgICAgICBib29sIG1heUJsb2NrLCBDMkludGVyZmFjZUhlbHBlcjo6QzJQPHR5cGU+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IG1lLnYuZmxleENvdW50KCk7ICsraXgpIHsKKyAgICAgICAgICAgIHJlcy5wbHVzKG1lLkYobWUudi5tLnZhbHVlc1tpeF0pLnZhbGlkYXRlUG9zc2libGUobWUudi5tLnZhbHVlc1tpeF0pKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU3RyaWN0VmFsdWVXaXRoTm9EZXBzKAorICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgIGNvbnN0IEMySW50ZXJmYWNlSGVscGVyOjpDMlA8dHlwZT4gJm9sZCwKKyAgICAgICAgICAgIEMySW50ZXJmYWNlSGVscGVyOjpDMlA8dHlwZT4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBpZiAoIW1lLkYobWUudi52YWx1ZSkuc3VwcG9ydHNOb3cobWUudi52YWx1ZSkpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnZhbHVlID0gb2xkLnYudmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1lLkYobWUudi52YWx1ZSkudmFsaWRhdGVQb3NzaWJsZShtZS52LnZhbHVlKTsKKyAgICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfU0lNUExFX0MyX0lOVEVSRkFDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvY21kcy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvY21kcy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMDk3N2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9jbWRzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzNyBAQAorY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiY29kZWMycGxheSIsCisgICAgZGVmYXVsdHM6IFsibGliY29kZWMyLWltcGwtZGVmYXVsdHMiXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgImNvZGVjMi5jcHAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9jbWRzL2NvZGVjMi5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9jbWRzL2NvZGVjMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJjZjU0NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2NtZHMvY29kZWMyLmNwcApAQCAtMCwwICsxLDQ4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSA8dGhyZWFkPgorCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImNvZGVjMiIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2VGYWN0b3J5Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisKKyNpbmNsdWRlIDxndWkvR0xDb25zdW1lci5oPgorI2luY2x1ZGUgPGd1aS9JUHJvZHVjZXJMaXN0ZW5lci5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5oPgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOworCituYW1lc3BhY2UgeworCitjbGFzcyBMaW5lYXJCdWZmZXIgOiBwdWJsaWMgQzJCdWZmZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IExpbmVhckJ1ZmZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrKQorICAgICAgICA6IEMyQnVmZmVyKHsgYmxvY2stPnNoYXJlKGJsb2NrLT5vZmZzZXQoKSwgYmxvY2stPnNpemUoKSwgOjpDMkZlbmNlKCkpIH0pIHt9Cit9OworCitjbGFzcyBMaXN0ZW5lcjsKKworY2xhc3MgU2ltcGxlUGxheWVyIHsKK3B1YmxpYzoKKyAgICBTaW1wbGVQbGF5ZXIoKTsKKyAgICB+U2ltcGxlUGxheWVyKCk7CisKKyAgICB2b2lkIG9uV29ya0RvbmUoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtJdGVtcyk7CisgICAgdm9pZCBvblRyaXBwZWQoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBzZXR0aW5nUmVzdWx0KTsKKyAgICB2b2lkIG9uRXJyb3Ioc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LCB1aW50MzJfdCBlcnJvckNvZGUpOworCisgICAgdm9pZCBwbGF5KGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworCisgICAgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBtQ29tcG9uZW50OworCisgICAgc3A8SVByb2R1Y2VyTGlzdGVuZXI+IG1Qcm9kdWNlckxpc3RlbmVyOworCisgICAgc3RkOjphdG9taWNfaW50IG1MaW5lYXJQb29sSWQ7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1BbGxvY0lvbjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1MaW5lYXJQb29sOworCisgICAgc3RkOjptdXRleCBtUXVldWVMb2NrOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1RdWV1ZUNvbmRpdGlvbjsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IG1Xb3JrUXVldWU7CisKKyAgICBzdGQ6Om11dGV4IG1Qcm9jZXNzZWRMb2NrOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1Qcm9jZXNzZWRDb25kaXRpb247CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBtUHJvY2Vzc2VkV29yazsKKworICAgIHNwPFN1cmZhY2U+IG1TdXJmYWNlOworICAgIHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4gbUNvbXBvc2VyQ2xpZW50OworICAgIHNwPFN1cmZhY2VDb250cm9sPiBtQ29udHJvbDsKK307CisKK2NsYXNzIExpc3RlbmVyIDogcHVibGljIEMyQ29tcG9uZW50OjpMaXN0ZW5lciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgTGlzdGVuZXIoU2ltcGxlUGxheWVyICp0aGl6KSA6IG1UaGlzKHRoaXopIHt9CisgICAgdmlydHVhbCB+TGlzdGVuZXIoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25Xb3JrRG9uZV9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiB3b3JrSXRlbXMpIG92ZXJyaWRlIHsKKyAgICAgICAgbVRoaXMtPm9uV29ya0RvbmUoY29tcG9uZW50LCBzdGQ6Om1vdmUod29ya0l0ZW1zKSk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uVHJpcHBlZF9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gc2V0dGluZ1Jlc3VsdCkgb3ZlcnJpZGUgeworICAgICAgICBtVGhpcy0+b25UcmlwcGVkKGNvbXBvbmVudCwgc2V0dGluZ1Jlc3VsdCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRXJyb3JfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGVycm9yQ29kZSkgb3ZlcnJpZGUgeworICAgICAgICBtVGhpcy0+b25FcnJvcihjb21wb25lbnQsIGVycm9yQ29kZSk7CisgICAgfQorCitwcml2YXRlOgorICAgIFNpbXBsZVBsYXllciAqIGNvbnN0IG1UaGlzOworfTsKKworCitTaW1wbGVQbGF5ZXI6OlNpbXBsZVBsYXllcigpCisgICAgOiBtTGlzdGVuZXIobmV3IExpc3RlbmVyKHRoaXMpKSwKKyAgICAgIG1Qcm9kdWNlckxpc3RlbmVyKG5ldyBEdW1teVByb2R1Y2VyTGlzdGVuZXIpLAorICAgICAgbUxpbmVhclBvb2xJZChDMkJsb2NrUG9vbDo6UExBVEZPUk1fU1RBUlQpLAorICAgICAgbUNvbXBvc2VyQ2xpZW50KG5ldyBTdXJmYWNlQ29tcG9zZXJDbGllbnQpIHsKKyAgICBDSEVDS19FUShtQ29tcG9zZXJDbGllbnQtPmluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IHN0b3JlID0gR2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpOworICAgIENIRUNLX0VRKHN0b3JlLT5mZXRjaEFsbG9jYXRvcihDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUiwgJm1BbGxvY0lvbiksIEMyX09LKTsKKyAgICBtTGluZWFyUG9vbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2w+KG1BbGxvY0lvbiwgbUxpbmVhclBvb2xJZCsrKTsKKworICAgIG1Db250cm9sID0gbUNvbXBvc2VyQ2xpZW50LT5jcmVhdGVTdXJmYWNlKAorICAgICAgICAgICAgU3RyaW5nOCgiQSBTdXJmYWNlIiksCisgICAgICAgICAgICAxMjgwLAorICAgICAgICAgICAgODAwLAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyKTsKKyAgICAgICAgICAgIC8vUElYRUxfRk9STUFUX1JHQl81NjUpOworCisgICAgQ0hFQ0sobUNvbnRyb2wgIT0gbnVsbHB0cik7CisgICAgQ0hFQ0sobUNvbnRyb2wtPmlzVmFsaWQoKSk7CisKKyAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OlRyYW5zYWN0aW9ue30KKyAgICAgICAgICAgIC5zZXRMYXllcihtQ29udHJvbCwgSU5UX01BWCkKKyAgICAgICAgICAgIC5zaG93KG1Db250cm9sKQorICAgICAgICAgICAgLmFwcGx5KCk7CisKKyAgICBtU3VyZmFjZSA9IG1Db250cm9sLT5nZXRTdXJmYWNlKCk7CisgICAgQ0hFQ0sobVN1cmZhY2UgIT0gbnVsbHB0cik7CisgICAgbVN1cmZhY2UtPmNvbm5lY3QoTkFUSVZFX1dJTkRPV19BUElfQ1BVLCBtUHJvZHVjZXJMaXN0ZW5lcik7Cit9CisKK1NpbXBsZVBsYXllcjo6flNpbXBsZVBsYXllcigpIHsKKyAgICBtQ29tcG9zZXJDbGllbnQtPmRpc3Bvc2UoKTsKK30KKwordm9pZCBTaW1wbGVQbGF5ZXI6Om9uV29ya0RvbmUoCisgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiB3b3JrSXRlbXMpIHsKKyAgICBBTE9HVigiU2ltcGxlUGxheWVyOjpvbldvcmtEb25lIik7CisgICAgKHZvaWQpIGNvbXBvbmVudDsKKyAgICBVTG9jayBsKG1Qcm9jZXNzZWRMb2NrKTsKKyAgICBmb3IgKGF1dG8gJiBpdGVtIDogd29ya0l0ZW1zKSB7CisgICAgICAgIG1Qcm9jZXNzZWRXb3JrLnB1c2hfYmFjayhzdGQ6Om1vdmUoaXRlbSkpOworICAgIH0KKyAgICBtUHJvY2Vzc2VkQ29uZGl0aW9uLm5vdGlmeV9hbGwoKTsKK30KKwordm9pZCBTaW1wbGVQbGF5ZXI6Om9uVHJpcHBlZCgKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gc2V0dGluZ1Jlc3VsdCkgeworICAgICh2b2lkKSBjb21wb25lbnQ7CisgICAgKHZvaWQpIHNldHRpbmdSZXN1bHQ7CisgICAgLy8gVE9ETworfQorCit2b2lkIFNpbXBsZVBsYXllcjo6b25FcnJvcihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsIHVpbnQzMl90IGVycm9yQ29kZSkgeworICAgICh2b2lkKSBjb21wb25lbnQ7CisgICAgKHZvaWQpIGVycm9yQ29kZTsKKyAgICAvLyBUT0RPCit9CisKK3ZvaWQgU2ltcGxlUGxheWVyOjpwbGF5KGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSkgeworICAgIEFMT0dWKCJTaW1wbGVQbGF5ZXI6OnBsYXkiKTsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgICh2b2lkKSBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2Uoc291cmNlLT5nZXRGb3JtYXQoKSwgJmZvcm1hdCk7CisKKyAgICBzcDxBQnVmZmVyPiBjc2QwLCBjc2QxOworICAgIGZvcm1hdC0+ZmluZEJ1ZmZlcigiY3NkLTAiLCAmY3NkMCk7CisgICAgZm9ybWF0LT5maW5kQnVmZmVyKCJjc2QtMSIsICZjc2QxKTsKKworICAgIHN0YXR1c190IGVyciA9IHNvdXJjZS0+c3RhcnQoKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb3VyY2UgcmV0dXJuZWQgZXJyb3IgJWQgKDB4JTA4eClcbiIsIGVyciwgZXJyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBzdG9yZSA9IEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudDsKKyAgICAodm9pZClzdG9yZS0+Y3JlYXRlQ29tcG9uZW50KCJjMi5hbmRyb2lkLmF2Yy5kZWNvZGVyIiwgJmNvbXBvbmVudCk7CisKKyAgICAodm9pZCljb21wb25lbnQtPnNldExpc3RlbmVyX3ZiKG1MaXN0ZW5lciwgQzJfRE9OVF9CTE9DSyk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dD4gcG9vbHMgPQorICAgICAgICBDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKHsgKHVpbnQ2NF90KUMyQmxvY2tQb29sOjpCQVNJQ19HUkFQSElDIH0pOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiByZXN1bHQ7CisgICAgKHZvaWQpY29tcG9uZW50LT5pbnRmKCktPmNvbmZpZ192Yih7cG9vbHMuZ2V0KCl9LCBDMl9ET05UX0JMT0NLLCAmcmVzdWx0KTsKKyAgICBjb21wb25lbnQtPnN0YXJ0KCk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7ICsraSkgeworICAgICAgICBtV29ya1F1ZXVlLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrKTsKKyAgICB9CisKKyAgICBzdGQ6OmF0b21pY19ib29sIHJ1bm5pbmcodHJ1ZSk7CisgICAgc3RkOjp0aHJlYWQgc3VyZmFjZVRocmVhZChbdGhpcywgJnJ1bm5pbmddKCkgeworICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmaWdicCA9IG1TdXJmYWNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7CisgICAgICAgIHdoaWxlIChydW5uaW5nKSB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVMb2NrIGwobVByb2Nlc3NlZExvY2spOworICAgICAgICAgICAgICAgIGlmIChtUHJvY2Vzc2VkV29yay5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1Qcm9jZXNzZWRDb25kaXRpb24ud2FpdF9mb3IobCwgMTAwbXMpOworICAgICAgICAgICAgICAgICAgICBpZiAobVByb2Nlc3NlZFdvcmsuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd29yay5zd2FwKG1Qcm9jZXNzZWRXb3JrLmZyb250KCkpOworICAgICAgICAgICAgICAgIG1Qcm9jZXNzZWRXb3JrLnBvcF9mcm9udCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHNsb3Q7CisgICAgICAgICAgICBzcDxGZW5jZT4gZmVuY2U7CisgICAgICAgICAgICBBTE9HVigiUmVuZGVyOiBGcmFtZSAjJWxsZCIsIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla2xsKCkpOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmb3V0cHV0ID0gd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnNbMF07CisgICAgICAgICAgICBpZiAob3V0cHV0KSB7CisgICAgICAgICAgICAgICAgY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayBibG9jayA9IG91dHB1dC0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKS5mcm9udCgpOworICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqZ3JhbGxvY0hhbmRsZSA9IFVud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoYmxvY2suaGFuZGxlKCkpOworICAgICAgICAgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZmZlcihuZXcgR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyYWxsb2NIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljQnVmZmVyOjpDTE9ORV9IQU5ETEUsCisgICAgICAgICAgICAgICAgICAgICAgICBibG9jay53aWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2suaGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lWMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ2NF90KUdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sCisgICAgICAgICAgICAgICAgICAgICAgICBibG9jay53aWR0aCgpKSk7CisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoZ3JhbGxvY0hhbmRsZSk7CisKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBpZ2JwLT5hdHRhY2hCdWZmZXIoJnNsb3QsIGJ1ZmZlcik7CisKKyAgICAgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0IHFiaSgKKyAgICAgICAgICAgICAgICAgICAgICAgICh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgKiAxMDAwbGwpLnBlZWtsbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfREFUQVNQQUNFX1VOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICBSZWN0KGJsb2NrLndpZHRoKCksIGJsb2NrLmhlaWdodCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX1NDQUxFX1RPX1dJTkRPVywKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBGZW5jZTo6Tk9fRkVOQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCBxYm87CisgICAgICAgICAgICAgICAgZXJyID0gaWdicC0+cXVldWVCdWZmZXIoc2xvdCwgcWJpLCAmcWJvKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKworICAgICAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgICAgIG1Xb3JrUXVldWUucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICBtUXVldWVDb25kaXRpb24ubm90aWZ5X2FsbCgpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJyZW5kZXIgbG9vcCBmaW5pc2hlZCIpOworICAgIH0pOworCisgICAgbG9uZyBudW1GcmFtZXMgPSAwOworICAgIG1MaW5lYXJQb29sLnJlc2V0KG5ldyBDMlBvb2xlZEJsb2NrUG9vbChtQWxsb2NJb24sIG1MaW5lYXJQb29sSWQrKykpOworCisgICAgZm9yICg7OykgeworICAgICAgICBzaXplX3Qgc2l6ZSA9IDB1OworICAgICAgICB2b2lkICpkYXRhID0gbnVsbHB0cjsKKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXAgPSAwdTsKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXIgPSBudWxscHRyOworICAgICAgICBzcDxBQnVmZmVyPiBjc2Q7CisgICAgICAgIGlmIChjc2QwICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNzZCA9IGNzZDA7CisgICAgICAgICAgICBjc2QwID0gbnVsbHB0cjsKKyAgICAgICAgfSBlbHNlIGlmIChjc2QxICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNzZCA9IGNzZDE7CisgICAgICAgICAgICBjc2QxID0gbnVsbHB0cjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHNvdXJjZS0+cmVhZCgmYnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBDSEVDSyhidWZmZXIgPT0gbnVsbHB0cik7CisKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgQ0hFQ0sobWV0YS5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lc3RhbXApKTsKKworICAgICAgICAgICAgc2l6ZSA9IGJ1ZmZlci0+c2l6ZSgpOworICAgICAgICAgICAgZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNzZCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzaXplID0gY3NkLT5zaXplKCk7CisgICAgICAgICAgICBkYXRhID0gY3NkLT5kYXRhKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQcmVwYXJlIEMyV29yaworCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgIHdoaWxlICghd29yaykgeworICAgICAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgICAgIGlmICghbVdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgd29yay5zd2FwKG1Xb3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICAgICAgbVdvcmtRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIDEwMG1zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCkwOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gbnVtRnJhbWVzOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICAgICAgbUxpbmVhclBvb2wtPmZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICAgICAmYmxvY2spOworICAgICAgICBDMldyaXRlVmlldyB2aWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkMyTGluZWFyQmxvY2s6Om1hcCgpIGZhaWxlZCA6ICVkIiwgdmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG1lbWNweSh2aWV3LmJhc2UoKSwgZGF0YSwgc2l6ZSk7CisKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmVtcGxhY2VfYmFjayhuZXcgTGluZWFyQnVmZmVyKGJsb2NrKSk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgICAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKworICAgICAgICBBTE9HVigiRnJhbWUgIyVsZCBzaXplID0gJXp1IiwgbnVtRnJhbWVzLCBzaXplKTsKKyAgICAgICAgLy8gRE8gVEhFIERFQ09ESU5HCisgICAgICAgIGNvbXBvbmVudC0+cXVldWVfbmIoJml0ZW1zKTsKKworICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIH0KKworICAgICAgICArK251bUZyYW1lczsKKyAgICB9CisgICAgQUxPR1YoIm1haW4gbG9vcCBmaW5pc2hlZCIpOworICAgIHNvdXJjZS0+c3RvcCgpOworICAgIHJ1bm5pbmcuc3RvcmUoZmFsc2UpOworICAgIHN1cmZhY2VUaHJlYWQuam9pbigpOworCisgICAgY29tcG9uZW50LT5yZWxlYXNlKCk7CisgICAgcHJpbnRmKCJcbiIpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworc3RhdGljIHZvaWQgdXNhZ2UoY29uc3QgY2hhciAqbWUpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiAlcyBbb3B0aW9uc10gW2lucHV0X2ZpbGVuYW1lXVxuIiwgbWUpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1oKGVscClcbiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CisKKyAgICBpbnQgcmVzOworICAgIHdoaWxlICgocmVzID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJoIikpID49IDApIHsKKyAgICAgICAgc3dpdGNoIChyZXMpIHsKKyAgICAgICAgICAgIGNhc2UgJ2gnOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKKyAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgYXJnYyAtPSBvcHRpbmQ7CisgICAgYXJndiArPSBvcHRpbmQ7CisKKyAgICBpZiAoYXJnYyA8IDEpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJObyBpbnB1dCBmaWxlIHNwZWNpZmllZFxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IE9LOworICAgIFNpbXBsZVBsYXllciBwbGF5ZXI7CisKKyAgICBmb3IgKGludCBrID0gMDsgayA8IGFyZ2MgJiYgZXJyID09IE9LOyArK2spIHsKKyAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSBhcmd2W2tdOworCisgICAgICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPQorICAgICAgICAgICAgRGF0YVNvdXJjZUZhY3Rvcnk6OkNyZWF0ZUZyb21VUkkobnVsbHB0ciAvKiBodHRwU2VydmljZSAqLywgZmlsZW5hbWUpOworCisgICAgICAgIGlmIChzdHJuY2FzZWNtcChmaWxlbmFtZSwgInNpbmU6IiwgNSkgJiYgZGF0YVNvdXJjZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBjcmVhdGUgZGF0YSBzb3VyY2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgICAgVmVjdG9yPHNwPElNZWRpYVNvdXJjZT4gPiBtZWRpYVNvdXJjZXM7CisgICAgICAgIHNwPElNZWRpYVNvdXJjZT4gbWVkaWFTb3VyY2U7CisKKyAgICAgICAgc3A8SU1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3IgPSBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OkNyZWF0ZShkYXRhU291cmNlKTsKKworICAgICAgICBpZiAoZXh0cmFjdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IGNyZWF0ZSBleHRyYWN0b3IuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gZXh0cmFjdG9yLT5nZXRNZXRhRGF0YSgpOworCisgICAgICAgIGlmIChtZXRhICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgICAgICAgICBpZiAoIW1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJleHRyYWN0b3IgZGlkIG5vdCBwcm92aWRlIE1JTUUgdHlwZS5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBudW1UcmFja3MgPSBleHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CisKKyAgICAgICAgc2l6ZV90IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1UcmFja3M7ICsraSkgeworICAgICAgICAgICAgbWV0YSA9IGV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YShpLCAwKTsKKworICAgICAgICAgICAgaWYgKG1ldGEgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICAgICAgICAgIG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOworCisgICAgICAgICAgICAvLyBUT0RPOiBhbGxvd2luZyBBVkMgb25seSBmb3IgdGhlIHRpbWUgYmVpbmcKKyAgICAgICAgICAgIGlmICghc3RybmNhc2VjbXAobWltZSwgInZpZGVvL2F2YyIsIDkpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1ldGEgPSBudWxscHRyOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1ldGEgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJObyBBVkMgdHJhY2sgZm91bmQuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIG1lZGlhU291cmNlID0gZXh0cmFjdG9yLT5nZXRUcmFjayhpKTsKKyAgICAgICAgaWYgKG1lZGlhU291cmNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic2tpcCBOVUxMIHRyYWNrICV6dSwgdG90YWwgdHJhY2tzICV6dS5cbiIsIGksIG51bVRyYWNrcyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBwbGF5ZXIucGxheShtZWRpYVNvdXJjZSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVlYjUxZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQW5kcm9pZC5icApAQCAtMCwwICsxLDMwIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2ZsYWNkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWyJsaWJGTEFDLWhlYWRlcnMiXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0RmxhY0RlYy5jcHAiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mbGFjZGVjIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2ZsYWNlbmMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEZsYWNFbmMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJGTEFDIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZiMTZlOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0RlYy5jcHAKQEAgLTAsMCArMSwzODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEZsYWNEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdEZsYWNEZWMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuZmxhYy5kZWNvZGVyIjsKKworY2xhc3MgQzJTb2Z0RmxhY0RlYzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfTkFNRV9JTlBVVF9TVFJFQU1fRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUZvcm1hdENvbmZpZzo6aW5wdXQoMHUsIEMyRm9ybWF0Q29tcHJlc3NlZCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9OQU1FX09VVFBVVF9TVFJFQU1fRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0KDB1LCBDMkZvcm1hdEF1ZGlvKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfTkFNRV9JTlBVVF9QT1JUX01JTUVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9OQU1FX09VVFBVVF9QT1JUX01JTUVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWltZUNvbmZpZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfTkFNRV9TVFJFQU1fU0FNUExFX1JBVEVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgNDQxMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5pblJhbmdlKDEsIDY1NTM1MCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9OQU1FX1NUUkVBTV9DSEFOTkVMX0NPVU5UX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuaW5SYW5nZSgxLCA4KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9OQU1FX1NUUkVBTV9CSVRSQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMkJpdHJhdGVUdW5pbmc6OmlucHV0KDB1LCA3NjgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDEsIDIxMDAwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMzI3NjgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVBjbUVuY29kaW5nSW5mbywgQzJfUEFSQU1LRVlfUENNX0VOQ09ESU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QY21FbmNvZGluZ0luZm86Om91dHB1dCgwdSwgQzJDb25maWc6OlBDTV8xNikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtUGNtRW5jb2RpbmdJbmZvLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBDTV8xNiwKKyAgICAgICAgICAgICAgICAgICAgIC8vIEMyQ29uZmlnOjpQQ01fOCwKKyAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQQ01fRkxPQVR9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVBjbUVuY29kaW5nSW5mbyk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBpbnQzMl90IGdldFBjbUVuY29kaW5nSW5mbygpIGNvbnN0IHsgcmV0dXJuIG1QY21FbmNvZGluZ0luZm8tPnZhbHVlOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRm9ybWF0Q29uZmlnOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJpdHJhdGVUdW5pbmc6OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGNtRW5jb2RpbmdJbmZvOjpvdXRwdXQ+IG1QY21FbmNvZGluZ0luZm87Cit9OworCitDMlNvZnRGbGFjRGVjOjpDMlNvZnRGbGFjRGVjKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1GTEFDRGVjb2RlcihudWxscHRyKSB7Cit9CisKK0MyU29mdEZsYWNEZWM6On5DMlNvZnRGbGFjRGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRGbGFjRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9OT19NRU1PUlk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEZsYWNEZWM6Om9uU3RvcCgpIHsKKyAgICBpZiAobUZMQUNEZWNvZGVyKSBtRkxBQ0RlY29kZXItPmZsdXNoKCk7CisgICAgbWVtc2V0KCZtU3RyZWFtSW5mbywgMCwgc2l6ZW9mKG1TdHJlYW1JbmZvKSk7CisgICAgbUhhc1N0cmVhbUluZm8gPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEZsYWNEZWM6Om9uUmVzZXQoKSB7CisgICAgbUlucHV0QnVmZmVyQ291bnQgPSAwOworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdEZsYWNEZWM6Om9uUmVsZWFzZSgpIHsKKyAgICBtSW5wdXRCdWZmZXJDb3VudCA9IDA7CisgICAgaWYgKG1GTEFDRGVjb2RlcikgZGVsZXRlIG1GTEFDRGVjb2RlcjsKKyAgICBtRkxBQ0RlY29kZXIgPSBudWxscHRyOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRGbGFjRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBvblN0b3AoKTsKK30KKworc3RhdHVzX3QgQzJTb2Z0RmxhY0RlYzo6aW5pdERlY29kZXIoKSB7CisgICAgaWYgKG1GTEFDRGVjb2RlcikgeworICAgICAgICBkZWxldGUgbUZMQUNEZWNvZGVyOworICAgIH0KKyAgICBtRkxBQ0RlY29kZXIgPSBGTEFDRGVjb2Rlcjo6Q3JlYXRlKCk7CisgICAgaWYgKCFtRkxBQ0RlY29kZXIpIHsKKyAgICAgICAgQUxPR0UoImluaXREZWNvZGVyOiBmYWlsZWQgdG8gY3JlYXRlIEZMQUNEZWNvZGVyIik7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgbWVtc2V0KCZtU3RyZWFtSW5mbywgMCwgc2l6ZW9mKG1TdHJlYW1JbmZvKSk7CisgICAgbUhhc1N0cmVhbUluZm8gPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbUlucHV0QnVmZmVyQ291bnQgPSAwOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0aWMgdm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKworLy8gKFRPRE8pIGFkZCBtdWx0aWZyYW1lIHN1cHBvcnQsIGluIHBsdWdpbiBhbmQgRkxBQ0RlY29kZXIuY3BwCit2b2lkIEMyU29mdEZsYWNEZWM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIGVvcyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDA7CisgICAgYm9vbCBjb2RlY0NvbmZpZyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMDsKKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQiLCBpblNpemUsCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKworICAgIGlmIChpblNpemUgPT0gMCkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAwICYmICFjb2RlY0NvbmZpZykgeworICAgICAgICBBTE9HVigiRmlyc3QgZnJhbWUgaGFzIHRvIGluY2x1ZGUgY29uZmlndXJhdGlvbiwgZm9yY2luZyBjb25maWciKTsKKyAgICAgICAgY29kZWNDb25maWcgPSB0cnVlOworICAgIH0KKworICAgIHVpbnQ4X3QgKmlucHV0ID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0KTsKKyAgICBpZiAoY29kZWNDb25maWcpIHsKKyAgICAgICAgc3RhdHVzX3QgZGVjb2RlckVyciA9IG1GTEFDRGVjb2Rlci0+cGFyc2VNZXRhZGF0YShpbnB1dCwgaW5TaXplKTsKKyAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gT0sgJiYgZGVjb2RlckVyciAhPSBXT1VMRF9CTE9DSykgeworICAgICAgICAgICAgQUxPR0UoInByb2Nlc3M6IEZMQUNEZWNvZGVyIHBhcnNlTWV0YURhdGEgcmV0dXJucyBlcnJvciAlZCIsIGRlY29kZXJFcnIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1JbnB1dEJ1ZmZlckNvdW50Kys7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZWNvZGVyRXJyID09IFdPVUxEX0JMT0NLKSB7CisgICAgICAgICAgICBBTE9HVigicHJvY2VzczogcGFyc2VNZXRhZGF0YSBpcyBCbG9ja2luZywgQ29udGludWUgJWQiLCBkZWNvZGVyRXJyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TdHJlYW1JbmZvID0gbUZMQUNEZWNvZGVyLT5nZXRTdHJlYW1JbmZvKCk7CisgICAgICAgICAgICBpZiAobVN0cmVhbUluZm8uc2FtcGxlX3JhdGUgJiYgbVN0cmVhbUluZm8ubWF4X2Jsb2Nrc2l6ZSAmJgorICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLmNoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgbUhhc1N0cmVhbUluZm8gPSB0cnVlOworICAgICAgICAgICAgICAgIEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCBzYW1wbGVSYXRlSW5mbygKKyAgICAgICAgICAgICAgICAgICAgMHUsIG1TdHJlYW1JbmZvLnNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgICAgICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCBjaGFubmVsQ291bnRJbmZvKAorICAgICAgICAgICAgICAgICAgICAwdSwgbVN0cmVhbUluZm8uY2hhbm5lbHMpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICAgICAgICAgICAgICBtSW50Zi0+Y29uZmlnKHsmc2FtcGxlUmF0ZUluZm8sICZjaGFubmVsQ291bnRJbmZvfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoc2FtcGxlUmF0ZUluZm8pKTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KGNoYW5uZWxDb3VudEluZm8pKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ29uZmlnIFVwZGF0ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR0QoInByb2Nlc3M6IGRlY29kZXIgY29uZmlndXJhdGlvbiA6ICVkIEh6LCAlZCBjaGFubmVscywgJWQgc2FtcGxlcywiCisgICAgICAgICAgICAgICAgICAiICVkIGJsb2NrIHNpemUiLCBtU3RyZWFtSW5mby5zYW1wbGVfcmF0ZSwgbVN0cmVhbUluZm8uY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAoaW50KW1TdHJlYW1JbmZvLnRvdGFsX3NhbXBsZXMsIG1TdHJlYW1JbmZvLm1heF9ibG9ja3NpemUpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBib29sIG91dHB1dEZsb2F0ID0gbUludGYtPmdldFBjbUVuY29kaW5nSW5mbygpID09IEMyQ29uZmlnOjpQQ01fRkxPQVQ7CisgICAgY29uc3Qgc2l6ZV90IHNhbXBsZVNpemUgPSBvdXRwdXRGbG9hdCA/IHNpemVvZihmbG9hdCkgOiBzaXplb2Yoc2hvcnQpOworICAgIHNpemVfdCBvdXRTaXplID0gbUhhc1N0cmVhbUluZm8gPworICAgICAgICAgICAgbVN0cmVhbUluZm8ubWF4X2Jsb2Nrc2l6ZSAqIG1TdHJlYW1JbmZvLmNoYW5uZWxzICogc2FtcGxlU2l6ZQorICAgICAgICAgIDoga01heEJsb2NrU2l6ZSAqIEZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHMgKiBzYW1wbGVTaXplOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKG91dFNpemUsIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBkZWNvZGVyRXJyID0gbUZMQUNEZWNvZGVyLT5kZWNvZGVPbmVGcmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgaW5TaXplLCB3Vmlldy5kYXRhKCksICZvdXRTaXplLCBvdXRwdXRGbG9hdCk7CisgICAgaWYgKGRlY29kZXJFcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoInByb2Nlc3M6IEZMQUNEZWNvZGVyIGRlY29kZU9uZUZyYW1lIHJldHVybnMgZXJyb3IgJWQiLCBkZWNvZGVyRXJyKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUlucHV0QnVmZmVyQ291bnQrKzsKKyAgICBBTE9HVigib3V0IGJ1ZmZlciBhdHRyLiBzaXplICV6dSIsIG91dFNpemUpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgMCwgb3V0U2l6ZSkpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RmxhY0RlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICBpZiAobUZMQUNEZWNvZGVyKSBtRkxBQ0RlY29kZXItPmZsdXNoKCk7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NsYXNzIEMyU29mdEZsYWNEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0RmxhY0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRGbGFjRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRGbGFjRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEZsYWNEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRGbGFjRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0RmxhY0RlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEZsYWNEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ5MWJmZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0RlYy5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9GTEFDX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfRkxBQ19ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJGTEFDRGVjb2Rlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRGbGFjRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEZsYWNEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRGbGFjRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrTWF4QmxvY2tTaXplICAgPSA0MDk2CisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgRkxBQ0RlY29kZXIgKm1GTEFDRGVjb2RlcjsKKyAgICBGTEFDX19TdHJlYW1NZXRhZGF0YV9TdHJlYW1JbmZvIG1TdHJlYW1JbmZvOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1IYXNTdHJlYW1JbmZvOworICAgIHNpemVfdCBtSW5wdXRCdWZmZXJDb3VudDsKKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRGbGFjRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0ZMQUNfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWEzNWMyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRW5jLmNwcApAQCAtMCwwICsxLDQ4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0RmxhY0VuYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdEZsYWNFbmMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDMlNvZnRGbGFjRW5jOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX05BTUVfSU5QVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Gb3JtYXRDb25maWc6OmlucHV0KDB1LCBDMkZvcm1hdEF1ZGlvKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9OQU1FX09VVFBVVF9TVFJFQU1fRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0KDB1LCBDMkZvcm1hdENvbXByZXNzZWQpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfTkFNRV9JTlBVVF9QT1JUX01JTUVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9OQU1FX09VVFBVVF9QT1JUX01JTUVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWltZUNvbmZpZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9OQU1FX1NUUkVBTV9TQU1QTEVfUkFURV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQoMHUsIDQ0MTAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuaW5SYW5nZSgxLCA2NTUzNTApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX05BTUVfU1RSRUFNX0NIQU5ORUxfQ09VTlRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgMil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX05BTUVfU1RSRUFNX0JJVFJBVEVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyQml0cmF0ZVR1bmluZzo6b3V0cHV0KDB1LCA3NjgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDEsIDIxMDAwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDQ2MDgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVBjbUVuY29kaW5nSW5mbywgQzJfUEFSQU1LRVlfUENNX0VOQ09ESU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QY21FbmNvZGluZ0luZm86OmlucHV0KDB1LCBDMkNvbmZpZzo6UENNXzE2KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1QY21FbmNvZGluZ0luZm8sIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UENNXzE2LAorICAgICAgICAgICAgICAgICAgICAgLy8gQzJDb25maWc6OlBDTV84LAorICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBDTV9GTE9BVH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptUGNtRW5jb2RpbmdJbmZvKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHVpbnQzMl90IGdldFNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtU2FtcGxlUmF0ZS0+dmFsdWU7IH0KKyAgICB1aW50MzJfdCBnZXRDaGFubmVsQ291bnQoKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbENvdW50LT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldEJpdHJhdGUoKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZS0+dmFsdWU7IH0KKyAgICBpbnQzMl90IGdldFBjbUVuY29kaW5nSW5mbygpIGNvbnN0IHsgcmV0dXJuIG1QY21FbmNvZGluZ0luZm8tPnZhbHVlOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRm9ybWF0Q29uZmlnOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86OmlucHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCaXRyYXRlVHVuaW5nOjpvdXRwdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QY21FbmNvZGluZ0luZm86OmlucHV0PiBtUGNtRW5jb2RpbmdJbmZvOworfTsKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5mbGFjLmVuY29kZXIiOworCitDMlNvZnRGbGFjRW5jOjpDMlNvZnRGbGFjRW5jKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1GbGFjU3RyZWFtRW5jb2RlcihudWxscHRyKSwKKyAgICAgIG1JbnB1dEJ1ZmZlclBjbTMyKG51bGxwdHIpIHsKK30KKworQzJTb2Z0RmxhY0VuYzo6fkMyU29mdEZsYWNFbmMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEZsYWNFbmM6Om9uSW5pdCgpIHsKKyAgICBtRmxhY1N0cmVhbUVuY29kZXIgPSBGTEFDX19zdHJlYW1fZW5jb2Rlcl9uZXcoKTsKKyAgICBpZiAoIW1GbGFjU3RyZWFtRW5jb2RlcikgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKworICAgIG1JbnB1dEJ1ZmZlclBjbTMyID0gKEZMQUNfX2ludDMyKikgbWFsbG9jKAorICAgICAgICAgICAga0luQmxvY2tTaXplICoga01heE51bUNoYW5uZWxzICogc2l6ZW9mKEZMQUNfX2ludDMyKSk7CisgICAgaWYgKCFtSW5wdXRCdWZmZXJQY20zMikgcmV0dXJuIEMyX05PX01FTU9SWTsKKworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtQ29tcHJlc3Npb25MZXZlbCA9IEZMQUNfQ09NUFJFU1NJT05fTEVWRUxfREVGQVVMVDsKKyAgICBtSXNGaXJzdEZyYW1lID0gdHJ1ZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMHVsbDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDB1OworICAgIG1FbmNvZGVyV3JpdGVEYXRhID0gZmFsc2U7CisgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgPSAwOworICAgIG1IZWFkZXJPZmZzZXQgPSAwOworICAgIG1Xcm90ZUhlYWRlciA9IGZhbHNlOworCisgICAgc3RhdHVzX3QgZXJyID0gY29uZmlndXJlRW5jb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRDsKK30KKwordm9pZCBDMlNvZnRGbGFjRW5jOjpvblJlbGVhc2UoKSB7CisgICAgaWYgKG1GbGFjU3RyZWFtRW5jb2RlcikgeworICAgICAgICBGTEFDX19zdHJlYW1fZW5jb2Rlcl9kZWxldGUobUZsYWNTdHJlYW1FbmNvZGVyKTsKKyAgICAgICAgbUZsYWNTdHJlYW1FbmNvZGVyID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBpZiAobUlucHV0QnVmZmVyUGNtMzIpIHsKKyAgICAgICAgZnJlZShtSW5wdXRCdWZmZXJQY20zMik7CisgICAgICAgIG1JbnB1dEJ1ZmZlclBjbTMyID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3ZvaWQgQzJTb2Z0RmxhY0VuYzo6b25SZXNldCgpIHsKKyAgICBtQ29tcHJlc3Npb25MZXZlbCA9IEZMQUNfQ09NUFJFU1NJT05fTEVWRUxfREVGQVVMVDsKKyAgICAodm9pZCkgb25TdG9wKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEZsYWNFbmM6Om9uU3RvcCgpIHsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbUlzRmlyc3RGcmFtZSA9IHRydWU7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDB1bGw7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwdTsKKyAgICBtRW5jb2RlcldyaXRlRGF0YSA9IGZhbHNlOworICAgIG1FbmNvZGVyUmV0dXJuZWROYkJ5dGVzID0gMDsKKyAgICBtSGVhZGVyT2Zmc2V0ID0gMDsKKyAgICBtV3JvdGVIZWFkZXIgPSBmYWxzZTsKKworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IGRyYWluKERSQUlOX0NPTVBPTkVOVF9OT19FT1MsIG51bGxwdHIpOworICAgIGlmIChDMl9PSyAhPSBzdGF0dXMpIHJldHVybiBzdGF0dXM7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBjb25maWd1cmVFbmNvZGVyKCk7CisgICAgaWYgKGVyciAhPSBPSykgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEZsYWNFbmM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCitzdGF0aWMgdm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7Cit9CisKK3ZvaWQgQzJTb2Z0RmxhY0VuYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkLCBmbGFncyAleCIsCisgICAgICAgICAgICAgIGluU2l6ZSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLAorICAgICAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLCB3b3JrLT5pbnB1dC5mbGFncyk7CisgICAgaWYgKG1Jc0ZpcnN0RnJhbWUgJiYgaW5TaXplKSB7CisgICAgICAgIG1BbmNob3JUaW1lU3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdWxsKCk7CisgICAgICAgIG1Jc0ZpcnN0RnJhbWUgPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIW1Xcm90ZUhlYWRlcikgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJlYW1Dc2RJbmZvOjpvdXRwdXQ+IGNzZCA9CisgICAgICAgICAgICBDMlN0cmVhbUNzZEluZm86Om91dHB1dDo6QWxsb2NVbmlxdWUobUhlYWRlck9mZnNldCwgMHUpOworICAgICAgICBpZiAoIWNzZCkgeworICAgICAgICAgICAgQUxPR0UoIkNTRCBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoY3NkLT5tLnZhbHVlLCBtSGVhZGVyLCBtSGVhZGVyT2Zmc2V0KTsKKyAgICAgICAgQUxPR1YoInB1dCBjc2QsICVkIGJ5dGVzIiwgbUhlYWRlck9mZnNldCk7CisKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soc3RkOjptb3ZlKGNzZCkpOworICAgICAgICBtV3JvdGVIZWFkZXIgPSB0cnVlOworICAgIH0KKworICAgIGNvbnN0IHVpbnQzMl90IHNhbXBsZVJhdGUgPSBtSW50Zi0+Z2V0U2FtcGxlUmF0ZSgpOworICAgIGNvbnN0IHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IG1JbnRmLT5nZXRDaGFubmVsQ291bnQoKTsKKyAgICBjb25zdCBib29sIGlucHV0RmxvYXQgPSBtSW50Zi0+Z2V0UGNtRW5jb2RpbmdJbmZvKCkgPT0gQzJDb25maWc6OlBDTV9GTE9BVDsKKyAgICBjb25zdCB1bnNpZ25lZCBzYW1wbGVTaXplID0gaW5wdXRGbG9hdCA/IHNpemVvZihmbG9hdCkgOiBzaXplb2YoaW50MTZfdCk7CisgICAgY29uc3QgdW5zaWduZWQgZnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogc2FtcGxlU2l6ZTsKKyAgICBjb25zdCB1aW50NjRfdCBvdXRUaW1lU3RhbXAgPSBtUHJvY2Vzc2VkU2FtcGxlcyAqIDEwMDAwMDBsbCAvIHNhbXBsZVJhdGU7CisKKyAgICBzaXplX3Qgb3V0Q2FwYWNpdHkgPSBpblNpemU7CisgICAgb3V0Q2FwYWNpdHkgKz0gbUJsb2NrU2l6ZSAqIGZyYW1lU2l6ZTsKKworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKG91dENhcGFjaXR5LCB1c2FnZSwgJm1PdXRwdXRCbG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IG1PdXRwdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtRW5jb2RlcldyaXRlRGF0YSA9IHRydWU7CisgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgPSAwOworICAgIHNpemVfdCBpblBvcyA9IDA7CisgICAgd2hpbGUgKGluUG9zIDwgaW5TaXplKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluUHRyID0gclZpZXcuZGF0YSgpICsgaW5PZmZzZXQ7CisgICAgICAgIGNvbnN0IHNpemVfdCBwcm9jZXNzU2l6ZSA9IE1JTihrSW5CbG9ja1NpemUgKiBmcmFtZVNpemUsIChpblNpemUgLSBpblBvcykpOworICAgICAgICBjb25zdCB1bnNpZ25lZCBuYklucHV0RnJhbWVzID0gcHJvY2Vzc1NpemUgLyBmcmFtZVNpemU7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIG5iSW5wdXRTYW1wbGVzID0gcHJvY2Vzc1NpemUgLyBzYW1wbGVTaXplOworCisgICAgICAgIEFMT0dWKCJhYm91dCB0byBlbmNvZGUgJXp1IGJ5dGVzIiwgcHJvY2Vzc1NpemUpOworICAgICAgICBpZiAoaW5wdXRGbG9hdCkgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgKiBjb25zdCBwY21GbG9hdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQgKj4oaW5QdHIgKyBpblBvcyk7CisgICAgICAgICAgICBtZW1jcHlfdG9fcThfMjNfZnJvbV9mbG9hdF93aXRoX2NsYW1wKG1JbnB1dEJ1ZmZlclBjbTMyLCBwY21GbG9hdCwgbmJJbnB1dFNhbXBsZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqIGNvbnN0IHBjbTE2ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQxNl90ICo+KGluUHRyICsgaW5Qb3MpOworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5iSW5wdXRTYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXJQY20zMltpXSA9IChGTEFDX19pbnQzMikgcGNtMTZbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBGTEFDX19ib29sIG9rID0gRkxBQ19fc3RyZWFtX2VuY29kZXJfcHJvY2Vzc19pbnRlcmxlYXZlZCgKKyAgICAgICAgICAgICAgICBtRmxhY1N0cmVhbUVuY29kZXIsIG1JbnB1dEJ1ZmZlclBjbTMyLCBuYklucHV0RnJhbWVzKTsKKyAgICAgICAgaWYgKCFvaykgeworICAgICAgICAgICAgQUxPR0UoImVycm9yIGVuY291bnRlcmVkIGR1cmluZyBlbmNvZGluZyIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIG1PdXRwdXRCbG9jay5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGluUG9zICs9IHByb2Nlc3NTaXplOworICAgIH0KKyAgICBpZiAoZW9zICYmIChDMl9PSyAhPSBkcmFpbihEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsIHBvb2wpKSkgeworICAgICAgICBBTE9HRSgiZXJyb3IgZW5jb3VudGVyZWQgZHVyaW5nIGVuY29kaW5nIik7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgbU91dHB1dEJsb2NrLnJlc2V0KCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICBpZiAobUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgIT0gMCkgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IGNyZWF0ZUxpbmVhckJ1ZmZlcihzdGQ6Om1vdmUobU91dHB1dEJsb2NrKSwgMCwgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wID0gbUFuY2hvclRpbWVTdGFtcCArIG91dFRpbWVTdGFtcDsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiZW5jb2RlciBwcm9jZXNzX2ludGVybGVhdmVkIHJldHVybmVkIHdpdGhvdXQgZGF0YSB0byB3cml0ZSIpOworICAgIH0KKyAgICBtT3V0cHV0QmxvY2sgPSBudWxscHRyOworICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgfQorICAgIG1FbmNvZGVyV3JpdGVEYXRhID0gZmFsc2U7CisgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgPSAwOworfQorCitGTEFDX19TdHJlYW1FbmNvZGVyV3JpdGVTdGF0dXMgQzJTb2Z0RmxhY0VuYzo6b25FbmNvZGVkRmxhY0F2YWlsYWJsZSgKKyAgICAgICAgY29uc3QgRkxBQ19fYnl0ZSBidWZmZXJbXSwgc2l6ZV90IGJ5dGVzLCB1bnNpZ25lZCBzYW1wbGVzLAorICAgICAgICB1bnNpZ25lZCBjdXJyZW50X2ZyYW1lKSB7CisgICAgKHZvaWQpIGN1cnJlbnRfZnJhbWU7CisgICAgQUxPR1YoIiVzIChieXRlcz0lenUsIHNhbXBsZXM9JXUsIGN1cnJfZnJhbWU9JXUpIiwgX19mdW5jX18sIGJ5dGVzLCBzYW1wbGVzLAorICAgICAgICAgIGN1cnJlbnRfZnJhbWUpOworCisgICAgaWYgKHNhbXBsZXMgPT0gMCkgeworICAgICAgICBBTE9HSSgic2F2aW5nICV6dSBieXRlcyBvZiBoZWFkZXIiLCBieXRlcyk7CisgICAgICAgIG1lbWNweShtSGVhZGVyICsgbUhlYWRlck9mZnNldCwgYnVmZmVyLCBieXRlcyk7CisgICAgICAgIG1IZWFkZXJPZmZzZXQgKz0gYnl0ZXM7Ly8gd2lsbCBjb250YWluIGhlYWRlciBzaXplIHdoZW4gZmluaXNoZWQgcmVjZWl2aW5nIGhlYWRlcgorICAgICAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0VOQ09ERVJfV1JJVEVfU1RBVFVTX09LOworICAgIH0KKworICAgIGlmICgoc2FtcGxlcyA9PSAwKSB8fCAhbUVuY29kZXJXcml0ZURhdGEpIHsKKyAgICAgICAgLy8gY2FsbGVkIGJ5IHRoZSBlbmNvZGVyIGJlY2F1c2UgdGhlcmUncyBoZWFkZXIgZGF0YSB0byBzYXZlLCBidXQgaXQncyBub3QgdGhlIHJvbGUKKyAgICAgICAgLy8gb2YgdGhpcyBjb21wb25lbnQgKHVubGVzcyBXUklURV9GTEFDX0hFQURFUl9JTl9GSVJTVF9CVUZGRVIgaXMgZGVmaW5lZCkKKyAgICAgICAgQUxPR1YoImlnbm9yaW5nICV6dSBieXRlcyBvZiBoZWFkZXIgZGF0YSAoc2FtcGxlcz0lZCkiLCBieXRlcywgc2FtcGxlcyk7CisgICAgICAgIHJldHVybiBGTEFDX19TVFJFQU1fRU5DT0RFUl9XUklURV9TVEFUVVNfT0s7CisgICAgfQorCisgICAgLy8gd3JpdGUgZW5jb2RlZCBkYXRhCisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBtT3V0cHV0QmxvY2stPm1hcCgpLmdldCgpOworICAgIHVpbnQ4X3QqIG91dERhdGEgPSB3Vmlldy5kYXRhKCk7CisgICAgQUxPR1YoIndyaXRpbmcgJXp1IGJ5dGVzIG9mIGVuY29kZWQgZGF0YSBvbiBvdXRwdXQiLCBieXRlcyk7CisgICAgLy8gaW5jcmVtZW50IG1Qcm9jZXNzZWRTYW1wbGVzIHRvIG1haW50YWluIGF1ZGlvIHN5bmNocm9uaXphdGlvbiBkdXJpbmcKKyAgICAvLyBwbGF5IGJhY2sKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyArPSBzYW1wbGVzOworICAgIGlmIChieXRlcyArIG1FbmNvZGVyUmV0dXJuZWROYkJ5dGVzID4gbU91dHB1dEJsb2NrLT5jYXBhY2l0eSgpKSB7CisgICAgICAgIEFMT0dFKCJub3QgZW5vdWdoIHNwYWNlIGxlZnQgdG8gd3JpdGUgZW5jb2RlZCBkYXRhLCBkcm9wcGluZyAlenUgYnl0ZXMiLCBieXRlcyk7CisgICAgICAgIC8vIGEgZmF0YWwgZXJyb3Igd291bGQgc3RvcCB0aGUgZW5jb2RpbmcKKyAgICAgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9FTkNPREVSX1dSSVRFX1NUQVRVU19PSzsKKyAgICB9CisgICAgbWVtY3B5KG91dERhdGEgKyBtRW5jb2RlclJldHVybmVkTmJCeXRlcywgYnVmZmVyLCBieXRlcyk7CisgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgKz0gYnl0ZXM7CisgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9FTkNPREVSX1dSSVRFX1NUQVRVU19PSzsKK30KKworCitzdGF0dXNfdCBDMlNvZnRGbGFjRW5jOjpjb25maWd1cmVFbmNvZGVyKCkgeworICAgIEFMT0dWKCIlcyBudW1DaGFubmVsPSVkLCBzYW1wbGVSYXRlPSVkIiwgX19mdW5jX18sIG1JbnRmLT5nZXRDaGFubmVsQ291bnQoKSwgbUludGYtPmdldFNhbXBsZVJhdGUoKSk7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8ICFtRmxhY1N0cmVhbUVuY29kZXIpIHsKKyAgICAgICAgQUxPR0UoImNhbid0IGNvbmZpZ3VyZSBlbmNvZGVyOiBubyBlbmNvZGVyIG9yIGludmFsaWQgc3RhdGUiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgY29uc3QgYm9vbCBpbnB1dEZsb2F0ID0gbUludGYtPmdldFBjbUVuY29kaW5nSW5mbygpID09IEMyQ29uZmlnOjpQQ01fRkxPQVQ7CisgICAgY29uc3QgaW50IGJpdHNQZXJTYW1wbGUgPSBpbnB1dEZsb2F0ID8gMjQgOiAxNjsKKyAgICBGTEFDX19ib29sIG9rID0gdHJ1ZTsKKyAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9jaGFubmVscyhtRmxhY1N0cmVhbUVuY29kZXIsIG1JbnRmLT5nZXRDaGFubmVsQ291bnQoKSk7CisgICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfc2FtcGxlX3JhdGUobUZsYWNTdHJlYW1FbmNvZGVyLCBtSW50Zi0+Z2V0U2FtcGxlUmF0ZSgpKTsKKyAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9iaXRzX3Blcl9zYW1wbGUobUZsYWNTdHJlYW1FbmNvZGVyLCBiaXRzUGVyU2FtcGxlKTsKKyAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9jb21wcmVzc2lvbl9sZXZlbChtRmxhY1N0cmVhbUVuY29kZXIsIG1Db21wcmVzc2lvbkxldmVsKTsKKyAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF92ZXJpZnkobUZsYWNTdHJlYW1FbmNvZGVyLCBmYWxzZSk7CisgICAgaWYgKCFvaykgeworICAgICAgICBBTE9HRSgidW5rbm93biBlcnJvciB3aGVuIGNvbmZpZ3VyaW5nIGVuY29kZXIiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgb2sgJj0gRkxBQ19fU1RSRUFNX0VOQ09ERVJfSU5JVF9TVEFUVVNfT0sgPT0KKyAgICAgICAgICAgIEZMQUNfX3N0cmVhbV9lbmNvZGVyX2luaXRfc3RyZWFtKG1GbGFjU3RyZWFtRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgZmxhY0VuY29kZXJXcml0ZUNhbGxiYWNrICAgIC8qd3JpdGVfY2FsbGJhY2sqLywKKyAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKnNlZWtfY2FsbGJhY2sqLywKKyAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKnRlbGxfY2FsbGJhY2sqLywKKyAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKm1ldGFkYXRhX2NhbGxiYWNrKi8sCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopIHRoaXMgLypjbGllbnRfZGF0YSovKTsKKworICAgIGlmICghb2spIHsKKyAgICAgICAgQUxPR0UoInVua25vd24gZXJyb3Igd2hlbiBjb25maWd1cmluZyBlbmNvZGVyIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIG1CbG9ja1NpemUgPSBGTEFDX19zdHJlYW1fZW5jb2Rlcl9nZXRfYmxvY2tzaXplKG1GbGFjU3RyZWFtRW5jb2Rlcik7CisKKyAgICBBTE9HVigiZW5jb2RlciBzdWNjZXNzZnVsbHkgY29uZmlndXJlZCIpOworICAgIHJldHVybiBPSzsKK30KKworRkxBQ19fU3RyZWFtRW5jb2RlcldyaXRlU3RhdHVzIEMyU29mdEZsYWNFbmM6OmZsYWNFbmNvZGVyV3JpdGVDYWxsYmFjaygKKyAgICAgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbUVuY29kZXIgKiwKKyAgICAgICAgICAgIGNvbnN0IEZMQUNfX2J5dGUgYnVmZmVyW10sCisgICAgICAgICAgICBzaXplX3QgYnl0ZXMsCisgICAgICAgICAgICB1bnNpZ25lZCBzYW1wbGVzLAorICAgICAgICAgICAgdW5zaWduZWQgY3VycmVudF9mcmFtZSwKKyAgICAgICAgICAgIHZvaWQgKmNsaWVudF9kYXRhKSB7CisgICAgcmV0dXJuICgoQzJTb2Z0RmxhY0VuYyopIGNsaWVudF9kYXRhKS0+b25FbmNvZGVkRmxhY0F2YWlsYWJsZSgKKyAgICAgICAgICAgIGJ1ZmZlciwgYnl0ZXMsIHNhbXBsZXMsIGN1cnJlbnRfZnJhbWUpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRGbGFjRW5jOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgc3dpdGNoIChkcmFpbk1vZGUpIHsKKyAgICAgICAgY2FzZSBOT19EUkFJTjoKKyAgICAgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICBjYXNlIERSQUlOX0NIQUlOOgorICAgICAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgICAgICBjYXNlIERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUzoKKyAgICAgICAgICAgIC8vIFRPRE86IFRoaXMgZmxhZyBpcyBub3QgYmVpbmcgc2VudCBiYWNrIHRvIHRoZSBjbGllbnQKKyAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGl0ZW1zIGluIFBlbmRpbmdXb3JrIHF1ZXVlIGFzIGFsbCB0aGUKKyAgICAgICAgICAgIC8vIGlucHV0cyBhcmUgYmVpbmcgc2VudCBiYWNrIHdpdGggZW1wdHl3b3JrIG9yIHZhbGlkIGVuY29kZWQgZGF0YQorICAgICAgICAgICAgLy8gbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIGNhc2UgRFJBSU5fQ09NUE9ORU5UX05PX0VPUzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisgICAgRkxBQ19fYm9vbCBvayA9IEZMQUNfX3N0cmVhbV9lbmNvZGVyX2ZpbmlzaChtRmxhY1N0cmVhbUVuY29kZXIpOworICAgIGlmICghb2spIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgbUlzRmlyc3RGcmFtZSA9IHRydWU7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDB1bGw7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwdTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworY2xhc3MgQzJTb2Z0RmxhY0VuY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRGbGFjRW5jRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEZsYWNFbmMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRGbGFjRW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEZsYWNFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRGbGFjRW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0RmxhY0VuY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Citwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRGbGFjRW5jRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNFbmMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0VuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZjMwNWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNFbmMuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfRkxBQ19FTkNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0ZMQUNfRU5DX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSAiRkxBQy9zdHJlYW1fZW5jb2Rlci5oIgorCisjZGVmaW5lIEZMQUNfQ09NUFJFU1NJT05fTEVWRUxfTUlOICAgICAwCisjZGVmaW5lIEZMQUNfQ09NUFJFU1NJT05fTEVWRUxfREVGQVVMVCA1CisjZGVmaW5lIEZMQUNfQ09NUFJFU1NJT05fTEVWRUxfTUFYICAgICA4CisKKyNkZWZpbmUgRkxBQ19IRUFERVJfU0laRSAgICAgICAgICAgICAgIDEyOAorCisjZGVmaW5lIE1JTihhLCBiKSAgICAgICAgICAgICAgICAgICAgICAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQzJTb2Z0RmxhY0VuYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CitwdWJsaWM6CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRGbGFjRW5jKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdEZsYWNFbmMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RhdHVzX3QgY29uZmlndXJlRW5jb2RlcigpOworICAgIHN0YXRpYyBGTEFDX19TdHJlYW1FbmNvZGVyV3JpdGVTdGF0dXMgZmxhY0VuY29kZXJXcml0ZUNhbGxiYWNrKAorICAgICAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRW5jb2RlciAqZW5jb2RlciwgY29uc3QgRkxBQ19fYnl0ZSBidWZmZXJbXSwKKyAgICAgICAgICAgIHNpemVfdCBieXRlcywgdW5zaWduZWQgc2FtcGxlcywgdW5zaWduZWQgY3VycmVudF9mcmFtZSwKKyAgICAgICAgICAgIHZvaWQgKmNsaWVudF9kYXRhKTsKKyAgICBGTEFDX19TdHJlYW1FbmNvZGVyV3JpdGVTdGF0dXMgb25FbmNvZGVkRmxhY0F2YWlsYWJsZSgKKyAgICAgICAgICAgIGNvbnN0IEZMQUNfX2J5dGUgYnVmZmVyW10sIHNpemVfdCBieXRlcywgdW5zaWduZWQgc2FtcGxlcywKKyAgICAgICAgICAgIHVuc2lnbmVkIGN1cnJlbnRfZnJhbWUpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQga0luQmxvY2tTaXplID0gMTE1MjsKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQga01heE51bUNoYW5uZWxzID0gMjsKKyAgICBGTEFDX19TdHJlYW1FbmNvZGVyKiBtRmxhY1N0cmVhbUVuY29kZXI7CisgICAgRkxBQ19faW50MzIqIG1JbnB1dEJ1ZmZlclBjbTMyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBtT3V0cHV0QmxvY2s7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIHVpbnQzMl90IG1Db21wcmVzc2lvbkxldmVsOworICAgIHVpbnQzMl90IG1CbG9ja1NpemU7CisgICAgYm9vbCBtSXNGaXJzdEZyYW1lOworICAgIHVpbnQ2NF90IG1BbmNob3JUaW1lU3RhbXA7CisgICAgdWludDY0X3QgbVByb2Nlc3NlZFNhbXBsZXM7CisgICAgLy8gc2hvdWxkIHRoZSBkYXRhIHJlY2VpdmVkIGJ5IHRoZSBjYWxsYmFjayBiZSB3cml0dGVuIHRvIHRoZSBvdXRwdXQgcG9ydAorICAgIGJvb2wgbUVuY29kZXJXcml0ZURhdGE7CisgICAgc2l6ZV90IG1FbmNvZGVyUmV0dXJuZWROYkJ5dGVzOworICAgIHVuc2lnbmVkIG1IZWFkZXJPZmZzZXQ7CisgICAgYm9vbCBtV3JvdGVIZWFkZXI7CisgICAgY2hhciBtSGVhZGVyW0ZMQUNfSEVBREVSX1NJWkVdOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0RmxhY0VuYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9GTEFDX0VOQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViMWVmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvTk9USUNFCkBAIC0wLDAgKzEsMTkwIEBACisKKyAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZGU2OGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyMyBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9nNzExYWxhd2RlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0RzcxMURlYy5jcHAiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURBTEFXIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2c3MTFtbGF3ZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRHNzExRGVjLmNwcCJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQzJTb2Z0RzcxMURlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM3MWQ0NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQzJTb2Z0RzcxMURlYy5jcHAKQEAgLTAsMCArMSwzMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEc3MTFEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdEc3MTFEZWMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjaWZkZWYgQUxBVworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmc3MTEuYWxhdy5kZWNvZGVyIjsKKyNlbHNlCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuZzcxMS5tbGF3LmRlY29kZXIiOworI2VuZGlmCisKK2NsYXNzIEMyU29mdEc3MTFEZWM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX05BTUVfSU5QVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Gb3JtYXRDb25maWc6OmlucHV0KDB1LCBDMkZvcm1hdENvbXByZXNzZWQpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfTkFNRV9PVVRQVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Gb3JtYXRDb25maWc6Om91dHB1dCgwdSwgQzJGb3JtYXRBdWRpbykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX05BTUVfSU5QVVRfUE9SVF9NSU1FX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1pbWVDb25maWc6OmlucHV0PigKKyNpZmRlZiBBTEFXCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcKKyNlbmRpZgorICAgICAgICAgICAgICAgICkpLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9OQU1FX09VVFBVVF9QT1JUX01JTUVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWltZUNvbmZpZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfTkFNRV9TVFJFQU1fU0FNUExFX1JBVEVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgODAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmluUmFuZ2UoODAwMCwgNDgwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfTkFNRV9TVFJFQU1fQ0hBTk5FTF9DT1VOVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmVxdWFsVG8oMSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfTkFNRV9TVFJFQU1fQklUUkFURV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJCaXRyYXRlVHVuaW5nOjppbnB1dCgwdSwgNjQwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5lcXVhbFRvKDY0MDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgODE5MikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Gb3JtYXRDb25maWc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRm9ybWF0Q29uZmlnOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1pbWVDb25maWc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1pbWVDb25maWc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQml0cmF0ZVR1bmluZzo6aW5wdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKK307CisKK0MyU29mdEc3MTFEZWM6OkMyU29mdEc3MTFEZWMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpIHsKK30KKworQzJTb2Z0RzcxMURlYzo6fkMyU29mdEc3MTFEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEc3MTFEZWM6Om9uSW5pdCgpIHsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRHNzExRGVjOjpvblN0b3AoKSB7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRHNzExRGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdEc3MTFEZWM6Om9uUmVsZWFzZSgpIHsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RzcxMURlYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0RzcxMURlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIGVvcyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDA7CisgICAgaW50IG91dFNpemUgPSBpblNpemUgKiBzaXplb2YoaW50MTZfdCk7CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkIiwgaW5TaXplLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisKKyAgICBpZiAoaW5TaXplID09IDApIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50OF90ICppbnB1dHB0ciA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihyVmlldy5kYXRhKCkgKyBpbk9mZnNldCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sob3V0U2l6ZSwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQxNl90ICpvdXRwdXRwdHIgPSByZWludGVycHJldF9jYXN0PGludDE2X3QgKj4od1ZpZXcuZGF0YSgpKTsKKworI2lmZGVmIEFMQVcKKyAgICBEZWNvZGVBTGF3KG91dHB1dHB0ciwgaW5wdXRwdHIsIGluU2l6ZSk7CisjZWxzZQorICAgIERlY29kZU1MYXcob3V0cHV0cHRyLCBpbnB1dHB0ciwgaW5TaXplKTsKKyNlbmRpZgorCisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrKSk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworCisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEc3MTFEZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZCkgcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCisjaWZkZWYgQUxBVwordm9pZCBDMlNvZnRHNzExRGVjOjpEZWNvZGVBTGF3KAorICAgICAgICBpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKSB7CisgICAgd2hpbGUgKGluU2l6ZSA+IDApIHsKKyAgICAgICAgaW5TaXplLS07CisgICAgICAgIGludDMyX3QgeCA9ICppbisrOworCisgICAgICAgIGludDMyX3QgaXggPSB4IF4gMHg1NTsKKyAgICAgICAgaXggJj0gMHg3ZjsKKworICAgICAgICBpbnQzMl90IGlleHAgPSBpeCA+PiA0OworICAgICAgICBpbnQzMl90IG1hbnQgPSBpeCAmIDB4MGY7CisKKyAgICAgICAgaWYgKGlleHAgPiAwKSB7CisgICAgICAgICAgICBtYW50ICs9IDE2OworICAgICAgICB9CisKKyAgICAgICAgbWFudCA9IChtYW50IDw8IDQpICsgODsKKworICAgICAgICBpZiAoaWV4cCA+IDEpIHsKKyAgICAgICAgICAgIG1hbnQgPSBtYW50IDw8IChpZXhwIC0gMSk7CisgICAgICAgIH0KKworICAgICAgICAqb3V0KysgPSAoeCA+IDEyNykgPyBtYW50IDogLW1hbnQ7CisgICAgfQorfQorI2Vsc2UKK3ZvaWQgQzJTb2Z0RzcxMURlYzo6RGVjb2RlTUxhdygKKyAgICAgICAgaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSkgeworICAgIHdoaWxlIChpblNpemUgPiAwKSB7CisgICAgICAgIGluU2l6ZS0tOworICAgICAgICBpbnQzMl90IHggPSAqaW4rKzsKKworICAgICAgICBpbnQzMl90IG1hbnRpc3NhID0gfng7CisgICAgICAgIGludDMyX3QgZXhwb25lbnQgPSAobWFudGlzc2EgPj4gNCkgJiA3OworICAgICAgICBpbnQzMl90IHNlZ21lbnQgPSBleHBvbmVudCArIDE7CisgICAgICAgIG1hbnRpc3NhICY9IDB4MGY7CisKKyAgICAgICAgaW50MzJfdCBzdGVwID0gNCA8PCBzZWdtZW50OworCisgICAgICAgIGludDMyX3QgYWJzID0gKDB4ODBsIDw8IGV4cG9uZW50KSArIHN0ZXAgKiBtYW50aXNzYSArIHN0ZXAgLyAyIC0gNCAqIDMzOworCisgICAgICAgICpvdXQrKyA9ICh4IDwgMHg4MCkgPyAtYWJzIDogYWJzOworICAgIH0KK30KKyNlbmRpZgorCitjbGFzcyBDMlNvZnRHNzExRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEc3MTFEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0RzcxMURlYyhDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRHNzExRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0RzcxMURlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEc3MTFEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRHNzExRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0RzcxMURlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2U4ZmZjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0c3MTFfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9HNzExX0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRHNzExRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEc3MTFEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdEc3MTFEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7Citwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworCisjaWZkZWYgQUxBVworICAgIHZvaWQgRGVjb2RlQUxhdyhpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKTsKKyNlbHNlCisgICAgdm9pZCBEZWNvZGVNTGF3KGludDE2X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpblNpemUpOworI2VuZGlmCisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRHNzExRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0c3MTFfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9OT1RJQ0UgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWIxZWZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9OT1RJQ0UKQEAgLTAsMCArMSwxOTAgQEAKKworICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMzBjMDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQW5kcm9pZC5icApAQCAtMCwwICsxLDExIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2dzbWRlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0R3NtRGVjLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGliZ3NtIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQzJTb2Z0R3NtRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9DMlNvZnRHc21EZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMDFjNzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQzJTb2Z0R3NtRGVjLmNwcApAQCAtMCwwICsxLDMxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0R3NtRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRHc21EZWMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuZ3NtLmRlY29kZXIiOworCitjbGFzcyBDMlNvZnRHc21EZWM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+JiBoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9OQU1FX0lOUFVUX1NUUkVBTV9GT1JNQVRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtRm9ybWF0Q29uZmlnOjppbnB1dCgwdSwgQzJGb3JtYXRDb21wcmVzc2VkKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX05BTUVfT1VUUFVUX1NUUkVBTV9GT1JNQVRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtRm9ybWF0Q29uZmlnOjpvdXRwdXQoMHUsIEMyRm9ybWF0QXVkaW8pKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9OQU1FX0lOUFVUX1BPUlRfTUlNRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNaW1lQ29uZmlnOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19NU0dTTSkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9OQU1FX09VVFBVVF9QT1JUX01JTUVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWltZUNvbmZpZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfTkFNRV9TVFJFQU1fU0FNUExFX1JBVEVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgODAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmVxdWFsVG8oODAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9OQU1FX1NUUkVBTV9DSEFOTkVMX0NPVU5UX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuZXF1YWxUbygxKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9OQU1FX1NUUkVBTV9CSVRSQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMkJpdHJhdGVUdW5pbmc6OmlucHV0KDB1LCAxMzIwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmVxdWFsVG8oMTMyMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCAxMDI0IC8gTVNHU01fSU5fRlJNX1NaICogTVNHU01fSU5fRlJNX1NaKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZvcm1hdENvbmZpZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Gb3JtYXRDb25maWc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWltZUNvbmZpZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ+IG1TYW1wbGVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCaXRyYXRlVHVuaW5nOjppbnB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtSW5wdXRNYXhCdWZTaXplOworfTsKKworQzJTb2Z0R3NtRGVjOjpDMlNvZnRHc21EZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudCgKKyAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1Hc20obnVsbHB0cikgeworfQorCitDMlNvZnRHc21EZWM6On5DMlNvZnRHc21EZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEdzbURlYzo6b25Jbml0KCkgeworICAgIGlmICghbUdzbSkgbUdzbSA9IGdzbV9jcmVhdGUoKTsKKyAgICBpZiAoIW1Hc20pIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgaW50IG1zb3B0ID0gMTsKKyAgICAodm9pZClnc21fb3B0aW9uKG1Hc20sIEdTTV9PUFRfV0FWNDksICZtc29wdCk7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVvcyA9IGZhbHNlOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0R3NtRGVjOjpvblN0b3AoKSB7CisgICAgaWYgKG1Hc20pIHsKKyAgICAgICAgZ3NtX2Rlc3Ryb3kobUdzbSk7CisgICAgICAgIG1Hc20gPSBudWxscHRyOworICAgIH0KKyAgICBpZiAoIW1Hc20pIG1Hc20gPSBnc21fY3JlYXRlKCk7CisgICAgaWYgKCFtR3NtKSByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgIGludCBtc29wdCA9IDE7CisgICAgKHZvaWQpZ3NtX29wdGlvbihtR3NtLCBHU01fT1BUX1dBVjQ5LCAmbXNvcHQpOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0R3NtRGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdEdzbURlYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtR3NtKSB7CisgICAgICAgIGdzbV9kZXN0cm95KG1Hc20pOworICAgICAgICBtR3NtID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEdzbURlYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKK3N0YXRpYyBzaXplX3QgZGVjb2RlR1NNKGdzbSBoYW5kbGUsIGludDE2X3QgKm91dCwgc2l6ZV90IG91dENhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqaW4sIHNpemVfdCBpblNpemUpIHsKKyAgICBzaXplX3Qgb3V0U2l6ZSA9IDA7CisKKyAgICBpZiAoaW5TaXplICUgTVNHU01fSU5fRlJNX1NaID09IDAKKyAgICAgICAgICAgICYmIChpblNpemUgLyBNU0dTTV9JTl9GUk1fU1ogKiBNU0dTTV9PVVRfRlJNX1NaICogc2l6ZW9mKCpvdXQpCisgICAgICAgICAgICAgICAgICAgIDw9IG91dENhcGFjaXR5KSkgeworICAgICAgICB3aGlsZSAoaW5TaXplID4gMCkgeworICAgICAgICAgICAgZ3NtX2RlY29kZShoYW5kbGUsIGluLCBvdXQpOworICAgICAgICAgICAgaW4gKz0gRlJHU01fSU5fRlJNX1NaOworICAgICAgICAgICAgaW5TaXplIC09IEZSR1NNX0lOX0ZSTV9TWjsKKyAgICAgICAgICAgIG91dCArPSBGUkdTTV9PVVRfRlJNX1NaOworICAgICAgICAgICAgb3V0U2l6ZSArPSBGUkdTTV9PVVRfRlJNX1NaOworCisgICAgICAgICAgICBnc21fZGVjb2RlKGhhbmRsZSwgaW4sIG91dCk7CisgICAgICAgICAgICBpbiArPSBGUkdTTV9JTl9GUk1fU1pfTUlOVVNfMTsKKyAgICAgICAgICAgIGluU2l6ZSAtPSBGUkdTTV9JTl9GUk1fU1pfTUlOVVNfMTsKKyAgICAgICAgICAgIG91dCArPSBGUkdTTV9PVVRfRlJNX1NaOworICAgICAgICAgICAgb3V0U2l6ZSArPSBGUkdTTV9PVVRfRlJNX1NaOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG91dFNpemUgKiBzaXplb2YoaW50MTZfdCk7Cit9CisKK3ZvaWQgQzJTb2Z0R3NtRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkRW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHJWaWV3LmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaW5TaXplID09IDApIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVvcyA9IHRydWU7CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCIsIGluU2l6ZSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworCisgICAgc2l6ZV90IG91dENhcGFjaXR5ID0gKGluU2l6ZSAvIE1TR1NNX0lOX0ZSTV9TWiApICogTVNHU01fT1VUX0ZSTV9TWiAqIHNpemVvZihpbnQxNl90KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sob3V0Q2FwYWNpdHksIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MTZfdCAqb3V0cHV0ID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90ICo+KHdWaWV3LmRhdGEoKSk7CisgICAgdWludDhfdCAqaW5wdXQgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oclZpZXcuZGF0YSgpICsgaW5PZmZzZXQpOworICAgIHNpemVfdCBvdXRTaXplID0gZGVjb2RlR1NNKG1Hc20sIG91dHB1dCwgb3V0Q2FwYWNpdHksIGlucHV0LCBpblNpemUpOworICAgIGlmICghb3V0U2l6ZSkgeworICAgICAgICBBTE9HRSgiZW5jb3VudGVyZWQgaW1wcm9wZXIgaW5zaXplIG9yIG91dHNpemUiKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJvdXQgYnVmZmVyIGF0dHIuIHNpemUgJXp1Iiwgb3V0U2l6ZSk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLCAwLCBvdXRTaXplKSk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRHc21EZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZCkgcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitjbGFzcyBDMlNvZnRHU01EZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0R1NNRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEdzbURlYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRHc21EZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0R3NtRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0R3NtRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0R1NNRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0R1NNRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQzJTb2Z0R3NtRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQzJTb2Z0R3NtRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIyMDlmZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9DMlNvZnRHc21EZWMuaApAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfR1NNX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfR1NNX0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworCitleHRlcm4gIkMiIHsKKyAgICAjaW5jbHVkZSAiZ3NtLmgiCit9CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2RlZmluZSBGUkdTTV9JTl9GUk1fU1ogICAgICAgICAgICAgMzMKKyNkZWZpbmUgRlJHU01fSU5fRlJNX1NaX01JTlVTXzEgICAgIDMyCisjZGVmaW5lIEZSR1NNX09VVF9GUk1fU1ogICAgICAgICAgICAxNjAKKyNkZWZpbmUgTVNHU01fSU5fRlJNX1NaICAgICAgICAgICAgIChGUkdTTV9JTl9GUk1fU1ogKyBGUkdTTV9JTl9GUk1fU1pfTUlOVVNfMSkKKyNkZWZpbmUgTVNHU01fT1VUX0ZSTV9TWiAgICAgICAgICAgIChGUkdTTV9PVVRfRlJNX1NaICogMikKKworc3RydWN0IEMyU29mdEdzbURlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRHc21EZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0R3NtRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBnc20gbUdzbTsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sIG1TaWduYWxsZWRFb3M7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRHc21EZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfR1NNX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9OT1RJQ0UgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjFlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vTk9USUNFCkBAIC0wLDAgKzEsMTkwIEBACisKKyAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMDQ1ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxNiBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9oZXZjZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRIZXZjRGVjLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGliaGV2Y2RlYyJdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJleHRlcm5hbC9saWJoZXZjL2RlY29kZXIiLAorICAgICAgICAiZXh0ZXJuYWwvbGliaGV2Yy9jb21tb24iLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTg5MmNlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmNwcApAQCAtMCwwICsxLDk3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0SGV2Y0RlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8Q29kZWMyTWFwcGVyLmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdEhldmNEZWMuaCIKKyNpbmNsdWRlICJpaGV2Y2RfY3hhLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmhldmMuZGVjb2RlciI7CisKK30gIC8vIG5hbWVzcGFjZQorCitjbGFzcyBDMlNvZnRIZXZjRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTywKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSB7CisgICAgICAgIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsgLy8gVE9ETzogYWNjb3VudCBmb3Igb3VyIGJ1ZmZlcnMgaGVyZQorICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworCisgICAgICAgIC8vIFRPRE86IG91dHB1dCBsYXRlbmN5IGFuZCByZW9yZGVyaW5nCisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BdHRyaWIsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZyhDMkNvbXBvbmVudDo6QVRUUklCX0lTX1RFTVBPUkFMKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TaXplLCBDMl9QQVJBTUtFWV9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDQwOTYsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCA0MDk2LCAyKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNpemVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl81XzEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOX1NUSUxMfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMl8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMywgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8zXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl80LCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzRfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzUsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNV8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNV8yLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF80XzEsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzVfMSwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF81XzIKKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4U2l6ZSwgQzJfUEFSQU1LRVlfTUFYX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCA0MDk2LCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgNDA5NiwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihNYXhQaWN0dXJlU2l6ZVNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4SW5wdXRTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMzIwICogMjQwICogMyAvIDQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1NYXhJbnB1dFNpemUsIHZhbHVlKS5hbnkoKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5jYWxjdWxhdGVkQXMoTWF4SW5wdXRTaXplU2V0dGVyLCBtTWF4U2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgbG9jYXRpb25zWzFdID0geyBDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpIH07CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICAxdSwgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgbWVtY3B5KGRlZmF1bHRDb2xvckluZm8tPm0ubG9jYXRpb25zLCBsb2NhdGlvbnMsIHNpemVvZihsb2NhdGlvbnMpKTsKKworICAgICAgICBkZWZhdWx0Q29sb3JJbmZvID0gQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICB7QzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKX0sIDB1LCA4dSAvKiBiaXREZXB0aCAqLywKKyAgICAgICAgICAgIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBoZWxwZXItPmFkZFN0cnVjdERlc2NyaXB0b3JzPEMyQ2hyb21hT2Zmc2V0U3RydWN0PigpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29sb3JJbmZvLCBDMl9QQVJBTUtFWV9DT0RFRF9DT0xPUl9JTkZPKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShkZWZhdWx0Q29sb3JJbmZvKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURlZmF1bHRDb2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX0RFRkFVTFRfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsICAgICBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCAgICBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvZGVkQ29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9WVUlfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfTElNSVRFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsICAgICBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsICBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCAgICBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihDb2RlZENvbG9yQXNwZWN0c1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCAgICAgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsICBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQ29sb3JBc3BlY3RzU2V0dGVyLCBtRGVmYXVsdENvbG9yQXNwZWN0cywgbUNvZGVkQ29sb3JBc3BlY3RzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IG1vcmUgZm9ybWF0cz8KKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1QaXhlbEZvcm1hdCwgQzJfUEFSQU1LRVlfUElYRUxfRk9STUFUKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmb2xkTWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlZpZGVvU2l6ZVN0cmVhbUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAoIW1lLkYobWUudi53aWR0aCkuc3VwcG9ydHNBdEFsbChtZS52LndpZHRoKSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LndpZHRoKSkpOworICAgICAgICAgICAgbWUuc2V0KCkud2lkdGggPSBvbGRNZS52LndpZHRoOworICAgICAgICB9CisgICAgICAgIGlmICghbWUuRihtZS52LmhlaWdodCkuc3VwcG9ydHNBdEFsbChtZS52LmhlaWdodCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi5oZWlnaHQpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBvbGRNZS52LmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4UGljdHVyZVNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBUT0RPOiBnZXQgbWF4IHdpZHRoL2hlaWdodCBmcm9tIHRoZSBzaXplJ3MgZmllbGQgaGVscGVycyB2cy4gaGFyZGNvZGluZworICAgICAgICBtZS5zZXQoKS53aWR0aCA9IGMyX21pbihjMl9tYXgobWUudi53aWR0aCwgc2l6ZS52LndpZHRoKSwgNDA5NnUpOworICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBjMl9taW4oYzJfbWF4KG1lLnYuaGVpZ2h0LCBzaXplLnYuaGVpZ2h0KSwgNDA5NnUpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4SW5wdXRTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtYXhTaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBhc3N1bWUgY29tcHJlc3Npb24gcmF0aW8gb2YgMgorICAgICAgICBtZS5zZXQoKS52YWx1ZSA9ICgoKG1heFNpemUudi53aWR0aCArIDYzKSAvIDY0KSAqICgobWF4U2l6ZS52LmhlaWdodCArIDYzKSAvIDY0KSAqIDMwNzIpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZClzaXplOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmIChtZS52LnJhbmdlID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi50cmFuc2ZlciA+IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5tYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIENvZGVkQ29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmIChtZS52LnJhbmdlID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi50cmFuc2ZlciA+IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5tYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gJmRlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gJmNvZGVkKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyB0YWtlIGRlZmF1bHQgdmFsdWVzIGZvciBhbGwgdW5zcGVjaWZpZWQgZmllbGRzLCBhbmQgY29kZWQgdmFsdWVzIGZvciBzcGVjaWZpZWQgb25lcworICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IGNvZGVkLnYucmFuZ2UgPT0gUkFOR0VfVU5TUEVDSUZJRUQgPyBkZWYudi5yYW5nZSA6IGNvZGVkLnYucmFuZ2U7CisgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IGNvZGVkLnYucHJpbWFyaWVzID09IFBSSU1BUklFU19VTlNQRUNJRklFRAorICAgICAgICAgICAgICAgID8gZGVmLnYucHJpbWFyaWVzIDogY29kZWQudi5wcmltYXJpZXM7CisgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gY29kZWQudi50cmFuc2ZlciA9PSBUUkFOU0ZFUl9VTlNQRUNJRklFRAorICAgICAgICAgICAgICAgID8gZGVmLnYudHJhbnNmZXIgOiBjb2RlZC52LnRyYW5zZmVyOworICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBjb2RlZC52Lm1hdHJpeCA9PSBNQVRSSVhfVU5TUEVDSUZJRUQgPyBkZWYudi5tYXRyaXggOiBjb2RlZC52Lm1hdHJpeDsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+IGdldENvbG9yQXNwZWN0c19sKCkgeworICAgICAgICByZXR1cm4gbUNvbG9yQXNwZWN0czsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+IG1NYXhTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbU1heElucHV0U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gbUNvbG9ySW5mbzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gbUNvZGVkQ29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiBtRGVmYXVsdENvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+IG1Db2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQ+IG1QaXhlbEZvcm1hdDsKK307CisKK3N0YXRpYyBzaXplX3QgZ2V0Q3B1Q29yZUNvdW50KCkgeworICAgIGxvbmcgY3B1Q29yZUNvdW50ID0gMTsKKyNpZiBkZWZpbmVkKF9TQ19OUFJPQ0VTU09SU19PTkxOKQorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworI2Vsc2UKKyAgICAvLyBfU0NfTlBST0NfT05MTiBtdXN0IGJlIGRlZmluZWQuLi4KKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ19PTkxOKTsKKyNlbmRpZgorICAgIENIRUNLKGNwdUNvcmVDb3VudCA+PSAxKTsKKyAgICBBTE9HVigiTnVtYmVyIG9mIENQVSBjb3JlczogJWxkIiwgY3B1Q29yZUNvdW50KTsKKyAgICByZXR1cm4gKHNpemVfdCljcHVDb3JlQ291bnQ7Cit9CisKK3N0YXRpYyB2b2lkICppdmRfYWxpZ25lZF9tYWxsb2Modm9pZCAqY3R4dCwgV09SRDMyIGFsaWdubWVudCwgV09SRDMyIHNpemUpIHsKKyAgICAodm9pZCkgY3R4dDsKKyAgICByZXR1cm4gbWVtYWxpZ24oYWxpZ25tZW50LCBzaXplKTsKK30KKworc3RhdGljIHZvaWQgaXZkX2FsaWduZWRfZnJlZSh2b2lkICpjdHh0LCB2b2lkICptZW0pIHsKKyAgICAodm9pZCkgY3R4dDsKKyAgICBmcmVlKG1lbSk7Cit9CisKK0MyU29mdEhldmNEZWM6OkMyU29mdEhldmNEZWMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICAgIG1EZWNIYW5kbGUobnVsbHB0ciksCisgICAgICAgIG1PdXRCdWZmZXJGbHVzaChudWxscHRyKSwKKyAgICAgICAgbUl2Q29sb3Jmb3JtYXQoSVZfWVVWXzQyMFApLAorICAgICAgICBtV2lkdGgoMzIwKSwKKyAgICAgICAgbUhlaWdodCgyNDApLAorICAgICAgICBtSGVhZGVyRGVjb2RlZChmYWxzZSkgeworfQorCitDMlNvZnRIZXZjRGVjOjp+QzJTb2Z0SGV2Y0RlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpvblN0b3AoKSB7CisgICAgaWYgKE9LICE9IHJlc2V0RGVjb2RlcigpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIHJlc2V0UGx1Z2luKCk7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEhldmNEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpIG9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdEhldmNEZWM6Om9uUmVsZWFzZSgpIHsKKyAgICAodm9pZCkgZGVsZXRlRGVjb2RlcigpOworICAgIGlmIChtT3V0QnVmZmVyRmx1c2gpIHsKKyAgICAgICAgaXZkX2FsaWduZWRfZnJlZShudWxscHRyLCBtT3V0QnVmZmVyRmx1c2gpOworICAgICAgICBtT3V0QnVmZmVyRmx1c2ggPSBudWxscHRyOworICAgIH0KKyAgICBpZiAobU91dEJsb2NrKSB7CisgICAgICAgIG1PdXRCbG9jay5yZXNldCgpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6b25GbHVzaF9zbSgpIHsKKyAgICBpZiAoT0sgIT0gc2V0Rmx1c2hNb2RlKCkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisKKyAgICB1aW50MzJfdCBkaXNwbGF5U3RyaWRlID0gbVN0cmlkZTsKKyAgICB1aW50MzJfdCBkaXNwbGF5SGVpZ2h0ID0gbUhlaWdodDsKKyAgICB1aW50MzJfdCBidWZmZXJTaXplID0gZGlzcGxheVN0cmlkZSAqIGRpc3BsYXlIZWlnaHQgKiAzIC8gMjsKKyAgICBtT3V0QnVmZmVyRmx1c2ggPSAodWludDhfdCAqKWl2ZF9hbGlnbmVkX21hbGxvYyhudWxscHRyLCAxMjgsIGJ1ZmZlclNpemUpOworICAgIGlmICghbU91dEJ1ZmZlckZsdXNoKSB7CisgICAgICAgIEFMT0dFKCJjb3VsZCBub3QgYWxsb2NhdGUgdG1wIG91dHB1dCBidWZmZXIgKGZvciBmbHVzaCkgb2Ygc2l6ZSAldSAiLCBidWZmZXJTaXplKTsKKyAgICAgICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICB9CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKKworICAgICAgICBzZXREZWNvZGVBcmdzKCZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wLCBudWxscHRyLCBudWxscHRyLCAwLCAwLCAwKTsKKyAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgIGlmICgwID09IHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICByZXNldFBsdWdpbigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobU91dEJ1ZmZlckZsdXNoKSB7CisgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUobnVsbHB0ciwgbU91dEJ1ZmZlckZsdXNoKTsKKyAgICAgICAgbU91dEJ1ZmZlckZsdXNoID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEhldmNEZWM6OmNyZWF0ZURlY29kZXIoKSB7CisgICAgaXZkZXh0X2NyZWF0ZV9pcF90IHNfY3JlYXRlX2lwOworICAgIGl2ZGV4dF9jcmVhdGVfb3BfdCBzX2NyZWF0ZV9vcDsKKworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2NyZWF0ZV9pcF90KTsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5lX2NtZCA9IElWRF9DTURfQ1JFQVRFOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnU0X3NoYXJlX2Rpc3BfYnVmID0gMDsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5lX291dHB1dF9mb3JtYXQgPSBtSXZDb2xvcmZvcm1hdDsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5wZl9hbGlnbmVkX2FsbG9jID0gaXZkX2FsaWduZWRfbWFsbG9jOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnBmX2FsaWduZWRfZnJlZSA9IGl2ZF9hbGlnbmVkX2ZyZWU7CisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QucHZfbWVtX2N0eHQgPSBudWxscHRyOworICAgIHNfY3JlYXRlX29wLnNfaXZkX2NyZWF0ZV9vcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2NyZWF0ZV9vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfY3JlYXRlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19jcmVhdGVfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgc19jcmVhdGVfb3Auc19pdmRfY3JlYXRlX29wX3QudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtRGVjSGFuZGxlID0gKGl2X29ial90KilzX2NyZWF0ZV9vcC5zX2l2ZF9jcmVhdGVfb3BfdC5wdl9oYW5kbGU7CisgICAgbURlY0hhbmRsZS0+cHZfZnhucyA9ICh2b2lkICopaXZkZWNfYXBpX2Z1bmN0aW9uOworICAgIG1EZWNIYW5kbGUtPnU0X3NpemUgPSBzaXplb2YoaXZfb2JqX3QpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpzZXROdW1Db3JlcygpIHsKKyAgICBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCBzX3NldF9udW1fY29yZXNfaXA7CisgICAgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3Qgc19zZXRfbnVtX2NvcmVzX29wOworCisgICAgc19zZXRfbnVtX2NvcmVzX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QpOworICAgIHNfc2V0X251bV9jb3Jlc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfc2V0X251bV9jb3Jlc19pcC5lX3N1Yl9jbWQgPSBJVkRFWFRfQ01EX0NUTF9TRVRfTlVNX0NPUkVTOworICAgIHNfc2V0X251bV9jb3Jlc19pcC51NF9udW1fY29yZXMgPSBtTnVtQ29yZXM7CisgICAgc19zZXRfbnVtX2NvcmVzX29wLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfbnVtX2NvcmVzX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfbnVtX2NvcmVzX29wKTsKKyAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0QoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfc2V0X251bV9jb3Jlc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpzZXRQYXJhbXMoc2l6ZV90IHN0cmlkZSwgSVZEX1ZJREVPX0RFQ09ERV9NT0RFX1QgZGVjX21vZGUpIHsKKyAgICBpdmRfY3RsX3NldF9jb25maWdfaXBfdCBzX3NldF9keW5fcGFyYW1zX2lwOworICAgIGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90IHNfc2V0X2R5bl9wYXJhbXNfb3A7CisKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX2lwX3QpOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX1NFVFBBUkFNUzsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLnU0X2Rpc3Bfd2QgPSAoVVdPUkQzMikgc3RyaWRlOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9mcm1fc2tpcF9tb2RlID0gSVZEX1NLSVBfTk9ORTsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfZnJtX291dF9tb2RlID0gSVZEX0RJU1BMQVlfRlJBTUVfT1VUOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV92aWRfZGVjX21vZGUgPSBkZWNfbW9kZTsKKyAgICBzX3NldF9keW5fcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZHluX3BhcmFtc19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2R5bl9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19zZXRfZHluX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpnZXRWZXJzaW9uKCkgeworICAgIGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9faXBfdCBzX2dldF92ZXJzaW9uaW5mb19pcDsKKyAgICBpdmRfY3RsX2dldHZlcnNpb25pbmZvX29wX3Qgc19nZXRfdmVyc2lvbmluZm9fb3A7CisgICAgVVdPUkQ4IGF1MV9idWZbNTEyXTsKKworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90KTsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX0dFVFZFUlNJT047CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAucHZfdmVyc2lvbl9idWZmZXIgPSBhdTFfYnVmOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnU0X3ZlcnNpb25fYnVmZmVyX3NpemUgPSBzaXplb2YoYXUxX2J1Zik7CisgICAgc19nZXRfdmVyc2lvbmluZm9fb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2dldHZlcnNpb25pbmZvX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19nZXRfdmVyc2lvbmluZm9faXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2dldF92ZXJzaW9uaW5mb19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dEKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICBzX2dldF92ZXJzaW9uaW5mb19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiaXR0aWFtIGRlY29kZXIgdmVyc2lvbiBudW1iZXI6ICVzIiwKKyAgICAgICAgICAgICAgKGNoYXIgKikgc19nZXRfdmVyc2lvbmluZm9faXAucHZfdmVyc2lvbl9idWZmZXIpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6aW5pdERlY29kZXIoKSB7CisgICAgaWYgKE9LICE9IGNyZWF0ZURlY29kZXIoKSkgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgbU51bUNvcmVzID0gTUlOKGdldENwdUNvcmVDb3VudCgpLCBNQVhfTlVNX0NPUkVTKTsKKyAgICBtU3RyaWRlID0gQUxJR042NChtV2lkdGgpOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIHJlc2V0UGx1Z2luKCk7CisgICAgKHZvaWQpIHNldE51bUNvcmVzKCk7CisgICAgaWYgKE9LICE9IHNldFBhcmFtcyhtU3RyaWRlLCBJVkRfREVDT0RFX0ZSQU1FKSkgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgKHZvaWQpIGdldFZlcnNpb24oKTsKKworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBDMlNvZnRIZXZjRGVjOjpzZXREZWNvZGVBcmdzKGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjb2RlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjb2RlX29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUmVhZFZpZXcgKmluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyR3JhcGhpY1ZpZXcgKm91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0c01hcmtlcikgeworICAgIHVpbnQzMl90IGRpc3BsYXlTdHJpZGUgPSBtU3RyaWRlOworICAgIHVpbnQzMl90IGRpc3BsYXlIZWlnaHQgPSBtSGVpZ2h0OworICAgIHNpemVfdCBsdW1hU2l6ZSA9IGRpc3BsYXlTdHJpZGUgKiBkaXNwbGF5SGVpZ2h0OworICAgIHNpemVfdCBjaHJvbWFTaXplID0gbHVtYVNpemUgPj4gMjsKKworICAgIHBzX2RlY29kZV9pcC0+dTRfc2l6ZSA9IHNpemVvZihpdmRfdmlkZW9fZGVjb2RlX2lwX3QpOworICAgIHBzX2RlY29kZV9pcC0+ZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0RFQ09ERTsKKyAgICBpZiAoaW5CdWZmZXIpIHsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF90cyA9IHRzTWFya2VyOworICAgICAgICBwc19kZWNvZGVfaXAtPnB2X3N0cmVhbV9idWZmZXIgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5CdWZmZXItPmRhdGEoKSArIGluT2Zmc2V0KTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF9udW1fQnl0ZXMgPSBpblNpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF90cyA9IDA7CisgICAgICAgIHBzX2RlY29kZV9pcC0+cHZfc3RyZWFtX2J1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfbnVtX0J5dGVzID0gMDsKKyAgICB9CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVswXSA9IGx1bWFTaXplOworICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMV0gPSBjaHJvbWFTaXplOworICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMl0gPSBjaHJvbWFTaXplOworICAgIGlmIChvdXRCdWZmZXIpIHsKKyAgICAgICAgaWYgKG91dEJ1ZmZlci0+d2lkdGgoKSA8IGRpc3BsYXlTdHJpZGUgfHwgb3V0QnVmZmVyLT5oZWlnaHQoKSA8IGRpc3BsYXlIZWlnaHQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJPdXRwdXQgYnVmZmVyIHRvbyBzbWFsbDogcHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJXV4JXUpIiwKKyAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+d2lkdGgoKSwgb3V0QnVmZmVyLT5oZWlnaHQoKSwgZGlzcGxheVN0cmlkZSwgZGlzcGxheUhlaWdodCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMF0gPSBvdXRCdWZmZXItPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzFdID0gb3V0QnVmZmVyLT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1syXSA9IG91dEJ1ZmZlci0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKyAgICB9IGVsc2UgeworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1swXSA9IG1PdXRCdWZmZXJGbHVzaDsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMV0gPSBtT3V0QnVmZmVyRmx1c2ggKyBsdW1hU2l6ZTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMl0gPSBtT3V0QnVmZmVyRmx1c2ggKyBsdW1hU2l6ZSArIGNocm9tYVNpemU7CisgICAgfQorICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X251bV9idWZzID0gMzsKKyAgICBwc19kZWNvZGVfb3AtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9vcF90KTsKKyAgICBwc19kZWNvZGVfb3AtPnU0X291dHB1dF9wcmVzZW50ID0gMDsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEMyU29mdEhldmNEZWM6OmdldFZ1aVBhcmFtcygpIHsKKyAgICBpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX2lwX3Qgc19nZXRfdnVpX3BhcmFtc19pcDsKKyAgICBpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX29wX3Qgc19nZXRfdnVpX3BhcmFtc19vcDsKKworICAgIHNfZ2V0X3Z1aV9wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX2lwX3QpOworICAgIHNfZ2V0X3Z1aV9wYXJhbXNfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2dldF92dWlfcGFyYW1zX2lwLmVfc3ViX2NtZCA9CisgICAgICAgICAgICAoSVZEX0NPTlRST0xfQVBJX0NPTU1BTkRfVFlQRV9UKSBJSEVWQ0RfQ1hBX0NNRF9DVExfR0VUX1ZVSV9QQVJBTVM7CisgICAgc19nZXRfdnVpX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2dldF92dWlfcGFyYW1zX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19nZXRfdnVpX3BhcmFtc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dEKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX2dldF92dWlfcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgVnVpQ29sb3JBc3BlY3RzIHZ1aUNvbG9yQXNwZWN0czsKKyAgICB2dWlDb2xvckFzcGVjdHMucHJpbWFyaWVzID0gc19nZXRfdnVpX3BhcmFtc19vcC51MV9jb2xvdXJfcHJpbWFyaWVzOworICAgIHZ1aUNvbG9yQXNwZWN0cy50cmFuc2ZlciA9IHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTFfdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzOworICAgIHZ1aUNvbG9yQXNwZWN0cy5jb2VmZnMgPSBzX2dldF92dWlfcGFyYW1zX29wLnUxX21hdHJpeF9jb2VmZmljaWVudHM7CisgICAgdnVpQ29sb3JBc3BlY3RzLmZ1bGxSYW5nZSA9IHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTFfdmlkZW9fZnVsbF9yYW5nZV9mbGFnOworCisgICAgLy8gY29udmVydCB2dWkgYXNwZWN0cyB0byBDMiB2YWx1ZXMgaWYgY2hhbmdlZAorICAgIGlmICghKHZ1aUNvbG9yQXNwZWN0cyA9PSBtQml0c3RyZWFtQ29sb3JBc3BlY3RzKSkgeworICAgICAgICBtQml0c3RyZWFtQ29sb3JBc3BlY3RzID0gdnVpQ29sb3JBc3BlY3RzOworICAgICAgICBDb2xvckFzcGVjdHMgc2ZBc3BlY3RzOworICAgICAgICBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0IGNvZGVkQXNwZWN0cyA9IHsgMHUgfTsKKyAgICAgICAgQ29sb3JVdGlsczo6Y29udmVydElzb0NvbG9yQXNwZWN0c1RvQ29kZWNBc3BlY3RzKAorICAgICAgICAgICAgICAgIHZ1aUNvbG9yQXNwZWN0cy5wcmltYXJpZXMsIHZ1aUNvbG9yQXNwZWN0cy50cmFuc2ZlciwgdnVpQ29sb3JBc3BlY3RzLmNvZWZmcywKKyAgICAgICAgICAgICAgICB2dWlDb2xvckFzcGVjdHMuZnVsbFJhbmdlLCBzZkFzcGVjdHMpOworICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1QcmltYXJpZXMsICZjb2RlZEFzcGVjdHMucHJpbWFyaWVzKSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1SYW5nZSwgJmNvZGVkQXNwZWN0cy5yYW5nZSkpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubU1hdHJpeENvZWZmcywgJmNvZGVkQXNwZWN0cy5tYXRyaXgpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubVRyYW5zZmVyLCAmY29kZWRBc3BlY3RzLnRyYW5zZmVyKSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAodm9pZCltSW50Zi0+Y29uZmlnKHsmY29kZWRBc3BlY3RzfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6c2V0Rmx1c2hNb2RlKCkgeworICAgIGl2ZF9jdGxfZmx1c2hfaXBfdCBzX3NldF9mbHVzaF9pcDsKKyAgICBpdmRfY3RsX2ZsdXNoX29wX3Qgc19zZXRfZmx1c2hfb3A7CisKKyAgICBzX3NldF9mbHVzaF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZmx1c2hfaXBfdCk7CisgICAgc19zZXRfZmx1c2hfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3NldF9mbHVzaF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9GTFVTSDsKKyAgICBzX3NldF9mbHVzaF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZmx1c2hfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9mbHVzaF9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2ZsdXNoX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfc2V0X2ZsdXNoX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEhldmNEZWM6OnJlc2V0RGVjb2RlcigpIHsKKyAgICBpdmRfY3RsX3Jlc2V0X2lwX3Qgc19yZXNldF9pcDsKKyAgICBpdmRfY3RsX3Jlc2V0X29wX3Qgc19yZXNldF9vcDsKKworICAgIHNfcmVzZXRfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3Jlc2V0X2lwX3QpOworICAgIHNfcmVzZXRfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3Jlc2V0X2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX1JFU0VUOworICAgIHNfcmVzZXRfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3Jlc2V0X29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19yZXNldF9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfcmVzZXRfb3ApOworICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19yZXNldF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIG1TdHJpZGUgPSAwOworICAgICh2b2lkKSBzZXROdW1Db3JlcygpOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1IZWFkZXJEZWNvZGVkID0gZmFsc2U7CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEMyU29mdEhldmNEZWM6OnJlc2V0UGx1Z2luKCkgeworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVFbmQsIG51bGxwdHIpOworfQorCitzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpkZWxldGVEZWNvZGVyKCkgeworICAgIGlmIChtRGVjSGFuZGxlKSB7CisgICAgICAgIGl2ZGV4dF9kZWxldGVfaXBfdCBzX2RlbGV0ZV9pcDsKKyAgICAgICAgaXZkZXh0X2RlbGV0ZV9vcF90IHNfZGVsZXRlX29wOworCisgICAgICAgIHNfZGVsZXRlX2lwLnNfaXZkX2RlbGV0ZV9pcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2RlbGV0ZV9pcF90KTsKKyAgICAgICAgc19kZWxldGVfaXAuc19pdmRfZGVsZXRlX2lwX3QuZV9jbWQgPSBJVkRfQ01EX0RFTEVURTsKKyAgICAgICAgc19kZWxldGVfb3Auc19pdmRfZGVsZXRlX29wX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfZGVsZXRlX29wX3QpOworICAgICAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2RlbGV0ZV9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2RlbGV0ZV9vcCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICBzX2RlbGV0ZV9vcC5zX2l2ZF9kZWxldGVfb3BfdC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIG1EZWNIYW5kbGUgPSBudWxscHRyOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgfQorICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCit2b2lkIEMyU29mdEhldmNEZWM6OmZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBjcmVhdGVHcmFwaGljQnVmZmVyKHN0ZDo6bW92ZShtT3V0QmxvY2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlJlY3QobVdpZHRoLCBtSGVpZ2h0KSk7CisgICAgbU91dEJsb2NrID0gbnVsbHB0cjsKKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBidWZmZXItPnNldEluZm8obUludGYtPmdldENvbG9yQXNwZWN0c19sKCkpOworICAgIH0KKworICAgIGF1dG8gZmlsbFdvcmsgPSBbYnVmZmVyXShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpMDsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB9OworICAgIGlmICh3b3JrICYmIGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpIHsKKyAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmluaXNoKGluZGV4LCBmaWxsV29yayk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjplbnN1cmVEZWNvZGVyU3RhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIGlmICghbURlY0hhbmRsZSkgeworICAgICAgICBBTE9HRSgibm90IHN1cHBvc2VkIHRvIGJlIGhlcmUsIGludmFsaWQgZGVjb2RlciBjb250ZXh0Iik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIGlmIChtU3RyaWRlICE9IEFMSUdONjQobVdpZHRoKSkgeworICAgICAgICBtU3RyaWRlID0gQUxJR042NChtV2lkdGgpOworICAgICAgICBpZiAoT0sgIT0gc2V0UGFyYW1zKG1TdHJpZGUsIElWRF9ERUNPREVfRlJBTUUpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICBpZiAobU91dEJsb2NrICYmCisgICAgICAgICAgICAobU91dEJsb2NrLT53aWR0aCgpICE9IG1TdHJpZGUgfHwgbU91dEJsb2NrLT5oZWlnaHQoKSAhPSBtSGVpZ2h0KSkgeworICAgICAgICBtT3V0QmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgaWYgKCFtT3V0QmxvY2spIHsKKyAgICAgICAgdWludDMyX3QgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOworICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKG1TdHJpZGUsIG1IZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZtT3V0QmxvY2spOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiZmV0Y2hHcmFwaGljQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigicHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJWR4JWQpIiwKKyAgICAgICAgICAgICAgbU91dEJsb2NrLT53aWR0aCgpLCBtT3V0QmxvY2stPmhlaWdodCgpLCBtU3RyaWRlLCBtSGVpZ2h0KTsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKy8vIFRPRE86IGNhbiBvdmVyYWxsIGVycm9yIGNoZWNraW5nIGJlIGltcHJvdmVkPworLy8gVE9ETzogYWxsb3cgY29uZmlndXJhdGlvbiBvZiBjb2xvciBmb3JtYXQgYW5kIHVzYWdlIGZvciBncmFwaGljIGJ1ZmZlcnMgaW5zdGVhZAorLy8gICAgICAgb2YgaGFyZCBjb2RpbmcgdGhlbSB0byBIQUxfUElYRUxfRk9STUFUX1lWMTIKKy8vIFRPRE86IHBhc3MgY29sb3Jhc3BlY3RzIGluZm9ybWF0aW9uIHRvIHN1cmZhY2UKKy8vIFRPRE86IHRlc3Qgc3VwcG9ydCBmb3IgZHluYW1pYyBjaGFuZ2UgaW4gcmVzb2x1dGlvbgorLy8gVE9ETzogdmVyaWZ5IGlmIHRoZSBkZWNvZGVyIHNlbnQgYmFjayBhbGwgZnJhbWVzCit2b2lkIEMyU29mdEhldmNEZWM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMHU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICB1aW50MzJfdCB3b3JrSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSAmIDB4RkZGRkZGRkY7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSByVmlldy5lcnJvcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIGJvb2wgaGFzUGljdHVyZSA9IGZhbHNlOworCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCwgZmxhZ3MgJXgiLAorICAgICAgICAgIGluU2l6ZSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCksIHdvcmstPmlucHV0LmZsYWdzKTsKKyAgICBzaXplX3QgaW5Qb3MgPSAwOworICAgIHdoaWxlIChpblBvcyA8IGluU2l6ZSkgeworICAgICAgICBpZiAoQzJfT0sgIT0gZW5zdXJlRGVjb2RlclN0YXRlKHBvb2wpKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDMkdyYXBoaWNWaWV3IHdWaWV3ID0gbU91dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gd1ZpZXcuZXJyb3IoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKKyAgICAgICAgaWYgKCFzZXREZWNvZGVBcmdzKCZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wLCAmclZpZXcsICZ3VmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT2Zmc2V0ICsgaW5Qb3MsIGluU2l6ZSAtIGluUG9zLCB3b3JrSW5kZXgpKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmYWxzZSA9PSBtSGVhZGVyRGVjb2RlZCkgeworICAgICAgICAgICAgLyogRGVjb2RlIGhlYWRlciBhbmQgZ2V0IGRpbWVuc2lvbnMgKi8KKyAgICAgICAgICAgIHNldFBhcmFtcyhtU3RyaWRlLCBJVkRfREVDT0RFX0hFQURFUik7CisgICAgICAgIH0KKyAgICAgICAgV09SRDMyIGRlbGF5OworICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICAgICAgVElNRV9ESUZGKG1UaW1lRW5kLCBtVGltZVN0YXJ0LCBkZWxheSk7CisgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICBXT1JEMzIgZGVjb2RlVGltZTsKKyAgICAgICAgR0VUVElNRSgmbVRpbWVFbmQsIG51bGxwdHIpOworICAgICAgICBUSU1FX0RJRkYobVRpbWVTdGFydCwgbVRpbWVFbmQsIGRlY29kZVRpbWUpOworICAgICAgICBBTE9HVigiZGVjb2RlVGltZT0lNmQgZGVsYXk9JTZkIG51bUJ5dGVzPSU2ZCIsIGRlY29kZVRpbWUsIGRlbGF5LAorICAgICAgICAgICAgICBzX2RlY29kZV9vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQpOworICAgICAgICBpZiAoSVZEX01FTV9BTExPQ19GQUlMRUQgPT0gKHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUgJiAweEZGKSkgeworICAgICAgICAgICAgQUxPR0UoImFsbG9jYXRpb24gZmFpbHVyZSBpbiBkZWNvZGVyIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChJVkRfU1RSRUFNX1dJRFRIX0hFSUdIVF9OT1RfU1VQUE9SVEVEID09IChzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlICYgMHhGRikpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ1bnN1cHBvcnRlZCByZXNvbHV0aW9uIDogJWR4JWQiLCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAoSVZEX1JFU19DSEFOR0VEID09IChzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlICYgMHhGRikpIHsKKyAgICAgICAgICAgIEFMT0dWKCJyZXNvbHV0aW9uIGNoYW5nZWQiKTsKKyAgICAgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX05PX0VPUywgcG9vbCwgd29yayk7CisgICAgICAgICAgICByZXNldERlY29kZXIoKTsKKyAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworCisgICAgICAgICAgICAvKiBEZWNvZGUgaGVhZGVyIGFuZCBnZXQgbmV3IGRpbWVuc2lvbnMgKi8KKyAgICAgICAgICAgIHNldFBhcmFtcyhtU3RyaWRlLCBJVkRfREVDT0RFX0hFQURFUik7CisgICAgICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoMCA8IHNfZGVjb2RlX29wLnU0X3BpY193ZCAmJiAwIDwgc19kZWNvZGVfb3AudTRfcGljX2h0KSB7CisgICAgICAgICAgICBpZiAobUhlYWRlckRlY29kZWQgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICBtSGVhZGVyRGVjb2RlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgc2V0UGFyYW1zKEFMSUdONjQoc19kZWNvZGVfb3AudTRfcGljX3dkKSwgSVZEX0RFQ09ERV9GUkFNRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc19kZWNvZGVfb3AudTRfcGljX3dkICE9IG1XaWR0aCB8fCAgc19kZWNvZGVfb3AudTRfcGljX2h0ICE9IG1IZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBtV2lkdGggPSBzX2RlY29kZV9vcC51NF9waWNfd2Q7CisgICAgICAgICAgICAgICAgbUhlaWdodCA9IHNfZGVjb2RlX29wLnU0X3BpY19odDsKKyAgICAgICAgICAgICAgICBDSEVDS19FUSgwdSwgc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpOworCisgICAgICAgICAgICAgICAgQzJWaWRlb1NpemVTdHJlYW1JbmZvOjpvdXRwdXQgc2l6ZSgwdSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0KKyAgICAgICAgICAgICAgICAgICAgbUludGYtPmNvbmZpZyh7JnNpemV9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoc2l6ZSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDYW5ub3Qgc2V0IHdpZHRoIGFuZCBoZWlnaHQiKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICh2b2lkKSBnZXRWdWlQYXJhbXMoKTsKKyAgICAgICAgaGFzUGljdHVyZSB8PSAoMSA9PSBzX2RlY29kZV9vcC51NF9mcmFtZV9kZWNvZGVkX2ZsYWcpOworICAgICAgICBpZiAoc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgIGZpbmlzaFdvcmsoc19kZWNvZGVfb3AudTRfdHMsIHdvcmspOworICAgICAgICB9CisgICAgICAgIGlmICgwID09IHNfZGVjb2RlX29wLnU0X251bV9ieXRlc19jb25zdW1lZCkgeworICAgICAgICAgICAgQUxPR0QoIkJ5dGVzIGNvbnN1bWVkIGlzIHplcm8uIElnbm9yaW5nIHJlbWFpbmluZyBieXRlcyIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaW5Qb3MgKz0gc19kZWNvZGVfb3AudTRfbnVtX2J5dGVzX2NvbnN1bWVkOworICAgICAgICBpZiAoaGFzUGljdHVyZSAmJiAoaW5TaXplIC0gaW5Qb3MpKSB7CisgICAgICAgICAgICBBTE9HRCgiZGVjb2RlZCBmcmFtZSBpbiBjdXJyZW50IGFjY2VzcyBuYWwsIGlnbm9yaW5nIGZ1cnRoZXIgdHJhaWxpbmcgYnl0ZXMgJWQiLAorICAgICAgICAgICAgICAgICAgKGludClpblNpemUgLSAoaW50KWluUG9zKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGVvcykgeworICAgICAgICBkcmFpbkludGVybmFsKERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUywgcG9vbCwgd29yayk7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoIWhhc1BpY3R1cmUpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNEZWM6OmRyYWluSW50ZXJuYWwoCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgaWYgKE9LICE9IHNldEZsdXNoTW9kZSgpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmIChDMl9PSyAhPSBlbnN1cmVEZWNvZGVyU3RhdGUocG9vbCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICBDMkdyYXBoaWNWaWV3IHdWaWV3ID0gbU91dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKKyAgICAgICAgaWYgKCFzZXREZWNvZGVBcmdzKCZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wLCBudWxscHRyLCAmd1ZpZXcsIDAsIDAsIDApKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgZmluaXNoV29yayhzX2RlY29kZV9vcC51NF90cywgd29yayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNEZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICByZXR1cm4gZHJhaW5JbnRlcm5hbChkcmFpbk1vZGUsIHBvb2wsIG51bGxwdHIpOworfQorCitjbGFzcyBDMlNvZnRIZXZjRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEhldmNEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRIZXZjRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEhldmNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0SGV2Y0RlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEhldmNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRIZXZjRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0SGV2Y0RlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTExMWZjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmgKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9IRVZDX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfSEVWQ19ERUNfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgorCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgImloZXZjX3R5cGVkZWZzLmgiCisjaW5jbHVkZSAiaXYuaCIKKyNpbmNsdWRlICJpdmQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjZGVmaW5lIGl2ZGVjX2FwaV9mdW5jdGlvbiAgICAgICAgICAgICAgaWhldmNkX2N4YV9hcGlfZnVuY3Rpb24KKyNkZWZpbmUgaXZkZXh0X2NyZWF0ZV9pcF90ICAgICAgICAgICAgICBpaGV2Y2RfY3hhX2NyZWF0ZV9pcF90CisjZGVmaW5lIGl2ZGV4dF9jcmVhdGVfb3BfdCAgICAgICAgICAgICAgaWhldmNkX2N4YV9jcmVhdGVfb3BfdAorI2RlZmluZSBpdmRleHRfZGVsZXRlX2lwX3QgICAgICAgICAgICAgIGloZXZjZF9jeGFfZGVsZXRlX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2RlbGV0ZV9vcF90ICAgICAgICAgICAgICBpaGV2Y2RfY3hhX2RlbGV0ZV9vcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90ICAgaWhldmNkX2N4YV9jdGxfc2V0X251bV9jb3Jlc19pcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90ICAgaWhldmNkX2N4YV9jdGxfc2V0X251bV9jb3Jlc19vcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfaXBfdCAgaWhldmNkX2N4YV9jdGxfZ2V0X3Z1aV9wYXJhbXNfaXBfdAorI2RlZmluZSBpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX29wX3QgIGloZXZjZF9jeGFfY3RsX2dldF92dWlfcGFyYW1zX29wX3QKKyNkZWZpbmUgQUxJR042NCh4KSAgICAgICAgICAgICAgICAgICAgICAoKCgoeCkgKyA2MykgPj4gNikgPDwgNikKKyNkZWZpbmUgTUFYX05VTV9DT1JFUyAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMgICAgXAorICAgICAgICAoSVZEX0NPTlRST0xfQVBJX0NPTU1BTkRfVFlQRV9UKUlIRVZDRF9DWEFfQ01EX0NUTF9TRVRfTlVNX0NPUkVTCisjZGVmaW5lIE1JTihhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorI2RlZmluZSBHRVRUSU1FKGEsIGIpICAgICAgICAgICAgICAgICAgIGdldHRpbWVvZmRheShhLCBiKTsKKyNkZWZpbmUgVElNRV9ESUZGKHN0YXJ0LCBlbmQsIGRpZmYpICAgICBcCisgICAgZGlmZiA9ICgoKGVuZCkudHZfc2VjIC0gKHN0YXJ0KS50dl9zZWMpICogMTAwMDAwMCkgKyBcCisgICAgICAgICAgICAoKGVuZCkudHZfdXNlYyAtIChzdGFydCkudHZfdXNlYyk7CisKKworc3RydWN0IEMyU29mdEhldmNEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0SGV2Y0RlYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0SGV2Y0RlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyBwcml2YXRlOgorICAgIHN0YXR1c190IGNyZWF0ZURlY29kZXIoKTsKKyAgICBzdGF0dXNfdCBzZXROdW1Db3JlcygpOworICAgIHN0YXR1c190IHNldFBhcmFtcyhzaXplX3Qgc3RyaWRlLCBJVkRfVklERU9fREVDT0RFX01PREVfVCBkZWNfbW9kZSk7CisgICAgc3RhdHVzX3QgZ2V0VmVyc2lvbigpOworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgYm9vbCBzZXREZWNvZGVBcmdzKGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjb2RlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY29kZV9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgQzJSZWFkVmlldyAqaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIEMyR3JhcGhpY1ZpZXcgKm91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0c01hcmtlcik7CisgICAgYm9vbCBnZXRWdWlQYXJhbXMoKTsKKyAgICAvLyBUT0RPOlRoaXMgaXMgbm90IHRoZSByaWdodCBwbGFjZSBmb3IgY29sb3JBc3BlY3RzIGZ1bmN0aW9ucy4gVGhlc2Ugc2hvdWxkCisgICAgLy8gYmUgcGFydCBvZiBjMi12bmRrIHNvIHRoYXQgdGhleSBjYW4gYmUgYWNjZXNzZWQgYnkgYWxsIHZpZGVvIHBsdWdpbnMKKyAgICAvLyB1bnRpbCB0aGVuLCBtYWtlIHRoZW0gZmVlbCBhdCBob21lCisgICAgYm9vbCBjb2xvckFzcGVjdHNEaWZmZXIoY29uc3QgQ29sb3JBc3BlY3RzICZhLCBjb25zdCBDb2xvckFzcGVjdHMgJmIpOworICAgIHZvaWQgdXBkYXRlRmluYWxDb2xvckFzcGVjdHMoCisgICAgICAgICAgICBjb25zdCBDb2xvckFzcGVjdHMgJm90aGVyQXNwZWN0cywgY29uc3QgQ29sb3JBc3BlY3RzICZwcmVmZXJyZWRBc3BlY3RzKTsKKyAgICBzdGF0dXNfdCBoYW5kbGVDb2xvckFzcGVjdHNDaGFuZ2UoKTsKKyAgICBjMl9zdGF0dXNfdCBlbnN1cmVEZWNvZGVyU3RhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCk7CisgICAgdm9pZCBmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisgICAgc3RhdHVzX3Qgc2V0Rmx1c2hNb2RlKCk7CisgICAgYzJfc3RhdHVzX3QgZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisgICAgc3RhdHVzX3QgcmVzZXREZWNvZGVyKCk7CisgICAgdm9pZCByZXNldFBsdWdpbigpOworICAgIHN0YXR1c190IGRlbGV0ZURlY29kZXIoKTsKKworICAgIC8vIFRPRE86VGhpcyBpcyBub3QgdGhlIHJpZ2h0IHBsYWNlIGZvciB0aGlzIGVudW0uIFRoZXNlIHNob3VsZAorICAgIC8vIGJlIHBhcnQgb2YgYzItdm5kayBzbyB0aGF0IHRoZXkgY2FuIGJlIGFjY2Vzc2VkIGJ5IGFsbCB2aWRlbyBwbHVnaW5zCisgICAgLy8gdW50aWwgdGhlbiwgbWFrZSB0aGVtIGZlZWwgYXQgaG9tZQorICAgIGVudW0geworICAgICAgICBrTm90U3VwcG9ydGVkLAorICAgICAgICBrUHJlZmVyQml0c3RyZWFtLAorICAgICAgICBrUHJlZmVyQ29udGFpbmVyLAorICAgIH07CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIGl2X29ial90ICptRGVjSGFuZGxlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gbU91dEJsb2NrOworICAgIHVpbnQ4X3QgKm1PdXRCdWZmZXJGbHVzaDsKKworICAgIHNpemVfdCBtTnVtQ29yZXM7CisgICAgSVZfQ09MT1JfRk9STUFUX1QgbUl2Q29sb3Jmb3JtYXQ7CisKKyAgICB1aW50MzJfdCBtV2lkdGg7CisgICAgdWludDMyX3QgbUhlaWdodDsKKyAgICB1aW50MzJfdCBtU3RyaWRlOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sIG1IZWFkZXJEZWNvZGVkOworCisgICAgLy8gQ29sb3IgYXNwZWN0cy4gVGhlc2UgYXJlIElTTyB2YWx1ZXMgYW5kIGFyZSBtZWFudCB0byBkZXRlY3QgY2hhbmdlcyBpbiBhc3BlY3RzIHRvIGF2b2lkCisgICAgLy8gY29udmVydGluZyB0aGVtIHRvIEMyIHZhbHVlcyBmb3IgZWFjaCBmcmFtZQorICAgIHN0cnVjdCBWdWlDb2xvckFzcGVjdHMgeworICAgICAgICB1aW50OF90IHByaW1hcmllczsKKyAgICAgICAgdWludDhfdCB0cmFuc2ZlcjsKKyAgICAgICAgdWludDhfdCBjb2VmZnM7CisgICAgICAgIHVpbnQ4X3QgZnVsbFJhbmdlOworCisgICAgICAgIC8vIGRlZmF1bHQgY29sb3IgYXNwZWN0cworICAgICAgICBWdWlDb2xvckFzcGVjdHMoKQorICAgICAgICAgICAgOiBwcmltYXJpZXMoMiksIHRyYW5zZmVyKDIpLCBjb2VmZnMoMiksIGZ1bGxSYW5nZSgwKSB7IH0KKworICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgVnVpQ29sb3JBc3BlY3RzICZvKSB7CisgICAgICAgICAgICByZXR1cm4gcHJpbWFyaWVzID09IG8ucHJpbWFyaWVzICYmIHRyYW5zZmVyID09IG8udHJhbnNmZXIgJiYgY29lZmZzID09IG8uY29lZmZzCisgICAgICAgICAgICAgICAgICAgICYmIGZ1bGxSYW5nZSA9PSBvLmZ1bGxSYW5nZTsKKyAgICAgICAgfQorICAgIH0gbUJpdHN0cmVhbUNvbG9yQXNwZWN0czsKKworICAgIC8vIHByb2ZpbGUKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZVN0YXJ0OworICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lRW5kOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0SGV2Y0RlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9IRVZDX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjY2NWVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMSBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9tcDNkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdE1wM0RlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnN0YWdlZnJpZ2h0X21wM2RlYyJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0MyU29mdE1wM0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQzJTb2Z0TXAzRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGI4Mzk3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0MyU29mdE1wM0RlYy5jcHAKQEAgLTAsMCArMSw1NTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdE1wM0RlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxudW1lcmljPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdE1wM0RlYy5oIgorI2luY2x1ZGUgInB2bXAzZGVjb2Rlcl9hcGkuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQubXAzLmRlY29kZXIiOworCitjbGFzcyBDMlNvZnRNUDM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX05BTUVfSU5QVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Gb3JtYXRDb25maWc6OmlucHV0KDB1LCBDMkZvcm1hdENvbXByZXNzZWQpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfTkFNRV9PVVRQVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Gb3JtYXRDb25maWc6Om91dHB1dCgwdSwgQzJGb3JtYXRBdWRpbykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX05BTUVfSU5QVVRfUE9SVF9NSU1FX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1pbWVDb25maWc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfTkFNRV9PVVRQVVRfUE9SVF9NSU1FX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1pbWVDb25maWc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX05BTUVfU1RSRUFNX1NBTVBMRV9SQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDQ0MTAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkub25lT2YoezgwMDAsIDExMDI1LCAxMjAwMCwgMTYwMDAsCisgICAgICAgICAgICAgICAgICAgIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMH0pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfTkFNRV9TVFJFQU1fQ0hBTk5FTF9DT1VOVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDIpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgMil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfTkFNRV9TVFJFQU1fQklUUkFURV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJCaXRyYXRlVHVuaW5nOjppbnB1dCgwdSwgNjQwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDgwMDAsIDMyMDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDgxOTIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRm9ybWF0Q29uZmlnOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJpdHJhdGVUdW5pbmc6OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRNUDM6OkMyU29mdE1QMyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtQ29uZmlnKG51bGxwdHIpLAorICAgICAgbURlY29kZXJCdWYobnVsbHB0cikgeworfQorCitDMlNvZnRNUDM6On5DMlNvZnRNUDMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1QMzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfTk9fTUVNT1JZOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNUDM6Om9uU3RvcCgpIHsKKyAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgbmV4dCBidWZmZXIgb3V0cHV0IGRvZXMgbm90IHN0aWxsCisgICAgLy8gZGVwZW5kIG9uIGZyYWdtZW50cyBmcm9tIHRoZSBsYXN0IG9uZSBkZWNvZGVkLgorICAgIHB2bXAzX0luaXREZWNvZGVyKG1Db25maWcsIG1EZWNvZGVyQnVmKTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtSXNGaXJzdCA9IHRydWU7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMDsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRNUDM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0TVAzOjpvblJlbGVhc2UoKSB7CisgICAgbUdhcGxlc3NCeXRlcyA9IGZhbHNlOworICAgIGlmIChtRGVjb2RlckJ1ZikgeworICAgICAgICBmcmVlKG1EZWNvZGVyQnVmKTsKKyAgICAgICAgbURlY29kZXJCdWYgPSBudWxscHRyOworICAgIH0KKworICAgIGlmIChtQ29uZmlnKSB7CisgICAgICAgIGRlbGV0ZSBtQ29uZmlnOworICAgICAgICBtQ29uZmlnID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3N0YXR1c190IEMyU29mdE1QMzo6aW5pdERlY29kZXIoKSB7CisgICAgbUNvbmZpZyA9IG5ldyB0UFZNUDNEZWNvZGVyRXh0ZXJuYWx7fTsKKyAgICBpZiAoIW1Db25maWcpIHJldHVybiBOT19NRU1PUlk7CisgICAgbUNvbmZpZy0+ZXF1YWxpemVyVHlwZSA9IGZsYXQ7CisgICAgbUNvbmZpZy0+Y3JjRW5hYmxlZCA9IGZhbHNlOworCisgICAgc2l6ZV90IG1lbVJlcXVpcmVtZW50cyA9IHB2bXAzX2RlY29kZXJNZW1SZXF1aXJlbWVudHMoKTsKKyAgICBtRGVjb2RlckJ1ZiA9IG1hbGxvYyhtZW1SZXF1aXJlbWVudHMpOworICAgIGlmICghbURlY29kZXJCdWYpIHJldHVybiBOT19NRU1PUlk7CisKKyAgICBwdm1wM19Jbml0RGVjb2RlcihtQ29uZmlnLCBtRGVjb2RlckJ1Zik7CisKKyAgICBtSXNGaXJzdCA9IHRydWU7CisgICAgbUdhcGxlc3NCeXRlcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDA7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qIFRoZSBiZWxvdyBjb2RlIGlzIGJvcnJvd2VkIGZyb20gLi90ZXN0L21wM3JlYWRlci5jcHAgKi8KK3N0YXRpYyBib29sIHBhcnNlTXAzSGVhZGVyKHVpbnQzMl90IGhlYWRlciwgc2l6ZV90ICpmcmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9zYW1wbGluZ19yYXRlID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpvdXRfY2hhbm5lbHMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9iaXRyYXRlID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpvdXRfbnVtX3NhbXBsZXMgPSBudWxscHRyKSB7CisgICAgKmZyYW1lX3NpemUgPSAwOworICAgIGlmIChvdXRfc2FtcGxpbmdfcmF0ZSkgKm91dF9zYW1wbGluZ19yYXRlID0gMDsKKyAgICBpZiAob3V0X2NoYW5uZWxzKSAqb3V0X2NoYW5uZWxzID0gMDsKKyAgICBpZiAob3V0X2JpdHJhdGUpICpvdXRfYml0cmF0ZSA9IDA7CisgICAgaWYgKG91dF9udW1fc2FtcGxlcykgKm91dF9udW1fc2FtcGxlcyA9IDExNTI7CisKKyAgICBpZiAoKGhlYWRlciAmIDB4ZmZlMDAwMDApICE9IDB4ZmZlMDAwMDApIHJldHVybiBmYWxzZTsKKworICAgIHVuc2lnbmVkIHZlcnNpb24gPSAoaGVhZGVyID4+IDE5KSAmIDM7CisgICAgaWYgKHZlcnNpb24gPT0gMHgwMSkgcmV0dXJuIGZhbHNlOworCisgICAgdW5zaWduZWQgbGF5ZXIgPSAoaGVhZGVyID4+IDE3KSAmIDM7CisgICAgaWYgKGxheWVyID09IDB4MDApIHJldHVybiBmYWxzZTsKKworICAgIHVuc2lnbmVkIGJpdHJhdGVfaW5kZXggPSAoaGVhZGVyID4+IDEyKSAmIDB4MGY7CisgICAgaWYgKGJpdHJhdGVfaW5kZXggPT0gMCB8fCBiaXRyYXRlX2luZGV4ID09IDB4MGYpIHJldHVybiBmYWxzZTsKKworICAgIHVuc2lnbmVkIHNhbXBsaW5nX3JhdGVfaW5kZXggPSAoaGVhZGVyID4+IDEwKSAmIDM7CisgICAgaWYgKHNhbXBsaW5nX3JhdGVfaW5kZXggPT0gMykgcmV0dXJuIGZhbHNlOworCisgICAgc3RhdGljIGNvbnN0IGludCBrU2FtcGxpbmdSYXRlVjFbXSA9IHsgNDQxMDAsIDQ4MDAwLCAzMjAwMCB9OworICAgIGludCBzYW1wbGluZ19yYXRlID0ga1NhbXBsaW5nUmF0ZVYxW3NhbXBsaW5nX3JhdGVfaW5kZXhdOworICAgIGlmICh2ZXJzaW9uID09IDIgLyogVjIgKi8pIHsKKyAgICAgICAgc2FtcGxpbmdfcmF0ZSAvPSAyOworICAgIH0gZWxzZSBpZiAodmVyc2lvbiA9PSAwIC8qIFYyLjUgKi8pIHsKKyAgICAgICAgc2FtcGxpbmdfcmF0ZSAvPSA0OworICAgIH0KKworICAgIHVuc2lnbmVkIHBhZGRpbmcgPSAoaGVhZGVyID4+IDkpICYgMTsKKworICAgIGlmIChsYXllciA9PSAzKSB7IC8vIGxheWVyIEkKKyAgICAgICAgc3RhdGljIGNvbnN0IGludCBrQml0cmF0ZVYxW10gPQorICAgICAgICB7CisgICAgICAgICAgICAzMiwgNjQsIDk2LCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMjg4LCAzMjAsIDM1MiwgMzg0LCA0MTYsIDQ0OAorICAgICAgICB9OworICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjJbXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIDMyLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNDQsIDE2MCwgMTc2LCAxOTIsIDIyNCwgMjU2CisgICAgICAgIH07CisKKyAgICAgICAgaW50IGJpdHJhdGUgPSAodmVyc2lvbiA9PSAzIC8qIFYxICovKSA/IGtCaXRyYXRlVjFbYml0cmF0ZV9pbmRleCAtIDFdIDoKKyAgICAgICAgICAgICAgICBrQml0cmF0ZVYyW2JpdHJhdGVfaW5kZXggLSAxXTsKKworICAgICAgICBpZiAob3V0X2JpdHJhdGUpIHsKKyAgICAgICAgICAgICpvdXRfYml0cmF0ZSA9IGJpdHJhdGU7CisgICAgICAgIH0KKyAgICAgICAgKmZyYW1lX3NpemUgPSAoMTIwMDAgKiBiaXRyYXRlIC8gc2FtcGxpbmdfcmF0ZSArIHBhZGRpbmcpICogNDsKKyAgICAgICAgaWYgKG91dF9udW1fc2FtcGxlcykgeworICAgICAgICAgICAgKm91dF9udW1fc2FtcGxlcyA9IDM4NDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8vIGxheWVyIElJIG9yIElJSQorICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjFMMltdID0KKyAgICAgICAgeworICAgICAgICAgICAgMzIsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMzIwLCAzODQKKyAgICAgICAgfTsKKworICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjFMM1tdID0KKyAgICAgICAgeworICAgICAgICAgICAgMzIsIDQwLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAyNTYsIDMyMAorICAgICAgICB9OworCisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMltdID0KKyAgICAgICAgeworICAgICAgICAgICAgOCwgMTYsIDI0LCAzMiwgNDAsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE0NCwgMTYwCisgICAgICAgIH07CisKKyAgICAgICAgaW50IGJpdHJhdGU7CisgICAgICAgIGlmICh2ZXJzaW9uID09IDMgLyogVjEgKi8pIHsKKyAgICAgICAgICAgIGJpdHJhdGUgPSAobGF5ZXIgPT0gMiAvKiBMMiAqLykgPyBrQml0cmF0ZVYxTDJbYml0cmF0ZV9pbmRleCAtIDFdIDoKKyAgICAgICAgICAgICAgICAgICAga0JpdHJhdGVWMUwzW2JpdHJhdGVfaW5kZXggLSAxXTsKKworICAgICAgICAgICAgaWYgKG91dF9udW1fc2FtcGxlcykgeworICAgICAgICAgICAgICAgICpvdXRfbnVtX3NhbXBsZXMgPSAxMTUyOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAvLyBWMiAob3IgMi41KQorICAgICAgICAgICAgYml0cmF0ZSA9IGtCaXRyYXRlVjJbYml0cmF0ZV9pbmRleCAtIDFdOworICAgICAgICAgICAgaWYgKG91dF9udW1fc2FtcGxlcykgeworICAgICAgICAgICAgICAgICpvdXRfbnVtX3NhbXBsZXMgPSAobGF5ZXIgPT0gMSAvKiBMMyAqLykgPyA1NzYgOiAxMTUyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG91dF9iaXRyYXRlKSB7CisgICAgICAgICAgICAqb3V0X2JpdHJhdGUgPSBiaXRyYXRlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHZlcnNpb24gPT0gMyAvKiBWMSAqLykgeworICAgICAgICAgICAgKmZyYW1lX3NpemUgPSAxNDQwMDAgKiBiaXRyYXRlIC8gc2FtcGxpbmdfcmF0ZSArIHBhZGRpbmc7CisgICAgICAgIH0gZWxzZSB7IC8vIFYyIG9yIFYyLjUKKyAgICAgICAgICAgIHNpemVfdCB0bXAgPSAobGF5ZXIgPT0gMSAvKiBMMyAqLykgPyA3MjAwMCA6IDE0NDAwMDsKKyAgICAgICAgICAgICpmcmFtZV9zaXplID0gdG1wICogYml0cmF0ZSAvIHNhbXBsaW5nX3JhdGUgKyBwYWRkaW5nOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG91dF9zYW1wbGluZ19yYXRlKSB7CisgICAgICAgICpvdXRfc2FtcGxpbmdfcmF0ZSA9IHNhbXBsaW5nX3JhdGU7CisgICAgfQorCisgICAgaWYgKG91dF9jaGFubmVscykgeworICAgICAgICBpbnQgY2hhbm5lbF9tb2RlID0gKGhlYWRlciA+PiA2KSAmIDM7CisKKyAgICAgICAgKm91dF9jaGFubmVscyA9IChjaGFubmVsX21vZGUgPT0gMykgPyAxIDogMjsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHVpbnQzMl90IFUzMl9BVChjb25zdCB1aW50OF90ICpwdHIpIHsKKyAgICByZXR1cm4gcHRyWzBdIDw8IDI0IHwgcHRyWzFdIDw8IDE2IHwgcHRyWzJdIDw8IDggfCBwdHJbM107Cit9CisKK3N0YXRpYyBzdGF0dXNfdCBjYWxjdWxhdGVPdXRTaXplKHVpbnQ4ICpoZWFkZXIsIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+ICpkZWNvZGVkU2l6ZXMpIHsKKyAgICB1aW50MzJfdCBjaGFubmVsczsKKyAgICB1aW50MzJfdCBudW1TYW1wbGVzOworICAgIHNpemVfdCBmcmFtZVNpemU7CisgICAgc2l6ZV90IHRvdGFsSW5TaXplID0gMDsKKworICAgIHdoaWxlICh0b3RhbEluU2l6ZSArIDQgPCBpblNpemUpIHsKKyAgICAgICAgaWYgKCFwYXJzZU1wM0hlYWRlcihVMzJfQVQoaGVhZGVyICsgdG90YWxJblNpemUpLCAmZnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsICZjaGFubmVscywgbnVsbHB0ciwgJm51bVNhbXBsZXMpKSB7CisgICAgICAgICAgICBBTE9HRSgiRXJyb3IgaW4gcGFyc2UgbXAzIGhlYWRlciBkdXJpbmcgb3V0U2l6ZSBlc3RpbWF0aW9uIik7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICB0b3RhbEluU2l6ZSArPSBmcmFtZVNpemU7CisgICAgICAgIGRlY29kZWRTaXplcy0+cHVzaF9iYWNrKG51bVNhbXBsZXMgKiBjaGFubmVscyAqIHNpemVvZihpbnQxNl90KSk7CisgICAgfQorCisgICAgaWYgKGRlY29kZWRTaXplcy0+ZW1wdHkoKSkgcmV0dXJuIFVOS05PV05fRVJST1I7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1QMzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1QMzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKy8vIFRPRE86IENhbiBvdmVyYWxsIGVycm9yIGNoZWNraW5nIGJlIGltcHJvdmVkPyBBcyBpbiB0aGUgY2hlY2sgZm9yIHZhbGlkaXR5IG9mCisvLyAgICAgICB3b3JrLCBwb29sIHB0ciwgd29yay0+aW5wdXQuYnVmZmVycy5zaXplKCkgPT0gMSwgLi4uCisvLyBUT0RPOiBCbGluZCByZW1vdmFsIG9mIDUyOSBzYW1wbGVzIGZyb20gdGhlIG91dHB1dCBtYXkgbm90IHdvcmsuIEJlY2F1c2UKKy8vICAgICAgIG1wZWcgbGF5ZXIgMSBmcmFtZSBzaXplIGlzIDM4NCBzYW1wbGVzIHBlciBmcmFtZS4gVGhpcyBzaG91bGQgaW50cm9kdWNlCisvLyAgICAgICBuZWdhdGl2ZSB2YWx1ZXMgYW5kIGNhbiBjYXVzZSBTRUcgZmF1bHRzLiBTb2Z0IG9teCBtcDMgcGx1Z2luIGNhbiBoYXZlCisvLyAgICAgICB0aGlzIHByb2JsZW0gKENIRUNLISkKK3ZvaWQgQzJTb2Z0TVAzOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSByVmlldy5lcnJvcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGluU2l6ZSA9PSAwICYmICghbUdhcGxlc3NCeXRlcyB8fCAhZW9zKSkgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQiLCBpblNpemUsCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKworICAgIGludDMyX3QgbnVtQ2hhbm5lbHMgPSBtQ29uZmlnLT5udW1fY2hhbm5lbHM7CisgICAgc2l6ZV90IGNhbE91dFNpemU7CisgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiBkZWNvZGVkU2l6ZXM7CisgICAgaWYgKGluU2l6ZSAmJiBPSyAhPSBjYWxjdWxhdGVPdXRTaXplKGNvbnN0X2Nhc3Q8dWludDggKj4oclZpZXcuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TaXplLCAmZGVjb2RlZFNpemVzKSkgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FsT3V0U2l6ZSA9IHN0ZDo6YWNjdW11bGF0ZShkZWNvZGVkU2l6ZXMuYmVnaW4oKSwgZGVjb2RlZFNpemVzLmVuZCgpLCAwKTsKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIGNhbE91dFNpemUgKz0ga1BWTVAzRGVjb2RlckRlbGF5ICogbnVtQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKGNhbE91dFNpemUsIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IG91dFNpemUgPSAwOworICAgIGludCBvdXRPZmZzZXQgPSAwOworICAgIGF1dG8gaXQgPSBkZWNvZGVkU2l6ZXMuYmVnaW4oKTsKKyAgICBzaXplX3QgaW5Qb3MgPSAwOworICAgIGludDMyX3Qgc2FtcGxpbmdSYXRlID0gbUNvbmZpZy0+c2FtcGxpbmdSYXRlOworICAgIHdoaWxlIChpblBvcyA8IGluU2l6ZSkgeworICAgICAgICBpZiAoaXQgPT0gZGVjb2RlZFNpemVzLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HRSgidW5leHBlY3RlZCB0cmFpbGluZyBieXRlcywgaWdub3JpbmcgdGhlbSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBtQ29uZmlnLT5wSW5wdXRCdWZmZXIgPSBjb25zdF9jYXN0PHVpbnQ4ICo+KHJWaWV3LmRhdGEoKSArIGluUG9zKTsKKyAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJDdXJyZW50TGVuZ3RoID0gKGluU2l6ZSAtIGluUG9zKTsKKyAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJNYXhMZW5ndGggPSAwOworICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGggPSAwOworICAgICAgICBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgPSAoY2FsT3V0U2l6ZSAtIG91dFNpemUpOworICAgICAgICBtQ29uZmlnLT5wT3V0cHV0QnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90ICo+ICh3Vmlldy5kYXRhKCkgKyBvdXRTaXplKTsKKworICAgICAgICBFUlJPUl9DT0RFIGRlY29kZXJFcnI7CisgICAgICAgIGlmICgoZGVjb2RlckVyciA9IHB2bXAzX2ZyYW1lZGVjb2RlcihtQ29uZmlnLCBtRGVjb2RlckJ1ZikpCisgICAgICAgICAgICAgICAgIT0gTk9fREVDT0RJTkdfRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJtcDMgZGVjb2RlciByZXR1cm5lZCBlcnJvciAlZCIsIGRlY29kZXJFcnIpOworICAgICAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gTk9fRU5PVUdIX01BSU5fREFUQV9FUlJPUgorICAgICAgICAgICAgICAgICAgICAmJiBkZWNvZGVyRXJyICE9IFNJREVfSU5GT19FUlJPUikgeworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVGhpcyBpcyByZWNvdmVyYWJsZSwganVzdCBpZ25vcmUgdGhlIGN1cnJlbnQgZnJhbWUgYW5kCisgICAgICAgICAgICAvLyBwbGF5IHNpbGVuY2UgaW5zdGVhZC4KKyAgICAgICAgICAgIEFMT0dWKCJpZ25vcmluZyBlcnJvciBhbmQgc2VuZGluZyBzaWxlbmNlIik7CisgICAgICAgICAgICBpZiAobUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplID09IDApIHsKKyAgICAgICAgICAgICAgICBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgPSAqaXQgLyBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1zZXQobUNvbmZpZy0+cE91dHB1dEJ1ZmZlciwgMCwgbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgfSBlbHNlIGlmIChtQ29uZmlnLT5zYW1wbGluZ1JhdGUgIT0gc2FtcGxpbmdSYXRlCisgICAgICAgICAgICAgICAgfHwgbUNvbmZpZy0+bnVtX2NoYW5uZWxzICE9IG51bUNoYW5uZWxzKSB7CisgICAgICAgICAgICBBTE9HSSgiUmVjb25maWd1cmluZyBkZWNvZGVyOiAlZC0+JWQgSHosICVkLT4lZCBjaGFubmVscyIsCisgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLCBtQ29uZmlnLT5zYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsIG1Db25maWctPm51bV9jaGFubmVscyk7CisgICAgICAgICAgICBzYW1wbGluZ1JhdGUgPSBtQ29uZmlnLT5zYW1wbGluZ1JhdGU7CisgICAgICAgICAgICBudW1DaGFubmVscyA9IG1Db25maWctPm51bV9jaGFubmVsczsKKworICAgICAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0IHNhbXBsZVJhdGVJbmZvKDB1LCBzYW1wbGluZ1JhdGUpOworICAgICAgICAgICAgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQgY2hhbm5lbENvdW50SW5mbygwdSwgbnVtQ2hhbm5lbHMpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgeyAmc2FtcGxlUmF0ZUluZm8sICZjaGFubmVsQ291bnRJbmZvIH0sCisgICAgICAgICAgICAgICAgICAgIEMyX01BWV9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KHNhbXBsZVJhdGVJbmZvKSk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShjaGFubmVsQ291bnRJbmZvKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDb25maWcgVXBkYXRlIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKml0ICE9IG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSAqIHNpemVvZihpbnQxNl90KSkgeworICAgICAgICAgICAgQUxPR0UoInBhbmljLCBwYXJzZWQgc2l6ZSBkb2VzIG5vdCBtYXRjaCBkZWNvZGVkIHNpemUiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgb3V0U2l6ZSArPSBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgKiBzaXplb2YoaW50MTZfdCk7CisgICAgICAgIGluUG9zICs9IG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aDsKKyAgICAgICAgaXQrKzsKKyAgICB9CisgICAgaWYgKG1Jc0ZpcnN0KSB7CisgICAgICAgIG1Jc0ZpcnN0ID0gZmFsc2U7CisgICAgICAgIG1HYXBsZXNzQnl0ZXMgPSB0cnVlOworICAgICAgICAvLyBUaGUgZGVjb2RlciBkZWxheSBpcyA1Mjkgc2FtcGxlcywgc28gdHJpbSB0aGF0IG1hbnkgc2FtcGxlcyBvZmYKKyAgICAgICAgLy8gdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCBvdXRwdXQgYnVmZmVyLiBUaGlzIGVzc2VudGlhbGx5IG1ha2VzIHRoaXMKKyAgICAgICAgLy8gZGVjb2RlciBoYXZlIHplcm8gZGVsYXksIHdoaWNoIHRoZSByZXN0IG9mIHRoZSBwaXBlbGluZSBhc3N1bWVzLgorICAgICAgICBvdXRPZmZzZXQgPSBrUFZNUDNEZWNvZGVyRGVsYXkgKiBudW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgbUFuY2hvclRpbWVTdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1bGwoKTsKKyAgICB9CisgICAgaWYgKGVvcykgeworICAgICAgICBpZiAoY2FsT3V0U2l6ZSA+PQorICAgICAgICAgICAgb3V0U2l6ZSArIGtQVk1QM0RlY29kZXJEZWxheSAqIG51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpKSB7CisgICAgICAgICAgICBpZiAoIW1lbXNldChyZWludGVycHJldF9jYXN0PGludDE2X3QqPih3Vmlldy5kYXRhKCkgKyBvdXRTaXplKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtQVk1QM0RlY29kZXJEZWxheSAqIG51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpKSkgeworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiQWRkaW5nIDUyOSBzYW1wbGVzIGF0IGVuZCIpOworICAgICAgICAgICAgbUdhcGxlc3NCeXRlcyA9IGZhbHNlOworICAgICAgICAgICAgb3V0U2l6ZSArPSBrUFZNUDNEZWNvZGVyRGVsYXkgKiBudW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHVpbnQ2NF90IG91dFRpbWVTdGFtcCA9IG1Qcm9jZXNzZWRTYW1wbGVzICogMTAwMDAwMGxsIC8gc2FtcGxpbmdSYXRlOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzICs9ICgob3V0U2l6ZSAtIG91dE9mZnNldCkgLyAobnVtQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCkpKTsKKyAgICBBTE9HVigib3V0IGJ1ZmZlciBhdHRyLiBvZmZzZXQgJWQgc2l6ZSAlZCB0aW1lc3RhbXAgJXUiLCBvdXRPZmZzZXQsIG91dFNpemUgLSBvdXRPZmZzZXQsCisgICAgICAgICAgKHVpbnQzMl90KShtQW5jaG9yVGltZVN0YW1wICsgb3V0VGltZVN0YW1wKSk7CisgICAgZGVjb2RlZFNpemVzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soCisgICAgICAgICAgICBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIG91dE9mZnNldCwgb3V0U2l6ZSAtIG91dE9mZnNldCkpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgPSBtQW5jaG9yVGltZVN0YW1wICsgb3V0VGltZVN0YW1wOworICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgfQorfQorCitjbGFzcyBDMlNvZnRNcDNEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0TXAzRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgIG5ldyBDMlNvZnRNUDMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRNUDM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRNUDM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0TVAzOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdE1wM0RlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdE1wM0RlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQzJTb2Z0TXAzRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQzJTb2Z0TXAzRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAyYmRjNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9DMlNvZnRNcDNEZWMuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfTVAzX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfTVAzX0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworCitzdHJ1Y3QgdFBWTVAzRGVjb2RlckV4dGVybmFsOworCitib29sIHBhcnNlTXAzSGVhZGVyKHVpbnQzMl90IGhlYWRlciwgc2l6ZV90ICpmcmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqb3V0X3NhbXBsaW5nX3JhdGUgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqb3V0X2NoYW5uZWxzID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9iaXRyYXRlID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9udW1fc2FtcGxlcyA9IG51bGxwdHIpOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRNUDMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0TVAzKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdE1QMygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga1BWTVAzRGVjb2RlckRlbGF5ID0gNTI5IC8vIHNhbXBsZXMKKyAgICB9OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICB0UFZNUDNEZWNvZGVyRXh0ZXJuYWwgKm1Db25maWc7CisgICAgdm9pZCAqbURlY29kZXJCdWY7CisKKyAgICBib29sIG1Jc0ZpcnN0OworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1HYXBsZXNzQnl0ZXM7CisgICAgdWludDY0X3QgbUFuY2hvclRpbWVTdGFtcDsKKyAgICB1aW50NjRfdCBtUHJvY2Vzc2VkU2FtcGxlczsKKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRNUDMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfTVAzX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9OT1RJQ0UgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjFlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvTk9USUNFCkBAIC0wLDAgKzEsMTkwIEBACisKKyAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL3BhdGVudF9kaXNjbGFpbWVyLnR4dCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9wYXRlbnRfZGlzY2xhaW1lci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRiZjExZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9wYXRlbnRfZGlzY2xhaW1lci50eHQKQEAgLTAsMCArMSw5IEBACisKK1RISVMgSVMgTk9UIEEgR1JBTlQgT0YgUEFURU5UIFJJR0hUUy4KKworR29vZ2xlIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9uIG9yIHdhcnJhbnR5IHRoYXQgdGhlIGNvZGVjcyBmb3Igd2hpY2gKK3NvdXJjZSBjb2RlIGlzIG1hZGUgYXZhaWxhYmxlIGhlcmV1bmRlciBhcmUgdW5lbmN1bWJlcmVkIGJ5Cit0aGlyZC1wYXJ0eSBwYXRlbnRzLiAgVGhvc2UgaW50ZW5kaW5nIHRvIHVzZSB0aGlzIHNvdXJjZSBjb2RlIGluCitoYXJkd2FyZSBvciBzb2Z0d2FyZSBwcm9kdWN0cyBhcmUgYWR2aXNlZCB0aGF0IGltcGxlbWVudGF0aW9ucyBvZgordGhlc2UgY29kZWNzLCBpbmNsdWRpbmcgaW4gb3BlbiBzb3VyY2Ugc29mdHdhcmUgb3Igc2hhcmV3YXJlLCBtYXkKK3JlcXVpcmUgcGF0ZW50IGxpY2Vuc2VzIGZyb20gdGhlIHJlbGV2YW50IHBhdGVudCBob2xkZXJzLgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQxZjBhOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxNiBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9tcGVnMmRlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0TXBlZzJEZWMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJtcGVnMmRlYyJdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJleHRlcm5hbC9saWJtcGVnMi9kZWNvZGVyIiwKKyAgICAgICAgImV4dGVybmFsL2xpYm1wZWcyL2NvbW1vbiIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTMyZWMwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQzJTb2Z0TXBlZzJEZWMuY3BwCkBAIC0wLDAgKzEsMTA2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0TXBlZzJEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPENvZGVjMk1hcHBlci5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRNcGVnMkRlYy5oIgorI2luY2x1ZGUgImltcGVnMmQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQubXBlZzIuZGVjb2RlciI7CisKK2NsYXNzIEMyU29mdE1wZWcyRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTywKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMikgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7IC8vIFRPRE86IGFjY291bnQgZm9yIG91ciBidWZmZXJzIGhlcmUKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKworICAgICAgICAvLyBUT0RPOiBvdXRwdXQgbGF0ZW5jeSBhbmQgcmVvcmRlcmluZworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgxNiwgMTkyMCwgNCksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDE2LCAxMDg4LCA0KSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNpemVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfU0lNUExFLCBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdIKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9TSU1QTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9NQUlOfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDJWX0xPVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVAyVl9NQUlOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDJWX0hJR0hfMTQ0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdIfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4U2l6ZSwgQzJfUEFSQU1LRVlfTUFYX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAxOTIwLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMTA4OCwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihNYXhQaWN0dXJlU2l6ZVNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4SW5wdXRTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMzIwICogMjQwICogMyAvIDIpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1NYXhJbnB1dFNpemUsIHZhbHVlKS5hbnkoKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5jYWxjdWxhdGVkQXMoTWF4SW5wdXRTaXplU2V0dGVyLCBtTWF4U2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgbG9jYXRpb25zWzFdID0geyBDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpIH07CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICAxdSwgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgbWVtY3B5KGRlZmF1bHRDb2xvckluZm8tPm0ubG9jYXRpb25zLCBsb2NhdGlvbnMsIHNpemVvZihsb2NhdGlvbnMpKTsKKworICAgICAgICBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICB7IEMyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCkgfSwKKyAgICAgICAgICAgICAgICAgICAgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgaGVscGVyLT5hZGRTdHJ1Y3REZXNjcmlwdG9yczxDMkNocm9tYU9mZnNldFN0cnVjdD4oKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbG9ySW5mbywgQzJfUEFSQU1LRVlfQ09ERURfQ09MT1JfSU5GTykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoZGVmYXVsdENvbG9ySW5mbykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKERlZmF1bHRDb2xvckFzcGVjdHNTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29kZWRDb2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX1ZVSV9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9MSU1JVEVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihDb2RlZENvbG9yQXNwZWN0c1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKENvbG9yQXNwZWN0c1NldHRlciwgbURlZmF1bHRDb2xvckFzcGVjdHMsIG1Db2RlZENvbG9yQXNwZWN0cykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBtb3JlIGZvcm1hdHM/CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUGl4ZWxGb3JtYXQsIEMyX1BBUkFNS0VZX1BJWEVMX0ZPUk1BVCkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJWaWRlb1NpemVTdHJlYW1JbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYud2lkdGgpLnN1cHBvcnRzQXRBbGwobWUudi53aWR0aCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi53aWR0aCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heFBpY3R1cmVTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmc2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gVE9ETzogZ2V0IG1heCB3aWR0aC9oZWlnaHQgZnJvbSB0aGUgc2l6ZSdzIGZpZWxkIGhlbHBlcnMgdnMuIGhhcmRjb2RpbmcKKyAgICAgICAgbWUuc2V0KCkud2lkdGggPSBjMl9taW4oYzJfbWF4KG1lLnYud2lkdGgsIHNpemUudi53aWR0aCksIDE5MjB1KTsKKyAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gYzJfbWluKGMyX21heChtZS52LmhlaWdodCwgc2l6ZS52LmhlaWdodCksIDEwODh1KTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heElucHV0U2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiAmbWF4U2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gYXNzdW1lIGNvbXByZXNzaW9uIHJhdGlvIG9mIDEKKyAgICAgICAgbWUuc2V0KCkudmFsdWUgPSAoKChtYXhTaXplLnYud2lkdGggKyAxNSkgLyAxNikgKiAoKG1heFNpemUudi5oZWlnaHQgKyAxNSkgLyAxNikgKiAzODQpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZClzaXplOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmIChtZS52LnJhbmdlID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi50cmFuc2ZlciA+IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5tYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIENvZGVkQ29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmIChtZS52LnJhbmdlID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi50cmFuc2ZlciA+IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5tYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gJmRlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gJmNvZGVkKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyB0YWtlIGRlZmF1bHQgdmFsdWVzIGZvciBhbGwgdW5zcGVjaWZpZWQgZmllbGRzLCBhbmQgY29kZWQgdmFsdWVzIGZvciBzcGVjaWZpZWQgb25lcworICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IGNvZGVkLnYucmFuZ2UgPT0gUkFOR0VfVU5TUEVDSUZJRUQgPyBkZWYudi5yYW5nZSA6IGNvZGVkLnYucmFuZ2U7CisgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IGNvZGVkLnYucHJpbWFyaWVzID09IFBSSU1BUklFU19VTlNQRUNJRklFRAorICAgICAgICAgICAgICAgID8gZGVmLnYucHJpbWFyaWVzIDogY29kZWQudi5wcmltYXJpZXM7CisgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gY29kZWQudi50cmFuc2ZlciA9PSBUUkFOU0ZFUl9VTlNQRUNJRklFRAorICAgICAgICAgICAgICAgID8gZGVmLnYudHJhbnNmZXIgOiBjb2RlZC52LnRyYW5zZmVyOworICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBjb2RlZC52Lm1hdHJpeCA9PSBNQVRSSVhfVU5TUEVDSUZJRUQgPyBkZWYudi5tYXRyaXggOiBjb2RlZC52Lm1hdHJpeDsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+IGdldENvbG9yQXNwZWN0c19sKCkgeworICAgICAgICByZXR1cm4gbUNvbG9yQXNwZWN0czsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+IG1NYXhTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbU1heElucHV0U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gbUNvbG9ySW5mbzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gbUNvZGVkQ29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiBtRGVmYXVsdENvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+IG1Db2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQ+IG1QaXhlbEZvcm1hdDsKK307CisKK3N0YXRpYyBzaXplX3QgZ2V0Q3B1Q29yZUNvdW50KCkgeworICAgIGxvbmcgY3B1Q29yZUNvdW50ID0gMTsKKyNpZiBkZWZpbmVkKF9TQ19OUFJPQ0VTU09SU19PTkxOKQorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworI2Vsc2UKKyAgICAvLyBfU0NfTlBST0NfT05MTiBtdXN0IGJlIGRlZmluZWQuLi4KKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ19PTkxOKTsKKyNlbmRpZgorICAgIENIRUNLKGNwdUNvcmVDb3VudCA+PSAxKTsKKyAgICBBTE9HVigiTnVtYmVyIG9mIENQVSBjb3JlczogJWxkIiwgY3B1Q29yZUNvdW50KTsKKyAgICByZXR1cm4gKHNpemVfdCljcHVDb3JlQ291bnQ7Cit9CisKK3N0YXRpYyB2b2lkICppdmRfYWxpZ25lZF9tYWxsb2MoV09SRDMyIGFsaWdubWVudCwgV09SRDMyIHNpemUpIHsKKyAgICByZXR1cm4gbWVtYWxpZ24oYWxpZ25tZW50LCBzaXplKTsKK30KKworc3RhdGljIHZvaWQgaXZkX2FsaWduZWRfZnJlZSh2b2lkICptZW0pIHsKKyAgICBmcmVlKG1lbSk7Cit9CisKK0MyU29mdE1wZWcyRGVjOjpDMlNvZnRNcGVnMkRlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgICAgbURlY0hhbmRsZShudWxscHRyKSwKKyAgICAgICAgbU1lbVJlY29yZHMobnVsbHB0ciksCisgICAgICAgIG1PdXRCdWZmZXJEcmFpbihudWxscHRyKSwKKyAgICAgICAgbUl2Q29sb3Jmb3JtYXQoSVZfWVVWXzQyMFApLAorICAgICAgICBtV2lkdGgoMzIwKSwKKyAgICAgICAgbUhlaWdodCgyNDApIHsKKyAgICAvLyBJZiBpbnB1dCBkdW1wIGlzIGVuYWJsZWQsIHRoZW4gb3BlbiBjcmVhdGUgYW4gZW1wdHkgZmlsZQorICAgIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKTsKKyAgICBDUkVBVEVfRFVNUF9GSUxFKG1JbkZpbGUpOworfQorCitDMlNvZnRNcGVnMkRlYzo6fkMyU29mdE1wZWcyRGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6b25TdG9wKCkgeworICAgIGlmIChPSyAhPSByZXNldERlY29kZXIoKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICByZXNldFBsdWdpbigpOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRNcGVnMkRlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZCkgb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzJEZWM6Om9uUmVsZWFzZSgpIHsKKyAgICAodm9pZCkgZGVsZXRlRGVjb2RlcigpOworICAgIGlmIChtT3V0QnVmZmVyRHJhaW4pIHsKKyAgICAgICAgaXZkX2FsaWduZWRfZnJlZShtT3V0QnVmZmVyRHJhaW4pOworICAgICAgICBtT3V0QnVmZmVyRHJhaW4gPSBudWxscHRyOworICAgIH0KKyAgICBpZiAobU91dEJsb2NrKSB7CisgICAgICAgIG1PdXRCbG9jay5yZXNldCgpOworICAgIH0KKyAgICBpZiAobU1lbVJlY29yZHMpIHsKKyAgICAgICAgaXZkX2FsaWduZWRfZnJlZShtTWVtUmVjb3Jkcyk7CisgICAgICAgIG1NZW1SZWNvcmRzID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIGlmIChPSyAhPSBzZXRGbHVzaE1vZGUoKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKworICAgIHVpbnQzMl90IGRpc3BsYXlTdHJpZGUgPSBtU3RyaWRlOworICAgIHVpbnQzMl90IGRpc3BsYXlIZWlnaHQgPSBtSGVpZ2h0OworICAgIHVpbnQzMl90IGJ1ZmZlclNpemUgPSBkaXNwbGF5U3RyaWRlICogZGlzcGxheUhlaWdodCAqIDMgLyAyOworICAgIG1PdXRCdWZmZXJEcmFpbiA9ICh1aW50OF90ICopaXZkX2FsaWduZWRfbWFsbG9jKDEyOCwgYnVmZmVyU2l6ZSk7CisgICAgaWYgKCFtT3V0QnVmZmVyRHJhaW4pIHsKKyAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBhbGxvY2F0ZSB0bXAgb3V0cHV0IGJ1ZmZlciAoZm9yIGZsdXNoKSBvZiBzaXplICV1ICIsIGJ1ZmZlclNpemUpOworICAgICAgICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgIH0KKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY29kZV9pcDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjb2RlX29wOworCisgICAgICAgIHNldERlY29kZUFyZ3MoJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3AsIG51bGxwdHIsIG51bGxwdHIsIDAsIDAsIDApOworICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgaWYgKDAgPT0gc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtT3V0QnVmZmVyRHJhaW4pIHsKKyAgICAgICAgaXZkX2FsaWduZWRfZnJlZShtT3V0QnVmZmVyRHJhaW4pOworICAgICAgICBtT3V0QnVmZmVyRHJhaW4gPSBudWxscHRyOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OmdldE51bU1lbVJlY29yZHMoKSB7CisgICAgaXZfbnVtX21lbV9yZWNfaXBfdCBzX251bV9tZW1fcmVjX2lwOworICAgIGl2X251bV9tZW1fcmVjX29wX3Qgc19udW1fbWVtX3JlY19vcDsKKworICAgIHNfbnVtX21lbV9yZWNfaXAudTRfc2l6ZSA9IHNpemVvZihzX251bV9tZW1fcmVjX2lwKTsKKyAgICBzX251bV9tZW1fcmVjX2lwLmVfY21kID0gSVZfQ01EX0dFVF9OVU1fTUVNX1JFQzsKKyAgICBzX251bV9tZW1fcmVjX29wLnU0X3NpemUgPSBzaXplb2Yoc19udW1fbWVtX3JlY19vcCk7CisKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfbnVtX21lbV9yZWNfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX251bV9tZW1fcmVjX29wKTsKKyAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIGdldHRpbmcgbWVtIHJlY29yZHM6IDB4JXgiLCBzX251bV9tZW1fcmVjX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgbU51bU1lbVJlY29yZHMgPSBzX251bV9tZW1fcmVjX29wLnU0X251bV9tZW1fcmVjOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6ZmlsbE1lbVJlY29yZHMoKSB7CisgICAgaXZfbWVtX3JlY190ICpwc19tZW1fcmVjID0gKGl2X21lbV9yZWNfdCAqKSBpdmRfYWxpZ25lZF9tYWxsb2MoCisgICAgICAgICAgICAxMjgsIG1OdW1NZW1SZWNvcmRzICogc2l6ZW9mKGl2X21lbV9yZWNfdCkpOworICAgIGlmICghcHNfbWVtX3JlYykgeworICAgICAgICBBTE9HRSgiQWxsb2NhdGlvbiBmYWlsdXJlIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorICAgIG1lbXNldChwc19tZW1fcmVjLCAwLCBtTnVtTWVtUmVjb3JkcyAqIHNpemVvZihpdl9tZW1fcmVjX3QpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1NZW1SZWNvcmRzOyBpKyspCisgICAgICAgIHBzX21lbV9yZWNbaV0udTRfc2l6ZSA9IHNpemVvZihpdl9tZW1fcmVjX3QpOworICAgIG1NZW1SZWNvcmRzID0gcHNfbWVtX3JlYzsKKworICAgIGl2ZGV4dF9maWxsX21lbV9yZWNfaXBfdCBzX2ZpbGxfbWVtX2lwOworICAgIGl2ZGV4dF9maWxsX21lbV9yZWNfb3BfdCBzX2ZpbGxfbWVtX29wOworCisgICAgc19maWxsX21lbV9pcC5zX2l2ZF9maWxsX21lbV9yZWNfaXBfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9maWxsX21lbV9yZWNfaXBfdCk7CisgICAgc19maWxsX21lbV9pcC51NF9zaGFyZV9kaXNwX2J1ZiA9IDA7CisgICAgc19maWxsX21lbV9pcC5lX291dHB1dF9mb3JtYXQgPSBtSXZDb2xvcmZvcm1hdDsKKyAgICBzX2ZpbGxfbWVtX2lwLnU0X2RlaW50ZXJsYWNlID0gMTsKKyAgICBzX2ZpbGxfbWVtX2lwLnNfaXZkX2ZpbGxfbWVtX3JlY19pcF90LmVfY21kID0gSVZfQ01EX0ZJTExfTlVNX01FTV9SRUM7CisgICAgc19maWxsX21lbV9pcC5zX2l2ZF9maWxsX21lbV9yZWNfaXBfdC5wdl9tZW1fcmVjX2xvY2F0aW9uID0gbU1lbVJlY29yZHM7CisgICAgc19maWxsX21lbV9pcC5zX2l2ZF9maWxsX21lbV9yZWNfaXBfdC51NF9tYXhfZnJtX3dkID0gbVdpZHRoOworICAgIHNfZmlsbF9tZW1faXAuc19pdmRfZmlsbF9tZW1fcmVjX2lwX3QudTRfbWF4X2ZybV9odCA9IG1IZWlnaHQ7CisgICAgc19maWxsX21lbV9vcC5zX2l2ZF9maWxsX21lbV9yZWNfb3BfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9maWxsX21lbV9yZWNfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2ZpbGxfbWVtX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19maWxsX21lbV9vcCk7CisgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBpbiBmaWxsaW5nIG1lbSByZWNvcmRzOiAweCV4IiwKKyAgICAgICAgICAgICAgc19maWxsX21lbV9vcC5zX2l2ZF9maWxsX21lbV9yZWNfb3BfdC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgQ0hFQ0tfRVEobU51bU1lbVJlY29yZHMsIHNfZmlsbF9tZW1fb3Auc19pdmRfZmlsbF9tZW1fcmVjX29wX3QudTRfbnVtX21lbV9yZWNfZmlsbGVkKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1NZW1SZWNvcmRzOyBpKyssIHBzX21lbV9yZWMrKykgeworICAgICAgICBwc19tZW1fcmVjLT5wdl9iYXNlID0gaXZkX2FsaWduZWRfbWFsbG9jKAorICAgICAgICAgICAgICAgIHBzX21lbV9yZWMtPnU0X21lbV9hbGlnbm1lbnQsIHBzX21lbV9yZWMtPnU0X21lbV9zaXplKTsKKyAgICAgICAgaWYgKCFwc19tZW1fcmVjLT5wdl9iYXNlKSB7CisgICAgICAgICAgICBBTE9HRSgiQWxsb2NhdGlvbiBmYWlsdXJlIGZvciBtZW1vcnkgcmVjb3JkICMlenUgb2Ygc2l6ZSAldSIsCisgICAgICAgICAgICAgICAgICBpLCBwc19tZW1fcmVjLT51NF9tZW1fc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6Y3JlYXRlRGVjb2RlcigpIHsKKyAgICBpdmRleHRfaW5pdF9pcF90IHNfaW5pdF9pcDsKKyAgICBpdmRleHRfaW5pdF9vcF90IHNfaW5pdF9vcDsKKworICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfaW5pdF9pcF90KTsKKyAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LmVfY21kID0gKElWRF9BUElfQ09NTUFORF9UWVBFX1QpSVZfQ01EX0lOSVQ7CisgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC5wdl9tZW1fcmVjX2xvY2F0aW9uID0gbU1lbVJlY29yZHM7CisgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC51NF9mcm1fbWF4X3dkID0gbVdpZHRoOworICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QudTRfZnJtX21heF9odCA9IG1IZWlnaHQ7CisgICAgc19pbml0X2lwLnU0X3NoYXJlX2Rpc3BfYnVmID0gMDsKKyAgICBzX2luaXRfaXAudTRfZGVpbnRlcmxhY2UgPSAxOworICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QudTRfbnVtX21lbV9yZWMgPSBtTnVtTWVtUmVjb3JkczsKKyAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LmVfb3V0cHV0X2Zvcm1hdCA9IG1JdkNvbG9yZm9ybWF0OworICAgIHNfaW5pdF9vcC5zX2l2ZF9pbml0X29wX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfaW5pdF9vcF90KTsKKworICAgIG1EZWNIYW5kbGUgPSAoaXZfb2JqX3QgKiltTWVtUmVjb3Jkc1swXS5wdl9iYXNlOworICAgIG1EZWNIYW5kbGUtPnB2X2Z4bnMgPSAodm9pZCAqKWl2ZGVjX2FwaV9mdW5jdGlvbjsKKyAgICBtRGVjSGFuZGxlLT51NF9zaXplID0gc2l6ZW9mKGl2X29ial90KTsKKworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19pbml0X2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19pbml0X29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sCisgICAgICAgICAgICAgIHNfaW5pdF9vcC5zX2l2ZF9pbml0X29wX3QudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OnNldE51bUNvcmVzKCkgeworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90IHNfc2V0X251bV9jb3Jlc19pcDsKKyAgICBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCBzX3NldF9udW1fY29yZXNfb3A7CisKKyAgICBzX3NldF9udW1fY29yZXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCk7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLmVfc3ViX2NtZCA9IElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVM7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLnU0X251bV9jb3JlcyA9IG1OdW1Db3JlczsKKyAgICBzX3NldF9udW1fY29yZXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9udW1fY29yZXNfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9udW1fY29yZXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRCgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19zZXRfbnVtX2NvcmVzX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpzZXRQYXJhbXMoc2l6ZV90IHN0cmlkZSkgeworICAgIGl2ZF9jdGxfc2V0X2NvbmZpZ19pcF90IHNfc2V0X2R5bl9wYXJhbXNfaXA7CisgICAgaXZkX2N0bF9zZXRfY29uZmlnX29wX3Qgc19zZXRfZHluX3BhcmFtc19vcDsKKworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3NldF9jb25maWdfaXBfdCk7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfU0VUUEFSQU1TOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAudTRfZGlzcF93ZCA9IChVV09SRDMyKSBzdHJpZGU7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX2ZybV9za2lwX21vZGUgPSBJVkRfU0tJUF9OT05FOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9mcm1fb3V0X21vZGUgPSBJVkRfRElTUExBWV9GUkFNRV9PVVQ7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX3ZpZF9kZWNfbW9kZSA9IElWRF9ERUNPREVfRlJBTUU7CisgICAgc19zZXRfZHluX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2R5bl9wYXJhbXNfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9keW5fcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfc2V0X2R5bl9wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OmdldFZlcnNpb24oKSB7CisgICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90IHNfZ2V0X3ZlcnNpb25pbmZvX2lwOworICAgIGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCBzX2dldF92ZXJzaW9uaW5mb19vcDsKKyAgICBVV09SRDggYXUxX2J1Zls1MTJdOworCisgICAgc19nZXRfdmVyc2lvbmluZm9faXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2dldHZlcnNpb25pbmZvX2lwX3QpOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfR0VUVkVSU0lPTjsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC5wdl92ZXJzaW9uX2J1ZmZlciA9IGF1MV9idWY7CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAudTRfdmVyc2lvbl9idWZmZXJfc2l6ZSA9IHNpemVvZihhdTFfYnVmKTsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2dldF92ZXJzaW9uaW5mb19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZ2V0X3ZlcnNpb25pbmZvX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0QoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sCisgICAgICAgICAgICAgIHNfZ2V0X3ZlcnNpb25pbmZvX29wLnU0X2Vycm9yX2NvZGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJpdHRpYW0gZGVjb2RlciB2ZXJzaW9uIG51bWJlcjogJXMiLAorICAgICAgICAgICAgICAoY2hhciAqKSBzX2dldF92ZXJzaW9uaW5mb19pcC5wdl92ZXJzaW9uX2J1ZmZlcik7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6aW5pdERlY29kZXIoKSB7CisgICAgc3RhdHVzX3QgcmV0ID0gZ2V0TnVtTWVtUmVjb3JkcygpOworICAgIGlmIChPSyAhPSByZXQpIHJldHVybiByZXQ7CisKKyAgICByZXQgPSBmaWxsTWVtUmVjb3JkcygpOworICAgIGlmIChPSyAhPSByZXQpIHJldHVybiByZXQ7CisKKyAgICBpZiAoT0sgIT0gY3JlYXRlRGVjb2RlcigpKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKworICAgIG1OdW1Db3JlcyA9IE1JTihnZXRDcHVDb3JlQ291bnQoKSwgTUFYX05VTV9DT1JFUyk7CisgICAgbVN0cmlkZSA9IEFMSUdONjQobVdpZHRoKTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICByZXNldFBsdWdpbigpOworICAgICh2b2lkKSBzZXROdW1Db3JlcygpOworICAgIGlmIChPSyAhPSBzZXRQYXJhbXMobVN0cmlkZSkpIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICh2b2lkKSBnZXRWZXJzaW9uKCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgQzJTb2Z0TXBlZzJEZWM6OnNldERlY29kZUFyZ3MoaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNvZGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjb2RlX29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlJlYWRWaWV3ICppbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJHcmFwaGljVmlldyAqb3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRzTWFya2VyKSB7CisgICAgdWludDMyX3QgZGlzcGxheVN0cmlkZSA9IG1TdHJpZGU7CisgICAgdWludDMyX3QgZGlzcGxheUhlaWdodCA9IG1IZWlnaHQ7CisgICAgc2l6ZV90IGx1bWFTaXplID0gZGlzcGxheVN0cmlkZSAqIGRpc3BsYXlIZWlnaHQ7CisgICAgc2l6ZV90IGNocm9tYVNpemUgPSBsdW1hU2l6ZSA+PiAyOworCisgICAgcHNfZGVjb2RlX2lwLT51NF9zaXplID0gc2l6ZW9mKGl2ZF92aWRlb19kZWNvZGVfaXBfdCk7CisgICAgcHNfZGVjb2RlX2lwLT5lX2NtZCA9IElWRF9DTURfVklERU9fREVDT0RFOworICAgIGlmIChpbkJ1ZmZlcikgeworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X3RzID0gdHNNYXJrZXI7CisgICAgICAgIHBzX2RlY29kZV9pcC0+cHZfc3RyZWFtX2J1ZmZlciA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihpbkJ1ZmZlci0+ZGF0YSgpICsgaW5PZmZzZXQpOworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X251bV9CeXRlcyA9IGluU2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X3RzID0gMDsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5wdl9zdHJlYW1fYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF9udW1fQnl0ZXMgPSAwOworICAgIH0KKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzBdID0gbHVtYVNpemU7CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVsxXSA9IGNocm9tYVNpemU7CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVsyXSA9IGNocm9tYVNpemU7CisgICAgaWYgKG91dEJ1ZmZlcikgeworICAgICAgICBpZiAob3V0QnVmZmVyLT53aWR0aCgpIDwgZGlzcGxheVN0cmlkZSB8fCBvdXRCdWZmZXItPmhlaWdodCgpIDwgZGlzcGxheUhlaWdodCkgeworICAgICAgICAgICAgQUxPR0UoIk91dHB1dCBidWZmZXIgdG9vIHNtYWxsOiBwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICgldXgldSkiLAorICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT53aWR0aCgpLCBvdXRCdWZmZXItPmhlaWdodCgpLCBkaXNwbGF5U3RyaWRlLCBkaXNwbGF5SGVpZ2h0KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1swXSA9IG91dEJ1ZmZlci0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMV0gPSBvdXRCdWZmZXItPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzJdID0gb3V0QnVmZmVyLT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworICAgIH0gZWxzZSB7CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzBdID0gbU91dEJ1ZmZlckRyYWluOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1sxXSA9IG1PdXRCdWZmZXJEcmFpbiArIGx1bWFTaXplOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1syXSA9IG1PdXRCdWZmZXJEcmFpbiArIGx1bWFTaXplICsgY2hyb21hU2l6ZTsKKyAgICB9CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbnVtX2J1ZnMgPSAzOworICAgIHBzX2RlY29kZV9vcC0+dTRfc2l6ZSA9IHNpemVvZihpdmRfdmlkZW9fZGVjb2RlX29wX3QpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKKworYm9vbCBDMlNvZnRNcGVnMkRlYzo6Z2V0U2VxSW5mbygpIHsKKyAgICBpdmRleHRfY3RsX2dldF9zZXFfaW5mb19pcF90IHNfY3RsX2dldF9zZXFfaW5mb19pcDsKKyAgICBpdmRleHRfY3RsX2dldF9zZXFfaW5mb19vcF90IHNfY3RsX2dldF9zZXFfaW5mb19vcDsKKworICAgIHNfY3RsX2dldF9zZXFfaW5mb19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfZ2V0X3NlcV9pbmZvX2lwX3QpOworICAgIHNfY3RsX2dldF9zZXFfaW5mb19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfY3RsX2dldF9zZXFfaW5mb19pcC5lX3N1Yl9jbWQgPQorICAgICAgICAoSVZEX0NPTlRST0xfQVBJX0NPTU1BTkRfVFlQRV9UKUlNUEVHMkRfQ01EX0NUTF9HRVRfU0VRX0lORk87CisgICAgc19jdGxfZ2V0X3NlcV9pbmZvX29wLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9nZXRfc2VxX2luZm9fb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2N0bF9nZXRfc2VxX2luZm9faXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2N0bF9nZXRfc2VxX2luZm9fb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HVygiRXJyb3IgaW4gZ2V0dGluZyBTZXF1ZW5jZSBpbmZvOiAweCV4Iiwgc19jdGxfZ2V0X3NlcV9pbmZvX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgVnVpQ29sb3JBc3BlY3RzIHZ1aUNvbG9yQXNwZWN0czsKKyAgICB2dWlDb2xvckFzcGVjdHMucHJpbWFyaWVzID0gc19jdGxfZ2V0X3NlcV9pbmZvX29wLnUxX2NvbG91cl9wcmltYXJpZXM7CisgICAgdnVpQ29sb3JBc3BlY3RzLnRyYW5zZmVyID0gc19jdGxfZ2V0X3NlcV9pbmZvX29wLnUxX3RyYW5zZmVyX2NoYXJhY3RlcmlzdGljczsKKyAgICB2dWlDb2xvckFzcGVjdHMuY29lZmZzID0gc19jdGxfZ2V0X3NlcV9pbmZvX29wLnUxX21hdHJpeF9jb2VmZmljaWVudHM7CisgICAgdnVpQ29sb3JBc3BlY3RzLmZ1bGxSYW5nZSA9ICBmYWxzZTsgIC8vIG1wZWcyIHZpZGVvIGhhcyBsaW1pdGVkIHJhbmdlLgorCisgICAgLy8gY29udmVydCB2dWkgYXNwZWN0cyB0byBDMiB2YWx1ZXMgaWYgY2hhbmdlZAorICAgIGlmICghKHZ1aUNvbG9yQXNwZWN0cyA9PSBtQml0c3RyZWFtQ29sb3JBc3BlY3RzKSkgeworICAgICAgICBtQml0c3RyZWFtQ29sb3JBc3BlY3RzID0gdnVpQ29sb3JBc3BlY3RzOworICAgICAgICBDb2xvckFzcGVjdHMgc2ZBc3BlY3RzOworICAgICAgICBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0IGNvZGVkQXNwZWN0cyA9IHsgMHUgfTsKKyAgICAgICAgQ29sb3JVdGlsczo6Y29udmVydElzb0NvbG9yQXNwZWN0c1RvQ29kZWNBc3BlY3RzKAorICAgICAgICAgICAgICAgIHZ1aUNvbG9yQXNwZWN0cy5wcmltYXJpZXMsIHZ1aUNvbG9yQXNwZWN0cy50cmFuc2ZlciwgdnVpQ29sb3JBc3BlY3RzLmNvZWZmcywKKyAgICAgICAgICAgICAgICB2dWlDb2xvckFzcGVjdHMuZnVsbFJhbmdlLCBzZkFzcGVjdHMpOworICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1QcmltYXJpZXMsICZjb2RlZEFzcGVjdHMucHJpbWFyaWVzKSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1SYW5nZSwgJmNvZGVkQXNwZWN0cy5yYW5nZSkpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubU1hdHJpeENvZWZmcywgJmNvZGVkQXNwZWN0cy5tYXRyaXgpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubVRyYW5zZmVyLCAmY29kZWRBc3BlY3RzLnRyYW5zZmVyKSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAodm9pZCltSW50Zi0+Y29uZmlnKHsmY29kZWRBc3BlY3RzfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OnNldEZsdXNoTW9kZSgpIHsKKyAgICBpdmRfY3RsX2ZsdXNoX2lwX3Qgc19zZXRfZmx1c2hfaXA7CisgICAgaXZkX2N0bF9mbHVzaF9vcF90IHNfc2V0X2ZsdXNoX29wOworCisgICAgc19zZXRfZmx1c2hfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2ZsdXNoX2lwX3QpOworICAgIHNfc2V0X2ZsdXNoX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfZmx1c2hfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfRkxVU0g7CisgICAgc19zZXRfZmx1c2hfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2ZsdXNoX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZmx1c2hfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9mbHVzaF9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3NldF9mbHVzaF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6cmVzZXREZWNvZGVyKCkgeworICAgIGl2ZF9jdGxfcmVzZXRfaXBfdCBzX3Jlc2V0X2lwOworICAgIGl2ZF9jdGxfcmVzZXRfb3BfdCBzX3Jlc2V0X29wOworCisgICAgc19yZXNldF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfcmVzZXRfaXBfdCk7CisgICAgc19yZXNldF9pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfcmVzZXRfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfUkVTRVQ7CisgICAgc19yZXNldF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfcmVzZXRfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3Jlc2V0X2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19yZXNldF9vcCk7CisgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3Jlc2V0X29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgKHZvaWQpIHNldE51bUNvcmVzKCk7CisgICAgbVN0cmlkZSA9IDA7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzJEZWM6OnJlc2V0UGx1Z2luKCkgeworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVFbmQsIG51bGxwdHIpOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6ZGVsZXRlRGVjb2RlcigpIHsKKyAgICBpZiAobU1lbVJlY29yZHMpIHsKKyAgICAgICAgaXZfbWVtX3JlY190ICpwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtTWVtUmVjb3JkczsgaSsrLCBwc19tZW1fcmVjKyspIHsKKyAgICAgICAgICAgIGlmIChwc19tZW1fcmVjLT5wdl9iYXNlKSB7CisgICAgICAgICAgICAgICAgaXZkX2FsaWduZWRfZnJlZShwc19tZW1fcmVjLT5wdl9iYXNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG1NZW1SZWNvcmRzKTsKKyAgICAgICAgbU1lbVJlY29yZHMgPSBudWxscHRyOworICAgIH0KKyAgICBtRGVjSGFuZGxlID0gbnVsbHB0cjsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OnJlSW5pdERlY29kZXIoKSB7CisgICAgZGVsZXRlRGVjb2RlcigpOworCisgICAgc3RhdHVzX3QgcmV0ID0gaW5pdERlY29kZXIoKTsKKyAgICBpZiAoT0sgIT0gcmV0KSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBkZWNvZGVyIik7CisgICAgICAgIGRlbGV0ZURlY29kZXIoKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzJEZWM6OmZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBjcmVhdGVHcmFwaGljQnVmZmVyKHN0ZDo6bW92ZShtT3V0QmxvY2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlJlY3QobVdpZHRoLCBtSGVpZ2h0KSk7CisgICAgbU91dEJsb2NrID0gbnVsbHB0cjsKKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBidWZmZXItPnNldEluZm8obUludGYtPmdldENvbG9yQXNwZWN0c19sKCkpOworICAgIH0KKworICAgIGF1dG8gZmlsbFdvcmsgPSBbYnVmZmVyXShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpMDsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB9OworICAgIGlmICh3b3JrICYmIGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpIHsKKyAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmluaXNoKGluZGV4LCBmaWxsV29yayk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6ZW5zdXJlRGVjb2RlclN0YXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICBpZiAoIW1EZWNIYW5kbGUpIHsKKyAgICAgICAgQUxPR0UoIm5vdCBzdXBwb3NlZCB0byBiZSBoZXJlLCBpbnZhbGlkIGRlY29kZXIgY29udGV4dCIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICBpZiAobVN0cmlkZSAhPSBBTElHTjY0KG1XaWR0aCkpIHsKKyAgICAgICAgbVN0cmlkZSA9IEFMSUdONjQobVdpZHRoKTsKKyAgICAgICAgaWYgKE9LICE9IHNldFBhcmFtcyhtU3RyaWRlKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgaWYgKG1PdXRCbG9jayAmJgorICAgICAgICAgICAgKG1PdXRCbG9jay0+d2lkdGgoKSAhPSBtU3RyaWRlIHx8IG1PdXRCbG9jay0+aGVpZ2h0KCkgIT0gbUhlaWdodCkpIHsKKyAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CisgICAgfQorICAgIGlmICghbU91dEJsb2NrKSB7CisgICAgICAgIHVpbnQzMl90IGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaEdyYXBoaWNCbG9jayhtU3RyaWRlLCBtSGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCAmbU91dEJsb2NrKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoImZldGNoR3JhcGhpY0Jsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoInByb3ZpZGVkICglZHglZCkgcmVxdWlyZWQgKCVkeCVkKSIsCisgICAgICAgICAgICAgIG1PdXRCbG9jay0+d2lkdGgoKSwgbU91dEJsb2NrLT5oZWlnaHQoKSwgbVN0cmlkZSwgbUhlaWdodCk7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCisvLyBUT0RPOiBjYW4gb3ZlcmFsbCBlcnJvciBjaGVja2luZyBiZSBpbXByb3ZlZD8KKy8vIFRPRE86IGFsbG93IGNvbmZpZ3VyYXRpb24gb2YgY29sb3IgZm9ybWF0IGFuZCB1c2FnZSBmb3IgZ3JhcGhpYyBidWZmZXJzIGluc3RlYWQKKy8vICAgICAgIG9mIGhhcmQgY29kaW5nIHRoZW0gdG8gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyCisvLyBUT0RPOiBwYXNzIGNvbG9yYXNwZWN0cyBpbmZvcm1hdGlvbiB0byBzdXJmYWNlCisvLyBUT0RPOiB0ZXN0IHN1cHBvcnQgZm9yIGR5bmFtaWMgY2hhbmdlIGluIHJlc29sdXRpb24KKy8vIFRPRE86IHZlcmlmeSBpZiB0aGUgZGVjb2RlciBzZW50IGJhY2sgYWxsIGZyYW1lcwordm9pZCBDMlNvZnRNcGVnMkRlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIHVpbnQzMl90IHdvcmtJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpICYgMHhGRkZGRkZGRjsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBib29sIGhhc1BpY3R1cmUgPSBmYWxzZTsKKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQsIGZsYWdzICV4IiwKKyAgICAgICAgICBpblNpemUsIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLCB3b3JrLT5pbnB1dC5mbGFncyk7CisgICAgc2l6ZV90IGluUG9zID0gMDsKKyAgICB3aGlsZSAoaW5Qb3MgPCBpblNpemUpIHsKKyAgICAgICAgaWYgKEMyX09LICE9IGVuc3VyZURlY29kZXJTdGF0ZShwb29sKSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQzJHcmFwaGljVmlldyB3VmlldyA9IG1PdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY29kZV9pcDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjb2RlX29wOworICAgICAgICBpZiAoIXNldERlY29kZUFyZ3MoJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3AsICZyVmlldywgJndWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5PZmZzZXQgKyBpblBvcywgaW5TaXplIC0gaW5Qb3MsIHdvcmtJbmRleCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIElmIGlucHV0IGR1bXAgaXMgZW5hYmxlZCwgdGhlbiB3cml0ZSB0byBmaWxlCisgICAgICAgIERVTVBfVE9fRklMRShtSW5GaWxlLCBzX2RlY29kZV9pcC5wdl9zdHJlYW1fYnVmZmVyLCBzX2RlY29kZV9pcC51NF9udW1fQnl0ZXMpOworICAgICAgICBXT1JEMzIgZGVsYXk7CisgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgICAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIGRlbGF5KTsKKyAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgIFdPUkQzMiBkZWNvZGVUaW1lOworICAgICAgICBHRVRUSU1FKCZtVGltZUVuZCwgbnVsbHB0cik7CisgICAgICAgIFRJTUVfRElGRihtVGltZVN0YXJ0LCBtVGltZUVuZCwgZGVjb2RlVGltZSk7CisgICAgICAgIEFMT0dWKCJkZWNvZGVUaW1lPSU2ZCBkZWxheT0lNmQgbnVtQnl0ZXM9JTZkICIsIGRlY29kZVRpbWUsIGRlbGF5LAorICAgICAgICAgICAgICBzX2RlY29kZV9vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQpOworICAgICAgICBpZiAoSU1QRUcyRF9VTlNVUFBPUlRFRF9ESU1FTlNJT05TID09IHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUpIHsKKyAgICAgICAgICAgIEFMT0dWKCJ1bnN1cHBvcnRlZCByZXNvbHV0aW9uIDogJWR4JWQiLCBzX2RlY29kZV9vcC51NF9waWNfd2QsIHNfZGVjb2RlX29wLnU0X3BpY19odCk7CisgICAgICAgICAgICBkcmFpbkludGVybmFsKERSQUlOX0NPTVBPTkVOVF9OT19FT1MsIHBvb2wsIHdvcmspOworICAgICAgICAgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMHU7CisgICAgICAgICAgICBtV2lkdGggPSBzX2RlY29kZV9vcC51NF9waWNfd2Q7CisgICAgICAgICAgICBtSGVpZ2h0ID0gc19kZWNvZGVfb3AudTRfcGljX2h0OworCisgICAgICAgICAgICBBTE9HSSgiQ29uZmlndXJpbmcgZGVjb2RlcjogbVdpZHRoICVkICwgbUhlaWdodCAlZCAiLAorICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICBDMlZpZGVvU2l6ZVN0cmVhbUluZm86Om91dHB1dCBzaXplKDB1LCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0KKyAgICAgICAgICAgICAgICBtSW50Zi0+Y29uZmlnKHsmc2l6ZX0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShzaXplKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDYW5ub3Qgc2V0IHdpZHRoIGFuZCBoZWlnaHQiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKE9LICE9IHJlSW5pdERlY29kZXIoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVpbml0aWFsaXplIGRlY29kZXIiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKElWRF9SRVNfQ0hBTkdFRCA9PSAoc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSAmIDB4RkYpKSB7CisgICAgICAgICAgICBBTE9HVigicmVzb2x1dGlvbiBjaGFuZ2VkIik7CisgICAgICAgICAgICBkcmFpbkludGVybmFsKERSQUlOX0NPTVBPTkVOVF9OT19FT1MsIHBvb2wsIHdvcmspOworICAgICAgICAgICAgcmVzZXREZWNvZGVyKCk7CisgICAgICAgICAgICByZXNldFBsdWdpbigpOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICgwIDwgc19kZWNvZGVfb3AudTRfcGljX3dkICYmIDAgPCBzX2RlY29kZV9vcC51NF9waWNfaHQpIHsKKyAgICAgICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9waWNfd2QgIT0gbVdpZHRoIHx8ICBzX2RlY29kZV9vcC51NF9waWNfaHQgIT0gbUhlaWdodCkgeworICAgICAgICAgICAgICAgIG1XaWR0aCA9IHNfZGVjb2RlX29wLnU0X3BpY193ZDsKKyAgICAgICAgICAgICAgICBtSGVpZ2h0ID0gc19kZWNvZGVfb3AudTRfcGljX2h0OworICAgICAgICAgICAgICAgIENIRUNLX0VRKDB1LCBzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCk7CisKKyAgICAgICAgICAgICAgICBBTE9HSSgiQ29uZmlndXJpbmcgZGVjb2RlciBvdXQ6IG1XaWR0aCAlZCAsIG1IZWlnaHQgJWQgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBDMlZpZGVvU2l6ZVN0cmVhbUluZm86Om91dHB1dCBzaXplKDB1LCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICAgICAgICAgICAgICBtSW50Zi0+Y29uZmlnKHsmc2l6ZX0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShzaXplKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBzZXQgd2lkdGggYW5kIGhlaWdodCIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAodm9pZCkgZ2V0U2VxSW5mbygpOworICAgICAgICBoYXNQaWN0dXJlIHw9ICgxID09IHNfZGVjb2RlX29wLnU0X2ZyYW1lX2RlY29kZWRfZmxhZyk7CisgICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgZmluaXNoV29yayhzX2RlY29kZV9vcC51NF90cywgd29yayk7CisgICAgICAgIH0KKworICAgICAgICBpblBvcyArPSBzX2RlY29kZV9vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQ7CisgICAgICAgIGlmIChoYXNQaWN0dXJlICYmIChpblNpemUgLSBpblBvcykgIT0gMCkgeworICAgICAgICAgICAgQUxPR0QoImRlY29kZWQgZnJhbWUgaW4gY3VycmVudCBhY2Nlc3MgbmFsLCBpZ25vcmluZyBmdXJ0aGVyIHRyYWlsaW5nIGJ5dGVzICVkIiwKKyAgICAgICAgICAgICAgICAgIChpbnQpaW5TaXplIC0gKGludClpblBvcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChlb3MpIHsKKyAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsIHBvb2wsIHdvcmspOworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKCFoYXNQaWN0dXJlKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6ZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICBpZiAoT0sgIT0gc2V0Rmx1c2hNb2RlKCkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaWYgKEMyX09LICE9IGVuc3VyZURlY29kZXJTdGF0ZShwb29sKSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBtT3V0QmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY29kZV9pcDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjb2RlX29wOworICAgICAgICBpZiAoIXNldERlY29kZUFyZ3MoJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3AsIG51bGxwdHIsICZ3VmlldywgMCwgMCwgMCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICBmaW5pc2hXb3JrKHNfZGVjb2RlX29wLnU0X3RzLCB3b3JrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICByZXR1cm4gZHJhaW5JbnRlcm5hbChkcmFpbk1vZGUsIHBvb2wsIG51bGxwdHIpOworfQorCitjbGFzcyBDMlNvZnRNcGVnMkRlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRNcGVnMkRlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRNcGVnMkRlYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0TXBlZzJEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0TXBlZzJEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRNcGVnMkRlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdE1wZWcyRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0TXBlZzJEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9DMlNvZnRNcGVnMkRlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5OTk4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9DMlNvZnRNcGVnMkRlYy5oCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfTVBFRzJfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9NUEVHMl9ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KKworI2luY2x1ZGUgIml2X2RhdGF0eXBlZGVmLmgiCisjaW5jbHVkZSAiaXYuaCIKKyNpbmNsdWRlICJpdmQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjZGVmaW5lIGl2ZGVjX2FwaV9mdW5jdGlvbiAgICAgICAgICAgICAgaW1wZWcyZF9hcGlfZnVuY3Rpb24KKyNkZWZpbmUgaXZkZXh0X2luaXRfaXBfdCAgICAgICAgICAgICAgICBpbXBlZzJkX2luaXRfaXBfdAorI2RlZmluZSBpdmRleHRfaW5pdF9vcF90ICAgICAgICAgICAgICAgIGltcGVnMmRfaW5pdF9vcF90CisjZGVmaW5lIGl2ZGV4dF9maWxsX21lbV9yZWNfaXBfdCAgICAgICAgaW1wZWcyZF9maWxsX21lbV9yZWNfaXBfdAorI2RlZmluZSBpdmRleHRfZmlsbF9tZW1fcmVjX29wX3QgICAgICAgIGltcGVnMmRfZmlsbF9tZW1fcmVjX29wX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QgICBpbXBlZzJkX2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3QgICBpbXBlZzJkX2N0bF9zZXRfbnVtX2NvcmVzX29wX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9nZXRfc2VxX2luZm9faXBfdCAgICBpbXBlZzJkX2N0bF9nZXRfc2VxX2luZm9faXBfdAorI2RlZmluZSBpdmRleHRfY3RsX2dldF9zZXFfaW5mb19vcF90ICAgIGltcGVnMmRfY3RsX2dldF9zZXFfaW5mb19vcF90CisjZGVmaW5lIEFMSUdONjQoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoKHgpICsgNjMpID4+IDYpIDw8IDYpCisjZGVmaW5lIE1BWF9OVU1fQ09SRVMgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBJVkRFWFRfQ01EX0NUTF9TRVRfTlVNX0NPUkVTICAgIFwKKyAgICAgICAgKElWRF9DT05UUk9MX0FQSV9DT01NQU5EX1RZUEVfVClJTVBFRzJEX0NNRF9DVExfU0VUX05VTV9DT1JFUworI2RlZmluZSBNSU4oYSwgYikgICAgICAgICAgICAgICAgICAgICAgICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKKyNkZWZpbmUgR0VUVElNRShhLCBiKSAgICAgICAgICAgICAgICAgICBnZXR0aW1lb2ZkYXkoYSwgYik7CisjZGVmaW5lIFRJTUVfRElGRihzdGFydCwgZW5kLCBkaWZmKSAgICAgXAorICAgIGRpZmYgPSAoKChlbmQpLnR2X3NlYyAtIChzdGFydCkudHZfc2VjKSAqIDEwMDAwMDApICsgXAorICAgICAgICAgICAgKChlbmQpLnR2X3VzZWMgLSAoc3RhcnQpLnR2X3VzZWMpOworCisjaWZkZWYgRklMRV9EVU1QX0VOQUJMRQorICAgICNkZWZpbmUgSU5QVVRfRFVNUF9QQVRIICAgICAiL3NkY2FyZC9jbGlwcy9tcGVnMmRfaW5wdXQiCisgICAgI2RlZmluZSBJTlBVVF9EVU1QX0VYVCAgICAgICJtMnYiCisgICAgI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0cmNweShtSW5GaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNwcmludGYobUluRmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBJTlBVVF9EVU1QX1BBVEgsICBcCisgICAgICAgICAgICAgICAgbVRpbWVTdGFydC50dl9zZWMsIG1UaW1lU3RhcnQudHZfdXNlYywgICAgICBcCisgICAgICAgICAgICAgICAgSU5QVVRfRFVNUF9FWFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorICAgICNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKSB7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBGSUxFICpmcCA9IGZvcGVuKG1fZmlsZW5hbWUsICJ3YiIpOyAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZnAgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCBvcGVuIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTsgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyAgICAjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplKSAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRklMRSAqZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAiYWIiKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGZwICE9IE5VTEwgJiYgbV9idWYgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHVpbnQzMl90IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGkgPSBmd3JpdGUobV9idWYsIDEsIG1fc2l6ZSwgZnApOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJmd3JpdGUgcmV0ICVkIHRvIHdyaXRlICVkIiwgaSwgbV9zaXplKTsgIFwKKyAgICAgICAgICAgIGlmIChpICE9ICh1aW50MzJfdCltX3NpemUpIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBBTE9HRCgiRXJyb3IgaW4gZndyaXRlLCByZXR1cm5lZCAlZCIsIGkpOyAgIFwKKyAgICAgICAgICAgICAgICBwZXJyb3IoIkVycm9yIGluIHdyaXRlIHRvIGZpbGUiKTsgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJDb3VsZCBub3Qgd3JpdGUgdG8gZmlsZSAlcyIsIG1fZmlsZW5hbWUpO1wKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZSAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisgICAgI2RlZmluZSBJTlBVVF9EVU1QX1BBVEgKKyAgICAjZGVmaW5lIElOUFVUX0RVTVBfRVhUCisgICAgI2RlZmluZSBPVVRQVVRfRFVNUF9QQVRICisgICAgI2RlZmluZSBPVVRQVVRfRFVNUF9FWFQKKyAgICAjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKQorICAgICNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKQorICAgICNkZWZpbmUgRFVNUF9UT19GSUxFKG1fZmlsZW5hbWUsIG1fYnVmLCBtX3NpemUpCisjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCitzdHJ1Y3QgQzJTb2Z0TXBlZzJEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0TXBlZzJEZWMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRNcGVnMkRlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyBwcml2YXRlOgorICAgIHN0YXR1c190IGdldE51bU1lbVJlY29yZHMoKTsKKyAgICBzdGF0dXNfdCBmaWxsTWVtUmVjb3JkcygpOworICAgIHN0YXR1c190IGNyZWF0ZURlY29kZXIoKTsKKyAgICBzdGF0dXNfdCBzZXROdW1Db3JlcygpOworICAgIHN0YXR1c190IHNldFBhcmFtcyhzaXplX3Qgc3RyaWRlKTsKKyAgICBzdGF0dXNfdCBnZXRWZXJzaW9uKCk7CisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBib29sIHNldERlY29kZUFyZ3MoaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNvZGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjb2RlX29wLAorICAgICAgICAgICAgICAgICAgICAgICBDMlJlYWRWaWV3ICppbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgQzJHcmFwaGljVmlldyAqb3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRzTWFya2VyKTsKKyAgICBib29sIGdldFNlcUluZm8oKTsKKyAgICBjMl9zdGF0dXNfdCBlbnN1cmVEZWNvZGVyU3RhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCk7CisgICAgdm9pZCBmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisgICAgc3RhdHVzX3Qgc2V0Rmx1c2hNb2RlKCk7CisgICAgYzJfc3RhdHVzX3QgZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisgICAgc3RhdHVzX3QgcmVzZXREZWNvZGVyKCk7CisgICAgdm9pZCByZXNldFBsdWdpbigpOworICAgIHN0YXR1c190IGRlbGV0ZURlY29kZXIoKTsKKyAgICBzdGF0dXNfdCByZUluaXREZWNvZGVyKCk7CisKKyAgICAvLyBUT0RPOlRoaXMgaXMgbm90IHRoZSByaWdodCBwbGFjZSBmb3IgdGhpcyBlbnVtLiBUaGVzZSBzaG91bGQKKyAgICAvLyBiZSBwYXJ0IG9mIGMyLXZuZGsgc28gdGhhdCB0aGV5IGNhbiBiZSBhY2Nlc3NlZCBieSBhbGwgdmlkZW8gcGx1Z2lucworICAgIC8vIHVudGlsIHRoZW4sIG1ha2UgdGhlbSBmZWVsIGF0IGhvbWUKKyAgICBlbnVtIHsKKyAgICAgICAga05vdFN1cHBvcnRlZCwKKyAgICAgICAga1ByZWZlckJpdHN0cmVhbSwKKyAgICAgICAga1ByZWZlckNvbnRhaW5lciwKKyAgICB9OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBpdl9vYmpfdCAqbURlY0hhbmRsZTsKKyAgICBpdl9tZW1fcmVjX3QgKm1NZW1SZWNvcmRzOworICAgIHNpemVfdCBtTnVtTWVtUmVjb3JkczsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IG1PdXRCbG9jazsKKyAgICB1aW50OF90ICptT3V0QnVmZmVyRHJhaW47CisKKyAgICBzaXplX3QgbU51bUNvcmVzOworICAgIElWX0NPTE9SX0ZPUk1BVF9UIG1JdkNvbG9yZm9ybWF0OworCisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7CisgICAgdWludDMyX3QgbVN0cmlkZTsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisKKyAgICAvLyBDb2xvciBhc3BlY3RzLiBUaGVzZSBhcmUgSVNPIHZhbHVlcyBhbmQgYXJlIG1lYW50IHRvIGRldGVjdCBjaGFuZ2VzIGluIGFzcGVjdHMgdG8gYXZvaWQKKyAgICAvLyBjb252ZXJ0aW5nIHRoZW0gdG8gQzIgdmFsdWVzIGZvciBlYWNoIGZyYW1lCisgICAgc3RydWN0IFZ1aUNvbG9yQXNwZWN0cyB7CisgICAgICAgIHVpbnQ4X3QgcHJpbWFyaWVzOworICAgICAgICB1aW50OF90IHRyYW5zZmVyOworICAgICAgICB1aW50OF90IGNvZWZmczsKKyAgICAgICAgdWludDhfdCBmdWxsUmFuZ2U7CisKKyAgICAgICAgLy8gZGVmYXVsdCBjb2xvciBhc3BlY3RzCisgICAgICAgIFZ1aUNvbG9yQXNwZWN0cygpCisgICAgICAgICAgICA6IHByaW1hcmllcygyKSwgdHJhbnNmZXIoMiksIGNvZWZmcygyKSwgZnVsbFJhbmdlKDApIHsgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBWdWlDb2xvckFzcGVjdHMgJm8pIHsKKyAgICAgICAgICAgIHJldHVybiBwcmltYXJpZXMgPT0gby5wcmltYXJpZXMgJiYgdHJhbnNmZXIgPT0gby50cmFuc2ZlciAmJiBjb2VmZnMgPT0gby5jb2VmZnMKKyAgICAgICAgICAgICAgICAgICAgJiYgZnVsbFJhbmdlID09IG8uZnVsbFJhbmdlOworICAgICAgICB9CisgICAgfSBtQml0c3RyZWFtQ29sb3JBc3BlY3RzOworCisgICAgLy8gcHJvZmlsZQorICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lU3RhcnQ7CisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7CisjaWZkZWYgRklMRV9EVU1QX0VOQUJMRQorICAgIGNoYXIgbUluRmlsZVsyMDBdOworI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdE1wZWcyRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX01QRUcyX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZTRmNDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2NiBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9tcGVnNGRlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0TXBlZzREZWMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZGVjIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1ET1NDTF9JTVBPUlRfUkVGPSIsCisgICAgICAgICItRE1QRUc0IiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2gyNjNkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9zaWduZWQtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdE1wZWc0RGVjLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2RlYyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE9TQ0xfSU1QT1JUX1JFRj0iLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfbXBlZzRlbmMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9zaWduZWQtZGVmYXVsdHMiLAorICAgIF0sCisKKworICAgIHNyY3M6IFsiQzJTb2Z0TXBlZzRFbmMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZW5jIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1ETVBFRzQiLAorICAgICAgICAiLURPU0NMX0lNUE9SVF9SRUY9IiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2gyNjNlbmMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9zaWduZWQtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdE1wZWc0RW5jLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsgImxpYnN0YWdlZnJpZ2h0X200dmgyNjNlbmMiIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1ET1NDTF9JTVBPUlRfUkVGPSIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNERlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAxZjVlZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuY3BwCkBAIC0wLDAgKzEsNzQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2lmZGVmIE1QRUc0CisgICNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0TXBlZzREZWMiCisjZWxzZQorICAjZGVmaW5lIExPR19UQUcgIkMyU29mdEgyNjNEZWMiCisjZW5kaWYKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0TXBlZzREZWMuaCIKKyNpbmNsdWRlICJtcDRkZWNfYXBpLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2lmZGVmIE1QRUc0Citjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQubXBlZzQuZGVjb2RlciI7CisjZWxzZQorY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmgyNjMuZGVjb2RlciI7CisjZW5kaWYKKworY2xhc3MgQzJTb2Z0TXBlZzREZWM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBoZWxwZXIsCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUiwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPLAorI2lmZGVmIE1QRUc0CisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQKKyNlbHNlCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MworI2VuZGlmCisgICAgICAgICAgICAgICAgKSB7CisgICAgICAgIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsgLy8gVE9ETzogYWNjb3VudCBmb3Igb3VyIGJ1ZmZlcnMgaGVyZQorICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworCisgICAgICAgIC8vIFRPRE86IG91dHB1dCBsYXRlbmN5IGFuZCByZW9yZGVyaW5nCisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BdHRyaWIsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZyhDMkNvbXBvbmVudDo6QVRUUklCX0lTX1RFTVBPUkFMKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TaXplLCBDMl9QQVJBTUtFWV9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0KDB1LCAxNzYsIDE0NCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworI2lmZGVmIE1QRUc0CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMTkyMCwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDEwODgsIDIpLAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAzNTIsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAyODgsIDIpLAorI2VuZGlmCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworI2lmZGVmIE1QRUc0CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfU0lNUExFLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8zKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5lcXVhbFRvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfU0lNUExFKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8wQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8zQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl80LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfNn0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyNlbHNlCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfQkFTRUxJTkUsIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzMwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfSDI2M19CQVNFTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0lTV1YyfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzQ1fSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworI2VuZGlmCisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhTaXplLCBDMl9QQVJBTUtFWV9NQVhfUElDVFVSRV9TSVpFKQorI2lmZGVmIE1QRUc0CisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQoMHUsIDE5MjAsIDEwODgpKQorI2Vsc2UKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dCgwdSwgMzUyLCAyODgpKQorI2VuZGlmCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworI2lmZGVmIE1QRUc0CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMTkyMCwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDEwODgsIDIpLAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAzNTIsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAyODgsIDIpLAorI2VuZGlmCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihNYXhQaWN0dXJlU2l6ZVNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4SW5wdXRTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisjaWZkZWYgTVBFRzQKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCAxOTIwICogMTA4OCAqIDMgLyAyKSkKKyNlbHNlCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMzUyICogMjg4ICogMyAvIDIpKQorI2VuZGlmCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobU1heElucHV0U2l6ZSwgdmFsdWUpLmFueSgpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLmNhbGN1bGF0ZWRBcyhNYXhJbnB1dFNpemVTZXR0ZXIsIG1NYXhTaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBDMkNocm9tYU9mZnNldFN0cnVjdCBsb2NhdGlvbnNbMV0gPSB7IEMyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCkgfTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IGRlZmF1bHRDb2xvckluZm8gPQorICAgICAgICAgICAgQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgIDF1LCAwdSwgOHUgLyogYml0RGVwdGggKi8sIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBtZW1jcHkoZGVmYXVsdENvbG9ySW5mby0+bS5sb2NhdGlvbnMsIGxvY2F0aW9ucywgc2l6ZW9mKGxvY2F0aW9ucykpOworCisgICAgICAgIGRlZmF1bHRDb2xvckluZm8gPQorICAgICAgICAgICAgQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgIHsgQzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKSB9LAorICAgICAgICAgICAgICAgICAgICAwdSwgOHUgLyogYml0RGVwdGggKi8sIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBoZWxwZXItPmFkZFN0cnVjdERlc2NyaXB0b3JzPEMyQ2hyb21hT2Zmc2V0U3RydWN0PigpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29sb3JJbmZvLCBDMl9QQVJBTUtFWV9DT0RFRF9DT0xPUl9JTkZPKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShkZWZhdWx0Q29sb3JJbmZvKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IG1vcmUgZm9ybWF0cz8KKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1QaXhlbEZvcm1hdCwgQzJfUEFSQU1LRVlfUElYRUxfRk9STUFUKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmb2xkTWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlZpZGVvU2l6ZVN0cmVhbUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAoIW1lLkYobWUudi53aWR0aCkuc3VwcG9ydHNBdEFsbChtZS52LndpZHRoKSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LndpZHRoKSkpOworICAgICAgICAgICAgbWUuc2V0KCkud2lkdGggPSBvbGRNZS52LndpZHRoOworICAgICAgICB9CisgICAgICAgIGlmICghbWUuRihtZS52LmhlaWdodCkuc3VwcG9ydHNBdEFsbChtZS52LmhlaWdodCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi5oZWlnaHQpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBvbGRNZS52LmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4UGljdHVyZVNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBUT0RPOiBnZXQgbWF4IHdpZHRoL2hlaWdodCBmcm9tIHRoZSBzaXplJ3MgZmllbGQgaGVscGVycyB2cy4gaGFyZGNvZGluZworI2lmZGVmIE1QRUc0CisgICAgICAgIG1lLnNldCgpLndpZHRoID0gYzJfbWluKGMyX21heChtZS52LndpZHRoLCBzaXplLnYud2lkdGgpLCAxOTIwdSk7CisgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IGMyX21pbihjMl9tYXgobWUudi5oZWlnaHQsIHNpemUudi5oZWlnaHQpLCAxMDg4dSk7CisjZWxzZQorICAgICAgICBtZS5zZXQoKS53aWR0aCA9IGMyX21pbihjMl9tYXgobWUudi53aWR0aCwgc2l6ZS52LndpZHRoKSwgMzUydSk7CisgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IGMyX21pbihjMl9tYXgobWUudi5oZWlnaHQsIHNpemUudi5oZWlnaHQpLCAyODh1KTsKKyNlbmRpZgorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4SW5wdXRTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtYXhTaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBhc3N1bWUgY29tcHJlc3Npb24gcmF0aW8gb2YgMQorICAgICAgICBtZS5zZXQoKS52YWx1ZSA9ICgoKG1heFNpemUudi53aWR0aCArIDE1KSAvIDE2KSAqICgobWF4U2l6ZS52LmhlaWdodCArIDE1KSAvIDE2KSAqIDM4NCk7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKXNpemU7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBnZXRNYXhXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1NYXhTaXplLT53aWR0aDsgfQorICAgIHVpbnQzMl90IGdldE1heEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1NYXhTaXplLT5oZWlnaHQ7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gbU1heFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtTWF4SW5wdXRTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBtQ29sb3JJbmZvOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0PiBtUGl4ZWxGb3JtYXQ7Cit9OworCitDMlNvZnRNcGVnNERlYzo6QzJTb2Z0TXBlZzREZWMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbURlY0hhbmRsZShudWxscHRyKSwKKyAgICAgIG1PdXRwdXRCdWZmZXJ7fSwKKyAgICAgIG1Jbml0aWFsaXplZChmYWxzZSkgeworfQorCitDMlNvZnRNcGVnNERlYzo6fkMyU29mdE1wZWc0RGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNERlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNERlYzo6b25TdG9wKCkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgaWYgKG1EZWNIYW5kbGUpIHsKKyAgICAgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICB9CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwga051bU91dHB1dEJ1ZmZlcnM7ICsraSkgeworICAgICAgICBpZiAobU91dHB1dEJ1ZmZlcltpXSkgeworICAgICAgICAgICAgZnJlZShtT3V0cHV0QnVmZmVyW2ldKTsKKyAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJbaV0gPSBudWxscHRyOworICAgICAgICB9CisgICAgfQorICAgIG1OdW1TYW1wbGVzT3V0cHV0ID0gMDsKKyAgICBtRnJhbWVzQ29uZmlndXJlZCA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRNcGVnNERlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKKyAgICAodm9pZClvbkluaXQoKTsKK30KKwordm9pZCBDMlNvZnRNcGVnNERlYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgaWYgKG1EZWNIYW5kbGUpIHsKKyAgICAgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKKyAgICAgICAgICAgIGRlbGV0ZSBtRGVjSGFuZGxlOworICAgICAgICAgICAgbURlY0hhbmRsZSA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgbUluaXRpYWxpemVkID0gZmFsc2U7CisgICAgfQorICAgIGlmIChtT3V0QmxvY2spIHsKKyAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CisgICAgfQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGtOdW1PdXRwdXRCdWZmZXJzOyArK2kpIHsKKyAgICAgICAgaWYgKG1PdXRwdXRCdWZmZXJbaV0pIHsKKyAgICAgICAgICAgIGZyZWUobU91dHB1dEJ1ZmZlcltpXSk7CisgICAgICAgICAgICBtT3V0cHV0QnVmZmVyW2ldID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzREZWM6Om9uRmx1c2hfc20oKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCkgeworICAgICAgICBpZiAoUFZfVFJVRSAhPSBQVlJlc2V0VmlkZW9EZWNvZGVyKG1EZWNIYW5kbGUpKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgfQorICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWc0RGVjOjppbml0RGVjb2RlcigpIHsKKyNpZmRlZiBNUEVHNAorICAgIG1Jc01wZWc0ID0gdHJ1ZTsKKyNlbHNlCisgICAgbUlzTXBlZzQgPSBmYWxzZTsKKyNlbmRpZgorICAgIGlmICghbURlY0hhbmRsZSkgeworICAgICAgICBtRGVjSGFuZGxlID0gbmV3IHRhZ3ZpZGVvRGVjQ29udHJvbHM7CisgICAgfQorICAgIGlmICghbURlY0hhbmRsZSkgeworICAgICAgICBBTE9HRSgibURlY0hhbmRsZSBpcyBudWxsIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorICAgIG1lbXNldChtRGVjSGFuZGxlLCAwLCBzaXplb2YodGFndmlkZW9EZWNDb250cm9scykpOworCisgICAgLyogVE9ETzogYnJpbmcgdGhlc2UgdmFsdWVzIHRvIDM1MiBhbmQgMjg4LiBJdCBjYW5ub3QgYmUgZG9uZSBhcyBvZiBub3cKKyAgICAgKiBiZWNhdXNlLCBoMjYzIGRvZXNuJ3Qgc2VlbSB0byBhbGxvdyBwb3J0IHJlY29uZmlndXJhdGlvbi4gSW4gT01YLCB0aGUKKyAgICAgKiBwcm9ibGVtIG9mIGxhcmdlciB3aWR0aCBhbmQgaGVpZ2h0IHRoYW4gZGVmYXVsdCB3aWR0aCBhbmQgaGVpZ2h0IGlzCisgICAgICogb3ZlcmNvbWUgYnkgYWRhcHRpdmVQbGF5QmFjaygpIGFwaSBjYWxsLiBUaGlzIGNhbGwgZ2V0cyB3aWR0aCBhbmQgaGVpZ2h0CisgICAgICogaW5mb3JtYXRpb24gZnJvbSBleHRyYWN0b3IuIFN1Y2ggYSB0aGluZyBpcyBub3QgcG9zc2libGUgaGVyZS4KKyAgICAgKiBTbyB3ZSBhcmUgY29uZmlndXJpbmcgdG8gbGFyZ2VyIHZhbHVlcy4qLworICAgIG1XaWR0aCA9IDE0MDg7CisgICAgbUhlaWdodCA9IDExNTI7CisgICAgbU51bVNhbXBsZXNPdXRwdXQgPSAwOworICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgIG1GcmFtZXNDb25maWd1cmVkID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzREZWM6OmZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBjcmVhdGVHcmFwaGljQnVmZmVyKHN0ZDo6bW92ZShtT3V0QmxvY2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlJlY3QobVdpZHRoLCBtSGVpZ2h0KSk7CisgICAgbU91dEJsb2NrID0gbnVsbHB0cjsKKyAgICBhdXRvIGZpbGxXb3JrID0gW2J1ZmZlciwgaW5kZXhdKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgaWYgKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICYmCisgICAgICAgICAgICAgICAgKGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpKSB7CisgICAgICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgICAgIH0KKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIH07CisgICAgaWYgKHdvcmsgJiYgYzJfY250cjY0X3QoaW5kZXgpID09IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCkgeworICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmaW5pc2goaW5kZXgsIGZpbGxXb3JrKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RGVjOjplbnN1cmVEZWNvZGVyU3RhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIGlmICghbURlY0hhbmRsZSkgeworICAgICAgICBBTE9HRSgibm90IHN1cHBvc2VkIHRvIGJlIGhlcmUsIGludmFsaWQgZGVjb2RlciBjb250ZXh0Iik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgbU91dHB1dEJ1ZmZlclNpemUgPSBhbGlnbihtSW50Zi0+Z2V0TWF4V2lkdGgoKSwgMTYpICogYWxpZ24obUludGYtPmdldE1heEhlaWdodCgpLCAxNikgKiAzIC8gMjsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBrTnVtT3V0cHV0QnVmZmVyczsgKytpKSB7CisgICAgICAgIGlmICghbU91dHB1dEJ1ZmZlcltpXSkgeworICAgICAgICAgICAgbU91dHB1dEJ1ZmZlcltpXSA9ICh1aW50OF90ICopbWFsbG9jKG1PdXRwdXRCdWZmZXJTaXplKTsKKyAgICAgICAgICAgIGlmICghbU91dHB1dEJ1ZmZlcltpXSkgeworICAgICAgICAgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1PdXRCbG9jayAmJgorICAgICAgICAgICAgKG1PdXRCbG9jay0+d2lkdGgoKSAhPSBhbGlnbihtV2lkdGgsIDE2KSB8fCBtT3V0QmxvY2stPmhlaWdodCgpICE9IG1IZWlnaHQpKSB7CisgICAgICAgIG1PdXRCbG9jay5yZXNldCgpOworICAgIH0KKyAgICBpZiAoIW1PdXRCbG9jaykgeworICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soYWxpZ24obVdpZHRoLCAxNiksIG1IZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZtT3V0QmxvY2spOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiZmV0Y2hHcmFwaGljQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigicHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJWR4JWQpIiwKKyAgICAgICAgICAgICAgbU91dEJsb2NrLT53aWR0aCgpLCBtT3V0QmxvY2stPmhlaWdodCgpLCBtV2lkdGgsIG1IZWlnaHQpOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2Jvb2wgQzJTb2Z0TXBlZzREZWM6OmhhbmRsZVJlc0NoYW5nZShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHVpbnQzMl90IGRpc3Bfd2lkdGgsIGRpc3BfaGVpZ2h0OworICAgIFBWR2V0VmlkZW9EaW1lbnNpb25zKG1EZWNIYW5kbGUsIChpbnQzMiAqKSZkaXNwX3dpZHRoLCAoaW50MzIgKikmZGlzcF9oZWlnaHQpOworCisgICAgdWludDMyX3QgYnVmX3dpZHRoLCBidWZfaGVpZ2h0OworICAgIFBWR2V0QnVmZmVyRGltZW5zaW9ucyhtRGVjSGFuZGxlLCAoaW50MzIgKikmYnVmX3dpZHRoLCAoaW50MzIgKikmYnVmX2hlaWdodCk7CisKKyAgICBDSEVDS19MRShkaXNwX3dpZHRoLCBidWZfd2lkdGgpOworICAgIENIRUNLX0xFKGRpc3BfaGVpZ2h0LCBidWZfaGVpZ2h0KTsKKworICAgIEFMT0dWKCJkaXNwbGF5IHNpemUgKCVkeCVkKSwgYnVmZmVyIHNpemUgKCVkeCVkKSIsCisgICAgICAgICAgIGRpc3Bfd2lkdGgsIGRpc3BfaGVpZ2h0LCBidWZfd2lkdGgsIGJ1Zl9oZWlnaHQpOworCisgICAgYm9vbCByZXNDaGFuZ2VkID0gZmFsc2U7CisgICAgaWYgKGRpc3Bfd2lkdGggIT0gbVdpZHRoIHx8IGRpc3BfaGVpZ2h0ICE9IG1IZWlnaHQpIHsKKyAgICAgICAgbVdpZHRoID0gZGlzcF93aWR0aDsKKyAgICAgICAgbUhlaWdodCA9IGRpc3BfaGVpZ2h0OworICAgICAgICByZXNDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwga051bU91dHB1dEJ1ZmZlcnM7ICsraSkgeworICAgICAgICAgICAgaWYgKG1PdXRwdXRCdWZmZXJbaV0pIHsKKyAgICAgICAgICAgICAgICBmcmVlKG1PdXRwdXRCdWZmZXJbaV0pOworICAgICAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJbaV0gPSBudWxscHRyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtSXNNcGVnNCkgeworICAgICAgICAgICAgUFZDbGVhblVwVmlkZW9EZWNvZGVyKG1EZWNIYW5kbGUpOworCisgICAgICAgICAgICB1aW50OF90ICp2b2xfZGF0YVsxXXt9OworICAgICAgICAgICAgaW50MzJfdCB2b2xfc2l6ZSA9IDA7CisKKyAgICAgICAgICAgIGlmICghUFZJbml0VmlkZW9EZWNvZGVyKAorICAgICAgICAgICAgICAgICAgICBtRGVjSGFuZGxlLCB2b2xfZGF0YSwgJnZvbF9zaXplLCAxLCBtSW50Zi0+Z2V0TWF4V2lkdGgoKSwgbUludGYtPmdldE1heEhlaWdodCgpLCBIMjYzX01PREUpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkVycm9yIGluIFBWSW5pdFZpZGVvRGVjb2RlciBIMjYzX01PREUgd2hpbGUgcmVzQ2hhbmdlZCB3YXMgc2V0IHRvIHRydWUiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtRnJhbWVzQ29uZmlndXJlZCA9IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gcmVzQ2hhbmdlZDsKK30KKworLyogVE9ETzogY2FuIHJlbW92ZSB0ZW1wb3JhcnkgY29weSBhZnRlciBsaWJyYXJ5IHN1cHBvcnRzIHdyaXRpbmcgdG8gZGlzcGxheQorICogYnVmZmVyIFksIFUgYW5kIFYgcGxhbmUgcG9pbnRlcnMgdXNpbmcgc3RyaWRlIGluZm8uICovCitzdGF0aWMgdm9pZCBjb3B5T3V0cHV0QnVmZmVyVG9ZVjEyRnJhbWUodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIHNpemVfdCBkc3RZU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7CisgICAgc2l6ZV90IGRzdFVWU3RyaWRlID0gYWxpZ24oZHN0WVN0cmlkZSAvIDIsIDE2KTsKKyAgICBzaXplX3Qgc3JjVVZTdHJpZGUgPSBzcmNZU3RyaWRlIC8gMjsKKyAgICB1aW50OF90ICpzcmNTdGFydCA9IHNyYzsKKyAgICB1aW50OF90ICpkc3RTdGFydCA9IGRzdDsKKyAgICBzaXplX3QgdlN0cmlkZSA9IGFsaWduKGhlaWdodCwgMTYpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0OyArK2kpIHsKKyAgICAgICAgIG1lbWNweShkc3QsIHNyYywgd2lkdGgpOworICAgICAgICAgc3JjICs9IHNyY1lTdHJpZGU7CisgICAgICAgICBkc3QgKz0gZHN0WVN0cmlkZTsKKyAgICB9CisgICAgLyogVSBidWZmZXIgKi8KKyAgICBzcmMgPSBzcmNTdGFydCArIHZTdHJpZGUgKiBzcmNZU3RyaWRlOworICAgIGRzdCA9IGRzdFN0YXJ0ICsgKGRzdFlTdHJpZGUgKiBoZWlnaHQpICsgKGRzdFVWU3RyaWRlICogaGVpZ2h0IC8gMik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKKyAgICAgICAgIG1lbWNweShkc3QsIHNyYywgd2lkdGggLyAyKTsKKyAgICAgICAgIHNyYyArPSBzcmNVVlN0cmlkZTsKKyAgICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICB9CisgICAgLyogViBidWZmZXIgKi8KKyAgICBzcmMgPSBzcmNTdGFydCArIHZTdHJpZGUgKiBzcmNZU3RyaWRlICogNSAvIDQ7CisgICAgZHN0ID0gZHN0U3RhcnQgKyAoZHN0WVN0cmlkZSAqIGhlaWdodCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKKyAgICAgICAgIG1lbWNweShkc3QsIHNyYywgd2lkdGggLyAyKTsKKyAgICAgICAgIHNyYyArPSBzcmNVVlN0cmlkZTsKKyAgICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICB9Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzREZWM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICB1aW50MzJfdCB3b3JrSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSAmIDB4RkZGRkZGRkY7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCwgZmxhZ3MgJXgiLAorICAgICAgICAgIGluU2l6ZSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCksIHdvcmstPmlucHV0LmZsYWdzKTsKKworICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIGlmIChpblNpemUgPT0gMCkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdWludDhfdCAqYml0c3RyZWFtID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0KTsKKyAgICB1aW50MzJfdCAqc3RhcnRfY29kZSA9ICh1aW50MzJfdCAqKWJpdHN0cmVhbTsKKyAgICBib29sIHZvbEhlYWRlciA9ICpzdGFydF9jb2RlID09IDB4QjAwMTAwMDA7CisgICAgaWYgKHZvbEhlYWRlcikgeworICAgICAgICBQVkNsZWFuVXBWaWRlb0RlY29kZXIobURlY0hhbmRsZSk7CisgICAgICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgIH0KKworICAgIGlmICghbUluaXRpYWxpemVkKSB7CisgICAgICAgIHVpbnQ4X3QgKnZvbF9kYXRhWzFde307CisgICAgICAgIGludDMyX3Qgdm9sX3NpemUgPSAwOworCisgICAgICAgIGJvb2wgY29kZWNDb25maWcgPSAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9IDA7CisgICAgICAgIGlmIChjb2RlY0NvbmZpZyB8fCB2b2xIZWFkZXIpIHsKKyAgICAgICAgICAgIHZvbF9kYXRhWzBdID0gYml0c3RyZWFtOworICAgICAgICAgICAgdm9sX3NpemUgPSBpblNpemU7CisgICAgICAgIH0KKyAgICAgICAgTVA0RGVjb2RpbmdNb2RlIG1vZGUgPSAobUlzTXBlZzQpID8gTVBFRzRfTU9ERSA6IEgyNjNfTU9ERTsKKyAgICAgICAgaWYgKCFQVkluaXRWaWRlb0RlY29kZXIoCisgICAgICAgICAgICAgICAgbURlY0hhbmRsZSwgdm9sX2RhdGEsICZ2b2xfc2l6ZSwgMSwKKyAgICAgICAgICAgICAgICBtSW50Zi0+Z2V0TWF4V2lkdGgoKSwgbUludGYtPmdldE1heEhlaWdodCgpLCBtb2RlKSkgeworICAgICAgICAgICAgQUxPR0UoIlBWSW5pdFZpZGVvRGVjb2RlciBmYWlsZWQuIFVuc3VwcG9ydGVkIGNvbnRlbnQ/Iik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgIE1QNERlY29kaW5nTW9kZSBhY3R1YWxNb2RlID0gUFZHZXREZWNCaXRzdHJlYW1Nb2RlKG1EZWNIYW5kbGUpOworICAgICAgICBpZiAobW9kZSAhPSBhY3R1YWxNb2RlKSB7CisgICAgICAgICAgICBBTE9HRSgiRGVjb2RlZCBtb2RlIG5vdCBzYW1lIGFzIGFjdHVhbCBtb2RlIG9mIHRoZSBkZWNvZGVyIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgUFZTZXRQb3N0UHJvY1R5cGUobURlY0hhbmRsZSwgMCk7CisgICAgICAgIGlmIChoYW5kbGVSZXNDaGFuZ2Uod29yaykpIHsKKyAgICAgICAgICAgIEFMT0dJKCJTZXR0aW5nIHdpZHRoIGFuZCBoZWlnaHQiKTsKKyAgICAgICAgICAgIEMyVmlkZW9TaXplU3RyZWFtSW5mbzo6b3V0cHV0IHNpemUoMHUsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+Y29uZmlnKHsmc2l6ZX0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShzaXplKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDb25maWcgdXBkYXRlIHNpemUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjb2RlY0NvbmZpZykgeworICAgICAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNpemVfdCBpblBvcyA9IDA7CisgICAgd2hpbGUgKGluUG9zIDwgaW5TaXplKSB7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IGVuc3VyZURlY29kZXJTdGF0ZShwb29sKTsKKyAgICAgICAgaWYgKEMyX09LICE9IGVycikgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IGVycjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDMkdyYXBoaWNWaWV3IHdWaWV3ID0gbU91dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdWludDMyX3QgeUZyYW1lU2l6ZSA9IHNpemVvZih1aW50OCkgKiBtRGVjSGFuZGxlLT5zaXplOworICAgICAgICBpZiAobU91dHB1dEJ1ZmZlclNpemUgPCB5RnJhbWVTaXplICogMyAvIDIpeworICAgICAgICAgICAgQUxPR0UoIlRvbyBzbWFsbCBvdXRwdXQgYnVmZmVyOiAlenUgYnl0ZXMiLCBtT3V0cHV0QnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtRnJhbWVzQ29uZmlndXJlZCkgeworICAgICAgICAgICAgUFZTZXRSZWZlcmVuY2VZVVYobURlY0hhbmRsZSxtT3V0cHV0QnVmZmVyWzFdKTsKKyAgICAgICAgICAgIG1GcmFtZXNDb25maWd1cmVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5lZWQgdG8gY2hlY2sgaWYgaGVhZGVyIGNvbnRhaW5zIG5ldyBpbmZvLCBlLmcuLCB3aWR0aC9oZWlnaHQsIGV0Yy4KKyAgICAgICAgVm9wSGVhZGVySW5mbyBoZWFkZXJfaW5mbzsKKyAgICAgICAgdWludDMyX3QgdXNlRXh0VGltZXN0YW1wID0gKGluUG9zID09IDApOworICAgICAgICBpbnQzMl90IHRtcEluU2l6ZSA9IChpbnQzMl90KWluU2l6ZTsKKyAgICAgICAgdWludDhfdCAqYml0c3RyZWFtVG1wID0gYml0c3RyZWFtOworICAgICAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSB3b3JrSW5kZXg7CisgICAgICAgIGlmIChQVkRlY29kZVZvcEhlYWRlcigKKyAgICAgICAgICAgICAgICAgICAgbURlY0hhbmRsZSwgJmJpdHN0cmVhbVRtcCwgJnRpbWVzdGFtcCwgJnRtcEluU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgJmhlYWRlcl9pbmZvLCAmdXNlRXh0VGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICBtT3V0cHV0QnVmZmVyW21OdW1TYW1wbGVzT3V0cHV0ICYgMV0pICE9IFBWX1RSVUUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZGVjb2RlIHZvcCBoZWFkZXIuIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gSDI2MyBkb2Vzbid0IGhhdmUgVk9MIGhlYWRlciwgdGhlIGZyYW1lIHNpemUgaW5mb3JtYXRpb24gaXMgaW4gc2hvcnQgaGVhZGVyLCBpLmUuIHRoZQorICAgICAgICAvLyBkZWNvZGVyIG1heSBkZXRlY3Qgc2l6ZSBjaGFuZ2UgYWZ0ZXIgUFZEZWNvZGVWb3BIZWFkZXIuCisgICAgICAgIGJvb2wgcmVzQ2hhbmdlID0gaGFuZGxlUmVzQ2hhbmdlKHdvcmspOworICAgICAgICBpZiAobUlzTXBlZzQgJiYgcmVzQ2hhbmdlKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKHJlc0NoYW5nZSkgeworICAgICAgICAgICAgQUxPR0koIlNldHRpbmcgd2lkdGggYW5kIGhlaWdodCIpOworICAgICAgICAgICAgQzJWaWRlb1NpemVTdHJlYW1JbmZvOjpvdXRwdXQgc2l6ZSgwdSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbnRmLT5jb25maWcoeyZzaXplfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKEMyUGFyYW06OkNvcHkoc2l6ZSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ29uZmlnIHVwZGF0ZSBzaXplIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKFBWRGVjb2RlVm9wQm9keShtRGVjSGFuZGxlLCAmdG1wSW5TaXplKSAhPSBQVl9UUlVFKSB7CisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGRlY29kZSB2aWRlbyBmcmFtZS4iKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhhbmRsZVJlc0NoYW5nZSh3b3JrKSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQ4X3QgKm91dHB1dEJ1ZmZlclkgPSB3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgICAgICAodm9pZCljb3B5T3V0cHV0QnVmZmVyVG9ZVjEyRnJhbWUob3V0cHV0QnVmZmVyWSwgbU91dHB1dEJ1ZmZlclttTnVtU2FtcGxlc091dHB1dCAmIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1ZpZXcud2lkdGgoKSwgYWxpZ24obVdpZHRoLCAxNiksIG1XaWR0aCwgbUhlaWdodCk7CisKKyAgICAgICAgaW5Qb3MgKz0gaW5TaXplIC0gKHNpemVfdCl0bXBJblNpemU7CisgICAgICAgIGZpbmlzaFdvcmsod29ya0luZGV4LCB3b3JrKTsKKyAgICAgICAgKyttTnVtU2FtcGxlc091dHB1dDsKKyAgICAgICAgaWYgKGluU2l6ZSAtIGluUG9zICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dEKCJkZWNvZGVkIGZyYW1lLCBpZ25vcmluZyBmdXJ0aGVyIHRyYWlsaW5nIGJ5dGVzICVkIiwKKyAgICAgICAgICAgICAgICAgIChpbnQpaW5TaXplIC0gKGludClpblBvcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzREZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZClwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjbGFzcyBDMlNvZnRNcGVnNERlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRNcGVnNERlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdE1wZWc0RGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRNcGVnNERlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRNcGVnNERlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE1wZWc0RGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0TXBlZzREZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRNcGVnNERlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNERlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNERlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNmEwOTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJfU09GVF9NUEVHNF9ERUNfSF8KKyNkZWZpbmUgQzJfU09GVF9NUEVHNF9ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKworc3RydWN0IHRhZ3ZpZGVvRGVjQ29udHJvbHM7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdE1wZWc0RGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdE1wZWc0RGVjKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0TXBlZzREZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga051bU91dHB1dEJ1ZmZlcnMgPSAyLAorICAgIH07CisKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworICAgIGMyX3N0YXR1c190IGVuc3VyZURlY29kZXJTdGF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKTsKKyAgICB2b2lkIGZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKyAgICBib29sIGhhbmRsZVJlc0NoYW5nZShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIHRhZ3ZpZGVvRGVjQ29udHJvbHMgKm1EZWNIYW5kbGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBtT3V0QmxvY2s7CisgICAgdWludDhfdCAqbU91dHB1dEJ1ZmZlcltrTnVtT3V0cHV0QnVmZmVyc107CisgICAgc2l6ZV90ICBtT3V0cHV0QnVmZmVyU2l6ZTsKKworICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIHVpbnQzMl90IG1OdW1TYW1wbGVzT3V0cHV0OworCisgICAgYm9vbCBtSXNNcGVnNDsKKyAgICBib29sIG1Jbml0aWFsaXplZDsKKyAgICBib29sIG1GcmFtZXNDb25maWd1cmVkOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdE1wZWc0RGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQzJfU09GVF9NUEVHNF9ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzRFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNEVuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg3OTZmMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzRFbmMuY3BwCkBAIC0wLDAgKzEsNjcxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaWZkZWYgTVBFRzQKKyAgI2RlZmluZSBMT0dfVEFHICJDMlNvZnRNcGVnNEVuYyIKKyNlbHNlCisgICNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0SDI2M0VuYyIKKyNlbmRpZgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisKKyNpbmNsdWRlICJDMlNvZnRNcGVnNEVuYy5oIgorI2luY2x1ZGUgIm1wNGVuY19hcGkuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjaWZkZWYgTVBFRzQKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5tcGVnNC5lbmNvZGVyIjsKKyNlbHNlCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuaDI2My5lbmNvZGVyIjsKKyNlbmRpZgorCitjbGFzcyBDMlNvZnRNcGVnNEVuYzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4mIGhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfTkFNRV9JTlBVVF9TVFJFQU1fRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKAorICAgICAgICAgICAgICAgICAgICBuZXcgQzJTdHJlYW1Gb3JtYXRDb25maWc6OmlucHV0KDB1LCBDMkZvcm1hdFZpZGVvKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfTkFNRV9PVVRQVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEMyU3RyZWFtRm9ybWF0Q29uZmlnOjpvdXRwdXQoMHUsIEMyRm9ybWF0Q29tcHJlc3NlZCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfTkFNRV9JTlBVVF9QT1JUX01JTUVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9OQU1FX09VVFBVVF9QT1JUX01JTUVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWltZUNvbmZpZzo6b3V0cHV0PigKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcihEZWZpbmVQYXJhbShtVXNhZ2UsIEMyX05BTUVfSU5QVVRfU1RSRUFNX1VTQUdFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbVVzYWdlVHVuaW5nOjppbnB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsICh1aW50NjRfdClDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1TaXplLCBDMl9OQU1FX1NUUkVBTV9WSURFT19TSVpFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlZpZGVvU2l6ZVN0cmVhbVR1bmluZzo6aW5wdXQoMHUsIDE3NiwgMTQ0KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisjaWZkZWYgTVBFRzQKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgxNiwgMTc2LCAxNiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDE2LCAxNDQsIDE2KSwKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLm9uZU9mKHsxNzYsIDM1Mn0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkub25lT2YoezE0NCwgMjg4fSksCisjZW5kaWYKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNpemVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1GcmFtZVJhdGUsIEMyX05BTUVfU1RSRUFNX0ZSQU1FX1JBVEVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0KDB1LCAxNy4pKQorICAgICAgICAgICAgICAgIC8vIFRPRE86IE1vcmUgcmVzdHJpY3Rpb24/CisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRnJhbWVSYXRlLCB2YWx1ZSkuZ3JlYXRlclRoYW4oMC4pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICAgICAgU2V0dGVyPGRlY2x0eXBlKCptRnJhbWVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX05BTUVfU1RSRUFNX0JJVFJBVEVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyQml0cmF0ZVR1bmluZzo6b3V0cHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoNDA5NiwgMTIwMDAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihCaXRyYXRlU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVN5bmNGcmFtZVBlcmlvZCwgQzJfUEFSQU1LRVlfU1lOQ19GUkFNRV9JTlRFUlZBTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU3luY0ZyYW1lSW50ZXJ2YWxUdW5pbmc6Om91dHB1dCgwdSwgMTAwMDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU3luY0ZyYW1lUGVyaW9kLCB2YWx1ZSkuYW55KCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbVN5bmNGcmFtZVBlcmlvZCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisjaWZkZWYgTVBFRzQKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBQUk9GSUxFX01QNFZfU0lNUExFLCBMRVZFTF9NUDRWXzIpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLmVxdWFsVG8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPRklMRV9NUDRWX1NJTVBMRSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfMEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8yfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisjZWxzZQorICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIFBST0ZJTEVfSDI2M19CQVNFTElORSwgTEVWRUxfSDI2M180NSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkuZXF1YWxUbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9GSUxFX0gyNjNfQkFTRUxJTkUpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M18xMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M18yMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M18zMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M180MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M180NX0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworI2VuZGlmCisgICAgfQorCisgICAgc3RhdGljIEMyUiBCaXRyYXRlU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKG1lLnYudmFsdWUgPD0gNDA5NikgeworICAgICAgICAgICAgbWUuc2V0KCkudmFsdWUgPSA0MDk2OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+ICZvbGRNZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAoIW1lLkYobWUudi53aWR0aCkuc3VwcG9ydHNBdEFsbChtZS52LndpZHRoKSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LndpZHRoKSkpOworICAgICAgICAgICAgbWUuc2V0KCkud2lkdGggPSBvbGRNZS52LndpZHRoOworICAgICAgICB9CisgICAgICAgIGlmICghbWUuRihtZS52LmhlaWdodCkuc3VwcG9ydHNBdEFsbChtZS52LmhlaWdodCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi5oZWlnaHQpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBvbGRNZS52LmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKAorICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBpZiAoIW1lLkYobWUudi5wcm9maWxlKS5zdXBwb3J0c0F0QWxsKG1lLnYucHJvZmlsZSkpIHsKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgbWUuc2V0KCkucHJvZmlsZSA9IFBST0ZJTEVfTVA0Vl9TSU1QTEU7CisjZWxzZQorICAgICAgICAgICAgbWUuc2V0KCkucHJvZmlsZSA9IFBST0ZJTEVfSDI2M19CQVNFTElORTsKKyNlbmRpZgorICAgICAgICB9CisgICAgICAgIGlmICghbWUuRihtZS52LmxldmVsKS5zdXBwb3J0c0F0QWxsKG1lLnYubGV2ZWwpKSB7CisjaWZkZWYgTVBFRzQKKyAgICAgICAgICAgIG1lLnNldCgpLmxldmVsID0gTEVWRUxfTVA0Vl8yOworI2Vsc2UKKyAgICAgICAgICAgIG1lLnNldCgpLmxldmVsID0gTEVWRUxfSDI2M180NTsKKyNlbmRpZgorICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgLy8gdW5zYWZlIGdldHRlcnMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiBnZXRTaXplX2woKSBjb25zdCB7IHJldHVybiBtU2l6ZTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gZ2V0RnJhbWVSYXRlX2woKSBjb25zdCB7IHJldHVybiBtRnJhbWVSYXRlOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gZ2V0Qml0cmF0ZV9sKCkgY29uc3QgeyByZXR1cm4gbUJpdHJhdGU7IH0KKyAgICB1aW50MzJfdCBnZXRTeW5jRnJhbWVQZXJpb2QoKSBjb25zdCB7CisgICAgICAgIGlmIChtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSA8IDAgfHwgbVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgPT0gSU5UNjRfTUFYKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBkb3VibGUgcGVyaW9kID0gbVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgLyAxZTYgKiBtRnJhbWVSYXRlLT52YWx1ZTsKKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCljMl9tYXgoYzJfbWluKHBlcmlvZCArIDAuNSwgZG91YmxlKFVJTlQzMl9NQVgpKSwgMS4pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Gb3JtYXRDb25maWc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRm9ybWF0Q29uZmlnOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1pbWVDb25maWc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1pbWVDb25maWc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Vc2FnZVR1bmluZzo6aW5wdXQ+IG1Vc2FnZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJWaWRlb1NpemVTdHJlYW1UdW5pbmc6OmlucHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IG1GcmFtZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQml0cmF0ZVR1bmluZzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU3luY0ZyYW1lSW50ZXJ2YWxUdW5pbmc6Om91dHB1dD4gbVN5bmNGcmFtZVBlcmlvZDsKK307CisKK0MyU29mdE1wZWc0RW5jOjpDMlNvZnRNcGVnNEVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudCgKKyAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUhhbmRsZShudWxscHRyKSwKKyAgICAgIG1FbmNQYXJhbXMobnVsbHB0ciksCisgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtT3V0QnVmZmVyU2l6ZSg1MjQyODgpIHsKK30KKworQzJTb2Z0TXBlZzRFbmM6On5DMlNvZnRNcGVnNEVuYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzRFbmM6Om9uSW5pdCgpIHsKKyNpZmRlZiBNUEVHNAorICAgIG1FbmNvZGVNb2RlID0gQ09NQklORV9NT0RFX1dJVEhfRVJSX1JFUzsKKyNlbHNlCisgICAgbUVuY29kZU1vZGUgPSBIMjYzX01PREU7CisjZW5kaWYKKyAgICBpZiAoIW1IYW5kbGUpIHsKKyAgICAgICAgbUhhbmRsZSA9IG5ldyB0YWd2aWRlb0VuY0NvbnRyb2xzOworICAgIH0KKworICAgIGlmICghbUVuY1BhcmFtcykgeworICAgICAgICBtRW5jUGFyYW1zID0gbmV3IHRhZ3ZpZGVvRW5jT3B0aW9uczsKKyAgICB9CisKKyAgICBpZiAoIShtRW5jUGFyYW1zICYmIG1IYW5kbGUpKSByZXR1cm4gQzJfTk9fTUVNT1JZOworCisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworCisgICAgcmV0dXJuIGluaXRFbmNvZGVyKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RW5jOjpvblN0b3AoKSB7CisgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChtSGFuZGxlKSB7CisgICAgICAgICh2b2lkKVBWQ2xlYW5VcFZpZGVvRW5jb2RlcihtSGFuZGxlKTsKKyAgICB9CisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdE1wZWc0RW5jOjpvblJlc2V0KCkgeworICAgIG9uU3RvcCgpOworICAgIGluaXRFbmNvZGVyKCk7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzRFbmM6Om9uUmVsZWFzZSgpIHsKKyAgICBvblN0b3AoKTsKKyAgICBpZiAobUVuY1BhcmFtcykgeworICAgICAgICBkZWxldGUgbUVuY1BhcmFtczsKKyAgICAgICAgbUVuY1BhcmFtcyA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtSGFuZGxlKSB7CisgICAgICAgIGRlbGV0ZSBtSGFuZGxlOworICAgICAgICBtSGFuZGxlID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RW5jOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RhdGljIHZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzRFbmM6OmluaXRFbmNQYXJhbXMoKSB7CisgICAgaWYgKG1IYW5kbGUpIHsKKyAgICAgICAgbWVtc2V0KG1IYW5kbGUsIDAsIHNpemVvZih0YWd2aWRlb0VuY0NvbnRyb2xzKSk7CisgICAgfSBlbHNlIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgaWYgKG1FbmNQYXJhbXMpIHsKKyAgICAgICAgbWVtc2V0KG1FbmNQYXJhbXMsIDAsIHNpemVvZih0YWd2aWRlb0VuY09wdGlvbnMpKTsKKyAgICB9IGVsc2UgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKworICAgIGlmICghUFZHZXREZWZhdWx0RW5jT3B0aW9uKG1FbmNQYXJhbXMsIDApKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IGRlZmF1bHQgZW5jb2RpbmcgcGFyYW1ldGVycyIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIGlmIChtRnJhbWVSYXRlLT52YWx1ZSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJGcmFtZXJhdGUgc2hvdWxkIG5vdCBiZSAwIik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgbUVuY1BhcmFtcy0+ZW5jTW9kZSA9IG1FbmNvZGVNb2RlOworICAgIG1FbmNQYXJhbXMtPmVuY1dpZHRoWzBdID0gbVNpemUtPndpZHRoOworICAgIG1FbmNQYXJhbXMtPmVuY0hlaWdodFswXSA9IG1TaXplLT5oZWlnaHQ7CisgICAgbUVuY1BhcmFtcy0+ZW5jRnJhbWVSYXRlWzBdID0gbUZyYW1lUmF0ZS0+dmFsdWUgKyAwLjU7CisgICAgbUVuY1BhcmFtcy0+cmNUeXBlID0gVkJSXzE7CisgICAgbUVuY1BhcmFtcy0+dmJ2RGVsYXkgPSA1LjBmOworICAgIG1FbmNQYXJhbXMtPnByb2ZpbGVfbGV2ZWwgPSBDT1JFX1BST0ZJTEVfTEVWRUwyOworICAgIG1FbmNQYXJhbXMtPnBhY2tldFNpemUgPSAzMjsKKyAgICBtRW5jUGFyYW1zLT5ydmxjRW5hYmxlID0gUFZfT0ZGOworICAgIG1FbmNQYXJhbXMtPm51bUxheWVycyA9IDE7CisgICAgbUVuY1BhcmFtcy0+dGltZUluY1JlcyA9IDEwMDA7CisgICAgbUVuY1BhcmFtcy0+dGlja1BlclNyYyA9IG1FbmNQYXJhbXMtPnRpbWVJbmNSZXMgLyAobUZyYW1lUmF0ZS0+dmFsdWUgKyAwLjUpOworICAgIG1FbmNQYXJhbXMtPmJpdFJhdGVbMF0gPSBtQml0cmF0ZS0+dmFsdWU7CisgICAgbUVuY1BhcmFtcy0+aVF1YW50WzBdID0gMTU7CisgICAgbUVuY1BhcmFtcy0+cFF1YW50WzBdID0gMTI7CisgICAgbUVuY1BhcmFtcy0+cXVhbnRUeXBlWzBdID0gMDsKKyAgICBtRW5jUGFyYW1zLT5ub0ZyYW1lU2tpcHBlZCA9IFBWX09GRjsKKworICAgIC8vIFBWJ3MgTVBFRzQgZW5jb2RlciByZXF1aXJlcyB0aGUgdmlkZW8gZGltZW5zaW9uIG9mIG11bHRpcGxlCisgICAgaWYgKG1TaXplLT53aWR0aCAlIDE2ICE9IDAgfHwgbVNpemUtPmhlaWdodCAlIDE2ICE9IDApIHsKKyAgICAgICAgQUxPR0UoIlZpZGVvIGZyYW1lIHNpemUgJWR4JWQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IiwKKyAgICAgICAgICAgICAgbVNpemUtPndpZHRoLCBtU2l6ZS0+aGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBTZXQgSURSIGZyYW1lIHJlZnJlc2ggaW50ZXJ2YWwKKyAgICBtRW5jUGFyYW1zLT5pbnRyYVBlcmlvZCA9IG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2QoKTsKKyAgICBtRW5jUGFyYW1zLT5udW1JbnRyYU1CID0gMDsKKyAgICBtRW5jUGFyYW1zLT5zY2VuZURldGVjdCA9IFBWX09OOworICAgIG1FbmNQYXJhbXMtPnNlYXJjaFJhbmdlID0gMTY7CisgICAgbUVuY1BhcmFtcy0+bXY4eDhFbmFibGUgPSBQVl9PRkY7CisgICAgbUVuY1BhcmFtcy0+Z29iSGVhZGVySW50ZXJ2YWwgPSAwOworICAgIG1FbmNQYXJhbXMtPnVzZUFDUHJlZCA9IFBWX09OOworICAgIG1FbmNQYXJhbXMtPmludHJhRENWbGNUaCA9IDA7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RW5jOjppbml0RW5jb2RlcigpIHsKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBtU2l6ZSA9IG1JbnRmLT5nZXRTaXplX2woKTsKKyAgICAgICAgbUJpdHJhdGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZV9sKCk7CisgICAgICAgIG1GcmFtZVJhdGUgPSBtSW50Zi0+Z2V0RnJhbWVSYXRlX2woKTsKKyAgICB9CisgICAgYzJfc3RhdHVzX3QgZXJyID0gaW5pdEVuY1BhcmFtcygpOworICAgIGlmIChDMl9PSyAhPSBlcnIpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplZCBlbmNvZGVyIHBhcmFtcyIpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBpZiAoIVBWSW5pdFZpZGVvRW5jb2RlcihtSGFuZGxlLCBtRW5jUGFyYW1zKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIGVuY29kZXIiKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICAvLyAxc3QgYnVmZmVyIGZvciBjb2RlYyBzcGVjaWZpYyBkYXRhCisgICAgbU51bUlucHV0RnJhbWVzID0gLTE7CisgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRNcGVnNEVuYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSW5pdGlhbGl6ZSBlbmNvZGVyIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpemVkCisgICAgaWYgKCFtU3RhcnRlZCAmJiBDMl9PSyAhPSBpbml0RW5jb2RlcigpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBlbmNvZGVyIik7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhtT3V0QnVmZmVyU2l6ZSwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gd1ZpZXcuZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQ4X3QgKm91dFB0ciA9ICh1aW50OF90ICopd1ZpZXcuZGF0YSgpOworICAgIGlmIChtTnVtSW5wdXRGcmFtZXMgPCAwKSB7CisgICAgICAgIC8vIFRoZSB2ZXJ5IGZpcnN0IHRoaW5nIHdlIHdhbnQgdG8gb3V0cHV0IGlzIHRoZSBjb2RlYyBzcGVjaWZpYyBkYXRhLgorICAgICAgICBpbnQzMl90IG91dHB1dFNpemUgPSBtT3V0QnVmZmVyU2l6ZTsKKyAgICAgICAgaWYgKCFQVkdldFZvbEhlYWRlcihtSGFuZGxlLCBvdXRQdHIsICZvdXRwdXRTaXplLCAwKSkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgVk9MIGhlYWRlciIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJCeXRlcyBHZW5lcmF0ZWQgaW4gaGVhZGVyICVkXG4iLCBvdXRwdXRTaXplKTsKKyAgICAgICAgfQorCisgICAgICAgICsrbU51bUlucHV0RnJhbWVzOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJlYW1Dc2RJbmZvOjpvdXRwdXQ+IGNzZCA9CisgICAgICAgICAgICBDMlN0cmVhbUNzZEluZm86Om91dHB1dDo6QWxsb2NVbmlxdWUob3V0cHV0U2l6ZSwgMHUpOworICAgICAgICBpZiAoIWNzZCkgeworICAgICAgICAgICAgQUxPR0UoIkNTRCBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoY3NkLT5tLnZhbHVlLCBvdXRQdHIsIG91dHB1dFNpemUpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhzdGQ6Om1vdmUoY3NkKSk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IHJWaWV3OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gaW5wdXRCdWZmZXI7CisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgaW5wdXRCdWZmZXIgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdOworICAgICAgICByVmlldyA9IHN0ZDo6bWFrZV9zaGFyZWQ8Y29uc3QgQzJHcmFwaGljVmlldz4oCisgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKSk7CisgICAgICAgIGlmIChyVmlldy0+ZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZXJyID0gJWQiLCByVmlldy0+ZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSByVmlldy0+ZXJyb3IoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdWludDY0X3QgaW5wdXRUaW1lU3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdWxsKCk7CisgICAgY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayBpbkJ1ZmZlciA9IGlucHV0QnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLmZyb250KCk7CisgICAgaWYgKGluQnVmZmVyLndpZHRoKCkgPCBtU2l6ZS0+d2lkdGggfHwKKyAgICAgICAgaW5CdWZmZXIuaGVpZ2h0KCkgPCBtU2l6ZS0+aGVpZ2h0KSB7CisgICAgICAgIC8qIEV4cGVjdCB3aWR0aCBoZWlnaHQgdG8gYmUgY29uZmlndXJlZCAqLworICAgICAgICBBTE9HVygidW5leHBlY3RlZCBDYXBhY2l0eSBBc3BlY3QgJWQoJWQpIHggJWQoJWQpIiwgaW5CdWZmZXIud2lkdGgoKSwKKyAgICAgICAgICAgICAgbVNpemUtPndpZHRoLCBpbkJ1ZmZlci5oZWlnaHQoKSwgbVNpemUtPmhlaWdodCk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IEMyUGxhbmFyTGF5b3V0ICZsYXlvdXQgPSByVmlldy0+bGF5b3V0KCk7CisgICAgdWludDhfdCAqeVBsYW5lID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHJWaWV3LT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldKTsKKyAgICB1aW50OF90ICp1UGxhbmUgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oclZpZXctPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVV0pOworICAgIHVpbnQ4X3QgKnZQbGFuZSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihyVmlldy0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSk7CisgICAgaW50MzJfdCB5U3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV0ucm93SW5jOworICAgIGludDMyX3QgdVN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdLnJvd0luYzsKKyAgICBpbnQzMl90IHZTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXS5yb3dJbmM7CisgICAgdWludDMyX3Qgd2lkdGggPSBtU2l6ZS0+d2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0ID0gbVNpemUtPmhlaWdodDsKKyAgICAvLyB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBhbHdheXMgZXZlbiAoYXMgYmxvY2sgc2l6ZSBpcyAxNngxNikKKyAgICBDSEVDS19FUSgod2lkdGggJiAxdSksIDB1KTsKKyAgICBDSEVDS19FUSgoaGVpZ2h0ICYgMXUpLCAwdSk7CisgICAgc2l6ZV90IHlQbGFuZVNpemUgPSB3aWR0aCAqIGhlaWdodDsKKyAgICBzd2l0Y2ggKGxheW91dC50eXBlKSB7CisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCOgorICAgICAgICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQkE6IHsKKyAgICAgICAgICAgIE1lbW9yeUJsb2NrIGNvbnZlcnNpb25CdWZmZXIgPSBtQ29udmVyc2lvbkJ1ZmZlcnMuZmV0Y2goeVBsYW5lU2l6ZSAqIDMgLyAyKTsKKyAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyc0luVXNlLmVtcGxhY2UoY29udmVyc2lvbkJ1ZmZlci5kYXRhKCksIGNvbnZlcnNpb25CdWZmZXIpOworICAgICAgICAgICAgeVBsYW5lID0gY29udmVyc2lvbkJ1ZmZlci5kYXRhKCk7CisgICAgICAgICAgICB1UGxhbmUgPSB5UGxhbmUgKyB5UGxhbmVTaXplOworICAgICAgICAgICAgdlBsYW5lID0gdVBsYW5lICsgeVBsYW5lU2l6ZSAvIDQ7CisgICAgICAgICAgICB5U3RyaWRlID0gd2lkdGg7CisgICAgICAgICAgICB1U3RyaWRlID0gdlN0cmlkZSA9IHdpZHRoIC8gMjsKKyAgICAgICAgICAgIENvbnZlcnRSR0JUb1BsYW5hcllVVih5UGxhbmUsIHlTdHJpZGUsIGhlaWdodCwgY29udmVyc2lvbkJ1ZmZlci5zaXplKCksICpyVmlldy5nZXQoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVjogeworICAgICAgICAgICAgaWYgKCFJc1lVVjQyMCgqclZpZXcpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImlucHV0IGlzIG5vdCBZVVY0MjAiKTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9ZXS5jb2xJbmMgPT0gMQorICAgICAgICAgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5jb2xJbmMgPT0gMQorICAgICAgICAgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5jb2xJbmMgPT0gMQorICAgICAgICAgICAgICAgICAgICAmJiB1U3RyaWRlID09IHZTdHJpZGUKKyAgICAgICAgICAgICAgICAgICAgJiYgeVN0cmlkZSA9PSAyICogdlN0cmlkZSkgeworICAgICAgICAgICAgICAgIC8vIEk0MjAgY29tcGF0aWJsZSAtIHBsYW5lcyBhcmUgYWxyZWFkeSBzZXQgdXAgYWJvdmUKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY29weSB0byBJNDIwCisgICAgICAgICAgICBNZW1vcnlCbG9jayBjb252ZXJzaW9uQnVmZmVyID0gbUNvbnZlcnNpb25CdWZmZXJzLmZldGNoKHlQbGFuZVNpemUgKiAzIC8gMik7CisgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZS5lbXBsYWNlKGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpLCBjb252ZXJzaW9uQnVmZmVyKTsKKyAgICAgICAgICAgIE1lZGlhSW1hZ2UyIGltZyA9IENyZWF0ZVlVVjQyMFBsYW5hck1lZGlhSW1hZ2UyKHdpZHRoLCBoZWlnaHQsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gSW1hZ2VDb3B5KGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpLCAmaW1nLCAqclZpZXcpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJCdWZmZXIgY29udmVyc2lvbiBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeVBsYW5lID0gY29udmVyc2lvbkJ1ZmZlci5kYXRhKCk7CisgICAgICAgICAgICB1UGxhbmUgPSB5UGxhbmUgKyB5UGxhbmVTaXplOworICAgICAgICAgICAgdlBsYW5lID0gdVBsYW5lICsgeVBsYW5lU2l6ZSAvIDQ7CisgICAgICAgICAgICB5U3RyaWRlID0gd2lkdGg7CisgICAgICAgICAgICB1U3RyaWRlID0gdlN0cmlkZSA9IHdpZHRoIC8gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVZBOgorICAgICAgICAgICAgQUxPR0UoIllVVkEgcGxhbmUgdHlwZSBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJVbnJlY29nbml6ZWQgcGxhbmUgdHlwZTogJWQiLCBsYXlvdXQudHlwZSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ0hFQ0soTlVMTCAhPSB5UGxhbmUpOworICAgIC8qIEVuY29kZSBmcmFtZXMgKi8KKyAgICBWaWRlb0VuY0ZyYW1lSU8gdmluLCB2b3V0OworICAgIG1lbXNldCgmdmluLCAwLCBzaXplb2YodmluKSk7CisgICAgbWVtc2V0KCZ2b3V0LCAwLCBzaXplb2Yodm91dCkpOworICAgIHZpbi55Q2hhbiA9IHlQbGFuZTsKKyAgICB2aW4udUNoYW4gPSB1UGxhbmU7CisgICAgdmluLnZDaGFuID0gdlBsYW5lOworICAgIHZpbi50aW1lc3RhbXAgPSAoaW5wdXRUaW1lU3RhbXAgKyA1MDApIC8gMTAwMDsgIC8vIGluIG1zCisgICAgdmluLmhlaWdodCA9IGFsaWduKGhlaWdodCwgMTYpOworICAgIHZpbi5waXRjaCA9IGFsaWduKHdpZHRoLCAxNik7CisKKyAgICB1aW50MzJfdCBtb2RUaW1lTXMgPSAwOworICAgIGludDMyX3QgbkxheWVyID0gMDsKKyAgICBNUDRIaW50VHJhY2sgaGludFRyYWNrOworICAgIGludDMyX3Qgb3V0cHV0U2l6ZSA9IG1PdXRCdWZmZXJTaXplOworICAgIGlmICghUFZFbmNvZGVWaWRlb0ZyYW1lKG1IYW5kbGUsICZ2aW4sICZ2b3V0LCAmbW9kVGltZU1zLCBvdXRQdHIsICZvdXRwdXRTaXplLCAmbkxheWVyKSB8fAorICAgICAgICAhUFZHZXRIaW50VHJhY2sobUhhbmRsZSwgJmhpbnRUcmFjaykpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBlbmNvZGUgZnJhbWUgb3IgZ2V0IGhpbnQgdHJhY2sgYXQgZnJhbWUgJSIgUFJJZDY0LCBtTnVtSW5wdXRGcmFtZXMpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1YoIm91dHB1dFNpemUgZmlsbGVkIDogJWQiLCBvdXRwdXRTaXplKTsKKyAgICArK21OdW1JbnB1dEZyYW1lczsKKyAgICBDSEVDSyhOVUxMID09IFBWR2V0T3ZlcnJ1bkJ1ZmZlcihtSGFuZGxlKSk7CisKKyAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIGlmIChvdXRwdXRTaXplKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0gY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLCAwLCBvdXRwdXRTaXplKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wID0gaW5wdXRUaW1lU3RhbXA7CisgICAgICAgIGlmIChoaW50VHJhY2suQ29kZVR5cGUgPT0gMCkgeworICAgICAgICAgICAgYnVmZmVyLT5zZXRJbmZvKHN0ZDo6bWFrZV9zaGFyZWQ8QzJTdHJlYW1QaWN0dXJlVHlwZU1hc2tJbmZvOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAwdSAvKiBzdHJlYW0gaWQgKi8sIEMyUGljdHVyZVR5cGVLZXlGcmFtZSkpOworICAgICAgICB9CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgIH0KKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgIH0KKworICAgIG1Db252ZXJzaW9uQnVmZmVyc0luVXNlLmVyYXNlKHlQbGFuZSk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RW5jOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitjbGFzcyBDMlNvZnRNcGVnNEVuY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRNcGVnNEVuY0ZhY3RvcnkoKQorICAgICAgICA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkge30KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICBuZXcgQzJTb2Z0TXBlZzRFbmMoCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0TXBlZzRFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdE1wZWc0RW5jOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0TXBlZzRFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdE1wZWc0RW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0TXBlZzRFbmNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzRFbmMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzRFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzQ2MWZjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNEVuYy5oCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJfU09GVF9NUEVHNF9FTkNfSF9fCisjZGVmaW5lIEMyX1NPRlRfTVBFRzRfRU5DX0hfXworCisjaW5jbHVkZSA8bWFwPgorCisjaW5jbHVkZSA8Q29kZWMyQnVmZmVyVXRpbHMuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSAibXA0ZW5jX2FwaS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRNcGVnNEVuYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRNcGVnNEVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorCisgICAgdmlydHVhbCB+QzJTb2Z0TXBlZzRFbmMoKTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworCisgICAgdGFndmlkZW9FbmNDb250cm9scyAqbUhhbmRsZTsKKyAgICB0YWd2aWRlb0VuY09wdGlvbnMgICptRW5jUGFyYW1zOworCisgICAgYm9vbCAgICAgbVN0YXJ0ZWQ7CisgICAgYm9vbCAgICAgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sICAgICBtU2lnbmFsbGVkRXJyb3I7CisKKyAgICB1aW50MzJfdCBtT3V0QnVmZmVyU2l6ZTsKKyAgICAvLyBjb25maWd1cmF0aW9ucyB1c2VkIGJ5IGNvbXBvbmVudCBpbiBwcm9jZXNzCisgICAgLy8gKFRPRE86IGtlZXAgdGhpcyBpbiBpbnRmIGJ1dCBtYWtlIHRoZW0gaW50ZXJuYWwgb25seSkKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IG1GcmFtZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbUJpdHJhdGU7CisKKyAgICBpbnQ2NF90ICBtTnVtSW5wdXRGcmFtZXM7CisgICAgTVA0RW5jb2RpbmdNb2RlIG1FbmNvZGVNb2RlOworCisgICAgTWVtb3J5QmxvY2tQb29sIG1Db252ZXJzaW9uQnVmZmVyczsKKyAgICBzdGQ6Om1hcDx2b2lkICosIE1lbW9yeUJsb2NrPiBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZTsKKworICAgIGMyX3N0YXR1c190IGluaXRFbmNQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBpbml0RW5jb2RlcigpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0TXBlZzRFbmMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDMl9TT0ZUX01QRUc0X0VOQ19IX18KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL05PVElDRSBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjFlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL05PVElDRQpAQCAtMCwwICsxLDE5MCBAQAorCisgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvcGF0ZW50X2Rpc2NsYWltZXIudHh0IGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9wYXRlbnRfZGlzY2xhaW1lci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRiZjExZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvcGF0ZW50X2Rpc2NsYWltZXIudHh0CkBAIC0wLDAgKzEsOSBAQAorCitUSElTIElTIE5PVCBBIEdSQU5UIE9GIFBBVEVOVCBSSUdIVFMuCisKK0dvb2dsZSBtYWtlcyBubyByZXByZXNlbnRhdGlvbiBvciB3YXJyYW50eSB0aGF0IHRoZSBjb2RlY3MgZm9yIHdoaWNoCitzb3VyY2UgY29kZSBpcyBtYWRlIGF2YWlsYWJsZSBoZXJldW5kZXIgYXJlIHVuZW5jdW1iZXJlZCBieQordGhpcmQtcGFydHkgcGF0ZW50cy4gIFRob3NlIGludGVuZGluZyB0byB1c2UgdGhpcyBzb3VyY2UgY29kZSBpbgoraGFyZHdhcmUgb3Igc29mdHdhcmUgcHJvZHVjdHMgYXJlIGFkdmlzZWQgdGhhdCBpbXBsZW1lbnRhdGlvbnMgb2YKK3RoZXNlIGNvZGVjcywgaW5jbHVkaW5nIGluIG9wZW4gc291cmNlIHNvZnR3YXJlIG9yIHNoYXJld2FyZSwgbWF5CityZXF1aXJlIHBhdGVudCBsaWNlbnNlcyBmcm9tIHRoZSByZWxldmFudCBwYXRlbnQgaG9sZGVycy4KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDBjZGI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTEgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfb3B1c2RlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0T3B1c0RlYy5jcHAiXSwKKworICAgIHNoYXJlZF9saWJzOiBbImxpYm9wdXMiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MzljM2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNEZWMuY3BwCkBAIC0wLDAgKzEsNTQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRPcHVzRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRPcHVzRGVjLmgiCisKK2V4dGVybiAiQyIgeworICAgICNpbmNsdWRlIDxvcHVzLmg+CisgICAgI2luY2x1ZGUgPG9wdXNfbXVsdGlzdHJlYW0uaD4KK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQub3B1cy5kZWNvZGVyIjsKKworY2xhc3MgQzJTb2Z0T3B1c0RlYzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4mIGhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX05BTUVfSU5QVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Gb3JtYXRDb25maWc6OmlucHV0KDB1LCBDMkZvcm1hdENvbXByZXNzZWQpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfTkFNRV9PVVRQVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Gb3JtYXRDb25maWc6Om91dHB1dCgwdSwgQzJGb3JtYXRBdWRpbykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX05BTUVfSU5QVVRfUE9SVF9NSU1FX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1pbWVDb25maWc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfTkFNRV9PVVRQVVRfUE9SVF9NSU1FX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1pbWVDb25maWc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX05BTUVfU1RSRUFNX1NBTVBMRV9SQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDQ4MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuZXF1YWxUbyg0ODAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9OQU1FX1NUUkVBTV9DSEFOTkVMX0NPVU5UX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuaW5SYW5nZSgxLCA4KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9OQU1FX1NUUkVBTV9CSVRSQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMkJpdHJhdGVUdW5pbmc6OmlucHV0KDB1LCA2MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg2MDAwLCA1MTAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA5NjAgKiA2KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZvcm1hdENvbmZpZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Gb3JtYXRDb25maWc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWltZUNvbmZpZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ+IG1TYW1wbGVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCaXRyYXRlVHVuaW5nOjppbnB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtSW5wdXRNYXhCdWZTaXplOworfTsKKworQzJTb2Z0T3B1c0RlYzo6QzJTb2Z0T3B1c0RlYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtRGVjb2RlcihudWxscHRyKSB7Cit9CisKK0MyU29mdE9wdXNEZWM6On5DMlNvZnRPcHVzRGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRPcHVzRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9OT19NRU1PUlk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE9wdXNEZWM6Om9uU3RvcCgpIHsKKyAgICBpZiAobURlY29kZXIpIHsKKyAgICAgICAgb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2Rlc3Ryb3kobURlY29kZXIpOworICAgICAgICBtRGVjb2RlciA9IG51bGxwdHI7CisgICAgfQorICAgIG1lbXNldCgmbUhlYWRlciwgMCwgc2l6ZW9mKG1IZWFkZXIpKTsKKyAgICBtQ29kZWNEZWxheSA9IDA7CisgICAgbVNlZWtQcmVSb2xsID0gMDsKKyAgICBtU2FtcGxlc1RvRGlzY2FyZCA9IDA7CisgICAgbUlucHV0QnVmZmVyQ291bnQgPSAwOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRPcHVzRGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdE9wdXNEZWM6Om9uUmVsZWFzZSgpIHsKKyAgICBpZiAobURlY29kZXIpIHsKKyAgICAgICAgb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2Rlc3Ryb3kobURlY29kZXIpOworICAgICAgICBtRGVjb2RlciA9IG51bGxwdHI7CisgICAgfQorfQorCitzdGF0dXNfdCBDMlNvZnRPcHVzRGVjOjppbml0RGVjb2RlcigpIHsKKyAgICBtZW1zZXQoJm1IZWFkZXIsIDAsIHNpemVvZihtSGVhZGVyKSk7CisgICAgbUNvZGVjRGVsYXkgPSAwOworICAgIG1TZWVrUHJlUm9sbCA9IDA7CisgICAgbVNhbXBsZXNUb0Rpc2NhcmQgPSAwOworICAgIG1JbnB1dEJ1ZmZlckNvdW50ID0gMDsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE9wdXNEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgaWYgKG1EZWNvZGVyKSB7CisgICAgICAgIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jdGwobURlY29kZXIsIE9QVVNfUkVTRVRfU1RBVEUpOworICAgICAgICBtU2FtcGxlc1RvRGlzY2FyZCA9IG1TZWVrUHJlUm9sbDsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE9wdXNEZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZCkgcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGF0aWMgdm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKworc3RhdGljIHVpbnQxNl90IFJlYWRMRTE2KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVhZF9vZmZzZXQpIHsKKyAgICBpZiAocmVhZF9vZmZzZXQgKyAxID4gZGF0YV9zaXplKQorICAgICAgICByZXR1cm4gMDsKKyAgICB1aW50MTZfdCB2YWw7CisgICAgdmFsID0gZGF0YVtyZWFkX29mZnNldF07CisgICAgdmFsIHw9IGRhdGFbcmVhZF9vZmZzZXQgKyAxXSA8PCA4OworICAgIHJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBjb25zdCBpbnQga1JhdGUgPSA0ODAwMDsKKworLy8gT3B1cyB1c2VzIFZvcmJpcyBjaGFubmVsIG1hcHBpbmcsIGFuZCBWb3JiaXMgY2hhbm5lbCBtYXBwaW5nIHNwZWNpZmllcworLy8gbWFwcGluZ3MgZm9yIHVwIHRvIDggY2hhbm5lbHMuIFRoaXMgaW5mb3JtYXRpb24gaXMgcGFydCBvZiB0aGUgVm9yYmlzIEkKKy8vIFNwZWNpZmljYXRpb246CisvLyBodHRwOi8vd3d3LnhpcGgub3JnL3ZvcmJpcy9kb2MvVm9yYmlzX0lfc3BlYy5odG1sCitzdGF0aWMgY29uc3QgaW50IGtNYXhDaGFubmVscyA9IDg7CisKKy8vIE1heGltdW0gcGFja2V0IHNpemUgdXNlZCBpbiBYaXBoJ3Mgb3B1c2RlYy4KK3N0YXRpYyBjb25zdCBpbnQga01heE9wdXNPdXRwdXRQYWNrZXRTaXplU2FtcGxlcyA9IDk2MCAqIDY7CisKKy8vIERlZmF1bHQgYXVkaW8gb3V0cHV0IGNoYW5uZWwgbGF5b3V0LiBVc2VkIHRvIGluaXRpYWxpemUgfHN0cmVhbV9tYXB8IGluCisvLyBPcHVzSGVhZGVyLCBhbmQgcGFzc2VkIHRvIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jcmVhdGUoKSB3aGVuIHRoZSBoZWFkZXIKKy8vIGRvZXMgbm90IGNvbnRhaW4gbWFwcGluZyBpbmZvcm1hdGlvbi4gVGhlIHZhbHVlcyBhcmUgdmFsaWQgb25seSBmb3IgbW9ubyBhbmQKKy8vIHN0ZXJlbyBvdXRwdXQ6IE9wdXMgc3RyZWFtcyB3aXRoIG1vcmUgdGhhbiAyIGNoYW5uZWxzIHJlcXVpcmUgYSBzdHJlYW0gbWFwLgorc3RhdGljIGNvbnN0IGludCBrTWF4Q2hhbm5lbHNXaXRoRGVmYXVsdExheW91dCA9IDI7CitzdGF0aWMgY29uc3QgdWludDhfdCBrRGVmYXVsdE9wdXNDaGFubmVsTGF5b3V0W2tNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0XSA9IHsgMCwgMSB9OworCisvLyBQYXJzZXMgT3B1cyBIZWFkZXIuIEhlYWRlciBzcGVjOiBodHRwOi8vd2lraS54aXBoLm9yZy9PZ2dPcHVzI0lEX0hlYWRlcgorc3RhdGljIGJvb2wgUGFyc2VPcHVzSGVhZGVyKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B1c0hlYWRlciogaGVhZGVyKSB7CisgICAgLy8gU2l6ZSBvZiB0aGUgT3B1cyBoZWFkZXIgZXhjbHVkaW5nIG9wdGlvbmFsIG1hcHBpbmcgaW5mb3JtYXRpb24uCisgICAgY29uc3Qgc2l6ZV90IGtPcHVzSGVhZGVyU2l6ZSA9IDE5OworCisgICAgLy8gT2Zmc2V0IHRvIHRoZSBjaGFubmVsIGNvdW50IGJ5dGUgaW4gdGhlIE9wdXMgaGVhZGVyLgorICAgIGNvbnN0IHNpemVfdCBrT3B1c0hlYWRlckNoYW5uZWxzT2Zmc2V0ID0gOTsKKworICAgIC8vIE9mZnNldCB0byB0aGUgcHJlLXNraXAgdmFsdWUgaW4gdGhlIE9wdXMgaGVhZGVyLgorICAgIGNvbnN0IHNpemVfdCBrT3B1c0hlYWRlclNraXBTYW1wbGVzT2Zmc2V0ID0gMTA7CisKKyAgICAvLyBPZmZzZXQgdG8gdGhlIGdhaW4gdmFsdWUgaW4gdGhlIE9wdXMgaGVhZGVyLgorICAgIGNvbnN0IHNpemVfdCBrT3B1c0hlYWRlckdhaW5PZmZzZXQgPSAxNjsKKworICAgIC8vIE9mZnNldCB0byB0aGUgY2hhbm5lbCBtYXBwaW5nIGJ5dGUgaW4gdGhlIE9wdXMgaGVhZGVyLgorICAgIGNvbnN0IHNpemVfdCBrT3B1c0hlYWRlckNoYW5uZWxNYXBwaW5nT2Zmc2V0ID0gMTg7CisKKyAgICAvLyBPcHVzIEhlYWRlciBjb250YWlucyBhIHN0cmVhbSBtYXAuIFRoZSBtYXBwaW5nIHZhbHVlcyBhcmUgaW4gdGhlIGhlYWRlcgorICAgIC8vIGJleW9uZCB0aGUgYWx3YXlzIHByZXNlbnQgfGtPcHVzSGVhZGVyU2l6ZXwgYnl0ZXMgb2YgZGF0YS4gVGhlIG1hcHBpbmcKKyAgICAvLyBkYXRhIGNvbnRhaW5zIHN0cmVhbSBjb3VudCwgY291cGxpbmcgaW5mb3JtYXRpb24sIGFuZCBwZXIgY2hhbm5lbCBtYXBwaW5nCisgICAgLy8gdmFsdWVzOgorICAgIC8vICAgLSBCeXRlIDA6IE51bWJlciBvZiBzdHJlYW1zLgorICAgIC8vICAgLSBCeXRlIDE6IE51bWJlciBjb3VwbGVkLgorICAgIC8vICAgLSBCeXRlIDI6IFN0YXJ0aW5nIGF0IGJ5dGUgMiBhcmUgfGhlYWRlci0+Y2hhbm5lbHN8IHVpbnQ4IG1hcHBpbmcKKyAgICAvLyAgICAgICAgICAgICB2YWx1ZXMuCisgICAgY29uc3Qgc2l6ZV90IGtPcHVzSGVhZGVyTnVtU3RyZWFtc09mZnNldCA9IGtPcHVzSGVhZGVyU2l6ZTsKKyAgICBjb25zdCBzaXplX3Qga09wdXNIZWFkZXJOdW1Db3VwbGVkT2Zmc2V0ID0ga09wdXNIZWFkZXJOdW1TdHJlYW1zT2Zmc2V0ICsgMTsKKyAgICBjb25zdCBzaXplX3Qga09wdXNIZWFkZXJTdHJlYW1NYXBPZmZzZXQgPSBrT3B1c0hlYWRlck51bVN0cmVhbXNPZmZzZXQgKyAyOworCisgICAgaWYgKGRhdGFfc2l6ZSA8IGtPcHVzSGVhZGVyU2l6ZSkgeworICAgICAgICBBTE9HRSgiSGVhZGVyIHNpemUgaXMgdG9vIHNtYWxsLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGhlYWRlci0+Y2hhbm5lbHMgPSAqKGRhdGEgKyBrT3B1c0hlYWRlckNoYW5uZWxzT2Zmc2V0KTsKKyAgICBpZiAoaGVhZGVyLT5jaGFubmVscyA8PSAwIHx8IGhlYWRlci0+Y2hhbm5lbHMgPiBrTWF4Q2hhbm5lbHMpIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgSGVhZGVyLCB3cm9uZyBjaGFubmVsIGNvdW50OiAlZCIsIGhlYWRlci0+Y2hhbm5lbHMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaGVhZGVyLT5za2lwX3NhbXBsZXMgPSBSZWFkTEUxNihkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga09wdXNIZWFkZXJTa2lwU2FtcGxlc09mZnNldCk7CisKKyAgICBoZWFkZXItPmdhaW5fZGIgPSBzdGF0aWNfY2FzdDxpbnQxNl90PihSZWFkTEUxNihkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrT3B1c0hlYWRlckdhaW5PZmZzZXQpKTsKKworICAgIGhlYWRlci0+Y2hhbm5lbF9tYXBwaW5nID0gKihkYXRhICsga09wdXNIZWFkZXJDaGFubmVsTWFwcGluZ09mZnNldCk7CisgICAgaWYgKCFoZWFkZXItPmNoYW5uZWxfbWFwcGluZykgeworICAgICAgICBpZiAoaGVhZGVyLT5jaGFubmVscyA+IGtNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0KSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBIZWFkZXIsIG1pc3Npbmcgc3RyZWFtIG1hcC4iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBoZWFkZXItPm51bV9zdHJlYW1zID0gMTsKKyAgICAgICAgaGVhZGVyLT5udW1fY291cGxlZCA9IGhlYWRlci0+Y2hhbm5lbHMgPiAxOworICAgICAgICBoZWFkZXItPnN0cmVhbV9tYXBbMF0gPSAwOworICAgICAgICBoZWFkZXItPnN0cmVhbV9tYXBbMV0gPSAxOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGRhdGFfc2l6ZSA8IGtPcHVzSGVhZGVyU3RyZWFtTWFwT2Zmc2V0ICsgaGVhZGVyLT5jaGFubmVscykgeworICAgICAgICBBTE9HRSgiSW52YWxpZCBzdHJlYW0gbWFwOyBpbnN1ZmZpY2llbnQgZGF0YSBmb3IgY3VycmVudCBjaGFubmVsICIKKyAgICAgICAgICAgICAgImNvdW50OiAlZCIsIGhlYWRlci0+Y2hhbm5lbHMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGhlYWRlci0+bnVtX3N0cmVhbXMgPSAqKGRhdGEgKyBrT3B1c0hlYWRlck51bVN0cmVhbXNPZmZzZXQpOworICAgIGhlYWRlci0+bnVtX2NvdXBsZWQgPSAqKGRhdGEgKyBrT3B1c0hlYWRlck51bUNvdXBsZWRPZmZzZXQpOworICAgIGlmIChoZWFkZXItPm51bV9zdHJlYW1zICsgaGVhZGVyLT5udW1fY291cGxlZCAhPSBoZWFkZXItPmNoYW5uZWxzKSB7CisgICAgICAgIEFMT0dFKCJJbmNvbnNpc3RlbnQgY2hhbm5lbCBtYXBwaW5nLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVhZGVyLT5jaGFubmVsczsgKytpKQorICAgICAgICBoZWFkZXItPnN0cmVhbV9tYXBbaV0gPSAqKGRhdGEgKyBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGkpOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBDb252ZXJ0IG5hbm9zZWNvbmRzIHRvIG51bWJlciBvZiBzYW1wbGVzLgorc3RhdGljIHVpbnQ2NF90IG5zX3RvX3NhbXBsZXModWludDY0X3QgbnMsIGludCByYXRlKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGRvdWJsZT4obnMpICogcmF0ZSAvIDEwMDAwMDAwMDA7Cit9CisKK3ZvaWQgQzJTb2Z0T3B1c0RlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpblNpemUgPT0gMCkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQiLCBpblNpemUsCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gclZpZXcuZGF0YSgpICsgaW5PZmZzZXQ7CisgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50IDwgMykgeworICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMCkgeworICAgICAgICAgICAgaWYgKCFQYXJzZU9wdXNIZWFkZXIoZGF0YSwgaW5TaXplLCAmbUhlYWRlcikpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRW5jb3VudGVyZWQgZXJyb3Igd2hpbGUgUGFyc2luZyBPcHVzIEhlYWRlci4iKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1aW50OF90IGNoYW5uZWxfbWFwcGluZ1trTWF4Q2hhbm5lbHNdID0gezB9OworICAgICAgICAgICAgaWYgKG1IZWFkZXIuY2hhbm5lbHMgPD0ga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJmNoYW5uZWxfbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAga0RlZmF1bHRPcHVzQ2hhbm5lbExheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJmNoYW5uZWxfbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci5zdHJlYW1fbWFwLAorICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLmNoYW5uZWxzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBzdGF0dXMgPSBPUFVTX0lOVkFMSURfU1RBVEU7CisgICAgICAgICAgICBtRGVjb2RlciA9IG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jcmVhdGUoa1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci5jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLm51bV9zdHJlYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXIubnVtX2NvdXBsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9tYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOworICAgICAgICAgICAgaWYgKCFtRGVjb2RlciB8fCBzdGF0dXMgIT0gT1BVU19PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3JlYXRlIGZhaWxlZCBzdGF0dXMgPSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgb3B1c19zdHJlcnJvcihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMgPSBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3RsKG1EZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUFVTX1NFVF9HQUlOKG1IZWFkZXIuZ2Fpbl9kYikpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBPUFVTX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgT1BVUyBoZWFkZXIgZ2Fpbjsgc3RhdHVzID0gJXMiLAorICAgICAgICAgICAgICAgICAgICAgIG9wdXNfc3RyZXJyb3Ioc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGluU2l6ZSA8IDgpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiSW5wdXQgc2FtcGxlIHNpemUgaXMgdG9vIHNtYWxsLiIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDY0X3Qgc2FtcGxlcyA9IG5zX3RvX3NhbXBsZXMoICoocmVpbnRlcnByZXRfY2FzdDxpbnQ2NF90Kj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdF9jYXN0PHVpbnQ4X3QgKj4gKGRhdGEpKSksIGtSYXRlKTsKKyAgICAgICAgICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAxKSB7CisgICAgICAgICAgICAgICAgbUNvZGVjRGVsYXkgPSBzYW1wbGVzOworICAgICAgICAgICAgICAgIG1TYW1wbGVzVG9EaXNjYXJkID0gbUNvZGVjRGVsYXk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBtU2Vla1ByZVJvbGwgPSBzYW1wbGVzOworCisgICAgICAgICAgICAgICAgQUxPR0koIkNvbmZpZ3VyaW5nIGRlY29kZXI6ICVkIEh6LCAlZCBjaGFubmVscyIsCisgICAgICAgICAgICAgICAgICAgICAgIGtSYXRlLCBtSGVhZGVyLmNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQgc2FtcGxlUmF0ZUluZm8oMHUsIGtSYXRlKTsKKyAgICAgICAgICAgICAgICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCBjaGFubmVsQ291bnRJbmZvKDB1LCBtSGVhZGVyLmNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgJnNhbXBsZVJhdGVJbmZvLCAmY2hhbm5lbENvdW50SW5mbyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKEMyUGFyYW06OkNvcHkoc2FtcGxlUmF0ZUluZm8pKTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShjaGFubmVsQ291bnRJbmZvKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvbmZpZyBVcGRhdGUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICsrbUlucHV0QnVmZmVyQ291bnQ7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSWdub3JlIENTRCByZS1zdWJtaXNzaW9ucy4KKyAgICBpZiAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gV2hlbiBzZWVraW5nIHRvIHplcm8sIHxtQ29kZWNEZWxheXwgc2FtcGxlcyBoYXMgdG8gYmUgZGlzY2FyZGVkCisgICAgLy8gaW5zdGVhZCBvZiB8bVNlZWtQcmVSb2xsfCBzYW1wbGVzIChhcyB3ZSB3b3VsZCB3aGVuIHNlZWtpbmcgdG8gYW55CisgICAgLy8gb3RoZXIgdGltZXN0YW1wKS4KKyAgICBpZiAod29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSA9PSAwKSBtU2FtcGxlc1RvRGlzY2FyZCA9IG1Db2RlY0RlbGF5OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgICAgICAgICAgICAgICBrTWF4TnVtU2FtcGxlc1BlckJ1ZmZlciAqIGtNYXhDaGFubmVscyAqIHNpemVvZihpbnQxNl90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludCBudW1TYW1wbGVzID0gb3B1c19tdWx0aXN0cmVhbV9kZWNvZGUobURlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90ICo+ICh3Vmlldy5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga01heE9wdXNPdXRwdXRQYWNrZXRTaXplU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgIGlmIChudW1TYW1wbGVzIDwgMCkgeworICAgICAgICBBTE9HRSgib3B1c19tdWx0aXN0cmVhbV9kZWNvZGUgcmV0dXJuZWQgbnVtU2FtcGxlcyAlZCIsIG51bVNhbXBsZXMpOworICAgICAgICBudW1TYW1wbGVzID0gMDsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IG91dE9mZnNldCA9IDA7CisgICAgaWYgKG1TYW1wbGVzVG9EaXNjYXJkID4gMCkgeworICAgICAgICBpZiAobVNhbXBsZXNUb0Rpc2NhcmQgPiBudW1TYW1wbGVzKSB7CisgICAgICAgICAgICBtU2FtcGxlc1RvRGlzY2FyZCAtPSBudW1TYW1wbGVzOworICAgICAgICAgICAgbnVtU2FtcGxlcyA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBudW1TYW1wbGVzIC09IG1TYW1wbGVzVG9EaXNjYXJkOworICAgICAgICAgICAgb3V0T2Zmc2V0ID0gbVNhbXBsZXNUb0Rpc2NhcmQgKiBzaXplb2YoaW50MTZfdCkgKiBtSGVhZGVyLmNoYW5uZWxzOworICAgICAgICAgICAgbVNhbXBsZXNUb0Rpc2NhcmQgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG51bVNhbXBsZXMpIHsKKyAgICAgICAgaW50IG91dFNpemUgPSBudW1TYW1wbGVzICogc2l6ZW9mKGludDE2X3QpICogbUhlYWRlci5jaGFubmVsczsKKyAgICAgICAgQUxPR1YoIm91dCBidWZmZXIgYXR0ci4gb2Zmc2V0ICVkIHNpemUgJWQgIiwgb3V0T2Zmc2V0LCBvdXRTaXplKTsKKworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgb3V0T2Zmc2V0LCBvdXRTaXplKSk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB9IGVsc2UgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBibG9jay5yZXNldCgpOworICAgIH0KKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgIH0KK30KKworY2xhc3MgQzJTb2Z0T3B1c0RlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRPcHVzRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdE9wdXNEZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRPcHVzRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdE9wdXNEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRPcHVzRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0T3B1c0RlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdE9wdXNEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJiNzQyNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0RlYy5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9PUFVTX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfT1BVU19ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKworc3RydWN0IE9wdXNNU0RlY29kZXI7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE9wdXNIZWFkZXIgeworICBpbnQgY2hhbm5lbHM7CisgIGludCBza2lwX3NhbXBsZXM7CisgIGludCBjaGFubmVsX21hcHBpbmc7CisgIGludCBudW1fc3RyZWFtczsKKyAgaW50IG51bV9jb3VwbGVkOworICBpbnQxNl90IGdhaW5fZGI7CisgIHVpbnQ4X3Qgc3RyZWFtX21hcFs4XTsKK307CisKK3N0cnVjdCBDMlNvZnRPcHVzRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdE9wdXNEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdE9wdXNEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7Citwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrTWF4TnVtU2FtcGxlc1BlckJ1ZmZlciA9IDk2MCAqIDYKKyAgICB9OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBPcHVzTVNEZWNvZGVyICptRGVjb2RlcjsKKyAgICBPcHVzSGVhZGVyIG1IZWFkZXI7CisKKyAgICBpbnQ2NF90IG1Db2RlY0RlbGF5OworICAgIGludDY0X3QgbVNlZWtQcmVSb2xsOworICAgIGludDY0X3QgbVNhbXBsZXNUb0Rpc2NhcmQ7CisgICAgc2l6ZV90IG1JbnB1dEJ1ZmZlckNvdW50OworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRPcHVzRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX09QVVNfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjOTQ0ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQW5kcm9pZC5icApAQCAtMCwwICsxLDkgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfcmF3ZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRSYXdEZWMuY3BwIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQzJTb2Z0UmF3RGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9DMlNvZnRSYXdEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjODM0ODEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQzJTb2Z0UmF3RGVjLmNwcApAQCAtMCwwICsxLDIzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0UmF3RGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRSYXdEZWMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQucmF3LmRlY29kZXIiOworCitjbGFzcyBDMlNvZnRSYXdEZWM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX05BTUVfSU5QVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Gb3JtYXRDb25maWc6OmlucHV0KDB1LCBDMkZvcm1hdENvbXByZXNzZWQpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfTkFNRV9PVVRQVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Gb3JtYXRDb25maWc6Om91dHB1dCgwdSwgQzJGb3JtYXRBdWRpbykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX05BTUVfSU5QVVRfUE9SVF9NSU1FX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1pbWVDb25maWc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9OQU1FX09VVFBVVF9QT1JUX01JTUVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWltZUNvbmZpZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfTkFNRV9TVFJFQU1fU0FNUExFX1JBVEVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgNDQxMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5pblJhbmdlKDgwMDAsIDE5MjAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9OQU1FX1NUUkVBTV9DSEFOTkVMX0NPVU5UX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCgwdSwgMikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuaW5SYW5nZSgxLCA4KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9OQU1FX1NUUkVBTV9CSVRSQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMkJpdHJhdGVUdW5pbmc6OmlucHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoMSwgMTAwMDAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA2NCAqIDEwMjQpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVBjbUVuY29kaW5nSW5mbywgQzJfUEFSQU1LRVlfUENNX0VOQ09ESU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QY21FbmNvZGluZ0luZm86Om91dHB1dCgwdSwgQzJDb25maWc6OlBDTV8xNikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtUGNtRW5jb2RpbmdJbmZvLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBDTV8xNiwKKyAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQQ01fOCwKKyAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQQ01fRkxPQVR9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVBjbUVuY29kaW5nSW5mbyk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Gb3JtYXRDb25maWc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRm9ybWF0Q29uZmlnOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1pbWVDb25maWc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1pbWVDb25maWc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQml0cmF0ZVR1bmluZzo6aW5wdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QY21FbmNvZGluZ0luZm86Om91dHB1dD4gbVBjbUVuY29kaW5nSW5mbzsKK307CisKK0MyU29mdFJhd0RlYzo6QzJTb2Z0UmF3RGVjKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSB7Cit9CisKK0MyU29mdFJhd0RlYzo6fkMyU29mdFJhd0RlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0UmF3RGVjOjpvbkluaXQoKSB7CisgICAgbVNpZ25hbGxlZEVvcyA9IGZhbHNlOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0UmF3RGVjOjpvblN0b3AoKSB7CisgICAgbVNpZ25hbGxlZEVvcyA9IGZhbHNlOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRSYXdEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0UmF3RGVjOjpvblJlbGVhc2UoKSB7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFJhd0RlYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0UmF3RGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKXBvb2w7CisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKworICAgIGlmIChtU2lnbmFsbGVkRW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQiLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2sod29yay0+aW5wdXQuYnVmZmVyc1swXSk7CisgICAgfQorICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgbVNpZ25hbGxlZEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRSYXdEZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZCkgcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitjbGFzcyBDMlNvZnRSYXdEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0UmF3RGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdFJhd0RlYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRSYXdEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0UmF3RGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0UmF3RGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0UmF3RGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0UmF3RGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQzJTb2Z0UmF3RGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQzJTb2Z0UmF3RGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RmZGVjNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9DMlNvZnRSYXdEZWMuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfUkFXX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfUkFXX0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRSYXdEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0UmF3RGVjKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdFJhd0RlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBib29sIG1TaWduYWxsZWRFb3M7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRSYXdEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfUkFXX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9OT1RJQ0UgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjFlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvTk9USUNFCkBAIC0wLDAgKzEsMTkwIEBACisKKyAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWY0ODVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMSBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF92b3JiaXNkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdFZvcmJpc0RlYy5jcHAiXSwKKworICAgIHNoYXJlZF9saWJzOiBbImxpYnZvcmJpc2lkZWMiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL0MyU29mdFZvcmJpc0RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg4MjVlNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuY3BwCkBAIC0wLDAgKzEsNDkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRWb3JiaXNEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdFZvcmJpc0RlYy5oIgorCitleHRlcm4gIkMiIHsKKyAgICAjaW5jbHVkZSA8VHJlbW9sby9jb2RlY19pbnRlcm5hbC5oPgorCisgICAgaW50IF92b3JiaXNfdW5wYWNrX2Jvb2tzKHZvcmJpc19pbmZvICp2aSxvZ2dwYWNrX2J1ZmZlciAqb3BiKTsKKyAgICBpbnQgX3ZvcmJpc191bnBhY2tfaW5mbyh2b3JiaXNfaW5mbyAqdmksb2dncGFja19idWZmZXIgKm9wYik7CisgICAgaW50IF92b3JiaXNfdW5wYWNrX2NvbW1lbnQodm9yYmlzX2NvbW1lbnQgKnZjLG9nZ3BhY2tfYnVmZmVyICpvcGIpOworfQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC52b3JiaXMuZGVjb2RlciI7CisKK2NsYXNzIEMyU29mdFZvcmJpc0RlYzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfTkFNRV9JTlBVVF9TVFJFQU1fRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUZvcm1hdENvbmZpZzo6aW5wdXQoMHUsIEMyRm9ybWF0Q29tcHJlc3NlZCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9OQU1FX09VVFBVVF9TVFJFQU1fRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0KDB1LCBDMkZvcm1hdEF1ZGlvKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfTkFNRV9JTlBVVF9QT1JUX01JTUVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX05BTUVfT1VUUFVUX1BPUlRfTUlNRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9OQU1FX1NUUkVBTV9TQU1QTEVfUkFURV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCA0ODAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmluUmFuZ2UoODAwMCwgOTYwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfTkFNRV9TVFJFQU1fQ0hBTk5FTF9DT1VOVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgOCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfTkFNRV9TVFJFQU1fQklUUkFURV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJCaXRyYXRlVHVuaW5nOjppbnB1dCgwdSwgNjQwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDMyMDAwLCA1MDAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA4MTkyICogMiAqIHNpemVvZihpbnQxNl90KSkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Gb3JtYXRDb25maWc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRm9ybWF0Q29uZmlnOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1pbWVDb25maWc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1pbWVDb25maWc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQml0cmF0ZVR1bmluZzo6aW5wdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKK307CisKK0MyU29mdFZvcmJpc0RlYzo6QzJTb2Z0Vm9yYmlzRGVjKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1TdGF0ZShudWxscHRyKSwKKyAgICAgIG1WaShudWxscHRyKSB7Cit9CisKK0MyU29mdFZvcmJpc0RlYzo6fkMyU29mdFZvcmJpc0RlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0Vm9yYmlzRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9OT19NRU1PUlk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZvcmJpc0RlYzo6b25TdG9wKCkgeworICAgIGlmIChtU3RhdGUpIHsKKyAgICAgICAgdm9yYmlzX2RzcF9jbGVhcihtU3RhdGUpOworICAgICAgICBkZWxldGUgbVN0YXRlOworICAgICAgICBtU3RhdGUgPSBudWxscHRyOworICAgIH0KKworICAgIGlmIChtVmkpIHsKKyAgICAgICAgdm9yYmlzX2luZm9fY2xlYXIobVZpKTsKKyAgICAgICAgZGVsZXRlIG1WaTsKKyAgICAgICAgbVZpID0gbnVsbHB0cjsKKyAgICB9CisgICAgbU51bUZyYW1lc0xlZnRPblBhZ2UgPSAtMTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisKKyAgICByZXR1cm4gKGluaXREZWNvZGVyKCkgPT0gT0sgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRCk7Cit9CisKK3ZvaWQgQzJTb2Z0Vm9yYmlzRGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdFZvcmJpc0RlYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtU3RhdGUpIHsKKyAgICAgICAgdm9yYmlzX2RzcF9jbGVhcihtU3RhdGUpOworICAgICAgICBkZWxldGUgbVN0YXRlOworICAgICAgICBtU3RhdGUgPSBudWxscHRyOworICAgIH0KKworICAgIGlmIChtVmkpIHsKKyAgICAgICAgdm9yYmlzX2luZm9fY2xlYXIobVZpKTsKKyAgICAgICAgZGVsZXRlIG1WaTsKKyAgICAgICAgbVZpID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3N0YXR1c190IEMyU29mdFZvcmJpc0RlYzo6aW5pdERlY29kZXIoKSB7CisgICAgbVZpID0gbmV3IHZvcmJpc19pbmZve307CisgICAgaWYgKCFtVmkpIHJldHVybiBOT19NRU1PUlk7CisgICAgdm9yYmlzX2luZm9fY2xlYXIobVZpKTsKKworICAgIG1TdGF0ZSA9IG5ldyB2b3JiaXNfZHNwX3N0YXRle307CisgICAgaWYgKCFtU3RhdGUpIHJldHVybiBOT19NRU1PUlk7CisgICAgdm9yYmlzX2RzcF9jbGVhcihtU3RhdGUpOworCisgICAgbU51bUZyYW1lc0xlZnRPblBhZ2UgPSAtMTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbUluZm9VbnBhY2tlZCA9IGZhbHNlOworICAgIG1Cb29rc1VucGFja2VkID0gZmFsc2U7CisgICAgcmV0dXJuIE9LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWb3JiaXNEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgbU51bUZyYW1lc0xlZnRPblBhZ2UgPSAtMTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgaWYgKG1TdGF0ZSkgdm9yYmlzX2RzcF9yZXN0YXJ0KG1TdGF0ZSk7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZvcmJpc0RlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCitzdGF0aWMgdm9pZCBtYWtlQml0UmVhZGVyKAorICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgb2dnX2J1ZmZlciAqYnVmLCBvZ2dfcmVmZXJlbmNlICpyZWYsIG9nZ3BhY2tfYnVmZmVyICpiaXRzKSB7CisgICAgYnVmLT5kYXRhID0gKHVpbnQ4X3QgKilkYXRhOworICAgIGJ1Zi0+c2l6ZSA9IHNpemU7CisgICAgYnVmLT5yZWZjb3VudCA9IDE7CisgICAgYnVmLT5wdHIub3duZXIgPSBudWxscHRyOworCisgICAgcmVmLT5idWZmZXIgPSBidWY7CisgICAgcmVmLT5iZWdpbiA9IDA7CisgICAgcmVmLT5sZW5ndGggPSBzaXplOworICAgIHJlZi0+bmV4dCA9IG51bGxwdHI7CisKKyAgICBvZ2dwYWNrX3JlYWRpbml0KGJpdHMsIHJlZik7Cit9CisKKy8vIChDSEVDSyEpIG11bHRpZnJhbWUgaXMgdHJpY2t5LiBkZWNvZGUgY2FsbCBkb2VzbnQgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMKKy8vIGNvbnN1bWVkIGJ5IHRoZSBjb21wb25lbnQuIEFsc28gaXQgaXMgdW5jbGVhciB3aHkgbnVtUGFnZUZyYW1lcyBpcyBiZWluZworLy8gdGFnZ2VkIGF0IHRoZSBlbmQgb2YgaW5wdXQgYnVmZmVycyBmb3IgbmV3IHBhZ2VzLiBSZWZlciBsaW5lcyAyOTctMzAwIGluCisvLyBTaW1wbGVEZWNvZGluZ1NvdXJjZS5jcHAKK3ZvaWQgQzJTb2Z0Vm9yYmlzRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSByVmlldy5lcnJvcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGluU2l6ZSA9PSAwKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCIsIGluU2l6ZSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSByVmlldy5kYXRhKCkgKyBpbk9mZnNldDsKKyAgICBpbnQzMl90IG51bUNoYW5uZWxzICA9IG1WaS0+Y2hhbm5lbHM7CisgICAgaW50MzJfdCBzYW1wbGluZ1JhdGUgPSBtVmktPnJhdGU7CisgICAgaWYgKGluU2l6ZSA+IDcgJiYgIW1lbWNtcCgmZGF0YVsxXSwgInZvcmJpcyIsIDYpKSB7CisgICAgICAgIGlmICgoZGF0YVswXSAhPSAxKSAmJiAoZGF0YVswXSAhPSA1KSkgeworICAgICAgICAgICAgQUxPR0UoInVuZXhwZWN0ZWQgdHlwZSByZWNlaXZlZCAlZCIsIGRhdGFbMF0pOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG9nZ19idWZmZXIgYnVmOworICAgICAgICBvZ2dfcmVmZXJlbmNlIHJlZjsKKyAgICAgICAgb2dncGFja19idWZmZXIgYml0czsKKworICAgICAgICAvLyBza2lwIDcgPHR5cGUgKyAidm9yYmlzIj4gYnl0ZXMKKyAgICAgICAgbWFrZUJpdFJlYWRlcigoY29uc3QgdWludDhfdCAqKWRhdGEgKyA3LCBpblNpemUgLSA3LCAmYnVmLCAmcmVmLCAmYml0cyk7CisgICAgICAgIGlmIChkYXRhWzBdID09IDEpIHsKKyAgICAgICAgICAgIHZvcmJpc19pbmZvX2luaXQobVZpKTsKKyAgICAgICAgICAgIGlmICgwICE9IF92b3JiaXNfdW5wYWNrX2luZm8obVZpLCAmYml0cykpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRW5jb3VudGVyZWQgZXJyb3Igd2hpbGUgdW5wYWNraW5nIGluZm8iKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVZpLT5yYXRlICE9IHNhbXBsaW5nUmF0ZSB8fAorICAgICAgICAgICAgICAgICAgICBtVmktPmNoYW5uZWxzICE9IG51bUNoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInZvcmJpczogcmF0ZS9jaGFubmVscyBjaGFuZ2VkOiAlbGQvJWQiLCBtVmktPnJhdGUsIG1WaS0+Y2hhbm5lbHMpOworICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSA9IG1WaS0+cmF0ZTsKKyAgICAgICAgICAgICAgICBudW1DaGFubmVscyA9IG1WaS0+Y2hhbm5lbHM7CisKKyAgICAgICAgICAgICAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQgc2FtcGxlUmF0ZUluZm8oMHUsIHNhbXBsaW5nUmF0ZSk7CisgICAgICAgICAgICAgICAgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQgY2hhbm5lbENvdW50SW5mbygwdSwgbnVtQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+Y29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgeyAmc2FtcGxlUmF0ZUluZm8sICZjaGFubmVsQ291bnRJbmZvIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBDMl9NQVlfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAmZmFpbHVyZXMpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShzYW1wbGVSYXRlSW5mbykpOworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KGNoYW5uZWxDb3VudEluZm8pKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ29uZmlnIFVwZGF0ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbUluZm9VbnBhY2tlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIW1JbmZvVW5wYWNrZWQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRGF0YSB3aXRoIHR5cGU6NSBzZW50IGJlZm9yZSBzZW5kaW5nIHR5cGU6MSIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgwICE9IF92b3JiaXNfdW5wYWNrX2Jvb2tzKG1WaSwgJmJpdHMpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkVuY291bnRlcmVkIGVycm9yIHdoaWxlIHVucGFja2luZyBib29rcyIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgwICE9IHZvcmJpc19kc3BfaW5pdChtU3RhdGUsIG1WaSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRW5jb3VudGVyZWQgZXJyb3Igd2hpbGUgZHNwIGluaXQiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQm9va3NVbnBhY2tlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIW1JbmZvVW5wYWNrZWQgfHwgIW1Cb29rc1VucGFja2VkKSB7CisgICAgICAgIEFMT0dFKCJNaXNzaW5nIENPREVDX0NPTkZJRyBkYXRhIG1JbmZvVW5wYWNrZWQ6ICVkIG1Cb29rc1VucGFjayAlZCIsIG1JbmZvVW5wYWNrZWQsIG1Cb29rc1VucGFja2VkKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MzJfdCBudW1QYWdlRnJhbWVzID0gMDsKKyAgICBpZiAoaW5TaXplIDwgc2l6ZW9mKG51bVBhZ2VGcmFtZXMpKSB7CisgICAgICAgIEFMT0dFKCJpbnB1dCBoZWFkZXIgaGFzIHNpemUgJXp1LCBleHBlY3RlZCAlenUiLCBpblNpemUsIHNpemVvZihudW1QYWdlRnJhbWVzKSk7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtZW1jcHkoJm51bVBhZ2VGcmFtZXMsIGRhdGEgKyBpblNpemUgLSBzaXplb2YobnVtUGFnZUZyYW1lcyksIHNpemVvZihudW1QYWdlRnJhbWVzKSk7CisgICAgaW5TaXplIC09IHNpemVvZihudW1QYWdlRnJhbWVzKTsKKyAgICBpZiAobnVtUGFnZUZyYW1lcyA+PSAwKSB7CisgICAgICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlID0gbnVtUGFnZUZyYW1lczsKKyAgICB9CisKKyAgICBvZ2dfYnVmZmVyIGJ1ZjsKKyAgICBidWYuZGF0YSA9IGNvbnN0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KGRhdGEpOworICAgIGJ1Zi5zaXplID0gaW5TaXplOworICAgIGJ1Zi5yZWZjb3VudCA9IDE7CisgICAgYnVmLnB0ci5vd25lciA9IG51bGxwdHI7CisKKyAgICBvZ2dfcmVmZXJlbmNlIHJlZjsKKyAgICByZWYuYnVmZmVyID0gJmJ1ZjsKKyAgICByZWYuYmVnaW4gPSAwOworICAgIHJlZi5sZW5ndGggPSBidWYuc2l6ZTsKKyAgICByZWYubmV4dCA9IG51bGxwdHI7CisKKyAgICBvZ2dfcGFja2V0IHBhY2s7CisgICAgcGFjay5wYWNrZXQgPSAmcmVmOworICAgIHBhY2suYnl0ZXMgPSByZWYubGVuZ3RoOworICAgIHBhY2suYl9vX3MgPSAwOworICAgIHBhY2suZV9vX3MgPSAwOworICAgIHBhY2suZ3JhbnVsZXBvcyA9IDA7CisgICAgcGFjay5wYWNrZXRubyA9IDA7CisKKyAgICBzaXplX3QgbWF4U2FtcGxlc0luQnVmZmVyID0ga01heE51bVNhbXBsZXNQZXJDaGFubmVsICogbVZpLT5jaGFubmVsczsKKyAgICBzaXplX3Qgb3V0Q2FwYWNpdHkgPSAgbWF4U2FtcGxlc0luQnVmZmVyICogc2l6ZW9mKGludDE2X3QpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhvdXRDYXBhY2l0eSwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IHdWaWV3LmVycm9yKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgbnVtRnJhbWVzID0gMDsKKyAgICBpbnQgcmV0ID0gdm9yYmlzX2RzcF9zeW50aGVzaXMobVN0YXRlLCAmcGFjaywgMSk7CisgICAgaWYgKDAgIT0gcmV0KSB7CisgICAgICAgIEFMT0dEKCJ2b3JiaXNfZHNwX3N5bnRoZXNpcyByZXR1cm5lZCAlZDsgaWdub3JlZCIsIHJldCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbnVtRnJhbWVzID0gdm9yYmlzX2RzcF9wY21vdXQoCisgICAgICAgICAgICAgICAgbVN0YXRlLCAgcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90ICo+ICh3Vmlldy5kYXRhKCkpLAorICAgICAgICAgICAgICAgIGtNYXhOdW1TYW1wbGVzUGVyQ2hhbm5lbCk7CisgICAgICAgIGlmIChudW1GcmFtZXMgPCAwKSB7CisgICAgICAgICAgICBBTE9HRCgidm9yYmlzX2RzcF9wY21vdXQgcmV0dXJuZWQgJWQiLCBudW1GcmFtZXMpOworICAgICAgICAgICAgbnVtRnJhbWVzID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtTnVtRnJhbWVzTGVmdE9uUGFnZSA+PSAwKSB7CisgICAgICAgIGlmIChudW1GcmFtZXMgPiBtTnVtRnJhbWVzTGVmdE9uUGFnZSkgeworICAgICAgICAgICAgQUxPR1YoImRpc2NhcmRpbmcgJWQgZnJhbWVzIGF0IGVuZCBvZiBwYWdlIiwgbnVtRnJhbWVzIC0gbU51bUZyYW1lc0xlZnRPblBhZ2UpOworICAgICAgICAgICAgbnVtRnJhbWVzID0gbU51bUZyYW1lc0xlZnRPblBhZ2U7CisgICAgICAgIH0KKyAgICAgICAgbU51bUZyYW1lc0xlZnRPblBhZ2UgLT0gbnVtRnJhbWVzOworICAgIH0KKworICAgIGlmIChudW1GcmFtZXMpIHsKKyAgICAgICAgaW50IG91dFNpemUgPSBudW1GcmFtZXMgKiBzaXplb2YoaW50MTZfdCkgKiBtVmktPmNoYW5uZWxzOworCisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLCAwLCBvdXRTaXplKSk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB9IGVsc2UgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBibG9jay5yZXNldCgpOworICAgIH0KKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgIH0KK30KKworY2xhc3MgQzJTb2Z0Vm9yYmlzRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdFZvcmJpc0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRWb3JiaXNEZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0Vm9yYmlzRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdFZvcmJpc0RlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFZvcmJpc0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdFZvcmJpc0RlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdFZvcmJpc0RlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL0MyU29mdFZvcmJpc0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL0MyU29mdFZvcmJpc0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZjczMjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvQzJTb2Z0Vm9yYmlzRGVjLmgKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX1ZPUkJJU19ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX1ZPUkJJU19ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKworc3RydWN0IHZvcmJpc19kc3Bfc3RhdGU7CitzdHJ1Y3Qgdm9yYmlzX2luZm87CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdFZvcmJpc0RlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRWb3JiaXNEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0Vm9yYmlzRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga01heE51bVNhbXBsZXNQZXJDaGFubmVsID0gODE5MiwKKyAgICB9OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICB2b3JiaXNfZHNwX3N0YXRlICptU3RhdGU7CisgICAgdm9yYmlzX2luZm8gKm1WaTsKKworICAgIGludDMyX3QgbU51bUZyYW1lc0xlZnRPblBhZ2U7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgbUluZm9VbnBhY2tlZDsKKyAgICBib29sIG1Cb29rc1VucGFja2VkOworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRWb3JiaXNEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfVk9SQklTX0RFQ19IXworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL05PVElDRSBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViMWVmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9OT1RJQ0UKQEAgLTAsMCArMSwxOTAgQEAKKworICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZmQzNzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQW5kcm9pZC5icApAQCAtMCwwICsxLDYwIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3ZwOWRlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0VnB4RGVjLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlidnB4Il0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EVlA5IiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3ZwOGRlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0VnB4RGVjLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlidnB4Il0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfdnA5ZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAiQzJTb2Z0VnA5RW5jLmNwcCIsCisgICAgICAgICJDMlNvZnRWcHhFbmMuY3BwIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlidnB4Il0sCisKKyAgICBjZmxhZ3M6IFsiLURWUDkiXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF92cDhlbmMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDMlNvZnRWcDhFbmMuY3BwIiwKKyAgICAgICAgIkMyU29mdFZweEVuYy5jcHAiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJ2cHgiXSwKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOEVuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA4RW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWU3MTdhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOEVuYy5jcHAKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0VnA4RW5jIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KKworI2luY2x1ZGUgIkMyU29mdFZwOEVuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC52cDguZW5jb2RlciI7CisKK0MyU29mdFZwOEVuYzo6QzJTb2Z0VnA4RW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogQzJTb2Z0VnB4RW5jKG5hbWUsIGlkLCBpbnRmSW1wbCksIG1EQ1RQYXJ0aXRpb25zKDApLCBtUHJvZmlsZSgxKSB7fQorCit2b2lkIEMyU29mdFZwOEVuYzo6c2V0Q29kZWNTcGVjaWZpY0ludGVyZmFjZSgpIHsKKyAgICBtQ29kZWNJbnRlcmZhY2UgPSB2cHhfY29kZWNfdnA4X2N4KCk7Cit9CisKK3ZvaWQgQzJTb2Z0VnA4RW5jOjpzZXRDb2RlY1NwZWNpZmljQ29uZmlndXJhdGlvbigpIHsKKyAgICBzd2l0Y2ggKG1Qcm9maWxlKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAxOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wcm9maWxlID0gMjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDM7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wcm9maWxlID0gMDsKKyAgICB9Cit9CisKK3ZweF9jb2RlY19lcnJfdCBDMlNvZnRWcDhFbmM6OnNldENvZGVjU3BlY2lmaWNDb250cm9scygpIHsKKyAgICB2cHhfY29kZWNfZXJyX3QgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2NvbnRyb2wobUNvZGVjQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4RV9TRVRfVE9LRU5fUEFSVElUSU9OUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURDVFBhcnRpdGlvbnMpOworICAgIGlmIChjb2RlY19yZXR1cm4gIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBzZXR0aW5nIGRjdCBwYXJ0aXRpb25zIGZvciB2cHggZW5jb2Rlci4iKTsKKyAgICB9CisgICAgcmV0dXJuIGNvZGVjX3JldHVybjsKK30KKworY2xhc3MgQzJTb2Z0VnA4RW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdFZwOEVuY0ZhY3RvcnkoKQorICAgICAgICA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkge30KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICBuZXcgQzJTb2Z0VnA4RW5jKENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRWcHhFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdFZweEVuYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFZweEVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0VnA4RW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0VnA4RW5jRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA4RW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA4RW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ2ZjM1NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDhFbmMuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9WUDhfRU5DX0hfXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfVlA4X0VOQ19IX18KKworI2luY2x1ZGUgIkMyU29mdFZweEVuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIEV4cG9zZXMgdnA4IGVuY29kZXIgYXMgYSBjMiBDb21wb25lbnQKKy8vCisvLyBJbiBhZGRpdGlvbiB0byB0aGUgYmFzZSBjbGFzcyBzZXR0aW5ncywgT25seSBmb2xsb3dpbmcgZW5jb2RlciBzZXR0aW5ncyBhcmUKKy8vIGF2YWlsYWJsZToKKy8vICAgIC0gdG9rZW4gcGFydGl0aW9uaW5nCitzdHJ1Y3QgQzJTb2Z0VnA4RW5jIDogcHVibGljIEMyU29mdFZweEVuYyB7CisgICAgQzJTb2Z0VnA4RW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworCisgcHJvdGVjdGVkOgorICAgIC8vIFBvcHVsYXRlcyB8bUNvZGVjSW50ZXJmYWNlfCB3aXRoIGNvZGVjIHNwZWNpZmljIHNldHRpbmdzLgorICAgIHZpcnR1YWwgdm9pZCBzZXRDb2RlY1NwZWNpZmljSW50ZXJmYWNlKCk7CisKKyAgICAvLyBTZXRzIGNvZGVjIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24uCisgICAgdmlydHVhbCB2b2lkIHNldENvZGVjU3BlY2lmaWNDb25maWd1cmF0aW9uKCk7CisKKyAgICAvLyBJbml0aWFsaXplcyBjb2RlYyBzcGVjaWZpYyBlbmNvZGVyIHNldHRpbmdzLgorICAgIHZpcnR1YWwgdnB4X2NvZGVjX2Vycl90IHNldENvZGVjU3BlY2lmaWNDb250cm9scygpOworCisgcHJpdmF0ZToKKyAgICAvLyBNYXggdmFsdWUgc3VwcG9ydGVkIGZvciBEQ1QgcGFydGl0aW9ucworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrTWF4RENUUGFydGl0aW9ucyA9IDM7CisKKyAgICAvLyB2cDggc3BlY2lmaWMgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIKKyAgICAvLyB0aGF0IGVuYWJsZXMgdG9rZW4gcGFydGl0aW9uaW5nIG9mCisgICAgLy8gdGhlIHN0cmVhbSBpbnRvIHN1YnN0cmVhbXMKKyAgICBpbnQzMl90IG1EQ1RQYXJ0aXRpb25zOworCisgICAgLy8gQzIgUHJvZmlsZSBwYXJhbWV0ZXIKKyAgICBpbnQzMl90IG1Qcm9maWxlOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0VnA4RW5jKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX1ZQOF9FTkNfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA5RW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDlFbmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNjE3MGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA5RW5jLmNwcApAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRWcDlFbmMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgorCisjaW5jbHVkZSAiQzJTb2Z0VnA5RW5jLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLnZwOS5lbmNvZGVyIjsKKworQzJTb2Z0VnA5RW5jOjpDMlNvZnRWcDlFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpCisgICAgOiBDMlNvZnRWcHhFbmMobmFtZSwgaWQsIGludGZJbXBsKSwKKyAgICAgIG1Qcm9maWxlKDEpLAorICAgICAgbUxldmVsKDApLAorICAgICAgbVRpbGVDb2x1bW5zKDApLAorICAgICAgbUZyYW1lUGFyYWxsZWxEZWNvZGluZyhmYWxzZSkgeworfQorCit2b2lkIEMyU29mdFZwOUVuYzo6c2V0Q29kZWNTcGVjaWZpY0ludGVyZmFjZSgpIHsKKyAgICBtQ29kZWNJbnRlcmZhY2UgPSB2cHhfY29kZWNfdnA5X2N4KCk7Cit9CisKK3ZvaWQgQzJTb2Z0VnA5RW5jOjpzZXRDb2RlY1NwZWNpZmljQ29uZmlndXJhdGlvbigpIHsKKyAgICBzd2l0Y2ggKG1Qcm9maWxlKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAxOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wcm9maWxlID0gMjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDM7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wcm9maWxlID0gMDsKKyAgICB9Cit9CisKK3ZweF9jb2RlY19lcnJfdCBDMlNvZnRWcDlFbmM6OnNldENvZGVjU3BlY2lmaWNDb250cm9scygpIHsKKyAgICB2cHhfY29kZWNfZXJyX3QgY29kZWNSZXR1cm4gPSB2cHhfY29kZWNfY29udHJvbCgKKyAgICAgICAgICAgIG1Db2RlY0NvbnRleHQsIFZQOUVfU0VUX1RJTEVfQ09MVU1OUywgbVRpbGVDb2x1bW5zKTsKKyAgICBpZiAoY29kZWNSZXR1cm4gIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBzZXR0aW5nIFZQOUVfU0VUX1RJTEVfQ09MVU1OUyB0byAlZC4gdnB4X2NvZGVjX2NvbnRyb2woKSAiCisgICAgICAgICAgICAgICJyZXR1cm5lZCAlZCIsIG1UaWxlQ29sdW1ucywgY29kZWNSZXR1cm4pOworICAgICAgICByZXR1cm4gY29kZWNSZXR1cm47CisgICAgfQorICAgIGNvZGVjUmV0dXJuID0gdnB4X2NvZGVjX2NvbnRyb2woCisgICAgICAgICAgICBtQ29kZWNDb250ZXh0LCBWUDlFX1NFVF9GUkFNRV9QQVJBTExFTF9ERUNPRElORywKKyAgICAgICAgICAgIG1GcmFtZVBhcmFsbGVsRGVjb2RpbmcpOworICAgIGlmIChjb2RlY1JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIHNldHRpbmcgVlA5RV9TRVRfRlJBTUVfUEFSQUxMRUxfREVDT0RJTkcgdG8gJWQuIgorICAgICAgICAgICAgICAidnB4X2NvZGVjX2NvbnRyb2woKSByZXR1cm5lZCAlZCIsIG1GcmFtZVBhcmFsbGVsRGVjb2RpbmcsCisgICAgICAgICAgICAgIGNvZGVjUmV0dXJuKTsKKyAgICAgICAgcmV0dXJuIGNvZGVjUmV0dXJuOworICAgIH0KKyAgICBjb2RlY1JldHVybiA9IHZweF9jb2RlY19jb250cm9sKG1Db2RlY0NvbnRleHQsIFZQOUVfU0VUX1JPV19NVCwgMSk7CisgICAgaWYgKGNvZGVjUmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICBBTE9HRSgiRXJyb3Igc2V0dGluZyBWUDlFX1NFVF9ST1dfTVQgdG8gMS4gdnB4X2NvZGVjX2NvbnRyb2woKSAiCisgICAgICAgICAgICAgICJyZXR1cm5lZCAlZCIsIGNvZGVjUmV0dXJuKTsKKyAgICAgICAgcmV0dXJuIGNvZGVjUmV0dXJuOworICAgIH0KKworICAgIC8vIEZvciBWUDksIHdlIGFsd2F5cyBzZXQgQ1BVX1VTRUQgdG8gOCAoYmVjYXVzZSB0aGUgcmVhbHRpbWUgZGVmYXVsdCBpcyAwCisgICAgLy8gd2hpY2ggaXMgdG9vIHNsb3cpLgorICAgIGNvZGVjUmV0dXJuID0gdnB4X2NvZGVjX2NvbnRyb2wobUNvZGVjQ29udGV4dCwgVlA4RV9TRVRfQ1BVVVNFRCwgOCk7CisgICAgaWYgKGNvZGVjUmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICBBTE9HRSgiRXJyb3Igc2V0dGluZyBWUDhFX1NFVF9DUFVVU0VEIHRvIDguIHZweF9jb2RlY19jb250cm9sKCkgIgorICAgICAgICAgICAgICAicmV0dXJuZWQgJWQiLCBjb2RlY1JldHVybik7CisgICAgICAgIHJldHVybiBjb2RlY1JldHVybjsKKyAgICB9CisgICAgcmV0dXJuIGNvZGVjUmV0dXJuOworfQorCitjbGFzcyBDMlNvZnRWcDlFbmNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0VnA5RW5jRmFjdG9yeSgpCisgICAgICAgIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7fQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgIG5ldyBDMlNvZnRWcDlFbmMoQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFZweEVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0VnB4RW5jOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0VnB4RW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRWcDlFbmNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRWcDlFbmNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDlFbmMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDlFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2VmOGZkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOUVuYy5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX1ZQOV9FTkNfSF9fCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9WUDlfRU5DX0hfXworCisjaW5jbHVkZSAiQzJTb2Z0VnB4RW5jLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gRXhwb3NlcyB2cDkgZW5jb2RlciBhcyBhIGMyIENvbXBvbmVudAorLy8KKy8vIEluIGFkZGl0aW9uIHRvIHRoZSBiYXNlIGNsYXNzIHNldHRpbmdzLCBPbmx5IGZvbGxvd2luZyBlbmNvZGVyIHNldHRpbmdzIGFyZQorLy8gYXZhaWxhYmxlOgorLy8gICAgLSB0aWxlIHJvd3MKKy8vICAgIC0gdGlsZSBjb2x1bW5zCisvLyAgICAtIGZyYW1lIHBhcmFsbGVsIG1vZGUKK3N0cnVjdCBDMlNvZnRWcDlFbmMgOiBwdWJsaWMgQzJTb2Z0VnB4RW5jIHsKKyAgICBDMlNvZnRWcDlFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisKKyBwcm90ZWN0ZWQ6CisgICAgLy8gUG9wdWxhdGVzIHxtQ29kZWNJbnRlcmZhY2V8IHdpdGggY29kZWMgc3BlY2lmaWMgc2V0dGluZ3MuCisgICAgdmlydHVhbCB2b2lkIHNldENvZGVjU3BlY2lmaWNJbnRlcmZhY2UoKTsKKworICAgIC8vIFNldHMgY29kZWMgc3BlY2lmaWMgY29uZmlndXJhdGlvbi4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29kZWNTcGVjaWZpY0NvbmZpZ3VyYXRpb24oKTsKKworICAgIC8vIEluaXRpYWxpemVzIGNvZGVjIHNwZWNpZmljIGVuY29kZXIgc2V0dGluZ3MuCisgICAgdmlydHVhbCB2cHhfY29kZWNfZXJyX3Qgc2V0Q29kZWNTcGVjaWZpY0NvbnRyb2xzKCk7CisKKyBwcml2YXRlOgorICAgIC8vIEMyIFByb2ZpbGUgJiBMZXZlbCBwYXJhbWV0ZXIKKyAgICBpbnQzMl90IG1Qcm9maWxlOworICAgIGludDMyX3QgbUxldmVsIF9fdW51c2VkOworCisgICAgaW50MzJfdCBtVGlsZUNvbHVtbnM7CisKKyAgICBib29sIG1GcmFtZVBhcmFsbGVsRGVjb2Rpbmc7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRWcDlFbmMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfVlA5X0VOQ19IX18KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweERlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJhMjM2MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuY3BwCkBAIC0wLDAgKzEsODU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRWcHhEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdFZweERlYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNpZmRlZiBWUDkKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC52cDkuZGVjb2RlciI7CisjZWxzZQorY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLnZwOC5kZWNvZGVyIjsKKyNlbmRpZgorCitjbGFzcyBDMlNvZnRWcHhEZWM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBoZWxwZXIsCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUiwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPLAorI2lmZGVmIFZQOQorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOQorI2Vsc2UKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19WUDgKKyNlbmRpZgorICAgICAgICAgICAgICAgICkgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7IC8vIFRPRE86IGFjY291bnQgZm9yIG91ciBidWZmZXJzIGhlcmUKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKworICAgICAgICAvLyBUT0RPOiBvdXRwdXQgbGF0ZW5jeSBhbmQgcmVvcmRlcmluZworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworI2lmZGVmIFZQOQorICAgICAgICAvLyBUT0RPOiBBZGQgQzJDb25maWc6OlBST0ZJTEVfVlA5XzJIRFIgPz8KKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0KDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfVlA5XzAsIEMyQ29uZmlnOjpMRVZFTF9WUDlfNSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8yfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9WUDlfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVlA5XzFfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVlA5XzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1ZQOV8yXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1ZQOV8zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9WUDlfM18xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9WUDlfNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVlA5XzRfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVlA5XzUsCisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBtSGRyMTBQbHVzSW5mb0lucHV0ID0gQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjppbnB1dDo6QWxsb2NTaGFyZWQoMCk7CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSGRyMTBQbHVzSW5mb0lucHV0LCBDMl9QQVJBTUtFWV9JTlBVVF9IRFIxMF9QTFVTX0lORk8pCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG1IZHIxMFBsdXNJbmZvSW5wdXQpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUhkcjEwUGx1c0luZm9JbnB1dCwgbS52YWx1ZSkuYW55KCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihIZHIxMFBsdXNJbmZvSW5wdXRTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIG1IZHIxMFBsdXNJbmZvT3V0cHV0ID0gQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKDApOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUhkcjEwUGx1c0luZm9PdXRwdXQsIEMyX1BBUkFNS0VZX09VVFBVVF9IRFIxMF9QTFVTX0lORk8pCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG1IZHIxMFBsdXNJbmZvT3V0cHV0KQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1IZHIxMFBsdXNJbmZvT3V0cHV0LCBtLnZhbHVlKS5hbnkoKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKEhkcjEwUGx1c0luZm9PdXRwdXRTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisjaWYgMAorICAgICAgICAvLyBzYW1wbGUgQlQuMjAyMCBzdGF0aWMgaW5mbworICAgICAgICBtSGRyU3RhdGljSW5mbyA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJTdHJlYW1IZHJTdGF0aWNJbmZvOjpvdXRwdXQ+KCk7CisgICAgICAgIG1IZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcgPSB7CisgICAgICAgICAgICAucmVkICAgPSB7IC54ID0gMC43MDgsICAueSA9IDAuMjkyIH0sCisgICAgICAgICAgICAuZ3JlZW4gPSB7IC54ID0gMC4xNzAsICAueSA9IDAuNzk3IH0sCisgICAgICAgICAgICAuYmx1ZSAgPSB7IC54ID0gMC4xMzEsICAueSA9IDAuMDQ2IH0sCisgICAgICAgICAgICAud2hpdGUgPSB7IC54ID0gMC4zMTI3LCAueSA9IDAuMzI5MCB9LAorICAgICAgICAgICAgLm1heEx1bWluYW5jZSA9IDEwMDAsCisgICAgICAgICAgICAubWluTHVtaW5hbmNlID0gMC4xLAorICAgICAgICB9OworICAgICAgICBtSGRyU3RhdGljSW5mby0+bWF4Q2xsID0gMTAwMDsKKyAgICAgICAgbUhkclN0YXRpY0luZm8tPm1heEZhbGwgPSAxMjA7CisKKyAgICAgICAgbUhkclN0YXRpY0luZm8tPm1heEx1bWluYW5jZSA9IDA7IC8vIGRpc2FibGUgc3RhdGljIGluZm8KKworICAgICAgICBoZWxwZXItPmFkZFN0cnVjdERlc2NyaXB0b3JzPEMyTWFzdGVyaW5nRGlzcGxheUNvbG9yVm9sdW1lU3RydWN0LCBDMkNvbG9yWHlTdHJ1Y3Q+KCk7CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSGRyU3RhdGljSW5mbywgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChtSGRyU3RhdGljSW5mbykKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtSGRyU3RhdGljSW5mbywgbWFzdGVyaW5nLnJlZC54KS5pblJhbmdlKDAsIDEpLAorICAgICAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihIZHJTdGF0aWNJbmZvU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyNlbmRpZgorI2Vsc2UKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0KDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfVU5VU0VELCBDMkNvbmZpZzo6TEVWRUxfVU5VU0VEKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisjZW5kaWYKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heFNpemUsIEMyX1BBUkFNS0VZX01BWF9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDIwNDgsIDIpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoTWF4UGljdHVyZVNpemVTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heElucHV0U2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDMyMCAqIDI0MCAqIDMgLyA0KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtTWF4SW5wdXRTaXplLCB2YWx1ZSkuYW55KCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuY2FsY3VsYXRlZEFzKE1heElucHV0U2l6ZVNldHRlciwgbU1heFNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIEMyQ2hyb21hT2Zmc2V0U3RydWN0IGxvY2F0aW9uc1sxXSA9IHsgQzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKSB9OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gZGVmYXVsdENvbG9ySW5mbyA9CisgICAgICAgICAgICBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgICAgICAgICAgMXUsIDB1LCA4dSAvKiBiaXREZXB0aCAqLywgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIG1lbWNweShkZWZhdWx0Q29sb3JJbmZvLT5tLmxvY2F0aW9ucywgbG9jYXRpb25zLCBzaXplb2YobG9jYXRpb25zKSk7CisKKyAgICAgICAgZGVmYXVsdENvbG9ySW5mbyA9CisgICAgICAgICAgICBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgICAgICAgICAgeyBDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpIH0sCisgICAgICAgICAgICAgICAgICAgIDB1LCA4dSAvKiBiaXREZXB0aCAqLywgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIGhlbHBlci0+YWRkU3RydWN0RGVzY3JpcHRvcnM8QzJDaHJvbWFPZmZzZXRTdHJ1Y3Q+KCk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2xvckluZm8sIEMyX1BBUkFNS0VZX0NPREVEX0NPTE9SX0lORk8pCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKGRlZmF1bHRDb2xvckluZm8pCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRGVmYXVsdENvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsICBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKERlZmF1bHRDb2xvckFzcGVjdHNTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgbW9yZSBmb3JtYXRzPworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVBpeGVsRm9ybWF0LCBDMl9QQVJBTUtFWV9QSVhFTF9GT1JNQVQpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZvbGRNZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQPEMyVmlkZW9TaXplU3RyZWFtSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmICghbWUuRihtZS52LndpZHRoKS5zdXBwb3J0c0F0QWxsKG1lLnYud2lkdGgpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS53aWR0aCA9IG9sZE1lLnYud2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LmhlaWdodCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IG9sZE1lLnYuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhQaWN0dXJlU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIFRPRE86IGdldCBtYXggd2lkdGgvaGVpZ2h0IGZyb20gdGhlIHNpemUncyBmaWVsZCBoZWxwZXJzIHZzLiBoYXJkY29kaW5nCisgICAgICAgIG1lLnNldCgpLndpZHRoID0gYzJfbWluKGMyX21heChtZS52LndpZHRoLCBzaXplLnYud2lkdGgpLCAyMDQ4dSk7CisgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IGMyX21pbihjMl9tYXgobWUudi5oZWlnaHQsIHNpemUudi5oZWlnaHQpLCAyMDQ4dSk7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhJbnB1dFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1heFNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIGFzc3VtZSBjb21wcmVzc2lvbiByYXRpbyBvZiAyCisgICAgICAgIG1lLnNldCgpLnZhbHVlID0gKCgobWF4U2l6ZS52LndpZHRoICsgNjMpIC8gNjQpICogKChtYXhTaXplLnYuaGVpZ2h0ICsgNjMpIC8gNjQpICogMzA3Mik7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmIChtZS52LnJhbmdlID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYudHJhbnNmZXIgPiBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUikgeworICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5tYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZClzaXplOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiBnZXREZWZhdWx0Q29sb3JBc3BlY3RzX2woKSB7CisgICAgICAgIHJldHVybiBtRGVmYXVsdENvbG9yQXNwZWN0czsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEhkcjEwUGx1c0luZm9JbnB1dFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1IZHIxMFBsdXNJbmZvOjppbnB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBIZHIxMFBsdXNJbmZvT3V0cHV0U2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUhkcjEwUGx1c0luZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiBtTWF4U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1NYXhJbnB1dFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IG1Db2xvckluZm87CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQ+IG1QaXhlbEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gbURlZmF1bHRDb2xvckFzcGVjdHM7CisjaWZkZWYgVlA5CisjaWYgMAorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUhkclN0YXRpY0luZm86Om91dHB1dD4gbUhkclN0YXRpY0luZm87CisjZW5kaWYKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1IZHIxMFBsdXNJbmZvOjppbnB1dD4gbUhkcjEwUGx1c0luZm9JbnB1dDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ+IG1IZHIxMFBsdXNJbmZvT3V0cHV0OworI2VuZGlmCit9OworCitDMlNvZnRWcHhEZWM6OkMyU29mdFZweERlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtQ29kZWNDdHgobnVsbHB0cikgeworfQorCitDMlNvZnRWcHhEZWM6On5DMlNvZnRWcHhEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZweERlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWcHhEZWM6Om9uU3RvcCgpIHsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0VnB4RGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworICAgIGMyX3N0YXR1c190IGVyciA9IG9uRmx1c2hfc20oKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKQorICAgIHsKKyAgICAgICAgQUxPR1coIkZhaWxlZCB0byBmbHVzaCBkZWNvZGVyLiBUcnkgdG8gaGFyZCByZXNldCBkZWNvZGVyIik7CisgICAgICAgIGRlc3Ryb3lEZWNvZGVyKCk7CisgICAgICAgICh2b2lkKWluaXREZWNvZGVyKCk7CisgICAgfQorfQorCit2b2lkIEMyU29mdFZweERlYzo6b25SZWxlYXNlKCkgeworICAgIGRlc3Ryb3lEZWNvZGVyKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZweERlYzo6b25GbHVzaF9zbSgpIHsKKyAgICBpZiAobUZyYW1lUGFyYWxsZWxNb2RlKSB7CisgICAgICAgIC8vIEZsdXNoIGRlY29kZXIgYnkgcGFzc2luZyBudWxscHRyIGRhdGEgcHRyIGFuZCAwIHNpemUuCisgICAgICAgIC8vIElkZWFsbHksIHRoaXMgc2hvdWxkIG5ldmVyIGZhaWwuCisgICAgICAgIGlmICh2cHhfY29kZWNfZGVjb2RlKG1Db2RlY0N0eCwgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmx1c2ggb24yIGRlY29kZXIuIik7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRHJvcCBhbGwgdGhlIGRlY29kZWQgZnJhbWVzIGluIGRlY29kZXIuCisgICAgdnB4X2NvZGVjX2l0ZXJfdCBpdGVyID0gbnVsbHB0cjsKKyAgICB3aGlsZSAodnB4X2NvZGVjX2dldF9mcmFtZShtQ29kZWNDdHgsICZpdGVyKSkgeworICAgIH0KKworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXRpYyBpbnQgR2V0Q1BVQ29yZUNvdW50KCkgeworICAgIGludCBjcHVDb3JlQ291bnQgPSAxOworI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIC8vIF9TQ19OUFJPQ19PTkxOIG11c3QgYmUgZGVmaW5lZC4uLgorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VuZGlmCisgICAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOworICAgIEFMT0dWKCJOdW1iZXIgb2YgQ1BVIGNvcmVzOiAlZCIsIGNwdUNvcmVDb3VudCk7CisgICAgcmV0dXJuIGNwdUNvcmVDb3VudDsKK30KKworc3RhdHVzX3QgQzJTb2Z0VnB4RGVjOjppbml0RGVjb2RlcigpIHsKKyNpZmRlZiBWUDkKKyAgICBtTW9kZSA9IE1PREVfVlA5OworI2Vsc2UKKyAgICBtTW9kZSA9IE1PREVfVlA4OworI2VuZGlmCisKKyAgICBtV2lkdGggPSAzMjA7CisgICAgbUhlaWdodCA9IDI0MDsKKyAgICBtRnJhbWVQYXJhbGxlbE1vZGUgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisKKyAgICBpZiAoIW1Db2RlY0N0eCkgeworICAgICAgICBtQ29kZWNDdHggPSBuZXcgdnB4X2NvZGVjX2N0eF90OworICAgIH0KKyAgICBpZiAoIW1Db2RlY0N0eCkgeworICAgICAgICBBTE9HRSgibUNvZGVjQ3R4IGlzIG51bGwiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICB2cHhfY29kZWNfZGVjX2NmZ190IGNmZzsKKyAgICBtZW1zZXQoJmNmZywgMCwgc2l6ZW9mKHZweF9jb2RlY19kZWNfY2ZnX3QpKTsKKyAgICBjZmcudGhyZWFkcyA9IEdldENQVUNvcmVDb3VudCgpOworCisgICAgdnB4X2NvZGVjX2ZsYWdzX3QgZmxhZ3M7CisgICAgbWVtc2V0KCZmbGFncywgMCwgc2l6ZW9mKHZweF9jb2RlY19mbGFnc190KSk7CisgICAgaWYgKG1GcmFtZVBhcmFsbGVsTW9kZSkgZmxhZ3MgfD0gVlBYX0NPREVDX1VTRV9GUkFNRV9USFJFQURJTkc7CisKKyAgICB2cHhfY29kZWNfZXJyX3QgdnB4X2VycjsKKyAgICBpZiAoKHZweF9lcnIgPSB2cHhfY29kZWNfZGVjX2luaXQoCisgICAgICAgICAgICAgICAgIG1Db2RlY0N0eCwgbU1vZGUgPT0gTU9ERV9WUDggPyAmdnB4X2NvZGVjX3ZwOF9keF9hbGdvIDogJnZweF9jb2RlY192cDlfZHhfYWxnbywKKyAgICAgICAgICAgICAgICAgJmNmZywgZmxhZ3MpKSkgeworICAgICAgICBBTE9HRSgib24yIGRlY29kZXIgZmFpbGVkIHRvIGluaXRpYWxpemUuICglZCkiLCB2cHhfZXJyKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRWcHhEZWM6OmRlc3Ryb3lEZWNvZGVyKCkgeworICAgIGlmICAobUNvZGVjQ3R4KSB7CisgICAgICAgIHZweF9jb2RlY19kZXN0cm95KG1Db2RlY0N0eCk7CisgICAgICAgIGRlbGV0ZSBtQ29kZWNDdHg7CisgICAgICAgIG1Db2RlY0N0eCA9IG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3ZvaWQgQzJTb2Z0VnB4RGVjOjpmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBjcmVhdGVHcmFwaGljQnVmZmVyKGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlJlY3QobVdpZHRoLCBtSGVpZ2h0KSk7CisgICAgYXV0byBmaWxsV29yayA9IFtidWZmZXIsIGluZGV4LCBpbnRmID0gdGhpcy0+bUludGZdKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBpZiAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgJiYKKyAgICAgICAgICAgICAgICAoYzJfY250cjY0X3QoaW5kZXgpID09IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCkpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnBhcmFtOiB3b3JrLT5pbnB1dC5jb25maWdVcGRhdGUpIHsKKyAgICAgICAgICAgIGlmIChwYXJhbSkgeworICAgICAgICAgICAgICAgIEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6aW5wdXQgKmhkcjEwUGx1c0luZm8gPQorICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjppbnB1dDo6RnJvbShwYXJhbS5nZXQoKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoaGRyMTBQbHVzSW5mbyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IG91dFBhcmFtID0gQzJQYXJhbTo6Q29weUFzU3RyZWFtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwYXJhbS5nZXQoKSwgdHJ1ZSAvKm91dHB1dCovLCBwYXJhbS0+c3RyZWFtKCkpOworICAgICAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBpbnRmLT5jb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBvdXRQYXJhbS5nZXQoKSB9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KCpvdXRQYXJhbS5nZXQoKSkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImZpbmlzaFdvcms6IENvbmZpZyB1cGRhdGUgc2l6ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworICAgIGlmICh3b3JrICYmIGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpIHsKKyAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmluaXNoKGluZGV4LCBmaWxsV29yayk7CisgICAgfQorfQorCit2b2lkIEMyU29mdFZweERlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBjb2RlY0NvbmZpZyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9MCk7CisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkLCBmbGFncyAleCIsCisgICAgICAgICAgaW5TaXplLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSwgd29yay0+aW5wdXQuZmxhZ3MpOworCisgICAgLy8gU29mdHdhcmUgVlA5IERlY29kZXIgZG9lcyBub3QgbmVlZCB0aGUgQ29kZWMgU3BlY2lmaWMgRGF0YSAoQ1NEKQorICAgIC8vIChzcGVjaWZpZWQgaW4gaHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvdnA5L3Byb2ZpbGVzLykuIElnbm9yZSBpdCBpZgorICAgIC8vIGl0IHdhcyBwYXNzZWQuCisgICAgaWYgKGNvZGVjQ29uZmlnKSB7CisgICAgICAgIC8vIElnbm9yZSBDU0QgYnVmZmVyIGZvciBWUDkuCisgICAgICAgIGlmIChtTW9kZSA9PSBNT0RFX1ZQOSkgeworICAgICAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRvbGVyYXRlIHRoZSBDU0QgYnVmZmVyIGZvciBWUDguIFRoaXMgaXMgYSB3b3JrYXJvdW5kCisgICAgICAgICAgICAvLyBmb3IgYi8yODY4OTUzNi4gY29udGludWUKKyAgICAgICAgICAgIEFMT0dXKCJXQVJOSU5HOiBHb3QgQ1NEIGJ1ZmZlciBmb3IgVlA4LiBDb250aW51ZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgaW50NjRfdCBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWtsbCgpOworCisgICAgaWYgKGluU2l6ZSkgeworICAgICAgICB1aW50OF90ICpiaXRzdHJlYW0gPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oclZpZXcuZGF0YSgpICsgaW5PZmZzZXQpOworICAgICAgICB2cHhfY29kZWNfZXJyX3QgZXJyID0gdnB4X2NvZGVjX2RlY29kZSgKKyAgICAgICAgICAgICAgICBtQ29kZWNDdHgsIGJpdHN0cmVhbSwgaW5TaXplLCAmZnJhbWVJbmRleCwgMCk7CisgICAgICAgIGlmIChlcnIgIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgICAgICBBTE9HRSgib24yIGRlY29kZXIgZmFpbGVkIHRvIGRlY29kZSBmcmFtZS4gZXJyOiAlZCIsIGVycik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgICh2b2lkKW91dHB1dEJ1ZmZlcihwb29sLCB3b3JrKTsKKworICAgIGlmIChlb3MpIHsKKyAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsIHBvb2wsIHdvcmspOworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKCFpblNpemUpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlPdXRwdXRCdWZmZXJUb1lWMTJGcmFtZSh1aW50OF90ICpkc3QsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1ksIGNvbnN0IHVpbnQ4X3QgKnNyY1UsIGNvbnN0IHVpbnQ4X3QgKnNyY1YsCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKKyAgICBzaXplX3QgZHN0WVN0cmlkZSA9IGFsaWduKHdpZHRoLCAxNik7CisgICAgc2l6ZV90IGRzdFVWU3RyaWRlID0gYWxpZ24oZHN0WVN0cmlkZSAvIDIsIDE2KTsKKyAgICB1aW50OF90ICpkc3RTdGFydCA9IGRzdDsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0OyArK2kpIHsKKyAgICAgICAgIG1lbWNweShkc3QsIHNyY1ksIHdpZHRoKTsKKyAgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKKyAgICAgICAgIGRzdCArPSBkc3RZU3RyaWRlOworICAgIH0KKworICAgIGRzdCA9IGRzdFN0YXJ0ICsgZHN0WVN0cmlkZSAqIGhlaWdodDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgeworICAgICAgICAgbWVtY3B5KGRzdCwgc3JjViwgd2lkdGggLyAyKTsKKyAgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKKyAgICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICB9CisKKyAgICBkc3QgPSBkc3RTdGFydCArIChkc3RZU3RyaWRlICogaGVpZ2h0KSArIChkc3RVVlN0cmlkZSAqIGhlaWdodCAvIDIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmNVLCB3aWR0aCAvIDIpOworICAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOworICAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKHVpbnQzMl90ICpkc3QsCisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNZLCBjb25zdCB1aW50MTZfdCAqc3JjVSwgY29uc3QgdWludDE2X3QgKnNyY1YsCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCisgICAgICAgIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgeworCisgICAgLy8gQ29udmVydGluZyB0d28gbGluZXMgYXQgYSB0aW1lLCBzbGlnaHRseSBmYXN0ZXIKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgeSArPSAyKSB7CisgICAgICAgIHVpbnQzMl90ICpkc3RUb3AgPSAodWludDMyX3QgKikgZHN0OworICAgICAgICB1aW50MzJfdCAqZHN0Qm90ID0gKHVpbnQzMl90ICopIChkc3QgKyBkc3RTdHJpZGUpOworICAgICAgICB1aW50MTZfdCAqeVNyY1RvcCA9ICh1aW50MTZfdCopIHNyY1k7CisgICAgICAgIHVpbnQxNl90ICp5U3JjQm90ID0gKHVpbnQxNl90KikgKHNyY1kgKyBzcmNZU3RyaWRlKTsKKyAgICAgICAgdWludDE2X3QgKnVTcmMgPSAodWludDE2X3QqKSBzcmNVOworICAgICAgICB1aW50MTZfdCAqdlNyYyA9ICh1aW50MTZfdCopIHNyY1Y7CisKKyAgICAgICAgdWludDMyX3QgdTAxLCB2MDEsIHkwMSwgeTIzLCB5NDUsIHk2NywgdXYwLCB1djE7CisgICAgICAgIHNpemVfdCB4ID0gMDsKKyAgICAgICAgZm9yICg7IHggPCB3aWR0aCAtIDM7IHggKz0gNCkgeworCisgICAgICAgICAgICB1MDEgPSAqKCh1aW50MzJfdCopdVNyYyk7IHVTcmMgKz0gMjsKKyAgICAgICAgICAgIHYwMSA9ICooKHVpbnQzMl90Kil2U3JjKTsgdlNyYyArPSAyOworCisgICAgICAgICAgICB5MDEgPSAqKCh1aW50MzJfdCopeVNyY1RvcCk7IHlTcmNUb3AgKz0gMjsKKyAgICAgICAgICAgIHkyMyA9ICooKHVpbnQzMl90Kil5U3JjVG9wKTsgeVNyY1RvcCArPSAyOworICAgICAgICAgICAgeTQ1ID0gKigodWludDMyX3QqKXlTcmNCb3QpOyB5U3JjQm90ICs9IDI7CisgICAgICAgICAgICB5NjcgPSAqKCh1aW50MzJfdCopeVNyY0JvdCk7IHlTcmNCb3QgKz0gMjsKKworICAgICAgICAgICAgdXYwID0gKHUwMSAmIDB4M0ZGKSB8ICgodjAxICYgMHgzRkYpIDw8IDIwKTsKKyAgICAgICAgICAgIHV2MSA9ICh1MDEgPj4gMTYpIHwgKCh2MDEgPj4gMTYpIDw8IDIwKTsKKworICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTAxICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkwMSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTIzICYgMHgzRkYpIDw8IDEwKSB8IHV2MTsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkyMyA+PiAxNikgPDwgMTApIHwgdXYxOworCisgICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NDUgJiAweDNGRikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTQ1ID4+IDE2KSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NjcgJiAweDNGRikgPDwgMTApIHwgdXYxOworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTY3ID4+IDE2KSA8PCAxMCkgfCB1djE7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGVyZSBzaG91bGQgYmUgYXQgbW9zdCAyIG1vcmUgcGl4ZWxzIHRvIHByb2Nlc3MuIE5vdGUgdGhhdCB3ZSBkb24ndAorICAgICAgICAvLyBuZWVkIHRvIGNvbnNpZGVyIG9kZCBjYXNlIGFzIHRoZSBidWZmZXIgaXMgYWx3YXlzIGFsaWduZWQgdG8gZXZlbi4KKyAgICAgICAgaWYgKHggPCB3aWR0aCkgeworICAgICAgICAgICAgdTAxID0gKnVTcmM7CisgICAgICAgICAgICB2MDEgPSAqdlNyYzsKKyAgICAgICAgICAgIHkwMSA9ICooKHVpbnQzMl90Kil5U3JjVG9wKTsKKyAgICAgICAgICAgIHk0NSA9ICooKHVpbnQzMl90Kil5U3JjQm90KTsKKyAgICAgICAgICAgIHV2MCA9ICh1MDEgJiAweDNGRikgfCAoKHYwMSAmIDB4M0ZGKSA8PCAyMCk7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAoKHkwMSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAoKHkwMSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gKCh5NDUgJiAweDNGRikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gKCh5NDUgPj4gMTYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgfQorCisgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZSAqIDI7CisgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKKyAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOworICAgICAgICBkc3QgKz0gZHN0U3RyaWRlICogMjsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1ksIGNvbnN0IHVpbnQxNl90ICpzcmNVLCBjb25zdCB1aW50MTZfdCAqc3JjViwKKyAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKKyAgICAgICAgc2l6ZV90IGRzdFN0cmlkZSwgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KSB7CisKKyAgICB1aW50OF90ICpkc3RZID0gKHVpbnQ4X3QgKilkc3Q7CisgICAgc2l6ZV90IGRzdFlTaXplID0gZHN0U3RyaWRlICogaGVpZ2h0OworICAgIHNpemVfdCBkc3RVVlN0cmlkZSA9IGFsaWduKGRzdFN0cmlkZSAvIDIsIDE2KTsKKyAgICBzaXplX3QgZHN0VVZTaXplID0gZHN0VVZTdHJpZGUgKiBoZWlnaHQgLyAyOworICAgIHVpbnQ4X3QgKmRzdFYgPSBkc3RZICsgZHN0WVNpemU7CisgICAgdWludDhfdCAqZHN0VSA9IGRzdFYgKyBkc3RVVlNpemU7CisKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeworICAgICAgICAgICAgZHN0WVt4XSA9ICh1aW50OF90KShzcmNZW3hdID4+IDIpOworICAgICAgICB9CisKKyAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlOworICAgICAgICBkc3RZICs9IGRzdFN0cmlkZTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IChoZWlnaHQgKyAxKSAvIDI7ICsreSkgeworICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8ICh3aWR0aCArIDEpIC8gMjsgKyt4KSB7CisgICAgICAgICAgICBkc3RVW3hdID0gKHVpbnQ4X3QpKHNyY1VbeF0gPj4gMik7CisgICAgICAgICAgICBkc3RWW3hdID0gKHVpbnQ4X3QpKHNyY1ZbeF0gPj4gMik7CisgICAgICAgIH0KKworICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGU7CisgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKKyAgICAgICAgZHN0VSArPSBkc3RVVlN0cmlkZTsKKyAgICAgICAgZHN0ViArPSBkc3RVVlN0cmlkZTsKKyAgICB9CisgICAgcmV0dXJuOworfQorYm9vbCBDMlNvZnRWcHhEZWM6Om91dHB1dEJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspCit7CisgICAgaWYgKCEod29yayAmJiBwb29sKSkgcmV0dXJuIGZhbHNlOworCisgICAgdnB4X2NvZGVjX2l0ZXJfdCBpdGVyID0gbnVsbHB0cjsKKyAgICB2cHhfaW1hZ2VfdCAqaW1nID0gdnB4X2NvZGVjX2dldF9mcmFtZShtQ29kZWNDdHgsICZpdGVyKTsKKworICAgIGlmICghaW1nKSByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoaW1nLT5kX3cgIT0gbVdpZHRoIHx8IGltZy0+ZF9oICE9IG1IZWlnaHQpIHsKKyAgICAgICAgbVdpZHRoID0gaW1nLT5kX3c7CisgICAgICAgIG1IZWlnaHQgPSBpbWctPmRfaDsKKworICAgICAgICBDMlZpZGVvU2l6ZVN0cmVhbUluZm86Om91dHB1dCBzaXplKDB1LCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbnRmLT5jb25maWcoeyZzaXplfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KHNpemUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb25maWcgdXBkYXRlIHNpemUgZmFpbGVkIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgfQorICAgIENIRUNLKGltZy0+Zm10ID09IFZQWF9JTUdfRk1UX0k0MjAgfHwgaW1nLT5mbXQgPT0gVlBYX0lNR19GTVRfSTQyMDE2KTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2s7CisgICAgdWludDMyX3QgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOworICAgIGlmIChpbWctPmZtdCA9PSBWUFhfSU1HX0ZNVF9JNDIwMTYpIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiBkZWZhdWx0Q29sb3JBc3BlY3RzID0gbUludGYtPmdldERlZmF1bHRDb2xvckFzcGVjdHNfbCgpOworCisgICAgICAgIGlmIChkZWZhdWx0Q29sb3JBc3BlY3RzLT5wcmltYXJpZXMgPT0gQzJDb2xvcjo6UFJJTUFSSUVTX0JUMjAyMCAmJgorICAgICAgICAgICAgZGVmYXVsdENvbG9yQXNwZWN0cy0+bWF0cml4ID09IEMyQ29sb3I6Ok1BVFJJWF9CVDIwMjAgJiYKKyAgICAgICAgICAgIGRlZmF1bHRDb2xvckFzcGVjdHMtPnRyYW5zZmVyID09IEMyQ29sb3I6OlRSQU5TRkVSX1NUMjA4NCkgeworICAgICAgICAgICAgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDI7CisgICAgICAgIH0KKyAgICB9CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKGFsaWduKG1XaWR0aCwgMTYpLCBtSGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoR3JhcGhpY0Jsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gZXJyOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQzJHcmFwaGljVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQUxPR1YoInByb3ZpZGVkICglZHglZCkgcmVxdWlyZWQgKCVkeCVkKSwgb3V0IGZyYW1laW5kZXggJWQiLAorICAgICAgICAgICBibG9jay0+d2lkdGgoKSwgYmxvY2stPmhlaWdodCgpLCBtV2lkdGgsIG1IZWlnaHQsIChpbnQpKihpbnQ2NF90ICopaW1nLT51c2VyX3ByaXYpOworCisgICAgdWludDhfdCAqZHN0ID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV0pOworICAgIHNpemVfdCBzcmNZU3RyaWRlID0gaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1ldOworICAgIHNpemVfdCBzcmNVU3RyaWRlID0gaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1VdOworICAgIHNpemVfdCBzcmNWU3RyaWRlID0gaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1ZdOworCisgICAgaWYgKGltZy0+Zm10ID09IFZQWF9JTUdfRk1UX0k0MjAxNikgeworICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjWSA9IChjb25zdCB1aW50MTZfdCAqKWltZy0+cGxhbmVzW1ZQWF9QTEFORV9ZXTsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1UgPSAoY29uc3QgdWludDE2X3QgKilpbWctPnBsYW5lc1tWUFhfUExBTkVfVV07CisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNWID0gKGNvbnN0IHVpbnQxNl90ICopaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1ZdOworCisgICAgICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDIpIHsKKyAgICAgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxMCgodWludDMyX3QgKilkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24obVdpZHRoLCAxNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIoZHN0LCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduKG1XaWR0aCwgMTYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1kgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW1ZQWF9QTEFORV9ZXTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjVSA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1VdOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNWID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tWUFhfUExBTkVfVl07CisgICAgICAgIGNvcHlPdXRwdXRCdWZmZXJUb1lWMTJGcmFtZShkc3QsIHNyY1ksIHNyY1UsIHNyY1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1lTdHJpZGUsIHNyY1VTdHJpZGUsIHNyY1ZTdHJpZGUsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgfQorICAgIGZpbmlzaFdvcmsoKihpbnQ2NF90ICopaW1nLT51c2VyX3ByaXYsIHdvcmssIHN0ZDo6bW92ZShibG9jaykpOworICAgIHJldHVybiB0cnVlOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWcHhEZWM6OmRyYWluSW50ZXJuYWwoCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgd2hpbGUgKChvdXRwdXRCdWZmZXIocG9vbCwgd29yaykpKSB7CisgICAgfQorCisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MgJiYKKyAgICAgICAgICAgIHdvcmsgJiYgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPT0gMHUpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CitjMl9zdGF0dXNfdCBDMlNvZnRWcHhEZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICByZXR1cm4gZHJhaW5JbnRlcm5hbChkcmFpbk1vZGUsIHBvb2wsIG51bGxwdHIpOworfQorCitjbGFzcyBDMlNvZnRWcHhGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0VnB4RmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgIG5ldyBDMlNvZnRWcHhEZWMoQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFZweERlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0VnB4RGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0VnB4RGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRWcHhGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRWcHhGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGM4NDg0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweERlYy5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9WUFhfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9WUFhfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKKyNpbmNsdWRlICJ2cHgvdnB4X2RlY29kZXIuaCIKKyNpbmNsdWRlICJ2cHgvdnA4ZHguaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0VnB4RGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdFZweERlYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRWcHhEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAgTU9ERV9WUDgsCisgICAgICAgIE1PREVfVlA5LAorICAgIH0gbU1vZGU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIHZweF9jb2RlY19jdHhfdCAqbUNvZGVjQ3R4OworICAgIGJvb2wgbUZyYW1lUGFyYWxsZWxNb2RlOyAgLy8gRnJhbWUgcGFyYWxsZWwgaXMgb25seSBzdXBwb3J0ZWQgYnkgVlA5IGRlY29kZXIuCisKKyAgICB1aW50MzJfdCBtV2lkdGg7CisgICAgdWludDMyX3QgbUhlaWdodDsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworICAgIHN0YXR1c190IGRlc3Ryb3lEZWNvZGVyKCk7CisgICAgdm9pZCBmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2spOworICAgIGJvb2wgb3V0cHV0QnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbkludGVybmFsKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdFZweERlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9WUFhfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhFbmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NWE4NGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmNwcApAQCAtMCwwICsxLDY3MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRWcHhFbmMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KKworI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CisKKyNpbmNsdWRlIDxDb2RlYzJCdWZmZXJVdGlscy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlICJDMlNvZnRWcHhFbmMuaCIKKworI2lmbmRlZiBJTlQzMl9NQVgKKyNkZWZpbmUgSU5UMzJfTUFYICAgMjE0NzQ4MzY0NworI2VuZGlmCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2lmIDAKK3N0YXRpYyBzaXplX3QgZ2V0Q3B1Q29yZUNvdW50KCkgeworICAgIGxvbmcgY3B1Q29yZUNvdW50ID0gMTsKKyNpZiBkZWZpbmVkKF9TQ19OUFJPQ0VTU09SU19PTkxOKQorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworI2Vsc2UKKyAgICAvLyBfU0NfTlBST0NfT05MTiBtdXN0IGJlIGRlZmluZWQuLi4KKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ19PTkxOKTsKKyNlbmRpZgorICAgIENIRUNLKGNwdUNvcmVDb3VudCA+PSAxKTsKKyAgICBBTE9HVigiTnVtYmVyIG9mIENQVSBjb3JlczogJWxkIiwgY3B1Q29yZUNvdW50KTsKKyAgICByZXR1cm4gKHNpemVfdCljcHVDb3JlQ291bnQ7Cit9CisjZW5kaWYKKworQzJTb2Z0VnB4RW5jOjpDMlNvZnRWcHhFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudCgKKyAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUNvZGVjQ29udGV4dChudWxscHRyKSwKKyAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24obnVsbHB0ciksCisgICAgICBtQ29kZWNJbnRlcmZhY2UobnVsbHB0ciksCisgICAgICBtU3RyaWRlQWxpZ24oMiksCisgICAgICBtQ29sb3JGb3JtYXQoVlBYX0lNR19GTVRfSTQyMCksCisgICAgICBtQml0cmF0ZUNvbnRyb2xNb2RlKFZQWF9WQlIpLAorICAgICAgbUVycm9yUmVzaWxpZW5jZShmYWxzZSksCisgICAgICBtTWluUXVhbnRpemVyKDApLAorICAgICAgbU1heFF1YW50aXplcigwKSwKKyAgICAgIG1UZW1wb3JhbExheWVycygwKSwKKyAgICAgIG1UZW1wb3JhbFBhdHRlcm5UeXBlKFZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuTm9uZSksCisgICAgICBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoKDApLAorICAgICAgbVRlbXBvcmFsUGF0dGVybklkeCgwKSwKKyAgICAgIG1MYXN0VGltZXN0YW1wKDB4N0ZGRkZGRkZGRkZGRkZGRnVsbCksCisgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zKGZhbHNlKSwKKyAgICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSkgeworICAgIG1lbXNldChtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpbywgMCwgc2l6ZW9mKG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvKSk7CisgICAgbVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9bMF0gPSAxMDA7Cit9CisKK0MyU29mdFZweEVuYzo6fkMyU29mdFZweEVuYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0VnB4RW5jOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdEVuY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7Cit9CisKK3ZvaWQgQzJTb2Z0VnB4RW5jOjpvblJlbGVhc2UoKSB7CisgICAgaWYgKG1Db2RlY0NvbnRleHQpIHsKKyAgICAgICAgdnB4X2NvZGVjX2Rlc3Ryb3kobUNvZGVjQ29udGV4dCk7CisgICAgICAgIGRlbGV0ZSBtQ29kZWNDb250ZXh0OworICAgICAgICBtQ29kZWNDb250ZXh0ID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBpZiAobUNvZGVjQ29uZmlndXJhdGlvbikgeworICAgICAgICBkZWxldGUgbUNvZGVjQ29uZmlndXJhdGlvbjsKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbiA9IG51bGxwdHI7CisgICAgfQorCisgICAgLy8gdGhpcyBvbmUgaXMgbm90IGFsbG9jYXRlZCBieSB1cworICAgIG1Db2RlY0ludGVyZmFjZSA9IG51bGxwdHI7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZweEVuYzo6b25TdG9wKCkgeworICAgIG9uUmVsZWFzZSgpOworICAgIG1MYXN0VGltZXN0YW1wID0gMHg3RkZGRkZGRkZGRkZGRkZGTEw7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRWcHhFbmM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZweEVuYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKK3N0YXR1c190IEMyU29mdFZweEVuYzo6aW5pdEVuY29kZXIoKSB7CisgICAgdnB4X2NvZGVjX2Vycl90IGNvZGVjX3JldHVybjsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBVTktOT1dOX0VSUk9SOworICAgIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIG1TaXplID0gbUludGYtPmdldFNpemVfbCgpOworICAgICAgICBtQml0cmF0ZSA9IG1JbnRmLT5nZXRCaXRyYXRlX2woKTsKKyAgICAgICAgbUJpdHJhdGVNb2RlID0gbUludGYtPmdldEJpdHJhdGVNb2RlX2woKTsKKyAgICAgICAgbUZyYW1lUmF0ZSA9IG1JbnRmLT5nZXRGcmFtZVJhdGVfbCgpOworICAgICAgICBtSW50cmFSZWZyZXNoID0gbUludGYtPmdldEludHJhUmVmcmVzaF9sKCk7CisgICAgICAgIG1SZXF1ZXN0U3luYyA9IG1JbnRmLT5nZXRSZXF1ZXN0U3luY19sKCk7CisgICAgICAgIG1UZW1wb3JhbExheWVycyA9IG1JbnRmLT5nZXRUZW1wb3JhbExheWVyc19sKCktPm0ubGF5ZXJDb3VudDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1CaXRyYXRlTW9kZS0+dmFsdWUpIHsKKyAgICAgICAgY2FzZSBDMkNvbmZpZzo6QklUUkFURV9WQVJJQUJMRToKKyAgICAgICAgICAgIG1CaXRyYXRlQ29udHJvbE1vZGUgPSBWUFhfVkJSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb25maWc6OkJJVFJBVEVfQ09OU1Q6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBtQml0cmF0ZUNvbnRyb2xNb2RlID0gVlBYX0NCUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzZXRDb2RlY1NwZWNpZmljSW50ZXJmYWNlKCk7CisgICAgaWYgKCFtQ29kZWNJbnRlcmZhY2UpIGdvdG8gQ2xlYW5VcDsKKworICAgIEFMT0dEKCJWUHg6IGluaXRFbmNvZGVyLiBCUk1vZGU6ICV1LiBUU0xheWVyczogJXp1LiBLRjogJXUuIFFQOiAldSAtICV1IiwKKyAgICAgICAgICAodWludDMyX3QpbUJpdHJhdGVDb250cm9sTW9kZSwgbVRlbXBvcmFsTGF5ZXJzLCBtSW50Zi0+Z2V0U3luY0ZyYW1lUGVyaW9kKCksCisgICAgICAgICAgbU1pblF1YW50aXplciwgbU1heFF1YW50aXplcik7CisKKyAgICBtQ29kZWNDb25maWd1cmF0aW9uID0gbmV3IHZweF9jb2RlY19lbmNfY2ZnX3Q7CisgICAgaWYgKCFtQ29kZWNDb25maWd1cmF0aW9uKSBnb3RvIENsZWFuVXA7CisgICAgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2VuY19jb25maWdfZGVmYXVsdChtQ29kZWNJbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgaWYgKGNvZGVjX3JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIHBvcHVsYXRpbmcgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciB2cHggZW5jb2Rlci4iKTsKKyAgICAgICAgZ290byBDbGVhblVwOworICAgIH0KKworICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfdyA9IG1TaXplLT53aWR0aDsKKyAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX2ggPSBtU2l6ZS0+aGVpZ2h0OworICAgIC8vbUNvZGVjQ29uZmlndXJhdGlvbi0+Z190aHJlYWRzID0gZ2V0Q3B1Q29yZUNvdW50KCk7CisgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z190aHJlYWRzID0gMDsKKyAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX2Vycm9yX3Jlc2lsaWVudCA9IG1FcnJvclJlc2lsaWVuY2U7CisKKyAgICAvLyB0aW1lYmFzZSB1bml0IGlzIG1pY3Jvc2Vjb25kCisgICAgLy8gZ190aW1lYmFzZSBpcyBpbiBzZWNvbmRzIChpLmUuIDEvMTAwMDAwMCBzZWNvbmRzKQorICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfdGltZWJhc2UubnVtID0gMTsKKyAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3RpbWViYXNlLmRlbiA9IDEwMDAwMDA7CisgICAgLy8gcmNfdGFyZ2V0X2JpdHJhdGUgaXMgaW4ga2JwcywgbUJpdHJhdGUgaW4gYnBzCisgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfdGFyZ2V0X2JpdHJhdGUgPSAobUJpdHJhdGUtPnZhbHVlICsgNTAwKSAvIDEwMDA7CisgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfZW5kX3VzYWdlID0gbUJpdHJhdGVDb250cm9sTW9kZTsKKyAgICAvLyBEaXNhYmxlIGZyYW1lIGRyb3AgLSBub3QgYWxsb3dlZCBpbiBNZWRpYUNvZGVjIG5vdy4KKyAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19kcm9wZnJhbWVfdGhyZXNoID0gMDsKKyAgICAvLyBEaXNhYmxlIGxhZ2dlZCBlbmNvZGluZy4KKyAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX2xhZ19pbl9mcmFtZXMgPSAwOworICAgIGlmIChtQml0cmF0ZUNvbnRyb2xNb2RlID09IFZQWF9DQlIpIHsKKyAgICAgICAgLy8gRGlzYWJsZSBzcGF0aWFsIHJlc2l6aW5nLgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19yZXNpemVfYWxsb3dlZCA9IDA7CisgICAgICAgIC8vIFNpbmdsZS1wYXNzIG1vZGUuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcGFzcyA9IFZQWF9SQ19PTkVfUEFTUzsKKyAgICAgICAgLy8gTWF4aW11bSBhbW91bnQgb2YgYml0cyB0aGF0IGNhbiBiZSBzdWJ0cmFjdGVkIGZyb20gdGhlIHRhcmdldAorICAgICAgICAvLyBiaXRyYXRlIC0gZXhwcmVzc2VkIGFzIHBlcmNlbnRhZ2Ugb2YgdGhlIHRhcmdldCBiaXRyYXRlLgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY191bmRlcnNob290X3BjdCA9IDEwMDsKKyAgICAgICAgLy8gTWF4aW11bSBhbW91bnQgb2YgYml0cyB0aGF0IGNhbiBiZSBhZGRlZCB0byB0aGUgdGFyZ2V0CisgICAgICAgIC8vIGJpdHJhdGUgLSBleHByZXNzZWQgYXMgcGVyY2VudGFnZSBvZiB0aGUgdGFyZ2V0IGJpdHJhdGUuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX292ZXJzaG9vdF9wY3QgPSAxNTsKKyAgICAgICAgLy8gSW5pdGlhbCB2YWx1ZSBvZiB0aGUgYnVmZmVyIGxldmVsIGluIG1zLgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19idWZfaW5pdGlhbF9zeiA9IDUwMDsKKyAgICAgICAgLy8gQW1vdW50IG9mIGRhdGEgdGhhdCB0aGUgZW5jb2RlciBzaG91bGQgdHJ5IHRvIG1haW50YWluIGluIG1zLgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19idWZfb3B0aW1hbF9zeiA9IDYwMDsKKyAgICAgICAgLy8gVGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgbWF5IGJlIGJ1ZmZlcmVkIGJ5IHRoZSBkZWNvZGluZworICAgICAgICAvLyBhcHBsaWNhdGlvbiBpbiBtcy4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfYnVmX3N6ID0gMTAwMDsKKyAgICAgICAgLy8gRW5hYmxlIGVycm9yIHJlc2lsaWVuY2UgLSBuZWVkZWQgZm9yIHBhY2tldCBsb3NzLgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX2Vycm9yX3Jlc2lsaWVudCA9IDE7CisgICAgICAgIC8vIE1heGltdW0ga2V5IGZyYW1lIGludGVydmFsIC0gZm9yIENCUiBib29zdCB0byAzMDAwCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmtmX21heF9kaXN0ID0gMzAwMDsKKyAgICAgICAgLy8gRW5jb2RlciBkZXRlcm1pbmVzIG9wdGltYWwga2V5IGZyYW1lIHBsYWNlbWVudCBhdXRvbWF0aWNhbGx5LgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5rZl9tb2RlID0gVlBYX0tGX0FVVE87CisgICAgfQorCisgICAgLy8gRnJhbWVzIHRlbXBvcmFsIHBhdHRlcm4gLSBmb3Igbm93IFdlYlJUQyBsaWtlIHBhdHRlcm4gaXMgb25seSBzdXBwb3J0ZWQuCisgICAgc3dpdGNoIChtVGVtcG9yYWxMYXllcnMpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybkxlbmd0aCA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbnVtYmVyX2xheWVycyA9IDE7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19yYXRlX2RlY2ltYXRvclswXSA9IDE7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19wZXJpb2RpY2l0eSA9IDE7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19sYXllcl9pZFswXSA9IDA7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzBdID0ga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsbDsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5MZW5ndGggPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX251bWJlcl9sYXllcnMgPSAyOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcmF0ZV9kZWNpbWF0b3JbMF0gPSAyOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcmF0ZV9kZWNpbWF0b3JbMV0gPSAxOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcGVyaW9kaWNpdHkgPSAyOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbGF5ZXJfaWRbMF0gPSAwOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbGF5ZXJfaWRbMV0gPSAxOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblswXSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RBbmRHb2xkZW5SZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzFdID0ga1RlbXBvcmFsVXBkYXRlR29sZGVuV2l0aG91dERlcGVuZGVuY3lSZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzJdID0ga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bM10gPSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5SZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzRdID0ga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bNV0gPSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5SZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzZdID0ga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bN10gPSBrVGVtcG9yYWxVcGRhdGVOb25lOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybkxlbmd0aCA9IDg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbnVtYmVyX2xheWVycyA9IDM7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19yYXRlX2RlY2ltYXRvclswXSA9IDQ7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19yYXRlX2RlY2ltYXRvclsxXSA9IDI7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19yYXRlX2RlY2ltYXRvclsyXSA9IDE7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19wZXJpb2RpY2l0eSA9IDQ7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19sYXllcl9pZFswXSA9IDA7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19sYXllcl9pZFsxXSA9IDI7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19sYXllcl9pZFsyXSA9IDE7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19sYXllcl9pZFszXSA9IDI7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzBdID0ga1RlbXBvcmFsVXBkYXRlTGFzdEFuZEdvbGRlblJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMV0gPSBrVGVtcG9yYWxVcGRhdGVOb25lTm9SZWZHb2xkZW5SZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzJdID0ga1RlbXBvcmFsVXBkYXRlR29sZGVuV2l0aG91dERlcGVuZGVuY3lSZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzNdID0ga1RlbXBvcmFsVXBkYXRlTm9uZTsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bNF0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls1XSA9IGtUZW1wb3JhbFVwZGF0ZU5vbmU7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzZdID0ga1RlbXBvcmFsVXBkYXRlR29sZGVuUmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls3XSA9IGtUZW1wb3JhbFVwZGF0ZU5vbmU7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoID0gODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIldyb25nIG51bWJlciBvZiB0ZW1wb3JhbCBsYXllcnMgJXp1IiwgbVRlbXBvcmFsTGF5ZXJzKTsKKyAgICAgICAgICAgIGdvdG8gQ2xlYW5VcDsKKyAgICB9CisgICAgLy8gU2V0IGJpdHJhdGUgdmFsdWVzIGZvciBlYWNoIGxheWVyCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29kZWNDb25maWd1cmF0aW9uLT50c19udW1iZXJfbGF5ZXJzOyBpKyspIHsKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfdGFyZ2V0X2JpdHJhdGVbaV0gPQorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfdGFyZ2V0X2JpdHJhdGUgKgorICAgICAgICAgICAgbVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9baV0gLyAxMDA7CisgICAgfQorICAgIGlmIChtSW50Zi0+Z2V0U3luY0ZyYW1lUGVyaW9kKCkgPj0gMCkgeworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5rZl9tYXhfZGlzdCA9IG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2QoKTsKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+a2ZfbWluX2Rpc3QgPSBtSW50Zi0+Z2V0U3luY0ZyYW1lUGVyaW9kKCk7CisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmtmX21vZGUgPSBWUFhfS0ZfQVVUTzsKKyAgICB9CisgICAgaWYgKG1NaW5RdWFudGl6ZXIgPiAwKSB7CisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX21pbl9xdWFudGl6ZXIgPSBtTWluUXVhbnRpemVyOworICAgIH0KKyAgICBpZiAobU1heFF1YW50aXplciA+IDApIHsKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfbWF4X3F1YW50aXplciA9IG1NYXhRdWFudGl6ZXI7CisgICAgfQorICAgIHNldENvZGVjU3BlY2lmaWNDb25maWd1cmF0aW9uKCk7CisgICAgbUNvZGVjQ29udGV4dCA9IG5ldyB2cHhfY29kZWNfY3R4X3Q7CisgICAgaWYgKCFtQ29kZWNDb250ZXh0KSBnb3RvIENsZWFuVXA7CisgICAgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2VuY19pbml0KG1Db2RlY0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlY0ludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7ICAvLyBmbGFncworICAgIGlmIChjb2RlY19yZXR1cm4gIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBpbml0aWFsaXppbmcgdnB4IGVuY29kZXIiKTsKKyAgICAgICAgZ290byBDbGVhblVwOworICAgIH0KKworICAgIC8vIEV4dHJhIENCUiBzZXR0aW5ncworICAgIGlmIChtQml0cmF0ZUNvbnRyb2xNb2RlID09IFZQWF9DQlIpIHsKKyAgICAgICAgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2NvbnRyb2wobUNvZGVjQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4RV9TRVRfU1RBVElDX1RIUkVTSE9MRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgICAgIGlmIChjb2RlY19yZXR1cm4gPT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgICAgICB1aW50MzJfdCByY19tYXhfaW50cmFfdGFyZ2V0ID0KKyAgICAgICAgICAgICAgICAodWludDMyX3QpKG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX2J1Zl9vcHRpbWFsX3N6ICogbUZyYW1lUmF0ZS0+dmFsdWUgLyAyMCArIDAuNSk7CisgICAgICAgICAgICAvLyBEb24ndCBnbyBiZWxvdyAzIHRpbWVzIHBlciBmcmFtZSBiYW5kd2lkdGguCisgICAgICAgICAgICBpZiAocmNfbWF4X2ludHJhX3RhcmdldCA8IDMwMCkgeworICAgICAgICAgICAgICAgIHJjX21heF9pbnRyYV90YXJnZXQgPSAzMDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb2RlY19yZXR1cm4gPSB2cHhfY29kZWNfY29udHJvbChtQ29kZWNDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4RV9TRVRfTUFYX0lOVFJBX0JJVFJBVEVfUENULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNfbWF4X2ludHJhX3RhcmdldCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvZGVjX3JldHVybiA9PSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgICAgIGNvZGVjX3JldHVybiA9IHZweF9jb2RlY19jb250cm9sKG1Db2RlY0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhFX1NFVF9DUFVVU0VELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTgpOworICAgICAgICB9CisgICAgICAgIGlmIChjb2RlY19yZXR1cm4gIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiRXJyb3Igc2V0dGluZyBjYnIgcGFyYW1ldGVycyBmb3IgdnB4IGVuY29kZXIuIik7CisgICAgICAgICAgICBnb3RvIENsZWFuVXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb2RlY19yZXR1cm4gPSBzZXRDb2RlY1NwZWNpZmljQ29udHJvbHMoKTsKKyAgICBpZiAoY29kZWNfcmV0dXJuICE9IFZQWF9DT0RFQ19PSykgZ290byBDbGVhblVwOworCisgICAgeworICAgICAgICB1aW50MzJfdCB3aWR0aCA9IG1TaXplLT53aWR0aDsKKyAgICAgICAgdWludDMyX3QgaGVpZ2h0ID0gbVNpemUtPmhlaWdodDsKKyAgICAgICAgaWYgKCgodWludDY0X3Qpd2lkdGggKiBoZWlnaHQpID4KKyAgICAgICAgICAgICgodWludDY0X3QpSU5UMzJfTUFYIC8gMykpIHsKKyAgICAgICAgICAgIEFMT0dFKCJiLzI1ODEyNzk0LCBCdWZmZXIgc2l6ZSBpcyB0b28gYmlnLCB3aWR0aD0ldSwgaGVpZ2h0PSV1LiIsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdWludDMyX3Qgc3RyaWRlID0gKHdpZHRoICsgbVN0cmlkZUFsaWduIC0gMSkgJiB+KG1TdHJpZGVBbGlnbiAtIDEpOworICAgICAgICAgICAgdWludDMyX3QgdnN0cmlkZSA9IChoZWlnaHQgKyBtU3RyaWRlQWxpZ24gLSAxKSAmIH4obVN0cmlkZUFsaWduIC0gMSk7CisgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlciA9IE1lbW9yeUJsb2NrOjpBbGxvY2F0ZShzdHJpZGUgKiB2c3RyaWRlICogMyAvIDIpOworICAgICAgICAgICAgaWYgKCFtQ29udmVyc2lvbkJ1ZmZlci5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQWxsb2NhdGluZyBjb252ZXJzaW9uIGJ1ZmZlciBmYWlsZWQuIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1OdW1JbnB1dEZyYW1lcyA9IC0xOworICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworQ2xlYW5VcDoKKyAgICBvblJlbGVhc2UoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2cHhfZW5jX2ZyYW1lX2ZsYWdzX3QgQzJTb2Z0VnB4RW5jOjpnZXRFbmNvZGVGbGFncygpIHsKKyAgICB2cHhfZW5jX2ZyYW1lX2ZsYWdzX3QgZmxhZ3MgPSAwOworICAgIGlmIChtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoID4gMCkgeworICAgICAgaW50IHBhdHRlcm5JZHggPSBtVGVtcG9yYWxQYXR0ZXJuSWR4ICUgbVRlbXBvcmFsUGF0dGVybkxlbmd0aDsKKyAgICAgIG1UZW1wb3JhbFBhdHRlcm5JZHgrKzsKKyAgICAgIHN3aXRjaCAobVRlbXBvcmFsUGF0dGVybltwYXR0ZXJuSWR4XSkgeworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTGFzdDoKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9HRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfQVJGOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbldpdGhvdXREZXBlbmRlbmN5OgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVHb2xkZW46CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfQVJGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9MQVNUOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUFsdHJlZldpdGhvdXREZXBlbmRlbmN5OgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0FSRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9HRjsKKyAgICAgICAgICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlQWx0cmVmOgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0xBU1Q7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTm9uZU5vUmVmQWx0cmVmOgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0FSRjsKKyAgICAgICAgICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTm9uZToKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9HRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9FTlRST1BZOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkdvbGRlblJlZkFsdFJlZjoKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9HRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9HRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9FTlRST1BZOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbldpdGhvdXREZXBlbmRlbmN5UmVmQWx0UmVmOgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9MQVNUOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWY6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfR0Y7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUdvbGRlblJlZkFsdFJlZjoKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVMYXN0QW5kR29sZGVuUmVmQWx0UmVmOgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9HRjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWxsOgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9HRjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmbGFnczsKK30KKworLy8gVE9ETzogYWRkIHN1cHBvcnQgZm9yIFlVViBpbnB1dCBjb2xvciBmb3JtYXRzCisvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3IgU1ZDLCBBUkYuIFNWQyBhbmQgQVJGIHJldHVybnMgbXVsdGlwbGUgZnJhbWVzCisvLyAoaGllcmFyY2hpY2FsIC8gbm9zaG93KSBpbiBvbmUgY2FsbC4gVGhlc2UgZnJhbWVzIHNob3VsZCBiZSBjb21iaW5lZCBpbiB0bworLy8gYSBzaW5nbGUgYnVmZmVyIGFuZCBzZW50IGJhY2sgdG8gdGhlIGNsaWVudAordm9pZCBDMlNvZnRWcHhFbmM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIEluaXRpYWxpemUgZW5jb2RlciBpZiBub3QgYWxyZWFkeQorICAgIGlmICghbUNvZGVjQ29udGV4dCAmJiBPSyAhPSBpbml0RW5jb2RlcigpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBlbmNvZGVyIik7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkdyYXBoaWNWaWV3PiByVmlldzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGlucHV0QnVmZmVyOworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIGlucHV0QnVmZmVyID0gd29yay0+aW5wdXQuYnVmZmVyc1swXTsKKyAgICAgICAgclZpZXcgPSBzdGQ6Om1ha2Vfc2hhcmVkPGNvbnN0IEMyR3JhcGhpY1ZpZXc+KAorICAgICAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpKTsKKyAgICAgICAgaWYgKHJWaWV3LT5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBlcnIgPSAlZCIsIHJWaWV3LT5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJFbXB0eSBpbnB1dCBCdWZmZXIiKTsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICB9CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayBpbkJ1ZmZlciA9CisgICAgICAgIGlucHV0QnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLmZyb250KCk7CisgICAgaWYgKGluQnVmZmVyLndpZHRoKCkgIT0gbVNpemUtPndpZHRoIHx8CisgICAgICAgIGluQnVmZmVyLmhlaWdodCgpICE9IG1TaXplLT5oZWlnaHQpIHsKKyAgICAgICAgQUxPR0UoInVuZXhwZWN0ZWQgSW5wdXQgYnVmZmVyIGF0dHJpYnV0ZXMgJWQoJWQpIHggJWQoJWQpIiwKKyAgICAgICAgICAgICAgaW5CdWZmZXIud2lkdGgoKSwgbVNpemUtPndpZHRoLCBpbkJ1ZmZlci5oZWlnaHQoKSwKKyAgICAgICAgICAgICAgbVNpemUtPmhlaWdodCk7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICB2cHhfaW1hZ2VfdCByYXdfZnJhbWU7CisgICAgY29uc3QgQzJQbGFuYXJMYXlvdXQgJmxheW91dCA9IHJWaWV3LT5sYXlvdXQoKTsKKyAgICB1aW50MzJfdCB3aWR0aCA9IHJWaWV3LT53aWR0aCgpOworICAgIHVpbnQzMl90IGhlaWdodCA9IHJWaWV3LT5oZWlnaHQoKTsKKyAgICBpZiAod2lkdGggPiAweDgwMDAgfHwgaGVpZ2h0ID4gMHg4MDAwKSB7CisgICAgICAgIEFMT0dFKCJJbWFnZSB0b28gYmlnOiAldSB4ICV1Iiwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB1aW50MzJfdCBzdHJpZGUgPSAod2lkdGggKyBtU3RyaWRlQWxpZ24gLSAxKSAmIH4obVN0cmlkZUFsaWduIC0gMSk7CisgICAgdWludDMyX3QgdnN0cmlkZSA9IChoZWlnaHQgKyBtU3RyaWRlQWxpZ24gLSAxKSAmIH4obVN0cmlkZUFsaWduIC0gMSk7CisgICAgc3dpdGNoIChsYXlvdXQudHlwZSkgeworICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQjoKKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9SR0JBOiB7CisgICAgICAgICAgICBDb252ZXJ0UkdCVG9QbGFuYXJZVVYobUNvbnZlcnNpb25CdWZmZXIuZGF0YSgpLCBzdHJpZGUsIHZzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXIuc2l6ZSgpLCAqclZpZXcuZ2V0KCkpOworICAgICAgICAgICAgdnB4X2ltZ193cmFwKCZyYXdfZnJhbWUsIFZQWF9JTUdfRk1UX0k0MjAsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmlkZUFsaWduLCBtQ29udmVyc2lvbkJ1ZmZlci5kYXRhKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVY6IHsKKyAgICAgICAgICAgIGlmICghSXNZVVY0MjAoKnJWaWV3KSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJpbnB1dCBpcyBub3QgWVVWNDIwIik7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ldLmNvbEluYyA9PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLmNvbEluYyA9PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLmNvbEluYyA9PSAxKSB7CisgICAgICAgICAgICAgICAgLy8gSTQyMCBjb21wYXRpYmxlIC0gdGhvdWdoIHdpdGggY3VzdG9tIG9mZnNldCBhbmQgc3RyaWRlCisgICAgICAgICAgICAgICAgdnB4X2ltZ193cmFwKCZyYXdfZnJhbWUsIFZQWF9JTUdfRk1UX0k0MjAsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJpZGVBbGlnbiwgKHVpbnQ4X3QqKXJWaWV3LT5kYXRhKClbMF0pOworICAgICAgICAgICAgICAgIHJhd19mcmFtZS5wbGFuZXNbMV0gPSAodWludDhfdCopclZpZXctPmRhdGEoKVsxXTsKKyAgICAgICAgICAgICAgICByYXdfZnJhbWUucGxhbmVzWzJdID0gKHVpbnQ4X3QqKXJWaWV3LT5kYXRhKClbMl07CisgICAgICAgICAgICAgICAgcmF3X2ZyYW1lLnN0cmlkZVswXSA9IGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ldLnJvd0luYzsKKyAgICAgICAgICAgICAgICByYXdfZnJhbWUuc3RyaWRlWzFdID0gbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0ucm93SW5jOworICAgICAgICAgICAgICAgIHJhd19mcmFtZS5zdHJpZGVbMl0gPSBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5yb3dJbmM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGNvcHkgdG8gSTQyMAorICAgICAgICAgICAgICAgIE1lZGlhSW1hZ2UyIGltZyA9IENyZWF0ZVlVVjQyMFBsYW5hck1lZGlhSW1hZ2UyKHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgdnN0cmlkZSk7CisgICAgICAgICAgICAgICAgaWYgKG1Db252ZXJzaW9uQnVmZmVyLnNpemUoKSA+PSBzdHJpZGUgKiB2c3RyaWRlICogMyAvIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gSW1hZ2VDb3B5KG1Db252ZXJzaW9uQnVmZmVyLmRhdGEoKSwgJmltZywgKnJWaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkJ1ZmZlciBjb252ZXJzaW9uIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHZweF9pbWdfd3JhcCgmcmF3X2ZyYW1lLCBWUFhfSU1HX0ZNVF9JNDIwLCBzdHJpZGUsIHZzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyaWRlQWxpZ24sICh1aW50OF90KilyVmlldy0+ZGF0YSgpWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgdnB4X2ltZ19zZXRfcmVjdCgmcmF3X2ZyYW1lLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ29udmVyc2lvbiBidWZmZXIgaXMgdG9vIHNtYWxsOiAldSB4ICV1IGZvciAlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgdnN0cmlkZSwgbUNvbnZlcnNpb25CdWZmZXIuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJVbnJlY29nbml6ZWQgcGxhbmUgdHlwZTogJWQiLCBsYXlvdXQudHlwZSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdnB4X2VuY19mcmFtZV9mbGFnc190IGZsYWdzID0gZ2V0RW5jb2RlRmxhZ3MoKTsKKyAgICAvLyBoYW5kbGUgZHluYW1pYyBjb25maWcgcGFyYW1ldGVycworICAgIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiBpbnRyYVJlZnJlc2ggPSBtSW50Zi0+Z2V0SW50cmFSZWZyZXNoX2woKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gYml0cmF0ZSA9IG1JbnRmLT5nZXRCaXRyYXRlX2woKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0PiByZXF1ZXN0U3luYyA9IG1JbnRmLT5nZXRSZXF1ZXN0U3luY19sKCk7CisgICAgICAgIGxvY2sudW5sb2NrKCk7CisKKyAgICAgICAgaWYgKGludHJhUmVmcmVzaCAhPSBtSW50cmFSZWZyZXNoKSB7CisgICAgICAgICAgICBtSW50cmFSZWZyZXNoID0gaW50cmFSZWZyZXNoOworICAgICAgICAgICAgQUxPR1YoIkdvdCBtSW50cmFSZWZyZXNoIHJlcXVlc3QiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXF1ZXN0U3luYyAhPSBtUmVxdWVzdFN5bmMpIHsKKyAgICAgICAgICAgIC8vIHdlIGNhbiBoYW5kbGUgSURSIGltbWVkaWF0ZWx5CisgICAgICAgICAgICBpZiAocmVxdWVzdFN5bmMtPnZhbHVlKSB7CisgICAgICAgICAgICAgICAgLy8gdW5zZXQgcmVxdWVzdAorICAgICAgICAgICAgICAgIEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0IGNsZWFyU3luYygwdSwgQzJfRkFMU0UpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBtSW50Zi0+Y29uZmlnKHsgJmNsZWFyU3luYyB9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgQUxPR1YoIkdvdCBzeW5jIHJlcXVlc3QiKTsKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBWUFhfRUZMQUdfRk9SQ0VfS0Y7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUmVxdWVzdFN5bmMgPSByZXF1ZXN0U3luYzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChiaXRyYXRlICE9IG1CaXRyYXRlKSB7CisgICAgICAgICAgICBtQml0cmF0ZSA9IGJpdHJhdGU7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY190YXJnZXRfYml0cmF0ZSA9CisgICAgICAgICAgICAgICAgKG1CaXRyYXRlLT52YWx1ZSArIDUwMCkgLyAxMDAwOworICAgICAgICAgICAgdnB4X2NvZGVjX2Vycl90IHJlcyA9IHZweF9jb2RlY19lbmNfY29uZmlnX3NldChtQ29kZWNDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoInZweCBlbmNvZGVyIGZhaWxlZCB0byB1cGRhdGUgYml0cmF0ZTogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIHZweF9jb2RlY19lcnJfdG9fc3RyaW5nKHJlcykpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHVpbnQ2NF90IGlucHV0VGltZVN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3VsbCgpOworICAgIHVpbnQzMl90IGZyYW1lRHVyYXRpb247CisgICAgaWYgKGlucHV0VGltZVN0YW1wID4gbUxhc3RUaW1lc3RhbXApIHsKKyAgICAgICAgZnJhbWVEdXJhdGlvbiA9ICh1aW50MzJfdCkoaW5wdXRUaW1lU3RhbXAgLSBtTGFzdFRpbWVzdGFtcCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVXNlIGRlZmF1bHQgb2YgMzAgZnBzIGluIGNhc2Ugb2YgMCBmcmFtZSByYXRlLgorICAgICAgICBmbG9hdCBmcmFtZVJhdGUgPSBtRnJhbWVSYXRlLT52YWx1ZTsKKyAgICAgICAgaWYgKGZyYW1lUmF0ZSA8IDAuMDAxKSB7CisgICAgICAgICAgICBmcmFtZVJhdGUgPSAzMDsKKyAgICAgICAgfQorICAgICAgICBmcmFtZUR1cmF0aW9uID0gKHVpbnQzMl90KSgxMDAwMDAwIC8gZnJhbWVSYXRlICsgMC41KTsKKyAgICB9CisgICAgbUxhc3RUaW1lc3RhbXAgPSBpbnB1dFRpbWVTdGFtcDsKKworICAgIHZweF9jb2RlY19lcnJfdCBjb2RlY19yZXR1cm4gPSB2cHhfY29kZWNfZW5jb2RlKG1Db2RlY0NvbnRleHQsICZyYXdfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRUaW1lU3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVEdXJhdGlvbiwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlBYX0RMX1JFQUxUSU1FKTsKKyAgICBpZiAoY29kZWNfcmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICBBTE9HRSgidnB4IGVuY29kZXIgZmFpbGVkIHRvIGVuY29kZSBmcmFtZSIpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIHBvcHVsYXRlZCA9IGZhbHNlOworICAgIHZweF9jb2RlY19pdGVyX3QgZW5jb2RlZF9wYWNrZXRfaXRlcmF0b3IgPSBudWxscHRyOworICAgIGNvbnN0IHZweF9jb2RlY19jeF9wa3RfdCogZW5jb2RlZF9wYWNrZXQ7CisgICAgd2hpbGUgKChlbmNvZGVkX3BhY2tldCA9IHZweF9jb2RlY19nZXRfY3hfZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgbUNvZGVjQ29udGV4dCwgJmVuY29kZWRfcGFja2V0X2l0ZXJhdG9yKSkpIHsKKyAgICAgICAgaWYgKGVuY29kZWRfcGFja2V0LT5raW5kID09IFZQWF9DT0RFQ19DWF9GUkFNRV9QS1QpIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2soZW5jb2RlZF9wYWNrZXQtPmRhdGEuZnJhbWUuc3osIHVzYWdlLCAmYmxvY2spOworICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgICAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtZW1jcHkod1ZpZXcuZGF0YSgpLCBlbmNvZGVkX3BhY2tldC0+ZGF0YS5mcmFtZS5idWYsIGVuY29kZWRfcGFja2V0LT5kYXRhLmZyYW1lLnN6KTsKKyAgICAgICAgICAgICsrbU51bUlucHV0RnJhbWVzOworCisgICAgICAgICAgICBBTE9HRCgiYnl0ZXMgZ2VuZXJhdGVkICV6dSIsIGVuY29kZWRfcGFja2V0LT5kYXRhLmZyYW1lLnN6KTsKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0gY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrKTsKKyAgICAgICAgICAgIGlmIChlbmNvZGVkX3BhY2tldC0+ZGF0YS5mcmFtZS5mbGFncyAmIFZQWF9GUkFNRV9JU19LRVkpIHsKKyAgICAgICAgICAgICAgICBidWZmZXItPnNldEluZm8oc3RkOjptYWtlX3NoYXJlZDxDMlN0cmVhbVBpY3R1cmVUeXBlTWFza0luZm86Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICAwdSAvKiBzdHJlYW0gaWQgKi8sIEMyUGljdHVyZVR5cGVLZXlGcmFtZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgPSBlbmNvZGVkX3BhY2tldC0+ZGF0YS5mcmFtZS5wdHM7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgcG9wdWxhdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmICghcG9wdWxhdGVkKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMHU7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWcHhFbmM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZClwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdlZDFhOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhFbmMuaApAQCAtMCwwICsxLDQzNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfVlBYX0VOQ19IX18KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX1ZQWF9FTkNfSF9fCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDb2RlYzJCdWZmZXJVdGlscy5oPgorI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisKKyNpbmNsdWRlICJ2cHgvdnB4X2VuY29kZXIuaCIKKyNpbmNsdWRlICJ2cHgvdnB4X2NvZGVjLmgiCisjaW5jbHVkZSAidnB4L3ZweF9pbWFnZS5oIgorI2luY2x1ZGUgInZweC92cDhjeC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIFRPRE86IFRoZXNlIGRlZnMgdGFrZW4gZnJvbSBkZXByZWNhdGVkIE9NWF9WaWRlb0V4dC5oLiBNb3ZlIHRoZXNlIGRlZmluaXRpb25zCisvLyB0byBhIG5ldyBoZWFkZXIgZmlsZSBhbmQgaW5jbHVkZSBpdC4KKworLyoqIE1heGltdW0gbnVtYmVyIG9mIHRlbXBvcmFsIGxheWVycyAqLworI2RlZmluZSBNQVhURU1QT1JBTExBWUVSUyAzCisKKy8qKiB0ZW1wb3JhbCBsYXllciBwYXR0ZXJucyAqLwordHlwZWRlZiBlbnVtIFRlbXBvcmFsUGF0dGVyblR5cGUgeworICAgIFZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuTm9uZSA9IDAsCisgICAgVlBYVGVtcG9yYWxMYXllclBhdHRlcm5XZWJSVEMgPSAxLAorICAgIFZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuTWF4ID0gMHg3RkZGRkZGRgorfSBUZW1wb3JhbFBhdHRlcm5UeXBlOworCisvLyBCYXNlIGNsYXNzIGZvciBhIFZQWCBFbmNvZGVyIENvbXBvbmVudAorLy8KKy8vIE9ubHkgZm9sbG93aW5nIGVuY29kZXIgc2V0dGluZ3MgYXJlIGF2YWlsYWJsZSAoY29kZWMgc3BlY2lmaWMgc2V0dGluZ3MgbWlnaHQKKy8vIGJlIGF2YWlsYWJsZSBpbiB0aGUgc3ViLWNsYXNzZXMpOgorLy8gICAgLSB2aWRlbyByZXNvbHV0aW9uCisvLyAgICAtIHRhcmdldCBiaXRyYXRlCisvLyAgICAtIHJhdGUgY29udHJvbCAoY29uc3RhbnQgLyB2YXJpYWJsZSkKKy8vICAgIC0gZnJhbWUgcmF0ZQorLy8gICAgLSBlcnJvciByZXNpbGllbmNlCisvLyAgICAtIHJlY29uc3RydWN0aW9uICYgbG9vcCBmaWx0ZXJzIChnX3Byb2ZpbGUpCisvLworLy8gT25seSBmb2xsb3dpbmcgY29sb3IgZm9ybWF0cyBhcmUgcmVjb2duaXplZAorLy8gICAgLSBDMlBsYW5hckxheW91dDo6VFlQRV9SR0IKKy8vICAgIC0gQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCQQorLy8KKy8vIEZvbGxvd2luZyBzZXR0aW5ncyBhcmUgbm90IGNvbmZpZ3VyYWJsZSBieSB0aGUgY2xpZW50CisvLyAgICAtIGVuY29kaW5nIGRlYWRsaW5lIGlzIHJlYWx0aW1lCisvLyAgICAtIG11bHRpdGhyZWFkZWQgZW5jb2RpbmcgdXRpbGl6ZXMgYSBudW1iZXIgb2YgdGhyZWFkcyBlcXVhbAorLy8gdG8gb25saW5lIGNwdSdzIGF2YWlsYWJsZQorLy8gICAgLSB0aGUgYWxnb3JpdGhtIGludGVyZmFjZSBmb3IgZW5jb2RlciBpcyBkZWNpZGVkIGJ5IHRoZSBzdWItY2xhc3MgaW4gdXNlCisvLyAgICAtIGZyYWN0aW9uYWwgYml0cyBvZiBmcmFtZSByYXRlIGlzIGRpc2NhcmRlZAorLy8gICAgLSB0aW1lc3RhbXBzIGFyZSBpbiBtaWNyb3NlY29uZHMsIHRoZXJlZm9yZSBlbmNvZGVyIHRpbWViYXNlIGlzIGZpeGVkCisvLyB0byAxLzEwMDAwMDAKKworc3RydWN0IEMyU29mdFZweEVuYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRWcHhFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGUgZmluYWw7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGUgZmluYWw7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGUgZmluYWw7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZSBmaW5hbDsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGUgZmluYWw7CisKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlIGZpbmFsOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGUgZmluYWw7CisKKyBwcm90ZWN0ZWQ6CisgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgIHZpcnR1YWwgfkMyU29mdFZweEVuYygpOworCisgICAgIC8vIEluaXRpYWxpemVzIHZweCBlbmNvZGVyIHdpdGggYXZhaWxhYmxlIHNldHRpbmdzLgorICAgICBzdGF0dXNfdCBpbml0RW5jb2RlcigpOworCisgICAgIC8vIFBvcHVsYXRlcyBtQ29kZWNJbnRlcmZhY2Ugd2l0aCBjb2RlYyBzcGVjaWZpYyBzZXR0aW5ncy4KKyAgICAgdmlydHVhbCB2b2lkIHNldENvZGVjU3BlY2lmaWNJbnRlcmZhY2UoKSA9IDA7CisKKyAgICAgLy8gU2V0cyBjb2RlYyBzcGVjaWZpYyBjb25maWd1cmF0aW9uLgorICAgICB2aXJ0dWFsIHZvaWQgc2V0Q29kZWNTcGVjaWZpY0NvbmZpZ3VyYXRpb24oKSA9IDA7CisKKyAgICAgLy8gU2V0cyBjb2RlYyBzcGVjaWZpYyBlbmNvZGVyIGNvbnRyb2xzLgorICAgICB2aXJ0dWFsIHZweF9jb2RlY19lcnJfdCBzZXRDb2RlY1NwZWNpZmljQ29udHJvbHMoKSA9IDA7CisKKyAgICAgLy8gR2V0IGN1cnJlbnQgZW5jb2RlIGZsYWdzLgorICAgICB2aXJ0dWFsIHZweF9lbmNfZnJhbWVfZmxhZ3NfdCBnZXRFbmNvZGVGbGFncygpOworCisgICAgIGVudW0gVGVtcG9yYWxSZWZlcmVuY2VzIHsKKyAgICAgICAgIC8vIEZvciAxIGxheWVyIGNhc2U6IHJlZmVyZW5jZSBhbGwgKGxhc3QsIGdvbGRlbiwgYW5kIGFsdCByZWYpLCBidXQgb25seQorICAgICAgICAgLy8gdXBkYXRlIGxhc3QuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWxsID0gMTIsCisgICAgICAgICAvLyBGaXJzdCBiYXNlIGxheWVyIGZyYW1lIGZvciAzIHRlbXBvcmFsIGxheWVycywgd2hpY2ggdXBkYXRlcyBsYXN0IGFuZAorICAgICAgICAgLy8gZ29sZGVuIHdpdGggYWx0IHJlZiBkZXBlbmRlbmN5LgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlTGFzdEFuZEdvbGRlblJlZkFsdFJlZiA9IDExLAorICAgICAgICAgLy8gRmlyc3QgZW5oYW5jZW1lbnQgbGF5ZXIgd2l0aCBhbHQgcmVmIGRlcGVuZGVuY3kuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVHb2xkZW5SZWZBbHRSZWYgPSAxMCwKKyAgICAgICAgIC8vIEZpcnN0IGVuaGFuY2VtZW50IGxheWVyIHdpdGggYWx0IHJlZiBkZXBlbmRlbmN5LgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlR29sZGVuV2l0aG91dERlcGVuZGVuY3lSZWZBbHRSZWYgPSA5LAorICAgICAgICAgLy8gQmFzZSBsYXllciB3aXRoIGFsdCByZWYgZGVwZW5kZW5jeS4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWYgPSA4LAorICAgICAgICAgLy8gSGlnaGVzdCBlbmhhY2VtZW50IGxheWVyIHdpdGhvdXQgZGVwZW5kZW5jeSBvbiBnb2xkZW4gd2l0aCBhbHQgcmVmCisgICAgICAgICAvLyBkZXBlbmRlbmN5LgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlTm9uZU5vUmVmR29sZGVuUmVmQWx0UmVmID0gNywKKyAgICAgICAgIC8vIFNlY29uZCBsYXllciBhbmQgbGFzdCBmcmFtZSBpbiBjeWNsZSwgZm9yIDIgbGF5ZXJzLgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlTm9uZU5vUmVmQWx0cmVmID0gNiwKKyAgICAgICAgIC8vIEhpZ2hlc3QgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVOb25lID0gNSwKKyAgICAgICAgIC8vIFNlY29uZCBlbmhhbmNlbWVudCBsYXllci4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUFsdHJlZiA9IDQsCisgICAgICAgICAvLyBTZWNvbmQgZW5oYW5jZW1lbnQgbGF5ZXIgd2l0aG91dCBkZXBlbmRlbmN5IG9uIHByZXZpb3VzIGZyYW1lcyBpbgorICAgICAgICAgLy8gdGhlIHNlY29uZCBlbmhhbmNlbWVudCBsYXllci4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUFsdHJlZldpdGhvdXREZXBlbmRlbmN5ID0gMywKKyAgICAgICAgIC8vIEZpcnN0IGVuaGFuY2VtZW50IGxheWVyLgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlR29sZGVuID0gMiwKKyAgICAgICAgIC8vIEZpcnN0IGVuaGFuY2VtZW50IGxheWVyIHdpdGhvdXQgZGVwZW5kZW5jeSBvbiBwcmV2aW91cyBmcmFtZXMgaW4KKyAgICAgICAgIC8vIHRoZSBmaXJzdCBlbmhhbmNlbWVudCBsYXllci4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbldpdGhvdXREZXBlbmRlbmN5ID0gMSwKKyAgICAgICAgIC8vIEJhc2UgbGF5ZXIuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVMYXN0ID0gMCwKKyAgICAgfTsKKyAgICAgZW51bSB7CisgICAgICAgICBrTWF4VGVtcG9yYWxQYXR0ZXJuID0gOAorICAgICB9OworCisgICAgIC8vIHZweCBzcGVjaWZpYyBvcGFxdWUgZGF0YSBzdHJ1Y3R1cmUgdGhhdAorICAgICAvLyBzdG9yZXMgZW5jb2RlciBzdGF0ZQorICAgICB2cHhfY29kZWNfY3R4X3QqIG1Db2RlY0NvbnRleHQ7CisKKyAgICAgLy8gdnB4IHNwZWNpZmljIGRhdGEgc3RydWN0dXJlIHRoYXQKKyAgICAgLy8gc3RvcmVzIGVuY29kZXIgY29uZmlndXJhdGlvbgorICAgICB2cHhfY29kZWNfZW5jX2NmZ190KiBtQ29kZWNDb25maWd1cmF0aW9uOworCisgICAgIC8vIHZweCBzcGVjaWZpYyByZWFkLW9ubHkgZGF0YSBzdHJ1Y3R1cmUKKyAgICAgLy8gdGhhdCBzcGVjaWZpZXMgYWxnb3JpdGhtIGludGVyZmFjZSAoZS5nLiB2cDgpCisgICAgIHZweF9jb2RlY19pZmFjZV90KiBtQ29kZWNJbnRlcmZhY2U7CisKKyAgICAgLy8gYWxpZ24gc3RyaWRlIHRvIHRoZSBwb3dlciBvZiAyCisgICAgIGludDMyX3QgbVN0cmlkZUFsaWduOworCisgICAgIC8vIENvbG9yIGZvcm1hdCBmb3IgdGhlIGlucHV0IHBvcnQKKyAgICAgdnB4X2ltZ19mbXRfdCBtQ29sb3JGb3JtYXQ7CisKKyAgICAgLy8gQml0cmF0ZSBjb250cm9sIG1vZGUsIGVpdGhlciBjb25zdGFudCBvciB2YXJpYWJsZQorICAgICB2cHhfcmNfbW9kZSBtQml0cmF0ZUNvbnRyb2xNb2RlOworCisgICAgIC8vIFBhcmFtZXRlciB0aGF0IGRlbm90ZXMgd2hldGhlciBlcnJvciByZXNpbGllbmNlCisgICAgIC8vIGlzIGVuYWJsZWQgaW4gZW5jb2RlcgorICAgICBib29sIG1FcnJvclJlc2lsaWVuY2U7CisKKyAgICAgLy8gTWluaW11bSAoYmVzdCBxdWFsaXR5KSBxdWFudGl6ZXIKKyAgICAgdWludDMyX3QgbU1pblF1YW50aXplcjsKKworICAgICAvLyBNYXhpbXVtICh3b3JzdCBxdWFsaXR5KSBxdWFudGl6ZXIKKyAgICAgdWludDMyX3QgbU1heFF1YW50aXplcjsKKworICAgICAvLyBOdW1iZXIgb2YgY29kaW5nIHRlbXBvcmFsIGxheWVycyB0byBiZSB1c2VkLgorICAgICBzaXplX3QgbVRlbXBvcmFsTGF5ZXJzOworCisgICAgIC8vIFRlbXBvcmFsIGxheWVyIGJpdHJhcmUgcmF0aW8gaW4gcGVyY2VudGFnZQorICAgICB1aW50MzJfdCBtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1tNQVhURU1QT1JBTExBWUVSU107CisKKyAgICAgLy8gVGVtcG9yYWwgcGF0dGVybiB0eXBlCisgICAgIFRlbXBvcmFsUGF0dGVyblR5cGUgbVRlbXBvcmFsUGF0dGVyblR5cGU7CisKKyAgICAgLy8gVGVtcG9yYWwgcGF0dGVybiBsZW5ndGgKKyAgICAgc2l6ZV90IG1UZW1wb3JhbFBhdHRlcm5MZW5ndGg7CisKKyAgICAgLy8gVGVtcG9yYWwgcGF0dGVybiBjdXJyZW50IGluZGV4CisgICAgIHNpemVfdCBtVGVtcG9yYWxQYXR0ZXJuSWR4OworCisgICAgIC8vIEZyYW1lIHR5cGUgdGVtcG9yYWwgcGF0dGVybgorICAgICBUZW1wb3JhbFJlZmVyZW5jZXMgbVRlbXBvcmFsUGF0dGVybltrTWF4VGVtcG9yYWxQYXR0ZXJuXTsKKworICAgICAvLyBMYXN0IGlucHV0IGJ1ZmZlciB0aW1lc3RhbXAKKyAgICAgdWludDY0X3QgbUxhc3RUaW1lc3RhbXA7CisKKyAgICAgLy8gTnVtYmVyIG9mIGlucHV0IGZyYW1lcworICAgICBpbnQ2NF90IG1OdW1JbnB1dEZyYW1lczsKKworICAgICAvLyBDb252ZXJzaW9uIGJ1ZmZlciBpcyBuZWVkZWQgdG8gaW5wdXQgdG8KKyAgICAgLy8geXV2NDIwIHBsYW5hciBmb3JtYXQuCisgICAgIE1lbW9yeUJsb2NrIG1Db252ZXJzaW9uQnVmZmVyOworCisgICAgIC8vIFNpZ25hbGxlZCBFT1MKKyAgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworCisgICAgIC8vIFNpZ25hbGxlZCBFcnJvcgorICAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKworICAgIC8vIGNvbmZpZ3VyYXRpb25zIHVzZWQgYnkgY29tcG9uZW50IGluIHByb2Nlc3MKKyAgICAvLyAoVE9ETzoga2VlcCB0aGlzIGluIGludGYgYnV0IG1ha2UgdGhlbSBpbnRlcm5hbCBvbmx5KQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiBtSW50cmFSZWZyZXNoOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gbUZyYW1lUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlTW9kZVR1bmluZzo6b3V0cHV0PiBtQml0cmF0ZU1vZGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0PiBtUmVxdWVzdFN5bmM7CisKKyAgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0VnB4RW5jKTsKK307CisKK2NsYXNzIEMyU29mdFZweEVuYzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4mIGhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfTkFNRV9JTlBVVF9TVFJFQU1fRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKAorICAgICAgICAgICAgICAgICAgICBuZXcgQzJTdHJlYW1Gb3JtYXRDb25maWc6OmlucHV0KDB1LCBDMkZvcm1hdFZpZGVvKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfTkFNRV9PVVRQVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEMyU3RyZWFtRm9ybWF0Q29uZmlnOjpvdXRwdXQoMHUsIEMyRm9ybWF0Q29tcHJlc3NlZCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfTkFNRV9JTlBVVF9QT1JUX01JTUVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9OQU1FX09VVFBVVF9QT1JUX01JTUVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWltZUNvbmZpZzo6b3V0cHV0PigKKyNpZmRlZiBWUDkKKyAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fVlA5CisjZWxzZQorICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19WUDgKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICApKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoRGVmaW5lUGFyYW0obVVzYWdlLCBDMl9OQU1FX0lOUFVUX1NUUkVBTV9VU0FHRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Vc2FnZVR1bmluZzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCAodWludDY0X3QpQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfTkFNRV9TVFJFQU1fVklERU9fU0laRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJWaWRlb1NpemVTdHJlYW1UdW5pbmc6OmlucHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDIwNDgsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNpemVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlTW9kZSwgQzJfUEFSQU1LRVlfQklUUkFURV9NT0RFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlTW9kZVR1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29uZmlnOjpCSVRSQVRFX0NPTlNUKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtQml0cmF0ZU1vZGUsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6QklUUkFURV9DT05TVCwgQzJDb25maWc6OkJJVFJBVEVfVkFSSUFCTEUgfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKAorICAgICAgICAgICAgICAgICAgICBTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlTW9kZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1GcmFtZVJhdGUsIEMyX05BTUVfU1RSRUFNX0ZSQU1FX1JBVEVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0KDB1LCAzMC4pKQorICAgICAgICAgICAgICAgIC8vIFRPRE86IE1vcmUgcmVzdHJpY3Rpb24/CisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRnJhbWVSYXRlLCB2YWx1ZSkuZ3JlYXRlclRoYW4oMC4pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICAgICAgU2V0dGVyPGRlY2x0eXBlKCptRnJhbWVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUxheWVyaW5nLCBDMl9QQVJBTUtFWV9URU1QT1JBTF9MQVlFUklORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQoQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKDB1LCAwLCAwLCAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtTGF5ZXJpbmcsIG0ubGF5ZXJDb3VudCkuaW5SYW5nZSgwLCA0KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1MYXllcmluZywgbS5iTGF5ZXJDb3VudCkuaW5SYW5nZSgwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1MYXllcmluZywgbS5iaXRyYXRlUmF0aW9zKS5pblJhbmdlKDAuLCAxLikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKExheWVyaW5nU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVN5bmNGcmFtZVBlcmlvZCwgQzJfUEFSQU1LRVlfU1lOQ19GUkFNRV9JTlRFUlZBTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU3luY0ZyYW1lSW50ZXJ2YWxUdW5pbmc6Om91dHB1dCgwdSwgMTAwMDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU3luY0ZyYW1lUGVyaW9kLCB2YWx1ZSkuYW55KCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbVN5bmNGcmFtZVBlcmlvZCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9OQU1FX1NUUkVBTV9CSVRSQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMkJpdHJhdGVUdW5pbmc6Om91dHB1dCgwdSwgNjQwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDQwOTYsIDQwMDAwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQml0cmF0ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnRyYVJlZnJlc2gsIEMyX1BBUkFNS0VZX0lOVFJBX1JFRlJFU0gpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb25maWc6OklOVFJBX1JFRlJFU0hfRElTQUJMRUQsIDAuKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgIDB1LCBQUk9GSUxFX1ZQOV8wLCBMRVZFTF9WUDlfNF8xKSkKKyAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLmVxdWFsVG8oCisgICAgICAgICAgICAgICAgUFJPRklMRV9WUDlfMAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkuZXF1YWxUbygKKyAgICAgICAgICAgICAgICBMRVZFTF9WUDlfNF8xKSwKKyAgICAgICAgfSkKKyAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyKQorICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1SZXF1ZXN0U3luYywgQzJfUEFSQU1LRVlfUkVRVUVTVF9TWU5DX0ZSQU1FKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQoMHUsIEMyX0ZBTFNFKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1SZXF1ZXN0U3luYywgdmFsdWUpLm9uZU9mKHsgQzJfRkFMU0UsIEMyX1RSVUUgfSkgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1SZXF1ZXN0U3luYyk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgQml0cmF0ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmIChtZS52LnZhbHVlIDw9IDQwOTYpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnZhbHVlID0gNDA5NjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiAmb2xkTWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYud2lkdGgpLnN1cHBvcnRzQXRBbGwobWUudi53aWR0aCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi53aWR0aCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcigKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYucHJvZmlsZSkuc3VwcG9ydHNBdEFsbChtZS52LnByb2ZpbGUpKSB7CisgICAgICAgICAgICBtZS5zZXQoKS5wcm9maWxlID0gUFJPRklMRV9WUDlfMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5sZXZlbCkuc3VwcG9ydHNBdEFsbChtZS52LmxldmVsKSkgeworICAgICAgICAgICAgbWUuc2V0KCkubGV2ZWwgPSBMRVZFTF9WUDlfNF8xOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBMYXllcmluZ1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ+JiBtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKG1lLnYubS5sYXllckNvdW50ID4gNCkgeworICAgICAgICAgICAgbWUuc2V0KCkubS5sYXllckNvdW50ID0gNDsKKyAgICAgICAgfQorICAgICAgICBtZS5zZXQoKS5tLmJMYXllckNvdW50ID0gMDsKKyAgICAgICAgLy8gZW5zdXJlIHJhdGlvcyBhcmUgbW9ub3RvbmljIGFuZCBjbGFtcGVkIGJldHdlZW4gMCBhbmQgMQorICAgICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgbWUudi5mbGV4Q291bnQoKTsgKytpeCkgeworICAgICAgICAgICAgbWUuc2V0KCkubS5iaXRyYXRlUmF0aW9zW2l4XSA9IGMyX2NsYW1wKAorICAgICAgICAgICAgICAgIGl4ID4gMCA/IG1lLnYubS5iaXRyYXRlUmF0aW9zW2l4IC0gMV0gOiAwLCBtZS52Lm0uYml0cmF0ZVJhdGlvc1tpeF0sIDEuKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HSSgic2V0dGluZyB0ZW1wb3JhbCBsYXllcmluZyAldSArICV1IiwgbWUudi5tLmxheWVyQ291bnQsIG1lLnYubS5iTGF5ZXJDb3VudCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLy8gdW5zYWZlIGdldHRlcnMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiBnZXRTaXplX2woKSBjb25zdCB7IHJldHVybiBtU2l6ZTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiBnZXRJbnRyYVJlZnJlc2hfbCgpIGNvbnN0IHsgcmV0dXJuIG1JbnRyYVJlZnJlc2g7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IGdldEZyYW1lUmF0ZV9sKCkgY29uc3QgeyByZXR1cm4gbUZyYW1lUmF0ZTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IGdldEJpdHJhdGVfbCgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZU1vZGVUdW5pbmc6Om91dHB1dD4gZ2V0Qml0cmF0ZU1vZGVfbCgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlTW9kZTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gZ2V0UmVxdWVzdFN5bmNfbCgpIGNvbnN0IHsgcmV0dXJuIG1SZXF1ZXN0U3luYzsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dD4gZ2V0VGVtcG9yYWxMYXllcnNfbCgpIGNvbnN0IHsgcmV0dXJuIG1MYXllcmluZzsgfQorICAgIHVpbnQzMl90IGdldFN5bmNGcmFtZVBlcmlvZCgpIGNvbnN0IHsKKyAgICAgICAgaWYgKG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlIDwgMCB8fCBtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSA9PSBJTlQ2NF9NQVgpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGRvdWJsZSBwZXJpb2QgPSBtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSAvIDFlNiAqIG1GcmFtZVJhdGUtPnZhbHVlOworICAgICAgICByZXR1cm4gKHVpbnQzMl90KWMyX21heChjMl9taW4ocGVyaW9kICsgMC41LCBkb3VibGUoVUlOVDMyX01BWCkpLCAxLik7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZvcm1hdENvbmZpZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Gb3JtYXRDb25maWc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWltZUNvbmZpZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVVzYWdlVHVuaW5nOjppbnB1dD4gbVVzYWdlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlZpZGVvU2l6ZVN0cmVhbVR1bmluZzo6aW5wdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gbUZyYW1lUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ+IG1MYXllcmluZzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dD4gbUludHJhUmVmcmVzaDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+IG1SZXF1ZXN0U3luYzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TeW5jRnJhbWVJbnRlcnZhbFR1bmluZzo6b3V0cHV0PiBtU3luY0ZyYW1lUGVyaW9kOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJpdHJhdGVUdW5pbmc6Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZU1vZGVUdW5pbmc6Om91dHB1dD4gbUJpdHJhdGVNb2RlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gbVByb2ZpbGVMZXZlbDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX1ZQWF9FTkNfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L05PVElDRSBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFlZDU4YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9OT1RJQ0UKQEAgLTAsMCArMSwxOTAgQEAKKworICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMTMsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc5NWNjMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3hhYWMvQW5kcm9pZC5icApAQCAtMCwwICsxLDExIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3hhYWNkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdFhhYWNEZWMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJ4YWFjZGVjIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0MyU29mdFhhYWNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMveGFhYy9DMlNvZnRYYWFjRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzBlNzBiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMveGFhYy9DMlNvZnRYYWFjRGVjLmNwcApAQCAtMCwwICsxLDE1ODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdFhhYWNEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0WGFhY0RlYy5oIgorCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwgLTE2LjAgICAvKiA2NCotMC4yNWRCID0gLTE2IGRCIGJlbG93IGZ1bGwgc2NhbGUgZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQ1VUICAgMS4wICAvKiBtYXhpbXVtIGNvbXByZXNzaW9uIG9mIGR5bmFtaWMgcmFuZ2UgZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQk9PU1QgMS4wIC8qIG1heGltdW0gY29tcHJlc3Npb24gb2YgZHluYW1pYyByYW5nZSBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19IRUFWWSBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZICAgLyogc3dpdGNoIGZvciBoZWF2eSBjb21wcmVzc2lvbiBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19FRkZFQ1QgMyAgLyogTVBFRy1EIERSQyBlZmZlY3QgdHlwZTsgMyA9PiBMaW1pdGVkIHBsYXliYWNrIHJhbmdlICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9FTkNfTEVWRUwgKDAuMjUpIC8qIGVuY29kZXIgdGFyZ2V0IGxldmVsOyAtMSA9PiB0aGUgdmFsdWUgaXMgdW5rbm93biwgb3RoZXJ3aXNlIGRCIHN0ZXAgdmFsdWUgKGUuZy4gNjQgZm9yIC0xNiBkQikgKi8KKyNkZWZpbmUgTUFYX0NIQU5ORUxfQ09VTlQgICAgICAgICAgICA4ICAvKiBtYXhpbXVtIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyB0aGF0IGNhbiBiZSBkZWNvZGVkICovCisvLyBuYW1lcyBvZiBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgRFJDIHNldHRpbmdzCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX1JFRl9MRVZFTCAgImFhY19kcmNfcmVmZXJlbmNlX2xldmVsIgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9DVVQgICAgICAgICJhYWNfZHJjX2N1dCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfQk9PU1QgICAgICAiYWFjX2RyY19ib29zdCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfSEVBVlkgICAgICAiYWFjX2RyY19oZWF2eSIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfRU5DX0xFVkVMICAiYWFjX2RyY19lbmNfdGFyZ2V0X2xldmVsIgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9FRkZFQ1RfVFlQRSAicm8uYWFjX2RyY19lZmZlY3RfdHlwZSIKKworI2RlZmluZSBSRVRVUk5fSUZfRkFUQUwocmV0dmFsLCBzdHIpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHJldHZhbCAmIElBX0ZBVEFMX0VSUk9SKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0UoIkVycm9yIGluICVzOiBSZXR1cm5lZDogJWQiLCBzdHIsIHJldHZhbCk7ICAgXAorICAgICAgICByZXR1cm4gcmV0dmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIGlmIChyZXR2YWwgIT0gSUFfTk9fRVJST1IpIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR1coIldhcm5pbmcgaW4gJXM6IFJldHVybmVkOiAlZCIsIHN0ciwgcmV0dmFsKTsgXAorICAgIH0KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC54YWFjLmRlY29kZXIiOworCitjbGFzcyBDMlNvZnRYYWFjRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworCisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9OQU1FX0lOUFVUX1NUUkVBTV9GT1JNQVRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtRm9ybWF0Q29uZmlnOjppbnB1dCgwdSwgQzJGb3JtYXRDb21wcmVzc2VkKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX05BTUVfT1VUUFVUX1NUUkVBTV9GT1JNQVRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtRm9ybWF0Q29uZmlnOjpvdXRwdXQoMHUsIEMyRm9ybWF0QXVkaW8pKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9OQU1FX0lOUFVUX1BPUlRfTUlNRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNaW1lQ29uZmlnOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfTkFNRV9PVVRQVVRfUE9SVF9NSU1FX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1pbWVDb25maWc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX05BTUVfU1RSRUFNX1NBTVBMRV9SQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDQ0MTAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICA3MzUwLCA4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAKKyAgICAgICAgICAgICAgICB9KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX05BTUVfU1RSRUFNX0NIQU5ORUxfQ09VTlRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5pblJhbmdlKDEsIDgpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX05BTUVfU1RSRUFNX0JJVFJBVEVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyQml0cmF0ZVR1bmluZzo6aW5wdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg4MDAwLCA5NjAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA4MTkyKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BYWNGb3JtYXQsIEMyX05BTUVfU1RSRUFNX0FBQ19GT1JNQVRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQWFjRm9ybWF0SW5mbzo6aW5wdXQoMHUsIEMyQWFjU3RyZWFtRm9ybWF0UmF3KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1BYWNGb3JtYXQsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgIEMyQWFjU3RyZWFtRm9ybWF0UmF3LCBDMkFhY1N0cmVhbUZvcm1hdEFkdHMKKyAgICAgICAgICAgICAgICB9KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQWFjRm9ybWF0KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0KDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xDLCBDMkNvbmZpZzo6TEVWRUxfVU5VU0VEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19IRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEVfUFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FTEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX1hIRX0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVU5VU0VECisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjQ29tcHJlc3NNb2RlLCBDMl9QQVJBTUtFWV9EUkNfQ09NUFJFU1NJT05fTU9ERSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRHJjQ29tcHJlc3Npb25Nb2RlVHVuaW5nOjppbnB1dCgwdSwgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9IRUFWWSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobURyY0NvbXByZXNzTW9kZSwgdmFsdWUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX09ETV9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0xJR0hULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fSEVBVll9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjQ29tcHJlc3NNb2RlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EcmNUYXJnZXRSZWZMZXZlbCwgQzJfUEFSQU1LRVlfRFJDX1RBUkdFVF9SRUZFUkVOQ0VfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY1RhcmdldFJlZmVyZW5jZUxldmVsVHVuaW5nOjppbnB1dCgwdSwgRFJDX0RFRkFVTFRfTU9CSUxFX1JFRl9MRVZFTCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRHJjVGFyZ2V0UmVmTGV2ZWwsIHZhbHVlKS5pblJhbmdlKC0zMS43NSwgMC4yNSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbURyY1RhcmdldFJlZkxldmVsKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EcmNFbmNUYXJnZXRMZXZlbCwgQzJfUEFSQU1LRVlfRFJDX0VOQ09ERURfVEFSR0VUX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNFbmNvZGVkVGFyZ2V0TGV2ZWxUdW5pbmc6OmlucHV0KDB1LCBEUkNfREVGQVVMVF9NT0JJTEVfRU5DX0xFVkVMKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1EcmNFbmNUYXJnZXRMZXZlbCwgdmFsdWUpLmluUmFuZ2UoLTMxLjc1LCAwLjI1KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjRW5jVGFyZ2V0TGV2ZWwpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY0Jvb3N0RmFjdG9yLCBDMl9QQVJBTUtFWV9EUkNfQk9PU1RfRkFDVE9SKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNCb29zdEZhY3RvclR1bmluZzo6aW5wdXQoMHUsIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQk9PU1QpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobURyY0Jvb3N0RmFjdG9yLCB2YWx1ZSkuaW5SYW5nZSgwLCAxLil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbURyY0Jvb3N0RmFjdG9yKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EcmNBdHRlbnVhdGlvbkZhY3RvciwgQzJfUEFSQU1LRVlfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUikKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRHJjQXR0ZW51YXRpb25GYWN0b3JUdW5pbmc6OmlucHV0KDB1LCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0NVVCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRHJjQXR0ZW51YXRpb25GYWN0b3IsIHZhbHVlKS5pblJhbmdlKDAsIDEuKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjQXR0ZW51YXRpb25GYWN0b3IpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY0VmZmVjdFR5cGUsIEMyX1BBUkFNS0VZX0RSQ19FRkZFQ1RfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRHJjRWZmZWN0VHlwZVR1bmluZzo6aW5wdXQoMHUsIEMyQ29uZmlnOjpEUkNfRUZGRUNUX0xJTUlURURfUExBWUJBQ0tfUkFOR0UpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EcmNFZmZlY3RUeXBlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX09ETV9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX09GRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX0xBVEVfTklHSFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfTk9JU1lfRU5WSVJPTk1FTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfTElNSVRFRF9QTEFZQkFDS19SQU5HRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9MT1dfUExBWUJBQ0tfTEVWRUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfRElBTE9HX0VOSEFOQ0VNRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX0dFTkVSQUxfQ09NUFJFU1NJT059KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjRWZmZWN0VHlwZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIGJvb2wgaXNBZHRzKCkgY29uc3QgeyByZXR1cm4gbUFhY0Zvcm1hdC0+dmFsdWUgPT0gQzJBYWNTdHJlYW1Gb3JtYXRBZHRzOyB9CisgICAgdWludDMyX3QgZ2V0Qml0cmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlLT52YWx1ZTsgfQorICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisgICAgaW50MzJfdCBnZXREcmNDb21wcmVzc01vZGUoKSBjb25zdCB7IHJldHVybiBtRHJjQ29tcHJlc3NNb2RlLT52YWx1ZSA9PSBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZID8gMSA6IDA7IH0KKyAgICBpbnQzMl90IGdldERyY1RhcmdldFJlZkxldmVsKCkgY29uc3QgeyByZXR1cm4gKG1EcmNUYXJnZXRSZWZMZXZlbC0+dmFsdWUgPD0gMCA/IC1tRHJjVGFyZ2V0UmVmTGV2ZWwtPnZhbHVlICogNC4gKyAwLjUgOiAtMSk7IH0KKyAgICBpbnQzMl90IGdldERyY0VuY1RhcmdldExldmVsKCkgY29uc3QgeyByZXR1cm4gKG1EcmNFbmNUYXJnZXRMZXZlbC0+dmFsdWUgPD0gMCA/IC1tRHJjRW5jVGFyZ2V0TGV2ZWwtPnZhbHVlICogNC4gKyAwLjUgOiAtMSk7IH0KKyAgICBpbnQzMl90IGdldERyY0Jvb3N0RmFjdG9yKCkgY29uc3QgeyByZXR1cm4gbURyY0Jvb3N0RmFjdG9yLT52YWx1ZSAqIDEyNy4gKyAwLjU7IH0KKyAgICBpbnQzMl90IGdldERyY0F0dGVudWF0aW9uRmFjdG9yKCkgY29uc3QgeyByZXR1cm4gbURyY0F0dGVudWF0aW9uRmFjdG9yLT52YWx1ZSAqIDEyNy4gKyAwLjU7IH0KKyAgICBpbnQzMl90IGdldERyY0VmZmVjdFR5cGUoKSBjb25zdCB7IHJldHVybiBtRHJjRWZmZWN0VHlwZS0+dmFsdWU7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Gb3JtYXRDb25maWc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRm9ybWF0Q29uZmlnOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1pbWVDb25maWc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1pbWVDb25maWc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQml0cmF0ZVR1bmluZzo6aW5wdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1BYWNGb3JtYXRJbmZvOjppbnB1dD4gbUFhY0Zvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1EcmNDb21wcmVzc2lvbk1vZGVUdW5pbmc6OmlucHV0PiBtRHJjQ29tcHJlc3NNb2RlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbURyY1RhcmdldFJlZmVyZW5jZUxldmVsVHVuaW5nOjppbnB1dD4gbURyY1RhcmdldFJlZkxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbURyY0VuY29kZWRUYXJnZXRMZXZlbFR1bmluZzo6aW5wdXQ+IG1EcmNFbmNUYXJnZXRMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1EcmNCb29zdEZhY3RvclR1bmluZzo6aW5wdXQ+IG1EcmNCb29zdEZhY3RvcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1EcmNBdHRlbnVhdGlvbkZhY3RvclR1bmluZzo6aW5wdXQ+IG1EcmNBdHRlbnVhdGlvbkZhY3RvcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1EcmNFZmZlY3RUeXBlVHVuaW5nOjppbnB1dD4gbURyY0VmZmVjdFR5cGU7CisgICAgLy8gVE9ETyBBZGQgOiBDMlN0cmVhbUFhY1Nick1vZGVUdW5pbmcKK307CisKK0MyU29mdFhhYWNEZWM6OkMyU29mdFhhYWNEZWMoCisgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICAgIG1YaGVhYWNDb2RlY0hhbmRsZShudWxscHRyKSwKKyAgICAgICAgbU1wZWdERHJjSGFuZGxlKG51bGxwdHIpLAorICAgICAgICBtT3V0cHV0RHJhaW5CdWZmZXIobnVsbHB0cikgeworfQorCitDMlNvZnRYYWFjRGVjOjp+QzJTb2Z0WGFhY0RlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0WGFhY0RlYzo6b25Jbml0KCkgeworICAgIG1PdXRwdXRGcmFtZUxlbmd0aCA9IDEwMjQ7CisgICAgbUlucHV0QnVmZmVyID0gbnVsbHB0cjsKKyAgICBtT3V0cHV0QnVmZmVyID0gbnVsbHB0cjsKKyAgICBtU2FtcEZyZXEgPSAwOworICAgIG1OdW1DaGFubmVscyA9IDA7CisgICAgbVBjbVdkU3ogPSAwOworICAgIG1DaGFubmVsTWFzayA9IDA7CisgICAgbU51bU91dEJ5dGVzID0gMDsKKyAgICBtQ3VyRnJhbWVJbmRleCA9IDA7CisgICAgbUN1clRpbWVzdGFtcCA9IDA7CisgICAgbUlzQ29kZWNJbml0aWFsaXplZCA9IGZhbHNlOworICAgIG1Jc0NvZGVjQ29uZmlnRmx1c2hSZXF1aXJlZCA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtT3V0cHV0RHJhaW5CdWZmZXJXcml0ZVBvcyA9IDA7CisgICAgbURSQ0ZsYWcgPSAwOworICAgIG1NcGVnRERSQ1ByZXNlbnQgPSAwOworICAgIG1NZW1vcnlWZWMuY2xlYXIoKTsKKyAgICBtRHJjTWVtb3J5VmVjLmNsZWFyKCk7CisKKyAgICBJQV9FUlJPUkNPREUgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IElBX05PX0VSUk9SID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7CisKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0WGFhY0RlYzo6b25TdG9wKCkgeworICAgIG1PdXRwdXRGcmFtZUxlbmd0aCA9IDEwMjQ7CisgICAgZHJhaW5EZWNvZGVyKCk7CisgICAgLy8gcmVzZXQgdGhlICJjb25maWd1cmVkIiBzdGF0ZQorICAgIG1TYW1wRnJlcSA9IDA7CisgICAgbU51bUNoYW5uZWxzID0gMDsKKyAgICBtUGNtV2RTeiA9IDA7CisgICAgbUNoYW5uZWxNYXNrID0gMDsKKyAgICBtTnVtT3V0Qnl0ZXMgPSAwOworICAgIG1DdXJGcmFtZUluZGV4ID0gMDsKKyAgICBtQ3VyVGltZXN0YW1wID0gMDsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbU91dHB1dERyYWluQnVmZmVyV3JpdGVQb3MgPSAwOworICAgIG1EUkNGbGFnID0gMDsKKyAgICBtTXBlZ0REUkNQcmVzZW50ID0gMDsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRYYWFjRGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdFhhYWNEZWM6Om9uUmVsZWFzZSgpIHsKKyAgICBJQV9FUlJPUkNPREUgZXJyQ29kZSA9IGRlSW5pdFhBQUNEZWNvZGVyKCk7CisgICAgaWYgKElBX05PX0VSUk9SICE9IGVyckNvZGUpIEFMT0dFKCJkZUluaXRYQUFDRGVjb2RlcigpIGZhaWxlZCAlZCIsIGVyckNvZGUpOworCisgICAgZXJyQ29kZSA9IGRlSW5pdE1QRUdERERyYygpOworICAgIGlmIChJQV9OT19FUlJPUiAhPSBlcnJDb2RlKSBBTE9HRSgiZGVJbml0TVBFR0RERHJjKCkgZmFpbGVkICVkIiwgZXJyQ29kZSk7CisKKyAgICBpZiAobU91dHB1dERyYWluQnVmZmVyKSB7CisgICAgICAgIGRlbGV0ZVtdIG1PdXRwdXREcmFpbkJ1ZmZlcjsKKyAgICAgICAgbU91dHB1dERyYWluQnVmZmVyID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK0lBX0VSUk9SQ09ERSBDMlNvZnRYYWFjRGVjOjppbml0RGVjb2RlcigpIHsKKyAgICBBTE9HVigiaW5pdERlY29kZXIoKSIpOworICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IElBX05PX0VSUk9SOworCisgICAgZXJyX2NvZGUgPSBpbml0WEFBQ0RlY29kZXIoKTsKKyAgICBpZiAoZXJyX2NvZGUgIT0gSUFfTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoImluaXRYQUFDRGVjb2RlciBGYWlsZWQiKTsKKyAgICAgICAgLyogQ2FsbCBkZUluaXQgdG8gZnJlZSBhbnkgYWxsb2NhdGVkIG1lbW9yeSAqLworICAgICAgICBkZUluaXRYQUFDRGVjb2RlcigpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorCisgICAgaWYgKCFtT3V0cHV0RHJhaW5CdWZmZXIpIHsKKyAgICAgICAgbU91dHB1dERyYWluQnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIGNoYXJba091dHB1dERyYWluQnVmZmVyU2l6ZV07CisgICAgICAgIGlmICghbU91dHB1dERyYWluQnVmZmVyKSByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorCisgICAgZXJyX2NvZGUgPSBpbml0WEFBQ0RyYygpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJpbml0WEFBQ0RyYyIpOworCisKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspIHsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3ZvaWQgQzJTb2Z0WGFhY0RlYzo6ZmluaXNoV29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKSB7CisgICAgQUxPR1YoIm1DdXJGcmFtZUluZGV4ID0gJSIgUFJJdTY0LCBtQ3VyRnJhbWVJbmRleCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfTsKKyAgICAvLyBUT0RPOiBlcnJvciBoYW5kbGluZywgcHJvcGVyIHVzYWdlLCBldGMuCisgICAgYzJfc3RhdHVzX3QgZXJyID0KKyAgICAgICAgcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhtT3V0cHV0RHJhaW5CdWZmZXJXcml0ZVBvcywgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmYWlsZWQgOiBlcnIgPSAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpbnQxNl90KiBvdXRCdWZmZXIgPSByZWludGVycHJldF9jYXN0PGludDE2X3QqPih3Vmlldy5kYXRhKCkpOworICAgIG1lbWNweShvdXRCdWZmZXIsIG1PdXRwdXREcmFpbkJ1ZmZlciwgbU91dHB1dERyYWluQnVmZmVyV3JpdGVQb3MpOworICAgIG1PdXRwdXREcmFpbkJ1ZmZlcldyaXRlUG9zID0gMDsKKworICAgIGF1dG8gZmlsbFdvcmsgPSBbYnVmZmVyID0gY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrKV0oCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrKSB7CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICAgICAgICB9CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB9OworICAgIGlmICh3b3JrICYmIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9PSBjMl9jbnRyNjRfdChtQ3VyRnJhbWVJbmRleCkpIHsKKyAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmluaXNoKG1DdXJGcmFtZUluZGV4LCBmaWxsV29yayk7CisgICAgfQorCisgICAgQUxPR1YoIm91dCB0aW1lc3RhbXAgJSIgUFJJdTY0ICIgLyAldSIsIG1DdXJUaW1lc3RhbXAsIGJsb2NrLT5jYXBhY2l0eSgpKTsKK30KKwordm9pZCBDMlNvZnRYYWFjRGVjOjpwcm9jZXNzKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHVpbnQ4X3QqIGluQnVmZmVyID0gbnVsbHB0cjsKKyAgICB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCA9IDA7CisgICAgQzJSZWFkVmlldyB2aWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgc2l6ZV90IG9mZnNldCA9IDB1OworICAgIHNpemVfdCBzaXplID0gMHU7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgdmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBzaXplID0gdmlldy5jYXBhY2l0eSgpOworICAgIH0KKyAgICBpZiAoc2l6ZSAmJiB2aWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgdmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gdmlldy5lcnJvcigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBlb3MgPSAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwOworICAgIGJvb2wgY29kZWNDb25maWcgPQorICAgICAgICAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9IDA7CisgICAgaWYgKGNvZGVjQ29uZmlnKSB7CisgICAgICAgIGlmIChzaXplID09IDB1KSB7CisgICAgICAgICAgICBBTE9HRSgiZW1wdHkgY29kZWMgY29uZmlnIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIGNvbnN0X2Nhc3QgYmVjYXVzZSBvZiBsaWJBQUNkZWMgbWV0aG9kIHNpZ25hdHVyZS4KKyAgICAgICAgaW5CdWZmZXIgPSBjb25zdF9jYXN0PHVpbnQ4X3QqPih2aWV3LmRhdGEoKSArIG9mZnNldCk7CisgICAgICAgIGluQnVmZmVyTGVuZ3RoID0gc2l6ZTsKKworICAgICAgICAvKiBHQSBoZWFkZXIgY29uZmlndXJhdGlvbiBzZW50IHRvIERlY29kZXIhICovCisgICAgICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IGNvbmZpZ1hBQUNEZWNvZGVyKGluQnVmZmVyLCBpbkJ1ZmZlckxlbmd0aCk7CisgICAgICAgIGlmIChJQV9OT19FUlJPUiAhPSBlcnJfY29kZSkgeworICAgICAgICAgICAgQUxPR0UoImNvbmZpZ1hBQUNEZWNvZGVyIGVycl9jb2RlID0gJWQiLCBlcnJfY29kZSk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtQ3VyRnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgIG1DdXJUaW1lc3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpOworICAgIG1PdXRwdXREcmFpbkJ1ZmZlcldyaXRlUG9zID0gMDsKKyAgICBjaGFyKiB0ZW1wT3V0cHV0RHJhaW5CdWZmZXIgPSBtT3V0cHV0RHJhaW5CdWZmZXI7CisgICAgd2hpbGUgKHNpemUgPiAwdSkgeworICAgICAgICBpZiAoKGtPdXRwdXREcmFpbkJ1ZmZlclNpemUgKiBzaXplb2YoaW50MTZfdCkgLQorICAgICAgICAgICAgIG1PdXRwdXREcmFpbkJ1ZmZlcldyaXRlUG9zKSA8CisgICAgICAgICAgICAobU91dHB1dEZyYW1lTGVuZ3RoICogc2l6ZW9mKGludDE2X3QpICogbU51bUNoYW5uZWxzKSkgeworICAgICAgICAgICAgQUxPR1YoInNraXBwaW5nIGRlY29kZTogbm90IGVub3VnaCBzcGFjZSBsZWZ0IGluIERyYWluQnVmZmVyIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJpbkF0dHJpYnV0ZSBzaXplID0gJXp1Iiwgc2l6ZSk7CisgICAgICAgIGlmIChtSW50Zi0+aXNBZHRzKCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJBRFRTIik7CisgICAgICAgICAgICBzaXplX3QgYWR0c0hlYWRlclNpemUgPSAwOworICAgICAgICAgICAgLy8gc2tpcCAzMCBiaXRzLCBhYWNfZnJhbWVfbGVuZ3RoIGZvbGxvd3MuCisgICAgICAgICAgICAvLyBzc3Nzc3NzcyBzc3NzaWlpcCBwcGZmZmZQYyBjY29oQ0NsbCBsbGxsbGxsbCBsbGw/Pz8/PworCisgICAgICAgICAgICBjb25zdCB1aW50OF90KiBhZHRzSGVhZGVyID0gdmlldy5kYXRhKCkgKyBvZmZzZXQ7CisgICAgICAgICAgICBib29sIHNpZ25hbEVycm9yID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoc2l6ZSA8IDcpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQXVkaW8gZGF0YSB0b28gc2hvcnQgdG8gY29udGFpbiBldmVuIHRoZSBBRFRTIGhlYWRlci4gIgorICAgICAgICAgICAgICAgICAgICAgICJHb3QgJXp1IGJ5dGVzLiIsIHNpemUpOworICAgICAgICAgICAgICAgIGhleGR1bXAoYWR0c0hlYWRlciwgc2l6ZSk7CisgICAgICAgICAgICAgICAgc2lnbmFsRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBib29sIHByb3RlY3Rpb25BYnNlbnQgPSAoYWR0c0hlYWRlclsxXSAmIDEpOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGFhY19mcmFtZV9sZW5ndGggPSAoKGFkdHNIZWFkZXJbM10gJiAzKSA8PCAxMSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWR0c0hlYWRlcls0XSA8PCAzKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZHRzSGVhZGVyWzVdID4+IDUpOworCisgICAgICAgICAgICAgICAgaWYgKHNpemUgPCBhYWNfZnJhbWVfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGF1ZGlvIGRhdGEgZm9yIHRoZSBjb21wbGV0ZSBmcmFtZS4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiR290ICV6dSBieXRlcywgZnJhbWUgc2l6ZSBhY2NvcmRpbmcgdG8gdGhlIEFEVFMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVhZGVyIGlzICV1IGJ5dGVzLiIsIHNpemUsIGFhY19mcmFtZV9sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBoZXhkdW1wKGFkdHNIZWFkZXIsIHNpemUpOworICAgICAgICAgICAgICAgICAgICBzaWduYWxFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYWR0c0hlYWRlclNpemUgPSAocHJvdGVjdGlvbkFic2VudCA/IDcgOiA5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFhY19mcmFtZV9sZW5ndGggPCBhZHRzSGVhZGVyU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3RfY2FzdCBiZWNhdXNlIG9mIGxpYkFBQ2RlYyBtZXRob2Qgc2lnbmF0dXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dWludDhfdCo+KGFkdHNIZWFkZXIgKyBhZHRzSGVhZGVyU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aCA9IGFhY19mcmFtZV9sZW5ndGggLSBhZHRzSGVhZGVyU2l6ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGFkdHNIZWFkZXJTaXplOworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSAtPSBhZHRzSGVhZGVyU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNpZ25hbEVycm9yKSB7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1YoIk5vbiBBRFRTIik7CisgICAgICAgICAgICAvLyBjb25zdF9jYXN0IGJlY2F1c2Ugb2YgbGliQUFDZGVjIG1ldGhvZCBzaWduYXR1cmUuCisgICAgICAgICAgICBpbkJ1ZmZlciA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KHZpZXcuZGF0YSgpICsgb2Zmc2V0KTsKKyAgICAgICAgICAgIGluQnVmZmVyTGVuZ3RoID0gc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIHNpZ25lZCBpbnQgcHJldlNhbXBsZVJhdGUgPSBtU2FtcEZyZXE7CisgICAgICAgIHNpZ25lZCBpbnQgcHJldk51bUNoYW5uZWxzID0gbU51bUNoYW5uZWxzOworCisgICAgICAgIC8qIFhBQUMgZGVjb2RlciBleHBlY3RzIGZpcnN0IGZyYW1lIHRvIGJlIGZlZCB2aWEgY29uZmlnWEFBQ0RlY29kZXIgQVBJCisgICAgICAgICAqIHdoaWNoIHNob3VsZCBpbml0aWFsaXplIHRoZSBjb2RlYy4gT25jZSB0aGlzIHN0YXRlIGlzIHJlYWNoZWQsIGNhbGwgdGhlCisgICAgICAgICAqIGRlY29kZVhBQUNTdHJlYW0gQVBJIHdpdGggc2FtZSBmcmFtZSB0byBkZWNvZGUhICovCisgICAgICAgIGlmICghbUlzQ29kZWNJbml0aWFsaXplZCkgeworICAgICAgICAgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gY29uZmlnWEFBQ0RlY29kZXIoaW5CdWZmZXIsIGluQnVmZmVyTGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChJQV9OT19FUlJPUiAhPSBlcnJfY29kZSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJjb25maWdYQUFDRGVjb2RlciBGYWlsZWQgMiBlcnJfY29kZSA9ICVkIiwgZXJyX2NvZGUpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChtU2FtcEZyZXEgIT0gcHJldlNhbXBsZVJhdGUpIHx8CisgICAgICAgICAgICAgICAgKG1OdW1DaGFubmVscyAhPSBwcmV2TnVtQ2hhbm5lbHMpKSB7CisgICAgICAgICAgICAgICAgQUxPR0koIlJlY29uZmlndXJpbmcgZGVjb2RlcjogJWQtPiVkIEh6LCAlZC0+JWQgY2hhbm5lbHMiLAorICAgICAgICAgICAgICAgICAgICAgIHByZXZTYW1wbGVSYXRlLCBtU2FtcEZyZXEsIHByZXZOdW1DaGFubmVscywgbU51bUNoYW5uZWxzKTsKKworICAgICAgICAgICAgICAgIEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCBzYW1wbGVSYXRlSW5mbygwdSwgbVNhbXBGcmVxKTsKKyAgICAgICAgICAgICAgICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCBjaGFubmVsQ291bnRJbmZvKDB1LCBtTnVtQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+Y29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgeyAmc2FtcGxlUmF0ZUluZm8sICZjaGFubmVsQ291bnRJbmZvIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBDMl9NQVlfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAmZmFpbHVyZXMpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KHNhbXBsZVJhdGVJbmZvKSk7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShjaGFubmVsQ291bnRJbmZvKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvbmZpZyBVcGRhdGUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNpZ25lZCBpbnQgYnl0ZXNDb25zdW1lZCA9IDA7CisgICAgICAgIElBX0VSUk9SQ09ERSBlcnJvckNvZGUgPSBJQV9OT19FUlJPUjsKKyAgICAgICAgaWYgKG1Jc0NvZGVjSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIG1Jc0NvZGVjQ29uZmlnRmx1c2hSZXF1aXJlZCA9IHRydWU7CisgICAgICAgICAgICBlcnJvckNvZGUgPSBkZWNvZGVYQUFDU3RyZWFtKGluQnVmZmVyLCBpbkJ1ZmZlckxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzQ29uc3VtZWQsICZtTnVtT3V0Qnl0ZXMpOworICAgICAgICB9IGVsc2UgaWYgKCFtSXNDb2RlY0NvbmZpZ0ZsdXNoUmVxdWlyZWQpIHsKKyAgICAgICAgICAgIEFMT0dXKCJBc3N1bXB0aW9uIHRoYXQgZmlyc3QgZnJhbWUgYWZ0ZXIgaGVhZGVyIGluaXRpYWxpemVzIGRlY29kZXIgRmFpbGVkISIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzaXplIC09IGJ5dGVzQ29uc3VtZWQ7CisgICAgICAgIG9mZnNldCArPSBieXRlc0NvbnN1bWVkOworCisgICAgICAgIGlmIChpbkJ1ZmZlckxlbmd0aCAhPSAodWludDMyX3QpYnl0ZXNDb25zdW1lZCkKKyAgICAgICAgICAgIEFMT0dXKCJBbGwgZGF0YSBub3QgY29uc3VtZWQiKTsKKworICAgICAgICAvKiBJbiBjYXNlIG9mIGVycm9yLCBkZWNvZGVyIHdvdWxkIGhhdmUgZ2l2ZW4gb3V0IGVtcHR5IGJ1ZmZlciAqLworICAgICAgICBpZiAoKElBX05PX0VSUk9SICE9IGVycm9yQ29kZSkgJiYgKDAgPT0gbU51bU91dEJ5dGVzKSAmJiBtSXNDb2RlY0luaXRpYWxpemVkKQorICAgICAgICAgICAgbU51bU91dEJ5dGVzID0gbU91dHB1dEZyYW1lTGVuZ3RoICogKG1QY21XZFN6IC8gOCkgKiBtTnVtQ2hhbm5lbHM7CisKKyAgICAgICAgaWYgKCFieXRlc0NvbnN1bWVkKSB7CisgICAgICAgICAgICBBTE9HVygiYnl0ZXNDb25zdW1lZCA9IDAgc2hvdWxkIG5ldmVyIGhhcHBlbiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCh1aW50MzJfdCltTnVtT3V0Qnl0ZXMgPgorICAgICAgICAgICAgbU91dHB1dEZyYW1lTGVuZ3RoICogc2l6ZW9mKGludDE2X3QpICogbU51bUNoYW5uZWxzKSB7CisgICAgICAgICAgICBBTE9HRSgibU51bU91dEJ5dGVzID4gbU91dHB1dEZyYW1lTGVuZ3RoICogc2l6ZW9mKGludDE2X3QpICogbU51bUNoYW5uZWxzLCBzaG91bGQgbmV2ZXIgaGFwcGVuIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKElBX05PX0VSUk9SICE9IGVycm9yQ29kZSkgeworICAgICAgICAgICAgLy8gVE9ETzogY2hlY2sgZm9yIG92ZXJmbG93LCBBU0FOCisgICAgICAgICAgICBtZW1zZXQobU91dHB1dEJ1ZmZlciwgMCwgbU51bU91dEJ5dGVzKTsKKworICAgICAgICAgICAgLy8gRGlzY2FyZCBpbnB1dCBidWZmZXIuCisgICAgICAgICAgICBzaXplID0gMDsKKworICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KHRlbXBPdXRwdXREcmFpbkJ1ZmZlciwgbU91dHB1dEJ1ZmZlciwgbU51bU91dEJ5dGVzKTsKKyAgICAgICAgdGVtcE91dHB1dERyYWluQnVmZmVyICs9IG1OdW1PdXRCeXRlczsKKyAgICAgICAgbU91dHB1dERyYWluQnVmZmVyV3JpdGVQb3MgKz0gbU51bU91dEJ5dGVzOworICAgIH0KKworICAgIGlmIChtT3V0cHV0RHJhaW5CdWZmZXJXcml0ZVBvcykgeworICAgICAgICBmaW5pc2hXb3JrKHdvcmssIHBvb2wpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgfQorICAgIGlmIChlb3MpIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRYYWFjRGVjOjpkcmFpbih1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKSB7CisgICAgKHZvaWQpcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6Y29uZmlnZmx1c2hEZWNvZGUoKSB7CisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlOworICAgIHVpbnQzMl90IHVpX2luaXRfZG9uZTsKKyAgICB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCA9IDgyMDM7CisKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0ZMVVNIX01FTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0NNRF9UWVBFX0ZMVVNIX01FTSIpOworCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJ1ZmZlckxlbmd0aCk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTIik7CisKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0ZMVVNIX01FTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0NNRF9UWVBFX0ZMVVNIX01FTSIpOworCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0RPTkVfUVVFUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9pbml0X2RvbmUpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9DTURfVFlQRV9JTklUX0RPTkVfUVVFUlkiKTsKKworICAgIGlmICh1aV9pbml0X2RvbmUpIHsKKyAgICAgICAgZXJyX2NvZGUgPSBnZXRYQUFDU3RyZWFtSW5mbygpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJnZXRYQUFDU3RyZWFtSW5mbyIpOworICAgICAgICBBTE9HVigiRm91bmQgQ29kZWMgd2l0aCBiZWxvdyBjb25maWctLS1cbnNhbXBGcmVxICVkXG5udW1DaGFubmVscyAlZFxucGNtV2RTeiAlZFxuY2hhbm5lbE1hc2sgJWRcbm91dHB1dEZyYW1lTGVuZ3RoICVkIiwKKyAgICAgICAgICAgICAgIG1TYW1wRnJlcSwgbU51bUNoYW5uZWxzLCBtUGNtV2RTeiwgbUNoYW5uZWxNYXNrLCBtT3V0cHV0RnJhbWVMZW5ndGgpOworICAgICAgICBtSXNDb2RlY0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRYYWFjRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIGlmIChtSXNDb2RlY0luaXRpYWxpemVkKSB7CisgICAgICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IGNvbmZpZ2ZsdXNoRGVjb2RlKCk7CisgICAgICAgIGlmIChlcnJfY29kZSAhPSBJQV9OT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoIkVycm9yIGluIGNvbmZpZ2ZsdXNoRGVjb2RlOiBFcnJvciAlZCIsIGVycl9jb2RlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBkcmFpbkRlY29kZXIoKTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK0lBX0VSUk9SQ09ERSBDMlNvZnRYYWFjRGVjOjpkcmFpbkRlY29kZXIoKSB7CisgICAgLyogT3V0cHV0IGRlbGF5IGNvbXBlbnNhdGlvbiBsb2dpYyBzaG91bGQgc2l0IGhlcmUuICovCisgICAgLyogTm90aGluZyB0byBiZSBkb25lIGFzIFhBQUMgZGVjb2RlciBkb2VzIG5vdCBpbnRyb2R1Y2Ugb3V0cHV0IGJ1ZmZlciBkZWxheSAqLworCisgICAgcmV0dXJuIDA7Cit9CisKK0lBX0VSUk9SQ09ERSBDMlNvZnRYYWFjRGVjOjppbml0WEFBQ0RlY29kZXIoKSB7CisgICAgLyogRmlyc3QgcGFydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIEVycm9yIEhhbmRsZXIgSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBHZXQgTGlicmFyeSBOYW1lLCBMaWJyYXJ5IFZlcnNpb24gYW5kIEFQSSBWZXJzaW9uICovCisgICAgLyogSW5pdGlhbGl6ZSBBUEkgc3RydWN0dXJlICsgRGVmYXVsdCBjb25maWcgc2V0ICAgICAqLworICAgIC8qIFNldCBjb25maWcgcGFyYW1zIGZyb20gdXNlciAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBJbml0aWFsaXplIG1lbW9yeSB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogR2V0IG1lbW9yeSBpbmZvcm1hdGlvbiBhbmQgYWxsb2NhdGUgbWVtb3J5ICAgICAgICAqLworCisgICAgbUlucHV0QnVmZmVyU2l6ZSA9IDA7CisgICAgbUlucHV0QnVmZmVyID0gbnVsbHB0cjsKKyAgICBtT3V0cHV0QnVmZmVyID0gbnVsbHB0cjsKKyAgICAvKiBQcm9jZXNzIHN0cnVjdCBpbml0aW5nIGVuZCAqLworCisgICAgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIEluaXRpYWxpemUgQVBJIHN0cnVjdHVyZSBhbmQgc2V0IGNvbmZpZyBwYXJhbXMgdG8gZGVmYXVsdCAgICAgICAgKi8KKyAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogQVBJIHNpemUgKi8KKyAgICB1aW50MzJfdCBwdWlfYXBpX3NpemU7CisgICAgLyogR2V0IHRoZSBBUEkgc2l6ZSAqLworICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX0FQSV9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwdWlfYXBpX3NpemUpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9BUElfQ01EX0dFVF9BUElfU0laRSIpOworCisgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBBUEkgKi8KKyAgICBtWGhlYWFjQ29kZWNIYW5kbGUgPSBtZW1hbGlnbig0LCBwdWlfYXBpX3NpemUpOworICAgIGlmICghbVhoZWFhY0NvZGVjSGFuZGxlKSB7CisgICAgICAgIEFMT0dFKCJtYWxsb2MgZm9yIHB1aV9hcGlfc2l6ZSArIDQgPj4gJWQgRmFpbGVkIiwgcHVpX2FwaV9zaXplICsgNCk7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CisgICAgbU1lbW9yeVZlYy5wdXNoKG1YaGVhYWNDb2RlY0hhbmRsZSk7CisKKyAgICAvKiBTZXQgdGhlIGNvbmZpZyBwYXJhbXMgdG8gZGVmYXVsdCB2YWx1ZXMgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0lOSVRfQVBJX1BSRV9DT05GSUdfUEFSQU1TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQ01EX1RZUEVfSU5JVF9BUElfUFJFX0NPTkZJR19QQVJBTVMiKTsKKworICAgIC8qIEdldCB0aGUgQVBJIHNpemUgKi8KKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG51bGxwdHIsIElBX0FQSV9DTURfR0VUX0FQSV9TSVpFLCAwLCAmcHVpX2FwaV9zaXplKTsKKworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX0FQSV9TSVpFIik7CisKKyAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIEFQSSAqLworICAgIG1NcGVnRERyY0hhbmRsZSA9IG1lbWFsaWduKDQsIHB1aV9hcGlfc2l6ZSk7CisgICAgaWYgKCFtTXBlZ0REcmNIYW5kbGUpIHsKKyAgICAgICAgQUxPR0UoIm1hbGxvYyBmb3IgcHVpX2FwaV9zaXplICsgNCA+PiAlZCBGYWlsZWQiLCBwdWlfYXBpX3NpemUgKyA0KTsKKyAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KKyAgICBtTWVtb3J5VmVjLnB1c2gobU1wZWdERHJjSGFuZGxlKTsKKworICAgIC8qIFNldCB0aGUgY29uZmlnIHBhcmFtcyB0byBkZWZhdWx0IHZhbHVlcyAqLworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0FQSV9QUkVfQ09ORklHX1BBUkFNUywgbnVsbHB0cik7CisKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9DTURfVFlQRV9JTklUX0FQSV9QUkVfQ09ORklHX1BBUkFNUyIpOworCisgICAgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIFNldCBjb25maWcgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgdWludDMyX3QgdWlfbXA0X2ZsYWcgPSAxOworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0lTTVA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfbXA0X2ZsYWcpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fSVNNUDQiKTsKKworICAgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBJbml0aWFsaXplIE1lbW9yeSBpbmZvIHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIHVpbnQzMl90IHVpX3Byb2NfbWVtX3RhYnNfc2l6ZTsKKyAgICBwVk9JRCBwdl9hbGxvY19wdHI7CisgICAgLyogR2V0IG1lbW9yeSBpbmZvIHRhYmxlcyBzaXplICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfTUVNVEFCU19TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfcHJvY19tZW1fdGFic19zaXplKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9HRVRfTUVNVEFCU19TSVpFIik7CisKKyAgICBwdl9hbGxvY19wdHIgPSBtZW1hbGlnbig0LCB1aV9wcm9jX21lbV90YWJzX3NpemUpOworICAgIGlmICghcHZfYWxsb2NfcHRyKSB7CisgICAgICAgIEFMT0dFKCJNYWxsb2MgZm9yIHNpemUgKHVpX3Byb2NfbWVtX3RhYnNfc2l6ZSArIDQpID0gJWQgZmFpbGVkISIsIHVpX3Byb2NfbWVtX3RhYnNfc2l6ZSArIDQpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorICAgIG1NZW1vcnlWZWMucHVzaChwdl9hbGxvY19wdHIpOworCisgICAgLyogU2V0IHBvaW50ZXIgZm9yIHByb2Nlc3MgbWVtb3J5IHRhYmxlcyAgICAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX01FTVRBQlNfUFRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdl9hbGxvY19wdHIpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9BUElfQ01EX1NFVF9NRU1UQUJTX1BUUiIpOworCisgICAgLyogaW5pdGlhbGl6ZSB0aGUgQVBJLCBwb3N0IGNvbmZpZywgZmlsbCBtZW1vcnkgdGFibGVzICAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9BUElfUE9TVF9DT05GSUdfUEFSQU1TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQ01EX1RZUEVfSU5JVF9BUElfUE9TVF9DT05GSUdfUEFSQU1TIik7CisKKyAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogQWxsb2NhdGUgTWVtb3J5IHdpdGggaW5mbyBmcm9tIGxpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBUaGVyZSBhcmUgZm91ciBkaWZmZXJlbnQgdHlwZXMgb2YgbWVtb3JpZXMsIHRoYXQgbmVlZHMgdG8gYmUgYWxsb2NhdGVkICovCisgICAgLyogcGVyc2lzdGVudCxzY3JhdGNoLGlucHV0IGFuZCBvdXRwdXQgKi8KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBpbnQgdWlfc2l6ZSA9IDAsIHVpX2FsaWdubWVudCA9IDAsIHVpX3R5cGUgPSAwOworCisgICAgICAgIC8qIEdldCBtZW1vcnkgc2l6ZSAqLworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfc2l6ZSk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19TSVpFIik7CisKKyAgICAgICAgLyogR2V0IG1lbW9yeSBhbGlnbm1lbnQgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX01FTV9JTkZPX0FMSUdOTUVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfYWxpZ25tZW50KTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX0FMSUdOTUVOVCIpOworCisgICAgICAgIC8qIEdldCBtZW1vcnkgdHlwZSAqLworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfdHlwZSk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19UWVBFIik7CisKKyAgICAgICAgcHZfYWxsb2NfcHRyID0gbWVtYWxpZ24odWlfYWxpZ25tZW50LCB1aV9zaXplKTsKKyAgICAgICAgaWYgKCFwdl9hbGxvY19wdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJNYWxsb2MgZm9yIHNpemUgKHVpX3NpemUgKyB1aV9hbGlnbm1lbnQpID0gJWQgZmFpbGVkISIsCisgICAgICAgICAgICAgICAgICAgdWlfc2l6ZSArIHVpX2FsaWdubWVudCk7CisgICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgbU1lbW9yeVZlYy5wdXNoKHB2X2FsbG9jX3B0cik7CisKKyAgICAgICAgLyogU2V0IHRoZSBidWZmZXIgcG9pbnRlciAqLworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdl9hbGxvY19wdHIpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiIpOworICAgICAgICBpZiAodWlfdHlwZSA9PSBJQV9NRU1UWVBFX0lOUFVUKSB7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSAocFdPUkQ4KXB2X2FsbG9jX3B0cjsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlclNpemUgPSB1aV9zaXplOworICAgICAgICB9CisgICAgICAgIGlmICh1aV90eXBlID09IElBX01FTVRZUEVfT1VUUFVUKQorICAgICAgICAgICAgbU91dHB1dEJ1ZmZlciA9IChwV09SRDgpcHZfYWxsb2NfcHRyOworICAgIH0KKyAgICAvKiBFbmQgZmlyc3QgcGFydCAqLworCisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorCitzdGF0dXNfdCBDMlNvZnRYYWFjRGVjOjppbml0WEFBQ0RyYygpIHsKKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBJQV9OT19FUlJPUjsKKyAgICB1bnNpZ25lZCBpbnQgdWlfZHJjX3ZhbDsKKyAgICAvLyAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfVEFSR0VUCisgICAgaW50MzJfdCB0YXJnZXRSZWZMZXZlbCA9IG1JbnRmLT5nZXREcmNUYXJnZXRSZWZMZXZlbCgpOworICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBkZXNpcmVkIERSQyB0YXJnZXQgcmVmZXJlbmNlIGxldmVsIG9mICVkIiwgdGFyZ2V0UmVmTGV2ZWwpOworICAgIHVpX2RyY192YWwgPSAodW5zaWduZWQgaW50KXRhcmdldFJlZkxldmVsOworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19UQVJHRVRfTEVWRUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9kcmNfdmFsKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19UQVJHRVRfTEVWRUwiKTsKKworICAgIC8qIFVzZSB1aV9kcmNfdmFsIGZyb20gUFJPUF9EUkNfT1ZFUlJJREVfUkVGX0xFVkVMIG9yIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwKKyAgICAgKiBmb3IgSUFfRU5IQUFDUExVU19ERUNfRFJDX1RBUkdFVF9MT1VETkVTUyB0b28gKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0RSQ19UQVJHRVRfTE9VRE5FU1MsICZ1aV9kcmNfdmFsKTsKKworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0RSQ19UQVJHRVRfTE9VRE5FU1MiKTsKKworICAgIGludDMyX3QgYXR0ZW51YXRpb25GYWN0b3IgPSBtSW50Zi0+Z2V0RHJjQXR0ZW51YXRpb25GYWN0b3IoKTsKKyAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZGVzaXJlZCBEUkMgYXR0ZW51YXRpb24gZmFjdG9yIG9mICVkIiwgYXR0ZW51YXRpb25GYWN0b3IpOworICAgIHVpX2RyY192YWwgPSAodW5zaWduZWQgaW50KWF0dGVudWF0aW9uRmFjdG9yOworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19DVVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9kcmNfdmFsKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19DVVQiKTsKKworICAgIC8vICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9CT09TVF9GQUNUT1IKKyAgICBpbnQzMl90IGJvb3N0RmFjdG9yID0gbUludGYtPmdldERyY0Jvb3N0RmFjdG9yKCk7CisgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIGRlc2lyZWQgRFJDIGJvb3N0IGZhY3RvciBvZiAlZCIsIGJvb3N0RmFjdG9yKTsKKyAgICB1aV9kcmNfdmFsID0gKHVuc2lnbmVkIGludClib29zdEZhY3RvcjsKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfQk9PU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9kcmNfdmFsKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19CT09TVCIpOworCisgICAgLy8gIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0hFQVZZCisgICAgaW50MzJfdCBjb21wcmVzc01vZGUgPSBtSW50Zi0+Z2V0RHJjQ29tcHJlc3NNb2RlKCk7CisgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIGRlc3JpZWQgRFJDIGhlYXZ5IGNvbXByZXNzaW9uIHN3aXRjaCBvZiAlZCIsIGNvbXByZXNzTW9kZSk7CisgICAgdWlfZHJjX3ZhbCA9ICh1bnNpZ25lZCBpbnQpY29tcHJlc3NNb2RlOworCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0hFQVZZX0NPTVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9kcmNfdmFsKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19IRUFWWV9DT01QIik7CisKKyAgICAvLyBBQUNfVU5JRFJDX1NFVF9FRkZFQ1QKKyAgICBpbnQzMl90IGVmZmVjdFR5cGUgPSBtSW50Zi0+Z2V0RHJjRWZmZWN0VHlwZSgpOworICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBNUEVHLUQgRFJDIGVmZmVjdCB0eXBlICVkIiwgZWZmZWN0VHlwZSk7CisgICAgdWlfZHJjX3ZhbCA9ICh1bnNpZ25lZCBpbnQpZWZmZWN0VHlwZTsKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0RSQ19FRkZFQ1RfVFlQRSwgJnVpX2RyY192YWwpOworCisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfRFJDX0VGRkVDVF9UWVBFIik7CisKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7Cit9CisKK0lBX0VSUk9SQ09ERSBDMlNvZnRYYWFjRGVjOjpkZUluaXRYQUFDRGVjb2RlcigpIHsKKyAgICBBTE9HVigiZGVJbml0WEFBQ0RlY29kZXIiKTsKKworICAgIC8qIEVycm9yIGNvZGUgKi8KKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBJQV9OT19FUlJPUjsKKworICAgIGlmIChtWGhlYWFjQ29kZWNIYW5kbGUpIHsKKyAgICAgICAgLyogVGVsbCB0aGF0IHRoZSBpbnB1dCBpcyBvdmVyIGluIHRoaXMgYnVmZmVyICovCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0lOUFVUX09WRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgfQorCisgICAgLyogSXJyZXNwZWN0aXZlIG9mIGVycm9yIHJldHVybmVkIGluIElBX0FQSV9DTURfSU5QVVRfT1ZFUiwgZnJlZSBhbGxvY2F0ZWQgbWVtb3J5ICovCisgICAgZm9yICh2b2lkKiBidWYgOiBtTWVtb3J5VmVjKSB7CisgICAgICAgIGlmIChidWYpIGZyZWUoYnVmKTsKKyAgICB9CisgICAgbU1lbW9yeVZlYy5jbGVhcigpOworICAgIG1YaGVhYWNDb2RlY0hhbmRsZSA9IG51bGxwdHI7CisKKyAgICByZXR1cm4gZXJyX2NvZGU7Cit9CisKK0lBX0VSUk9SQ09ERSBDMlNvZnRYYWFjRGVjOjpkZUluaXRNUEVHREREcmMoKSB7CisgICAgQUxPR1YoImRlSW5pdE1QRUdERERyYyIpOworCisgICAgZm9yICh2b2lkKiBidWYgOiBtRHJjTWVtb3J5VmVjKSB7CisgICAgICAgIGlmIChidWYpIGZyZWUoYnVmKTsKKyAgICB9CisgICAgbURyY01lbW9yeVZlYy5jbGVhcigpOworICAgIHJldHVybiBJQV9OT19FUlJPUjsKK30KKworSUFfRVJST1JDT0RFIEMyU29mdFhhYWNEZWM6OmNvbmZpZ1hBQUNEZWNvZGVyKHVpbnQ4X3QqIGluQnVmZmVyLCB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCkgeworICAgIGlmIChtSW5wdXRCdWZmZXJTaXplIDwgaW5CdWZmZXJMZW5ndGgpIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBjb25maWcgQUFDLCBpbnB1dCBidWZmZXIgc2l6ZSAlZCA8IGluQnVmZmVyTGVuZ3RoICVkIiwgbUlucHV0QnVmZmVyU2l6ZSwgaW5CdWZmZXJMZW5ndGgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8qIENvcHkgdGhlIGJ1ZmZlciBwYXNzZWQgYnkgQW5kcm9pZCBwbHVnaW4gdG8gY29kZWMgaW5wdXQgYnVmZmVyICovCisgICAgbWVtY3B5KG1JbnB1dEJ1ZmZlciwgaW5CdWZmZXIsIGluQnVmZmVyTGVuZ3RoKTsKKworICAgIC8qIFNldCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcHJvY2Vzc2VkICovCisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5CdWZmZXJMZW5ndGgpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFUyIpOworCisgICAgaWYgKG1Jc0NvZGVjQ29uZmlnRmx1c2hSZXF1aXJlZCkgeworICAgICAgICAvKiBJZiBjb2RlYyBpcyBhbHJlYWR5IGluaXRpYWxpemVkLCB0aGVuIEdBIGhlYWRlciBpcyBwYXNzZWQgYWdhaW4gKi8KKyAgICAgICAgLyogTmVlZCB0byBjYWxsIHRoZSBGbHVzaCBBUEkgaW5zdGVhZCBvZiBJTklUX1BST0NFU1MgKi8KKyAgICAgICAgbUlzQ29kZWNJbml0aWFsaXplZCA9IGZhbHNlOyAvKiBDb2RlYyBuZWVkcyB0byBiZSBSZWluaXRpYWxpemVkIGFmdGVyIGZsdXNoICovCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9HQV9IRFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0NNRF9UWVBFX0dBX0hEUiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIHByb2Nlc3MgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0lOSVRfUFJPQ0VTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQ01EX1RZUEVfSU5JVF9QUk9DRVNTIik7CisgICAgfQorCisgICAgdWludDMyX3QgdWlfaW5pdF9kb25lOworICAgIC8qIENoZWNraW5nIGZvciBlbmQgb2YgaW5pdGlhbGl6YXRpb24gKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0lOSVRfRE9ORV9RVUVSWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2luaXRfZG9uZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0NNRF9UWVBFX0lOSVRfRE9ORV9RVUVSWSIpOworCisgICAgLyogSG93IG11Y2ggYnVmZmVyIGlzIHVzZWQgaW4gaW5wdXQgYnVmZmVycyAqLworICAgIGludDMyX3QgaV9ieXRlc19jb25zdW1lZDsKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9DVVJJRFhfSU5QVVRfQlVGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaV9ieXRlc19jb25zdW1lZCk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfR0VUX0NVUklEWF9JTlBVVF9CVUYiKTsKKworICAgIGlmICh1aV9pbml0X2RvbmUpIHsKKyAgICAgICAgZXJyX2NvZGUgPSBnZXRYQUFDU3RyZWFtSW5mbygpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJnZXRYQUFDU3RyZWFtSW5mbyIpOworICAgICAgICBBTE9HSSgiRm91bmQgQ29kZWMgd2l0aCBiZWxvdyBjb25maWctLS1cbnNhbXBGcmVxICVkXG5udW1DaGFubmVscyAlZFxucGNtV2RTeiAlZFxuY2hhbm5lbE1hc2sgJWRcbm91dHB1dEZyYW1lTGVuZ3RoICVkIiwKKyAgICAgICAgICAgICAgIG1TYW1wRnJlcSwgbU51bUNoYW5uZWxzLCBtUGNtV2RTeiwgbUNoYW5uZWxNYXNrLCBtT3V0cHV0RnJhbWVMZW5ndGgpOworICAgICAgICBtSXNDb2RlY0luaXRpYWxpemVkID0gdHJ1ZTsKKworICAgICAgICBlcnJfY29kZSA9IGNvbmZpZ01QRUdERHJjKCk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgImNvbmZpZ01QRUdERHJjIik7CisgICAgfQorCisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorSUFfRVJST1JDT0RFIEMyU29mdFhhYWNEZWM6OmluaXRNUEVHREREcmMoKSB7CisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IChXT1JEMzIpMjsgaSsrKSB7CisgICAgICAgIFdPUkQzMiB1aV9zaXplLCB1aV9hbGlnbm1lbnQsIHVpX3R5cGU7CisgICAgICAgIHBWT0lEIHB2X2FsbG9jX3B0cjsKKworICAgICAgICAvKiBHZXQgbWVtb3J5IHNpemUgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfR0VUX01FTV9JTkZPX1NJWkUsIGksICZ1aV9zaXplKTsKKworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19TSVpFIik7CisKKyAgICAgICAgLyogR2V0IG1lbW9yeSBhbGlnbm1lbnQgKi8KKyAgICAgICAgZXJyX2NvZGUgPQorICAgICAgICAgICAgaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19BTElHTk1FTlQsIGksICZ1aV9hbGlnbm1lbnQpOworCisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX0FMSUdOTUVOVCIpOworCisgICAgICAgIC8qIEdldCBtZW1vcnkgdHlwZSAqLworICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fVFlQRSwgaSwgJnVpX3R5cGUpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19UWVBFIik7CisKKyAgICAgICAgcHZfYWxsb2NfcHRyID0gbWVtYWxpZ24oNCwgdWlfc2l6ZSk7CisgICAgICAgIGlmIChwdl9hbGxvY19wdHIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIiBDYW5ub3QgY3JlYXRlIHJlcXVlc3RlZCBtZW1vcnkgICVkIiwgdWlfc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgbURyY01lbW9yeVZlYy5wdXNoKHB2X2FsbG9jX3B0cik7CisKKyAgICAgICAgLyogU2V0IHRoZSBidWZmZXIgcG9pbnRlciAqLworICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiwgaSwgcHZfYWxsb2NfcHRyKTsKKworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1fUFRSIik7CisgICAgfQorCisgICAgV09SRDMyIHVpX3NpemU7CisgICAgdWlfc2l6ZSA9IDgxOTIgKiAyOworCisgICAgbURyY0luQnVmID0gKGludDhfdCopbWVtYWxpZ24oNCwgdWlfc2l6ZSk7CisgICAgaWYgKG1EcmNJbkJ1ZiA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIgQ2Fubm90IGNyZWF0ZSByZXF1ZXN0ZWQgbWVtb3J5ICAlZCIsIHVpX3NpemUpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorICAgIG1EcmNNZW1vcnlWZWMucHVzaChtRHJjSW5CdWYpOworCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTV9QVFIsIDIsIG1EcmNJbkJ1Zik7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiIpOworCisgICAgbURyY091dEJ1ZiA9IChpbnQ4X3QqKW1lbWFsaWduKDQsIHVpX3NpemUpOworICAgIGlmIChtRHJjT3V0QnVmID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiBDYW5ub3QgY3JlYXRlIHJlcXVlc3RlZCBtZW1vcnkgICVkIiwgdWlfc2l6ZSk7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CisgICAgbURyY01lbW9yeVZlYy5wdXNoKG1EcmNPdXRCdWYpOworCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTV9QVFIsIDMsIG1EcmNPdXRCdWYpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTV9QVFIiKTsKKworICAgIHJldHVybiBJQV9OT19FUlJPUjsKK30KK2ludCBDMlNvZnRYYWFjRGVjOjpjb25maWdNUEVHRERyYygpIHsKKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBJQV9OT19FUlJPUjsKKyAgICBpbnQgaV9lZmZlY3RfdHlwZTsKKyAgICBpbnQgaV9sb3VkX25vcm07CisgICAgaW50IGlfdGFyZ2V0X2xvdWRuZXNzOworICAgIHVuc2lnbmVkIGludCBpX3Nicl9tb2RlOworCisgICAgLyogU2FtcGxpbmcgRnJlcXVlbmN5ICovCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX1NBTVBfRlJFUSwgJm1TYW1wRnJlcSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fU0FNUF9GUkVRIik7CisgICAgLyogVG90YWwgTnVtYmVyIG9mIENoYW5uZWxzICovCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX05VTV9DSEFOTkVMUywgJm1OdW1DaGFubmVscyk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fTlVNX0NIQU5ORUxTIik7CisKKyAgICAvKiBQQ00gd29yZCBzaXplICAqLworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9QQ01fV0RTWiwgJm1QY21XZFN6KTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9QQ01fV0RTWiIpOworCisgICAgLypTZXQgRWZmZWN0IFR5cGUqLworCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0VGRkVDVF9UWVBFLCAmaV9lZmZlY3RfdHlwZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19FRkZFQ1RfVFlQRSIpOworCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX0RSQ19FRkZFQ1RfVFlQRSwgJmlfZWZmZWN0X3R5cGUpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX0RSQ19FRkZFQ1RfVFlQRSIpOworCisgICAgLypTZXQgdGFyZ2V0IGxvdWRuZXNzICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX1RBUkdFVF9MT1VETkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlfdGFyZ2V0X2xvdWRuZXNzKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX1RBUkdFVF9MT1VETkVTUyIpOworCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX0RSQ19UQVJHRVRfTE9VRE5FU1MsICZpX3RhcmdldF9sb3VkbmVzcyk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfRFJDX1RBUkdFVF9MT1VETkVTUyIpOworCisgICAgLypTZXQgbG91ZF9ub3JtX2ZsYWcqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19MT1VEX05PUk0sICZpX2xvdWRfbm9ybSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19MT1VEX05PUk0iKTsKKworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19EUkNfTE9VRF9OT1JNLCAmaV9sb3VkX25vcm0pOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX0RSQ19MT1VEX05PUk0iKTsKKworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1NCUl9NT0RFLCAmaV9zYnJfbW9kZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1NCUl9NT0RFIik7CisKKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9BUElfUE9TVF9DT05GSUdfUEFSQU1TLCBudWxscHRyKTsKKworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0NNRF9UWVBFX0lOSVRfQVBJX1BPU1RfQ09ORklHX1BBUkFNUyIpOworCisgICAgLyogRnJlZSBhbnkgbWVtb3J5IHRoYXQgaXMgYWxsb2NhdGVkIGZvciBNUEVHIEQgRHJjIHNvIGZhciAqLworICAgIGRlSW5pdE1QRUdERERyYygpOworCisgICAgZXJyX2NvZGUgPSBpbml0TVBFR0RERHJjKCk7CisgICAgaWYgKGVycl9jb2RlICE9IElBX05PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJpbml0TVBFR0RERHJjIGZhaWxlZCB3aXRoIGVycm9yICVkIiwgZXJyX2NvZGUpOworICAgICAgICBkZUluaXRNUEVHREREcmMoKTsKKyAgICAgICAgcmV0dXJuIGVycl9jb2RlOworICAgIH0KKworICAgIC8qIERSQyBidWZmZXJzCisgICAgICAgIGJ1ZlswXSAtIGNvbnRhaW5zIGV4dGVuc2lvbiBlbGVtZW50IHBheSBsb2FkIGxvdWRuZXNzIHJlbGF0ZWQKKyAgICAgICAgYnVmWzFdIC0gY29udGFpbnMgZXh0ZW5zaW9uIGVsZW1lbnQgcGF5IGxvYWQqLworICAgIHsKKyAgICAgICAgVk9JRCogcF9hcnJheVsyXVsxNl07CisgICAgICAgIFdPUkQzMiBpaTsKKyAgICAgICAgV09SRDMyIGJ1Zl9zaXplc1syXVsxNl07CisgICAgICAgIFdPUkQzMiBudW1fZWxlbWVudHM7CisgICAgICAgIFdPUkQzMiBudW1fY29uZmlnX2V4dDsKKyAgICAgICAgV09SRDMyIGJpdF9zdHJfZm10ID0gMTsKKworICAgICAgICBXT1JEMzIgdW9fbnVtX2NoYW47CisKKyAgICAgICAgbWVtc2V0KGJ1Zl9zaXplcywgMCwgMzIgKiBzaXplb2YoV09SRDMyKSk7CisKKyAgICAgICAgZXJyX2NvZGUgPQorICAgICAgICAgICAgaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX0VYVF9FTEVfQlVGX1NJWkVTLCAmYnVmX3NpemVzWzBdWzBdKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX0VYVF9FTEVfQlVGX1NJWkVTIik7CisKKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX0VYVF9FTEVfUFRSLCAmcF9hcnJheSk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19FWFRfRUxFX1BUUiIpOworCisgICAgICAgIGVycl9jb2RlID0KKyAgICAgICAgICAgIGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULCBJQV9DTURfVFlQRV9JTklUX1NFVF9CVUZGX1BUUiwgbnVsbHB0cik7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0NNRF9UWVBFX0lOSVRfU0VUX0JVRkZfUFRSIik7CisKKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX05VTV9FTEUsICZudW1fZWxlbWVudHMpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfTlVNX0VMRSIpOworCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19OVU1fQ09ORklHX0VYVCwgJm51bV9jb25maWdfZXh0KTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX05VTV9DT05GSUdfRVhUIik7CisKKyAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgbnVtX2NvbmZpZ19leHQ7IGlpKyspIHsKKyAgICAgICAgICAgIC8qY29weSBsb3VkbmVzcyBiaXRzdHJlYW0qLworICAgICAgICAgICAgaWYgKGJ1Zl9zaXplc1swXVtpaV0gPiAwKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KG1EcmNJbkJ1ZiwgcF9hcnJheVswXVtpaV0sIGJ1Zl9zaXplc1swXVtpaV0pOworCisgICAgICAgICAgICAgICAgLypTZXQgYml0c3RyZWFtX3NwbGl0X2Zvcm1hdCAqLworICAgICAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9CSVRTX0ZPUk1BVCwgJmJpdF9zdHJfZm10KTsKKyAgICAgICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9CSVRTX0ZPUk1BVCIpOworCisgICAgICAgICAgICAgICAgLyogU2V0IG51bWJlciBvZiBieXRlcyB0byBiZSBwcm9jZXNzZWQgKi8KKyAgICAgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVNfSUxfQlMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmX3NpemVzWzBdW2lpXSk7CisgICAgICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVNfSUxfQlMiKTsKKworICAgICAgICAgICAgICAgIC8qIEV4ZWN1dGUgcHJvY2VzcyAqLworICAgICAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0NQWV9JTF9CU0ZfQlVGRiwgbnVsbHB0cik7CisgICAgICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQ01EX1RZUEVfSU5JVF9DUFlfSUxfQlNGX0JVRkYiKTsKKworICAgICAgICAgICAgICAgIG1EUkNGbGFnID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IG51bV9lbGVtZW50czsgaWkrKykgeworICAgICAgICAgICAgLypjb3B5IGNvbmZpZyBiaXRzdHJlYW0qLworICAgICAgICAgICAgaWYgKGJ1Zl9zaXplc1sxXVtpaV0gPiAwKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KG1EcmNJbkJ1ZiwgcF9hcnJheVsxXVtpaV0sIGJ1Zl9zaXplc1sxXVtpaV0pOworICAgICAgICAgICAgICAgIC8qIFNldCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcHJvY2Vzc2VkICovCisKKyAgICAgICAgICAgICAgICAvKlNldCBiaXRzdHJlYW1fc3BsaXRfZm9ybWF0ICovCisgICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0JJVFNfRk9STUFULCAmYml0X3N0cl9mbXQpOworICAgICAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0JJVFNfRk9STUFUIik7CisKKyAgICAgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVNfSUNfQlMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmX3NpemVzWzFdW2lpXSk7CisgICAgICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVNfSUNfQlMiKTsKKworICAgICAgICAgICAgICAgIC8qIEV4ZWN1dGUgcHJvY2VzcyAqLworICAgICAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0NQWV9JQ19CU0ZfQlVGRiwgbnVsbHB0cik7CisKKyAgICAgICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9DTURfVFlQRV9JTklUX0NQWV9JQ19CU0ZfQlVGRiIpOworCisgICAgICAgICAgICAgICAgbURSQ0ZsYWcgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1EUkNGbGFnID09IDEpIHsKKyAgICAgICAgICAgIG1NcGVnRERSQ1ByZXNlbnQgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU1wZWdERFJDUHJlc2VudCA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKlJlYWQgaW50ZXJmYWNlIGJ1ZmZlciBjb25maWcgZmlsZSBiaXRzdHJlYW0qLworICAgICAgICBpZiAobU1wZWdERFJDUHJlc2VudCA9PSAxKSB7CisgICAgICAgICAgICBXT1JEMzIgaW50ZXJmYWNlX2lzX3ByZXNlbnQgPSAxOworCisgICAgICAgICAgICBpZiAoaV9zYnJfbW9kZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGlfc2JyX21vZGUgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBtT3V0cHV0RnJhbWVMZW5ndGggPSAyMDQ4OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaV9zYnJfbW9kZSA9PSAzKSB7CisgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRGcmFtZUxlbmd0aCA9IDQwOTY7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbU91dHB1dEZyYW1lTGVuZ3RoID0gMTAyNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1PdXRwdXRGcmFtZUxlbmd0aCA9IDQwOTY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0ZSQU1FX1NJWkUsIChXT1JEMzIgKikmbU91dHB1dEZyYW1lTGVuZ3RoKTsKKyAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0ZSQU1FX1NJWkUiKTsKKworICAgICAgICAgICAgZXJyX2NvZGUgPQorICAgICAgICAgICAgICAgIGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0lOVF9QUkVTRU5ULCAmaW50ZXJmYWNlX2lzX3ByZXNlbnQpOworICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fSU5UX1BSRVNFTlQiKTsKKworICAgICAgICAgICAgLyogRXhlY3V0ZSBwcm9jZXNzICovCisgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0NQWV9JTl9CU0ZfQlVGRiwgbnVsbHB0cik7CisgICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9DTURfVFlQRV9JTklUX0NQWV9JTl9CU0ZfQlVGRiIpOworCisgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX1BST0NFU1MsIG51bGxwdHIpOworICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQ01EX1RZUEVfSU5JVF9QUk9DRVNTIik7CisKKyAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX05VTV9DSEFOTkVMUywgJnVvX251bV9jaGFuKTsKKyAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX1BBUkFNX05VTV9DSEFOTkVMUyIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGVycl9jb2RlOworfQorCitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6ZGVjb2RlWEFBQ1N0cmVhbSh1aW50OF90KiBpbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogYnl0ZXNDb25zdW1lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIG91dEJ5dGVzKSB7CisgICAgaWYgKG1JbnB1dEJ1ZmZlclNpemUgPCBpbkJ1ZmZlckxlbmd0aCkgeworICAgICAgICBBTE9HRSgiQ2Fubm90IGNvbmZpZyBBQUMsIGlucHV0IGJ1ZmZlciBzaXplICVkIDwgaW5CdWZmZXJMZW5ndGggJWQiLCBtSW5wdXRCdWZmZXJTaXplLCBpbkJ1ZmZlckxlbmd0aCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgLyogQ29weSB0aGUgYnVmZmVyIHBhc3NlZCBieSBBbmRyb2lkIHBsdWdpbiB0byBjb2RlYyBpbnB1dCBidWZmZXIgKi8KKyAgICBtZW1jcHkobUlucHV0QnVmZmVyLCBpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgpOworCisgICAgLyogU2V0IG51bWJlciBvZiBieXRlcyB0byBiZSBwcm9jZXNzZWQgKi8KKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJ1ZmZlckxlbmd0aCk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTIik7CisKKyAgICAvKiBFeGVjdXRlIHByb2Nlc3MgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0VYRUNVVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0RPX0VYRUNVVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9DTURfVFlQRV9ET19FWEVDVVRFIik7CisKKyAgICAvKiBDaGVja2luZyBmb3IgZW5kIG9mIHByb2Nlc3NpbmcgKi8KKyAgICB1aW50MzJfdCB1aV9leGVjX2RvbmU7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9FWEVDVVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9ET05FX1FVRVJZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfZXhlY19kb25lKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQ01EX1RZUEVfRE9ORV9RVUVSWSIpOworCisgICAgaWYgKHVpX2V4ZWNfZG9uZSAhPSAxKSB7CisgICAgICAgIFZPSUQqIHBfYXJyYXk7ICAgICAgICAvLyBJVFRJQU06YnVmZmVyIHRvIGhhbmRsZSBnYWluIHBheWxvYWQKKyAgICAgICAgV09SRDMyIGJ1Zl9zaXplID0gMDsgIC8vIElUVElBTTpnYWluIHBheWxvYWQgbGVuZ3RoCisgICAgICAgIFdPUkQzMiBiaXRfc3RyX2ZtdCA9IDE7CisgICAgICAgIFdPUkQzMiBnYWluX3N0cmVhbV9mbGFnID0gMTsKKworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfR0FJTl9QQVlMT0FEX0xFTiwgJmJ1Zl9zaXplKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX0dBSU5fUEFZTE9BRF9MRU4iKTsKKworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfR0FJTl9QQVlMT0FEX0JVRiwgJnBfYXJyYXkpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfR0FJTl9QQVlMT0FEX0JVRiIpOworCisgICAgICAgIGlmIChidWZfc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIC8qU2V0IGJpdHN0cmVhbV9zcGxpdF9mb3JtYXQgKi8KKyAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0JJVFNfRk9STUFULCAmYml0X3N0cl9mbXQpOworICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fQklUU19GT1JNQVQiKTsKKworICAgICAgICAgICAgbWVtY3B5KG1EcmNJbkJ1ZiwgcF9hcnJheSwgYnVmX3NpemUpOworICAgICAgICAgICAgLyogU2V0IG51bWJlciBvZiBieXRlcyB0byBiZSBwcm9jZXNzZWQgKi8KKyAgICAgICAgICAgIGVycl9jb2RlID0KKyAgICAgICAgICAgICAgICBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTX0JTLCAwLCAmYnVmX3NpemUpOworICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fQklUU19GT1JNQVQiKTsKKworICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRFJDX0RFQ19DT05GSUdfR0FJTl9TVFJFQU1fRkxBRywgJmdhaW5fc3RyZWFtX2ZsYWcpOworICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fQklUU19GT1JNQVQiKTsKKworICAgICAgICAgICAgLyogRXhlY3V0ZSBwcm9jZXNzICovCisgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0NQWV9CU0ZfQlVGRiwgbnVsbHB0cik7CisgICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9CSVRTX0ZPUk1BVCIpOworCisgICAgICAgICAgICBtTXBlZ0REUkNQcmVzZW50ID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEhvdyBtdWNoIGJ1ZmZlciBpcyB1c2VkIGluIGlucHV0IGJ1ZmZlcnMgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9DVVJJRFhfSU5QVVRfQlVGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc0NvbnN1bWVkKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9HRVRfQ1VSSURYX0lOUFVUX0JVRiIpOworCisgICAgLyogR2V0IHRoZSBvdXRwdXQgYnl0ZXMgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9PVVRQVVRfQllURVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ5dGVzKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9HRVRfT1VUUFVUX0JZVEVTIik7CisKKyAgICBpZiAobU1wZWdERFJDUHJlc2VudCA9PSAxKSB7CisgICAgICAgIG1lbWNweShtRHJjSW5CdWYsIG1PdXRwdXRCdWZmZXIsICpvdXRCeXRlcyk7CisgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFUywgMCwgb3V0Qnl0ZXMpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFUyIpOworCisgICAgICAgIGVycl9jb2RlID0KKyAgICAgICAgICAgIGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9FWEVDVVRFLCBJQV9DTURfVFlQRV9ET19FWEVDVVRFLCBudWxscHRyKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQ01EX1RZUEVfRE9fRVhFQ1VURSIpOworCisgICAgICAgIG1lbWNweShtT3V0cHV0QnVmZmVyLCBtRHJjT3V0QnVmLCAqb3V0Qnl0ZXMpOworICAgIH0KKyAgICByZXR1cm4gSUFfTk9fRVJST1I7Cit9CisKK0lBX0VSUk9SQ09ERSBDMlNvZnRYYWFjRGVjOjpnZXRYQUFDU3RyZWFtSW5mbygpIHsKKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBJQV9OT19FUlJPUjsKKworICAgIC8qIFNhbXBsaW5nIGZyZXF1ZW5jeSAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1NBTVBfRlJFUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1TYW1wRnJlcSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9TQU1QX0ZSRVEiKTsKKworICAgIC8qIFRvdGFsIE51bWJlciBvZiBDaGFubmVscyAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX05VTV9DSEFOTkVMUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1OdW1DaGFubmVscyk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9OVU1fQ0hBTk5FTFMiKTsKKyAgICBpZiAobU51bUNoYW5uZWxzID4gTUFYX0NIQU5ORUxfQ09VTlQpIHsKKyAgICAgICAgQUxPR0UoIiBObyBvZiBjaGFubmVscyBhcmUgbW9yZSB0aGFuIG1heCBjaGFubmVsc1xuIik7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQQ00gd29yZCBzaXplICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fUENNX1dEU1osCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtUGNtV2RTeik7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9QQ01fV0RTWiIpOworICAgIGlmICgobVBjbVdkU3ogLyA4KSAhPSAyKSB7CisgICAgICAgIEFMT0dFKCIgTm8gb2YgY2hhbm5lbHMgYXJlIG1vcmUgdGhhbiBtYXggY2hhbm5lbHNcbiIpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorCisgICAgLyogY2hhbm5lbCBtYXNrIHRvIHRlbGwgdGhlIGFycmFuZ2VtZW50IG9mIGNoYW5uZWxzIGluIGJpdCBzdHJlYW0gKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9DSEFOTkVMX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ2hhbm5lbE1hc2spOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fQ0hBTk5FTF9NQVNLIik7CisKKyAgICAvKiBDaGFubmVsIG1vZGUgdG8gdGVsbCBNT05PL1NURVJFTy9EVUFMLU1PTk8vTk9ORV9PRl9USEVTRSAqLworICAgIHVpbnQzMl90IHVpX2NoYW5uZWxfbW9kZTsKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9DSEFOTkVMX01PREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9jaGFubmVsX21vZGUpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fQ0hBTk5FTF9NT0RFIik7CisgICAgaWYgKHVpX2NoYW5uZWxfbW9kZSA9PSAwKQorICAgICAgICBBTE9HVigiQ2hhbm5lbCBNb2RlOiBNT05PX09SX1BTXG4iKTsKKyAgICBlbHNlIGlmICh1aV9jaGFubmVsX21vZGUgPT0gMSkKKyAgICAgICAgQUxPR1YoIkNoYW5uZWwgTW9kZTogU1RFUkVPXG4iKTsKKyAgICBlbHNlIGlmICh1aV9jaGFubmVsX21vZGUgPT0gMikKKyAgICAgICAgQUxPR1YoIkNoYW5uZWwgTW9kZTogRFVBTC1NT05PXG4iKTsKKyAgICBlbHNlCisgICAgICAgIEFMT0dWKCJDaGFubmVsIE1vZGU6IE5PTkVfT0ZfVEhFU0Ugb3IgTVVMVElDSEFOTkVMXG4iKTsKKworICAgIC8qIENoYW5uZWwgbW9kZSB0byB0ZWxsIFNCUiBQUkVTRU5UL05PVF9QUkVTRU5UICovCisgICAgdWludDMyX3QgdWlfc2JyX21vZGU7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fU0JSX01PREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9zYnJfbW9kZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9TQlJfTU9ERSIpOworICAgIGlmICh1aV9zYnJfbW9kZSA9PSAwKQorICAgICAgICBBTE9HVigiU0JSIE1vZGU6IE5PVF9QUkVTRU5UXG4iKTsKKyAgICBlbHNlIGlmICh1aV9zYnJfbW9kZSA9PSAxKQorICAgICAgICBBTE9HVigiU0JSIE1vZGU6IFBSRVNFTlRcbiIpOworICAgIGVsc2UKKyAgICAgICAgQUxPR1YoIlNCUiBNb2RlOiBJTExFR0FMXG4iKTsKKworICAgIC8qIG1PdXRwdXRGcmFtZUxlbmd0aCA9IDEwMjQgKiAoMSArIFNCUl9NT0RFKSBmb3IgQUFDICovCisgICAgLyogRm9yIFVTQUMgaXQgY291bGQgYmUgMTAyNCAqIDMgLCBzdXBwb3J0IHRvIHF1ZXJ5ICAqLworICAgIC8qIG5vdCB5ZXQgYWRkZWQgaW4gY29kZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBtT3V0cHV0RnJhbWVMZW5ndGggPSAxMDI0ICogKDEgKyB1aV9zYnJfbW9kZSk7CisgICAgQUxPR0koIm1PdXRwdXRGcmFtZUxlbmd0aCAlZCB1aV9zYnJfbW9kZSAlZCIsIG1PdXRwdXRGcmFtZUxlbmd0aCwgdWlfc2JyX21vZGUpOworCisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorCitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6c2V0WEFBQ0RSQ0luZm8oaW50MzJfdCBkcmNDdXQsIGludDMyX3QgZHJjQm9vc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkcmNSZWZMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRyY0hlYXZ5Q29tcHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkckVmZmVjdFR5cGUpIHsKKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBJQV9OT19FUlJPUjsKKworICAgIGludDMyX3QgdWlfZHJjX2VuYWJsZSA9IDE7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0VOQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2RyY19lbmFibGUpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfRU5BQkxFIik7CisgICAgaWYgKGRyY0N1dCAhPSAtMSkgeworICAgICAgICBlcnJfY29kZSA9CisgICAgICAgICAgICBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0NVVCwgJmRyY0N1dCk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfQ1VUIik7CisgICAgfQorCisgICAgaWYgKGRyY0Jvb3N0ICE9IC0xKSB7CisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaSgKKyAgICAgICAgICAgIG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19CT09TVCwgJmRyY0Jvb3N0KTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19CT09TVCIpOworICAgIH0KKworICAgIGlmIChkcmNSZWZMZXZlbCAhPSAtMSkgeworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkoCisgICAgICAgICAgICBtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfVEFSR0VUX0xFVkVMLCAmZHJjUmVmTGV2ZWwpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19UQVJHRVRfTEVWRUwiKTsKKyAgICB9CisKKyAgICBpZiAoZHJjUmVmTGV2ZWwgIT0gLTEpIHsKKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKAorICAgICAgICAgICAgbVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19EUkNfVEFSR0VUX0xPVURORVNTLCAmZHJjUmVmTGV2ZWwpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19EUkNfVEFSR0VUX0xPVURORVNTIik7CisgICAgfQorCisgICAgaWYgKGRyY0hlYXZ5Q29tcHJlc3Npb24gIT0gLTEpIHsKKyAgICAgICAgZXJyX2NvZGUgPQorICAgICAgICAgICAgaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19IRUFWWV9DT01QLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHJjSGVhdnlDb21wcmVzc2lvbik7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0hFQVZZX0NPTVAiKTsKKyAgICB9CisKKyAgICBlcnJfY29kZSA9CisgICAgICAgIGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfRFJDX0VGRkVDVF9UWVBFLCAmZHJFZmZlY3RUeXBlKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19EUkNfRUZGRUNUX1RZUEUiKTsKKworICAgIGludDMyX3QgaV9lZmZlY3RfdHlwZSwgaV90YXJnZXRfbG91ZG5lc3MsIGlfbG91ZF9ub3JtOworICAgIC8qU2V0IEVmZmVjdCBUeXBlKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfRUZGRUNUX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpX2VmZmVjdF90eXBlKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0VGRkVDVF9UWVBFIik7CisKKyAgICBlcnJfY29kZSA9CisgICAgICAgIGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19EUkNfRUZGRUNUX1RZUEUsICZpX2VmZmVjdF90eXBlKTsKKworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX0RSQ19FRkZFQ1RfVFlQRSIpOworCisgICAgLypTZXQgdGFyZ2V0IGxvdWRuZXNzICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKAorICAgICAgICBtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19UQVJHRVRfTE9VRE5FU1MsICZpX3RhcmdldF9sb3VkbmVzcyk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19UQVJHRVRfTE9VRE5FU1MiKTsKKworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19EUkNfVEFSR0VUX0xPVURORVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlfdGFyZ2V0X2xvdWRuZXNzKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19EUkNfVEFSR0VUX0xPVURORVNTIik7CisKKyAgICAvKlNldCBsb3VkX25vcm1fZmxhZyovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0xPVURfTk9STSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlfbG91ZF9ub3JtKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0xPVURfTk9STSIpOworCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX0RSQ19MT1VEX05PUk0sICZpX2xvdWRfbm9ybSk7CisKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19EUkNfTE9VRF9OT1JNIik7CisKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7Cit9CisKK2NsYXNzIEMyU29mdFhhYWNEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0WGFhY0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRYYWFjRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0WGFhY0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRYYWFjRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0WGFhY0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdFhhYWNEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRYYWFjRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0MyU29mdFhhYWNEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3hhYWMvQzJTb2Z0WGFhY0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjODU2N2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0MyU29mdFhhYWNEZWMuaApAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX1hBQUNfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9YQUFDX0RFQ19IXworI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJpeGhlYWFjZF90eXBlX2RlZi5oIgorI2luY2x1ZGUgIml4aGVhYWNkX2Vycm9yX3N0YW5kYXJkcy5oIgorI2luY2x1ZGUgIml4aGVhYWNkX2Vycm9yX2hhbmRsZXIuaCIKKyNpbmNsdWRlICJpeGhlYWFjZF9hcGljbWRfc3RhbmRhcmRzLmgiCisjaW5jbHVkZSAiaXhoZWFhY2RfbWVtb3J5X3N0YW5kYXJkcy5oIgorI2luY2x1ZGUgIml4aGVhYWNkX2FhY19jb25maWcuaCIKKworI2luY2x1ZGUgImltcGRfYXBpY21kX3N0YW5kYXJkcy5oIgorI2luY2x1ZGUgImltcGRfZHJjX2NvbmZpZ19wYXJhbXMuaCIKKworI2RlZmluZSBNQVhfQ0hBTk5FTF9DT1VOVCAgICAgICAgICAgOCAgLyogbWF4aW11bSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgdGhhdCBjYW4gYmUgZGVjb2RlZCAqLworI2RlZmluZSBNQVhfTlVNX0JMT0NLUyAgICAgICAgICAgICAgOCAgLyogbWF4aW11bSBudW1iZXIgb2YgYXVkaW8gYmxvY2tzIHRoYXQgY2FuIGJlIGRlY29kZWQgKi8KKworZXh0ZXJuICJDIiBJQV9FUlJPUkNPREUgaXhoZWFhY2RfZGVjX2FwaShwVk9JRCBwX2lhX21vZHVsZV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICBXT1JEMzIgaV9jbWQsIFdPUkQzMiBpX2lkeCwgcFZPSUQgcHZfdmFsdWUpOworZXh0ZXJuICJDIiBJQV9FUlJPUkNPREUgaWFfZHJjX2RlY19hcGkocFZPSUQgcF9pYV9tb2R1bGVfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgV09SRDMyIGlfY21kLCBXT1JEMzIgaV9pZHgsIHBWT0lEIHB2X3ZhbHVlKTsKK2V4dGVybiAiQyIgIElBX0VSUk9SQ09ERSBpeGhlYWFjZF9nZXRfY29uZmlnX3BhcmFtKHBWT0lEIHBfaWFfcHJvY2Vzc19hcGlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdPUkQzMiBwaV9zYW1wX2ZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV09SRDMyIHBpX251bV9jaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdPUkQzMiBwaV9wY21fd2Rfc3osCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV09SRDMyIHBpX2NoYW5uZWxfbWFzayk7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdFhhYWNEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0WGFhY0RlYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0WGFhY0RlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga091dHB1dERyYWluQnVmZmVyU2l6ZSAgICAgID0gMjA0OCAqIE1BWF9DSEFOTkVMX0NPVU5UICogTUFYX05VTV9CTE9DS1MsCisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgdm9pZCogbVhoZWFhY0NvZGVjSGFuZGxlOworICAgIHZvaWQqIG1NcGVnRERyY0hhbmRsZTsKKyAgICB1aW50MzJfdCBtSW5wdXRCdWZmZXJTaXplOworICAgIHVpbnQzMl90IG1PdXRwdXRGcmFtZUxlbmd0aDsKKyAgICBpbnQ4X3QqIG1JbnB1dEJ1ZmZlcjsKKyAgICBpbnQ4X3QqIG1PdXRwdXRCdWZmZXI7CisgICAgaW50MzJfdCBtU2FtcEZyZXE7CisgICAgaW50MzJfdCBtTnVtQ2hhbm5lbHM7CisgICAgaW50MzJfdCBtUGNtV2RTejsKKyAgICBpbnQzMl90IG1DaGFubmVsTWFzazsKKyAgICBpbnQzMl90IG1OdW1PdXRCeXRlczsKKyAgICB1aW50NjRfdCBtQ3VyRnJhbWVJbmRleDsKKyAgICB1aW50NjRfdCBtQ3VyVGltZXN0YW1wOworICAgIGJvb2wgbUlzQ29kZWNJbml0aWFsaXplZDsKKyAgICBib29sIG1Jc0NvZGVjQ29uZmlnRmx1c2hSZXF1aXJlZDsKKyAgICBpbnQ4X3QqIG1EcmNJbkJ1ZjsKKyAgICBpbnQ4X3QqIG1EcmNPdXRCdWY7CisgICAgaW50MzJfdCBtTXBlZ0REUkNQcmVzZW50OworICAgIGludDMyX3QgbURSQ0ZsYWc7CisKKyAgICBWZWN0b3I8dm9pZCo+IG1NZW1vcnlWZWM7CisgICAgVmVjdG9yPHZvaWQqPiBtRHJjTWVtb3J5VmVjOworCisgICAgc2l6ZV90IG1JbnB1dEJ1ZmZlckNvdW50IF9fdW51c2VkOworICAgIHNpemVfdCBtT3V0cHV0QnVmZmVyQ291bnQgX191bnVzZWQ7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGNoYXIqIG1PdXRwdXREcmFpbkJ1ZmZlcjsKKyAgICB1aW50MzJfdCBtT3V0cHV0RHJhaW5CdWZmZXJXcml0ZVBvczsKKworICAgIElBX0VSUk9SQ09ERSBpbml0RGVjb2RlcigpOworICAgIElBX0VSUk9SQ09ERSBzZXREcmNQYXJhbWV0ZXIoKTsKKyAgICBJQV9FUlJPUkNPREUgY29uZmlnZmx1c2hEZWNvZGUoKTsKKyAgICBJQV9FUlJPUkNPREUgZHJhaW5EZWNvZGVyKCk7CisgICAgdm9pZCBmaW5pc2hXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKTsKKworICAgIElBX0VSUk9SQ09ERSBpbml0WEFBQ0RyYygpOworICAgIElBX0VSUk9SQ09ERSBpbml0WEFBQ0RlY29kZXIoKTsKKyAgICBJQV9FUlJPUkNPREUgZGVJbml0WEFBQ0RlY29kZXIoKTsKKyAgICBJQV9FUlJPUkNPREUgaW5pdE1QRUdERERyYygpOworICAgIElBX0VSUk9SQ09ERSBkZUluaXRNUEVHREREcmMoKTsKKyAgICBJQV9FUlJPUkNPREUgY29uZmlnWEFBQ0RlY29kZXIodWludDhfdCogaW5CdWZmZXIsIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoKTsKKyAgICBpbnQgY29uZmlnTVBFR0REcmMoKTsKKyAgICBJQV9FUlJPUkNPREUgZGVjb2RlWEFBQ1N0cmVhbSh1aW50OF90KiBpbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBieXRlc0NvbnN1bWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIG91dEJ5dGVzKTsKKyAgICBJQV9FUlJPUkNPREUgZ2V0WEFBQ1N0cmVhbUluZm8oKTsKKyAgICBJQV9FUlJPUkNPREUgc2V0WEFBQ0RSQ0luZm8oaW50MzJfdCBkcmNDdXQsIGludDMyX3QgZHJjQm9vc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHJjUmVmTGV2ZWwsIGludDMyX3QgZHJjSGVhdnlDb21wcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkckVmZmVjdFR5cGUpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0WGFhY0RlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEMyX1NPRlRfWEFBQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb3JlL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcyMzc1NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0NSBAQAorY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibGliY29kZWMyX2hlYWRlcnMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgc3JjczogWyJDMi5jcHAiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzJfaGVhZGVycyIsCisgICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYnV0aWxzX2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJjb2RlYzJfaGVhZGVycyIsCisgICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYnV0aWxzX2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiBmYWxzZSwgLy8gdHJ1ZSwKKyAgICAgICAgZGlhZzogeworICAgICAgICAgICAgY2ZpOiBmYWxzZSwgLy8gdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorCisgICAgbGRmbGFnczogWyItV2wsLUJzeW1ib2xpYyJdLAorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9DMi5jcHAgYi9tZWRpYS9jb2RlYzIvY29yZS9DMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU5ZDRlNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL0MyLmNwcApAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPEMyLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyUGFyYW1EZWYuaD4KKyNpbmNsdWRlIDxDMldvcmsuaD4KKworLyoqCisgKiBUaGVyZSBpcyBub3RoaW5nIGhlcmUgeWV0LiBUaGlzIGxpYnJhcnkgaXMgYnVpbHQgdG8gc2VlIHdoYXQgc3ltYm9scyBhbmQgbWV0aG9kcyBnZXQKKyAqIGRlZmluZWQgYXMgcGFydCBvZiB0aGUgQVBJIGluY2x1ZGUgZmlsZXMuCisgKgorICogR29pbmcgZm9yd2FyZCwgdGhlIENvZGVjMiBsaWJyYXJ5IHdpbGwgY29udGFpbiB1dGlsaXR5IG1ldGhvZHMgdGhhdCBhcmUgdXNlZnVsIGZvcgorICogQ29kZWMyIGNsaWVudHMuCisgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYzNDY2ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzIuaApAQCAtMCwwICsxLDU1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJfSF8KKyNkZWZpbmUgQzJfSF8KKworI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKy8qKiBuYW5vc2Vjb25kcyB3aXRoIGFyYml0cmFyeSBvcmlnaW4uICovCit0eXBlZGVmIGludDY0X3QgYzJfbnNlY3NfdDsKKworLyoqIFxtYWlucGFnZSBDb2RlYzIKKyAqCisgKiBDb2RlYzIgaXMgYSBnZW5lcmljIGZyYW1lLWJhc2VkIGRhdGEgcHJvY2Vzc2luZyBBUEkuCisgKgorICogVGhlIG1lZGlhIHN1YnN5c3RlbSBhY2Nlc3NlcyBjb21wb25lbnRzIHZpYSB0aGUgXHJlZiBBUEkuCisgKi8KKworLyoqIFxpbmdyb3VwIEFQSQorICoKKyAqIFRoZSBDb2RlYzIgQVBJIGRlZmluZXMgdGhlIG9wZXJhdGlvbiBvZiBkYXRhIHByb2Nlc3NpbmcgY29tcG9uZW50cyBhbmQgdGhlaXIgaW50ZXJhY3Rpb24gd2l0aAorICogdGhlIHJlc3Qgb2YgdGhlIHN5c3RlbS4KKyAqCisgKiBDb2RpbmcgQ29udmVudGlvbnMKKyAqCisgKiBNaXRpZ2F0aW5nIEJpbmFyeSBDb21wYXRpYmlsaXR5LgorICoKKyAqIFdoaWxlIGZ1bGwgYmluYXJ5IGNvbXBhdGliaWxpdHkgaXMgbm90IGEgZ29hbCBvZiB0aGUgQVBJIChkdWUgdG8gb3VyIHVzZSBvZiBTVEwpLCB3ZSB0cnkgdG8KKyAqIG1pdGlnYXRlIGJpbmFyeSBicmVha3MgYnkgYWRoZXJpbmcgdG8gdGhlIGZvbGxvd2luZyBjb252ZW50aW9uczoKKyAqCisgKiAtIGF0IG1vc3Qgb25lIHZ0YWJsZSB3aXRoIHBsYWNlaG9sZGVyIHZpcnR1YWwgbWV0aG9kcworICogLSBhbGwgb3B0aW9uYWwvcGxhY2Vob2xkZXIgdmlydHVhbCBtZXRob2RzIHJldHVybmluZyBhIGMyX3N0YXR1c190LCB3aXRoIEMyX09NSVRURUQgbm90IHJlcXVpcmluZworICogICBhbnkgdXBkYXRlIHRvIGlucHV0L291dHB1dCBhcmd1bWVudHMuCisgKiAtIGxpbWl0aW5nIHN5bWJvbCBleHBvcnQgb2YgaW5saW5lIG1ldGhvZHMKKyAqIC0gdXNlIG9mIHBpbXBsIChvciBzaGFyZWQtcGltcGwpCisgKgorICogTmFtaW5nCisgKgorICogLSBhbGwgY2xhc3NlcyBhbmQgdHlwZXMgcHJlZml4IHdpdGggQzIKKyAqIC0gY2xhc3NlcyBmb3IgaW50ZXJuYWwgdXNlIHByZWZpeCB3aXRoIF9DMgorICogLSBlbnVtIHZhbHVlcyBpbiBnbG9iYWwgbmFtZXNwYWNlIHByZWZpeCB3aXRoIEMyXyBhbGwgY2FwcworICogLSBlbnVtIHZhbHVlcyBpbnNpZGUgY2xhc3NlcyBoYXZlIG5vIEMyXyBwcmVmaXggYXMgY2xhc3MgYWxyZWFkeSBoYXMgaXQKKyAqIC0gc3VwcG9ydGluZyB0d28ga2luZHMgb2YgZW51bSBuYW1pbmc6IGFsbC1jYXBzIGFuZCBrQ2FtZWxDYXNlCisgKiBcdG9kbyByZXZpc2l0IGtDYW1lbENhc2UgZm9yIHBhcmFtLXR5cGUKKyAqCisgKiBBc3BlY3RzCisgKgorICogQXNwZWN0cyBkZWZpbmUgY2VydGFpbiBjb21tb24gYmVoYXZpb3IgYWNyb3NzIGEgZ3JvdXAgb2Ygb2JqZWN0cy4KKyAqIC0gY2xhc3NlcyB3aG9zZSBuYW1lIG1hdGNoZXMgX0MyLipBc3BlY3QKKyAqIC0gb25seSBwcm90ZWN0ZWQgY29uc3RydWN0b3JzCisgKiAtIG5vIGRlc2N0cnVjdG9yIGFuZCBjb3BpYWJsZQorICogLSBhbGwgbWV0aG9kcyBhcmUgaW5saW5lIG9yIHN0YXRpYyAodGhpcyBpcyBvcHBvc2l0ZSBvZiB0aGUgaW50ZXJmYWNlIHBhcmFkaWdtIHdoZXJlIGFsbCBtZXRob2RzCisgKiAgIGFyZSB2aXJ0dWFsLCB3aGljaCB3b3VsZCBub3Qgd29yayBkdWUgdG8gdGhlIGF0IG1vc3Qgb25lIHZ0YWJsZSBydWxlLikKKyAqIC0gb25seSBwcml2YXRlIHZhcmlhYmxlcyAodGhpcyBwcmV2ZW50cyBzdWJjbGFzc2VzIGludGVyZmVyaW5nIHdpdGggdGhlIGFzcGVjdHMuKQorICovCisKKy8vLyBcZGVmZ3JvdXAgdHlwZXMgQ29tbW9uIFR5cGVzCisvLy8gQHsKKworLyoqCisgKiBDMlN0cmluZzogYmFzaWMgc3RyaW5nIGltcGxlbWVudGF0aW9uCisgKi8KK3R5cGVkZWYgc3RkOjpzdHJpbmcgQzJTdHJpbmc7CisKKy8qKgorICogQzJTdHJpbmdMaXRlcmFsOiBiYXNpYyBzdHJpbmcgbGl0ZXJhbCBpbXBsZW1lbnRhdGlvbi4KKyAqIFxub3RlIHRoZXNlIGFyZSBuZXZlciBvd25lZCBieSBhbnkgb2JqZWN0LCBhbmQgY2FuIG9ubHkgcmVmZXIgdG8gQyBzdHJpbmcgbGl0ZXJhbHMuCisgKi8KK3R5cGVkZWYgY29uc3QgY2hhciAqQzJTdHJpbmdMaXRlcmFsOworCisvKioKKyAqIGMyX3N0YXR1c190OiBzdGF0dXMgY29kZXMgdXNlZC4KKyAqLworZW51bSBjMl9zdGF0dXNfdCA6IGludDMyX3QgeworLyoKKyAqIFVzZSBQT1NJWCBlcnJubyBjb25zdGFudHMuCisgKi8KKyAgICBDMl9PSyAgICAgICAgPSAwLCAgICAgICAgICAgIC8vLzwgb3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkKKworICAgIC8vIGJhZCBpbnB1dAorICAgIEMyX0JBRF9WQUxVRSA9IEVJTlZBTCwgICAgICAgLy8vPCBhcmd1bWVudCBoYXMgaW52YWxpZCB2YWx1ZSAodXNlciBlcnJvcikKKyAgICBDMl9CQURfSU5ERVggPSBFTlhJTywgICAgICAgIC8vLzwgYXJndW1lbnQgdXNlcyBpbnZhbGlkIGluZGV4ICh1c2VyIGVycm9yKQorICAgIEMyX0NBTk5PVF9ETyA9IEVOT1RTVVAsICAgICAgLy8vPCBhcmd1bWVudC9pbmRleCBpcyB2YWxpZCBidXQgbm90IHBvc3NpYmxlCisKKyAgICAvLyBiYWQgc2VxdWVuY2luZyBvZiBldmVudHMKKyAgICBDMl9EVVBMSUNBVEUgPSBFRVhJU1QsICAgICAgIC8vLzwgb2JqZWN0IGFscmVhZHkgZXhpc3RzCisgICAgQzJfTk9UX0ZPVU5EID0gRU5PRU5ULCAgICAgICAvLy88IG9iamVjdCBub3QgZm91bmQKKyAgICBDMl9CQURfU1RBVEUgPSBFUEVSTSwgICAgICAgIC8vLzwgb3BlcmF0aW9uIGlzIG5vdCBwZXJtaXR0ZWQgaW4gdGhlIGN1cnJlbnQgc3RhdGUKKyAgICBDMl9CTE9DS0lORyAgPSBFV09VTERCTE9DSywgIC8vLzwgb3BlcmF0aW9uIHdvdWxkIGJsb2NrIGJ1dCBibG9ja2luZyBpcyBub3QgcGVybWl0dGVkCisgICAgQzJfQ0FOQ0VMRUQgID0gRUlOVFIsICAgICAgICAvLy88IG9wZXJhdGlvbiBpbnRlcnJ1cHRlZC9jYW5jZWxlZAorCisgICAgLy8gYmFkIGVudmlyb25tZW50CisgICAgQzJfTk9fTUVNT1JZID0gRU5PTUVNLCAgICAgICAvLy88IG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIG9wZXJhdGlvbgorICAgIEMyX1JFRlVTRUQgICA9IEVBQ0NFUywgICAgICAgLy8vPCBtaXNzaW5nIHBlcm1pc3Npb24gdG8gY29tcGxldGUgb3BlcmF0aW9uCisKKyAgICBDMl9USU1FRF9PVVQgPSBFVElNRURPVVQsICAgIC8vLzwgb3BlcmF0aW9uIGRpZCBub3QgY29tcGxldGUgd2l0aGluIHRpbWVvdXQKKworICAgIC8vIGJhZCB2ZXJzaW9uaW5nCisgICAgQzJfT01JVFRFRCAgID0gRU5PU1lTLCAgICAgICAvLy88IG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQvc3VwcG9ydGVkIChvcHRpb25hbCBvbmx5KQorCisgICAgLy8gdW5rbm93biBmYXRhbAorICAgIEMyX0NPUlJVUFRFRCA9IEVGQVVMVCwgICAgICAgLy8vPCBzb21lIHVuZXhwZWN0ZWQgZXJyb3IgcHJldmVudGVkIHRoZSBvcGVyYXRpb24KKyAgICBDMl9OT19JTklUICAgPSBFTk9ERVYsICAgICAgIC8vLzwgc3RhdHVzIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZAorfTsKKworLyoqCisgKiBUeXBlIHRoYXQgZGVzY3JpYmVzIHRoZSBkZXNpcmVkIGJsb2NraW5nIGJlaGF2aW9yIGZvciB2YXJpYWJsZSBibG9ja2luZyBjYWxscy4gQmxvY2tpbmcgaW4gdGhpcworICogQVBJIGlzIHVzZWQgaW4gYSBzb21ld2hhdCBtb2RpZmllZCBtZWFuaW5nIHN1Y2ggdGhhdCBvcGVyYXRpb25zIHRoYXQgbWVyZWx5IHVwZGF0ZSB2YXJpYWJsZXMKKyAqIHByb3RlY3RlZCBieSBtdXRleGVzIGFyZSBzdGlsbCBjb25zaWRlcmVkICJub24tYmxvY2tpbmciIChhbHdheXMgdXNlZCBpbiBxdW90ZXMpLgorICovCitlbnVtIGMyX2Jsb2NraW5nX3QgOiBpbnQzMl90IHsKKyAgICAvKioKKyAgICAgKiBUaGUgb3BlcmF0aW9uIFNIQUxMIGJlICJub24tYmxvY2tpbmciLiBUaGlzIG1lYW5zIHRoYXQgaXQgc2hhbGwgbm90IHBlcmZvcm0gYW55IGZpbGUKKyAgICAgKiBvcGVyYXRpb25zLCBvciBjYWxsL3dhaXQgb24gb3RoZXIgcHJvY2Vzc2VzLiBJdCBtYXkgdXNlIGEgcHJvdGVjdGVkIHJlZ2lvbiBhcyBsb25nIGFzIHRoZQorICAgICAqIG11dGV4IGlzIG5ldmVyIHVzZWQgdG8gcHJvdGVjdCBjb2RlIHRoYXQgaXMgb3RoZXJ3aXNlICJtYXkgYmxvY2siLgorICAgICAqLworICAgIEMyX0RPTlRfQkxPQ0sgPSBmYWxzZSwKKyAgICAvKioKKyAgICAgKiBUaGUgb3BlcmF0aW9uIE1BWSBiZSB0ZW1wb3JhcmlseSBibG9ja2luZy4KKyAgICAgKi8KKyAgICBDMl9NQVlfQkxPQ0sgPSB0cnVlLAorfTsKKworLy8vIEB9CisKKy8vLyBcZGVmZ3JvdXAgdXRpbHMgVXRpbGl0aWVzCisvLy8gQHsKKworI2RlZmluZSBDMl9ET19OT1RfQ09QWSh0eXBlKSBcCisgICAgdHlwZSYgb3BlcmF0b3I9KGNvbnN0IHR5cGUgJikgPSBkZWxldGU7IFwKKyAgICB0eXBlKGNvbnN0IHR5cGUgJikgPSBkZWxldGU7IFwKKworI2RlZmluZSBDMl9ERUZBVUxUX01PVkUodHlwZSkgXAorICAgIHR5cGUmIG9wZXJhdG9yPSh0eXBlICYmKSA9IGRlZmF1bHQ7IFwKKyAgICB0eXBlKHR5cGUgJiYpID0gZGVmYXVsdDsgXAorCisjZGVmaW5lIEMyX0FMTE9XX09WRVJGTE9XIF9fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJpbnRlZ2VyIikpKQorI2RlZmluZSBDMl9DT05TVCAgICBfX2F0dHJpYnV0ZV9fKChjb25zdCkpCisjZGVmaW5lIEMyX0hJREUgICAgIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImhpZGRlbiIpKSkKKyNkZWZpbmUgQzJfSU5MSU5FICAgaW5saW5lIEMyX0hJREUKKyNkZWZpbmUgQzJfSU5URVJOQUwgX19hdHRyaWJ1dGVfXygoaW50ZXJuYWxfbGlua2FnZSkpCisjZGVmaW5lIEMyX1BBQ0sgICAgIF9fYXR0cmlidXRlX18oKGFsaWduZWQoNCkpKQorI2RlZmluZSBDMl9QVVJFICAgICBfX2F0dHJpYnV0ZV9fKChwdXJlKSkKKworI2RlZmluZSBERUZJTkVfT1RIRVJfQ09NUEFSSVNPTl9PUEVSQVRPUlModHlwZSkgXAorICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgdHlwZSAmb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9IFwKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IHR5cGUgJm90aGVyKSBjb25zdCB7IHJldHVybiAoKnRoaXMgPT0gb3RoZXIpIHx8ICgqdGhpcyA8IG90aGVyKTsgfSBcCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCB0eXBlICZvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA8IG90aGVyKTsgfSBcCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IHR5cGUgJm90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzIDwgb3RoZXIpICYmICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyNkZWZpbmUgREVGSU5FX0ZJRUxEX0JBU0VEX0NPTVBBUklTT05fT1BFUkFUT1JTKHR5cGUsIGZpZWxkKSBcCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IHR5cGUgJm90aGVyKSBjb25zdCB7IHJldHVybiBmaWVsZCA8IG90aGVyLmZpZWxkOyB9IFwKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHR5cGUgJm90aGVyKSBjb25zdCB7IHJldHVybiBmaWVsZCA9PSBvdGhlci5maWVsZDsgfSBcCisgICAgREVGSU5FX09USEVSX0NPTVBBUklTT05fT1BFUkFUT1JTKHR5cGUpCisKKyNkZWZpbmUgREVGSU5FX0ZJRUxEX0FORF9NQVNLX0JBU0VEX0NPTVBBUklTT05fT1BFUkFUT1JTKHR5cGUsIGZpZWxkLCBtYXNrKSBcCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IHR5cGUgJm90aGVyKSBjb25zdCB7IFwKKyAgICAgICAgcmV0dXJuIChmaWVsZCAmIG1hc2spIDwgKG90aGVyLmZpZWxkICYgKG1hc2spKTsgXAorICAgIH0gXAorICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgdHlwZSAmb3RoZXIpIGNvbnN0IHsgXAorICAgICAgICByZXR1cm4gKGZpZWxkICYgbWFzaykgPT0gKG90aGVyLmZpZWxkICYgKG1hc2spKTsgXAorICAgIH0gXAorICAgIERFRklORV9PVEhFUl9DT01QQVJJU09OX09QRVJBVE9SUyh0eXBlKQorCisjZGVmaW5lIERFRklORV9FTlVNX09QRVJBVE9SUyhldHlwZSkgXAorICAgIGlubGluZSBjb25zdGV4cHIgZXR5cGUgb3BlcmF0b3J8KGV0eXBlIGEsIGV0eXBlIGIpIHsgcmV0dXJuIChldHlwZSkoc3RkOjp1bmRlcmx5aW5nX3R5cGU8ZXR5cGU+Ojp0eXBlKGEpIHwgc3RkOjp1bmRlcmx5aW5nX3R5cGU8ZXR5cGU+Ojp0eXBlKGIpKTsgfSBcCisgICAgaW5saW5lIGNvbnN0ZXhwciBldHlwZSAmb3BlcmF0b3J8PShldHlwZSAmYSwgZXR5cGUgYikgeyBhID0gKGV0eXBlKShzdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYSkgfCBzdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYikpOyByZXR1cm4gYTsgfSBcCisgICAgaW5saW5lIGNvbnN0ZXhwciBldHlwZSBvcGVyYXRvciYoZXR5cGUgYSwgZXR5cGUgYikgeyByZXR1cm4gKGV0eXBlKShzdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYSkgJiBzdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYikpOyB9IFwKKyAgICBpbmxpbmUgY29uc3RleHByIGV0eXBlICZvcGVyYXRvciY9KGV0eXBlICZhLCBldHlwZSBiKSB7IGEgPSAoZXR5cGUpKHN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShhKSAmIHN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShiKSk7IHJldHVybiBhOyB9IFwKKyAgICBpbmxpbmUgY29uc3RleHByIGV0eXBlIG9wZXJhdG9yXihldHlwZSBhLCBldHlwZSBiKSB7IHJldHVybiAoZXR5cGUpKHN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShhKSBeIHN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShiKSk7IH0gXAorICAgIGlubGluZSBjb25zdGV4cHIgZXR5cGUgJm9wZXJhdG9yXj0oZXR5cGUgJmEsIGV0eXBlIGIpIHsgYSA9IChldHlwZSkoc3RkOjp1bmRlcmx5aW5nX3R5cGU8ZXR5cGU+Ojp0eXBlKGEpIF4gc3RkOjp1bmRlcmx5aW5nX3R5cGU8ZXR5cGU+Ojp0eXBlKGIpKTsgcmV0dXJuIGE7IH0gXAorICAgIGlubGluZSBjb25zdGV4cHIgZXR5cGUgb3BlcmF0b3J+KGV0eXBlIGEpIHsgcmV0dXJuIChldHlwZSkofnN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShhKSk7IH0KKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQj4KK2NsYXNzIEMyX0hJREUgYzJfY250cl90OworCisvLy8gXGNvbmQgSU5URVJOQUwKKworLy8vIFxkZWZncm91cCB1dGlsc19pbnRlcm5hbAorLy8vIEB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQzJfSElERSBfYzJfY250cl9jb21wYXRfaGVscGVyIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBFPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8VT46OnZhbHVlPjo6dHlwZT4KKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByIFQgZ2V0KGNvbnN0IFUgJnZhbHVlKSB7CisgICAgICAgIHJldHVybiBUKHZhbHVlKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBFPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPChzaXplb2YoVSkgPj0gc2l6ZW9mKFQpKT46OnR5cGU+CisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciBUIGdldChjb25zdCBjMl9jbnRyX3Q8VSwgdm9pZD4gJnZhbHVlKSB7CisgICAgICAgIHJldHVybiBUKHZhbHVlLm1WYWx1ZSk7CisgICAgfQorfTsKKworLy8vIEB9CisKKy8vLyBcZW5kY29uZAorCisvKioKKyAqIEludGVncmFsIGNvdW50ZXIgdHlwZS4KKyAqCisgKiBUaGlzIGlzIGJhc2ljYWxseSBhbiB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlIHRoYXQgaXMgTkVWRVIgY2hlY2tlZCBmb3Igb3ZlcmZsb3cvdW5kZXJmbG93IC0gYW5kCisgKiBjb21wYXJpc29uIG9wZXJhdG9ycyBhcmUgcmVkZWZpbmVkLgorICoKKyAqIFxub3RlIENvbXBhcmlzb24gb2YgY291bnRlciB0eXBlcyBpcyBub3QgZnVsbHkgdHJhbnNpdGl2ZSwgZS5nLgorICogaXQgY291bGQgYmUgdGhhdCBhID4gYiA+IGMgYnV0IGEgIT4gYy4KKyAqIHN0ZDo6bGVzczw+LCBncmVhdGVyPD4sIGxlc3NfZXF1YWw8PiBhbmQgZ3JlYXRlcl9lcXVhbDw+IHNwZWNpYWxpemF0aW9ucyB5aWVsZCB0b3RhbCBvcmRlcmluZywKKyAqIGJ1dCBtYXkgbm90IG1hdGNoIHNlbWFudGljIG9yZGVyaW5nIG9mIHRoZSB2YWx1ZXMuCisgKgorICogVGVjaG5pY2FsbHk6IGNvdW50ZXIgdHlwZXMgcmVwcmVzZW50IGludGVnZXIgdmFsdWVzOiBBICogMl5OICsgdmFsdWUsIHdoZXJlIEEgY2FuIGJlIGFyYml0cmFyeS4KKyAqIFRoaXMgbWFrZXMgYWRkaXRpb24sIHN1YnRyYWN0aW9uLCBtdWx0aXBsaWNhdGlvbiAoYXMgd2VsbCBhcyBiaXR3aXNlIG9wZXJhdGlvbnMpIHdlbGwgZGVmaW5lZC4KKyAqIEhvd2V2ZXIsIGRpdmlzaW9uIGlzIGluIGdlbmVyYWwgbm90IHdlbGwgZGVmaW5lZCwgYXMgdGhlIHJlc3VsdCBtYXkgZGVwZW5kIG9uIEEuIFRoaXMgaXMgYWxzbworICogdHJ1ZSBmb3IgbG9naWNhbCBvcGVyYXRvcnMgYW5kIGJvb2xlYW4gY29udmVyc2lvbi4KKyAqCisgKiBFdmVuIHRob3VnaCB3ZWxsIGRlZmluZWQsIGJpdHdpc2Ugb3BlcmF0b3JzIGFyZSBub3QgaW1wbGVtZW50ZWQgZm9yIGNvdW50ZXIgdHlwZXMgYXMgdGhleSBhcmUgbm90CisgKiBtZWFuaW5nZnVsLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBCPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8VD46OnZhbHVlICYmIHN0ZDo6aXNfdW5zaWduZWQ8VD46OnZhbHVlPjo6dHlwZT4KK2NsYXNzIEMyX0hJREUgYzJfY250cl90IHsKKyAgICB1c2luZyBjb21wYXQgPSBfYzJfY250cl9jb21wYXRfaGVscGVyPFQ+OworCisgICAgVCBtVmFsdWU7CisgICAgY29uc3RleHByIHN0YXRpYyBUIEhBTEZfUkFOR0UgPSBUKH4wKSBeIChUKH4wKSA+PiAxKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+CisgICAgZnJpZW5kIHN0cnVjdCBfYzJfY250cl9jb21wYXRfaGVscGVyOworcHVibGljOgorCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZWQgY291bnRlciB0byAwLgorICAgICAqLworICAgIGlubGluZSBjb25zdGV4cHIgYzJfY250cl90KCkgOiBtVmFsdWUoVCgwKSkge30KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBmcm9tIGEgY29tcGF0aWJsZSB0eXBlLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+CisgICAgaW5saW5lIGNvbnN0ZXhwciBjMl9jbnRyX3QoY29uc3QgVSAmdmFsdWUpIDogbVZhbHVlKGNvbXBhdDo6Z2V0KHZhbHVlKSkge30KKworICAgIC8qKgorICAgICAqIFBlZWsgYXMgdW5kZXJseWluZyBzaWduZWQgdHlwZS4KKyAgICAgKi8KKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgdHlwZW5hbWUgc3RkOjptYWtlX3NpZ25lZDxUPjo6dHlwZSBwZWVrKCkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dHlwZW5hbWUgc3RkOjptYWtlX3NpZ25lZDxUPjo6dHlwZT4obVZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZWVrIGFzIHVuZGVybHlpbmcgdW5zaWduZWQgdHlwZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgY29uc3RleHByIFQgcGVla3UoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVlayBhcyBsb25nIGxvbmcgLSBlLmcuIGZvciBwcmludGluZy4KKyAgICAgKi8KKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgbG9uZyBsb25nIHBlZWtsbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIChsb25nIGxvbmcpbVZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlZWsgYXMgdW5zaWduZWQgbG9uZyBsb25nIC0gZS5nLiBmb3IgcHJpbnRpbmcuCisgICAgICovCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIHVuc2lnbmVkIGxvbmcgbG9uZyBwZWVrdWxsKCkgY29uc3QgeworICAgICAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcgbG9uZyltVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCB0byBhIHNtYWxsZXIgY291bnRlciB0eXBlLiBUaGlzIGlzIGFsd2F5cyBzYWZlLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIEU9dHlwZW5hbWUgc3RkOjplbmFibGVfaWY8KHNpemVvZihVKSA8IHNpemVvZihUKSk+Ojp0eXBlPgorICAgIGlubGluZSBjb25zdGV4cHIgb3BlcmF0b3IgYzJfY250cl90PFU+KCkgeworICAgICAgICByZXR1cm4gYzJfY250cl90PFU+KG1WYWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXJpdGhtZXRpYyBvcGVyYXRvcnMKKyAgICAgKi8KKworI2RlZmluZSBERUZJTkVfQzJfQ05UUl9CSU5BUllfT1AoYXR0cmliLCBvcCwgb3BfYXNzaWduKSBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4gXAorICAgIGF0dHJpYiBpbmxpbmUgYzJfY250cl90PFQ+JiBvcGVyYXRvciBvcF9hc3NpZ24oY29uc3QgVSAmdmFsdWUpIHsgXAorICAgICAgICBtVmFsdWUgb3BfYXNzaWduIGNvbXBhdDo6Z2V0KHZhbHVlKTsgXAorICAgICAgICByZXR1cm4gKnRoaXM7IFwKKyAgICB9IFwKKyAgICBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgRT1kZWNsdHlwZShjb21wYXQ6OmdldChVKDApKSk+IFwKKyAgICBhdHRyaWIgaW5saW5lIGNvbnN0ZXhwciBjMl9jbnRyX3Q8VD4gb3BlcmF0b3Igb3AoY29uc3QgVSAmdmFsdWUpIGNvbnN0IHsgXAorICAgICAgICByZXR1cm4gYzJfY250cl90PFQ+KG1WYWx1ZSBvcCBjb21wYXQ6OmdldCh2YWx1ZSkpOyBcCisgICAgfSBcCisgICAgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIEU9dHlwZW5hbWUgc3RkOjplbmFibGVfaWY8KHNpemVvZihVKSA8IHNpemVvZihUKSk+Ojp0eXBlPiBcCisgICAgYXR0cmliIGlubGluZSBjb25zdGV4cHIgYzJfY250cl90PFU+IG9wZXJhdG9yIG9wKGNvbnN0IGMyX2NudHJfdDxVPiAmdmFsdWUpIGNvbnN0IHsgXAorICAgICAgICByZXR1cm4gYzJfY250cl90PFU+KFUobVZhbHVlKSBvcCB2YWx1ZS5wZWVrdSgpKTsgXAorICAgIH0KKworI2RlZmluZSBERUZJTkVfQzJfQ05UUl9VTkFSWV9PUChhdHRyaWIsIG9wKSBcCisgICAgYXR0cmliIGlubGluZSBjb25zdGV4cHIgYzJfY250cl90PFQ+IG9wZXJhdG9yIG9wKCkgY29uc3QgeyBcCisgICAgICAgIHJldHVybiBjMl9jbnRyX3Q8VD4ob3AgbVZhbHVlKTsgXAorICAgIH0KKworI2RlZmluZSBERUZJTkVfQzJfQ05UUl9DUkVNRU5UX09QKGF0dHJpYiwgb3ApIFwKKyAgICBhdHRyaWIgaW5saW5lIGMyX2NudHJfdDxUPiAmb3BlcmF0b3Igb3AoKSB7IFwKKyAgICAgICAgb3AgbVZhbHVlOyBcCisgICAgICAgIHJldHVybiAqdGhpczsgXAorICAgIH0gXAorICAgIGF0dHJpYiBpbmxpbmUgYzJfY250cl90PFQ+IG9wZXJhdG9yIG9wKGludCkgeyBcCisgICAgICAgIHJldHVybiBjMl9jbnRyX3Q8VCwgdm9pZD4obVZhbHVlIG9wKTsgXAorICAgIH0KKworICAgIERFRklORV9DMl9DTlRSX0JJTkFSWV9PUChDMl9BTExPV19PVkVSRkxPVywgKywgKz0pCisgICAgREVGSU5FX0MyX0NOVFJfQklOQVJZX09QKEMyX0FMTE9XX09WRVJGTE9XLCAtLCAtPSkKKyAgICBERUZJTkVfQzJfQ05UUl9CSU5BUllfT1AoQzJfQUxMT1dfT1ZFUkZMT1csICosICo9KQorCisgICAgREVGSU5FX0MyX0NOVFJfVU5BUllfT1AoQzJfQUxMT1dfT1ZFUkZMT1csIC0pCisgICAgREVGSU5FX0MyX0NOVFJfVU5BUllfT1AoQzJfQUxMT1dfT1ZFUkZMT1csICspCisKKyAgICBERUZJTkVfQzJfQ05UUl9DUkVNRU5UX09QKEMyX0FMTE9XX09WRVJGTE9XLCArKykKKyAgICBERUZJTkVfQzJfQ05UUl9DUkVNRU5UX09QKEMyX0FMTE9XX09WRVJGTE9XLCAtLSkKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIEU9dHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc191bnNpZ25lZDxVPjo6dmFsdWU+Ojp0eXBlPgorICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIGNvbnN0ZXhwciBjMl9jbnRyX3Q8VD4gb3BlcmF0b3I8PChjb25zdCBVICZ2YWx1ZSkgY29uc3QgeworICAgICAgICByZXR1cm4gYzJfY250cl90PFQ+KG1WYWx1ZSA8PCB2YWx1ZSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgRT10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3Vuc2lnbmVkPFU+Ojp2YWx1ZT46OnR5cGU+CisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgYzJfY250cl90PFQ+ICZvcGVyYXRvcjw8PShjb25zdCBVICZ2YWx1ZSkgeworICAgICAgICBtVmFsdWUgPDw9IHZhbHVlOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyaXNvbiBvcGVyYXRvcnMKKyAgICAgKi8KKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IGMyX2NudHJfdDxUPiAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIFQob3RoZXIubVZhbHVlIC0gbVZhbHVlKSA8IEhBTEZfUkFOR0U7CisgICAgfQorCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I+PShjb25zdCBjMl9jbnRyX3Q8VD4gJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBUKG1WYWx1ZSAtIG90aGVyLm1WYWx1ZSkgPCBIQUxGX1JBTkdFOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGMyX2NudHJfdDxUPiAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1WYWx1ZSA9PSBvdGhlci5tVmFsdWU7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yIT0oY29uc3QgYzJfY250cl90PFQ+ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPChjb25zdCBjMl9jbnRyX3Q8VD4gJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAqdGhpcyA8PSBvdGhlciAmJiAqdGhpcyAhPSBvdGhlcjsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I+KGNvbnN0IGMyX2NudHJfdDxUPiAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICp0aGlzID49IG90aGVyICYmICp0aGlzICE9IG90aGVyOworICAgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFQsIHR5cGVuYW1lIEU9dHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19pbnRlZ3JhbDxVPjo6dmFsdWU+Ojp0eXBlPgoraW5saW5lIGNvbnN0ZXhwciBjMl9jbnRyX3Q8VD4gb3BlcmF0b3IrKGNvbnN0IFUgJmEsIGNvbnN0IGMyX2NudHJfdDxUPiAmYikgeworICAgIHJldHVybiBiICsgYTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgRT10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPFU+Ojp2YWx1ZT46OnR5cGU+CitpbmxpbmUgY29uc3RleHByIGMyX2NudHJfdDxUPiBvcGVyYXRvci0oY29uc3QgVSAmYSwgY29uc3QgYzJfY250cl90PFQ+ICZiKSB7CisgICAgcmV0dXJuIGMyX2NudHJfdDxUPihhKSAtIGI7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFQsIHR5cGVuYW1lIEU9dHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19pbnRlZ3JhbDxVPjo6dmFsdWU+Ojp0eXBlPgoraW5saW5lIGNvbnN0ZXhwciBjMl9jbnRyX3Q8VD4gb3BlcmF0b3IqKGNvbnN0IFUgJmEsIGNvbnN0IGMyX2NudHJfdDxUPiAmYikgeworICAgIHJldHVybiBiICogYTsKK30KKwordHlwZWRlZiBjMl9jbnRyX3Q8dWludDMyX3Q+IGMyX2NudHIzMl90OyAvKiogMzItYml0IGNvdW50ZXIgdHlwZSAqLwordHlwZWRlZiBjMl9jbnRyX3Q8dWludDY0X3Q+IGMyX2NudHI2NF90OyAvKiogNjQtYml0IGNvdW50ZXIgdHlwZSAqLworCisvLy8gXGNvbmQgSU5URVJOQUwKKworLy8vIFxkZWZncm91cCB1dGlsc19pbnRlcm5hbAorLy8vIEB7CisKK3RlbXBsYXRlPHR5cGVuYW1lLi4uIFQ+IHN0cnVjdCBjMl90eXBlczsKKworLyoqIHNwZWNpYWxpemF0aW9uIGZvciBhIHNpbmdsZSB0eXBlICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGMyX3R5cGVzPFQ+IHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6ZGVjYXk8VD46OnR5cGUgd2lkZV90eXBlOworICAgIHR5cGVkZWYgd2lkZV90eXBlIG5hcnJvd190eXBlOworICAgIHR5cGVkZWYgd2lkZV90eXBlIG1pbl90eXBlOyAvLyB0eXBlIGZvciBtaW4oVC4uLikKK307CisKKy8qKiBzcGVjaWFsaXphdGlvbiBmb3IgdHdvIHR5cGVzICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorc3RydWN0IGMyX3R5cGVzPFQsIFU+IHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlID09IHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgIm1peGluZyBmbG9hdGluZyBwb2ludCBhbmQgbm9uLWZsb2F0aW5nIHBvaW50IHR5cGVzIGlzIGRpc2FsbG93ZWQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2lnbmVkPFQ+Ojp2YWx1ZSA9PSBzdGQ6OmlzX3NpZ25lZDxVPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAibWl4aW5nIHNpZ25lZCBhbmQgdW5zaWduZWQgdHlwZXMgaXMgZGlzYWxsb3dlZCIpOworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmRlY2F5PAorICAgICAgICAgICAgZGVjbHR5cGUodHJ1ZSA/IHN0ZDo6ZGVjbHZhbDxUPigpIDogc3RkOjpkZWNsdmFsPFU+KCkpPjo6dHlwZSB3aWRlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmRlY2F5PAorICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxzaXplb2YoVCkgPCBzaXplb2YoVSksIFQsIFU+Ojp0eXBlPjo6dHlwZSBuYXJyb3dfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8CisgICAgICAgICAgICBzdGQ6OmlzX3NpZ25lZDxUPjo6dmFsdWUsIHdpZGVfdHlwZSwgbmFycm93X3R5cGU+Ojp0eXBlIG1pbl90eXBlOworfTsKKworLy8vIEB9CisKKy8vLyBcZW5kY29uZAorCisvKioKKyAqIFR5cGUgc3VwcG9ydCB1dGlsaXR5IGNsYXNzLiBPbmx5IHN1cHBvcnRzIHNpbWlsYXIgY2xhc3Nlcywgc3VjaCBhczoKKyAqIC0gYWxsIGZsb2F0aW5nIHBvaW50CisgKiAtIGFsbCB1bnNpZ25lZC9hbGwgc2lnbmVkCisgKiAtIGFsbCBwb2ludGVyCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lLi4uIFY+CitzdHJ1Y3QgYzJfdHlwZXM8VCwgVSwgVi4uLj4geworICAgIC8qKiBDb21tb24gdHlwZSB0aGF0IGFjY29tbW9kYXRlcyBhbGwgdGVtcGxhdGUgcGFyYW1ldGVyIHR5cGVzLiAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8dHlwZW5hbWUgYzJfdHlwZXM8VCwgVT46OndpZGVfdHlwZSwgVi4uLj46OndpZGVfdHlwZSB3aWRlX3R5cGU7CisgICAgLyoqIE5hcnJvd2VzdCB0eXBlIG9mIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgdHlwZXMuICovCisgICAgdHlwZWRlZiB0eXBlbmFtZSBjMl90eXBlczx0eXBlbmFtZSBjMl90eXBlczxULCBVPjo6bmFycm93X3R5cGUsIFYuLi4+OjpuYXJyb3dfdHlwZSBuYXJyb3dfdHlwZTsKKyAgICAvKiogVHlwZSB0aGF0IGFjY29tbW9kYXRlcyB0aGUgbWluaW11bSB2YWx1ZSBmb3IgYW55IGlucHV0IGZvciB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIHR5cGVzLiAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8dHlwZW5hbWUgYzJfdHlwZXM8VCwgVT46Om1pbl90eXBlLCBWLi4uPjo6bWluX3R5cGUgbWluX3R5cGU7Cit9OworCisvKioKKyAqICBcaW5ncm91cCB1dGlsc19pbnRlcm5hbAorICogc3BlY2lhbGl6YXRpb24gZm9yIHR3byB2YWx1ZXMgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CitpbmxpbmUgY29uc3RleHByIHR5cGVuYW1lIGMyX3R5cGVzPFQsIFU+Ojp3aWRlX3R5cGUgYzJfbWF4KGNvbnN0IFQgYSwgY29uc3QgVSBiKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjMl90eXBlczxULCBVPjo6d2lkZV90eXBlIHdpZGVfdHlwZTsKKyAgICByZXR1cm4gKHsgd2lkZV90eXBlIGFfKGEpLCBiXyhiKTsgYV8gPiBiXyA/IGFfIDogYl87IH0pOworfQorCisvKioKKyAqIEZpbmRzIHRoZSBtYXhpbXVtIHZhbHVlIG9mIGEgbGlzdCBvZiAic2ltaWxhcmx5IHR5cGVkIiB2YWx1ZXMuCisgKgorICogVGhpcyBpcyBhbiBleHRlbnNpb24gdG8gc3RkOjptYXggd2hlcmUgdGhlIHR5cGVzIGRvIG5vdCBoYXZlIHRvIGJlIGlkZW50aWNhbCwgYW5kIHRoZSBzbWFsbGVzdAorICogcmVzdWx0aW5nIHR5cGUgaXMgdXNlZCB0aGF0IGFjY29tbW9kYXRlcyB0aGUgYXJndW1lbnQgdHlwZXMuCisgKgorICogXG5vdGUgVmFsdWUgdHlwZXMgbXVzdCBiZSBzaW1pbGFyLCBlLmcuIGFsbCBmbG9hdGluZyBwb2ludCwgYWxsIHBvaW50ZXJzLCBhbGwgc2lnbmVkLCBvciBhbGwKKyAqIHVuc2lnbmVkLgorICoKKyAqIEByZXR1cm4gdGhlIGxhcmdlc3Qgb2YgdGhlIGlucHV0IGFyZ3VtZW50cy4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUuLi4gVj4KK2NvbnN0ZXhwciB0eXBlbmFtZSBjMl90eXBlczxULCBVLCBWLi4uPjo6d2lkZV90eXBlIGMyX21heChjb25zdCBUIGEsIGNvbnN0IFUgYiwgY29uc3QgViAuLi4gYykgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8VCwgVSwgVi4uLj46OndpZGVfdHlwZSB3aWRlX3R5cGU7CisgICAgcmV0dXJuICh7IHdpZGVfdHlwZSBhXyhhKSwgYl8oYzJfbWF4KGIsIGMuLi4pKTsgYV8gPiBiXyA/IGFfIDogYl87IH0pOworfQorCisvKioKKyAqICBcaW5ncm91cCB1dGlsc19pbnRlcm5hbAorICogc3BlY2lhbGl6YXRpb24gZm9yIHR3byB2YWx1ZXMgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CitpbmxpbmUgY29uc3RleHByIHR5cGVuYW1lIGMyX3R5cGVzPFQsIFU+OjptaW5fdHlwZSBjMl9taW4oY29uc3QgVCBhLCBjb25zdCBVIGIpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGMyX3R5cGVzPFQsIFU+Ojp3aWRlX3R5cGUgd2lkZV90eXBlOworICAgIHJldHVybiAoeworICAgICAgICB3aWRlX3R5cGUgYV8oYSksIGJfKGIpOworICAgICAgICBzdGF0aWNfY2FzdDx0eXBlbmFtZSBjMl90eXBlczxULCBVPjo6bWluX3R5cGU+KGFfIDwgYl8gPyBhXyA6IGJfKTsKKyAgICB9KTsKK30KKworLyoqCisgKiBGaW5kcyB0aGUgbWluaW11bSB2YWx1ZSBvZiBhIGxpc3Qgb2YgInNpbWlsYXJseSB0eXBlZCIgdmFsdWVzLgorICoKKyAqIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIHRvIHN0ZDo6bWluIHdoZXJlIHRoZSB0eXBlcyBkbyBub3QgaGF2ZSB0byBiZSBpZGVudGljYWwsIGFuZCB0aGUgc21hbGxlc3QKKyAqIHJlc3VsdGluZyB0eXBlIGlzIHVzZWQgdGhhdCBhY2NvbW1vZGF0ZXMgdGhlIGFyZ3VtZW50IHR5cGVzLgorICoKKyAqIFxub3RlIFZhbHVlIHR5cGVzIG11c3QgYmUgc2ltaWxhciwgZS5nLiBhbGwgZmxvYXRpbmcgcG9pbnQsIGFsbCBwb2ludGVycywgYWxsIHNpZ25lZCwgb3IgYWxsCisgKiB1bnNpZ25lZC4KKyAqCisgKiBAcmV0dXJuIHRoZSBzbWFsbGVzdCBvZiB0aGUgaW5wdXQgYXJndW1lbnRzLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZS4uLiBWPgorY29uc3RleHByIHR5cGVuYW1lIGMyX3R5cGVzPFQsIFUsIFYuLi4+OjptaW5fdHlwZSBjMl9taW4oY29uc3QgVCBhLCBjb25zdCBVIGIsIGNvbnN0IFYgLi4uIGMpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGMyX3R5cGVzPFUsIFYuLi4+OjptaW5fdHlwZSByZXN0X3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjMl90eXBlczxULCByZXN0X3R5cGU+Ojp3aWRlX3R5cGUgd2lkZV90eXBlOworICAgIHJldHVybiAoeworICAgICAgICB3aWRlX3R5cGUgYV8oYSksIGJfKGMyX21pbihiLCBjLi4uKSk7CisgICAgICAgIHN0YXRpY19jYXN0PHR5cGVuYW1lIGMyX3R5cGVzPFQsIHJlc3RfdHlwZT46Om1pbl90eXBlPihhXyA8IGJfID8gYV8gOiBiXyk7CisgICAgfSk7Cit9CisKKy8qKgorICogIFxpbmdyb3VwIHV0aWxzX2ludGVybmFsCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lIFY+CitpbmxpbmUgY29uc3RleHByIHR5cGVuYW1lIGMyX3R5cGVzPFQsIFY+Ojp3aWRlX3R5cGUgYzJfY2xhbXAoY29uc3QgVCBhLCBjb25zdCBVIGIsIGNvbnN0IFYgYykgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8VCwgVSwgVj46OndpZGVfdHlwZSB3aWRlX3R5cGU7CisgICAgcmV0dXJuICh7CisgICAgICAgIHdpZGVfdHlwZSBhXyhhKSwgYl8oYiksIGNfKGMpOworICAgICAgICBzdGF0aWNfY2FzdDx0eXBlbmFtZSBjMl90eXBlczxULCBWPjo6d2lkZV90eXBlPihiXyA8IGFfID8gYV8gOiBiXyA+IGNfID8gY18gOiBiXyk7CisgICAgfSk7Cit9CisKKy8vLyBAfQorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3Qgc3RkOjpsZXNzPDo6YzJfY250cl90PFQ+PiB7CisgICAgY29uc3RleHByIGJvb2wgb3BlcmF0b3IoKShjb25zdCA6OmMyX2NudHJfdDxUPiAmbGgsIGNvbnN0IDo6YzJfY250cl90PFQ+ICZyaCkgY29uc3QgeworICAgICAgICByZXR1cm4gbGgucGVla3UoKSA8IHJoLnBlZWt1KCk7CisgICAgfQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3Qgc3RkOjpsZXNzX2VxdWFsPDo6YzJfY250cl90PFQ+PiB7CisgICAgY29uc3RleHByIGJvb2wgb3BlcmF0b3IoKShjb25zdCA6OmMyX2NudHJfdDxUPiAmbGgsIGNvbnN0IDo6YzJfY250cl90PFQ+ICZyaCkgY29uc3QgeworICAgICAgICByZXR1cm4gbGgucGVla3UoKSA8PSByaC5wZWVrdSgpOworICAgIH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IHN0ZDo6Z3JlYXRlcjw6OmMyX2NudHJfdDxUPj4geworICAgIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yKCkoY29uc3QgOjpjMl9jbnRyX3Q8VD4gJmxoLCBjb25zdCA6OmMyX2NudHJfdDxUPiAmcmgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxoLnBlZWt1KCkgPiByaC5wZWVrdSgpOworICAgIH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IHN0ZDo6Z3JlYXRlcl9lcXVhbDw6OmMyX2NudHJfdDxUPj4geworICAgIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yKCkoY29uc3QgOjpjMl9jbnRyX3Q8VD4gJmxoLCBjb25zdCA6OmMyX2NudHJfdDxUPiAmcmgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxoLnBlZWt1KCkgPj0gcmgucGVla3UoKTsKKyAgICB9Cit9OworCisjZW5kaWYgIC8vIEMyX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQnVmZmVyLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk5N2Y2ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJCdWZmZXIuaApAQCAtMCwwICsxLDIzMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyQlVGRkVSX0hfCisjZGVmaW5lIEMyQlVGRkVSX0hfCisKKyNpbmNsdWRlIDxDMi5oPgorI2luY2x1ZGUgPEMyQnVmZmVyQmFzZS5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4gLy8gZm9yIEMySW5mbworCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSA8YW5kcm9pZC1DMkJ1ZmZlci5oPgorI2Vsc2UKKwordHlwZWRlZiB2b2lkKiBDMkhhbmRsZTsKKworI2VuZGlmCisKKy8vLyBcZGVmZ3JvdXAgYnVmZmVyIEJ1ZmZlcnMKKy8vLyBAeworCisvLy8gXGRlZmdyb3VwIGJ1ZmZlcl9zeW5jIFN5bmNocm9uaXphdGlvbgorLy8vIEB7CisKKy8qKgorICogU3luY2hyb25pemF0aW9uIGlzIGFjY29tcGxpc2hlZCB1c2luZyBldmVudCBhbmQgZmVuY2Ugb2JqZWN0cy4KKyAqCisgKiBUaGVzZSBhcmUgY3Jvc3MtcHJvY2VzcyBleHRlbnNpb25zIG9mIHByb21pc2UvZnV0dXJlIGluZnJhc3RydWN0dXJlLgorICogRXZlbnRzIGFyZSBhbmFsb2dvdXMgdG8gc3RkOjpwcm9taXNlPHZvaWQ+LCB3aGVyZWFzIGZlbmNlcyBhcmUgdG8gc3RkOjpzaGFyZWRfZnV0dXJlPHZvaWQ+LgorICoKKyAqIEZlbmNlcyBhbmQgZXZlbnRzIGFyZSBzaGFyZWFibGUvY29weWFibGUuCisgKgorICogRmVuY2VzIGFyZSB1c2VkIGluIHR3byBzY2VuYXJpb3MsIGFuZCBhbGwgY29waWVkIGluc3RhbmNlcyByZWZlciB0byB0aGUgc2FtZSBldmVudC4KKyAqIFx0b2RvIGRvIGV2ZW50cyBuZWVkIHRvIGJlIGNvcHlhYmxlIG9yIHNob3VsZCB0aGV5IGJlIHVuaXF1ZT8KKyAqCisgKiBhY3F1aXJlIHN5bmMgZmVuY2Ugb2JqZWN0OiBzaWduYWxlZCB3aGVuIGl0IGlzIHNhZmUgZm9yIHRoZSBjb21wb25lbnQgb3IgY2xpZW50IHRvIGFjY2VzcworICogKHRoZSBjb250ZW50cyBvZikgYW4gb2JqZWN0LgorICoKKyAqIHJlbGVhc2Ugc3luYyBmZW5jZSBvYmplY3Q6IFx0b2RvCisgKgorICogRmVuY2VzIGNhbiBiZSBiYWNrZWQgYnkgaGFyZHdhcmUuIEhhcmR3YXJlIGZlbmNlcyBhcmUgZ3VhcmFudGVlZCB0byBzaWduYWwgTk8gTUFUVEVSIFdIQVQgd2l0aGluCisgKiBhIHNob3J0IChwbGF0Zm9ybSBzcGVjaWZpYykgYW1vdW50IG9mIHRpbWU7IHRoaXMgZ3VhcmFudGVlIGlzIHVzdWFsbHkgbGVzcyB0aGFuIDE1IG1zZWNzLgorICovCisKKy8qKgorICogRmVuY2Ugb2JqZWN0IHVzZWQgYnkgY29tcG9uZW50cyBhbmQgdGhlIGZyYW1ld29yay4KKyAqCisgKiBJbXBsZW1lbnRzIHRoZSB3YWl0aW5nIGZvciBhbiBldmVudCwgYW5hbG9nb3VzIHRvIGEgJ2Z1dHVyZScuCisgKgorICogVG8gYmUgaW1wbGVtZW50ZWQgYnkgdmVuZG9ycyBpZiB1c2luZyBIVyBmZW5jZXMuCisgKi8KK2NsYXNzIEMyRmVuY2UgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFdhaXRzIGZvciBhIGZlbmNlIHRvIGJlIHNpZ25hbGVkIHdpdGggYSB0aW1lb3V0LgorICAgICAqCisgICAgICogXHRvZG8gYSBtZWNoYW5pc20gdG8gY2FuY2VsIGEgd2FpdCAtIGZvciBub3cgdGhlIG9ubHkgd2F5IHRvIGRvIHRoaXMgaXMgdG8gYWJhbmRvbiB0aGUKKyAgICAgKiBldmVudCwgYnV0IGZlbmNlcyBhcmUgc2hhcmVkIHNvIGNhbmNlbGluZyBhIHdhaXQgd2lsbCBjYW5jZWwgYWxsIHdhaXRzLgorICAgICAqCisgICAgICogXHBhcmFtIHRpbWVvdXROcyAgICAgICAgICAgdGhlIG1heGltdW0gdGltZSB0byB3YWl0IGluIG5zZWNzCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICAgICAgdGhlIGZlbmNlIGhhcyBiZWVuIHNpZ25hbGVkCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgICAgIHRoZSBmZW5jZSBoYXMgbm90IGJlZW4gc2lnbmFsZWQgd2l0aGluIHRoZSB0aW1lb3V0CisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgICAgIHRoZSBmZW5jZSBoYXMgYmVlbiBhYmFuZG9uZWQgd2l0aG91dCBiZWluZyBzaWduYWxlZCAoaXQgd2lsbCBuZXZlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBzaWduYWxlZCkKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICAgICAgbm8gcGVybWlzc2lvbiB0byB3YWl0IGZvciB0aGUgZmVuY2UgKHVuZXhwZWN0ZWQgLSBzeXN0ZW0pCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgICAgIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgd2FpdGluZyBmb3IgdGhlIGZlbmNlICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIGMyX3N0YXR1c190IHdhaXQoYzJfbnNlY3NfdCB0aW1lb3V0TnMpOworCisgICAgLyoqCisgICAgICogVXNlZCB0byBjaGVjayBpZiB0aGlzIGZlbmNlIGlzIHZhbGlkIChpZiB0aGVyZSBpcyBhIGNoYW5jZSBmb3IgaXQgdG8gYmUgc2lnbmFsZWQuKQorICAgICAqIEEgZmVuY2UgYmVjb21lcyBpbnZhbGlkIGlmIHRoZSBjb250cm9saW5nIGV2ZW50IGlzIGRlc3Ryb3llZCB3aXRob3V0IGl0IHNpZ25hbGluZyB0aGUgZmVuY2UuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHdoZXRoZXIgdGhpcyBmZW5jZSBpcyB2YWxpZAorICAgICAqLworICAgIGJvb2wgdmFsaWQoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gY2hlY2sgaWYgdGhpcyBmZW5jZSBoYXMgYmVlbiBzaWduYWxlZCAoaXMgcmVhZHkpLgorICAgICAqCisgICAgICogXHJldHVybiB3aGV0aGVyIHRoaXMgZmVuY2UgaGFzIGJlZW4gc2lnbmFsZWQKKyAgICAgKi8KKyAgICBib29sIHJlYWR5KCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgZmlsZSBkZXNjcmlwdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gd2FpdCBmb3IgdGhpcyBmZW5jZSBpbiBhIHNlbGVjdCBzeXN0ZW0gY2FsbC4KKyAgICAgKiBcbm90ZSBUaGUgcmV0dXJuZWQgZmlsZSBkZXNjcmlwdG9yLCBpZiB2YWxpZCwgbXVzdCBiZSBjbG9zZWQgYnkgdGhlIGNhbGxlci4KKyAgICAgKgorICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgaW4gZS5nLiBwb2xsKCkgc3lzdGVtIGNhbGxzLiBUaGlzIGZpbGUgYmVjb21lcyByZWFkYWJsZSAoUE9MTElOKSB3aGVuIHRoZQorICAgICAqIGZlbmNlIGlzIHNpZ25hbGVkLCBhbmQgYmFkIChQT0xMRVJSKSBpZiB0aGUgZmVuY2UgaXMgYWJhbmRvbmVkLgorICAgICAqCisgICAgICogXHJldHVybiBhIGZpbGUgZGVzY3JpcHRvciByZXByZXNlbnRpbmcgdGhpcyBmZW5jZSAod2l0aCBvd25lcnNoaXApLCBvciAtMSBpZiB0aGUgZmVuY2UKKyAgICAgKiBoYXMgYWxyZWFkeSBiZWVuIHNpZ25hbGVkIChcdG9kbyBvciBhYmFuZG9uZWQpLgorICAgICAqCisgICAgICogXHRvZG8gdGhpcyBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCBmZW5jZXMgdXNlZCBieSBncmFsbG9jCisgICAgICovCisgICAgaW50IGZkKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmZW5jZSBpcyBhIGhhcmR3YXJlLWJhY2tlZCBmZW5jZS4KKyAgICAgKiBccmV0dXJuIHdoZXRoZXIgdGhpcyBpcyBhIGhhcmR3YXJlIGZlbmNlCisgICAgICovCisgICAgYm9vbCBpc0hXKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBOdWxsLWZlbmNlLiBBIGZlbmNlIHRoYXQgaGFzIGZpcmVkLgorICAgICAqLworICAgIGNvbnN0ZXhwciBDMkZlbmNlKCkgOiBtSW1wbChudWxscHRyKSB7IH0KKworcHJpdmF0ZToKKyAgICBjbGFzcyBJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKKyAgICBDMkZlbmNlKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsKTsKKyAgICBmcmllbmQgc3RydWN0IF9DMkZlbmNlRmFjdG9yeTsKK307CisKKy8qKgorICogRXZlbnQgb2JqZWN0IHVzZWQgYnkgY29tcG9uZW50cyBhbmQgdGhlIGZyYW1ld29yay4KKyAqCisgKiBJbXBsZW1lbnRzIHRoZSBzaWduYWxpbmcgb2YgYW4gZXZlbnQsIGFuYWxvZ291cyB0byBhICdwcm9taXNlJy4KKyAqCisgKiBIYXJkd2FyZSBiYWNrZWQgZXZlbnRzIGRvIG5vdCBnbyB0aHJvdWdoIHRoaXMgb2JqZWN0LCBhbmQgbXVzdCBiZSBleHBvc2VkIGRpcmVjdGx5IGFzIGZlbmNlcworICogYnkgdmVuZG9ycy4KKyAqLworY2xhc3MgQzJFdmVudCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGZlbmNlIGZvciB0aGlzIGV2ZW50LgorICAgICAqLworICAgIEMyRmVuY2UgZmVuY2UoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFNpZ25hbHMgKGFsbCkgYXNzb2NpYXRlZCBmZW5jZShzKS4KKyAgICAgKiBUaGlzIGhhcyBubyBlZmZlY3Qgbm8gZWZmZWN0IGlmIHRoZSBldmVudCB3YXMgYWxyZWFkeSBzaWduYWxlZCBvciBhYmFuZG9uZWQuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICAgICAgdGhlIGZlbmNlKHMpIHdlcmUgc3VjY2Vzc2Z1bGx5IHNpZ25hbGVkCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgICAgIHRoZSBmZW5jZShzKSBoYXZlIGFscmVhZHkgYmVlbiBhYmFuZG9uZWQgb3IgbWVyZ2VkIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgICAgIHRoZSBmZW5jZShzKSBoYXZlIGFscmVhZHkgYmVlbiBzaWduYWxlZCAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgICAgICBubyBwZXJtaXNzaW9uIHRvIHNpZ25hbCB0aGUgZmVuY2UgKHVuZXhwZWN0ZWQgLSBzeXN0ZW0pCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgICAgIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgc2lnbmFsaW5nIHRoZSBmZW5jZShzKSAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBmaXJlKCk7CisKKyAgICAvKioKKyAgICAgKiBUcmlnZ2VyIHRoaXMgZXZlbnQgZnJvbSB0aGUgbWVyZ2luZyBvZiB0aGUgc3VwcGxpZWQgZmVuY2VzLiBUaGlzIG1lYW5zIHRoYXQgaXQgd2lsbCBiZQorICAgICAqIGFiYW5kb25lZCBpZiBhbnkgb2YgdGhlc2UgZmVuY2VzIGhhdmUgYmVlbiBhYmFuZG9uZWQsIGFuZCBpdCB3aWxsIGJlIGZpcmVkIGlmIGFsbCBvZiB0aGVzZQorICAgICAqIGZlbmNlcyBoYXZlIGJlZW4gc2lnbmFsZWQuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICAgICAgdGhlIG1lcmdpbmcgd2FzIHN1Y2Nlc3NmdWxseSBkb25lCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgICAgIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHBlcmZvcm0gdGhlIG1lcmdpbmcKKyAgICAgKiBccmV0dmFsIEMyX0RVUExJQ0FURSAgICAgdGhlIGZlbmNlIGhhdmUgYWxyZWFkeSBiZWVuIG1lcmdlZCAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFICAgICB0aGUgZmVuY2UgaGF2ZSBhbHJlYWR5IGJlZW4gc2lnbmFsZWQgb3IgYWJhbmRvbmVkIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgICAgIG5vIHBlcm1pc3Npb24gdG8gbWVyZ2UgdGhlIGZlbmNlICh1bmV4cGVjdGVkIC0gc3lzdGVtKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEICAgICBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIG1lcmdpbmcgdGhlIGZlbmNlKHMpICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIGMyX3N0YXR1c190IG1lcmdlKHN0ZDo6dmVjdG9yPEMyRmVuY2U+IGZlbmNlcyk7CisKKyAgICAvKioKKyAgICAgKiBBYmFuZG9ucyB0aGUgZXZlbnQgYW5kIGFueSBhc3NvY2lhdGVkIGZlbmNlKHMpLgorICAgICAqIFxub3RlIENhbGwgdGhpcyB0byBleHBsaWNpdGx5IGFiYW5kb24gYW4gZXZlbnQgYmVmb3JlIGl0IGlzIGRlc3RydWN0ZWQgdG8gYXZvaWQgYSB3YXJuaW5nLgorICAgICAqCisgICAgICogVGhpcyBoYXMgbm8gZWZmZWN0IG5vIGVmZmVjdCBpZiB0aGUgZXZlbnQgd2FzIGFscmVhZHkgc2lnbmFsZWQgb3IgYWJhbmRvbmVkLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgICAgIHRoZSBmZW5jZShzKSB3ZXJlIHN1Y2Nlc3NmdWxseSBzaWduYWxlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFICAgICB0aGUgZmVuY2UocykgaGF2ZSBhbHJlYWR5IGJlZW4gc2lnbmFsZWQgb3IgbWVyZ2VkIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgICAgIHRoZSBmZW5jZShzKSBoYXZlIGFscmVhZHkgYmVlbiBhYmFuZG9uZWQgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICAgICAgbm8gcGVybWlzc2lvbiB0byBhYmFuZG9uIHRoZSBmZW5jZSAodW5leHBlY3RlZCAtIHN5c3RlbSkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCAgICAgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCBzaWduYWxpbmcgdGhlIGZlbmNlKHMpICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIGMyX3N0YXR1c190IGFiYW5kb24oKTsKKworcHJpdmF0ZToKKyAgICBjbGFzcyBJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKK307CisKKy8vLyBcYWRkdG9ncm91cCBidWZfaW50ZXJuYWwgSW50ZXJuYWwKKy8vLyBAeworCisvKioKKyAqIEludGVyZmFjZSBmb3Igb2JqZWN0cyB0aGF0IGVuY2Fwc3VsYXRlIGFuIHVwZGF0YWJsZSBzdGF0dXMgdmFsdWUuCisgKi8KK3N0cnVjdCBfQzJJbm5hdGVTdGF0dXMgeworICAgIGlubGluZSBjMl9zdGF0dXNfdCBzdGF0dXMoKSBjb25zdCB7IHJldHVybiBtU3RhdHVzOyB9CisKK3Byb3RlY3RlZDoKKyAgICBfQzJJbm5hdGVTdGF0dXMoYzJfc3RhdHVzX3Qgc3RhdHVzKSA6IG1TdGF0dXMoc3RhdHVzKSB7IH0KKworICAgIGMyX3N0YXR1c190IG1TdGF0dXM7IC8vIHRoaXMgc3RhdHVzIGlzIHVwZGF0YWJsZSBieSB0aGUgb2JqZWN0Cit9OworCisvLy8gQH0KKworLyoqCisgKiBUaGlzIGlzIGEgdXRpbGl0eSB0ZW1wbGF0ZSBmb3Igb2JqZWN0cyBwcm90ZWN0ZWQgYnkgYW4gYWNxdWlyZSBmZW5jZSwgc28gdGhhdCBlcnJvcnMgZHVyaW5nCisgKiBhY3F1aXJpbmcgdGhlIG9iamVjdCBhcmUgcHJvcGFnYXRlZCB0byB0aGUgb2JqZWN0IGl0c2VsZi4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIEMyQWNxdWlyYWJsZSA6IHB1YmxpYyBDMkZlbmNlIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBBY3F1aXJlcyB0aGUgb2JqZWN0IHByb3RlY3RlZCBieSBhbiBhY3F1aXJlIGZlbmNlLiBBbnkgZXJyb3JzIGR1cmluZyB0aGUgbWFwcGluZyB3aWxsIGJlCisgICAgICogcGFzc2VkIHRvIHRoZSBvYmplY3QuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGFjcXVpcmVkIG9iamVjdCBwb3RlbnRpYWxseSBpbnZhbGlkYXRlZCBpZiB3YWl0aW5nIGZvciB0aGUgZmVuY2UgZmFpbGVkLgorICAgICAqLworICAgIFQgZ2V0KCkgeworICAgICAgICAvLyBUT0RPOgorICAgICAgICAvLyB3YWl0KCk7CisgICAgICAgIHJldHVybiBtVDsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBDMkFjcXVpcmFibGUoYzJfc3RhdHVzX3QgZXJyb3IsIEMyRmVuY2UgZmVuY2UsIFQgdCkgOiBDMkZlbmNlKGZlbmNlKSwgbUluaXRpYWxFcnJvcihlcnJvciksIG1UKHQpIHsgfQorCitwcml2YXRlOgorICAgIGMyX3N0YXR1c190IG1Jbml0aWFsRXJyb3I7CisgICAgVCBtVDsgLy8gVE9ETzogbW92ZSBpbnN0ZWFkIG9mIGNvcHkKK307CisKKy8vLyBAfQorCisvLy8gXGRlZmdyb3VwIGxpbmVhciBMaW5lYXIgRGF0YSBCbG9ja3MKKy8vLyBAeworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgTElORUFSIEFTUEVDVFMsIEJMT0NLUyBBTkQgVklFV1MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEJhc2ljIHNlZ21lbnQgbWF0aCBzdXBwb3J0LgorICovCitzdHJ1Y3QgQzJTZWdtZW50IHsKKyAgICB1aW50MzJfdCBvZmZzZXQ7CisgICAgdWludDMyX3Qgc2l6ZTsKKworICAgIGlubGluZSBjb25zdGV4cHIgQzJTZWdtZW50KHVpbnQzMl90IG9mZnNldF8sIHVpbnQzMl90IHNpemVfKQorICAgICAgICA6IG9mZnNldChvZmZzZXRfKSwKKyAgICAgICAgICBzaXplKHNpemVfKSB7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIGlzRW1wdHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzaXplID09IDA7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIGlzVmFsaWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBvZmZzZXQgPD0gfnNpemU7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBvcGVyYXRvciBib29sKCkgY29uc3QgeworICAgICAgICByZXR1cm4gaXNWYWxpZCgpICYmICFpc0VtcHR5KCk7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yISgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFib29sKCp0aGlzKTsKKyAgICB9CisKKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBjb250YWlucyhjb25zdCBDMlNlZ21lbnQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIGlmICghaXNWYWxpZCgpIHx8ICFvdGhlci5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBvZmZzZXQgPD0gb3RoZXIub2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICYmIG9mZnNldCArIHNpemUgPj0gb3RoZXIub2Zmc2V0ICsgb3RoZXIuc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEMyU2VnbWVudCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgaWYgKCFpc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAhb3RoZXIuaXNWYWxpZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG9mZnNldCA9PSBvdGhlci5vZmZzZXQgJiYgc2l6ZSA9PSBvdGhlci5zaXplOworICAgICAgICB9CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yIT0oY29uc3QgQzJTZWdtZW50ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0ob3RoZXIpOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEMyU2VnbWVudCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5zKG90aGVyKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEMyU2VnbWVudCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5zKG90aGVyKSAmJiAhb3BlcmF0b3I9PShvdGhlcik7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPD0oY29uc3QgQzJTZWdtZW50ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gb3RoZXIuY29udGFpbnMoKnRoaXMpOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjwoY29uc3QgQzJTZWdtZW50ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gb3RoZXIuY29udGFpbnMoKnRoaXMpICYmICFvcGVyYXRvcj09KG90aGVyKTsKKyAgICB9CisKKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgdWludDMyX3QgZW5kKCkgY29uc3QgeworICAgICAgICByZXR1cm4gb2Zmc2V0ICsgc2l6ZTsKKyAgICB9CisKKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgQzJTZWdtZW50IGludGVyc2VjdChjb25zdCBDMlNlZ21lbnQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlNlZ21lbnQoYzJfbWF4KG9mZnNldCwgb3RoZXIub2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjMl9taW4oZW5kKCksIG90aGVyLmVuZCgpKSAtIGMyX21heChvZmZzZXQsIG90aGVyLm9mZnNldCkpOworICAgIH0KKworICAgIC8qKiBjbGFtcHMgZW5kIHRvIG9mZnNldCBpZiBpdCBvdmVyZmxvd3MgKi8KKyAgICBpbmxpbmUgY29uc3RleHByIEMyU2VnbWVudCBub3JtYWxpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlNlZ21lbnQob2Zmc2V0LCBjMl9tYXgob2Zmc2V0LCBlbmQoKSkgLSBvZmZzZXQpOworICAgIH0KKworICAgIC8qKiBjbGFtcHMgZW5kIHRvIG1heCBpZiBpdCBvdmVyZmxvd3MgKi8KKyAgICBpbmxpbmUgY29uc3RleHByIEMyU2VnbWVudCBzYXR1cmF0ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyU2VnbWVudChvZmZzZXQsIGMyX21pbihzaXplLCB+b2Zmc2V0KSk7CisgICAgfQorCit9OworCisvKioKKyAqIENvbW1vbiBhc3BlY3QgZm9yIGFsbCBvYmplY3RzIHRoYXQgaGF2ZSBhIGxpbmVhciBjYXBhY2l0eS4KKyAqLworY2xhc3MgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgeworLy8vIFxuYW1lIExpbmVhciBjYXBhY2l0eSBpbnRlcmZhY2UKKy8vLyBAeworcHVibGljOgorICAgIGlubGluZSBjb25zdGV4cHIgdWludDMyX3QgY2FwYWNpdHkoKSBjb25zdCB7IHJldHVybiBtQ2FwYWNpdHk7IH0KKworICAgIGlubGluZSBjb25zdGV4cHIgb3BlcmF0b3IgQzJTZWdtZW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJTZWdtZW50KDAsIG1DYXBhY2l0eSk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisKKyNpZiBVSU5UUFRSX01BWCA9PSAweGZmZmZmZmZmCisgICAgc3RhdGljX2Fzc2VydChzaXplb2Yoc2l6ZV90KSA9PSBzaXplb2YodWludDMyX3QpLCAic2l6ZV90IGlzIHRvbyBiaWciKTsKKyNlbHNlCisgICAgc3RhdGljX2Fzc2VydChzaXplb2Yoc2l6ZV90KSA+IHNpemVvZih1aW50MzJfdCksICJzaXplX3QgaXMgdG9vIHNtYWxsIik7CisgICAgLy8gZXhwbGljaXRseSBkaXNhYmxlIGNvbnN0cnVjdGlvbiBmcm9tIHNpemVfdAorICAgIGlubGluZSBleHBsaWNpdCBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChzaXplX3QgY2FwYWNpdHkpID0gZGVsZXRlOworI2VuZGlmCisKKyAgICBpbmxpbmUgZXhwbGljaXQgY29uc3RleHByIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KHVpbnQzMl90IGNhcGFjaXR5KQorICAgICAgOiBtQ2FwYWNpdHkoY2FwYWNpdHkpIHsgfQorCisgICAgaW5saW5lIGV4cGxpY2l0IGNvbnN0ZXhwciBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChjb25zdCBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCAqcGFyZW50KQorICAgICAgICA6IG1DYXBhY2l0eShwYXJlbnQgPT0gbnVsbHB0ciA/IDAgOiBwYXJlbnQtPmNhcGFjaXR5KCkpIHsgfQorCitwcml2YXRlOgorICAgIHVpbnQzMl90IG1DYXBhY2l0eTsKKy8vLyBAfQorfTsKKworLyoqCisgKiBBc3BlY3QgZm9yIG9iamVjdHMgdGhhdCBoYXZlIGEgbGluZWFyIHJhbmdlIGluc2lkZSBhIGxpbmVhciBjYXBhY2l0eS4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIGNvcGlhYmxlLgorICovCitjbGFzcyBfQzJMaW5lYXJSYW5nZUFzcGVjdCA6IHB1YmxpYyBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCB7CisvLy8gXG5hbWUgTGluZWFyIHJhbmdlIGludGVyZmFjZQorLy8vIEB7CitwdWJsaWM6CisgICAgaW5saW5lIGNvbnN0ZXhwciB1aW50MzJfdCBvZmZzZXQoKSBjb25zdCB7IHJldHVybiBtT2Zmc2V0OyB9CisgICAgaW5saW5lIGNvbnN0ZXhwciB1aW50MzJfdCBlbmRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBtT2Zmc2V0ICsgbVNpemU7IH0KKyAgICBpbmxpbmUgY29uc3RleHByIHVpbnQzMl90IHNpemUoKSBjb25zdCB7IHJldHVybiBtU2l6ZTsgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBvcGVyYXRvciBDMlNlZ21lbnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlNlZ21lbnQobU9mZnNldCwgbVNpemUpOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLyBzdWJyYW5nZSBvZiBjYXBhY2l0eSBbMCwgY2FwYWNpdHldICYgW3NpemUsIHNpemUgKyBvZmZzZXRdCisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJMaW5lYXJSYW5nZUFzcGVjdCh1aW50MzJfdCBjYXBhY2l0eV8sIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQorICAgICAgICA6IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KGNhcGFjaXR5XyksCisgICAgICAgICAgbU9mZnNldChjMl9taW4ob2Zmc2V0LCBjYXBhY2l0eSgpKSksCisgICAgICAgICAgbVNpemUoYzJfbWluKHNpemUsIGNhcGFjaXR5KCkgLSBtT2Zmc2V0KSkgeworICAgIH0KKworcHJvdGVjdGVkOgorICAgIC8vIGNvcHkgY29uc3RydWN0b3IgKG5vIGVycm9yIGNoZWNrKQorICAgIGlubGluZSBjb25zdGV4cHIgX0MyTGluZWFyUmFuZ2VBc3BlY3QoY29uc3QgX0MyTGluZWFyUmFuZ2VBc3BlY3QgJm90aGVyKQorICAgICAgICA6IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KG90aGVyLmNhcGFjaXR5KCkpLAorICAgICAgICAgIG1PZmZzZXQob3RoZXIub2Zmc2V0KCkpLAorICAgICAgICAgIG1TaXplKG90aGVyLnNpemUoKSkgeworICAgIH0KKworICAgIC8vIHBhcmVudCBjYXBhY2l0eSByYW5nZSBbMCwgY2FwYWNpdHldCisgICAgaW5saW5lIGNvbnN0ZXhwciBleHBsaWNpdCBfQzJMaW5lYXJSYW5nZUFzcGVjdChjb25zdCBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCAqcGFyZW50KQorICAgICAgICA6IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KHBhcmVudCksCisgICAgICAgICAgbU9mZnNldCgwKSwKKyAgICAgICAgICBtU2l6ZShjYXBhY2l0eSgpKSB7CisgICAgfQorCisgICAgLy8gc3VicmFuZ2Ugb2YgcGFyZW50IGNhcGFjaXR5IFswLCBjYXBhY2l0eV0gJiBbc2l6ZSwgc2l6ZSArIG9mZnNldF0KKyAgICBpbmxpbmUgY29uc3RleHByIF9DMkxpbmVhclJhbmdlQXNwZWN0KGNvbnN0IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0ICpwYXJlbnQsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQorICAgICAgICA6IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KHBhcmVudCksCisgICAgICAgICAgbU9mZnNldChjMl9taW4ob2Zmc2V0LCBjYXBhY2l0eSgpKSksCisgICAgICAgICAgbVNpemUoYzJfbWluKHNpemUsIGNhcGFjaXR5KCkgLSBtT2Zmc2V0KSkgeworICAgIH0KKworICAgIC8vIHN1YnNlY3Rpb24gb2YgdGhlIHBhcmVudCdzIGFuZCBbb2Zmc2V0LCBvZmZzZXQgKyBzaXplXSByYW5nZXMKKyAgICBpbmxpbmUgY29uc3RleHByIF9DMkxpbmVhclJhbmdlQXNwZWN0KGNvbnN0IF9DMkxpbmVhclJhbmdlQXNwZWN0ICpwYXJlbnQsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQorICAgICAgICA6IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KHBhcmVudCksCisgICAgICAgICAgbU9mZnNldChjMl9taW4oYzJfbWF4KG9mZnNldCwgcGFyZW50ID09IG51bGxwdHIgPyAwIDogcGFyZW50LT5vZmZzZXQoKSksIGNhcGFjaXR5KCkpKSwKKyAgICAgICAgICBtU2l6ZShzdGQ6Om1pbihjMl9taW4oc2l6ZSwgcGFyZW50ID09IG51bGxwdHIgPyAwIDogcGFyZW50LT5zaXplKCkpLCBjYXBhY2l0eSgpIC0gbU9mZnNldCkpIHsKKyAgICB9CisKK3B1YmxpYzoKKyAgICBpbmxpbmUgY29uc3RleHByIF9DMkxpbmVhclJhbmdlQXNwZWN0IGNoaWxkUmFuZ2Uoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9DMkxpbmVhclJhbmdlQXNwZWN0KAorICAgICAgICAgICAgbVNpemUsCisgICAgICAgICAgICBjMl9taW4oYzJfbWF4KG9mZnNldCwgbU9mZnNldCksIGNhcGFjaXR5KCkpIC0gbU9mZnNldCwKKyAgICAgICAgICAgIGMyX21pbihjMl9taW4oc2l6ZSwgbVNpemUpLCBjYXBhY2l0eSgpIC0gYzJfbWluKGMyX21heChvZmZzZXQsIG1PZmZzZXQpLCBjYXBhY2l0eSgpKSkpOworICAgIH0KKworICAgIGZyaWVuZCBjbGFzcyBfQzJFZGl0YWJsZUxpbmVhclJhbmdlQXNwZWN0OworICAgIC8vIGludmFyaWFudHMgMCA8PSBtT2Zmc2V0IDw9IG1PZmZzZXQgKyBtU2l6ZSA8PSBjYXBhY2l0eSgpCisgICAgdWludDMyX3QgbU9mZnNldDsKKyAgICB1aW50MzJfdCBtU2l6ZTsKKy8vLyBAfQorfTsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIGZvciBzYWZlIHJhbmdlIGNhbGN1bGF0aW9ucyB1c2luZyBzaXplX3Qtcy4KKyAqLworY2xhc3MgQzJMaW5lYXJSYW5nZSA6IHB1YmxpYyBfQzJMaW5lYXJSYW5nZUFzcGVjdCB7CitwdWJsaWM6CisgICAgaW5saW5lIGNvbnN0ZXhwciBDMkxpbmVhclJhbmdlKGNvbnN0IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0ICZwYXJlbnQsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQorICAgICAgICA6IF9DMkxpbmVhclJhbmdlQXNwZWN0KCZwYXJlbnQsIG9mZnNldCwgc2l6ZSkgeyB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIEMyTGluZWFyUmFuZ2UoY29uc3QgX0MyTGluZWFyUmFuZ2VBc3BlY3QgJnBhcmVudCwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpCisgICAgICAgIDogX0MyTGluZWFyUmFuZ2VBc3BlY3QoJnBhcmVudCwgb2Zmc2V0LCBzaXplKSB7IH0KKworICAgIGlubGluZSBjb25zdGV4cHIgQzJMaW5lYXJSYW5nZSBpbnRlcnNlY3Qoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyTGluZWFyUmFuZ2UoKnRoaXMsIG9mZnNldCwgc2l6ZSk7CisgICAgfQorfTsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIGZvciBzaW1wbGUgYW5kIHNhZmUgY2FwYWNpdHkgYW5kIHJhbmdlIGNvbnN0cnVjdGlvbi4KKyAqLworY2xhc3MgQzJMaW5lYXJDYXBhY2l0eSA6IHB1YmxpYyBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCB7CitwdWJsaWM6CisgICAgaW5saW5lIGNvbnN0ZXhwciBleHBsaWNpdCBDMkxpbmVhckNhcGFjaXR5KHNpemVfdCBjYXBhY2l0eSkKKyAgICAgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChjMl9taW4oY2FwYWNpdHksIHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKSkpIHsgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBDMkxpbmVhclJhbmdlIHJhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMkxpbmVhclJhbmdlKCp0aGlzLCBvZmZzZXQsIHNpemUpOworICAgIH0KK307CisKKy8qKgorICogQXNwZWN0IGZvciBvYmplY3RzIHRoYXQgaGF2ZSBhbiBlZGl0YWJsZSBsaW5lYXIgcmFuZ2UuCisgKgorICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZS4KKyAqLworY2xhc3MgX0MyRWRpdGFibGVMaW5lYXJSYW5nZUFzcGVjdCA6IHB1YmxpYyBfQzJMaW5lYXJSYW5nZUFzcGVjdCB7CisgICAgdXNpbmcgX0MyTGluZWFyUmFuZ2VBc3BlY3Q6Ol9DMkxpbmVhclJhbmdlQXNwZWN0OworCitwdWJsaWM6CisvLy8gXG5hbWUgRWRpdGFibGUgbGluZWFyIHJhbmdlIGludGVyZmFjZQorLy8vIEB7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBvZmZzZXQgdG8gfG9mZnNldHwsIHdoaWxlIHRyeWluZyB0byBrZWVwIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB1bmNoYW5nZWQgKGUuZy4KKyAgICAgKiBzaXplIHdpbGwgZ3JvdyBpZiBvZmZzZXQgaXMgZGVjcmVhc2VkLCBhbmQgbWF5IHNocmluayBpZiBvZmZzZXQgaXMgaW5jcmVhc2VkLikgUmV0dXJucworICAgICAqIHRydWUgaWYgc3VjY2Vzc2Z1bCwgd2hpY2ggaXMgZXF1aXZhbGVudCB0byBpZiAwIDw9IHxvZmZzZXR8IDw9IGNhcGFjaXR5KCkuCisgICAgICoKKyAgICAgKiBOb3RlOiBzZXR0aW5nIG9mZnNldCBhbmQgc2l6ZSB3aWxsIHlpZWxkIGRpZmZlcmVudCByZXN1bHQgZGVwZW5kaW5nIG9uIHRoZSBvcmRlciBvZiB0aGUKKyAgICAgKiBvcGVyYXRpb25zLiBBbHdheXMgc2V0IG9mZnNldCBmaXJzdCB0byBlbnN1cmUgcHJvcGVyIHNpemUuCisgICAgICovCisgICAgaW5saW5lIGJvb2wgc2V0T2Zmc2V0KHVpbnQzMl90IG9mZnNldCkgeworICAgICAgICBpZiAob2Zmc2V0ID4gY2FwYWNpdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9mZnNldCA+IG1PZmZzZXQgKyBtU2l6ZSkgeworICAgICAgICAgICAgbVNpemUgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVNpemUgPSBtT2Zmc2V0ICsgbVNpemUgLSBvZmZzZXQ7CisgICAgICAgIH0KKyAgICAgICAgbU9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2l6ZSB0byB8c2l6ZXwuIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsLCB3aGljaCBpcyBlcXVpdmFsZW50IHRvCisgICAgICogaWYgMCA8PSB8c2l6ZXwgPD0gY2FwYWNpdHkoKSAtIG9mZnNldCgpLgorICAgICAqCisgICAgICogTm90ZTogc2V0dGluZyBvZmZzZXQgYW5kIHNpemUgd2lsbCB5aWVsZCBkaWZmZXJlbnQgcmVzdWx0IGRlcGVuZGluZyBvbiB0aGUgb3JkZXIgb2YgdGhlCisgICAgICogb3BlcmF0aW9ucy4gQWx3YXlzIHNldCBvZmZzZXQgZmlyc3QgdG8gZW5zdXJlIHByb3BlciBzaXplLgorICAgICAqLworICAgIGlubGluZSBib29sIHNldFNpemUodWludDMyX3Qgc2l6ZSkgeworICAgICAgICBpZiAoc2l6ZSA+IGNhcGFjaXR5KCkgLSBtT2Zmc2V0KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU2l6ZSA9IHNpemU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG9mZnNldCB0byB8b2Zmc2V0fCB3aXRoIGJlc3QgZWZmb3J0LiBTYW1lIGFzIHNldE9mZnNldCgpIGV4Y2VwdCB0aGF0IG9mZnNldCB3aWxsCisgICAgICogYmUgY2xhbXBlZCB0byB0aGUgYnVmZmVyIGNhcGFjaXR5LgorICAgICAqCisgICAgICogTm90ZTogc2V0dGluZyBvZmZzZXQgYW5kIHNpemUgKGV2ZW4gdXNpbmcgYmVzdCBlZmZvcnQpIHdpbGwgeWllbGQgZGlmZmVyZW50IHJlc3VsdCBkZXBlbmRpbmcKKyAgICAgKiBvbiB0aGUgb3JkZXIgb2YgdGhlIG9wZXJhdGlvbnMuIEFsd2F5cyBzZXQgb2Zmc2V0IGZpcnN0IHRvIGVuc3VyZSBwcm9wZXIgc2l6ZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCBzZXRPZmZzZXRfYmUodWludDMyX3Qgb2Zmc2V0KSB7CisgICAgICAgICh2b2lkKXNldE9mZnNldChjMl9taW4ob2Zmc2V0LCBjYXBhY2l0eSgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2l6ZSB0byB8c2l6ZXwgd2l0aCBiZXN0IGVmZm9ydC4gU2FtZSBhcyBzZXRTaXplKCkgZXhjZXB0IHRoYXQgdGhlIHNlbGVjdGVkIHJlZ2lvbgorICAgICAqIHdpbGwgYmUgY2xhbXBlZCB0byB0aGUgYnVmZmVyIGNhcGFjaXR5IChlLmcuIHNpemUgaXMgY2xhbXBlZCB0byBbMCwgY2FwYWNpdHkoKSAtIG9mZnNldCgpXSkuCisgICAgICoKKyAgICAgKiBOb3RlOiBzZXR0aW5nIG9mZnNldCBhbmQgc2l6ZSAoZXZlbiB1c2luZyBiZXN0IGVmZm9ydCkgd2lsbCB5aWVsZCBkaWZmZXJlbnQgcmVzdWx0IGRlcGVuZGluZworICAgICAqIG9uIHRoZSBvcmRlciBvZiB0aGUgb3BlcmF0aW9ucy4gQWx3YXlzIHNldCBvZmZzZXQgZmlyc3QgdG8gZW5zdXJlIHByb3BlciBzaXplLgorICAgICAqLworICAgIGlubGluZSB2b2lkIHNldFNpemVfYmUodWludDMyX3Qgc2l6ZSkgeworICAgICAgICBtU2l6ZSA9IGMyX21pbihzaXplLCBjYXBhY2l0eSgpIC0gbU9mZnNldCk7CisgICAgfQorLy8vIEB9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgQUxMT0NBVElPTlMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy8gXGluZ3JvdXAgYWxsb2NhdG9yIEFsbG9jYXRpb24gYW5kIG1lbW9yeSBwbGFjZW1lbnQKKy8vLyBAeworCitjbGFzcyBDMkxpbmVhckFsbG9jYXRpb247CitjbGFzcyBDMkdyYXBoaWNBbGxvY2F0aW9uOworCisvKioKKyAqICBBbGxvY2F0b3JzIGFyZSB1c2VkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gYWxsb2NhdGUgbWVtb3J5IChhbGxvY2F0aW9ucykgZm9yIGJ1ZmZlcnMuIFRoZXkgY2FuCisgKiAgc3VwcG9ydCBlaXRoZXIgMUQgb3IgMkQgYWxsb2NhdGlvbnMuCisgKgorICogIFxub3RlIEluIHRoZW9yeSB0aGV5IGNvdWxkIHN1cHBvcnQgYm90aCwgYnV0IGluIHByYWN0aWNlLCB3ZSB3aWxsIHVzZSBvbmx5IG9uZSBvciB0aGUgb3RoZXIuCisgKgorICogIE5ldmVyIGNvbnN0cnVjdGVkIG9uIHN0YWNrLgorICoKKyAqICBBbGxvY2F0b3JzIGFyZSBwcm92aWRlZCBieSB2ZW5kb3JzLgorICovCitjbGFzcyBDMkFsbG9jYXRvciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQWxsb2NhdG9yIElEIHR5cGUuCisgICAgICovCisgICAgdHlwZWRlZiB1aW50MzJfdCBpZF90OworICAgIGVudW0gOiBpZF90IHsKKyAgICAgICAgQkFEX0lEID0gMHhCQURELCAvLyBpbnZhbGlkIGFsbG9jYXRvciBJRAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0aW9uIHR5cGVzLiBUaGlzIGlzIGEgYml0bWFzayBhbmQgaXMgdXNlZCBpbiBDMkFsbG9jYXRvcjo6SW5mbworICAgICAqIHRvIGxpc3QgdGhlIHN1cHBvcnRlZCBhbGxvY2F0aW9uIHR5cGVzIG9mIGFuIGFsbG9jYXRvci4KKyAgICAgKi8KKyAgICBlbnVtIHR5cGVfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgTElORUFSICA9IDEgPDwgMCwgLy8KKyAgICAgICAgR1JBUEhJQyA9IDEgPDwgMSwKKyAgICB9OworCisgICAgLyoqCisgICAgICogSW5mb3JtYXRpb24gYWJvdXQgYW4gYWxsb2NhdG9yLgorICAgICAqCisgICAgICogQWxsb2NhdG9ycyBkb24ndCBoYXZlIGEgcXVlcnkgQVBJIHNvIGFsbCBxdWVyaWFibGUgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGhlcmUuCisgICAgICovCisgICAgc3RydWN0IFRyYWl0cyB7CisgICAgICAgIEMyU3RyaW5nIG5hbWU7ICAgICAgICAgICAgICAvLy88IGFsbG9jYXRvciBuYW1lCisgICAgICAgIGlkX3QgaWQ7ICAgICAgICAgICAgICAgICAgICAvLy88IGFsbG9jYXRvciBJRAorICAgICAgICB0eXBlX3Qgc3VwcG9ydGVkVHlwZXM7ICAgICAgLy8vPCBzdXBwb3J0ZWQgYWxsb2NhdGlvbiB0eXBlcworICAgICAgICBDMk1lbW9yeVVzYWdlIG1pbmltdW1Vc2FnZTsgLy8vPCB1c2FnZSB0aGF0IGlzIG1pbmltYWxseSByZXF1aXJlZCBmb3IgYWxsb2NhdGlvbnMKKyAgICAgICAgQzJNZW1vcnlVc2FnZSBtYXhpbXVtVXNhZ2U7IC8vLzwgdXNhZ2UgdGhhdCBpcyBtYXhpbWFsbHkgYWxsb3dlZCBmb3IgYWxsb2NhdGlvbnMKKyAgICB9OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdW5pcXVlIG5hbWUgb2YgdGhpcyBhbGxvY2F0b3IuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBhbGxvY2F0b3IuCisgICAgICogXHJldHZhbCBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSBhY3R1YWwgbmFtZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgdW5pcXVlIElEIGZvciB0aGlzIGFsbG9jYXRvci4gVGhpcyBJRCBpcyB1c2VkIHRvIGdldCB0aGlzIGFsbG9jYXRvciBmcm9tIHRoZQorICAgICAqIGFsbG9jYXRvciBzdG9yZSwgYW5kIHRvIGlkZW50aWZ5IHRoaXMgYWxsb2NhdG9yIGFjcm9zcyBhbGwgcHJvY2Vzc2VzLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgdW5pcXVlIElEIGZvciB0aGlzIGFsbG9jYXRvci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGlkX3QgZ2V0SWQoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhbGxvY2F0b3IgdHJhaXRzLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBBbGxvY2F0b3JzIGRvbid0IGhhdmUgYSBmdWxsLWZsZWRnZWQgcXVlcnkgQVBJLCBvbmx5IHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogXHJldHVybiBhbGxvY2F0b3IgaW5mb3JtYXRpb24KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUcmFpdHM+IGdldFRyYWl0cygpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlcyBhIDFEIGFsbG9jYXRpb24gb2YgZ2l2ZW4gfGNhcGFjaXR5fCBhbmQgfHVzYWdlfC4gSWYgc3VjY2Vzc2Z1bCwgdGhlIGFsbG9jYXRpb24gaXMKKyAgICAgKiBzdG9yZWQgaW4gfGFsbG9jYXRpb258LiBPdGhlcndpc2UsIHxhbGxvY2F0aW9ufCBpcyBzZXQgdG8gJ251bGxwdHInLgorICAgICAqCisgICAgICogXHBhcmFtIGNhcGFjaXR5ICAgICAgdGhlIHNpemUgb2YgcmVxdWVzdGVkIGFsbG9jYXRpb24gKHRoZSBhbGxvY2F0aW9uIGNvdWxkIGJlIHNsaWdodGx5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgbGFyZ2VyLCBlLmcuIHRvIGFjY291bnQgZm9yIGFueSBzeXN0ZW0tcmVxdWlyZWQgYWxpZ25tZW50KQorICAgICAqIFxwYXJhbSB1c2FnZSAgICAgICAgIHRoZSBtZW1vcnkgdXNhZ2UgaW5mbyBmb3IgdGhlIHJlcXVlc3RlZCBhbGxvY2F0aW9uLiBcbm90ZSB0aGF0IHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVkIGFsbG9jYXRpb24gbWF5IGJlIGxhdGVyIHVzZWQvbWFwcGVkIHdpdGggZGlmZmVyZW50IHVzYWdlLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBhbGxvY2F0b3Igc2hvdWxkIGxheW91dCB0aGUgYnVmZmVyIHRvIGJlIG9wdGltaXplZCBmb3IgdGhpcyB1c2FnZSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBidXQgbXVzdCBzdXBwb3J0IGFueSB1c2FnZS4gT25lIGV4Y2VwdGlvbjogcHJvdGVjdGVkIGJ1ZmZlcnMgY2FuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgb25seSBiZSB1c2VkIGluIGEgcHJvdGVjdGVkIHNjZW5hcmlvLgorICAgICAqIFxwYXJhbSBhbGxvY2F0aW9uICAgIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGFsbG9jYXRpb24gc2hhbGwgYmUgc3RvcmVkIG9uIHN1Y2Nlc3MuIG51bGxwdHIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIGZhaWx1cmUKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBhbGxvY2F0aW9uIHdhcyBzdWNjZXNzZnVsCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgdGhlIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgYWxsb2NhdGlvbiB0aW1lZCBvdXQKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIHRoZSBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgY2FwYWNpdHkgb3IgdXNhZ2UgYXJlIG5vdCBzdXBwb3J0ZWQgKGludmFsaWQpIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdGhpcyBhbGxvY2F0b3IgZG9lcyBub3Qgc3VwcG9ydCAxRCBhbGxvY2F0aW9ucworICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cmVkIGR1cmluZyBhbGxvY2F0aW9uICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbmV3TGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5IF9fdW51c2VkLCBDMk1lbW9yeVVzYWdlIHVzYWdlIF9fdW51c2VkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24gLyogbm9ubnVsbCAqLykgeworICAgICAgICAqYWxsb2NhdGlvbiA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIC8qKgorICAgICAqIChSZSljcmVhdGVzIGEgMUQgYWxsb2NhdGlvbiBmcm9tIGEgbmF0aXZlIHxoYW5kbGV8LiBJZiBzdWNjZXNzZnVsLCB0aGUgYWxsb2NhdGlvbiBpcyBzdG9yZWQKKyAgICAgKiBpbiB8YWxsb2NhdGlvbnwuIE90aGVyd2lzZSwgfGFsbG9jYXRpb258IGlzIHNldCB0byAnbnVsbHB0cicuCisgICAgICoKKyAgICAgKiBccGFyYW0gaGFuZGxlICAgICAgdGhlIGhhbmRsZSBmb3IgdGhlIGV4aXN0aW5nIGFsbG9jYXRpb24uIE9uIHN1Y2Nlc3MsIHRoZSBhbGxvY2F0aW9uIHdpbGwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgdGFrZSBvd25lcnNoaXAgb2YgfGhhbmRsZXwuCisgICAgICogXHBhcmFtIGFsbG9jYXRpb24gIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGFsbG9jYXRpb24gc2hhbGwgYmUgc3RvcmVkIG9uIHN1Y2Nlc3MuIG51bGxwdHIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgYWxsb2NhdGlvbiB3YXMgcmVjcmVhdGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlY3JlYXRlIHRoZSBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIHJlY3JlYXRpb24gdGltZWQgb3V0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gcmVjcmVhdGUgdGhlIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBpbnZhbGlkIGhhbmRsZSAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgIHRoaXMgYWxsb2NhdG9yIGRvZXMgbm90IHN1cHBvcnQgMUQgYWxsb2NhdGlvbnMKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJlZCBkdXJpbmcgYWxsb2NhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHByaW9yTGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUgX191bnVzZWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbiAvKiBub25udWxsICovKSB7CisgICAgICAgICphbGxvY2F0aW9uID0gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxsb2NhdGVzIGEgMkQgYWxsb2NhdGlvbiBvZiBnaXZlbiB8d2lkdGh8LCB8aGVpZ2h0fCwgfGZvcm1hdHwgYW5kIHx1c2FnZXwuIElmIHN1Y2Nlc3NmdWwsCisgICAgICogdGhlIGFsbG9jYXRpb24gaXMgc3RvcmVkIGluIHxhbGxvY2F0aW9ufC4gT3RoZXJ3aXNlLCB8YWxsb2NhdGlvbnwgaXMgc2V0IHRvICdudWxscHRyJy4KKyAgICAgKgorICAgICAqIFxwYXJhbSB3aWR0aCAgICAgICAgIHRoZSB3aWR0aCBvZiByZXF1ZXN0ZWQgYWxsb2NhdGlvbiAodGhlIGFsbG9jYXRpb24gY291bGQgYmUgc2xpZ2h0bHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBsYXJnZXIsIGUuZy4gdG8gYWNjb3VudCBmb3IgYW55IHN5c3RlbS1yZXF1aXJlZCBhbGlnbm1lbnQpCisgICAgICogXHBhcmFtIGhlaWdodCAgICAgICAgdGhlIGhlaWdodCBvZiByZXF1ZXN0ZWQgYWxsb2NhdGlvbiAodGhlIGFsbG9jYXRpb24gY291bGQgYmUgc2xpZ2h0bHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBsYXJnZXIsIGUuZy4gdG8gYWNjb3VudCBmb3IgYW55IHN5c3RlbS1yZXF1aXJlZCBhbGlnbm1lbnQpCisgICAgICogXHBhcmFtIGZvcm1hdCAgICAgICAgdGhlIHBpeGVsIGZvcm1hdCBvZiByZXF1ZXN0ZWQgYWxsb2NhdGlvbi4gVGhpcyBjb3VsZCBiZSBhIHZlbmRvcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmljIGZvcm1hdC4KKyAgICAgKiBccGFyYW0gdXNhZ2UgICAgICAgICB0aGUgbWVtb3J5IHVzYWdlIGluZm8gZm9yIHRoZSByZXF1ZXN0ZWQgYWxsb2NhdGlvbi4gXG5vdGUgdGhhdCB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCBhbGxvY2F0aW9uIG1heSBiZSBsYXRlciB1c2VkL21hcHBlZCB3aXRoIGRpZmZlcmVudCB1c2FnZS4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgYWxsb2NhdG9yIHNob3VsZCBsYXlvdXQgdGhlIGJ1ZmZlciB0byBiZSBvcHRpbWl6ZWQgZm9yIHRoaXMgdXNhZ2UsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYnV0IG11c3Qgc3VwcG9ydCBhbnkgdXNhZ2UuIE9uZSBleGNlcHRpb246IHByb3RlY3RlZCBidWZmZXJzIGNhbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9ubHkgYmUgdXNlZCBpbiBhIHByb3RlY3RlZCBzY2VuYXJpby4KKyAgICAgKiBccGFyYW0gYWxsb2NhdGlvbiAgICBwb2ludGVyIHRvIHdoZXJlIHRoZSBhbGxvY2F0aW9uIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgYWxsb2NhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIHRoZSBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIGFsbG9jYXRpb24gdGltZWQgb3V0CisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byBjb21wbGV0ZSB0aGUgYWxsb2NhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCBvciB1c2FnZSBhcmUgbm90IHN1cHBvcnRlZCAoaW52YWxpZCkgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX09NSVRURUQgICB0aGlzIGFsbG9jYXRvciBkb2VzIG5vdCBzdXBwb3J0IDJEIGFsbG9jYXRpb25zCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nIGFsbG9jYXRpb24gKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBuZXdHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoIF9fdW51c2VkLCB1aW50MzJfdCBoZWlnaHQgX191bnVzZWQsIHVpbnQzMl90IGZvcm1hdCBfX3VudXNlZCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgX191bnVzZWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24gLyogbm9ubnVsbCAqLykgeworICAgICAgICAqYWxsb2NhdGlvbiA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIC8qKgorICAgICAqIChSZSljcmVhdGVzIGEgMkQgYWxsb2NhdGlvbiBmcm9tIGEgbmF0aXZlIGhhbmRsZS4gIElmIHN1Y2Nlc3NmdWwsIHRoZSBhbGxvY2F0aW9uIGlzIHN0b3JlZAorICAgICAqIGluIHxhbGxvY2F0aW9ufC4gT3RoZXJ3aXNlLCB8YWxsb2NhdGlvbnwgaXMgc2V0IHRvICdudWxscHRyJy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBoYW5kbGUgICAgICB0aGUgaGFuZGxlIGZvciB0aGUgZXhpc3RpbmcgYWxsb2NhdGlvbi4gT24gc3VjY2VzcywgdGhlIGFsbG9jYXRpb24gd2lsbAorICAgICAqICAgICAgICAgICAgICAgICAgICB0YWtlIG93bmVyc2hpcCBvZiB8aGFuZGxlfC4KKyAgICAgKiBccGFyYW0gYWxsb2NhdGlvbiAgcG9pbnRlciB0byB3aGVyZSB0aGUgYWxsb2NhdGlvbiBzaGFsbCBiZSBzdG9yZWQgb24gc3VjY2Vzcy4gbnVsbHB0cgorICAgICAqICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIGZhaWx1cmUKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBhbGxvY2F0aW9uIHdhcyByZWNyZWF0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gcmVjcmVhdGUgdGhlIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgcmVjcmVhdGlvbiB0aW1lZCBvdXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byByZWNyZWF0ZSB0aGUgYWxsb2NhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIGludmFsaWQgaGFuZGxlIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdGhpcyBhbGxvY2F0b3IgZG9lcyBub3Qgc3VwcG9ydCAyRCBhbGxvY2F0aW9ucworICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cmVkIGR1cmluZyByZWNyZWF0aW9uICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcHJpb3JHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUgX191bnVzZWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24gLyogbm9ubnVsbCAqLykgeworICAgICAgICAqYWxsb2NhdGlvbiA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyQWxsb2NhdG9yKCkgPSBkZWZhdWx0OworcHJvdGVjdGVkOgorICAgIEMyQWxsb2NhdG9yKCkgPSBkZWZhdWx0OworfTsKKworLyoqCisgKiBcaW5ncm91cCBsaW5lYXIgYWxsb2NhdG9yCisgKiAxRCBhbGxvY2F0aW9uIGludGVyZmFjZS4KKyAqLworY2xhc3MgQzJMaW5lYXJBbGxvY2F0aW9uIDogcHVibGljIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBNYXBzIGEgcG9ydGlvbiBvZiBhbiBhbGxvY2F0aW9uIHN0YXJ0aW5nIGZyb20gfG9mZnNldHwgd2l0aCB8c2l6ZXwgaW50byBsb2NhbCBwcm9jZXNzIG1lbW9yeS4KKyAgICAgKiBTdG9yZXMgdGhlIHN0YXJ0aW5nIGFkZHJlc3MgaW50byB8YWRkcnwsIG9yIE5VTEwgaWYgdGhlIG9wZXJhdGlvbiB3YXMgdW5zdWNjZXNzZnVsLgorICAgICAqIHxmZW5jZXwgd2lsbCBjb250YWluIGFuIGFjcXVpcmUgc3luYyBmZW5jZSBvYmplY3QuIElmIGl0IGlzIGFscmVhZHkKKyAgICAgKiBzYWZlIHRvIGFjY2VzcyB0aGUgYnVmZmVyIGNvbnRlbnRzLCB0aGVuIGl0IHdpbGwgY29udGFpbiBhbiBlbXB0eSAoYWxyZWFkeSBmaXJlZCkgZmVuY2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gb2Zmc2V0ICAgICAgICBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgcG9ydGlvbiB0byBiZSBtYXBwZWQgKHRoaXMgZG9lcyBub3QgaGF2ZSB0bworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGJlIHBhZ2UgYWxpZ25lZCkKKyAgICAgKiBccGFyYW0gc2l6ZSAgICAgICAgICBzaXplIG9mIHRoZSBwb3J0aW9uIHRvIGJlIG1hcHBlZCAodGhpcyBkb2VzIG5vdCBoYXZlIHRvIGJlIHBhZ2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhbGlnbmVkKQorICAgICAqIFxwYXJhbSB1c2FnZSAgICAgICAgIHRoZSBkZXNpcmVkIHVzYWdlLiBcdG9kbyB0aGlzIG11c3QgYmUga1NvZnR3YXJlUmVhZCBhbmQvb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBrU29mdHdhcmVXcml0ZS4KKyAgICAgKiBccGFyYW0gZmVuY2UgICAgICAgICBhIHBvaW50ZXIgdG8gYSBmZW5jZSBvYmplY3QgaWYgYW4gYXN5bmMgbWFwcGluZyBpcyByZXF1ZXN0ZWQuIElmCisgICAgICogICAgICAgICAgICAgICAgICAgICAgbm90LW51bGwsIGFuZCBhY3F1aXJlIGZlbmNlIHdpbGwgYmUgc3RvcmVkIGhlcmUgb24gc3VjY2Vzcywgb3IgZW1wdHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBmZW5jZSBvbiBmYWlsdXJlLiBJZiBudWxsLCB0aGUgbWFwcGluZyB3aWxsIGJlIHN5bmNocm9ub3VzLgorICAgICAqIFxwYXJhbSBhZGRyICAgICAgICAgIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgc3RhcnRpbmcgYWRkcmVzcyBvZiB0aGUgbWFwcGVkIHBvcnRpb24gd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZC4gT24gZmFpbHVyZSwgbnVsbHB0ciB3aWxsIGJlIHN0b3JlZCBoZXJlLgorICAgICAqCisgICAgICogXHRvZG8gT25seSBvbmUgcG9ydGlvbiBjYW4gYmUgbWFwcGVkIGF0IHRoZSBzYW1lIHRpbWUgLSB0aGlzIGlzIHRydWUgZm9yIGdyYWxsb2MsIGJ1dCB0aGVyZQorICAgICAqICAgICAgIGlzIG5vIG5lZWQgZm9yIHRoaXMgZm9yIDFEIGJ1ZmZlcnMuCisgICAgICogXHRvZG8gRG8gd2UgbmVlZCB0byBzdXBwb3J0IHN5bmMgb3BlcmF0aW9uIGFzIHdlIGNvdWxkIGp1c3Qgd2FpdCBmb3IgdGhlIGZlbmNlPworICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gbWFwIHRoZSBwb3J0aW9uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQKKyAgICAgKiBccmV0dmFsIEMyX0RVUExJQ0FURSBpZiB0aGUgYWxsb2NhdGlvbiBpcyBhbHJlYWR5IG1hcHBlZC4KKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSB0aGUgb3BlcmF0aW9uCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgdGhlIHBhcmFtZXRlcnMgKG9mZnNldC9zaXplKSBhcmUgaW52YWxpZCBvciBvdXRzaWRlIHRoZSBhbGxvY2F0aW9uLCBvcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZSB1c2FnZSBmbGFncyBhcmUgaW52YWxpZCAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIG9wZXJhdGlvbiBmcm9tIGNvbXBsZXRpbmcgKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBtYXAoCisgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSAqZmVuY2UgLyogbnVsbGFibGUgKi8sCisgICAgICAgICAgICB2b2lkICoqYWRkciAvKiBub25udWxsICovKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBVbm1hcHMgYSBwb3J0aW9uIG9mIGFuIGFsbG9jYXRpb24gYXQgfGFkZHJ8IHdpdGggfHNpemV8LiBUaGVzZSBtdXN0IGJlIHBhcmFtZXRlcnMgcHJldmlvdXNseQorICAgICAqIHBhc3NlZCB0byBhbmQgcmV0dXJuZWQgYnkgfG1hcHw7IG90aGVyd2lzZSwgdGhpcyBvcGVyYXRpb24gaXMgYSBuby1vcC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBhZGRyICAgICAgICAgIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIG1hcHBlZCByZWdpb24KKyAgICAgKiBccGFyYW0gc2l6ZSAgICAgICAgICBzaXplIG9mIHRoZSBtYXBwZWQgcmVnaW9uCisgICAgICogXHBhcmFtIGZlbmNlICAgICAgICAgYSBwb2ludGVyIHRvIGEgZmVuY2Ugb2JqZWN0IGlmIGFuIGFzeW5jIHVubWFwcGluZyBpcyByZXF1ZXN0ZWQuIElmCisgICAgICogICAgICAgICAgICAgICAgICAgICAgbm90LW51bGwsIGEgcmVsZWFzZSBmZW5jZSB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIHN1Y2Nlc3MsIG9yIGVtcHR5IGZlbmNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgb24gZmFpbHVyZS4gVGhpcyBmZW5jZSBzaWduYWxzIHdoZW4gdGhlIG9yaWdpbmFsIGFsbG9jYXRpb24gY29udGFpbnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhbGwgY2hhbmdlcyB0aGF0IGhhcHBlbmVkIHRvIHRoZSBtYXBwZWQgcmVnaW9uLiBJZiBudWxsLCB0aGUgdW5tYXBwaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzeW5jaHJvbm91cy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgb3BlcmF0aW9uIHRpbWVkIG91dAorICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIGlmIHRoZSBhbGxvY2F0aW9uIHdhcyBub3QgbWFwcGVkIHByZXZpb3VzbHkuCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgdGhlIHBhcmFtZXRlcnMgKGFkZHIvc2l6ZSkgZG8gbm90IGNvcnJlc3BvbmQgdG8gcHJldmlvdXNseSBtYXBwZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICByZWdpb25zIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgb3BlcmF0aW9uIGZyb20gY29tcGxldGluZyAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIHVubWFwIHRoZSBwb3J0aW9uICh1bmV4cGVjdGVkIC0gc3lzdGVtKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgdW5tYXAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUsIEMyRmVuY2UgKmZlbmNlIC8qIG51bGxhYmxlICovKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhbGxvY2F0b3IgSUQgZm9yIHRoaXMgYWxsb2NhdGlvbi4gVGhpcyBpcyB1c2VmdWwgdG8gcHV0IHRoZSBoYW5kbGUgaW50byBjb250ZXh0LgorICAgICAqLworICAgIHZpcnR1YWwgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGlvbiBoYW5kbGUuCisgICAgICovCisgICAgdmlydHVhbCBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgdGhlIHNhbWUgYWxsb2NhdGlvbiBhcyB8b3RoZXJ8LgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBlcXVhbHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gJm90aGVyKSBjb25zdCA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBcdG9kbyBzaG91bGQgd2UgbGltaXQgYWxsb2NhdGlvbiBkaXJlY3RseT8KKyAgICBDMkxpbmVhckFsbG9jYXRpb24oc2l6ZV90IGNhcGFjaXR5KSA6IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KGMyX21pbihjYXBhY2l0eSwgVUlOVDMyX01BWCkpIHt9CisgICAgdmlydHVhbCB+QzJMaW5lYXJBbGxvY2F0aW9uKCkgPSBkZWZhdWx0OworfTsKKworY2xhc3MgQzJDaXJjdWxhckJsb2NrOworY2xhc3MgQzJMaW5lYXJCbG9jazsKK2NsYXNzIEMyR3JhcGhpY0Jsb2NrOworCisvKioKKyAqICBCbG9jayBwb29scyBhcmUgdXNlZCBieSBjb21wb25lbnRzIHRvIG9idGFpbiBvdXRwdXQgYnVmZmVycyBpbiBhbiBlZmZpY2llbnQgd2F5LiBUaGV5IGNhbgorICogIHN1cHBvcnQgZWl0aGVyIGxpbmVhciAoMUQpLCBjaXJjdWxhciAoMUQpIG9yIGdyYXBoaWMgKDJEKSBibG9ja3MuCisgKgorICogIEJsb2NrIHBvb2xzIGRlY291cGxlIHRoZSByZWN5Y2xpbmcgb2YgbWVtb3J5L2FsbG9jYXRpb25zIGZyb20gdGhlIGNvbXBvbmVudHMuIFRoZXkgYXJlIG1lYW50IHRvCisgKiAgYmUgYW4gb3BhcXVlIHNlcnZpY2UgKHRoZXJlIGFyZSBubyBwdWJsaWMgQVBJcyBvdGhlciB0aGFuIG9idGFpbmluZyBibG9ja3MpIHByb3ZpZGVkIGJ5IHRoZQorICogIHBsYXRmb3JtLiBCbG9jayBwb29scyBhcmUgYWxzbyBtZWFudCB0byBkZWNvdXBsZSBhbGxvY2F0aW9ucyBmcm9tIG1lbW9yeSB1c2VkIGJ5IGJ1ZmZlcnMuIFRoaXMKKyAqICBpcyBhY2NvbXBsaXNoZWQgYnkgYWxsb3dpbmcgcG9vbHMgdG8gYWxsb3QgbXVsdGlwbGUgbWVtb3J5ICdibG9ja3MnIG9uIGEgc2luZ2xlIGFsbG9jYXRpb24uIEFzCisgKiAgdGhlaXIgbmFtZSBzdWdnZXN0LCBibG9jayBwb29scyBtYWludGFpbiBhIHBvb2wgb2YgbWVtb3J5IGJsb2Nrcy4gV2hlbiBhIGNvbXBvbmVudCBhc2tzIGZvcgorICogIGEgbWVtb3J5IGJsb2NrLCBwb29scyB3aWxsIHRyeSB0byByZXR1cm4gYSBmcmVlIG1lbW9yeSBibG9jayBhbHJlYWR5IGluIHRoZSBwb29sLiBJZiBubyBzdWNoCisgKiAgYmxvY2sgZXhpc3RzLCB0aGV5IHdpbGwgYWxsb2NhdGUgbWVtb3J5IHVzaW5nIHRoZSBiYWNraW5nIGFsbG9jYXRvciBhbmQgYWxsb3QgYSBibG9jayBvbiB0aGF0CisgKiAgYWxsb2NhdGlvbi4gV2hlbiBibG9ja3MgYXJlIG5vIGxvbmdlciB1c2VkIGluIHRoZSBzeXN0ZW0sIHRoZXkgYXJlIHJlY3ljbGVkIGJhY2sgdG8gdGhlIGJsb2NrCisgKiAgcG9vbCBhbmQgYXJlIGF2YWlsYWJsZSBhcyBmcmVlIGJsb2Nrcy4KKyAqCisgKiAgTmV2ZXIgY29uc3RydWN0ZWQgb24gc3RhY2suCisgKi8KK2NsYXNzIEMyQmxvY2tQb29sIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBCbG9jayBwb29sIElEIHR5cGUuCisgICAgICovCisgICAgdHlwZWRlZiB1aW50NjRfdCBsb2NhbF9pZF90OworCisgICAgZW51bSA6IGxvY2FsX2lkX3QgeworICAgICAgICBCQVNJQ19MSU5FQVIgPSAwLCAgLy8vPCBJRCBvZiBiYXNpYyAodW5vcHRpbWl6ZWQpIGJsb2NrIHBvb2wgZm9yIGZldGNoaW5nIDFEIGJsb2NrcworICAgICAgICBCQVNJQ19HUkFQSElDID0gMSwgLy8vPCBJRCBvZiBiYXNpYyAodW5vcHRpbWl6ZWQpIGJsb2NrIHBvb2wgZm9yIGZldGNoaW5nIDJEIGJsb2NrcworICAgICAgICBQTEFURk9STV9TVEFSVCA9IDB4MTAsCisgICAgfTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIElEIGZvciB0aGlzIGJsb2NrIHBvb2wuIFRoaXMgSUQgaXMgdXNlZCB0byBnZXQgdGhpcyBibG9jayBwb29sIGZyb20gdGhlIHBsYXRmb3JtLgorICAgICAqIEl0IGlzIG9ubHkgdmFsaWQgaW4gdGhlIGN1cnJlbnQgcHJvY2Vzcy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHJldHVybiBhIGxvY2FsIElEIGZvciB0aGlzIGJsb2NrIHBvb2wuCisgICAgICovCisgICAgdmlydHVhbCBsb2NhbF9pZF90IGdldExvY2FsSWQoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBJRCBvZiB0aGUgYmFja2luZyBhbGxvY2F0b3Igb2YgdGhpcyBibG9jayBwb29sLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRoZSBJRCBvZiB0aGUgYmFja2luZyBhbGxvY2F0b3Igb2YgdGhpcyBibG9jayBwb29sLgorICAgICAqLworICAgIHZpcnR1YWwgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBPYnRhaW5zIGEgbGluZWFyIHdyaXRlYWJsZSBibG9jayBvZiBnaXZlbiB8Y2FwYWNpdHl8IGFuZCB8dXNhZ2V8LiBJZiBzdWNjZXNzZnVsLCB0aGUKKyAgICAgKiBibG9jayBpcyBzdG9yZWQgaW4gfGJsb2NrfC4gT3RoZXJ3aXNlLCB8YmxvY2t8IGlzIHNldCB0byAnbnVsbHB0cicuCisgICAgICoKKyAgICAgKiBccGFyYW0gY2FwYWNpdHkgdGhlIHNpemUgb2YgcmVxdWVzdGVkIGJsb2NrLgorICAgICAqIFxwYXJhbSB1c2FnZSAgICB0aGUgbWVtb3J5IHVzYWdlIGluZm8gZm9yIHRoZSByZXF1ZXN0ZWQgYmxvY2suIFJldHVybmVkIGJsb2NrcyB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgIG9wdGltaXplZCBmb3IgdGhpcyB1c2FnZSwgYnV0IG1heSBiZSB1c2VkIHdpdGggYW55IHVzYWdlLiBPbmUgZXhjZXB0aW9uOgorICAgICAqICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgYmxvY2tzL2J1ZmZlcnMgY2FuIG9ubHkgYmUgdXNlZCBpbiBhIHByb3RlY3RlZCBzY2VuYXJpby4KKyAgICAgKiBccGFyYW0gYmxvY2sgICAgcG9pbnRlciB0byB3aGVyZSB0aGUgb2J0YWluZWQgYmxvY2sgc2hhbGwgYmUgc3RvcmVkIG9uIHN1Y2Nlc3MuIG51bGxwdHIgd2lsbAorICAgICAqICAgICAgICAgICAgICAgICBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgYW55IHJlcXVpcmVkIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgb3BlcmF0aW9uIHRpbWVkIG91dAorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gY29tcGxldGUgYW55IHJlcXVpcmVkIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBjYXBhY2l0eSBvciB1c2FnZSBhcmUgbm90IHN1cHBvcnRlZCAoaW52YWxpZCkgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX09NSVRURUQgICB0aGlzIHBvb2wgZG9lcyBub3Qgc3VwcG9ydCBsaW5lYXIgYmxvY2tzCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nIG9wZXJhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSBfX3VudXNlZCwgQzJNZW1vcnlVc2FnZSB1c2FnZSBfX3VudXNlZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgeworICAgICAgICAqYmxvY2sgPSBudWxscHRyOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPYnRhaW5zIGEgY2lyY3VsYXIgd3JpdGVhYmxlIGJsb2NrIG9mIGdpdmVuIHxjYXBhY2l0eXwgYW5kIHx1c2FnZXwuIElmIHN1Y2Nlc3NmdWwsIHRoZQorICAgICAqIGJsb2NrIGlzIHN0b3JlZCBpbiB8YmxvY2t8LiBPdGhlcndpc2UsIHxibG9ja3wgaXMgc2V0IHRvICdudWxscHRyJy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBjYXBhY2l0eSB0aGUgc2l6ZSBvZiByZXF1ZXN0ZWQgY2lyY3VsYXIgYmxvY2suIChub3RlOiB0aGUgc2l6ZSBvZiB0aGUgb2J0YWluZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgYmxvY2sgY291bGQgYmUgc2xpZ2h0bHkgbGFyZ2VyLCBlLmcuIHRvIGFjY29tbW9kYXRlIGFueSBzeXN0ZW0tcmVxdWlyZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgYWxpZ25tZW50KQorICAgICAqIFxwYXJhbSB1c2FnZSAgICB0aGUgbWVtb3J5IHVzYWdlIGluZm8gZm9yIHRoZSByZXF1ZXN0ZWQgYmxvY2suIFJldHVybmVkIGJsb2NrcyB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgIG9wdGltaXplZCBmb3IgdGhpcyB1c2FnZSwgYnV0IG1heSBiZSB1c2VkIHdpdGggYW55IHVzYWdlLiBPbmUgZXhjZXB0aW9uOgorICAgICAqICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgYmxvY2tzL2J1ZmZlcnMgY2FuIG9ubHkgYmUgdXNlZCBpbiBhIHByb3RlY3RlZCBzY2VuYXJpby4KKyAgICAgKiBccGFyYW0gYmxvY2sgICAgcG9pbnRlciB0byB3aGVyZSB0aGUgb2J0YWluZWQgYmxvY2sgc2hhbGwgYmUgc3RvcmVkIG9uIHN1Y2Nlc3MuIG51bGxwdHIKKyAgICAgKiAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgYW55IHJlcXVpcmVkIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgb3BlcmF0aW9uIHRpbWVkIG91dAorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gY29tcGxldGUgYW55IHJlcXVpcmVkIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBjYXBhY2l0eSBvciB1c2FnZSBhcmUgbm90IHN1cHBvcnRlZCAoaW52YWxpZCkgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX09NSVRURUQgICB0aGlzIHBvb2wgZG9lcyBub3Qgc3VwcG9ydCBjaXJjdWxhciBibG9ja3MKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJlZCBkdXJpbmcgb3BlcmF0aW9uICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hDaXJjdWxhckJsb2NrKAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHkgX191bnVzZWQsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgX191bnVzZWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDaXJjdWxhckJsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgeworICAgICAgICAqYmxvY2sgPSBudWxscHRyOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPYnRhaW5zIGEgMkQgZ3JhcGhpYyBibG9jayBvZiBnaXZlbiB8d2lkdGh8LCB8aGVpZ2h0fCwgfGZvcm1hdHwgYW5kIHx1c2FnZXwuIElmIHN1Y2Nlc3NmdWwsCisgICAgICogdGhlIGJsb2NrIGlzIHN0b3JlZCBpbiB8YmxvY2t8LiBPdGhlcndpc2UsIHxibG9ja3wgaXMgc2V0IHRvICdudWxscHRyJy4KKyAgICAgKgorICAgICAqIFxwYXJhbSB3aWR0aCAgdGhlIHdpZHRoIG9mIHJlcXVlc3RlZCBibG9jayAodGhlIG9idGFpbmVkIGJsb2NrIGNvdWxkIGJlIHNsaWdodGx5IGxhcmdlciwgZS5nLgorICAgICAqICAgICAgICAgICAgICAgdG8gYWNjb21tb2RhdGUgYW55IHN5c3RlbS1yZXF1aXJlZCBhbGlnbm1lbnQpCisgICAgICogXHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHJlcXVlc3RlZCBibG9jayAodGhlIG9idGFpbmVkIGJsb2NrIGNvdWxkIGJlIHNsaWdodGx5IGxhcmdlciwKKyAgICAgKiAgICAgICAgICAgICAgIGUuZy4gdG8gYWNjb21tb2RhdGUgYW55IHN5c3RlbS1yZXF1aXJlZCBhbGlnbm1lbnQpCisgICAgICogXHBhcmFtIGZvcm1hdCB0aGUgcGl4ZWwgZm9ybWF0IG9mIHJlcXVlc3RlZCBibG9jay4gVGhpcyBjb3VsZCBiZSBhIHZlbmRvciBzcGVjaWZpYyBmb3JtYXQuCisgICAgICogXHBhcmFtIHVzYWdlICB0aGUgbWVtb3J5IHVzYWdlIGluZm8gZm9yIHRoZSByZXF1ZXN0ZWQgYmxvY2suIFJldHVybmVkIGJsb2NrcyB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICBvcHRpbWl6ZWQgZm9yIHRoaXMgdXNhZ2UsIGJ1dCBtYXkgYmUgdXNlZCB3aXRoIGFueSB1c2FnZS4gT25lIGV4Y2VwdGlvbjoKKyAgICAgKiAgICAgICAgICAgICAgIHByb3RlY3RlZCBibG9ja3MvYnVmZmVycyBjYW4gb25seSBiZSB1c2VkIGluIGEgcHJvdGVjdGVkIHNjZW5hcmlvLgorICAgICAqIFxwYXJhbSBibG9jayAgcG9pbnRlciB0byB3aGVyZSB0aGUgb2J0YWluZWQgYmxvY2sgc2hhbGwgYmUgc3RvcmVkIG9uIHN1Y2Nlc3MuIG51bGxwdHIKKyAgICAgKiAgICAgICAgICAgICAgIHdpbGwgYmUgc3RvcmVkIGhlcmUgb24gZmFpbHVyZQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIGFueSByZXF1aXJlZCBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIGFueSByZXF1aXJlZCBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgd2lkdGgsIGhlaWdodCwgZm9ybWF0IG9yIHVzYWdlIGFyZSBub3Qgc3VwcG9ydGVkIChpbnZhbGlkKSAoY2FsbGVyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdGhpcyBwb29sIGRvZXMgbm90IHN1cHBvcnQgMkQgYmxvY2tzCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nIG9wZXJhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGggX191bnVzZWQsIHVpbnQzMl90IGhlaWdodCBfX3VudXNlZCwgdWludDMyX3QgZm9ybWF0IF9fdW51c2VkLAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSBfX3VudXNlZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgKmJsb2NrID0gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJCbG9ja1Bvb2woKSA9IGRlZmF1bHQ7Citwcm90ZWN0ZWQ6CisgICAgQzJCbG9ja1Bvb2woKSA9IGRlZmF1bHQ7Cit9OworCisvLy8gQH0KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgQkxPQ0tTCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyoqCisgKiBCbG9ja3MgYXJlIHNlY3Rpb25zIG9mIGFsbG9jYXRpb25zLiBUaGV5IGNhbiBiZSBlaXRoZXIgMUQgb3IgMkQuCisgKi8KKworY2xhc3MgQzJMaW5lYXJBbGxvY2F0aW9uOworCisvKioKKyAqIEEgMUQgYmxvY2suCisgKgorICogXG5vdGUgY2FwYWNpdHkoKSBpcyBub3QgbWVhbmluZ2Z1bCBmb3IgdXNlcnMgb2YgYmxvY2tzOyBpbnN0ZWFkIHNpemUoKSBpcyB0aGUgY2FwYWNpdHkgb2YgdGhlCisgKiB1c2FibGUgcG9ydGlvbi4gVXNlIGFuZCBvZmZzZXQoKSBhbmQgc2l6ZSgpIGlmIGFjY2Vzc2luZyB0aGUgYmxvY2sgZGlyZWN0bHkgdGhyb3VnaCBpdHMgaGFuZGxlCisgKiB0byByZXByZXNlbnQgdGhlIGFsbG90dGVkIHJhbmdlIG9mIHRoZSB1bmRlcmx5aW5nIGFsbG9jYXRpb24gdG8gdGhpcyBibG9jay4KKyAqLworY2xhc3MgQzJCbG9jazFEIDogcHVibGljIF9DMkxpbmVhclJhbmdlQXNwZWN0IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIGhhbmRsZSBmb3IgdGhpcyBhbGxvY2F0aW9uLgorICAgICAqCisgICAgICogXG5vdGUgdGhhdCB0aGUgYmxvY2sgYW5kIGl0cyBibG9jayBwb29sIGhhcyBzaGFyZWQgb3duZXJzaGlwIG9mIHRoZSBoYW5kbGUKKyAgICAgKiAgICAgICBhbmQgaWYgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGJsb2NrIGFyZSByZWxlYXNlZCwgdGhlIHVuZGVybHlpbmcgYmxvY2sKKyAgICAgKiAgICAgICBhbGxvY2F0aW9uIG1heSBnZXQgcmV1c2VkIGV2ZW4gaWYgYSBjbGllbnQga2VlcHMgYSBjbG9uZSBvZiB0aGlzIGhhbmRsZS4KKyAgICAgKi8KKyAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhbGxvY2F0b3IncyBJRCB0aGF0IGNyZWF0ZWQgdGhlIHVuZGVybHlpbmcgYWxsb2NhdGlvbiBmb3IgdGhpcyBibG9jay4gVGhpcworICAgICAqIHByb3ZpZGVzIHRoZSBjb250ZXh0IGZvciB1bmRlcnN0YW5kaW5nIHRoZSBoYW5kbGUuCisgICAgICovCisgICAgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAgIGNsYXNzIEltcGw7CisgICAgLyoqIGNvbnN0cnVjdCBhIGJsb2NrLiAqLworICAgIEMyQmxvY2sxRChzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyTGluZWFyUmFuZ2VBc3BlY3QgJnJhbmdlKTsKKworICAgIGZyaWVuZCBzdHJ1Y3QgX0MyQmxvY2tGYWN0b3J5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKK307CisKKy8qKgorICogUmVhZCB2aWV3IHByb3ZpZGVzIHJlYWQtb25seSBhY2Nlc3MgZm9yIGEgbGluZWFyIG1lbW9yeSBzZWdtZW50LgorICoKKyAqIFRoaXMgY2xhc3MgaXMgY29waWFibGUuCisgKi8KK2NsYXNzIEMyUmVhZFZpZXcgOiBwdWJsaWMgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFxyZXR1cm4gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrIG9yIG51bGxwdHIgb24gZXJyb3IuCisgICAgICogICAgICAgICBUaGlzIHBvaW50ZXIgaXMgb25seSB2YWxpZCBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIHRoaXMgdmlldyBvciB1bnRpbCBpdCBpcyByZWxlYXNlZC4KKyAgICAgKi8KKyAgICBjb25zdCB1aW50OF90ICpkYXRhKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcG9ydGlvbiBvZiB0aGlzIHZpZXcuCisgICAgICoKKyAgICAgKiBccGFyYW0gb2Zmc2V0ICB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBwb3J0aW9uLiBcbm90ZSBUaGlzIGlzIGNsYW1wZWQgdG8gdGhlIGNhcGFjaXR5IG9mIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgdmlldy4KKyAgICAgKiBccGFyYW0gc2l6ZSAgICB0aGUgc2l6ZSBvZiB0aGUgcG9ydGlvbi4gXG5vdGUgVGhpcyBpcyBjbGFtcGVkIHRvIHRoZSByZW1haW5pbmcgZGF0YSBmcm9tIG9mZnNldC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSByZWFkIHZpZXcgY29udGFpbmluZyBhIHBvcnRpb24gb2YgdGhpcyB2aWV3CisgICAgICovCisgICAgQzJSZWFkVmlldyBzdWJWaWV3KHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFxyZXR1cm4gZXJyb3IgZHVyaW5nIHRoZSBjcmVhdGlvbi9tYXBwaW5nIG9mIHRoaXMgdmlldy4KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBlcnJvcigpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmVsZWFzZXMgdGhpcyB2aWV3LiBUaGlzIHNldHMgZXJyb3IgdG8gQzJfTk9fSU5JVC4KKyAgICAgKi8KKyAgICAvL3ZvaWQgcmVsZWFzZSgpOworCitwcm90ZWN0ZWQ6CisgICAgY2xhc3MgSW1wbDsKKyAgICBDMlJlYWRWaWV3KHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IHNpemUpOworICAgIGV4cGxpY2l0IEMyUmVhZFZpZXcoYzJfc3RhdHVzX3QgZXJyb3IpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgX0MyQmxvY2tGYWN0b3J5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKKyAgICB1aW50MzJfdCBtT2Zmc2V0OyAvKio8IG9mZnNldCBpbnRvIHRoZSBsaW5lYXIgYmxvY2sgYmFja2luZyB0aGlzIHJlYWQgdmlldyAqLworfTsKKworLyoqCisgKiBXcml0ZSB2aWV3IHByb3ZpZGVzIHJlYWQvd3JpdGUgYWNjZXNzIGZvciBhIGxpbmVhciBtZW1vcnkgc2VnbWVudC4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIGNvcGlhYmxlLiBcdG9kbyBtb3ZhYmxlIG9ubHk/CisgKi8KK2NsYXNzIEMyV3JpdGVWaWV3IDogcHVibGljIF9DMkVkaXRhYmxlTGluZWFyUmFuZ2VBc3BlY3QgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFN0YXJ0IG9mIHRoZSBibG9jay4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrIG9yIG51bGxwdHIgb24gZXJyb3IuCisgICAgICogICAgICAgICBUaGlzIHBvaW50ZXIgaXMgb25seSB2YWxpZCBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIHRoaXMgdmlldyBvciB1bnRpbCBpdCBpcyByZWxlYXNlZC4KKyAgICAgKi8KKyAgICB1aW50OF90ICpiYXNlKCk7CisKKyAgICAvKioKKyAgICAgKiBccmV0dXJuIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGF0IHRoZSBjdXJyZW50IG9mZnNldCBvciBudWxscHRyIG9uIGVycm9yLgorICAgICAqICAgICAgICAgVGhpcyBwb2ludGVyIGlzIG9ubHkgdmFsaWQgZHVyaW5nIHRoZSBsaWZldGltZSBvZiB0aGlzIHZpZXcgb3IgdW50aWwgaXQgaXMgcmVsZWFzZWQuCisgICAgICovCisgICAgdWludDhfdCAqZGF0YSgpOworCisgICAgLyoqCisgICAgICogXHJldHVybiBlcnJvciBkdXJpbmcgdGhlIGNyZWF0aW9uL21hcHBpbmcgb2YgdGhpcyB2aWV3LgorICAgICAqLworICAgIGMyX3N0YXR1c190IGVycm9yKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlcyB0aGlzIHZpZXcuIFRoaXMgc2V0cyBlcnJvciB0byBDMl9OT19JTklULgorICAgICAqLworICAgIC8vdm9pZCByZWxlYXNlKCk7CisKK3Byb3RlY3RlZDoKKyAgICBjbGFzcyBJbXBsOworICAgIEMyV3JpdGVWaWV3KHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsKTsKKyAgICBleHBsaWNpdCBDMldyaXRlVmlldyhjMl9zdGF0dXNfdCBlcnJvcik7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBfQzJCbG9ja0ZhY3Rvcnk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOworfTsKKworLyoqCisgKiBBIGNvbnN0YW50IChyZWFkLW9ubHkpIGxpbmVhciBibG9jayAocG9ydGlvbiBvZiBhbiBhbGxvY2F0aW9uKSB3aXRoIGFuIGFjcXVpcmUgZmVuY2UuCisgKiBCbG9ja3MgYXJlIHVubWFwcGVkIHdoZW4gY3JlYXRlZCwgYW5kIGNhbiBiZSBtYXBwZWQgaW50byBhIHJlYWQgdmlldyBvbiBkZW1hbmQuCisgKgorICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZSBhbmQgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIGFsbG9jYXRpb24gdGhhdCBpdCBpcyBiYXNlZCBvbi4KKyAqLworY2xhc3MgQzJDb25zdExpbmVhckJsb2NrIDogcHVibGljIEMyQmxvY2sxRCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogTWFwcyB0aGlzIGJsb2NrIGludG8gbWVtb3J5IGFuZCByZXR1cm5zIGEgcmVhZCB2aWV3IGZvciBpdC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSByZWFkIHZpZXcgZm9yIHRoaXMgYmxvY2suCisgICAgICovCisgICAgQzJBY3F1aXJhYmxlPEMyUmVhZFZpZXc+IG1hcCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHBvcnRpb24gb2YgdGhpcyBibG9jay4KKyAgICAgKgorICAgICAqIFxwYXJhbSBvZmZzZXQgIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIHBvcnRpb24uIFxub3RlIFRoaXMgaXMgY2xhbXBlZCB0byB0aGUgY2FwYWNpdHkgb2YgdGhpcworICAgICAqICAgICAgICAgICAgICBibG9jay4KKyAgICAgKiBccGFyYW0gc2l6ZSAgICB0aGUgc2l6ZSBvZiB0aGUgcG9ydGlvbi4gXG5vdGUgVGhpcyBpcyBjbGFtcGVkIHRvIHRoZSByZW1haW5pbmcgZGF0YSBmcm9tIG9mZnNldC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSBjb25zdGFudCBsaW5lYXIgYmxvY2sgY29udGFpbmluZyBhIHBvcnRpb24gb2YgdGhpcyBibG9jaworICAgICAqLworICAgIEMyQ29uc3RMaW5lYXJCbG9jayBzdWJCbG9jayhzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhY3F1aXJlIGZlbmNlIGZvciB0aGlzIGJsb2NrLgorICAgICAqCisgICAgICogXHJldHVybiBhIGZlbmNlIHRoYXQgbXVzdCBiZSB3YWl0ZWQgb24gYmVmb3JlIHJlYWRpbmcgdGhlIGJsb2NrLgorICAgICAqLworICAgIEMyRmVuY2UgZmVuY2UoKSBjb25zdCB7IHJldHVybiBtRmVuY2U7IH0KKworcHJvdGVjdGVkOgorICAgIEMyQ29uc3RMaW5lYXJCbG9jayhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyTGluZWFyUmFuZ2VBc3BlY3QgJnJhbmdlLCBDMkZlbmNlIG1GZW5jZSk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBfQzJCbG9ja0ZhY3Rvcnk7CisgICAgQzJGZW5jZSBtRmVuY2U7Cit9OworCisvKioKKyAqIExpbmVhciBibG9jayBpcyBhIHdyaXRlYWJsZSAxRCBibG9jay4gT25jZSB3cml0dGVuLCBpdCBjYW4gYmUgc2hhcmVkIGluIHdob2xlIG9yIGluIHBhcnRzIHdpdGgKKyAqIGNvbnN1bWVycy9yZWFkZXJzIGFzIHJlYWQtb25seSBjb25zdCBsaW5lYXIgYmxvY2socykuCisgKi8KK2NsYXNzIEMyTGluZWFyQmxvY2sgOiBwdWJsaWMgQzJCbG9jazFEIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBNYXBzIHRoaXMgYmxvY2sgaW50byBtZW1vcnkgYW5kIHJldHVybnMgYSB3cml0ZSB2aWV3IGZvciBpdC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSB3cml0ZSB2aWV3IGZvciB0aGlzIGJsb2NrLgorICAgICAqLworICAgIEMyQWNxdWlyYWJsZTxDMldyaXRlVmlldz4gbWFwKCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgcmVhZC1vbmx5IGNvbnN0IGxpbmVhciBibG9jayBmb3IgYSBwb3J0aW9uIG9mIHRoaXMgYmxvY2s7IG9wdGlvbmFsbHkgcHJvdGVjdGVkCisgICAgICogYnkgYW4gYWNxdWlyZSBmZW5jZS4gVGhlcmUgYXJlIHR3byB3YXlzIHRvIHVzZSB0aGlzOgorICAgICAqCisgICAgICogMSkgc2hhcmUgcmVhZHkgYmxvY2sgYWZ0ZXIgd3JpdGluZyBkYXRhIGludG8gdGhlIGJsb2NrLiBJbiB0aGlzIGNhc2Ugbm8gZmVuY2Ugc2hhbGwgYmUKKyAgICAgKiAgICBzdXBwbGllZCwgYW5kIHRoZSBibG9jayBzaGFsbCBub3QgYmUgbW9kaWZpZWQgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZC4KKyAgICAgKiAyKSBzaGFyZSBibG9jayBtZXRhZGF0YSBiZWZvcmUgYWN0dWFsbHkgKGZpbmlzaGluZykgd3JpdGluZyB0aGUgZGF0YSBpbnRvIHRoZSBibG9jay4gSW4KKyAgICAgKiAgICB0aGlzIGNhc2UgYSBmZW5jZSBtdXN0IGJlIHN1cHBsaWVkIHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgZGF0YSBpcyB3cml0dGVuLgorICAgICAqICAgIFRoZSBibG9jayBzaGFsbCBiZSBtb2RpZmllZCBvbmx5IHVudGlsIGZpcmluZyB0aGUgZXZlbnQgZm9yIHRoZSBmZW5jZS4KKyAgICAgKi8KKyAgICBDMkNvbnN0TGluZWFyQmxvY2sgc2hhcmUoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUsIEMyRmVuY2UgZmVuY2UpOworCitwcm90ZWN0ZWQ6CisgICAgQzJMaW5lYXJCbG9jayhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyTGluZWFyUmFuZ2VBc3BlY3QgJnJhbmdlKTsKKworICAgIGZyaWVuZCBzdHJ1Y3QgX0MyQmxvY2tGYWN0b3J5OworfTsKKworLy8vIEB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBDSVJDVUxBUiBCTE9DS1MgQU5EIFZJRVdTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8vIFxkZWZncm91cCBjaXJjdWxhciBDaXJjdWxhciBidWZmZXIgc3VwcG9ydAorLy8vIEB7CisKKy8qKgorICogQ2lyY3VsYXIgYmxvY2tzIGNhbiBiZSB1c2VkIHRvIHNoYXJlIGRhdGEgYmV0d2VlbiBhIHdyaXRlciBhbmQgYSByZWFkZXIgKGFuZC9vciBvdGhlciBjb25zdW1lcnMpLQorICogaW4gYSBtZW1vcnktZWZmaWNpZW50IHdheSBieSByZXVzaW5nIGEgc2VjdGlvbiBvZiBtZW1vcnkuIENpcmN1bGFyIGJsb2NrcyBhcmUgYSBiaXQgbW9yZSBjb21wbGV4CisgKiB0aGFuIHNpbmdsZSByZWFkZXIvc2luZ2xlIHdyaXRlciBzY2hlbWVzIHRvIGZhY2lsaXRhdGUgYmxvY2stYmFzZWQgY29uc3VtaW5nIG9mIGRhdGEuCisgKgorICogVGhleSBjYW4gb3BlcmF0ZSBpbiB0d28gbW9kZXM6CisgKgorICogMSkgb25lIHdyaXRlciB0aGF0IGNyZWF0ZXMgYmxvY2tzIHRvIGJlIGNvbnN1bWVkICh0aGlzIG1vZGVsIGNhbiBiZSB1c2VkIGJ5IGNvbXBvbmVudHMpCisgKgorICogMikgb25lIHdyaXRlciB0aGF0IHdyaXRlcyBjb250aW51b3VzbHksIGFuZCBvbmUgcmVhZGVyIHRoYXQgY2FuIGNyZWF0ZXMgYmxvY2tzIHRvIGJlIGNvbnN1bWVkCisgKiAgICBieSBmdXJ0aGVyIHJlY2lwaWVudHMgKHRoaXMgbW9kZWwgaXMgdXNlZCBieSB0aGUgZnJhbWV3b3JrLCBhbmQgY2Fubm90IGJlIHVzZWQgYnkgY29tcG9uZW50cy4pCisgKgorICogQ2lyY3VsYXIgYmxvY2tzIGhhdmUgZm91ciBzZWdtZW50cyB3aXRoIHJ1bm5pbmcgcG9pbnRlcnM6CisgKiAgLSByZXNlcnZlZDogZGF0YSByZXNlcnZlZCBhbmQgYXZhaWxhYmxlIGZvciB0aGUgd3JpdGVyCisgKiAgLSBjb21taXR0ZWQ6IGRhdGEgY29tbWl0dGVkIGJ5IHRoZSB3cml0ZXIgYW5kIGF2YWlsYWJsZSB0byB0aGUgcmVhZGVyIChpZiBwcmVzZW50KQorICogIC0gdXNlZDogZGF0YSB1c2VkIGJ5IGNvbnN1bWVycyAoaWYgcHJlc2VudCkKKyAqICAtIGF2YWlsYWJsZTogdW51c2VkIGRhdGEgYXZhaWxhYmxlIHRvIGJlIHJlc2VydmVkCisgKi8KK2NsYXNzIEMyQ2lyY3VsYXJCbG9jayA6IHB1YmxpYyBDMkJsb2NrMUQgeworICAgIC8vIFRPRE86IGFkZCBtZXRob2RzCisKK3ByaXZhdGU6CisgICAgc2l6ZV90IG1SZXNlcnZlZCBfX3VudXNlZDsgICAvLyBlbmQgb2YgcmVzZXJ2ZWQgc2VjdGlvbgorICAgIHNpemVfdCBtQ29tbWl0dGVkIF9fdW51c2VkOyAgLy8gZW5kIG9mIGNvbW1pdHRlZCBzZWN0aW9uCisgICAgc2l6ZV90IG1Vc2VkIF9fdW51c2VkOyAgICAgICAvLyBlbmQgb2YgdXNlZCBzZWN0aW9uCisgICAgc2l6ZV90IG1GcmVlIF9fdW51c2VkOyAgICAgICAvLyBlbmQgb2YgZnJlZSBzZWN0aW9uCit9OworCitjbGFzcyBfQzJDaXJjdWxhckJsb2NrU2VnbWVudCA6IHB1YmxpYyBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYXZhaWxhYmxlIHNpemUgZm9yIHRoaXMgc2VnbWVudC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gY3VycmVudGx5IGF2YWlsYWJsZSBzaXplIGZvciB0aGlzIHNlZ21lbnQKKyAgICAgKi8KKyAgICBzaXplX3QgYXZhaWxhYmxlKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXNlcnZlIHNvbWUgc3BhY2UgZm9yIHRoaXMgc2VnbWVudCBmcm9tIGl0cyBjdXJyZW50IHN0YXJ0LgorICAgICAqCisgICAgICogXHBhcmFtIHNpemUgICAgZGVzaXJlZCBzcGFjZSBpbiBieXRlcworICAgICAqIFxwYXJhbSBmZW5jZSAgIGEgcG9pbnRlciB0byBhbiBhY3F1aXJlIGZlbmNlLiBJZiBub24tbnVsbCwgdGhlIHJlc2VydmF0aW9uIGlzIGFzeW5jaHJvbm91cyBhbmQKKyAgICAgKiAgICAgICAgICAgICAgYSBmZW5jZSB3aWxsIGJlIHN0b3JlZCBoZXJlIHRoYXQgd2lsbCBiZSBzaWduYWxlZCB3aGVuIHRoZSByZXNlcnZhdGlvbiBpcworICAgICAqICAgICAgICAgICAgICBjb21wbGV0ZS4gSWYgbnVsbCwgdGhlIHJlc2VydmF0aW9uIGlzIHN5bmNocm9ub3VzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgICAgIHRoZSBzcGFjZSB3YXMgc3VjY2Vzc2Z1bGx5IHJlc2VydmVkCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgICAgIHRoZSBzcGFjZSByZXF1ZXN0ZWQgY2Fubm90IGJlIHJlc2VydmVkCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgICAgIHRoZSByZXNlcnZhdGlvbiB0aW1lZCBvdXQgXHRvZG8gd2hlbj8KKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCAgICAgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCByZXNlcnZpbmcgc3BhY2UuICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIGMyX3N0YXR1c190IHJlc2VydmUoc2l6ZV90IHNpemUsIEMyRmVuY2UgKmZlbmNlIC8qIG51bGxhYmxlICovKTsKKworICAgIC8qKgorICAgICAqIEFiYW5kb25zIGEgcG9ydGlvbiBvZiB0aGlzIHNlZ21lbnQuIFRoaXMgd2lsbCBtb3ZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBzZWdtZW50LgorICAgICAqCisgICAgICogXG5vdGUgVGhpcyBtZXRob2RzIGlzIG9ubHkgYWxsb3dlZCBpZiB0aGlzIHNlZ21lbnQgaXMgcHJvZHVjaW5nIGJsb2Nrcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBzaXplICAgIG51bWJlciBvZiBieXRlcyB0byBhYmFuZG9uCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICAgICAgdGhlIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSBhYmFuZG9uZWQKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCAgICAgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgICAgIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgYWJhbmRvbmluZyB0aGUgZGF0YSAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBhYmFuZG9uKHNpemVfdCBzaXplKTsKKworICAgIC8qKgorICAgICAqIFNoYXJlIGEgcG9ydGlvbiBhcyBibG9jayhzKSB3aXRoIGNvbnN1bWVycyAodGhlc2UgYXJlIG1vdmVkIHRvIHRoZSB1c2VkIHNlY3Rpb24pLgorICAgICAqCisgICAgICogXG5vdGUgVGhpcyBtZXRob2RzIGlzIG9ubHkgYWxsb3dlZCBpZiB0aGlzIHNlZ21lbnQgaXMgcHJvZHVjaW5nIGJsb2Nrcy4KKyAgICAgKiBcbm90ZSBTaGFyZSBkb2VzIG5vdCBtb3ZlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlZ21lbnQuIChcdG9kbyBhZGQgYWJhbmRvbi9vZmZzZXQ/KQorICAgICAqCisgICAgICogXHBhcmFtIHNpemUgICAgbnVtYmVyIG9mIGJ5dGVzIHRvIHNoYXJlCisgICAgICogXHBhcmFtIGZlbmNlICAgZmVuY2UgdG8gYmUgdXNlZCBmb3IgdGhlIHNlY3Rpb24KKyAgICAgKiBccGFyYW0gYmxvY2tzICB2ZWN0b3Igd2hlcmUgdGhlIGJsb2NrcyBvZiB0aGUgc2VjdGlvbiBhcmUgYXBwZW5kZWQgdG8KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgICAgICB0aGUgcG9ydGlvbiB3YXMgc3VjY2Vzc2Z1bGx5IHNoYXJlZAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZICAgICBub3QgZW5vdWdoIG1lbW9yeSB0byBzaGFyZSB0aGUgcG9ydGlvbgorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUICAgICB0aGUgb3BlcmF0aW9uIHRpbWVkIG91dCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCAgICAgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCBzaGFyaW5nIHRoZSBkYXRhICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIGMyX3N0YXR1c190IHNoYXJlKHNpemVfdCBzaXplLCBDMkZlbmNlIGZlbmNlLCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+ICZibG9ja3MpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYmVnaW5uaW5nIG9mZnNldCBvZiB0aGlzIHNlZ21lbnQgZnJvbSB0aGUgc3RhcnQgb2YgdGhpcyBjaXJjdWxhciBibG9jay4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYmVnaW5uaW5nIG9mZnNldAorICAgICAqLworICAgIHNpemVfdCBiZWdpbigpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZW5kIG9mZnNldCBvZiB0aGlzIHNlZ21lbnQgZnJvbSB0aGUgc3RhcnQgb2YgdGhpcyBjaXJjdWxhciBibG9jay4KKyAgICAgKgorICAgICAqIEByZXR1cm4gZW5kIG9mZnNldAorICAgICAqLworICAgIHNpemVfdCBlbmQoKTsKK307CisKKy8qKgorICogQSBjaXJjdWxhciB3cml0ZS12aWV3IGlzIGEgZHluYW1pYyBtYXBwZWQgdmlldyBmb3IgYSBzZWdtZW50IG9mIGEgY2lyY3VsYXIgYmxvY2suIENhcmUgbXVzdCBiZQorICogdGFrZW4gd2hlbiB1c2luZyB0aGlzIHZpZXcgc28gdGhhdCBvbmx5IHRoZSBzZWN0aW9uIG93bmVkIGJ5IHRoZSBzZWdtZW50IGlzIG1vZGlmaWVkLgorICovCitjbGFzcyBDMkNpcmN1bGFyV3JpdGVWaWV3IDogcHVibGljIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBTdGFydCBvZiB0aGUgY2lyY3VsYXIgYmxvY2suCisgICAgICogXG5vdGUgdGhlIHNlZ21lbnQgZG9lcyBub3Qgb3duIHRoaXMgcG9pbnRlci4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGNpcmN1bGFyIGJsb2NrIG9yIG51bGxwdHIgb24gZXJyb3IuCisgICAgICovCisgICAgdWludDhfdCAqYmFzZSgpOworCisgICAgLyoqCisgICAgICogXHJldHVybiBlcnJvciBkdXJpbmcgdGhlIGNyZWF0aW9uL21hcHBpbmcgb2YgdGhpcyB2aWV3LgorICAgICAqLworICAgIGMyX3N0YXR1c190IGVycm9yKCkgY29uc3Q7Cit9OworCisvKioKKyAqIFRoZSB3cml0ZXIgb2YgYSBjaXJjdWxhciBidWZmZXIuCisgKgorICogQ2FuIGNvbW1pdCBkYXRhIHRvIGEgcmVhZGVyIChub3Qgc3VwcG9ydGVkIGZvciBjb21wb25lbnRzKSBPUiBzaGFyZSBkYXRhIGJsb2NrcyBkaXJlY3RseSB3aXRoIGEKKyAqIGNvbnN1bWVyLgorICoKKyAqIElmIGEgY29tcG9uZW50IHN1cHBvcnRzIG91dHB1dHRpbmcgZGF0YSBpbnRvIGNpcmN1bGFyIGJ1ZmZlcnMsIGl0IG11c3QgYWxsb2NhdGUgYSBjaXJjdWxhcgorICogYmxvY2sgYW5kIHVzZSBhIGNpcmN1bGFyIHdyaXRlci4KKyAqLworY2xhc3MgQzJDaXJjdWxhcldyaXRlciA6IHB1YmxpYyBfQzJDaXJjdWxhckJsb2NrU2VnbWVudCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29tbWl0cyBhIHBvcnRpb24gb2YgdGhpcyBzZWdtZW50IHRvIHRoZSBuZXh0IHNlZ21lbnQuIFRoaXMgbW92ZXMgdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAgICAgKiBzZWdtZW50LgorICAgICAqCisgICAgICogXHBhcmFtIHNpemUgICAgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbW1pdCB0byB0aGUgbmV4dCBzZWdtZW50CisgICAgICogXHBhcmFtIGZlbmNlICAgZmVuY2UgdXNlZCBmb3IgdGhlIGNvbW1pdCAodGhlIGZlbmNlIG11c3Qgc2lnbmFsIGJlZm9yZSB0aGUgZGF0YSBpcyBjb21taXR0ZWQpCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgY29tbWl0KHNpemVfdCBzaXplLCBDMkZlbmNlIGZlbmNlKTsKKworICAgIC8qKgorICAgICAqIE1hcHMgdGhpcyBibG9jayBpbnRvIG1lbW9yeSBhbmQgcmV0dXJucyBhIHdyaXRlIHZpZXcgZm9yIGl0LgorICAgICAqCisgICAgICogXHJldHVybiBhIHdyaXRlIHZpZXcgZm9yIHRoaXMgYmxvY2suCisgICAgICovCisgICAgQzJBY3F1aXJhYmxlPEMyQ2lyY3VsYXJXcml0ZVZpZXc+IG1hcCgpOworfTsKKworLy8vIEB9CisKKy8vLyBcZGVmZ3JvdXAgZ3JhcGhpYyBHcmFwaGljIERhdGEgQmxvY2tzCisvLy8gQHsKKworLyoqCisgKiBDMlJlY3Q6IHJlY3RhbmdsZSB0eXBlIHdpdGggbm9uLW5lZ2F0aXZlIGNvb3JkaW5hdGVzLgorICoKKyAqIFxub3RlIFRoaXMgc3RydWN0IGhhcyBwdWJsaWMgZmllbGRzIHdpdGhvdXQgZ2V0dGVycy9zZXR0ZXJzLiBBbGwgbWV0aG9kcyBhcmUgaW5saW5lLgorICovCitzdHJ1Y3QgQzJSZWN0IHsKKy8vIHB1YmxpYzoKKyAgICB1aW50MzJfdCB3aWR0aDsKKyAgICB1aW50MzJfdCBoZWlnaHQ7CisgICAgdWludDMyX3QgbGVmdDsKKyAgICB1aW50MzJfdCB0b3A7CisKKyAgICBjb25zdGV4cHIgaW5saW5lIEMyUmVjdCgpCisgICAgICAgIDogQzJSZWN0KDAsIDAsIDAsIDApIHsgfQorCisgICAgY29uc3RleHByIGlubGluZSBDMlJlY3QodWludDMyX3Qgd2lkdGhfLCB1aW50MzJfdCBoZWlnaHRfKQorICAgICAgICA6IEMyUmVjdCh3aWR0aF8sIGhlaWdodF8sIDAsIDApIHsgfQorCisgICAgY29uc3RleHByIEMyUmVjdCBpbmxpbmUgYXQodWludDMyX3QgbGVmdF8sIHVpbnQzMl90IHRvcF8pIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyUmVjdCh3aWR0aCwgaGVpZ2h0LCBsZWZ0XywgdG9wXyk7CisgICAgfQorCisgICAgLy8gdXRpbGl0eSBtZXRob2RzCisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDA7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIGlzVmFsaWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBsZWZ0IDw9IH53aWR0aCAmJiB0b3AgPD0gfmhlaWdodDsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBpc1ZhbGlkKCkgJiYgIWlzRW1wdHkoKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QgeworICAgICAgICByZXR1cm4gIWJvb2woKnRoaXMpOworICAgIH0KKworICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIGNvbnRhaW5zKGNvbnN0IEMyUmVjdCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgaWYgKCFpc1ZhbGlkKCkgfHwgIW90aGVyLmlzVmFsaWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGxlZnQgPD0gb3RoZXIubGVmdCAmJiB0b3AgPD0gb3RoZXIudG9wCisgICAgICAgICAgICAgICAgICAgICYmIGxlZnQgKyB3aWR0aCA+PSBvdGhlci5sZWZ0ICsgb3RoZXIud2lkdGgKKyAgICAgICAgICAgICAgICAgICAgJiYgdG9wICsgaGVpZ2h0ID49IG90aGVyLnRvcCArIG90aGVyLmhlaWdodDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEMyUmVjdCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgaWYgKCFpc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAhb3RoZXIuaXNWYWxpZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGxlZnQgPT0gb3RoZXIubGVmdCAmJiB0b3AgPT0gb3RoZXIudG9wCisgICAgICAgICAgICAgICAgICAgICYmIHdpZHRoID09IG90aGVyLndpZHRoICYmIGhlaWdodCA9PSBvdGhlci5oZWlnaHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDMlJlY3QgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAhb3BlcmF0b3I9PShvdGhlcik7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPj0oY29uc3QgQzJSZWN0ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gY29udGFpbnMob3RoZXIpOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj4oY29uc3QgQzJSZWN0ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gY29udGFpbnMob3RoZXIpICYmICFvcGVyYXRvcj09KG90aGVyKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I8PShjb25zdCBDMlJlY3QgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBvdGhlci5jb250YWlucygqdGhpcyk7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPChjb25zdCBDMlJlY3QgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBvdGhlci5jb250YWlucygqdGhpcykgJiYgIW9wZXJhdG9yPT0ob3RoZXIpOworICAgIH0KKworICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIGNvbnN0ZXhwciB1aW50MzJfdCByaWdodCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxlZnQgKyB3aWR0aDsKKyAgICB9CisKKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgdWludDMyX3QgYm90dG9tKCkgY29uc3QgeworICAgICAgICByZXR1cm4gdG9wICsgaGVpZ2h0OworICAgIH0KKworICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIGNvbnN0ZXhwciBDMlJlY3QgaW50ZXJzZWN0KGNvbnN0IEMyUmVjdCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyUmVjdChjMl9taW4ocmlnaHQoKSwgb3RoZXIucmlnaHQoKSkgLSBjMl9tYXgobGVmdCwgb3RoZXIubGVmdCksCisgICAgICAgICAgICAgICAgICAgICAgYzJfbWluKGJvdHRvbSgpLCBvdGhlci5ib3R0b20oKSkgLSBjMl9tYXgodG9wLCBvdGhlci50b3ApLAorICAgICAgICAgICAgICAgICAgICAgIGMyX21heChsZWZ0LCBvdGhlci5sZWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgICBjMl9tYXgodG9wLCBvdGhlci50b3ApKTsKKyAgICB9CisKKyAgICAvKiogY2xhbXBzIHJpZ2h0IGFuZCBib3R0b20gdG8gdG9wLCBsZWZ0IGlmIHRoZXkgb3ZlcmZsb3cgKi8KKyAgICBpbmxpbmUgY29uc3RleHByIEMyUmVjdCBub3JtYWxpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlJlY3QoYzJfbWF4KGxlZnQsIHJpZ2h0KCkpIC0gbGVmdCwgYzJfbWF4KHRvcCwgYm90dG9tKCkpIC0gdG9wLCBsZWZ0LCB0b3ApOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLy8gbm90ZTogcG90ZW50aWFsbHkgdW51c3VhbCBhcmd1bWVudCBvcmRlcgorICAgIGNvbnN0ZXhwciBpbmxpbmUgQzJSZWN0KHVpbnQzMl90IHdpZHRoXywgdWludDMyX3QgaGVpZ2h0XywgdWludDMyX3QgbGVmdF8sIHVpbnQzMl90IHRvcF8pCisgICAgICAgIDogd2lkdGgod2lkdGhfKSwKKyAgICAgICAgICBoZWlnaHQoaGVpZ2h0XyksCisgICAgICAgICAgbGVmdChsZWZ0XyksCisgICAgICAgICAgdG9wKHRvcF8pIHsgfQorfTsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIG9iamVjdHMgdGhhdCBoYXZlIGEgd2lkdGggYW5kIGhlaWdodCAocGxhbmFyIGNhcGFjaXR5KS4KKyAqLworY2xhc3MgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QgeworLy8vIFxuYW1lIFBsYW5hciBjYXBhY2l0eSBpbnRlcmZhY2UKKy8vLyBAeworcHVibGljOgorICAgIGlubGluZSBjb25zdGV4cHIgdWludDMyX3Qgd2lkdGgoKSBjb25zdCB7IHJldHVybiBfbVdpZHRoOyB9CisgICAgaW5saW5lIGNvbnN0ZXhwciB1aW50MzJfdCBoZWlnaHQoKSBjb25zdCB7IHJldHVybiBfbUhlaWdodDsgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBvcGVyYXRvciBDMlJlY3QoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlJlY3QoX21XaWR0aCwgX21IZWlnaHQpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIGlubGluZSBjb25zdGV4cHIgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkKKyAgICAgIDogX21XaWR0aCh3aWR0aCksIF9tSGVpZ2h0KGhlaWdodCkgeyB9CisKKyAgICBpbmxpbmUgZXhwbGljaXQgY29uc3RleHByIF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0KGNvbnN0IF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0ICpwYXJlbnQpCisgICAgICAgIDogX21XaWR0aChwYXJlbnQgPT0gbnVsbHB0ciA/IDAgOiBwYXJlbnQtPndpZHRoKCkpLAorICAgICAgICAgIF9tSGVpZ2h0KHBhcmVudCA9PSBudWxscHRyID8gMCA6IHBhcmVudC0+aGVpZ2h0KCkpIHsgfQorCitwcml2YXRlOgorICAgIHVpbnQzMl90IF9tV2lkdGg7CisgICAgdWludDMyX3QgX21IZWlnaHQ7CisvLy8gQH0KK307CisKKy8qKgorICogQzJQbGFuZUluZm86IGluZm9ybWF0aW9uIG9uIHRoZSBsYXlvdXQgb2YgYSBzaW5nZSBmbGV4aWJsZSBwbGFuZS4KKyAqCisgKiBQdWJsaWMgZmllbGRzIHdpdGhvdXQgZ2V0dGVycy9zZXR0ZXJzLgorICovCitzdHJ1Y3QgQzJQbGFuZUluZm8geworLy9wdWJsaWM6CisgICAgZW51bSBjaGFubmVsX3QgOiB1aW50MzJfdCB7CisgICAgICAgIENIQU5ORUxfWSwgIC8vLzwgbHVtYQorICAgICAgICBDSEFOTkVMX1IsICAvLy88IHJlZAorICAgICAgICBDSEFOTkVMX0csICAvLy88IGdyZWVuCisgICAgICAgIENIQU5ORUxfQiwgIC8vLzwgYmx1ZQorICAgICAgICBDSEFOTkVMX0EsICAvLy88IGFscGhhCisgICAgICAgIENIQU5ORUxfQ1IsIC8vLzwgQ3IKKyAgICAgICAgQ0hBTk5FTF9DQiwgLy8vPCBDYgorICAgIH0gY2hhbm5lbDsKKworICAgIGludDMyX3QgY29sSW5jOyAgICAgICAvLy88IGNvbHVtbiBpbmNyZW1lbnQgaW4gYnl0ZXMuIG1heSBiZSBuZWdhdGl2ZQorICAgIGludDMyX3Qgcm93SW5jOyAgICAgICAvLy88IHJvdyBpbmNyZW1lbnQgaW4gYnl0ZXMuIG1heSBiZSBuZWdhdGl2ZQorCisgICAgdWludDMyX3QgY29sU2FtcGxpbmc7IC8vLzwgc3Vic2FtcGxpbmcgY29tcGFyZWQgdG8gd2lkdGggKG11c3QgYmUgYSBwb3dlciBvZiAyKQorICAgIHVpbnQzMl90IHJvd1NhbXBsaW5nOyAvLy88IHN1YnNhbXBsaW5nIGNvbXBhcmVkIHRvIGhlaWdodCAobXVzdCBiZSBhIHBvd2VyIG9mIDIpCisKKyAgICB1aW50MzJfdCBhbGxvY2F0ZWREZXB0aDsgLy8vPCBzaXplIG9mIGVhY2ggc2FtcGxlIChtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOCkKKyAgICB1aW50MzJfdCBiaXREZXB0aDsgICAgICAgLy8vPCBzaWduaWZpY2FudCBiaXRzIHBlciBzYW1wbGUKKyAgICAvKioKKyAgICAgKiB0aGUgcmlnaHQgc2hpZnQgb2YgdGhlIHNpZ25pZmljYW50IGJpdHMgaW4gdGhlIHNhbXBsZS4gRS5nLiBpZiBhIDEwLWJpdCBzaWduaWZpY2FudAorICAgICAqIHZhbHVlIGlzIGxhaWQgb3V0IGluIGEgMTYtYml0IGFsbG9jYXRpb24gYWxpZ25lZCB0byBMU0IgKHZhbHVlcyAwLTEwMjMpLCByaWdodFNoaWZ0CisgICAgICogd291bGQgYmUgMCBhcyB0aGUgMTYtYml0IHZhbHVlIHJlYWQgZnJvbSB0aGUgc2FtcGxlIGRvZXMgbm90IG5lZWQgdG8gYmUgcmlnaHQgc2hpZnRlZAorICAgICAqIGFuZCBjYW4gYmUgdXNlZCBhcyBpcyAoYWZ0ZXIgYXBwbHlpbmcgYSAxMC1iaXQgbWFzayBvZiAweDNGRikuCisgICAgICoKKyAgICAgKiArLS0tLS0tLS0rLS0tLS0tLS0rCisgICAgICogfCAgICAgIFZWfFZWVlZWVlZWfAorICAgICAqICstLS0tLS0tLSstLS0tLS0tLSsKKyAgICAgKiAgMTUgICAgIDggNyAgICAgIDAKKyAgICAgKgorICAgICAqIElmIHRoZSB2YWx1ZSBpcyBsYWlkIG91dCBhbGlnbmVkIHRvIE1TQiwgcmlnaHRTaGlmdCB3b3VsZCBiZSA2LCBhcyB0aGUgdmFsdWUgcmVhZAorICAgICAqIGZyb20gdGhlIGFsbG9jYXRlZCBzYW1wbGUgbXVzdCBiZSByaWdodC1zaGlmdGVkIGJ5IDYgdG8gZ2V0IHRoZSBhY3R1YWwgc2FtcGxlIHZhbHVlLgorICAgICAqCisgICAgICogKy0tLS0tLS0tKy0tLS0tLS0tKworICAgICAqIHxWVlZWVlZWVnxWViAgICAgIHwKKyAgICAgKiArLS0tLS0tLS0rLS0tLS0tLS0rCisgICAgICogIDE1ICAgICA4IDcgICAgICAwCisgICAgICovCisgICAgdWludDMyX3QgcmlnaHRTaGlmdDsKKworICAgIGVudW0gZW5kaWFubmVzc190IDogdWludDMyX3QgeworICAgICAgICBOQVRJVkUsCisgICAgICAgIExJVFRMRV9FTkQsIC8vIExJVFRMRV9FTkRJQU4gaXMgcmVzZXJ2ZWQgbWFjcm8KKyAgICAgICAgQklHX0VORCwgICAgLy8gQklHX0VORElBTiBpcyBhIHJlc2VydmVkIG1hY3JvCisgICAgfSBlbmRpYW5uZXNzOyAvLy88IGVuZGlhbm5lc3Mgb2YgdGhlIHNhbXBsZXMKKworICAgIC8qKgorICAgICAqIFRoZSBmb2xsb3dpbmcgdHdvIGZpZWxkcyBkZWZpbmUgdGhlIHJlbGF0aW9uIGJldHdlZW4gbXVsdGlwbGUgcGxhbmVzLiBJZiBtdWx0aXBsZSBwbGFuZXMgYXJlCisgICAgICogaW50ZXJsZWF2ZWQsIHRoZXkgc2hhcmUgYSByb290IHBsYW5lICh3aGljaGV2ZXIgcGxhbmUncyBzdGFydCBhZGRyZXNzIGlzIHRoZSBsb3dlc3QpLCBhbmQKKyAgICAgKiB8b2Zmc2V0fCBpcyB0aGUgb2Zmc2V0IG9mIHRoaXMgcGxhbmUgaW5zaWRlIHRoZSByb290IHBsYW5lIChpbiBieXRlcykuIHxyb290SXh8IGlzIHRoZSBpbmRleAorICAgICAqIG9mIHRoZSByb290IHBsYW5lLiBJZiBhIHBsYW5lIGlzIGluZGVwZW5kZW50LCByb290SXggaXMgaXRzIGluZGV4IGFuZCBvZmZzZXQgaXMgMC4KKyAgICAgKi8KKyAgICB1aW50MzJfdCByb290SXg7IC8vLzwgaW5kZXggb2YgdGhlIHJvb3QgcGxhbmUKKyAgICB1aW50MzJfdCBvZmZzZXQ7IC8vLzwgb2Zmc2V0IG9mIHRoaXMgcGxhbmUgaW5zaWRlIG9mIHRoZSByb290IHBsYW5lCisKKyAgICBpbmxpbmUgY29uc3RleHByIHNzaXplX3QgbWluT2Zmc2V0KHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIGNvbnN0IHsKKyAgICAgICAgc3NpemVfdCBvZmZzID0gMDsKKyAgICAgICAgaWYgKHdpZHRoID4gMCAmJiBjb2xJbmMgPCAwKSB7CisgICAgICAgICAgICBvZmZzICs9IGNvbEluYyAqIChzc2l6ZV90KSh3aWR0aCAtIDEpOworICAgICAgICB9CisgICAgICAgIGlmIChoZWlnaHQgPiAwICYmIHJvd0luYyA8IDApIHsKKyAgICAgICAgICAgIG9mZnMgKz0gcm93SW5jICogKHNzaXplX3QpKGhlaWdodCAtIDEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvZmZzOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgc3NpemVfdCBtYXhPZmZzZXQodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgY29uc3QgeworICAgICAgICBzc2l6ZV90IG9mZnMgPSAoYWxsb2NhdGVkRGVwdGggKyA3KSA+PiAzOworICAgICAgICBpZiAod2lkdGggPiAwICYmIGNvbEluYyA+IDApIHsKKyAgICAgICAgICAgIG9mZnMgKz0gY29sSW5jICogKHNzaXplX3QpKHdpZHRoIC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhlaWdodCA+IDAgJiYgcm93SW5jID4gMCkgeworICAgICAgICAgICAgb2ZmcyArPSByb3dJbmMgKiAoc3NpemVfdCkoaGVpZ2h0IC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG9mZnM7CisgICAgfQorfSBDMl9QQUNLOworCitzdHJ1Y3QgQzJQbGFuYXJMYXlvdXQgeworLy9wdWJsaWM6CisgICAgZW51bSB0eXBlX3QgOiB1aW50MzJfdCB7CisgICAgICAgIFRZUEVfVU5LTk9XTiA9IDAsCisgICAgICAgIFRZUEVfWVVWID0gMHgxMDAsICAgLy8vPCBZVVYgaW1hZ2Ugd2l0aCAzIHBsYW5lcworICAgICAgICBUWVBFX1lVVkEsICAgICAgICAgIC8vLzwgWVVWQSBpbWFnZSB3aXRoIDQgcGxhbmVzCisgICAgICAgIFRZUEVfUkdCLCAgICAgICAgICAgLy8vPCBSR0IgaW1hZ2Ugd2l0aCAzIHBsYW5lcworICAgICAgICBUWVBFX1JHQkEsICAgICAgICAgIC8vLzwgUkJHQSBpbWFnZSB3aXRoIDQgcGxhbmVzCisgICAgfTsKKworICAgIHR5cGVfdCB0eXBlOyAgICAgICAgICAgICAgICAgICAgLy8gaW1hZ2UgdHlwZQorICAgIHVpbnQzMl90IG51bVBsYW5lczsgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGNvbXBvbmVudCBwbGFuZXMKKyAgICB1aW50MzJfdCByb290UGxhbmVzOyAgICAgICAgICAgIC8vIG51bWJlciBvZiBsYXlvdXQgcGxhbmVzIChyb290IHBsYW5lcykKKworICAgIGVudW0gcGxhbmVfaW5kZXhfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgUExBTkVfWSA9IDAsCisgICAgICAgIFBMQU5FX1UgPSAxLAorICAgICAgICBQTEFORV9WID0gMiwKKyAgICAgICAgUExBTkVfUiA9IDAsCisgICAgICAgIFBMQU5FX0cgPSAxLAorICAgICAgICBQTEFORV9CID0gMiwKKyAgICAgICAgUExBTkVfQSA9IDMsCisgICAgICAgIE1BWF9OVU1fUExBTkVTID0gNCwKKyAgICB9OworCisgICAgQzJQbGFuZUluZm8gcGxhbmVzW01BWF9OVU1fUExBTkVTXTsKK307CisKKy8qKgorICogQXNwZWN0IGZvciBvYmplY3RzIHRoYXQgaGF2ZSBhIHBsYW5hciBzZWN0aW9uIChjcm9wIHJlY3RhbmdsZSkuCisgKgorICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZS4KKyAqLworY2xhc3MgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCA6IHB1YmxpYyBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdCB7CisvLy8gXG5hbWUgUGxhbmFyIHNlY3Rpb24gaW50ZXJmYWNlCisvLy8gQHsKK3ByaXZhdGU6CisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0KHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGNvbnN0IEMyUmVjdCAmY3JvcCkKKyAgICAgICAgOiBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdCh3aWR0aCwgaGVpZ2h0KSwKKyAgICAgICAgICBtQ3JvcChDMlJlY3Qoc3RkOjptaW4od2lkdGggLSBzdGQ6Om1pbihjcm9wLmxlZnQsIHdpZHRoKSwgY3JvcC53aWR0aCksCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWluKGhlaWdodCAtIHN0ZDo6bWluKGNyb3AudG9wLCBoZWlnaHQpLCBjcm9wLmhlaWdodCkpLmF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWluKGNyb3AubGVmdCwgd2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWluKGNyb3AuaGVpZ2h0LCBoZWlnaHQpKSkgeworICAgIH0KKworcHVibGljOgorICAgIC8vIGNyb3AgY2FuIGJlIGFuIGVtcHR5IHJlY3QsIGRvZXMgbm90IGhhdmUgdG8gbGluZSB1cCB3aXRoIHN1YnNhbXBsaW5nCisgICAgLy8gTk9URTogd2UgZG8gbm90IHN1cHBvcnQgZmxvYXRpbmctcG9pbnQgY3JvcAorICAgIGlubGluZSBjb25zdGV4cHIgQzJSZWN0IGNyb3AoKSBjb25zdCB7IHJldHVybiBtQ3JvcDsgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGNoaWxkIHBsYW5hciBzZWN0aW9uIGZvciB8Y3JvcHwsIHdoZXJlIHRoZSBjYXBhY2l0eSByZXByZXNlbnRzIHRoaXMgc2VjdGlvbi4KKyAgICAgKi8KKyAgICBpbmxpbmUgY29uc3RleHByIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgY2hpbGRTZWN0aW9uKGNvbnN0IEMyUmVjdCAmY3JvcCkgY29uc3QgeworICAgICAgICByZXR1cm4gX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCgKKyAgICAgICAgICAgICAgICBtQ3JvcC53aWR0aCwgbUNyb3AuaGVpZ2h0LAorICAgICAgICAgICAgICAgIC8vIGNyb3AgYW5kIHRyYW5zbGF0ZSB8Y3JvcHwgcmVjdAorICAgICAgICAgICAgICAgIEMyUmVjdChjMl9taW4obUNyb3AucmlnaHQoKSAtIGMyX2NsYW1wKG1Dcm9wLmxlZnQsIGNyb3AubGVmdCwgbUNyb3AucmlnaHQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wLndpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgYzJfbWluKG1Dcm9wLmJvdHRvbSgpIC0gYzJfY2xhbXAobUNyb3AudG9wLCBjcm9wLnRvcCwgbUNyb3AuYm90dG9tKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvcC5oZWlnaHQpKQorICAgICAgICAgICAgICAgIC5hdChjMl9jbGFtcChtQ3JvcC5sZWZ0LCBjcm9wLmxlZnQsIG1Dcm9wLnJpZ2h0KCkpIC0gbUNyb3AubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgYzJfY2xhbXAobUNyb3AudG9wLCBjcm9wLnRvcCwgbUNyb3AuYm90dG9tKCkpIC0gbUNyb3AudG9wKSk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0KGNvbnN0IF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0ICpwYXJlbnQpCisgICAgICAgIDogX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QocGFyZW50KSwgbUNyb3Aod2lkdGgoKSwgaGVpZ2h0KCkpIHt9CisKKyAgICBpbmxpbmUgY29uc3RleHByIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QoY29uc3QgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QgKnBhcmVudCwgY29uc3QgQzJSZWN0ICZjcm9wKQorICAgICAgICA6IF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0KHBhcmVudCksCisgICAgICAgICAgbUNyb3AocGFyZW50ID09IG51bGxwdHIgPyBDMlJlY3QoKSA6ICgoQzJSZWN0KSpwYXJlbnQpLmludGVyc2VjdChjcm9wKS5ub3JtYWxpemUoKSkgeyB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QoY29uc3QgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCAqcGFyZW50LCBjb25zdCBDMlJlY3QgJmNyb3ApCisgICAgICAgIDogX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QocGFyZW50KSwKKyAgICAgICAgICBtQ3JvcChwYXJlbnQgPT0gbnVsbHB0ciA/IEMyUmVjdCgpIDogcGFyZW50LT5jcm9wKCkuaW50ZXJzZWN0KGNyb3ApLm5vcm1hbGl6ZSgpKSB7IH0KKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgX0MyRWRpdGFibGVQbGFuYXJTZWN0aW9uQXNwZWN0OworICAgIEMyUmVjdCBtQ3JvcDsKKy8vLyBAfQorfTsKKworLyoqCisgKiBBc3BlY3QgZm9yIG9iamVjdHMgdGhhdCBoYXZlIGFuIGVkaXRhYmxlIHBsYW5hciBzZWN0aW9uIChjcm9wIHJlY3RhbmdsZSkuCisgKgorICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZS4KKyAqLworY2xhc3MgX0MyRWRpdGFibGVQbGFuYXJTZWN0aW9uQXNwZWN0IDogcHVibGljIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgeworLy8vIFxuYW1lIFBsYW5hciBzZWN0aW9uIGludGVyZmFjZQorLy8vIEB7CisgICAgdXNpbmcgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdDo6X0MyUGxhbmFyU2VjdGlvbkFzcGVjdDsKKworcHVibGljOgorICAgIC8vIGNyb3AgY2FuIGJlIGFuIGVtcHR5IHJlY3QsIGRvZXMgbm90IGhhdmUgdG8gbGluZSB1cCB3aXRoIHN1YnNhbXBsaW5nCisgICAgLy8gTk9URTogd2UgZG8gbm90IHN1cHBvcnQgZmxvYXRpbmctcG9pbnQgY3JvcAorICAgIGlubGluZSBjb25zdGV4cHIgQzJSZWN0IGNyb3AoKSBjb25zdCB7IHJldHVybiBtQ3JvcDsgfQorCisgICAgLyoqCisgICAgICogIFNldHMgY3JvcCB0byBjcm9wIGludGVyc2VjdGVkIHdpdGggWygwLDApIC4uICh3aWR0aCwgaGVpZ2h0KV0KKyAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCBzZXRDcm9wX2JlKGNvbnN0IEMyUmVjdCAmY3JvcCkgeworICAgICAgICBtQ3JvcC5sZWZ0ID0gc3RkOjptaW4od2lkdGgoKSwgY3JvcC5sZWZ0KTsKKyAgICAgICAgbUNyb3AudG9wID0gc3RkOjptaW4oaGVpZ2h0KCksIGNyb3AudG9wKTsKKyAgICAgICAgLy8gSXQncyBndWFyYW50ZWVkIHRoYXQgbUNyb3AubGVmdCA8PSB3aWR0aCgpICYmIG1Dcm9wLnRvcCA8PSBoZWlnaHQoKQorICAgICAgICBtQ3JvcC53aWR0aCA9IHN0ZDo6bWluKHdpZHRoKCkgLSBtQ3JvcC5sZWZ0LCBjcm9wLndpZHRoKTsKKyAgICAgICAgbUNyb3AuaGVpZ2h0ID0gc3RkOjptaW4oaGVpZ2h0KCkgLSBtQ3JvcC50b3AsIGNyb3AuaGVpZ2h0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiBjcm9wIGlzIHdpdGhpbiB0aGUgZGltZW5zaW9ucyBvZiB0aGlzIG9iamVjdCwgaXQgc2V0cyBjcm9wIHRvIGl0LgorICAgICAqCisgICAgICogXHJldHVybiB0cnVlIGlmZiBjcm9wIGlzIHdpdGhpbiB0aGUgZGltZW5zaW9ucyBvZiB0aGlzIG9iamVjdAorICAgICAqLworICAgIGlubGluZSBib29sIHNldENyb3AoY29uc3QgQzJSZWN0ICZjcm9wKSB7CisgICAgICAgIGlmICh3aWR0aCgpIDwgY3JvcC53aWR0aCB8fCBoZWlnaHQoKSA8IGNyb3AuaGVpZ2h0CisgICAgICAgICAgICAgICAgfHwgd2lkdGgoKSAtIGNyb3Aud2lkdGggPCBjcm9wLmxlZnQgfHwgaGVpZ2h0KCkgLSBjcm9wLmhlaWdodCA8IGNyb3AudG9wKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgbUNyb3AgPSBjcm9wOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisvLy8gQH0KK307CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyBmb3Igc2FmZSByYW5nZSBjYWxjdWxhdGlvbnMgdXNpbmcgc2l6ZV90LXMuCisgKi8KK2NsYXNzIEMyUGxhbmFyU2VjdGlvbiA6IHB1YmxpYyBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0IHsKK3B1YmxpYzoKKyAgICBpbmxpbmUgY29uc3RleHByIEMyUGxhbmFyU2VjdGlvbihjb25zdCBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdCAmcGFyZW50LCBjb25zdCBDMlJlY3QgJmNyb3ApCisgICAgICAgIDogX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCgmcGFyZW50LCBjcm9wKSB7IH0KKworICAgIGlubGluZSBjb25zdGV4cHIgQzJQbGFuYXJTZWN0aW9uKGNvbnN0IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgJnBhcmVudCwgY29uc3QgQzJSZWN0ICZjcm9wKQorICAgICAgICA6IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QoJnBhcmVudCwgY3JvcCkgeyB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIEMyUGxhbmFyU2VjdGlvbiBpbnRlcnNlY3QoY29uc3QgQzJSZWN0ICZjcm9wKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlBsYW5hclNlY3Rpb24oKnRoaXMsIGNyb3ApOworICAgIH0KK307CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyBmb3Igc2ltcGxlIGFuZCBzYWZlIHBsYW5hciBjYXBhY2l0eSBhbmQgc2VjdGlvbiBjb25zdHJ1Y3Rpb24uCisgKi8KK2NsYXNzIEMyUGxhbmFyQ2FwYWNpdHkgOiBwdWJsaWMgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QgeworcHVibGljOgorICAgIGlubGluZSBjb25zdGV4cHIgZXhwbGljaXQgQzJQbGFuYXJDYXBhY2l0eShzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpCisgICAgICAgIDogX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QoYzJfbWluKHdpZHRoLCBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMyX21pbihoZWlnaHQsIHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKSkpIHsgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBDMlBsYW5hclNlY3Rpb24gc2VjdGlvbihjb25zdCBDMlJlY3QgJmNyb3ApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyUGxhbmFyU2VjdGlvbigqdGhpcywgY3JvcCk7CisgICAgfQorfTsKKworCisvKioKKyAqIFxpbmdyb3VwIGdyYXBoaWMgYWxsb2NhdG9yCisgKiAyRCBhbGxvY2F0aW9uIGludGVyZmFjZS4KKyAqLworY2xhc3MgQzJHcmFwaGljQWxsb2NhdGlvbiA6IHB1YmxpYyBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogTWFwcyBhIHJlY3Rhbmd1bGFyIHNlY3Rpb24gKGFzIGRlZmluZWQgYnkgfHJlY3R8KSBvZiBhIDJEIGFsbG9jYXRpb24gaW50byBsb2NhbCBwcm9jZXNzCisgICAgICogbWVtb3J5IGZvciBmbGV4aWJsZSBhY2Nlc3MuIE9uIHN1Y2Nlc3MsIGl0IGZpbGxzIG91dCB8bGF5b3V0fCB3aXRoIHRoZSBwbGFuZSBzcGVjaWZpY2F0aW9ucworICAgICAqIGFuZCBmaWxscyB0aGUgfGFkZHJ8IGFycmF5IHdpdGggcG9pbnRlcnMgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHRvcC1sZWZ0IHBpeGVsIG9mIGVhY2gKKyAgICAgKiBwbGFuZSB1c2VkLiBPdGhlcndpc2UsIGl0IGxlYXZlcyB8bGF5b3V0fCBhbmQgfGFkZHJ8IHVudG91Y2hlZC4gfGZlbmNlfCB3aWxsIGNvbnRhaW4KKyAgICAgKiBhbiBhY3F1aXJlIHN5bmMgZmVuY2Ugb2JqZWN0LiBJZiBpdCBpcyBhbHJlYWR5IHNhZmUgdG8gYWNjZXNzIHRoZQorICAgICAqIGJ1ZmZlciBjb250ZW50cywgdGhlbiBpdCB3aWxsIGJlIGFuIGVtcHR5IChhbHJlYWR5IGZpcmVkKSBmZW5jZS4KKyAgICAgKgorICAgICAqIFNhZmUgcmVnaW9ucyBmb3IgdGhlIHBvaW50ZXIgYWRkcmVzc2VzIHJldHVybmVkIGNhbiBiZSBnb3R0ZW4gdmlhIEMyTGF5b3V0SW5mby5taW5PZmZzZXQoKS8KKyAgICAgKiBtYXhPZmZzZXQoKS4KKyAgICAgKgorICAgICAqIFxwYXJhbSByZWN0ICAgICAgICAgIHNlY3Rpb24gdG8gYmUgbWFwcGVkICh0aGlzIGRvZXMgbm90IGhhdmUgdG8gYmUgYWxpZ25lZCkKKyAgICAgKiBccGFyYW0gdXNhZ2UgICAgICAgICB0aGUgZGVzaXJlZCB1c2FnZS4gXHRvZG8gdGhpcyBtdXN0IGJlIGtTb2Z0d2FyZVJlYWQgYW5kL29yCisgICAgICogICAgICAgICAgICAgICAgICAgICAga1NvZnR3YXJlV3JpdGUuCisgICAgICogXHBhcmFtIGZlbmNlICAgICAgICAgYSBwb2ludGVyIHRvIGEgZmVuY2Ugb2JqZWN0IGlmIGFuIGFzeW5jIG1hcHBpbmcgaXMgcmVxdWVzdGVkLiBJZgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG5vdC1udWxsLCBhbmQgYWNxdWlyZSBmZW5jZSB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIHN1Y2Nlc3MsIG9yIGVtcHR5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgZmVuY2Ugb24gZmFpbHVyZS4gSWYgbnVsbCwgdGhlIG1hcHBpbmcgd2lsbCBiZSBzeW5jaHJvbm91cy4KKyAgICAgKiBccGFyYW0gbGF5b3V0ICAgICAgICBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIG1hcHBlZCBwbGFuZXMnIGRlc2NyaXB0b3JzIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzdG9yZWQuIE9uIGZhaWx1cmUsIG51bGxwdHIgd2lsbCBiZSBzdG9yZWQgaGVyZS4KKyAgICAgKiBccGFyYW0gYWRkciAgICAgICAgICBwb2ludGVyIHRvIGFuIGFycmF5IHdpdGggYXQgbGVhc3QgQzJQbGFuYXJMYXlvdXQ6Ok1BWF9OVU1fUExBTkVTCisgICAgICogICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMuIE9ubHkgbGF5b3V0Lm51bVBsYW5lcyBlbGVtZW50cyB3aWxsIGJlIG1vZGlmaWVkIG9uIHN1Y2Nlc3MuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byBtYXAgdGhlIHNlY3Rpb24KKyAgICAgKiBccmV0dmFsIEMyX0RVUExJQ0FURSB0aGVyZSBpcyBhbHJlYWR5IGEgbWFwcGVkIHJlZ2lvbiBhbmQgdGhpcyBhbGxvY2F0aW9uIGNhbm5vdCBzdXBwb3J0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgbXVsdGktbWFwcGluZyAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBvcGVyYXRpb24gdGltZWQgb3V0CisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgdGhlIG9wZXJhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHRoZSBwYXJhbWV0ZXJzIChyZWN0KSBhcmUgaW52YWxpZCBvciBvdXRzaWRlIHRoZSBhbGxvY2F0aW9uLCBvciB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB1c2FnZSBmbGFncyBhcmUgaW52YWxpZCAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIG9wZXJhdGlvbiBmcm9tIGNvbXBsZXRpbmcgKHVuZXhwZWN0ZWQpCisKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG1hcCgKKyAgICAgICAgICAgIEMyUmVjdCByZWN0LCBDMk1lbW9yeVVzYWdlIHVzYWdlLCBDMkZlbmNlICpmZW5jZSwKKyAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0ICpsYXlvdXQgLyogbm9ubnVsbCAqLywgdWludDhfdCAqKmFkZHIgLyogbm9ubnVsbCAqLykgPSAwOworCisgICAgLyoqCisgICAgICogVW5tYXBzIGEgc2VjdGlvbiBvZiBhbiBhbGxvY2F0aW9uIGF0IHxhZGRyfCB3aXRoIHxyZWN0fC4gVGhlc2UgbXVzdCBiZSBwYXJhbWV0ZXJzIHByZXZpb3VzbHkKKyAgICAgKiBwYXNzZWQgdG8gYW5kIHJldHVybmVkIGJ5IHxtYXB8OyBvdGhlcndpc2UsIHRoaXMgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCisgICAgICoKKyAgICAgKiBccGFyYW0gYWRkciAgICAgICAgICBwb2ludGVyIHRvIGFuIGFycmF5IHdpdGggYXQgbGVhc3QgQzJQbGFuYXJMYXlvdXQ6Ok1BWF9OVU1fUExBTkVTCisgICAgICogICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgY29udGFpbmluZyB0aGUgc3RhcnRpbmcgYWRkcmVzc2VzIG9mIHRoZSBtYXBwZWQgbGF5ZXJzCisgICAgICogXHBhcmFtIHJlY3QgICAgICAgICAgYm91bmRhcmllcyBvZiB0aGUgbWFwcGVkIHNlY3Rpb24KKyAgICAgKiBccGFyYW0gZmVuY2UgICAgICAgICBhIHBvaW50ZXIgdG8gYSBmZW5jZSBvYmplY3QgaWYgYW4gYXN5bmMgdW5tYXBwaW5nIGlzIHJlcXVlc3RlZC4gSWYKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBub3QtbnVsbCwgYSByZWxlYXNlIGZlbmNlIHdpbGwgYmUgc3RvcmVkIGhlcmUgb24gc3VjY2Vzcywgb3IgZW1wdHkgZmVuY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvbiBmYWlsdXJlLiBUaGlzIGZlbmNlIHNpZ25hbHMgd2hlbiB0aGUgb3JpZ2luYWwgYWxsb2NhdGlvbiBjb250YWlucworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFsbCBjaGFuZ2VzIHRoYXQgaGFwcGVuZWQgdG8gdGhlIG1hcHBlZCBzZWN0aW9uLiBJZiBudWxsLCB0aGUgdW5tYXBwaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzeW5jaHJvbm91cy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgb3BlcmF0aW9uIHRpbWVkIG91dAorICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIHRoZXJlIGlzIG5vIHN1Y2ggbWFwcGVkIHJlZ2lvbiAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIG9wZXJhdGlvbiBmcm9tIGNvbXBsZXRpbmcgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byB1bm1hcCB0aGUgc2VjdGlvbiAodW5leHBlY3RlZCAtIHN5c3RlbSkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHVubWFwKAorICAgICAgICAgICAgdWludDhfdCAqKmFkZHIgLyogbm9ubnVsbCAqLywgQzJSZWN0IHJlY3QsIEMyRmVuY2UgKmZlbmNlIC8qIG51bGxhYmxlICovKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhbGxvY2F0b3IgSUQgZm9yIHRoaXMgYWxsb2NhdGlvbi4gVGhpcyBpcyB1c2VmdWwgdG8gcHV0IHRoZSBoYW5kbGUgaW50byBjb250ZXh0LgorICAgICAqLworICAgIHZpcnR1YWwgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGlvbiBoYW5kbGUuCisgICAgICovCisgICAgdmlydHVhbCBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgdGhlIHNhbWUgYWxsb2NhdGlvbiBhcyB8b3RoZXJ8LgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBlcXVhbHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyR3JhcGhpY0FsbG9jYXRpb24+ICZvdGhlcikgY29uc3QgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgdXNpbmcgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3Q6Ol9DMlBsYW5hckNhcGFjaXR5QXNwZWN0OworICAgIHZpcnR1YWwgfkMyR3JhcGhpY0FsbG9jYXRpb24oKSA9IGRlZmF1bHQ7Cit9OworCitjbGFzcyBDMkdyYXBoaWNBbGxvY2F0aW9uOworCisvKioKKyAqIEEgMkQgYmxvY2suCisgKgorICogXG5vdGUgd2lkdGgoKS9oZWlnaHQoKSBpcyBub3QgbWVhbmluZ2Z1bCBmb3IgdXNlcnMgb2YgYmxvY2tzOyBpbnN0ZWFkLCBjcm9wKCkud2lkdGgoKSBhbmQKKyAqIGNyb3AoKS5oZWlnaHQoKSBpcyB0aGUgY2FwYWNpdHkgb2YgdGhlIHVzYWJsZSBwb3J0aW9uLiBVc2UgYW5kIGNyb3AoKSBpZiBhY2Nlc3NpbmcgdGhlIGJsb2NrCisgKiBkaXJlY3RseSB0aHJvdWdoIGl0cyBoYW5kbGUgdG8gcmVwcmVzZW50IHRoZSBhbGxvdHRlZCByZWdpb24gb2YgdGhlIHVuZGVybHlpbmcgYWxsb2NhdGlvbiB0byB0aGlzCisgKiBibG9jay4KKyAqLworY2xhc3MgQzJCbG9jazJEIDogcHVibGljIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgaGFuZGxlIGZvciB0aGlzIGFsbG9jYXRpb24uCisgICAgICoKKyAgICAgKiBcbm90ZSB0aGF0IHRoZSBibG9jayBhbmQgaXRzIGJsb2NrIHBvb2wgaGFzIHNoYXJlZCBvd25lcnNoaXAgb2YgdGhlIGhhbmRsZQorICAgICAqICAgICAgIGFuZCBpZiBhbGwgcmVmZXJlbmNlcyB0byB0aGUgYmxvY2sgYXJlIHJlbGVhc2VkLCB0aGUgdW5kZXJseWluZyBibG9jaworICAgICAqICAgICAgIGFsbG9jYXRpb24gbWF5IGdldCByZXVzZWQgZXZlbiBpZiBhIGNsaWVudCBrZWVwcyBhIGNsb25lIG9mIHRoaXMgaGFuZGxlLgorICAgICAqLworICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFsbG9jYXRvcidzIElEIHRoYXQgY3JlYXRlZCB0aGUgdW5kZXJseWluZyBhbGxvY2F0aW9uIGZvciB0aGlzIGJsb2NrLiBUaGlzCisgICAgICogcHJvdmlkZXMgdGhlIGNvbnRleHQgZm9yIHVuZGVyc3RhbmRpbmcgdGhlIGhhbmRsZS4KKyAgICAgKi8KKyAgICBDMkFsbG9jYXRvcjo6aWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgY2xhc3MgSW1wbDsKKyAgICBDMkJsb2NrMkQoc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgJnNlY3Rpb24pOworCisgICAgZnJpZW5kIHN0cnVjdCBfQzJCbG9ja0ZhY3Rvcnk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOworfTsKKworLyoqCisgKiBHcmFwaGljIHZpZXcgcHJvdmlkZXMgcmVhZCBvciByZWFkLXdyaXRlIGFjY2VzcyBmb3IgYSBncmFwaGljIGJsb2NrLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgY29waWFibGUuCisgKgorICogXG5vdGUgRHVlIHRvIHRoZSBzdWJzYW1wbGluZyBvZiBncmFwaGljIGJ1ZmZlcnMsIGEgcmVhZCB2aWV3IG11c3Qgc3RpbGwgY29udGFpbiBhIGNyb3AgcmVjdGFuZ2xlCisgKiB0byBlbnN1cmUgc3Vic2FtcGxpbmcgaXMgZm9sbG93ZWQuIFRoaXMgcmVzdWx0cyBpbiBuZWFybHkgaWRlbnRpY2FsIGludGVyZmFjZSBiZXR3ZWVuIHJlYWQgYW5kCisgKiB3cml0ZSB2aWV3cywgc28gQzJHcmFwaGljVmlldyBjYW4gZW5jb21wYXNzIGJvdGggb2YgdGhlbS4KKyAqLworY2xhc3MgQzJHcmFwaGljVmlldyA6IHB1YmxpYyBfQzJFZGl0YWJsZVBsYW5hclNlY3Rpb25Bc3BlY3QgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFxyZXR1cm4gYXJyYXkgb2YgcG9pbnRlcnMgKG9mIGxheW91dCgpLm51bVBsYW5lcyBlbGVtZW50cykgdG8gdGhlIHN0YXJ0IG9mIHRoZSBwbGFuZXMgb3IKKyAgICAgKiBudWxscHRyIG9uIGVycm9yLiBSZWdhcmRsZXNzIG9mIGNyb3AgcmVjdCwgdGhleSBhbHdheXMgcG9pbnQgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiBlYWNoCisgICAgICogcGxhbmUuIEFjY2VzcyBvdXRzaWRlIG9mIHRoZSBjcm9wIHJlY3QgcmVzdWx0cyBpbiBhbiB1bmRlZmluZWQgYmVoYXZpb3IuCisgICAgICovCisgICAgY29uc3QgdWludDhfdCAqY29uc3QgKmRhdGEoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFxyZXR1cm4gYXJyYXkgb2YgcG9pbnRlcnMgKG9mIGxheW91dCgpLm51bVBsYW5lcyBlbGVtZW50cykgdG8gdGhlIHN0YXJ0IG9mIHRoZSBwbGFuZXMgb3IKKyAgICAgKiBudWxscHRyIG9uIGVycm9yLiBSZWdhcmRsZXNzIG9mIGNyb3AgcmVjdCwgdGhleSBhbHdheXMgcG9pbnQgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiBlYWNoCisgICAgICogcGxhbmUuIEFjY2VzcyBvdXRzaWRlIG9mIHRoZSBjcm9wIHJlY3QgcmVzdWx0cyBpbiBhbiB1bmRlZmluZWQgYmVoYXZpb3IuCisgICAgICovCisgICAgdWludDhfdCAqY29uc3QgKmRhdGEoKTsKKworICAgIC8qKgorICAgICAqIFxyZXR1cm4gbGF5b3V0IG9mIHRoZSBncmFwaGljIGJsb2NrIHRvIGludGVycHJldCB0aGUgcmV0dXJuZWQgZGF0YS4KKyAgICAgKi8KKyAgICBjb25zdCBDMlBsYW5hckxheW91dCBsYXlvdXQoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzZWN0aW9uIG9mIHRoaXMgdmlldy4KKyAgICAgKgorICAgICAqIFxwYXJhbSByZWN0ICAgIHRoZSBkaW1lbnNpb24gb2YgdGhlIHNlY3Rpb24uIFxub3RlIFRoaXMgaXMgY2xhbXBlZCB0byB0aGUgY3JvcCBvZiB0aGlzIHZpZXcuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgcmVhZCB2aWV3IGNvbnRhaW5pbmcgdGhlIHJlcXVlc3RlZCBzZWN0aW9uIG9mIHRoaXMgdmlldworICAgICAqLworICAgIGNvbnN0IEMyR3JhcGhpY1ZpZXcgc3ViVmlldyhjb25zdCBDMlJlY3QgJnJlY3QpIGNvbnN0OworICAgIEMyR3JhcGhpY1ZpZXcgc3ViVmlldyhjb25zdCBDMlJlY3QgJnJlY3QpOworCisgICAgLyoqCisgICAgICogXHJldHVybiBlcnJvciBkdXJpbmcgdGhlIGNyZWF0aW9uL21hcHBpbmcgb2YgdGhpcyB2aWV3LgorICAgICAqLworICAgIGMyX3N0YXR1c190IGVycm9yKCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgICBjbGFzcyBJbXBsOworICAgIEMyR3JhcGhpY1ZpZXcoc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgJnNlY3Rpb24pOworICAgIGV4cGxpY2l0IEMyR3JhcGhpY1ZpZXcoYzJfc3RhdHVzX3QgZXJyb3IpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgX0MyQmxvY2tGYWN0b3J5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKK307CisKKy8qKgorICogQSBjb25zdGFudCAocmVhZC1vbmx5KSBncmFwaGljIGJsb2NrIChwb3J0aW9uIG9mIGFuIGFsbG9jYXRpb24pIHdpdGggYW4gYWNxdWlyZSBmZW5jZS4KKyAqIEJsb2NrcyBhcmUgdW5tYXBwZWQgd2hlbiBjcmVhdGVkLCBhbmQgY2FuIGJlIG1hcHBlZCBpbnRvIGEgcmVhZCB2aWV3IG9uIGRlbWFuZC4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIGNvcGlhYmxlIGFuZCBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgYWxsb2NhdGlvbiB0aGF0IGl0IGlzIGJhc2VkIG9uLgorICovCitjbGFzcyBDMkNvbnN0R3JhcGhpY0Jsb2NrIDogcHVibGljIEMyQmxvY2syRCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogTWFwcyB0aGlzIGJsb2NrIGludG8gbWVtb3J5IGFuZCByZXR1cm5zIGEgcmVhZCB2aWV3IGZvciBpdC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSByZWFkIHZpZXcgZm9yIHRoaXMgYmxvY2suCisgICAgICovCisgICAgQzJBY3F1aXJhYmxlPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IG1hcCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHNlY3Rpb24gb2YgdGhpcyBibG9jay4KKyAgICAgKgorICAgICAqIFxwYXJhbSByZWN0ICAgIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgc2VjdGlvbi4gXG5vdGUgVGhpcyBpcyBjbGFtcGVkIHRvIHRoZSBjcm9wIHJlY3RhbmdsZSBvZgorICAgICAqICAgICAgICAgICAgICB0aGlzIGJsb2NrLgorICAgICAqCisgICAgICogXHJldHVybiBhIGNvbnN0YW50IGdyYXBoaWMgYmxvY2sgY29udGFpbmluZyBhIHBvcnRpb24gb2YgdGhpcyBibG9jaworICAgICAqLworICAgIEMyQ29uc3RHcmFwaGljQmxvY2sgc3ViQmxvY2soY29uc3QgQzJSZWN0ICZyZWN0KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFjcXVpcmUgZmVuY2UgZm9yIHRoaXMgYmxvY2suCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgZmVuY2UgdGhhdCBtdXN0IGJlIHdhaXRlZCBvbiBiZWZvcmUgcmVhZGluZyB0aGUgYmxvY2suCisgICAgICovCisgICAgQzJGZW5jZSBmZW5jZSgpIGNvbnN0IHsgcmV0dXJuIG1GZW5jZTsgfQorCitwcm90ZWN0ZWQ6CisgICAgQzJDb25zdEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCBjb25zdCBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0ICZzZWN0aW9uLCBDMkZlbmNlIGZlbmNlKTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IF9DMkJsb2NrRmFjdG9yeTsKKyAgICBDMkZlbmNlIG1GZW5jZTsKK307CisKKy8qKgorICogR3JhcGhpYyBibG9jayBpcyBhIHdyaXRlYWJsZSAyRCBibG9jay4gT25jZSB3cml0dGVuLCBpdCBjYW4gYmUgc2hhcmVkIGluIHdob2xlIG9yIGluIHBhcnQgd2l0aAorICogY29uc3VtZXJzL3JlYWRlcnMgYXMgcmVhZC1vbmx5IGNvbnN0IGdyYXBoaWMgYmxvY2suCisgKi8KK2NsYXNzIEMyR3JhcGhpY0Jsb2NrIDogcHVibGljIEMyQmxvY2syRCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogTWFwcyB0aGlzIGJsb2NrIGludG8gbWVtb3J5IGFuZCByZXR1cm5zIGEgd3JpdGUgdmlldyBmb3IgaXQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgd3JpdGUgdmlldyBmb3IgdGhpcyBibG9jay4KKyAgICAgKi8KKyAgICBDMkFjcXVpcmFibGU8QzJHcmFwaGljVmlldz4gbWFwKCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgcmVhZC1vbmx5IGNvbnN0IGxpbmVhciBibG9jayBmb3IgYSBwb3J0aW9uIG9mIHRoaXMgYmxvY2s7IG9wdGlvbmFsbHkgcHJvdGVjdGVkCisgICAgICogYnkgYW4gYWNxdWlyZSBmZW5jZS4gVGhlcmUgYXJlIHR3byB3YXlzIHRvIHVzZSB0aGlzOgorICAgICAqCisgICAgICogMSkgc2hhcmUgcmVhZHkgYmxvY2sgYWZ0ZXIgd3JpdGluZyBkYXRhIGludG8gdGhlIGJsb2NrLiBJbiB0aGlzIGNhc2Ugbm8gZmVuY2Ugc2hhbGwgYmUKKyAgICAgKiAgICBzdXBwbGllZCwgYW5kIHRoZSBibG9jayBzaGFsbCBub3QgYmUgbW9kaWZpZWQgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZC4KKyAgICAgKiAyKSBzaGFyZSBibG9jayBtZXRhZGF0YSBiZWZvcmUgYWN0dWFsbHkgKGZpbmlzaGluZykgd3JpdGluZyB0aGUgZGF0YSBpbnRvIHRoZSBibG9jay4gSW4KKyAgICAgKiAgICB0aGlzIGNhc2UgYSBmZW5jZSBtdXN0IGJlIHN1cHBsaWVkIHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgZGF0YSBpcyB3cml0dGVuLgorICAgICAqICAgIFRoZSBibG9jayBzaGFsbCBiZSBtb2RpZmllZCBvbmx5IHVudGlsIGZpcmluZyB0aGUgZXZlbnQgZm9yIHRoZSBmZW5jZS4KKyAgICAgKi8KKyAgICBDMkNvbnN0R3JhcGhpY0Jsb2NrIHNoYXJlKGNvbnN0IEMyUmVjdCAmY3JvcCwgQzJGZW5jZSBmZW5jZSk7CisKK3Byb3RlY3RlZDoKKyAgICBDMkdyYXBoaWNCbG9jayhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCAmc2VjdGlvbik7CisKKyAgICBmcmllbmQgc3RydWN0IF9DMkJsb2NrRmFjdG9yeTsKK307CisKKy8vLyBAfQorCisvLy8gXGRlZmdyb3VwIGJ1ZmZlcl9vbmogQnVmZmVyIG9iamVjdHMKKy8vLyBAeworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBCVUZGRVJTCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8vIFx0b2RvOiBEbyB3ZSBzdGlsbCBuZWVkIHRoaXM/CisvLy8KKy8vIFRoZXJlIGFyZSAyIGtpbmRzIG9mIGJ1ZmZlcnM6IGxpbmVhciBvciBncmFwaGljLiBMaW5lYXIgYnVmZmVycyBjYW4gY29udGFpbiBhIHNpbmdsZSBibG9jaywgb3IKKy8vIGEgbGlzdCBvZiBibG9ja3MgKExJTkVBUl9DSFVOS1MpLiBTdXBwb3J0IGZvciBsaXN0IG9mIGJsb2NrcyBpcyBvcHRpb25hbCwgYW5kIGNhbiBhbGxvdyBjb25zdW1pbmcKKy8vIGRhdGEgZnJvbSBjaXJjdWxhciBidWZmZXJzIG9yIHNjYXR0ZXJlZCBkYXRhIHNvdXJjZXMgd2l0aG91dCBleHRyYSBtZW1jcHkuIEN1cnJlbnRseSwgbGlzdCBvZgorLy8gZ3JhcGhpYyBibG9ja3MgaXMgbm90IHN1cHBvcnRlZC4KKworY2xhc3MgQzJMaW5lYXJCdWZmZXI7ICAgLy8gcmVhZC13cml0ZSBidWZmZXIKK2NsYXNzIEMyR3JhcGhpY0J1ZmZlcjsgIC8vIHJlYWQtd3JpdGUgYnVmZmVyCitjbGFzcyBDMkxpbmVhckNodW5rc0J1ZmZlcjsKKworLyoqCisgKiBDMkJ1ZmZlckRhdGE6IHRoZSBtYWluLCBub24tbWV0YSBkYXRhIG9mIGEgYnVmZmVyLiBBIGJ1ZmZlciBjYW4gY29udGFpbiBlaXRoZXIgbGluZWFyIGJsb2NrcworICogb3IgZ3JhcGhpYyBibG9ja3MsIGFuZCBjYW4gY29udGFpbiBlaXRoZXIgYSBzaW5nbGUgYmxvY2sgb3IgbXVsdGlwbGUgYmxvY2tzLiBUaGlzIGlzIGRldGVybWluZWQKKyAqIGJ5IGl0cyB0eXBlLgorICovCitjbGFzcyBDMkJ1ZmZlckRhdGEgeworcHVibGljOgorICAgIC8qKgorICAgICAqICBUaGUgdHlwZSBvZiBidWZmZXIgZGF0YS4KKyAgICAgKi8KKyAgICBlbnVtIHR5cGVfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgSU5WQUxJRCwgICAgICAgICAgICAvLy88IGludmFsaWQgYnVmZmVyIHR5cGUuIERvIG5vdCB1c2UuCisgICAgICAgIExJTkVBUiwgICAgICAgICAgICAgLy8vPCB0aGUgYnVmZmVyIGNvbnRhaW5zIGEgc2luZ2xlIGxpbmVhciBibG9jaworICAgICAgICBMSU5FQVJfQ0hVTktTLCAgICAgIC8vLzwgdGhlIGJ1ZmZlciBjb250YWlucyBvbmUgb3IgbW9yZSBsaW5lYXIgYmxvY2tzCisgICAgICAgIEdSQVBISUMsICAgICAgICAgICAgLy8vPCB0aGUgYnVmZmVyIGNvbnRhaW5zIGEgc2luZ2xlIGdyYXBoaWMgYmxvY2sKKyAgICAgICAgR1JBUEhJQ19DSFVOS1MsICAgICAvLy88IHRoZSBidWZmZXIgY29udGFpbnMgb25lIG9mIG1vcmUgZ3JhcGhpYyBibG9ja3MKKyAgICB9OworICAgIHR5cGVkZWYgdHlwZV90IFR5cGU7IC8vIGRlcHJlY2F0ZWQKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHR5cGUgb2YgdGhpcyBidWZmZXIgKGRhdGEpLgorICAgICAqIFxyZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBidWZmZXIgZGF0YS4KKyAgICAgKi8KKyAgICB0eXBlX3QgdHlwZSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbGluZWFyIGJsb2NrcyBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBccmV0dXJuIGEgY29uc3RhbnQgbGlzdCBvZiBjb25zdCBsaW5lYXIgYmxvY2tzIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIFxyZXR2YWwgZW1wdHkgbGlzdCBpZiB0aGlzIGJ1ZmZlciBkb2VzIG5vdCBjb250YWluIGxpbmVhciBibG9jayhzKS4KKyAgICAgKi8KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+IGxpbmVhckJsb2NrcygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZ3JhcGhpYyBibG9ja3Mgb2YgdGhpcyBidWZmZXIuCisgICAgICogXHJldHVybiBhIGNvbnN0YW50IGxpc3Qgb2YgY29uc3QgZ3JhcGhpYyBibG9ja3Mgb2YgdGhpcyBidWZmZXIuCisgICAgICogXHJldHZhbCBlbXB0eSBsaXN0IGlmIHRoaXMgYnVmZmVyIGRvZXMgbm90IGNvbnRhaW4gZ3JhcGhpYyBibG9jayhzKS4KKyAgICAgKi8KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiBncmFwaGljQmxvY2tzKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBubyBwdWJsaWMgY29uc3RydWN0b3IKKyAgICBleHBsaWNpdCBDMkJ1ZmZlckRhdGEoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKTsKKyAgICBleHBsaWNpdCBDMkJ1ZmZlckRhdGEoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gJmJsb2Nrcyk7Cit9OworCisvKioKKyAqIEMyQnVmZmVyOiBidWZmZXIgYmFzZSBjbGFzcy4gVGhlc2UgYXJlIGFsd2F5cyB1c2VkIGFzIHNoYXJlZF9wdHJzLiBUaG91Z2ggdGhlIHVuZGVybHlpbmcgYnVmZmVyCisgKiBvYmplY3RzIChuYXRpdmUgYnVmZmVycywgaW9uIGJ1ZmZlcnMsIG9yIGRtYWJ1ZnMpIGFyZSByZWZlcmVuY2UtY291bnRlZCBieSB0aGUgc3lzdGVtLAorICogQzJCdWZmZXJzIGhvbGQgb25seSBhIHNpbmdsZSByZWZlcmVuY2UuCisgKgorICogVGhlc2Ugb2JqZWN0cyBjYW5ub3QgYmUgdXNlZCBvbiB0aGUgc3RhY2suCisgKi8KK2NsYXNzIEMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBidWZmZXIncyBkYXRhLgorICAgICAqCisgICAgICogXHJldHVybiB0aGUgYnVmZmVyJ3MgZGF0YS4KKyAgICAgKi8KKyAgICBjb25zdCBDMkJ1ZmZlckRhdGEgZGF0YSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogVGhlc2Ugd2lsbCBzdGlsbCB3b3JrIGlmIHVzZWQgaW4gb25EZWF0aE5vdGlmeS4KKyAgICAgKi8KKyNpZiAwCisgICAgaW5saW5lIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJ1ZmZlcj4gYXNMaW5lYXJCdWZmZXIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVHlwZSA9PSBMSU5FQVIgPyBzdGQ6OnNoYXJlZF9wdHI6OnJlaW50ZXJwcmV0X2Nhc3Q8QzJMaW5lYXJCdWZmZXI+KHRoaXMpIDogbnVsbHB0cjsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gYXNHcmFwaGljQnVmZmVyKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVR5cGUgPT0gR1JBUEhJQyA/IHN0ZDo6c2hhcmVkX3B0cjo6cmVpbnRlcnByZXRfY2FzdDxDMkdyYXBoaWNCdWZmZXI+KHRoaXMpIDogbnVsbHB0cjsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RkOjpzaGFyZWRfcHRyPEMyQ2lyY3VsYXJCdWZmZXI+IGFzQ2lyY3VsYXJCdWZmZXIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVHlwZSA9PSBDSVJDVUxBUiA/IHN0ZDo6c2hhcmVkX3B0cjo6cmVpbnRlcnByZXRfY2FzdDxDMkNpcmN1bGFyQnVmZmVyPih0aGlzKSA6IG51bGxwdHI7CisgICAgfQorI2VuZGlmCisKKyAgICAvLy9AbmFtZSBQcmUtZGVzdHJveSBub3RpZmljYXRpb24gaGFuZGxpbmcKKyAgICAvLy9AeworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbiBqdXN0IHByaW9yIHRvIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICB0eXBlZGVmIHZvaWQgKCpPbkRlc3Ryb3lOb3RpZnkpIChjb25zdCBDMkJ1ZmZlciAqYnVmLCB2b2lkICphcmcpOworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGZvciBhIHByZS1kZXN0cm95IG5vdGlmaWNhdGlvbi4gVGhpcyBpcyBjYWxsZWQganVzdCBwcmlvciB0byB0aGUgZGVzdHJ1Y3Rpb24gb2YKKyAgICAgKiB0aGlzIGJ1ZmZlciAod2hlbiB0aGlzIGJ1ZmZlciBpcyBubyBsb25nZXIgdmFsaWQuKQorICAgICAqCisgICAgICogXHBhcmFtIG9uRGVzdHJveU5vdGlmeSAgIHRoZSBub3RpZmljYXRpb24gY2FsbGJhY2sKKyAgICAgKiBccGFyYW0gYXJnICAgICAgICAgICAgICAgYW4gYXJiaXRyYXJ5IHBhcmFtZXRlciBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgcmVnaXN0cmF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICAgICAqIFxyZXR2YWwgQzJfRFVQTElDQVRFIGEgbm90aWZpY2F0aW9uIHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHRoaXMgY2FsbGJhY2sgYW5kIGFyZ3VtZW50CisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gcmVnaXN0ZXIgZm9yIHRoaXMgY2FsbGJhY2sKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBhbiB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgcmVnaXN0cmF0aW9uICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIGMyX3N0YXR1c190IHJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KE9uRGVzdHJveU5vdGlmeSBvbkRlc3Ryb3lOb3RpZnksIHZvaWQgKmFyZyA9IG51bGxwdHIpOworCisgICAgLyoqCisgICAgICogVW5yZWdpc3RlcnMgYSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgcHJlLWRlc3Ryb3kgbm90aWZpY2F0aW9uLgorICAgICAqCisgICAgICogXHBhcmFtIG9uRGVzdHJveU5vdGlmeSAgIHRoZSBub3RpZmljYXRpb24gY2FsbGJhY2sKKyAgICAgKiBccGFyYW0gYXJnICAgICAgICAgICAgICAgYW4gYXJiaXRyYXJ5IHBhcmFtZXRlciBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgdW5yZWdpc3RyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgdGhlIG5vdGlmaWNhdGlvbiB3YXMgbm90IGZvdW5kCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgYW4gdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHJlZ2lzdHJhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCB1bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KE9uRGVzdHJveU5vdGlmeSBvbkRlc3Ryb3lOb3RpZnksIHZvaWQgKmFyZyA9IG51bGxwdHIpOworCisgICAgLy8vQH0KKworICAgIHZpcnR1YWwgfkMyQnVmZmVyKCkgPSBkZWZhdWx0OworCisgICAgLy8vQG5hbWUgQnVmZmVyLXNwZWNpZmljIGFyYml0cmFyeSBtZXRhZGF0YSBoYW5kbGluZworICAgIC8vL0B7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSBjb25zdGFudCBsaXN0IG9mIGluZm8gb2JqZWN0cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBidWZmZXIuCisgICAgICovCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4+IGluZm8oKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEF0dGFjaGVzIChvciB1cGRhdGVzKSBhbiAoZXhpc3RpbmcpIG1ldGFkYXRhIGZvciB0aGlzIGJ1ZmZlci4KKyAgICAgKiBJZiB0aGUgbWV0YWRhdGEgaXMgc3RyZWFtIHNwZWNpZmljLCB0aGUgc3RyZWFtIGluZm9ybWF0aW9uIHdpbGwgYmUgcmVzZXQuCisgICAgICoKKyAgICAgKiBccGFyYW0gaW5mbyBNZXRhZGF0YSB0byB1cGRhdGUKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBtZXRhZGF0YSB3YXMgc3VjY2Vzc2Z1bGx5IGF0dGFjaGVkL3VwZGF0ZWQuCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gYXR0YWNoIHRoZSBtZXRhZGF0YSAodGhpcyByZXR1cm4gdmFsdWUgaXMgbm90CisgICAgICogICAgICAgICAgICAgICAgICAgICAgdXNlZCBpZiB0aGUgc2FtZSBraW5kIG9mIG1ldGFkYXRhIGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gdGhlIGJ1ZmZlcikuCisgICAgICovCisgICAgYzJfc3RhdHVzX3Qgc2V0SW5mbyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvPiAmaW5mbyk7CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGhlcmUgaXMgYSBjZXJ0YWluIHR5cGUgb2YgbWV0YWRhdGEgYXR0YWNoZWQgdG8gdGhpcyBidWZmZXIuCisgICAgICoKKyAgICAgKiBccGFyYW0gaW5kZXggdGhlIHBhcmFtZXRlciB0eXBlIG9mIHRoZSBtZXRhZGF0YQorICAgICAqCisgICAgICogXHJldHVybiB0cnVlIGlmZiB0aGVyZSBpcyBhIG1ldGFkYXRhIHdpdGggdGhlIHBhcmFtZXRlciB0eXBlIGF0dGFjaGVkIHRvIHRoaXMgYnVmZmVyLgorICAgICAqLworICAgIGJvb2wgaGFzSW5mbyhDMlBhcmFtOjpUeXBlIGluZGV4KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0aGVyZSBpcyBhIGNlcnRhaW4gdHlwZSBvZiBtZXRhZGF0YSBhdHRhY2hlZCB0byB0aGlzIGJ1ZmZlciwgYW5kIHJldHVybnMgYQorICAgICAqIHNoYXJlZCBwb2ludGVyIHRvIGl0IGlmIHRoZXJlIGlzLiBSZXR1cm5zIGFuIGVtcHR5IHNoYXJlZCBwb2ludGVyIG9iamVjdCAobnVsbHB0cikgaWYgdGhlcmUKKyAgICAgKiBpcyBub3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gaW5kZXggdGhlIHBhcmFtZXRlciB0eXBlIG9mIHRoZSBtZXRhZGF0YQorICAgICAqCisgICAgICogXHJldHVybiBzaGFyZWQgcG9pbnRlciB0byB0aGUgbWV0YWRhdGEuCisgICAgICovCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4gZ2V0SW5mbyhDMlBhcmFtOjpUeXBlIGluZGV4KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYSBtZXRhZGF0YSBmcm9tIHRoZSBidWZmZXIuCisgICAgICovCisgICAgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gcmVtb3ZlSW5mbyhDMlBhcmFtOjpUeXBlIGluZGV4KTsKKyAgICAvLy9AfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBjb250YWluaW5nIGEgc2luZ2xlIGxpbmVhciBibG9jay4KKyAgICAgKgorICAgICAqIFxwYXJhbSBibG9jayB0aGUgY29udGVudCBvZiB0aGUgYnVmZmVyLgorICAgICAqCisgICAgICogXHJldHVybiBzaGFyZWQgcG9pbnRlciB0byB0aGUgY3JlYXRlZCBidWZmZXIuCisgICAgICovCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gQ3JlYXRlTGluZWFyQnVmZmVyKGNvbnN0IEMyQ29uc3RMaW5lYXJCbG9jayAmYmxvY2spOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBjb250YWluaW5nIGEgc2luZ2xlIGdyYXBoaWMgYmxvY2suCisgICAgICoKKyAgICAgKiBccGFyYW0gYmxvY2sgdGhlIGNvbnRlbnQgb2YgdGhlIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIGNyZWF0ZWQgYnVmZmVyLgorICAgICAqLworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IENyZWF0ZUdyYXBoaWNCdWZmZXIoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayAmYmxvY2spOworCisKKworcHJvdGVjdGVkOgorICAgIC8vIG5vIHB1YmxpYyBjb25zdHJ1Y3RvcgorICAgIGV4cGxpY2l0IEMyQnVmZmVyKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gJmJsb2Nrcyk7CisgICAgZXhwbGljaXQgQzJCdWZmZXIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gJmJsb2Nrcyk7CisKK3ByaXZhdGU6CisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7CisvLyAgICBUeXBlIF9tVHlwZTsKK307CisKKy8qKgorICogQW4gZXh0ZW5zaW9uIG9mIEMySW5mbyBvYmplY3RzIHRoYXQgY2FuIGNvbnRhaW4gYXJiaXRyYXJ5IGJ1ZmZlciBkYXRhLgorICoKKyAqIFxub3RlIFRoaXMgb2JqZWN0IGlzIG5vdCBkZXNjcmliYWJsZSBhbmQgY29udGFpbnMgb3BhcXVlIGRhdGEuCisgKi8KK2NsYXNzIEMySW5mb0J1ZmZlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogR2V0cyB0aGUgaW5kZXggb2YgdGhpcyBpbmZvIG9iamVjdC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdGhlIHBhcmFtZXRlciBpbmRleC4KKyAgICAgKi8KKyAgICBjb25zdCBDMlBhcmFtOjpJbmRleCBpbmRleCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYnVmZmVyJ3MgZGF0YS4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdGhlIGJ1ZmZlcidzIGRhdGEuCisgICAgICovCisgICAgY29uc3QgQzJCdWZmZXJEYXRhIGRhdGEoKSBjb25zdDsKK307CisKKy8vLyBAfQorCisvLy8gXGNvbmQgSU5URVJOQUwKKworLy8vIFx0b2RvIFRoZXNlIGFyZSBubyBsb25nZXIgdXNlZAorCisvLy8gXGFkZHRvZ3JvdXAgbGluZWFyCisvLy8gQHsKKworLyoqIFxkZXByZWNhdGVkICovCitjbGFzcyBDMkxpbmVhckJ1ZmZlcgorICAgIDogcHVibGljIEMyQnVmZmVyLCBwdWJsaWMgX0MyTGluZWFyUmFuZ2VBc3BlY3QsCisgICAgICBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxDMkxpbmVhckJ1ZmZlcj4geworcHVibGljOgorICAgIC8qKiBcdG9kbyB3aGF0IGlzIHRoaXM/ICovCisgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgaW5saW5lIEMyTGluZWFyQnVmZmVyKGNvbnN0IEMyQ29uc3RMaW5lYXJCbG9jayAmYmxvY2spOworCitwcml2YXRlOgorICAgIGNsYXNzIEltcGw7CisgICAgSW1wbCAqbUltcGw7Cit9OworCitjbGFzcyBDMlJlYWRDdXJzb3I7CisKK2NsYXNzIEMyV3JpdGVDdXJzb3IgeworcHVibGljOgorICAgIHVpbnQzMl90IHJlbWFpbmluZygpIGNvbnN0OyAvLyByZW1haW5pbmcgZGF0YSB0byBiZSByZWFkCisgICAgdm9pZCBjb21taXQoKTsgLy8gY29tbWl0cyB0aGUgY3VycmVudCBwb3NpdGlvbi4gZGlzY2FyZCBkYXRhIGJlZm9yZSBjdXJyZW50IHBvc2l0aW9uCisgICAgdm9pZCByZXNldCgpIGNvbnN0OyAgLy8gcmVzZXRzIHBvc2l0aW9uIHRvIHRoZSBsYXN0IGNvbW1pdHRlZCBwb3NpdGlvbgorICAgIC8vIHNsaWNlcyBvZmYgYXQgbW9zdCB8c2l6ZXwgYnl0ZXMsIGFuZCBtb3ZlcyBjdXJzb3IgYWhlYWQgYnkgdGhlIG51bWJlciBvZiBieXRlcworICAgIC8vIHNsaWNlZCBvZmYuCisgICAgQzJSZWFkQ3Vyc29yIHNsaWNlKHVpbnQzMl90IHNpemUpIGNvbnN0OworICAgIC8vIHNsaWNlcyBvZmYgYXQgbW9zdCB8c2l6ZXwgYnl0ZXMsIGFuZCBtb3ZlcyBjdXJzb3IgYWhlYWQgYnkgdGhlIG51bWJlciBvZiBieXRlcworICAgIC8vIHNsaWNlZCBvZmYuCisgICAgQzJXcml0ZUN1cnNvciByZXNlcnZlKHVpbnQzMl90IHNpemUpOworICAgIC8vIGJvb2wgcmVhZChUJik7CisgICAgLy8gYm9vbCB3cml0ZShUJik7CisgICAgQzJGZW5jZSB3YWl0Rm9yU3BhY2UodWludDMyX3Qgc2l6ZSk7Cit9OworCisvLy8gQH0KKworLy8vIFxhZGR0b2dyb3VwIGdyYXBoaWMKKy8vLyBAeworCitzdHJ1Y3QgQzJDb2xvclNwYWNlIHsKKy8vcHVibGljOgorICAgIGVudW0gU3RhbmRhcmQgeworICAgICAgICBCVDYwMSwKKyAgICAgICAgQlQ3MDksCisgICAgICAgIEJUMjAyMCwKKyAgICAgICAgLy8gVE9ETworICAgIH07CisKKyAgICBlbnVtIFJhbmdlIHsKKyAgICAgICAgTElNSVRFRCwKKyAgICAgICAgRlVMTCwKKyAgICAgICAgLy8gVE9ETworICAgIH07CisKKyAgICBlbnVtIFRyYW5zZmVyRnVuY3Rpb24geworICAgICAgICBCVDcwOVRyYW5zZmVyLAorICAgICAgICBCVDIwMjBUcmFuc2ZlciwKKyAgICAgICAgSHlicmlkTG9nR2FtbWEyLAorICAgICAgICBIeWJyaWRMb2dHYW1tYTQsCisgICAgICAgIC8vIFRPRE8KKyAgICB9OworfTsKKworLyoqIFxkZXByZWNhdGVkICovCitjbGFzcyBDMkdyYXBoaWNCdWZmZXIgOiBwdWJsaWMgQzJCdWZmZXIgeworcHVibGljOgorICAgIC8vIGNvbnN0YW50IGF0dHJpYnV0ZXMKKyAgICBpbmxpbmUgdWludDMyX3Qgd2lkdGgoKSBjb25zdCAgeyByZXR1cm4gbVdpZHRoOyB9CisgICAgaW5saW5lIHVpbnQzMl90IGhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1IZWlnaHQ7IH0KKyAgICBpbmxpbmUgdWludDMyX3QgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUZvcm1hdDsgfQorICAgIGlubGluZSBjb25zdCBDMk1lbW9yeVVzYWdlIHVzYWdlKCkgY29uc3QgeyByZXR1cm4gbVVzYWdlOyB9CisKKyAgICAvLyBtb2RpZmlhYmxlIGF0dHJpYnV0ZXMKKworCisgICAgdmlydHVhbCBjb25zdCBDMkNvbG9yU3BhY2UgY29sb3JTcGFjZSgpIGNvbnN0ID0gMDsKKyAgICAvLyBiZXN0IGVmZm9ydAorICAgIHZpcnR1YWwgdm9pZCBzZXRDb2xvclNwYWNlX2JlKGNvbnN0IEMyQ29sb3JTcGFjZSAmY29sb3JTcGFjZSkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBzZXRDb2xvclNwYWNlKGNvbnN0IEMyQ29sb3JTcGFjZSAmY29sb3JTcGFjZSkgPSAwOworCisgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7CisgICAgdWludDMyX3QgbUZvcm1hdDsKKyAgICBDMk1lbW9yeVVzYWdlIG1Vc2FnZTsKKworICAgIGNsYXNzIEltcGw7CisgICAgSW1wbCAqbUltcGw7Cit9OworCisvLy8gQH0KKworLy8vIFxlbmRjb25kCisKKy8vLyBAfQorCisjZW5kaWYgIC8vIEMyQlVGRkVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQnVmZmVyQmFzZS5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkJ1ZmZlckJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmQ0OGYwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkJ1ZmZlckJhc2UuaApAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMkJVRkZFUl9CQVNFX0hfCisjZGVmaW5lIEMyQlVGRkVSX0JBU0VfSF8KKworLy8vIFxkZWZncm91cCBhbGxvY2F0b3IgQWxsb2NhdGlvbiBhbmQgbWVtb3J5IHBsYWNlbWVudAorLy8vIEB7CisKKy8qKgorICogQnVmZmVyL21lbW9yeSB1c2FnZSBiaXRzLiBUaGVzZSBzaGFsbCBiZSB1c2VkIGJ5IHRoZSBhbGxvY2F0b3JzIHRvIHNlbGVjdCBvcHRpbWFsIG1lbW9yeSB0eXBlLworICogcG9vbCBhbmQgYnVmZmVyIGxheW91dC4gVXNhZ2UgYml0cyBhcmUgY29uY2VwdHVhbGx5IHNlcGFyYXRlZCBpbnRvIHJlYWQgYW5kIHdyaXRlIHVzYWdlLCB3aGlsZQorICogdGhlIGJ1ZmZlciB1c2UgbGlmZS1jeWNsZSBpcyBzZXBhcmF0ZWQgaW50byBwcm9kdWNlcnMgKHdyaXRlcnMpIGFuZCBjb25zdW1lcnMgKHJlYWRlcnMpLgorICogVGhlc2UgdHdvIGNvbmNlcHRzIGFyZSByZWxhdGVkIGJ1dCBub3QgZXF1aXZhbGVudDogY29uc3VtZXJzIG1heSBvbmx5IHJlYWQgYnVmZmVycyBhbmQgb25seQorICogcHJvZHVjZXJzIG1heSB3cml0ZSB0byBidWZmZXJzOyBub3RlLCBob3dldmVyLCB0aGF0IGJ1ZmZlciBwcm9kdWNlcnMgbWF5IGFsc28gd2FudCBvciBuZWVkIHRvCisgKiByZWFkIHRoZSBidWZmZXJzLgorICoKKyAqIFJlYWQgYW5kIHdyaXRlIGJ1ZmZlciB1c2FnZSBiaXRzIHNoYWxsIGJlIG9yLWVkIHRvIGFycml2ZSBhdCB0aGUgZnVsbCBidWZmZXIgdXNhZ2UuIEFkbWl0dGVkbHksCisgKiB0aGlzIGRvZXMgbm90IGFjY291bnQgZm9yIHRoZSBhbW91bnQgb2YgcmVhZGluZyBhbmQgd3JpdGluZyAoZS5nLiBhIGJ1ZmZlciBtYXkgaGF2ZSBvbmUgb3IgbW9yZQorICogcmVhZGVycyk7IGhvd2V2ZXIsIHRoZSBwcm9wZXIgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIHByb3Blcmx5IHdlaWdoIHRoZSB2YXJpb3VzIHVzYWdlcyB3b3VsZCBiZQorICogdGhlIGFtb3VudCBvZiBkYXRhIHJlYWQvd3JpdHRlbiBmb3IgZWFjaCB1c2FnZSB0eXBlLiBUaGlzIHdvdWxkIHJlc3VsdCBpbiBhbiBpbnRlZ2VyIGFycmF5IG9mCisgKiBzaXplIDY0IChvciB0aGUgbnVtYmVyIG9mIGRpc3RpbmN0IHVzYWdlcykgZm9yIG1lbW9yeSB1c2FnZSwgYW5kIGxpa2VseSBzdWNoIGRldGFpbGVkIGluZm9ybWF0aW9uCisgKiB3b3VsZCBub3QgYWx3YXlzIGJlIGF2YWlsYWJsZS4KKyAqCisgKiBUaGF0IHBsYXRmb3JtLWFnbm9zdGljIENvZGVjIDIuMCBBUEkgb25seSBkZWZpbmVzIHRoZSBiYXJlIG1pbmltdW0gdXNhZ2VzLiBQbGF0Zm9ybXMgc2hhbGwgZGVmaW5lCisgKiB1c2FnZSBiaXRzIHRoYXQgYXJlIGFwcHJvcHJpYXRlIGZvciB0aGUgcGxhdGZvcm0uCisgKi8KK3N0cnVjdCBDMk1lbW9yeVVzYWdlIHsKKy8vIHB1YmxpYzoKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgcmVhZCB1c2FnZS4KKyAgICAgKi8KKyAgICBlbnVtIHJlYWRfdCA6IHVpbnQ2NF90IHsKKyAgICAgICAgLyoqIEJ1ZmZlciBpcyByZWFkIGJ5IHRoZSBDUFUuICovCisgICAgICAgIENQVV9SRUFEICAgICAgICA9IDEgPDwgMCwKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1ZmZlciBzaGFsbCBvbmx5IGJlIHJlYWQgYnkgdHJ1c3RlZCBoYXJkd2FyZS4gVGhlIGRlZmluaXRpb24gb2YgdHJ1c3RlZCBoYXJkd2FyZSBpcworICAgICAgICAgKiBwbGF0Zm9ybSBzcGVjaWZpYywgYnV0IHRoaXMgZmxhZyBpcyByZXNlcnZlZCB0byBwcmV2ZW50IG1hcHBpbmcgdGhpcyBibG9jayBpbnRvIENQVQorICAgICAgICAgKiByZWFkYWJsZSBtZW1vcnkgcmVzdWx0aW5nIGluIGJ1cyBmYXVsdC4gVGhpcyBmbGFnIGNhbiBiZSB1c2VkIHdoZW4gYnVmZmVyIGFjY2VzcyBtdXN0IGJlCisgICAgICAgICAqIHByb3RlY3RlZC4KKyAgICAgICAgICovCisgICAgICAgIFJFQURfUFJPVEVDVEVEICA9IDEgPDwgMSwKKyAgICB9OworCisgICAgLyoqCisgICAgICogQnVmZmVyIHdyaXRlIHVzYWdlLgorICAgICAqLworICAgIGVudW0gd3JpdGVfdCA6IHVpbnQ2NF90IHsKKyAgICAgICAgLyoqIEJ1ZmZlciBpcyB3cml0dGVkIHRvIGJ5IHRoZSBDUFUuICovCisgICAgICAgIENQVV9XUklURSAgICAgICAgPSAxIDw8IDIsCisgICAgICAgIC8qKgorICAgICAgICAgKiBCdWZmZXIgc2hhbGwgb25seSBiZSB3cml0dGVuIHRvIGJ5IHRydXN0ZWQgaGFyZHdhcmUuIFRoZSBkZWZpbml0aW9uIG9mIHRydXN0ZWQgaGFyZHdhcmUKKyAgICAgICAgICogaXMgcGxhdGZvcm0gc3BlY2lmaWMsIGJ1dCB0aGlzIGZsYWcgaXMgcmVzZXJ2ZWQgdG8gcHJldmVudCBtYXBwaW5nIHRoaXMgYmxvY2sgaW50byBDUFUKKyAgICAgICAgICogd3JpdGFibGUgbWVtb3J5IHJlc3VsdGluZyBpbiBidXMgZmF1bHQuIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCB3aGVuIGJ1ZmZlciBpbnRlZ3JpdHkgbXVzdAorICAgICAgICAgKiBiZSBwcm90ZWN0ZWQuCisgICAgICAgICAqLworICAgICAgICBXUklURV9QUk9URUNURUQgID0gMSA8PCAzLAorICAgIH07CisKKyAgICBlbnVtIDogdWludDY0X3QgeworICAgICAgICAvKioKKyAgICAgICAgICogQnVmZmVyIHVzYWdlIGJpdHMgcmVzZXJ2ZWQgZm9yIHRoZSBwbGF0Zm9ybS4gV2UgZG9uJ3Qgc2VwYXJhdGVseSByZXNlcnZlIHJlYWQgYW5kCisgICAgICAgICAqIHdyaXRlIHVzYWdlcyBhcyBwbGF0Zm9ybXMgbWF5IGhhdmUgYXN5bW1ldHJpYyBkaXN0cmlidXRpb24gYmV0d2VlbiB0aGVtLgorICAgICAgICAgKi8KKyAgICAgICAgUExBVEZPUk1fTUFTSyAgICAgPSB+KENQVV9SRUFEIHwgQ1BVX1dSSVRFIHwgUkVBRF9QUk9URUNURUQgfCBXUklURV9QUk9URUNURUQpLAorICAgIH07CisKKyAgICAvKiogQ3JlYXRlIGEgdXNhZ2UgZnJvbSBzZXBhcmF0ZSBjb25zdW1lciBhbmQgcHJvZHVjZXIgdXNhZ2UgbWFzay4gXGRlcHJlY2F0ZWQgKi8KKyAgICBpbmxpbmUgQzJNZW1vcnlVc2FnZSh1aW50NjRfdCBjb25zdW1lciwgdWludDY0X3QgcHJvZHVjZXIpCisgICAgICAgIDogZXhwZWN0ZWQoY29uc3VtZXIgfCBwcm9kdWNlcikgeyB9CisKKyAgICBpbmxpbmUgZXhwbGljaXQgQzJNZW1vcnlVc2FnZSh1aW50NjRfdCBleHBlY3RlZF8pCisgICAgICAgIDogZXhwZWN0ZWQoZXhwZWN0ZWRfKSB7IH0KKworICAgIHVpbnQ2NF90IGV4cGVjdGVkOyAvLyBleHBlY3RlZCBidWZmZXIgdXNhZ2UKK307CisKKy8vLyBAfQorCisjZW5kaWYgIC8vIEMyQlVGRkVSX0JBU0VfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkNvbXBvbmVudC5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkNvbXBvbmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MTA3MjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQ29tcG9uZW50LmgKQEAgLTAsMCArMSw5NzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyQ09NUE9ORU5UX0hfCisKKyNkZWZpbmUgQzJDT01QT05FTlRfSF8KKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCisjaW5jbHVkZSA8QzJFbnVtLmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyV29yay5oPgorCisvLy8gXGRlZmdyb3VwIGNvbXBvbmVudHMgQ29tcG9uZW50cworLy8vIEB7CisKK3N0cnVjdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgeworICAgIGVudW0gdHlwZV90IDogdWludDMyX3QgeworICAgICAgICBQT1NTSUJMRSwgLy8vPCBxdWVyeSBhbGwgcG9zc2libGUgdmFsdWVzIHJlZ2FyZGxlc3Mgb2Ygb3RoZXIgc2V0dGluZ3MKKyAgICAgICAgQ1VSUkVOVCwgIC8vLzwgcXVlcnkgY3VycmVudGx5IHBvc3NpYmxlIHZhbHVlcyBnaXZlbiBkZXBlbmRlbnQgc2V0dGluZ3MKKyAgICB9OworCitwcml2YXRlOgorICAgIEMyUGFyYW1GaWVsZCBfbUZpZWxkOworICAgIHR5cGVfdCBfbVR5cGU7CitwdWJsaWM6CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgdmFsdWVzOworCisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KGNvbnN0IEMyUGFyYW1GaWVsZCAmZmllbGRfLCB0eXBlX3QgdHlwZV8pCisgICAgICAgIDogX21GaWVsZChmaWVsZF8pLCBfbVR5cGUodHlwZV8pLCBzdGF0dXMoQzJfTk9fSU5JVCkgeyB9CisKKyAgICBzdGF0aWMgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5CisgICAgQ3VycmVudChjb25zdCBDMlBhcmFtRmllbGQgJmZpZWxkXykgeworICAgICAgICByZXR1cm4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KGZpZWxkXywgQ1VSUkVOVCk7CisgICAgfQorCisgICAgc3RhdGljIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeQorICAgIFBvc3NpYmxlKGNvbnN0IEMyUGFyYW1GaWVsZCAmZmllbGRfKSB7CisgICAgICAgIHJldHVybiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkoZmllbGRfLCBQT1NTSUJMRSk7CisgICAgfQorCisgICAgaW5saW5lIEMyUGFyYW1GaWVsZCBmaWVsZCgpIGNvbnN0IHsgcmV0dXJuIF9tRmllbGQ7IH07CisKKyAgICBpbmxpbmUgdHlwZV90IHR5cGUoKSBjb25zdCB7IHJldHVybiBfbVR5cGU7IH0KK307CisKKy8qKgorICogQ29tcG9uZW50IGludGVyZmFjZSBvYmplY3QuIFRoaXMgb2JqZWN0IGNvbnRhaW5zIGFsbCBvZiB0aGUgY29uZmlndXJhdGlvbiBvZiBhIHBvdGVudGlhbCBvcgorICogYWN0dWFsIGNvbXBvbmVudC4gSXQgY2FuIGJlIGNyZWF0ZWQgYW5kIHVzZWQgaW5kZXBlbmRlbnRseSBvZiBhbiBhY3R1YWwgQzJDb21wb25lbnQgaW5zdGFuY2UgdG8KKyAqIHF1ZXJ5IHN1cHBvcnQgYW5kIHBhcmFtZXRlcnMgZm9yIHZhcmlvdXMgY29tcG9uZW50IHNldHRpbmdzIGFuZCBjb25maWd1cmF0aW9ucyBmb3IgYSBwb3RlbnRpYWwKKyAqIGNvbXBvbmVudC4gQWN0dWFsIGNvbXBvbmVudHMgYWxzbyBleHBvc2UgdGhpcyBpbnRlcmZhY2UuCisgKi8KKworY2xhc3MgQzJDb21wb25lbnRJbnRlcmZhY2UgeworcHVibGljOgorICAgIC8vIEFMV0FZUyBBVkFJTEFCTEUgTUVUSE9EUworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIGNvbXBvbmVudCBvciBjb21wb25lbnQgaW50ZXJmYWNlIG9iamVjdC4KKyAgICAgKiBUaGlzIGlzIGEgdW5pcXVlIG5hbWUgZm9yIHRoaXMgY29tcG9uZW50IG9yIGNvbXBvbmVudCBpbnRlcmZhY2UgJ2NsYXNzJzsgaG93ZXZlciwgbXVsdGlwbGUKKyAgICAgKiBpbnN0YW5jZXMgb2YgdGhpcyBjb21wb25lbnQgU0hBTEwgaGF2ZSB0aGUgc2FtZSBuYW1lLgorICAgICAqCisgICAgICogV2hlbiBhdHRhY2hlZCB0byBhIGNvbXBvbmVudCwgdGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IGNvbXBvbmVudCBzdGF0ZS4KKyAgICAgKiBUaGlzIGNhbGwgZG9lcyBub3QgY2hhbmdlIHRoZSBzdGF0ZSBub3IgdGhlIGludGVybmFsIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIGNvbXBvbmVudCBvciBjb21wb25lbnQgaW50ZXJmYWNlIG9iamVjdC4KKyAgICAgKiBccmV0dmFsIGFuIGVtcHR5IHN0cmluZyBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgdGhlIGFjdHVhbCBuYW1lLgorICAgICAqLworICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB1bmlxdWUgSUQgZm9yIHRoaXMgY29tcG9uZW50IG9yIGludGVyZmFjZSBvYmplY3QuCisgICAgICogVGhpcyBJRCBpcyB1c2VkIGFzIHdvcmsgdGFyZ2V0cywgdW5pcXVlIHdvcmsgSURzLCBhbmQgd2hlbiBjb25maWd1cmluZyB0dW5uZWxpbmcuCisgICAgICoKKyAgICAgKiBXaGVuIGF0dGFjaGVkIHRvIGEgY29tcG9uZW50LCB0aGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBhbnkgY29tcG9uZW50IHN0YXRlLgorICAgICAqIFRoaXMgY2FsbCBkb2VzIG5vdCBjaGFuZ2UgdGhlIHN0YXRlIG5vciB0aGUgaW50ZXJuYWwgY29uZmlndXJhdGlvbiBvZiB0aGUgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgdW5pcXVlIG5vZGUgSUQgZm9yIHRoaXMgY29tcG9uZW50IG9yIGNvbXBvbmVudCBpbnRlcmZhY2UgaW5zdGFuY2UuCisgICAgICovCisgICAgdmlydHVhbCBjMl9ub2RlX2lkX3QgZ2V0SWQoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBRdWVyaWVzIGEgc2V0IG9mIHBhcmFtZXRlcnMgZnJvbSB0aGUgY29tcG9uZW50IG9yIGludGVyZmFjZSBvYmplY3QuCisgICAgICogUXVlcnlpbmcgaXMgcGVyZm9ybWVkIGF0IGJlc3QgZWZmb3J0OiB0aGUgY29tcG9uZW50IFNIQUxMIHF1ZXJ5IGFsbCBzdXBwb3J0ZWQgcGFyYW1ldGVycyBhbmQKKyAgICAgKiBza2lwIHVuc3VwcG9ydGVkIG9uZXMsIGhlYXAgYWxsb2NhdGVkIHBhcmFtZXRlcnMgdGhhdCBjb3VsZCBub3QgYmUgYWxsb2NhdGVkIG9yIHBhcmFtZXRlcnMKKyAgICAgKiB0aGF0IGNvdWxkIG5vdCBiZSBxdWVyaWVkIHdpdGhvdXQgYmxvY2tpbmcuIEFueSBlcnJvcnMgYXJlIGNvbW11bmljYXRlZCBpbiB0aGUgcmV0dXJuIHZhbHVlLgorICAgICAqIEFkZGl0aW9uYWxseSwgcHJlYWxsb2NhdGVkIChlLmcuIHN0YWNrKSBwYXJhbWV0ZXJzIHRoYXQgY291bGQgbm90IGJlIHF1ZXJpZWQgYXJlIGludmFsaWRhdGVkLgorICAgICAqIEludmFsaWQgb3IgYmxvY2tpbmcgcGFyYW1ldGVycyB0byBiZSBhbGxvY2F0ZWQgb24gdGhlIGhlYXAgYXJlIG9taXR0ZWQgZnJvbSB0aGUgcmVzdWx0LgorICAgICAqCisgICAgICogXG5vdGUgUGFyYW1ldGVyIHZhbHVlcyBkbyBub3QgZGVwZW5kIG9uIHRoZSBvcmRlciBvZiBxdWVyeS4KKyAgICAgKgorICAgICAqIFx0b2RvIFRoaXMgbWV0aG9kIGNhbm5vdCBiZSB1c2VkIHRvIHF1ZXJ5IGluZm8tYnVmZmVycy4gSXMgdGhhdCBhIHByb2JsZW0/CisgICAgICoKKyAgICAgKiBXaGVuIGF0dGFjaGVkIHRvIGEgY29tcG9uZW50LCB0aGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBhbnkgY29tcG9uZW50IHN0YXRlIGV4Y2VwdAorICAgICAqIHJlbGVhc2VkLgorICAgICAqIFRoaXMgY2FsbCBkb2VzIG5vdCBjaGFuZ2UgdGhlIHN0YXRlIG5vciB0aGUgaW50ZXJuYWwgY29uZmlndXJhdGlvbiBvZiB0aGUgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgaGFzIGEgdmFyaWFibGUgYmxvY2tpbmcgYmVoYXZpb3IgYmFzZWQgb24gc3RhdGUuCisgICAgICogSW4gdGhlIHN0b3BwZWQgc3RhdGUgdGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICogSW4gdGhlIHJ1bm5pbmcgc3RhdGVzIHRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IE1VU1QgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBccGFyYW1baW4sb3V0XSBzdGFja1BhcmFtcyAgYSBsaXN0IG9mIHBhcmFtcyBxdWVyaWVkLiBUaGVzZSBhcmUgaW5pdGlhbGl6ZWQgc3BlY2lmaWMgdG8gZWFjaAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nOyBlLmcuIHNpemUgYW5kIGluZGV4IGFyZSBzZXQgYW5kIHJlc3Qgb2YgdGhlIG1lbWJlcnMgYXJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyZWQuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxub3RlIEZsZXhpYmxlIHNldHRpbmdzIHRoYXQgYXJlIG9mIGluY29ycmVjdCBzaXplIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZWQuCisgICAgICogXHBhcmFtW2luXSBoZWFwUGFyYW1JbmRpY2VzIGEgdmVjdG9yIG9mIHBhcmFtIGluZGljZXMgZm9yIHBhcmFtcyB0byBiZSBxdWVyaWVkIGFuZCByZXR1cm5lZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgaGVhcC4gVGhlc2UgcGFyYW1ldGVycyB3aWxsIGJlIHJldHVybmVkIGluIGhlYXBQYXJhbXMuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuc3VwcG9ydGVkIHBhcmFtIGluZGljZXMgd2lsbCBiZSBpZ25vcmVkLgorICAgICAqIFxwYXJhbVtpbl0gbWF5QmxvY2sgICAgICAgICBpZiB0cnVlIChDMl9NQVlfQkxPQ0spLCBpbXBsZW1lbnRhdGlvbiBtYXkgbW9tZW50YXJpbHkgYmxvY2suCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSAoQzJfRE9OVF9CTE9DSyksIGl0IG11c3QgYmUgIm5vbi1ibG9ja2luZyIuCisgICAgICogXHBhcmFtW291dF0gaGVhcFBhcmFtcyAgICAgIGEgbGlzdCBvZiBwYXJhbXMgd2hlcmUgdG8gd2hpY2ggdGhlIHN1cHBvcnRlZCBoZWFwIHBhcmFtZXRlcnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBhcHBlbmRlZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gaGVhcFBhcmFtSW5kaWNlcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIGFsbCBwYXJhbWV0ZXJzIGNvdWxkIGJlIHF1ZXJpZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCBhbGwgc3VwcG9ydGVkIHBhcmFtZXRlcnMgY291bGQgYmUgcXVlcmllZCwgYnV0IHNvbWUgcGFyYW1ldGVycyB3ZXJlIG5vdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSByZWxlYXNlZCBjb21wb25lbnQgc3RhdGUgKHVzZXIgZXJyb3IpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYSBzdXBwb3J0ZWQgcGFyYW1ldGVyCisgICAgICogXHJldHZhbCBDMl9CTE9DS0lORyAgdGhlIG9wZXJhdGlvbiBtdXN0IGJsb2NrIHRvIGNvbXBsZXRlIGJ1dCBtYXlCbG9jayBpcyBmYWxzZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBxdWVyeSB0aGUgcGFyYW1ldGVycyB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcnVubmluZyBzdGF0ZSkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBxdWVyeWluZyBvZiB0aGUgcGFyYW1ldGVycworICAgICAqICAgICAgICAgICAgICAgICAgICAgICh1bmV4cGVjdGVkKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlfdmIoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmc3RhY2tQYXJhbXMsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgaGVhcFBhcmFtcykgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogU2V0cyBhIHNldCBvZiBwYXJhbWV0ZXJzIGZvciB0aGUgY29tcG9uZW50IG9yIGludGVyZmFjZSBvYmplY3QuCisgICAgICoKKyAgICAgKiBUdW5pbmcgaXMgcGVyZm9ybWVkIGF0IGJlc3QgZWZmb3J0OiB0aGUgY29tcG9uZW50IFNIQUxMIHByb2Nlc3MgdGhlIGNvbmZpZ3VyYXRpb24gdXBkYXRlcyBpbgorICAgICAqIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB8cGFyYW1zfC4gSWYgYW55IHBhcmFtZXRlciB1cGRhdGUgZmFpbHMsIHRoZSBjb21wb25lbnQgc2hhbGwKKyAgICAgKiBjb21tdW5pY2F0ZSB0aGUgZmFpbHVyZSBpbiB0aGUgcmV0dXJuIHZhbHVlIGFuZCBpbiB8ZmFpbHVyZXN8LCBhbmQgc3RpbGwgcHJvY2VzcyB0aGUKKyAgICAgKiByZW1haW5pbmcgcGFyYW1ldGVycy4gVW5zdXBwb3J0ZWQgcGFyYW1ldGVycyBhcmUgc2tpcHBlZCwgdGhvdWdoIHRoZXkgYXJlIGNvbW11bmljYXRlZCBpbgorICAgICAqIHRoZXIgcmV0dXJuIHZhbHVlLiBNb3N0IHBhcmFtZXRlcnMgYXJlIHVwZGF0ZWQgYXQgYmVzdCBlZmZvcnQgLSBzdWNoIHRoYXQgZXZlbiBpZiBjbGllbnQKKyAgICAgKiBzcGVjaWZpZXMgYW4gdW5zdXBwb3J0ZWQgdmFsdWUgZm9yIGEgZmllbGQsIHRoZSBjbG9zZXN0IHN1cHBvcnRlZCB2YWx1ZSBpcyB1c2VkLiBPbiB0aGUKKyAgICAgKiBvdGhlciBoYW5kLCBzdHJpY3QgcGFyYW1ldGVycyBvbmx5IGFjY2VwdCBzcGVjaWZpYyB2YWx1ZXMgZm9yIHRoZWlyIGZpZWxkcywgYW5kIGlmIHRoZSBjbGllbnQKKyAgICAgKiBzcGVjaWZpZXMgYW4gdW5zdXBwb3J0ZWQgdmFsdWUsIHRoZSBwYXJhbWV0ZXIgc2V0dGluZyBzaGFsbCBmYWlsIGZvciB0aGF0IGZpZWxkLgorICAgICAqIElmIHRoZSBjbGllbnQgdHJpZXMgdG8gY2hhbmdlIHRoZSB2YWx1ZSBvZiBhIGZpZWxkIHRoYXQgcmVxdWlyZXMgbW9tZW50YXJ5IGJsb2NraW5nIHdpdGhvdXQKKyAgICAgKiBzZXR0aW5nIHxtYXlCbG9ja3wgdG8gQzJfTUFZX0JMT0NLLCB0aGF0IHBhcmFtZXRlciBzaGFsbCBhbHNvIGJlIHNraXBwZWQgYW5kIGEgc3BlY2lmaWMKKyAgICAgKiByZXR1cm4gdmFsdWUgc2hhbGwgYmUgdXNlZC4gRmluYWwgdmFsdWVzIGZvciBhbGwgcGFyYW1ldGVycyBzZXQgYXJlIHByb3BhZ2F0ZWQgYmFjayB0byB0aGUKKyAgICAgKiBjYWxsZXIgaW4gfHBhcmFtc3wuCisgICAgICoKKyAgICAgKiBcbm90ZSBQYXJhbWV0ZXIgdHVuaW5nIERPRVMgZGVwZW5kIG9uIHRoZSBvcmRlciBvZiB0aGUgdHVuaW5nIHBhcmFtZXRlcnMuIEUuZy4gc29tZSBwYXJhbWV0ZXIKKyAgICAgKiB1cGRhdGUgbWF5IGFsbG93IHNvbWUgc3Vic2VxdWVudCB2YWx1ZXMgZm9yIGZ1cnRoZXIgcGFyYW1ldGVyIHVwZGF0ZXMuCisgICAgICoKKyAgICAgKiBXaGVuIGF0dGFjaGVkIHRvIGEgY29tcG9uZW50LCB0aGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBhbnkgY29tcG9uZW50IHN0YXRlIGV4Y2VwdAorICAgICAqIHJlbGVhc2VkLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgaGFzIGEgdmFyaWFibGUgYmxvY2tpbmcgYmVoYXZpb3IgYmFzZWQgb24gc3RhdGUuCisgICAgICogSW4gdGhlIHN0b3BwZWQgc3RhdGUgdGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICogSW4gdGhlIHJ1bm5pbmcgc3RhdGVzIHRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IE1VU1QgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBccGFyYW1baW4sb3V0XSBwYXJhbXMgYSBsaXN0IG9mIHBhcmFtZXRlciB1cGRhdGVzLiBUaGVzZSB3aWxsIGJlIHVwZGF0ZWQgdG8gdGhlIGFjdHVhbAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgdmFsdWVzIGFmdGVyIHRoZSB1cGRhdGVzICh0aGlzIGlzIGJlY2F1c2UgdHVuaW5nIGlzIHBlcmZvcm1lZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBhdCBiZXN0IGVmZm9ydCkuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIFx0b2RvIHBhcmFtcyB0aGF0IGNvdWxkIG5vdCBiZSB1cGRhdGVkIGFyZSBub3QgbWFya2VkIGhlcmUsIHNvIGFyZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBjb25mdXNpbmcgLSBhcmUgdGhleSAiZXhpc3RpbmciIHZhbHVlcyBvciBpbnRlbmRlZCB0byBiZSBjb25maWd1cmVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz8KKyAgICAgKiBccGFyYW1baW5dIG1heUJsb2NrICAgaWYgdHJ1ZSAoQzJfTUFZX0JMT0NLKSwgaW1wbGVtZW50YXRpb24gbWF5IG1vbWVudGFyaWx5IGJsb2NrLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UgKEMyX0RPTlRfQkxPQ0spLCBpdCBtdXN0IGJlICJub24tYmxvY2tpbmciLgorICAgICAqIFxwYXJhbVtvdXRdIGZhaWx1cmVzICBhIGxpc3Qgb2YgcGFyYW1ldGVyIGZhaWx1cmVzIGFuZCBvcHRpb25hbCBndWlkYW5jZQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgYWxsIHBhcmFtZXRlcnMgY291bGQgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCBhbGwgc3VwcG9ydGVkIHBhcmFtZXRlcnMgY291bGQgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHksIGJ1dCBzb21lCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyB3ZXJlIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBzb21lIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGNvdWxkIG5vdCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSBiZWNhdXNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdGhleSBjb250YWluZWQgdW5zdXBwb3J0ZWQgdmFsdWVzLiBUaGVzZSBhcmUgcmV0dXJuZWQgaW4gfGZhaWx1cmVzfC4KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB3aGVuIGNhbGxlZCBpbiB0aGUgcmVsZWFzZWQgY29tcG9uZW50IHN0YXRlICh1c2VyIGVycm9yKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIHNvbWUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgY291bGQgbm90IGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IGJlY2F1c2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGV5IGNvbnRhaW5lZCB1bnN1cHBvcnRlZCB2YWx1ZXMsIGJ1dCBjb3VsZCBub3QgYWxsb2NhdGUgYSBmYWlsdXJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IGZvciB0aGVtLgorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBzZXQgdGhlIHBhcmFtZXRlcnMgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJ1bm5pbmcgc3RhdGUpCisgICAgICogXHJldHZhbCBDMl9CTE9DS0lORyAgdGhlIG9wZXJhdGlvbiBtdXN0IGJsb2NrIHRvIGNvbXBsZXRlIGJ1dCBtYXlCbG9jayBpcyBmYWxzZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHVwZGF0ZSBvZiB0aGUgcGFyYW1ldGVycworICAgICAqICAgICAgICAgICAgICAgICAgICAgICh1bmV4cGVjdGVkKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnX3ZiKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcykgPSAwOworCisgICAgLy8gVFVOTkVMSU5HCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgdHVubmVsIGZyb20gdGhpcyBjb21wb25lbnQgdG8gdGhlIHRhcmdldCBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBJZiB0aGUgY29tcG9uZW50IGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLCBzdWJzZXF1ZW50IHdvcmsgaXRlbXMgcXVldWVkIG1heSBpbmNsdWRlIGEKKyAgICAgKiB0dW5uZWxlZCBwYXRoIGJldHdlZW4gdGhlc2UgY29tcG9uZW50cy4KKyAgICAgKgorICAgICAqIFdoZW4gYXR0YWNoZWQgdG8gYSBjb21wb25lbnQsIHRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBjb21wb25lbnQgc3RhdGUgZXhjZXB0CisgICAgICogcmVsZWFzZWQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgbW9tZW50YXJpbHkgYmxvY2tpbmcsIGJ1dCBNVVNUIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIHR1bm5lbCB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCB0aGUgdGFyZ2V0IGNvbXBvbmVudCBkb2VzIG5vdCBleGlzdAorICAgICAqIFxyZXR2YWwgQzJfRFVQTElDQVRFIHRoZSB0dW5uZWwgYWxyZWFkeSBleGlzdHMKKyAgICAgKiBccmV0dmFsIEMyX09NSVRURUQgICB0dW5uZWxpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGNvbXBvbmVudAorICAgICAqIFxyZXR2YWwgQzJfQ0FOTk9UX0RPIHRoZSBzcGVjaWZpYyB0dW5uZWwgaXMgbm90IHN1cHBvcnRlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSByZWxlYXNlZCBjb21wb25lbnQgc3RhdGUgKHVzZXIgZXJyb3IpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3QgY3JlYXRlIHRoZSB0dW5uZWwgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIGNyZWF0aW9uIG9mIHRoZSB0dW5uZWwgKHVuZXhwZWN0ZWQpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVUdW5uZWxfc20oYzJfbm9kZV9pZF90IHRhcmdldENvbXBvbmVudCkgPSAwOworCisgICAgLyoqCisgICAgICogUmVsZWFzZXMgYSB0dW5uZWwgZnJvbSB0aGlzIGNvbXBvbmVudCB0byB0aGUgdGFyZ2V0IGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFRoZSByZWxlYXNlIG9mIGEgdHVubmVsIGlzIGRlbGF5ZWQgd2hpbGUgdGhlcmUgYXJlIHBlbmRpbmcgd29yayBpdGVtcyBmb3IgdGhlIHR1bm5lbC4KKyAgICAgKiBBZnRlciByZWxlYXNpbmcgYSB0dW5uZWwsIHN1YnNlcXVlbnQgd29yayBpdGVtcyBxdWV1ZWQgTVVTVCBOT1QgaW5jbHVkZSBhIHR1bm5lbGVkCisgICAgICogcGF0aCBiZXR3ZWVuIHRoZXNlIGNvbXBvbmVudHMuCisgICAgICoKKyAgICAgKiBXaGVuIGF0dGFjaGVkIHRvIGEgY29tcG9uZW50LCB0aGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBhbnkgY29tcG9uZW50IHN0YXRlIGV4Y2VwdAorICAgICAqIHJlbGVhc2VkLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIG1vbWVudGFyaWx5IGJsb2NraW5nLCBidXQgTVVTVCByZXR1cm4gd2l0aGluIDVtcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSB0dW5uZWwgd2FzIG1hcmtlZCBmb3IgcmVsZWFzZSBzdWNjZXNzZnVsbHkKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCB0aGUgdGFyZ2V0IGNvbXBvbmVudCBkb2VzIG5vdCBleGlzdAorICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIHRoZSB0dW5uZWwgZG9lcyBub3QgZXhpc3QKKyAgICAgKiBccmV0dmFsIEMyX09NSVRURUQgICB0dW5uZWxpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGNvbXBvbmVudAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSByZWxlYXNlZCBjb21wb25lbnQgc3RhdGUgKHVzZXIgZXJyb3IpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3QgbWFyayB0aGUgdHVubmVsIGZvciByZWxlYXNlIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSByZWxlYXNlIG9mIHRoZSB0dW5uZWwgKHVuZXhwZWN0ZWQpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCByZWxlYXNlVHVubmVsX3NtKGMyX25vZGVfaWRfdCB0YXJnZXRDb21wb25lbnQpID0gMDsKKworICAgIC8vIFJFRkxFQ1RJT04gTUVDSEFOSVNNIChVU0VEIEZPUiBFWFRFTlNJT04pCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2Ygc3VwcG9ydGVkIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBXaGVuIGF0dGFjaGVkIHRvIGEgY29tcG9uZW50LCB0aGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBhbnkgY29tcG9uZW50IHN0YXRlIGV4Y2VwdAorICAgICAqIHJlbGVhc2VkLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccGFyYW1bb3V0XSBwYXJhbXMgYSB2ZWN0b3Igb2Ygc3VwcG9ydGVkIHBhcmFtZXRlcnMgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGlzIHZlY3Rvci4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB3aGVuIGNhbGxlZCBpbiB0aGUgcmVsZWFzZWQgY29tcG9uZW50IHN0YXRlICh1c2VyIGVycm9yKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIHRoaXMgbWV0aG9kLgorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqIGNvbnN0IHBhcmFtcykgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGZvciB0aGUgcXVlcmllZCBmaWVsZHMuCisgICAgICoKKyAgICAgKiBDbGllbnQgU0hBTEwgc2V0IHRoZSBwYXJhbWV0ZXItZmllbGQgc3BlY2lmaWVyIGFuZCB0aGUgdHlwZSBvZiBzdXBwb3J0ZWQgdmFsdWVzIHF1ZXJ5IChlLmcuCisgICAgICogY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMsIG9yIHBvdGVudGlhbCBzdXBwb3J0ZWQgdmFsdWVzKSBpbiBmaWVsZHMuCisgICAgICogVXBvbiByZXR1cm4gdGhlIGNvbXBvbmVudCBTSEFMTCBmaWxsIGluIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGZvciB0aGUgZmllbGRzIGxpc3RlZCBhcyB3ZWxsCisgICAgICogYXMgYSBzdGF0dXMgZm9yIGVhY2ggZmllbGQuIENvbXBvbmVudCBzaGFsbCBwcm9jZXNzIGFsbCBmaWVsZHMgcXVlcmllZCBldmVuIGlmIHNvbWUgcXVlcmllcworICAgICAqIGZhaWwuCisgICAgICoKKyAgICAgKiBXaGVuIGF0dGFjaGVkIHRvIGEgY29tcG9uZW50LCB0aGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBhbnkgY29tcG9uZW50IHN0YXRlIGV4Y2VwdAorICAgICAqIHJlbGVhc2VkLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgaGFzIGEgdmFyaWFibGUgYmxvY2tpbmcgYmVoYXZpb3IgYmFzZWQgb24gc3RhdGUuCisgICAgICogSW4gdGhlIHN0b3BwZWQgc3RhdGUgdGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICogSW4gdGhlIHJ1bm5pbmcgc3RhdGVzIHRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IE1VU1QgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBccGFyYW1baW4gb3V0XSBmaWVsZHMgYSB2ZWN0b3Igb2YgZmllbGRzIGRlc2NyaXB0b3Igc3RydWN0dXJlcy4KKyAgICAgKiBccGFyYW1baW5dIG1heUJsb2NrICAgaWYgdHJ1ZSAoQzJfTUFZX0JMT0NLKSwgaW1wbGVtZW50YXRpb24gbWF5IG1vbWVudGFyaWx5IGJsb2NrLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UgKEMyX0RPTlRfQkxPQ0spLCBpdCBtdXN0IGJlICJub24tYmxvY2tpbmciLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSByZWxlYXNlZCBjb21wb25lbnQgc3RhdGUgKHVzZXIgZXJyb3IpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggYXQgbGVhc3Qgb25lIGZpZWxkIHdhcyBub3QgcmVjb2duaXplZCBhcyBhIGNvbXBvbmVudCBmaWVsZAorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBxdWVyeSBzdXBwb3J0ZWQgdmFsdWVzIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBydW5uaW5nIHN0YXRlKQorICAgICAqIFxyZXR2YWwgQzJfQkxPQ0tJTkcgIHRoZSBvcGVyYXRpb24gbXVzdCBibG9jayB0byBjb21wbGV0ZSBidXQgbWF5QmxvY2sgaXMgZmFsc2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBvcGVyYXRpb24gZnJvbSBjb21wbGV0aW5nICh1bmV4cGVjdGVkKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXNfdmIoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMsIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgfkMyQ29tcG9uZW50SW50ZXJmYWNlKCkgPSBkZWZhdWx0OworfTsKKworY2xhc3MgQzJDb21wb25lbnQgeworcHVibGljOgorICAgIGNsYXNzIExpc3RlbmVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgdm9pZCBvbldvcmtEb25lX25iKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiB3b3JrSXRlbXMpID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgb25UcmlwcGVkX25iKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gc2V0dGluZ1Jlc3VsdCkgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBvbkVycm9yX25iKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZXJyb3JDb2RlKSA9IDA7CisKKyAgICAgICAgLy8gdmlydHVhbCB2b2lkIG9uVHVubmVsUmVsZWFzZWQoPGZyb20+LCA8dG8+KSA9IDA7CisKKyAgICAgICAgLy8gdmlydHVhbCB2b2lkIG9uQ29tcG9uZW50UmVsZWFzZWQoPGlkPikgPSAwOworCisgICAgICAgIHZpcnR1YWwgfkxpc3RlbmVyKCkgPSBkZWZhdWx0OworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsaXN0ZW5lciBmb3IgdGhpcyBjb21wb25lbnQKKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFsbCBzdGF0ZXMgZXhjZXB0IHJlbGVhc2VkLgorICAgICAqIFRoZSBsaXN0ZW5lciBjYW4gb25seSBiZSBzZXQgdG8gbm9uLW51bGwgdmFsdWUgaW4gc3RvcHBlZCBzdGF0ZSAodGhhdCBkb2VzIG5vdCBpbmNsdWRlCisgICAgICogdHJpcHBlZCBvciBlcnJvcikuIEl0IGNhbiBiZSBzZXQgdG8gbnVsbHB0ciBpbiBib3RoIHN0b3BwZWQgYW5kIHJ1bm5pbmcgc3RhdGVzLgorICAgICAqIENvbXBvbmVudHMgb25seSB1c2UgdGhlIGxpc3RlbmVyIGluIHJ1bm5pbmcgc3RhdGUuCisgICAgICoKKyAgICAgKiBJZiBsaXN0ZW5lciBpcyBudWxscHRyLCB0aGUgY29tcG9uZW50IFNIQUxMIGd1YXJhbnRlZSB0aGF0IG5vIG1vcmUgbGlzdGVuZXIgY2FsbGJhY2tzIGFyZQorICAgICAqIGRvbmUgdG8gdGhlIG9yaWdpbmFsIGxpc3RlbmVyIG9uY2UgdGhpcyBtZXRob2QgcmV0dXJucy4gKEFueSBwZW5kaW5nIGxpc3RlbmVyIGNhbGxiYWNrcyB3aWxsCisgICAgICogbmVlZCB0byBiZSBjb21wbGV0ZWQgZHVyaW5nIHRoaXMgY2FsbCAtIGhlbmNlIHRoaXMgY2FsbCBtYXkgYmUgdGVtcG9yYXJpbHkgYmxvY2tpbmcuKQorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgaGFzIGEgdmFyaWFibGUgYmxvY2tpbmcgYmVoYXZpb3IgYmFzZWQgb24gc3RhdGUuCisgICAgICogSW4gdGhlIHN0b3BwZWQgc3RhdGUgdGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICogSW4gdGhlIHJ1bm5pbmcgc3RhdGVzIHRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IE1VU1QgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBDb21wb25lbnQgU0hBTEwgaGFuZGxlIGxpc3RlbmVyIG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgc2FtZSB0aHJlYWQgKHRoZSB0aHJlYWQgdXNlZCBpcworICAgICAqIGF0IHRoZSBjb21wb25lbnQncyBkaXNjcmV0aW9uLikKKyAgICAgKgorICAgICAqIFxub3RlIFRoaXMgY291bGQgYWxzbyBiZSBhY2NvbXBsaXNoZWQgYnkgcGFzc2luZyBhIHdlYWtfcHRyIHRvIGEgY29tcG9uZW50LXNwZWNpZmljIGxpc3RlbmVyCisgICAgICogaGVyZSBhbmQgcmVxdWlyaW5nIHRoZSBjbGllbnQgdG8gYWx3YXlzIHByb21vdGUgdGhlIHdlYWtfcHRyIGJlZm9yZSBhbnkgY2FsbGJhY2suIFRoaXMgd291bGQKKyAgICAgKiBwdXQgdGhlIGJ1cmRlbiBvbiB0aGUgY2xpZW50IHRvIGNsZWFyIHRoZSBsaXN0ZW5lciAtIHdhaXQgZm9yIGl0cyBkZWxldGlvbiAtIGF0IHdoaWNoIHBvaW50CisgICAgICogaXQgaXMgZ3VhcmFudGVlZCB0aGF0IG5vIG1vcmUgbGlzdGVuZXIgY2FsbGJhY2tzIHdpbGwgb2NjdXIuCisgICAgICoKKyAgICAgKiBccGFyYW1baW5dIGxpc3RlbmVyIHRoZSBjb21wb25lbnQgbGlzdGVuZXIgb2JqZWN0CisgICAgICogXHBhcmFtW2luXSBtYXlCbG9jayBpZiB0cnVlIChDMl9NQVlfQkxPQ0spLCBpbXBsZW1lbnRhdGlvbiBtYXkgbW9tZW50YXJpbHkgYmxvY2suCisgICAgICogICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UgKEMyX0RPTlRfQkxPQ0spLCBpdCBtdXN0IGJlICJub24tYmxvY2tpbmciLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgYXR0ZW1wdGluZyB0byBjaGFuZ2UgdGhlIGxpc3RlbmVyIGluIHRoZSBydW5uaW5nIHN0YXRlIHRvIGEgbm9uLW51bGwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAodXNlciBlcnJvciksIG9yIGNhbGxlZCBpbiB0aGUgcmVsZWFzZWQgc3RhdGUKKyAgICAgKiBccmV0dmFsIEMyX0JMT0NLSU5HICB0aGUgb3BlcmF0aW9uIG11c3QgYmxvY2sgdG8gY29tcGxldGUgYnV0IG1heUJsb2NrIGlzIGZhbHNlCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgbGlzdGVuZXIgd2FzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgc2V0TGlzdGVuZXJfdmIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+ICZsaXN0ZW5lciwgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgPSAwOworCisgICAgLy8vIGNvbXBvbmVudCBkb21haW4gKGUuZy4gYXVkaW8gb3IgdmlkZW8pCisgICAgZW51bSBkb21haW5fdCA6IHVpbnQzMl90OworCisgICAgLy8vIGNvbXBvbmVudCBraW5kIChlLmcuIGVuY29kZXIsIGRlY29kZXIgb3IgZmlsdGVyKQorICAgIGVudW0ga2luZF90IDogdWludDMyX3Q7CisKKyAgICAvLy8gY29tcG9uZW50IHJhbmsuIFRoaXMgbnVtYmVyIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGNvbXBvbmVudCBvcmRlcmluZyAodGhlIGxvd2VyIHRoZSBzb29uZXIpCisgICAgLy8vIGluIHRoZSBjb21wb25lbnQgbGlzdC4KKyAgICB0eXBlZGVmIHVpbnQzMl90IHJhbmtfdDsKKworICAgIC8vLyBjb21wb25lbnQgYXR0cmlidXRlcworICAgIGVudW0gYXR0cmliX3QgOiB1aW50NjRfdDsKKworICAgIC8qKgorICAgICAqIEluZm9ybWF0aW9uIGFib3V0IGEgY29tcG9uZW50LgorICAgICAqLworICAgIHN0cnVjdCBUcmFpdHMgeworICAgIC8vIHB1YmxpYzoKKyAgICAgICAgQzJTdHJpbmcgbmFtZTsgLy8vPCBuYW1lIG9mIHRoZSBjb21wb25lbnQKKyAgICAgICAgZG9tYWluX3QgZG9tYWluOyAvLy88IGNvbXBvbmVudCBkb21haW4KKyAgICAgICAga2luZF90IGtpbmQ7IC8vLzwgY29tcG9uZW50IGtpbmQKKyAgICAgICAgcmFua190IHJhbms7IC8vLzwgY29tcG9uZW50IHJhbmsKKyAgICAgICAgQzJTdHJpbmcgbWVkaWFUeXBlOyAvLy88IG1lZGlhIHR5cGUgc3VwcG9ydGVkIGJ5IHRoZSBjb21wb25lbnQKKworICAgICAgICAvKioKKyAgICAgICAgICogbmFtZSBhbGlhcyhlcykgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgICAgICAgICAqIFxub3RlIE11bHRpcGxlIGNvbXBvbmVudHMgY2FuIGhhdmUgdGhlIHNhbWUgYWxpYXMgYXMgbG9uZyBhcyB0aGVpciBtZWRpYS10eXBlIGRpZmZlcnMuCisgICAgICAgICAqLworICAgICAgICBzdGQ6OnZlY3RvcjxDMlN0cmluZ0xpdGVyYWw+IGFsaWFzZXM7IC8vLzwgbmFtZSBhbGlhc2VzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisgICAgfTsKKworICAgIC8vIE1FVEhPRFMgQVZBSUxBQkxFIFdIRU4gUlVOTklORworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgLyoqCisgICAgICogUXVldWVzIHVwIHdvcmsgZm9yIHRoZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBydW5uaW5nIChpbmNsdWRpbmcgdHJpcHBlZCBhbmQgZXJyb3IpIHN0YXRlcy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMSBtcworICAgICAqCisgICAgICogSXQgaXMgYWNjZXB0YWJsZSBmb3IgdGhpcyBtZXRob2QgdG8gcmV0dXJuIE9LIGFuZCByZXR1cm4gYW4gZXJyb3IgdmFsdWUgdXNpbmcgdGhlCisgICAgICogb25Xb3JrRG9uZSgpIGNhbGxiYWNrLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIHdvcmsgd2FzIHN1Y2Nlc3NmdWxseSBxdWV1ZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCBzb21lIGNvbXBvbmVudChzKSBpbiB0aGUgd29yayBkbyhlcykgbm90IGV4aXN0CisgICAgICogXHJldHZhbCBDMl9DQU5OT1RfRE8gdGhlIGNvbXBvbmVudHMgYXJlIG5vdCB0dW5uZWxlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSBzdG9wcGVkIG9yIHJlbGVhc2VkIHN0YXRlICh1c2VyIGVycm9yKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gcXVldWUgdGhlIHdvcmsKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHF1ZXVpbmcgdGhlIHdvcmsgKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWV1ZV9uYihzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBpdGVtcykgPSAwOworCisgICAgLyoqCisgICAgICogQW5ub3VuY2VzIGEgd29yayB0byBiZSBxdWV1ZWQgbGF0ZXIgZm9yIHRoZSBjb21wb25lbnQuIFRoaXMgcmVzZXJ2ZXMgYSBzbG90IGZvciB0aGUgcXVldWUKKyAgICAgKiB0byBlbnN1cmUgY29ycmVjdCB3b3JrIG9yZGVyaW5nIGV2ZW4gaWYgdGhlIHdvcmsgaXMgcXVldWVkIGxhdGVyLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gcnVubmluZyAoaW5jbHVkaW5nIHRyaXBwZWQgYW5kIGVycm9yKSBzdGF0ZXMuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDEgbXMKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSB3b3JrIGFubm91bmNlbWVudCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcmVjb3JkZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCBzb21lIGNvbXBvbmVudChzKSBpbiB0aGUgd29yayBvdXRsaW5lIGRvKGVzKSBub3QgZXhpc3QKKyAgICAgKiBccmV0dmFsIEMyX0NBTk5PVF9ETyB0aGUgY29tcG9uZW50ZXMgYXJlIG5vdCB0dW5uZWxlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSBzdG9wcGVkIG9yIHJlbGVhc2VkIHN0YXRlICh1c2VyIGVycm9yKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gcmVjb3JkIHRoZSB3b3JrIGFubm91bmNlbWVudAorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgcmVjb3JkaW5nIHRoZSBhbm5vdW5jZW1lbnQgKHVuZXhwZWN0ZWQpCisgICAgICoKKyAgICAgKiBcdG9kbyBDYW4gdGhpcyBiZSByb2xsZWQgaW50byBxdWV1ZV9uYj8KKyAgICAgKiBcdG9kbyBFeHBvc2UgbmV4dCB3b3JrIGl0ZW0gZm9yIGVhY2ggY29tcG9uZW50IHRvIGRldGVjdCBzdGFsbHMKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGFubm91bmNlX25iKGNvbnN0IHN0ZDo6dmVjdG9yPEMyV29ya091dGxpbmU+ICZpdGVtcykgPSAwOworCisgICAgZW51bSBmbHVzaF9tb2RlX3QgOiB1aW50MzJfdCB7CisgICAgICAgIC8vLyBmbHVzaCB3b3JrIGZyb20gdGhpcyBjb21wb25lbnQgb25seQorICAgICAgICBGTFVTSF9DT01QT05FTlQsCisKKyAgICAgICAgLy8vIGZsdXNoIHdvcmsgZnJvbSB0aGlzIGNvbXBvbmVudCBhbmQgYWxsIGNvbXBvbmVudHMgY29ubmVjdGVkIGRvd25zdHJlYW0gZnJvbSBpdCB2aWEKKyAgICAgICAgLy8vIHR1bm5lbGluZworICAgICAgICBGTFVTSF9DSEFJTiA9ICgxIDw8IDE2KSwKKyAgICB9OworCisgICAgLyoqCisgICAgICogRGlzY2FyZHMgYW5kIGFiYW5kb25zIGFueSBwZW5kaW5nIHdvcmsgZm9yIHRoZSBjb21wb25lbnQsIGFuZCBvcHRpb25hbGx5IGFueSBjb21wb25lbnQKKyAgICAgKiBkb3duc3RyZWFtLgorICAgICAqCisgICAgICogXHRvZG8gZGVmaW5lIHRoaXM6IHdlIGNvdWxkIGZsdXNoIGFsbCB3b3JrIGJlZm9yZSBsYXN0IGl0ZW0gcXVldWVkIGZvciBjb21wb25lbnQgYWNyb3NzIGFsbAorICAgICAqICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzIGxpbmtlZCB0byB0aGlzOyBmbHVzaCBvbmx5IHdvcmsgaXRlbXMgdGhhdCBhcmUgcXVldWVkIHRvIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50CisgICAgICogXHRvZG8gcmV0dXJuIHdvcmsgIyBvZiBsYXN0IGZsdXNoZWQgaXRlbTsgb3IgYWxsIGZsdXNoZWQgKGJ1dCBub3QgcmV0dXJuZWQgaXRlbXMpCisgICAgICogXHRvZG8gd2UgY291bGQgbWFrZSBmbHVzaCB0YWtlIGEgd29yayBpdGVtIGFuZCBmbHVzaCBhbGwgd29yayBiZWZvcmUvYWZ0ZXIgdGhhdCBpdGVtIHRvIGFsbG93CisgICAgICogICAgICAgVEJEIChzbGljaW5nL3NlZWs/KQorICAgICAqIFx0b2RvIHdlIGNvdWxkIHNpbXBseSB0YWtlIGEgbGlzdCBvZiBudW1iZXJzIGFuZCBmbHVzaCB0aG9zZS4uLiB0aGlzIGlzIGJhZCBmb3IgZGVjb2RlcnMKKyAgICAgKiAgICAgICBhbHNvLCB3aGF0IHdvdWxkIGhhcHBlbiB0byBmaW5lIGdyYWRlIHJlZmVyZW5jZXM/CisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBydW5uaW5nIChpbmNsdWRpbmcgdHJpcHBlZCBhbmQgZXJyb3IpIHN0YXRlcy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IG11c3QgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBXb3JrIHRoYXQgY291bGQgYmUgaW1tZWRpYXRlbHkgYWJhbmRvbmVkL2Rpc2NhcmRlZCBTSEFMTCBiZSByZXR1cm5lZCBpbiB8Zmx1c2hlZFdvcmt8OyB0aGlzCisgICAgICogY2FuIGJlIGRvbmUgaW4gYW4gYXJiaXRyYXJ5IG9yZGVyLgorICAgICAqCisgICAgICogV29yayB0aGF0IGNvdWxkIG5vdCBiZSBhYmFuZG9uZWQgb3IgZGlzY2FyZGVkIGltbWVkaWF0ZWx5IFNIQUxMIGJlIG1hcmtlZCB0byBiZQorICAgICAqIGRpc2NhcmRlZCBhdCB0aGUgZWFybGllc3Qgb3Bwb3J0dW5pdHksIGFuZCBTSEFMTCBiZSByZXR1cm5lZCB2aWEgdGhlIG9uV29ya0RvbmUoKSBjYWxsYmFjay4KKyAgICAgKiBUaGlzIHNoYWxsIGJlIGNvbXBsZXRlZCB3aXRoaW4gNTAwbXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gbW9kZSBmbHVzaCBtb2RlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgY29tcG9uZW50IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBmbHVzaGVkCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHN0b3BwZWQgb3IgcmVsZWFzZWQgc3RhdGUgKHVzZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIGZsdXNoIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgZmx1c2hpbmcgZnJvbSBjb21wbGV0aW9uICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmx1c2hfc20oZmx1c2hfbW9kZV90IG1vZGUsIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGZsdXNoZWRXb3JrKSA9IDA7CisKKyAgICBlbnVtIGRyYWluX21vZGVfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgLy8vIGRyYWluIGNvbXBvbmVudCBvbmx5IGFuZCBhZGQgYW4gImVuZC1vZi1zdHJlYW0iIG1hcmtlci4gQ29tcG9uZW50IHNoYWxsIHByb2Nlc3MgYWxsCisgICAgICAgIC8vLyBxdWV1ZWQgd29yayBhbmQgY29tcGxldGUgdGhlIGN1cnJlbnQgc3RyZWFtLiBJZiBuZXcgaW5wdXQgaXMgcmVjZWl2ZWQsIGl0IHNoYWxsIHN0YXJ0CisgICAgICAgIC8vLyBhIG5ldyBzdHJlYW0uIFx0b2RvIGRlZmluZSB3aGF0IGEgc3RyZWFtIGlzLgorICAgICAgICBEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsCisgICAgICAgIC8vLyBkcmFpbiBjb21wb25lbnQgd2l0aG91dCBzZXR0aW5nICJlbmQtb2Ytc3RyZWFtIiBtYXJrZXIuIENvbXBvbmVudCBzaGFsbCBwcm9jZXNzIGFsbAorICAgICAgICAvLy8gcXVldWVkIHdvcmsgYnV0IHNoYWxsIGV4cGVjdCBtb3JlIHdvcmsgaXRlbXMgZm9yIHRoZSBzYW1lIHN0cmVhbS4KKyAgICAgICAgRFJBSU5fQ09NUE9ORU5UX05PX0VPUyA9ICgxIDw8IDApLAorCisgICAgICAgIC8vLyBtYXJrcyB0aGUgbGFzdCB3b3JrIGl0ZW0gd2l0aCBhIHBlcnNpc3RlbnQgImVuZC1vZi1zdHJlYW0iIG1hcmtlciB0aGF0IHdpbGwgZHJhaW4KKyAgICAgICAgLy8vIGRvd25zdHJlYW0gY29tcG9uZW50cworICAgICAgICAvLy8gXHRvZG8gdGhpcyBtYXkgY29uZnVzZSB3b3JrLW9yZGVyaW5nIGRvd25zdHJlYW0KKyAgICAgICAgRFJBSU5fQ0hBSU4gPSAoMSA8PCAxNiksCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFx0b2RvIGRlZmluZSB0aGlzOyB3ZSBjb3VsZCBwbGFjZSBFT1MgdG8gYWxsIHVwc3RyZWFtIGNvbXBvbmVudHMsIGp1c3QgdGhpcyBjb21wb25lbnQsIG9yCisgICAgICAgICAqICAgICAgIGFsbCB1cHN0cmVhbSBhbmQgZG93bnN0cmVhbSBjb21wb25lbnQuCisgICAgICAgICAqIFx0b2RvIHNob3VsZCBFT1MgY2Fycnkgb3ZlciB0byBkb3duc3RyZWFtIGNvbXBvbmVudHM/CisgICAgICAgICAqLworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBEcmFpbnMgdGhlIGNvbXBvbmVudCwgYW5kIG9wdGlvbmFsbHkgZG93bnN0cmVhbSBjb21wb25lbnRzLiBUaGlzIGlzIGEgc2lnbmFsbGluZyBtZXRob2Q7CisgICAgICogYXMgc3VjaCBpdCBkb2VzIG5vdCB3YWl0IGZvciBhbnkgd29yayBjb21wbGV0aW9uLgorICAgICAqCisgICAgICogTWFya3MgbGFzdCB3b3JrIGl0ZW0gYXMgImRyYWluLXRpbGwtaGVyZSIsIHNvIGNvbXBvbmVudCBpcyBub3RpZmllZCBub3QgdG8gd2FpdCBmb3IgZnVydGhlcgorICAgICAqIHdvcmsgYmVmb3JlIGl0IHByb2Nlc3NlcyB3b3JrIGFscmVhZHkgcXVldWVkLiBUaGlzIG1ldGhvZCBjYW4gYWxzbyB1c2VkIHRvIHNldCB0aGUKKyAgICAgKiBlbmQtb2Ytc3RyZWFtIGZsYWcgYWZ0ZXIgd29yayBoYXMgYmVlbiBxdWV1ZWQuIENsaWVudCBjYW4gY29udGludWUgdG8gcXVldWUgZnVydGhlciB3b3JrCisgICAgICogaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcyBtZXRob2QgcmV0dXJucy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIHJ1bm5pbmcgKGluY2x1ZGluZyB0cmlwcGVkKSBzdGF0ZXMuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFdvcmsgdGhhdCBpcyBjb21wbGV0ZWQgU0hBTEwgYmUgcmV0dXJuZWQgdmlhIHRoZSBvbldvcmtEb25lKCkgY2FsbGJhY2suCisgICAgICoKKyAgICAgKiBccGFyYW0gbW9kZSBkcmFpbiBtb2RlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgZHJhaW4gcmVxdWVzdCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcmVjb3JkZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB3aGVuIGNhbGxlZCBpbiB0aGUgc3RvcHBlZCBvciByZWxlYXNlZCBzdGF0ZSAodXNlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSB0aGUgZHJhaW4gbW9kZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjb21wb25lbnQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBcdG9kbyBkZWZpbmUgc3VwcG9ydGVkIG1vZGVzIGRpc2NvdmVyeQorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBmbHVzaCBjb3VsZCBub3QgYmUgY29tcGxldGVkIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIGZsdXNoaW5nIGZyb20gY29tcGxldGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGRyYWluX25iKGRyYWluX21vZGVfdCBtb2RlKSA9IDA7CisKKyAgICAvLyBTVEFURSBDSEFOR0UgTUVUSE9EUworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgLyoqCisgICAgICogU3RhcnRzIHRoZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBzdG9wcGVkIHN0YXRlLCBhcyB3ZWxsIGFzIGR1cmluZyB0aGUgdHJpcHBlZCBzdGF0ZS4KKyAgICAgKgorICAgICAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgQzJfT0ssIHRoZSBjb21wb25lbnQgc2hhbGwgYmUgaW4gdGhlIHJ1bm5pbmcgc3RhdGUuCisgICAgICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBDMl9CQURfU1RBVEUgb3IgQzJfRFVQTElDQVRFLCBubyBzdGF0ZSBjaGFuZ2UgaXMgZXhwZWN0ZWQgYXMgYQorICAgICAqIHJlc3BvbnNlIHRvIHRoaXMgY2FsbC4KKyAgICAgKiBPdGhlcndpc2UsIHRoZSBjb21wb25lbnQgc2hhbGwgYmUgaW4gdGhlIHN0b3BwZWQgc3RhdGUuCisgICAgICoKKyAgICAgKiBcbm90ZSBJZiBhIGNvbXBvbmVudCBpcyBpbiB0aGUgdHJpcHBlZCBzdGF0ZSBhbmQgc3RhcnQoKSBpcyBjYWxsZWQgd2hpbGUgdGhlIGNvbXBvbmVudAorICAgICAqIGNvbmZpZ3VyYXRpb24gc3RpbGwgcmVzdWx0cyBpbiBhIHRyaXAsIHN0YXJ0IHNoYWxsIHN1Y2NlZWQgYW5kIGEgbmV3IG9uVHJpcHBlZCBjYWxsYmFjaworICAgICAqIHNob3VsZCBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHRoZSBjb25maWd1cmF0aW9uIGNvbmZsaWN0IHRoYXQgcmVzdWx0cyBpbiB0aGUgbmV3IHRyaXAuCisgICAgICoKKyAgICAgKiBcdG9kbyBUaGlzIG1ldGhvZCBNVVNUIHJldHVybiB3aXRoaW4gNTAwbXMuIFNlZW1zIHRoaXMgc2hvdWxkIGJlIGFibGUgdG8gcmV0dXJuIHF1aWNrbHksIGFzCisgICAgICogdGhlcmUgYXJlIG5vIGltbWVkaWF0ZSBndWFyYW50ZWVzLiBUaG91Z2ggdGhlcmUgYXJlIGd1YXJhbnRlZXMgZm9yIHJlc3BvbnNpdmVuZXNzIGltbWVkaWF0ZWx5CisgICAgICogYWZ0ZXIgc3RhcnQgcmV0dXJucy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgaGFzIHN0YXJ0ZWQgKG9yIHJlc3VtZWQpIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfRFVQTElDQVRFIHdoZW4gY2FsbGVkIGR1cmluZyBhbm90aGVyIHN0YXJ0IGNhbGwgZnJvbSBhbm90aGVyIHRocmVhZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIGFueSBzdGF0ZSBvdGhlciB0aGFuIHRoZSBzdG9wcGVkIHN0YXRlIG9yIHRyaXBwZWQgc3RhdGUsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgaW5jbHVkaW5nIHdoZW4gY2FsbGVkIGR1cmluZyBhbm90aGVyIHN0YXRlIGNoYW5nZSBjYWxsIGZyb20gYW5vdGhlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRocmVhZCAodXNlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBzdGFydCB0aGUgY29tcG9uZW50CisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIGNvbXBvbmVudCBjb3VsZCBub3QgYmUgc3RhcnRlZCB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCBzdGFydGluZyB0aGUgY29tcG9uZW50ICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgc3RhcnQoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTdG9wcyB0aGUgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gcnVubmluZyAoaW5jbHVkaW5nIHRyaXBwZWQpIHN0YXRlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCByZXR1cm4gd2l0aGluZyA1MDBtcy4KKyAgICAgKgorICAgICAqIFVwb24gdGhpcyBjYWxsLCBhbGwgcGVuZGluZyB3b3JrIFNIQUxMIGJlIGFiYW5kb25lZCBhbmQgYWxsIGJ1ZmZlciByZWZlcmVuY2VzIFNIQUxMIGJlCisgICAgICogcmVsZWFzZWQuCisgICAgICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBDMl9CQURfU1RBVEUgb3IgQzJfRFVQTElDQVRFLCBubyBzdGF0ZSBjaGFuZ2UgaXMgZXhwZWN0ZWQgYXMgYQorICAgICAqIHJlc3BvbnNlIHRvIHRoaXMgY2FsbC4KKyAgICAgKiBGb3IgYWxsIG90aGVyIHJldHVybiB2YWx1ZXMsIHRoZSBjb21wb25lbnQgc2hhbGwgYmUgaW4gdGhlIHN0b3BwZWQgc3RhdGUuCisgICAgICoKKyAgICAgKiBcdG9kbyBzaG91bGQgdGhpcyByZXR1cm4gY29tcGxldGVkIHdvcmssIHNpbmNlIGNsaWVudCB3aWxsIGp1c3QgZnJlZSBpdD8gUGVyaGFwcyBqdXN0IHRvCisgICAgICogdmVyaWZ5IGFjY291bnRpbmcuCisgICAgICoKKyAgICAgKiBUaGlzIGRvZXMgbm90IGFsdGVyIGFueSBzZXR0aW5ncyBhbmQgdHVuaW5ncyB0aGF0IG1heSBoYXZlIHJlc3VsdGVkIGluIGEgdHJpcHBlZCBzdGF0ZS4KKyAgICAgKiAoSXMgdGhpcyBtYXRlcmlhbCBnaXZlbiB0aGUgZGVmaW5pdGlvbj8gUGVyaGFwcyBpbiBjYXNlIHdlIHdhbnQgdG8gc3RhcnQgYWdhaW4uKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCBoYXMgc3RhcnRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBccmV0dmFsIEMyX0RVUExJQ0FURSB3aGVuIGNhbGxlZCBkdXJpbmcgYW5vdGhlciBzdG9wIGNhbGwgZnJvbSBhbm90aGVyIHRocmVhZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIGFueSBzdGF0ZSBvdGhlciB0aGFuIHRoZSBydW5uaW5nIHN0YXRlLCBpbmNsdWRpbmcgd2hlbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCBkdXJpbmcgYW5vdGhlciBzdGF0ZSBjaGFuZ2UgY2FsbCBmcm9tIGFub3RoZXIgdGhyZWFkICh1c2VyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBjb21wb25lbnQgY291bGQgbm90IGJlIHN0b3BwZWQgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgc3RvcHBpbmcgdGhlIGNvbXBvbmVudCAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHN0b3AoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXNldHMgdGhlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFsbCAoaW5jbHVkaW5nIHRyaXBwZWQpIHN0YXRlcyBvdGhlciB0aGFuIHJlbGVhc2VkLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgZHVyaW5nIGFueSBvdGhlciBibG9ja2luZyBjYWxsLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCByZXR1cm4gd2l0aGluZyA1MDBtcy4KKyAgICAgKgorICAgICAqIEFmdGVyIHRoaXMgY2FsbCByZXR1cm5zIGFsbCB3b3JrIFNIQUxMIGJlIGFiYW5kb25lZCwgYWxsIGJ1ZmZlciByZWZlcmVuY2VzIFNIQUxMIGJlIHJlbGVhc2VkLgorICAgICAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgQzJfQkFEX1NUQVRFIG9yIEMyX0RVUExJQ0FURSwgbm8gc3RhdGUgY2hhbmdlIGlzIGV4cGVjdGVkIGFzIGEKKyAgICAgKiByZXNwb25zZSB0byB0aGlzIGNhbGwuCisgICAgICogRm9yIGFsbCBvdGhlciByZXR1cm4gdmFsdWVzLCB0aGUgY29tcG9uZW50IHNoYWxsIGJlIGluIHRoZSBzdG9wcGVkIHN0YXRlLgorICAgICAqCisgICAgICogXHRvZG8gc2hvdWxkIHRoaXMgcmV0dXJuIGNvbXBsZXRlZCB3b3JrLCBzaW5jZSBjbGllbnQgd2lsbCBqdXN0IGZyZWUgaXQ/IEFsc28sIGlmIGl0IHVuYmxvY2tzCisgICAgICogYSBzdG9wLCB3aGVyZSBzaG91bGQgY29tcGxldGVkIHdvcmsgYmUgcmV0dXJuZWQ/CisgICAgICoKKyAgICAgKiBUaGlzIGJyaW5ncyBzZXR0aW5ncyBiYWNrIHRvIHRoZWlyIGRlZmF1bHQgLSAiZ3VhcmFudGVlaW5nIiBubyB0cmlwcGVkIHNwYWNlLgorICAgICAqCisgICAgICogXHRvZG8gcmVjbGFpbSBzdXBwb3J0IC0gaXQgc2VlbXMgdGhhdCBzaW5jZSBvd25lcnNoaXAgaXMgcGFzc2VkLCB0aGlzIHdpbGwgYWxsb3cgcmVjbGFpbWluZworICAgICAqIHN0dWZmLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCBoYXMgYmVlbiByZXNldAorICAgICAqIFxyZXR2YWwgQzJfRFVQTElDQVRFIHdoZW4gY2FsbGVkIGR1cmluZyBhbm90aGVyIHJlc2V0IGNhbGwgZnJvbSBhbm90aGVyIHRocmVhZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSByZWxlYXNlZCBzdGF0ZQorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBjb21wb25lbnQgY291bGQgbm90IGJlIHJlc2V0IHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHJlc2V0dGluZyB0aGUgY29tcG9uZW50ICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVzZXQoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlcyB0aGUgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gc3RvcHBlZCBzdGF0ZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0dXJuIHdpdGhpbmcgNTAwbXMuIFVwb24gcmV0dXJuIGFsbCByZWZlcmVuY2VzIHNoYWxsIGJlIGFiYW5kb25lZC4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gcmVsZWFzZWQKKyAgICAgKiBccmV0dmFsIEMyX0RVUExJQ0FURSB0aGUgY29tcG9uZW50IGlzIGFscmVhZHkgcmVsZWFzZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB0aGUgY29tcG9uZW50IGlzIHJ1bm5pbmcKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgY29tcG9uZW50IGNvdWxkIG5vdCBiZSByZWxlYXNlZCB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCByZWxlYXNpbmcgdGhlIGNvbXBvbmVudCAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHJlbGVhc2UoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpbnRlcmZhY2UgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogXHJldHVybiB0aGUgY29tcG9uZW50IGludGVyZmFjZQorICAgICAqLworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmKCkgPSAwOworCisgICAgdmlydHVhbCB+QzJDb21wb25lbnQoKSA9IGRlZmF1bHQ7Cit9OworCitDMkVOVU0oQzJDb21wb25lbnQ6OmtpbmRfdCwgdWludDMyX3QsCisgICAgS0lORF9PVEhFUiwKKyAgICBLSU5EX0RFQ09ERVIsCisgICAgS0lORF9FTkNPREVSCispOworCitDMkVOVU0oQzJDb21wb25lbnQ6OmRvbWFpbl90LCB1aW50MzJfdCwKKyAgICBET01BSU5fT1RIRVIsCisgICAgRE9NQUlOX1ZJREVPLAorICAgIERPTUFJTl9BVURJTywKKyAgICBET01BSU5fSU1BR0UKKyk7CisKK2NsYXNzIEMyRnJhbWVJbmZvUGFyc2VyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBccmV0dXJuIHRoZSBjb250ZW50IHR5cGUgc3VwcG9ydGVkIGJ5IHRoaXMgaW5mbyBwYXJzZXIuCisgICAgICoKKyAgICAgKiBcdG9kbyB0aGlzIG1heSBiZSByZWR1bmRhbnQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIEMyU3RyaW5nTGl0ZXJhbCBnZXRUeXBlKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogXHJldHVybiBhIHZlY3RvciBvZiBzdXBwb3J0ZWQgcGFyYW1ldGVyIGluZGljZXMgcGFyc2VkIGJ5IHRoaXMgaW5mbyBwYXJzZXIuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFx0b2RvIHN0aWNreSB2cy4gbm9uLXN0aWNreSBwYXJhbXM/IHRoaXMgbWF5IGJlIGNvbW11bmljYXRlZCBieSBwYXJhbS1yZWZsZWN0b3IuCisgICAgICovCisgICAgdmlydHVhbCBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gZ2V0UGFyc2VkUGFyYW1zKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoaXMgaW5mbyBwYXJzZXIuIFRoaXMgYnJpbmdzIHRoaXMgcGFyc2VyIHRvIGl0cyBpbml0aWFsIHN0YXRlIGFmdGVyIGNyZWF0aW9uLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgaW5mbyBwYXJzZXIgd2FzIHJlc2V0CisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IHJlc2V0IHRoZSBwYXJzZXIgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHJlc2V0dGluZyBvZiB0aGUgcGFyc2VyICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVzZXQoKSB7IHJldHVybiBDMl9PSzsgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBwYXJzZUZyYW1lKEMyRnJhbWVEYXRhICZmcmFtZSk7CisKKyAgICB2aXJ0dWFsIH5DMkZyYW1lSW5mb1BhcnNlcigpID0gZGVmYXVsdDsKK307CisKK2NsYXNzIEMyQWxsb2NhdG9yU3RvcmUgeworcHVibGljOgorICAgIHR5cGVkZWYgQzJBbGxvY2F0b3I6OmlkX3QgaWRfdDsKKworICAgIGVudW0gOiBDMkFsbG9jYXRvcjo6aWRfdCB7CisgICAgICAgIERFRkFVTFRfTElORUFSLCAgICAgLy8vPCBiYXNpYyBsaW5lYXIgYWxsb2NhdG9yIHR5cGUKKyAgICAgICAgREVGQVVMVF9HUkFQSElDLCAgICAvLy88IGJhc2ljIGdyYXBoaWMgYWxsb2NhdG9yIHR5cGUKKyAgICAgICAgUExBVEZPUk1fU1RBUlQgPSAweDEwLAorICAgICAgICBWRU5ET1JfU1RBUlQgICA9IDB4MTAwLAorICAgICAgICBCQURfSUQgICAgICAgICA9IEMyQWxsb2NhdG9yOjpCQURfSUQsIC8vLzwgRE8gTk9UIFVTRQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB1bmlxdWUgbmFtZSBvZiB0aGlzIGFsbG9jYXRvciBzdG9yZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIGFsbG9jYXRvciBzdG9yZS4KKyAgICAgKiBccmV0dmFsIGFuIGVtcHR5IHN0cmluZyBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgdGhlIGFjdHVhbCBuYW1lLgorICAgICAqLworICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBhbGxvY2F0b3JzIHN1cHBvcnRlZCBieSB0aGlzIGFsbG9jYXRvciBzdG9yZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHJldHZhbCB2ZWN0b3Igb2YgYWxsb2NhdG9yIGluZm9ybWF0aW9uIChhcyBzaGFyZWQgcG9pbnRlcnMpCisgICAgICogXHJldHZhbCBhbiBlbXB0eSB2ZWN0b3IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSB3aG9sZSB2ZWN0b3IuCisgICAgICovCisgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJBbGxvY2F0b3I6OlRyYWl0cz4+IGxpc3RBbGxvY2F0b3JzX25iKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzL2NyZWF0ZXMgYSBzaGFyZWQgYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBUaGUgYWxsb2NhdG9yIGlzIGNyZWF0ZWQgb24gZmlyc3QgdXNlLCBhbmQgdGhlIHNhbWUgYWxsb2NhdG9yIGlzIHJldHVybmVkIG9uIHN1YnNlcXVlbnQKKyAgICAgKiBjb25jdXJyZW50IHVzZXMgaW4gdGhlIHNhbWUgcHJvY2Vzcy4gVGhlIGFsbG9jYXRvciBpcyBmcmVlZCB3aGVuIGl0IGlzIG5vIGxvbmdlciByZWZlcmVuY2VkLgorICAgICAqCisgICAgICogXHBhcmFtIGlkICAgICAgdGhlIElEIG9mIHRoZSBhbGxvY2F0b3IgdG8gY3JlYXRlLiBUaGlzIGlzIGRlZmluZWQgYnkgdGhlIHN0b3JlLCBidXQKKyAgICAgKiAgICAgICAgICAgICAgICB0aGUgSUQgb2YgdGhlIGRlZmF1bHQgbGluZWFyIGFuZCBncmFwaGljIGFsbG9jYXRvcnMgaXMgZm9ybWFsaXplZC4KKyAgICAgKiBccGFyYW0gYWxsb2NhdG9yIHNoYXJlZCBwb2ludGVyIHdoZXJlIHRoZSBjcmVhdGVkIGFsbG9jYXRvciBpcyBzdG9yZWQuIENsZWFyZWQgb24gZmFpbHVyZQorICAgICAqICAgICAgICAgICAgICAgICAgYW5kIHVwZGF0ZWQgb24gc3VjY2Vzcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBhbGxvY2F0b3Igd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IGNyZWF0ZSB0aGUgYWxsb2NhdG9yIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBjcmVhdGlvbiBvZiB0aGUgYWxsb2NhdG9yICh1bmV4cGVjdGVkKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgbm8gc3VjaCBhbGxvY2F0b3IKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgdGhlIGFsbG9jYXRvcgorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hBbGxvY2F0b3IoaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiogY29uc3QgYWxsb2NhdG9yKSA9IDA7CisKKyAgICB2aXJ0dWFsIH5DMkFsbG9jYXRvclN0b3JlKCkgPSBkZWZhdWx0OworfTsKKworY2xhc3MgQzJDb21wb25lbnRTdG9yZSB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIGNvbXBvbmVudCBvciBjb21wb25lbnQgaW50ZXJmYWNlIG9iamVjdC4KKyAgICAgKiBUaGlzIGlzIGEgdW5pcXVlIG5hbWUgZm9yIHRoaXMgY29tcG9uZW50IG9yIGNvbXBvbmVudCBpbnRlcmZhY2UgJ2NsYXNzJzsgaG93ZXZlciwgbXVsdGlwbGUKKyAgICAgKiBpbnN0YW5jZXMgb2YgdGhpcyBjb21wb25lbnQgU0hBTEwgaGF2ZSB0aGUgc2FtZSBuYW1lLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IHN0YXRlLiBUaGlzIGNhbGwgZG9lcyBub3QgY2hhbmdlIHRoZSBzdGF0ZSBub3IgdGhlCisgICAgICogaW50ZXJuYWwgc3RhdGVzIG9mIHRoZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBjb21wb25lbnQgb3IgY29tcG9uZW50IGludGVyZmFjZSBvYmplY3QuCisgICAgICogXHJldHZhbCBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSBhY3R1YWwgbmFtZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiAxMDBtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBuYW1lICAgICAgICAgIG5hbWUgb2YgdGhlIGNvbXBvbmVudCB0byBjcmVhdGUKKyAgICAgKiBccGFyYW0gY29tcG9uZW50ICAgICBzaGFyZWQgcG9pbnRlciB3aGVyZSB0aGUgY3JlYXRlZCBjb21wb25lbnQgaXMgc3RvcmVkLiBDbGVhcmVkIG9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZSBhbmQgdXBkYXRlZCBvbiBzdWNjZXNzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3QgY3JlYXRlIHRoZSBjb21wb25lbnQgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIGNyZWF0aW9uIG9mIHRoZSBjb21wb25lbnQgKHVuZXhwZWN0ZWQpCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCBubyBzdWNoIGNvbXBvbmVudAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSB0aGUgY29tcG9uZW50CisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBDMlN0cmluZyBuYW1lLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQpID0gMDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBjb21wb25lbnQgaW50ZXJmYWNlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiAxMDBtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBuYW1lICAgICAgICAgIG5hbWUgb2YgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2UgdG8gY3JlYXRlCisgICAgICogXHBhcmFtIGludGVyZmFjZSAgICAgc2hhcmVkIHBvaW50ZXIgd2hlcmUgdGhlIGNyZWF0ZWQgaW50ZXJmYWNlIGlzIHN0b3JlZAorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2Ugd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IGNyZWF0ZSB0aGUgY29tcG9uZW50IGludGVyZmFjZSB3aXRoaW4gdGhlIHRpbWUgbGltaXQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBjcmVhdGlvbiBvZiB0aGUgY29tcG9uZW50IGludGVyZmFjZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh1bmV4cGVjdGVkKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgbm8gc3VjaCBjb21wb25lbnQgaW50ZXJmYWNlCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIHRoZSBjb21wb25lbnQgaW50ZXJmYWNlCisgICAgICoKKyAgICAgKiBcdG9kbyBEbyB3ZSBuZWVkIGFuIGludGVyZmFjZSwgb3IgY291bGQgdGhpcyBqdXN0IGJlIGEgY29tcG9uZW50IHRoYXQgaXMgbmV2ZXIgc3RhcnRlZD8KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIEMyU3RyaW5nIG5hbWUsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSkgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBjb21wb25lbnRzIHN1cHBvcnRlZCBieSB0aGlzIGNvbXBvbmVudCBzdG9yZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0dXJuIHdpdGhpbiA1MDBtcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgdmVjdG9yIG9mIGNvbXBvbmVudCBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPj4gbGlzdENvbXBvbmVudHMoKSA9IDA7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVVElMSVRZIE1FVEhPRFMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vIG9uLWRlbWFuZCBidWZmZXIgbGF5b3V0IGNvbnZlcnNpb24gKHN3aXp6bGluZykKKyAgICAvLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29weUJ1ZmZlcigKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+IHNyYywgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gZHN0KSA9IDA7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDT05GSUdVUkFUSU9OIEFQSSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIGUuZy4gZm9yIGdsb2JhbCBzZXR0aW5ncyAoc3lzdGVtLXdpZGUgc3RyaWRlLCBldGMuKQorCisgICAgLyoqCisgICAgICogUXVlcmllcyBhIHNldCBvZiBzeXN0ZW0td2lkZSBwYXJhbWV0ZXJzLgorICAgICAqIFF1ZXJ5aW5nIGlzIHBlcmZvcm1lZCBhdCBiZXN0IGVmZm9ydDogdGhlIHN0b3JlIFNIQUxMIHF1ZXJ5IGFsbCBzdXBwb3J0ZWQgcGFyYW1ldGVycyBhbmQKKyAgICAgKiBza2lwIHVuc3VwcG9ydGVkIG9uZXMsIG9yIGhlYXAgYWxsb2NhdGVkIHBhcmFtZXRlcnMgdGhhdCBjb3VsZCBub3QgYmUgYWxsb2NhdGVkLiBBbnkgZXJyb3JzCisgICAgICogYXJlIGNvbW11bmljYXRlZCBpbiB0aGUgcmV0dXJuIHZhbHVlLiBBZGRpdGlvbmFsbHksIHByZWFsbG9jYXRlZCAoZS5nLiBzdGFjaykgcGFyYW1ldGVycyB0aGF0CisgICAgICogY291bGQgbm90IGJlIHF1ZXJpZWQgYXJlIGludmFsaWRhdGVkLiBQYXJhbWV0ZXJzIHRvIGJlIGFsbG9jYXRlZCBvbiB0aGUgaGVhcCBhcmUgb21pdHRlZCBmcm9tCisgICAgICogdGhlIHJlc3VsdC4KKyAgICAgKgorICAgICAqIFxub3RlIFBhcmFtZXRlciB2YWx1ZXMgZG8gbm90IGRlcGVuZCBvbiB0aGUgb3JkZXIgb2YgcXVlcnkuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgbW9tZW50YXJpbHkgYmxvY2tpbmcsIGJ1dCBNVVNUIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAqCisgICAgICogXHBhcmFtIHN0YWNrUGFyYW1zICAgYSBsaXN0IG9mIHBhcmFtcyBxdWVyaWVkLiBUaGVzZSBhcmUgaW5pdGlhbGl6ZWQgc3BlY2lmaWMgdG8gZWFjaAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmc7IGUuZy4gc2l6ZSBhbmQgaW5kZXggYXJlIHNldCBhbmQgcmVzdCBvZiB0aGUgbWVtYmVycyBhcmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBjbGVhcmVkLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIE5PVEU6IEZsZXhpYmxlIHNldHRpbmdzIHRoYXQgYXJlIG9mIGluY29ycmVjdCBzaXplIHdpbGwgYmUgaW52YWxpZGF0ZWQuCisgICAgICogXHBhcmFtIGhlYXBQYXJhbUluZGljZXMgYSB2ZWN0b3Igb2YgcGFyYW0gaW5kaWNlcyBmb3IgcGFyYW1zIHRvIGJlIHF1ZXJpZWQgYW5kIHJldHVybmVkIG9uIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGhlYXAuIFRoZXNlIHBhcmFtZXRlcnMgd2lsbCBiZSByZXR1cm5lZCBpbiBoZWFwUGFyYW1zLiBVbnN1cHBvcnRlZCBwYXJhbQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGluZGljZXMgd2lsbCBiZSBpZ25vcmVkLgorICAgICAqIFxwYXJhbSBoZWFwUGFyYW1zICAgIGEgbGlzdCBvZiBwYXJhbXMgd2hlcmUgdG8gd2hpY2ggdGhlIHN1cHBvcnRlZCBoZWFwIHBhcmFtZXRlcnMgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZGVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiBoZWFwUGFyYW1JbmRpY2VzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgYWxsIHBhcmFtZXRlcnMgY291bGQgYmUgcXVlcmllZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIGFsbCBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBiZSBxdWVyaWVkLCBidXQgc29tZSBwYXJhbWV0ZXJzIHdlcmUgbm90CisgICAgICogICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYSBzdXBwb3J0ZWQgcGFyYW1ldGVyCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgcXVlcnlpbmcgb2YgdGhlIHBhcmFtZXRlcnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5X3NtKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFNldHMgYSBzZXQgb2Ygc3lzdGVtLXdpZGUgcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIFxub3RlIFRoZXJlIGFyZSBubyBzZXR0YWJsZSBzeXN0ZW0td2lkZSBwYXJhbWV0ZXJzIGRlZmluZWQgdGh1cyBmYXIsIGJ1dCBtYXkgYmUgYWRkZWQgaW4gdGhlCisgICAgICogZnV0dXJlLgorICAgICAqCisgICAgICogVHVuaW5nIGlzIHBlcmZvcm1lZCBhdCBiZXN0IGVmZm9ydDogdGhlIHN0b3JlIFNIQUxMIHVwZGF0ZSBhbGwgc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb24gYXQKKyAgICAgKiBiZXN0IGVmZm9ydCAodW5sZXNzIGNvbmZpZ3VyZWQgb3RoZXJ3aXNlKSBhbmQgc2tpcCB1bnN1cHBvcnRlZCBvbmVzLiBBbnkgZXJyb3JzIGFyZQorICAgICAqIGNvbW11bmljYXRlZCBpbiB0aGUgcmV0dXJuIHZhbHVlIGFuZCBpbiB8ZmFpbHVyZXN8LgorICAgICAqCisgICAgICogXG5vdGUgUGFyYW1ldGVyIHR1bmluZyBET0VTIGRlcGVuZCBvbiB0aGUgb3JkZXIgb2YgdGhlIHR1bmluZyBwYXJhbWV0ZXJzLiBFLmcuIHNvbWUgcGFyYW1ldGVyCisgICAgICogdXBkYXRlIG1heSBhbGxvdyBzb21lIHN1YnNlcXVlbnQgcGFyYW1ldGVyIHVwZGF0ZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IE1VU1QgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW1zICAgICAgICBhIGxpc3Qgb2YgcGFyYW1ldGVyIHVwZGF0ZXMuIFRoZXNlIHdpbGwgYmUgdXBkYXRlZCB0byB0aGUgYWN0dWFsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIHZhbHVlcyBhZnRlciB0aGUgdXBkYXRlcyAodGhpcyBpcyBiZWNhdXNlIHR1bmluZyBpcyBwZXJmb3JtZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhdCBiZXN0IGVmZm9ydCkuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgXHRvZG8gcGFyYW1zIHRoYXQgY291bGQgbm90IGJlIHVwZGF0ZWQgYXJlIG5vdCBtYXJrZWQgaGVyZSwgc28gYXJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgY29uZnVzaW5nIC0gYXJlIHRoZXkgImV4aXN0aW5nIiB2YWx1ZXMgb3IgaW50ZW5kZWQgdG8gYmUgY29uZmlndXJlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz8KKyAgICAgKiBccGFyYW0gZmFpbHVyZXMgICAgICBhIGxpc3Qgb2YgcGFyYW1ldGVyIGZhaWx1cmVzCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICBhbGwgcGFyYW1ldGVycyBjb3VsZCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIGFsbCBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSwgYnV0IHNvbWUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIHdlcmUgbm90IHN1cHBvcnRlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHNvbWUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgY291bGQgbm90IGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IGJlY2F1c2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGV5IGNvbnRhaW5lZCB1bnN1cHBvcnRlZCB2YWx1ZXMuIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB8ZmFpbHVyZXN8LgorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIHNvbWUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgY291bGQgbm90IGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IGJlY2F1c2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGV5IGNvbnRhaW5lZCB1bnN1cHBvcnRlZCB2YWx1ZXMsIGJ1dCBjb3VsZCBub3QgYWxsb2NhdGUgYSBmYWlsdXJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IGZvciB0aGVtLgorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHVwZGF0ZSBvZiB0aGUgcGFyYW1ldGVycworICAgICAqICAgICAgICAgICAgICAgICAgICAgICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnX3NtKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSA9IDA7CisKKyAgICAvLyBSRUZMRUNUSU9OIE1FQ0hBTklTTSAoVVNFRCBGT1IgRVhURU5TSU9OKQorICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcGFyYW1ldGVyIHJlZmxlY3Rvci4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgdXNlZCB0byBkZXNjcmliZSBwYXJhbWV0ZXIgZmllbGRzLiBUaGlzIGlzIHNoYXJlZCBmb3IgYWxsIGNvbXBvbmVudHMgY3JlYXRlZCBieQorICAgICAqIHRoaXMgY29tcG9uZW50IHN0b3JlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgc2hhcmVkIHBhcmFtZXRlciByZWZsZWN0b3Igb2JqZWN0LgorICAgICAqLworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IGdldFBhcmFtUmVmbGVjdG9yKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2V0IG9mIHN1cHBvcnRlZCBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccGFyYW1bb3V0XSBwYXJhbXMgYSB2ZWN0b3Igb2Ygc3VwcG9ydGVkIHBhcmFtZXRlcnMgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGlzIHZlY3Rvci4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSB0aGlzIG1ldGhvZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKiBjb25zdCBwYXJhbXMpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgc3VwcG9ydGVkIHZhbHVlcyBmb3IgdGhlIHF1ZXJpZWQgZmllbGRzLgorICAgICAqCisgICAgICogQ2xpZW50IFNIQUxMIHNldCB0aGUgcGFyYW1ldGVyLWZpZWxkIHNwZWNpZmllciBhbmQgdGhlIHR5cGUgb2Ygc3VwcG9ydGVkIHZhbHVlcyBxdWVyeSAoZS5nLgorICAgICAqIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzLCBvciBwb3RlbnRpYWwgc3VwcG9ydGVkIHZhbHVlcykgaW4gZmllbGRzLgorICAgICAqIFVwb24gcmV0dXJuIHRoZSBzdG9yZSBTSEFMTCBmaWxsIGluIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGZvciB0aGUgZmllbGRzIGxpc3RlZCBhcyB3ZWxsCisgICAgICogYXMgYSBzdGF0dXMgZm9yIGVhY2ggZmllbGQuIFN0b3JlIHNoYWxsIHByb2Nlc3MgYWxsIGZpZWxkcyBxdWVyaWVkIGV2ZW4gaWYgc29tZSBxdWVyaWVzCisgICAgICogZmFpbC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IE1VU1QgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBccGFyYW1baW4gb3V0XSBmaWVsZHMgYSB2ZWN0b3Igb2YgZmllbGRzIGRlc2NyaXB0b3Igc3RydWN0dXJlcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCBhdCBsZWFzdCBvbmUgZmllbGQgd2FzIG5vdCByZWNvZ25pemVkIGFzIGEgY29tcG9uZW50IHN0b3JlIGZpZWxkCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlc19zbSgKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcykgY29uc3QgPSAwOworCisgICAgdmlydHVhbCB+QzJDb21wb25lbnRTdG9yZSgpID0gZGVmYXVsdDsKK307CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLy8gQH0KKworI2VuZGlmICAvLyBDMkNPTVBPTkVOVF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkNvbmZpZy5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMWY2Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQ29uZmlnLmgKQEAgLTAsMCArMSwyMjE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMkNPTkZJR19IXworI2RlZmluZSBDMkNPTkZJR19IXworCisjaW5jbHVkZSA8QzIuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyRW51bS5oPgorI2luY2x1ZGUgPEMyUGFyYW1EZWYuaD4KKworLy8vIFxkZWZncm91cCBjb25maWcgQ29tcG9uZW50IGNvbmZpZ3VyYXRpb24KKy8vLyBAeworCisvKioKKyAqIEVudW1lcmF0ZWQgYm9vbGVhbi4KKyAqLworQzJFTlVNKGMyX2Jvb2xfdCwgdWludDMyX3QsCisgICAgQzJfRkFMU0UsIC8vLzwgdHJ1ZQorICAgIEMyX1RSVUUsICAvLy88IGZhbHNlCispCisKK3R5cGVkZWYgQzJTaW1wbGVWYWx1ZVN0cnVjdDxjMl9ib29sX3Q+IEMyQm9vbFZhbHVlOworCit0eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJFYXN5RW51bTxjMl9ib29sX3Q+PiBDMkVhc3lCb29sVmFsdWU7CisKKy8qKgorICogRW51bWVyYXRlZCBzZXQgdHJpLXN0YXRlLgorICoKKyAqIFVzZWQgZm9yIG9wdGlvbmFsIGNvbmZpZ3VyYXRpb25zIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdmFsdWVzIHNldCBieSB0aGUgY2xpZW50LAorICogZGVmYXVsdCB2YWx1ZXMgc2V0IGJ5IHRoZSBjb21wb25lbnQsIG9yIHVuc2V0IHZhbHVlcy4KKyAqLworQzJFTlVNKGMyX3NldF90LCB1aW50MzJfdCwKKyAgICBDMl9VTlNFVCwgICAvLyBwYXJhbWV0ZXIgaXMgdW5zZXQgYW5kIGhhcyBubyB2YWx1ZQorICAgIEMyX1NFVCwgICAgIC8vIHBhcmFtZXRlciBpcy9oYXMgYmVlbiBzZXQgYnkgdGhlIGNsaWVudAorICAgIEMyX0RFRkFVTFQsIC8vIHBhcmFtZXRlciBoYXMgbm90IGJlZW4gc2V0IGJ5IHRoZSBjbGllbnQsIGJ1dCBpcyBzZXQgYnkgdGhlIGNvbXBvbmVudAorKQorCisvKiogRW51bWVyYXRpb25zIHVzZWQgYnkgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovCitzdHJ1Y3QgQzJDb25maWcgeworICAgIGVudW0gYWFjX3BhY2thZ2luZ190IDogdWludDMyX3Q7ICAgICAgICAvLy88IEFBQyBwYWNrYWdpbmcgKFJBVyB2cyBBRFRTKQorICAgIGVudW0gYWFjX3Nicl9tb2RlX3QgOiB1aW50MzJfdDsgICAgICAgICAvLy88IEFBQyBTQlIgbW9kZQorICAgIGVudW0gYXBpX2ZlYXR1cmVfdCA6IHVpbnQ2NF90OyAgICAgICAgICAvLy88IEFQSSBmZWF0dXJlcworICAgIGVudW0gYXBpX2xldmVsX3QgOiB1aW50MzJfdDsgICAgICAgICAgICAvLy88IEFQSSBsZXZlbAorICAgIGVudW0gYml0cmF0ZV9tb2RlX3QgOiB1aW50MzJfdDsgICAgICAgICAvLy88IGJpdHJhdGUgY29udHJvbCBtb2RlCisgICAgZW51bSBkcmNfY29tcHJlc3Npb25fbW9kZV90IDogaW50MzJfdDsgIC8vLzwgRFJDIGNvbXByZXNzaW9uIG1vZGUKKyAgICBlbnVtIGRyY19lZmZlY3RfdHlwZV90IDogaW50MzJfdDsgICAgICAgLy8vPCBEUkMgZWZmZWN0IHR5cGUKKyAgICBlbnVtIGludHJhX3JlZnJlc2hfbW9kZV90IDogdWludDMyX3Q7ICAgLy8vPCBpbnRyYSByZWZyZXNoIG1vZGVzCisgICAgZW51bSBsZXZlbF90IDogdWludDMyX3Q7ICAgICAgICAgICAgICAgIC8vLzwgY29kaW5nIGxldmVsCisgICAgZW51bSBvcmRpbmFsX2tleV90IDogdWludDMyX3Q7ICAgICAgICAgIC8vLzwgd29yayBvcmRlcmluZyBrZXlzCisgICAgZW51bSBwY21fZW5jb2RpbmdfdCA6IHVpbnQzMl90OyAgICAgICAgIC8vLzwgUENNIGVuY29kaW5nCisgICAgZW51bSBwaWN0dXJlX3R5cGVfdCA6IHVpbnQzMl90OyAgICAgICAgIC8vLzwgcGljdHVyZSB0eXBlcworICAgIGVudW0gcGxhdGZvcm1fZmVhdHVyZV90IDogdWludDY0X3Q7ICAgICAvLy88IHBsYXRmb3JtIGZlYXR1cmVzCisgICAgZW51bSBwbGF0Zm9ybV9sZXZlbF90IDogdWludDMyX3Q7ICAgICAgIC8vLzwgcGxhdGZvcm0gbGV2ZWwKKyAgICBlbnVtIHByZXBlbmRfaGVhZGVyX21vZGVfdCA6IHVpbnQzMl90OyAgLy8vPCBwcmVwZW5kIGhlYWRlciBvcGVyYXRpb25hbCBtb2RlcworICAgIGVudW0gcHJvZmlsZV90IDogdWludDMyX3Q7ICAgICAgICAgICAgICAvLy88IGNvZGluZyBwcm9maWxlCisgICAgZW51bSBzY2FsaW5nX21ldGhvZF90IDogdWludDMyX3Q7ICAgICAgIC8vLzwgc2NhbGluZyBtZXRob2RzCisgICAgZW51bSBzY2FuX29yZGVyX3QgOiB1aW50MzJfdDsgICAgICAgICAgIC8vLzwgc2NhbiBvcmRlcnMKKyAgICBlbnVtIHNlY3VyZV9tb2RlX3QgOiB1aW50MzJfdDsgICAgICAgICAgLy8vPCBzZWN1cmUvcHJvdGVjdGVkIG1vZGVzCisgICAgZW51bSBzdXBwbGVtZW50YWxfaW5mb190IDogdWludDMyX3Q7ICAgIC8vLzwgc3VwcGxlbWVudGFsIGluZm9ybWF0aW9uIHR5cGVzCisgICAgZW51bSB0aWxpbmdfbW9kZV90IDogdWludDMyX3Q7ICAgICAgICAgIC8vLzwgdGlsaW5nIG1vZGVzCit9OworCituYW1lc3BhY2UgeworCitlbnVtIEMyUGFyYW1JbmRleEtpbmQgOiBDMlBhcmFtOjp0eXBlX2luZGV4X3QgeworICAgIEMyX1BBUkFNX0lOREVYX0lOVkFMSUQgICAgICAgICAgICAgPSAweDAsICAgIC8vLzwgZG8gbm90IHVzZQorICAgIEMyX1BBUkFNX0lOREVYX1NUUlVDVF9TVEFSVCAgICAgICAgPSAweDEsICAgIC8vLzwgc3RydWN0IG9ubHkgaW5kaWNlcworICAgIEMyX1BBUkFNX0lOREVYX1BBUkFNX1NUQVJUICAgICAgICAgPSAweDgwMCwgIC8vLzwgcmVndWxhciBwYXJhbWV0ZXJzCisgICAgQzJfUEFSQU1fSU5ERVhfQ09ERVJfUEFSQU1fU1RBUlQgICA9IDB4MTAwMCwgLy8vPCBlbi90cmFuc2NvZGVyIHBhcmFtZXRlcnMKKyAgICBDMl9QQVJBTV9JTkRFWF9QSUNUVVJFX1BBUkFNX1NUQVJUID0gMHgxODAwLCAvLy88IGltYWdlL3ZpZGVvIHBhcmFtZXRlcnMKKyAgICBDMl9QQVJBTV9JTkRFWF9WSURFT19QQVJBTV9TVEFSVCAgID0gMHgyMDAwLCAvLy88IHZpZGVvIHBhcmFtZXRlcnMKKyAgICBDMl9QQVJBTV9JTkRFWF9JTUFHRV9QQVJBTV9TVEFSVCAgID0gMHgyODAwLCAvLy88IGltYWdlIHBhcmFtZXRlcnMKKyAgICBDMl9QQVJBTV9JTkRFWF9BVURJT19QQVJBTV9TVEFSVCAgID0gMHgzMDAwLCAvLy88IGltYWdlIHBhcmFtZXRlcnMKKyAgICBDMl9QQVJBTV9JTkRFWF9QTEFURk9STV9TVEFSVCAgICAgID0gMHg0MDAwLCAvLy88IHBsYXRmb3JtLWRlZmluZWQgcGFyYW1ldGVycworCisgICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gc3RydWN0dXJlIGluZGljZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICAgIGtQYXJhbUluZGV4Q29sb3JYeSA9IEMyX1BBUkFNX0lOREVYX1NUUlVDVF9TVEFSVCwKKyAgICBrUGFyYW1JbmRleE1hc3RlcmluZ0Rpc3BsYXlDb2xvclZvbHVtZSwKKyAgICBrUGFyYW1JbmRleENocm9tYU9mZnNldCwKKyAgICBrUGFyYW1JbmRleEdvcExheWVyLAorCisgICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gcGFyYW1ldGVyIGluZGljZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICAgIGtQYXJhbUluZGV4QXBpTGV2ZWwgPSBDMl9QQVJBTV9JTkRFWF9QQVJBTV9TVEFSVCwKKyAgICBrUGFyYW1JbmRleEFwaUZlYXR1cmVzLAorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGFsbCBjb21wb25lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAgLyogZ2VuZXJpYyBjb21wb25lbnQgY2hhcmFjdGVyaXN0aWNzICovCisgICAga1BhcmFtSW5kZXhOYW1lLAorICAgIGtQYXJhbUluZGV4QWxpYXNlcywKKyAgICBrUGFyYW1JbmRleEtpbmQsCisgICAga1BhcmFtSW5kZXhEb21haW4sCisgICAga1BhcmFtSW5kZXhBdHRyaWJ1dGVzLAorICAgIGtQYXJhbUluZGV4VGltZVN0cmV0Y2gsCisKKyAgICAvKiBjb2RpbmcgY2hhcmFjdGVyaXN0aWNzICovCisgICAga1BhcmFtSW5kZXhQcm9maWxlTGV2ZWwsCisgICAga1BhcmFtSW5kZXhJbml0RGF0YSwKKyAgICBrUGFyYW1JbmRleFN1cHBsZW1lbnRhbERhdGEsCisgICAga1BhcmFtSW5kZXhTdWJzY3JpYmVkU3VwcGxlbWVudGFsRGF0YSwKKworICAgIC8qIHBpcGVsaW5lIGNoYXJhY3RlcmlzdGljcyAqLworICAgIGtQYXJhbUluZGV4TWVkaWFUeXBlLAorICAgIGtQYXJhbUluZGV4RGVsYXlSZXF1ZXN0LAorICAgIGtQYXJhbUluZGV4RGVsYXksCisgICAga1BhcmFtSW5kZXhNYXhSZWZlcmVuY2VBZ2UsCisgICAga1BhcmFtSW5kZXhNYXhSZWZlcmVuY2VDb3VudCwKKyAgICBrUGFyYW1JbmRleFJlb3JkZXJCdWZmZXJEZXB0aCwKKyAgICBrUGFyYW1JbmRleFJlb3JkZXJLZXksCisgICAga1BhcmFtSW5kZXhTdHJlYW1Db3VudCwKKyAgICBrUGFyYW1JbmRleFN1YnNjcmliZWRQYXJhbUluZGljZXMsCisgICAga1BhcmFtSW5kZXhTdWdnZXN0ZWRCdWZmZXJDb3VudCwKKyAgICBrUGFyYW1JbmRleEJhdGNoU2l6ZSwKKyAgICBrUGFyYW1JbmRleEN1cnJlbnRXb3JrLAorICAgIGtQYXJhbUluZGV4TGFzdFdvcmtRdWV1ZWQsCisKKyAgICAvKiBtZW1vcnkgYWxsb2NhdGlvbiAqLworICAgIGtQYXJhbUluZGV4QWxsb2NhdG9ycywKKyAgICBrUGFyYW1JbmRleEJsb2NrUG9vbHMsCisgICAga1BhcmFtSW5kZXhCdWZmZXJUeXBlLAorICAgIGtQYXJhbUluZGV4VXNhZ2UsCisgICAga1BhcmFtSW5kZXhPdXRPZk1lbW9yeSwKKyAgICBrUGFyYW1JbmRleE1heEJ1ZmZlclNpemUsCisKKyAgICAvKiBtaXNjLiBzdGF0ZSAqLworICAgIGtQYXJhbUluZGV4VHJpcHBlZCwKKyAgICBrUGFyYW1JbmRleENvbmZpZ0NvdW50ZXIsCisKKyAgICAvKiByZXNvdXJjZXMgKi8KKyAgICBrUGFyYW1JbmRleFJlc291cmNlc05lZWRlZCwKKyAgICBrUGFyYW1JbmRleFJlc291cmNlc1Jlc2VydmVkLAorICAgIGtQYXJhbUluZGV4T3BlcmF0aW5nUmF0ZSwKKyAgICBrUGFyYW1JbmRleFJlYWxUaW1lUHJpb3JpdHksCisKKyAgICAvKiBwcm90ZWN0ZWQgY29udGVudCAqLworICAgIGtQYXJhbUluZGV4U2VjdXJlTW9kZSwKKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAodHJhbnMvZW4pY29kZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAga1BhcmFtSW5kZXhCaXRyYXRlID0gQzJfUEFSQU1fSU5ERVhfQ09ERVJfUEFSQU1fU1RBUlQsCisgICAga1BhcmFtSW5kZXhCaXRyYXRlTW9kZSwKKyAgICBrUGFyYW1JbmRleFF1YWxpdHksCisgICAga1BhcmFtSW5kZXhDb21wbGV4aXR5LAorICAgIGtQYXJhbUluZGV4UHJlcGVuZEhlYWRlck1vZGUsCisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaW1hZ2UvdmlkZW8gY29tcG9uZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAgIGtQYXJhbUluZGV4UGljdHVyZVNpemUgPSBDMl9QQVJBTV9JTkRFWF9QSUNUVVJFX1BBUkFNX1NUQVJULAorICAgIGtQYXJhbUluZGV4Q3JvcFJlY3QsCisgICAga1BhcmFtSW5kZXhQaXhlbEZvcm1hdCwKKyAgICBrUGFyYW1JbmRleFJvdGF0aW9uLAorICAgIGtQYXJhbUluZGV4UGl4ZWxBc3BlY3RSYXRpbywKKyAgICBrUGFyYW1JbmRleFNjYWxlZFBpY3R1cmVTaXplLAorICAgIGtQYXJhbUluZGV4U2NhbGVkQ3JvcFJlY3QsCisgICAga1BhcmFtSW5kZXhTY2FsaW5nTWV0aG9kLAorICAgIGtQYXJhbUluZGV4Q29sb3JJbmZvLAorICAgIGtQYXJhbUluZGV4Q29sb3JBc3BlY3RzLAorICAgIGtQYXJhbUluZGV4SGRyU3RhdGljTWV0YWRhdGEsCisgICAga1BhcmFtSW5kZXhEZWZhdWx0Q29sb3JBc3BlY3RzLAorCisgICAga1BhcmFtSW5kZXhCbG9ja1NpemUsCisgICAga1BhcmFtSW5kZXhCbG9ja0NvdW50LAorICAgIGtQYXJhbUluZGV4QmxvY2tSYXRlLAorCisgICAga1BhcmFtSW5kZXhQaWN0dXJlVHlwZU1hc2ssCisgICAga1BhcmFtSW5kZXhQaWN0dXJlVHlwZSwKKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB2aWRlbyBjb21wb25lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAga1BhcmFtSW5kZXhGcmFtZVJhdGUgPSBDMl9QQVJBTV9JTkRFWF9WSURFT19QQVJBTV9TVEFSVCwKKyAgICBrUGFyYW1JbmRleE1heEJpdHJhdGUsCisgICAga1BhcmFtSW5kZXhNYXhGcmFtZVJhdGUsCisgICAga1BhcmFtSW5kZXhNYXhQaWN0dXJlU2l6ZSwKKyAgICBrUGFyYW1JbmRleEdvcCwKKyAgICBrUGFyYW1JbmRleFN5bmNGcmFtZUludGVydmFsLAorICAgIGtQYXJhbUluZGV4UmVxdWVzdFN5bmNGcmFtZSwKKyAgICBrUGFyYW1JbmRleFRlbXBvcmFsTGF5ZXJpbmcsCisgICAga1BhcmFtSW5kZXhMYXllckluZGV4LAorICAgIGtQYXJhbUluZGV4TGF5ZXJDb3VudCwKKyAgICBrUGFyYW1JbmRleEludHJhUmVmcmVzaCwKKyAgICBrUGFyYW1JbmRleEhkcjEwUGx1c01ldGFkYXRhLAorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGltYWdlIGNvbXBvbmVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgICBrUGFyYW1JbmRleFRpbGVMYXlvdXQgPSBDMl9QQVJBTV9JTkRFWF9JTUFHRV9QQVJBTV9TVEFSVCwKKyAgICBrUGFyYW1JbmRleFRpbGVIYW5kbGluZywKKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBhdWRpbyBjb21wb25lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAga1BhcmFtSW5kZXhTYW1wbGVSYXRlID0gQzJfUEFSQU1fSU5ERVhfQVVESU9fUEFSQU1fU1RBUlQsCisgICAga1BhcmFtSW5kZXhDaGFubmVsQ291bnQsCisgICAga1BhcmFtSW5kZXhQY21FbmNvZGluZywKKyAgICBrUGFyYW1JbmRleEFhY1BhY2thZ2luZywKKyAgICBrUGFyYW1JbmRleE1heENoYW5uZWxDb3VudCwKKyAgICBrUGFyYW1JbmRleEFhY1Nick1vZGUsIC8vIGFhYyBlbmNvZGUsIGVudW0KKyAgICBrUGFyYW1JbmRleERyY0VuY29kZWRUYXJnZXRMZXZlbCwgIC8vIGRyYywgZmxvYXQgKGRCRlMpCisgICAga1BhcmFtSW5kZXhEcmNUYXJnZXRSZWZlcmVuY2VMZXZlbCwgLy8gZHJjLCBmbG9hdCAoZEJGUykKKyAgICBrUGFyYW1JbmRleERyY0NvbXByZXNzaW9uLCAvLyBkcmMsIGVudW0KKyAgICBrUGFyYW1JbmRleERyY0Jvb3N0RmFjdG9yLCAvLyBkcmMsIGZsb2F0ICgwLTEpCisgICAga1BhcmFtSW5kZXhEcmNBdHRlbnVhdGlvbkZhY3RvciwgLy8gZHJjLCBmbG9hdCAoMC0xKQorICAgIGtQYXJhbUluZGV4RHJjRWZmZWN0VHlwZSwgLy8gZHJjLCBlbnVtCisKKyAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gcGxhdGZvcm0tZGVmaW5lZCBwYXJhbWV0ZXJzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgICAga1BhcmFtSW5kZXhQbGF0Zm9ybUxldmVsID0gQzJfUEFSQU1fSU5ERVhfUExBVEZPUk1fU1RBUlQsIC8vIGFsbCwgdTMyCisgICAga1BhcmFtSW5kZXhQbGF0Zm9ybUZlYXR1cmVzLCAvLyBhbGwsIHU2NCBtYXNrCisgICAga1BhcmFtSW5kZXhTdG9yZUlvblVzYWdlLCAvLyBzdG9yZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhBc3BlY3RzVG9EYXRhU3BhY2UsIC8vIHN0b3JlLCBzdHJ1Y3QKKyAgICBrUGFyYW1JbmRleEZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9yLCAvLyBzdG9yZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvcnMsIC8vIHN0b3JlLCBzdHJ1Y3RbXQorICAgIGtQYXJhbUluZGV4RGF0YVNwYWNlVG9Bc3BlY3RzLCAvLyBzdG9yZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhEYXRhU3BhY2UsIC8vIHUzMgorICAgIGtQYXJhbUluZGV4U3VyZmFjZVNjYWxpbmcsIC8vIHUzMgorCisgICAgLy8gaW5wdXQgc3VyZmFjZQorICAgIGtQYXJhbUluZGV4SW5wdXRTdXJmYWNlRW9zLCAvLyBpbnB1dC1zdXJmYWNlLCBlb3MKKyAgICBrUGFyYW1JbmRleFRpbWVkQ29udHJvbCwgLy8gc3RydWN0CisgICAga1BhcmFtSW5kZXhTdGFydEF0LCAvLyBpbnB1dC1zdXJmYWNlLCBzdHJ1Y3QKKyAgICBrUGFyYW1JbmRleFN1c3BlbmRBdCwgLy8gaW5wdXQtc3VyZmFjZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhSZXN1bWVBdCwgLy8gaW5wdXQtc3VyZmFjZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhTdG9wQXQsIC8vIGlucHV0LXN1cmZhY2UsIHN0cnVjdAorICAgIGtQYXJhbUluZGV4VGltZU9mZnNldCwgLy8gaW5wdXQtc3VyZmFjZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhNaW5GcmFtZVJhdGUsIC8vIGlucHV0LXN1cmZhY2UsIGZsb2F0CisgICAga1BhcmFtSW5kZXhUaW1lc3RhbXBHYXBBZGp1c3RtZW50LCAvLyBpbnB1dC1zdXJmYWNlLCBzdHJ1Y3QKKworICAgIGtQYXJhbUluZGV4U3VyZmFjZUFsbG9jYXRvciwgLy8gdTMyCisKKyAgICAvLyBkZXByZWNhdGVkIGluZGljZXMgZHVlIHRvIHJlbmFtaW5nCisgICAga1BhcmFtSW5kZXhBYWNTdHJlYW1Gb3JtYXQgPSBrUGFyYW1JbmRleEFhY1BhY2thZ2luZywKKyAgICBrUGFyYW1JbmRleENzZCA9IGtQYXJhbUluZGV4SW5pdERhdGEsCisgICAga1BhcmFtSW5kZXhNYXhWaWRlb1NpemVIaW50ID0ga1BhcmFtSW5kZXhNYXhQaWN0dXJlU2l6ZSwKKyAgICBrUGFyYW1JbmRleE1pbWUgPSBrUGFyYW1JbmRleE1lZGlhVHlwZSwKKyAgICBrUGFyYW1JbmRleFJlcXVlc3RlZEluZm9zID0ga1BhcmFtSW5kZXhTdWJzY3JpYmVkUGFyYW1JbmRpY2VzLAorCisKKyAgICAvLyBkZXByZWNhdGVkIGluZGljZXMgZHVlIHRvIHJlbW92YWwKKyAgICBrUGFyYW1JbmRleFN1cHBvcnRlZFBhcmFtcyA9IDB4REVBRDAwMDAsCisgICAga1BhcmFtSW5kZXhSZWFkT25seVBhcmFtcywKKyAgICBrUGFyYW1JbmRleFRlbXBvcmFsLAorfTsKKworfQorCisvKioKKyAqIENvZGVjIDIuMCBwYXJhbWV0ZXIgdHlwZXMgZm9sbG93IHRoZSBmb2xsb3dpbmcgbmFtaW5nIGNvbnZlbnRpb246CisgKgorICogQzI8Z3JvdXA+PGRvbWFpbj48aW5kZXg+PHR5cGU+CisgKgorICogRS5nLiBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzogZ3JvdXA9IiIgZG9tYWluPSJTdHJlYW0iIGluZGV4PSJQaWN0dXJlU2l6ZSIgdHlwZT0iSW5mbyIuCisgKiBHcm91cCBpcyBzb21ld2hhdCBhcmJpdHJhcnksIGJ1dCBkZW5vdGVzIGtpbmQgb2Ygb2JqZWN0cyB0aGUgcGFyYW1ldGVyIGlzIGRlZmluZWQuCisgKiBBdCB0aGlzIHBvaW50IHdlIHVzZSBDb21wb25lbnQgYW5kIFN0b3JlIHRvIGRpc3Rpbmd1aXNoIGJhc2ljIGNvbXBvbmVudC9zdG9yZSBwYXJhbWV0ZXJzLgorICoKKyAqIFBhcmFtZXRlciBrZXlzIGFyZSBuYW1lZCBDMl9QQVJBTUtFWV9bPGdyb3VwPl9dPGRvbWFpbj5fPGluZGV4PiBhcyB0eXBlIGlzIG5vdCBleHBlY3RlZAorICogdG8gZGlzdGluZ3Vpc2ggcGFyYW1ldGVycy4gRS5nLiBhIGNvbXBvbmVudCBjb3VsZCBjaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIHBhcmFtZXRlciBhbmQgaXQKKyAqIGlzIG5vdCBleHBlY3RlZCB1c2VycyB3b3VsZCBuZWVkIHRvIGNoYW5nZSB0aGUga2V5LgorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFQSSBsZXZlbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitlbnVtIEMyQ29uZmlnOjphcGlfbGV2ZWxfdCA6IHVpbnQzMl90IHsKKyAgICBBUElfTDBfMSA9IDAsICAgLy8vPCBzdXBwb3J0IGZvciBBUEkgbGV2ZWwgMC4xCit9OworCisvLyByZWFkLW9ubHkKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OmFwaV9sZXZlbF90Piwga1BhcmFtSW5kZXhBcGlMZXZlbD4KKyAgICAgICAgQzJBcGlMZXZlbFNldHRpbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9BUElfTEVWRUxbXSA9ICJhcGkubGV2ZWwiOworCitlbnVtIEMyQ29uZmlnOjphcGlfZmVhdHVyZV90IDogdWludDY0X3QgeworICAgIEFQSV9SRUZMRUNUSU9OICAgICAgID0gKDFVIDw8IDApLCAgLy8vPCBhYmlsaXR5IHRvIGxpc3Qgc3VwcG9ydGVkIHBhcmFtZXRlcnMKKyAgICBBUElfVkFMVUVTICAgICAgICAgICA9ICgxVSA8PCAxKSwgIC8vLzwgYWJpbGl0eSB0byBsaXN0IHN1cHBvcnRlZCB2YWx1ZXMgZm9yIGVhY2ggcGFyYW1ldGVyCisgICAgQVBJX0NVUlJFTlRfVkFMVUVTICAgPSAoMVUgPDwgMiksICAvLy88IGFiaWxpdHkgdG8gbGlzdCBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyBmb3IgZWFjaCBwYXJhbWV0ZXIKKyAgICBBUElfREVQRU5ERU5DWSAgICAgICA9ICgxVSA8PCAzKSwgIC8vLzwgaGF2ZSBhIGRlZmluZWQgcGFyYW1ldGVyIGRlcGVuZGVuY3kKKworICAgIEFQSV9TVFJFQU1TICAgICAgICAgID0gKDFVTEwgPDwgMzIpLCAgLy8vPCBzdXBwb3J0aW5nIHZhcmlhYmxlIG51bWJlciBvZiBzdHJlYW1zCisKKyAgICBBUElfVFVOTkVMSU5HICAgICAgICA9ICgxVUxMIDw8IDQ4KSwgIC8vLzwgdHVubmVsaW5nIEFQSQorfTsKKworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjphcGlfZmVhdHVyZV90Piwga1BhcmFtSW5kZXhBcGlGZWF0dXJlcz4KKyAgICAgICAgQzJBcGlGZWF0dXJlc1NldHRpbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9BUElfRkVBVFVSRVNbXSA9ICJhcGkuZmVhdHVyZXMiOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnZW5lcmljIGNvbXBvbmVudCBjaGFyYWN0ZXJpc3RpY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBUaGUgbmFtZSBvZiB0aGUgY29tcG9uZW50LgorICoKKyAqIFRoaXMgbXVzdCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb3IgZG90ICcuJywgaHlwaGVuICctJywgcGx1cyAnKycsIG9yCisgKiB1bmRlcmxpbmUgJ18nLiBUaGUgbmFtZSBvZiBlYWNoIGNvbXBvbmVudCBtdXN0IGJlIHVuaXF1ZS4KKyAqCisgKiBGb3IgQW5kcm9pZDogQ29tcG9uZW50IG5hbWVzIG11c3Qgc3RhcnQgd2l0aCAnYzIuJyBmb2xsb3dlZCBieSB0aGUgY29tcGFueSBuYW1lIG9yIGFiYnJldmlhdGlvbgorICogYW5kIGFub3RoZXIgZG90LCBlLmcuICdjMi5hbmRyb2lkLicuIFVzZSBvZiBsb3dlcmNhc2UgaXMgcHJlZmVycmVkIGJ1dCBub3QgcmVxdWlyZWQuCisgKi8KKy8vIHJlYWQtb25seQordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJTdHJpbmdWYWx1ZSwga1BhcmFtSW5kZXhOYW1lPiBDMkNvbXBvbmVudE5hbWVTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX05BTUVbXSAgPSAiY29tcG9uZW50Lm5hbWUiOworCisvKioKKyAqIEFsdGVybmF0ZSBuYW1lcyAoYWxpYXNlcykgb2YgdGhlIGNvbXBvbmVudC4KKyAqCisgKiBUaGlzIGlzIGEgY29tbWEgJywnIHNlcGFyYXRlZCBsaXN0IG9mIGFsdGVybmF0ZSBjb21wb25lbnQgbmFtZXMuIFVubGlrZSBjb21wb25lbnQgbmFtZXMgdGhhdAorICogbXVzdCBiZSB1bmlxdWUsIG11bHRpcGxlIGNvbXBvbmVudHMgY2FuIGhhdmUgdGhlIHNhbWUgYWxpYXMuCisgKi8KKy8vIHJlYWQtb25seQordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJTdHJpbmdWYWx1ZSwga1BhcmFtSW5kZXhBbGlhc2VzPiBDMkNvbXBvbmVudEFsaWFzZXNTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FMSUFTRVNbXSAgPSAiY29tcG9uZW50LmFsaWFzZXMiOworCisvKioKKyAqIENvbXBvbmVudCBraW5kLgorICovCisvLyByZWFkLW9ubHkKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb21wb25lbnQ6OmtpbmRfdD4sIGtQYXJhbUluZGV4S2luZD4KKyAgICAgICAgQzJDb21wb25lbnRLaW5kU2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9LSU5EW10gID0gImNvbXBvbmVudC5raW5kIjsKKworLyoqCisgKiBDb21wb25lbnQgZG9tYWluLgorICovCisvLyByZWFkLW9ubHkKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb21wb25lbnQ6OmRvbWFpbl90Piwga1BhcmFtSW5kZXhEb21haW4+CisgICAgICAgIEMyQ29tcG9uZW50RG9tYWluU2V0dGluZzsKK3R5cGVkZWYgQzJDb21wb25lbnREb21haW5TZXR0aW5nIEMyQ29tcG9uZW50RG9tYWluSW5mbzsgLy8gZGVwcmVjYXRlZAordHlwZWRlZiBDMkNvbXBvbmVudDo6ZG9tYWluX3QgQzJEb21haW5LaW5kOyAvLyBkZXByZWNhdGVkCitjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT01QT05FTlRfRE9NQUlOW10gID0gImNvbXBvbmVudC5kb21haW4iOworCitjb25zdGV4cHIgQzJDb21wb25lbnQ6OmRvbWFpbl90IEMyRG9tYWluQXVkaW8gPSBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPOyAvLyBkZXByZWNhdGVkCitjb25zdGV4cHIgQzJDb21wb25lbnQ6OmRvbWFpbl90IEMyRG9tYWluT3RoZXIgPSBDMkNvbXBvbmVudDo6RE9NQUlOX09USEVSOyAvLyBkZXByZWNhdGUKK2NvbnN0ZXhwciBDMkNvbXBvbmVudDo6ZG9tYWluX3QgQzJEb21haW5WaWRlbyA9IEMyQ29tcG9uZW50OjpET01BSU5fVklERU87IC8vIGRlcHJlY2F0ZQorCisvKioKKyAqIENvbXBvbmVudCBhdHRyaWJ1dGVzLgorICoKKyAqIFRoZXNlIGFyZSBhIHNldCBvZiBmbGFncyBwcm92aWRlZCBieSB0aGUgY29tcG9uZW50IGNoYXJhY3Rlcml6aW5nIGl0cyBwcm9jZXNzaW5nIGFsZ29yaXRobS4KKyAqLworQzJFTlVNKEMyQ29tcG9uZW50OjphdHRyaWJfdCwgdWludDY0X3QsCisgICAgQVRUUklCX0lTX1RFTVBPUkFMID0gMXUgPDwgMCwgLy8vPCBjb21wb25lbnQgaW5wdXQgb3JkZXJpbmcgbWF0dGVycyBmb3IgcHJvY2Vzc2luZworKQorCisvLyByZWFkLW9ubHkKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb21wb25lbnQ6OmF0dHJpYl90Piwga1BhcmFtSW5kZXhBdHRyaWJ1dGVzPgorICAgICAgICBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVNbXSA9ICJjb21wb25lbnQuYXR0cmlidXRlcyI7CisKKy8vIGRlcHJlY2F0ZWQKK3R5cGVkZWYgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZyBDMkNvbXBvbmVudFRlbXBvcmFsSW5mbzsKKworLyoqCisgKiBUaW1lIHN0cmV0Y2hpbmcuCisgKgorICogVGhpcyBpcyB0aGUgcmF0aW8gYmV0d2VlbiB0aGUgcmF0ZSBvZiB0aGUgaW5wdXQgdGltZXN0YW1wLCBhbmQgdGhlIHJhdGUgb2YgdGhlIG91dHB1dCB0aW1lc3RhbXAuCisgKiBFLmcuIGlmIHRoaXMgaXMgNC4wLCBmb3IgZXZlcnkgMSBzZWNvbmRzIG9mIGlucHV0IHRpbWVzdGFtcCBkaWZmZXJlbmNlLCB0aGUgb3V0cHV0IHNoYWxsIGRpZmZlcgorICogYnkgNCBzZWNvbmRzLgorICovCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhUaW1lU3RyZXRjaD4gQzJDb21wb25lbnRUaW1lU3RyZXRjaFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1RJTUVfU1RSRVRDSFtdICA9ICJhbGdvLnRpbWUtc3RyZXRjaCI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNvZGluZyBjaGFyYWN0ZXJpc3RpY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBQcm9maWxlIGFuZCBsZXZlbC4KKyAqCisgKiBQcm9maWxlIGRldGVybWluZXMgdGhlIHRvb2xzIHVzZWQgYnkgdGhlIGNvbXBvbmVudC4KKyAqIExldmVsIGRldGVybWluZXMgdGhlIGxldmVsIG9mIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBjb21wb25lbnQuCisgKi8KKworbmFtZXNwYWNlIHsKKworZW51bSA6IHVpbnQzMl90IHsKKyAgICBfQzJfUExfTVAyVl9CQVNFID0gMHgxMDAwLAorICAgIF9DMl9QTF9BQUNfQkFTRSAgPSAweDIwMDAsCisgICAgX0MyX1BMX0gyNjNfQkFTRSA9IDB4MzAwMCwKKyAgICBfQzJfUExfTVA0Vl9CQVNFID0gMHg0MDAwLAorICAgIF9DMl9QTF9BVkNfQkFTRSAgPSAweDUwMDAsCisgICAgX0MyX1BMX0hFVkNfQkFTRSA9IDB4NjAwMCwKKyAgICBfQzJfUExfVlA5X0JBU0UgID0gMHg3MDAwLAorICAgIF9DMl9QTF9EVl9CQVNFICAgPSAweDgwMDAsCisgICAgX0MyX1BMX0FWMV9CQVNFICA9IDB4OTAwMCwKKworICAgIEMyX1BST0ZJTEVfTEVWRUxfVkVORE9SX1NUQVJUID0gMHg3MDAwMDAwMCwKK307CisKK30KKworZW51bSBDMkNvbmZpZzo6cHJvZmlsZV90IDogdWludDMyX3QgeworICAgIFBST0ZJTEVfVU5VU0VEID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBwcm9maWxlIGlzIG5vdCB1c2VkIGJ5IHRoaXMgbWVkaWEgdHlwZQorCisgICAgLy8gQUFDIChNUEVHLTIgUGFydCA3IGFuZCBNUEVHLTQgUGFydCAzKSBwcm9maWxlcworICAgIFBST0ZJTEVfQUFDX0xDID0gX0MyX1BMX0FBQ19CQVNFLCAgICAgICAgICAgLy8vPCBBQUMgTG93LUNvbXBsZXhpdHkKKyAgICBQUk9GSUxFX0FBQ19NQUlOLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQUFDIE1haW4KKyAgICBQUk9GSUxFX0FBQ19TU1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQUFDIFNjYWxhYmxlIFNhbXBsaW5nIFJhdGUKKyAgICBQUk9GSUxFX0FBQ19MVFAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQUFDIExvbmcgVGVybSBQcmVkaWN0aW9uCisgICAgUFJPRklMRV9BQUNfSEUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFBQyBIaWdoLUVmZmljaWVuY3kKKyAgICBQUk9GSUxFX0FBQ19TQ0FMQUJMRSwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQUFDIFNjYWxhYmxlCisgICAgUFJPRklMRV9BQUNfRVJfTEMsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFBQyBFcnJvciBSZXNpbGllbnQgTG93LUNvbXBsZXhpdHkKKyAgICBQUk9GSUxFX0FBQ19FUl9TQ0FMQUJMRSwgICAgICAgICAgICAgICAgICAgIC8vLzwgQUFDIEVycm9yIFJlc2lsaWVudCBTY2FsYWJsZQorICAgIFBST0ZJTEVfQUFDX0xELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgTG93IERlbGF5CisgICAgUFJPRklMRV9BQUNfSEVfUFMsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFBQyBIaWdoLUVmZmljaWVuY3kgUGFyYW1ldHJpYyBTdGVyZW8KKyAgICBQUk9GSUxFX0FBQ19FTEQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQUFDIEVuaGFuY2VkIExvdyBEZWxheQorICAgIFBST0ZJTEVfQUFDX1hIRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgRXh0ZW5kZWQgSGlnaC1FZmZpY2llbmN5CisKKyAgICAvLyBNUEVHLTIgVmlkZW8gcHJvZmlsZXMKKyAgICBQUk9GSUxFX01QMlZfU0lNUExFID0gX0MyX1BMX01QMlZfQkFTRSwgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgU2ltcGxlCisgICAgUFJPRklMRV9NUDJWX01BSU4sICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctMiBWaWRlbyAoSC4yNjIpIE1haW4KKyAgICBQUk9GSUxFX01QMlZfU05SX1NDQUxBQkxFLCAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgU05SIFNjYWxhYmxlCisgICAgUFJPRklMRV9NUDJWX1NQQVRJQUxMWV9TQ0FMQUJMRSwgICAgICAgICAgICAvLy88IE1QRUctMiBWaWRlbyAoSC4yNjIpIFNwYXRpYWxseSBTY2FsYWJsZQorICAgIFBST0ZJTEVfTVAyVl9ISUdILCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTIgVmlkZW8gKEguMjYyKSBIaWdoCisgICAgUFJPRklMRV9NUDJWXzQyMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctMiBWaWRlbyAoSC4yNjIpIDQ6MjoyCisgICAgUFJPRklMRV9NUDJWX01VTFRJVklFVywgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctMiBWaWRlbyAoSC4yNjIpIE11bHRpLXZpZXcKKworICAgIC8vIEguMjYzIHByb2ZpbGVzCisgICAgUFJPRklMRV9IMjYzX0JBU0VMSU5FID0gX0MyX1BMX0gyNjNfQkFTRSwgICAvLy88IEguMjYzIEJhc2VsaW5lIChQcm9maWxlIDApCisgICAgUFJPRklMRV9IMjYzX0gzMjAsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEguMjYzIEguMzIwIENvZGluZyBFZmZpY2llbmN5IFZlcnNpb24gMiBCYWNrd2FyZC1Db21wYXRpYmlsaXR5IChQcm9maWxlIDEpCisgICAgUFJPRklMRV9IMjYzX1YxQkMsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEguMjYzIFZlcnNpb24gMSBCYWNrd2FyZC1Db21wYXRpYmlsaXR5IChQcm9maWxlIDIpCisgICAgUFJPRklMRV9IMjYzX0lTV1YyLCAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEguMjYzIFZlcnNpb24gMiBJbnRlcmFjdGl2ZSBhbmQgU3RyZWFtaW5nIFdpcmVsZXNzIChQcm9maWxlIDMpCisgICAgUFJPRklMRV9IMjYzX0lTV1YzLCAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEguMjYzIFZlcnNpb24gMyBJbnRlcmFjdGl2ZSBhbmQgU3RyZWFtaW5nIFdpcmVsZXNzIChQcm9maWxlIDQpCisgICAgUFJPRklMRV9IMjYzX0hJR0hfQ09NUFJFU1NJT04sICAgICAgICAgICAgICAvLy88IEguMjYzIENvbnZlcnNhdGlvbmFsIEhpZ2ggQ29tcHJlc3Npb24gKFByb2ZpbGUgNSkKKyAgICBQUk9GSUxFX0gyNjNfSU5URVJORVQsICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgQ29udmVyc2F0aW9uYWwgSW50ZXJuZXQgKFByb2ZpbGUgNikKKyAgICBQUk9GSUxFX0gyNjNfSU5URVJMQUNFLCAgICAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgQ29udmVyc2F0aW9uYWwgSW50ZXJsYWNlIChQcm9maWxlIDcpCisgICAgUFJPRklMRV9IMjYzX0hJR0hfTEFURU5DWSwgICAgICAgICAgICAgICAgICAvLy88IEguMjYzIEhpZ2ggTGF0ZW5jeSAoUHJvZmlsZSA4KQorCisgICAgLy8gTVBFRy00IFBhcnQgMiAoVmlkZW8pIE5hdHVyYWwgVmlzdWFsIFByb2ZpbGVzCisgICAgUFJPRklMRV9NUDRWX1NJTVBMRSwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBTaW1wbGUKKyAgICBQUk9GSUxFX01QNFZfU0lNUExFX1NDQUxBQkxFLCAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIFNpbXBsZSBTY2FsYWJsZQorICAgIFBST0ZJTEVfTVA0Vl9DT1JFLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gQ29yZQorICAgIFBST0ZJTEVfTVA0Vl9NQUlOLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gTWFpbgorICAgIFBST0ZJTEVfTVA0Vl9OQklULCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gTi1CaXQKKyAgICBQUk9GSUxFX01QNFZfQVJUUywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIEFkdmFuY2VkIFJlYWx0aW1lIFNpbXBsZQorICAgIFBST0ZJTEVfTVA0Vl9DT1JFX1NDQUxBQkxFLCAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gQ29yZSBTY2FsYWJsZQorICAgIFBST0ZJTEVfTVA0Vl9BQ0UsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gQWR2YW5jZWQgQ29kaW5nIEVmZmljaWVuY3kKKyAgICBQUk9GSUxFX01QNFZfQURWQU5DRURfQ09SRSwgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIEFkdmFuY2VkIENvcmUKKyAgICBQUk9GSUxFX01QNFZfU0lNUExFX1NUVURJTywgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIFNpbXBsZSBTdHVkaW8KKyAgICBQUk9GSUxFX01QNFZfQ09SRV9TVFVESU8sICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIENvcmUgU3R1ZGlvCisgICAgUFJPRklMRV9NUDRWX0FEVkFOQ0VEX1NJTVBMRSwgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBBZHZhbmNlZCBTaW1wbGUKKyAgICBQUk9GSUxFX01QNFZfRkdTLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIEZpbmUgR3JhbnVsYXJpdHkgU2NhbGFibGUKKworICAgIC8vIEFWQyAvIE1QRUctNCBQYXJ0IDEwIChILjI2NCkgcHJvZmlsZXMKKyAgICBQUk9GSUxFX0FWQ19CQVNFTElORSA9IF9DMl9QTF9BVkNfQkFTRSwgICAgIC8vLzwgQVZDIChILjI2NCkgQmFzZWxpbmUKKyAgICBQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9CQVNFTElORSwgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgQ29uc3RyYWluZWQgQmFzZWxpbmUKKyAgICBQUk9GSUxFX0FWQ19NQUlOLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTWFpbgorICAgIFBST0ZJTEVfQVZDX0VYVEVOREVELCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBFeHRlbmRlZAorICAgIFBST0ZJTEVfQVZDX0hJR0gsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBIaWdoCisgICAgUFJPRklMRV9BVkNfUFJPR1JFU1NJVkVfSElHSCwgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIFByb2dyZXNzaXZlIEhpZ2gKKyAgICBQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9ISUdILCAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgQ29uc3RyYWluZWQgSGlnaAorICAgIFBST0ZJTEVfQVZDX0hJR0hfMTAsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBIaWdoIDEwCisgICAgUFJPRklMRV9BVkNfUFJPR1JFU1NJVkVfSElHSF8xMCwgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIFByb2dyZXNzaXZlIEhpZ2ggMTAKKyAgICBQUk9GSUxFX0FWQ19ISUdIXzQyMiwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgSGlnaCA0OjI6MgorICAgIFBST0ZJTEVfQVZDX0hJR0hfNDQ0X1BSRURJQ1RJVkUsICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBIaWdoIDQ6NDo0IFByZWRpY3RpdmUKKyAgICBQUk9GSUxFX0FWQ19ISUdIXzEwX0lOVFJBLCAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgSGlnaCAxMCBJbnRyYQorICAgIFBST0ZJTEVfQVZDX0hJR0hfNDIyX0lOVFJBLCAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBIaWdoIDQ6MjoyIEludHJhCisgICAgUFJPRklMRV9BVkNfSElHSF80NDRfSU5UUkEsICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIEhpZ2ggNDo0OjQgSW50cmEKKyAgICBQUk9GSUxFX0FWQ19DQVZMQ180NDRfSU5UUkEsICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgQ0FWTEMgNDo0OjQgSW50cmEKKyAgICBQUk9GSUxFX0FWQ19TQ0FMQUJMRV9CQVNFTElORSA9IF9DMl9QTF9BVkNfQkFTRSArIDB4MTAwLCAgLy8vPCBBVkMgKEguMjY0KSBTY2FsYWJsZSBCYXNlbGluZQorICAgIFBST0ZJTEVfQVZDX1NDQUxBQkxFX0NPTlNUUkFJTkVEX0JBU0VMSU5FLCAgLy8vPCBBVkMgKEguMjY0KSBTY2FsYWJsZSBDb25zdHJhaW5lZCBCYXNlbGluZQorICAgIFBST0ZJTEVfQVZDX1NDQUxBQkxFX0hJR0gsICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBTY2FsYWJsZSBIaWdoCisgICAgUFJPRklMRV9BVkNfU0NBTEFCTEVfQ09OU1RSQUlORURfSElHSCwgICAgICAvLy88IEFWQyAoSC4yNjQpIFNjYWxhYmxlIENvbnN0cmFpbmVkIEhpZ2gKKyAgICBQUk9GSUxFX0FWQ19TQ0FMQUJMRV9ISUdIX0lOVFJBLCAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgU2NhbGFibGUgSGlnaCBJbnRyYQorICAgIFBST0ZJTEVfQVZDX01VTFRJVklFV19ISUdIID0gX0MyX1BMX0FWQ19CQVNFICsgMHgyMDAsICAvLy88IEFWQyAoSC4yNjQpIE11bHRpdmlldyBIaWdoCisgICAgUFJPRklMRV9BVkNfU1RFUkVPX0hJR0gsICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIFN0ZXJlbyBIaWdoCisgICAgUFJPRklMRV9BVkNfTUZDX0hJR0gsICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIE1GQyBIaWdoCisgICAgUFJPRklMRV9BVkNfTVVMVElWSUVXX0RFUFRIX0hJR0ggPSBfQzJfUExfQVZDX0JBU0UgKyAweDMwMCwgIC8vLzwgQVZDIChILjI2NCkgTXVsdGl2aWV3IERlcHRoIEhpZ2gKKyAgICBQUk9GSUxFX0FWQ19NRkNfREVQVEhfSElHSCwgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTUZDIERlcHRoIEhpZ2gKKyAgICBQUk9GSUxFX0FWQ19FTkhBTkNFRF9NVUxUSVZJRVdfREVQVEhfSElHSCA9IF9DMl9QTF9BVkNfQkFTRSArIDB4NDAwLCAgLy8vPCBBVkMgKEguMjY0KSBFbmhhbmNlZCBNdWx0aXZpZXcgRGVwdGggSGlnaAorCisgICAgLy8gSEVWQyBwcm9maWxlcworICAgIFBST0ZJTEVfSEVWQ19NQUlOID0gX0MyX1BMX0hFVkNfQkFTRSwgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbgorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzEwLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiAxMAorICAgIFBST0ZJTEVfSEVWQ19NQUlOX1NUSUxMLCAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBTdGlsbCBQaWN0dXJlCisgICAgUFJPRklMRV9IRVZDX01PTk8gPSBfQzJfUExfSEVWQ19CQVNFICsgMHgxMDAsICAvLy88IEhFVkMgKEguMjY1KSBNb25vY2hyb21lCisgICAgUFJPRklMRV9IRVZDX01PTk9fMTIsICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNb25vY2hyb21lIDEyCisgICAgUFJPRklMRV9IRVZDX01PTk9fMTYsICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNb25vY2hyb21lIDE2CisgICAgUFJPRklMRV9IRVZDX01BSU5fMTIsICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIDEyCisgICAgUFJPRklMRV9IRVZDX01BSU5fNDIyXzEwLCAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIDQ6MjoyIDEwCisgICAgUFJPRklMRV9IRVZDX01BSU5fNDIyXzEyLCAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIDQ6MjoyIDEyCisgICAgUFJPRklMRV9IRVZDX01BSU5fNDQ0LCAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIDQ6NDo0CisgICAgUFJPRklMRV9IRVZDX01BSU5fNDQ0XzEwLCAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIDQ6NDo0IDEwCisgICAgUFJPRklMRV9IRVZDX01BSU5fNDQ0XzEyLCAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIDQ6NDo0IDEyCisgICAgUFJPRklMRV9IRVZDX01BSU5fSU5UUkEsICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIEludHJhCisgICAgUFJPRklMRV9IRVZDX01BSU5fMTBfSU5UUkEsICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIDEwIEludHJhCisgICAgUFJPRklMRV9IRVZDX01BSU5fMTJfSU5UUkEsICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIDEyIEludHJhCisgICAgUFJPRklMRV9IRVZDX01BSU5fNDIyXzEwX0lOVFJBLCAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIDQ6MjoyIDEwIEludHJhCisgICAgUFJPRklMRV9IRVZDX01BSU5fNDIyXzEyX0lOVFJBLCAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIDQ6MjoyIDEyIEludHJhCisgICAgUFJPRklMRV9IRVZDX01BSU5fNDQ0X0lOVFJBLCAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIDQ6NDo0IEludHJhCisgICAgUFJPRklMRV9IRVZDX01BSU5fNDQ0XzEwX0lOVFJBLCAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIDQ6NDo0IDEwIEludHJhCisgICAgUFJPRklMRV9IRVZDX01BSU5fNDQ0XzEyX0lOVFJBLCAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIDQ6NDo0IDEyIEludHJhCisgICAgUFJPRklMRV9IRVZDX01BSU5fNDQ0XzE2X0lOVFJBLCAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIDQ6NDo0IDE2IEludHJhCisgICAgUFJPRklMRV9IRVZDX01BSU5fNDQ0X1NUSUxMLCAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIDQ6NDo0IFN0aWxsIFBpY3R1cmUKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTZfU1RJTEwsICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgMTYgU3RpbGwgUGljdHVyZQorICAgIFBST0ZJTEVfSEVWQ19ISUdIXzQ0NCA9IF9DMl9QTF9IRVZDX0JBU0UgKyAweDIwMCwgIC8vLzwgSEVWQyAoSC4yNjUpIEhpZ2ggVGhyb3VnaHB1dCA0OjQ6NAorICAgIFBST0ZJTEVfSEVWQ19ISUdIXzQ0NF8xMCwgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgSGlnaCBUaHJvdWdocHV0IDQ6NDo0IDEwCisgICAgUFJPRklMRV9IRVZDX0hJR0hfNDQ0XzE0LCAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBIaWdoIFRocm91Z2hwdXQgNDo0OjQgMTQKKyAgICBQUk9GSUxFX0hFVkNfSElHSF80NDRfMTZfSU5UUkEsICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIEhpZ2ggVGhyb3VnaHB1dCA0OjQ6NCAxNiBJbnRyYQorICAgIFBST0ZJTEVfSEVWQ19TWF9NQUlOID0gX0MyX1BMX0hFVkNfQkFTRSArIDB4MzAwLCAgLy8vPCBIRVZDIChILjI2NSkgU2NyZWVuLUV4dGVuZGVkIE1haW4KKyAgICBQUk9GSUxFX0hFVkNfU1hfTUFJTl8xMCwgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIFNjcmVlbi1FeHRlbmRlZCBNYWluIDEwCisgICAgUFJPRklMRV9IRVZDX1NYX01BSU5fNDQ0LCAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY3JlZW4tRXh0ZW5kZWQgTWFpbiA0OjQ6NAorICAgIFBST0ZJTEVfSEVWQ19TWF9NQUlOXzQ0NF8xMCwgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgU2NyZWVuLUV4dGVuZGVkIE1haW4gNDo0OjQgMTAKKyAgICBQUk9GSUxFX0hFVkNfU1hfSElHSF80NDQsICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIFNjcmVlbi1FeHRlbmRlZCBIaWdoIFRocm91Z2hwdXQgNDo0OjQKKyAgICBQUk9GSUxFX0hFVkNfU1hfSElHSF80NDRfMTAsICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIFNjcmVlbi1FeHRlbmRlZCBIaWdoIFRocm91Z2hwdXQgNDo0OjQgMTAKKyAgICBQUk9GSUxFX0hFVkNfU1hfSElHSF80NDRfMTQsICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIFNjcmVlbi1FeHRlbmRlZCBIaWdoIFRocm91Z2hwdXQgNDo0OjQgMTQKKyAgICBQUk9GSUxFX0hFVkNfTVVMVElWSUVXX01BSU4gPSBfQzJfUExfSEVWQ19CQVNFICsgMHg0MDAsICAvLy88IEhFVkMgKEguMjY1KSBNdWx0aXZpZXcgTWFpbgorICAgIFBST0ZJTEVfSEVWQ19TQ0FMQUJMRV9NQUlOID0gX0MyX1BMX0hFVkNfQkFTRSArIDB4NTAwLCAgLy8vPCBIRVZDIChILjI2NSkgU2NhbGFibGUgTWFpbgorICAgIFBST0ZJTEVfSEVWQ19TQ0FMQUJMRV9NQUlOXzEwLCAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgU2NhbGFibGUgTWFpbiAxMAorICAgIFBST0ZJTEVfSEVWQ19TQ0FMQUJMRV9NT05PID0gX0MyX1BMX0hFVkNfQkFTRSArIDB4NjAwLCAgLy8vPCBIRVZDIChILjI2NSkgU2NhbGFibGUgTW9ub2Nocm9tZQorICAgIFBST0ZJTEVfSEVWQ19TQ0FMQUJMRV9NT05PXzEyLCAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgU2NhbGFibGUgTW9ub2Nocm9tZSAxMgorICAgIFBST0ZJTEVfSEVWQ19TQ0FMQUJMRV9NT05PXzE2LCAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgU2NhbGFibGUgTW9ub2Nocm9tZSAxNgorICAgIFBST0ZJTEVfSEVWQ19TQ0FMQUJMRV9NQUlOXzQ0NCwgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgU2NhbGFibGUgTWFpbiA0OjQ6NAorICAgIFBST0ZJTEVfSEVWQ18zRF9NQUlOID0gX0MyX1BMX0hFVkNfQkFTRSArIDB4NzAwLCAgLy8vPCBIRVZDIChILjI2NSkgM0QgTWFpbgorCisgICAgLy8gVlA5IHByb2ZpbGVzCisgICAgUFJPRklMRV9WUDlfMCA9IF9DMl9QTF9WUDlfQkFTRSwgICAgICAgICAgICAvLy88IFZQOSBQcm9maWxlIDAgKDQ6MjowKQorICAgIFBST0ZJTEVfVlA5XzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgUHJvZmlsZSAxICg0OjI6MiBvciA0OjQ6NCkKKyAgICBQUk9GSUxFX1ZQOV8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IFByb2ZpbGUgMiAoNDoyOjAsIDEwIG9yIDEyIGJpdCkKKyAgICBQUk9GSUxFX1ZQOV8zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IFByb2ZpbGUgMyAoNDoyOjIgb3IgNDo0OjQsIDEwIG9yIDEyIGJpdCkKKworICAgIC8vIERvbGJ5IFZpc2lvbiBwcm9maWxlcworICAgIFBST0ZJTEVfRFZfQVZfUEVSID0gX0MyX1BMX0RWX0JBU0UgKyAwLCAgICAgLy8vPCBEb2xieSBWaXNpb24gZHZhdi5wZXIgcHJvZmlsZSAoZGVwcmVjYXRlZCkKKyAgICBQUk9GSUxFX0RWX0FWX1BFTiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGR2YXYucGVuIHByb2ZpbGUgKGRlcHJlY2F0ZWQpCisgICAgUFJPRklMRV9EVl9IRV9ERVIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBkdmhlLmRlciBwcm9maWxlIChkZXByZWNhdGVkKQorICAgIFBST0ZJTEVfRFZfSEVfREVOLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gZHZoZS5kZW4gcHJvZmlsZSAoZGVwcmVjYXRlZCkKKyAgICBQUk9GSUxFX0RWX0hFXzA0ID0gX0MyX1BMX0RWX0JBU0UgKyA0LCAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGR2aGUuMDQgcHJvZmlsZQorICAgIFBST0ZJTEVfRFZfSEVfMDUgPSBfQzJfUExfRFZfQkFTRSArIDUsICAgICAgLy8vPCBEb2xieSBWaXNpb24gZHZoZS4wNSBwcm9maWxlCisgICAgUFJPRklMRV9EVl9IRV9EVEgsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBkdmhlLmR0aCBwcm9maWxlIChkZXByZWNhdGVkKQorICAgIFBST0ZJTEVfRFZfSEVfMDcgPSBfQzJfUExfRFZfQkFTRSArIDcsICAgICAgLy8vPCBEb2xieSBWaXNpb24gZHZoZS4wNyBwcm9maWxlCisgICAgUFJPRklMRV9EVl9IRV8wOCA9IF9DMl9QTF9EVl9CQVNFICsgOCwgICAgICAvLy88IERvbGJ5IFZpc2lvbiBkdmhlLjA4IHByb2ZpbGUKKyAgICBQUk9GSUxFX0RWX0FWXzA5ID0gX0MyX1BMX0RWX0JBU0UgKyA5LCAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGR2YXYuMDkgcHJvZmlsZQorCisgICAgLy8gQVYxIHByb2ZpbGVzCisgICAgUFJPRklMRV9BVjFfMCA9IF9DMl9QTF9BVjFfQkFTRSwgICAgICAgICAgICAvLy88IEFWMSBQcm9maWxlIDAgKDQ6MjowLCA4IHRvIDEwIGJpdCkKKyAgICBQUk9GSUxFX0FWMV8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIFByb2ZpbGUgMSAoOCB0byAxMCBiaXQpCisgICAgUFJPRklMRV9BVjFfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBQcm9maWxlIDIgKDggdG8gMTIgYml0KQorfTsKKworZW51bSBDMkNvbmZpZzo6bGV2ZWxfdCA6IHVpbnQzMl90IHsKKyAgICBMRVZFTF9VTlVTRUQgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbGV2ZWwgaXMgbm90IHVzZWQgYnkgdGhpcyBtZWRpYSB0eXBlCisKKyAgICAvLyBNUEVHLTIgVmlkZW8gbGV2ZWxzCisgICAgTEVWRUxfTVAyVl9MT1cgPSBfQzJfUExfTVAyVl9CQVNFLCAgICAgICAgICAvLy88IE1QRUctMiBWaWRlbyAoSC4yNjIpIExvdyBMZXZlbAorICAgIExFVkVMX01QMlZfTUFJTiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTIgVmlkZW8gKEguMjYyKSBNYWluIExldmVsCisgICAgTEVWRUxfTVAyVl9ISUdIXzE0NDAsICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctMiBWaWRlbyAoSC4yNjIpIEhpZ2ggMTQ0MCBMZXZlbAorICAgIExFVkVMX01QMlZfSElHSCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTIgVmlkZW8gKEguMjYyKSBIaWdoIExldmVsCisgICAgTEVWRUxfTVAyVl9ISUdIUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctMiBWaWRlbyAoSC4yNjIpIEhpZ2hQIExldmVsCisKKyAgICAvLyBILjI2MyBsZXZlbHMKKyAgICBMRVZFTF9IMjYzXzEwID0gX0MyX1BMX0gyNjNfQkFTRSwgICAgICAgICAgIC8vLzwgSC4yNjMgTGV2ZWwgMTAKKyAgICBMRVZFTF9IMjYzXzIwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgTGV2ZWwgMjAKKyAgICBMRVZFTF9IMjYzXzMwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgTGV2ZWwgMzAKKyAgICBMRVZFTF9IMjYzXzQwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgTGV2ZWwgNDAKKyAgICBMRVZFTF9IMjYzXzQ1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgTGV2ZWwgNDUKKyAgICBMRVZFTF9IMjYzXzUwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgTGV2ZWwgNTAKKyAgICBMRVZFTF9IMjYzXzYwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgTGV2ZWwgNjAKKyAgICBMRVZFTF9IMjYzXzcwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgTGV2ZWwgNzAKKworICAgIC8vIE1QRUctNCBQYXJ0IDIgKFZpZGVvKSBsZXZlbHMKKyAgICBMRVZFTF9NUDRWXzAgPSBfQzJfUExfTVA0Vl9CQVNFLCAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIExldmVsIDAKKyAgICBMRVZFTF9NUDRWXzBCLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIExldmVsIDBiCisgICAgTEVWRUxfTVA0Vl8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBMZXZlbCAxCisgICAgTEVWRUxfTVA0Vl8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBMZXZlbCAyCisgICAgTEVWRUxfTVA0Vl8zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBMZXZlbCAzCisgICAgTEVWRUxfTVA0Vl8zQiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBMZXZlbCAzYgorICAgIExFVkVMX01QNFZfNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gTGV2ZWwgNAorICAgIExFVkVMX01QNFZfNEEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gTGV2ZWwgNGEKKyAgICBMRVZFTF9NUDRWXzUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIExldmVsIDUKKyAgICBMRVZFTF9NUDRWXzYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIExldmVsIDYKKworICAgIC8vIEFWQyAvIE1QRUctNCBQYXJ0IDEwIChILjI2NCkgbGV2ZWxzCisgICAgTEVWRUxfQVZDXzEgPSBfQzJfUExfQVZDX0JBU0UsICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDEKKyAgICBMRVZFTF9BVkNfMUIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgMWIKKyAgICBMRVZFTF9BVkNfMV8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgMS4xCisgICAgTEVWRUxfQVZDXzFfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDEuMgorICAgIExFVkVMX0FWQ18xXzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAxLjMKKyAgICBMRVZFTF9BVkNfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgMgorICAgIExFVkVMX0FWQ18yXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAyLjEKKyAgICBMRVZFTF9BVkNfMl8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgMi4yCisgICAgTEVWRUxfQVZDXzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDMKKyAgICBMRVZFTF9BVkNfM18xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgMy4xCisgICAgTEVWRUxfQVZDXzNfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDMuMgorICAgIExFVkVMX0FWQ180LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCA0CisgICAgTEVWRUxfQVZDXzRfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDQuMQorICAgIExFVkVMX0FWQ180XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCA0LjIKKyAgICBMRVZFTF9BVkNfNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgNQorICAgIExFVkVMX0FWQ181XzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCA1LjEKKyAgICBMRVZFTF9BVkNfNV8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgNS4yCisKKyAgICAvLyBIRVZDIChILjI2NSkgdGllcnMgYW5kIGxldmVscworICAgIExFVkVMX0hFVkNfTUFJTl8xID0gX0MyX1BMX0hFVkNfQkFTRSwgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDEKKyAgICBMRVZFTF9IRVZDX01BSU5fMiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gVGllciBMZXZlbCAyCisgICAgTEVWRUxfSEVWQ19NQUlOXzJfMSwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgMi4xCisgICAgTEVWRUxfSEVWQ19NQUlOXzMsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgMworICAgIExFVkVMX0hFVkNfTUFJTl8zXzEsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDMuMQorICAgIExFVkVMX0hFVkNfTUFJTl80LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDQKKyAgICBMRVZFTF9IRVZDX01BSU5fNF8xLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gVGllciBMZXZlbCA0LjEKKyAgICBMRVZFTF9IRVZDX01BSU5fNSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gVGllciBMZXZlbCA1CisgICAgTEVWRUxfSEVWQ19NQUlOXzVfMSwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgNS4xCisgICAgTEVWRUxfSEVWQ19NQUlOXzVfMiwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgNS4yCisgICAgTEVWRUxfSEVWQ19NQUlOXzYsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgNgorICAgIExFVkVMX0hFVkNfTUFJTl82XzEsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDYuMQorICAgIExFVkVMX0hFVkNfTUFJTl82XzIsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDYuMgorCisgICAgTEVWRUxfSEVWQ19ISUdIXzQgPSBfQzJfUExfSEVWQ19CQVNFICsgMHgxMDAsICAvLy88IEhFVkMgKEguMjY1KSBIaWdoIFRpZXIgTGV2ZWwgNAorICAgIExFVkVMX0hFVkNfSElHSF80XzEsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgSGlnaCBUaWVyIExldmVsIDQuMQorICAgIExFVkVMX0hFVkNfSElHSF81LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgSGlnaCBUaWVyIExldmVsIDUKKyAgICBMRVZFTF9IRVZDX0hJR0hfNV8xLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIEhpZ2ggVGllciBMZXZlbCA1LjEKKyAgICBMRVZFTF9IRVZDX0hJR0hfNV8yLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIEhpZ2ggVGllciBMZXZlbCA1LjIKKyAgICBMRVZFTF9IRVZDX0hJR0hfNiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIEhpZ2ggVGllciBMZXZlbCA2CisgICAgTEVWRUxfSEVWQ19ISUdIXzZfMSwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBIaWdoIFRpZXIgTGV2ZWwgNi4xCisgICAgTEVWRUxfSEVWQ19ISUdIXzZfMiwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBIaWdoIFRpZXIgTGV2ZWwgNi4yCisKKyAgICAvLyBWUDkgbGV2ZWxzCisgICAgTEVWRUxfVlA5XzEgPSBfQzJfUExfVlA5X0JBU0UsICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCAxCisgICAgTEVWRUxfVlA5XzFfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCAxLjEKKyAgICBMRVZFTF9WUDlfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDIKKyAgICBMRVZFTF9WUDlfMl8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDIuMQorICAgIExFVkVMX1ZQOV8zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgTGV2ZWwgMworICAgIExFVkVMX1ZQOV8zXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgTGV2ZWwgMy4xCisgICAgTEVWRUxfVlA5XzQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCA0CisgICAgTEVWRUxfVlA5XzRfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCA0LjEKKyAgICBMRVZFTF9WUDlfNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDUKKyAgICBMRVZFTF9WUDlfNV8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDUuMQorICAgIExFVkVMX1ZQOV81XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgTGV2ZWwgNS4yCisgICAgTEVWRUxfVlA5XzYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCA2CisgICAgTEVWRUxfVlA5XzZfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCA2LjEKKyAgICBMRVZFTF9WUDlfNl8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDYuMgorCisgICAgLy8gRG9sYnkgVmlzaW9uIGxldmVsCisgICAgTEVWRUxfRFZfTUFJTl9IRF8yNCA9IF9DMl9QTF9EVl9CQVNFLCAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBtYWluIHRpZXIgaGQyNAorICAgIExFVkVMX0RWX01BSU5fSERfMzAsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gbWFpbiB0aWVyIGhkMzAKKyAgICBMRVZFTF9EVl9NQUlOX0ZIRF8yNCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIG1haW4gdGllciBmaGQyNAorICAgIExFVkVMX0RWX01BSU5fRkhEXzMwLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gbWFpbiB0aWVyIGZoZDMwCisgICAgTEVWRUxfRFZfTUFJTl9GSERfNjAsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBtYWluIHRpZXIgZmhkNjAKKyAgICBMRVZFTF9EVl9NQUlOX1VIRF8yNCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIG1haW4gdGllciB1aGQyNAorICAgIExFVkVMX0RWX01BSU5fVUhEXzMwLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gbWFpbiB0aWVyIHVoZDMwCisgICAgTEVWRUxfRFZfTUFJTl9VSERfNDgsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBtYWluIHRpZXIgdWhkNDgKKyAgICBMRVZFTF9EVl9NQUlOX1VIRF82MCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIG1haW4gdGllciB1aGQ2MAorCisgICAgTEVWRUxfRFZfSElHSF9IRF8yNCA9IF9DMl9QTF9EVl9CQVNFICsgMHgxMDAsICAvLy88IERvbGJ5IFZpc2lvbiBoaWdoIHRpZXIgaGQyNAorICAgIExFVkVMX0RWX0hJR0hfSERfMzAsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gaGlnaCB0aWVyIGhkMzAKKyAgICBMRVZFTF9EVl9ISUdIX0ZIRF8yNCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGhpZ2ggdGllciBmaGQyNAorICAgIExFVkVMX0RWX0hJR0hfRkhEXzMwLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gaGlnaCB0aWVyIGZoZDMwCisgICAgTEVWRUxfRFZfSElHSF9GSERfNjAsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBoaWdoIHRpZXIgZmhkNjAKKyAgICBMRVZFTF9EVl9ISUdIX1VIRF8yNCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGhpZ2ggdGllciB1aGQyNAorICAgIExFVkVMX0RWX0hJR0hfVUhEXzMwLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gaGlnaCB0aWVyIHVoZDMwCisgICAgTEVWRUxfRFZfSElHSF9VSERfNDgsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBoaWdoIHRpZXIgdWhkNDgKKyAgICBMRVZFTF9EVl9ISUdIX1VIRF82MCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGhpZ2ggdGllciB1aGQ2MAorCisgICAgTEVWRUxfQVYxXzIgICAgPSBfQzJfUExfQVYxX0JBU0UgLCAgICAgICAgICAvLy88IEFWMSBMZXZlbCAyCisgICAgTEVWRUxfQVYxXzJfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCAyLjEKKyAgICBMRVZFTF9BVjFfMl8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDIuMgorICAgIExFVkVMX0FWMV8yXzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgMi4zCisgICAgTEVWRUxfQVYxXzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCAzCisgICAgTEVWRUxfQVYxXzNfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCAzLjEKKyAgICBMRVZFTF9BVjFfM18yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDMuMgorICAgIExFVkVMX0FWMV8zXzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgMy4zCisgICAgTEVWRUxfQVYxXzQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA0CisgICAgTEVWRUxfQVYxXzRfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA0LjEKKyAgICBMRVZFTF9BVjFfNF8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDQuMgorICAgIExFVkVMX0FWMV80XzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNC4zCisgICAgTEVWRUxfQVYxXzUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA1CisgICAgTEVWRUxfQVYxXzVfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA1LjEKKyAgICBMRVZFTF9BVjFfNV8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDUuMgorICAgIExFVkVMX0FWMV81XzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNS4zCisgICAgTEVWRUxfQVYxXzYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA2CisgICAgTEVWRUxfQVYxXzZfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA2LjEKKyAgICBMRVZFTF9BVjFfNl8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDYuMgorICAgIExFVkVMX0FWMV82XzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNi4zCisgICAgTEVWRUxfQVYxXzcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA3CisgICAgTEVWRUxfQVYxXzdfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA3LjEKKyAgICBMRVZFTF9BVjFfN18yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDcuMgorICAgIExFVkVMX0FWMV83XzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNy4zCit9OworCitzdHJ1Y3QgQzJQcm9maWxlTGV2ZWxTdHJ1Y3QgeworICAgIEMyQ29uZmlnOjpwcm9maWxlX3QgcHJvZmlsZTsgIC8vLzwgY29kaW5nIHByb2ZpbGUKKyAgICBDMkNvbmZpZzo6bGV2ZWxfdCAgIGxldmVsOyAgICAvLy88IGNvZGluZyBsZXZlbAorCisgICAgQzJQcm9maWxlTGV2ZWxTdHJ1Y3QoCisgICAgICAgICAgICBDMkNvbmZpZzo6cHJvZmlsZV90IHByb2ZpbGVfID0gQzJDb25maWc6OlBST0ZJTEVfVU5VU0VELAorICAgICAgICAgICAgQzJDb25maWc6OmxldmVsX3QgbGV2ZWxfID0gQzJDb25maWc6OkxFVkVMX1VOVVNFRCkKKyAgICAgICAgOiBwcm9maWxlKHByb2ZpbGVfKSwgbGV2ZWwobGV2ZWxfKSB7IH0KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoUHJvZmlsZUxldmVsKQorICAgIEMyRklFTEQocHJvZmlsZSwgInByb2ZpbGUiKQorICAgIEMyRklFTEQobGV2ZWwsICAgImxldmVsIikKK307CisKKy8vIFRPRE86IG1heSBuZWVkIHRvIG1ha2UgdGhpcyBleHBsaWNpdCAoaGF2ZSAuc2V0IG1lbWJlcikKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyUHJvZmlsZUxldmVsU3RydWN0LCBrUGFyYW1JbmRleFByb2ZpbGVMZXZlbD4KKyAgICAgICAgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTFtdID0gImNvZGVkLnBsIjsKKyNkZWZpbmUgQzJfUEFSQU1LRVlfU1RSRUFNX1BST0ZJTEVfTEVWRUwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTAorCisvKioKKyAqIENvZGVjLXNwZWNpZmljIGluaXRpYWxpemF0aW9uIGRhdGEuCisgKgorICogVGhpcyBpcyBpbml0aWFsaXphdGlvbiBkYXRhIGZvciB0aGUgY29kZWMuCisgKgorICogRm9yIEFWQy9IRVZDLCB0aGVzZSBhcmUgdGhlIGNvbmNhdGVuYXRlZCBTUFMvUFBTL1ZQUyBOQUxzLgorICoKKyAqIFRPRE86IGRlZmluZSBmb3Igb3RoZXIgY29kZWNzLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkJsb2JWYWx1ZSwga1BhcmFtSW5kZXhJbml0RGF0YT4gQzJTdHJlYW1Jbml0RGF0YUluZm87Cit0eXBlZGVmIEMyU3RyZWFtSW5pdERhdGFJbmZvIEMyU3RyZWFtQ3NkSW5mbzsgLy8gZGVwcmVjYXRlZAorY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5JVF9EQVRBW10gPSAiY29kZWQuaW5pdC1kYXRhIjsKKyNkZWZpbmUgQzJfUEFSQU1LRVlfU1RSRUFNX0lOSVRfREFUQSBDMl9QQVJBTUtFWV9JTklUX0RBVEEKKworLyoqCisgKiBTdXBwbGVtZW50YWwgRGF0YS4KKyAqCisgKiBUaGlzIGlzIGNvZGluZy1zcGVjaWZpYyBzdXBwbGVtZW50YWwgaW5mb3JtYXRpb25hbCBkYXRhLCBlLmcuIFNFSSBmb3IgQVZDL0hFVkMuCisgKiBUaGlzIHN0cnVjdHVyZSBpcyBub3QgYSBjb25maWd1cmF0aW9uIHNvIGl0IGRvZXMgbm90IGhhdmUgYSBwYXJhbWV0ZXIga2V5LgorICogVGhpcyBzdHJ1Y3R1cmUgc2hhbGwgYmUgcmV0dXJuZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gdXBkYXRlLCBhbmQgY2FuIGJlIHJlcGVhdGVkIGFzIG5lZWRlZAorICogaW4gdGhlIHNhbWUgdXBkYXRlLgorICovCitDMkVOVU0oQzJDb25maWc6OnN1cHBsZW1lbnRhbF9pbmZvX3QsIHVpbnQzMl90LAorICAgIElORk9fTk9ORSA9IDAsCisKKyAgICBJTkZPX1BSRUZJWF9TRUlfVU5JVCA9IDB4MTAwMDAsIC8vLzwgcHJlZml4IFNFSSBwYXlsb2FkIHR5cGVzIGFkZCB0aGlzIGZsYWcKKyAgICBJTkZPX1NVRkZJWF9TRUlfVU5JVCA9IDB4MjAwMDAsIC8vLzwgc3VmZml4IFNFSSBwYXlsb2FkIHR5cGVzIGFkZCB0aGlzIGZsYWcKKworICAgIElORk9fU0VJX1VTRVJfREFUQSA9IElORk9fUFJFRklYX1NFSV9VTklUIHwgNCwgICAgLy8vPCBjbG9zZWQtY2FwdGlvbmluZyBkYXRhIChJVFUtVCBUMzUpCisgICAgSU5GT19TRUlfTURDViAgICAgID0gSU5GT19QUkVGSVhfU0VJX1VOSVQgfCAxMzcsICAvLy88IG1hc3RlcmluZyBkaXNwbGF5IGNvbG9yIHZvbHVtZQorICAgIElORk9fU0VUX1VTRVJfREFUQV9TRlggPSBJTkZPX1NVRkZJWF9TRUlfVU5JVCB8IDQsIC8vLzwgY2xvc2VkLWNhcHRpb25pbmcgZGF0YSAoSVRVLVQgVDM1KQorCisgICAgSU5GT19WRU5ET1JfU1RBUlQgPSAweDcwMDAwMDAwCispCisKK3N0cnVjdCBDMlN1cHBsZW1lbnRhbERhdGFTdHJ1Y3QgeworICAgIEMyU3VwcGxlbWVudGFsRGF0YVN0cnVjdCgpCisgICAgICAgIDogdHlwZV8oSU5GT19OT05FKSB7IH0KKworICAgIEMyU3VwcGxlbWVudGFsRGF0YVN0cnVjdCgKKyAgICAgICAgICAgIHNpemVfdCBmbGV4Q291bnQsIEMyQ29uZmlnOjpzdXBwbGVtZW50YWxfaW5mb190IHR5cGUsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGFfKQorICAgICAgICA6IHR5cGVfKHR5cGUpIHsKKyAgICAgICAgICAgIG1lbWNweShkYXRhLCAmZGF0YV9bMF0sIGMyX21pbihkYXRhXy5zaXplKCksIGZsZXhDb3VudCkpOworICAgIH0KKworICAgIEMyQ29uZmlnOjpzdXBwbGVtZW50YWxfaW5mb190IHR5cGVfOworICAgIHVpbnQ4X3QgZGF0YVtdOworCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKFN1cHBsZW1lbnRhbERhdGEsIGRhdGEpCisgICAgQzJGSUVMRCh0eXBlXywgInR5cGUiKQorICAgIEMyRklFTEQoZGF0YSwgImRhdGEiKQorfTsKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyU3VwcGxlbWVudGFsRGF0YVN0cnVjdCwga1BhcmFtSW5kZXhTdXBwbGVtZW50YWxEYXRhPgorICAgICAgICBDMlN0cmVhbVN1cHBsZW1lbnRhbERhdGFJbmZvOworCisvKioKKyAqIFN1cHBsZW1lbnRhbCBEYXRhIFN1YnNjcmlwdGlvbgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8QzJDb25maWc6OnN1cHBsZW1lbnRhbF9pbmZvX3Q+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4U3Vic2NyaWJlZFN1cHBsZW1lbnRhbERhdGE+CisgICAgICAgIEMyU3RyZWFtU3Vic2NyaWJlZFN1cHBsZW1lbnRhbERhdGFUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9TVUJTQ1JJQkVEX1NVUFBMRU1FTlRBTF9EQVRBW10gPSAib3V0cHV0LnN1YnNjcmliZWQtc3VwcGxlbWVudGFsIjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwaXBlbGluZSBjaGFyYWN0ZXJpc3RpY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIE1lZGlhLXR5cGUuCisgKgorICogVGhpcyBpcyBkZWZpbmVkIGZvciBib3RoIHBvcnQgYW5kIHN0cmVhbSwgYnV0IHN0cmVhbSBtZWRpYSB0eXBlIG1heSBiZSBhIHN1YnR5cGUgb2YgdGhlCisgKiBwb3J0IG1lZGlhIHR5cGUuCisgKi8KK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJTZXR0aW5nLCBDMlN0cmluZ1ZhbHVlLCBrUGFyYW1JbmRleE1lZGlhVHlwZT4gQzJQb3J0TWVkaWFUeXBlU2V0dGluZzsKK3R5cGVkZWYgQzJQb3J0TWVkaWFUeXBlU2V0dGluZyBDMlBvcnRNaW1lQ29uZmlnOyAvLyBkZXByZWNhdGVkCitjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFW10gPSAiaW5wdXQubWVkaWEtdHlwZSI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRVtdID0gIm91dHB1dC5tZWRpYS10eXBlIjsKKyNkZWZpbmUgQzJfTkFNRV9JTlBVVF9QT1JUX01JTUVfU0VUVElORyBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFCisjZGVmaW5lIEMyX05BTUVfT1VUUFVUX1BPUlRfTUlNRV9TRVRUSU5HIEMyX1BBUkFNS0VZX09VVFBVVF9NRURJQV9UWVBFCisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlNldHRpbmcsIEMyU3RyaW5nVmFsdWUsIGtQYXJhbUluZGV4TWVkaWFUeXBlPiBDMlN0cmVhbU1lZGlhVHlwZVNldHRpbmc7CisKKy8qKgorICogUGlwZWxpbmUgZGVsYXlzLgorICoKKyAqIElucHV0IGRlbGF5IGlzIHRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBpbnB1dCBmcmFtZXMgcmVxdWVzdGVkIGJ5IHRoZSBjb21wb25lbnQgdG8gcHJvY2VzcworICogYW4gaW5wdXQgZnJhbWUuCisgKgorICogT3V0cHV0IGRlbGF5IGlzIHRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBvdXRwdXQgZnJhbWVzIHRoYXQgbmVlZCB0byBiZSBnZW5lcmF0ZWQgYmVmb3JlIGFuCisgKiBvdXRwdXQgY2FuIGJlIHJlbGVhc2VkIGJ5IHRoZSBjb21wb25lbnQuCisgKgorICogUGlwZWxpbmUgZGVsYXkgaXMgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIGZyYW1lcyB0aGF0IGFyZSBwcm9jZXNzZWQgYXQgb25lIHRpbWUgYnkgdGhlCisgKiBjb21wb25lbnQuCisgKgorICogQXMgdGhlc2UgbWF5IHZhcnkgZnJvbSBmcmFtZSB0byBmcmFtZSwgdGhlIG51bWJlciBpcyB0aGUgbWF4aW11bSByZXF1aXJlZCB2YWx1ZS4gRS5nLiBpZgorICogaW5wdXQgZGVsYXkgaXMgMCwgdGhlIGNvbXBvbmVudCBpcyBleHBlY3RlZCB0byBjb25zdW1lIGVhY2ggZnJhbWUgcXVldWVkIGV2ZW4gaWYgbm8gZnVydGhlcgorICogZnJhbWVzIGFyZSBxdWV1ZWQuIFNpbWlsYXJseSwgaWYgaW5wdXQgZGVsYXkgaXMgMSwgYXMgbG9uZyBhcyB0aGVyZSBhcmUgYWx3YXlzIGV4YWN0bHkgMgorICogb3V0c3RhbmRpbmcgaW5wdXQgZnJhbWVzIHF1ZXVlZCB0byB0aGUgY29tcG9uZW50LCBpdCBzaGFsbCBwcm9kdWNlIG91dHB1dC4KKyAqLworCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleERlbGF5UmVxdWVzdD4gQzJQb3J0UmVxdWVzdGVkRGVsYXlUdW5pbmc7Cit0eXBlZGVmIEMyUG9ydFJlcXVlc3RlZERlbGF5VHVuaW5nIEMyUG9ydFJlcXVlc3RlZExhdGVuY3lUdW5pbmc7IC8vIGRlcHJlY2F0ZWQKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX0RFTEFZX1JFUVVFU1RbXSA9ICJpbnB1dC5kZWxheS5yZXF1ZXN0ZWQiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX0RFTEFZX1JFUVVFU1RbXSA9ICJvdXRwdXQuZGVsYXkucmVxdWVzdGVkIjsKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleERlbGF5UmVxdWVzdD4KKyAgICAgICAgQzJSZXF1ZXN0ZWRQaXBlbGluZURlbGF5VHVuaW5nOwordHlwZWRlZiBDMlJlcXVlc3RlZFBpcGVsaW5lRGVsYXlUdW5pbmcgQzJDb21wb25lbnRSZXF1ZXN0ZWRMYXRlbmN5VHVuaW5nOyAvLyBkZXByZWNhdGVkCitjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QSVBFTElORV9ERUxBWV9SRVFVRVNUW10gPSAicGlwZWxpbmUtZGVsYXkucmVxdWVzdGVkIjsKKworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleERlbGF5PiBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzsKK3R5cGVkZWYgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmcgQzJQb3J0TGF0ZW5jeUluZm87IC8vIGRlcHJlY2F0ZWQKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX0RFTEFZW10gPSAiaW5wdXQuZGVsYXkuYWN0dWFsIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9ERUxBWVtdID0gIm91dHB1dC5kZWxheS5hY3R1YWwiOworCisvLyByZWFkLW9ubHkKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhEZWxheT4gQzJBY3R1YWxQaXBlbGluZURlbGF5VHVuaW5nOwordHlwZWRlZiBDMkFjdHVhbFBpcGVsaW5lRGVsYXlUdW5pbmcgQzJDb21wb25lbnRMYXRlbmN5SW5mbzsgLy8gZGVwcmVjYXRlZAorY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUElQRUxJTkVfREVMQVlbXSA9ICJhbGdvLmRlbGF5LmFjdHVhbCI7CisKKy8qKgorICogUmVmZXJlbmNlIGNoYXJhY3RlcmlzdGljcy4KKyAqCisgKiBUaGUgY29tcG9uZW50IG1heSBob2xkIG9udG8gaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGV2ZW4gYWZ0ZXIgY29tcGxldGluZyB0aGUgY29ycmVzcG9uZGluZworICogd29yayBpdGVtLgorICoKKyAqIE1heCByZWZlcmVuY2UgYWdlIGlzIHRoZSBsb25nZXN0IG51bWJlciBvZiBhZGRpdGlvbmFsIGZyYW1lIHByb2Nlc3NpbmcgdGhhdCBhIGNvbXBvbmVudCBtYXkKKyAqIGhvbGQgb250byBhIGJ1ZmZlciBmb3IuIE1heCByZWZlcmVuY2UgY291bnQgaXMgdGhlIG51bWJlciBvZiBidWZmZXJzIHRoYXQgYSBjb21wb25lbnQgbWF5CisgKiBob2xkIG9udG8gYXQgdGhlIHNhbWUgdGltZSBhdCB0aGUgd29yc3QgY2FzZS4gVGhlc2UgbnVtYmVycyBhc3N1bWUgc2luZ2xlIGZyYW1lIHBlciBidWZmZXJzLgorICoKKyAqIFVzZSBtYXgtdWludDMyIGlmIHRoZXJlIGlzIG5vIGxpbWl0IGZvciB0aGUgbWF4IGFnZSBvciBjb3VudC4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleE1heFJlZmVyZW5jZUFnZT4KKyAgICAgICAgQzJTdHJlYW1NYXhSZWZlcmVuY2VBZ2VUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfUkVGRVJFTkNFX0FHRVtdID0gImlucHV0LnJlZmVyZW5jZS5tYXgtYWdlIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9NQVhfUkVGRVJFTkNFX0FHRVtdID0gIm91dHB1dC5yZWZlcmVuY2UubWF4LWFnZSI7CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhNYXhSZWZlcmVuY2VDb3VudD4KKyAgICAgICAgQzJTdHJlYW1NYXhSZWZlcmVuY2VDb3VudFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9SRUZFUkVOQ0VfQ09VTlRbXSA9ICJpbnB1dC5yZWZlcmVuY2UubWF4LWNvdW50IjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9NQVhfUkVGRVJFTkNFX0NPVU5UW10gPSAib3V0cHV0LnJlZmVyZW5jZS5tYXgtY291bnQiOworCisvKioKKyAqIE91dHB1dCByZW9yZGVyaW5nLgorICoKKyAqIFRoZSBzaXplIG9mIHRoZSB3aW5kb3cgdG8gdXNlIGZvciBvdXRwdXQgYnVmZmVyIHJlb3JkZXJpbmcuIDAgaXMgaW50ZXJwcmV0ZWQgYXMgMS4KKyAqLworLy8gb3V0cHV0IG9ubHkKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4UmVvcmRlckJ1ZmZlckRlcHRoPgorICAgICAgICBDMlBvcnRSZW9yZGVyQnVmZmVyRGVwdGhUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfUkVPUkRFUl9ERVBUSFtdID0gIm91dHB1dC5yZW9yZGVyLmRlcHRoIjsKKworQzJFTlVNKEMyQ29uZmlnOjpvcmRpbmFsX2tleV90LCB1aW50MzJfdCwKKyAgICAgICAgT1JESU5BTCwKKyAgICAgICAgVElNRVNUQU1QLAorICAgICAgICBDVVNUT00pCisKKy8vIHJlYWQtb25seSwgb3V0cHV0IG9ubHkKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJTZXR0aW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjpvcmRpbmFsX2tleV90Piwga1BhcmFtSW5kZXhSZW9yZGVyS2V5PgorICAgICAgICBDMlBvcnRSZW9yZGVyS2V5U2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9SRU9SREVSX0tFWVtdID0gIm91dHB1dC5yZW9yZGVyLmtleSI7CisKKy8qKgorICogU3RyZWFtIGNvdW50LgorICovCisvLyBwcml2YXRlCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleFN0cmVhbUNvdW50PiBDMlBvcnRTdHJlYW1Db3VudFR1bmluZzsKK3R5cGVkZWYgQzJQb3J0U3RyZWFtQ291bnRUdW5pbmcgQzJQb3J0U3RyZWFtQ291bnRDb25maWc7IC8vIGRlcHJlY2F0ZWQKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9DT1VOVFtdID0gImlucHV0LnN0cmVhbS1jb3VudCI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0NPVU5UW10gPSAib3V0cHV0LnN0cmVhbS1jb3VudCI7CisKKy8qKgorICogQ29uZmlnIHVwZGF0ZSBzdWJzY3JpcHRpb24uCisgKi8KKy8vIHByaXZhdGUKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJVaW50MzJBcnJheSwga1BhcmFtSW5kZXhTdWJzY3JpYmVkUGFyYW1JbmRpY2VzPgorICAgICAgICBDMlN1YnNjcmliZWRQYXJhbUluZGljZXNUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9TVUJTQ1JJQkVEX1BBUkFNX0lORElDRVNbXSA9ICJvdXRwdXQuc3Vic2NyaWJlZC1pbmRpY2VzIjsKKworLyoqCisgKiBTdWdnZXN0ZWQgYnVmZmVyIChDMkZyYW1lKSBjb3VudC4gVGhpcyBpcyBhIHN1Z2dlc3Rpb24gYnkgdGhlIGNvbXBvbmVudCBmb3IgdGhlIG51bWJlciBvZgorICogaW5wdXQgYW5kIG91dHB1dCBmcmFtZXMgYWxsb2NhdGVkIGZvciB0aGUgY29tcG9uZW50J3MgdXNlIGluIHRoZSBidWZmZXIgcG9vbHMuCisgKgorICogQ29tcG9uZW50IHNoYWxsIHNldCB0aGUgYWNjZXB0YWJsZSByYW5nZSBvZiBidWZmZXJzIGFsbG9jYXRlZCBmb3IgaXQuIEUuZy4gY2xpZW50IHNoYWxsCisgKiBhbGxvY2F0ZSBhdCBsZWFzdCB0aGUgbWluaW11bSByZXF1aXJlZCB2YWx1ZS4KKyAqLworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQ2NEFycmF5LCBrUGFyYW1JbmRleFN1Z2dlc3RlZEJ1ZmZlckNvdW50PgorICAgICAgICBDMlBvcnRTdWdnZXN0ZWRCdWZmZXJDb3VudFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NVR0dFU1RFRF9CVUZGRVJfQ09VTlRbXSA9ICJpbnB1dC5idWZmZXJzLnBvb2wtc2l6ZSI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfU1VHR0VTVEVEX0JVRkZFUl9DT1VOVFtdID0gIm91dHB1dC5idWZmZXJzLnBvb2wtc2l6ZSI7CisKKy8qKgorICogSW5wdXQvb3V0cHV0IGJhdGNoaW5nLgorICoKKyAqIEZvciBpbnB1dCwgY29tcG9uZW50IHJlcXVlc3RzIHRoYXQgY2xpZW50IGJhdGNoZXMgd29yayBpbiBiYXRjaGVzIG9mIHNwZWNpZmllZCBzaXplLiBGb3Igb3V0cHV0LAorICogY2xpZW50IHJlcXVlc3RzIHRoYXQgdGhlIGNvbXBvbmVudCBiYXRjaGVzIHdvcmsgY29tcGxldGlvbiBpbiBnaXZlbiBiYXRjaCBzaXplLgorICogVmFsdWUgMCBtZWFucyBkb24ndCBjYXJlLgorICovCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQ2NEFycmF5LCBrUGFyYW1JbmRleEJhdGNoU2l6ZT4gQzJQb3J0QmF0Y2hTaXplVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfQkFUQ0hfU0laRVtdID0gImlucHV0LmJ1ZmZlcnMuYmF0Y2gtc2l6ZSI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfQkFUQ0hfU0laRVtdID0gIm91dHB1dC5idWZmZXJzLmJhdGNoLXNpemUiOworCisvKioKKyAqIEN1cnJlbnQgJiBsYXN0IHdvcmsgb3JkaW5hbHMuCisgKgorICogaW5wdXQgcG9ydDogbGFzdCB3b3JrIHF1ZXVlZCB0byBjb21wb25lbnQuCisgKiBvdXRwdXQgcG9ydDogbGFzdCB3b3JrIGNvbXBsZXRlZCBieSBjb21wb25lbnQuCisgKiBnbG9iYWw6IGN1cnJlbnQgd29yay4KKyAqLwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJXb3JrT3JkaW5hbFN0cnVjdCwga1BhcmFtSW5kZXhMYXN0V29ya1F1ZXVlZD4gQzJMYXN0V29ya1F1ZXVlZFR1bmluZzsKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJXb3JrT3JkaW5hbFN0cnVjdCwga1BhcmFtSW5kZXhDdXJyZW50V29yaz4gQzJDdXJyZW50V29ya1R1bmluZzsKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1lbW9yeSBhbGxvY2F0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBBbGxvY2F0b3JzIHRvIHVzZS4KKyAqCisgKiBUaGVzZSBhcmUgcmVxdWVzdGVkIGJ5IHRoZSBjb21wb25lbnQuCisgKgorICogSWYgbm9uZSBzcGVjaWZpZWQsIGNsaWVudCB3aWxsIHVzZSB0aGUgZGVmYXVsdCBhbGxvY2F0b3IgSUQgYmFzZWQgb24gdGhlIGNvbXBvbmVudCBkb21haW4gYW5kCisgKiBraW5kLgorICovCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlNpbXBsZUFycmF5U3RydWN0PEMyQWxsb2NhdG9yOjppZF90Piwga1BhcmFtSW5kZXhBbGxvY2F0b3JzPgorICAgICAgICBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfQUxMT0NBVE9SU1tdID0gImlucHV0LmJ1ZmZlcnMuYWxsb2NhdG9yLWlkcyI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfQUxMT0NBVE9SU1tdID0gIm91dHB1dC5idWZmZXJzLmFsbG9jYXRvci1pZHMiOworCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8QzJBbGxvY2F0b3I6OmlkX3Q+LCBrUGFyYW1JbmRleEFsbG9jYXRvcnM+CisgICAgICAgIEMyUHJpdmF0ZUFsbG9jYXRvcnNUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QUklWQVRFX0FMTE9DQVRPUlNbXSA9ICJhbGdvLmJ1ZmZlcnMuYWxsb2NhdG9yLWlkcyI7CisKKy8qKgorICogQWxsb2NhdG9yIHRvIHVzZSBmb3Igb3V0cHV0dGluZyB0byBzdXJmYWNlLgorICoKKyAqIENvbXBvbmVudHMgY2FuIG9wdGlvbmFsbHkgcmVxdWVzdCBhbGxvY2F0b3IgdHlwZSBmb3Igb3V0cHV0dGluZyB0byBzdXJmYWNlLgorICoKKyAqIElmIG5vbmUgc3BlY2lmaWVkLCBjbGllbnQgd2lsbCB1c2UgdGhlIGRlZmF1bHQgQnVmZmVyUXVldWUtYmFja2VkIGFsbG9jYXRvciBJRCBmb3Igb3V0cHV0dGluZyB0bworICogc3VyZmFjZS4KKyAqLwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhTdXJmYWNlQWxsb2NhdG9yPgorICAgICAgICBDMlBvcnRTdXJmYWNlQWxsb2NhdG9yVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX1NVUkZBQ0VfQUxMT0NBVE9SW10gPSAib3V0cHV0LmJ1ZmZlcnMuc3VyZmFjZS1hbGxvY2F0b3ItaWQiOworCisvKioKKyAqIEJsb2NrIHBvb2xzIHRvIHVzZS4KKyAqCisgKiBUaGVzZSBhcmUgYWxsb2NhdGVkIGJ5IHRoZSBjbGllbnQgZm9yIHRoZSBjb21wb25lbnQgdXNpbmcgdGhlIGFsbG9jYXRvciBJRHMgc3BlY2lmaWVkIGJ5IHRoZQorICogY29tcG9uZW50LiBUaGlzIGlzIG5vdCB1c2VkIGZvciB0aGUgaW5wdXQgcG9ydC4KKyAqLwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJTaW1wbGVBcnJheVN0cnVjdDxDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdD4sIGtQYXJhbUluZGV4QmxvY2tQb29scz4KKyAgICAgICAgQzJQb3J0QmxvY2tQb29sc1R1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9CTE9DS19QT09MU1tdID0gIm91dHB1dC5idWZmZXJzLnBvb2wtaWRzIjsKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMlNpbXBsZUFycmF5U3RydWN0PEMyQmxvY2tQb29sOjpsb2NhbF9pZF90Piwga1BhcmFtSW5kZXhCbG9ja1Bvb2xzPgorICAgICAgICBDMlByaXZhdGVCbG9ja1Bvb2xzVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUFJJVkFURV9CTE9DS19QT09MU1tdID0gImFsZ28uYnVmZmVycy5wb29sLWlkcyI7CisKKy8qKgorICogVGhlIG1heCBudW1iZXIgb2YgcHJpdmF0ZSBhbGxvY2F0aW9ucyBhdCBhbnkgb25lIHRpbWUgYnkgdGhlIGNvbXBvbmVudC4KKyAqIChUaGlzIGlzIGFuIGFycmF5IHdpdGggYSBjb3JyZXNwb25kaW5nIHZhbHVlIGZvciBlYWNoIHByaXZhdGUgYWxsb2NhdG9yKQorICovCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyVWludDMyQXJyYXksIGtQYXJhbUluZGV4TWF4UmVmZXJlbmNlQ291bnQ+CisgICAgICAgIEMyTWF4UHJpdmF0ZUJ1ZmZlckNvdW50VHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfTUFYX1BSSVZBVEVfQlVGRkVSX0NPVU5UW10gPSAiYWxnby5idWZmZXJzLm1heC1jb3VudCI7CisKKy8qKgorICogQnVmZmVyIHR5cGUKKyAqCisgKiBUaGlzIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb21wb25lbnQgZm9yIHRoZSBjbGllbnQgdG8gYWxsb2NhdGUgdGhlIHByb3BlciBidWZmZXIgdHlwZSBmb3IgdGhlCisgKiBpbnB1dCBwb3J0LCBhbmQgY2FuIGJlIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgdG8gY29udHJvbCB0aGUgYnVmZmVyIHR5cGUgZm9yIHRoZSBvdXRwdXQuCisgKi8KKy8vIHByaXZhdGUKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlNldHRpbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJFYXN5RW51bTxDMkJ1ZmZlckRhdGE6OnR5cGVfdD4+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4QnVmZmVyVHlwZT4KKyAgICAgICAgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzsKKworY29uc3RleHByIEMyQnVmZmVyRGF0YTo6dHlwZV90IEMyRm9ybWF0QXVkaW8gICAgICA9IEMyQnVmZmVyRGF0YTo6TElORUFSOyAvLyBkZXByZWNhdGVkCitjb25zdGV4cHIgQzJCdWZmZXJEYXRhOjp0eXBlX3QgQzJGb3JtYXRDb21wcmVzc2VkID0gQzJCdWZmZXJEYXRhOjpMSU5FQVI7IC8vIGRlcHJlY2F0ZWQKK2NvbnN0ZXhwciBDMkJ1ZmZlckRhdGE6OnR5cGVfdCBDMkZvcm1hdFZpZGVvICAgICAgPSBDMkJ1ZmZlckRhdGE6OkdSQVBISUM7IC8vIGRlcHJlY2F0ZWQKK3R5cGVkZWYgQzJCdWZmZXJEYXRhOjp0eXBlX3QgQzJGb3JtYXRLaW5kOyAvLyBkZXByZWNhdGVkCisKK3R5cGVkZWYgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZyBDMlN0cmVhbUZvcm1hdENvbmZpZzsgLy8gZGVwcmVjYXRlZAorY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX0JVRkZFUl9UWVBFW10gPSAiaW5wdXQuYnVmZmVycy50eXBlIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQlVGRkVSX1RZUEVbXSA9ICJvdXRwdXQuYnVmZmVycy50eXBlIjsKKworLy8gZGVwcmVjYXRlZAorI2RlZmluZSBDMl9OQU1FX0lOUFVUX1NUUkVBTV9GT1JNQVRfU0VUVElORyBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQlVGRkVSX1RZUEUKKyNkZWZpbmUgQzJfTkFNRV9PVVRQVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQlVGRkVSX1RZUEUKKworLyoqCisgKiBNZW1vcnkgdXNhZ2UuCisgKgorICogU3VnZ2VzdGVkIGJ5IGNvbXBvbmVudCBmb3IgaW5wdXQgYW5kIG5lZ290aWF0ZWQgYmV0d2VlbiBjbGllbnQgYW5kIGNvbXBvbmVudCBmb3Igb3V0cHV0LgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyVWludDY0VmFsdWUsIGtQYXJhbUluZGV4VXNhZ2U+IEMyU3RyZWFtVXNhZ2VUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fVVNBR0VbXSA9ICJpbnB1dC5idWZmZXJzLnVzYWdlIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fVVNBR0VbXSA9ICJvdXRwdXQuYnVmZmVycy51c2FnZSI7CisvLyBkZXByZWNhdGVkCisjZGVmaW5lIEMyX05BTUVfSU5QVVRfU1RSRUFNX1VTQUdFX1NFVFRJTkcgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX1VTQUdFCisKKy8qKgorICogUGljdHVyZSAodmlkZW8gb3IgaW1hZ2UgZnJhbWUpIHNpemUuCisgKi8KK3N0cnVjdCBDMlBpY3R1cmVTaXplU3RydWN0IHsKKyAgICBpbmxpbmUgQzJQaWN0dXJlU2l6ZVN0cnVjdCgpCisgICAgICAgIDogd2lkdGgoMCksIGhlaWdodCgwKSB7IH0KKworICAgIGlubGluZSBDMlBpY3R1cmVTaXplU3RydWN0KHVpbnQzMl90IHdpZHRoXywgdWludDMyX3QgaGVpZ2h0XykKKyAgICAgICAgOiB3aWR0aCh3aWR0aF8pLCBoZWlnaHQoaGVpZ2h0XykgeyB9CisKKyAgICB1aW50MzJfdCB3aWR0aDsgICAgIC8vLzwgdmlkZW8gd2lkdGgKKyAgICB1aW50MzJfdCBoZWlnaHQ7ICAgIC8vLzwgdmlkZW8gaGVpZ2h0CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKFBpY3R1cmVTaXplKQorICAgIEMyRklFTEQod2lkdGgsICJ3aWR0aCIpCisgICAgQzJGSUVMRChoZWlnaHQsICJoZWlnaHQiKQorfTsKKworLyoqCisgKiBPdXQgb2YgbWVtb3J5IHNpZ25hbGluZworICoKKyAqIFRoaXMgaXMgYSBjb25maWd1cmF0aW9uIGZvciB0aGUgY2xpZW50IHRvIG1hcmsgdGhhdCBpdCBjYW5ub3QgYWxsb2NhdGUgbmVjZXNzYXJ5IHByaXZhdGUgYW5kLworICogb3Igb3V0cHV0IGJ1ZmZlcnMgdG8gY29udGludWUgb3BlcmF0aW9uLCBhbmQgdG8gc2lnbmFsIHRoZSBmYWlsaW5nIGNvbmZpZ3VyYXRpb24uCisgKi8KK3N0cnVjdCBDMk91dE9mTWVtb3J5U3RydWN0IHsKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBwb29sOyAgIC8vLzwgcG9vbCBJRCB0aGF0IGZhaWxlZCB0aGUgYWxsb2NhdGlvbgorICAgIHVpbnQ2NF90IHVzYWdlOyAgICAgICAgICAgICAgICAgLy8vPCBtZW1vcnkgdXNhZ2UgdXNlZAorICAgIEMyUGljdHVyZVNpemVTdHJ1Y3QgcGxhbmFyOyAgICAgLy8vPCBidWZmZXIgZGltZW5zaW9ucyB0byBiZSBhbGxvY2F0ZWQgaWYgMkQKKyAgICB1aW50MzJfdCBmb3JtYXQ7ICAgICAgICAgICAgICAgIC8vLzwgcGl4ZWwgZm9ybWF0IHRvIGJlIHVzZWQgaWYgMkQKKyAgICB1aW50MzJfdCBjYXBhY2l0eTsgICAgICAgICAgICAgIC8vLzwgYnVmZmVyIGNhcGFjaXR5IHRvIGJlIGFsbG9jYXRlZCBpZiAxRAorICAgIGMyX2Jvb2xfdCBvdXRPZk1lbW9yeTsgICAgICAgICAgIC8vLzwgdHJ1ZSBpZiBjb21wb25lbnQgaXMgb3V0IG9mIG1lbW9yeQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChPdXRPZk1lbW9yeSkKKyAgICBDMkZJRUxEKHBvb2wsICJwb29sIikKKyAgICBDMkZJRUxEKHVzYWdlLCAidXNhZ2UiKQorICAgIEMyRklFTEQocGxhbmFyLCAicGxhbmFyIikKKyAgICBDMkZJRUxEKGZvcm1hdCwgImZvcm1hdCIpCisgICAgQzJGSUVMRChjYXBhY2l0eSwgImNhcGFjaXR5IikKKyAgICBDMkZJRUxEKG91dE9mTWVtb3J5LCAib3V0LW9mLW1lbW9yeSIpCit9OworCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyT3V0T2ZNZW1vcnlTdHJ1Y3QsIGtQYXJhbUluZGV4T3V0T2ZNZW1vcnk+IEMyT3V0T2ZNZW1vcnlUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRfT0ZfTUVNT1JZW10gPSAiYWxnby5vb20iOworCisvKioKKyAqIE1heCBidWZmZXIgc2l6ZQorICoKKyAqIFRoaXMgaXMgYSBoaW50IHByb3ZpZGVkIGJ5IHRoZSBjb21wb25lbnQgZm9yIHRoZSBtYXhpbXVtIGJ1ZmZlciBzaXplIGV4cGVjdGVkIG9uIGEgc3RyZWFtIGZvciB0aGUKKyAqIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvbiBpdHMgaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zLiBUaGlzIGlzIGNvbW11bmljYXRlZCB0byBjbGllbnRzIHNvIHRoZXkKKyAqIGNhbiBwcmVhbGxvY2F0ZSBpbnB1dCBidWZmZXJzLCBvciBjb25maWd1cmUgZG93bnN0cmVhbSBjb21wb25lbnRzIHRoYXQgcmVxdWlyZSBhIG1heGltdW0gc2l6ZSBvbgorICogdGhlaXIgYnVmZmVycy4KKyAqCisgKiBSZWFkLW9ubHkuIFJlcXVpcmVkIHRvIGJlIHByb3ZpZGVkIGJ5IGNvbXBvbmVudHMgb24gYWxsIGNvbXByZXNzZWQgc3RyZWFtcy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhNYXhCdWZmZXJTaXplPiBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFW10gPSAiaW5wdXQuYnVmZmVycy5tYXgtc2l6ZSI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfTUFYX0JVRkZFUl9TSVpFW10gPSAib3V0cHV0LmJ1ZmZlcnMubWF4LXNpemUiOworCisjZGVmaW5lIEMyX05BTUVfU1RSRUFNX01BWF9CVUZGRVJfU0laRV9TRVRUSU5HIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1pc2MuIHN0YXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBUcmlwcGVkIHN0YXRlLAorICoKKyAqIFRoaXMgc3RhdGUgZXhpc3RzIHRvIGJlIGFibGUgdG8gcHJvdmlkZSByZWFzb25pbmcgZm9yIGEgdHJpcHBlZCBzdGF0ZSBkdXJpbmcgbm9ybWFsCisgKiBpbnRlcmZhY2Ugb3BlcmF0aW9ucywgYXMgd2VsbCBhcyB0byBhbGxvdyBjbGllbnQgdG8gdHJpcCB0aGUgY29tcG9uZW50IG9uIGRlbWFuZC4KKyAqLwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMkJvb2xWYWx1ZSwga1BhcmFtSW5kZXhUcmlwcGVkPgorICAgICAgICBDMlRyaXBwZWRUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9UUklQUEVEW10gPSAiYWxnby50cmlwcGVkIjsKKworLyoqCisgKiBDb25maWd1cmF0aW9uIGNvdW50ZXJzLgorICoKKyAqIENvbmZpZ3VyYXRpb25zIGFyZSB0cmFja2VkIHVzaW5nIHRocmVlIGNvdW50ZXJzLiBUaGUgaW5wdXQgY291bnRlciBpcyBpbmNyZW1lbnRlZCBleGFjdGx5CisgKiBvbmNlIHdpdGggZWFjaCB3b3JrIGFjY2VwdGVkIGJ5IHRoZSBjb21wb25lbnQuIFRoZSBvdXRwdXQgY291bnRlciBpcyBpbmNyZW1lbnRlZCBleGFjdGx5CisgKiBvbmNlIHdpdGggZWFjaCB3b3JrIGNvbXBsZXRlZCBieSB0aGUgY29tcG9uZW50IChpbiB0aGUgb3JkZXIgb2Ygd29yayBjb21wbGV0aW9uKS4gVGhlCisgKiBnbG9iYWwgY291bnRlciBpcyBpbmNyZW1lbnRlZCBleGFjdGx5IG9uY2UgZHVyaW5nIHRvIGVhY2ggY29uZmlnKCkgY2FsbC4gVGhlc2UgY291bnRlcnMKKyAqIHNoYWxsIGJlIHJlYWQtb25seS4KKyAqCisgKiBUT0RPOiB0aGVzZSBzaG91bGQgYmUgY291bnRlcnMuCisgKi8KK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVWludDY0VmFsdWUsIGtQYXJhbUluZGV4Q29uZmlnQ291bnRlcj4gQzJQb3J0Q29uZmlnQ291bnRlclR1bmluZzsKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJVaW50NjRWYWx1ZSwga1BhcmFtSW5kZXhDb25maWdDb3VudGVyPiBDMkNvbmZpZ0NvdW50ZXJUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9DT1VOVEVSW10gPSAiaW5wdXQuYnVmZmVycy5jb3VudGVyIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9DT1VOVEVSW10gPSAib3V0cHV0LmJ1ZmZlcnMuY291bnRlciI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT05GSUdfQ09VTlRFUltdID0gImFsZ28uY29uZmlnLmNvdW50ZXIiOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSByZXNvdXJjZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBSZXNvdXJjZXMgbmVlZGVkIGFuZCByZXNvdXJjZXMgcmVzZXJ2ZWQgZm9yIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyAqCisgKiBSZXNvdXJjZXMgYXJlIHRyYWNrZWQgYXMgYSB2ZWN0b3Igb2YgcG9zaXRpdmUgbnVtYmVycy4gQXZhaWxhYmxlIHJlc291cmNlcyBhcmUgZGVmaW5lZCBieQorICogdGhlIHZlbmRvci4KKyAqCisgKiBCeSBkZWZhdWx0LCBubyByZXNvdXJjZXMgYXJlIHJlc2VydmVkIGZvciBhIGNvbXBvbmVudC4gSWYgcmVzb3VyY2UgcmVzZXJ2YXRpb24gaXMgc3VjY2Vzc2Z1bCwKKyAqIHRoZSBjb21wb25lbnQgc2hhbGwgYmUgYWJsZSB0byB1c2UgdGhvc2UgcmVzb3VyY2VzIGV4Y2x1c2l2ZWx5LiBJZiBob3dldmVyLCB0aGUgY29tcG9uZW50IGlzCisgKiBub3QgdXNpbmcgYWxsIG9mIHRoZSByZXNlcnZlZCByZXNvdXJjZXMsIHRob3NlIG1heSBiZSBzaGFyZWQgd2l0aCBvdGhlciBjb21wb25lbnRzLgorICoKKyAqIFRPRE86IGRlZmluZSBzb21lIG9mIHRoZSByZXNvdXJjZXMuCisgKi8KK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJVaW50NjRBcnJheSwga1BhcmFtSW5kZXhSZXNvdXJjZXNOZWVkZWQ+IEMyUmVzb3VyY2VzTmVlZGVkVHVuaW5nOwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQ2NEFycmF5LCBrUGFyYW1JbmRleFJlc291cmNlc1Jlc2VydmVkPgorICAgICAgICBDMlJlc291cmNlc1Jlc2VydmVkVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUkVTT1VSQ0VTX05FRURFRFtdID0gInJlc291cmNlcy5uZWVkZWQiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUkVTT1VSQ0VTX1JFU0VSVkVEW10gPSAicmVzb3VyY2VzLnJlc2VydmVkIjsKKworLyoqCisgKiBPcGVyYXRpbmcgcmF0ZS4KKyAqCisgKiBPcGVyYXRpbmcgcmF0ZSBpcyB0aGUgZXhwZWN0ZWQgcmF0ZSBvZiB3b3JrIHRocm91Z2ggdGhlIGNvbXBvbmVudC4gTmVnYXRpdmUgdmFsdWVzIGlzCisgKiBpbnZhbGlkLgorICoKKyAqIFRPRE86IHRoaXMgY291bGQgZGlzdGluZ3Vpc2ggc2V0IHZhbHVlCisgKi8KK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleE9wZXJhdGluZ1JhdGU+IEMyT3BlcmF0aW5nUmF0ZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09QRVJBVElOR19SQVRFW10gPSAiYWxnby5yYXRlIjsKKworLyoqCisgKiBSZWFsdGltZSAvIG9wZXJhdGluZyBwb2ludC4KKyAqCisgKiBQcmlvcml0eSB2YWx1ZSBkZWZpbmVzIHRoZSBvcGVyYXRpbmcgcG9pbnQgZm9yIHRoZSBjb21wb25lbnQuIE9wZXJhdGluZyBwb2ludHMgYXJlIGRlZmluZWQgYnkKKyAqIHRoZSB2ZW5kb3IuIFByaW9yaXR5IHZhbHVlIG9mIDAgbWVhbnMgdGhhdCB0aGUgY2xpZW50IHJlcXVpcmVzIG9wZXJhdGlvbiBhdCB0aGUgZ2l2ZW4gb3BlcmF0aW5nCisgKiByYXRlLiBQcmlvcml0eSB2YWx1ZXMgLTEgYW5kIGJlbG93IGRlZmluZSBvcGVyYXRpbmcgcG9pbnRzIGluIGRlY3JlYXNpbmcgcGVyZm9ybWFuY2UuIEluIHRoaXMKKyAqIGNhc2UgY2xpZW50IGV4cGVjdHMgYmVzdCBlZmZvcnQgd2l0aG91dCBleGNlZWRpbmcgdGhlIHNwZWNpZmljIG9wZXJhdGluZyBwb2ludC4gVGhpcyBhbGxvd3MKKyAqIGNsaWVudCB0byBydW4gY29tcG9uZW50cyBkZWVwZXIgaW4gdGhlIGJhY2tncm91bmQgYnkgdXNpbmcgbGFyZ2VyIHByaW9yaXR5IHZhbHVlcy4gSW4gdGhlc2UKKyAqIGNhc2VzIG9wZXJhdGluZyByYXRlIGlzIGEgaGludCBmb3IgdGhlIG1heGltdW0gcmF0ZSB0aGF0IHRoZSBjbGllbnQgYW50aWNpcGF0ZXMuCisgKgorICogT3BlcmF0aW5nIHJhdGUgYW5kIHByaW9yaXR5IGFyZSB1c2VkIGluIHRhbmRlbS4gRS5nLiBpZiB0aGVyZSBhcmUgY29tcG9uZW50cyB0aGF0IHJ1biBhdCBhCisgKiBoaWdoZXIgb3BlcmF0aW5nIHBvaW50IChwcmlvcml0eSkgaXQgd2lsbCBtYWtlIG1vcmUgcmVzb3VyY2VzIGF2YWlsYWJsZSBmb3IgY29tcG9uZW50cyBhdAorICogYSBsb3dlciBvcGVyYXRpbmcgcG9pbnQsIHNvIG9wZXJhdGluZyByYXRlIGNhbiBiZSB1c2VkIHRvIGdhdGUgdGhvc2UgY29tcG9uZW50cy4KKyAqCisgKiBQb3NpdGl2ZSBwcmlvcml0eSB2YWx1ZXMgYXJlIG5vdCBkZWZpbmVkIGF0IHRoZSBtb21lbnQgYW5kIHNoYWxsIGJlIHRyZWF0ZWQgZXF1aXZhbGVudCB0byAwLgorICovCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMySW50MzJWYWx1ZSwga1BhcmFtSW5kZXhSZWFsVGltZVByaW9yaXR5PgorICAgICAgICBDMlJlYWxUaW1lUHJpb3JpdHlUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QUklPUklUWVtdID0gImFsZ28ucHJpb3JpdHkiOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHByb3RlY3RlZCBjb250ZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBTZWN1cmUgbW9kZS4KKyAqLworQzJFTlVNKEMyQ29uZmlnOjpzZWN1cmVfbW9kZV90LCB1aW50MzJfdCwKKyAgICBTTV9VTlBST1RFQ1RFRCwgICAgLy8vPCBubyBjb250ZW50IHByb3RlY3Rpb24KKyAgICBTTV9SRUFEX1BST1RFQ1RFRCwgLy8vPCBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgc2hhbGwgYmUgcHJvdGVjdGVkIGZyb20gcmVhZGluZworKQorCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OnNlY3VyZV9tb2RlX3Q+LCBrUGFyYW1JbmRleFNlY3VyZU1vZGU+CisgICAgICAgIEMyU2VjdXJlTW9kZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1NFQ1VSRV9NT0RFW10gPSAiYWxnby5zZWN1cmUtbW9kZSI7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRU5DT0RFUiBDT01QT05FTlRTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoqCisgKiBCaXRyYXRlCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4Qml0cmF0ZT4gQzJTdHJlYW1CaXRyYXRlSW5mbzsKK3R5cGVkZWYgQzJTdHJlYW1CaXRyYXRlSW5mbyBDMkJpdHJhdGVUdW5pbmc7IC8vIGRlcHJlY2F0ZWQKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0JJVFJBVEVbXSA9ICJjb2RlZC5iaXRyYXRlIjsKKyNkZWZpbmUgQzJfTkFNRV9TVFJFQU1fQklUUkFURV9TRVRUSU5HIEMyX1BBUkFNS0VZX0JJVFJBVEUKKworLyoqCisgKiBCaXRyYXRlIG1vZGUuCisgKgorICogVE9ETzogcmVmaW5lIHRoaXMgd2l0aCBiaXRyYXRlIHJhbmdlcyBhbmQgc3VnZ2VzdGVkIHdpbmRvdworICovCitDMkVOVU0oQzJDb25maWc6OmJpdHJhdGVfbW9kZV90LCB1aW50MzJfdCwKKyAgICBCSVRSQVRFX0NPTlNUX1NLSVBfQUxMT1dFRCA9IDAsICAgICAgLy8vPCBjb25zdGFudCBiaXRyYXRlLCBmcmFtZSBza2lwcGluZyBhbGxvd2VkCisgICAgQklUUkFURV9DT05TVCA9IDEsICAgICAgICAgICAgICAgICAgIC8vLzwgY29uc3RhbnQgYml0cmF0ZSwga2VlcCBhbGwgZnJhbWVzCisgICAgQklUUkFURV9WQVJJQUJMRV9TS0lQX0FMTE9XRUQgPSAyLCAgIC8vLzwgYml0cmF0ZSBjYW4gdmFyeSwgZnJhbWUgc2tpcHBpbmcgYWxsb3dlZAorICAgIEJJVFJBVEVfVkFSSUFCTEUgPSAzLCAgICAgICAgICAgICAgICAvLy88IGJpdHJhdGUgY2FuIHZhcnksIGtlZXAgYWxsIGZyYW1lcworICAgIEJJVFJBVEVfSUdOT1JFID0gNywgICAgICAgICAgICAgICAgICAvLy88IGJpdHJhdGUgY2FuIGJlIGV4Y2VlZGVkIGF0IHdpbGwgdG8gYWNoaWV2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHF1YWxpdHkgb3Igb3RoZXIgc2V0dGluZ3MKKworICAgIC8vIGJpdHJhdGUgbW9kZXMgYXJlIGNvbXBvc2VkIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3MKKyAgICBCSVRSQVRFX0ZMQUdfS0VFUF9BTExfRlJBTUVTID0gMSwKKyAgICBCSVRSQVRFX0ZMQUdfQ0FOX1ZBUlkgPSAyLAorICAgIEJJVFJBVEVfRkxBR19DQU5fRVhDRUVEID0gNCwKKykKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjpiaXRyYXRlX21vZGVfdD4sCisgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhCaXRyYXRlTW9kZT4KKyAgICAgICAgQzJTdHJlYW1CaXRyYXRlTW9kZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0JJVFJBVEVfTU9ERVtdID0gImFsZ28uYml0cmF0ZS1tb2RlIjsKKworLyoqCisgKiBRdWFsaXR5LgorICoKKyAqIFRoaXMgaXMgZGVmaW5lZCBieSBlYWNoIGNvbXBvbmVudCwgdGhlIGhpZ2hlciB0aGUgYmV0dGVyIHRoZSBvdXRwdXQgcXVhbGl0eSBhdCB0aGUgZXhwZW5zZSBvZgorICogbGVzcyBjb21wcmVzc2lvbiBlZmZpY2llbmN5LiBUaGlzIHNldHRpbmcgaXMgZGVmaW5lZCBmb3IgdGhlIG91dHB1dCBzdHJlYW1zIGluIGNhc2UgdGhlCisgKiBjb21wb25lbnQgY2FuIHN1cHBvcnQgdmFyeWluZyBxdWFsaXR5IG9uIGVhY2ggc3RyZWFtLCBvciBhcyBhbiBvdXRwdXQgcG9ydCB0dW5pbmcgaW4gY2FzZSB0aGUKKyAqIHF1YWxpdHkgaXMgZ2xvYmFsIHRvIGFsbCBzdHJlYW1zLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4UXVhbGl0eT4gQzJTdHJlYW1RdWFsaXR5VHVuaW5nOwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhRdWFsaXR5PiBDMlF1YWxpdHlUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9RVUFMSVRZW10gPSAiYWxnby5xdWFsaXR5IjsKKworLyoqCisgKiBDb21wbGV4aXR5LgorICoKKyAqIFRoaXMgaXMgZGVmaW5lZCBieSBlYWNoIGNvbXBvbmVudCwgdGhpcyBoaWdoZXIgdGhlIHZhbHVlLCB0aGUgbW9yZSByZXNvdXJjZXMgdGhlIGNvbXBvbmVudAorICogd2lsbCB1c2UgdG8gcHJvZHVjZSBiZXR0ZXIgcXVhbGl0eSBhdCB0aGUgc2FtZSBjb21wcmVzc2lvbiBlZmZpY2llbmN5IG9yIGJldHRlciBjb21wcmVzc2lvbgorICogZWZmaWNpZW5jeSBhdCB0aGUgc2FtZSBxdWFsaXR5LiBUaGlzIHNldHRpbmcgaXMgZGVmaW5lZCBmb3IgdGhlIG91dHB1dCBzdHJlYW1zIGluIGNhc2UgdGhlCisgKiBjb21wb25lbnQgY2FuIHN1cHBvcnQgdmFyeWluZyBjb21wbGV4aXR5IG9uIGVhY2ggc3RyZWFtLCBvciBhcyBhbiBvdXRwdXQgcG9ydCB0dW5pbmcgaW4gY2FzZSB0aGUKKyAqIHF1YWxpdHkgaXMgZ2xvYmFsIHRvIGFsbCBzdHJlYW1zCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhDb21wbGV4aXR5PiBDMlN0cmVhbUNvbXBsZXhpdHlUdW5pbmc7Cit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleENvbXBsZXhpdHk+IEMyQ29tcGxleGl0eVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NPTVBMRVhJVFlbXSA9ICJhbGdvLmNvbXBsZXhpdHkiOworCisvKioKKyAqIEhlYWRlciAoaW5pdC1kYXRhKSBoYW5kbGluZyBhcm91bmQgc3luYyBmcmFtZXMuCisgKi8KK0MyRU5VTShDMkNvbmZpZzo6cHJlcGVuZF9oZWFkZXJfbW9kZV90LCB1aW50MzJfdCwKKyAgICAvKioKKyAgICAgKiBkb24ndCBwcmVwZW5kIGhlYWRlci4gU2lnbmFsIGhlYWRlciBvbmx5IHRocm91Z2ggQzJTdHJlYW1Jbml0RGF0YUluZm8uCisgICAgICovCisgICAgUFJFUEVORF9IRUFERVJfVE9fTk9ORSwKKworICAgIC8qKgorICAgICAqIHByZXBlbmQgaGVhZGVyIGJlZm9yZSB0aGUgZmlyc3Qgb3V0cHV0IGZyYW1lIGFuZCB0aGVyZWFmdGVyIGJlZm9yZSB0aGUgbmV4dCBzeW5jIGZyYW1lCisgICAgICogaWYgaXQgY2hhbmdlcy4KKyAgICAgKi8KKyAgICBQUkVQRU5EX0hFQURFUl9PTl9DSEFOR0UsCisKKyAgICAvKioKKyAgICAgKiBwcmVwZW5kIGhlYWRlciBiZWZvcmUgZXZlcnkgc3luYyBmcmFtZS4KKyAgICAgKi8KKyAgICBQUkVQRU5EX0hFQURFUl9UT19BTExfU1lOQywKKykKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJCb29sVmFsdWUsIGtQYXJhbUluZGV4UHJlcGVuZEhlYWRlck1vZGU+CisgICAgICAgIEMyUHJlcGVuZEhlYWRlck1vZGVTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUFJFUEVORF9IRUFERVJfTU9ERVtdID0gIm91dHB1dC5idWZmZXJzLnByZXBlbmQtaGVhZGVyIjsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSU1BR0UvVklERU8gQ09NUE9ORU5UUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKgorICogT3JkZXIgb2YgdHJhbnNmb3JtYXRpb24gaXM6CisgKgorICogY3JvcCA9PiAoc2NhbGluZyA9PiBzY2FsZWQtY3JvcCkgPT4gc2FtcGxlLWFzcGVjdC1yYXRpbyA9PiBmbGlwID0+IHJvdGF0aW9uCisgKi8KKworLyoqCisgKiBQaWN0dXJlIChpbWFnZS0gYW5kIHZpZGVvIGZyYW1lKSBzaXplLgorICoKKyAqIFRoaXMgaXMgdXNlZCBmb3IgdGhlIG91dHB1dCBvZiB0aGUgdmlkZW8gZGVjb2RlciwgYW5kIHRoZSBpbnB1dCBvZiB0aGUgdmlkZW8gZW5jb2Rlci4KKyAqLwordHlwZWRlZiBDMlBpY3R1cmVTaXplU3RydWN0IEMyVmlkZW9TaXplU3RydWN0OyAvLyBkZXByZWNhdGVkCisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyUGljdHVyZVNpemVTdHJ1Y3QsIGtQYXJhbUluZGV4UGljdHVyZVNpemU+IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFW10gPSAicmF3LnNpemUiOworI2RlZmluZSBDMl9QQVJBTUtFWV9TVFJFQU1fUElDVFVSRV9TSVpFIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRQorI2RlZmluZSBDMl9OQU1FX1NUUkVBTV9WSURFT19TSVpFX0lORk8gQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFCit0eXBlZGVmIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvIEMyVmlkZW9TaXplU3RyZWFtSW5mbzsgLy8gZGVwcmVjYXRlZAordHlwZWRlZiBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbyBDMlZpZGVvU2l6ZVN0cmVhbVR1bmluZzsgLy8gZGVwcmVjYXRlZAorI2RlZmluZSBDMl9OQU1FX1NUUkVBTV9WSURFT19TSVpFX1NFVFRJTkcgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFCisKKy8qKgorICogQ3JvcCByZWN0YW5nbGUuCisgKi8KK3N0cnVjdCBDMlJlY3RTdHJ1Y3QgOiBDMlJlY3QgeworICAgIEMyUmVjdFN0cnVjdCgpID0gZGVmYXVsdDsKKyAgICBDMlJlY3RTdHJ1Y3QoY29uc3QgQzJSZWN0ICZyZWN0KSA6IEMyUmVjdChyZWN0KSB7IH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDMlJlY3RTdHJ1Y3QgJikgPSBkZWxldGU7CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEMyUmVjdFN0cnVjdCAmKSA9IGRlbGV0ZTsKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQkFTRV9DMlNUUlVDVChSZWN0KQorICAgIEMyRklFTEQod2lkdGgsICJ3aWR0aCIpCisgICAgQzJGSUVMRChoZWlnaHQsICJoZWlnaHQiKQorICAgIEMyRklFTEQobGVmdCwgImxlZnQiKQorICAgIEMyRklFTEQodG9wLCAidG9wIikKK307CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyUmVjdFN0cnVjdCwga1BhcmFtSW5kZXhDcm9wUmVjdD4gQzJTdHJlYW1Dcm9wUmVjdEluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DUk9QX1JFQ1RbXSA9ICJyYXcuY3JvcCI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT0RFRF9DUk9QX1JFQ1RbXSA9ICJjb2RlZC5jcm9wIjsKKworLyoqCisgKiBQaXhlbCBmb3JtYXQuCisgKi8KKy8vIFRPRE86IGRlZmluZSBzb21lCisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4UGl4ZWxGb3JtYXQ+IEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUElYRUxfRk9STUFUW10gPSAicmF3LnBpeGVsLWZvcm1hdCI7CisKKy8qKgorICogRXh0ZW5kZWQgcm90YXRpb24gaW5mb3JtYXRpb24gYWxzbyBpbmNvcnBvcmF0aW5nIGEgZmxpcC4KKyAqCisgKiBSb3RhdGlvbiBpcyBjb3VudGVyIGNsb2NrLXdpc2UuCisgKi8KK3N0cnVjdCBDMlJvdGF0aW9uU3RydWN0IHsKKyAgICBDMlJvdGF0aW9uU3RydWN0KGludDMyX3Qgcm90YXRpb24gPSAwKQorICAgICAgICA6IGZsaXAoMCksIHZhbHVlKHJvdGF0aW9uKSB7IH0KKworICAgIGludDMyX3QgZmxpcDsgICAvLy88IGhvcml6b250YWwgZmxpcCAobGVmdC1yaWdodCBmbGlwIGFwcGxpZWQgcHJpb3IgdG8gcm90YXRpb24pCisgICAgaW50MzJfdCB2YWx1ZTsgIC8vLzwgcm90YXRpb24gaW4gZGVncmVlcyBjb3VudGVyIGNsb2Nrd2lzZQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9CQVNFX0MyU1RSVUNUKFJvdGF0aW9uKQorICAgIEMyRklFTEQoZmxpcCwgImZsaXAiKQorICAgIEMyRklFTEQodmFsdWUsICJ2YWx1ZSIpCit9OworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlJvdGF0aW9uU3RydWN0LCBrUGFyYW1JbmRleFJvdGF0aW9uPiBDMlN0cmVhbVJvdGF0aW9uSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1JPVEFUSU9OW10gPSAicmF3LnJvdGF0aW9uIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1ZVSV9ST1RBVElPTltdID0gImNvZGVkLnZ1aS5yb3RhdGlvbiI7CisKKy8qKgorICogUGl4ZWwgKHNhbXBsZSkgYXNwZWN0IHJhdGlvLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlBpY3R1cmVTaXplU3RydWN0LCBrUGFyYW1JbmRleFBpeGVsQXNwZWN0UmF0aW8+CisgICAgICAgIEMyU3RyZWFtUGl4ZWxBc3BlY3RSYXRpb0luZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QSVhFTF9BU1BFQ1RfUkFUSU9bXSA9ICJyYXcuc2FyIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1ZVSV9QSVhFTF9BU1BFQ1RfUkFUSU9bXSA9ICJjb2RlZC52dWkuc2FyIjsKKworLyoqCisgKiBJbi1saW5lIHNjYWxpbmcuCisgKgorICogQ29tcG9uZW50cyBjYW4gb3B0aW9uYWxseSBzdXBwb3J0IHNjYWxpbmcgb2YgcmF3IGltYWdlL3ZpZGVvIGZyYW1lcy4gIE9yIHNjYWxpbmcgb25seSBhCisgKiBwb3J0aW9uIG9mIHJhdyBpbWFnZS92aWRlbyBmcmFtZXMgKHNjYWxlZC1jcm9wKS4KKyAqLworCitDMkVOVU0oQzJDb25maWc6OnNjYWxpbmdfbWV0aG9kX3QsIHVpbnQzMl90LAorICAgIFNDQUxJTkdfQVJCSVRSQVJZLCAgIC8vLzwgYXJiaXRyYXJ5LCB1bnNwZWNpZmllZAorKQorCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OnNjYWxpbmdfbWV0aG9kX3Q+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4U2NhbGluZ01ldGhvZD4KKyAgICAgICAgQzJTdHJlYW1TY2FsaW5nTWV0aG9kVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfU0NBTElOR19NT0RFW10gPSAicmF3LnNjYWxpbmctbWV0aG9kIjsKKyNkZWZpbmUgQzJfUEFSQU1LRVlfU1RSRUFNX1NDQUxJTkdfTU9ERSBDMl9QQVJBTUtFWV9TQ0FMSU5HX01PREUKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlBpY3R1cmVTaXplU3RydWN0LCBrUGFyYW1JbmRleFNjYWxlZFBpY3R1cmVTaXplPgorICAgICAgICBDMlN0cmVhbVNjYWxlZFBpY3R1cmVTaXplVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfU0NBTEVEX1BJQ1RVUkVfU0laRVtdID0gInJhdy5zY2FsZWQtc2l6ZSI7CisjZGVmaW5lIEMyX1BBUkFNS0VZX1NUUkVBTV9TQ0FMRURfUElDVFVSRV9TSVpFIEMyX1BBUkFNS0VZX1NDQUxFRF9QSUNUVVJFX1NJWkUKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlJlY3RTdHJ1Y3QsIGtQYXJhbUluZGV4U2NhbGVkQ3JvcFJlY3Q+CisgICAgICAgIEMyU3RyZWFtU2NhbGVkQ3JvcFJlY3RUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9TQ0FMRURfQ1JPUF9SRUNUW10gPSAicmF3LnNjYWxlZC1jcm9wIjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb2xvciBpbmZvcm1hdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogQ29sb3IgSW5mbworICoKKyAqIENocm9tYSBsb2NhdGlvbiBjYW4gdmFyeSBmb3IgdG9wIGFuZCBib3R0b20gZmllbGRzLCBzbyB1c2UgYW4gYXJyYXksIHRoYXQgY2FuIGhhdmUgMCB0byAyCisgKiB2YWx1ZXMuIEVtcHR5IGFycmF5IGlzIHVzZWQgZm9yIG5vbiBZVVYgZm9ybWF0cy4KKyAqLworCitzdHJ1Y3QgQzJDb2xvciB7CisgICAgZW51bSBtYXRyaXhfdCA6IHVpbnQzMl90OyAgLy8vPCBtYXRyaXggY29lZmZpY2llbnQgKFlVViA8PT4gUkdCKQorICAgIGVudW0gcGxhbmVfbGF5b3V0X3QgOiB1aW50MzJfdDsgIC8vLzwgcGxhbmUgbGF5b3V0IGZvciBmbGV4aWJsZSBmb3JtYXRzCisgICAgZW51bSBwcmltYXJpZXNfdCA6IHVpbnQzMl90OyAgLy8vPCBjb2xvciBwcmltYXJpZXMgYW5kIHdoaXRlIHBvaW50CisgICAgZW51bSByYW5nZV90IDogdWludDMyX3Q7ICAvLy88IHJhbmdlIG9mIGNvbG9yIGNvbXBvbmVudCB2YWx1ZXMKKyAgICBlbnVtIHN1YnNhbXBsaW5nX3QgOiB1aW50MzJfdDsgIC8vLzwgY2hyb21hIHN1YnNhbXBsaW5nCisgICAgZW51bSB0cmFuc2Zlcl90IDogdWludDMyX3Q7ICAvLy88IHRyYW5zZmVyIGZ1bmN0aW9uCit9OworCisvLy8gQ2hyb21hIHN1YnNhbXBsaW5nCitDMkVOVU0oQzJDb2xvcjo6c3Vic2FtcGxpbmdfdCwgdWludDMyX3QsCisgICAgTU9OT0NIUk9NRSwgICAgIC8vLzwgdGhlcmUgYXJlIG5vIENyIG5vciBDYiBwbGFuZXMKKyAgICBNT05PQ0hST01FX0FMUEhBLCAvLy88IHRoZXJlIGFyZSBubyBDciBub3IgQ2IgcGxhbmVzLCBidXQgdGhlcmUgaXMgYW4gYWxwaGEgcGxhbmUKKyAgICBSR0IsICAgICAgICAgICAgLy8vPCBSR0IKKyAgICBSR0JBLCAgICAgICAgICAgLy8vPCBSR0JBCisgICAgWVVWXzQyMCwgICAgICAgIC8vLzwgQ3IgYW5kIENiIHBsYW5lcyBhcmUgc3Vic2FtcGxlZCBieSAyIGJvdGggaG9yaXpvbnRhbGx5IGFuZCB2ZXJ0aWNhbGx5CisgICAgWVVWXzQyMiwgICAgICAgIC8vLzwgQ3IgYW5kIENiIHBsYW5lcyBhcmUgc3Vic2FtcGxlZCBob3Jpem9udGFsbHkKKyAgICBZVVZfNDQ0LCAgICAgICAgLy8vPCBDciBhbmQgQ2IgcGxhbmVzIGFyZSBub3Qgc3Vic2FtcGxlZAorICAgIFlVVkFfNDQ0LCAgICAgICAvLy88IENyIGFuZCBDYiBwbGFuZXMgYXJlIG5vdCBzdWJzYW1wbGVkLCB0aGVyZSBpcyBhbiBhbHBoYSBwbGFuZQorKQorCitzdHJ1Y3QgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgeworICAgIC8vIGNocm9tYSBvZmZzZXRzIGRlZmluZWQgYnkgSVRVCisgICAgY29uc3RleHByIHN0YXRpYyBDMkNocm9tYU9mZnNldFN0cnVjdCBJVFVfWVVWXzQ0NCgpIHsgcmV0dXJuIHsgMC4wZiwgMC4wZiB9OyB9CisgICAgY29uc3RleHByIHN0YXRpYyBDMkNocm9tYU9mZnNldFN0cnVjdCBJVFVfWVVWXzQyMigpIHsgcmV0dXJuIHsgMC4wZiwgMC4wZiB9OyB9CisgICAgY29uc3RleHByIHN0YXRpYyBDMkNocm9tYU9mZnNldFN0cnVjdCBJVFVfWVVWXzQyMF8wKCkgeyByZXR1cm4geyAwLjBmLCAwLjVmIH07IH0KKyAgICBjb25zdGV4cHIgc3RhdGljIEMyQ2hyb21hT2Zmc2V0U3RydWN0IElUVV9ZVVZfNDIwXzEoKSB7IHJldHVybiB7IDAuNWYsIDAuNWYgfTsgfQorICAgIGNvbnN0ZXhwciBzdGF0aWMgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgSVRVX1lVVl80MjBfMigpIHsgcmV0dXJuIHsgMC4wZiwgMC4wZiB9OyB9CisgICAgY29uc3RleHByIHN0YXRpYyBDMkNocm9tYU9mZnNldFN0cnVjdCBJVFVfWVVWXzQyMF8zKCkgeyByZXR1cm4geyAwLjVmLCAwLjBmIH07IH0KKyAgICBjb25zdGV4cHIgc3RhdGljIEMyQ2hyb21hT2Zmc2V0U3RydWN0IElUVV9ZVVZfNDIwXzQoKSB7IHJldHVybiB7IDAuMGYsIDEuMGYgfTsgfQorICAgIGNvbnN0ZXhwciBzdGF0aWMgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgSVRVX1lVVl80MjBfNSgpIHsgcmV0dXJuIHsgMC41ZiwgMS4wZiB9OyB9CisKKyAgICBmbG9hdCB4OyAgICAvLy88IHggb2Zmc2V0IGluIHBpeGVscyAodG93YXJkcyByaWdodCkKKyAgICBmbG9hdCB5OyAgICAvLy88IHkgb2Zmc2V0IGluIHBpeGVscyAodG93YXJkcyBkb3duKQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChDaHJvbWFPZmZzZXQpCisgICAgQzJGSUVMRCh4LCAieCIpCisgICAgQzJGSUVMRCh5LCAieSIpCit9OworCitzdHJ1Y3QgQzJDb2xvckluZm9TdHJ1Y3QgeworICAgIEMyQ29sb3JJbmZvU3RydWN0KCkKKyAgICAgICAgOiBiaXREZXB0aCg4KSwgc3Vic2FtcGxpbmcoQzJDb2xvcjo6WVVWXzQyMCkgeyB9CisKKyAgICB1aW50MzJfdCBiaXREZXB0aDsKKyAgICBDMkNvbG9yOjpzdWJzYW1wbGluZ190IHN1YnNhbXBsaW5nOworICAgIEMyQ2hyb21hT2Zmc2V0U3RydWN0IGxvY2F0aW9uc1tdOyAvLyBtYXggMiBlbGVtZW50cworCisgICAgQzJDb2xvckluZm9TdHJ1Y3QoCisgICAgICAgICAgICBzaXplX3QgLyogZmxleENvdW50ICovLCB1aW50MzJfdCBiaXREZXB0aF8sIEMyQ29sb3I6OnN1YnNhbXBsaW5nX3Qgc3Vic2FtcGxpbmdfKQorICAgICAgICA6IGJpdERlcHRoKGJpdERlcHRoXyksIHN1YnNhbXBsaW5nKHN1YnNhbXBsaW5nXykgeyB9CisKKyAgICBDMkNvbG9ySW5mb1N0cnVjdCgKKyAgICAgICAgICAgIHNpemVfdCBmbGV4Q291bnQsIHVpbnQzMl90IGJpdERlcHRoXywgQzJDb2xvcjo6c3Vic2FtcGxpbmdfdCBzdWJzYW1wbGluZ18sCisgICAgICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8QzJDaHJvbWFPZmZzZXRTdHJ1Y3Q+IGxvY2F0aW9uc18pCisgICAgICAgIDogYml0RGVwdGgoYml0RGVwdGhfKSwgc3Vic2FtcGxpbmcoc3Vic2FtcGxpbmdfKSB7CisgICAgICAgIHNpemVfdCBpeCA9IDA7CisgICAgICAgIGZvciAoY29uc3QgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgJmxvY2F0aW9uIDogbG9jYXRpb25zXykgeworICAgICAgICAgICAgaWYgKGl4ID09IGZsZXhDb3VudCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9jYXRpb25zW2l4XSA9IGxvY2F0aW9uOworICAgICAgICAgICAgKytpeDsKKyAgICAgICAgfQorICAgIH0KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChDb2xvckluZm8sIGxvY2F0aW9ucykKKyAgICBDMkZJRUxEKGJpdERlcHRoLCAiYml0LWRlcHRoIikKKyAgICBDMkZJRUxEKHN1YnNhbXBsaW5nLCAic3Vic2FtcGxpbmciKQorICAgIEMyRklFTEQobG9jYXRpb25zLCAibG9jYXRpb25zIikKK307CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyQ29sb3JJbmZvU3RydWN0LCBrUGFyYW1JbmRleENvbG9ySW5mbz4gQzJTdHJlYW1Db2xvckluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT0xPUl9JTkZPW10gPSAicmF3LmNvbG9yLWZvcm1hdCI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT0RFRF9DT0xPUl9JTkZPW10gPSAiY29kZWQuY29sb3ItZm9ybWF0IjsKKworLyoqCisgKiBDb2xvciBBc3BlY3RzCisgKi8KKworLyogVGhlIG1lYW5pbmcgb2YgdGhlIGZvbGxvd2luZyBlbnVtZXJhdG9ycyBpcyBhcyBkZXNjcmliZWQgaW4gSVRVLVQgSC4yNzMuICovCisKKy8vLyBSYW5nZQorQzJFTlVNKEMyQ29sb3I6OnJhbmdlX3QsIHVpbnQzMl90LAorICAgIFJBTkdFX1VOU1BFQ0lGSUVELCAgICAgICAgICAvLy88IHJhbmdlIGlzIHVuc3BlY2lmaWVkCisgICAgUkFOR0VfRlVMTCwgICAgICAgICAgICAgICAgIC8vLzwgZnVsbCByYW5nZQorICAgIFJBTkdFX0xJTUlURUQsICAgICAgICAgICAgICAvLy88IGxpbWl0ZWQgcmFuZ2UKKworICAgIFJBTkdFX1ZFTkRPUl9TVEFSVCA9IDB4ODAsICAvLy88IHZlbmRvci1zcGVjaWZpYyByYW5nZSB2YWx1ZXMgc3RhcnQgaGVyZQorICAgIFJBTkdFX09USEVSID0gMFhGRiAgICAgICAgICAvLy88IG1heCB2YWx1ZSwgcmVzZXJ2ZWQgZm9yIHVuZGVmaW5lZCB2YWx1ZXMKKykKKworLy8vIENvbG9yIHByaW1hcmllcworQzJFTlVNKEMyQ29sb3I6OnByaW1hcmllc190LCB1aW50MzJfdCwKKyAgICBQUklNQVJJRVNfVU5TUEVDSUZJRUQsICAgICAgICAgIC8vLzwgcHJpbWFyaWVzIGFyZSB1bnNwZWNpZmllZAorICAgIFBSSU1BUklFU19CVDcwOSwgICAgICAgICAgICAgICAgLy8vPCBSZWMuSVRVLVIgQlQuNzA5LTYgb3IgZXF1aXZhbGVudAorICAgIFBSSU1BUklFU19CVDQ3MF9NLCAgICAgICAgICAgICAgLy8vPCBSZWMuSVRVLVIgQlQuNDcwLTYgU3lzdGVtIE0gb3IgZXF1aXZhbGVudAorICAgIFBSSU1BUklFU19CVDYwMV82MjUsICAgICAgICAgICAgLy8vPCBSZWMuSVRVLVIgQlQuNjAxLTYgNjI1IG9yIGVxdWl2YWxlbnQKKyAgICBQUklNQVJJRVNfQlQ2MDFfNTI1LCAgICAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjYwMS02IDUyNSBvciBlcXVpdmFsZW50CisgICAgUFJJTUFSSUVTX0dFTkVSSUNfRklMTSwgICAgICAgICAvLy88IEdlbmVyaWMgRmlsbQorICAgIFBSSU1BUklFU19CVDIwMjAsICAgICAgICAgICAgICAgLy8vPCBSZWMuSVRVLVIgQlQuMjAyMCBvciBlcXVpdmFsZW50CisgICAgUFJJTUFSSUVTX1JQNDMxLCAgICAgICAgICAgICAgICAvLy88IFNNUFRFIFJQIDQzMS0yIG9yIGVxdWl2YWxlbnQKKyAgICBQUklNQVJJRVNfRUc0MzIsICAgICAgICAgICAgICAgIC8vLzwgU01QVEUgRUcgNDMyLTEgb3IgZXF1aXZhbGVudAorICAgIFBSSU1BUklFU19FQlUzMjEzLCAgICAgICAgICAgICAgLy8vPCBFQlUgVGVjaC4zMjEzLUUgb3IgZXF1aXZhbGVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vCisgICAgUFJJTUFSSUVTX1ZFTkRPUl9TVEFSVCA9IDB4ODAsICAvLy88IHZlbmRvci1zcGVjaWZpYyBwcmltYXJpZXMgdmFsdWVzIHN0YXJ0IGhlcmUKKyAgICBQUklNQVJJRVNfT1RIRVIgPSAweGZmICAgICAgICAgIC8vLzwgbWF4IHZhbHVlLCByZXNlcnZlZCBmb3IgdW5kZWZpbmVkIHZhbHVlcworKQorCisvLy8gVHJhbnNmZXIgZnVuY3Rpb24KK0MyRU5VTShDMkNvbG9yOjp0cmFuc2Zlcl90LCB1aW50MzJfdCwKKyAgICBUUkFOU0ZFUl9VTlNQRUNJRklFRCwgICAgICAgICAgIC8vLzwgdHJhbnNmZXIgaXMgdW5zcGVjaWZpZWQKKyAgICBUUkFOU0ZFUl9MSU5FQVIsICAgICAgICAgICAgICAgIC8vLzwgTGluZWFyIHRyYW5zZmVyIGNoYXJhY3RlcmlzdGljcworICAgIFRSQU5TRkVSX1NSR0IsICAgICAgICAgICAgICAgICAgLy8vPCBzUkdCIG9yIGVxdWl2YWxlbnQKKyAgICBUUkFOU0ZFUl8xNzBNLCAgICAgICAgICAgICAgICAgIC8vLzwgU01QVEUgMTcwTSBvciBlcXVpdmFsZW50IChlLmcuIEJULjYwMS83MDkvMjAyMCkKKyAgICBUUkFOU0ZFUl9HQU1NQTIyLCAgICAgICAgICAgICAgIC8vLzwgQXNzdW1lZCBkaXNwbGF5IGdhbW1hIDIuMgorICAgIFRSQU5TRkVSX0dBTU1BMjgsICAgICAgICAgICAgICAgLy8vPCBBc3N1bWVkIGRpc3BsYXkgZ2FtbWEgMi44CisgICAgVFJBTlNGRVJfU1QyMDg0LCAgICAgICAgICAgICAgICAvLy88IFNNUFRFIFNUIDIwODQgZm9yIDEwLzEyLzE0LzE2IGJpdCBzeXN0ZW1zCisgICAgVFJBTlNGRVJfSExHLCAgICAgICAgICAgICAgICAgICAvLy88IEFSSUIgU1RELUI2NyBoeWJyaWQtbG9nLWdhbW1hCisKKyAgICBUUkFOU0ZFUl8yNDBNID0gMHg0MCwgICAgICAgICAgIC8vLzwgU01QVEUgMjQwTSBvciBlcXVpdmFsZW50CisgICAgVFJBTlNGRVJfWFZZQ0MsICAgICAgICAgICAgICAgICAvLy88IElFQyA2MTk2Ni0yLTQgb3IgZXF1aXZhbGVudAorICAgIFRSQU5TRkVSX0JUMTM2MSwgICAgICAgICAgICAgICAgLy8vPCBSZWMuSVRVLVIgQlQuMTM2MSBleHRlbmRlZCBnYW11dAorICAgIFRSQU5TRkVSX1NUNDI4LCAgICAgICAgICAgICAgICAgLy8vPCBTTVBURSBTVCA0MjgtMSBvciBlcXVpdmFsZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8KKyAgICBUUkFOU0ZFUl9WRU5ET1JfU1RBUlQgPSAweDgwLCAgIC8vLzwgdmVuZG9yLXNwZWNpZmljIHRyYW5zZmVyIHZhbHVlcyBzdGFydCBoZXJlCisgICAgVFJBTlNGRVJfT1RIRVIgPSAweGZmICAgICAgICAgICAvLy88IG1heCB2YWx1ZSwgcmVzZXJ2ZWQgZm9yIHVuZGVmaW5lZCB2YWx1ZXMKKykKKworLy8vIE1hdHJpeCBjb2VmZmljaWVudAorQzJFTlVNKEMyQ29sb3I6Om1hdHJpeF90LCB1aW50MzJfdCwKKyAgICBNQVRSSVhfVU5TUEVDSUZJRUQsICAgICAgICAgICAgIC8vLzwgbWF0cml4IGNvZWZmaWNpZW50cyBhcmUgdW5zcGVjaWZpZWQKKyAgICBNQVRSSVhfQlQ3MDksICAgICAgICAgICAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjcwOS01IG9yIGVxdWl2YWxlbnQKKyAgICBNQVRSSVhfRkNDNDdfNzNfNjgyLCAgICAgICAgICAgIC8vLzwgRkNDIFRpdGxlIDQ3IENGUiA3My42ODIgb3IgZXF1aXZhbGVudCAoS1I9MC4zMCwgS0I9MC4xMSkKKyAgICBNQVRSSVhfQlQ2MDEsICAgICAgICAgICAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjQ3MCwgQlQuNjAxLTYgNjI1IG9yIGVxdWl2YWxlbnQKKyAgICBNQVRSSVhfMjQwTSwgICAgICAgICAgICAgICAgICAgIC8vLzwgU01QVEUgMjQwTSBvciBlcXVpdmFsZW50CisgICAgTUFUUklYX0JUMjAyMCwgICAgICAgICAgICAgICAgICAvLy88IFJlYy5JVFUtUiBCVC4yMDIwIG5vbi1jb25zdGFudCBsdW1pbmFuY2UKKyAgICBNQVRSSVhfQlQyMDIwX0NPTlNUQU5ULCAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjIwMjAgY29uc3RhbnQgbHVtaW5hbmNlCisgICAgTUFUUklYX1ZFTkRPUl9TVEFSVCA9IDB4ODAsICAgICAvLy88IHZlbmRvci1zcGVjaWZpYyBtYXRyaXggY29lZmZpY2llbnQgdmFsdWVzIHN0YXJ0IGhlcmUKKyAgICBNQVRSSVhfT1RIRVIgPSAweGZmLCAgICAgICAgICAgIC8vLzwgbWF4IHZhbHVlLCByZXNlcnZlZCBmb3IgdW5kZWZpbmVkIHZhbHVlcworCisgICAgTUFUUklYX1NNUFRFMjQwTSA9IE1BVFJJWF8yNDBNLCAvLyBkZXByZWNhdGVkCisgICAgTUFUUklYX0JUMjAyMENPTlNUQU5UID0gTUFUUklYX0JUMjAyMF9DT05TVEFOVCwgLy8gZGVwcmVjYXRlZAorKQorCitjb25zdGV4cHIgQzJDb2xvcjo6bWF0cml4X3QgTUFUUklYX0JUNDcwXzZNID0gTUFUUklYX0ZDQzQ3XzczXzY4MjsgLy8gZGVwcmVjYXRlZAorY29uc3RleHByIEMyQ29sb3I6Om1hdHJpeF90IE1BVFJJWF9CVDcwOV81ID0gTUFUUklYX0JUNzA5OyAvLyBkZXByZWNhdGVkCitjb25zdGV4cHIgQzJDb2xvcjo6bWF0cml4X3QgTUFUUklYX0JUNjAxXzYgPSBNQVRSSVhfQlQ2MDE7IC8vIGRlcHJlY2F0ZWQKKworc3RydWN0IEMyQ29sb3JBc3BlY3RzU3RydWN0IHsKKyAgICBDMkNvbG9yOjpyYW5nZV90IHJhbmdlOworICAgIEMyQ29sb3I6OnByaW1hcmllc190IHByaW1hcmllczsKKyAgICBDMkNvbG9yOjp0cmFuc2Zlcl90IHRyYW5zZmVyOworICAgIEMyQ29sb3I6Om1hdHJpeF90IG1hdHJpeDsKKworICAgIEMyQ29sb3JBc3BlY3RzU3RydWN0KCkKKyAgICAgICAgOiByYW5nZShDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCksCisgICAgICAgICAgcHJpbWFyaWVzKEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCksCisgICAgICAgICAgdHJhbnNmZXIoQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQpLAorICAgICAgICAgIG1hdHJpeChDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpIHsgfQorCisgICAgQzJDb2xvckFzcGVjdHNTdHJ1Y3QoQzJDb2xvcjo6cmFuZ2VfdCByYW5nZV8sIEMyQ29sb3I6OnByaW1hcmllc190IHByaW1hcmllc18sCisgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6dHJhbnNmZXJfdCB0cmFuc2Zlcl8sIEMyQ29sb3I6Om1hdHJpeF90IG1hdHJpeF8pCisgICAgICAgIDogcmFuZ2UocmFuZ2VfKSwgcHJpbWFyaWVzKHByaW1hcmllc18pLCB0cmFuc2Zlcih0cmFuc2Zlcl8pLCBtYXRyaXgobWF0cml4Xykge30KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoQ29sb3JBc3BlY3RzKQorICAgIEMyRklFTEQocmFuZ2UsICJyYW5nZSIpCisgICAgQzJGSUVMRChwcmltYXJpZXMsICJwcmltYXJpZXMiKQorICAgIEMyRklFTEQodHJhbnNmZXIsICJ0cmFuc2ZlciIpCisgICAgQzJGSUVMRChtYXRyaXgsICJtYXRyaXgiKQorfTsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJDb2xvckFzcGVjdHNTdHJ1Y3QsIGtQYXJhbUluZGV4Q29sb3JBc3BlY3RzPgorICAgICAgICBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTW10gPSAicmF3LmNvbG9yIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1ZVSV9DT0xPUl9BU1BFQ1RTW10gPSAiY29kZWQudnVpLmNvbG9yIjsKKworLyoqCisgKiBEZWZhdWx0IGNvbG9yIGFzcGVjdHMgdG8gdXNlLiBUaGVzZSBjb21lIGZyb20gdGhlIGNvbnRhaW5lciBvciBjbGllbnQgYW5kIHNoYWxsIGJlIGhhbmRsZWQKKyAqIGFjY29yZGluZyB0byB0aGUgY29kaW5nIHN0YW5kYXJkLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyQ29sb3JBc3BlY3RzU3RydWN0LCBrUGFyYW1JbmRleERlZmF1bHRDb2xvckFzcGVjdHM+CisgICAgICAgIEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTW10gPSAiZGVmYXVsdC5jb2xvciI7CisKKy8qKgorICogSERSIFN0YXRpYyBNZXRhZGF0YSBJbmZvLgorICovCitzdHJ1Y3QgQzJDb2xvclh5U3RydWN0IHsKKyAgICBmbG9hdCB4OyAvLy88IHggY29sb3IgY29vcmRpbmF0ZSBpbiB4eVkgc3BhY2UgWzAtMV0KKyAgICBmbG9hdCB5OyAvLy88IHkgY29sb3IgY29vcmRpbmF0ZSBpbiB4eVkgc3BhY2UgWzAtMV0KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoQ29sb3JYeSkKKyAgICBDMkZJRUxEKHgsICJ4IikKKyAgICBDMkZJRUxEKHksICJ5IikKK307CisKK3N0cnVjdCBDMk1hc3RlcmluZ0Rpc3BsYXlDb2xvclZvbHVtZVN0cnVjdCB7CisgICAgQzJDb2xvclh5U3RydWN0IHJlZDsgICAgLy8vPCBjb29yZGluYXRlcyBvZiByZWQgZGlzcGxheSBwcmltYXJ5CisgICAgQzJDb2xvclh5U3RydWN0IGdyZWVuOyAgLy8vPCBjb29yZGluYXRlcyBvZiBncmVlbiBkaXNwbGF5IHByaW1hcnkKKyAgICBDMkNvbG9yWHlTdHJ1Y3QgYmx1ZTsgICAvLy88IGNvb3JkaW5hdGVzIG9mIGJsdWUgZGlzcGxheSBwcmltYXJ5CisgICAgQzJDb2xvclh5U3RydWN0IHdoaXRlOyAgLy8vPCBjb29yZGluYXRlcyBvZiB3aGl0ZSBwb2ludAorCisgICAgZmxvYXQgbWF4THVtaW5hbmNlOyAgLy8vPCBtYXggZGlzcGxheSBtYXN0ZXJpbmcgbHVtaW5hbmNlIGluIGNkL21eMgorICAgIGZsb2F0IG1pbkx1bWluYW5jZTsgIC8vLzwgbWluIGRpc3BsYXkgbWFzdGVyaW5nIGx1bWluYW5jZSBpbiBjZC9tXjIKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoTWFzdGVyaW5nRGlzcGxheUNvbG9yVm9sdW1lKQorICAgIEMyRklFTEQocmVkLCAicmVkIikKKyAgICBDMkZJRUxEKGdyZWVuLCAiZ3JlZW4iKQorICAgIEMyRklFTEQoYmx1ZSwgImJsdWUiKQorICAgIEMyRklFTEQod2hpdGUsICJ3aGl0ZSIpCisKKyAgICBDMkZJRUxEKG1heEx1bWluYW5jZSwgIm1heC1sdW1pbmFuY2UiKQorICAgIEMyRklFTEQobWluTHVtaW5hbmNlLCAibWluLWx1bWluYW5jZSIpCit9OworCitzdHJ1Y3QgQzJIZHJTdGF0aWNNZXRhZGF0YVN0cnVjdCB7CisgICAgQzJNYXN0ZXJpbmdEaXNwbGF5Q29sb3JWb2x1bWVTdHJ1Y3QgbWFzdGVyaW5nOworCisgICAgLy8gY29udGVudCBkZXNjcmlwdG9ycworICAgIGZsb2F0IG1heENsbDsgIC8vLzwgbWF4IGNvbnRlbnQgbGlnaHQgbGV2ZWwgKHBpeGVsIGx1bWluYW5jZSkgaW4gY2QvbV4yCisgICAgZmxvYXQgbWF4RmFsbDsgLy8vPCBtYXggZnJhbWUgYXZlcmFnZSBsaWdodCBsZXZlbCAoZnJhbWUgbHVtaW5hbmNlKSBpbiBjZC9tXjIKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQkFTRV9DMlNUUlVDVChIZHJTdGF0aWNNZXRhZGF0YSkKKyAgICBDMkZJRUxEKG1hc3RlcmluZywgIm1hc3RlcmluZyIpCisgICAgQzJGSUVMRChtYXhDbGwsICJtYXgtY2xsIikKKyAgICBDMkZJRUxEKG1heEZhbGwsICJtYXgtZmFsbCIpCit9OwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJIZHJTdGF0aWNNZXRhZGF0YVN0cnVjdCwga1BhcmFtSW5kZXhIZHJTdGF0aWNNZXRhZGF0YT4KKyAgICAgICAgQzJTdHJlYW1IZHJTdGF0aWNJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPW10gPSAicmF3Lmhkci1zdGF0aWMtaW5mbyI7CisKKy8qKgorICogSERSMTArIE1ldGFkYXRhIEluZm8uCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyQmxvYlZhbHVlLCBrUGFyYW1JbmRleEhkcjEwUGx1c01ldGFkYXRhPgorICAgICAgICBDMlN0cmVhbUhkcjEwUGx1c0luZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9IRFIxMF9QTFVTX0lORk9bXSA9ICJpbnB1dC5oZHIxMC1wbHVzLWluZm8iOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX0hEUjEwX1BMVVNfSU5GT1tdID0gIm91dHB1dC5oZHIxMC1wbHVzLWluZm8iOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYmxvY2stYmFzZWQgY29kaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogQmxvY2stc2l6ZSwgYmxvY2sgY291bnQgYW5kIGJsb2NrIHJhdGUuIFVzZWQgdG8gZGV0ZXJtaW5lIG9yIGNvbW11bmljYXRlIHByb2ZpbGUtbGV2ZWwKKyAqIHJlcXVpcmVtZW50cy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJQaWN0dXJlU2l6ZVN0cnVjdCwga1BhcmFtSW5kZXhCbG9ja1NpemU+IEMyU3RyZWFtQmxvY2tTaXplSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0JMT0NLX1NJWkVbXSA9ICJjb2RlZC5ibG9jay1zaXplIjsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhCbG9ja0NvdW50PiBDMlN0cmVhbUJsb2NrQ291bnRJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQkxPQ0tfQ09VTlRbXSA9ICJjb2RlZC5ibG9jay1jb3VudCI7CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhCbG9ja1JhdGU+IEMyU3RyZWFtQmxvY2tSYXRlSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0JMT0NLX1JBVEVbXSA9ICJjb2RlZC5ibG9jay1yYXRlIjsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVklERU8gQ09NUE9ORU5UUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKioKKyAqIEZyYW1lIHJhdGUgKGNvZGVkIGFuZCBwb3J0IGZvciByYXcgZGF0YSkKKyAqCisgKiBDb2RlZCBmcmFtZSByYXRlcyBhcmUgd2hhdCBpcyByZXByZXNlbnRlZCBpbiB0aGUgY29tcHJlc3NlZCBiaXRzdHJlYW0gYW5kIHNob3VsZCBjb3JyZXNwb25kIHRvCisgKiB0aGUgdGltZXN0YW1wLgorICoKKyAqIEZyYW1lIHJhdGVzIG9uIHJhdyBwb3J0cyBzaG91bGQgc3RpbGwgY29ycmVzcG9uZCB0byB0aGUgdGltZXN0YW1wcy4KKyAqCisgKiBGb3Igc2xvdyBtb3Rpb24gb3IgdGltZWxhcHNlIHJlY29yZGluZywgdGhlIHRpbWVzdGFtcCBzaGFsbCBiZSBhZGp1c3RlZCBwcmlvciB0byBmZWVkaW5nIGFuCisgKiBlbmNvZGVyLCBhbmQgdGhlIHRpbWUgc3RyZXRjaCBwYXJhbWV0ZXIgc2hvdWxkIGJlIHVzZWQgdG8gc2lnbmFsIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbgorICogdGltZXN0YW1wIGFuZCByZWFsLXdvcmxkIHRpbWUuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhGcmFtZVJhdGU+IEMyU3RyZWFtRnJhbWVSYXRlSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0ZSQU1FX1JBVEVbXSA9ICJjb2RlZC5mcmFtZS1yYXRlIjsKKyNkZWZpbmUgQzJfTkFNRV9TVFJFQU1fRlJBTUVfUkFURV9TRVRUSU5HIEMyX1BBUkFNS0VZX0ZSQU1FX1JBVEUKKwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMkluZm8sIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhGcmFtZVJhdGU+IEMyUG9ydEZyYW1lUmF0ZUluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9GUkFNRV9SQVRFW10gPSAiaW5wdXQuZnJhbWUtcmF0ZSI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfRlJBTUVfUkFURVtdID0gIm91dHB1dC5mcmFtZS1yYXRlIjsKKworLyoqCisgKiBUaW1lIHN0cmV0Y2guIFJhdGlvIGJldHdlZW4gcmVhbC13b3JsZCB0aW1lIGFuZCB0aW1lc3RhbXAuIEUuZy4gdGltZSBzdHJldGNoIG9mIDQuMCBtZWFucyB0aGF0CisgKiB0aW1lc3RhbXAgZ3Jvd3MgMS80IHRoZSBzcGVlZCBvZiByZWFsLXdvcmxkIHRpbWUgKGUuZy4gNHggc2xvLW1vIGlucHV0KS4gVGhpcyBjYW4gYmUgdXNlZCB0bworICogb3B0aW1pemUgZW5jb2RpbmcuCisgKi8KK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJJbmZvLCBDMkZsb2F0VmFsdWUsIGtQYXJhbUluZGV4VGltZVN0cmV0Y2g+IEMyUG9ydFRpbWVTdHJldGNoSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1RJTUVfU1RSRVRDSFtdID0gImlucHV0LnRpbWUtc3RyZXRjaCI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfVElNRV9TVFJFVENIW10gPSAib3V0cHV0LnRpbWUtc3RyZXRjaCI7CisKKy8qKgorICogTWF4IHZpZGVvIGZyYW1lIHNpemUuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJQaWN0dXJlU2l6ZVN0cnVjdCwga1BhcmFtSW5kZXhNYXhQaWN0dXJlU2l6ZT4KKyAgICAgICAgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzsKK3R5cGVkZWYgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZyBDMk1heFZpZGVvU2l6ZUhpbnRQb3J0U2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX01BWF9QSUNUVVJFX1NJWkVbXSA9ICJyYXcubWF4LXNpemUiOworCisvKioKKyAqIFBpY3R1cmUgdHlwZSBtYXNrLgorICovCitDMkVOVU0oQzJDb25maWc6OnBpY3R1cmVfdHlwZV90LCB1aW50MzJfdCwKKyAgICBTWU5DX0ZSQU1FID0gKDEgPDwgMCksICAvLy88IHN5bmMgZnJhbWUsIGUuZy4gSURSCisgICAgSV9GUkFNRSAgICA9ICgxIDw8IDEpLCAgLy8vPCBpbnRyYSBmcmFtZSB0aGF0IGlzIGNvbXBsZXRlbHkgZW5jb2RlZAorICAgIFBfRlJBTUUgICAgPSAoMSA8PCAyKSwgIC8vLzwgaW50ZXIgcHJlZGljdGVkIGZyYW1lIGZyb20gcHJldmlvdXMgZnJhbWVzCisgICAgQl9GUkFNRSAgICA9ICgxIDw8IDMpLCAgLy8vPCBiYWNrd2FyZCBwcmVkaWN0ZWQgKG91dC1vZi1vcmRlcikgZnJhbWUKKykKKwordHlwZWRlZiBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QgQzJQaWN0dXJlVHlwZU1hc2s7IC8vIGRlcHJlY2F0ZWQKK2NvbnN0ZXhwciBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QgQzJQaWN0dXJlVHlwZUtleUZyYW1lID0gQzJDb25maWc6OlNZTkNfRlJBTUU7IC8vIGRlcHJlY2F0ZWQKKworLyoqCisgKiBBbGxvd2VkIHBpY3R1cmUgdHlwZXMuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkVhc3lFbnVtPEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdD4+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4UGljdHVyZVR5cGVNYXNrPgorICAgICAgICBDMlN0cmVhbVBpY3R1cmVUeXBlTWFza1R1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BJQ1RVUkVfVFlQRV9NQVNLW10gPSAiY29kaW5nLnBpY3R1cmUtdHlwZS1tYXNrIjsKKworLyoqCisgKiBSZXN1bHRpbmcgcGljdHVyZSB0eXBlCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJFYXN5RW51bTxDMkNvbmZpZzo6cGljdHVyZV90eXBlX3Q+PiwKKyAgICAgICAgICAgICAgICBrUGFyYW1JbmRleFBpY3R1cmVUeXBlPgorICAgICAgICBDMlN0cmVhbVBpY3R1cmVUeXBlSW5mbzsKK3R5cGVkZWYgQzJTdHJlYW1QaWN0dXJlVHlwZUluZm8gQzJTdHJlYW1QaWN0dXJlVHlwZU1hc2tJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUElDVFVSRV9UWVBFW10gPSAiY29kZWQucGljdHVyZS10eXBlIjsKKworLyoqCisgKiBHT1Agc3BlY2lmaWNhdGlvbi4KKyAqCisgKiBHT1AgaXMgc3BlY2lmaWVkIGluIGxheWVycyBiZXR3ZWVuIHN5bmMgZnJhbWVzLCBieSBzcGVjaWZ5aW5nIHRoZSBudW1iZXIgb2Ygc3BlY2lmaWMgdHlwZSBvZgorICogZnJhbWVzIGJldHdlZW4gdGhlIHByZXZpb3VzIHR5cGUgKHN0YXJ0aW5nIHdpdGggc3luYyBmcmFtZXMgZm9yIHRoZSBmaXJzdCBsYXllcik6CisgKgorICogRS5nLgorICogICAgICAtIDQgSSBmcmFtZXMgYmV0d2VlbiBlYWNoIHN5bmMgZnJhbWUKKyAqICAgICAgLSAyIFAgZnJhbWVzIGJldHdlZW4gZWFjaCBJIGZyYW1lCisgKiAgICAgIC0gMSBCIGZyYW1lIGJldHdlZW4gZWFjaCBQIGZyYW1lCisgKgorICogICAgICBbIHsgSSwgNCB9LCB7IFAsIDIgfSwgeyBCLCAxIH0gXSA9PT4gKFN5bmMpQlBCUEIgSUJQQlBCIElCUEJQQiBJQlBCUEIgSUJQQlBCIChTeW5jKUJQQlBCCisgKgorICogRm9yIGluZmluaXRlIEdPUCwgSSBsYXllciBjYW4gYmUgb21pdHRlZCAoYXMgdGhlIGZpcnN0IGZyYW1lIGlzIGFsd2F5cyBhIHN5bmMgZnJhbWUuKToKKyAqCisgKiAgICAgIFsgeyBQLCBNQVhfVUlOVCB9IF0gICA9PT4gKFN5bmMpUFBQUFBQUFBQUFBQUFBQUFBQLi4uCisgKgorICogU3luYyBmcmFtZXMgY2FuIGFsc28gYmUgcmVxdWVzdGVkIG9uIGRlbWFuZCwgYW5kIGFzIGEgdGltZS1iYXNlZCBpbnRlcnZhbC4gRm9yIHRpbWUtYmFzZWQKKyAqIGludGVydmFsLCBpZiB0aGVyZSBoYXNuJ3QgYmVlbiBhIHN5bmMgZnJhbWUgaW4gYXQgbGVhc3QgdGhlIGdpdmVuIHRpbWUsIHRoZSBuZXh0IEkgZnJhbWUgc2hhbGwKKyAqIGJlIGVuY29kZWQgYXMgYSBzeW5jIGZyYW1lLiAgRm9yIHN5bmMgcmVxdWVzdCwgdGhlIG5leHQgSSBmcmFtZSBzaGFsbCBiZSBlbmNvZGVkIGFzIGEgc3luYyBmcmFtZS4KKyAqCisgKiBUZW1wb3JhbCBsYXllcmluZyB3aWxsIGRldGVybWluZSBHT1Agc3RydWN0dXJlIG90aGVyIHRoYW4gdGhlIEkgZnJhbWUgY291bnQgYmV0d2VlbiBzeW5jCisgKiBmcmFtZXMuCisgKi8KK3N0cnVjdCBDMkdvcExheWVyU3RydWN0IHsKKyAgICBDMkdvcExheWVyU3RydWN0KEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdCB0eXBlLCB1aW50MzJfdCBjb3VudF8pCisgICAgICAgIDogdHlwZV8odHlwZSksIGNvdW50KGNvdW50XykgeyB9CisKKyAgICBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QgdHlwZV87CisgICAgdWludDMyX3QgY291bnQ7CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKEdvcExheWVyKQorICAgIEMyRklFTEQodHlwZV8sICJ0eXBlIikKKyAgICBDMkZJRUxEKGNvdW50LCAiY291bnQiKQorfTsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlNpbXBsZUFycmF5U3RydWN0PEMyR29wTGF5ZXJTdHJ1Y3Q+LCBrUGFyYW1JbmRleEdvcD4KKyAgICAgICAgQzJTdHJlYW1Hb3BUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9HT1BbXSA9ICJjb2RpbmcuZ29wIjsKKworLyoqCisgKiBTeW5jIGZyYW1lIGNhbiBiZSByZXF1ZXN0ZWQgb24gZGVtYW5kIGJ5IHRoZSBjbGllbnQuCisgKgorICogSWYgdHJ1ZSwgdGhlIG5leHQgSSBmcmFtZSBzaGFsbCBiZSBlbmNvZGVkIGFzIGEgc3luYyBmcmFtZS4gVGhpcyBjb25maWcgY2FuIGJlIHBhc3NlZAorICogc3luY2hyb25vdXNseSB3aXRoIHRoZSB3b3JrLCBvciBkaXJlY3RseSB0byB0aGUgY29tcG9uZW50IC0gbGVhZGluZyB0byBkaWZmZXJlbnQgcmVzdWx0LgorICogSWYgaXQgaXMgcGFzc2VkIHdpdGggd29yaywgaXQgc2hhbGwgdGFrZSBlZmZlY3Qgd2hlbiB0aGF0IHdvcmsgaXRlbSBpcyBiZWluZyBwcm9jZXNzZWQgKHNvCisgKiB0aGUgZmlyc3QgSSBmcmFtZSBhdCBvciBhZnRlciB0aGF0IHdvcmsgaXRlbSBzaGFsbCBiZSBhIHN5bmMgZnJhbWUpLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyRWFzeUJvb2xWYWx1ZSwga1BhcmFtSW5kZXhSZXF1ZXN0U3luY0ZyYW1lPgorICAgICAgICBDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9SRVFVRVNUX1NZTkNfRlJBTUVbXSA9ICJjb2RpbmcucmVxdWVzdC1zeW5jLWZyYW1lIjsKKworLyoqCisgKiBTeW5jIGZyYW1lIGludGVydmFsIGluIHRpbWUgZG9tYWluICh0aW1lc3RhbXApLgorICoKKyAqIElmIHRoZXJlIGhhc24ndCBiZWVuIGEgc3luYyBmcmFtZSBpbiBhdCBsZWFzdCB0aGlzIHZhbHVlLCB0aGUgbmV4dCBpbnRyYSBmcmFtZSBzaGFsbCBiZSBlbmNvZGVkCisgKiBhcyBhIHN5bmMgZnJhbWUuIFRoZSB2YWx1ZSBvZiBNQVhfSTY0IG9yIGEgbmVnYXRpdmUgdmFsdWUgbWVhbnMgbm8gc3luYyBmcmFtZXMgYWZ0ZXIgdGhlIGZpcnN0CisgKiBmcmFtZS4gQSB2YWx1ZSBvZiAwIG1lYW5zIGFsbCBzeW5jIGZyYW1lcy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMkludDY0VmFsdWUsIGtQYXJhbUluZGV4U3luY0ZyYW1lSW50ZXJ2YWw+CisgICAgICAgIEMyU3RyZWFtU3luY0ZyYW1lSW50ZXJ2YWxUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9TWU5DX0ZSQU1FX0lOVEVSVkFMW10gPSAiY29kaW5nLnN5bmMtZnJhbWUtaW50ZXJ2YWwiOworLy8gZGVwcmVjYXRlZAorI2RlZmluZSBDMl9QQVJBTUtFWV9TWU5DX0ZSQU1FX1BFUklPRCBDMl9QQVJBTUtFWV9TWU5DX0ZSQU1FX0lOVEVSVkFMCisKKy8qKgorICogVGVtcG9yYWwgbGF5ZXJpbmcKKyAqCisgKiBMYXllciBpbmRleCBpcyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgbGF5ZXIgY291bnQgLSAxLiBMYXllcnMgd2l0aCBoaWdoZXIgaW5kZXggaGF2ZSBoaWdoZXIKKyAqIGZyZXF1ZW5jeToKKyAqICAgICAwCisgKiAgIDEgICAxCisgKiAgMiAyIDIgMgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleExheWVySW5kZXg+IEMyU3RyZWFtTGF5ZXJJbmRleEluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9MQVlFUl9JTkRFWFtdID0gImNvZGVkLmxheWVyLWluZGV4IjsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhMYXllckNvdW50PiBDMlN0cmVhbUxheWVyQ291bnRJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfTEFZRVJfQ09VTlRbXSA9ICJjb2RlZC5sYXllci1jb3VudCI7CisKK3N0cnVjdCBDMlRlbXBvcmFsTGF5ZXJpbmdTdHJ1Y3QgeworICAgIEMyVGVtcG9yYWxMYXllcmluZ1N0cnVjdCgpCisgICAgICAgIDogbGF5ZXJDb3VudCgwKSwgYkxheWVyQ291bnQoMCkgeyB9CisKKyAgICBDMlRlbXBvcmFsTGF5ZXJpbmdTdHJ1Y3Qoc2l6ZV90IC8qIGZsZXhDb3VudCAqLywgdWludDMyX3QgbGF5ZXJDb3VudF8sIHVpbnQzMl90IGJMYXllckNvdW50XykKKyAgICAgICAgOiBsYXllckNvdW50KGxheWVyQ291bnRfKSwgYkxheWVyQ291bnQoYzJfbWluKGxheWVyQ291bnRfLCBiTGF5ZXJDb3VudF8pKSB7IH0KKworICAgIEMyVGVtcG9yYWxMYXllcmluZ1N0cnVjdChzaXplX3QgZmxleENvdW50LCB1aW50MzJfdCBsYXllckNvdW50XywgdWludDMyX3QgYkxheWVyQ291bnRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8ZmxvYXQ+IHJhdGlvcykKKyAgICAgICAgOiBsYXllckNvdW50KGxheWVyQ291bnRfKSwgYkxheWVyQ291bnQoYzJfbWluKGxheWVyQ291bnRfLCBiTGF5ZXJDb3VudF8pKSB7CisgICAgICAgIHNpemVfdCBpeCA9IDA7CisgICAgICAgIGZvciAoZmxvYXQgcmF0aW8gOiByYXRpb3MpIHsKKyAgICAgICAgICAgIGlmIChpeCA9PSBmbGV4Q291bnQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJpdHJhdGVSYXRpb3NbaXgrK10gPSByYXRpbzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHVpbnQzMl90IGxheWVyQ291bnQ7ICAgICAvLy88IHRvdGFsIG51bWJlciBvZiBsYXllcnMgKDAgbWVhbnMgbm8gdGVtcG9yYWwgbGF5ZXJpbmcpCisgICAgdWludDMyX3QgYkxheWVyQ291bnQ7ICAgIC8vLzwgdG90YWwgbnVtYmVyIG9mIGJpZGlyZWN0aW9uYWwgbGF5ZXJzICg8PSBudW0gbGF5ZXJzKQorICAgIC8qKgorICAgICAqIEJpdHJhdGUgYnVkZ2V0cyBmb3IgZWFjaCBsYXllciBhbmQgdGhlIGxheWVycyBiZWxvdywgZ2l2ZW4gYXMgYSByYXRpbyBvZiB0aGUgdG90YWwKKyAgICAgKiBzdHJlYW0gYml0cmF0ZS4gVGhpcyBjYW4gYmUgb21pdHRlZCBvciBwYXJ0aWFsbHkgc3BlY2lmaWZlZCBieSB0aGUgY2xpZW50IHdoaWxlIGNvbmZpZ3VyaW5nLAorICAgICAqIGluIHdoaWNoIGNhc2UgdGhlIGNvbXBvbmVudCBzaGFsbCBmaWxsIGluIGFwcHJvcHJpYXRlIHZhbHVlcyBmb3IgdGhlIG1pc3NpbmcgbGF5ZXJzLgorICAgICAqIFRoaXMgbXVzdCBiZSBwcm92aWRlZCBieSB0aGUgY29tcG9uZW50IHdoZW4gcXVlcmllZCBmb3IgYXQgbGVhc3QgbGF5ZXIgY291bnQgLSAxIChhcyB0aGUKKyAgICAgKiBsYXN0IGxheWVyJ3MgYnVkZ2V0IGlzIGFsd2F5cyAxLjApLgorICAgICAqLworICAgIGZsb2F0IGJpdHJhdGVSYXRpb3NbXTsgICAvLy88IDEuMC1iYXNlZAorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKFRlbXBvcmFsTGF5ZXJpbmcsIGJpdHJhdGVSYXRpb3MpCisgICAgQzJGSUVMRChsYXllckNvdW50LCAibGF5ZXItY291bnQiKQorICAgIEMyRklFTEQoYkxheWVyQ291bnQsICJiLWxheWVyLWNvdW50IikKKyAgICBDMkZJRUxEKGJpdHJhdGVSYXRpb3MsICJiaXRyYXRlLXJhdGlvcyIpCit9OworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyVGVtcG9yYWxMYXllcmluZ1N0cnVjdCwga1BhcmFtSW5kZXhUZW1wb3JhbExheWVyaW5nPgorICAgICAgICBDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9URU1QT1JBTF9MQVlFUklOR1tdID0gImNvZGluZy50ZW1wb3JhbC1sYXllcmluZyI7CisKKy8qKgorICogSW50cmEtcmVmcmVzaC4KKyAqLworCitDMkVOVU0oQzJDb25maWc6OmludHJhX3JlZnJlc2hfbW9kZV90LCB1aW50MzJfdCwKKyAgICBJTlRSQV9SRUZSRVNIX0RJU0FCTEVELCAgICAgLy8vPCBubyBpbnRyYSByZWZyZXNoCisgICAgSU5UUkFfUkVGUkVTSF9BUkJJVFJBUlksICAgIC8vLzwgYXJiaXRyYXJ5LCB1bnNwZWNpZmllZAorKQorCitzdHJ1Y3QgQzJJbnRyYVJlZnJlc2hTdHJ1Y3QgeworICAgIEMySW50cmFSZWZyZXNoU3RydWN0KCkKKyAgICAgICAgOiBtb2RlKEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0RJU0FCTEVEKSwgcGVyaW9kKDAuKSB7IH0KKworICAgIEMySW50cmFSZWZyZXNoU3RydWN0KEMyQ29uZmlnOjppbnRyYV9yZWZyZXNoX21vZGVfdCBtb2RlXywgZmxvYXQgcGVyaW9kXykKKyAgICAgICAgOiBtb2RlKG1vZGVfKSwgcGVyaW9kKHBlcmlvZF8pIHsgfQorCisgICAgQzJDb25maWc6OmludHJhX3JlZnJlc2hfbW9kZV90IG1vZGU7IC8vLzwgcmVmcmVzaCBtb2RlCisgICAgZmxvYXQgcGVyaW9kOyAgICAgICAgIC8vLzwgaW50cmEgcmVmcmVzaCBwZXJpb2QgaW4gZnJhbWVzIChtdXN0IGJlID49IDEpLCAwIG1lYW5zIGRpc2FibGVkCisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKEludHJhUmVmcmVzaCkKKyAgICBDMkZJRUxEKG1vZGUsICJtb2RlIikKKyAgICBDMkZJRUxEKHBlcmlvZCwgInBlcmlvZCIpCit9OworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMySW50cmFSZWZyZXNoU3RydWN0LCBrUGFyYW1JbmRleEludHJhUmVmcmVzaD4KKyAgICAgICAgQzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlRSQV9SRUZSRVNIW10gPSAiY29kaW5nLmludHJhLXJlZnJlc2giOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJTUFHRSBDT01QT05FTlRTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogVGlsZSBsYXlvdXQuCisgKgorICogVGhpcyBkZXNjcmliZWQgaG93IHRoZSBpbWFnZSBpcyBkZWNvbXBvc2VkIGludG8gdGlsZXMuCisgKi8KK0MyRU5VTShDMkNvbmZpZzo6c2Nhbl9vcmRlcl90LCB1aW50MzJfdCwKKyAgICBTQ0FOX0xFRlRfVE9fUklHSFRfVEhFTl9ET1dOCispCisKK3N0cnVjdCBDMlRpbGVMYXlvdXRTdHJ1Y3QgeworICAgIEMyUGljdHVyZVNpemVTdHJ1Y3QgdGlsZTsgICAgICAgLy8vPCB0aWxlIHNpemUKKyAgICB1aW50MzJfdCBjb2x1bW5Db3VudDsgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIHRpbGVzIGhvcml6b250YWxseQorICAgIHVpbnQzMl90IHJvd0NvdW50OyAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgdGlsZXMgdmVydGljYWxseQorICAgIEMyQ29uZmlnOjpzY2FuX29yZGVyX3Qgb3JkZXI7ICAgLy8vPCB0aWxlIG9yZGVyCisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKFRpbGVMYXlvdXQpCisgICAgQzJGSUVMRCh0aWxlLCAidGlsZSIpCisgICAgQzJGSUVMRChjb2x1bW5Db3VudCwgImNvbHVtbnMiKQorICAgIEMyRklFTEQocm93Q291bnQsICJyb3dzIikKKyAgICBDMkZJRUxEKG9yZGVyLCAib3JkZXIiKQorfTsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJUaWxlTGF5b3V0U3RydWN0LCBrUGFyYW1JbmRleFRpbGVMYXlvdXQ+IEMyU3RyZWFtVGlsZUxheW91dEluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9USUxFX0xBWU9VVFtdID0gImNvZGVkLnRpbGUtbGF5b3V0IjsKKworLyoqCisgKiBUaWxlIGhhbmRsaW5nLgorICoKKyAqIFdoZXRoZXIgdG8gY29uY2F0ZW5hdGUgdGlsZXMgb3Igb3V0cHV0IHRoZW0gZWFjaC4KKyAqLworQzJFTlVNKEMyQ29uZmlnOjp0aWxpbmdfbW9kZV90LCB1aW50MzJfdCwKKyAgICBUSUxJTkdfU0VQQVJBVEUsICAgIC8vLzwgb3V0cHV0IGVhY2ggdGlsZSBpbiBhIHNlcGFyYXRlIG9uV29ya0RvbmUKKyAgICBUSUxJTkdfQ09OQ0FURU5BVEUgIC8vLzwgb3V0cHV0IG9uZSB3b3JrIGNvbXBsZXRpb24gcGVyIGZyYW1lIChjb25jYXRlbmF0ZSB0aWxlcykKKykKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlRpbGVMYXlvdXRTdHJ1Y3QsIGtQYXJhbUluZGV4VGlsZUhhbmRsaW5nPgorICAgICAgICBDMlN0cmVhbVRpbGVIYW5kbGluZ1R1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1RJTEVfSEFORExJTkdbXSA9ICJjb2RpbmcudGlsZS1oYW5kbGluZyI7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEFVRElPIENPTVBPTkVOVFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoqCisgKiBTYW1wbGUgcmF0ZQorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleFNhbXBsZVJhdGU+IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURVtdID0gInJhdy5zYW1wbGUtcmF0ZSI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT0RFRF9TQU1QTEVfUkFURVtdID0gImNvZGVkLnNhbXBsZS1yYXRlIjsKKy8vIGRlcHJlY2F0ZWQKKyNkZWZpbmUgQzJfTkFNRV9TVFJFQU1fU0FNUExFX1JBVEVfU0VUVElORyBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURQorCisvKioKKyAqIENoYW5uZWwgY291bnQuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4Q2hhbm5lbENvdW50PiBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UW10gPSAicmF3LmNoYW5uZWwtY291bnQiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ09ERURfQ0hBTk5FTF9DT1VOVFtdID0gImNvZGVkLmNoYW5uZWwtY291bnQiOworLy8gZGVwcmVjYXRlZAorI2RlZmluZSBDMl9OQU1FX1NUUkVBTV9DSEFOTkVMX0NPVU5UX1NFVFRJTkcgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVAorCisvKioKKyAqIE1heCBjaGFubmVsIGNvdW50LiBVc2VkIHRvIGxpbWl0IHRoZSBudW1iZXIgb2YgY29kZWQgb3IgZGVjb2RlZCBjaGFubmVscy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhNYXhDaGFubmVsQ291bnQ+IEMyU3RyZWFtTWF4Q2hhbm5lbENvdW50SW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX01BWF9DSEFOTkVMX0NPVU5UW10gPSAicmF3Lm1heC1jaGFubmVsLWNvdW50IjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX01BWF9DT0RFRF9DSEFOTkVMX0NPVU5UW10gPSAiY29kZWQubWF4LWNoYW5uZWwtY291bnQiOworCisvKioKKyAqIEF1ZGlvIHNhbXBsZSBmb3JtYXQgKFBDTSBlbmNvZGluZykKKyAqLworQzJFTlVNKEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdCwgdWludDMyX3QsCisgICAgUENNXzE2LAorICAgIFBDTV84LAorICAgIFBDTV9GTE9BVAorKQorCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdD4sIGtQYXJhbUluZGV4UGNtRW5jb2Rpbmc+CisgICAgICAgIEMyU3RyZWFtUGNtRW5jb2RpbmdJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUENNX0VOQ09ESU5HW10gPSAicmF3LnBjbS1lbmNvZGluZyI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT0RFRF9QQ01fRU5DT0RJTkdbXSA9ICJjb2RlZC5wY20tZW5jb2RpbmciOworCisvKioKKyAqIEFBQyBTQlIgTW9kZS4gVXNlZCBkdXJpbmcgZW5jb2RpbmcuCisgKi8KK0MyRU5VTShDMkNvbmZpZzo6YWFjX3Nicl9tb2RlX3QsIHVpbnQzMl90LAorICAgIEFBQ19TQlJfT0ZGLAorICAgIEFBQ19TQlJfU0lOR0xFX1JBVEUsCisgICAgQUFDX1NCUl9EVUFMX1JBVEUsCisgICAgQUFDX1NCUl9BVVRPIC8vLzwgbGV0IHRoZSBjb2RlYyBkZWNpZGUKKykKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbmZpZzo6YWFjX3Nicl9tb2RlX3Q+LCBrUGFyYW1JbmRleEFhY1Nick1vZGU+CisgICAgICAgIEMyU3RyZWFtQWFjU2JyTW9kZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0FBQ19TQlJfTU9ERVtdID0gImNvZGluZy5hYWMtc2JyLW1vZGUiOworCisvKioKKyAqIERSQyBDb21wcmVzc2lvbi4gVXNlZCBkdXJpbmcgZGVjb2RpbmcuCisgKi8KK0MyRU5VTShDMkNvbmZpZzo6ZHJjX2NvbXByZXNzaW9uX21vZGVfdCwgaW50MzJfdCwKKyAgICBEUkNfQ09NUFJFU1NJT05fT0RNX0RFRkFVTFQsIC8vLzwgb2RtJ3MgZGVmYXVsdAorICAgIERSQ19DT01QUkVTU0lPTl9OT05FLAorICAgIERSQ19DT01QUkVTU0lPTl9MSUdIVCwKKyAgICBEUkNfQ09NUFJFU1NJT05fSEVBVlkgLy8vPAorKQorCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjpkcmNfY29tcHJlc3Npb25fbW9kZV90PiwKKyAgICAgICAgICAgICAgICBrUGFyYW1JbmRleERyY0NvbXByZXNzaW9uPgorICAgICAgICBDMlN0cmVhbURyY0NvbXByZXNzaW9uTW9kZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0RSQ19DT01QUkVTU0lPTl9NT0RFW10gPSAiY29kaW5nLmRyYy5jb21wcmVzc2lvbi1tb2RlIjsKKworLyoqCisgKiBEUkMgdGFyZ2V0IHJlZmVyZW5jZSBsZXZlbCBpbiBkQkZTLiBVc2VkIGR1cmluZyBkZWNvZGluZy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleERyY1RhcmdldFJlZmVyZW5jZUxldmVsPgorICAgICAgICBDMlN0cmVhbURyY1RhcmdldFJlZmVyZW5jZUxldmVsVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfRFJDX1RBUkdFVF9SRUZFUkVOQ0VfTEVWRUxbXSA9ICJjb2RpbmcuZHJjLnJlZmVyZW5jZS1sZXZlbCI7CisKKy8qKgorICogRFJDIHRhcmdldCByZWZlcmVuY2UgbGV2ZWwgaW4gZEJGUy4gVXNlZCBkdXJpbmcgZGVjb2RpbmcuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhEcmNFbmNvZGVkVGFyZ2V0TGV2ZWw+CisgICAgICAgIEMyU3RyZWFtRHJjRW5jb2RlZFRhcmdldExldmVsVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfRFJDX0VOQ09ERURfVEFSR0VUX0xFVkVMW10gPSAiY29kaW5nLmRyYy5lbmNvZGVkLWxldmVsIjsKKworLyoqCisgKiBEUkMgdGFyZ2V0IHJlZmVyZW5jZSBsZXZlbCBpbiBkQkZTLiBVc2VkIGR1cmluZyBkZWNvZGluZy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleERyY0Jvb3N0RmFjdG9yPgorICAgICAgICBDMlN0cmVhbURyY0Jvb3N0RmFjdG9yVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfRFJDX0JPT1NUX0ZBQ1RPUltdID0gImNvZGluZy5kcmMuYm9vc3QtZmFjdG9yIjsKKworLyoqCisgKiBEUkMgdGFyZ2V0IHJlZmVyZW5jZSBsZXZlbCBpbiBkQkZTLiBVc2VkIGR1cmluZyBkZWNvZGluZy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleERyY0F0dGVudWF0aW9uRmFjdG9yPgorICAgICAgICBDMlN0cmVhbURyY0F0dGVudWF0aW9uRmFjdG9yVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUltdID0gImNvZGluZy5kcmMuYXR0ZW51YXRpb24tZmFjdG9yIjsKKworLyoqCisgKiBEUkMgRWZmZWN0IFR5cGUgKHNlZSBJU08gMjMwMDMtNCkgVW5pZm9ybSBEeW5hbWljIFJhbmdlIENvbnRyb2wuIFVzZWQgZHVyaW5nIGRlY29kaW5nLgorICovCitDMkVOVU0oQzJDb25maWc6OmRyY19lZmZlY3RfdHlwZV90LCBpbnQzMl90LAorICAgIERSQ19FRkZFQ1RfT0RNX0RFRkFVTFQgPSAtMiwgLy8vPCBvZG0ncyBkZWZhdWx0CisgICAgRFJDX0VGRkVDVF9PRkYgPSAtMSwgICAgLy8vPCBubyBEUkMKKyAgICBEUkNfRUZGRUNUX05PTkUgPSAwLCAgICAvLy88IG5vIERSQyBleGNlcHQgdG8gcHJldmVudCBjbGlwcGluZworICAgIERSQ19FRkZFQ1RfTEFURV9OSUdIVCwKKyAgICBEUkNfRUZGRUNUX05PSVNZX0VOVklST05NRU5ULAorICAgIERSQ19FRkZFQ1RfTElNSVRFRF9QTEFZQkFDS19SQU5HRSwKKyAgICBEUkNfRUZGRUNUX0xPV19QTEFZQkFDS19MRVZFTCwKKyAgICBEUkNfRUZGRUNUX0RJQUxPR19FTkhBTkNFTUVOVCwKKyAgICBEUkNfRUZGRUNUX0dFTkVSQUxfQ09NUFJFU1NJT04KKykKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbmZpZzo6ZHJjX2VmZmVjdF90eXBlX3Q+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4RHJjRWZmZWN0VHlwZT4KKyAgICAgICAgQzJTdHJlYW1EcmNFZmZlY3RUeXBlVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfRFJDX0VGRkVDVF9UWVBFW10gPSAiY29kaW5nLmRyYy5lZmZlY3QtdHlwZSI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBQUMgY29tcG9uZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBBQUMgc3RyZWFtIGZvcm1hdAorICovCitDMkVOVU0oQzJDb25maWc6OmFhY19wYWNrYWdpbmdfdCwgdWludDMyX3QsCisgICAgQUFDX1BBQ0tBR0lOR19SQVcsCisgICAgQUFDX1BBQ0tBR0lOR19BRFRTCispCisKK3R5cGVkZWYgQzJDb25maWc6OmFhY19wYWNrYWdpbmdfdCBDMkFhY1N0cmVhbUZvcm1hdEtpbmQ7IC8vIGRlcHJlY2F0ZWQKKy8vIGRlcHJlY2F0ZWQKK2NvbnN0ZXhwciBDMkNvbmZpZzo6YWFjX3BhY2thZ2luZ190IEMyQWFjU3RyZWFtRm9ybWF0UmF3ID0gQzJDb25maWc6OkFBQ19QQUNLQUdJTkdfUkFXOworY29uc3RleHByIEMyQ29uZmlnOjphYWNfcGFja2FnaW5nX3QgQzJBYWNTdHJlYW1Gb3JtYXRBZHRzID0gQzJDb25maWc6OkFBQ19QQUNLQUdJTkdfQURUUzsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkVhc3lFbnVtPEMyQ29uZmlnOjphYWNfcGFja2FnaW5nX3Q+PiwKKyAgICAgICAga1BhcmFtSW5kZXhBYWNQYWNrYWdpbmc+IEMyU3RyZWFtQWFjUGFja2FnaW5nSW5mbzsKK3R5cGVkZWYgQzJTdHJlYW1BYWNQYWNrYWdpbmdJbmZvIEMyU3RyZWFtQWFjRm9ybWF0SW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0FBQ19QQUNLQUdJTkdbXSA9ICJjb2RlZC5hYWMtcGFja2FnaW5nIjsKKyNkZWZpbmUgQzJfTkFNRV9TVFJFQU1fQUFDX0ZPUk1BVF9TRVRUSU5HIEMyX1BBUkFNS0VZX0FBQ19QQUNLQUdJTkcKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUExBVEZPUk0tREVGSU5FRCBQQVJBTUVURVJTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogUGxhdGZvcm0gbGV2ZWwgYW5kIGZlYXR1cmVzLgorICovCitlbnVtIEMyQ29uZmlnOjpwbGF0Zm9ybV9sZXZlbF90IDogdWludDMyX3QgeworICAgIFBMQVRGT1JNX1AsICAgLy8vPCBzdXBwb3J0IGZvciBBbmRyb2lkIDkuMCBmZWF0dXJlIHNldAorfTsKKworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjpwbGF0Zm9ybV9sZXZlbF90PiwKKyAgICAgICAgICAgICAgICBrUGFyYW1JbmRleFBsYXRmb3JtTGV2ZWw+CisgICAgICAgIEMyUGxhdGZvcm1MZXZlbFNldHRpbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QTEFURk9STV9MRVZFTFtdID0gImFwaS5wbGF0Zm9ybS1sZXZlbCI7CisKK2VudW0gQzJDb25maWc6OnBsYXRmb3JtX2ZlYXR1cmVfdCA6IHVpbnQ2NF90IHsKKyAgICAvLyBubyBwbGF0Zm9ybS1zcGVjaWZpYyBmZWF0dXJlcyBoYXZlIGJlZW4gZGVmaW5lZAorfTsKKworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjpwbGF0Zm9ybV9mZWF0dXJlX3Q+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4UGxhdGZvcm1GZWF0dXJlcz4KKyAgICAgICAgQzJQbGF0Zm9ybUZlYXR1cmVzU2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BMQVRGT1JNX0ZFQVRVUkVTW10gPSAiYXBpLnBsYXRmb3JtLWZlYXR1cmVzIjsKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIHByZWZlcnJlZCBpb24gYWxsb2NhdGlvbiBwYXJhbWV0ZXJzIGZvciBhIGdpdmVuIG1lbW9yeSB1c2FnZS4KKyAqLworc3RydWN0IEMyU3RvcmVJb25Vc2FnZVN0cnVjdCB7CisgICAgaW5saW5lIEMyU3RvcmVJb25Vc2FnZVN0cnVjdCgpIHsKKyAgICAgICAgbWVtc2V0KHRoaXMsIDAsIHNpemVvZigqdGhpcykpOworICAgIH0KKworICAgIGlubGluZSBDMlN0b3JlSW9uVXNhZ2VTdHJ1Y3QodWludDY0X3QgdXNhZ2VfLCB1aW50MzJfdCBjYXBhY2l0eV8pCisgICAgICAgIDogdXNhZ2UodXNhZ2VfKSwgY2FwYWNpdHkoY2FwYWNpdHlfKSwgaGVhcE1hc2soMCksIGFsbG9jRmxhZ3MoMCksIG1pbkFsaWdubWVudCgwKSB7IH0KKworICAgIHVpbnQ2NF90IHVzYWdlOyAgICAgICAgLy8vPCBDMk1lbW9yeVVzYWdlCisgICAgdWludDMyX3QgY2FwYWNpdHk7ICAgICAvLy88IGNhcGFjaXR5CisgICAgaW50MzJfdCBoZWFwTWFzazsgICAgICAvLy88IGlvbiBoZWFwTWFzaworICAgIGludDMyX3QgYWxsb2NGbGFnczsgICAgLy8vPCBpb24gYWxsb2NhdGlvbiBmbGFncworICAgIHVpbnQzMl90IG1pbkFsaWdubWVudDsgLy8vPCBtaW5pbXVtIGFsaWdubWVudAorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChTdG9yZUlvblVzYWdlKQorICAgIEMyRklFTEQodXNhZ2UsICJ1c2FnZSIpCisgICAgQzJGSUVMRChjYXBhY2l0eSwgImNhcGFjaXR5IikKKyAgICBDMkZJRUxEKGhlYXBNYXNrLCAiaGVhcC1tYXNrIikKKyAgICBDMkZJRUxEKGFsbG9jRmxhZ3MsICJhbGxvYy1mbGFncyIpCisgICAgQzJGSUVMRChtaW5BbGlnbm1lbnQsICJtaW4tYWxpZ25tZW50IikKK307CisKKy8vIHN0b3JlLCBwcml2YXRlCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlN0b3JlSW9uVXNhZ2VTdHJ1Y3QsIGtQYXJhbUluZGV4U3RvcmVJb25Vc2FnZT4KKyAgICAgICAgQzJTdG9yZUlvblVzYWdlSW5mbzsKKworLyoqCisgKiBGbGV4aWJsZSBwaXhlbCBmb3JtYXQgZGVzY3JpcHRvcnMKKyAqLworc3RydWN0IEMyRmxleGlibGVQaXhlbEZvcm1hdERlc2NyaXB0b3JTdHJ1Y3QgeworICAgIHVpbnQzMl90IHBpeGVsRm9ybWF0OworICAgIHVpbnQzMl90IGJpdERlcHRoOworICAgIEMyQ29sb3I6OnN1YnNhbXBsaW5nX3Qgc3Vic2FtcGxpbmc7CisgICAgQzJDb2xvcjo6cGxhbmVfbGF5b3V0X3QgbGF5b3V0OworCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvcikKKyAgICBDMkZJRUxEKHBpeGVsRm9ybWF0LCAicGl4ZWwtZm9ybWF0IikKKyAgICBDMkZJRUxEKGJpdERlcHRoLCAiYml0LWRlcHRoIikKKyAgICBDMkZJRUxEKHN1YnNhbXBsaW5nLCAic3Vic2FtcGxpbmciKQorICAgIEMyRklFTEQobGF5b3V0LCAibGF5b3V0IikKK307CisKKy8qKgorICogUGxhbmUgbGF5b3V0IG9mIGZsZXhpYmxlIHBpeGVsIGZvcm1hdHMuCisgKgorICogYnBwOiBieXRlcyBwZXIgY29sb3IgY29tcG9uZW50LCBlLmcuIDEgZm9yIDgtYml0IGZvcm1hdHMsIGFuZCAyIGZvciAxMC0xNi1iaXQgZm9ybWF0cy4KKyAqLworQzJFTlVNKEMyQ29sb3I6OnBsYW5lX2xheW91dF90LCB1aW50MzJfdCwKKyAgICAgICAvKiogVW5rbm93biBsYXlvdXQgKi8KKyAgICAgICBVTktOT1dOX0xBWU9VVCwKKworICAgICAgIC8qKiBQbGFuYXIgbGF5b3V0IHdpdGggcm93cyBvZiBlYWNoIHBsYW5lIHBhY2tlZCAoY29sSW5jID0gYnBwKSAqLworICAgICAgIFBMQU5BUl9QQUNLRUQsCisKKyAgICAgICAvKiogU2VtaXBsYW5hciBsYXlvdXQgd2l0aCByb3dzIG9mIGVhY2ggcGxhbmUgcGFja2VkIChjb2xJbmNfWS9BID0gYnBwIChwbGFuYXIpLAorICAgICAgICAqICBjb2xJbmNfQ2IvQ3IgPSAyKmJwcCAoaW50ZXJsZWF2ZWQpLiBVc2VkIG9ubHkgZm9yIFlVVihBKSBmb3JtYXRzLiAqLworICAgICAgIFNFTUlQTEFOQVJfUEFDS0VELAorCisgICAgICAgLyoqIEludGVybGVhdmVkIHBhY2tlZC4gY29sSW5jID0gTipicHAgKE4gYXJlIHRoZSBudW1iZXIgb2YgY29sb3IgY29tcG9uZW50cykgKi8KKyAgICAgICBJTlRFUkxFQVZFRF9QQUNLRUQsCisKKyAgICAgICAvKiogSW50ZXJsZWF2ZWQgYWxpZ25lZC4gY29sSW5jID0gc21hbGxlc3QgcG93ZXIgb2YgMiA+PSBOKmJwcCAoTiBhcmUgdGhlIG51bWJlciBvZiBjb2xvcgorICAgICAgICAqICBjb21wb25lbnRzKSAqLworICAgICAgIElOVEVSTEVBVkVEX0FMSUdORUQKKykKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJTaW1wbGVBcnJheVN0cnVjdDxDMkZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9yU3RydWN0PiwKKyAgICAgICAgICAgICAgICBrUGFyYW1JbmRleEZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9ycz4KKyAgICAgICAgQzJTdG9yZUZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9yc0luZm87CisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSBhbmRyb2lkIGRhdGFzcGFjZSBmb3IgYSByYXcgdmlkZW8vaW1hZ2UgZnJhbWUuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4RGF0YVNwYWNlPiBDMlN0cmVhbURhdGFTcGFjZUluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9EQVRBX1NQQUNFW10gPSAicmF3LmRhdGEtc3BhY2UiOworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgYW5kcm9pZCBzdXJmYWNlIHNjYWxpbmcgbW9kZSBmb3IgYSByYXcgdmlkZW8vaW1hZ2UgZnJhbWUuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4U3VyZmFjZVNjYWxpbmc+IEMyU3RyZWFtU3VyZmFjZVNjYWxpbmdJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfU1VSRkFDRV9TQ0FMSU5HX01PREVbXSA9ICJyYXcuc3VyZmFjZS1zY2FsaW5nIjsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IElOUFVUIFNVUkZBQ0UgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogSW5wdXQgc3VyZmFjZSBFT1MKKyAqLwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMkVhc3lCb29sVmFsdWUsIGtQYXJhbUluZGV4SW5wdXRTdXJmYWNlRW9zPgorICAgICAgICBDMklucHV0U3VyZmFjZUVvc1R1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NVUkZBQ0VfRU9TW10gPSAiaW5wdXQtc3VyZmFjZS5lb3MiOworI2RlZmluZSBDMl9OQU1FX0lOUFVUX1NVUkZBQ0VfRU9TX1RVTklORyBDMl9QQVJBTUtFWV9JTlBVVF9TVVJGQUNFX0VPUworCisvKioKKyAqIFN0YXJ0L3N1c3BlbmQvcmVzdW1lL3N0b3AgY29udHJvbHMgYW5kIHRpbWVzdGFtcHMgZm9yIGlucHV0IHN1cmZhY2UuCisgKgorICogVE9ETzogbWFrZSB0aGVzZSBjb3VudGVycworICovCisKK3N0cnVjdCBDMlRpbWVkQ29udHJvbFN0cnVjdCB7CisgICAgYzJfYm9vbF90IGVuYWJsZWQ7IC8vLzwgY29udHJvbCBpcyBlbmFibGVkCisgICAgaW50NjRfdCB0aW1lc3RhbXA7IC8vLzwgaWYgZW5hYmxlZCwgdGltZSB0aGUgY29udHJvbCBzaG91bGQgdGFrZSBlZmZlY3QKKworICAgIEMyVGltZWRDb250cm9sU3RydWN0KCkKKyAgICAgICAgOiBlbmFibGVkKEMyX0ZBTFNFKSwgdGltZXN0YW1wKDApIHsgfQorCisgICAgLyogaW1wbGljaXQgKi8gQzJUaW1lZENvbnRyb2xTdHJ1Y3QodWludDY0X3QgdGltZXN0YW1wXykKKyAgICAgICAgOiBlbmFibGVkKEMyX1RSVUUpLCB0aW1lc3RhbXAodGltZXN0YW1wXykgeyB9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKFRpbWVkQ29udHJvbCkKKyAgICBDMkZJRUxEKGVuYWJsZWQsICAgImVuYWJsZWQiKQorICAgIEMyRklFTEQodGltZXN0YW1wLCAidGltZXN0YW1wIikKK307CisKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVGltZWRDb250cm9sU3RydWN0LCBrUGFyYW1JbmRleFN0YXJ0QXQ+CisgICAgICAgIEMyUG9ydFN0YXJ0VGltZXN0YW1wVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1VSRkFDRV9TVEFSVF9BVFtdID0gImlucHV0LXN1cmZhY2Uuc3RhcnQiOwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJUaW1lZENvbnRyb2xTdHJ1Y3QsIGtQYXJhbUluZGV4U3VzcGVuZEF0PgorICAgICAgICBDMlBvcnRTdXNwZW5kVGltZXN0YW1wVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1VSRkFDRV9TVVNQRU5EX0FUW10gPSAiaW5wdXQtc3VyZmFjZS5zdXNwZW5kIjsKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVGltZWRDb250cm9sU3RydWN0LCBrUGFyYW1JbmRleFJlc3VtZUF0PgorICAgICAgICBDMlBvcnRSZXN1bWVUaW1lc3RhbXBUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9TVVJGQUNFX1JFU1VNRV9BVFtdID0gImlucHV0LXN1cmZhY2UucmVzdW1lIjsKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVGltZWRDb250cm9sU3RydWN0LCBrUGFyYW1JbmRleFN0b3BBdD4KKyAgICAgICAgQzJQb3J0U3RvcFRpbWVzdGFtcFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NVUkZBQ0VfU1RPUF9BVFtdID0gImlucHV0LXN1cmZhY2Uuc3RvcCI7CisKKy8qKgorICogVGltZSBvZmZzZXQgZm9yIGlucHV0IHN1cmZhY2UuIElucHV0IHRpbWVzdGFtcCB0byBjb2RlYyBpcyBzdXJmYWNlIGJ1ZmZlciB0aW1lc3RhbXAgcGx1cyB0aGlzCisgKiB0aW1lIG9mZnNldC4KKyAqLwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMkludDY0VmFsdWUsIGtQYXJhbUluZGV4VGltZU9mZnNldD4gQzJDb21wb25lbnRUaW1lT2Zmc2V0VHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1VSRkFDRV9USU1FX09GRlNFVFtdID0gImlucHV0LXN1cmZhY2UudGltZS1vZmZzZXQiOworCisvKioKKyAqIE1pbmltdW0gZnBzIGZvciBpbnB1dCBzdXJmYWNlLgorICoKKyAqIFJlcGVhdCBmcmFtZSB0byBtZWV0IHRoaXMuCisgKi8KK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhNaW5GcmFtZVJhdGU+IEMyUG9ydE1pbkZyYW1lUmF0ZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NVUkZBQ0VfTUlOX0ZSQU1FX1JBVEVbXSA9ICJpbnB1dC1zdXJmYWNlLm1pbi1mcmFtZS1yYXRlIjsKKworLyoqCisgKiBUaW1lc3RhbXAgYWRqdXN0bWVudCAob3ZlcnJpZGUpIGZvciBpbnB1dCBzdXJmYWNlIGJ1ZmZlcnMuIFRoZXNlIGNvbnRyb2wgdGhlIGlucHV0IHRpbWVzdGFtcAorICogZmVkIHRvIHRoZSBjb2RlYywgYnV0IGRvIG5vdCBpbXBhY3QgdGhlIG91dHB1dCB0aW1lc3RhbXAuCisgKi8KK3N0cnVjdCBDMlRpbWVzdGFtcEdhcEFkanVzdG1lbnRTdHJ1Y3QgeworICAgIC8vLyBjb250cm9sIG1vZGVzCisgICAgZW51bSBtb2RlX3QgOiB1aW50MzJfdDsKKworICAgIGlubGluZSBDMlRpbWVzdGFtcEdhcEFkanVzdG1lbnRTdHJ1Y3QoKTsKKworICAgIGlubGluZSBDMlRpbWVzdGFtcEdhcEFkanVzdG1lbnRTdHJ1Y3QobW9kZV90IG1vZGVfLCB1aW50NjRfdCB2YWx1ZV8pCisgICAgICAgIDogbW9kZShtb2RlXyksIHZhbHVlKHZhbHVlXykgeyB9CisKKyAgICBtb2RlX3QgbW9kZTsgICAgLy8vPCBjb250cm9sIG1vZGUKKyAgICB1aW50NjRfdCB2YWx1ZTsgLy8vPCBjb250cm9sIHZhbHVlIGZvciBnYXAgYmV0d2VlbiB0d28gdGltZXN0YW1wCisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKFRpbWVzdGFtcEdhcEFkanVzdG1lbnQpCisgICAgQzJGSUVMRChtb2RlLCAibW9kZSIpCisgICAgQzJGSUVMRCh2YWx1ZSwgInZhbHVlIikKK307CisKK0MyRU5VTShDMlRpbWVzdGFtcEdhcEFkanVzdG1lbnRTdHJ1Y3Q6Om1vZGVfdCwgdWludDMyX3QsCisgICAgTk9ORSwKKyAgICBNSU5fR0FQLAorICAgIEZJWEVEX0dBUCwKKyk7CisKK2lubGluZSBDMlRpbWVzdGFtcEdhcEFkanVzdG1lbnRTdHJ1Y3Q6OkMyVGltZXN0YW1wR2FwQWRqdXN0bWVudFN0cnVjdCgpCisgICAgOiBtb2RlKEMyVGltZXN0YW1wR2FwQWRqdXN0bWVudFN0cnVjdDo6Tk9ORSksIHZhbHVlKDApIHsgfQorCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlRpbWVzdGFtcEdhcEFkanVzdG1lbnRTdHJ1Y3Q+IEMyUG9ydFRpbWVzdGFtcEdhcFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NVUkZBQ0VfVElNRVNUQU1QX0FESlVTVE1FTlRbXSA9ICJpbnB1dC1zdXJmYWNlLnRpbWVzdGFtcC1hZGp1c3RtZW50IjsKKworLy8vIEB9CisKKyNlbmRpZiAgLy8gQzJDT05GSUdfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJFbnVtLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyRW51bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZmFkOGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyRW51bS5oCkBAIC0wLDAgKzEsMjI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMkVOVU1fSF8KKyNkZWZpbmUgQzJFTlVNX0hfCisKKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8X0MyTWFjcm9VdGlscy5oPgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8qKiBcZmlsZQorICogVG9vbHMgZm9yIGVhc2llciBlbnVtIHN1cHBvcnQuCisgKi8KKworLy8vIFxjb25kIElOVEVSTkFMCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVRJTElUSUVTIEZPUiBFTlVNRVJBVElPTiBSRUZMRUNUSU9OIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHRoYXQgYWxsb3dzIGlnbm9yaW5nIGVudW0gdmFsdWUgYXNzaWdubWVudCAoZS5nLiBib3RoICcoX0MyRW51bUNvbnN0KWtWYWx1ZSA9IHgnCisgKiBhbmQgJyhfQzJFbnVtQ29uc3Qpa1ZhbHVlJyB3aWxsIGV2YWwgdG8ga1ZhbHVlLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgX0MyRW51bUNvbnN0IHsKK3B1YmxpYzoKKyAgICAvLyBpbXBsaWNpdCBjb252ZXJzaW9uIGZyb20gVAorICAgIGlubGluZSBfQzJFbnVtQ29uc3QoVCB2YWx1ZSkgOiBfbVZhbHVlKHZhbHVlKSB7fQorICAgIC8vIGltcGxpY2l0IGNvbnZlcnNpb24gdG8gVAorICAgIGlubGluZSBvcGVyYXRvciBUKCkgeyByZXR1cm4gX21WYWx1ZTsgfQorICAgIC8vIGltcGxpY2l0IGNvbnZlcnNpb24gdG8gQzJWYWx1ZTo6UHJpbWl0aXZlCisgICAgaW5saW5lIG9wZXJhdG9yIEMyVmFsdWU6OlByaW1pdGl2ZSgpIHsgcmV0dXJuIChUKV9tVmFsdWU7IH0KKyAgICAvLyBpZ25vcmUgYXNzaWdubWVudCBhbmQgcmV0dXJuIFQgaGVyZSB0byBhdm9pZCBpbXBsaWNpdCBjb252ZXJzaW9uIHRvIFQgbGF0ZXIKKyAgICBpbmxpbmUgVCAmb3BlcmF0b3IgPShUIHZhbHVlIF9fdW51c2VkKSB7IHJldHVybiBfbVZhbHVlOyB9Citwcml2YXRlOgorICAgIFQgX21WYWx1ZTsKK307CisKKy8vLyBtYXBwZXIgdG8gZ2V0IG5hbWUgb2YgZW51bQorLy8vIFxub3RlIHRoaXMgd2lsbCBjb250YWluIGFueSBpbml0aWFsaXphdGlvbiwgd2hpY2ggd2Ugd2lsbCByZW1vdmUgd2hlbiBjb252ZXJ0aW5nIHRvIGxvd2VyLWNhc2UKKyNkZWZpbmUgX0MyX0dFVF9FTlVNX05BTUUoeCwgeSkgI3gKKy8vLyBtYXBwZXIgdG8gZ2V0IHZhbHVlIG9mIGVudW0KKyNkZWZpbmUgX0MyX0dFVF9FTlVNX1ZBTFVFKHgsIHR5cGUpIChfQzJFbnVtQ29uc3Q8dHlwZT4peAorCisvLy8gXGVuZGNvbmQKKworY2xhc3MgX0MyRW51bVV0aWxzIHsKKyAgICBzdGF0aWMgQzJTdHJpbmcgY2FtZWxDYXNlVG9EYXNoZWQoQzJTdHJpbmcgbmFtZSk7CisKKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IHNhbml0aXplRW51bVZhbHVlTmFtZXMoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlN0cmluZ0xpdGVyYWw+IG5hbWVzLAorICAgICAgICAgICAgQzJTdHJpbmdMaXRlcmFsIF9wcmVmaXggPSBudWxscHRyKTsKKworICAgIGZyaWVuZCBjbGFzcyBDMlV0aWxUZXN0X0VudW1VdGlsc1Rlc3RfVGVzdDsKKworcHVibGljOgorICAgIC8vIHRoaXMgbWF5IG5vdCBiZSB1c2VkLi4uCisgICAgc3RhdGljIEMyX0hJREUgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IHBhcnNlRW51bVZhbHVlc0Zyb21TdHJpbmcoQzJTdHJpbmdMaXRlcmFsIHZhbHVlKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RhdGljIEMyX0hJREUgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBzYW5pdGl6ZUVudW1WYWx1ZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxUPiB2YWx1ZXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlN0cmluZ0xpdGVyYWw+IG5hbWVzLAorICAgICAgICAgICAgQzJTdHJpbmdMaXRlcmFsIHByZWZpeCA9IG51bGxwdHIpIHsKKyAgICAgICAgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBuYW1lZFZhbHVlczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IHNhbml0aXplZE5hbWVzID0gc2FuaXRpemVFbnVtVmFsdWVOYW1lcyhuYW1lcywgcHJlZml4KTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2YWx1ZXMuc2l6ZSgpICYmIGkgPCBzYW5pdGl6ZWROYW1lcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgbmFtZWRWYWx1ZXMuZW1wbGFjZV9iYWNrKHNhbml0aXplZE5hbWVzW2ldLCB2YWx1ZXNbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuYW1lZFZhbHVlczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBFPgorICAgIHN0YXRpYyBDMl9ISURFIEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgY3VzdG9tRW51bVZhbHVlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxDMlN0cmluZ0xpdGVyYWwsIEU+PiBpdGVtcykgeworICAgICAgICBDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlIG5hbWVkVmFsdWVzOworICAgICAgICBmb3IgKGF1dG8gJml0ZW0gOiBpdGVtcykgeworICAgICAgICAgICAgbmFtZWRWYWx1ZXMuZW1wbGFjZV9iYWNrKGl0ZW0uZmlyc3QsIGl0ZW0uc2Vjb25kKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmFtZWRWYWx1ZXM7CisgICAgfQorfTsKKworI2RlZmluZSBERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUihuYW1lLCB0eXBlLCBwcmVmaXgsIC4uLikgXAorICAgIF9ERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUihfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18sIG5hbWUsIHR5cGUsIHByZWZpeCwgXAorICAgICAgICAgICAgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0RFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSKGVuYWJsZWQsIG5hbWUsIHR5cGUsIHByZWZpeCwgLi4uKSBcCisgICAgX19ERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUihlbmFibGVkLCBuYW1lLCB0eXBlLCBwcmVmaXgsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9fREVGSU5FX0MyX0VOVU1fVkFMVUVfQVVUT19IRUxQRVIoZW5hYmxlZCwgbmFtZSwgdHlwZSwgcHJlZml4LCAuLi4pIFwKKyAgICBfX19ERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUiMjZW5hYmxlZChuYW1lLCB0eXBlLCBwcmVmaXgsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9fX0RFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSKG5hbWUsIHR5cGUsIHByZWZpeCwgLi4uKSBcCit0ZW1wbGF0ZTw+IFwKK0MyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgQzJGaWVsZERlc2NyaXB0b3I6Om5hbWVkVmFsdWVzRm9yKGNvbnN0IG5hbWUgJnIgX191bnVzZWQpIHsgXAorICAgIHJldHVybiBfQzJFbnVtVXRpbHM6OnNhbml0aXplRW51bVZhbHVlcyggXAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiB7IF9DMl9NQVAoX0MyX0dFVF9FTlVNX1ZBTFVFLCB0eXBlLCBfX1ZBX0FSR1NfXykgfSwgXAorICAgICAgICAgICAgeyBfQzJfTUFQKF9DMl9HRVRfRU5VTV9OQU1FLCB0eXBlLCBfX1ZBX0FSR1NfXykgfSwgXAorICAgICAgICAgICAgcHJlZml4KTsgXAorfQorI2RlZmluZSBfX19ERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUl9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXyhuYW1lLCB0eXBlLCBwcmVmaXgsIC4uLikKKworI2RlZmluZSBERUZJTkVfQzJfRU5VTV9WQUxVRV9DVVNUT01fSEVMUEVSKG5hbWUsIG5hbWVzKSBcCisgICAgX0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIoX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fLCBuYW1lLCBuYW1lcykKKyNkZWZpbmUgX0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIoZW5hYmxlZCwgbmFtZSwgbmFtZXMpIFwKKyAgICBfX0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIoZW5hYmxlZCwgbmFtZSwgbmFtZXMpCisjZGVmaW5lIF9fREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUihlbmFibGVkLCBuYW1lLCBuYW1lcykgXAorICAgIF9fX0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIjI2VuYWJsZWQobmFtZSwgbmFtZXMpCisjZGVmaW5lIF9fX0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIobmFtZSwgbmFtZXMpIFwKK3RlbXBsYXRlPD4gXAorQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBDMkZpZWxkRGVzY3JpcHRvcjo6bmFtZWRWYWx1ZXNGb3IoY29uc3QgbmFtZSAmciBfX3VudXNlZCkgeyBcCisgICAgcmV0dXJuIF9DMkVudW1VdGlsczo6Y3VzdG9tRW51bVZhbHVlcyggXAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEMyU3RyaW5nTGl0ZXJhbCwgbmFtZT4+IG5hbWVzKTsgXAorfQorI2RlZmluZSBfX19ERUZJTkVfQzJfRU5VTV9WQUxVRV9DVVNUT01fSEVMUEVSX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fKG5hbWUsIG5hbWVzKQorCisvKioKKyAqIERlZmluZXMgYW4gZW51bSB0eXBlIHdpdGggdGhlIGRlZmF1bHQgbmFtZWQgdmFsdWUgbWFwcGVyLiBUaGUgZGVmYXVsdCBtYXBwZXIKKyAqIGZpbmRzIGFuZCByZW1vdmVzIHRoZSBsb25nZXN0IGNvbW1vbiBwcmVmaXggYWNyb3NzIGFsbCBvZiB0aGUgZW51bSB2YWx1ZSBuYW1lcywgYW5kCisgKiByZXBsYWNlcyBjYW1lbC1jYXNlIHNlcGFyYXRvcnMgd2l0aCBkYXNoZXMgKCctJykuCisgKgorICogVGhpcyBtYWNybyBtdXN0IGJlIHVzZWQgaW4gdGhlIGdsb2JhbCBzY29wZSBhbmQgbmFtZXNwYWNlLgorICoKKyAqICB+fn5+fn5+fn5+fn5+ICguY3BwKQorICogIEMyRU5VTShjMl9lbnVtX3QsIHVpbnQzMl90LAorICogICAgQzJfVkFMVUUxLAorICogICAgQzJfVkFMVUUyID0gNSwKKyAqICAgIEMyX1ZBTFVFMyA9IEMyX1ZBTFVFMSArIDEpCisgKiAgLy8gbmFtZWQgdmFsdWVzIGFyZTogQzJfVkFMVUUxID0+ICIxIiwgQzJfVkFMVUUyID0+ICIyIiwgLi4uCisgKiAgLy8gbG9uZ2VzdCBjb21tb24gcHJlZml4IGlzICJDMl9WQUxVRSIKKyAqICB+fn5+fn5+fn5+fn5+CisgKgorICogXHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgZW51bSB0eXBlIChUaGlzIGNhbiBiZSBhbiBpbm5lciBjbGFzcyBlbnVtLikKKyAqIFxwYXJhbSB0eXBlIHVuZGVybHlpbmcgdHlwZQorICovCisjZGVmaW5lIEMyRU5VTShuYW1lLCB0eXBlLCAuLi4pIFwKK2VudW0gbmFtZSA6IHR5cGUgeyBfX1ZBX0FSR1NfXyB9OyBcCitERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUihuYW1lLCB0eXBlLCBudWxscHRyLCBfX1ZBX0FSR1NfXykKKworLyoqCisgKiBEZWZpbmVzIGFuIGVudW0gdHlwZSB3aXRoIHRoZSBkZWZhdWx0IG5hbWVkIHZhbHVlIG1hcHBlciBidXQgY3VzdG9tIHByZWZpeC4gVGhlIGRlZmF1bHQKKyAqIG1hcHBlciByZW1vdmVzIHRoZSBwcmVmaXggZnJvbSBhbGwgb2YgdGhlIGVudW0gdmFsdWUgbmFtZXMgKGlmIHByZXNlbnQpLCBhbmQKKyAqIGluc2VydHMgZGFzaGVzIGF0IGNhbWVsLWNhc2Ugc2VwYXJhdG9ycyAobG93SGlnaCBiZWNvbWVzIGxvdy1oaWdoKSBhbmQgYWxzbyByZXBsYWNlcworICogbm9uLWxlYWRpbmcgdW5kZXJzY29yZXMgd2l0aCBkYXNoZXMgKCctJykuCisgKgorICogVGhpcyBtYWNybyBtdXN0IGJlIHVzZWQgaW4gdGhlIGdsb2JhbCBzY29wZSBhbmQgbmFtZXNwYWNlLgorICoKKyAqICB+fn5+fn5+fn5+fn5+ICguY3BwKQorICogIEMyRU5VTV9DVVNUT01fUFJFRklYKGMyX2VudW1fdCwgdWludDMyX3QsICJDMl8iLAorICogICAgQzJfVkFMVUUxLAorICogICAgQzJfVkFMVUUyID0gNSwKKyAqICAgIEMyX1ZBTFVFMyA9IEMyX1ZBTFVFMSArIDEpCisgKiAgLy8gbmFtZWQgdmFsdWVzIGFyZTogQzJfVkFMVUUxID0+ICJWQUxVRTEiLCBDMl9WQUxVRTIgPT4gIlZBTFVFMiIsIC4uLgorICogIH5+fn5+fn5+fn5+fn4KKyAqCisgKiBccGFyYW0gbmFtZSBuYW1lIG9mIHRoZSBlbnVtIHR5cGUgKFRoaXMgY2FuIGJlIGFuIGlubmVyIGNsYXNzIGVudW0uKQorICogXHBhcmFtIHR5cGUgdW5kZXJseWluZyB0eXBlCisgKiBccGFyYW0gcHJlZml4IHByZWZpeCB0byByZW1vdmUKKyAqLworI2RlZmluZSBDMkVOVU1fQ1VTVE9NX1BSRUZJWChuYW1lLCB0eXBlLCBwcmVmaXgsIC4uLikgXAorZW51bSBuYW1lIDogdHlwZSB7IF9fVkFfQVJHU19fIH07IFwKK0RFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSKG5hbWUsIHR5cGUsIHByZWZpeCwgX19WQV9BUkdTX18pCisKKy8qKgorICogRGVmaW5lcyBhbiBlbnVtIHR5cGUgd2l0aCBjdXN0b20gbmFtZXMuCisgKgorICogVGhpcyBtYWNybyBtdXN0IGJlIHVzZWQgaW4gdGhlIGdsb2JhbCBzY29wZSBhbmQgbmFtZXNwYWNlLgorICoKKyAqICB+fn5+fn5+fn5+fn5+ICguY3BwKQorICogIEMyRU5VTV9DVVNUT01fTkFNRVMoU29tZVN0cnVjdDo6YzJfZW51bV90LCB1aW50MzJfdCwgKHsKKyAqICAgICAgeyAiT25lIiwgU29tZVN0cnVjdDo6QzJfVkFMVUUxIH0sCisgKiAgICAgIHsgIlR3byIsIFNvbWVTdHJ1Y3Q6OkMyX1ZBTFVFMiB9LAorICogICAgICB7ICJUaHJlZSIsIFNvbWVTdHJ1Y3Q6OkMyX1ZBTFVFMyB9IH0pLAorICogICAgQzJfVkFMVUUxLAorICogICAgQzJfVkFMVUUyID0gNSwKKyAqICAgIEMyX1ZBTFVFMyA9IEMyX1ZBTFVFMSArIDEpCisgKgorICogIC8vIG5hbWVkIHZhbHVlcyBhcmU6IEMyX1ZBTFVFMSA9PiAiT25lIiwgQzJfVkFMVUUyID0+ICJUd28iLCAuLi4KKyAqICB+fn5+fn5+fn5+fn5+CisgKi8KKyNkZWZpbmUgQzJFTlVNX0NVU1RPTV9OQU1FUyhuYW1lLCB0eXBlLCBuYW1lcywgLi4uKSBcCitlbnVtIG5hbWUgOiB0eXBlIHsgX19WQV9BUkdTX18gfTsgXAorREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUihuYW1lLCBuYW1lcykKKworLyoqCisgKiBNYWtlIGVudW1zIHVzYWJsZSBhcyB0aGVpciBpbnRlZ3JhbCB0eXBlcy4KKyAqCisgKiBOb3RlOiB0aGlzIG1ha2VzIHRoZW0gbm90IHVzYWJsZSBpbiBwcmludGYoKQorICovCit0ZW1wbGF0ZTxjbGFzcyBFPgorc3RydWN0IEMyRWFzeUVudW0geworICAgIHVzaW5nIFUgPSB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxFPjo6dHlwZTsKKyAgICBFIHZhbHVlOworICAgIC8vIGRlZmluZSBjb252ZXJzaW9uIGZ1bmN0aW9ucworICAgIGlubGluZSBjb25zdGV4cHIgb3BlcmF0b3IgRSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlOyB9CisgICAgaW5saW5lIGNvbnN0ZXhwciBDMkVhc3lFbnVtKEUgdmFsdWVfKSA6IHZhbHVlKHZhbHVlXykgeyB9CisgICAgaW5saW5lIGNvbnN0ZXhwciBDMkVhc3lFbnVtKFUgdmFsdWVfKSA6IHZhbHVlKEUodmFsdWVfKSkgeyB9CisgICAgaW5saW5lIGNvbnN0ZXhwciBDMkVhc3lFbnVtKCkgPSBkZWZhdWx0OworfTsKKworLy8gbWFrZSBDMkVhc3lFbnVtIGJlaGF2ZSBsaWtlIGEgcmVndWxhciBlbnVtCisKK25hbWVzcGFjZSBzdGQgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEU+CisgICAgc3RydWN0IHVuZGVybHlpbmdfdHlwZTxDMkVhc3lFbnVtPEU+PiB7CisgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdW5kZXJseWluZ190eXBlPEU+Ojp0eXBlIHR5cGU7CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEU+CisgICAgc3RydWN0IGlzX2VudW08QzJFYXN5RW51bTxFPj4geworICAgICAgICBjb25zdGV4cHIgc3RhdGljIGJvb2wgdmFsdWUgPSB0cnVlOworICAgIH07Cit9CisKKyNlbmRpZiAgLy8gQzJFTlVNX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJQYXJhbS5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMlBhcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBiZTNiMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJQYXJhbS5oCkBAIC0wLDAgKzEsMTY3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJQQVJBTV9IXworI2RlZmluZSBDMlBBUkFNX0hfCisKKyNpbmNsdWRlIDxDMi5oPgorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLy8vIFxhZGR0b2dyb3VwIFBhcmFtZXRlcnMKKy8vLyBAeworCisvLy8gXGRlZmdyb3VwIGludGVybmFsIEludGVybmFsIGhlbHBlcnMuCisKKy8qIQorICogXGZpbGUKKyAqIFBBUkFNRVRFUlM6IFNFVFRJTkdzLCBUVU5JTkdzLCBhbmQgSU5GT3MKKyAqID09PQorICoKKyAqIFRoZXNlIHJlcHJlc2VudCBtaXNjZWxsYW5lb3VzIGNvbnRyb2wgYW5kIG1ldGFkYXRhIGluZm9ybWF0aW9uIGFuZCBhcmUgbGlrZWx5IGNvcGllZCBpbnRvCisgKiBrZXJuZWwgc3BhY2UuIFRoZXJlZm9yZSwgdGhlc2UgYXJlIEMtbGlrZSBzdHJ1Y3R1cmVzIGRlc2lnbmVkIHRvIGNhcnJ5IGp1c3QgYSBzbWFsbCBhbW91bnQgb2YKKyAqIGluZm9ybWF0aW9uLiBXZSBhcmUgdXNpbmcgQysrIHRvIGJlIGFibGUgdG8gYWRkIGNvbnN0cnVjdG9ycywgYXMgd2VsbCBhcyBub24tdmlydHVhbCBhbmQgY2xhc3MKKyAqIG1ldGhvZHMuCisgKgorICogPT1TcGVjaWZpY2F0aW9uIGRldGFpbHM6CisgKgorICogUmVzdHJpY3Rpb25zOgorICogICAtIG11c3QgYmUgUE9EIHN0cnVjdCwgZS5nLiBubyB2dGFibGUgKG5vIHZpcnR1YWwgZGVzdHJ1Y3RvcikKKyAqICAgLSBtdXN0IGhhdmUgdGhlIHNhbWUgc2l6ZSBpbiA2NC1iaXQgYW5kIDMyLWJpdCBtb2RlIChubyBzaXplX3QpCisgKiAgIC0gYXMgc3VjaCwgbm8gcG9pbnRlciBtZW1iZXJzCisgKiAgIC0gc29tZSBjb21tb24gbWVtYmVyIGZpZWxkIG5hbWVzIGFyZSByZXNlcnZlZCBhcyB0aGV5IGFyZSBkZWZpbmVkIGFzIG1ldGhvZHMgZm9yIGFsbAorICogICAgIHBhcmFtZXRlcnM6CisgKiAgICAgdGhleSBhcmU6IHNpemUsIHR5cGUsIGtpbmQsIGluZGV4IGFuZCBzdHJlYW0KKyAqCisgKiBCZWhhdmlvcjoKKyAqIC0gUGFyYW1zIGNhbiBiZSBnbG9iYWwgKG5vdCByZWxhdGVkIHRvIGlucHV0IG9yIG91dHB1dCksIHJlbGF0ZWQgdG8gaW5wdXQgb3Igb3V0cHV0LAorICogICBvciByZWxhdGVkIHRvIGFuIGlucHV0L291dHB1dCBzdHJlYW0uCisgKiAtIEFsbCBwYXJhbXMgYXJlIHF1ZXJpZWQvc2V0IHVzaW5nIGEgdW5pcXVlIHBhcmFtIGluZGV4LCB3aGljaCBpbmNvcnBvcmF0ZXMgYSBwb3RlbnRpYWwgc3RyZWFtCisgKiAgIGluZGV4IGFuZC9vciBwb3J0LgorICogLSBRdWVyeWluZyAoc3VwcG9ydGVkKSBwYXJhbXMgTVVTVCBuZXZlciBmYWlsLgorICogLSBBbGwgcGFyYW1zIE1VU1QgaGF2ZSBkZWZhdWx0IHZhbHVlcy4KKyAqIC0gSWYgc29tZSBmaWVsZHMgaGF2ZSAidW5zdXBwb3J0ZWQiIG9yICJpbnZhbGlkIiB2YWx1ZXMgZHVyaW5nIHNldHRpbmcsIHRoaXMgU0hPVUxEIGJlCisgKiAgIGNvbW11bmljYXRlZCB0byB0aGUgYXBwLgorICogICBhKSBJZGVhbGx5LCB0aGlzIHNob3VsZCBiZSBhdm9pZGVkLiAgV2hlbiBzZXR0aW5nIHBhcmFtZXRlcnMsIGluIGdlbmVyYWwsIGNvbXBvbmVudCBzaG91bGQgZG8KKyAqICAgICAiYmVzdCBlZmZvcnQiIHRvIGFwcGx5IGFsbCBzZXR0aW5ncy4gSXQgc2hvdWxkIGNoYW5nZSAiaW52YWxpZC91bnN1cHBvcnRlZCIgdmFsdWVzIHRvIHRoZQorICogICAgIG5lYXJlc3Qgc3VwcG9ydGVkIHZhbHVlcy4KKyAqICAgLSBUaGlzIGlzIGNvbW11bmljYXRlZCB0byB0aGUgY2xpZW50IGJ5IGNoYW5naW5nIHRoZSBzb3VyY2UgdmFsdWVzIGluIHR1bmUoKS8KKyAqICAgICBjb25maWd1cmUoKS4KKyAqICAgYikgSWYgZmFsbGluZyBiYWNrIHRvIGEgc3VwcG9ydGVkIHZhbHVlIGlzIGFic29sdXRlbHkgaW1wb3NzaWJsZSwgdGhlIGNvbXBvbmVudCBTSEFMTCByZXR1cm4KKyAqICAgICBhbiBlcnJvciBmb3IgdGhlIHNwZWNpZmljIHNldHRpbmcsIGJ1dCBzaG91bGQgY29udGludWUgdG8gYXBwbHkgb3RoZXIgc2V0dGluZ3MuCisgKiAgICAgVE9ETzogdGhpcyBjdXJyZW50bHkgbWF5IHJlc3VsdCBpbiB1bmludGVuZGVkIHJlc3VsdHMuCisgKgorICogKipOT1RFOioqIHVubGlrZSBPTVgsIHBhcmFtcyBhcmUgbm90IHZlcnNpb25lZC4gSW5zdGVhZCwgYSBuZXcgc3RydWN0IHdpdGggbmV3IHBhcmFtIGluZGV4CisgKiBTSEFMTCBiZSBhZGRlZCBhcyBuZXcgdmVyc2lvbnMgYXJlIHJlcXVpcmVkLgorICoKKyAqIFRoZSBwcm9wZXIgc3VidHlwZSAoU2V0dGluZywgSW5mbyBvciBQYXJhbSkgaXMgaW5jb3Jwb3JhdGVkIGludG8gdGhlIGNsYXNzIHR5cGUuIERlZmluZSBzdHJ1Y3RzCisgKiB0byBkZWZpbmUgbXVsdGlwbGUgc3VidHlwZWQgdmVyc2lvbnMgb2YgcmVsYXRlZCBwYXJhbWV0ZXJzLgorICoKKyAqID09SW1wbGVtZW50YXRpb24gZGV0YWlsczoKKyAqCisgKiAtIFVzZSBtYWNyb3MgdG8gZGVmaW5lIHBhcmFtZXRlcnMKKyAqIC0gQWxsIHBhcmFtZXRlcnMgbXVzdCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3RvcgorICogICAtIFRoaXMgaXMgb25seSB1c2VkIGZvciBpbnN0YW50aWF0aW5nIHRoZSBjbGFzcyBpbiBzb3VyY2UgKGUuZy4gd2lsbCBub3QgYmUgdXNlZAorICogICAgIHdoZW4gYnVpbGRpbmcgYSBwYXJhbWV0ZXIgYnkgdGhlIGZyYW1ld29yayBmcm9tIGtleS92YWx1ZSBwYWlycy4pCisgKi8KKworLy8vIFxpbmdyb3VwIGludGVybmFsCisKKy8qKgorICogUGFyYW1ldGVyIGJhc2UgY2xhc3MuCisgKi8KK3N0cnVjdCBDMlBhcmFtIHsKKyAgICAvLyBwYXJhbSBpbmRleCBlbmNvbXBhc3NlcyB0aGUgZm9sbG93aW5nOgorICAgIC8vCisgICAgLy8gLSBraW5kIChzZXR0aW5nLCB0dW5pbmcsIGluZm8sIHN0cnVjdCkKKyAgICAvLyAtIHNjb3BlCisgICAgLy8gICAtIGRpcmVjdGlvbiAoZ2xvYmFsLCBpbnB1dCwgb3V0cHV0KQorICAgIC8vICAgLSBzdHJlYW0gZmxhZworICAgIC8vICAgLSBzdHJlYW0gSUQgKHVzdWFsbHkgMCkKKyAgICAvLyAtIGFuZCB0aGUgcGFyYW1ldGVyJ3MgdHlwZSAoY29yZSBpbmRleCkKKyAgICAvLyAgIC0gZmxleGlibGUgcGFyYW1ldGVyIGZsYWcKKyAgICAvLyAgIC0gdmVuZG9yIGV4dGVuc2lvbiBmbGFnCisgICAgLy8gICAtIHR5cGUgaW5kZXggKHRoaXMgaW5jbHVkZXMgdGhlIHZlbmRvciBleHRlbnNpb24gZmxhZykKKyAgICAvLworICAgIC8vIGxheW91dDoKKyAgICAvLworICAgIC8vICAgICAgICBraW5kIDogPC0tLS0tLS0gc2NvcGUgLS0tLS0tLT4gOiA8LS0tLS0gY29yZSBpbmRleCAtLS0tLT4KKyAgICAvLyAgICAgICstLS0tLS0rLS0tLS0rLS0tKy0tLS0tLSstLS0tLS0tLSstLS0tfC0tLS0tLSstLS0tLS0tLS0tLS0tLSsKKyAgICAvLyAgICAgIHwga2luZCB8IGRpciB8IC0gfHN0cmVhbXxzdHJlYW1JRHxmbGV4fHZlbmRvcnwgIHR5cGUgaW5kZXggIHwKKyAgICAvLyAgICAgICstLS0tLS0rLS0tLS0rLS0tKy0tLS0tLSstLS0tLS0tLSstLS0tKy0tLS0tLSstLS0tLS0tLS0tLS0tLSsKKyAgICAvLyAgYml0OiAzMS4uMzAgMjkuMjggICAgICAgMjUgICAyNCAuLiAxNyAgMTYgICAgMTUgICAxNCAgICAuLiAgICAgMAorICAgIC8vCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQzJQYXJhbSBraW5kcywgdXNhYmxlIGFzIGJpdG1hcHMuCisgICAgICovCisgICAgZW51bSBraW5kX3QgOiB1aW50MzJfdCB7CisgICAgICAgIE5PTkUgICAgPSAwLAorICAgICAgICBTVFJVQ1QgID0gKDEgPDwgMCksCisgICAgICAgIElORk8gICAgPSAoMSA8PCAxKSwKKyAgICAgICAgU0VUVElORyA9ICgxIDw8IDIpLAorICAgICAgICBUVU5JTkcgID0gKDEgPDwgMykgfCBTRVRUSU5HLCAvLyB0dW5pbmdzIGFyZSBzZXR0aW5ncworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGFyYW1ldGVyIHR5cGUgaW5kZXggc3BlY2lmaWVzIHRoZSB1bmRlcmx5aW5nIHBhcmFtZXRlciB0eXBlIG9mIGEgcGFyYW1ldGVyIGFzCisgICAgICogYW4gaW50ZWdlciB2YWx1ZS4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlciB0eXBlcyBhcmUgZGl2aWRlZCBpbnRvIHR3byBncm91cHM6IHBsYXRmb3JtIHR5cGVzIGFuZCB2ZW5kb3IgdHlwZXMuCisgICAgICoKKyAgICAgKiBQbGF0Zm9ybSB0eXBlcyBhcmUgZGVmaW5lZCBieSB0aGUgcGxhdGZvcm0gYW5kIGFyZSBjb21tb24gZm9yIGFsbCBpbXBsZW1lbnRhdGlvbnMuCisgICAgICoKKyAgICAgKiBWZW5kb3IgdHlwZXMgYXJlIGRlZmluZWQgYnkgZWFjaCB2ZW5kb3JzLCBzbyB0aGV5IG1heSBkaWZmZXIgYmV0d2VlbiBpbXBsZW1lbnRhdGlvbnMuCisgICAgICogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB2ZW5kb3IgdHlwZXMgYmUgdGhlIHNhbWUgZm9yIGFsbCBpbXBsZW1lbnRhdGlvbnMgYnkgYSBzcGVjaWZpYworICAgICAqIHZlbmRvci4KKyAgICAgKi8KKyAgICB0eXBlZGVmIHVpbnQzMl90IHR5cGVfaW5kZXhfdDsKKyAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICAgICAgVFlQRV9JTkRFWF9WRU5ET1JfU1RBUlQgPSAweDAwMDA4MDAwLCAvLy88IHZlbmRvciBpbmRpY2VzIFNIQUxMIHN0YXJ0IGFmdGVyIHRoaXMKKyAgICB9OworCisgICAgLyoqCisgICAgICogQ29yZSBpbmRleCBpcyB0aGUgdW5kZXJseWluZyBwYXJhbWV0ZXIgdHlwZSBmb3IgYSBwYXJhbWV0ZXIuIEl0IGlzIHVzZWQgdG8gZGVzY3JpYmUgdGhlCisgICAgICogbGF5b3V0IG9mIHRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIHJlZ2FyZGxlc3Mgb2YgdGhlIGNvbXBvbmVudCBvciBwYXJhbWV0ZXIga2luZC9zY29wZS4KKyAgICAgKgorICAgICAqIEl0IGlzIHVzZWQgdG8gaWRlbnRpZnkgYW5kIGRpc3Rpbmd1aXNoIGdsb2JhbCBwYXJhbWV0ZXJzLCBhbmQgYWxzbyBwYXJhbWV0ZXJzIG9uIGEgZ2l2ZW4KKyAgICAgKiBwb3J0IG9yIHN0cmVhbS4gVGhleSBtdXN0IGJlIHVuaXF1ZSBmb3IgdGhlIHNldCBvZiBnbG9iYWwgcGFyYW1ldGVycywgYXMgd2VsbCBhcyBmb3IgdGhlCisgICAgICogc2V0IG9mIHBhcmFtZXRlcnMgb24gZWFjaCBwb3J0IG9yIGVhY2ggc3RyZWFtLCBidXQgdGhlIHNhbWUgY29yZSBpbmRleCBjYW4gYmUgdXNlZCBmb3IKKyAgICAgKiBwYXJhbWV0ZXJzIG9uIGRpZmZlcmVudCBzdHJlYW1zIG9yIHBvcnRzLCBhcyB3ZWxsIGFzIGZvciBnbG9iYWwgcGFyYW1ldGVycyBhbmQgcG9ydC9zdHJlYW0KKyAgICAgKiBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogTXVsdGlwbGUgcGFyYW1ldGVyIHR5cGVzIGNhbiBzaGFyZSB0aGUgc2FtZSBsYXlvdXQuCisgICAgICoKKyAgICAgKiBcbm90ZSBUaGUgbGF5b3V0IGZvciBhbGwgcGFyYW1ldGVycyB3aXRoIHRoZSBzYW1lIGNvcmUgaW5kZXggYWNyb3NzIGFsbCBjb21wb25lbnRzIG11c3QKKyAgICAgKiBiZSBpZGVudGljYWwuCisgICAgICovCisgICAgc3RydWN0IENvcmVJbmRleCB7CisgICAgLy9wdWJsaWM6CisgICAgICAgIGVudW0gOiB1aW50MzJfdCB7CisgICAgICAgICAgICBJU19GTEVYX0ZMQUcgPSAweDAwMDEwMDAwLAorICAgICAgICB9OworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICAgICAgS0lORF9NQVNLICAgICAgPSAweEMwMDAwMDAwLAorICAgICAgICAgICAgS0lORF9TVFJVQ1QgICAgPSAweDAwMDAwMDAwLAorICAgICAgICAgICAgS0lORF9UVU5JTkcgICAgPSAweDQwMDAwMDAwLAorICAgICAgICAgICAgS0lORF9TRVRUSU5HICAgPSAweDgwMDAwMDAwLAorICAgICAgICAgICAgS0lORF9JTkZPICAgICAgPSAweEMwMDAwMDAwLAorCisgICAgICAgICAgICBESVJfTUFTSyAgICAgICA9IDB4MzAwMDAwMDAsCisgICAgICAgICAgICBESVJfR0xPQkFMICAgICA9IDB4MjAwMDAwMDAsCisgICAgICAgICAgICBESVJfVU5ERUZJTkVEICA9IERJUl9NQVNLLCAvLyBNVVNUIGhhdmUgYWxsIGJpdHMgc2V0CisgICAgICAgICAgICBESVJfSU5QVVQgICAgICA9IDB4MDAwMDAwMDAsCisgICAgICAgICAgICBESVJfT1VUUFVUICAgICA9IDB4MTAwMDAwMDAsCisKKyAgICAgICAgICAgIElTX1NUUkVBTV9GTEFHICA9IDB4MDIwMDAwMDAsCisgICAgICAgICAgICBTVFJFQU1fSURfTUFTSyAgPSAweDAxRkUwMDAwLAorICAgICAgICAgICAgU1RSRUFNX0lEX1NISUZUID0gMTcsCisgICAgICAgICAgICBNQVhfU1RSRUFNX0lEICAgPSBTVFJFQU1fSURfTUFTSyA+PiBTVFJFQU1fSURfU0hJRlQsCisgICAgICAgICAgICBTVFJFQU1fTUFTSyAgICAgPSBJU19TVFJFQU1fRkxBRyB8IFNUUkVBTV9JRF9NQVNLLAorCisgICAgICAgICAgICBJU19WRU5ET1JfRkxBRyAgPSAweDAwMDA4MDAwLAorICAgICAgICAgICAgVFlQRV9JTkRFWF9NQVNLID0gMHgwMDAwRkZGRiwKKyAgICAgICAgICAgIENPUkVfTUFTSyAgICAgICA9IFRZUEVfSU5ERVhfTUFTSyB8IElTX0ZMRVhfRkxBRywKKyAgICAgICAgfTsKKworICAgIHB1YmxpYzoKKyAgICAgICAgLy8vIGNvbnN0cnVjdG9yL2NvbnZlcnNpb24gZnJvbSB1aW50MzJfdAorICAgICAgICBpbmxpbmUgQ29yZUluZGV4KHVpbnQzMl90IGluZGV4KSA6IG1JbmRleChpbmRleCkgeyB9CisKKyAgICAgICAgLy8gbm8gY29udmVyc2lvbiBmcm9tIHVpbnQ2NF90CisgICAgICAgIGlubGluZSBDb3JlSW5kZXgodWludDY0X3QgaW5kZXgpID0gZGVsZXRlOworCisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSB2ZW5kb3IgZXh0ZW5zaW9uIHBhcmFtZXRlcgorICAgICAgICBpbmxpbmUgYm9vbCBpc1ZlbmRvcigpIGNvbnN0IHsgcmV0dXJuIG1JbmRleCAmIElTX1ZFTkRPUl9GTEFHOyB9CisKKyAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIGZsZXhpYmxlIHBhcmFtZXRlciAod2l0aCB2YXJpYWJsZSBzaXplKQorICAgICAgICBpbmxpbmUgYm9vbCBpc0ZsZXhpYmxlKCkgY29uc3QgeyByZXR1cm4gbUluZGV4ICYgSVNfRkxFWF9GTEFHOyB9CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIGNvcmUgaW5kZXgKKyAgICAgICAgLy8vIFRoaXMgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBwYXJhbWV0ZXIgdHlwZSBpbmRleCBhbmQgdGhlIGZsZXhpYmxlIGZsYWcuCisgICAgICAgIGlubGluZSB1aW50MzJfdCBjb3JlSW5kZXgoKSBjb25zdCB7IHJldHVybiBtSW5kZXggJiBDT1JFX01BU0s7IH0KKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgcGFyYW1ldGVyIHR5cGUgaW5kZXgKKyAgICAgICAgaW5saW5lIHR5cGVfaW5kZXhfdCB0eXBlSW5kZXgoKSBjb25zdCB7IHJldHVybiBtSW5kZXggJiBUWVBFX0lOREVYX01BU0s7IH0KKworICAgICAgICBERUZJTkVfRklFTERfQU5EX01BU0tfQkFTRURfQ09NUEFSSVNPTl9PUEVSQVRPUlMoQ29yZUluZGV4LCBtSW5kZXgsIENPUkVfTUFTSykKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgdWludDMyX3QgbUluZGV4OworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUeXBlIGVuY29tcGFzc2VzIHRoZSBwYXJhbWV0ZXIncyBraW5kICh0dW5pbmcsIHNldHRpbmcsIGluZm8pLCBpdHMgc2NvcGUgKHdoZXRoZXIgdGhlCisgICAgICogcGFyYW1ldGVyIGlzIGdsb2JhbCwgaW5wdXQgb3Igb3V0cHV0LCBhbmQgd2hldGhlciBpdCBpcyBmb3IgYSBzdHJlYW0pIGFuZCB0aGUgaXRzIGJhc2UKKyAgICAgKiBpbmRleCAod2hpY2ggYWxzbyBkZXRlcm1pbmVzIGl0cyBsYXlvdXQpLgorICAgICAqLworICAgIHN0cnVjdCBUeXBlIDogcHVibGljIENvcmVJbmRleCB7CisgICAgLy9wdWJsaWM6CisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBnbG9iYWwgcGFyYW1ldGVyIChub3QgZm9yIGlucHV0IG5vciBvdXRwdXQpCisgICAgICAgIGlubGluZSBib29sIGlzR2xvYmFsKCkgY29uc3QgeyByZXR1cm4gKG1JbmRleCAmIERJUl9NQVNLKSA9PSBESVJfR0xPQkFMOyB9CisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYW4gaW5wdXQgb3IgaW5wdXQgc3RyZWFtIHBhcmFtZXRlcgorICAgICAgICBpbmxpbmUgYm9vbCBmb3JJbnB1dCgpIGNvbnN0IHsgcmV0dXJuIChtSW5kZXggJiBESVJfTUFTSykgPT0gRElSX0lOUFVUOyB9CisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYW4gb3V0cHV0IG9yIG91dHB1dCBzdHJlYW0gcGFyYW1ldGVyCisgICAgICAgIGlubGluZSBib29sIGZvck91dHB1dCgpIGNvbnN0IHsgcmV0dXJuIChtSW5kZXggJiBESVJfTUFTSykgPT0gRElSX09VVFBVVDsgfQorCisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBzdHJlYW0gcGFyYW1ldGVyCisgICAgICAgIGlubGluZSBib29sIGZvclN0cmVhbSgpIGNvbnN0IHsgcmV0dXJuIG1JbmRleCAmIElTX1NUUkVBTV9GTEFHOyB9CisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBwb3J0IChpbnB1dCBvciBvdXRwdXQpIHBhcmFtZXRlcgorICAgICAgICBpbmxpbmUgYm9vbCBmb3JQb3J0KCkgY29uc3QgICB7IHJldHVybiAhZm9yU3RyZWFtKCkgJiYgIWlzR2xvYmFsKCk7IH0KKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgcGFyYW1ldGVyIHR5cGU6IHRoZSBwYXJhbWV0ZXIgaW5kZXggd2l0aG91dCB0aGUgc3RyZWFtIElECisgICAgICAgIGlubGluZSB1aW50MzJfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gbUluZGV4ICYgKH5TVFJFQU1fSURfTUFTSyk7IH0KKworICAgICAgICAvLy8gcmV0dXJuIHRoZSBraW5kIChzdHJ1Y3QsIGluZm8sIHNldHRpbmcgb3IgdHVuaW5nKSBvZiB0aGlzIHBhcmFtCisgICAgICAgIGlubGluZSBraW5kX3Qga2luZCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHN3aXRjaCAobUluZGV4ICYgS0lORF9NQVNLKSB7CisgICAgICAgICAgICAgICAgY2FzZSBLSU5EX1NUUlVDVDogcmV0dXJuIFNUUlVDVDsKKyAgICAgICAgICAgICAgICBjYXNlIEtJTkRfSU5GTzogcmV0dXJuIElORk87CisgICAgICAgICAgICAgICAgY2FzZSBLSU5EX1NFVFRJTkc6IHJldHVybiBTRVRUSU5HOworICAgICAgICAgICAgICAgIGNhc2UgS0lORF9UVU5JTkc6IHJldHVybiBUVU5JTkc7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5PTkU7IC8vIHNob3VsZCBub3QgaGFwcGVuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gY29uc3RydWN0b3IvY29udmVyc2lvbiBmcm9tIHVpbnQzMl90CisgICAgICAgIGlubGluZSBUeXBlKHVpbnQzMl90IGluZGV4KSA6IENvcmVJbmRleChpbmRleCkgeyB9CisKKyAgICAgICAgLy8gbm8gY29udmVyc2lvbiBmcm9tIHVpbnQ2NF90CisgICAgICAgIGlubGluZSBUeXBlKHVpbnQ2NF90IGluZGV4KSA9IGRlbGV0ZTsKKworICAgICAgICBERUZJTkVfRklFTERfQU5EX01BU0tfQkFTRURfQ09NUEFSSVNPTl9PUEVSQVRPUlMoVHlwZSwgbUluZGV4LCB+U1RSRUFNX0lEX01BU0spCisKKyAgICBwcml2YXRlOgorICAgICAgICBmcmllbmQgc3RydWN0IEMyUGFyYW07ICAgLy8gZm9yIHNldFBvcnQoKQorICAgICAgICBmcmllbmQgc3RydWN0IEMyVHVuaW5nOyAgLy8gZm9yIEtJTkRfVFVOSU5HCisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgQzJTZXR0aW5nOyAvLyBmb3IgS0lORF9TRVRUSU5HCisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgQzJJbmZvOyAgICAvLyBmb3IgS0lORF9JTkZPCisgICAgICAgIC8vIGZvciBESVJfR0xPQkFMCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBJLCBjbGFzcyBGPiBmcmllbmQgc3RydWN0IEMyR2xvYmFsUGFyYW07CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBJLCBjbGFzcyBGPiBmcmllbmQgc3RydWN0IEMyUG9ydFBhcmFtOyAgIC8vIGZvciBrRGlyKgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBpbnQgSSwgY2xhc3MgRj4gZnJpZW5kIHN0cnVjdCBDMlN0cmVhbVBhcmFtOyAvLyBmb3Iga0RpcioKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsgLy8gZm9yIHRlc3RpbmcKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgcG9ydC9zdHJlYW0gZGlyZWN0aW9uLgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgY291bGQgbm90IHNldCBkaXJlY3Rpb24gKGUuZy4gaXQgaXMgZ2xvYmFsIHBhcmFtKS4KKyAgICAgICAgICovCisgICAgICAgIGlubGluZSBib29sIHNldFBvcnQoYm9vbCBvdXRwdXQpIHsKKyAgICAgICAgICAgIGlmIChpc0dsb2JhbCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtSW5kZXggPSAobUluZGV4ICYgfkRJUl9NQVNLKSB8IChvdXRwdXQgPyBESVJfT1VUUFVUIDogRElSX0lOUFVUKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBpbmRleCBlbmNvbXBhc3NlcyBhbGwgcmVtYWluaW5nIGluZm9ybWF0aW9uOiBiYXNpY2FsbHkgdGhlIHN0cmVhbSBJRC4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgSW5kZXggOiBwdWJsaWMgVHlwZSB7CisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBpbmRleCBhcyB1aW50MzJfdAorICAgICAgICBpbmxpbmUgb3BlcmF0b3IgdWludDMyX3QoKSBjb25zdCB7IHJldHVybiBtSW5kZXg7IH0KKworICAgICAgICAvLy8gY29uc3RydWN0b3IvY29udmVyc2lvbiBmcm9tIHVpbnQzMl90CisgICAgICAgIGlubGluZSBJbmRleCh1aW50MzJfdCBpbmRleCkgOiBUeXBlKGluZGV4KSB7IH0KKworICAgICAgICAvLy8gY29weSBjb25zdHJ1Y3RvcgorICAgICAgICBpbmxpbmUgSW5kZXgoY29uc3QgSW5kZXggJmluZGV4KSA9IGRlZmF1bHQ7CisKKyAgICAgICAgLy8gbm8gY29udmVyc2lvbiBmcm9tIHVpbnQ2NF90CisgICAgICAgIGlubGluZSBJbmRleCh1aW50NjRfdCBpbmRleCkgPSBkZWxldGU7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIHN0cmVhbSBJRCBvciB+MCBpZiBub3QgYSBzdHJlYW0KKyAgICAgICAgaW5saW5lIHVuc2lnbmVkIHN0cmVhbSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBmb3JTdHJlYW0oKSA/IHJhd1N0cmVhbSgpIDogfjBVOworICAgICAgICB9CisKKyAgICAgICAgLy8vIFJldHVybnMgYW4gaW5kZXggd2l0aCBzdHJlYW0gZmllbGQgc2V0IHRvIGdpdmVuIHN0cmVhbS4KKyAgICAgICAgaW5saW5lIEluZGV4IHdpdGhTdHJlYW0odW5zaWduZWQgc3RyZWFtKSBjb25zdCB7CisgICAgICAgICAgICBJbmRleCBpeCA9IG1JbmRleDsKKyAgICAgICAgICAgICh2b2lkKWl4LnNldFN0cmVhbShzdHJlYW0pOworICAgICAgICAgICAgcmV0dXJuIGl4OworICAgICAgICB9CisKKyAgICAgICAgLy8vIHNldHMgdGhlIHBvcnQgKGRpcmVjdGlvbikuIFJldHVybnMgdHJ1ZSBpZmYgc3VjY2Vzc2Z1bC4KKyAgICAgICAgaW5saW5lIEluZGV4IHdpdGhQb3J0KGJvb2wgb3V0cHV0KSBjb25zdCB7CisgICAgICAgICAgICBJbmRleCBpeCA9IG1JbmRleDsKKyAgICAgICAgICAgICh2b2lkKWl4LnNldFBvcnQob3V0cHV0KTsKKyAgICAgICAgICAgIHJldHVybiBpeDsKKyAgICAgICAgfQorCisgICAgICAgIERFRklORV9GSUVMRF9CQVNFRF9DT01QQVJJU09OX09QRVJBVE9SUyhJbmRleCwgbUluZGV4KQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBDMlBhcmFtOyAgICAgICAgICAgLy8gZm9yIHNldFN0cmVhbSwgTWFrZVN0cmVhbUlkLCBpc1ZhbGlkCisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgX0MyUGFyYW1JbnNwZWN0b3I7IC8vIGZvciB0ZXN0aW5nCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdHlwZSBpcyB2YWxpZCwgZS5nLiBkaXJlY3Rpb24gaXMgbm90IHVuZGVmaW5lZCBBTkQKKyAgICAgICAgICogc3RyZWFtIGlzIDAgaWYgbm90IGEgc3RyZWFtIHBhcmFtLgorICAgICAgICAgKi8KKyAgICAgICAgaW5saW5lIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsKKyAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5vIFR5cGU6OmlzVmFsaWQgKGV2ZW4gdGhvdWdoIHNvbWUgb2YgdGhpcyBjaGVjayBjb3VsZCBiZQorICAgICAgICAgICAgLy8gcGVyZm9ybWVkIG9uIHR5cGVzKSBhcyB0aGlzIGlzIG9ubHkgdXNlZCBvbiBpbmRleC4uLgorICAgICAgICAgICAgcmV0dXJuIChmb3JTdHJlYW0oKSA/IHJhd1N0cmVhbSgpIDwgTUFYX1NUUkVBTV9JRCA6IHJhd1N0cmVhbSgpID09IDApCisgICAgICAgICAgICAgICAgICAgICYmIChtSW5kZXggJiBESVJfTUFTSykgIT0gRElSX1VOREVGSU5FRDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSByYXcgc3RyZWFtIElEIGZpZWxkCisgICAgICAgIGlubGluZSB1bnNpZ25lZCByYXdTdHJlYW0oKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gKG1JbmRleCAmIFNUUkVBTV9JRF9NQVNLKSA+PiBTVFJFQU1fSURfU0hJRlQ7CisgICAgICAgIH0KKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgc3RyZWFtSWQgYml0ZmllbGQgZm9yIGEgZ2l2ZW4gfHN0cmVhbXwuIElmIHN0cmVhbSBpcyBpbnZhbGlkLAorICAgICAgICAvLy8gcmV0dXJucyBhbiBpbnZhbGlkIGJpdGZpZWxkLgorICAgICAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IE1ha2VTdHJlYW1JZCh1bnNpZ25lZCBzdHJlYW0pIHsKKyAgICAgICAgICAgIC8vIHNhdHVyYXRlIHN0cmVhbSBJRCAobWF4IHZhbHVlIGlzIGludmFsaWQpCisgICAgICAgICAgICBpZiAoc3RyZWFtID4gTUFYX1NUUkVBTV9JRCkgeworICAgICAgICAgICAgICAgIHN0cmVhbSA9IE1BWF9TVFJFQU1fSUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKHN0cmVhbSA8PCBTVFJFQU1fSURfU0hJRlQpICYgU1RSRUFNX0lEX01BU0s7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgYm9vbCBjb252ZXJ0VG9TdHJlYW0oYm9vbCBvdXRwdXQsIHVuc2lnbmVkIHN0cmVhbSkgeworICAgICAgICAgICAgbUluZGV4ID0gKG1JbmRleCAmIH5ESVJfTUFTSykgfCBJU19TVFJFQU1fRkxBRzsKKyAgICAgICAgICAgICh2b2lkKXNldFBvcnQob3V0cHV0KTsKKyAgICAgICAgICAgIHJldHVybiBzZXRTdHJlYW0oc3RyZWFtKTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSB2b2lkIGNvbnZlcnRUb1BvcnQoYm9vbCBvdXRwdXQpIHsKKyAgICAgICAgICAgIG1JbmRleCA9IChtSW5kZXggJiB+KERJUl9NQVNLIHwgSVNfU1RSRUFNX0ZMQUcpKTsKKyAgICAgICAgICAgICh2b2lkKXNldFBvcnQob3V0cHV0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSB2b2lkIGNvbnZlcnRUb0dsb2JhbCgpIHsKKyAgICAgICAgICAgIG1JbmRleCA9IChtSW5kZXggJiB+KERJUl9NQVNLIHwgSVNfU1RSRUFNX0ZMQUcpKSB8IERJUl9HTE9CQUw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgc3RyZWFtIGluZGV4LgorICAgICAgICAgKiBccmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgY291bGQgbm90IHNldCBpbmRleCAoZS5nLiBub3QgYSBzdHJlYW0gcGFyYW0pLgorICAgICAgICAgKi8KKyAgICAgICAgaW5saW5lIGJvb2wgc2V0U3RyZWFtKHVuc2lnbmVkIHN0cmVhbSkgeworICAgICAgICAgICAgaWYgKGZvclN0cmVhbSgpKSB7CisgICAgICAgICAgICAgICAgbUluZGV4ID0gKG1JbmRleCAmIH5TVFJFQU1fSURfTUFTSykgfCBNYWtlU3RyZWFtSWQoc3RyZWFtKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy0+c3RyZWFtKCkgPCBNQVhfU1RSRUFNX0lEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfTsKKworcHVibGljOgorICAgIC8vIHB1YmxpYyBnZXR0ZXJzIGZvciBJbmRleCBtZXRob2RzCisKKyAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIGEgdmVuZG9yIGV4dGVuc2lvbiBwYXJhbWV0ZXIKKyAgICBpbmxpbmUgYm9vbCBpc1ZlbmRvcigpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguaXNWZW5kb3IoKTsgfQorICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBmbGV4aWJsZSBwYXJhbWV0ZXIKKyAgICBpbmxpbmUgYm9vbCBpc0ZsZXhpYmxlKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5pc0ZsZXhpYmxlKCk7IH0KKyAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIGEgZ2xvYmFsIHBhcmFtZXRlciAobm90IGZvciBpbnB1dCBub3Igb3V0cHV0KQorICAgIGlubGluZSBib29sIGlzR2xvYmFsKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5pc0dsb2JhbCgpOyB9CisgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhbiBpbnB1dCBvciBpbnB1dCBzdHJlYW0gcGFyYW1ldGVyCisgICAgaW5saW5lIGJvb2wgZm9ySW5wdXQoKSBjb25zdCB7IHJldHVybiBfbUluZGV4LmZvcklucHV0KCk7IH0KKyAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIGFuIG91dHB1dCBvciBvdXRwdXQgc3RyZWFtIHBhcmFtZXRlcgorICAgIGlubGluZSBib29sIGZvck91dHB1dCgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguZm9yT3V0cHV0KCk7IH0KKworICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBzdHJlYW0gcGFyYW1ldGVyCisgICAgaW5saW5lIGJvb2wgZm9yU3RyZWFtKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5mb3JTdHJlYW0oKTsgfQorICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBwb3J0IChpbnB1dCBvciBvdXRwdXQpIHBhcmFtZXRlcgorICAgIGlubGluZSBib29sIGZvclBvcnQoKSBjb25zdCAgIHsgcmV0dXJuIF9tSW5kZXguZm9yUG9ydCgpOyB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgc3RyZWFtIElEIG9yIH4wIGlmIG5vdCBhIHN0cmVhbQorICAgIGlubGluZSB1bnNpZ25lZCBzdHJlYW0oKSBjb25zdCB7IHJldHVybiBfbUluZGV4LnN0cmVhbSgpOyB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgcGFyYW1ldGVyIHR5cGU6IHRoZSBwYXJhbWV0ZXIgaW5kZXggd2l0aG91dCB0aGUgc3RyZWFtIElECisgICAgaW5saW5lIFR5cGUgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXgudHlwZSgpOyB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgaW5kZXggb2YgdGhpcyBwYXJhbWV0ZXIKKyAgICAvLy8gXHRvZG86IHNob3VsZCB3ZSByZXN0cmljdCB0aGlzIHRvIEMyUGFyYW1GaWVsZD8KKyAgICBpbmxpbmUgdWludDMyX3QgaW5kZXgoKSBjb25zdCB7IHJldHVybiAodWludDMyX3QpX21JbmRleDsgfQorCisgICAgLy8vIHJldHVybnMgdGhlIGNvcmUgaW5kZXggb2YgdGhpcyBwYXJhbWV0ZXIKKyAgICBpbmxpbmUgQ29yZUluZGV4IGNvcmVJbmRleCgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguY29yZUluZGV4KCk7IH0KKworICAgIC8vLyByZXR1cm5zIHRoZSBraW5kIG9mIHRoaXMgcGFyYW1ldGVyCisgICAgaW5saW5lIGtpbmRfdCBraW5kKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5raW5kKCk7IH0KKworICAgIC8vLyByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBwYXJhbWV0ZXIgb3IgMCBpZiB0aGUgcGFyYW1ldGVyIGlzIGludmFsaWQKKyAgICBpbmxpbmUgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBfbVNpemU7IH0KKworICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoZSBwYXJhbWV0ZXIgaXMgdmFsaWQKKyAgICBpbmxpbmUgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguaXNWYWxpZCgpICYmIF9tU2l6ZSA+IDA7IH0KKworICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoZSBwYXJhbWV0ZXIgaXMgaW52YWxpZAorICAgIGlubGluZSBib29sIG9wZXJhdG9yISgpIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvciBib29sKCk7IH0KKworICAgIC8vIGVxdWFsaXR5IGlzIGRvbmUgYnkgbWVtY21wICh1c2UgZXF1YWxzKCkgdG8gcHJldmVudCBhbnkgb3ZlcnJlYWQpCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDMlBhcmFtICZvKSBjb25zdCB7CisgICAgICAgIHJldHVybiBlcXVhbHMobykgJiYgbWVtY21wKHRoaXMsICZvLCBfbVNpemUpID09IDA7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQzJQYXJhbSAmbykgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yPT0obyk7IH0KKworICAgIC8vLyBzYWZlKHIpIHR5cGUgY2FzdCBmcm9tIHBvaW50ZXIgYW5kIHNpemUKKyAgICBpbmxpbmUgc3RhdGljIEMyUGFyYW0qIEZyb20odm9pZCAqYWRkciwgc2l6ZV90IGxlbikgeworICAgICAgICAvLyBfbVNpemUgbXVzdCBmaXQgaW50byBzaXplLCBidXQgcmVhbGx5IEMyUGFyYW0gbXVzdCBhbHNvIHRvIGJlIGEgdmFsaWQgcGFyYW0KKyAgICAgICAgaWYgKGxlbiA8IHNpemVvZihDMlBhcmFtKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgLy8gX21TaXplIG11c3QgbWF0Y2ggbGVuZ3RoCisgICAgICAgIEMyUGFyYW0gKnBhcmFtID0gKEMyUGFyYW0qKWFkZHI7CisgICAgICAgIGlmIChwYXJhbS0+X21TaXplICE9IGxlbikgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhcmFtOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIG1hbmFnZWQgY2xvbmUgb2YgfG9yaWd8IGF0IGhlYXAuCisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gQ29weShjb25zdCBDMlBhcmFtICZvcmlnKSB7CisgICAgICAgIGlmIChvcmlnLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICB2b2lkICptZW0gPSA6Om9wZXJhdG9yIG5ldyAob3JpZy5zaXplKCkpOworICAgICAgICBDMlBhcmFtICpwYXJhbSA9IG5ldyAobWVtKSBDMlBhcmFtKG9yaWcuc2l6ZSgpLCBvcmlnLl9tSW5kZXgpOworICAgICAgICBwYXJhbS0+dXBkYXRlRnJvbShvcmlnKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPihwYXJhbSk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgbWFuYWdlZCBjbG9uZSBvZiB8b3JpZ3wgYXMgYSBzdHJlYW0gcGFyYW1ldGVyIGF0IGhlYXAuCisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gQ29weUFzU3RyZWFtKAorICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAmb3JpZywgYm9vbCBvdXRwdXQsIHVuc2lnbmVkIHN0cmVhbSkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gY29weSA9IENvcHkob3JpZyk7CisgICAgICAgIGlmIChjb3B5KSB7CisgICAgICAgICAgICBjb3B5LT5fbUluZGV4LmNvbnZlcnRUb1N0cmVhbShvdXRwdXQsIHN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvcHk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgbWFuYWdlZCBjbG9uZSBvZiB8b3JpZ3wgYXMgYSBwb3J0IHBhcmFtZXRlciBhdCBoZWFwLgorICAgIGlubGluZSBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IENvcHlBc1BvcnQoY29uc3QgQzJQYXJhbSAmb3JpZywgYm9vbCBvdXRwdXQpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IGNvcHkgPSBDb3B5KG9yaWcpOworICAgICAgICBpZiAoY29weSkgeworICAgICAgICAgICAgY29weS0+X21JbmRleC5jb252ZXJ0VG9Qb3J0KG91dHB1dCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvcHk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgbWFuYWdlZCBjbG9uZSBvZiB8b3JpZ3wgYXMgYSBnbG9iYWwgcGFyYW1ldGVyIGF0IGhlYXAuCisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gQ29weUFzR2xvYmFsKGNvbnN0IEMyUGFyYW0gJm9yaWcpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IGNvcHkgPSBDb3B5KG9yaWcpOworICAgICAgICBpZiAoY29weSkgeworICAgICAgICAgICAgY29weS0+X21JbmRleC5jb252ZXJ0VG9HbG9iYWwoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29weTsKKyAgICB9CisKKyNpZiAwCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUCwgY2xhc3M9ZGVjbHR5cGUoQzJQYXJhbShQKCkpKT4KKyAgICBQICpBcygpIHsgcmV0dXJuIFA6OkZyb20odGhpcyk7IH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQPgorICAgIGNvbnN0IFAgKkFzKCkgY29uc3QgeyByZXR1cm4gY29uc3RfY2FzdDxjb25zdCBQKj4oUDo6RnJvbShjb25zdF9jYXN0PEMyUGFyYW0qPih0aGlzKSkpOyB9CisjZW5kaWYKKworcHJvdGVjdGVkOgorICAgIC8vLyBzZXRzIHRoZSBzdHJlYW0gZmllbGQuIFJldHVybnMgdHJ1ZSBpZmYgc3VjY2Vzc2Z1bC4KKyAgICBpbmxpbmUgYm9vbCBzZXRTdHJlYW0odW5zaWduZWQgc3RyZWFtKSB7CisgICAgICAgIHJldHVybiBfbUluZGV4LnNldFN0cmVhbShzdHJlYW0pOworICAgIH0KKworICAgIC8vLyBzZXRzIHRoZSBwb3J0IChkaXJlY3Rpb24pLiBSZXR1cm5zIHRydWUgaWZmIHN1Y2Nlc3NmdWwuCisgICAgaW5saW5lIGJvb2wgc2V0UG9ydChib29sIG91dHB1dCkgeworICAgICAgICByZXR1cm4gX21JbmRleC5zZXRQb3J0KG91dHB1dCk7CisgICAgfQorCitwdWJsaWM6CisgICAgLy8vIGludmFsaWRhdGUgdGhpcyBwYXJhbWV0ZXIuIFRoZXJlIGlzIG5vIHJlY292ZXJ5IGZyb20gdGhpcyBjYWxsOyBlLmcuIHBhcmFtZXRlcgorICAgIC8vLyBjYW5ub3QgYmUgJ2NvcnJlY3RlZCcgdG8gYmUgdmFsaWQuCisgICAgaW5saW5lIHZvaWQgaW52YWxpZGF0ZSgpIHsgX21TaXplID0gMDsgfQorCisgICAgLy8gaWYgb3RoZXIgaXMgdGhlIHNhbWUga2luZCBvZiAodmFsaWQpIHBhcmFtIGFzIHRoaXMsIGNvcHkgaXQgaW50byB0aGlzIGFuZCByZXR1cm4gdHJ1ZS4KKyAgICAvLyBvdGhlcndpc2UsIGRvIG5vdCBjb3B5IGFueXRoaW5nLCBhbmQgcmV0dXJuIGZhbHNlLgorICAgIGlubGluZSBib29sIHVwZGF0ZUZyb20oY29uc3QgQzJQYXJhbSAmb3RoZXIpIHsKKyAgICAgICAgaWYgKG90aGVyLl9tU2l6ZSA8PSBfbVNpemUgJiYgb3RoZXIuX21JbmRleCA9PSBfbUluZGV4ICYmIF9tU2l6ZSA+IDApIHsKKyAgICAgICAgICAgIG1lbWNweSh0aGlzLCAmb3RoZXIsIG90aGVyLl9tU2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgLy8gcmV0dXJucyB8b3wgaWYgaXQgaXMgYSBudWxsIHB0ciwgb3IgaWYgY2FuIHN1aXRhYmx5IGJlIGEgcGFyYW0gb2YgZ2l2ZW4gfHR5cGV8IChlLmcuIGhhcworICAgIC8vIHNhbWUgdHlwZSAoaWdub3Jpbmcgc3RyZWFtIElEKSwgYW5kIHNpemUpLiBPdGhlcndpc2UsIHJldHVybnMgbnVsbC4gSWYgfGNoZWNrRGlyfCBpcyBmYWxzZSwKKyAgICAvLyBhbGxvdyB1bmRlZmluZWQgb3IgZGlmZmVyZW50IGRpcmVjdGlvbiAoZS5nLiBhcyBjb25zdHJ1Y3RlZCBmcm9tIEMyUG9ydFBhcmFtKCkgdnMuCisgICAgLy8gQzJQb3J0UGFyYW06OmlucHV0KSwgYnV0IHN0aWxsIHJlcXVpcmUgZXF1aXZhbGVudCB0eXBlIChzdHJlYW0sIHBvcnQgb3IgZ2xvYmFsKTsgb3RoZXJ3aXNlLAorICAgIC8vIHJldHVybiBudWxsLgorICAgIGlubGluZSBzdGF0aWMgY29uc3QgQzJQYXJhbSogSWZTdWl0YWJsZSgKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0qIG8sIHNpemVfdCBzaXplLCBUeXBlIHR5cGUsIHNpemVfdCBmbGV4U2l6ZSA9IDAsIGJvb2wgY2hlY2tEaXIgPSB0cnVlKSB7CisgICAgICAgIGlmIChvID09IG51bGxwdHIgfHwgby0+X21TaXplIDwgc2l6ZSB8fCAoZmxleFNpemUgJiYgKChvLT5fbVNpemUgLSBzaXplKSAlIGZsZXhTaXplKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9IGVsc2UgaWYgKGNoZWNrRGlyKSB7CisgICAgICAgICAgICByZXR1cm4gby0+X21JbmRleC50eXBlKCkgPT0gdHlwZS5tSW5kZXggPyBvIDogbnVsbHB0cjsKKyAgICAgICAgfSBlbHNlIGlmIChvLT5fbUluZGV4LmlzR2xvYmFsKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuICgoby0+X21JbmRleC50eXBlKCkgXiB0eXBlLm1JbmRleCkgJiB+VHlwZTo6RElSX01BU0spID8gbnVsbHB0ciA6IG87CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gYmFzZSBjb25zdHJ1Y3RvcgorICAgIGlubGluZSBDMlBhcmFtKHVpbnQzMl90IHBhcmFtU2l6ZSwgSW5kZXggcGFyYW1JbmRleCkKKyAgICAgICAgOiBfbVNpemUocGFyYW1TaXplKSwKKyAgICAgICAgICBfbUluZGV4KHBhcmFtSW5kZXgpIHsKKyAgICAgICAgaWYgKHBhcmFtU2l6ZSA+IHNpemVvZihDMlBhcmFtKSkgeworICAgICAgICAgICAgbWVtc2V0KHRoaXMgKyAxLCAwLCBwYXJhbVNpemUgLSBzaXplb2YoQzJQYXJhbSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIGJhc2UgY29uc3RydWN0b3Igd2l0aCBzdHJlYW0gc2V0CisgICAgaW5saW5lIEMyUGFyYW0odWludDMyX3QgcGFyYW1TaXplLCBJbmRleCBwYXJhbUluZGV4LCB1bnNpZ25lZCBzdHJlYW0pCisgICAgICAgIDogX21TaXplKHBhcmFtU2l6ZSksCisgICAgICAgICAgX21JbmRleChwYXJhbUluZGV4IHwgSW5kZXg6Ok1ha2VTdHJlYW1JZChzdHJlYW0pKSB7CisgICAgICAgIGlmIChwYXJhbVNpemUgPiBzaXplb2YoQzJQYXJhbSkpIHsKKyAgICAgICAgICAgIG1lbXNldCh0aGlzICsgMSwgMCwgcGFyYW1TaXplIC0gc2l6ZW9mKEMyUGFyYW0pKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWZvclN0cmVhbSgpKSB7CisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsgLy8gZm9yIHRlc3RpbmcKKworICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHxvfCBoYXMgdGhlIHNhbWUgc2l6ZSBhbmQgaW5kZXggYXMgdGhpcy4gVGhpcyBwZXJmb3JtcyB0aGUKKyAgICAvLy8gYmFzaWMgY2hlY2sgZm9yIGVxdWFsaXR5LgorICAgIGlubGluZSBib29sIGVxdWFscyhjb25zdCBDMlBhcmFtICZvKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbVNpemUgPT0gby5fbVNpemUgJiYgX21JbmRleCA9PSBvLl9tSW5kZXg7CisgICAgfQorCisgICAgdWludDMyX3QgX21TaXplOworICAgIEluZGV4IF9tSW5kZXg7Cit9OworCisvLy8gXGluZ3JvdXAgaW50ZXJuYWwKKy8vLyBhbGxvdyBDMlBhcmFtcyBhY2Nlc3MgdG8gcHJpdmF0ZSBtZXRob2RzLCBlLmcuIGNvbnN0cnVjdG9ycworI2RlZmluZSBDMlBBUkFNX01BS0VfRlJJRU5EUyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgUywgaW50IEksIGNsYXNzIEY+IGZyaWVuZCBzdHJ1Y3QgQzJHbG9iYWxQYXJhbTsgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFMsIGludCBJLCBjbGFzcyBGPiBmcmllbmQgc3RydWN0IEMyUG9ydFBhcmFtOyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgUywgaW50IEksIGNsYXNzIEY+IGZyaWVuZCBzdHJ1Y3QgQzJTdHJlYW1QYXJhbTsgXAorCisvKioKKyAqIFNldHRpbmcgYmFzZSBzdHJ1Y3R1cmUgZm9yIGNvbXBvbmVudCBtZXRob2Qgc2lnbmF0dXJlcy4gV3JhcCBjb25zdHJ1Y3RvcnMuCisgKi8KK3N0cnVjdCBDMlNldHRpbmcgOiBwdWJsaWMgQzJQYXJhbSB7Citwcm90ZWN0ZWQ6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICBpbmxpbmUgQzJTZXR0aW5nKGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgOiBDMlBhcmFtKGFyZ3MuLi4pIHsgfQorcHVibGljOiAvLyBUT0RPCisgICAgZW51bSA6IHVpbnQzMl90IHsgUEFSQU1fS0lORCA9IFR5cGU6OktJTkRfU0VUVElORyB9OworfTsKKworLyoqCisgKiBUdW5pbmcgYmFzZSBzdHJ1Y3R1cmUgZm9yIGNvbXBvbmVudCBtZXRob2Qgc2lnbmF0dXJlcy4gV3JhcCBjb25zdHJ1Y3RvcnMuCisgKi8KK3N0cnVjdCBDMlR1bmluZyA6IHB1YmxpYyBDMlNldHRpbmcgeworcHJvdGVjdGVkOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgaW5saW5lIEMyVHVuaW5nKGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgOiBDMlNldHRpbmcoYXJncy4uLikgeyB9CitwdWJsaWM6IC8vIFRPRE8KKyAgICBlbnVtIDogdWludDMyX3QgeyBQQVJBTV9LSU5EID0gVHlwZTo6S0lORF9UVU5JTkcgfTsKK307CisKKy8qKgorICogSW5mbyBiYXNlIHN0cnVjdHVyZSBmb3IgY29tcG9uZW50IG1ldGhvZCBzaWduYXR1cmVzLiBXcmFwIGNvbnN0cnVjdG9ycy4KKyAqLworc3RydWN0IEMySW5mbyA6IHB1YmxpYyBDMlBhcmFtIHsKK3Byb3RlY3RlZDoKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgIGlubGluZSBDMkluZm8oY29uc3QgQXJncygmLi4uIGFyZ3MpKSA6IEMyUGFyYW0oYXJncy4uLikgeyB9CitwdWJsaWM6IC8vIFRPRE8KKyAgICBlbnVtIDogdWludDMyX3QgeyBQQVJBTV9LSU5EID0gVHlwZTo6S0lORF9JTkZPIH07Cit9OworCisvKioKKyAqIFN0cnVjdHVyZSB1bmlxdWVseSBzcGVjaWZ5aW5nIGEgZmllbGQgaW4gYW4gYXJiaXRyYXJ5IHN0cnVjdHVyZS4KKyAqCisgKiBcbm90ZSBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGRpZmZlcmVudGx5IGluIEMyRmllbGREZXNjcmlwdG9yIHRvCisgKiBpZGVudGlmeSBhcnJheSBmaWVsZHMsIHN1Y2ggdGhhdCBfbVNpemUgaXMgdGhlIHNpemUgb2YgZWFjaCBlbGVtZW50LiBUaGlzIGlzCisgKiBiZWNhdXNlIHRoZSBmaWVsZCBkZXNjcmlwdG9yIGNvbnRhaW5zIHRoZSBhcnJheS1sZW5ndGgsIGFuZCB3ZSB3YW50IHRvIGtlZXAKKyAqIGEgcmVsZXZhbnQgZWxlbWVudCBzaXplIGZvciB2YXJpYWJsZSBsZW5ndGggYXJyYXlzLgorICovCitzdHJ1Y3QgX0MyRmllbGRJZCB7CisvL3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB1c2VkIGZvciBDMkZpZWxkRGVzY3JpcHRvciB0aGF0IHJlbW92ZXMgdGhlIGFycmF5IGV4dGVudC4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gb2Zmc2V0IHBvaW50ZXIgdG8gdGhlIGZpZWxkIGluIGFuIG9iamVjdCBhdCBhZGRyZXNzIDAuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgY2xhc3MgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8VD46OnR5cGU+CisgICAgaW5saW5lIF9DMkZpZWxkSWQoVCogb2Zmc2V0KQorICAgICAgICA6IC8vIG9mZnNldCBpcyBmcm9tICIwIiBzbyB3aWxsIGZpdCBvbiAzMi1iaXRzCisgICAgICAgICAgX21PZmZzZXQoKHVpbnQzMl90KSh1aW50cHRyX3QpKG9mZnNldCkpLAorICAgICAgICAgIF9tU2l6ZShzaXplb2YoQikpIHsgfQorCisgICAgLyoqCisgICAgICogRGlyZWN0IGNvbnN0cnVjdG9yIGZyb20gb2Zmc2V0IGFuZCBzaXplLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSBvZmZzZXQgb2Zmc2V0IG9mIHRoZSBmaWVsZC4KKyAgICAgKiBccGFyYW1baW5dIHNpemUgc2l6ZSBvZiB0aGUgZmllbGQuCisgICAgICovCisgICAgaW5saW5lIF9DMkZpZWxkSWQoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpCisgICAgICAgIDogX21PZmZzZXQob2Zmc2V0KSwgX21TaXplKHNpemUpIHt9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB1c2VkIHRvIGlkZW50aWZ5IGEgZmllbGQgaW4gYW4gb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtIFVbdHlwZV0gcG9pbnRlciB0byB0aGUgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhpcyBmaWVsZC4gVGhpcyBpcyBuZWVkZWQgaW4gY2FzZSB0aGUKKyAgICAgKiAgICAgICAgZmllbGQgaXMgaW4gYW4gKGluaGVyaXRlZCkgYmFzZSBjbGFzcywgaW4gd2hpY2ggY2FzZSBUIHdpbGwgYmUgdGhhdCBiYXNlIGNsYXNzLgorICAgICAqIFxwYXJhbSBwbVtpbV0gbWVtYmVyIHBvaW50ZXIgdG8gdGhlIGZpZWxkCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8Uj46OnR5cGU+CisgICAgaW5saW5lIF9DMkZpZWxkSWQoVSAqLCBSIFQ6OiogcG0pCisgICAgICAgIDogX21PZmZzZXQoKHVpbnQzMl90KSh1aW50cHRyX3QpKCYoKChVKikyNTYpLT4qcG0pKSAtIDI1NnUpLAorICAgICAgICAgIF9tU2l6ZShzaXplb2YoQikpIHsgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgdXNlZCB0byBpZGVudGlmeSBhIGZpZWxkIGluIGFuIG9iamVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwbVtpbV0gbWVtYmVyIHBvaW50ZXIgdG8gdGhlIGZpZWxkCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8Uj46OnR5cGU+CisgICAgaW5saW5lIF9DMkZpZWxkSWQoUiBUOjoqIHBtKQorICAgICAgICA6IF9tT2Zmc2V0KCh1aW50MzJfdCkodWludHB0cl90KSgmKCgoVCopMCktPipwbSkpKSwKKyAgICAgICAgICBfbVNpemUoc2l6ZW9mKEIpKSB7IH0KKworICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgX0MyRmllbGRJZCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tT2Zmc2V0ID09IG90aGVyLl9tT2Zmc2V0ICYmIF9tU2l6ZSA9PSBvdGhlci5fbVNpemU7CisgICAgfQorCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IF9DMkZpZWxkSWQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbU9mZnNldCA8IG90aGVyLl9tT2Zmc2V0IHx8CisgICAgICAgICAgICAvLyBOT1RFOiBvcmRlciBwYXJlbnQgc3RydWN0dXJlIGJlZm9yZSBzdWIgZmllbGQKKyAgICAgICAgICAgIChfbU9mZnNldCA9PSBvdGhlci5fbU9mZnNldCAmJiBfbVNpemUgPiBvdGhlci5fbVNpemUpOworICAgIH0KKworICAgIERFRklORV9PVEhFUl9DT01QQVJJU09OX09QRVJBVE9SUyhfQzJGaWVsZElkKQorCisjaWYgMAorICAgIGlubGluZSB1aW50MzJfdCBvZmZzZXQoKSBjb25zdCB7IHJldHVybiBfbU9mZnNldDsgfQorICAgIGlubGluZSB1aW50MzJfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gX21TaXplOyB9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRlJJRU5EX1RFU1QpCisgICAgZnJpZW5kIHZvaWQgUHJpbnRUbyhjb25zdCBfQzJGaWVsZElkICZkLCA6OnN0ZDo6b3N0cmVhbSopOworI2VuZGlmCisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsKKyAgICBmcmllbmQgc3RydWN0IEMyRmllbGREZXNjcmlwdG9yOworCisgICAgdWludDMyX3QgX21PZmZzZXQ7IC8vIG9mZnNldCBvZiBmaWVsZAorICAgIHVpbnQzMl90IF9tU2l6ZTsgICAvLyBzaXplIG9mIGZpZWxkCit9OworCisvKioKKyAqIFN0cnVjdHVyZSB1bmlxdWVseSBzcGVjaWZ5aW5nIGEgJ2ZpZWxkJyBpbiBhIGNvbmZpZ3VyYXRpb24uIFRoZSBmaWVsZAorICogY2FuIGJlIGEgZmllbGQgb2YgYSBjb25maWd1cmF0aW9uLCBhIHN1YmZpZWxkIG9mIGEgZmllbGQgb2YgYSBjb25maWd1cmF0aW9uLAorICogYW5kIGV2ZW4gdGhlIHdob2xlIGNvbmZpZ3VyYXRpb24uIE1vcmVvdmVyLCBpZiB0aGUgZmllbGQgY2FuIHBvaW50IHRvIGFuCisgKiBlbGVtZW50IGluIGEgYXJyYXkgZmllbGQsIG9yIHRvIHRoZSBlbnRpcmUgYXJyYXkgZmllbGQuCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgcXVlcnlpbmcgc3VwcG9ydGVkIHZhbHVlcyBmb3IgYSBmaWVsZCwgYXMgd2VsbAorICogYXMgY29tbXVuaWNhdGluZyBjb25maWd1cmF0aW9uIGZhaWx1cmVzIGFuZCBjb25mbGljdHMgd2hlbiB0cnlpbmcgdG8gY2hhbmdlCisgKiBhIGNvbmZpZ3VyYXRpb24gZm9yIGEgY29tcG9uZW50L2ludGVyZmFjZSBvciBhIHN0b3JlLgorICovCitzdHJ1Y3QgQzJQYXJhbUZpZWxkIHsKKy8vcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGZpZWxkIGlkZW50aWZpZXIgdXNpbmcgYSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciAodmFyaWFibGUpLAorICAgICAqIGFuZCBhIHBvaW50ZXIgdG8gbWVtYmVyLgorICAgICAqCisgICAgICogfn5+fn5+fn5+fn5+fiAoLmNwcCkKKyAgICAgKgorICAgICAqIHN0cnVjdCBDMlNvbWVQYXJhbSB7CisgICAgICogICB1aW50MzJfdCBtRmllbGQ7CisgICAgICogICB1aW50MzJfdCBtQXJyYXlbMl07CisgICAgICogICBDMk90aGVyU3RydWN0IG1TdHJ1Y3Q7CisgICAgICogICB1aW50MzJfdCBtRmxleEFycmF5W107CisgICAgICogfSAqbVBhcmFtOworICAgICAqCisgICAgICogQzJQYXJhbUZpZWxkKG1QYXJhbSwgJm1QYXJhbS0+bUZpZWxkKTsKKyAgICAgKiBDMlBhcmFtRmllbGQobVBhcmFtLCAmbVBhcmFtLT5tQXJyYXkpOworICAgICAqIEMyUGFyYW1GaWVsZChtUGFyYW0sICZtUGFyYW0tPm1BcnJheVswXSk7CisgICAgICogQzJQYXJhbUZpZWxkKG1QYXJhbSwgJm1QYXJhbS0+bVN0cnVjdC5tU3ViRmllbGQpOworICAgICAqIEMyUGFyYW1GaWVsZChtUGFyYW0sICZtUGFyYW0tPm1GbGV4QXJyYXkpOworICAgICAqIEMyUGFyYW1GaWVsZChtUGFyYW0sICZtUGFyYW0tPm1GbGV4QXJyYXlbMl0pOworICAgICAqCisgICAgICogfn5+fn5+fn5+fn5+fgorICAgICAqCisgICAgICogXHRvZG8gZml4IHdoYXQgdGhpcyBpcyBmb3IgVFtdIChmb3Igbm93IHNpemUgYmVjb21lcyBUWzFdKQorICAgICAqCisgICAgICogXG5vdGUgdGhpcyBkb2VzIG5vdCB3b3JrIGZvciA2NC1iaXQgbWVtYmVycyBhcyBpdCB0cmlnZ2VycyBhCisgICAgICogJ3Rha2luZyBhZGRyZXNzIG9mIHBhY2tlZCBtZW1iZXInIHdhcm5pbmcuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW0gcG9pbnRlciB0byBwYXJhbWV0ZXIKKyAgICAgKiBccGFyYW0gb2Zmc2V0IG1lbWJlciBwb2ludGVyCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUywgdHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgQzJQYXJhbUZpZWxkKFMqIHBhcmFtLCBUKiBvZmZzZXQpCisgICAgICAgIDogX21JbmRleChwYXJhbS0+aW5kZXgoKSksCisgICAgICAgICAgX21GaWVsZElkKChUKikoKHVpbnRwdHJfdClvZmZzZXQgLSAodWludHB0cl90KXBhcmFtKSkge30KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFMsIHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIHN0YXRpYyBDMlBhcmFtRmllbGQgTWFrZShTJiBwYXJhbSwgVCYgb2Zmc2V0KSB7CisgICAgICAgIHJldHVybiBDMlBhcmFtRmllbGQocGFyYW0uaW5kZXgoKSwgKHVpbnRwdHJfdCkmb2Zmc2V0IC0gKHVpbnRwdHJfdCkmcGFyYW0sIHNpemVvZihUKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgZmllbGQgaWRlbnRpZmllciB1c2luZyBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyICh2YXJpYWJsZSksCisgICAgICogYW5kIGEgbWVtYmVyIHBvaW50ZXIuIFRoaXMgbWV0aG9kIGNhbm5vdCBiZSB1c2VkIHRvIHJlZmVyIHRvIGFuCisgICAgICogYXJyYXkgZWxlbWVudCBvciBhIHN1YmZpZWxkLgorICAgICAqCisgICAgICogfn5+fn5+fn5+fn5+fiAoLmNwcCkKKyAgICAgKgorICAgICAqIEMyU29tZVBhcmFtIG1QYXJhbTsKKyAgICAgKiBDMlBhcmFtRmllbGQoJm1QYXJhbSwgJkMyU29tZVBhcmFtOjptTWVtYmVyRmllbGQpOworICAgICAqCisgICAgICogfn5+fn5+fn5+fn5+fgorICAgICAqCisgICAgICogXHBhcmFtIHAgcG9pbnRlciB0byBwYXJhbWV0ZXIKKyAgICAgKiBccGFyYW0gVCBtZW1iZXIgcG9pbnRlciB0byB0aGUgZmllbGQgbWVtYmVyCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KKyAgICBpbmxpbmUgQzJQYXJhbUZpZWxkKFUgKnAsIFIgVDo6KiBwbSkgOiBfbUluZGV4KHAtPmluZGV4KCkpLCBfbUZpZWxkSWQocCwgcG0pIHsgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgZmllbGQgaWRlbnRpZmllciB0byBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyICh2YXJpYWJsZSkuCisgICAgICoKKyAgICAgKiB+fn5+fn5+fn5+fn5+ICguY3BwKQorICAgICAqCisgICAgICogQzJTb21lUGFyYW0gbVBhcmFtOworICAgICAqIEMyUGFyYW1GaWVsZCgmbVBhcmFtKTsKKyAgICAgKgorICAgICAqIH5+fn5+fn5+fn5+fn4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwYXJhbSBwb2ludGVyIHRvIHBhcmFtZXRlcgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFM+CisgICAgaW5saW5lIEMyUGFyYW1GaWVsZChTKiBwYXJhbSkKKyAgICAgICAgOiBfbUluZGV4KHBhcmFtLT5pbmRleCgpKSwgX21GaWVsZElkKDB1LCBwYXJhbS0+c2l6ZSgpKSB7IH0KKworICAgIC8qKiBDb3B5IGNvbnN0cnVjdG9yLiAqLworICAgIGlubGluZSBDMlBhcmFtRmllbGQoY29uc3QgQzJQYXJhbUZpZWxkICZvdGhlcikgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogRXF1YWxpdHkgb3BlcmF0b3IuCisgICAgICovCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDMlBhcmFtRmllbGQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbUluZGV4ID09IG90aGVyLl9tSW5kZXggJiYgX21GaWVsZElkID09IG90aGVyLl9tRmllbGRJZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcmRlcmluZyBvcGVyYXRvci4KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgQzJQYXJhbUZpZWxkICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gX21JbmRleCA8IG90aGVyLl9tSW5kZXggfHwKKyAgICAgICAgICAgIChfbUluZGV4ID09IG90aGVyLl9tSW5kZXggJiYgX21GaWVsZElkIDwgb3RoZXIuX21GaWVsZElkKTsKKyAgICB9CisKKyAgICBERUZJTkVfT1RIRVJfQ09NUEFSSVNPTl9PUEVSQVRPUlMoQzJQYXJhbUZpZWxkKQorCitwcm90ZWN0ZWQ6CisgICAgaW5saW5lIEMyUGFyYW1GaWVsZChDMlBhcmFtOjpJbmRleCBpbmRleCwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBzaXplKQorICAgICAgICA6IF9tSW5kZXgoaW5kZXgpLCBfbUZpZWxkSWQob2Zmc2V0LCBzaXplKSB7fQorCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgX0MyUGFyYW1JbnNwZWN0b3I7CisKKyAgICBDMlBhcmFtOjpJbmRleCBfbUluZGV4OyAvLy88IHBhcmFtZXRlciBpbmRleAorICAgIF9DMkZpZWxkSWQgX21GaWVsZElkOyAgIC8vLzwgZmllbGQgaWRlbnRpZmllcgorfTsKKworLyoqCisgKiBBIHNoYXJlZCAodW5pb24pIHJlcHJlc2VudGF0aW9uIG9mIG51bWVyaWMgdmFsdWVzCisgKi8KK2NsYXNzIEMyVmFsdWUgeworcHVibGljOgorICAgIC8vLyBBIHVuaW9uIG9mIHN1cHBvcnRlZCBwcmltaXRpdmUgdHlwZXMuCisgICAgdW5pb24gUHJpbWl0aXZlIHsKKyAgICAgICAgLy8gZmlyc3QgbWVtYmVyIGlzIGFsd2F5cyB6ZXJvIGluaXRpYWxpemVkIHNvIGl0IG11c3QgYmUgdGhlIGxhcmdlc3QKKyAgICAgICAgdWludDY0X3QgICAgdTY0OyAgIC8vLzwgdWludDY0X3QgdmFsdWUKKyAgICAgICAgaW50NjRfdCAgICAgaTY0OyAgIC8vLzwgaW50NjRfdCB2YWx1ZQorICAgICAgICBjMl9jbnRyNjRfdCBjNjQ7ICAgLy8vPCBjMl9jbnRyNjRfdCB2YWx1ZQorICAgICAgICB1aW50MzJfdCAgICB1MzI7ICAgLy8vPCB1aW50MzJfdCB2YWx1ZQorICAgICAgICBpbnQzMl90ICAgICBpMzI7ICAgLy8vPCBpbnQzMl90IHZhbHVlCisgICAgICAgIGMyX2NudHIzMl90IGMzMjsgICAvLy88IGMyX2NudHIzMl90IHZhbHVlCisgICAgICAgIGZsb2F0ICAgICAgIGZwOyAgICAvLy88IGZsb2F0IHZhbHVlCisKKyAgICAgICAgLy8gY29uc3RydWN0b3JzIC0gaW1wbGljaXQKKyAgICAgICAgUHJpbWl0aXZlKHVpbnQ2NF90IHZhbHVlKSAgICA6IHU2NCh2YWx1ZSkgeyB9CisgICAgICAgIFByaW1pdGl2ZShpbnQ2NF90IHZhbHVlKSAgICAgOiBpNjQodmFsdWUpIHsgfQorICAgICAgICBQcmltaXRpdmUoYzJfY250cjY0X3QgdmFsdWUpIDogYzY0KHZhbHVlKSB7IH0KKyAgICAgICAgUHJpbWl0aXZlKHVpbnQzMl90IHZhbHVlKSAgICA6IHUzMih2YWx1ZSkgeyB9CisgICAgICAgIFByaW1pdGl2ZShpbnQzMl90IHZhbHVlKSAgICAgOiBpMzIodmFsdWUpIHsgfQorICAgICAgICBQcmltaXRpdmUoYzJfY250cjMyX3QgdmFsdWUpIDogYzMyKHZhbHVlKSB7IH0KKyAgICAgICAgUHJpbWl0aXZlKHVpbnQ4X3QgdmFsdWUpICAgICA6IHUzMih2YWx1ZSkgeyB9CisgICAgICAgIFByaW1pdGl2ZShjaGFyIHZhbHVlKSAgICAgICAgOiBpMzIodmFsdWUpIHsgfQorICAgICAgICBQcmltaXRpdmUoZmxvYXQgdmFsdWUpICAgICAgIDogZnAodmFsdWUpICB7IH0KKworICAgICAgICAvLyBhbGxvdyBjb25zdHJ1Y3Rpb24gZnJvbSBlbnVtIHR5cGUKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgRSwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2VudW08RT46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgUHJpbWl0aXZlKEUgdmFsdWUpCisgICAgICAgICAgICA6IFByaW1pdGl2ZShzdGF0aWNfY2FzdDx0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxFPjo6dHlwZT4odmFsdWUpKSB7IH0KKworICAgICAgICBQcmltaXRpdmUoKSA6IHU2NCgwKSB7IH0KKworICAgICAgICAvKiogZ2V0cyB2YWx1ZSBvdXQgb2YgdGhlIHVuaW9uICovCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNvbnN0IFQgJnJlZigpIGNvbnN0OworCisgICAgICAgIC8vIHZlcmlmeSB0aGF0IHdlIGNhbiBhc3N1bWUgc3RhbmRhcmQgYWxpYXNpbmcKKyAgICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YodTY0KSA9PSBzaXplb2YoaTY0KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZih1NjQpID09IHNpemVvZihjNjQpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKHUzMikgPT0gc2l6ZW9mKGkzMiksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YodTMyKSA9PSBzaXplb2YoYzMyKSwgIiIpOworICAgIH07CisgICAgLy8gdmVyaWZ5IHRoYXQgd2UgY2FuIGFzc3VtZSBzdGFuZGFyZCBhbGlhc2luZworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoUHJpbWl0aXZlLCB1NjQpID09IG9mZnNldG9mKFByaW1pdGl2ZSwgaTY0KSwgIiIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoUHJpbWl0aXZlLCB1NjQpID09IG9mZnNldG9mKFByaW1pdGl2ZSwgYzY0KSwgIiIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoUHJpbWl0aXZlLCB1MzIpID09IG9mZnNldG9mKFByaW1pdGl2ZSwgaTMyKSwgIiIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoUHJpbWl0aXZlLCB1MzIpID09IG9mZnNldG9mKFByaW1pdGl2ZSwgYzMyKSwgIiIpOworCisgICAgZW51bSB0eXBlX3QgOiB1aW50MzJfdCB7CisgICAgICAgIE5PX0lOSVQsCisgICAgICAgIElOVDMyLAorICAgICAgICBVSU5UMzIsCisgICAgICAgIENOVFIzMiwKKyAgICAgICAgSU5UNjQsCisgICAgICAgIFVJTlQ2NCwKKyAgICAgICAgQ05UUjY0LAorICAgICAgICBGTE9BVCwKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgYm9vbCA9IHN0ZDo6aXNfZW51bTxUPjo6dmFsdWU+CisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgdHlwZV90IFR5cGVGb3IoKSB7CisgICAgICAgIHVzaW5nIFUgPSB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxUPjo6dHlwZTsKKyAgICAgICAgcmV0dXJuIFR5cGVGb3I8VT4oKTsKKyAgICB9CisKKyAgICAvLyBkZXByZWN0YXRlZAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIGJvb2wgQiA9IHN0ZDo6aXNfZW51bTxUPjo6dmFsdWU+CisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgdHlwZV90IHR5cGVGb3IoKSB7CisgICAgICAgIHJldHVybiBUeXBlRm9yPFQsIEI+KCk7CisgICAgfQorCisgICAgLy8gY29uc3RydWN0b3JzIC0gaW1wbGljaXQKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIEMyVmFsdWUoVCB2YWx1ZSkgIDogX21UeXBlKHR5cGVGb3I8VD4oKSksIF9tVmFsdWUodmFsdWUpIHsgfQorCisgICAgQzJWYWx1ZSgpIDogX21UeXBlKE5PX0lOSVQpIHsgfQorCisgICAgaW5saW5lIHR5cGVfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gX21UeXBlOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBib29sIGdldChUICp2YWx1ZSkgY29uc3QgeworICAgICAgICBpZiAoX21UeXBlID09IHR5cGVGb3I8VD4oKSkgeworICAgICAgICAgICAgKnZhbHVlID0gX21WYWx1ZS5yZWY8VD4oKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgdmFsdWUKKyAgICB2b2lkICpnZXQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbVR5cGUgPT0gTk9fSU5JVCA/IG51bGxwdHIgOiAodm9pZCopJl9tVmFsdWU7CisgICAgfQorCisgICAgLy8vIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGNvbnRhaW5lZCB2YWx1ZQorICAgIHNpemVfdCBpbmxpbmUgc2l6ZU9mKCkgY29uc3QgeworICAgICAgICByZXR1cm4gU2l6ZUZvcihfbVR5cGUpOworICAgIH0KKworICAgIHN0YXRpYyBzaXplX3QgU2l6ZUZvcih0eXBlX3QgdHlwZSkgeworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgSU5UMzI6CisgICAgICAgICAgICBjYXNlIFVJTlQzMjoKKyAgICAgICAgICAgIGNhc2UgQ05UUjMyOiByZXR1cm4gc2l6ZW9mKF9tVmFsdWUuaTMyKTsKKyAgICAgICAgICAgIGNhc2UgSU5UNjQ6CisgICAgICAgICAgICBjYXNlIFVJTlQ2NDoKKyAgICAgICAgICAgIGNhc2UgQ05UUjY0OiByZXR1cm4gc2l6ZW9mKF9tVmFsdWUuaTY0KTsKKyAgICAgICAgICAgIGNhc2UgRkxPQVQ6IHJldHVybiBzaXplb2YoX21WYWx1ZS5mcCk7CisgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICB0eXBlX3QgX21UeXBlOworICAgIFByaW1pdGl2ZSBfbVZhbHVlOworfTsKKwordGVtcGxhdGU8PiBpbmxpbmUgY29uc3QgaW50MzJfdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8aW50MzJfdD4oKSBjb25zdCB7IHJldHVybiBpMzI7IH0KK3RlbXBsYXRlPD4gaW5saW5lIGNvbnN0IGludDY0X3QgJkMyVmFsdWU6OlByaW1pdGl2ZTo6cmVmPGludDY0X3Q+KCkgY29uc3QgeyByZXR1cm4gaTY0OyB9Cit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCB1aW50MzJfdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8dWludDMyX3Q+KCkgY29uc3QgeyByZXR1cm4gdTMyOyB9Cit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCB1aW50NjRfdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8dWludDY0X3Q+KCkgY29uc3QgeyByZXR1cm4gdTY0OyB9Cit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCBjMl9jbnRyMzJfdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8YzJfY250cjMyX3Q+KCkgY29uc3QgeyByZXR1cm4gYzMyOyB9Cit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCBjMl9jbnRyNjRfdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8YzJfY250cjY0X3Q+KCkgY29uc3QgeyByZXR1cm4gYzY0OyB9Cit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCBmbG9hdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8ZmxvYXQ+KCkgY29uc3QgeyByZXR1cm4gZnA7IH0KKworLy8gcHJvdmlkZSB0eXBlcyBmb3IgZW51bXMgYW5kIHVpbnQ4X3QsIGNoYXIgZXZlbiB0aG91Z2ggd2UgZG9uJ3QgcHJvdmlkZSByZWFkaW5nIGFzIHRoZW0KK3RlbXBsYXRlPD4gY29uc3RleHByIEMyVmFsdWU6OnR5cGVfdCBDMlZhbHVlOjpUeXBlRm9yPGNoYXIsIGZhbHNlPigpIHsgcmV0dXJuIElOVDMyOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBDMlZhbHVlOjp0eXBlX3QgQzJWYWx1ZTo6VHlwZUZvcjxpbnQzMl90LCBmYWxzZT4oKSB7IHJldHVybiBJTlQzMjsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8aW50NjRfdCwgZmFsc2U+KCkgeyByZXR1cm4gSU5UNjQ7IH0KK3RlbXBsYXRlPD4gY29uc3RleHByIEMyVmFsdWU6OnR5cGVfdCBDMlZhbHVlOjpUeXBlRm9yPHVpbnQ4X3QsIGZhbHNlPigpIHsgcmV0dXJuIFVJTlQzMjsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8dWludDMyX3QsIGZhbHNlPigpIHsgcmV0dXJuIFVJTlQzMjsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8dWludDY0X3QsIGZhbHNlPigpIHsgcmV0dXJuIFVJTlQ2NDsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8YzJfY250cjMyX3QsIGZhbHNlPigpIHsgcmV0dXJuIENOVFIzMjsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8YzJfY250cjY0X3QsIGZhbHNlPigpIHsgcmV0dXJuIENOVFI2NDsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8ZmxvYXQsIGZhbHNlPigpIHsgcmV0dXJuIEZMT0FUOyB9CisKKy8vIGZvcndhcmQgZGVjbGFyZSBlYXN5IGVudW0gdGVtcGxhdGUKK3RlbXBsYXRlPHR5cGVuYW1lIEU+IHN0cnVjdCBDMkVhc3lFbnVtOworCisvKioKKyAqIGZpZWxkIGRlc2NyaXB0b3IuIEEgZmllbGQgaXMgdW5pcXVlbHkgZGVmaW5lZCBieSBhbiBpbmRleCBpbnRvIGEgcGFyYW1ldGVyLgorICogKE5vdGU6IFN0cmVhbS1pZCBpcyBub3QgY2FwdHVyZWQgYXMgYSBmaWVsZC4pCisgKgorICogT3JkZXJpbmcgb2YgZmllbGRzIGlzIGJ5IG9mZnNldC4gSW4gY2FzZSBvZiBzdHJ1Y3R1cmVzLCBpdCBpcyBkZXB0aCBmaXJzdCwKKyAqIHdpdGggYSBzdHJ1Y3R1cmUgdGFraW5nIGFuIGluZGV4IGp1c3QgYmVmb3JlIGFuZCBpbiBhZGRpdGlvbiB0byBpdHMgbWVtYmVycy4KKyAqLworc3RydWN0IEMyRmllbGREZXNjcmlwdG9yIHsKKy8vcHVibGljOgorICAgIC8qKiBmaWVsZCB0eXBlcyBhbmQgZmxhZ3MKKyAgICAgKiBcbm90ZTogb25seSAzMi1iaXQgYW5kIDY0LWJpdCBmaWVsZHMgYXJlIHN1cHBvcnRlZCAoZS5nLiBubyBib29sZWFuLCBhcyB0aGF0CisgICAgICogaXMgcmVwcmVzZW50ZWQgdXNpbmcgSU5UMzIpLgorICAgICAqLworICAgIGVudW0gdHlwZV90IDogdWludDMyX3QgeworICAgICAgICAvLyBwcmltaXRpdmUgdHlwZXMKKyAgICAgICAgSU5UMzIgICA9IEMyVmFsdWU6OklOVDMyLCAgLy8vPCAzMi1iaXQgc2lnbmVkIGludGVnZXIKKyAgICAgICAgVUlOVDMyICA9IEMyVmFsdWU6OlVJTlQzMiwgLy8vPCAzMi1iaXQgdW5zaWduZWQgaW50ZWdlcgorICAgICAgICBDTlRSMzIgID0gQzJWYWx1ZTo6Q05UUjMyLCAvLy88IDMyLWJpdCBjb3VudGVyCisgICAgICAgIElOVDY0ICAgPSBDMlZhbHVlOjpJTlQ2NCwgIC8vLzwgNjQtYml0IHNpZ25lZCBpbnRlZ2VyCisgICAgICAgIFVJTlQ2NCAgPSBDMlZhbHVlOjpVSU5UNjQsIC8vLzwgNjQtYml0IHNpZ25lZCBpbnRlZ2VyCisgICAgICAgIENOVFI2NCAgPSBDMlZhbHVlOjpDTlRSNjQsIC8vLzwgNjQtYml0IGNvdW50ZXIKKyAgICAgICAgRkxPQVQgICA9IEMyVmFsdWU6OkZMT0FULCAgLy8vPCAzMi1iaXQgZmxvYXRpbmcgcG9pbnQKKworICAgICAgICAvLyBhcnJheSB0eXBlcworICAgICAgICBTVFJJTkcgPSAweDEwMCwgLy8vPCBmaXhlZC1zaXplIHN0cmluZyAoUE9EKQorICAgICAgICBCTE9CLCAgICAgICAgICAgLy8vPCBibG9iLiBCbG9icyBoYXZlIG5vIHN1Yi1lbGVtZW50cyBhbmQgY2FuIGJlIHRob3VnaHQgb2YgYXMgYnl0ZSBhcnJheXM7CisgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGhvd2V2ZXIsIGJ5dGVzIGNhbm5vdCBiZSBpbmRpdmlkdWFsbHkgYWRkcmVzc2VkIGJ5IGNsaWVudHMuCisKKyAgICAgICAgLy8gY29tcGxleCB0eXBlcworICAgICAgICBTVFJVQ1RfRkxBRyA9IDB4MjAwMDAsIC8vLzwgc3RydWN0cy4gTWFya2VkIHdpdGggdGhpcyBmbGFnIGluIGFkZGl0aW9uIHRvIHRoZWlyIGNvcmVJbmRleC4KKyAgICB9OworCisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8QzJTdHJpbmcsIEMyVmFsdWU6OlByaW1pdGl2ZT4gTmFtZWRWYWx1ZVR5cGU7CisgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxOYW1lZFZhbHVlVHlwZT4gTmFtZWRWYWx1ZXNUeXBlOworICAgIC8vdHlwZWRlZiBzdGQ6OnBhaXI8c3RkOjp2ZWN0b3I8QzJTdHJpbmc+LCBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+PiBOYW1lZFZhbHVlc1R5cGU7CisKKyAgICAvKioKKyAgICAgKiBUZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB0aGF0IHJldHVybnMgdGhlIG5hbWVkIHZhbHVlcyBmb3IgYSB0eXBlLgorICAgICAqCisgICAgICogXHRvZG8gaGlkZSBmcm9tIGNsaWVudC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSB2ZWN0b3Igb2YgbmFtZS12YWx1ZSBwYWlycy4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCPgorICAgIHN0YXRpYyBOYW1lZFZhbHVlc1R5cGUgbmFtZWRWYWx1ZXNGb3IoY29uc3QgQiAmKTsKKworICAgIC8qKiBzcGVjaWFsaXphdGlvbiBmb3IgZWFzeSBlbnVtcyAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEU+CisgICAgaW5saW5lIHN0YXRpYyBOYW1lZFZhbHVlc1R5cGUgbmFtZWRWYWx1ZXNGb3IoY29uc3QgQzJFYXN5RW51bTxFPiAmKSB7CisgICAgICAgIHJldHVybiBuYW1lZFZhbHVlc0ZvcigqKEUqKW51bGxwdHIpOworICAgIH0KKworcHJpdmF0ZToKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCLCBib29sIGVuYWJsZWQ9c3RkOjppc19hcml0aG1ldGljPEI+Ojp2YWx1ZSB8fCBzdGQ6OmlzX2VudW08Qj46OnZhbHVlPgorICAgIHN0cnVjdCBDMl9ISURFIF9OYW1lZFZhbHVlc0dldHRlcjsKKworcHVibGljOgorICAgIGlubGluZSBDMkZpZWxkRGVzY3JpcHRvcih1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBleHRlbnQsIEMyU3RyaW5nIG5hbWUsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQorICAgICAgICA6IF9tVHlwZSgodHlwZV90KXR5cGUpLCBfbUV4dGVudChleHRlbnQpLCBfbU5hbWUobmFtZSksIF9tRmllbGRJZChvZmZzZXQsIHNpemUpIHsgfQorCisgICAgaW5saW5lIEMyRmllbGREZXNjcmlwdG9yKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICYpID0gZGVmYXVsdDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIGNsYXNzIEI9dHlwZW5hbWUgc3RkOjpyZW1vdmVfZXh0ZW50PFQ+Ojp0eXBlPgorICAgIGlubGluZSBDMkZpZWxkRGVzY3JpcHRvcihjb25zdCBUKiBvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUpCisgICAgICAgIDogX21UeXBlKHRoaXMtPkdldFR5cGUoKEIqKW51bGxwdHIpKSwKKyAgICAgICAgICBfbUV4dGVudChzdGQ6OmlzX2FycmF5PFQ+Ojp2YWx1ZSA/IHN0ZDo6ZXh0ZW50PFQ+Ojp2YWx1ZSA6IDEpLAorICAgICAgICAgIF9tTmFtZShuYW1lKSwKKyAgICAgICAgICBfbU5hbWVkVmFsdWVzKF9OYW1lZFZhbHVlc0dldHRlcjxCPjo6Z2V0TmFtZWRWYWx1ZXMoKSksCisgICAgICAgICAgX21GaWVsZElkKG9mZnNldCkge30KKworLyoKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBCPXR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDxUPjo6dHlwZT4KKyAgICBpbmxpbmUgQzJGaWVsZERlc2NyaXB0b3I8VCwgQiwgZmFsc2U+KFQqIG9mZnNldCwgY29uc3QgY2hhciAqbmFtZSkKKyAgICAgICAgOiBfbVR5cGUodGhpcy0+R2V0VHlwZSgoQiopbnVsbHB0cikpLAorICAgICAgICAgIF9tRXh0ZW50KHN0ZDo6aXNfYXJyYXk8VD46OnZhbHVlID8gc3RkOjpleHRlbnQ8VD46OnZhbHVlIDogMSksCisgICAgICAgICAgX21OYW1lKG5hbWUpLAorICAgICAgICAgIF9tRmllbGRJZChvZmZzZXQpIHt9CisqLworCisgICAgLy8vIFxkZXByZWNhdGVkCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgY2xhc3MgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8VD46OnR5cGU+CisgICAgaW5saW5lIEMyRmllbGREZXNjcmlwdG9yKFMqLCBUIFM6OiogZmllbGQsIGNvbnN0IGNoYXIgKm5hbWUpCisgICAgICAgIDogX21UeXBlKHRoaXMtPkdldFR5cGUoKEIqKW51bGxwdHIpKSwKKyAgICAgICAgICBfbUV4dGVudChzdGQ6OmlzX2FycmF5PFQ+Ojp2YWx1ZSA/IHN0ZDo6ZXh0ZW50PFQ+Ojp2YWx1ZSA6IDEpLAorICAgICAgICAgIF9tTmFtZShuYW1lKSwKKyAgICAgICAgICBfbUZpZWxkSWQoJigoKFMqKTApLT4qZmllbGQpKSB7fQorCisgICAgLy8vIHJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyBmaWVsZAorICAgIGlubGluZSB0eXBlX3QgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIF9tVHlwZTsgfQorICAgIC8vLyByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGZpZWxkIGluIGNhc2UgaXQgaXMgYW4gYXJyYXkuIFJldHVybnMgMCBmb3IKKyAgICAvLy8gVFtdIGFycmF5cywgcmV0dXJucyAxIGZvciBUWzFdIGFycmF5cyBhcyB3ZWxsIGFzIGlmIHRoZSBmaWVsZCBpcyBub3QgYW4gYXJyYXkuCisgICAgaW5saW5lIHNpemVfdCBleHRlbnQoKSBjb25zdCB7IHJldHVybiBfbUV4dGVudDsgfQorICAgIC8vLyByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBmaWVsZAorICAgIGlubGluZSBDMlN0cmluZyBuYW1lKCkgY29uc3QgeyByZXR1cm4gX21OYW1lOyB9CisKKyAgICBjb25zdCBOYW1lZFZhbHVlc1R5cGUgJm5hbWVkVmFsdWVzKCkgY29uc3QgeyByZXR1cm4gX21OYW1lZFZhbHVlczsgfQorCisjaWYgZGVmaW5lZChGUklFTkRfVEVTVCkKKyAgICBmcmllbmQgdm9pZCBQcmludFRvKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICYsIDo6c3RkOjpvc3RyZWFtKik7CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmLCBjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmKTsKKyAgICBGUklFTkRfVEVTVChDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgVmVyaWZ5U3RydWN0KTsKKyNlbmRpZgorCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbiBvZmZzZXRlZCBmaWVsZCBkZXNjcmlwdG9yLgorICAgICAqLworICAgIGlubGluZSBDMkZpZWxkRGVzY3JpcHRvcihjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZGVzYywgc2l6ZV90IG9mZnNldCkKKyAgICAgICAgOiBfbVR5cGUoZGVzYy5fbVR5cGUpLCBfbUV4dGVudChkZXNjLl9tRXh0ZW50KSwKKyAgICAgICAgICBfbU5hbWUoZGVzYy5fbU5hbWUpLCBfbU5hbWVkVmFsdWVzKGRlc2MuX21OYW1lZFZhbHVlcyksCisgICAgICAgICAgX21GaWVsZElkKGRlc2MuX21GaWVsZElkLl9tT2Zmc2V0ICsgb2Zmc2V0LCBkZXNjLl9tRmllbGRJZC5fbVNpemUpIHsgfQorCisgICAgdHlwZV90IF9tVHlwZTsKKyAgICB1aW50MzJfdCBfbUV4dGVudDsgLy8gdGhlIGxhc3QgbWVtYmVyIGNhbiBiZSBhcmJpdHJhcnkgbGVuZ3RoIGlmIGl0IGlzIFRbXSBhcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gZXh0ZW5kaW5nIHRvIHRoZSBlbmQgb2YgdGhlIHBhcmFtZXRlciAodGhpcyBpcyBtYXJrZWQgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAvLyAwKS4gVFswXS1zIGFyZSBub3QgZmllbGRzLgorICAgIEMyU3RyaW5nIF9tTmFtZTsKKyAgICBOYW1lZFZhbHVlc1R5cGUgX21OYW1lZFZhbHVlczsKKworICAgIF9DMkZpZWxkSWQgX21GaWVsZElkOyAgIC8vIGZpZWxkIGlkZW50aWZpZXIgKG9mZnNldCBhbmQgc2l6ZSkKKworICAgIC8vIE5PVEU6IFdlIGRvIG5vdCBjYXB0dXJlIGRlZmF1bHQgdmFsdWUocykgaGVyZSBhcyB0aGF0IG1heSBkZXBlbmQgb24gdGhlIGNvbXBvbmVudC4KKyAgICAvLyBOT1RFOiBXZSBhbHNvIGRvIG5vdCBjYXB0dXJlIGJlc3RFZmZvcnQsIGFzIDEpIHRoaXMgc2hvdWxkIGJlIHRydWUgZm9yIG1vc3QgZmllbGRzLAorICAgIC8vIDIpIHRoaXMgaXMgYXQgcGFyYW1ldGVyIGdyYW51bGFyaXR5LgorCisgICAgLy8gdHlwZSByZXNvbHV0aW9uCisgICAgaW5saW5lIHN0YXRpYyB0eXBlX3QgR2V0VHlwZShpbnQzMl90KikgICAgIHsgcmV0dXJuIElOVDMyOyB9CisgICAgaW5saW5lIHN0YXRpYyB0eXBlX3QgR2V0VHlwZSh1aW50MzJfdCopICAgIHsgcmV0dXJuIFVJTlQzMjsgfQorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUoYzJfY250cjMyX3QqKSB7IHJldHVybiBDTlRSMzI7IH0KKyAgICBpbmxpbmUgc3RhdGljIHR5cGVfdCBHZXRUeXBlKGludDY0X3QqKSAgICAgeyByZXR1cm4gSU5UNjQ7IH0KKyAgICBpbmxpbmUgc3RhdGljIHR5cGVfdCBHZXRUeXBlKHVpbnQ2NF90KikgICAgeyByZXR1cm4gVUlOVDY0OyB9CisgICAgaW5saW5lIHN0YXRpYyB0eXBlX3QgR2V0VHlwZShjMl9jbnRyNjRfdCopIHsgcmV0dXJuIENOVFI2NDsgfQorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUoZmxvYXQqKSAgICAgICB7IHJldHVybiBGTE9BVDsgfQorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUoY2hhciopICAgICAgICB7IHJldHVybiBTVFJJTkc7IH0KKyAgICBpbmxpbmUgc3RhdGljIHR5cGVfdCBHZXRUeXBlKHVpbnQ4X3QqKSAgICAgeyByZXR1cm4gQkxPQjsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwKKyAgICAgICAgICAgICBjbGFzcz10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2VudW08VD46OnZhbHVlPjo6dHlwZT4KKyAgICBpbmxpbmUgc3RhdGljIHR5cGVfdCBHZXRUeXBlKFQqKSB7CisgICAgICAgIHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPFQ+Ojp0eXBlIHVuZGVybHlpbmcoMCk7CisgICAgICAgIHJldHVybiBHZXRUeXBlKCZ1bmRlcmx5aW5nKTsKKyAgICB9CisKKyAgICAvLyB2ZXJpZnkgQzJTdHJ1Y3QgYnkgaGF2aW5nIGEgRmllbGRMaXN0KCkgYW5kIGEgQ09SRV9JTkRFWC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULAorICAgICAgICAgICAgIGNsYXNzPWRlY2x0eXBlKFQ6OkNPUkVfSU5ERVggKyAxKSwgY2xhc3M9ZGVjbHR5cGUoVDo6RmllbGRMaXN0KCkpPgorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUoVCopIHsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghc3RkOjppc19iYXNlX29mPEMyUGFyYW0sIFQ+Ojp2YWx1ZSwgImNhbm5vdCB1c2UgQzJQYXJhbXMgYXMgZmllbGRzIik7CisgICAgICAgIHJldHVybiAodHlwZV90KShUOjpDT1JFX0lOREVYIHwgU1RSVUNUX0ZMQUcpOworICAgIH0KKworICAgIGZyaWVuZCBzdHJ1Y3QgX0MyUGFyYW1JbnNwZWN0b3I7Cit9OworCisvLyBubyBuYW1lZCB2YWx1ZXMgZm9yIGNvbXBvdW5kIHR5cGVzCit0ZW1wbGF0ZTx0eXBlbmFtZSBCPgorc3RydWN0IEMyRmllbGREZXNjcmlwdG9yOjpfTmFtZWRWYWx1ZXNHZXR0ZXI8QiwgZmFsc2U+IHsKKyAgICBpbmxpbmUgc3RhdGljIEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgZ2V0TmFtZWRWYWx1ZXMoKSB7CisgICAgICAgIHJldHVybiBOYW1lZFZhbHVlc1R5cGUoKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBCPgorc3RydWN0IEMyRmllbGREZXNjcmlwdG9yOjpfTmFtZWRWYWx1ZXNHZXR0ZXI8QiwgdHJ1ZT4geworICAgIGlubGluZSBzdGF0aWMgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBnZXROYW1lZFZhbHVlcygpIHsKKyAgICAgICAgcmV0dXJuIEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZFZhbHVlc0ZvcigqKEIqKW51bGxwdHIpOworICAgIH0KK307CisKKyNkZWZpbmUgREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IodHlwZSkgXAordGVtcGxhdGU8PiBpbmxpbmUgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBDMkZpZWxkRGVzY3JpcHRvcjo6bmFtZWRWYWx1ZXNGb3IoY29uc3QgdHlwZSAmKSB7IFwKKyAgICByZXR1cm4gTmFtZWRWYWx1ZXNUeXBlKCk7IFwKK30KKworLy8gV2UgY2Fubm90IHN1YnR5cGUgY29uc3RydWN0b3IgZm9yIGVudW1lcmF0ZWQgdHlwZXMgc28gaW5zdGVkIGRlZmluZSBubyBuYW1lZCB2YWx1ZXMgZm9yCisvLyBub24tZW51bWVyYXRlZCBpbnRlZ3JhbCB0eXBlcy4KK0RFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKGludDMyX3QpCitERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUih1aW50MzJfdCkKK0RFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKGMyX2NudHIzMl90KQorREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IoaW50NjRfdCkKK0RFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKHVpbnQ2NF90KQorREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IoYzJfY250cjY0X3QpCitERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUih1aW50OF90KQorREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IoY2hhcikKK0RFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKGZsb2F0KQorCisvKioKKyAqIERlc2NyaWJlcyB0aGUgZmllbGRzIG9mIGEgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgQzJTdHJ1Y3REZXNjcmlwdG9yIHsKK3B1YmxpYzoKKyAgICAvLy8gUmV0dXJucyB0aGUgY29yZSBpbmRleCBvZiB0aGUgc3RydWN0CisgICAgaW5saW5lIEMyUGFyYW06OkNvcmVJbmRleCBjb3JlSW5kZXgoKSBjb25zdCB7IHJldHVybiBfbVR5cGUuY29yZUluZGV4KCk7IH0KKworICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBmaWVsZHMgaW4gdGhpcyBzdHJ1Y3QgKG5vdCBjb3VudGluZyBhbnkgcmVjdXJzaXZlIGZpZWxkcykuCisgICAgLy8gTXVzdCBiZSBhdCBsZWFzdCAxIGZvciB2YWxpZCBzdHJ1Y3RzLgorICAgIGlubGluZSBzaXplX3QgbnVtRmllbGRzKCkgY29uc3QgeyByZXR1cm4gX21GaWVsZHMuc2l6ZSgpOyB9CisKKyAgICAvLyBSZXR1cm5zIHRoZSBsaXN0IG9mIGRpcmVjdCBmaWVsZHMgKG5vdCBjb3VudGluZyBhbnkgcmVjdXJzaXZlIGZpZWxkcykuCisgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj46OmNvbnN0X2l0ZXJhdG9yIGZpZWxkX2l0ZXJhdG9yOworICAgIGlubGluZSBmaWVsZF9pdGVyYXRvciBjYmVnaW4oKSBjb25zdCB7IHJldHVybiBfbUZpZWxkcy5jYmVnaW4oKTsgfQorICAgIGlubGluZSBmaWVsZF9pdGVyYXRvciBjZW5kKCkgY29uc3QgeyByZXR1cm4gX21GaWVsZHMuY2VuZCgpOyB9CisKKyAgICAvLyBvbmx5IHN1cHBseWluZyBjb25zdCBpdGVyYXRvciAtIGJ1dCB0aGVzZSBuYW1lcyBhcmUgbmVlZGVkIGZvciByYW5nZSBiYXNlZCBsb29wcworICAgIGlubGluZSBmaWVsZF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9tRmllbGRzLmNiZWdpbigpOyB9CisgICAgaW5saW5lIGZpZWxkX2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIF9tRmllbGRzLmNlbmQoKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgQzJTdHJ1Y3REZXNjcmlwdG9yKFQqKQorICAgICAgICA6IEMyU3RydWN0RGVzY3JpcHRvcihUOjpDT1JFX0lOREVYLCBUOjpGaWVsZExpc3QoKSkgeyB9CisKKyAgICBpbmxpbmUgQzJTdHJ1Y3REZXNjcmlwdG9yKAorICAgICAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IHR5cGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gJmZpZWxkcykKKyAgICAgICAgOiBfbVR5cGUodHlwZSksIF9tRmllbGRzKGZpZWxkcykgeyB9CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsKKworICAgIGlubGluZSBDMlN0cnVjdERlc2NyaXB0b3IoCisgICAgICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggdHlwZSwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiAmJmZpZWxkcykKKyAgICAgICAgOiBfbVR5cGUodHlwZSksIF9tRmllbGRzKHN0ZDo6bW92ZShmaWVsZHMpKSB7IH0KKworICAgIGNvbnN0IEMyUGFyYW06OkNvcmVJbmRleCBfbVR5cGU7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IF9tRmllbGRzOworfTsKKworLyoqCisgKiBEZXNjcmliZXMgcGFyYW1ldGVycyBmb3IgYSBjb21wb25lbnQuCisgKi8KK3N0cnVjdCBDMlBhcmFtRGVzY3JpcHRvciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHNldHRpbmcgdGhpcyBwYXJhbSBpcyByZXF1aXJlZCB0byBjb25maWd1cmUgdGhpcyBjb21wb25lbnQuCisgICAgICogVGhpcyBjYW4gb25seSBiZSB0cnVlIGZvciBidWlsdGluIHBhcmFtcyBmb3IgcGxhdGZvcm0tZGVmaW5lZCBjb21wb25lbnRzIChlLmcuIHZpZGVvIGFuZAorICAgICAqIGF1ZGlvIGVuY29kZXJzL2RlY29kZXJzLCB2aWRlby9hdWRpbyBmaWx0ZXJzKS4KKyAgICAgKiBGb3IgdmVuZG9yLWRlZmluZWQgY29tcG9uZW50cywgaXQgY2FuIGJlIHRydWUgZXZlbiBmb3IgdmVuZG9yLWRlZmluZWQgcGFyYW1zLAorICAgICAqIGJ1dCBpdCBpcyBub3QgcmVjb21tZW5kZWQsIGluIGNhc2UgdGhlIGNvbXBvbmVudCBiZWNvbWVzIHBsYXRmb3JtLWRlZmluZWQuCisgICAgICovCisgICAgaW5saW5lIGJvb2wgaXNSZXF1aXJlZCgpIGNvbnN0IHsgcmV0dXJuIF9tQXR0cmliICYgSVNfUkVRVUlSRUQ7IH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHBhcmFtZXRlciBpcyBwZXJzaXN0ZW50LiBUaGlzIGlzIGFsd2F5cyB0cnVlIGZvciBDMlR1bmluZyBhbmQgQzJTZXR0aW5nLAorICAgICAqIGJ1dCBtYXkgYmUgZmFsc2UgZm9yIEMySW5mby4gSWYgdHJ1ZSwgdGhpcyBwYXJhbWV0ZXIgcGVyc2lzdHMgYWNyb3NzIGZyYW1lcyBhbmQgYXBwbGllcyB0bworICAgICAqIHRoZSBjdXJyZW50IGFuZCBzdWJzZXF1ZW50IGZyYW1lcy4gSWYgZmFsc2UsIHRoaXMgQzJJbmZvIHBhcmFtZXRlciBvbmx5IGFwcGxpZXMgdG8gdGhlCisgICAgICogY3VycmVudCBmcmFtZSBhbmQgaXMgbm90IGFzc3VtZWQgdG8gaGF2ZSB0aGUgc2FtZSB2YWx1ZSAob3IgZXZlbiBiZSBwcmVzZW50KSBvbiBzdWJzZXF1ZW50CisgICAgICogZnJhbWVzLCB1bmxlc3MgaXQgaXMgc3BlY2lmaWVkIGZvciB0aG9zZSBmcmFtZXMuCisgICAgICovCisgICAgaW5saW5lIGJvb2wgaXNQZXJzaXN0ZW50KCkgY29uc3QgeyByZXR1cm4gX21BdHRyaWIgJiBJU19QRVJTSVNURU5UOyB9CisKKyAgICBpbmxpbmUgYm9vbCBpc1N0cmljdCgpIGNvbnN0IHsgcmV0dXJuIF9tQXR0cmliICYgSVNfU1RSSUNUOyB9CisKKyAgICBpbmxpbmUgYm9vbCBpc1JlYWRPbmx5KCkgY29uc3QgeyByZXR1cm4gX21BdHRyaWIgJiBJU19SRUFEX09OTFk7IH0KKworICAgIGlubGluZSBib29sIGlzVmlzaWJsZSgpIGNvbnN0IHsgcmV0dXJuICEoX21BdHRyaWIgJiBJU19ISURERU4pOyB9CisKKyAgICBpbmxpbmUgYm9vbCBpc1B1YmxpYygpIGNvbnN0IHsgcmV0dXJuICEoX21BdHRyaWIgJiBJU19JTlRFUk5BTCk7IH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgcGFyYW0uCisgICAgLy8vIFRoaXMgZGVmYXVsdHMgdG8gdGhlIHVuZGVybHlpbmcgQzJTdHJ1Y3QncyBuYW1lLCBidXQgY291bGQgYmUgYWx0ZXJlZCBmb3IgYSBjb21wb25lbnQuCisgICAgaW5saW5lIEMyU3RyaW5nIG5hbWUoKSBjb25zdCB7IHJldHVybiBfbU5hbWU7IH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgaW5kZXgKKyAgICBpbmxpbmUgQzJQYXJhbTo6SW5kZXggaW5kZXgoKSBjb25zdCB7IHJldHVybiBfbUluZGV4OyB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgaW5kaWNlcyBvZiBwYXJhbWV0ZXJzIHRoYXQgdGhpcyBwYXJhbWV0ZXIgaGFzIGEgZGVwZW5kZW5jeSBvbgorICAgIGlubGluZSBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmRlcGVuZGVuY2llcygpIGNvbnN0IHsgcmV0dXJuIF9tRGVwZW5kZW5jaWVzOyB9CisKKyAgICAvLy8gXGRlcHJlY2F0ZWQKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBDMlBhcmFtRGVzY3JpcHRvcihib29sIGlzUmVxdWlyZWQsIEMyU3RyaW5nTGl0ZXJhbCBuYW1lLCBjb25zdCBUKikKKyAgICAgICAgOiBfbUluZGV4KFQ6OlBBUkFNX1RZUEUpLAorICAgICAgICAgIF9tQXR0cmliKElTX1BFUlNJU1RFTlQgfCAoaXNSZXF1aXJlZCA/IElTX1JFUVVJUkVEIDogMCkpLAorICAgICAgICAgIF9tTmFtZShuYW1lKSB7IH0KKworICAgIC8vLyBcZGVwcmVjYXRlZAorICAgIGlubGluZSBDMlBhcmFtRGVzY3JpcHRvcigKKyAgICAgICAgICAgIGJvb2wgaXNSZXF1aXJlZCwgQzJTdHJpbmdMaXRlcmFsIG5hbWUsIEMyUGFyYW06OkluZGV4IGluZGV4KQorICAgICAgICA6IF9tSW5kZXgoaW5kZXgpLAorICAgICAgICAgIF9tQXR0cmliKElTX1BFUlNJU1RFTlQgfCAoaXNSZXF1aXJlZCA/IElTX1JFUVVJUkVEIDogMCkpLAorICAgICAgICAgIF9tTmFtZShuYW1lKSB7IH0KKworICAgIGVudW0gYXR0cmliX3QgOiB1aW50MzJfdCB7CisgICAgICAgIC8vIGZsYWdzIHRoYXQgZGVmYXVsdCBvbgorICAgICAgICBJU19SRVFVSVJFRCAgID0gMXUgPDwgMCwgLy8vPCBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQgdG8gYmUgc3BlY2lmaWVkCisgICAgICAgIElTX1BFUlNJU1RFTlQgPSAxdSA8PCAxLCAvLy88IHBhcmFtZXRlciByZXRhaW5zIGl0cyB2YWx1ZQorICAgICAgICAvLyBmbGFncyB0aGF0IGRlZmF1bHQgb2ZmCisgICAgICAgIElTX1NUUklDVCAgICAgPSAxdSA8PCAyLCAvLy88IHBhcmFtZXRlciBpcyBzdHJpY3QKKyAgICAgICAgSVNfUkVBRF9PTkxZICA9IDF1IDw8IDMsIC8vLzwgcGFyYW1ldGVyIGlzIHB1YmxpY2x5IHJlYWQtb25seQorICAgICAgICBJU19ISURERU4gICAgID0gMXUgPDwgNCwgLy8vPCBwYXJhbWV0ZXIgc2hhbGwgbm90IGJlIHZpc2libGUgdG8gY2xpZW50cworICAgICAgICBJU19JTlRFUk5BTCAgID0gMXUgPDwgNSwgLy8vPCBwYXJhbWV0ZXIgc2hhbGwgbm90IGJlIHVzZWQgYnkgZnJhbWV3b3JrIChvdGhlciB0aGFuIHRlc3RpbmcpCisgICAgICAgIElTX0NPTlNUICAgICAgPSAxdSA8PCA2IHwgSVNfUkVBRF9PTkxZLCAvLy88IHBhcmFtZXRlciBpcyBwdWJsaWNseSBjb25zdCAoaGVuY2UgcmVhZC1vbmx5KQorICAgIH07CisKKyAgICBpbmxpbmUgQzJQYXJhbURlc2NyaXB0b3IoCisgICAgICAgIEMyUGFyYW06OkluZGV4IGluZGV4LCBhdHRyaWJfdCBhdHRyaWIsIEMyU3RyaW5nTGl0ZXJhbCBuYW1lKQorICAgICAgICA6IF9tSW5kZXgoaW5kZXgpLAorICAgICAgICAgIF9tQXR0cmliKGF0dHJpYiksCisgICAgICAgICAgX21OYW1lKG5hbWUpIHsgfQorCisgICAgaW5saW5lIEMyUGFyYW1EZXNjcmlwdG9yKAorICAgICAgICBDMlBhcmFtOjpJbmRleCBpbmRleCwgYXR0cmliX3QgYXR0cmliLCBDMlN0cmluZyAmJm5hbWUsCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmJmRlcGVuZGVuY2llcykKKyAgICAgICAgOiBfbUluZGV4KGluZGV4KSwKKyAgICAgICAgICBfbUF0dHJpYihhdHRyaWIpLAorICAgICAgICAgIF9tTmFtZShuYW1lKSwKKyAgICAgICAgICBfbURlcGVuZGVuY2llcyhzdGQ6Om1vdmUoZGVwZW5kZW5jaWVzKSkgeyB9CisKK3ByaXZhdGU6CisgICAgY29uc3QgQzJQYXJhbTo6SW5kZXggX21JbmRleDsKKyAgICBjb25zdCB1aW50MzJfdCBfbUF0dHJpYjsKKyAgICBjb25zdCBDMlN0cmluZyBfbU5hbWU7CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IF9tRGVwZW5kZW5jaWVzOworCisgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsKK307CisKK0RFRklORV9FTlVNX09QRVJBVE9SUyg6OkMyUGFyYW1EZXNjcmlwdG9yOjphdHRyaWJfdCkKKworCisvLy8gXGluZ3JvdXAgaW50ZXJuYWwKKy8vLyBEZWZpbmUgYSBzdHJ1Y3R1cmUgd2l0aG91dCBDT1JFX0lOREVYLgorLy8vIFxub3RlIF9GSUVMRF9MSVNUIGlzIHVzZWQgb25seSBkdXJpbmcgZGVjbGFyYXRpb24gc28gdGhhdCBDMlN0cnVjdCBkZWNsYXJhdGlvbnMgY2FuIGVuZCB3aXRoCisvLy8gYSBzaW1wbGUgbGlzdCBvZiBDMkZJRUxELXMgYW5kIGNsb3NpbmcgYnJhY2tldC4gTWFyayBpdCB1bnVzZWQgYXMgaXQgaXMgbm90IHVzZWQgaW4gdGVtcGxhdGVkCisvLy8gc3RydWN0cy4KKyNkZWZpbmUgREVGSU5FX0JBU0VfQzJTVFJVQ1QobmFtZSkgXAorcHJpdmF0ZTogXAorICAgIGNvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gX0ZJRUxEX0xJU1QgX191bnVzZWQ7IC8qKjwgc3RydWN0dXJlIGZpZWxkcyAqLyBcCitwdWJsaWM6IFwKKyAgICB0eXBlZGVmIEMyIyNuYW1lIyNTdHJ1Y3QgX3R5cGU7IC8qKjwgdHlwZSBuYW1lIHNob3J0aGFuZCAqLyBcCisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBGaWVsZExpc3QoKTsgLyoqPCBzdHJ1Y3R1cmUgZmllbGRzIGZhY3RvcnkgKi8KKworLy8vIERlZmluZSBhIHN0cnVjdHVyZSB3aXRoIG1hdGNoaW5nIENPUkVfSU5ERVguCisjZGVmaW5lIERFRklORV9DMlNUUlVDVChuYW1lKSBcCitwdWJsaWM6IFwKKyAgICBlbnVtIDogdWludDMyX3QgeyBDT1JFX0lOREVYID0ga1BhcmFtSW5kZXgjI25hbWUgfTsgXAorICAgIERFRklORV9CQVNFX0MyU1RSVUNUKG5hbWUpCisKKy8vLyBEZWZpbmUgYSBmbGV4aWJsZSBzdHJ1Y3R1cmUgd2l0aG91dCBDT1JFX0lOREVYLgorI2RlZmluZSBERUZJTkVfQkFTRV9GTEVYX0MyU1RSVUNUKG5hbWUsIGZsZXhNZW1iZXIpIFwKK3B1YmxpYzogXAorICAgIEZMRVgoQzIjI25hbWUjI1N0cnVjdCwgZmxleE1lbWJlcikgXAorICAgIERFRklORV9CQVNFX0MyU1RSVUNUKG5hbWUpCisKKy8vLyBEZWZpbmUgYSBmbGV4aWJsZSBzdHJ1Y3R1cmUgd2l0aCBtYXRjaGluZyBDT1JFX0lOREVYLgorI2RlZmluZSBERUZJTkVfRkxFWF9DMlNUUlVDVChuYW1lLCBmbGV4TWVtYmVyKSBcCitwdWJsaWM6IFwKKyAgICBGTEVYKEMyIyNuYW1lIyNTdHJ1Y3QsIGZsZXhNZW1iZXIpIFwKKyAgICBlbnVtIDogdWludDMyX3QgeyBDT1JFX0lOREVYID0ga1BhcmFtSW5kZXgjI25hbWUgfCBDMlBhcmFtOjpDb3JlSW5kZXg6OklTX0ZMRVhfRkxBRyB9OyBcCisgICAgREVGSU5FX0JBU0VfQzJTVFJVQ1QobmFtZSkKKworLy8vIFxpbmdyb3VwIGludGVybmFsCisvLy8gRGVzY3JpYmUgYSBzdHJ1Y3R1cmUgb2YgYSB0ZW1wbGF0ZWQgc3RydWN0dXJlLgorLy8gVXNlIGxpc3QuLi4gYXMgdGhlIGFyZ3VtZW50IGdldHMgcmVzdWJzaXRpdHV0ZWQgYW5kIGl0IGNvbnRhaW5zIGNvbW1hcy4gQWx0ZXJuYXRpdmUgd291bGQgYmUKKy8vIHRvIHdyYXAgbGlzdCBpbiBhbiBleHByZXNzaW9uLCBlLmcuICh7IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBsaXN0OyB9KSkgd2hpY2ggY29udmVydHMKKy8vIGl0IGZyb20gYW4gaW5pdGlhbGl6ZXIgbGlzdCB0byBhIHZlY3Rvci4KKyNkZWZpbmUgREVTQ1JJQkVfVEVNUExBVEVEX0MyU1RSVUNUKHN0cnVrdCwgbGlzdC4uLikgXAorICAgIF9ERVNDUklCRV9URU1QTEFUQUJMRV9DMlNUUlVDVCh0ZW1wbGF0ZTw+LCBzdHJ1a3QsIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXywgbGlzdCkKKworLy8vIFxkZXByZWNhdGVkCisvLy8gRGVzY3JpYmUgdGhlIGZpZWxkcyBvZiBhIHN0cnVjdHVyZSB1c2luZyBhbiBpbml0aWFsaXplciBsaXN0LgorI2RlZmluZSBERVNDUklCRV9DMlNUUlVDVChuYW1lLCBsaXN0Li4uKSBcCisgICAgX0RFU0NSSUJFX1RFTVBMQVRBQkxFX0MyU1RSVUNUKCwgQzIjI25hbWUjI1N0cnVjdCwgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fLCBsaXN0KQorCisvLy8gXGluZ3JvdXAgaW50ZXJuYWwKKy8vLyBNYWNybyBsYXllciB0byBnZXQgdmFsdWUgb2YgZW5hYmxlZCB0aGF0IGlzIHBhc3NlZCBpbiBhcyBhIG1hY3JvIHZhcmlhYmxlCisjZGVmaW5lIF9ERVNDUklCRV9URU1QTEFUQUJMRV9DMlNUUlVDVCh0ZW1wbGF0ZSwgc3RydWt0LCBlbmFibGVkLCBsaXN0Li4uKSBcCisgICAgX19ERVNDUklCRV9URU1QTEFUQUJMRV9DMlNUUlVDVCh0ZW1wbGF0ZSwgc3RydWt0LCBlbmFibGVkLCBsaXN0KQorCisvLy8gXGluZ3JvdXAgaW50ZXJuYWwKKy8vLyBNYWNybyBsYXllciB0byByZXNvbHZlIHRvIHRoZSBzcGVjaWZpYyBtYWNybyBiYXNlZCBvbiBtYWNybyB2YXJpYWJsZQorI2RlZmluZSBfX0RFU0NSSUJFX1RFTVBMQVRBQkxFX0MyU1RSVUNUKHRlbXBsYXRlLCBzdHJ1a3QsIGVuYWJsZWQsIGxpc3QuLi4pIFwKKyAgICBfX19ERVNDUklCRV9URU1QTEFUQUJMRV9DMlNUUlVDVCMjZW5hYmxlZCh0ZW1wbGF0ZSwgc3RydWt0LCBsaXN0KQorCisjZGVmaW5lIF9fX0RFU0NSSUJFX1RFTVBMQVRBQkxFX0MyU1RSVUNUKHRlbXBsYXRlLCBzdHJ1a3QsIGxpc3QuLi4pIFwKKyAgICB0ZW1wbGF0ZSBcCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IHN0cnVrdDo6RmllbGRMaXN0KCkgeyByZXR1cm4gbGlzdDsgfQorCisjZGVmaW5lIF9fX0RFU0NSSUJFX1RFTVBMQVRBQkxFX0MyU1RSVUNUX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fKHRlbXBsYXRlLCBzdHJ1a3QsIGxpc3QuLi4pCisKKy8qKgorICogRGVzY3JpYmUgYSBmaWVsZCBvZiBhIHN0cnVjdHVyZS4KKyAqIFRoZXNlIG11c3QgYmUgaW4gb3JkZXIuCisgKgorICogVGhlcmUgYXJlIHR3byB3YXlzIHRvIHVzZSB0aGlzIG1hY3JvOgorICoKKyAqICB+fn5+fn5+fn5+fn5+ICguY3BwKQorICogIHN0cnVjdCBDMlZpZGVvV2lkdGhTdHJ1Y3QgeworICogICAgICBpbnQzMl90IHdpZHRoOworICogICAgICBDMlZpZGVvV2lkdGhTdHJ1Y3QoKSB7fSAvLyBvcHRpb25hbCBkZWZhdWx0IGNvbnN0cnVjdG9yCisgKiAgICAgIEMyVmlkZW9XaWR0aFN0cnVjdChpbnQzMl90IF93aWR0aCkgOiB3aWR0aChfd2lkdGgpIHt9CisgKgorICogICAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKFZpZGVvV2lkdGgpCisgKiAgICAgIEMyRklFTEQod2lkdGgsICJ3aWR0aCIpCisgKiAgfTsKKyAqICB+fn5+fn5+fn5+fn5+CisgKgorICogIH5+fn5+fn5+fn5+fn4gKC5jcHApCisgKiAgc3RydWN0IEMyVmlkZW9XaWR0aFN0cnVjdCB7CisgKiAgICAgIGludDMyX3Qgd2lkdGg7CisgKiAgICAgIEMyVmlkZW9XaWR0aFN0cnVjdCgpID0gZGVmYXVsdDsgLy8gb3B0aW9uYWwgZGVmYXVsdCBjb25zdHJ1Y3RvcgorICogICAgICBDMlZpZGVvV2lkdGhTdHJ1Y3QoaW50MzJfdCBfd2lkdGgpIDogd2lkdGgoX3dpZHRoKSB7fQorICoKKyAqICAgICAgREVGSU5FX0MyU1RSVUNUKFZpZGVvV2lkdGgpCisgKiAgfSBDMl9QQUNLOworICoKKyAqICBERVNDUklCRV9DMlNUUlVDVChWaWRlb1dpZHRoLCB7CisgKiAgICAgIEMyRklFTEQod2lkdGgsICJ3aWR0aCIpCisgKiAgfSkKKyAqICB+fn5+fn5+fn5+fn5+CisgKgorICogIEZvciBmbGV4aWJsZSBzdHJ1Y3R1cmVzICh0aG9zZSBlbmRpbmcgaW4gVFtdKSwgdXNlIHRoZSBmbGV4aWJsZSBtYWNyb3M6CisgKgorICogIH5+fn5+fn5+fn5+fn4gKC5jcHApCisgKiAgc3RydWN0IEMyVmlkZW9GbGV4V2lkdGhzU3RydWN0IHsKKyAqICAgICAgaW50MzJfdCB3aWR0aHNbXTsKKyAqICAgICAgQzJWaWRlb0ZsZXhXaWR0aHNTdHJ1Y3QoKTsgLy8gbXVzdCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3RvcgorICoKKyAqICBwcml2YXRlOgorICogICAgICAvLyBtYXkgaGF2ZSBwcml2YXRlIGNvbnN0cnVjdG9ycyB0YWtpbmcgbnVtYmVyIG9mIHdpZHRocyBhcyB0aGUgZmlyc3QgYXJndW1lbnQKKyAqICAgICAgLy8gVGhpcyBpcyB1c2VkIGJ5IHRoZSBDMlBhcmFtIGZhY3RvcnkgbWV0aG9kcywgZS5nLgorICogICAgICAvLyAgIEMyVmlkZW9GbGV4V2lkdGhzR2xvYmFsUGFyYW06OkFsbG9jVW5pcXVlKHNpemVfdCwgaW50MzJfdCk7CisgKiAgICAgIEMyVmlkZW9GbGV4V2lkdGhzU3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGludDMyX3QgdmFsdWUpIHsKKyAqICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmxleENvdW50OyArK2kpIHsKKyAqICAgICAgICAgICAgICB3aWR0aHNbaV0gPSB2YWx1ZTsKKyAqICAgICAgICAgIH0KKyAqICAgICAgfQorICoKKyAqICAgICAgLy8gSWYgdGhlIGxhc3QgYXJndW1lbnQgaXMgVFtOXSBvciBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4sIHRoZSBmbGV4Q291bnQgd2lsbAorICogICAgICAvLyBiZSBhdXRvbWF0aWNhbGx5IGNhbGN1bGF0ZWQgYW5kIHBhc3NlZCBieSB0aGUgQzJQYXJhbSBmYWN0b3J5IG1ldGhvZHMsIGUuZy4KKyAqICAgICAgLy8gICBpbnQgd2lkdGhzW10gPSB7IDEsIDIsIDMgfTsKKyAqICAgICAgLy8gICBDMlZpZGVvRmxleFdpZHRoc0dsb2JhbFBhcmFtOjpBbGxvY1VuaXF1ZSh3aWR0aHMpOworICogICAgICB0ZW1wbGF0ZTx1bnNpZ25lZCBOPgorICogICAgICBDMlZpZGVvRmxleFdpZHRoc1N0cnVjdChzaXplX3QgZmxleENvdW50LCBjb25zdCBpbnQzMl90KCZpbml0KVtOXSkgeworICogICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmbGV4Q291bnQ7ICsraSkgeworICogICAgICAgICAgICAgIHdpZHRoc1tpXSA9IGluaXRbaV07CisgKiAgICAgICAgICB9CisgKiAgICAgIH0KKyAqCisgKiAgICAgIERFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChWaWRlb0ZsZXhXaWR0aHMsIHdpZHRocykKKyAqICAgICAgQzJGSUVMRCh3aWR0aHMsICJ3aWR0aHMiKQorICogIH07CisgKiAgfn5+fn5+fn5+fn5+fgorICoKKyAqICB+fn5+fn5+fn5+fn5+ICguY3BwKQorICogIHN0cnVjdCBDMlZpZGVvRmxleFdpZHRoc1N0cnVjdCB7CisgKiAgICAgIGludDMyX3QgbVdpZHRoc1tdOworICogICAgICBDMlZpZGVvRmxleFdpZHRoc1N0cnVjdCgpOyAvLyBtdXN0IGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yCisgKgorICogICAgICBERUZJTkVfRkxFWF9DMlNUUlVDVChWaWRlb0ZsZXhXaWR0aHMsIG1XaWR0aHMpCisgKiAgfSBDMl9QQUNLOworICoKKyAqICBERVNDUklCRV9DMlNUUlVDVChWaWRlb0ZsZXhXaWR0aHMsIHsKKyAqICAgICAgQzJGSUVMRChtV2lkdGhzLCAid2lkdGhzIikKKyAqICB9KQorICogIH5+fn5+fn5+fn5+fn4KKyAqCisgKi8KKyNkZWZpbmUgREVTQ1JJQkVfQzJGSUVMRChtZW1iZXIsIG5hbWUpIFwKKyAgQzJGaWVsZERlc2NyaXB0b3IoJigoX3R5cGUqKShudWxscHRyKSktPm1lbWJlciwgbmFtZSksCisKKyNkZWZpbmUgQzJGSUVMRChtZW1iZXIsIG5hbWUpIF9DMkZJRUxEKG1lbWJlciwgbmFtZSwgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fKQorLy8vIFxpZiAwCisjZGVmaW5lIF9DMkZJRUxEKG1lbWJlciwgbmFtZSwgZW5hYmxlZCkgX19DMkZJRUxEKG1lbWJlciwgbmFtZSwgZW5hYmxlZCkKKyNkZWZpbmUgX19DMkZJRUxEKG1lbWJlciwgbmFtZSwgZW5hYmxlZCkgREVTQ1JJQkVfQzJGSUVMRCMjZW5hYmxlZChtZW1iZXIsIG5hbWUpCisjZGVmaW5lIERFU0NSSUJFX0MyRklFTERfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18obWVtYmVyLCBuYW1lKQorLy8vIFxlbmRpZgorCisvLy8gRGVmaW5lIGEgc3RydWN0dXJlIHdpdGggbWF0Y2hpbmcgQ09SRV9JTkRFWCBhbmQgc3RhcnQgZGVzY3JpYmluZyBpdHMgZmllbGRzLgorLy8vIFRoaXMgbXVzdCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyNkZWZpbmUgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChuYW1lKSBcCisgICAgX0RFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QobmFtZSwgREVGSU5FX0MyU1RSVUNULCBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18pCisKKy8vLyBEZWZpbmUgYSBiYXNlIHN0cnVjdHVyZSAod2l0aCBubyBDT1JFX0lOREVYKSBhbmQgc3RhcnQgZGVzY3JpYmluZyBpdHMgZmllbGRzLgorLy8vIFRoaXMgbXVzdCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyNkZWZpbmUgREVGSU5FX0FORF9ERVNDUklCRV9CQVNFX0MyU1RSVUNUKG5hbWUpIFwKKyAgICBfREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChuYW1lLCBERUZJTkVfQkFTRV9DMlNUUlVDVCwgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fKQorCisvLy8gRGVmaW5lIGEgZmxleGlibGUgc3RydWN0dXJlIHdpdGggbWF0Y2hpbmcgQ09SRV9JTkRFWCBhbmQgc3RhcnQgZGVzY3JpYmluZyBpdHMgZmllbGRzLgorLy8vIFRoaXMgbXVzdCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyNkZWZpbmUgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKG5hbWUsIGZsZXhNZW1iZXIpIFwKKyAgICBfREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKCBcCisgICAgICAgICAgICBuYW1lLCBmbGV4TWVtYmVyLCBERUZJTkVfRkxFWF9DMlNUUlVDVCwgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fKQorCisvLy8gRGVmaW5lIGEgZmxleGlibGUgYmFzZSBzdHJ1Y3R1cmUgKHdpdGggbm8gQ09SRV9JTkRFWCkgYW5kIHN0YXJ0IGRlc2NyaWJpbmcgaXRzIGZpZWxkcy4KKy8vLyBUaGlzIG11c3QgYmUgYXQgdGhlIGVuZCBvZiB0aGUgc3RydWN0dXJlIGRlZmluaXRpb24uCisjZGVmaW5lIERFRklORV9BTkRfREVTQ1JJQkVfQkFTRV9GTEVYX0MyU1RSVUNUKG5hbWUsIGZsZXhNZW1iZXIpIFwKKyAgICBfREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKCBcCisgICAgICAgICAgICBuYW1lLCBmbGV4TWVtYmVyLCBERUZJTkVfQkFTRV9GTEVYX0MyU1RSVUNULCBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18pCisKKy8vLyBcaWYgMAorLyoKKyAgIEFsdGVybmF0ZSBkZWNsYXJhdGlvbiBvZiBmaWVsZCBkZWZpbml0aW9ucyBpbiBjYXNlIG5vIGZpZWxkIGxpc3QgaXMgdG8gYmUgZ2VuZXJhdGVkLgorICAgVGhlIHNwZWNpZmljIG1hY3JvIGlzIGNob3NlZCBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fICh3aGV0aGVyIGl0IGlzCisgICBkZWZpbmVkICh0byBiZSBlbXB0eSkgb3Igbm90LiBUaGlzIHJlcXVpcmVzIHR3byBsZXZlbCBvZiBtYWNybyBzdWJzdGl0dXRpb24uCisgICBUUklDS1k6IHVzZSBuYW1lc3BhY2UgZGVjbGFyYXRpb24gdG8gaGFuZGxlIGNsb3NpbmcgYnJhY2tldCB0aGF0IGlzIG5vcm1hbGx5IGFmdGVyCisgICB0aGVzZSBtYWNyb3MuCisqLworCisjZGVmaW5lIF9ERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKG5hbWUsIGRlZmluZU1hY3JvLCBlbmFibGVkKSBcCisgICAgX19ERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKG5hbWUsIGRlZmluZU1hY3JvLCBlbmFibGVkKQorI2RlZmluZSBfX0RFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QobmFtZSwgZGVmaW5lTWFjcm8sIGVuYWJsZWQpIFwKKyAgICBfX19ERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUIyNlbmFibGVkKG5hbWUsIGRlZmluZU1hY3JvKQorI2RlZmluZSBfX19ERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fKG5hbWUsIGRlZmluZU1hY3JvKSBcCisgICAgZGVmaW5lTWFjcm8obmFtZSkgfSBDMl9QQUNLOyBuYW1lc3BhY2UgeworI2RlZmluZSBfX19ERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKG5hbWUsIGRlZmluZU1hY3JvKSBcCisgICAgZGVmaW5lTWFjcm8obmFtZSkgfSBDMl9QQUNLOyBcCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyIyNuYW1lIyNTdHJ1Y3Q6OkZpZWxkTGlzdCgpIHsgcmV0dXJuIF9GSUVMRF9MSVNUOyB9IFwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzIjI25hbWUjI1N0cnVjdDo6X0ZJRUxEX0xJU1QgPSB7CisKKyNkZWZpbmUgX0RFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChuYW1lLCBmbGV4TWVtYmVyLCBkZWZpbmVNYWNybywgZW5hYmxlZCkgXAorICAgIF9fREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKG5hbWUsIGZsZXhNZW1iZXIsIGRlZmluZU1hY3JvLCBlbmFibGVkKQorI2RlZmluZSBfX0RFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChuYW1lLCBmbGV4TWVtYmVyLCBkZWZpbmVNYWNybywgZW5hYmxlZCkgXAorICAgIF9fX0RFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVCMjZW5hYmxlZChuYW1lLCBmbGV4TWVtYmVyLCBkZWZpbmVNYWNybykKKyNkZWZpbmUgX19fREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fKG5hbWUsIGZsZXhNZW1iZXIsIGRlZmluZU1hY3JvKSBcCisgICAgZGVmaW5lTWFjcm8obmFtZSwgZmxleE1lbWJlcikgfSBDMl9QQUNLOyBuYW1lc3BhY2UgeworI2RlZmluZSBfX19ERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QobmFtZSwgZmxleE1lbWJlciwgZGVmaW5lTWFjcm8pIFwKKyAgICBkZWZpbmVNYWNybyhuYW1lLCBmbGV4TWVtYmVyKSB9IEMyX1BBQ0s7IFwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzIjI25hbWUjI1N0cnVjdDo6RmllbGRMaXN0KCkgeyByZXR1cm4gX0ZJRUxEX0xJU1Q7IH0gXAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMiMjbmFtZSMjU3RydWN0OjpfRklFTERfTElTVCA9IHsKKy8vLyBcZW5kaWYKKworCisvKioKKyAqIFBhcmFtZXRlciByZWZsZWN0b3IgY2xhc3MuCisgKgorICogVGhpcyBjbGFzcyBjZW50cmFsaXplcyB0aGUgZGVzY3JpcHRpb24gb2YgcGFyYW1ldGVyIHN0cnVjdHVyZXMuIFRoaXMgY2FuIGJlIHNoYXJlZAorICogYnkgbXVsdGlwbGUgY29tcG9uZW50cyBhcyBkZXNjcmliaW5nIGEgcGFyYW1ldGVyIGRvZXMgbm90IGltcGx5IHN1cHBvcnQgb2YgdGhhdAorICogcGFyYW1ldGVyLiBIb3dldmVyLCBlYWNoIHN1cHBvcnRlZCBwYXJhbWV0ZXIgYW5kIGFueSBkZXBlbmRlbnQgc3RydWN0dXJlcyB3aXRoaW4KKyAqIG11c3QgYmUgZGVzY3JpYmVkIGJ5IHRoZSBwYXJhbWV0ZXIgcmVmbGVjdG9yIHByb3ZpZGVkIGJ5IGEgY29tcG9uZW50LgorICovCitjbGFzcyBDMlBhcmFtUmVmbGVjdG9yIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiAgRGVzY3JpYmVzIGEgcGFyYW1ldGVyIHN0cnVjdHVyZS4KKyAgICAgKgorICAgICAqICBccGFyYW1baW5dIGNvcmVJbmRleCB0aGUgY29yZSBpbmRleCBvZiB0aGUgcGFyYW1ldGVyIHN0cnVjdHVyZSBjb250YWluaW5nIGF0IGxlYXN0IHRoZQorICAgICAqICBjb3JlIGluZGV4CisgICAgICoKKyAgICAgKiAgXHJldHVybiB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHBhcmFtZXRlciBzdHJ1Y3R1cmUKKyAgICAgKiAgXHJldHZhbCBudWxscHRyIGlmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHJlZmxlY3RvcgorICAgICAqCisgICAgICogIFRoaXMgbWV0aG9kcyBzaGFsbCBub3QgYmxvY2sgYW5kIHJldHVybiBpbW1lZGlhdGVseS4KKyAgICAgKgorICAgICAqICBcbm90ZSB0aGlzIGNsYXNzIGRvZXMgbm90IHRha2UgYSBzZXQgb2YgaW5kaWNlcyBiZWNhdXNlIHdlIHdvdWxkIHRoZW4gcHJlZmVyCisgICAgICogIHRvIGFsc28gcmV0dXJuIGFueSBkZXBlbmRlbnQgc3RydWN0dXJlcywgYW5kIHdlIGRvbid0IHdhbnQgdGhpcyBsb2dpYyB0byBiZQorICAgICAqICByZXBlYXRlZCBpbiBlYWNoIHJlZmxlY3Rvci4gQWx0ZXJuYXRlbHksIHRoaXMgY291bGQganVzdCByZXR1cm4gYSBtYXAgb2YgYWxsCisgICAgICogIGRlc2NyaXB0aW9ucywgYnV0IHdlIHdhbnQgdG8gY29uc2VydmUgbWVtb3J5IGlmIGNsaWVudCBvbmx5IHdhbnRzIHRoZSBkZXNjcmlwdGlvbgorICAgICAqICBvZiBhIGZldyBpbmRpY2VzLgorICAgICAqLworICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzY3JpYmUoQzJQYXJhbTo6Q29yZUluZGV4IGNvcmVJbmRleCkgY29uc3QgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QzJQYXJhbVJlZmxlY3RvcigpID0gZGVmYXVsdDsKK307CisKKy8qKgorICogR2VuZXJpYyBzdXBwb3J0ZWQgdmFsdWVzIGZvciBhIGZpZWxkLgorICoKKyAqIFRoaXMgY2FuIGJlIGVpdGhlciBhIHJhbmdlIG9yIGEgc2V0IG9mIHZhbHVlcy4gVGhlIHJhbmdlIGNhbiBiZSBhIHNpbXBsZSByYW5nZSwgYW4gYXJpdGhtZXRpYywKKyAqIGdlb21ldHJpYyBvciBtdWx0aXBseS1hY2N1bXVsYXRlIHNlcmllcyB3aXRoIGEgY2xlYXIgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZS4gVmFsdWVzIGNhbgorICogYmUgZGlzY3JldGUgdmFsdWVzLCBvciBjYW4gb3B0aW9uYWxseSByZXByZXNlbnQgZmxhZ3MgdG8gYmUgb3ItZWQuCisgKgorICogXG5vdGUgRG8gbm90IHVzZSBmbGFncyB0byByZXByZXNlbnQgYml0ZmllbGRzLiBVc2UgaW5kaXZpZHVhbCB2YWx1ZXMgb3Igc2VwYXJhdGUgZmllbGRzIGluc3RlYWQuCisgKi8KK3N0cnVjdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIHsKKy8vcHVibGljOgorICAgIGVudW0gdHlwZV90IHsKKyAgICAgICAgRU1QVFksICAgICAgLy8vPCBubyBzdXBwb3J0ZWQgdmFsdWVzCisgICAgICAgIFJBTkdFLCAgICAgIC8vLzwgYSBudW1lcmljIHJhbmdlIHRoYXQgY2FuIGJlIGNvbnRpbnVvdXMgb3IgZGlzY3JldGUKKyAgICAgICAgVkFMVUVTLCAgICAgLy8vPCBhIGxpc3Qgb2YgdmFsdWVzCisgICAgICAgIEZMQUdTICAgICAgIC8vLzwgYSBsaXN0IG9mIGZsYWdzIHRoYXQgY2FuIGJlIE9SLWVkCisgICAgfTsKKworICAgIHR5cGVfdCB0eXBlOyAvKiogVHlwZSBvZiB2YWx1ZXMgZm9yIHRoaXMgZmllbGQuICovCisKKyAgICB0eXBlZGVmIEMyVmFsdWU6OlByaW1pdGl2ZSBQcmltaXRpdmU7CisKKyAgICAvKioKKyAgICAgKiBSYW5nZSBzcGVjaWZpZXIgZm9yIHN1cHBvcnRlZCB2YWx1ZS4gVXNlZCBpZiB0eXBlIGlzIFJBTkdFLgorICAgICAqCisgICAgICogSWYgc3RlcCBpcyAwIGFuZCBudW0gYW5kIGRlbm9tIGFyZSBib3RoIDEsIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGFyZSBhbnkgdmFsdWUsIGZvciB3aGljaAorICAgICAqIG1pbiA8PSB2YWx1ZSA8PSBtYXguCisgICAgICoKKyAgICAgKiBPdGhlcndpc2UsIHRoZSByYW5nZSByZXByZXNlbnRzIGEgZ2VvbWV0cmljL2FyaXRobWV0aWMvbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMsIHdoZXJlCisgICAgICogc3VjY2Vzc2l2ZSBzdXBwb3J0ZWQgdmFsdWVzIGNhbiBiZSBkZXJpdmVkIGZyb20gcHJldmlvdXMgdmFsdWVzIChzdGFydGluZyBhdCBtaW4pLCB1c2luZyB0aGUKKyAgICAgKiBmb2xsb3dpbmcgZm9ybXVsYToKKyAgICAgKiAgdlswXSA9IG1pbgorICAgICAqICB2W2ldID0gdltpLTFdICogbnVtIC8gZGVub20gKyBzdGVwIGZvciBpID49IDEsIHdoaWxlIG1pbiA8IHZbaV0gPD0gbWF4LgorICAgICAqLworICAgIHN0cnVjdCB7CisgICAgICAgIC8qKiBMb3dlciBlbmQgb2YgdGhlIHJhbmdlIChpbmNsdXNpdmUpLiAqLworICAgICAgICBQcmltaXRpdmUgbWluOworICAgICAgICAvKiogVXBwZXIgZW5kIG9mIHRoZSByYW5nZSAoaW5jbHVzaXZlIGlmIHBlcm1pdHRlZCBieSBzZXJpZXMpLiAqLworICAgICAgICBQcmltaXRpdmUgbWF4OworICAgICAgICAvKiogU3RlcCBiZXR3ZWVuIHN1cHBvcnRlZCB2YWx1ZXMuICovCisgICAgICAgIFByaW1pdGl2ZSBzdGVwOworICAgICAgICAvKiogTnVtZXJhdG9yIG9mIGEgZ2VvbWV0cmljIHNlcmllcy4gKi8KKyAgICAgICAgUHJpbWl0aXZlIG51bTsKKyAgICAgICAgLyoqIERlbm9taW5hdG9yIG9mIGEgZ2VvbWV0cmljIHNlcmllcy4gKi8KKyAgICAgICAgUHJpbWl0aXZlIGRlbm9tOworICAgIH0gcmFuZ2U7CisKKyAgICAvKioKKyAgICAgKiBMaXN0IG9mIHZhbHVlcy4gVXNlZCBpZiB0eXBlIGlzIFZBTFVFUyBvciBGTEFHUy4KKyAgICAgKgorICAgICAqIElmIHR5cGUgaXMgVkFMVUVTLCB0aGlzIGlzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCB2YWx1ZXMgaW4gZGVjcmVhc2luZyBwcmVmZXJlbmNlLgorICAgICAqCisgICAgICogSWYgdHlwZSBpcyBGTEFHUywgdGhpcyB2ZWN0b3IgY29udGFpbnMgeyBtaW4tbWFzaywgZmxhZzEsIGZsYWcyLi4uIH0uIEJhc2ljYWxseSwgdGhlIGZpcnN0CisgICAgICogdmFsdWUgaXMgdGhlIHJlcXVpcmVkIHNldCBvZiBmbGFncyB0byBiZSBzZXQsIGFuZCB0aGUgcmVzdCBvZiB0aGUgdmFsdWVzIGFyZSBmbGFncyB0aGF0IGNhbgorICAgICAqIGJlIHNldCBpbmRlcGVuZGVudGx5LiBGTEFHUyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgaW50ZWdyYWwgdHlwZXMuIFN1cHBvcnRlZCBmbGFncyBzaG91bGQKKyAgICAgKiBub3Qgb3ZlcmxhcCwgYXMgaXQgY2FuIG1ha2UgdmFsaWRhdGlvbiBub24tZGV0ZXJtaW5pc3RpYy4gVGhlIHN0YW5kYXJkIHZhbGlkYXRpb24gbWV0aG9kCisgICAgICogaXMgdGhhdCBzdGFydGluZyBmcm9tIHRoZSBvcmlnaW5hbCB2YWx1ZSwgaWYgZWFjaCBmbGFnIGlzIHJlbW92ZWQgd2hlbiBmdWxseSBwcmVzZW50ICh0aGUKKyAgICAgKiBtaW4tbWFzayBtdXN0IGJlIGZ1bGx5IHByZXNlbnQpLCB3ZSBzaGFsbCBhcnJpdmUgYXQgMC4KKyAgICAgKi8KKyAgICBzdGQ6OnZlY3RvcjxQcmltaXRpdmU+IHZhbHVlczsKKworICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoKQorICAgICAgICA6IHR5cGUoRU1QVFkpIHsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoVCBtaW4sIFQgbWF4LCBUIHN0ZXAgPSBUKHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlID8gMCA6IDEpKQorICAgICAgICA6IHR5cGUoUkFOR0UpLAorICAgICAgICAgIHJhbmdle21pbiwgbWF4LCBzdGVwLCAoVCkxLCAoVCkxfSB7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhUIG1pbiwgVCBtYXgsIFQgbnVtLCBUIGRlbikgOgorICAgICAgICB0eXBlKFJBTkdFKSwKKyAgICAgICAgcmFuZ2V7bWluLCBtYXgsIChUKTAsIG51bSwgZGVufSB7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhUIG1pbiwgVCBtYXgsIFQgc3RlcCwgVCBudW0sIFQgZGVuKQorICAgICAgICA6IHR5cGUoUkFOR0UpLAorICAgICAgICAgIHJhbmdle21pbiwgbWF4LCBzdGVwLCBudW0sIGRlbn0geyB9CisKKyAgICAvLy8gXGRlcHJlY2F0ZWQKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoYm9vbCBmbGFncywgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IGxpc3QpCisgICAgICAgIDogdHlwZShmbGFncyA/IEZMQUdTIDogVkFMVUVTKSwKKyAgICAgICAgICByYW5nZXsoVCkwLCAoVCkwLCAoVCkwLCAoVCkwLCAoVCkwfSB7CisgICAgICAgIGZvciAoVCB2YWx1ZSA6IGxpc3QpIHsKKyAgICAgICAgICAgIHZhbHVlcy5lbXBsYWNlX2JhY2sodmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIFxkZXByZWNhdGVkCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKGJvb2wgZmxhZ3MsIGNvbnN0IHN0ZDo6dmVjdG9yPFQ+JiBsaXN0KQorICAgICAgICA6IHR5cGUoZmxhZ3MgPyBGTEFHUyA6IFZBTFVFUyksCisgICAgICAgICAgcmFuZ2V7KFQpMCwgKFQpMCwgKFQpMCwgKFQpMCwgKFQpMH0geworICAgICAgICBmb3IoVCB2YWx1ZSA6IGxpc3QpIHsKKyAgICAgICAgICAgIHZhbHVlcy5lbXBsYWNlX2JhY2sodmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIFxpbnRlcm5hbAorICAgIC8vLyBcdG9kbzogY3JlYXRlIHNlcGFyYXRlIHZhbHVlcyB2cy4gZmxhZ3MgaW5pdGlhbGl6ZXIgYXMgZm9yIGZsYWdzIHdlIHdhbnQKKyAgICAvLy8gdG8gbGlzdCBib3RoIGFsbG93ZWQgYW5kIHJlcXVpcmVkIGZsYWdzCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRT1kZWNsdHlwZShDMkZpZWxkRGVzY3JpcHRvcjo6bmFtZWRWYWx1ZXNGb3IoKihUKikwKSk+CisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhib29sIGZsYWdzLCBjb25zdCBUKikKKyAgICAgICAgOiB0eXBlKGZsYWdzID8gRkxBR1MgOiBWQUxVRVMpLAorICAgICAgICAgIHJhbmdleyhUKTAsIChUKTAsIChUKTAsIChUKTAsIChUKTB9IHsKKyAgICAgICAgICAgICAgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBuYW1lZCA9IEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZFZhbHVlc0ZvcigqKFQqKTApOworICAgICAgICBpZiAoZmxhZ3MpIHsKKyAgICAgICAgICAgIHZhbHVlcy5lbXBsYWNlX2JhY2soMCk7IC8vIG1pbi1tYXNrIGRlZmF1bHRzIHRvIDAKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlVHlwZSAmaXRlbSA6IG5hbWVkKXsKKyAgICAgICAgICAgIHZhbHVlcy5lbXBsYWNlX2JhY2soaXRlbS5zZWNvbmQpOworICAgICAgICB9CisgICAgfQorfTsKKworLyoqCisgKiBTdXBwb3J0ZWQgdmFsdWVzIGZvciBhIHNwZWNpZmljIGZpZWxkLgorICoKKyAqIFRoaXMgaXMgYSBwYWlyIG9mIHRoZSBmaWVsZCBzcGVjaWZpZXIgdG9nZXRoZXIgd2l0aCBhbiBvcHRpb25hbCBzdXBwb3J0ZWQgdmFsdWVzIG9iamVjdC4KKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgd2hlbiByZXBvcnRpbmcgcGFyYW1ldGVyIGNvbmZpZ3VyYXRpb24gZmFpbHVyZXMgYW5kIGNvbmZsaWN0cy4KKyAqLworc3RydWN0IEMyUGFyYW1GaWVsZFZhbHVlcyB7CisgICAgQzJQYXJhbUZpZWxkIHBhcmFtT3JGaWVsZDsgLy8vPCB0aGUgZmllbGQgb3IgcGFyYW1ldGVyCisgICAgLy8vIG9wdGlvbmFsIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIHRoZSBmaWVsZCBpZiBwYXJhbU9yRmllbGQgc3BlY2lmaWVzIGFuIGFjdHVhbCBmaWVsZCB0aGF0IGlzCisgICAgLy8vIG51bWVyaWMgKG5vbiBzdHJ1Y3QsIGJsb2Igb3Igc3RyaW5nKS4gU3VwcG9ydGVkIHZhbHVlcyBmb3IgYXJyYXlzIChpbmNsdWRpbmcgc3RyaW5nIGFuZAorICAgIC8vLyBibG9icykgZGVzY3JpYmUgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIGVhY2ggZWxlbWVudCAoY2hhcmFjdGVyIGZvciBzdHJpbmcsIGFuZCBieXRlcyBmb3IKKyAgICAvLy8gYmxvYnMpLiBJdCBpcyBvcHRpb25hbCBmb3IgcmVhZC1vbmx5IHN0cmluZ3MgYW5kIGJsb2JzLgorICAgIHN0ZDo6dW5pcXVlX3B0cjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPiB2YWx1ZXM7CisKKyAgICAvLyBUaGlzIHN0cnVjdCBpcyBtZWFudCB0byBiZSBtb3ZlIGNvbnN0cnVjdGVkLgorICAgIEMyX0RFRkFVTFRfTU9WRShDMlBhcmFtRmllbGRWYWx1ZXMpOworCisgICAgLy8gQ29weSBjb25zdHJ1Y3Rvci9hc3NpZ25tZW50IGlzIGFsc28gcHJvdmlkZWQgYXMgdGhpcyBvYmplY3QgbWF5IGdldCBjb3BpZWQuCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzKGNvbnN0IEMyUGFyYW1GaWVsZFZhbHVlcyAmb3RoZXIpCisgICAgICAgIDogcGFyYW1PckZpZWxkKG90aGVyLnBhcmFtT3JGaWVsZCksCisgICAgICAgICAgdmFsdWVzKG90aGVyLnZhbHVlcyA/IHN0ZDo6bWFrZV91bmlxdWU8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4oKm90aGVyLnZhbHVlcykgOiBudWxscHRyKSB7IH0KKworICAgIEMyUGFyYW1GaWVsZFZhbHVlcyYgb3BlcmF0b3I9KGNvbnN0IEMyUGFyYW1GaWVsZFZhbHVlcyAmb3RoZXIpIHsKKyAgICAgICAgcGFyYW1PckZpZWxkID0gb3RoZXIucGFyYW1PckZpZWxkOworICAgICAgICB2YWx1ZXMgPSBvdGhlci52YWx1ZXMgPyBzdGQ6Om1ha2VfdW5pcXVlPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+KCpvdGhlci52YWx1ZXMpIDogbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IHdpdGggbm8gdmFsdWVzLgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlcyhjb25zdCBDMlBhcmFtRmllbGQgJnBhcmFtT3JGaWVsZF8pCisgICAgICAgIDogcGFyYW1PckZpZWxkKHBhcmFtT3JGaWVsZF8pIHsgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IHdpdGggdmFsdWVzLgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlcyhjb25zdCBDMlBhcmFtRmllbGQgJnBhcmFtT3JGaWVsZF8sIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbHVlc18pCisgICAgICAgIDogcGFyYW1PckZpZWxkKHBhcmFtT3JGaWVsZF8pLAorICAgICAgICAgIHZhbHVlcyhzdGQ6Om1ha2VfdW5pcXVlPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+KHZhbHVlc18pKSB7IH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBmcm9tIGZpZWxkcy4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXMoY29uc3QgQzJQYXJhbUZpZWxkICZwYXJhbU9yRmllbGRfLCBzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gJiZ2YWx1ZXNfKQorICAgICAgICA6IHBhcmFtT3JGaWVsZChwYXJhbU9yRmllbGRfKSwKKyAgICAgICAgICB2YWx1ZXMoc3RkOjptb3ZlKHZhbHVlc18pKSB7IH0KK307CisKKy8vLyBAfQorCisvLyBpbmNsdWRlIGRlYnVnIGhlYWRlciBmb3IgQzJQYXJhbXMuaCBpZiBDMkRlYnVnLmggd2FzIGFscmVhZHkgaW5jbHVkZWQKKyNpZmRlZiBDMlVUSUxTX0RFQlVHX0hfCisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLXBhcmFtLmg+CisjZW5kaWYKKworI2VuZGlmICAvLyBDMlBBUkFNX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyUGFyYW1EZWYuaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJQYXJhbURlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMzMyODMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyUGFyYW1EZWYuaApAQCAtMCwwICsxLDkzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKiBcZmlsZQorICogVGVtcGxhdGVzIHVzZWQgdG8gZGVjbGFyZSBwYXJhbWV0ZXJzLgorICovCisjaWZuZGVmIEMyUEFSQU1fREVGX0hfCisjZGVmaW5lIEMyUEFSQU1fREVGX0hfCisKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworI2luY2x1ZGUgPEMyUGFyYW0uaD4KKworLy8vIFxhZGR0b2dyb3VwIFBhcmFtZXRlcnMKKy8vLyBAeworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT0gVVRJTElUWSBURU1QTEFURVMgRk9SIFBBUkFNRVRFUiBERUZJTklUSU9OUyA9PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLy8vIFxhZGR0b2dyb3VwIGludGVybmFsCisvLy8gQHsKKworLy8vIEhlbHBlciBjbGFzcyB0aGF0IGNoZWNrcyBpZiBhIHR5cGUgaGFzIGVxdWFsaXR5IGFuZCBpbmVxdWFsaXR5IG9wZXJhdG9ycy4KK3N0cnVjdCBDMl9ISURFIF9DMkNvbXBhcmFibGVfaW1wbAoreworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFMsIHR5cGVuYW1lPWRlY2x0eXBlKFMoKSA9PSBTKCkpPgorICAgIHN0YXRpYyBzdGQ6OnRydWVfdHlwZSBUZXN0RXF1YWwoaW50KTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdGF0aWMgc3RkOjpmYWxzZV90eXBlIFRlc3RFcXVhbCguLi4pOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUywgdHlwZW5hbWU9ZGVjbHR5cGUoUygpICE9IFMoKSk+CisgICAgc3RhdGljIHN0ZDo6dHJ1ZV90eXBlIFRlc3ROb3RFcXVhbChpbnQpOworICAgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0YXRpYyBzdGQ6OmZhbHNlX3R5cGUgVGVzdE5vdEVxdWFsKC4uLik7Cit9OworCisvKioKKyAqIEhlbHBlciB0ZW1wbGF0ZSB0aGF0IHJldHVybnMgaWYgYSB0eXBlIGhhcyBlcXVhbGl0eSBhbmQgaW5lcXVhbGl0eSBvcGVyYXRvcnMuCisgKgorICogVXNlIGFzIF9DMkNvbXBhcmFibGU8dHlwZW5hbWUgUz46OnZhbHVlLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTPgorc3RydWN0IEMyX0hJREUgX0MyQ29tcGFyYWJsZQorICAgIDogcHVibGljIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgZGVjbHR5cGUoX0MyQ29tcGFyYWJsZV9pbXBsOjpUZXN0RXF1YWw8Uz4oMCkpOjp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgZGVjbHR5cGUoX0MyQ29tcGFyYWJsZV9pbXBsOjpUZXN0Tm90RXF1YWw8Uz4oMCkpOjp2YWx1ZT4geworfTsKKworLy8vICBIZWxwZXIgY2xhc3MgdGhhdCBjaGVja3MgaWYgYSB0eXBlIGhhcyBhIENPUkVfSU5ERVggY29uc3RhbnQuCitzdHJ1Y3QgQzJfSElERSBfQzJDb3JlSW5kZXhIZWxwZXJfaW1wbAoreworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFMsIGludD1TOjpDT1JFX0lOREVYPgorICAgIHN0YXRpYyBzdGQ6OnRydWVfdHlwZSBUZXN0Q29yZUluZGV4KGludCk7CisgICAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RhdGljIHN0ZDo6ZmFsc2VfdHlwZSBUZXN0Q29yZUluZGV4KC4uLik7Cit9OworCisvLy8gTWFjcm8gdGhhdCBkZWZpbmVzIGFuZCB0aHVzIG92ZXJyaWRlcyBhIHR5cGUncyBDT1JFX0lOREVYIGZvciBhIHNldHRpbmcKKyNkZWZpbmUgX0MyX0NPUkVfSU5ERVhfT1ZFUlJJREUoY29yZUluZGV4KSBcCitwdWJsaWM6IFwKKyAgICBlbnVtIDogdWludDMyX3QgeyBDT1JFX0lOREVYID0gY29yZUluZGV4IH07CisKKworLy8vIEhlbHBlciB0ZW1wbGF0ZSB0aGF0IGFkZHMgYSBDT1JFX0lOREVYIHRvIGEgdHlwZSBpZiBpdCBkb2VzIG5vdCBoYXZlIG9uZSAoZm9yIHRlc3RpbmcpCit0ZW1wbGF0ZTx0eXBlbmFtZSBTLCBpbnQgQ29yZUluZGV4Pgorc3RydWN0IEMyX0hJREUgX0MyQWRkQ29yZUluZGV4IDogcHVibGljIFMgeworICAgIF9DMl9DT1JFX0lOREVYX09WRVJSSURFKENvcmVJbmRleCkKK307CisKKy8qKgorICogXGJyaWVmIEhlbHBlciBjbGFzcyB0byBjaGVjayBzdHJ1Y3QgcmVxdWlyZW1lbnRzIGZvciBwYXJhbWV0ZXJzLgorICoKKyAqIEZlYXR1cmVzOgorICogIC0gdmVyaWZ5IGRlZmF1bHQgY29uc3RydWN0b3IsIG5vIHZpcnR1YWwgbWV0aG9kcywgYW5kIG5vIGVxdWFsaXR5IG9wZXJhdG9ycy4KKyAqICAtIGV4cG9zZSBQQVJBTV9UWVBFLCBhbmQgbm9uLWZsZXggRkxFWF9TSVpFLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTLCBpbnQgQ29yZUluZGV4LCB1bnNpZ25lZCBUeXBlRmxhZ3M+CitzdHJ1Y3QgQzJfSElERSBfQzJTdHJ1Y3RDaGVjayB7CisgICAgc3RhdGljX2Fzc2VydCgKKyAgICAgICAgICAgIHN0ZDo6aXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPFM+Ojp2YWx1ZSwgIkMyIHN0cnVjdHVyZSBtdXN0IGhhdmUgZGVmYXVsdCBjb25zdHJ1Y3RvciIpOworICAgIHN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfcG9seW1vcnBoaWM8Uz46OnZhbHVlLCAiQzIgc3RydWN0dXJlIG11c3Qgbm90IGhhdmUgdmlydHVhbCBtZXRob2RzIik7CisgICAgc3RhdGljX2Fzc2VydCghX0MyQ29tcGFyYWJsZTxTPjo6dmFsdWUsICJDMiBzdHJ1Y3R1cmUgbXVzdCBub3QgaGF2ZSBvcGVyYXRvcj09IG9yICE9Iik7CisKK3B1YmxpYzoKKyAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICBQQVJBTV9UWVBFID0gQ29yZUluZGV4IHwgVHlwZUZsYWdzCisgICAgfTsKKworcHJvdGVjdGVkOgorICAgIGVudW0gOiB1aW50MzJfdCB7CisgICAgICAgIEZMRVhfU0laRSA9IDAsCisgICAgfTsKK307CisKKy8vLyBIZWxwZXIgY2xhc3MgdGhhdCBjaGVja3MgaWYgYSB0eXBlIGhhcyBhbiBpbnRlZ2VyIEZMRVhfU0laRSBtZW1iZXIuCitzdHJ1Y3QgQzJfSElERSBfQzJGbGV4aWJsZV9pbXBsIHsKKyAgICAvLy8gc3BlY2lhbGl6YXRpb24gZm9yIHR5cGVzIHRoYXQgaGF2ZSBhIEZMRVhfU0laRSBtZW1iZXIKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTLCB1bnNpZ25lZD1TOjpGTEVYX1NJWkU+CisgICAgc3RhdGljIHN0ZDo6dHJ1ZV90eXBlIFRlc3RGbGV4U2l6ZShpbnQpOworICAgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0YXRpYyBzdGQ6OmZhbHNlX3R5cGUgVGVzdEZsZXhTaXplKC4uLik7Cit9OworCisvLy8gSGVscGVyIHRlbXBsYXRlIHRoYXQgcmV0dXJucyBpZiBhIHR5cGUgaGFzIGFuIGludGVnZXIgRkxFWF9TSVpFIG1lbWJlci4KK3RlbXBsYXRlPHR5cGVuYW1lIFM+CitzdHJ1Y3QgQzJfSElERSBfQzJGbGV4aWJsZQorICAgIDogcHVibGljIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgZGVjbHR5cGUoX0MyRmxleGlibGVfaW1wbDo6VGVzdEZsZXhTaXplPFM+KDApKTo6dmFsdWU+IHsKK307CisKKy8vLyBNYWNybyB0byB0ZXN0IGlmIGEgdHlwZSBpcyBmbGV4aWJsZSAoaGFzIGEgRkxFWF9TSVpFIG1lbWJlcikuCisjZGVmaW5lIElGX0ZMRVhJQkxFKFMpIEVOQUJMRV9JRihfQzJGbGV4aWJsZTxTPjo6dmFsdWUpCisvLy8gU2hvcnRoYW5kIGZvciBzdGQ6OmVuYWJsZV9pZgorI2RlZmluZSBFTkFCTEVfSUYoY29uZCkgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8Y29uZD46OnR5cGUKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVj12b2lkPgorc3RydWN0IEMyX0hJREUgX2MyX2VuYWJsZV9pZl90eXBlIHsKKyAgICB0eXBlZGVmIFYgdHlwZTsKK307CisKKy8vLyBIZWxwZXIgdGVtcGxhdGUgdGhhdCBleHBvc2VzIHRoZSBmbGV4aWJsZSBzdWJ0eXBlIG9mIGEgc3RydWN0LgordGVtcGxhdGU8dHlwZW5hbWUgUywgdHlwZW5hbWUgRT12b2lkPgorc3RydWN0IEMyX0hJREUgX0MyRmxleEhlbHBlciB7CisgICAgdHlwZWRlZiB2b2lkIEZsZXhUeXBlOworICAgIGVudW0gOiB1aW50MzJfdCB7IEZMRVhfU0laRSA9IDAgfTsKK307CisKKy8vLyBTcGVjaWFsaXphdGlvbiBmb3IgZmxleGlibGUgdHlwZXMuIFRoaXMgb25seSB3b3JrcyBpZiBfRmxleE1lbWJlclR5cGUgaXMgcHVibGljLgordGVtcGxhdGU8dHlwZW5hbWUgUz4KK3N0cnVjdCBDMl9ISURFIF9DMkZsZXhIZWxwZXI8UywKKyAgICAgICAgdHlwZW5hbWUgX2MyX2VuYWJsZV9pZl90eXBlPHR5cGVuYW1lIFM6Ol9GbGV4TWVtYmVyVHlwZT46OnR5cGU+IHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9DMkZsZXhIZWxwZXI8dHlwZW5hbWUgUzo6X0ZsZXhNZW1iZXJUeXBlPjo6RmxleFR5cGUgRmxleFR5cGU7CisgICAgZW51bSA6IHVpbnQzMl90IHsgRkxFWF9TSVpFID0gX0MyRmxleEhlbHBlcjx0eXBlbmFtZSBTOjpfRmxleE1lbWJlclR5cGU+OjpGTEVYX1NJWkUgfTsKK307CisKKy8vLyBTcGVjaWFsaXphdGlvbiBmb3IgZmxleCBhcnJheXMuCit0ZW1wbGF0ZTx0eXBlbmFtZSBTPgorc3RydWN0IEMyX0hJREUgX0MyRmxleEhlbHBlcjxTW10sCisgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfdm9pZDx0eXBlbmFtZSBfQzJGbGV4SGVscGVyPFM+OjpGbGV4VHlwZT46OnZhbHVlPjo6dHlwZT4geworICAgIHR5cGVkZWYgUyBGbGV4VHlwZTsKKyAgICBlbnVtIDogdWludDMyX3QgeyBGTEVYX1NJWkUgPSBzaXplb2YoUykgfTsKK307CisKKy8qKgorICogXGJyaWVmIEhlbHBlciBjbGFzcyB0byBjaGVjayBmbGV4aWJsZSBzdHJ1Y3QgcmVxdWlyZW1lbnRzIGFuZCBhZGQgY29tbW9uIG9wZXJhdGlvbnMuCisgKgorICogRmVhdHVyZXM6CisgKiAgLSBleHBvc2UgQ09SRV9JTkRFWCBhbmQgRmllbGRMaXN0ICh0aGlzIGlzIG5vcm1hbGx5IGluaGVyaXRlZCBmcm9tIHRoZSBzdHJ1Y3QsIGJ1dCBmbGV4aWJsZQorICogICAgc3RydWN0cyBjYW5ub3QgYmUgYmFzZSBjbGFzc2VzIGFuZCB0aHVzIGluaGVyaXRlZCBmcm9tKQorICogIC0gZGlzYWJsZSBjb3B5IGFzc2lnbm1lbnQgYW5kIGNvbnN0cnVjdGlvbiAoVE9ETzogdGhpcyBpcyBhbHJlYWR5IGRvbmUgaW4gdGhlIEZMRVggbWFjcm8gZm9yIHRoZQorICogICAgZmxleGlibGUgc3RydWN0LCBzbyBtYXkgbm90IGJlIG5lZWRlZCBoZXJlKQorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTLCBpbnQgUGFyYW1JbmRleCwgdW5zaWduZWQgVHlwZUZsYWdzPgorc3RydWN0IEMyX0hJREUgX0MyRmxleFN0cnVjdENoZWNrIDoKKy8vIGFkZCBmbGV4aWJsZSBmbGFnIGFzIF9DMlN0cnVjdENoZWNrIGRlZmluZXMgUEFSQU1fVFlQRQorICAgICAgICBwdWJsaWMgX0MyU3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCB8IEMyUGFyYW06OkNvcmVJbmRleDo6SVNfRkxFWF9GTEFHLCBUeXBlRmxhZ3M+IHsKK3B1YmxpYzoKKyAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICAvLy8gXGhpZGVpbml0aWFsaXplcgorICAgICAgICBDT1JFX0lOREVYID0gUGFyYW1JbmRleCB8IEMyUGFyYW06OkNvcmVJbmRleDo6SVNfRkxFWF9GTEFHLCAvLy88IGZsZXhpYmxlIHN0cnVjdCBjb3JlLWluZGV4CisgICAgfTsKKworICAgIGlubGluZSBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpIHsgcmV0dXJuIFM6OkZpZWxkTGlzdCgpOyB9CisKKyAgICAvLyBkZWZhdWx0IGNvbnN0cnVjdG9yIG5lZWRlZCBiZWNhdXNlIG9mIHRoZSBkaXNhYmxlZCBjb3B5IGNvbnN0cnVjdG9yCisgICAgaW5saW5lIF9DMkZsZXhTdHJ1Y3RDaGVjaygpID0gZGVmYXVsdDsKKworcHJvdGVjdGVkOgorICAgIC8vIGNhbm5vdCBjb3B5IGZsZXhpYmxlIHBhcmFtcworICAgIF9DMkZsZXhTdHJ1Y3RDaGVjayhjb25zdCBfQzJGbGV4U3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwgVHlwZUZsYWdzPiAmKSA9IGRlbGV0ZTsKKyAgICBfQzJGbGV4U3RydWN0Q2hlY2smIG9wZXJhdG9yPSAoY29uc3QgX0MyRmxleFN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsIFR5cGVGbGFncz4gJikgPSBkZWxldGU7CisKKyAgICAvLyBjb25zdGFudHMgdXNlZCBmb3IgaGVscGVyIG1ldGhvZHMKKyAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICAvLy8gXGhpZGVpbml0aWFsaXplcgorICAgICAgICBGTEVYX1NJWkUgPSBfQzJGbGV4SGVscGVyPFM+OjpGTEVYX1NJWkUsIC8vLzwgc2l6ZSBvZiBmbGV4aWJsZSB0eXBlCisgICAgICAgIC8vLyBcaGlkZWluaXRpYWxpemVyCisgICAgICAgIE1BWF9TSVpFID0gKHVpbnQzMl90KXN0ZDo6bWluKChzaXplX3QpVUlOVDMyX01BWCwgU0laRV9NQVgpLCAvLyBUT0RPOiBpcyB0aGlzIGFsd2F5cyB1MzIgbWF4PworICAgICAgICAvLy8gXGhpZGVpbml0aWFsaXplcgorICAgICAgICBCQVNFX1NJWkUgPSBzaXplb2YoUykgKyBzaXplb2YoQzJQYXJhbSksIC8vLzwgc2l6ZSBvZiB0aGUgYmFzZSBwYXJhbQorICAgIH07CisKKyAgICAvLy8gcmV0dXJucyB0aGUgYWxsb2NhdGVkIHNpemUgb2YgdGhpcyBwYXJhbSB3aXRoIGZsZXhDb3VudCwgb3IgMCBpZiBpdCB3b3VsZCBvdmVyZmxvdy4KKyAgICBpbmxpbmUgc3RhdGljIHNpemVfdCBDYWxjU2l6ZShzaXplX3QgZmxleENvdW50LCBzaXplX3Qgc2l6ZSA9IEJBU0VfU0laRSkgeworICAgICAgICBpZiAoZmxleENvdW50IDw9IChNQVhfU0laRSAtIHNpemUpIC8gUzo6RkxFWF9TSVpFKSB7CisgICAgICAgICAgICByZXR1cm4gc2l6ZSArIFM6OkZMRVhfU0laRSAqIGZsZXhDb3VudDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLy8gZHluYW1pYyBuZXcgb3BlcmF0b3IgdXNhYmxlIGZvciBwYXJhbXMgb2YgdHlwZSBTCisgICAgaW5saW5lIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3Qgc2l6ZSwgc2l6ZV90IGZsZXhDb3VudCkgbm9leGNlcHQgeworICAgICAgICAvLyBUT0RPOiBhc3NlcnQoc2l6ZSA9PSBCQVNFX1NJWkUpOworICAgICAgICBzaXplID0gQ2FsY1NpemUoZmxleENvdW50LCBzaXplKTsKKyAgICAgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgICAgICByZXR1cm4gOjpvcGVyYXRvciBuZXcoc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorfTsKKworLy8vIERlZmluZSBGcm9tKCkgY2FzdCBvcGVyYXRvcnMgZm9yIHBhcmFtcy4KKyNkZWZpbmUgREVGSU5FX0NBU1RfT1BFUkFUT1JTKF9UeXBlKSBcCisgICAgaW5saW5lIHN0YXRpYyBfVHlwZSogRnJvbShDMlBhcmFtICpvdGhlcikgeyBcCisgICAgICAgIHJldHVybiAoX1R5cGUqKUMyUGFyYW06OklmU3VpdGFibGUoIFwKKyAgICAgICAgICAgICAgICBvdGhlciwgc2l6ZW9mKF9UeXBlKSwgX1R5cGU6OlBBUkFNX1RZUEUsIF9UeXBlOjpGTEVYX1NJWkUsIFwKKyAgICAgICAgICAgICAgICAoX1R5cGU6OlBBUkFNX1RZUEUgJiBUOjpJbmRleDo6RElSX1VOREVGSU5FRCkgIT0gVDo6SW5kZXg6OkRJUl9VTkRFRklORUQpOyBcCisgICAgfSBcCisgICAgaW5saW5lIHN0YXRpYyBjb25zdCBfVHlwZSogRnJvbShjb25zdCBDMlBhcmFtICpvdGhlcikgeyBcCisgICAgICAgIHJldHVybiBjb25zdF9jYXN0PGNvbnN0IF9UeXBlKj4oRnJvbShjb25zdF9jYXN0PEMyUGFyYW0gKj4ob3RoZXIpKSk7IFwKKyAgICB9IFwKKyAgICBpbmxpbmUgc3RhdGljIF9UeXBlKiBGcm9tKHN0ZDo6bnVsbHB0cl90KSB7IHJldHVybiBudWxscHRyOyB9IFwKKworLyoqCisgKiBEZWZpbmUgZmxleGlibGUgYWxsb2NhdG9ycyAoQWxsb2NTaGFyZWQgb3IgQWxsb2NVbmlxdWUpIGZvciBmbGV4aWJsZSBwYXJhbXMuCisgKiAgLSBQOjpBbGxvY1h5eihmbGV4Q291bnQsIGFyZ3MuLi4pOiBhbGxvY2F0ZSBmb3IgZ2l2ZW4gZmxleC1jb3VudC4gVGhpcyBtYXBzIHRvCisgKiAgICAgICAgICBUKGZsZXhDb3VudCwgYXJncy4uLilcCisgKgorICogQ2xhbmcgZG9lcyBub3Qgc3VwcG9ydCBhcmdzLi4uIGZvbGxvd2VkIGJ5IHRlbXBsYXRlZCBwYXJhbSBhcyBhcmdzLi4uIGVhdHMgaXQuIEhlbmNlLAorICogcHJvdmlkZSBzcGVjaWFsaXphdGlvbnMgd2hlcmUgdGhlIGluaXRpYWxpemVyIHJlcGxhY2VzIHRoZSBmbGV4Q291bnQuCisgKgorICogU3BlY2lhbGl6YXRpb25zIHRoYXQgZGVkdWNlIGZsZXhDb3VudDoKKyAqICAtIFA6OkFsbG9jWHl6KFRbXSwgYXJncy4uLik6IGFsbG9jYXRlIGZvciBzaXplIG9mIChhbmQgd2l0aCkgaW5pdCBhcnJheS4KKyAqICAtIFA6OkFsbG9jWHl6KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiwgYXJncy4uLik6IGFsbG9jYXRlIGZvciBzaXplIG9mIChhbmQgd2l0aCkgaW5pdGlhbGl6ZXIKKyAqICAgICAgICAgICAgbGlzdC4KKyAqICAtIFA6OkFsbG9jWHl6KHN0ZDo6dmVjdG9yPFQ+LCBhcmdzLi4uKTogYWxsb2NhdGUgZm9yIHNpemUgb2YgKGFuZCB3aXRoKSBpbml0IHZlY3Rvci4KKyAqICBUaGVzZSBzcGVjaWFsaXphdGlvbnMgbWFwIHRvIFQoZmxleENvdW50ID0gc2l6ZS1vZi1pbml0LCBhcmdzLi4uLCBpbml0KQorICovCisjZGVmaW5lIERFRklORV9GTEVYSUJMRV9BTExPQyhfVHlwZSwgUywgcHRyLCBQdHIpIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPiBcCisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnB0ciMjX3B0cjxfVHlwZT4gQWxsb2MjI1B0cihzaXplX3QgZmxleENvdW50LCBjb25zdCBBcmdzKCYuLi4gYXJncykpIHsgXAorICAgICAgICByZXR1cm4gc3RkOjpwdHIjI19wdHI8X1R5cGU+KG5ldyhmbGV4Q291bnQpIF9UeXBlKGZsZXhDb3VudCwgYXJncy4uLikpOyBcCisgICAgfSBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncywgdHlwZW5hbWUgVT10eXBlbmFtZSBTOjpGbGV4VHlwZT4gXAorICAgIGlubGluZSBzdGF0aWMgc3RkOjpwdHIjI19wdHI8X1R5cGU+IEFsbG9jIyNQdHIoIFwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxVPiAmaW5pdCwgY29uc3QgQXJncygmLi4uIGFyZ3MpKSB7IFwKKyAgICAgICAgcmV0dXJuIHN0ZDo6cHRyIyNfcHRyPF9UeXBlPihuZXcoaW5pdC5zaXplKCkpIF9UeXBlKGluaXQuc2l6ZSgpLCBhcmdzLi4uLCBpbml0KSk7IFwKKyAgICB9IFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzLCB0eXBlbmFtZSBVPXR5cGVuYW1lIFM6OkZsZXhUeXBlPiBcCisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnB0ciMjX3B0cjxfVHlwZT4gQWxsb2MjI1B0ciggXAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VT4gJmluaXQsIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgeyBcCisgICAgICAgIHJldHVybiBzdGQ6OnB0ciMjX3B0cjxfVHlwZT4obmV3KGluaXQuc2l6ZSgpKSBfVHlwZShpbml0LnNpemUoKSwgYXJncy4uLiwgaW5pdCkpOyBcCisgICAgfSBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncywgdHlwZW5hbWUgVT10eXBlbmFtZSBTOjpGbGV4VHlwZSwgdW5zaWduZWQgTj4gXAorICAgIGlubGluZSBzdGF0aWMgc3RkOjpwdHIjI19wdHI8X1R5cGU+IEFsbG9jIyNQdHIoY29uc3QgVSgmaW5pdClbTl0sIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgeyBcCisgICAgICAgIHJldHVybiBzdGQ6OnB0ciMjX3B0cjxfVHlwZT4obmV3KE4pIF9UeXBlKE4sIGFyZ3MuLi4sIGluaXQpKTsgXAorICAgIH0gXAorCisvKioKKyAqIERlZmluZSBmbGV4aWJsZSBtZXRob2RzIEFsbG9jU2hhcmVkLCBBbGxvY1VuaXF1ZSBhbmQgZmxleENvdW50LgorICovCisjZGVmaW5lIERFRklORV9GTEVYSUJMRV9NRVRIT0RTKF9UeXBlLCBTKSBcCisgICAgREVGSU5FX0ZMRVhJQkxFX0FMTE9DKF9UeXBlLCBTLCBzaGFyZWQsIFNoYXJlZCkgXAorICAgIERFRklORV9GTEVYSUJMRV9BTExPQyhfVHlwZSwgUywgdW5pcXVlLCBVbmlxdWUpIFwKKyAgICBpbmxpbmUgc2l6ZV90IGZsZXhDb3VudCgpIGNvbnN0IHsgXAorICAgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihfVHlwZSkgPT0gX1R5cGU6OkJBU0VfU0laRSwgImluY29ycmVjdCBCQVNFX1NJWkUiKTsgXAorICAgICAgICBzaXplX3Qgc3ogPSB0aGlzLT5zaXplKCk7IFwKKyAgICAgICAgaWYgKHN6ID49IHNpemVvZihfVHlwZSkpIHsgXAorICAgICAgICAgICAgcmV0dXJuIChzeiAtIHNpemVvZihfVHlwZSkpIC8gX1R5cGU6OkZMRVhfU0laRTsgXAorICAgICAgICB9IFwKKyAgICAgICAgcmV0dXJuIDA7IFwKKyAgICB9IFwKKworLy8vIE1hcmsgZmxleGlibGUgbWVtYmVyIHZhcmlhYmxlIGFuZCBtYWtlIHN0cnVjdHVyZSBmbGV4aWJsZS4KKyNkZWZpbmUgRkxFWChjbHMsIG0pIFwKKyAgICBDMl9ET19OT1RfQ09QWShjbHMpIFwKK3ByaXZhdGU6IFwKKyAgICBDMlBBUkFNX01BS0VfRlJJRU5EUyBcCisgICAgLyoqIFxpZiAwICovIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGZyaWVuZCBzdHJ1Y3QgX0MyRmxleEhlbHBlcjsgXAorcHVibGljOiBcCisgICAgdHlwZWRlZiBkZWNsdHlwZShtKSBfRmxleE1lbWJlclR5cGU7IFwKKyAgICAvKiBkZWZhdWx0IGNvbnN0cnVjdG9yIHdpdGggZmxleENvdW50ICovIFwKKyAgICBpbmxpbmUgY2xzKHNpemVfdCkgOiBjbHMoKSB7fSBcCisgICAgLyogY29uc3RleHByIHN0YXRpYyBfRmxleE1lbWJlclR5cGUgY2xzOjoqIGZsZXhNZW1iZXIgPSAmY2xzOjptOyAqLyBcCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQzJGbGV4SGVscGVyPF9GbGV4TWVtYmVyVHlwZT46OkZsZXhUeXBlIEZsZXhUeXBlOyBcCisgICAgc3RhdGljX2Fzc2VydChcCisgICAgICAgICAgICAhc3RkOjppc192b2lkPEZsZXhUeXBlPjo6dmFsdWUsIFwKKyAgICAgICAgICAgICJtZW1iZXIgaXMgbm90IGZsZXhpYmxlLCBvciBhIGZsZXhpYmxlIGFycmF5IG9mIGEgZmxleGlibGUgdHlwZSIpOyBcCisgICAgZW51bSA6IHVpbnQzMl90IHsgRkxFWF9TSVpFID0gX0MyRmxleEhlbHBlcjxfRmxleE1lbWJlclR5cGU+OjpGTEVYX1NJWkUgfTsgXAorICAgIC8qKiBcZW5kaWYgKi8gXAorCisvLy8gQH0KKworLyoqCisgKiBHbG9iYWwtcGFyYW1ldGVyIHRlbXBsYXRlLgorICoKKyAqIEJhc2UgdGVtcGxhdGUgdG8gZGVmaW5lIGEgZ2xvYmFsIHNldHRpbmcvdHVuaW5nIG9yIGluZm8gYmFzZWQgb24gYSBzdHJ1Y3R1cmUgYW5kCisgKiBhbiBvcHRpb25hbCBQYXJhbUluZGV4LiBHbG9iYWwgcGFyYW1ldGVycyBhcmUgbm90IHRpZWQgdG8gYSBwb3J0IChpbnB1dCBvciBvdXRwdXQpLgorICoKKyAqIFBhcmFtZXRlcnMgd3JhcCBzdHJ1Y3R1cmVzIGJ5IHByZXBlbmRpbmcgYSAocGFyYW1ldGVyKSBoZWFkZXIuIFRoZSBmaWVsZHMgb2YgdGhlIHdyYXBwZWQKKyAqIHN0cnVjdHVyZSBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHksIGFuZCBjb25zdHJ1Y3RvcnMgYW5kIHBvdGVudGlhbCBwdWJsaWMgbWV0aG9kcyBhcmUgYWxzbworICogd3JhcHBlZC4KKyAqCisgKiBcdHBhcmFtIFQgcGFyYW0gdHlwZSBDMlNldHRpbmcsIEMyVHVuaW5nIG9yIEMySW5mbworICogXHRwYXJhbSBTIHdyYXBwZWQgc3RydWN0dXJlCisgKiBcdHBhcmFtIFBhcmFtSW5kZXggb3B0aW9uYWwgcGFyYW1ldGVyIGluZGV4IG92ZXJyaWRlLiBNdXN0IGJlIHNwZWNpZmllZCBmb3IgYmFzZS9yZXVzZWQKKyAqIHN0cnVjdHVyZXMuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBQYXJhbUluZGV4PVM6OkNPUkVfSU5ERVgsIGNsYXNzIEZsZXg9dm9pZD4KK3N0cnVjdCBDMl9ISURFIEMyR2xvYmFsUGFyYW0gOiBwdWJsaWMgVCwgcHVibGljIFMsCisgICAgICAgIHB1YmxpYyBfQzJTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LCBUOjpQQVJBTV9LSU5EIHwgVDo6VHlwZTo6RElSX0dMT0JBTD4geworICAgIF9DMl9DT1JFX0lOREVYX09WRVJSSURFKFBhcmFtSW5kZXgpCitwcml2YXRlOgorICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxULCBTLCBQYXJhbUluZGV4PiBfVHlwZTsKKworcHVibGljOgorICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgaW5saW5lIEMyR2xvYmFsUGFyYW0oY29uc3QgQXJncygmLi4uIGFyZ3MpKSA6IFQoc2l6ZW9mKF9UeXBlKSwgX1R5cGU6OlBBUkFNX1RZUEUpLCBTKGFyZ3MuLi4pIHsgfQorCisgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKF9UeXBlKQorfTsKKworLyoqCisgKiBHbG9iYWwtcGFyYW1ldGVyIHRlbXBsYXRlIGZvciBmbGV4aWJsZSBzdHJ1Y3R1cmVzLgorICoKKyAqIEJhc2UgdGVtcGxhdGUgdG8gZGVmaW5lIGEgZ2xvYmFsIHNldHRpbmcvdHVuaW5nIG9yIGluZm8gYmFzZWQgb24gYSBmbGV4aWJsZSBzdHJ1Y3R1cmUgYW5kCisgKiBhbiBvcHRpb25hbCBQYXJhbUluZGV4LiBHbG9iYWwgcGFyYW1ldGVycyBhcmUgbm90IHRpZWQgdG8gYSBwb3J0IChpbnB1dCBvciBvdXRwdXQpLgorICoKKyAqIFx0cGFyYW0gVCBwYXJhbSB0eXBlIEMyU2V0dGluZywgQzJUdW5pbmcgb3IgQzJJbmZvCisgKiBcdHBhcmFtIFMgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKKyAqIFx0cGFyYW0gUGFyYW1JbmRleCBvcHRpb25hbCBwYXJhbWV0ZXIgaW5kZXggb3ZlcnJpZGUuIE11c3QgYmUgc3BlY2lmaWVkIGZvciBiYXNlL3JldXNlZAorICogICAgICAgICBzdHJ1Y3R1cmVzLgorICoKKyAqIFBhcmFtZXRlcnMgd3JhcCBzdHJ1Y3R1cmVzIGJ5IHByZXBlbmRpbmcgYSAocGFyYW1ldGVyKSBoZWFkZXIuIFRoZSBmaWVsZHMgYW5kIG1ldGhvZHMgb2YgZmxleGlibGUKKyAqIHN0cnVjdHVyZXMgY2FuIGJlIGFjY2Vzc2VkIHZpYSB0aGUgbSBtZW1iZXIgdmFyaWFibGU7IGhvd2V2ZXIsIHRoZSBjb25zdHJ1Y3RvcnMgb2YgdGhlIHN0cnVjdHVyZQorICogYXJlIHdyYXBwZWQgZGlyZWN0bHkuIChUaGlzIGlzIGJlY2F1c2UgZmxleGlibGUgdHlwZXMgY2Fubm90IGJlIHN1YmNsYXNzZWQuKQorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBpbnQgUGFyYW1JbmRleD4KK3N0cnVjdCBDMl9ISURFIEMyR2xvYmFsUGFyYW08VCwgUywgUGFyYW1JbmRleCwgSUZfRkxFWElCTEUoUyk+CisgICAgOiBwdWJsaWMgVCwgcHVibGljIF9DMkZsZXhTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LCBUOjpQQVJBTV9LSU5EIHwgVDo6VHlwZTo6RElSX0dMT0JBTD4geworcHJpdmF0ZToKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08VCwgUywgUGFyYW1JbmRleD4gX1R5cGU7CisKKyAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3Rvci4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgIGlubGluZSBDMkdsb2JhbFBhcmFtKHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBfVHlwZTo6UEFSQU1fVFlQRSksIG0oZmxleENvdW50LCBhcmdzLi4uKSB7IH0KKworcHVibGljOgorICAgIFMgbTsgLy8vPCB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQorCisgICAgREVGSU5FX0ZMRVhJQkxFX01FVEhPRFMoX1R5cGUsIFMpCisgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKF9UeXBlKQorfTsKKworLyoqCisgKiBQb3J0LXBhcmFtZXRlciB0ZW1wbGF0ZS4KKyAqCisgKiBCYXNlIHRlbXBsYXRlIHRvIGRlZmluZSBhIHBvcnQgc2V0dGluZy90dW5pbmcgb3IgaW5mbyBiYXNlZCBvbiBhIHN0cnVjdHVyZSBhbmQKKyAqIGFuIG9wdGlvbmFsIFBhcmFtSW5kZXguIFBvcnQgcGFyYW1ldGVycyBhcmUgdGllZCB0byBhIHBvcnQgKGlucHV0IG9yIG91dHB1dCksIGJ1dCBub3QgdG8gYQorICogc3BlY2lmaWMgc3RyZWFtLgorICoKKyAqIFx0cGFyYW0gVCBwYXJhbSB0eXBlIEMyU2V0dGluZywgQzJUdW5pbmcgb3IgQzJJbmZvCisgKiBcdHBhcmFtIFMgd3JhcHBlZCBzdHJ1Y3R1cmUKKyAqIFx0cGFyYW0gUGFyYW1JbmRleCBvcHRpb25hbCBwYXJhbWV0ZXIgaW5kZXggb3ZlcnJpZGUuIE11c3QgYmUgc3BlY2lmaWVkIGZvciBiYXNlL3JldXNlZAorICogICAgICAgICBzdHJ1Y3R1cmVzLgorICoKKyAqIFBhcmFtZXRlcnMgd3JhcCBzdHJ1Y3R1cmVzIGJ5IHByZXBlbmRpbmcgYSAocGFyYW1ldGVyKSBoZWFkZXIuIFRoZSBmaWVsZHMgb2YgdGhlIHdyYXBwZWQKKyAqIHN0cnVjdHVyZSBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHksIGFuZCBjb25zdHJ1Y3RvcnMgYW5kIHBvdGVudGlhbCBwdWJsaWMgbWV0aG9kcyBhcmUgYWxzbworICogd3JhcHBlZC4KKyAqCisgKiBUaGVyZSBhcmUgMyBmbGF2b3JzIG9mIHBvcnQgcGFyYW1ldGVyczogdW5zcGVjaWZpZWQsIGlucHV0IGFuZCBvdXRwdXQuIFBhcmFtZXRlcnMgd2l0aAorICogdW5zcGVjaWZpZWQgcG9ydCBleHBvc2UgYSBzZXRQb3J0IG1ldGhvZCwgYW5kIGFkZCBhbiBpbml0aWFsIHBvcnQgcGFyYW1ldGVyIHRvIHRoZSBjb25zdHJ1Y3Rvci4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgaW50IFBhcmFtSW5kZXg9Uzo6Q09SRV9JTkRFWCwgY2xhc3MgRmxleD12b2lkPgorc3RydWN0IEMyX0hJREUgQzJQb3J0UGFyYW0gOiBwdWJsaWMgVCwgcHVibGljIFMsCisgICAgICAgIHByaXZhdGUgX0MyU3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpESVJfVU5ERUZJTkVEPiB7CisgICAgX0MyX0NPUkVfSU5ERVhfT1ZFUlJJREUoUGFyYW1JbmRleCkKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBDMlBvcnRQYXJhbTxULCBTLCBQYXJhbUluZGV4PiBfVHlwZTsKKworcHVibGljOgorICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgIGlubGluZSBDMlBvcnRQYXJhbSgpIDogVChzaXplb2YoX1R5cGUpLCBfVHlwZTo6UEFSQU1fVFlQRSkgeyB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBzcGVjaWZ5aW5nIHBvcnQvZGlyZWN0aW9uLgorICAgIGlubGluZSBDMlBvcnRQYXJhbShib29sIF9vdXRwdXQsIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgOiBUKHNpemVvZihfVHlwZSksIF9vdXRwdXQgPyBvdXRwdXQ6OlBBUkFNX1RZUEUgOiBpbnB1dDo6UEFSQU1fVFlQRSksIFMoYXJncy4uLikgeyB9CisgICAgLy8vIFNldCBwb3J0L2RpcmVjdGlvbi4KKyAgICBpbmxpbmUgdm9pZCBzZXRQb3J0KGJvb2wgb3V0cHV0KSB7IEMyUGFyYW06OnNldFBvcnQob3V0cHV0KTsgfQorCisgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKF9UeXBlKQorCisgICAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBhbiBpbnB1dCBwb3J0IHBhcmFtZXRlci4KKyAgICBzdHJ1Y3QgaW5wdXQgOiBwdWJsaWMgVCwgcHVibGljIFMsCisgICAgICAgICAgICBwdWJsaWMgX0MyU3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpESVJfSU5QVVQ+IHsKKyAgICAgICAgX0MyX0NPUkVfSU5ERVhfT1ZFUlJJREUoUGFyYW1JbmRleCkKKyAgICAgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3IuCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgICAgIGlubGluZSBpbnB1dChjb25zdCBBcmdzKCYuLi4gYXJncykpIDogVChzaXplb2YoX1R5cGUpLCBpbnB1dDo6UEFSQU1fVFlQRSksIFMoYXJncy4uLikgeyB9CisKKyAgICAgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKGlucHV0KQorCisgICAgfTsKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgYW4gb3V0cHV0IHBvcnQgcGFyYW1ldGVyLgorICAgIHN0cnVjdCBvdXRwdXQgOiBwdWJsaWMgVCwgcHVibGljIFMsCisgICAgICAgICAgICBwdWJsaWMgX0MyU3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpESVJfT1VUUFVUPiB7CisgICAgICAgIF9DMl9DT1JFX0lOREVYX09WRVJSSURFKFBhcmFtSW5kZXgpCisgICAgICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yLgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgICAgICBpbmxpbmUgb3V0cHV0KGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgOiBUKHNpemVvZihfVHlwZSksIG91dHB1dDo6UEFSQU1fVFlQRSksIFMoYXJncy4uLikgeyB9CisKKyAgICAgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKG91dHB1dCkKKyAgICB9OworfTsKKworLyoqCisgKiBQb3J0LXBhcmFtZXRlciB0ZW1wbGF0ZSBmb3IgZmxleGlibGUgc3RydWN0dXJlcy4KKyAqCisgKiBCYXNlIHRlbXBsYXRlIHRvIGRlZmluZSBhIHBvcnQgc2V0dGluZy90dW5pbmcgb3IgaW5mbyBiYXNlZCBvbiBhIGZsZXhpYmxlIHN0cnVjdHVyZSBhbmQKKyAqIGFuIG9wdGlvbmFsIFBhcmFtSW5kZXguIFBvcnQgcGFyYW1ldGVycyBhcmUgdGllZCB0byBhIHBvcnQgKGlucHV0IG9yIG91dHB1dCksIGJ1dCBub3QgdG8gYQorICogc3BlY2lmaWMgc3RyZWFtLgorICoKKyAqIFx0cGFyYW0gVCBwYXJhbSB0eXBlIEMyU2V0dGluZywgQzJUdW5pbmcgb3IgQzJJbmZvCisgKiBcdHBhcmFtIFMgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKKyAqIFx0cGFyYW0gUGFyYW1JbmRleCBvcHRpb25hbCBwYXJhbWV0ZXIgaW5kZXggb3ZlcnJpZGUuIE11c3QgYmUgc3BlY2lmaWVkIGZvciBiYXNlL3JldXNlZAorICogICAgICAgICBzdHJ1Y3R1cmVzLgorICoKKyAqIFBhcmFtZXRlcnMgd3JhcCBzdHJ1Y3R1cmVzIGJ5IHByZXBlbmRpbmcgYSAocGFyYW1ldGVyKSBoZWFkZXIuIFRoZSBmaWVsZHMgYW5kIG1ldGhvZHMgb2YgZmxleGlibGUKKyAqIHN0cnVjdHVyZXMgY2FuIGJlIGFjY2Vzc2VkIHZpYSB0aGUgbSBtZW1iZXIgdmFyaWFibGU7IGhvd2V2ZXIsIHRoZSBjb25zdHJ1Y3RvcnMgb2YgdGhlIHN0cnVjdHVyZQorICogYXJlIHdyYXBwZWQgZGlyZWN0bHkuIChUaGlzIGlzIGJlY2F1c2UgZmxleGlibGUgdHlwZXMgY2Fubm90IGJlIHN1YmNsYXNzZWQuKQorICoKKyAqIFRoZXJlIGFyZSAzIGZsYXZvcnMgb2YgcG9ydCBwYXJhbWV0ZXJzOiB1bnNwZWNpZmllZCwgaW5wdXQgYW5kIG91dHB1dC4gUGFyYW1ldGVycyB3aXRoCisgKiB1bnNwZWNpZmllZCBwb3J0IGV4cG9zZSBhIHNldFBvcnQgbWV0aG9kLCBhbmQgYWRkIGFuIGluaXRpYWwgcG9ydCBwYXJhbWV0ZXIgdG8gdGhlIGNvbnN0cnVjdG9yLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBpbnQgUGFyYW1JbmRleD4KK3N0cnVjdCBDMl9ISURFIEMyUG9ydFBhcmFtPFQsIFMsIFBhcmFtSW5kZXgsIElGX0ZMRVhJQkxFKFMpPgorICAgIDogcHVibGljIFQsIHB1YmxpYyBfQzJGbGV4U3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwgVDo6UEFSQU1fS0lORCB8IFQ6OlR5cGU6OkRJUl9VTkRFRklORUQ+IHsKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBDMlBvcnRQYXJhbTxULCBTLCBQYXJhbUluZGV4PiBfVHlwZTsKKworICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yIGZvciBiYXNpYyBhbGxvY2F0aW9uOiBuZXcoZmxleENvdW50KSBQLgorICAgIGlubGluZSBDMlBvcnRQYXJhbShzaXplX3QgZmxleENvdW50KSA6IFQoX1R5cGU6OkNhbGNTaXplKGZsZXhDb3VudCksIF9UeXBlOjpQQVJBTV9UWVBFKSB7IH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBwb3J0L2RpcmVjdGlvbi4KKyAgICBpbmxpbmUgQzJQb3J0UGFyYW0oc2l6ZV90IGZsZXhDb3VudCwgYm9vbCBfb3V0cHV0LCBjb25zdCBBcmdzKCYuLi4gYXJncykpCisgICAgICAgIDogVChfVHlwZTo6Q2FsY1NpemUoZmxleENvdW50KSwgX291dHB1dCA/IG91dHB1dDo6UEFSQU1fVFlQRSA6IGlucHV0OjpQQVJBTV9UWVBFKSwKKyAgICAgICAgICBtKGZsZXhDb3VudCwgYXJncy4uLikgeyB9CisKK3B1YmxpYzoKKyAgICAvLy8gU2V0IHBvcnQvZGlyZWN0aW9uLgorICAgIGlubGluZSB2b2lkIHNldFBvcnQoYm9vbCBvdXRwdXQpIHsgQzJQYXJhbTo6c2V0UG9ydChvdXRwdXQpOyB9CisKKyAgICBTIG07IC8vLzwgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKKworICAgIERFRklORV9GTEVYSUJMRV9NRVRIT0RTKF9UeXBlLCBTKQorICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhfVHlwZSkKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgYW4gaW5wdXQgcG9ydCBwYXJhbWV0ZXIuCisgICAgc3RydWN0IGlucHV0IDogcHVibGljIFQsCisgICAgICAgICAgICBwdWJsaWMgX0MyRmxleFN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6RElSX0lOUFVUPiB7CisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIHBvcnQvZGlyZWN0aW9uLgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgICAgICBpbmxpbmUgaW5wdXQoc2l6ZV90IGZsZXhDb3VudCwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQorICAgICAgICAgICAgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBpbnB1dDo6UEFSQU1fVFlQRSksIG0oZmxleENvdW50LCBhcmdzLi4uKSB7IH0KKworICAgIHB1YmxpYzoKKyAgICAgICAgUyBtOyAvLy88IHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCisKKyAgICAgICAgREVGSU5FX0ZMRVhJQkxFX01FVEhPRFMoaW5wdXQsIFMpCisgICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhpbnB1dCkKKyAgICB9OworCisgICAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBhbiBvdXRwdXQgcG9ydCBwYXJhbWV0ZXIuCisgICAgc3RydWN0IG91dHB1dCA6IHB1YmxpYyBULAorICAgICAgICAgICAgcHVibGljIF9DMkZsZXhTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LCBUOjpQQVJBTV9LSU5EIHwgVDo6SW5kZXg6OkRJUl9PVVRQVVQ+IHsKKyAgICBwcml2YXRlOgorICAgICAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBhbHNvIHNwZWNpZnlpbmcgcG9ydC9kaXJlY3Rpb24uCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgICAgIGlubGluZSBvdXRwdXQoc2l6ZV90IGZsZXhDb3VudCwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQorICAgICAgICAgICAgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBvdXRwdXQ6OlBBUkFNX1RZUEUpLCBtKGZsZXhDb3VudCwgYXJncy4uLikgeyB9CisKKyAgICBwdWJsaWM6CisgICAgICAgIFMgbTsgLy8vPCB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQorCisgICAgICAgIERFRklORV9GTEVYSUJMRV9NRVRIT0RTKG91dHB1dCwgUykKKyAgICAgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKG91dHB1dCkKKyAgICB9OworfTsKKworLyoqCisgKiBTdHJlYW0tcGFyYW1ldGVyIHRlbXBsYXRlLgorICoKKyAqIEJhc2UgdGVtcGxhdGUgdG8gZGVmaW5lIGEgc3RyZWFtIHNldHRpbmcvdHVuaW5nIG9yIGluZm8gYmFzZWQgb24gYSBzdHJ1Y3R1cmUgYW5kCisgKiBhbiBvcHRpb25hbCBQYXJhbUluZGV4LiBTdHJlYW0gcGFyYW1ldGVycyBhcmUgdGllZCB0byBhIHNwZWNpZmljIHN0cmVhbSBvbiBhIHBvcnQgKGlucHV0IG9yCisgKiBvdXRwdXQpLgorICoKKyAqIFx0cGFyYW0gVCBwYXJhbSB0eXBlIEMyU2V0dGluZywgQzJUdW5pbmcgb3IgQzJJbmZvCisgKiBcdHBhcmFtIFMgd3JhcHBlZCBzdHJ1Y3R1cmUKKyAqIFx0cGFyYW0gUGFyYW1JbmRleCBvcHRpb25hbCBwYXJhbXRlciBpbmRleCBvdmVycmlkZS4gTXVzdCBiZSBzcGVjaWZpZWQgZm9yIGJhc2UvcmV1c2VkCisgKiAgICAgICAgIHN0cnVjdHVyZXMuCisgKgorICogUGFyYW1ldGVycyB3cmFwIHN0cnVjdHVyZXMgYnkgcHJlcGVuZGluZyBhIChwYXJhbWV0ZXIpIGhlYWRlci4gVGhlIGZpZWxkcyBvZiB0aGUgd3JhcHBlZAorICogc3RydWN0dXJlIGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSwgYW5kIGNvbnN0cnVjdG9ycyBhbmQgcG90ZW50aWFsIHB1YmxpYyBtZXRob2RzIGFyZSBhbHNvCisgKiB3cmFwcGVkLgorICoKKyAqIFRoZXJlIGFyZSAzIGZsYXZvcnMgb2Ygc3RyZWFtIHBhcmFtZXRlcnM6IHVuc3BlY2lmaWVkIHBvcnQsIGlucHV0IGFuZCBvdXRwdXQuIEFsbCBvZiB0aGVzZSBleHBvc2UKKyAqIGEgc2V0U3RyZWFtIG1ldGhvZCBhbmQgYW4gZXh0cmEgaW5pdGlhbCBzdHJlYW1JRCBwYXJhbWV0ZXIgZm9yIHRoZSBjb25zdHJ1Y3Rvci4gTW9yZW92ZXIsCisgKiBwYXJhbWV0ZXJzIHdpdGggdW5zcGVjaWZpZWQgcG9ydCBleHBvc2UgYSBzZXRQb3J0IG1ldGhvZCwgYW5kIGFkZCBhbiBhZGRpdGlvbmFsIGluaXRpYWwgcG9ydAorICogcGFyYW1ldGVyIHRvIHRoZSBjb25zdHJ1Y3Rvci4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgaW50IFBhcmFtSW5kZXg9Uzo6Q09SRV9JTkRFWCwgY2xhc3MgRmxleD12b2lkPgorc3RydWN0IEMyX0hJREUgQzJTdHJlYW1QYXJhbSA6IHB1YmxpYyBULCBwdWJsaWMgUywKKyAgICAgICAgcHJpdmF0ZSBfQzJTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LAorICAgICAgICAgICAgICAgIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6SVNfU1RSRUFNX0ZMQUcgfCBUOjpJbmRleDo6RElSX1VOREVGSU5FRD4geworICAgIF9DMl9DT1JFX0lOREVYX09WRVJSSURFKFBhcmFtSW5kZXgpCitwcml2YXRlOgorICAgIHR5cGVkZWYgQzJTdHJlYW1QYXJhbTxULCBTLCBQYXJhbUluZGV4PiBfVHlwZTsKKworcHVibGljOgorICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLiBQb3J0L2RpcmVjdGlvbiBhbmQgc3RyZWFtLUlEIGlzIHVuZGVmaW5lZC4KKyAgICBpbmxpbmUgQzJTdHJlYW1QYXJhbSgpIDogVChzaXplb2YoX1R5cGUpLCBfVHlwZTo6UEFSQU1fVFlQRSkgeyB9CisgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIHBvcnQvZGlyZWN0aW9uIGFuZAorICAgIC8vLyBzdHJlYW0tSUQuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICBpbmxpbmUgQzJTdHJlYW1QYXJhbShib29sIF9vdXRwdXQsIHVuc2lnbmVkIHN0cmVhbSwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQorICAgICAgICA6IFQoc2l6ZW9mKF9UeXBlKSwgX291dHB1dCA/IG91dHB1dDo6UEFSQU1fVFlQRSA6IGlucHV0OjpQQVJBTV9UWVBFLCBzdHJlYW0pLAorICAgICAgICAgIFMoYXJncy4uLikgeyB9CisgICAgLy8vIFNldCBwb3J0L2RpcmVjdGlvbi4KKyAgICBpbmxpbmUgdm9pZCBzZXRQb3J0KGJvb2wgb3V0cHV0KSB7IEMyUGFyYW06OnNldFBvcnQob3V0cHV0KTsgfQorICAgIC8vLyBTZXQgc3RyZWFtLWlkLiBccmV0dmFsIHRydWUgaWYgdGhlIHN0cmVhbS1pZCB3YXMgc3VjY2Vzc2Z1bGx5IHNldC4KKyAgICBpbmxpbmUgYm9vbCBzZXRTdHJlYW0odW5zaWduZWQgc3RyZWFtKSB7IHJldHVybiBDMlBhcmFtOjpzZXRTdHJlYW0oc3RyZWFtKTsgfQorCisgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKF9UeXBlKQorCisgICAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBhbiBpbnB1dCBzdHJlYW0gcGFyYW1ldGVyLgorICAgIHN0cnVjdCBpbnB1dCA6IHB1YmxpYyBULCBwdWJsaWMgUywKKyAgICAgICAgICAgIHB1YmxpYyBfQzJTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LAorICAgICAgICAgICAgICAgICAgICBUOjpQQVJBTV9LSU5EIHwgVDo6SW5kZXg6OklTX1NUUkVBTV9GTEFHIHwgVDo6VHlwZTo6RElSX0lOUFVUPiB7CisgICAgICAgIF9DMl9DT1JFX0lOREVYX09WRVJSSURFKFBhcmFtSW5kZXgpCisKKyAgICAgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuIFN0cmVhbS1JRCBpcyB1bmRlZmluZWQuCisgICAgICAgIGlubGluZSBpbnB1dCgpIDogVChzaXplb2YoX1R5cGUpLCBpbnB1dDo6UEFSQU1fVFlQRSkgeyB9CisgICAgICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBzdHJlYW0tSUQuCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgICAgIGlubGluZSBpbnB1dCh1bnNpZ25lZCBzdHJlYW0sIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgICAgIDogVChzaXplb2YoX1R5cGUpLCBpbnB1dDo6UEFSQU1fVFlQRSwgc3RyZWFtKSwgUyhhcmdzLi4uKSB7IH0KKyAgICAgICAgLy8vIFNldCBzdHJlYW0taWQuIFxyZXR2YWwgdHJ1ZSBpZiB0aGUgc3RyZWFtLWlkIHdhcyBzdWNjZXNzZnVsbHkgc2V0LgorICAgICAgICBpbmxpbmUgYm9vbCBzZXRTdHJlYW0odW5zaWduZWQgc3RyZWFtKSB7IHJldHVybiBDMlBhcmFtOjpzZXRTdHJlYW0oc3RyZWFtKTsgfQorCisgICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhpbnB1dCkKKyAgICB9OworCisgICAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBhbiBvdXRwdXQgc3RyZWFtIHBhcmFtZXRlci4KKyAgICBzdHJ1Y3Qgb3V0cHV0IDogcHVibGljIFQsIHB1YmxpYyBTLAorICAgICAgICAgICAgcHVibGljIF9DMlN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsCisgICAgICAgICAgICAgICAgICAgIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6SVNfU1RSRUFNX0ZMQUcgfCBUOjpUeXBlOjpESVJfT1VUUFVUPiB7CisgICAgICAgIF9DMl9DT1JFX0lOREVYX09WRVJSSURFKFBhcmFtSW5kZXgpCisKKyAgICAgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuIFN0cmVhbS1JRCBpcyB1bmRlZmluZWQuCisgICAgICAgIGlubGluZSBvdXRwdXQoKSA6IFQoc2l6ZW9mKF9UeXBlKSwgb3V0cHV0OjpQQVJBTV9UWVBFKSB7IH0KKyAgICAgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIHN0cmVhbS1JRC4KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICAgICAgaW5saW5lIG91dHB1dCh1bnNpZ25lZCBzdHJlYW0sIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgICAgIDogVChzaXplb2YoX1R5cGUpLCBvdXRwdXQ6OlBBUkFNX1RZUEUsIHN0cmVhbSksIFMoYXJncy4uLikgeyB9CisgICAgICAgIC8vLyBTZXQgc3RyZWFtLWlkLiBccmV0dmFsIHRydWUgaWYgdGhlIHN0cmVhbS1pZCB3YXMgc3VjY2Vzc2Z1bGx5IHNldC4KKyAgICAgICAgaW5saW5lIGJvb2wgc2V0U3RyZWFtKHVuc2lnbmVkIHN0cmVhbSkgeyByZXR1cm4gQzJQYXJhbTo6c2V0U3RyZWFtKHN0cmVhbSk7IH0KKworICAgICAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMob3V0cHV0KQorICAgIH07Cit9OworCisvKioKKyAqIFN0cmVhbS1wYXJhbWV0ZXIgdGVtcGxhdGUgZm9yIGZsZXhpYmxlIHN0cnVjdHVyZXMuCisgKgorICogQmFzZSB0ZW1wbGF0ZSB0byBkZWZpbmUgYSBzdHJlYW0gc2V0dGluZy90dW5pbmcgb3IgaW5mbyBiYXNlZCBvbiBhIGZsZXhpYmxlIHN0cnVjdHVyZSBhbmQKKyAqIGFuIG9wdGlvbmFsIFBhcmFtSW5kZXguIFN0cmVhbSBwYXJhbWV0ZXJzIGFyZSB0aWVkIHRvIGEgc3BlY2lmaWMgc3RyZWFtIG9uIGEgcG9ydCAoaW5wdXQgb3IKKyAqIG91dHB1dCkuCisgKgorICogXHRwYXJhbSBUIHBhcmFtIHR5cGUgQzJTZXR0aW5nLCBDMlR1bmluZyBvciBDMkluZm8KKyAqIFx0cGFyYW0gUyB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQorICogXHRwYXJhbSBQYXJhbUluZGV4IG9wdGlvbmFsIHBhcmFtZXRlciBpbmRleCBvdmVycmlkZS4gTXVzdCBiZSBzcGVjaWZpZWQgZm9yIGJhc2UvcmV1c2VkCisgKiAgICAgICAgIHN0cnVjdHVyZXMuCisgKgorICogUGFyYW1ldGVycyB3cmFwIHN0cnVjdHVyZXMgYnkgcHJlcGVuZGluZyBhIChwYXJhbWV0ZXIpIGhlYWRlci4gVGhlIGZpZWxkcyBhbmQgbWV0aG9kcyBvZiBmbGV4aWJsZQorICogc3RydWN0dXJlcyBjYW4gYmUgYWNjZXNzZWQgdmlhIHRoZSBtIG1lbWJlciB2YXJpYWJsZTsgaG93ZXZlciwgdGhlIGNvbnN0cnVjdG9ycyBvZiB0aGUgc3RydWN0dXJlCisgKiBhcmUgd3JhcHBlZCBkaXJlY3RseS4gKFRoaXMgaXMgYmVjYXVzZSBmbGV4aWJsZSB0eXBlcyBjYW5ub3QgYmUgc3ViY2xhc3NlZC4pCisgKgorICogVGhlcmUgYXJlIDMgZmxhdm9ycyBvZiBzdHJlYW0gcGFyYW1ldGVyczogdW5zcGVjaWZpZWQgcG9ydCwgaW5wdXQgYW5kIG91dHB1dC4gQWxsIG9mIHRoZXNlIGV4cG9zZQorICogYSBzZXRTdHJlYW0gbWV0aG9kIGFuZCBhbiBleHRyYSBpbml0aWFsIHN0cmVhbUlEIHBhcmFtZXRlciBmb3IgdGhlIGNvbnN0cnVjdG9yLiBNb3Jlb3ZlciwKKyAqIHBhcmFtZXRlcnMgd2l0aCB1bnNwZWNpZmllZCBwb3J0IGV4cG9zZSBhIHNldFBvcnQgbWV0aG9kLCBhbmQgYWRkIGFuIGFkZGl0aW9uYWwgaW5pdGlhbCBwb3J0CisgKiBwYXJhbWV0ZXIgdG8gdGhlIGNvbnN0cnVjdG9yLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBpbnQgUGFyYW1JbmRleD4KK3N0cnVjdCBDMl9ISURFIEMyU3RyZWFtUGFyYW08VCwgUywgUGFyYW1JbmRleCwgSUZfRkxFWElCTEUoUyk+CisgICAgOiBwdWJsaWMgVCwKKyAgICAgIHB1YmxpYyBfQzJGbGV4U3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwKKyAgICAgICAgICAgICAgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpJU19TVFJFQU1fRkxBRyB8IFQ6OkluZGV4OjpESVJfVU5ERUZJTkVEPiB7Citwcml2YXRlOgorICAgIHR5cGVkZWYgQzJTdHJlYW1QYXJhbTxULCBTLCBQYXJhbUluZGV4PiBfVHlwZTsKKyAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4gUG9ydC9kaXJlY3Rpb24gYW5kIHN0cmVhbS1JRCBpcyB1bmRlZmluZWQuCisgICAgaW5saW5lIEMyU3RyZWFtUGFyYW0oc2l6ZV90IGZsZXhDb3VudCkgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBfVHlwZTo6UEFSQU1fVFlQRSwgMHUpIHsgfQorICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBwb3J0L2RpcmVjdGlvbiBhbmQKKyAgICAvLy8gc3RyZWFtLUlELgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgaW5saW5lIEMyU3RyZWFtUGFyYW0oc2l6ZV90IGZsZXhDb3VudCwgYm9vbCBfb3V0cHV0LCB1bnNpZ25lZCBzdHJlYW0sIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBfb3V0cHV0ID8gb3V0cHV0OjpQQVJBTV9UWVBFIDogaW5wdXQ6OlBBUkFNX1RZUEUsIHN0cmVhbSksCisgICAgICAgICAgbShmbGV4Q291bnQsIGFyZ3MuLi4pIHsgfQorCitwdWJsaWM6CisgICAgUyBtOyAvLy88IHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCisKKyAgICAvLy8gU2V0IHBvcnQvZGlyZWN0aW9uLgorICAgIGlubGluZSB2b2lkIHNldFBvcnQoYm9vbCBvdXRwdXQpIHsgQzJQYXJhbTo6c2V0UG9ydChvdXRwdXQpOyB9CisgICAgLy8vIFNldCBzdHJlYW0taWQuIFxyZXR2YWwgdHJ1ZSBpZiB0aGUgc3RyZWFtLWlkIHdhcyBzdWNjZXNzZnVsbHkgc2V0LgorICAgIGlubGluZSBib29sIHNldFN0cmVhbSh1bnNpZ25lZCBzdHJlYW0pIHsgcmV0dXJuIEMyUGFyYW06OnNldFN0cmVhbShzdHJlYW0pOyB9CisKKyAgICBERUZJTkVfRkxFWElCTEVfTUVUSE9EUyhfVHlwZSwgUykKKyAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoX1R5cGUpCisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGFuIGlucHV0IHN0cmVhbSBwYXJhbWV0ZXIuCisgICAgc3RydWN0IGlucHV0IDogcHVibGljIFQsCisgICAgICAgICAgICBwdWJsaWMgX0MyRmxleFN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsCisgICAgICAgICAgICAgICAgICAgIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6SVNfU1RSRUFNX0ZMQUcgfCBUOjpUeXBlOjpESVJfSU5QVVQ+IHsKKyAgICBwcml2YXRlOgorICAgICAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4gU3RyZWFtLUlEIGlzIHVuZGVmaW5lZC4KKyAgICAgICAgaW5saW5lIGlucHV0KHNpemVfdCBmbGV4Q291bnQpIDogVChfVHlwZTo6Q2FsY1NpemUoZmxleENvdW50KSwgaW5wdXQ6OlBBUkFNX1RZUEUpIHsgfQorICAgICAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBhbHNvIHNwZWNpZnlpbmcgc3RyZWFtLUlELgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgICAgICBpbmxpbmUgaW5wdXQoc2l6ZV90IGZsZXhDb3VudCwgdW5zaWduZWQgc3RyZWFtLCBjb25zdCBBcmdzKCYuLi4gYXJncykpCisgICAgICAgICAgICA6IFQoX1R5cGU6OkNhbGNTaXplKGZsZXhDb3VudCksIGlucHV0OjpQQVJBTV9UWVBFLCBzdHJlYW0pLCBtKGZsZXhDb3VudCwgYXJncy4uLikgeyB9CisKKyAgICBwdWJsaWM6CisgICAgICAgIFMgbTsgLy8vPCB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQorCisgICAgICAgIC8vLyBTZXQgc3RyZWFtLWlkLiBccmV0dmFsIHRydWUgaWYgdGhlIHN0cmVhbS1pZCB3YXMgc3VjY2Vzc2Z1bGx5IHNldC4KKyAgICAgICAgaW5saW5lIGJvb2wgc2V0U3RyZWFtKHVuc2lnbmVkIHN0cmVhbSkgeyByZXR1cm4gQzJQYXJhbTo6c2V0U3RyZWFtKHN0cmVhbSk7IH0KKworICAgICAgICBERUZJTkVfRkxFWElCTEVfTUVUSE9EUyhpbnB1dCwgUykKKyAgICAgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKGlucHV0KQorICAgIH07CisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGFuIG91dHB1dCBzdHJlYW0gcGFyYW1ldGVyLgorICAgIHN0cnVjdCBvdXRwdXQgOiBwdWJsaWMgVCwKKyAgICAgICAgICAgIHB1YmxpYyBfQzJGbGV4U3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpJU19TVFJFQU1fRkxBRyB8IFQ6OlR5cGU6OkRJUl9PVVRQVVQ+IHsKKyAgICBwcml2YXRlOgorICAgICAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4gU3RyZWFtLUlEIGlzIHVuZGVmaW5lZC4KKyAgICAgICAgaW5saW5lIG91dHB1dChzaXplX3QgZmxleENvdW50KSA6IFQoX1R5cGU6OkNhbGNTaXplKGZsZXhDb3VudCksIG91dHB1dDo6UEFSQU1fVFlQRSkgeyB9CisgICAgICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBzdHJlYW0tSUQuCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgICAgIGlubGluZSBvdXRwdXQoc2l6ZV90IGZsZXhDb3VudCwgdW5zaWduZWQgc3RyZWFtLCBjb25zdCBBcmdzKCYuLi4gYXJncykpCisgICAgICAgICAgICA6IFQoX1R5cGU6OkNhbGNTaXplKGZsZXhDb3VudCksIG91dHB1dDo6UEFSQU1fVFlQRSwgc3RyZWFtKSwgbShmbGV4Q291bnQsIGFyZ3MuLi4pIHsgfQorCisgICAgcHVibGljOgorICAgICAgICBTIG07IC8vLzwgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKKworICAgICAgICAvLy8gU2V0IHN0cmVhbS1pZC4gXHJldHZhbCB0cnVlIGlmIHRoZSBzdHJlYW0taWQgd2FzIHN1Y2Nlc3NmdWxseSBzZXQuCisgICAgICAgIGlubGluZSBib29sIHNldFN0cmVhbSh1bnNpZ25lZCBzdHJlYW0pIHsgcmV0dXJuIEMyUGFyYW06OnNldFN0cmVhbShzdHJlYW0pOyB9CisKKyAgICAgICAgREVGSU5FX0ZMRVhJQkxFX01FVEhPRFMob3V0cHV0LCBTKQorICAgICAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMob3V0cHV0KQorICAgIH07Cit9OworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT0gU0lNUExFIFZBTFVFIFBBUkFNRVRFUlMgPT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogXGluZ3JvdXAgaW50ZXJuYWwKKyAqIEEgc3RydWN0dXJlIHRlbXBsYXRlIGVuY2Fwc3VsYXRpbmcgYSBzaW5nbGUgZWxlbWVudCB3aXRoIGRlZmF1bHQgY29uc3RydWN0b3JzIGFuZCBubyBjb3JlLWluZGV4LgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IEMyU2ltcGxlVmFsdWVTdHJ1Y3QgeworICAgIFQgdmFsdWU7IC8vLzwgc2ltcGxlIHZhbHVlIG9mIHRoZSBzdHJ1Y3R1cmUKKyAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgIGlubGluZSBDMlNpbXBsZVZhbHVlU3RydWN0KCkgPSBkZWZhdWx0OworICAgIC8vIENvbnN0cnVjdG9yIHdpdGggYW4gaW5pdGlhbCB2YWx1ZS4KKyAgICBpbmxpbmUgQzJTaW1wbGVWYWx1ZVN0cnVjdChUIHZhbHVlKSA6IHZhbHVlKHZhbHVlKSB7fQorICAgIERFRklORV9CQVNFX0MyU1RSVUNUKFNpbXBsZVZhbHVlKQorfTsKKworLy8gVE9ETzogbW92ZSB0aGlzIGFuZCBuZXh0IHRvIHNvbWUgZ2VuZXJpYyBwbGFjZQorLyoqCisgKiBJbnRlcmZhY2UgdG8gYSBibG9jayBvZiAobWFwcGVkKSBtZW1vcnkgY29udGFpbmluZyBhbiBhcnJheSBvZiBzb21lIHR5cGUgKFQpLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IEMyTWVtb3J5QmxvY2sgeworICAgIC8vLyBccmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgYmxvY2suCisgICAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIGNvbnN0ID0gMDsKKyAgICAvLy8gXHJldHVybnMgYSBjb25zdCBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGlzIGJsb2NrLiBDYXJlIG11c3QgYmUgdGFrZW4gdG8gbm90IHJlYWQgb3V0c2lkZQorICAgIC8vLyB0aGUgYmxvY2suCisgICAgdmlydHVhbCBjb25zdCBUICpkYXRhKCkgY29uc3QgPSAwOyAvLyBUT0RPOiBzaG91bGQgdGhpcyBiZSBmcmllbmQgYWNjZXNzIG9ubHkgaW4gc29tZSBDMk1lbW9yeSBtb2R1bGU/CisgICAgLy8vIFxyZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhpcyBibG9jay4gQ2FyZSBtdXN0IGJlIHRha2VuIHRvIG5vdCByZWFkIG9yIHdyaXRlCisgICAgLy8vIG91dHNpZGUgdGhlIGJsb2NrLgorICAgIGlubGluZSBUICpkYXRhKCkgeyByZXR1cm4gY29uc3RfY2FzdDxUKj4oY29uc3RfY2FzdDxjb25zdCBDMk1lbW9yeUJsb2NrKj4odGhpcyktPmRhdGEoKSk7IH0KKworcHJvdGVjdGVkOgorICAgIC8vIFRPRE86IGZvciBub3cgaXQgc2hvdWxkIG5ldmVyIGJlIGRlbGV0ZWQgYXMgQzJNZW1vcnlCbG9jaworICAgIHZpcnR1YWwgfkMyTWVtb3J5QmxvY2soKSA9IGRlZmF1bHQ7Cit9OworCisvKioKKyAqIEludGVyZmFjZSB0byBhIGJsb2NrIG9mIG1lbW9yeSBjb250YWluaW5nIGEgY29uc3RhbnQgKGNvbnN0ZXhwcikgYXJyYXkgb2Ygc29tZSB0eXBlIChUKS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBDMkNvbnN0TWVtb3J5QmxvY2sgOiBwdWJsaWMgQzJNZW1vcnlCbG9jazxUPiB7CisgICAgdmlydHVhbCBjb25zdCBUICogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIF9tRGF0YTsgfQorICAgIHZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBfbVNpemU7IH0KKworICAgIC8vLyBDb25zdHJ1Y3Rvci4KKyAgICB0ZW1wbGF0ZTx1bnNpZ25lZCBOPgorICAgIGlubGluZSBjb25zdGV4cHIgQzJDb25zdE1lbW9yeUJsb2NrKGNvbnN0IFQoJmluaXQpW05dKSA6IF9tRGF0YShpbml0KSwgX21TaXplKE4pIHt9CisKK3ByaXZhdGU6CisgICAgY29uc3QgVCAqX21EYXRhOworICAgIGNvbnN0IHNpemVfdCBfbVNpemU7Cit9OworCisvLy8gXGFkZHRvZ3JvdXAgaW50ZXJuYWwKKy8vLyBAeworCisvLy8gSGVscGVyIGNsYXNzIHRvIGluaXRpYWxpemUgZmxleGlibGUgYXJyYXlzIHdpdGggdmFyaW91cyBpbml0YWxpemVycy4KK3N0cnVjdCBfQzJWYWx1ZUFycmF5SGVscGVyIHsKKyAgICAvLyBjaGFyW10tcyBhcmUgdXNlZCBhcyBudWxsIHRlcm1pbmF0ZWQgc3RyaW5ncywgc28gdGhlIGxhc3QgZWxlbWVudCBpcyBuZXZlciBpbml0ZWQuCisKKyAgICAvLy8gSW5pdGlhbGl6ZSBhIGZsZXhpYmxlIGFycmF5IHVzaW5nIGEgY29uc3RleHByIG1lbW9yeSBibG9jay4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXRpYyB2b2lkIGluaXQoVCgmYXJyYXkpW10sIHNpemVfdCBhcnJheUxlbiwgY29uc3QgQzJNZW1vcnlCbG9jazxUPiAmYmxvY2spIHsKKyAgICAgICAgLy8gcmVzZXJ2ZSBsYXN0IGVsZW1lbnQgZm9yIHRlcm1pbmFsIDAgZm9yIHN0cmluZ3MKKyAgICAgICAgaWYgKGFycmF5TGVuICYmIHN0ZDo6aXNfc2FtZTxULCBjaGFyPjo6dmFsdWUpIHsKKyAgICAgICAgICAgIC0tYXJyYXlMZW47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJsb2NrLmRhdGEoKSkgeworICAgICAgICAgICAgbWVtY3B5KGFycmF5LCBibG9jay5kYXRhKCksIHN0ZDo6bWluKGFycmF5TGVuLCBibG9jay5zaXplKCkpICogc2l6ZW9mKFQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBJbml0aWFsaXplIGEgZmxleGlibGUgYXJyYXkgdXNpbmcgYW4gaW5pdGlhbGl6ZXIgbGlzdC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXRpYyB2b2lkIGluaXQoVCgmYXJyYXkpW10sIHNpemVfdCBhcnJheUxlbiwgY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+ICZpbml0KSB7CisgICAgICAgIHNpemVfdCBpeCA9IDA7CisgICAgICAgIC8vIHJlc2VydmUgbGFzdCBlbGVtZW50IGZvciB0ZXJtaW5hbCAwIGZvciBzdHJpbmdzCisgICAgICAgIGlmIChhcnJheUxlbiAmJiBzdGQ6OmlzX3NhbWU8VCwgY2hhcj46OnZhbHVlKSB7CisgICAgICAgICAgICAtLWFycmF5TGVuOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgVCAmaXRlbSA6IGluaXQpIHsKKyAgICAgICAgICAgIGlmIChpeCA9PSBhcnJheUxlbikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXJyYXlbaXgrK10gPSBpdGVtOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIEluaXRpYWxpemUgYSBmbGV4aWJsZSBhcnJheSB1c2luZyBhIHZlY3Rvci4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXRpYyB2b2lkIGluaXQoVCgmYXJyYXkpW10sIHNpemVfdCBhcnJheUxlbiwgY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJmluaXQpIHsKKyAgICAgICAgc2l6ZV90IGl4ID0gMDsKKyAgICAgICAgLy8gcmVzZXJ2ZSBsYXN0IGVsZW1lbnQgZm9yIHRlcm1pbmFsIDAgZm9yIHN0cmluZ3MKKyAgICAgICAgaWYgKGFycmF5TGVuICYmIHN0ZDo6aXNfc2FtZTxULCBjaGFyPjo6dmFsdWUpIHsKKyAgICAgICAgICAgIC0tYXJyYXlMZW47CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBUICZpdGVtIDogaW5pdCkgeworICAgICAgICAgICAgaWYgKGl4ID09IGFycmF5TGVuKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhcnJheVtpeCsrXSA9IGl0ZW07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gSW5pdGlhbGl6ZSBhIGZsZXhpYmxlIGFycmF5IHVzaW5nIGFub3RoZXIgZmxleGlibGUgYXJyYXkuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdW5zaWduZWQgTj4KKyAgICBzdGF0aWMgdm9pZCBpbml0KFQoJmFycmF5KVtdLCBzaXplX3QgYXJyYXlMZW4sIGNvbnN0IFQoJnN0cilbTl0pIHsKKyAgICAgICAgLy8gcmVzZXJ2ZSBsYXN0IGVsZW1lbnQgZm9yIHRlcm1pbmFsIDAgZm9yIHN0cmluZ3MKKyAgICAgICAgaWYgKGFycmF5TGVuICYmIHN0ZDo6aXNfc2FtZTxULCBjaGFyPjo6dmFsdWUpIHsKKyAgICAgICAgICAgIC0tYXJyYXlMZW47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFycmF5TGVuKSB7CisgICAgICAgICAgICBtZW1jcHkoYXJyYXksIHN0ciwgc3RkOjptaW4oYXJyYXlMZW4sIChzaXplX3QpTikgKiBzaXplb2YoVCkpOworICAgICAgICB9CisgICAgfQorfTsKKworLyoqCisgKiBTcGVjaWFsaXphdGlvbiBmb3IgYSBmbGV4aWJsZSBibG9iIGFuZCBzdHJpbmcgYXJyYXlzLiBBIHN0cnVjdHVyZSB0ZW1wbGF0ZSBlbmNhcHN1bGF0aW5nIGEgc2luZ2xlCisgKiBmbGV4aWJsZSBhcnJheSBtZW1iZXIgd2l0aCBkZWZhdWx0IGZsZXhpYmxlIGNvbnN0cnVjdG9ycyBhbmQgbm8gY29yZS1pbmRleC4gVGhpcyB0eXBlIGNhbm5vdCBiZQorICogY29uc3RydWN0ZWQgb24gaXRzIG93biBhcyBpdCdzIHNpemUgaXMgMC4KKyAqCisgKiBcaW50ZXJuYWwgVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBDMlNpbXBsZUFycmF5U3RydWN0PFRbXT4gc2ltcGx5IGJlY2F1c2UgaXRzIG1lbWJlciBoYXMgdGhlIG5hbWUKKyAqIGFzIHZhbHVlIHRvIHJlZmxlY3QgdGhpcyBpcyBhIHNpbmdsZSB2YWx1ZS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBDMlNpbXBsZVZhbHVlU3RydWN0PFRbXT4geworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPFQsIGNoYXI+Ojp2YWx1ZSB8fCBzdGQ6OmlzX3NhbWU8VCwgdWludDhfdD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgIkMyU2ltcGxlVmFsdWVTdHJ1Y3Q8VFtdPiBpcyBvbmx5IGZvciBCTE9CIG9yIFNUUklORyIpOworICAgIFQgdmFsdWVbXTsKKworICAgIGlubGluZSBDMlNpbXBsZVZhbHVlU3RydWN0KCkgPSBkZWZhdWx0OworICAgIERFRklORV9CQVNFX0MyU1RSVUNUKFNpbXBsZVZhbHVlKQorICAgIEZMRVgoQzJTaW1wbGVWYWx1ZVN0cnVjdCwgdmFsdWUpCisKK3ByaXZhdGU6CisgICAgaW5saW5lIEMyU2ltcGxlVmFsdWVTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgY29uc3QgQzJNZW1vcnlCbG9jazxUPiAmYmxvY2spIHsKKyAgICAgICAgX0MyVmFsdWVBcnJheUhlbHBlcjo6aW5pdCh2YWx1ZSwgZmxleENvdW50LCBibG9jayk7CisgICAgfQorCisgICAgaW5saW5lIEMyU2ltcGxlVmFsdWVTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+ICZpbml0KSB7CisgICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQodmFsdWUsIGZsZXhDb3VudCwgaW5pdCk7CisgICAgfQorCisgICAgaW5saW5lIEMyU2ltcGxlVmFsdWVTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJmluaXQpIHsKKyAgICAgICAgX0MyVmFsdWVBcnJheUhlbHBlcjo6aW5pdCh2YWx1ZSwgZmxleENvdW50LCBpbml0KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx1bnNpZ25lZCBOPgorICAgIGlubGluZSBDMlNpbXBsZVZhbHVlU3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IFQoJmluaXQpW05dKSB7CisgICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQodmFsdWUsIGZsZXhDb3VudCwgaW5pdCk7CisgICAgfQorfTsKKworLy8vIEB9CisKKy8qKgorICogQSBzdHJ1Y3R1cmUgdGVtcGxhdGUgZW5jYXBzdWxhdGluZyBhIHNpbmdsZSBmbGV4aWJsZSBhcnJheSBlbGVtZW50IG9mIGEgc3BlY2lmaWMgdHlwZSAoVCkgd2l0aAorICogZGVmYXVsdCBjb25zdHJ1Y3RvcnMgYW5kIG5vIGNvcmUtaW5kZXguIFRoaXMgdHlwZSBjYW5ub3QgYmUgY29uc3RydWN0ZWQgb24gaXRzIG93biBhcyBpdCdzIHNpemUKKyAqIGlzIDAuIEluc3RlYWQsIGl0IGlzIG1lYW50IHRvIGJlIHVzZWQgYXMgYSBwYXJhbWV0ZXIsIGUuZy4KKyAqCisgKiAgIHR5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8QzJNeUZhbmN5U3RydWN0PiwKKyAqICAgICAgICAgICBrUGFyYW1JbmRleE15RmFuY3lBcnJheVN0cmVhbVBhcmFtPiBDMk15RmFuY3lBcnJheVN0cmVhbUluZm87CisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQzJTaW1wbGVBcnJheVN0cnVjdCB7CisgICAgc3RhdGljX2Fzc2VydCghc3RkOjppc19zYW1lPFQsIGNoYXI+Ojp2YWx1ZSAmJiAhc3RkOjppc19zYW1lPFQsIHVpbnQ4X3Q+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJ1c2UgQzJTaW1wbGVWYWx1ZVN0cnVjdDxUW10+IGlzIGZvciBCTE9CIG9yIFNUUklORyIpOworCisgICAgVCB2YWx1ZXNbXTsgLy8vPCBhcnJheSBtZW1iZXIKKyAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgorICAgIGlubGluZSBDMlNpbXBsZUFycmF5U3RydWN0KCkgPSBkZWZhdWx0OworICAgIERFRklORV9CQVNFX0ZMRVhfQzJTVFJVQ1QoU2ltcGxlQXJyYXksIHZhbHVlcykKKyAgICAvL0ZMRVgoQzJTaW1wbGVBcnJheVN0cnVjdCwgdmFsdWVzKQorCitwcml2YXRlOgorICAgIC8vLyBDb25zdHJ1Y3QgZnJvbSBhIEMyTWVtb3J5QmxvY2suCisgICAgLy8vIFVzZWQgb25seSBieSB0aGUgZmxleGlibGUgcGFyYW1ldGVyIGFsbG9jYXRvcnMgKEFsbG9jVW5pcXVlICYgQWxsb2NTaGFyZWQpLgorICAgIGlubGluZSBDMlNpbXBsZUFycmF5U3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IEMyTWVtb3J5QmxvY2s8VD4gJmJsb2NrKSB7CisgICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQodmFsdWVzLCBmbGV4Q291bnQsIGJsb2NrKTsKKyAgICB9CisKKyAgICAvLy8gQ29uc3RydWN0IGZyb20gYW4gaW5pdGlhbGl6ZXIgbGlzdC4KKyAgICAvLy8gVXNlZCBvbmx5IGJ5IHRoZSBmbGV4aWJsZSBwYXJhbWV0ZXIgYWxsb2NhdG9ycyAoQWxsb2NVbmlxdWUgJiBBbGxvY1NoYXJlZCkuCisgICAgaW5saW5lIEMyU2ltcGxlQXJyYXlTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+ICZpbml0KSB7CisgICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQodmFsdWVzLCBmbGV4Q291bnQsIGluaXQpOworICAgIH0KKworICAgIC8vLyBDb25zdHJ1Y3QgZnJvbSBhbiB2ZWN0b3IuCisgICAgLy8vIFVzZWQgb25seSBieSB0aGUgZmxleGlibGUgcGFyYW1ldGVyIGFsbG9jYXRvcnMgKEFsbG9jVW5pcXVlICYgQWxsb2NTaGFyZWQpLgorICAgIGlubGluZSBDMlNpbXBsZUFycmF5U3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICZpbml0KSB7CisgICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQodmFsdWVzLCBmbGV4Q291bnQsIGluaXQpOworICAgIH0KKworICAgIC8vLyBDb25zdHJ1Y3QgZnJvbSBhbm90aGVyIGZsZXhpYmxlIGFycmF5LgorICAgIC8vLyBVc2VkIG9ubHkgYnkgdGhlIGZsZXhpYmxlIHBhcmFtZXRlciBhbGxvY2F0b3JzIChBbGxvY1VuaXF1ZSAmIEFsbG9jU2hhcmVkKS4KKyAgICB0ZW1wbGF0ZTx1bnNpZ25lZCBOPgorICAgIGlubGluZSBDMlNpbXBsZUFycmF5U3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IFQoJmluaXQpW05dKSB7CisgICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQodmFsdWVzLCBmbGV4Q291bnQsIGluaXQpOworICAgIH0KK307CisKKy8qKgorICogXGFkZHRvZ3JvdXAgc2ltcGxldmFsdWUgU2ltcGxlIHZhbHVlIGFuZCBhcnJheSBzdHJ1Y3R1cmVzLgorICogQHsKKyAqCisgKiBTaW1wbGUgdmFsdWUgc3RydWN0dXJlcy4KKyAqCisgKiBTdHJ1Y3R1cmVzIGNvbnRhaW5pbmcgYSBzaW5nbGUgc2ltcGxlIHZhbHVlLiBUaGVzZSBjYW4gYmUgcmV1c2VkIHRvIGVhc2lseSBkZWZpbmUgc2ltcGxlCisgKiBwYXJhbWV0ZXJzIG9mIHZhcmlvdXMgdHlwZXM6CisgKgorICogICB0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMkludDMyVmFsdWUsIGtQYXJhbUluZGV4TXlJbnRlZ2VyUG9ydFBhcmFtPgorICogICAgICAgICAgIEMyTXlJbnRlZ2VyUG9ydFBhcmFtVHVuaW5nOworICoKKyAqIFRoZXkgY29udGFpbiBhIHNpbmdsZSBtZW1iZXIgKHZhbHVlIG9yIHZhbHVlcykgdGhhdCBpcyBkZXNjcmliZWQgYXMgInZhbHVlIiBvciAidmFsdWVzIi4KKyAqCisgKiBUaGVzZSBzdHJ1Y3R1cmVzIGRvbid0IGRlZmluZSBhIGNvcmUgaW5kZXgsIGFuZCBhcyBzdWNoLCB0aGV5IGNhbm5vdCBiZSB1c2VkIGluIHN0cnVjdHVyZQorICogZGVjbGFyYXRpb25zLiBVc2UgdHlwZVtdIGluc3RlYWQsIHN1Y2ggYXMgaW50MzJfdCBmaWVsZFtdLgorICovCisvLy8gQSAzMi1iaXQgc2lnbmVkIGludGVnZXIgcGFyYW1ldGVyIGluIHZhbHVlLCBkZXNjcmliZWQgYXMgInZhbHVlIgordHlwZWRlZiBDMlNpbXBsZVZhbHVlU3RydWN0PGludDMyX3Q+IEMySW50MzJWYWx1ZTsKKy8vLyBBIDMyLWJpdCBzaWduZWQgaW50ZWdlciBhcnJheSBwYXJhbWV0ZXIgaW4gdmFsdWVzLCBkZXNjcmliZWQgYXMgInZhbHVlcyIKK3R5cGVkZWYgQzJTaW1wbGVBcnJheVN0cnVjdDxpbnQzMl90PiBDMkludDMyQXJyYXk7CisvLy8gQSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlciBwYXJhbWV0ZXIgaW4gdmFsdWUsIGRlc2NyaWJlZCBhcyAidmFsdWUiCit0eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8dWludDMyX3Q+IEMyVWludDMyVmFsdWU7CisvLy8gQSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlciBhcnJheSBwYXJhbWV0ZXIgaW4gdmFsdWVzLCBkZXNjcmliZWQgYXMgInZhbHVlcyIKK3R5cGVkZWYgQzJTaW1wbGVBcnJheVN0cnVjdDx1aW50MzJfdD4gQzJVaW50MzJBcnJheTsKKy8vLyBBIDY0LWJpdCBzaWduZWQgaW50ZWdlciBwYXJhbWV0ZXIgaW4gdmFsdWUsIGRlc2NyaWJlZCBhcyAidmFsdWUiCit0eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8aW50NjRfdD4gQzJJbnQ2NFZhbHVlOworLy8vIEEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyIGFycmF5IHBhcmFtZXRlciBpbiB2YWx1ZXMsIGRlc2NyaWJlZCBhcyAidmFsdWVzIgordHlwZWRlZiBDMlNpbXBsZUFycmF5U3RydWN0PGludDY0X3Q+IEMySW50NjRBcnJheTsKKy8vLyBBIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHBhcmFtZXRlciBpbiB2YWx1ZSwgZGVzY3JpYmVkIGFzICJ2YWx1ZSIKK3R5cGVkZWYgQzJTaW1wbGVWYWx1ZVN0cnVjdDx1aW50NjRfdD4gQzJVaW50NjRWYWx1ZTsKKy8vLyBBIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIGFycmF5IHBhcmFtZXRlciBpbiB2YWx1ZXMsIGRlc2NyaWJlZCBhcyAidmFsdWVzIgordHlwZWRlZiBDMlNpbXBsZUFycmF5U3RydWN0PHVpbnQ2NF90PiBDMlVpbnQ2NEFycmF5OworLy8vIEEgZmxvYXQgcGFyYW1ldGVyIGluIHZhbHVlLCBkZXNjcmliZWQgYXMgInZhbHVlIgordHlwZWRlZiBDMlNpbXBsZVZhbHVlU3RydWN0PGZsb2F0PiBDMkZsb2F0VmFsdWU7CisvLy8gQSBmbG9hdCBhcnJheSBwYXJhbWV0ZXIgaW4gdmFsdWVzLCBkZXNjcmliZWQgYXMgInZhbHVlcyIKK3R5cGVkZWYgQzJTaW1wbGVBcnJheVN0cnVjdDxmbG9hdD4gQzJGbG9hdEFycmF5OworLy8vIEEgYmxvYiBmbGV4aWJsZSBwYXJhbWV0ZXIgaW4gdmFsdWUsIGRlc2NyaWJlZCBhcyAidmFsdWUiCit0eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8dWludDhfdFtdPiBDMkJsb2JWYWx1ZTsKKy8vLyBBIHN0cmluZyBmbGV4aWJsZSBwYXJhbWV0ZXIgaW4gdmFsdWUsIGRlc2NyaWJlZCBhcyAidmFsdWUiCit0eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8Y2hhcltdPiBDMlN0cmluZ1ZhbHVlOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8VD46OkZpZWxkTGlzdCgpIHsKKyAgICByZXR1cm4geyBERVNDUklCRV9DMkZJRUxEKHZhbHVlLCAidmFsdWUiKSB9OworfQordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlNpbXBsZVZhbHVlU3RydWN0PFRbXT46OkZpZWxkTGlzdCgpIHsKKyAgICByZXR1cm4geyBERVNDUklCRV9DMkZJRUxEKHZhbHVlLCAidmFsdWUiKSB9OworfQordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlNpbXBsZUFycmF5U3RydWN0PFQ+OjpGaWVsZExpc3QoKSB7CisgICAgcmV0dXJuIHsgREVTQ1JJQkVfQzJGSUVMRCh2YWx1ZXMsICJ2YWx1ZXMiKSB9OworfQorCisvLy8gQH0KKworLy8vIEB9CisKKyNlbmRpZiAgLy8gQzJQQVJBTV9ERUZfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJXb3JrLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyV29yay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MjNmM2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyV29yay5oCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMldPUktfSF8KKworI2RlZmluZSBDMldPUktfSF8KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCisvLy8gXGRlZmdyb3VwIHdvcmsgV29yayBhbmQgZGF0YSBwcm9jZXNzaW5nCisvLy8gQHsKKworLyoqCisgKiBJbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoZSByZWFzb24gYSBwYXJhbWV0ZXIgc2V0dGluZ3MgbWF5IGZhaWwsIG9yCisgKiBtYXkgYmUgb3ZlcnJpZGVuLgorICovCitzdHJ1Y3QgQzJTZXR0aW5nUmVzdWx0IHsKKyAgICBlbnVtIEZhaWx1cmUgOiB1aW50MzJfdCB7CisgICAgICAgIC8qIHBhcmFtZXRlciBmYWlsdXJlcyBiZWxvdyAqLworICAgICAgICBCQURfVFlQRSwgICAvLy88IHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkCisgICAgICAgIEJBRF9QT1JULCAgIC8vLzwgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIHNwZWNpZmljIHBvcnQKKyAgICAgICAgQkFEX0lOREVYLCAgLy8vPCBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGUgc3BlY2lmaWMgc3RyZWFtCisgICAgICAgIFJFQURfT05MWSwgIC8vLzwgcGFyYW1ldGVyIGlzIHJlYWQtb25seSBhbmQgY2Fubm90IGJlIHNldAorICAgICAgICBNSVNNQVRDSCwgICAvLy88IHBhcmFtZXRlciBtaXNtYXRjaGVzIGlucHV0IGRhdGEKKworICAgICAgICAvKiBmaWVsZCBmYWlsdXJlcyBiZWxvdyAqLworICAgICAgICBCQURfVkFMVUUsICAvLy88IHN0cmljdCBwYXJhbWV0ZXIgZG9lcyBub3QgYWNjZXB0IHZhbHVlIGZvciB0aGUgZmllbGQgYXQgYWxsCisgICAgICAgIENPTkZMSUNULCAgIC8vLzwgc3RyaWN0IHBhcmFtZXRlciBmaWVsZCB2YWx1ZSBpcyBpbiBjb25mbGljdCB3aXRoIGFuL290aGVyIHNldHRpbmcocykKKworICAgICAgICAvLy8gcGFyYW1ldGVyIGZpZWxkIGlzIG91dCBvZiByYW5nZSBkdWUgdG8gb3RoZXIgc2V0dGluZ3MgKHRoaXMgZmFpbHVyZSBtb2RlCisgICAgICAgIC8vLyBjYW4gb25seSBiZSB1c2VkIGZvciBzdHJpY3QgY2FsY3VsYXRlZCBwYXJhbWV0ZXJzKQorICAgICAgICBVTlNVUFBPUlRFRCwKKworICAgICAgICAvLy8gZmllbGQgZG9lcyBub3QgYWNjZXNzIHRoZSByZXF1ZXN0ZWQgcGFyYW1ldGVyIHZhbHVlIGF0IGFsbC4gSXQgaGFzIGJlZW4gY29ycmVjdGVkIHRvCisgICAgICAgIC8vLyB0aGUgY2xvc2VzdCBzdXBwb3J0ZWQgdmFsdWUuIFRoaXMgZmFpbHVyZSBtb2RlIGlzIHByb3ZpZGVkIHRvIGdpdmUgZ3VpZGFuY2UgYXMgdG8gd2hhdAorICAgICAgICAvLy8gYXJlIHRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyBmb3IgdGhpcyBmaWVsZCAod2hpY2ggbWF5IGJlIGEgc3Vic2V0IG9mIHRoZSBhdC1hbGwtCisgICAgICAgIC8vLyBwb3RlbnRpYWwgdmFsdWVzKQorICAgICAgICBJTkZPX0JBRF9WQUxVRSwKKworICAgICAgICAvLy8gcmVxdWVzdGVkIHBhcmFtZXRlciB2YWx1ZSBpcyBpbiBjb25mbGljdCB3aXRoIGFuL290aGVyIHNldHRpbmcocykKKyAgICAgICAgLy8vIGFuZCBoYXMgYmVlbiBjb3JyZWN0ZWQgdG8gdGhlIGNsb3Nlc3Qgc3VwcG9ydGVkIHZhbHVlLiBUaGlzIGZhaWx1cmUKKyAgICAgICAgLy8vIG1vZGUgaXMgZ2l2ZW4gdG8gcHJvdmlkZSBndWlkYW5jZSBhcyB0byB3aGF0IGFyZSB0aGUgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgYXMgd2VsbAorICAgICAgICAvLy8gYXMgdG8gb3B0aW9uYWxseSBwcm92aWRlIHN1Z2dlc3Rpb24gdG8gdGhlIGNsaWVudCBhcyB0byBob3cgdG8gZW5hYmxlIHRoZSByZXF1ZXN0ZWQKKyAgICAgICAgLy8vIHBhcmFtZXRlciB2YWx1ZS4KKyAgICAgICAgSU5GT19DT05GTElDVCwKKyAgICB9OworCisgICAgRmFpbHVyZSBmYWlsdXJlOyAgICAvLy88IGZhaWx1cmUgY29kZQorCisgICAgLy8vIEZhaWxpbmcgKG9yIGNvcnJlY3RlZCkgZmllbGQgb3IgcGFyYW1ldGVyYW5kIG9wdGlvbmFsbHksIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIGZvciB0aGUKKyAgICAvLy8gZmllbGQuIFZhbHVlcyBtdXN0IG9ubHkgYmUgc2V0IGZvciBmaWVsZCBmYWlsdXJlcyBvdGhlciB0aGFuIEJBRF9WQUxVRSwgYW5kIG9ubHkgaWYgdGhleSBhcmUKKyAgICAvLy8gZGlmZmVyZW50IGZyb20gdGhlIGdsb2JhbGx5IHN1cHBvcnRlZCB2YWx1ZXMgKGUuZy4gZHVlIHRvIHJlc3RyaWN0aW9ucyBieSBhbm90aGVyIHBhcmFtIG9yCisgICAgLy8vIGlucHV0IGRhdGEpLgorICAgIEMyUGFyYW1GaWVsZFZhbHVlcyBmaWVsZDsKKworICAgIC8vLyBDb25mbGljdGluZyBwYXJhbWV0ZXJzIG9yIGZpZWxkcyB3aXRoIG9wdGlvbmFsIHN1Z2dlc3Rpb25zIHdpdGggKG9wdGlvbmFsKSBzdWdnZXN0ZWQgdmFsdWVzCisgICAgLy8vIGZvciBhbnkgY29uZmxpY3RpbmcgZmllbGRzIHRvIGF2b2lkIHRoZSBjb25mbGljdC4gTXVzdCBvbmx5IGJlIHNldCBmb3IgQ09ORkxJQ1QsIFVOU1VQUE9SVEVECisgICAgLy8vIGFuZCBJTkZPX0NPTkZMSUNUIGZhaWx1cmUgY29kZXMuCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbUZpZWxkVmFsdWVzPiBjb25mbGljdHM7Cit9OworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBXT1JLCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyoqIFVuaXF1ZSBJRCBmb3IgYSBwcm9jZXNzaW5nIG5vZGUuICovCit0eXBlZGVmIHVpbnQzMl90IGMyX25vZGVfaWRfdDsKKworZW51bSB7CisgICAga1BhcmFtSW5kZXhXb3JrT3JkaW5hbCwKK307CisKKy8qKgorICogSW5mb3JtYXRpb24gZm9yIG9yZGVyaW5nIHdvcmsgaXRlbXMgb24gYSBjb21wb25lbnQgcG9ydC4KKyAqLworc3RydWN0IEMyV29ya09yZGluYWxTdHJ1Y3QgeworLy9wdWJsaWM6CisgICAgYzJfY250cjY0X3QgdGltZXN0YW1wOyAgICAgLyoqIGZyYW1lIHRpbWVzdGFtcCBpbiBtaWNyb3NlY29uZHMgKi8KKyAgICBjMl9jbnRyNjRfdCBmcmFtZUluZGV4OyAgICAvKiogc3VibWlzc2lvbiBvcmRpbmFsIG9uIHRoZSBpbml0aWFsIGNvbXBvbmVudCAqLworICAgIGMyX2NudHI2NF90IGN1c3RvbU9yZGluYWw7IC8qKiBjYW4gYmUgZ2l2ZW4gYnkgdGhlIGNvbXBvbmVudCwgZS5nLiBkZWNvZGUgb3JkZXIgKi8KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoV29ya09yZGluYWwpCisgICAgQzJGSUVMRCh0aW1lc3RhbXAsICJ0aW1lc3RhbXAiKQorICAgIEMyRklFTEQoZnJhbWVJbmRleCwgImZyYW1lLWluZGV4IikKKyAgICBDMkZJRUxEKGN1c3RvbU9yZGluYWwsICJjdXN0b20tb3JkaW5hbCIpCit9OworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIHJlcHJlc2VudHMgYSBDb2RlYyAyLjAgZnJhbWUgd2l0aCBpdHMgbWV0YWRhdGEuCisgKgorICogQSBmcmFtZSBiYXNpY2FsbHkgY29uc2lzdHMgb2YgYW4gb3JkZXJlZCBzZXRzIG9mIGJ1ZmZlcnMsIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBhbmQgaW5mbyBidWZmZXJzCisgKiBhbG9uZyB3aXRoIHNvbWUgbm9uLWNvbmZpZ3VyYXRpb24gbWV0YWRhdGEuCisgKi8KK3N0cnVjdCBDMkZyYW1lRGF0YSB7CisvL3B1YmxpYzoKKyAgICBlbnVtIGZsYWdzX3QgOiB1aW50MzJfdCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBGb3IgaW5wdXQgZnJhbWVzOiBubyBvdXRwdXQgZnJhbWUgc2hhbGwgYmUgZ2VuZXJhdGVkIHdoZW4gcHJvY2Vzc2luZyB0aGlzIGZyYW1lLCBidXQKKyAgICAgICAgICogbWV0YWRhdGEgc2hhbGwgc3RpbGwgYmUgcHJvY2Vzc2VkLgorICAgICAgICAgKiBGb3Igb3V0cHV0IGZyYW1lczogdGhpcyBmcmFtZSBzaGFsbCBiZSBkaXNjYXJkZWQgYW5kIGJ1dCBtZXRhZGF0YSBpcyBzdGlsbCB2YWxpZC4KKyAgICAgICAgICovCisgICAgICAgIEZMQUdfRFJPUF9GUkFNRSAgICA9ICgxIDw8IDApLAorICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBmcmFtZSBpcyB0aGUgbGFzdCBmcmFtZSBvZiB0aGUgY3VycmVudCBzdHJlYW0uIEZ1cnRoZXIgZnJhbWVzIGFyZSBwYXJ0IG9mIGEgbmV3CisgICAgICAgICAqIHN0cmVhbS4KKyAgICAgICAgICovCisgICAgICAgIEZMQUdfRU5EX09GX1NUUkVBTSA9ICgxIDw8IDEpLAorICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBmcmFtZSBzaGFsbCBiZSBkaXNjYXJkZWQgd2l0aCBpdHMgbWV0YWRhdGEuCisgICAgICAgICAqIFRoaXMgZmxhZyBpcyBvbmx5IHNldCBieSBjb21wb25lbnRzIC0gZS5nLiBhcyBhIHJlc3BvbnNlIHRvIHRoZSBmbHVzaCBjb21tYW5kLgorICAgICAgICAgKi8KKyAgICAgICAgRkxBR19ESVNDQVJEX0ZSQU1FID0gKDEgPDwgMiksCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGZyYW1lIGlzIG5vdCB0aGUgbGFzdCBmcmFtZSBwcm9kdWNlZCBmb3IgdGhlIGlucHV0LgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIGZsYWcgaXMgbm9ybWFsbHkgc2V0IGJ5IHRoZSBjb21wb25lbnQgLSBlLmcuIHdoZW4gYW4gaW5wdXQgZnJhbWUgcmVzdWx0cyBpbiBtdWx0aXBsZQorICAgICAgICAgKiBvdXRwdXQgZnJhbWVzLCB0aGlzIGZsYWcgaXMgc2V0IG9uIGFsbCBidXQgdGhlIGxhc3Qgb3V0cHV0IGZyYW1lLgorICAgICAgICAgKgorICAgICAgICAgKiBBbHNvLCB3aGVuIGNvbXBvbmVudHMgYXJlIGNoYWluZWQsIHRoaXMgZmxhZyBzaG91bGQgYmUgcHJvcGFnYXRlZCBkb3duIHRoZQorICAgICAgICAgKiB3b3JrIGNoYWluLiBUaGF0IGlzLCBpZiBzZXQgb24gYW4gZWFybGllciBmcmFtZSBvZiBhIHdvcmstY2hhaW4sIGl0IHNob3VsZCBiZSBwcm9wYWdhdGVkCisgICAgICAgICAqIHRvIGFsbCBsYXRlciBmcmFtZXMgaW4gdGhhdCBjaGFpbi4gQWRkaXRpb25hbGx5LCBjb21wb25lbnRzIGRvd24gdGhlIGNoYWluIGNvdWxkIHNldAorICAgICAgICAgKiB0aGlzIGZsYWcgZXZlbiBpZiBub3Qgc2V0IGVhcmxpZXIsIGUuZy4gaWYgbXVsdGlwbGUgb3V0cHV0IGZyYW1lIGlzIGdlbmVyYXRlZCBhdCB0aGF0CisgICAgICAgICAqIGNvbXBvbmVudCBmb3IgdGhlIGlucHV0IGZyYW1lLgorICAgICAgICAgKi8KKyAgICAgICAgRkxBR19JTkNPTVBMRVRFID0gKDEgPDwgMyksCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGZyYW1lIGNvbnRhaW5zIG9ubHkgY29kZWMtc3BlY2lmaWMgY29uZmlndXJhdGlvbiBkYXRhLCBhbmQgbm8gYWN0dWFsIGFjY2VzcyB1bml0LgorICAgICAgICAgKgorICAgICAgICAgKiBcZGVwcmVjYXRlZCBwYXNzIGNvZGVjIGNvbmZpZ3VyYXRpb24gd2l0aCB1c2luZyB0aGUgXHRvZG8gY29kZWMtc3BlY2lmaWMgY29uZmlndXJhdGlvbgorICAgICAgICAgKiBpbmZvIHRvZ2V0aGVyIHdpdGggdGhlIGFjY2VzcyB1bml0LgorICAgICAgICAgKi8KKyAgICAgICAgRkxBR19DT0RFQ19DT05GSUcgID0gKDF1IDw8IDMxKSwKKyAgICB9OworCisgICAgLyoqCisgICAgICogRnJhbWUgZmxhZ3MgKi8KKyAgICBmbGFnc190ICBmbGFnczsKKyAgICBDMldvcmtPcmRpbmFsU3RydWN0IG9yZGluYWw7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPj4gYnVmZmVyczsKKyAgICAvLzwgZm9yIGluaXRpYWwgd29yayBpdGVtLCB0aGVzZSBtYXkgYWxzbyBjb21lIGZyb20gdGhlIHBhcnNlciAtIGlmIHByb3ZpZGVkCisgICAgLy88IGZvciBvdXRwdXQgYnVmZmVycywgdGhlc2UgYXJlIHRoZSByZXNwb25zZXMgdG8gcmVxdWVzdGVkSW5mb3MKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICAgICAgY29uZmlnVXBkYXRlOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMkluZm9CdWZmZXI+PiBpbmZvQnVmZmVyczsKK307CisKK3N0cnVjdCBDMldvcmtsZXQgeworLy9wdWJsaWM6CisgICAgLy8gSU4KKyAgICBjMl9ub2RlX2lkX3QgY29tcG9uZW50OworCisgICAgLyoqIENvbmZpZ3VyYXRpb24gY2hhbmdlcyB0byBiZSBhcHBsaWVkIGJlZm9yZSBwcm9jZXNzaW5nIHRoaXMgd29ya2xldC4gKi8KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJUdW5pbmc+PiB0dW5pbmdzOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKworICAgIC8vIE9VVAorICAgIEMyRnJhbWVEYXRhIG91dHB1dDsKK307CisKKy8qKgorICogSW5mb3JtYXRpb24gYWJvdXQgcGFydGlhbCB3b3JrLWNoYWlucyBub3QgcGFydCBvZiB0aGUgY3VycmVudCB3b3JrIGl0ZW1zLgorICoKKyAqIFRvIGJlIGRlZmluZWQgbGF0ZXIuCisgKi8KK3N0cnVjdCBDMldvcmtDaGFpbkluZm87CisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGEgc2luZ2xlIHdvcmsgaXRlbS4KKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBzaGFsbCBiZSBwYXNzZWQgYnkgdGhlIGNsaWVudCB0byB0aGUgY29tcG9uZW50IGZvciB0aGUgZmlyc3Qgd29ya2xldC4gQXMgc3VjaCwKKyAqIHdvcmtsZXRzIG11c3Qgbm90IGJlIGVtcHR5LiBUaGUgb3duZXJzaGlwIG9mIHRoaXMgb2JqZWN0IGlzIHBhc3NlZC4KKyAqLworc3RydWN0IEMyV29yayB7CisvL3B1YmxpYzoKKyAgICAvLy8gYWRkaXRpb25hbCB3b3JrIGNoYWluIGluZm8gbm90IHBhcnQgb2YgdGhpcyB3b3JrCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyV29ya0NoYWluSW5mbz4gY2hhaW5JbmZvOworCisgICAgLy8vIFRoZSBpbnB1dCBkYXRhIHRvIGJlIHByb2Nlc3NlZCBhcyBwYXJ0IG9mIHRoaXMgd29yay93b3JrLWNoYWluLiBUaGlzIGlzIHByb3ZpZGVkIGJ5IHRoZQorICAgIC8vLyBjbGllbnQgd2l0aCBvd25lcnNoaXAuIFdoZW4gdGhlIHdvcmsgaXMgcmV0dXJuZWQgKHZpYSBvbldvcmtEb25lKSwgdGhlIGlucHV0IGJ1ZmZlci1wYWNrJ3MKKyAgICAvLy8gYnVmZmVyIHZlY3RvciBzaGFsbCBjb250YWluIG51bGxwdHJzLgorICAgIEMyRnJhbWVEYXRhIGlucHV0OworCisgICAgLy8vIFRoZSBjaGFpbiBvZiBjb21wb25lbnRzLCB0dW5pbmdzIChpbmNsdWRpbmcgb3V0cHV0IGJ1ZmZlciBwb29sIElEcykgYW5kIGluZm8gcmVxdWVzdHMgdGhhdCB0aGUKKyAgICAvLy8gZGF0YSBtdXN0IHBhc3MgdGhyb3VnaC4gSWYgdGhpcyBoYXMgbW9yZSB0aGFuIGEgc2luZ2xlIGVsZW1lbnQsIHRoZSB0dW5uZWxzIGJldHdlZW4gc3VjY2Vzc2l2ZQorICAgIC8vLyBjb21wb25lbnRzIG9mIHRoZSB3b3JrbGV0IGNoYWluIG11c3QgaGF2ZSBiZWVuIChzdWNjZXNzZnVsbHkpIHByZS1yZWdpc3RlcmVkIGF0IHRoZSB0aW1lIHRoYXQKKyAgICAvLy8gdGhlIHdvcmsgaXMgc3VibWl0dGVkLiBBbGxvY2F0aW5nIHRoZSBvdXRwdXQgYnVmZmVycyBpbiB0aGUgd29ya2xldHMgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mCisgICAgLy8vIGVhY2ggY29tcG9uZW50LiBVcG9uIHdvcmsgc3VibWlzc2lvbiwgZWFjaCBvdXRwdXQgYnVmZmVyLXBhY2sgc2hhbGwgYmUgYW4gYXBwcm9wcmlhdGVseSBzaXplZAorICAgIC8vLyB2ZWN0b3IgY29udGFpbmluZyBudWxscHRycy4gV2hlbiB0aGUgd29yayBpcyBjb21wbGV0ZWQvcmV0dXJuZWQgdG8gdGhlIGNsaWVudCwgb3V0cHV0IGJ1ZmZlcnMKKyAgICAvLy8gcG9pbnRlcnMgZnJvbSBhbGwgYnV0IHRoZSBmaW5hbCB3b3JrbGV0IHNoYWxsIGJlIG51bGxwdHJzLgorICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrbGV0Pj4gd29ya2xldHM7CisKKyAgICAvLy8gTnVtYmVyIG9mIHdvcmtsZXRzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQgaW4gdGhpcyBjaGFpbi4gVGhpcyBzaGFsbCBiZSBpbml0aWFsaXplZCB0byAwIGJ5IHRoZQorICAgIC8vLyBjbGllbnQgd2hlbiB0aGUgd29yayBpcyBzdWJtaXR0ZWQuIEl0IHNoYWxsIGNvbnRhaW4gdGhlIG51bWJlciBvZiB3b3JrbGV0cyB0aGF0IHdlcmUKKyAgICAvLy8gc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCB3aGVuIHRoZSB3b3JrIGlzIHJldHVybmVkIHRvIHRoZSBjbGllbnQuIElmIHRoaXMgaXMgbGVzcyB0aGVuIHRoZSBudW1iZXIKKyAgICAvLy8gb2Ygd29ya2xldHMsIHJlc3VsdCBtdXN0IG5vdCBiZSBzdWNjZXNzLiBJdCBtdXN0IGJlIGluIHRoZSByYW5nZSBvZiBbMCwgd29ya2xldHMuc2l6ZSgpXS4KKyAgICB1aW50MzJfdCB3b3JrbGV0c1Byb2Nlc3NlZDsKKworICAgIC8vLyBUaGUgZmluYWwgb3V0Y29tZSBvZiB0aGUgd29yayAoY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmVudCB3b3JrbGV0c1Byb2Nlc3NlZCkuIElmIDAgd2hlbgorICAgIC8vLyB3b3JrIGlzIHJldHVybmVkLCBpdCBpcyBhc3N1bWVkIHRoYXQgYWxsIHdvcmtsZXRzIGhhdmUgYmVlbiBwcm9jZXNzZWQuCisgICAgYzJfc3RhdHVzX3QgcmVzdWx0OworfTsKKworLyoqCisgKiBJbmZvcm1hdGlvbiBhYm91dCBhIGZ1dHVyZSB3b3JrIHRvIGJlIHN1Ym1pdHRlZCB0byB0aGUgY29tcG9uZW50LiBUaGUgaW5mb3JtYXRpb24gaXMgdXNlZCB0bworICogcmVzZXJ2ZSB0aGUgd29yayBmb3Igd29yayBvcmRlcmluZyBwdXJwb3Nlcy4KKyAqLworc3RydWN0IEMyV29ya091dGxpbmUgeworLy9wdWJsaWM6CisgICAgQzJXb3JrT3JkaW5hbFN0cnVjdCBvcmRpbmFsOworICAgIHN0ZDo6dmVjdG9yPGMyX25vZGVfaWRfdD4gY2hhaW47Cit9OworCisvLy8gQH0KKworI2VuZGlmICAvLyBDMldPUktfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvX0MyTWFjcm9VdGlscy5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9fQzJNYWNyb1V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRlOWJhNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvX0MyTWFjcm9VdGlscy5oCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlVUSUxTX01BQ1JPX1VUSUxTX0hfCisjZGVmaW5lIEMyVVRJTFNfTUFDUk9fVVRJTFNfSF8KKworLyoqIFxmaWxlCisgKiBNYWNybyB1dGlsaXRpZXMgZm9yIHRoZSB1dGlscyBsaWJyYXJ5IHVzZWQgYnkgQ29kZWMyIGltcGxlbWVudGF0aW9ucy4KKyAqLworCisvLy8gXGlmIDAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFZBUklBQkxFIEFSR1VNRU5UIENPVU5USU5HIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvLyByZW1vdmUgZW1wdHkgYXJndW1lbnRzIC0gX0MyX0FSRygpIGV4cGFuZHMgdG8gJycsIHdoaWxlIF9DMl9BUkcoeCkgZXhwYW5kcyB0byAnLCB4JworLy8gX0MyX0FSR24oLi4uKSBkb2VzIHRoZSBzYW1lIGZvciBuIGFyZ3VtZW50cworI2RlZmluZSBfQzJfQVJHKC4uLikgLCAjI19fVkFfQVJHU19fCisjZGVmaW5lIF9DMl9BUkcyKF8xLCBfMikgX0MyX0FSRyhfMSkgX0MyX0FSRyhfMikKKyNkZWZpbmUgX0MyX0FSRzQoXzEsIF8yLCBfMywgXzQpIF9DMl9BUkcyKF8xLCBfMikgX0MyX0FSRzIoXzMsIF80KQorI2RlZmluZSBfQzJfQVJHOChfMSwgXzIsIF8zLCBfNCwgXzUsIF82LCBfNywgXzgpIF9DMl9BUkc0KF8xLCBfMiwgXzMsIF80KSBfQzJfQVJHNChfNSwgXzYsIF83LCBfOCkKKyNkZWZpbmUgX0MyX0FSRzE2KF8xLCBfMiwgXzMsIF80LCBfNSwgXzYsIF83LCBfOCwgXzksIF8xMCwgXzExLCBfMTIsIF8xMywgXzE0LCBfMTUsIF8xNikgXAorICAgICAgICBfQzJfQVJHOChfMSwgXzIsIF8zLCBfNCwgXzUsIF82LCBfNywgXzgpIF9DMl9BUkc4KF85LCBfMTAsIF8xMSwgXzEyLCBfMTMsIF8xNCwgXzE1LCBfMTYpCisKKy8vIHJldHVybiB0aGUgNjV0aCBhcmd1bWVudAorI2RlZmluZSBfQzJfQVJHQ18zKF8sIF8wLCBfMSwgXzIsIF8zLCBfNCwgXzUsIF82LCBfNywgXzgsIF85LCBfMTAsIF8xMSwgXzEyLCBfMTMsIF8xNCwgXzE1LCBfMTYsIFwKKyAgICAgICAgXzE3LCBfMTgsIF8xOSwgXzIwLCBfMjEsIF8yMiwgXzIzLCBfMjQsIF8yNSwgXzI2LCBfMjcsIF8yOCwgXzI5LCBfMzAsIF8zMSwgXzMyLCBcCisgICAgICAgIF8zMywgXzM0LCBfMzUsIF8zNiwgXzM3LCBfMzgsIF8zOSwgXzQwLCBfNDEsIF80MiwgXzQzLCBfNDQsIF80NSwgXzQ2LCBfNDcsIF80OCwgXAorICAgICAgICBfNDksIF81MCwgXzUxLCBfNTIsIF81MywgXzU0LCBfNTUsIF81NiwgXzU3LCBfNTgsIF81OSwgXzYwLCBfNjEsIF82MiwgXzYzLCBfNjQsIC4uLikgXzY0CisKKy8vLyBcZW5kaWYKKworLyoqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgorICovCisvLyBXZSBkbyB0aGlzIGJ5IHByZXBlbmRpbmcgMSBhbmQgYXBwZW5kaW5nIDY1IGRlc2lnbmVkIHZhbHVlcyBzdWNoIHRoYXQgdGhlIDY1dGggZWxlbWVudAorLy8gd2lsbCBiZSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKyNkZWZpbmUgX0MyX0FSR0MoLi4uKSBfQzJfQVJHQ18xKDAsICMjX19WQV9BUkdTX18sIFwKKyAgICAgICAgNjQsIDYzLCA2MiwgNjEsIDYwLCA1OSwgNTgsIDU3LCA1NiwgNTUsIDU0LCA1MywgNTIsIDUxLCA1MCwgNDksIDQ4LCA0NywgNDYsIDQ1LCA0NCwgNDMsIFwKKyAgICAgICAgNDIsIDQxLCA0MCwgMzksIDM4LCAzNywgMzYsIDM1LCAzNCwgMzMsIDMyLCAzMSwgMzAsIDI5LCAyOCwgMjcsIDI2LCAyNSwgMjQsIDIzLCAyMiwgMjEsIFwKKyAgICAgICAgMjAsIDE5LCAxOCwgMTcsIDE2LCAxNSwgMTQsIDEzLCAxMiwgMTEsIDEwLCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyLCAxLCAwKQorCisvLy8gXGlmIDAKKworLy8gc3RlcCAxLiByZW1vdmUgZW1wdHkgYXJndW1lbnRzIC0gdGhpcyBpcyBuZWVkZWQgdG8gYWxsb3cgdHJhaWxpbmcgY29tbWEgaW4gZW51bSBkZWZpbml0aW9ucworLy8gKE5PVEU6IHdlIGRvbid0IGtub3cgd2hpY2ggYXJndW1lbnQgd2lsbCBoYXZlIHRoaXMgdHJhaWxpbmcgY29tbWEgc28gd2UgaGF2ZSB0byB0cnkgYWxsKQorI2RlZmluZSBfQzJfQVJHQ18xKF8sIF8wLCBfMSwgXzIsIF8zLCBfNCwgXzUsIF82LCBfNywgXzgsIF85LCBfMTAsIF8xMSwgXzEyLCBfMTMsIF8xNCwgXzE1LCBfMTYsIFwKKyAgICAgICAgXzE3LCBfMTgsIF8xOSwgXzIwLCBfMjEsIF8yMiwgXzIzLCBfMjQsIF8yNSwgXzI2LCBfMjcsIF8yOCwgXzI5LCBfMzAsIF8zMSwgXzMyLCBcCisgICAgICAgIF8zMywgXzM0LCBfMzUsIF8zNiwgXzM3LCBfMzgsIF8zOSwgXzQwLCBfNDEsIF80MiwgXzQzLCBfNDQsIF80NSwgXzQ2LCBfNDcsIF80OCwgXAorICAgICAgICBfNDksIF81MCwgXzUxLCBfNTIsIF81MywgXzU0LCBfNTUsIF81NiwgXzU3LCBfNTgsIF81OSwgXzYwLCBfNjEsIF82MiwgXzYzLCBfNjQsIC4uLikgXAorICAgIF9DMl9BUkdDXzIoXyBfQzJfQVJHKF8wKSBcCisgICAgX0MyX0FSRzE2KF8xLCBfMiwgXzMsIF80LCBfNSwgXzYsIF83LCBfOCwgXzksIF8xMCwgXzExLCBfMTIsIF8xMywgXzE0LCBfMTUsIF8xNikgXAorICAgIF9DMl9BUkcxNihfMTcsIF8xOCwgXzE5LCBfMjAsIF8yMSwgXzIyLCBfMjMsIF8yNCwgXzI1LCBfMjYsIF8yNywgXzI4LCBfMjksIF8zMCwgXzMxLCBfMzIpIFwKKyAgICBfQzJfQVJHMTYoXzMzLCBfMzQsIF8zNSwgXzM2LCBfMzcsIF8zOCwgXzM5LCBfNDAsIF80MSwgXzQyLCBfNDMsIF80NCwgXzQ1LCBfNDYsIF80NywgXzQ4KSBcCisgICAgX0MyX0FSRzE2KF80OSwgXzUwLCBfNTEsIF81MiwgXzUzLCBfNTQsIF81NSwgXzU2LCBfNTcsIF81OCwgXzU5LCBfNjAsIF82MSwgXzYyLCBfNjMsIF82NCksIFwKKyAgICAjI19fVkFfQVJHU19fKQorCisvLyBzdGVwIDIuIHRoaXMgaXMgbmVlZGVkIGFzIHJlbW92ZWQgYXJndW1lbnRzIGNhbm5vdCBiZSBwYXNzZWQgZGlyZWN0bHkgYXMgZW1wdHkgaW50byBhIG1hY3JvCisjZGVmaW5lIF9DMl9BUkdDXzIoLi4uKSBfQzJfQVJHQ18zKF9fVkFfQVJHU19fKQorCisvLy8gXGVuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFZBUklBQkxFIEFSR1VNRU5UIENPTlZFUlNJT04gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLy8vIFxpZiAwCisKKy8vIG1hY3JvcyB0aGF0IGNvbnZlcnQgXzEsIF8yLCBfMywgLi4uIHRvIGZuKF8xLCBhcmcpLCBmbihfMiwgYXJnKSwgZm4oXzMsIGFyZyksIC4uLgorI2RlZmluZSBfQzJfTUFQXzY0KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF82MyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzYzKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF82MihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzYyKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF82MShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzYxKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF82MChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzYwKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81OShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzU5KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81OChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzU4KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81NyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzU3KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81NihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzU2KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81NShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzU1KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81NChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzU0KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81MyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzUzKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81MihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzUyKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81MShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzUxKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81MChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzUwKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80OShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQ5KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80OChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQ4KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80NyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQ3KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80NihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQ2KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80NShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQ1KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80NChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQ0KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80MyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQzKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80MihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQyKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80MShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQxKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80MChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQwKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zOShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzM5KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zOChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzM4KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zNyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzM3KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zNihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzM2KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zNShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzM1KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zNChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzM0KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zMyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzMzKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zMihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzMyKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zMShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzMxKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zMChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzMwKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yOShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzI5KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yOChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzI4KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yNyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzI3KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yNihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzI2KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yNShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzI1KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yNChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzI0KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yMyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzIzKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yMihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzIyKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yMShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzIxKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yMChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzIwKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xOShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzE5KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xOChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzE4KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xNyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzE3KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xNihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzE2KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xNShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzE1KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xNChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzE0KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xMyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzEzKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xMihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzEyKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xMShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzExKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xMChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzEwKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF85KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfOShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfOChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzgoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzcoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF83KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF82KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzUoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzIoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzEoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKQorCisvLy8gXGVuZGlmCisKKy8qKgorICogTWFwcyBlYWNoIGFyZ3VtZW50IHVzaW5nIGFub3RoZXIgbWFjcm8geCAtPiBmbih4LCBhcmcpCisgKi8KKy8vIHVzZSB3cmFwcGVyIHRvIGNhbGwgdGhlIHByb3BlciBtYXBwZXIgYmFzZWQgb24gdGhlIG51bWJlciBvZiBhcmd1bWVudHMKKyNkZWZpbmUgX0MyX01BUChmbiwgYXJnLCAuLi4pIF9DMl9NQVBfXyhfQzJfQVJHQyhfX1ZBX0FSR1NfXyksIGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisKKy8vLyBcaWYgMAorCisvLyBldmFsdWF0ZSBfbiBzbyBpdCBiZWNvbWVzIGEgbnVtYmVyCisjZGVmaW5lIF9DMl9NQVBfXyhfbiwgZm4sIGFyZywgLi4uKSBfQzJfTUFQXyhfbiwgZm4sIGFyZywgX19WQV9BUkdTX18pCisvLyBjYWxsIHRoZSBwcm9wZXIgbWFwcGVyCisjZGVmaW5lIF9DMl9NQVBfKF9uLCBmbiwgYXJnLCAuLi4pIF9DMl9NQVBfIyNfbiAoZm4sIGFyZywgX19WQV9BUkdTX18pCisKKy8vLyBcZW5kaWYKKworI2VuZGlmICAvLyBDMlVUSUxTX01BQ1JPX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL2FuZHJvaWQtQzJCdWZmZXIuaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvYW5kcm9pZC1DMkJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YmVhYjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL2FuZHJvaWQtQzJCdWZmZXIuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyQlVGRkVSX0hfCisjZGVmaW5lIEFORFJPSURfQzJCVUZGRVJfSF8KKworI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvZ3JhbGxvYy5oPgorCisvKiBVc2UgYW5kcm9pZCBuYXRpdmUgaGFuZGxlIGZvciBDMkhhbmRsZSAqLwordHlwZWRlZiA6Om5hdGl2ZV9oYW5kbGVfdCBDMkhhbmRsZTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIEFuZHJvaWQgcGxhdGZvcm0gYnVmZmVyL21lbW9yeSB1c2FnZSBiaXRzLgorICovCitzdHJ1Y3QgQzJBbmRyb2lkTWVtb3J5VXNhZ2UgOiBwdWJsaWMgQzJNZW1vcnlVc2FnZSB7CisgICAgaW5saW5lIEMyQW5kcm9pZE1lbW9yeVVzYWdlKGNvbnN0IEMyTWVtb3J5VXNhZ2UgJnVzYWdlKSA6IEMyTWVtb3J5VXNhZ2UodXNhZ2UpIHsgfQorCisvLyBwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV1c2UgZ3JhbGxvYyBmbGFncyB3aGVyZSBwb3NzaWJsZSwgYXMgQ29kZWMgMi4wIEFQSSBvbmx5IHVzZXMgYml0cyAwIGFuZCAxLgorICAgICAqLworICAgIGVudW0gY29uc3VtZXJfdCA6IHVpbnQ2NF90IHsKKyAgICAgICAgUkVOREVSU0NSSVBUX1JFQUQgPSBHUkFMTE9DX1VTQUdFX1JFTkRFUlNDUklQVCwKKyAgICAgICAgSFdfVEVYVFVSRV9SRUFEICAgPSBHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUsCisgICAgICAgIEhXX0NPTVBPU0VSX1JFQUQgID0gR1JBTExPQ19VU0FHRV9IV19DT01QT1NFUiwKKyAgICAgICAgLy8gZ3JhbGxvYyBkb2VzIG5vdCBkZWZpbmUgYSB2aWRlbyBkZWNvZGVyIHJlYWQgdXNhZ2UgZmxhZywgc28gdXNlIGVuY29kZXIgZm9yCisgICAgICAgIC8vIG5vdworICAgICAgICBIV19DT0RFQ19SRUFEICAgICA9IEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUiwKKyAgICAgICAgUkVBRF9QUk9URUNURUQgICAgPSBHUkFMTE9DX1VTQUdFX1BST1RFQ1RFRCwKKyAgICB9OworCisgICAgZW51bSBwcm9kdWNlcl90IDogdWludDY0X3QgeworICAgICAgICBSRU5ERVJTQ1JJUFRfV1JJVEUgPSBHUkFMTE9DX1VTQUdFX1JFTkRFUlNDUklQVCwKKyAgICAgICAgSFdfVEVYVFVSRV9XUklURSAgID0gR1JBTExPQ19VU0FHRV9IV19SRU5ERVIsCisgICAgICAgIEhXX0NPTVBPU0VSX1dSSVRFICA9IEdSQUxMT0NfVVNBR0VfSFdfQ09NUE9TRVIgfCBHUkFMTE9DX1VTQUdFX0hXX1JFTkRFUiwKKyAgICAgICAgSFdfQ09ERUNfV1JJVEUgICAgID0gR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSLAorICAgICAgICAvLyBncmFsbG9jIGRvZXMgbm90IGRlZmluZSBhIHdyaXRlIHByb3RlY3RlZCB1c2FnZSBmbGFnLCBzbyB1c2UgcmVhZCBwcm90ZWN0ZWQKKyAgICAgICAgLy8gbm93CisgICAgICAgIFdSSVRFX1BST1RFQ1RFRCAgICA9IEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVELAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGZyb20gZ3JhbGxvYyB1c2FnZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgQzJNZW1vcnlVc2FnZSBGcm9tR3JhbGxvY1VzYWdlKHVpbnQ2NF90IHVzYWdlKTsKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgdG8gZ3JhbGxvYyB1c2FnZS4KKyAgICAgKi8KKyAgICB1aW50NjRfdCBhc0dyYWxsb2NVc2FnZSgpIGNvbnN0OworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyQlVGRkVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxMWEwNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvY29kZWMyLzEuMC9JbnB1dFN1cmZhY2UuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0MyX1YxXzBfSU5QVVRfU1VSRkFDRV9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQzJfVjFfMF9JTlBVVF9TVVJGQUNFX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEdyYXBoaWNCdWZmZXJTb3VyY2U7CisKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3R5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyCisgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit0eXBlZGVmIDo6YW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlciBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworCisvLyBUT0RPOiA6OmFuZHJvaWQ6OlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyPElJbnB1dFN1cmZhY2U+Cit0eXBlZGVmIDo6YW5kcm9pZDo6VFdHcmFwaGljQnVmZmVyUHJvZHVjZXI8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gSW5wdXRTdXJmYWNlQmFzZTsKKworY2xhc3MgSW5wdXRTdXJmYWNlIDogcHVibGljIElucHV0U3VyZmFjZUJhc2UgeworcHVibGljOgorICAgIHZpcnR1YWwgfklucHV0U3VyZmFjZSgpID0gZGVmYXVsdDsKKworICAgIC8vIE1ldGhvZHMgZnJvbSBJSW5wdXRTdXJmYWNlCisgICAgc3A8SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4gY29ubmVjdFRvQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6QzJDb21wb25lbnQ+ICZjb21wKTsKKyAgICAvLyBUT0RPOiBpbnRmKCkKKworICAgIHN0YXRpYyBzcDxJbnB1dFN1cmZhY2U+IENyZWF0ZSgpOworCitwcml2YXRlOgorICAgIElucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEJHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZiYXNlLAorICAgICAgICAgICAgY29uc3Qgc3A8OjphbmRyb2lkOjpHcmFwaGljQnVmZmVyU291cmNlPiAmc291cmNlKTsKKworICAgIHNwPDo6YW5kcm9pZDo6R3JhcGhpY0J1ZmZlclNvdXJjZT4gbVNvdXJjZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9DMl9WMV8wX0lOUFVUX1NVUkZBQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9jb2RlYzIvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvY29kZWMyLzEuMC9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI0YTQxNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvY29kZWMyLzEuMC9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9DMl9WMV8wX0lOUFVUX1NVUkZBQ0VfQ09OTkVDVElPTl9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQzJfVjFfMF9JTlBVVF9TVVJGQUNFX0NPTk5FQ1RJT05fSAorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCisvLyBUT0RPOiBpbmhlcml0IGZyb20gSUlucHV0U3VyZmFjZUNvbm5lY3Rpb24KK2NsYXNzIElucHV0U3VyZmFjZUNvbm5lY3Rpb24gOiBwdWJsaWMgUmVmQmFzZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+SW5wdXRTdXJmYWNlQ29ubmVjdGlvbigpOworCisgICAgLy8gRnJvbSBJSW5wdXRTdXJmYWNlQ29ubmVjdGlvbgorICAgIHZvaWQgZGlzY29ubmVjdCgpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBJbnB1dFN1cmZhY2U7CisKKyAgICAvLyBGb3IgSW5wdXRTdXJmYWNlCisgICAgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbigKKyAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+ICZzb3VyY2UsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gJmNvbXApOworICAgIGJvb2wgaW5pdCgpOworCisgICAgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbigpID0gZGVsZXRlOworCisgICAgY2xhc3MgSW1wbDsKKworICAgIHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IG1Tb3VyY2U7CisgICAgc3A8SW1wbD4gbUltcGw7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJbnB1dFN1cmZhY2VDb25uZWN0aW9uKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9DMl9WMV8wX0lOUFVUX1NVUkZBQ0VfQ09OTkVDVElPTl9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvZG9jcy9kb3h5ZmlsdGVyLnNoIGIvbWVkaWEvY29kZWMyL2RvY3MvZG94eWZpbHRlci5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kODEzMTUzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2RvY3MvZG94eWZpbHRlci5zaApAQCAtMCwwICsxLDEwMCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMworaW1wb3J0IHJlLCBzeXMKKworZ2xvYmFsIGluX2NvbW1lbnQsIGN1cnJlbnQsIGluZGVudCwgaG9sZAoraW5fY29tbWVudCwgY3VycmVudCwgaW5kZW50LCBob2xkID0gRmFsc2UsIE5vbmUsICcnLCBbXQorCitjbGFzcyBDaGFuZ2VDU3R5bGVDb21tZW50c1RvRG94eToKKyAgICBkZWYgZHVtcF9ob2xkKCk6CisgICAgICAgIGdsb2JhbCBob2xkCisgICAgICAgIGZvciBoIGluIGhvbGQ6CisgICAgICAgICAgICBwcmludChoLCBlbmQ9JycpCisgICAgICAgIGhvbGRbOl0gPSBbXQorCisgICAgZGVmIGRveHlfaG9sZCgpOgorICAgICAgICBnbG9iYWwgY3VycmVudCwgaG9sZAorICAgICAgICBpZiBjdXJyZW50ID09ICcvLyc6CisgICAgICAgICAgICBmb3IgaCBpbiBob2xkOgorICAgICAgICAgICAgICAgIHByaW50KHJlLnN1YihyJ14oICovLyg/IS8pKScsIHInXDEvJywgaCksIGVuZD0nJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZpcnN0ID0gVHJ1ZQorICAgICAgICAgICAgZm9yIGggaW4gaG9sZDoKKyAgICAgICAgICAgICAgICBpZiBmaXJzdDoKKyAgICAgICAgICAgICAgICAgICAgaCA9IHJlLnN1YihyJ14oICovWypdKD8hWypdKSknLCByJ1wxKicsIGgpCisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gRmFsc2UKKyAgICAgICAgICAgICAgICBwcmludChoLCBlbmQ9JycpCisgICAgICAgIGhvbGRbOl0gPSBbXQorCisgICAgZGVmIHByb2Nlc3NfY29tbWVudCh0LCBpbmQsIGxpbmUpOgorICAgICAgICBnbG9iYWwgY3VycmVudCwgaW5kZW50LCBob2xkCisgICAgICAgIGlmIHQgIT0gY3VycmVudCBvciBpbmQgbm90IGluIChpbmRlbnQsIGluZGVudCArICcgJyk6CisgICAgICAgICAgICBkdW1wX2hvbGQoKQorICAgICAgICAgICAgY3VycmVudCwgaW5kZW50ID0gdCwgaW5kCisgICAgICAgIGhvbGQuYXBwZW5kKGxpbmUpCisKKyAgICBkZWYgcHJvY2Vzc19saW5lKGluZCwgbGluZSk6CisgICAgICAgIGdsb2JhbCBjdXJyZW50LCBpbmRlbnQKKyAgICAgICAgaWYgaW5kIGluIChpbmRlbnQsICcnKToKKyAgICAgICAgICAgIGRveHlfaG9sZCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkdW1wX2hvbGQoKQorICAgICAgICBjdXJyZW50LCBpbmRlbnQgPSBOb25lLCBOb25lCisgICAgICAgIHByaW50KGxpbmUsIGVuZD0nJykKKworICAgIGRlZiBwcm9jZXNzKHNlbGYsIGlucHV0LCBwYXRoKToKKyAgICAgICAgZm9yIGxpbmUgaW4gaW5wdXQ6CisgICAgICAgICAgICBpbmQgPSByZS5tYXRjaChyJ14oICopJywgbGluZSkuZ3JvdXAoMSkKKyAgICAgICAgICAgIGlmIGluX2NvbW1lbnQ6CisgICAgICAgICAgICAgICAgIyBUT0RPOiB0aGlzIGlzIG5vdCBxdWl0ZSByaWdodCwgYnV0IGdvb2QgZW5vdWdoCisgICAgICAgICAgICAgICAgbSA9IHJlLm1hdGNoKHInXiAqWypdLycsIGxpbmUpCisgICAgICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc19jb21tZW50KCcvKicsIGluZCwgbGluZSkKKyAgICAgICAgICAgICAgICAgICAgaW5fY29tbWVudCA9IEZhbHNlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc19jb21tZW50KCcvKicsIGluZCwgbGluZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgbSA9IHJlLm1hdGNoKHInXiAqLy8nLCBsaW5lKQorICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICAjIG9uZS1saW5lIGNvbW1lbnQKKyAgICAgICAgICAgICAgICBwcm9jZXNzX2NvbW1lbnQoJy8vJywgaW5kLCBsaW5lKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBtID0gcmUubWF0Y2gocideICovWypdJywgbGluZSkKKyAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgIyBtdWx0aS1saW5lIGNvbW1lbnQKKyAgICAgICAgICAgICAgICBwcm9jZXNzX2NvbW1lbnQoJy8qJywgaW5kLCBsaW5lKQorICAgICAgICAgICAgICAgICMgVE9ETzogdGhpcyBpcyBub3QgcXVpdGUgcmlnaHQsIGJ1dCBnb29kIGVub3VnaAorICAgICAgICAgICAgICAgIGluX2NvbW1lbnQgPSBub3QgcmUubWF0Y2gocideICpbKl0vJywgbGluZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgcHJvY2Vzc19saW5lKGluZCwgbGluZSkKKworY2xhc3MgQXV0b0dyb3VwOgorICAgIGRlZiBwcm9jZXNzKHNlbGYsIGlucHV0LCBwYXRoKToKKyAgICAgICAgaWYgJy9jb2RlYzIvaW5jbHVkZS8nIGluIHBhdGg6CisgICAgICAgICAgICBncm91cCA9ICdBUEkgQ29kZWMyIEFQSScKKyAgICAgICAgZWxpZiBGYWxzZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbGlmICcvY29kZWMyL3ZuZGsvJyBpbiBwYXRoOgorICAgICAgICAgICAgZ3JvdXAgPSAnVk5ESyBQbGF0Zm9ybSBwcm92aWRlZCBnbHVlJworICAgICAgICBlbGlmICcvY29kZWMyL3Rlc3RzLycgaW4gcGF0aDoKKyAgICAgICAgICAgIGdyb3VwID0gJ1Rlc3RzIFVuaXQgdGVzdHMnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBncm91cCA9ICdSYW5kb20gTWlzYy4gc2FuZGJveCcKKworICAgICAgICBwcmludCgnI3VuZGVmIF9fQVBQTEVfXycpCisKKyAgICAgICAgZm9yIGxpbmUgaW4gaW5wdXQ6CisgICAgICAgICAgICBpZiByZS5tYXRjaChyJ15uYW1lc3BhY2UgYW5kcm9pZCB7JywgbGluZSk6CisgICAgICAgICAgICAgICAgcHJpbnQobGluZSwgZW5kPScnKQorICAgICAgICAgICAgICAgIHByaW50KCkKKyAgICAgICAgICAgICAgICBwcmludChyJy8vLyBcYWRkdG9ncm91cCB7fScuZm9ybWF0KGdyb3VwKSkKKyAgICAgICAgICAgICAgICBwcmludChyJy8vLyBAeycpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsaWYgcmUubWF0Y2gocidefSArLy8gK25hbWVzcGFjZScsIGxpbmUpOgorICAgICAgICAgICAgICAgIHByaW50KHInLy8vIEB9JykKKyAgICAgICAgICAgICAgICBwcmludCgpCisgICAgICAgICAgICBwcmludChsaW5lLCBlbmQ9JycpCisKK1AgPSBBdXRvR3JvdXAoKQorZm9yIHBhdGggaW4gc3lzLmFyZ3ZbMTpdOgorICAgIHdpdGggb3BlbihwYXRoLCAncnQnKSBhcyBpbnB1dDoKKyAgICAgICAgUC5wcm9jZXNzKGlucHV0LCBwYXRoKQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2RvY3MvZG94eWdlbi5jb25maWcgYi9tZWRpYS9jb2RlYzIvZG9jcy9kb3h5Z2VuLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzNiZWEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2RvY3MvZG94eWdlbi5jb25maWcKQEAgLTAsMCArMSwyNDQ2IEBACisjIERveHlmaWxlIDEuOC4xMQorCisjIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIHNldHRpbmdzIHRvIGJlIHVzZWQgYnkgdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtCisjIGRveHlnZW4gKHd3dy5kb3h5Z2VuLm9yZykgZm9yIGEgcHJvamVjdC4KKyMKKyMgQWxsIHRleHQgYWZ0ZXIgYSBkb3VibGUgaGFzaCAoIyMpIGlzIGNvbnNpZGVyZWQgYSBjb21tZW50IGFuZCBpcyBwbGFjZWQgaW4KKyMgZnJvbnQgb2YgdGhlIFRBRyBpdCBpcyBwcmVjZWRpbmcuCisjCisjIEFsbCB0ZXh0IGFmdGVyIGEgc2luZ2xlIGhhc2ggKCMpIGlzIGNvbnNpZGVyZWQgYSBjb21tZW50IGFuZCB3aWxsIGJlIGlnbm9yZWQuCisjIFRoZSBmb3JtYXQgaXM6CisjIFRBRyA9IHZhbHVlIFt2YWx1ZSwgLi4uXQorIyBGb3IgbGlzdHMsIGl0ZW1zIGNhbiBhbHNvIGJlIGFwcGVuZGVkIHVzaW5nOgorIyBUQUcgKz0gdmFsdWUgW3ZhbHVlLCAuLi5dCisjIFZhbHVlcyB0aGF0IGNvbnRhaW4gc3BhY2VzIHNob3VsZCBiZSBwbGFjZWQgYmV0d2VlbiBxdW90ZXMgKFwiIFwiKS4KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQcm9qZWN0IHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhpcyB0YWcgc3BlY2lmaWVzIHRoZSBlbmNvZGluZyB1c2VkIGZvciBhbGwgY2hhcmFjdGVycyBpbiB0aGUgY29uZmlnIGZpbGUKKyMgdGhhdCBmb2xsb3cuIFRoZSBkZWZhdWx0IGlzIFVURi04IHdoaWNoIGlzIGFsc28gdGhlIGVuY29kaW5nIHVzZWQgZm9yIGFsbCB0ZXh0CisjIGJlZm9yZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGlzIHRhZy4gRG94eWdlbiB1c2VzIGxpYmljb252IChvciB0aGUgaWNvbnYKKyMgYnVpbHQgaW50byBsaWJjKSBmb3IgdGhlIHRyYW5zY29kaW5nLiBTZWUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmljb252CisjIGZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSBlbmNvZGluZ3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBVVEYtOC4KKworRE9YWUZJTEVfRU5DT0RJTkcgICAgICA9IFVURi04CisKKyMgVGhlIFBST0pFQ1RfTkFNRSB0YWcgaXMgYSBzaW5nbGUgd29yZCAob3IgYSBzZXF1ZW5jZSBvZiB3b3JkcyBzdXJyb3VuZGVkIGJ5CisjIGRvdWJsZS1xdW90ZXMsIHVubGVzcyB5b3UgYXJlIHVzaW5nIERveHl3aXphcmQpIHRoYXQgc2hvdWxkIGlkZW50aWZ5IHRoZQorIyBwcm9qZWN0IGZvciB3aGljaCB0aGUgZG9jdW1lbnRhdGlvbiBpcyBnZW5lcmF0ZWQuIFRoaXMgbmFtZSBpcyB1c2VkIGluIHRoZQorIyB0aXRsZSBvZiBtb3N0IGdlbmVyYXRlZCBwYWdlcyBhbmQgaW4gYSBmZXcgb3RoZXIgcGxhY2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTXkgUHJvamVjdC4KKworUFJPSkVDVF9OQU1FICAgICAgICAgICA9IENvZGVjMgorCisjIFRoZSBQUk9KRUNUX05VTUJFUiB0YWcgY2FuIGJlIHVzZWQgdG8gZW50ZXIgYSBwcm9qZWN0IG9yIHJldmlzaW9uIG51bWJlci4gVGhpcworIyBjb3VsZCBiZSBoYW5keSBmb3IgYXJjaGl2aW5nIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiBvciBpZiBzb21lIHZlcnNpb24KKyMgY29udHJvbCBzeXN0ZW0gaXMgdXNlZC4KKworUFJPSkVDVF9OVU1CRVIgICAgICAgICA9IAorCisjIFVzaW5nIHRoZSBQUk9KRUNUX0JSSUVGIHRhZyBvbmUgY2FuIHByb3ZpZGUgYW4gb3B0aW9uYWwgb25lIGxpbmUgZGVzY3JpcHRpb24KKyMgZm9yIGEgcHJvamVjdCB0aGF0IGFwcGVhcnMgYXQgdGhlIHRvcCBvZiBlYWNoIHBhZ2UgYW5kIHNob3VsZCBnaXZlIHZpZXdlciBhCisjIHF1aWNrIGlkZWEgYWJvdXQgdGhlIHB1cnBvc2Ugb2YgdGhlIHByb2plY3QuIEtlZXAgdGhlIGRlc2NyaXB0aW9uIHNob3J0LgorCitQUk9KRUNUX0JSSUVGICAgICAgICAgID0gCisKKyMgV2l0aCB0aGUgUFJPSkVDVF9MT0dPIHRhZyBvbmUgY2FuIHNwZWNpZnkgYSBsb2dvIG9yIGFuIGljb24gdGhhdCBpcyBpbmNsdWRlZAorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gVGhlIG1heGltdW0gaGVpZ2h0IG9mIHRoZSBsb2dvIHNob3VsZCBub3QgZXhjZWVkIDU1CisjIHBpeGVscyBhbmQgdGhlIG1heGltdW0gd2lkdGggc2hvdWxkIG5vdCBleGNlZWQgMjAwIHBpeGVscy4gRG94eWdlbiB3aWxsIGNvcHkKKyMgdGhlIGxvZ28gdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkuCisKK1BST0pFQ1RfTE9HTyAgICAgICAgICAgPSAKKworIyBUaGUgT1VUUFVUX0RJUkVDVE9SWSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSAocmVsYXRpdmUgb3IgYWJzb2x1dGUpIHBhdGgKKyMgaW50byB3aGljaCB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gd2lsbCBiZSB3cml0dGVuLiBJZiBhIHJlbGF0aXZlIHBhdGggaXMKKyMgZW50ZXJlZCwgaXQgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24gd2hlcmUgZG94eWdlbiB3YXMgc3RhcnRlZC4gSWYKKyMgbGVmdCBibGFuayB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2lsbCBiZSB1c2VkLgorCitPVVRQVVRfRElSRUNUT1JZICAgICAgID0gb3V0L3RhcmdldC9jb21tb24vZG9jcy9jb2RlYzIvYXBpCisKKyMgSWYgdGhlIENSRUFURV9TVUJESVJTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGNyZWF0ZSA0MDk2IHN1Yi0KKyMgZGlyZWN0b3JpZXMgKGluIDIgbGV2ZWxzKSB1bmRlciB0aGUgb3V0cHV0IGRpcmVjdG9yeSBvZiBlYWNoIG91dHB1dCBmb3JtYXQgYW5kCisjIHdpbGwgZGlzdHJpYnV0ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzIG92ZXIgdGhlc2UgZGlyZWN0b3JpZXMuIEVuYWJsaW5nIHRoaXMKKyMgb3B0aW9uIGNhbiBiZSB1c2VmdWwgd2hlbiBmZWVkaW5nIGRveHlnZW4gYSBodWdlIGFtb3VudCBvZiBzb3VyY2UgZmlsZXMsIHdoZXJlCisjIHB1dHRpbmcgYWxsIGdlbmVyYXRlZCBmaWxlcyBpbiB0aGUgc2FtZSBkaXJlY3Rvcnkgd291bGQgb3RoZXJ3aXNlIGNhdXNlcworIyBwZXJmb3JtYW5jZSBwcm9ibGVtcyBmb3IgdGhlIGZpbGUgc3lzdGVtLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0NSRUFURV9TVUJESVJTICAgICAgICAgPSBOTworCisjIElmIHRoZSBBTExPV19VTklDT0RFX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgYWxsb3cgbm9uLUFTQ0lJCisjIGNoYXJhY3RlcnMgdG8gYXBwZWFyIGluIHRoZSBuYW1lcyBvZiBnZW5lcmF0ZWQgZmlsZXMuIElmIHNldCB0byBOTywgbm9uLUFTQ0lJCisjIGNoYXJhY3RlcnMgd2lsbCBiZSBlc2NhcGVkLCBmb3IgZXhhbXBsZSBfeEUzX3g4MV94ODQgd2lsbCBiZSB1c2VkIGZvciBVbmljb2RlCisjIFUrMzA0NC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitBTExPV19VTklDT0RFX05BTUVTICAgID0gTk8KKworIyBUaGUgT1VUUFVUX0xBTkdVQUdFIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGxhbmd1YWdlIGluIHdoaWNoIGFsbAorIyBkb2N1bWVudGF0aW9uIGdlbmVyYXRlZCBieSBkb3h5Z2VuIGlzIHdyaXR0ZW4uIERveHlnZW4gd2lsbCB1c2UgdGhpcworIyBpbmZvcm1hdGlvbiB0byBnZW5lcmF0ZSBhbGwgY29uc3RhbnQgb3V0cHV0IGluIHRoZSBwcm9wZXIgbGFuZ3VhZ2UuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmU6IEFmcmlrYWFucywgQXJhYmljLCBBcm1lbmlhbiwgQnJhemlsaWFuLCBDYXRhbGFuLCBDaGluZXNlLAorIyBDaGluZXNlLVRyYWRpdGlvbmFsLCBDcm9hdGlhbiwgQ3plY2gsIERhbmlzaCwgRHV0Y2gsIEVuZ2xpc2ggKFVuaXRlZCBTdGF0ZXMpLAorIyBFc3BlcmFudG8sIEZhcnNpIChQZXJzaWFuKSwgRmlubmlzaCwgRnJlbmNoLCBHZXJtYW4sIEdyZWVrLCBIdW5nYXJpYW4sCisjIEluZG9uZXNpYW4sIEl0YWxpYW4sIEphcGFuZXNlLCBKYXBhbmVzZS1lbiAoSmFwYW5lc2Ugd2l0aCBFbmdsaXNoIG1lc3NhZ2VzKSwKKyMgS29yZWFuLCBLb3JlYW4tZW4gKEtvcmVhbiB3aXRoIEVuZ2xpc2ggbWVzc2FnZXMpLCBMYXR2aWFuLCBMaXRodWFuaWFuLAorIyBNYWNlZG9uaWFuLCBOb3J3ZWdpYW4sIFBlcnNpYW4gKEZhcnNpKSwgUG9saXNoLCBQb3J0dWd1ZXNlLCBSb21hbmlhbiwgUnVzc2lhbiwKKyMgU2VyYmlhbiwgU2VyYmlhbi1DeXJpbGxpYywgU2xvdmFrLCBTbG92ZW5lLCBTcGFuaXNoLCBTd2VkaXNoLCBUdXJraXNoLAorIyBVa3JhaW5pYW4gYW5kIFZpZXRuYW1lc2UuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBFbmdsaXNoLgorCitPVVRQVVRfTEFOR1VBR0UgICAgICAgID0gRW5nbGlzaAorCisjIElmIHRoZSBCUklFRl9NRU1CRVJfREVTQyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGluY2x1ZGUgYnJpZWYgbWVtYmVyCisjIGRlc2NyaXB0aW9ucyBhZnRlciB0aGUgbWVtYmVycyB0aGF0IGFyZSBsaXN0ZWQgaW4gdGhlIGZpbGUgYW5kIGNsYXNzCisjIGRvY3VtZW50YXRpb24gKHNpbWlsYXIgdG8gSmF2YWRvYykuIFNldCB0byBOTyB0byBkaXNhYmxlIHRoaXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0JSSUVGX01FTUJFUl9ERVNDICAgICAgPSBZRVMKKworIyBJZiB0aGUgUkVQRUFUX0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgcHJlcGVuZCB0aGUgYnJpZWYKKyMgZGVzY3JpcHRpb24gb2YgYSBtZW1iZXIgb3IgZnVuY3Rpb24gYmVmb3JlIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbgorIworIyBOb3RlOiBJZiBib3RoIEhJREVfVU5ET0NfTUVNQkVSUyBhbmQgQlJJRUZfTUVNQkVSX0RFU0MgYXJlIHNldCB0byBOTywgdGhlCisjIGJyaWVmIGRlc2NyaXB0aW9ucyB3aWxsIGJlIGNvbXBsZXRlbHkgc3VwcHJlc3NlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworUkVQRUFUX0JSSUVGICAgICAgICAgICA9IFlFUworCisjIFRoaXMgdGFnIGltcGxlbWVudHMgYSBxdWFzaS1pbnRlbGxpZ2VudCBicmllZiBkZXNjcmlwdGlvbiBhYmJyZXZpYXRvciB0aGF0IGlzCisjIHVzZWQgdG8gZm9ybSB0aGUgdGV4dCBpbiB2YXJpb3VzIGxpc3RpbmdzLiBFYWNoIHN0cmluZyBpbiB0aGlzIGxpc3QsIGlmIGZvdW5kCisjIGFzIHRoZSBsZWFkaW5nIHRleHQgb2YgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLCB3aWxsIGJlIHN0cmlwcGVkIGZyb20gdGhlIHRleHQKKyMgYW5kIHRoZSByZXN1bHQsIGFmdGVyIHByb2Nlc3NpbmcgdGhlIHdob2xlIGxpc3QsIGlzIHVzZWQgYXMgdGhlIGFubm90YXRlZAorIyB0ZXh0LiBPdGhlcndpc2UsIHRoZSBicmllZiBkZXNjcmlwdGlvbiBpcyB1c2VkIGFzLWlzLiBJZiBsZWZ0IGJsYW5rLCB0aGUKKyMgZm9sbG93aW5nIHZhbHVlcyBhcmUgdXNlZCAoJG5hbWUgaXMgYXV0b21hdGljYWxseSByZXBsYWNlZCB3aXRoIHRoZSBuYW1lIG9mCisjIHRoZSBlbnRpdHkpOlRoZSAkbmFtZSBjbGFzcywgVGhlICRuYW1lIHdpZGdldCwgVGhlICRuYW1lIGZpbGUsIGlzLCBwcm92aWRlcywKKyMgc3BlY2lmaWVzLCBjb250YWlucywgcmVwcmVzZW50cywgYSwgYW4gYW5kIHRoZS4KKworQUJCUkVWSUFURV9CUklFRiAgICAgICA9ICJUaGUgJG5hbWUgY2xhc3MiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlICRuYW1lIHdpZGdldCIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgJG5hbWUgZmlsZSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWlucyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50cyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgYW4gXAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZQorCisjIElmIHRoZSBBTFdBWVNfREVUQUlMRURfU0VDIGFuZCBSRVBFQVRfQlJJRUYgdGFncyBhcmUgYm90aCBzZXQgdG8gWUVTIHRoZW4KKyMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZGV0YWlsZWQgc2VjdGlvbiBldmVuIGlmIHRoZXJlIGlzIG9ubHkgYSBicmllZgorIyBkZXNjcmlwdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitBTFdBWVNfREVUQUlMRURfU0VDICAgID0gTk8KKworIyBJZiB0aGUgSU5MSU5FX0lOSEVSSVRFRF9NRU1CIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgc2hvdyBhbGwKKyMgaW5oZXJpdGVkIG1lbWJlcnMgb2YgYSBjbGFzcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGF0IGNsYXNzIGFzIGlmIHRob3NlCisjIG1lbWJlcnMgd2VyZSBvcmRpbmFyeSBjbGFzcyBtZW1iZXJzLiBDb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzIGFuZCBhc3NpZ25tZW50CisjIG9wZXJhdG9ycyBvZiB0aGUgYmFzZSBjbGFzc2VzIHdpbGwgbm90IGJlIHNob3duLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0lOTElORV9JTkhFUklURURfTUVNQiAgPSBZRVMKKworIyBJZiB0aGUgRlVMTF9QQVRIX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgcHJlcGVuZCB0aGUgZnVsbCBwYXRoCisjIGJlZm9yZSBmaWxlcyBuYW1lIGluIHRoZSBmaWxlIGxpc3QgYW5kIGluIHRoZSBoZWFkZXIgZmlsZXMuIElmIHNldCB0byBOTyB0aGUKKyMgc2hvcnRlc3QgcGF0aCB0aGF0IG1ha2VzIHRoZSBmaWxlIG5hbWUgdW5pcXVlIHdpbGwgYmUgdXNlZAorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitGVUxMX1BBVEhfTkFNRVMgICAgICAgID0gWUVTCisKKyMgVGhlIFNUUklQX0ZST01fUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSB1c2VyLWRlZmluZWQgcGFydCBvZiB0aGUgcGF0aC4KKyMgU3RyaXBwaW5nIGlzIG9ubHkgZG9uZSBpZiBvbmUgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIG1hdGNoZXMgdGhlIGxlZnQtaGFuZAorIyBwYXJ0IG9mIHRoZSBwYXRoLiBUaGUgdGFnIGNhbiBiZSB1c2VkIHRvIHNob3cgcmVsYXRpdmUgcGF0aHMgaW4gdGhlIGZpbGUgbGlzdC4KKyMgSWYgbGVmdCBibGFuayB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggZG94eWdlbiBpcyBydW4gaXMgdXNlZCBhcyB0aGUgcGF0aCB0bworIyBzdHJpcC4KKyMKKyMgTm90ZSB0aGF0IHlvdSBjYW4gc3BlY2lmeSBhYnNvbHV0ZSBwYXRocyBoZXJlLCBidXQgYWxzbyByZWxhdGl2ZSBwYXRocywgd2hpY2gKKyMgd2lsbCBiZSByZWxhdGl2ZSBmcm9tIHRoZSBkaXJlY3Rvcnkgd2hlcmUgZG94eWdlbiBpcyBzdGFydGVkLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRlVMTF9QQVRIX05BTUVTIGlzIHNldCB0byBZRVMuCisKK1NUUklQX0ZST01fUEFUSCAgICAgICAgPSBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMgorCisjIFRoZSBTVFJJUF9GUk9NX0lOQ19QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzdHJpcCBhIHVzZXItZGVmaW5lZCBwYXJ0IG9mIHRoZQorIyBwYXRoIG1lbnRpb25lZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIGNsYXNzLCB3aGljaCB0ZWxscyB0aGUgcmVhZGVyIHdoaWNoCisjIGhlYWRlciBmaWxlIHRvIGluY2x1ZGUgaW4gb3JkZXIgdG8gdXNlIGEgY2xhc3MuIElmIGxlZnQgYmxhbmsgb25seSB0aGUgbmFtZSBvZgorIyB0aGUgaGVhZGVyIGZpbGUgY29udGFpbmluZyB0aGUgY2xhc3MgZGVmaW5pdGlvbiBpcyB1c2VkLiBPdGhlcndpc2Ugb25lIHNob3VsZAorIyBzcGVjaWZ5IHRoZSBsaXN0IG9mIGluY2x1ZGUgcGF0aHMgdGhhdCBhcmUgbm9ybWFsbHkgcGFzc2VkIHRvIHRoZSBjb21waWxlcgorIyB1c2luZyB0aGUgLUkgZmxhZy4KKworU1RSSVBfRlJPTV9JTkNfUEFUSCAgICA9IAorCisjIElmIHRoZSBTSE9SVF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIG11Y2ggc2hvcnRlciAoYnV0CisjIGxlc3MgcmVhZGFibGUpIGZpbGUgbmFtZXMuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpcyB5b3VyIGZpbGUgc3lzdGVtcyBkb2Vzbid0CisjIHN1cHBvcnQgbG9uZyBuYW1lcyBsaWtlIG9uIERPUywgTWFjLCBvciBDRC1ST00uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU0hPUlRfTkFNRVMgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEpBVkFET0NfQVVUT0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGludGVycHJldCB0aGUKKyMgZmlyc3QgbGluZSAodW50aWwgdGhlIGZpcnN0IGRvdCkgb2YgYSBKYXZhZG9jLXN0eWxlIGNvbW1lbnQgYXMgdGhlIGJyaWVmCisjIGRlc2NyaXB0aW9uLiBJZiBzZXQgdG8gTk8sIHRoZSBKYXZhZG9jLXN0eWxlIHdpbGwgYmVoYXZlIGp1c3QgbGlrZSByZWd1bGFyIFF0LQorIyBzdHlsZSBjb21tZW50cyAodGh1cyByZXF1aXJpbmcgYW4gZXhwbGljaXQgQGJyaWVmIGNvbW1hbmQgZm9yIGEgYnJpZWYKKyMgZGVzY3JpcHRpb24uKQorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0pBVkFET0NfQVVUT0JSSUVGICAgICAgPSBZRVMKKworIyBJZiB0aGUgUVRfQVVUT0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGludGVycHJldCB0aGUgZmlyc3QKKyMgbGluZSAodW50aWwgdGhlIGZpcnN0IGRvdCkgb2YgYSBRdC1zdHlsZSBjb21tZW50IGFzIHRoZSBicmllZiBkZXNjcmlwdGlvbi4gSWYKKyMgc2V0IHRvIE5PLCB0aGUgUXQtc3R5bGUgd2lsbCBiZWhhdmUganVzdCBsaWtlIHJlZ3VsYXIgUXQtc3R5bGUgY29tbWVudHMgKHRodXMKKyMgcmVxdWlyaW5nIGFuIGV4cGxpY2l0IFxicmllZiBjb21tYW5kIGZvciBhIGJyaWVmIGRlc2NyaXB0aW9uLikKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitRVF9BVVRPQlJJRUYgICAgICAgICAgID0gWUVTCisKKyMgVGhlIE1VTFRJTElORV9DUFBfSVNfQlJJRUYgdGFnIGNhbiBiZSBzZXQgdG8gWUVTIHRvIG1ha2UgZG94eWdlbiB0cmVhdCBhCisjIG11bHRpLWxpbmUgQysrIHNwZWNpYWwgY29tbWVudCBibG9jayAoaS5lLiBhIGJsb2NrIG9mIC8vISBvciAvLy8gY29tbWVudHMpIGFzCisjIGEgYnJpZWYgZGVzY3JpcHRpb24uIFRoaXMgdXNlZCB0byBiZSB0aGUgZGVmYXVsdCBiZWhhdmlvci4gVGhlIG5ldyBkZWZhdWx0IGlzCisjIHRvIHRyZWF0IGEgbXVsdGktbGluZSBDKysgY29tbWVudCBibG9jayBhcyBhIGRldGFpbGVkIGRlc2NyaXB0aW9uLiBTZXQgdGhpcworIyB0YWcgdG8gWUVTIGlmIHlvdSBwcmVmZXIgdGhlIG9sZCBiZWhhdmlvciBpbnN0ZWFkLgorIworIyBOb3RlIHRoYXQgc2V0dGluZyB0aGlzIHRhZyB0byBZRVMgYWxzbyBtZWFucyB0aGF0IHJhdGlvbmFsIHJvc2UgY29tbWVudHMgYXJlCisjIG5vdCByZWNvZ25pemVkIGFueSBtb3JlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK01VTFRJTElORV9DUFBfSVNfQlJJRUYgPSBOTworCisjIElmIHRoZSBJTkhFUklUX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhbiB1bmRvY3VtZW50ZWQgbWVtYmVyIGluaGVyaXRzIHRoZQorIyBkb2N1bWVudGF0aW9uIGZyb20gYW55IGRvY3VtZW50ZWQgbWVtYmVyIHRoYXQgaXQgcmUtaW1wbGVtZW50cy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworSU5IRVJJVF9ET0NTICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBTRVBBUkFURV9NRU1CRVJfUEFHRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgcHJvZHVjZSBhIG5ldworIyBwYWdlIGZvciBlYWNoIG1lbWJlci4gSWYgc2V0IHRvIE5PLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIG1lbWJlciB3aWxsIGJlIHBhcnQKKyMgb2YgdGhlIGZpbGUvY2xhc3MvbmFtZXNwYWNlIHRoYXQgY29udGFpbnMgaXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU0VQQVJBVEVfTUVNQkVSX1BBR0VTICA9IE5PCisKKyMgVGhlIFRBQl9TSVpFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG51bWJlciBvZiBzcGFjZXMgaW4gYSB0YWIuIERveHlnZW4KKyMgdXNlcyB0aGlzIHZhbHVlIHRvIHJlcGxhY2UgdGFicyBieSBzcGFjZXMgaW4gY29kZSBmcmFnbWVudHMuCisjIE1pbmltdW0gdmFsdWU6IDEsIG1heGltdW0gdmFsdWU6IDE2LCBkZWZhdWx0IHZhbHVlOiA0LgorCitUQUJfU0laRSAgICAgICAgICAgICAgID0gNAorCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBudW1iZXIgb2YgYWxpYXNlcyB0aGF0IGFjdCBhcyBjb21tYW5kcyBpbgorIyB0aGUgZG9jdW1lbnRhdGlvbi4gQW4gYWxpYXMgaGFzIHRoZSBmb3JtOgorIyBuYW1lPXZhbHVlCisjIEZvciBleGFtcGxlIGFkZGluZworIyAic2lkZWVmZmVjdD1AcGFyIFNpZGUgRWZmZWN0czpcbiIKKyMgd2lsbCBhbGxvdyB5b3UgdG8gcHV0IHRoZSBjb21tYW5kIFxzaWRlZWZmZWN0IChvciBAc2lkZWVmZmVjdCkgaW4gdGhlCisjIGRvY3VtZW50YXRpb24sIHdoaWNoIHdpbGwgcmVzdWx0IGluIGEgdXNlci1kZWZpbmVkIHBhcmFncmFwaCB3aXRoIGhlYWRpbmcKKyMgIlNpZGUgRWZmZWN0czoiLiBZb3UgY2FuIHB1dCBcbidzIGluIHRoZSB2YWx1ZSBwYXJ0IG9mIGFuIGFsaWFzIHRvIGluc2VydAorIyBuZXdsaW5lcy4KKworQUxJQVNFUyAgICAgICAgICAgICAgICA9IAorCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBudW1iZXIgb2Ygd29yZC1rZXl3b3JkIG1hcHBpbmdzIChUQ0wgb25seSkuCisjIEEgbWFwcGluZyBoYXMgdGhlIGZvcm0gIm5hbWU9dmFsdWUiLiBGb3IgZXhhbXBsZSBhZGRpbmcgImNsYXNzPWl0Y2w6OmNsYXNzIgorIyB3aWxsIGFsbG93IHlvdSB0byB1c2UgdGhlIGNvbW1hbmQgY2xhc3MgaW4gdGhlIGl0Y2w6OmNsYXNzIG1lYW5pbmcuCisKK1RDTF9TVUJTVCAgICAgICAgICAgICAgPSAKKworIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9GT1JfQyB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBDIHNvdXJjZXMKKyMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZCBmb3IgQy4gRm9yCisjIGluc3RhbmNlLCBzb21lIG9mIHRoZSBuYW1lcyB0aGF0IGFyZSB1c2VkIHdpbGwgYmUgZGlmZmVyZW50LiBUaGUgbGlzdCBvZiBhbGwKKyMgbWVtYmVycyB3aWxsIGJlIG9taXR0ZWQsIGV0Yy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitPUFRJTUlaRV9PVVRQVVRfRk9SX0MgID0gTk8KKworIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9KQVZBIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEphdmEgb3IKKyMgUHl0aG9uIHNvdXJjZXMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZAorIyBmb3IgdGhhdCBsYW5ndWFnZS4gRm9yIGluc3RhbmNlLCBuYW1lc3BhY2VzIHdpbGwgYmUgcHJlc2VudGVkIGFzIHBhY2thZ2VzLAorIyBxdWFsaWZpZWQgc2NvcGVzIHdpbGwgbG9vayBkaWZmZXJlbnQsIGV0Yy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitPUFRJTUlaRV9PVVRQVVRfSkFWQSAgID0gTk8KKworIyBTZXQgdGhlIE9QVElNSVpFX0ZPUl9GT1JUUkFOIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEZvcnRyYW4KKyMgc291cmNlcy4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgdGFpbG9yZWQgZm9yIEZvcnRyYW4uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworT1BUSU1JWkVfRk9SX0ZPUlRSQU4gICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfVkhETCB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBWSERMCisjIHNvdXJjZXMuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIHRhaWxvcmVkIGZvciBWSERMLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK09QVElNSVpFX09VVFBVVF9WSERMICAgPSBOTworCisjIERveHlnZW4gc2VsZWN0cyB0aGUgcGFyc2VyIHRvIHVzZSBkZXBlbmRpbmcgb24gdGhlIGV4dGVuc2lvbiBvZiB0aGUgZmlsZXMgaXQKKyMgcGFyc2VzLiBXaXRoIHRoaXMgdGFnIHlvdSBjYW4gYXNzaWduIHdoaWNoIHBhcnNlciB0byB1c2UgZm9yIGEgZ2l2ZW4KKyMgZXh0ZW5zaW9uLiBEb3h5Z2VuIGhhcyBhIGJ1aWx0LWluIG1hcHBpbmcsIGJ1dCB5b3UgY2FuIG92ZXJyaWRlIG9yIGV4dGVuZCBpdAorIyB1c2luZyB0aGlzIHRhZy4gVGhlIGZvcm1hdCBpcyBleHQ9bGFuZ3VhZ2UsIHdoZXJlIGV4dCBpcyBhIGZpbGUgZXh0ZW5zaW9uLCBhbmQKKyMgbGFuZ3VhZ2UgaXMgb25lIG9mIHRoZSBwYXJzZXJzIHN1cHBvcnRlZCBieSBkb3h5Z2VuOiBJREwsIEphdmEsIEphdmFzY3JpcHQsCisjIEMjLCBDLCBDKyssIEQsIFBIUCwgT2JqZWN0aXZlLUMsIFB5dGhvbiwgRm9ydHJhbiAoZml4ZWQgZm9ybWF0IEZvcnRyYW46CisjIEZvcnRyYW5GaXhlZCwgZnJlZSBmb3JtYXR0ZWQgRm9ydHJhbjogRm9ydHJhbkZyZWUsIHVua25vd24gZm9ybWF0dGVkIEZvcnRyYW46CisjIEZvcnRyYW4uIEluIHRoZSBsYXRlciBjYXNlIHRoZSBwYXJzZXIgdHJpZXMgdG8gZ3Vlc3Mgd2hldGhlciB0aGUgY29kZSBpcyBmaXhlZAorIyBvciBmcmVlIGZvcm1hdHRlZCBjb2RlLCB0aGlzIGlzIHRoZSBkZWZhdWx0IGZvciBGb3J0cmFuIHR5cGUgZmlsZXMpLCBWSERMLiBGb3IKKyMgaW5zdGFuY2UgdG8gbWFrZSBkb3h5Z2VuIHRyZWF0IC5pbmMgZmlsZXMgYXMgRm9ydHJhbiBmaWxlcyAoZGVmYXVsdCBpcyBQSFApLAorIyBhbmQgLmYgZmlsZXMgYXMgQyAoZGVmYXVsdCBpcyBGb3J0cmFuKSwgdXNlOiBpbmM9Rm9ydHJhbiBmPUMuCisjCisjIE5vdGU6IEZvciBmaWxlcyB3aXRob3V0IGV4dGVuc2lvbiB5b3UgY2FuIHVzZSBub19leHRlbnNpb24gYXMgYSBwbGFjZWhvbGRlci4KKyMKKyMgTm90ZSB0aGF0IGZvciBjdXN0b20gZXh0ZW5zaW9ucyB5b3UgYWxzbyBuZWVkIHRvIHNldCBGSUxFX1BBVFRFUk5TIG90aGVyd2lzZQorIyB0aGUgZmlsZXMgYXJlIG5vdCByZWFkIGJ5IGRveHlnZW4uCisKK0VYVEVOU0lPTl9NQVBQSU5HICAgICAgPSAKKworIyBJZiB0aGUgTUFSS0RPV05fU1VQUE9SVCB0YWcgaXMgZW5hYmxlZCB0aGVuIGRveHlnZW4gcHJlLXByb2Nlc3NlcyBhbGwgY29tbWVudHMKKyMgYWNjb3JkaW5nIHRvIHRoZSBNYXJrZG93biBmb3JtYXQsIHdoaWNoIGFsbG93cyBmb3IgbW9yZSByZWFkYWJsZQorIyBkb2N1bWVudGF0aW9uLiBTZWUgaHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC9wcm9qZWN0cy9tYXJrZG93bi8gZm9yIGRldGFpbHMuCisjIFRoZSBvdXRwdXQgb2YgbWFya2Rvd24gcHJvY2Vzc2luZyBpcyBmdXJ0aGVyIHByb2Nlc3NlZCBieSBkb3h5Z2VuLCBzbyB5b3UgY2FuCisjIG1peCBkb3h5Z2VuLCBIVE1MLCBhbmQgWE1MIGNvbW1hbmRzIHdpdGggTWFya2Rvd24gZm9ybWF0dGluZy4gRGlzYWJsZSBvbmx5IGluCisjIGNhc2Ugb2YgYmFja3dhcmQgY29tcGF0aWJpbGl0aWVzIGlzc3Vlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworTUFSS0RPV05fU1VQUE9SVCAgICAgICA9IFlFUworCisjIFdoZW4gZW5hYmxlZCBkb3h5Z2VuIHRyaWVzIHRvIGxpbmsgd29yZHMgdGhhdCBjb3JyZXNwb25kIHRvIGRvY3VtZW50ZWQKKyMgY2xhc3Nlcywgb3IgbmFtZXNwYWNlcyB0byB0aGVpciBjb3JyZXNwb25kaW5nIGRvY3VtZW50YXRpb24uIFN1Y2ggYSBsaW5rIGNhbgorIyBiZSBwcmV2ZW50ZWQgaW4gaW5kaXZpZHVhbCBjYXNlcyBieSBwdXR0aW5nIGEgJSBzaWduIGluIGZyb250IG9mIHRoZSB3b3JkIG9yCisjIGdsb2JhbGx5IGJ5IHNldHRpbmcgQVVUT0xJTktfU1VQUE9SVCB0byBOTy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworQVVUT0xJTktfU1VQUE9SVCAgICAgICA9IFlFUworCisjIElmIHlvdSB1c2UgU1RMIGNsYXNzZXMgKGkuZS4gc3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yLCBldGMuKSBidXQgZG8gbm90IHdhbnQKKyMgdG8gaW5jbHVkZSAoYSB0YWcgZmlsZSBmb3IpIHRoZSBTVEwgc291cmNlcyBhcyBpbnB1dCwgdGhlbiB5b3Ugc2hvdWxkIHNldCB0aGlzCisjIHRhZyB0byBZRVMgaW4gb3JkZXIgdG8gbGV0IGRveHlnZW4gbWF0Y2ggZnVuY3Rpb25zIGRlY2xhcmF0aW9ucyBhbmQKKyMgZGVmaW5pdGlvbnMgd2hvc2UgYXJndW1lbnRzIGNvbnRhaW4gU1RMIGNsYXNzZXMgKGUuZy4gZnVuYyhzdGQ6OnN0cmluZyk7CisjIHZlcnN1cyBmdW5jKHN0ZDo6c3RyaW5nKSB7fSkuIFRoaXMgYWxzbyBtYWtlIHRoZSBpbmhlcml0YW5jZSBhbmQgY29sbGFib3JhdGlvbgorIyBkaWFncmFtcyB0aGF0IGludm9sdmUgU1RMIGNsYXNzZXMgbW9yZSBjb21wbGV0ZSBhbmQgYWNjdXJhdGUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQlVJTFRJTl9TVExfU1VQUE9SVCAgICA9IFlFUworCisjIElmIHlvdSB1c2UgTWljcm9zb2Z0J3MgQysrL0NMSSBsYW5ndWFnZSwgeW91IHNob3VsZCBzZXQgdGhpcyBvcHRpb24gdG8gWUVTIHRvCisjIGVuYWJsZSBwYXJzaW5nIHN1cHBvcnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQ1BQX0NMSV9TVVBQT1JUICAgICAgICA9IE5PCisKKyMgU2V0IHRoZSBTSVBfU1VQUE9SVCB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBzaXAgKHNlZToKKyMgaHR0cDovL3d3dy5yaXZlcmJhbmtjb21wdXRpbmcuY28udWsvc29mdHdhcmUvc2lwL2ludHJvKSBzb3VyY2VzIG9ubHkuIERveHlnZW4KKyMgd2lsbCBwYXJzZSB0aGVtIGxpa2Ugbm9ybWFsIEMrKyBidXQgd2lsbCBhc3N1bWUgYWxsIGNsYXNzZXMgdXNlIHB1YmxpYyBpbnN0ZWFkCisjIG9mIHByaXZhdGUgaW5oZXJpdGFuY2Ugd2hlbiBubyBleHBsaWNpdCBwcm90ZWN0aW9uIGtleXdvcmQgaXMgcHJlc2VudC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTSVBfU1VQUE9SVCAgICAgICAgICAgID0gTk8KKworIyBGb3IgTWljcm9zb2Z0J3MgSURMIHRoZXJlIGFyZSBwcm9wZ2V0IGFuZCBwcm9wcHV0IGF0dHJpYnV0ZXMgdG8gaW5kaWNhdGUKKyMgZ2V0dGVyIGFuZCBzZXR0ZXIgbWV0aG9kcyBmb3IgYSBwcm9wZXJ0eS4gU2V0dGluZyB0aGlzIG9wdGlvbiB0byBZRVMgd2lsbCBtYWtlCisjIGRveHlnZW4gdG8gcmVwbGFjZSB0aGUgZ2V0IGFuZCBzZXQgbWV0aG9kcyBieSBhIHByb3BlcnR5IGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGlzIHdpbGwgb25seSB3b3JrIGlmIHRoZSBtZXRob2RzIGFyZSBpbmRlZWQgZ2V0dGluZyBvciBzZXR0aW5nIGEgc2ltcGxlCisjIHR5cGUuIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBvciB5b3Ugd2FudCB0byBzaG93IHRoZSBtZXRob2RzIGFueXdheSwgeW91CisjIHNob3VsZCBzZXQgdGhpcyBvcHRpb24gdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0lETF9QUk9QRVJUWV9TVVBQT1JUICAgPSBZRVMKKworIyBJZiBtZW1iZXIgZ3JvdXBpbmcgaXMgdXNlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgdGhlIERJU1RSSUJVVEVfR1JPVVBfRE9DCisjIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHJldXNlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBmaXJzdAorIyBtZW1iZXIgaW4gdGhlIGdyb3VwIChpZiBhbnkpIGZvciB0aGUgb3RoZXIgbWVtYmVycyBvZiB0aGUgZ3JvdXAuIEJ5IGRlZmF1bHQKKyMgYWxsIG1lbWJlcnMgb2YgYSBncm91cCBtdXN0IGJlIGRvY3VtZW50ZWQgZXhwbGljaXRseS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitESVNUUklCVVRFX0dST1VQX0RPQyAgID0gTk8KKworIyBJZiBvbmUgYWRkcyBhIHN0cnVjdCBvciBjbGFzcyB0byBhIGdyb3VwIGFuZCB0aGlzIG9wdGlvbiBpcyBlbmFibGVkLCB0aGVuIGFsc28KKyMgYW55IG5lc3RlZCBjbGFzcyBvciBzdHJ1Y3QgaXMgYWRkZWQgdG8gdGhlIHNhbWUgZ3JvdXAuIEJ5IGRlZmF1bHQgdGhpcyBvcHRpb24KKyMgaXMgZGlzYWJsZWQgYW5kIG9uZSBoYXMgdG8gYWRkIG5lc3RlZCBjb21wb3VuZHMgZXhwbGljaXRseSB2aWEgXGluZ3JvdXAuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR1JPVVBfTkVTVEVEX0NPTVBPVU5EUyA9IE5PCisKKyMgU2V0IHRoZSBTVUJHUk9VUElORyB0YWcgdG8gWUVTIHRvIGFsbG93IGNsYXNzIG1lbWJlciBncm91cHMgb2YgdGhlIHNhbWUgdHlwZQorIyAoZm9yIGluc3RhbmNlIGEgZ3JvdXAgb2YgcHVibGljIGZ1bmN0aW9ucykgdG8gYmUgcHV0IGFzIGEgc3ViZ3JvdXAgb2YgdGhhdAorIyB0eXBlIChlLmcuIHVuZGVyIHRoZSBQdWJsaWMgRnVuY3Rpb25zIHNlY3Rpb24pLiBTZXQgaXQgdG8gTk8gdG8gcHJldmVudAorIyBzdWJncm91cGluZy4gQWx0ZXJuYXRpdmVseSwgdGhpcyBjYW4gYmUgZG9uZSBwZXIgY2xhc3MgdXNpbmcgdGhlCisjIFxub3N1Ymdyb3VwaW5nIGNvbW1hbmQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NVQkdST1VQSU5HICAgICAgICAgICAgPSBZRVMKKworIyBXaGVuIHRoZSBJTkxJTkVfR1JPVVBFRF9DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBjbGFzc2VzLCBzdHJ1Y3RzIGFuZCB1bmlvbnMKKyMgYXJlIHNob3duIGluc2lkZSB0aGUgZ3JvdXAgaW4gd2hpY2ggdGhleSBhcmUgaW5jbHVkZWQgKGUuZy4gdXNpbmcgXGluZ3JvdXApCisjIGluc3RlYWQgb2Ygb24gYSBzZXBhcmF0ZSBwYWdlIChmb3IgSFRNTCBhbmQgTWFuIHBhZ2VzKSBvciBzZWN0aW9uIChmb3IgTGFUZVgKKyMgYW5kIFJURikuCisjCisjIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgZG9lcyBub3Qgd29yayBpbiBjb21iaW5hdGlvbiB3aXRoCisjIFNFUEFSQVRFX01FTUJFUl9QQUdFUy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTkxJTkVfR1JPVVBFRF9DTEFTU0VTID0gTk8KKworIyBXaGVuIHRoZSBJTkxJTkVfU0lNUExFX1NUUlVDVFMgdGFnIGlzIHNldCB0byBZRVMsIHN0cnVjdHMsIGNsYXNzZXMsIGFuZCB1bmlvbnMKKyMgd2l0aCBvbmx5IHB1YmxpYyBkYXRhIGZpZWxkcyBvciBzaW1wbGUgdHlwZWRlZiBmaWVsZHMgd2lsbCBiZSBzaG93biBpbmxpbmUgaW4KKyMgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIHNjb3BlIGluIHdoaWNoIHRoZXkgYXJlIGRlZmluZWQgKGkuZS4gZmlsZSwKKyMgbmFtZXNwYWNlLCBvciBncm91cCBkb2N1bWVudGF0aW9uKSwgcHJvdmlkZWQgdGhpcyBzY29wZSBpcyBkb2N1bWVudGVkLiBJZiBzZXQKKyMgdG8gTk8sIHN0cnVjdHMsIGNsYXNzZXMsIGFuZCB1bmlvbnMgYXJlIHNob3duIG9uIGEgc2VwYXJhdGUgcGFnZSAoZm9yIEhUTUwgYW5kCisjIE1hbiBwYWdlcykgb3Igc2VjdGlvbiAoZm9yIExhVGVYIGFuZCBSVEYpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0lOTElORV9TSU1QTEVfU1RSVUNUUyAgPSBOTworCisjIFdoZW4gVFlQRURFRl9ISURFU19TVFJVQ1QgdGFnIGlzIGVuYWJsZWQsIGEgdHlwZWRlZiBvZiBhIHN0cnVjdCwgdW5pb24sIG9yCisjIGVudW0gaXMgZG9jdW1lbnRlZCBhcyBzdHJ1Y3QsIHVuaW9uLCBvciBlbnVtIHdpdGggdGhlIG5hbWUgb2YgdGhlIHR5cGVkZWYuIFNvCisjIHR5cGVkZWYgc3RydWN0IFR5cGVTIHt9IFR5cGVULCB3aWxsIGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyBhIHN0cnVjdAorIyB3aXRoIG5hbWUgVHlwZVQuIFdoZW4gZGlzYWJsZWQgdGhlIHR5cGVkZWYgd2lsbCBhcHBlYXIgYXMgYSBtZW1iZXIgb2YgYSBmaWxlLAorIyBuYW1lc3BhY2UsIG9yIGNsYXNzLiBBbmQgdGhlIHN0cnVjdCB3aWxsIGJlIG5hbWVkIFR5cGVTLiBUaGlzIGNhbiB0eXBpY2FsbHkgYmUKKyMgdXNlZnVsIGZvciBDIGNvZGUgaW4gY2FzZSB0aGUgY29kaW5nIGNvbnZlbnRpb24gZGljdGF0ZXMgdGhhdCBhbGwgY29tcG91bmQKKyMgdHlwZXMgYXJlIHR5cGVkZWYnZWQgYW5kIG9ubHkgdGhlIHR5cGVkZWYgaXMgcmVmZXJlbmNlZCwgbmV2ZXIgdGhlIHRhZyBuYW1lLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1RZUEVERUZfSElERVNfU1RSVUNUICAgPSBZRVMKKworIyBUaGUgc2l6ZSBvZiB0aGUgc3ltYm9sIGxvb2t1cCBjYWNoZSBjYW4gYmUgc2V0IHVzaW5nIExPT0tVUF9DQUNIRV9TSVpFLiBUaGlzCisjIGNhY2hlIGlzIHVzZWQgdG8gcmVzb2x2ZSBzeW1ib2xzIGdpdmVuIHRoZWlyIG5hbWUgYW5kIHNjb3BlLiBTaW5jZSB0aGlzIGNhbiBiZQorIyBhbiBleHBlbnNpdmUgcHJvY2VzcyBhbmQgb2Z0ZW4gdGhlIHNhbWUgc3ltYm9sIGFwcGVhcnMgbXVsdGlwbGUgdGltZXMgaW4gdGhlCisjIGNvZGUsIGRveHlnZW4ga2VlcHMgYSBjYWNoZSBvZiBwcmUtcmVzb2x2ZWQgc3ltYm9scy4gSWYgdGhlIGNhY2hlIGlzIHRvbyBzbWFsbAorIyBkb3h5Z2VuIHdpbGwgYmVjb21lIHNsb3dlci4gSWYgdGhlIGNhY2hlIGlzIHRvbyBsYXJnZSwgbWVtb3J5IGlzIHdhc3RlZC4gVGhlCisjIGNhY2hlIHNpemUgaXMgZ2l2ZW4gYnkgdGhpcyBmb3JtdWxhOiAyXigxNitMT09LVVBfQ0FDSEVfU0laRSkuIFRoZSB2YWxpZCByYW5nZQorIyBpcyAwLi45LCB0aGUgZGVmYXVsdCBpcyAwLCBjb3JyZXNwb25kaW5nIHRvIGEgY2FjaGUgc2l6ZSBvZiAyXjE2PTY1NTM2CisjIHN5bWJvbHMuIEF0IHRoZSBlbmQgb2YgYSBydW4gZG94eWdlbiB3aWxsIHJlcG9ydCB0aGUgY2FjaGUgdXNhZ2UgYW5kIHN1Z2dlc3QKKyMgdGhlIG9wdGltYWwgY2FjaGUgc2l6ZSBmcm9tIGEgc3BlZWQgcG9pbnQgb2Ygdmlldy4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogOSwgZGVmYXVsdCB2YWx1ZTogMC4KKworTE9PS1VQX0NBQ0hFX1NJWkUgICAgICA9IDAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBCdWlsZCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBFWFRSQUNUX0FMTCB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGFzc3VtZSBhbGwgZW50aXRpZXMgaW4KKyMgZG9jdW1lbnRhdGlvbiBhcmUgZG9jdW1lbnRlZCwgZXZlbiBpZiBubyBkb2N1bWVudGF0aW9uIHdhcyBhdmFpbGFibGUuIFByaXZhdGUKKyMgY2xhc3MgbWVtYmVycyBhbmQgc3RhdGljIGZpbGUgbWVtYmVycyB3aWxsIGJlIGhpZGRlbiB1bmxlc3MgdGhlCisjIEVYVFJBQ1RfUFJJVkFURSByZXNwZWN0aXZlbHkgRVhUUkFDVF9TVEFUSUMgdGFncyBhcmUgc2V0IHRvIFlFUy4KKyMgTm90ZTogVGhpcyB3aWxsIGFsc28gZGlzYWJsZSB0aGUgd2FybmluZ3MgYWJvdXQgdW5kb2N1bWVudGVkIG1lbWJlcnMgdGhhdCBhcmUKKyMgbm9ybWFsbHkgcHJvZHVjZWQgd2hlbiBXQVJOSU5HUyBpcyBzZXQgdG8gWUVTLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYVFJBQ1RfQUxMICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRVhUUkFDVF9QUklWQVRFIHRhZyBpcyBzZXQgdG8gWUVTLCBhbGwgcHJpdmF0ZSBtZW1iZXJzIG9mIGEgY2xhc3Mgd2lsbAorIyBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX1BSSVZBVEUgICAgICAgID0gTk8KKworIyBJZiB0aGUgRVhUUkFDVF9QQUNLQUdFIHRhZyBpcyBzZXQgdG8gWUVTLCBhbGwgbWVtYmVycyB3aXRoIHBhY2thZ2Ugb3IgaW50ZXJuYWwKKyMgc2NvcGUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX1BBQ0tBR0UgICAgICAgID0gTk8KKworIyBJZiB0aGUgRVhUUkFDVF9TVEFUSUMgdGFnIGlzIHNldCB0byBZRVMsIGFsbCBzdGF0aWMgbWVtYmVycyBvZiBhIGZpbGUgd2lsbCBiZQorIyBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX1NUQVRJQyAgICAgICAgID0gTk8KKworIyBJZiB0aGUgRVhUUkFDVF9MT0NBTF9DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBjbGFzc2VzIChhbmQgc3RydWN0cykgZGVmaW5lZAorIyBsb2NhbGx5IGluIHNvdXJjZSBmaWxlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gTk8sCisjIG9ubHkgY2xhc3NlcyBkZWZpbmVkIGluIGhlYWRlciBmaWxlcyBhcmUgaW5jbHVkZWQuIERvZXMgbm90IGhhdmUgYW55IGVmZmVjdAorIyBmb3IgSmF2YSBzb3VyY2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitFWFRSQUNUX0xPQ0FMX0NMQVNTRVMgID0gWUVTCisKKyMgVGhpcyBmbGFnIGlzIG9ubHkgdXNlZnVsIGZvciBPYmplY3RpdmUtQyBjb2RlLiBJZiBzZXQgdG8gWUVTLCBsb2NhbCBtZXRob2RzLAorIyB3aGljaCBhcmUgZGVmaW5lZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gc2VjdGlvbiBidXQgbm90IGluIHRoZSBpbnRlcmZhY2UgYXJlCisjIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gTk8sIG9ubHkgbWV0aG9kcyBpbiB0aGUgaW50ZXJmYWNlIGFyZQorIyBpbmNsdWRlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX0xPQ0FMX01FVEhPRFMgID0gTk8KKworIyBJZiB0aGlzIGZsYWcgaXMgc2V0IHRvIFlFUywgdGhlIG1lbWJlcnMgb2YgYW5vbnltb3VzIG5hbWVzcGFjZXMgd2lsbCBiZQorIyBleHRyYWN0ZWQgYW5kIGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyBhIG5hbWVzcGFjZSBjYWxsZWQKKyMgJ2Fub255bW91c19uYW1lc3BhY2V7ZmlsZX0nLCB3aGVyZSBmaWxlIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgYmFzZSBuYW1lIG9mCisjIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGFub255bW91cyBuYW1lc3BhY2UuIEJ5IGRlZmF1bHQgYW5vbnltb3VzIG5hbWVzcGFjZQorIyBhcmUgaGlkZGVuLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYVFJBQ1RfQU5PTl9OU1BBQ0VTICAgPSBOTworCisjIElmIHRoZSBISURFX1VORE9DX01FTUJFUlMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBoaWRlIGFsbAorIyB1bmRvY3VtZW50ZWQgbWVtYmVycyBpbnNpZGUgZG9jdW1lbnRlZCBjbGFzc2VzIG9yIGZpbGVzLiBJZiBzZXQgdG8gTk8gdGhlc2UKKyMgbWVtYmVycyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSB2YXJpb3VzIG92ZXJ2aWV3cywgYnV0IG5vIGRvY3VtZW50YXRpb24KKyMgc2VjdGlvbiBpcyBnZW5lcmF0ZWQuIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QgaWYgRVhUUkFDVF9BTEwgaXMgZW5hYmxlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX1VORE9DX01FTUJFUlMgICAgID0gTk8KKworIyBJZiB0aGUgSElERV9VTkRPQ19DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgaGlkZSBhbGwKKyMgdW5kb2N1bWVudGVkIGNsYXNzZXMgdGhhdCBhcmUgbm9ybWFsbHkgdmlzaWJsZSBpbiB0aGUgY2xhc3MgaGllcmFyY2h5LiBJZiBzZXQKKyMgdG8gTk8sIHRoZXNlIGNsYXNzZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgdmFyaW91cyBvdmVydmlld3MuIFRoaXMgb3B0aW9uCisjIGhhcyBubyBlZmZlY3QgaWYgRVhUUkFDVF9BTEwgaXMgZW5hYmxlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX1VORE9DX0NMQVNTRVMgICAgID0gTk8KKworIyBJZiB0aGUgSElERV9GUklFTkRfQ09NUE9VTkRTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgaGlkZSBhbGwgZnJpZW5kCisjIChjbGFzc3xzdHJ1Y3R8dW5pb24pIGRlY2xhcmF0aW9ucy4gSWYgc2V0IHRvIE5PLCB0aGVzZSBkZWNsYXJhdGlvbnMgd2lsbCBiZQorIyBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX0ZSSUVORF9DT01QT1VORFMgID0gTk8KKworIyBJZiB0aGUgSElERV9JTl9CT0RZX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBoaWRlIGFueQorIyBkb2N1bWVudGF0aW9uIGJsb2NrcyBmb3VuZCBpbnNpZGUgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbi4gSWYgc2V0IHRvIE5PLCB0aGVzZQorIyBibG9ja3Mgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZnVuY3Rpb24ncyBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIGJsb2NrLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0hJREVfSU5fQk9EWV9ET0NTICAgICAgPSBOTworCisjIFRoZSBJTlRFUk5BTF9ET0NTIHRhZyBkZXRlcm1pbmVzIGlmIGRvY3VtZW50YXRpb24gdGhhdCBpcyB0eXBlZCBhZnRlciBhCisjIFxpbnRlcm5hbCBjb21tYW5kIGlzIGluY2x1ZGVkLiBJZiB0aGUgdGFnIGlzIHNldCB0byBOTyB0aGVuIHRoZSBkb2N1bWVudGF0aW9uCisjIHdpbGwgYmUgZXhjbHVkZWQuIFNldCBpdCB0byBZRVMgdG8gaW5jbHVkZSB0aGUgaW50ZXJuYWwgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTlRFUk5BTF9ET0NTICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIENBU0VfU0VOU0VfTkFNRVMgdGFnIGlzIHNldCB0byBOTyB0aGVuIGRveHlnZW4gd2lsbCBvbmx5IGdlbmVyYXRlIGZpbGUKKyMgbmFtZXMgaW4gbG93ZXItY2FzZSBsZXR0ZXJzLiBJZiBzZXQgdG8gWUVTLCB1cHBlci1jYXNlIGxldHRlcnMgYXJlIGFsc28KKyMgYWxsb3dlZC4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgY2xhc3NlcyBvciBmaWxlcyB3aG9zZSBuYW1lcyBvbmx5IGRpZmZlcgorIyBpbiBjYXNlIGFuZCBpZiB5b3VyIGZpbGUgc3lzdGVtIHN1cHBvcnRzIGNhc2Ugc2Vuc2l0aXZlIGZpbGUgbmFtZXMuIFdpbmRvd3MKKyMgYW5kIE1hYyB1c2VycyBhcmUgYWR2aXNlZCB0byBzZXQgdGhpcyBvcHRpb24gdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBzeXN0ZW0gZGVwZW5kZW50LgorCitDQVNFX1NFTlNFX05BTUVTICAgICAgID0gTk8KKworIyBJZiB0aGUgSElERV9TQ09QRV9OQU1FUyB0YWcgaXMgc2V0IHRvIE5PIHRoZW4gZG94eWdlbiB3aWxsIHNob3cgbWVtYmVycyB3aXRoCisjIHRoZWlyIGZ1bGwgY2xhc3MgYW5kIG5hbWVzcGFjZSBzY29wZXMgaW4gdGhlIGRvY3VtZW50YXRpb24uIElmIHNldCB0byBZRVMsIHRoZQorIyBzY29wZSB3aWxsIGJlIGhpZGRlbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX1NDT1BFX05BTUVTICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEhJREVfQ09NUE9VTkRfUkVGRVJFTkNFIHRhZyBpcyBzZXQgdG8gTk8gKGRlZmF1bHQpIHRoZW4gZG94eWdlbiB3aWxsCisjIGFwcGVuZCBhZGRpdGlvbmFsIHRleHQgdG8gYSBwYWdlJ3MgdGl0bGUsIHN1Y2ggYXMgQ2xhc3MgUmVmZXJlbmNlLiBJZiBzZXQgdG8KKyMgWUVTIHRoZSBjb21wb3VuZCByZWZlcmVuY2Ugd2lsbCBiZSBoaWRkZW4uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9DT01QT1VORF9SRUZFUkVOQ0U9IE5PCisKKyMgSWYgdGhlIFNIT1dfSU5DTFVERV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBwdXQgYSBsaXN0IG9mCisjIHRoZSBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBieSBhIGZpbGUgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBmaWxlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTSE9XX0lOQ0xVREVfRklMRVMgICAgID0gWUVTCisKKyMgSWYgdGhlIFNIT1dfR1JPVVBFRF9NRU1CX0lOQyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4gd2lsbCBhZGQgZm9yIGVhY2gKKyMgZ3JvdXBlZCBtZW1iZXIgYW4gaW5jbHVkZSBzdGF0ZW1lbnQgdG8gdGhlIGRvY3VtZW50YXRpb24sIHRlbGxpbmcgdGhlIHJlYWRlcgorIyB3aGljaCBmaWxlIHRvIGluY2x1ZGUgaW4gb3JkZXIgdG8gdXNlIHRoZSBtZW1iZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU0hPV19HUk9VUEVEX01FTUJfSU5DICA9IE5PCisKKyMgSWYgdGhlIEZPUkNFX0xPQ0FMX0lOQ0xVREVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGxpc3QgaW5jbHVkZQorIyBmaWxlcyB3aXRoIGRvdWJsZSBxdW90ZXMgaW4gdGhlIGRvY3VtZW50YXRpb24gcmF0aGVyIHRoYW4gd2l0aCBzaGFycCBicmFja2V0cy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitGT1JDRV9MT0NBTF9JTkNMVURFUyAgID0gTk8KKworIyBJZiB0aGUgSU5MSU5FX0lORk8gdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhIHRhZyBbaW5saW5lXSBpcyBpbnNlcnRlZCBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbiBmb3IgaW5saW5lIG1lbWJlcnMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0lOTElORV9JTkZPICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgU09SVF9NRU1CRVJfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZQorIyAoZGV0YWlsZWQpIGRvY3VtZW50YXRpb24gb2YgZmlsZSBhbmQgY2xhc3MgbWVtYmVycyBhbHBoYWJldGljYWxseSBieSBtZW1iZXIKKyMgbmFtZS4gSWYgc2V0IHRvIE5PLCB0aGUgbWVtYmVycyB3aWxsIGFwcGVhciBpbiBkZWNsYXJhdGlvbiBvcmRlci4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU09SVF9NRU1CRVJfRE9DUyAgICAgICA9IFlFUworCisjIElmIHRoZSBTT1JUX0JSSUVGX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUgYnJpZWYKKyMgZGVzY3JpcHRpb25zIG9mIGZpbGUsIG5hbWVzcGFjZSBhbmQgY2xhc3MgbWVtYmVycyBhbHBoYWJldGljYWxseSBieSBtZW1iZXIKKyMgbmFtZS4gSWYgc2V0IHRvIE5PLCB0aGUgbWVtYmVycyB3aWxsIGFwcGVhciBpbiBkZWNsYXJhdGlvbiBvcmRlci4gTm90ZSB0aGF0CisjIHRoaXMgd2lsbCBhbHNvIGluZmx1ZW5jZSB0aGUgb3JkZXIgb2YgdGhlIGNsYXNzZXMgaW4gdGhlIGNsYXNzIGxpc3QuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU09SVF9CUklFRl9ET0NTICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFNPUlRfTUVNQkVSU19DVE9SU18xU1QgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUKKyMgKGJyaWVmIGFuZCBkZXRhaWxlZCkgZG9jdW1lbnRhdGlvbiBvZiBjbGFzcyBtZW1iZXJzIHNvIHRoYXQgY29uc3RydWN0b3JzIGFuZAorIyBkZXN0cnVjdG9ycyBhcmUgbGlzdGVkIGZpcnN0LiBJZiBzZXQgdG8gTk8gdGhlIGNvbnN0cnVjdG9ycyB3aWxsIGFwcGVhciBpbiB0aGUKKyMgcmVzcGVjdGl2ZSBvcmRlcnMgZGVmaW5lZCBieSBTT1JUX0JSSUVGX0RPQ1MgYW5kIFNPUlRfTUVNQkVSX0RPQ1MuCisjIE5vdGU6IElmIFNPUlRfQlJJRUZfRE9DUyBpcyBzZXQgdG8gTk8gdGhpcyBvcHRpb24gaXMgaWdub3JlZCBmb3Igc29ydGluZyBicmllZgorIyBtZW1iZXIgZG9jdW1lbnRhdGlvbi4KKyMgTm90ZTogSWYgU09SVF9NRU1CRVJfRE9DUyBpcyBzZXQgdG8gTk8gdGhpcyBvcHRpb24gaXMgaWdub3JlZCBmb3Igc29ydGluZworIyBkZXRhaWxlZCBtZW1iZXIgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTT1JUX01FTUJFUlNfQ1RPUlNfMVNUID0gTk8KKworIyBJZiB0aGUgU09SVF9HUk9VUF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZSBoaWVyYXJjaHkKKyMgb2YgZ3JvdXAgbmFtZXMgaW50byBhbHBoYWJldGljYWwgb3JkZXIuIElmIHNldCB0byBOTyB0aGUgZ3JvdXAgbmFtZXMgd2lsbAorIyBhcHBlYXIgaW4gdGhlaXIgZGVmaW5lZCBvcmRlci4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTT1JUX0dST1VQX05BTUVTICAgICAgID0gTk8KKworIyBJZiB0aGUgU09SVF9CWV9TQ09QRV9OQU1FIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgY2xhc3MgbGlzdCB3aWxsIGJlIHNvcnRlZCBieQorIyBmdWxseS1xdWFsaWZpZWQgbmFtZXMsIGluY2x1ZGluZyBuYW1lc3BhY2VzLiBJZiBzZXQgdG8gTk8sIHRoZSBjbGFzcyBsaXN0IHdpbGwKKyMgYmUgc29ydGVkIG9ubHkgYnkgY2xhc3MgbmFtZSwgbm90IGluY2x1ZGluZyB0aGUgbmFtZXNwYWNlIHBhcnQuCisjIE5vdGU6IFRoaXMgb3B0aW9uIGlzIG5vdCB2ZXJ5IHVzZWZ1bCBpZiBISURFX1NDT1BFX05BTUVTIGlzIHNldCB0byBZRVMuCisjIE5vdGU6IFRoaXMgb3B0aW9uIGFwcGxpZXMgb25seSB0byB0aGUgY2xhc3MgbGlzdCwgbm90IHRvIHRoZSBhbHBoYWJldGljYWwKKyMgbGlzdC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTT1JUX0JZX1NDT1BFX05BTUUgICAgID0gTk8KKworIyBJZiB0aGUgU1RSSUNUX1BST1RPX01BVENISU5HIG9wdGlvbiBpcyBlbmFibGVkIGFuZCBkb3h5Z2VuIGZhaWxzIHRvIGRvIHByb3BlcgorIyB0eXBlIHJlc29sdXRpb24gb2YgYWxsIHBhcmFtZXRlcnMgb2YgYSBmdW5jdGlvbiBpdCB3aWxsIHJlamVjdCBhIG1hdGNoIGJldHdlZW4KKyMgdGhlIHByb3RvdHlwZSBhbmQgdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgbWVtYmVyIGZ1bmN0aW9uIGV2ZW4gaWYgdGhlcmUgaXMKKyMgb25seSBvbmUgY2FuZGlkYXRlIG9yIGl0IGlzIG9idmlvdXMgd2hpY2ggY2FuZGlkYXRlIHRvIGNob29zZSBieSBkb2luZyBhCisjIHNpbXBsZSBzdHJpbmcgbWF0Y2guIEJ5IGRpc2FibGluZyBTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgZG94eWdlbiB3aWxsIHN0aWxsCisjIGFjY2VwdCBhIG1hdGNoIGJldHdlZW4gcHJvdG90eXBlIGFuZCBpbXBsZW1lbnRhdGlvbiBpbiBzdWNoIGNhc2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NUUklDVF9QUk9UT19NQVRDSElORyAgPSBOTworCisjIFRoZSBHRU5FUkFURV9UT0RPTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yIGRpc2FibGUgKE5PKSB0aGUgdG9kbworIyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFx0b2RvIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9UT0RPTElTVCAgICAgID0gWUVTCisKKyMgVGhlIEdFTkVSQVRFX1RFU1RMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3IgZGlzYWJsZSAoTk8pIHRoZSB0ZXN0CisjIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXHRlc3QgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0dFTkVSQVRFX1RFU1RMSVNUICAgICAgPSBZRVMKKworIyBUaGUgR0VORVJBVEVfQlVHTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yIGRpc2FibGUgKE5PKSB0aGUgYnVnCisjIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXGJ1ZyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfQlVHTElTVCAgICAgICA9IFlFUworCisjIFRoZSBHRU5FUkFURV9ERVBSRUNBVEVETElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yIGRpc2FibGUgKE5PKQorIyB0aGUgZGVwcmVjYXRlZCBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFxkZXByZWNhdGVkIGNvbW1hbmRzIGluCisjIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9ERVBSRUNBVEVETElTVD0gWUVTCisKKyMgVGhlIEVOQUJMRURfU0VDVElPTlMgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBjb25kaXRpb25hbCBkb2N1bWVudGF0aW9uCisjIHNlY3Rpb25zLCBtYXJrZWQgYnkgXGlmIDxzZWN0aW9uX2xhYmVsPiAuLi4gXGVuZGlmIGFuZCBcY29uZCA8c2VjdGlvbl9sYWJlbD4KKyMgLi4uIFxlbmRjb25kIGJsb2Nrcy4KKworRU5BQkxFRF9TRUNUSU9OUyAgICAgICA9IElOVEVSTkFMCisKKyMgVGhlIE1BWF9JTklUSUFMSVpFUl9MSU5FUyB0YWcgZGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbGluZXMgdGhhdCB0aGUKKyMgaW5pdGlhbCB2YWx1ZSBvZiBhIHZhcmlhYmxlIG9yIG1hY3JvIC8gZGVmaW5lIGNhbiBoYXZlIGZvciBpdCB0byBhcHBlYXIgaW4gdGhlCisjIGRvY3VtZW50YXRpb24uIElmIHRoZSBpbml0aWFsaXplciBjb25zaXN0cyBvZiBtb3JlIGxpbmVzIHRoYW4gc3BlY2lmaWVkIGhlcmUKKyMgaXQgd2lsbCBiZSBoaWRkZW4uIFVzZSBhIHZhbHVlIG9mIDAgdG8gaGlkZSBpbml0aWFsaXplcnMgY29tcGxldGVseS4gVGhlCisjIGFwcGVhcmFuY2Ugb2YgdGhlIHZhbHVlIG9mIGluZGl2aWR1YWwgdmFyaWFibGVzIGFuZCBtYWNyb3MgLyBkZWZpbmVzIGNhbiBiZQorIyBjb250cm9sbGVkIHVzaW5nIFxzaG93aW5pdGlhbGl6ZXIgb3IgXGhpZGVpbml0aWFsaXplciBjb21tYW5kIGluIHRoZQorIyBkb2N1bWVudGF0aW9uIHJlZ2FyZGxlc3Mgb2YgdGhpcyBzZXR0aW5nLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAxMDAwMCwgZGVmYXVsdCB2YWx1ZTogMzAuCisKK01BWF9JTklUSUFMSVpFUl9MSU5FUyAgPSAzMAorCisjIFNldCB0aGUgU0hPV19VU0VEX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBsaXN0IG9mIGZpbGVzIGdlbmVyYXRlZCBhdAorIyB0aGUgYm90dG9tIG9mIHRoZSBkb2N1bWVudGF0aW9uIG9mIGNsYXNzZXMgYW5kIHN0cnVjdHMuIElmIHNldCB0byBZRVMsIHRoZQorIyBsaXN0IHdpbGwgbWVudGlvbiB0aGUgZmlsZXMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NIT1dfVVNFRF9GSUxFUyAgICAgICAgPSBZRVMKKworIyBTZXQgdGhlIFNIT1dfRklMRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIEZpbGVzIHBhZ2UuIFRoaXMKKyMgd2lsbCByZW1vdmUgdGhlIEZpbGVzIGVudHJ5IGZyb20gdGhlIFF1aWNrIEluZGV4IGFuZCBmcm9tIHRoZSBGb2xkZXIgVHJlZSBWaWV3CisjIChpZiBzcGVjaWZpZWQpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTSE9XX0ZJTEVTICAgICAgICAgICAgID0gWUVTCisKKyMgU2V0IHRoZSBTSE9XX05BTUVTUEFDRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIE5hbWVzcGFjZXMKKyMgcGFnZS4gVGhpcyB3aWxsIHJlbW92ZSB0aGUgTmFtZXNwYWNlcyBlbnRyeSBmcm9tIHRoZSBRdWljayBJbmRleCBhbmQgZnJvbSB0aGUKKyMgRm9sZGVyIFRyZWUgVmlldyAoaWYgc3BlY2lmaWVkKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU0hPV19OQU1FU1BBQ0VTICAgICAgICA9IFlFUworCisjIFRoZSBGSUxFX1ZFUlNJT05fRklMVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSBvciBzY3JpcHQgdGhhdAorIyBkb3h5Z2VuIHNob3VsZCBpbnZva2UgdG8gZ2V0IHRoZSBjdXJyZW50IHZlcnNpb24gZm9yIGVhY2ggZmlsZSAodHlwaWNhbGx5IGZyb20KKyMgdGhlIHZlcnNpb24gY29udHJvbCBzeXN0ZW0pLiBEb3h5Z2VuIHdpbGwgaW52b2tlIHRoZSBwcm9ncmFtIGJ5IGV4ZWN1dGluZyAodmlhCisjIHBvcGVuKCkpIHRoZSBjb21tYW5kIGNvbW1hbmQgaW5wdXQtZmlsZSwgd2hlcmUgY29tbWFuZCBpcyB0aGUgdmFsdWUgb2YgdGhlCisjIEZJTEVfVkVSU0lPTl9GSUxURVIgdGFnLCBhbmQgaW5wdXQtZmlsZSBpcyB0aGUgbmFtZSBvZiBhbiBpbnB1dCBmaWxlIHByb3ZpZGVkCisjIGJ5IGRveHlnZW4uIFdoYXRldmVyIHRoZSBwcm9ncmFtIHdyaXRlcyB0byBzdGFuZGFyZCBvdXRwdXQgaXMgdXNlZCBhcyB0aGUgZmlsZQorIyB2ZXJzaW9uLiBGb3IgYW4gZXhhbXBsZSBzZWUgdGhlIGRvY3VtZW50YXRpb24uCisKK0ZJTEVfVkVSU0lPTl9GSUxURVIgICAgPSAKKworIyBUaGUgTEFZT1VUX0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsYXlvdXQgZmlsZSB3aGljaCB3aWxsIGJlIHBhcnNlZAorIyBieSBkb3h5Z2VuLiBUaGUgbGF5b3V0IGZpbGUgY29udHJvbHMgdGhlIGdsb2JhbCBzdHJ1Y3R1cmUgb2YgdGhlIGdlbmVyYXRlZAorIyBvdXRwdXQgZmlsZXMgaW4gYW4gb3V0cHV0IGZvcm1hdCBpbmRlcGVuZGVudCB3YXkuIFRvIGNyZWF0ZSB0aGUgbGF5b3V0IGZpbGUKKyMgdGhhdCByZXByZXNlbnRzIGRveHlnZW4ncyBkZWZhdWx0cywgcnVuIGRveHlnZW4gd2l0aCB0aGUgLWwgb3B0aW9uLiBZb3UgY2FuCisjIG9wdGlvbmFsbHkgc3BlY2lmeSBhIGZpbGUgbmFtZSBhZnRlciB0aGUgb3B0aW9uLCBpZiBvbWl0dGVkIERveHlnZW5MYXlvdXQueG1sCisjIHdpbGwgYmUgdXNlZCBhcyB0aGUgbmFtZSBvZiB0aGUgbGF5b3V0IGZpbGUuCisjCisjIE5vdGUgdGhhdCBpZiB5b3UgcnVuIGRveHlnZW4gZnJvbSBhIGRpcmVjdG9yeSBjb250YWluaW5nIGEgZmlsZSBjYWxsZWQKKyMgRG94eWdlbkxheW91dC54bWwsIGRveHlnZW4gd2lsbCBwYXJzZSBpdCBhdXRvbWF0aWNhbGx5IGV2ZW4gaWYgdGhlIExBWU9VVF9GSUxFCisjIHRhZyBpcyBsZWZ0IGVtcHR5LgorCitMQVlPVVRfRklMRSAgICAgICAgICAgID0gCisKKyMgVGhlIENJVEVfQklCX0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGJpYiBmaWxlcyBjb250YWluaW5nCisjIHRoZSByZWZlcmVuY2UgZGVmaW5pdGlvbnMuIFRoaXMgbXVzdCBiZSBhIGxpc3Qgb2YgLmJpYiBmaWxlcy4gVGhlIC5iaWIKKyMgZXh0ZW5zaW9uIGlzIGF1dG9tYXRpY2FsbHkgYXBwZW5kZWQgaWYgb21pdHRlZC4gVGhpcyByZXF1aXJlcyB0aGUgYmlidGV4IHRvb2wKKyMgdG8gYmUgaW5zdGFsbGVkLiBTZWUgYWxzbyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpYlRlWCBmb3IgbW9yZSBpbmZvLgorIyBGb3IgTGFUZVggdGhlIHN0eWxlIG9mIHRoZSBiaWJsaW9ncmFwaHkgY2FuIGJlIGNvbnRyb2xsZWQgdXNpbmcKKyMgTEFURVhfQklCX1NUWUxFLiBUbyB1c2UgdGhpcyBmZWF0dXJlIHlvdSBuZWVkIGJpYnRleCBhbmQgcGVybCBhdmFpbGFibGUgaW4gdGhlCisjIHNlYXJjaCBwYXRoLiBTZWUgYWxzbyBcY2l0ZSBmb3IgaW5mbyBob3cgdG8gY3JlYXRlIHJlZmVyZW5jZXMuCisKK0NJVEVfQklCX0ZJTEVTICAgICAgICAgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB3YXJuaW5nIGFuZCBwcm9ncmVzcyBtZXNzYWdlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoZSBRVUlFVCB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIG1lc3NhZ2VzIHRoYXQgYXJlIGdlbmVyYXRlZCB0bworIyBzdGFuZGFyZCBvdXRwdXQgYnkgZG94eWdlbi4gSWYgUVVJRVQgaXMgc2V0IHRvIFlFUyB0aGlzIGltcGxpZXMgdGhhdCB0aGUKKyMgbWVzc2FnZXMgYXJlIG9mZi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitRVUlFVCAgICAgICAgICAgICAgICAgID0gTk8KKworIyBUaGUgV0FSTklOR1MgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQgYXJlCisjIGdlbmVyYXRlZCB0byBzdGFuZGFyZCBlcnJvciAoc3RkZXJyKSBieSBkb3h5Z2VuLiBJZiBXQVJOSU5HUyBpcyBzZXQgdG8gWUVTCisjIHRoaXMgaW1wbGllcyB0aGF0IHRoZSB3YXJuaW5ncyBhcmUgb24uCisjCisjIFRpcDogVHVybiB3YXJuaW5ncyBvbiB3aGlsZSB3cml0aW5nIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitXQVJOSU5HUyAgICAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFdBUk5fSUZfVU5ET0NVTUVOVEVEIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlCisjIHdhcm5pbmdzIGZvciB1bmRvY3VtZW50ZWQgbWVtYmVycy4gSWYgRVhUUkFDVF9BTEwgaXMgc2V0IHRvIFlFUyB0aGVuIHRoaXMgZmxhZworIyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZGlzYWJsZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1dBUk5fSUZfVU5ET0NVTUVOVEVEICAgPSBZRVMKKworIyBJZiB0aGUgV0FSTl9JRl9ET0NfRVJST1IgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSB3YXJuaW5ncyBmb3IKKyMgcG90ZW50aWFsIGVycm9ycyBpbiB0aGUgZG9jdW1lbnRhdGlvbiwgc3VjaCBhcyBub3QgZG9jdW1lbnRpbmcgc29tZSBwYXJhbWV0ZXJzCisjIGluIGEgZG9jdW1lbnRlZCBmdW5jdGlvbiwgb3IgZG9jdW1lbnRpbmcgcGFyYW1ldGVycyB0aGF0IGRvbid0IGV4aXN0IG9yIHVzaW5nCisjIG1hcmt1cCBjb21tYW5kcyB3cm9uZ2x5LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitXQVJOX0lGX0RPQ19FUlJPUiAgICAgID0gWUVTCisKKyMgVGhpcyBXQVJOX05PX1BBUkFNRE9DIG9wdGlvbiBjYW4gYmUgZW5hYmxlZCB0byBnZXQgd2FybmluZ3MgZm9yIGZ1bmN0aW9ucyB0aGF0CisjIGFyZSBkb2N1bWVudGVkLCBidXQgaGF2ZSBubyBkb2N1bWVudGF0aW9uIGZvciB0aGVpciBwYXJhbWV0ZXJzIG9yIHJldHVybgorIyB2YWx1ZS4gSWYgc2V0IHRvIE5PLCBkb3h5Z2VuIHdpbGwgb25seSB3YXJuIGFib3V0IHdyb25nIG9yIGluY29tcGxldGUKKyMgcGFyYW1ldGVyIGRvY3VtZW50YXRpb24sIGJ1dCBub3QgYWJvdXQgdGhlIGFic2VuY2Ugb2YgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitXQVJOX05PX1BBUkFNRE9DICAgICAgID0gTk8KKworIyBJZiB0aGUgV0FSTl9BU19FUlJPUiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbW1lZGlhdGVseSBzdG9wIHdoZW4KKyMgYSB3YXJuaW5nIGlzIGVuY291bnRlcmVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1dBUk5fQVNfRVJST1IgICAgICAgICAgPSBOTworCisjIFRoZSBXQVJOX0ZPUk1BVCB0YWcgZGV0ZXJtaW5lcyB0aGUgZm9ybWF0IG9mIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQgZG94eWdlbgorIyBjYW4gcHJvZHVjZS4gVGhlIHN0cmluZyBzaG91bGQgY29udGFpbiB0aGUgJGZpbGUsICRsaW5lLCBhbmQgJHRleHQgdGFncywgd2hpY2gKKyMgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgZmlsZSBhbmQgbGluZSBudW1iZXIgZnJvbSB3aGljaCB0aGUgd2FybmluZyBvcmlnaW5hdGVkCisjIGFuZCB0aGUgd2FybmluZyB0ZXh0LiBPcHRpb25hbGx5IHRoZSBmb3JtYXQgbWF5IGNvbnRhaW4gJHZlcnNpb24sIHdoaWNoIHdpbGwKKyMgYmUgcmVwbGFjZWQgYnkgdGhlIHZlcnNpb24gb2YgdGhlIGZpbGUgKGlmIGl0IGNvdWxkIGJlIG9idGFpbmVkIHZpYQorIyBGSUxFX1ZFUlNJT05fRklMVEVSKQorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogJGZpbGU6JGxpbmU6ICR0ZXh0LgorCitXQVJOX0ZPUk1BVCAgICAgICAgICAgID0gIiRmaWxlOiRsaW5lOiAkdGV4dCIKKworIyBUaGUgV0FSTl9MT0dGSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgZmlsZSB0byB3aGljaCB3YXJuaW5nIGFuZCBlcnJvcgorIyBtZXNzYWdlcyBzaG91bGQgYmUgd3JpdHRlbi4gSWYgbGVmdCBibGFuayB0aGUgb3V0cHV0IGlzIHdyaXR0ZW4gdG8gc3RhbmRhcmQKKyMgZXJyb3IgKHN0ZGVycikuCisKK1dBUk5fTE9HRklMRSAgICAgICAgICAgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgaW5wdXQgZmlsZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgSU5QVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZXMgYW5kL29yIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbgorIyBkb2N1bWVudGVkIHNvdXJjZSBmaWxlcy4gWW91IG1heSBlbnRlciBmaWxlIG5hbWVzIGxpa2UgbXlmaWxlLmNwcCBvcgorIyBkaXJlY3RvcmllcyBsaWtlIC91c3Ivc3JjL215cHJvamVjdC4gU2VwYXJhdGUgdGhlIGZpbGVzIG9yIGRpcmVjdG9yaWVzIHdpdGgKKyMgc3BhY2VzLiBTZWUgYWxzbyBGSUxFX1BBVFRFUk5TIGFuZCBFWFRFTlNJT05fTUFQUElORworIyBOb3RlOiBJZiB0aGlzIHRhZyBpcyBlbXB0eSB0aGUgY3VycmVudCBkaXJlY3RvcnkgaXMgc2VhcmNoZWQuCisKK0lOUFVUICAgICAgICAgICAgICAgICAgPSBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi8KKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgdGhlIHNvdXJjZSBmaWxlcworIyB0aGF0IGRveHlnZW4gcGFyc2VzLiBJbnRlcm5hbGx5IGRveHlnZW4gdXNlcyB0aGUgVVRGLTggZW5jb2RpbmcuIERveHlnZW4gdXNlcworIyBsaWJpY29udiAob3IgdGhlIGljb252IGJ1aWx0IGludG8gbGliYykgZm9yIHRoZSB0cmFuc2NvZGluZy4gU2VlIHRoZSBsaWJpY29udgorIyBkb2N1bWVudGF0aW9uIChzZWU6IGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJpY29udikgZm9yIHRoZSBsaXN0IG9mCisjIHBvc3NpYmxlIGVuY29kaW5ncy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFVURi04LgorCitJTlBVVF9FTkNPRElORyAgICAgICAgID0gVVRGLTgKKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIElOUFVUIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlCisjIEZJTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybnMgKGxpa2UgKi5jcHAgYW5kCisjICouaCkgdG8gZmlsdGVyIG91dCB0aGUgc291cmNlLWZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4KKyMKKyMgTm90ZSB0aGF0IGZvciBjdXN0b20gZXh0ZW5zaW9ucyBvciBub3QgZGlyZWN0bHkgc3VwcG9ydGVkIGV4dGVuc2lvbnMgeW91IGFsc28KKyMgbmVlZCB0byBzZXQgRVhURU5TSU9OX01BUFBJTkcgZm9yIHRoZSBleHRlbnNpb24gb3RoZXJ3aXNlIHRoZSBmaWxlcyBhcmUgbm90CisjIHJlYWQgYnkgZG94eWdlbi4KKyMKKyMgSWYgbGVmdCBibGFuayB0aGUgZm9sbG93aW5nIHBhdHRlcm5zIGFyZSB0ZXN0ZWQ6Ki5jLCAqLmNjLCAqLmN4eCwgKi5jcHAsCisjICouYysrLCAqLmphdmEsICouaWksICouaXh4LCAqLmlwcCwgKi5pKyssICouaW5sLCAqLmlkbCwgKi5kZGwsICoub2RsLCAqLmgsCisjICouaGgsICouaHh4LCAqLmhwcCwgKi5oKyssICouY3MsICouZCwgKi5waHAsICoucGhwNCwgKi5waHA1LCAqLnBodG1sLCAqLmluYywKKyMgKi5tLCAqLm1hcmtkb3duLCAqLm1kLCAqLm1tLCAqLmRveCwgKi5weSwgKi5weXcsICouZjkwLCAqLmYsICouZm9yLCAqLnRjbCwKKyMgKi52aGQsICoudmhkbCwgKi51Y2YsICoucXNmLCAqLmFzIGFuZCAqLmpzLgorCitGSUxFX1BBVFRFUk5TICAgICAgICAgID0gQzIqLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEMyKi5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEMyKi5oCisKKyMgVGhlIFJFQ1VSU0lWRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIG9yIG5vdCBzdWJkaXJlY3RvcmllcyBzaG91bGQKKyMgYmUgc2VhcmNoZWQgZm9yIGlucHV0IGZpbGVzIGFzIHdlbGwuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUkVDVVJTSVZFICAgICAgICAgICAgICA9IFlFUworCisjIFRoZSBFWENMVURFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IHNob3VsZCBiZQorIyBleGNsdWRlZCBmcm9tIHRoZSBJTlBVVCBzb3VyY2UgZmlsZXMuIFRoaXMgd2F5IHlvdSBjYW4gZWFzaWx5IGV4Y2x1ZGUgYQorIyBzdWJkaXJlY3RvcnkgZnJvbSBhIGRpcmVjdG9yeSB0cmVlIHdob3NlIHJvb3QgaXMgc3BlY2lmaWVkIHdpdGggdGhlIElOUFVUIHRhZy4KKyMKKyMgTm90ZSB0aGF0IHJlbGF0aXZlIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggZG94eWdlbiBpcworIyBydW4uCisKK0VYQ0xVREUgICAgICAgICAgICAgICAgPSAKKworIyBUaGUgRVhDTFVERV9TWU1MSU5LUyB0YWcgY2FuIGJlIHVzZWQgdG8gc2VsZWN0IHdoZXRoZXIgb3Igbm90IGZpbGVzIG9yCisjIGRpcmVjdG9yaWVzIHRoYXQgYXJlIHN5bWJvbGljIGxpbmtzIChhIFVuaXggZmlsZSBzeXN0ZW0gZmVhdHVyZSkgYXJlIGV4Y2x1ZGVkCisjIGZyb20gdGhlIGlucHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYQ0xVREVfU1lNTElOS1MgICAgICAgPSBOTworCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVQgdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUKKyMgRVhDTFVERV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJucyB0byBleGNsdWRlCisjIGNlcnRhaW4gZmlsZXMgZnJvbSB0aG9zZSBkaXJlY3Rvcmllcy4KKyMKKyMgTm90ZSB0aGF0IHRoZSB3aWxkY2FyZHMgYXJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgZmlsZSB3aXRoIGFic29sdXRlIHBhdGgsIHNvIHRvCisjIGV4Y2x1ZGUgYWxsIHRlc3QgZGlyZWN0b3JpZXMgZm9yIGV4YW1wbGUgdXNlIHRoZSBwYXR0ZXJuICovdGVzdC8qCisKK0VYQ0xVREVfUEFUVEVSTlMgICAgICAgPSAuXyoKKworIyBUaGUgRVhDTFVERV9TWU1CT0xTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHN5bWJvbCBuYW1lcworIyAobmFtZXNwYWNlcywgY2xhc3NlcywgZnVuY3Rpb25zLCBldGMuKSB0aGF0IHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIHRoZQorIyBvdXRwdXQuIFRoZSBzeW1ib2wgbmFtZSBjYW4gYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSwgYSB3b3JkLCBvciBpZiB0aGUKKyMgd2lsZGNhcmQgKiBpcyB1c2VkLCBhIHN1YnN0cmluZy4gRXhhbXBsZXM6IEFOYW1lc3BhY2UsIEFDbGFzcywKKyMgQUNsYXNzOjpBTmFtZXNwYWNlLCBBTmFtZXNwYWNlOjoqVGVzdAorIworIyBOb3RlIHRoYXQgdGhlIHdpbGRjYXJkcyBhcmUgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBmaWxlIHdpdGggYWJzb2x1dGUgcGF0aCwgc28gdG8KKyMgZXhjbHVkZSBhbGwgdGVzdCBkaXJlY3RvcmllcyB1c2UgdGhlIHBhdHRlcm4gKi90ZXN0LyoKKworRVhDTFVERV9TWU1CT0xTICAgICAgICA9IAorCisjIFRoZSBFWEFNUExFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3IgZGlyZWN0b3JpZXMKKyMgdGhhdCBjb250YWluIGV4YW1wbGUgY29kZSBmcmFnbWVudHMgdGhhdCBhcmUgaW5jbHVkZWQgKHNlZSB0aGUgXGluY2x1ZGUKKyMgY29tbWFuZCkuCisKK0VYQU1QTEVfUEFUSCAgICAgICAgICAgPSAKKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIEVYQU1QTEVfUEFUSCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQorIyBFWEFNUExFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm4gKGxpa2UgKi5jcHAgYW5kCisjICouaCkgdG8gZmlsdGVyIG91dCB0aGUgc291cmNlLWZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4gSWYgbGVmdCBibGFuayBhbGwKKyMgZmlsZXMgYXJlIGluY2x1ZGVkLgorCitFWEFNUExFX1BBVFRFUk5TICAgICAgID0gKgorCisjIElmIHRoZSBFWEFNUExFX1JFQ1VSU0lWRSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHN1YmRpcmVjdG9yaWVzIHdpbGwgYmUKKyMgc2VhcmNoZWQgZm9yIGlucHV0IGZpbGVzIHRvIGJlIHVzZWQgd2l0aCB0aGUgXGluY2x1ZGUgb3IgXGRvbnRpbmNsdWRlIGNvbW1hbmRzCisjIGlycmVzcGVjdGl2ZSBvZiB0aGUgdmFsdWUgb2YgdGhlIFJFQ1VSU0lWRSB0YWcuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhBTVBMRV9SRUNVUlNJVkUgICAgICA9IE5PCisKKyMgVGhlIElNQUdFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3IgZGlyZWN0b3JpZXMKKyMgdGhhdCBjb250YWluIGltYWdlcyB0aGF0IGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZQorIyBcaW1hZ2UgY29tbWFuZCkuCisKK0lNQUdFX1BBVEggICAgICAgICAgICAgPSAKKworIyBUaGUgSU5QVVRfRklMVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSB0aGF0IGRveHlnZW4gc2hvdWxkCisjIGludm9rZSB0byBmaWx0ZXIgZm9yIGVhY2ggaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgZmlsdGVyIHByb2dyYW0KKyMgYnkgZXhlY3V0aW5nICh2aWEgcG9wZW4oKSkgdGhlIGNvbW1hbmQ6CisjCisjIDxmaWx0ZXI+IDxpbnB1dC1maWxlPgorIworIyB3aGVyZSA8ZmlsdGVyPiBpcyB0aGUgdmFsdWUgb2YgdGhlIElOUFVUX0ZJTFRFUiB0YWcsIGFuZCA8aW5wdXQtZmlsZT4gaXMgdGhlCisjIG5hbWUgb2YgYW4gaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIHRoZW4gdXNlIHRoZSBvdXRwdXQgdGhhdCB0aGUgZmlsdGVyCisjIHByb2dyYW0gd3JpdGVzIHRvIHN0YW5kYXJkIG91dHB1dC4gSWYgRklMVEVSX1BBVFRFUk5TIGlzIHNwZWNpZmllZCwgdGhpcyB0YWcKKyMgd2lsbCBiZSBpZ25vcmVkLgorIworIyBOb3RlIHRoYXQgdGhlIGZpbHRlciBtdXN0IG5vdCBhZGQgb3IgcmVtb3ZlIGxpbmVzOyBpdCBpcyBhcHBsaWVkIGJlZm9yZSB0aGUKKyMgY29kZSBpcyBzY2FubmVkLCBidXQgbm90IHdoZW4gdGhlIG91dHB1dCBjb2RlIGlzIGdlbmVyYXRlZC4gSWYgbGluZXMgYXJlIGFkZGVkCisjIG9yIHJlbW92ZWQsIHRoZSBhbmNob3JzIHdpbGwgbm90IGJlIHBsYWNlZCBjb3JyZWN0bHkuCisjCisjIE5vdGUgdGhhdCBmb3IgY3VzdG9tIGV4dGVuc2lvbnMgb3Igbm90IGRpcmVjdGx5IHN1cHBvcnRlZCBleHRlbnNpb25zIHlvdSBhbHNvCisjIG5lZWQgdG8gc2V0IEVYVEVOU0lPTl9NQVBQSU5HIGZvciB0aGUgZXh0ZW5zaW9uIG90aGVyd2lzZSB0aGUgZmlsZXMgYXJlIG5vdAorIyBwcm9wZXJseSBwcm9jZXNzZWQgYnkgZG94eWdlbi4KKworSU5QVVRfRklMVEVSICAgICAgICAgICA9IGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL2RvY3MvZG94eWZpbHRlci5zaAorCisjIFRoZSBGSUxURVJfUEFUVEVSTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZmlsdGVycyBvbiBhIHBlciBmaWxlIHBhdHRlcm4KKyMgYmFzaXMuIERveHlnZW4gd2lsbCBjb21wYXJlIHRoZSBmaWxlIG5hbWUgd2l0aCBlYWNoIHBhdHRlcm4gYW5kIGFwcGx5IHRoZQorIyBmaWx0ZXIgaWYgdGhlcmUgaXMgYSBtYXRjaC4gVGhlIGZpbHRlcnMgYXJlIGEgbGlzdCBvZiB0aGUgZm9ybTogcGF0dGVybj1maWx0ZXIKKyMgKGxpa2UgKi5jcHA9bXlfY3BwX2ZpbHRlcikuIFNlZSBJTlBVVF9GSUxURVIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gb24gaG93CisjIGZpbHRlcnMgYXJlIHVzZWQuIElmIHRoZSBGSUxURVJfUEFUVEVSTlMgdGFnIGlzIGVtcHR5IG9yIGlmIG5vbmUgb2YgdGhlCisjIHBhdHRlcm5zIG1hdGNoIHRoZSBmaWxlIG5hbWUsIElOUFVUX0ZJTFRFUiBpcyBhcHBsaWVkLgorIworIyBOb3RlIHRoYXQgZm9yIGN1c3RvbSBleHRlbnNpb25zIG9yIG5vdCBkaXJlY3RseSBzdXBwb3J0ZWQgZXh0ZW5zaW9ucyB5b3UgYWxzbworIyBuZWVkIHRvIHNldCBFWFRFTlNJT05fTUFQUElORyBmb3IgdGhlIGV4dGVuc2lvbiBvdGhlcndpc2UgdGhlIGZpbGVzIGFyZSBub3QKKyMgcHJvcGVybHkgcHJvY2Vzc2VkIGJ5IGRveHlnZW4uCisKK0ZJTFRFUl9QQVRURVJOUyAgICAgICAgPSAKKworIyBJZiB0aGUgRklMVEVSX1NPVVJDRV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGlucHV0IGZpbHRlciAoaWYgc2V0IHVzaW5nCisjIElOUFVUX0ZJTFRFUikgd2lsbCBhbHNvIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSBpbnB1dCBmaWxlcyB0aGF0IGFyZSB1c2VkIGZvcgorIyBwcm9kdWNpbmcgdGhlIHNvdXJjZSBmaWxlcyB0byBicm93c2UgKGkuZS4gd2hlbiBTT1VSQ0VfQlJPV1NFUiBpcyBzZXQgdG8gWUVTKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitGSUxURVJfU09VUkNFX0ZJTEVTICAgID0gWUVTCisKKyMgVGhlIEZJTFRFUl9TT1VSQ0VfUEFUVEVSTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgc291cmNlIGZpbHRlcnMgcGVyIGZpbGUKKyMgcGF0dGVybi4gQSBwYXR0ZXJuIHdpbGwgb3ZlcnJpZGUgdGhlIHNldHRpbmcgZm9yIEZJTFRFUl9QQVRURVJOIChpZiBhbnkpIGFuZAorIyBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGRpc2FibGUgc291cmNlIGZpbHRlcmluZyBmb3IgYSBzcGVjaWZpYyBwYXR0ZXJuIHVzaW5nCisjICouZXh0PSAoc28gd2l0aG91dCBuYW1pbmcgYSBmaWx0ZXIpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRklMVEVSX1NPVVJDRV9GSUxFUyBpcyBzZXQgdG8gWUVTLgorCitGSUxURVJfU09VUkNFX1BBVFRFUk5TID0gCisKKyMgSWYgdGhlIFVTRV9NREZJTEVfQVNfTUFJTlBBR0UgdGFnIHJlZmVycyB0byB0aGUgbmFtZSBvZiBhIG1hcmtkb3duIGZpbGUgdGhhdAorIyBpcyBwYXJ0IG9mIHRoZSBpbnB1dCwgaXRzIGNvbnRlbnRzIHdpbGwgYmUgcGxhY2VkIG9uIHRoZSBtYWluIHBhZ2UKKyMgKGluZGV4Lmh0bWwpLiBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IGhhdmUgYSBwcm9qZWN0IG9uIGZvciBpbnN0YW5jZSBHaXRIdWIKKyMgYW5kIHdhbnQgdG8gcmV1c2UgdGhlIGludHJvZHVjdGlvbiBwYWdlIGFsc28gZm9yIHRoZSBkb3h5Z2VuIG91dHB1dC4KKworVVNFX01ERklMRV9BU19NQUlOUEFHRSA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHNvdXJjZSBicm93c2luZworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBTT1VSQ0VfQlJPV1NFUiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGEgbGlzdCBvZiBzb3VyY2UgZmlsZXMgd2lsbCBiZQorIyBnZW5lcmF0ZWQuIERvY3VtZW50ZWQgZW50aXRpZXMgd2lsbCBiZSBjcm9zcy1yZWZlcmVuY2VkIHdpdGggdGhlc2Ugc291cmNlcy4KKyMKKyMgTm90ZTogVG8gZ2V0IHJpZCBvZiBhbGwgc291cmNlIGNvZGUgaW4gdGhlIGdlbmVyYXRlZCBvdXRwdXQsIG1ha2Ugc3VyZSB0aGF0CisjIGFsc28gVkVSQkFUSU1fSEVBREVSUyBpcyBzZXQgdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU09VUkNFX0JST1dTRVIgICAgICAgICA9IFlFUworCisjIFNldHRpbmcgdGhlIElOTElORV9TT1VSQ0VTIHRhZyB0byBZRVMgd2lsbCBpbmNsdWRlIHRoZSBib2R5IG9mIGZ1bmN0aW9ucywKKyMgY2xhc3NlcyBhbmQgZW51bXMgZGlyZWN0bHkgaW50byB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTkxJTkVfU09VUkNFUyAgICAgICAgID0gTk8KKworIyBTZXR0aW5nIHRoZSBTVFJJUF9DT0RFX0NPTU1FTlRTIHRhZyB0byBZRVMgd2lsbCBpbnN0cnVjdCBkb3h5Z2VuIHRvIGhpZGUgYW55CisjIHNwZWNpYWwgY29tbWVudCBibG9ja3MgZnJvbSBnZW5lcmF0ZWQgc291cmNlIGNvZGUgZnJhZ21lbnRzLiBOb3JtYWwgQywgQysrIGFuZAorIyBGb3J0cmFuIGNvbW1lbnRzIHdpbGwgYWx3YXlzIHJlbWFpbiB2aXNpYmxlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTVFJJUF9DT0RFX0NPTU1FTlRTICAgID0gWUVTCisKKyMgSWYgdGhlIFJFRkVSRU5DRURfQllfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkCisjIGZ1bmN0aW9uIGFsbCBkb2N1bWVudGVkIGZ1bmN0aW9ucyByZWZlcmVuY2luZyBpdCB3aWxsIGJlIGxpc3RlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OID0gWUVTCisKKyMgSWYgdGhlIFJFRkVSRU5DRVNfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkIGZ1bmN0aW9uCisjIGFsbCBkb2N1bWVudGVkIGVudGl0aWVzIGNhbGxlZC91c2VkIGJ5IHRoYXQgZnVuY3Rpb24gd2lsbCBiZSBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUkVGRVJFTkNFU19SRUxBVElPTiAgICA9IFlFUworCisjIElmIHRoZSBSRUZFUkVOQ0VTX0xJTktfU09VUkNFIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBTT1VSQ0VfQlJPV1NFUiB0YWcgaXMgc2V0CisjIHRvIFlFUyB0aGVuIHRoZSBoeXBlcmxpbmtzIGZyb20gZnVuY3Rpb25zIGluIFJFRkVSRU5DRVNfUkVMQVRJT04gYW5kCisjIFJFRkVSRU5DRURfQllfUkVMQVRJT04gbGlzdHMgd2lsbCBsaW5rIHRvIHRoZSBzb3VyY2UgY29kZS4gT3RoZXJ3aXNlIHRoZXkgd2lsbAorIyBsaW5rIHRvIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitSRUZFUkVOQ0VTX0xJTktfU09VUkNFID0gWUVTCisKKyMgSWYgU09VUkNFX1RPT0xUSVBTIGlzIGVuYWJsZWQgKHRoZSBkZWZhdWx0KSB0aGVuIGhvdmVyaW5nIGEgaHlwZXJsaW5rIGluIHRoZQorIyBzb3VyY2UgY29kZSB3aWxsIHNob3cgYSB0b29sdGlwIHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBzdWNoIGFzIHByb3RvdHlwZSwKKyMgYnJpZWYgZGVzY3JpcHRpb24gYW5kIGxpbmtzIHRvIHRoZSBkZWZpbml0aW9uIGFuZCBkb2N1bWVudGF0aW9uLiBTaW5jZSB0aGlzCisjIHdpbGwgbWFrZSB0aGUgSFRNTCBmaWxlIGxhcmdlciBhbmQgbG9hZGluZyBvZiBsYXJnZSBmaWxlcyBhIGJpdCBzbG93ZXIsIHlvdQorIyBjYW4gb3B0IHRvIGRpc2FibGUgdGhpcyBmZWF0dXJlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU09VUkNFX0JST1dTRVIgaXMgc2V0IHRvIFlFUy4KKworU09VUkNFX1RPT0xUSVBTICAgICAgICA9IFlFUworCisjIElmIHRoZSBVU0VfSFRBR1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgcmVmZXJlbmNlcyB0byBzb3VyY2UgY29kZSB3aWxsCisjIHBvaW50IHRvIHRoZSBIVE1MIGdlbmVyYXRlZCBieSB0aGUgaHRhZ3MoMSkgdG9vbCBpbnN0ZWFkIG9mIGRveHlnZW4gYnVpbHQtaW4KKyMgc291cmNlIGJyb3dzZXIuIFRoZSBodGFncyB0b29sIGlzIHBhcnQgb2YgR05VJ3MgZ2xvYmFsIHNvdXJjZSB0YWdnaW5nIHN5c3RlbQorIyAoc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nbG9iYWwvZ2xvYmFsLmh0bWwpLiBZb3Ugd2lsbCBuZWVkIHZlcnNpb24KKyMgNC44LjYgb3IgaGlnaGVyLgorIworIyBUbyB1c2UgaXQgZG8gdGhlIGZvbGxvd2luZzoKKyMgLSBJbnN0YWxsIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBnbG9iYWwKKyMgLSBFbmFibGUgU09VUkNFX0JST1dTRVIgYW5kIFVTRV9IVEFHUyBpbiB0aGUgY29uZmlnIGZpbGUKKyMgLSBNYWtlIHN1cmUgdGhlIElOUFVUIHBvaW50cyB0byB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUKKyMgLSBSdW4gZG94eWdlbiBhcyBub3JtYWwKKyMKKyMgRG94eWdlbiB3aWxsIGludm9rZSBodGFncyAoYW5kIHRoYXQgd2lsbCBpbiB0dXJuIGludm9rZSBndGFncyksIHNvIHRoZXNlCisjIHRvb2xzIG11c3QgYmUgYXZhaWxhYmxlIGZyb20gdGhlIGNvbW1hbmQgbGluZSAoaS5lLiBpbiB0aGUgc2VhcmNoIHBhdGgpLgorIworIyBUaGUgcmVzdWx0OiBpbnN0ZWFkIG9mIHRoZSBzb3VyY2UgYnJvd3NlciBnZW5lcmF0ZWQgYnkgZG94eWdlbiwgdGhlIGxpbmtzIHRvCisjIHNvdXJjZSBjb2RlIHdpbGwgbm93IHBvaW50IHRvIHRoZSBvdXRwdXQgb2YgaHRhZ3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNPVVJDRV9CUk9XU0VSIGlzIHNldCB0byBZRVMuCisKK1VTRV9IVEFHUyAgICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBWRVJCQVRJTV9IRUFERVJTIHRhZyBpcyBzZXQgdGhlIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIHZlcmJhdGltIGNvcHkgb2YgdGhlIGhlYWRlciBmaWxlIGZvciBlYWNoIGNsYXNzIGZvciB3aGljaCBhbiBpbmNsdWRlIGlzCisjIHNwZWNpZmllZC4gU2V0IHRvIE5PIHRvIGRpc2FibGUgdGhpcy4KKyMgU2VlIGFsc286IFNlY3Rpb24gXGNsYXNzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitWRVJCQVRJTV9IRUFERVJTICAgICAgID0gWUVTCisKKyMgSWYgdGhlIENMQU5HX0FTU0lTVEVEX1BBUlNJTkcgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgdXNlIHRoZQorIyBjbGFuZyBwYXJzZXIgKHNlZTogaHR0cDovL2NsYW5nLmxsdm0ub3JnLykgZm9yIG1vcmUgYWNjdXJhdGUgcGFyc2luZyBhdCB0aGUKKyMgY29zdCBvZiByZWR1Y2VkIHBlcmZvcm1hbmNlLiBUaGlzIGNhbiBiZSBwYXJ0aWN1bGFybHkgaGVscGZ1bCB3aXRoIHRlbXBsYXRlCisjIHJpY2ggQysrIGNvZGUgZm9yIHdoaWNoIGRveHlnZW4ncyBidWlsdC1pbiBwYXJzZXIgbGFja3MgdGhlIG5lY2Vzc2FyeSB0eXBlCisjIGluZm9ybWF0aW9uLgorIyBOb3RlOiBUaGUgYXZhaWxhYmlsaXR5IG9mIHRoaXMgb3B0aW9uIGRlcGVuZHMgb24gd2hldGhlciBvciBub3QgZG94eWdlbiB3YXMKKyMgZ2VuZXJhdGVkIHdpdGggdGhlIC1EdXNlLWxpYmNsYW5nPU9OIG9wdGlvbiBmb3IgQ01ha2UuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQ0xBTkdfQVNTSVNURURfUEFSU0lORyA9IFlFUworCisjIElmIGNsYW5nIGFzc2lzdGVkIHBhcnNpbmcgaXMgZW5hYmxlZCB5b3UgY2FuIHByb3ZpZGUgdGhlIGNvbXBpbGVyIHdpdGggY29tbWFuZAorIyBsaW5lIG9wdGlvbnMgdGhhdCB5b3Ugd291bGQgbm9ybWFsbHkgdXNlIHdoZW4gaW52b2tpbmcgdGhlIGNvbXBpbGVyLiBOb3RlIHRoYXQKKyMgdGhlIGluY2x1ZGUgcGF0aHMgd2lsbCBhbHJlYWR5IGJlIHNldCBieSBkb3h5Z2VuIGZvciB0aGUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzCisjIHNwZWNpZmllZCB3aXRoIElOUFVUIGFuZCBJTkNMVURFX1BBVEguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBDTEFOR19BU1NJU1RFRF9QQVJTSU5HIGlzIHNldCB0byBZRVMuCisKK0NMQU5HX09QVElPTlMgICAgICAgICAgPSAtc3RkPWMrKzE0CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGFscGhhYmV0aWNhbCBjbGFzcyBpbmRleAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBBTFBIQUJFVElDQUxfSU5ERVggdGFnIGlzIHNldCB0byBZRVMsIGFuIGFscGhhYmV0aWNhbCBpbmRleCBvZiBhbGwKKyMgY29tcG91bmRzIHdpbGwgYmUgZ2VuZXJhdGVkLiBFbmFibGUgdGhpcyBpZiB0aGUgcHJvamVjdCBjb250YWlucyBhIGxvdCBvZgorIyBjbGFzc2VzLCBzdHJ1Y3RzLCB1bmlvbnMgb3IgaW50ZXJmYWNlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworQUxQSEFCRVRJQ0FMX0lOREVYICAgICA9IFlFUworCisjIFRoZSBDT0xTX0lOX0FMUEhBX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbgorIyB3aGljaCB0aGUgYWxwaGFiZXRpY2FsIGluZGV4IGxpc3Qgd2lsbCBiZSBzcGxpdC4KKyMgTWluaW11bSB2YWx1ZTogMSwgbWF4aW11bSB2YWx1ZTogMjAsIGRlZmF1bHQgdmFsdWU6IDUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBBTFBIQUJFVElDQUxfSU5ERVggaXMgc2V0IHRvIFlFUy4KKworQ09MU19JTl9BTFBIQV9JTkRFWCAgICA9IDUKKworIyBJbiBjYXNlIGFsbCBjbGFzc2VzIGluIGEgcHJvamVjdCBzdGFydCB3aXRoIGEgY29tbW9uIHByZWZpeCwgYWxsIGNsYXNzZXMgd2lsbAorIyBiZSBwdXQgdW5kZXIgdGhlIHNhbWUgaGVhZGVyIGluIHRoZSBhbHBoYWJldGljYWwgaW5kZXguIFRoZSBJR05PUkVfUFJFRklYIHRhZworIyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJlZml4IChvciBhIGxpc3Qgb2YgcHJlZml4ZXMpIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQKKyMgd2hpbGUgZ2VuZXJhdGluZyB0aGUgaW5kZXggaGVhZGVycy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEFMUEhBQkVUSUNBTF9JTkRFWCBpcyBzZXQgdG8gWUVTLgorCitJR05PUkVfUFJFRklYICAgICAgICAgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIEhUTUwgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUwgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBIVE1MIG91dHB1dAorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9IVE1MICAgICAgICAgID0gWUVTCisKKyMgVGhlIEhUTUxfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIEhUTUwgZG9jcyB3aWxsIGJlIHB1dC4gSWYgYQorIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKKyMgaXQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogaHRtbC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9PVVRQVVQgICAgICAgICAgICA9IGh0bWwKKworIyBUaGUgSFRNTF9GSUxFX0VYVEVOU0lPTiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBleHRlbnNpb24gZm9yIGVhY2gKKyMgZ2VuZXJhdGVkIEhUTUwgcGFnZSAoZm9yIGV4YW1wbGU6IC5odG0sIC5waHAsIC5hc3ApLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogLmh0bWwuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfRklMRV9FWFRFTlNJT04gICAgPSAuaHRtbAorCisjIFRoZSBIVE1MX0hFQURFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHVzZXItZGVmaW5lZCBIVE1MIGhlYWRlciBmaWxlIGZvcgorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIHRoZSB0YWcgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyBzdGFuZGFyZCBoZWFkZXIuCisjCisjIFRvIGdldCB2YWxpZCBIVE1MIHRoZSBoZWFkZXIgZmlsZSB0aGF0IGluY2x1ZGVzIGFueSBzY3JpcHRzIGFuZCBzdHlsZSBzaGVldHMKKyMgdGhhdCBkb3h5Z2VuIG5lZWRzLCB3aGljaCBpcyBkZXBlbmRlbnQgb24gdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB1c2VkIChlLmcuCisjIHRoZSBzZXR0aW5nIEdFTkVSQVRFX1RSRUVWSUVXKS4gSXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRvIHN0YXJ0IHdpdGggYQorIyBkZWZhdWx0IGhlYWRlciB1c2luZworIyBkb3h5Z2VuIC13IGh0bWwgbmV3X2hlYWRlci5odG1sIG5ld19mb290ZXIuaHRtbCBuZXdfc3R5bGVzaGVldC5jc3MKKyMgWW91ckNvbmZpZ0ZpbGUKKyMgYW5kIHRoZW4gbW9kaWZ5IHRoZSBmaWxlIG5ld19oZWFkZXIuaHRtbC4gU2VlIGFsc28gc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIKKyMgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSB0aGUgZGVmYXVsdCBoZWFkZXIgdGhhdCBkb3h5Z2VuIG5vcm1hbGx5CisjIHVzZXMuCisjIE5vdGU6IFRoZSBoZWFkZXIgaXMgc3ViamVjdCB0byBjaGFuZ2Ugc28geW91IHR5cGljYWxseSBoYXZlIHRvIHJlZ2VuZXJhdGUgdGhlCisjIGRlZmF1bHQgaGVhZGVyIHdoZW4gdXBncmFkaW5nIHRvIGEgbmV3ZXIgdmVyc2lvbiBvZiBkb3h5Z2VuLiBGb3IgYSBkZXNjcmlwdGlvbgorIyBvZiB0aGUgcG9zc2libGUgbWFya2VycyBhbmQgYmxvY2sgbmFtZXMgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0hFQURFUiAgICAgICAgICAgID0gCisKKyMgVGhlIEhUTUxfRk9PVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgdXNlci1kZWZpbmVkIEhUTUwgZm9vdGVyIGZvciBlYWNoCisjIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIHRoZSB0YWcgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzdGFuZGFyZAorIyBmb290ZXIuIFNlZSBIVE1MX0hFQURFUiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgYSBkZWZhdWx0CisjIGZvb3RlciBhbmQgd2hhdCBzcGVjaWFsIGNvbW1hbmRzIGNhbiBiZSB1c2VkIGluc2lkZSB0aGUgZm9vdGVyLiBTZWUgYWxzbworIyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIHRoZSBkZWZhdWx0IGZvb3RlcgorIyB0aGF0IGRveHlnZW4gbm9ybWFsbHkgdXNlcy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9GT09URVIgICAgICAgICAgICA9IAorCisjIFRoZSBIVE1MX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSB1c2VyLWRlZmluZWQgY2FzY2FkaW5nIHN0eWxlCisjIHNoZWV0IHRoYXQgaXMgdXNlZCBieSBlYWNoIEhUTUwgcGFnZS4gSXQgY2FuIGJlIHVzZWQgdG8gZmluZS10dW5lIHRoZSBsb29rIG9mCisjIHRoZSBIVE1MIG91dHB1dC4gSWYgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBkZWZhdWx0IHN0eWxlIHNoZWV0LgorIyBTZWUgYWxzbyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIHRoZSBzdHlsZQorIyBzaGVldCB0aGF0IGRveHlnZW4gbm9ybWFsbHkgdXNlcy4KKyMgTm90ZTogSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIEhUTUxfRVhUUkFfU1RZTEVTSEVFVCBpbnN0ZWFkIG9mIHRoaXMgdGFnLCBhcworIyBpdCBpcyBtb3JlIHJvYnVzdCBhbmQgdGhpcyB0YWcgKEhUTUxfU1RZTEVTSEVFVCkgd2lsbCBpbiB0aGUgZnV0dXJlIGJlY29tZQorIyBvYnNvbGV0ZS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9TVFlMRVNIRUVUICAgICAgICA9IAorCisjIFRoZSBIVE1MX0VYVFJBX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYWRkaXRpb25hbCB1c2VyLWRlZmluZWQKKyMgY2FzY2FkaW5nIHN0eWxlIHNoZWV0cyB0aGF0IGFyZSBpbmNsdWRlZCBhZnRlciB0aGUgc3RhbmRhcmQgc3R5bGUgc2hlZXRzCisjIGNyZWF0ZWQgYnkgZG94eWdlbi4gVXNpbmcgdGhpcyBvcHRpb24gb25lIGNhbiBvdmVycnVsZSBjZXJ0YWluIHN0eWxlIGFzcGVjdHMuCisjIFRoaXMgaXMgcHJlZmVycmVkIG92ZXIgdXNpbmcgSFRNTF9TVFlMRVNIRUVUIHNpbmNlIGl0IGRvZXMgbm90IHJlcGxhY2UgdGhlCisjIHN0YW5kYXJkIHN0eWxlIHNoZWV0IGFuZCBpcyB0aGVyZWZvcmUgbW9yZSByb2J1c3QgYWdhaW5zdCBmdXR1cmUgdXBkYXRlcy4KKyMgRG94eWdlbiB3aWxsIGNvcHkgdGhlIHN0eWxlIHNoZWV0IGZpbGVzIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgorIyBOb3RlOiBUaGUgb3JkZXIgb2YgdGhlIGV4dHJhIHN0eWxlIHNoZWV0IGZpbGVzIGlzIG9mIGltcG9ydGFuY2UgKGUuZy4gdGhlIGxhc3QKKyMgc3R5bGUgc2hlZXQgaW4gdGhlIGxpc3Qgb3ZlcnJ1bGVzIHRoZSBzZXR0aW5nIG9mIHRoZSBwcmV2aW91cyBvbmVzIGluIHRoZQorIyBsaXN0KS4gRm9yIGFuIGV4YW1wbGUgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0VYVFJBX1NUWUxFU0hFRVQgID0gCisKKyMgVGhlIEhUTUxfRVhUUkFfRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZXh0cmEgaW1hZ2VzIG9yCisjIG90aGVyIHNvdXJjZSBmaWxlcyB3aGljaCBzaG91bGQgYmUgY29waWVkIHRvIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIE5vdGUKKyMgdGhhdCB0aGVzZSBmaWxlcyB3aWxsIGJlIGNvcGllZCB0byB0aGUgYmFzZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIFVzZSB0aGUKKyMgJHJlbHBhdGheIG1hcmtlciBpbiB0aGUgSFRNTF9IRUFERVIgYW5kL29yIEhUTUxfRk9PVEVSIGZpbGVzIHRvIGxvYWQgdGhlc2UKKyMgZmlsZXMuIEluIHRoZSBIVE1MX1NUWUxFU0hFRVQgZmlsZSwgdXNlIHRoZSBmaWxlIG5hbWUgb25seS4gQWxzbyBub3RlIHRoYXQgdGhlCisjIGZpbGVzIHdpbGwgYmUgY29waWVkIGFzLWlzOyB0aGVyZSBhcmUgbm8gY29tbWFuZHMgb3IgbWFya2VycyBhdmFpbGFibGUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfRVhUUkFfRklMRVMgICAgICAgPSAKKworIyBUaGUgSFRNTF9DT0xPUlNUWUxFX0hVRSB0YWcgY29udHJvbHMgdGhlIGNvbG9yIG9mIHRoZSBIVE1MIG91dHB1dC4gRG94eWdlbgorIyB3aWxsIGFkanVzdCB0aGUgY29sb3JzIGluIHRoZSBzdHlsZSBzaGVldCBhbmQgYmFja2dyb3VuZCBpbWFnZXMgYWNjb3JkaW5nIHRvCisjIHRoaXMgY29sb3IuIEh1ZSBpcyBzcGVjaWZpZWQgYXMgYW4gYW5nbGUgb24gYSBjb2xvcndoZWVsLCBzZWUKKyMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IdWUgZm9yIG1vcmUgaW5mb3JtYXRpb24uIEZvciBpbnN0YW5jZSB0aGUgdmFsdWUKKyMgMCByZXByZXNlbnRzIHJlZCwgNjAgaXMgeWVsbG93LCAxMjAgaXMgZ3JlZW4sIDE4MCBpcyBjeWFuLCAyNDAgaXMgYmx1ZSwgMzAwCisjIHB1cnBsZSwgYW5kIDM2MCBpcyByZWQgYWdhaW4uCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDM1OSwgZGVmYXVsdCB2YWx1ZTogMjIwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0NPTE9SU1RZTEVfSFVFICAgID0gMjIwCisKKyMgVGhlIEhUTUxfQ09MT1JTVFlMRV9TQVQgdGFnIGNvbnRyb2xzIHRoZSBwdXJpdHkgKG9yIHNhdHVyYXRpb24pIG9mIHRoZSBjb2xvcnMKKyMgaW4gdGhlIEhUTUwgb3V0cHV0LiBGb3IgYSB2YWx1ZSBvZiAwIHRoZSBvdXRwdXQgd2lsbCB1c2UgZ3JheXNjYWxlcyBvbmx5LiBBCisjIHZhbHVlIG9mIDI1NSB3aWxsIHByb2R1Y2UgdGhlIG1vc3Qgdml2aWQgY29sb3JzLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAyNTUsIGRlZmF1bHQgdmFsdWU6IDEwMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9DT0xPUlNUWUxFX1NBVCAgICA9IDEwMAorCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfR0FNTUEgdGFnIGNvbnRyb2xzIHRoZSBnYW1tYSBjb3JyZWN0aW9uIGFwcGxpZWQgdG8gdGhlCisjIGx1bWluYW5jZSBjb21wb25lbnQgb2YgdGhlIGNvbG9ycyBpbiB0aGUgSFRNTCBvdXRwdXQuIFZhbHVlcyBiZWxvdyAxMDAKKyMgZ3JhZHVhbGx5IG1ha2UgdGhlIG91dHB1dCBsaWdodGVyLCB3aGVyZWFzIHZhbHVlcyBhYm92ZSAxMDAgbWFrZSB0aGUgb3V0cHV0CisjIGRhcmtlci4gVGhlIHZhbHVlIGRpdmlkZWQgYnkgMTAwIGlzIHRoZSBhY3R1YWwgZ2FtbWEgYXBwbGllZCwgc28gODAgcmVwcmVzZW50cworIyBhIGdhbW1hIG9mIDAuOCwgVGhlIHZhbHVlIDIyMCByZXByZXNlbnRzIGEgZ2FtbWEgb2YgMi4yLCBhbmQgMTAwIGRvZXMgbm90CisjIGNoYW5nZSB0aGUgZ2FtbWEuCisjIE1pbmltdW0gdmFsdWU6IDQwLCBtYXhpbXVtIHZhbHVlOiAyNDAsIGRlZmF1bHQgdmFsdWU6IDgwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0NPTE9SU1RZTEVfR0FNTUEgID0gODAKKworIyBJZiB0aGUgSFRNTF9USU1FU1RBTVAgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZm9vdGVyIG9mIGVhY2ggZ2VuZXJhdGVkIEhUTUwKKyMgcGFnZSB3aWxsIGNvbnRhaW4gdGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgcGFnZSB3YXMgZ2VuZXJhdGVkLiBTZXR0aW5nIHRoaXMKKyMgdG8gWUVTIGNhbiBoZWxwIHRvIHNob3cgd2hlbiBkb3h5Z2VuIHdhcyBsYXN0IHJ1biBhbmQgdGh1cyBpZiB0aGUKKyMgZG9jdW1lbnRhdGlvbiBpcyB1cCB0byBkYXRlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfVElNRVNUQU1QICAgICAgICAgPSBOTworCisjIElmIHRoZSBIVE1MX0RZTkFNSUNfU0VDVElPTlMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZ2VuZXJhdGVkIEhUTUwKKyMgZG9jdW1lbnRhdGlvbiB3aWxsIGNvbnRhaW4gc2VjdGlvbnMgdGhhdCBjYW4gYmUgaGlkZGVuIGFuZCBzaG93biBhZnRlciB0aGUKKyMgcGFnZSBoYXMgbG9hZGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfRFlOQU1JQ19TRUNUSU9OUyAgPSBZRVMKKworIyBXaXRoIEhUTUxfSU5ERVhfTlVNX0VOVFJJRVMgb25lIGNhbiBjb250cm9sIHRoZSBwcmVmZXJyZWQgbnVtYmVyIG9mIGVudHJpZXMKKyMgc2hvd24gaW4gdGhlIHZhcmlvdXMgdHJlZSBzdHJ1Y3R1cmVkIGluZGljZXMgaW5pdGlhbGx5OyB0aGUgdXNlciBjYW4gZXhwYW5kCisjIGFuZCBjb2xsYXBzZSBlbnRyaWVzIGR5bmFtaWNhbGx5IGxhdGVyIG9uLiBEb3h5Z2VuIHdpbGwgZXhwYW5kIHRoZSB0cmVlIHRvCisjIHN1Y2ggYSBsZXZlbCB0aGF0IGF0IG1vc3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZW50cmllcyBhcmUgdmlzaWJsZSAodW5sZXNzCisjIGEgZnVsbHkgY29sbGFwc2VkIHRyZWUgYWxyZWFkeSBleGNlZWRzIHRoaXMgYW1vdW50KS4gU28gc2V0dGluZyB0aGUgbnVtYmVyIG9mCisjIGVudHJpZXMgMSB3aWxsIHByb2R1Y2UgYSBmdWxsIGNvbGxhcHNlZCB0cmVlIGJ5IGRlZmF1bHQuIDAgaXMgYSBzcGVjaWFsIHZhbHVlCisjIHJlcHJlc2VudGluZyBhbiBpbmZpbml0ZSBudW1iZXIgb2YgZW50cmllcyBhbmQgd2lsbCByZXN1bHQgaW4gYSBmdWxsIGV4cGFuZGVkCisjIHRyZWUgYnkgZGVmYXVsdC4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogOTk5OSwgZGVmYXVsdCB2YWx1ZTogMTAwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0lOREVYX05VTV9FTlRSSUVTID0gMTAwCisKKyMgSWYgdGhlIEdFTkVSQVRFX0RPQ1NFVCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcyB3aWxsIGJlCisjIGdlbmVyYXRlZCB0aGF0IGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciBBcHBsZSdzIFhjb2RlIDMgaW50ZWdyYXRlZCBkZXZlbG9wbWVudAorIyBlbnZpcm9ubWVudCAoc2VlOiBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS90b29scy94Y29kZS8pLCBpbnRyb2R1Y2VkIHdpdGgKKyMgT1NYIDEwLjUgKExlb3BhcmQpLiBUbyBjcmVhdGUgYSBkb2N1bWVudGF0aW9uIHNldCwgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKKyMgTWFrZWZpbGUgaW4gdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gUnVubmluZyBtYWtlIHdpbGwgcHJvZHVjZSB0aGUgZG9jc2V0IGluCisjIHRoYXQgZGlyZWN0b3J5IGFuZCBydW5uaW5nIG1ha2UgaW5zdGFsbCB3aWxsIGluc3RhbGwgdGhlIGRvY3NldCBpbgorIyB+L0xpYnJhcnkvRGV2ZWxvcGVyL1NoYXJlZC9Eb2N1bWVudGF0aW9uL0RvY1NldHMgc28gdGhhdCBYY29kZSB3aWxsIGZpbmQgaXQgYXQKKyMgc3RhcnR1cC4gU2VlIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL3Rvb2xzL2NyZWF0aW5nZG9jc2V0c3dpdGhkb3h5Z2VuLmh0bWwKKyMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfRE9DU0VUICAgICAgICA9IE5PCisKKyMgVGhpcyB0YWcgZGV0ZXJtaW5lcyB0aGUgbmFtZSBvZiB0aGUgZG9jc2V0IGZlZWQuIEEgZG9jdW1lbnRhdGlvbiBmZWVkIHByb3ZpZGVzCisjIGFuIHVtYnJlbGxhIHVuZGVyIHdoaWNoIG11bHRpcGxlIGRvY3VtZW50YXRpb24gc2V0cyBmcm9tIGEgc2luZ2xlIHByb3ZpZGVyCisjIChzdWNoIGFzIGEgY29tcGFueSBvciBwcm9kdWN0IHN1aXRlKSBjYW4gYmUgZ3JvdXBlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IERveHlnZW4gZ2VuZXJhdGVkIGRvY3MuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NTRVQgaXMgc2V0IHRvIFlFUy4KKworRE9DU0VUX0ZFRUROQU1FICAgICAgICA9ICJEb3h5Z2VuIGdlbmVyYXRlZCBkb2NzIgorCisjIFRoaXMgdGFnIHNwZWNpZmllcyBhIHN0cmluZyB0aGF0IHNob3VsZCB1bmlxdWVseSBpZGVudGlmeSB0aGUgZG9jdW1lbnRhdGlvbgorIyBzZXQgYnVuZGxlLiBUaGlzIHNob3VsZCBiZSBhIHJldmVyc2UgZG9tYWluLW5hbWUgc3R5bGUgc3RyaW5nLCBlLmcuCisjIGNvbS5teWNvbXBhbnkuTXlEb2NTZXQuIERveHlnZW4gd2lsbCBhcHBlbmQgLmRvY3NldCB0byB0aGUgbmFtZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IG9yZy5kb3h5Z2VuLlByb2plY3QuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NTRVQgaXMgc2V0IHRvIFlFUy4KKworRE9DU0VUX0JVTkRMRV9JRCAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QKKworIyBUaGUgRE9DU0VUX1BVQkxJU0hFUl9JRCB0YWcgc3BlY2lmaWVzIGEgc3RyaW5nIHRoYXQgc2hvdWxkIHVuaXF1ZWx5IGlkZW50aWZ5CisjIHRoZSBkb2N1bWVudGF0aW9uIHB1Ymxpc2hlci4gVGhpcyBzaG91bGQgYmUgYSByZXZlcnNlIGRvbWFpbi1uYW1lIHN0eWxlCisjIHN0cmluZywgZS5nLiBjb20ubXljb21wYW55Lk15RG9jU2V0LmRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBvcmcuZG94eWdlbi5QdWJsaXNoZXIuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NTRVQgaXMgc2V0IHRvIFlFUy4KKworRE9DU0VUX1BVQkxJU0hFUl9JRCAgICA9IG9yZy5kb3h5Z2VuLlB1Ymxpc2hlcgorCisjIFRoZSBET0NTRVRfUFVCTElTSEVSX05BTUUgdGFnIGlkZW50aWZpZXMgdGhlIGRvY3VtZW50YXRpb24gcHVibGlzaGVyLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogUHVibGlzaGVyLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DU0VUIGlzIHNldCB0byBZRVMuCisKK0RPQ1NFVF9QVUJMSVNIRVJfTkFNRSAgPSBQdWJsaXNoZXIKKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIGdlbmVyYXRlcyB0aHJlZQorIyBhZGRpdGlvbmFsIEhUTUwgaW5kZXggZmlsZXM6IGluZGV4LmhocCwgaW5kZXguaGhjLCBhbmQgaW5kZXguaGhrLiBUaGUKKyMgaW5kZXguaGhwIGlzIGEgcHJvamVjdCBmaWxlIHRoYXQgY2FuIGJlIHJlYWQgYnkgTWljcm9zb2Z0J3MgSFRNTCBIZWxwIFdvcmtzaG9wCisjIChzZWU6IGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9lbi11cy9kb3dubG9hZC9kZXRhaWxzLmFzcHg/aWQ9MjExMzgpIG9uCisjIFdpbmRvd3MuCisjCisjIFRoZSBIVE1MIEhlbHAgV29ya3Nob3AgY29udGFpbnMgYSBjb21waWxlciB0aGF0IGNhbiBjb252ZXJ0IGFsbCBIVE1MIG91dHB1dAorIyBnZW5lcmF0ZWQgYnkgZG94eWdlbiBpbnRvIGEgc2luZ2xlIGNvbXBpbGVkIEhUTUwgZmlsZSAoLmNobSkuIENvbXBpbGVkIEhUTUwKKyMgZmlsZXMgYXJlIG5vdyB1c2VkIGFzIHRoZSBXaW5kb3dzIDk4IGhlbHAgZm9ybWF0LCBhbmQgd2lsbCByZXBsYWNlIHRoZSBvbGQKKyMgV2luZG93cyBoZWxwIGZvcm1hdCAoLmhscCkgb24gYWxsIFdpbmRvd3MgcGxhdGZvcm1zIGluIHRoZSBmdXR1cmUuIENvbXByZXNzZWQKKyMgSFRNTCBmaWxlcyBhbHNvIGNvbnRhaW4gYW4gaW5kZXgsIGEgdGFibGUgb2YgY29udGVudHMsIGFuZCB5b3UgY2FuIHNlYXJjaCBmb3IKKyMgd29yZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uIFRoZSBIVE1MIHdvcmtzaG9wIGFsc28gY29udGFpbnMgYSB2aWV3ZXIgZm9yCisjIGNvbXByZXNzZWQgSFRNTCBmaWxlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9IVE1MSEVMUCAgICAgID0gTk8KKworIyBUaGUgQ0hNX0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGUgbmFtZSBvZiB0aGUgcmVzdWx0aW5nIC5jaG0KKyMgZmlsZS4gWW91IGNhbiBhZGQgYSBwYXRoIGluIGZyb250IG9mIHRoZSBmaWxlIGlmIHRoZSByZXN1bHQgc2hvdWxkIG5vdCBiZQorIyB3cml0dGVuIHRvIHRoZSBodG1sIG91dHB1dCBkaXJlY3RvcnkuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitDSE1fRklMRSAgICAgICAgICAgICAgID0gCisKKyMgVGhlIEhIQ19MT0NBVElPTiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gKGFic29sdXRlIHBhdGgKKyMgaW5jbHVkaW5nIGZpbGUgbmFtZSkgb2YgdGhlIEhUTUwgaGVscCBjb21waWxlciAoaGhjLmV4ZSkuIElmIG5vbi1lbXB0eSwKKyMgZG94eWdlbiB3aWxsIHRyeSB0byBydW4gdGhlIEhUTUwgaGVscCBjb21waWxlciBvbiB0aGUgZ2VuZXJhdGVkIGluZGV4LmhocC4KKyMgVGhlIGZpbGUgaGFzIHRvIGJlIHNwZWNpZmllZCB3aXRoIGZ1bGwgcGF0aC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCisKK0hIQ19MT0NBVElPTiAgICAgICAgICAgPSAKKworIyBUaGUgR0VORVJBVEVfQ0hJIGZsYWcgY29udHJvbHMgaWYgYSBzZXBhcmF0ZSAuY2hpIGluZGV4IGZpbGUgaXMgZ2VuZXJhdGVkCisjIChZRVMpIG9yIHRoYXQgaXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBtYXN0ZXIgLmNobSBmaWxlIChOTykuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX0NISSAgICAgICAgICAgPSBOTworCisjIFRoZSBDSE1fSU5ERVhfRU5DT0RJTkcgaXMgdXNlZCB0byBlbmNvZGUgSHRtbEhlbHAgaW5kZXggKGhoayksIGNvbnRlbnQgKGhoYykKKyMgYW5kIHByb2plY3QgZmlsZSBjb250ZW50LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworQ0hNX0lOREVYX0VOQ09ESU5HICAgICA9IAorCisjIFRoZSBCSU5BUllfVE9DIGZsYWcgY29udHJvbHMgd2hldGhlciBhIGJpbmFyeSB0YWJsZSBvZiBjb250ZW50cyBpcyBnZW5lcmF0ZWQKKyMgKFlFUykgb3IgYSBub3JtYWwgdGFibGUgb2YgY29udGVudHMgKE5PKSBpbiB0aGUgLmNobSBmaWxlLiBGdXJ0aGVybW9yZSBpdAorIyBlbmFibGVzIHRoZSBQcmV2aW91cyBhbmQgTmV4dCBidXR0b25zLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitCSU5BUllfVE9DICAgICAgICAgICAgID0gTk8KKworIyBUaGUgVE9DX0VYUEFORCBmbGFnIGNhbiBiZSBzZXQgdG8gWUVTIHRvIGFkZCBleHRyYSBpdGVtcyBmb3IgZ3JvdXAgbWVtYmVycyB0bworIyB0aGUgdGFibGUgb2YgY29udGVudHMgb2YgdGhlIEhUTUwgaGVscCBkb2N1bWVudGF0aW9uIGFuZCB0byB0aGUgdHJlZSB2aWV3LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitUT0NfRVhQQU5EICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgR0VORVJBVEVfUUhQIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBib3RoIFFIUF9OQU1FU1BBQ0UgYW5kCisjIFFIUF9WSVJUVUFMX0ZPTERFUiBhcmUgc2V0LCBhbiBhZGRpdGlvbmFsIGluZGV4IGZpbGUgd2lsbCBiZSBnZW5lcmF0ZWQgdGhhdAorIyBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgUXQncyBxaGVscGdlbmVyYXRvciB0byBnZW5lcmF0ZSBhIFF0IENvbXByZXNzZWQgSGVscAorIyAoLnFjaCkgb2YgdGhlIGdlbmVyYXRlZCBIVE1MIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfUUhQICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFFIR19MT0NBVElPTiB0YWcgaXMgc3BlY2lmaWVkLCB0aGUgUUNIX0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkKKyMgdGhlIGZpbGUgbmFtZSBvZiB0aGUgcmVzdWx0aW5nIC5xY2ggZmlsZS4gVGhlIHBhdGggc3BlY2lmaWVkIGlzIHJlbGF0aXZlIHRvCisjIHRoZSBIVE1MIG91dHB1dCBmb2xkZXIuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUNIX0ZJTEUgICAgICAgICAgICAgICA9IAorCisjIFRoZSBRSFBfTkFNRVNQQUNFIHRhZyBzcGVjaWZpZXMgdGhlIG5hbWVzcGFjZSB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIFF0IEhlbHAKKyMgUHJvamVjdCBvdXRwdXQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgUXQgSGVscCBQcm9qZWN0IC8gTmFtZXNwYWNlCisjIChzZWU6IGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCNuYW1lc3BhY2UpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogb3JnLmRveHlnZW4uUHJvamVjdC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRSFBfTkFNRVNQQUNFICAgICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdAorCisjIFRoZSBRSFBfVklSVFVBTF9GT0xERVIgdGFnIHNwZWNpZmllcyB0aGUgbmFtZXNwYWNlIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgUXQKKyMgSGVscCBQcm9qZWN0IG91dHB1dC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSBRdCBIZWxwIFByb2plY3QgLyBWaXJ0dWFsCisjIEZvbGRlcnMgKHNlZTogaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI3ZpcnR1YWwtCisjIGZvbGRlcnMpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogZG9jLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIUF9WSVJUVUFMX0ZPTERFUiAgICAgPSBkb2MKKworIyBJZiB0aGUgUUhQX0NVU1RfRklMVEVSX05BTUUgdGFnIGlzIHNldCwgaXQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgY3VzdG9tCisjIGZpbHRlciB0byBhZGQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgUXQgSGVscCBQcm9qZWN0IC8gQ3VzdG9tCisjIEZpbHRlcnMgKHNlZTogaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI2N1c3RvbS0KKyMgZmlsdGVycykuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUhQX0NVU1RfRklMVEVSX05BTUUgICA9IAorCisjIFRoZSBRSFBfQ1VTVF9GSUxURVJfQVRUUlMgdGFnIHNwZWNpZmllcyB0aGUgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyBvZiB0aGUKKyMgY3VzdG9tIGZpbHRlciB0byBhZGQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgUXQgSGVscCBQcm9qZWN0IC8gQ3VzdG9tCisjIEZpbHRlcnMgKHNlZTogaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI2N1c3RvbS0KKyMgZmlsdGVycykuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUhQX0NVU1RfRklMVEVSX0FUVFJTICA9IAorCisjIFRoZSBRSFBfU0VDVF9GSUxURVJfQVRUUlMgdGFnIHNwZWNpZmllcyB0aGUgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyB0aGlzCisjIHByb2plY3QncyBmaWx0ZXIgc2VjdGlvbiBtYXRjaGVzLiBRdCBIZWxwIFByb2plY3QgLyBGaWx0ZXIgQXR0cmlidXRlcyAoc2VlOgorIyBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjZmlsdGVyLWF0dHJpYnV0ZXMpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIUF9TRUNUX0ZJTFRFUl9BVFRSUyAgPSAKKworIyBUaGUgUUhHX0xPQ0FUSU9OIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiBRdCdzCisjIHFoZWxwZ2VuZXJhdG9yLiBJZiBub24tZW1wdHkgZG94eWdlbiB3aWxsIHRyeSB0byBydW4gcWhlbHBnZW5lcmF0b3Igb24gdGhlCisjIGdlbmVyYXRlZCAucWhwIGZpbGUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUhHX0xPQ0FUSU9OICAgICAgICAgICA9IAorCisjIElmIHRoZSBHRU5FUkFURV9FQ0xJUFNFSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcyB3aWxsIGJlCisjIGdlbmVyYXRlZCwgdG9nZXRoZXIgd2l0aCB0aGUgSFRNTCBmaWxlcywgdGhleSBmb3JtIGFuIEVjbGlwc2UgaGVscCBwbHVnaW4uIFRvCisjIGluc3RhbGwgdGhpcyBwbHVnaW4gYW5kIG1ha2UgaXQgYXZhaWxhYmxlIHVuZGVyIHRoZSBoZWxwIGNvbnRlbnRzIG1lbnUgaW4KKyMgRWNsaXBzZSwgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgSFRNTCBhbmQgWE1MIGZpbGVzIG5lZWRzCisjIHRvIGJlIGNvcGllZCBpbnRvIHRoZSBwbHVnaW5zIGRpcmVjdG9yeSBvZiBlY2xpcHNlLiBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5CisjIHdpdGhpbiB0aGUgcGx1Z2lucyBkaXJlY3Rvcnkgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBFQ0xJUFNFX0RPQ19JRCB2YWx1ZS4KKyMgQWZ0ZXIgY29weWluZyBFY2xpcHNlIG5lZWRzIHRvIGJlIHJlc3RhcnRlZCBiZWZvcmUgdGhlIGhlbHAgYXBwZWFycy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9FQ0xJUFNFSEVMUCAgID0gTk8KKworIyBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgRWNsaXBzZSBoZWxwIHBsdWdpbi4gV2hlbiBpbnN0YWxsaW5nIHRoZSBwbHVnaW4KKyMgdGhlIGRpcmVjdG9yeSBuYW1lIGNvbnRhaW5pbmcgdGhlIEhUTUwgYW5kIFhNTCBmaWxlcyBzaG91bGQgYWxzbyBoYXZlIHRoaXMKKyMgbmFtZS4gRWFjaCBkb2N1bWVudGF0aW9uIHNldCBzaG91bGQgaGF2ZSBpdHMgb3duIGlkZW50aWZpZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBvcmcuZG94eWdlbi5Qcm9qZWN0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRUNMSVBTRUhFTFAgaXMgc2V0IHRvIFlFUy4KKworRUNMSVBTRV9ET0NfSUQgICAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QKKworIyBJZiB5b3Ugd2FudCBmdWxsIGNvbnRyb2wgb3ZlciB0aGUgbGF5b3V0IG9mIHRoZSBnZW5lcmF0ZWQgSFRNTCBwYWdlcyBpdCBtaWdodAorIyBiZSBuZWNlc3NhcnkgdG8gZGlzYWJsZSB0aGUgaW5kZXggYW5kIHJlcGxhY2UgaXQgd2l0aCB5b3VyIG93bi4gVGhlCisjIERJU0FCTEVfSU5ERVggdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSBjb25kZW5zZWQgaW5kZXggKHRhYnMpIGF0IHRvcAorIyBvZiBlYWNoIEhUTUwgcGFnZS4gQSB2YWx1ZSBvZiBOTyBlbmFibGVzIHRoZSBpbmRleCBhbmQgdGhlIHZhbHVlIFlFUyBkaXNhYmxlcworIyBpdC4gU2luY2UgdGhlIHRhYnMgaW4gdGhlIGluZGV4IGNvbnRhaW4gdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgdGhlIG5hdmlnYXRpb24KKyMgdHJlZSwgeW91IGNhbiBzZXQgdGhpcyBvcHRpb24gdG8gWUVTIGlmIHlvdSBhbHNvIHNldCBHRU5FUkFURV9UUkVFVklFVyB0byBZRVMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworRElTQUJMRV9JTkRFWCAgICAgICAgICA9IE5PCisKKyMgVGhlIEdFTkVSQVRFX1RSRUVWSUVXIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciBhIHRyZWUtbGlrZSBpbmRleAorIyBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGdlbmVyYXRlZCB0byBkaXNwbGF5IGhpZXJhcmNoaWNhbCBpbmZvcm1hdGlvbi4gSWYgdGhlIHRhZworIyB2YWx1ZSBpcyBzZXQgdG8gWUVTLCBhIHNpZGUgcGFuZWwgd2lsbCBiZSBnZW5lcmF0ZWQgY29udGFpbmluZyBhIHRyZWUtbGlrZQorIyBpbmRleCBzdHJ1Y3R1cmUgKGp1c3QgbGlrZSB0aGUgb25lIHRoYXQgaXMgZ2VuZXJhdGVkIGZvciBIVE1MIEhlbHApLiBGb3IgdGhpcworIyB0byB3b3JrIGEgYnJvd3NlciB0aGF0IHN1cHBvcnRzIEphdmFTY3JpcHQsIERIVE1MLCBDU1MgYW5kIGZyYW1lcyBpcyByZXF1aXJlZAorIyAoaS5lLiBhbnkgbW9kZXJuIGJyb3dzZXIpLiBXaW5kb3dzIHVzZXJzIGFyZSBwcm9iYWJseSBiZXR0ZXIgb2ZmIHVzaW5nIHRoZQorIyBIVE1MIGhlbHAgZmVhdHVyZS4gVmlhIGN1c3RvbSBzdHlsZSBzaGVldHMgKHNlZSBIVE1MX0VYVFJBX1NUWUxFU0hFRVQpIG9uZSBjYW4KKyMgZnVydGhlciBmaW5lLXR1bmUgdGhlIGxvb2sgb2YgdGhlIGluZGV4LiBBcyBhbiBleGFtcGxlLCB0aGUgZGVmYXVsdCBzdHlsZQorIyBzaGVldCBnZW5lcmF0ZWQgYnkgZG94eWdlbiBoYXMgYW4gZXhhbXBsZSB0aGF0IHNob3dzIGhvdyB0byBwdXQgYW4gaW1hZ2UgYXQKKyMgdGhlIHJvb3Qgb2YgdGhlIHRyZWUgaW5zdGVhZCBvZiB0aGUgUFJPSkVDVF9OQU1FLiBTaW5jZSB0aGUgdHJlZSBiYXNpY2FsbHkgaGFzCisjIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIHRoZSB0YWIgaW5kZXgsIHlvdSBjb3VsZCBjb25zaWRlciBzZXR0aW5nCisjIERJU0FCTEVfSU5ERVggdG8gWUVTIHdoZW4gZW5hYmxpbmcgdGhpcyBvcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfVFJFRVZJRVcgICAgICA9IFlFUworCisjIFRoZSBFTlVNX1ZBTFVFU19QRVJfTElORSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2YgZW51bSB2YWx1ZXMgdGhhdAorIyBkb3h5Z2VuIHdpbGwgZ3JvdXAgb24gb25lIGxpbmUgaW4gdGhlIGdlbmVyYXRlZCBIVE1MIGRvY3VtZW50YXRpb24uCisjCisjIE5vdGUgdGhhdCBhIHZhbHVlIG9mIDAgd2lsbCBjb21wbGV0ZWx5IHN1cHByZXNzIHRoZSBlbnVtIHZhbHVlcyBmcm9tIGFwcGVhcmluZworIyBpbiB0aGUgb3ZlcnZpZXcgc2VjdGlvbi4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMjAsIGRlZmF1bHQgdmFsdWU6IDQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0VOVU1fVkFMVUVTX1BFUl9MSU5FICAgPSA0CisKKyMgSWYgdGhlIHRyZWV2aWV3IGlzIGVuYWJsZWQgKHNlZSBHRU5FUkFURV9UUkVFVklFVykgdGhlbiB0aGlzIHRhZyBjYW4gYmUgdXNlZAorIyB0byBzZXQgdGhlIGluaXRpYWwgd2lkdGggKGluIHBpeGVscykgb2YgdGhlIGZyYW1lIGluIHdoaWNoIHRoZSB0cmVlIGlzIHNob3duLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAxNTAwLCBkZWZhdWx0IHZhbHVlOiAyNTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK1RSRUVWSUVXX1dJRFRIICAgICAgICAgPSAyNTAKKworIyBJZiB0aGUgRVhUX0xJTktTX0lOX1dJTkRPVyBvcHRpb24gaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIG9wZW4gbGlua3MgdG8KKyMgZXh0ZXJuYWwgc3ltYm9scyBpbXBvcnRlZCB2aWEgdGFnIGZpbGVzIGluIGEgc2VwYXJhdGUgd2luZG93LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0VYVF9MSU5LU19JTl9XSU5ET1cgICAgPSBOTworCisjIFVzZSB0aGlzIHRhZyB0byBjaGFuZ2UgdGhlIGZvbnQgc2l6ZSBvZiBMYVRlWCBmb3JtdWxhcyBpbmNsdWRlZCBhcyBpbWFnZXMgaW4KKyMgdGhlIEhUTUwgZG9jdW1lbnRhdGlvbi4gV2hlbiB5b3UgY2hhbmdlIHRoZSBmb250IHNpemUgYWZ0ZXIgYSBzdWNjZXNzZnVsCisjIGRveHlnZW4gcnVuIHlvdSBuZWVkIHRvIG1hbnVhbGx5IHJlbW92ZSBhbnkgZm9ybV8qLnBuZyBpbWFnZXMgZnJvbSB0aGUgSFRNTAorIyBvdXRwdXQgZGlyZWN0b3J5IHRvIGZvcmNlIHRoZW0gdG8gYmUgcmVnZW5lcmF0ZWQuCisjIE1pbmltdW0gdmFsdWU6IDgsIG1heGltdW0gdmFsdWU6IDUwLCBkZWZhdWx0IHZhbHVlOiAxMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworRk9STVVMQV9GT05UU0laRSAgICAgICA9IDEwCisKKyMgVXNlIHRoZSBGT1JNVUxBX1RSQU5QQVJFTlQgdGFnIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGUgaW1hZ2VzCisjIGdlbmVyYXRlZCBmb3IgZm9ybXVsYXMgYXJlIHRyYW5zcGFyZW50IFBOR3MuIFRyYW5zcGFyZW50IFBOR3MgYXJlIG5vdAorIyBzdXBwb3J0ZWQgcHJvcGVybHkgZm9yIElFIDYuMCwgYnV0IGFyZSBzdXBwb3J0ZWQgb24gYWxsIG1vZGVybiBicm93c2Vycy4KKyMKKyMgTm90ZSB0aGF0IHdoZW4gY2hhbmdpbmcgdGhpcyBvcHRpb24geW91IG5lZWQgdG8gZGVsZXRlIGFueSBmb3JtXyoucG5nIGZpbGVzIGluCisjIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkgYmVmb3JlIHRoZSBjaGFuZ2VzIGhhdmUgZWZmZWN0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitGT1JNVUxBX1RSQU5TUEFSRU5UICAgID0gWUVTCisKKyMgRW5hYmxlIHRoZSBVU0VfTUFUSEpBWCBvcHRpb24gdG8gcmVuZGVyIExhVGVYIGZvcm11bGFzIHVzaW5nIE1hdGhKYXggKHNlZQorIyBodHRwOi8vd3d3Lm1hdGhqYXgub3JnKSB3aGljaCB1c2VzIGNsaWVudCBzaWRlIEphdmFzY3JpcHQgZm9yIHRoZSByZW5kZXJpbmcKKyMgaW5zdGVhZCBvZiB1c2luZyBwcmUtcmVuZGVyZWQgYml0bWFwcy4gVXNlIHRoaXMgaWYgeW91IGRvIG5vdCBoYXZlIExhVGVYCisjIGluc3RhbGxlZCBvciBpZiB5b3Ugd2FudCB0byBmb3JtdWxhcyBsb29rIHByZXR0aWVyIGluIHRoZSBIVE1MIG91dHB1dC4gV2hlbgorIyBlbmFibGVkIHlvdSBtYXkgYWxzbyBuZWVkIHRvIGluc3RhbGwgTWF0aEpheCBzZXBhcmF0ZWx5IGFuZCBjb25maWd1cmUgdGhlIHBhdGgKKyMgdG8gaXQgdXNpbmcgdGhlIE1BVEhKQVhfUkVMUEFUSCBvcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworVVNFX01BVEhKQVggICAgICAgICAgICA9IE5PCisKKyMgV2hlbiBNYXRoSmF4IGlzIGVuYWJsZWQgeW91IGNhbiBzZXQgdGhlIGRlZmF1bHQgb3V0cHV0IGZvcm1hdCB0byBiZSB1c2VkIGZvcgorIyB0aGUgTWF0aEpheCBvdXRwdXQuIFNlZSB0aGUgTWF0aEpheCBzaXRlIChzZWU6CisjIGh0dHA6Ly9kb2NzLm1hdGhqYXgub3JnL2VuL2xhdGVzdC9vdXRwdXQuaHRtbCkgZm9yIG1vcmUgZGV0YWlscy4KKyMgUG9zc2libGUgdmFsdWVzIGFyZTogSFRNTC1DU1MgKHdoaWNoIGlzIHNsb3dlciwgYnV0IGhhcyB0aGUgYmVzdAorIyBjb21wYXRpYmlsaXR5KSwgTmF0aXZlTU1MIChpLmUuIE1hdGhNTCkgYW5kIFNWRy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IEhUTUwtQ1NTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgVVNFX01BVEhKQVggaXMgc2V0IHRvIFlFUy4KKworTUFUSEpBWF9GT1JNQVQgICAgICAgICA9IEhUTUwtQ1NTCisKKyMgV2hlbiBNYXRoSmF4IGlzIGVuYWJsZWQgeW91IG5lZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIEhUTUwKKyMgb3V0cHV0IGRpcmVjdG9yeSB1c2luZyB0aGUgTUFUSEpBWF9SRUxQQVRIIG9wdGlvbi4gVGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeQorIyBzaG91bGQgY29udGFpbiB0aGUgTWF0aEpheC5qcyBzY3JpcHQuIEZvciBpbnN0YW5jZSwgaWYgdGhlIG1hdGhqYXggZGlyZWN0b3J5CisjIGlzIGxvY2F0ZWQgYXQgdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeSwgdGhlbgorIyBNQVRISkFYX1JFTFBBVEggc2hvdWxkIGJlIC4uL21hdGhqYXguIFRoZSBkZWZhdWx0IHZhbHVlIHBvaW50cyB0byB0aGUgTWF0aEpheAorIyBDb250ZW50IERlbGl2ZXJ5IE5ldHdvcmsgc28geW91IGNhbiBxdWlja2x5IHNlZSB0aGUgcmVzdWx0IHdpdGhvdXQgaW5zdGFsbGluZworIyBNYXRoSmF4LiBIb3dldmVyLCBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBpbnN0YWxsIGEgbG9jYWwgY29weSBvZgorIyBNYXRoSmF4IGZyb20gaHR0cDovL3d3dy5tYXRoamF4Lm9yZyBiZWZvcmUgZGVwbG95bWVudC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IGh0dHA6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBVU0VfTUFUSEpBWCBpcyBzZXQgdG8gWUVTLgorCitNQVRISkFYX1JFTFBBVEggICAgICAgID0gaHR0cDovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdAorCisjIFRoZSBNQVRISkFYX0VYVEVOU0lPTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgTWF0aEpheAorIyBleHRlbnNpb24gbmFtZXMgdGhhdCBzaG91bGQgYmUgZW5hYmxlZCBkdXJpbmcgTWF0aEpheCByZW5kZXJpbmcuIEZvciBleGFtcGxlCisjIE1BVEhKQVhfRVhURU5TSU9OUyA9IFRlWC9BTVNtYXRoIFRlWC9BTVNzeW1ib2xzCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBVU0VfTUFUSEpBWCBpcyBzZXQgdG8gWUVTLgorCitNQVRISkFYX0VYVEVOU0lPTlMgICAgID0gCisKKyMgVGhlIE1BVEhKQVhfQ09ERUZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBmaWxlIHdpdGggamF2YXNjcmlwdCBwaWVjZXMKKyMgb2YgY29kZSB0aGF0IHdpbGwgYmUgdXNlZCBvbiBzdGFydHVwIG9mIHRoZSBNYXRoSmF4IGNvZGUuIFNlZSB0aGUgTWF0aEpheCBzaXRlCisjIChzZWU6IGh0dHA6Ly9kb2NzLm1hdGhqYXgub3JnL2VuL2xhdGVzdC9vdXRwdXQuaHRtbCkgZm9yIG1vcmUgZGV0YWlscy4gRm9yIGFuCisjIGV4YW1wbGUgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgVVNFX01BVEhKQVggaXMgc2V0IHRvIFlFUy4KKworTUFUSEpBWF9DT0RFRklMRSAgICAgICA9IAorCisjIFdoZW4gdGhlIFNFQVJDSEVOR0lORSB0YWcgaXMgZW5hYmxlZCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzZWFyY2ggYm94IGZvcgorIyB0aGUgSFRNTCBvdXRwdXQuIFRoZSB1bmRlcmx5aW5nIHNlYXJjaCBlbmdpbmUgdXNlcyBqYXZhc2NyaXB0IGFuZCBESFRNTCBhbmQKKyMgc2hvdWxkIHdvcmsgb24gYW55IG1vZGVybiBicm93c2VyLiBOb3RlIHRoYXQgd2hlbiB1c2luZyBIVE1MIGhlbHAKKyMgKEdFTkVSQVRFX0hUTUxIRUxQKSwgUXQgaGVscCAoR0VORVJBVEVfUUhQKSwgb3IgZG9jc2V0cyAoR0VORVJBVEVfRE9DU0VUKQorIyB0aGVyZSBpcyBhbHJlYWR5IGEgc2VhcmNoIGZ1bmN0aW9uIHNvIHRoaXMgb25lIHNob3VsZCB0eXBpY2FsbHkgYmUgZGlzYWJsZWQuCisjIEZvciBsYXJnZSBwcm9qZWN0cyB0aGUgamF2YXNjcmlwdCBiYXNlZCBzZWFyY2ggZW5naW5lIGNhbiBiZSBzbG93LCB0aGVuCisjIGVuYWJsaW5nIFNFUlZFUl9CQVNFRF9TRUFSQ0ggbWF5IHByb3ZpZGUgYSBiZXR0ZXIgc29sdXRpb24uIEl0IGlzIHBvc3NpYmxlIHRvCisjIHNlYXJjaCB1c2luZyB0aGUga2V5Ym9hcmQ7IHRvIGp1bXAgdG8gdGhlIHNlYXJjaCBib3ggdXNlIDxhY2Nlc3Mga2V5PiArIFMKKyMgKHdoYXQgdGhlIDxhY2Nlc3Mga2V5PiBpcyBkZXBlbmRzIG9uIHRoZSBPUyBhbmQgYnJvd3NlciwgYnV0IGl0IGlzIHR5cGljYWxseQorIyA8Q1RSTD4sIDxBTFQ+LzxvcHRpb24+LCBvciBib3RoKS4gSW5zaWRlIHRoZSBzZWFyY2ggYm94IHVzZSB0aGUgPGN1cnNvciBkb3duCisjIGtleT4gdG8ganVtcCBpbnRvIHRoZSBzZWFyY2ggcmVzdWx0cyB3aW5kb3csIHRoZSByZXN1bHRzIGNhbiBiZSBuYXZpZ2F0ZWQKKyMgdXNpbmcgdGhlIDxjdXJzb3Iga2V5cz4uIFByZXNzIDxFbnRlcj4gdG8gc2VsZWN0IGFuIGl0ZW0gb3IgPGVzY2FwZT4gdG8gY2FuY2VsCisjIHRoZSBzZWFyY2guIFRoZSBmaWx0ZXIgb3B0aW9ucyBjYW4gYmUgc2VsZWN0ZWQgd2hlbiB0aGUgY3Vyc29yIGlzIGluc2lkZSB0aGUKKyMgc2VhcmNoIGJveCBieSBwcmVzc2luZyA8U2hpZnQ+KzxjdXJzb3IgZG93bj4uIEFsc28gaGVyZSB1c2UgdGhlIDxjdXJzb3Iga2V5cz4KKyMgdG8gc2VsZWN0IGEgZmlsdGVyIGFuZCA8RW50ZXI+IG9yIDxlc2NhcGU+IHRvIGFjdGl2YXRlIG9yIGNhbmNlbCB0aGUgZmlsdGVyCisjIG9wdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworU0VBUkNIRU5HSU5FICAgICAgICAgICA9IFlFUworCisjIFdoZW4gdGhlIFNFUlZFUl9CQVNFRF9TRUFSQ0ggdGFnIGlzIGVuYWJsZWQgdGhlIHNlYXJjaCBlbmdpbmUgd2lsbCBiZQorIyBpbXBsZW1lbnRlZCB1c2luZyBhIHdlYiBzZXJ2ZXIgaW5zdGVhZCBvZiBhIHdlYiBjbGllbnQgdXNpbmcgSmF2YXNjcmlwdC4gVGhlcmUKKyMgYXJlIHR3byBmbGF2b3JzIG9mIHdlYiBzZXJ2ZXIgYmFzZWQgc2VhcmNoaW5nIGRlcGVuZGluZyBvbiB0aGUgRVhURVJOQUxfU0VBUkNICisjIHNldHRpbmcuIFdoZW4gZGlzYWJsZWQsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIFBIUCBzY3JpcHQgZm9yIHNlYXJjaGluZyBhbmQKKyMgYW4gaW5kZXggZmlsZSB1c2VkIGJ5IHRoZSBzY3JpcHQuIFdoZW4gRVhURVJOQUxfU0VBUkNIIGlzIGVuYWJsZWQgdGhlIGluZGV4aW5nCisjIGFuZCBzZWFyY2hpbmcgbmVlZHMgdG8gYmUgcHJvdmlkZWQgYnkgZXh0ZXJuYWwgdG9vbHMuIFNlZSB0aGUgc2VjdGlvbgorIyAiRXh0ZXJuYWwgSW5kZXhpbmcgYW5kIFNlYXJjaGluZyIgZm9yIGRldGFpbHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitTRVJWRVJfQkFTRURfU0VBUkNIICAgID0gTk8KKworIyBXaGVuIEVYVEVSTkFMX1NFQVJDSCB0YWcgaXMgZW5hYmxlZCBkb3h5Z2VuIHdpbGwgbm8gbG9uZ2VyIGdlbmVyYXRlIHRoZSBQSFAKKyMgc2NyaXB0IGZvciBzZWFyY2hpbmcuIEluc3RlYWQgdGhlIHNlYXJjaCByZXN1bHRzIGFyZSB3cml0dGVuIHRvIGFuIFhNTCBmaWxlCisjIHdoaWNoIG5lZWRzIHRvIGJlIHByb2Nlc3NlZCBieSBhbiBleHRlcm5hbCBpbmRleGVyLiBEb3h5Z2VuIHdpbGwgaW52b2tlIGFuCisjIGV4dGVybmFsIHNlYXJjaCBlbmdpbmUgcG9pbnRlZCB0byBieSB0aGUgU0VBUkNIRU5HSU5FX1VSTCBvcHRpb24gdG8gb2J0YWluIHRoZQorIyBzZWFyY2ggcmVzdWx0cy4KKyMKKyMgRG94eWdlbiBzaGlwcyB3aXRoIGFuIGV4YW1wbGUgaW5kZXhlciAoZG94eWluZGV4ZXIpIGFuZCBzZWFyY2ggZW5naW5lCisjIChkb3h5c2VhcmNoLmNnaSkgd2hpY2ggYXJlIGJhc2VkIG9uIHRoZSBvcGVuIHNvdXJjZSBzZWFyY2ggZW5naW5lIGxpYnJhcnkKKyMgWGFwaWFuIChzZWU6IGh0dHA6Ly94YXBpYW4ub3JnLykuCisjCisjIFNlZSB0aGUgc2VjdGlvbiAiRXh0ZXJuYWwgSW5kZXhpbmcgYW5kIFNlYXJjaGluZyIgZm9yIGRldGFpbHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitFWFRFUk5BTF9TRUFSQ0ggICAgICAgID0gTk8KKworIyBUaGUgU0VBUkNIRU5HSU5FX1VSTCBzaG91bGQgcG9pbnQgdG8gYSBzZWFyY2ggZW5naW5lIGhvc3RlZCBieSBhIHdlYiBzZXJ2ZXIKKyMgd2hpY2ggd2lsbCByZXR1cm4gdGhlIHNlYXJjaCByZXN1bHRzIHdoZW4gRVhURVJOQUxfU0VBUkNIIGlzIGVuYWJsZWQuCisjCisjIERveHlnZW4gc2hpcHMgd2l0aCBhbiBleGFtcGxlIGluZGV4ZXIgKGRveHlpbmRleGVyKSBhbmQgc2VhcmNoIGVuZ2luZQorIyAoZG94eXNlYXJjaC5jZ2kpIHdoaWNoIGFyZSBiYXNlZCBvbiB0aGUgb3BlbiBzb3VyY2Ugc2VhcmNoIGVuZ2luZSBsaWJyYXJ5CisjIFhhcGlhbiAoc2VlOiBodHRwOi8veGFwaWFuLm9yZy8pLiBTZWUgdGhlIHNlY3Rpb24gIkV4dGVybmFsIEluZGV4aW5nIGFuZAorIyBTZWFyY2hpbmciIGZvciBkZXRhaWxzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK1NFQVJDSEVOR0lORV9VUkwgICAgICAgPSAKKworIyBXaGVuIFNFUlZFUl9CQVNFRF9TRUFSQ0ggYW5kIEVYVEVSTkFMX1NFQVJDSCBhcmUgYm90aCBlbmFibGVkIHRoZSB1bmluZGV4ZWQKKyMgc2VhcmNoIGRhdGEgaXMgd3JpdHRlbiB0byBhIGZpbGUgZm9yIGluZGV4aW5nIGJ5IGFuIGV4dGVybmFsIHRvb2wuIFdpdGggdGhlCisjIFNFQVJDSERBVEFfRklMRSB0YWcgdGhlIG5hbWUgb2YgdGhpcyBmaWxlIGNhbiBiZSBzcGVjaWZpZWQuCisjIFRoZSBkZWZhdWx0IGZpbGUgaXM6IHNlYXJjaGRhdGEueG1sLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK1NFQVJDSERBVEFfRklMRSAgICAgICAgPSBzZWFyY2hkYXRhLnhtbAorCisjIFdoZW4gU0VSVkVSX0JBU0VEX1NFQVJDSCBhbmQgRVhURVJOQUxfU0VBUkNIIGFyZSBib3RoIGVuYWJsZWQgdGhlCisjIEVYVEVSTkFMX1NFQVJDSF9JRCB0YWcgY2FuIGJlIHVzZWQgYXMgYW4gaWRlbnRpZmllciBmb3IgdGhlIHByb2plY3QuIFRoaXMgaXMKKyMgdXNlZnVsIGluIGNvbWJpbmF0aW9uIHdpdGggRVhUUkFfU0VBUkNIX01BUFBJTkdTIHRvIHNlYXJjaCB0aHJvdWdoIG11bHRpcGxlCisjIHByb2plY3RzIGFuZCByZWRpcmVjdCB0aGUgcmVzdWx0cyBiYWNrIHRvIHRoZSByaWdodCBwcm9qZWN0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK0VYVEVSTkFMX1NFQVJDSF9JRCAgICAgPSAKKworIyBUaGUgRVhUUkFfU0VBUkNIX01BUFBJTkdTIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgc2VhcmNoaW5nIHRocm91Z2ggZG94eWdlbgorIyBwcm9qZWN0cyBvdGhlciB0aGFuIHRoZSBvbmUgZGVmaW5lZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwgYnV0IHRoYXQgYXJlCisjIGFsbCBhZGRlZCB0byB0aGUgc2FtZSBleHRlcm5hbCBzZWFyY2ggaW5kZXguIEVhY2ggcHJvamVjdCBuZWVkcyB0byBoYXZlIGEKKyMgdW5pcXVlIGlkIHNldCB2aWEgRVhURVJOQUxfU0VBUkNIX0lELiBUaGUgc2VhcmNoIG1hcHBpbmcgdGhlbiBtYXBzIHRoZSBpZCBvZgorIyB0byBhIHJlbGF0aXZlIGxvY2F0aW9uIHdoZXJlIHRoZSBkb2N1bWVudGF0aW9uIGNhbiBiZSBmb3VuZC4gVGhlIGZvcm1hdCBpczoKKyMgRVhUUkFfU0VBUkNIX01BUFBJTkdTID0gdGFnbmFtZTE9bG9jMSB0YWduYW1lMj1sb2MyIC4uLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK0VYVFJBX1NFQVJDSF9NQVBQSU5HUyAgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgTGFUZVggb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgTGFUZVggb3V0cHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9MQVRFWCAgICAgICAgID0gTk8KKworIyBUaGUgTEFURVhfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIExhVGVYIGRvY3Mgd2lsbCBiZSBwdXQuIElmIGEKKyMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCisjIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IGxhdGV4LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfT1VUUFVUICAgICAgICAgICA9IGxhdGV4CisKKyMgVGhlIExBVEVYX0NNRF9OQU1FIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBMYVRlWCBjb21tYW5kIG5hbWUgdG8gYmUKKyMgaW52b2tlZC4KKyMKKyMgTm90ZSB0aGF0IHdoZW4gZW5hYmxpbmcgVVNFX1BERkxBVEVYIHRoaXMgb3B0aW9uIGlzIG9ubHkgdXNlZCBmb3IgZ2VuZXJhdGluZworIyBiaXRtYXBzIGZvciBmb3JtdWxhcyBpbiB0aGUgSFRNTCBvdXRwdXQsIGJ1dCBub3QgaW4gdGhlIE1ha2VmaWxlIHRoYXQgaXMKKyMgd3JpdHRlbiB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KKyMgVGhlIGRlZmF1bHQgZmlsZSBpczogbGF0ZXguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9DTURfTkFNRSAgICAgICAgID0gbGF0ZXgKKworIyBUaGUgTUFLRUlOREVYX0NNRF9OQU1FIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjb21tYW5kIG5hbWUgdG8gZ2VuZXJhdGUKKyMgaW5kZXggZm9yIExhVGVYLgorIyBUaGUgZGVmYXVsdCBmaWxlIGlzOiBtYWtlaW5kZXguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitNQUtFSU5ERVhfQ01EX05BTUUgICAgID0gbWFrZWluZGV4CisKKyMgSWYgdGhlIENPTVBBQ1RfTEFURVggdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gZ2VuZXJhdGVzIG1vcmUgY29tcGFjdCBMYVRlWAorIyBkb2N1bWVudHMuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3Igc21hbGwgcHJvamVjdHMgYW5kIG1heSBoZWxwIHRvIHNhdmUgc29tZQorIyB0cmVlcyBpbiBnZW5lcmFsLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitDT01QQUNUX0xBVEVYICAgICAgICAgID0gTk8KKworIyBUaGUgUEFQRVJfVFlQRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBwYXBlciB0eXBlIHRoYXQgaXMgdXNlZCBieSB0aGUKKyMgcHJpbnRlci4KKyMgUG9zc2libGUgdmFsdWVzIGFyZTogYTQgKDIxMCB4IDI5NyBtbSksIGxldHRlciAoOC41IHggMTEgaW5jaGVzKSwgbGVnYWwgKDguNSB4CisjIDE0IGluY2hlcykgYW5kIGV4ZWN1dGl2ZSAoNy4yNSB4IDEwLjUgaW5jaGVzKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IGE0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworUEFQRVJfVFlQRSAgICAgICAgICAgICA9IGE0CisKKyMgVGhlIEVYVFJBX1BBQ0tBR0VTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIExhVGVYIHBhY2thZ2UgbmFtZXMKKyMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIExhVGVYIG91dHB1dC4gVGhlIHBhY2thZ2UgY2FuIGJlIHNwZWNpZmllZCBqdXN0CisjIGJ5IGl0cyBuYW1lIG9yIHdpdGggdGhlIGNvcnJlY3Qgc3ludGF4IGFzIHRvIGJlIHVzZWQgd2l0aCB0aGUgTGFUZVgKKyMgXHVzZXBhY2thZ2UgY29tbWFuZC4gVG8gZ2V0IHRoZSB0aW1lcyBmb250IGZvciBpbnN0YW5jZSB5b3UgY2FuIHNwZWNpZnkgOgorIyBFWFRSQV9QQUNLQUdFUz10aW1lcyBvciBFWFRSQV9QQUNLQUdFUz17dGltZXN9CisjIFRvIHVzZSB0aGUgb3B0aW9uIGludGxpbWl0cyB3aXRoIHRoZSBhbXNtYXRoIHBhY2thZ2UgeW91IGNhbiBzcGVjaWZ5OgorIyBFWFRSQV9QQUNLQUdFUz1baW50bGltaXRzXXthbXNtYXRofQorIyBJZiBsZWZ0IGJsYW5rIG5vIGV4dHJhIHBhY2thZ2VzIHdpbGwgYmUgaW5jbHVkZWQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitFWFRSQV9QQUNLQUdFUyAgICAgICAgID0gCisKKyMgVGhlIExBVEVYX0hFQURFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIExhVGVYIGhlYWRlciBmb3IgdGhlCisjIGdlbmVyYXRlZCBMYVRlWCBkb2N1bWVudC4gVGhlIGhlYWRlciBzaG91bGQgY29udGFpbiBldmVyeXRoaW5nIHVudGlsIHRoZSBmaXJzdAorIyBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIHN0YW5kYXJkIGhlYWRlci4gU2VlCisjIHNlY3Rpb24gIkRveHlnZW4gdXNhZ2UiIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gbGV0IGRveHlnZW4gd3JpdGUgdGhlCisjIGRlZmF1bHQgaGVhZGVyIHRvIGEgc2VwYXJhdGUgZmlsZS4KKyMKKyMgTm90ZTogT25seSB1c2UgYSB1c2VyLWRlZmluZWQgaGVhZGVyIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEgVGhlCisjIGZvbGxvd2luZyBjb21tYW5kcyBoYXZlIGEgc3BlY2lhbCBtZWFuaW5nIGluc2lkZSB0aGUgaGVhZGVyOiAkdGl0bGUsCisjICRkYXRldGltZSwgJGRhdGUsICRkb3h5Z2VudmVyc2lvbiwgJHByb2plY3RuYW1lLCAkcHJvamVjdG51bWJlciwKKyMgJHByb2plY3RicmllZiwgJHByb2plY3Rsb2dvLiBEb3h5Z2VuIHdpbGwgcmVwbGFjZSAkdGl0bGUgd2l0aCB0aGUgZW1wdHkKKyMgc3RyaW5nLCBmb3IgdGhlIHJlcGxhY2VtZW50IHZhbHVlcyBvZiB0aGUgb3RoZXIgY29tbWFuZHMgdGhlIHVzZXIgaXMgcmVmZXJyZWQKKyMgdG8gSFRNTF9IRUFERVIuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9IRUFERVIgICAgICAgICAgID0gCisKKyMgVGhlIExBVEVYX0ZPT1RFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIExhVGVYIGZvb3RlciBmb3IgdGhlCisjIGdlbmVyYXRlZCBMYVRlWCBkb2N1bWVudC4gVGhlIGZvb3RlciBzaG91bGQgY29udGFpbiBldmVyeXRoaW5nIGFmdGVyIHRoZSBsYXN0CisjIGNoYXB0ZXIuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgc3RhbmRhcmQgZm9vdGVyLiBTZWUKKyMgTEFURVhfSEVBREVSIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSBhIGRlZmF1bHQgZm9vdGVyIGFuZCB3aGF0CisjIHNwZWNpYWwgY29tbWFuZHMgY2FuIGJlIHVzZWQgaW5zaWRlIHRoZSBmb290ZXIuCisjCisjIE5vdGU6IE9ubHkgdXNlIGEgdXNlci1kZWZpbmVkIGZvb3RlciBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9GT09URVIgICAgICAgICAgID0gCisKKyMgVGhlIExBVEVYX0VYVFJBX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYWRkaXRpb25hbCB1c2VyLWRlZmluZWQKKyMgTGFUZVggc3R5bGUgc2hlZXRzIHRoYXQgYXJlIGluY2x1ZGVkIGFmdGVyIHRoZSBzdGFuZGFyZCBzdHlsZSBzaGVldHMgY3JlYXRlZAorIyBieSBkb3h5Z2VuLiBVc2luZyB0aGlzIG9wdGlvbiBvbmUgY2FuIG92ZXJydWxlIGNlcnRhaW4gc3R5bGUgYXNwZWN0cy4gRG94eWdlbgorIyB3aWxsIGNvcHkgdGhlIHN0eWxlIHNoZWV0IGZpbGVzIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgorIyBOb3RlOiBUaGUgb3JkZXIgb2YgdGhlIGV4dHJhIHN0eWxlIHNoZWV0IGZpbGVzIGlzIG9mIGltcG9ydGFuY2UgKGUuZy4gdGhlIGxhc3QKKyMgc3R5bGUgc2hlZXQgaW4gdGhlIGxpc3Qgb3ZlcnJ1bGVzIHRoZSBzZXR0aW5nIG9mIHRoZSBwcmV2aW91cyBvbmVzIGluIHRoZQorIyBsaXN0KS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0VYVFJBX1NUWUxFU0hFRVQgPSAKKworIyBUaGUgTEFURVhfRVhUUkFfRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZXh0cmEgaW1hZ2VzIG9yCisjIG90aGVyIHNvdXJjZSBmaWxlcyB3aGljaCBzaG91bGQgYmUgY29waWVkIHRvIHRoZSBMQVRFWF9PVVRQVVQgb3V0cHV0CisjIGRpcmVjdG9yeS4gTm90ZSB0aGF0IHRoZSBmaWxlcyB3aWxsIGJlIGNvcGllZCBhcy1pczsgdGhlcmUgYXJlIG5vIGNvbW1hbmRzIG9yCisjIG1hcmtlcnMgYXZhaWxhYmxlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfRVhUUkFfRklMRVMgICAgICA9IAorCisjIElmIHRoZSBQREZfSFlQRVJMSU5LUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIExhVGVYIHRoYXQgaXMgZ2VuZXJhdGVkIGlzCisjIHByZXBhcmVkIGZvciBjb252ZXJzaW9uIHRvIFBERiAodXNpbmcgcHMycGRmIG9yIHBkZmxhdGV4KS4gVGhlIFBERiBmaWxlIHdpbGwKKyMgY29udGFpbiBsaW5rcyAoanVzdCBsaWtlIHRoZSBIVE1MIG91dHB1dCkgaW5zdGVhZCBvZiBwYWdlIHJlZmVyZW5jZXMuIFRoaXMKKyMgbWFrZXMgdGhlIG91dHB1dCBzdWl0YWJsZSBmb3Igb25saW5lIGJyb3dzaW5nIHVzaW5nIGEgUERGIHZpZXdlci4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK1BERl9IWVBFUkxJTktTICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgVVNFX1BERkxBVEVYIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgdXNlIHBkZmxhdGV4IHRvIGdlbmVyYXRlCisjIHRoZSBQREYgZmlsZSBkaXJlY3RseSBmcm9tIHRoZSBMYVRlWCBmaWxlcy4gU2V0IHRoaXMgb3B0aW9uIHRvIFlFUywgdG8gZ2V0IGEKKyMgaGlnaGVyIHF1YWxpdHkgUERGIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitVU0VfUERGTEFURVggICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIExBVEVYX0JBVENITU9ERSB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGFkZCB0aGUgXGJhdGNobW9kZQorIyBjb21tYW5kIHRvIHRoZSBnZW5lcmF0ZWQgTGFUZVggZmlsZXMuIFRoaXMgd2lsbCBpbnN0cnVjdCBMYVRlWCB0byBrZWVwIHJ1bm5pbmcKKyMgaWYgZXJyb3JzIG9jY3VyLCBpbnN0ZWFkIG9mIGFza2luZyB0aGUgdXNlciBmb3IgaGVscC4gVGhpcyBvcHRpb24gaXMgYWxzbyB1c2VkCisjIHdoZW4gZ2VuZXJhdGluZyBmb3JtdWxhcyBpbiBIVE1MLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9CQVRDSE1PREUgICAgICAgID0gTk8KKworIyBJZiB0aGUgTEFURVhfSElERV9JTkRJQ0VTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIG5vdCBpbmNsdWRlIHRoZQorIyBpbmRleCBjaGFwdGVycyAoc3VjaCBhcyBGaWxlIEluZGV4LCBDb21wb3VuZCBJbmRleCwgZXRjLikgaW4gdGhlIG91dHB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfSElERV9JTkRJQ0VTICAgICA9IE5PCisKKyMgSWYgdGhlIExBVEVYX1NPVVJDRV9DT0RFIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGluY2x1ZGUgc291cmNlCisjIGNvZGUgd2l0aCBzeW50YXggaGlnaGxpZ2h0aW5nIGluIHRoZSBMYVRlWCBvdXRwdXQuCisjCisjIE5vdGUgdGhhdCB3aGljaCBzb3VyY2VzIGFyZSBzaG93biBhbHNvIGRlcGVuZHMgb24gb3RoZXIgc2V0dGluZ3Mgc3VjaCBhcworIyBTT1VSQ0VfQlJPV1NFUi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfU09VUkNFX0NPREUgICAgICA9IE5PCisKKyMgVGhlIExBVEVYX0JJQl9TVFlMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgc3R5bGUgdG8gdXNlIGZvciB0aGUKKyMgYmlibGlvZ3JhcGh5LCBlLmcuIHBsYWlubmF0LCBvciBpZWVldHIuIFNlZQorIyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpYlRlWCBhbmQgXGNpdGUgZm9yIG1vcmUgaW5mby4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IHBsYWluLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfQklCX1NUWUxFICAgICAgICA9IHBsYWluCisKKyMgSWYgdGhlIExBVEVYX1RJTUVTVEFNUCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSBmb290ZXIgb2YgZWFjaCBnZW5lcmF0ZWQKKyMgcGFnZSB3aWxsIGNvbnRhaW4gdGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgcGFnZSB3YXMgZ2VuZXJhdGVkLiBTZXR0aW5nIHRoaXMKKyMgdG8gTk8gY2FuIGhlbHAgd2hlbiBjb21wYXJpbmcgdGhlIG91dHB1dCBvZiBtdWx0aXBsZSBydW5zLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9USU1FU1RBTVAgICAgICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUlRGIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9SVEYgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBSVEYgb3V0cHV0LiBUaGUKKyMgUlRGIG91dHB1dCBpcyBvcHRpbWl6ZWQgZm9yIFdvcmQgOTcgYW5kIG1heSBub3QgbG9vayB0b28gcHJldHR5IHdpdGggb3RoZXIgUlRGCisjIHJlYWRlcnMvZWRpdG9ycy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHRU5FUkFURV9SVEYgICAgICAgICAgID0gTk8KKworIyBUaGUgUlRGX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBSVEYgZG9jcyB3aWxsIGJlIHB1dC4gSWYgYQorIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKKyMgaXQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogcnRmLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK1JURl9PVVRQVVQgICAgICAgICAgICAgPSBydGYKKworIyBJZiB0aGUgQ09NUEFDVF9SVEYgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gZ2VuZXJhdGVzIG1vcmUgY29tcGFjdCBSVEYKKyMgZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0byBzYXZlIHNvbWUKKyMgdHJlZXMgaW4gZ2VuZXJhbC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK0NPTVBBQ1RfUlRGICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBSVEZfSFlQRVJMSU5LUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIFJURiB0aGF0IGlzIGdlbmVyYXRlZCB3aWxsCisjIGNvbnRhaW4gaHlwZXJsaW5rIGZpZWxkcy4gVGhlIFJURiBmaWxlIHdpbGwgY29udGFpbiBsaW5rcyAoanVzdCBsaWtlIHRoZSBIVE1MCisjIG91dHB1dCkgaW5zdGVhZCBvZiBwYWdlIHJlZmVyZW5jZXMuIFRoaXMgbWFrZXMgdGhlIG91dHB1dCBzdWl0YWJsZSBmb3Igb25saW5lCisjIGJyb3dzaW5nIHVzaW5nIFdvcmQgb3Igc29tZSBvdGhlciBXb3JkIGNvbXBhdGlibGUgcmVhZGVycyB0aGF0IHN1cHBvcnQgdGhvc2UKKyMgZmllbGRzLgorIworIyBOb3RlOiBXb3JkUGFkICh3cml0ZSkgYW5kIG90aGVycyBkbyBub3Qgc3VwcG9ydCBsaW5rcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK1JURl9IWVBFUkxJTktTICAgICAgICAgPSBOTworCisjIExvYWQgc3R5bGVzaGVldCBkZWZpbml0aW9ucyBmcm9tIGZpbGUuIFN5bnRheCBpcyBzaW1pbGFyIHRvIGRveHlnZW4ncyBjb25maWcKKyMgZmlsZSwgaS5lLiBhIHNlcmllcyBvZiBhc3NpZ25tZW50cy4gWW91IG9ubHkgaGF2ZSB0byBwcm92aWRlIHJlcGxhY2VtZW50cywKKyMgbWlzc2luZyBkZWZpbml0aW9ucyBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHQgdmFsdWUuCisjCisjIFNlZSBhbHNvIHNlY3Rpb24gIkRveHlnZW4gdXNhZ2UiIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgdGhlCisjIGRlZmF1bHQgc3R5bGUgc2hlZXQgdGhhdCBkb3h5Z2VuIG5vcm1hbGx5IHVzZXMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9SVEYgaXMgc2V0IHRvIFlFUy4KKworUlRGX1NUWUxFU0hFRVRfRklMRSAgICA9IAorCisjIFNldCBvcHRpb25hbCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiBhbiBSVEYgZG9jdW1lbnQuIFN5bnRheCBpcworIyBzaW1pbGFyIHRvIGRveHlnZW4ncyBjb25maWcgZmlsZS4gQSB0ZW1wbGF0ZSBleHRlbnNpb25zIGZpbGUgY2FuIGJlIGdlbmVyYXRlZAorIyB1c2luZyBkb3h5Z2VuIC1lIHJ0ZiBleHRlbnNpb25GaWxlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK1JURl9FWFRFTlNJT05TX0ZJTEUgICAgPSAKKworIyBJZiB0aGUgUlRGX1NPVVJDRV9DT0RFIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGluY2x1ZGUgc291cmNlIGNvZGUKKyMgd2l0aCBzeW50YXggaGlnaGxpZ2h0aW5nIGluIHRoZSBSVEYgb3V0cHV0LgorIworIyBOb3RlIHRoYXQgd2hpY2ggc291cmNlcyBhcmUgc2hvd24gYWxzbyBkZXBlbmRzIG9uIG90aGVyIHNldHRpbmdzIHN1Y2ggYXMKKyMgU09VUkNFX0JST1dTRVIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitSVEZfU09VUkNFX0NPREUgICAgICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgbWFuIHBhZ2Ugb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX01BTiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIG1hbiBwYWdlcyBmb3IKKyMgY2xhc3NlcyBhbmQgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfTUFOICAgICAgICAgICA9IE5PCisKKyMgVGhlIE1BTl9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgbWFuIHBhZ2VzIHdpbGwgYmUgcHV0LiBJZiBhCisjIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbiBmcm9udCBvZgorIyBpdC4gQSBkaXJlY3RvcnkgbWFuMyB3aWxsIGJlIGNyZWF0ZWQgaW5zaWRlIHRoZSBkaXJlY3Rvcnkgc3BlY2lmaWVkIGJ5CisjIE1BTl9PVVRQVVQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogbWFuLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTUFOIGlzIHNldCB0byBZRVMuCisKK01BTl9PVVRQVVQgICAgICAgICAgICAgPSBtYW4KKworIyBUaGUgTUFOX0VYVEVOU0lPTiB0YWcgZGV0ZXJtaW5lcyB0aGUgZXh0ZW5zaW9uIHRoYXQgaXMgYWRkZWQgdG8gdGhlIGdlbmVyYXRlZAorIyBtYW4gcGFnZXMuIEluIGNhc2UgdGhlIG1hbnVhbCBzZWN0aW9uIGRvZXMgbm90IHN0YXJ0IHdpdGggYSBudW1iZXIsIHRoZSBudW1iZXIKKyMgMyBpcyBwcmVwZW5kZWQuIFRoZSBkb3QgKC4pIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIE1BTl9FWFRFTlNJT04gdGFnIGlzCisjIG9wdGlvbmFsLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogLjMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9NQU4gaXMgc2V0IHRvIFlFUy4KKworTUFOX0VYVEVOU0lPTiAgICAgICAgICA9IC4zCisKKyMgVGhlIE1BTl9TVUJESVIgdGFnIGRldGVybWluZXMgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBjcmVhdGVkIHdpdGhpbgorIyBNQU5fT1VUUFVUIGluIHdoaWNoIHRoZSBtYW4gcGFnZXMgYXJlIHBsYWNlZC4gSWYgZGVmYXVsdHMgdG8gbWFuIGZvbGxvd2VkIGJ5CisjIE1BTl9FWFRFTlNJT04gd2l0aCB0aGUgaW5pdGlhbCAuIHJlbW92ZWQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9NQU4gaXMgc2V0IHRvIFlFUy4KKworTUFOX1NVQkRJUiAgICAgICAgICAgICA9IAorCisjIElmIHRoZSBNQU5fTElOS1MgdGFnIGlzIHNldCB0byBZRVMgYW5kIGRveHlnZW4gZ2VuZXJhdGVzIG1hbiBvdXRwdXQsIHRoZW4gaXQKKyMgd2lsbCBnZW5lcmF0ZSBvbmUgYWRkaXRpb25hbCBtYW4gZmlsZSBmb3IgZWFjaCBlbnRpdHkgZG9jdW1lbnRlZCBpbiB0aGUgcmVhbAorIyBtYW4gcGFnZShzKS4gVGhlc2UgYWRkaXRpb25hbCBmaWxlcyBvbmx5IHNvdXJjZSB0aGUgcmVhbCBtYW4gcGFnZSwgYnV0IHdpdGhvdXQKKyMgdGhlbSB0aGUgbWFuIGNvbW1hbmQgd291bGQgYmUgdW5hYmxlIHRvIGZpbmQgdGhlIGNvcnJlY3QgcGFnZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTUFOIGlzIHNldCB0byBZRVMuCisKK01BTl9MSU5LUyAgICAgICAgICAgICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBYTUwgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX1hNTCB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGFuIFhNTCBmaWxlIHRoYXQKKyMgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfWE1MICAgICAgICAgICA9IE5PCisKKyMgVGhlIFhNTF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgWE1MIHBhZ2VzIHdpbGwgYmUgcHV0LiBJZiBhCisjIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbiBmcm9udCBvZgorIyBpdC4KKyMgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOiB4bWwuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9YTUwgaXMgc2V0IHRvIFlFUy4KKworWE1MX09VVFBVVCAgICAgICAgICAgICA9IHhtbAorCisjIElmIHRoZSBYTUxfUFJPR1JBTUxJU1RJTkcgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBkdW1wIHRoZSBwcm9ncmFtCisjIGxpc3RpbmdzIChpbmNsdWRpbmcgc3ludGF4IGhpZ2hsaWdodGluZyBhbmQgY3Jvc3MtcmVmZXJlbmNpbmcgaW5mb3JtYXRpb24pIHRvCisjIHRoZSBYTUwgb3V0cHV0LiBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHNpemUKKyMgb2YgdGhlIFhNTCBvdXRwdXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9YTUwgaXMgc2V0IHRvIFlFUy4KKworWE1MX1BST0dSQU1MSVNUSU5HICAgICA9IFlFUworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBET0NCT09LIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9ET0NCT09LIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgRG9jYm9vayBmaWxlcworIyB0aGF0IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIFBERi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHRU5FUkFURV9ET0NCT09LICAgICAgID0gTk8KKworIyBUaGUgRE9DQk9PS19PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgRG9jYm9vayBwYWdlcyB3aWxsIGJlIHB1dC4KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4KKyMgZnJvbnQgb2YgaXQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogZG9jYm9vay4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ0JPT0sgaXMgc2V0IHRvIFlFUy4KKworRE9DQk9PS19PVVRQVVQgICAgICAgICA9IGRvY2Jvb2sKKworIyBJZiB0aGUgRE9DQk9PS19QUk9HUkFNTElTVElORyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGluY2x1ZGUgdGhlCisjIHByb2dyYW0gbGlzdGluZ3MgKGluY2x1ZGluZyBzeW50YXggaGlnaGxpZ2h0aW5nIGFuZCBjcm9zcy1yZWZlcmVuY2luZworIyBpbmZvcm1hdGlvbikgdG8gdGhlIERPQ0JPT0sgb3V0cHV0LiBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyB3aWxsIHNpZ25pZmljYW50bHkKKyMgaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIERPQ0JPT0sgb3V0cHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NCT09LIGlzIHNldCB0byBZRVMuCisKK0RPQ0JPT0tfUFJPR1JBTUxJU1RJTkcgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIEF1dG9HZW4gRGVmaW5pdGlvbnMgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0FVVE9HRU5fREVGIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYW4KKyMgQXV0b0dlbiBEZWZpbml0aW9ucyAoc2VlIGh0dHA6Ly9hdXRvZ2VuLnNmLm5ldCkgZmlsZSB0aGF0IGNhcHR1cmVzIHRoZQorIyBzdHJ1Y3R1cmUgb2YgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCBkb2N1bWVudGF0aW9uLiBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGlzCisjIHN0aWxsIGV4cGVyaW1lbnRhbCBhbmQgaW5jb21wbGV0ZSBhdCB0aGUgbW9tZW50LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX0FVVE9HRU5fREVGICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfUEVSTE1PRCB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgUGVybCBtb2R1bGUKKyMgZmlsZSB0aGF0IGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCBkb2N1bWVudGF0aW9uLgorIworIyBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGlzIHN0aWxsIGV4cGVyaW1lbnRhbCBhbmQgaW5jb21wbGV0ZSBhdCB0aGUgbW9tZW50LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX1BFUkxNT0QgICAgICAgPSBOTworCisjIElmIHRoZSBQRVJMTU9EX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgdGhlIG5lY2Vzc2FyeQorIyBNYWtlZmlsZSBydWxlcywgUGVybCBzY3JpcHRzIGFuZCBMYVRlWCBjb2RlIHRvIGJlIGFibGUgdG8gZ2VuZXJhdGUgUERGIGFuZCBEVkkKKyMgb3V0cHV0IGZyb20gdGhlIFBlcmwgbW9kdWxlIG91dHB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUEVSTE1PRCBpcyBzZXQgdG8gWUVTLgorCitQRVJMTU9EX0xBVEVYICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUEVSTE1PRF9QUkVUVFkgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQgd2lsbCBiZSBuaWNlbHkKKyMgZm9ybWF0dGVkIHNvIGl0IGNhbiBiZSBwYXJzZWQgYnkgYSBodW1hbiByZWFkZXIuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvCisjIHVuZGVyc3RhbmQgd2hhdCBpcyBnb2luZyBvbi4gT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoaXMgdGFnIGlzIHNldCB0byBOTywgdGhlCisjIHNpemUgb2YgdGhlIFBlcmwgbW9kdWxlIG91dHB1dCB3aWxsIGJlIG11Y2ggc21hbGxlciBhbmQgUGVybCB3aWxsIHBhcnNlIGl0CisjIGp1c3QgdGhlIHNhbWUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9QRVJMTU9EIGlzIHNldCB0byBZRVMuCisKK1BFUkxNT0RfUFJFVFRZICAgICAgICAgPSBZRVMKKworIyBUaGUgbmFtZXMgb2YgdGhlIG1ha2UgdmFyaWFibGVzIGluIHRoZSBnZW5lcmF0ZWQgZG94eXJ1bGVzLm1ha2UgZmlsZSBhcmUKKyMgcHJlZml4ZWQgd2l0aCB0aGUgc3RyaW5nIGNvbnRhaW5lZCBpbiBQRVJMTU9EX01BS0VWQVJfUFJFRklYLiBUaGlzIGlzIHVzZWZ1bAorIyBzbyBkaWZmZXJlbnQgZG94eXJ1bGVzLm1ha2UgZmlsZXMgaW5jbHVkZWQgYnkgdGhlIHNhbWUgTWFrZWZpbGUgZG9uJ3QKKyMgb3ZlcndyaXRlIGVhY2ggb3RoZXIncyB2YXJpYWJsZXMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9QRVJMTU9EIGlzIHNldCB0byBZRVMuCisKK1BFUkxNT0RfTUFLRVZBUl9QUkVGSVggPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgcHJlcHJvY2Vzc29yCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZXZhbHVhdGUgYWxsCisjIEMtcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgZm91bmQgaW4gdGhlIHNvdXJjZXMgYW5kIGluY2x1ZGUgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0VOQUJMRV9QUkVQUk9DRVNTSU5HICAgPSBZRVMKKworIyBJZiB0aGUgTUFDUk9fRVhQQU5TSU9OIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZXhwYW5kIGFsbCBtYWNybyBuYW1lcworIyBpbiB0aGUgc291cmNlIGNvZGUuIElmIHNldCB0byBOTywgb25seSBjb25kaXRpb25hbCBjb21waWxhdGlvbiB3aWxsIGJlCisjIHBlcmZvcm1lZC4gTWFjcm8gZXhwYW5zaW9uIGNhbiBiZSBkb25lIGluIGEgY29udHJvbGxlZCB3YXkgYnkgc2V0dGluZworIyBFWFBBTkRfT05MWV9QUkVERUYgdG8gWUVTLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitNQUNST19FWFBBTlNJT04gICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYUEFORF9PTkxZX1BSRURFRiBhbmQgTUFDUk9fRVhQQU5TSU9OIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUyB0aGVuCisjIHRoZSBtYWNybyBleHBhbnNpb24gaXMgbGltaXRlZCB0byB0aGUgbWFjcm9zIHNwZWNpZmllZCB3aXRoIHRoZSBQUkVERUZJTkVEIGFuZAorIyBFWFBBTkRfQVNfREVGSU5FRCB0YWdzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitFWFBBTkRfT05MWV9QUkVERUYgICAgID0gWUVTCisKKyMgSWYgdGhlIFNFQVJDSF9JTkNMVURFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGluY2x1ZGUgZmlsZXMgaW4gdGhlCisjIElOQ0xVREVfUEFUSCB3aWxsIGJlIHNlYXJjaGVkIGlmIGEgI2luY2x1ZGUgaXMgZm91bmQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitTRUFSQ0hfSU5DTFVERVMgICAgICAgID0gWUVTCisKKyMgVGhlIElOQ0xVREVfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0CisjIGNvbnRhaW4gaW5jbHVkZSBmaWxlcyB0aGF0IGFyZSBub3QgaW5wdXQgZmlsZXMgYnV0IHNob3VsZCBiZSBwcm9jZXNzZWQgYnkgdGhlCisjIHByZXByb2Nlc3Nvci4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSF9JTkNMVURFUyBpcyBzZXQgdG8gWUVTLgorCitJTkNMVURFX1BBVEggICAgICAgICAgID0gL1ZvbHVtZXMvQS9hb3NwL3ByZWJ1aWx0cy9jbGFuZy9kYXJ3aW4teDg2L2hvc3QvMy42L2xpYi9jbGFuZy8zLjYvaW5jbHVkZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgL1ZvbHVtZXMvQS9hb3NwL2V4dGVybmFsL2xpYmN4eC9pbmNsdWRlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAvVm9sdW1lcy9BL2Fvc3AvYmlvbmljL2xpYmMvaW5jbHVkZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgL1ZvbHVtZXMvQS9hb3NwL2Jpb25pYy9saWJjL2tlcm5lbC91YXBpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAvVm9sdW1lcy9BL2Fvc3AvYmlvbmljL2xpYmMva2VybmVsL3VhcGkvYXNtLWFybTY0IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAvVm9sdW1lcy9BL2Fvc3AvZXh0ZXJuYWwvZ3Rlc3QKKworIyBZb3UgY2FuIHVzZSB0aGUgSU5DTFVERV9GSUxFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkCisjIHBhdHRlcm5zIChsaWtlICouaCBhbmQgKi5ocHApIHRvIGZpbHRlciBvdXQgdGhlIGhlYWRlci1maWxlcyBpbiB0aGUKKyMgZGlyZWN0b3JpZXMuIElmIGxlZnQgYmxhbmssIHRoZSBwYXR0ZXJucyBzcGVjaWZpZWQgd2l0aCBGSUxFX1BBVFRFUk5TIHdpbGwgYmUKKyMgdXNlZC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCisKK0lOQ0xVREVfRklMRV9QQVRURVJOUyAgPSAKKworIyBUaGUgUFJFREVGSU5FRCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBtYWNybyBuYW1lcyB0aGF0IGFyZQorIyBkZWZpbmVkIGJlZm9yZSB0aGUgcHJlcHJvY2Vzc29yIGlzIHN0YXJ0ZWQgKHNpbWlsYXIgdG8gdGhlIC1EIG9wdGlvbiBvZiBlLmcuCisjIGdjYykuIFRoZSBhcmd1bWVudCBvZiB0aGUgdGFnIGlzIGEgbGlzdCBvZiBtYWNyb3Mgb2YgdGhlIGZvcm06IG5hbWUgb3IKKyMgbmFtZT1kZWZpbml0aW9uIChubyBzcGFjZXMpLiBJZiB0aGUgZGVmaW5pdGlvbiBhbmQgdGhlICI9IiBhcmUgb21pdHRlZCwgIj0xIgorIyBpcyBhc3N1bWVkLiBUbyBwcmV2ZW50IGEgbWFjcm8gZGVmaW5pdGlvbiBmcm9tIGJlaW5nIHVuZGVmaW5lZCB2aWEgI3VuZGVmIG9yCisjIHJlY3Vyc2l2ZWx5IGV4cGFuZGVkIHVzZSB0aGUgOj0gb3BlcmF0b3IgaW5zdGVhZCBvZiB0aGUgPSBvcGVyYXRvci4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCisKK1BSRURFRklORUQgICAgICAgICAgICAgPSBfX0FQUExFX189IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX0FORFJPSURfXz0xIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEOj0xIFwKKwkJCSBfX3VudXNlZD0KKworIyBJZiB0aGUgTUFDUk9fRVhQQU5TSU9OIGFuZCBFWFBBTkRfT05MWV9QUkVERUYgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIHRoaXMKKyMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsaXN0IG9mIG1hY3JvIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGV4cGFuZGVkLiBUaGUKKyMgbWFjcm8gZGVmaW5pdGlvbiB0aGF0IGlzIGZvdW5kIGluIHRoZSBzb3VyY2VzIHdpbGwgYmUgdXNlZC4gVXNlIHRoZSBQUkVERUZJTkVECisjIHRhZyBpZiB5b3Ugd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgbWFjcm8gZGVmaW5pdGlvbiB0aGF0IG92ZXJydWxlcyB0aGUKKyMgZGVmaW5pdGlvbiBmb3VuZCBpbiB0aGUgc291cmNlIGNvZGUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitFWFBBTkRfQVNfREVGSU5FRCAgICAgID0gREVGSU5FX0ZMRVhJQkxFX01FVEhPRFMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUworCisjIElmIHRoZSBTS0lQX0ZVTkNUSU9OX01BQ1JPUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4ncyBwcmVwcm9jZXNzb3Igd2lsbAorIyByZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gZnVuY3Rpb24tbGlrZSBtYWNyb3MgdGhhdCBhcmUgYWxvbmUgb24gYSBsaW5lLCBoYXZlCisjIGFuIGFsbCB1cHBlcmNhc2UgbmFtZSwgYW5kIGRvIG5vdCBlbmQgd2l0aCBhIHNlbWljb2xvbi4gU3VjaCBmdW5jdGlvbiBtYWNyb3MKKyMgYXJlIHR5cGljYWxseSB1c2VkIGZvciBib2lsZXItcGxhdGUgY29kZSwgYW5kIHdpbGwgY29uZnVzZSB0aGUgcGFyc2VyIGlmIG5vdAorIyByZW1vdmVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworU0tJUF9GVU5DVElPTl9NQUNST1MgICA9IFlFUworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIGV4dGVybmFsIHJlZmVyZW5jZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgVEFHRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgdGFnIGZpbGVzLiBGb3IgZWFjaCB0YWcKKyMgZmlsZSB0aGUgbG9jYXRpb24gb2YgdGhlIGV4dGVybmFsIGRvY3VtZW50YXRpb24gc2hvdWxkIGJlIGFkZGVkLiBUaGUgZm9ybWF0IG9mCisjIGEgdGFnIGZpbGUgd2l0aG91dCB0aGlzIGxvY2F0aW9uIGlzIGFzIGZvbGxvd3M6CisjIFRBR0ZJTEVTID0gZmlsZTEgZmlsZTIgLi4uCisjIEFkZGluZyBsb2NhdGlvbiBmb3IgdGhlIHRhZyBmaWxlcyBpcyBkb25lIGFzIGZvbGxvd3M6CisjIFRBR0ZJTEVTID0gZmlsZTE9bG9jMSAiZmlsZTIgPSBsb2MyIiAuLi4KKyMgd2hlcmUgbG9jMSBhbmQgbG9jMiBjYW4gYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aHMgb3IgVVJMcy4gU2VlIHRoZQorIyBzZWN0aW9uICJMaW5raW5nIHRvIGV4dGVybmFsIGRvY3VtZW50YXRpb24iIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2UKKyMgb2YgdGFnIGZpbGVzLgorIyBOb3RlOiBFYWNoIHRhZyBmaWxlIG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lICh3aGVyZSB0aGUgbmFtZSBkb2VzIE5PVCBpbmNsdWRlCisjIHRoZSBwYXRoKS4gSWYgYSB0YWcgZmlsZSBpcyBub3QgbG9jYXRlZCBpbiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIGRveHlnZW4gaXMKKyMgcnVuLCB5b3UgbXVzdCBhbHNvIHNwZWNpZnkgdGhlIHBhdGggdG8gdGhlIHRhZ2ZpbGUgaGVyZS4KKworVEFHRklMRVMgICAgICAgICAgICAgICA9IAorCisjIFdoZW4gYSBmaWxlIG5hbWUgaXMgc3BlY2lmaWVkIGFmdGVyIEdFTkVSQVRFX1RBR0ZJTEUsIGRveHlnZW4gd2lsbCBjcmVhdGUgYQorIyB0YWcgZmlsZSB0aGF0IGlzIGJhc2VkIG9uIHRoZSBpbnB1dCBmaWxlcyBpdCByZWFkcy4gU2VlIHNlY3Rpb24gIkxpbmtpbmcgdG8KKyMgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbiIgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzYWdlIG9mIHRhZyBmaWxlcy4KKworR0VORVJBVEVfVEFHRklMRSAgICAgICA9IAorCisjIElmIHRoZSBBTExFWFRFUk5BTFMgdGFnIGlzIHNldCB0byBZRVMsIGFsbCBleHRlcm5hbCBjbGFzcyB3aWxsIGJlIGxpc3RlZCBpbgorIyB0aGUgY2xhc3MgaW5kZXguIElmIHNldCB0byBOTywgb25seSB0aGUgaW5oZXJpdGVkIGV4dGVybmFsIGNsYXNzZXMgd2lsbCBiZQorIyBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQUxMRVhURVJOQUxTICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVEVSTkFMX0dST1VQUyB0YWcgaXMgc2V0IHRvIFlFUywgYWxsIGV4dGVybmFsIGdyb3VwcyB3aWxsIGJlIGxpc3RlZAorIyBpbiB0aGUgbW9kdWxlcyBpbmRleC4gSWYgc2V0IHRvIE5PLCBvbmx5IHRoZSBjdXJyZW50IHByb2plY3QncyBncm91cHMgd2lsbCBiZQorIyBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0VYVEVSTkFMX0dST1VQUyAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRVhURVJOQUxfUEFHRVMgdGFnIGlzIHNldCB0byBZRVMsIGFsbCBleHRlcm5hbCBwYWdlcyB3aWxsIGJlIGxpc3RlZCBpbgorIyB0aGUgcmVsYXRlZCBwYWdlcyBpbmRleC4gSWYgc2V0IHRvIE5PLCBvbmx5IHRoZSBjdXJyZW50IHByb2plY3QncyBwYWdlcyB3aWxsCisjIGJlIGxpc3RlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworRVhURVJOQUxfUEFHRVMgICAgICAgICA9IFlFUworCisjIFRoZSBQRVJMX1BBVEggc2hvdWxkIGJlIHRoZSBhYnNvbHV0ZSBwYXRoIGFuZCBuYW1lIG9mIHRoZSBwZXJsIHNjcmlwdAorIyBpbnRlcnByZXRlciAoaS5lLiB0aGUgcmVzdWx0IG9mICd3aGljaCBwZXJsJykuCisjIFRoZSBkZWZhdWx0IGZpbGUgKHdpdGggYWJzb2x1dGUgcGF0aCkgaXM6IC91c3IvYmluL3BlcmwuCisKK1BFUkxfUEFUSCAgICAgICAgICAgICAgPSAvdXNyL2Jpbi9wZXJsCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGRvdCB0b29sCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIENMQVNTX0RJQUdSQU1TIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjbGFzcyBkaWFncmFtCisjIChpbiBIVE1MIGFuZCBMYVRlWCkgZm9yIGNsYXNzZXMgd2l0aCBiYXNlIG9yIHN1cGVyIGNsYXNzZXMuIFNldHRpbmcgdGhlIHRhZyB0bworIyBOTyB0dXJucyB0aGUgZGlhZ3JhbXMgb2ZmLiBOb3RlIHRoYXQgdGhpcyBvcHRpb24gYWxzbyB3b3JrcyB3aXRoIEhBVkVfRE9UCisjIGRpc2FibGVkLCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gaW5zdGFsbCBhbmQgdXNlIGRvdCwgc2luY2UgaXQgeWllbGRzIG1vcmUKKyMgcG93ZXJmdWwgZ3JhcGhzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitDTEFTU19ESUFHUkFNUyAgICAgICAgID0gWUVTCisKKyMgWW91IGNhbiBkZWZpbmUgbWVzc2FnZSBzZXF1ZW5jZSBjaGFydHMgd2l0aGluIGRveHlnZW4gY29tbWVudHMgdXNpbmcgdGhlIFxtc2MKKyMgY29tbWFuZC4gRG94eWdlbiB3aWxsIHRoZW4gcnVuIHRoZSBtc2NnZW4gdG9vbCAoc2VlOgorIyBodHRwOi8vd3d3Lm1jdGVybmFuLm1lLnVrL21zY2dlbi8pKSB0byBwcm9kdWNlIHRoZSBjaGFydCBhbmQgaW5zZXJ0IGl0IGluIHRoZQorIyBkb2N1bWVudGF0aW9uLiBUaGUgTVNDR0VOX1BBVEggdGFnIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgZGlyZWN0b3J5IHdoZXJlCisjIHRoZSBtc2NnZW4gdG9vbCByZXNpZGVzLiBJZiBsZWZ0IGVtcHR5IHRoZSB0b29sIGlzIGFzc3VtZWQgdG8gYmUgZm91bmQgaW4gdGhlCisjIGRlZmF1bHQgc2VhcmNoIHBhdGguCisKK01TQ0dFTl9QQVRIICAgICAgICAgICAgPSAKKworIyBZb3UgY2FuIGluY2x1ZGUgZGlhZ3JhbXMgbWFkZSB3aXRoIGRpYSBpbiBkb3h5Z2VuIGRvY3VtZW50YXRpb24uIERveHlnZW4gd2lsbAorIyB0aGVuIHJ1biBkaWEgdG8gcHJvZHVjZSB0aGUgZGlhZ3JhbSBhbmQgaW5zZXJ0IGl0IGluIHRoZSBkb2N1bWVudGF0aW9uLiBUaGUKKyMgRElBX1BBVEggdGFnIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBkaWEgYmluYXJ5IHJlc2lkZXMuCisjIElmIGxlZnQgZW1wdHkgZGlhIGlzIGFzc3VtZWQgdG8gYmUgZm91bmQgaW4gdGhlIGRlZmF1bHQgc2VhcmNoIHBhdGguCisKK0RJQV9QQVRIICAgICAgICAgICAgICAgPSAKKworIyBJZiBzZXQgdG8gWUVTIHRoZSBpbmhlcml0YW5jZSBhbmQgY29sbGFib3JhdGlvbiBncmFwaHMgd2lsbCBoaWRlIGluaGVyaXRhbmNlCisjIGFuZCB1c2FnZSByZWxhdGlvbnMgaWYgdGhlIHRhcmdldCBpcyB1bmRvY3VtZW50ZWQgb3IgaXMgbm90IGEgY2xhc3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0hJREVfVU5ET0NfUkVMQVRJT05TICAgPSBZRVMKKworIyBJZiB5b3Ugc2V0IHRoZSBIQVZFX0RPVCB0YWcgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGFzc3VtZSB0aGUgZG90IHRvb2wgaXMKKyMgYXZhaWxhYmxlIGZyb20gdGhlIHBhdGguIFRoaXMgdG9vbCBpcyBwYXJ0IG9mIEdyYXBodml6IChzZWU6CisjIGh0dHA6Ly93d3cuZ3JhcGh2aXoub3JnLyksIGEgZ3JhcGggdmlzdWFsaXphdGlvbiB0b29sa2l0IGZyb20gQVQmVCBhbmQgTHVjZW50CisjIEJlbGwgTGFicy4gVGhlIG90aGVyIG9wdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGhhdmUgbm8gZWZmZWN0IGlmIHRoaXMgb3B0aW9uIGlzCisjIHNldCB0byBOTworIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0hBVkVfRE9UICAgICAgICAgICAgICAgPSBOTworCisjIFRoZSBET1RfTlVNX1RIUkVBRFMgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZG90IGludm9jYXRpb25zIGRveHlnZW4gaXMgYWxsb3dlZAorIyB0byBydW4gaW4gcGFyYWxsZWwuIFdoZW4gc2V0IHRvIDAgZG94eWdlbiB3aWxsIGJhc2UgdGhpcyBvbiB0aGUgbnVtYmVyIG9mCisjIHByb2Nlc3NvcnMgYXZhaWxhYmxlIGluIHRoZSBzeXN0ZW0uIFlvdSBjYW4gc2V0IGl0IGV4cGxpY2l0bHkgdG8gYSB2YWx1ZQorIyBsYXJnZXIgdGhhbiAwIHRvIGdldCBjb250cm9sIG92ZXIgdGhlIGJhbGFuY2UgYmV0d2VlbiBDUFUgbG9hZCBhbmQgcHJvY2Vzc2luZworIyBzcGVlZC4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMzIsIGRlZmF1bHQgdmFsdWU6IDAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfTlVNX1RIUkVBRFMgICAgICAgID0gMAorCisjIFdoZW4geW91IHdhbnQgYSBkaWZmZXJlbnRseSBsb29raW5nIGZvbnQgaW4gdGhlIGRvdCBmaWxlcyB0aGF0IGRveHlnZW4KKyMgZ2VuZXJhdGVzIHlvdSBjYW4gc3BlY2lmeSB0aGUgZm9udCBuYW1lIHVzaW5nIERPVF9GT05UTkFNRS4gWW91IG5lZWQgdG8gbWFrZQorIyBzdXJlIGRvdCBpcyBhYmxlIHRvIGZpbmQgdGhlIGZvbnQsIHdoaWNoIGNhbiBiZSBkb25lIGJ5IHB1dHRpbmcgaXQgaW4gYQorIyBzdGFuZGFyZCBsb2NhdGlvbiBvciBieSBzZXR0aW5nIHRoZSBET1RGT05UUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBieQorIyBzZXR0aW5nIERPVF9GT05UUEFUSCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGZvbnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBIZWx2ZXRpY2EuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfRk9OVE5BTUUgICAgICAgICAgID0gSGVsdmV0aWNhCisKKyMgVGhlIERPVF9GT05UU0laRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBzaXplIChpbiBwb2ludHMpIG9mIHRoZSBmb250IG9mCisjIGRvdCBncmFwaHMuCisjIE1pbmltdW0gdmFsdWU6IDQsIG1heGltdW0gdmFsdWU6IDI0LCBkZWZhdWx0IHZhbHVlOiAxMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9GT05UU0laRSAgICAgICAgICAgPSAxMAorCisjIEJ5IGRlZmF1bHQgZG94eWdlbiB3aWxsIHRlbGwgZG90IHRvIHVzZSB0aGUgZGVmYXVsdCBmb250IGFzIHNwZWNpZmllZCB3aXRoCisjIERPVF9GT05UTkFNRS4gSWYgeW91IHNwZWNpZnkgYSBkaWZmZXJlbnQgZm9udCB1c2luZyBET1RfRk9OVE5BTUUgeW91IGNhbiBzZXQKKyMgdGhlIHBhdGggd2hlcmUgZG90IGNhbiBmaW5kIGl0IHVzaW5nIHRoaXMgdGFnLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0ZPTlRQQVRIICAgICAgICAgICA9IAorCisjIElmIHRoZSBDTEFTU19HUkFQSCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvcgorIyBlYWNoIGRvY3VtZW50ZWQgY2xhc3Mgc2hvd2luZyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmhlcml0YW5jZSByZWxhdGlvbnMuCisjIFNldHRpbmcgdGhpcyB0YWcgdG8gWUVTIHdpbGwgZm9yY2UgdGhlIENMQVNTX0RJQUdSQU1TIHRhZyB0byBOTy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0NMQVNTX0dSQVBIICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgQ09MTEFCT1JBVElPTl9HUkFQSCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIGdyYXBoIGZvciBlYWNoIGRvY3VtZW50ZWQgY2xhc3Mgc2hvd2luZyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbXBsZW1lbnRhdGlvbgorIyBkZXBlbmRlbmNpZXMgKGluaGVyaXRhbmNlLCBjb250YWlubWVudCwgYW5kIGNsYXNzIHJlZmVyZW5jZXMgdmFyaWFibGVzKSBvZiB0aGUKKyMgY2xhc3Mgd2l0aCBvdGhlciBkb2N1bWVudGVkIGNsYXNzZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitDT0xMQUJPUkFUSU9OX0dSQVBIICAgID0gWUVTCisKKyMgSWYgdGhlIEdST1VQX0dSQVBIUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvcgorIyBncm91cHMsIHNob3dpbmcgdGhlIGRpcmVjdCBncm91cHMgZGVwZW5kZW5jaWVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworR1JPVVBfR1JBUEhTICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBVTUxfTE9PSyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGluaGVyaXRhbmNlIGFuZAorIyBjb2xsYWJvcmF0aW9uIGRpYWdyYW1zIGluIGEgc3R5bGUgc2ltaWxhciB0byB0aGUgT01HJ3MgVW5pZmllZCBNb2RlbGluZworIyBMYW5ndWFnZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworVU1MX0xPT0sgICAgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFVNTF9MT09LIHRhZyBpcyBlbmFibGVkLCB0aGUgZmllbGRzIGFuZCBtZXRob2RzIGFyZSBzaG93biBpbnNpZGUgdGhlCisjIGNsYXNzIG5vZGUuIElmIHRoZXJlIGFyZSBtYW55IGZpZWxkcyBvciBtZXRob2RzIGFuZCBtYW55IG5vZGVzIHRoZSBncmFwaCBtYXkKKyMgYmVjb21lIHRvbyBiaWcgdG8gYmUgdXNlZnVsLiBUaGUgVU1MX0xJTUlUX05VTV9GSUVMRFMgdGhyZXNob2xkIGxpbWl0cyB0aGUKKyMgbnVtYmVyIG9mIGl0ZW1zIGZvciBlYWNoIHR5cGUgdG8gbWFrZSB0aGUgc2l6ZSBtb3JlIG1hbmFnZWFibGUuIFNldCB0aGlzIHRvIDAKKyMgZm9yIG5vIGxpbWl0LiBOb3RlIHRoYXQgdGhlIHRocmVzaG9sZCBtYXkgYmUgZXhjZWVkZWQgYnkgNTAlIGJlZm9yZSB0aGUgbGltaXQKKyMgaXMgZW5mb3JjZWQuIFNvIHdoZW4geW91IHNldCB0aGUgdGhyZXNob2xkIHRvIDEwLCB1cCB0byAxNSBmaWVsZHMgbWF5IGFwcGVhciwKKyMgYnV0IGlmIHRoZSBudW1iZXIgZXhjZWVkcyAxNSwgdGhlIHRvdGFsIGFtb3VudCBvZiBmaWVsZHMgc2hvd24gaXMgbGltaXRlZCB0bworIyAxMC4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTAwLCBkZWZhdWx0IHZhbHVlOiAxMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK1VNTF9MSU1JVF9OVU1fRklFTERTICAgPSAxMAorCisjIElmIHRoZSBURU1QTEFURV9SRUxBVElPTlMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgaW5oZXJpdGFuY2UgYW5kCisjIGNvbGxhYm9yYXRpb24gZ3JhcGhzIHdpbGwgc2hvdyB0aGUgcmVsYXRpb25zIGJldHdlZW4gdGVtcGxhdGVzIGFuZCB0aGVpcgorIyBpbnN0YW5jZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK1RFTVBMQVRFX1JFTEFUSU9OUyAgICAgPSBOTworCisjIElmIHRoZSBJTkNMVURFX0dSQVBILCBFTkFCTEVfUFJFUFJPQ0VTU0lORyBhbmQgU0VBUkNIX0lOQ0xVREVTIHRhZ3MgYXJlIHNldCB0bworIyBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGZpbGUgc2hvd2luZyB0aGUKKyMgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmNsdWRlIGRlcGVuZGVuY2llcyBvZiB0aGUgZmlsZSB3aXRoIG90aGVyIGRvY3VtZW50ZWQKKyMgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitJTkNMVURFX0dSQVBIICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIElOQ0xVREVEX0JZX0dSQVBILCBFTkFCTEVfUFJFUFJPQ0VTU0lORyBhbmQgU0VBUkNIX0lOQ0xVREVTIHRhZ3MgYXJlCisjIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGZpbGUgc2hvd2luZworIyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmNsdWRlIGRlcGVuZGVuY2llcyBvZiB0aGUgZmlsZSB3aXRoIG90aGVyIGRvY3VtZW50ZWQKKyMgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitJTkNMVURFRF9CWV9HUkFQSCAgICAgID0gWUVTCisKKyMgSWYgdGhlIENBTExfR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjYWxsCisjIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbiBvciBjbGFzcyBtZXRob2QuCisjCisjIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHRpbWUgb2YgYSBydW4uCisjIFNvIGluIG1vc3QgY2FzZXMgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gZW5hYmxlIGNhbGwgZ3JhcGhzIGZvciBzZWxlY3RlZAorIyBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxncmFwaCBjb21tYW5kLiBEaXNhYmxpbmcgYSBjYWxsIGdyYXBoIGNhbiBiZQorIyBhY2NvbXBsaXNoZWQgYnkgbWVhbnMgb2YgdGhlIGNvbW1hbmQgXGhpZGVjYWxsZ3JhcGguCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0NBTExfR1JBUEggICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBDQUxMRVJfR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjYWxsZXIKKyMgZGVwZW5kZW5jeSBncmFwaCBmb3IgZXZlcnkgZ2xvYmFsIGZ1bmN0aW9uIG9yIGNsYXNzIG1ldGhvZC4KKyMKKyMgTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgdGltZSBvZiBhIHJ1bi4KKyMgU28gaW4gbW9zdCBjYXNlcyBpdCB3aWxsIGJlIGJldHRlciB0byBlbmFibGUgY2FsbGVyIGdyYXBocyBmb3Igc2VsZWN0ZWQKKyMgZnVuY3Rpb25zIG9ubHkgdXNpbmcgdGhlIFxjYWxsZXJncmFwaCBjb21tYW5kLiBEaXNhYmxpbmcgYSBjYWxsZXIgZ3JhcGggY2FuIGJlCisjIGFjY29tcGxpc2hlZCBieSBtZWFucyBvZiB0aGUgY29tbWFuZCBcaGlkZWNhbGxlcmdyYXBoLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitDQUxMRVJfR1JBUEggICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgR1JBUEhJQ0FMX0hJRVJBUkNIWSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBncmFwaGljYWwKKyMgaGllcmFyY2h5IG9mIGFsbCBjbGFzc2VzIGluc3RlYWQgb2YgYSB0ZXh0dWFsIG9uZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0dSQVBISUNBTF9ISUVSQVJDSFkgICAgPSBZRVMKKworIyBJZiB0aGUgRElSRUNUT1JZX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNob3cgdGhlCisjIGRlcGVuZGVuY2llcyBhIGRpcmVjdG9yeSBoYXMgb24gb3RoZXIgZGlyZWN0b3JpZXMgaW4gYSBncmFwaGljYWwgd2F5LiBUaGUKKyMgZGVwZW5kZW5jeSByZWxhdGlvbnMgYXJlIGRldGVybWluZWQgYnkgdGhlICNpbmNsdWRlIHJlbGF0aW9ucyBiZXR3ZWVuIHRoZQorIyBmaWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitESVJFQ1RPUllfR1JBUEggICAgICAgID0gWUVTCisKKyMgVGhlIERPVF9JTUFHRV9GT1JNQVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgaW1hZ2UgZm9ybWF0IG9mIHRoZSBpbWFnZXMKKyMgZ2VuZXJhdGVkIGJ5IGRvdC4gRm9yIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBpbWFnZSBmb3JtYXRzIHNlZSB0aGUgc2VjdGlvbgorIyBvdXRwdXQgZm9ybWF0cyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgZG90IHRvb2wgKEdyYXBodml6IChzZWU6CisjIGh0dHA6Ly93d3cuZ3JhcGh2aXoub3JnLykpLgorIyBOb3RlOiBJZiB5b3UgY2hvb3NlIHN2ZyB5b3UgbmVlZCB0byBzZXQgSFRNTF9GSUxFX0VYVEVOU0lPTiB0byB4aHRtbCBpbiBvcmRlcgorIyB0byBtYWtlIHRoZSBTVkcgZmlsZXMgdmlzaWJsZSBpbiBJRSA5KyAob3RoZXIgYnJvd3NlcnMgZG8gbm90IGhhdmUgdGhpcworIyByZXF1aXJlbWVudCkuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmU6IHBuZywganBnLCBnaWYsIHN2ZywgcG5nOmdkLCBwbmc6Z2Q6Z2QsIHBuZzpjYWlybywKKyMgcG5nOmNhaXJvOmdkLCBwbmc6Y2Fpcm86Y2Fpcm8sIHBuZzpjYWlybzpnZGlwbHVzLCBwbmc6Z2RpcGx1cyBhbmQKKyMgcG5nOmdkaXBsdXM6Z2RpcGx1cy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IHBuZy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9JTUFHRV9GT1JNQVQgICAgICAgPSBwbmcKKworIyBJZiBET1RfSU1BR0VfRk9STUFUIGlzIHNldCB0byBzdmcsIHRoZW4gdGhpcyBvcHRpb24gY2FuIGJlIHNldCB0byBZRVMgdG8KKyMgZW5hYmxlIGdlbmVyYXRpb24gb2YgaW50ZXJhY3RpdmUgU1ZHIGltYWdlcyB0aGF0IGFsbG93IHpvb21pbmcgYW5kIHBhbm5pbmcuCisjCisjIE5vdGUgdGhhdCB0aGlzIHJlcXVpcmVzIGEgbW9kZXJuIGJyb3dzZXIgb3RoZXIgdGhhbiBJbnRlcm5ldCBFeHBsb3Jlci4gVGVzdGVkCisjIGFuZCB3b3JraW5nIGFyZSBGaXJlZm94LCBDaHJvbWUsIFNhZmFyaSwgYW5kIE9wZXJhLgorIyBOb3RlOiBGb3IgSUUgOSsgeW91IG5lZWQgdG8gc2V0IEhUTUxfRklMRV9FWFRFTlNJT04gdG8geGh0bWwgaW4gb3JkZXIgdG8gbWFrZQorIyB0aGUgU1ZHIGZpbGVzIHZpc2libGUuIE9sZGVyIHZlcnNpb25zIG9mIElFIGRvIG5vdCBoYXZlIFNWRyBzdXBwb3J0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitJTlRFUkFDVElWRV9TVkcgICAgICAgID0gTk8KKworIyBUaGUgRE9UX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHBhdGggd2hlcmUgdGhlIGRvdCB0b29sIGNhbiBiZQorIyBmb3VuZC4gSWYgbGVmdCBibGFuaywgaXQgaXMgYXNzdW1lZCB0aGUgZG90IHRvb2wgY2FuIGJlIGZvdW5kIGluIHRoZSBwYXRoLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX1BBVEggICAgICAgICAgICAgICA9IAorCisjIFRoZSBET1RGSUxFX0RJUlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdAorIyBjb250YWluIGRvdCBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZSBcZG90ZmlsZQorIyBjb21tYW5kKS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVEZJTEVfRElSUyAgICAgICAgICAgPSAKKworIyBUaGUgTVNDRklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBtc2MgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUgXG1zY2ZpbGUKKyMgY29tbWFuZCkuCisKK01TQ0ZJTEVfRElSUyAgICAgICAgICAgPSAKKworIyBUaGUgRElBRklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBkaWEgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUgXGRpYWZpbGUKKyMgY29tbWFuZCkuCisKK0RJQUZJTEVfRElSUyAgICAgICAgICAgPSAKKworIyBXaGVuIHVzaW5nIHBsYW50dW1sLCB0aGUgUExBTlRVTUxfSkFSX1BBVEggdGFnIHNob3VsZCBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlCisjIHBhdGggd2hlcmUgamF2YSBjYW4gZmluZCB0aGUgcGxhbnR1bWwuamFyIGZpbGUuIElmIGxlZnQgYmxhbmssIGl0IGlzIGFzc3VtZWQKKyMgUGxhbnRVTUwgaXMgbm90IHVzZWQgb3IgY2FsbGVkIGR1cmluZyBhIHByZXByb2Nlc3Npbmcgc3RlcC4gRG94eWdlbiB3aWxsCisjIGdlbmVyYXRlIGEgd2FybmluZyB3aGVuIGl0IGVuY291bnRlcnMgYSBcc3RhcnR1bWwgY29tbWFuZCBpbiB0aGlzIGNhc2UgYW5kCisjIHdpbGwgbm90IGdlbmVyYXRlIG91dHB1dCBmb3IgdGhlIGRpYWdyYW0uCisKK1BMQU5UVU1MX0pBUl9QQVRIICAgICAgPSAKKworIyBXaGVuIHVzaW5nIHBsYW50dW1sLCB0aGUgc3BlY2lmaWVkIHBhdGhzIGFyZSBzZWFyY2hlZCBmb3IgZmlsZXMgc3BlY2lmaWVkIGJ5CisjIHRoZSAhaW5jbHVkZSBzdGF0ZW1lbnQgaW4gYSBwbGFudHVtbCBibG9jay4KKworUExBTlRVTUxfSU5DTFVERV9QQVRIICA9IAorCisjIFRoZSBET1RfR1JBUEhfTUFYX05PREVTIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIG5vZGVzCisjIHRoYXQgd2lsbCBiZSBzaG93biBpbiB0aGUgZ3JhcGguIElmIHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gYSBncmFwaCBiZWNvbWVzCisjIGxhcmdlciB0aGFuIHRoaXMgdmFsdWUsIGRveHlnZW4gd2lsbCB0cnVuY2F0ZSB0aGUgZ3JhcGgsIHdoaWNoIGlzIHZpc3VhbGl6ZWQKKyMgYnkgcmVwcmVzZW50aW5nIGEgbm9kZSBhcyBhIHJlZCBib3guIE5vdGUgdGhhdCBkb3h5Z2VuIGlmIHRoZSBudW1iZXIgb2YgZGlyZWN0CisjIGNoaWxkcmVuIG9mIHRoZSByb290IG5vZGUgaW4gYSBncmFwaCBpcyBhbHJlYWR5IGxhcmdlciB0aGFuCisjIERPVF9HUkFQSF9NQVhfTk9ERVMgdGhlbiB0aGUgZ3JhcGggd2lsbCBub3QgYmUgc2hvd24gYXQgYWxsLiBBbHNvIG5vdGUgdGhhdAorIyB0aGUgc2l6ZSBvZiBhIGdyYXBoIGNhbiBiZSBmdXJ0aGVyIHJlc3RyaWN0ZWQgYnkgTUFYX0RPVF9HUkFQSF9ERVBUSC4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTAwMDAsIGRlZmF1bHQgdmFsdWU6IDUwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0dSQVBIX01BWF9OT0RFUyAgICA9IDUwCisKKyMgVGhlIE1BWF9ET1RfR1JBUEhfREVQVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbWF4aW11bSBkZXB0aCBvZiB0aGUgZ3JhcGhzCisjIGdlbmVyYXRlZCBieSBkb3QuIEEgZGVwdGggdmFsdWUgb2YgMyBtZWFucyB0aGF0IG9ubHkgbm9kZXMgcmVhY2hhYmxlIGZyb20gdGhlCisjIHJvb3QgYnkgZm9sbG93aW5nIGEgcGF0aCB2aWEgYXQgbW9zdCAzIGVkZ2VzIHdpbGwgYmUgc2hvd24uIE5vZGVzIHRoYXQgbGF5CisjIGZ1cnRoZXIgZnJvbSB0aGUgcm9vdCBub2RlIHdpbGwgYmUgb21pdHRlZC4gTm90ZSB0aGF0IHNldHRpbmcgdGhpcyBvcHRpb24gdG8gMQorIyBvciAyIG1heSBncmVhdGx5IHJlZHVjZSB0aGUgY29tcHV0YXRpb24gdGltZSBuZWVkZWQgZm9yIGxhcmdlIGNvZGUgYmFzZXMuIEFsc28KKyMgbm90ZSB0aGF0IHRoZSBzaXplIG9mIGEgZ3JhcGggY2FuIGJlIGZ1cnRoZXIgcmVzdHJpY3RlZCBieQorIyBET1RfR1JBUEhfTUFYX05PREVTLiBVc2luZyBhIGRlcHRoIG9mIDAgbWVhbnMgbm8gZGVwdGggcmVzdHJpY3Rpb24uCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDEwMDAsIGRlZmF1bHQgdmFsdWU6IDAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitNQVhfRE9UX0dSQVBIX0RFUFRIICAgID0gMAorCisjIFNldCB0aGUgRE9UX1RSQU5TUEFSRU5UIHRhZyB0byBZRVMgdG8gZ2VuZXJhdGUgaW1hZ2VzIHdpdGggYSB0cmFuc3BhcmVudAorIyBiYWNrZ3JvdW5kLiBUaGlzIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGJlY2F1c2UgZG90IG9uIFdpbmRvd3MgZG9lcyBub3Qgc2VlbQorIyB0byBzdXBwb3J0IHRoaXMgb3V0IG9mIHRoZSBib3guCisjCisjIFdhcm5pbmc6IERlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0gdXNlZCwgZW5hYmxpbmcgdGhpcyBvcHRpb24gbWF5IGxlYWQgdG8KKyMgYmFkbHkgYW50aS1hbGlhc2VkIGxhYmVscyBvbiB0aGUgZWRnZXMgb2YgYSBncmFwaCAoaS5lLiB0aGV5IGJlY29tZSBoYXJkIHRvCisjIHJlYWQpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfVFJBTlNQQVJFTlQgICAgICAgID0gTk8KKworIyBTZXQgdGhlIERPVF9NVUxUSV9UQVJHRVRTIHRhZyB0byBZRVMgdG8gYWxsb3cgZG90IHRvIGdlbmVyYXRlIG11bHRpcGxlIG91dHB1dAorIyBmaWxlcyBpbiBvbmUgcnVuIChpLmUuIG11bHRpcGxlIC1vIGFuZCAtVCBvcHRpb25zIG9uIHRoZSBjb21tYW5kIGxpbmUpLiBUaGlzCisjIG1ha2VzIGRvdCBydW4gZmFzdGVyLCBidXQgc2luY2Ugb25seSBuZXdlciB2ZXJzaW9ucyBvZiBkb3QgKD4xLjguMTApIHN1cHBvcnQKKyMgdGhpcywgdGhpcyBmZWF0dXJlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9NVUxUSV9UQVJHRVRTICAgICAgPSBOTworCisjIElmIHRoZSBHRU5FUkFURV9MRUdFTkQgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgbGVnZW5kIHBhZ2UKKyMgZXhwbGFpbmluZyB0aGUgbWVhbmluZyBvZiB0aGUgdmFyaW91cyBib3hlcyBhbmQgYXJyb3dzIGluIHRoZSBkb3QgZ2VuZXJhdGVkCisjIGdyYXBocy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX0xFR0VORCAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRE9UX0NMRUFOVVAgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCByZW1vdmUgdGhlIGludGVybWVkaWF0ZSBkb3QKKyMgZmlsZXMgdGhhdCBhcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgdmFyaW91cyBncmFwaHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfQ0xFQU5VUCAgICAgICAgICAgID0gWUVTCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9mYXVsdGluamVjdGlvbi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYWQzY2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQW5kcm9pZC5icApAQCAtMCwwICsxLDI5IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9jb21wb25lbnRfd3JhcHBlciIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkMyQ29tcG9uZW50V3JhcHBlci5jcHAiLAorICAgICAgICAiU2ltcGxlTWV0aG9kU3RhdGUuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCisKKyAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9mYXVsdGluamVjdGlvbi9DMkNvbXBvbmVudFdyYXBwZXIuY3BwIGIvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL0MyQ29tcG9uZW50V3JhcHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ1ZjhiZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9mYXVsdGluamVjdGlvbi9DMkNvbXBvbmVudFdyYXBwZXIuY3BwCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJDb21wb25lbnRXcmFwcGVyIgorCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnRXcmFwcGVyLmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKKworYzJfc3RhdHVzX3QgV3JhcFNpbXBsZU1ldGhvZCgKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdCh2b2lkKT4gb3AsIGNvbnN0IFNpbXBsZU1ldGhvZFN0YXRlICZzdGF0ZSkgeworICAgIGMyX3N0YXR1c190IHJlc3VsdCA9IEMyX09LOworICAgIHN3aXRjaCAoc3RhdGUuZ2V0TW9kZSgpKSB7CisgICAgICAgIGNhc2UgU2ltcGxlTWV0aG9kU3RhdGU6OkVYRUNVVEU6CisgICAgICAgICAgICByZXN1bHQgPSBvcCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2ltcGxlTWV0aG9kU3RhdGU6Ok5PX09QOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2ltcGxlTWV0aG9kU3RhdGU6OkhBTkc6CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2Zvcigxcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpc3RhdGUub3ZlcnJpZGVSZXN1bHQoJnJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0MyQ29tcG9uZW50V3JhcHBlcjo6SW5qZWN0ZXI6OkluamVjdGVyKEMyQ29tcG9uZW50V3JhcHBlciAqdGhpeikgOiBtVGhpeih0aGl6KSB7fQorCitTaW1wbGVNZXRob2RTdGF0ZTo6SW5qZWN0ZXIgQzJDb21wb25lbnRXcmFwcGVyOjpJbmplY3Rlcjo6c3RhcnQoKSB7CisgICAgcmV0dXJuIFNpbXBsZU1ldGhvZFN0YXRlOjpJbmplY3RlcigmbVRoaXotPm1TdGFydFN0YXRlKTsKK30KKworQzJDb21wb25lbnRXcmFwcGVyOjpMaXN0ZW5lcjo6TGlzdGVuZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+ICZsaXN0ZW5lcikgOiBtTGlzdGVuZXIobGlzdGVuZXIpIHt9CisKK3ZvaWQgQzJDb21wb25lbnRXcmFwcGVyOjpMaXN0ZW5lcjo6b25Xb3JrRG9uZV9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gd29ya0l0ZW1zKSB7CisgICAgbUxpc3RlbmVyLT5vbldvcmtEb25lX25iKGNvbXBvbmVudCwgc3RkOjptb3ZlKHdvcmtJdGVtcykpOworfQorCit2b2lkIEMyQ29tcG9uZW50V3JhcHBlcjo6TGlzdGVuZXI6Om9uVHJpcHBlZF9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBzZXR0aW5nUmVzdWx0KSB7CisgICAgbUxpc3RlbmVyLT5vblRyaXBwZWRfbmIoY29tcG9uZW50LHNldHRpbmdSZXN1bHQpOworfQorCit2b2lkIEMyQ29tcG9uZW50V3JhcHBlcjo6TGlzdGVuZXI6Om9uRXJyb3JfbmIoCisgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwgdWludDMyX3QgZXJyb3JDb2RlKSB7CisgICAgbUxpc3RlbmVyLT5vbkVycm9yX25iKGNvbXBvbmVudCwgZXJyb3JDb2RlKTsKK30KKworQzJDb21wb25lbnRXcmFwcGVyOjpDMkNvbXBvbmVudFdyYXBwZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gJmNvbXApIDogbUNvbXAoY29tcCkge30KKworYzJfc3RhdHVzX3QgQzJDb21wb25lbnRXcmFwcGVyOjpzZXRMaXN0ZW5lcl92YigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gJmxpc3RlbmVyLCBjMl9ibG9ja2luZ190IG1heUJsb2NrKSB7CisgICAgbUxpc3RlbmVyID0gc3RkOjptYWtlX3NoYXJlZDxMaXN0ZW5lcj4obGlzdGVuZXIpOworICAgIHJldHVybiBtQ29tcC0+c2V0TGlzdGVuZXJfdmIobUxpc3RlbmVyLCBtYXlCbG9jayk7Cit9CisKK2MyX3N0YXR1c190IEMyQ29tcG9uZW50V3JhcHBlcjo6cXVldWVfbmIoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgaXRlbXMpIHsKKyAgICByZXR1cm4gbUNvbXAtPnF1ZXVlX25iKGl0ZW1zKTsKK30KKworYzJfc3RhdHVzX3QgQzJDb21wb25lbnRXcmFwcGVyOjphbm5vdW5jZV9uYihjb25zdCBzdGQ6OnZlY3RvcjxDMldvcmtPdXRsaW5lPiAmaXRlbXMpIHsKKyAgICByZXR1cm4gbUNvbXAtPmFubm91bmNlX25iKGl0ZW1zKTsKK30KKworYzJfc3RhdHVzX3QgQzJDb21wb25lbnRXcmFwcGVyOjpmbHVzaF9zbSgKKyAgICAgICAgQzJDb21wb25lbnQ6OmZsdXNoX21vZGVfdCBtb2RlLCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBmbHVzaGVkV29yaykgeworICAgIHJldHVybiBtQ29tcC0+Zmx1c2hfc20obW9kZSwgZmx1c2hlZFdvcmspOworfQorCitjMl9zdGF0dXNfdCBDMkNvbXBvbmVudFdyYXBwZXI6OmRyYWluX25iKEMyQ29tcG9uZW50OjpkcmFpbl9tb2RlX3QgbW9kZSkgeworICAgIHJldHVybiBtQ29tcC0+ZHJhaW5fbmIobW9kZSk7Cit9CisKK2MyX3N0YXR1c190IEMyQ29tcG9uZW50V3JhcHBlcjo6c3RhcnQoKSB7CisgICAgcmV0dXJuIFdyYXBTaW1wbGVNZXRob2QoW3RoaXNdIHsgcmV0dXJuIG1Db21wLT5zdGFydCgpOyB9LCBtU3RhcnRTdGF0ZSk7Cit9CisKK2MyX3N0YXR1c190IEMyQ29tcG9uZW50V3JhcHBlcjo6c3RvcCgpIHsKKyAgICByZXR1cm4gbUNvbXAtPnN0b3AoKTsKK30KKworYzJfc3RhdHVzX3QgQzJDb21wb25lbnRXcmFwcGVyOjpyZXNldCgpIHsKKyAgICByZXR1cm4gbUNvbXAtPnJlc2V0KCk7Cit9CisKK2MyX3N0YXR1c190IEMyQ29tcG9uZW50V3JhcHBlcjo6cmVsZWFzZSgpIHsKKyAgICByZXR1cm4gbUNvbXAtPnJlbGVhc2UoKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBDMkNvbXBvbmVudFdyYXBwZXI6OmludGYoKXsKKyAgICByZXR1cm4gbUNvbXAtPmludGYoKTsKK30KKworQzJDb21wb25lbnRXcmFwcGVyOjpJbmplY3RlciBDMkNvbXBvbmVudFdyYXBwZXI6OmluamVjdCgpIHsKKyAgICByZXR1cm4gSW5qZWN0ZXIodGhpcyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQzJDb21wb25lbnRXcmFwcGVyLmggYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQzJDb21wb25lbnRXcmFwcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM3MzUwZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9mYXVsdGluamVjdGlvbi9DMkNvbXBvbmVudFdyYXBwZXIuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMl9DT01QT05FTlRfV1JBUFBFUl9IXworI2RlZmluZSBDMl9DT01QT05FTlRfV1JBUFBFUl9IXworCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgIlNpbXBsZU1ldGhvZFN0YXRlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBDcmVhdGVzIGEgV3JhcHBlciBhcm91bmQgdGhlIGNsYXNzIEMyQ29tcG9uZW50IGFuZCBpdHMgbWV0aG9kcy4gVGhlIHdyYXBwZXIgaXMgdXNlZCB0bworICogc2ltdWxhdGUgZXJyb3JzIGluIHRoZSBhbmRyb2lkIG1lZGlhIGNvbXBvbmVudHMgYnkgZmF1bHQgaW5qZWN0aW9uIHRlY2huaXF1ZS4KKyAqIFRoaXMgaXMgZG9uZSB0byBjaGVjayBob3cgdGhlIGZyYW1ld29yayBoYW5kbGVzIHRoZSBlcnJvciBzaXR1YXRpb24uCisgKi8KK2NsYXNzIEMyQ29tcG9uZW50V3JhcHBlcgorICAgICAgICA6IHB1YmxpYyBDMkNvbXBvbmVudCwgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8QzJDb21wb25lbnRXcmFwcGVyPiB7CitwdWJsaWM6CisgICAgY2xhc3MgSW5qZWN0ZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgSW5qZWN0ZXIoQzJDb21wb25lbnRXcmFwcGVyICp0aGl6KTsKKworICAgICAgICBTaW1wbGVNZXRob2RTdGF0ZTo6SW5qZWN0ZXIgc3RhcnQoKTsKKyAgICBwcml2YXRlOgorICAgICAgICBDMkNvbXBvbmVudFdyYXBwZXIgKmNvbnN0IG1UaGl6OworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBBIHdyYXBwZXIgYXJvdW5kIHRoZSBsaXN0ZW5lciBjbGFzcyBpbnNpZGUgQzJDb21wb25lbnQgY2xhc3MuCisgICAgICovCisgICAgY2xhc3MgTGlzdGVuZXIgOiBwdWJsaWMgQzJDb21wb25lbnQ6Okxpc3RlbmVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IExpc3RlbmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+ICZsaXN0ZW5lcik7CisgICAgICAgIHZpcnR1YWwgfkxpc3RlbmVyKCkgPSBkZWZhdWx0OworCisgICAgICAgIHZvaWQgb25Xb3JrRG9uZV9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtJdGVtcykgb3ZlcnJpZGU7CisgICAgICAgIHZvaWQgb25UcmlwcGVkX25iKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IHNldHRpbmdSZXN1bHQpIG92ZXJyaWRlOworICAgICAgICB2b2lkIG9uRXJyb3JfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LCB1aW50MzJfdCBlcnJvckNvZGUpIG92ZXJyaWRlOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIH07CisKKyAgICBleHBsaWNpdCBDMkNvbXBvbmVudFdyYXBwZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiAmY29tcCk7CisgICAgdmlydHVhbCB+QzJDb21wb25lbnRXcmFwcGVyKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzZXRMaXN0ZW5lcl92YigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+ICZsaXN0ZW5lciwKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVldWVfbmIoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgaXRlbXMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgYW5ub3VuY2VfbmIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJXb3JrT3V0bGluZT4gJml0ZW1zKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZsdXNoX3NtKAorICAgICAgICAgICAgZmx1c2hfbW9kZV90IG1vZGUsIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGZsdXNoZWRXb3JrKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGRyYWluX25iKGRyYWluX21vZGVfdCBtb2RlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHN0YXJ0KCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzdG9wKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCByZXNldCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVsZWFzZSgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmKCkgb3ZlcnJpZGU7CisKKyAgICBJbmplY3RlciBpbmplY3QoKTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IG1Db21wOworCisgICAgU2ltcGxlTWV0aG9kU3RhdGUgbVN0YXJ0U3RhdGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQzJfQ09NUE9ORU5UX1dSQVBQRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9mYXVsdGluamVjdGlvbi9TaW1wbGVNZXRob2RTdGF0ZS5jcHAgYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vU2ltcGxlTWV0aG9kU3RhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OWQ2NGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vU2ltcGxlTWV0aG9kU3RhdGUuY3BwCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTaW1wbGVNZXRob2RTdGF0ZSIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlICJTaW1wbGVNZXRob2RTdGF0ZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1NpbXBsZU1ldGhvZFN0YXRlOjpJbmplY3Rlcjo6SW5qZWN0ZXIoU2ltcGxlTWV0aG9kU3RhdGUgKnRoaXopIDogbVRoaXoodGhpeikge30KKwordm9pZCBTaW1wbGVNZXRob2RTdGF0ZTo6SW5qZWN0ZXI6OmhhbmcoKSB7CisgICAgbVRoaXotPm1Nb2RlID0gSEFORzsKK30KKwordm9pZCBTaW1wbGVNZXRob2RTdGF0ZTo6SW5qZWN0ZXI6OmZhaWwoYzJfc3RhdHVzX3QgZXJyLCBib29sIGV4ZWN1dGUpIHsKKyAgICBtVGhpei0+bU1vZGUgPSBleGVjdXRlID8gRVhFQ1VURSA6IE5PX09QOworICAgIG1UaGl6LT5tT3ZlcnJpZGUgPSB0cnVlOworICAgIG1UaGl6LT5tUmVzdWx0T3ZlcnJpZGUgPSBlcnI7Cit9CisKK1NpbXBsZU1ldGhvZFN0YXRlOjpTaW1wbGVNZXRob2RTdGF0ZSgpCisgICAgOiBtTW9kZShFWEVDVVRFKSwgbU92ZXJyaWRlKGZhbHNlKSwgbVJlc3VsdE92ZXJyaWRlKEMyX09LKSB7fQorCitTaW1wbGVNZXRob2RTdGF0ZTo6TW9kZSBTaW1wbGVNZXRob2RTdGF0ZTo6Z2V0TW9kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbU1vZGU7Cit9CisKK2Jvb2wgU2ltcGxlTWV0aG9kU3RhdGU6Om92ZXJyaWRlUmVzdWx0KGMyX3N0YXR1c190ICpyZXN1bHQpIGNvbnN0IHsKKyAgICBpZiAoIW1PdmVycmlkZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgICpyZXN1bHQgPSBtUmVzdWx0T3ZlcnJpZGU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vU2ltcGxlTWV0aG9kU3RhdGUuaCBiL21lZGlhL2NvZGVjMi9mYXVsdGluamVjdGlvbi9TaW1wbGVNZXRob2RTdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMDQ1OWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vU2ltcGxlTWV0aG9kU3RhdGUuaApAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTSU1QTEVfTUVUSE9EX1NUQVRFX0hfCisjZGVmaW5lIFNJTVBMRV9NRVRIT0RfU1RBVEVfSF8KKworI2luY2x1ZGUgPEMyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBTdGF0ZSBmb3IgYSBzaW1wbGUgbWV0aG9kIHdoaWNoIHJldHVybnMgYzJfc3RhdHVzX3QgYW5kIHRha2VzIG5vIHBhcmFtZXRlcnMuCisgKi8KK2NsYXNzIFNpbXBsZU1ldGhvZFN0YXRlIHsKK3B1YmxpYzoKKyAgICBlbnVtIE1vZGUgeworICAgICAgICAvLyBFeGVjdXRlIHRoZSBub3JtYWwgb3BlcmF0aW9uCisgICAgICAgIEVYRUNVVEUsCisgICAgICAgIC8vIERvbid0IGRvIGFueXRoaW5nCisgICAgICAgIE5PX09QLAorICAgICAgICAvLyBIYW5nOyBuZXZlciByZXR1cm4KKyAgICAgICAgSEFORywKKyAgICB9OworCisgICAgLyoqCisgICAgICogSW5qZWN0ZXIgY2xhc3MgdGhhdCBtb2RpZmllcyB0aGUgaW50ZXJuYWwgc3RhdGVzIG9mIHRoaXMgY2xhc3MuCisgICAgICovCisgICAgY2xhc3MgSW5qZWN0ZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgSW5qZWN0ZXIoU2ltcGxlTWV0aG9kU3RhdGUgKnRoaXopOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5nIHRoZSBvcGVyYXRpb24uCisgICAgICAgICAqLworICAgICAgICB2b2lkIGhhbmcoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogRmFpbCB0aGUgb3BlcmF0aW9uIHdpdGggZ2l2ZW4gcGFyYW1zLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gZXJyICAgICAgIGVycm9yIGNvZGUgdG8gcmVwbGFjZSB0aGUgYWN0dWFsIHJldHVybiB2YWx1ZQorICAgICAgICAgKiBccGFyYW0gZXhlY3V0ZSAgIHdoZXRoZXIgdGhlIHdyYXBwZXIgc2hvdWxkIGV4ZWN1dGUgdGhlIG9wZXJhdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBmYWlsKGMyX3N0YXR1c190IGVyciwgYm9vbCBleGVjdXRlID0gZmFsc2UpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgU2ltcGxlTWV0aG9kU3RhdGUgKmNvbnN0IG1UaGl6OworICAgIH07CisKKyAgICBTaW1wbGVNZXRob2RTdGF0ZSgpOworCisgICAgLyoqCisgICAgICogR2V0IGV4ZWN1dGlvbiBtb2RlLgorICAgICAqLworICAgIE1vZGUgZ2V0TW9kZSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgcmVzdWx0IGZyb20gcnVubmluZyB0aGUgb3BlcmF0aW9uIGlmIGNvbmZpZ3VyZWQgc28uCisgICAgICovCisgICAgYm9vbCBvdmVycmlkZVJlc3VsdChjMl9zdGF0dXNfdCAqcmVzdWx0KSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBNb2RlIG1Nb2RlOworICAgIGJvb2wgbU92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG1SZXN1bHRPdmVycmlkZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBTSU1QTEVfTUVUSE9EX1NUQVRFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YWQ2YTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDY3IEBACisvLyBETyBOT1QgREVQRU5EIE9OIFRISVMgRElSRUNUTFkKKy8vIHVzZSBsaWJjb2RlYzItaGlkbC1kZWZhdWx0cyBpbnN0ZWFkCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGliY29kZWMyX2hpZGxAMS4wIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgZGVmYXVsdHM6IFsiaGlkbF9kZWZhdWx0cyJdLAorCisgICAgc3JjczogWworICAgICAgICAiQ29tcG9uZW50LmNwcCIsCisgICAgICAgICJDb21wb25lbnRTdG9yZS5jcHAiLAorICAgICAgICAiQ29uZmlndXJhYmxlLmNwcCIsCisgICAgICAgICJJbnB1dFN1cmZhY2UuY3BwIiwKKyAgICAgICAgIklucHV0U3VyZmFjZUNvbm5lY3Rpb24uY3BwIiwKKyAgICAgICAgInR5cGVzLmNwcCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJzeXN0ZW1faGVhZGVycyIsCisgICAgICAgICJsaWJjb2RlYzJfaW50ZXJuYWwiLCAvLyBwcml2YXRlCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmNvbW1vbkAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnF1ZXVlX2hlbHBlciIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMCIsCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycXVldWVfaGVscGVyIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICBdLAorfQorCisvLyBwdWJsaWMgZGVwZW5kZW5jeSBmb3IgQ29kZWMgMi4wIEhBTCBzZXJ2aWNlIGltcGxlbWVudGF0aW9ucworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJjb2RlYzItaGlkbC1kZWZhdWx0cyIsCisgICAgZGVmYXVsdHM6IFsibGliY29kZWMyLWltcGwtZGVmYXVsdHMiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMCIsCisgICAgICAgICJsaWJjb2RlYzJfaGlkbEAxLjAiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29tcG9uZW50LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZTE5NzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29tcG9uZW50LmNwcApAQCAtMCwwICsxLDEwNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMi1Db21wb25lbnQiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudC5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC90eXBlcy5oPgorCisjaW5jbHVkZSA8aGlkbC9IaWRsQmluZGVyU3VwcG9ydC5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorCisjaW5jbHVkZSA8QzJCcUJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ7CisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworLy8gSW1wbGVtZW50YXRpb24gb2YgQ29uZmlndXJhYmxlQzJJbnRmIGJhc2VkIG9uIEMyQ29tcG9uZW50SW50ZXJmYWNlCitzdHJ1Y3QgQ29tcEludGYgOiBwdWJsaWMgQ29uZmlndXJhYmxlQzJJbnRmIHsKKyAgICBDb21wSW50Zihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+JiBpbnRmKSA6CisgICAgICAgIENvbmZpZ3VyYWJsZUMySW50ZihpbnRmLT5nZXROYW1lKCkpLAorICAgICAgICBtSW50ZihpbnRmKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWcoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4mIHBhcmFtcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzCisgICAgICAgICAgICApIG92ZXJyaWRlIHsKKyAgICAgICAgQUxPR1YoImNvbmZpZyIpOworICAgICAgICByZXR1cm4gbUludGYtPmNvbmZpZ192YihwYXJhbXMsIG1heUJsb2NrLCBmYWlsdXJlcyk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiYgaW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBwYXJhbXMKKyAgICAgICAgICAgICkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBBTE9HVigicXVlcnkiKTsKKyAgICAgICAgcmV0dXJuIG1JbnRmLT5xdWVyeV92Yih7fSwgaW5kaWNlcywgbWF5QmxvY2ssIHBhcmFtcyk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+KiBjb25zdCBwYXJhbXMKKyAgICAgICAgICAgICkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBBTE9HVigicXVlcnlTdXBwb3J0ZWRQYXJhbXMiKTsKKyAgICAgICAgcmV0dXJuIG1JbnRmLT5xdWVyeVN1cHBvcnRlZFBhcmFtc19uYihwYXJhbXMpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+JiBmaWVsZHMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIEFMT0dWKCJxdWVyeVN1cHBvcnRlZFZhbHVlcyIpOworICAgICAgICByZXR1cm4gbUludGYtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3ZiKGZpZWxkcywgbWF5QmxvY2spOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gbUludGY7Cit9OworCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKKy8vIElucHV0QnVmZmVyTWFuYWdlcgorLy8gPT09PT09PT09PT09PT09PT09CisvLworLy8gSW5wdXRCdWZmZXJNYW5hZ2VyIHByZXNlbnRzIGEgd2F5IHRvIHRyYWNrIGFuZCB1bnRyYWNrIGlucHV0IGJ1ZmZlcnMgaW4gdGhpcworLy8gKGNvZGVjKSBwcm9jZXNzIGFuZCBzZW5kIGEgbm90aWZpY2F0aW9uIHRvIGEgbGlzdGVuZXIsIHBvc3NpYmx5IGluIGEKKy8vIGRpZmZlcmVudCBwcm9jZXNzLCB3aGVuIGEgdHJhY2tlZCBidWZmZXIgbm8gbG9uZ2VyIGhhcyBhbnkgcmVmZXJlbmNlcyBpbiB0aGlzCisvLyBwcm9jZXNzLiAoSW4gZmFjdCwgdGhpcyBjbGFzcyB3b3VsZCB3b3JrIGZvciBsaXN0ZW5lcnMgaW4gdGhlIHNhbWUgcHJvY2VzcworLy8gdG9vLCBidXQgdGhlIG9wdGltaXphdGlvbiBkaXNjdXNzZWQgYmVsb3cgd2lsbCBub3QgYmUgYmVuZWZpY2lhbC4pCisvLworLy8gSW5wdXRCdWZmZXJNYW5hZ2VyIGhvbGRzIGEgY29sbGVjdGlvbiBvZiByZWNvcmRzIHJlcHJlc2VudGluZyB0cmFja2VkIGJ1ZmZlcnMKKy8vIGFuZCB0aGVpciBjYWxsYmFjayBsaXN0ZW5lcnMuIENvbmNlcHR1YWxseSwgb25lIHJlY29yZCBpcyBhIHRyaXBsZSAobGlzdGVuZXIsCisvLyBmcmFtZUluZGV4LCBidWZmZXJJbmRleCkgd2hlcmUKKy8vCisvLyAtIChmcmFtZUluZGV4LCBidWZmZXJJbmRleCkgaXMgYSBwYWlyIG9mIGluZGljZXMgdXNlZCB0byBpZGVudGlmeSB0aGUgYnVmZmVyLgorLy8gLSBsaXN0ZW5lciBpcyBvZiB0eXBlIElDb21wb25lbnRMaXN0ZW5lci4gSXRzIG9uRnJhbWVzUmVuZGVyZWQoKSBmdW5jdGlvbgorLy8gICB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgYXNzb2NpYXRlZCBidWZmZXIgZGllcy4gVGhlIGFyZ3VtZW50IG9mCisvLyAgIG9uRnJhbWVzUmVuZGVyZWQoKSBpcyBhIGxpc3Qgb2YgUmVuZGVyZWRGcmFtZSBvYmplY3RzLCBlYWNoIG9mIHdoaWNoIGhhcworLy8gICB0aGUgZm9sbG93aW5nIG1lbWJlcnM6CisvLworLy8gICAgIHVpbnQ2NF90IGJ1ZmZlclF1ZXVlSWQKKy8vICAgICBpbnQzMl90ICBzbG90SWQKKy8vICAgICBpbnQ2NF90ICB0aW1lc3RhbXBOcworLy8KKy8vIFdoZW4gYSB0cmFja2VkIGJ1ZmZlciBhc3NvY2lhdGVkIHRvIHRoZSB0cmlwbGUgKGxpc3RlbmVyLCBmcmFtZUluZGV4LAorLy8gYnVmZmVySW5kZXgpIGdvZXMgb3V0IG9mIHNjb3BlLCBsaXN0ZW5lci0+b25GcmFtZXNSZW5kZXJlZCgpIHdpbGwgYmUgY2FsbGVkCisvLyB3aXRoIGEgUmVuZGVyZWRGcmFtZSBvYmplY3Qgd2hvc2UgbWVtYmVycyBhcmUgc2V0IGFzIGZvbGxvd3M6CisvLworLy8gICAgIGJ1ZmZlclF1ZXVlSWQgPSBmcmFtZUluZGV4CisvLyAgICAgc2xvdElkICAgICAgICA9IH5idWZmZXJJbmRleAorLy8gICAgIHRpbWVzdGFtcE5zICAgPSBzeXN0ZW1UaW1lKCkgYXQgdGhlIHRpbWUgb2Ygbm90aWZpY2F0aW9uCisvLworLy8gVGhlIHJlYXNvbiBmb3IgdGhlIGJpdHdpc2UgbmVnYXRpb24gb2YgYnVmZmVySW5kZXggaXMgdGhhdCBvbkZyYW1lc1JlbmRlcmVkKCkKKy8vIG1heSBiZSB1c2VkIGZvciBhIGRpZmZlcmVudCBwdXJwb3NlIHdoZW4gc2xvdElkIGlzIG5vbi1uZWdhdGl2ZSAod2hpY2ggaXMgYQorLy8gbW9yZSBnZW5lcmFsIHVzZSBjYXNlKS4KKy8vCisvLyBJUEMgT3B0aW1pemF0aW9uCisvLyAtLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU2luY2Ugb25GcmFtZXNSZW5kZXJlZCgpIGdlbmVyYWxseSBpcyBhbiBJUEMgY2FsbCwgSW5wdXRCdWZmZXJNYW5hZ2VyIHRyaWVzCisvLyBub3QgdG8gY2FsbCBpdCB0b28gb2Z0ZW4uIFRoZXJlIGlzIGEgbWVjaGFuaXNtIHRvIGd1YXJhbnRlZSB0aGF0IGFueSB0d28KKy8vIGNhbGxzIHRvIHRoZSBzYW1lIGxpc3RlbmVyIGFyZSBhdCBsZWFzdCBrTm90aWZpY2F0aW9uUGVyaW9kTnMgbmFub3NlY29uZHMKKy8vIGFwYXJ0LgorLy8KK3N0cnVjdCBJbnB1dEJ1ZmZlck1hbmFnZXIgeworICAgIC8vIFRoZSBtaW5pbXVtIHRpbWUgcGVyaW9kIGJldHdlZW4gSVBDIGNhbGxzIHRvIG5vdGlmeSB0aGUgY2xpZW50IGFib3V0IHRoZQorICAgIC8vIGRlc3RydWN0aW9uIG9mIGlucHV0IGJ1ZmZlcnMuCisgICAgc3RhdGljIGNvbnN0ZXhwciBuc2Vjc190IGtOb3RpZmljYXRpb25QZXJpb2ROcyA9IDEwMDAwMDA7CisKKyAgICAvLyBUcmFjayBhbGwgYnVmZmVycyBpbiBhIEMyRnJhbWVEYXRhIG9iamVjdC4KKyAgICAvLworICAgIC8vIGlucHV0IChDMkZyYW1lRGF0YSkgaGFzIHRoZSBmb2xsb3dpbmcgdHdvIG1lbWJlcnMgdGhhdCBhcmUgb2YgaW50ZXJlc3Q6CisgICAgLy8KKyAgICAvLyAgIEMyV29ya09yZGluYWwgICAgICAgICAgICAgICAgb3JkaW5hbAorICAgIC8vICAgdmVjdG9yPHNoYXJlZF9wdHI8QzJCdWZmZXI+PiBidWZmZXJzCisgICAgLy8KKyAgICAvLyBDYWxsaW5nIHJlZ2lzdGVyRnJhbWVEYXRhKGxpc3RlbmVyLCBpbnB1dCkgd2lsbCByZWdpc3RlciBtdWx0aXBsZQorICAgIC8vIHRyaXBsZXMgKCwgZnJhbWVJbmRleCwgYnVmZmVySW5kZXgpIHdoZXJlIGZyYW1lSW5kZXggaXMgZXF1YWwgdG8KKyAgICAvLyBpbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggYW5kIGJ1ZmZlckluZGV4IHJ1bnMgdGhyb3VnaCB0aGUgaW5kaWNlcyBvZgorICAgIC8vIGlucHV0LmJ1ZmZlcnMgc3VjaCB0aGF0IGlucHV0LmJ1ZmZlcnNbYnVmZmVySW5kZXhdIGlzIG5vdCBudWxsLgorICAgIC8vCisgICAgLy8gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGZyb20gcXVldWUoKS4KKyAgICBzdGF0aWMgdm9pZCByZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgY29uc3QgQzJGcmFtZURhdGEmIGlucHV0KTsKKworICAgIC8vIFVudHJhY2sgYWxsIGJ1ZmZlcnMgaW4gYSBDMkZyYW1lRGF0YSBvYmplY3QuCisgICAgLy8KKyAgICAvLyBDYWxsaW5nIHVucmVnaXN0ZXJGcmFtZURhdGEobGlzdGVuZXIsIGlucHV0KSB3aWxsIHVucmVnaXN0ZXIgYW5kIHJlbW92ZQorICAgIC8vIHBlbmRpbmcgbm90aWZpY2F0aW9ucyBmb3IgYWxsIHRyaXBsZXMgKGwsIGZpLCBidWZmZXJJbmRleCkgc3VjaCB0aGF0CisgICAgLy8gbCA9IGxpc3RlbmVyIGFuZCBmaSA9IGlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC4KKyAgICAvLworICAgIC8vIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmcm9tIG9uV29ya0RvbmUoKSBhbmQgZmx1c2goKS4KKyAgICBzdGF0aWMgdm9pZCB1bnJlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICAgICAgY29uc3Qgd3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgICAgICBjb25zdCBDMkZyYW1lRGF0YSYgaW5wdXQpOworCisgICAgLy8gVW50cmFjayBhbGwgYnVmZmVycyBhc3NvY2lhdGVkIHRvIGEgZ2l2ZW4gbGlzdGVuZXIuCisgICAgLy8KKyAgICAvLyBDYWxsaW5nIHVucmVnaXN0ZXJGcmFtZURhdGEobGlzdGVuZXIpIHdpbGwgdW5yZWdpc3RlciBhbmQgcmVtb3ZlCisgICAgLy8gcGVuZGluZyBub3RpZmljYXRpb25zIGZvciBhbGwgdHJpcGxlcyAobCwgZnJhbWVJbmRleCwgYnVmZmVySW5kZXgpIHN1Y2gKKyAgICAvLyB0aGF0IGwgPSBsaXN0ZW5lci4KKyAgICAvLworICAgIC8vIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSBjb21wb25lbnQgY2xlYW5zIHVwIGFsbCBpbnB1dCBidWZmZXJzLAorICAgIC8vIGkuZS4sIHdoZW4gcmVzZXQoKSwgcmVsZWFzZSgpLCBzdG9wKCkgb3IgfkNvbXBvbmVudCgpIGlzIGNhbGxlZC4KKyAgICBzdGF0aWMgdm9pZCB1bnJlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICAgICAgY29uc3Qgd3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIpOworCitwcml2YXRlOgorICAgIHZvaWQgX3JlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgICAgICBjb25zdCBDMkZyYW1lRGF0YSYgaW5wdXQpOworICAgIHZvaWQgX3VucmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgICAgICBjb25zdCB3cDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIGNvbnN0IEMyRnJhbWVEYXRhJiBpbnB1dCk7CisgICAgdm9pZCBfdW5yZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IHdwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKKworICAgIC8vIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0aWVkIHRvIEMyQnVmZmVyIG9iamVjdHMuCisgICAgLy8KKyAgICAvLyBOb3RlOiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBzSW5zdGFuY2UgaXMgdGhlIG9ubHkgaW5zdGFuY2Ugb2YgdGhpcworICAgIC8vICAgICAgIGNsYXNzLgorICAgIHN0YXRpYyB2b2lkIG9uQnVmZmVyRGVzdHJveWVkKGNvbnN0IEMyQnVmZmVyKiBidWYsIHZvaWQqIGFyZyk7CisgICAgdm9pZCBfb25CdWZmZXJEZXN0cm95ZWQoY29uc3QgQzJCdWZmZXIqIGJ1Ziwgdm9pZCogYXJnKTsKKworICAgIC8vIENvbXBhcmlzb24gb3BlcmF0b3IgZm9yIHdlYWsgcG9pbnRlcnMuCisgICAgc3RydWN0IENvbXBhcmVXZWFrQ29tcG9uZW50TGlzdGVuZXIgeworICAgICAgICBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcigpKAorICAgICAgICAgICAgICAgIGNvbnN0IHdwPElDb21wb25lbnRMaXN0ZW5lcj4mIHgsCisgICAgICAgICAgICAgICAgY29uc3Qgd3A8SUNvbXBvbmVudExpc3RlbmVyPiYgeSkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIHguZ2V0X3JlZnMoKSA8IHkuZ2V0X3JlZnMoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLyBQZXJzaXN0ZW50IGRhdGEgdG8gYmUgcGFzc2VkIGFzICJhcmciIGluIG9uQnVmZmVyRGVzdHJveWVkKCkuCisgICAgLy8gVGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgdHJpcGxlIChsaXN0ZW5lciwgZnJhbWVJbmRleCwgYnVmZmVySW5kZXgpIHBsdXMgYQorICAgIC8vIHdlYWsgcG9pbnRlciB0byB0aGUgQzJCdWZmZXIgb2JqZWN0LgorICAgIC8vCisgICAgLy8gTm90ZSB0aGF0IHRoZSAia2V5IiBpcyBidWZmZXJJbmRleCBhY2NvcmRpbmcgdG8gb3BlcmF0b3I8KCkuIFRoaXMgaXMKKyAgICAvLyBkZXNpZ25lZCB0byB3b3JrIHdpdGggVHJhY2tlZEJ1ZmZlcnNNYXAgZGVmaW5lZCBiZWxvdy4KKyAgICBzdHJ1Y3QgVHJhY2tlZEJ1ZmZlciB7CisgICAgICAgIHdwPElDb21wb25lbnRMaXN0ZW5lcj4gbGlzdGVuZXI7CisgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXg7CisgICAgICAgIHNpemVfdCBidWZmZXJJbmRleDsKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyOworICAgICAgICBUcmFja2VkQnVmZmVyKGNvbnN0IHdwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlckluZGV4LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIGJ1ZmZlcikKKyAgICAgICAgICAgICAgOiBsaXN0ZW5lcihsaXN0ZW5lciksCisgICAgICAgICAgICAgICAgZnJhbWVJbmRleChmcmFtZUluZGV4KSwKKyAgICAgICAgICAgICAgICBidWZmZXJJbmRleChidWZmZXJJbmRleCksCisgICAgICAgICAgICAgICAgYnVmZmVyKGJ1ZmZlcikge30KKyAgICAgICAgVHJhY2tlZEJ1ZmZlcihjb25zdCBUcmFja2VkQnVmZmVyJikgPSBkZWZhdWx0OworICAgICAgICBib29sIG9wZXJhdG9yPChjb25zdCBUcmFja2VkQnVmZmVyJiBvdGhlcikgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlckluZGV4IDwgb3RoZXIuYnVmZmVySW5kZXg7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLy8gTWFwOiBsaXN0ZW5lciAtPiBmcmFtZUluZGV4IC0+IHNldDxUcmFja2VkQnVmZmVyPi4KKyAgICAvLyBFc3NlbnRpYWxseSwgdGhpcyBpcyB1c2VkIHRvIHN0b3JlIHRyaXBsZXMgKGxpc3RlbmVyLCBmcmFtZUluZGV4LAorICAgIC8vIGJ1ZmZlckluZGV4KSB0aGF0J3Mgc2VhcmNoYWJsZSBieSBsaXN0ZW5lciBhbmQgKGxpc3RlbmVyLCBmcmFtZUluZGV4KS4KKyAgICAvLyBIb3dldmVyLCB0aGUgdmFsdWUgb2YgdGhlIGlubmVybW9zdCBtYXAgaXMgVHJhY2tlZEJ1ZmZlciwgd2hpY2ggYWxzbworICAgIC8vIGNvbnRhaW5zIGFuIGV4dHJhIGNvcHkgb2YgbGlzdGVuZXIgYW5kIGZyYW1lSW5kZXguIFRoaXMgaXMgbmVlZGVkCisgICAgLy8gYmVjYXVzZSBvbkJ1ZmZlckRlc3Ryb3llZCgpIG5lZWRzIHRvIGtub3cgbGlzdGVuZXIgYW5kIGZyYW1lSW5kZXggdG9vLgorICAgIHR5cGVkZWYgc3RkOjptYXA8d3A8SUNvbXBvbmVudExpc3RlbmVyPiwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8VHJhY2tlZEJ1ZmZlcj4+LAorICAgICAgICAgICAgICAgICAgICAgQ29tcGFyZVdlYWtDb21wb25lbnRMaXN0ZW5lcj4gVHJhY2tlZEJ1ZmZlcnNNYXA7CisKKyAgICAvLyBTdG9yYWdlIGZvciBwZW5kaW5nICh1bnNlbnQpIGRlYXRoIG5vdGlmaWNhdGlvbnMgZm9yIG9uZSBsaXN0ZW5lci4KKyAgICAvLyBFYWNoIHBhaXIgaW4gbWVtYmVyIG5hbWVkICJpbmRpY2VzIiBhcmUgKGZyYW1lSW5kZXgsIGJ1ZmZlckluZGV4KSBmcm9tCisgICAgLy8gdGhlIChsaXN0ZW5lciwgZnJhbWVJbmRleCwgYnVmZmVySW5kZXgpIHRyaXBsZS4KKyAgICBzdHJ1Y3QgRGVhdGhOb3RpZmljYXRpb25zIHsKKworICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIHBlbmRpbmcgbm90aWZpY2F0aW9ucyBmb3IgdGhpcyBsaXN0ZW5lci4KKyAgICAgICAgLy8gY291bnQgbWF5IGJlIDAsIGluIHdoaWNoIGNhc2UgdGhlIERlYXRoTm90aWZpY2F0aW9ucyBvYmplY3Qgd2lsbAorICAgICAgICAvLyByZW1haW4gdmFsaWQgZm9yIG9ubHkgYSBzbWFsbCBwZXJpb2QgKGtOb3RpZmljYXRpb25QZXJpb2ROcworICAgICAgICAvLyBuYW5vc2Vjb25kcykuCisgICAgICAgIHNpemVfdCBjb3VudDsKKworICAgICAgICAvLyBUaGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBjYWxsYmFjayBvbiB0aGlzIGxpc3RlbmVyLiBUaGlzIGlzCisgICAgICAgIC8vIHVzZWQgdG8gZ3VhcmFudGVlIHRoYXQgY2FsbGJhY2tzIGRvIG5vdCBvY2N1ciB0b28gZnJlcXVlbnRseSwgYW5kCisgICAgICAgIC8vIGFsc28gdG8gdHJpZ2dlciBleHBpcmF0aW9uIG9mIGEgRGVhdGhOb3RpZmljYXRpb25zIG9iamVjdCB0aGF0IGhhcworICAgICAgICAvLyBjb3VudCA9IDAuCisgICAgICAgIG5zZWNzX3QgbGFzdFNlbnROczsKKworICAgICAgICAvLyBNYXA6IGZyYW1lSW5kZXggLT4gdmVjdG9yIG9mIGJ1ZmZlckluZGljZXMKKyAgICAgICAgLy8gVGhpcyBpcyBlc3NlbnRpYWxseSBhIGNvbGxlY3Rpb24gb2YgKGZyYW1kZUluZGV4LCBidWZmZXJJbmRleCkuCisgICAgICAgIHN0ZDo6bWFwPHVpbnQ2NF90LCBzdGQ6OnZlY3RvcjxzaXplX3Q+PiBpbmRpY2VzOworCisgICAgICAgIERlYXRoTm90aWZpY2F0aW9ucygpCisgICAgICAgICAgICAgIDogY291bnQoMCksCisgICAgICAgICAgICAgICAgbGFzdFNlbnROcyhzeXN0ZW1UaW1lKCkgLSBrTm90aWZpY2F0aW9uUGVyaW9kTnMpLAorICAgICAgICAgICAgICAgIGluZGljZXMoKSB7fQorICAgIH07CisKKyAgICAvLyBNdXRleCBmb3IgdGhlIG1hbmFnZW1lbnQgb2YgYWxsIGlucHV0IGJ1ZmZlcnMuCisgICAgc3RkOjptdXRleCBtTXV0ZXg7CisKKyAgICAvLyBUcmFja2VkIGlucHV0IGJ1ZmZlcnMuCisgICAgVHJhY2tlZEJ1ZmZlcnNNYXAgbVRyYWNrZWRCdWZmZXJzTWFwOworCisgICAgLy8gRGVhdGggbm90aWZpY2F0aW9ucyB0byBiZSBzZW50LgorICAgIC8vCisgICAgLy8gQSBEZWF0aE5vdGlmaWNhdGlvbnMgb2JqZWN0IGlzIGFzc29jaWF0ZWQgdG8gZWFjaCBsaXN0ZW5lci4gQW4gZW50cnkgaW4KKyAgICAvLyB0aGlzIG1hcCB3aWxsIGJlIHJlbW92ZWQgaWYgaXRzIGFzc29jaWF0ZWQgRGVhdGhOb3RpZmljYXRpb25zIGhhcyBjb3VudCA9CisgICAgLy8gMCBhbmQgbGFzdFNlbnROcyA8IHN5c3RlbVRpbWUoKSAtIGtOb3RpZmljYXRpb25QZXJpb2ROcy4KKyAgICBzdGQ6Om1hcDx3cDxJQ29tcG9uZW50TGlzdGVuZXI+LCBEZWF0aE5vdGlmaWNhdGlvbnM+IG1EZWF0aE5vdGlmaWNhdGlvbnM7CisKKyAgICAvLyBDb25kaXRpb24gdmFyaWFibGUgc2lnbmFsZWQgd2hlbiBhbiBlbnRyeSBpcyBhZGRlZCB0byBtRGVhdGhOb3RpZmljYXRpb25zLgorICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1PbkJ1ZmZlckRlc3Ryb3llZDsKKworICAgIC8vIE5vdGlmeSB0aGUgY2xpZW50cyBhYm91dCBidWZmZXIgZGVzdHJ1Y3Rpb25zLgorICAgIC8vIFJldHVybiBmYWxzZSBpZiBhbGwgZGVzdHJ1Y3Rpb25zIGhhdmUgYmVlbiBub3RpZmllZC4KKyAgICAvLyBSZXR1cm4gdHJ1ZSBhbmQgc2V0IHRpbWVUb1JldHJ5IHRvIHRoZSBkdXJhdGlvbiB0byB3YWl0IGZvciBiZWZvcmUKKyAgICAvLyByZXRyeWluZyBpZiBzb21lIGRlc3RydWN0aW9ucyBoYXZlIG5vdCBiZWVuIG5vdGlmaWVkLgorICAgIGJvb2wgcHJvY2Vzc05vdGlmaWNhdGlvbnMobnNlY3NfdCogdGltZVRvUmV0cnlOcyk7CisKKyAgICAvLyBNYWluIGZ1bmN0aW9uIGZvciB0aGUgaW5wdXQgYnVmZmVyIG1hbmFnZXIgdGhyZWFkLgorICAgIHZvaWQgbWFpbigpOworCisgICAgLy8gVGhlIHRocmVhZCB0aGF0IG1hbmFnZXMgbm90aWZpY2F0aW9ucy4KKyAgICAvLworICAgIC8vIE5vdGU6IFRoaXMgdmFyaWFibGUgaXMgZGVjbGFyZWQgbGFzdCBzbyBpdHMgaW5pdGlhbGl6YXRpb24gd2lsbCBoYXBwZW4KKyAgICAvLyBhZnRlciBhbGwgb3RoZXIgbWVtYmVyIHZhcmlhYmxlcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQuCisgICAgc3RkOjp0aHJlYWQgbU1haW5UaHJlYWQ7CisKKyAgICAvLyBQcml2YXRlIGNvbnN0cnVjdG9yLgorICAgIElucHV0QnVmZmVyTWFuYWdlcigpOworCisgICAgLy8gVGhlIG9ubHkgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KKyAgICBzdGF0aWMgSW5wdXRCdWZmZXJNYW5hZ2VyJiBnZXRJbnN0YW5jZSgpOworCit9OworCisvLyBDb21wb25lbnRJbnRlcmZhY2UKK0NvbXBvbmVudEludGVyZmFjZTo6Q29tcG9uZW50SW50ZXJmYWNlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+JiBpbnRmLAorICAgICAgICBjb25zdCBzcDxDb21wb25lbnRTdG9yZT4mIHN0b3JlKSA6CisgICAgQ29uZmlndXJhYmxlKG5ldyBDYWNoZWRDb25maWd1cmFibGUoc3RkOjptYWtlX3VuaXF1ZTxDb21wSW50Zj4oaW50ZikpKSwKKyAgICBtSW50ZXJmYWNlKGludGYpIHsKKyAgICBtSW5pdCA9IGluaXQoc3RvcmUuZ2V0KCkpOworfQorCitjMl9zdGF0dXNfdCBDb21wb25lbnRJbnRlcmZhY2U6OnN0YXR1cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUluaXQ7Cit9CisKKy8vIENvbXBvbmVudExpc3RlbmVyIHdyYXBwZXIKK3N0cnVjdCBDb21wb25lbnQ6Okxpc3RlbmVyIDogcHVibGljIEMyQ29tcG9uZW50OjpMaXN0ZW5lciB7CisKKyAgICBMaXN0ZW5lcihjb25zdCBzcDxDb21wb25lbnQ+JiBjb21wb25lbnQpIDoKKyAgICAgICAgbUNvbXBvbmVudChjb21wb25lbnQpLAorICAgICAgICBtTGlzdGVuZXIoY29tcG9uZW50LT5tTGlzdGVuZXIpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25FcnJvcl9uYigKKyAgICAgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IC8qIGMyY29tcG9uZW50ICovLAorICAgICAgICAgICAgdWludDMyX3QgZXJyb3JDb2RlKSBvdmVycmlkZSB7CisgICAgICAgIEFMT0dWKCJvbkVycm9yIik7CisgICAgICAgIHNwPElDb21wb25lbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgICAgICBpZiAobGlzdGVuZXIpIHsKKyAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IGxpc3RlbmVyLT5vbkVycm9yKFN0YXR1czo6T0ssIGVycm9yQ29kZSk7CisgICAgICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJvbkVycm9yIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvblRyaXBwZWRfbmIoCisgICAgICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiAvKiBjMmNvbXBvbmVudCAqLywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBjMnNldHRpbmdSZXN1bHQKKyAgICAgICAgICAgICkgb3ZlcnJpZGUgeworICAgICAgICBBTE9HVigib25UcmlwcGVkIik7CisgICAgICAgIHNwPElDb21wb25lbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgICAgICBpZiAobGlzdGVuZXIpIHsKKyAgICAgICAgICAgIGhpZGxfdmVjPFNldHRpbmdSZXN1bHQ+IHNldHRpbmdSZXN1bHRzKGMyc2V0dGluZ1Jlc3VsdC5zaXplKCkpOworICAgICAgICAgICAgc2l6ZV90IGl4ID0gMDsKKyAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4gJmMycmVzdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgYzJzZXR0aW5nUmVzdWx0KSB7CisgICAgICAgICAgICAgICAgaWYgKGMycmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvYmpjcHkoJnNldHRpbmdSZXN1bHRzW2l4KytdLCAqYzJyZXN1bHQpICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXR0aW5nUmVzdWx0cy5yZXNpemUoaXgpOworICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbGlzdGVuZXItPm9uVHJpcHBlZChzZXR0aW5nUmVzdWx0cyk7CisgICAgICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJvblRyaXBwZWQgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uV29ya0RvbmVfbmIoCisgICAgICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiAvKiBjMmNvbXBvbmVudCAqLywKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gYzJ3b3JrSXRlbXMpIG92ZXJyaWRlIHsKKyAgICAgICAgQUxPR1YoIm9uV29ya0RvbmUiKTsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGMyd29ya0l0ZW1zKSB7CisgICAgICAgICAgICBpZiAod29yaykgeworICAgICAgICAgICAgICAgIGlmICh3b3JrLT53b3JrbGV0cy5lbXB0eSgpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAhd29yay0+d29ya2xldHMuYmFjaygpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAod29yay0+d29ya2xldHMuYmFjaygpLT5vdXRwdXQuZmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRnJhbWVEYXRhOjpGTEFHX0lOQ09NUExFVEUpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgSW5wdXRCdWZmZXJNYW5hZ2VyOjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyRnJhbWVEYXRhKG1MaXN0ZW5lciwgd29yay0+aW5wdXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNwPElDb21wb25lbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgICAgICBpZiAobGlzdGVuZXIpIHsKKyAgICAgICAgICAgIFdvcmtCdW5kbGUgd29ya0J1bmRsZTsKKworICAgICAgICAgICAgc3A8Q29tcG9uZW50PiBzdHJvbmdDb21wb25lbnQgPSBtQ29tcG9uZW50LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChvYmpjcHkoJndvcmtCdW5kbGUsIGMyd29ya0l0ZW1zLCBzdHJvbmdDb21wb25lbnQgPworICAgICAgICAgICAgICAgICAgICAmc3Ryb25nQ29tcG9uZW50LT5tQnVmZmVyUG9vbFNlbmRlciA6IG51bGxwdHIpCisgICAgICAgICAgICAgICAgICAgICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgib25Xb3JrRG9uZSgpIHJlY2VpdmVkIGNvcnJ1cHRlZCB3b3JrIGl0ZW1zLiIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IGxpc3RlbmVyLT5vbldvcmtEb25lKHdvcmtCdW5kbGUpOworICAgICAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgib25Xb3JrRG9uZSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeWllbGRCdWZmZXJRdWV1ZUJsb2NrcyhjMndvcmtJdGVtcywgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB3cDxDb21wb25lbnQ+IG1Db21wb25lbnQ7CisgICAgd3A8SUNvbXBvbmVudExpc3RlbmVyPiBtTGlzdGVuZXI7Cit9OworCisvLyBDb21wb25lbnQKK0NvbXBvbmVudDo6Q29tcG9uZW50KAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBjb25zdCBzcDxDb21wb25lbnRTdG9yZT4mIHN0b3JlLAorICAgICAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6CisgICAgICAgIElDbGllbnRNYW5hZ2VyPiYgY2xpZW50UG9vbE1hbmFnZXIpIDoKKyAgICBDb25maWd1cmFibGUobmV3IENhY2hlZENvbmZpZ3VyYWJsZSgKKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8Q29tcEludGY+KGNvbXBvbmVudC0+aW50ZigpKSkpLAorICAgIG1Db21wb25lbnQoY29tcG9uZW50KSwKKyAgICBtSW50ZXJmYWNlKGNvbXBvbmVudC0+aW50ZigpKSwKKyAgICBtTGlzdGVuZXIobGlzdGVuZXIpLAorICAgIG1TdG9yZShzdG9yZSksCisgICAgbUJ1ZmZlclBvb2xTZW5kZXIoY2xpZW50UG9vbE1hbmFnZXIpIHsKKyAgICAvLyBSZXRyaWV2ZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBmcm9tIHN0b3JlCisgICAgLy8gVE9ETzogV2UgY291bGQgY2FjaGUgdGhpcyBwZXIgY29tcG9uZW50L2ludGVyZmFjZSB0eXBlCisgICAgbUluaXQgPSBpbml0KHN0b3JlLmdldCgpKTsKK30KKworYzJfc3RhdHVzX3QgQ29tcG9uZW50OjpzdGF0dXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jbml0OworfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29tcG9uZW50CitSZXR1cm48U3RhdHVzPiBDb21wb25lbnQ6OnF1ZXVlKGNvbnN0IFdvcmtCdW5kbGUmIHdvcmtCdW5kbGUpIHsKKyAgICBBTE9HVigicXVldWUgLS0gY29udmVydGluZyBpbnB1dCIpOworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gYzJ3b3JrczsKKworICAgIGlmIChvYmpjcHkoJmMyd29ya3MsIHdvcmtCdW5kbGUpICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dWKCJxdWV1ZSAtLSBjb3JydXB0ZWQiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6Q09SUlVQVEVEOworICAgIH0KKworICAgIC8vIFJlZ2lzdGVyIGlucHV0IGJ1ZmZlcnMuCisgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGMyd29ya3MpIHsKKyAgICAgICAgaWYgKHdvcmspIHsKKyAgICAgICAgICAgIElucHV0QnVmZmVyTWFuYWdlcjo6CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyRnJhbWVEYXRhKG1MaXN0ZW5lciwgd29yay0+aW5wdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoInF1ZXVlIC0tIGNhbGxpbmciKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U3RhdHVzPihtQ29tcG9uZW50LT5xdWV1ZV9uYigmYzJ3b3JrcykpOworfQorCitSZXR1cm48dm9pZD4gQ29tcG9uZW50OjpmbHVzaChmbHVzaF9jYiBfaGlkbF9jYikgeworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gYzJmbHVzaGVkV29ya3M7CisgICAgQUxPR1YoImZsdXNoIC0tIGNhbGxpbmciKTsKKyAgICBjMl9zdGF0dXNfdCBjMnJlcyA9IG1Db21wb25lbnQtPmZsdXNoX3NtKAorICAgICAgICAgICAgQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwKKyAgICAgICAgICAgICZjMmZsdXNoZWRXb3Jrcyk7CisKKyAgICAvLyBVbnJlZ2lzdGVyIGlucHV0IGJ1ZmZlcnMuCisgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGMyZmx1c2hlZFdvcmtzKSB7CisgICAgICAgIGlmICh3b3JrKSB7CisgICAgICAgICAgICBpZiAod29yay0+d29ya2xldHMuZW1wdHkoKQorICAgICAgICAgICAgICAgICAgICB8fCAhd29yay0+d29ya2xldHMuYmFjaygpCisgICAgICAgICAgICAgICAgICAgIHx8ICh3b3JrLT53b3JrbGV0cy5iYWNrKCktPm91dHB1dC5mbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19JTkNPTVBMRVRFKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgSW5wdXRCdWZmZXJNYW5hZ2VyOjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJGcmFtZURhdGEobUxpc3RlbmVyLCB3b3JrLT5pbnB1dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBXb3JrQnVuZGxlIGZsdXNoZWRXb3JrQnVuZGxlOworICAgIFN0YXR1cyByZXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KGMycmVzKTsKKyAgICBpZiAoYzJyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgQUxPR1YoImZsdXNoIC0tIGNvbnZlcnRpbmcgb3V0cHV0Iik7CisgICAgICAgIHJlcyA9IG9iamNweSgmZmx1c2hlZFdvcmtCdW5kbGUsIGMyZmx1c2hlZFdvcmtzLCAmbUJ1ZmZlclBvb2xTZW5kZXIpOworICAgIH0KKyAgICBfaGlkbF9jYihyZXMsIGZsdXNoZWRXb3JrQnVuZGxlKTsKKyAgICB5aWVsZEJ1ZmZlclF1ZXVlQmxvY2tzKGMyZmx1c2hlZFdvcmtzLCB0cnVlKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48U3RhdHVzPiBDb21wb25lbnQ6OmRyYWluKGJvb2wgd2l0aEVvcykgeworICAgIEFMT0dWKCJkcmFpbiIpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdGF0dXM+KG1Db21wb25lbnQtPmRyYWluX25iKHdpdGhFb3MgPworICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUyA6CisgICAgICAgICAgICBDMkNvbXBvbmVudDo6RFJBSU5fQ09NUE9ORU5UX05PX0VPUykpOworfQorCitSZXR1cm48U3RhdHVzPiBDb21wb25lbnQ6OnNldE91dHB1dFN1cmZhY2UoCisgICAgICAgIHVpbnQ2NF90IGJsb2NrUG9vbElkLAorICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgc3VyZmFjZSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcG9vbDsKKyAgICBHZXRDb2RlYzJCbG9ja1Bvb2woYmxvY2tQb29sSWQsIG1Db21wb25lbnQsICZwb29sKTsKKyAgICBpZiAocG9vbCAmJiBwb29sLT5nZXRBbGxvY2F0b3JJZCgpID09IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QlVGRkVSUVVFVUUpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w+IGJxUG9vbCA9CisgICAgICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w+KHBvb2wpOworICAgICAgICBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpPblJlbmRlckNhbGxiYWNrIGNiID0KKyAgICAgICAgICAgIFt0aGlzXSh1aW50NjRfdCBwcm9kdWNlciwgaW50MzJfdCBzbG90LCBpbnQ2NF90IG5zZWNzKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogYmF0Y2ggdGhpcworICAgICAgICAgICAgICAgIGhpZGxfdmVjPElDb21wb25lbnRMaXN0ZW5lcjo6UmVuZGVyZWRGcmFtZT4gcmVuZGVyZWQ7CisgICAgICAgICAgICAgICAgcmVuZGVyZWQucmVzaXplKDEpOworICAgICAgICAgICAgICAgIHJlbmRlcmVkWzBdID0geyBwcm9kdWNlciwgc2xvdCwgbnNlY3MgfTsKKyAgICAgICAgICAgICAgICAodm9pZCltTGlzdGVuZXItPm9uRnJhbWVzUmVuZGVyZWQocmVuZGVyZWQpLmlzT2soKTsKKyAgICAgICAgfTsKKyAgICAgICAgaWYgKGJxUG9vbCkgeworICAgICAgICAgICAgYnFQb29sLT5zZXRSZW5kZXJDYWxsYmFjayhjYik7CisgICAgICAgICAgICBicVBvb2wtPmNvbmZpZ3VyZVByb2R1Y2VyKHN1cmZhY2UpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Ok9LOworfQorCitSZXR1cm48U3RhdHVzPiBDb21wb25lbnQ6OmNvbm5lY3RUb09teElucHV0U3VyZmFjZSgKKyAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHByb2R1Y2VyLAorICAgICAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjoKKyAgICAgICAgSUdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UpIHsKKyAgICAvLyBUT0RPIGltcGxlbWVudAorICAgICh2b2lkKXByb2R1Y2VyOworICAgICh2b2lkKXNvdXJjZTsKKyAgICByZXR1cm4gU3RhdHVzOjpPTUlUVEVEOworfQorCitSZXR1cm48U3RhdHVzPiBDb21wb25lbnQ6OmRpc2Nvbm5lY3RGcm9tSW5wdXRTdXJmYWNlKCkgeworICAgIC8vIFRPRE8gaW1wbGVtZW50CisgICAgcmV0dXJuIFN0YXR1czo6T0s7Cit9CisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworc3RydWN0IEJsb2NrUG9vbEludGYgOiBwdWJsaWMgQ29uZmlndXJhYmxlQzJJbnRmIHsKKyAgICBCbG9ja1Bvb2xJbnRmKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIDoKKyAgICAgICAgQ29uZmlndXJhYmxlQzJJbnRmKCJDMkJsb2NrUG9vbDoiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChwb29sID8gc3RkOjp0b19zdHJpbmcocG9vbC0+Z2V0TG9jYWxJZCgpKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVsbCIpKSwKKyAgICAgICAgbVBvb2wocG9vbCkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+JiBwYXJhbXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcworICAgICAgICAgICAgKSBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKXBhcmFtczsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKWZhaWx1cmVzOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiYgaW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBwYXJhbXMKKyAgICAgICAgICAgICkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAodm9pZClpbmRpY2VzOworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgKHZvaWQpcGFyYW1zOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+KiBjb25zdCBwYXJhbXMKKyAgICAgICAgICAgICkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAodm9pZClwYXJhbXM7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiYgZmllbGRzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAodm9pZClmaWVsZHM7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtUG9vbDsKK307CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworUmV0dXJuPHZvaWQ+IENvbXBvbmVudDo6Y3JlYXRlQmxvY2tQb29sKAorICAgICAgICB1aW50MzJfdCBhbGxvY2F0b3JJZCwKKyAgICAgICAgY3JlYXRlQmxvY2tQb29sX2NiIF9oaWRsX2NiKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBibG9ja1Bvb2w7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gQ3JlYXRlQ29kZWMyQmxvY2tQb29sKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjppZF90PihhbGxvY2F0b3JJZCksCisgICAgICAgICAgICBtQ29tcG9uZW50LAorICAgICAgICAgICAgJmJsb2NrUG9vbCk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBibG9ja1Bvb2wgPSBudWxscHRyOworICAgIH0KKyAgICBpZiAoYmxvY2tQb29sKSB7CisgICAgICAgIG1CbG9ja1Bvb2xzTXV0ZXgubG9jaygpOworICAgICAgICBtQmxvY2tQb29scy5lbXBsYWNlKGJsb2NrUG9vbC0+Z2V0TG9jYWxJZCgpLCBibG9ja1Bvb2wpOworICAgICAgICBtQmxvY2tQb29sc011dGV4LnVubG9jaygpOworICAgIH0gZWxzZSBpZiAoc3RhdHVzID09IEMyX09LKSB7CisgICAgICAgIHN0YXR1cyA9IEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxTdGF0dXM+KHN0YXR1cyksCisgICAgICAgICAgICBibG9ja1Bvb2wgPyBibG9ja1Bvb2wtPmdldExvY2FsSWQoKSA6IDAsCisgICAgICAgICAgICBuZXcgQ2FjaGVkQ29uZmlndXJhYmxlKAorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCbG9ja1Bvb2xJbnRmPihibG9ja1Bvb2wpKSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPFN0YXR1cz4gQ29tcG9uZW50OjpkZXN0cm95QmxvY2tQb29sKHVpbnQ2NF90IGJsb2NrUG9vbElkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJsb2NrUG9vbHNNdXRleCk7CisgICAgcmV0dXJuIG1CbG9ja1Bvb2xzLmVyYXNlKGJsb2NrUG9vbElkKSA9PSAxID8KKyAgICAgICAgICAgIFN0YXR1czo6T0sgOiBTdGF0dXM6OkNPUlJVUFRFRDsKK30KKworUmV0dXJuPFN0YXR1cz4gQ29tcG9uZW50OjpzdGFydCgpIHsKKyAgICBBTE9HVigic3RhcnQiKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U3RhdHVzPihtQ29tcG9uZW50LT5zdGFydCgpKTsKK30KKworUmV0dXJuPFN0YXR1cz4gQ29tcG9uZW50OjpzdG9wKCkgeworICAgIEFMT0dWKCJzdG9wIik7CisgICAgSW5wdXRCdWZmZXJNYW5hZ2VyOjp1bnJlZ2lzdGVyRnJhbWVEYXRhKG1MaXN0ZW5lcik7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFN0YXR1cz4obUNvbXBvbmVudC0+c3RvcCgpKTsKK30KKworUmV0dXJuPFN0YXR1cz4gQ29tcG9uZW50OjpyZXNldCgpIHsKKyAgICBBTE9HVigicmVzZXQiKTsKKyAgICBTdGF0dXMgc3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPihtQ29tcG9uZW50LT5yZXNldCgpKTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CbG9ja1Bvb2xzTXV0ZXgpOworICAgICAgICBtQmxvY2tQb29scy5jbGVhcigpOworICAgIH0KKyAgICBJbnB1dEJ1ZmZlck1hbmFnZXI6OnVucmVnaXN0ZXJGcmFtZURhdGEobUxpc3RlbmVyKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitSZXR1cm48U3RhdHVzPiBDb21wb25lbnQ6OnJlbGVhc2UoKSB7CisgICAgQUxPR1YoInJlbGVhc2UiKTsKKyAgICBTdGF0dXMgc3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPihtQ29tcG9uZW50LT5yZWxlYXNlKCkpOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJsb2NrUG9vbHNNdXRleCk7CisgICAgICAgIG1CbG9ja1Bvb2xzLmNsZWFyKCk7CisgICAgfQorICAgIElucHV0QnVmZmVyTWFuYWdlcjo6dW5yZWdpc3RlckZyYW1lRGF0YShtTGlzdGVuZXIpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgQ29tcG9uZW50OjpzZXRMb2NhbElkKGNvbnN0IENvbXBvbmVudDo6TG9jYWxJZCYgbG9jYWxJZCkgeworICAgIG1Mb2NhbElkID0gbG9jYWxJZDsKK30KKwordm9pZCBDb21wb25lbnQ6OmluaXRMaXN0ZW5lcihjb25zdCBzcDxDb21wb25lbnQ+JiBzZWxmKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gYzJsaXN0ZW5lciA9CisgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPExpc3RlbmVyPihzZWxmKTsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBtQ29tcG9uZW50LT5zZXRMaXN0ZW5lcl92YihjMmxpc3RlbmVyLCBDMl9ET05UX0JMT0NLKTsKKyAgICBpZiAocmVzICE9IEMyX09LKSB7CisgICAgICAgIG1Jbml0ID0gcmVzOworICAgIH0KK30KKworQ29tcG9uZW50Ojp+Q29tcG9uZW50KCkgeworICAgIElucHV0QnVmZmVyTWFuYWdlcjo6dW5yZWdpc3RlckZyYW1lRGF0YShtTGlzdGVuZXIpOworICAgIG1TdG9yZS0+cmVwb3J0Q29tcG9uZW50RGVhdGgobUxvY2FsSWQpOworfQorCitDb21wb25lbnQ6OkludGVyZmFjZUtleTo6SW50ZXJmYWNlS2V5KGNvbnN0IHNwPElDb21wb25lbnQ+JiBjb21wb25lbnQpIHsKKyAgICBpc1JlbW90ZSA9IGNvbXBvbmVudC0+aXNSZW1vdGUoKTsKKyAgICBpZiAoaXNSZW1vdGUpIHsKKyAgICAgICAgcmVtb3RlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dG9CaW5kZXIoY29tcG9uZW50KTsKKyAgICB9IGVsc2UgeworICAgICAgICBsb2NhbCA9IGNvbXBvbmVudDsKKyAgICB9Cit9CisKKy8vIElucHV0QnVmZmVyTWFuYWdlciBpbXBsZW1lbnRhdGlvbgorCitjb25zdGV4cHIgbnNlY3NfdCBJbnB1dEJ1ZmZlck1hbmFnZXI6OmtOb3RpZmljYXRpb25QZXJpb2ROczsKKwordm9pZCBJbnB1dEJ1ZmZlck1hbmFnZXI6OnJlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgY29uc3QgQzJGcmFtZURhdGEmIGlucHV0KSB7CisgICAgZ2V0SW5zdGFuY2UoKS5fcmVnaXN0ZXJGcmFtZURhdGEobGlzdGVuZXIsIGlucHV0KTsKK30KKwordm9pZCBJbnB1dEJ1ZmZlck1hbmFnZXI6OnVucmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgIGNvbnN0IHdwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBjb25zdCBDMkZyYW1lRGF0YSYgaW5wdXQpIHsKKyAgICBnZXRJbnN0YW5jZSgpLl91bnJlZ2lzdGVyRnJhbWVEYXRhKGxpc3RlbmVyLCBpbnB1dCk7Cit9CisKK3ZvaWQgSW5wdXRCdWZmZXJNYW5hZ2VyOjp1bnJlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICBjb25zdCB3cDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lcikgeworICAgIGdldEluc3RhbmNlKCkuX3VucmVnaXN0ZXJGcmFtZURhdGEobGlzdGVuZXIpOworfQorCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6X3JlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgY29uc3QgQzJGcmFtZURhdGEmIGlucHV0KSB7CisgICAgdWludDY0X3QgZnJhbWVJbmRleCA9IGlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgIEFMT0dWKCJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol9yZWdpc3RlckZyYW1lRGF0YSBjYWxsZWQgIgorICAgICAgICAgICIobGlzdGVuZXIgQCAlcCwgZnJhbWVJbmRleCA9ICVsbHUpIiwKKyAgICAgICAgICBsaXN0ZW5lci5nZXQoKSwKKyAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmcgdW5zaWduZWQ+KGZyYW1lSW5kZXgpKTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworCisgICAgc3RkOjpzZXQ8VHJhY2tlZEJ1ZmZlcj4gJmJ1ZmZlcklkcyA9CisgICAgICAgICAgICBtVHJhY2tlZEJ1ZmZlcnNNYXBbbGlzdGVuZXJdW2ZyYW1lSW5kZXhdOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbnB1dC5idWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmICghaW5wdXQuYnVmZmVyc1tpXSkgeworICAgICAgICAgICAgQUxPR1YoIklucHV0QnVmZmVyTWFuYWdlcjo6X3JlZ2lzdGVyRnJhbWVEYXRhOiAiCisgICAgICAgICAgICAgICAgICAiSW5wdXQgYnVmZmVyIGF0IGluZGV4ICV6dSBpcyBudWxsIiwgaSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBUcmFja2VkQnVmZmVyICZidWZmZXJJZCA9CisgICAgICAgICAgICAgICAgKmJ1ZmZlcklkcy5lbXBsYWNlKGxpc3RlbmVyLCBmcmFtZUluZGV4LCBpLCBpbnB1dC5idWZmZXJzW2ldKS4KKyAgICAgICAgICAgICAgICBmaXJzdDsKKworICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBpbnB1dC5idWZmZXJzW2ldLT5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSgKKyAgICAgICAgICAgICAgICBvbkJ1ZmZlckRlc3Ryb3llZCwKKyAgICAgICAgICAgICAgICBjb25zdF9jYXN0PHZvaWQqPihyZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPigmYnVmZmVySWQpKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dEKCJJbnB1dEJ1ZmZlck1hbmFnZXI6IHJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5IGZhaWxlZCAiCisgICAgICAgICAgICAgICAgICAiKGxpc3RlbmVyIEAgJXAsIGZyYW1lSW5kZXggPSAlbGx1LCBidWZmZXJJbmRleCA9ICV6dSkgIgorICAgICAgICAgICAgICAgICAgIj0+ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuZ2V0KCksCisgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGxvbmc+KGZyYW1lSW5kZXgpLAorICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKHN0YXR1cyksIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtRGVhdGhOb3RpZmljYXRpb25zLmVtcGxhY2UobGlzdGVuZXIsIERlYXRoTm90aWZpY2F0aW9ucygpKTsKK30KKworLy8gUmVtb3ZlIGEgcGFpciAobGlzdGVuZXIsIGZyYW1lSW5kZXgpIGZyb20gbVRyYWNrZWRCdWZmZXJzTWFwIGFuZAorLy8gbURlYXRoTm90aWZpY2F0aW9ucy4gVGhpcyBpbXBsaWVzIGFsbCBidWZmZXJJbmRpY2VzIGFyZSByZW1vdmVkLgorLy8KKy8vIFRoaXMgaXMgY2FsbGVkIGZyb20gb25Xb3JrRG9uZSgpIGFuZCBmbHVzaCgpLgordm9pZCBJbnB1dEJ1ZmZlck1hbmFnZXI6Ol91bnJlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICBjb25zdCB3cDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgY29uc3QgQzJGcmFtZURhdGEmIGlucHV0KSB7CisgICAgdWludDY0X3QgZnJhbWVJbmRleCA9IGlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgIEFMT0dWKCJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol91bnJlZ2lzdGVyRnJhbWVEYXRhIGNhbGxlZCAiCisgICAgICAgICAgIihsaXN0ZW5lciBAICVwLCBmcmFtZUluZGV4ID0gJWxsdSkiLAorICAgICAgICAgIGxpc3RlbmVyLnVuc2FmZV9nZXQoKSwKKyAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmcgdW5zaWduZWQ+KGZyYW1lSW5kZXgpKTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworCisgICAgYXV0byBmaW5kTGlzdGVuZXIgPSBtVHJhY2tlZEJ1ZmZlcnNNYXAuZmluZChsaXN0ZW5lcik7CisgICAgaWYgKGZpbmRMaXN0ZW5lciAhPSBtVHJhY2tlZEJ1ZmZlcnNNYXAuZW5kKCkpIHsKKyAgICAgICAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6c2V0PFRyYWNrZWRCdWZmZXI+PiAmZnJhbWVJbmRleDJCdWZmZXJJZHMKKyAgICAgICAgICAgICAgICA9IGZpbmRMaXN0ZW5lci0+c2Vjb25kOworICAgICAgICBhdXRvIGZpbmRGcmFtZUluZGV4ID0gZnJhbWVJbmRleDJCdWZmZXJJZHMuZmluZChmcmFtZUluZGV4KTsKKyAgICAgICAgaWYgKGZpbmRGcmFtZUluZGV4ICE9IGZyYW1lSW5kZXgyQnVmZmVySWRzLmVuZCgpKSB7CisgICAgICAgICAgICBzdGQ6OnNldDxUcmFja2VkQnVmZmVyPiAmYnVmZmVySWRzID0gZmluZEZyYW1lSW5kZXgtPnNlY29uZDsKKyAgICAgICAgICAgIGZvciAoY29uc3QgVHJhY2tlZEJ1ZmZlciYgYnVmZmVySWQgOiBidWZmZXJJZHMpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IGJ1ZmZlcklkLmJ1ZmZlci5sb2NrKCk7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBidWZmZXItPnVucmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25CdWZmZXJEZXN0cm95ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDx2b2lkKj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4oJmJ1ZmZlcklkKSkpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiSW5wdXRCdWZmZXJNYW5hZ2VyOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSBmYWlsZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihsaXN0ZW5lciBAICVwLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJhbWVJbmRleCA9ICVsbHUsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidWZmZXJJbmRleCA9ICV6dSkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj0+ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVySWQubGlzdGVuZXIudW5zYWZlX2dldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJJZC5mcmFtZUluZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcklkLmJ1ZmZlckluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcoc3RhdHVzKSwgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZnJhbWVJbmRleDJCdWZmZXJJZHMuZXJhc2UoZmluZEZyYW1lSW5kZXgpOworICAgICAgICAgICAgaWYgKGZyYW1lSW5kZXgyQnVmZmVySWRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBtVHJhY2tlZEJ1ZmZlcnNNYXAuZXJhc2UoZmluZExpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGF1dG8gZmluZExpc3RlbmVyRCA9IG1EZWF0aE5vdGlmaWNhdGlvbnMuZmluZChsaXN0ZW5lcik7CisgICAgaWYgKGZpbmRMaXN0ZW5lckQgIT0gbURlYXRoTm90aWZpY2F0aW9ucy5lbmQoKSkgeworICAgICAgICBEZWF0aE5vdGlmaWNhdGlvbnMgJmRlYXRoTm90aWZpY2F0aW9ucyA9IGZpbmRMaXN0ZW5lckQtPnNlY29uZDsKKyAgICAgICAgYXV0byBmaW5kRnJhbWVJbmRleCA9IGRlYXRoTm90aWZpY2F0aW9ucy5pbmRpY2VzLmZpbmQoZnJhbWVJbmRleCk7CisgICAgICAgIGlmIChmaW5kRnJhbWVJbmRleCAhPSBkZWF0aE5vdGlmaWNhdGlvbnMuaW5kaWNlcy5lbmQoKSkgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiAmYnVmZmVySW5kaWNlcyA9IGZpbmRGcmFtZUluZGV4LT5zZWNvbmQ7CisgICAgICAgICAgICBkZWF0aE5vdGlmaWNhdGlvbnMuY291bnQgLT0gYnVmZmVySW5kaWNlcy5zaXplKCk7CisgICAgICAgICAgICBkZWF0aE5vdGlmaWNhdGlvbnMuaW5kaWNlcy5lcmFzZShmaW5kRnJhbWVJbmRleCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIFJlbW92ZSBsaXN0ZW5lciBmcm9tIG1UcmFja2VkQnVmZmVyc01hcCBhbmQgbURlYXRoTm90aWZpY2F0aW9ucy4gVGhpcyBpbXBsaWVzCisvLyBhbGwgZnJhbWVJbmRpY2VzIGFuZCBidWZmZXJJbmRpY2VzIGFyZSByZW1vdmVkLgorLy8KKy8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGNvbXBvbmVudCBjbGVhbnMgdXAgYWxsIGlucHV0IGJ1ZmZlcnMsIGkuZS4sIHdoZW4KKy8vIHJlc2V0KCksIHJlbGVhc2UoKSwgc3RvcCgpIG9yIH5Db21wb25lbnQoKSBpcyBjYWxsZWQuCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6X3VucmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgIGNvbnN0IHdwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CisgICAgQUxPR1YoIklucHV0QnVmZmVyTWFuYWdlcjo6X3VucmVnaXN0ZXJGcmFtZURhdGEgY2FsbGVkIChsaXN0ZW5lciBAICVwKSIsCisgICAgICAgICAgICBsaXN0ZW5lci51bnNhZmVfZ2V0KCkpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisKKyAgICBhdXRvIGZpbmRMaXN0ZW5lciA9IG1UcmFja2VkQnVmZmVyc01hcC5maW5kKGxpc3RlbmVyKTsKKyAgICBpZiAoZmluZExpc3RlbmVyICE9IG1UcmFja2VkQnVmZmVyc01hcC5lbmQoKSkgeworICAgICAgICBzdGQ6Om1hcDx1aW50NjRfdCwgc3RkOjpzZXQ8VHJhY2tlZEJ1ZmZlcj4+ICZmcmFtZUluZGV4MkJ1ZmZlcklkcyA9CisgICAgICAgICAgICAgICAgZmluZExpc3RlbmVyLT5zZWNvbmQ7CisgICAgICAgIGZvciAoYXV0byBmaW5kRnJhbWVJbmRleCA9IGZyYW1lSW5kZXgyQnVmZmVySWRzLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgZmluZEZyYW1lSW5kZXggIT0gZnJhbWVJbmRleDJCdWZmZXJJZHMuZW5kKCk7CisgICAgICAgICAgICAgICAgKytmaW5kRnJhbWVJbmRleCkgeworICAgICAgICAgICAgc3RkOjpzZXQ8VHJhY2tlZEJ1ZmZlcj4gJmJ1ZmZlcklkcyA9IGZpbmRGcmFtZUluZGV4LT5zZWNvbmQ7CisgICAgICAgICAgICBmb3IgKGNvbnN0IFRyYWNrZWRCdWZmZXImIGJ1ZmZlcklkIDogYnVmZmVySWRzKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBidWZmZXJJZC5idWZmZXIubG9jaygpOworICAgICAgICAgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gYnVmZmVyLT51bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQnVmZmVyRGVzdHJveWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dm9pZCo+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KCZidWZmZXJJZCkpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIklucHV0QnVmZmVyTWFuYWdlcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVucmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkgZmFpbGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIobGlzdGVuZXIgQCAlcCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZyYW1lSW5kZXggPSAlbGx1LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVySW5kZXggPSAlenUpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI9PiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcklkLmxpc3RlbmVyLnVuc2FmZV9nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZz4oYnVmZmVySWQuZnJhbWVJbmRleCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJJZC5idWZmZXJJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKHN0YXR1cyksIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVRyYWNrZWRCdWZmZXJzTWFwLmVyYXNlKGZpbmRMaXN0ZW5lcik7CisgICAgfQorCisgICAgbURlYXRoTm90aWZpY2F0aW9ucy5lcmFzZShsaXN0ZW5lcik7Cit9CisKKy8vIE1vdmUgYSBidWZmZXIgZnJvbSBtVHJhY2tlZEJ1ZmZlcnNNYXAgdG8gbURlYXRoTm90aWZpY2F0aW9ucy4KKy8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSByZWdpc3RlcmVkIEMyQnVmZmVyIG9iamVjdCBpcyBkZXN0cm95ZWQuCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6b25CdWZmZXJEZXN0cm95ZWQoY29uc3QgQzJCdWZmZXIqIGJ1Ziwgdm9pZCogYXJnKSB7CisgICAgZ2V0SW5zdGFuY2UoKS5fb25CdWZmZXJEZXN0cm95ZWQoYnVmLCBhcmcpOworfQorCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6X29uQnVmZmVyRGVzdHJveWVkKGNvbnN0IEMyQnVmZmVyKiBidWYsIHZvaWQqIGFyZykgeworICAgIGlmICghYnVmIHx8ICFhcmcpIHsKKyAgICAgICAgQUxPR1coIklucHV0QnVmZmVyTWFuYWdlcjo6X29uQnVmZmVyRGVzdHJveWVkIGNhbGxlZCAiCisgICAgICAgICAgICAgICJ3aXRoIG51bGwgYXJndW1lbnQocykgKGJ1ZiBAICVwLCBhcmcgQCAlcCkiLAorICAgICAgICAgICAgICBidWYsIGFyZyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgVHJhY2tlZEJ1ZmZlciBpZCgqcmVpbnRlcnByZXRfY2FzdDxUcmFja2VkQnVmZmVyKj4oYXJnKSk7CisgICAgQUxPR1YoIklucHV0QnVmZmVyTWFuYWdlcjo6X29uQnVmZmVyRGVzdHJveWVkIGNhbGxlZCAiCisgICAgICAgICAgIihsaXN0ZW5lciBAICVwLCBmcmFtZUluZGV4ID0gJWxsdSwgYnVmZmVySW5kZXggPSAlenUpIiwKKyAgICAgICAgICBpZC5saXN0ZW5lci51bnNhZmVfZ2V0KCksCisgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPihpZC5mcmFtZUluZGV4KSwKKyAgICAgICAgICBpZC5idWZmZXJJbmRleCk7CisKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworCisgICAgYXV0byBmaW5kTGlzdGVuZXIgPSBtVHJhY2tlZEJ1ZmZlcnNNYXAuZmluZChpZC5saXN0ZW5lcik7CisgICAgaWYgKGZpbmRMaXN0ZW5lciA9PSBtVHJhY2tlZEJ1ZmZlcnNNYXAuZW5kKCkpIHsKKyAgICAgICAgQUxPR0QoIklucHV0QnVmZmVyTWFuYWdlcjo6X29uQnVmZmVyRGVzdHJveWVkIHJlY2VpdmVkICIKKyAgICAgICAgICAgICAgImludmFsaWQgbGlzdGVuZXIgIgorICAgICAgICAgICAgICAiKGxpc3RlbmVyIEAgJXAsIGZyYW1lSW5kZXggPSAlbGx1LCBidWZmZXJJbmRleCA9ICV6dSkiLAorICAgICAgICAgICAgICBpZC5saXN0ZW5lci51bnNhZmVfZ2V0KCksCisgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZz4oaWQuZnJhbWVJbmRleCksCisgICAgICAgICAgICAgIGlkLmJ1ZmZlckluZGV4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6bWFwPHVpbnQ2NF90LCBzdGQ6OnNldDxUcmFja2VkQnVmZmVyPj4gJmZyYW1lSW5kZXgyQnVmZmVySWRzCisgICAgICAgICAgICA9IGZpbmRMaXN0ZW5lci0+c2Vjb25kOworICAgIGF1dG8gZmluZEZyYW1lSW5kZXggPSBmcmFtZUluZGV4MkJ1ZmZlcklkcy5maW5kKGlkLmZyYW1lSW5kZXgpOworICAgIGlmIChmaW5kRnJhbWVJbmRleCA9PSBmcmFtZUluZGV4MkJ1ZmZlcklkcy5lbmQoKSkgeworICAgICAgICBBTE9HRCgiSW5wdXRCdWZmZXJNYW5hZ2VyOjpfb25CdWZmZXJEZXN0cm95ZWQgcmVjZWl2ZWQgIgorICAgICAgICAgICAgICAiaW52YWxpZCBmcmFtZSBpbmRleCAiCisgICAgICAgICAgICAgICIobGlzdGVuZXIgQCAlcCwgZnJhbWVJbmRleCA9ICVsbHUsIGJ1ZmZlckluZGV4ID0gJXp1KSIsCisgICAgICAgICAgICAgIGlkLmxpc3RlbmVyLnVuc2FmZV9nZXQoKSwKKyAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPihpZC5mcmFtZUluZGV4KSwKKyAgICAgICAgICAgICAgaWQuYnVmZmVySW5kZXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RkOjpzZXQ8VHJhY2tlZEJ1ZmZlcj4gJmJ1ZmZlcklkcyA9IGZpbmRGcmFtZUluZGV4LT5zZWNvbmQ7CisgICAgYXV0byBmaW5kQnVmZmVySWQgPSBidWZmZXJJZHMuZmluZChpZCk7CisgICAgaWYgKGZpbmRCdWZmZXJJZCA9PSBidWZmZXJJZHMuZW5kKCkpIHsKKyAgICAgICAgQUxPR0QoIklucHV0QnVmZmVyTWFuYWdlcjo6X29uQnVmZmVyRGVzdHJveWVkIHJlY2VpdmVkICIKKyAgICAgICAgICAgICAgImludmFsaWQgYnVmZmVyIGluZGV4OiAiCisgICAgICAgICAgICAgICIobGlzdGVuZXIgQCAlcCwgZnJhbWVJbmRleCA9ICVsbHUsIGJ1ZmZlckluZGV4ID0gJXp1KSIsCisgICAgICAgICAgICAgIGlkLmxpc3RlbmVyLnVuc2FmZV9nZXQoKSwKKyAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPihpZC5mcmFtZUluZGV4KSwKKyAgICAgICAgICAgICAgaWQuYnVmZmVySW5kZXgpOworICAgIH0KKworICAgIGJ1ZmZlcklkcy5lcmFzZShmaW5kQnVmZmVySWQpOworICAgIGlmIChidWZmZXJJZHMuZW1wdHkoKSkgeworICAgICAgICBmcmFtZUluZGV4MkJ1ZmZlcklkcy5lcmFzZShmaW5kRnJhbWVJbmRleCk7CisgICAgICAgIGlmIChmcmFtZUluZGV4MkJ1ZmZlcklkcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBtVHJhY2tlZEJ1ZmZlcnNNYXAuZXJhc2UoZmluZExpc3RlbmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIERlYXRoTm90aWZpY2F0aW9ucyAmZGVhdGhOb3RpZmljYXRpb25zID0gbURlYXRoTm90aWZpY2F0aW9uc1tpZC5saXN0ZW5lcl07CisgICAgZGVhdGhOb3RpZmljYXRpb25zLmluZGljZXNbaWQuZnJhbWVJbmRleF0uZW1wbGFjZV9iYWNrKGlkLmJ1ZmZlckluZGV4KTsKKyAgICArK2RlYXRoTm90aWZpY2F0aW9ucy5jb3VudDsKKyAgICBtT25CdWZmZXJEZXN0cm95ZWQubm90aWZ5X29uZSgpOworfQorCisvLyBOb3RpZnkgdGhlIGNsaWVudHMgYWJvdXQgYnVmZmVyIGRlc3RydWN0aW9ucy4KKy8vIFJldHVybiBmYWxzZSBpZiBhbGwgZGVzdHJ1Y3Rpb25zIGhhdmUgYmVlbiBub3RpZmllZC4KKy8vIFJldHVybiB0cnVlIGFuZCBzZXQgdGltZVRvUmV0cnkgdG8gdGhlIHRpbWUgcG9pbnQgdG8gd2FpdCBmb3IgYmVmb3JlCisvLyByZXRyeWluZyBpZiBzb21lIGRlc3RydWN0aW9ucyBoYXZlIG5vdCBiZWVuIG5vdGlmaWVkLgorYm9vbCBJbnB1dEJ1ZmZlck1hbmFnZXI6OnByb2Nlc3NOb3RpZmljYXRpb25zKG5zZWNzX3QqIHRpbWVUb1JldHJ5TnMpIHsKKworICAgIHN0cnVjdCBOb3RpZmljYXRpb24geworICAgICAgICBzcDxJQ29tcG9uZW50TGlzdGVuZXI+IGxpc3RlbmVyOworICAgICAgICBoaWRsX3ZlYzxJQ29tcG9uZW50TGlzdGVuZXI6OlJlbmRlcmVkRnJhbWU+IHJlbmRlcmVkRnJhbWVzOworICAgICAgICBOb3RpZmljYXRpb24oY29uc3Qgc3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbCwgc2l6ZV90IHMpCisgICAgICAgICAgICAgIDogbGlzdGVuZXIobCksIHJlbmRlcmVkRnJhbWVzKHMpIHt9CisgICAgfTsKKyAgICBzdGQ6Omxpc3Q8Tm90aWZpY2F0aW9uPiBub3RpZmljYXRpb25zOworCisgICAgYm9vbCByZXRyeSA9IGZhbHNlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgKnRpbWVUb1JldHJ5TnMgPSBrTm90aWZpY2F0aW9uUGVyaW9kTnM7CisgICAgICAgIG5zZWNzX3QgdGltZU5vd05zID0gc3lzdGVtVGltZSgpOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtRGVhdGhOb3RpZmljYXRpb25zLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gbURlYXRoTm90aWZpY2F0aW9ucy5lbmQoKTsgKSB7CisgICAgICAgICAgICBzcDxJQ29tcG9uZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gaXQtPmZpcnN0LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmICghbGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRGVhdGhOb3RpZmljYXRpb25zICZkZWF0aE5vdGlmaWNhdGlvbnMgPSBpdC0+c2Vjb25kOworCisgICAgICAgICAgICBuc2Vjc190IHRpbWVTaW5jZUxhc3ROb3RpZmllZE5zID0KKyAgICAgICAgICAgICAgICAgICAgdGltZU5vd05zIC0gZGVhdGhOb3RpZmljYXRpb25zLmxhc3RTZW50TnM7CisgICAgICAgICAgICAvLyBJZiBub3QgZW5vdWdoIHRpbWUgaGFzIHBhc3NlZCBzaW5jZSB0aGUgbGFzdCBjYWxsYmFjaywgbGVhdmUgdGhlCisgICAgICAgICAgICAvLyBub3RpZmljYXRpb25zIGZvciB0aGlzIGxpc3RlbmVyIHVudG91Y2hlZCBmb3Igbm93IGFuZCByZXRyeQorICAgICAgICAgICAgLy8gbGF0ZXIuCisgICAgICAgICAgICBpZiAodGltZVNpbmNlTGFzdE5vdGlmaWVkTnMgPCBrTm90aWZpY2F0aW9uUGVyaW9kTnMpIHsKKyAgICAgICAgICAgICAgICByZXRyeSA9IHRydWU7CisgICAgICAgICAgICAgICAgKnRpbWVUb1JldHJ5TnMgPSBzdGQ6Om1pbigqdGltZVRvUmV0cnlOcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGtOb3RpZmljYXRpb25QZXJpb2ROcyAtIHRpbWVTaW5jZUxhc3ROb3RpZmllZE5zKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiSW5wdXRCdWZmZXJNYW5hZ2VyOiBOb3RpZmljYXRpb25zIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgImxpc3RlbmVyIEAgJXAgd2lsbCBiZSBwb3N0cG9uZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5nZXQoKSk7CisgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgZW5vdWdoIHRpbWUgaGFzIHBhc3NlZCBzaW5jZSB0aGUgbGFzdCBub3RpZmljYXRpb24gdG8gdGhpcworICAgICAgICAgICAgLy8gbGlzdGVuZXIgYnV0IHRoZXJlIGFyZSBjdXJyZW50bHkgbm8gcGVuZGluZyBub3RpZmljYXRpb25zLCB0aGUKKyAgICAgICAgICAgIC8vIGxpc3RlbmVyIGNhbiBiZSByZW1vdmVkIGZyb20gbURlYXRoTm90aWZpY2F0aW9ucy0tLXRoZXJlIGlzIG5vCisgICAgICAgICAgICAvLyBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3Qgbm90aWZpY2F0aW9uIHRpbWUgYW55bW9yZS4KKyAgICAgICAgICAgIGlmIChkZWF0aE5vdGlmaWNhdGlvbnMuY291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIGl0ID0gbURlYXRoTm90aWZpY2F0aW9ucy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgYXJndW1lbnQgZm9yIHRoZSBjYWxsYmFjay4KKyAgICAgICAgICAgIG5vdGlmaWNhdGlvbnMuZW1wbGFjZV9iYWNrKGxpc3RlbmVyLCBkZWF0aE5vdGlmaWNhdGlvbnMuY291bnQpOworICAgICAgICAgICAgaGlkbF92ZWM8SUNvbXBvbmVudExpc3RlbmVyOjpSZW5kZXJlZEZyYW1lPiYgcmVuZGVyZWRGcmFtZXMgPQorICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25zLmJhY2soKS5yZW5kZXJlZEZyYW1lczsKKyAgICAgICAgICAgIHNpemVfdCBpID0gMDsKKyAgICAgICAgICAgIGZvciAoc3RkOjpwYWlyPGNvbnN0IHVpbnQ2NF90LCBzdGQ6OnZlY3RvcjxzaXplX3Q+PiYgcCA6CisgICAgICAgICAgICAgICAgICAgIGRlYXRoTm90aWZpY2F0aW9ucy5pbmRpY2VzKSB7CisgICAgICAgICAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCA9IHAuZmlyc3Q7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiAmYnVmZmVySW5kaWNlcyA9IHAuc2Vjb25kOworICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc2l6ZV90JiBidWZmZXJJbmRleCA6IGJ1ZmZlckluZGljZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgSUNvbXBvbmVudExpc3RlbmVyOjpSZW5kZXJlZEZyYW1lICZyZW5kZXJlZEZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSByZW5kZXJlZEZyYW1lc1tpKytdOworICAgICAgICAgICAgICAgICAgICByZW5kZXJlZEZyYW1lLnNsb3RJZCA9IH5idWZmZXJJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWRGcmFtZS5idWZmZXJRdWV1ZUlkID0gZnJhbWVJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWRGcmFtZS50aW1lc3RhbXBOcyA9IHRpbWVOb3dOczsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIklucHV0QnVmZmVyTWFuYWdlcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VuZGluZyBkZWF0aCBub3RpZmljYXRpb24gKGxpc3RlbmVyIEAgJXAsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZyYW1lSW5kZXggPSAlbGx1LCBidWZmZXJJbmRleCA9ICV6dSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZyBsb25nIHVuc2lnbmVkPihmcmFtZUluZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVySW5kZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2xlYXIgZGVhdGhOb3RpZmljYXRpb25zIGZvciB0aGlzIGxpc3RlbmVyIGFuZCBzZXQgcmV0cnkgdG8gdHJ1ZQorICAgICAgICAgICAgLy8gc28gcHJvY2Vzc05vdGlmaWNhdGlvbnMgd2lsbCBiZSBjYWxsZWQgYWdhaW4uIFRoaXMgd2lsbAorICAgICAgICAgICAgLy8gZ3VhcmFudGVlIHRoYXQgYSBsaXN0ZW5lciB3aXRoIG5vIHBlbmRpbmcgbm90aWZpY2F0aW9ucyB3aWxsCisgICAgICAgICAgICAvLyBldmVudHVhbGx5IGJlIHJlbW92ZWQgZnJvbSBtRGVhdGhOb3RpZmljYXRpb25zIGFmdGVyCisgICAgICAgICAgICAvLyBrTm90aWZpY2F0aW9uUGVyaW9kTnMgbmFub3NlY29uZHMgaGFzIHBhc3NlZC4KKyAgICAgICAgICAgIHJldHJ5ID0gdHJ1ZTsKKyAgICAgICAgICAgIGRlYXRoTm90aWZpY2F0aW9ucy5pbmRpY2VzLmNsZWFyKCk7CisgICAgICAgICAgICBkZWF0aE5vdGlmaWNhdGlvbnMuY291bnQgPSAwOworICAgICAgICAgICAgZGVhdGhOb3RpZmljYXRpb25zLmxhc3RTZW50TnMgPSB0aW1lTm93TnM7CisgICAgICAgICAgICArK2l0OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2FsbCBvbkZyYW1lc1JlbmRlcmVkIG91dHNpZGUgdGhlIGxvY2sgdG8gYXZvaWQgZGVhZGxvY2suCisgICAgZm9yIChjb25zdCBOb3RpZmljYXRpb24mIG5vdGlmaWNhdGlvbiA6IG5vdGlmaWNhdGlvbnMpIHsKKyAgICAgICAgaWYgKCFub3RpZmljYXRpb24ubGlzdGVuZXItPm9uRnJhbWVzUmVuZGVyZWQoCisgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLnJlbmRlcmVkRnJhbWVzKS5pc09rKCkpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgbWF5IHRyaWdnZXIgaWYgdGhlIGNsaWVudCBoYXMgZGllZC4KKyAgICAgICAgICAgIEFMT0dEKCJJbnB1dEJ1ZmZlck1hbmFnZXI6IG9uRnJhbWVzUmVuZGVyZWQgdHJhbnNhY3Rpb24gZmFpbGVkICIKKyAgICAgICAgICAgICAgICAgICIobGlzdGVuZXIgQCAlcCkiLAorICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLmxpc3RlbmVyLmdldCgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocmV0cnkpIHsKKyAgICAgICAgQUxPR1YoIklucHV0QnVmZmVyTWFuYWdlcjogUGVuZGluZyBkZWF0aCBub3RpZmljYXRpb25zIgorICAgICAgICAgICAgICAid2lsbCBiZSBzZW50IGluICVsbGRucy4iLAorICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KCp0aW1lVG9SZXRyeU5zKSk7CisgICAgfQorICAgIHJldHVybiByZXRyeTsKK30KKwordm9pZCBJbnB1dEJ1ZmZlck1hbmFnZXI6Om1haW4oKSB7CisgICAgQUxPR1YoIklucHV0QnVmZmVyTWFuYWdlcjogU3RhcnRpbmcgbWFpbiB0aHJlYWQiKTsKKyAgICBuc2Vjc190IHRpbWVUb1JldHJ5TnM7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIHdoaWxlIChtRGVhdGhOb3RpZmljYXRpb25zLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJJbnB1dEJ1ZmZlck1hbmFnZXI6IFdhaXRpbmcgZm9yIGJ1ZmZlciBkZWF0aHMiKTsKKyAgICAgICAgICAgIG1PbkJ1ZmZlckRlc3Ryb3llZC53YWl0KGxvY2spOworICAgICAgICB9CisgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgIEFMT0dWKCJJbnB1dEJ1ZmZlck1hbmFnZXI6IFNlbmRpbmcgYnVmZmVyIGRlYXRoIG5vdGlmaWNhdGlvbnMiKTsKKyAgICAgICAgd2hpbGUgKHByb2Nlc3NOb3RpZmljYXRpb25zKCZ0aW1lVG9SZXRyeU5zKSkgeworICAgICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6bmFub3NlY29uZHModGltZVRvUmV0cnlOcykpOworICAgICAgICAgICAgQUxPR1YoIklucHV0QnVmZmVyTWFuYWdlcjogU2VuZGluZyBwZW5kaW5nIGRlYXRoIG5vdGlmaWNhdGlvbnMiKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiSW5wdXRCdWZmZXJNYW5hZ2VyOiBObyBwZW5kaW5nIGRlYXRoIG5vdGlmaWNhdGlvbnMiKTsKKyAgICB9Cit9CisKK0lucHV0QnVmZmVyTWFuYWdlcjo6SW5wdXRCdWZmZXJNYW5hZ2VyKCkKKyAgICAgIDogbU1haW5UaHJlYWQoJklucHV0QnVmZmVyTWFuYWdlcjo6bWFpbiwgdGhpcykgeworfQorCitJbnB1dEJ1ZmZlck1hbmFnZXImIElucHV0QnVmZmVyTWFuYWdlcjo6Z2V0SW5zdGFuY2UoKSB7CisgICAgc3RhdGljIElucHV0QnVmZmVyTWFuYWdlciBpbnN0YW5jZXt9OworICAgIHJldHVybiBpbnN0YW5jZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbXBvbmVudFN0b3JlLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnRTdG9yZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMwNTAxNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnRTdG9yZS5jcHAKQEAgLTAsMCArMSw0MzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMi1Db21wb25lbnRTdG9yZSIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvSW5wdXRTdXJmYWNlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudC5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db25maWd1cmFibGVDMkludGYuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKworI2lmZGVmIExPRworI3VuZGVmIExPRworI2VuZGlmCisKKyNpZmRlZiBQTE9HCisjdW5kZWYgUExPRworI2VuZGlmCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaW5jbHVkZSA8b3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OkdyYXBoaWNCdWZmZXJTb3VyY2U7Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOworCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKK3N0cnVjdCBTdG9yZUludGYgOiBwdWJsaWMgQ29uZmlndXJhYmxlQzJJbnRmIHsKKyAgICBTdG9yZUludGYoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+JiBzdG9yZSkgOgorICAgICAgICBDb25maWd1cmFibGVDMkludGYoc3RvcmUgPyBzdG9yZS0+Z2V0TmFtZSgpIDogIiIpLAorICAgICAgICBtU3RvcmUoc3RvcmUpIHsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBjb25maWcoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gKmNvbnN0IGZhaWx1cmVzCisgICAgICAgICAgICApIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gQXNzdW1lIGFsbCBwYXJhbXMgYXJlIGJsb2NraW5nCisgICAgICAgIC8vIFRPRE86IEZpbHRlciBmb3Igc3VwcG9ydGVkIHBhcmFtcworICAgICAgICBpZiAobWF5QmxvY2sgPT0gQzJfRE9OVF9CTE9DSyAmJiBwYXJhbXMuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9CTE9DS0lORzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVN0b3JlLT5jb25maWdfc20ocGFyYW1zLCBmYWlsdXJlcyk7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgcXVlcnkoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uc3QgcGFyYW1zKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIC8vIEFzc3VtZSBhbGwgcGFyYW1zIGFyZSBibG9ja2luZworICAgICAgICAvLyBUT0RPOiBGaWx0ZXIgZm9yIHN1cHBvcnRlZCBwYXJhbXMKKyAgICAgICAgaWYgKG1heUJsb2NrID09IEMyX0RPTlRfQkxPQ0sgJiYgaW5kaWNlcy5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JMT0NLSU5HOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtU3RvcmUtPnF1ZXJ5X3NtKHt9LCBpbmRpY2VzLCBwYXJhbXMpOworICAgIH0KKworICAgIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKmNvbnN0IHBhcmFtcworICAgICAgICAgICAgKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtU3RvcmUtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKHBhcmFtcyk7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIC8vIEFzc3VtZSBhbGwgcGFyYW1zIGFyZSBibG9ja2luZworICAgICAgICAvLyBUT0RPOiBGaWx0ZXIgZm9yIHN1cHBvcnRlZCBwYXJhbXMKKyAgICAgICAgaWYgKG1heUJsb2NrID09IEMyX0RPTlRfQkxPQ0sgJiYgZmllbGRzLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkxPQ0tJTkc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1TdG9yZS0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXNfc20oZmllbGRzKTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gbVN0b3JlOworfTsKKworfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCitDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50U3RvcmUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+JiBzdG9yZSkgOgorICAgIENvbmZpZ3VyYWJsZShuZXcgQ2FjaGVkQ29uZmlndXJhYmxlKHN0ZDo6bWFrZV91bmlxdWU8U3RvcmVJbnRmPihzdG9yZSkpKSwKKyAgICBtU3RvcmUoc3RvcmUpIHsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBwbGF0Zm9ybVN0b3JlID0gYW5kcm9pZDo6R2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpOworICAgIFNldFByZWZlcnJlZENvZGVjMkNvbXBvbmVudFN0b3JlKHN0b3JlKTsKKworICAgIC8vIFJldHJpZXZlIHN0cnVjdCBkZXNjcmlwdG9ycworICAgIG1QYXJhbVJlZmxlY3RvciA9IG1TdG9yZS0+Z2V0UGFyYW1SZWZsZWN0b3IoKTsKKworICAgIC8vIFJldHJpZXZlIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGZyb20gc3RvcmUKKyAgICBtSW5pdCA9IGluaXQodGhpcyk7Cit9CisKK2MyX3N0YXR1c190IENvbXBvbmVudFN0b3JlOjp2YWxpZGF0ZVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4mIHBhcmFtcykgeworICAgIGMyX3N0YXR1c190IHJlcyA9IEMyX09LOworCisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+ICZkZXNjIDogcGFyYW1zKSB7CisgICAgICAgIGlmICghZGVzYykgeworICAgICAgICAgICAgLy8gQWxsIGRlc2NyaXB0b3JzIHNob3VsZCBiZSB2YWxpZAorICAgICAgICAgICAgcmVzID0gcmVzID8gcmVzIDogQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGNvcmVJbmRleCA9IGRlc2MtPmluZGV4KCkuY29yZUluZGV4KCk7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJ1Y3REZXNjcmlwdG9yc011dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1TdHJ1Y3REZXNjcmlwdG9ycy5maW5kKGNvcmVJbmRleCk7CisgICAgICAgIGlmIChpdCA9PSBtU3RydWN0RGVzY3JpcHRvcnMuZW5kKCkpIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IHN0cnVjdERlc2MgPQorICAgICAgICAgICAgICAgICAgICBtUGFyYW1SZWZsZWN0b3ItPmRlc2NyaWJlKGNvcmVJbmRleCk7CisgICAgICAgICAgICBpZiAoIXN0cnVjdERlc2MpIHsKKyAgICAgICAgICAgICAgICAvLyBBbGwgc3VwcG9ydGVkIHBhcmFtcyBtdXN0IGJlIGRlc2NyaWJlZAorICAgICAgICAgICAgICAgIHJlcyA9IEMyX0JBRF9JTkRFWDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TdHJ1Y3REZXNjcmlwdG9ycy5pbnNlcnQoeyBjb3JlSW5kZXgsIHN0cnVjdERlc2MgfSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUNvbXBvbmVudFN0b3JlCitSZXR1cm48dm9pZD4gQ29tcG9uZW50U3RvcmU6OmNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUsCisgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4mIHBvb2wsCisgICAgICAgIGNyZWF0ZUNvbXBvbmVudF9jYiBfaGlkbF9jYikgeworCisgICAgc3A8Q29tcG9uZW50PiBjb21wb25lbnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBjMmNvbXBvbmVudDsKKyAgICBTdGF0dXMgc3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPigKKyAgICAgICAgICAgIG1TdG9yZS0+Y3JlYXRlQ29tcG9uZW50KG5hbWUsICZjMmNvbXBvbmVudCkpOworCisgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgIG9uSW50ZXJmYWNlTG9hZGVkKGMyY29tcG9uZW50LT5pbnRmKCkpOworICAgICAgICBjb21wb25lbnQgPSBuZXcgQ29tcG9uZW50KGMyY29tcG9uZW50LCBsaXN0ZW5lciwgdGhpcywgcG9vbCk7CisgICAgICAgIGlmICghY29tcG9uZW50KSB7CisgICAgICAgICAgICBzdGF0dXMgPSBTdGF0dXM6OkNPUlJVUFRFRDsKKyAgICAgICAgfSBlbHNlIGlmIChjb21wb25lbnQtPnN0YXR1cygpICE9IEMyX09LKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KGNvbXBvbmVudC0+c3RhdHVzKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29tcG9uZW50LT5pbml0TGlzdGVuZXIoY29tcG9uZW50KTsKKyAgICAgICAgICAgIGlmIChjb21wb25lbnQtPnN0YXR1cygpICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPihjb21wb25lbnQtPnN0YXR1cygpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUNvbXBvbmVudFJvc3Rlck11dGV4KTsKKyAgICAgICAgICAgICAgICBjb21wb25lbnQtPnNldExvY2FsSWQoCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50Um9zdGVyLmVtcGxhY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50OjpJbnRlcmZhY2VLZXkoY29tcG9uZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMmNvbXBvbmVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5maXJzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgX2hpZGxfY2Ioc3RhdHVzLCBjb21wb25lbnQpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDb21wb25lbnRTdG9yZTo6Y3JlYXRlSW50ZXJmYWNlKAorICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbmFtZSwKKyAgICAgICAgY3JlYXRlSW50ZXJmYWNlX2NiIF9oaWRsX2NiKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBjMmludGVyZmFjZTsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBtU3RvcmUtPmNyZWF0ZUludGVyZmFjZShuYW1lLCAmYzJpbnRlcmZhY2UpOworICAgIHNwPElDb21wb25lbnRJbnRlcmZhY2U+IGludGVyZmFjZTsKKyAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgIG9uSW50ZXJmYWNlTG9hZGVkKGMyaW50ZXJmYWNlKTsKKyAgICAgICAgaW50ZXJmYWNlID0gbmV3IENvbXBvbmVudEludGVyZmFjZShjMmludGVyZmFjZSwgdGhpcyk7CisgICAgfQorICAgIF9oaWRsX2NiKChTdGF0dXMpcmVzLCBpbnRlcmZhY2UpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDb21wb25lbnRTdG9yZTo6bGlzdENvbXBvbmVudHMobGlzdENvbXBvbmVudHNfY2IgX2hpZGxfY2IpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4+IGMydHJhaXRzID0KKyAgICAgICAgICAgIG1TdG9yZS0+bGlzdENvbXBvbmVudHMoKTsKKyAgICBoaWRsX3ZlYzxJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0cz4gdHJhaXRzKGMydHJhaXRzLnNpemUoKSk7CisgICAgc2l6ZV90IGl4ID0gMDsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPiAmYzJ0cmFpdCA6IGMydHJhaXRzKSB7CisgICAgICAgIGlmIChjMnRyYWl0KSB7CisgICAgICAgICAgICBvYmpjcHkoJnRyYWl0c1tpeCsrXSwgKmMydHJhaXQpOworICAgICAgICB9CisgICAgfQorICAgIHRyYWl0cy5yZXNpemUoaXgpOworICAgIF9oaWRsX2NiKHRyYWl0cyk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHNwPElJbnB1dFN1cmZhY2U+PiBDb21wb25lbnRTdG9yZTo6Y3JlYXRlSW5wdXRTdXJmYWNlKCkgeworICAgIHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IHNvdXJjZSA9IG5ldyBHcmFwaGljQnVmZmVyU291cmNlKCk7CisgICAgaWYgKHNvdXJjZS0+aW5pdENoZWNrKCkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjoKKyAgICAgICAgICAgIElHcmFwaGljQnVmZmVyUHJvZHVjZXIgSEdicDsKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6VFdHcmFwaGljQnVmZmVyUHJvZHVjZXI8SEdicD4gQjJIR2JwOworICAgIHJldHVybiBuZXcgSW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJSZWZsZWN0b3JIZWxwZXI+KCksCisgICAgICAgICAgICBuZXcgQjJIR2JwKHNvdXJjZS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpKSwKKyAgICAgICAgICAgIHNvdXJjZSk7Cit9CisKK3ZvaWQgQ29tcG9uZW50U3RvcmU6Om9uSW50ZXJmYWNlTG9hZGVkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gJmludGYpIHsKKyAgICAvLyBpbnZhbGlkYXRlIHVuc3VwcG9ydGVkIHN0cnVjdCBkZXNjcmlwdG9ycyBpZiBhIG5ldyBpbnRlcmZhY2UgaXMgbG9hZGVkIGFzIGl0IG1heSBoYXZlCisgICAgLy8gZXhwb3NlZCBuZXcgZGVzY3JpcHRvcnMKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RydWN0RGVzY3JpcHRvcnNNdXRleCk7CisgICAgaWYgKCFtTG9hZGVkSW50ZXJmYWNlcy5jb3VudChpbnRmLT5nZXROYW1lKCkpKSB7CisgICAgICAgIG1VbnN1cHBvcnRlZFN0cnVjdERlc2NyaXB0b3JzLmNsZWFyKCk7CisgICAgICAgIG1Mb2FkZWRJbnRlcmZhY2VzLmVtcGxhY2UoaW50Zi0+Z2V0TmFtZSgpKTsKKyAgICB9Cit9CisKK1JldHVybjx2b2lkPiBDb21wb25lbnRTdG9yZTo6Z2V0U3RydWN0RGVzY3JpcHRvcnMoCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQzMl90PiYgaW5kaWNlcywKKyAgICAgICAgZ2V0U3RydWN0RGVzY3JpcHRvcnNfY2IgX2hpZGxfY2IpIHsKKyAgICBoaWRsX3ZlYzxTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjcmlwdG9ycyhpbmRpY2VzLnNpemUoKSk7CisgICAgc2l6ZV90IGRzdEl4ID0gMDsKKyAgICBTdGF0dXMgcmVzID0gU3RhdHVzOjpPSzsKKyAgICBmb3IgKHNpemVfdCBzcmNJeCA9IDA7IHNyY0l4IDwgaW5kaWNlcy5zaXplKCk7ICsrc3JjSXgpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cnVjdERlc2NyaXB0b3JzTXV0ZXgpOworICAgICAgICBjb25zdCBDMlBhcmFtOjpDb3JlSW5kZXggY29yZUluZGV4ID0gQzJQYXJhbTo6Q29yZUluZGV4KGluZGljZXNbc3JjSXhdKS5jb3JlSW5kZXgoKTsKKyAgICAgICAgY29uc3QgYXV0byBpdGVtID0gbVN0cnVjdERlc2NyaXB0b3JzLmZpbmQoY29yZUluZGV4KTsKKyAgICAgICAgaWYgKGl0ZW0gPT0gbVN0cnVjdERlc2NyaXB0b3JzLmVuZCgpKSB7CisgICAgICAgICAgICAvLyBub3QgaW4gdGhlIGNhY2hlLCBhbmQgbm90IGtub3duIHRvIGJlIHVuc3VwcG9ydGVkLCBxdWVyeSBsb2NhbCByZWZsZWN0b3IKKyAgICAgICAgICAgIGlmICghbVVuc3VwcG9ydGVkU3RydWN0RGVzY3JpcHRvcnMuY291bnQoY29yZUluZGV4KSkgeworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IHN0cnVjdERlc2MgPQorICAgICAgICAgICAgICAgICAgICBtUGFyYW1SZWZsZWN0b3ItPmRlc2NyaWJlKGNvcmVJbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKCFzdHJ1Y3REZXNjKSB7CisgICAgICAgICAgICAgICAgICAgIG1VbnN1cHBvcnRlZFN0cnVjdERlc2NyaXB0b3JzLmVtcGxhY2UoY29yZUluZGV4KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtU3RydWN0RGVzY3JpcHRvcnMuaW5zZXJ0KHsgY29yZUluZGV4LCBzdHJ1Y3REZXNjIH0pOworICAgICAgICAgICAgICAgICAgICBvYmpjcHkoJmRlc2NyaXB0b3JzW2RzdEl4KytdLCAqc3RydWN0RGVzYyk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcyA9IFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9IGVsc2UgaWYgKGl0ZW0tPnNlY29uZCkgeworICAgICAgICAgICAgb2JqY3B5KCZkZXNjcmlwdG9yc1tkc3RJeCsrXSwgKml0ZW0tPnNlY29uZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXMgPSBTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICAgICAgfQorICAgIH0KKyAgICBkZXNjcmlwdG9ycy5yZXNpemUoZHN0SXgpOworICAgIF9oaWRsX2NiKHJlcywgZGVzY3JpcHRvcnMpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjxzcDxJQ2xpZW50TWFuYWdlcj4+IENvbXBvbmVudFN0b3JlOjpnZXRQb29sQ2xpZW50TWFuYWdlcigpIHsKKyAgICByZXR1cm4gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKK30KKworUmV0dXJuPFN0YXR1cz4gQ29tcG9uZW50U3RvcmU6OmNvcHlCdWZmZXIoY29uc3QgQnVmZmVyJiBzcmMsIGNvbnN0IEJ1ZmZlciYgZHN0KSB7CisgICAgLy8gVE9ETyBpbXBsZW1lbnQKKyAgICAodm9pZClzcmM7CisgICAgKHZvaWQpZHN0OworICAgIHJldHVybiBTdGF0dXM6Ok9NSVRURUQ7Cit9CisKK3ZvaWQgQ29tcG9uZW50U3RvcmU6OnJlcG9ydENvbXBvbmVudERlYXRoKAorICAgICAgICBjb25zdCBDb21wb25lbnQ6OkxvY2FsSWQmIGNvbXBvbmVudExvY2FsSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ29tcG9uZW50Um9zdGVyTXV0ZXgpOworICAgIG1Db21wb25lbnRSb3N0ZXIuZXJhc2UoY29tcG9uZW50TG9jYWxJZCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gQ29tcG9uZW50U3RvcmU6OmZpbmRDMkNvbXBvbmVudCgKKyAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudD4mIGNvbXBvbmVudCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Db21wb25lbnRSb3N0ZXJNdXRleCk7CisgICAgQ29tcG9uZW50OjpMb2NhbElkIGl0ID0gbUNvbXBvbmVudFJvc3Rlci5maW5kKAorICAgICAgICAgICAgQ29tcG9uZW50OjpJbnRlcmZhY2VLZXkoY29tcG9uZW50KSk7CisgICAgaWYgKGl0ID09IG1Db21wb25lbnRSb3N0ZXIuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oKTsKKyAgICB9CisgICAgcmV0dXJuIGl0LT5zZWNvbmQubG9jaygpOworfQorCisvLyBEZWJ1ZyBkdW1wCisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworLy8gRHVtcCBjb21wb25lbnQgdHJhaXRzCitzdGQ6Om9zdHJlYW0mIGR1bXAoCisgICAgICAgIHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4mIGNvbXApIHsKKworICAgIGNvbnN0ZXhwciBjb25zdCBjaGFyIGluZGVudFtdID0gIiAgICAiOworCisgICAgb3V0IDw8IGluZGVudCA8PCAibmFtZTogIiA8PCBjb21wLT5uYW1lIDw8IHN0ZDo6ZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50IDw8ICJkb21haW46ICIgPDwgY29tcC0+ZG9tYWluIDw8IHN0ZDo6ZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50IDw8ICJraW5kOiAiIDw8IGNvbXAtPmtpbmQgPDwgc3RkOjplbmRsOworICAgIG91dCA8PCBpbmRlbnQgPDwgInJhbms6ICIgPDwgY29tcC0+cmFuayA8PCBzdGQ6OmVuZGw7CisgICAgb3V0IDw8IGluZGVudCA8PCAibWVkaWFUeXBlOiAiIDw8IGNvbXAtPm1lZGlhVHlwZSA8PCBzdGQ6OmVuZGw7CisgICAgb3V0IDw8IGluZGVudCA8PCAiYWxpYXNlczoiOworICAgIGZvciAoY29uc3QgYXV0byYgYWxpYXMgOiBjb21wLT5hbGlhc2VzKSB7CisgICAgICAgIG91dCA8PCAnICcgPDwgYWxpYXM7CisgICAgfQorICAgIG91dCA8PCBzdGQ6OmVuZGw7CisKKyAgICByZXR1cm4gb3V0OworfQorCisvLyBEdW1wIGNvbXBvbmVudAorc3RkOjpvc3RyZWFtJiBkdW1wKAorICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiYgY29tcCkgeworCisgICAgY29uc3RleHByIGNvbnN0IGNoYXIgaW5kZW50W10gPSAiICAgICI7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYgPSBjb21wLT5pbnRmKCk7CisgICAgaWYgKCFpbnRmKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQgPDwgIlVua25vd24gLS0gbnVsbCBpbnRlcmZhY2UiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIG91dDsKKyAgICB9CisgICAgb3V0IDw8IGluZGVudCA8PCAibmFtZTogIiA8PCBpbnRmLT5nZXROYW1lKCkgPDwgc3RkOjplbmRsOworICAgIG91dCA8PCBpbmRlbnQgPDwgImlkOiAiIDw8IGludGYtPmdldElkKCkgPDwgc3RkOjplbmRsOworICAgIHJldHVybiBvdXQ7Cit9CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworUmV0dXJuPHZvaWQ+IENvbXBvbmVudFN0b3JlOjpkZWJ1ZygKKyAgICAgICAgY29uc3QgaGlkbF9oYW5kbGUmIGhhbmRsZSwKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8aGlkbF9zdHJpbmc+JiAvKiBhcmdzICovKSB7CisgICAgTE9HKElORk8pIDw8ICJkZWJ1ZyAtLSBkdW1waW5nLi4uIjsKKyAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmggPSBoYW5kbGUuZ2V0TmF0aXZlSGFuZGxlKCk7CisgICAgaWYgKCFoIHx8IGgtPm51bUZkcyAhPSAxKSB7CisgICAgICAgTE9HKEVSUk9SKSA8PCAiZGVidWcgLS0gZHVtcGluZyBmYWlsZWQgLS0gIgorICAgICAgICAgICAgICAgImludmFsaWQgZmlsZSBkZXNjcmlwdG9yIHRvIGR1bXAgdG8iOworICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisKKyAgICB7IC8vIFBvcHVsYXRlICJvdXQiLgorCisgICAgICAgIGNvbnN0ZXhwciBjb25zdCBjaGFyIGluZGVudFtdID0gIiAgIjsKKworICAgICAgICAvLyBTaG93IG5hbWUuCisgICAgICAgIG91dCA8PCAiQmVnaW5uaW5nIG9mIGR1bXAgLS0gQzJDb21wb25lbnRTdG9yZTogIgorICAgICAgICAgICAgICAgIDw8IG1TdG9yZS0+Z2V0TmFtZSgpIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKyAgICAgICAgLy8gUmV0cmlldmUgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGNvbXBvbmVudHMuCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPj4gdHJhaXRzTGlzdCA9CisgICAgICAgICAgICAgICAgbVN0b3JlLT5saXN0Q29tcG9uZW50cygpOworCisgICAgICAgIC8vIER1bXAgdGhlIHRyYWl0cyBvZiBzdXBwb3J0ZWQgY29tcG9uZW50cy4KKyAgICAgICAgb3V0IDw8IGluZGVudCA8PCAiU3VwcG9ydGVkIGNvbXBvbmVudHM6IiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworICAgICAgICBpZiAodHJhaXRzTGlzdC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCA8PCBpbmRlbnQgPDwgIk5PTkUiIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHRyYWl0cyA6IHRyYWl0c0xpc3QpIHsKKyAgICAgICAgICAgICAgICBkdW1wKG91dCwgdHJhaXRzKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBhY3RpdmUgY29tcG9uZW50cy4KKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4+IGFjdGl2ZUNvbXBzOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ29tcG9uZW50Um9zdGVyTXV0ZXgpOworICAgICAgICAgICAgYXV0byBpID0gbUNvbXBvbmVudFJvc3Rlci5iZWdpbigpOworICAgICAgICAgICAgd2hpbGUgKGkgIT0gbUNvbXBvbmVudFJvc3Rlci5lbmQoKSkgeworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gYzJjb21wID0gaS0+c2Vjb25kLmxvY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoIWMyY29tcCkgeworICAgICAgICAgICAgICAgICAgICBhdXRvIGogPSBpOworICAgICAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnRSb3N0ZXIuZXJhc2Uoaik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgICAgICAgICBhY3RpdmVDb21wcy5lbXBsYWNlX2JhY2soYzJjb21wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBEdW1wIGFjdGl2ZSBjb21wb25lbnRzLgorICAgICAgICBvdXQgPDwgaW5kZW50IDw8ICJBY3RpdmUgY29tcG9uZW50czoiIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisgICAgICAgIGlmIChhY3RpdmVDb21wcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCA8PCBpbmRlbnQgPDwgIk5PTkUiIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4mIGMyY29tcCA6IGFjdGl2ZUNvbXBzKSB7CisgICAgICAgICAgICAgICAgZHVtcChvdXQsIGMyY29tcCkgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8ICJFbmQgb2YgZHVtcCAtLSBDMkNvbXBvbmVudFN0b3JlOiAiCisgICAgICAgICAgICAgICAgPDwgbVN0b3JlLT5nZXROYW1lKCkgPDwgc3RkOjplbmRsOworICAgIH0KKworICAgIGlmICghYW5kcm9pZDo6YmFzZTo6V3JpdGVTdHJpbmdUb0ZkKG91dC5zdHIoKSwgaC0+ZGF0YVswXSkpIHsKKyAgICAgICAgUExPRyhXQVJOSU5HKSA8PCAiZGVidWcgLS0gZHVtcGluZyBmYWlsZWQgLS0gd3JpdGUoKSI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HKElORk8pIDw8ICJkZWJ1ZyAtLSBkdW1waW5nIHN1Y2NlZWRlZCI7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbmZpZ3VyYWJsZS5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29uZmlndXJhYmxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDIzYmE4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbmZpZ3VyYWJsZS5jcHAKQEAgLTAsMCArMSwxNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMi1Db25maWd1cmFibGUiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbmZpZ3VyYWJsZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC90eXBlcy5oPgorI2luY2x1ZGUgPEMyUGFyYW1JbnRlcm5hbC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOworCitDYWNoZWRDb25maWd1cmFibGU6OkNhY2hlZENvbmZpZ3VyYWJsZSgKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENvbmZpZ3VyYWJsZUMySW50Zj4mJiBpbnRmKSA6CisgICAgbUludGYoc3RkOjptb3ZlKGludGYpKSB7Cit9CisKK2MyX3N0YXR1c190IENhY2hlZENvbmZpZ3VyYWJsZTo6aW5pdChDb21wb25lbnRTdG9yZSogc3RvcmUpIHsKKyAgICAvLyBSZXRyaWV2ZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBmcm9tIHN0b3JlCisgICAgYzJfc3RhdHVzX3QgaW5pdCA9IG1JbnRmLT5xdWVyeVN1cHBvcnRlZFBhcmFtcygmbVN1cHBvcnRlZFBhcmFtcyk7CisgICAgYzJfc3RhdHVzX3QgdmFsaWRhdGUgPSBzdG9yZS0+dmFsaWRhdGVTdXBwb3J0ZWRQYXJhbXMobVN1cHBvcnRlZFBhcmFtcyk7CisgICAgcmV0dXJuIGluaXQgPT0gQzJfT0sgPyBDMl9PSyA6IHZhbGlkYXRlOworfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29uZmlndXJhYmxlIGZvbGxvdy4KK1JldHVybjx2b2lkPiBDYWNoZWRDb25maWd1cmFibGU6OmdldE5hbWUoZ2V0TmFtZV9jYiBfaGlkbF9jYikgeworICAgIF9oaWRsX2NiKG1JbnRmLT5nZXROYW1lKCkpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDYWNoZWRDb25maWd1cmFibGU6OnF1ZXJ5KAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50MzJfdD4mIGluZGljZXMsCisgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgIHF1ZXJ5X2NiIF9oaWRsX2NiKSB7CisgICAgdHlwZWRlZiBDMlBhcmFtOjpJbmRleCBJbmRleDsKKyAgICBzdGQ6OnZlY3RvcjxJbmRleD4gYzJoZWFwUGFyYW1JbmRpY2VzKAorICAgICAgICAgICAgKEluZGV4KilpbmRpY2VzLmRhdGEoKSwKKyAgICAgICAgICAgIChJbmRleCopaW5kaWNlcy5kYXRhKCkgKyBpbmRpY2VzLnNpemUoKSk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBjMmhlYXBQYXJhbXM7CisgICAgYzJfc3RhdHVzX3QgYzJyZXMgPSBtSW50Zi0+cXVlcnkoCisgICAgICAgICAgICBjMmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICBtYXlCbG9jayA/IEMyX01BWV9CTE9DSyA6IEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAmYzJoZWFwUGFyYW1zKTsKKworICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IHBhcmFtczsKKyAgICBjcmVhdGVQYXJhbXNCbG9iKCZwYXJhbXMsIGMyaGVhcFBhcmFtcyk7CisgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8U3RhdHVzPihjMnJlcyksIHBhcmFtcyk7CisKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gQ2FjaGVkQ29uZmlndXJhYmxlOjpjb25maWcoCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBpblBhcmFtcywKKyAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgY29uZmlnX2NiIF9oaWRsX2NiKSB7CisgICAgLy8gaW5QYXJhbXMgaXMgbm90IHdyaXRhYmxlLCBzbyBjcmVhdGUgYSBjb3B5IGFzIGNvbmZpZyBtb2RpZmllcyB0aGUgcGFyYW1ldGVycworICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IGluUGFyYW1zQ29weSA9IGluUGFyYW1zOworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBjMnBhcmFtczsKKyAgICBpZiAocGFyc2VQYXJhbXNCbG9iKCZjMnBhcmFtcywgaW5QYXJhbXNDb3B5KSAhPSBDMl9PSykgeworICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkNPUlJVUFRFRCwKKyAgICAgICAgICAgICAgICBoaWRsX3ZlYzxTZXR0aW5nUmVzdWx0PigpLAorICAgICAgICAgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+KCkpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICAvLyBUT0RPOiBjaGVjayBpZiBibG9iIHdhcyBpbnZhbGlkCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGMyZmFpbHVyZXM7CisgICAgYzJfc3RhdHVzX3QgYzJyZXMgPSBtSW50Zi0+Y29uZmlnKAorICAgICAgICAgICAgYzJwYXJhbXMsCisgICAgICAgICAgICBtYXlCbG9jayA/IEMyX01BWV9CTE9DSyA6IEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAmYzJmYWlsdXJlcyk7CisgICAgaGlkbF92ZWM8U2V0dGluZ1Jlc3VsdD4gZmFpbHVyZXMoYzJmYWlsdXJlcy5zaXplKCkpOworICAgIHsKKyAgICAgICAgc2l6ZV90IGl4ID0gMDsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiYgYzJyZXN1bHQgOiBjMmZhaWx1cmVzKSB7CisgICAgICAgICAgICBpZiAoYzJyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBvYmpjcHkoJmZhaWx1cmVzW2l4KytdLCAqYzJyZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZhaWx1cmVzLnJlc2l6ZShpeCk7CisgICAgfQorICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IG91dFBhcmFtczsKKyAgICBjcmVhdGVQYXJhbXNCbG9iKCZvdXRQYXJhbXMsIGMycGFyYW1zKTsKKyAgICBfaGlkbF9jYigoU3RhdHVzKWMycmVzLCBmYWlsdXJlcywgb3V0UGFyYW1zKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gQ2FjaGVkQ29uZmlndXJhYmxlOjpxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgdWludDMyX3Qgc3RhcnQsCisgICAgICAgIHVpbnQzMl90IGNvdW50LAorICAgICAgICBxdWVyeVN1cHBvcnRlZFBhcmFtc19jYiBfaGlkbF9jYikgeworICAgIEMyTGluZWFyUmFuZ2UgcmVxdWVzdCA9IEMyTGluZWFyQ2FwYWNpdHkobVN1cHBvcnRlZFBhcmFtcy5zaXplKCkpLnJhbmdlKAorICAgICAgICAgICAgc3RhcnQsIGNvdW50KTsKKyAgICBoaWRsX3ZlYzxQYXJhbURlc2NyaXB0b3I+IHBhcmFtcyhyZXF1ZXN0LnNpemUoKSk7CisgICAgU3RhdHVzIHJlcyA9IFN0YXR1czo6T0s7CisgICAgc2l6ZV90IGRzdEl4ID0gMDsKKyAgICBmb3IgKHNpemVfdCBzcmNJeCA9IHJlcXVlc3Qub2Zmc2V0KCk7IHNyY0l4IDwgcmVxdWVzdC5lbmRPZmZzZXQoKTsgKytzcmNJeCkgeworICAgICAgICBpZiAobVN1cHBvcnRlZFBhcmFtc1tzcmNJeF0pIHsKKyAgICAgICAgICAgIG9iamNweSgmcGFyYW1zW2RzdEl4KytdLCAqbVN1cHBvcnRlZFBhcmFtc1tzcmNJeF0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzID0gU3RhdHVzOjpCQURfSU5ERVg7CisgICAgICAgIH0KKyAgICB9CisgICAgcGFyYW1zLnJlc2l6ZShkc3RJeCk7CisgICAgX2hpZGxfY2IocmVzLCBwYXJhbXMpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDYWNoZWRDb25maWd1cmFibGU6OnF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICBjb25zdCBoaWRsX3ZlYzxGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiYgaW5GaWVsZHMsCisgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgIHF1ZXJ5U3VwcG9ydGVkVmFsdWVzX2NiIF9oaWRsX2NiKSB7CisgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiBjMmZpZWxkczsKKyAgICB7CisgICAgICAgIC8vIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSBvYmplY3RzIGFyZSByZXN0cmljdGVkIGluIHRoYXQgc29tZQorICAgICAgICAvLyBtZW1iZXJzIGFyZSBjb25zdC4KKyAgICAgICAgLy8gQzJQYXJhbUZpZWxkIC0gcmVxdWlyZWQgZm9yIGl0cyBjb25zdHJ1Y3RvciAtIGhhcyBubyBjb25zdHJ1Y3RvcnMKKyAgICAgICAgLy8gZnJvbSBmaWVsZHMuIFVzZSBDMlBhcmFtSW5zcGVjdG9yLgorICAgICAgICBmb3IgKGNvbnN0IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgJnF1ZXJ5IDogaW5GaWVsZHMpIHsKKyAgICAgICAgICAgIGMyZmllbGRzLmVtcGxhY2VfYmFjayhfQzJQYXJhbUluc3BlY3Rvcjo6Q3JlYXRlUGFyYW1GaWVsZCgKKyAgICAgICAgICAgICAgICAgICAgcXVlcnkuZmllbGQuaW5kZXgsCisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LmZpZWxkLmZpZWxkSWQub2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICBxdWVyeS5maWVsZC5maWVsZElkLnNpemUpLAorICAgICAgICAgICAgICAgICAgICBxdWVyeS50eXBlID09IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlR5cGU6OlBPU1NJQkxFID8KKyAgICAgICAgICAgICAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpQT1NTSUJMRSA6CisgICAgICAgICAgICAgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q1VSUkVOVCk7CisgICAgICAgIH0KKyAgICB9CisgICAgYzJfc3RhdHVzX3QgYzJyZXMgPSBtSW50Zi0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgICAgICBjMmZpZWxkcywKKyAgICAgICAgICAgIG1heUJsb2NrID8gQzJfTUFZX0JMT0NLIDogQzJfRE9OVF9CTE9DSyk7CisgICAgaGlkbF92ZWM8RmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdD4gb3V0RmllbGRzKGluRmllbGRzLnNpemUoKSk7CisgICAgeworICAgICAgICBzaXplX3QgaXggPSAwOworICAgICAgICBmb3IgKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAmcmVzdWx0IDogYzJmaWVsZHMpIHsKKyAgICAgICAgICAgIG9iamNweSgmb3V0RmllbGRzW2l4KytdLCByZXN1bHQpOworICAgICAgICB9CisgICAgfQorICAgIF9oaWRsX2NiKChTdGF0dXMpYzJyZXMsIG91dEZpZWxkcyk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0U3VyZmFjZS5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvSW5wdXRTdXJmYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjY5NDYwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0U3VyZmFjZS5jcHAKQEAgLTAsMCArMSwzMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMi1JbnB1dFN1cmZhY2UiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmg+CisKKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOworCitjbGFzcyBJbnB1dFN1cmZhY2U6OkNvbmZpZ3VyYWJsZUltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IENvbmZpZ3VyYWJsZUltcGwoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRW9zLCBDMl9OQU1FX0lOUFVUX1NVUkZBQ0VfRU9TX1RVTklORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMySW5wdXRTdXJmYWNlRW9zVHVuaW5nKGZhbHNlKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1Fb3MsIHZhbHVlKS5vbmVPZih7dHJ1ZSwgZmFsc2V9KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoRW9zU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEVvc1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJJbnB1dFN1cmZhY2VFb3NUdW5pbmc+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgcmV0dXJuIG1lLkYobWUudi52YWx1ZSkudmFsaWRhdGVQb3NzaWJsZShtZS52LnZhbHVlKTsKKyAgICB9CisKKyAgICBib29sIGVvcygpIGNvbnN0IHsgcmV0dXJuIG1Fb3MtPnZhbHVlOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMySW5wdXRTdXJmYWNlRW9zVHVuaW5nPiBtRW9zOworfTsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgQ29uZmlndXJhYmxlV3JhcHBlciA6IHB1YmxpYyBDb25maWd1cmFibGVDMkludGYgeworcHVibGljOgorICAgIENvbmZpZ3VyYWJsZVdyYXBwZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlOjpDb25maWd1cmFibGVJbXBsPiAmaW1wbCwKKyAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+ICZzb3VyY2UpCisgICAgICAgIDogQ29uZmlndXJhYmxlQzJJbnRmKCJpbnB1dC1zdXJmYWNlIiksCisgICAgICAgICAgbUltcGwoaW1wbCksCisgICAgICAgICAgbVNvdXJjZShzb3VyY2UpIHsKKyAgICB9CisKKyAgICB+Q29uZmlndXJhYmxlV3JhcHBlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIGMyX3N0YXR1c190IHF1ZXJ5KAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZpbmRpY2VzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IHBhcmFtcykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwtPnF1ZXJ5KHt9LCBpbmRpY2VzLCBtYXlCbG9jaywgcGFyYW1zKTsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBjb25maWcoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSBvdmVycmlkZSB7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbXBsLT5jb25maWcocGFyYW1zLCBtYXlCbG9jaywgZmFpbHVyZXMpOworICAgICAgICBpZiAobUltcGwtPmVvcygpKSB7CisgICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyU291cmNlPiBzb3VyY2UgPSBtU291cmNlLnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbHB0ciB8fCBzb3VyY2UtPnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSAhPSBPSykgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IHB1dCBzb21ldGhpbmcgaW4gfGZhaWx1cmVzfAorICAgICAgICAgICAgICAgIGVyciA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRPRE86IHJlc2V0IGVvcz8KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4qIGNvbnN0IHBhcmFtcykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKHBhcmFtcyk7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+JiBmaWVsZHMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoZmllbGRzLCBtYXlCbG9jayk7CisgICAgfQorCitwcml2YXRlOgorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2U6OkNvbmZpZ3VyYWJsZUltcGw+IG1JbXBsOworICAgIHdwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IG1Tb3VyY2U7Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworCitSZXR1cm48dm9pZD4gSW5wdXRTdXJmYWNlOjpjb25uZWN0VG9Db21wb25lbnQoCisgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgIGNvbm5lY3RUb0NvbXBvbmVudF9jYiBfaGlkbF9jYikgeworICAgIFN0YXR1cyBzdGF0dXM7CisgICAgc3A8SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4gY29ubjsKKyAgICBpZiAoIWNvbXBvbmVudCkgeworICAgICAgICBzdGF0dXMgPSBTdGF0dXM6OkJBRF9WQUxVRTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IGNvbXAgPSBtU3RvcmUtPmZpbmRDMkNvbXBvbmVudChjb21wb25lbnQpOworICAgICAgICBpZiAoIWNvbXApIHsKKyAgICAgICAgICAgIGNvbm4gPSBuZXcgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbihtU291cmNlLCBjb21wb25lbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29ubiA9IG5ldyBJbnB1dFN1cmZhY2VDb25uZWN0aW9uKG1Tb3VyY2UsIGNvbXApOworICAgICAgICB9CisgICAgICAgIGlmICghY29ubi0+aW5pdCgpKSB7CisgICAgICAgICAgICBjb25uID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHN0YXR1cyA9IFN0YXR1czo6QkFEX1ZBTFVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpPSzsKKyAgICAgICAgfQorICAgIH0KKyAgICBfaGlkbF9jYihzdGF0dXMsIGNvbm4pOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gSW5wdXRTdXJmYWNlOjpnZXRDb25maWd1cmFibGUoKSB7CisgICAgcmV0dXJuIG1Db25maWd1cmFibGU7Cit9CisKKy8vIERlcml2ZWQgbWV0aG9kcyBmcm9tIElHcmFwaGljQnVmZmVyUHJvZHVjZXIKKworUmV0dXJuPHZvaWQ+IElucHV0U3VyZmFjZTo6cmVxdWVzdEJ1ZmZlcigKKyAgICAgICAgaW50MzJfdCBzbG90LAorICAgICAgICByZXF1ZXN0QnVmZmVyX2NiIF9oaWRsX2NiKSB7CisgICAgcmV0dXJuIG1CYXNlLT5yZXF1ZXN0QnVmZmVyKHNsb3QsIF9oaWRsX2NiKTsKK30KKworUmV0dXJuPGludDMyX3Q+IElucHV0U3VyZmFjZTo6c2V0TWF4RGVxdWV1ZWRCdWZmZXJDb3VudCgKKyAgICAgICAgaW50MzJfdCBtYXhEZXF1ZXVlZEJ1ZmZlcnMpIHsKKyAgICByZXR1cm4gbUJhc2UtPnNldE1heERlcXVldWVkQnVmZmVyQ291bnQobWF4RGVxdWV1ZWRCdWZmZXJzKTsKK30KKworUmV0dXJuPGludDMyX3Q+IElucHV0U3VyZmFjZTo6c2V0QXN5bmNNb2RlKAorICAgICAgICBib29sIGFzeW5jKSB7CisgICAgcmV0dXJuIG1CYXNlLT5zZXRBc3luY01vZGUoYXN5bmMpOworfQorCitSZXR1cm48dm9pZD4gSW5wdXRTdXJmYWNlOjpkZXF1ZXVlQnVmZmVyKAorICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICBQaXhlbEZvcm1hdCBmb3JtYXQsCisgICAgICAgIHVpbnQzMl90IHVzYWdlLAorICAgICAgICBib29sIGdldEZyYW1lVGltZXN0YW1wcywKKyAgICAgICAgZGVxdWV1ZUJ1ZmZlcl9jYiBfaGlkbF9jYikgeworICAgIHJldHVybiBtQmFzZS0+ZGVxdWV1ZUJ1ZmZlcigKKyAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsIGdldEZyYW1lVGltZXN0YW1wcywgX2hpZGxfY2IpOworfQorCitSZXR1cm48aW50MzJfdD4gSW5wdXRTdXJmYWNlOjpkZXRhY2hCdWZmZXIoCisgICAgICAgIGludDMyX3Qgc2xvdCkgeworICAgIHJldHVybiBtQmFzZS0+ZGV0YWNoQnVmZmVyKHNsb3QpOworfQorCitSZXR1cm48dm9pZD4gSW5wdXRTdXJmYWNlOjpkZXRhY2hOZXh0QnVmZmVyKAorICAgICAgICBkZXRhY2hOZXh0QnVmZmVyX2NiIF9oaWRsX2NiKSB7CisgICAgcmV0dXJuIG1CYXNlLT5kZXRhY2hOZXh0QnVmZmVyKF9oaWRsX2NiKTsKK30KKworUmV0dXJuPHZvaWQ+IElucHV0U3VyZmFjZTo6YXR0YWNoQnVmZmVyKAorICAgICAgICBjb25zdCBBbndCdWZmZXImIGJ1ZmZlciwKKyAgICAgICAgYXR0YWNoQnVmZmVyX2NiIF9oaWRsX2NiKSB7CisgICAgcmV0dXJuIG1CYXNlLT5hdHRhY2hCdWZmZXIoYnVmZmVyLCBfaGlkbF9jYik7Cit9CisKK1JldHVybjx2b2lkPiBJbnB1dFN1cmZhY2U6OnF1ZXVlQnVmZmVyKAorICAgICAgICBpbnQzMl90IHNsb3QsCisgICAgICAgIGNvbnN0IFF1ZXVlQnVmZmVySW5wdXQmIGlucHV0LAorICAgICAgICBxdWV1ZUJ1ZmZlcl9jYiBfaGlkbF9jYikgeworICAgIHJldHVybiBtQmFzZS0+cXVldWVCdWZmZXIoc2xvdCwgaW5wdXQsIF9oaWRsX2NiKTsKK30KKworUmV0dXJuPGludDMyX3Q+IElucHV0U3VyZmFjZTo6Y2FuY2VsQnVmZmVyKAorICAgICAgICBpbnQzMl90IHNsb3QsCisgICAgICAgIGNvbnN0IGhpZGxfaGFuZGxlJiBmZW5jZSkgeworICAgIHJldHVybiBtQmFzZS0+Y2FuY2VsQnVmZmVyKHNsb3QsIGZlbmNlKTsKK30KKworUmV0dXJuPHZvaWQ+IElucHV0U3VyZmFjZTo6cXVlcnkoCisgICAgICAgIGludDMyX3Qgd2hhdCwKKyAgICAgICAgcXVlcnlfY2IgX2hpZGxfY2IpIHsKKyAgICByZXR1cm4gbUJhc2UtPnF1ZXJ5KHdoYXQsIF9oaWRsX2NiKTsKK30KKworUmV0dXJuPHZvaWQ+IElucHV0U3VyZmFjZTo6Y29ubmVjdCgKKyAgICAgICAgY29uc3Qgc3A8SFByb2R1Y2VyTGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgaW50MzJfdCBhcGksCisgICAgICAgIGJvb2wgcHJvZHVjZXJDb250cm9sbGVkQnlBcHAsCisgICAgICAgIGNvbm5lY3RfY2IgX2hpZGxfY2IpIHsKKyAgICByZXR1cm4gbUJhc2UtPmNvbm5lY3QobGlzdGVuZXIsIGFwaSwgcHJvZHVjZXJDb250cm9sbGVkQnlBcHAsIF9oaWRsX2NiKTsKK30KKworUmV0dXJuPGludDMyX3Q+IElucHV0U3VyZmFjZTo6ZGlzY29ubmVjdCgKKyAgICAgICAgaW50MzJfdCBhcGksCisgICAgICAgIERpc2Nvbm5lY3RNb2RlIG1vZGUpIHsKKyAgICByZXR1cm4gbUJhc2UtPmRpc2Nvbm5lY3QoYXBpLCBtb2RlKTsKK30KKworUmV0dXJuPGludDMyX3Q+IElucHV0U3VyZmFjZTo6c2V0U2lkZWJhbmRTdHJlYW0oCisgICAgICAgIGNvbnN0IGhpZGxfaGFuZGxlJiBzdHJlYW0pIHsKKyAgICByZXR1cm4gbUJhc2UtPnNldFNpZGViYW5kU3RyZWFtKHN0cmVhbSk7Cit9CisKK1JldHVybjx2b2lkPiBJbnB1dFN1cmZhY2U6OmFsbG9jYXRlQnVmZmVycygKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsCisgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgUGl4ZWxGb3JtYXQgZm9ybWF0LAorICAgICAgICB1aW50MzJfdCB1c2FnZSkgeworICAgIHJldHVybiBtQmFzZS0+YWxsb2NhdGVCdWZmZXJzKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UpOworfQorCitSZXR1cm48aW50MzJfdD4gSW5wdXRTdXJmYWNlOjphbGxvd0FsbG9jYXRpb24oCisgICAgICAgIGJvb2wgYWxsb3cpIHsKKyAgICByZXR1cm4gbUJhc2UtPmFsbG93QWxsb2NhdGlvbihhbGxvdyk7Cit9CisKK1JldHVybjxpbnQzMl90PiBJbnB1dFN1cmZhY2U6OnNldEdlbmVyYXRpb25OdW1iZXIoCisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb25OdW1iZXIpIHsKKyAgICByZXR1cm4gbUJhc2UtPnNldEdlbmVyYXRpb25OdW1iZXIoZ2VuZXJhdGlvbk51bWJlcik7Cit9CisKK1JldHVybjx2b2lkPiBJbnB1dFN1cmZhY2U6OmdldENvbnN1bWVyTmFtZSgKKyAgICAgICAgZ2V0Q29uc3VtZXJOYW1lX2NiIF9oaWRsX2NiKSB7CisgICAgcmV0dXJuIG1CYXNlLT5nZXRDb25zdW1lck5hbWUoX2hpZGxfY2IpOworfQorCitSZXR1cm48aW50MzJfdD4gSW5wdXRTdXJmYWNlOjpzZXRTaGFyZWRCdWZmZXJNb2RlKAorICAgICAgICBib29sIHNoYXJlZEJ1ZmZlck1vZGUpIHsKKyAgICByZXR1cm4gbUJhc2UtPnNldFNoYXJlZEJ1ZmZlck1vZGUoc2hhcmVkQnVmZmVyTW9kZSk7Cit9CisKK1JldHVybjxpbnQzMl90PiBJbnB1dFN1cmZhY2U6OnNldEF1dG9SZWZyZXNoKAorICAgICAgICBib29sIGF1dG9SZWZyZXNoKSB7CisgICAgcmV0dXJuIG1CYXNlLT5zZXRBdXRvUmVmcmVzaChhdXRvUmVmcmVzaCk7Cit9CisKK1JldHVybjxpbnQzMl90PiBJbnB1dFN1cmZhY2U6OnNldERlcXVldWVUaW1lb3V0KAorICAgICAgICBpbnQ2NF90IHRpbWVvdXROcykgeworICAgIHJldHVybiBtQmFzZS0+c2V0RGVxdWV1ZVRpbWVvdXQodGltZW91dE5zKTsKK30KKworUmV0dXJuPHZvaWQ+IElucHV0U3VyZmFjZTo6Z2V0TGFzdFF1ZXVlZEJ1ZmZlcigKKyAgICAgICAgZ2V0TGFzdFF1ZXVlZEJ1ZmZlcl9jYiBfaGlkbF9jYikgeworICAgIHJldHVybiBtQmFzZS0+Z2V0TGFzdFF1ZXVlZEJ1ZmZlcihfaGlkbF9jYik7Cit9CisKK1JldHVybjx2b2lkPiBJbnB1dFN1cmZhY2U6OmdldEZyYW1lVGltZXN0YW1wcygKKyAgICAgICAgZ2V0RnJhbWVUaW1lc3RhbXBzX2NiIF9oaWRsX2NiKSB7CisgICAgcmV0dXJuIG1CYXNlLT5nZXRGcmFtZVRpbWVzdGFtcHMoX2hpZGxfY2IpOworfQorCitSZXR1cm48dm9pZD4gSW5wdXRTdXJmYWNlOjpnZXRVbmlxdWVJZCgKKyAgICAgICAgZ2V0VW5pcXVlSWRfY2IgX2hpZGxfY2IpIHsKKyAgICByZXR1cm4gbUJhc2UtPmdldFVuaXF1ZUlkKF9oaWRsX2NiKTsKK30KKworLy8gQ29uc3RydWN0b3IgaXMgZXhjbHVzaXZlIHRvIENvbXBvbmVudFN0b3JlLgorSW5wdXRTdXJmYWNlOjpJbnB1dFN1cmZhY2UoCisgICAgICAgIGNvbnN0IHNwPENvbXBvbmVudFN0b3JlPiYgc3RvcmUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4mIHJlZmxlY3RvciwKKyAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGJhc2UsCisgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UpIDoKKyAgICBtU3RvcmUoc3RvcmUpLAorICAgIG1CYXNlKGJhc2UpLAorICAgIG1Tb3VyY2Uoc291cmNlKSwKKyAgICBtSGVscGVyKHN0ZDo6bWFrZV9zaGFyZWQ8Q29uZmlndXJhYmxlSW1wbD4ocmVmbGVjdG9yKSksCisgICAgbUNvbmZpZ3VyYWJsZShuZXcgQ2FjaGVkQ29uZmlndXJhYmxlKAorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDb25maWd1cmFibGVXcmFwcGVyPihtSGVscGVyLCBzb3VyY2UpKSkgeworCisgICAgbUNvbmZpZ3VyYWJsZS0+aW5pdChzdG9yZS5nZXQoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTdjMmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uY3BwCkBAIC0wLDAgKzEsNDM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2RlYzItSW5wdXRTdXJmYWNlQ29ubmVjdGlvbiIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8YXRvbWljPgorCisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0NvbXBvbmVudFdyYXBwZXIuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KKyNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlIDxDMi5oPgorI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgorI2luY2x1ZGUgPEMyQmxvY2tJbnRlcm5hbC5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPEMyV29yay5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCitjb25zdGV4cHIgaW50MzJfdCBrQnVmZmVyQ291bnQgPSAxNjsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworY2xhc3MgQnVmZmVyMkQgOiBwdWJsaWMgQzJCdWZmZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEJ1ZmZlcjJEKEMyQ29uc3RHcmFwaGljQmxvY2sgYmxvY2spIDogQzJCdWZmZXIoeyBibG9jayB9KSB7CisgICAgfQorfTsKKworfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCitzdHJ1Y3QgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbjo6SW1wbCA6IHB1YmxpYyBDb21wb25lbnRXcmFwcGVyIHsKKyAgICBJbXBsKGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+JiBjb21wKSA6CisgICAgICAgICAgICBtU291cmNlKHNvdXJjZSksIG1Db21wKGNvbXApLCBtUmVtb3RlQ29tcCgpLAorICAgICAgICAgICAgbUZyYW1lSW5kZXgoMCkgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYgPSBjb21wLT5pbnRmKCk7CisgICAgICAgIG1Db21wTmFtZSA9IGludGYgPyBpbnRmLT5nZXROYW1lKCkgOiAiIjsKKyAgICB9CisKKyAgICBJbXBsKGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50PiYgY29tcCkgOgorICAgICAgICAgICAgbVNvdXJjZShzb3VyY2UpLCBtQ29tcCgpLCBtUmVtb3RlQ29tcChjb21wKSwKKyAgICAgICAgICAgIG1GcmFtZUluZGV4KDApIHsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gY29tcC0+Z2V0TmFtZSgKKyAgICAgICAgICAgICAgICBbdGhpc10oY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBOYW1lID0gbmFtZS5jX3N0cigpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0QoImdldE5hbWUgLS0gQ2Fubm90IG9idGFpbiByZW1vdGUgY29tcG9uZW50IG5hbWUuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIH5JbXBsKCkgPSBkZWZhdWx0OworCisgICAgYm9vbCBpbml0KCkgeworICAgICAgICBzcDxHcmFwaGljQnVmZmVyU291cmNlPiBzb3VyY2UgPSBtU291cmNlLnByb21vdGUoKTsKKyAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzX3QgZXJyID0gc291cmNlLT5pbml0Q2hlY2soKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR0QoIkltcGw6OmluaXQgLS0gR0JTIGluaXQgZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiByZWFkIHNldHRpbmdzIHByb3Blcmx5IGZyb20gdGhlIGludGVyZmFjZQorICAgICAgICBDMlZpZGVvU2l6ZVN0cmVhbVR1bmluZzo6aW5wdXQgaW5wdXRTaXplOworICAgICAgICBDMlN0cmVhbVVzYWdlVHVuaW5nOjppbnB1dCB1c2FnZTsKKyAgICAgICAgYzJfc3RhdHVzX3QgYzJTdGF0dXMgPSBjb21wUXVlcnkoeyAmaW5wdXRTaXplLCAmdXNhZ2UgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX01BWV9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgICAgIGlmIChjMlN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0QoIkltcGw6OmluaXQgLS0gY2Fubm90IHF1ZXJ5IGluZm9ybWF0aW9uIGZyb20gIgorICAgICAgICAgICAgICAgICAgICAidGhlIGNvbXBvbmVudCBpbnRlcmZhY2U6ICVzLiIsIGFzU3RyaW5nKGMyU3RhdHVzKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiBwcm9wZXIgY29sb3IgYXNwZWN0ICYgZGF0YXNwYWNlCisgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSA9IEhBTF9EQVRBU1BBQ0VfQlQ3MDk7CisKKyAgICAgICAgLy8gVE9ETzogdXNlIHRoZSB1c2FnZSByZWFkIGZyb20gaW50ZgorICAgICAgICAvLyB1aW50MzJfdCBncmFsbG9jVXNhZ2UgPQorICAgICAgICAvLyAgICAgICAgIEMyQW5kcm9pZE1lbW9yeVVzYWdlKEMyTWVtb3J5VXNhZ2UodXNhZ2UudmFsdWUpKS4KKyAgICAgICAgLy8gICAgICAgICBhc0dyYWxsb2NVc2FnZSgpOworCisgICAgICAgIHVpbnQzMl90IGdyYWxsb2NVc2FnZSA9CisgICAgICAgICAgICAgICAgbUNvbXBOYW1lLmNvbXBhcmUoMCwgMTEsICJjMi5hbmRyb2lkLiIpID09IDAgPworICAgICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiA6CisgICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSOworCisgICAgICAgIGVyciA9IHNvdXJjZS0+Y29uZmlndXJlKAorICAgICAgICAgICAgICAgIHRoaXMsIGRhdGFTcGFjZSwga0J1ZmZlckNvdW50LAorICAgICAgICAgICAgICAgIGlucHV0U2l6ZS53aWR0aCwgaW5wdXRTaXplLmhlaWdodCwKKyAgICAgICAgICAgICAgICBncmFsbG9jVXNhZ2UpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRCgiSW1wbDo6aW5pdCAtLSBHQlMgY29uZmlndXJlIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGtCdWZmZXJDb3VudDsgKytpKSB7CisgICAgICAgICAgICBpZiAoIXNvdXJjZS0+b25JbnB1dEJ1ZmZlckFkZGVkKGkpLmlzT2soKSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJJbXBsOjppbml0OiBwb3B1bGF0aW5nIEdCUyBzbG90cyBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzb3VyY2UtPnN0YXJ0KCkuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRCgiSW1wbDo6aW5pdCAtLSBHQlMgc3RhcnQgZmFpbGVkIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgbUFsbG9jYXRvck11dGV4LmxvY2soKTsKKyAgICAgICAgYzJfc3RhdHVzX3QgYzJlcnIgPSBHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCktPmZldGNoQWxsb2NhdG9yKAorICAgICAgICAgICAgICAgIEMyQWxsb2NhdG9yU3RvcmU6OlBMQVRGT1JNX1NUQVJUICsgMSwgIC8vIEdSQUxMT0MKKyAgICAgICAgICAgICAgICAmbUFsbG9jYXRvcik7CisgICAgICAgIG1BbGxvY2F0b3JNdXRleC51bmxvY2soKTsKKyAgICAgICAgaWYgKGMyZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRCgiSW1wbDo6aW5pdCAtLSBmYWlsZWQgdG8gZmV0Y2ggZ3JhbGxvYyBhbGxvY2F0b3I6ICVkIiwgYzJlcnIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIEZyb20gQ29tcG9uZW50V3JhcHBlcgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VibWl0QnVmZmVyKAorICAgICAgICAgICAgaW50MzJfdCBidWZmZXJJZCwKKyAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBidWZmZXIsCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCwKKyAgICAgICAgICAgIGludCBmZW5jZUZkKSBvdmVycmlkZSB7CisgICAgICAgIEFMT0dWKCJJbXBsOjpzdWJtaXRCdWZmZXIgLS0gYnVmZmVySWQgPSAlZCIsIGJ1ZmZlcklkKTsKKyAgICAgICAgLy8gVE9ETzogVXNlIGZkIHRvIGNvbnN0cnVjdCBmZW5jZQorICAgICAgICAodm9pZClmZW5jZUZkOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgQzJIYW5kbGUqIGhhbmRsZSA9IFdyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlKAorICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvbmUoYnVmZmVyLT5oYW5kbGUpLAorICAgICAgICAgICAgICAgIGJ1ZmZlci0+d2lkdGgsIGJ1ZmZlci0+aGVpZ2h0LAorICAgICAgICAgICAgICAgIGJ1ZmZlci0+Zm9ybWF0LCBidWZmZXItPnVzYWdlLCBidWZmZXItPnN0cmlkZSk7CisgICAgICAgIG1BbGxvY2F0b3JNdXRleC5sb2NrKCk7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1BbGxvY2F0b3ItPnByaW9yR3JhcGhpY0FsbG9jYXRpb24oaGFuZGxlLCAmYWxsb2MpOworICAgICAgICBtQWxsb2NhdG9yTXV0ZXgudW5sb2NrKCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2sgPQorICAgICAgICAgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jKTsKKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrKG5ldyBDMldvcmspOworICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCkwOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gbUZyYW1lSW5kZXguZmV0Y2hfYWRkKAorICAgICAgICAgICAgICAgIDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYzJCdWZmZXIoCisgICAgICAgICAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgICAgICAgICBuZXcgQnVmZmVyMkQoYmxvY2stPnNoYXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJSZWN0KGJsb2NrLT53aWR0aCgpLCBibG9jay0+aGVpZ2h0KCkpLCA6OkMyRmVuY2UoKSkpLAorICAgICAgICAgICAgICAgIFtidWZmZXJJZCwgc3JjID0gbVNvdXJjZV0oQzJCdWZmZXIqIHB0cikgeworICAgICAgICAgICAgICAgICAgICBkZWxldGUgcHRyOworICAgICAgICAgICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyU291cmNlPiBzb3VyY2UgPSBzcmMucHJvbW90ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZClzb3VyY2UtPm9uSW5wdXRCdWZmZXJFbXB0aWVkKGJ1ZmZlcklkLCAtMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5wdXNoX2JhY2soYzJCdWZmZXIpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworCisgICAgICAgIGVyciA9IGNvbXBRdWV1ZSgmaXRlbXMpOworICAgICAgICByZXR1cm4gKGVyciA9PSBDMl9PSykgPyBPSyA6IFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdWJtaXRFb3MoaW50MzJfdCAvKiBidWZmZXJJZCAqLykgb3ZlcnJpZGUgeworICAgICAgICBBTE9HVigiSW1wbDo6c3VibWl0RW9zIik7CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yayhuZXcgQzJXb3JrKTsKKyAgICAgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpMDsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gbUZyYW1lSW5kZXguZmV0Y2hfYWRkKAorICAgICAgICAgICAgICAgIDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICAgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gY29tcFF1ZXVlKCZpdGVtcyk7CisgICAgICAgIHJldHVybiAoZXJyID09IEMyX09LKSA/IE9LIDogVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICB2b2lkIGRpc3BhdGNoRGF0YVNwYWNlQ2hhbmdlZCgKKyAgICAgICAgICAgIGludDMyX3QgZGF0YVNwYWNlLCBpbnQzMl90IGFzcGVjdHMsIGludDMyX3QgcGl4ZWxGb3JtYXQpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVE9ETworICAgICAgICAodm9pZClkYXRhU3BhY2U7CisgICAgICAgICh2b2lkKWFzcGVjdHM7CisgICAgICAgICh2b2lkKXBpeGVsRm9ybWF0OworICAgIH0KKworcHJpdmF0ZToKKyAgICBjMl9zdGF0dXNfdCBjb21wUXVlcnkoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IGhlYXBQYXJhbXMpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBjb21wID0gbUNvbXAubG9jaygpOworICAgICAgICBpZiAoY29tcCkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmID0gY29tcC0+aW50ZigpOworICAgICAgICAgICAgaWYgKGludGYpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW50Zi0+cXVlcnlfdmIoc3RhY2tQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heUJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFwUGFyYW1zKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImNvbXBRdWVyeSAtLSBjb21wb25lbnQgZG9lcyBub3QgaGF2ZSBhbiBpbnRlcmZhY2UuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9TVEFURTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIW1SZW1vdGVDb21wKSB7CisgICAgICAgICAgICBBTE9HRCgiY29tcFF1ZXJ5IC0tIGNvbXBvbmVudCBubyBsb25nZXIgZXhpc3RzLiIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9TVEFURTsKKyAgICAgICAgfQorCisgICAgICAgIGhpZGxfdmVjPFBhcmFtSW5kZXg+IGluZGljZXMoCisgICAgICAgICAgICAgICAgc3RhY2tQYXJhbXMuc2l6ZSgpICsgaGVhcFBhcmFtSW5kaWNlcy5zaXplKCkpOworICAgICAgICBzaXplX3QgbnVtSW5kaWNlcyA9IDA7CisgICAgICAgIGZvciAoQzJQYXJhbSogY29uc3QmIHN0YWNrUGFyYW0gOiBzdGFja1BhcmFtcykgeworICAgICAgICAgICAgaWYgKCFzdGFja1BhcmFtKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImNvbXBRdWVyeSAtLSBudWxsIHN0YWNrIHBhcmFtIGVuY291bnRlcmVkLiIpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kaWNlc1tudW1JbmRpY2VzKytdID0gc3RhdGljX2Nhc3Q8UGFyYW1JbmRleD4oc3RhY2tQYXJhbS0+aW5kZXgoKSk7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZV90IG51bVN0YWNrSW5kaWNlcyA9IG51bUluZGljZXM7CisgICAgICAgIGZvciAoY29uc3QgQzJQYXJhbTo6SW5kZXgmIGluZGV4IDogaGVhcFBhcmFtSW5kaWNlcykgeworICAgICAgICAgICAgaW5kaWNlc1tudW1JbmRpY2VzKytdID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1JbmRleD4oc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGluZGV4KSk7CisgICAgICAgIH0KKyAgICAgICAgaW5kaWNlcy5yZXNpemUobnVtSW5kaWNlcyk7CisgICAgICAgIGlmIChoZWFwUGFyYW1zKSB7CisgICAgICAgICAgICBoZWFwUGFyYW1zLT5yZXNlcnZlKGhlYXBQYXJhbXMtPnNpemUoKSArIG51bUluZGljZXMpOworICAgICAgICB9CisgICAgICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbVJlbW90ZUNvbXAtPnF1ZXJ5KAorICAgICAgICAgICAgICAgIGluZGljZXMsCisgICAgICAgICAgICAgICAgbWF5QmxvY2sgPT0gQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmbnVtU3RhY2tJbmRpY2VzLCAmc3RhY2tQYXJhbXMsIGhlYXBQYXJhbXNdKAorICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsIGNvbnN0IFBhcmFtcyYgcCkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0sgJiYgc3RhdHVzICE9IEMyX0JBRF9JTkRFWCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoImNvbXBRdWVyeSAtLSBjYWxsIGZhaWxlZDogJXMuIiwgYXNTdHJpbmcoc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtUG9pbnRlcnM7CisgICAgICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IHBhcnNlU3RhdHVzID0gcGFyc2VQYXJhbXNCbG9iKCZwYXJhbVBvaW50ZXJzLCBwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlU3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiY29tcFF1ZXJ5IC0tIGVycm9yIHdoaWxlIHBhcnNpbmcgcGFyYW1zOiAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcocGFyc2VTdGF0dXMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHBhcnNlU3RhdHVzOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gcGFyYW1Qb2ludGVycy5iZWdpbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IHBhcmFtUG9pbnRlcnMuZW5kKCk7ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbSogcGFyYW1Qb2ludGVyID0gKml0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bVN0YWNrSW5kaWNlcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLW51bVN0YWNrSW5kaWNlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtUG9pbnRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiY29tcFF1ZXJ5IC0tIG51bGwgc3RhY2sgcGFyYW0uIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IHN0YWNrUGFyYW1zLnNpemUoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0YWNrUGFyYW1zW2ldOyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpIDwgc3RhY2tQYXJhbXMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tQYXJhbXNbaV0tPmluZGV4KCkgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtUG9pbnRlci0+aW5kZXgoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiY29tcFF1ZXJ5IC0tIHBhcmFtIHNraXBwZWQuIGluZGV4ID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja1BhcmFtc1tpXS0+aW5kZXgoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja1BhcmFtc1tpKytdLT5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YWNrUGFyYW1zW2krK10tPnVwZGF0ZUZyb20oKnBhcmFtUG9pbnRlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoImNvbXBRdWVyeSAtLSBwYXJhbSB1cGRhdGUgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmRleCA9ICVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4ocGFyYW1Qb2ludGVyLT5pbmRleCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtUG9pbnRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiY29tcFF1ZXJ5IC0tIG51bGwgaGVhcCBwYXJhbS4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGVhcFBhcmFtcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiY29tcFF1ZXJ5IC0tIHRvbyBtYW55IHN0YWNrIHBhcmFtcy4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBQYXJhbXMtPmVtcGxhY2VfYmFjayhDMlBhcmFtOjpDb3B5KCpwYXJhbVBvaW50ZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dEKCJjb21wUXVlcnkgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIGMyX3N0YXR1c190IGNvbXBRdWV1ZShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBpdGVtcykgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IGNvbXAgPSBtQ29tcC5sb2NrKCk7CisgICAgICAgIGlmIChjb21wKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcC0+cXVldWVfbmIoaXRlbXMpOworICAgICAgICB9CisKKyAgICAgICAgV29ya0J1bmRsZSB3b3JrQnVuZGxlOworICAgICAgICBTdGF0dXMgaGlkbFN0YXR1cyA9IG9iamNweSgmd29ya0J1bmRsZSwgKml0ZW1zLCBudWxscHRyKTsKKyAgICAgICAgaWYgKGhpZGxTdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgQUxPR0QoImNvbXBRdWV1ZSAtLSBiYWQgaW5wdXQuIik7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gbVJlbW90ZUNvbXAtPnF1ZXVlKHdvcmtCdW5kbGUpOworICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0QoImNvbXBRdWV1ZSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIik7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR1YoImNvbXBRdWV1ZSAtLSBjYWxsIGZhaWxlZDogJXMuIiwgYXNTdHJpbmcoc3RhdHVzKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB3cDxHcmFwaGljQnVmZmVyU291cmNlPiBtU291cmNlOworICAgIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IG1Db21wOworICAgIHNwPElDb21wb25lbnQ+IG1SZW1vdGVDb21wOworICAgIHN0ZDo6c3RyaW5nIG1Db21wTmFtZTsKKworICAgIC8vIE5lZWRlZCBmb3IgQ29tcG9uZW50V3JhcHBlciBpbXBsZW1lbnRhdGlvbgorICAgIHN0ZDo6bXV0ZXggbUFsbG9jYXRvck11dGV4OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKyAgICBzdGQ6OmF0b21pY191aW50NjRfdCBtRnJhbWVJbmRleDsKK307CisKK0lucHV0U3VyZmFjZUNvbm5lY3Rpb246OklucHV0U3VyZmFjZUNvbm5lY3Rpb24oCisgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4mIGNvbXApIDoKKyAgICBtU291cmNlKHNvdXJjZSksCisgICAgbUltcGwobmV3IEltcGwoc291cmNlLCBjb21wKSkgeworfQorCitJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uKAorICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlLAorICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50PiYgY29tcCkgOgorICAgIG1Tb3VyY2Uoc291cmNlKSwKKyAgICBtSW1wbChuZXcgSW1wbChzb3VyY2UsIGNvbXApKSB7Cit9CisKK0lucHV0U3VyZmFjZUNvbm5lY3Rpb246On5JbnB1dFN1cmZhY2VDb25uZWN0aW9uKCkgeworICAgIGlmIChtU291cmNlKSB7CisgICAgICAgICh2b2lkKW1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgKHZvaWQpbVNvdXJjZS0+cmVsZWFzZSgpOworICAgICAgICBtU291cmNlLmNsZWFyKCk7CisgICAgfQorICAgIG1JbXBsLmNsZWFyKCk7Cit9CisKK2Jvb2wgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbjo6aW5pdCgpIHsKKyAgICBtTXV0ZXgubG9jaygpOworICAgIHNwPEltcGw+IGltcGwgPSBtSW1wbDsKKyAgICBtTXV0ZXgudW5sb2NrKCk7CisKKyAgICBpZiAoIWltcGwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gaW1wbC0+aW5pdCgpOworfQorCitSZXR1cm48U3RhdHVzPiBJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpkaXNjb25uZWN0KCkgeworICAgIEFMT0dWKCJkaXNjb25uZWN0Iik7CisgICAgbU11dGV4LmxvY2soKTsKKyAgICBpZiAobVNvdXJjZSkgeworICAgICAgICAodm9pZCltU291cmNlLT5zdG9wKCk7CisgICAgICAgICh2b2lkKW1Tb3VyY2UtPnJlbGVhc2UoKTsKKyAgICAgICAgbVNvdXJjZS5jbGVhcigpOworICAgIH0KKyAgICBtSW1wbC5jbGVhcigpOworICAgIG1NdXRleC51bmxvY2soKTsKKyAgICBBTE9HVigiZGlzY29ubmVjdGVkIik7CisgICAgcmV0dXJuIFN0YXR1czo6T0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTA4MjI2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudC5oCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTVBPTkVOVF9ICisjZGVmaW5lIENPREVDMl9ISURMX1YxXzBfVVRJTFNfQ09NUE9ORU5UX0gKKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db25maWd1cmFibGUuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSUNsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50TGlzdGVuZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDxod2JpbmRlci9JQmluZGVyLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzIuaD4KKworI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpJQmluZGVyOwordXNpbmcgOjphbmRyb2lkOjpzcDsKK3VzaW5nIDo6YW5kcm9pZDo6d3A7CisKK3N0cnVjdCBDb21wb25lbnRTdG9yZTsKKworc3RydWN0IENvbXBvbmVudEludGVyZmFjZSA6IHB1YmxpYyBDb25maWd1cmFibGU8SUNvbXBvbmVudEludGVyZmFjZT4geworICAgIENvbXBvbmVudEludGVyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4mIGludGVyZmFjZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPENvbXBvbmVudFN0b3JlPiYgc3RvcmUpOworICAgIGMyX3N0YXR1c190IHN0YXR1cygpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgYzJfc3RhdHVzX3QgbUluaXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBtSW50ZXJmYWNlOworICAgIHNwPENvbXBvbmVudFN0b3JlPiBtU3RvcmU7Cit9OworCitzdHJ1Y3QgQ29tcG9uZW50IDogcHVibGljIENvbmZpZ3VyYWJsZTxJQ29tcG9uZW50PiB7CisgICAgQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiYsCisgICAgICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIGNvbnN0IHNwPENvbXBvbmVudFN0b3JlPiYgc3RvcmUsCisgICAgICAgICAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6CisgICAgICAgICAgICAgICAgSUNsaWVudE1hbmFnZXI+JiBjbGllbnRQb29sTWFuYWdlcik7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3Q7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisKKyAgICAvLyBNZXRob2RzIGZyb20gSUNvbXBvbmVudCBmb2xsb3cuCisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBxdWV1ZShjb25zdCBXb3JrQnVuZGxlJiB3b3JrQnVuZGxlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBmbHVzaChmbHVzaF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBkcmFpbihib29sIHdpdGhFb3MpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gc2V0T3V0cHV0U3VyZmFjZSgKKyAgICAgICAgICAgIHVpbnQ2NF90IGJsb2NrUG9vbElkLAorICAgICAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHN1cmZhY2UpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gY29ubmVjdFRvT214SW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHByb2R1Y2VyLAorICAgICAgICAgICAgY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclNvdXJjZT4mIHNvdXJjZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBkaXNjb25uZWN0RnJvbUlucHV0U3VyZmFjZSgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgICAgIHVpbnQzMl90IGFsbG9jYXRvcklkLAorICAgICAgICAgICAgY3JlYXRlQmxvY2tQb29sX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxTdGF0dXM+IGRlc3Ryb3lCbG9ja1Bvb2wodWludDY0X3QgYmxvY2tQb29sSWQpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gc3RhcnQoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxTdGF0dXM+IHN0b3AoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxTdGF0dXM+IHJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiByZWxlYXNlKCkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICBjMl9zdGF0dXNfdCBtSW5pdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IG1Db21wb25lbnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBtSW50ZXJmYWNlOworICAgIHNwPElDb21wb25lbnRMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIHNwPENvbXBvbmVudFN0b3JlPiBtU3RvcmU7CisgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjp1dGlsczo6RGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXIKKyAgICAgICAgICAgIG1CdWZmZXJQb29sU2VuZGVyOworCisgICAgc3RkOjptdXRleCBtQmxvY2tQb29sc011dGV4OworICAgIC8vIFRoaXMgbWFwIGtlZXBzIEMyQmxvY2tQb29sIG9iamVjdHMgdGhhdCBhcmUgY3JlYXRlZCBieSBjcmVhdGVCbG9ja1Bvb2woKQorICAgIC8vIGFsaXZlLiBUaGVzZSBDMkJsb2NrUG9vbCBvYmplY3RzIGNhbiBiZSBkZWxldGVkIGJ5IGNhbGxpbmcKKyAgICAvLyBkZXN0cm95QmxvY2tQb29sKCksIHJlc2V0KCkgb3IgcmVsZWFzZSgpLCBvciBieSBkZXN0cm95aW5nIHRoZSBjb21wb25lbnQuCisgICAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4+IG1CbG9ja1Bvb2xzOworCisgICAgLy8gVGhpcyBzdHJ1Y3QgaXMgYSBjb21wYXJhYmxlIHdyYXBwZXIgZm9yIElDb21wb25lbnQuCisgICAgLy8KKyAgICAvLyBBbiBJQ29tcG9uZW50IG9iamVjdCBpcyBlaXRoZXIgbG9jYWwgb3IgcmVtb3RlLiBJZiBpdCBpcyBsb2NhbCwgd2UgY2FuCisgICAgLy8gdXNlIHRoZSB1bmRlcmx5aW5nIHBvaW50ZXIgYXMgYSBrZXkuIElmIGl0IGlzIHJlbW90ZSwgd2UgaGF2ZSB0byB1c2UgdGhlCisgICAgLy8gdW5kZXJseWluZyBwb2ludGVyIG9mIHRoZSBhc3NvY2lhdGVkIGJpbmRlciBvYmplY3QgYXMgYSBrZXkuCisgICAgLy8KKyAgICAvLyBTZWUgaW50ZXJmYWNlc0VxdWFsKCkgZm9yIG1vcmUgZGV0YWlsLgorICAgIHN0cnVjdCBJbnRlcmZhY2VLZXkgeworICAgICAgICAvLyBBbiBJbnRlcmZhY2VLZXkgaXMgY29uc3RydWN0ZWQgZnJvbSBJQ29tcG9uZW50LgorICAgICAgICBJbnRlcmZhY2VLZXkoY29uc3Qgc3A8SUNvbXBvbmVudD4mIGNvbXBvbmVudCk7CisgICAgICAgIC8vIG9wZXJhdG9yPCBpcyBkZWZpbmVkIGhlcmUgdG8gY29udHJvbCB0aGUgZGVmYXVsdCBkZWZpbml0aW9uIG9mCisgICAgICAgIC8vIHN0ZDo6bGVzczxJbnRlcmZhY2VLZXk+LCB3aGljaCB3aWxsIGJlIHVzZWQgaW4gdHlwZSBSb3N0ZXIgZGVmaW5lZAorICAgICAgICAvLyBiZWxvdy4KKyAgICAgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgSW50ZXJmYWNlS2V5JiBvdGhlcikgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGlzUmVtb3RlID8KKyAgICAgICAgICAgICAgICAgICAgKG90aGVyLmlzUmVtb3RlID8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW90ZSAmIHJlbW90ZQorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsZXNzPElCaW5kZXIqPigpKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZS51bnNhZmVfZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIucmVtb3RlLnVuc2FmZV9nZXQoKSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3RlICYgbG9jYWwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSA6CisgICAgICAgICAgICAgICAgICAgIChvdGhlci5pc1JlbW90ZSA/CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2NhbCAmIHJlbW90ZQorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSA6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2NhbCAmIGxvY2FsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omxlc3M8SUNvbXBvbmVudCo+KCkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWwudW5zYWZlX2dldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLmxvY2FsLnVuc2FmZV9nZXQoKSkpOworICAgICAgICB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgYm9vbCBpc1JlbW90ZTsKKyAgICAgICAgd3A8SUJpbmRlcj4gcmVtb3RlOworICAgICAgICB3cDxJQ29tcG9uZW50PiBsb2NhbDsKKyAgICB9OworCisgICAgdHlwZWRlZiBzdGQ6Om1hcDxJbnRlcmZhY2VLZXksIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+PiBSb3N0ZXI7CisgICAgdHlwZWRlZiBSb3N0ZXI6OmNvbnN0X2l0ZXJhdG9yIExvY2FsSWQ7CisgICAgTG9jYWxJZCBtTG9jYWxJZDsKKyAgICB2b2lkIHNldExvY2FsSWQoY29uc3QgTG9jYWxJZCYgbG9jYWxJZCk7CisKKyAgICB2b2lkIGluaXRMaXN0ZW5lcihjb25zdCBzcDxDb21wb25lbnQ+JiBzZWxmKTsKKworICAgIHZpcnR1YWwgfkNvbXBvbmVudCgpIG92ZXJyaWRlOworCisgICAgZnJpZW5kIHN0cnVjdCBDb21wb25lbnRTdG9yZTsKKworICAgIHN0cnVjdCBMaXN0ZW5lcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT01QT05FTlRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudFN0b3JlLmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWUxNDE2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudFN0b3JlLmgKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX1YxXzBfVVRJTFNfQ09NUE9ORU5UU1RPUkVfSAorI2RlZmluZSBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTVBPTkVOVFNUT1JFX0gKKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29uZmlndXJhYmxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudFN0b3JlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDxDMi5oPgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUNsaWVudE1hbmFnZXI7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOwordXNpbmcgOjphbmRyb2lkOjp3cDsKKworc3RydWN0IENvbXBvbmVudFN0b3JlIDogcHVibGljIENvbmZpZ3VyYWJsZTxJQ29tcG9uZW50U3RvcmU+IHsKKyAgICBDb21wb25lbnRTdG9yZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4mIHN0b3JlKTsKKyAgICB2aXJ0dWFsIH5Db21wb25lbnRTdG9yZSgpID0gZGVmYXVsdDsKKworICAgIGMyX3N0YXR1c190IHN0YXR1cygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Jbml0OworICAgIH0KKworICAgIGMyX3N0YXR1c190IHZhbGlkYXRlU3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4mIHBhcmFtcyk7CisKKyAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29tcG9uZW50U3RvcmUKKyAgICBSZXR1cm48dm9pZD4gY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUsCisgICAgICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiYgcG9vbCwKKyAgICAgICAgICAgIGNyZWF0ZUNvbXBvbmVudF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgUmV0dXJuPHZvaWQ+IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgY3JlYXRlSW50ZXJmYWNlX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKyAgICBSZXR1cm48dm9pZD4gbGlzdENvbXBvbmVudHMobGlzdENvbXBvbmVudHNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworICAgIFJldHVybjxzcDxJSW5wdXRTdXJmYWNlPj4gY3JlYXRlSW5wdXRTdXJmYWNlKCkgb3ZlcnJpZGU7CisgICAgUmV0dXJuPHZvaWQ+IGdldFN0cnVjdERlc2NyaXB0b3JzKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDMyX3Q+JiBpbmRpY2VzLAorICAgICAgICAgICAgZ2V0U3RydWN0RGVzY3JpcHRvcnNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworICAgIFJldHVybjxzcDxJQ2xpZW50TWFuYWdlcj4+IGdldFBvb2xDbGllbnRNYW5hZ2VyKCkgb3ZlcnJpZGU7CisgICAgUmV0dXJuPFN0YXR1cz4gY29weUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IEJ1ZmZlciYgc3JjLAorICAgICAgICAgICAgY29uc3QgQnVmZmVyJiBkc3QpIG92ZXJyaWRlOworCisgICAgLy8gRGVidWcgZHVtcAorICAgIFJldHVybjx2b2lkPiBkZWJ1ZygKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfaGFuZGxlJiBoYW5kbGUsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4mIGFyZ3MpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgLy8gZG9lcyBib29ra2VlcGluZyBmb3IgYW4gaW50ZXJmYWNlIHRoYXQgaGFzIGJlZW4gbG9hZGVkCisgICAgdm9pZCBvbkludGVyZmFjZUxvYWRlZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICZpbnRmKTsKKworICAgIGMyX3N0YXR1c190IG1Jbml0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBtU3RvcmU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IG1QYXJhbVJlZmxlY3RvcjsKKworICAgIHN0ZDo6bWFwPEMyUGFyYW06OkNvcmVJbmRleCwgc3RkOjpzaGFyZWRfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4+IG1TdHJ1Y3REZXNjcmlwdG9yczsKKyAgICBzdGQ6OnNldDxDMlBhcmFtOjpDb3JlSW5kZXg+IG1VbnN1cHBvcnRlZFN0cnVjdERlc2NyaXB0b3JzOworICAgIHN0ZDo6c2V0PEMyU3RyaW5nPiBtTG9hZGVkSW50ZXJmYWNlczsKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbVN0cnVjdERlc2NyaXB0b3JzTXV0ZXg7CisKKyAgICAvLyBDb21wb25lbnQgbGlmZXRpbWUgbWFuYWdlbWVudAorICAgIENvbXBvbmVudDo6Um9zdGVyIG1Db21wb25lbnRSb3N0ZXI7CisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1Db21wb25lbnRSb3N0ZXJNdXRleDsKKyAgICB2b2lkIHJlcG9ydENvbXBvbmVudERlYXRoKGNvbnN0IENvbXBvbmVudDo6TG9jYWxJZCYgY29tcG9uZW50TG9jYWxJZCk7CisKKyAgICBmcmllbmQgQ29tcG9uZW50OworCisgICAgLy8gQzJDb21wb25lbnQgbG9va3VwCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBmaW5kQzJDb21wb25lbnQoCisgICAgICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50PiYgY29tcG9uZW50KSBjb25zdDsKKworICAgIGZyaWVuZCBzdHJ1Y3QgSW5wdXRTdXJmYWNlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTVBPTkVOVFNUT1JFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db25maWd1cmFibGUuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db25maWd1cmFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTMzYTZmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbmZpZ3VyYWJsZS5oCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTkZJR1VSQUJMRV9ICisjZGVmaW5lIENPREVDMl9ISURMX1YxXzBfVVRJTFNfQ09ORklHVVJBQkxFX0gKKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db25maWd1cmFibGVDMkludGYuaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29uZmlndXJhYmxlLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQ29tcG9uZW50U3RvcmU7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIElDb25maWd1cmFibGUgaW50ZXJmYWNlIHRoYXQgc3VwcG9ydHMgY2FjaGluZyBvZgorICogc3VwcG9ydGVkIHBhcmFtZXRlcnMgZnJvbSBhIHN1cHBsaWVkIENvbXBvbmVudFN0b3JlLgorICoKKyAqIFRoaXMgaXMgbWFpbmx5IHRoZSBzYW1lIGZvciBhbGwgb2YgdGhlIGNvbmZpZ3VyYWJsZSBDMiBpbnRlcmZhY2VzIHRob3VnaAorICogdGhlcmUgYXJlIHNsaWdodCBkaWZmZXJlbmNlcyBpbiB0aGUgYmxvY2tpbmcgYmVoYXZpb3IuIFRoaXMgaXMgaGFuZGxlZCBpbiB0aGUKKyAqIENvbmZpZ3VyYWJsZUMySW50ZiBpbXBsZW1lbnRhdGlvbnMuCisgKi8KK3N0cnVjdCBDYWNoZWRDb25maWd1cmFibGUgOiBwdWJsaWMgSUNvbmZpZ3VyYWJsZSB7CisgICAgQ2FjaGVkQ29uZmlndXJhYmxlKHN0ZDo6dW5pcXVlX3B0cjxDb25maWd1cmFibGVDMkludGY+JiYgaW50Zik7CisKKyAgICBjMl9zdGF0dXNfdCBpbml0KENvbXBvbmVudFN0b3JlKiBzdG9yZSk7CisKKyAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29uZmlndXJhYmxlCisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBnZXROYW1lKGdldE5hbWVfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gcXVlcnkoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50MzJfdD4mIGluZGljZXMsCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgcXVlcnlfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gY29uZmlnKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGluUGFyYW1zLAorICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgIGNvbmZpZ19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHVpbnQzMl90IHN0YXJ0LAorICAgICAgICAgICAgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICBxdWVyeVN1cHBvcnRlZFBhcmFtc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+JiBpbkZpZWxkcywKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICBxdWVyeVN1cHBvcnRlZFZhbHVlc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBDb21tb24gQ29kZWMyLjAgaW50ZXJmYWNlIHdyYXBwZXIKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlndXJhYmxlQzJJbnRmPiBtSW50ZjsKKworICAgIC8vIENhY2hlZCBzdXBwb3J0ZWQgcGFyYW1zCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gbVN1cHBvcnRlZFBhcmFtczsKK307CisKKy8qKgorICogVGVtcGxhdGUgdGhhdCBpbXBsZW1lbnRzIHRoZSBgSUNvbmZpZ3VyYWJsZWAgaW50ZXJmYWNlIGZvciBhbiBpbmhlcml0ZWQKKyAqIGludGVyZmFjZS4gQ2xhc3NlcyB0aGF0IGltcGxlbWVudCBhIGNoaWxkIGludGVyZmFjZSBgSWAgb2YgYElDb25maWd1cmFibGVgCisgKiBjYW4gZGVyaXZlIGZyb20gYENvbmZpZ3VyYWJsZTxJPmAuCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBJPgorc3RydWN0IENvbmZpZ3VyYWJsZSA6IHB1YmxpYyBJIHsKKyAgICBDb25maWd1cmFibGUoY29uc3Qgc3A8Q2FjaGVkQ29uZmlndXJhYmxlPiYgaW50Zik6IG1JbnRmKGludGYpIHsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBpbml0KENvbXBvbmVudFN0b3JlKiBzdG9yZSkgeworICAgICAgICByZXR1cm4gbUludGYtPmluaXQoc3RvcmUpOworICAgIH0KKworICAgIC8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb25maWd1cmFibGUKKworICAgIHVzaW5nIGdldE5hbWVfY2IgPSB0eXBlbmFtZSBJOjpnZXROYW1lX2NiOworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGdldE5hbWUoZ2V0TmFtZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUludGYtPmdldE5hbWUoX2hpZGxfY2IpOworICAgIH0KKworICAgIHVzaW5nIHF1ZXJ5X2NiID0gdHlwZW5hbWUgSTo6cXVlcnlfY2I7CisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gcXVlcnkoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50MzJfdD4mIGluZGljZXMsCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgcXVlcnlfY2IgX2hpZGxfY2IpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbnRmLT5xdWVyeShpbmRpY2VzLCBtYXlCbG9jaywgX2hpZGxfY2IpOworICAgIH0KKworICAgIHVzaW5nIGNvbmZpZ19jYiA9IHR5cGVuYW1lIEk6OmNvbmZpZ19jYjsKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBjb25maWcoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaW5QYXJhbXMsCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgY29uZmlnX2NiIF9oaWRsX2NiKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW50Zi0+Y29uZmlnKGluUGFyYW1zLCBtYXlCbG9jaywgX2hpZGxfY2IpOworICAgIH0KKworICAgIHVzaW5nIHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX2NiID0gdHlwZW5hbWUgSTo6cXVlcnlTdXBwb3J0ZWRQYXJhbXNfY2I7CisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gcXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICB1aW50MzJfdCBzdGFydCwKKyAgICAgICAgICAgIHVpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgcXVlcnlTdXBwb3J0ZWRQYXJhbXNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbnRmLT5xdWVyeVN1cHBvcnRlZFBhcmFtcyhzdGFydCwgY291bnQsIF9oaWRsX2NiKTsKKyAgICB9CisKKyAgICB1c2luZyBxdWVyeVN1cHBvcnRlZFZhbHVlc19jYiA9IHR5cGVuYW1lIEk6OnF1ZXJ5U3VwcG9ydGVkVmFsdWVzX2NiOworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8RmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4mIGluRmllbGRzLAorICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgIHF1ZXJ5U3VwcG9ydGVkVmFsdWVzX2NiIF9oaWRsX2NiKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW50Zi0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoaW5GaWVsZHMsIG1heUJsb2NrLCBfaGlkbF9jYik7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgc3A8Q2FjaGVkQ29uZmlndXJhYmxlPiBtSW50ZjsKK307CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT05GSUdVUkFCTEVfSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbmZpZ3VyYWJsZUMySW50Zi5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbmZpZ3VyYWJsZUMySW50Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ODAxYmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29uZmlndXJhYmxlQzJJbnRmLmgKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT05GSUdVUkFCTEVDMklOVEZfSAorI2RlZmluZSBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTkZJR1VSQUJMRUMySU5URl9ICisKKyNpbmNsdWRlIDxDMldvcmsuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDxDMi5oPgorCisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyA6OmFuZHJvaWQ6OnNwOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7CisKKy8qKgorICogQ29tbW9uIENvZGVjIDIuMCBpbnRlcmZhY2Ugd3JhcHBlci4KKyAqLworc3RydWN0IENvbmZpZ3VyYWJsZUMySW50ZiB7CisgICAgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9CisgICAgLyoqIEMyQ29tcG9uZW50SW50ZXJmYWNlOjpxdWVyeV92YiBzYW5zIHN0YWNrIHBhcmFtcyAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnkoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgcGFyYW1zKSBjb25zdCA9IDA7CisgICAgLyoqIEMyQ29tcG9uZW50SW50ZXJmYWNlOjpjb25maWdfdmIgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpID0gMDsKKyAgICAvKiogQzJDb21wb25lbnRJbnRlcmZhY2U6OnF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+KiBjb25zdCBwYXJhbXMpIGNvbnN0ID0gMDsKKyAgICAvKiogQzJDb21wb25lbnRJbnRlcmZhY2U6OnF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4mIGZpZWxkcywgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3QgPSAwOworCisgICAgdmlydHVhbCB+Q29uZmlndXJhYmxlQzJJbnRmKCkgPSBkZWZhdWx0OworCisgICAgQ29uZmlndXJhYmxlQzJJbnRmKGNvbnN0IEMyU3RyaW5nJiBuYW1lKSA6IG1OYW1lKG5hbWUpIHt9CisKK3Byb3RlY3RlZDoKKyAgICBDMlN0cmluZyBtTmFtZTsgLyogY2FjaGUgY29tcG9uZW50IG5hbWUgKi8KK307CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT05GSUdVUkFCTEVDMklOVEZfSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZS5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZjI1OGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvSW5wdXRTdXJmYWNlLmgKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX1YxXzBfVVRJTFNfSU5QVVRTVVJGQUNFX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfVjFfMF9VVElMU19JTlBVVFNVUkZBQ0VfSAorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudFN0b3JlLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JSW5wdXRTdXJmYWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9idWZmZXJxdWV1ZS8xLjAvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYnVmZmVycXVldWUvMS4wL0lQcm9kdWNlckxpc3RlbmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9jb21tb24vMS4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgorCisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisKK2NsYXNzIEMyUmVmbGVjdG9ySGVscGVyOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6VjFfMDo6QW53QnVmZmVyOworCitzdHJ1Y3QgSW5wdXRTdXJmYWNlIDogcHVibGljIElJbnB1dFN1cmZhY2UgeworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlIElCYXNlOworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OgorICAgICAgICAgICAgSVByb2R1Y2VyTGlzdGVuZXIgSFByb2R1Y2VyTGlzdGVuZXI7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6CisgICAgICAgICAgICBHcmFwaGljQnVmZmVyU291cmNlIEdyYXBoaWNCdWZmZXJTb3VyY2U7CisKKy8vIFR5cGUgZGlzYW1iaWd1YXRpb24KKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpTdGF0dXMgU3RhdHVzOworCisvLyBOZXcgbWV0aG9kcyBmcm9tIElJbnB1dFN1cmZhY2UKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNvbm5lY3RUb0NvbXBvbmVudCgKKyAgICAgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICBjb25uZWN0VG9Db21wb25lbnRfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IGdldENvbmZpZ3VyYWJsZSgpIG92ZXJyaWRlOworCisvLyBNZXRob2RzIGRlcml2ZWQgZnJvbSBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyCisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiByZXF1ZXN0QnVmZmVyKAorICAgICAgICAgICAgaW50MzJfdCBzbG90LAorICAgICAgICAgICAgcmVxdWVzdEJ1ZmZlcl9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjxpbnQzMl90PiBzZXRNYXhEZXF1ZXVlZEJ1ZmZlckNvdW50KAorICAgICAgICAgICAgaW50MzJfdCBtYXhEZXF1ZXVlZEJ1ZmZlcnMpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48aW50MzJfdD4gc2V0QXN5bmNNb2RlKAorICAgICAgICAgICAgYm9vbCBhc3luYykgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBkZXF1ZXVlQnVmZmVyKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsCisgICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICBQaXhlbEZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICB1aW50MzJfdCB1c2FnZSwKKyAgICAgICAgICAgIGJvb2wgZ2V0RnJhbWVUaW1lc3RhbXBzLAorICAgICAgICAgICAgZGVxdWV1ZUJ1ZmZlcl9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjxpbnQzMl90PiBkZXRhY2hCdWZmZXIoCisgICAgICAgICAgICBpbnQzMl90IHNsb3QpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gZGV0YWNoTmV4dEJ1ZmZlcigKKyAgICAgICAgICAgIGRldGFjaE5leHRCdWZmZXJfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gYXR0YWNoQnVmZmVyKAorICAgICAgICAgICAgY29uc3QgQW53QnVmZmVyJiBidWZmZXIsCisgICAgICAgICAgICBhdHRhY2hCdWZmZXJfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gcXVldWVCdWZmZXIoCisgICAgICAgICAgICBpbnQzMl90IHNsb3QsCisgICAgICAgICAgICBjb25zdCBRdWV1ZUJ1ZmZlcklucHV0JiBpbnB1dCwKKyAgICAgICAgICAgIHF1ZXVlQnVmZmVyX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPGludDMyX3Q+IGNhbmNlbEJ1ZmZlcigKKyAgICAgICAgICAgIGludDMyX3Qgc2xvdCwKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfaGFuZGxlJiBmZW5jZSkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBxdWVyeSgKKyAgICAgICAgICAgIGludDMyX3Qgd2hhdCwKKyAgICAgICAgICAgIHF1ZXJ5X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNvbm5lY3QoCisgICAgICAgICAgICBjb25zdCBzcDxIUHJvZHVjZXJMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgaW50MzJfdCBhcGksCisgICAgICAgICAgICBib29sIHByb2R1Y2VyQ29udHJvbGxlZEJ5QXBwLAorICAgICAgICAgICAgY29ubmVjdF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjxpbnQzMl90PiBkaXNjb25uZWN0KAorICAgICAgICAgICAgaW50MzJfdCBhcGksCisgICAgICAgICAgICBEaXNjb25uZWN0TW9kZSBtb2RlKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPGludDMyX3Q+IHNldFNpZGViYW5kU3RyZWFtKAorICAgICAgICAgICAgY29uc3QgaGlkbF9oYW5kbGUmIHN0cmVhbSkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBhbGxvY2F0ZUJ1ZmZlcnMoCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIFBpeGVsRm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgIHVpbnQzMl90IHVzYWdlKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPGludDMyX3Q+IGFsbG93QWxsb2NhdGlvbigKKyAgICAgICAgICAgIGJvb2wgYWxsb3cpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48aW50MzJfdD4gc2V0R2VuZXJhdGlvbk51bWJlcigKKyAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb25OdW1iZXIpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gZ2V0Q29uc3VtZXJOYW1lKAorICAgICAgICAgICAgZ2V0Q29uc3VtZXJOYW1lX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPGludDMyX3Q+IHNldFNoYXJlZEJ1ZmZlck1vZGUoCisgICAgICAgICAgICBib29sIHNoYXJlZEJ1ZmZlck1vZGUpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48aW50MzJfdD4gc2V0QXV0b1JlZnJlc2goCisgICAgICAgICAgICBib29sIGF1dG9SZWZyZXNoKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPGludDMyX3Q+IHNldERlcXVldWVUaW1lb3V0KAorICAgICAgICAgICAgaW50NjRfdCB0aW1lb3V0TnMpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gZ2V0TGFzdFF1ZXVlZEJ1ZmZlcigKKyAgICAgICAgICAgIGdldExhc3RRdWV1ZWRCdWZmZXJfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gZ2V0RnJhbWVUaW1lc3RhbXBzKAorICAgICAgICAgICAgZ2V0RnJhbWVUaW1lc3RhbXBzX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGdldFVuaXF1ZUlkKAorICAgICAgICAgICAgZ2V0VW5pcXVlSWRfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgY2xhc3MgQ29uZmlndXJhYmxlSW1wbDsKKworcHJvdGVjdGVkOgorICAgIHNwPENvbXBvbmVudFN0b3JlPiBtU3RvcmU7CisgICAgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbUJhc2U7CisgICAgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gbVNvdXJjZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29uZmlndXJhYmxlSW1wbD4gbUhlbHBlcjsKKyAgICBzcDxDYWNoZWRDb25maWd1cmFibGU+IG1Db25maWd1cmFibGU7CisKKyAgICBJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBjb25zdCBzcDxDb21wb25lbnRTdG9yZT4mIHN0b3JlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiYgcmVmbGVjdG9yLAorICAgICAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGJhc2UsCisgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlKTsKKworICAgIHZpcnR1YWwgfklucHV0U3VyZmFjZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQ29tcG9uZW50U3RvcmU7Cit9OworCisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19JTlBVVFNVUkZBQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA0ZmE5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0hJRExfVjFfMF9VVElMU19JTlBVVFNVUkZBQ0VDT05ORUNUSU9OX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfVjFfMF9VVElMU19JTlBVVFNVUkZBQ0VDT05ORUNUSU9OX0gKKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgorCisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKK3VzaW5nIDo6YW5kcm9pZDo6R3JhcGhpY0J1ZmZlclNvdXJjZTsKKworc3RydWN0IElucHV0U3VyZmFjZUNvbm5lY3Rpb24gOiBwdWJsaWMgSUlucHV0U3VyZmFjZUNvbm5lY3Rpb24geworCisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBkaXNjb25uZWN0KCkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKworICAgIElucHV0U3VyZmFjZUNvbm5lY3Rpb24oCisgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiYgY29tcG9uZW50KTsKKworICAgIElucHV0U3VyZmFjZUNvbm5lY3Rpb24oCisgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlLAorICAgICAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudD4mIGNvbXBvbmVudCk7CisKKyAgICBib29sIGluaXQoKTsKKworICAgIGZyaWVuZCBzdHJ1Y3QgSW5wdXRTdXJmYWNlOworCisgICAgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbigpID0gZGVsZXRlOworICAgIElucHV0U3VyZmFjZUNvbm5lY3Rpb24oY29uc3QgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbiYpID0gZGVsZXRlOworICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IElucHV0U3VyZmFjZUNvbm5lY3Rpb24mKSA9IGRlbGV0ZTsKKworICAgIHN0cnVjdCBJbXBsOworCisgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gbVNvdXJjZTsKKyAgICBzcDxJbXBsPiBtSW1wbDsKKworICAgIHZpcnR1YWwgfklucHV0U3VyZmFjZUNvbm5lY3Rpb24oKSBvdmVycmlkZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19JTlBVVFNVUkZBQ0VDT05ORUNUSU9OX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC90eXBlcy5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhhNTBiNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC90eXBlcy5oCkBAIC0wLDAgKzEsMzY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9WMV8wX1VUSUxTX1RZUEVTX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfVjFfMF9VVElMU19UWVBFU19ICisKKyNpbmNsdWRlIDxjaHJvbm8+CisKKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lDbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL3R5cGVzLmg+CisjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyUGFyYW1EZWYuaD4KKyNpbmNsdWRlIDxDMldvcmsuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpzdGF0dXNfdDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OgorICAgICAgICBDb25uZWN0aW9uSWQ7Cit1c2luZyA6OmFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisKKy8vIFR5cGVzIG9mIG1ldGFkYXRhIGZvciBCbG9ja3MuCitzdHJ1Y3QgQzJIaWRsX1JhbmdlIHsKKyAgICB1aW50MzJfdCBvZmZzZXQ7CisgICAgdWludDMyX3QgbGVuZ3RoOyAvLyBEbyBub3QgdXNlICJzaXplIiBiZWNhdXNlIHRoZSBuYW1lIGNvbGxpZGVzIHdpdGggQzJJbmZvOjpzaXplKCkuCit9OwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJIaWRsX1JhbmdlLCAwPiBDMkhpZGxfUmFuZ2VJbmZvOworCitzdHJ1Y3QgQzJIaWRsX1JlY3QgeworICAgIHVpbnQzMl90IGxlZnQ7CisgICAgdWludDMyX3QgdG9wOworICAgIHVpbnQzMl90IHdpZHRoOworICAgIHVpbnQzMl90IGhlaWdodDsKK307Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMkhpZGxfUmVjdCwgMT4gQzJIaWRsX1JlY3RJbmZvOworCisvLyBDMlNldHRpbmdSZXN1bHQgLT4gU2V0dGluZ1Jlc3VsdAorU3RhdHVzIG9iamNweSgKKyAgICAgICAgU2V0dGluZ1Jlc3VsdCogZCwKKyAgICAgICAgY29uc3QgQzJTZXR0aW5nUmVzdWx0JiBzKTsKKworLy8gU2V0dGluZ1Jlc3VsdCAtPiBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PgorYzJfc3RhdHVzX3Qgb2JqY3B5KAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiogZCwKKyAgICAgICAgY29uc3QgU2V0dGluZ1Jlc3VsdCYgcyk7CisKKy8vIEMyUGFyYW1EZXNjcmlwdG9yIC0+IFBhcmFtRGVzY3JpcHRvcgorU3RhdHVzIG9iamNweSgKKyAgICAgICAgUGFyYW1EZXNjcmlwdG9yKiBkLAorICAgICAgICBjb25zdCBDMlBhcmFtRGVzY3JpcHRvciYgcyk7CisKKy8vIFBhcmFtRGVzY3JpcHRvciAtPiBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+CitjMl9zdGF0dXNfdCBvYmpjcHkoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4qIGQsCisgICAgICAgIGNvbnN0IFBhcmFtRGVzY3JpcHRvciYgcyk7CisKKy8vIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAtPiBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5CitTdGF0dXMgb2JqY3B5KAorICAgICAgICBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KiBkLAorICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkmIHMpOworCisvLyBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5IC0+IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeQorYzJfc3RhdHVzX3Qgb2JqY3B5KAorICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkqIGQsCisgICAgICAgIGNvbnN0IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkmIHMpOworCisvLyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgLT4gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdAorU3RhdHVzIG9iamNweSgKKyAgICAgICAgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdCogZCwKKyAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5JiBzKTsKKworLy8gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSwgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdCAtPiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkKK2MyX3N0YXR1c190IG9iamNweSgKKyAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KiBkLAorICAgICAgICBjb25zdCBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5JiBzcSwKKyAgICAgICAgY29uc3QgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdCYgc3IpOworCisvLyBDMkNvbXBvbmVudDo6VHJhaXRzIC0+IENvbXBvbmVudFRyYWl0cworU3RhdHVzIG9iamNweSgKKyAgICAgICAgSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHMqIGQsCisgICAgICAgIGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHMmIHMpOworCisvLyBDb21wb25lbnRUcmFpdHMgLT4gQzJDb21wb25lbnQ6OlRyYWl0cywgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4KKy8vIE5vdGU6IFRoZSBvdXRwdXQgZCBpcyBvbmx5IHZhbGlkIGFzIGxvbmcgYXMgYWxpYXNlc0J1ZmZlciByZW1haW5zIGFsaXZlLgorYzJfc3RhdHVzX3Qgb2JqY3B5KAorICAgICAgICBDMkNvbXBvbmVudDo6VHJhaXRzKiBkLAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PiogYWxpYXNlc0J1ZmZlciwKKyAgICAgICAgY29uc3QgSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHMmIHMpOworCisvLyBDMlN0cnVjdERlc2NyaXB0b3IgLT4gU3RydWN0RGVzY3JpcHRvcgorU3RhdHVzIG9iamNweSgKKyAgICAgICAgU3RydWN0RGVzY3JpcHRvciogZCwKKyAgICAgICAgY29uc3QgQzJTdHJ1Y3REZXNjcmlwdG9yJiBzKTsKKworLy8gU3RydWN0RGVzY3JpcHRvciAtPiBDMlN0cnVjdERlc2NyaXB0b3IKK2MyX3N0YXR1c190IG9iamNweSgKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4qIGQsCisgICAgICAgIGNvbnN0IFN0cnVjdERlc2NyaXB0b3ImIHMpOworCisvLyBBYnN0cmFjdCBjbGFzcyB0byBiZSB1c2VkIGluCisvLyBvYmpjcHkoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAtPiBXb3JrQnVuZGxlKS4KK3N0cnVjdCBCdWZmZXJQb29sU2VuZGVyIHsKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjoKKyAgICAgICAgICAgIFJlc3VsdFN0YXR1cyBSZXN1bHRTdGF0dXM7CisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6CisgICAgICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlIEJ1ZmZlclN0YXR1c01lc3NhZ2U7CisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6CisgICAgICAgICAgICBCdWZmZXJQb29sRGF0YSBCdWZmZXJQb29sRGF0YTsKKworICAgIC8qKgorICAgICAqIFNlbmQgYnBEYXRhIGFuZCByZXR1cm4gQnVmZmVyU3RhdHVzTWVzc2FnZSB0aGF0IGNhbiBiZSBzdXBwbGllZCB0bworICAgICAqIElDbGllbnRNYW5hZ2VyOjpyZWNlaXZlKCkgaW4gdGhlIHJlY2VpdmluZyBwcm9jZXNzLgorICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiB0aGUgZnVuY3Rpb24KKyAgICAgKiBvYmpjcHkoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAtPiBXb3JrQnVuZGxlKS4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gYnBEYXRhIEJ1ZmZlclBvb2xEYXRhIGlkZW50aWZ5aW5nIHRoZSBidWZmZXIgdG8gc2VuZC4KKyAgICAgKiBccGFyYW1bb3V0XSBicE1lc3NhZ2UgQnVmZmVyU3RhdHVzTWVzc2FnZSBvZiB0aGUgdHJhbnNhY3Rpb24uIEluZm9ybWF0aW9uCisgICAgICogICAgaW5zaWRlIFxwIGJwTWVzc2FnZSBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSByZWNlaXZpbmcgcHJvY2VzcyBieSBzb21lCisgICAgICogICAgb3RoZXIgbWVhbnMgc28gaXQgY2FuIGNhbGwgcmVjZWl2ZSgpIHByb3Blcmx5LgorICAgICAqIFxyZXR1cm4gUmVzdWx0U3RhdHVzIHZhbHVlIHRoYXQgZGV0ZXJtaW5lcyB0aGUgc3VjY2VzcyBvZiB0aGUgb3BlcmF0aW9uLgorICAgICAqICAgIChTZWUgdGhlIHBvc3NpYmxlIHZhbHVlcyBvZiBSZXN1bHRTdGF0dXMgaW4KKyAgICAgKiAgICBoYXJkd2FyZS9pbnRlcmZhY2VzL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3R5cGVzLmhhbC4pCisgICAgICovCisgICAgdmlydHVhbCBSZXN1bHRTdGF0dXMgc2VuZCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4mIGJwRGF0YSwKKyAgICAgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UqIGJwTWVzc2FnZSkgPSAwOworCisgICAgdmlydHVhbCB+QnVmZmVyUG9vbFNlbmRlcigpID0gZGVmYXVsdDsKK307CisKKy8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgQnVmZmVyUG9vbFNlbmRlci4KKy8vCisvLyBUbyB1c2UgRGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXIsIHRoZSBJQ2xpZW50TWFuYWdlciBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2aW5nCisvLyBwcm9jZXNzIG11c3QgYmUgc2V0IGJlZm9yZSBzZW5kKCkgY2FuIG9wZXJhdGUuIERlZmF1bHRCdWZmZXJQb29sU2VuZGVyIHdpbGwKKy8vIGhvbGQgYSBzdHJvbmcgcmVmZXJlbmNlIHRvIHRoZSBJQ2xpZW50TWFuYWdlciBpbnN0YW5jZSBhbmQgdXNlIGl0IHRvIGNhbGwKKy8vIElDbGllbnRNYW5hZ2VyOjpyZWdpc3RlclNlbmRlcigpIHRvIGVzdGFibGlzaCB0aGUgYnVmZmVycG9vbCBjb25uZWN0aW9uIHdoZW4KKy8vIHNlbmQoKSBpcyBjYWxsZWQuCitzdHJ1Y3QgRGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXIgOiBCdWZmZXJQb29sU2VuZGVyIHsKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6CisgICAgICAgICAgICBDbGllbnRNYW5hZ2VyIENsaWVudE1hbmFnZXI7CisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6CisgICAgICAgICAgICBJQ2xpZW50TWFuYWdlciBJQ2xpZW50TWFuYWdlcjsKKworICAgIC8vIFNldCB0aGUgSUNsaWVudE1hbmFnZXIgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmluZyBwcm9jZXNzIGFuZCB0aGUgcmVmcmVzaAorICAgIC8vIGludGVydmFsIGZvciB0aGUgY29ubmVjdGlvbi4gVGhlIGRlZmF1bHQgaW50ZXJ2YWwgaXMgNC41IHNlY29uZHMsIHdoaWNoCisgICAgLy8gaXMgc2xpZ2h0bHkgc2hvcnRlciB0aGFuIHRoZSBhbW91bnQgb2YgdGltZSB0aGUgYnVmZmVycG9vbCB3aWxsIGtlZXAgYW4KKyAgICAvLyBpbmFjdGl2ZSBjb25uZWN0aW9uIGZvci4KKyAgICBEZWZhdWx0QnVmZmVyUG9vbFNlbmRlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiYgcmVjZWl2ZXJNYW5hZ2VyID0gbnVsbHB0ciwKKyAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OmR1cmF0aW9uIHJlZnJlc2hJbnRlcnZhbCA9IDQ1MDBtcyk7CisKKyAgICAvLyBTZXQgdGhlIElDbGllbnRNYW5hZ2VyIGluc3RhbmNlIG9mIHRoZSByZWNlaXZpbmcgcHJvY2VzcyBhbmQgdGhlIHJlZnJlc2gKKyAgICAvLyBpbnRlcnZhbCBmb3IgdGhlIGNvbm5lY3Rpb24uIFRoZSBkZWZhdWx0IGludGVydmFsIGlzIDQuNSBzZWNvbmRzLCB3aGljaAorICAgIC8vIGlzIHNsaWdodGx5IHNob3J0ZXIgdGhhbiB0aGUgYW1vdW50IG9mIHRpbWUgdGhlIGJ1ZmZlcnBvb2wgd2lsbCBrZWVwIGFuCisgICAgLy8gaW5hY3RpdmUgY29ubmVjdGlvbiBmb3IuCisgICAgdm9pZCBzZXRSZWNlaXZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiYgcmVjZWl2ZXJNYW5hZ2VyLAorICAgICAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6ZHVyYXRpb24gcmVmcmVzaEludGVydmFsID0gNDUwMG1zKTsKKworICAgIC8vIEltcGxlbWVudGF0aW9uIG9mIEJ1ZmZlclBvb2xTZW5kZXI6OnNlbmQoKS4gc2VuZCgpIHdpbGwgZXN0YWJsaXNoIGEKKyAgICAvLyBidWZmZXJwb29sIGNvbm5lY3Rpb24gaWYgbmVlZGVkLCB0aGVuIHNlbmQgdGhlIGJ1ZmZlcnBvb2wgZGF0YSBvdmVyIHRvCisgICAgLy8gdGhlIHJlY2VpdmluZyBwcm9jZXNzLgorICAgIHZpcnR1YWwgUmVzdWx0U3RhdHVzIHNlbmQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+JiBicERhdGEsCisgICAgICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlKiBicE1lc3NhZ2UpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIHNwPENsaWVudE1hbmFnZXI+IG1TZW5kZXJNYW5hZ2VyOworICAgIHNwPElDbGllbnRNYW5hZ2VyPiBtUmVjZWl2ZXJNYW5hZ2VyOworICAgIGludDY0X3QgbVJlY2VpdmVyQ29ubmVjdGlvbklkOworICAgIGludDY0X3QgbVNvdXJjZUNvbm5lY3Rpb25JZDsKKyAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50IG1MYXN0U2VudDsKKyAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpkdXJhdGlvbiBtUmVmcmVzaEludGVydmFsOworfTsKKworLy8gc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAtPiBXb3JrQnVuZGxlCisvLyBOb3RlOiBJZiBidWZmZXJwb29sIHdpbGwgYmUgdXNlZCwgYnBTZW5kZXIgbXVzdCBub3QgYmUgbnVsbC4KK1N0YXR1cyBvYmpjcHkoCisgICAgICAgIFdvcmtCdW5kbGUqIGQsCisgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJwU2VuZGVyID0gbnVsbHB0cik7CisKKy8vIFdvcmtCdW5kbGUgLT4gc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PgorYzJfc3RhdHVzX3Qgb2JqY3B5KAorICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBkLAorICAgICAgICBjb25zdCBXb3JrQnVuZGxlJiBzKTsKKworLyoqCisgKiBQYXJzZXMgYSBwYXJhbXMgYmxvYiBhbmQgcmV0dXJucyBDMlBhcmFtIHBvaW50ZXJzIHRvIGl0cyBwYXJhbXMuCisgKiBccGFyYW1bb3V0XSBwYXJhbXMgdGFyZ2V0IHZlY3RvciBvZiBDMlBhcmFtIHBvaW50ZXJzCisgKiBccGFyYW1baW5dIGJsb2IgcGFyYW1ldGVyIGJsb2IgdG8gcGFyc2UKKyAqIFxyZXR2YWwgQzJfT0sgaWYgdGhlIGZ1bGwgYmxvYiB3YXMgcGFyc2VkCisgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBvdGhlcndpc2UKKyAqLworYzJfc3RhdHVzX3QgcGFyc2VQYXJhbXNCbG9iKAorICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gKnBhcmFtcywKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJmJsb2IpOworCisvKioKKyAqIENvbmNhdGVuYXRlcyBhIGxpc3Qgb2YgQzJQYXJhbXMgaW50byBhIHBhcmFtcyBibG9iLgorICogXHBhcmFtW291dF0gYmxvYiB0YXJnZXQgYmxvYgorICogXHBhcmFtW2luXSBwYXJhbXMgcGFyYW1ldGVycyB0byBjb25jYXRlbmF0ZQorICogXHJldHZhbCBDMl9PSyBpZiB0aGUgYmxvYiB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQKKyAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIGlmIHRoZSBibG9iIHdhcyBub3Qgc3VjY2Vzc2Z1bCAodGhpcyBvbmx5IGhhcHBlbnMgaWYgdGhlIHBhcmFtZXRlcnMgd2VyZQorICogICAgICAgICBub3QgY29uc3QpCisgKi8KK1N0YXR1cyBjcmVhdGVQYXJhbXNCbG9iKAorICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMpOworU3RhdHVzIGNyZWF0ZVBhcmFtc0Jsb2IoCisgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+ICpibG9iLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICZwYXJhbXMpOworU3RhdHVzIGNyZWF0ZVBhcmFtc0Jsb2IoCisgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+ICpibG9iLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPj4gJnBhcmFtcyk7CitTdGF0dXMgY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlR1bmluZz4+ICZwYXJhbXMpOworCisvKioKKyAqIFBhcnNlcyBhIHBhcmFtcyBibG9iIGFuZCBjcmVhdGUgYSB2ZWN0b3Igb2YgQzJQYXJhbXMgd2hvc2UgbWVtYmVycyBhcmUgY29waWVzCisgKiBvZiB0aGUgcGFyYW1zIGluIHRoZSBibG9iLgorICogXHBhcmFtW291dF0gcGFyYW1zIHRoZSByZXN1bHRpbmcgdmVjdG9yCisgKiBccGFyYW1baW5dIGJsb2IgcGFyYW1ldGVyIGJsb2IgdG8gcGFyc2UKKyAqIFxyZXR2YWwgQzJfT0sgaWYgdGhlIGZ1bGwgYmxvYiB3YXMgcGFyc2VkIGFuZCBwYXJhbXMgd2FzIGNvbnN0cnVjdGVkCisgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBvdGhlcndpc2UKKyAqLworYzJfc3RhdHVzX3QgY29weVBhcmFtc0Zyb21CbG9iKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBwYXJhbXMsCisgICAgICAgIFBhcmFtcyBibG9iKTsKKworLyoqCisgKiBQYXJzZXMgYSBwYXJhbXMgYmxvYiBhbmQgYXBwbGllcyB1cGRhdGVzIHRvIHBhcmFtcworICogXHBhcmFtW2luLG91dF0gcGFyYW1zIHBhcmFtcyB0byBiZSB1cGRhdGVkCisgKiBccGFyYW1baW5dIGJsb2IgcGFyYW1ldGVyIGJsb2IgY29udGFpbmluZyB1cGRhdGVzCisgKiBccmV0dmFsIEMyX09LIGlmIHRoZSBmdWxsIGJsb2Igd2FzIHBhcnNlZCBhbmQgcGFyYW1zIHdhcyB1cGRhdGVkCisgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBvdGhlcndpc2UKKyAqLworYzJfc3RhdHVzX3QgdXBkYXRlUGFyYW1zRnJvbUJsb2IoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiYgcGFyYW1zLAorICAgICAgICBjb25zdCBQYXJhbXMmIGJsb2IpOworCisvKioKKyAqIENvbnZlcnRzIGEgQnVmZmVyUG9vbCBzdGF0dXMgdmFsdWUgdG8gYzJfc3RhdHVzX3QuCisgKiBccGFyYW0gQnVmZmVyUG9vbCBzdGF0dXMKKyAqIFxyZXR1cm4gQ29ycmVzcG9uZGluZyBjMl9zdGF0dXNfdAorICovCitjMl9zdGF0dXNfdCB0b0MyU3RhdHVzKDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjoKKyAgICAgICAgUmVzdWx0U3RhdHVzIHJzKTsKKworLy8gQnVmZmVyUXVldWUtQmFzZWQgQmxvY2sgT3BlcmF0aW9ucworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBDcmVhdGUgYSBHcmFwaGljQnVmZmVyIG9iamVjdCBmcm9tIGEgZ3JhcGhpYyBibG9jayBhbmQgYXR0YWNoIGl0IHRvIGFuCisvLyBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyLgorc3RhdHVzX3QgYXR0YWNoVG9CdWZmZXJRdWV1ZShjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGJxU2xvdCk7CisKKy8vIFJldHVybiBmYWxzZSBpZiBibG9jayBkb2VzIG5vdCBjb21lIGZyb20gYSBidWZmZXJxdWV1ZS1iYXNlZCBibG9ja3Bvb2wuCisvLyBPdGhlcndpc2UsIGV4dHJhY3QgZ2VuZXJhdGlvbiwgYnFJZCBhbmQgYnFTbG90IGFuZCByZXR1cm4gdHJ1ZS4KK2Jvb2wgZ2V0QnVmZmVyUXVldWVBc3NpZ25tZW50KGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGdlbmVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCogYnFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGJxU2xvdCk7CisKKy8vIERpc2Fzc29jaWF0ZSB0aGUgZ2l2ZW4gYmxvY2sgd2l0aCBpdHMgZGVzaWduYXRlZCBidWZmZXJxdWV1ZSBzbyB0aGF0CisvLyBjYW5jZWxCdWZmZXIoKSB3aWxsIG5vdCBiZSBjYWxsZWQgd2hlbiB0aGUgYmxvY2sgaXMgZGVzdHJveWVkLiBJZiB0aGUgYmxvY2sKKy8vIGRvZXMgbm90IGhhdmUgYSBkZXNpZ25hdGVkIGJ1ZmZlcnF1ZXVlLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBmYWxzZS4KKy8vIE90aGVyd2lzZSwgaXQgcmV0dXJucyB0cnVlLgorLy8KKy8vIE5vdGU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBhdHRhY2hCdWZmZXIoKSBvciBxdWV1ZUJ1ZmZlcigpIGlzCisvLyBjYWxsZWQgbWFudWFsbHkuCitib29sIHlpZWxkQnVmZmVyUXVldWVCbG9jayhjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jayk7CisKKy8vIENhbGwgeWllbGRCdWZmZXJRdWV1ZUJsb2NrKCkgb24gYmxvY2tzIGluIHRoZSBnaXZlbiB3b3JrTGlzdC4gcHJvY2Vzc0lucHV0CisvLyBkZXRlcm1pbmVzIHdoZXRoZXIgaW5wdXQgYmxvY2tzIGFyZSB5aWVsZGVkLiBwcm9jZXNzT3V0cHV0IHdvcmtzIHNpbWlsYXJseSBvbgorLy8gb3V0cHV0IGJsb2Nrcy4gKFRoZSBkZWZhdWx0IHZhbHVlIG9mIHByb2Nlc3NJbnB1dCBpcyBmYWxzZSB3aGlsZSB0aGUgZGVmYXVsdAorLy8gdmFsdWUgb2YgcHJvY2Vzc091dHB1dCBpcyB0cnVlLiBUaGlzIGltcGxpZXMgdGhhdCBpbiBtb3N0IGNhc2VzLCBvbmx5IG91dHB1dAorLy8gYnVmZmVycyBjb250YWluIGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2Nrcy4pCisvLworLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIFdvcmtCdW5kbGUgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5CisvLyBzZW50IG92ZXIgdGhlIFRyZWJsZSBib3VuZGFyeSB0byBhbm90aGVyIHByb2Nlc3MuCit2b2lkIHlpZWxkQnVmZmVyUXVldWVCbG9ja3MoY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcm9jZXNzSW5wdXQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByb2Nlc3NPdXRwdXQgPSB0cnVlKTsKKworLy8gQXNzaWduIHRoZSBnaXZlbiBibG9jayB0byBhIGJ1ZmZlcnF1ZXVlIHNvIHRoYXQgd2hlbiB0aGUgYmxvY2sgaXMgZGVzdHJveWVkLAorLy8gY2FuY2VsQnVmZmVyKCkgd2lsbCBiZSBjYWxsZWQuCisvLworLy8gSWYgdGhlIGJsb2NrIGRvZXMgbm90IGNvbWUgZnJvbSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrcG9vbCwgdGhpcyBmdW5jdGlvbgorLy8gcmV0dXJucyBmYWxzZS4KKy8vCisvLyBJZiB0aGUgYmxvY2sgYWxyZWFkeSBoYXMgYSBidWZmZXJxdWV1ZSBhc3NpZ25tZW50IHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gb25lLAorLy8gdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZS4KKy8vCisvLyBJZiB0aGUgYmxvY2sgYWxyZWFkeSBoYXMgYSBidWZmZXJxdWV1ZSBhc3NpZ25tZW50IHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhlCisvLyBnaXZlbiBvbmUsIHRoZSBibG9jayB3aWxsIGJlIHJlYXNzaWduZWQgdG8gdGhlIGdpdmVuIGJ1ZmZlcnF1ZXVlLiBUaGlzCisvLyB3aWxsIGNhbGwgYXR0YWNoQnVmZmVyKCkgb24gdGhlIGdpdmVuIGlnYnAuIFRoZSBmdW5jdGlvbiB0aGVuIHJldHVybnMgdHJ1ZSBvbgorLy8gc3VjY2VzcyBvciBmYWxzZSBvbiBhbnkgZmFpbHVyZSBkdXJpbmcgdGhlIG9wZXJhdGlvbi4KKy8vCisvLyBOb3RlOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgZGV0YWNoQnVmZmVyKCkgb3IgZGVxdWV1ZUJ1ZmZlcigpCisvLyBpcyBjYWxsZWQgbWFudWFsbHkuCitib29sIGhvbGRCdWZmZXJRdWV1ZUJsb2NrKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgYnFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbik7CisKKy8vIENhbGwgaG9sZEJ1ZmZlclF1ZXVlQmxvY2soKSBvbiBpbnB1dCBvciBvdXRwdXQgYmxvY2tzIGluIHRoZSBnaXZlbiB3b3JrTGlzdC4KKy8vIFNpbmNlIHRoZSBidWZmZXJxdWV1ZSBhc3NpZ25tZW50IGZvciBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgY2FuIGJlCisvLyBkaWZmZXJlbnQsIHRoaXMgZnVuY3Rpb24gdGFrZXMgZm9ySW5wdXQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuCisvLyBidWZmZXJxdWV1ZSBpcyBmb3IgaW5wdXQgYnVmZmVycyBvciBvdXRwdXQgYnVmZmVycy4gKFRoZSBkZWZhdWx0IHZhbHVlIG9mCisvLyBmb3JJbnB1dCBpcyBmYWxzZS4pCisvLworLy8gSW4gdGhlIChyYXJlKSBjYXNlIHRoYXQgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgYXJlIGJ1ZmZlcnF1ZXVlLWJhc2VkLAorLy8gdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB0d2ljZSwgb25jZSBmb3IgdGhlIGlucHV0IGJ1ZmZlcnMgYW5kIG9uY2UgZm9yCisvLyB0aGUgb3V0cHV0IGJ1ZmZlcnMuCisvLworLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIFdvcmtCdW5kbGUgaGFzIGJlZW4gcmVjZWl2ZWQgZnJvbQorLy8gYW5vdGhlciBwcm9jZXNzLgordm9pZCBob2xkQnVmZmVyUXVldWVCbG9ja3MoY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJxSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JJbnB1dCA9IGZhbHNlKTsKKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDT0RFQzJfSElETF9WMV8wX1VUSUxTX1RZUEVTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy90eXBlcy5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvdHlwZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNTNiYzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvdHlwZXMuY3BwCkBAIC0wLDAgKzEsMTgwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyLXR5cGVzIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC90eXBlcy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyUGFyYW1JbnRlcm5hbC5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisjaW5jbHVkZSA8dXRpbC9DMlBhcmFtVXRpbHMuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OkJ1ZmZlclBvb2xEYXRhOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OkJ1ZmZlclN0YXR1c01lc3NhZ2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjoKKyAgICAgICAgQ2xpZW50TWFuYWdlcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6CisgICAgICAgIFRyYW5zYWN0aW9uSWQ7Cit1c2luZyA6OmFuZHJvaWQ6OlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDb21tb24sIHR5cGVuYW1lIERzdFZlY3RvciwgdHlwZW5hbWUgU3JjVmVjdG9yPgordm9pZCBjb3B5VmVjdG9yKERzdFZlY3RvciogZCwgY29uc3QgU3JjVmVjdG9yJiBzKSB7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQ29tbW9uKSA9PSBzaXplb2YoZGVjbHR5cGUoKCpkKVswXSkpLAorICAgICAgICAgICAgIkRzdFZlY3RvcidzIGNvbXBvbmVudCBzaXplIGRvZXMgbm90IG1hdGNoIENvbW1vbiIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKENvbW1vbikgPT0gc2l6ZW9mKGRlY2x0eXBlKHNbMF0pKSwKKyAgICAgICAgICAgICJTcmNWZWN0b3IncyBjb21wb25lbnQgc2l6ZSBkb2VzIG5vdCBtYXRjaCBDb21tb24iKTsKKyAgICBkLT5yZXNpemUocy5zaXplKCkpOworICAgIHN0ZDo6Y29weSgKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQ29tbW9uKj4oJnNbMF0pLAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDb21tb24qPigmc1swXSArIHMuc2l6ZSgpKSwKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Q29tbW9uKj4oJigqZClbMF0pKTsKK30KKworLy8gQzJQYXJhbUZpZWxkIC0+IFBhcmFtRmllbGQKK3ZvaWQgb2JqY3B5KFBhcmFtRmllbGQgKmQsIGNvbnN0IEMyUGFyYW1GaWVsZCAmcykgeworICAgIGQtPmluZGV4ID0gc3RhdGljX2Nhc3Q8UGFyYW1JbmRleD4oX0MyUGFyYW1JbnNwZWN0b3I6OkdldEluZGV4KHMpKTsKKyAgICBkLT5maWVsZElkLm9mZnNldCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KHMpKTsKKyAgICBkLT5maWVsZElkLnNpemUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oX0MyUGFyYW1JbnNwZWN0b3I6OkdldFNpemUocykpOworfQorCitzdHJ1Y3QgQzJQYXJhbUZpZWxkQnVpbGRlciA6IHB1YmxpYyBDMlBhcmFtRmllbGQgeworICAgIEMyUGFyYW1GaWVsZEJ1aWxkZXIoKSA6IEMyUGFyYW1GaWVsZCgKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEMyUGFyYW06OkluZGV4PihzdGF0aWNfY2FzdDx1aW50MzJfdD4oMCkpLCAwLCAwKSB7CisgICAgfQorICAgIC8vIFBhcmFtRmllbGQgLT4gQzJQYXJhbUZpZWxkCisgICAgQzJQYXJhbUZpZWxkQnVpbGRlcihjb25zdCBQYXJhbUZpZWxkJiBzKSA6IEMyUGFyYW1GaWVsZCgKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEMyUGFyYW06OkluZGV4PihzdGF0aWNfY2FzdDx1aW50MzJfdD4ocy5pbmRleCkpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHMuZmllbGRJZC5vZmZzZXQpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHMuZmllbGRJZC5zaXplKSkgeworICAgIH0KK307CisKKy8vIEMyV29ya09yZGluYWxTdHJ1Y3QgLT4gV29ya09yZGluYWwKK3ZvaWQgb2JqY3B5KFdvcmtPcmRpbmFsICpkLCBjb25zdCBDMldvcmtPcmRpbmFsU3RydWN0ICZzKSB7CisgICAgZC0+ZnJhbWVJbmRleCA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihzLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgZC0+dGltZXN0YW1wVXMgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocy50aW1lc3RhbXAucGVla3UoKSk7CisgICAgZC0+Y3VzdG9tT3JkaW5hbCA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihzLmN1c3RvbU9yZGluYWwucGVla3UoKSk7Cit9CisKKy8vIFdvcmtPcmRpbmFsIC0+IEMyV29ya09yZGluYWxTdHJ1Y3QKK3ZvaWQgb2JqY3B5KEMyV29ya09yZGluYWxTdHJ1Y3QgKmQsIGNvbnN0IFdvcmtPcmRpbmFsICZzKSB7CisgICAgZC0+ZnJhbWVJbmRleCA9IGMyX2NudHI2NF90KHMuZnJhbWVJbmRleCk7CisgICAgZC0+dGltZXN0YW1wID0gYzJfY250cjY0X3Qocy50aW1lc3RhbXBVcyk7CisgICAgZC0+Y3VzdG9tT3JkaW5hbCA9IGMyX2NudHI2NF90KHMuY3VzdG9tT3JkaW5hbCk7Cit9CisKKy8vIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnJhbmdlJ3MgdHlwZSAtPiBGaWVsZFN1cHBvcnRlZFZhbHVlczo6UmFuZ2UKK3ZvaWQgb2JqY3B5KAorICAgICAgICBGaWVsZFN1cHBvcnRlZFZhbHVlczo6UmFuZ2UqIGQsCisgICAgICAgIGNvbnN0IGRlY2x0eXBlKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnJhbmdlKSYgcykgeworICAgIGQtPm1pbiA9IHN0YXRpY19jYXN0PFByaW1pdGl2ZVZhbHVlPihzLm1pbi51NjQpOworICAgIGQtPm1heCA9IHN0YXRpY19jYXN0PFByaW1pdGl2ZVZhbHVlPihzLm1heC51NjQpOworICAgIGQtPnN0ZXAgPSBzdGF0aWNfY2FzdDxQcmltaXRpdmVWYWx1ZT4ocy5zdGVwLnU2NCk7CisgICAgZC0+bnVtID0gc3RhdGljX2Nhc3Q8UHJpbWl0aXZlVmFsdWU+KHMubnVtLnU2NCk7CisgICAgZC0+ZGVub20gPSBzdGF0aWNfY2FzdDxQcmltaXRpdmVWYWx1ZT4ocy5kZW5vbS51NjQpOworfQorCisvLyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIC0+IEZpZWxkU3VwcG9ydGVkVmFsdWVzCitTdGF0dXMgb2JqY3B5KEZpZWxkU3VwcG9ydGVkVmFsdWVzICpkLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZzKSB7CisgICAgZC0+dHlwZU90aGVyID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4ocy50eXBlKTsKKyAgICBzd2l0Y2ggKHMudHlwZSkgeworICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6RU1QVFk6CisgICAgICAgIGQtPnR5cGUgPSBGaWVsZFN1cHBvcnRlZFZhbHVlczo6VHlwZTo6RU1QVFk7CisgICAgICAgIGQtPnZhbHVlcy5yZXNpemUoMCk7CisgICAgICAgIHJldHVybiBTdGF0dXM6Ok9LOworICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UkFOR0U6CisgICAgICAgIGQtPnR5cGUgPSBGaWVsZFN1cHBvcnRlZFZhbHVlczo6VHlwZTo6UkFOR0U7CisgICAgICAgIG9iamNweSgmZC0+cmFuZ2UsIHMucmFuZ2UpOworICAgICAgICBkLT52YWx1ZXMucmVzaXplKDApOworICAgICAgICByZXR1cm4gU3RhdHVzOjpPSzsKKyAgICBkZWZhdWx0OgorICAgICAgICBzd2l0Y2ggKHMudHlwZSkgeworICAgICAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlZBTFVFUzoKKyAgICAgICAgICAgIGQtPnR5cGUgPSBGaWVsZFN1cHBvcnRlZFZhbHVlczo6VHlwZTo6VkFMVUVTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6RkxBR1M6CisgICAgICAgICAgICBkLT50eXBlID0gRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlR5cGU6OkZMQUdTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBkLT50eXBlID0gRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlR5cGU6Ok9USEVSOworICAgICAgICAgICAgLy8gQ29weSBhbGwgZmllbGRzIGluIHRoaXMgY2FzZQorICAgICAgICAgICAgb2JqY3B5KCZkLT5yYW5nZSwgcy5yYW5nZSk7CisgICAgICAgIH0KKyAgICAgICAgZC0+dmFsdWVzLnJlc2l6ZShzLnZhbHVlcy5zaXplKCkpOworICAgICAgICBjb3B5VmVjdG9yPHVpbnQ2NF90PigmZC0+dmFsdWVzLCBzLnZhbHVlcyk7CisgICAgICAgIHJldHVybiBTdGF0dXM6Ok9LOworICAgIH0KK30KKworLy8gRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlJhbmdlIC0+IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnJhbmdlJ3MgdHlwZQordm9pZCBvYmpjcHkoCisgICAgICAgIGRlY2x0eXBlKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnJhbmdlKSogZCwKKyAgICAgICAgY29uc3QgRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlJhbmdlJiBzKSB7CisgICAgZC0+bWluLnU2NCA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihzLm1pbik7CisgICAgZC0+bWF4LnU2NCA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihzLm1heCk7CisgICAgZC0+c3RlcC51NjQgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocy5zdGVwKTsKKyAgICBkLT5udW0udTY0ID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHMubnVtKTsKKyAgICBkLT5kZW5vbS51NjQgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocy5kZW5vbSk7Cit9CisKKy8vIEZpZWxkU3VwcG9ydGVkVmFsdWVzIC0+IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMKK2MyX3N0YXR1c190IG9iamNweShDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICpkLCBjb25zdCBGaWVsZFN1cHBvcnRlZFZhbHVlcyAmcykgeworICAgIHN3aXRjaCAocy50eXBlKSB7CisgICAgY2FzZSBGaWVsZFN1cHBvcnRlZFZhbHVlczo6VHlwZTo6RU1QVFk6CisgICAgICAgIGQtPnR5cGUgPSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpFTVBUWTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIGNhc2UgRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlR5cGU6OlJBTkdFOgorICAgICAgICBkLT50eXBlID0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UkFOR0U7CisgICAgICAgIG9iamNweSgmZC0+cmFuZ2UsIHMucmFuZ2UpOworICAgICAgICBkLT52YWx1ZXMucmVzaXplKDApOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgZGVmYXVsdDoKKyAgICAgICAgc3dpdGNoIChzLnR5cGUpIHsKKyAgICAgICAgY2FzZSBGaWVsZFN1cHBvcnRlZFZhbHVlczo6VHlwZTo6VkFMVUVTOgorICAgICAgICAgICAgZC0+dHlwZSA9IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlZBTFVFUzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZpZWxkU3VwcG9ydGVkVmFsdWVzOjpUeXBlOjpGTEFHUzoKKyAgICAgICAgICAgIGQtPnR5cGUgPSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpGTEFHUzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZC0+dHlwZSA9IHN0YXRpY19jYXN0PEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnR5cGVfdD4ocy50eXBlT3RoZXIpOworICAgICAgICAgICAgLy8gQ29weSBhbGwgZmllbGRzIGluIHRoaXMgY2FzZQorICAgICAgICAgICAgb2JqY3B5KCZkLT5yYW5nZSwgcy5yYW5nZSk7CisgICAgICAgIH0KKyAgICAgICAgY29weVZlY3Rvcjx1aW50NjRfdD4oJmQtPnZhbHVlcywgcy52YWx1ZXMpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorfQorCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKKy8vIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAtPiBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5CitTdGF0dXMgb2JqY3B5KAorICAgICAgICBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KiBkLAorICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkmIHMpIHsKKyAgICBvYmpjcHkoJmQtPmZpZWxkLCBzLmZpZWxkKCkpOworICAgIHN3aXRjaCAocy50eXBlKCkpIHsKKyAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6UE9TU0lCTEU6CisgICAgICAgIGQtPnR5cGUgPSBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpUeXBlOjpQT1NTSUJMRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OkNVUlJFTlQ6CisgICAgICAgIGQtPnR5cGUgPSBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpUeXBlOjpDVVJSRU5UOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgiVW5rbm93biB0eXBlIG9mIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTogJXUiLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkPihzLnR5cGUoKSkpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Ok9LOworfQorCisvLyBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5IC0+IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeQorYzJfc3RhdHVzX3Qgb2JqY3B5KAorICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkqIGQsCisgICAgICAgIGNvbnN0IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkmIHMpIHsKKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OnR5cGVfdCBkVHlwZTsKKyAgICBzd2l0Y2ggKHMudHlwZSkgeworICAgIGNhc2UgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6VHlwZTo6UE9TU0lCTEU6CisgICAgICAgIGRUeXBlID0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpQT1NTSUJMRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpUeXBlOjpDVVJSRU5UOgorICAgICAgICBkVHlwZSA9IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q1VSUkVOVDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoIlVua25vd24gdHlwZSBvZiBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OiAldSIsCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHMudHlwZSkpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKyAgICAqZCA9IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeShDMlBhcmFtRmllbGRCdWlsZGVyKHMuZmllbGQpLCBkVHlwZSk7CisgICAgcmV0dXJuIEMyX09LOworfQorCisvLyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgLT4gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdAorU3RhdHVzIG9iamNweSgKKyAgICAgICAgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdCogZCwKKyAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5JiBzKSB7CisgICAgZC0+c3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPihzLnN0YXR1cyk7CisgICAgcmV0dXJuIG9iamNweSgmZC0+dmFsdWVzLCBzLnZhbHVlcyk7Cit9CisKKy8vIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnksIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnlSZXN1bHQgLT4KKy8vIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeQorYzJfc3RhdHVzX3Qgb2JqY3B5KAorICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkqIGQsCisgICAgICAgIGNvbnN0IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkmIHNxLAorICAgICAgICBjb25zdCBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5UmVzdWx0JiBzcikgeworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IG9iamNweShkLCBzcSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBkLT5zdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3Iuc3RhdHVzKTsKKyAgICByZXR1cm4gb2JqY3B5KCZkLT52YWx1ZXMsIHNyLnZhbHVlcyk7Cit9CisKKy8vIEMyQ29tcG9uZW50OjpUcmFpdHMgLT4gSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHMKK1N0YXR1cyBvYmpjcHkoCisgICAgICAgIElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzICpkLAorICAgICAgICBjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzICZzKSB7CisgICAgZC0+bmFtZSA9IHMubmFtZTsKKworICAgIHN3aXRjaCAocy5kb21haW4pIHsKKyAgICBjYXNlIEMyQ29tcG9uZW50OjpET01BSU5fVklERU86CisgICAgICAgIGQtPmRvbWFpbiA9IElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpEb21haW46OlZJREVPOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyQ29tcG9uZW50OjpET01BSU5fQVVESU86CisgICAgICAgIGQtPmRvbWFpbiA9IElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpEb21haW46OkFVRElPOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBkLT5kb21haW4gPSBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0czo6RG9tYWluOjpPVEhFUjsKKyAgICB9CisgICAgZC0+ZG9tYWluT3RoZXIgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocy5kb21haW4pOworCisgICAgc3dpdGNoIChzLmtpbmQpIHsKKyAgICBjYXNlIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVI6CisgICAgICAgIGQtPmtpbmQgPSBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0czo6S2luZDo6REVDT0RFUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSOgorICAgICAgICBkLT5raW5kID0gSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OktpbmQ6OkVOQ09ERVI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGQtPmtpbmQgPSBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0czo6S2luZDo6T1RIRVI7CisgICAgfQorICAgIGQtPmtpbmRPdGhlciA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzLmtpbmQpOworCisgICAgZC0+cmFuayA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzLnJhbmspOworCisgICAgZC0+bWVkaWFUeXBlID0gcy5tZWRpYVR5cGU7CisKKyAgICBkLT5hbGlhc2VzLnJlc2l6ZShzLmFsaWFzZXMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpeCA9IHMuYWxpYXNlcy5zaXplKCk7IGl4ID4gMDsgKSB7CisgICAgICAgIC0taXg7CisgICAgICAgIGQtPmFsaWFzZXNbaXhdID0gcy5hbGlhc2VzW2l4XTsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6T0s7Cit9CisKKy8vIENvbXBvbmVudFRyYWl0cyAtPiBDMkNvbXBvbmVudDo6VHJhaXRzLCBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PgorYzJfc3RhdHVzX3Qgb2JqY3B5KAorICAgICAgICBDMkNvbXBvbmVudDo6VHJhaXRzKiBkLAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PiogYWxpYXNlc0J1ZmZlciwKKyAgICAgICAgY29uc3QgSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHMmIHMpIHsKKyAgICBkLT5uYW1lID0gcy5uYW1lLmNfc3RyKCk7CisKKyAgICBzd2l0Y2ggKHMuZG9tYWluKSB7CisgICAgY2FzZSBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0czo6RG9tYWluOjpWSURFTzoKKyAgICAgICAgZC0+ZG9tYWluID0gQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0czo6RG9tYWluOjpBVURJTzoKKyAgICAgICAgZC0+ZG9tYWluID0gQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTzsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZC0+ZG9tYWluID0gc3RhdGljX2Nhc3Q8QzJDb21wb25lbnQ6OmRvbWFpbl90PihzLmRvbWFpbk90aGVyKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHMua2luZCkgeworICAgIGNhc2UgSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OktpbmQ6OkRFQ09ERVI6CisgICAgICAgIGQtPmtpbmQgPSBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpLaW5kOjpFTkNPREVSOgorICAgICAgICBkLT5raW5kID0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZC0+a2luZCA9IHN0YXRpY19jYXN0PEMyQ29tcG9uZW50OjpraW5kX3Q+KHMua2luZE90aGVyKTsKKyAgICB9CisKKyAgICBkLT5yYW5rID0gc3RhdGljX2Nhc3Q8QzJDb21wb25lbnQ6OnJhbmtfdD4ocy5yYW5rKTsKKyAgICBkLT5tZWRpYVR5cGUgPSBzLm1lZGlhVHlwZS5jX3N0cigpOworCisgICAgLy8gYWxpYXNlc0J1ZmZlciBtdXN0IG5vdCBiZSByZXNpemVkIGFmdGVyIHRoaXMuCisgICAgKmFsaWFzZXNCdWZmZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4oCisgICAgICAgICAgICBzLmFsaWFzZXMuc2l6ZSgpKTsKKyAgICAoKmFsaWFzZXNCdWZmZXIpLT5yZXNpemUocy5hbGlhc2VzLnNpemUoKSk7CisgICAgc3RkOjp2ZWN0b3I8QzJTdHJpbmdMaXRlcmFsPiBkQWxpYXNlcyhzLmFsaWFzZXMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHMuYWxpYXNlcy5zaXplKCk7ICsraSkgeworICAgICAgICAoKiphbGlhc2VzQnVmZmVyKVtpXSA9IHMuYWxpYXNlc1tpXS5jX3N0cigpOworICAgICAgICBkLT5hbGlhc2VzW2ldID0gKCoqYWxpYXNlc0J1ZmZlcilbaV0uY19zdHIoKTsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKKy8vIEMyUGFyYW1GaWVsZFZhbHVlcyAtPiBQYXJhbUZpZWxkVmFsdWVzCitTdGF0dXMgb2JqY3B5KFBhcmFtRmllbGRWYWx1ZXMgKmQsIGNvbnN0IEMyUGFyYW1GaWVsZFZhbHVlcyAmcykgeworICAgIG9iamNweSgmZC0+cGFyYW1PckZpZWxkLCBzLnBhcmFtT3JGaWVsZCk7CisgICAgaWYgKHMudmFsdWVzKSB7CisgICAgICAgIGQtPnZhbHVlcy5yZXNpemUoMSk7CisgICAgICAgIHJldHVybiBvYmpjcHkoJmQtPnZhbHVlc1swXSwgKnMudmFsdWVzKTsKKyAgICB9CisgICAgZC0+dmFsdWVzLnJlc2l6ZSgwKTsKKyAgICByZXR1cm4gU3RhdHVzOjpPSzsKK30KKworLy8gUGFyYW1GaWVsZFZhbHVlcyAtPiBDMlBhcmFtRmllbGRWYWx1ZXMKK2MyX3N0YXR1c190IG9iamNweShDMlBhcmFtRmllbGRWYWx1ZXMgKmQsIGNvbnN0IFBhcmFtRmllbGRWYWx1ZXMgJnMpIHsKKyAgICBkLT5wYXJhbU9yRmllbGQgPSBDMlBhcmFtRmllbGRCdWlsZGVyKHMucGFyYW1PckZpZWxkKTsKKyAgICBpZiAocy52YWx1ZXMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgZC0+dmFsdWVzID0gc3RkOjptYWtlX3VuaXF1ZTxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPigpOworICAgICAgICByZXR1cm4gb2JqY3B5KGQtPnZhbHVlcy5nZXQoKSwgcy52YWx1ZXNbMF0pOworICAgIH0gZWxzZSBpZiAocy52YWx1ZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgZC0+dmFsdWVzLnJlc2V0KCk7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgQUxPR0UoIk11bHRpcGxlIEZpZWxkU3VwcG9ydGVkVmFsdWVzIG9iamVjdHMuICIKKyAgICAgICAgICAgICIoT25seSBvbmUgaXMgYWxsb3dlZC4pIik7CisgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKK30KKworfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCisvLyBDMlNldHRpbmdSZXN1bHQgLT4gU2V0dGluZ1Jlc3VsdAorU3RhdHVzIG9iamNweShTZXR0aW5nUmVzdWx0ICpkLCBjb25zdCBDMlNldHRpbmdSZXN1bHQgJnMpIHsKKyAgICBkLT5mYWlsdXJlT3RoZXIgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocy5mYWlsdXJlKTsKKyAgICBzd2l0Y2ggKHMuZmFpbHVyZSkgeworICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpSRUFEX09OTFk6CisgICAgICAgIGQtPmZhaWx1cmUgPSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpSRUFEX09OTFk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpNSVNNQVRDSDoKKyAgICAgICAgZC0+ZmFpbHVyZSA9IFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6Ok1JU01BVENIOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyU2V0dGluZ1Jlc3VsdDo6QkFEX1ZBTFVFOgorICAgICAgICBkLT5mYWlsdXJlID0gU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6QkFEX1ZBTFVFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyU2V0dGluZ1Jlc3VsdDo6QkFEX1RZUEU6CisgICAgICAgIGQtPmZhaWx1cmUgPSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpCQURfVFlQRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMlNldHRpbmdSZXN1bHQ6OkJBRF9QT1JUOgorICAgICAgICBkLT5mYWlsdXJlID0gU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6QkFEX1BPUlQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpCQURfSU5ERVg6CisgICAgICAgIGQtPmZhaWx1cmUgPSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpCQURfSU5ERVg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpDT05GTElDVDoKKyAgICAgICAgZC0+ZmFpbHVyZSA9IFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OkNPTkZMSUNUOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyU2V0dGluZ1Jlc3VsdDo6VU5TVVBQT1JURUQ6CisgICAgICAgIGQtPmZhaWx1cmUgPSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpVTlNVUFBPUlRFRDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMlNldHRpbmdSZXN1bHQ6OklORk9fQ09ORkxJQ1Q6CisgICAgICAgIGQtPmZhaWx1cmUgPSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpJTkZPX0NPTkZMSUNUOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBkLT5mYWlsdXJlID0gU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6T1RIRVI7CisgICAgfQorICAgIFN0YXR1cyBzdGF0dXMgPSBvYmpjcHkoJmQtPmZpZWxkLCBzLmZpZWxkKTsKKyAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgZC0+Y29uZmxpY3RzLnJlc2l6ZShzLmNvbmZsaWN0cy5zaXplKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKGNvbnN0IEMyUGFyYW1GaWVsZFZhbHVlcyYgc0NvbmZsaWN0IDogcy5jb25mbGljdHMpIHsKKyAgICAgICAgUGFyYW1GaWVsZFZhbHVlcyAmZENvbmZsaWN0ID0gZC0+Y29uZmxpY3RzW2krK107CisgICAgICAgIHN0YXR1cyA9IG9iamNweSgmZENvbmZsaWN0LCBzQ29uZmxpY3QpOworICAgICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6T0s7Cit9CisKKy8vIFNldHRpbmdSZXN1bHQgLT4gc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4KK2MyX3N0YXR1c190IG9iamNweShzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiAqZCwgY29uc3QgU2V0dGluZ1Jlc3VsdCAmcykgeworICAgICpkID0gc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4obmV3IEMyU2V0dGluZ1Jlc3VsdCB7CisgICAgICAgICAgICAuZmllbGQgPSBDMlBhcmFtRmllbGRWYWx1ZXMoQzJQYXJhbUZpZWxkQnVpbGRlcigpKSB9KTsKKyAgICBpZiAoISpkKSB7CisgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgfQorCisgICAgLy8gZmFpbHVyZQorICAgIHN3aXRjaCAocy5mYWlsdXJlKSB7CisgICAgY2FzZSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpSRUFEX09OTFk6CisgICAgICAgICgqZCktPmZhaWx1cmUgPSBDMlNldHRpbmdSZXN1bHQ6OlJFQURfT05MWTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpNSVNNQVRDSDoKKyAgICAgICAgKCpkKS0+ZmFpbHVyZSA9IEMyU2V0dGluZ1Jlc3VsdDo6TUlTTUFUQ0g7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6QkFEX1ZBTFVFOgorICAgICAgICAoKmQpLT5mYWlsdXJlID0gQzJTZXR0aW5nUmVzdWx0OjpCQURfVkFMVUU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6QkFEX1RZUEU6CisgICAgICAgICgqZCktPmZhaWx1cmUgPSBDMlNldHRpbmdSZXN1bHQ6OkJBRF9UWVBFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OkJBRF9QT1JUOgorICAgICAgICAoKmQpLT5mYWlsdXJlID0gQzJTZXR0aW5nUmVzdWx0OjpCQURfUE9SVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpCQURfSU5ERVg6CisgICAgICAgICgqZCktPmZhaWx1cmUgPSBDMlNldHRpbmdSZXN1bHQ6OkJBRF9JTkRFWDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpDT05GTElDVDoKKyAgICAgICAgKCpkKS0+ZmFpbHVyZSA9IEMyU2V0dGluZ1Jlc3VsdDo6Q09ORkxJQ1Q7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6VU5TVVBQT1JURUQ6CisgICAgICAgICgqZCktPmZhaWx1cmUgPSBDMlNldHRpbmdSZXN1bHQ6OlVOU1VQUE9SVEVEOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OklORk9fQ09ORkxJQ1Q6CisgICAgICAgICgqZCktPmZhaWx1cmUgPSBDMlNldHRpbmdSZXN1bHQ6OklORk9fQ09ORkxJQ1Q7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgICgqZCktPmZhaWx1cmUgPSBzdGF0aWNfY2FzdDxDMlNldHRpbmdSZXN1bHQ6OkZhaWx1cmU+KHMuZmFpbHVyZU90aGVyKTsKKyAgICB9CisKKyAgICAvLyBmaWVsZAorICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IG9iamNweSgmKCpkKS0+ZmllbGQsIHMuZmllbGQpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICAvLyBjb25mbGljdHMKKyAgICAoKmQpLT5jb25mbGljdHMuY2xlYXIoKTsKKyAgICAoKmQpLT5jb25mbGljdHMucmVzZXJ2ZShzLmNvbmZsaWN0cy5zaXplKCkpOworICAgIGZvciAoY29uc3QgUGFyYW1GaWVsZFZhbHVlcyYgc0NvbmZsaWN0IDogcy5jb25mbGljdHMpIHsKKyAgICAgICAgKCpkKS0+Y29uZmxpY3RzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgICAgICBDMlBhcmFtRmllbGRWYWx1ZXN7IEMyUGFyYW1GaWVsZEJ1aWxkZXIoKSwgbnVsbHB0ciB9KTsKKyAgICAgICAgc3RhdHVzID0gb2JqY3B5KCYoKmQpLT5jb25mbGljdHMuYmFjaygpLCBzQ29uZmxpY3QpOworICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworLy8gQzJQYXJhbURlc2NyaXB0b3IgLT4gUGFyYW1EZXNjcmlwdG9yCitTdGF0dXMgb2JqY3B5KFBhcmFtRGVzY3JpcHRvciAqZCwgY29uc3QgQzJQYXJhbURlc2NyaXB0b3IgJnMpIHsKKyAgICBkLT5pbmRleCA9IHN0YXRpY19jYXN0PFBhcmFtSW5kZXg+KHMuaW5kZXgoKSk7CisgICAgZC0+YXR0cmliID0gc3RhdGljX2Nhc3Q8aGlkbF9iaXRmaWVsZDxQYXJhbURlc2NyaXB0b3I6OkF0dHJpYj4+KAorICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldEF0dHJpYihzKSk7CisgICAgZC0+bmFtZSA9IHMubmFtZSgpOworICAgIGNvcHlWZWN0b3I8dWludDMyX3Q+KCZkLT5kZXBlbmRlbmNpZXMsIHMuZGVwZW5kZW5jaWVzKCkpOworICAgIHJldHVybiBTdGF0dXM6Ok9LOworfQorCisvLyBQYXJhbURlc2NyaXB0b3IgLT4gQzJQYXJhbURlc2NyaXB0b3IKK2MyX3N0YXR1c190IG9iamNweShzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+ICpkLCBjb25zdCBQYXJhbURlc2NyaXB0b3IgJnMpIHsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gZERlcGVuZGVuY2llczsKKyAgICBkRGVwZW5kZW5jaWVzLnJlc2VydmUocy5kZXBlbmRlbmNpZXMuc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0IFBhcmFtSW5kZXgmIHNEZXBlbmRlbmN5IDogcy5kZXBlbmRlbmNpZXMpIHsKKyAgICAgICAgZERlcGVuZGVuY2llcy5lbXBsYWNlX2JhY2soc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNEZXBlbmRlbmN5KSk7CisgICAgfQorICAgICpkID0gc3RkOjptYWtlX3NoYXJlZDxDMlBhcmFtRGVzY3JpcHRvcj4oCisgICAgICAgICAgICBDMlBhcmFtOjpJbmRleChzdGF0aWNfY2FzdDx1aW50MzJfdD4ocy5pbmRleCkpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QzJQYXJhbURlc2NyaXB0b3I6OmF0dHJpYl90PihzLmF0dHJpYiksCisgICAgICAgICAgICBDMlN0cmluZyhzLm5hbWUuY19zdHIoKSksCisgICAgICAgICAgICBzdGQ6Om1vdmUoZERlcGVuZGVuY2llcykpOworICAgIHJldHVybiBDMl9PSzsKK30KKworLy8gQzJTdHJ1Y3REZXNjcmlwdG9yIC0+IFN0cnVjdERlc2NyaXB0b3IKK1N0YXR1cyBvYmpjcHkoU3RydWN0RGVzY3JpcHRvciAqZCwgY29uc3QgQzJTdHJ1Y3REZXNjcmlwdG9yICZzKSB7CisgICAgZC0+dHlwZSA9IHN0YXRpY19jYXN0PFBhcmFtSW5kZXg+KHMuY29yZUluZGV4KCkuY29yZUluZGV4KCkpOworICAgIGQtPmZpZWxkcy5yZXNpemUocy5udW1GaWVsZHMoKSk7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGZvciAoY29uc3QgYXV0byYgc0ZpZWxkIDogcykgeworICAgICAgICBGaWVsZERlc2NyaXB0b3ImIGRGaWVsZCA9IGQtPmZpZWxkc1tpKytdOworICAgICAgICBkRmllbGQuZmllbGRJZC5vZmZzZXQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oCisgICAgICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldChzRmllbGQpKTsKKyAgICAgICAgZEZpZWxkLmZpZWxkSWQuc2l6ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PigKKyAgICAgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0U2l6ZShzRmllbGQpKTsKKyAgICAgICAgZEZpZWxkLnR5cGUgPSBzdGF0aWNfY2FzdDxoaWRsX2JpdGZpZWxkPEZpZWxkRGVzY3JpcHRvcjo6VHlwZT4+KAorICAgICAgICAgICAgICAgIHNGaWVsZC50eXBlKCkpOworICAgICAgICBkRmllbGQubGVuZ3RoID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNGaWVsZC5leHRlbnQoKSk7CisgICAgICAgIGRGaWVsZC5uYW1lID0gc3RhdGljX2Nhc3Q8aGlkbF9zdHJpbmc+KHNGaWVsZC5uYW1lKCkpOworICAgICAgICBjb25zdCBhdXRvJiBzTmFtZWRWYWx1ZXMgPSBzRmllbGQubmFtZWRWYWx1ZXMoKTsKKyAgICAgICAgZEZpZWxkLm5hbWVkVmFsdWVzLnJlc2l6ZShzTmFtZWRWYWx1ZXMuc2l6ZSgpKTsKKyAgICAgICAgc2l6ZV90IGogPSAwOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHNOYW1lZFZhbHVlIDogc05hbWVkVmFsdWVzKSB7CisgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWUmIGROYW1lZFZhbHVlID0gZEZpZWxkLm5hbWVkVmFsdWVzW2orK107CisgICAgICAgICAgICBkTmFtZWRWYWx1ZS5uYW1lID0gc3RhdGljX2Nhc3Q8aGlkbF9zdHJpbmc+KHNOYW1lZFZhbHVlLmZpcnN0KTsKKyAgICAgICAgICAgIGROYW1lZFZhbHVlLnZhbHVlID0gc3RhdGljX2Nhc3Q8UHJpbWl0aXZlVmFsdWU+KAorICAgICAgICAgICAgICAgICAgICBzTmFtZWRWYWx1ZS5zZWNvbmQudTY0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpPSzsKK30KKworLy8gU3RydWN0RGVzY3JpcHRvciAtPiBDMlN0cnVjdERlc2NyaXB0b3IKK2MyX3N0YXR1c190IG9iamNweShzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiAqZCwgY29uc3QgU3RydWN0RGVzY3JpcHRvciAmcykgeworICAgIEMyUGFyYW06OkNvcmVJbmRleCBkSW5kZXggPSBDMlBhcmFtOjpDb3JlSW5kZXgoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHMudHlwZSkpOworICAgIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBkRmllbGRzOworICAgIGRGaWVsZHMucmVzZXJ2ZShzLmZpZWxkcy5zaXplKCkpOworICAgIGZvciAoY29uc3QgYXV0byAmc0ZpZWxkIDogcy5maWVsZHMpIHsKKyAgICAgICAgQzJGaWVsZERlc2NyaXB0b3IgZEZpZWxkID0geworICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNGaWVsZC50eXBlKSwKKyAgICAgICAgICAgIHNGaWVsZC5sZW5ndGgsCisgICAgICAgICAgICBzRmllbGQubmFtZSwKKyAgICAgICAgICAgIHNGaWVsZC5maWVsZElkLm9mZnNldCwKKyAgICAgICAgICAgIHNGaWVsZC5maWVsZElkLnNpemUgfTsKKyAgICAgICAgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBuYW1lZFZhbHVlczsKKyAgICAgICAgbmFtZWRWYWx1ZXMucmVzZXJ2ZShzRmllbGQubmFtZWRWYWx1ZXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzTmFtZWRWYWx1ZSA6IHNGaWVsZC5uYW1lZFZhbHVlcykgeworICAgICAgICAgICAgbmFtZWRWYWx1ZXMuZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgICAgIHNOYW1lZFZhbHVlLm5hbWUsCisgICAgICAgICAgICAgICAgQzJWYWx1ZTo6UHJpbWl0aXZlKHN0YXRpY19jYXN0PHVpbnQ2NF90PihzTmFtZWRWYWx1ZS52YWx1ZSkpKTsKKyAgICAgICAgfQorICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6QWRkTmFtZWRWYWx1ZXMoZEZpZWxkLCBzdGQ6Om1vdmUobmFtZWRWYWx1ZXMpKTsKKyAgICAgICAgZEZpZWxkcy5lbXBsYWNlX2JhY2soZEZpZWxkKTsKKyAgICB9CisgICAgKmQgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyU3RydWN0RGVzY3JpcHRvcj4oCisgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6Q3JlYXRlU3RydWN0RGVzY3JpcHRvcihkSW5kZXgsIHN0ZDo6bW92ZShkRmllbGRzKSkpOworICAgIHJldHVybiBDMl9PSzsKK30KKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCisvLyBGaW5kIG9yIGFkZCBhIGhpZGwgQmFzZUJsb2NrIG9iamVjdCBmcm9tIGEgZ2l2ZW4gQzJIYW5kbGUqIHRvIGEgbGlzdCBhbmQgYW4KKy8vIGFzc29jaWF0ZWQgbWFwLgorLy8gTm90ZTogVGhlIGhhbmRsZSBpcyBub3QgY2xvbmVkLgorU3RhdHVzIF9hZGRCYXNlQmxvY2soCisgICAgICAgIHVpbnQzMl90KiBpbmRleCwKKyAgICAgICAgY29uc3QgQzJIYW5kbGUqIGhhbmRsZSwKKyAgICAgICAgc3RkOjpsaXN0PEJhc2VCbG9jaz4qIGJhc2VCbG9ja3MsCisgICAgICAgIHN0ZDo6bWFwPGNvbnN0IHZvaWQqLCB1aW50MzJfdD4qIGJhc2VCbG9ja0luZGljZXMpIHsKKyAgICBpZiAoIWhhbmRsZSkgeworICAgICAgICBBTE9HRSgiYWRkQmFzZUJsb2NrIGNhbGxlZCBvbiBhIG51bGwgQzJIYW5kbGUuIik7CisgICAgICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKKyAgICB9CisgICAgYXV0byBpdCA9IGJhc2VCbG9ja0luZGljZXMtPmZpbmQoaGFuZGxlKTsKKyAgICBpZiAoaXQgIT0gYmFzZUJsb2NrSW5kaWNlcy0+ZW5kKCkpIHsKKyAgICAgICAgKmluZGV4ID0gaXQtPnNlY29uZDsKKyAgICB9IGVsc2UgeworICAgICAgICAqaW5kZXggPSBiYXNlQmxvY2tzLT5zaXplKCk7CisgICAgICAgIGJhc2VCbG9ja0luZGljZXMtPmVtcGxhY2UoaGFuZGxlLCAqaW5kZXgpOworICAgICAgICBiYXNlQmxvY2tzLT5lbXBsYWNlX2JhY2soKTsKKworICAgICAgICBCYXNlQmxvY2sgJmRCYXNlQmxvY2sgPSBiYXNlQmxvY2tzLT5iYWNrKCk7CisgICAgICAgIGRCYXNlQmxvY2sudHlwZSA9IEJhc2VCbG9jazo6VHlwZTo6TkFUSVZFOworICAgICAgICAvLyBUaGlzIGRvZXMgbm90IGNsb25lIHRoZSBoYW5kbGUuCisgICAgICAgIGRCYXNlQmxvY2submF0aXZlQmxvY2sgPQorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgbmF0aXZlX2hhbmRsZV90Kj4oaGFuZGxlKTsKKworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpPSzsKK30KKworLy8gRmluZCBvciBhZGQgYSBoaWRsIEJhc2VCbG9jayBvYmplY3QgZnJvbSBhIGdpdmVuIEJ1ZmZlclBvb2xEYXRhIHRvIGEgbGlzdCBhbmQKKy8vIGFuIGFzc29jaWF0ZWQgbWFwLgorU3RhdHVzIF9hZGRCYXNlQmxvY2soCisgICAgICAgIHVpbnQzMl90KiBpbmRleCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBicERhdGEsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgaWYgKCFicERhdGEpIHsKKyAgICAgICAgQUxPR0UoImFkZEJhc2VCbG9jayBjYWxsZWQgb24gYSBudWxsIEJ1ZmZlclBvb2xEYXRhLiIpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpCQURfVkFMVUU7CisgICAgfQorICAgIGF1dG8gaXQgPSBiYXNlQmxvY2tJbmRpY2VzLT5maW5kKGJwRGF0YS5nZXQoKSk7CisgICAgaWYgKGl0ICE9IGJhc2VCbG9ja0luZGljZXMtPmVuZCgpKSB7CisgICAgICAgICppbmRleCA9IGl0LT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmluZGV4ID0gYmFzZUJsb2Nrcy0+c2l6ZSgpOworICAgICAgICBiYXNlQmxvY2tJbmRpY2VzLT5lbXBsYWNlKGJwRGF0YS5nZXQoKSwgKmluZGV4KTsKKyAgICAgICAgYmFzZUJsb2Nrcy0+ZW1wbGFjZV9iYWNrKCk7CisKKyAgICAgICAgQmFzZUJsb2NrICZkQmFzZUJsb2NrID0gYmFzZUJsb2Nrcy0+YmFjaygpOworICAgICAgICBkQmFzZUJsb2NrLnR5cGUgPSBCYXNlQmxvY2s6OlR5cGU6OlBPT0xFRDsKKworICAgICAgICBpZiAoYnVmZmVyUG9vbFNlbmRlcikgeworICAgICAgICAgICAgUmVzdWx0U3RhdHVzIGJwU3RhdHVzID0gYnVmZmVyUG9vbFNlbmRlci0+c2VuZCgKKyAgICAgICAgICAgICAgICAgICAgYnBEYXRhLAorICAgICAgICAgICAgICAgICAgICAmZEJhc2VCbG9jay5wb29sZWRCbG9jayk7CisKKyAgICAgICAgICAgIGlmIChicFN0YXR1cyAhPSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZW5kIGJ1ZmZlciB3aXRoIEJ1ZmZlclBvb2wuIEVycm9yOiAlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihicFN0YXR1cykpOworICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpPSzsKK30KKworU3RhdHVzIGFkZEJhc2VCbG9jaygKKyAgICAgICAgdWludDMyX3QqIGluZGV4LAorICAgICAgICBjb25zdCBDMkhhbmRsZSogaGFuZGxlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgX0MyQmxvY2tQb29sRGF0YT4mIGJsb2NrUG9vbERhdGEsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgaWYgKCFibG9ja1Bvb2xEYXRhKSB7CisgICAgICAgIC8vIE5vIEJ1ZmZlclBvb2xEYXRhID09PiBOQVRJVkUgYmxvY2suCisgICAgICAgIHJldHVybiBfYWRkQmFzZUJsb2NrKAorICAgICAgICAgICAgICAgIGluZGV4LCBoYW5kbGUsCisgICAgICAgICAgICAgICAgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcyk7CisgICAgfQorICAgIHN3aXRjaCAoYmxvY2tQb29sRGF0YS0+Z2V0VHlwZSgpKSB7CisgICAgY2FzZSBfQzJCbG9ja1Bvb2xEYXRhOjpUWVBFX0JVRkZFUlBPT0w6IHsKKyAgICAgICAgICAgIC8vIEJ1ZmZlclBvb2xEYXRhCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJwRGF0YTsKKyAgICAgICAgICAgIGlmICghX0MyQmxvY2tGYWN0b3J5OjpHZXRCdWZmZXJQb29sRGF0YShibG9ja1Bvb2xEYXRhLCAmYnBEYXRhKQorICAgICAgICAgICAgICAgICAgICB8fCAhYnBEYXRhKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkJ1ZmZlclBvb2xEYXRhIHVuYXZhaWxhYmxlIGluIGEgYmxvY2suIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIF9hZGRCYXNlQmxvY2soCisgICAgICAgICAgICAgICAgICAgIGluZGV4LCBicERhdGEsCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsIGJhc2VCbG9ja3MsIGJhc2VCbG9ja0luZGljZXMpOworICAgICAgICB9CisgICAgY2FzZSBfQzJCbG9ja1Bvb2xEYXRhOjpUWVBFX0JVRkZFUlFVRVVFOgorICAgICAgICAvLyBEbyB0aGUgc2FtZSB0aGluZyBhcyBhIE5BVElWRSBibG9jay4KKyAgICAgICAgcmV0dXJuIF9hZGRCYXNlQmxvY2soCisgICAgICAgICAgICAgICAgaW5kZXgsIGhhbmRsZSwKKyAgICAgICAgICAgICAgICBiYXNlQmxvY2tzLCBiYXNlQmxvY2tJbmRpY2VzKTsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgiVW5rbm93biBDMkJsb2NrUG9vbERhdGEgdHlwZS4iKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgIH0KK30KKworLy8gQzJGZW5jZSAtPiBoaWRsX2hhbmRsZQorLy8gTm90ZTogRmlsZSBkZXNjcmlwdG9ycyBhcmUgbm90IGR1cGxpY2F0ZWQuIFRoZSBvcmlnaW5hbCBmaWxlIGRlc2NyaXB0b3IgbXVzdAorLy8gbm90IGJlIGNsb3NlZCBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uIGlzIGNvbXBsZXRlLgorU3RhdHVzIG9iamNweShoaWRsX2hhbmRsZSogZCwgY29uc3QgQzJGZW5jZSYgcykgeworICAgICh2b2lkKXM7IC8vIFRPRE86IGltcGxlbWVudCBzLmZkKCkKKyAgICBpbnQgZmVuY2VGZCA9IC0xOworICAgIGQtPnNldFRvKG51bGxwdHIpOworICAgIGlmIChmZW5jZUZkID49IDApIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICAgICAgaWYgKCFoYW5kbGUpIHsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICBoYW5kbGUtPmRhdGFbMF0gPSBmZW5jZUZkOworICAgICAgICBkLT5zZXRUbyhoYW5kbGUsIHRydWUgLyogb3ducyAqLyk7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Ok9LOworfQorCisvLyBDMkNvbnN0TGluZWFyQmxvY2sgLT4gQmxvY2sKKy8vIE5vdGU6IE5hdGl2ZSBoYW5kbGVzIGFyZSBub3QgZHVwbGljYXRlZC4gVGhlIG9yaWdpbmFsIGhhbmRsZXMgbXVzdCBub3QgYmUKKy8vIGNsb3NlZCBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uIGlzIGNvbXBsZXRlLgorU3RhdHVzIG9iamNweShCbG9jayogZCwgY29uc3QgQzJDb25zdExpbmVhckJsb2NrJiBzLAorICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBidWZmZXJQb29sU2VuZGVyLAorICAgICAgICBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiogYmFzZUJsb2NrcywKKyAgICAgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiogYmFzZUJsb2NrSW5kaWNlcykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBfQzJCbG9ja1Bvb2xEYXRhPiBicERhdGEgPQorICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpHZXRMaW5lYXJCbG9ja1Bvb2xEYXRhKHMpOworICAgIFN0YXR1cyBzdGF0dXMgPSBhZGRCYXNlQmxvY2soJmQtPmluZGV4LCBzLmhhbmRsZSgpLCBicERhdGEsCisgICAgICAgICAgICBidWZmZXJQb29sU2VuZGVyLCBiYXNlQmxvY2tzLCBiYXNlQmxvY2tJbmRpY2VzKTsKKyAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgdGhlIG1ldGFkYXRhLgorICAgIEMySGlkbF9SYW5nZUluZm8gZFJhbmdlSW5mbzsKKyAgICBkUmFuZ2VJbmZvLm9mZnNldCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzLm9mZnNldCgpKTsKKyAgICBkUmFuZ2VJbmZvLmxlbmd0aCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzLnNpemUoKSk7CisgICAgc3RhdHVzID0gY3JlYXRlUGFyYW1zQmxvYigmZC0+bWV0YSwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPnsgJmRSYW5nZUluZm8gfSk7CisgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBDb3B5IHRoZSBmZW5jZQorICAgIHJldHVybiBvYmpjcHkoJmQtPmZlbmNlLCBzLmZlbmNlKCkpOworfQorCisvLyBDMkNvbnN0R3JhcGhpY0Jsb2NrIC0+IEJsb2NrCisvLyBOb3RlOiBOYXRpdmUgaGFuZGxlcyBhcmUgbm90IGR1cGxpY2F0ZWQuIFRoZSBvcmlnaW5hbCBoYW5kbGVzIG11c3Qgbm90IGJlCisvLyBjbG9zZWQgYmVmb3JlIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21wbGV0ZS4KK1N0YXR1cyBvYmpjcHkoQmxvY2sqIGQsIGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IF9DMkJsb2NrUG9vbERhdGE+IGJwRGF0YSA9CisgICAgICAgICAgICBfQzJCbG9ja0ZhY3Rvcnk6OkdldEdyYXBoaWNCbG9ja1Bvb2xEYXRhKHMpOworICAgIFN0YXR1cyBzdGF0dXMgPSBhZGRCYXNlQmxvY2soJmQtPmluZGV4LCBzLmhhbmRsZSgpLCBicERhdGEsCisgICAgICAgICAgICBidWZmZXJQb29sU2VuZGVyLCBiYXNlQmxvY2tzLCBiYXNlQmxvY2tJbmRpY2VzKTsKKworICAgIC8vIENyZWF0ZSB0aGUgbWV0YWRhdGEuCisgICAgQzJIaWRsX1JlY3RJbmZvIGRSZWN0SW5mbzsKKyAgICBDMlJlY3Qgc1JlY3QgPSBzLmNyb3AoKTsKKyAgICBkUmVjdEluZm8ubGVmdCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzUmVjdC5sZWZ0KTsKKyAgICBkUmVjdEluZm8udG9wID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNSZWN0LnRvcCk7CisgICAgZFJlY3RJbmZvLndpZHRoID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNSZWN0LndpZHRoKTsKKyAgICBkUmVjdEluZm8uaGVpZ2h0ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNSZWN0LmhlaWdodCk7CisgICAgc3RhdHVzID0gY3JlYXRlUGFyYW1zQmxvYigmZC0+bWV0YSwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPnsgJmRSZWN0SW5mbyB9KTsKKyAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIENvcHkgdGhlIGZlbmNlCisgICAgcmV0dXJuIG9iamNweSgmZC0+ZmVuY2UsIHMuZmVuY2UoKSk7Cit9CisKKy8vIEMyQnVmZmVyRGF0YSAtPiBCdWZmZXIKKy8vIFRoaXMgZnVuY3Rpb24gb25seSBmaWxscyBpbiBkLT5ibG9ja3MuCitTdGF0dXMgb2JqY3B5KEJ1ZmZlciogZCwgY29uc3QgQzJCdWZmZXJEYXRhJiBzLAorICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBidWZmZXJQb29sU2VuZGVyLAorICAgICAgICBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiogYmFzZUJsb2NrcywKKyAgICAgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiogYmFzZUJsb2NrSW5kaWNlcykgeworICAgIFN0YXR1cyBzdGF0dXM7CisgICAgZC0+YmxvY2tzLnJlc2l6ZSgKKyAgICAgICAgICAgIHMubGluZWFyQmxvY2tzKCkuc2l6ZSgpICsKKyAgICAgICAgICAgIHMuZ3JhcGhpY0Jsb2NrcygpLnNpemUoKSk7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGZvciAoY29uc3QgQzJDb25zdExpbmVhckJsb2NrJiBsaW5lYXJCbG9jayA6IHMubGluZWFyQmxvY2tzKCkpIHsKKyAgICAgICAgQmxvY2smIGRCbG9jayA9IGQtPmJsb2Nrc1tpKytdOworICAgICAgICBzdGF0dXMgPSBvYmpjcHkoCisgICAgICAgICAgICAgICAgJmRCbG9jaywgbGluZWFyQmxvY2ssCisgICAgICAgICAgICAgICAgYnVmZmVyUG9vbFNlbmRlciwgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcyk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGdyYXBoaWNCbG9jayA6IHMuZ3JhcGhpY0Jsb2NrcygpKSB7CisgICAgICAgIEJsb2NrJiBkQmxvY2sgPSBkLT5ibG9ja3NbaSsrXTsKKyAgICAgICAgc3RhdHVzID0gb2JqY3B5KAorICAgICAgICAgICAgICAgICZkQmxvY2ssIGdyYXBoaWNCbG9jaywKKyAgICAgICAgICAgICAgICBidWZmZXJQb29sU2VuZGVyLCBiYXNlQmxvY2tzLCBiYXNlQmxvY2tJbmRpY2VzKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Ok9LOworfQorCisvLyBDMkJ1ZmZlciAtPiBCdWZmZXIKK1N0YXR1cyBvYmpjcHkoQnVmZmVyKiBkLCBjb25zdCBDMkJ1ZmZlciYgcywKKyAgICAgICAgQnVmZmVyUG9vbFNlbmRlciogYnVmZmVyUG9vbFNlbmRlciwKKyAgICAgICAgc3RkOjpsaXN0PEJhc2VCbG9jaz4qIGJhc2VCbG9ja3MsCisgICAgICAgIHN0ZDo6bWFwPGNvbnN0IHZvaWQqLCB1aW50MzJfdD4qIGJhc2VCbG9ja0luZGljZXMpIHsKKyAgICBTdGF0dXMgc3RhdHVzID0gY3JlYXRlUGFyYW1zQmxvYigmZC0+aW5mbywgcy5pbmZvKCkpOworICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gb2JqY3B5KGQsIHMuZGF0YSgpLCBidWZmZXJQb29sU2VuZGVyLCBiYXNlQmxvY2tzLCBiYXNlQmxvY2tJbmRpY2VzKTsKK30KKworLy8gQzJJbmZvQnVmZmVyIC0+IEluZm9CdWZmZXIKK1N0YXR1cyBvYmpjcHkoSW5mb0J1ZmZlciogZCwgY29uc3QgQzJJbmZvQnVmZmVyJiBzLAorICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBidWZmZXJQb29sU2VuZGVyLAorICAgICAgICBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiogYmFzZUJsb2NrcywKKyAgICAgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiogYmFzZUJsb2NrSW5kaWNlcykgeworICAgIC8vIFRPRE86IEMySW5mb0J1ZmZlciBpcyBub3QgaW1wbGVtZW50ZWQuCisgICAgKHZvaWQpZDsKKyAgICAodm9pZClzOworICAgICh2b2lkKWJ1ZmZlclBvb2xTZW5kZXI7CisgICAgKHZvaWQpYmFzZUJsb2NrczsKKyAgICAodm9pZCliYXNlQmxvY2tJbmRpY2VzOworICAgIHJldHVybiBTdGF0dXM6Ok9LOworICAgIC8qCisgICAgLy8gU3R1YiBpbXBsZW1lbnRhdGlvbiB0aGF0IG1heSB3b3JrIGluIHRoZSBmdXR1cmUuCisgICAgZC0+aW5kZXggPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocy5pbmRleCgpKTsKKyAgICBkLT5idWZmZXIuaW5mby5yZXNpemUoMCk7CisgICAgcmV0dXJuIG9iamNweSgmZC0+YnVmZmVyLCBzLmRhdGEoKSwgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcyk7CisgICAgKi8KK30KKworLy8gQzJGcmFtZURhdGEgLT4gRnJhbWVEYXRhCitTdGF0dXMgb2JqY3B5KEZyYW1lRGF0YSogZCwgY29uc3QgQzJGcmFtZURhdGEmIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgZC0+ZmxhZ3MgPSBzdGF0aWNfY2FzdDxoaWRsX2JpdGZpZWxkPEZyYW1lRGF0YTo6RmxhZ3M+PihzLmZsYWdzKTsKKyAgICBvYmpjcHkoJmQtPm9yZGluYWwsIHMub3JkaW5hbCk7CisKKyAgICBTdGF0dXMgc3RhdHVzOworICAgIGQtPmJ1ZmZlcnMucmVzaXplKHMuYnVmZmVycy5zaXplKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIHNCdWZmZXIgOiBzLmJ1ZmZlcnMpIHsKKyAgICAgICAgQnVmZmVyJiBkQnVmZmVyID0gZC0+YnVmZmVyc1tpKytdOworICAgICAgICBpZiAoIXNCdWZmZXIpIHsKKyAgICAgICAgICAgIC8vIEEgbnVsbCAocG9pbnRlciB0bykgQzJCdWZmZXIgY29ycmVzcG9uZHMgdG8gYSBCdWZmZXIgd2l0aCBlbXB0eQorICAgICAgICAgICAgLy8gaW5mbyBhbmQgYmxvY2tzLgorICAgICAgICAgICAgZEJ1ZmZlci5pbmZvLnJlc2l6ZSgwKTsKKyAgICAgICAgICAgIGRCdWZmZXIuYmxvY2tzLnJlc2l6ZSgwKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IG9iamNweSgKKyAgICAgICAgICAgICAgICAmZEJ1ZmZlciwgKnNCdWZmZXIsCisgICAgICAgICAgICAgICAgYnVmZmVyUG9vbFNlbmRlciwgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcyk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXR1cyA9IGNyZWF0ZVBhcmFtc0Jsb2IoJmQtPmNvbmZpZ1VwZGF0ZSwgcy5jb25maWdVcGRhdGUpOworICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIGQtPmluZm9CdWZmZXJzLnJlc2l6ZShzLmluZm9CdWZmZXJzLnNpemUoKSk7CisgICAgaSA9IDA7CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvQnVmZmVyPiYgc0luZm9CdWZmZXIgOiBzLmluZm9CdWZmZXJzKSB7CisgICAgICAgIEluZm9CdWZmZXImIGRJbmZvQnVmZmVyID0gZC0+aW5mb0J1ZmZlcnNbaSsrXTsKKyAgICAgICAgaWYgKCFzSW5mb0J1ZmZlcikgeworICAgICAgICAgICAgQUxPR0UoIk51bGwgQzJJbmZvQnVmZmVyIik7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gb2JqY3B5KCZkSW5mb0J1ZmZlciwgKnNJbmZvQnVmZmVyLAorICAgICAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsIGJhc2VCbG9ja3MsIGJhc2VCbG9ja0luZGljZXMpOworICAgICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKKy8vIERlZmF1bHRCdWZmZXJQb29sU2VuZGVyJ3MgaW1wbGVtZW50YXRpb24KKworRGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXI6OkRlZmF1bHRCdWZmZXJQb29sU2VuZGVyKAorICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4mIHJlY2VpdmVyTWFuYWdlciwKKyAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6ZHVyYXRpb24gcmVmcmVzaEludGVydmFsKQorICAgIDogbVJlY2VpdmVyTWFuYWdlcihyZWNlaXZlck1hbmFnZXIpLAorICAgICAgbVNvdXJjZUNvbm5lY3Rpb25JZCgwKSwKKyAgICAgIG1MYXN0U2VudChzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKSksCisgICAgICBtUmVmcmVzaEludGVydmFsKHJlZnJlc2hJbnRlcnZhbCkgeworfQorCit2b2lkIERlZmF1bHRCdWZmZXJQb29sU2VuZGVyOjpzZXRSZWNlaXZlcigKKyAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+JiByZWNlaXZlck1hbmFnZXIsCisgICAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OmR1cmF0aW9uIHJlZnJlc2hJbnRlcnZhbCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgaWYgKG1SZWNlaXZlck1hbmFnZXIgIT0gcmVjZWl2ZXJNYW5hZ2VyKSB7CisgICAgICAgIG1SZWNlaXZlck1hbmFnZXIgPSByZWNlaXZlck1hbmFnZXI7CisgICAgfQorICAgIG1SZWZyZXNoSW50ZXJ2YWwgPSByZWZyZXNoSW50ZXJ2YWw7Cit9CisKK1Jlc3VsdFN0YXR1cyBEZWZhdWx0QnVmZmVyUG9vbFNlbmRlcjo6c2VuZCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiYgYnBEYXRhLAorICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlKiBicE1lc3NhZ2UpIHsKKyAgICBpZiAoIW1SZWNlaXZlck1hbmFnZXIpIHsKKyAgICAgICAgQUxPR0UoIk5vIGFjY2VzcyB0byByZWNlaXZlcidzIEJ1ZmZlclBvb2wuIik7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICB9CisgICAgUmVzdWx0U3RhdHVzIHJzOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgaWYgKCFtU2VuZGVyTWFuYWdlcikgeworICAgICAgICBtU2VuZGVyTWFuYWdlciA9IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgICAgIGlmICghbVNlbmRlck1hbmFnZXIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmV0cmlldmUgbG9jYWwgQnVmZmVyUG9vbCBDbGllbnRNYW5hZ2VyLiIpOworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgaW50NjRfdCBjb25uZWN0aW9uSWQgPSBicERhdGEtPm1Db25uZWN0aW9uSWQ7CisgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCBub3cgPQorICAgICAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CisgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6ZHVyYXRpb24gaW50ZXJ2YWwgPSBub3cgLSBtTGFzdFNlbnQ7CisgICAgaWYgKG1Tb3VyY2VDb25uZWN0aW9uSWQgPT0gMCB8fAorICAgICAgICAgICAgbVNvdXJjZUNvbm5lY3Rpb25JZCAhPSBjb25uZWN0aW9uSWQgfHwKKyAgICAgICAgICAgIGludGVydmFsID4gbVJlZnJlc2hJbnRlcnZhbCkgeworICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBidWZmZXJwb29sIGNvbm5lY3Rpb24uCisgICAgICAgIG1Tb3VyY2VDb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgIGlmIChtU291cmNlQ29ubmVjdGlvbklkID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgaW50NjRfdCByZWNlaXZlckNvbm5lY3Rpb25JZDsKKyAgICAgICAgcnMgPSBtU2VuZGVyTWFuYWdlci0+cmVnaXN0ZXJTZW5kZXIobVJlY2VpdmVyTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjZWl2ZXJDb25uZWN0aW9uSWQpOworICAgICAgICBpZiAoKHJzICE9IFJlc3VsdFN0YXR1czo6T0spICYmIChycyAhPSBSZXN1bHRTdGF0dXM6OkFMUkVBRFlfRVhJU1RTKSkgeworICAgICAgICAgICAgQUxPR1coInJlZ2lzdGVyU2VuZGVyIC0tIHJldHVybmVkIGVycm9yOiAlZC4iLAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHJzKSk7CisgICAgICAgICAgICByZXR1cm4gcnM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXJTZW5kZXIgLS0gc3VjY2VlZGVkLiIpOworICAgICAgICAgICAgbVJlY2VpdmVyQ29ubmVjdGlvbklkID0gcmVjZWl2ZXJDb25uZWN0aW9uSWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1aW50NjRfdCB0cmFuc2FjdGlvbklkOworICAgIGludDY0X3QgdGltZXN0YW1wVXM7CisgICAgcnMgPSBtU2VuZGVyTWFuYWdlci0+cG9zdFNlbmQoCisgICAgICAgICAgICBtUmVjZWl2ZXJDb25uZWN0aW9uSWQsIGJwRGF0YSwgJnRyYW5zYWN0aW9uSWQsICZ0aW1lc3RhbXBVcyk7CisgICAgaWYgKHJzICE9IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgQUxPR0UoIkNsaWVudE1hbmFnZXI6OnBvc3RTZW5kIC0tIHJldHVybmVkIGVycm9yOiAlZC4iLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4ocnMpKTsKKyAgICAgICAgcmV0dXJuIHJzOworICAgIH0KKyAgICBpZiAoIWJwTWVzc2FnZSkgeworICAgICAgICBBTE9HRSgiTnVsbCBvdXRwdXQgcGFyYW1ldGVyIGZvciBCdWZmZXJTdGF0dXNNZXNzYWdlLiIpOworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgYnBNZXNzYWdlLT5jb25uZWN0aW9uSWQgPSBtUmVjZWl2ZXJDb25uZWN0aW9uSWQ7CisgICAgYnBNZXNzYWdlLT5idWZmZXJJZCA9IGJwRGF0YS0+bUlkOworICAgIGJwTWVzc2FnZS0+dHJhbnNhY3Rpb25JZCA9IHRyYW5zYWN0aW9uSWQ7CisgICAgYnBNZXNzYWdlLT50aW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOworICAgIG1MYXN0U2VudCA9IG5vdzsKKyAgICByZXR1cm4gcnM7Cit9CisKKy8vIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gLT4gV29ya0J1bmRsZQorU3RhdHVzIG9iamNweSgKKyAgICAgICAgV29ya0J1bmRsZSogZCwKKyAgICAgICAgY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgcywKKyAgICAgICAgQnVmZmVyUG9vbFNlbmRlciogYnVmZmVyUG9vbFNlbmRlcikgeworICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6Ok9LOworCisgICAgLy8gYmFzZUJsb2NrcyBob2xkcyBhIGxpc3Qgb2YgQmFzZUJsb2NrIG9iamVjdHMgdGhhdCBCbG9ja3MgY2FuIHJlZmVyIHRvLgorICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+IGJhc2VCbG9ja3M7CisKKyAgICAvLyBiYXNlQmxvY2tJbmRpY2VzIG1hcHMgYSByYXcgcG9pbnRlciB0byBuYXRpdmVfaGFuZGxlX3Qgb3IgQnVmZmVyUG9vbERhdGEKKyAgICAvLyBpbnNpZGUgYmFzZUJsb2NrcyB0byB0aGUgY29ycmVzcG9uZGluZyBpbmRleCBpbnRvIGJhc2VCbG9ja3MuIFRoZSBrZXlzCisgICAgLy8gKHBvaW50ZXJzKSBhcmUgdXNlZCB0byBpZGVudGlmeSBibG9ja3MgdGhhdCBoYXZlIHRoZSBzYW1lICJiYXNlIGJsb2NrIiBpbgorICAgIC8vIHMsIGEgbGlzdCBvZiBDMldvcmsgb2JqZWN0cy4gQmVjYXVzZSBiYXNlQmxvY2tzIHdpbGwgYmUgY29waWVkIGludG8gYQorICAgIC8vIGhpZGxfdmVjIGV2ZW50dWFsbHksIHRoZSB2YWx1ZXMgb2YgYmFzZUJsb2NrSW5kaWNlcyBhcmUgemVyby1iYXNlZAorICAgIC8vIGludGVnZXIgaW5kaWNlcyBpbnN0ZWFkIG9mIGxpc3QgaXRlcmF0b3JzLgorICAgIC8vCisgICAgLy8gTm90ZSB0aGF0IHRoZSBwb2ludGVycyBjYW4gYmUgcmF3IGJlY2F1c2UgYmFzZUJsb2NrSW5kaWNlcyBoYXMgYSBzaG9ydGVyCisgICAgLy8gbGlmZXNwYW4gdGhhbiBhbGwgb2YgYmFzZSBibG9ja3MuCisgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiBiYXNlQmxvY2tJbmRpY2VzOworCisgICAgZC0+d29ya3MucmVzaXplKHMuc2l6ZSgpKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgc1dvcmsgOiBzKSB7CisgICAgICAgIFdvcmsgJmRXb3JrID0gZC0+d29ya3NbaSsrXTsKKyAgICAgICAgaWYgKCFzV29yaykgeworICAgICAgICAgICAgQUxPR1coIk51bGwgQzJXb3JrIGVuY291bnRlcmVkLiIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gb2JqY3B5KCZkV29yay5pbnB1dCwgc1dvcmstPmlucHV0LAorICAgICAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsICZiYXNlQmxvY2tzLCAmYmFzZUJsb2NrSW5kaWNlcyk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBpZiAoc1dvcmstPndvcmtsZXRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVygiV29yayB3aXRoIG5vIHdvcmtsZXRzLiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHNXb3JrLT53b3JrbGV0cy5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIldvcmsgd2l0aCBtdWx0aXBsZSB3b3JrbGV0cy4gIgorICAgICAgICAgICAgICAgICAgICAgICAgIk9ubHkgdGhlIGZpcnN0IHdvcmtsZXQgd2lsbCBiZSBtYXJzaGFsbGVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFzV29yay0+d29ya2xldHMuZnJvbnQoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJOdWxsIHdvcmtsZXQgZW5jb3VudGVyZWQuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBQYXJjZWwgdGhlIGZpcnN0IHdvcmtsZXQuCisgICAgICAgICAgICBjb25zdCBDMldvcmtsZXQgJnNXb3JrbGV0ID0gKnNXb3JrLT53b3JrbGV0cy5mcm9udCgpOworICAgICAgICAgICAgV29ya2xldCAmZFdvcmtsZXQgPSBkV29yay53b3JrbGV0OworCisgICAgICAgICAgICBkV29ya2xldC50dW5pbmdzLnJlc2l6ZShzV29ya2xldC50dW5pbmdzLnNpemUoKSk7CisgICAgICAgICAgICBzaXplX3QgaiA9IDA7CisgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMlR1bmluZz4mIHNUdW5pbmcgOiBzV29ya2xldC50dW5pbmdzKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgICAgICAgICAgICAgICAgICZkV29ya2xldC50dW5pbmdzW2orK10sCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsgcmVpbnRlcnByZXRfY2FzdDxDMlBhcmFtKj4oc1R1bmluZy5nZXQoKSkgfSk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkV29ya2xldC5mYWlsdXJlcy5yZXNpemUoc1dvcmtsZXQuZmFpbHVyZXMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGogPSAwOworICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiYgc0ZhaWx1cmUgOgorICAgICAgICAgICAgICAgICAgICBzV29ya2xldC5mYWlsdXJlcykgeworICAgICAgICAgICAgICAgIGlmICghc0ZhaWx1cmUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk51bGwgQzJTZXR0aW5nUmVzdWx0Iik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhdHVzID0gb2JqY3B5KCZkV29ya2xldC5mYWlsdXJlc1tqKytdLCAqc0ZhaWx1cmUpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdHVzID0gb2JqY3B5KCZkV29ya2xldC5vdXRwdXQsIHNXb3JrbGV0Lm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyUG9vbFNlbmRlciwgJmJhc2VCbG9ja3MsICZiYXNlQmxvY2tJbmRpY2VzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZFdvcmsud29ya2xldFByb2Nlc3NlZCA9IHNXb3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA+IDA7CisgICAgICAgIGRXb3JrLnJlc3VsdCA9IHN0YXRpY19jYXN0PFN0YXR1cz4oc1dvcmstPnJlc3VsdCk7CisgICAgfQorCisgICAgLy8gQ29weSBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiB0byBoaWRsX3ZlYzxCYXNlQmxvY2s+LgorICAgIHsKKyAgICAgICAgZC0+YmFzZUJsb2Nrcy5yZXNpemUoYmFzZUJsb2Nrcy5zaXplKCkpOworICAgICAgICBzaXplX3QgaSA9IDA7CisgICAgICAgIGZvciAoY29uc3QgQmFzZUJsb2NrJiBiYXNlQmxvY2sgOiBiYXNlQmxvY2tzKSB7CisgICAgICAgICAgICBkLT5iYXNlQmxvY2tzW2krK10gPSBiYXNlQmxvY2s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gU3RhdHVzOjpPSzsKK30KKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCitzdHJ1Y3QgQzJCYXNlQmxvY2sgeworICAgIGVudW0gdHlwZV90IHsKKyAgICAgICAgTElORUFSLAorICAgICAgICBHUkFQSElDLAorICAgIH07CisgICAgdHlwZV90IHR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGxpbmVhcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGdyYXBoaWM7Cit9OworCisvLyBoaWRsX2hhbmRsZSAtPiBDMkZlbmNlCisvLyBOb3RlOiBGaWxlIGRlc2NyaXB0b3JzIGFyZSBub3QgZHVwbGljYXRlZC4gVGhlIG9yaWdpbmFsIGZpbGUgZGVzY3JpcHRvciBtdXN0CisvLyBub3QgYmUgY2xvc2VkIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUuCitjMl9zdGF0dXNfdCBvYmpjcHkoQzJGZW5jZSogZCwgY29uc3QgaGlkbF9oYW5kbGUmIHMpIHsKKyAgICAvLyBUT0RPOiBJbXBsZW1lbnQuCisgICAgKHZvaWQpczsKKyAgICAqZCA9IEMyRmVuY2UoKTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKy8vIEMyTGluZWFyQmxvY2ssIHZlY3RvcjxDMlBhcmFtKj4sIEMyRmVuY2UgLT4gQzJCdWZmZXIKK2MyX3N0YXR1c190IGNyZWF0ZUxpbmVhckJ1ZmZlcigKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiogYnVmZmVyLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4mIGJsb2NrLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4mIG1ldGEsCisgICAgICAgIGNvbnN0IEMyRmVuY2UmIGZlbmNlKSB7CisgICAgLy8gQ2hlY2sgdGhlIGJsb2NrIG1ldGEuIEl0IHNob3VsZCBoYXZlIGV4YWN0bHkgMSBDMkluZm86CisgICAgLy8gQzJIaWRsX1JhbmdlSW5mby4KKyAgICBpZiAoKG1ldGEuc2l6ZSgpICE9IDEpIHx8ICFtZXRhWzBdKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIGJsb2NrIG1ldGFkYXRhIGZvciBpb24gYmxvY2suIik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorICAgIGlmIChtZXRhWzBdLT5zaXplKCkgIT0gc2l6ZW9mKEMySGlkbF9SYW5nZUluZm8pKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIGJsb2NrIG1ldGFkYXRhIGZvciBpb24gYmxvY2s6IHJhbmdlLiIpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKyAgICBDMkhpZGxfUmFuZ2VJbmZvICpyYW5nZUluZm8gPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxDMkhpZGxfUmFuZ2VJbmZvKj4obWV0YVswXSk7CisKKyAgICAvLyBDcmVhdGUgQzJCdWZmZXIgZnJvbSBDMkxpbmVhckJsb2NrLgorICAgICpidWZmZXIgPSBDMkJ1ZmZlcjo6Q3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLT5zaGFyZSgKKyAgICAgICAgICAgIHJhbmdlSW5mby0+b2Zmc2V0LCByYW5nZUluZm8tPmxlbmd0aCwKKyAgICAgICAgICAgIGZlbmNlKSk7CisgICAgaWYgKCEoKmJ1ZmZlcikpIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBjcmVhdGUgYSBsaW5lYXIgYnVmZmVyLiIpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKy8vIEMyR3JhcGhpY0Jsb2NrLCB2ZWN0b3I8QzJQYXJhbSo+LCBDMkZlbmNlIC0+IEMyQnVmZmVyCitjMl9zdGF0dXNfdCBjcmVhdGVHcmFwaGljQnVmZmVyKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+KiBidWZmZXIsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4mIGJsb2NrLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4mIG1ldGEsCisgICAgICAgIGNvbnN0IEMyRmVuY2UmIGZlbmNlKSB7CisgICAgLy8gQ2hlY2sgdGhlIGJsb2NrIG1ldGEuIEl0IHNob3VsZCBoYXZlIGV4YWN0bHkgMSBDMkluZm86CisgICAgLy8gQzJIaWRsX1JlY3RJbmZvLgorICAgIGlmICgobWV0YS5zaXplKCkgIT0gMSkgfHwgIW1ldGFbMF0pIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgYmxvY2sgbWV0YWRhdGEgZm9yIGdyYXBoaWMgYmxvY2suIik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorICAgIGlmIChtZXRhWzBdLT5zaXplKCkgIT0gc2l6ZW9mKEMySGlkbF9SZWN0SW5mbykpIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgYmxvY2sgbWV0YWRhdGEgZm9yIGdyYXBoaWMgYmxvY2s6IGNyb3AgcmVjdC4iKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisgICAgQzJIaWRsX1JlY3RJbmZvICpyZWN0SW5mbyA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEMySGlkbF9SZWN0SW5mbyo+KG1ldGFbMF0pOworCisgICAgLy8gQ3JlYXRlIEMyQnVmZmVyIGZyb20gQzJHcmFwaGljQmxvY2suCisgICAgKmJ1ZmZlciA9IEMyQnVmZmVyOjpDcmVhdGVHcmFwaGljQnVmZmVyKGJsb2NrLT5zaGFyZSgKKyAgICAgICAgICAgIEMyUmVjdChyZWN0SW5mby0+d2lkdGgsIHJlY3RJbmZvLT5oZWlnaHQpLgorICAgICAgICAgICAgYXQocmVjdEluZm8tPmxlZnQsIHJlY3RJbmZvLT50b3ApLAorICAgICAgICAgICAgZmVuY2UpKTsKKyAgICBpZiAoISgqYnVmZmVyKSkgeworICAgICAgICBBTE9HRSgiQ2Fubm90IGNyZWF0ZSBhIGdyYXBoaWMgYnVmZmVyLiIpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKy8vIEJ1ZmZlciAtPiBDMkJ1ZmZlcgorLy8gTm90ZTogVGhlIG5hdGl2ZSBoYW5kbGVzIHdpbGwgYmUgY2xvbmVkLgorYzJfc3RhdHVzX3Qgb2JqY3B5KHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4qIGQsIGNvbnN0IEJ1ZmZlciYgcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJCYXNlQmxvY2s+JiBiYXNlQmxvY2tzKSB7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgICpkID0gbnVsbHB0cjsKKworICAgIC8vIEN1cnJlbnRseSwgYSBub24tbnVsbCBDMkJ1ZmZlciBtdXN0IGNvbnRhaW4gZXhhY3RseSAxIGJsb2NrLgorICAgIGlmIChzLmJsb2Nrcy5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfSBlbHNlIGlmIChzLmJsb2Nrcy5zaXplKCkgIT0gMSkgeworICAgICAgICBBTE9HRSgiQ3VycmVudGx5LCBhIEMyQnVmZmVyIG11c3QgY29udGFpbiBleGFjdGx5IDEgYmxvY2suIik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgY29uc3QgQmxvY2sgJnNCbG9jayA9IHMuYmxvY2tzWzBdOworICAgIGlmIChzQmxvY2suaW5kZXggPj0gYmFzZUJsb2Nrcy5zaXplKCkpIHsKKyAgICAgICAgQUxPR0UoIkluZGV4IGludG8gYmFzZUJsb2NrcyBpcyBvdXQgb2YgcmFuZ2UuIik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorICAgIGNvbnN0IEMyQmFzZUJsb2NrICZiYXNlQmxvY2sgPSBiYXNlQmxvY2tzW3NCbG9jay5pbmRleF07CisKKyAgICAvLyBQYXJzZSBtZXRhLgorICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBzQmxvY2tNZXRhOworICAgIHN0YXR1cyA9IHBhcnNlUGFyYW1zQmxvYigmc0Jsb2NrTWV0YSwgc0Jsb2NrLm1ldGEpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgYmxvY2sgcGFyYW1zIGJsb2IuIik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gQ29weSBmZW5jZS4KKyAgICBDMkZlbmNlIGRGZW5jZTsKKyAgICBzdGF0dXMgPSBvYmpjcHkoJmRGZW5jZSwgc0Jsb2NrLmZlbmNlKTsKKworICAgIC8vIENvbnN0cnVjdCBhIGJsb2NrLgorICAgIHN3aXRjaCAoYmFzZUJsb2NrLnR5cGUpIHsKKyAgICBjYXNlIEMyQmFzZUJsb2NrOjpMSU5FQVI6CisgICAgICAgIHN0YXR1cyA9IGNyZWF0ZUxpbmVhckJ1ZmZlcihkLCBiYXNlQmxvY2subGluZWFyLCBzQmxvY2tNZXRhLCBkRmVuY2UpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyQmFzZUJsb2NrOjpHUkFQSElDOgorICAgICAgICBzdGF0dXMgPSBjcmVhdGVHcmFwaGljQnVmZmVyKGQsIGJhc2VCbG9jay5ncmFwaGljLCBzQmxvY2tNZXRhLCBkRmVuY2UpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgiSW52YWxpZCBCYXNlQmxvY2sgdHlwZS4iKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8vIFBhcnNlIGluZm8KKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gcGFyYW1zOworICAgIHN0YXR1cyA9IHBhcnNlUGFyYW1zQmxvYigmcGFyYW1zLCBzLmluZm8pOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgYnVmZmVyIHBhcmFtcyBibG9iLiIpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBmb3IgKEMyUGFyYW0qIHBhcmFtIDogcGFyYW1zKSB7CisgICAgICAgIGlmIChwYXJhbSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiTnVsbCBidWZmZXIgcGFyYW0gZW5jb3VudGVyZWQuIik7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBjMnBhcmFtKAorICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoKnBhcmFtKS5yZWxlYXNlKCkpOworICAgICAgICBpZiAoIWMycGFyYW0pIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGJ1ZmZlciBwYXJhbSBpbnNpZGUgYSBibG9iLiIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSAoKmQpLT5zZXRJbmZvKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMkluZm8+KGMycGFyYW0pKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoIkMyQnVmZmVyOjpzZXRJbmZvIGZhaWxlZCgpLiIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworLy8gRnJhbWVEYXRhIC0+IEMyRnJhbWVEYXRhCitjMl9zdGF0dXNfdCBvYmpjcHkoQzJGcmFtZURhdGEqIGQsIGNvbnN0IEZyYW1lRGF0YSYgcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJCYXNlQmxvY2s+JiBiYXNlQmxvY2tzKSB7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIGQtPmZsYWdzID0gc3RhdGljX2Nhc3Q8QzJGcmFtZURhdGE6OmZsYWdzX3Q+KHMuZmxhZ3MpOworICAgIG9iamNweSgmZC0+b3JkaW5hbCwgcy5vcmRpbmFsKTsKKyAgICBkLT5idWZmZXJzLmNsZWFyKCk7CisgICAgZC0+YnVmZmVycy5yZXNlcnZlKHMuYnVmZmVycy5zaXplKCkpOworICAgIGZvciAoY29uc3QgQnVmZmVyJiBzQnVmZmVyIDogcy5idWZmZXJzKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gZEJ1ZmZlcjsKKyAgICAgICAgc3RhdHVzID0gb2JqY3B5KCZkQnVmZmVyLCBzQnVmZmVyLCBiYXNlQmxvY2tzKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBkLT5idWZmZXJzLmVtcGxhY2VfYmFjayhkQnVmZmVyKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gcGFyYW1zOworICAgIHN0YXR1cyA9IHBhcnNlUGFyYW1zQmxvYigmcGFyYW1zLCBzLmNvbmZpZ1VwZGF0ZSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHBhcnNlIGZyYW1lIGRhdGEgcGFyYW1zLiIpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBkLT5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICBmb3IgKEMyUGFyYW0qIHBhcmFtIDogcGFyYW1zKSB7CisgICAgICAgIGQtPmNvbmZpZ1VwZGF0ZS5lbXBsYWNlX2JhY2soQzJQYXJhbTo6Q29weSgqcGFyYW0pKTsKKyAgICAgICAgaWYgKCFkLT5jb25maWdVcGRhdGUuYmFjaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5leHBlY3RlZCBlcnJvciB3aGlsZSBwYXJzaW5nIGZyYW1lIGRhdGEgcGFyYW1zLiIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIG9uY2UgQzJJbmZvQnVmZmVyIGhhcyBjb25zdHJ1Y3RvcnMuCisgICAgZC0+aW5mb0J1ZmZlcnMuY2xlYXIoKTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKy8vIEJhc2VCbG9jayAtPiBDMkJhc2VCbG9jaworYzJfc3RhdHVzX3Qgb2JqY3B5KEMyQmFzZUJsb2NrKiBkLCBjb25zdCBCYXNlQmxvY2smIHMpIHsKKyAgICBzd2l0Y2ggKHMudHlwZSkgeworICAgIGNhc2UgQmFzZUJsb2NrOjpUeXBlOjpOQVRJVkU6IHsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogc0hhbmRsZSA9CisgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvbmUocy5uYXRpdmVCbG9jayk7CisgICAgICAgICAgICBpZiAoc0hhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIk51bGwgbmF0aXZlIGhhbmRsZSBpbiBhIGJsb2NrLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqc0MySGFuZGxlID0KKyAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDMkhhbmRsZSo+KHNIYW5kbGUpOworCisgICAgICAgICAgICBkLT5saW5lYXIgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUxpbmVhckJsb2NrKHNDMkhhbmRsZSk7CisgICAgICAgICAgICBpZiAoZC0+bGluZWFyKSB7CisgICAgICAgICAgICAgICAgZC0+dHlwZSA9IEMyQmFzZUJsb2NrOjpMSU5FQVI7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkLT5ncmFwaGljID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soc0MySGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChkLT5ncmFwaGljKSB7CisgICAgICAgICAgICAgICAgZC0+dHlwZSA9IEMyQmFzZUJsb2NrOjpHUkFQSElDOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR0UoIlVua25vd24gaGFuZGxlIHR5cGUgaW4gbmF0aXZlIEJhc2VCbG9jay4iKTsKKyAgICAgICAgICAgIGlmIChzSGFuZGxlKSB7CisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShzSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShzSGFuZGxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgIH0KKyAgICBjYXNlIEJhc2VCbG9jazo6VHlwZTo6UE9PTEVEOiB7CisgICAgICAgICAgICBjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZicE1lc3NhZ2UgPQorICAgICAgICAgICAgICAgICAgICBzLnBvb2xlZEJsb2NrOworICAgICAgICAgICAgc3A8Q2xpZW50TWFuYWdlcj4gYnAgPSBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBicERhdGE7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmNIYW5kbGU7CisgICAgICAgICAgICBSZXN1bHRTdGF0dXMgYnBTdGF0dXMgPSBicC0+cmVjZWl2ZSgKKyAgICAgICAgICAgICAgICAgICAgYnBNZXNzYWdlLmNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgYnBNZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgIGJwTWVzc2FnZS5idWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgYnBNZXNzYWdlLnRpbWVzdGFtcFVzLAorICAgICAgICAgICAgICAgICAgICAmY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgJmJwRGF0YSk7CisgICAgICAgICAgICBpZiAoYnBTdGF0dXMgIT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVjZWl2ZSBidWZmZXIgZnJvbSBidWZmZXJwb29sIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZXN1bHRTdGF0dXMgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGJwU3RhdHVzKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRvQzJTdGF0dXMoYnBTdGF0dXMpOworICAgICAgICAgICAgfSBlbHNlIGlmICghYnBEYXRhKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIk5vIGRhdGEgaW4gYnVmZmVycG9vbCB0cmFuc2FjdGlvbi4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkLT5saW5lYXIgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUxpbmVhckJsb2NrKGNIYW5kbGUsIGJwRGF0YSk7CisgICAgICAgICAgICBpZiAoZC0+bGluZWFyKSB7CisgICAgICAgICAgICAgICAgZC0+dHlwZSA9IEMyQmFzZUJsb2NrOjpMSU5FQVI7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkLT5ncmFwaGljID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soY0hhbmRsZSwgYnBEYXRhKTsKKyAgICAgICAgICAgIGlmIChkLT5ncmFwaGljKSB7CisgICAgICAgICAgICAgICAgZC0+dHlwZSA9IEMyQmFzZUJsb2NrOjpHUkFQSElDOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR0UoIlVua25vd24gaGFuZGxlIHR5cGUgaW4gcG9vbGVkIEJhc2VCbG9jay4iKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgiQ29ycnVwdGVkIEJhc2VCbG9jayB0eXBlOiAlZCIsIHN0YXRpY19jYXN0PGludD4ocy50eXBlKSk7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorfQorCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKKy8vIFdvcmtCdW5kbGUgLT4gc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PgorYzJfc3RhdHVzX3Qgb2JqY3B5KHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGQsIGNvbnN0IFdvcmtCdW5kbGUmIHMpIHsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICAvLyBDb252ZXJ0IEJhc2VCbG9ja3MgdG8gQzJCYXNlQmxvY2tzLgorICAgIHN0ZDo6dmVjdG9yPEMyQmFzZUJsb2NrPiBkQmFzZUJsb2NrcyhzLmJhc2VCbG9ja3Muc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHMuYmFzZUJsb2Nrcy5zaXplKCk7ICsraSkgeworICAgICAgICBzdGF0dXMgPSBvYmpjcHkoJmRCYXNlQmxvY2tzW2ldLCBzLmJhc2VCbG9ja3NbaV0pOworICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgfQorCisgICAgZC0+Y2xlYXIoKTsKKyAgICBmb3IgKGNvbnN0IFdvcmsmIHNXb3JrIDogcy53b3JrcykgeworICAgICAgICBkLT5lbXBsYWNlX2JhY2soc3RkOjptYWtlX3VuaXF1ZTxDMldvcms+KCkpOworICAgICAgICBDMldvcmsmIGRXb3JrID0gKmQtPmJhY2soKTsKKworICAgICAgICAvLyBpbnB1dAorICAgICAgICBzdGF0dXMgPSBvYmpjcHkoJmRXb3JrLmlucHV0LCBzV29yay5pbnB1dCwgZEJhc2VCbG9ja3MpOworICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiRXJyb3IgY29uc3RydWN0aW5nIEMyV29yaydzIGlucHV0LiIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdvcmtsZXQocykKKyAgICAgICAgZFdvcmsud29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgLy8gVE9ETzogQ3VycmVudGx5LCB0dW5uZWxpbmcgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgICAgaWYgKHNXb3JrLndvcmtsZXRQcm9jZXNzZWQpIHsKKyAgICAgICAgICAgIGRXb3JrLndvcmtsZXRzUHJvY2Vzc2VkID0gMTsKKworICAgICAgICAgICAgY29uc3QgV29ya2xldCAmc1dvcmtsZXQgPSBzV29yay53b3JrbGV0OworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29ya2xldD4gZFdvcmtsZXQgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyV29ya2xldD4oKTsKKworICAgICAgICAgICAgLy8gdHVuaW5ncworICAgICAgICAgICAgZFdvcmtsZXQtPnR1bmluZ3MuY2xlYXIoKTsKKyAgICAgICAgICAgIGRXb3JrbGV0LT50dW5pbmdzLnJlc2VydmUoc1dvcmtsZXQudHVuaW5ncy5zaXplKCkpOworICAgICAgICAgICAgZm9yIChjb25zdCBQYXJhbXMmIHNUdW5pbmcgOiBzV29ya2xldC50dW5pbmdzKSB7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IGRQYXJhbXM7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gcGFyc2VQYXJhbXNCbG9iKCZkUGFyYW1zLCBzVHVuaW5nKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcGFyc2UgQzJUdW5pbmcgaW4gQzJXb3JrbGV0LiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKEMyUGFyYW0qIHBhcmFtIDogZFBhcmFtcykgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gZFBhcmFtID0gQzJQYXJhbTo6Q29weSgqcGFyYW0pOworICAgICAgICAgICAgICAgICAgICBpZiAoIWRQYXJhbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk51bGwgQzJUdW5pbmcgZW5jb3VudGVyZWQgd2hpbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyc2luZyBDMldvcmtsZXQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRXb3JrbGV0LT50dW5pbmdzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJUdW5pbmc+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QzJUdW5pbmcqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkUGFyYW0ucmVsZWFzZSgpKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGZhaWx1cmVzCisgICAgICAgICAgICBkV29ya2xldC0+ZmFpbHVyZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIGRXb3JrbGV0LT5mYWlsdXJlcy5yZXNlcnZlKHNXb3JrbGV0LmZhaWx1cmVzLnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IFNldHRpbmdSZXN1bHQmIHNGYWlsdXJlIDogc1dvcmtsZXQuZmFpbHVyZXMpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiBkRmFpbHVyZTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBvYmpjcHkoJmRGYWlsdXJlLCBzRmFpbHVyZSk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBDMlNldHRpbmdSZXN1bHQgaW4gQzJXb3JrbGV0LiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkV29ya2xldC0+ZmFpbHVyZXMuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShkRmFpbHVyZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gb3V0cHV0CisgICAgICAgICAgICBzdGF0dXMgPSBvYmpjcHkoJmRXb3JrbGV0LT5vdXRwdXQsIHNXb3JrbGV0Lm91dHB1dCwgZEJhc2VCbG9ja3MpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIG91dHB1dCBDMkZyYW1lRGF0YS4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZFdvcmsud29ya2xldHMuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShkV29ya2xldCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZFdvcmsud29ya2xldHMuZW1wbGFjZV9iYWNrKHN0ZDo6bWFrZV91bmlxdWU8QzJXb3JrbGV0PigpKTsKKyAgICAgICAgICAgIGRXb3JrLndvcmtsZXRzUHJvY2Vzc2VkID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlc3VsdAorICAgICAgICBkV29yay5yZXN1bHQgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc1dvcmsucmVzdWx0KTsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NvbnN0ZXhwciBzaXplX3QgUEFSQU1TX0FMSUdOTUVOVCA9IDg7ICAvLyA2NC1iaXQgYWxpZ25tZW50CitzdGF0aWNfYXNzZXJ0KFBBUkFNU19BTElHTk1FTlQgJSBhbGlnbm9mKEMyUGFyYW0pID09IDAsICJDMlBhcmFtIGFsaWdubWVudCBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChQQVJBTVNfQUxJR05NRU5UICUgYWxpZ25vZihDMkluZm8pID09IDAsICJDMlBhcmFtIGFsaWdubWVudCBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChQQVJBTVNfQUxJR05NRU5UICUgYWxpZ25vZihDMlR1bmluZykgPT0gMCwgIkMyUGFyYW0gYWxpZ25tZW50IG1pc21hdGNoIik7CisKKy8vIFBhcmFtcyAtPiBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4KK2MyX3N0YXR1c190IHBhcnNlUGFyYW1zQmxvYihzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gKnBhcmFtcywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJmJsb2IpIHsKKyAgICAvLyBhc3N1bWluZyBibG9iIGlzIGNvbnN0IGhlcmUKKyAgICBzaXplX3Qgc2l6ZSA9IGJsb2Iuc2l6ZSgpOworICAgIHNpemVfdCBpeCA9IDA7CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGJsb2IuZGF0YSgpOworICAgIEMyUGFyYW0gKnAgPSBudWxscHRyOworCisgICAgZG8geworICAgICAgICBwID0gQzJQYXJhbVV0aWxzOjpQYXJzZUZpcnN0KGRhdGEgKyBpeCwgc2l6ZSAtIGl4KTsKKyAgICAgICAgaWYgKHApIHsKKyAgICAgICAgICAgIHBhcmFtcy0+ZW1wbGFjZV9iYWNrKHApOworICAgICAgICAgICAgaXggKz0gcC0+c2l6ZSgpOworICAgICAgICAgICAgaXggPSBhbGlnbihpeCwgUEFSQU1TX0FMSUdOTUVOVCk7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChwKTsKKworICAgIHJldHVybiBpeCA9PSBzaXplID8gQzJfT0sgOiBDMl9CQURfVkFMVUU7Cit9CisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworLyoqCisgKiBDb25jYXRlbmF0ZXMgYSBsaXN0IG9mIEMyUGFyYW1zIGludG8gYSBwYXJhbXMgYmxvYi4KKyAqIFxwYXJhbVtvdXRdIGJsb2IgdGFyZ2V0IGJsb2IKKyAqIFxwYXJhbVtpbl0gcGFyYW1zIHBhcmFtZXRlcnMgdG8gY29uY2F0ZW5hdGUKKyAqIFxyZXR2YWwgQzJfT0sgaWYgdGhlIGJsb2Igd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkCisgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBpZiB0aGUgYmxvYiB3YXMgbm90IHN1Y2Nlc3NmdWwgKHRoaXMgb25seSBoYXBwZW5zIGlmIHRoZSBwYXJhbWV0ZXJzIHdlcmUKKyAqICAgICAgICAgbm90IGNvbnN0KQorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorU3RhdHVzIF9jcmVhdGVQYXJhbXNCbG9iKGhpZGxfdmVjPHVpbnQ4X3Q+ICpibG9iLCBjb25zdCBUICZwYXJhbXMpIHsKKyAgICAvLyBhc3N1bWluZyB0aGUgcGFyYW1ldGVyIHZhbHVlcyBhcmUgY29uc3QKKyAgICBzaXplX3Qgc2l6ZSA9IDA7CisgICAgZm9yIChjb25zdCBhdXRvICZwIDogcGFyYW1zKSB7CisgICAgICAgIGlmICghcCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZSArPSBwLT5zaXplKCk7CisgICAgICAgIHNpemUgPSBhbGlnbihzaXplLCBQQVJBTVNfQUxJR05NRU5UKTsKKyAgICB9CisgICAgYmxvYi0+cmVzaXplKHNpemUpOworICAgIHNpemVfdCBpeCA9IDA7CisgICAgZm9yIChjb25zdCBhdXRvICZwIDogcGFyYW1zKSB7CisgICAgICAgIGlmICghcCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gTkVWRVIgb3ZlcndyaXRlIGV2ZW4gaWYgcGFyYW0gdmFsdWVzIChlLmcuIHNpemUpIGNoYW5nZWQKKyAgICAgICAgc2l6ZV90IHBhcmFtU2l6ZSA9IHN0ZDo6bWluKHAtPnNpemUoKSwgc2l6ZSAtIGl4KTsKKyAgICAgICAgc3RkOjpjb3B5KAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KCYqcCksCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oJipwKSArIHBhcmFtU2l6ZSwKKyAgICAgICAgICAgICAgICAmKCpibG9iKVtpeF0pOworICAgICAgICBpeCArPSBwYXJhbVNpemU7CisgICAgICAgIGl4ID0gYWxpZ24oaXgsIFBBUkFNU19BTElHTk1FTlQpOworICAgIH0KKyAgICBibG9iLT5yZXNpemUoaXgpOworICAgIHJldHVybiBpeCA9PSBzaXplID8gU3RhdHVzOjpPSyA6IFN0YXR1czo6Q09SUlVQVEVEOworfQorCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKKy8vIHN0ZDo6dmVjdG9yPGNvbnN0IEMyUGFyYW0qPiAtPiBQYXJhbXMKK1N0YXR1cyBjcmVhdGVQYXJhbXNCbG9iKAorICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgQzJQYXJhbSo+ICZwYXJhbXMpIHsKKyAgICByZXR1cm4gX2NyZWF0ZVBhcmFtc0Jsb2IoYmxvYiwgcGFyYW1zKTsKK30KKworLy8gc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IC0+IFBhcmFtcworU3RhdHVzIGNyZWF0ZVBhcmFtc0Jsb2IoCisgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+ICpibG9iLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcykgeworICAgIHJldHVybiBfY3JlYXRlUGFyYW1zQmxvYihibG9iLCBwYXJhbXMpOworfQorCisvLyBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IC0+IFBhcmFtcworU3RhdHVzIGNyZWF0ZVBhcmFtc0Jsb2IoCisgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+ICpibG9iLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICZwYXJhbXMpIHsKKyAgICByZXR1cm4gX2NyZWF0ZVBhcmFtc0Jsb2IoYmxvYiwgcGFyYW1zKTsKK30KKworLy8gc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyVHVuaW5nPj4gLT4gUGFyYW1zCitTdGF0dXMgY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlR1bmluZz4+ICZwYXJhbXMpIHsKKyAgICByZXR1cm4gX2NyZWF0ZVBhcmFtc0Jsb2IoYmxvYiwgcGFyYW1zKTsKK30KKworLy8gc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4+IC0+IFBhcmFtcworU3RhdHVzIGNyZWF0ZVBhcmFtc0Jsb2IoCisgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+ICpibG9iLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPj4gJnBhcmFtcykgeworICAgIHJldHVybiBfY3JlYXRlUGFyYW1zQmxvYihibG9iLCBwYXJhbXMpOworfQorCisvLyBQYXJhbXMgLT4gc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PgorYzJfc3RhdHVzX3QgY29weVBhcmFtc0Zyb21CbG9iKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBwYXJhbXMsCisgICAgICAgIFBhcmFtcyBibG9iKSB7CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtUG9pbnRlcnM7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gcGFyc2VQYXJhbXNCbG9iKCZwYXJhbVBvaW50ZXJzLCBibG9iKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJjb3B5UGFyYW1zRnJvbUJsb2IgLS0gYmxvYiBwYXJzaW5nIGZhaWxlZC4iKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcGFyYW1zLT5yZXNpemUocGFyYW1Qb2ludGVycy5zaXplKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKEMyUGFyYW0qIGNvbnN0JiBwYXJhbVBvaW50ZXIgOiBwYXJhbVBvaW50ZXJzKSB7CisgICAgICAgIGlmICghcGFyYW1Qb2ludGVyKSB7CisgICAgICAgICAgICBBTE9HRSgiY29weVBhcmFtc0Zyb21CbG9iIC0tIGNvcnJ1cHRlZCBwYXJhbXMgYmxvYi4iKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgKCpwYXJhbXMpW2krK10gPSBDMlBhcmFtOjpDb3B5KCpwYXJhbVBvaW50ZXIpOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKy8vIFBhcmFtcyAtPiB1cGRhdGUgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PgorYzJfc3RhdHVzX3QgdXBkYXRlUGFyYW1zRnJvbUJsb2IoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiYgcGFyYW1zLAorICAgICAgICBjb25zdCBQYXJhbXMmIGJsb2IpIHsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDMyX3QsIEMyUGFyYW0qPiBpbmRleDJwYXJhbTsKKyAgICBmb3IgKEMyUGFyYW0qIGNvbnN0JiBwYXJhbSA6IHBhcmFtcykgeworICAgICAgICBpZiAoIXBhcmFtKSB7CisgICAgICAgICAgICBBTE9HRSgidXBkYXRlUGFyYW1zRnJvbUJsb2IgLS0gY29ycnVwdGVkIGlucHV0IHBhcmFtcy4iKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGluZGV4MnBhcmFtLmZpbmQocGFyYW0tPmluZGV4KCkpID09IGluZGV4MnBhcmFtLmVuZCgpKSB7CisgICAgICAgICAgICBpbmRleDJwYXJhbS5lbXBsYWNlKHBhcmFtLT5pbmRleCgpLCBwYXJhbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gcGFyYW1Qb2ludGVyczsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBwYXJzZVBhcmFtc0Jsb2IoJnBhcmFtUG9pbnRlcnMsIGJsb2IpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoInVwZGF0ZVBhcmFtc0Zyb21CbG9iIC0tIGJsb2IgcGFyc2luZyBmYWlsZWQuIik7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgZm9yIChDMlBhcmFtKiBjb25zdCYgcGFyYW1Qb2ludGVyIDogcGFyYW1Qb2ludGVycykgeworICAgICAgICBpZiAoIXBhcmFtUG9pbnRlcikgeworICAgICAgICAgICAgQUxPR0UoInVwZGF0ZVBhcmFtc0Zyb21CbG9iIC0tIGNvcnJ1cHRlZCBwYXJhbSBpbiBibG9iLiIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBkZWNsdHlwZShpbmRleDJwYXJhbSk6Oml0ZXJhdG9yIGkgPSBpbmRleDJwYXJhbS5maW5kKAorICAgICAgICAgICAgICAgIHBhcmFtUG9pbnRlci0+aW5kZXgoKSk7CisgICAgICAgIGlmIChpID09IGluZGV4MnBhcmFtLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HVygidXBkYXRlUGFyYW1zRnJvbUJsb2IgLS0gdW5zZWVuIHBhcmFtIGluZGV4LiIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpLT5zZWNvbmQtPnVwZGF0ZUZyb20oKnBhcmFtUG9pbnRlcikpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ1cGRhdGVQYXJhbXNGcm9tQmxvYiAtLSBtaXNtYXRjaGluZyBzaXplczogIgorICAgICAgICAgICAgICAgICAgICAiJXUgdnMgJXUgKGluZGV4ID0gJXUpLiIsCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkPihwYXJhbXMuc2l6ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHBhcmFtUG9pbnRlci0+c2l6ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGktPmZpcnN0KSk7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworLy8gQ29udmVydCBCdWZmZXJQb29sIFJlc3VsdFN0YXR1cyB0byBjMl9zdGF0dXNfdC4KK2MyX3N0YXR1c190IHRvQzJTdGF0dXMoUmVzdWx0U3RhdHVzIHJzKSB7CisgICAgc3dpdGNoIChycykgeworICAgIGNhc2UgUmVzdWx0U3RhdHVzOjpPSzoKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIGNhc2UgUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk6CisgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgY2FzZSBSZXN1bHRTdGF0dXM6OkFMUkVBRFlfRVhJU1RTOgorICAgICAgICByZXR1cm4gQzJfRFVQTElDQVRFOworICAgIGNhc2UgUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ6CisgICAgICAgIHJldHVybiBDMl9OT1RfRk9VTkQ7CisgICAgY2FzZSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOgorICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dXKCJVbnJlY29nbml6ZWQgQnVmZmVyUG9vbCBSZXN1bHRTdGF0dXM6ICVkIiwgc3RhdGljX2Nhc3Q8aW50PihycykpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KK30KKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCisvLyBDcmVhdGUgYSBHcmFwaGljQnVmZmVyIG9iamVjdCBmcm9tIGEgZ3JhcGhpYyBibG9jay4KK3NwPEdyYXBoaWNCdWZmZXI+IGNyZWF0ZUdyYXBoaWNCdWZmZXIoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2spIHsKKyAgICB1aW50MzJfdCB3aWR0aDsKKyAgICB1aW50MzJfdCBoZWlnaHQ7CisgICAgdWludDMyX3QgZm9ybWF0OworICAgIHVpbnQ2NF90IHVzYWdlOworICAgIHVpbnQzMl90IHN0cmlkZTsKKyAgICB1aW50MzJfdCBnZW5lcmF0aW9uOworICAgIHVpbnQ2NF90IGJxSWQ7CisgICAgaW50MzJfdCBicVNsb3Q7CisgICAgX1Vud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NNZXRhZGF0YSgKKyAgICAgICAgICAgIGJsb2NrLmhhbmRsZSgpLCAmd2lkdGgsICZoZWlnaHQsICZmb3JtYXQsICZ1c2FnZSwKKyAgICAgICAgICAgICZzdHJpZGUsICZnZW5lcmF0aW9uLCAmYnFJZCwgcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KCZicVNsb3QpKTsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKmdyYWxsb2NIYW5kbGUgPQorICAgICAgICAgICAgVW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZShibG9jay5oYW5kbGUoKSk7CisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ3JhcGhpY0J1ZmZlciA9CisgICAgICAgICAgICBuZXcgR3JhcGhpY0J1ZmZlcihncmFsbG9jSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY0J1ZmZlcjo6Q0xPTkVfSEFORExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgdXNhZ2UsIHN0cmlkZSk7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoZ3JhbGxvY0hhbmRsZSk7CisgICAgcmV0dXJuIGdyYXBoaWNCdWZmZXI7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBCbG9ja1Byb2Nlc3Nvcj4KK3ZvaWQgZm9yRWFjaEJsb2NrKEMyRnJhbWVEYXRhJiBmcmFtZURhdGEsCisgICAgICAgICAgICAgICAgICBCbG9ja1Byb2Nlc3NvciBwcm9jZXNzKSB7CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+JiBidWZmZXIgOiBmcmFtZURhdGEuYnVmZmVycykgeworICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrIDoKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpKSB7CisgICAgICAgICAgICAgICAgcHJvY2VzcyhibG9jayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBCbG9ja1Byb2Nlc3Nvcj4KK3ZvaWQgZm9yRWFjaEJsb2NrKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtMaXN0LAorICAgICAgICAgICAgICAgICAgQmxvY2tQcm9jZXNzb3IgcHJvY2VzcywKKyAgICAgICAgICAgICAgICAgIGJvb2wgcHJvY2Vzc0lucHV0LCBib29sIHByb2Nlc3NPdXRwdXQpIHsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogd29ya0xpc3QpIHsKKyAgICAgICAgaWYgKCF3b3JrKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJvY2Vzc0lucHV0KSB7CisgICAgICAgICAgICBmb3JFYWNoQmxvY2sod29yay0+aW5wdXQsIHByb2Nlc3MpOworICAgICAgICB9CisgICAgICAgIGlmIChwcm9jZXNzT3V0cHV0KSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcmtsZXQ+JiB3b3JrbGV0IDogd29yay0+d29ya2xldHMpIHsKKyAgICAgICAgICAgICAgICBpZiAod29ya2xldCkgeworICAgICAgICAgICAgICAgICAgICBmb3JFYWNoQmxvY2sod29ya2xldC0+b3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnZXRIZ2JwKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwKSB7CisgICAgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gaGdicCA9IGlnYnAtPmdldEhhbEludGVyZmFjZSgpOworICAgIHJldHVybiBoZ2JwID8gaGdicCA6CisgICAgICAgICAgICBuZXcgVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4oaWdicCk7Cit9CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworc3RhdHVzX3QgYXR0YWNoVG9CdWZmZXJRdWV1ZShjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGJxU2xvdCkgeworICAgIGlmICghaWdicCkgeworICAgICAgICBBTE9HVygiYXR0YWNoVG9CdWZmZXJRdWV1ZSAtLSBudWxsIHByb2R1Y2VyLiIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBncmFwaGljQnVmZmVyID0gY3JlYXRlR3JhcGhpY0J1ZmZlcihibG9jayk7CisgICAgZ3JhcGhpY0J1ZmZlci0+c2V0R2VuZXJhdGlvbk51bWJlcihnZW5lcmF0aW9uKTsKKworICAgIEFMT0dWKCJhdHRhY2hUb0J1ZmZlclF1ZXVlIC0tIGF0dGFjaGluZyBidWZmZXI6ICIKKyAgICAgICAgICAgICJibG9jayBkaW1lbnNpb24gJXV4JXUsICIKKyAgICAgICAgICAgICJncmFwaGljQnVmZmVyIGRpbWVuc2lvbiAldXgldSwgIgorICAgICAgICAgICAgImZvcm1hdCAlI3gsIHVzYWdlICUjbGx4LCBzdHJpZGUgJXUsIGdlbmVyYXRpb24gJXUuIiwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkPihibG9jay53aWR0aCgpKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkPihibG9jay5oZWlnaHQoKSksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oZ3JhcGhpY0J1ZmZlci0+Z2V0V2lkdGgoKSksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oZ3JhcGhpY0J1ZmZlci0+Z2V0SGVpZ2h0KCkpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGdyYXBoaWNCdWZmZXItPmdldFBpeGVsRm9ybWF0KCkpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPihncmFwaGljQnVmZmVyLT5nZXRVc2FnZSgpKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkPihncmFwaGljQnVmZmVyLT5nZXRTdHJpZGUoKSksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oZ3JhcGhpY0J1ZmZlci0+Z2V0R2VuZXJhdGlvbk51bWJlcigpKSk7CisKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBpZ2JwLT5hdHRhY2hCdWZmZXIoYnFTbG90LCBncmFwaGljQnVmZmVyKTsKKyAgICBpZiAocmVzdWx0ICE9IE9LKSB7CisgICAgICAgIEFMT0dXKCJhdHRhY2hUb0J1ZmZlclF1ZXVlIC0tIGF0dGFjaEJ1ZmZlciBmYWlsZWQuIEVycm9yIGNvZGUgPSAlZCIsCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihyZXN1bHQpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBBTE9HVigiYXR0YWNoVG9CdWZmZXJRdWV1ZSAtLSBhdHRhY2hCdWZmZXIgcmV0dXJuZWQgc2xvdCAlZCIsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KCpicVNsb3QpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBnZXRCdWZmZXJRdWV1ZUFzc2lnbm1lbnQoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZ2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiBicUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogYnFTbG90KSB7CisgICAgcmV0dXJuIF9DMkJsb2NrRmFjdG9yeTo6R2V0QnVmZmVyUXVldWVEYXRhKAorICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpHZXRHcmFwaGljQmxvY2tQb29sRGF0YShibG9jayksCisgICAgICAgICAgICBnZW5lcmF0aW9uLCBicUlkLCBicVNsb3QpOworfQorCitib29sIHlpZWxkQnVmZmVyUXVldWVCbG9jayhjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBkYXRhID0KKyAgICAgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6R2V0R3JhcGhpY0Jsb2NrUG9vbERhdGEoYmxvY2spOworICAgIGlmIChkYXRhICYmIF9DMkJsb2NrRmFjdG9yeTo6R2V0QnVmZmVyUXVldWVEYXRhKGRhdGEpKSB7CisgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6WWllbGRCbG9ja1RvQnVmZmVyUXVldWUoZGF0YSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgeWllbGRCdWZmZXJRdWV1ZUJsb2NrcygKKyAgICAgICAgY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0xpc3QsCisgICAgICAgIGJvb2wgcHJvY2Vzc0lucHV0LCBib29sIHByb2Nlc3NPdXRwdXQpIHsKKyAgICBmb3JFYWNoQmxvY2sod29ya0xpc3QsIHlpZWxkQnVmZmVyUXVldWVCbG9jaywgcHJvY2Vzc0lucHV0LCBwcm9jZXNzT3V0cHV0KTsKK30KKworYm9vbCBob2xkQnVmZmVyUXVldWVCbG9jayhjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBicUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24pIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gZGF0YSA9CisgICAgICAgICAgICBfQzJCbG9ja0ZhY3Rvcnk6OkdldEdyYXBoaWNCbG9ja1Bvb2xEYXRhKGJsb2NrKTsKKyAgICBpZiAoIWRhdGEpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVpbnQzMl90IG9sZEdlbmVyYXRpb247CisgICAgdWludDY0X3Qgb2xkSWQ7CisgICAgaW50MzJfdCBvbGRTbG90OworICAgIC8vIElmIHRoZSBibG9jayBpcyBub3QgYnVmZmVycXVldWUtYmFzZWQsIGRvIG5vdGhpbmcuCisgICAgaWYgKCFfQzJCbG9ja0ZhY3Rvcnk6OkdldEJ1ZmZlclF1ZXVlRGF0YSgKKyAgICAgICAgICAgIGRhdGEsICZvbGRHZW5lcmF0aW9uLCAmb2xkSWQsICZvbGRTbG90KSB8fAorICAgICAgICAgICAgKG9sZElkID09IDApKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGUgYmxvY2sncyBicUlkIGlzIHRoZSBzYW1lIGFzIHRoZSBkZXNpcmVkIGJxSWQsIGp1c3QgaG9sZC4KKyAgICBpZiAoKG9sZElkID09IGJxSWQpICYmIChvbGRHZW5lcmF0aW9uID09IGdlbmVyYXRpb24pKSB7CisgICAgICAgIEFMT0dWKCJob2xkQnVmZmVyUXVldWVCbG9jayAtLSBpbXBvcnQgd2l0aG91dCBhdHRhY2hpbmc6ICIKKyAgICAgICAgICAgICAgICAiYnFJZCAlbGx1LCBicVNsb3QgJWQsIGdlbmVyYXRpb24gJXUuIiwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmcgdW5zaWduZWQ+KG9sZElkKSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KG9sZFNsb3QpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkPihnZW5lcmF0aW9uKSk7CisgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6SG9sZEJsb2NrRnJvbUJ1ZmZlclF1ZXVlKGRhdGEsIGdldEhnYnAoaWdicCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2UsIGF0dGFjaCB0byB0aGUgZ2l2ZW4gaWdicCwgd2hpY2ggbXVzdCBub3QgYmUgbnVsbC4KKyAgICBpZiAoIWlnYnApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludDMyX3QgYnFTbG90OworICAgIHN0YXR1c190IHJlc3VsdCA9IGF0dGFjaFRvQnVmZmVyUXVldWUoYmxvY2ssIGlnYnAsIGdlbmVyYXRpb24sICZicVNsb3QpOworCisgICAgaWYgKHJlc3VsdCAhPSBPSykgeworICAgICAgICBBTE9HRSgiaG9sZEJ1ZmZlclF1ZXVlQmxvY2sgLS0gZmFpbCB0byBhdHRhY2g6ICIKKyAgICAgICAgICAgICAgICAidGFyZ2V0IGJxSWQgJWxsdSwgZ2VuZXJhdGlvbiAldS4iLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZyB1bnNpZ25lZD4oYnFJZCksCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGdlbmVyYXRpb24pKTsKKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQUxPR1YoImhvbGRCdWZmZXJRdWV1ZUJsb2NrIC0tIGF0dGFjaGVkOiAiCisgICAgICAgICAgICAiYnFJZCAlbGx1LCBicVNsb3QgJWQsIGdlbmVyYXRpb24gJXUuIiwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZyB1bnNpZ25lZD4oYnFJZCksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGJxU2xvdCksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oZ2VuZXJhdGlvbikpOworICAgIF9DMkJsb2NrRmFjdG9yeTo6QXNzaWduQmxvY2tUb0J1ZmZlclF1ZXVlKAorICAgICAgICAgICAgZGF0YSwgZ2V0SGdicChpZ2JwKSwgYnFJZCwgYnFTbG90LCB0cnVlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBob2xkQnVmZmVyUXVldWVCbG9ja3MoY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJxSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JJbnB1dCkgeworICAgIGZvckVhY2hCbG9jayh3b3JrTGlzdCwKKyAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKGhvbGRCdWZmZXJRdWV1ZUJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xLCBpZ2JwLCBicUlkLCBnZW5lcmF0aW9uKSwKKyAgICAgICAgICAgICAgICAgZm9ySW5wdXQsICFmb3JJbnB1dCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvYXVkaW8vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvYXVkaW8vQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODc3NTRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9hdWRpby9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiVnRzSGlkbEMyVjFfMFRhcmdldEF1ZGlvRGVjVGVzdCIsCisgICAgZGVmYXVsdHM6IFsiVnRzTWVkaWFDMlYxXzBEZWZhdWx0cyJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgIlZ0c0hpZGxDMlYxXzBUYXJnZXRBdWRpb0RlY1Rlc3QuY3BwIiwKKyAgICAgICAgLy8ibWVkaWFfYXVkaW9faGlkbF90ZXN0X2NvbW1vbi5jcHAiCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlZ0c0hpZGxDMlYxXzBUYXJnZXRBdWRpb0VuY1Rlc3QiLAorICAgIGRlZmF1bHRzOiBbIlZ0c01lZGlhQzJWMV8wRGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJWdHNIaWRsQzJWMV8wVGFyZ2V0QXVkaW9FbmNUZXN0LmNwcCIsCisgICAgICAgIC8vIm1lZGlhX2F1ZGlvX2hpZGxfdGVzdF9jb21tb24uY3BwIgorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2F1ZGlvL1Z0c0hpZGxDMlYxXzBUYXJnZXRBdWRpb0RlY1Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9hdWRpby9WdHNIaWRsQzJWMV8wVGFyZ2V0QXVkaW9EZWNUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGI5NzNmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9hdWRpby9WdHNIaWRsQzJWMV8wVGFyZ2V0QXVkaW9EZWNUZXN0LmNwcApAQCAtMCwwICsxLDkxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImNvZGVjMl9oaWRsX2hhbF9hdWRpb19kZWNfdGVzdCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQnVmZmVyUHJpdi5oPgorCit1c2luZyBhbmRyb2lkOjpDMkFsbG9jYXRvcklvbjsKKworI2luY2x1ZGUgPFZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZS5oPgorI2luY2x1ZGUgIm1lZGlhX2MyX2F1ZGlvX2hpZGxfdGVzdF9jb21tb24uaCIKKyNpbmNsdWRlICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgiCisKK3N0cnVjdCBGcmFtZUluZm8geworICAgIGludCBieXRlc0NvdW50OworICAgIHVpbnQzMl90IGZsYWdzOworICAgIGludDY0X3QgdGltZXN0YW1wOworfTsKKworY2xhc3MgTGluZWFyQnVmZmVyIDogcHVibGljIEMyQnVmZmVyIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBMaW5lYXJCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+JiBibG9jaykKKyAgICAgICAgOiBDMkJ1ZmZlcigKKyAgICAgICAgICAgICAge2Jsb2NrLT5zaGFyZShibG9jay0+b2Zmc2V0KCksIGJsb2NrLT5zaXplKCksIDo6QzJGZW5jZSgpKX0pIHt9Cit9OworCitzdGF0aWMgQ29tcG9uZW50VGVzdEVudmlyb25tZW50KiBnRW52ID0gbnVsbHB0cjsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZSB7CisgICBwcml2YXRlOgorICAgIHR5cGVkZWYgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgU3VwZXI7CisKKyAgIHB1YmxpYzoKKyAgICA6OnN0ZDo6c3RyaW5nIGdldFRlc3RDYXNlSW5mbygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIDo6c3RkOjpzdHJpbmcoKSArCisgICAgICAgICAgICAgICAgIkNvbXBvbmVudDogIiArIGdFbnYtPmdldENvbXBvbmVudCgpLmNfc3RyKCkgKyAiIHwgIiArCisgICAgICAgICAgICAgICAgIkluc3RhbmNlOiAiICsgZ0Vudi0+Z2V0SW5zdGFuY2UoKS5jX3N0cigpICsgIiB8ICIgKworICAgICAgICAgICAgICAgICJSZXM6ICIgKyBnRW52LT5nZXRSZXMoKS5jX3N0cigpOworICAgIH0KKworICAgIC8vIGdvb2dsZS5jb2RlYzIgQXVkaW8gdGVzdCBzZXR1cAorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgU3VwZXI6OlNldFVwKCk7CisgICAgICAgIG1EaXNhYmxlVGVzdCA9IGZhbHNlOworICAgICAgICBBTE9HVigiQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCBTZXRVcCIpOworICAgICAgICBtQ2xpZW50ID0gYW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDcmVhdGVGcm9tU2VydmljZSgKKyAgICAgICAgICAgIGdFbnYtPmdldEluc3RhbmNlKCkuY19zdHIoKSk7CisgICAgICAgIEFTU0VSVF9ORShtQ2xpZW50LCBudWxscHRyKTsKKyAgICAgICAgbUxpc3RlbmVyLnJlc2V0KG5ldyBDb2RlY0xpc3RlbmVyKAorICAgICAgICAgICAgW3RoaXNdKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgeworICAgICAgICAgICAgICAgIGhhbmRsZVdvcmtEb25lKHdvcmtJdGVtcyk7CisgICAgICAgICAgICB9KSk7CisgICAgICAgIEFTU0VSVF9ORShtTGlzdGVuZXIsIG51bGxwdHIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9JTlBVVF9CVUZGRVJTOyArK2kpIHsKKyAgICAgICAgICAgIG1Xb3JrUXVldWUuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmspOworICAgICAgICB9CisgICAgICAgIG1DbGllbnQtPmNyZWF0ZUNvbXBvbmVudChnRW52LT5nZXRDb21wb25lbnQoKS5jX3N0cigpLCBtTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUNvbXBvbmVudCk7CisgICAgICAgIEFTU0VSVF9ORShtQ29tcG9uZW50LCBudWxscHRyKTsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gc3RvcmUgPQorICAgICAgICAgICAgYW5kcm9pZDo6R2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpOworICAgICAgICBDSEVDS19FUShzdG9yZS0+ZmV0Y2hBbGxvY2F0b3IoQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUxpbmVhckFsbG9jYXRvciksCisgICAgICAgICAgICAgICAgIEMyX09LKTsKKyAgICAgICAgbUxpbmVhclBvb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sPihtTGluZWFyQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CbG9ja1Bvb2xJZCsrKTsKKyAgICAgICAgQVNTRVJUX05FKG1MaW5lYXJQb29sLCBudWxscHRyKTsKKworICAgICAgICBtQ29tcE5hbWUgPSB1bmtub3duX2NvbXA7CisgICAgICAgIHN0cnVjdCBTdHJpbmdUb05hbWUgeworICAgICAgICAgICAgY29uc3QgY2hhciogTmFtZTsKKyAgICAgICAgICAgIHN0YW5kYXJkQ29tcCBDb21wTmFtZTsKKyAgICAgICAgfTsKKyAgICAgICAgY29uc3QgU3RyaW5nVG9OYW1lIGtTdHJpbmdUb05hbWVbXSA9IHsKKyAgICAgICAgICAgIHsieGFhYyIsIHhhYWN9LAorICAgICAgICAgICAgeyJtcDMiLCBtcDN9LAorICAgICAgICAgICAgeyJhbXJuYiIsIGFtcm5ifSwKKyAgICAgICAgICAgIHsiYW1yd2IiLCBhbXJ3Yn0sCisgICAgICAgICAgICB7ImFhYyIsIGFhY30sCisgICAgICAgICAgICB7InZvcmJpcyIsIHZvcmJpc30sCisgICAgICAgICAgICB7Im9wdXMiLCBvcHVzfSwKKyAgICAgICAgICAgIHsicGNtIiwgcGNtfSwKKyAgICAgICAgICAgIHsiZzcxMS5hbGF3IiwgZzcxMWFsYXd9LAorICAgICAgICAgICAgeyJnNzExLm1sYXciLCBnNzExbWxhd30sCisgICAgICAgICAgICB7ImdzbSIsIGdzbX0sCisgICAgICAgICAgICB7InJhdyIsIHJhd30sCisgICAgICAgICAgICB7ImZsYWMiLCBmbGFjfSwKKyAgICAgICAgfTsKKyAgICAgICAgY29uc3Qgc2l6ZV90IGtOdW1TdHJpbmdUb05hbWUgPQorICAgICAgICAgICAgc2l6ZW9mKGtTdHJpbmdUb05hbWUpIC8gc2l6ZW9mKGtTdHJpbmdUb05hbWVbMF0pOworCisgICAgICAgIHN0ZDo6c3RyaW5nIHN1YnN0cmluZzsKKyAgICAgICAgc3RkOjpzdHJpbmcgY29tcDsKKyAgICAgICAgc3Vic3RyaW5nID0gc3RkOjpzdHJpbmcoZ0Vudi0+Z2V0Q29tcG9uZW50KCkpOworICAgICAgICAvKiBUT0RPOiBiZXR0ZXIgYXBwcm9hY2ggdG8gZmluZCB0aGUgY29tcG9uZW50ICovCisgICAgICAgIC8qICJjMi5hbmRyb2lkLiIgPT4gMTF0aCBwb3NpdGlvbiAqLworICAgICAgICBzaXplX3QgcG9zID0gMTE7CisgICAgICAgIHNpemVfdCBsZW4gPSBzdWJzdHJpbmcuZmluZCgiLmRlY29kZXIiLCBwb3MpOworICAgICAgICBjb21wID0gc3Vic3RyaW5nLnN1YnN0cihwb3MsIGxlbiAtIHBvcyk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtU3RyaW5nVG9OYW1lOyArK2kpIHsKKyAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChjb21wLmNfc3RyKCksIGtTdHJpbmdUb05hbWVbaV0uTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBtQ29tcE5hbWUgPSBrU3RyaW5nVG9OYW1lW2ldLkNvbXBOYW1lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Fb3MgPSBmYWxzZTsKKyAgICAgICAgbUZyYW1lc1JlY2VpdmVkID0gMDsKKyAgICAgICAgbVRpbWVzdGFtcFVzID0gMHU7CisgICAgICAgIG1UaW1lc3RhbXBEZXZUZXN0ID0gZmFsc2U7CisgICAgICAgIGlmIChtQ29tcE5hbWUgPT0gdW5rbm93bl9jb21wKSBtRGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICBpZiAobURpc2FibGVUZXN0KSBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IERpc2FibGVkIFxuIjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtQ29tcG9uZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGlmICg6OnRlc3Rpbmc6OlRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSByZXR1cm47CisgICAgICAgICAgICBtQ29tcG9uZW50LT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQ29tcG9uZW50ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBTdXBlcjo6VGVhckRvd24oKTsKKyAgICB9CisKKyAgICBzdHJ1Y3Qgb3V0cHV0TWV0YURhdGEgeworICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXBVczsKKyAgICAgICAgdWludDMyX3QgcmFuZ2VMZW5ndGg7CisgICAgfTsKKyAgICAvLyBjYWxsYmFjayBmdW5jdGlvbiB0byBwcm9jZXNzIG9uV29ya0RvbmUgcmVjZWl2ZWQgYnkgTGlzdGVuZXIKKyAgICB2b2lkIGhhbmRsZVdvcmtEb25lKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgeworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogd29ya0l0ZW1zKSB7CisgICAgICAgICAgICBpZiAoIXdvcmstPndvcmtsZXRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBGb3IgZGVjb2RlciBjb21wb25lbnRzIGN1cnJlbnQgdGltZXN0YW1wIGFsd2F5cyBleGNlZWRzCisgICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgdGltZXN0YW1wCisgICAgICAgICAgICAgICAgYm9vbCBjb2RlY0NvbmZpZyA9ICgod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9IDApOworICAgICAgICAgICAgICAgIGlmICghY29kZWNDb25maWcgJiYKKyAgICAgICAgICAgICAgICAgICAgIXdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgRVhQRUNUX0dFKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFVzKTsKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByYW5nZUxlbmd0aCA9CisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVyc1swXS0+ZGF0YSgpCisgICAgICAgICAgICAgICAgICAgICAgICAubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKS5jYXBhY2l0eSgpOworICAgICAgICAgICAgICAgICAgICAvL0xpc3Qgb2YgdGltZXN0YW1wIHZhbHVlcyBhbmQgb3V0cHV0IHNpemUgdG8gY2FsY3VsYXRlIHRpbWVzdGFtcAorICAgICAgICAgICAgICAgICAgICBpZiAobVRpbWVzdGFtcERldlRlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dE1ldGFEYXRhIG1ldGEgPSB7bVRpbWVzdGFtcFVzLCByYW5nZUxlbmd0aH07CisgICAgICAgICAgICAgICAgICAgICAgICBvQnVmZmVyTWV0YURhdGEucHVzaF9iYWNrKG1ldGEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJvb2wgbUNzZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHdvcmtEb25lKG1Db21wb25lbnQsIHdvcmssIG1GbHVzaGVkSW5kaWNlcywgbVF1ZXVlTG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIG1Fb3MsIG1Dc2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1JlY2VpdmVkKTsKKyAgICAgICAgICAgICAgICAodm9pZCltQ3NkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZW51bSBzdGFuZGFyZENvbXAgeworICAgICAgICB4YWFjLAorICAgICAgICBtcDMsCisgICAgICAgIGFtcm5iLAorICAgICAgICBhbXJ3YiwKKyAgICAgICAgYWFjLAorICAgICAgICB2b3JiaXMsCisgICAgICAgIG9wdXMsCisgICAgICAgIHBjbSwKKyAgICAgICAgZzcxMWFsYXcsCisgICAgICAgIGc3MTFtbGF3LAorICAgICAgICBnc20sCisgICAgICAgIHJhdywKKyAgICAgICAgZmxhYywKKyAgICAgICAgdW5rbm93bl9jb21wLAorICAgIH07CisKKyAgICBib29sIG1Fb3M7CisgICAgYm9vbCBtRGlzYWJsZVRlc3Q7CisgICAgYm9vbCBtVGltZXN0YW1wRGV2VGVzdDsKKyAgICBzdGFuZGFyZENvbXAgbUNvbXBOYW1lOworICAgIHVpbnQ2NF90IG1UaW1lc3RhbXBVczsKKyAgICB1aW50MzJfdCBtRnJhbWVzUmVjZWl2ZWQ7CisgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiBtRmx1c2hlZEluZGljZXM7CisgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiBtVGltZXN0YW1wVXNsaXN0OworICAgIDo6YW5kcm9pZDo6TGlzdDxvdXRwdXRNZXRhRGF0YT4gb0J1ZmZlck1ldGFEYXRhOworCisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbUJsb2NrUG9vbElkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gbUxpbmVhclBvb2w7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtTGluZWFyQWxsb2NhdG9yOworCisgICAgc3RkOjptdXRleCBtUXVldWVMb2NrOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1RdWV1ZUNvbmRpdGlvbjsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IG1Xb3JrUXVldWU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBtQ29tcG9uZW50OworCisgICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgICB9Cit9OworCit2b2lkIHZhbGlkYXRlQ29tcG9uZW50KAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICBDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcE5hbWUsIGJvb2wmIGRpc2FibGVUZXN0KSB7CisgICAgLy8gVmFsaWRhdGUgaXRzIGEgQzIgQ29tcG9uZW50CisgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImMyIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0UoIk5vdCBhIGMyIGNvbXBvbmVudCIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZSBpdHMgbm90IGFuIGVuY29kZXIgYW5kIHRoZSBjb21wb25lbnQgdG8gYmUgdGVzdGVkIGlzIGF1ZGlvCisgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImVuY29kZXIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgRGVjb2RlciwgZ2l2ZW4gRW5jb2RlciIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBxdWVyaWVkOworICAgIGMyX3N0YXR1c190IGMyZXJyID0KKyAgICAgICAgY29tcG9uZW50LT5xdWVyeSh7fSwge0MyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0OjpQQVJBTV9UWVBFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgaWYgKGMyZXJyICE9IEMyX09LICYmIHF1ZXJpZWQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgQUxPR0UoIlF1ZXJ5IG1lZGlhIHR5cGUgZmFpbGVkID0+ICVkIiwgYzJlcnIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGlucHV0RG9tYWluID0KKyAgICAgICAgICAgICgoQzJTdHJlYW1NZWRpYVR5cGVTZXR0aW5nOjppbnB1dCopcXVlcmllZFswXS5nZXQoKSktPm0udmFsdWU7CisgICAgICAgIGlmIChpbnB1dERvbWFpbi5maW5kKCJhdWRpby8iKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgQUxPR0UoIkV4cGVjdGVkIEF1ZGlvIENvbXBvbmVudCIpOworICAgICAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVmFsaWRhdGVzIGNvbXBvbmVudCBuYW1lCisgICAgaWYgKGNvbXBOYW1lID09IENvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnVua25vd25fY29tcCkgeworICAgICAgICBBTE9HRSgiQ29tcG9uZW50IEluVmFsaWQiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJDb21wb25lbnQgVmFsaWQiKTsKK30KKworLy8gU2V0IERlZmF1bHQgY29uZmlnIHBhcmFtLgordm9pZCBzZXR1cENvbmZpZ1BhcmFtKAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICBpbnQzMl90KiBiaXRTdHJlYW1JbmZvKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgIEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCBzYW1wbGVSYXRlSW5mbygwdSwgYml0U3RyZWFtSW5mb1swXSk7CisgICAgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQgY2hhbm5lbENvdW50SW5mbygwdSwgYml0U3RyZWFtSW5mb1sxXSk7CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gY29uZmlnUGFyYW17JnNhbXBsZVJhdGVJbmZvLCAmY2hhbm5lbENvdW50SW5mb307CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgY29tcG9uZW50LT5jb25maWcoY29uZmlnUGFyYW0sIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgQVNTRVJUX0VRKGZhaWx1cmVzLnNpemUoKSwgMHUpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIEMyX09LKTsKK30KKworLy8gSW4gZGVjb2RlciBjb21wb25lbnRzLCBvZnRlbiB0aGUgaW5wdXQgcGFyYW1ldGVycyBnZXQgdXBkYXRlZCB1cG9uCisvLyBwYXJzaW5nIHRoZSBoZWFkZXIgb2YgZWxlbWVudGFyeSBzdHJlYW0uIENsaWVudCBuZWVkcyB0byBjb2xsZWN0IHRoaXMKKy8vIGluZm9ybWF0aW9uIGFuZCByZWNvbmZpZ3VyZQordm9pZCBnZXRJbnB1dENoYW5uZWxJbmZvKAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICBDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcE5hbWUsIGludDMyX3QqIGJpdFN0cmVhbUluZm8pIHsKKyAgICAvLyBxdWVyeSBuU2FtcGxlUmF0ZSBhbmQgbkNoYW5uZWxzCisgICAgc3RkOjppbml0aWFsaXplcl9saXN0PEMyUGFyYW06OkluZGV4PiBpbmRpY2VzeworICAgICAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgIH07CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBpblBhcmFtczsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICBjb21wb25lbnQtPnF1ZXJ5KHt9LCBpbmRpY2VzLCBDMl9ET05UX0JMT0NLLCAmaW5QYXJhbXMpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0sgJiYgaW5QYXJhbXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgQUxPR0UoIlF1ZXJ5IG1lZGlhIHR5cGUgZmFpbGVkID0+ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNpemVfdCBvZmZzZXQgPSBzaXplb2YoQzJQYXJhbSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5QYXJhbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIEMyUGFyYW0qIHBhcmFtID0gaW5QYXJhbXNbaV0uZ2V0KCk7CisgICAgICAgICAgICBiaXRTdHJlYW1JbmZvW2ldID0gKihpbnQzMl90KikoKHVpbnQ4X3QqKXBhcmFtICsgb2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGNvbXBOYW1lKSB7CisgICAgICAgICAgICBjYXNlIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OmFtcm5iOiB7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKGJpdFN0cmVhbUluZm9bMF0sIDgwMDApOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShiaXRTdHJlYW1JbmZvWzFdLCAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6YW1yd2I6IHsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoYml0U3RyZWFtSW5mb1swXSwgMTYwMDApOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShiaXRTdHJlYW1JbmZvWzFdLCAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6Z3NtOiB7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKGJpdFN0cmVhbUluZm9bMF0sIDgwMDApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gbnVtYmVyIG9mIGVsZW1lbnRhcnkgc3RyZWFtcyBwZXIgY29tcG9uZW50CisjZGVmaW5lIFNUUkVBTV9DT1VOVCAyCisKKy8vIExvb2tVcFRhYmxlIG9mIGNsaXBzIGFuZCBtZXRhZGF0YSBmb3IgY29tcG9uZW50IHRlc3RpbmcKK3ZvaWQgR2V0VVJMRm9yQ29tcG9uZW50KENvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wLCBjaGFyKiBtVVJMLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogaW5mbywgc2l6ZV90IHN0cmVhbUluZGV4ID0gMCkgeworICAgIHN0cnVjdCBDb21wVG9VUkwgeworICAgICAgICBDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcDsKKyAgICAgICAgY29uc3QgY2hhciBtVVJMW1NUUkVBTV9DT1VOVF1bNTEyXTsKKyAgICAgICAgY29uc3QgY2hhciBpbmZvW1NUUkVBTV9DT1VOVF1bNTEyXTsKKyAgICB9OworICAgIEFTU0VSVF9UUlVFKHN0cmVhbUluZGV4IDwgU1RSRUFNX0NPVU5UKTsKKworICAgIHN0YXRpYyBjb25zdCBDb21wVG9VUkwga0NvbXBUb1VSTFtdID0geworICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjp4YWFjLAorICAgICAgICAgeyJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouYWFjIiwKKyAgICAgICAgICAiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmFhYyJ9LAorICAgICAgICAgeyJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyIsCisgICAgICAgICAgImJiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoel9tdWx0aV9mcmFtZS5pbmZvIn19LAorICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjptcDMsCisgICAgICAgICB7ImJiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoei5tcDMiLAorICAgICAgICAgICJiYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHoubXAzIn0sCisgICAgICAgICB7ImJiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoei5pbmZvIiwKKyAgICAgICAgICAiYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6X211bHRpX2ZyYW1lLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmFhYywKKyAgICAgICAgIHsiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmFhYyIsCisgICAgICAgICAgImJiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5hYWMifSwKKyAgICAgICAgIHsiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8iLAorICAgICAgICAgICJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHpfbXVsdGlfZnJhbWUuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6YW1ybmIsCisgICAgICAgICB7InNpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouYW1ybmIiLAorICAgICAgICAgICJzaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmFtcm5iIn0sCisgICAgICAgICB7InNpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouaW5mbyIsCisgICAgICAgICAgInNpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHpfbXVsdGlfZnJhbWUuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6YW1yd2IsCisgICAgICAgICB7ImJiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHouYW1yd2IiLAorICAgICAgICAgICJiYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmFtcndiIn0sCisgICAgICAgICB7ImJiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHouaW5mbyIsCisgICAgICAgICAgImJiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHpfbXVsdGlfZnJhbWUuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6dm9yYmlzLAorICAgICAgICAgeyJiYmJfdm9yYmlzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoudm9yYmlzIiwgIiJ9LAorICAgICAgICAgeyJiYmJfdm9yYmlzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyIsICIifX0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6Om9wdXMsCisgICAgICAgICB7ImJiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoub3B1cyIsICIifSwKKyAgICAgICAgIHsiYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIiwgIiJ9fSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6ZzcxMWFsYXcsCisgICAgICAgICB7ImJiYl9nNzExYWxhd18xY2hfOGtoei5yYXciLCAiIn0sCisgICAgICAgICB7ImJiYl9nNzExYWxhd18xY2hfOGtoei5pbmZvIiwgIiJ9fSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6ZzcxMW1sYXcsCisgICAgICAgICB7ImJiYl9nNzExbXVsYXdfMWNoXzhraHoucmF3IiwgIiJ9LAorICAgICAgICAgeyJiYmJfZzcxMW11bGF3XzFjaF84a2h6LmluZm8iLCAiIn19LAorICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpnc20sCisgICAgICAgICB7ImJiYl9nc21fMWNoXzhraHpfMTNrYnBzLnJhdyIsICIifSwKKyAgICAgICAgIHsiYmJiX2dzbV8xY2hfOGtoel8xM2ticHMuaW5mbyIsICIifX0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OnJhdywKKyAgICAgICAgIHsiYmJiX3Jhd18xY2hfOGtoel9zMzJsZS5yYXciLCAiIn0sCisgICAgICAgICB7ImJiYl9yYXdfMWNoXzhraHpfczMybGUuaW5mbyIsICIifX0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmZsYWMsCisgICAgICAgICB7ImJiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouZmxhYyIsICIifSwKKyAgICAgICAgIHsiYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5pbmZvIiwgIiJ9fSwKKyAgICB9OworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2Yoa0NvbXBUb1VSTCkgLyBzaXplb2Yoa0NvbXBUb1VSTFswXSk7ICsraSkgeworICAgICAgICBpZiAoa0NvbXBUb1VSTFtpXS5jb21wID09IGNvbXApIHsKKyAgICAgICAgICAgIHN0cmNhdChtVVJMLCBrQ29tcFRvVVJMW2ldLm1VUkxbc3RyZWFtSW5kZXhdKTsKKyAgICAgICAgICAgIHN0cmNhdChpbmZvLCBrQ29tcFRvVVJMW2ldLmluZm9bc3RyZWFtSW5kZXhdKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBkZWNvZGVORnJhbWVzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Om11dGV4ICZxdWV1ZUxvY2ssIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlJiBxdWV1ZUNvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiYgZmx1c2hlZEluZGljZXMsCisgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgbGluZWFyUG9vbCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omlmc3RyZWFtJiBlbGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4qIEluZm8sCisgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwgaW50IHJhbmdlLCBib29sIHNpZ25hbEVPUyA9IHRydWUpIHsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgaW50IGZyYW1lSUQgPSBvZmZzZXQ7CisgICAgaW50IG1heFJldHJ5ID0gMDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoZnJhbWVJRCA9PSAoaW50KUluZm8tPnNpemUoKSB8fCBmcmFtZUlEID09IChvZmZzZXQgKyByYW5nZSkpIGJyZWFrOworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgIC8vIFByZXBhcmUgQzJXb3JrCisgICAgICAgIHdoaWxlICghd29yayAmJiAobWF4UmV0cnkgPCBNQVhfUkVUUlkpKSB7CisgICAgICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgICAgICBpZiAoIXdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgd29yay5zd2FwKHdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgICAgICB3b3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIFRJTUVfT1VUKTsKKyAgICAgICAgICAgICAgICBtYXhSZXRyeSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghd29yayAmJiAobWF4UmV0cnkgPj0gTUFYX1JFVFJZKSkgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJXYWl0IGZvciBnZW5lcmF0aW5nIEMyV29yayBleGNlZWRlZCB0aW1lb3V0IjsKKyAgICAgICAgfQorICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCA9ICgqSW5mbylbZnJhbWVJRF0udGltZXN0YW1wOworICAgICAgICBpZiAoKCpJbmZvKVtmcmFtZUlEXS5mbGFncykgZmxhZ3MgPSAxdSA8PCAoKCpJbmZvKVtmcmFtZUlEXS5mbGFncyAtIDEpOworICAgICAgICBpZiAoc2lnbmFsRU9TICYmICgoZnJhbWVJRCA9PSAoaW50KUluZm8tPnNpemUoKSAtIDEpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIChmcmFtZUlEID09IChvZmZzZXQgKyByYW5nZSAtIDEpKSkpCisgICAgICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworCisgICAgICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gZnJhbWVJRDsKKyAgICAgICAgeworICAgICAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICAgICAgZmx1c2hlZEluZGljZXMuZW1wbGFjZV9iYWNrKGZyYW1lSUQpOworICAgICAgICB9CisgICAgICAgIGludCBzaXplID0gKCpJbmZvKVtmcmFtZUlEXS5ieXRlc0NvdW50OworICAgICAgICBjaGFyKiBkYXRhID0gKGNoYXIqKW1hbGxvYyhzaXplKTsKKyAgICAgICAgQVNTRVJUX05FKGRhdGEsIG51bGxwdHIpOworCisgICAgICAgIGVsZVN0cmVhbS5yZWFkKGRhdGEsIHNpemUpOworICAgICAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmdjb3VudCgpLCBzaXplKTsKKworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIGlmIChzaXplKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgICAgICAgICBBU1NFUlRfRVEoQzJfT0ssCisgICAgICAgICAgICAgICAgICAgIGxpbmVhclBvb2wtPmZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX0sCisgICAgICAgICAgICAgICAgICAgICAgICAmYmxvY2spKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGJsb2NrKTsKKworICAgICAgICAgICAgLy8gV3JpdGUgVmlldworICAgICAgICAgICAgQzJXcml0ZVZpZXcgdmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkMyTGluZWFyQmxvY2s6Om1hcCgpIGZhaWxlZCA6ICVkIiwgdmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFTU0VSVF9FUSgoc2l6ZV90KXNpemUsIHZpZXcuY2FwYWNpdHkoKSk7CisgICAgICAgICAgICBBU1NFUlRfRVEoMHUsIHZpZXcub2Zmc2V0KCkpOworICAgICAgICAgICAgQVNTRVJUX0VRKChzaXplX3Qpc2l6ZSwgdmlldy5zaXplKCkpOworCisgICAgICAgICAgICBtZW1jcHkodmlldy5iYXNlKCksIGRhdGEsIHNpemUpOworCisgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmVtcGxhY2VfYmFjayhuZXcgTGluZWFyQnVmZmVyKGJsb2NrKSk7CisgICAgICAgICAgICBmcmVlKGRhdGEpOworICAgICAgICB9CisgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgICAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKworICAgICAgICAvLyBETyBUSEUgREVDT0RJTkcKKyAgICAgICAgQVNTRVJUX0VRKGNvbXBvbmVudC0+cXVldWUoJml0ZW1zKSwgQzJfT0spOworICAgICAgICBBTE9HVigiRnJhbWUgIyVkIHNpemUgPSAlZCBxdWV1ZWQiLCBmcmFtZUlELCBzaXplKTsKKyAgICAgICAgZnJhbWVJRCsrOworICAgICAgICBtYXhSZXRyeSA9IDA7CisgICAgfQorfQorCitURVNUX0YoQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCwgdmFsaWRhdGVDb21wTmFtZSkgeworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBBTE9HVigiQ2hlY2tzIGlmIHRoZSBnaXZlbiBjb21wb25lbnQgaXMgYSB2YWxpZCBhdWRpbyBjb21wb25lbnQiKTsKKyAgICB2YWxpZGF0ZUNvbXBvbmVudChtQ29tcG9uZW50LCBtQ29tcE5hbWUsIG1EaXNhYmxlVGVzdCk7CisgICAgQVNTRVJUX0VRKG1EaXNhYmxlVGVzdCwgZmFsc2UpOworfQorCitURVNUX0YoQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCwgY29uZmlnQ29tcCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0cyBjb21wb25lbnQgc3BlY2lmaWMgY29uZmlndXJhdGlvbiIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIGludDMyX3QgYml0U3RyZWFtSW5mb1syXSA9IHswfTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZ2V0SW5wdXRDaGFubmVsSW5mbyhtQ29tcG9uZW50LCBtQ29tcE5hbWUsIGJpdFN0cmVhbUluZm8pKTsKKyAgICBzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIGJpdFN0cmVhbUluZm8pOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworY2xhc3MgQ29kZWMyQXVkaW9EZWNEZWNvZGVUZXN0IDogcHVibGljIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8aW50MzJfdD4geworfTsKKworVEVTVF9QKENvZGVjMkF1ZGlvRGVjRGVjb2RlVGVzdCwgRGVjb2RlVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJEZWNvZGVzIGlucHV0IGZpbGUiKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisKKyAgICB1aW50MzJfdCBzdHJlYW1JbmRleCA9IEdldFBhcmFtKCk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBtVGltZXN0YW1wRGV2VGVzdCA9IHRydWU7CisgICAgY2hhciBtVVJMWzUxMl0sIGluZm9bNTEyXTsKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbSwgZWxlSW5mbzsKKworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBzdHJjcHkoaW5mbywgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbywgc3RyZWFtSW5kZXgpOworICAgIGlmICghc3RyY21wKG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpKSB7CisgICAgICAgIEFMT0dWKCJFTVBUWSBJTlBVVCBnRW52LT5nZXRSZXMoKS5jX3N0cigpICVzIG1VUkwgICVzICIsCisgICAgICAgICAgICAgIGdFbnYtPmdldFJlcygpLmNfc3RyKCksIG1VUkwpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZWxlSW5mby5vcGVuKGluZm8pOworICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4gSW5mbzsKKyAgICBpbnQgYnl0ZXNDb3VudCA9IDA7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IDA7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCEoZWxlSW5mbyA+PiBieXRlc0NvdW50KSkgYnJlYWs7CisgICAgICAgIGVsZUluZm8gPj4gZmxhZ3M7CisgICAgICAgIGVsZUluZm8gPj4gdGltZXN0YW1wOworICAgICAgICBib29sIGNvZGVjQ29uZmlnID0KKyAgICAgICAgICAgICgoMSA8PCAoZmxhZ3MgLSAxKSkgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9IDA7CisgICAgICAgIGlmIChtVGltZXN0YW1wRGV2VGVzdCAmJiAhY29kZWNDb25maWcpCisgICAgICAgICAgICBtVGltZXN0YW1wVXNsaXN0LnB1c2hfYmFjayh0aW1lc3RhbXApOworICAgICAgICBJbmZvLnB1c2hfYmFjayh7Ynl0ZXNDb3VudCwgZmxhZ3MsIHRpbWVzdGFtcH0pOworICAgIH0KKyAgICBlbGVJbmZvLmNsb3NlKCk7CisgICAgLy8gUmVzZXQgdG90YWwgbm8gb2YgZnJhbWVzIHJlY2VpdmVkCisgICAgbUZyYW1lc1JlY2VpdmVkID0gMDsKKyAgICBtVGltZXN0YW1wVXMgPSAwOworICAgIGludDMyX3QgYml0U3RyZWFtSW5mb1syXSA9IHswfTsKKyAgICBpZiAobUNvbXBOYW1lID09IHJhdykgeworICAgICAgICBiaXRTdHJlYW1JbmZvWzBdID0gODAwMDsKKyAgICAgICAgYml0U3RyZWFtSW5mb1sxXSA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICBnZXRJbnB1dENoYW5uZWxJbmZvKG1Db21wb25lbnQsIG1Db21wTmFtZSwgYml0U3RyZWFtSW5mbykpOworICAgIH0KKyAgICBzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIGJpdFN0cmVhbUluZm8pOworICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkZWNvZGVORnJhbWVzKAorICAgICAgICBtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIG1GbHVzaGVkSW5kaWNlcywKKyAgICAgICAgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIDAsIChpbnQpSW5mby5zaXplKCkpKTsKKyAgICAvLyBibG9ja2luZyBjYWxsIHRvIGVuc3VyZXMgYXBwbGljYXRpb24gdG8gV2FpdCB0aWxsIGFsbCB0aGUgaW5wdXRzIGFyZQorICAgIC8vIGNvbnN1bWVkCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgaWYgKG1GcmFtZXNSZWNlaXZlZCAhPSBJbmZvLnNpemUoKSkgeworICAgICAgICBBTE9HRSgiSW5wdXQgYnVmZmVyIGNvdW50IGFuZCBPdXRwdXQgYnVmZmVyIGNvdW50IG1pc21hdGNoIik7CisgICAgICAgIEFMT0dFKCJmcmFtZXNSZWNlaXZlZCA6ICVkIGlucHV0RnJhbWVzIDogJXp1IiwgbUZyYW1lc1JlY2VpdmVkLAorICAgICAgICAgICAgICBJbmZvLnNpemUoKSk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIGlmIChtVGltZXN0YW1wRGV2VGVzdCkgeworICAgICAgICB1aW50NjRfdCBleHBUczsKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlc1JlY2VpdmVkID0gMDsKKyAgICAgICAgLy8gVXBkYXRlIFNhbXBsZVJhdGUgYW5kIENoYW5uZWxDb3VudAorICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIGdldElucHV0Q2hhbm5lbEluZm8obUNvbXBvbmVudCwgbUNvbXBOYW1lLCBiaXRTdHJlYW1JbmZvKSk7CisgICAgICAgIGludCBuU2FtcGxlUmF0ZSA9IGJpdFN0cmVhbUluZm9bMF07CisgICAgICAgIGludCBuQ2hhbm5lbHMgPSBiaXRTdHJlYW1JbmZvWzFdOworICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBpdEluID0gbVRpbWVzdGFtcFVzbGlzdC5iZWdpbigpOworICAgICAgICBhbmRyb2lkOjpMaXN0PG91dHB1dE1ldGFEYXRhPjo6aXRlcmF0b3IgaXRPdXQgPSBvQnVmZmVyTWV0YURhdGEuYmVnaW4oKTsKKyAgICAgICAgRVhQRUNUX0VRKCppdEluLCBpdE91dC0+dGltZXN0YW1wVXMpOworICAgICAgICBleHBUcyA9ICppdEluOworICAgICAgICB3aGlsZSAoaXRPdXQgIT0gb0J1ZmZlck1ldGFEYXRhLmVuZCgpKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoZXhwVHMsIGl0T3V0LT50aW1lc3RhbXBVcyk7CisgICAgICAgICAgICBpZiAoZXhwVHMgIT0gaXRPdXQtPnRpbWVzdGFtcFVzKSBicmVhazsKKyAgICAgICAgICAgIC8vIGJ1ZmZlciBzYW1wbGVzID0gKCh0b3RhbCBieXRlcykgLyAoYWMgKiAoYml0cyBwZXIgc2FtcGxlIC8gOCkpCisgICAgICAgICAgICBzYW1wbGVzUmVjZWl2ZWQgKz0gKChpdE91dC0+cmFuZ2VMZW5ndGgpIC8gKG5DaGFubmVscyAqIDIpKTsKKyAgICAgICAgICAgIGV4cFRzID0gc2FtcGxlc1JlY2VpdmVkICogMTAwMDAwMGxsIC8gblNhbXBsZVJhdGU7CisgICAgICAgICAgICBpdE91dCsrOworICAgICAgICB9CisgICAgICAgIGl0SW4gPSBtVGltZXN0YW1wVXNsaXN0LmVuZCgpOworICAgICAgICAtLWl0SW47CisgICAgICAgIEVYUEVDVF9HVChleHBUcywgKml0SW4pOworICAgICAgICBvQnVmZmVyTWV0YURhdGEuY2xlYXIoKTsKKyAgICAgICAgbVRpbWVzdGFtcFVzbGlzdC5jbGVhcigpOworICAgIH0KKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFN0cmVhbUluZGV4ZXMsIENvZGVjMkF1ZGlvRGVjRGVjb2RlVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKDAsIDEpKTsKKworLy8gdGh1bWJuYWlsIHRlc3QKK1RFU1RfRihDb2RlYzJBdWRpb0RlY0hpZGxUZXN0LCBUaHVtYm5haWxUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3QgUmVxdWVzdCBmb3IgdGh1bWJuYWlsIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBjaGFyIG1VUkxbNTEyXSwgaW5mb1s1MTJdOworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtLCBlbGVJbmZvOworCisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIHN0cmNweShpbmZvLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvKTsKKworICAgIGVsZUluZm8ub3BlbihpbmZvKTsKKyAgICBBU1NFUlRfRVEoZWxlSW5mby5pc19vcGVuKCksIHRydWUpOworICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgaW50IGJ5dGVzQ291bnQgPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIGJyZWFrOworICAgICAgICBlbGVJbmZvID4+IGZsYWdzOworICAgICAgICBlbGVJbmZvID4+IHRpbWVzdGFtcDsKKyAgICAgICAgSW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICB9CisgICAgZWxlSW5mby5jbG9zZSgpOworICAgIGludDMyX3QgYml0U3RyZWFtSW5mb1syXSA9IHswfTsKKyAgICBpZiAobUNvbXBOYW1lID09IHJhdykgeworICAgICAgICBiaXRTdHJlYW1JbmZvWzBdID0gODAwMDsKKyAgICAgICAgYml0U3RyZWFtSW5mb1sxXSA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICBnZXRJbnB1dENoYW5uZWxJbmZvKG1Db21wb25lbnQsIG1Db21wTmFtZSwgYml0U3RyZWFtSW5mbykpOworICAgIH0KKyAgICBzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIGJpdFN0cmVhbUluZm8pOworICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKKworICAgIC8vIHJlcXVlc3QgRU9TIGZvciB0aHVtYm5haWwKKyAgICAvLyBzaWduYWwgRU9TIGZsYWcgd2l0aCBsYXN0IGZyYW1lCisgICAgc2l6ZV90IGkgPSAtMTsKKyAgICBkbyB7CisgICAgICAgIGkrKzsKKyAgICAgICAgZmxhZ3MgPSAwOworICAgICAgICBpZiAoSW5mb1tpXS5mbGFncykgZmxhZ3MgPSAxdSA8PCAoSW5mb1tpXS5mbGFncyAtIDEpOworCisgICAgfSB3aGlsZSAoIShmbGFncyAmIFNZTkNfRlJBTUUpKTsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkZWNvZGVORnJhbWVzKAorICAgICAgICBtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIG1GbHVzaGVkSW5kaWNlcywKKyAgICAgICAgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIDAsIGkgKyAxKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgRVhQRUNUX0dFKG1GcmFtZXNSZWNlaXZlZCwgMVUpOworICAgIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK1RFU1RfRihDb2RlYzJBdWRpb0RlY0hpZGxUZXN0LCBFT1NUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3QgZW1wdHkgaW5wdXQgYnVmZmVyIHdpdGggRU9TIGZsYWciKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICAvLyBQcmVwYXJlIEMyV29yaworICAgIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgaWYgKCFtV29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHdvcmsuc3dhcChtV29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgbVdvcmtRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAibVdvcmtRdWV1ZSBFbXB0eSBhdCB0aGUgc3RhcnQgb2YgdGVzdCI7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworCisgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IDA7CisgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gMDsKKyAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpLCBDMl9PSyk7CisKKyAgICB7CisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGlmIChtV29ya1F1ZXVlLnNpemUoKSAhPSBNQVhfSU5QVVRfQlVGRkVSUykgeworICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIFRJTUVfT1VUKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfRVEobUVvcywgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Xb3JrUXVldWUuc2l6ZSgpLCAoc2l6ZV90KU1BWF9JTlBVVF9CVUZGRVJTKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK1RFU1RfRihDb2RlYzJBdWRpb0RlY0hpZGxUZXN0LCBGbHVzaFRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdHMgRmx1c2ggY2FsbHMiKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgY2hhciBtVVJMWzUxMl0sIGluZm9bNTEyXTsKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbSwgZWxlSW5mbzsKKworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBzdHJjcHkoaW5mbywgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbyk7CisKKyAgICBlbGVJbmZvLm9wZW4oaW5mbyk7CisgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBhbmRyb2lkOjpWZWN0b3I8RnJhbWVJbmZvPiBJbmZvOworICAgIGludCBieXRlc0NvdW50ID0gMDsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgdWludDMyX3QgdGltZXN0YW1wID0gMDsKKyAgICBtRmx1c2hlZEluZGljZXMuY2xlYXIoKTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoIShlbGVJbmZvID4+IGJ5dGVzQ291bnQpKSBicmVhazsKKyAgICAgICAgZWxlSW5mbyA+PiBmbGFnczsKKyAgICAgICAgZWxlSW5mbyA+PiB0aW1lc3RhbXA7CisgICAgICAgIEluZm8ucHVzaF9iYWNrKHtieXRlc0NvdW50LCBmbGFncywgdGltZXN0YW1wfSk7CisgICAgfQorICAgIGVsZUluZm8uY2xvc2UoKTsKKyAgICBpbnQzMl90IGJpdFN0cmVhbUluZm9bMl0gPSB7MH07CisgICAgaWYgKG1Db21wTmFtZSA9PSByYXcpIHsKKyAgICAgICAgYml0U3RyZWFtSW5mb1swXSA9IDgwMDA7CisgICAgICAgIGJpdFN0cmVhbUluZm9bMV0gPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgZ2V0SW5wdXRDaGFubmVsSW5mbyhtQ29tcG9uZW50LCBtQ29tcE5hbWUsIGJpdFN0cmVhbUluZm8pKTsKKyAgICB9CisgICAgc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBiaXRTdHJlYW1JbmZvKTsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgLy8gRGVjb2RlIDEyOCBmcmFtZXMgYW5kIGZsdXNoLiBoZXJlIDEyOCBpcyBjaG9zZW4gdG8gZW5zdXJlIHRoZXJlIGlzIGEga2V5CisgICAgLy8gZnJhbWUgYWZ0ZXIgdGhpcyBzbyB0aGF0IHRoZSBiZWxvdyBzZWN0aW9uIGNhbiBiZSBjb3ZlcmVkIGZvciBhbGwKKyAgICAvLyBjb21wb25lbnRzCisgICAgdWludDMyX3QgbnVtRnJhbWVzRmx1c2hlZCA9IDEyODsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkZWNvZGVORnJhbWVzKAorICAgICAgICBtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIG1GbHVzaGVkSW5kaWNlcywKKyAgICAgICAgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIDAsIG51bUZyYW1lc0ZsdXNoZWQsIGZhbHNlKSk7CisgICAgLy8gZmx1c2gKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGZsdXNoZWRXb3JrOworICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgIG1Db21wb25lbnQtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMgLSBmbHVzaGVkV29yay5zaXplKCkpKTsKKyAgICB1aW50NjRfdCBmcmFtZUluZGV4OworICAgIHsKKyAgICAgICAgLy9VcGRhdGUgbUZsdXNoZWRJbmRpY2VzIGJhc2VkIG9uIHRoZSBpbmRleCByZWNlaXZlZCBmcm9tIGZsdXNoKCkKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgICAgICAgICBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBmcmFtZUluZGV4SXQgPQorICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vIFNlZWsgdG8gbmV4dCBrZXkgZnJhbWUgYW5kIHN0YXJ0IGRlY29kaW5nIHRpbGwgdGhlIGVuZAorICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOworICAgIGludCBpbmRleCA9IG51bUZyYW1lc0ZsdXNoZWQ7CisgICAgYm9vbCBrZXlGcmFtZSA9IGZhbHNlOworICAgIGZsYWdzID0gMDsKKyAgICB3aGlsZSAoaW5kZXggPCAoaW50KUluZm8uc2l6ZSgpKSB7CisgICAgICAgIGlmIChJbmZvW2luZGV4XS5mbGFncykgZmxhZ3MgPSAxdSA8PCAoSW5mb1tpbmRleF0uZmxhZ3MgLSAxKTsKKyAgICAgICAgaWYgKChmbGFncyAmIFNZTkNfRlJBTUUpID09IFNZTkNfRlJBTUUpIHsKKyAgICAgICAgICAgIGtleUZyYW1lID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZsYWdzID0gMDsKKyAgICAgICAgZWxlU3RyZWFtLmlnbm9yZShJbmZvW2luZGV4XS5ieXRlc0NvdW50KTsKKyAgICAgICAgaW5kZXgrKzsKKyAgICB9CisgICAgaWYgKGtleUZyYW1lKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgZGVjb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KUluZm8uc2l6ZSgpIC0gaW5kZXgpKTsKKyAgICB9CisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgZXJyID0KKyAgICAgICAgbUNvbXBvbmVudC0+Zmx1c2goQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmZsdXNoZWRXb3JrKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgKHNpemVfdClNQVhfSU5QVVRfQlVGRkVSUyAtIGZsdXNoZWRXb3JrLnNpemUoKSkpOworICAgIHsKKyAgICAgICAgLy9VcGRhdGUgbUZsdXNoZWRJbmRpY2VzIGJhc2VkIG9uIHRoZSBpbmRleCByZWNlaXZlZCBmcm9tIGZsdXNoKCkKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgICAgICAgICBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBmcmFtZUluZGV4SXQgPQorICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRmx1c2hlZEluZGljZXMuZW1wdHkoKSwgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCwgRGVjb2RlVGVzdEVtcHR5QnVmZmVyc0luc2VydGVkKSB7CisgICAgZGVzY3JpcHRpb24oIkRlY29kZSB3aXRoIG11bHRpcGxlIGVtcHR5IGlucHV0IGZyYW1lcyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICBjaGFyIG1VUkxbNTEyXSwgaW5mb1s1MTJdOworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtLCBlbGVJbmZvOworCisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIHN0cmNweShpbmZvLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvKTsKKworICAgIGVsZUluZm8ub3BlbihpbmZvKTsKKyAgICBBU1NFUlRfRVEoZWxlSW5mby5pc19vcGVuKCksIHRydWUpIDw8IG1VUkwgPDwgIiAtIGZpbGUgbm90IGZvdW5kIjsKKyAgICBhbmRyb2lkOjpWZWN0b3I8RnJhbWVJbmZvPiBJbmZvOworICAgIGludCBieXRlc0NvdW50ID0gMDsKKyAgICB1aW50MzJfdCBmcmFtZUlkID0gMDsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgdWludDMyX3QgdGltZXN0YW1wID0gMDsKKyAgICBib29sIGNvZGVjQ29uZmlnID0gZmFsc2U7CisgICAgLy8gVGhpcyB0ZXN0IGludHJvZHVjZXMgZW1wdHkgQ1NEIGFmdGVyIGV2ZXJ5IDIwdGggZnJhbWUKKyAgICAvLyBhbmQgZW1wdHkgaW5wdXQgZnJhbWVzIGF0IGFuIGludGVydmFsIG9mIDUgZnJhbWVzLgorICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICghKGZyYW1lSWQgJSA1KSkgeworICAgICAgICAgICAgaWYgKCEoZnJhbWVJZCAlIDIwKSkgZmxhZ3MgPSAzMjsKKyAgICAgICAgICAgIGVsc2UgZmxhZ3MgPSAwOworICAgICAgICAgICAgYnl0ZXNDb3VudCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIShlbGVJbmZvID4+IGJ5dGVzQ291bnQpKSBicmVhazsKKyAgICAgICAgICAgIGVsZUluZm8gPj4gZmxhZ3M7CisgICAgICAgICAgICBlbGVJbmZvID4+IHRpbWVzdGFtcDsKKyAgICAgICAgICAgIGNvZGVjQ29uZmlnID0gZmxhZ3MgPworICAgICAgICAgICAgICAgICgoMSA8PCAoZmxhZ3MgLSAxKSkgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9IDAgOiAwOworICAgICAgICB9CisgICAgICAgIEluZm8ucHVzaF9iYWNrKHtieXRlc0NvdW50LCBmbGFncywgdGltZXN0YW1wfSk7CisgICAgICAgIGZyYW1lSWQrKzsKKyAgICB9CisgICAgZWxlSW5mby5jbG9zZSgpOworCisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGRlY29kZU5GcmFtZXMoCisgICAgICAgIG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUZsdXNoZWRJbmRpY2VzLAorICAgICAgICBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywgMCwgKGludClJbmZvLnNpemUoKSkpOworCisgICAgLy8gYmxvY2tpbmcgY2FsbCB0byBlbnN1cmVzIGFwcGxpY2F0aW9uIHRvIFdhaXQgdGlsbCBhbGwgdGhlIGlucHV0cyBhcmUKKyAgICAvLyBjb25zdW1lZAorICAgIGlmICghbUVvcykgeworICAgICAgICBBTE9HVigiV2FpdGluZyBmb3IgaW5wdXQgY29uc3VtcHRpb24iKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSkpOworICAgIH0KKworICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIGlmIChtRnJhbWVzUmVjZWl2ZWQgIT0gSW5mby5zaXplKCkpIHsKKyAgICAgICAgQUxPR0UoIklucHV0IGJ1ZmZlciBjb3VudCBhbmQgT3V0cHV0IGJ1ZmZlciBjb3VudCBtaXNtYXRjaCIpOworICAgICAgICBBTE9HVigiZnJhbWVzUmVjZWl2ZWQgOiAlZCBpbnB1dEZyYW1lcyA6ICV6dSIsIG1GcmFtZXNSZWNlaXZlZCwKKyAgICAgICAgICAgICAgSW5mby5zaXplKCkpOworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorCisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIGdFbnYgPSBuZXcgQ29tcG9uZW50VGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgZ0Vudi0+aW5pdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgTE9HKElORk8pIDw8ICJDMiBUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9hdWRpby9WdHNIaWRsQzJWMV8wVGFyZ2V0QXVkaW9FbmNUZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvYXVkaW8vVnRzSGlkbEMyVjFfMFRhcmdldEF1ZGlvRW5jVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ2NmVlNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvYXVkaW8vVnRzSGlkbEMyVjFfMFRhcmdldEF1ZGlvRW5jVGVzdC5jcHAKQEAgLTAsMCArMSw1OTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJjb2RlYzJfaGlkbF9oYWxfYXVkaW9fZW5jX3Rlc3QiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKwordXNpbmcgYW5kcm9pZDo6QzJBbGxvY2F0b3JJb247CisKKyNpbmNsdWRlIDxWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UuaD4KKyNpbmNsdWRlICJtZWRpYV9jMl9hdWRpb19oaWRsX3Rlc3RfY29tbW9uLmgiCisjaW5jbHVkZSAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIgorCitjbGFzcyBMaW5lYXJCdWZmZXIgOiBwdWJsaWMgQzJCdWZmZXIgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IExpbmVhckJ1ZmZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4mIGJsb2NrKQorICAgICAgICA6IEMyQnVmZmVyKAorICAgICAgICAgICAgICB7YmxvY2stPnNoYXJlKGJsb2NrLT5vZmZzZXQoKSwgYmxvY2stPnNpemUoKSwgOjpDMkZlbmNlKCkpfSkge30KK307CisKK3N0YXRpYyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQqIGdFbnYgPSBudWxscHRyOworCituYW1lc3BhY2UgeworCitjbGFzcyBDb2RlYzJBdWRpb0VuY0hpZGxUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIHsKKyAgIHByaXZhdGU6CisgICAgdHlwZWRlZiA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZSBTdXBlcjsKKworICAgcHVibGljOgorICAgIDo6c3RkOjpzdHJpbmcgZ2V0VGVzdENhc2VJbmZvKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gOjpzdGQ6OnN0cmluZygpICsKKyAgICAgICAgICAgICAgICAiQ29tcG9uZW50OiAiICsgZ0Vudi0+Z2V0Q29tcG9uZW50KCkuY19zdHIoKSArICIgfCAiICsKKyAgICAgICAgICAgICAgICAiSW5zdGFuY2U6ICIgKyBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkgKyAiIHwgIiArCisgICAgICAgICAgICAgICAgIlJlczogIiArIGdFbnYtPmdldFJlcygpLmNfc3RyKCk7CisgICAgfQorCisgICAgLy8gZ29vZ2xlLmNvZGVjMiBBdWRpbyB0ZXN0IHNldHVwCisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBTdXBlcjo6U2V0VXAoKTsKKyAgICAgICAgbURpc2FibGVUZXN0ID0gZmFsc2U7CisgICAgICAgIEFMT0dWKCJDb2RlYzJBdWRpb0VuY0hpZGxUZXN0IFNldFVwIik7CisgICAgICAgIG1DbGllbnQgPSBhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKAorICAgICAgICAgICAgZ0Vudi0+Z2V0SW5zdGFuY2UoKS5jX3N0cigpKTsKKyAgICAgICAgQVNTRVJUX05FKG1DbGllbnQsIG51bGxwdHIpOworICAgICAgICBtTGlzdGVuZXIucmVzZXQobmV3IENvZGVjTGlzdGVuZXIoCisgICAgICAgICAgICBbdGhpc10oc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlV29ya0RvbmUod29ya0l0ZW1zKTsKKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgQVNTRVJUX05FKG1MaXN0ZW5lciwgbnVsbHB0cik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0lOUFVUX0JVRkZFUlM7ICsraSkgeworICAgICAgICAgICAgbVdvcmtRdWV1ZS5lbXBsYWNlX2JhY2sobmV3IEMyV29yayk7CisgICAgICAgIH0KKyAgICAgICAgbUNsaWVudC0+Y3JlYXRlQ29tcG9uZW50KGdFbnYtPmdldENvbXBvbmVudCgpLmNfc3RyKCksIG1MaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ29tcG9uZW50KTsKKyAgICAgICAgQVNTRVJUX05FKG1Db21wb25lbnQsIG51bGxwdHIpOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBzdG9yZSA9CisgICAgICAgICAgICBhbmRyb2lkOjpHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisgICAgICAgIENIRUNLX0VRKHN0b3JlLT5mZXRjaEFsbG9jYXRvcihDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtTGluZWFyQWxsb2NhdG9yKSwKKyAgICAgICAgICAgICAgICAgQzJfT0spOworICAgICAgICBtTGluZWFyUG9vbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2w+KG1MaW5lYXJBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJsb2NrUG9vbElkKyspOworICAgICAgICBBU1NFUlRfTkUobUxpbmVhclBvb2wsIG51bGxwdHIpOworCisgICAgICAgIG1Db21wTmFtZSA9IHVua25vd25fY29tcDsKKyAgICAgICAgc3RydWN0IFN0cmluZ1RvTmFtZSB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBOYW1lOworICAgICAgICAgICAgc3RhbmRhcmRDb21wIENvbXBOYW1lOworICAgICAgICB9OworICAgICAgICBjb25zdCBTdHJpbmdUb05hbWUga1N0cmluZ1RvTmFtZVtdID0geworICAgICAgICAgICAgeyJhYWMiLCBhYWN9LAorICAgICAgICAgICAgeyJmbGFjIiwgZmxhY30sCisgICAgICAgICAgICB7Im9wdXMiLCBvcHVzfSwKKyAgICAgICAgICAgIHsiYW1ybmIiLCBhbXJuYn0sCisgICAgICAgICAgICB7ImFtcndiIiwgYW1yd2J9LAorICAgICAgICB9OworICAgICAgICBjb25zdCBzaXplX3Qga051bVN0cmluZ1RvTmFtZSA9CisgICAgICAgICAgICBzaXplb2Yoa1N0cmluZ1RvTmFtZSkgLyBzaXplb2Yoa1N0cmluZ1RvTmFtZVswXSk7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgc3Vic3RyaW5nOworICAgICAgICBzdGQ6OnN0cmluZyBjb21wOworICAgICAgICBzdWJzdHJpbmcgPSBzdGQ6OnN0cmluZyhnRW52LT5nZXRDb21wb25lbnQoKSk7CisgICAgICAgIC8qIFRPRE86IGJldHRlciBhcHByb2FjaCB0byBmaW5kIHRoZSBjb21wb25lbnQgKi8KKyAgICAgICAgLyogImMyLmFuZHJvaWQuIiA9PiAxMXRoIHBvc2l0aW9uICovCisgICAgICAgIHNpemVfdCBwb3MgPSAxMTsKKyAgICAgICAgc2l6ZV90IGxlbiA9IHN1YnN0cmluZy5maW5kKCIuZW5jb2RlciIsIHBvcyk7CisgICAgICAgIGNvbXAgPSBzdWJzdHJpbmcuc3Vic3RyKHBvcywgbGVuIC0gcG9zKTsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1TdHJpbmdUb05hbWU7ICsraSkgeworICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKGNvbXAuY19zdHIoKSwga1N0cmluZ1RvTmFtZVtpXS5OYW1lKSkgeworICAgICAgICAgICAgICAgIG1Db21wTmFtZSA9IGtTdHJpbmdUb05hbWVbaV0uQ29tcE5hbWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUVvcyA9IGZhbHNlOworICAgICAgICBtQ3NkID0gZmFsc2U7CisgICAgICAgIG1GcmFtZXNSZWNlaXZlZCA9IDA7CisgICAgICAgIGlmIChtQ29tcE5hbWUgPT0gdW5rbm93bl9jb21wKSBtRGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICBpZiAobURpc2FibGVUZXN0KSBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IERpc2FibGVkIFxuIjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtQ29tcG9uZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGlmICg6OnRlc3Rpbmc6OlRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSByZXR1cm47CisgICAgICAgICAgICBtQ29tcG9uZW50LT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQ29tcG9uZW50ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBTdXBlcjo6VGVhckRvd24oKTsKKyAgICB9CisgICAgLy8gY2FsbGJhY2sgZnVuY3Rpb24gdG8gcHJvY2VzcyBvbldvcmtEb25lIHJlY2VpdmVkIGJ5IExpc3RlbmVyCisgICAgdm9pZCBoYW5kbGVXb3JrRG9uZShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IHdvcmtJdGVtcykgeworICAgICAgICAgICAgaWYgKCF3b3JrLT53b3JrbGV0cy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgd29ya0RvbmUobUNvbXBvbmVudCwgd29yaywgbUZsdXNoZWRJbmRpY2VzLCBtUXVldWVMb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUVvcywgbUNzZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzUmVjZWl2ZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVudW0gc3RhbmRhcmRDb21wIHsKKyAgICAgICAgYWFjLAorICAgICAgICBmbGFjLAorICAgICAgICBvcHVzLAorICAgICAgICBhbXJuYiwKKyAgICAgICAgYW1yd2IsCisgICAgICAgIHVua25vd25fY29tcCwKKyAgICB9OworCisgICAgYm9vbCBtRW9zOworICAgIGJvb2wgbUNzZDsKKyAgICBib29sIG1EaXNhYmxlVGVzdDsKKyAgICBzdGFuZGFyZENvbXAgbUNvbXBOYW1lOworICAgIHVpbnQzMl90IG1GcmFtZXNSZWNlaXZlZDsKKyAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+IG1GbHVzaGVkSW5kaWNlczsKKworICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG1CbG9ja1Bvb2xJZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1MaW5lYXJQb29sOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUxpbmVhckFsbG9jYXRvcjsKKworICAgIHN0ZDo6bXV0ZXggbVF1ZXVlTG9jazsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtUXVldWVDb25kaXRpb247CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBtV29ya1F1ZXVlOworCisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudD4gbUNsaWVudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gbUNvbXBvbmVudDsKKworICAgcHJvdGVjdGVkOgorICAgIHN0YXRpYyB2b2lkIGRlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjcmlwdGlvbikgeworICAgICAgICBSZWNvcmRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgICAgfQorfTsKKwordm9pZCB2YWxpZGF0ZUNvbXBvbmVudCgKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgQ29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXBOYW1lLCBib29sJiBkaXNhYmxlVGVzdCkgeworICAgIC8vIFZhbGlkYXRlIGl0cyBhIEMyIENvbXBvbmVudAorICAgIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJjMiIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIEFMT0dFKCJOb3QgYSBjMiBjb21wb25lbnQiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVmFsaWRhdGUgaXRzIG5vdCBhbiBlbmNvZGVyIGFuZCB0aGUgY29tcG9uZW50IHRvIGJlIHRlc3RlZCBpcyBhdWRpbworICAgIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJkZWNvZGVyIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0UoIkV4cGVjdGVkIEVuY29kZXIsIGdpdmVuIERlY29kZXIiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBjMl9zdGF0dXNfdCBjMmVyciA9CisgICAgICAgIGNvbXBvbmVudC0+cXVlcnkoe30sIHtDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dDo6UEFSQU1fVFlQRX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywgJnF1ZXJpZWQpOworICAgIGlmIChjMmVyciAhPSBDMl9PSyAmJiBxdWVyaWVkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJRdWVyeSBtZWRpYSB0eXBlIGZhaWxlZCA9PiAlZCIsIGMyZXJyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGQ6OnN0cmluZyBpbnB1dERvbWFpbiA9CisgICAgICAgICAgICAoKEMyU3RyZWFtTWVkaWFUeXBlU2V0dGluZzo6aW5wdXQqKXF1ZXJpZWRbMF0uZ2V0KCkpLT5tLnZhbHVlOworICAgICAgICBpZiAoaW5wdXREb21haW4uZmluZCgiYXVkaW8vIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBBdWRpbyBDb21wb25lbnQiKTsKKyAgICAgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFZhbGlkYXRlcyBjb21wb25lbnQgbmFtZQorICAgIGlmIChjb21wTmFtZSA9PSBDb2RlYzJBdWRpb0VuY0hpZGxUZXN0Ojp1bmtub3duX2NvbXApIHsKKyAgICAgICAgQUxPR0UoIkNvbXBvbmVudCBJblZhbGlkIik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigiQ29tcG9uZW50IFZhbGlkIik7Cit9CisKKy8vIFNldCBEZWZhdWx0IGNvbmZpZyBwYXJhbS4KK3ZvaWQgc2V0dXBDb25maWdQYXJhbSgKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgaW50MzJfdCBuQ2hhbm5lbHMsIGludDMyX3QgblNhbXBsZVJhdGUpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQgc2FtcGxlUmF0ZUluZm8oMHUsIG5TYW1wbGVSYXRlKTsKKyAgICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86OmlucHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIG5DaGFubmVscyk7CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gY29uZmlnUGFyYW17JnNhbXBsZVJhdGVJbmZvLCAmY2hhbm5lbENvdW50SW5mb307CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgY29tcG9uZW50LT5jb25maWcoY29uZmlnUGFyYW0sIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgQVNTRVJUX0VRKGZhaWx1cmVzLnNpemUoKSwgMHUpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIEMyX09LKTsKK30KKworLy8gTG9va1VwVGFibGUgb2YgY2xpcHMgYW5kIG1ldGFkYXRhIGZvciBjb21wb25lbnQgdGVzdGluZwordm9pZCBHZXRVUkxGb3JDb21wb25lbnQoQ29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXAsIGNoYXIqIG1VUkwpIHsKKyAgICBzdHJ1Y3QgQ29tcFRvVVJMIHsKKyAgICAgICAgQ29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXA7CisgICAgICAgIGNvbnN0IGNoYXIqIG1VUkw7CisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgQ29tcFRvVVJMIGtDb21wVG9VUkxbXSA9IHsKKyAgICAgICAge0NvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6YWFjLAorICAgICAgICAgImJiYl9yYXdfMmNoXzQ4a2h6X3MxNmxlLnJhdyJ9LAorICAgICAgICB7Q29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjphbXJuYiwKKyAgICAgICAgICJiYmJfcmF3XzFjaF84a2h6X3MxNmxlLnJhdyJ9LAorICAgICAgICB7Q29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjphbXJ3YiwKKyAgICAgICAgICJiYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXcifSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6ZmxhYywKKyAgICAgICAgICJiYmJfcmF3XzJjaF80OGtoel9zMTZsZS5yYXcifSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6b3B1cywKKyAgICAgICAgICJiYmJfcmF3XzJjaF80OGtoel9zMTZsZS5yYXcifSwKKyAgICB9OworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2Yoa0NvbXBUb1VSTCkgLyBzaXplb2Yoa0NvbXBUb1VSTFswXSk7ICsraSkgeworICAgICAgICBpZiAoa0NvbXBUb1VSTFtpXS5jb21wID09IGNvbXApIHsKKyAgICAgICAgICAgIHN0cmNhdChtVVJMLCBrQ29tcFRvVVJMW2ldLm1VUkwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGVuY29kZU5GcmFtZXMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bXV0ZXggJnF1ZXVlTG9jaywgc3RkOjpjb25kaXRpb25fdmFyaWFibGUmIHF1ZXVlQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+JiBmbHVzaGVkSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBsaW5lYXJQb29sLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6aWZzdHJlYW0mIGVsZVN0cmVhbSwgdWludDMyX3QgbkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwgaW50MzJfdCBuQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU2FtcGxlUmF0ZSwgYm9vbCBmbHVzaGVkID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgYm9vbCBzaWduYWxFT1MgPSB0cnVlKSB7CisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworCisgICAgdWludDMyX3QgZnJhbWVJRCA9IDA7CisgICAgdWludDMyX3QgbWF4UmV0cnkgPSAwOworICAgIGludCBieXRlc0NvdW50ID0gc2FtcGxlc1BlckZyYW1lICogbkNoYW5uZWxzICogMjsKKyAgICBpbnQzMl90IHRpbWVzdGFtcEluY3IgPQorICAgICAgICAoaW50KSgoKGZsb2F0KXNhbXBsZXNQZXJGcmFtZSAvIG5TYW1wbGVSYXRlKSAqIDEwMDAwMDApOworICAgIHVpbnQ2NF90IHRpbWVzdGFtcCA9IDA7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKG5GcmFtZXMgPT0gMCkgYnJlYWs7CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICAgICAgLy8gUHJlcGFyZSBDMldvcmsKKyAgICAgICAgd2hpbGUgKCF3b3JrICYmIChtYXhSZXRyeSA8IE1BWF9SRVRSWSkpIHsKKyAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgICAgIGlmICghd29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICB3b3JrLnN3YXAod29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgICAgIHdvcmtRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICAgICAgICAgIG1heFJldHJ5Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF3b3JrICYmIChtYXhSZXRyeSA+PSBNQVhfUkVUUlkpKSB7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIldhaXQgZm9yIGdlbmVyYXRpbmcgQzJXb3JrIGV4Y2VlZGVkIHRpbWVvdXQiOworICAgICAgICB9CisgICAgICAgIGlmIChzaWduYWxFT1MgJiYgKG5GcmFtZXMgPT0gMSkpCisgICAgICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBpZiAoZmx1c2hlZCkgeworICAgICAgICAgICAgZmxhZ3MgfD0gU1lOQ19GUkFNRTsKKyAgICAgICAgICAgIGZsdXNoZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IGZyYW1lSUQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgICAgIGZsdXNoZWRJbmRpY2VzLmVtcGxhY2VfYmFjayhmcmFtZUlEKTsKKyAgICAgICAgfQorICAgICAgICBjaGFyKiBkYXRhID0gKGNoYXIqKW1hbGxvYyhieXRlc0NvdW50KTsKKyAgICAgICAgQVNTRVJUX05FKGRhdGEsIG51bGxwdHIpOworICAgICAgICBlbGVTdHJlYW0ucmVhZChkYXRhLCBieXRlc0NvdW50KTsKKyAgICAgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5nY291bnQoKSwgYnl0ZXNDb3VudCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICAgICAgQVNTRVJUX0VRKEMyX09LLCBsaW5lYXJQb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc0NvdW50LCB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxvY2spKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoYmxvY2spOworICAgICAgICAvLyBXcml0ZSBWaWV3CisgICAgICAgIEMyV3JpdGVWaWV3IHZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQzJMaW5lYXJCbG9jazo6bWFwKCkgZmFpbGVkIDogJWQiLCB2aWV3LmVycm9yKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgQVNTRVJUX0VRKChzaXplX3QpYnl0ZXNDb3VudCwgdmlldy5jYXBhY2l0eSgpKTsKKyAgICAgICAgQVNTRVJUX0VRKDB1LCB2aWV3Lm9mZnNldCgpKTsKKyAgICAgICAgQVNTRVJUX0VRKChzaXplX3QpYnl0ZXNDb3VudCwgdmlldy5zaXplKCkpOworCisgICAgICAgIG1lbWNweSh2aWV3LmJhc2UoKSwgZGF0YSwgYnl0ZXNDb3VudCk7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5lbXBsYWNlX2JhY2sobmV3IExpbmVhckJ1ZmZlcihibG9jaykpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisgICAgICAgIGZyZWUoZGF0YSk7CisKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICAgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisKKyAgICAgICAgLy8gRE8gVEhFIERFQ09ESU5HCisgICAgICAgIEFTU0VSVF9FUShjb21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKyAgICAgICAgQUxPR1YoIkZyYW1lICMlZCBzaXplID0gJWQgcXVldWVkIiwgZnJhbWVJRCwgYnl0ZXNDb3VudCk7CisgICAgICAgIG5GcmFtZXMtLTsKKyAgICAgICAgdGltZXN0YW1wICs9IHRpbWVzdGFtcEluY3I7CisgICAgICAgIGZyYW1lSUQrKzsKKyAgICAgICAgbWF4UmV0cnkgPSAwOworICAgIH0KK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRW5jSGlkbFRlc3QsIHZhbGlkYXRlQ29tcE5hbWUpIHsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQUxPR1YoIkNoZWNrcyBpZiB0aGUgZ2l2ZW4gY29tcG9uZW50IGlzIGEgdmFsaWQgYXVkaW8gY29tcG9uZW50Iik7CisgICAgdmFsaWRhdGVDb21wb25lbnQobUNvbXBvbmVudCwgbUNvbXBOYW1lLCBtRGlzYWJsZVRlc3QpOworICAgIEFTU0VSVF9FUShtRGlzYWJsZVRlc3QsIGZhbHNlKTsKK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRW5jSGlkbFRlc3QsIEVuY29kZVRlc3QpIHsKKyAgICBBTE9HVigiRW5jb2RlVGVzdCIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIGNoYXIgbVVSTFs1MTJdOworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMKTsKKworICAgIC8vIFNldHRpbmcgZGVmYXVsdCBjb25maWd1cmF0aW9uCisgICAgaW50MzJfdCBuQ2hhbm5lbHMgPSAyOworICAgIGludDMyX3QgblNhbXBsZVJhdGUgPSA0NDEwMDsKKyAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSA9IDEwMjQ7CisgICAgc3dpdGNoIChtQ29tcE5hbWUpIHsKKyAgICAgICAgY2FzZSBhYWM6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAyOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSA0ODAwMDsKKyAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSA9IDEwMjQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBmbGFjOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMjsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gNDgwMDA7CisgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUgPSAxMTUyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Ugb3B1czoKKyAgICAgICAgICAgIG5DaGFubmVscyA9IDI7CisgICAgICAgICAgICBuU2FtcGxlUmF0ZSA9IDQ4MDAwOworICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lID0gOTYwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYW1ybmI6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAxOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSA4MDAwOworICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lID0gMTYwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYW1yd2I6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAxOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSAxNjAwMDsKKyAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSA9IDE2MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgIH0KKyAgICBzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIG5DaGFubmVscywgblNhbXBsZVJhdGUpOworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtOworICAgIHVpbnQzMl90IG51bUZyYW1lcyA9IDEyODsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgbnVtRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSwgbkNoYW5uZWxzLCBuU2FtcGxlUmF0ZSkpOworICAgIC8vIGJsb2NraW5nIGNhbGwgdG8gZW5zdXJlcyBhcHBsaWNhdGlvbiB0byBXYWl0IHRpbGwgYWxsIHRoZSBpbnB1dHMgYXJlCisgICAgLy8gY29uc3VtZWQKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKyAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICBpZiAobUZyYW1lc1JlY2VpdmVkICE9IG51bUZyYW1lcykgeworICAgICAgICBBTE9HRSgiSW5wdXQgYnVmZmVyIGNvdW50IGFuZCBPdXRwdXQgYnVmZmVyIGNvdW50IG1pc21hdGNoIik7CisgICAgICAgIEFMT0dFKCJmcmFtZXNSZWNlaXZlZCA6ICVkIGlucHV0RnJhbWVzIDogJXUiLCBtRnJhbWVzUmVjZWl2ZWQsIG51bUZyYW1lcyk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisgICAgaWYgKChtQ29tcE5hbWUgPT0gZmxhYyB8fCBtQ29tcE5hbWUgPT0gb3B1cyB8fCBtQ29tcE5hbWUgPT0gYWFjKSkgeworICAgICAgICBpZiAoIW1Dc2QpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDU0QgYnVmZmVyIG1pc3NpbmciKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfRVEobUVvcywgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyQXVkaW9FbmNIaWRsVGVzdCwgRU9TVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0IGVtcHR5IGlucHV0IGJ1ZmZlciB3aXRoIEVPUyBmbGFnIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICB7CisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGlmICghbVdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICB3b3JrLnN3YXAobVdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgIG1Xb3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgibVdvcmtRdWV1ZSBFbXB0eSBpcyBub3QgZXhwZWN0ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXN0Iik7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KUMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSAwOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IDA7CisgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+cXVldWUoJml0ZW1zKSwgQzJfT0spOworICAgIHVpbnQzMl90IHF1ZXVlU2l6ZTsKKyAgICB7CisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIHF1ZXVlU2l6ZSA9IG1Xb3JrUXVldWUuc2l6ZSgpOworICAgICAgICBpZiAocXVldWVTaXplIDwgTUFYX0lOUFVUX0JVRkZFUlMpIHsKKyAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRW5jSGlkbFRlc3QsIEZsdXNoVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0IFJlcXVlc3QgZm9yIGZsdXNoIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgY2hhciBtVVJMWzUxMl07CisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwpOworCisgICAgLy8gU2V0dGluZyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKyAgICBtRmx1c2hlZEluZGljZXMuY2xlYXIoKTsKKyAgICBpbnQzMl90IG5DaGFubmVscyA9IDI7CisgICAgaW50MzJfdCBuU2FtcGxlUmF0ZSA9IDQ0MTAwOworICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lID0gMTAyNDsKKyAgICBzd2l0Y2ggKG1Db21wTmFtZSkgeworICAgICAgICBjYXNlIGFhYzoKKyAgICAgICAgICAgIG5DaGFubmVscyA9IDI7CisgICAgICAgICAgICBuU2FtcGxlUmF0ZSA9IDQ4MDAwOworICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lID0gMTAyNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGZsYWM6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAyOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSA0ODAwMDsKKyAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSA9IDExNTI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBvcHVzOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMjsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gNDgwMDA7CisgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUgPSA5NjA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhbXJuYjoKKyAgICAgICAgICAgIG5DaGFubmVscyA9IDE7CisgICAgICAgICAgICBuU2FtcGxlUmF0ZSA9IDgwMDA7CisgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUgPSAxNjA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhbXJ3YjoKKyAgICAgICAgICAgIG5DaGFubmVscyA9IDE7CisgICAgICAgICAgICBuU2FtcGxlUmF0ZSA9IDE2MDAwOworICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lID0gMTYwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorICAgIHNldHVwQ29uZmlnUGFyYW0obUNvbXBvbmVudCwgbkNoYW5uZWxzLCBuU2FtcGxlUmF0ZSk7CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW07CisgICAgdWludDMyX3QgbnVtRnJhbWVzRmx1c2hlZCA9IDMwOworICAgIHVpbnQzMl90IG51bUZyYW1lcyA9IDEyODsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgbnVtRnJhbWVzRmx1c2hlZCwKKyAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUsIG5DaGFubmVscywgblNhbXBsZVJhdGUpKTsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGZsdXNoZWRXb3JrOworICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgIG1Db21wb25lbnQtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMgLSBmbHVzaGVkV29yay5zaXplKCkpKTsKKyAgICB1aW50NjRfdCBmcmFtZUluZGV4OworICAgIHsKKyAgICAgICAgLy9VcGRhdGUgbUZsdXNoZWRJbmRpY2VzIGJhc2VkIG9uIHRoZSBpbmRleCByZWNlaXZlZCBmcm9tIGZsdXNoKCkKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgICAgICAgICBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBmcmFtZUluZGV4SXQgPQorICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICBlbmNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzIC0gbnVtRnJhbWVzRmx1c2hlZCwgc2FtcGxlc1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgIG5DaGFubmVscywgblNhbXBsZVJhdGUsIHRydWUpKTsKKyAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICBlcnIgPQorICAgICAgICBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAoc2l6ZV90KU1BWF9JTlBVVF9CVUZGRVJTIC0gZmx1c2hlZFdvcmsuc2l6ZSgpKSk7CisgICAgeworICAgICAgICAvL1VwZGF0ZSBtRmx1c2hlZEluZGljZXMgYmFzZWQgb24gdGhlIGluZGV4IHJlY2VpdmVkIGZyb20gZmx1c2goKQorICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogZmx1c2hlZFdvcmspIHsKKyAgICAgICAgICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICAgICAgICAgIGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD46Oml0ZXJhdG9yIGZyYW1lSW5kZXhJdCA9CisgICAgICAgICAgICAgICAgc3RkOjpmaW5kKG1GbHVzaGVkSW5kaWNlcy5iZWdpbigpLCBtRmx1c2hlZEluZGljZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lSW5kZXgpOworICAgICAgICAgICAgaWYgKCFtRmx1c2hlZEluZGljZXMuZW1wdHkoKSAmJgorICAgICAgICAgICAgICAgIChmcmFtZUluZGV4SXQgIT0gbUZsdXNoZWRJbmRpY2VzLmVuZCgpKSkgeworICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcy5lcmFzZShmcmFtZUluZGV4SXQpOworICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICAgICAgICAgIG1Xb3JrUXVldWUucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKG1GbHVzaGVkSW5kaWNlcy5lbXB0eSgpLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgZ0VudiA9IG5ldyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBnRW52LT5pbml0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBMT0coSU5GTykgPDwgIkMyIFRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2F1ZGlvL21lZGlhX2MyX2F1ZGlvX2hpZGxfdGVzdF9jb21tb24uaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvYXVkaW8vbWVkaWFfYzJfYXVkaW9faGlkbF90ZXN0X2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNzczY2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2F1ZGlvL21lZGlhX2MyX2F1ZGlvX2hpZGxfdGVzdF9jb21tb24uaApAQCAtMCwwICsxLDIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9DMl9BVURJT19ISURMX1RFU1RfQ09NTU9OX0gKKyNkZWZpbmUgTUVESUFfQzJfQVVESU9fSElETF9URVNUX0NPTU1PTl9ICisKKworI2VuZGlmICAvLyBNRURJQV9DMl9BVURJT19ISURMX1RFU1RfQ09NTU9OX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvY29tbW9uL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2NvbW1vbi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZjQ2ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzMgQEAKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAiVnRzTWVkaWFDMlYxXzBDb21tb25VdGlsIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAiVnRzSGFsVGFyZ2V0VGVzdERlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMi1oaWRsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9pbmNsdWRlIiwKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5jcHAiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKK30KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJWdHNNZWRpYUMyVjFfMERlZmF1bHRzIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAiVnRzSGFsVGFyZ2V0VGVzdERlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMi1oaWRsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgIlZ0c01lZGlhQzJWMV8wQ29tbW9uVXRpbCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzJfY2xpZW50IiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9jb21tb24vUkVBRE1FLm1kIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9jb21tb24vUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNTY5YTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2NvbW1vbi9SRUFETUUubWQKQEAgLTAsMCArMSwyMiBAQAorIyMgQ29kZWMyIEhhbCBAIDEuMCB0ZXN0cyAjIworLS0tCisjIyMjIG1hc3RlciA6CitGdW5jdGlvbmFsaXR5IG9mIG1hc3RlciBpcyB0byBlbnVtZXJhdGUgYWxsIHRoZSBDb2RlYzIgY29tcG9uZW50cyBhdmFpbGFibGUgaW4gQzIgbWVkaWEgc2VydmljZS4KKwordXNhZ2U6IE10c0hpZGxDMlYxXF8wVGFyZ2V0TWFzdGVyVGVzdCAtSSBzb2Z0d2FyZQorCisjIyMjIGNvbXBvbmVudCA6CitGdW5jdGlvbmFsaXR5IG9mIGNvbXBvbmVudCBpcyB0byB0ZXN0IGNvbW1vbiBmdW5jdGlvbmFsaXR5IGFjcm9zcyBhbGwgdGhlIENvZGVjMiBjb21wb25lbnRzIGF2YWlsYWJsZSBpbiBDMiBtZWRpYSBzZXJ2aWNlLiBGb3IgYSBzdGFuZGFyZCBDMiBjb21wb25lbnQsIHRoZXNlIHRlc3RzIGFyZSBleHBlY3RlZCB0byBwYXNzLgorCit1c2FnZTogTXRzSGlkbEMyVjFcXzBUYXJnZXRDb21wb25lbnRUZXN0IC1JIHNvZnR3YXJlIC1DIDxjb21wIG5hbWU+CisKKyMjIyMgYXVkaW8gOgorRnVuY3Rpb25hbGl0eSBvZiBhdWRpbyB0ZXN0IGlzIHRvIHZhbGlkYXRlIGF1ZGlvIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgQ29kZWMyIGNvbXBvbmVudHMuIFRoZSByZXNvdXJjZSBmaWxlcyBmb3IgdGhpcyB0ZXN0IGFyZSB0YWtlbiBmcm9tIGhhcmR3YXJlL2ludGVyZmFjZXMvbWVkaWEvcmVzLiBUaGUgcGF0aCB0byB0aGVzZSBmaWxlcyBvbiB0aGUgZGV2aWNlIGlzIHJlcXVpcmVkIHRvIGJlIGdpdmVuIGZvciBiaXRzdHJlYW0gdGVzdHMuCisKK3VzYWdlOiBNdHNIaWRsQzJWMVxfMFRhcmdldEF1ZGlvRGVjVGVzdCAtSSBzb2Z0d2FyZSAtQyA8Y29tcCBuYW1lPiAtUCAvc2RjYXJkL21lZGlhCisKKyMjIyMgdmlkZW8gOgorRnVuY3Rpb25hbGl0eSBvZiB2aWRlbyB0ZXN0IGlzIHRvIHZhbGlkYXRlIHZpZGVvIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgQ29kZWMyIGNvbXBvbmVudHMuIFRoZSByZXNvdXJjZSBmaWxlcyBmb3IgdGhpcyB0ZXN0IGFyZSB0YWtlbiBmcm9tIGhhcmR3YXJlL2ludGVyZmFjZXMvbWVkaWEvcmVzLiBUaGUgcGF0aCB0byB0aGVzZSBmaWxlcyBvbiB0aGUgZGV2aWNlIGlzIHJlcXVpcmVkIHRvIGJlIGdpdmVuIGZvciBiaXRzdHJlYW0gdGVzdHMuCisKK3VzYWdlOiBNdHNIaWRsQzJWMVxfMFRhcmdldFZpZGVvRGVjVGVzdCAtSSBzb2Z0d2FyZSAtQyA8Y29tcCBuYW1lPiAtUCAvc2RjYXJkL21lZGlhCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvY29tbW9uL21lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9jb21tb24vbWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRhNDU4YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvY29tbW9uL21lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uY3BwCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbiIKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIgorCisvLyBUZXN0IHRoZSBjb2RlY3MgZm9yIE51bGxCdWZmZXIsIEVtcHR5IElucHV0IEJ1ZmZlciB3aXRoKG91dCkgZmxhZ3Mgc2V0Cit2b2lkIHRlc3RJbnB1dEJ1ZmZlcigKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgc3RkOjptdXRleCYgcXVldWVMb2NrLCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrUXVldWUsCisgICAgdWludDMyX3QgZmxhZ3MsIGJvb2wgaXNOdWxsQnVmZmVyKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICB7CisgICAgICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICBpZiAoIXdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICB3b3JrLnN3YXAod29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgd29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJ3b3JrUXVldWUgRW1wdHkgYXQgdGhlIHN0YXJ0IG9mIHRlc3QiOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKworICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gMDsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSAwOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICBpZiAoaXNOdWxsQnVmZmVyKSB7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wbGFjZV9iYWNrKG51bGxwdHIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgQVNTRVJUX0VRKGNvbXBvbmVudC0+cXVldWUoJml0ZW1zKSwgQzJfT0spOworfQorCisvLyBXYWl0IGZvciBhbGwgdGhlIGlucHV0cyB0byBiZSBjb25zdW1lZCBieSB0aGUgcGx1Z2luLgordm9pZCB3YWl0T25JbnB1dENvbnN1bXB0aW9uKHN0ZDo6bXV0ZXgmIHF1ZXVlTG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSYgcXVldWVDb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJDb3VudCkgeworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICB1aW50MzJfdCBxdWV1ZVNpemU7CisgICAgdWludDMyX3QgbWF4UmV0cnkgPSAwOworICAgIHsKKyAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICBxdWV1ZVNpemUgPSB3b3JrUXVldWUuc2l6ZSgpOworICAgIH0KKyAgICB3aGlsZSAoKG1heFJldHJ5IDwgTUFYX1JFVFJZKSAmJiAocXVldWVTaXplIDwgYnVmZmVyQ291bnQpKSB7CisgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgaWYgKHF1ZXVlU2l6ZSAhPSB3b3JrUXVldWUuc2l6ZSgpKSB7CisgICAgICAgICAgICBxdWV1ZVNpemUgPSB3b3JrUXVldWUuc2l6ZSgpOworICAgICAgICAgICAgbWF4UmV0cnkgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICAgICAgbWF4UmV0cnkrKzsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gcHJvY2VzcyBvbldvcmtEb25lIHJlY2VpdmVkIGJ5IExpc3RlbmVyCit2b2lkIHdvcmtEb25lKAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywgc3RkOjpsaXN0PHVpbnQ2NF90PiYgZmx1c2hlZEluZGljZXMsCisgICAgc3RkOjptdXRleCYgcXVldWVMb2NrLCBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSYgcXVldWVDb25kaXRpb24sCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLCBib29sJiBlb3MsIGJvb2wmIGNzZCwKKyAgICB1aW50MzJfdCYgZnJhbWVzUmVjZWl2ZWQpIHsKKyAgICAvLyBoYW5kbGUgY29uZmlndXJhdGlvbiBjaGFuZ2VzIGluIHdvcmsgZG9uZQorICAgIGlmICh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnNpemUoKSAhPSAwKSB7CisgICAgICAgIEFMT0dWKCJDb25maWcgVXBkYXRlIik7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gdXBkYXRlcyA9CisgICAgICAgICAgICBzdGQ6Om1vdmUod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZSk7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBjb25maWdQYXJhbTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHVwZGF0ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIEMyUGFyYW0qIHBhcmFtID0gdXBkYXRlc1tpXS5nZXQoKTsKKyAgICAgICAgICAgIGlmIChwYXJhbS0+aW5kZXgoKSA9PSBDMlN0cmVhbUNzZEluZm86Om91dHB1dDo6UEFSQU1fVFlQRSkgeworICAgICAgICAgICAgICAgIGNzZCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChwYXJhbS0+aW5kZXgoKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAocGFyYW0tPmluZGV4KCkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAocGFyYW0tPmluZGV4KCkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgIEMyVmlkZW9TaXplU3RyZWFtSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKSkgeworICAgICAgICAgICAgICAgIGNvbmZpZ1BhcmFtLnB1c2hfYmFjayhwYXJhbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29tcG9uZW50LT5jb25maWcoY29uZmlnUGFyYW0sIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgIEFTU0VSVF9FUShmYWlsdXJlcy5zaXplKCksIDB1KTsKKyAgICB9CisgICAgZnJhbWVzUmVjZWl2ZWQrKzsKKyAgICBlb3MgPSAod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzICYKKyAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMDsKKyAgICBhdXRvIGZyYW1lSW5kZXhJdCA9IHN0ZDo6ZmluZChmbHVzaGVkSW5kaWNlcy5iZWdpbigpLCBmbHVzaGVkSW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgQUxPR1YoIldvcmtEb25lOiBmcmFtZUlEIHJlY2VpdmVkICVkIiwKKyAgICAgICAgICAoaW50KXdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgeworICAgICAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgd29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICBpZiAoIWZsdXNoZWRJbmRpY2VzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGZsdXNoZWRJbmRpY2VzLmVyYXNlKGZyYW1lSW5kZXhJdCk7CisgICAgICAgIH0KKyAgICAgICAgcXVldWVDb25kaXRpb24ubm90aWZ5X2FsbCgpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2NvbW1vbi9tZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2NvbW1vbi9tZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY4ODUzMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvY29tbW9uL21lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uaApAQCAtMCwwICsxLDIwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfQzJfSElETF9URVNUX0NPTU1PTl9ICisjZGVmaW5lIE1FRElBX0MyX0hJRExfVEVTVF9DT01NT05fSAorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC90eXBlcy5oPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL011dGV4ZWQuaD4KKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OnV0aWxzOworCit1c2luZyA6OmFuZHJvaWQ6Ok11dGV4ZWQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKKworI2luY2x1ZGUgPFZ0c0hhbEhpZGxUYXJnZXRUZXN0RW52QmFzZS5oPgorCisjZGVmaW5lIE1BWF9SRVRSWSAyMAorI2RlZmluZSBUSU1FX09VVCA0MDBtcworI2RlZmluZSBNQVhfSU5QVVRfQlVGRkVSUyA4CisKKy8qCisgKiBIYW5kbGUgQ2FsbGJhY2sgZnVuY3Rpb25zIG9uV29ya0RvbmUoKSwgb25UcmlwcGVkKCksCisgKiBvbkVycm9yKCksIG9uRGVhdGgoKSwgb25GcmFtZXNSZW5kZXJlZCgpCisgKi8KK3N0cnVjdCBDb2RlY0xpc3RlbmVyIDogcHVibGljIGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6TGlzdGVuZXIgeworICAgcHVibGljOgorICAgIENvZGVjTGlzdGVuZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpPiBmbiA9CisgICAgICAgICAgICBudWxscHRyKQorICAgICAgICA6IGNhbGxCYWNrKGZuKSB7fQorICAgIHZpcnR1YWwgdm9pZCBvbldvcmtEb25lKAorICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcCwKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zLAorICAgICAgICBzaXplX3QgbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzKSBvdmVycmlkZSB7CisgICAgICAgIC8qIFRPRE8gKi8KKyAgICAgICAgQUxPR0QoIm9uV29ya0RvbmUgY2FsbGVkIik7CisgICAgICAgICh2b2lkKWNvbXA7CisgICAgICAgICh2b2lkKW51bURpc2NhcmRlZElucHV0QnVmZmVyczsKKyAgICAgICAgaWYgKGNhbGxCYWNrKSBjYWxsQmFjayh3b3JrSXRlbXMpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvblRyaXBwZWQoCisgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4mIHNldHRpbmdSZXN1bHRzKQorICAgICAgICBvdmVycmlkZSB7CisgICAgICAgIC8qIFRPRE8gKi8KKyAgICAgICAgKHZvaWQpY29tcDsKKyAgICAgICAgKHZvaWQpc2V0dGluZ1Jlc3VsdHM7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRXJyb3IoCisgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wLAorICAgICAgICB1aW50MzJfdCBlcnJvckNvZGUpIG92ZXJyaWRlIHsKKyAgICAgICAgLyogVE9ETyAqLworICAgICAgICAodm9pZCljb21wOworICAgICAgICBBTE9HRCgib25FcnJvciBjYWxsZWQiKTsKKyAgICAgICAgaWYgKGVycm9yQ29kZSAhPSAwKSBBTE9HRSgiRXJyb3IgOiAldSIsIGVycm9yQ29kZSk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRGVhdGgoCisgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wKSBvdmVycmlkZSB7CisgICAgICAgIC8qIFRPRE8gKi8KKyAgICAgICAgKHZvaWQpY29tcDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25JbnB1dEJ1ZmZlckRvbmUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIGJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICAvKiBUT0RPICovCisgICAgICAgICh2b2lkKWJ1ZmZlcjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZXNSZW5kZXJlZCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UmVuZGVyZWRGcmFtZT4mIHJlbmRlcmVkRnJhbWVzKSBvdmVycmlkZSB7CisgICAgICAgIC8qIFRPRE8gKi8KKyAgICAgICAgKHZvaWQpcmVuZGVyZWRGcmFtZXM7CisgICAgfQorICAgIC8vIHN0ZDo6bXV0ZXggbVF1ZXVlTG9jazsKKyAgICAvLyBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtUXVldWVDb25kaXRpb247CisgICAgLy8gc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBtV29ya1F1ZXVlOworICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpPiBjYWxsQmFjazsKK307CisKKy8vIEEgY2xhc3MgZm9yIHRlc3QgZW52aXJvbm1lbnQgc2V0dXAKK2NsYXNzIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0RW52QmFzZSB7CisgICBwcml2YXRlOgorICAgIHR5cGVkZWYgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEVudkJhc2UgU3VwZXI7CisKKyAgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUZXN0U2VydmljZXMoKSBvdmVycmlkZSB7CisgICAgICAgIHJlZ2lzdGVyVGVzdFNlcnZpY2U8SUNvbXBvbmVudFN0b3JlPigpOworICAgIH0KKworICAgIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCgpIDogcmVzKCIvc2RjYXJkL21lZGlhLyIpIHt9CisKKyAgICB2b2lkIHNldENvbXBvbmVudChjb25zdCBjaGFyKiBfY29tcG9uZW50KSB7IGNvbXBvbmVudCA9IF9jb21wb25lbnQ7IH0KKworICAgIHZvaWQgc2V0SW5zdGFuY2UoY29uc3QgY2hhciogX2luc3RhbmNlKSB7IGluc3RhbmNlID0gX2luc3RhbmNlOyB9CisKKyAgICB2b2lkIHNldFJlcyhjb25zdCBjaGFyKiBfcmVzKSB7IHJlcyA9IF9yZXM7IH0KKworICAgIGNvbnN0IGhpZGxfc3RyaW5nIGdldEluc3RhbmNlKCkgY29uc3QgeyByZXR1cm4gaW5zdGFuY2U7IH0KKworICAgIGNvbnN0IGhpZGxfc3RyaW5nIGdldENvbXBvbmVudCgpIGNvbnN0IHsgcmV0dXJuIGNvbXBvbmVudDsgfQorCisgICAgY29uc3QgaGlkbF9zdHJpbmcgZ2V0UmVzKCkgY29uc3QgeyByZXR1cm4gcmVzOyB9CisKKyAgICBpbnQgaW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgICAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgICAgICAgICB7Imluc3RhbmNlIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdJJ30sCisgICAgICAgICAgICB7ImNvbXBvbmVudCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnQyd9LAorICAgICAgICAgICAgeyJyZXMiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwKKyAgICAgICAgICAgIHswLCAwLCAwLCAwfX07CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgICAgICBpbnQgYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJJOkM6UDoiLCBvcHRpb25zLCAmaW5kZXgpOworICAgICAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnSSc6CisgICAgICAgICAgICAgICAgICAgIHNldEluc3RhbmNlKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ0MnOgorICAgICAgICAgICAgICAgICAgICBzZXRDb21wb25lbnQob3B0YXJnKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnUCc6CisgICAgICAgICAgICAgICAgICAgIHNldFJlcyhvcHRhcmcpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICc/JzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAob3B0aW5kIDwgYXJnYykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgb3B0aW9uOiAlc1xuXG4iCisgICAgICAgICAgICAgICAgICAgICJ1c2FnZTogJXMgPGd0ZXN0IG9wdGlvbnM+IDx0ZXN0IG9wdGlvbnM+XG5cbiIKKyAgICAgICAgICAgICAgICAgICAgInRlc3Qgb3B0aW9ucyBhcmU6XG5cbiIKKyAgICAgICAgICAgICAgICAgICAgIi1JLCAtLWluc3RhbmNlOiBzb2Z0d2FyZSBmb3IgQzIgY29tcG9uZW50cywgZWxzZSBkZWZhdWx0XG4iCisgICAgICAgICAgICAgICAgICAgICItQywgLS1jb21wb25lbnQ6IEMyIGNvbXBvbmVudCB0byB0ZXN0XG4iCisgICAgICAgICAgICAgICAgICAgICItUCwgLS1yZXM6IFJlc291cmNlIGZpbGVzIGRpcmVjdG9yeSBsb2NhdGlvblxuIiwKKyAgICAgICAgICAgICAgICAgICAgYXJndltvcHRpbmQgPzogMV0sIGFyZ3ZbMF0pOworICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIGhpZGxfc3RyaW5nIGluc3RhbmNlOworICAgIGhpZGxfc3RyaW5nIGNvbXBvbmVudDsKKyAgICBoaWRsX3N0cmluZyByZXM7Cit9OworCisvKgorICogY29tbW9uIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMKKyAqLwordm9pZCB0ZXN0SW5wdXRCdWZmZXIoCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgIHN0ZDo6bXV0ZXgmIHF1ZXVlTG9jaywgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLAorICAgIHVpbnQzMl90IGZsYWdzLCBib29sIGlzTnVsbEJ1ZmZlcik7CisKK3ZvaWQgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihzdGQ6Om11dGV4JiBxdWV1ZUxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUmIHF1ZXVlQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyQ291bnQgPSBNQVhfSU5QVVRfQlVGRkVSUyk7CisKK3ZvaWQgd29ya0RvbmUoCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrLCBzdGQ6Omxpc3Q8dWludDY0X3Q+JiBmbHVzaGVkSW5kaWNlcywKKyAgICBzdGQ6Om11dGV4JiBxdWV1ZUxvY2ssIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlJiBxdWV1ZUNvbmRpdGlvbiwKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrUXVldWUsIGJvb2wmIGVvcywgYm9vbCYgY3NkLAorICAgIHVpbnQzMl90JiBmcmFtZXNSZWNlaXZlZCk7CisKKyNlbmRpZiAgLy8gTUVESUFfQzJfSElETF9URVNUX0NPTU1PTl9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2NvbXBvbmVudC9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9jb21wb25lbnQvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjkxM2I2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9jb21wb25lbnQvQW5kcm9pZC5icApAQCAtMCwwICsxLDIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlZ0c0hpZGxDMlYxXzBUYXJnZXRDb21wb25lbnRUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNNZWRpYUMyVjFfMERlZmF1bHRzIl0sCisgICAgc3JjczogWyJWdHNIaWRsQzJWMV8wVGFyZ2V0Q29tcG9uZW50VGVzdC5jcHAiXSwKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9jb21wb25lbnQvVnRzSGlkbEMyVjFfMFRhcmdldENvbXBvbmVudFRlc3QuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9jb21wb25lbnQvVnRzSGlkbEMyVjFfMFRhcmdldENvbXBvbmVudFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjODAzZDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2NvbXBvbmVudC9WdHNIaWRsQzJWMV8wVGFyZ2V0Q29tcG9uZW50VGVzdC5jcHAKQEAgLTAsMCArMSwyNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImNvZGVjMl9oaWRsX2hhbF9jb21wb25lbnRfdGVzdCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisKKyNpbmNsdWRlIDxWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UuaD4KKyNpbmNsdWRlICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgiCisKK3N0YXRpYyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQqIGdFbnYgPSBudWxscHRyOworCituYW1lc3BhY2UgeworCisvLyBnb29nbGUuY29kZWMyIENvbXBvbmVudCB0ZXN0IHNldHVwCitjbGFzcyBDb2RlYzJDb21wb25lbnRIaWRsVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZSB7CisgICBwcml2YXRlOgorICAgIHR5cGVkZWYgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgU3VwZXI7CisKKyAgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIFN1cGVyOjpTZXRVcCgpOworICAgICAgICBtRW9zID0gZmFsc2U7CisgICAgICAgIG1DbGllbnQgPSBhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKAorICAgICAgICAgICAgZ0Vudi0+Z2V0SW5zdGFuY2UoKS5jX3N0cigpKTsKKyAgICAgICAgQVNTRVJUX05FKG1DbGllbnQsIG51bGxwdHIpOworICAgICAgICBtTGlzdGVuZXIucmVzZXQobmV3IENvZGVjTGlzdGVuZXIoCisgICAgICAgICAgICBbdGhpc10oc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlV29ya0RvbmUod29ya0l0ZW1zKTsKKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgQVNTRVJUX05FKG1MaXN0ZW5lciwgbnVsbHB0cik7CisgICAgICAgIG1DbGllbnQtPmNyZWF0ZUNvbXBvbmVudChnRW52LT5nZXRDb21wb25lbnQoKS5jX3N0cigpLCBtTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUNvbXBvbmVudCk7CisgICAgICAgIEFTU0VSVF9ORShtQ29tcG9uZW50LCBudWxscHRyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfSU5QVVRfQlVGRkVSUzsgKytpKSB7CisgICAgICAgICAgICBtV29ya1F1ZXVlLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1Db21wb25lbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gSWYgeW91IGhhdmUgZW5jb3VudGVyZWQgYSBmYXRhbCBmYWlsdXJlLCBpdCBpcyBwb3NzaWJsZSB0aGF0CisgICAgICAgICAgICAvLyBmcmVlTm9kZSgpIHdpbGwgbm90IGdvIHRocm91Z2guIEluc3RlYWQgb2YgaGFuZ2luZyB0aGUgYXBwLgorICAgICAgICAgICAgLy8gbGV0IGl0IHBhc3MgdGhyb3VnaCBhbmQgcmVwb3J0IGVycm9ycworICAgICAgICAgICAgaWYgKDo6dGVzdGluZzo6VGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkpIHJldHVybjsKKyAgICAgICAgICAgIG1Db21wb25lbnQtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1Db21wb25lbnQgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIFN1cGVyOjpUZWFyRG93bigpOworICAgIH0KKyAgICAvLyBjYWxsYmFjayBmdW5jdGlvbiB0byBwcm9jZXNzIG9uV29ya0RvbmUgcmVjZWl2ZWQgYnkgTGlzdGVuZXIKKyAgICB2b2lkIGhhbmRsZVdvcmtEb25lKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgeworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogd29ya0l0ZW1zKSB7CisgICAgICAgICAgICBpZiAoIXdvcmstPndvcmtsZXRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBib29sIG1Dc2QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBtRnJhbWVzUmVjZWl2ZWQgPSAwOworICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4gbUZsdXNoZWRJbmRpY2VzOworICAgICAgICAgICAgICAgIHdvcmtEb25lKG1Db21wb25lbnQsIHdvcmssIG1GbHVzaGVkSW5kaWNlcywgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1Xb3JrUXVldWUsIG1Fb3MsIG1Dc2QsIG1GcmFtZXNSZWNlaXZlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIG1Fb3M7CisgICAgc3RkOjptdXRleCBtUXVldWVMb2NrOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1RdWV1ZUNvbmRpdGlvbjsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IG1Xb3JrUXVldWU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBtQ29tcG9uZW50OworCisgICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgICB9Cit9OworCisvLyBUZXN0IEVtcHR5IEZsdXNoCitURVNUX0YoQ29kZWMyQ29tcG9uZW50SGlkbFRlc3QsIEVtcHR5Rmx1c2gpIHsKKyAgICBBTE9HVigiRW1wdHkgRmx1c2ggVGVzdCIpOworICAgIGMyX3N0YXR1c190IGVyciA9IG1Db21wb25lbnQtPnN0YXJ0KCk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBmbHVzaGVkV29yazsKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgIGVyciA9IG1Db21wb25lbnQtPnN0b3AoKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgLy8gRW1wdHkgRmx1c2ggc2hvdWxkIG5vdCByZXR1cm4gYW55IHdvcmsKKyAgICBBU1NFUlRfRVEoZmx1c2hlZFdvcmsuc2l6ZSgpLCAwdSk7Cit9CisKKy8vIFRlc3QgUXVldWUgRW1wdHkgV29yaworVEVTVF9GKENvZGVjMkNvbXBvbmVudEhpZGxUZXN0LCBRdWV1ZUVtcHR5V29yaykgeworICAgIEFMT0dWKCJRdWV1ZSBFbXB0eSBXb3JrIFRlc3QiKTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQ29tcG9uZW50LT5zdGFydCgpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgIC8vIFF1ZXVlaW5nIGFuIGVtcHR5IFdvcmtCdW5kbGUKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtMaXN0OworICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXVlKCZ3b3JrTGlzdCk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgZXJyID0gbUNvbXBvbmVudC0+cmVzZXQoKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7Cit9CisKKy8vIFRlc3QgQ29tcG9uZW50IENvbmZpZ3VyYXRpb24KK1RFU1RfRihDb2RlYzJDb21wb25lbnRIaWRsVGVzdCwgQ29uZmlnKSB7CisgICAgQUxPR1YoIkNvbmZpZ3VyYXRpb24gVGVzdCIpOworCisgICAgQzJTdHJpbmcgbmFtZSA9IG1Db21wb25lbnQtPmdldE5hbWUoKTsKKyAgICBFWFBFQ1RfTkUobmFtZS5lbXB0eSgpLCB0cnVlKSA8PCAiSW52YWxpZCBDb21wb25lbnQgTmFtZSI7CisKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworCisgICAgLy8gUXVlcnkgc3VwcG9ydGVkIHBhcmFtcyBieSB0aGUgY29tcG9uZW50CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gcGFyYW1zOworICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKCZwYXJhbXMpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBTE9HVigiTnVtYmVyIG9mIHRvdGFsIHBhcmFtcyAtICV6dSIsIHBhcmFtcy5zaXplKCkpOworCisgICAgLy8gUXVlcnkgYW5kIGNvbmZpZyBhbGwgdGhlIHN1cHBvcnRlZCBwYXJhbXMKKyAgICBmb3IgKHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gcCA6IHBhcmFtcykgeworICAgICAgICBBTE9HRCgiUXVlcnlpbmcgaW5kZXggJWQiLCAoaW50KXAtPmluZGV4KCkpOworICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5xdWVyeSh7fSwge3AtPmluZGV4KCl9LCBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgICAgIEVYUEVDVF9ORShxdWVyaWVkLnNpemUoKSwgMHUpOworICAgICAgICBFWFBFQ1RfRVEoZXJyLCBDMl9PSyk7CisgICAgICAgIGVyciA9IG1Db21wb25lbnQtPmNvbmZpZyh7cXVlcmllZFswXS5nZXQoKX0sIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICAgICAgQVNTRVJUX0VRKGZhaWx1cmVzLnNpemUoKSwgMHUpOworICAgIH0KK30KKworLy8gVGVzdCBNdWx0aXBsZSBTdGFydCBTdG9wIFJlc2V0IFRlc3QKK1RFU1RfRihDb2RlYzJDb21wb25lbnRIaWRsVGVzdCwgTXVsdGlwbGVTdGFydFN0b3BSZXNldCkgeworICAgIEFMT0dWKCJNdWx0aXBsZSBTdGFydCBTdG9wIGFuZCBSZXNldCBUZXN0Iik7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gQzJfT0s7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE1BWF9SRVRSWTsgaSsrKSB7CisgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnN0YXJ0KCk7CisgICAgICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5zdG9wKCk7CisgICAgICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICB9CisKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5zdGFydCgpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTUFYX1JFVFJZOyBpKyspIHsKKyAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+cmVzZXQoKTsKKyAgICAgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIH0KKworICAgIGVyciA9IG1Db21wb25lbnQtPnN0YXJ0KCk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgZXJyID0gbUNvbXBvbmVudC0+c3RvcCgpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgIC8vIFNlY29uZCBzdG9wIHNob3VsZCByZXR1cm4gZXJyb3IKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5zdG9wKCk7CisgICAgQVNTRVJUX05FKGVyciwgQzJfT0spOworfQorCisvLyBUZXN0IENvbXBvbmVudCBSZWxlYXNlIEFQSQorVEVTVF9GKENvZGVjMkNvbXBvbmVudEhpZGxUZXN0LCBNdWx0aXBsZVJlbGVhc2UpIHsKKyAgICBBTE9HVigiTXVsdGlwbGUgUmVsZWFzZSBUZXN0Iik7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUNvbXBvbmVudC0+c3RhcnQoKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisKKyAgICAvLyBRdWVyeSBDb21wb25lbnQgRG9tYWluIFR5cGUKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgZXJyID0gbUNvbXBvbmVudC0+cXVlcnkoe30sIHtDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dDo6UEFSQU1fVFlQRX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywgJnF1ZXJpZWQpOworICAgIEVYUEVDVF9ORShxdWVyaWVkLnNpemUoKSwgMHUpOworCisgICAgLy8gQ29uZmlndXJlIENvbXBvbmVudCBEb21haW4KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgQzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQqIHBvcnRNZWRpYVR5cGUgPQorICAgICAgICBDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dDo6RnJvbShxdWVyaWVkWzBdLmdldCgpKTsKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5jb25maWcoe3BvcnRNZWRpYVR5cGV9LCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBU1NFUlRfRVEoZmFpbHVyZXMuc2l6ZSgpLCAwdSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE1BWF9SRVRSWTsgaSsrKSB7CisgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnJlbGVhc2UoKTsKKyAgICAgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIH0KK30KKworY2xhc3MgQ29kZWMyQ29tcG9uZW50SW5wdXRUZXN0cyA6IHB1YmxpYyBDb2RlYzJDb21wb25lbnRIaWRsVGVzdCwKKyAgICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPHN0ZDo6cGFpcjx1aW50MzJfdCwgYm9vbD4gPiB7Cit9OworCitURVNUX1AoQ29kZWMyQ29tcG9uZW50SW5wdXRUZXN0cywgSW5wdXRCdWZmZXJUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3RzIGZvciBkaWZmZXJlbnQgaW5wdXRzIik7CisKKyAgICB1aW50MzJfdCBmbGFncyA9IEdldFBhcmFtKCkuZmlyc3Q7CisgICAgYm9vbCBpc051bGxCdWZmZXIgPSBHZXRQYXJhbSgpLnNlY29uZDsKKyAgICBpZiAoaXNOdWxsQnVmZmVyKSBBTE9HRCgiVGVzdGluZyBmb3IgbnVsbCBpbnB1dCBidWZmZXIgd2l0aCBmbGFnIDogJXUiLCBmbGFncyk7CisgICAgZWxzZSBBTE9HRCgiVGVzdGluZyBmb3IgZW1wdHkgaW5wdXQgYnVmZmVyIHdpdGggZmxhZyA6ICV1IiwgZmxhZ3MpOworICAgIG1Fb3MgPSBmYWxzZTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHRlc3RJbnB1dEJ1ZmZlcigKKyAgICAgICAgbUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVdvcmtRdWV1ZSwgZmxhZ3MsIGlzTnVsbEJ1ZmZlcikpOworCisgICAgQUxPR0QoIldhaXRpbmcgZm9yIGlucHV0IGNvbnN1bXB0aW9uIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisKKyAgICBpZiAoZmxhZ3MgPT0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+cmVzZXQoKSwgQzJfT0spOworfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChOb25TdGRJbnB1dHMsIENvZGVjMkNvbXBvbmVudElucHV0VGVzdHMsIDo6dGVzdGluZzo6VmFsdWVzKAorICAgIHN0ZDo6bWFrZV9wYWlyKDAsIHRydWUpLAorICAgIHN0ZDo6bWFrZV9wYWlyKEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0sIHRydWUpLAorICAgIHN0ZDo6bWFrZV9wYWlyKDAsIGZhbHNlKSwKKyAgICBzdGQ6Om1ha2VfcGFpcihDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcsIGZhbHNlKSwKKyAgICBzdGQ6Om1ha2VfcGFpcihDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNLCBmYWxzZSkpKTsKKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCisvLyBUT0RPOiBBZGQgdGVzdCBmb3IgSW52YWxpZCB3b3JrLAorLy8gVE9ETzogQWRkIHRlc3QgZm9yIEludmFsaWQgc3RhdGVzCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGdFbnYtPmluaXQoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgTE9HKElORk8pIDw8ICJDMiBUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9tYXN0ZXIvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvbWFzdGVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2NGQ2OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvbWFzdGVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNIaWRsQzJWMV8wVGFyZ2V0TWFzdGVyVGVzdCIsCisgICAgZGVmYXVsdHM6IFsiVnRzTWVkaWFDMlYxXzBEZWZhdWx0cyJdLAorICAgIHNyY3M6IFsiVnRzSGlkbEMyVjFfMFRhcmdldE1hc3RlclRlc3QuY3BwIl0sCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvbWFzdGVyL1Z0c0hpZGxDMlYxXzBUYXJnZXRNYXN0ZXJUZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvbWFzdGVyL1Z0c0hpZGxDMlYxXzBUYXJnZXRNYXN0ZXJUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWU2NGNiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9tYXN0ZXIvVnRzSGlkbEMyVjFfMFRhcmdldE1hc3RlclRlc3QuY3BwCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJjb2RlYzJfaGlkbF9oYWxfbWFzdGVyX3Rlc3QiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKworI2luY2x1ZGUgPFZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZS5oPgorI2luY2x1ZGUgIm1lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uaCIKKworc3RhdGljIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCogZ0VudiA9IG51bGxwdHI7CisKK25hbWVzcGFjZSB7CisKKy8vIGdvb2dsZS5jb2RlYzIgTWFzdGVyIHRlc3Qgc2V0dXAKK2NsYXNzIENvZGVjMk1hc3RlckhhbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgeworICAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIFN1cGVyOworCisgICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBTdXBlcjo6U2V0VXAoKTsKKyAgICAgICAgbUNsaWVudCA9IGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkpOworICAgICAgICBBU1NFUlRfTkUobUNsaWVudCwgbnVsbHB0cik7CisgICAgfQorCisgICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworfTsKKwordm9pZCBkaXNwbGF5Q29tcG9uZW50SW5mbyhjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbXBvbmVudDo6VHJhaXRzPiYgY29tcExpc3QpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbXBMaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCBjb21wTGlzdFtpXS5uYW1lIDw8ICIgfCAiIDw8IGNvbXBMaXN0W2ldLmRvbWFpbjsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICIgfCAiIDw8IGNvbXBMaXN0W2ldLmtpbmQgPDwgIlxuIjsKKyAgICB9Cit9CisKKy8vIExpc3QgQ29tcG9uZW50cworVEVTVF9GKENvZGVjMk1hc3RlckhhbFRlc3QsIExpc3RDb21wb25lbnRzKSB7CisgICAgQUxPR1YoIkxpc3RDb21wb25lbnRzIFRlc3QiKTsKKworICAgIEMyU3RyaW5nIG5hbWUgPSBtQ2xpZW50LT5nZXROYW1lKCk7CisgICAgRVhQRUNUX05FKG5hbWUuZW1wdHkoKSwgdHJ1ZSkgPDwgIkludmFsaWQgQ29kZWMyQ2xpZW50IE5hbWUiOworCisgICAgLy8gR2V0IExpc3Qgb2YgY29tcG9uZW50cyBmcm9tIEhJREwgQ29kZWMyQ2xpZW50IGluc3RhbmNlCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4gbGlzdFRyYWl0cyA9CisgICAgICAgIG1DbGllbnQtPkxpc3RDb21wb25lbnRzKCk7CisKKyAgICBpZiAobGlzdFRyYWl0cy5zaXplKCkgPT0gMCkKKyAgICAgICAgQUxPR0UoIldhcm5pbmcsIENvbXBvbmVudEluZm8gbGlzdCBlbXB0eSIpOworICAgIGVsc2UgeworICAgICAgICAodm9pZClkaXNwbGF5Q29tcG9uZW50SW5mbzsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0VHJhaXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXI7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXBvbmVudDsKKyAgICAgICAgICAgIGxpc3RlbmVyLnJlc2V0KG5ldyBDb2RlY0xpc3RlbmVyKCkpOworICAgICAgICAgICAgQVNTRVJUX05FKGxpc3RlbmVyLCBudWxscHRyKTsKKworICAgICAgICAgICAgbUNsaWVudC0+Y3JlYXRlQ29tcG9uZW50KGxpc3RUcmFpdHNbaV0ubmFtZS5jX3N0cigpLCBsaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcG9uZW50KTsKKyAgICAgICAgICAgIEFTU0VSVF9ORShjb21wb25lbnQsIG51bGxwdHIpIDw8ICJDcmVhdGUgY29tcG9uZW50IGZhaWxlZCBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgbGlzdFRyYWl0c1tpXS5uYW1lLmNfc3RyKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgZ0VudiA9IG5ldyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBnRW52LT5pbml0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIExPRyhJTkZPKSA8PCAiQzIgVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl8zNTJ4Mjg4XzQyMHBfMzBmcHNfMzJmcmFtZXMueXV2IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiXzM1MngyODhfNDIwcF8zMGZwc18zMmZyYW1lcy55dXYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhM2U0YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl8zNTJ4Mjg4XzQyMHBfMzBmcHNfMzJmcmFtZXMueXV2CkBAIC0wLDAgKzEgQEAKK8rKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS0tPT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PD87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0REQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc8Oz46PTo6Ojg4Ojs7ODg6Ojs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PjtEPD06PDw5ODo5Ojo5Ozw6Ojs5Pjw+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE9MzY2Ojs8OEM8QUE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1svLy8zLy8vLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88Ozk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkeo2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbLy8zMy8vLy8vLy8vLy8vLysrLy8vLzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra2tvb29nZ2dnZ2dnZ2tra2tra2NbX19fX19fX2NfY19fX2tva2tra2tra29zb29vc3Nzc3Nzc3N3c29vb29rU09PT09PT09PT09TU1tXV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGRJSUxOQDk5OjM7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU1Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2NkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI2Li4uLi4uLi4uKioqLh4GCgoKCgoKCgYGBgX+R09PT09PT09LS0tLT09Pb4uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlJiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe6+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxYUlNTU1NTU1NTU1NTVE1DREREREREQ0NDREM/XdHT09PT09PS0tLS0tLS3+rr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3O0BDPjY6Nz4/Oz1CQDk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNDS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKaeXFZXV1dXV1dXV1dXV1hRSUlJSUlJSUlISEhIRGDQ09LS0tLS0tLS0tLS0d/q6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8PDw7Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3P0dHS0tLS0tLR0tHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFhYmJiYmJiXoysqampqampqampqamqo2dhYmJiYmJiYmJiYmJiXFRUVFRUVFRUVFRUVVFr0NLS0tLS0tLS0tLS0tHf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ojo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzc7Ozs7Ozs7Ozs3MzMzOz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Ozs3LzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXFxsbGy8zLzMvMzMzMzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMy8vLy8rKysrKysrKy8vKysvLzdXV1dbW1tbW1tbW1tbV19jY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ozg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7S08/Pz9LUz8/S1NXUz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NDR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbV1tbW1tbW19fX19fX19fW1tbW1tbW19fX19fX19fX19fY2NfW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmszPzs7Ozs7Sq5zP0NO5n9HQnIKEisjPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1tXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExCQD09PD06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Stpylo9Wyl5i1tpO4ua+i0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pzp2ckZ3DnaKmq9KRfX6vsNHOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pjw8OTY/Qj9COTY0ODo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmKrUz8/P0b+YoJuyrciGma3V0s2ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT4/Pjo4RUA/Qjs3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZiq1M/Pz9O0mZaquKTbo5it1dPAoKDQz8/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PTw5NjQ6OTg6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/KoKO/ypyljKet2KqZqtTPz8/Uq5p+o4+g2KGYrdXVsKKp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+OTw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ1Kybp4uWodmhmK3V1KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW19fX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PTo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NO2srKlmanaoZiu1s2en8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxKKZlpu02qOYr9jCn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tPT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKugx9Wiq6SazNihma3asqSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLS0A+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTyJGNtNXUsYTD1rmDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWlqW0xfTUpMSlVMRkI8PD9GRUdLSD02Njc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTIwdXR0tHD1dLRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QURMTEA+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR09TS0tLS1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9PTc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRDSTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSUQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNBTEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUUE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f39/g4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxEREREPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29va2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg4OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FRERFPjw8ODo4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QTw7PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTk6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29va2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBRD8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtxdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dXx2fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NjU0Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW2tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NDczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozs+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm4uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU0Njg4Njg2Ozo5PD09Ozo4NjY4ODo3Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6vs7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRj44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjY4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5urm5uLe3trW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfnJ2hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjY0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztbW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLW0tra3t7a1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e3t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZmamZeXl5eXlpmbmJmZmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkJAP0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rrK+wsa+vsLK1tba3tbW2tbW1tbW2tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqainqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2uq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iZmpucnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQUE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2sq6qnpaWlpaWmqKioqKilp6iop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ2NTczODo6Ojo6PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs7QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpaampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKWnp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKampaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGgn5+enpycnJydnZ2cnZ6foKKhoqOjo6GioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWlqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZiXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QD9CQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3NTc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnJyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alpKWkpaWmqKinqKelpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaOjo6Oio6Wmpqanp6emn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqampKOhoKCfn6Ghn6CgnZqYmJmbnKGko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg5Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz5BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpqaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6enpaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKKioqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOkpqalpaanpqainZyfoZ+XkZGQlJeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fn5+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzk5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWmpqWlo6CgoaGgmZKQj5abmZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnZ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpOSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1OTk4OTw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5uanJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpKSmpqWkpKOioaGenJuVkpSYnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ycnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKjo6SkpKSioaGem5qZl6G1npmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODY2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqZl5iZnJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoKCipKGioqGhoJ6cm5ubmZ+rm5yam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ojc1Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52doKGio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgpbOsoKCfn56cmZmampuuanadnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpybmpuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+dnZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgn6aSm6ufoKCem5qZmpmohER/n56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qbmpuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KTk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6gnmKcpp6enJqam5yho1FHg6CdnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cmpubm5uamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg6Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52bmqZmXaOgm5qZm52crnVJTIagnJydnJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD45Ojo7Pjs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZikgFJ4opmZmp2boKRfVk6HoZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucm5ubnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoKGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRcXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz1DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmJiZoIhbX5SamZucnKOPZFpMgaKenp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1tMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmZ+XXV12l5qcnZ2igWRZTX6inp6enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5qcnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZmmBhYICWnZyemHRjVU6Aop+fn56dnqGgnp2enZ6dnZ+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmZ9pXltlf5ycnoxqX1BShp6bnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPj4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampeTc2hhVHaTl5yHXFZQV4qSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGOkpqekn2go5aknG5MT2OGhoKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7Pzw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8/QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAhKCdjn9slqWVn4CJf19yf4CCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9OTk5NzQ4NjkzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPj9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+f4Cii3xuUnWcjIxacX18fn18ho6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg5ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2YmndYT0xwlIaCTGBvcXeIhYqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GNo41VLzA9d4d3dkFEXmtthJCJiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuippxnQVpIO3d5a2dFLzhbbHOQj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqa+PS2+heEF7d2NiUFBaR2BuiqGhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0tLS5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6ijeGC/1qZDe4yAdU9tjnVSZH+jqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKenmZ2kpaOinWJ/vcCvd56jmpRlTGF4bVF0laKioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XUF5lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPD48OTk8QUJFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqGip6GmrqamnZ5qhJy6j6bQoZmxqFhMrJNTZY+gnqCgnp2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKvq6Kihnd+fXLOybGbp69rVaqwYlqHpp+loqGdn6KYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT48Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e3tLW2s62urY+Gg26PzbmVkKKXdFRvenNue5Wmqqejn56jm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6OhpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNgHdydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BCPkM9Ozk+OUBAQD9CQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyt7u7u7m5wbi0taCIeWRZn7fApqidiHdrcW94eHp9ho6SmJyipaarpaSYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoainpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoF2eHl4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs+Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1t8HGzM/OzMm+s6SQc2ZSRIuXiYmIfnhxbmdmbGlrcXJxcXJ0fIypxMS7oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloaSnp6GfnZ6Wk5ygl5mSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWFmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxcfb4+Pay7yvpJeIdFlaUUNpemxvdW5rZWVZV15YXGNpaWhlYGiJtMDAuamvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ6dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d29tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ojw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1XoyMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca+zdHVyrmnnZSGcl5RVEtEW2ZeZGtlYWBoWVRYUlZYWVxYWnSZtrurtLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnZycnZyZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5M1uTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8LBx8vIt5R1ZVVQT1RIPl5rXl9lYmBdZGFTVlZVU1RXcpursKqoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMzNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCPDg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDubjDm2FJREdLRD1bZWJhaGNgW2NfV1FOT09Vf7S6rK6lpKKnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn52Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJeXnJufnqOcnpaYl5OWnJmZnJSWnZSWk4l2eXp7d25raWh2WmdzeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojs7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExMTCxMGtg09GTUU7TVtfZWtlX1tgWVhSTVR/oqq5tbOrqaOhraqsp62frLS0v8O+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOMlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnZlZmlqaF5rcG55eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjMysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwsaWalhHPz9HXmNiamBaWFdTVXaZtr67vLq8rK2mqbu6ube/s7W4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrLGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FodmlqanVueWxeZFtWYFlMSEQ2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvBw8TGycXM0M3HzMnCwsfCy8vIx8zJzsXGxr2pclBLMFhTVWZhU05PcKnIyMLExsC8vrSxsLDBvr7BxsC+t7bDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra+1paWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjouUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnZ6WnKOgoaKko6SinpqZm5ubnZ6cg31yfXhwZ2BrandtaWZ2b3RjXWNVV1VUTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg6PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwsG8kT9Odn6JVkxvpMvUxba/v8C/urq9tbOzwL+5v8K5wbe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnJ+eo6CmmXl6eYBzcGZlZ2RrZWJrbm9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8PDxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28xad3aoOQmG+pyMjH0cGvvb24ubu7vri1sbq/tLy+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbCnpqWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2joJqeoKSio5yioaOgnpyenqmlqJV9eoN4bmZhZWJhY2RkamNnZFtaWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs7QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj06OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwLq/wLy7xb26wMS/vb6vc2V9kYuJ0cW/v8m/sMG/ure7vrm2uLS4vLW9uLW0r7O8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWNjaGtnZ2pmal5WVlRZT1RMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HWjbe/u8O1use2tbi6vLi5tqqjmI5/g8m/v7vBvrnGvcK/vMW4t7e1uLa2vLu5trS4urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZ29qZWxoWVlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxHenzL3Ht7m3rba0t7mztbG8ycOVS3rKvr++vby/yMPFxb7HuLWzs764ubi+u7q5vLu6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnFncWt0ZmNuYFxVSEtKREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJO9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1q90f7rIz8LAuK60tLu9t7mxvcPKj0N0zcPCv769vMfMx8fEx7y2tbfBvbu8wMO7v8K/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZmxqb3VveGRoY1xjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLGydKacXKr0tHMysS1ur/EyL6+tL/AwHlSbcvGwr7BvL/DzMrHxcbBub69xL/Av8LIvcfGxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdHBtbXRsbW9gY19iYk5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvE0MO6vrzEvre8wL/Jz8fIysrCh3Jzo8vMy83KxsLDy87BvLi9urFwY2K7yMTAwL/EwMrJw8PDw7nDvr65wL3DxsLKzsfGvbrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2moZ+bgnt6iHttbXh8YHFkXF9gYFRJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vaw762vsC+vrqmnKmytsO/pXp2eJrEx8vIwcPAwMnKwb+7ubGhfXNqrcjFxL/Awb/Lx8PAyMC7wru5tLu7w8PBzdDKxL21vLu5v7m6tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6dsLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN5dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PD86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLltrM69trnAvKt+bmhubHKBlZhzd3yXvb/GwLnAvL7FxL29uLGwmZB+gJvKwsO8vb+/w8O+v8i9vsC4yL6roaGhprnBycW4sri4t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3FvalxgYVpUUUFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM20doCzvba1wqWHaVpdYE1SW1puc3eAn7i4wrqzu7e7vb+6u7uupJuZiJF+wMTDvry/u7u4tsHCtsC7yKy8rbq4n5ORm6O3tLC0tLW8ub65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vLSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2d3hucmFfZ11bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJqIR4iaCvtZ5rZWZWWF9JSU1QU2x3haWwt765srWyu7m8trm+tJWcp5ahcK7JxMC9v7mzrrK9u667u5SPztzm4tG4mpKGf52tr66zure6vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cm1gZGJcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xauIfHaMoJlgVENXVkhha1ZPRklgjaCrr7a6tbSyrLy5uLW4wb2LmbKjpnKly8K/ubq1rqWss7Cms7ma6OPb1dfVz7qJdWpsmKynr7azsrq1u7u7tbi2sLXEsr68vry5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c29kXmhZXV5TT05CP0pDQUtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+1kYJ4iI9vTko/Y1pBTneAlGtNQVyBsLWztbK0r6y7uri2ub/GdoSqn5tlp7+4tbKxra2fpKennauivcurqLXKz8/LmXRrbHKgpKqtrqewrK+xsa2xrq6vubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnRtdmpsXVxrVV5cUE5IREdNQkdORzg2NjU6NTo9ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR7WEZBToZaSkpYdo2AY0BSormztLKwsa2wubi2u7e6vZCisqykc6uwqautq6OooJ2enZiarrNaOEt5qsXKxqKAhZKIiJ6jqaigpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGsqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlpdXRvZVViZFhdUk9NSUBJU0ROQz04ODc1Ojc8PTo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsbuqmZmVaU5AUnhxUElJS2ebgVlFUa27sayzr66srba2srS1rqmmn5qbnZ+mqJ6gqKmfoaeWm5aXjKx9MlJoVnSvtbGejJqiopuWnaOin56koKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqmkqaumqayrpqGIeYN8dn96Y3htblxRaVVQT0dQTU1DUFJAPzs+NDo6NTs6PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqWmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi8wqukvmlFUpyCUVdJSV9LU45hZGKArrWqsrSuqquvsLKzraWdkZeTj5ign6KgnKOkn52ok5mUlYugY16Gh3RajKOZm5idoaSnpp2en6CcoZ+jqKecp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyWk4+PkpGZkJaVmJefmJuam6SZl5SVmp2gnaeopaCjoqGjn5ygqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfn2AdXZ9bmx7ZGhWU2ROSkhHT1NOS05IPEVAPTJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra2urm6t7e7rqigoamhqsa/yqFQQXKeeE9uS0tiZXVzYFtecI+xr66ztaqmrKyjm5mUjZGVl5iYnJ+iopydpJ6apJaWlpSPiG6Hur+jY2eTh5SRjp6joqainZ+mnp2fo6aonqOmn6qdqq2qrqeosKWjpKanrKahpaKbmZ6vqK6yq6arqqCbmJiYlZOWmpOVlpqWm5eYmKGenJyXm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehn6CloqagiXyAfnd5fWV5eWFiU1ZhSUlLTFNVSlNRTTk+QTY3PTY1Ozo8PDk7Ozg6PD07Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODU1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnaPHx49XU0lko11lfm9yXVBrY1tkX11rj7SwsLispqGcnZqUmJqZkI6RlZGMjo2TmaKcl6KYmZaWmYh6pMfW1Z9PbH+JgIOUmpibq6OhsKOao6amqqKhqqKppKiyq7Gyq7mopqunq6uorKynoaCjsa6ysbSqsq+jmZydnqGYm5uamJmblZablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKKno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNogm1lXFNbWk1SS09PVk1UTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeq6SNelVpcnV1cWJ2dlhXY2BjZ1lYV2Wsrqyvp5+eoqGXkZScoJyZmJKTn5yho5qempaemZ2WmpePd5/K2rKyZ0Zmenh/g4F7irWvprOsoa2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO1uLO4rbK0pKCdpaCsoaGioaCamZaWoJybmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBg398eHZqd3VebVtSYUlSVkhGVldLQ01IPUtJOEU8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqaiuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boqGgpIBugnBgY1hMW1NaTUxQWFJITU1Hl6yqqaWgn5qRkpSYmJaWlYyIi46VnZydnJ6WnZilnaCak3CGvbJTinV5cWVpamVeUGusuqy0tLC3sK60qaakpaypubO1u8O8w8G3u7arrrG4t7yvs7C1wby3vrOztaKsoqmpsqmrqKeompmemqqnoJmooJ+fqKilpZ+dqqKinpufqKCkp62ZoKOenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhoV+dnJtaXdtaG5dWFtDV05KR05HQ0dOPT5MPjU8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamplJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn52KYldeZWBXTVFHPj4/Q0M/PkJReKitqaqmoJ6foaOen56bnZyUk5WVnp6YlIWdmZ+ZqaKsoJKCe4iDeoGQpYdzWktfWklAp8G1ubvAw7m9u6yup7GtscK2uMLGwMjKwMq/sLm5vbjCvri0u8bEvcO8uLSqs62qs7Svs66qr6OerKi3sq2jsKaho7CxrrCkpa6joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2t1cnFoV1xRRlVIREpQST9GQjRGSDk2PD43Ozw+PDw6Ojg5PDg5Ozg7Ojk7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PDs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+VfWBeZWBRR0Q9Qz9FPD85Nk5/qrOnpKSioJ6lrKafmJ2VkpqemZWMioaIhnhshp+ioamptJF5jIeHlqOkpohibmuRroBMRLfEv8TIzdDIy8Oyt7W+sr7Fu77MzcbMzMzSx76/wMK9x8fCuMTKycTBx7+6tLq7tLu3sLayq7uyrru3wLu6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOVlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZlpcRkxNRURUTUVCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oj8/PUI+Pzc6QUA9PD04NjY8OjxAP0FBQT6Sq6Cnrqeiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXNqYVdORT5JWXxwYkI9XI6urKGZm5yenpmXl5iTjY+Xl5SPjZCMgoOCdnJwbG+NpKutsqdzdnlubGyChHuFWVZ5jMCnYW7MxMTL0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbGxsrIz7/J0c3HxsnGwr3Ewb6+v7W+s62/wMPEyMXIxK+/ubK4vcTCwbu8vLWup6euqKCiqaSalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl1c2ViZ3JvZ19aWkRPTUNGUUlEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojs+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpudlmtmXVRJREA/S4WepZqEoLKto56cn5qYl5STlJeRkJCNiISEiYeDgIGBgHlxcW5qdqG3tZmXb2VmXE1Wg4BwkHpob1+0p2yf08/EzdTV2NHXzcbHyczDxcrPytLX0tfS1dbT1MjMx8zNytPNztPNxsnKy8LHzMfJyca/w7OzyMXLy8zPx8q/vr+9wcfFzMzJycDDwK6ws6ieoaqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d3amVXWFJETkdASVFDPkI9OjIyQTxFPDc4PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZ1jU0xKREM/QlKt0b2yr6acnJygpKGdm5SUlZSKfXlxbGViaHJwcnuFioB1cG1wcm2DrJiLmmlXY1hfZHCAbX6Pck9zm5mAxtDRws/T1tjV1dLLyc7Qy8bN0snS1dfZ1tjT1tjN0srO0czP0c3T0MDJyMvEzM3Mz9DGx8i2wMvA0s3M0MfKycDEw8jPzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2Flc2NdUlxKS0dBRklKPztBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaWloKKjW0lAQURBRlB1sa+mmpSXn5yaoKCem52alYl3aWRhX2BgX15fX11hbHVzcG9ua3BucoaNi45iT1xUXGBRZl5YZVpNand5h9XR0MvQzdPX1tPV0M/S09HJ09HH0NfX2NLY0tfZ1NbMz8/JzdLMz9HAx8TJx8/O0tHRyMzNwMvNxtTPzc/IxcvHx8nMy9TU0dXP0szTwrnFsaWota6om6irpZ2yqLCzrKyTj5OOiIqOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlFgSkpDRkNTTj88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCPDo8NzQ6Pjw/QD1GQUQ9gqScoKWepaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqeqqKGjrGdDOD0+RFiCqqifl5WXmZqcn52Ym52TfXFlY2JfX2FfXmFgXmFgX2BlbXBwbWptb3N0f3txa2VUR0lRUEdFPUpQXF91W3PV1NDJzszS1tLR1s3P1dXRxdHTytDU1dbO09HY19fXzMjOxMrPzcrNwMrBycrOz9DM0M7OzM/QyMzR0cvOy8PKyMrNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zv7uxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0lGRkVNWUU7QD0zMzw8ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg/OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoKCjp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLJ8SEZCO1aNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGBeX19dXGJtcm5tcXFycXdpT36NalFYS1dPS2BAS1tSbWJ20dLOxs3MzdTLztLMytbW0MzQ08vM0NLTys7R1dLV1srAysLGzcPJysPNxMbJy8vPy87N0c7UzMfJ0M3Jx8vGx8LGyszO0dHH0M/NzszQxcfBuLm9xMK9w7mysr6wu8PDtaqYpaGYlpGVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR01JUVFCO0Q/OzY4Ojg6OzU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvb3aPmo2Ml5WQk5GRlZaVkIt7ZWJiYmBdXmFjYmBfX2BhYWBfXVtdZ3Fxb3BxbWlucGZ9i3pmZ1tKVl1jPEFWS2Fpd87NxsTGzcrRx8rNzcXQ0s/NzNTKx8rOz8fGztLL0M/FusS/xsq9w8fJzsXDyMDHzsjEzcvN0MnFxdDJxsLGycW/wcjNzMzPw8rMycfM0MXFyLvHw8nJws/Avby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSUhHSU1VRz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChqGpk42Nlo+Fg4ODgX2EhH9zX1teXV5gXmBjZGNfXVxeX2BgX1taXGFrcnBtbWhnaWp2g5GSfWhoVFdmUEJFXFZXXXnKxL/Cv8LHycjIyce/xMvFx8rMycTBysnBwcvPxMvIv7nBvMbIvsDGz8vEwMO7ysfIu8nGxcrBvsLLxsXEvsa+vcHExszGxby/ysPFx9LFwcnAysrHyMbQw8PGw67Ey8fDyre/vLqzqaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQ0dETERGU0A1NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai+uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtm1eenudkYqSloZ6gISFf3V4dXJwX1pbXGBgYmNkZGVkYFtcXl1eXV9bWVpcYW5xbWlmZ2tobH+SnY5zZVpbU0FCRU9SU1aRwre4u7m3wMHBw729uLy+uMPJxMbBvMa/t7rDyL/Bybu2u7vFw7+8ws7Dxr6+tcG+xLu9x7zDurW9xsTCw7fAtra/v7zNxL22usi7v77MxMLGw8bJx8nG0MbCzMeyx8nDzszAxcK/vLK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUZCRkpBOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstau3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbW1NXXzcrPxcnFx8G6xb2srqdgY3eAkouIi4R4f4aGf32De3R0Y1xcXV5fYGJjYmJkZWJdXFtcXlxeXVpbXF1ncm9rZGNpaWtyiaKSf2ZZUVFTTkA7R0xwoLOusrKysrK6tLuwtq+zrrG6wbvAxLu/urSxur7AuMe4tLy2wcK9uL3GwcO7ta+ztbu/tMW4u7Wsub2+wL2xurawt7qzxr23r7y/tbe1xb2+w8bAxMbGx8zFv8XGu8fLv8/Jx8PFwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKR0JEQUVGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CaW2dviI6FiIl6eH6FhnZ3gXxzaF1dXV1eYF9gZGFeY2VjX15cW15cXV5aW1tdX2tvbGZjZmhnanWRj4NtX1NYZF1PRERdlZijpq2qqKqnsqy0r7Gnraarsrq5tcK5ubmvqrS5urPBua/Asb28u7W7x7nDtq2qqLCywLa4vbCxqLKztbu8q662p662rryysKq4sK67rru4u8DAvrrDv8bDxcC8xsHHyrjFx8W/x8PCucTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTExNSkVBQz9GQTs6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXN0svDxcHEz8bNwcPGv8TEw8PKwsnKv8C8wrqztbXDr6qxk1tpfpKIjo97eH2JhXl7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpaWlxjbW1mZGRkZmdqeId+b2hcY2xpcXOElJePkp2kqqGmoamoq6mvoqWeqay0tbC8uK+2rqett7Ozu7ezvK+4ubWyu8Gywa+lqaOrsbOzqL2qq6irrK61tKaorqGksKmzpqeorqaot6yxs7e6uruyvL6+vsS/tcHAx8i3vr/Ft8TDv7u/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpTU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvBy767yba9w766yrjBw8K1try2sa+1vK6oq5NjbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tYV1lcX2VqZGJjYWRkaG16d3FxaHR/f2hrk5qQjYaYm6SgoJ6jo6WlrJ6bmqOlq7Cvtramr6umqbOrs7mwtbWttrmysLq6sbaloKSgprGorKm5qqWnp6ins62gp6afnKSlrJ+fp6ShobGtrayytbOzsLW8trvBwLK6vsPBsbm5wrPAvcC1uLu9vrzCx8TDxL+/xKCEeHFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5Ozo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG6vbagnpWdoKa6tquzs7uzxM/Jy8LFuLfHwMy/uMq3u8W4s8W4s7/ArLa8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGFgXlxbXFxYWVhYWFZYWl1eY2JgY2NjYmVmaXZ4dG98g3xSZ42VioqAlJmcopmcnaGjoaWcmaGanamurLC0oqioqaurpLS4rLavrLK0rrO1r7Cqn56fpKKypKaquK2ipqagqK2qmZ+fnpmdn6WamaOcnJ6wqayoqqusrbCyuK+4ubqwtry7uquzsrmzvbS3srG1tL+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU2MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnIuLi/t7LCtLG7u6y6urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhXV1dXV1hXWl1hYmNjYmJjZGRtenJud35nPWWMkoaKgpGZmqKbl5qhpKCimp2fmZesrKytsKCkoayqpqG0r7CxrKivsqe6s6a1oKKfnKOiraOiqraqoqOmnqamo5aYnZeZmp2gmpednJ2craGsqKOkpq2rsrOqtbCyq7K5ta+qr7Kys7ezr6mtrrG3sbq2ur2/t7OxlIZ6dmZfZl9bWVZTWlVLW1FMSkVIS0lDPT9CQkBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/sp2lo5ilscO1tr2ttLjCzMjGv8W2wcDHzrfAw72zubmywLaxubutsrWvn5qkqqCUm5B4f4OEf3hvcXRxaGVkaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1VXYGJjYWFiYGBkZnJwa3J7UDlbfY2GjIWMmJaamZKcnaahnJ2lm5qYqaStrqmaoaG2qKCfrai1qaanrbCkt7Cjt6CjnJmZqqahmq25r6OhpJyioJ+TlaGUlpacmZiWl5yVn6meqqSinaOqqrCtqLSsqqatsrClq62zsa+wr6+nqKeyrbG0sLu0ureuo5SCendlX2FXWVhTUlRLTV5MUExHSE1MRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLrCsb63va2dp6eiqrvAvcC5rrS4wczIxcLDvcW4yMyywcLBrry7tbu8tbm5sLCxqpyaoaqVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbW1lbW1pYVldXVldYV1dWVVpiYmBgYV9fYGJncGlubjkuMEyAiY2HipOYlpqRm5qjoqCkpJ2bnaSdqa2knqChtaagoKKnsqGlp6WvpbGtq7WeoJ2VlamhopStsbGfoqOenpmbk4ugk5GTmJiSl5iYl56nm6ehopqkpaWrpKWwp6Wiq6ytpqmur6+rqKqqs6amq6+0sa68trGwr5+Se3hzZWJcW11YTkxRSFJhTVZQT0pOT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk7Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G2vbC8sbesnqWmrLi7vMHFurK5tcTJycDCxsXHtsbEs8G/xau3t722vbq7tbKsraiZmaCkjIp0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlZSVFJUX19dXl9cXV1gYWhra2EuHytMdYSKhYiOmpOakZeboZ6poqGhoaKgmqeoopicorCpoKCcpKmdp6KerKyqqa2toqGhlZiimpyPq6iwnJ+in56XmZOKnZGNkpOVkJiYk5yho5ykoaKVoKKkpZujq6WipKqkq62lrbKppqWmprWmqaits7W0ubqvq6yejHNxcGFbV1ZWUkdRT0haXE9SSlRLU0xFR0pDODs7PTw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuxrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvbG+w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUFhcWltcXFxdXF9iaWpiPSs9TG6Ah4OHiJKTm5WVmqSkpqSopKekoJajq6KTl6Otp5+bmJqfnq6ZnKqzn6Wmn6OjoZSUm5aWkqmprZqcn6Ggm5SQjJmNi5GNko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuvo624paOkoqytqqirr7S3sr21s6uumIV1dGlcWVlTVVJGWExRW1hNVU9QTFFSSU9JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozo6PTY4Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+szMbFuMDOz8ezxLu3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBQWFlZWVxbWltdXmNuc1NEUFtgfIJ9iYaOkJmYlJmmpKKqqKWtoaWWnKmdk5Oip6Wcl4+OmZ2tlpinqpifnZSloJ6SkZKRk5WoqqWamJmenpeOjIuThYiNg4+LkZWRoJ6hpJmWn5WaoaKelJulpaioqKCwsKaxvaefo6y0qq6nr7SwubXAsa6wq5F/c3RiV1RVTlJKR1ZQUlJMTFhOS0xPU0dOS0FDRkRDPkI3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsba4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucWpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUU1OTVJXWFlYWFdaW1tgamlmbl9uXGp/eIh/ioqQk5GXo5aapaOiqJuklZ2imZCMnaGZlpaFhJGao4+Vo5yVlpWHopqbk4yOipCapaeblZWXnJGTiJSOi4GLjYCQi5KSkqGaoKKWlJmYlaKmmo2Zpaeop6GgtLKos7ihnaO2rKqtpLKyprW8tKussaKKenRuXk5RUU1PRE5OTlBLRk5OSkpOTlFITUpBSExJSEQ/OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODU4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrCkp6SqpaCppqSzqqKyxLW1srPGxbe6w8rMxrOsur20uMCvramwnqauu6+toJqbnpWViHyEbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJSU1BRVFFTVVFOTUtLU1dXVldXV1daXGFlWV9cbF9eeG+DeoSAi4mLlpuKlZefnqCWo5OemZOKhJeZi3OMgn2NlpWFkpmQk46Ne5mPnIyCiYCKmKCjnpCTmJaFjoKUfn5zio56kIeTkJCdm5qakpaQno6io46JmqCho6SborSvrK+tn5imuKalsKGxrpyxu6qpr6mZhHh0ZFZNUlBQTUNTTkxQTUJQUUhJTlNOSUpKRUtNR0tLPjg0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6alpqamsqemtMG4r7SwycS4ucDOxr6zrbvBrK3EraehppKdpreto6CRlpeSkH54f2ZXVl9nZmlnaG5jaWlmYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTk9OT09QU1RRTU1KR05TU1NUVFNVWFpcaFhaV2ltZWRFT2mIeY1+hZWQho6Mm5WalJWUkYyUiH6SiF47Vm57ipOJgIyRjI+GhnKLhJaBeYF7hpSdlYOWjpCPg4Z9k3hxb4aNfomBkI6QmJqZk4uQip2In5iIiJaemqGgl6euqa2pqZ6WrbOipa2ZrauYqLSjqa2ik390bmBbTlNSV0xEVEpQTExGTk9JRUxRTUtQSklOUEdKSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKKtoaamqqCnqaejqrCop7TCubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qZh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSEZITlFRTE9SVFVXWWBgVFJibmNFODd5jYmHdYCNhoCFiJaJlJWJkYWDkoR3h35fSVBtd4qRg32EjIqEf39tfn+Td3V2eISNmnBRjYiKhnx+eZR2Z3eGiH6KiJWLjpGTl4yEiomVhJuNgoSSm5aenZSko6ippaWem7CqoaSkkaaqlqKqnKGmp4p3bmZeXEhRUVNNSVVNU0lMS09JSEZKTkxNVUtRUlBHSkQ9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6evrKq1vLa4t7PBu7anuci4tqiotbaqsrynnpWOf4qUqZaVi3+OhIN+eHFvWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZTlFTU1VaZlxUYGdXWFBKiHyMgGx3f3t3f4eOfo+Zi454g41+c353cW10cHSNjYB6fomqhHp7aHZ7jnBybXiBi42SeHuAe4B3c3KSeGh1hYSEhXyVi4iKjYuAf4SLjYCUhHyAj5iUnJaRn52pnqChnaCppZ+dmI2npJKgoJaenqSCc2liXV1KV1BSSEtYUk9KTUxSSkpKTFBITFFMUlVORklCPTc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnJ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX93hnh8dnBvallLSElIR0VISFBUVFRXV1NVVVVVVldYV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxOUVFTVl5iXlxhVWV+jZKJinNgcnlwc3mDi3iAmJJ+boSNenR5bmp9rXx0kIp+eoaSgHx/dGZ1fIZsb2hzfIqNiIBtenF9cW12j3FocYF+jnBEi4WCg4V/d3h6jIZ9jHt1fY6Sj5iLkpubo5aZnZudnqGclo2LpZuOnZeOlpiQeW9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlFPSU9QTEZEPTs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLS4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6epsK+xq7u4q7q+uLOsp5uwp6ybj5acpamkoZiajoSSeomPi4t2cXxtdXFqbWpYS0ZHRUFAQ0RITExNUVFPUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpZSk5PUVRYXFxbV1Z3l5u7emtvW3NwaHZzgot1eIiDbGmJj3Zyd2hofoFxlpGKgH2Vf0mSmW5nd36CbWpkbHmFkJKGa3NsfG5yfIZpbXB/c42JhYZ7fX57d3B1dIaCeYF5cHyOi4qTg5aWmJqQk5aWmZadloyDiZ+Si5KNhpCWgG9qb29vWVZYVFJSWU9SVVRTWFVNT0hNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJqfpKyvoq2qqLWvrqyzv6u8wr+mopqVpJiejYSLlKGimJmRk4tzjnqAhoyGdW90bHFtZWtrWU5ERkNAPD4+QkZGR0tLS0xPUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0pNTk9SVlpRVlJQmHpXkF9ob112aWd5dIWEcX2DgXFqlo9ycXpoaJyOTHmEkYiEjWYxdodya319g3RmZXV+hISFgGZpbHVrcIB8aHFxfG6TjY97dH19cXFvdm2Df3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtOUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaOlZmLjoV6hJCYlY2RjJCHcYeCdIeMhnpwc3FvcGRwZ19URklDPzw7OTo/QEFEQ0VHSUtPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVLQUhQRl2lqZdmcW5kdWZrfHt/fHZ/goJ2b5yRcXd+cXOShjVxnKecjaChhKKFdnCGe4Z8c4ytjYmBaGdiam5ybXCDdWlvWHVwjpuRdm1/e31ucm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jnx0cnFtYFxdXlxaWWFfUk5bWlhXTEhJRklIP0NBQkg/Q0Q9Ozo3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUwMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KRgZKHlZGdpKeer5WltKmtsa7BsrvBxZaPjJSPgIh8boGQkomDioePhXWDg2yViIh8dXh4bXhud2RqXklQRz4/NzQ0ODs6Oz0+QEJFSEtMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTVBMN0NNUFFCRntpdHJybXZmcIGBdnh/fnuIenOelnd8hH+DmIOanGCFqZ6ci4OQjnp2h36JiI5zipePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1Z2hgW1xeU1xnXldQVFhbVUdKSkVMRz9GQEREP0FBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjU0MjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydnqaRoKugsaivwLK7xbqWjpGTh3qGdmt/i5GDfYqDjox4g4BzoISKfX2Bf3CBfnpod2tSWExARTIxMTI3NjY4ODo8PkFFRkZHSUtNT1FSU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJS01OUUtKU1pWTkZfd31xf3F0anWIhXV3hIJ6kYN0nZaGhIyQk6SMrKlIhqyvroqBgJSKgYqBhJGph4GYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGR22Ad3J5dmhta192fYKIf4eEi3mUnJuJioiRf3p1inZ8eG1vd36BdXVzbVxeXlxjZFhnZlxVUFBXWVBETEtGT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc3ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhIeRjpWXkpagnaygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4l+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz84NC5dlnBzo1VGSUtMTU9XX1ZpV1haYX+He4p4fHl9iox5gISMfJWSf52elZKZmaSskpm7saa6x8Oni4yhpY6TiYGRfHGDnp+RnX93hYWKj4eQaWhwhIF0jIaEinKGgneHgHt2hHxtdnVmf5SOhoiIhoeHoKqiloiOl396gYh6eW9na3h+fIB1bGZeWlteal5hZ2BaUExOV1JRSVBKRE5HQ0pEQ0BEREI8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251b2Z3gnp/jH+BkI6KmpqknKGspqqusJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoSAgYyKgomNg3+Kf2xwal1CQTQuLS8vLi4wMjIzNDc3ODs9P0JESElOUVJUUlNTVFJQT0hFQjw4Ny85Qz48PDYzLmyTl01QSEpMS0pNVV9ed2NiZ2yPj4KPiIuDhoiTg42LmYecnI+fpqKhqZKntKGnwcKtx694uZSafI2hnpiEk4WCjqGflJmRhYqFj5qRlmxwdYqMgpWMjY53j4RxbYWBipaRgoWIcoiglYaRiY2PlqS0qJuMlKKCh5KDfX9ramp8goODdWNeZWBbaGxdbWxfV0tITlJQTkxMRklQQ0RORkJDRUZDPjo5Nj08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZwdpGGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkZJ9ioSYkpCDgICLjImGkIeEiYZ4eH9nTVI+Ly8uLC8uLS8wMDAyMTI1Njc6P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw3NTI8P1I1SEhITEtNTlFdaYF3bXp1kpCOnJuZkpmQnJCXmqSao6acpainqLOWqr2qtMbItsjQz76boHBpqqmfhJOShZygmpuZppGRiJWjm5p3en6UmJOhk5eXgZSee3eVkqqyiIyWnnyTnZuNkZWYo6Glta+ckZinhpaPjYCIbHNzfYF+c2piXmJgYmhlYGdnXFJFSktQT0lKTEZHTUNITEZGQ0JHRUI7ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG18YXeNfXuTjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNi46NfIqGj5COgYKAiYuKhZKFg4aJgYCHdl5iUDU2MC0xLywuMC8uLy4uMDAxNT5BQU1QUlNRUlNUUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lJTU5QWWl+iXKMgpWbnaq0sJ2npaejpLCnrbKurqq4r7G8m7HDqrjJy7fDv7elorCzrKyqo4uWmISlpqCjl4GmmY2iqqiliIWUpKGhqqCkqY+bsIuVo6a3upugoq+SopyhnY+ioauuq7K0oZSkqYeZiJKJlXl6foaBaWJpXWZjX2RkX2dnX1tPQ0lIU05GSEtGSkdGRkhBS0ZDRkZCOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpblh5hHaBk4WHgpyDkZCMktrInZZzVpeIj4icj3yGjI6KinqHgoeRjoOEgYuFhoiShoKFiYeIh4dxbmFARTY0PDIvMTEwLSwrLTAuLjQ+Q0FNVVBSU1VVVlVOW1BHSEQ8Pj5GSENEQTc7PDVDOz1GS0lGSFFOUFd9i5h/pZumoKe3wLylrsCzqK+8r7S6sryyv7S5uaK3xKe1yMe1vbi0qKOzrbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6or7a6srqsr7Wisauxtbu2tK20n6anoqaZqK+ssbi3t6eataiLpI2Qkp6GeIKFeFtjZldnY2JkYWFnYVtUSkRETFRQSElJRElHRUFAQEtEQk1HPTg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmJXeXVxgZN9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhIGOf4GJj4Z/hoiGioeRe3huXVdARE48Njo0NkFCNzY0MC82Q0hDUVtPUVVXVVxXUF9VSUtLQT8+R0tGRUQ7PkA3RDc/QkpKRUZWU09eip2nnqusuKuvuMXEsbfBurCwvrS1vrG8rrVzr7KkucSjr8a4sLOxs6ektbaqsKCilpuikqWwrqatq6ekmKGttLuiqLK6tby/zL/Fxb29s8G3ure+trq3uKursKSvqKy9r7y6wcGrmLmnlK2Ol5epiH2Dfm1YZWNZbGZrZldcZFlWU0lHRkxQR0NISUFIRD4/QkJMQD9NRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqcH6NhICOhW56c3iHYrmhmaOJlJSWkpSTjY+XkoeHe4aBjZWKgISBinp8ioeGfYqDgouEln14enVmUFxkR0VMO1FjYVteU0c/O0hQRFpjUVFZWFpnWVRgX0xST0RBP0lKSEVFQUBDPEU2Qj5IR0pMU1pUXY+osa+1ssG3s7fFybe5v7q1s7m4tbyyuLDEX3OwpLGanaq8qKSoq6qjorK1oaqon5WWnpigrqWnpqWfpJSjqLG0qLKzvbbCvtPJydPGwsXMwsrDwL28vru7trSvuLa2wrnFvcLHr564qaGrjaSntYiBgXRhZGNfWWNgamdTWGFWUlVJRUVNSkA+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSsvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42FkHNrcnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWin6DgIJ4e4uDh3uLeoGKgpd+dH16bGVwdVleXFBlZGJgZWRdXFhXXE1kbVVSbW1fbl9YZ2RUWVVKREJLS0lGSEhIR0JJOkQ/SEtTVFVcWluQtLu0ubHBurW1x8i3tLi0t7ixtbOyrbS1mGN0p5ytcF6irJuXoKKbpJ6qpZSfn5CTjpWYmKiepp+empmDpJ2tpaqwrbiwvbnU0c/X0MrM0szPzcrGv77BybzAvMDAxMTEyb7HzbKjurC0rpqrt7uYgHxuX2JeW2BjWmRjUVxgU1FKQ0FFRkU8QEY/QUhCP0M8OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFbWWlfb5aSkJRua290dYe0rKGhn4uZnJmMjZWRm5KFiop+iIaMkIuIfIGDc3yKg4V7iXSBioaVf3N7eWxtdXtocmVpbGlmamppYGZpaWxabXOWraS8iIZnXG9nXVlZVEhLTlBKS1BLU1FJTEFKRkpPX15hZmlglrPCrbWvt7myr8LEs663r6+5qrGwpaq2q4u1p5yapppNmZ2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXmpWWh5+ap5usr6mwqLS01NTU1tPM0NPVzdLPzMTBydC9ycnKydHGzM3Cz9G3r8O8w7mktbnBooRxZV5fX1piWVpnWlFdWE5QQUJIRUJIO0BDPkFHPz9BNztDPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnKPkJiCZ3FveHmDoaqeppeMmpuXi42VkZqOfYmLhY2KioqQh3yEgnB/h4GGe4dyg5KLjn1xeHZscHh+cXpteHNtaYFxbWNqbXB4aXd8fsu+wd+nbWN4bmNbYWBKUFJVTlleT11cTlBOVFBUVFxubXaCcZWstamxpK2zqKu6vq+ps6Wjt6WqraCrs6KNsK2Zl5iMjpGRhI6bgY2mkZyJg4uEi4mEi4SUlpiXlJuRnJeZmp+fq6ylqKKsrc/S1dLOzNPU1M/U0c7Hw9TRxs3S09PWzNHRxNHWxcDOx8fCqL22zp58cWhgZF9YYVRfW1BRVFFPSD5ARkFCRTxAQT5EQz4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VVFNTlp0hoWKd2x3cH1+f6GenqGMjJiTk4uMk4+VhXmFj5CNi4mIkIZ+gntxfoCBh3qEdYWTkIh/b3ZzbHN9e3d7c4J4cmuBc3JpcHF6eXJ6vsuafYuxhHZyhHZnYWpdQ1pZW1ZlY1hjalNYXF1gY11jd3p9i4GXqKOjn52fpqSprreppbKhoaygoq2hprGeiKaak5KRiY6NiIGTiGqVooyZhIGGfpGDg5OXrYuVjZSZjoaSkZ6XqLCioaGlpKnJzc/Iw8zR1dLU0s7TzcbW0szU2NbW2NTX1cnU2s3I19fRyqvCwsuNdXFlYmFaVltUXVFLR0pKSkA7OjtEQUQ8QkM+R0I+QkI6PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO09MRkpYcIB1fWhyeHKCioCdlZ2UhYuViY6JiI2Gjn94g5OYioyIiIuIfoJ4c3t9goh3f3qGkZWAg253cG12f3Z4fHSGfHpth3Z0b312hHV4e521jDtBisWlfox8aWVXSUNmY2VjZ2pjbXdbXmZoa25obYCCh5GKnJ2fnJCWl52io6Swo6OxnqGknJ+on6Kxm4WdkZGSkIqKioaDj4N+nJuLjYKEhXmUf4KplaONkoqXkox+mIuakquzmJucqJynvsPGubfHztLR0tDM0svI1M7Q1drX19jU2djN2NvOydna0dW+ysu1enlwZ19bVFdTXFhGR0tJRUU9Ojc6QEBCOUdEP0RDQUNCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho19l5Gdi36HkoOJhoSJgYd8eIWWlomOgoeFh3qEeXF6e4OFdXmFjo2ceYtwfHBweoBxe4Bxg4eBbo56dXd8fIJ1fnyGh69zWKnCto2RgnBtYj1eaHJwcXBueHaBZWhvcnV4cXmLho2TkZqVn5SGi5Kan5qcqJ6gq5qhmZidpJ2fq5mKmYuPkY2Ee4eHg4SLjZ+Zk4iDh35smXqEmYaIk4yNlIyGfJyJlJCuqpSWmJ+Zp6+2vamuvsfMycrMy9DJw9LK1NfZ19jX1dvX09nb1dDa2tHWyNTKlnx+a2tdXFFVVGFKQ0ZKSD5BPj03Oj0/Oz1HPD9BQUFEQT4/Ojg3REI3NTU0NzkuNTU2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD5DR1JqXm1kYmZrdoCIcZGQmoB6gI1+goGBhH6De3yEmI2Hi32Fh4B3gnlve3uGgXR5kp6OoHaPdYJ0dYF+dICDb4GQgm+ShHV8gYV6doZ7ibfFpMHJuYGWm493cGVPZmOBeoF3hqKQinh5dnuDf3uEdm2TlpOUjpeQgomOlZmWlaSblp6VnZKRlqKdmKqVkJCJjJGCi4OIiIGFj5GdmpmIhYuBhZd6iImfl5CIjYmLgn2hiZGMvKGYk5iZnammpq6fqLa/wMG5yMrOzsTNytHW1dXZ1dfb1NfZ2tvX29rZ2M7bxoh9fGpsaGJWWVdYTkxFTkM7PT08ODo7PTk9QDY9Pz88Pj09OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzk1NTU2NDU1N0hIPURKRTc5MjU7SD47OTo3SVBdW1JVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyKjZJ3dnqKe35/foB8hHp9gZGJhIV6hId7dX10bXx9hn9zfpKekZ6CkHuGfniPfnmKim6CmoB0mYZ9gYmFfH6Qeo+pjo/Dob2MnKOdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkYSIipCSlI2cmZKTj5WMi5Sem5OflJCNjY+Kfo6NjYqDiJKWmZ6eiIuUkZ2RgYp/pZiIhI2BhYSBpYaKjLeYnZGVlqKnoZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27h7fHtubGhaYl1UUU9JRExCPDw+OTk7Ojk5Ozw2Pz0+PD05OTs7MzdEPzczNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OkRXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1DUVNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4d6fHuLhoJ9dIOFeXJ5c22AfoR+d4WcoZudlJF/jIiAmIiAnJJviKiFeqGLfJGNg4iEnH2akImMo6OgkKSvoIqQi4WLgZKGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5SLhoeLkpKLk5OTjouOiYeVmZuOlJWQipGThX+Kh5GMiomclpihoYaSnZWfiomIjZuQg4eOf4KHhqSFjJGymJ2SlZehop+ZkpydqLK4raa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfW2dmgcoB3amlfYFpVWFlDQElDPz4+OjQ4Ojs3Ojs6Mzs7Pz0+Nzs6OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjY3ptYX6Sg25td4t4eX56gXyGe3t3hoR/c3CFgnp1dnZ0hIKEfn+SpqOfpaKWip2QlZeLiqeXc4qyjYSokoSZk4WZjKKVn5iSiJqeo5OpsKCQlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCxkWSkzciVjoaHiI+SjIyRk4iEiYiFlZiZjo+TkoaTloN+j4uZh42QqpaWoqGImJ6WmoiOh5eXiYSOjIF/h4+liY6TqJqXk5eZoZmfmZOdm6OztaajvMK+yMXFycjJwsvUzc3UqdLR1tXW2NrU0tnOhXWDa2ZhYGBRS1ZcQkJHQztBPTgzNzs8Ojk9NjQ5Ojw6ODI/OTkyOkk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjnx8bX2IeHp+eoGBg352doCCe2xuin55fHd4fISGi36Lo7SopKuzoZanoKaklpWvooOQuJWRs5qMoaCMpJuvo6SdmJCol6mZrrCkl5SVlJCLmJqWoMCOo8m4q5qjpa2ZkZucsp2GhaiinJeFiIiNlIuKko6GgIWGiJGXk4uKk5KGk5eFg5CPm3OQmLKVlqOgh5uak4+KkIqWmoiKlo2GfYyYnoqQkJyamZOZmJ+UoJ2Unpuhsa6jpLi/tMTHxL3Dw7/HzsvJ0qfPzNPS0NbY0s/YvHV9emBjWGNZUklLT0ZCQ0Q1Pjs3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxLPD47PEJBNzU8OzUyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVxdWUpoYTtIhIt6e22Fhnl8hHiAhIF9cHh8fXxvcox5fYF7eIaLiYaEk6i8ramzvbClrrO0qaOisK2KmrWeo7mllayjl6mtuKako5+ZqZiqpLCxqpmYnJSVkZegl5q7u63KoWm2uKqwlZieo6uSl72jXqmygomJjJSGkHyOjXyDhY2Pk5OIhpKVi46VjIqMlpiRm5mzlpSqnYqblJGMkJGLmJqJkZ2PiomVn6GOlY2XmZ2SnJielKGglJydpq6ooqSzuKvCyMS1ur27xsjIwtChxsnNzcTX1tDK1KNzfWxfXVZiU1FIRD48Q0FBNz84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBnSGFgYnBKQIuJfoBzh4d8gYl1gYqDfm19fHx+cHeHd42Bh3uNj4yGjJqrw8Cwvca8s7TBvbStrLO3jKiyrq69q5u6o6itubirp6aioaOjqq+ysaudnKOZm5iXnqKlpZKjua6ov7usrbK5paOnfYiGna28sIKLi4qQg4+DkY56gYaQjI2bh4eNloyKlJaTkJmWm6eZsJmQqpyOmo+RjpWQj5WWjpCgkIiVm6OslZaPlJyelKCdm5ifoJSan6inpKKjsLOmwMbDsLC7tsXFw7/Np8fDx8O81tDMxMqKd3ZlX11iXk9MQ0xARUc/QT5CPDo0PkE9PTU9Nj4zMzMyNDJBMTdAQk0+R0BDTkNBPUM8Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaUZfaWdbXVyTjIyIe4eLhoOMdYWQioFufnuBfnF+gXqUepKUlZiQk5aotMbJwMLMwsO5yL26sKu5u5iytrmywK6lwKOrsLy9qq6ro6Oep6yvtbGqm6CqnKKclp+vs6eMo7q6tcG8q6icsqSjqJSEjqrEw6SCi46Gh4SGlZSMeoOMkI6RoIuLk5COh5efl5KYlJaln66ci6mbjZaPkZGUlY2QlJGOoZOGl5+fs5+Um5SfoZqkn5qgm6CUmJ6npKanpK+tpb/Dwq6ot7XJw762zrLEvsO7s9HJyMG1eHxwX1tfbVROSURMTExKQEE9QkQ8NUFEOzozPThCMzMyMjYyQTE1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCaF1NZVxmVGNqmo2WiouIko+GiXmFk4+BcoB7jX93h4KBj3mNoZaompuYur7JyMrC0snLws29wbOtvL+nur+9vMS4rMGprLO8vqqwqqSlo6yuta63tqCfrp+mo5ijs7ypnKi8waO2t6+rk7CsqqyXhpqqp6WQgoySpJWJgHWJkXmEjZGPnZ+RjpKKjouTopeWmpSToZ2pnpCkmYuOj4+Vloh8jpWSkaKalKCinLamkJ+XpaSjpZ+eppielZebpaOoqKKyrKi7v8OvpbO3zMC6rsOzu73BuazCwsG/mnF8ZFxZXl1MTU5LR0VDSEFBQURLOjRESDo7NDw3Ri4xMjM1MkEyNlNITjxKQkpRRUtDRUU6RUxCPDdFVj08PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxKX1hhWmRlWJ6QnY2Wjp6SiYp/iJ6ShHeFf5R+f5CIiZCAlqCarqekmMS+yMTIxtLNzs3LvMK4sLq8tL3Lu8PCt7a8rbS/uryur6ihqai2rq+qsrianqyiqKKdq7e3qqWvvsSxvbmzp6q0s62ulpWlramgkY6SscWnlI58kZV9h5GYj6mYl5KSjpKUkqSckpyYk6ChoZuYnpeKi4+Onohaj5aXkpakmWaZpJ+zpZajlausq6icn6aXmZaYlaKkqKaetaupurzCtKa0tcvBuKq2rLO7uK6ouLq8t4RvcV1bV1hQR0tUTks/QUdEREhGRjg1Rk07Pjc+QUsuMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmZkTUamlJyVoZeolYyQg4alkoiBh4KahIOVkJCTjpqhn6++rqHIvsXFyMfOzs/Syr68trG7u7y/z7bEvri5t7OztrO4tKynnKusuaupqK+wmKOupaikpbXAsKustL7DucC4s6e4tLeyr5WkrbCwpYuTlKCNc8GZfJaZhI6WmouwlZmZlJGRmZikopSempWZp5yaoJ+YioyPlZ1fSpacmpSZpZdUlrCfr52fpZWvr62mm6GmlJOZmI6doKahmbSpqrO8u7ursLLHwLilq6utsbGjobKytKVzcmhfXVFTTUZRUVBRO0hKSEZHQUM9OUtUP0E6PUZNLzc1MzQ6QjQ0TldOPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs1RkE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlXPDpCQ0A9UkVXU3RiVkZIqpeZn6GorpiRl4eKp5aOiJKEn4eEnZeOnaCao6W1ybWpx7zDxMnLycjMzse/u7OvurnAws21yLvBuba6sq+vtLWnpJyrtLWrqqaurJqkraalqay6v6irt7e+wcC+uLKywrC3vKyjrrWtuqaImpalm3W+n4SYnI6SmJqLrpagm5qWlJmen6idpp+YmamZoKadl4+MkJ2CbXWSopqVnKKfkK6yoquWqquYq6+lpaGlqpKSmZyJlZyinpawpqmqura+s7Kuvrm2oKOmqKWmnJytqamNZmlkYlRNTkhJT0pWTD1MRE1JSkBDRDxRVTxBQUJFTzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0M6OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NntmVzw6PS4uU2FMVkh+ZV5IRqyUm6Gfu66YlJ6LkqqbkZKTiKqNh6KejKOtlKOktse9tMG7wsLIycbCzsjCvrqyr7m1wcPKtsaywby1u6ypra2xpKOZqrW7p6qnrKqdqK+opKurvruorb20t77HvLa1uMCwvcCzqrW2rL+mj6KWkKCfu56Jmp+Zlp2dj7aeqJukopqboJmnpLGgmp2lnKepnJeTjpSbipaIjKShlJyinqG1r6Wlk7Ksmqutn5+lpKuSlpWghJCen5yVqKShobO0uratqLWysp2do6Wal5WZqqGeeGRgYmBMSUdITlFJTUVGRkJRSkhAREdBVlNESDxBR1ExOkI3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Sol6SensOsm5ekl5iom5WZmo6qlpWoppWsrZmhq7fFwbu/uMHCwMjEv83HvL66srC4tL/DyLbAsLy2urenpKusraGhm6urxKKlqKymnquvraKqqL64pq2/sLe3x7e0ubi/sb7BtrSytbC+pJajlZKak62fkKGipKKinpC+pKidqKucnKCapZ+8opejnqGoqqCclIyUnZOdho6EjZOepKCdtqylnJezp5qwqaCbq5+ijpqWoIWOoZqckqWkmpersbayq6WqraycmKCgko6QlqmflGlmXGNfUUpIS09NSEVESUA9T0hAO0ZJSFtST0s9SE5VNEJGOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0tME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvU0Y8S3hmY1hOopujm57FrKCeq52crZ+Rop6WpKCmqquXt7GjqrO2xcK9wLa/wbzJwr/KyLa4trSxtLS3wsa3v7G4tbq2oKetq62fnp+lpMGloaquoKSprbCipqi9taWxvLe2tsSys7e6vrLDwLe4rbS1taOcpJSRk6CsnpihnKioqqKawqyonautmpqdmKWfvaGcpJeqq6uloJiNmp+SnYiOV3+WnqWhoLmrp5OZt6Ofs6KhnLGYoZCblp6Cj6CXl46io5WQpa6yrKmioqWklZWdmIuPkpOkn4ljZ1xlYk5KS0tPRkVBR0s+PUlBOjhKSk5dUVFJPUxWXDlGST1FTUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMUJ6foZiew6elorOgm7Gmkqmjn6Oframrnbyxqay1ssjDwcOzwsO9x8S9xcq9sLG2rrG1sL/FtbqxsLq2rZupsKqrnJ6moajBrZytsZypoq6xqqSovbemtru9r7fErbO0wr+yxrO6t6u1tq2qoqWVlJOiq6Cfn5qnqq6vr7uxpZ+pqZiYl5Kho7igoKORrq+rpKWdkaCdlJ2OkIyUnZqin6i1p6eNmbWco7CboJ2wkaGVmZWbgZKilpCOoKCTi6WssKWmop2gnpKSmpOGi5KNnJ+AZGhdaWdLSk1KU0FDQElHOztGPjk5Tk1VX1JTSj5PXl49SFBCTU1JOE5kXExFTFJUWVtTVU9cYkhBP1pRQUhBS0E3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDt2XV4/W1VfZ3JAODxIlndlQTSfpJ6bn8Kno6mxoKO0qZSxqqaipLKsram7s62wtLTHv8TDtb/EvsrFtsHJwrastamxuKzAxLS4r622uqWZq7Ksq5mhp5itu7ScqLCbrJ+utLKoq7qyp7m0t7K5waq3s8O9tMWnvq6tt7WpqKyhlpWRpaOiopeXpK63rbG0tp+eqKSZlJSTo6C2oqSlla2xsaWopKCdmpmZlZeooJ+Zop6vs6KmjZivmqWtmJugp5OekJaam4aXoJSNkJ2ek4uoqauhp6CanpaNj5mQgoaWiZWfemVrXm1rTlFOTlQ9Q0FOQzs6ST83N1FOXV9SVlFBV2FdQklTSFdLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtjWjMzOTA2cFtiSDA1SnFqV0RXRox5ZkM7pKScoKW/paiurqCptamct6+ro6q0trGwuLewt7e4xbzDx728w8LIwbrCxsK7qralrbuuwcO4uKuusryjla6xrrOXpqiRqrqpoaewnaqgr7Szq6q2tay7rLOyuresubDCur6/psOqsLevqaurpp2YmKqgoaCRl6CwrrOqsLiZm6qfmZaSl6aftqikoqKvsLOrsaaqn5ufn5udpZ2hmJ2jtLCcn5GUppuhqpyWpKKYm4yXmpSWl56UiZGbmZSOqainn6ObmZuTh4+Zi32Ml4aPmmxpbmJub1hRUlpUQUNEVUA7OklBNzpYUGReUFdXRVlfXk1MU05eTEo/WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9REZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2VAMTc0N2dZYUYoQDhtfWlcVjuJe2NDPaifnKGpvKGqr6qisLeopLOyq6Gstb2us7m9u723tsHCv8nDucTDwcG5xb7BubC2qKy3sry/v7Wqr7K4n5esramvmKmpjqe7nqWts5+rorGws6yqtbO1vK2vsbWssLWywLrFt6u9r7G3rK2porGlnqWonqOWj5ifsqmyqamymZ2nm5qUjKCmpLSup6KsrK2wp7KqsKmim56oo56UoZmcqLepmJqTkp+an6Kgkq2hm5uIl5qMnpqdlIuPl5eal6alo6CdlpaWk4CQlYR7j5OEjJdnbXJocXNfR1lmVkRDTlhEWjlIQjU+XVFoXE5aXUhbX15OTVNYZEpLQ11jYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0dERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVTE1MT1gVl84KUMzWVVcaEs1jHpmTEClmqCkrLWjrKilrq21qK6yuKansLfFt7G3v8HCtrW6xb7LxLnDwbvAusW4wbqztKyqure7u761q6+xt5mZqKysrJ2tq4+rvZ6rr7GjqZ+xrbOvrraxubaqra+yqLawtLq8yrKqtbSxtLCvp6Gzn5qorJ+klZWambGiraClr5aipJmZkoyipaeyqaGmsauptKWur7Ouo5idraebl56amqy5o5iUkY+ZnaGZmJWuoqCXg5abj56dmZeRipSTnpqloqOhmZaTkpV7jJCFeo2Lg4uTbG55b3Z9YUZgalpJSFpcPXtKR0U2QWNUaVtNXGFLXF1bUlJTYmFMS0VgYWBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NYVExFmpafsKiwqayko66ttai2srejrLO3ybu1u7zAvrW0t8PAzMe8w724v8DAuMC9sr2uqLq6uLfDt6yusrqWl6evraiksqqUr7ukrLKyp6ejsrSxsrG1sLezqa6ssqe4r7a0w8W2qbW1q7Ctqqejtp6fp7Gfo5SbmJSxnqebn6mNqaOdnJWXpaWkt6eisbOrp7Cnra+0rKSYoKyonJydnJWquZyVj4+MmZ2imJGZqaWimYaUmJGenJiXl4mXkJeaqJ2koJKWkpCVdoSQhnuGg4SMjG5xeHZ8gFxMZWxcS05jXT5ie0dJOEdoV2VbTF5iTVlaV1RYVWpdUFBIYV5fUEtHUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNxakxFRJGYpK2krK2qpaOwsbOptq+1n6u0uci6rsK9w7izsrXCw87EwMK+tb7BwLu/vbTEqau6sbe4wLywrbS0nqGnsa6mprGlnbG1rKmysKuoqbW6rLWytauzrKqrqaypua6ysMe/uKS5r6mtraanrbGlpKOuo6icnZuarpmjoqKjkKyfo6Cfoammpbikq7S0pKqrqayutq6inaOoqpygmpuTpLSZj4qOiJGjoZaPlZ+jl5aHkJWVnpuZlpWImJOVmaedoZ+Nk5GOkHd+j4R8fX6HiopydHN/fn1cU2NuX05ZZ1xGRJZbRzpNblhiW05hYk9WV1ZXVFloXlFTTWNbW1VLRk9UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZTs2KkhkSEorOkk/M0NJUyw+j2xASEmQmqipoaivpKais7Ows7SvsKCrrb3Mu67BvcextK60wsPRxMW/wrO/wsO8v7i9xaitt6y0ub3AsayzrqKkp66qqKWwo6mwqq2qsa6urKuzu6e2sLKps6mrpqWkrrqsqrHDubSruampqK2pp7GlqaSjramoop6boqyVpJ2XnpmsnaKnqKGspqOtrLexsKCpoqCqrrCsnZ6nqKmao5iZkKGomIeEj4uLn6GQjY+Yn5OSiImTl6GdlpmWh5eTk5elnJ2djJKQjYl/f4iEe3eAh4WHdHRyiXdsX1lgbmNRc3JcSzuEfEY+V3VYYVlPZFxOVlZVV1FcYl9TUE9oWVdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0zOTg7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgyPV5LMC5JZ0RGODxCMDVFS1gxQJRdQU5GlZasp6CpsZynqLC1rLe0raqkq6q9ybyxv7nDr7Gts8TDzc7Dv8C0wMPEusG0ycSsr7eus7rAvrSvr6ynqKqxqaeosaWzrKqvra2xrrKts7uluLOsq66nq6CjnrG4q6qturaktbWkqqesrKqtoKinp7Cxo6aloaGslqqhk5ugpp6koqqjrKKeprG2rKyhpaKaqaquqpyhpaSkmaCZlpCYnpSCg5CJhZ2hjYyQjpySlI6Fj5qlm5OSm4yTkpKUo5qcmouPi4t8hoGCgXp1gYOBf3V4iqKGeGpeYG5mV2WHZE5AZ5JMRGJ6V2JYUmZVTVZWVlRPXF1hVUtPaVdWVkhKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwuMiwmMDdYWi4wSmdBQTw8Qys6Sk9eNESHQ0pJRJaQr6Shqq+XqKettaq1sKqkq6qovMHAubq0vLWmsq/EycvRv8G7uL/Aw7rCusLErrK1srS8wb2zsq+trK2ntqqmra+qt62nsLCusau1qra2p7W3q6ykqamcpJ60s6mopLO0n7Wtoaqoqqisp5+rrKm4tampqqmhqaCtm5GqoZ2gpKOmo6qdnKa0rqekqaKjl6Smp6qcoqSjoJqYoJGPj5mOf4iNh4SenomGjIyRkZOPhYmXo5qOjZuRkpCPkqCYmpeNi4R/dIaCf354dYN/e3h+f4ecj3BxZmdxeFxhdIhqT12YVkhteVVlVlNkUE1WVVVRT1hbYlZJUGpVV1RHT1hVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMjM7OjcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyLzIyJS8zUmMwMj9mPU5YP0MsP0xUXy9JbDhSRjuVjK+gpKqrmamjra6ytK+ppa+pqLu/vMGysLmtoravyMfH0MC/vbu8w767xMK/v6+ys7K2vrzCsbK0q7SppbWppa2ysreuoqy0sa+xuau4rqmut6yqnqqroKOhtq2poZ+vsqG0qp+op6qiqqGhrK2ova6rrq2hp6efrJmPsKKYoqGop56nm5mpsKminquhoZKhoqOnmJmppZiYmZ2Pi4eViH2OhoSFpJeGg4SNiJGQkoaHlqGXiJKekpOQjZGdlZePi4aHeHSBgHx0d3mAe3V0e2uCh6R2aV5lbIF1Z4iMfFJWb15LeHNUZFNSX01NU1pnTk1XWWVZR1NpUlI/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSE87WUQzj42xoKSlqaOkoqyms7KwqKSwp6q4vsG8sam5qqeusMnGx9DDvsC+ub/Avcm8wbixsLWyury5wLO0vKy5rKO0pqarsLW3saWmubSss7uvvKWtrbarrZypr6SfpKyqqJyeqrKks6iaq6eqpKidoqmnqr2qtLCunamkoK6cmrOjlqWcpaSfpZqaqKulnpqooZuRm6CknZmXqaqSmZqSkIuDj4V+j4J/iJ+Ph4F/jYiTkZGGg5WblIWTo46UkYuRm5OWh4p/gHF6eX18aHZ8enVxcn5qhnmFiGRfZ2NyhXttaHldXlVBV3ttVGFQUllMTE5wdF1JWltoWkZWZlBDPkpPRENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj07Rl1AKo2RsJien6ikoqGrpLaxsaSpsKatucG9trGkuayoqLDCyMjMwre9v7W4wbnItsK1tbO1sr25ur22r7m2v6yis6aqqq60trOom7m7qLC+srqgrrS2qaufrbGjnKWoqaOdm6Wwpq+gn6upp6Gpm6OooK28p66wrqGqoqSunp6tppifmqGinJ+bmaOqopqaoqSVlpSfoZablqWsjJ+RkJGMgoqAgI+Ae5qVjYp9gI2IkpGNi4aTmJGGlKOLkpGIkJmQlIGJfXlrfXZ4eGJ6enFvcXR4a4J1a4JnY2dibnOObWJqb2BvQFx5bFVeTlFSS0pNVFlWTVxebVdFWWBQXk9ITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JePiORlqyYnpenoqCfp6O3r62hr6+orLjDu7SuoLmvq6i0usfKx7+4wb2vtL+3xLfDs7C6sbLAtru+t6q5uL6qpLWnqKmvrLivp5i5u6OtvrS0oK23taemp7CzoJ6lpqegpJmerKeonqCqr6egppaiqJ+xuJ+ksa+gq6GspJymp6iam5yfo5Wcm5qdqaaWm56okZiTmZ2TmZahqpGbio6Qh32Hf4KOfXyhjY2JeoSOhoyOjYaKk5qOiJWfiZGVgoyXjZJ9hXxzcHxxc3RfeHdpbnFxcGuAdGV6bGdlZGJmhoBgW3Jqck1NgGlYWk1RTEtIUFNQR0xbYG9URllaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXEZPPVJaZ0gqPzBdXDUolZummJuVrJ6doaOgtqqvo7Szqam5xbezrqC3ra2ssLXFx8C3v8G5sLW9t7+7vrCsvrCzv7K8wriqu7q4p6i1p6eqr6qxrqSXu7Wjqrq1r56xuK+ppaevsZuhpKCko6CWm6+loZ6iqK+hoKGSo6Sit7ChprGrn6ujrpidqqWon5ibnaSTmZuanaWpmZubpZWUl5WcjpOYoqmikYqLkIZ6hH6Ei3qOl4qOh3uDiYSKjo+GkJOYjI6VmYuPl36Gl4yQeoF7cHJ3bm9zXnd3ZGxsbGtqhW9ncmlqZWldZHOBYFtrdmlaSn9eW1lOT0tISFNWRzM4Xl9sUEVZVlplTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERUXWhELjwyZFcsMZShoZaUm6qbo6GiobapraC7t6WsvcW0sK+jtrCsrK60w8O8s766trCzubi6t7qvrsCzs7mvv8C3rL26taWisqmmqLGpq7Cfmb+0pKe0taiesrypqKWpr6uZoqeco6WUl6CxpJmepKmonKGfkqSgpLippKeup52koaiToKmioaGZm5yfkpmblp+iqpuamKCUkZWXmo2Tk6SppJCJio+GeoR7hIV8nY2Ki4d7goWIiYqRhpeSkouQlJSNjpR6g5eQi3d+fGx0cmxrc2B3dGhoamdncIdoaGhkZmlqYGpjamhbZntiYFN0VFxbUkxKR0lQVEAhKmhfaU1FWFVfYExKSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGhbSldHVWBoQjM3OWdQJzKeoqSRjqOnmZyenaOzrKequramrMPBuLGso7aup62utr+/vLLBtrCtsra2uLa2raq9s66ysby+t6+8u7Gln7WppKSzpqitnZzAqqekr7OprLW7nqmprLClmJ2pnaakkZilrKGYnaSpoZuhm5afnae1prCqrqCgnZ2hlaCmoKKgmpuZm5KYnZOlnayhl5adlJONlZiLjpibqaCSiYqLiXmFdoGCgZ2Hi4OJfoCGiYeHkYSXlI+Oj5GRkYyTeoOVj4Zzfn5meW9qamtldHNrYmdkZHaBY2VmZmVqamNrcltfWV1sY2FOaVhaYFZKR0hLTVNXPjlebGhIRFZUXVtJSkdGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpW0xaSlZiZkA6M0JoSCU1mqOgj4yroZaWoJaksrGisr22obHFvLqysaO3rKqtqbi8urqtwLGurq62r7K4s6mrubGvrrO1urWwuL2spp60qZ+gsKKorZuiv5+wo66xr7eutZ6tr62topmdpqiln5Wap6WfmKSiqJ2an5qTnJ6sr6a6qK6ioZqbnpmepJqknZeemJuUmJ+SqJWqp5qTmpqSjJWZjZSUm6qnjo6Kio98gnOBgYqYhYd9iYqGhouNi5OFlZuTko6PkZaOkH+AjY6Db4F/ZnltZ2tpZnBya1xnY2N0gmJmZ2pubGdqamluXWxscnBgVGNpY2ZaSUZNTU9YUVBVYWWAVUFXU1lUR0lGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QTEtKy4zPDtLNjAuKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMmNJGhm42Or52Zk6GaqbGvnri/taC0wbu+urGmt7CnraS3uLe2rLuurKqrt6qzt66msrWyrqmwtbWwsrW5pqiftKecnaigp6uap72XrKOusLW1ra2gsa2wqKGbnKOrp5uUm6ajnZqpoqSVmp+bkJukqququ6CnpKCYmpmdoY9ropaZnHCClZmjgHWSqaeelJSekImYmoCWiqKQeYeUjYNtan93g3FshouGfoWMh3FfZGFnhJiFa4qNlJJ0d4uEfoOQgGeHgGd1aGVXXGhzbk1QaWNncoVoX2Vmbm1qXWBhio+DhGVOS0Q5R1RoXkpIUVFVVUxIU2FwdGVGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCwwOD1HNzAxLiouKi81NjgsIzEnMjE0OjI3NliBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6LpJmGlbCbmpOgm6qsqqO9xa6pt8K3vbytp7ewpKqit7OxsrC5rKmmrLSlr7Sjqbe1tainq7ayrbSts6Gon7KpnaGjmaSlmKu5k6Wlr7O3ra+lqq6qrKShnpygpqablqClpJubp6adk56el4+dqKmktrCko6KclpiXl6OIoY6Smoagh5KcoH+lf6aqnpKSmpGIhHN4jY6FiKF2iY1pl4lmfnN4oG+Ih4R+j31/oaCgmYB9h55zho51m4psh4GDbWllY3pscmFThW1ibGmYcVhpcW+IWV5pW2xsW4hybnpyhWaGhFpfR04/R19ORlJWVlFRUldVZ11NVklSUk9GSEc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLigtNDU3MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oiqeWg52rnZiYnZ+qqaeqv8Ousbq8t8C/qqW3sKispbK0rq6ztqqopLCtpbSynK61trSmp6eysKyyqK2dqaCwp5+jopifoZqtspOjpaW1vaatp6uqrKiloJ+Yn6ajmZiloqOYnKSolpOim5OTo6WmobikpKCjmJWTl5OciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGcxnl4saW3l2WAwJy/eYSFepKEfZCQkcpyl7ucxXpytaa7kHuAbZexq7B5aGxYsa5uZWm8krxuZ3puco/YflNrY7ayfoFzlHOaoaqQV09XYk9WTkZVW1hRUFONXVdbUUFdRFBORUhJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+OkI8P0E4Oko+NTIqMjJCRS8uMzIuKy8oLS8xODYtIC80MTZBMT05V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYunk4GnqZ+XnJ2lrLGosMK9srXAtba+waums6ysqKaus6mutrOmp6W0pae3rZyzsbWrpqSnsK2ssKapnKajr6Kgn52VmZ6crauTnaKfs7qjq6mira6loZuamaGnn5eap5+el56mp5GcppmTnaGmoqGxo5+fo5eWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHCuoaR+eLt9bKGQdrFfarRbpYBlnJBhZ4N7Z4BreWupZb5xZ6aLdbFqe7F4dJKUY25tp25bhKFFaGaHlkV1nGB+Z3ykp4JaYIyraICVeHlqpzdKr1xYU2xkW0tPWGBcV1Y7TotPV1cvSVRTSkRGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTAzLjMzRTQuLjUzLysvKC4wLjo2LyckMjAzQi8+O1WCdjItVmpcT1lMX2dZOk01X1gzMBuQopWDraelnqOkqrG3rLW9vrC2xLG3usGmqLCqrqior66jsLqvo6StsqOpt6eesrKwo6Whqayuq6+mpp2ioa+aoZuWlJaam6yklZqhnrOzoqyco62toJ2Zlp+hqJyYnqOfm5mhpqSPnKKZlqCfqp6npqGaoKGVlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR/a4Gme4KGiJOUk3erZ2uxXKt6jYaUdIlyj4eBgYmQl3iCgYuXi4OgjoOwdnefcWxsbHyLTqRYSGJimX5jaKZfeXJ1U5OHXlGpbWNxfYaAYpwuUaFvW1NraGBMSlxlWVxaQj6ye1hYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozk5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkBGQkBBRDxGRDswMjAxO0YtMC45NDAsLigvMyw+ODMxHy8yLUQxPTxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblKCVh7OmpqGvqaiyrKm7tsKwu8GtuLe/qaytra2lrLGpoK67qqCns62jqrSjprKyp6Oinqaqsaevp6Sdn5+ulZ6ZlJSUmJ2soJmZpKi1r6Kqj6qoqpudlJegpaeanpyinpufoqSilZuel5mdoqmbppqcm6Khl5ORkpOcg9WTmblwsMF+xYZ81pSbu3yalaWPjZ2NpHuOiKSDpYN6rHmPnVaveoh+n2u5W7p3h4R+poKUe5d6qniNnY96sW6OhHSRvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhYCJfGOkM0Kddl1QamljUEBYaFpkYUpITXFRXFFPWWZaQ0U/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3SDphUDcxJZuilJiyqKimtKqltKmkvLfBsLm/sLW0urK0p7Cvoq+ypZ+ttaiap7itoq+wn7O0sKCknp+mqbCos6ijm5ydqpWYl5WWk5agqZyZlqetsKmjn4+toqiWnZWboKWgmKGgoaCaoaGnmp6hnpSYmqagnKeVm5ufoZiQkpSQnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaJ+kaGmf7F3g5HS0nZcrnuFf6Rvm6qma4eFfa19mJmOe7Fxkp6Od7Nll3SEnm+eZ5RRyItawlygeWJfrGB1c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBUGtgbGhQVkdKOT1VUlpXWElEP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPy8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YEw2MjCinZKksa2jq7ytprSmp7W6vLK6vra1s7m4sqS0sqCwsaKeq6+jl6a4raSxsJy0t6mgpZ6hqaSxp6ypo5mbmaedlZOXl5CSoaeflZOlqrCmopeTraCmkpOfm6OlnpWapaagmqKfrZmhnp2QlZuhnZyllZ2VmaKelZiVkZuFrHt3qHajjYiGqW+tioKng5iYoYqSm4uif5Oaia6EgIKzXHKzUq59goKjf3LYfniGfo+dhpqZdq+Gh5Gch3a0YZplmoKClW2SWrBYS5p1mHlmYKxedXeIaJiIa12vd5Wej3hsNXnIrrJfQlRvXmdgRVBtYHBtVlZNLmZlaVNZUDtCRUBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQl9IOjk5oJ6VoLmxl7TCrqiyqKmyurezt764t7G0urSkt7Kes6yfn6irnpSntauosLGqrbOjm6mgn6ehtaalqaKYnJSkoJOSm5eRlKKkmpKQpq2vpqGWmamgoo6QoZmnpJ+VmaSonZyknqycoZyfjJOfmp2hmZmblpeioJOXj6adhql9faV4oY6NgqpwrYuBp4aWn6GJmJiIo4OSiJSrfYCLnXlvsVqogoKIn3p02YB3iHSogY6bjJKke5SPn4R6sl6dZKB+g5Vtkl2rW1qTgJF/aGeqY3F7gWuYh3Ndq1qJoI5rb2VPSkOhXFtMdF1iZ01bYV9xc19LVzdKnJhYR0U9SEdBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA1Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RkheQjI/OKOemZrBq5e0wq6rrKmmtLC3sLW+ubixsLW6qLqzn6+knaSmpp6Tqa+orqi1q6muoZigoKako7mhoquglpqQoZ+Uk56Zk5ien5CMjKmwsKeel5uopqCMkaOXp6qmlJeop56eoKKtpKGeoYyToZifoJKel5yVnaGVlo2qnI+ubXK0c6mLdYqnc7R4c7OAkaSjkZ2OiaSHkHe4cI17i6Jqa7ZaoYVll5dpoKKnbpRytHSTmX6yaoWRh61qdbNhnWaib4eTa5ddrWBNoXyGklJzo2t5f35vmIdxXK9WPJx3ZlRvbi5cp09jU2tlYm1ZY11hcHtjVFtTPj1ucTNDQkA/TDohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimnJuevKGcssCvraurp7ept661v7S6r663tqrAtaipoJulo6Gckampp7SisqetqaCXnKefpKu4naKsmpWYjqOilYydoJuYnJ+Rk5SrtrGomZWcrKmXjJOlmKSsopGVqrGjn56mq7GZoaOQmKKWoJuWnJahk5ypnJSQqpmH1JKau3Oww4DDhn7Vlpu4eIiQmIyYi4yniHqktnV+d3bCgpqyYIO6ecB9drhjtYGMh6l9lYGrqXF7f3S8iKegaZ1hpo6voX6MdYerfb5vc7x0soN0eIGKbpqIcW6NpHS9Xnd9WmF5vGtaVlxqeV5qYGZnY214b1lcWkNAQHRAQ0crNEciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYGBfX1pQUFJLRUZKNEhMUkBKTkVGT0I9RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5qJueo72hl7LDsK2pqqyxprevtsOwuLCtuK6twLCro6Kdo6Gcm5Coo6qypLSlrKSelZqqmKasuJyirZeUn5Ckn5KMnKKel52akZWTr7myrJaYpKinlJCWpJyjrJ2Qn6irnpqfqKKzn6OljqehlKKbnZiVo5iPr5+RlKmehZCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0n8G7vZp7gbGocIBzkbmDfYeGjYeNfIqHjZh8pLu5vZx0ebSjdHeXdnSwdZmeZodqjbZ0cnF4toxef3p9iWiDeW56Y4uscHWFf1hbp2pFZFpUZmBjXmNRZ2dwbHVDTlFMQzpaTT9LMjsvIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZVJz47PKieoaLApZa1xLSsqqisqqm5rrDFrbOyrbWmtLisqaGhpZ6gnZmTqqOsqqW1p6afm5Wgo52spLyloKmWk5uQoZuSj6GnoZKdl5SYlbK1t62ZnqSkoouSkaWbpKqblaikpZuZoaimp6SqoZKtnpeknpiXl52ej6+ok5uloY1qfWmapXeGcn2ajnR5ZId7vb7Aum+Tg3KWiGFza1pfm4phY4iPlWtggJZkbp53Y5ZsgZqVlGVeYGJwmYhpcot9hpVna39ydHh9f2JceHSBaFBdboN9e4trWGt6gnNKSm+GcE50TEVYXWdhTFtYZmNfT1ttdWlxUlFERU07R0k9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU19WNClQX0woMj1bTyc/Mj6poKiiwqObtbu2oqylrqentLGsx6uvsqqzor2wsKWfoqedo5uZmaumrqOktKmkm5iVoJqmrai9p6iklJOalZ+ZkpakqaiQnpGQmJ2ws7+sm6eep6KIk5Gpmqejm5qqoKOZmqOnrKOgrKObsZuUp6CXlZ2fnZawpJegp5iakJuboaGXpKGZnJmZmY+VgWdtfXF3kpiUkoaMtquNh5iWjoqMmJaHlJWLhJOUkomOk5SZlJiWmZ+hmZqToJyNgnqlhW1rfZB9gHWLioFxgnh5dnWJf3yJanOBdIN1ZXZ9d2tvem1fZF1waE1ZWmZqX1dab3ltbWZVT0ZSOU5ZTVJPKCs6S0I2MzU9QEE6OkM+PEVOU1NUVldYWlpcXGBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgxMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEosPC1As6Gzo8ChpLKyt6CppbKnpa+0qseqrK+ks6TAp7OgnaSknKOVlZ+qpqyio7arn5iWlZ+XramlwJ6qo5WRmpeemJKToZ6eoqeTkpqpqLPEsJqrnaufj5aWqJ2qnJyfq5igmpuipK+noqaooK+Yl6edmZmgnp2cr6CcoKWUlpGXk56flKGdl6COlpOKio2Ol66QfJacg5KCi6uphYGZl4mEj56IeoSQiIaakoiHipaPm5eNkJedo5WYkpCcjX+OZ6Gzr4WKhXZ7kop9d3l6b2Z5j4GBiWt1gXmIc2lzf3t2g4aCanVkemZgamVjZGZrWWt7b2lqXVNMUEReVEVAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWltfYmNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXFEwNU5bMTdFM1tHNTwsQLShubC/rKuvsrGgqqeyraKssq/Er6mqorGtvKKzm5+moqGcmJenpamlpKWytJ6Uk52ZmbClrb6gq6KQkJ2ZmZSRlaGcl6idhJ6srKO0yLSgqqSrl5WXmqadqJqeo6qTnp+doKqvqqakrKOvm5+goJiknpyenK6jmJ6nkpaWm5Cil5annJqWZYKSfGV+jZqQY3mObWhre5Klq2plm5h9Z4aKZWVpaHuOoo9saI2YkaN3a2qKmKKel3NrbXqEjoh6WGZehoNebYyKgXZcaHN3dpF/iIJtd4F4f3NueYR0domHjoN8aodZXmx1ZV1ziWlre3BrY19STldJZFhBSjQ+Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVVdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2loLq8uq+stLGqpaitrrCmraywu7CopqOsrbCerJafo52imZmmqpyto6WnqLKunpSij6KvpbW4pa2ijo2ZoJmTkpugmZmllnylr6OotcW4paKnr56clJ6inqOboqiokZ6gnaGqsKuspKuhqpunn6efq5agm6Wvo5abqJWfnJqRopWcqZedfb2DiHK0coSdhq1oeLnEuHGUo6N6ppmZcquCfMvAwLtxjKOIg558lpiJncC9gZadnYycwcF8gnyTjZrDwH5spbJvjIFvynp/m3aQg46BdXmAgHlxen+HcHeFjJN5bXiUYmdgeGRfZYJiXnNnbGRkWUxWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlFTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVUFCOy84lqO5w7WwsMGqqJSjr6iwrq2lsrOuqaSlpa+rnqqYmqKfnJqqpqGdq6KkqKSktKScopKlrau3s6etopGQmJylkpCgoZicn52Ip62lrK7BwLGhqa6plpKenaGZoaKpo5KgoJ2erK+rrqekpKihpqWdrKiRo5qorKmanKeaqp+VlqOUn6GVm37OlHh6pIF5lZabX66PXo6ogqOhfKeWm3Org4CvXmONqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3V9l4i3YoOtWqPNbpB2e9p7f5lwfYiSdn1leod2dmt8h259hZCRfm2DkGBxbHBoYF95ZVxxZ2pkZ2BSVFJXXUtPRDVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qorbOrpbKqq6qiq6auqZ+mm5mlmJyir5+gn6ino6WgnrCrmp2Vpq2rsKqoq5+UkZqfpJKPn6WXnqejn6+mrbGpwMezqKmxrpaSnZuhl5+oqZ6UoJ+dna2wqayrnKiopaKrkquylqShqqmdoqWkn66fkZill56ZkpOQl6BxhYyXdYWohnGxfZ5yrH+in4GlkJ92q4J9rX+cc61/rIeGn3aZknt8l36qiKGLkYudfat7iZWQoIF7rVedxXuPcJPBfYGVbHVwjG1ldmWFb2F3bnJviYqSjoNuk5JmcHV1cWFnbWZfb2hpbmdkV1RdYVpSU0M5SklARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCg9MSkzV0BGIRxHOkMxLiuw08bGsrOfnKKOo6KirK62rqixpaippq2qqqeho52ZopWfpaufoaWfqKiinp2wrJealqmnrquopqeel5SZo6GSlKGtm52no6+tpa62q7rOsa2mrquWlZydopierauclqCZnZ+ps6urq5ytq6WjrJqusaGnq62ll6Spp6evoJCUoqKYk5CEpGqkdYl6qXR6snCCpoqZjHGJoJqGpGBhUqyFf66Dm3atgqiGhZ97mZeFemaAo4mkmIaCo32pfoGWiK5ffKlWnqOSgXqjn4B7w67Ei3Kvs7O5cWKpr8J0aIyMmI6BbpyVcW96eHlwbGZmZXJwZn1qY11XYGpYWVVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTUqMlBLTCMgQTlENCwnw8nW1L+hmaunoK6inq+0sK6prKKnpamqqqikpqCbpJ6dpqeno5yrmaKsoaOfr6GdmpKrpLSurqCnmp2Vk6aikZuiqKCgpp2xpqapsq23ybK1qquplpGcnKKYn6WznJmglJ2fp6ytpbCbraujo6qhsq2hqbKwoZmop6yts6GRlKGllpmQe6lsnoSHdat5fLBvgqWMiZ+WlqCVgdK4tLfJgYGyX2CUqYOliIegepmVmniqyXSZpJSpqZCSm42AnYqaxsZ5Z6GCpXSBn46Cfa9db7RisHVLo4dtp0eCk2SOkJ6SfHGZlYFxe3V+fG5cZmpzcWaBa19hWWRuXF9ZSU1NS0VEQUI+QTxCP0k7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraykopuyuKyqoKWaqKSpq6qnn6ammKqjoK+rnqWgrJqeqaWdp7WeopeTqaq1saybpJyglI+lrJGanKejoaqnrqKmqKqxtcOys6qsqJOJl5ykmqGjrqWXoZWZnKWmrZyxnq6pp5+rorasoLC4rp2araawsbCikpamoZiejYKdTniagX+feoSjfYOkhYemn52flIS4e3x5uYJ/zMbCtniboZGLnn6alpeKdp+XiqWXpKl/sIWdhqCErH2alWOmbaRwj4WQgXyWgnKsYKNycICaYLx9UlV0jpKjlnt+lJOMdntzh4BxXW1ueHJqgm9bZF9qb2NlXUtNUVRBSUhGSTo5Sz9CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWVlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyc/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5ipq6SquKquoJugrLKzpZ6glaWtra2qp5ymp5ujqKGzr6Opp7KgmKiklKK1oqKVl6KptLijm6Gco5KPobGZnpynpqGisK6dpqmjtrPFsK2prKmRh5Ccp5yipJyllp6YmZqmpaucsaKvpaaYr6S7raG1taycnLOwtq+wpJWcrp6inIWP0bXDt3mHjoWRk5CApnmUoXeMoJKEpYKKcaqGhbVucmmapJyVip99mJmGh49zr4Kmm6OOpouTnYuVkJtucbJdpXSTepxsmH97mXxtqWGicXF+n2Jzsrhod4+Upph9jY6Vjnp9eZCDbmp5aXpzb4F1XmVlb25maGBKW1hYPEhIQFU0QEY+PCopNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gX11bWltYVVJSUUY6MjIzLy8rKyhAUVJUVVRTVFZXV1hYV1VVVVVRT1FbVSUhMkFIJCklknOMiq29vry5tJ6Wp6SttaGhmJWjp6atq6yZpqOfpqGhtqijqaewo5Sro46lraOdkJmaqrOzpJyjnKiRlJeun6Cep6SdqJ22mqOrpLatxLCpq6mijISOnKKgpqKVmZmcmZuZp6aoma2or6Olm6ymvayUvK+snaGusLepsKSYp6+hppZ5qJB9fLB3ioCkpYicbbJwoYetfKGPg6iVmICsiYWuhaCVqqCil4afgZqVgHuSfquAnZqXi6p3naCSipSSgXqvXqSBfaanZJ1/fJdyaq9dpGpwhpldYFuMoG2VkaaZgpWPmo58fISagGtugGN/dG6AemBnZnFvaWhnQ1phWz1LVTNVOEJCQzgkJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWldTUE9OSTcwNDIuKixBVFZWVlRUVVRVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2SmoOoxcG2wLOemqygrbelo46bpKKgsLCrn6Wgnq2Zn7mho6ugr6maraGQq6iklombkK2wrKaepZutl5iPrKGhnaWhmqWdr5miqae3qsGvpaiknouAjZuan6aekpSYmpSbmqalppuqrK2kpJ6pqL6llsGqqaGgqrC3qauknrKtpqiXda9+kIuchYd+uq2KmWWwjWWVrX2hj4OnlZqBrIqEsIWmmqShopGFoV1sa4GzYH+te3uDgbFtZ26ZmY2JsVt+tVykhGvIomSfgHu7V3a1WbJ9Uq6AeqxXgKFtl4+om4yYkpqZfHqRoH9kdX9jhnh1gX1ia2hybmdmZVBVZFxBVmA+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRXWl5gYGBhYl5fXFtYVVBOSkdDNTUzLi9AVVlYV1hXWFhXV1dXVldXVldYV1dYWVpaW1xYV1dHQjvSn7Kxtr26s8GyopyspqS1qKCKmqCdnLOzqp+koZ62maG0qKqsnrCtnqucla+noY6Im4+vq6imoaWZrpKYj6iZop2ln5qko6aaoaOqs6q9r6Sonp2OfYublaCgmY+RmZuSmpipoKOaqa6opaWipKi6np/EpaOnn6mys6qspJ25q6qrlICpkqOvjpuAh6SXmZCCgLjDuoOOnJOEp5ecgqyKgq+Jp5ybpquRfta9wqpipL+9fX6jgoPXu7i1hpaUhJ69voRto4Jvq4RsnIB6srDHg2mrsLysd3ahvrxzgJaOpp2RnJKaoHuDk558Y357ZY9neoN8YWxmbWtjUWFbU2pcQFViQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc4Oz5BQ0VHSUtNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5Wzs7C/uLG8sqKcraalsqadi5ilwKq4sqiiwKeos52fsp26qJ+ur6WmlZSwq5eMgpuRrqWirKCjnKqfl4qjk6eep5yboamkmaCirK6quq2oo5uXknyImZGlm5KOkJeZj5iTqZqhmaqpoaqnoKOqup2ow6KfrKGpsLKoraeeuKWsrJlzdqqkuIZkiaBwaK6Ri5BubnekkJmfgXWumZRwj4txlqikm5ivpHNtbW1mi3hvboKZcIF6anFpZ4qYlplyaWqFiGdxhmRdiGJqb1lcZn12pl9hcI2QbmVlf4yTj6GZmZqTmaF9iZGYd2aIeGmPbHuAemVtZGhtY0tkWEprWjtRZkZRJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREZIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dXV1ldXl5dXFxcXV5dXl1bW1VXXqmVrLOoubixs6qpoa2eo7KqmJK/s8XLvrern8GtrqSiqa2guqOkrqytpY2WrqmPi4WWlqyepqqgnaSjoJGLpJOnmamal6Sropefp6aosLurrJqbkpJ8hJeNpZiNkZCYlI6YlaiVoJmpo5uwpp2iq7mfr7+no7Gkqq6vqKuppbWirLaViqGpprediZajmYiqm5GVnZKps5maoqqgspaioZ2fop2hpaKVrKeNk5ONh5OcnJWRmZOZkY+WhoGlm5mWj4yUlIyQh4R+Z4l+dIJ1c4eKcKdsepOPk5GAgY2OkI+dlaKXmpmlhImXkXRrkXdyjHh4fXpqbWZlcGVVYFlAaltIZGJQWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVdZXmBhY11eVFFLRUM+OT1AQVNYW1xaV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCmlqmppLS1rq6isKOtn6C1sZCNrMi+xru6q6Omn52nn7KqpLennam1p6eRmK2ii4eJj5unlaykn5mon56SlKOXqJqompWnoqSRnKiaoba7p6qZmpCNfIGVi6CUipWRlpCPlJemkaCbqaCctaOdpqq2p67AraK1pK2trqqnprC2n6y6mJGlo6e2opKep6COqqCOk5+jq7CaoKOwqLCXo6Cco6qfnp6dl6yek5qinJSQlquajpmZl5GXoJKIoZ6XlYeTjZGOlYuBfmWLhXWGdHeHgnOcaoaOkpOPiX2LlZKSmJSjlJ+ZpIWJm4p9dJd0fIyAc3yAam9mX3FqYFtgWm5kUGFmUVo6R0dFPjI9PjkvKiYrKSYdJjMxNjY1ODk9PT9BQUNJSkdKS0xNU1NUVVpgYGlhZVZQS0FDQjo5RU1WW15eW1pcW1tbXF1dXl9dXl9gYWJiYWFhYGJiYmRiXFtjl5WjpqKvsauuo6mmrJ+ntaqQkJ2ktb2wra2jpJt8n6SzpaaxqZebuKajlJmqnI6Giomcoo+unqKVqJ+gkpaZm66LqpaPqpqpjZqpkJ+5tqSlmZyNiHmBk4uak4qUkZOQjZKXo42fn6ien7iif4OutaKurnSiu6GwnnZ4nqevuJN0q6OeiX+rf2RcYnagjqWfhJh9bZKznaKmraqjZZ2fknN5mpdxgZmpmG1/o6iKZZymnZKXmJaMk52Rhp6bkZaEk4iQkJKJhXdqjoZ2hXB6hX9/YGiHipORilp1lJBnaI+Pc3yonJxme5uKhXqZaoaMhHB6gGtxZmB3cGxraVxmZmJjcVRbPk5OTlNHPkBVRDoxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXGBoZmdXUUo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpaKgrq+rq6mlqK2ipq2lkpWrt7Gzp5usqK2YdI2fsaCoq6eUl7mgoI+cpJ6Rf4mIm56Mq5milaehnY6Xkp2Fdq2PiaecqpKZpIqcu7OnoJmYi4h1d5KNlpOJk5GQlIyQlKGPnKGnmZyxlYGMm7Scs4ySjbmln32nonmgrLR/jY2lnoOLhpCxqq+Ni5ekm3qBi6yFnJ6hpqinh5WFmHelm3qHnIGXp4OCe52zeoqGoZialZiWgpGXl4SbmmN6h5GFj5CSi4NtcI6HeX9wf4CEfYVzhYOUkXeWaJJ0oJp0fZmEo6CJmH+VjoeGmmuQjodseXxycWhmeXBqbGtcZWxqZ3VdXklUTFJARTYuW1VVNykhMDk+Pjc0MzQ2ODs6PT4+QERJP0lFSkxHU1hbWVxiYWhmWVFIOUVMOz5hVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kepaysq6esoKewpqapppmTr8nAsqKXqKq3n5GFn62cp6KgjpC+npqNn5qgkH2GjpmXh6ucopagoZGNk4qFgJKnjYejnqWVmZ6HoLqxp56bko6FcHaQiZWQipSPj5uLj5KgkpihpJaeq4eftIm0ma2KyoaorIi2hYyvga6rgqiMppiNnX2oj3N7d5yPp5dolaR5tIugnaWnkpjCgH+riJihcp6AmqV+l4WVs4GhfaGUoZCYl4GPlJyLmZKMfYWTh46WkoqDbXOPhX55cYaAg3uDdISAlYCPxWZ/qYePo2uehaSdhZqBj5GJjJpxkJWGanl2fHhoaXZxaGhsXmRwbWduWWdHXVFNM0U1N05iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSkpMQ1BaXVxXYl5qbVxRRT1LTUBJY1hdY2ZoZ2JiYmJkY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJahnq+mp6ilq5+kt7Cpq6ealaCjpaylmKasuaSwgaKpnaaenYqUvJqTjaGSno96hJaWkYermZubmqKFjox3mpyPn5CIn6WcmJqZiKO5raSZnI2MfmJtj4qTkI2QjI2XjJCSoI+UoKCZoad+oaeHrZ2fla2PnJuckIR/oIyorIWjjamZjJp/onWBmZRrgq12Tat4h42ckZqnpoCpq32DoXt6p2qef5JsZ5iGmLeJnn5uYGRZg5eAjXxkaItymX15lmxdfZduX1Jwg1xfa3iCX1hkgHyDf5Zwp6prg6NucqVwn4WgamegbVxwjn5nWmCEgWNYUXB3Zm52dGxqcF9rcW5sallpT11YRjlBNUhFX2w1LElEUk1OPTg0ODU5OzZAOzs+QlA+UVJMTUJKXF1fV11eY3ZgTUQ6TU9OVGFcXGZmaWliYmRiZGRiYWJgY2RjYWNqa2RiZGRnZGJnZWFjaJeVnJ+4n6mjpqyRobW7qq6jmZihoqWtrqGesLakqZOioaCnnJqOmbSakIuejJWLdYGUko2Kp5WVmZ6ffpOFhaylh5uQi5qqmZubkommsaehlZqIiYBpboiHi46OiYuNkouQk6OMlJ+fm6Gkf5OBj6Kgk6B2nJSOp4GfpX6Fp6qCpXiJfISafqJwc5SIlnyfjXlthpuMmY+aqJmOh517gqJzdqZmnn53pF+Yen2UdKJumLe0unSTiIOAtahkgca4e3CVtoxygJqjY3Osq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRgnZq0l3N9mJ+zdXRcnrKDa2NwdXhyaXBZa210c2ddal5iTEU9RDZSQlpzMz1TR2BKUj08Mzk1Ojo2RDs7QEpQP1VNT1FARV9fW1pYYGB8ZEhDOE1XVVdiYVplZmtrYmJlYWRkYGFiYGRjX2Bja25jY2RkaGRiZ2ZjaGiTlpSit5iqm5OfjaS3tK2soJqinaSkpq+dnLOvrZSZopuhpZqblZ6rm4uIknmLhXGBlo6KkKCPkpSemH2Rio6ooYeXjoqSpJWdm42Mqailno+Xh4R+anuGfn2PjYKLkJCJj5Shg5een5yfnouJd5yYoYyfcaGKhqmHmqONlKWofK2MfnqgmXqjk3iBdJaIjZx9lp+Gm46YmqWFomShfIiWkJuNbZ5om45vmpl7gIunfnNpdKuDn4N0qmiVml2bhXaFnmeqa4C4Zlyob4GcYJWMXqd2dYeIfp1nmnWGk5KXjoCfb5qRb6iaXql/ebxsf6pcjoRdtGhdb3J7eGxqXHFrenpkYGdYYkJRRk83V0RSbzVLW1tfTlpEQDE1MTw7N0g/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOXF5ZZGZYZmdubWJiZV9hYV9fYGBlYl5iZG9xYGRlZWtlY2loZ2tplZuIqbOapohjlJururGwrJ6mnJypoJ+vnJ6yqa6fmKWcoaCZl5ago5mGiY1qiYBye5eIi5aWg5GUmZB6i4SVpJyKlY+GjZ+Tnp2JkKmjoJqMkoqAgGmBhnh/lox6iI6OiI+Wm3+Top6foJOYcmifiZ6Oi3CSjICphpedoKSepXuwraOiuJd3o7OjpICJlHmde6uZfqKOnJqWiJdxoXyFja+1fWuakaF5fpm1o6SrqISZfJt9npt/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iiaXF7jmyAiIOZdZt4homxs3+Am5Ond4OebnR+lXCadGukXpV2SGVkYXRyf39vZmFsaXd8ZWViUV9XXlVXQFpGUWhFVFddYlheSUQ9QjhAQTpJRjhMRVhBV1JbV0RGYlxaYEtgbX1yRUI8VV9iWmVpVmdobW9iZmdeYWFcXV5gaGJfZWR2bF1lZ2ZrZGVsaWlraZOcgK+smINTXqCms7mysqmao4ycrJydqpWiraWjqZCgn52bmpaYoZ2WiIeJd4aCb3mVhZGbi3yRk5eIcoGJkaGbc5GQgYmalqGcho+qnJuVi4uKfINshIVxgaGLeIWNiIeTmZZ8k6OfnaKIrYZ9tYSNnZx7pZV5qYCUmo6Inpp7p2h3bX6ZdKFzcnyehplwk4OufaODpZ2YgKNvXqhndaJjb6VhnNOQfXuZeHN0YqKGkX+jdKSQdmuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdnG17cJZtf3KicV2kZ3OmYGimbZvUmn2Gm3B7e5hsnH14mHNuqaRnYWZ6coGFbGhmZW93eGlhY1NcZ1JSYkhYSlVhWFRcZmtcZVFFQ0tNSktCS0U4T0BRTlhTWU9TUWBmZWpSZHd5d0lGRWNeZlpoalRpaGpvY2pnYGNfXV1dX2hiYWllfGReZGdka2RqbGZobGiXmn+vq1RbSn6pr7Gzr7Kjm5mFmaqgoqWPpqmhmquLm5mZlJmTk6GYjoiGe3B9hGh9j4OVm4F3kY6PiW9/ho+TkmyXlHyKk5Sll4OPq5uUkouGiXmDdoiAboGfhneAkoaImaOXepSiopmfibOhoraLeaynpK6lb6h/mY2FgJmPeqR/oZmGmHKehKSur4qXjICNpI2Vgq2gk3a1trXJoXOUi4GfYJ6XqW16lYehnHWiiHegfpOYi4FwTWajknCah3Ole3l0YYOBa32ga3FkX5xxfXOWaHpps7WzxqZymH16nWucm6t2hZtueHmYapp8dplzUUV9s19qd2x6iGdraGN1dnFvV19UWWlRU2lKV01ZVFZeaWxvVmdXTUtBSk1LSEtPQlFLUGVjam1ldHJzf3l8bnWJe3tUUU9sXmlca2lSamhpbGdsZmNlX11dXV5pYmRpa3tfXWRoY2pmb21laWxloJuHrqWDZD+TobKqrq+1oqKQgJiqoqOmjaaon56nhJuYl46XkJCck46Ig3pqeYdlg41/mKB5dY+JjIJphIWRg4yFnY16jYyXp5SEmKqYjJGLgol6gH2LeHCQoYZ5gpWHiZaglX+UpKablZWDZm54nGyiZHtwpXebl3BlpoCUiXqkeZ+Wg5dznneBipWXj7lukYqiYn2YoJSIbXJpqmt1oG1vpmCbaYuQaZaHm5Z1ooF+mmCMho11b4hiaKBlnn5pm3VvY2aIgW1xolleWmKhbF2Ii216fXNxZKVteKJkZ6domXOMmXCicFWJkHCgYGaoVYteVJhubnRsc4NucWlreXRrcFJZV1dmWlRtSlpQXUlYaWlzallrVlFSRlZdTFhTYlVpa194dHt9cHx8coN7gHN2jYCEdl5ScmJnYnBnUGpoaGxsbmhkZ19dXl1gamJqaXZ0XVxjaGNqanNsZmttY5yjl6V5ZHNsiqato6mwsaafjICYrJ6fp42jopyko4GWmZSOmpCMmJCOinuHcYCIaIuLfJmbc3WJfpB7ZYOGlIqJlZqCfImImKiSgaOtkYaQi4KKfoCAjnJpj6aEfYeTjYmYoI+Hk6mlnIimeJWbfqWIloqxl52Pgq6WnqR2k4V4qXOlj4SabqSijJKEjYO7bn2lr4OGhYaTlZuffKV6cqiVoJZnnn5vrGSWipaTd6htqqKBiXaJg3irkaaIa5Gwa3azjKlrioVtbZ+ekZRffauLqnZ9foqknXaffIOklZ2gapuIeKxon66MtnV4vo2kk1qDp46rYXZzdXJ8dXFja39vaG1UV1tWYWJdbE1dUl5KXm1vd2BbcVlcYFtndWVub3JicnRgeHp+eXJ5g3OEfoF7e4yBg4B2YnhkZG5zZFJrZ2hvbHJqZmlhX15cYWtibGx6b1xcYmlibGp3bWdsbmKVpKmbgH+do5apqZ2opq2kmYqDmKybn6aKnKaeq56FjZuQh5yRhpKNjI10h3uIhHCNhX6Zk3R0hnKRg25/i5GHhZSPfXyDh5mnj4Cnp4+BjomFlXaCh5JubIupgIOLlI6JnJ+JjJOpop+Of3STl4h+gXiTrqJ+gZpwj4V2jomCfXtyp4xxfn16mJabhJB5e39+h5SVk4p2kJidoIN7fYlrjIVbeXlyenFpbn6SinKAdYGPlJRxh4SDZYx/YIGAi3d1c5R1b3lubYdsg4ZedWd3jmV/gIWMp5l9dHuVaomIcIF2fYd3bm5pjXR6fJh4hVxsWHmPaW94c3NweHhwXWyHb2poV1tgV11ma2RXY1VfUmBweXlta3dnamtrd31yc3VzYW92YnR7gnh1eYJ2f4CAgXmLhYN+e25/bGR5bl5WbmdpdWt4amlpZVxgWmNpZWxxdG5aW2JsZGxseW5obG9hjpO2p6aKoKGapqOYpZyroqGEhJitkp6iipuom6qYg4KcjH+XlIeOiomNcoN8j31+j4R7mI90coRxlYV7fJGLhoaQhXl+gImbpY58qKGLhY+QhZWCho6YdnKEqYaOkp2QiZ+eiIyapp6fqoOIjZWafn6IlqynjpGlj3dum46BeJBufaiFcX6VcWtwfYKgjYCTjotobFyCi4ubmp6Oc5WLiHF0a4J3dIFZcm6HkYJ+f4xpXWple4aEioBgaXl7m3uCi4J1gYWBZ3eKhmpgb3GAdV5xiYCIjqWThGWLjYNud4uEcYaPenFoaWZ9hHuWW11raG52XHx6eHZvdHODaF1ui2xsY1paX1pZbXJcYGJaX15mdH98dnB1ZGtra3x+c3x5dWRudWhtfH52enx7eXqAgX5vhYmEe310fnlzf2lUXHFpbHZwdWdrZ2RdYVhqaGtrcXJuV1tlbmxnc3lvaGptYIuKqK+gj6KgmZ6dl56YqKOifoOZro6glYido5GmlYB8mYZ9kpmKiYeHi3N+gYx2hYuChJeKcm+AcpiGhH6Rg4SGioF7gYWNnKGRg6iiiHiOl4mVioucl4SDea2CkZialYqenYiIoKmeoaGjioeTm5yimZWpoKaknpGahZOLeXaMjYOnfn+SkJOUnbKmm5WfkI2xkpeDpIuMlJqfiZCbgoiRimt8jnd4ZYOHkYt8iZ6Eh4yRiYmBhYWQd3x6dJqgiYaKnYmEk359ioB/dG5zhIF9doWGiY6jj4KEjIaCjJCMfYeMi5GEem6Fhn56mWtzaWF0i3F+e3d3cHd1gl1eb4dobmFfWl1dU2lxVmVdXWJtaHZ8fXRvcGVrammAfW55gHJqcHFtZ4F7c4KBeH99f4V6bYKMhnx6eHt9eoR5TmR2anNucHpla2VjYmBbdGVwZ3JxbVZebHRtaHl6cWdpa2SMh5y4npahoJeUmJmUmKSgnnyAmqyPn46GoZ2MnpZ+eZWEfI6aioeEhIdueYGBc4GIfomUhG1rfnqXh4SDj36AhoSGfYiFj5yflIisoIRzipCGkpGLnJF9jXqqhI6TmJePnJaHhpuknqGZnIWCkpqZmI+Zpp+knJuPlX6Oh3R6hY2DpXt9j5CRhpiroZ6UnZCOqY2QgJ2LiJOZnoKPl36GjoNweIZydWB/hJCGdY2ZgYOQg4eFf4aFlW55dnSSooqMhZqEg4xzf4l8e3FweoaCenaIjYORpI6Ego6Ag4qJineGiYuNfnJugIJ9b2lsbmheeoBofn13dnd1fHhdYHF+bnVhZFtdX1JnblRmXF5ia2l3e39ybG1ka2pogX9sdIJsbXVwenCGeW6HgHaCgH2FdnGCjYh+e3x8f3yCi2Boe2p1aWmCZGpjYGlcZHVob2J1bWxVY3F5ZXB6e3Nlam1ti4ietZmgop6SkZWYipqfn597eZ+nkZyLh6aVjJiZenuNhn2JkoONg4KDbnyAeXOAhX6Lkn1raH2Cl4mBiI18fYaFh32Qg5GdnZOKqZ2BcYuLjJKGoKGJhYx8p5GJkJOYlJaTeIyinp+dlZh+gJCamJKLmqKgopiVkJl8i4J3f4KOhqB/foyNj3yYpKKik5qRkKaMjoGakYmSlpt+k5J+h46BdXSCcXdhfoGOhnKLl32JjHKNf4OGh49peHJ4jJiRj3+WfoeJcoGGe3tvd3qJg3l4jouBlKOSioSPeoaGh4R2g4SJiXxodH6BenxybWxoX35zaX12dnV+c4FrX2F0d3F4ZWRZX19Sa2lWZlpgYWhqd3qCcmdsZGxoZoCBa25+aG9ybH95h3tsjIFzgYF+gnR2go2Gf3x7f4F+f49pcoNudGlhh2hsYl9xVnRvbG5geGhtV2p0dmN1entyYmpveomMnrCRpKScjo+Xj4acoJuefHeloY6YgY2ji4malnl8hoh/g4p/iYOBf3KAe3R2goV+i5F4Z2N9hpeKgoqLeH2AjoR5l4OWmZiOl6Gcf3CLgZGThaWbiI2Jg6aVhZOMl5iSkneRnZ+gl5OWeX6Ol5eNlpqco5yXkZOZd42DgXaDlY2dfoKJjYxzl6OfopSZj4+hjIqClpeDkpWZfpiNfIiNgXZxfm57ZIF9i4VxiJSAkoJsiYSCgYqFZnZve4WRmIx8kniLh3t/hnt6cH13iIR4go6HiZaflIGCinaIg4OCd3yDiod4Ynp6f3V/eGhtZmJ/amt4dHV3fnJ9ZGRhc251c25hWmFfW21lU2RZYWFpa3Z6h3Jja2NtZmh9gmxpdWlucGmAfYJ6bpCGcn+Dg390fIOMgX9+eoKDfnyQbXaJc3VtZYpsamJidVaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5uslqanno2Ml4eGn5OXmX54qp2LmXuYnoyMmZB5fIGMfn2EfIGDgXh0enp0fYCEgImLgGRffYuUh3+EhnR9fouAfpmGl5aZjqWjmYBzh3uTkommj4yOipKgkYSSkJWXkYuBjpeempGPkHJ/jZGTiJycnqWXlouTlXGLi4lrhJePmXqIiI+Jb5eem6SUlYuMnouFgZGcf5KSlYaZiHuKioF6cXpsdWx8f4x+boaThJV4cIOEfn+LgGVyant/lpeDfo10j4eCeIZ8dHZ+fIR/e4GKgoqSoY94g4F0iYd9gHR1gomFcWN8dntyfnBicGRlfGNvcHdzeXh0dWJ3YHBsdm5wXVxgXl5rXlFeWWNhaW50fIpsYGplamNod4duZ21pa21ogX17eG+QiHOAg4V9dIGGiXuDfXqChH19jnJ5inh4bWyHa2hfaXJjh2dxb2V3Z25sYXppan17eHBheG2LgJiYqZ+jqJ2JipKGip2LlZl+eK+ZjZd+n5SRl5SId358in18gHd4gIBwdXR8cIZ8gYGKf3xhXH6PkYaAg4JyeoCIe5CTipOTnpSnnZWCfYF9jYqRo4mOio2Ymo2GkpmUlY6Jh4uRm5KOjIxthJCPkYiemaGglpSIlY9shpeCZYSYjpN6iYSQinCWm5Sjk5KJi5mMgX+Qnn2SjpKMmY57ioWHdHN2bHFudn2LdG+Gko+TcXWBfIKDiX1mcW15fJmTfIOIdJCJgHOHeG1+fH+Ee4OKhoGLk6aLeoZ7fYqEd35xcIGHhGZpenV2cXxjX3Fha3RfcWt7enptc3Fmel5vbXNtc1hbX2BibFtRWFllY2dxcoCIZ11qaWdiZ3GNb2RqaGVpaYF6d3ZvjoV0gYKDfHWCiIZ4hXx4hIV6f4l3fot7e3N4gmprX3BodIBrcm9tcmdvbGV8Y26AenZxbHd3in6il6GnoaabhouLgY+ch5OddoKslpOOh6GNlpSQgHR8d4V4eX9zc3uGbHNwe26KdoCBh29wW1l+kY2HgH9/dnWBgYGhh5KLlZ6ZopaYeYp/gIyInJ2Kj4aSmJaFiZWakJaLi4uNi5uJjY+CbYmLkJCJnJahm5aThJaGaIKhgWWEm4mQfouDi4F3k5mTn5KRiYiUjH59jpd7kIyPjpqSfIqAgm92cGxtb3F8hmp0hI+Zi3F3gHWCiYN6Z3NudYCZjnqHhHmTkHl1h3Nvh3qEiniJhICGjJmhhnuDdYGKf3h4bmuBhINfdHV0cnJ5W19xYXFrX3Brfnxxbm5rbndhcHBrcm1ZWWJhYm9YUVRbZmdjdXCFg2Nda21kYmZrkm5gZ2dfaGuBdXJzcIuAdX+DgHl2gIuAeIV/eIiGd4OFfIaMf3t3in9qcWN8Y4Z8bnFtdGpob2x2eGBxf3l8dHV0gIN+pJWZrJ6nloSNhH+XlIOQoHaMoJWThoubjZaOi3pyeHWCcHKFdHJ3iWxwbnZtiHaDfoBtbVVRgaqUhoN3fndyhHuDooSUg5aUmZ2Tm3mSe4OMkqOZk46JlZmShIeXmoyTioiNjoacg4+Je3KLhYqOh5yan5qUk36SfGaDmoVmhZ+HkYSRgolxg5CXkJyPj4yLj4x3epGQeo6KjJKWjHyIfIBrdmtva2xte39hen6QmIJ3e4J4g419emh0bHOGlYp9h4V7ko5xeYNvdot5h4t4h3x/iY6cm4N7enaBinx2cGpsgoR7YXlxb21zdFZfcGNyYmBtb3pyaXBmZ3V1aXJsYndlXVdmYWFzVFFPXWdlXnlwiX1gXWlyYmJmZpFqX2hlW2dwfnBscXSKfXZ9hoB1dn6MeXuFgXiIg3OGhX+MjIN7epR4ZnFrg2CIfW9va3pgam51f3VfdH15h3h0c4V9eKCPmbCcpY6Ci3+DmoiAjZ+AjJqUj4WImI6Pj4R3dHd0gHFwhXRwcoRwbGp3boNufX1tdHNSTYLfyJLWkntwdYV3haKElXiWkpqdkZp8lHOFkJ6hkpOQiZOclIZ/l5aIjI2HkIyHm36NgHd6jH6JjImcm5yalJJ4jHRlhpCFa4ehhJGIl4OGY4yRmY+Wi5eMjYqKcXqTiHuOiIqTkYl5hXt/bXxlcm9rbXt6XIF6kZCBe36AgIePe3tpc2pzio6IgIWEfJSKbH5+bX+JfYqGe4N4f4ySmJiJfHV3g494cm1ncYCFbmt1cGprdm5UX3BlcFpgbXN5aGxrY2d5c3FxZGB4YWBWbGBfd1FOTGJnY116cYp2XVxldmFiZmWOZGFnYllpc3Nua3J3jH10eoaCdXZ+i3N/hn97iX9yiYiCkIqHfH6YdmVzbnxliH5vcGyAWWxueXlzYHZ6e413c3eKd3mei5qump+QgoV3iJV+fYueiIagko+FjJiEk4+HgXV4cHlxb4VwbW9/c2VleXF9bXl9amhrY6Sawdyu8KBybHaFd4alh5NvmJKXopacgpJyhouil4iNlYqQnZaDgZaQhYmPgJCJiJV9hnp0f4l3h4SNm5qYmI2OdYl1bISHiXyJooSRiZyEhV6Lk5iLj4mOi4qEiW17lYF9iIWJkY+GdoV9fmt9ZHh2a295c1iJe5KIhnp/gYGGjH96ZnJpf4mNiYGCf4qVhGuAdW2Gj4COgnyBeH2Nk5CXj3Ryd4eMdXNxZ3V6hGN1bnFja3doU2FyaGxWYG91emFzZGBpf3Fzb1tkc2FiV25bXnlOTU1lZ2Jed3SKblxdZXlfYGVlhWBjY19ZanNrbmtzeIx+dHeEgXh3e4lxg4R9fol7dIuJiJaGi39+l3NodXF5bIx7bnRxgVdxenZ5cmR3eYeMaXeAinJ/nIaYp5yjkoR9cYyUeHmMnoWGoY2PfJaNgJqIhHtzeHB0anCCbGptfXVfYXl3e3F1e2dgZHzr2rXJw9yHcmx0g3eLnYuPa5qRkZ6WlIKJcYSIn42Ei5WKjJiUfI2TiIOIkHuPi4WOgH91eIOEcoiBk5uWlJeFi3WGfW6DgIeGl6GCk4yeg4lhg5SPh4qGio2HgYdpfJN/fYODiY6NgnGGfn9xd2h2c2p1eGxajX2ShIZ+goWChYuDd2Fya4eBjomAfn6Qj3xtgWt3hI2EkIF6gHt9jpCOlIdtcHmMhXRrcWtyeYJhdWpwXmx3YVJlc2lmU2Bxd3VhcGFdaIRydGtYaGljaVluV1x2TUtNZmdeYnN0hmtcXGV5X15kZ3thZF9dWWtvZW5qdHiKfnN0gX57dnqIc4WCfX+Id3aKho+YgYyCe5N1bHd2eXiTdG54e31YeoZxf29neHeSgmR2hoZwiZaFmaGaooqHdG+SjHF3j51+i5qJin2gf4SagIF4cnRub2Ryf2lnbXh4XGB5e3txcYBpYWdhf9W2j5Gmd25xeH1ylJKOiWybkIqdk4yHe2mHi5iGgZKRhoeYjnyNjYGBiY17jox9iIR6c3qDenCHgJWZjpOSgId0goR0gX6IkZuehpWPn36IYn+Th4WJhYuNf3+CZ3yQgH5/goyPkH5tg3yDdWxtd3V0d3ZsY46CkIGGf32GgIWJgHBfcW+Ee42KgHt+kId6cINleYGIhYqBeoR8fZGMj5GCbW55i351bW5qbHx/ZGlsa1pud1lTanNpYlFjc3htY2ZeWmuFb3VjXGhfZW1gb1VccE9JT2dmXGhvcoBtWlxjc2BbY2x3ZWVdXVpsbWNtanR3h39xcH98fXR4hniFgn2AiHV5iYGSlXyIhnaIgG94eXuDk29ue4F3XoN/dIJtaXp0lHNnc4h8cZGQg5qfm6CGiHZ2lH9td5SYf4iRhIuOmn2Mmnd9dnFvbGphdX1nYmp1elpgeHx6bHB+ZWNnZ1edj19ydJe+xYV4cpaLkYB0mY2HnpSNiXNqiI+VgHuUi4GEm4x8ioZ9fIiMfpKHdIeFdnZ9gXF1hoGelIaUjoKCcX6Gc4J6iJabloWSjZ2AiGZ9k4KBhoSKiXKBfWd9i3t5f3+Hi499aYB9hHZmcHl4c3h0bGuPhouCjIB6g4KEhIBrXnB2en2Lh4R7gI5/fnKAaHeBhomEgXeCen6Uio6LfG1reoh8dnRvaGh+eGVdcmNZcXRUVG9zaWJOaHV5Z2FeXVhwgXB1WmVjXmtuYXFQWmxTRFRoYlpsb258cFpbXm1jWmNvd2RnXF1ga2pjbGlzd4KDcW9+e390dYN6g4J8goZ2fomBlpB4g4p0gYdyeXl+jZBvb3uBcWqCeXp+bm18dpVraniEdGuTjIWemKCZhYhvfYx2anmZj4CDi4OWmIp5j5ZveXNxbGpkYHR7aV9mcntbYXN9emZwemFlZI6xsndLY1ql29KYc3yTjZJ6gJeNhpqSjYdvbIWSkXl5k4aAhJmKfIeAeXiIioOUf26JhnFzfXtqeYaDpZCEkoyCfm59gXSBd4SZl5OJko+UhYhwepKEfoSDiYNugXhogIV4cn9/g4qHfGV8foR2Y3FzgGl6cW92mo2HhIx9eHmBhXuDa1xvfHJ/hoOIfISHeohxgG1vgoWNgoJxg3d/loqMgnZsbH2EfnZ6ZWhqf3JhWnhcWnJuT1hydGdgS253dWJeXFtZdn90cFhnXmdrcmBvT1hpUz9aZ19bcWtnenJcW1lsZVlkcXlfaF1eZWxoZmtpcXd/iG9sf36BdXCCeoCBf4OAdoGFiJeKcYKNcXuFfHp5hJSMdWt6f2xwfnV/fm9yfHuTcG+Bf3hnkYqCoZidkoOGZ4eEcGd6l4p/gIWCmoqCfI2NaXhybGxmX2Fvem5fY3B5XWRsg3pgcHZfZGXV676LMzo+jI+Ac3qHi5GPeIWZjoCUj41/bm2FjIt1fI9/hYKViXyDeG52hoWClXZth4RrdHt1ZXmDhKeMg46LgnxtfnJ0gniEmo+Kj5GSjYyHf3uSiHmAhY6DbIByaYB/eG18fIGKg3dheYSCcmRxaX9udnJ1g52NgoGHgHR2foBzgXBba3xzd4iBiXqGf3yIeHlwaoaCjoKIcIB3fZOIiX1zbWp1gIB1dVxpaXlxWVd+VFtyZk1bc3JmXEpyeXFeXFtaXXaAdmpaYltoZm9kak5YZ1I+X2ZcXnZmYHVxW1lVb2RaZXF5W2heYGZtaGpraHB4fo5taoGEf3lugHt9gX+Ce3aCgoyThXCAi254fYB7e4iTiYBpe35qdHxyhntzd35/jHp4hH58a4uMg5udloyCgG2Nfmxpf4+OfH5/g5SCf32KiGt1cWdpY1tjZ3NvYGJsdWFocIl6YXNzXmJkm6CQbl02W7C2dWuBi3+UiHeImYh1kIyKd3BthYKGdHmJeIl9k4h6f3NndYd9fJZub4V9aHZ5bmV6iYWkh4CGjIl9bX10fX97ipeGgJOQmImLhYp8j4pxfH6GfGl+bWuAe3lqeneCh4FyX3eCfnJkcmh2g251fIaWk4J+g4FweHp8dX9tV219dXOJgIV2hnWBiXp3cmyHf45/g3F9e3yQhod5bW1obIKBdG5caGZ1clJcfE9dcl1PXHNwZFZLdHlrWFpZWmFygXZiXl1hZ2RpamZPWmlOQWJlXGF3YVx1blhYU3ViWmVvc1hqX2Joa2dtbGlwd3yTbGmEin19cH9+fIF/gnt3gICKjIRxe4dvcneDf3uJjY+Ean57bnh5dot3fXiAgoeAg35+em2EjIiYo42FhHt2i3lrbYWKknl+fIKSgIB+i4NwcnBjZl5YZ19wcGBhaHFmam+JdGFzb1thY2p2e3+/nailyrlyh4Z0lX56iZWEdZKOh3JzcIN6gnN1hnSId5SJeXlxY3aFeH+SaHGDdmZ2dWNqfISInoJ/fo6NfHF9coJ3fY+OgnaVjZSQiIKIe4mKbHl6gHVoe2lsf3lzaXp2gIN9Z2B3h31ranRofIFqdoGNkpZ/fH9/cn13fHV/YlV1e3Fyh4GBe4Jwhol3d29ugYCLfXx3fHpzjISAdGdwZ2uIgXFvXWhjdG9MZndNX29WVVp0bmJRUHV5Y1NYWF1icoN0XWJcaWVlZGxlUVxxSURlYlxkcl9deGhVV1Z4XltmbmlXbF5hamdlb25pcHd6k25piIx5fnN7fnmCgYJ8dn2DiIaDcHeDc253goJ+iYuUf3GAfHh6eoGLdYN4f4GBgoR6gHVufYmLm56IfoZ7d4d8aHWHjZF6f4B8ioaEd4+AZ3BuYGVcWGVabnNhYWFxbWxoiW5gc2lYXmNtgHep2qnIh4izc4t6cY93fYmRgnuUi4B1dHV9dn9vcH9uhXSUhnh1bGB5gHiHjWRxgm5ndW1bbX2BkJOAgHiSkXx3emyFc32PioNylYqRj4iGhnt/hm51d39taHdlbXx2bWt3d39/fGBieIZ6aHV2Y358aHWHj46XfXaBd3KAe31ugFpWcXxvc4GFfX93a4iGc3hqc36Cgnx5e3d6cYl/enJmcmRsi4Nsc1pqYHZmSW9vTV1jWFdWeW5iUFN1d1pRVlheYXOFcF1hY25lZF5vY1Vec0dDZ2BeZ2ldWnxjUlZddltbZ2xiV2tgYW5mZmxwaHB2eI90a46Ndn93eH13gYSBfHV9g4iIg29xf3VxdX6FgYmNi3t3f3iEfH2Fh3iIfH2BfYSAe35ydXiLjp+MiXuKd3WDel5+h5qNeYeEdIaHhXeJe2JubVxiW1thVmp0ZGFcaG9wZ4dxYXFmV1xja398ys6HuqJrbm+MbnOGc36GjIB7koV6eXR5dHR6amx2Y4R2koJ2cGdefIB4iodkcYBqanFjWG17hpyIgoFyl5N2fXpthm9/iIqGcJaOkIiGjIR7eX9ycnB+Z2hyY254cWpscnh9fHldZHmAeGl1eWeCd2h1iIyPln5ziGtwf4B5bn1dV298bHJ9iHqAbW6JgHB2ZnZ+f36AdHpveXKFendwZHFgbYyBa3JXa195XUlwbE5YVl9UVXxrYk9UdnNSUlRXXmN2hmpeYWtrZmNab2JZZHFIQWldYWdfXFZ8Xk9WZnFaW2poXVhoYV9yZmpocWdxc3aHeW6UinV/e3h+eYOIgHV0f4aFjoNwb3t4d3V6hoWGjIZ6fH91i399hoSEh39+fn2Gf3x4dnl2kZSffo19i251gHpkhIiYhnOSi3CFhYJ6g3VjbmpZYFpdXlRoc2VhWWRycmeBcmFrZVdaX2l/eL6ue6C3bmN1iGl2fXN7hYh7fo2Ad3hzd256dmVqb2CHdY6Bc2piXn12eIqCZXB9Z2trWlZveIujgYV/cJmScH92c4BsfoCPhnKUiI2IhYmFfXl1c3BpemFqbWFtdmpna2t5d3p3WmZ9fXhlcn5uhXRmdoaNh5eAcYxobHuDdW11YlttempyeYl6gGV0hn1tcGd0fXZ9fnB6anl5f3d2b2RrYGyKfWxtVWpgeFZMbG1QU1BoTll9aGJPVXZsTVFUVV9od4RnXmFxaWdgV2pdXWxqSkVrW2NlV1lWelpOV29rWV1sZVxaZWNedWZsZXFnc3B0gXhwmYV2f394f3yGh312dIKIgJWDbnN5e3tzc4WGiIiEeYF9do9/fYWJjoSBg3p+i4N7d3x2dpmdmHqKg4dqdn59bYWFlYFyj4JxhoJ+goBwZmxnWF1aXFtUZXFlX1hjc3VpdnBlZWNXW1tof3BvcoBzimVmeoBrdnd0dYWGeIKFend0dm5qenBhaGtnhnSNhG5mXl57bXmIfGdsd2ZqZFVXc3COpnyEe3aWj3N7cXp4bHl5j4N1l3yIhoSHhH11cXNtaHVdbWlgbHVkZ2dpem97cllngXZ1aHCAeIJ2YneFi32Wgm+MbG58gXFmc2VganhmcHWIeXxhdIN2aWtwc3lveXhye2V9fX12dW1iZGBshnxsalVpYnJUTGtsUE1PcEhefGZhTlZ1ZUtPU1hibHh/Zl5nc2tlYFdkWGNyXkxMbFhkYlVUVnRXTVl3ZVpfbGFcW2RlX3ZnbWJwanRvcX51dJmBeH+AeIB+hoR6fXaCg36YhW5ydHx7dHGFhY+CgHqLdnSRgHyBlY6BhYR8foyGen6Adnqjpop5iYaFbHV9fHaEg417b4ZzeoV9goN1b2ppZVZdW1taU2NvZVtZYXR7amhtaGBhWF5aaYBpbG+AaG1iaXt6a3V1dXCHgnqBfnd2bnpoanlqX2VuaIF3kIRnZVhhdmh9hnhuaW9mZl1VWG9oj6h2gXp8kI14dG59bXF0eI1+d5R0hoOAhol2anR3aGlvXG1lXm5zX2dianhoe21bbYNydGpvgX56eGJ3hYV5kYZ0iXNwen9yY3FoW211ZG9xhnp3YXJ/cGdpd3Nxa3d2c3Vignl8dXRvY2JhbHx8a2tVaWJnVExuaVBIU2tGYnlmYk1Ucl5KTlVaZm14e2ZfbnJqZF1WYVZvb1hLVGlYZ15YTlZsVEtdemBcX2xdXVtiZmB6aGxhb292bm93dXqXfXeAgXmAgIeGenl6g32Bk4Rxc3R+enZ0hYiQfoF9kWxzlYF8g5+Ff4d9gX+GgoCKe3aEq59/eoiIhWxxgnt2gYCCdW+Ibn2AdIqAanBuZWRYX1paWlVia2dcWl91gmlebWxcYVdbXGuBZXJ0fWprXm14d2l2eHNvh3x+fnp2cmx6aGl3Z11kc2h6d5KAY2JUY25lgYR1dmZoaWFXVlloZJCnbn53gIuNeXBue2V3bXmKenaOcYR+f4CHbmR3dGVoaV1sYl5wb1toX2x1ZXpoXXSAbnJrcXt/dnZjdYaMfImIgYB5c3Z+dGFwbFhwcWFub4J6c2NxgGxhbHluaWh5eHNwZIRzeHhzb2NgY2xzfWlrVGheX1VMdWRRSFZiSGN3ZmJMVHFZS01YWWlsd3tlZW5yZ2NaWF5ZeGdVSl1kWGlZWUlXZlBJY3lbXl9tW15dYmRef2lqYG90eW1vbnaDl3lygYB9f4mMhn52doZ4hox9c3V1gnl6eoKMjn1/hYlqdJeBe4udfn6GeoB7fnyGiXNxj62Me3yHj35mcYl7dH59d3Nwhmx8fm2QemNwcGJlXmVWWllXZGZsYF1ddIVoWHBtW15YWlxse2Nxd3ZuY1xvdXVpdndyb4Z5f4F6d25vdGVodGVbZ3VmdnaReV9dUmVlaYGBc3xhYmlcVFheY2SQpGh4dIKFkHdsbXhmdmx7g3l0h3KBeX15gGlmd21hZ2FfamBedWtZZl1vb2J6ZVt3fGtub3B4eXR1ZXOEk4CJhIl7d3BzfXJheGNZbm5gbm9/enJlcYBkXm11aGNmd3pybG2Bc3F7cXBhXWRsbnxlaVNnWVpVTnpgUktaWUhjdWRhSlVuVUtNWldqbXN7ZGxtdGNhWVpcYnhdVExkXllqVFdIWWFOSGt3WV9hblxcX2JjXIVpaGJueHptb2p2gZB5bYJ+gIGSiISBd3WJdIuGdHJ2doF4fX1+jI+Bf5N+cHiWg32Zk3mAgXd5fn9ziIRzcJmhe3t/iZV5ZXWJenN5d2x1cH9seXxwknNecG9haGJsVFtaV2lkbmZcXHKJZVNybltaWVdgbHZjanVra19bb3VybnV1dWuHfX+BfHdvbmxkaXBjW2tyZHR2jnNcVlNjX3B+fXCAXGFjXlNaYVxkkp5lcnGFg5Bza2l4a25ueXl6cYB2f3N7entkZnZoXmJbYWhcX3doV2JfcGhhd2FbfHZqanJueHR0dWlxgpaEiICGdnRrcHxsZndXW2lsYW9wfndzZW99W2BvcGJeaXB9a2pyfXBvdmluX1pka2x6YWZTZlVYU1F4XVNQWVJIZHRiYUdWbFFJUFpWbGxsfGVtb3JhXFpYWm1xWFNRZ1dXalRVRlpdT0lzdllgY25jWWFhYV6MamNlbXp5bG9pdnmGe2uDfYCEmnyChHl9iG6PhnFudnp9dIKCfYuPg4OXdHiClIWBn4l1gYCBc3+BcIeDdm+il3N7hoyHe2Z3i29ufHBneXJ7bHN2c41rXnRvYmdma1NeXFZoYm1tW1xxjGROb21dVlhVZmlzaGN1ZWVeW3B3b3F2dnpsiH1/fYh3j3NjZGtvYVxubWNzeIdrWlRWYWJ2e3tvhFxjXmNTWmBaY5aUY25wgoWJcmlmeG1kcnVxemt5dHVve392X2dzZFteV2JkWWJ1ZVVgYW1kYXFdXH5vaGlzcXRxdXdsbYWVg4p9hnJzZ298b3FvUlplaWRvcX50cmJsdVVicWpaXm5ke2RrdHtwcXFobF5YY2lqeF5lU2RVV1FWb1hSV1RQSGVzYGJGWGtPSVhUV25pZXxpbHlrYlddVlx1ZVRTWGlSWmdVVElbWlBOeXdbX2VtaVpiYV9ej25iZ2t5dm5vaXZ2f35sg4B9hph7f4eBin9rk4hyZ3OAe3WAg36Jjn+Mk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgo2Md3hueo1gZX1xZ3p0eW1tcXeDZ2R8bWNnZ2lUYF9VZ2BtcFxebo5oTWlsYFVWU29nc2tmeGVmXlpydm5zfHl0bol7f3ecenlrYWVsbV5gb2plcXl+Z1pVV19rdnp5boJeYV1oVllgWGSciGJrcIGGfHZraXVrW3VwanlpdXJub3yBc1lrbmBZXlZiZFhlcWNUX2JpYWJsWmB+a2ZsdHVvbXh3bGiGjYCKfIhucWZwe2xxbGFYX2dmbXF/cnJeaWxTZXBkVWJtYXhhb3R6dGluamleV2BmaHVcZFVhVlRPWWdTT1xPUEllcF1jR1pqTkpgTFltZWB4aW+AZWBVX1VedlxVU2FoT15jVVRLXVpRWnZ2XV9mbWhYY2FbXo5xY2hqeHFzbWd2dHmCc4KDeoiPf3yKiI56bpCKdGxzgXR/f4iFh5KElY96fYyPiJGbhIB7jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp8fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6NjY2NjY2NjY2NjY2Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fX1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJOTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjY2NjY2NjY6PjYyNjY2Oj4+Ojo6OjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx8fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMC9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4V3ZWdmZmZoXENEREREQ0dkaGdnZ2dna29ubW5ucUorLi4uLitIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyOLhodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoKCg3JdX19fX2FSNDU1NTU0OVxgX19fX19lZ2dnZ2dqPBgcHBwcGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJiIiIiIiHjZCQkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGiImIiYmJiYqKioqKiomFg4ODg4ODhYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpGSkYmHjoqQkpORi5CNjo6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2NjY2Ojo6Ojo2NjY2NjY6Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIuFiYmJjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd3eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQiIWHjYmQiYyQj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi317d3Z3e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCIhYiMiY+Hjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuEioyIjoePj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fXd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4qOjYuNjI+Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgICAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoB7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqLh4eJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f35/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5OTk5OUlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTkpOTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkpGRkpKTiIWTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Pj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkoKCkpCRkY51hpGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj5CQkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QiHCEkI+QfHSIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+Mc2+Kj4pyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fn5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI13bXuPgnN4ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx+fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhYWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh3Nub4R7dXaAhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWVhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnd0Yl5kX2FrcWZoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkVFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGJdamxdZWZnZWNjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkZISUpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aWmp3bGJucmpiWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01ba3JrYW10cmZRUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTl1jb2tYaXN1cFNNT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQkZIVWJnbG9wb21sWkxMTk1OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQ0ZHSE1aZ2hncm5uaGZkYF5eWExKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz5JWl1aXGVsbmpvbW1sa2loa2RTR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs9S1tpbW5vam9ta2psbWZRR0VER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs6PUhjb3NtbmxrbGhVQz5DRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdHJxdHh4eX1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OT1KYHNzcGhUPzo7PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PDpCbH1qQDo7Pj0+P0BAQD8/QT9AQEFAQEA9Pz89PDo7PT08P0BAQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtbbkA+REU/QEFEX2Q7PT07Oj0+QUE/P0BAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKS0hWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6Om13SDg7Oj0+QTtIZD08PTw4OjtAPz08PTw8QD09PDw+Oz08PT5BQEJBQEBAQkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSWBwcHJycnR1dnl7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI9PD1JTEZFdXZONzg4Ojs+P1dqQTs8PDo6Oz4+Pj09Nzk/PT0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENyeko7XH+Df3p8d1c8PT89PT5FaHRMOj0+Pz09Pk5TVVJMQ0BAPz5BPTs/QkBCQ0JAQkNBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRUU/QUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBR3J6a2KDhIOCg4B9Xj5AQ0BAPUpze1k6PUFFQkFHZmhsaGFfT0NBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBFbnR9goKBg359hHZNQUNFQD8+WXuAXT9DRUlJSVdqamhpaGZnT0RHRUVFREVDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8e31/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISk1NU213cGltb3FlS0pJSEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hMTk1Ucnh4cm5vb2xNR0lHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpISUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiEVmyFh4aGhoeIiId8UExNSlt3eoJxbm1tbEtDQ0JDRkZFQkA+PkBBQkBCRD8+P0RGSERGR0lLSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHJydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKVIGDhISCgoWGhoSChYWEhIaGhoeHhop1SkpHW2doamZpc3pxQz07OjxBQUA+PDk5ODw8PDs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYCAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSUllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI9nRVZkamxhZWx4gGU3OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUdPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjYplYm9wbGhrcW14UTM4NzM1Njg6ODc2NTY1Njc2NzY3OjY3ODg5Ojc1Nzg5Nzk4NjY6PEBHRklHSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA2Nzg4PTo9RUNCZYWDgYCCg4ODg4OGiYuKiYmKioqKi4qLi4hxdXZwcHVwam5LNDg4NTU3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3NjY5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2eXt7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAgICAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISFhomKioiHh4iIioqMi4qLjoh2eHd2eHJtbUo4Ozw5Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PDo+Ozk7Ozw7PDs5Ojw4Ojo6Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3Vzdnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLioyNjYJ1eHt4cnFqSEFBQj5AQ0FAPj0+PkA/Pz9AP0A9PT9CPkBBP0E/PUBAQD4/QTw+PDs6Ozo5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw8Ojo7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uLjI2MjH94e3p6a1dMSEhIRUZIR0VDQUBCRUNDQUJDQj9AREhFQ0VDRURBRkRGREVGREBCPj1APj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ6Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYaGhoiJiYiHhoaGh4mJiouMjYyMjIyMjH55endZTlNNS0tJSkpKSUVEREdIRkRERUZEQkhJS0dIR0ZIR0VLSUtJSktKQ0VDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQUJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2NjIyOiXp6dV1RVE9MTktKS0hLR0RHSUlJRUZJRkZFTExNSUpHR0hJSk5NT0xMTktHRkdHRUVDRkVGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozs9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyMjI2NhHl6dF5RUE5OTEpJRkpJRUtJR0tKSUpHR0dLTE5MTEhISUpNUU5PTkxPS0lHSUpISURJSEhGRkdHSUdDQkFDVG5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhIWEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyMjIyNdnZ4bVRTUE1MSUdESEtITUxHS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0ZGSUZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyMjI5/ZGdtWVhVUU9NTEVGR01QT1BXVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05IR0pGRUhKRURFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VEZGR0dHR0hGPkBCPT89PUJAQkJHVk5GTlBQVFh7hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjY+MjIxvYWNvZEhVU1NSSzs7U1RSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUxMS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gYCAgH9/f4CAf39/fn5TSEpJSEdHRkU/P0FBRUFDR0VERUxYUk1UVVZYWnyGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox+YYqLi4hzYmpZPltbWlVSP0BXVllcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhVVFZUT09NS0xKSUlMTUtPTVNvdHZ4eXh4enp6e3p6fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJi4x9dHNbXl5dVFVTV1dWW1t1g1lVfZBhXFhdX1dJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUU9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4mKgW6GiYiHhIqAal1dXltWV1VYVFNYVmOWgFJlclhaV19oUGBmW1tYXGdhR09aaGddW1xdXVdST1NQUFJWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BOTUtKRUM/QDtQUFpaW1NTUVBSUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ+gX1gVVlbVlRXVFJSTVBNTGZ6W11UWVVWXVpMVFpVU1ReWlhXV1d6alhbXFxeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX5+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt/fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHiHpwc1pOT1FRTU9MSktFRklGQz9UZFV/UlFRTktRVFFNT1lSTU5RU1ZVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t8fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRhc3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdmFgUEhCRUVERERBRVFDRUFDPkNJR1ZASE5MR11pUEhGTkZERUZJR0hCREhHSUtHREJBREBPUU1TZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUFVZU1VRUVRST1Zfa2xydnt7eHl1cm5zdHN5eH1/g4CDg4KAgoCDgYJsT0lCQz08PkBBQEA/a1FLYEVGSElFQj9HTE5HTVJVSUJFPz48PTw9PT89P0FDQ0A/PT1CPkpOR1VudHR1c3R2eHp8e3x8fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5KSlBQTktMUVJRVFVVV1FRV1VQWFthXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVFQkJDPjtDQ0JCREJcXU97Tk9PTktMTU9PUUxLTVdNSEdAQjw6Nzc1OTk9Ozs7ODo4Oj88Qkg/XHN0dXZ1dnd5fHx8fXx8fX1+fXx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QX11aSUhQUlFPTVBRTlFSVFZYU1NZVE9ZWlxXWV1eXl9lX11ecXZrXmBna3dvb2xqb25ubGViWUhHSEhDQkdJRkZGRE1ST2FXU1dRUFNTUlVbT09RVlBNSUNGPzo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn59e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVldeWlhNS1RUU1BRVU9MUlNUV1hUVFlSTVhZWlZYWFZYWV1XV1hoc2tdVmF0a2FhX15kYV9eWVVRTk9PTUlISkxKSUZDUVBTWldUVE5RU1lTXGVVT1NUUk5LSUhDP0E5OTk4OTc4ODU3NTc4NTk6R25xdHd4ent7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFNUV1RVUl1uX1JOWmBbV1k7RFZYVFtmSkxQU1JPTk1OTk5MSkZRUFVZU1RPSk9PVVNUXFZSVVNST01MSUhIRj8/PDo3ODc2NTk5Njc2NzVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xdUlRaV1hVVFdUUlhYWVlZU1VPSkdPUE9PTVJKT1BPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQU01JTUtPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5oaWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEpIRkxNUE1HL0VfUj4zPz5qb2FTUlFAR1RRUFFQUU5RT1FQTEpMTE9QTk5QUVFOUE9KTE1NS0dFRUNBOz08PDo9RzY2NzdEbXB0dnl7e318fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1RRU0FHVVBPUVFQTU1PTUtMS0xOT09RTE9PTUhMS0lLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3t7fXt8e3l8ent+fnx7dXR1cnZ2ent4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTFFTTFRVVFdXVUxMS0k8OTg3Oz5APjw9QUBCPT5FSEZDRUZJR0pKQEZBQUBGSEVKT0hRUmJcUlBST1NPT1BMTU9NTE1NTk9OW1dLTVFPR0lIQ0lKTExLRkZGRT9CQz48Qkc/Qj9BZHBzdnp6e3t8e3p6d3t3eX5+fHtxc3RwcnN3c3h4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRD05Nzc5P0I+Oz9CQEA+QERKRUNHR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTktMTk1NTExPTlNkTkpMUklJSUVBSEpMTU5KR0lHQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4OTo/Qj88QUJBQURFR0pGREhIR0dIQ0Q/Qj8/QEE+Q0VDS05SVExKSU1URklJSkxKS0xJSk1NT1BSUEpHQ0xHQ0JKSUxNT05JSklHQ0NDREhKTUxJWXJtd3l4ent6eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbXBvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxSEtER0hJR0pLSUpLREZCPT49Ojk6O0BCPz1BQkNDR0ZJS0pFSUlGR0dDQztBQEI+QEBDRUNJTVBISEtHSEtESEpMTUhKTEhJSkxLTV1SSEhETkZBQ0pKTUxQTUtMSktGR0dKTk5RTkxibWl2dnd6eXt6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0NGRkdFRkZHRUdCQ0A+PD05Ojo7QENAPkFDRUVJRUlKTEZJSUdGRkNCO0FCQz5AQ0RDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJR0VOSEJGTUtNTE9NTU5NS0lISU9SUlNOUmZmZnJvc3h2e3p8bGhqbmVrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJREZGRUNDQkVAREI+Pz46Ozs9Ojw+Q0E+QUNERkpGSUhMSEdHR0ZFQ0A9RERCPkFDQ0NFR0lJR01RSkZGR0tOT0tGSElGRURFSUpIS0lGSE9LQ0lMS09NT05PT05KSklMUlVVU09XZGBgbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRD1CQT5BPTo6PT86Pj1AQj5AQURHSkZJRklIRkZHRENCQUFGRkNCQkNERUVHR0hGTFFMSU9KSk1MSUdIRUdFRENJSUhLSkdLUk1CTk5MT05PT01OT0tLS09VV1ZVU1hfXlxpYW5qbmhyc2JkZmVkaGhmbmpmbW1oa2ttcmlxdnRzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3d3Z0d3Vqc3VudXRzcXJra3JNR0dGSEJCQURFPEFAQEM8ODo8Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0ZFQkVHRUZHR0VJTUtJUU1KS0hISUVGSEhFQ0lKSUtMS1BTTkRRUk9QUU5PTU5QTUxNU1dWWFhVWF1aXWRgaWNqaWdrX2RlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkU8P0JCRDw3Oz0+Oj46QEI+Pz9CRUZER0RFSEVERkNERkVGSkVFSUdDR0hGSEdFQ0ZLSkhOS0xLSEpMRklJS0hFS0tMTU5PUlRPSFNUUlBST1FNTlFOTVBXWlZaWVZaXVlYYWBhYF5oZWNgZGVoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V3dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TkhISElEQkNIRTxARUJFPTg5Pj49PDxBQjw/PkFBRkNGQ0RJRERFRUZHR0dJRkdLSERISEdJR0ZESEtJR0tJTUtKS0xITEtMS0pOS09OT1JVVk9LVVZTUFNRUkxPUVBPVFlaWVxaWVtdXl1gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRMSUtJS0ZCRUdFPEBHQ0RAOjw+QD8+P0JCPEA+QkFGQ0VFRUlGRkVHRkdIRkhISUtKRkpISEtIRkZMSUhHSkdMTE1MTElNS01NTVBMUFBRVVZXT0tWVVRSU1FSTE9SUlFWWlpdXltcXl5eYGBhZF1jYGVmYGVoamRzc2ZqZ2Zrb3Jxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0NFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkZHSUZKRkdESUhHSUhKTEhISkpJTEpGSktISUtKR0tLTU1KSk1MTk5OUEtPUFJVWFZNTVRVVFJRUVBNTlRTUldbXV5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ2xvc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydW53S0xMTE1HRENBRTw/RUVFQz1BQUNCQkNEQUNFQUFFR0NISElIR0pHQ0dJR0hKRklNSElKTUtOTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05SUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdjaGhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQERCRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSUpJSUxISkpOTE9LSUxIS0xLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdoZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkI/QEI/PURFRkRDRENFRURGQkZGR0RFS0ZGSk1MS0xMR0dNSUdKS0hLS0lLS05MTUxMTElMTUxbc2JkcF5sbVVNTmZzXWZmcWxudGdwaV9hWW5uYnBwYmtqamZvcXRldG5vXG91Z3BNSnF5dmthYGtlZW14bGt2bG1wc3JwcnFwcXJxcnJydHJtbXNubm9wc3V0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQ0ZDRkVGRURDSEhIREVLSEdMTk5MTU1GSk5ISktKSUxLSkpLTE1OTk1NSk1NTltyb29ucHBsa01QUWxXTWlidHJwYW1udVxZbFBcbm1acW1rb214eHRzaXBdX3JrcWpVdXl4b2Nea2ZiZ3Bvampub3Byc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkhDR0RJRkVFQkZJSEhFSExLR01NT0xNTkdMTUlMS0lKTUlLSkpKTlBPTkxMTk5MXGhkdV1scVdsTlBRbVRZa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR4a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDRkRIR0xIRUNDSEtJSEZKTExGTkxMU1JMR0xMSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXJrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJpbXR1cHN1dnNxcHBxb3F0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFREVBQT5EREJHREhJTUlGQ0ZKTEpHRktOTEZPSktXUUtHS0pKTkpISkxJS0pISEtNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam5fZWVVa19jW2FhUWBsaF1qXG5paWRbb2VkcF1aXGtbbXFjcHNsZGdjY2dgYGptcXBudHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcXV0d3JHR0ZJREVERkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFpQSkVISEtNSUhKSktLSUhJRktLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9OUU5PUUpKT1BRZHFpVFlWXFtcVllbXVhdXFxjZmFhZWJjZl9fZmtuaW10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDREdFRUFFQ0BESERGR0NJS0xIRkNHS0xJRUdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUdISUVGTElKTE9NSlBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUktZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRhYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRyeHJ4c3FydXJ0T0JDRExNQkREQkVJRUdHRktKS0hFRUlKS0ZFSEhQS01NSk1SSUdFQEhGS0lLTEpMSkhGRElGREZHRUZKSENKTUxMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaGhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhUkpKTUlFQ0JDR0hGSEdJS0pKSURGS0tLRUZJSk5LTktITE5HR0U+R0dLSUtMSktLSUdESURDREVBRkpFQUtMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0eHl5eXl/fn15dXl2dnJuend2eFlRS0ZER0VCRUdIRkdISEZHSUdIR0hLSUxEREtLTk1MS0hKSkhJRj9HR05LS0tNS0tLSUZHQ0RAREFISUNASktIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlBPXF9hY2NjY2JdZGNiZGNmWFFWVFFaV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkRGS0pGRkZIR0dJR0ZGSUxKTkZES0tNTkpMSUtKSEhGQkhIUU1MS09NSktJR0dFRD9FQ0lJQ0NIR0VUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVVlhUlFfX2JiYGBiYmBjYmFkZGJYT1FQUVpSW11dXV1eX19jaGdsam5ucHt7fH57gIKDhIWEhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUhGREdNUkhDUUpFR0hIRUZLSk1QRUZJSktOTExJS0tJSUdESEtRT01NUExMS0tISUNEQUVESUdDQ0hGRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdTlhhXGBgX2JjYl1hYldfX1RQT09PV1FcW1tcXF5fYWZmZWxlb293fHuAe31/gISEhISEhIWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfkpORkRGRkhESVJiUENWXklHR0hERk1KUFBFSUlKS05MS0pMS0lKR0VKTlFRTk9PTU5MTUhLQURCQ0RHRENDRkdCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU1BLT1NSVVpZV1lYWGRXT1NUUFBOTU5UUlpYWFpdXGBgZGVjZ2NrbHBzcnl5f3t6f4SEhIWEhISEgoSAfnuBg4F9e4WEhoaGh4eFhYWEhISCgYB9S0lFRUhGR0RLTV1MR0dYTEdISkhHTUxRUEhLS0tLTk1VTk9KSktHR0tQU1NOUE9OT05OR0tGYEVEX0xFZ2RGTlxJXltybU9NVW1ZTERQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYF9hYmFiX2ZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVHRkhFRUtPU0lKRmBTR0pPSklPTVJQTE1MTE9SVVJPT0lLTkdITVFbWU9QUE5PT09JSlF/UUl8WVlydFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1puWF1WXFhVa2hVXVZjWmBZW19WVlh/anR1dV5fdl5XYVtbZlteYGFhYV1fYWdtcGxfcHd0eIGBgoODgn59f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExGSUtFUVVMS05JS1JYV1FOTk9NUVROT1FPS0tOR01PU1taVFFST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFyb29vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3NvcnJ7fG9+eG6Acl9gYGJhWmBfZ2tua2JsZmdsd36BgIJ9e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTkxHYF1HQUVMTUdKSkdJT05NTUpOVl5ZVUxRU05YWk1TU1JNS09IUVJUWVdXUFRQUFBRS0hneGxjeHJtW0xOVnlwdW11Ym92UGVlSmZ2cW13b4BqZnh3aVdyUWh6bWlqenp9bHh6f29ob1l2dmp2dXCAX3JmfWlseHxvXl9fYmFaXWJkZ2lpZGdiY2RsbHBwc3Rzc3N6cXJ4Ymx1Z3J5e3Jydnl+gXN1em58fXl4cm5OS1N1TkNCRlBQSEpLSUtQTk5PTVBaYFpXS1RXUGFeUlZRWVJMUElTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWFXbkxxcF5GaHlXdlRLaHl9eGB5e3NuYV1tb2NSZ3F1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXlxfZGRpZ2dlZV5hYmlpaWprbm9rcW9tanBhY2Zjb3d4b21wc3l/bnFwa3t6dHJvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWVVNVVlVZVhSUlldU0xOSVRUV1dZV09TTk5OUUlSbUhpd0tgZHZ3VlhsT25se3Nhamd/dlVMV2tofWxtbHhfWnB6e15genNjcm94cWhkfWlyfF5UTGxfdnVraXV7em1+eGt8cFxeXmJbXmFkZGZlZWViWmNjaWtrcnNydmdsaWhkZ2Fha2Fnc3JsZ21tcn1rbWhre3RtbWttT0hLS0hKSEhRUExOT0xLUlJST1NSV1JWVFBXWlZWVFRUYV9QTk1KVFNUUVZWTk5MTU9QS0hRTlBVTEtMU1RTU1RQVlVRUU5RUVhZUk5QVVRYWFhbW1VSU1dbV1hXWk9TVVdYWFJeWVdeV1VQWVJXV1dXWF5aZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2JnZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2p1amhnaWxQSUtMTE1LSlNRTVFRT0xWVVRQVFVYVVpVUVpdVVVUV1VZV09PS01WVFFOVVNOT01MUVBMSlJRS1FNS0xQUlVTUVJTU0lITE5PUVJRUFFUVlJYV1xXU1JQUlRVVVNaUU5TUlhWVFlXVVpWVFJWVFRVV1hWXFldYF1bWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NcWmRcYW1hXmZlZm1zZGlnamtlZGNmaFBKS0xPT0xNU1BOU1FQTVhXVVRVV1dXWVVTXGBWV1ZZVVhSUFBKTldTUE5VUE5RTkxTUE1PVVNOUk5NT1FVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1ZWWVtUUFRVWFVVWlZYWlVTUlhWVVdbWFleXFVYXlxeXFtdYGBdW2JiY2dmZWRiWF9hYl5gZ2RmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZnZmRgYmNiT0xNTFFRTE9UT09TUU9RW1lXV1haWVhZVl1qZFZYWVpXVlNTT0pOVlRQT1RQUFBNTVJSUFJYVFFRT01QVFZPWFJUVVVPTk1RVFVVVFRSVFdWW11cWlZWUVFWWFZbW1dRVFZWVlZZVFhYVlNTWVdWWl5ZXF5eVV5cXmBcW19fX15aYmJkaGdkZGJYYWBiXl5mY2NgYl1cXFxcWVpbWFthXF9dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1hVVVdRTE1WU01OUk9RUk9MUFNSVVpVU1BQTVFYV1JXU1NTWE1PT1FUWFZVVVNVWVhbXl1bW1ZRTlVWVVtbV1JTV1ZXWFZUWVtVVFNaWFdcXlpeX19UYVxgYV1gYl9cYF1jYGNnaGRmYFljYGFfX2VkX2BiW1pcW1xaWllYV1xaXFtgXl9bXl5hYF9iXFlgW1FOT05WUVBUUU9UVFNQV1xcXFheXF5WW15qcXd5gGNcW1VVV1BNT1ZTTlFRT1JUUkxSVFRZW1dVT1JPU1hXVFNVUlJaT1BSUlZbVldXU1ZaWFxdW1tdVlJNVFVVW1xWUlVWVlhZU1VaXFVTU11YWl1eXGBgX1ZhW2NiXWFkXlxiYWJeY2ZpZGZdW2RgYWBgY2VfYl5ZWl5bXFpZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdbVFdXUU5SWlNSUVRSVFVUS1JXVltZWlNPU1FWVlZUT1dSUlpSVFRUWF1XWFlTWF1YXl1ZWl1UVE5VVldeW1hSVVVZWVlVV1pcVlRXXlpdXWBdYmJdWV9bZWFfZGReXmNjYV1lZmlkZl1dZGFgYWFiZGBiXlhaX1pcW1hYWFdXW1lbYFxbW1xbWFlbXlZeWV1RT09SWlBaVFVWVlNUVF5eYF5eYlxgVV1eYmt5dGx9a1pUWVRQUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJWUVlYWV9bWlRVVlpZWldYWlxXVVteXV5gYV9jY1xeXV1lYWFmZF5eZGNgXGdkaGVkYV9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFZZUV1VVllXV1VYX19hYWBjXV9VXV5iZWV1gXpoV1hZU1VTVltYV1dWVlddWE9VXVpeXVxUUlhTV1dVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVhUWVpaYVpcVldYW1pbWVlaW1lXXl9gX2NiYWRkXGJcYGZhZGZkXl9kYmFbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWF1aW1tYWFlbWVpaXV9dVFldVU5TWVZTXFRWV1lWVlxgYWJjYGNeX1ZbYGRhX3p1b2hZWllUV1RXW1paW1lYWWBXUFVeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19ZXV5ZXVVSWFdZWV1iWl5XWFtcW1xbW1pcWlpfX2BgZGJjZGRiZFphZWJmZmVeYWJgY11iY2lkY2dfZ15hYWNhYWBeX1hUW1paW1tYW1hYXFtaW1hWWVhXXFtbYF1WXV1TT1ZZVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXlxcWlZXWFlcXF1fW1lbYlZVWF5dYWNcUlZZUFdXV1dXVlNVVFhcXF5gYF1gXFdhXlteW1peV1VYWFtaX2BcX1lZXFxdXl9cW11ZW2BhXmBkY2RlZWViWGNlZGhnZF5jYGBlY1xlaWRlaV9mXWNiY2FhYF9fW1hZWllaWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1lYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXF1eYGFgX2JeWWFdXV5ZXF5ZWFVWW1xgXl1fW1peXV5eYV1bW1pcYGJfYmVjZWZlZmJaZGZmaWdiX2NeYWZkWWhoYmZpY2VeYmJjYWBgX11cWlhcWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lWXFtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1xcX11gX11bYGRdXFhbYmVjYVJcWk9ZWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXVlYVFddXl9gX2BcW15eYGJjXFxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYltjZ19caWhiaGllZGBiYWNhX2BfXF1cWVxZWFdYWVhXXFpaV1ZYT1haXWFjZWZya39KWVdcWlpfXFteW1hdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWVhVW19eXWFiYF5bYGFiZmNfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgWmVnXWFnaGNoaGZjYGJhY2JfX19dXVtaW1lYWFhWWlZcW1pWVlVNWFdcaGlraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeEgoKCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl6e3t7e3t7e3p6enp6enp6e3t7e3p6e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t6enp6enp6ent7e3t7enp7fHt7fHx9fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvIaJiYmJiJDM09LS0tPTxL2+v76+wKKKjIyNjY6Jf39/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyKlN3m5OTl5OXTzMzMzMzPqo2Pj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXl5eXp3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9g4SEhISDg4KCgoKCgoJ+fH19fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eXZ2dnp7eHt4d3Z3end5eXp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t5eXl5eXl5eXl5eXl5ent7e3x8fHx8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnl9fHx7eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiY2MiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en18ent4fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3Z7fXt5e3h8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6eXp9enl7eXx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHt4eXp5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoSDhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGBfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIioiGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoKBgIGBgYGBgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoGCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FxcXJzdHN0dHR0dHNzdHNzc3R0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcXBxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcm9vbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3NzcnJwcHBwcHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXFzcXJycXBufIJvcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcIeGcHJxb3KYgm5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxfaGCcHJvi558bnBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXF1naF3cXefnH1vcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFxcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGYqJBvgqOdfnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHd3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOBg3lyc3NycnJzcnJzc3NzcnN0cpOppHmIoJ18cnNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn+Afn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH59fHZ2d3d2dXh6eHh4eHh3eHl5n7SppKiol317eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYGBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3x7e4mvpqG1q6yjfnt6enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19mKWWobKgmaeTfYB/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYGcnI6gr6Cfop+AgIGAfn5/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJh4eJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBgJeajpixoZiWnIV8fn5+gH5+fn9/fn+AgIGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn6AgX5+n6ullqSbm5agn4Z/fn1/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQioqKi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYGBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOCg4OGjZ+yqKKgmJ2dpqitqKCZkIeBgICBgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OGjaCtsaabmqCbnpycnaGko52Uh4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GDi5eZl5aYoJudnZ2ZmpeQiYaGh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4OEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYaOlJOXmpycm5SPiYeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOTko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgIGBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4OIkJOPlZiSh4OChYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoGCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4eFhoaGh4iRk5GQjpCOkZGMiYiFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgYCHm4iLh4KCgoGAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Pj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIiHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgH+DiI6AgYKDg4F/f3+BgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2JhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf3+MlYKCgYKEg4GBgYKCg4ODgoODg4ODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSDg4OChISFhIODg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpOQjYyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2MnI6AgoGBgoKElJSMgYKBgoODgYucmqGaioKCgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKTko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaGhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GYjICDgYGBgI6UjJCBgoGCgoGJkpCMlqOjj4GCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhYWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeLfoSEg4SCg4OCjYmFjIKCg4KDgpOUlpiSl56ciYGCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn99fX1/goSDg4SEi5mUmpmXlpWShISEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhoaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/fn+Ag4SDhISRlYOJlpiWlZSIhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhYSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWEhZ2TgYGYmZiYlouFhoWGhYWGh4eHiIaHh4aGhoeHh4aGh4eGhoaFg4OEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhYOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fX6Af39/f3+AgH9/gH9/hYWIoaCbm5+eko2QioeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGhoWDg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgYKBgYGBgH+Af39+e3qAiJqgmpqjopuMgYyKiIqLioiIiImJi4uKioiHh4iIiIeHiIiHh4aHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUkpCPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoODgoKAf359fX19fn58e3uUoZeWmZ+fm5iLi4mIiYuKiYmIiYiKiomLiYaGhoaHhYaIiIiIhoaHhIOChIeIiIiHhYKCgoODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4iFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCg4OBfn19fn5+fn5+fX59fYGVk5CXmJOYmpeNh4eHiIeHiYeHhoiHhomJhIOEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKDg4SCg4OEgoGCgYGBg4OEg4SRkpCOj46Lh4WGhoSCgYGBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KDgX18fX+Af35+fn18fX58eoCRjo+QjpOYmYqDhoWFg4OFhISEhISEhYSCgoKBhISBgoODhYaFhIKCgYKCg4OFhISEhYSEhoODg4WDgoOBgoODhIWEh5KRj42PjImFhIWEhYKBgYGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+BhISDg4OCgoB9fX+AgIF/fX5+fXx9fXt6eoWQjYyPlJeUhICCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICBgIGCgYOBgYKEg4OEhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59f4KEhIKDgoOCfn1+f4CAgYB+fX19fX59fHp7e4iPjY2Pj4Z/fn+AgH59gH9+gICBf4CAgX9/gIGBfn19f4CBf39+f4CAf4CAgIB/gIKAgIKBgIKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgYOEgYKCg4KDhIWAgH98fH1+fX1+gIB+fX9+fX6Ag4ODgoKBgX99fX5/gICAf319fX18e3t7enp6e4uPjZCGfn5+fn9/fn+Af35/f4B/gIB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/f35/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf31+f359fn9/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6enp5f46OlIp/f39+f39/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9+gH9/fn9/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6enp5g5CNlYyBgoCAgYB/gX+AgICBgYKCgH6Afn9+fn5+gYCBgH9/f3+AgIB/gH+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhISCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFgoGDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX18enp5eXl7h4iUlYSDgYKDgYCCgIKBgYOCg4OBgYGAgYB/gIGDgYSCgICBgIGBgYCBgIKBf4GAgX+AgH+AgIB+f39+fHyJlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgICBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eXl8goeRhIOChIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgYGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHh5eXp9gYd/goqEg4SEhJeXg4OEgX1+gYGCgYGBgoGDhoiMhYOCgoGEgoODgoOFhISFg4ODg4KDg4KCgoKDg4KCkZCLiIiHiYeGhoSGhYSEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4eHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5ent9f3yFkYODg4SElJOAgYF/f39+foSMgH+AgISGkImFhIKCgYWFi4KBgoWFhoaEhIWFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhISEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6enp6e3+CgIGBg4KAfn1/f3uIkXx8jpaAfX5/goaKhYODhIOCg4yJf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl4fH1+gH+Af317e39+fYKVkX+EiH18fn+ChHx8gYKEg39/h4N9goGAgoKAg4ODhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fn5/fn5+fX18gIGAfYaPgX59gn5/foCCfHyAf4KAgYB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIuOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeFhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF/gIF9f3+Af32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2Njo6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYB/gH9+gH5/f39+f4F+fHt8fHx8fHx8fHx8fX18e318fHx7fHx8enp5e3x6fYWDg4GBgX6Af3+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fXx8fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoWDgYCAfX59fn9+i4SBh359fHx/foKCf318fX2BfHt9fH6BhIOBgH5+fn59fH5/gH1+gH5/foSSjY2Mj42MioaEhYSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgXp+fnx+foCAfn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1+gICDg4J/fn98fHx9fHyBg36Mfnx7e31+fX59fXx7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39/gH9/f39/f4B/gYGAf32Af39+f35+fn5/fIJ9fn19fXt7fX18enx8fYGCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7fHt7fHx6en16foJ+goSEgoGCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXt/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+fn9+fn9+fHx9fHx9fH1+e3x7fHx8fH18fXx9fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKPjYmKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af35/f3+AgH9+fn59f4B/f39/gIB/gIOCgH+AgYCAgH9/gICAfnx5fH59fn19fn6Mhn19fnt7g4N9fX18fXx9fX19fX18fXt9fH19fn1+fX1+fXx7e3t8e3x8e3p7e3p6ent+fYKGiIeIioqLi4mMkZCOiomGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgoKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCCg4OBgICBgYCBf4CBgoF/f35/fn6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn19fHx9fX19fH19fX59fX5+fHt7e3x7fXx7ent7eXp6eXp7fn+Dg4SIiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYF/gYCBf3+Af4CBf4CAgYKBgYSDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foORhISDgX9+fXyNh319fn19fX5+fH19fH19fn59fn98fXx7fH1+fHx7fH16enp5eXl6e35+gIGDh4SIj46LioeFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChYWEgoGBgoGCgYCAgoSBf36Bf31+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH59fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6enp7fH1+fX+CgImOi4yIhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYCBgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgYOBf4CBhIF+foB/fn6Afn1+foCAfoF+f4B/f3+Af31/f39+f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX59fHx7fHx7e3t8e3x8fX18ioqJiYaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoB/gICDgX5+gH99f4B9fX5+gIB/gn+BgICAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOEg4SDgoOEhISDhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX2AgH+BgIGBgICAgYF+foB/gYCAgYGAf359fX1+fX5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhYOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SFg4F/f4B/gIF+fX1+f35+fn6AfX1/fH19foF/gICAgoCAgYCDgoB/gH6AgX+AgX+Af35+fX5+fn99foWFgYGBf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B+fHp7enx7fIKBf4J/f4GAgoKBgX9/f4KAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEg4KEg4GDgYCAgX9/f3+AfH19foB9fn9/f399f3x+fn6Bf4F/f35/gH+Bg4KDgH9/gYGBgoGBgYCAgYCAgH+AgYGBgoOBgX+AhIB9gYOEgICBf4GBgoB9ent7fHx8f31/gHx/f319gYCAfn19f35+goCBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYSBhISFhISEgYOCgYOBf4CBfn6AfoB9fX1+gH5/gH5+f31/fX9/f4GAgX9/fH6AfoCBgoOBgICBg4WCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fH19fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWEg4OCg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fX19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgYKBgIB+gIJ/f4GCg4GBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgIGCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIWEhIWDgoOEhIOCgoKDgYKCgX+BgX2AgH6AfX59fn+AgH9/f39+fH6Af4GAgYB/f31/f35+f4GAfYCAgYODg39/fn1+fn9/gICAgH+BgoGAf31/gX9/gIKCgIGDgoSFhoSAfn18fXx8e3l2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R1hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19foCAgH9/f398f39/gYCBgIB/fIB/fn5+gH59fn6BgYKCfn9+fX5+fn5/f4B/fYCBgH5+fX+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoKBgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GBgH99gH5+fn9/fX19foCBgYB+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHt7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgICAgH1+fn+AfXx+fH+AgYCAgICAfIB/gH9/gYB/f32Bf35/f359fXx/gICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9/f4B/foKEgoKDhYWCgn59fHt7e3x5d3t5d3h3d3h7e3t7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fXx9fX59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GBgYGCgIKAgICAfn9+f399fH5+gIGCgYCAgYF9foB/fn+Bf4B/f4F/f39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXx8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f359f36AgIGBgn+CgX1+gX9/gIF/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgYGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjXp8fXx7fXl7enp4eoGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoGAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoKCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgYCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fHx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH9/gIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gICAgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGBgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHt9fHt9fnh3dnl5ent9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4OEgYKEgISDgoKAgIKChIGBgoGDgn+AgH+Bg4KBgIGBgIB/gYGBgYGDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99en1/e3p2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgHx/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoKCg4SCg4SDgIGDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBf4CAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH98e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHZ7hIKDgoODhIKEg4OBgoKEhoSCg4KDhIGEg4GDgIGDgoKCgoKBgoB/gYCAgoGCgYKCgoGAgYGBgoKCg4B+gYOCf3+BhISBg3+CgoGDgoKCgYSDg4SAgoOCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF/gICAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhIGCg4WFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKCgH+Bg4J/gIKEg4OCgYKCgYOCgoODg4ODhICCg4KDg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgIGAe32Afnx5fHp6en18fIF9enx8fX18ent+fn6AgH+BgYGAgICAgoGAgH99fXx9fXx2cnd4eHZ0f3Z1fYeHg4KEhYODhIWEgYKEhoSEg4KDhISBg4WDgoKCg4OBg4GCgIKAfYCAgYKDgoKCgoSCgIKCg4OCgoGBf4KDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4KChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx8eHZ/dnd/hIeDgoOFg4OEhoSBgoaGhYSEg4OEhIKEhYSCgoODhIKDgoOCgoF+gICCgoOCgoODhIOBgoKDg4ODgoKBgYOCf4KDhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf359foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIaFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4KCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4ODgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAf318foJ/f35+fn59fX9/f3+AgIB/gISEhIOEhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChIWLiISFhISFhYOHhoaEhISEhYSEhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoOCg4GDhIOEhIWDhIWGhISGfYN6fX5/g3uFg4GEg4B/fX5/fn6Bg4F9e399foB+fXx8fH19fX18fX1+gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFg4qIhYWFg4aFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIRqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhIJoenJzc3yAcoKEfoODfYF9fn59foKDgnx/gX1/gH19fHx8fH19fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIKChIaGg4WEhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhYSGhoaEhoSDhISGfXB7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHem19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoOFh4WGgIKFg4OFh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6Bf397f359gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSFhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFg4WEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSFeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgX9+fn9/f3p+fXx+fX9/fn2AgYODgIKDgYKEgoF/gYGAfX9/gX5/fn5/gYB+foGCgICChIeGg4OHhISEhYeGhYWFhYeGiIWFhoWHh4aGhIaGiYiFhImKiIWEhYWGhYOFhYSGhoaGhoaDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH19f39+fX9/goJ/gYOBgYSBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoOGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEg4WEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFg4SEg4GBfn9+e3x7fnt8fX5/f318f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4aFhYOEhYaFhIaGh4aFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhYeFhoaIhoWIh4eFh4aGiIWFhoeFhoaFg4KFhYaFhYOFg4SEhoSGhoSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB/fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEhoWGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWCg4WGhoSEg4SEg4SGhIaGhIWFg4aGhYaFhIaHhYSEhYWDhIeGhIKDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fX18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaFhIaGh4aIhoSEhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYaIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhYKEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIOEh4OEgYKEhYOBgICAe3t9fXx8fH59fHx8fX58fXx+fXx8fXx8fHx9fH59e3yAf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4SEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaFh4eHhYeGiIiHh4aHhoeFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fH59fHx8fn18fH18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaHhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIh4eGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGiISDhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J+f3x/fn58fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhoWEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhISGhoeGhYSDhYWGhoaGhoWGh4aGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn5+foB+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoSEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeFhYiDhIWEhoaFh4WFhIOFhYaGh4aGhYaGhoWGh4SDhIWCgYKBgISDgoJ9gYGAf4OBfn9/gH1/fH19fn17fn18fXl6enl7fH16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFhoSGhYWFhYWFg4OBg4GAgYGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhoaIiYaFiIeJh4aHh4WEhoWFhoWEh4SEhYSIhoaIhYWEgoWFhoWGhoeEhoaGhYWGgoODhYCAgYCAhICDgHyBgH5+g4B9f3+BfYB8fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgYCCgYCAgIOBfn5/gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhYSFhIeGhoaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgISAfIF/fX6Cfn6AfoB+f319fn1+e399e3p5enp5enx9eXp7e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeGhISEgoWDg4aCg4WFhIaEh4aFhoWFg4OFhIWGhYaEhISEhYOFhICAgoN/fn9/f3+AhH98gH19f4J9gIF+foF+fn59fX97f3x7enl5enl6e3x5enp6e3t8ent7e3x9fX19gH19fHt9gH99fIaDhoaFhoaDhIKFgoWBgYB/f4CAfn+BgXx+f39+f4CCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDgoSFhYeGhoSFh4WHhYaCg4KCg4KChYGDhISFhoSGhoaHhoWDhISDhIWFhYOEg4OEgoSEgH+Cgn99fn5+fn+Efnt/fHyAgX6BgH1+g3x+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6fHx7fH5+fX+AfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B+f3+CfH1/fn5/f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBgoaFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4WFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGBfoJ/fX+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn1+fX+AgICGg4SFhIWChIKChIKBgIKAfn1+f35/foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYOFg4KDhYWChIGDgIGAgYCBgoGAgYSDg4aFhYeGhYWEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fHx+fXx+g317fnx9gH+Ag319gIF/fn99fHx9fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af3+Af4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pjw+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE9MzY2Ojs8OEM8QUE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1svLy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTU1NPT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88Ozk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkeo2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbLy9HT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfY19fX2tva2tra2tra29zb29zZ19fX19fX19fW1tbW1tfa29ra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGRJSUxOQDk5OjQ7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU1Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWy8yDbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI2Li4uLi4uLi4uKioqIob+9vb29vb28vLy8vL20i4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlJiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18vNTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxYUlNTU1NTU1NTU1NTTnquqqqqqqqqqqmpqamsm1RTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CQDk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fLzVIsMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKaeXFZXV1dXV1dXV1dXV1N9sKurq6urq6urqqqqrZ1ZWFhXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw7Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzM5cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqomZhYmJiYmJiYmJiYmJehbOvr6+vr6+vr6+vr7GhY2JiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ojo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2MzNxMLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Ozs3LzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMy8vLy87S0tLS0tLS0tLS0tPT0czNzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ozg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjNzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7S08/P0NTSz8/P09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fX19fX19fW1tbW1tbV1dbW1tbV1tbW1tbX1tbX2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Sq5zP0ciUp9LRx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExCQD09PD06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StpylpNGarJyw0ZmsmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pzp2ckZ68lYicnsSShp2czc/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pjw8OTY/Qj9COjY0ODo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+YoJuyrsHJmJjFvMmXmcXQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qjo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9O0mZaquKTWlJafztGSmaHP0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PTw5NjQ6OTg6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/KoKO/ypyljKet2KqZqtTPz8/Uq5p+o4+ks5/Dm9qto7+e1dHQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+OTw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ1Kybp4uVodCKkp7Hy4iVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW19fX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NO2srKlmarR26WZs9Dbo5m11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxKKZlp2rkqeaoK2Qp5ieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKugx9Wiq6SdsaSlqKCvp6KpndDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLS0A+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTyJGNtNadko261ZqSjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWlqW0xfTUpMSlVMRkI8PD9GRUdLSD02Njc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTIwdXT07nH1dPTucjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QURMTEA+Nzc1Ojg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR09TS0tLV1NPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9PTc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRDSTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSUQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNBTEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUUE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29va2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg4OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODo4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTk6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtxdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dXx2fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NjU0Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NDczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozs+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo3Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRj44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjY4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5urm5uLe3trW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjY0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztbW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7a1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e3t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkJAP0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rrK+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqainqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQUE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaWlpaWmqKioqKilp6iop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ2NTczODo6Ojo6PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs7QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKWnp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGgn5+enpycnJydnZ2cnZ6foKKhoqOjo6GioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeYl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QD9CQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3NTc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OSlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6emn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqampKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg5Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz5BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpqaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6enpaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOkpqalpaanpqainZyfoZ+XkZGQlJeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzk5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWmpqWlo6CgoaGgmZKQj5abmZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoJ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpOSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1OTk4OTw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpKSmpqWkpKOioaGenJuVkpSYnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKjo6SkpKSioaGem5qZl6G1npmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODY2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqZl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ogn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoKCipKGioqGhoJ6cm5ubmZ+rm5yam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ojc1Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgpbOsoKCfn56cmZmampuuanadnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpybmpuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgn6aSm6ufoKCem5qZmpmohER/n56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6gnmKcpp6enJqam5yho1FHg6CdnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg6Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52bmqZmXaOgm5qZm52crnVJTIagnJydnJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD45Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZikgFJ4opmZmp2boKRfVk6HoZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoKGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRcXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmJiZoIhbX5SamZucnKOPZFpMgaKenp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1tMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmZ+XXV12l5qcnZ2igWRZTX6inp6enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5qcnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3OTg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZmmBhYICWnZyemHRjVU6Aop+fn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmZ9pXltlf5ycnoxqX1BShp6bnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampeTc2hhVHaTl5yHXFZQV4qSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGOkpqekn2go5aknG5MT2OGhoKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAhKCdjn9slqWVn4CJf19yf4CCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjkzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+f4Cii3xuUnWcjIxacX18fn18ho6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2YmndYT0xwlIaCTGBwcXeIhYqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GNo41VLzA9d4d3dkFFXmtthJCJiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVRiUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuippxnQVpIO3d5a2dFMDhZbHOQj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUX01IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqa+PSm+heEF7d2RhUFFbR2BuiqGhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6ijeGDA1qZDe4yAdU9tjnZTZH+jqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKenmZ2kpaOinWJ/vcCvd56jmpRlTGF4bVF0laKioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqGip6GmrqamnZ5qhJy6j6bQoZmxqFhMrJNTZY+gnqCgnp2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKvq6Kihnd+fXLPybGbp69rVaqwYlqHpp+loqGdn6KYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e3tLW2s62urY+Gg26PzbmVkaOXdFRvenNue5Wmqqejn56jm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQD9CQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyt7u7u7m5wbi0taCIeWRZn7fApqmdiHdrcW94eHp9ho6SmJyipaarpaSYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1t8HGzM/OzMm+s6SQc2ZSRIuXiYmIfnhxbmdmbGlrcXJxcXJ0fIypxMS7oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWFmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxcfb4+Pay7yvpJeIdFlaUUNpemxvdW5rZWVZV15YXGNpaWhlYGiJtMDAuamvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d29tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca+zdHVyrmnnZSGcl5RVEtEW2ZeZGtlYWBoWVRYUlZYWVxYWnSZtrurtLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnZycnZyZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8LBx8vIt5R1ZVVQT1RIPl5rXl9lYmBdZGFTVlZVU1RXcpursKqoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDubjDm2FJREdLRD1bZWJhaGNgW2NfV1FOT09Vf7S6rK6lpKOnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn52Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7d25raWh2WmdzeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExMTCxMGtg09GTUU7TVtfZWtlX1tgWVhSTVR/oqq5tbKsqaOhraqsp62frLS0v8O+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnZlZmpqaF5rcG55eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwsaWalhHPz9HXmNiamBaWFdTVXaZtr67vLq8rK2mqbu6ube/s7W4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrLGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FodmhqanVueWxeZFtWYFlMSEQ2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzsXGxr2pclBLMFhTVWZhU05PcKnIyMLExsC8vrSxsLDBvr7BxsC+t7bDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra+1pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjouUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfXhwZ2BrandtaWZ2b3RjXWNVV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwsG8kT9Pdn6JVkxvpMvUxba/v8C/uru9tbOzwL+5v8K5wbe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eYBzcGZlZ2RsZWJrbm9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28xad3a4OQmG+pyMjH0cGvvb24ubu7vre0sbq/tLy+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9eoN4bmZhZWJhY2RkamNnZFtaWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwLq/wLy7xb26wMS/vb6vc2V9kYuJ0cW/v8m/sMG/ure7vrm1uLS4vLW9uLW0r7O8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWNjaGtnZ2pmal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HWjbe/u8O1use2tbi6vLi5tqqjmI5/g8m/v7vBvrnGvcK/vMW4t7e0uLa2vLu5trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZ29qZWxoWVlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxHenzL3Ht7m3rba0t7mztbG8ycOVS3rKvr++vby/yMPFxb7HuLaztb24uLi+u7q5vLu6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnFncWt0ZmNuYFxVSEtKREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1q90f7rIz8LAuK60tLu9t7mxvcPKj0N0zcPCv769vMfMx8fEx7y0wMHAvbu8wMO6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZmxqb3VveGRoY1xjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLGydKacXKr0tHMysS1ur/EyL6+tL/AwHlSbcvGwr7BvL/DzMrHxcbBucK6xb/Av8LIvcfHxsW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdHBtbXRsbW9gY19iYk5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvE0MO6vrzEvre8wL/Jz8fIysrCh3Jzo8vMy83KxsLDy87BvLi9urFwY2K7yMTAwL/EwMrJw8PDw7u3tMG5wL3CxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2moZ+bgnt6iHttbXh8YHFkXF9gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vaw762vsC+vrqmnKmytsO/pXp2eJrEx8vIwcPAwMnKwb+7ubGhfXNqrcjFxL/Awb/Lx8PAyMC9rKvAs7u7wb7Ays7KxL21vLu5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN5dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLltrM69trnAvKt+bmhubHKBlZhzd3yXvb/GwLnAvL7FxL29uLGwmZB+gJvKwsO8vb+/w8O+v8i9v6WVw7S2tb2+vs7MzMK4sri4t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3FvalxgYVpUUUFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM20doCzvba1wqWHaVpdYE1SW1puc3eAn7i4wrqzu7e7vb+6u7uupJuZiJF+wMTDvry/u7u4tsHCtsKggae2qrC+wrrSycjDsbC0tLW8ub66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vLSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2d3hucmFfZ11bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJqIR4iaCvtZ5rZWZWWF9JSU1QU2x3haWwt765srWyu7m8trm+tJWcp5ahcK7JxMC9v7mzrrK9u66/n3J6o42TnJ+lw8K/vayqr62yure6vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cm1gZGJcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xauIfHaMoJlgVENXVkhha1ZPRklgjaCrr7a6tbSyrLy5uLW4wb2LmbKjpnKly8K/ubq1rqWss7CmtKF5hKeXkY+Qjo6ZsLSlqKmuwbWzsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c29kXmhZXV5TT05CP0pDQUtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+1kYJ4iI9vTko/Y1pBTneAlGtNQVyBsLWztbK0r6y7uri2ub/GdoSqn5tlp7+4tbKxra2fpKennaequsXL08CkkJSXgoOgoKSlvMSsrqewq6+xsa2xrq6vubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnRtdmpsXVxrVV5cUE5IREdNQkdORzg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR7WEZBToZaSkpYdo2AY0BSormztLKwsa2wubi2u7e6vZCisqykc6uwqautq6OooJ2enZiYzubh4d/VxqeRiXltcZehqcGmqKihpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGsqqmur7CtpaaqpKizrq2rqKamqaumqqersqyvs7GrqZaBf4F3cnlpdXRvZVViZFhdUk9NSUBJUkROQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsbuqmZmVaU5AUnhxUElJS2ebgVlFUa27sayzr66srba2srS1rqmmn5qbnZ+mqJ6gqKmfoaeWm5aVm9vPxsbMz8y/m31samV7pcaql6Kin5+loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqmkqaumqayrpqGIeYN8dn96Y3htblxRaVVQT0dQTU1DUFJAPjs+NDo6NTs6PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqWmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi8wqukvmlFUpyCUVdJSV9LU45gY2KArrWqsrSuqquvsLKzraWdkZeTj5ign6KgnKOkn52ok5mUk66cY3KQtMbHx6t8aWluZpS1i5uen6GcoZ+jqKecp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyWk4+PkpGZkJaVmJefmJuam6SZl5SVmp2gnaeopaCjoqGjn5ygqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfn2AdXZ9bmx7ZGhWU2ROSkhHT1NOS05IPEVAPTJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra2urm6t7e7rqigoamhqsa/yqFQQXKeeE9uS0tiZXVzX1pecI+xr66ztaqmrKyjm5mUjZGVl5iYnJ+iopydpJ6apJaWlpehSy1IWoizwsGrgHGDiYN4fZSinp+mnp2fo6aonqOmn6qdqq2qrqeosKWjpKanrKahpaKbmZ6vqK6yq6arqqCbmJiYlZOWmpOVlpqWm5eYmKGenJyXm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehn6CloqagiXyAfnd5fGV5eWFiU1ZhSUlLTFNVSlNRTTk+QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnaPHx49XU0lko1xlfm9yXVBrY1tkX11rj7SwsLispqGcnZqUmJqZkI6RlZGMjo2TmaKcl6KYmZWchFJrf2lglK+unoOBnZ6jmn+qqqWhsKOao6amqqKhqqKppKiyq7Gyq7mopqunq6uorKynoaCjsa6ysbSqsq+jmZydnqGYm5uamJmblZablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKKno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgm1lXFNbWk1SS09PVk1UTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeq6SNelVocnV1cWJ2dlhXY2BjZ1lYV2Wsrqyvp5+eoqGXkZScoJyZmJKTn5yho5qempaemZ2WmHxrkKKLXnCZmI+LjZ6jpaent7WwprOsoa2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO1uLO4rbK0pKCdpaCsoaGioaCamZaWoJybmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBg398eHZqd3ZebVtSYUlSVkhGVldLQ01IPUtJOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqaiuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boqGgpIBugnBgY1hMW1NaTUxQWFJITU1Hl6yqqaWgn5qRkpSYmJaWlYyIi46VnZydnJ6WnZiln5GBgLPKypNig4WGj4iVoKOhrry+uKy0tLC3sK60qaakpaypubO1u8O8w8G3u7arrrG4t7yvs7C1wby3vrOztaKsoqmpsqmrqKeompmemqqnoJmooJ+fqKilpZ+dqqKinpufqKCkp62ZoKOenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhoV+dnJtaXdtaG5dWFtDV05KR01IQ0ZOPT5MPjQ8OjY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamplJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn52KYldeZWBXTVFHPj4/Q0M/PkJReKitqaqmoJ6foaOen56bnZyUk5WVnp6YlIWdmZ+ZqqWNfoGw1NKxdGFze4N4jZaZlaXAwL61ubvAw7m9u6yup7GtscK2uMLGwMjKwMq/sLm5vbjCvri0u8bEvcO8uLSqs62qs7Svs66qr6OerKi3sq2jsKaho7CxrrCkpa6joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIREpQST9FQjRGSDk2PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PDs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+VfWBeZWBRR0Q9Qz9FPD85Nk5/qrOnpKOioJ6lrKafmJ2VkpqemZWMioaIhnhshp+ioamtkH1wpNWUe4dLWnB0cYKDeniTvcjCv8TIzdDIy8Oyt7W+sr7Fu77MzcbMzMzSx76/wMK9x8fCuMTKycTBx7+6tLq7tbu3sLayq7uyrru3wLu6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOVlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZlpcRkxNRURUTUVCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxAP0FBQT6Sq6Cnrqeiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXNqYVdORT5JWXxwYkI9XI6urKGZm5yenpmXl5iTjY+Xl5SPjZCMgoOCdnJwbG+NpKuuro6FZoOof3x2X2JgZGloY1tSdsDKxMTL0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbGxsrIz7/J0c3HxsnGwr3Ewb+/v7W+s62/wMPEyMXIxK+/ubK4vcTCwbu8vLWup6euqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl1c2ViZ3JvZ19aWkRPTUNGUUlEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojs+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpudlmtmXVRJREA/S4WepZqEoLKto56cn5qYl5STlJeRkJCNiISEiYeDgIGBgHlxcW5qdqK2spd0fXx6en55e5KEZVxQbGlaPG7Oz9DEzdTV2NHXzcbHyczDxcrPytLX0tfS1dbT1MjMx8zNytPNztPNxsnKy8LHzMfJyca/w7OzyMXLy8zPx8q/vr+9wcfFzMzJycDDwK6ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d3amVXWFJETkdASVFDPkI9OjIyQTxFPDc4PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2OTo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZ1jU0xKREM/QlKt0b2yr6acnJygpKGdmpSUlZSKfXlxbGViaHJwcnuFioB1cG1wcm2EpJmGZXx4d3+Pl5yQaWhmZKildT+k2M/Rws/T1tjV1dLLyc7Qy8bN0srS1dfZ1tjT1tjN0srO0czP0c3T0MDJyMvEzM3Mz8/Gx8i2wMvA0s3M0MfKycDEw8jPzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2Flc2NdUlxKS0dBRklKPztBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaWloKKjW0lAQURBRlB1sa+mmpSXn5yaoKCem52alYl3aWRhX2BgX15fX11hbHVzcG9ua3BucoSQhl5fXllXcYN9fFxTcVWKt4ljz9XS0MzQzdPX1tPV0M/S09HJ09HI0NfX2NLY0tfZ1NbMz8/JzdLMz9HAx8TJx8/O0tHSyMzNwMvNxtTPzc/IxcvHx8nMy9TU0dXP0szTwrnFsaWota6om6irpZ2yqLCzrKyTj5OOiIqOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlFgSkpDRkNTTj88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCPDo8NzQ6Pjw/QD1GQUQ9gqScoKWepaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqeqqKGjrGdDOD0+RFiCqqifl5WXmZqcn52Ym52TfXFlY2JfX2FfXmFgXmFgX2BlbXBwbWptb3N0hn5PT1JKUW97bH5sU3JakqyCkdDV1NDJz8zS1tLR1s3P1dXRxdHTytDU1dbO09HY19fXzMjOxMrPzcrNwMrBycrOz9DM0M7OzM/QyMzR0cvOy8PKyMrNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zv7uxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0lGRkVNWUU7QD0zMzw8ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg/OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoKCjp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLJ8SEZCO1aNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGBeX19eXGJtcm5tcXFycnZxVE9OTVxhdWZ6hXZZZ4OMdJ7M0tHNxs7MzdTLztLMytbW0MzQ08vM0NLTys7R1dLV1srAysLGzcPJysPNxMbJy8vPy87N0c7UzMfJ0M3Jx8vGx8LGyszO0dHH0M/NzczQxcfBuLm9w8K9w7mysr6wu8PDtaqYpaGYlpGVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR01JUVFCO0Q/OzY4Ojg6OzU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvb3aPmo2Ml5WQk5GRlZaVkIt7ZWJiYmBdXmFjYmBfX2BhYWBfXVtdZ3Fxb3BxbWltcnFdSkNNTl1bYHFiSF1vZ1aRxs3NxsTGzcrRx8rNzcXQ0s/NzNTKx8rOz8fGztLL0M/FusS/xsq9w8fJzsXDyMDHzsjEzcvN0MnFxdDJxsLGycW/wcjNzMzPw8rMycfM0MTFyLvHw8nJws/Avby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSUhHSU1VRz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChqGpk42Nlo+Fg4ODgX2EhH9zX1teXV5gXmBjZGNfXVxeX2BgX1taXGFrcnBtbWhnaWl3g2BGREhHQj9NTFFUZ15Ol73HxMDCv8LHycjIyce/xMvFx8rMycTBysnBwcvPxMvIv7nBvMbIvsDGz8vEwMO7ysfIu8nGxcrBvsLLxsXEvsa+vcHExszGxby/ysPFx9LFwcnAysrHyMbQw8PGw67Ey8fDyre/vLqzqaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQ0dETERGUz81NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai+uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtm1eenudkYqSloZ6gISFf3V4dXJwX1pbXGBgYmNkZGVkYFtcXl1eXV9bWVpcYW5xbWlmZ2tobH5xW01JRzhGP0NTSlRkWJSvv7i4u7m3wMHBw729uLy+uMPJxMbBvMa/t7rDyL/Bybu2u7vFw7+8ws7Dxr6+tcG+xLu9x7zDurW9xsTCw7fAtra/v7zNxL22usi7v77MxMLGw8bJx8nG0MbCzMeyx8nDzszAxcK/vLK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUVCRkpAOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstau3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrPxcnFx8G6xb2srqdgY3eAkouIi4R4f4aGf32De3R0Y1xcXV5fYGJjYmJkZWJdXFtcXlxeXVpbXF1ncm9rZGNpaWt0gW1YS0NOVzk6TUZIW1SVorOws7KysrK6tLuwtq+zrrG6wbvAxLu/urSxur7AuMe4tLy2wcK9uL3GwcO7ta+ztbu/tMW4u7Wsub2+wL2xu7awt7qzxr23r7y/tbe1xb2+w8XAxMbGx8zFv8XGu8fLv8/Jx8PFwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKR0JEQURGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CaW2dviI6FiIl6eH6FhnZ3gXxzaF1dXV1eYF9gZGFeY2VjX15cW15cXV5aW1tdX2tvbGZjZmhoand7X09RWUU5OEZJREphn5ekp66qqKqnsqy0r7Gnraarsru5tcK5ubmvqrS5u7PBuq/Asb28u7W7x7nDt62qqLCywLa4vbCxqLKztbu8q662p662rryysKq4sK67rru4u8DBvrrDv8bDxcC8xsHHyrjFx8W/x8PCucTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTExNSkVBQz9GQTo6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXN0svDxcHEz8bNwcLGv8TEw8PKwsnKv8C8wrqztbXDr6qxk1tpfpKIjo97eH2JhXl7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpaWlxjbW1mZGRkZmdqemxPWltEQDs2Oj1NipqRlJ+kqqGmoamoq6mvoqWeqay0tbC8uK+2rqett7Szu7ezvK+4ubWyu8GywK+lqaOrsbOzqL2qq6irrK61tKaorqGlsKmzp6eorqaot6yxs7e6uruyvL6+vsS/tcHAx8i3vr/Ft8XDv7u/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpTU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvBy767yba9w766yrjBw8K1try2sa+1vK6oq5NjbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tYV1lcX2VqZGJjYWRkaG13XUxKVlZRUT5Cep2RjoeZnKWgoJ6jo6WlrJ6bmqOkq7Gutramr6umqbOrs7mwtbWttrmysLq6sbaloKWgprGorKm5qqWnp6ins62gp6afnKSlrJ+fp6ShobGtrayytbOzsLW8trvBwLK6vsPBsbm5wrPAvcC1uLu9vrzCx8TDxL+/xKCEeHFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG6vbagnpWdoKa6tquzs7uzxM/Jy8LFuLfHwMy/uMq3u8W4s8W4s7/ArLa8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXlxbXFxYWVhYWFZYWl1eY2JgY2NjYmVma3JXUGBnb2pafI+WjIuClpqcopqcnaGjoaWcmaGanamurLC0oqioqaurpLS4rLavrLK0rrO1r7Cqn56fpKKypKaquK2ipqafqK2qmZ+fnpmdn6WamaOcnJ6wqayoqqusrbCyuK+4ubuwtry7uquzsrmzvbS3srG1tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU2MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnIuLi/t7LCtLG7u6y6urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhXV1dXV1hXWl1hYmNjYmJjZGRvbGV0fG9KT4KQlIqMhZOam6Obl5mipKCimp2fmZesq6ytsKCkoayqpqG0r7CxrKivsqe6s6a1oKKfnKOiraOiqraqoqOmnqamo5aYnZeZmp2gmpednJ2craGsqKOkpq2rsrOqtbCyq7K5ta+qr7Kys7ezrqmtrrG3sbq2ur2/t7OxlIZ6dmZfZl9bWVZTWlVLW1FMSkVIS0lDPT9CQkBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/sp2lo5ilscO1tr2ttLjCzMjGv8W2wcDHzrfAw72zubmywLaxubutsrWvn5qkqqCUm5B4f4OEf3hvcXRxaGVkaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1VXYGJjYWFiYGBkZnFxdnlgPkxgco2JjoiOmJebmZKdnaahnJ2mm5qYqaStrqmaoaK2qKCfrai1qaanrbCkt7Cjt6CjnJmZqqahmq25r6OhpJyioJ+TlaGUlpabmZiWl5yVn6meqqSinaOqqrCtqLSsqqatsrClq62zsbCwr6+nqKeyrbG0sLy0ureuo5SCendlX2FXWVhTUlRLTV5MUExHSE1MRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va2dp6eiqrvAvcC5rrS4wczIxcLDvcW4yMyywcLBrry7tbu8tbm5sLCxqpyaoaqVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dWVVpiYmBgYV9fYGJncG90UjEsKT94jo6JjJSYlpqRm5ukoqCkpJ2bnaSdqa2knqChtaagoKKnsqGlp6WvpbGuq7WeoJ2VlamhopStsbGfoqOenpibk4ugk5GTmJiSlpiYl56nm6eiopqkpaWrpKWwp6Wiq6ytpqmur6+rqKqqs6amq6+0sa68trGwr5+Se3hzZWJcW11YTkxRSFJhTVZQT0pOT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC8sbesnqWmrLi7vMHFurK5tcTJycDCxsXHtsbEs8G/xau3t722vbq7tbKsraiZmaCkjIp0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlZSVFJUX19dXl9cXV1gYWhvbkkrHylFb5ONh4qOm5ObkpeboZ6poqGioaGgmqepopicorCpoKCcpKmdp6KerKyqqa2toqGhlZiimpyPq6iwnJ+in5+XmZOKnZGNkpOWkJiYk5yho5yloaKVoKKkpZujq6WipKqkqq2lrbKppqWmprWmqaits7W0ubqvq6yejHNxcGFbV1ZWUkdRT0haXE9SSlRLU0xFR0pDODs7PTw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuxrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvbG+w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUFhcWltcXFxdXF9ia2pKOy89SVyHjoWJiZOUnJaWm6SkpqSppKekoZajq6KTl6Otp5+bmJqfnq6ZnKqzn6Wmn6OjoZSUm5aWkqmprZqcn6Ggm5SQjJmNi5GNko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuvpK64paOkoqytqqirr7S3sr21s6uumIV1dGlcWVlTVVJGWExRW1hNVU9QTFFSSU9JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY4Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+szMbFuMDOz8ezxLu3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBQWFlZWVxbWltdXmNwbE1CT3Rsa4SAi4ePkZqZlZqmpKKqqKWtoqWWnKmdk5Oip6Wcl4+OmZ2tlpinqpifnZSloJ6SkZKRk5WoqqWamJmenpaOjIuThYiNg4+LkZWRoJ6hpJmWn5WaoaKelJulpaioqKCwsKexvaefo6y0qq6nr7SwubXAsa6wq5F/c3RiV1RVTlJKR1ZQUlJMTFhOS0xPU0dOS0FDRkRDPkI3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsba4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucWpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUU1OTVJXWFlYWFdaW1tgaWpmbGR1dmF7fIuBjIuQlJKXo5abpqOiqJuklZ2imJCMnaGZlpaFhJGao4+Vo5yVlpWHopqbk4yOipCapaeblZWXnJGTiJSOi4GLjYCQi5KSkqGaoKKWlJmYlaKmmo2Zpaeop6GgtLKos7ihnaO2rKqtpLKyprW7tKussaKKenRuXk5RUU1PRE5OTlBLRk5OSkpOTlFITUpBSExJSEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODU4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrCkp6SqpaCppqSzqqKyxLW1srPGxbe6w8rMxrOsur20uMCvramwnqauu6+toJqbnpWViHyEbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJSUlBRVFFTVVFOTUtLU1dXVldXV1daXGFlWmBbbnhldnKFeoWBjImMl5uKlZegnqCXo5OemZOLhZeZi3OMgn2Nl5WFkpmQk46Ne5mPnIyCiYCKmKCjnpCTmJaFjoKUfn5zio56kIeTkJCdm5qakpaQno6jo46JmqCho6SborSvrK+toJimuKalsKGxrpyxvKqpr6mZhHh0ZFZNUlBQTUNTTkxQTUJQUUhJTlNOSUpKRUtNR0tLPjg0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6alpqamsqemtMG4r7SwycS4ucDOxr6zrbvBrK3EraihppKdpreto6CRlpeSkH54f2ZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KR05TU1NUVFNVWFpcaFhaWGlxa2ZGUGmJeo5/hZaRho6Mm5WalZWUkYyUiH6SiF47Vm57i5OJgIyRjI+GhnKLhJaBeYF7hpSdlYOWjpCPg4Z9k3hxb4aNfomBkI6Ql5qZk4uQip2In5iIiJaemqGgl6euqa2pqJ6WrbOipa2ZrauYqLSjqa2ik390bmBbTlNSV0xEVEpQTExGTk9JRUxRTUtQSklOUEdKSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKKtoaamqqCnqaejqrCop7TCubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qZh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSEZITlFRTE9SVFVXWWBgVVNkbGNGOTh6joqIdoGNh3+FiJeKlJWJkYWDkoR3h35fSVBtd4qRg32EjIqEf39tfn+Td3V2eISNmnBRjYiKhnx+eZR2Z3eGiH6KiJWLjpGTl4yEioiVhJuNgoSSm5aenZSko6ippaSem7CqoaSkkaaqlqKqnKGmp4p3bmZeXEhRUVNNSVVNU0lMS09JSEZKTk1NVUtRUlBHSkQ9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6evrKq1vLa4t7PBu7anuci4tqiotbaqsrynnpWOf4mUqZaVi3+OhIN+eHFvWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZTlFTU1VaZl1WYWlaWlFLiH2NgGx3f3t3gIePfpCZi455g419c353cW10cHSNjYB6fomqhHp7aHZ7jnBybXiBi42SeHuAe4B3c3KSeGh1hYSEhXyVi4iKjYuAf4SLjYCUhHyAj5iUnJaRn52pnqChnaCppZ+dmI2npJKgoJaenqSCc2liXV1KV1BSSEtYUk9KTUxSSkpKTFBJTFFNUlVORklCPTc4Ozk5Pj06Ozw5OEA/Ojo+PDc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnJ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX93hnh8dnBvallLSElIR0VISFBUVFRXV1NVVVVVVldYV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxOUVFTVl5iYWBjVmiBjpKJi3Rgcnpwc3qEjHmBmJJ+b4SNenV5bmp9rXx0kIp+eoaSgHx/dGZ1fIZsb2hzfIqNh4BtenF9cW12j3FocYF+jnBEi4WCg4V/d3h6jIZ9jHt1fY6Sj5iLkpubo5aZnZudnqGclo2LpZuOnZeOlpiQeW9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlFPSU9QTEZEPTs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6epsK+xq7u4q7q+uLOsp5uwp6ybj5acpamkoZiajoSSeYmPi4t2cXxtdXFqbWpYS0ZHRUFAQ0RITExNUVFPUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpZSk5PUVRYXF5gXFl5mZy8e21wXHRxaXZzg4x2eYmDbWqJkHdyd2hpf4FxlpGKgH2Vf0mSmW5nd36CbWpkbHmFkJKGa3NsfG5yfIZpbXB/c42JhYZ7fX57d3B1dIaCeYF5cHyOjIqTg5aWmJqQk5aWmZadloyDiZ+Si5KNhpCWgG9qb29vWVZYVFJSWU9SVVRSWFVNT0hNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJqfpKyvoq2qqLWvrqyzv6u8wr+mopqVpJiejYSLlKGimJmRk4tzjnqAhoyGdW90bHFtZWtrWU5ERkNAPD4+QkZGR0tLS0xPUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0pNTk9SVlpRV1VTm3tYkGBqcF53amh5dYaFcn6EgXFqlo9ycXppaZyOTHmEkYiEjWYxdodya319g3RmZXV+hISFgGZpbHVrcIB8aHFxfG6TjY97dH19cXFvdm2Df3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtOUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaOlZmLjoV6hJCYlY2QjJCHcYeCdIeMhnpwc3FvcGRwZ19URklDPzw7OTo/QEFEQ0VHSUtPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVLQUhPR16mqphncm9ldmdsfXyAfXaAgoJ2b52Scnd+cXOShjVxnKecjaChhKKFdnCGe4Z8c4ytjYmBaGZiam5ybXCDdWlvWHVwjpuRdm1/e31ucm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jnx0cnFtYFxdXlxaWWFfUk5bWlhXTEhJRklIP0NBQkg/Q0Q9Ozo3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUwMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KRgZOHlZGdpKeer5WltKmusK7BsrvBxZaPjJSPgIh8boGQkomDioePhXWDg2yViIh8dXh4bXhud2RqXklQRz4/NzQ0ODs6Oz0+QEJFSEtMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTVBMN0NNUFFCRnxqdXJybndncIGCd3mAf3uIe3Oel3h8hH6DmIOanGCFqZ6ci4OQjnp2h36JiI5zipePhHtcZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1Z2hgW1xeU1xnXldQVFhbVUdKSkVMRz9GQERDP0FBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjU0MjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydnqaRoKugsaivwLK7xbqWjpGTh3qGdmt/i5GDfYqDjox4g4BzoISKfX2Bf3CBfnpod2tSWExARTIxMTI3NjY4ODo8PkFFRkZHSUtNT1FSU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJS01OUUtKU1pWT0dgeH9ygHJ0a3aJhnV4hIN6koN1nZaGhIyQk6SMrKlIhqyvroqBgJSKgYqBhZKph4GYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGR22Ad3J5dmhta192fYKIf4eEi3mUnJuJioiRf3p1inZ8eG1vd36BdXVzbVxeXlxjZFhnZlxVUFBXWVBETEtGT0lDRkNDQT9DQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc3ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeQjpWXkpagnaygprivs7yzl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4l+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz84NC5dlnBzo1VGSUtMTU9XX1ZrV1laYoGJfIt5fHp/i4x6gYSMfZaRf52elZKZmaSskpm7saa6x8Oni4yhpY6TiYGRfHGDnp+RnX93hYWKj4eQaWhwhIF0jIaEinKGgneHgHt2hHxtdnVmf5SOhoiIhoeHoKqiloiOl396gYh6eW9na3h+fIB1bGZeWlteal5hZ2BaT0xOV1JRSFBKRE5HQ0pEQ0FEQ0I8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251b2Z3gnp/jH+BkI6KmpqknKGspqqusJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoSAgYyKgomNg3+Kf2xwal1CQTQuLS8vLi4wMjIzNDc3ODs9P0JESElOUVJUUlNTVFJQT0hFQjw4Ny85Qz48PDYzLmyTl01QSEpMS0pOVl9femRjaG2Qj4OQiouEh4iUg46LmYecnI+gp6KhqZKntKGnwcKtx694uZSafI2hnpiEk4WCjqGflJmRhYqFj5qRlmxwdYqMgpWMjY53j4RxbYWBipaRgoWIcoiglYaRiY2PlqS0qJuMlKKCh5KDfX9ramp8goODdWNeZWBbaGxdbWxfV0tITlJQTkxMRklQQ0RORkJDRUZDPjo5Nj08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZwdpGGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkZJ9ioSYkpCDgICLjImGkIeEiYZ4eH9nTVI+Ly8uLC8uLS8wMDAyMTI1Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw3NTI8P1I1SEhITEtNTlFeaoR4b3t2k5KPnpyak5uQnZGYmqSapKecpqmnqLOWqr2qtcfItsjQz76boHBpqqmfhJOShZygmpuZppGRiJWjm5t4en6UmJOhk5eXgZSee3eVkqqyiIyWnnyTnZuNkZWYo6Glta+ckZinhpaPjYCIbHNzfYF+c2piXmJgYmhlYGdnXFJFSktPTklJTEZHTUNITUZGQ0JHRUI7ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG18YXeOfXuTjo6Kn5KXnZabqpieqkJEfYeJh5iNeIKNi46NfIqGj5COgYKAiYuKhZKFg4aJgYCHdl5iUDU2MC0xLywuMC8uLy4uMDAxNT5BQU1QUlNRUlNUUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lJTU5QWWqBinONg5ecn6u1sZ6opqijpLCorbOurqq4r7G8m7HDqrnJy7fDv7elorCzrKyqo4uWmISlpqCjl4GmmY2iqqiliIWUpKGhqqCkqY+bsIuVo6a3upugoq+SopyhnY+ioauuq7K0oZSkqYeZiJKJlXl6foaBaWJpXWZjX2RkX2dnX1tPQ0lIU05GSEtGSkdGRkhBS0ZERkZCOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldob1h5hHaBk4WHgpyDkZCMktrInZZzVpeIj4icj3yGjI6KinqHgoeRjoOEgYuFhoiShoKFiYeIh4dxbmFARTY0PDIvMTEwLSwrLTAuLTQ/Q0FNVVBSU1VVVlVNW1BHSEQ8Pj5GSENEQTc7PDVDOz1GS0lGSFFOUFd+jpqAppyooKi4wb2lr8GzqbC9sLW6s7yyv7S5uaK3xKe1yMe1vbi0qKOzrbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6or7a6srqsr7Wisauxtbu2tK20n6anoqaZqK+ssbi3t6eataiLpI2Qkp6GeIKFeFtjZldnY2JkYWFnYVtUSkRETFRQSElJRElHRUFAQEtEQk1HPTg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYWJXeXRxgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhIGOf4GJj4Z/hoiGioeRe3huXVdARE48Njo0NUFCNzY0MC82Q0hDUVtPUVVXVVxXT19VSUtLQT8+R0tGRUQ7PkA3RDc/QkpKRUZWU09ei56on6ytuaywucbEsrjBu7GxvrS1v7K8rrVzr7KkucSjr8a4sLOxs6ektbaqsKCil5uikqWwrqatq6ekmKGttLuiqLK6tby/zL/Fxb29s8G3ure+trq3uKursKSvqKy9r7y6wcGrmLmnlK2Ol5epiH2Dfm1YZWNZbGZrZldcZFlWU0lHRkxQR0NISUFIRD4/QkJMQD9NRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqcH6OhICOhW56c3iHYrmhmaOJlJSWkpSTjY+XkoeHe4aBjZWKgISBinp8ioeGfIqCgouEln14enVlUFxkR0VMO1FjYVteU0c/O0hQRFpjUVFZWFpnWVNgX0xTUEVBP0lKSEVFQUBDPEU2Qj5IR0pMU1pUXZCqsrC2ssK3tLfFyri5v7q2s7m5tbyyuLDEX3OwpLGanqq8qKSoq6qjorK1oaqon5WWnpigrqWnpqWfpJSjp7G0qLKzvbbCvtPJydPGwsXMwsrDwL28vru7trSvuLa2wrnFvcLHr564qaGrjaSntYiBgXRhZGRfWWNgamdTWGFWUlVJRUVNSkE+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSsvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42FkHNrcnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWin6DgIJ4e4uDh3uLeYGKgpd+dH16a2VwdVleXFBlZGJgZWRdXFhXXE1kbVVSbW1fbl9YZ2RUWVVKREJLS0lGSEhIR0JJOkQ/SEtTVFVcWluQtLu0urHBura1x8i3tLi0t7ixtbOyrbS1l2N0p5ytb16irJuXoKKbpJ6qpZSfn5CTjpWYmKiepqCempmDpJ6tpaqwrbiwvbnU0c/X0MrM0szPzsrGv77BybzAvMDAxMTEyb7HzbKjurC0rpqrt7uYgHxuX2JeWmBjWmRkUVxgU1FKQ0FFRkU8QEY+QUhCP0M9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFbWWhfb5aSkJRua290dYe0rKGhn4uZnJmMjZWRmpKGiop+iIaLkIuIfIGDc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlmampoYGZpaWxabXOWraS8iIZnXG9nXVpaVEhLTlBKS1BLU1FJTEFKRkpPX15hZmlglrTDrrWuuLmyr8LEs663r6+6qrGwpaq2q4u1p5yapppNmZ2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXm5WWh5+ap5usr6mwqLS01NTU1tPM0NPVzdLPzMTBydC9ycnKydHGzM3Cz9G3r8O8w7mktbnBooRxZV5fX1piWVpmWlFdWE5QQUJIRUJIO0FDPkFHPz9BNztDPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCZ3FveHmDoaqeppeMmpuXi42VkZqOfYmLhY2KiYqQh3yEgnB/h4GGe4dyg5KLjn1xeHVscHh+cXpteHNtaYBwbWNqbXB4aHd8fsu+wd+nbWN4bmNbYWBKUFJVTlleT11cTlBOVFBUVFxubXaCcZWstaqxpK2zqKu6vq+ps6Wjt6WqraCrs6KNsK2Zl5iMjpGRhI6bgY2mkZyJg4uEi4mEi4SUlpiXk5uRnJeZmp+fq6ylqKKsrc/S1dLOzNPU1M/U0c7Hw9TRxs3S09PXzNHRxNHWxcDOx8fCqL22zp58cWhgZF9YYlNfW1BRVFFPSD5ARkFCRTxAQT5EQz4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VVFNTlp1hoWKd2x3cH1+f6GenqGMjJiTk4uMko+VhXmFkJCNi4mIkIZ+gntxfoCAh3qEdYWTkIh/b3ZzbHN9e3d7c4J4cmuAc3JpcHF6eXJ6vsuafYuxhHZyhHZoYWpdQ1pZW1ZlY1hjalNYXF1gY11jd3p9i4GXqKOjn56fpqSprreppbKhoa2goq2hprGeiKaak5KRiY6NiIGTiWqUooyZhIGGfpGDg5OXrYuVjZSZjoaTkZ6XqLCioaGlpKnJzc/Iw8zR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3I19fRyqvCwsuNdXFlYmFaVlpUXVFLR0pKSkA7OjtEQUQ8QkM+R0I+QkI6PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO09MRkpYcIB1fWhyeHKCiYCdlZ2UhYuViY6JiI2Gjn94g5OYioyIiIuIfoJ4c3t9god3f3qGkZWAg253cG12f3Z4fXSFfHpth3Z1b312hHV4e521jDtBisWlfox8aWVXSUNmY2VjZ2pjbXdbXmZoa25obYCCh5GKnJ2fnJCWl52io6SwoqOxnqGknJ+on6Kxm4WdkZGRj4qKioaDj4N+nJuLjYKEhXmUf4KplaONkoqXkox+mIubkquzmJucqJynvsPGubfHztLR0tDM0svI1M7Q1drX19jU2djN2NvOydna0dW+ysu1enlwZ19bVFdSXFhGR0tJRUU9Ojc6QEBCOkdEP0RDQUNCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoSJgYd8eIWWloiOgoeFh3qEeXF6e4OFdXmFjo2ceYtvfHBweoBxe4Bxg4eBbo56dXd8fIJ1fnyGh69zWKnCto2RgnBtYj1eaHJwcXBueHaBZWhvcnV4cXmLho2TkZqVn5SGi5Kan5qdqJ6gq5uhmZidpJ2eq5mKmYuPkY2Ee4eHg4SLjZ+Zk4iDh35smXqEmIaIk4yNlIyGfJyJlJCuqpSWmJ+Zp6+2vamuvsfMycnMy9DJw9LK1NfZ19jX1dvX09nb1dDa2tHWyNTKlnx+a2tdXFFVVGFKQ0ZKSD5BPj03Oj0/Oz1HPD9BQUFEQT4/Ojg3REI3NTU0NzkuNTU2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD5DR1JqXm1kYmZrdoCIcZGQmoB6gI1+goGBhH6De3yEmI2Hi32Fh4B3gnlve3uGgXR5kp6OoHaOdYJ0dYF+dICEb4GQgm+ShHV8gYV6doZ7ibfFpMHJuYGWmo93cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpOUjpeQgomOlpmWlaSbl56VnZKRlqKdmaqVkJCJjJGCi4OIiIGFj5Gdm5mJhYuBhZh6iImfl5CIjYqLgn2hiZGMvKGYk5iZnammpq6fqLa/wMG5yMrOzsXNydHW1dXZ1dfb1NfZ2tvX29rZ2M7bxoh9fGpsaGJWWVdYTkxFTkM7PT08ODo7PTk9QDY9Pz88Pj09OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47OTo3SVBdW1JVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyKjZJ3dnqKe35/foB8hHp9gZGJhIV6hId7dX10bXx9hn5zfpKekZ6DkXuGfniPfnmKim6CmoB0mYZ9gYmFfH6Qeo+pjo/Dob2MnKOcfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkYSIipCSk42cmZKTj5WMi5SenJOflJCNjY+Kfo6NjYqDiJKWmp6eiIuUkZ2RgYt/pZiIhI2ChYSBpYaKjLeYnZGVlqKnoZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27h7fHtubGhaYl1UUU9JRExCPDw+OTk6Ojk5Ozw2Pz0+PD05OTs7MzdEPzczNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OkRXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1DUVNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4d6fHuLhoJ9dIOFeXJ5c22AfoR+d4WboZudlJJ/jIiAmIiAnJJuiKiFeqGLfJGNg4iEnH2akImMo6OgkKSvn4qQi4WLgZKGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5SLhoeLkpKLk5OTjouOiYeVmpyOlJaQipGThX+Kh5GMiomclpiiooaSnZWgiomIjZuQg4eOf4OHhqSFjJGymJ2SlJehop+ZkpydqLO5raa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcoB3amlfYFpVWFlDQElDPz4+OjQ4Ojs3Ojs6Mzs7Pz0+Nzs6OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnptYX6Sg29td4t4eX56gX2Ge3t3hoR/c3CFgnp1dnZ0hIKEfn+SpqOfpaKWip2QlZeLiqeXcoqyjYSokoSZk4WZjKKVn5eSiZueo5OqsJ+QlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCxkWSkzciVjoaHiI+SjIyRk4iEiYiFlZmajo+TkoaTloN+j4uZh42QqpeWoqKImJ6WmoiOhpeXiYSOjIF/h4+kiI6TqJqXk5eZoZmfmZOdm6OztaajvMK+x8XFycjJwsvUzc3UqdLR1tXW2NrU0trOhXWDa2dhYGBRS1ZcQkJHQztBPTgzNzs8Ojk9NjQ5Ojw6ODI/OTkyOkk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjnx8bX6IeHp+eoGBg352doCCe2xuin55fHd4fISGi36Lo7SopKuzoZanoKaklpWvooOQuJWRs5qMoaCMpJuvo6WdmJCnl6mZrrCkl5SVlJCLmJqWoMCOo8m4q5qjpa2ZkZucsp2GhaiinJeFiIiNlIuKko+GgIWGiJKXk4uKk5KGk5eFg5CPm3OQmLKVlqOhiJyZk4+KkIqWmoiKlo2GfYyYn4qQkJyamZOZmKCUoJ2Unpuhsa6jpLi/tMTHxL3Dw7/HzsvJ0qfPzNPS0NbY0s/YvHV9emBjV2NYUklLT0ZCQ0Q1Pjs3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxLPD47PEJBNzU8OzUyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVxdWUpoYTtIhIt6em2Fhnl8hHiAhYF9cHh8fXxvcox5fYF7eIaLiYaEkqi8ramzvbClrrO0qaOisK2KmrWeo7mllaykl6mtuKalo5+ZqZiqpLCxqpmYnJSVkZegl5q7u63KoWm2uKqwlZieoquSl72jXqmygomJjJSGkHyOjXyDhY2Pk5OIhpKVi46UjIqMlpiRm5m0lpSqnYublJGNkJKLmJqJkZ2Pi4qWn6KNlY2YmZ2SnJielKGglJydpq6noqSzuKvCyMS1ur28xsjIwtChxsnNzcTX1tDK06NzfWxgXVZiVFFHRD48Q0FBNz84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBnSGFgYnBKQIuJfoByh4d8gYl1goqDf219fHx+cHeHd42Bh3uNj4yGjJqrw8Cwvca8s7TBvbStrLO2jKiyra69q5u7o6itubirp6aioaOjqq+ysaqdnKOYm5iXnqKmpZKjua+ov7ysrbK5paOnfYiGna28sIKLi4qQg4+DkY55gYaQjI2bh4eNloyKlJaTkJmWm6easZmQqpyOmo+RjpWQj5WWjpCgkIiUm6OslZaPlJyelKCem5ifoJSan6inpKKjsLOmwMbDsLC7tsXEw77Mp8fDx8O81tDMxMqKd3ZlX11iXk9MQ0xARUc/QT5CPDo0PkE9PTU9Nj4zMzMyNDJBMTdAQk0+R0BDTkNBPUM8Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaUZfaWdbXVyTjIyIe4eLhoOMdYaQioFvfnuBfnF+gXqUepKUlZiQk5WotMbJwMLMwsO5yL26sKu5u5eytrmywK6lwKSrsLy9qq6ro6Oep6yvtbGpm6CqnKKclp+wtKeMo7q6tcG7q6icsqSkqJSEjqrEw6SCi46Gh4SGlZSMeYOMkI6RoIuLk5COh5efl5KYlJaloK6cjKmcjZaPkZGUlY2QlJGOoZOGl5+fs5+Um5SfoZmkn5qgm6CUmJ+mpKWnpK+tpb/Dwq6ot7XJw762zrLEvsO7s9HJyMG1eHxwX1tfbVROSURMTExKQEE9QkQ8NUFEOzozPThCMzMyMjYyQTE1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCaF1NZVxmVGNqmo2WiouIko+GiXmGk5CBcoB7jH93h4KBj3mNoZaompuYur7JyMrC0snLws29wbOtvL+nusC9vMS4rMGprbO8vqqxqqSlo6yutK63taCfrp+mopijtLypnKi8waO2tq+rk7CsqqyXhpqqp6WQgoySpJWJgHWJkXmEjJGQnZ+RjpKKjouTopeWmpSToZ6pnpCkmYuPj4+Vloh8jpWSkaKalKCinLamkJ+XpKSjpZ+eppielZebpaOoqKKyrKi7wMSvpbO3zMC6rsOzu73BuazCwsG/mnF8ZFtaXl1MTU5LR0VDSEFBQURLOjRESDo7NDw3Ri4xMjM1MkEyNlNITjxKQkpRRUtDRUU6RUxCPDdFVj08PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxKX1hhWmRlWJ6PnY6Wjp6SiYp/iZ+ShHiFf5R+f5CIiZCAlqCarqekmMO+yMTIxtLNzs3LvMK4sLq9tL3Lu8TCtra8rbS/uryur6ihqKi2rq6psreanqyiqKKdq7e3qqWvvsSxvbmzp6q0s62tl5WlramgkY6SscWnlI58kZV8hpCYj6mYl5KSjpKUkqSckpyYk6ChoZuYnpeKjI+Pnohaj5aXkpakmWaZo56zpZajlqutq6ecn6aXmZaYlaGkqKaetaupurzCtKa0tcvBuKq1rLO7uK6ouLq8t4RwcV1bV1hQR0tUTks/QUdEREhGRjg1Rk07Pjc+QUsuMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmZkTUamlJyVoZeoloyQg4alkoiBh4Kag4OVkJCTjpqhn6++rqHHvsXFyMfOzs7Syr67trG7u7y/z7bEvre5t7OytbO4tKynnKusuaupqLCwmKOupaikpbTAsKustL7CucC5s6e4tLeyr5WkrbCwpYuTlKCNc8GZfZaZhI6WmYuwlZmZlJGRmZikopSempWZqJyaoZ+YioyPlZ1fSpacmpSZpJdUlrCfr52fpZWvsK2lm6GllJOZmI6dn6ahmbSpqrO8u7ursLLHwLimq6utsbGjobKytKVzcmhfXVFTTUZRUVBRO0hKSEZHQUM9OUtUP0E6PUVNLzc1MzQ6QjQ0TldOPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs1RkE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3RiVkZIq5eZn6GorpiRl4eKp5aNiJKEn4eEnZeOnaCao6W1ybWpx7zDxMnLycjNzce/u7OvurjAws21yLvBuba6sq+vtLWnpJyrtLWrqqaurJqkraalqay6v6irt7e+wcC+t7Kyw7C3vayjrrWtuqaImpalm3W+n4SZnY6SmJqLrpagm5qWlJqen6idpp+ZmamZoKadlo+MkJ2CbXWSopqVnKKfkK6yoquWqqqYq6+lpaGlqpKSmZyJlZyinpawpqmqura+s7Kuvrm2oKOnqKWmnJytqamNZmljYlRNTkhJT0pVTD1MRE1JSkBDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0M6OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FMVkh+ZV5IRqyVnKGfu66YlJ6Lk6qbkZGTiKqNh6KejKOtlKOktse9tMG7wsLIycXCzsjCvrqyr7m1wMLKtsaywby1u6ypra2xo6OZqrW7pqqnrKqdqK+opKuqvbuorL20t77HvLa1uMCwvcCzqrW3rL+mj6KWkKCfu56JmqCYlp2djraeqJukopqboJmnpLGgmp2lnKepnJeTjpSbipaIjKShlJyinqC1sKSlk7Krmqutn5+lpKqSlpWghJCen5yVqaWhobO0uratqLWysp6co6Wal5WZqqGeeGRgYWBMSUdITlFJTUVGRkJRSkhAREdBVlNESDxBR1ExOkI3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Sol6Sen8Osm5ekl5mom5WZmo6qlpWoppWsrZmiq7fFwry/uMHCwMjEv83GvL65srC5tL/CyLbAsLy3urenpKusraGhm6urxKKlqKymnquvraKqqL64pq2+sLe3x7e0ubi/sL7Bt7WytbC+pJajlZKak62fkKGipKKinpC9pKidqKucnKCapZ+8opejnqGoqqCclIyUnZOdho6EjZOepKCdtqymnJezp5qwqKCcq5+ijZqWoIWOoZqckqWlmpersbayqqWqraycmKCgko6QlqmflGlmXGNfUUpIS09MR0VESUA9T0hAO0ZJSFtSUEs9SE5VNEJGOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0tME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvU0Y8S3hmY1hOopujm57Fq6Ceq52crZ+Rop6WpJ+mqquXtrGjqrO2xcO9wLa/wbzJwr/KyLa5tbSxtLS3wsa3v7G4tbq1oKesq6yenp+lpMGloKquoKSprbCipqi9taWxvLe2tsOys7e6vrLDwLe4rrS1taOcpJSRk6CsnpihnKioqqKawayonautmpqdmKWfvaGcpJeqqquloJiNmp+SnYiNV3+WnqWhoLmqp5OZt6Ofs6KhnLCYoY+blZ6Cj6CXl46io5WQpa6yrKmioqWklZWcmIuPkpOkn4ljZ1xlYk5KS0tORkVBR0s+PUlBOjhKSk5dUVFJPUxWXDlGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMUJ6goJiew6ekorOgm7Gmkqmjn6Oeramrnbuxqay1scjEwcOzwsO9x8S9xcq9sLG2rrG1r7/Ftbqxsbq2rJupsKqqm5+moafBrZussZypoq6xqqSovbemtru9r7fErbO0wr+yxrO6t6u1tq6roqWVlZOiq6Cen5qnqq6ur7uxpZ+oqZmYl5Kio7egoaORra6rpKWdkaCdlJ2OkIyUnZqin6i1p6eNmbWco6+bn5ywkaGVmZWbgJKilpCOoKGTi6assKWnop2gnpKSmpOFi5KNnJ+AZGhdaGZLSkxLU0FDQElHOztGPjk5Tk1VX1JTSj5PXl49SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0E3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZ3JAODxIlndlQTSfpJ6aoMKno6mxoKO0qZWxq6aipLKsram7s62wtbTHv8TDtb/EvsrFtsHJwrWstamwuay/xLS4r622uqaZq7Ksq5ihp5itu7ScqLCbrJ+utLKnqrqyp7m0uLK5waq3s8O9tMWnvq6tt7WpqKyhlpaRpaOhoZeXpK63rbG0tp+eqKSZk5STo6C2oqSlla2xsaWopKCdmpmalZeooJ+Zop6vs6KmjZivmqWsmJufp5OekJWZm4aXoJSNkJ2ek4upqauhp6CanpaNj5mQgoaWiZWfemVrXmxrTlFOTlQ9Q0FOQzs6ST83N1FOXV9SVlFCV2BdQkpTSFdLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFqV0RXRox5ZkM7pKScoKW+paiurqCptaqdt6+ro6q0trGwuLewt7i4xb3Dx728w8LIwbrCxsK6qralrbutwcO4uKqtsryjla6wrrOXpqiRqrqqoKawnaqgr7Szqqq2tay7rLOyuresubDCur2/psOqsLevqaurpp2YmKqgoaCRl6CwrrOqsLiZm6mfmZaRl6agtqiloqKvsLOrsaaqn5ufn5qdpZ2hmJ2jtLCcn5GUppuhqZyWo6KYmoyXmpSWl56UiZGbmZSOqamnn6OcmZuTh4+Zi36Ml4WPm2xpbmJub1hRUVpUQUNEVUA7OklBNzpYUGReUVdXRVlfXk1MU09eTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9REZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhtfWlcVjuJe2NDPaifnKGpvKCqr6qisLeopLOyq6Gttb2vs7m9u723t8HCv8nDucTDwcC5xb7BuLC2qKu3sry/v7Sqr7K4n5erramumKmpjqe7n6Wts5+rorGws6yqtbO1vK2wsbWssLWywLrFtqu9r7G3rK2qo7GlnqWonqOWj5ifsqmyqamymZ2nm5qUjJ+mpLSup6KsrK2wp7KqsKmim56no56VoZmcqLapmJqSkp+ZnqGgkq2hm5qIl5qMnpqdlIuPl5eal6amo6CelpaWk4CQlYR7j5ODjJdnbXJocXNfR1lmVkRDTVhEWjlIQjU+XVFoXE9aXUdbX15OTVNYY0pLQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0dERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVjE1MT1gVl84KUMzWVVcaEs1jHpmTEClmZ+krLWjrKikrq21qK6zuKansLfGt7G3v8HCtrW6xb7MxbnDwbrAusW4wbqztKyqure7ur61q6+xt5iYqKyrrJyuq4+rvZ2rrrGjqZ+xrbOurrWxubaqra+yqLawtLq8ybKqtbSxtLCvp6Gzn5qoq5+klZWambGiraClr5aipJmZkoyipaeyqaGmsauptKWur7Ouo5idraebl56amqy4opiTkY+YnKGZmJWuoZ+Xg5Wajp6dmpeRipSTnpqlo6OhmZaTkpV7jJCFe42Lg4uTbG55b3Z9YUZgalpJSFpbPXtKR0U2QWNUaVtNXWFLXF1bUlJTYmFMS0VgYWBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NYVExFmpafsKiwqayko66ttai2s7ejrLO3ybu1u7u/vrW0t8PAzMe8w723v7/BuMC9sr2uqLq6uLfCt6yusbqWl6euramksqmUr7ukrLKypqeisrSxsrG1sLezqa6ssqe4r7a0w8W2qbW1q7Ctqqejtp+fp7Cfo5SbmJSxnqebn6mNqaKdm5WXpaWkt6eisbOrp7Cnra+0rKSYoKyonJydnJWquZyVjo+MmJ2imJGZqKShmYaUmJGenJiXl4mXkJebqJ2loZKWkpCVdoSQhnuGgoSNjW5xeHZ8gFxMZWxcS09kXT9ie0dJOEdoV2VcTF5iTVlaV1RYVWpdT1BIYV5fUEtHUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNyakxFRJGZpK2krK2qpaKwsbKpt6+1n6u0uci5rsG8w7izsrXCw87EwMK+tb7AwLu/vbTEqaq5sba3wLywrLS0nqGnsa+mp7GlnbG1rKqysKuoqLW6rLWytauzrKqrqaypua6ysci/uKS5sKmtraaorbGlpKOuo6icnZuarpmjoqKjkKyfo6Cfoammpbikq7S0pKqrqayuta6inaOoqpygmpuTpLWaj4mOiJGjoZaPlp+jl5aHkZWVnpuZl5WImJOVmaedoaCNk5GOkHd+j4R9fH2HiopydHN/fn1cU2NuXk5aZ11GRJZbRzpNblhhW01hYk5WV1ZXVVloXlFTTWNbW1RLRk9UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZTs2KkhkSEorOkk/M0NJUyw+j2tASEmQmqipoaivpKajs7Ows7SwsKCrrb3Mu67CvceytK60wsPRxMW/wrO+wsO8v7i9xaitt6yzub3AsayyraKkp66rqKWwo6qwqq6qsa6urKuzu6e3sLGosqqrpaWjr7qsqrHCubSsuampqK2pp7GlqaSiramoop6boqyVpZ2XnpmsnaGnqKGspqOtrLawsaCpoqCqrbCsnZ6np6mapJiZkKGomIaEj4uKn6GQjY+YnpKSiImSlqGdlpmWh5eTk5elnZ2djJKQjYl/f4iEfHd/h4WGdXRyiXdsX1lfbmJRc3FcSzuEfEY+V3VXYVlPZFxOVlZVV1FcYl9TUE5oWVhXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0zOTg7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgyPV5LMC5JZ0RGODxCMDVFS1gxQJRdQE5GlZasp6CpsZynqLC1rLi1ramkq6q9ybyxv7nDr7Cts8TDzc7Dv8CzwMPEusG0ycSsr7eus7rAvrSurqynqaqxqaeosaWzraqvra2wrrKts7ult7OsrK6oq5+jnrG3q6qturaktbWkqqerrKqtoKimprCxo6eloaGrlqqhk5ugpp6joqqjrKKeprG2rKyipaKaqaquqZyhpaSkmaCZlpCYnZOBgpCJhZ2gjYuQjpyRk42Fj5qlm5OSm4yTkpGUo5qcmouPi4t8hoKCgXp1gYOBfnV4iqKGeGpdX25mV2WHZE5AZ5JMRGJ6V2JYUmZVTVZWVlRPXF1hVktPaVhWVkhKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwuMiwmMDdYWi4wSmdBQTw8Qys6Sk9eNESHQklJRJaQrqShqq+Xqaittaq1saqkq6qpvMHAuLq0vLWms6/EycvSv8G7uL+/w7rCusHErrG1srS8wb6zsq+trK2nt6qmra+qt66nsK+usaq1qra2p7S3q6ykqaqcpJ60s6iopLO0n7Wtoaqoq6irp5+rrKi4tamqqamiqJ+tm5GqoZ2gpKKmoqqdnKa0rqelqaKjl6Smp6qcoqSjoJqYn5GPj5mNf4eMh4SenomGjIyRkZOPhYiXo5qOjpuSkpCPkqCYmZeNi4R/dIaCf354dYN/e3h+f4edj3BxZmZwd1xhdIhqT12YVkhteVVkVlJjUE1WVFVRT1hbYlVJUWpVV1RHT1hVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMjM7OjcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyLzIyJS8zUmMwMj9mPU5YP0MsP0xUXy9JazdSRjuVjK+gpKqsmamjra6ytK+ppK+pqLu/vMGysLmtoravyMfI0MC/vbq8w767xMK/v6+ys7K1vbzBsrK0q7SppbWppa2zsriuoay0sa+xuau5rqqut6uqnqqroKOhtq2poZ+usqC0qp+op6qiqqGhrK2ova6rrq2hp6efrJmPsKKYoqCop56nm5mpsKiin6uioZKhoqKnmZmppZiYmZ2Pi4eViH2OhoSFpJeGg4SNiJGQkoaHlqGXiJGekpOQjZGdlZiPi4aGeHSBf3x0d3mAe3V0e2uDh6R2aV5la4B1Z4iMfFJWb15LeHNUZFNRX01NU1pnTk1XWWVZR1NqUlI/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUMzj42xoKOlqqOjoqyms7KxqKSwp6q4vsG9sam6qqeusMnGyNDDvr+9ub/Avcm8wbixsLWyury5v7O0vKy5rKO0pqarsbW3saWmubSss7yvvKWtrbWrrZypr6SfpKyqqJydqrKjs6iaq6eppKidoqmnqb2qtLCunamkoK6cmrOilqScpaSfpZqaqKqlnpqpoZuRm6CknZmWqKmRmZqSkIuCj4V+j4J/iJ+Ph4F/jYiTkZGGg5WblIWToo6UkYuRm5OWh4p/gHF6eX17Z3Z8enVxcn5qhnmFiGRfZ2NyhXttaHldXlVBV3ttVGJQUllLTE5wdF1JWltoWkZWZlBDPkpPRENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6RsJien6ikoaGrpLaxsaSpsKatucG9t7GkuayoqK/DycjMwre9v7W4wbrItsK1tLK1sr25ur22rrm2v6yis6aqqq60trOom7m7qLC+srqgrrS2qaufrbCjnKWpqaOdm6Swpq+gn6qpp6Gpm6OooK28p66wrqGqoqSunp6tppifm6GinJ+bmaOqopqZo6OVlpSgoZablqWsjJ+SkJGMgoqAgI+Ae5qVjYp9gI2IkpGNi4aTmJGGlKSKk5KIkJqQlIGJfXlrfXZ4eGJ6enFvcXR4aoJ1a4JnY2dhbnOObWJqb2BvQFx5a1ZeTlFSS0lNVFlWTVxebVdFWWBQXk9ITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JePiORlqyYnpenoqCfp6O3r62ir6+orLjDu7SuoLmvq6izusfKx7+4wb2vtL+3xLbDsq+6sbLAtru9t6q5uL6qpLSmqKmvrbivp5e4vKOtvrS0oK24taemp7Czn56lpqigpZierKeonqCqr6egppeiqJ+wuJ+ksa+gq6GspJymp6iam5ueo5Wcm5qdqaaWm56okZiSmZ2TmZahqpGaio2Qh32HfoKOfHyhjY2JeoSNhoyPjYaKk5qOiJSgipGVgoyXjZJ9hXxzcH1xc3NfeHdpbnFxcGuAc2R6bGdlY2FmhoBgW3Jqck1NgGlYWk1RTEtIUFNQR0xbYG9URllaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdXDUolZulmJuVrJ+doaOgtquwo7Szqam5xbezrqG4ra2sr7XFx8C3v8G5sLW9t7+7vrCsvrCzv7K8wriqu7q4p6e0p6eqr6uyr6SXu7Wkq7q1r56xua+ppaevsZuhpKCko6CWm6+moZ6iqK+hoKGSpKSht7ChprGrn6ujrpidqqWon5ianaSTmZuanaWpmZubpJWUl5WcjpOXoqmikYqKkIZ6hH6Ei3mPl4qNh3uDiYWKjo+GkJOYjI6VmYuQl36Gl4yQeoF7cHJ3bm9zXnd2ZGxsbGtqhW5mcmlqZWhdZHOBYFtrdmlaSn9eW1hPT0tISFNWRzM5Xl9sUEVZVllmTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERUXWhELjwyZFcsMZShoZaUm6qbo6GiobaqraC7t6WsvcW0sK+jta+srK+0w8O8s766trCzubi6t7qvrcCzs7ivv8C3rL26taWisqmnqbGpq7Cfmb+0pKe0taiesrypqKWpr6uZoqeco6WUl6CypJmepKmpnKKfkqSgpLippaeup52loaiToKmioaGZm5yfkZmblp+hqpuamKCUkZSXmo6Tk6SopJCJio+GeoR7hIZ9nY2Ki4d7goWIiYqShpeSkouQlZSOjpR7g5eQi3d+fGx0cmxrc2F3dGhoamhncIZoaGlkZmlpYGpjamhbZntiYFN0VFxbUkxKR0lQVEAhKmhfaU1EV1VeYExKSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKeoqSRjqOnmZyenaOzrKequranrMPBuLGso7aup62vt7+/vLLBtrCusra2uLa2raq9s66ysLy+t6+7u7Gln7WppaSzpqitnJzAqqelr7OqrLW7nqmprLClmJ2pnaakkZilrKKYnaSpoZuhm5afnae1prCqrqCgnZ6hlaCmoKKgmpuZm5KYnZOlnayhl5adlJONlZeLj5ibqaCSiYqLiXmFdoGCgZ2Hi4OJfoCGiYeGkYSXlI+Oj5GRkYyTe4OVj4Zzfn5meW9qamtmdHNrYmdkZHaBY2VmZmVqaWNrcltfWV1sY2FOaVhaYFZKR0lLTVNYPjlfbGhIQ1ZUXFtJSkdGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOgj4ysoZaWoJWksrGisr22obHFvLqysaO3rKqtqbi8urqtwLGurq62r7O4s6mrubGvrrO1urWwuLyrpp60qZ+fr6KorZuhv5+wo66xr7eutZ6tr62topmdpqiln5Wap6WfmKSiqJ2an5qTnJ6sr6a6qK6ioZqbnpmepJqknZeemJuUmJ+SqJWqp5qTmpqSjJWZjZSUm6qnjo6Kio97gnOBgYqYhYd9iYqGhouMipOFlZuTko6PkZeOkH+AjY6Db4F/ZnltZ2tpZnBya1xnY2N0gWJmZ2pubGdqamhuXWxscnBgVGNpY2ZaSUZMTU9YUVFVYWWAVUFXU1lURklGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QTEtKy4zPDtLNjAuKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMmNJGhm42Or52Yk6GaqbGvnri/taC0wru+urGmt6+nraS2t7e2rLuurKqrtqqzt66msrWxrqmwtbWws7W5pqiftaecnaigp6uap72XrKOusLW1ra2gsa2wqKGbnKOrp5uUm6ajnZqpoqSWmp+bkJukqqupu6CnpKCYmpmdoY9ropaZnHCClZmjf3WRqaeelJSekImYmoCWiqKQeYeUjYNtaX93g3FshouGfoWMh3FfZGFnhJiFa4qNlJJ0d4uEfoOQgGeHgGd1aGVXXGhzbk1QaWNncoVoX2Vmbm1qXWBhio+DhGVOS0Q5R1RoXkpIUVBVVUxIU2FwdGVGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCwwOD1HNzAxLiouKi81NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6LpJmGlbCbm5Ogm6qsqqO9xa+pt8K3vbytprewpaqitrOysrC5rKmmrLSlr7Sjqbe1tainq7ayrbStsqGonrKpnaGjmaSlmKu5k6Wlr7O3ra+lqq6qrKShnpygpqablqClpJubp6adk56el4+dp6mktrCkoqKdlpiXl6OIoY6Smoagh5KcoH+lf6WqnpKSmpGIhHN4jY6FiKF2iY1pl4hmfnN4oG+Ih4R+j31/oaCgmYB9h55zho51m4psh4GDbWllY3pscmFThW1ibGmYcVhpcXCIWV5pW2xsW4hybnpyhWaGhFpfR04/R19ORlJWVlFRUldVZ11NVklSUk9GSEc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLigtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oiqeXg5yrnZiYnZ6qqaeqv8Ovsbq8tsC+qqW3sKispbK0rq6ztqqopLCtpbSynK61trSmp6eysKyyp62dqaCwp5+jopifoZqss5OjpaW1vaatp6uqrKikoaCYn6ajmZiloqOYnKSolpOim5OSo6WmobekpKCjmJWTl5OciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGcxnl4saW3l2WAwJy/eYSFepKEfZCQkcpyl7ucxXpytae6kHuAbZexq7B5aGxYsa5uZWm8krxuZ3puco/YflNrY7ayfoFylHOaoaqQV09XYk9WTkZVW1hRUVONXVdbUUFdRFFORUhJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+OkI8P0E4Oko+NTIqMjJCRS8uMzIuKy8oLS8xODYtIC80MTZBMT05V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYynk4Gnqp+XnJ2lrLGosMK9srXAtba+waqms6ysqKaus6mutbOmp6W0pae4rZyzsbWrpqSnsa2tsKaqnKajr6Kgn52VmZ6crauTnaKfs7qjq6mira6loZyamaGnn5eap5+el56mp5GcppmTnaGmoqGxo5+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHCuoaR+eLt9bKGQdrFfarRbpYBlnJBhZ4N7Z4BreWupZb5xZ6aLdbFqe7F4dJKUY25tp25bhKFFaGaHlkV1nGB+Z3ykp4JaYIyraICUeHlqpzdKr1xYU2xkW0tPWF9cV1Y7TopPV1cvSVRTSkRGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTAzLjMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1gzMBuQopWDraelnqOkqrG3rLW9vrC2xLK3usGmqLCqrqior66jsLqvo6StsqOpuKeesrKwo6Whqayuq6+mpp6ioa+aoZuWlJaamqullZqhnrOzoqyco62soJ2Zlp+hqJyYnqOfm5mhpqSPnKKZlqCfqp6npqGaoKGWlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR/a4Gme4KGiJOUk3erZ2uxXKt6jYaUdIlyj4eBgYmQl3iCgYuXi4Ogj4SwdnefcWxsbHyLTqRYSGJimX5jaKZgeXJ1U5OHXlGpbWNxfYaAYpwuUaFvW1NraGBMSltkWFxaQj6ye1hYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozk5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkBGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblKCViLOmpqGvqaizrKm7tsKwu8GtuLe/qaytra2lrLGpoK67qqCns6yjq7SjprKyp6Oinqaqsaevp6Sdn5+ulZ6ZlJSUl52soJmZpKi1r6Kqj6qoqpudlJegpaeanpyinpufoqSilZuel5mcoqmappqcm6Khl5ORkpOdg9WTmblwsMF+xYZ81pSbu3yalaWPjZ2NpHuOiKSDpYN6rHmPnVaveoh+n2u5W7p3h4R+poKUe5d6qniNnY96sW6OhHSRvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhYCJfGOkM0Kddl1QamljUEBYaFpkYUpITXFQXFFPWWZaQ0U/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3SDphUDcxJZuilJiyqKimtKqltKmkvLfBsLm/sLW0urK0p7Cvoq+ypZ+ttaeap7itoq+xn7O0sKCknp+mqbCos6ijm5ydqpWYl5WVk5WgqZyZlqetsKmjn4+toqiWnZWboKWgl6GgoaCaoaGnm56hnpSYmqagm6eVm5ufoZiQkpSQnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaJ+kaGmf7F3g5HS0nZcrnuFf6Rvm6qma4eFfa19mJmOe7Fxkp6Od7Nll3SEnm+eZ5RRyItawlygeWJfrGB1c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBUGtgbGhQVkdKOT1VUlpXWElEP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YEw2MjCinZKlsa2jq7ytprSmp7W6vLG6vra1s7m4sqS0sqCwsaKeq6+jl6a4raSxsJy0t6mgpZ6hqaSxp6ypo5mbmaedlZOXl5CRoaaflZOlqrCmopaTraCmkpOfm6OlnpWapaagmqKfrZmhnp2QlJuhnZyllZ2VmaKelZiVkZqFrHt3qHajjYiGqW+tioKng5iYoYqSm4uif5Oaia6EgIKzXHKzUq59goKjf3LYfniGfo+dhpqZdq+Gh5Gch3a0YZplmoKClW2SWrBYS5p1mHlmYKxedXeIaJiIa12vd5Wej3hsNXnIrrJfQlRvXmdgRVBsYHBtVlZNLmZlaVNZUDtCRUBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQl9IOjk5oJ6VoLmwl7TCrqizqKmyurezt764t7G0urSkt7Kes6yfn6irnpSntauosLGqrbOjm6mgn6ehtaalqaKYnJSkoJOSm5eRlKGkmpKQpq2vpqGVmaqgoo6QoZmnpJ+UmaWonJyknqycoZyfjJOfmp2hmJmblpeioJOXj6adhql9faV4oY6NgqpwrYuBp4aWn6GJmJiIo4OSiJSrfYCLnXlvsVqogoKIn3p02YB3iHSogY6bjJKke5SPn4R6sl6dZKB+g5Vtkl2rW1qTgJF/aGeqY3F8gmuYh3Ndq1qJoI5rb2VPSkOhXFtMdF1iZ05bYV9xc19LVzdKnJhYR0U9SEdBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA1Ljo+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RkhfQzI/OKKemprBq5e0wq6rramltLC3sLW+ubixsLW6qLqzn6+knaSmpp6Tqa+orqi0q6muoZigoKako7mhoquglpqQoZ+Uk56Zk5een5CMjKiwsKeel5uopqCMkaOXp6qmlJeop52eoKKtpKGeoYyUoZifoJKel5yVnaGVlo2qnI+ubXK0c6mLdYqnc7R4c7OAkaSjkZ2OiaSHkHe4cI17i6Jqa7ZaoYVll5dpoKKnbpRytHSTmX6yaoWRh61qdbNhnWaib4eTa5ddrWBNoXyGklJzo2t4f35vmIdxXK9WPJx3ZlRvbi5cp09jU2tlYm1ZY11hcHtjVFtSPj1ucTNDQkA/TDohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZMXjgxQzimnJuevKGbssCvraurp7ept661v7S6r663tqrAtaipoZulo6Gckampp7SisqetqaCXnKefpKu4naOsmpWYjqOilYydoJuYnJ+Rk5SqtrComZWcrKmXjJOlmKSsopGVqrGjn56mq7GZoaOPmKKWn5uWnJahk5ypnJSPqpmH1JKau3Oww4DDhn7Vlpu4eIiQmIyYi4yniHqktnV+d3bCgpqyYIO6ecB9drhjtYGMh6l9lYGrqXF7f3S8iKegaZ1hpo6voX6MdYeqfb5vc7x0soN0eIGKbpqIcW6NpHS9Xnd9WmF5vGtaVlxqeV5qYWZnY213b1lcWkNAQHRAQ0crNEciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYGBfX1pQUFJLRUZKNEhMUkBKTkVGT0I9RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueor2hl7LDsK2qqquxprevtsOvuLCtuK6twLCro6Kdo6Gcm5Coo6mypLSlrKSelZqqmKasuJyhrZiUn4+knpKMnKKdl52ZkZWSr7myrJaYpKinlJCWpJujrJ2Qn6irn5qfqKO0n6OljqehlKKanJiVo5iPr5+SlKmehZCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0n8G7vZp7gbGocIBzkbmDfYeGjYeNfIqHjZh8pLu5vZx0ebSjdHeXdnSwdZmeZodqjbV0cnF4toxef3p9iWiDeW56Y4uscHWFf1hbp2pFZVpUZmBjXmNRZ2dwbHVDTlFNRDpbTT9KMzsvIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZVJz47PKeeoaLApZa1w7Srqqisqqm5rrDFrbOyrbWms7erqaGhpJ6gnZmTqqOsqqW1p6afm5Wgo52rpL2moKmWk5uQoZqRjqGnoZKcl5SYlLG1t66ZnqSkoouSkaaapaqblaekpZuZoailp6SqoZKtnpeknpeXl52ej6+ok5uloY1qfWmapXeGcn2ajnR5ZId7vb7Aum+Tg3KWiGFza1pfm4phY4iPlWtggJZkbp53Y5ZsgJqVlGVeYGJwmYhpcot9hpVna39ydHh9f2Jbd3SBaFBdbYN9e4trWGt6gnNKSm+GcE50TEVYXWdhTFtXZ2NfT1ttdGlxUlFERU07R0k8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU19WNClQX0woMj1bTyc/Mj6poKiiwqObtbu2o6ylrqentLGsyKuusqqzor2wsaWfoqedo5uZmaumrqOktKikm5iUoJqlrae+p6iklJOalZ+ZkpekqaiQnpGQmJyws7+tnKeep6KJk5GpmqijmpqqoKOZmqOnrKOgrKOasZuUp6CWlZ2fnZawpJegp5iakJuboaGXpKGZnJmZmY+VgWdtfXF3kpiUkoaMtquNhpiWjoqMmJaHlJWLhJOUkomOk5SYlJiWmZ+hmZqToJyNgnqlhW1rfZB9gHWKioFxgnh5dnWJf3yKanOBdIN1ZXd9d2tvem1fZF1waE1ZWmZqYFdab3htbWZVT0ZSOU9ZTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXGBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEosPC1As6CzosChpLKyt6CppbKnpa+0qseqq6+ls6TAp7OgnaOknKOVlZ+qpqyiorarn5iWlZ+XramkwJ6ro5SRmpadmJKUoZ6eoqeTkZmop7PEsJqrnaufj5aWqJ2qm5yfq5ihmpyipK+noqaon66Yl6edmZmgnp2br6CcoaWUlpGXk56flKGdl6COlpOKio2Ol66QfJacg5KCi6uphYCZl4mEj56IeoSQiIaakoiHipaPm5eNkJedo5WYkpCcjX+OZ6Gzr4WKhXZ7kop9d3l6b2Z5j4GAiWp1gXmIc2lzf3t2g4aCanVkemZgamVjZGZrWWx7b2lqXVNMUEReVEVAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWltfYmNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXFEwNU5bMTdFM1tHNTwsQLSgubC/rKyvsrGgqqeyrKKssq/Er6mqorGtvKKzm5+moqGcmJenpamlpKWytJ6Uk52Zma+lrb6gq6KQkJ2ZmZSQlaGcl6ichJ6rrKO0yLSgqqSqlpWXmqadqJqdo6qUnp+doKqvqqakrKOvm5+goZeknpyenK6jmJ6nkpaWm5Cil5annJqWZYKSfGV+jZqQY3mObWhre5Klq2plm5h9Z4aKZWVpaHuOoo9saI2YkaN3a2qKmKKel3NrbXqEjoh6WGZehoNebYyKgXZcaHN3dpGAiIJueIJ4f3NueYR0domHjoN8aodZXmx0ZF1ziWlrfHBrY19STldJZFhBSjQ+Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVVdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2moLq8uq+stLGqpaitrrCmraywu7CopqOtrbCeq5afo52hmZmmqpyto6WnqbKunpSjj6KvpbW5pa2ijo2ZoJiTkpqgmZmllXymrqOotMW4paKnr56clZ6inqOboqiokZ6hnaGqsKyspauhqpunn6igrJagm6Wvo5abqJSfnJqRopWcqZedfb2DiHK0coSdhq1oeLnEuHGUo6N6ppmZcquCfMvAwLtxjKOIg558l5mJncC9gZadnYycwcF8gnyTjZrDwH1spbJvjIFvynp/m3eQg46BdXmAf3lxen+HcHeFjJN5bXiUY2dgeGRgZYJiXnNnbGRkWUxWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlFTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVUFCOy84lqO5w7WwsMGqqJSjr6mwrq2lsrOuqaSlpa+qn6uYmqKfnJqqpqGcq6KkqKOktKScopKlraq2s6etoZGQmZykkpCfoZiboJ2Ip62lrK7AwLGhqa+plpKfnaGZoqOpo5KgoZ2era+rrqikpKihpqWdrKiRo5qorKmanKeaqp+VlqOUn6GVm37OlHh6pIF5lZabX66PXo6ogqOhfKeWm3Org4CvXmONqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3V9l4i3YoOtWqPNbpB2e9p7f5lwfYiSdn1le4d2dmt8h259hZCRfm2DkGBybXBoYF95ZVxxZ2lkZ2BSVFNXXUtPRDVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qorbSrpbKrq6qiq6auqp+mm5mll5yir5+gnqinoqWgn7Crmp2Vpq6rsKqoq5+UkZqfpJKPnqWYnqejn66mrLGov8ezqKmxrpaSnZyhl5+pqp6UoJ+dna6wqayrnKmopaKrkqyylqShqqmdoqWkn66fkZill56ZkpOQl6BxhYyXdYWohnGxfZ5yrH+in4GlkJ92q4J9rX+cc61/rIeGn3aZknt8l36qiKGLkYydfat7iZWQoIF7rVedxXuPcJPBfYGVbHVwjG1ldmSGbmF3bnJviYqSj4NukpFmcHV1cWFnbWZfb2hpbmdkV1RdYVpSU0M5SUlARDw+PUBGRUNFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCg9MSkzV0BGIRxHOkMxLiuw08bGsrOgnKKOoqKirK62rqixpaippq2rq6aho52YopWfpaufoaWfqKiinp2wrJealqinrquopqeel5SZoqGSlKCtm52no7Ctpa21q7rNsa2mrquWlZydopierqyclqCZnp+ps6urq5ytq6WjrJqusaGnq62ll6Spp6evoJGVoqKYk5CEpGqkdYl6qXR6snCCpoqZjHGJoJqGpGBhUqyFf66Dm3atgqiGhZ97mZeFemaAo4mkmIaCo32pfoKWiK5ffKlWnqOSgXqjn4B7w67Ei3Kvs7O5cWKpr8J0aIyMmI6BbpyVcW96eHlwbGZmZXJwZn1qY11XYGpYWVVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTUqMlBLTCMgQTlENCwnw8nW1L+hmaunoK6inq+0sK6orKKnpaiqq6mkpqCbpJ6dpaeno5yrmaKsoKOfr6GcmpKrpLSurqCnmp2Vk6aikZuiqKCgpp2xpqapsq23yLK1qquplpGdnKKYn6WznZmhlJ2fp6ytpbCbraujo6qhsq2hqbKwoZmop6yts6GRlKGllpmQe6lsnoSHdat5fLBvgqWMiZ+WlqCVgdK4tLfJgYGyX2CUqYOliIegepmVmniqyXSZpJSoqZCSm42BnYqaxsZ5Z6GCpXSBn46Cfa9db7RisHVLo4dtp0eCk2SOkJ2SfHGZlYFxe3V+fG5cZmpzcWaBa19hWWRuXF9ZSU1NS0VEQUI+QTxCP0k7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4ramyrKylopuyuKuqoaWap6Spq6qmn6ammKqjn66rnaWgrJqeqaWcp7WeopeTqaq1saybpZyglI+lrJGanKejoaqnrqKlp6qwtcOxs6qsqJSKl5ylmqGjrqWXoZWZnKamrZyxnq6pp5+so7asoLG4rp2ZraawsbCikpamoZiejYKdTniagX+feoSjfYOkhYemn52flIS4e3x5uYJ/zMbCtniboZGLnn6alpeKdp+XiqWXpKl/sIWdhqCErH2alWOmbaRwj4WQgXyWgnKsYKNycYCaYLx9UlV0jpKjl3t+lJOMdntzh4BxXW1ueHJqgm9bZGBpb2NkXUtMUVRBSUhGSTo5Sz9CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWVlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyc/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5ipq6SruKquoJugrLOypZ6glaWtra6qp5ymp5ujqKGzrqKpprKgmKmklKO1oqKVl6KptLijm6GcopKPobGZnpynpqGisK6dpqmjtrPFsa2prKmRh5Ccp5yipJyll56ZmpqmpaucsaKvpaaYr6S7raG2taydnLOwtq+wpJacrp6inIWP0bXDt3mHjoWRk5CApnmUoXeMoJKEpYKKcaqGhbVucmmapJyVip99mJmGh49zr4Kmm6OOpouTnYuVkJtucbJdpXSTepxsmH97mXxtqWGicXF/n2Jzsrhod4+Upph9jY6Vjnp9eZCDbmp5aXpzb4F1XmVlb25maGBKW1hYPEhHQFU0QEY+PCopNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gX11bWltYVVJSUUY6MjIzLy8rKyhAUVJUVVRTVFZXV1hYV1VVVVVRT1FbVSUhMkFIJCklknOMiq2+vry5tJ6Wp6SttKGhmZSip6auqquYpqOfpaGgtqejqKewo5Sro46kraOdkJqaqrOzpJyknKiRlJaun5+ep6SdqJ22m6OrpLasxLCpq6ihjISOnKKgpqKVmZmcmZyZp6aoma2or6Omm6ymvayUvK+snqGusbepsKSZp6+hppZ5qJB9fLB3ioCkpYicbbJwoYetfKGPg6iVmICsiYWuhaCVqqCil4afgZqVgHuSfquAnZqXi6p3naCSipSSgXqvXqSBfaanZJ1/fJdyaq9dpGtwhpldYFuMoG2VkaaZgpWPmo58fISZgGtugGN/dG6AemBoZnFvaWhnQ1lhWz1LVDNVOEJCQzgkJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RUlNTVlpdX2FgYWFhXV1bWldTUE9OSTcwNDIuKixBVFZWVlRUVVRVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2SmoOoxcK2wLOemqygrbelo46bpKKgsK+qn6Wgnq2Znrmho6ugr6marqGQq6iklomakK2vrKaepZusl5iPrKGhnaWhmqWdr5miqae3qsGvpKmjnouAjZuan6aekpSZmpSbmqalppuqrK2kpZ+pqL6klsGqqaGgqrC3qauknbKtpqiXda9+kIuchYd+uq2KmWWwjWWVrX2hj4OnlZqBrIqEsIanmqShopGFoV1sa4GzYH+te3uDgbFtZ26ZmY2JsVt+tVykhGvIomSfgHu7V3a1WbJ8Uq6AeqxXgKFtl4+om4yYkpqZfHqRoH9kdX9jhnh1gX1iamdxbmdmZVBVZFtBVmA+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTk9RUlRXWl5gYGBhYl5fXFtYVVBOSkZDNTUzLi9AVVlYV1hXWFhXV1dXVldXVldYV1dYWVpaW1xYV1dHQjvSn7Kxtr26s8GyopyspqS1qKCKmqCdnLOzqZ+koZ62maG0qKqsnq+tnqubla+noY6Im46vq6imoaWZrpKYj6iZoZ2ln5qko6aaoaOqs6q9r6SnnpyOfYublaCgmY+RmpuSmpipoKOaqa6opaaipKi7np/FpaOnn6mys6qspJ25q6qrlICpkqOvjpuAh6SXmZCCgLjDuoOOnJOEp5ecgqyKgq+Jp5ybpquRf9a9wqpipL+9fX6jgoPXu7i1hpaUhJ69voRto4Jvq4RsnIB6srDHg2mrsLysd3ahvrxzgJaOpp2RnJKaoHuDk558Y357ZY9neoN8YWxma2tjUWFbU2pcQFViQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc3Oz5BQ0ZHSUtNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5Wzs7C/uLG8sqKcraWlsqadi5ilwKq4sqiiwKeos52fsp26qJ+tr6WmlZSwq5eMg5uRrqWirKCjnKqfl4qjkqaep5uboamkmaCirK6quq2oo5uWknyImZGlm5KPkZiZj5iTqZuhmaqpoaqnoKOqup6ow6KfrKGpsbKnraeeuKWsrJlzdqqkuIZkiaBwaK6Ri5BubnekkJmfgXWumZRwj4txlqiknJivpHNtbW1mi3hvboKZcIF6anFpZ4qYlplyaWqFiGdxhmRdiGJqb1lcZn12pl9hcI2QbmVlf4yTj6GZmZqTmaF9iZGYd2aIeGmPbHqAemVtZGdtY0tkWEprWjpRZkVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dXV1ldXl5dXFxcXV5dXl1bW1VXXqmVrLOoubixs6qpoa2eo7KqmJK/s8XKvreqn8GtrqSiqKyfuqOkrqytpY2WrqmPi4WWlqydpqqgnaSjoJGLpJOnmamal6Sropeep6aosLurrJqbkpJ8hJeNpZeNkZCYlY6YlamWoJmpo5uxpp2iq7mfr8Cmo7Gkq66vqKuppbWirLaViqGpprediZajmYiqm5GVnZKps5maoqqgspaioZ2fop2hpaKVrKeNk5ONh5OcnJWRmZOZkY+VhYGlm5mWj4yUlIyQh4R+Z4l+dIJ1c4eKcKdsepOPk5GAgY2OkI+dlaKXmpmlhImXkHRqkXdyjHh4fXpqbWVkcGVVYFlAalxIZGJQWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVdZXmBhY11eVFFLRUM+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCmlqmppLS1rq6isKOtn5+1sZCNrMi+xru6q6Omn52nn7Gpo7annam1p6eRmK2ii4eJj5unlaykn5mon56SlKOXqJqompWnoqSRnKiZora6qKqYmpCNfIGVi6CUipWRlpGQlJemkaCbqaCctqOdpqu3p67AraK1pK6trqqnp7G2n6y6mJGlo6e2opKep6COqqCOk5+jq7CaoKOwqLCXo6Cco6qfnp6dl6yek5qinJSQlquajpmZl5CXoJKIoZ6XlYeTjZGOlYuBfmWLhXWGdHeHgnOcaoWPkpOPiX2LlZKSmJSjlJ+ZpIWJm4p9c5dze4yAc3x/am9lX3FqYFtgWm5kUWFlUVo6R0dFPjI9PjkvKiYrKSYdJjMxNjY2ODo9PT9BQUNJSkdKS0xNU1NUVVpgYGlhZVZQS0FDQjo5RU1WW15eW1pcW1tbXF1dXl9dXl9gYWJiYWFhYGJiYmRiXFtjl5WjpqKvsauuo6mmrJ+ntaqQj52ktb2wra2jpJt8n6SypKWxqZebuKajlJmqnI6Giomcoo+unqKVqJ+gkpaZm66LqZaPqZqqjZqpkJ+5t6SlmZyNiHmBk4yak4qUkZSQjpKXo46fn6ien7ijf4OvtaKurnSiu6GwnnZ4nqevuJN0q6OeiX+rf2RcYnagjqWfhJh9bZKznaKnraqjZZ6fknN5mphxgZmpmG1/oqmKZZymnZKXmJaMk5yRhp6bkZaEk4iPkJKJhXdqjoZ2hXB6hX9/YGiHiZORilp1lJBnaI+Pc3yonJxme5uKhXmZaoWMhG96gGtxZWB3cGxraVxmZWJicVRbPk5OTlNHPkBVRDoxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXGBoZmdXUUo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpaKgrq+rq6mlqK2ip62kkpartrGzp5urqK2YdI2fsaCoq6eUl7mgoI+cpJ6Rf4mIm56MrJmilaehnY6Xkp2Fdq2PiaebqZKYpYqcu7SnoJmYi4l1d5ONlpOJk5GQlI2QlKGPnKGnmZyxlYCMm7ScsoySjbmln32nonmgrLV/jY2lnoOLhpCwqq+Ni5ekm3qBi6yFnJ6hpqinh5WFmHelm3qInIGXp4OCe5yzeoqGoZialZiWgpGXl4SbmWN6iJCFj5CSi4NtcI6HeX9wf4CEfYVzhYOUkXeWaJJ0oJp0fZmEo6CJmH+VjYaFmmuPjodseXxycWhleXBqbGtcZWxrZnVdXklUTFJARTYuW1VVNykhMDk+Pjc0MzU2ODs6PT4+QERJP0lFSkxHU1hbWVtiYWhmWVFIOUVMOz5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kepaysq6esoKewpqappZmUr8i/saKXqKq3n5GFnq2cp6KgjpC+npqMn5qgkH2Gj5iXh6ycoZafoZGNk4mFgJKnjYejnqSVmZ+Hn7qyp52bko6FcXaQiZWQipSPj5uMj5KgkpihpJaeq4eftIm0ma2KyoaorIi2hYyvga6rgqiMppiNnX2oj3N7d5yPp5dolaR5tIygnaWnkpjCgX+riJihcp6AmqV+l4WVs4GhfaGToZCYl4GPlJyLmZKMfYWTh42WkomDbXOPhX55cYaAg3uDdISAlYCPxWZ/qYePo2uehaSdhJqBjpCJjJpxj5SGaXl2fHhoaXZyaGhsXmRwbWduWWdHXVJNM0U1N05iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSkpMQ1BaXVxXYV5pbFxRRT1LTUBJY1hdY2ZoZ2JiYmJkY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJahnq+mp6ilq5+kt7Cpq6aalKCjpKylmKasuaSwgaKpnaaenYmUvJmTjaGRno96hJeWkYermZucmqKEj4x3mpyPn5CIn6Wcl5qZh6O5raSanIyMfmJtj4qTkI2QjI2YjJCSoI+VoaGZoKd+oaeHrZ2flq2PnJuckIR/oIyorIWjjamZjJp/onWBmZRrgq12Tat4h42ckZqnpoCpq32DoXt6p2qef5JsZ5iGmLeJnn5uYGRZg5eAjXxkaItymX15lmxdfZdtX1Jwg1xfa3iCX1hkgHyDf5Zwp6prg6NucqVwn4WgamegbVxwjn5nWmCEgWNYUXB3Zm51c2tqcF5rcW5sallpT11ZRjlBNUhFX2w1LElEUk1OPTg0ODU5OzZAOzs+QlA+UVJMTUJKXF1fV11eYnVgTUQ6TU9OVGFcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnJ+4n6mjpqyRobW7qq6imZihoqWtr6GesLakqZOioaCnnJqOmbSZkIufjJWLdYKUkoyKppWVmJ6ffpOFhaykh5uQi5qrmZubkoimsaehlZqIiYBpboiHi46OiYuNkoyQk6ONlJ+fnKGkf5OBj6Kgk592nJSOp4GfpX6Fp6qCpXiJfISafqJwc5SIlnyfjXlthpuMmY+aqJmOh517gqJzdqZmnn53pF+Yen2UdKJumLe0unSTiIOAtahkgca4e3CVtoxygJqjY3Osq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRhnZm0l3N9mJ+zdXRcnrKDa2NwdXdyaXBZbG1zc2ddal5iTEU9RDZSQlpzMz1TR2BKUj08Mzk1Ojo2RDs7QEpQP1VNT1FARV9fW1pYYGB8ZEhDOE1XVVdiYVplZmtrYmJlYWRkYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlpSit5iqm5OfjaS3tKytoJqinaSjpq+dnLOvrZSZopqhpZmalZ+rm4uIkniLhXGAlo2JkKGPk5SdmH2Rio2ooYeXjomTpJWcm42Mqailno+Xh4R+anuHfn2QjYKLkJCJkJShg5eeoJ2fnouJd5yYoYyfcaGKhqmHmqSNlKWofK2MfnqgmXqjk3iBdJaIjZx9lp+Gm46YmqWFomShfIiWkJuNbZ5om45vmpl7gIunfXJpdKuDn4N0qmiVml2bhXaFnmeqa4C4ZlyocIGcYJWMXqd2dYeIfp1nmnWGk5KXjoCfb5qRbqeaXql/ebtrfqpcjoRdtGhdbnJ6eGxqXHFreXpkYWdYYkJSRk83V0RSbzVLW1tfTlpEQTI1MTw7N0g/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOXF5ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuIqbOapohjlJururGvrJ6mnJypoJ+vnJ6yqa6fmKSboaCZl5ago5mGiY1piIBye5eIi5aWhJGVmJB6i4SVpJyKlI+GjZ+Tnp2JkamjoJqMkoqAgGmBhnh/lox6iY6OiJCXm3+Uop6foJOYcmifiZ6Oi3CSjICphpidoKSepXuwraOiuJd3o7OjpICJlHmde6uZfqKOnJqWiJdxoXyFja+1fWuakaF5fpm1o6SrqISZfJt9npt/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iiaXF7jmyAiIOZdZt4homxs3+Am5Ond4OebnR+lXCadGukXpV2SGVkYXRyfn9vZmFsaXd8ZWViUV9XXVVXQFpGUWhFVFddYlheSUQ9QjhAQTpJRjhMRVhBV1JbV0RGYlxaYEtgbX1yRUI8VV9iWmVpVmdobW9iZmdeYWFcXV5gaGJfZWN2bF1lZ2ZrZGVsaWlraZOcgK+smINTXqCms7mxsqiaooycrJycqpWiraWjqZCfnp6bmpaYoZ2WiIeJd4aBb3mVhZGbi3yRk5eIcoGJkaGbc5GQgYmalqGbhY+qnJuVi4uKfINshIVxgaGLeIaNiIeTmZZ8k6SgnqKIrYZ9tYSNnZx7pZV5qYCUmo6Inpp7p2h3bX6ZdKFzcnyehplwk4OufaODpZ2YgKNvXqhndaJjb6VhnNOQfXuZeHN0YqKGkH6jdKSQdmuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdnG17cJZtf3KicV2kZ3OmYGimbZvUmn6Gm3B7e5hsnHx4mHNuqaRnYWV6coCFbGhmZG92eGhhY1NcZlFSYkhYSlVhWFRcZmtcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWBmZmpSZHd5d0lGRWNeZlpoalRpaGpvY2pnYGNfXV1dX2hiYWllfGReZGdka2RqbGZobGiXmn+vq1RbSn6pr7Gzr7Kjm5mFmaqgoqWPpqmhmquLm5mZlJmTk6GYjoiFe3B9hGh9j4OVm4F3kY6Pim9/ho+TkmyXlHyKk5Sll4OPq5uUkouGiXmDdoiAbYGfhneAk4aImaOYe5Sio5mfibOhoraLeaynpK6lb6h/mY2FgJmPeqR/oZmGmHKehKSur4qXjICNpI2Vgq2gk3a1trXJoXOUi4GfYJ6XqW16lYehnHWiiHegfpKXi4FwTWajknCah3Ole3l0YYOBa32ga3FkX5xxfXOWaHpps7WzxqZymH16nWucm6t2hZtud3mYapp8dphzUUV9s19qd2x6iGdraGN1dnFvV19UWWlQU2lKV01ZVFZeaWxvVmhXTUtBSk1LSEpPQlFLUGVjam1ldHJzf3l8bnWJe3tUUU9sXmlca2lSamhpbGdsZmNlX11dXV5pYmRpa3tfXWRoY2pmb21laWxloJuHrqWDZD+TobKqrq60oqKQgJiqoqOmjaaon56nhJuYl46XkJCck46Ig3pqeYdlg41/mKB5dY6JjIFphIWRg4yFnY16jYyXppSEmKqYjJGLgYl6gH2LeHCQoYZ5gpWHiZagln+UpaeblZWDZm54nGyiZHtwpXebl3BlpoCUiXqkeZ+Wg5dznneBipWXj7lukYqiYn2YoJSIbXJpqmt1oG1vpmCbaYuQaZaHm5Z1ooF+mmCMho11cIhiaKBlnn5pm3VvY2aIgW1xolleWmKhbF2Ii216fXNxZKVteKJkZ6domXOMmXCicFWJkHCgYGaoVYteVJhubnRsc4NucWlreXRrcFJZV1dmWlRtSlpQXUlYaWlzallsV1FSRlZcTFhTYlVpa194dHt9cHx8coN7gHN2jYCEdl5ScmJnY3BnUGpoaGxsbmhkZ19dXl1gamJqaXZ0XVxjaGNqanNsZmttY5yjl6V5ZHNsiqato6mwsaafi4CYrJ6fp42jopyko4GWmZSOmpCMmJCOinuHcYCIaIuLfJibc3SJfpB7ZYOGlIqKlpqCfImImKiSgaOtkYaQi4KJfoCAjnJpj6aEfYeTjYmYoI+Ik6mlnIimeJWbfqWIloqxl52Pgq6WnqR1k4V4qXOlj4SabqSijJKEjYO7bn2lr4OGhYaSlZyffKV6cqiVoJZnnn5vrGSWipaTd6htqqKBiXaJg3erkaaIa5Gwa3azjKlrioVtbZ+ekZRffauLqnZ9foqknXaffIOklZ2gapuIeKxon66NtnV4vo2kk1qDp46rYXVzdXJ8dXFja39vaG1UV1tWYWJdbE1dUl5KXm1vd2BbcVlbYFtndGVub3JicnRgeHp+eXJ5g3OEfoF7e4yBg4B2YnhkY25yZFJrZ2hvbHJqZmlhX15cYWtibWx7b1xcYmlibGp3bWdsbmKVpKmbgH+do5apqZ2opq2kmYqCmKybn6aKnKaeq56FjZuQh5yRhpKNjI10h3uIhHCNhX6Yk3R0hnKRg25/i5GHhpSPfXyDh5mnj4Cnp4+BjomFlHaCh5JubIupgIOMlI6JnZ+JjZOpop+Of3STl4h+gXiTrqJ+gZpwj4V2jomCfXtyp4xxfn16mJabhJB5e39+h5SVk4p2kJieoIN7folrjIVbeXlyenFpbn6SinKAdYGPlJNxh4SDZYx/X4GAi3d1c5R1b3lubYdsg4ZedWd3jmV/gIWNqJp9dHuVaomIcIF2fYd3bm5ojXR6fJh4hVxsWHmPaW94c3JweHhwXWyHb2poV1tgV11na2RXY1VfUmBweXlta3dma2trd31ycnVzYW92YnR7gnh1eoJ1gICAgXmLhYN9e25/bGR5bl5WbmdodWt4amlpZVxgWmNpZWxxdW5aW2JsZGxseW5oa29hjpO2p6aKoKGapqOYpZyroqGEhJitkp6iipuom6qYg4KcjH+XlIeOiomNcoN8j31+j4R7mI90c4RxlYV7fJGLhoaQhXl+gImbpY98qKGLhY+QhZWCho6YdnKEqYaOkp2QiZ+eiIybpp6fqoOIjZWafn6IlqynjpGlj3dum46BeJBufaiFcX6VcWtwfYKgjYCTjotobFyCi4ubmp6Oc5WLiHF0a4J3dIFZcm6HkYJ+f4xqXWple4aEioBgaXl7m3uCi4J1gYWBZ3eKhmpgb3GAdV5xiYCJjqWThGWLjYNud4uEcYaPenFoaWZ9hXuWW11raG52XHx6eHZvdHODaF1ui2xsY1paX1pZbXJcYGJaX15mdH98dnB1ZGtra3x9c3x5dWRudWhtfH52en17eXqAgX5vhYmEe310fnlzf2lUXHFpbHZwdWdrZ2RdYVhqaGtrcXJuV1tlbmxnc3lvaGpsYIuKqK+gj6KgmZ6dl56YqKOifoOZro6glYido5GmlYB8mYZ9kpmKiYeHi3N+gYx2hYuChJeKcm+AcpiGhH6Rg4OGioF7gYWNnKGRg6iiiHiOl4iUioucl4SDeayCkZialYqenYiIoameoaGjioeTm5yimZWpoKaknpGahZOLenaNjYOnfn+SkJOUnbKmm5WfkI2xkpeDpYyMlZqfiZGbgoiRimt8jnd4ZYOHkYt8iZ6Eh4yQiYmBhYWQd3x6dJqgiYaKnYmEk359ioB/dG5zhIF9doWGiY6kj4KEjIaCjJCMfYeLipGEem6Ehn56mWtzaWF0i3F+e3h3cHh1gl1eb4dpb2BfWl1dU2lyVmVdXWJtaHZ8fXRvcGVrammAfW55gHJqcHFtZ4F7c4KBd39+f4V6bYKMhnx6eHt9eoR5TmR2anNucHpla2VjYmBbdGVwZnJxbVZebHRtaHl6cWdpa2WMh5y4npahoJeUmJmUmKSgnnx/mqyPn46GoZ2MnpZ+eZWEfI6aioeEhIdueYGBc4GIfomUhG1rfnqXh4SDj36AhoSGfYiFj5yflIisoIRyipCGkpGLnZF9jXqphI6TmJePnJaHhpuknqGZnIWCkpqZmI+Ypp+knJuPlX6Oh3R6ho2DpXt9j5CRhpiroZ6UnZCOqY2QgJ2MiJOZnoKPl36GjoNweIZydWB/hJCGdY2ZgYOPg4eFf4aFlW55dnSSooqMhZqEg4xzf4l8fHFxeoaCenaIjYORpI6Ego6Ag4qJineGiYuNfnJtgIJ9b2lsbmheeoBofn13dnd2e3hdYHF+bnVhZFtdX1JnblVmXF5ia2l3e39ybG1ka2pogX9sdIJsbHVwenCGeW6HgXaCgH2FdnGCjYh+e3x8f3uCimBoe2p1aGmCZGpjYGlcZHVob2J1bWxVY3F5ZXB6e3Nlam1ti4ietZmgop+SkZWYipqfn597eJ+nkZyLh6aVjJiZenuNhn2JkoONg4KDbnyAeXOAhX6Lkn1raH2Cl4mBiI18fYaEh32Pg5GdnZOKqZ2BcIuLjJKGn6GKhYx8p5GIkJOYlJaTeIyinp+dlZh+gJCamJKLmaKgo5iVkJl8i4J3f4KOhqB/foyNj3yYpKKik5qRkKaMjoGakImSlpt+k5J+h46BdXSCcXdhfoGOhnKLl32JjHKMgIOFho9peHJ4jJiRj3+WfoeJcoGGe3tvd3qJg3l4jouClKOSioSPeoaGh4R2goSJiX1oc36BenxybWxoX35zaX12dnR9dIBrX2B0d3F4ZWRZX19Sa2lWZlpgYWlqd3qCcmdsZGxoZoCBa25+aG9xbH95h3tsjIFzgIF+gnR2go2Gf3x7f4F9f49pcoNudGlhh2hsYl9xVnRvbG5geGhtV2p0dmN1entyYmpveomMnrCRpKScjo+Xj4acoJuefHeloY6YgI2jiomalnl8hoh/g4p/iYOBf3KAe3R2goV+i5F4Z2N9hpeKgoqLeH2AjoR5l4OWmZiOl6Gbf3CLgpGThaWbh4yJg6aVhZOMl5iSkneRnJ+gl5OWeX6Ol5eNlpqco5yXkZOZd42DgXaDlY2dfoKJjYxzl6OfopSZj4+hjIqClpeDkpWZfpiNfIiNgXZxfm57ZIF9i4Vxh5OAkYJsiIOCgImFZnZve4WRmIt8kniLh3t/hnt6cH13iIR4go6HipeflIGCi3aIg4OCd3yDiod4YXp6f3V/eGhtZmJ/amt4dHR3fnJ9Y2Rhc251c25hWmFeW21lU2RZYWFpbHZ6h3Jja2NtZmh9gmxpdWhucGqAfYJ6bpCGcoCDg390fIOMgX9+eoKDfnyQbXaJc3VtZYpsamJidVaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5uslqanno2Ml4eGn5OXmX54qp2LmXqYnYyMmZB5fIGMfn2EfIGDgXh0enp0fYCEgImLgGRffYuUh3+EhnR9fouAfpmGl5WYjqWimIBzh3uTkYmmj4yOipKgkYSSkJWXkYuBj5eempGPkHJ/jZGTiJycnqWXlouTlXGLi4lrhJePmXqIiI+Jb5eem6SUlYuMnouFgZGcf5KSlYaZiHuKioF6cXpsdWx8f4x+boaTg5V3cIOEfn+LgGVyant/lpeDfo10j4eCeIZ8dHZ+fIR/e4GKgouSoY94g4F0iYd9gHR1gomFcWJ8dntyfnBicGRlfGNvcHdzeXh0dWJ3YHBsdm5wXVxgXl5rXlFeWWNhaW50fIpsYGpla2Nod4duZ21pa21pgn17eG+QiHSBhIR9dIGGiXuDfXqBhH19jnJ5i3h4bWyHamhfaXJjh2dxb2V3Z25sYXppan17eHBheG2LgJiYqZ+jqJ2JipKGip2LlZl+eK+ZjZd+n5SRl5SId358in18gHd4gIBwdXR8cIZ9gYGKf3xhXH6PkYaAg4JyeoCIe5CTipOTnZSmnZWCfYF9jYqRo4mOio2Ymo2GkpmUlY6JiIyRm5KOjIxthJCPkYiemaKglpSIlY9shpeCZYSYjpN6iYSQinCWm5Wjk5KJi5mMgX+Qnn2SjpKMmY57ioWHdHN2bHFudn2LdG+HkY+TcXWBfIKDiHxmcW15fJmTfIOIdJCJgHOHeG1+fH+Ee4OKhoGLlKaLeoZ7foqEd35xcIGGhGZpenV2cXxjX3Fha3RfcWt7enptc3Fmel5vbXNtc1hbX2BibFtQWFllY2hycoCIZ11qaWdiZ3GNb2RqaGVpaYF6d3ZwjoV0gYKDfHWCiIV4hXx4hIV6f4l3fot7e3N4g2prX3BodIBrcm9tcmdvbGV8Y26AenZxbHd3in6il6GnoKabhouLgY+ch5OddoKrlZOOh6GNlpSQgHR8d4V4eX9zc3uGbHNwe26LdoCBh29wW1l+kY2HgH9/dnWBgYGhh5KLlJ6ZopWYeYp/gYyInJ2Kj4aSmJaFiZWakJeMi4yNi5uJjY+CbYmLkJCJnJahm5eUhJaGaIKhgWWEm4mQfouDi4F3k5mTn5ORiYiUjH59jpd7kYyPjpqSfIqAgm92cGxtb3F8hmp0hI+Zi3F3gHWCiYJ5Z3NudYCZjnuHhHmTkHl1h3Juh3qEiniJhICGjZqhhnuDdYGKf3h4bmuBhINfdHV0cnJ5W19xYXBrX3Brfnxxbm5rbndhcHBrcm1ZWWJhYm9YUVRbZmdjdXCFg2Nda21kYmZrkm5gZ2dfaGuBdXJzcYuAdX+DgXl2gIuAeIV/eIiGd4OFfIaLf3t3in9qcWN8Y4Z8bnFtdGpob2x2eGBxf3l8dHV0gIN+pJWZrJ6nloSNhH+XlIOQoHaMoJSThoubjZaOi3pyeHWCcHKFdHJ3iWxwbnZtiHaDfoBtbVVRgaqUhoN3fndyg3qDooOUgpaUmZ2Tm3mRe4OMkqOZk46JlJmShIeXmoyUi4mOjoacg4+Je3KLhYqOh5yan5qVk36SfGaDmoVmhZ+HkYSRgolxg5CXkJyPkI2Lj4x3epGQeo6LjJKWjHyIfIBrdmtva2xte39hen6Ql4J3eoJ4g4x8emh0bHOGlYt9h4V7ko9xeYNvdYt5iIt4h3x/iY6dm4N7enaCinx3cGpsgoR8YXlxb21zdFZfcGJyYmBtb3pyaXBmZ3V1aXJsYndlXVdmYWBzVFFPXWdlXnlwiX1gXGlyYmJmZpFqX2hlW2dwfnBscXSKfXZ9hYB1dX6MeXuFgXiIg3OGhX+MjIR8epR4ZnFrg2CIfW9va3pgam50f3VfdH15h3h0c4V9eKCPmbCcpY6Ci3+DmoiAjZ+AjJqUj4WImI6Pj4R3dHd0gHFwhXRwcoRwbGp3boNufX1tdHJSTYLfyJLWkntwdYR2haGElHiXkpmdkZp8lHOFj56hk5OQipOclIZ/l5aIjY2HkYyHm36NgHd6jH6JjImcm5yalJJ4jHRlhpCFa4eihJGIl4OGY4yRmY+Wi5eMjYqKcXqTiHuOiIqTkYl5hXx/bXxlcm9rbHt6XIF6kJCBe32AgIaOenppc2pzio+JgYWEfJSKbH5+bX+KfYqFe4N4f42TmZiKfHV3g494c21ncICFbmt1cGlrdW5UX3BlcFpgbXN5aGxrY2d5c3BxZGB4YWBWbF9fd1FOTGJnY116cYp2XVxldmFiZmWOZGFnYllpc3Nua3J3jH10eoaCdXZ9i3N/hn97iX5yiYiCkIqIfH6YdmVzbnxliH5vcGyAWWxueXlzYHZ6e412cneKd3mei5qump+QgoV3iJV+fYueiIagko+FjJiEk4+HgXV4cHlxb4RwbW9/c2VleXF9bXl9amdrY6Sawdyu8KBybHaFd4akhpNvmJKWoZWcgpJxhoqil4mNlYqQnZaDgZaQhYmPgJCJiJV9hnp0f4l3h4SNnJqYmI2OdYl1bISHiXyJooSRiZyEhV6Lk5iLkImOi4qEiGx7lYF9iIWJkY+GdoV9fmt9ZHh2am55c1iJe5KIhnp/gYGGjH96ZnJpf4mNiYKBf4qVhGuBdW2Hj4GOgn2BeH2OlJGXj3Ryd4eMdXNxZ3V6hGN1bnFja3doUmFyaGxWYG91emFyZGBpf3Fzb1tkcmFiV25bXXlOTU1lZ2Jed3OKblxdZHleYGVlhWBjY19ZanNrbmtzeIx+dHeEgXh3e4lxg4R9fol6dIuJiJWGjH9+l3NodXF5bIx7bnRxgVdxenZ5cmR3eYaMaXaAiXJ/nIaYp5ujkoR9cYyUeHmMnoWGoY2PfJWNgJqIhHtzeHBzanCCbGptfXVfYXh3e3F1e2dgZHzr2rXJw9yHcmx0gneLnIqPa5qRkJ6WlIGJcYSIn42Ei5WKjJiUfI2TiIOIkHuPi4WOgH91eIOEcoiBk5uWlJeFi3WGfW6DgIeGl6GCk4yeg4lhg5SPh4qGio2HgYdpfJN/fYOEiY6NgnGGfn9xd2h2c2p1d2xajXySg4Z+gYSBhYqCdmFya4eBjomBfn6RkH1ugWt3hI6EkIF6gHt9j5GOlIhtcHmMhXRrcGtyeYJhdWpwXWx3YVJlc2lmU2Bxd3VhcGBdaIRydGtYaGljaVluV1x2TUtNZmdeYnN0hmtcXGV5Xl5kZ3thZF9dWWtvZW5qdHiKfnN0gX57dnqIc4WDfH+IdnaKho+YgYyCe5N1bHd2eXiTdG54e31YeYZxf29neHeSgmR2hoVwiZaFmaGaooqHdG+SjHF3j51+i5qJin2gf4SagIF4cnRub2Ryf2lmbXh4XGB5e3txcYBqYWdhf9W2j5Gmd25xeH1xlJKOiGubkIqdk4yHe2iHipmGgZKRhoeYjnyNjYGBiY17j4x9iIR6c3qDenCHgJWZjpOTgId0goR0gX6IkZudhpWPn36IYoCTh4WIhYuNf3+CZ3yQgH5/goyPkH5tg3yDdWxtd3V0d3ZsY46Cj4CGf32GgIWJf3BfcW+Ee46LgXx+kIh6cINleYGIhYqAeoR8fZGNj5GCbW55i351bW5ra3t/ZGlsa1pud1pTanNpYlFjc3htY2ZeWmuEbnRiXGhfZW1gb1VccE9JT2dmXGhvcoBtWlxjc2BcY2x3ZWVdXVpsbWNtanR3hoBycH98fXR4hniFgn2AiHV4iYGTlXyIhnaIgG94eXuDk29ue4F3XoN/dIFtaXp0lHNnc4h8cZGQg5qfm6CGiHZ2lH9td5SYf4iRhIqOmn2Mmnd9dnFvbGphdX1nYmp1elpgeHx6bHB/ZWNnZ1edj19yc5a9xYV3cpWLkYB0mY2HnpSNiXNqiI6VgHuUjIGEm4x8ioZ9fIiMfpOHdIeFdnZ9gXF1hoGelIaUjoKCcX6Gc4J6iJabloaTjZ2AiGZ+k4OBhoSKiXKCfmd9i3t5f3+Hi499aYB9hHZmcHl4c3h0bGuPhouCi4B5g4GEhIBrXnB2en2Lh4R7gI5/fnKAaHeBhYmEgXeCen6Vio6LfG1reol8dnRvaGh+d2VdcmRZcXRUVG9zaWJOaHV5Z2FeXVlwgXB0WmVjXmtuYXFQWmxTRFRoYlpsb258cFpbXm1jWmNvd2RnXF1ga2pjbGpzd4KDcW9+e390dYN6g4J8goZ2fomBlpF4g4p0gYdyeXl+jZBvb3uBcWqCeXp+bm18dpVraniEdGuTjIWemKCZhYhvfox2anmZj4CCi4KWmIp5j5ZveXNxbGpkYHR7aWBmcntbYXJ9emZwemFlZI6xsndLYlql29KYc3ySjZF5f5eMhZqSjYdvbIWSkXp5k4aAhJmKfIeAeXiJioOVf26JhnFzfXtqeYaDpZCEkoyCfm59gXSBd4SZl5KKk4+UhYhwe5OEfoSDiYNugXhogIV4cn9/g4qHfGV8foR2Y3FzgGl6cW92mo2GhIt9d3mBhXuDa1xvfHJ/h4OIfISHeohxgG1vgoWMgoJxg3d+loqMg3dtbH2EfnZ6ZWhqfnJhWnhbWnNuT1hydGdgS253dWJeXFtZdX50b1hnXmZrcV9vT1hpUz9aZ19bcWtnenJcW1lsZVlkcXlfaF1eZWxoZmtpcXd/h29sf36BdXCCeoCBf4OAdoGFiJeKcYKNcXuFfHp5hJSMdWt6f2xwfnV/fW9yfHuTcG+Bf3hmkYqCoZmdkoOGZ4eEcGd6l4p/gIWCmoqBfI2NaXhybGxmX2Fvem5fY3B5XGRsg3pgcHZfZGXV676LMzo+jI+Ac3qGipCOd4WZjn+Ujo1/bm2FjIt1fI9/hYKViXyDeG52hoSClXZth4RrdXt1ZXmDhKeMg46LgnxtfnJ0gniDmo+Kj5GSjYyHf3uSiHmAhY6DbIByaYB/eG18fIGKg3hieYSCcmRxaX9udnJ1gp2MgYCGf3N2foFzgXBba3xzeIiBinuGf3yIeHlwaoaCjoKIcIB3fZOJin1zbWp2gIB1dVxpaXlxWVd+VFtyZk1bc3JmXEpyeXBdXFtaXXaAdmpaYltoZm9jak5YZ1I+X2ZdXnZmYHVxW1lVb2RaZXF5W2heYGZtaGpraHB4fo5taoGEf3lugXt9gX+CenWBgYyThXCAi254fYB7e4iTiYBpe35qdHxyhntzdn5/jHp4hH58a4uMg5uel4yCgW2Nfmxpf4+OfH6Ag5SCf32KiGt1cWdpY1tjZ3NvYGJsdGFocIl6YXNzXmJjm6CQbl02W7C2dWuBin6Uh3eImYd1kIyKd3BthYKGdHmJeIl9k4h6f3NndYh9fJZub4V9aHZ5bmV6iYWkh4CGjIl9bX10fX97ipeGgJOQmImLhYp8kIpxfH6GfGl+bWuAe3lqeneCh4FyYHeCfnJkcmd2g251fIaVkoJ+g4Bwd3p8dX9tV219dXOJgIV2hnSCiXp3cmyHf45/g3F9e3yQh4d5bW1obIKBdG5caGZ1clJcfU9dcl1PXHNwZFZLdHlrWFpaWmFygXZiXl1hZ2RpamZPWmlOQWJlXGF3YVx1blhYU3ViW2Vvc1hqX2Joa2dtbGlwd3yTbGmEin18cH9+e4F/gnt3gICJjIRye4dvcneDf3uJjY+Ean57bnh5dop3fXiAgoeAg35+em2EjIiYo42FhHt2i3lrbYWJknl+fIKSgIB+ioRwcnBjZl5ZZ19wcGBgaHFmam+JdGFzb1tgZGp2e3+/nailyrlyhoV0lX56iZWEdJKOh3JzcIN6gnN1hnSId5SJeXlxY3aFeX+SaHGDdWZ2dWNqfISInoJ/fo6NfHF9coJ3fpCOgnaVjZSQiIKIe4mKbHl6gHVoe2lsf3lzaXp2gIN9aGB3h31ranRoe4FqdoGNkpV/fH9/cnx3fHR/YlV1e3Fyh4KBe4Fwhop3eG9ugoGLfXx3fHpzjISAdWdwZ2yIgXFvXWhjdG9MZndNX29WVFp0bmNRUHV5YlJYWF1icoN0XWJcaWVlY2tkUlxxSURlYlxkcV5deGhWV1Z4XlxmbmlXbF5hamdlb25ocHd6k25piIx5fXN7fnmCgYJ9dn2DiIaDcHaDc253goJ+iIuUf3GAfHh6eoGLdYN4f4GBgoR6gHVufYmLm56IfoZ7d4d8aHWGjZF6f4B8iYaEdpCAZ29uYGVcWGZZbnNhYWFxbGxoiW5gc2lZXmNtgHep2qnIh4izc4t6cY92fYmRgXuUi4B1dHV9dn9vcH9thXSUhnh1bGB5gHiHjWVxgm5ndW1bbX2BkJOAgHiSkXx3emyFc36PioNylYqRj4iGhnt/hm11d39taHdlbXx2bWt3d39/fGFieIZ6aHV2Y358aHWHj46WfXaBdnKAen1tgFpVcXxvc4GFfX93a4iGc3hqc3+Cgnx5e3d6cYl/e3Jmc2Rti4Nsc1pqYHZmSW9vTVxjWFdWeW5iUFN1d1lRVlheYXOFcF1hY21lY15vY1Vec0dDZ2BeZ2ldWnxjUlZddltbZ2xiV2tgYW5mZmxwaHB2eI90a46Ndn92eH13gYSBe3R9g4iIg29xf3VxdX6FgYiNi3t3f3iEfH2Fh3iIfH2BfYSAe35ydXiLjp+MiXuKd3WDel5+h5qNeYeEdIaHhXeJe2JubVxiW1thVmp0ZGFcaG9wZ4dxYXBmV1xja398ys6HuqJrbm+MbnKFc36GjH97k4V6eXR5dHR6amx2Y4R2koJ2cGdefIB4iodkcYBqanFjWG17hpyIgoFyl5N2fXpthm9/iIqGcJaOkIiGjIR7eX9ycnB+Z2hyY254cWpscnh9fHldZXmAeGl1eWeCd2h1iIyPln5ziGpwfoB4bn1dV298bHN+iHqAbm6Jf3B2ZnZ+f36AdXpveXKFenhxZXFgbYyBa3JXa195XUlwbE5YVl9VVnxrYk9UdnNSUlRXXmN2hmpeYWtrZmNab2JZY3FIQWldYWdfXFZ8Xk9WZnFaW2poXVhoYV9yZmpocWdxc3aHeW6VinV/e3h+eYOIgHVzf4WFjoNwb3t4d3V6hoWGjIZ6fH91i399hoOEh39+fn2Gf3x4dnl2kZSffo19i251gHpkhIiYhnOSim+FhYJ6g3VkbmpZX1tdXVRoc2ZhWWRycmeBcmFrZFdaX2l/eL6ue6C3bmN1iGl1fXN7hYh7fo2Ad3hzd256dmVqb2CHdY6Bc2piXn12eIqCZXB9Z2trWlZveIujgYV+cJmScX92c4BsfoCPhnGUiI2IhYmFfXl1c3BpemFqbWFtdmpna2t5d3p3WmZ9fXhlcn5uhXRmdoaNhpeAcYxobHuCdG11Ylttempzeol6gGV0h31tcGd0fXZ9fnB6anl5f3h2b2RrYG2JfWxtVWpgeFZMbG1QU1BpTll8aGJPVXZsTVFUVV9nd4RnXmFxaWdhV2ldXWxqSkVrW2NlV1lWelpOV29rWV1sZVxaZWNedWZsZXFnc3B0gXhwmYV2f394f3yGh312c4KHf5WDbnN5e3tzc4WGiImEeYF9do9/fYWJjoSBg3p+i4N7d3x2dpmdmHqKg4dpdn59bYWFlYFyj4JxhoJ+goBwZmxnWF1bXFtTZXFlX1hjc3VpdnBkZWJXW1tof3BvcoBzimVmeoBrdnd0dYWGeIKFend0dm5qenBhaGtnhnSNhG5mXl57bnmIfGdsd2ZqZFZXc3COpnyEe3aWkHN7cXp4bHl6j4N1l3yIhoSHhH11cXNtaHVdbWlgbXVkZ2dpem97cllngXd1aHCAeIJ2YneFi32Vgm+Ma257gXFlc2VganhmcHWIeXxhdYN2amtwdHlveXhye2V9fX12dW1jZGBshnxsalVqYnJUTGtsUE1PcUhefGZhTlZ1ZUtOVFhha3h/Zl5nc2plYFdkWGNyXkxMbFlkYlVUVXRXTVl3ZVpfbGFcW2RlX3dnbWJvanRvcX51dJmBeH+AeIB+hoR6fXaCg36XhW5ydHx7dHGFhY+CgXqLdnSRgHyBlY6AhYR8foyGen6Adnujpop5iYaFbHV9fHaEg417b4ZzeoV9goN1bmppZVZdW1taU2NvZVtYYXR7amhtaGBhWF5aaYBpa3CAaG1iaXt6a3V1dXCHgnqBfnd2bnpoanlqX2VuaIF3kIRnZVhhdmh9hnluaW9mZl1VWG9oj6h3gHp8kI14dG59bXF0eI1+d5R0hoOAhol2anN3aGlvXG1lXm5zX2dianhoe21bbYNzdGpvgX56eGJ3hYV5kYZziHJwen9yY3FoW211ZG5xhnp3YXOAcGdpd3Nxa3d2c3Vignl9dXRvY2JibH18a2tVaWJnVExuaVBIU2xGYnlmYk1Ucl5KTVVaZm14e2ZfbXFqZF1WYFZvb1hLVGlYZ15YTlZsVEtdemBcX2xdXVtiZWB6aGxhb3B2bm93dXqYfXeAgXmAgIeGenl6g32Bk4RxdHR+enZ0hYiQfoF9kWxzlYF7gp+Ff4d9gH6GgoCKe3aErJ9/eoiIhGxyg3t2gYCCdW+Ibn2AdIqAam9uZWRYX1paWlVia2dcWl92gmlebWxcYVdbXGuBZXJ0fWpqXm14d2l1eHNvh3x+fnp2cmx6aGl3Z11kc2h6d5KAY2JUY25lgYR1dmZoaWFXVlloZJCob353gIuNeXBue2Z3bXmKenaOcYR+f4CHbmR3dGVoaV1sYl5wb1toX211ZXpoXXSAbnJrcXt/dnZjdYaMfImIgYB4cnZ+dGFwbFhwcWFub4J6c2NxgGxhbXpuamh5eHNwZIR0eHh0b2NgY21zfWlrVGheX1VMdWRRSFdiSGN3ZmJMVHFZS0xYWWlsd3tlZW5yZmNaWF5Zd2dVSl1kWGlZWUlXZVFJY3lbXl9tW15dYmRef2lqYG50eG1vbnaDl3lygYB9f4mMhn52doZ4hox9dHV1gnl6eoKLjX1/hYlqdJeBe4qdfX6FeYB7fnyGiXNxj66Me3uHkH5mcYl7dH59d3Nwhm18fm2QemNwcGJlXWVWWllXZGZsYF1ddIZoWXBtW15YWlxse2Jxd3ZtY1xvdXVpdndyb4Z5f4F6d25vdGVodGVbZ3RmdnaReV9dUmVlaYGBc3xhYmlcVFheY2SQpWh4dIKFkHdsbXhmd2x7g3l0h3KBeX15gGlld21gZ2FfamBedWtZZl1vb2J6ZVt3fGtub3B4eXR1ZXOElICJg4l7d3ByfXJheGNabW5gbm9/enNlcYBkXm51aGNmd3pya22Bc3F7cXBhXWRtb31kaVNoWVpVTnpgUktaWUhjdWRhSlVuVUpMWldqbXN7ZGxsdGNhWVpcYndcVExkXllqVFdIWWFOSGt3WV9hbltbX2JjXYVpaGJueHltb2p2gZB5bYJ+gIGSiISBd3WJdIyHdHJ2doF3fX1+jI+Bf5N+cHiWg32ZknmAgHh5fn9zh4RzcJmhe3t/iZZ5ZXWJenN5d2x0cH9seXxwknNecG9hZ2JsVFtaV2lkbmZcXHKJZVNybVtZWFdgbHZjanVqal9bb3VybnV0dWuHfX+BfHdvbmxkaXBjW2tyZHR2jnNcVlNjX3B+fnCAXGFjXlNaYVxkkp9lcnGFg5Bza2l4a25ueXl6cYB2f3N7entkZnZoXmNbYWhcX3doV2JfcGhhd2FbfHZqanJueHR0dWlxgpaEiH+FdnNrcHtsZndXW2lsYW9xfnhzZW9+W2BwcGFeaXB9a2pyfXBvdmlvYFpka217YWZTZlVYU1F4XVNQWlJIZHRiYUdWbFFJUFpWbGxsfGVtb3JhW1pYWm1xWFNQZ1hXalRVRlpdT0lzdllgY25jWGFhYV6MamNlbXp5bG9pdnmGe2uDfYCEmnyChHl9iG2PhnFvdnp9dIKCfYuPg4OXdHiClIaBn4l1gYCBdH+CcIeDdm+il3N7hoyHe2Z3i29ufHBneHF7bHN2c41rXnRvYmdma1NeXFZoYm1tW1xxjGROb21cVldVZmlzaGN0ZWVeW3B3b3F2dnpsiH1/fYh3kHNjZGtvYVxubWNzeIdrWlRWYWJ3e3xvhFxjXmNTWmBaY5aUY25wgoWJcmlmeG1kcnVxemt5dHVve392X2dzZFxfV2JkWWJ1ZVVgYW1kYXFdXX5vaGlzcXRxdXdsbYWUg4p8hnJyZ257b3FvUlpkaWRvcX50c2JtdVVicWpbXm5lfGRrdXxwcXFobF5YY2lqeF5mVGRVV1FWb1hSV1RQSGVzYGJGWGtPSVlVV25pZXxpbHlrYldcVlx1ZVRTV2lSWmdVVElbWlBOeXdbX2VtalpiYV5ej25iZ2x6dm5vaXZ2f35tg4B9hph7f4eBin9rk4hyZ3SAe3WAg36Jjn+Mk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgo2Md3hueo1gZX1xZ3p0eW1tcXeDZ2R8bWNnZ2hTYF9VZ2BtcFxebo5oTmpsYFVWU29nc2tmeGVmXlpydm5zfHl0bol7gHece3prYWVsbV5gb2plcXl+Z1pVV19rd3p6boJeYV1oVllgWGSciGJrcIGGfHZraXVrW3VwanlpdXJub3yBc1lrbmBZXlZiZFhlcWNUX2JpYWJsWmB+a2ZsdHVvbXh3bGiGjYCKe4hucWZwe2xxbGFYX2dnbXF/cnJeaWxTZXFkVWJtYXhhb3R6dGluamleV2BmaHVcZFVhVlRPWWdTT11PUEllcF1jR1pqTkpgTFltZWB4aW+AZWBVXlRedlxVU2FnT15jVVRLXVpRWnZ2XV9mbWhYY2FbXo5xY2hqeHJzbWd2dHmCc4KDeoiPf3yKiI56bpCKdGxzgXR/f4iFh5KElY96fYyPh5GbhIB8jYRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6NjY2NjY2NjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjY2NjY2NjY2NjY2NjY2Njo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQ0dkaGdnZ2dlkKKgoKCgo4BkZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU0OVxgX19fX12RpqSkpKSnfF1fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGiImIiYmJiY2Pj4+Pj4+LiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCQkJCQi46RkYmHjoqQkpORi5CMjo+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2NjY2Ojo6OjYyMjIyMjIyNjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIuFiYqGjYaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQiIWGioWOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi317d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCIhYiMhoyIiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuEiIeGiIWJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fXd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4qOiouNio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoB7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f35/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5OTk5OUlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTkpOTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkpGRkpKTiIWTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkoKCkpCRkY51hpGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QiHCEkI+QfHSIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+Mc2+Kj4pyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fn5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI13bXuPgnN4ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx+fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh3Nub4R7dXaAhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWVhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnd0Yl5kX2FrcWZoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGJdamxdZWZnZWNjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkZISUpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aWmp3bGJucmpiWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01ba3JrYW10cmZRUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTl1jb2tYaXN1cFNNT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQkZIVWJnbG9wb21sWkxMTk1OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQ0ZHSE1aZ2hncm5uaGZkYF5eWExKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz5JWl1aXGVsbmpvbW1sa2loa2RTR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs9S1tpbW5vam9ta2psbWZRR0VER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs6PUhjb3NtbmxrbGhVQz5DRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdHJxdHh4eX1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OT1KYHNzcGhUPzo7PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PDpCbH1qQDo7Pj0+Pz9BQD8/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtbbkA+REU/QEFEX2Q7PT07Oj0/QUE/P0BAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKS0hWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6Om13SDg7Oj0+QTtIZD08PTw4OjtERDw8PTw8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSWBwcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI9PD1JTEZFdXZONzg4Ojs+P1dqQTs8PDo6O0xSPT09OTo/PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENyeko7XH+Df3p8d1c8PT89PT5FaHRMOj0+Pz08T2hLQDw4PEE/Pj5BPTs/QkBCQ0JAQkNBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRUU/QUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBR3J6a2KDhIOCg4B9Xj5AQ0BAPUpze1k6PUFFQkFQbl5UUEhBQ0NBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBFbnR9goKBg359hHZNQUNFQD8+WXuAXT9DRUlKSVRoZ2VfYFhGTU1GRUVFREVDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8e31/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISk1NXGloamViZ1phTklJSEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hMTk1mdm9oa2lsbmFHSEhHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiEVmyFh4aGhoeIiId8UExNTmx4dm5tb3FwUT9EQ0JDRkZFQkA+PkBBQkBCRD8+P0RGSERGR0lLSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKVIGDhISCgoWGhoSChYWEhIaGhoeHhop1SklSdHqDd3BtbG5WOz87OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYCAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSUllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI9nRVlrb3pubG9xc082OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUdPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjYpnZGpsY2VpdYFzPDQ4NzM1Njg6ODc2NTY1Njc2NzY3OjY3ODg5Ojc1Nzg5Nzk3NzY6PEBHRklHSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA2Nzg4PTo9RUNCZYWDgYCCg4ODg4OGiYuKiYmKioqKi4qLi4dzcW9mZ3ByfWU0Njg4NTU3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3NjY5Ojk4ODY4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2eXt7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISFhomKioiHh4iIioqMi4qLjYd4c25vc21xYTk6Ozw5Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PDo+Ozk7Ozw7PDs5Ojw4Ojo6Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3Vzdnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLioyNjoR3dXlyb29dQkJBQj5AQ0FAPj0+PkA/Pz9AP0A9PT9CPkBBP0A/PUBAQD4/QTw+PDs6Ozo5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw8Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uLjI2NjYF7e3ZzcVZLSEhIRUZIR0VDQUBCRUNDQUJDQj9AREhFQ0VDRURBRkVGREVGREBCPjxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYaGhoiJiYiHhoaGh4mJiouMjYyMjIyMjH96e3ReT1JMS0tJSkpKSUZEREdIRkRERUZEQkhJS0dIR0ZIR0VLSUtJSktKQ0VDQ0RCQUJDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2NjYyOiXt6cFxRUk5MTktKS0lLR0RHSUlJRUZJRkZFTExNSUpHR0hJSk5NT0xMTktHRkdHRUVDRkVGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozs9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyNjI2NhHp6eGRQT01OTEpJRkpJRUtJR0tKSUpHR0dLTE5MTEhISUpNUU5PTkxPS0lHSUpISURJSEhGRkdHSUdDQkFDVG5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhIWEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyMjIyMdnd0cVVSUE1MSUdESEpITUxHS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0ZGSUZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyMjI5+ZGBoXVdVUU9NTEVGR01QT1BXVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05IR0pGRUhKRURFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUJAQkJHVk5GTlBQVFh7hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjY+MjIxvX15vZEhVU1NSSzs7U1RSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUxMS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdHRkU/P0FBRUFDR0VERUxYUk1UVVZYWnyGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox+YYqLi4hzYmlZPVtaWVRSP0BXVllcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhVVFZUT09NS0xKSUlMTUtPTVNvdHZ4eXh4enp6e3p6fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJi4x9c3NbXl1cU1VTV1dVW1p1g1lVfZBhXFhdX1dJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4mKgW6GiYiHhIuAaVxcXVtWV1VYVFJYVmOWgFJlclhaV19oUGBmW1tYXGdhR09aaGddW1xdXVdST1NQUFJWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUVBSUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ+gH1gVFhbVlRWU1JSTVBNTGZ6W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbXFxeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX5+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHiHpvc1pOTlFRTU9MSktFRklGQz9UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t8fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXlxZVVFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRhc3t8f4CBgoGBf316e4B/g4KFhoeChoaGgYSBhoWGdmFeT0dBRUVERENBRVFDRUFDPkNJR1ZASE5MR11pUEhGTkZERUZJR0hCREhHSUtHREJBREBPUU1TZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUFVZU1VRUVRST1Zfa2xydnt7eHl0cm5zdHN5eH1/g4CDg4KAgoCDgYJsT0lCQjw8PkBBQEA/a1FLYEVGSElFQj9HTE5HTVJVSUJFPz48PTw9PT89P0FDQ0A/PT1CPkpOR1VudHR1c3R2eHp8e3x8fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5KSlBRTktMUVJRVFVVV1FRV1VQWFthXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVEQkJCPjtDQ0JCREJcXU97Tk9PTktMTU9PUUxLTVdNSEdAQjw6Nzc1OTk9Ozs7ODo4Oj88Qkg/XHN0dXV1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QX11aSUhQUlFPTVBRTlFSVFZYU1NZVE9ZWlxXWV1eXl9lX11ecXZrXmBna3dvb2xqb25ubGViWUhHSEhDQkdJRkZGRE1ST2FXU1dRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d6eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVldeWlhNS1RUU1BRVU9MUlNUV1hUVFlSTVhZWlZYWFZYWV1XV1hoc2tdVmF0a2FhX15kYV9eWVVRTk9PTUlISkxKSUZDUVBTWldUVE5RU1lTXGVVT1NUUk5LSUhDP0E5OTk4OTc4ODU3NTc4NTk6R25xdHd4ent7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFNUV1RVUl1uX1JOWmBbV1k7RFZYVFtmSkxQU1JPTk1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8/PTo3ODc2NTk5Njc2NzVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xdUlRaV1hVVFdUUlhYWVlZU1VPSkdPUE9PTVJKT1BPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQU01JTEpPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5oaWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEpIRkxNUE1HL0VfUj4zPz5qb2FTUlFAR1RRUFFQUU5RT1FQTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dnl7e319fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1RRU0FHVVBPUVFQTU1PTUtMS0xOT09RTE9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2ent4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTFFTTFRVVFhXVUxMS0k8OTg3Oz5APjw9QUBCPT5FSEdDRUZJR0pKQEZBQUBGSEVKT0hRUmJcUVBST1NPT1BMTU9OTE1NTk9OW1dLTVFPR0lIQ0hKTExLRkZGRT9CQz48Qkc/Qj9BZHB0dnp6ent8e3p6d3t3eX5+fHtxc3RwcnN3c3h4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRD05Nzc5P0I+Oz9CQEA+QURKRUNHR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTktMTk1NTExPTlNkTkpMUklJSUVBSEpMTU5KR0lHQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4OTo/Qj88QUJBQURFR0tGQ0hIR0dIQ0Q/Qj8/QEE+Q0VDS05SVExKSU1UR0lJSkxKS0xJSk1NT1BSUEpHQ0xHQ0JKSUxNT05JSklHQ0NDREhKTUxJWXJtd3l4ent6eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbXBvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxR0tER0hIR0pLSUpLREZCPT49Ojk6O0BCPz1BQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBDRUNJTVBISEtHSEtESEpMTUhKTEhJSkxLTV1SSEhETkZBQ0pKTUxQTUtNSktGR0dKTk5RTkxibWl2dnd6eXt6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo7QENAPkFDREVJRUlKTEZJSUdGRkNCO0FCQz5AQ0RDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJR0VOSEJGTUtNTE9NTU5NS0hISU9SUlNOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJREZGRUNDQkVAREI+Pz46Ozs9Ojw+Q0E+QUNERkpGSUhMSEdHR0ZFQ0A9RERCPkFDQ0NER0hJR01RSUZGR0tOT0tGSElGRURFSUpIS0lGSE9LQ0lMS09MTk1PT05KSklMUlVVUk9XZGBhbWdxcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRDxCQT5BPTo6PT87Pj5AQj5AQURHSkVJRklIR0ZHRENCQUFGRkNCQkJERURHR0hGTFFMSU9KSk1MSUdIRUdFRENJSUhLSkdLUk1CTk5MUE5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JkZmVkaGhmbmpmbW1oa2ttcmlxdnRzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3d3Z0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQURFPEFAQEM8ODo8Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0ZFQkVHRUZHR0VJTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUk9QUU5PTU5QTUxNU1dWWFhVWF1aXWRgaWJqaWdrX2RlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkU8P0JCRDw3Oz0+Oj46QEI+Pz9CRUZER0RFSEVERUNERUZHSkVFSUdDR0hGSEdFQ0ZKSkdOS0xLSEpMRklJS0hFS0tMTU5PUlRPSFNUUlBST1FNTlFOTVBXWlZaWVZaXVpYYWBhYF5oZWNgZGVoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V3dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TkhIR0lEQkNIRTxARUNFPTg5Pj49PDxBQjw/PkFBRkNGQ0RJRERFRUZHR0dJRkdLSERJSEdJR0ZESEtJR0tITUtKS0xITEtMS0lNS09OT1JVVk9LVVZTUFNRUkxPUVBPVFlaWVxaWVteXl1gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRMSUtJS0ZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QkFGQ0VFRUlFRkVHRkhIRkhISUtKRkpISEtIRkZMSEhISkdMTE1MTElNS01NTU9MUFBRVVZXT0tWVVRSUlFSTE9SUlFWW1tdXltcXl5eYGBhZF1jYGVmYGVoamRzc2ZqZ2drb3Jxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0NFREU8QEZEREM7Pz9CQEBAREE/Qj9BQ0hDRkZHSUZKRkdESUhHSUhKTEhISkpJTEpGSkxISUtKR0tLTU1KSk1MTk5NUEtPUFJUWFZNTVRVVFJSUVBNTlRTUldbXV5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydW53S0xMTE1HRENBRDw/RUVFQz1BQUNCQkNEQUNFQUFFR0NISElIR0pHQ0dKR0hKRklNSElKTUtOTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05SUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQERCRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSUpJSUxISkpOTE9LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdoZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDRENFRURGQkZGR0RFS0ZGSk1MS0xMR0dNSUdKS0hLS0lLS05MTUxMTElMTUxbc2JkcF5sbVVNTmZzXWZmcWxudGdwaV9hWW5uYnBwYmtqamZvcXRldG5vXG91Z3BNSnF5dmthYGtlZW14bGt2bG1wc3JwcnFwcXJxcnJydHJtbXNubm9wc3V0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQ0ZDRkVGRURDSEhIREVLSEdMTk5MTU1GSk5ISktKSUxLSkpLTE1OTk1NSk1NTltyb29ucHBsa01QUWxXTWlidHJwYW1udVxZbFBcbm1acW1rb214eHRzaXBdX3JrcWpVdXl4b2Nea2ZiZ3Bvampub3Byc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkhDR0RJRkVFQkZJSEhFSExLR01NT0xNTkdMTUlMS0lKTUlLSkpLT1BPTkxMTk5MXGhkdV1scVdsTlBRbVRZa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR4a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDRkRIR0xIRUNDSEtJSEZKTExGTkxMU1JMR0xMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXJrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJpbXR1cHN1dnNxcHBxb3F0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQT5EREJHREhJTUlGQ0ZKTEpHRktOTEZPSktXUktHS0pKTklISkxJS0pISEtNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam5fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGptcXBudHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcXZ0d3JHR0ZJREVDRkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJRktLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9OUU5PUUpKT1BRZHFpVFlXXFtcVllbXVhdXFxjZmFhZWJjZl9fZmtuaW10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdFRUFFQ0BESERGR0NJS0xIRkRHS0xJRUdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUdISUVGTElKTE9NSlBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUktZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRyeHJ4c3FydXJ0T0JDRExNQkREQkVJRUdHRktKS0hFRUlKS0ZFSEhQS01NSk1SSEdFQUhGSklLTEpMSkhGRElGREZHRUZLSENKTUxMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaGhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhUkpKTUlFQ0JDR0hGSEdIS0pKSURGS0tLRUZJSk5LTktITE5HSEU+R0dMSUtMS0tLSUdESERDREVBRkpFQUtMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0eHl5eXl/fn15dXl2dnJuend2eFlRS0ZER0VCRUdJRkdISEZGSUdIR0hLSUxEREtLTk1MS0hLSkhJRj9HR05LS0tNS0tLSUZHQ0RAREFISUNASktIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JdZGNiZGNmWFFWVFFaV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkRGS0pGRkZIR0dJR0ZGSUxKTkZES0tNTkpMSUtKSElGQkhIUU1MS09NSktJR0dFRD9FQ0lJQ0NIR0VUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVVlhUlFfX2JiYGBiYmBjYmFkZGJYT1FQUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWEhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUhGREdNUkhDUUpFR0hIRUZLSk1QRUZJSktOTExJS0xJSUhESEtRT01NUExMS0tISUNEQUVESUdDQ0hGRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdTlhhXGBgX2JjYl1hYldfX1RQT09PV1FcW1tcXF5fYmZmZWxlb293fHuAe31/gISEhISEhIWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfkpORkRGRkhESVJiUENWXklHR0hERk1KUFBFSUlKS05MS0tMS0lKR0VKTlFRTk9PTU1MTUhLQURBQ0RHRENDRkdCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU1BLT1NSVVpZV1lYWGRXT1NUUFBOTU5UUlpYWFpdXGBhZGVjZ2NrbHBzcnl5f3t6f4SEhIWEhISEgoSAfnuBg4F9e4WEhoaGh4eFhYWEhISCgYB9S0lFRUhGR0RLTV1MRkdYTEdISkhHTUxRUEhLS0tLTU1VTk9KSktHR0tQU1NOUE9NTk5OR0tGYEVEX0xFZ2RGTlxJXltybU9NVW1ZTERQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmFiX2ZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVHRkhFRUtPU0lKRmBTSEpPSklPTVJRTE1MTE9SVVJPT0lMTkdITVFbWU9QUE5PT09JSlF/UUl8WVlydFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1puWF1WXFhVa2hVXVZjWmBZW19WVlh/anR1dV5fdl5XYVtbZltfYGFhYV1fYWdtcGxfcHd0eIGBgoODgn59f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExGSUtFUVVMS05JS1JYV1FOTk9NUVROT1FPS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFyb29vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3NvcnJ7fG9+eG6Acl9gYGJhWmBfZ2tua2JsZmdtd36BgIJ9e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTkxHYF1HQUVNTUhKSkdJT05NTUpOVl5ZVUxRU05YWk1TU1JNS09IUVJUWVdXUVRQUFBRS0hneGxjeHJtW0tOVnlwdW11Ym92UGVlSWZ2cW13b4BqZnh3aVdyUWh6bWlqenp9bHh6f29ob1l2dmp2dXCAX3JmfWlseHxvXl9fYmFaXWJkZ2lpZGdiY2RsbHBwc3Rzc3N6cXJ4Ymx1Z3J5e3Nydnl+gXN1em58fXl4cm5OS1N1TkNCRlBQSEpLSUtQTk5PTVBaYFpXS1RXUGFeUlZRWVJMUElTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSZ3F1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXlxfZGRpZ2dlZV5hYmlpaWprbm9rcW9tanBhY2Zjb3d4b21wc3l/bnFwa3t6dHJvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWVVNVVlVZVhSUlldU0xOSVRUV1dZV09TTk5OUUlSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfWnB6e15genNjcm94cWhkfWlyfF5UTGxfdnVraXV7em1+eGt8cFxeXmJbXmFkZGZlZWViWmNjaWtrcnNydmdsaWhkZ2Fha2Fnc3JsZ21tcn1rbWhre3RtbWttT0hLS0hKSEhRUExOT0xLUlJST1NSV1JWVFBXWlZWVVRUYV9QTk1KVFNUUVZWTk5MTU9QS0hRTlBVTEtMU1RUU1RQVlVRUU5RUVhZUk5QVVRYWFhbW1VSU1dbV1hXWk9TVVdYWFJeWVdeV1VQWVJXV1dXWF5aZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2JnZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2p1amhnaWxQSUtMTE1LSlNRTVFRT0xWVVRQVFVYVVpVUVpdVVVUV1VZV09PS01WVFFOVVNOT01MUVBMSlJRS1FNS0xQUlVTUVJTU0lITE5PUVJRUFFUVlJYV1xXU1JQUlRVVVNaUU5TUlhWVFlXVVpWVFJWVFRVV1hWXFldYF1bWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGlnamtlZGNmaFBKS0xPT0xNU1BOU1FQTVhXVVRVV1dXWVVTXGBWV1ZZVVhSUFBKTldTUE5VUE5RTkxTUE1PVVNOUk5NT1FVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1ZWWVtUUFRVWFVVWlZYWlVTUlhWVVdbWFleXFVYXlxeXFtdYGBdW2JiY2dmZWRiWF9hYl5gZ2RmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZnZmRgYmNiT0xNTFFRTE9UT09TUU9RW1lXV1haWVhZVl1qZFZYWVpXVlNTT0pOVlRQT1RQUFBNTVJSUFJYVFFRT01QVFZPWFJUVVVPTk1RVFVVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFZWVlZZVFhYVlNSWVdWWl5ZXF5eVV5cXmBcW19fX15aYmJkaGdkZGJYYWBiXl5mY2NgYl1cXFxcWVpbWFthXF9dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWFpbZHFtaGRfW1hVVVdRTE1WU01OUk9RUk9MUVNSVVpVU1BQTVFYV1JXU1NTWE1PT1FUWFZVVVNVWVhbXl1bW1ZRTlVWVVtbV1JTV1ZXWFZUWVtVVFJaWFdcXlpeX19UYVxgYV1gYl9cYF1jYGNnaGRmYFljYGFfX2VkX2BiW1pcW1xZWllYV1xaXFtgXl9bXl5hYF9jXFlgW1FOT05WUVBUUU9UVFNQV1xcXFheXF5WXF5qcXd5gGNcW1VVV1BNT1ZTTlFRT1JUUkxSVFRZWldVT1JPU1hXVFNVUlJaT1BSUlZbVldXU1ZaWFxdW1tdVlJNVFVVW1xWUlVWVlhZU1VaXFVTU11YWl1eXGBgX1ZhW2NiXWFkXlxiYWJeY2ZpZGZdW2RgYWBgY2VfYl5ZWl5bXFtYWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdbVFdXUU5SWlNSUVRSVFVUS1JXVltaWlNPU1FWVlZUT1dSU1pSVFRUWF1XWFlTWF1YXl1ZWl1UVE5VVldeW1hSVVVZWVlVV1pcVlNXXlpdXWBdYmJdWV9bZWFfZGReXmNjYV1lZmlkZl1dZGFgYWFiZGBiXlhaX1pcW1hYWFdXW1lbYFxbW1xbWFpbXlZeWV1RT09SWlBaVFVWVlNUVF5eYF5eYlxgVV1eYmt5dGx9a1pUWVRQUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJWUVlYWV9bWlRVVlpZWldYWlxXVVteXV5gYV9jY1xeXV1lYWFmZF5eZGNgXGdkaGVkYV9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFZZUV1VVllXV1VYX19hYWBjXV9VXV5iZWV1gXpoV1hZU1VTVlxYV1dWVlddWE9VXVpeXVxUUlhTV1dVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVhUWVpaYVpcVldYW1pbWVlaW1lXXl9gX2NiYWRkXGJcYGZhZGZkXl9kYmFbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWF1aW1tYWFlbWVpaXV9dVFldVU5TWVZTXFRWV1lWVlxgYWJjYGNeX1ZbYGRhX3p1b2hZWllVV1RXW1paXFlYWWBXUFVeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19aXV5ZXVVSWFdZWV1iWl5XWFtcW1xcW1pcWlpfX2BgZGJjZGViZFphZWNmZmVdYWJgY11iY2lkY2dfZ15hYWNhYWBeX1hUW1paW1tYW1hYXFtaW1hWWVhXXFtbYF1WXV1TT1ZZVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXlxcWlZXWFlcXF1fW1lbYlZUWF5dYWNcUlZZUFdXV1dXVlNVVFhcXF5gYF1gXFdhXlteW1peV1VXV1tbX2BcX1hZXFxdXl5cW11ZW2BhXmBkY2RlZWZiWGNlZGhnZF5jYGBlY1xlaWRlaV9mXWNiY2FhYF9fW1hZWllaWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1lYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXF1eYGFgX2JeWWFdXV5ZXF5ZWFVWW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmVjZWZlZmJaZGZmaWdiX2NeYWZkWWhoYmZpY2VeYmJjYWBgX11dWlhcWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lWXFtbXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1xcX11gX11bYGRdXFhbYmVjYVJcWk9ZWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXVlYVFhdXV9gX2BcW15eYGJjXFxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYltjZ19caWhiaGllZGBiYWNhX2BfXF1cWVxZWFdYWVhXXFpaV1ZYT1haXWFjZmZya39KWVdcWlpfXFteW1hdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWVhVW19eXWFiYF5bYGFiZmNfXVRdYGFjZGRmZWdlZmZlXmVmaGhnZGRgWmVnXWFnaGNoaGZjYGJhY2JfX19cXVtaW1lYWFhWWlZcW1pWVlZNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeEgoKCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3p6enp6enp7fHx8fHt8e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl6e3t7e3t6enp6enp6enx9fXx8fH18e3p6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvIaJiYmJiJDM09LS0tPYWiUqKioqIozb0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyKlN3m5OTl5etUExoaGhsQj+/l5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl5eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9g4SEhISDhHhzc3Nzc3N9hISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z3enh6eXl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t5eXl5eXl5fH19fX19fXt6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnl9e3t9enx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiY2MiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en18e355fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3Z7fXx5fHp8e3d4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6eXp9e3t8e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHt4enp5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoSDhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGBgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoGCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FxcXJzdHR0dHR0dHNzdHNzc3R0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3NzcnJxcXBwcHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXFzcXJycXFvfIJvcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcIeGcHJxcHOYgm5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxfaGCcHJvi558bnBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXF1naF3cXefnH1vcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFxcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGYqJBvgqOdfnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHd3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOBg3lyc3NycnJzcnJzc3NzcnN0cpOppHmIoJ18cnNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn+Afn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH59fHZ2d3d2dXh6eHh4eHh3eHl5n7SppKiol317eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3x7e4mvpqG1q6yjfnt6enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19mKWWobKgmaeTfYB/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYGcnI6gr6Cfop+AgIGAfn5/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBgJeajpixoZiWnIV8fn5+gH5+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn6AgX5+n6ullqSbm5agn4Z/fn1/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYGBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOCg4OGjZ+yqKKgmJ2dpqitqKCZkIeBgICBgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OGjaCtsaabmqCbnpycnaGko52Uh4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GDi5eZl5aYoJqdnZ2ZmpeQiYaGh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYaOlJOXmpycm5SPiYeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOTko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4OIkJOOlJiSh4OChYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoGCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRk5GQjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgYCHm4eLh4KCgoGAgYB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Pj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgH+DiI6AgYKDg4GAgYCBgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2JhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf3+MlYKCgYKEg4KHiIKChIODgoODg4ODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSDgoyRgYGEhYSDhIOCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpOQjYyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2MnI6AgoGBgoKElJSMgYKBgoOBjpuJg4ODg4ODg4ODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKTko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GYjICDgYGBgI6UjJCBgoGCgoGOnaGloJGEgoOEgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeLfoSEg4SCg4OCjYmFjIKCg4KDg4uSj5mmpZeEioiCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn99fX1/goSDg4SGj5SVkpigoJiUhoOEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhoaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/fn+Ag4SDhIeYl5uYlpmYmpOGhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhYSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWDjJuJjZmZlpSTjYeGhoWGhYWGh4eHiIaHh4aGhoeHh4aGh4eGhoaFg4OEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhYOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fX6Af39/f3+AgH9/gH9/hoSWmYB9kZiYl5WPiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGhoWDg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgYKBgYGBgH+Af39+e3qAi5+hk42am5eVko2JiIqLioiIiImJi4uKioiHh4iIiIeHiIiHh4aHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUkpCPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoODgoKAf359fX19fn58e3uVo5yboaGfkIKKi4mIiYuKiYmIiYiKiomLiYaGhoaHhYaIiIiIhoaHhIOChIeIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCg4OBfn19fn5+fn5+fX59fYGTlZagoZuUh4mIh4eHiIeHiYeHhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYGBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KDgX18fX+Af35+fn18fX58en+PlJmbmpqVjoOEhoWFg4OFhISEhISEhYSCgoKBhISBgoODhYaFhIKCgYKCg4OFhISEhYSEhoODg4WDgoOBgoODhIWEh5KRj42PjImFhIWEhYKBgYGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+BhISDg4OCgoB9fX+AgIF/fX5+fXx9fXt6eoOPkY6Vl5iPgYGCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICBgIGCgYOBgYKEg4OEhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59f4KEhIKDg4OCfn1+f4CAgYB+fX19fX59fHp7e4aMjZGUloV/f3+AgH59gH9+gICBf4CAgX9/gIGBfn19f4CBf39+f4CAf4CAgIB/gIKAgIKBgIKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgYOEgYKCg4KDhIWAgH98fX1+fX1+gIB+fX9+fX6Ag4ODgoKBgX99fX5/gICAf319fX18e3t7enp6e4mNjZKJfn9/fn5/fn+Af35/f4B/gIB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/f35/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359fn9/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6enp5f46OlIqCf39+f39/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9+gH9+fn9/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6enp5g4+LlJSCgoCAgYB/gX+AgICBgYKCgH6Afn9+fn5+gYCBgH9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhISCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFgoGDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX18enp5eXl6h4iPloeDgYKDgYCCgIKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgYCBgIKBf4GAgX+AgH+AgIB+f39+fHyJlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgICBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eXl8goSNh4KChIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgYGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHh5eXp+gYN/goqEg4SEhJeXg4OEgX1+gYGCgYGBgoGDhoiMhYOCgoGEgoODgoOFhISFg4ODg4KDg4KCgoKDg4KCkZCLiIiHiYeGhoSGhYSEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4eHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5ent9f3yFkYODg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4KBgoWFhoaEhIWFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhISEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6enp7e3+CgIGBg4KAfn1/f3uIkXx8jpZ/fX9/goaKhYODhIOCg42Jf35/g4SFhYOEhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl4fH1+gH+Af317fH9+fYKVkX+EiH18fn+ChHx8gYKEg39/h4N9goGAgoKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fn5/fn5+fX18gIGAfYaPgX59gn5/foCCfHyAf4KAgYB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIuOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeFhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF/gIF9f3+Af32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2Njo6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt8fHx8fHx8fHx8fX18e318fHx7fHx8enp5e3x6fYWDg4CBgX6Af3+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fXx8fH1+fXx8fH19fX18fnx9fHt9fHx6e3p8fX1/hoWDgICAfX59fn9+i4SBh359fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/gH1+gH5/foSSjY2Mj42MioaEhYSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgXp+fnx+foCAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1+gICDg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39/gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8fYGCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoCCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXt/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+fn9+fn9+fHx9fHx9fH1+e3x7fHx8fH18fXx9fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKPjYmKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af35/f3+AgH9+fn59f4B/f39/gIB/gIOCgH+AgYCAgH9/gICAfnx5fH59fn19fn6Mhn19fnt7g4N9fX18fXx9fX19fX18fXt9fH19fn1+fX19fXx7e3t8e3x8e3p7e3p6ent+foKGiIeIi4qLi4mMkZCOiomGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgoKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgoF/f35/fn6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn19fHx9fX19fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eXl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYF/gYGBf3+Af4CBf4CAgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fX5+fH19fH19fn59fn98fXx7fH1+fHx7fH16enl5eXl6e35+gIGDh4SIj46Li4eFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgoGCgYCAgoSBf36BgH1+gX59fn+AgH1+gISAfn5/fX59fYqFfX5/fX5+gH59fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6enp7fH1+fX+CgImOi4yIhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYCBgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgYOBf4CBhIF+foB/fX6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX59fHx7fHx7e3t8e3x8fX18ioqJiYaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoB/gICDgX5+gH99f4B9fX5+gIB/gn+BgICAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISDhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX6Af3+BgIGAgICAgYF+foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhYOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SFg4F/f4B/gIF+fX1+f35+fn6AfX1/fH19foF/gICAgoCAgYCDgoB/gH6AgX+AgYCAf35+fX5+fn99foWFgYGBf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Af4GAf35/gH+Bg4KDgH9/gYGAgoGBgYCAgYCAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9gH1/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgYOCgYOBf4CBfn6AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fH1+fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhYKEhIWEg4OCg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fX19gH+AgYGBf358fn9+fn+Bgn+BgYKDhoWBf39+foB/gIGAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgIGCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIWEhIaDgoSEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICAf3+BgoGAf31/gX5/gIKCgIGDgoSEhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn17f32Afn19f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19foCAgH9/f398f39/gYCBgIB/fIB/fn5+gH59fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t/hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GBgH99gH5+fn9/fn19foCBgYB+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgICAgH1+fn+AfXx+fH+AgYCAgICAfH9/gH9/gYB/f32Bf35/f359fXx/gICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7e3x5d3t5d3h3d3h7e3p7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fXx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GBgYGCgIKAgICAfn9+f399fH5+gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXx8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f359f36AgIGBgn+CgX1+gX9/gIF/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjXp8fXx7fXl7enp4eoGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoGAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoKCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgYCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fHx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gICAgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYCBgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHt9fHt9fnh3dnl5ent9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4OEgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgIGBgIB/gYGBgYGDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99en1/e3p2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgHx/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBfoCAgIKBgoGBgoKAgICAgIKCgYSAfoGDgn9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH98e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHZ7hIKDgoODhIKEg4OBgoKEhoSCg4KDhIGEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOCf3+BhISBg3+CgoGDgoKCgYSDg4SAgoOCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6e31/fHt8fH19fXx8gICAgICBgYGBgoF/gICAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhIGCg4WFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODg4ODhICCg4KDg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgIGAe32Afnx5fHp6en18fIF9enx8fX18ent+fn6AgH+BgYGAgICAgoGAgH99fXx8fXx2cnd4eHZ0f3Z1fYeHg4KEhYODhIWEgYKEhoSEg4KDhISBg4WDgoKCg4OBg4GCgIKAfYCAgYKDgoKCgoSCgIKCg4OCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH1+fn9+fXx8eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYSCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgoKBgYOCf4KDhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf359foGBgH5+fX59fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIaFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4ODgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAf318foJ/f35+fn59fX9/f3+AgIB/gISEhIOEhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChIWLiYSEhISFhYOHhoaEhISEhYSEhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoOCg4KDhIOEhIWDhIWGhIWGfYN6fX5/g3uFg4GEg4B/fX5/fn6Bg4F9e399foB+fXx8fH19fX18fX1+gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhIJoenJzc3yAcoKEfoODfYF9fn9+f4KDgnx/gX1/gH19fHx8fH19fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIKChIaGg4WEhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhISGfXB7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHem19cnN2c3ZtbndscHlsdX1/fnx+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoOFh4WGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f359gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSFhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/f3p+fX1+fX9/fn2AgYODgIKDgYKEgoF/gYKAfX9/gX5/fn5/gYB+foGCgICChIeGg4OHhISEhYeGhYWFhYeGiIWFhoWHh4aGhIaGiYiFhImKiIWEhYWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH19f39+fX9/goJ/gYOBgYSBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoOGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEg4WEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFg4SEg4KBfn9+e3x7fnt8fX5/f318f36AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGh4aFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhYeFhoaIhoWIh4eFh4aGiIWFhoeFhoaFg4KFhYaFhYOFg4SEhoSGhoSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEhoWGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWCg4WGhoSEg4SEg4SGhIaGhIWFg4aGhYaFhIaHhYSEhYWDhIeGhIKDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaFhIaGh4aIhoSEhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYaIhYaHhYeGh4aHhYiHh4eFhoaHhYaGhYKEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIOEh4OEgYKEhYOBgICBe3t+fXx8fH59fHx8fX58fXx+fXx8fXx8fHx9fH59e3yAf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaFh4eHhYeGiIiHh4aHhoeFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX99fHx8fn18fH18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaHhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGiISDhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhoWEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn9+fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoSEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYiDhIWEhoaGiIWFhIOFhYaGh4aHhYaGhoWGhoSDhIWCgYKBgISDg4J9gYGAf4OBfn9/gHx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgYGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhoaIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaIhYWEgoWFhoWGhoeEhYaGhYWGgoODhYCAgYCAhICDgHyBgH5+g4B9f3+BfYB8fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhYWFhIWFhIOCgYCCgYCAgIOBfn5+gHl6fYCDhIWHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4OGhISFhIeGhoaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAfIF/fX6Cfn6AfoB/f319fn1/e399e3p5enp5enx9eXp7e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhoWFg4OFhIWGhYaEhISEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl5enl6e3x5enp6e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaFhoaDhIKFgoWBgYB/f4CAfn+BgXx+f39+f4CCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDgoSFhYeGhoSFh4WHhYaCg4KCg4KChYGDhISFhoSGhoaGhoWDhISDhIWFhYOEg4OEgoSEgH+Cgn99fn5+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6e3x7fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/fn5/f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBgoaFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGBfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l7enl6enp7fHl7fXt7fn9/gYB9f319fX+AgICGhISFhIWChIKChIKBgIGAfn1+f35+foB9fYB+fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYOFg4KDhYWChIGDgIGAgYCBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fHx+fXx+g317fnx9gH+Ag319gIB/fn99fHx9fXt7enl6eXl7eXp6eXp6e3t7ent9fXx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpYGRTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pjw+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE9MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1svLy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NPS09PT09PU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88Ozk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkeo2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbLy9DR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfY19fX2tva2tra2tra29zb29zZ19fX19fX19fW1tbW1tbT0tLT09PT09PU1dTU1tXV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU1Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWy8yVhYaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI2Li4uLi4uLi4uKioqIob+9vb29vb29vLy8vLu/0tLS09PT09LS09TT09Pb4uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlNiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18vMblBTU1NTU1RUVFRUVEyg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxYUlNTU1NTU1NTU1NTTnquqqqqqqqqqqmpqamosNLS0tPT09PS0tLS0tLS3+vq6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CQDk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fLzHFVWFdXV1hYWFhYWFhRofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKaeXFZXV1dXV1dXV1dXV1N9sKurq6urq6urqqqqqbLS0tLS0tLS0tLS0tLS0d/q6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw7Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzM14XmFgYGBgYWFhYWFhWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqomZhYmJiYmJiYmJiYmJehbOvr6+vr6+vr6+vr6620tLS0tLS0tLS0tLS0tHf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ojo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2MzMx8XFxcXFxcXFxcXFxcXK0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Ozs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMy8vLy87S0tLS0tLS0tLS0tPT0tXT1NbW1tbW1tbW1tbV19jY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ozg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjNzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7S08/O0dTU087O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fX19fX19fW1tbW1tbV1dbW1tbW1tbW1tbX1tbW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1ZKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Sq5zP0q2Dg5XP0aWi0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09PD06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StpylpMqbvLiZtbOgoqrSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pzp2ckZ6zpo2BjcaemJacx8/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pjw8OTY/Qj9COjY0ODo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+YoJu1mKOKq9a6mKKer7HSz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qjo3NDo6Ojk7Ozg7PT89Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9O0mZaqu4qtq5ulsZmWsLOp1NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PTw5NjQ6OTg6Ojk3Oz9APDw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/KoKO/ypyljKet2KqZqtTPz8/Uq5p+o5GNpZyWp5CZhJ2To9XQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+OTw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ1Kybp4uWoqi0qp5/oKmFmaXV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NO2srKlmavP2MGcgLytppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxKKZlp2nkaGenpmolpiautXR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT06Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKugx9Wiq6ScuKSro57DoKukm9DS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLS0A+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTyJKNtNmpj5Cs18KPjbvU0dLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWlqW0xfTUpMSlVMRkI8PD9GRUdLST02Njc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTIwdXS1cC/1tLVxcTV0dLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz4+QURMTEE+Nzc1Ojg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR09TS0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9PTc4Njk3Nzg5OTs7PT9APDw4OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRDSTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSUQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNBTEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUUE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29va2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODo4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Njg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NjU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozs+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1OTc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRj44OzcyNzk2NzQ1MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQkQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztbW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e3t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6urr7CsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ojs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqainqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaWlpaWmqKioqKilp6iop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6OTo5PD46OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs7QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKWnp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9BPzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJydnZ2cnZ6foKKhoqOjo6GioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeYl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QD9CQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3NTc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6empaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OSlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqamp6emn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqampKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg5Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz5BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpqaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTg5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOkpqalpaanpqainZyfoZ+XkZGQlJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Oz06Ojs3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWlpqWlo6CgoaGgmZKQj5abmZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoJ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1OTg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpKSmpqWkpKOioaGenJuVkpSYnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg2ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKjo6SkpKSioaGem5qZl6G1npmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqZl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+goaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoKCipKGioqKhoJ6cm5ubmZ+rm5yam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgpbOsoKCfn56cmZmampuuanadnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpubmpuamJmYmJiYmJiVlJORkJGQkJCSkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgn6aSm6ufoKCem5qampmohESAn5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7OTo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6gnmKcpp6enJqam5yho1FIhKCdnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52bmqZmXaOgm5qZm52crnVJTIahnJ2dnJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZikgFJ4opmZmp2boKRfVk6HoZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoKGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRcXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmJiZoIhbX5SamZucnKOPZFpNgaKenp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1tMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmZ+XXV12l5qcnZ2igWRZTX+inp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6enp2bm5qcnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZmmBhYICWnZyemHRjVU+Bop+fn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk6Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmZ9pXltlf5ycnoxqX1BThp6bnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzk3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampeTc2hhVHaTl5yHXFZQV4qSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWjopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGOkpqekn2go5aknG5MT2OGhoKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAhKCdjn9rlqWVn3+Jf19yf4CCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjkzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+f4Cii3xuUnWcjIxZcX18fn18ho6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9Oz86ODw5OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2YmndYT0xxlIaCS19wcXeIhYqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GNo41ULzA9eId3d0BEXWtthJCJiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuippxnQltIO3h5a2dFMThabHOQj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqa+PSnKieUF8eGRiUVNdSWBuiqGhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6ijeGDB1qVDfI2CdU9tjnZTZH+jqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAREJAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKenmZ2kpaOinWJ/vcCueKCjmpVlTGF4bVF0laKioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqGip6GmrqamnZ5qhJy6j6jRopqzqFhMrJNTZY+gnqCgnp2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKvq6Kihnd+fXLPyLCap69rVaqwY1uHpZ+loqGeoKKYlZ6bn5+koZyVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e3tLW2s62urY+Gg26RzLuUk6SWdFRvenNwfZamqqekoJ+jm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBDQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyt7u7u7m5wbi0taCIeWRYn7a9pqeaiHdrcW94eXt+ho6SmJ2jpaarpaSYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1t8HGzM/OzMm+s6SQc2ZSRIuVhoaGfXhxbmdmbGlscnJxcnJ1fY2pxMS7oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWFmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxcfb4+Pay7yvpJeIdFlaUURpeGtudG5rZWVZV11YXGNqamlmYWmKtcHAuamvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d29tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca+zdLVyrmnnZSGcl5RVEtEW2VeY2plYWBoWVRYU1ZZWl1ZW3Wat7ystLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnZycnZyZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8LBx8vIt5R1ZVVQT1RIPl5sXl9lYmBdZGFTVVdWVVVYc5ytsaqoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDubjDm2FJREdLRD1bZWJiaWNgW2NfV1JPUFBWgLS6rK6lpKOopKCgpZmptLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn52Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7d25raWh2WmdzeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExMTCxMGtg09GTUU7TVtfZWtlX1tgWVlTTlWAo6u5tbKsqaOhramsp62frLS0v8O+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnZlZmpqaF5rcG55eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwsaWalhHPz9HXmNiamBaWFdUVneat8C7vLq8rK2mqbu6ube/s7W4ssHGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrLGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FodmhqanVueWxeZFtWYFlMSEQ2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzsXGxr2pclBLMFhTVWZhU05QcanIyMLEx8C8vrSwsLDCvr7BxsC+t7bDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra+1pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjouUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfXhwZ2BrandtaWZ2b3RjXWNVV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwsG8kT9Pdn6JVkxvpcvUxba/v8C/uru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eYBzcGZlZ2RsZWJrbm9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28xad3a4OQl2+qycjH0cGvvb24ubu7vre0sLm+s7y+sbm1uLy2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZWJhY2RkamNnZFtaWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwLq/wLy7xb26wMS/vb6vc2V9kYqK0cW/v8m/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe3uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWNjaGtnZ2pmal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OTY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjbi/u8O1use2tbi6vLi5tqqkmI5+hMm/v7vBvrnGvcK/vMW4tre0uLa2u7u4trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZ3BqZWxoWVlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxHeozL3Ht7m3rba0t7mztbG9ycSVSnvKvr++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h31rbnFncWt0ZmNuYFxVSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1q50gLvIz8LAuK60tLu9t7mxvcPKjkN1zcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFyZmxqb3VveGRoY1xjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLGydKZcXKr0dHMysS1ur/EyL6+tL/AwHlSbsvGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdHBtbXRsbW9gY19iYk5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MO6vrzEvre8wL/Jz8fIysrChnJzo8zMy83KxsLDy87BvLi9urJwY2K7yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFkXF9gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vaw762vsC+vrqmnKmytsO/pXl1eJnEx8vIwcPAwMnKwb+7ubGhfXNrrcjFxL/Awb/Lx8PAyMC6wb/Ds7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLltrM69trnAvKx9bmhubXKBlZhzd3yXvb/GwLnAvL7FxL29uLGwmJB9gJvKwsO8vb+/w8O/v8e8vMK1rK60tLy+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3FvalxgYVpUUUFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM60doCzvba1wqWHaVpeYE1SW1puc3eAn7i4wrqzu7e7vb+6u7uupJuYh5F+wMTDvry/u7u4tsHCtcG6gKCwrK+9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vLSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dnhucmFfZ11bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJqIR4iaCvtZ1qZWdWWWBJSU1QU2x3hqWwt765srWyu7m8trm+tJWcpZahcK7JxMC9v7mzrrK8uq7BfnCiq6asur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cm1gZGJcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xauIfHaLoJlgVENYVUdhalZPRUpgjaCsr7a6tbSyrLy5uLW4wb2LmLCipXKly8K/ubq1rqWss7CppFSAlqGepa22tMG2tbOlp6qosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfHB2c29kXmhZXV5TT05CP0pDQUtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+1kYJ4h49vTko/ZFlCTneAlGpOQV2BsLWztbK0r6y7uri2ub/GdoOqnppkp7+4tbKxra2fpKanpYhJg4+ZmJmfqa24q6qqnqSppKuur6ewq6+xsa2xrq6vubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnRtdmpsXVxrVV5cUE5IREdNQkdORzg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3t5WMiIR7WEZBTodZSkpYd42BY0FTo7mztLKwsa2wubi2u7e6vZCisqujcquwqautq6OooJ2enaRvSnuGiYiFj5uoraOio56rr6Gjqaihpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlpdXRvZVViZFhdUk9NSUBJUkROQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsryqmZmVaU5AUnhxUElJS2abgVlFUq67sayzr66srba2srS1r6mmn5qbnZ6mqJ6gqKmfoaeWm5WnemJubHuDfoCIm6ifnp+huqSlnaOjoJ6loKSspaaopaKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQlpWWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqmkqaumqayrpqGIeIN8dn96Y3htbl1RaVVQT0dQTU1DUFJBPzs+NDo6NTs6PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqWmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqulvmlFUp2CUVdJSl9JU45gY2KArrWqsrSuqquvsLKzraWdkZeTj5ign6KgnKOkn52olJqVoLWeg36NkYuDenuMmZ2cp6qSqpyfoKGcoZ+jqKecp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyWk4+PkpGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjn52gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnyAdXZ9bmx8ZGlWU2ROSkhHT1NOS05IPEVAPTJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra2urm6t7e7rqigoamgqsa/y6FQQXOeeE9uS0tiZXRzYFpecJCxr66ztaqmrKyjm5mUjZGVl5iYnJ+iopydpJ6apJaWlcPaw7q2oZGMjIRza3qZn7GBm6uhn6Cnn52fo6aonqOmn6qdqq2qrqeosKWjpKanrKaipaKbmZ6vqK6yq6arqqCbmJiYlZOWmpOVlpqWm5eYmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXyAfnd5fGV5eWFiU1ZhSUlLTFNVSlNRTTk/QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTHx49XU0lkpFxlfm9yXVBrY1tkX11rj7SwsLispqGcnZqUmJqZkI6RlZGMjo2TmaKcl6KYlqrh3dXV0bmhioqLdWZgjryhcqquq6aisaOao6amqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblZablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgm1lXFNbWk1SS09PVk1UTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeq6SNelVpcnZ1cGN2dlhXY2BjZ1lYV2atrqyvp5+eoqCWkJOboJyZl5KTn5yho5qem5aemZ29tbK+w8TBsZSAeGxpYY20cYa3uLawp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO1uLO4rbK0pKCdpaCsoaGioaCamZaWn5ubmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHZqd3VebVtSYUlSVkhGVldLQ01IPUtJOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqaiuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boqGgpIBugnBgY1hMW1NaTUxQWFJITU1ImKyqqaWgn5qSkZSYmJaWloyIi46UnZydnZ6WnZesl09ag6O3vLaif25laGlygV+qur2/uq21tLC3sK60qaakpaypubO1u8O8w8G3u7arrrG5t7yvs7C1wby3vrOztaKsoqmpsqmrqKeompmemqqnoJmnoJ+fqKilpZ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaG5cWFxDV05KR01IQ0ZOPT5MPjQ8OjY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamplJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn52KYldeZWBXTVFHPj4/Q0M/PkJReKmtqaqmoJ6foqOdn56bnZuUk5WUnp6YlIWdmZ+ZrGZBUlp6o7K3qIJoYWhxcGCBx76/wr+2urvAw7m9u6yup7GtscK2uMLGwMjKwMq/sLm5vbjCvri0u8bEvcO8uLSqs62qs7Svs66qr6OerKi3sq2jsKaho7CxrrCkpa+joaCaoaahpKqqmZ2gmZqioKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIREpQST9FQjRGSDk2PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PDs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+VfWBeZWBRR0Q8Qz5FPD85Nk5+qrOnpKOioJ6lrKafmJ2VkpqemZWMioaIhnhshp+ipJtsb3tqYYOmrqZ/Zmh5iIx+s8fEwsfBwMXIzdDIy8Oyt7W+sr7Fu77MzcbMzMzSx76/wMO+x8fCuMTKycTBx7+6tLq7tbu3sLayq7uyr7y3wLu6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOVlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZVpcRkxNRURUTUVCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxAP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafnNqYVdORT5JWXxvYkI9XI6urKCZm5yenpmXl5iTjY+Xl5SPjZCMgoOCdnJwbG+NpK2NdHyilWVmlJ6ZeWh8kJ2iqcHNy8bIxMXM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbHxsrIz8DJ0c3HxsjGwr3Ewb+/v7W+s62/wMPDx8XIxK+/ubK4vcTCwbu8vLWup6euqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl1c2ViZ3JvZ15aWkRPTUNGUUlEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojs+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpudlmtmXVRJREA/S4aepZqEoLKto56cn5qYl5STlJeRkJCNiISEiYeDgIGBgHlxcW5qdqKxiHKPuMWbYnuKhXRxiJShpaW40czMzc/EzdTV2NHXzcbHyczDxcrPytLX0tfS1dbT1MjMx8zNytPNztPNxsnKysLHzMfJyca/w7OzyMXLy8vPx8q/vr+9wcfFzMzJycDDwK6ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amVWWFJETkdASVFDPkI9OjIyQTxFPDc4PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjk6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZxjU0xKREM/Q1Ku0b2yr6acnJygpKGdmpSUlZSKfXlxbGViaHJwcnuFioB1cG1wcm2Fn4VphLXXl2psdnJ4d4OQm5ubttTT0s/Sw9DT1tjV1dLLyc7Qy8bN0srS1dfZ1tjT1tjN0srP0czP0c3T0MDJyMvEzM3Mz8/Gx8i2wMvA0s3M0MfKycDEw8jPzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2FlcmNdUlxKS0dBRklKPztBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaWloKKiW0lAQURBRlF2sq+mmpSXn5yaoKCem52alYl3aWRhX19fX15fX11hbHVzcG9ua3Buc4KJZmyntWh8Y19ldHB4iIqJiqfV09PR0czQzdPX1tPV0M/S09HJ09HI0NfX2NLY0tfZ1dbMz8/JzdLMztHAx8TJx8/O0dHSyMzNwMvNxtTPzc/JxcvHx8nMy9TU0dXP0szTwrnFsaWota6om6irpZ2yqLCzrKyTj5OOiIqOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlFgSkpDRUNTTj88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWepaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqeqqKGjrGdDOD0+RFiCqqifl5WXmZqcn52Ym52TfXFlY2JfX2FfX2FgXmBgX2BlbXBwbWptb3N1gGheg5iKg1lMWmdicXhyamiX1MzV1NHKz8zT1tLR1c3P1dXRxdHTytDU1dbO09HY2NjXy8jOxMrPzcrMwMnBycrOz9DM0M7OzM/QyMzQ0cvOy8PKyMrNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zv7uxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0lGRkRNWUU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg/OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PT0/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoKCjp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLJ8SEZCO1aNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYGBgYGBeYF9eXGJtcm5tcHBycnZzZ2lwcWRYUFFXWGFiXFdLp9DJ0tLOxs7MzdTLztLMytbW0MzQ08vM0NHTys7R1dLV1sq/ysLGzcPIysPNxMbJy8vPy87N0c7UzMfJ0M3Jx8vGx8LGyszO0dHH0M/OzszQxcfBuLm9w8K9w7mysr6wu8PDtaqYpaGYlpGVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR0xJUVFCO0Q/OzY4Ojg6OzU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3Nj88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvcHePmo2Ml5WQk5GRlZaVkIt8ZWJiYmBdXmFjYmBfX2BhYWBfXVtdZ3Fxb3BxbWltdW5lcXNyeHBWT05UeXdVbsHAw87Ox8XHzcrRx8rNzcXQ0s/NzNTKx8rOz8fHz9LL0M/FusS/xsq9w8fJzsXDyMDHzsjEzcvN0MnFxdDJxsLGycW/wcjNzMzPw8rMycfM0MXFyLvHw8nJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSUhHSU1VRz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChqKqk42Nlo+Fg4ODgX2EhH5zX1teXV5gXmBjZGNfXVxeX2BgX1taXGFrcnBtbWhnaWpzX2V8hoVoV1pOVqCWZZu6trvHxcHDwMPIycjIyce/xMvFx8rMycTBysnBwcvPxMvIv7nBvMbIvsDGz8vEwMO7ysfIu8nGxcrBvsLLxsXEvsa+vcHExszGxby/ysPFx9LFwcnAysrHyMbQw8PGw67Ey8fDyre/vLqzqaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQ0dETERGUz81NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai+uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtm1eenyekYqSloZ6gISFf3V4dXJwX1pbXWBgYmNkZGVkYFtcXl1eXV9bWVpcYW5xbWlmZ2tobnJbbXBvWUtdXnmhiW2gsa6twLm5u7m4wMHBw729uLy+uMPJxMbCvcbAt7vDyL/Bybu2u7vFw7+8ws7Dxr6+tcG+xLu9x7zDurW9xsTCw7fAtra/v7zNxL22usi7v77MxMLGw8bJx8nG0MbCzMiyx8nDzszAxcO/vLK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUVCRkpBOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstau3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrPxcnFx8G6xb2srqdgY3aBkouIi4R4f4aGf32De3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF1ncm9rZGNpaWt2d2ZgaGBGZmJ3gW9el6qoorSxtLOysrO7tLuwtq+zrrG6wbvAxLy/urSyur7AuMe4tLy2wMK9uL3HwcO7ta+ztbu/tMW4u7Wsub2+wL2xu7awt7qzxr23r7y/tbe1xb2+w8bAxMbGx8zFv8bGu8fLv8/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKR0JEQUVGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxcvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CaW2dviI6GiIl6eH6FhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX15cW15cXV5aW1tcX2tvbGZjZmhoanhwU2VuZF1XYl1MWpmmopimqK+rqauosqy0r7Gnraarsru5tcK5urmwqrS5u7PBua/Asb28u7W7x7nDt62qqLCywLa4vbCxqLKztbu8q662p662rryysKq4sK67rru4u8DBvrrDv8bDxcC8xsHHyrjFx8W/x8PDucTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTExNSkVBQz9GQTo6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHEz8fNwcLGv8TEw8PKwsnKv8C8wrqztbXDrqqxk1tpfpKIjo97eH2JhXl7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpaWlxjbW1mZGRkZmdseVlSaGNFS1pTPl2Yn5qTlqCmq6Kmoaqoq6qvoqWeqay0tbC8uK+3r6ituLSzu7ezvK+4ubWyvMGywK6lqaOrsbOzqL2qq6irrK61tKaprqGlsKmzpqeorqaot6yxs7e6u7uyvL6+vsS/tcHAx8i3vr/Ft8XDwLu/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpTU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvCy767yba9w766yrfBw8K1try2sa+1vK2pq5NjbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tYV1lcX2VqZGJjYWRkaG5yQkZFRERGU0lelpyTkIqbnqWhoZ6kpKalrJ+cmqOlrLKwtransKunqrSrs7mwtbWttrmysLq6sbakoKSgprGorKm5qqWnp6ins62gp6efnKWmrJ+fp6ShobGtrayytbO0sLW8trvBwLK7vsPBsbm5wrPAvcC1uLy9vrzCx8TDxL/AxKCEeXFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7PDgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG6vbagnpWdoKa6tquzs7uzxM/Jy8LFuLfHwMy/uMq3u8W4s8W4s7/ArLa8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXlxbXFxYWVhYWFZYWl1eY2JgY2NjYmVlbWYzNUI9NUdDbpWaj42El5ydo5udnaKkoqadmqGanqqurLG0o6ipqauspLS4rLavrLK0rrO1r7Cqn56fpKKypaaquK2ipqafqK2rmZ+gn5mdn6WamaOcnJ6wqayoqqusrbCzua+4ubqwtry7uquzsrmzvbS3srG2tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU2MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnIuLi/t7LCtLG7u6y6urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhXV1dXV1hXWl1hYmNjYmJjZGVxUjE6NC84Ql5jjJaNh5WcnaWcmJujpaGjm56fmJitrK2usaCkoq2rp6G1sLGxrKivsqe6s6e2oaKfnKOhraOiqraqoqOmnqamo5aZnZeZmp2gmpednJ2craGsqKOkpq2rs7OqtbCyq7K5tK+qr7Kys7ezrqmtrrK4sLq2ur2/t7OxlIZ6dmZfZl9bWVZTWlVLW1FMSkVIS0lDPT9CQkBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/sp2lo5ilscO1tr2ttLjCzMjGwMW2wcDHzrfAw72zubmyv7axubutsrWvn5qjqqGUmo94f4OEf3hvcXRxaGZkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1VXYGJjYWFiYGBkZ3BQUT8sMSskOmullYmQmpmcmpOenqeinJ2mm5qZqqausKmboqK3qaGgrqi1qqanrbCkt7Ckt6CjnJmZqqahmq25sKOhpJyioKCTlaGUlpacmZiWl5yVn6meqqSinqOqqrGtqLSsqqets7Clq66zsa+wr6+nqKiyrrK0sLy0uriuo5SCendlX2FXWVhTUlRLTV5MUExHSE1MRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va2dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sLCxqpyaoamVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dWVVpiYmFgYV9fYGJocGhKMSIcJkpJf5aLjpWal5ySnJyko6GkpZ2bnqWeqq6ln6CitqehoaKos6Klp6WvpbGuq7WfoZ2WlamhopStsbGfo6Oenpick4yglJGTmJiSlpiYl56nm6eiopqkpaWrpKWwp6Wjq6ytpqmur6+rqKqqs6amq6+0sa68trGvr5+Se3hzZWJcW11YTkxRSFJhTVZQT0pOT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLi7vMHFurK5tcTJycDCxsXHtsbEs8G/xau3t722vbq7tbKsraiZmZ+ji4p0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlZSVFJUX19dXl9cXV5fYWppRzo0LzppfHCEi4yQnZWck5icop+po6KioaKhm6iqo5mdo7CpoaCdpKqeqKKerKyqqa6toqKilZiimpyQq6mwnJ+in5+XmZOKnZGNkpSWkJiYk5yho5yloaKWoKKkpZujq6WipKqkq62lrrKppqWnprWmqqits7W0ubqvqqyejHNxcGBbV1ZWUkdRT0haXE9SSlRLU0xFR0pDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDc7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuxrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvLG+w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWlsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVVZVVFVVUlNOUFlcW1tcXFxdXF9ia0s1QkJSfYZ3e4qLi5WVnZeXnaSlp6WppailoZekrKKUmKStqJ+bmJqfnq6ZnKqzn6Wmn6OjoZSUm5aWkqmprZucn6Ggm5SQjJmNjJGNko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuwpK64paOko6ytqqirr7S3sr21s6uumIV1dGlbWVlTVVJGWExRW1hNVU9QTFFSSU9KQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY4Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3rqior66bqaist7asvMq7tr+szMbFuMDOz8ezxLu3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWFlZWVxbWltdXmZjVVhsbXyBeoCCjYmRk5yblpunpaOrqaauo6aXnaqelJSjp6Wcl4+OmZ2tlpinqpifnZSloJ6SkZKRk5WoqqWamJmenpaOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpaepqKCwsKaxvaefo6y0qq6nr7SwubXAsa6wq5F+cnRjVlRVTlFKR1ZQUlJMTFhOS0xPU0dOS0FDRkVDPkI3NTg4OTs5Ojc6Ojc8PTo7Pz46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsbe4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucWpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUU1OTVJXWFlYWFdaW1tganBqcGV3fXiDfY2Cjo2RlpOZpJecp6SkqZyll56jmpGNnqGZlpaFhJGao4+VopyVlpWHopqbk4yOipCapaeblZWXnJGTiJSOi4GMjYCQi5KSkqGaoKKWlJmYlaKmmo2ZpKepp6GgtLKos7ihnaO2rKqupLKyprW7tKussaKKenNuXk5RUU1PRE5OTlBLRk5OSkpOTlFITUpBSExJSEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrCkp6SqpaCppqSzqqKyxLW1srPGxbe6w8rMxrOtur20uMCvrqmwnqauu6+toJqbnpWViHyEbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtLU1dXVldXV1daXWFnX2NecnhzfHSHfYeDjouOmZ2Llpmhn6GXpJSfmpSMhpiZi3ONgn2NlpaGkpqQk46Ne5mPnIyCiYCKmKCjnpCTmJaFjoKUfn50io56kIiTkJCdm5qakpaQno6jo46JmqChpKSborSvrLCtn5imuKalsKGxrpyxvKqpr6mZhHh0ZFZNUlBQTUNTTkxQTUJQUUhJTlNOSUpKRUtNR0tLPjg0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2Njo4N0E3eLeho7SopqWoo6WlpqamsqemtMG4r7SwycS4ucDOxr6zrLrBrK3EraiippKdpreto6CRlpeSkH54f2ZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KR05TU1NUVFNVWVpdaFxeW2x1bWlHUmuKfJCBh5eSh5CNnZablZWVko2ViH+TiV87V297i5OJgIySjI+GhnKLhJaBeYF7hpSdlYOWjpCPg4Z9k3hxcIaNfYmBkI6Ql5qZk4uQip2In5iHiJaemqGgl6euqa2pqZ6WrbOipa2ZrauYqLSjqa2jk390bmBbTlNSV0xEVEpQTUxGTk9JRUxRTUtQSklOUEdKSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKKtoaamqqCmqaejqrCop7TCubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qZh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSEZITlFRTE9SVFVYWWFjWlZocGVIOzp7kIyKeIKPiICGiZiLlZWJkYaEk4V4iH9gSlFud4qRg36EjIuEf39tfn+Td3V2eISNmnBRjYiKhnx+eZR2Z3eGiH6KiJWLjpGTl4yEioiVhJuNgoWSm5aenZSkoqippaSem7CqoaSkkaaqlqKqnKGmp4p3bmZeXEhRUVNNSVVNUklMS09JSEZKTk1NVUtRUlBHSkQ9NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4Ozc3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivrKq1vLa4t7PBu7anuci4tqiotbaqsrynnpWOf4mUqZaVi3+OhIN+eHFvWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZT1FTU1VaaGZcZG1cXVNNioCPgm95gXx4gYmQf5CZi496hI1+dH94cm51cHSOjoF6foqrhXp7aHZ7jnBybXiBi42SeHuAe4B3c3KSeGh1hYSEhXyVioiKjYuAf4SLjYCUhHyBj5iUnJaRn52pnqChnaCppZ+dmI2npJKgoJaen6SBc2liXV1KV1BSSEtYUk9KTUxSSkpKTFBJTFFNUlVNRklCPTc4Ozk5Pj06Ozw5OEA/Ojo+PDc9PTc5OTQ3Nzg1Njc1MjUxNDcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX93hnh8dnBvallLSElIR0VISFBUVFRXVlNVVVVVVldYV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxOUVFTVl5obWloWWuDj5SLjHZidHtydXuFjXqCmJJ/cIWNenZ6bmt+rXx0kIt/eoaSgHx/dGZ1fIZsb2hzfIqNh4BtenF9cW12j3FocYF+jnBEi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpubo5aZnZudnqGclo2LpZuOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlFPSU9QTEZEPTs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6epsK+xq7u4q7u+uLOsp5uwp6ybj5acpamloZiajoSSeYmPi4t2cXxtdXFqbWpYS0ZHRUFAQ0RITExNUVJPUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpZSk5PUVRYXWFnY158nKC9fG5yXnZzand0hY13eomEbmuKkHdzeGlqf4JxlpGMgX2Vf0mSmW5nd36CbWpkbHmFkJKGa3NsfG5yfIZpbXB/c42JhYZ7fn97d3B0dIaCeYF5cHyOjIqTg5aWmJqQk5aWmZadloyDiZ+Si5KNhpCXgHBqb29vWVZYVFJSWU9SVVRSWFVNT0hNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJufpKyvoq2qqLWvrqyzv6u8w7+mopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdW90bHFtZWtrWU5ERkNAPD4+QUZGR0tLS0xPUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SVlpRV1hXnX5bk2JscmB5a2l7doeFc3+Fg3Jrl49ycntpap2OTHmFk4mEjWYxdodya319g3RmZXV/hISFgGZpbHVrcIB8aHFxfG6TjY97dH59cXFvdW2Df3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtOUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaOlZmLjoV6hJCYlY2QjJCHcYeCdIeMhnpwc3FvcGRwZ19URklDPzw7OTo/QEFEQ0VHSUtPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVLQUlQSF+prZpqdHFneGhtfn2BfneBg4N3cJ6ScneAcnSThzVwnaidjaChhKKFdnCGe4Z8dIyujYmBaGdiam5ybXCDdWlvWHVwjpuRdm1/e31ucm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jnxzcnFtYFxdXlxaWWFfUk5bWlhXTEhJRklIP0NBQkg/Q0Q9Ozo3PTs6Ozs5Ojk5Ozk/PDg4PTo4OzY2NjUwMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KRgZKIlZGdpKeer5WltKmusK7BsrvBxZaPjJSPgIh8boGQkomDioePhnWChGyViIh8dXh4bXhud2RqXklQRz4/NzQ0ODs6Oz0+QEJFSExMTExOUFFTVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlJDSH5teHV0cHlocoOEeHqBgHyJe3Sfl3h9hYCEmYSanGGGqp6ci4OQjnp3iH6JiI50i5ePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1Z2hgW1xeU1xnXldRVFhbVUdKSkVMRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjU0MjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydnqWRoKugsaivwLK7xLqWjpGTh3qGdmt/i5GDfYqDjox4g4FzoISKfX2Bf3CBfnpod2tSWExARTIxMTM3NjY4ODo8PkFFRkZHSUtNT1FSU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJS01PUUtKVFtXUEhie4F0gnR2bXiLh3Z5hYR7k4R1npeGho2RlKWMrKlIhq2vroqBgJSLgouChJKpiIGYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGSGyAd3J5dmhta192fYKIf4eEi3mUnJuJi4iRf3p1inZ8eG1vd36BdXVzbVxeXlxjZFhnZVxVUFBXWVBETEtGT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc3ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeQjpWXkpagnaygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4l+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz85NC5dlnBzo1VGSUtMTU9XYFdsWFpbZISLfo17fnyAjI57goWNfpeSgJ6flpOamaWtkpm7saa6x8Oni4yhpY6TiYGRfHGDnp+RnX93hYWLkIeQaWhwhIF0jIeEinKGgneIgHt2hHxtdnVmf5SOhoiIhoeHoKqilomOl396gYh5eW9na3h+fIB1bGVeW1teal5iZ2BaT0xOV1JRSFBKRE5HQ0pEQ0BEQ0E8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3gnp/jH+BkY6KmpuknaGspqqusJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoSAgYyKgomNg3+Kf2xwal1CQDQtLS8vLi8wMjIzNDc3OTs9P0JESElOUVJUUlNTVFJQT0hFQjw4Ny85Qz48PDYzLmyTl01QSEpMS0pNVl9he2VkaW+TkoaTjI2GiYqVhI+MmoidnZCgqKOiqpOotaGnwcKtx694uZSafI2hnpmEk4WCjqGflJmRhYqFj5qRlmxwdYqMgpWMjY53j4RxbYWBipaRgoWIcoiglYaRiY2PlqS0qJuMlKKDh5KDfX9ramp8goODdWNfZWBbaGxebGxeV0tITlJQTkxMRklQQ0RORkJDRUZDPjo5Nj08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkZJ9ioSYkpCDgICLjImGkIeEiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw4NTI8P1I1SEhITEtNTlJea4Z5cH14lpSSoJ+clZySnpGZm6WbpaidpqqoqbSWq76rtcfItsjQz76boHBpq6mfhJOShZygmpuZppKRiJWjm5t4en6UmJOhk5eXgZSee3eVkqqyiIyWnnyTnZuNkZWYo6Glta+ckJinh5aPjYCIbHNzfYF+c2phXmJgYmhkYGhnXFJFSktPTklJTEZHTUNITEZGQ0JHRUI7ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNi46NfIqGj5COgYKAiYuKhZKFg4aJgYCHd15iUDQ2MC0yLywuMC8uLy4uMDAxNT5BQU1RUlNRUlNVUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lKTU5RWWuCjHSPhZmfoa23s6CpqKmkprGprrSvr6u5sLK9m7LDq7nJy7fDv7elorCzrK2qo4uWmISlpqCjl4GmmY2iqqiliIWUpKGhqqCkqI+csYuVo6a3upugoq+SopyhnY+ioauuq7K0oZSkqYiZiJKJlXl6foaBaWJpXWZjX2VkXmdnX1tPQ0lIU05GSEtGSkdGRkhBS0ZERkZCOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpblh6hHaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRjoOEgYuFhoiShoKFiYeIh4dxbmFARTY0PDMvMTEwLSwrLTAuLTQ/Q0FNVVBSU1VVVlVOW1BHSEQ8Pj5GSENEQTg7PDVDOz1GS0lGSFFOUFd/j5uBqJ6qo6q6wr+nsMK0qrG+sba7s72zwLW7uqK4xai1yMe1vbi0qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6or7a6srqssLWisayxtbu2tK20n6anoqaZqK+ssbi3uKaataiMpI6Qkp+GeIKFeFtjZVdnY2JkYWFnYFtUSkRETFRQSElJRElHRUFAQEtEQk1HPTg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmJXeXVxgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhIGOf4GJj4Z/hoiGioeQenhuXVdARU48Njo0NUFCNzY0Ly82Q0hCUVtPUVVXVVxXUF9VSUtLQT8+R0tGRUQ7PkA3RDc/QkpKRUZWU1BejKCqoK6uu6+yu8jFs7nDu7Kyv7W2wLO9r7Z0sLOlusSjr8a4sLOxs6ektbaqsaCil5uikqWwrqatq6ekmKGttLuiqLK6tby/zL/Fxb29s8G3ure+trq3uKursKSvqKy9r7y6wcGrmLmnlK2Ol5epiH6Dfm1YZGJZbGZrZlhcY1lWU0lHRkxQR0NISUFIRD4/QkJMQD9NRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1hVWnZqcH6Og4COhG56c3iHYrmhmaOJlJSWkpSTjY+XkoeHe4aBjZWKgISBinp8ioeGfIqCgYuDlX13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUVFZWFpnWVRgX0xTUEVBP0lKSEVFQUBEPEU2Qj5IR0pMU1pUXZGrs7G3s8S5trnHyrm6wLu2tLq5tbyzubHFYHSxpLGanqq9qaWoq6qjorK1oauon5WWn5mgrqWnpqWfpJSjp7G0qLKzvbbCvtPJydPGw8XMwsrDwL28vru7trSvuLa2wrnFvcLHr564qaGrjaSntYiBgXRhY2NfWGNgamdTWGBWUlVJRUVNSkE+R0Q9S0E9QkA9Rz47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSsvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWin6DgIJ4e4uDh3uLeYGKgpd+c316a2ZwdVleXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RUWVVKREJLS0lGSEhISEJJOkQ/SEtTVFVcWluStr21u7PCvLe2yMm4tbq1t7iytrOyrbW2mGR1p5ytcF6irJyYoKKbpJ6qpZSfn5CTjpaZmKifpqCempmDpJ6tpaqwrbiwvbnU0c/X0MrM0szPzcrGv77BybzAvMDAxMTEyb7HzbKjurC0rpqrt7uYgHxtX2JeWmBjWmRjUVtgU1BLQ0FFRkU8QEY/QUhCP0M9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFbWWhfb5aSkJRubG90dYe0rKGhn4uZnJmMjZWRmpKGiop+iIaLkIuIfIGDc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlmamppYGZpaWxabXOWraS8iIZnXG9nXVpaVEhLTlBKS1BLU1FJTEFKRkpPX15hZmlhl7XErrawubqzr8LFtK64sLC7q7Kwpaq3q4y1p52ap5pNmZ2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXmpWXh5+ap5usr6iwqLS01NTU1tPM0NPVzdLPzMTBydC9ycnKydHGzM3Cz9G3r8O8w7mktbnBooRxZV5fX1piWVpnWlFdWE9QQkJIRUJIO0BDPkFHPz9BNztDPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCZ3FveXmDoaqeppeMmpuXi42VkZqOfYmLhY2KiYqQh3yEgnB/h4GGe4dyg5KLjn1xeHVscXh+cXpteHNtaYBwbWNpbXB4aXd8fsu+wd+nbWN4bmNbYmBKUFJVTlleT11cTlBOVFBUVFxubXaCcZastquypa+0qau7v7CqtKakuKarrZ+rtKOOsK2al5iMj5KRhI6bgY2mkZyJg4uEiomEi4SUlZiXlJuRnJeZmp+fq6ylqKKsrc/S1dLOzNPU1NDU0c7Hw9TRxs3S09PXzNHRxNLWxcHOx8fCqL23zp58cWhgZV9YYlNfW1BRVFFPSD5ARkFCRTxAQT5EQz4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VVFNTlp1hoWKd2x3cH1+f6GenqGMjJiTk4uMko+VhXmFkJCNi4mIkIZ+gntxfoCAh3qEdYWTkIh/b3Zya3N9e3d7c4J4cmuAc3Jpb3F6eXF6vsuafYuxhHZyhHZoYWtdQ1paW1ZlY1hkalNYXF1gY11jd3p9i4GYqaOkoJ6gp6Wqr7iqpbOioa2ho62hprGeiKaak5KRiY+OiIGTiWqUooyZhIGGfpGDg5OXrYuVjZWZjoaSkZ6XqLCioaGlpKnJzc/IwszR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuNdXFlYmFaVlpUXFFLR0pKSkA7OjtEQUQ8QkM+R0I+QkI6PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO09MRkpYcIB1fWhzeHKCiYCdlZ2UhYuViY6JiI2Gjn94g5OYioyIiIuIfoJ4c3t9god3f3qGkZV/g253cG11f3V4fXSFfHlth3Z0bn12hHR4e521jDtBisWlfox8aWVXSUNmY2VjZ2pjbXdbXmZoa25oboCCh5GLnJ2gnJCXmJ6jo6Wxo6Syn6GlnaCon6Kxm4WekpGRj4qMioaDj4R/nJuMjYKEhXmUf4KplaOMkYmXkot+mIubkquzmJucqJynvsPGubbGztLR0tDM0svI1M7Q1drX19jU2djN2NvOydna0dW+ysu1enlwZ19bVFdSXFdGR0pJRUU9Ojc6QEBCOUdEP0RDQUNCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoSJgYd8eIWXloiOgoeFh3qEeXF6e4OFdXmFjo2ceYtwfG9ven9xe4Bxg4eBbo56dXd9fIJ0fnyGh69zWKnCto2RgnBtYj1eaHJwcXBueHaBZWhvcnV4cXqLho2TkZqVn5WHi5OboJqdqZ6gq5uhmpiepJ6fq5mKmouQkY2EfIeHg4WLjp+Zk4iDh35smXqEmIaIk4yNlIyGfJyJlJCuqpSWmJ+Zp6+2vamtvsfMycnMy9DJw9LK1NfY19jX1dvX09rb1dDa2tHWyNTLlnx+a2tdXFFVVGFJQ0ZJSD5BPj03Oj0/Oz1HPD9BQUFEQT4/Ojg3REI3NTU0NzkvNTU2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD5DR1JqXm1kYmZrdoCIcZGQmoB6gI1+goKBg36De3yEmI2Hi36Fh4B3gnlue3uGgXR5kp6OoHaOdYJzdYF9c4CEb4GQgm+ShHV8gYV6doZ7ibfFpMHJuIGWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSUjpeQgomOlpmWlaSbl56VnZKRlqKdmauVkJCJjJGCjISIiIGFj5Gdm5mJhYuBhZh6iImfl5CIjYqLgn2hiZGMvKGYk5iZnKmmpq6fqLa/wMG5yMrOzsXNydHW1dXZ1dfb1NbZ2tvX2trZ2M7bxoh9fGpsaGJWWVdXTkxFTkM7PT08ODo7PTk9QDY9Pz88Pj09OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47OTo3SVBdW1NVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyKjZJ3dnqKe36Afn98hHp+gpGJhIV5hId7dX10bXx9hn5zfpKekZ6DkXuGfniPfniKim6CmoB0mYZ+gYmEe36Qeo+pjo/Dob2LnKSdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkYSIipCSk42cmZKTj5WMi5SenJSglJCNjY+Lfo+NjYqDiJKWmp6eiIuUkZ2RgYt/pZiIhI2ChYSBpYaKjLiYnZGVlqKnoZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27h7fHtubGhaYl1UUE9JRExCPDw+OTk7Ojk5Ozw2Pz0+PD05OTs7MzdEQDgzNzg+NjA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OkRXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1DUVNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4d6fHuLhoJ9dIOFeXN6c22AfoR+d4WbopudlJJ/jIh/mIeAm5JuiKiFeqGLfJGNg4iEnH2akIqMo6KgkKSvn4uQi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5SLhoeLkpKLk5OTjouOiYeVmpyPlJaQipGThoCLiJGMiomclpiiooaSnZWgiomIjZuQg4eOf4OHhqSFjJGzmJ2SlJehop+akpyeqLK4raa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcoB3amlfYFpVWVlDQUlDPz4+OjQ4Ojs3Ojs6Mzs7Pz0+Nzs6OjE6Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjo4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnptYX6Sg29td4t4eX96gXyGfHt3hoR/c3CFgnp1d3Z0hIKEfn+SpqSfpaKXip2QlJeLiqiXc4qyjYSokoSZk4WZjKKVn5iSiJueo5KpsJ+QlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzciVjoaHiI+SjIyRk4iEiYiFlZmaj4+UkoaTloN/j4uZh42QqpeWoqKImJ6WmoiOhpeXiYSOjIF/h4+kiI6TqJqXk5eZoZmfmZSdm6OztKajvMK+x8bFycjJwsvTzc3UqdLR1tbW2NrU0trOhXWDa2dhYGBRS1ZcQkJHQztBPTgzNzs8Ojk9NjQ5Ojw6ODI/OTkyOkk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjnx8bX6IeHp+eoGBgn52doCCe2xui355fHd4fISGi36Lo7SopKuzoZanoKWklpWvooOQuJWSs5qNoaCMpJuvoqSdmJCnl6mZrbCkl5SVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinJeFiIiNlIuKko+GgIWGiJKYlIyKk5KGk5eGhJGQnHOQmLKVlqOhiJyZk4+KkIqWmoiKlo2GfYyYn4qQkJyamZOZmKCUoJ2Vn5uhsa2jpLi/tMTHxL3Dw7/GzsrJ0qfPzNPR0NbY0s/YvHV9eWBjV2NYUklLT0VCQ0Q1Pjs3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzUyNzc/QDY/Pzc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpJRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVxcWUpoYTtIhIt6em2Fhnl8hHiAhYF9cHh8fXxvcox6fYF7eIaLiYaEkqi8ramzvbClrrOzqaOisK2KmrWdo7mlla2kl6mtt6ako5+ZqZiqpK+xqpqZnJSVkZigl5q7u63KoWm2t6qwlZieoquSl72kXqmygomJjJSGkHyOjXyDhY2PlJSIh5KWi46VjYuMl5iRm5m0lpSqnYuclJGMkJKLmJqJkZ2Pi4qWn6KNlY2XmZ2TnJielKGglJydpq6ooqSzuKvCyMS2ur28xcjIwtChxsnNzcTX1tDK06NzfWxgXVZiVFFHRD48Q0FBOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBmSGFgYnBKQIuJf4Byhod8gYl1goqDfm19fHx+cHeHd42Bh3uNkIyGjJqrw8Cwvca8s7TBvLSsq7O2jKiyra69q5u7o6itubirpqaioqSjqq+ysaqdnKOYm5iYnqKmpZOjua+ov7ysrbK5paOnfYiGnK29sIKLi4qQg4+DkY55gYaQjI2bh4eNloyKlJaTkJmWm6easZmQqpyOmo+RjpWQj5WWjpCgkIiUm6OslZaPlJyelKCdm5ifoJWbn6enpKKksLOmwMbDsLC7tsXFw7/Np8fDx8O81dDMxMqKd3ZlX11iXk9MQ0xARUc/QT9CPDo0PkE9PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUpITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaEZfaWdbXVyTjIyIe4eLhoOMdYaQioFvfnuBfnF+gXqUepKUlJiRk5WotMfJwMLMwsO5x7y6r6u5u5eytrmywa6lwKSrsLy8qq6ro6Oep6yvtbGpm6CqnKKclp+wtKeMo7q6tcG7q6icsqSkqJSEjqnExKSCi46HiISGlZSMeYOMkI6RoIuLk5COh5efl5KYlJaloK6cjKmcjpaPkZCUlY2QlJGOoZOGl5+gsp+Um5SgoZmkn5qgm6CUmZ+npKanpK+tpb/Dwq6ot7XJw762zrLEvsO7s9HJyMG1eHxwX1tfbVROSURMTExKQEE9QkQ8NUFEOzozPThCMzMyMjYzQTE1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmo2WiouIko+GiXmGk5CBcoB7jH93h4KBj3mNoZaompuYur7JyMrC0snLws29wbOtvL+nur+9vMS4rMGprbO8vaqwqqSlo6yutK63taCfrp+mopmjtL2pnKi8waO2tq+rk7CsqqyWhpqqp6WRgoySpJWJgHWJkXmEjJGQnZ+RjpKKjouTopeWmpSToZ6pnpCkmYyPjo+Vloh8jpWSkaKalKCinLWmkKCXpaSjpZ+eppielZecpaOoqKKyrai7wMSvpbO3zMC6rsOzu73Bua3CwsG/mnF8ZFtaX15MTU5LR0VDSEFBQURLOjRESDo7NDw3Ri4xMjM1MkEyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxJX1hhWmRlWJ6PnY6Xjp6SiYp/iJ+ShHiFf5R+f5CIiZCAlqGaraekmMO+ycTIxtPNzs3LvMK3sLq9tL3Lu8TCtra8rbS/ubyur6ihqai2rq6psreanqyiqKKdq7e3qqWvvsSxvbmzp6q0s62tlpWlraigkY6SscWnlY58kZV8hpCYj6mYl5KSjpKUkqSckpyYk6ChoZuYnpeKi46OnYhaj5aXkpakmWaZo56zpZailqytrKecn6aXmJaYlaGjqKaftaupurvDtKa0tcvBuKq2rLO7uK6ouLq8t4RwcV1bVldQR0tUTks/QUdEREhGRjg1Rk07Pjc+QUsuMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmZkTUamlJyWoZeoloyQg4elkoiBh4Kbg4OVkJCTjpqin6++rqHHvsbFyMfOzs/Syr67trG7u7y/z7bEvre5t7OytbO4s6ynnKusuaupqLCwmKOupaikpbXBsKuttL7DucC5s6e4tLeyr5WkrbCvpYuTlKCNc8GZfZaZhI6WmYuwlZmZlJGRmZikopSempWZqJyaoZ+YiYuOlJxfSpacmpSZpJdUlrCfr5yfpZWvr62mm6GmlJOZmI6dn6ahmbSpqrO8vLursLLHwLimrKutsbGjobKytKVzcmhfXVFSTEZRUVBRO0hKSEZHQUM9OUtUP0E6PUVNLzc1MzQ6QjQ0TldOPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs1RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3RiVkZIq5eZn6GorpiQl4eKp5aNiJKFn4eEnZeOnaCao6S1ybWpx7zExMnLycjMzse+urOvurjAwc21yLvBuba6sq+vs7SnpJyrtLWrqqaurJqkraalqay6v6irt7e+wcC+t7Kyw7C3vayjrrWtuqaIm5elm3W+n4SZnY6SmJqLrpagm5qWlJqen6idpp+ZmamZoKadlo+MkJyCbXWSopqVnKKfkK6yoquVqaqYqq+mpaGlqpKSmZyJlZyinpawp6mqure+s7Kuvrm2oKOnqKWmnJytqamNZmljYlRNTUdJT0pVTD1MRE1JSkBDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0M6OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FNVkh+ZV5IRqyUnKGfu66YlJ6Lk6qbkZGTiKqNh6KejKOtlKOktse9tMG7wsLIycXCzsjCvbmyr7m1wMPKtsaywby1u6ypra2xo6OZqrW7pqqnrKqdqK+opKuqvruorb20t77HvLa1uMCwvb+zqbW3rL+lj6KXkKGfvJ6JmqCYlp2djraeqJulopqboJmnpLGgmp2lnKepnJeTjpObipaJjKShlJyin6C1sKWmlLGrmqutn5+lpKqSlpWghJCen5yWqaWhobO0u7atqLWysp6co6Wal5WZqqGeeGRfYWBMSUZITlFJTkVGRkJRSkhAREdBVlNESDxBR1ExO0I3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Sol6Sen8Osm5ekl5mom5Wamo6qlpWoppWtrJmiq7fFwry/uMHCwMjEv83Gu765srC5tL7DyLbAsLy2urenpKusraGhm6urxKKlqKymnquvraKqqL64pq2+sLe3x7e0uLi+sb7AtrSyta++o5ajlZKak62fkKGhpKKinpC+pKidqKucnKCapZ+8opejnqGoqqCclY2VnpOeh46EjZOepKCdtqymnZezp5qwqKCcq5+ijZqVn4SOoZqckqWlmpersbayqqWqraycmKCgko+QlqmflGlmXGJeUEpIS09MSEVESUA9T0hAO0ZJSFtSUEs9SE5VNEJGOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0tME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hOopujm57Fq6Ceq52crZ+Rop6WpJ+mqquXtrGjqrO2xcO9wLa/wbzJwr/KyLa4tbSxtLS3wsa3v7G5tbq2oKesq6yen6ClpMGloaquoKSprbCipqi9taWxvLe2tsOysre6vrLDwLi4rbS0taOdpJSRk6Csn5ihnaioqqKawqyonautmpqdmKWfvaGcpJerq6uloJmNmqCSnoiOWH+Wn6ahoLmqp5SZt6Ofs6KhnLCYoY+alZ6Cj6CXlo6io5WQpa6yrKmioqWklZWcmIuPkpOkn4ljZ1xlYU1KS0tPRkVBR0s+PUlBOTlKSk5dUVFJPUxWXTlGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMUJ6goJiew6ekorOgm7Gnkqqjn6Oeramsnbuxqay1scjEwcOzwsO9x8S9xMq9sLG2rrG1sMDFtbqxsbq2rZqpsKqqm5+moafCrZytsZypoq6xqqSovbemtbu9r7fErbOzwr+yxrO6t6u0tq2qoqaVlZOiq6Gfn5mnqq6ur7uxpZ+pqZmYl5Kio7egoaORrq6rpKWekaGelJ2OkI2UnZqjn6i1p6eNmbWco6+boJywkaGVmJWbgJKilo+OoKGTi6assKWnop2gnpKSmpOFi5KNnJ+AZGhdaGZLSkxLU0FDQElHOztGPjg5Tk1VX1JTSj5PXl49SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZ3JAODxIlndlQTSfpJ6aoMKno6mxoKO0qZWxq6aipLKsram7sq2wtbTHv8TDtb/EvsrFtsDJwrWstamwuazAxLS4r622uqWZq7Ksq5ihp5itu7ScqLCbrJ+utLKnqrqyprizuLK5waq3ssO9tMWnvq6tt7Wpp6yhlpaRpaOhoZeXpK63rbG0tp+eqKSZk5STo6C2oqSlla2xsaWopKGdmZmalZiooJ+Zop6vs6KmjZivmqWsmJufp5OekJWZmoaWoJWMkJ2ek4upqauhp6GanpaNj5mQgoaViZWfemVrXmxrTlFOTlQ9Q0FOQzs6ST83N1FOXV9SVlFCV2BdQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFqVkNXRox5ZkM7pKScoKW/pqiurqCptaqdt6+ro6q0trCwuLewt7i4xb3Dx728w8LIwbrBxsG6qralrbutwcO4uKqtsryjla2wrrOXpqiRqrmqoaewnaqgr7Szqqq2tay6q7OyuresuLDBur2/psOqsLauqaurpp2YmKqgoaCRl6CwrrOqsLiZm6mfmZaRl6agtqiloqKvsLOrsaern5qfn5uepZ2hmJ2jtLCcn5GUppqhqZyWpKKYmoyWmZSWl52UiZGbmZSOqamnn6OcmZuTh4+Zi36Nl4aPmmxpbmJublhRUVpUQUNEVUA7O0hANzpYUGReUVdXRVlfXk5MU09fTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhtfWhcVjqJe2NDPaifnKGpvKCqr6qisLeppbSyq6Gttb2vs7i8u723t8HCv8nDucTDwcC5xb3BuK+2qKu3sry/v7Sqr7K4n5erramumKmpjqe7n6Wts5+rorGws6yqtbO1u6yvsbWssLWywLrFtqu8r7G3rK2qo7GlnqWonqOWj5ifsqmyqamymZ2nm5qUjJ+mpLSup6KsrK2wp7Krsamim56opJ6VoZmcqLapmJqSkp+Zn6Ggkq6hm5qIl5mMnZqdlIuPl5eal6amo6Cel5aWlICQlYR7j5ODjJdnbXJocXNgR1lmVkRDTVhEWjlIQjY+XVFoXE9aXUdbXl5PTVNYZEpLQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVjE1MT1gVl84KUMzWVVcZ0s1jHpmTEClmZ+kq7ajrKikrq21qa+zuaansLfGt7G3v8HCtrW6xb7MxbnDwbrAusW4wbqztKyquri7ur61q6+xt5iYqKurrJyuq4+rvZ2rrrGjqp+xrbOurrWxubeqra+yqLavs7q8ybOqtbWxtLCvp6Gzn5qorKCllZaambGiraClr5aipJmZkoyipaeyqaGmsauptKWur7Ouo5meraebl56amay4opiTkY+YnKGZmJWuoZ+WgpWZjp6dmpeRipSTnpqlo6OgmZeTkpZ7jJGFe42Lg4uTbG55b3Z9YkZgalpJSFpbPXtKR0U2QWNUaVtNXGFLXFxaUlJSYmFMS0VgYWFRTUlQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NYVExFmpafsKixqayko66ttai3s7ejrLS3ybu1u7vAvrW0t8PAzMe8w723v7/BuMC9sr2uqLq5uLfCt6yusbqWl6eurKiksqmUr7ukrLKypqejsrSxsrG1sLezqa6ssqe4r7WzxMW2qbW1q7Cuqqejtp+fprCgo5SbmZSwnqebn6mNqaKdm5WXpaWkt6eisLOrp7Cnra+0rKSYoayonJydnJSquZyVj4+MmJ2imJGZqKShmIWUl5GdnJiXl4mXkJebqJ2loZKWkpCWd4SRhnyGgoSNjW5xeHZ8gF1MZWxcS09kXT9ie0dJOEdoV2VbTV5iTVlZV1VYVWpdT1BIYV5fUEtHUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhnMjcnRmFMViUtQi49RUxRPDNyakxFRJGZpK2krK2qpqKwsbKqt7C1n6u1ucm5rsG8w7izsrXCw87EwMK+tb7AwLu/vbTEqaq5sba3wLyvrLS0nqGnsa6lprGlnrK1rKqysKuoqLW6rLWytau0raqrqaypua2ysMe/uKW5sKmtraaorbGlpKOuo6icnZuar5mioqKjkKyfo6Cfoammpbikq7S0pKqrqayuta6inKOoq5ygmZuSpLWaj4mOiJGjoZaPlp+jl5WGkJWUnpuZl5WImJOVmaecoKCNk5KOkXh+j4V9fH2HiopydHN/fn5dU2NuXk5aZ11GRJZbRzpNblhhW05hYk5WVlZXVVloXlFTTWNaW1RLRk9UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZDs2KkhkSEorOkk/M0NJUyw+j2tASEmQmqipoamwpKejs7OwtLWwsKCrrb3Mu67CvceytK60wsPRxMW/wrO+wsO8v7i9xaitt6y0uLzAsayyraKkp66qqKWxo6qxqq6qsa6urKuzu6e3sLKpsqqrpqWkrrqsqrDCubSsuampqK2pp7GlqaSirqmoop6coqyVpZ2YnpmsnaGnqKGspqOtrLawsaCpoqCqrbCsnZ6np6mao5iZkKComIaEj4uLn6GQjY+YnpKSiIiSlqGdlpmWh5eTk5elnZ6djJKQjop/f4iFfHd/h4WHdXRyiXdsX1lfbmJRc3FcSzuEfEY+V3VXYVlPY1xOVVZVV1FcYl9TT09oWFhXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0zOTg7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5KZ0RGODxCMDVFS1gxQJRdQE5GlZasp6CpsZynqLC1rLi1raqkqqq9ybyxv7nDr7Cts8TDzc7Dv8CzwMPEusG0ycSsr7eus7rAvrSurqynqaqxqaapsaa0raqvra2xrrKttLult7OsrK6oq6CjnrG3q6qtubaktbWkqqesrKqtoKimp7GxpKeloaGslqqhk5ugpp6joqqjrKKeprG2rKyipaKaqaquqZyhpaSkmaCZlo+YnZOBgpCJhZ2gjYuQjpyRk42Fjpmlm5OSm4yTkpGUo5qcmouPi4x8hoKCgXp1gYOBfnV3i6KHeGpeX25mV2WHZE5AZ5JMRWJ6V2JYUmZVTVZWVVRPXF1hVkxPalhWVkhKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESHQklJRJaQrqShqq+YqKittaq1saqlq6qpvcDAuLq0vLWms6/EycvSv8G7uL+/w7rCusHErrG1srS8wb6zsa+trK2nt6qlrbCruK6nsK+usau1qra1p7S3q6ykqqqcpJ60s6iopLO0n7Wtoaqoq6irp5+rq6i5tqmqqqqiqZ+tm5GqoZ2gpKKmoqqenKa0rqelqaKjmKSmp6qcoqSjoJmYn5GOj5mNf4eMh4SenomGjIyRkZOPhYiWo5qOjpuSkpCPkp+YmZeNi4SAdIeCf354dYN/e3h+f4idj3BxZmZwd1xhdIhqT12YVkhteVVkVlNkUE1VVVVRT1hbYlZJUWpVV1RHT1hVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMjM7OjcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMkBmPU5YP0MsP0xUXy9JazdSRjuVjK+gpKqsmamjra6ytK+qpK+pqLu/vMGysLmtoravyMfH0MC/vbq8w767xMLAv66ys7O2vbzBsbK0q7SppbWppa2zsriuoay0sa+xuau5rqqut6uqnqqroKOhta2ooZ+vsqG0qp+op6qiqqGhrK2ova6rrq2hp6ifrJmPsKKYoqCop56nm5mpsKmin6yioZKhoqKnmZmpppiYmZ2Pi4eViH2OhoSFpJeGg4SNh5CQkoWGlqGXiJGdkZOQjZGdlZiPi4aGeHSBf310eHqAe3V0e2uCh6R2aV5la4B1Z4iLfFJWcF9LeHNUZFNRX01NU1pmTk1XWWVZR1NqUlI+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUMzj42xoKSlqqOkoqyms7KxqKSwp6q4v8G9sam6qqetsMnGx9DDvsC9ub/Avcm8wrixsLWyury5wLO1vKy5rKO0pqarsbW3saWmubSttLyvvKWtrbarrZypr6SfpKyqqJydqrKks6iaq6eppKidoqmnqb2rtLCunamkoK+cmrOilqSbpaSfpZqaqKqlnpqpoZuRm6CknZmWqaqRmZqTkIuCj4V+kIOAiJ+Ph4F/jYiSkJCFgpWblIaToY2UkYuRm5OWh4p/gHJ6eX17Z3Z8e3Vxcn5qhnmFiGRfZ2NyhXttZ3ldXlZCV3ttVGJQUllLTE5wdF1JWltoWUZWZ09DPktPRENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6RsJifn6mkoqGrpLaysaSpsKatucK9t7GkuaypqLDCyMjMwre9v7W4wbrItsO1tLO1sr25ur22rrm2v6yis6aqqq60trOom7m7qLG+srqgrrS2qaufrbGjnKWoqaOdm6Wwpq+gn6qpp6Gpm6OooK28p66xrqGqoqSunp6tppifmqGim5+bmaOqopqZo6OVlpSgoZablqasjJ+Sj5GMgoqAgI+Be5qVjYp9gIyHkZCNioWTmJGGk6OKkpGHkJmQlIGIfXpsfXZ4eGJ6enJwcXR4aoJ1a4JnY2dhbnOObWJqb19wQV15a1ZeTlFRS0lNU1lWTVxebFdFWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPiORlqyYn5eno6Gfp6O3r62ir6+orLjDu7SuoLmvq6ezusfKx7+4wr2vtL+3xLbDsrC6sbLAtru9t6q5uL6qpLSmqKmvrbivp5e4vKOtvrS0oa24taemqLCzoJ6lpaegpZmerKeonqCqr6egppeiqJ+wuJ+jsa+hq6GspJynp6iam5ufopWcnJqdqaaWm56okZiSmZ2TmZahqpGbio6Qh32HfoKOfHyhjY2JeoSNhYuOjYWJk5qOiJSfiZCVgoyXjZF8hXx0cHxxc3NfeHhqb3FxcGuAc2R6bGdlY2Fmh4BgW3Jqck1OgGlYWk1RTEtIUFJQR01bX29URVlaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrJ+eoaOgtquwo7Szqam6xbezrqG4ra2rr7XFx8C3v8K5sLW9t7+7vrCsvrCzv7K8wriqu7q4p6e0p6eqr6uyr6SXu7Wkq7q1r56xua+ppaevspyhpKCko6CWm6+loZ6iqK+hoKGSo6SitrChprGrn6yjrpidqqWon5ianaOTmpuanaWqmpubpZWUl5WcjpOXoqmikYqLkIZ6hH6Ei3qPl4qNh3uDiISJjY+Fj5OYjI6VmYuPln6Gl4yPeoF7cHJ2bm9zXnh3ZWxsbGtqhW5mcmlqZWhdZHOBYFtrdmlaSn9eW1hPT0tISFJVRzM5XV5sUEVZVVllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERUXWhELjwyZFcsMpShoZaUm6qco6GiobapraC7t6WsvsW0sK+jta+srK60w8O8s7+6t7Gzubi6uLqvrsCzs7ivv8C3rb26taWisqmnqbGpq7Cfmb+0pKe0taiesrypqKWpr6yZoqecpKWUl6CxpJmepKmpnKKfkqSgpLippKeupp6loaiToKmioaGZm52fkZmblp+hqpuamKCUkZSXmo6Tk6SopJCJio+GeoR7hIZ9nY2Ki4d7goWHiIqShZaSkouQlZSOjZR7g5iPi3d+fGx0cmxrc2F3dWhoamhncIZoaGlkZmlpYGpjamhbZntjYFN0VFxbUkxKRklPU0AhKmheaUxEV1VeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKeoqSRjqSnmZyenaO0rKequranrMPBuLGso7aup62ut8C/vLLCtrCusra2uba2raq9s66ysby/t6+7u7Gln7WppaSzpqitnJzAqqelr7OqrLW7nqmqq7GlmJ6qnaakkZilrKGYnaSpoZuhm5afnae1prCqrqGhnZ6hlaCmoKKgmpuZm5KYnZOlnayhl5adlJONlZeLj5ibqaCSiYqLiXmFd4GCgZ2Hi4OJfoCFiIeGkYSXlI+Oj5GRkYyTe4OVj4Zzfn5meW9qamtmdHNrY2dkZHaBY2VmZmVqaWNrcltfWV1sZGFOaVhaYFZKR0hLTVJYPjlfbGhIQ1VUXVtJSUdGQS48PzlBODlSR0A3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsrLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOgj4ysoZaWoJaks7Gisr22obHFvLuysaO3rKqtqbi8u7qtwLGurq62r7O4s6mrubGvrrO2uravuL2spp60qZ+fr6KorZuhv5+wo66xr7eutZ6tr62topmdp6mln5Wap6WfmKSiqJ2an5qTnJ6sr6a6qK6ioZqbnpmepJqknZeemJuUmJ+SqJWqp5qTmpqSjJWZjZSUm6qnjo6Kio97gnOBgYqYhYd8iYqGhoqMiZKFlZuTko6PkZeOkH+AjY6Db4F/ZnltZ2tpZnBya1xnY2N0gWJmZ2pubGdqamhuXWxscnBgVGNpY2ZZSUZMTU9YUlFVYWWAVUFXU1lUR0lGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QTEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMmNJGhm42Or52Yk6GaqbGvn7m/taC0wru+urGmt6+nraS3uLe3rLuurKqrt6qzt66msrWyrqmwtraws7W6pqmftaecnaigp6uap72XrKSusLa1rK2fsa2wqaKbnKOrqJuUm6ajnZqpoqSWmp+bkJukqquqvJ+npKCYmpmdoY9ropaZnHCClZqjf3WRqaeelJSekIiYmoCWiqKQeYeUjYNtaX93g3FshouGfYWMh3FeY2FnhJiFa4qNlJJ0d4uEfoOQgGeHgGd1aGVXXGhzbk1QaWNnc4VoX2Vmbm1qXWBhio+DhGVOS0Q5R1RoXkpHUFBVVUxIU2FwdGVGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCwwOD1HNzAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6LpJmGlbCbmpOgm6qtqqO9xa+pt8K3vb2tprewpaqit7OysrC5rKmmrLSmr7Siqbe2tqinrLayrrSts6Gpn7KpnaGjmaSlmKu5k6Wlr7O3ra6lqa6rrKWhnpyhp6ablqClpJubp6adk56el4+dp6mktrCko6KdlpiXl6OIoY6Smoahh5OcoH+lf6WqnpKSmpGIhHN4jY6FiKF2io1pl4hmfnN4oG+Ih4R+j31/oaCgmYB9h55zho51m4psh4GDbWllY3pscmFThW1ibGmYcVhpcXCIWV5pW2xsW4hybnpyhWaGhFpfR04/R19NRVJWVlFRUldVZ11NVkhSUk9GSEc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oiqeXg5yrnZiYnZ+qqaeqv8Ovsbq8tsC/qqW3sKispbK0rq6ytamopbCtpbSym621trWmp6iysKyyp62dqaCwp5+jopifoZqss5OjpaW2vaatp6uqrKiloaCYoKajmZiloqOYnKSolpOim5OSo6WmobekpKCjmJWTl5OciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGcxnl4saW3l2WAwJy/eYSFepKEfJCQkcpyl7ucxXpytae6kHuAbZaxq7B5aGxYsa5uZWm8krxuZ3pvco/YflNrY7ayfoFylHOaoaqQV09XYk9WTkZVW1hRUVONXVdbUUFcRFFORUhJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+OkI8P0E4Oko+NTIqMjJCRS8uMzIuKy8oLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYynk4Gnqp+XnJ6lrLKpsMK9srXAtba+wauntKysqKaus6mvtbKmp6W0pae4rZyzsrarpaSnsa2ssKaqnaajr6Kgn52VmZ6crauTnaKfs7qjqqmira6loZyamqKnn5eap5+el56mp5GcppmTnaGmoqGxo5+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHGuoaR+eLt9bKGQdrFfarRbpYBlnJFgZ4N7Z39qeGupZb5xZ6aLdbFqe7F4dJKUY25tp25bhKFFaGaHlkV1nGB+Z3ykp4JaYIyraICVeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TopPV1cvSVRTSkRGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTAzLjMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWDraelnqOkqrG3rLW9v7C2xLK3usGmqbCqrqiosK6jsLmuo6StsqOpuKees7Owo6Wgqayvq6+mp56joa+aoZuWlJaamquklZqhn7Szoquco62toJ6ZlqCiqJyYnaOfm5mhpqSPnKKZl6Cfqp6mpqCaoKGWlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR+a4Kme4KGiJOUk3erZ2uxXKt6jYaUdIlyj4eAf4iQl3iCgYuXi4Ogj4SwdnefcWxsbHyLTqRYSGJimX5jaKZgeXJ1U5OHXlGpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6ye1hYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozk5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPTxTfW4zK1hqXE9YTV9nVzdKOGFVNTAblKCViLOmpqGvqaeyrKm7tsKwu8GtuLe/qaytra2lrLGpoK67qqCns6yjq7SjprKyp6Oinqeqsaewp6Wdnp6ulZ6ZlJSUl52soZmZpKi1r6Kqj6qoqpudlZegpaeZnp2jn5ufo6WjlZuel5mcoqmbppqcm6Kgl5ORkpOdg9WTmblwsMF+xYZ81pSbu3yalaWPjZ2NpHuOiKSDpYJ6rHmPnVaveoh+n2q5Wrl2hoR+poKUe5d6qniNnY96sW6OhHSRvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhYCJfGOkM0Kddl1QamljUEBYZ1pkYUpITXFQXFFPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjtESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUDcxJZuilJiyqKimtKqltKmkvLfBsLm/sbW0urK0p7Cvoq+ypZ+ttaiap7itoq+wn7O0sKCknp+mqbCotKijmpydqpWYl5WVk5WgqZyZlqetsKmjn4+to6iWnZaboaWfl6GhoqGaoaKnm56gnpSYmqagm6eVm5ufoZiQkpSQnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaJ/kaGmf7F2g5HS0nZcrnuFf6Rvm6qma4eFfa19mJmOe7Fxkp6OeLNll3SEnm+eZ5RRyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBT2tgbGhQVkdKOT1VUlpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YUw2MjCinZKlsa2jq7ytprSmp7a7vLK6vra2tLm4sqS0sqCwsaKeq6+jl6a4raSxsJy0t6mgpZ6hqaSxp6ypo5mamaedlZOXl5CRoaaflZOlqrCmopaTraCmkpSgm6SlnpSapaehmqOfrZmgnp6QlZuhnZyllZ2VmqKflZiVkZqFrHt3qHajjYiGqW+tioKng5iYoYmSmouif5Oaia6Ff4KzXHKzUq59goKkf3HXfXiFfo+dhpqZdq+Gh5Gch3e0YZplmoKClW2SWrBYS5p1mHlmYK1edneIaJiIbF2vd5Wej3hsNXnIrrJfQlRvXmdgRVBsYHBtVlZNLmZlaVNZUDtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BIOjk5oJ6VoLmwl7TCraizqKmyurezt765t7G0urSkt7Kes6yfn6irnpSntauor7GqrbOjm6mgn6ehtaamqaKYnZSkoJOSm5eRlKGkmpKQpq2vpqGVmaqgo4+RoZinpKCUmqWonZyknq2doZyfjJOemp2gl5mblpeioJSXj6adhql9faV4oY6NgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02H92iHSogY6bjJKke5SPn4R7sl6dZKB+g5Vtkl2rW1qTgJF/aGeqZHJ7gWuYh3Neq1qJoI5rb2VPSkOhXFtMdF1iZ05bYV9yc19LVzdKm5ZYSEU9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA1Ljo+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKKemprBq5e0wq6rramltLC3sLW+ubmxsLS5qLqzn6+knaSmpp6TqbCpr6m0q6muoZigoKako7mioquglpuRoZ+Uk56Zk5een5CMjKiwsKeel5uopqCMkqSWpqqnlJipp52eoKKtpKGeoIyUoZifn5Gdl5yVnqGVlo2qnI+ubXK0c6mLdYqnc7R4c7OAkaSjkpyOiaSHkHe4cI17i6Jqa7ZaoYVll5dpoaKnbZRytHSTmX6yaoWRh61qdbNhnWaib4eTa5ddrWBNoXyHkVJzo2x5f35vmIdyXa9WPJx3ZlRvbi5cp09jU2tlYm1aY11hcHtjVFtSPj1ucDNDQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimnJuevKGbssCurausp7ept6+1v7S7r662tarAtaipoZulo6Gckampp7WisqetqaCXnKefpKu4naKsmpWZjqOilYydoJuYnJ+Rk5SqtrComZWcrKmXjJSll6OsopGWq7Gjn56mq7GZoaKPmKKWn5uVnJahk52pnJSPqpmH1JKau3Oww4DDhn3Vlpu4eIiQmIyXi4yniHqktnV+d3bCgpqyYIO6ecB8dbhjtYGMh6l9lYGrqXF7f3S8iKegaZ1hpo6voX6MdYeqfb5vc7x0soN1eIGKbpqIcm6NpHS9Xnd9WmF5vGtaVlxqeV5qYWVnY214b1lcWkNAQHNAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I9RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueor2hl7LDsK2qq6yxp7evtsOwuLCtua6twLCro6Keo6Gcm5Coo6qypLSlrKSelZqqmKasuJyirZeUn4+kn5KMnKKdl52akZaSr7myrJaYpKinlJCWpJujrZ6RoKirn5qfqKO0n6KkjqeilKKanJeVo5iQr5+SlKmehJCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0n8G7vZp7gbGocYBzkbmDfYeGjIeNfIqHjZh8pLu5vZx0ebSjdHeXdnSwdZmeZodqjbV0cnF3toxef3p9iWiDeW56Y4uscHWFf1hbp2pFZVpUZmBjXmNRZ2dwbHVDTlFNRDpaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJTWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc5Kk9eXT0rOlZVJz47PKeeoaLApZa1w7Ssq6isq6m6rrDFrbOyrbams7erqaGhpZ6gnZmTqqOsqaW1p6efm5Wgo52rpL2moamWk5uQoZuRj6GnoZKcl5SYlLG1t62ZnqSkoouSkqabpaqblamlpZuZoailp6SqoJGtnpeknpeXl52ej6+ok5uloY1qfWmbpXeGcn2ajnR5ZId7vb7Aum+Tg3KWiGFza1pem4lgY4iPlWtggJZkbp53Y5ZsgJqVlGVeYGJwmYhpcot9hpVna39ydHh9f2Jbd3SBaFBcbYN9e4trWGt6gnNKSm+GcE50TEVYXWdhTFtXZ2NfT1ttdGlxUlFERU07R0k9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU19WNClQX0woMz5bTyc/Mj6poKiiwqObtbq2o6ylrqentbGsyKuvsqqzor2wsaWfoqedo5uZmaumrqOktKilm5eUoJqlrai9p6iklJOblZ+ZkpekqaiQnpGQmJywsr+snKeep6KJk5GpmqijmpqroKOZmqOnrKOgq6KasZuUp6CWlJ2fnZawpJegp5ibkJycoaGXpKGZnJmZmY+VgWdtfXF3kpiUkoaMtquNhpiVjoqMmJaHlJWLhJOUkomOk5SYlJiWmZ+hmZqToJyNgnqlhW1rfZB9gHWKioFxgnh5dnWJf3yKanOBdIN1ZXd9d2tvem1fZF1waE1ZWmZqYFdab3htbWZVUEZTOU9aTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEosPC1As6GzosChpLKytqCppbKnpbC0qsiqrK+ltKXAp7OgnaSknKOVlZ+qpqyio7arn5iWlZ+XramlwJ6ro5SRm5edl5KUoZ6eoqeTkpmop7LEsJurnaufkJaWqJ2qnJyfrJihm5yipK+noqWnn66Yl6edmZmgnp2cr6CcoaWUlpGXk56flKGdl6COlpOKio2Ol66QfJacg5KCi6uphYCZl4mEkJ6IeoSQiIaakoiHipaPm5eNkJedo5WYkpCcjX+OZ6Gzr4WKhXZ7kop9d3l6b2Z5j4GAiWp1gXmIc2lzf3t2g4eCanVkemZgamVjZGZrWWx7b2lrXVNMUEReVEZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYmNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXFEwNU5bMTdFNFtHNTwsQLSgubC/rKyvsrGgqqayraKss6/Er6mqorGtu6Kzm5+moqGcmJenpamlpKWytZ6Uk52Zma+lrb6gq6KQkZ2ZmZSRlaGcl6ichJ+rrKO0yLSgqqSrl5aXmqadqZufpKuUnp+doKqvqaWjq6Kvm5+goJiknpyenK6jmJ6nkpaVm5Gjl5annJqWZYKSfGV+jZqQY3mObWhre5Klq2plm5h9Z4aKZWVpaHuOoo9saI2YkaN3a2qKmKKel3NrbXqEjoh6WGZehoNebYyKgXZcaHN3dpGAiIJtd4F4f3NteYR0domIj4N8aodZXmx0ZF5ziWlrfHBrZF9STlhJZFhBSjQ+Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2moLq9uq+stLGqpaitrrCmra2wvLCopqOtrrCeq5afo52hmZmmqpyto6WnqbKtnpSjj6Kvpba5pa6ijo6aoZmTkpqgmZmllXymrqOotMS4paKnr5+dlZ6inqOco6mokp+hnaGqsKurpKqgqpunn6egrJagm6Wvo5abqZSfm5mRo5WcqZedfb2DiHK0coSdhq1oeLnEuHGUo6N6ppmZcquCfMvAwLtxjKOIg558l5mJncC9gZadnYycwcF8gnyTjZrDwH1spbJvjIFvynp/m3aQg46BdXmAgHlxen+HcHeFjJN5bXiUY2dgeGRgZYJiXnNnbGRkWUxWSVFaSE9EMklFP0RCPi88Pz5AQTo4Q0NCQ0VISUtNTlBTVlleX19hX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVkFCOy84lqO5w7WwsMCpqJSjr6iwrq2msrOuqaSlpq+qnquYmqKfnJqqpqGcq6KkqKOktKScopKlrau3s6euopGQmZylkpGfoZiboJ2Ip62lq67AwLGhqa+plpKfnaKZoqSqo5Ogop2era+qraejo6ihpaWdrKiRo5qorKmanKebqp+UlqOUn6GVm3/OlHh6pIF5lZabX66PXo6ogqOhfKeWm3Org4CvXmONqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3V9l4i3YYOtWqPNbpB2e9p7f5lwfYeSdn1leod2dmt8h259hpGRfm2DkGBybXBoYGB6ZFxxZ2lkZ2BSVFNXXUtPRDVBSEREOD42O0A/QTs9N0A+Pj9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qnrbOrprKrq6qiq6auqp+mm5mll5yir5+gnqinoqWgn7Crmp2Vpq6ssKqoq5+UkZqfpJKPnqSXnqejn66mrLGov8ezqKmxrpaSnZyhl5+pqp+VoZ+dna6wqayqnKiopaKrkqyylqShqqmdoqWkn66fkZill56Zk5ORl6BxhYyXdYWohnGxfZ5yrH+in4Glj552q4J9rX+cc61/rIeGn3aZknt8l36qh6KMkoydfqt7iZSQn4B7rVedxXuPcJPBfYGVbXVvjG1ldmSFbmF3bnJviYqSj4NukpFmcHV1cWFnbWVfb2lpb2dkWFRdYVpSU0M5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5cW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCg+MSkzV0BGIRxHOkMxLiuw08bGsrSgnaOOo6KirK+2rqixpaippq2rq6aho52ZopWfpaufoaWfqKiinp2wrJealqinrqunpqeel5SZoqGSlKCtm52npLCtpa21q7rNsa2mrquWlZydopmerqycl6Canp+ps6urq5usq6WjrJqusaGnq62ll6Spp6evoJGVoqKYk5CEpGqkdYl6qXR6snCCpoqZjHGJoJuHpGBgUquFf66Dm3atgqiGhZ97mZeFemaAo4mkmYaCo32pfoKWh65ffKlWnqOSgXqjn4B7w6/Fi3Kvs7O5cWKpr8J0aIyMmI6CbpyVcW96eHlwbWdlZXJwZn1qY11XYGpYWVVNTVFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5hYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMlBLTCMgQTlENCwnw8nW1L+hmaunoK+inrC0sK6prKKnpaiqq6mkpqCbpJ6dpaeno5yrmaKsoKOfr6GcmpKrpLWvrqCnmp2Vk6aikZuiqKCgpp2xpqapsq23yLK1qquplpGdnKKZoKWznZqhlJ2fp6ytpLCbraujo6qhsq2hqbKwoZmop6yts6GRlKGllpmQe6psnoSHdat5fLBvgqWMiZ+WlqCVgdK4tLjJgYGyX2CUqYOliIegepmVmniqyXSZpJWoqZGTmo2BnIqaxsZ5Z6GCpXSBn46Cfa9dcLRisHVLo4dtp0eCk2SPkJ6RfHGZlYFxfHV+fG5cZmpzcWaBa19hWWRuXF9ZSU1NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraylopyyuKyqoaWap6Spq6qmn6ammKqjn66rnaWgrJqeqaWcp7aeopeTqaq1sqybpZyglI+lrJGanKejoaqnrqKlp6qwtcOxs6qsqJSKl5ylm6GjrqWXoZWZnKamrZyxnq6pp5+so7asoLG4rp2araawsbCikpamoZiejYKdTniagX+feoSjfYOkhYemn52flIS4e3t5uYJ/zMbCtniboZGLn36alpeKdp+XiqWYpKl/sIWdhqCErH2alWOmbaRwj4WQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+lJONd3tzhn9xXG5ueHJqgm9bZGBpb2NkXUtMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWVlaW1xfX15dX19dWlpaWFVTT0hAODgyLiwqLisqJyc/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5ipq6Sruaqun5uhrLKzpZ6glaWtra6qp5ymp5ujqKGzrqKpprKgmKmklKO2oqKVl6KptLijm6GcopKPobGZnpynpqGisK6dpqmjtrPFsa2prKmRh5CcqJ2ipJyll56ZmpqmpaubsKKvpaaYr6S7raG2taycnLOwtq+wpJacrp6inIWP0bXDt3mHjoWRk5CApnmUoXeMoJKEpYGKcaqGhbRucmqapJyVip99mJmGh49zr4KmnKOOpouTnYuWkJtucbJdpXSTepxsmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jY6Vjnp+eZCDbmp5aXpzb4F1XmVlb25maGBKW1hYPEhIQFU0QEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bW1pYVVJSUUY6MjIzLy8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklknKMiq2+v7y6tJ6Wp6SttaGimZSip6auqquYpqOfpaGhtqejqKewo5Sro46kraKdkJqaqrOzpJyknKiRlJaun5+ep6SdqJ22m6OrpLasxLCpq6ihjISOnKKgpqOWmZqdmZyZp6anma2or6Olm6ymvayUvK+snqGusbepsKSZp6+hppZ5qJF9fLB3ioCkpYicbbJwoYetfKGPg6iVmICsiYWthaCVqqCil4afgZqVgHuSfquAnZuWi6t4naGSipSSgXqvXqSBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkaaZg5aOmo58fISZgGtuf2N/dG6AemBoZnFvaWhnQ1lhWz5LVTNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RUlNTVlpdX2FgYGFhXl1bWlhTUE9OSTcwNDIuKixBVFZWVlVUVVVVVVRUVVRUVFZXV1hWVVVRSEZJSiMoKL2TmoOoxcK2wLOemqygrbelo46bpKKgsK+qn6Wgnq2Znrmho6ugr6mZrqGQq6ijlomakK6wrKaepZusl5ePrKGhnaWgmqWdrpiiqae3qsGvpKmjnouBjpuan6aekpSZm5WbmqalppuqrK2kpZ+pqL6klsKrqaGgqrC3qauknrKtpqiXda9+kIuchYd+uq2KmWWwjWWVrX2hj4SnlZqBrIqEsIWmmqShopGFoVxsaoGzYH+te3uDgbFtZ2+ZmYyIsVt+tVykhGvIomSfgHu8WHa0WbJ9Uq6AeqxYgKFumI+onIyYkpqafHqRoH9kdX9jhnh1gX1iamdxbmdmZVBVZFxBVWA+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBRUlRXWl5gYGBgYl5fXFtYVVBOSkZDNTUzLi9AVVlYV1hXWFhXV1hXVldXVldYV1dYWVpaW1xYV1dHQjvSn7Kxt726s8GyopyspqS1qaCKmqCenLOzqZ+koZ62maC0qKqsnq+tnaybla+noY6Im46vq6imoaWZrpKYj6mZop2knpmjo6WZoaOqs6q9r6Snnp2PfoublqGgmI+RmpySmpipoKOaqa6opqaipai7np/FpqOnn6mzs6qso526q6qrlICpkqOvjpuAh6SXmZCCgLjDuoOOnJOEp5ecgqyKgq+Ip5ybpquRf9a9wqpio7+9fX6jgoPXuri1hZWTg569voRto4Jvq4RsnH96srDHg2mrsL2seHeivrxzgJaOp52RnJKaoHuDk558Y357ZY9neoN8YWxma2tjUWFbU2pcQFViQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc3Oz5BQ0ZHSUtNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWzs7C/uLG8sqKcrqalsqadi5ilwKq4sqiiwKeos52fsp26qJ+tr6WnlJSwq5eMg5uRrqWirKCjnKqgl4ujkqaeppuaoamjmaCirK6quq2oo5uXk32ImZGmm5KPkZiZj5iUqZuhmaqpoaunoKOqup6ow6KfraKpsrKoraeeuKWsrJlzdqqluIZkiaBwaK6Ri5FubnekkJmfgXWumZRwj4txlaiknJivpHNtbWxmi3hvboKZcYF6anFpZ4qXlphxaWmGiGdxhmRdiGJqb1lcZn12pl9hcY6RbmVkf42Tj6KZmZqTmaF9iZGYd2aIeGmPbHuAemVtZGdtY0tkWEprWjpRZkVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dXV1ldXl5dXFxcXV5dXl1bW1VXXqmUrLOpubiys6qpoa6eo7OqmJK/s8XKv7eqn8GtrqSiqKyfuqOkrqutpo6XrqmPi4WVlq2epamgnaSjoJGLpZKnmaiZl6OroZedpqaosLurrJqbkpJ8hJaNpZiNkZGZlY6YlqmWoJmqo5yxpp2iq7mfr8Cmo7Gkq66vqKuppbWirLaViqGoprediZajmYiqm5GVnZKps5mao6qgspaioZ2fopyhpaKVrKeNk5OMh5OcnZWRmZOZkY+VhYGlm5iWjouUlIyQh4R+Z4l+dIJ1c4eKcKdsepOQk5KAgY2PkI+dlaKXmpmlhImXkHRqkXdyjHh4fXpqbWVkcGVVYFlAalxIZGJQWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVdZXmBhY11eVFFLRUM+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCmlqiqpLS2rq6hsKOtn6C2sZCOrMi+xry6q6Omn52nn7Gpo7annam0pqiRmKyii4eJj5ynlaujn5innp6SlKOXqJqnmZSmoqWRm6eZora6qKqYmo+MfIGUi6GUipWRlpGQlJimkKCbqqCdtqOdpqu3p67AraK1pa6trqqnp7G2n6y6mJGlpKa2opKep6COqqCOk5+jq7CaoKOwqLCXo6Cco6qenp6clqyek5qim5SQlquajpmZl5GWn5GIoZ6WlYaSjZGOlYuBfmWLhXWGdXiHgnOcaoWPkpOQiX2LlZKSmJSjlJ+ZpIWJm4p9c5d0fIyAc3x/am9lX3FqYFtgWm5kUWFlUVo6R0dFPjI9PjkvKiYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NUVVpgYGlhZVZQS0FDQjo5RU1WW15eW1pcW1tbXF1dXl9dXl9gYWJjYWFhYGJiYmRiXFtjl5Wjp6Kvsauuo6mmrJ+ntaqQj52ltb2wrq2jpJt8n6SypKWxqZebuaajk5mqnI6Giomco4+tnaKVqJ+gkpaZm66LqJWPqJqqjZmpkJ+5t6SlmZyMiHmClIybk4qVkpSRjZKXo42fn6men7ijf4OvtaKurnSiu6GxnnZ3nqivuJN0q6OeiYCrf2RcYnagj6WfhJh9bZKznKOnraqjZZ6fknN5mphwgJipmG1/oqiKZZymnZKYmJaNkpyQhp6bkZeEkoePkJKJhXdqjoZ2hnB7hX9/YGiHiZORi1p1lJBnaJCPc3yonJxme5uKhXmZaoaMhG96gGtyZWB3cGxraVxmZWJicVRbPk5OTlNHPkBVRDoxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVVVZXWBoZmdYUUo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgrq+sq6mlqK2ip62kkpartrGzp5urqK2YdI2fsaCoq6eUl7mgoI+cpJ2Rf4mIm56Mq5milaehnY6Wkp6Fda2PiKebqpKYpYqcu7SnoJmYi4l1d5ONlpOKk5GRlI2QlKGPnKGnmZyylYCMm7ScsoySjrqln32noXmgrLV/jY2lnoOLhpCwqq+Ni5ekm3qBi6yFnJ2hp6inh5WFmHelm3qInICXp4KBe5yzeoqGoZialZiWgpGXl4SbmWN7h5CFj5CSi4NtcI6HeYBwf4CEfoVzhYOUkXiWaJJ0oJp1fZmEo6CJmH+VjYaFmmuPjodseXxycWhleXBqbGtcZWxrZnVdXklUTFJARTYuWlVVNykhMDk+Pjc0MzU2ODs6PT4+QERJP0lFSkxHU1hbWVxiYWhmWlFIOUVMOz5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kfpqytq6isoKewpqappZmUr8i/saKXqKq3n5GFnq2cp6KgjpC+npqMn5qgkHyGj5iXh6ycopafoJGMk4mFgJKnjYejnqSVmZ+Hn7qyp52bko6FcXaQiZWQipSQj5uMkJKgkpihpJaeq4eftIm0ma2KyoeprIi2hYyvga6rgqiMppiNnX2oj3N7d5yPp5dolaR5tIyfnqankpjCgX+riJihcp6AmqV9l4WVs4GhfaGUoZCYl4GPlJyLmZKLfYWTh42WkomDbXOPhX55cYaAg3uDdISAloCPxWZ/qYePo2uehaSdhJqBjpCJjJpxj5SGaXl2fHhoaXZyaGhsXmRwbWduWWdHXVJNM0U1N05iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5pbFxRRT1LTUBKY1hdY2ZoZ2JiYmJkY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJain6+nqKilq5+kt7Cpq6aalKCjpKylmKasuaSwgaKpnaaenYmUvZmTjaGSno95hJeWkYermZubmaGEjox3mpyPn5CInqWcl5qZh6O5raSanIyMfmJtj4uTkI2QjY2YjJGToI+VoaGZoad+oaeHrZ2flq2PnZyckIR/oIyorIWjjamZjJp/onWBmZRrgq12Tat4h42ckZqopoCpq32DoXt6p2qef5JrZ5eGmLeJnn5uYGRZg5eAjXxkaItymX15lmxdfZdtX1Jwg1xfa3iCX1hkgXyDf5dwp6prg6NucqVwn4WgamegbVxwjn5nWmCEgWNYUXB3Zm51c2tqcF5rcW5sallpT11ZRjlBNUhEX2w1LElEUk1OPTg0ODU5OzZAOzs+QlA+UVJMTUJKXF1fV11eYnVgTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnaC4oKmjpqyRobW7qq6imZihoqWtr6GesLakqZOioaCnnJqOmbSZkIufjJWLdYGUkoyKppWVmZ6efpKFhaykh5uQipmqmZubkoimsaehlZqIiYBpboiHi46OiouNkoyRk6ONlJ+fnKKkf5OBj6Kgk592nJWPp4GfpX6Fp6qCpXiJfISafqJwc5SIlnyfjXlthpuMmY+bqJmOh517gqJzdqZmnn53pF+Yen2UdKJumLe0unSTiIOAtahkgca4e3CVtoxygJqjY3Osq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRhnZm0l3N9mJ+zdXRcnrKDa2NwdXdyaXBZbG1zc2ddal5iTEU9RDZRQlpzMz1TR2BKUj08Mzk1Ojk2RDs7QEpQP1VNT1FARV9fW1pYYGB8ZEhDOE1XVVdiYVplZmtrYmJlYWRkYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlZSjt5iqm5OfjaS3tK2toJqinaSjpq+dnLOvrZSZopqhpZmblZ+rm4uIkniLhXGAlo2JkKGPkpSdmH2QiY2ooYeXjomSpJWcm42Mqailno+Xh4R+anuHfn2QjYOLkZGJkJShg5eeoJ2fnouJd5yYoYyfcaGKh6mHmqSOlaWofK2MfnqgmXqjk3iBdJaIjZx9lp+Gm46Ym6WFomShfIiWkJuNbZ5om45vmpl6gIunfXJpdKuDn4N0qmiVml2bhXaFnmeqa4C4ZlyocIGcYJWMXqd2dYeIfp5omnWGk5KXjoCfb5qRbqeaXql/ebtrfqpcjoRdtGhdbnJ6eGxqXHFreXpkYWdYYkJSRk83V0NSbzVMW1tfTlpEQTI1MTw6N0g/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuJqbSap4hjlJururGvrJ6mnJypoJ+vnJ6yqa6fmKWboaCZl5ego5mGiY1qiIBye5eIi5aWhJGVmJB6ioSVpJyKlI+GjJ+Tnp2JkamjoJqMkoqAgGmBhnl/l4x7iY6OiJCXm3+Uop6foZOYcmifiZ6Oi3CSjIGphpidoaWepXuwraOiuJd3o7OjpICJlHmde6uZfqKOnJqWiJdxoXyFja+1fWuakaF5fpi1oqSrqISZfJt9npt/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iianF7jmyAiISZdZt4homxs3+Am5Ond4OebnR+lXCadGukXpV2SGVkYXRyf39vZmFsaXd8ZWViUV9XXVVXQFpGUWhFVFddYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUI8VV9iWmVpVmdobW9iZmdeYWFcXV5gaGJfZWN2bF1lZ2ZrZGVsaWlraZOcgLCtmYRTXqCms7mysqmaooycrJycqpWiraWjqZCgn56bmpaZoZ2WiIeJd4aBb3mVhZGbi3yRk5aIcoCIkaGbc5CQgYmalqGbhY+qnJuVi4uKfINshIVxgqGMeIaNiIiTmZZ8k6SgnqKIrYZ9tYSNnZx7pZZ6qYCUmo+Jnpp7p2h3bX6ZdKFzcnyehplwk4OufaSDpZ2ZgKNvXqlndaJjb6VhnNOQfXuZeHNzYqKGkH6jdKSQdmuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdm218cJZtf3Kicl2kZ3OmYGimbZvUmn6Gm3B7e5hsnHx4mHNuqaRnYWV6coCFbGhmZG92eGhhY1NcZlFSYkhZSlVhV1RcZmtcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWBmZmpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNfXV1dX2hiYWllfGReZGdka2RqbGZobGiXmn+vqlRcS36pr7Gzr7Kjm5mFmamgoqWPpqmhmquLm5mZlJmTkqGYjoeFe3B9hGh9j4OVm4B3kY6PiW9/hY6SkmyXk3yJkpSll4OPq5uUkouGiXmDdoiAboKfhneAk4aImaOYe5Sio5mfibOhoraLeqynpK6lcKmAmY6FgJmPeqSAoZmGmHKehKSur4qXjICNpI2Vg62gk3a1trXJoXOUi4GfYJ6XqW15loegm3SiiHegfpOXi4FwTWajknCbh3Ole3l0YYOBa36ga3FkX5xxfXOWaHlps7W0xqZzmH16nWucm6t2hZtud3mYapp7dphzUUV9s19qd2x6iGdraGN1dnFvV19UWWlQU2hJV01ZVFZeaWxvVmhXTktBSk1LSEpPQVFLUGVjam1ldHJzf3l8bnWJe3tUUU9sXmlca2lSamhpbGdsZmNlX1xdXV5pYmRpa3tfXWRnY2pmb21laWxloZuIrqWDZD+TobKqrq+1oqKQgJeqoqOmjaaon56nhJuYl46XkI+ck46Ig3pqeYdlg41/mKB5dY+JjIFphIWRgoyFnY15jYyXppSEmaqYjZGLgYl6gH2LeHCQoYZ6gZWHiZagln+UpKablZWDZm54nGyiZHtxpXebmHBmpoCUiXqkep+Wg5dznneBipWXj7lukYqiYn2YoJWIbnJpqmt1oG1vpmCbaYuQaZaHm5Z1ooF+mmCMho11cIhiaKBlnn5pm3VvY2aIgW1xolleWmKhbF2Ii256fXNyZKVteKJkZ6domXOMmXCicFWJkG+gX2aoVYteVJhubnRrc4NucWlseXRrcFJZV1dmWlRtSVpQXUlYaWlzallsV1FSRlZcTFhTYVVpa193dHt9cHx8coN7gHN2jYCEdl5ScmJnY3BnUGpoaGtsbmhkZ19dXl1gamJqaXZ1XVxjaGNqanNsZmttY5yjl6V5ZHNti6ato6mwsaafi4CYq52fp42jopyko4GWmZSOmpCLmJCOinuHcYCIaYuLfJibc3WJfpB7ZIOHlImKlZmCfIiHmKiSgaOtkYaQi4KJfoCAjnJpkKaEfYeTjYiZoI+Ik6mlnIimeJWbfqSIlouxmJ2Qgq+Xn6R1k4V4qXOlj4SabqSijJKEjYO7bn2lr4OHhYaTlZyffKV6cqiVoJZnnn5vrGSWipaTd6htqqKBiXaJg3erkaaIa5Gwa3azjKlrioVtbZ+ekZRffauLqnZ+foulnnaffIOklZ2gapuIeKxon66MtnR3vo2kk1qDp46rYXZzdXJ8dXFja39vaG1UV1tWYWJda01dUl5KXm1vd2BbcVlcYFtndGVub3JjcnRgd3p+eXJ5g3OEf4F7e4yBg4B2YnhkY25yZFJrZ2hvbHJqZmlhYF5cYWtibWx6b1xcYmlibGp3bWdsbmKVpKmcgX+do5apqZ2opq6kmYqCmKyan6aKnKaeq56FjZuQh5yRhZKNjI10h3uIhG+NhX6Yk3R0hnOSgm1/i5GHhpOOfXuCh5mnj4Cnp4+BjomFlHaCh5JubIupgYOMlI6JnZ+JjJSpop+Of3STl4h+gXmUrqJ/gZpxj4Z3jomCfXtyp4xyfn16mJabhJB5e39+h5SVk4p2kJieoIN7fYlrjIVbeXlyenFpbn6SiXGAdYGPlJNxh4SCZYx/X4CAi3d1c5R1b3lubYdsg4ZedWd3jmV/gISMqJp9dHuVaomIcIF2fYd3bm5ojXR6fJh4hVxsWHmPaW94c3JweHhwXWyHb2poV1tgV11ma2RWY1VfUmBweXlta3dma2trd31ycnV0YW92YnR7gnh1eoJ1gICAgXmLhYN9e25/bGR5bl5XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5oa29hjZO3qKaJoKKapqOYpZyroqGEhJitkp6iipuom6qYg4KcjH+WlIeOiomNcoN8j31+j4R7mI90coRxlYV7fZKLhoaPhHl+gIibpY98qKKMhpCQhZWCho6YdnKEqYaOkp2QiZ+eiIybpp6fqoOIjZWafn6Jlq2nj5Klj3dvm46BeJBufqiFcX6VcWtwfYKgjYCTjotobFyCi4ubmp6Oc5WLiHF0a4J3dIFZcm6HkYF+f4xqXWple4aEiYBgaXh6m3uCi4J1gYWBZ3eKhmpgb3GAdV5xiYCIjqaUhWWLjYNud4uEcYaPenFoaWZ8hHuWW11raG52XHx6eHZvdHODaF1ui2xsY1paX1tZbHFcX2FaX15mdH98dnB1ZGtra3x9c3x5dWVudWhtfH53enx7eXqAgH5vhYmEe310fnlzf2hUXHFpbHZwdWdraGRdYVhraGtrcXJuV1tlbmxnc3lvaGpsYIuKqbChj6Khmp6dl56YqKOifoOZro6glYmdo5GmlYB8mIZ9kpmJiYaHinN+gYx2hYuChJeKcm+AcpiGg36Sg4SGiYB6gYSNnKGRg6iiiHmOl4iUioucl4SDeq2CkZialYqenYeIoameoaGjioeTm5yjmZWqoaemn5KahpSLenaNjYOnfn+TkJKUnbKmm5WfkI2xkpeDpYyMlZqfiZCbgoiRimt8jnd4ZYOGkYt8iZ6Eh4yQiYmBhYSQd3x6dJqgiYaKnYmEk359ioB/dG5yhIF9doWFiY6lkIKFjIaCjJCMfYiMipGEem6EhX56mWtzaWF0i3F+e3h3cHh1gl1eb4hpb2BfWl1dU2hyVmRdXWJtaHZ8fXRvcGVraml/fW55gHJqcHFsZ4F7coKAeH99f4R6bYKMhnx6eHt9eoN4TmN2anNucHpla2VjYmBbdGZwZ3JxbVVdbHRtaHl6cWdpa2WMh5y5npahoJiUmJmUmKShn3x/mqyPn46GoJ2MnpZ9eZWEfI6ZioaDhIdueYGBc4GIfomUhG1rfnqXh4ODj36Ah4SFfIeFj5yfk4isoIRzipCGkpGLnZF9jXuqhI6TmJaPnJeHh5uknqGZnIWCkpqZmI+Zpp+knJuPlX+Oh3R6ho2EpXt8jpCRhpmrop6UnZCOqY2QgJ2MiJOZnoKPl36HjoNveIZydWB/hJCGdIyZgYOPg4eFf4WElW55dnSSooqMhZqEhIxzf4l8e3FxeoaCeneIjYORpo+Fg46Ag4qJineGiYuNfnJtgIJ9b2lsbmheeoBpfn13dnd2e3hdYHF+bnVgY1tdX1JnblVmW15ia2l2en9ybG1ka2pogX9sdIJsbHVwenCGeW6HgHaCgH6FdnGCjYh+e3x8f3uCimBoe2p1aWmCZGpjYGlcY3Vob2J1bWxVY3F5ZXB6e3Nlam1ti4metpmgo5+SkZWYi5qfn597eJ+nkZyLh6WVjJmZenuNhn2JkYSMgoKDbnyAeXOBhX6Lkn1raH2Cl4mBiI17fYaEhnyPgpCdnZOJqZ2BcYuLjJKGoKGKhYx8qJGJkJKXk5aTeIyinp+dlZh+gJCamJKLmaKgo5iVkJl8i4J3f4KOhqB/foyMj3yYpaKik5qRkKaMj4GakImSlpt+k5J+h46BdXSCcXdhfoGOhnGLl32JjHKMf4KFho9oeHJ4jJiRj3+WfoiJcoGGe3tvd3qKg3l4j4uClaSTioWPe4aGh4R2g4SJiX1oc36BenxybWxoX350aX12dnR9c4FrX2B0dnB3ZGNZX19Sa2lWZlpgYWlqdnmCcmdsZGxoZoCBa25+aG9xbH95h3psjIFzgYF+gXR2go2Gf3x7f4F9f49pcoNudGlhh2hsYl9xVnRvbG1geGhtV2p0dmN1entyYmpveomMnrGRpaScjo+Xj4acoJuefHeloY6YgI2ji4malnl8hoh/g4l/iYKBf3J/e3R2g4V+i5F4Z2N9hpeKgoqLeHyAjYN5loKWmZiOl6Gbf3CMgpGThqWbh4yJg6aWhZOLlpeTknaRnZ+gl5OWeX6Ol5eNlpqco5yXkZOZd42DgXaDlo2dfoGJjYxzl6OfopSZj4+ijIqClpeDkpWZfpiNfIiNgXZxfm57ZIB8i4Vwh5OAkYJsiIOBgImFZnVve4WRmIt8k3iLiHt/hnt6cH13iIV4g4+HipehlYGDi3aIhIOCd3yDioZ4YXp6f3WAeWhtZmJ/amt4dHR3fnJ9Y2Rhc251cm1hWmFeW21lU2RZYWFpa3V5hnJja2NtZmh9gmxpdWhucGqAfYN5bZCGcoCDg350fIOMgX9+eoKDfnyQbXaJc3VtZYpsamJidVaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5utl6anno2Ml4eGn5OXmX54qp2LmXqXnYyMmZB5fIGMfnyEfIGDgXh0eXp0fYCEgImLgGRffYuUh3+EhnR8fot/fZiGl5WYjaSimIBzh3uTkYmmj4yOipOgkoSSkJSXkYuBj5eempGPkHJ/jZGTiJycnqWXlouTlXGLi4lrhJePmXqHiI+Jb5eem6SUlouMnouGgZGcf5KSlYaZiHuKioF5cnpsdWx8f4t+bYWTg5V3cIOEfn6LgGVyaXt/lpeDfo10kIeCeIZ9dHZ+fISAe4GLgouTo494g4F0iYd9gHR2gomFcWJ8dntyfnBjcGRlfGNvcHdzeXh0dWJ2YHBsdm5vXFxgXl5rXlFeWWNhaW50e4psYGpla2Nod4duZ21pa21pgn17d2+QiHOAhIR9dIGGiXuDfXqBhH19jnJ6i3h4bWyHamhfaXJjh2dxb2V3Z25sYXlpa317eHBheG2LgJiYqZ+kqJ2KipKGip2LlZl+eK+ZjZd9n5SRl5SId358in18gHd4gIBwdXR8b4Z9gYGKf3xhXH6PkYaAg4JyeoCHeo+SiZOSnZOmnZWCfYF9joqRo4mOio2Ymo2GkpmUlo6KiIyRm5KOjIxthJCPkYiemaKglpSIlY9shpeCZYSYjpN6iYSQinCWm5WjlJOJi5mMgX+Qnn2SjpKMmY57ioWHc3N2bHFudXyKdG+HkY+TcXWBfIGBiHxlcGx5fJmTfIOIdJCJgHOHeG5/fICFe4SKhoGLlKeMeoZ7fouFeH5xcIGHhWZpenV2cXxjX3Fha3RfcWt7enlsc3FleV5vbHNtclhbX2BibFtQWFllY2hycn+IZ11qaWdiZ3GNb2RqaGVpaYF6d3VvjoV0gYKDe3WCiIV4hXx4hIV6f4l3f4t7e3J4g2prX3BodIBrcm9tcmdvbGV8Y26AenZxbHd3in6il6GnoKabh4uLgY+ch5OddoKrlZOOh6GNlpSQgHR8d4V4eX9yc3uGa3Nwem6LdoCBh29wW1l+kY2HgH9/dXSBgICgh5KLlJ6YopWYeYp/gY2InJ2Kj4aSmJaFiZWakJeMjI2Ni5uJjY+CbYmLkJCJnJahm5eUhJaGaIKhgWWEnImQfouDi4F3k5mToJOSiYmUjX59jpd7kYyPjpqSfIqAgm92cGxtb3B7hml0hI+Zi3F3gXWCiIN5ZnJudYCZjnuHhHmTkHl1h3NviHqEinmKhICGjZuih3uDdYKLf3h5bmyBhYNfdHV0cnJ5W19xYXBrX3Brfnxxbm5rbXZhcG9rcW1ZWWJhYm9YUVRbZmdjdXCFg2Nda21kYmZrkm5gZ2dfaGuBdXJzcIuAdX+DgHl2gIuAeIV/eIiGd4OFfIaLf3t2in9qcWN8Y4Z8bnFtdGpob2x2eF9xf3l8dHV0gIN+pJWarZ6nloWNhH+XlIOQoHaMoJSThoubjZaOi3pyeXWCcHKFdHF2iGxwbnZtiHaDfoBtbVVRgaqUhoJ3f3Zxg3qDoYOTgpWUmZ2Tm3iRe4OMkqOZk46JlZmShIeXmYyUi4mOj4acg4+Je3KLhYqOh5yan5qUk36SfGaDmoVmhZ+HkYSRgolxg5GYkJyPkI2Mj4x3e5GQeo6LjJKWjHyIfIBrd2pua2xse39hen6Pl4J3e4J4g4x9eWdzbHOGlYt9h4V6k49xeYNvdYt5iIp5iHuAio6dnIR7enaCi3x3cWpsgoR7YXlxb25zdFZfcGJyYmBtb3pxaXBmZ3N1aXJsYndlXVdmYWFzVFFPXWdlXnlwiX1gXWlyYmJmZpFqX2hlW2dwfnBscXSKfXZ8hoB1dn6MeXuFgXiIg3OGhX6MjIR8eZV4ZnJqg2CIfm9va3pgam50f3VfdH15h3h0c4V9eKCPmbGcpY6Ci3+DmoiAjJ+Ai5qUj4WImI6Pj4R3dHd0gHFvhXRwcoRwa2l3boNufX1tdHJSTYLfyJLWk3twdYR2haGElHiXkpmdkZl7lHOFkJ6hk5SRipOclIZ/l5aIjY2HkYyHm36NgHd6jH6JjIqcm5yak5F4jHRlho+Fa4eihJGIloOGY4yRmY+Wi5eMjIqKcXqUiHuOiIqTkYl5hXx/bXxlc29rbHp6W4F5kJCBen5/gIaOe3tpc2pzio+JgYWEfJSKa31+bX+KfYqFfIR4gI2TmZiJfHV3g494cm1ncYCFbmx1cGlrdm9TX3BlcFpgbXN5aGxrY2d4cnBxZGB4YWBWbF9fd1FOTGJnY116cop2Xl1ldmFiZWWOZGFnYllpc3Nua3F2jHx0eoaCdXZ9i3N/hn97iX9yiYiBkYuIfH6YdmVzbnxliH5vcGyAWWxueXlzYHZ6e412cneKd3mei5uumqCQgoV3iJV+fIqeiIagko+FjJiEk4+HgXR4cHlxb4RwbW9/c2VleXF9bXl9amdrY6Sawdyu8KFzbHaFd4akhpNvmJKWopacgZJyhouil4iOlouQnZaDgZaQhYmPgJCJiJV9hnp0f4l3h4SOnJqYmI2OdYl1bISHiXyJooORiZyEhV6Lk5iLkImPi4uEiW17loF9iIWJkY+GdoV9fmt9ZHh2am55c1iJe5KIhXp+gYGGjH95ZnJpf4mNiYKBfouVhGuBdW2Gj4GOgn2BeH6OlJGXj3Ryd4eMdXNxZ3Z6hGN1bnFja3hoUmFyaGxWYG91emFyZGBpfXBzb1tkcmFiV25bXXlPTUxlZ2Jed3SKbl1dZHleX2VlhWBjY19ZanNrbmtzd4x9dHeEgXh3e4lxg4R9foh7dIuJiJaGjH9+l3NndXJ5bIx7bnRxgVdxenZ5cmR3eYaMaXaAiXJ/nIaYp5ujkoR9cYyUd3mMnoWFoY2PfJaNgJqIhHtzd3B0anCCbGptfHVfYXh3e3F1e2dgZHzr2rXJw9yHc2x0gneLnIqPa5qRkJ6WlIGJcYWIn42Ei5aLjJiUfI2TiIOJkHuPi4WOgH91eIOEcoiCk5yWlJeEi3WGfW6CgIeGmKGCk4yeg4lhg5SPh4qGio6HgYdpfJN/fYOEiY6NgnGGfn9xd2h2c2p0d2xajX2Tg4V9gISBhIqCdmFya4eBjomBfn6RkH1tgWt3hY6EkIF7gHt9j5GOlIhtcHmMhXRrcWxzeYJhdWpwXm14YVJlc2lmU2Bxd3VhcGBdaINxdGtYaGljaVluV1x2TUtMZmdeYnN0hmtcXGV5Xl5kZ3thZF9dWWtvZm9qdHiKfnNzgX57dnqIdIWDfH+HdneKho+ZgYyCe5N1bHd2eXiTdG54e31YeYZxf29neHeSgmR2hoVwipaFmaGaooqIdG+SjHF3j5x+i5qJiX2gf4SagIF4cnRub2Ryf2lmbXh4XGB5e3txcYBqYWdhf9W2jpGmeG9xeH1xlJKOiGubkIqdk4yGe2mHi5mGgZKRhoeYjnyNjYGBiY17j4x9iIR6c3qDenCGgJaajpOTgId0goR0gX2IkJuehpWPn36IYoCTh4WJhYuNgICDZ3yQgH5/goyPkH5tg3yCdGxtd3V0d3ZsY46Bj4CFfn2Gf4SJf3BfcW+Ee46LgXt+kIh5cINleYGIhYqAeoR8fpKNj5GCbW55i351bW5rbHt/ZGlsa1pveFpTanNpYlFjc3htY2ZeWmuEbnRiXGhfZW1gb1VccE9IT2dmXGhvcYBuW1xjc2BcY2x3ZWVdXVpsbWNtanN3hn9ycYB8fXR4hniFgn2AiHV5iYGTlXyJhnaIgXB4eXuEk29ue4F3XoOAdIFtaXp0lHNnc4h8cZKRg5mfm6CGiHZ2lH9td5SYf4iQhIuOmn2Mmnd+dnJwbGphdX1nYmp1eltgeHx6bHB/ZWNnZ1edj19xc5a9xYV3cpWLkYB0mY2HnZSNiHNriI+VgHuUi4GEm4x8ioZ9fImMfpOHdIeFdnZ9gXF1hoGelYaUjoGBcX6Gc4J5h5WbloaTjZ2AiGZ+k4OBhoSKiXKBfWd9i3t5f3+Hi499aYB8g3ZmcHl4c3d0bGuPhouCi395g4GEhIBrXnB2en2Lh4R7gI5/fnKAaHiBhYmEgXeCe3+Vio6LfG1reol8dnRvaWh+d2VdcmRZcXVUVG9zaWJOaHV5Z2FeXVlvgXB0WmVjXmtuYXFQWmxSRFRoYlpsb217cFpbXm1jWmNvd2RnXF1ga2pjbGlzd4GDcm9+e390dYN6g4J8goZ2fomBlpF4g4p0gYhzeXl+jZBvb3uBcWqCeXp+bm18dpVraniEdGuTjIWemKCZhYhvfox2anmZj4CCioKWmIp5j5ZvenNxbGpkYHR7aWBmcntbYXJ9emZwemFlZI6xsndLYlql2tKYc3ySjZF6f5eMhZqSjYZvbIWSkXl5k4aAhJmKfIeAeXiJioOVf26JhnFzfXtqeYaDpZGEkoyCfm59gXSBdoOZl5KKk4+UhYhwe5OEfoSDiYNvgXhogIV4cn9/g4qHfGV8foN1Y3FzgGl5cW91mY2GhIt8d3mAhHqCa1xvfHJ/h4OIfYWHeohxgG1wgoWMgoJxg3d/loqMg3dtbH6Ef3Z6ZWhqfnJhWnhbWnNvT1hydGdgS253dmJeXFtZdX5zcFhnXmZrcl9vT1hpUz9ZZ19bcWtneXJcW1lsZVpjcHlfaF1eZWxoZmxpcnh/h3BugH2BdnCCe4CBf4N/doGFiZeKcYKNcXuGfHp5hJSMdWt6f2xwfnV/fW9yfHuTcG+Bf3lmkoqCoZidkYOGZ4eEcGd6l4p/gIWCmoqBfI2NaXhybGxmX2FveW1gY295XGRsg3phcXZfZGXV676LMzo+i4+AcnmGipCOeIaZjn+Ujo1/bm2FjIt1fY9/hYKViXyDeG52h4SClXZth4RrdXt1ZXmDhKeMg46LgnxsfnJ0gXiDmo+Kj5GSjYyHf3uSiHmAhY6DbIByaYB/eG18fIGKg3hieYSCcmRxaX9udXJ1gpyMgYCGf3R2foBzgXBba3xzeIiBinuGf3yId3lwa4eDj4KIcIB3fZOJin1zbWp2gIB1dV1paXlxWld+VFtyZk1bc3JmXEpyeXFdW1taXnaAdmlaYltoZm9jak5YZ1I+XmZdXnZmX3VxW1lVb2RaZXF5W2heYGdtaGpraXB4fo5taoKEgHlugXt9gX+CenWCgYyThXCAi253fYB7e4iTiYBpe31rdHxyhntzdn1+jHp4hH58a4yMhJudloyCgW2Nfmxpf4+OfH5/g5SCf32KiGt1cWdpY1tjZ3NvYGFsdGFocIl6YXN0XmJjm6CQbl02W7C2dWqAiX6Uh3iImYd1kIyKd3BthYKGdHmJeIl9k4h6f3Nndoh9fJZub4V9aHZ5bmV6iYWlh4CGjIl9bX10fX97ipeGgJOQmImLhYp8kIpxfH6GfGl+bWuAe3lqeneCh4FyYHeCfnJkcmd2g251e4aVkoJ9goBwd3p8dX9tV219dXOJgIV2hnSCiXp3cm2IgI5/g3F9e3yQh4d5bm1obYKBdW5daGd1clJcfU9dcl1PXHNwZFZLdHlrWFlZWmJygXZhXl1hZ2RpamZPWmlOQWJkXGB3YV11blhYU3ViW2Vvc1hqX2Joa2dtbGlwd3yTbGiEin18cH9+e4F/gnp3gICJi4Rye4dvcXeEf3uJjY+Ean57bnh5dop3fXh/gYd/hH5+em2EjIiYo42FhHx2i3prbYWJk3p9e4KSgIB+ioRwcnBjZl5ZZ19wcGBhaHBmam+JdGF0b1tgZGp2e3+/nailybhyhYR0lX56iZWEdJKOh3JzcIR6gnN1hnSId5SJeXlxZHeGeX+SaHGDdWZ3dmRqfISInoJ/fo6NfHF9coJ3fpCOgnaVjZSQiIKIe4mKbHl6gHVoe2lsf3lzaXp2gIN9aGB3iH1ranRoe4BqdoGNkZV/fH5+cXx3fHR/YlV1e3Fyh4KBe4Fwhol3eG9vgoKLfXx3fHpzjISAdWhwZ2yIgXJwXWhjdG9MZndNX29WVFp0bmJRT3V5YlJYWF1icYN0XGJdaWVlY2tkUlxxSURlYlxkcV5deGhWV1Z4XlxmbmlWbF5hamdlb25ocHd6k25piIx5fXN7fnmCgYJ8dn2DiIaDcHaDc253goJ+iIuUf3GAfHh6eoGLdYN4foCBgoR6gHVvfYqLm56IfoZ7d4Z8aHWHjZJ6f4B8iYaEdo+AZ3BuYGVcWGZZbXNhYWFxbGxoiW5gc2lYXmNtgHep2qnIh4izcop5cY92fYmRgXuUi4B1dHV+dn9vcH9thXSUhnh1bGB5gHiHjWVxgm5ndW5bbX2BkJOAgHiSkXx3emyFc36PioNylYqRj4iGhnt/hm11d39taHdlbXx2bWt3d39/fGBieIZ6aHV2Y357aHWGj46WfXWAdnKAe31tgFpVcXxvc4GFfX93a4iGc3hqdH+Dgnx5e3d6cYl/e3Jnc2Rti4Rsc1tqYHZmSW9vTVxjWFdWeW1iUFN1d1lRVlheYXKFcF1hY21lY15vY1Vec0dDZ2BeZ2ldWntjUlZddltbZ2xiVmtgYG5mZmxwaHB2eI90a46Ndn92eH13gYOBe3R9g4iIg29xf3VxdX2FgYmNi3t3f3iEfH2Fh3iIfH2BfYSAe35ydniLjp+MiXuKd3WDel5+h5qNeoeEdIaHhXeJe2JubVxiW1thVWp0ZGBbaG9wZ4dxYXFmV1xja398ys6HuqJrbm+LbnKFc36GjH97k4V6eXR6dXR6amx2Y4R2koJ2b2dffIB4iodkcYBqanFjWG17hpyJg4Fyl5N2fXpthm9/iIqGcJaOkIiGjIR7eX9ycnB+Z2hyY254cWpscnh9fHldZXqAeGl1eWeCd2h1h4yOlX1zh2pvfoB4bn1dV298bHN+iHqAbm6Kf3B2ZnZ/gH6AdXpveXKFenhxZXJgbYyBa3JYa195XUlwbE9YVl9VVnxrYk9UdnNSUlRXXmN1hmpdYWtrZmNab2JZY3FIQWldYWdfXFV7Xk9WZnFaW2poXVhoYV9yZmpocWdxc3aHeW6VinV/e3h+eYOHgHVzf4WFjoNwcHt4d3V5hoWHjIZ6fH91i399hoOEh39+fn2Gf3x4dnl2kpSffo19i251gHpkhIiYhnSSim+FhoJ6g3VjbmpZX1tdXVVoc2VgWWRycmeBcmFrZFdaX2l/eL6ue6C3bmJ0h2l1fXN7hYh7fo2Ad3hzd296dmVqb2GHdY6Bc2piXn13eIqCZXB9Z2trW1ZveIukgYV/cJmScX92c4BsfoCPhnKUiI2IhYmFfXl1c3BpemFqbWFtdmpna2t5d3p3W2d9fHlmcn5uhXRmdYaNhpaAcItna3uCdG11Ylttempzeol6gGV0hnxtcGd0fnd9fnB6anl5f3h2b2RsYWyJfWxuVmpheFZMbG1QU1BpTll9aGJPVXZsTVFUVV9od4RnXmFxaWdhV2ldXWxqSkVsW2JlV1lUeVpOV29rWV1sZVxaZWNedGZsZXFnc3B0gXhwmYV2f394f3yFh311c4KHf5WDbnN5e3tzcoWGiImEeYF9do9/fYWJjoSBg3p+i4N7d3x3dpqdmHqKg4dqdn59bYWFlYFzj4JxhoJ/goBwZmxnV11bXFtTZXBlX1hjcnVpdnBkZWJXW1tof3BvcoBzimVmen9qdnd1dYWGeIKFend0dm5renBhaGtnhnSNhG5nXl98bnmIfGdsd2ZqZFZXc3COp32Ee3aWkHR7cXp4bHl6j4N1l3yIhoSHhH11cXNtaHVdbWlgbXVkZ2dpem97c1lngXZ1aHCBeIJ2YneFi32Vgm+Ma217gXFlc2VgandmcHWIeXxhdYN2amtxdHpweXdye2V9fX12dW1jZWBshnxta1ZqY3JUTGtsUE1PcEdefGZhTlZ1ZUtOVFhhbHh/Zl5nc2plYFdkWGNyXkxMbFhkYlVUVXNXTVl3ZVpfbGFcW2RlX3dnbWJvanRvcX51dJmBeH+AeIB+hoR6fXaCg36YhW5ydHx7dXGFhY+CgXqLdXSRgHyBlY6BhYR8foyGen6Bdnujpop5iYaFbHV8fHWEg417b4Z0eoV9goN1bmppZVZdW1taU2NuZVxZYnR7amhtaGBhV11aaYBpa3CAaG1iaXt6a3V1dXCHgnqBfnd2bntoanlqX2VuaIF3kIRnZVhhdml9hnluaW9mZl1VWG9oj6h3gXt8kI54dG59bXF0eI1+d5R0hoOAhol2anR3aGlvXG1lXm5zX2dianhoe21bbYNzdGpvgX56d2F3hYV6kYZziHJwen9yY3FoW211ZG5xhnp3YXOAcGhqeHRxa3d2c3Vignl9dXRvY2JibH18a2tVaWJnVExuaVBIUmxFYXlmYk5Ucl5KTVVaZm14e2ZfbXFqZF1WYFZwb1dKVGlYZ15YTlZsVEtdemBcX2xdXVtiZWB6aGxhbnB2bm93dXqYfXeAgXmAgIeGenl6g32Bk4RxdHR/enZ0hYiQfoF9kWxzlYF7gp+Ff4d9gH6GgoCKe3WErJ9/eoiIhGxygnp2gYCCdW+Ib32AdIqAam9uZWRYX1paWlViamdcWl91gmlebWxcYVZaW2uBZXJ0fWpqXm14d2h1eHNvh3x+fnp2c2x6aGl3Z11kc2d6d5KAY2NUZG9mgYR1dmZoaWFXVlloZJCob393f4qOenBue2Z3bXmKenaOcYR+f4CHbmR3dGVoaV1sYl5wb1toX211ZXpoXXSAbnJrcXt/dnVidYaMfImIgH94cnV+dGFwbFhwcWFub4J6c2NxgGxhbXtwamd5d3NwZIR0eHh0b2NgY21zfWpsVGleX1VMdWRRSFdiR2N3ZmJMVHFZS0xYWWlsd3tlZW5yZmNaWF5Zd2ZUSV1kWGlZWUlXZVFJY3lbXl9tW15dYmRef2lqYG50eG1vbnaDl3lygYB9f4mMhn51doZ4hox9dHV1gnl6eoKLjX1/hYlqdJaBe4qdfX6FeYB7fnyGiXNxj66MfHyHkH5mcYh6dH59d3Nwhm18fm2QemNwcGJlXWVWWllXY2ZrYF1ddIZoWXBtW15XWVtse2Jxd3ZtY1xudHVodndyb4Z5f4F6d29vdGVodGVbZ3VmdnaReV9dU2VlaoGBc3xhYmlcVFheY2SQpWl5dIKFkHdsbXhmd2x7g3l0h3KBeX15gGlmd21hZ2Ffa2BedWtZZl1vb2J6ZVt3fGtub3B4eXR1ZXODk4CJg4l6dm9yfXJheGNZbm5gb3B/enNlcYBkX252amNmeHpybG2Bc3F7cXBhXWRtb31laVRoWVpVTnpgUktaWUhjdWRhSlVuVUpMWldqbXN7ZGxsdGNhWVpcYndcVEtkXllqVFdIWWFOSGt3WV9hbltbX2JjXYVpaGJueHltb2p2gZB5boN+gIKSiISBdnWJdIuGdHF2doF3fX1+jI+Bf5N+cHiWg32ZknmAgHh5fn9zh4RzcJmie3t/iZZ5ZXWIenN5d2x0cH9seXxwknNecG9hZ2JsVFtaV2lkbWZcXHKJZVNybVtZWFdgbHZjanVqal9bbnRybXV0dWuHfX+BfHdvbmxkaXBjW2tyZHR2jnNcV1RkYHF+fnCAXGFjXlNaYVxkk59lcnGFg5Bza2l4a25ueXl6cYB2f3N7entkZnZoXmNbYWhcX3doV2JfcGhhd2FbfHZqanJueHR0dGlxgpaEh3+FdnNqcHxtZndXW2lsYW9xf3hzZW9+W2FxcWJfaW98a2pyfXBvdmpwYFpka217YWdUZ1VYU1F4XVNQWVJIZHRiYUdWbFFJUFpWbGxsfGVtb3JhW1pYWm1xWFNQZ1hXalRVRlpdT0lzdllgY25jWGFhYV6MamNlbXp5bG9pdnmGe2uEfYCFmXyChHl9iG2PhnFvdnp9dIKCfYuPg4OXdHiClIWBn4l1gYCBdH+CcIeDdm+il3R7hoyHe2Z3i29ufHBneHF7bHN2c41rXnRvYmdma1NeXFZoYmxsW1xxjGROb21cVldVZmlzaGN0ZWVeWnB2b3F2dnpsiH1/fYh3kHNjZGtvYVxubWNzeIdrWlRWYmN3e3xvhFxjXmNUW2BaY5eVY25wgoWJcmlmeG1kcnVxemt5dHVve392X2dzZFxfV2JkWWJ1ZVVgYW1kYXFdXX5vaGlzcXRxdXZsbYWUg4p8hXFyZ258b3FvUlplaWRwcn90c2JtdVVjcmtcXm5ke2RrdXxwcXFpbV9YY2lqeF5mVWRVV1FWb1hSV1RQSGVzYGJGWGtPSVlVV25pZXxpbHlrYldcVlx1ZVRTV2lSWmdVVElbWlBOeXdbX2VtalpiYV5ej25iZ2x6dm5vaXZ2f35thIB+hpd7f4eBin9rk4hyZ3SAe3aAg36Jjn+Mk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgo2Md3hueo1gZX1xZ3p0eW1tcXeDZ2R8bWNnZ2hTYF9VZ2Bsb1xebo5oTmpsYFVWU29nc2tmeGVmXlpydm5zfHl0bol7gHece3prYWVsbV5gbmplcXl+Z1pWWF9seHp6boJeYV1oVlhgWGSciGJrcIGGfHZraXVrW3VwanlpdXJub3yBc1lrbmBZXlZjZFllcWNUX2JpYWJsWmB+a2ZsdHVvbXh2bGiGjYCKe4htcWZwe2xxbGFYX2dmbnJ/cnJeaWxTZnFlVmJtYXhhb3R6dGlua2pfV2BmaHVcZFZiVlRPWWdTT11PUEhlcF1jR1pqTkpgTFltZWB4aW+AZWBVXlRedlxVU2FnT15jVVRLXVpRWnZ2XV9mbWhYY2FbXo5xY2hqeHJzbWd2c3mDc4KDe4iOfnyKiI56bpCKdGxzgnR/f4iFh5KElY96fYyPiJGbhIB8jYRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6NjY2NjY2NjY2NjY2Njo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjY2NjY2NjY2NjY2NjY2Njo+Ojo6OjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQ0dkaGdnZ2dlkKKgoKCgpV4qLi4uLitIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU0OVxgX19fX12RpqSkpKSqVhUcHBwcGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX59fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4aJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGiImIiYmJiY2Pj4+Pj4+IgoODgoOChYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpORi4+KipCJj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2NjY2Ojo6OjYyMjIyMjI2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIuFh4aLioWIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQiIWFhYiHhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCIhYiNiYSGiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfnx2dnh8fHt8fX19fX1+fn5+fn9+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuEiYiHiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4enx6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4qOiouOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH5/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/gH+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f4CAgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/gIB/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX5+fn9/fn59fn5+fn5/f39+f3+Af39/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTkpOTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkpGRkpKTiIWTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkoKCkpCRkY51hpGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/fn9+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QiHCFkI+QfHWIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+PkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+Mc2+Kj4pyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH18fn5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI13bXuPgnN4ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh3Nub4R7dXaAhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWVhYV1RQUVJTUlNNTUpJRkVISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/fn5/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnd0Yl5kX2FrcWZoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9+fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGJdamxdZmZnZWNjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISUpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aWmp3bWJuc2phWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01ba3JsYW51cmZRUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTl1jb2tZaXN1cFNNT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQkZIVWJobG9wb21sWkxMTk1OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3R0dHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgm9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQ0ZHSE1aZ2hncm5uaGZkYF5eWExKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz5JWl1bXGVsbmtvbW1sa2loa2RTR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh6fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gICAgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs9S1xpbW5vam9ta2psbWZRR0VER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GBgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs6PUhjb3NtbmxrbGlVQz5DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdHJxdHh4eX1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OT1KYHNzcGhUPzo7PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PDpCbH1qQDo7Pj0+P0BBQD8/QUBAQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtbbkA+REU/QEFEX2Q7PT07Oj0+QUFAPkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkdWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6Om13STg7Oj0+QTtIZD08PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI9PD1JTEZFdXZONzg4Ojs+P1dqQTs8PDo6Oz4/Pz09OTo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeko7XH+Df3p8d1c8PT89PT5FaHRMOj0+Pz08QVNEPzw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BvcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBR3J6a2KDhIOCg4B9Xj5AQ0BAPUpze1k6PUFFQUBZYUdDPT1ARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXR3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBFb3R9goKBg359hHZNQUNFQD8+WXuAXT9DRUlKSWpmUU1FQ0dGR0VHRUVFREVDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISkxOaWdbW1ZMSE5NSElISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIRkhGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hMTVZlZGJgZWBOX0lHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiEVmyFh4aGhoeIiId8UExNY2ppaGNmaGdfQEBDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERGR0lKSUpISEhHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKVIGDhISCgoWGhoSChoWEhIaGhoeHhop1SU1tdW1qaWlpa0k6PD47OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1LR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYCAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSUllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI9mUXV4dG1tbm9sRDc4OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUdPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjYptdnyEcW9wb25LMjY4NzM1Njg6ODc2NTY1Njc2NzY3OjY3ODg5Ojc1Nzg5Nzk3NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA2Nzg4PTo9RUNCZYWDgYCCg4ODg4OGiYuKiYmKioqKi4qLi4hyc3xycW5vbkQzNjg4NTU3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3NjY5Ojk4ODY4Njg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4OEhISFhomKioiHh4iIioqMi4qLjYVsaGxveX1mPjs7Ozw5Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PDo+Ozk7Ozw7PDs5Ojw4Ojo6Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3VzdXh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLioyNj39mbG95fl5FQ0JBQj5AQ0FAPj0+PkA/Pz9AP0A9PT9CPkBBP0A/PUBAQD4/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVCQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uLjI2NjXlwcm92XUtMSEhIRUZIR0VDQUBDRURDQUJDQj9AREhFQ0VDRURBRkVGREVGREBCPjxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYWGhoeJiYiHhoaGh4mJiouMjYyMjIyMjXxzcnBYTFJMS0tJSkpKSUZEREdIR0RERUZEQkhJS0dIR0ZIR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0A9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2NjYyNinl3dW9jUU5MTktKS0hLR0RHSUlJRUZJRkZFTExNSUpHR0hJSk5NT0xMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f39+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozs9Oj5APj9AQ0ZJSVBfgYOFhYWGhoeIiIiIiIiHh4iIiImKjI2NjIyNjIyOhXl8eHJZTk1OTEpJRkpJRktJR0tKSUpHR0dLTE5MTUhISUpNUU5PTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVG5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhISEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIyMjIyMeXJiXVtQUE1MSUdESEpITUxHS09MS0pKTE1MT1BOSElLTE9RUFBRT09KSEpKTEpMRkdIR0ZGSEZFRUJBQkJcb3J3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyMjI1/YFxXV1dVUU9NTEVGR01QT1BXVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NTE5HR0pGRkhKRURFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUJAQkJHVk5GTlBQVFh7hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjY+MjItuX1ttZEhVU1NSSzs7U1RTYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUtMS0hISkhFRklJSUhJaXJ2eXh5eHp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdHRkU/P0FBRUFDR0VERUxYUk1UVVZYWnyGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox+YYqLi4hyYWhYPVtaWVRSP0BXVllcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhVVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh4enl6e3p7fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhoWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJi4x8cnNbXl1cU1VTV1dVW1p1g1lVfZBhXFhdX1dJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4mKgW6GiYiHhIuAaVxcXVtWV1VYVFJYVmOWgFJlclhaV19oUGBmW1tYXGdhR09aaGddW1xdXVdST1NQUFJWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fX19f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUVBSUlJWU1ZUV191eICFhISFhoaGhoeHh4eIiIiIh4iHg5GOiYmIhoWIiIZ+gH1gVFhbVlRWU1JSTVBNTGZ6W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbXFxeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x9fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt/fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiYeGg4eHh3pvc1pNTlFRTU9MSktFRklGQz9UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t8fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXlxZVVBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdmFeT0ZBRUVERENBRVFDRUFDPkNJR1ZASE5MR11pUEhGTkZERUZJR0hCREhHSUtHREJBREBPUU1TZHJ0dnVzdHV6fHt7e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5/g4CDg4KAgoCCgYJsT0lCQjw8PkBBQEA/a1FLYEVGSElFQj9HTE5HTVFVSUFFPz88PTw9PT89P0FDQ0A/PT1CPkpOR1VudXR1c3R2eHt8e3x8fHx9fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsampmYFtRUlpcWV5KSlBRTktMUVJRVFZVV1FRV1VQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVEQkJCPjtDQ0JCREJcXU97Tk9PTktMTU9PUUxLTVdNSEdAQTw5Nzc1OTk9Ozs7ODo4Oj88Qkg/XHN0dXV1dnd5fHx8fXx8fX19fnx+fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QX11aSUhQUlFPTVBRTlFSVFZYU1NZVE9ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhHSEhDQkdJRkZGRE1SUGFXU1hRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVldeWlhNS1RUU1BRVU9MUlNUV1hUVFlSTVdZWlZYWFZYWV1XV1hoc2tdVmFza2JhX15kYV9eWVVRTk9PTUlISkxKSUZDUVBTW1dUVE5RU1lTXGVVT1NUUk5LSUhDP0E5OTk4OTc4ODU3NTc4NTk5R21ydHd4eXt7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFNVV1RVUl1uXlJOWl9bVlk7RFZYVFtmSkxQU1JPTk1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8/PDo3ODc2NTk5Njc2NjVXcHBzd3l6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xdUlRaVldVVFdUUlhYWVlZU1VPSkdPUE9PTVJKUFBPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQU01JTEpPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5oaWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtIRkxNUE1HL0VfUj4zPz5qb2FTUlFAR1RRUFFQUU5RT1FQTEpMTE9QT05QUVFOUE9KTE1NS0dFRURCOz09PDk9RzY2NzdEbXB0dnl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1RRU0FHVVBPUVFQTU1PTUtMS0xOT09RTE9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2ent4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9PTVFTTFRVVFhXVUxMS0k8OTg3Oz5APjw9QUBCPT5FSEdDRUZJR0pKQEZBQUBGSEVKT0hRUmJcUVBST1NPT1BMTU9OTE1NTk9OW1dLTVFPR0lIQ0hKTExLRkZGRT9CQz48Qkc/Qj9BZHB0dnp6ent8e3p6d3t3eX5+fHtxc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRD05Nzc5P0I+Oz9CQEA+QERJRUNHR0pHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTktMTk1NTExPTlNkTkpMUklJSUVBSEpMTU5KR0lHQkFCQD9FRkVIREtub3Z5eXl7e3p7end0eHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4Ojo/Qj88QUJBQURFR0tGQ0hIR0dIQ0M/Qj8/QEE+REVDS05SVExKSU1URklJSkxKS0xJSk1NT1BSUEpHQ0tHQ0JJSUxNT05JSklHQ0NDREhKTUxJWXJtd3l4ent6eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxR0tER0hIR0pLSUpLREZCPT49Ojk6O0BCPz1BQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESEpMTUhKTEhJSkxLTV1SSEhETkZBQ0pKTUxQTUtNSktGR0dKTk5RTkxibWl2dnd6eXt6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0RGRUdFRkZHREdCQ0A+PD05Ojo6QENAPkFDREVJRUlKTEZISEdGRkNCO0FCQz5AQ0RDREdMTkhLTkhESEVJTU5NR0lMR0ZHSUlMTktJR0VOSEJGTUtNTE9NTU5NS0hISU9SUlNOUmZmZnFvc3h1e3l8bGhqbmVrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJREZGRUNDQ0VAREI+Pz46Ozs9Ojw+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9RERCPkFDQ0NER0hJR01QSkZGR0tOT0tGSElGRURFSUpISklGSE9LRElMS09NT05PT05KSklMUlVVUk9XZGBhbWdxcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRDxCQT5BPTo6PT87PT5AQj5AQkRHSkVJRklIR0ZHRUNCQUFGRkNCQkJERURHR0lGTFFMSU9KSk1MSUdIRUdFRENJSUhLSkdLUk1CTk5MUE5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JlZmZkaGhmbmpmbW1oa2ttcmlxdnRzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3d3Z0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQURFPEFAQEM8ODo8Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0dFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUk9QUU5PTU5QTUxNU1dWWFhVWF1aXWRgaWJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkU8P0JCRDw3Oz09Oj46QEI+Pz9DRUZERkRFSEVERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdOS0xLSEpMRklJS0hFS0tMTU5PUlRPSFNUU1BST1FNTlFOTVBXWlZaWVZaXVpYYWBhYF5oZWNgZGZoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V3dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TkhIR0lEQkNIRTxARUJFPTg5Pj49PDxBQjw/PkFBRkNGQ0RJRERFRUZHR0dJRkdLSERJSEdJR0ZESEtJR0tITUtKS0xITEtNS0lNS09OT1JVVk9LVVZTUFNRUkxPUVBPVFlaWVxaWVteXl1gYl5cYWNrYmBkZmdyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRMSUtJS0ZCRUdFPEBHQ0RAOjw/QD8+P0JBPEA+QkFGQ0VFRUlFRkVHRkhIRkhISUtKRkpISEtIRkZMSUhISkdMTE1MTElNS01NTU9MUFBRVVZXT0tWVlVTUlFSTE9SUlBWW1tdXltcXl5eYGBhZF1jYGVmYGVoamRzc2ZqZ2drb3Jxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkZHSUZKRkdESUhHSUhKTEhISkpJTEpGSktISUtKR0tLTU1KSk1MTk5NUEtPUFJUWFZNTlRVVFJSUVBNTlRTUldbXV5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S01MTE1HQ0NBRDw/RUVFQz1BQUNCQ0NEQUNEQUFFR0NISElIR0pHQ0hJR0hKRklNSElKTUtOTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQERCRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSEpJSUxISkpOTE9LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDRENFRURGQkZGR0RFS0ZGSk1MS0xMR0dNSUdKS0hLS0lLS05MTUxMTElMTUxbc2JkcF5sbVVNTmZzXWZmcWxudGdwaV9hWW5uYnBwYmtqamZvcXRldG5vXG91Z3BNSnF5dmthYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wc3V0cXNzdHV1dXR3eHZ0dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQ0ZDRkVGRURDSEhIREVLSEdMTk5MTU1GSk5ISktKSUxLSkpLTE1OTk1NSk1NTltyb29ucHBsa01QUWxXTWlidHJwYW1udVxZbFBcbm1acW1rb214eHRzaXBdX3JrcWpVdXl4b2Nea2ZiZ3BvampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkhDR0RJRkVFQkZJSEhFSExKR01NT0xNTkdMTUlMS0lKTUlLSkpLT1BPTkxMTk5MXGhkdV1scVdsTlBRbVRZa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDRkRIR0xIRUNDSEtJSEZKTExGTkxMU1JMR0xMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXJrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJpbXR1cHN1dnNxcHBxb3F0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b250c3ZzSEtISUJFRUVBQT5EREJHREhJTUlGQ0ZKTEpHRktOTEZPSktXUktHS0pKTklISkxJS0pISEtNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam5fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcXBudHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcXZ0d3JHR0ZJREVDRkFAQkZFREdCSEpMSEZDR0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJRktLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9OUU5PUUpKT1BRZHFpVFlXXFtcVllbXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDREdFRUFFQ0BESERGR0NJS0xIRkRHS0xJRUdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUhISUVGTElKTE9NSlBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUktZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRhYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRyeHJ4c3FydXJ0T0JDRExNQkREQkVJRUhHRktKS0hFRklKS0ZFSEhQS01NSk1SSUdFQUhGSklLTEpNSkhGRElGREZHRUZLSENKTkxMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaGhoV/dXFwcnJzdnl5enl5eHh4dnJ5dnhycXh2dXZhU0pKTUlFQ0JDR0hGSEdIS0pKSURGS0tLRUZJSk5LTktITE5HSEU+R0dMSUtMS0tLSUdESERDREVBRkpFQUtMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWFVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0eHl5eXl/fn15dXl2dnJuend2eFlRS0ZDR0VCRUhJRkdISEZGSUdIR0lLSUxEREtLTk1MS0hLSkhJRj9HR05LS0tNS0tLSUZHQ0RAREFISUNASktIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFFbV1pgX11eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0dJR0ZGSUxKTkZES0pNTkpMSUtKSElGQkhIUU1MS09NSktJR0dFRD9FQ0lJQ0NIR0VUXVleWF9ZX1tdVVhYT11dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSWl1dXV1eX19kaGdsam5ucHt7fH57gIKDhIWEhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4iHhYOAfHhcU0tDQUhGREdNUkhDUUpFR0hIRUZLSU1QRUZJSktOTExJS0xJSUhESEtRT01NUExMSktISUNEQUVESUdDQ0hGRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdT1lhXGBgX2JjYl1hYldgX1RQT09PV1FcW1tcXF5fYmZmZWxlb293fHuAe31/gISEhISEhIWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlKS05MS0tMS0lKR0VKTlFRTk9PTU5MTUhLQURBQ0RHRUNDRkdCTUhCS0tPT05MRk1GR0lKSEdMTE1PUElMT1BPU09MUFNSVVpZV1lYWGRXT1NUUFBOTU5UUlpYWFpdXGBhZGVjZ2NrbHBzcnl5f3t6f4SEhIWEhISEgoSAfnuBg4F9e4WEhoaGh4eFhYWEhISCgYB9S0lFRUhGR0RLTV1MR0dYTEdISkhHTUxRUUhMS0tLTk1VTk9KSktHR0tQU1NOUE9OTk5OSEtGYEVEX0xFZ2RGTlxJXltybU9NVW1ZTERQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUZHRkhFRUtPU0lKRmBUSElPSklPTVJRS01MTE9SVVJPT0lMTUdITVFbWU9QUE5PT09JSlF/UUl8WVlydFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1puWF1WXFhVa2hVXVZjWmBZW19WVlh/anR1dV5fdl5XYVtbZltfYGFgYV1gYWdtcGxgcHd0eIGBgoOEgn99f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExHSUtFUlZMS05JS1JYV1FNT09MUVROT1FPS0tOR01QU1taU1FST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFyb29vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3NvcnJ7fG9+eG6Acl9gYGJhWmBfZ2tua2JsZmdtd36BgIJ+e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTktHYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOTE9IUVJUWVdWUFRQUFBRS0hneGxjeHJtW0tOVnlwdW11Ym92UGVlSmZ2cW13b4BqZnh3aVdyUWh6bWlqenp+bHh6f29ob1l2dmp2dXCAX3JmfWlseHxvXl9fYmFbXWJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3F5e3NydXl+gXN1em58fXl4cm5OS1N1TkNCRlBPSEpLSUtQT09PTVBaYFpYS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXlxfZGRpZ2hlZV5hYmlpaWprbm9rcW9tanBhY2Zjb3d4b21wc3l+bnFwa3t6dHJvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWFVNVVlVZVhSUlleU0xOSVRUV1dZV09TTk5OUUlSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfWnB6e15genNjcm94cWhkfWlyfF5VTGxgdnVraXV7em1+eGt8cFxeXmJbXmFkZGdlZWViWmNjaWtrcnNydmdsaWhkZ2Fha2Fnc3JsZ2xtcnxrbWhre3RtbWttT0hLS0hKSEhRUExOT0xLUlJST1NSV1JWVFBXWlZWVFRUYV9QTk1LVFNUUVZWTk5MTU9QS0hRTlBVTEtMU1RUU1RQVlVRUU5RUVhZUk5QVVRYWFhbW1VSU1dbV1hYWk9TVVdYWFJeWVdeVlRQWVJXV1dXWF5aZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2JnZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2p1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PTE1WVFFOVVNOT01MUVBMSlJRS1FNS0xQU1VTUVJTU0lITE5PUVJRUFFUVlJYV1xXU1JQUlRVVlNaUU5TUlhWVFlWVVpWVFJVU1RVV1hWXFleYF1cWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGlnamtlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBKTldTUE5VUE5RTkxTUE1PVVNOUk5NT1FVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1ZWWVtUUFRVWFVVWlVXWlZTUldWVVdbWFpfXFVYXlxeXVtdYGBdW2JiY2dmZWRiWF9hYl5gZ2RmZWFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNiT0xNTFFRTE9UT09TUU9RW1lXV1hbWVhYVl1qZFZYWVpXVlNTT0pOVlRQT1VQUFBOTVJSUFJYVFFRT01QVFZPWFJUVVVPTk1RU1ZVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFZWVlZZVFhYVlNSWVdWWl5ZXV9eVV5cXmBcW19fX15aYmJkaGdkZGJYYWBiXl5mY2RgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1hWVVdRTE1WU01OUk9RUk9MUVNSVVpVU1BQTVFYV1JXU1NTWE1PT1FUWFZVVVNVWFhbXl1bW1ZRTlVWVVtcV1JTV1ZXWFZUWVtVVFJaWFdcXlpeX2BVYVxhYV1gYl9cYF1jYWNnaGRmYFljYGFfX2VkX2BiW1pcW1xZWllYV1xaXFtgXl9bXl5hYF5iXFlgW1FOT05WUVBUUU9UVFNQV1xcXFheXF5XXF5qcXd5gGNcW1VVV1BNT1ZTTlFRT1JUUUxSVFRZW1dVT1JPU1hXVFNVUlJaT1BSUlZbVldXVFZaWFxdW1tdVlNNVFVVW1xWUlVWVlhZU1VaXFVTU11YWl1eXGBgYFZhW2NiXWFkXlxiYWNfY2ZpZGZeW2RgYWBgY2VfYl5ZWl5bXFtZWFlWV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdcVFdXUU9SWlNSUVRSVFVUS1JXVltZWlNPU1FWVldUT1dSU1pSVFRUWF1XWFlTWFxYXl1ZWl1UVU5VVldeW1hSVVVZWVlVV1pcVlNXXlpdXWBdYmJdWV9bZWFfZGReXmNjYV5lZmlkZl5dZGFgYWFiZGBiXlhaX1tcW1hYWFdXW1lbYFxbW1xbWFpbXlZeWV1RT09SWlBaVFVWVlRUVF5eYF5eYlxgVV1eYmt5dGx9a1pVWVRQUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWlVaXlhfXllcWVFXUllZWV9bWlRVVlpZWldYWl1XVVteXV5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNOUFZZUV1VVllXV1VYX19hYWBjXV9UXV9iZWV1gXpoV1lZU1VTVlxYV1dWVlddWE9VXVpeXVxUUlhTV1dVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVhUWVpaYVpcVldYW1pbWVlaW1lXXl9gX2NiYWRkXGJcYGZhZGZkXl9kYmJbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5TWVZTXFRWV1lWVlxgYWJjYGNeX1ZbYGRhX3p1b2hZW1lVV1RXW1paXFlYWWBXUFVeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19aXV5ZXVVSWVdZWV1iWl5XWFtcW1xbW1pcWlpfX2BgZGJjZGRiZFlhZmNmZmVeYWJgY15iY2lkY2dfZ15hYWNhYWBeX1hUW1paW1tYW1hYXFtaW1hXWVhXXFtbYF1WXV1TT1ZZVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXltcWlZXWFlcXF1fW1lbYlZUWF5dYWNcUlZZUFdXV1dXVlNVVFhcXF5gYF1gXFdhXlteW1peWFVYV1tbX2BcX1hZXFxdXl9cW11ZW2BhXmBlY2RlZWZiWGNlZGhnZF5jYGBlY1xlaWRlaV9mXWNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1lYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXF1eYGFgX2JeWWFdXV5ZXF5ZWFVXW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmVjZWZlZmJaZGZmaWdiX2NeYWZkWmhoYmZpY2VeYmJjYWBgX11dWlhbWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lWXFtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRdXFhbYmVjYVJcWk9ZWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXVlZVFhdXV9gX2BcW15eYGJjXVxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYltjZ2BcaWhiaGllZGBiYWNhX2BfXF1cWVxZWFdYWVhXXFpaV1dYT1haXWFjZmZya39KWVdcWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWVhVW19eXWFiYF5bYGFiZmNfXVRdYGFjZGRmZWdlZmZlXmVmaGhnZGRgWmVnXmFnaGNoaGZjYGJhY2JfX19cXVtaW1lYWFhWWlZcW1pWVlZNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeEgoKCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3p6enp6enp7fHx8fHx8e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t6enp6enp6enx9fX19fHx8e3x8e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiJDM09LS0tPYWiUrKysqJWOSjY2MjI2Jf39/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyKlN3m5OTl5etUExsbGxsUXZaRkJCPkYx/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl5eXt4cG9vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9hIWEhISDhHhzc3Nzc3N5fXx8fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z3enh6enl+eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t5eXl5eXl5fH19fX19fXx7e3t8fHx8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnl9fH16e357d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiY2MiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en19fH18fnx3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYOEhIKCgoKBgYKCgoKCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3Z7fXx5e31+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6eXp9e3x9fH57eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHt4ent5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgoGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhYSDhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh5eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3h5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIODgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3t8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGBgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKCgoKBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FxcXJzdHR0dHR0dHNzdHNzc3R0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5ubm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKCgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3NzcnJxcXBwcHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnFycXFxcXFxcXFwcHBwcHFvb25ubm1tbm5ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKAgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXFzcXJycXFvfIJvcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgYGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcIeGcHJxcHOYgm5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxfaGCcHJvi558b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcnF0naF2cXefnH1vcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFxcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGYqJBvgqOdfnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnNzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOBg3lyc3NycnJzcnJzc3NzcnN0cpOppHmIoJ18cnNzc3Jzc3R0dXV1dXV0dXd4d3d3d3d4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn+Afn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH59fHZ2d3d2dXh6eHh4eHh3eHl5n7SppKiol317eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3x7e4mvpqG1q6yjfnt6enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19mKWWorKgmaeTfYB/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/foCAf39+f3+AgIGAgIGAgYGcnI6gsKCfop+AgIGAfn5/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBgJeajpiyoZiWnIV8fn5+gH5+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn+AgX5+n6uklqSbm5agn4Z/fn5/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOCg4OGjZ+yqKKgmJ2dpqitqKCZkYeBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OGjaCtsaabmqCbnpycnaGko52Uh4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KDi5eal5aYoJqdnZ2ampiQiYaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+QkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYaOlJOXmpycm5SPiYeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOTko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4OIkJOOlJiSh4OChYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoGCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRk5KQjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYGBgoOBgoKCgYCHm4eLh4KDgoGAgICAgYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgH+DiI6AgYKDg4B/f4CAgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2JhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf3+MlYKCgYKEg4GBgIKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpGRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSDg4KFgoGEhYSDg4OCg4OEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5OQjYyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGQjIOBf359fH2MnI6AgoGBgoKFlJSMgYKBgoOChZODgYOFg4OEg4ODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJOTko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX19e4GYjICDgYGBgI6UjJCBgoGCgoKRlIGBg4OCg4ODgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBlZ+Kfn6AfYeLfoSEg4SCg4OCjYmFjIKCg4KDhpaVkIyCgoOEhIODg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIOEhISEg4OCgoOQlJOSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIR9homAfoWFhYSFgn99fX2Ag4SDhISLmaCqqJuKhI6Jg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhoaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5GSjYqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/f39/g4SEhYqTmKClpJuNloeFhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYaGhoeGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoWFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYJ/f39/f39/foCAhISGlZeVl5+fnp2Sh4iGhoWGhYWGh4eHiIaHh4aGhoeGh4aGh4eGhoaFg4OEhYWGhIWFhoaHh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuIiIWGhYOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYycm5qXmpybmY6HiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeHh4eGh4WDg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgYyJgYCBgoKBgYGBgH+Af39+e3p/mZeKlJmZmJWUjImJiYqLioiIiImJi4uKioiHh4iIiIeHiIiHh4aHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUkpCPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn58e3yalX+BlpiXlZONiYmIiYuKiYmIiYiKiomLiYaGhoaHhYaIiIiIhoaHhIODhIeIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fYGXj4yYlpiXk4mHh4eHiIeHiYaHhoiHh4mJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYGBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KDgX18fX+Af35+fn18fX58eoKan5yYjYqLg4SEhoWFg4OFhISEhISEhYSCgoKBhISBgoODhYaFhIKCgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42QjImGhIWEhYKBgYGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+BhISDg4OCgoB9fX+AgIF/fX5+fXx9fXt6eYegnpqMh4iAgoGCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICBgIGCgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KEg4KDg4OBfn1+f4CAgYB+fX19fX59fHp7eo+bl5aSiX6Af3+AgH59gH9/gICBf4CAgX9/gIGBfn19f4CBf39+f4CAf4CAgIB/gIKAgIKBgIOBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgYOEgYKCg4KDhIWAgH98fX1+fX1+f4B/fX9+fX6Ag4OCgoKBgX99fX5/gICAf359fX18e3t7enp6e46XlZeGfn5/fn5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/f39/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6enp5f5CQj5GRf39+f39/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9+fn9/gIB+foB/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6enp5go2Jj5aHgYCAgYB/gX+AgICBgYKCgH6Afn9+fn9+gYCBgH9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhYSCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFgoGDg4OFhISEhISDg4OEgoGCgoKAf359fX1+foB9fX19fX19fX18enp5eXl7iImHh4iDgYKDgYCCgIKBgYODg4OBgYGAgYB/gIGDgYSCgICBgIGBgYCBgIKBf4GAgX+AgH+AgIB+f39+fHyJlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgICBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWEhIWEhYaGhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXl8goKEhYOChIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgIGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgYGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHh5eXp+gYJ/gouEg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4OEg4KDg4KCgoKDg4KCkZCLiImHiYeGhoSGhYSEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4eHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5enx/gH2Gk4ODg4SElJOAgIF/f39+foSLgH+BgISGkImFhIKCgYWFi4OBgoWFhoaEhIWFg4SEg4OEg4SFhIiSj4yJiIiJh4eHhYaFhISEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6enp7fYCCgYKBg4KAfn1/f3uIkXx8jpZ/fX9/goaKhYODhIOCg42Jf31/g4SFhYOEhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDhIOBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl5fX5/gH+Bf317fH9+fYKVkX+EiH18fn+ChHx8gYKEg39/h4N9goGAgoKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OEhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx/foqCe3p7enh6e3t8fXt+fn9/fn5+fn18gIGAfoaPgX59gn5/foCCfHyAf4KAgYB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIyOjo2IiIeFhYWEg4KCgoKDg4KCg4OCgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF/gIF9f3+Af32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt8fHx8fHx8fHx8fX18e318fHx7fHx8enp5e3x7fYWDg4CBgX6Af3+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fn+AgH9/gH9/fX18fH1+fXx9fX19fX18fXx9fHt9fHx6e3p8fX1/hoWDgICAfX59fn9+i4SBh359fHx+foKCf319fX2BfHt9fH6BhIOBgH5+fn59fH5/gH1+gH5/foSSjY2Mj42LioaEhYSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fX19fn6BgYKDgHp+fnx+foCAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1+gICDg4J/fn98fHx9fH2Bg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39/gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8fYGCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoGCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXt/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fHx9fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJGPjYmKh4WFg4KCg4OEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4B/f39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fX18fXx9fX19fX58fXx9fH19fn1+fX19fXx7e3t8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkZCOiomGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgoKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fX19fHx9fX19fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eHl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoGAgIGDgoB/gX99foB+fH9/iYJ/foKRhISDgX9+fXyNh319fn19fH9+fH19fH19fn59fn98fXx7fH1+fHx7fH16enl5eXl6e35+gIGDh4SIj46Li4eFhISDgoGCgoKCgYGBgYKCgoGCgoGCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgoGDgYCAgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH59fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImOi4yIhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgYOBf4CBhIF+foB/fX6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fH17e3t8e3x8fX18ioqJiYaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KCg4OEg4WGg4KBf3+AgoB/gICDgH5+gH99f4B9fX5+gIB/gn+BgICAgIGAfX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt9fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoKBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKCgoOFg4SDgoOEhISDhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX6Af3+BgIGAgICAgYF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhIOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SFg4GAgIB/gIF+fX1+f35+fn6AfX1/fH19foF/gICAgoCAgYCDgoB/gH6AgX+AgYCAf35+fX5+fX9+foWFgYGBf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/gH9/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/f3+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9/f4KAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX57e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYWEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Ag4ODgX9/gYGAgoGBgYCAgYCAgICAgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9gH5/gH1/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISDgYOCgYOBf4CBfn6AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYGDgoGBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fH1+fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnd2c3SGhISFhYKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fX19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fnl7eXh/fnt8fH59fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYGCgYCBgX2AgH6AfX59fn+AgIB/f39/fH+Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gH+Af3+BgoGAf36AgX5/gIKCgIGDgoSFhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn18f32Afn19f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOBgYOCf4F/fn9+f4B9fX19foCAgH9/f398gH9/gYCBgIB/fIB/fn5+gH99fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV4eXh4eHl3e3x7e3t/hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GAgH99gH5+fn9/fn19foCBgYB+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgICAgH1+fn+AfXx+fH+AgYCAgICAfH9/gH5/gYB/f36Bf35/f359fXx/gICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7e3x5d3t5d3h3d3h7e3p7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fXx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIKAgICAfn9+f399fH5+gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f36AgIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjXp8fXx7fXl7enp4eoGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e319e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoGAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXx8e318e3x8fH18fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoKCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgYCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH18fXx8fX1+fX19fn5/f4B/fXt8fHx8fHt6eXt7eXlzcnVudnJweHF2doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgH+AgICAf4J/foCBgIJ/gICAgH+Af4CAgH9+fYB/f39/gH+Af4CAf4CBgYCAgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH18fH14eHV4eHl7fHx9e3t8fHx9fn9/f39+fX1+gH9/gYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYCBgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH+AgH+Ah35+fHt9fHt9f3h3dnl5ent8fHx8e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpydnmFhYKDgoODgoKEhICAg4CGg4OEgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgIGBgIGAgYGBgYGDgH+Bg4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99en1/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgHx/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WDgoOCg4SCg4SDgIGDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9+gIOCgIF/gIKDgoCBgoGDgoOBgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH98e3d8eXl5e3p9fn18fXx8fX5+f4GBgICAgYGBg4SAfYB/f39/fnt7e3p7enRxeHF5dHZ4dHZ7hIKDgoODhIKEg4OBgoKEhYSCg4KDhIGEg4GDgIGDgoKCgoKBgoB/gYCAgoGCgYKCgoGAgYGBgoKCg4B+gYOBf3+BhISBg3+CgoGDgYKCgYODg4SAgoOCg4KCgYKCg4GDhIOEg4SFhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF/gICAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhIGCg4WFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKCgH+BgoKAgIKEg4OCgYKCgYOCgoODhIODhICCg4KDg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgIGAe32Bfnx5fHp6en18fIF9enx8fX18ent+fn6AgH+BgYGAgICAgYGAgH99fXx8fXt2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgYKEhoSEg4KDhISBg4WDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgIKCg4OCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4GChISChIOEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH1+fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgoKBgYOCf4KDhIODgoR/goSDg4ODhIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf359foGBgH5+fX59fn5+fn5/f4B8fYCBgoKDg4WDhIOGhIGCiIaFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4OCgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGDgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAf318foJ/f35+fn59fX9/f3+BgIB/gISEg4ODhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChIWKiYSEhISFhYKHhoaEhISEhYSFhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgn2Efn5ydYOCgXZ+g4WAfYF1gXqEf39/f4SEgoOCgoGDhIOEhIWDhIWGhIWGfYR6fX5/g3uFg4GEg4F/fX5/fn6Cg4F9e399foB+fXx8fH19fX18fX1+gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhoSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4CCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoKEfoODfYF9fn9+f4KDgnx/gX1/gH19fHx8fH19fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIKChIaGg4WEhoiGhoWChoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhISGfXB7gXB5dn6Df4JueXB1c3x2eXmGc4SDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX1/fnx+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoOFh4aGgIKFg4OFh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdYJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f359gH6AgH5+gICBgH5+f35+gX+AgH59gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SEg4WHhoSFhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFhIWEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/f3p+fX1/fX9/fn2AgYODgIKDgYGEgoB/gYKAfX9/gX5/fn1+gYB+foGCgICChIeGg4OGhIWEhYeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdweX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH19f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYaGhoWEhYWFhYWGiYqHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIaGhYaEhoSDhISGhIOBhIOEg4WDhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFhISEg4KBfn9+e3x7fnx8fX5/f319f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGhoaFhYaEhYaGhoaEh4aHh4aFh4iIiIiGhYeFhoaIhoWIh4iFh4aGiIWFhoaFhoaFg4KFhYaFhYOEhISEhoSGhoSFhYOGhoWFhYSGhoaEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5+fH19fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWDg4WGhoSEg4SEg4SGhIaGhYWFg4aGhYaFhIaHhYSEhYWDhIiGhIODhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fX18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYaIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhYKEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoeFhIOEhIOEh4OEgYKEhYOBgICAe3t+fnx8fH59fHx8fX58fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaFh4eHhYeGiIiHh4WHh4eGhoeEgoSDhIaFh4WEhISEhIWGhoaGhYWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX5+fHx8fn18fH18fXt8fHx8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaHhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIhoWHh4aGh4eFh4aIiIeGhYeHiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYWEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn9/fn9+fnx8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhoKBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WFhIOFhYaGh4aHhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gHx/fH19fn17fn18fXp6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWEg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhoaIiIaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeFhYaGhYWGgoODhYGAgYCAhICDgHyBgH5+goB9gH+BfYB8fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhYWFhIWFhISCgoCCgYCAgIOBfn5+gHl6fYCDhIWHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4OGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAfIF/fX6Cfn6AfoB/f319fn1/e399e3p5enp5enx9eXp7e3t6fHt7e3t8fX19fH9+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4aEhIaEh4aGhYWFg4OFhIWGhYaEhISEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp6e3t8ent7e3x9fn19gH19fHx9gH99fIaDhoaFhoaDhIOGgoWBgYB/f4CAfn+BgXx+f39+f4CCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDgoSFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoaGhoWDhISDhIWFhYOEg4OEgoSEgH+Cgn99fn5+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/fn5/f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBgoaFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGBfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l7enl6enp7fHl7fXt7fn9/gYB9f319fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB+fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYCBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fHx+fXx+g317fnx9gH+Ag319gIF/fn99fHx9fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pjw+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE9MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1svLy8zLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTU09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88Ozk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkeo2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbLy8zMy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfY19fX2tva2tra2tra29zb29vZ19fX19fX19fX19fX1tfa29ra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU1Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI2Li4uLi4uLi4uKioqIn7u5ubm5ubm4uLi4uLmwi4uLioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlNiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxYUlNTU1NTU1NTU1NTT3eopKSjo6Ojo6Ojo6OllVNTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CQDk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNDS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKaeXFZXV1dXV1dXV1dXV1N6qaWlpaSkpKSkpKSkppdXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw7Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3P0dHS0tLS0tLR0tHR0dzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqomZhYmJiYmJiYmJiYmJegq2pqampqampqampqaueY2FiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ojo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzc7Ozs7Ozs7Ozs7Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Pzs7Ozs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMy8vLy83S0tLS0tLS0tLS0tLS0c3Mzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ozg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7S08/PztDT0M7S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fX19fX19fW1tbW1tbV1tbW1tbW1tbW1tbX19bY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1ZKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzs3NzdC5g4SLx9PAmsvPzs7Ozs7Sq5zPz9K5j77UnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09PD06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Stpylo9TAlLCcsZa4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pzp2ckZ3FpKCLkcOTfX6vsNHOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pjw8OTY/Qj9COjY0ODo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+YoJuzp52HnbrU0s2ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qjo3NDo6Ojk7Ozg7PT89Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9O0mZaquZeckJ+g0tPAoKDQz8/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PTw5NjQ6OTg6Ojk3Oz9APDw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Uq5p+o5KKrK+RobnXr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+OTw5NzY1OTo2Ojw7Nzw/QDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ1Kybp4uYiqGarZup2KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NO2srKlm5uapsWYotGen8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxKKZlpyvnpybm63Hn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT06Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKugx9Wiq6Saz6arpJ7FtKSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLS0A+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTyJKNtNbMk5Cn17mDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWlqW0xfTUpMSlVMRkI8PD9GRUdLST02Njc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTIwdXR1Mq91dLRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QURMTEE+Nzc1Ojg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR09TS0tLT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9PTc4Njk3Nzg5OTs7PT9APDw4OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNBTEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUUE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29va2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODo4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Njg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NjU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozs+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PTw9PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRj44OzcyNzk2NzQ1MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztbW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e3t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6urr7CsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ojs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqainqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZqampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaWlpaWmqKioqKilp6iop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6OTo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs7QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKWnp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9BPzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGgn5+enpycnJydnZ2cnZ6foKKhoqOjo6GioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeYl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QD9CQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3NTc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OSlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqamp6emn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqampKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg5Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz5BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpqaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeSk5KXmpyalpeXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOkpqalpaanpqainZyfoZ+XkZGQlJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWlpqWlo6CgoaGgmZKQj5abmZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoJ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1OTg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpKSmpqWkpKOioaGenJuVkpSYnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg2ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKjo6SkpKSioaGem5qZl6G1npmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqZl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+goaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoKCipKGioqKhoJ6cm5ubmZ+rm5yam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ojc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgpbOsoKCfn56cmZmampuuanadnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpubmpuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgn6aSm6ufoKCem5qZmpmohESAn5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eXlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6gnmKcpp6enJqam5yho1FIhKCdnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52bmqZmXaOgm5qZm52crnVJTIahnJ2dnJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZikgFJ4opmZmp2boKRfVk6HoZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoKGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRcXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmJiZoIhbX5SamZucnKOPZFpNgaKenp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1tMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmZ+XXV12l5qcnZ2igWRZTX+inp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5qcnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZmmBhYICWnZyemHRjVU+Bop+fn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs4Nzk6Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmZ9pXltlf5ycnoxqX1FThp6bnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampeTc2hhVHaTl5yHXFdQV4qSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWjopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGOkpqekn2go5aknG5NUGOGhoKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAhKCdjn5qlKWVnX2IgF9yf4CCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjkzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+f4Cii3ttUXWcjIxacX18fn18ho6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2YmndXTktyk4aDTV9vcXeIhYqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GNo41ULy89eId3dkFEXWtthJCJiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuippxnQltIO3h5a2dFMThabHOQj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqa+PSnKieUF8eGRiUVReSWBuiqGhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6ijeGDB1qVDfI6DdU9ujnZTZH+jqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKenmZ2kpaOinWJ/vcCueaGkmpVlTF94bVF0laKioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqGip6GmrqamnZ5qhJy6jqnRopqzqFhMrZNTZY+gnqCgnp2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKvq6KihXd+fXLOxq+Zpq9rVaqwY1uHpZ+loqGeoKKYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e3tLW2s62urI6Gg26RzLyUlKWWdFRvenNwfZamqqekoJ+jm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyt7u7u7m5wbi0tZ+HeWRYn7W7pqeZiHdrcW94eXt+hY6SmJ2jpaarpaSYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1t8HGzM/OzMm+s6SPcmZSRIuVhYWFfXhxbmdmbGlscnJxcnJ1fY2pxMS7oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWFmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxcfb4+Pay7yuo5WIdFlaUURpd2pudG5rZWVZV11YXGNqamlmYWmLtsHAuamvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d29tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca+zdLVyrmmnJOFcl5RVEtEW2VeY2plYWBoWVRYU1dZWl1ZW3Wat7ystLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnZycnZyZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8LBx8vItpN0Y1VQT1RIPl5sX19lYmBdZGFTVVdWVVVYc5ytsaqoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDubjDm2FJREdLRD1bZWFiaWNgW2NfV1JPUFBXgbS6rK6lpKOopKCgpZmptLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn52Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7d25raWh2WmdzeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExMTCxMGtg09GTUU7TVpdZWxlX1tgWVlTTlWAo6u5tbKsqaOhramsp62frLS0v8O+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnZlZmpqaF5rcG55eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwsaWalhHPz9GXWJhamBaWFdUVneat7+7vLq8rK2mqbu6ube/s7W4ssHGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrLGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FodmhqanVueWxeZFtWYFlMSEQ2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzsXGxr2pclBLMFhTVmVhU05QcanIyMLEx8C8vrSwsLDCvr7BxsC+t7bDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra+1pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjouUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfXhwZ2BrandtaWZ2b3RjXWNVV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwsG8kT9Pd4CKVkxvpcvUxba/v8C/uru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eYBzcGZlZ2RsZWJrbm9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28xad3a4KQl2+ryMjH0cGvvb24ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZWJhY2RkamNnZFtaWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwLq/wLy7xb26wMS/vb6vc2R9kYqK0cW/v8m/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe3uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWNjaGtnZ2pmal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjbi/u8O1use2tbi6vLi5tqqkmI1+hMm/v7vBvrnGvcK/vMW4tre0uLa2u7u4trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZ3BqZWxoWVlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxHeozL3Ht7m3rba0t7mztbG9ycSUSXvKvr++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h31rbnFncWt0ZmNuYFxVSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1q50gLvIz8LAuK60tLu9t7mxvcPKjUN1zcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFyZmxqb3VveWRoY1xjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLGydKZcXKr0dHMysS1ur/EyL6+tL/AwXhSbsvGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdHBtbXRsbW9gY19iYk5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MO6vrzEvre8wL/Jz8fIysrChnJzo8zMy83KxsLDy87BvLi9urFvY2K7yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFkXF9gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vbw762vsC+vrqmnKmytsO/pXl1eJnEx8vIwcPAwMnKwb+7ubGgfHJsrcjFxL/Awb/Lx8PAyMC6wru5s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLhtrc69trnAvKx9bmhubXKBlZhzd3yXvb/GwLnAvL7FxL29uLGwmJB9gJvKwsO8vb+/w8O/v8e8vMC0s660tLy+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3FvalxgYVpUUUFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2zdoGzvba1wqWHaVpeYE1SW1puc3eAn7i4wrqzu7e7vb+6u7uupJuYh5B+wMTDvry/u7u4tsHCtb+6tK2urK+9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vLSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dnhucmFfZ11bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJqIR4iqCvtZ1qZWdWWWBJSU1QU2x3hqWwt765srWyu7m8trm+tJacpZWhca7JxMC9v7mzrrK8uq67tLOlqqasur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cm1gZGJcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xaqIfHWMoJlgVENYVUdhalZPRUpgjaCsr7a6tbSyrLy5uLW4wb2LmLChpXKly8K/ubq1rqWss7GmsrConaCepK22tMG2tbOlp6qosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfHB2c29kXmhZXV5TT05CP0pDQUtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+1kYJ4iI9vTko/ZFlCTneAlGpOQV2BsLWztbK0r6y7uri2ub/FdYOqnpljqb+4tbKxra2fpKemoq6mnJWYl5meqK24q6qqnqSopKuur6ewq6+xsa2xrq6vubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnRtdmpsXVxrVV5cUE5IREdNQkdORzg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR7WEZBTodZSkpYd42BY0FTo7mztLKwsa2wubi2u7e6vI+hsqujcqywqautq6OooJ2dpZqFn5SQlJaOlp2nraOio5+hpqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlpdXRvZVViZFhdUk9NSUBJUkROQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmZmVaU5AUnhxUElJS2ecgVlFUq67sayzr66srba2srS1rqimn5qbnZ6mqJ6gqKmfoaeWn5FVgZ6RjI6Ui5WZoqefn6GioaWlnKOjoJ6loKSspaaopaKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqmkqaumqayrpqGIeIN8dn96Y3htbl1RaVVQT0dQTU1DUFJBPzs+NDo6NTs6PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqWmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqulvmlFUp2CUVdJSmBKVI5gY2KArrWqsrSuqquvsLKzraWdkZeTj5egn6GgnKOkn56olKNVVoeVj4uMlJCWmqCnnp+foKOlqJyfoKGcoZ+jqKecp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyWk4+PkpGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjn52gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnyAdXZ9bmx7ZGlWU2ROSkhHT1NOS05IPEVAPTJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra2urm6t7e7rqigoamgqsa/y6FQQXKed09uS0tjZnVzYFpecJCxr66ztaqmrKyjm5mUjZGVl5iYnJ+iopydpJ6apJqTOmSEjYyLjpeUmZ6iqZ2hoJymp6uin6Cnn52fo6aonqOmn6qdqq2qrqeosKWjpKanrKaipaKbmZ6vqK6yq6arqqCbmJiYlZOWmpOVlpqWm5eYmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXyAfnd5fGV5eWFiU1ZhSUlLTFNVSlNRTTk/QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTHx45XU0llo1tlfm9yXVFrY1tkX11rj7SwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6KjgD1kgIF7eX+UmJ2jo6eepqufp66uqqaisaOao6amqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblZablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgm1lXFNbWk1SS09PVk1UTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeq6SNelVpcnZ1cGN2dlhXY2BjZ1lYV2atrqyvp5+eoqCWkJOboJyZl5KTn5yho5qem5aeoINqY2Zwenh1foybpqmrpbWyn620t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO1uLO4rbK0pKCdpaCsoaGioaCamZaWn5ubmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHZqd3VebVtSYUlSVkhGVldLQ01IPUtJOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqaiuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boqGgpIBugnBgY1hMW1NaTUxQWFJITU1ImKyqqaWgn5qSkZSYmJaWloyIi46UnZydnJ6WnZ62q39nf4Z9dXl7gZ20rrPBmKm3uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G3u7arrrG5t7yvs7C1wby3vrOztaKsoqmpsqmrqKeompmemqqnoJmnoJ+fqKilpZ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaG5cWFxDV05KR01IQ0ZOPT5MPjQ8OjY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamplJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn52KYldeZWBXTVFHPj4/Q0M/PkJReKmtqaqmoJ6foqOdn56bnZuUk5WUnp6YlIWdmaC81bmVhYiMhXpxcGyAqbvEnJC5w76/wr+2urvAw7m9u6yup7GtscK2uMLGwMjKwMq/sLm5vbjCvri0u8bEvcO8uLSqs62qs7Svs66qr6OerKi3sq2jsKaho7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIREpQST9FQjRGSDk2PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+VfWBeZWBRR0Q8Qz5FPD85Nk5+qrOnpKOioJ6lrKafmJ2VkpqemZWMioaIhnhth5+z29S8q5yJhouCcmhdXZDOtnOtx8XFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcbMzMzSx76/wMO+x8fCuMTKycTBx7+6tLq7tbu3sLayq7uyr7y3wLu6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOVlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZVpcRkxNRURUTUVCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxAP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafnNqYVdORT5JWXxvYkI9XI6urKCZm5yenpmXl5iTjY+Xl5SPjZCMgoOCdnJwbXCRu8PHxMC3loOChIRyYFeFuYCA0MzMzMfKxcXM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbHxsrIz8DJ0c3HxsjGwr3Ewb+/v7W+s62/wMPDx8XIxK+/ubK4vcTCwbu8vLWup6euqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl1c2ViZ3JvZ15aWkRPTUNGUUlEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojs+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpudlmtmXVRJREA/S4aepZqEoLKto56cn5qYl5STlJeRkJCNiISEiYeDgIGBgHlxcm9se4hnjq22taGOfXp6a2hlcYRfutTR0c3NztDEzdTV2NHXzcbHyczDxcrPytLX0tfS1dbT1MjMx8zNytPNztPNxsnKysLHzMfJyca/w7OzyMXLy8vPx8q/vr+9wcfFzMzJycDDwK6ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amVWWFJETkdASVFDPkI9OjIyQTxFPDc4PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZxjU0xKREM/Q1Ku0b2yr6acnJygpKGdmpSUlZSKfXlxbGViaHJwcnuFioB1cG1xcXB5UVl8mKSjln5vamNmamZdk9jR0tPU0s/Rw9DT1tjV1dLLyc7Qy8bN0srS1dfZ1tjT1tjN0srP0czP0c3T0MDJyMvEzM3Mz8/Gx8i2wMvA0s3M0MfKycDEw8jPzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2FlcmNdUlxKS0dBRklKPztBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaWloKKiW0lAQURBRlF2sq+mmpSXn5yaoKCem52alYl3aWRhX19fX15fX11hbHVzcHBubHFvdYBjWneSm5mFaWFfY2ljeczUzc/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NfX2NLY0tfZ1dbMz8/JzdLMztHAx8TJx8/O0dHSyMzNwMvNxtTPzM/JxcvHx8nMy9TU0dXP0szTwrnFsaWota6om6irpZ2yqLCzrKyTj5OOiIqOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlFgSkpDRUNTTj88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWepaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqeqqKGjrGdDOD0+RFiCqqifl5WXmZqcn52Ym52TfXFlY2JfX2FfXmFgXmFgX2BlbXBwbWtucXJ2fGBdgJSYimdZWV5tdZfH1M7L0s3V1NHKz8zT1tLR1s3P1dXRxdHTytDU1dbO09HY2NjXy8jOxMrPzcrMwMnBycrOz9DM0M7OzM/QyMzQ0cvOy8PKyMrNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zv7uxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0lGRkRNWUU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg/OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoKCjp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLJ8SEZCO1aNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGBeX19eXGJtcW5ucXFycXd3W2eHj4piVVlqgpGds83OxM3K0tLOxs7MzdTLztLNy9fW0MzR1MvM0NHTys7R1dLV1srAysLGzcPIysPNxMbJy8vPy87N0c7UzMfJ0M3Jx8vGx8LGyszO0dHH0M/OzszQxcfBuLm9w8K9w7mysr6wu8PEtaqYpaGYlpGVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR0xJUVFCO0Q/OzY4Ojg6OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvcHePmo2Ml5WQk5GRlZaVkIt8ZWJiYmBdXmFjYmBfX2BhYWBfXVtdZ3FxcHFxbWlteGhVeIN8W1Rpf5Kbn67Fxr/BxM7Ox8XHzcrRx8rNzcbR0s/NzNTKx8rOz8fHz9LL0M/FusS/xsq9w8fJzsXDyMDHzsjEzcvN0MnFxdDJxsLGycW/wcjNzMzPw8rMycfM0MXFyLvHw8nJws/Bvby/sMHJx7m9qrGyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSUhHSU1VRz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChaKqk42Nlo+Fg4ODgX2EhH5zX1teXV5gXmBjZGNfXVxeX2BgX1taXGFrcnBtbWhnaWtxX2Vvalhcd4KRl5eit7q6uLvIxcHDwMPIycjIycfBxcvFx8rNycTBysnBwcvPxMvIv7nBvMbIvsDGz8vEwMO7ysfIu8nGxcrBvsLLxsXEvsa+vcHExszGxby/ysPFx9LFwcnAysrGyMbQw8PGw67Ey8fDyre/vLqzqaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQ0dETERGUz81NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai+uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtm1eenyekYqSloZ6gISFf3V4dXJwX1pbXWBgYmNkZGVkYFtcXl1eXV9bWVpcYm5xbmlmZ2tpbnZcWlpcYHN+hoaCkq6vsa+uwLm6u7m4wMHBw729uby/ucTJxcbCvcbAt7vDyL/Bybu2u7vFw7+8ws7Dxr6+tcG+xLu9x7zDurW9xsTCw7fAtra/v7zNxL22usi7v77MxMLGw8bJx8nG0MbCzMiyx8nDzszAxcO/vLK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUVCRkpBOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstau3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrPxcnFx8G6xb2srqdgY3aBkouIi4R4f4aGf32De3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF1ncnBrZGNpamp1cEhPXFloc29pZJOlpqqoo7WxtbOysrO7tbywtq+zr7K7wrvBxLy/urSyur7AuMi4tLy2wMK9uL3HwcO7ta+ztbu/tMW4u7Wsub2+wL2xu7awt7qzxr23r7y/tbe1xb2+w8bAxMbGx8zFv8bGu8fLv8/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKR0JEQUVGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxcvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CaW2dviI6GiIl6eH6FhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX15cW15cXV5aW1tcX2tvbGZjZmhnanlfQ1BMXFxWUnOhmp6mopqnqa+rqauos621r7Gnraass7u6tsO5urmwqrS5u7PCua/Asb28u7W7x7nDt62qqLCywLa4vbCxqLKztbu8q662p662rryysKq4sK67rru4u8DBvrrDv8bDxcC8xsHHyrjFx8W/x8PDucTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTExNSkVBQz9GQTo6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHEz8fNwcLGv8TEw8PKwsnKv8C8wrqztbXDrqqxk1tpfpKIjo97eH2JhXl7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpaWl1jbW1mZGRkZWdseFE9RUxYX1qXpZadn5uVl6Gnq6Kmoaqpq6qvoqWeqq21trG9uK+3r6ituLSzvLezvLC4ubWyvMGywK6lqaOrsbOzqL2qq6irrK61tKaprqGlsKmzpqeorqaot6yxs7e6u7uyvL6+vsS/tcHAx8i3vr/Ft8XDwLu/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpTU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvCy767yba9w766yrfBw8K1try2sa+1vK2pq5NkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tYV1lcX2VqZGJjYWRkaG5zRkRkgXBdlJmHnK6WkoycnqahoZ+kpaalrJ+cm6SlrLKwtransKunqrSrs7mwtbWutrmzsLq6sbakoKSgprGorKm5qqWnp6ins62gp6efnKWmrJ+fp6ShobGtrayytbO0sLW8trvBwLK7vsPBsbm5wrPAvcC1uLy9vrzCx8TDxL/AxKCEeXFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7PDgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG6vbagnpWdoKa6tquzs7uzxM/Jy8LFuLfHwMy/uMq3u8W4s8W4s7/ArLa8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXlxbXFxYWVhYWFZYWl1eY2JgY2NjYmVlbGtZe3lfVFxEXmKTpJGHmJ2epJudnqKkoqadmqKbnqqurLG0o6ipqauspLS4rLavrbO1r7O1r7Cqn56fpKKypaaquK2ipqafqK2rmZ+gn5mdn6WamaOcnJ6wqayoqqusrbCzua+4ubqwtry7uquzsrmzvbS3srG2tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU2MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnIuLi/t7LCtLG7u6y6urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhXV1dXV1hXWl1hYmNjYmJjZGVvZllYSDIhIlxYX46UiZadnqWcmZujpaGkm56gmpitra2usaCkoq2rp6G1sLGxrKmvs6i6s6e2oaKfnKOhraOiqraqoqOmnqamo5aZnZeZmp2gmpednJ2craGsqKOkpq2rs7OqtbCyq7K5tK+qr7Kys7ezrqmtrrK4sLq2ur2/t7OxlIZ6dmZfZl9bWVZTWlVLW1FMSkVIS0lDPT9CQkBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/sp2lo5ilscO1tr2ttLjCzMjGwMW2wcDHzrfAw72zubmyv7axubutsrWvn5qjqqGUmo94f4OEf3hvcXRxaGVkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1VXYGJjYWFiYGBkZnFROjMhGitolI94kYyRm5mdmpSfn6iinZ6nnJqZqqausKqboqO3qaGgrqi1qqanrrGkuLCkt6CjnJmZqqahmq25sKOhpJyioKCTlaGUlpacmZiWl5yVn6meqqSinqOqqrGtqLSsqqets7Clq66zsa+wr6+nqKiyrrK0sLy0uriuo5SCendlX2FXWVhTUlRLTV5MUExHSE1MRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLrCsb63va2dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sLCxqpyaoamVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dWVVpiYmBgYV9fYGJpaT0zLTJOf42TjJOOj5abmJyTnZ2lpKKlpp6cnqWfqq6ln6GjtqehoaKps6KlqKWwprGuq7WfoZ2WlamhopStsbGfo6Oenpick4yglJGTmJiSl5iYl56nm6eiopqkpaWrpKWwp6Wjq6ytpqmur6+rqKqqs6amq6+0sa68trGvr5+Se3hzZWJcW11YTkxRSFJhTVZQT0pOT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G2vbC7sbesnqWmrLi7vMHFurK5tcTJycDCxsXHtsbEs8G/xau3t722vbq7tbKsraiZmZ+ji4p0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlZSVFJUX19dXl9cXV1gYWtYND9NdISKiYySjI6RnpWdlJmdo6CrpKOjoqOhm6mqo5mdpLGpoaCdpaqeqKKfrayqqa6toqKilZiimpyQrKmwnJ+in5+XmZOKnZGNkpSWkJiYk5yho5yloaKVoKKkpZujq6WipKqkq62lrrKppqWmprWmqqits7W0ubqvqqyejHNxcGFbV1ZWUkdRT0haXE9SSlRLU0xFR0pDODs7PTw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuxrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvLG+w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVVZVVFVVUlNOUFldW1tcXFxdXF9jaEBScYd7hYaFj4qMjJeWnpiYnqWmqaaqpqilopikraOUmKSuqaCcmZugn66ZnKqzn6Wmn6OjoZSUm5aWkqmprZucn6Ggm5SQjJiNjJGNko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuwpK64paOko6ytqqirr7S3sr21s6uumIV1dGlbWVlTVVJGWExRW1hNVU9QTFFSSU9JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY4Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3rqior66bqaist7asvMq7tr+szMbFuMDOz8ezxLu3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWFlZWVxbWltdXmVxeXZ/c4CFgYmEj4uSlJ2bl5yop6Ssqqevo6aYnquflJSjqKadl5GPmp6ulpinqpifnZSloJ6SkZKRk5WoqqWamJmenpaOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpaepqKCwsKaxvaefo6y0qq6nr7SwubXAsa6wq5F+cnRjVlRVTlJKR1ZQUlJMTFhOS0xPU0dOS0FDRkVDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsbe4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucWpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUU1OTVJXWFlYWFdaW1tganRscml7gnyGf4+Ej46Tl5WapZidqKWkqp2ml56kmpGOnqKal5eGhZKbpI+VopyVlpWHopqbk4yOipCapaeblZWXnJGTiJSOi4GMjYCQi5KSkqGaoKKWlJmYlaKmmo2ZpKepp6GgtLKos7ihnaO2rKqupLKyprW7tKussaKKenNuXk5RUU1PRE5OTlBLRk5OSkpOTlFITUpBSExJSEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrCkp6SqpaCppqSzqqKyxLW1srPGxbe6w8rMxrOtur20uMCvrqmwnqauu6+toJqbnpWViHyEbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtLU1dXVldXV1ZaXWFpZGhjdnx2fneJfoiFj42Pmp2Ml5qioKKYpJWgmpSMhpiai3ONg36Ol5aGkpqQk46Ne5mPnIyCiYCKmKCjnpCTmJaFjoKUfn50io56kIiTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5imuKalsKGxrpywu6qpr6mZhHh0ZFZNUlBQTUNTTkxQTUJQUUhJTlNOSUpKRUtNR0tLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2Njo4N0E3eLeho7SopqWoo6WlpqamsqemtMG4r7SwycS4ucDOxr6zrLrBrK3EraiippKdpreto6CRlpeSkH54f2ZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KR05TU1NUVFNVWVpdaF9jYHF4cWtJU22LfZGCiJiTiJGOnpeclZWVk42ViX+TiV87Vm98jJSKgIySjI+GhnKLhJaBeYF7hpSdlYOWjpCPg4Z9k3hxcIaNfYmBkI6Ql5qZk4uQip2In5iHiJaemqGgl6euqa2pqZ6WrbOipa2ZrayYp7Ojqa2jk390bmBbTlNSV0xEVEpQTUxGTk9JRUxRTUtQSklOUEdKSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKKtoaamqqCmqaejqrCop7TCubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qZh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSEZITlFRTE9SVFVYWWBlXlttdWlKPTt8ko2LeYSQiYKHipmMlZSJkYaElIV4iH9gSlFueIuShH6EjIuEf39tfn+Td3V2eISNmnBRjYiKhnx+eZR2Z3eGiH6KiJWLjpGTl4yEioiUhZuNgoWSm5aenZSkoqippaSem7CqoaSkkaaqlqGpnKGmp4p3bmZeXEhRUVNNSVVNU0lMS09JSEZKTkxNVUtRUlBHSkQ9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivrKq1vLa4t7PBu7anuci4tqiotbaqsrynnpWOf4mUqZaVi3+OhIN+eHFvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZTlFTU1Vaa3RkaHFgX1VPjIOQhHB6gn15goqRgJGZi496hY5/dH94cm51cHSOjoF6foqrhXp7aHZ7jnBybXiBi42SeHuAe4B3c3KSeGh1hYSEhXyVioiKjYuAf4SLjYCUhHyBj5iUnJaRn52pnqChnaCppZ+dmI2npJKgn5aen6SBc2liXV1KV1BSSEtYUk9KTUxSSkpKTFBITFFNUlVNRklCPDc4Ozk5Pj06Ozw5OEA/Ojo+PDc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX93hnh8dnBvallLSElIR0VISFBUVFRXV1NVVVVVVldYV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxOUVFTVl5xenBrXG6GkZWMjHdjdX1zdXyGjnuCmJJ/cIaOe3Z6bmt+rXx0kIt/eoaSgHx/dGZ1fIZsb2hzfIqNh4BtenF9cW12j3FocYF+jnBEi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpubo5aZnZudnqGclo2LpZuOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5QVktOS09PS1JPSU9QTEZEPTs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6ipsa+xq7y4q7u+uLOsp5uwp6ybj5acpamloZiajoSSeYmPi4t2cXxtdXFqbWpYS0ZHRUFAQ0RITExNUVFPUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpZSk5PUVRYXWRtaWJ/n6O+fHB0X3d0a3h1ho54eoqEbmuLkXhzeGlqf4JxlpGMgX2Vf0mSmW5nd36CbWpkbHmFkJKGa3NsfG5yfIZpbXB/c42JhYZ7fn97d3B0dIaCeYF5cHyOi4qTg5aWmJqQk5aWmZedloyDiZ+Si5KNhpCXgHBqb29vWVZYVFJSWU9SVVRSWFVNTkhNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJufpKyvoq2qqLWvrqy0v6u8w7+mopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdW90bHFtZWtrWU5ERkNAPD4+QUZGR0tLS0xPUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SVlpRWFpaoIFdlWNtdGF6bGp8d4iGdICFhHNrmJBzcntpap2OTHmFk4mEjWYxdodya319g3RmZXV/hISFgGZpbHVrcIB8aHFxfG6TjY97dH59cXFvdW2Df3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtOUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaOlZmLjoV6hJCYlY2QjJCHcYeCdIeMhnpwc3FvcGRwZ19URklDPjw7OTo/QEFEQ0VHSUtPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVLQUlRSGCqrpxsdXJoeWluf36Cf3iChIR4cZ+Tc3eAcnSThzVwnaidjaChhKKFdnCGe4Z8dIyujYmBaGdiam5ybXCDdWlvWHVwjpuRdm1/e31ucm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jnxzcnFtYFxdXlxaWWFfUk5bWlhXTEhKRklIP0NBQkg/Q0Q9Ozo3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUwMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KRgZKIlZGdpKeer5WltKmusK7BsrvBxZaPjJSPgIh8boGQkomDioePhnWChGyViIh8dXh4bXhud2RqXklQRz0/NzQ0OTs6Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUVJDSIBvend2cXppc4SFeXuCgX2KfHSgmHl9hYCEmYSanGGGqp6ci4OQjnp3iH6JiI50i5ePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1Z2hgW1xeU1xnXldRVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjU0MjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydnqaRoKqgsaivwLK7xLqWjpGTh3qGdmt/i5GDfYqDjox4g4BzoISKfX2Bf3CBfnpod2tSWExARTIxMTM3NjY4ODo8PkFFRkZHSktNT1FSU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJS01PUUtKVFtXUUlkfYN2hHV3bnmLiHd6hoR9lIV2n5iHho2RlKWMrKlIhq2vroqBgJSLgouChJKpiIGYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGSGyAd3J5dmhta192fYOIf4eFi3mUnJuJi4iRf3p1inZ8eG1vd36BdXVzbVxeXlxjZFhnZVxVUFBXWVBETEtGT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc3ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeQjpWXkpagnaygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4l+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPRkM/ODAsI4dbPz84NC5dlnBzo1VGSUtMTU9XYFhtWFpcZYaNgI98gH2BjY98g4aOf5iTgJ+gl5SamaWtkpm7sae7x8Oni4yhpY6TiYGRfHGDnp+RnX93hYWLkIeQaWhwhIF0jIeEinKGgneIgHt2hHxtdXVmf5SOhoiIh4iHoKqilomOl396gYh6eW9na3h+fIB1bGVeW1teal5iZ2BaT0xOWFJRSFBKRE5HQ0pEQ0FEREI8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3gnp/jH+BkY6KmpuknaGspqqusJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoSAgYyKgomNg3+Kf2xwal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJUUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSEpMS0pNVl9hfGVlanGVlIiVjo+HiouWhZCNm4menpChqaSiqpOotaGnwcKtx694uZSafI2hnpmEk4WCjqGflJmRhYqFj5qRlmxwdYqMgpWMjY53j4RxbYWBipaRgoWIcYigloaRiY2PlqS0qJuMlKKDh5KDfX9ramp8goODdWNfZWBbaGxebGxeV0tITlJRTkxMRklQQ0RORkJDRUZDPTo5Nj08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkZJ9ioSYkpCDgICLjImGkIeEiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw3NTI8P1I1SEhITEtNTlJebId6cX55mJaVoqCdlp2Tn5KanKacpqmdp6uoqbSWq76rtsfIt8jQz76boHBpq6mfhJOShZygmpuZppKRiJWjm5t4en6UmJOikpeXgZSee3eVkqqyiIyXn3yUnZuNkZWYo6Glta+ckJinh5aPjYCIbHNzfYF+c2phXmJgYmhkYGhnXFJFSktQT0lJTEZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNi46NfIqGj5COgYKAiYuKhZKFg4aJgYCHd15iUDQ2MC0yLywuMC8uLy4uMDAxNT5BQU1RUlNRUlNVUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lJTU9RWWyDjXWQhpygo6+5tKCqqaqlprKprrSwsKy6sLK9m7LDq7rJy7jDv7elorCzrK2qo4uWmISlpqCjl4GmmY2iqqiliIWUpKGgq6GkqI+csYuVo6a3upugoq+SopyhnY+joauuq7K0oZSkqYiZiJKJlXl6foaBaWJpXWZjX2VkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpblh6hHaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRjoOEgYuFhoiShoKFiYeIh4dxbmFARTY0PDMvMTEwLSwrLTAuLTQ/Q0FNVVBSU1VVVlVOW1BHR0Q8Pj5GSENFQTc7PDVDOz1GS0lGSFFOUFeAkJ2Cqp+tpay8xMCnsMO1qrG+sba8tL2zwLW7uqK4xai1yce1vbi0qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6orra7srqssLWisayxtbu2tK60n6anoaaaqa+ssbi3uKaataiMpI6Qkp+GeIKFeFtjZVdnY2JkYWFnYFtUSkRETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmJXeXVxgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhIGOf4GJj4Z/hoiGioeQenhuXVdARU48Njo0NUFCNzY0Ly82Q0hCUVtPUVVXVVxXUF9VSUtKQT8+R0tGRUQ7PkA3RDc/QkpKRUZWU1BejaGqoa6wvbCzvMnGtLnDvLKyv7W2wLO+r7Z0sLOlusSkr8a5sLOxs6ektbaqsaCil5uikqWwrqatq6ekmKGttLuiqLK6tby/zL/Fxb29s8G3ure+trq3uayrsKSvqa29sLy6wcGrmLmnlK2Ol5epiH6Dfm1YZGJZbGZrZlhcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqcH6Og4COhG56c3iHYrmhmaOJlJSWkpSTjY+WkYeGe4aBjZWKgISBinp8ioeGfIqCgYuDlX13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUVJZWFpnWVRgX0xTUEVBP0lKSEVFQUBEPEU2Qj5IR0pMU1pUXZKstLK4tcW7trrHy7m6wLu2tLq5tr2zubHFYHSxpLGanqq9qaWoq6qjorK1oKuon5WWn5mgrqWnpqWfpJSjp7G0qLKzvbbBvtPJydPGw8XMwsrDwL69vru8t7SvuLe2w7nFvcLHr564qaGrjaSntYiBgXRhY2NfWWNgamdTWGBWUlVJRUVOS0E+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgrLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWin6Df4J4e4uDh3uLeYGKgpd+dH16a2ZwdVleXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RUWVVKREJLS0lGSEhISEJJOkQ/SEtTVFVcWluStr62u7TDvLi3yMm5tbm1t7iytrSzrrW1mGR1p5ytcF6irJyYoKKbpJ6qpZSfn5CTjpaZmKifpqCempmDpJ6tpaqwrbiwvbnU0c/X0MrM0szPzsrGv77Cyb3BvMHAxMTFyr7HzbKjurC0rpqrt7uYgHxtX2JeWl9jWmRjUVtgU1BLQ0FFRkU8QEY+QUhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFbWWhfb5aSkJRubG90dYe0rKGhn4uZnJmMjZWRmpGFiop+iIaMkIuIfIGDc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlnamppYGZpaWxabXOWraS8iIZnW29nXVpaVEhLTlBKS1BLU1FJTEFKRkpPX15hZmlhl7XFr7exubuzsMPFtK+4sLC7q7Kwpqq3q4y1p52ap5pNmZ2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXmpWXh5+ap5usr6iwqLS01NTU1tPM0NPVzdLPzMXCydC+ycnKydHHzM3Cz9G3r8O8w7mktbnBooRxZV5fX1piWVpnWlFdWE9QQkJIRUJIO0FDPkFHPz9BNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCZ3FveXmDoaqeppeMmpuXi42VkZqOfYmLhI2KioqQh3yEgnB/h4GGe4dyg5KLjn1xeHVscXh+cXpteHNtaYFwbWNpbXB4aXd8fsu/wd+nbWN4bmNbYmBKUFJVTlleT11cTlBOVFBUVFxubXaCcZatt6uypa+0qau7v7CqtKakuKarrqCrtKOOsK2al5iMj5KRhI6bgY2mkZyJg4uEiomEi4SUlZiXlJuRnJeZmp+fq6ylqKKsrc/S1dLOzNPU1M/U0c7Hw9TRx83S09PXzNHRxNLWxcHOx8fCqL23zp58cWhgZV9YYlNfW1BRVFFPSD5ARkFCRTxAQT5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VVFNTlp1hoWKd2x3cH1+f6GenqGMjJiTk4uMko+VhXmFj5CNioqIkIZ+gntyfoCAh3qEdYWTkIh/b3Zya3N9e3d7c4J4cmuAc3Jpb3F6eXF6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1hkalNYXF1gY11jd3p9i4GYqaOkoJ6gp6Wqr7iqpbOioa2ho62hp7GfiKaak5KRiZCOiIGTiWqUooyZhIGGfpGDg5OXrYuVjZWZjoaSkZ6XqLCioaGlpKnJzc/IwszR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuNdXFlYmFaVlpVXFFLR0pKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO09MRkpYcIB1fWhzeHKCiYCdlZ2UhYuViY6JiI2Gjn94g5OYioyHiIuIfoJ3c3t9god3f3qGkZV/g253cG11f3V4fXSFfHlsh3Z0bn12hHR4e521jDtBi8Wlfox8aWVXSUNmY2VjZ2pjbXdbXmZoa25oboCCh5GLnJ2gnJCXmJ6jo6Wxo6Syn6GlnaCooKOxnIWekpGRj4qMioaDj4R/nJuMjYKEhXmUf4KplaOMkYmXkot+mIubkquzmJucqJynvsPGubbGztLR0tDM0svI1M7Q1drX19jU2djN2NvOydna0dW+ysu1enlwZ19cVFdSXVdGR0pJRUU9Ojc6QEBCOkZEP0RDQURCOz87OzdEQzc1NjU1OzA2Nzk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoSJgYd8eIWXloiOg4eFh3qEeHF6e4OFdXmFjo2ceYtwfG9ven9xe4Bxg4eBbo56dXd9fIJ0fnyGh69zWKnCto2RgnBtYj1eaHJwcXBueHaBZWhvcnV4cXqLho2TkZqVn5WHi5OboJqdqZ6hrJuhmpiepZ6fq5mLmouQkY2EfIeHg4WLjp+Zk4iEh35smXqEmIaIk4yNlIyGfJyJlJCuqpSWmJ+Zp6+2vamtvsfMycnMy9DJw9LK1NfZ19jX1dvX09nb1dDa2tHWyNTLlnx9a2pdXFFVVGFJQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4+Ojg3REI3NTU0NzkuNTU2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD5DR1JqXm1kYmZrdoCIcZGQmoB6gI1+goKBg36De3yEmI2Hi36FhoB3gnlue3uGgXR5kp6OoHaOdYJzdYF9c4CEb4GQgm+ShHV8gYV6doZ7ibfFpMHJuIGWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSUjpeQg4mPlpmWlaWcl5+VnpORl6KdmauVkJCKjJGCjISIiIGFj5Gdm5mJhoyBhZh6iImfl5CIjYqLgn2hiZGMvKGYk5iZnammpq6fqLa/wMG5x8rOzsXNydHW1dXZ1dfb1NfZ2tvX29rZ2M7bxoh9fGlrZ2FWWVdXTkxFTkM7PT08ODo7PTk9QDY9P0A8Pz08OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdW1NVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyKjZJ3dnqKe36Afn98hHp+gpGJhIV6hId7dX10bXx9hn5zfpKekZ6DkXuGfniPfniKim6CmoB0mYZ+gYmEe36Qeo+pjo/Dob2LnKSdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWIipCSk42cmZKTkJaNi5WfnJSglJGNjY+Lfo+OjYqDiJKWmp6eiIyVkp2RgYt/pZmIhI2ChYSBpYaKjLiYnZGVlqKooZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27h7fHpua2hZYl1UUE9JRExCPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OkRXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1DUVNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4d6fHuLhoJ9dIOFeXN6c22AfoR+d4WbopudlJJ/jIh/mIeAm5JuiKiFeqGLfJGNg4iEnH2akIqMo6KgkKSvn4uQi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5SMhoiLkpKLk5OTjouPioeWmpyPlJaQipGThoCLiJGMiomclpiiooaTnZagiomIjZuQg4iOf4OHhqSFjJGzmJ2SlJehoZ6akpyeqLK4raa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcoB3amhfX1pVWVlDQUlDPz4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE6Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjo4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnptYX6Sg29td4t4eX96gXyGfHt3hoR/c3CFgnp1d3Z0hIKEfn+SpqSfpaKXip2QlJeLiqiXc4qyjYSokoSZk4WZjKKVn5iSiJueo5KpsJ+QlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzciVjoaHiI+SjIySk4mFiomFlpmaj4+Uk4aUl4N/j4uZh42QqpeWoqKImZ6WmoiOhpeXiYSOjIF/h4+kiI6TqJqXk5eZoZmfmZOdm6OztKajvMG+x8XFycjJwsvTzc3UqdLR1tbW2NrU0trOhXWDa2ZgYF9RS1ZcQkJHQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOkk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjnx8bX6IeHp+eoGBgn52doCCe2xui355fHd4fISGi36Lo7SopKuzoZanoKWklpWvooOQuJWSs5qNoaCMpJuvoqSdmJCnl6mZrbCkl5SVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinJiFiIiNlIuLk4+HgIaHiJKYlIyKk5OGlJiGhJGQnHOQmLKVlqOhiJyZk4+KkIqWmomKlo2GfYyYn4qQkJyamZOZmKCUoZ2Vn5uhsa2jpLe+s8XHxL3Dw7/GzsrJ0qfPzNPR0NbY0s/YvHV9eWBiV2JYUklLT0VCQ0Q1Pjs3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/Pzc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpJRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVxcWUpoYTtIhIt6em2Fhnl8hHiAhYF9cHh8fXxvc416fYF7eIaLiYaEkqi8ramzvbClrrOzqaOisK2KmrWdo7mlla2kl6mtt6ako5+ZqZiqpK+xqpqZnJSVkZigl5q7u63KoWm2t6qwlZieoquSl72kXqqygomJjJSGkHyOjn2Dho6PlJSIh5KWi4+VjYuMl5iRm5m0lpWqnYuclJKNkJKLmJqKkp2Pi4qWn6KNlY2XmZ2TnJielKGglJydpq6ooqSzuKvCyMS2ur28xcjIwtChxsnNzcTX1tDK06NzfWxfXFVhU1FIRD48Q0FBOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBmSGFgYnBKQIuJf4Byhod8gYl1goqDfm19fHx+cHeHd42Bh3uNkIyGjJqrwsCwvca8s7TBvLSsq7O2jKiyra29q5u7o6itubirpqaioqSjqq+ysaqdnKSYm5iYnqKmpZOjua+ov7ysrbK5paOnfYiGnK29sIKLi4qQg4+DkY56gYeQjY6ciIiPl42KlJeUkJqWm6easZqRq52Omo+SjpWQj5WWjpCgkIiVnKSslJaPlJyelKCdm5ifoJWbn6inpKKksLOmwMbDsLC7tsXFw7/Np8fDx8O81dDMxMqKdnVkX11iXU9MQ0xARUc+QT9CPDo0PkE9PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0I1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUpITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaEZfaWdbXVyTjIyIe4eLhoOMdYaQioFufnuBfnF+gXqUepKUlJiRk5WotMfJwMLMwsO5x7y6r6u5u5eytrqywK+lwKOrsLy8qq6ro6Oep6yvtbGpm6CqnKKclp+wtKeMo7q6tcG7q6icsqSkqJSEjqnExKSCi46HiISGlZSMeoOMkY6RoYyMlJGOh5egmJOZlZaloK6djKqcjpaPkpGVlY2QlJGOoZOGl5+gsp+Um5SgoZmkn5qgm6CUmZ+npKanpK+tpb/Dwq6ot7XJw762zrLEvsO7s9HJx8G1d3tvXltfbVROSURNS0tKQEE9QkQ8NUFEOzozPThCMzMyMjYzQTE1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmo2WiouIko+GiXmGk5CBcoB7jH93h4KBj3mNoZaompqYu77JyMrC0snKws29wbOtvL+nur+9vMS4rcGprLO8vaqwqqSlo6yutK62taCfrp+mopmjtL2pnKi8waO2tq+rk7CsqqyWhpqqp6WRgoySpJWJgHWJkXmFjZGQnp+Sj5SLj4uTo5mXm5SToZ6pn5GlmoyPj5CVloh8jpWSkaKalaCinLWmkKCXpaSjpZ+eppielZecpaOoqKKyrai7wMSvpbO3zMC6rsOzu73Bua3CwsK/mXB7Y1tZX15MTU5LR0RDSEJBQURLOjRESDo7NDw3Ri4xMjM1MkEyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxJX1hhWmRlWJ6PnY6Xjp6SiYp/iJ+ShHiFf5R+f5CIiZCAlqGarqejmMO+ycTIxtPNzs3LvMK3sLq9tL3Lu8PBtre8rbTAubyur6ihqai2rq6psreanqyiqKKdq7e3qqWvvsSxvbmzp6q0s62tlpWlraigkY6SscWnlY19kZV9h5GYj6qZl5OTj5OUkqWdk52Zk6ChoZyYn5iLjI+Qnohaj5aXkpakmWaZo56zpZailqytrKecn6aXmJaYlaGjqKaftaupurvDtKa0tcvBuKq2rLO7uK6ouLq8t4RvcFxaVldQR0xUTks/QUhEREhGRjg1Rk07Pjc+QUsuMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmZkTUamlJyWoZeoloyQg4elkoiBh4Kbg4OVkJCUjpqin6++rqHHvsbFyMfOzs/Syr67trG7u7y/z7XEvbe5t7OytrO4s6ynnKusuaupqK+vl6OupaikpbXBsKuttL7CucC5s6e4tLeyr5WkrbCvpYuTlKCNc8GZfZeZhI6WmouxlZqZlZKSmZilo5WfmpWZqJyboaCZioyPlp1gSpacmpSZpJdUlrCfr5yfpZWvr62mm6GmlJOZmI6dn6ahmbSpqrO8vLursLLHwLimrKutsbGjobKytKVzcWdeXFBSTUZRUVBRO0hLSEZHQUM9OUtUP0E6PUVNLzc1MzQ6QjQ0TldOPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs1RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3RiVkZIq5eZn6GorpiQl4eKp5aNiJKFn4eEnZeOnqCao6S1ybSpx7zDxMnLycjMzsa+urOvurjAwc21yLrBubW6sq+vs7SnpJyrtLWrqqetrJmkrqalqay6v6irt7e+wcC+t7Kyw7C3vayjrrStuqaIm5elmnW+n4SYnY6SmJqLrpahnJuXlJqeoKmep6CYmamZoaedl5CNkZ2DbXWTopqVnKKfkK6yoquVqaqYqq+mpaGlqpKSmZyJlZyinpawp6mqure+s7Kuvrm2oKOnqKWmnJytqamNZmhjYFNNTUdJT0pVTD1MRU1JSkBDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0M6OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FNVkh+ZV5IRqyUnKGfu66YlJ6Lk6qbkZGTiKqNh6KejKOslKOktse9tMK7w8LIycXCzsjCvbmyr7m1wMPKtsaywby1u6ypraywo6OZqrW7pqqnrKqdqK+opKurvryorby0t77GvLa1uMCwvb+zqbW3rL+lj6KXkKGfvJ6JmqCZl52dj7eeqJylo5qboJqnpbKhmp2lnKepnZiUj5Sbi5aJjKShlJyin6C1sKWmlLGrmqutn5+lpKqSlpWghJCen5yWqaWhobS0uratqLWysp6co6Wal5WZqqGeeGNfYV9MSUZITlFJTkVGRkJRSkhAREdBVlNESDxBR1ExO0I3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6Sen8Osm5ekl5mom5Wamo6qlpWoppWtrJmiq7fFwry/t8HCwMjEv83Gu765srC5tL7DyLXAsLy2urenpKurraGhm6urxKKlqKymnquvrKKqqL64pq2+sLe3xre0uLi+sb7AtrSytbC+o5ajlZOak62fkKGhpKKjnpC+pKidqKucnKCbpp+9opiknqKpq6CdlY2VnpOeh46EjZOepKCdtqymnZezp5qwqKCcq5+ijZqVn4SOoZqckqWkmpirsbWxqqWqraycmKCgko+QlqmflGllXGJeUEpIS09MSEVESUA9T0hAO0ZJSFtSUEs9SE5VNEJGOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0tME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hOopujm57Fq6Ceq52crZ+Rop6WpJ+mqquXtrGjqbO2xcK9wLbAwrzJwr/KyLa4tbSxtLS3wsa3v7G5tbq2oKesq6yen6ClpMGloaqtoKSprbCip6i9taWxu7e2tcOysre6vrLDwLi4rbS1taOdpJSRk6Ctn5ihnaioqqKawqyonautmpqdmKagvaGdpJirq6ymoZmNmp+SnoiOWH+Wn6ahoLmqp5SZt6Ofs6KhnLCYoY+alZ6Cj6CXl46io5WQpa6zq6mioqWklZWcmIuPkpOkn4ljZ1xlYU1KS0tPRkVBR0s+PUlBOTlKSk5dUVFJPUxWXTlGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMUJ6goJiew6ekorOgnLKnkqqjn6Oeramsnbuxqay1scjDwcOzwsO+x8S9xMq9sLG2rrG1sMDFtbqxsbq2rZqpsKmqm5+moafCrZytsZyqoq6xqqSovbemtru9r7fDrbOzwr+yxrO6t6u1tq6qoqaVlZSiq6Gfn5mnq6+vr7uxpZ+pqZmYl5OipLigoaOSrq+rpKWekaGelJ2OkI2UnZqjn6i1p6eNmbWco6+boJywkaGVmJWbgJKilpCOn6CTi6assKWnop2gnpKSmpOFi5KNnJ+AZGhdaGZLSkxLU0FDQElHOztGPjg5Tk1VX1JTSj5PXl49SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZ3JAODxIlndlQTSfpJ6aoMKno6mxoKO0qZWxq6aipLKsram7sq2wtbTGv8TEtr/EvsrFtsDJwrWstamwuazAxLS4r622uqWZq7Ksqpihp5itu7ScqLCbrZ+utbKnqruzp7mzuLK4wKq3ssO9tMWnvq6tt7Wpp6yhlpaRpaShoZeXpK63rbG0tp+eqKSZk5STo6C3o6Slla6xsaWppaGem5malZiooJ+Zop6vs6KmjZivmqWsmJufp5OekJWZmoaXoJWNkJ2elIupqaqip6GanpaNj5mQgoaViZWfemVqXWxrTlFOTlQ9Q0FOQzs6ST83N1FOXV9SVlFCV2BdQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFqVkNXRox5ZkM7pKScoKW/pqiurqCptaqdt6+ro6q0trCwuLewt7i3xL3Dx728w8LHwbrBxsG6qralrbutwcO4uKqtsryjla2xrbKXpqiRqrmqoaewnaugr7Szqqq3tay7rLOyubesuLDBur2/psOqsLauqaurpp2YmKqhoaCRl6Cwr7OrsLiZm6mfmZaSl6agt6mloqKvsbOrsaeroJygn5uepZ2hmJ2jtLCcn5GUppqhqZyWpKKYmoyWmZSWl56UiZKbmZSOqamnoKOcmZuTh4+Zi36Nl4aPm2xpbWJublhRUVpUQUNEVUA7O0hANzpYUGReUVdXRVlfXk5MU09fTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhtfWhcVjqJe2NDPaifnKGpvKCqr6qjsbeppbSyq6Gttb2vs7i8u723tsDCv8nEucTDwMC5xb3BuK+2qKu3sry/v7Sqr7K4n5esraiumKmpjqe7n6Wts56rorGws6yqtrO1vK2wsbWssLWywLrFtqu8r7G3rK2qo7GlnqWonqOWj5ifsqqzqaqymZ2nm5qUjKCmpLSup6GsrK2xp7Orsamjm56opJ6VoZqcqLapmJqSkp+Zn6Ggkq2hm5qIl5mMnZqelIuPl5eal6elo6Cel5aWlICQlYR7j5OEjZdnbXJocXNgR1lmVkRDTVhEWjlIQjU+XVFoXE9aXUdbXl5PTVNYZEpLQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVjE1MT1gVl84KUMzWVVcZ0s1jHpmTEClmZ+kq7ajrKilrq21qa+zuaansLfGt7G3v8LCtrW6xb7MxbnDwbrAusW4wbqztKyquri7ur61q6+xt5mYqKurrJyuq4+rvp6rr7Gjqp+xrbOurrWxubeqra6xp7Wws7q8ybKqtbWxtLCupqCzoJqorKCllZaambGiraClr5ahpJqZko2ipaeyqaGmsayqtaWusLSvo5mdraebl56bmqy4opiTkY+YnKGZmJWuoZ+Xg5abjp6cmpeRi5STnpmlo6OhmZeTkpZ7jJGFe42Lg4yTbG55b3Z9YkZgalpJSFpbPXtKR0U2QWJVaVtNXGFLXFxaUlNTYmFMS0VgYWBQTUlQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NZVExFmpafsKixqayko66ttai3s7ejrLS3ybu1u7vAvrW0t8PAzMe7xL23v7/BuMC9sr2uqLq5uLfCt6yusrqWl6evrKiksqmUr7ukrLKypqejsrSxsrG1sLezqa6rsqa4r7WzxMW2qbW1q7Cuqaeitp6fprCgo5SbmZSwnqebn6mNqaKem5WXpaWkt6eisLOrp7Cnra+0rKSZoayonJydnZWquZyVj4+MmJ2jmJGYqKShmYaVmJGdnJiXloiXj5ebqJ2loZKWkpCWd4SRhnyGgoSNjW5xeHZ8gF1MZWxcSk9kXT9ie0dJOEdnV2ZbTV5iTVlZV1VYVWldT1BIYV5fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhnMjcnRmFMViUtQi49RUxRPDNya0xFRJGZpK2krK2qpqOwsrKqt7C1n6u1ucm5rsG8w7izsrXCw8/EwMK+tb7AwLu/vbTEqaq5sba3wLyvrLS0nqGnsa6lprGlnrK1raqysauoqLW6rLWytau0raqrqKypua2ysMe/uKW5sKmtraanrbClpKOuo6icnZuar5mioqKjkKyfo6Cfoammpbikq7S0pKqrqayutq6inaOoq5ygmZuTpLWaj4mOiJGjoZaPlp+jl5aHkZaUnpuZlpWHmJKVmaecoKCNk5KOkXh+j4V9fX2HiopydHN/fn5dU2NuXk5aZ11GRJZbRzpObVhiW05hYk5WVlZXVVloXlFTTWNaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZDs2KkhkSEorOkk/M0NJUyw+j2xASEmQmqipoamwpKejs7SwtLSwsKCrrb3Mu67CvceytK60wcPRxMa/wbK+wsO8v7i9xaitt6y0uLzAsayyrqGjp66qqKWxo6qwqq6rsa6urKuzu6e3sLKpsqqrpqWjrbqtq7DCubSsuampqK2pp7GlqaSirqmoop6coqyVpZ2YnpmsnqKnqKGspqOtrLawsaCpo6CqrbCsnZ6np6mao5iZkKComIaEj4uLn6CQjI6XnpKSiImSlqGdlpmWhpeTlJelnJ6djJKQjop/f4iEfHeAh4WHdXRyiXdsX1lgbmNRc3FcSzuEfEY+V3VYYFlPY1xOVVZVV1FcYl9TT09oWVdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0zOTc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5KZ0RGODxCMDVFS1gxQJRdQE5GlZasp6CpsZynqLC1rLi1raqkqqq9ybyxv7nDr7Cts8PEzs7Dv8C0wMPEusG0ycSsr7eus7rAvrSurqymqKqxqaapsqa0raqvra2xrrKttLult7OsrK6oq6CjnrC3rKqtubaktbWkqqesrKqtoKimp7GxpKeloaGrlqqhk5ugpp6ko6qjrKKeprG2rKyipaOaqauuqZ2hpaSkmaCZlo+YnZOBgpCJhZ2gjYuQjZyRk42Fjpmlm5ORm4yTkpKUo5qcmouPi4x8hoKCgXp1gYSBfnV3i6KHeGpeYG5mV2aHZE5AZ5JMRWJ6V2JYUmZVTVZWVVRPXF1hVkxPaldWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjs6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESHQklJRJaQrqShqq+Yqaittaq1saqlq6qpvMDAubq0vLWms6/DycvRv8G7ub+/w7rCusHErrG1srS8wb6zsa+trKynt6qlrbCruK6osK+usau1qra1p7S3q6ykqqqcpJ6zs6mopLO0n7Wtoaqoq6irp5+rq6i5tqmqqqmiqZ+tm5GqoZ2gpKOmoqqenKa0rqelqaKkmKWmp6qcoqSjoJmYn5GOj5mNf4eMh4SenomGjIyQkJOPhYiWo5qOjZuRkpCPkp+YmZeNi4SAdIeCf354dYOAenh+f4idj3BxZmdxeFxhdIhqT12YVkhteVVkVlNjUE1VVVVRT1hbYlZJUWpUVlRHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMjM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMkBmPU5YP0MsP0xUXy9JazdSRjuVja+gpaqsmaqjra6ytK+qpK+pqLu/vMGysLmtoravyMfI0cC/vbq8w767xMLAv6+ys7O2vbzBsbK0q7Sppbappa2zsrivoq20sa+xuau5rqqut6uqnqqroKOhta2poZ+usqG0qp6op6ujqqGhrK2ova6rrq2hp6ifrJmPsKGYoqCopp6nm5mpsKmin6yioZKioqOnmZqpppiYmZ2Pi4eViH2OhoSFpJaGg4SNiJGQkoaHlqGXiZGekZOQjZGclZiPi4aGeHSBgH10eHqAe3R0e2qCiKR2aV5la4F1Z4iLfFJWcF9LeHNUZFNRX01NU1pmTk1XWWVZR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUMzj46woKSlqqOko6ymtLOxqKSwp6q4v8G9sam6qqetsMnGyNDDvsC9ub/Avcm8wrixsLWyury5wLO1vKy5rKO1p6essba4sqWnubWttLyvvKWtrbarrZypr6SfpKyqqJydqrKks6iaqqeqpKmdoqmnqb2rtLCunamkoK+cmrOilqWbpaSfpZqaqKqlnpqpoZuRm6CknpmXqaqRmZqSkIuCj4V+kIOAiJ+Ph4F/jYmTkJGGg5WblIaToo6UkYuRm5OWh4p/gHJ6eX58aHZ8e3VxcX5qhnqFiGRfZ2NyhXttZ3ldXlZCV3ttVGFQUllLTE5wdF1JWltoWUZWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6SsJmfn6mkoqGrpLaysaSpsKatucK9t7CkuaypqLDCyMnMwre9v7W4wbrItsO1tLO1sr25ur22rrm2v6yitKaqq661t7SpnLm7qLG+srqgrrS2qaufrbGjnKWoqaOdm6Swpq+hn6qpp6KqnKOooK28p66xrqGqoqSunp6sppifmqGim5+bmaOqopqZo6OVlpSfoZaclqasjJ+Sj5GMgoqAgI+Be5qVjIl9gI2IkpCNi4eTmJGHlKSKkpGHkJmQlIGIfXpsfXZ5eGJ6enJwcXN4aoJ1a4JnY2dhbnOObWJqb19wQV15a1ZeTlFRS0lNU1lWTVxebFdFWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPiORlquYn5enoqGfqKS3r62ir6+orLjDurSuoLmvq6ezusfKx7+4wr2vtL+3xLbDsrC6sbLAtru9t6q5uL6qpLWnqKqvrbivqJi4vKStvrS0oa24taemqLCzoJ6lpaehpZmerKeonqCqr6egppeiqJ+wuJ+jsa+hq6GspJynpqiam5ufopWcnJqdqaaWm56okZiSmZ2TmZahqpGbio6Qh32HfoKOfHyhjYyJeoSNhoyOjYaKk5qPiZWgiZCVgoyXjZF8hXx0cHxxc3RgeHhqb3FxcGt/c2R6bGhlY2Fmh4BgW3Jqck1OgGlYWk1RTEtIUFJQR01bX29URVlaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrJ+eoaSht6uwo7Szqam6xbezrqG4ra2rr7XFx8C3v8K5sLW9t7+7vrCsvrCzv7K8wriqu7q4p6i1qKerr6uyr6SYu7akq7q1r56xua+ppaevspyhpKCko6CWm6+moZ+iqK+hoKKTo6SitrChprGrn6yjrpidqqWon5ianaOTmpuanaWqmpubpZWUl5WcjpOXoqmikYqLkIZ6hH6Ei3qPl4qNh3qCiIWKjY+GkJOYjI6WmYuPln6Gl4yPeoF7cHJ2bm9zX3h3ZWxsbGpqhW5mcmlrZWhdZHOBYFtrdmlaSn9eXFhPT0tISFJVRzM5XV5sUEVZVVllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERUXWhELjwyZFcsMpShoZeUm6qco6GiobeqraC7t6WsvcW0sa+jta+srK60w8O8s7+6t7Gzubi6uLqvrsCzs7ivv8C3rb26taWisqmnqbGqrbGfmb+1pKe0taiesrypqKWpr6yZoqecpKWUl6CypJmeo6ipnKKfkqSgpLippKeupp6loaiToKmioaGZm52fkZmblp+hqpuamKCUkZSXmo2Uk6SopJCJio+GeoR7hIZ9nY2Ki4d6gYWIiYqShpeSkouQlZSOjZR7g5iPi3d+fGx0cmxsc2F3dWhoamdncIdoaGlkZmlpYGpjamhbZntjYFN0VFxbUkxKRklPU0AhKmheaUxEV1VeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKeoqSRjqSmmp2enaO0raequranrMTBuLGso7aup62ut8C/vLLCt7Cusra2uba2raq9s66ysby/t667u7Gln7aqpaWzp6mtnZzAq6elr7OqrLW7nqmqq7GlmJ6qnaakkZilrKKYnqSpoZyhm5afnae1prCqrqGhnZ6hlaCmn6GgmpuZm5KYnZOlnayhl5adlJONlZeLj5ibqZ+SiYqLiXmFd4GCgZ2Hi4KKfYCFiIeGkYSXlJCOj5GRkYyTe4OVj4Zzfn5meW9qamtmdHNrY2dkZHaBYmVmZmZqaWNrcltfWV5tZGFOaVhaYFZKR0hLTVJYPjlfbGhIQ1VUXVtJSUdFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxZSlZiZkA6M0JoSCU1mqOgj4ytoZeXoJaks7Gisr22obHGvLqysaO3rKqtqbi8u7qtwLKurq62r7O4s6mrubGvrrO2uravuL2spp61qp+gr6Oprpuhv6Cwo66xr7eutZ6tr62topmdp6mln5Wap6WfmaSiqJ2an5qTnJ6sr6a6qK6ioZqbnpmepJqknZeemJuUmJ+SqJWqp5qTmpqSjJWZjpSUmqmmjo6Kio97gnOBgYqYhYd8iYqGhoqMiZKFlZuTko+QkZeOkH+AjY6Db4F/ZnltZ2tpZnFya1xoY2N0gWJmZ2pubGdqamhuXWxsc3BgVGNpY2ZZSUZMTU9YUlFVYWWAVUFXU1lUR0lGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMmNJGhm42PsJ2Zk6GaqbGvn7m/taC0wru+urGmt6+nraS3uLe3rbuuraqrt6qzt66msrWyrqmwtraws7W6pqmftaicnaigqKyap72YrKSur7a1rK2fsa2wqaKbnKOrqJyUnKejnZqpoqSWmp+bkJukqquqvJ+npKCYmpmdoY9ropaZnHCClZqjf3WRqaeelJSekIiYmoCWiqGQeYeUjYNtaX93g3FshouGfYWMh3FeY2FnhJiGa4uOlJJ0d4uEfoOQgGeHgGd1aGVXXGhzbU5QamNnc4VoX2Vmbm1qXWBhio+DhGVOS0Q5R1RoXkpHUFBVVUxIUmBvdGVGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCswOD1HNzAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6LpJmGlbCbm5Ogm6qtqqO9xa+pt8K3vb2tprewpaqit7OysrG5rKmmrLSmr7Siqbe2tqinrLayrrSts6Gpn7OpnaGjm6WmmKu5lKWlr7O3ra6lqa6rrKWhnpyhp6abl6ClpZubp6adk56el4+dp6mktrCko6KdlpiXl6OIoY6Smoahh5OcoH+lf6WqnpKSmpGIhHN4jY6FiKF2iY1pl4hmfnN4oG+Ih4R+j31/oaCgmYB9iJ50h451m4psh4GDbWllY3pscmFThW1ibGmYcVhpcXCIWF5pW2xsW4hybnpyhWeGhFpfR04/R19NRVJWVlFRU1dUZ11NVkhSUk9GSEc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oiqeXg5yrnJiYnZ+qqaeqv8Ovsbq8t8C/qqW3sKmspLK0rq6zt6qopbCtpbSym621trWmp6iysKyyp62dqaCxp5+jopmfoZqss5SjpaW2vaatp6uqrKiloaCYoKajmZmlo6SYnKSplpSim5OSo6WmobekpKCjmJWTl5KciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2WAwJy/eYSFepKEfJCQkcpyl7ycxXpytaa7kHuAbZaxq7B5aGxYsa5uZWm9krxuZ3pvco/YflNrY7ayfoFylHOaoaqQV09XYk9WTkZVW1hRUVOMXFdbUEFcRFFORUhJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+OkI8P0E4Oko+NTIqMjJCRS8uMzIuKy8oLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYynk4Gnqp+XnJ6lrLKpsMK+srW/tba+wauntKysqaaus6mvtrOnp6a0pae4rZyzsrarpaSnsa2ssKaqnaaksKKhn52Wmp6crauTnaKfs7qjqqmira6loZyamqKnn5ebp6CfmJ6np5GcppqTnaGmoqGxo5+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHGuoaR+eLt9a6GQdrFfarRbpYBlnJFgZ4N7Z39qeGupZb5yZ6aMdbFqfLF4dJKUY25tp25bhKFFaGaHlkV1nGB+Z3ykp4JaX4yraICVeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TolPV1cvSVRTSkNGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWDraelnqOkqrG3rLW9v7C2xLK3usGmqbCqrqior66jsLqvo6StsqOpuKees7Owo6Wgqayvq6+mp56joa+bopuWlZaamqullZqhn7Szoquco62toJ6ZlqCiqJyYnaOfm5mhpqSPnKKZl6Cfqp6mpqCaoKGWlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR+a4Kme4KGiJOUk3erZ2uxXKt6jYaUdIlyj4eAf4iQl3iCgYuYi4Ogj4SwdnefcWxsbHyLTqRYSGJimX5jaKZgeXJ1U5OHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVdYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozo5PDg6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPTxTfW4zK1hqXE9YTV9nVzdKOGFVNTAblKCViLOmpqGvqaezrKm7tsKwu8GtuLe/qaytra2mrbGpoK67qqCntKyjq7SkprKzp6Oinqeqsaewp6Wdn5+ulZ6ZlJSVmJ2soJmZpKi1r6Kqj6qoqpudlZegpaianpyinpufo6WjlZuel5mcoqmbppmcm6Kgl5ORk5Ocg9WTmblwsMF+xYZ81pSbu3yalaWPjZ2NpHuOiKSDpYJ6rHmPnVaveoh+n2q5Wrl2hoR+poKUe5h6qniNnY96sW6OhHSRvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhYCJfGOkM0Kddl1QamljUEBYZ1pkYUpITW5OXFFPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjtESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUDcxJZuilJiyqKimtKqltKmkvLfBsLm/sbW0urK0p7GvorCypp+ttaeap7mtoq+wn7O0sKGknp+mqbCotKijm52dqpWYl5WVlJagqZyZlqetsKmjn4+to6iWnZaboaWhmKGhoaGaoaKnm56gnpSYmqagm6eVm5ufoZiQkpSQnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaJ/kaGmf7F2g5HS0nZcrnuFf6Rvm6qma4eFfa19mJmOe7Fxkp6OeLNll3SEnm+eZpRRyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBT2tgbGhQVkdJOT1VUlpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YUw2MjCinZKlsKyjq7ytprSmp7a7vLK6vra2tLm4sqW0s6CxsaKeq6+kl6a5raSxsJu0uKqgpZ6hqaSxp6ypo5mcmaedlZOXl5GSoaaflZOlqrCmopaTraCmkpSgm6Smn5WapaahmqOfrZmgnp6QlZuhnZyllZ2VmqKflZiVkZuFrHt3qHajjYiGqW+tioKng5iYoYmSmouif5Oaia6Ff4KzXHKzUq59goKkf3HXfXiFfo+dhpqZdq+Gh5Gch3e0YZplmoKClW2SWrBYS5p1mHlmYK1edneIaJiIbF2vd5Wej3hsNXnIrrJfQlRvXmdgRVBsYHBtVlZNLmZkaVNZUDtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BIOjk5oJ6VoLmwl7TCraizqKmyurezt765t7G0urSkt7Kfs6yfnqirn5Sntauor7GqrbSkm6mgn6ehtaamqaKYnZSkoJOSm5eRlKGkmpKQpq2vpqGVmaqgo4+RoZmopKCVmaWonZyknq2doZ2gjZOemp2hmJmblpeioJSXkKadhql9faV4oY6NgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02H92iHSogY6bjJKke5SPn4R7sl6dZKB+g5VtklyrW1qTgJF/aGeqZHJ7gWuYh3Neq1qJoI5rb2VPSkOhXFtMdF1iZ05bYV9yc19LVjdKm5VZR0U9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA1Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKKemprAq5i0wq6rramltLC3sLW+ubmxsLW6qLq0n6+knaSnp56TqbCpr6m0q6quoZigoKako7mioquglpuRoZ+Uk56Zk5een5CMjKiwsKeel5uopqCMkqSXqKqnlJepp56eoKKtpKGeooyUoZifoJKel5yVnqGVlo6rnI+ubXK0c6mLdYqnc7R4c7OAkaSjkpyOiaSHkHe4cI17i6Jqa7ZaoYVll5dpoaKnbZRytHSTmX6yaoWRh61qdbNhnWaib4eTa5dcrV9NoXyHkVJzo2x5f35vmIdyXa9WPJx3ZlRvbi5cp09jU2tlYm1aY11hcHtjVFpSPj9ucDNDQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimnJuevKGbssCurausp7ept6+1v7S7r663tqrAtaipoJqlo6Gckaqpp7WisqeuqaCXnKefpKu4naKsmpWZjqOilYydoJuYnJ+Rk5SqtrComZWcrKmXjJSlmaWsopGWqrKjn56mq7GZoaOPmKKWn5uWnJahk52pnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyXi4yniHqktnV+d3bCgpqyYIO6ecB8dbhjtYKMh6l9lYGrqXF7f3S8iKegaZ1hpo6voX6MdIeqfb5vc7x0soN1eIGKbpqIcm6NpHS9Xnd9WmF5vGtaVlxqeV5qYWVnY214b1pcWUNBQXNAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I9RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueor2hl7LDsK2qq6yxp7evtsSwuLCtua6twLCro6Geo6Gcm5Coo6qypLSlrKWelZqqmKasuJyirZeUn4+kn5KMnKKdl52akZaSr7myrJaYpKinlJCWpJykrJ6QoKirn5qfqKOzn6OljqeilKKanJiVo5iQr6CSlKmehJCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0n8G7vZp7gbGocYBzkbmDfIaGjIeNfIqHjZh8pLu5vZx0erSjdHeXdnSwdZmeZoZqjbV0cnF3toxef3p9iWiDeW56Y4uscHWFf1hbp2pFZVpUZmBjXmNRZ2dwbHVDTlBNRDtaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz43MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9dXT0rOlZVJz47PKeeoaK/pZa0w7Ssq6isq6m6rrDFrbOyrbams7irqaGhpZ6gnZmTqqOsqaW1p6efm5Wgo52rpL2moamWk5uQoZuRj6GnoZOcl5SYlLG1t62ZnqSkoouSkqabpaqblamlpZuZoailp6SpoZGtn5aknpeXl52ej6+olJumoY1qfWmbpneHcn2ZjnR5ZId7vb7Aum+Tg3KWiGByalpem4lgY4iPlWtggJVjbZ13YpVsgJqVlGVeYGNwmoppcot9hpVna39ydXh9fmJbd3SBaFBcbYN9e4trWGt6gnNKSm+GcE50TUVYXWdhTFtXZ2NfT1ttdWlxUlFERU07R0k9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUtPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz5bTyc/Mj6poKiiwqObtbq2o6ylrqentbGsyKuvsqqzor2wsaafoqedo5uZmaumrqOktKilm5eUoJumrai9p6iklJOblZ+ZkpekqKiQnZGQmJywsr+snKeep6KJk5GpmqijmpqroKOZmqOnrKOgq6OasJuVp6CWlJ2fnZewpZihp5mbkJycoqKYpaGZm5mZmY+VgWdtfXF3kpiUkoWLtaqNhpiVjoqMmJaHlJWKhJOUkYmOk5SYlJiWmqChmpuUoJyNgnqlhW1rfZF8gHWKioFxgnh5dnWJf3yKanOBdIN1ZXd9d2tvem1gY11waE1ZWmZqYFdab3ltbWZUUEZTOU9aTVFPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEosPC1As6GzosChpLKytqCppbKnpbC0qsiqrK+ltKXAprOgnaSknKOVlZ+qpqyio7arn5iWlZ+WramlwJ6ro5SRm5edl5KUoZ6eoqeTkpmop7LEsJurnaufkJaWqJ2qnJyfrJihm5yipK+noqWon66Yl6edmZmgnp2cr6CcoaaVl5KXk5+glKKdl6COlpOKio2Ol66QfJacg5KCi6qphYCZl4mEkJ6IeoSQh4aakoiGipaPm5eNkZidpJaZk5CcjX+OZ6Gzr4WKhHZ7kop9d3l6b2Z5j4GAiWp1gXmIc2lzf3t2g4eCa3VkeWZgamVjZGZrWWx7b2lrXVNMUEReVEVAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYmNhX11eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFtHNTwsQLSgubC/rKuusrGgqqayraKss6/Er6mqorGtvKKzm5+moqGcmJenpamlpKWytZ6Uk52Zma+lrb6gq6KQkZ2ZmZSRlaGcl6ichJ+rrKO0yLSgqqSrl5aXmqadqZufpKuUnp+doKqvqqakq6Kum5+goJiknpyfnK+jmJ6nkpeWnJGjmJennJqXZYKSfGV+jZqQY3mObWhre5Kkqmplm5h9Z4aKZWVpaHuOoY9rZ42YkaN3a2qLmaOfmHNsbXqEjoh6WGZehoNebYyKgXZcaHN3dpGAiIJtd4F4f3NteYR0domIj4N8a4dZXmx0ZF5ziWlrfHFrZF9STlhJZFhBSjQ+Rzc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2moLq9uq+stLGqpaitrrCmra2wvLCopqOtrrCerJafo52hmZmmqpyto6WnqbKtnpSjj6Kvpba5pa6ijo6aoZmTkpqgmZmklXymrqOotMS4paKnr5+dlZ6inqOco6mokp+hnaGqsKurpKugqpynn6egrJahm6WwpJebqZWgnZqRo5adqZedfb2DiHK0coSdhq1oeLnEuHGToqN6ppmZcquCfMvAwLtxjKOIgp99l5mJncC9gpedno2dwsF8gnyTjZrDwH1spbJvjIFvynp/m3aQg46BdXmAgHlxen+HcHeFjJN5bniUY2dgeGRgZYJjXnRnbGRkWUxWSVFaSE9EMklFP0RCPi88Pz5AQTo4Q0NCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVkFCOy84lqO5w7WwsMCpqJSjr6iwrq2msrOuqaSlpq+rn6qYmqKfnJqqpqGcq6KkqKSktKScopKmrau3s6euopGQmZylkpGfoZibn52Ip62lrK7AwLGhqa+plpKfnaKaoqSqo5Ogop2era+qraekpKihpqWdrKiRo5qoramanKibq6CVlqSVn6KWnH7OlHh6pIF5lZabX66PXo6ngaKgfKeWm3Org4CvXmONqnuoh4WgdZeTiLNjgquGoY6Ns2qEr3R9l4i3YYOtWqPNbpB2e9p7f5lwfYeSdn1leod2dmt8h259hpGRfm2DkGFybXBoYGB6ZFxxaGpkZ2BSVFNXXUtPQzVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qnrbOrprKrq6qjqqavqZ+mm5mll5yir5+gn6inoqWgn7Crmp2Vp66ssKqoq5+UkZqfpJKPnqWYnqejn66mrLGpwMezqKmxrpaSnZyil5+pqp+VoZ+dna6wqayqnKiopaKrkqyylqWiqqqdoqWkoK6fkZimmJ+Zk5ORl6BxhYyXdYWohnGxfZ5yrH6in4Glj552q4J9rX+cc61/rIeGn3aZknt8l36qiKKMkoydfqt7iZSQn4B7rVedxXuPcJPBfYGVbXVvjG1ldmWGb2F3bnJviYqSj4NukpFmcHV1cWFnbWVfb2lpb2dkWFRdYVpSU0Q5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5cW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzV0BGIRxHOkMxLiuw08bGsrSgnaOOo6KirK+2rqixpqiqpq2rq6aho52ZopWfpaufoaWfqKiinp2wrJealqinrqunpqeel5SZo6GRlKCtm52no7Ctpa22q7rOsq2mrqyXlZydopmerqycl6Canp+ps6urq5utq6Wjq5qusaGnq62lmKSpqKivoZGVoqOZk5GEpGqkdYl6qXR6snCCpoqZjHGJoJuHpGBgUquFf66Dm3atgqiGhZ96mZeGe2aAo4mkmYaCo32pfoKWh65ffKlWnqOSgXqjn4B7w6/Fi3Kvs7O5cmKpr8J0aIyMmI6CbpyVcW96eHlwbWdlZXJwZn1qY11XYGpYWVVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMlBLTCMgQTlENCwnwsnV1L+hmaunoK+inrC0sK6prKKnpqiqq6mkpqCbpJ6dpaeno5yrmqKsoaOfr6GcmpKrpLWvrqCnmp2Vk6aikJqiqKCgppyxpqapsq63yLK1qqyplpGdnKKZoKWznZqhlJ2fp6ytpLCbraujo6qhs62hqrOxoZqop62utKGRlKKml5qRe6psnoSHdat5fLBvgqWMiZ+WlqCVgdK4tLjJgYGyX2CUqYOliIegepiWmniqyXSapJWoqZGTmo2BnIqaxsZ5Z6GCpXSBn46Cfa9dcLRisHVLo4dtp0eCk2SPkJ6RfHGZlYFxfHV+fG5cZmpzcWaBa19hWWRuXF9ZSU5NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraylopyyuKyqoaWaqKSqq6qmn6ammKqjn66rnaWgrJqeqaWcp7aeopeTqau1sqybpZyglI+lrJGZnKijoaqnrqKlp6mwtcOys6qtqJOKl5ylm6GjrqWXoZWZnKamrZyxnq+pp5+so7esobG4r52arqaxsrGjk5amopiejoKdTniagX+feoSjfYOkhYemn52flIS4e3t5uYJ/zMbCtniboZGLn36alpeKdp6YiqSXo6l/sIWdhqCErH2alWOmbaRwj4WQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+lJONd3tzhn9xXG5ueHJqgnBbZGBpb2NkXUxNUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWVlaW1xfX15dX19dWlpaWFVTT0hAODgyLiwqLisqJyc/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6Sruaqun5uhrLKzpZ6glaWtra6qp5ymp5ujqKGzrqKpprKgmKmklKO2oqKVl6KptLijm6GcopKPobGZnpunpqGisK6dpqmitrLFsa2pramRh5CcqJ2ipJyll56ZmpqmpaubsKKvpaeYr6S7rKG2tq2dnLSxt6+xpZecrp+inYWP0bXDt3mHjoWRk5CApnmUoXeMoJKEpYGKcaqGhbRucmmapJyVip98mJmGh49zr4Klm6KOpouTnYuWkJtucbJdpXSTepxsmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jY6Vjnp+eZCDbmp5aXpzb4F1XmVlb25maGBLW1hYPEhIQFU0QEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bW1pYVVJSUUY6MjIzLy8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklknOMiq2+v7y6tJ6Wp6SttaGimZSiqKauq6uYpqOfpaGhtqejqKewo5Sso46kraKdkJqaqrOzpJyknKiRlJeun5+ep6SdqJ22m6OrpLasxLCpq6mijISOnKKgpqKWmZqdmZyZp6anma2or6Smm62mvayUva+sn6GvsrepsqWaqLCip5d5qJF9fLB3ioCkpYicbbJwoYetfKGPg6eVmICsiYWthaCVqqCil4afgJmVgHuSfquAnZqWi6t4naGSipSSgXqvXqSBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkaaZg5aOmo58fISZgGtuf2N/dG6AemBoZnFvaWhoQ1phWz5LVTNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RUlNTVlpdX2FgYWFhXl1bWlhTUE9OSTcwNDIuKixBVFZWVlVUVVVVVVRUVVRUVFZXV1hWVVVRSEZJSiMoKL2TmoOoxcK2wLOemqygrbelo46bpKKfsLCqn6Wgnq2Znrmho6ugr6mZrqGQq6ijlomakK6wrKaepZusl5ePrKGhnaahmqWdrpihqKe3qcGvpKmknouBjpuan6efkpSZm5WbmqalppuqrK2kpZ+pqL6klsKsqqKgqrG3qKylnrKtp6iXda9+kIuchYd+uq2KmWWwjWWVrX2hj4SmlZqBrIqEsIWmmqShoZGFoVxsaoGzYH+te3uDgbFtZ2+ZmYyIsVt+tVykhGvIomSfgHu8WHa0WbJ9Uq6AeqxYgKFtmI+om4yYkpqafHqRn39ldX9jhnh0gX1iamdxbmdmZlBVZFxBVWA+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBRUlRXWl5gX2BhYl5fXFtYVVBOSkZDNTUzLi9AVVlYV1hXV1hXV1dXVldXVldYV1dYWVpaW1xYV1dHQjvSn7Kxt726s8GyopyspqS1qaCKmqCenLOzqZ+koZ62maC0qKqsnq+tnaybla+noY6Im46vq6imoaWZrpKYj6mZop6ln5qjo6WZoKKqs6m9r6Sonp2PfoublqGhmpCRmpySmpipoKKaqa6opqaipKm7nqDGpqSooKmzs6qtpZ66rKurlICpkqOvjpuAh6SXmZCCgLjDuoOOnJOEp5ecgqyKgq+Ip5ybpqqQftW9wqpio7+9fX6jgoTXuri1hZWTg569voRto4Jvq4RsnH96srDHg2mrsL2seHeivrxzgJaOp52Rm5KaoHuDk517ZH57ZY9neYJ8YWxma2tjUWJbU2pcP1ViQ00pPTo0Lx8fJB8lMiAdJCgwNDk2Njc3Oz5BQ0ZHSUtNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWzs7C/uLG8sqKcrqalsqadi5ilwKq4sqiiwKeos52fsp26qJ+tr6WnlJSwq5eMg5uRrqWirKCjnKqgl4ujkqaep5yaoamjmZ+hrK6quq2no5qXk32ImZGmnJOPkZiZj5iUqZuhmaqpoaunoKOqu56oxKKfraKosrKnrqmfuaatrZlzdqqluIZkiaBwaK6Ri5BubnekkJmfgXWumJRwj4txlaijmpeupHJsbGxmi3hvboKZcYF6anFpZ4qXlphxaWmGiGdxhmRdiGJqb1lcZn12pl9hcY6RbmVkf42Tj6KZmZmTmqJ+iZGYd2eJeGmPa3mAemVtZGdtY0tlWEprWjpRZkZRJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dXV1ldXl5dXFxcXV5dXl1bW1VXXqmUrLOpubiys6qpoa6eo7OqmJK/s8XKv7eqn8GtrqSiqKyfuqOkrqutpo6XrqmPi4WVlq2epqqgnaSjoJGLpZKnmamal6OqoZaepqeosLurq5qbk5N8hJaOppmOkpGZlY6YlqmWoJmpo5yxpp2iq7mfr8Gno7Klqq6wqauppbWirLaViqGoprediZajmYiqm5GVnZKps5mao6qgspaioZ2fopyhpaKVq6eNkpKMh5OcnZWRmZOZkY+VhYGlm5iWjouUlIyQh4V+Z4l+dIJ1c4eKcKdsepOQk5KAgY2PkI+dlaKXmpqlhImXkHNrkXdxjHh3fXpqbWVkcGVVYVlAalxIY2JQWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVFZZXmBhY11eVFFLRUM+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCmlqiqpLS2rq6hsKOtn6C2sZCOrMi+xry6q6Omn52nn7Gpo7annam0pqiRmKyii4eJj5ynlaykn5innp6SlKOXqJqompSmoaSRnKmaora7p6qYmpCNfYGVjKKVi5WRlpGQlJimkKCbqqCdtqOdpqu3p67AraK2pa6ur6unp7G2n627mJGlpKa2opKep6COqqCOk5+jq7CaoKOwqK+Yo6Cco6qenp6dl6ydk5mhm5SQlquajpmZl5GWn5GIoZ6WlYWSjZGOlYuBfmaLhXWGdXiHgnOcaoWPkpOQiX2LlZKSmJSjk5+ZpIWKm4p9dJd0e4yAc3x/am9lX3FqYFtgWm5kUGFmUVo6R0dFPjI9PjkvKiYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlhZVZQS0FDQjo5RU1WW15eW1pcW1tbXF1dXl9dXl9gYWJiYWFhYGJiYmRiXFtjl5Wjp6Kvsauuo6mmrJ+ntaqQj52ltb2wrq2jpJt8n6SypKWxqZebuaajk5mqnI6Giomcoo+unqKVqJ+gkpaZm66LqZaPqJmojZqqkJ+6t6SkmJyNiXqClI2clIuVkpSRjZKXo42fn6men7ijf4OvtaKvrnSjvKKwnnd4nqevuJR1rKOeiYCrf2RcYnagj6WfhJh9bZKznKOnraqiZZ6fknN5mpdxgZmomG1/oqiKZZymnZKYmJaNkpyQhp6bkJaEkoePkJKJhXdqjod2hnB7hX9/YGiHiZORi1p1lJBnaJCPc3uonJxme5uKhXqZaoWMhG96gGtyZWB3cGxraVxmZmJicVRbPk5OTlNHPkBVRDoxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXWBoZmdYUUo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgrq+sq6mlqK2ip62kkpart7Gzp5urqK2YdI2esaCoq6eUl7mgoI+cpJ2Rf4mImp6Mq5mhlKehnY6Wkp6Edq2PiKebqZKZpYqdu7SooJmYi4l1d5ONl5OKlJGRlI2QlKGPnKGnmZyylYCMm7Wds4ySjrqmn32nonmgrLR/jo2lnoOLhpCwqq+Ni5ekm3qBi6yFnJ2hp6inh5WFmHelm3qHnIGXp4KCe5yyeoqGoZialZiWgpGXl4SbmWJ6h5CFj5CSi4NtcI2HeYBwf4CEfoVzhYOUkXiWaJJ0oJp1fZmFo6CJmH+UjIWFmmuPjoZseXxxcWhleHBqbGtcZWxqZnVdXklUTFJARTYuWlVVNykhMDk+Pjc0MzU2ODs6PT4+QERJP0pFSktHU1hbWVxiYWhmWlFIOUVMOz5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kfpqytq6isoKevpqappZmUr8nAsaKXqKq3n5GFnq2cp6KgjpC+npqMn5qgkHyFjpiXh6qboJWfoJGMk4mGgJGnjYejnqSVmZ+In7qyqJ6ako6FcXaQiZWQipSQj5uMkJKgkpihpJaeq4eftIm0mq2KyoeprIi2hY2wga+sgqiMppiNnX2oj3N7d52Pp5dolaR5tIyfnqankpjCgX+riJihcp6AmqV9l4WVsoGhfaGUoZCYl4GPlJyLmZKLfYWTh42WkomDbXKPhX55cYaAg3uDdISAloCPxWZ/qYePo2uehaSdhZqBjo+Hi5pxkJSGaXl1fHhoaXZyaGhsXmRwbWduWWdHXVJNM0U0N05iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5pbFxRRT1LTUBKY1hdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJain6+nqKilq5+jt7Cpq6aalKCkpaylmKasuaSwgaKpnaaenYmUvZmTjaGSno95hJaVkYeqmJqamaGEjot3m5yPn5CInqWcl5qZiKS5rqWanIyMfmJtj4uTkI2QjY2YjJGToI+VoaGZoad+oaeHrZ2glq2PnZyckIWAoIyprIWjjamZjJp/onWBmZRsgq12Tat4h42ckZqopoCpq32DoXt6p2qef5JrZ5eGl7eJnn5uYGRZg5eAjXtkaItymX15lmxdfZdtX1Jwg1xfa3iCX1hkgXyDf5dwp6prg6NucqVwn4WgamegbVtvjH1nWmCEgWNYUXB3Zm51c2tqb11qcW5sallpT11ZRjlBNUhEX2w1LElEUk1OPTg0ODU5OzZAOzs+QlA+UVJMTUJKXF1fV11eYnVgTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnaC4oKmjpqyRoLa7qq6imZiho6atr6GesLakqZOioaCnnJqOmbSZkIufjJWLdYGTkoyKppSUmJ2efpKFhaykh5uQipmqmZubkomnsaeilpqIiYBpboiHi46OiouNkoyRk6ONlJ+fnKKkf5OBj6KhlKB2nJWPp4Kgpn+Fp6uDpXiJfISafqJwc5SIlnyfjXlthpuMmY+bqJmOh517gqJzdqZmnn53pF+Yen2TdKJumLe0unSTiIOAtahkgca4e3CVtoxygJqjYnOsq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRhnZmzlnJ9mJ+zdXRcnrKDa2NwdXdyaW9Ya21zc2ddaV5iTEU9RDZRQlpzMz1TR2BKUj08Mzk1Ojk2RDs7QEpQP1VNT1FARF9fW1pYYGB8ZEhDOE1XVVdiYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlZSjt5iqm5OfjaS2tK2toJqinaSjpq+dnLOvrZSZopqhpZmblZ+rm4uIkniLhXGBlo2Kj6COkpSdmH2QiY2ooIeXjomSpJWcm42LqailnpCXh4V+anuHfn2QjYOLkZGJkJShg5eeoJ2fnouJd5yYoo2fcaGKh6mHm6WOlKapfa2MfnqgmXqjk3iBdJaIjZx9lp+Gm46Ym6WFomShfIiWkJuNbZ5om45vmpl6gIunfXJpdKuDn4N0qmiVml2bhXaFnmeqa4C4ZlyocIGcYJWMXqd2dYeIfp5omnWGk5KXjoCfb5qRbqeaXal/ebtrfqpcjoRdtGhdbnJ6eGtpXHFreXpkYGZYYkJRRk83V0NSbzVMW1tfTlpEQTI1MTw7N0g/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuJqbSap4hjlJurubGvrJ6mnJypoJ+vnJ6yqa6fmKWboaCZl5ego5mGiY1qiIBye5eIi5aVg5GVmJB6ioSVpJyKlI+GjJ+Tnp2JkKmjoJqMkoqBgGmBhnl/l4x7iY6OiJCXm3+Uop6foZOYcmifiZ+PjHCSjIGph5ieoaWepnuwraOiuJd3o7OjpICJlHmde6uZfqKOnJqWiJdxoXyFja+1fWuakaF5fpi1oqSrqISZfJt9npt/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iianF7jmyAiISZdZt4homxs3+Am5Ond4OebnN9lXCadGukXpV2SGVkYXRyf39vZmBsaXd8ZWVhUV9XXVRXQFpGUWhFVFddYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUI8VV9iWmVpVmdobW9iZmdeYWFcXV5gaGJfZWN2bV1lZ2ZrZGVsaWlraZOcgLCtmYRTXqCms7mysqmaooycrJycqpWiraWjqZCgn52bmpaZoZ2WiIeJd4aBb3mVhZGbinuRk5aIcoCIkqGcc5GQgYmalqGchY+pnJuVi4uLfYNshIVxgqGMeIaNiIiTmZZ8k6OgnqKIrYZ9tYSOnp17pZZ6qYCVm4+Jn5t8p2h3bX6ZdKFzcnyehplwk4OufaSDpZ2ZgKNvXqhndaJjb6VhnNOQfXuZeHNzYqKGkH6jdKSQdmuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdm218cJZtf3Kicl2kZ3OmYGimbZvUmn6Gm3B6e5dsnHx4l3NuqaRnYWV6coCFbGhmZG92eGhgY1NcZlFRYkhZSlVhV1RcZmtcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWBmZmpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWllfGReZGdka2RqbGdobGiXmn+vqlRcS36pr7Gzr7Kjm5mFmaqhoqWPpqmhmquLm5mZlJmTk6GYjoeFe3B9hGh9j4OUmoB3kY6PiW9/hY6SkmyXk3yKk5Sll4OPq5uUk4uGiXmDdoiBboKfhniBkoaImaOYe5Sio5mfibOhoraLeqynpK6lcKmAmo6FgJqQe6SAoZmGmHKehKSur4qXjICNpI2Vg62gk3a1trXJoXOUi4GfYJ6XqW15loegm3SiiHegfpOXi4FwTWajknCbh3Oke3l0YYOBa36ga3FkX5xxfXOWaHlosrW0xqZzmH16nWucm6t2hZtud3mYapp7dZhyUUV9s19qd2x6iGdraGN1dXFuV19UWWlQU2hJV01ZVFZeaWxvVmhXTktBSk1LSEpPQVFLUGVjam1ldHJzf3l8bnWJe3tUUU9sXmlca2lSamhpbGhsZmNlX1xdXV5pYmRpa3tfXWRnY2pmb21laWxloZuIrqWDZD+TobKqrq+1oqKQgJiro6Omjaaon56nhJuYl46XkJCck46Ig3pqeYdlg41/mKB5dY+JjIFphIWRgoyFnY16joyXppSEmaqYjZKLgYl6gH2MeXCQoYZ6gpWHiZagln+UpaiclZWDZm54nGyiZHtxpXebmHBnpoCVinqkep+Wg5dznneBipWXj7lukYqiYn2ZoJWIbnJpqmt1oG1vpmCbaYuQaZaHm5Z1ooF+mmCMho11cIhiaKBlnn5pm3VvY2aIgW1xolpeW2KhbF2Ii256fXFxZKVteKJkZ6domXOMmXCicFWJkG+gX2aoVIteVJhubnRrc4NucWlseXRrcFJZV1dmWlRtSVpQXUlYaWlzallsV1FSRlZcTFhTYVVpa193dHt9cHx8coN7gHN2jYCEdl5ScmJnY3BnUGpoaGtsbmhkZ19dXl1gamJqaXZ1XVxjaGNqanNtZmttY5yjl6V5ZHNti6ato6mwsaafi4CYrJ6fp42jopyko4GWmZSOmpCMmJCOinuHcYCIaYuLfJibc3WJfpB7ZIOHlImKlZmCfImImKiSgaOtkYaQi4KKfoCAj3RpkKaEfYeUjYiZoI+Ik6mmnYimeJWbfqSIlouxmJ2Qgq+Xn6V2lIZ4qXOlj4SabqSijJKEjYO7bn2lr4OGhYaTlZyffKV6cqiVoJZnnn5vrGSWipaTd6htqqKBiXaJg3erkaaIa5Gwa3azjKlrioVtbZ+ekpVgfquLqnZ+foqknneffIOklZ2gapuIeKxon66MtnR3vo2kk1qDp46rYXZzdXJ8dXFja39vaW1TV1tWYWJda01dUl5KXm1vd2BbcVlcYFtndGVub3JjcnRgd3p+eXJ5g3OEf4F7e4yBg4B2YnhkY25yZFJrZ2hvbHJqZmlhYF5cYWtibWx6b1xcYmlibGp4bWdsbmKVpKmcgX+do5apqZ2opq6kmYqCmKybn6aKnKaeq56FjZuQh5yRhpKNjIxzhnqIhG+MhH2Zk3R0hnOSgm1/i5GHhpOOfXuCh5mnj4Cnp4+BjomFlXaCh5JvbIupgYOMlI6JnZ+JjJSqop+PgHWUl4h+gXmUrqJ/gZpxj4Z3jomCfXtyp4xyfn16mJabhJB5e39+h5SVk4p2kJieoIN7fYlrjIVbeXlyenFpbn6SiXGAdYGPlJNxh4SCZYx/X4F/i3d0cpR1b3lubYdsg4VddWd3jmV/gISMp5l9dHuVaomIcIF2fYd3bm5ojXR6fJh4hVxsWHmPaW94c3JweHhwXWyHbmpnVltgV11ma2RWY1VfUmBweXlta3dma2trd31ycnV0YW92YnR7gnh1eoJ1gICAgXiLhYN9e25/bGR5bl5XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5obG9hjZO3qKaJoKKapqOYpJyroqGEhJitkp6iipuom6qZg4KcjH+XlIeOiomNcYJ8j31+joR7mI90coRxlYV7fZKLhoaPhHl+gIibpY98qKKMhpCQhZWDho6YdnKEqYaOkp2QiZ+eiIybp5+fqoOJjpWafn6Jlq2nj5Glj3dvm4+BeJBufqiFcX6VcWtwfYKgjYCTjotobFyCi4ubmp6Oc5WLiHF0a4J3dIFZcm6HkYF+f4xqXWple4aEiYBgaXh6mnuCioF1gYWBZ3eKhmpfb3GBdV5xiYCIjaSUhWWLjYNud4uEcYaPenFoaWZ8hHuWW1xraG52W3x5eHZvdHODaF1ui2trYlpaX1tZbHFcX2FaX15mdH98dnB1ZGtra3x9c3x5dWRudWhtfH53enx7eXqAgH5vhoqEe310fnlzf2hUXHFpbHZwdWdraGRdYVhraGtrcXJuV1tlbmxnc3pvaGptYIuKqbChj6Khmp6dl56YqKOifoOZro6glYmdo5GmlYB8mIZ9kpmKiYeHinJ9gYx2hYuBhJeKcm+AcpiGg36Sg4SGiYB6gYSNnKGRg6iiiHmOl4mVi4ucl4SDeq2CkZialYqenYeIoaqfoaKki4iTm5yjmZWqoaemn5KahpSMenaNjYOnfn+SkJKUnbKmm5WfkI2xkpeDpYyMlZqfiZCbgoiRimt8jnd4ZYOHkYt8iZ6Eh4yQiYmBhYSQd3x6dJmgiIaJnYmEk359ioB/dG5yhIF9doWFiY6kj4KFjIaCjJCMfYiMipGEem6EhX56mWtzaWF0inF+e3h3cHh1gl1eb4dobl9eWl1dU2hyVmRdXWJtaHZ8fXRvcGVrammAfW55gHJqcHFsZ4F7coKAeH99f4R7bYKMhnx6eHt9eoN4TmN2anNucHpla2VjYmBbdGZwZ3JxbVVdbHRtaXl6cWdpa2SMh5y5npahoJiUmJmUmKShnnx/mqyPn46HoJ2MnpZ9eZWEfI6ZioaEhIZueYGBc4GHfYmUhG1rfnqXh4ODj36Ah4SFfIiFj5yfk4isoIRzi5CGkpGLnZF9jXuqhI6TmJaPnJeHh5uln6KZnIWCkpqZmI+ap5+lnZyPlX+PiHV7ho2EpXt8jpCRhpmrop6UnZCOqY2QgJ2MiJOZnoKPl36GjoNveIZydWB/hJCGdY2ZgYOQg4eFf4WElW55dnSSoYqLhZqEhIxzf4l7fHFxeoeCeneIjYORpY6Fg46Ag4qJineGiYuNfnJtgIJ9b2lsbmheen9pfn13dnd2e3hdYHF+bnRgY1tdX1JnblRmW15ia2l2en9ybG1ka2pogX9sdIJsbHVvenCGem6HgHaCgH6FdnGCjYh+e3x8f3uCimBoe2p1aWmCZGpjYGlcY3Vob2J1bWxVY3F5ZXB6e3Nlam1ti4metpmgo5+SkZWYi5qen557eJ+nkZyLh6WVjJmZenqNhn2JkYSMgoKDbnyAeXOBhH2Lkn1raH2Cl4mBiI17fYaEhnyQg5GdnZOJqZ2BcYyLjJKGoKGKhYx8qJGJkJKXk5aTeI2jn6CdlZh+gJCamJKMm6Oho5mWkJp9jIN3f4KOhqB/foyMj3yYpaKik5qRkKaMj4GakYmSl5t+k5J+h46BdXSCcXdhfoCOhnKLln2IjHKMf4KFho9oeHJ4i5iRj3+WfoiJcoGGe3xwd3qKg3l4j4uClaSTioWPe4aGh4R2g4SJiX1oc36BenxybWxoX350aX12dnR9c4FrX2B0dnB3ZGNZX19Sa2lWZlpgYWhqdnmCcWdrZGxoZoCAa25+aG9xbH54h3tsjIFzgYF+gXR2go2Gf3x7gIF9f49pcoNudGlhh2hsYl9xVnRvbG1geGhtV2p0dmN1entyYmpveomMnrGRpaScjo+Xj4acoJudfXeloY6YgI2ji4malnl8hoh/g4l/iYKBf3J/e3R2g4V9ipF3Z2N+hpeKgoqLeHyAjYN5l4OWmZiNl6Gcf3CMgpGThqWbh4yJg6aWhZOLlpeTknaRnaChl5OVeH6Ol5eNlpudpJ2YkpSaeI2EgneDlY2dfoGJjYxzl6OfopSZj4+ijIqClpeDkpaZfpiNfIiNgXZxfm57ZIB8i4Vxh5OAkYJsh4OBgImFZnVve4aRl4t8k3iLiHt/hnt6cX13iIV4g4+HipehlYGDi3aIhIOCd3yDioZ4YXp6f3WAeWhtZmJ/amt4dHR3fnJ9Y2Rhc251cm1hWmFeW2xlU2RZYWFoa3Z5hnFja2NtZmh8g21pdWhucGmAfYN6bpCGcoCDg350fIOMgYB+e4KDfnyQbXaJc3VtZYpsamJidVaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5utl6anno2Ml4eGn5OXmX54qp2LmnuXnYyMmZB5fIGMfnyEfIGDgXh0eXp0fYCEf4mLgGRffYuUh3+EhnR9fot/fZmGl5WYjaSimYBzh3uTkYmmj4yOipOgkoSSkJSXkYuBj5efmpGPj3J/jZGTiZ2dnqaXl4yUlXKLjIlrhJePmXqHiI+Jb5eem6SUlYuMnouGgZGcf5KSlYaZiHuKioF5cXpsdWx8f4t+boaTg5V4cYKEfn6LgGVyaXt/lZaDfo10kIeCeIZ9dXd/fISAe4KLgouTo494g4F0iYd9gHR2gomFcWJ8dntyfnBjcGRlfGNvcHdzeXh0dWJ3YHBsdm5vXFxfXl5rXlBeWWNhaG50e4lsYGlla2Npd4duZ21pa21ogX17eG+QiHOAhIR9dIGGiXuDfXqBhH19jnJ6i3h4bWyHamhfaXJjh2dxb2V3Z25sYXlpa317eHBheG2LgJiYqZ+kqJ2KipKGip2LlZh+eK+ZjZh+n5SRl5SId358in18gHd4gIBwdXR8b4Z9gYGKf3xhXH6PkYaAg4Jze4CHeo+SiZOSnZWmnJaCfYF9joqRo4mOio2Ymo2GkpmUlo6KiIySnJKPi4tthJCPkYiemaKglpWIlpBth5iDZYWYjpN6iYSQinCWm5Wjk5KJi5mMgX+QnX2SjpKMmY57ioWHc3N2bHFudXyKdG6GkY+TcXWBfIGBiHxlcGx5e5iTfIOIdJCJgHOHeG5/fICFe4SLh4KLlKeMeoZ7fouFeH5xcIGHhWZpenV2cXxjX3Fha3RfcWt7enlsc3Fmel5vbHNtclhbX2BhbFxQV1hlY2dxcX+IZ11paWdiZ3GNb2RqaGVpaYF6d3VvjoV0gYKDe3WCiIV4hXx4hIV6f4l3f4t7e3J4g2prX3BodIBrcm9tcmdvbGV8Y26AendxbHd3in6il6GnoKabh4uLgY+ch5OddoKrlZOPiKGNlpSQgHR8d4V4eX9yc3uGa3Nwem6LdoCBh29wW1l+kY2HgH9/dnWAgICgh5KLlJ6aopWYeIp/gY2InJ2Kj4aSmJaFiZWakJeMjI2NjJyJjpCCbImLkZGKnZahm5eUhJeGaYOigWWEnImQfouDi4F3k5mTn5KRiYmUjX59jpd7kYyPjpqSfIqAgm92cGxtb3B7hml0g4+Zi3F3gHWCiIN5ZnJudX+YjnuHhHmTkHl1h3NviHqEinmKhYGGjZuih3uDdYKLf3h5bmyBhYNfdHV0cnJ5W19xYXBrX3Brfnxxbm5rbndhcG9rcW1ZWWJhYm9ZUVRaZmdjdXCEg2Nda25kY2Zrkm5gZ2dfaGuBdXJzcIuAdX+DgHl2gIuAeYV/eIiGd4OFfIaLf3t2in9qcWN8Y4Z8bnFtdGpob2x2eF9xf3l8dHV0gIN+pJWarJ6nloWNhH+XlIOQoHaMoJSTh4ybjZaOi3pyeXWCcHKFdHF2iGxwbnZtiHaDfoBtbVVRgauUhoJ3f3dyg3qDoYOTgpWUmp2Tm3iSe4OMkqOZk46JlZmShIeXmYyUi4mPj4edhJCKe3KLhYqOiJyan5uVk3+TfWeEm4ZnhZ+HkYSRgolxg5GYkJyPj4yMj4x3e5GQeo6LjJKWjHyIfIBrd2pua2xse39ien6Pl4F2e4F4g4x9eWdzbHOGlIt+h4V6ko9xeYNvdYt5iIp5iHyAio6dnIR7enaCi3x3cWpsgoR7YXlxb21zdFZfcGJyYmBtb3pxaXBmZ3V1aXJsYndlXVdmYWBzVFFPXGZlXXlwiH1gXGlyYmJlZpFqX2hlW2dwfnBrcXSKfXZ8hoB1dn6MeXuFgXiIg3OGhX6MjIR8eZV4ZnJqg2CIfm9va3pgam50f3VfdH15h3h0c4V9eKCPmbCcpY6Ci3+DmoeAjJ+Ai5qUj4WImI6Pj4R3dHd0gHFwhXRwcoRwa2l3boNufX1tdHNSTYLfyJLWk3twdYR2haGElHeWkZmdkZl7lHOFkJ6hkpORi5OclIZ/l5aIjY2HkY2Hm36NgHd6jX6JjIqcm5yalJJ5jHVmh5CFa4eihJGIloOGY4yRmY+Vi5eMjIqKcXqUiHuOiIqTkYl6hnx/bXxlc29rbHp6W4F5kJCBen5/gIaOe3tpc2pzio+JgYWEfJSKa31+bX+KfYqFfIR5gI2TmZiJfHV3g494c21ncYCFbmx1cGlqdW5TX3BlcFpgbXN5aGxrY2d5c3BxZGB4YWBWbF9fdlBOTGJnY116cYl1XVxldmFiZWWOZGFnYllpc3Nua3F2jHx0eoaCdXZ9i3OAhn97iX9yiYiBkYuIfH6YdmVzbnxliH5ucGyAWWxueXlzYHZ6e412cneKd3mei5uumqCQgoV3iJV+fIqeiIagko+FjJiEk4+HgXR4cHlxb4RwbW9/c2VleXF9bXl9amhrY6Sawdyu8KFzbHaFd4akhpNwl5GWoZWcgZJyhouil4mNlouQnZaDgZaQhYmPgJGLiZV9hnp1f4l4h4SOnJqYmI6Pdol1bYWIiXyJooORiZyEhV6Lk5eLj4mPi4uEiW17loF9iIWJkY+GdoZ+fmt9ZHh2am55c1iJe5KIhXp+gYGGjH95ZnJpf4mNiYKBfouVhGuBdW2Gj4GOgn2BeH6OlJGXj3Ryd4eMdXNxZ3Z6hGN1bnFjanZoUmFyaGxWYG91emFyZGBpf3Fzb1tkcmFiV25bXXhOTUxlZ2Jed3OJblxcZHleX2VlhWBjY19ZanNrbmtzd4x9dHeEgXh3e4lxg4R9foh7dIuJiJaGjH9+l3NndXJ5bIx7bnRxgVdxenZ5cmR3eYaMaXaAiXJ/nIaYp5ujkoR9cYyUd3mMnoWFoY2PfJaNgJqIhHtzd3B0anCCbGptfHVfYXh3e3F1e2dgZHzr2rXJw9yHc2x0gneLnIqPapmRkJ6WlIGJcYWIn42Ei5aLjJiUfI2TiIOJkHuQi4WOgH91eIOEcoiCk5yWlJeFjHWGfW+DgYeGmKGCk4yeg4lhg5SPh4qGio6HgYdpfJN/fYOEiY6NgnKHf39xd2h2c2p0d2xajX2Tg4V9gISBhIqCdmFya4iBjomBfn6RkH1tgWt3hY6EkIF7gHx9j5GOlIhtcHmMhXRrcGxzeYJhdWpwXmx3YVJlc2lmU2Bxd3VhcGBdaIRydGtYaGhjaVltV1x1TEtMZmdeYnNzhWpcXGV5Xl5kZ3thZF9dWWtvZm9qdHiKfnNzgX57dnqIc4WDfH+HdneKho+ZgYyCe5N1bHd2eXiTdG54e31YeYZxf29neHeSgmR2hoVwipaFmaGaooqIdG+SjHF3j5x+i5qJiX2gf4SagIF4cnRub2Ryf2lmbXh4XGB5e3txcYBpYWdhf9W2jpGmeG9xeH1xlJKOiGuaj4mdk4yGe2mHi5mGgZKRhoeYjnyNjYGBiY17jox9iIR6c3qDe3GGgJaajpOTgYh0goV1gn+JkZydhpWPn36IYn+Th4WIhYuNgICDZ3yQgH5/goyPkH5tg3yDdWxtd3V1eHZsY46Bj4CFfn2Gf4SJf3BfcXCEe46LgXt+kIh5cINleYGIhYqAeoR8fpKNj5GCbW55i351bW5rbHt/ZGlsa1pud1pTanNpYlFjc3htY2ZeWmuEbnRiXGhfZW1gb1VccE9IT2dmXGhvcoBuW1xjc2BcY2x3ZWVdXVpsbWNtanN3hn9xcH98fXR4hniFgnyAh3V5iYGTlXyJhnaIgXB4eXuEk29ue4F3XoOAdIFtaXp0lHNnc4h8cZKRg5mfm6CGiHZ2lH9td5SYf4iQhIuOmn2Mmnd+dnJwbGphdX1nYmp1eltgeHx6bHB+ZWNnZ1edj19xc5a9xYV3cpWLkYB0mIyHnZSNiHNriI+VgHuUi4GEm4x8ioZ9fImMfpOHdIeFdnZ9gnF1hoGelYaUj4KCcX6Hc4N6iJabloaTjZ2AiGZ9k4KAhoSKiXKBfWd9i3t5f3+Hi499aYB9hHZmcHl4dHh0bGuPhouCi395g4GEhIBrXnB2en2Lh4R7gI5/fnKAaHiBhYmEgXeCe3+Vio6LfG1reol8dnRvaGh+d2VdcmRZcHRTVG9zaWJOaHV5Z2FeXVlvgXB0WmVjXWtuYXFQWmxSRFRoYlpsb258cFpbXm1jWmNvd2RnXF1ga2pjbGlzd4GDcW5+e390dYN6hIJ8goV2fomBlpF4g4p0gYhzeXl+jZBvb3uBcWqCeXp+bm18dpVraniEdGuTjIWemKCZhYhvfox2anmZj4CCioKWmIp5j5ZvenNxbGpkYHR7aWBmcntbYXJ9emZwemFlZI6xsndLYlql2tKYc3ySjZF6f5aMhZqSjYZvbIWSkXl5k4aAhJmKfIeAeXiJioOVf26JhnFzfXtqeYaDpZGEk4yCf25+gnWCd4Sal5KKk4+UhYhwepKEfoOEiYNvgXhogIV4cn9/g4qHfGV8foR2Y3FzgGp6cW91mY2GhIt8d3mAhHqCa1xwfHJ/h4OIfYWHeohxgG1wgoWNgoJxg3d/loqMg3dtbH2EfnZ6ZWhqfnJhWnhbWnJuTlhydGdgS253dmJeXFtZdX5zcFhnXmZrcV9vT1hpUz9ZZ19bcWtoenJcW1lrZVljcHlfaF1eZWxoZmxpcXh/h29tf32BdXCCe4CBf4N/doGFiZeKcYKNcXuGfHp5hJSMdWt6f2xwfnR/fW9yfHuTcG+Bf3lmkoqCoZidkYOGZ4eEcGd6l4p/gIWCmoqBfI2NaXhybGxmX2FveW1fYm95XGRsg3phcXZfZGXV676LMzo+i4+AcnmGipCOeIWZjn+Ujo1/bm2FjIt1fY9/hYKViXyDeG52h4SClXZth4RrdXt1ZXmDhKeMg4+Mg31tf3N1gniEmo+Lj5GSjIyHf3uSiHmAhY6DbIByaYB+eG18e4GKg3hieYSCcmRxaX9udnJ1gpyMgYCGf3R2foBzgW9ba31zeIiBinuGf3yId3lwa4eCjoKIcIB3fZOJin1zbWp2gIB1dV1paXlxWld+VFtyZk1bc3JmXEpyeXFdW1taXnaAdmlaYltnZm9jak5YZlE9XmZdXnZmX3VxW1lVb2RaZHF6XGheYGdtZ2praXB4fY5taoKEgHlugXt9gX+CenWCgYyThXCAi253fYB7e4iTiYBpe31rdHxyhntzdn1/jHp4hH58a4yMhJudloyCgW2Nfmxpf4+OfH5/g5SCf32KiGt1cWdpY1tjZ3NvYGFsdGFocIl6YXN0XmJjm6CQbl02W7C2dWqAiX6Uh3eImYd1kIyKd3BthYKGdHmJeIl9k4h6f3Nndoh9fJZub4V9aHZ5bmV6iYWlh4CHjYl9bX10fn97ipeGgZKQmImLhYp8kIpxfH6GfGl+bWuAe3lqenaCh4FyYHeCfnJkcmd2g251fIaVkoJ9goBwd3p8dX5tV219dXOJgIV2hnSCiXp3cm2If45/g3F9e3yQh4d5bW1obIKBdW5daGd1clJcfU9dcl1PXHNwZFZLdHlrWFlZWmJygXZhXl1hZ2RpamZPWmhOQWFkXGB3YVx1bVhYU3ViWmVvc1hqX2Joa2dtbGlwd3yTbGmEin18cH9+e4F/gnp3gICJi4Rye4dvcXeEf3uJjY+Ean57bnh5d4p3fXiAgod/hH5+em2EjIiYo42FhHx2i3prbYWJk3p9e4KSgIB+ioRwcnBjZl5ZZ19wcGBhaHBmam+JdGF0b1tgZGp2e3+/nailybhyhYR0lX56iZWEdJKOh3JzcIR6gnN1hnSId5SJeXlxZHeGeX+SaHGDdWZ3dmRqfISInoKAf46OfXF+coN4fpCOgneVjJSQiIKIe4mKbHl6gHVoe2lsf3lzaXp2gIN9aGB3iH1ranRoe4FqdoKNkZV/fH5+cXx2fHR+YlV1e3Fyh4KBe4Fwhol3eG9vgoGLfXx3fHpzjISAdWdwZ2yIgXJwXWhjdG9MZndNX29WVFp0bmJRT3V5YlJYWF1icYN0XGJdaWVlY2tkUlxxSURkYlxkcV5ceGhVV1Z4XlxmbmlXbF5hamdlbm5ocHd6k25piIx5fnN7fnmCgYJ8dn2DiIaDcHaDc253goJ+iIuUf3GAfHh6eoGLdYN4f4GBgoR6gHVvfYqLm56IfoZ7d4Z8aHWHjZJ6f4B8iYaEdo+AZ3BuYGVcWGZZbXNhYWFxbGxoiW5gc2lYXmNtgHep2qnIh4izcop5cY92fYmRgXuUi4B1dHV+dn9vcH9thXSUhnh1bGB5gXmIjWVxgm5ndW5bbX2BkJOAgXmSkn13emyFdH+PioNylYmRj4iGhnt/hm11d39taHdlbXx2bWp3dn9/fGBieIZ6aHV2Y358aHWHj46WfXWAdnKAen1tgFlWcn1vc4GFfX93a4iGc3hqdH+Cgnx5e3d6cYl/e3Jmc2Rti4Rsc1tqYHZmSW9vTVxjWFdWeW1iUFN1d1lRVlheYXKFcF1hY21lY15vY1VeckdCZl9eZ2ldWntjUlZddltbZ2thV2tgYG5mZmxxaHB2eI90a46Ndn93eH13gYOBe3R9g4iIg29xf3VxdX2FgYmNi3t3f3iEfH2Fh3iIfH2BfYSAe35ydniLjp+MiXuKd3WDel5+h5qNeoeEdIaHhXeJe2JubVxiW1thVWp0ZGBbaG9wZ4dxYXFmV1xja398ys6HuqJrbm+LbnKFc36GjH97k4V6eXR6dXR6amx2Y4R2koJ2b2dffIF5i4hkcYBqanFjWG17hpyJg4Jyl5N3fXtthm+AiYqGcJaOkIiGjIR7eX9ycnB+Z2hyY254cWpscXd9fHldZXqAeGl1eWeCd2h1iIyOlX1zh2pvfoB4bn1dV3B9bXN+iHqAbm6Kf3B2ZnZ+f36AdXpveXKFenhxZXFgbYyBa3JYa195XUlwbE9YVl9VVnxrYk9UdnNSUlRXXmN1hmpdYWtrZmNab2JZY3BHQWhdYWdfXFZ8Xk9WZnFaW2poXVhoYV9yZmpocWdxc3aHeW6VinWAe3d+eYOHgHVzf4WFjoNwcHt4d3V5hoWHjIZ6fH91i359hoOEh39+fn2Gf3x4dnl2kpSffo19i251gHpkhIiYhnSSim+FhoJ6g3VjbmpZX1tdXVVoc2VgWWRycmeBcmFrZFdaX2l/eL6ue5+4bmJ0h2l1fXN7hYh7fo2Ad3hzd296dmVqb2GHdY6Bc2piXn13eYuCZXB9Z2trW1ZveIukgYV/cJmScX93dIBsf4CPhnKTh4yIhYmFfXl1c3BpemFqbWFtdmpna2t5d3p3W2d9fHlmcn5uhXRmdoaNhpaAcItna3uDdGx1Yltuempzeol6gGV0hnxtcGd0fXZ8fnB6anl5f3h2b2RrYG2JfWxuVmpheFZMbG1QU1BpTll9aGJPVXZsTVFUVV9od4RnXmFxaWdhV2ldXWxpSkRqWmJlV1lVeVpOV29rWV1sZV1aZWNedGZsZXFmc3B0gXhwmYV2gH94f3yFh311c4KHf5WDbnN5e3tzcoWGiImEeYF9do9/fYSJjoSBg3p+i4N7d3x3dpqdmHqKg4dqdn59bYWFlYFzj4JxhoJ/goBwZmxnWF1bXFtUZXBlX1hjcnVpdnBkZWJXW1tof3BvcoBzimVmen9qdnd0dIWGeIKFend0dm5renBhaGtnhnSNg21nXl98b3qJfGhsd2ZqZFZXc3COp32EfHaWkHN7cXt4bHl6j4N1l3uIhoSHhH11cXNtaHVdbWlgbHVkZ2Zpem97cllngXZ1aHCBeIJ3Y3iFi32Vgm+Ma217gXFmc2Vga3hmcHWIeXxhdYN1aWtxdHlveHdye2V9fX12dW1jZGBshnxta1ZqY3JUTGtsUE1PcEdefGZhTlZ1ZUtOVFhhbHh/Zl5nc2plYFdkWGNyXkxLa1lkYlZUVXNWTVl3ZVpfbGBcW2RlX3dnbWJvaXRvcX51dJmBeICBeIB/hoR6fXaCg36YhW5ydHx7dXGFhY6CgXqLdXSQgH2BlY6AhYR8foyGen6Bdnujpop5iYaFbHV8fHWEg417b4Z0eoV9goN1bmppZVZdW1taU2NuZVxZYnR7amhtaGBhV15aaYBpa3CAaG1iaXt6a3V1dXCHgnqBfnd2bntoanlqX2VuaIF3kIRnZVhhdml9hnluaW9mZl1VWG9oj6h3gXp8kI54dG59bXF0eI1+d5R0hoOAhol2anN3aGlvXG1lXm5zX2dianhoe21bbYNzdGpvgX56eGJ3hYV6kYZziHJwen9yY3FoW211ZG5xhnp3YXKAb2dpeHNxa3d2c3Vignl9dXRvY2JibH18a2tVaWJnVExuaFBIUmxFYXlmYk1Ucl5KTVVaZm15e2ZfbXFqZF1WYFZvb1hLVGlYZ19ZTlVsVEtdel9cX2xdXVtiZWB6aGxhbnB2bm93dXqYfXeAgXmAgIeGenl6g32Bk4RxdHR/enZ0hYiQfoF9kWxzlYF7gp+Ff4d9gH6GgoCKe3WErJ9/eoiIhGxygnp2gYCCdW+Ib32AdIqAam9uZWRYX1paWlViamdcWl91gmlebWxcYVdbXGuBZXJ0fWpqXm14d2h1eHNvh3x+fnp2c2x6aGl3Z11kc2d6d5KAY2NUZG9mgYR2dmZoaWFXVlloZJCob393f4qOenBve2Z3bXmKenaOcYR+f4CHbmR3dGVoaV1sYl5wcFtnX211ZXpoXXSAbnJrcXt/dnZkdYaMfImIgH94cnV+dGFwbFhwcWFub4J6c2NxgGtgbHpuaWh5d3NwZIR0eHh0b2NgY21zfWpsVGleX1VMdWNRR1diR2N3ZmFMVHFZS0xYWWltd3tlZW5yZmNaWF5Zd2ZVS11kWGlYWklXZVFJY3hbXV9tW15cYmRef2lqYG50eG1vbnaDl3lygYB9f4mMhn51doZ4hox9dHV1gnl6eoKMjn1/hYlqdJaBe4qdfX6FeYB7fnyGiXNxj66MfHyHkH5mcYh6dH59d3Nwhm18fm2QemNwcGJlXWVWWllXY2ZrYF1ddIZoWHBtW15YWlxse2Jxd3ZtY1xudHVpdndyboZ5f4F6d29vdGVodGVbZ3VmdnaReV9dU2VlaoKBc3xhYmlcVFheY2SQpWl5dIKFkHhsbXlmd2x7g3l0h3KBeX15gGlld21gZ2Ffa2BedWtZZl1vb2J6ZVt3fGtub3B4eXR1ZnODk4CJg4l6dm9yfXJheGNZbm5gb3CAenNlcYBkXm11aGNmeHpybG2Bc3F7cXBhXWRtb31laVRoWVpVTnlfUkpaWUhjdWRhSlVuVUpMW1dqbXN7ZGxsdWNhWVpcYndcVExkXllqVFdIWWFOSGp2WF9hbltbX2JjXYVpaGJueHltb2p2gZB5boN+gIKSiISBdnWJdIyGdHF2doF3fX1+jI+Bf5N+cHiWg32ZknmAgHh5fn9zh4RzcJmie3t/iZZ5ZXWIenN5d2x0cH9seXxwknNecG9hZ2JsVFtaV2lkbWZcXHKJZVNybltZWFdgbHZjanVqal9bbnVzbnV0dWuHfX+BfHdvbmxkaXBjW2tyZHR2jnNcV1RkYHF/fnGBXGFjXlNaYVxkk59lcnGFg5Bza2p4bG5ueXl6cYB2f3N7entkZnZoXmNbYWhcX3doV2JecGhhd2FbfHZqanJueHR0dWpygpaEh3+FdnNqcHxtZndXW2lsYW9xf3lzZW9+WmBwcGFeaW98a2pyfXBvdmpwYFpka217YWdUZ1VYU1F3XFJQWVJIZHNiYEdWbFFJUFpVa2xrfGVtb3JhW1pYWm1xWFNQZ1hXaVRVR1pcT0lzdVhgY25jWGFhYV6MamNlbXp5bG9pdnmGe2uEfYCFmXyChHl9iG2PhnFvdnp9dIKCfYuPg4OXdHiClIWBn4l1gYCBdH+CcIeDdm+il3R7hoyHe2Z3i29ufHBneHF7bHN2c41rXnRvYmdma1NeXFZoYmxsW1xxjGROb21cVldVZ2lzaGN0ZWVeWnB2cHJ2dnpsiH1/fYh3kHNjZGtvYVxubWNzeIdrWlRWYmN3fHxwhFxjXmNUW2BaY5eVY25wgoWJcmlmeW5kcnVxemt5dHVve392X2dzZFxfV2JkWWJ1ZVVfYG1kYXFdXX5vaGlzcXRxdXdtbYWUg4p8hXFyZ258b3FvUlplaWRwcn91c2JsdVVicWpbXm5ke2RrdXxwcXFpbV9YY2lqeF5mVWRVV1FWb1hRV1RQSGVyX2FGWGtPSVlUVm5pZHxpbHlrYldcVlx1ZVRSVmlSWWdVVElaW1BOeXdbX2VtalpiYV5ej25iZ2x6dm5vaXZ2f35thIB+hpd7f4eBin9rk4hyZ3SAe3WAg36Jjn+Mk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgo2Md3hueo1gZX1xZ3p0eW1tcXeDZ2R8bWRnZ2hTYF9VZ2Bsb1xebo5oTWlsYFVWU29nc2tmeGVmXlpydm90fHl0bop7f3ece3prYWVsbV5gbmplcXl+Z1pWWF9seHt6b4NeYV1oVlhgWGSciGJrcIGGfHZranZsW3VwanlpdXJub3yBc1lrbmBZXlZjZFllcWNUX2JpYWJsWmB+a2ZsdHVvbXh3bWmGjYCKe4htcWZwe2xxbGFYX2dmbnKAc3JeaWxTZXBkVWJtYXhhb3R6dGlua2pfV2BmaHVcZFZiVlRPWWdTT11PUEhlcF1jR1pqTkpgS1htZV94aW9/ZWBVXlRedlxVUmBnUF5iVVRLXFpRWnZ2XV9mbWhYY2FbXo5xY2hqeHJzbWd2c3mDc4KDe4iOfnyKiI55bo+KdGxzgnR/f4iFh5KElY96fYyPiJGbhIB8jYRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKUk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjY2NjY2NjY6Ojo6Ojo6NjY6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD8vMTExMC9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQ0dkaGdnZ2doTUJDQ0REQ1hoZmdnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiGgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU0OVxgX19fYGFBNTY1NTU0TWFfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX59fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJh4eIiIiHjpCQkJCQkIyHh4eHh4aJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGiImIiYmJiYeFhYWFhYWHiYiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpGSkYmHjoqQkpORi5COi42FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2NjY2Ojo6Ojo6Ojo6Ojo2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIuFiIeKjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQiIWFhYiPiYyQj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCIhYeHiIyIjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfnx2dnh8fHt8fX19fX1+fn5+fn9+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuEiYiFjIiPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4qOjIuNjI6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXl7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Oj46Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH5/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX5+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5OSk5OUlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTkpOTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkpGRkpKTiIWTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkoKCkpCRkY51hpGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/fn9+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QiHCFkI+QfHWIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+Mc2+Kj4pyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI13bXuPgnN4ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f39/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh3Nub4R7dXaAhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWVhYV1RQUVJTUlNNTUpJRkVISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnd0Yl5kX2JscWZoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGJdamxdZmZnZWNjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISUpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aWmp3bWJucmphWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01ba3JsYW11cmZRUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTl1jb2tZaXN1cFNNT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQkZIVWJoa29wb21sWkxMTk1OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQ0ZHSE1aZ2hncm5uaGZkYF5eWExKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4B/gICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz5JWl1aXGVsbmtvbW1sa2loa2RTR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs9S1tpbW5vam9ta2lsbWZRR0VER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GBgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs6PUhjb3Ntbmxqa2hVQz5DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdHJxdHh4eX1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OT1KYHN0cGdUPzo7PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PDpCbHxqPzk7Pj0+P0BAQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtbbkA+REU/QEFEX2Q7PT07Oj0+QUFAPkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkdWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6Om13STg7Oj0+QTtIZD08PTw4Ojs/Pz08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PT1JTEZFdXZONzg4Ojs+P1dqQTs8PDo6Oz4/Pz09OTo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XH+Df3p8d1c8PT89PT5FaHRMOj0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBR3J5a2KDhIOCg4B9Xj5AQ0BAPUpze1k6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBFb3R9goKBg359hHZNQUNFQD8+WXuAXT9DRUlJTFFNTUtFQ0ZHR0VHRUVFREVDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISk5pWk9QTklHSUhISUlISEdHSEhFQ0VFRUZGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hLVnNeVlFLSEhISERHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiEVmyEh4aGhoeIiId8UEpZbmVeXVRHQ01GQEBDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERGR0lKSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKVIGDhISCgoWGhoSChoWEhIaGhoeHhop1SmBiYWFjZVNOWDw8PD47OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYCAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSUllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI5xaGhnZWdpZmhGNjg4OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUdPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjIx4bWxpaGlqWTU2NTU4NzM1Njg6ODc2NTY1Njc2NzY3OjY3ODg5Ojc1Nzg5Nzk3NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA2Nzg4PTo9RUNCZYWDgYCCg4ODg4OGiYuKiYmKioqKi4qKi4l2bW1tbGxVNzg1Njg4NTU3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3NjY5Ojk4ODY4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISFhomKioiHh4iIioqMi4qLjYhybm9vcGVAPjo7Ozw5Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PDo+Ozk7Ozw7PDs5Ojw4Ojo6Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3Vzdnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLioyNjoJycnFxY0dGQ0JBQj5AQ0FAPj0+PkA/Pz9AP0A9PT9CPkBBP0A/PUBAQD4/QTw+PDs6Ozo5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uLjI2NjX5yc3JTS0pLSEhIRUZIR0VDQUBCRUNDQUJDQj9AREhFQ0VDRURBRkVGREVGREBCPjxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMjIyMi3t6dF5nXVBLS0tJSkpKSUZEREdIR0RDRUZEQkhJS0dIR0ZIR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2NjYyOiXt4e29nVU1MTUpKS0hLR0RHSUhJRUVIRkZFTExNSUpHR0hJSk5NT0xMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozs9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyNjI2OgnhyVVJST01OS0lJRkpJRUtJR0tKSUpHR0dLTE5MTEhISUpNUU5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVG5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyMjIyMc1tWVFFRT0xLSEdDSEpITUxHS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSEpKTEpMRkdIR0ZGSUZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyMjI18XFtXVldVUU5MS0VGR01QT1BXVVFQT1FTUk1TVE9NU0xQU1VWUlNSUExKTU1NS05HR0pGRkhKRURFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUJAQkJHVk5GTlBQVFh7hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjY+Mi4tsXVptYkdVU1JRSzs7U1RTYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eHp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdHRkU/P0FBRUFDR0VERUxYUk1UVVZYWnyGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox+YYqLi4dvX2dYPFlaWVRRP0BXVllcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhVVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3eXl6e3p7fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJi4x7cXJaXV1cU1VTV1dVW1p1g1lVfZBhXFhdX1dJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHhIuAaFtcXVpVV1VYU1JYVmOWgFJlclhaV19oUGBmW1tYXGdhR09aaGddW1xdXVdST1NQUFJWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUVBSUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ+gH1fU1daVlNWVFJSTVBNTGZ6W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbXFxeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x9fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt/fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3pvcllMTVBQTU9MSktFRklGQz9UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t8fXt9fX1+fX19fn1+f39/f39/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXlxZVVBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdmBeTkVARERERENBRVFDRUFDPkNJR1ZASE5MR11pUEhGTkZERUZJR0hCREhHSUtHREJBREBPUU1SZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5/g4CDg4KAgoCCgYJsTkhBQTw8PkBBQEA/a1FLYEVGSElFQj9HTE5HTVFVSUFFPz88PTw9PT89P0FDQ0A/PT1CPkpOR1VudXR1c3R2eHt8e3x8fHx9fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFZVV1FRV1VQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVEQkFCPTtDQ0JCREJcXU97Tk9PTktMTU9PUUxLTVdNSEdAQTw5Nzc1OTk9Ozs7ODo4Oj88Qkg/XHN0dXV1dnd5fHx8fXx8fX19fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QX1xaSUhQUlFPTVBRTlFSVFZYU1NZVE9ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhHSEhDQkdJRkZFRE1SUGFXU1hRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVldeWlhNS1RUU1BRVU9MUlNUWFhUVFlSTVdZWlZYWFZYWV1XV1hoc2tdVmFza2JhX15kYV9eWVVRTk9PTUlISkxKSUZDUVBTW1dUVE5RU1lTXGVVT1NUUk5LSUhDP0E5OTk4OTc4ODU3NTc4NTk6R21ydHd4eXt7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFNVV1RVUl1uXlJOWl9bVlk7RFZYVFtmSkxQU1JPTk1OTk5MSkZRUFVZU1RPSk9PVVNUXFZSVVNST01MSUhIRj8+PDo3ODc2NTk5Njc2NzVXb3Bzd3l6e3x9fX19fH19fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xdUlRaVldVVFdUUlhYWVlZU1VPSkdPUE9PTVJKUFBPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQU01JTEtPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtIRkxNUE1HL0VfUj4zPz5qb2FTUlFAR1RRUFFQUU5RT1FQTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dXl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1RRU0FHVVBPUVFQTk1OTUtMS0xOT09RTE9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXt8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVUxMS0k8OTg3Oz5APjw9QUBCPT5FSEdDRUZJR0pKQEZBQUBGSEVKT0hRUmJcUVBST1NPT1BMTE9NTE1NTk9OW1dLTVFPR0lIQ0hKTExLRkZGRT9CQz48Qkc/Qj9BZHBzd3p6ent8e3p6d3t3eX5+fHtxc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRD05Nzc5P0I+Oz9CQEA+QERJRUNHR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTktMTU1NTExPTlNkTkpMUkhJSUVBSEpMTU5KR0lHQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4Ojo/Qj88QUJBQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVDS05SVExKSU1URklJSkxKS0xJSk1NT1BSUEpHQ0xHQ0JKSUxNT05JSklHQ0NDREhKTUxJWXJtd3l4ent6eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxR0tER0hIR0pLSUpLREZCPT49OTk6O0BCPz1BQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESEpMTUhKTEhJSkxLTV1SSEhETkZBQ0pKTUxQTUtNSktGR0dKTk5RTkxibWl2dnd6eXt6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo6QENAPkFDREVJRUlKTEZJSUdGRkRCO0FDQz5AQ0RDREdMTkhLTkhESEVJTE5NSElMR0ZHSUlMTktJR0VOSEJGTUtNTE9NTU5NS0hISU9SUlNOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJREZGRUNDQ0VAREI+Pz46Ozs9Oj0+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9REVCPkFDQ0NER0hJR01QSkZGR0tOT0tGSElGRURFSUpISklGSE9LQ0lNS09NT05PUE5KSklMUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRD1CQT5BPTo6PT87PT5AQj5AQkRHSkVJRklIR0ZHRUNCQUFGRkNCQkJERURHR0lGTFFMSU9KSk1MSUdIRUdGRENJSUhLSkdLUk1CTk5NUE5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JlZmZkaGhmbmpmbW1oa2ttcmlxdnRzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3d3Z0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQURFPEFAQEM8ODo9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0dFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUlBQUU5PTU5QTUxNU1dWWFhVWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkU8P0JCRDw3Oj49Oj46QEI+Pz9DRUZERkRFSEZERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdOS0xLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BST1FNTlFOTVBXWlZaWVZaXVlYYWBhYF5oZWNgZGZoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V3dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TkhIR0lEQkNIRTxARUJFPTg5Pj49PDxBQjw/PkFBRkNGQ0RJRURFRUZHR0dJRkdLSERJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOS09OT1JVVk9LVVdTUFNRUkxPUVBPVFlaWVxaWVteXl1gY15cYWNrYmBkZ2dyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRMSUtJS0ZCRUdFPEBHQ0RAOjw/QD8+P0JBPEA+QUFGQ0VFRUlFRkVHRkhIRkhISUtKRkpISEtIRkZMSUhISkdMTE1MTElNS05NTVBMUFBRVVZXT0tWVlVTU1FSTE9SUlBWW1tdXltcXl9fYWBhZF1jYGVmYGVoamRzc2ZqZ2drb3Jxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0NFREU8QEZEREM7Pz9CQEBAQ0E/Qj9BQ0hDRkZHSUZJRkdESUhHSUhKTEhISkpJTEpGSktISUtKR0tLTU1KSk1NTk5OUEtPUVJUWFZNTlRWVFJSUVBNTlRTUldbXV5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S0xMTE1HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NISElIR0pHQ0hJR0hKRklMSElKTUtOTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQERCRURERkJDRUdDQ0lGQ0hKS0lJS0dES0pHSEpJSUtISkpOTE9LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDRENGRURGQkZGR0RFS0ZGSk1MS0xMR0dNSUdKS0hLS0lLS05MTUxMTElMTUxbc2JkcF5sbVVNTmZzXWZmcWxudGdwaV9hWW5uYnBwYmtqamZvcXRldG5vXG91Z3BNSnF5dmthYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQkZDRkVGRURDSEhIREVLSEdMTk5MTU1GSk5ISktKSUxKSkpLTE1OTk1NSk1NTltyb29ucHBsa01QUWxXTWlidHJwYW1udVxZbFBcbm1acW1rb214eHRzaXBdX3JrcWpVdXl4b2Nea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkdCR0RJRkVFQkZJSElFSExKR01NT0xNTkdMTUlMS0lKTUlLSkpLT1BPTk1MTk5MXGhkdV1scVdsTlBRbVRZa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDR0RIR0xIRUNDSEpJSEZKTExGTkxMU1JMR0xMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXJrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJpbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQT5EREJHREhJTUlGQ0ZKTEpHRktOTEZPSktXUktHS0pKTklISkxJS0pISEtNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam5fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVDRkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJR0tLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpKT1BRZHFpVFlXXFtcVllbXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRUFFQ0BESERGR0NJS0xIRkRHS0xJRUdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUdISUVGTElKTE9NSlBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUktZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkRDQkVJRUdHRktKS0hFRUlKS0ZFSEhQS01NSk1SSUdFQUhGSklLTEpMSkhGRElGREZHRUZLSENKTkxMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl9cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaGhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDR0hGSEdIS0pKSURGS0tLRUZJSk5LTktITE5HSEU+R0dMSUtMS0tLSUdESERDREVBRkpFQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWFVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0eHl5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUdJRkdISEZGSUdIR0hLSUxEREtLTk1MS0hLSkhJRj9HR05LS0tNS0tLSUZHQ0RAREFISUNASUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFFbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkRGS0pGRkZIR0dJR0ZGSUxKTkZES0tNTkpMSUtKSEhGQkhIUU1LS09NSktJR0dFRD9FQ0lJQkJHRkVUXVleWF9ZX1tdVVhYT11dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWEhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUhGREdNUkhDUUpFR0hIRUZLSk1QRUZJSktOTExJS0xJSEdESEtRT01NUExMSktISUNEQUVESUdDQkdGRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdT1lhXGBgX2JjYl1hYldgX1RQT09PV1FcW1tcXF5fYmZmZWxlb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlKS05MS0tMS0lKR0VKTlFRTk9PTU5MTUhLQURBQ0RHRUNCRUdCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU09MUFNSVVpZV1lYWGRXT1NUUFBOTU9UU1pYWFpdXGBhZGVjZ2NrbHBzcnl5f3t6f4SEhIWEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTEdISkhHTUxRUUhLS0tLTk1VTk9KSktHR0tQU1NOUE9OTk5OR0tGYEVEX0xFZmRFTlxJXltybU9NVW1ZTERQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYCDg39+entMSUZHRkhFRUtPU0lKRmBUSElPSklPTVJRTE1MTE9SVVJPT0lLTUdITVFbWU9QUE5PT09JSlF/UUl8WVlydFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW19WVlh/anR1dV5fdl5XYVtbZltfYGFgYV1gYWdtcGxgcHd0eIGBgoODgn99f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExGSUtFUlZMS05JS1JYV1FNT09NUVROT1FPS0tOR01QU1taU1FST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3NvcnJ7fG9+eG6Acl9gYGJhWmBfZ2tua2JsZmdtd36BgIJ+e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTktHYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOS09IUVJUWVdWUFRQUFBRS0hneGxjeHJtW0tOVnlwdW11Ym92UGVlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f29ob1l2dmp2dXCAX3JmfWlseHxvXl9fYmFbXWJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3F5e3Nydnl+gXN1em58fXl4cm9OS1N1TkNCRlBQSEpLSUtQT09PTVBaYFpXS1RXUGFeUlZRWVJMUElTVFZYV1dPVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2dlZV5hYmlpaWprbm9rcW9tanBhY2Zjb3d4b21wc3l+bnFwa3t6dHNvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWFVNVVlVZVhSUlleU0xOSVRUVldZV09TTk5OUklSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfWnB6e15genNjcm94cWhkfWlyfF5UTGxgdnVraXV7em1+eGt8cFxeXmJbXmJkZGdlZWViWmNjaWtrcnNydmdsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbmttT0hLS0hKSEhRUExOT0xLUlJST1NSV1JWVFBXWlZWVFRUYV9QTk1LVFNUUVZWTk5MTU9QS0hRTlBVTEtMU1RUU1RQVlVRUU5RUVhZUk5QVVRYWFhbW1VSU1dbV1hYWk9TVVdYWFJeWVdeVlRQWVJXV1dXWF5aZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2JnZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2p1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PTE1WVFFOVVNOT01MUVBMSlFRS1FNS0xQUlVTUVJTU0lITE5PUVJRUVFUVlJYV1xXU1JQUlRVVlNaUU5TUlhWVFlWVVpWVFJVVFRVV1hWXFleYF1cWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGlnamtlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBKTldTUE5VUE5RTkxTUE1PVVNOUk5NT1FVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1ZWWVtUUFRVWFVVWlVXWlZTUldWVVdbWFpfXFVYXlxeXVtdYWFeW2JiY2dmZWRiWF9hYl1gZ2RmZWFeX11dXlpaYFpfZ2BeXV1iaGthZ2ZoZmRgYmNiT0xNTFFRTE9UT09TUU9RW1lXV1hbWVhZVl1qZFZYWVpXVlNTT0pOVlRQT1VQUFBNTVJSUFJYVFFRT01QVFZPWFJUVVVPTk1RVFZVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFZWVlZZVFhYVlNSWVdWWl5ZXV9eVV5cXmBcW19fX19aYmJkaGdkZGJYYWBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWFpbZHFtaGRfW1hWVVdRTE1WU01OUk9RUk9MUVNSVVpVU1BQTVFYV1JXU1NTWE1PT1FUWFZVVVNVWVhbXl1bW1ZRTlVWVVtcV1JTV1ZXWFZUWVtVVFJaWFdcXlpeX2BVYVxhYV1gYl9cYF1jYWNnaGRmYFljYGFfX2VkX2BiW1pcW1xZWllYV1xaXFtgXl9bXl5hYF5iXFlgW1FOT05WUVBUUU9UVFNQV1xcXFheXF5WXF5qcXd5gGNcW1VVV1FNT1ZTTlFRT1JUUkxSVFRZWldVT1JPU1hXVFNVUlJaT1BTUlZbVldXU1ZaWFxdW1tdVlNNVFVVXFxXUlVWVlhZU1VaXFVTU11YWl1eXGBgYFZhW2NiXWFkXlxiYWNfY2ZpZGZeW2RgYWBgY2VfYl5ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdcVFdXUU5SWlNSUVRSVFVUS1JXVltaWlNPU1FWVlZUT1dSU1pSVFRUWF1XWFlTWF1YXl1ZWl1UVU5VVldeW1lSVVVZWVlVV1pcVlNXXlpdXWBcYmJdWV9bZWFfZGReXmNjYV5lZmlkZl5dZGFgYWFiZGBiXlhaX1tcW1hYWFdXW1lbYFxbW1xbWFpbXlZeWV1RT09SWlBaVFVWVlNUVF5eYF5eYlxgVV1eYmt5dGx9a1pVWVRQUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVFXUllYWV9bWlRVVlpZWldYWl1XVVteXV5gYV9kY1xeXV1lYWJmZF5eZGNgXGdkaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNOUFZZUV1VVllXV1VYX19hYWBjXV9UXV9iZWV1gXpoV1lZU1VTVlxYV1dWVlddWE9VXVpeXVxUUldTV1dVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVhUWVpaYVlcVldYW1pbWVlaW1lXXl9gX2NiYWRkXGJcYGZhZGZkXl9kYmJbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5TWVZTXFRWV1lWVlxgYWJjYGNeX1ZbYGRhX3p1b2hZW1lVV1RXW1paXFlYWWBXUFVeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19aXV5ZXVVSWVdZWV1iWl5XWFtcW1xbW1pcWlpfX2BgZGJjZGRiZFlhZmNmZmVeYWJgY15iY2lkY2dfZ15hYmNhYWBeX1hUW1paW1tYW1hYXFtaW1hXWVhXXFtbYF1WXV1TT1ZZVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXltcWlZXWFlcXF1fW1lbYlZUWF5dYWNcUlZZUFdXV1dXVlNVVFhcXF5gYF1gXFdhXlteW1peWFVYV1tbX2BcX1hZXFxdXl9cW11ZW2BhXmBlY2RlZWZiWGNlZGhnZF5jYGBlY1xlaWRlaV9mXWNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1lYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXF5ZWFVXW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmVjZWZlZmJaZGZmaWdiX2NeYWZkWmloYmZpY2VeYmJjYWBgX11dWlhcWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lWXFtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRdXFhbYmVjYVJcWk9ZWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXVlZVFhdXV9gX2BcW15eYGJjXVxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxjZ2BcaWhiaGllZGBiYWNhX2BfXF1cWVxZWFdYWVhXXFpaV1dYT1haXWFjZmZya39KWVdcWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWVhVW19eXWFiYF5bYGFiZmNfXVRdYGFjZGRmZWdlZmZlXmVmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19cXVtaW1lYWFhWWlZcW1pWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeEgoKCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3p6enp6enp7e3t8e3t7e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t6enp6enp6ent7e3t7e3t7enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiJDM09LS0tPVnoaJiYmJhrPW0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyKlN3m5OTl5OeliYyMjIyIv+nl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXl5eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9hIWEhISEhH58fHx8fHuBhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eXZ2dnp7eHt4d3Z3end5enp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t5eXl5eXl5ent7ent7e3p6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnl9fHx6eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiY2MiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en19fn15e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYOEhIKCgoKBgYKCgoKCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3Z7fXx8fHp8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6eXp9e3x9enx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHt4ent5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgoGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhYSDhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIODgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3t8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGBgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKCgoKBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FxcXJzdHR0dHR0dHNzdHNzc3R0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5ubm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKCgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3NzcnJxcXBwcHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm5ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYGCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXFzcXJycXFvfIJvcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgYGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcIeGcHJxcHOYgm5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgYGBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxfaGCb3Jvi558b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgYGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcnF1naF2cXefnH1vcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFxcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYKCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGYqJBvgqOdfnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOBg3lyc3NycnJzcnJzc3NzcnN0cpOppHmIoZ58cnNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn+Afn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH59fHZ2d3d2dXh6eHh4eHh3eHl5n7SppKepl317eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3x7e4mvpqG1qqyjfnt6enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19mKWWorKgmaeTfYB/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/foCAf39+f3+AgIGAgIGAgYGcnI6gsKCfop+AgIGAfn5/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBgJeajpixoZiVnIV8fn5+f35+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn6AgX5+n6ukl6Sbm5ahn4Z/fX1/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYGBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOCg4OGjp+yqKKgmZ2dpqisqKCZkYeBgICBgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OGjaCtsaabmqCbnpycnaGko52Uh4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GDi5eal5aYoJudnZ2ZmpeQiYaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+QkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYaOlJOXmpycm5SPiYeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOTko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4SIkJOPlJiSh4OChYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoGCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRk5KQjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgYCHm4iLh4KCgoGAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgH+DiI6AgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2JhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf3+MlYKCgYKEgoGBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpGRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpOQjYyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGQjIOBf359fH2MnI6AgoGBgoKElJSMgYKBgoOCgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWEhYWEg4OEg4SDgoaUlJKTko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX19e4GYjICDgYGBgI6UjJCBgoGCgoGDgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBlZ+Kfn6AfYeLfoSEg4SCg4OCjYmFjIKCg4OCio+Cg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIR9homAfoWFhYSFgn99fX2Ag4SDg4aYj4KDhISEhIWDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhoaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/f39/g4SDjZmVkoiEhYSFhYSEhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWUm6OropOHhZCHhoeGhoWGhYWGh4eHiIaHh4aGhoeHh4aGh4eGhoaFg4OEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhYOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/iZKdpaamopOQkoiHiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGh4WDg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgoKBgYGBgH+Af39+e3mJmJecoaCdnZqMiImJiYqLioiIiImJi4uKioiHh4iIiIeHiIiHh4aHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUkpCPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn18e36Sm5mdnpydk4eIiYmIiYuKiYmIiYiKiomLiYaGhoaHhYaIiIiIhoaHhIODhIeIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fYCVmpmbmpmShYaHh4eHiIeHiYeHhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYGBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KDgX18fX+Af35+fn18fX58eoCWmZmYlZKCgoSEhoWFg4OFhISEhISEhYSCgoKBhISBgoODhYaFhIKCgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImFhIWEhYKBgYGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+BhISDg4OCgoB9fX+AgIF/fX5+fXx9fXt7eoaXl5WWj4GBgoGCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICBgIGCgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KEhIKDgoOCfn1+f4CAgYB+fX19fX59fHp8e4qWlpOEgH+Af3+AgH59gH9+gICBf4CAgX9/gIGBfn19f4CBf39+f4CAf4CAgIB/gIKAgIKBgYOBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgYOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Ag4ODgoKBgX99fX5/gICAf359fX18e3t7ent7fI2MiouXjH1/fn5/fn+Af35/f4B/gIB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6enp5foyNipGPgX9+f39/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9+gH9/fn9/gIB+foB/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6enp5ho6HgoKDgoCAgYB/gX+AgICBgYKCgH6Afn9+fn5+gYCBgH9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhISCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFgoGDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX18enp5eXl7hYSCgoSDgYKDgYCCgIKBgYODg4OBgYKAgYB/gIGDgYSCgICBgIGBgYCBgIKCf4GAgX+AgH+AgIB+f39+fHyJlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgICBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWEhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eXh8goOEhYOBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgIGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgYGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHh5eXp/goJ/g4uEg4SEhJeXg4OEgX1+gYGCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4OEg4KDg4KCgoKDg4KCkZCLiIiHiYeGhoSGhYSEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4eHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5eXyAgH2HlIODg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhISEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6ent8fYGCgYKBg4KAfn1/f3uIkXx8jpZ/fX9/goaKhYODhIOCg42Jf31/g4SFhYOFhoaEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDhIOBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl5fX5/gH+Bf317fH9+fYKVkX+EiH18fn+ChHx8gYKEg39/h4N9goGAgoKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fn9/fn5+fn18gIGAfoaPgX59gn5/foCCfHyAf4KAgYB+fHuKgn2Af36BgICBgoCCgICAgYB/i5SQjIyOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaFhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF/gIF9f3+Af32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foGUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt8fHx8fHx8fHx8fX18e3x8fHx7fHx8enp5e3x6fYWDg4CBgX6Af3+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoWDgICAfX59fn9+i4SBh359fHx/foKCf319fX2BfHt9fH6BhIOBgH5+fn59fH5/gH1+gH5/foSSjY2Mj42MioaEhYSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp+fnx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1+gICDg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4J/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8fYGCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEg4GCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXt/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fHx9fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqIiomFiJKPjYmKh4WFg4KCg4OEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn5+f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fX18fXx9fX19fX58fXt9fH19fn1+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mMkZCOiomGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgoKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn59fn18fHx+fX19fH19fX59fX5+fHt7e3x8fXx7ent7eXp6eXl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB/gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH5/fH19fH19fn59fn98fXx7fH1+fHx7fH16enl5eXl6e35+gIGDh4SIj46LioeFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChYWEgoGBgoGCgX+AgoSBf36BgH1+gX59fn+AgH1+gISAfn5/fX59fYqFfX5/fX5+gH59fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImOi4yIhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgYOBf4CBhIF+foB/fX6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fH17e3t8e3x8fX18ioqJiYaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoGAgICDgH5+gH99f4B9fX5+gIB/gn+BgICAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt9fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX6Af3+BgIGAgICAgYF+foB/gYB/gYCAf359fX1+fX5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhYOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SEg4GAgIB/gIF+fX1+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX+AgYCAf35+fn5+fX9+foWFgYGBf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX9/gH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Bg4KDgH9/gYGAgoGBgYCAgYCAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9gH1/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgYOCgYOBf4CBfn6AfoB9fX1+gH5/gH5+f31/fH9/gIGAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fH1+fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhYKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fXl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIWEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH+Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICAf3+BgoGAf36AgX5/gIKCgIGDgoSEhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn17f32Afn19f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19foCAgH9/f398gH9/gYCBgIB/fIB/fn9+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t/hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GAgH99gH5+f39/fn19foCBgYB+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgICAgH1+fn+AfXx+fH+AgYCAgICAfIB/gH5/gYB/f32Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3t5d3h3d3h7e3p7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fXx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIKAgIGAfn9+f399fH5+gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f36AgIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjXp8fXx7fXl7enp4eoGBeHl8fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gH+AgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fH14eHV4eHl7fHx9e3x8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYCBgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHt9fHt9f3h3dnl5enx8fHx8e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4OEgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgIGBgIB/gYGBgYGDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99en1/e3p2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgHx/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBfoCAgIKBgoKBgoKAgYCAgIKCgYSAfoGDgX9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHZ7hIKDgoODhIKEg4OBgoKEhoSCg4KDhIGEg4GDgIGDgoKCgoKBgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SAgoSCg4KCgYKCg4GDhIOEg4SEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF/gICAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhIGCg4WFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgIGAe32Bfnx5fHp6en18fIF+enx8fX18ent+fn6AgH+BgYGAgICAgoGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgYKEhoSEg4KDhISBg4WDgoKCg4OBg4GCgIKAfYCAgYKDgoKCgoSCgIKCg4OCgoGAgIKDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH1+fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgoKBgYOCf4KDhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf359foGBgH5+fX59fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIaFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4OCgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn5/f399f317fH19fX19fn5/gIGAgYGAf318foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4SEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChIWLiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXqEf39/foSEgoOCgoGDhIOEhIWDhIWGhIWGfYR5fX5/g3uFg4CEg4B/fX5/fn6Bg4F9e399foB+fXx8fH19fX18fX1+gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4CCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGEfoODfYF9fn9+f4KDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WEhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhISGfXB7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX1/fnx+gYCBfYB/fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGBgIGAgICBgYCAgoOCgoOFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f359gX6AgH5+gICBgH5+f35+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSFhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFhIWEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/f3p+fX1/fX9/fn2AgYODgIKDgYGEgoF/gYKAfX9/gX5/fn1+gYB+foGCgICChIeGg4OGhISEhYeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIWEhoWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdweX19bX11b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhIOBg4OEg4WDhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFg4SEg4KBfn9+e3x7fnt8fX5/f318f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaHhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGh4aFhIaEhYaGhoaEh4aHh4aGh4iIiIiGhYeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhoSGhYSFhYOGhoWFhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWDg4WGhoSEg4SEg4SGhIaGhYWFg4aGhYaFhIaHhYSEhYWDhIiGhIODhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYaIhYaHhoeGh4aHhYiIh4eFhoaHhYaGhYKEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIOEh4OEgYKEhYOBgICBe3t+fXx8fH59fHx8fX58fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX99fHx8fn18fX18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaHhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGiISDhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYWEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHiIiHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn9/fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoSEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYiDhIWEhoaGh4WFhIOFhYaGh4aHhYaGhoWGhoSDhIWCgYKBgISDgoJ9gYF/foOBfn9/gHx/fH19fn17fn18fXl6enl7fH16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWEg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiIaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeFhYaGhYWGgoODhYGAgYCAhICDgHyBgH5+goB9gH+BfYB8fX59fnt+fXx7eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhYWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDhIWHhYSDg4eGg4SFhIKFiIWChIODhYWFhYaHhoiIhoWIh4mHhoWFhYOGhIWHg4OGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAfIF/fX6Cfn6AfoB/f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4aEhIaEh4aGhYWFg4SFhIWGhYaEhISEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaFhoaDhIOGgoWBgYB/f4CAfn+BgXx+f39+f4CCgoKEhYOCgYKEgYCDgoGAhIWEgoF/gIKDgoSFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoaGhoWDhISDhIWFhYOEg4OEgoSEgH+Cgn99fn5+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/fn5/f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBgoaFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGBfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l7enl6enp7fHl7fXt7fn9/gYB9f319fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB+fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYCBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fHx+fXx+g317fnx9gH+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9PD46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pjw+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE9MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1svLy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NPT09PT09PU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88Ozk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkeo2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbLy9HT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfY19fX2tva2tra2tra29zb29vZ19fX19fX19fX19fX19bU09PT09PT09PT09TU1tXV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QDw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU1Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWy8yDbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI2Li4uLi4uLi4uKioqIn7u5ubm5ubm4uLi4uLe909PT09PT09LS0tLT09Pb4uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlNiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18vNTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxYUlNTU1NTU1NTU1NTT3eopKSjo6Ojo6Ojo6Oiq9PS0tPT09PS0tLS0tLS3+vq6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CQDk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fLzVIsMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKaeXFZXV1dXV1dXV1dXV1N6qaWlpaSkpKSkpKSko6zS0tLS0tLS0tLS0tLS0d/q6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw7Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzM5cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqomZhYmJiYmJiYmJiYmJegq2pqampqampqampqaiw0tLS0tLS0tLS0tLS0tHf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ojo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2MzNxMLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Ozs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMy8vLy83S0tLS0tLS0tLS0tLS0tTT1NbW1tbW1tbW1tbV19jY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ozg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjNzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7S08/Pz9PTz8/Q09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fX19fX19fW1tbW1tbV1tbW1tbW1tbW1tbX19bW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1ZKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Sq5zP0NChlsvTx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09PD06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Stpylo9anoKufz5msmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pzp2ckZ65npaQobSVhp2czc/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pjw8OTY/Qj9COjY0ODo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+YoJu1l5+gqJm1v8mXmcXQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qjo3NDo6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9O0mZaquZymoIufxNORmaHP0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PTw5NjQ6OTg6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/KoKO/ypyljKet2KqZqtTPz8/Uq5p+o4+lm8fJlNito7+e1dHQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+OTw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ1Kybp4uXlJ+VlaS7zYiVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PDw9OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NO2srKlnYaer7OdpdDbo5m11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxKKZlqCPo5uinJyRp5ieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT06Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKugx9Wiq6Scvp6ooaOeqKKpndDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGUlFLS0A+PUQ8P0NGPTU1Nzs5Njo7Ojs9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTyJGNtNmvjZGl1JqSjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWlqW0xfTUpMSlRMRkI8PD9GRUdLST02Njc6OTc5Ojs6Oz05Pjk4Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTIwdXS1cC91tTTucjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QURMTEE+Nzc1Ojg4ODk5Ojw+PD43Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR09TS0tLU1dPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9PTc4Njk3Nzg5OTs7PT9APDw4OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09LS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRLSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNBTEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1NTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUUE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOzo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSERFQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29va2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw4Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo7ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODo4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTk6ODY4ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4aBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Njg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NjU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjUzNTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2OT07PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubm4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2PDo5PD09Ozo4NjY4ODo3Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRj44OzcyODk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjY4Pz5AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjY0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztbW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e3t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6urr7CsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzo9PkA/QDpAQkJCPz9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7OwsK2sq6qpqainqKmpqaioqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiYmZmZmZqampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTkzNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaWlpaWmqKinqKilpqiop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZiYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD46OkE8Nzw4Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs7QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2srKyrqqmopaOkpaampaanp6qopqanp6eoqKenqKinpaSkoqGhoaCfnp6fn5+fnp+goaGjpaSjo6SkpKWnp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Ctq6mprquopaWmpqelpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmZqamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1Njw/PT9BPzw/QkM/QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaOio6WmpqWlpaapqqmmpaOkpaampKOjoqKjoqGfn5+enpycnJydnZ2cnZ6foKKhoqOjo6GioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZiXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj47Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QD9CQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpKSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3NTc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OSlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk4PTs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Oio6OkpKWmpqWkpKKhoaOjo6Oio6Wmpqamp6emn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqampKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg5Ojg5Nzg4Oj07PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz5BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpqaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6goaCkp6empaOioaOnpqalo6OmpqampqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqOlpKWlpaWlpaWko6SjoqKioaCgoaCen5+fn5+enp+gn5ybmpmXlZSUlJORkJCRkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manJ2eoaampqWko6KipqenpqOkpqalpaanpqainZyfoZ+XkZGQlJebnZiWl5eYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6OkpaSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2dn56bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6ODY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6Ojo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaXmJeXmp6ioqGio6Sko6OmpqWkpqempaWlpqWlo6CgoaGgmZKQj5abmp6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoJ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKRkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqalpaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2en5+go6SioaGio6KjpKSmpqWkpKOioaGenJuVk5WZnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg2ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnJ2cnp6en6ChoJ+foKCgoaKjo6SkpKSioaGenJqZl6O3n5mZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZiZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqZl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ogn5+goaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoaChoaCgoaGipqGioqKhoJ6cm5ubmaGplpybm5mcnpqWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJGSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE9PTs6Ojs7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz48Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKloZ6goaKioqGgpbKtoKCfn56cmZmampyuZnidnZ6bmZqcmZeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOSkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgn6aTmKyfoJ+dm5qampmqgESBn56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCfnp2bmpqam5qYmZmYl5eWlZSUk5GRkJCRkpKTk5KTk5SXmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw9OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz86OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ufoqKem5ydnJycnZ6gn2GZqJ+enJqam5yjoU9IhKCdnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foKGgnZyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+enJmbmpycm5qamZaWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0JDOTw/Pzs6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPDo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYl5iZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52bmqdqXKKgm5mZm52cr3JKTIahnJydnJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmJiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZilglN3opmZmp2boKNfV06HoZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5qcnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoKGfn5+fnZmam5ydmpmYlZaXlpWWlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRcXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmJiZoIpcYJObmpudnKOPZVpNgaKenp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+PkI6RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1tMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmYmZ6ZXV51lpqcnZ2igWVaTX+inp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bm5ubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDk9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZycnZybm5ubm5yamJmZm2FiYH6Vnpyel3RjVU+Bop6fn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmZqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpmYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oj06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56dnZ2cmpubnJubm5iZmZ9pXVtjfZycnotpXlBTh5+bnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+MkI6Qi4uPj5aIiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoqqxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg6OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPT4+OWGZlYuRho2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZuampeTdm5mVnmUmJ2JW1RQWYuSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo4Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+MkY+LjI+QkZGOk52fkn+ipZimnXRPUGSHh4KNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo6QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAhaKbjHxmkqWTnHuIg2N0gICCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjkzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+foKjiXlsUXOcjYtYcHt8f358hY6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3OTo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2ZmXVTS0tzk4WCTF5vcXeJhYqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo9ODg7Ojk6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S4CCiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+DgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GOo4tQMC87eIZ2dUBCW2pugpCJiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/Ojw4OTU4NzU3OTU6Ojo5PDg6PD06PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuip5xjQ19LPHh4aWZHMTZXbXKQj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZDPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqq6OSXiqfkB8eGViUVZjSl5viqGhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRT43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6iidmPC1KVFfZCEeE9tjXhWYoCjqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAREJAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6qppKenmZ2kpaOinmOBu8CufKSjmpdsSVx7cFJ0laOioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07QEFBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqCip6GmrqamnJ9sg5i5i6zTo5u0rFxNr5pVZZChnqCgnp2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKvq6Ojh3d+enPRxLCZo61sVqeuZl2HpqCloqGdn6KYlZ6bn5+koZyVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e3tbW2sq2wrY+HgW2Sy72VlaaVdFZtd3Vzf5WmqqekoZ+jm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyuLu8vLq6wrm1tJ6GdmFWnrW7pqeZh3htcnB4eXp9hIyRlpuhpqespqWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1uMLIztLQzMi9saONcGVSRIiUhYWFfXhyb2Zla2hrcXNxcXJ0e4upxsa7oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWFmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxcfb5OPZybuuo5WGcllaUURmd2pudG5rZWVZWF1YXGJpamhlYWuPuMHAuamvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca+zNDUyrmmmpGEcFxRVEtEW2ZeY2plYmFoW1VZVFdZWlxZXXmeuLqrtLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnZycnVyZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEvsPBx8vJuJV0YVRPT1NIPl9sX19lY2JfZGJUVldWVFVbeaKusKqoq62sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDubjDn2ZLREdLRD1aZGJiamRhXGRfWFNQUFJch7a6rK6lpKOopKCgpZmptLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn52Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7d25raWh2WmdyeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExMTCxMGwilNHTUU7S1pfZmxnX1xgWVpUT1mHp6y4tbKsqaOhramsp62frLS0v8O+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnZlZmpqaF5rb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwsedcVxIPz9EXmJha2JbWFdTWYChub+7vLq8rK2mqbu6ube/s7W4ssHGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FodmhqanRueWxeZFtVYFlMSEQ2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzsbGxsCvelVOL1ZUV2hhUk5UerLJyMLEx8C8vrSwsLDCvr7BxsC+t7bDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjouUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfXhwZ2BrandtaWZ2b3RjXWNVV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLCwsPBlUNOeYOOVlB5rc3Txba/v8C/uru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eYBzcGZlZ2RsZWJrbm9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr68x6Z5bYKRlnK0zMjH0cGvvb24ubu7vre0sLm+s7y+sbm1uLy2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9eoN4bmZhZWJhY2RkamNnZFtaWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMnPwLq/wLy7xb26wMS/vb+ucGF8kYqL0cW/v8m/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe3uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqysp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygp6GjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWNjaGtnZ2pmal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OTY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HUjLi/u8O1use2tbi6vLi5tqulmI18hMm/v7vBvrnGvcK/vMW4tre0uLa2u7u4trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoaKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZ3BqZWxoWVlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPw3aozL3Ht7m3rba0t7mztbG9ycWVSHzKvr++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h31rbnFncWt0ZmNuYFxVSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE161zgLvIz8LAuK60tLu9t7mxvcPKjUR2zcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFyZmxqbnVveWRoY1xjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLGydGYcHOs0dHMysS1ur/EyL6+tL/AwHdRb8vGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdHBtbHRsbW9gY19iYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0cO6vrzEvre8wL/Jz8fIysnBhXFzpczMy83KxsLDy87BvLi9urBuY2O8yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFkXF9gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vbw762vsC+vrqmnKmytsO/pXh1eJvExsvIwcPAv8nKwb+7ubGgfHJrrsjFxL/Awb/Lx8PAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKSen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLdtrc69trnAvKx9bmhubXKBlZhzd3yXvb/GwLnAvL7FxL29uLGwmI98gJvKwsO8vb+/w8O/v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3BvalxgYVpUUUFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2ydoGzvba1wqWHaVpeYE1SW1puc3eBn7i4wrqzu7e7vb+6u7uupJqXhpB+wMTDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vLSxrKOoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dnducmFfZl1bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJp4V4iqCvtZ1qZWdWWWBJSU1QU2x3hqWwt765srWyu7m8trm+tJabpZWgca7JxMC9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xaqIfHWMoJhgVENYVUdhalZPRUphjaCsr7a6tbSyrLy5uLW4wb2Ll6+hpXKly8K/ubq1rqWss7Cmr62onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c25jXmdZXV5TT05CP0pDQUtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL60kIJ4iI9vTko/ZFlCTneAlGpOQV2BsLWztbK0r6y7uri2ub/FdYKonZljqb+4tbKxra2fpKamnKOlnJaZmZqfqa65rKurn6WopKuur6ewq6+xsa2xrq6vubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWpsXVxrVF5cUE5IREdNQkdORzg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR7WEZBTodZSkpYd42BY0FTo7iztLKwsa2wubi2u7e6vI+hsaqjcqywqautq6OooJ2enZaXoZWRlZePl56orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlodXRvZVVhZFddUk9NSUBJUkROQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsryqmZmVaU1AUnhxUElJS2ecgVlEUq67sayzr66srba2srS1rqimnpqbnZ6mqJ6gqKmfoaeWmpaXjZuSjI6UjJaao6ign6GioaalnKOjoJ6loKSspaaopaKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqmkqaumqayrpqGIeIN8dn96Y3htbl1RaVVQT0dQTU1DUFJBPzs+NDo6NTs6PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqWmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqulvmlFUp2CUVdJSmBLVI5hY2KBrrWqsrSuqquvsLKzraWdkZeTj5egn6GgnKOkn56olJmUlYqUjoqNlZGXm6Gpnp6foKOlqJyfoKGcoZ+jqKecp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyWk4+PkpGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjn52gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnyAdXZ9bmx7ZGlWUmROSUhHT1NOS05IPEVAPTJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra2urm6t7e7rqigoamgqsa/y6FQQXOdd1BuS0xjZnVzYFpecJCxr66ztaqmrKyjm5mUjZGVl5iYnJ+iopydpJ6apJWdmpSNj4+PkJeWmp6jqZ2goJ6mp6uin6Cnn52fo6aonqOmn6qdqq2qrqeosKWjpKanrKaipaKbmZ6vqK6yq6arqqCbmJiYlZOWmpOVlpqWm5eYmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXyAfnd5fGV5eWFiU1ZhSElLTFNVSlNRTTk/QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTHx45XU0plo1plfm9yXVFrY1tkX1xrj7SwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKclqeloZWVlpGWlpSbmZ2jpKifpaOep66uqqaisaOao6amqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblZablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgm1lXFNbWk1RS09PVk1UTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeq6SNelVpcnZ1cGN2dlhXY2BjZ1lYV2etrqyvp5+eoqCWkJOboJyZl5KTn5yho5qempijbn2XmaCbop6copyipqutp6uopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO1uLO4rbK0pKCdpaCsoaGioaCamZaWn5ubmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHZqd3VebVtSYUlSVkhGVldLQ01IPUtJOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqaiuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boqGgpIBugnBgY1hMW1NaTUxQWFJITU1ImKyqqaWgn5qSkZSYmJaWloyIi46UnZydnJ+ZSEePn5+mo66npKygqKu1sLSwsK22uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G3u7arrrG5t7yvs7C1wby3vrOztaKsoqmpsqmrqKeompmemqqnoJmnoJ+fqKilpZ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaG5cWFxDV05KR01IQ0ZOPT5MPjQ8OjY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamplJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn52JYVdeZWBXTVFHPj4/Q0M/PkJReKmtqaqmoJ6foqOdn56bnZuUk5WUnp6YlIWmdipgkp6jq664r6+ur6+4vLu7uLW4w76/wr+2urvAw7m9u6yup7GtscK2uMLGwMjKwMq/sLm5vbjCvri0u8bEvcO8uLSqs62qs7Svs66qr6OerKi3sq2jsKaho7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIREpQST9FQjRGSDk2PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+VfF9eZWBRR0Q8Qz5FPD85Nk5+qrOnpKOioJ6lrKafmJ2VkpqemZWMioaIhnhsi1c1ZoV8eYCWvLy8sLnBw8LGv77CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcbMzMzSx76/wMO+x8bCuMTKycTBx7+6tLq7tbu3sLayq7uyr7y3wLu6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOVlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZVpcRkxNRURUTUVCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxAP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXNqYVdORT5JWXxvYkI9XI6urKCZm5yenpmXl5iTjY+Xl5SPjZCMgoOCdnJwbHBsVGBrcHJuc4+uxL7BzM3QyMTI0MzMzMfKxcXM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbHxsrIz8DJ0c3HxsjGwr3Ewb+/v7W+s62/wMPDx8XIxK+/ubK4vcTCwbu8vLWup6euqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl1c2ViZ3JvZ15aWkRPTUNGUUlEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojs+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpudlmtmXVRJREA/S4aepZqEoLKto56cn5qYl5STlJeRkJCNiISEiYeDgIGBgHlxcW5qe4BkWHd3cm5yf52+z83TyrPR0NDR0c3NztDEzdTV2NHXzcbHyczDxcrPytLX0tfS1dbT1MjMx8zNydPNztPNxsnKysLHzMfJyca/w7OzyMXLy8vPx8q/vr+9wcfFzMzJycDDwK6ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amVWWFJETkdASVFDPkI9OjIyQTxFPDc4PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZxjVExKREM/Q1Ku0b2yr6acnJygpKGdmpSUlZSKfXlxbGViaHJwcnuFioB1cG1wcm+Ee3aAfXRydW90ns/Q05m219PR0tTU0s/Rw9DT1tjV1dLLyc7Qy8bN0srS1dfZ1tjT1tjN0srP0czP0c3T0MDJyMvEzM3Mz8/Gx8i2wMvA0s3M0MfKycDEw8jPzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2FlcmNdUlxKS0dBRklKPztBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaWloKKiW0lAQURBRlF2sq+mmpSXn5yaoKCem52alYl3aWRhX19fX15fX11hbHVzcG9ua3Bvc4OAe4F5bWloXm2+06N/0tbUzs/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NfX2NLY0tfZ1dbMz8/JzdLMztHAx8TJx8/O0dHSyMzNwMvNxtTPzM/JxcvHx8nMy9TU0dXP0szTwrnFsaWota6om6irpZ2yqLCzrKyTj5OOiIqOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlFgSkpDRUNTTj88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWepaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqeqqKGjrGZDOD0+RFiCqqifl5WXmZqcn52Ym52TfXFlY2JfX2FfXmFgXmFgX2BlbXBwbWpsb3N2fXJ5gHJiXFNZo61yq9rP087L0s3V1NHKz8zT1tLR1s3P1dXRxdHTytDU1dbO09HY2NjXy8jOxMnPzcrMwMnBycrOz9DM0M7OzM/QyMzQ0cvOy8PKyMrNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zv7uxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0lGRkRNWUU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg/OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoKCjp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLJ7SEZCO1eNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGBeX19eXGJtcm5ucHFycXZ0b3d5dGNbXHt3iNHUyczNxM3K0tLOxs7MzdTLztLNy9fW0MzR1MvM0NLTys7R1dLV1srAysLGzcPIysPNxMbJy8vPy87N0c7UzMfJ0M3Jx8vGx8LGyszO0dHH0M/OzszQxcfBuLm9w8K9w7mysr6wu8PEtaqYpaGYlpGVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR0xJUVFCO0Q/OzY4Ojg6OzU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvcHePmo2Ml5WQk5GRlZaVkIt8ZWJiYmBdXmFjYmBfX2BhYWBfXVtdZ3Fxb3BxbWltc3BocnRnZmNdd8LFx8fExL3Bxc7Ox8XGzcrRyMvNzcbR0s/NzNTKx8rOz8fHz9LL0M/FusS/xsq9w8fJzsXDyMDHzsjEzcvN0MnFxdDJxsLGycW/wcjNzMzPw8rMycfM0MXFyLvHw8nJws/Bvby/sMHJx7m9qrGyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSUhHSU1VRz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDo6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChaKqk42Nlo+Fg4ODgX2EhH5zX1teXV5gXmBjZGNfXVxeX2BgX1taXGFrcnBtbWhnaWp1amNiXmJlXajGuL/Bubm4uL3IxcHDwMPHysjIycjBxczGyMrNycTBysnBwcvPxMvIv7nBvMbIvsDGz8vEwMO7ysfIu8nGxcrBvsLLxsXEvsa+vcHExszGxry/ysPFx9LFwcnAysrGyMbQw8PGw67Ey8fDyre/vLqzqaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQ0dETERGUz81NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai+uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtmxeeXyfkYqSloZ6gISFf3V4dXJwX1pbXWBgYmNkZGVkYFtcXl1eXWBbWVpcYW5xbWlmZ2tpbndcWFZdYWmqwa21uLCwsa+vwbq6u7q4wMHBxL69ub3AucTKxcbCvcbAt7vDyL/Bybu2u7vFw7+8ws7Dxr6+tcG+xLu9x7zDurW9xsTCw7fAtra/v7zNxL22usi7v77MxMLGw8bJx8nG0MbCzMiyx8nDzszAxcO/vLK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUVCRkpBOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstau3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrPxcnFx8G6xb2srqZgY3aBkouIi4R4f4aGf32De3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF1ncm9rZGNpamt3ck9RV2JxmrSrrq6kp6uppLWytbOys7S7tb2xt7C1r7K7wrvBxLy/urSyur7AuMi4tLy2wMK9uL3HwcO7ta+ztbu/tMW4u7Wsub2+wL2xu7awt7qzxr23r7y/tbe1xb2+w8bAxMbGx8zFv8bGu8fLv8/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKR0JEQUVGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxcvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CZW2dviI+GiIl6eH6FhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX15cW15cXV5aW1tdX2tvbGZjZmhobHtlSVx1h5SoqKijm5+npJuoqbCsqaups621sLKoraess7u6tsO5urmwqrS5u7PCua/Asb28u7W7x7nDt62qqLCywLa4vbCxqLKztbu8q662p662rryysaq4sK67rru4u8DBvrrDv8bDxcC8xsHHyrjFx8W/x8PDucTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTExNSkVBQz9GQTo6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHEz8fNwcLGv8TEw8PKwsnKv8C8wrqztbXDrqqwkltpfpKIjo97eH2JhXl7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpaWlxjbW1mZGRkZmhteWRthJCTm6KlrpqboZ2WmaKorKOnoaupq6uwo6afqa21trG9uK+3r6ituLSzvLezvbC4ubWyvMGywK+lqaOrsbOzqL2qq6irrK61tKaprqGlr6mzpqiorqaot6yxs7e6u7uyvL6+vsS/tcHAx8i3v7/Ft8XDwLu/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpTU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvCy767yba9w766yrfBxMG0try2sa+1vK2pq5NkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tYV1lcX2VqZGJjYWRkaG15eYCHhpOYkZWtpqCYlI6eoKeiop+kpKalrZ+cm6OlrLKwtrensKyoqrSrs7mwtrautrqzsLq6sbakoKSgprGorKm5qqWnp6ins62gp6efnKSmrJ+fp6ShobGtrayytbO0sLW8trvBwLK7vsPBsbm5wrPAvcC1uLy9vrzCx8TDxL/AxKCEeXFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG6vbagnpWdoKa6tquzs7uzxM/Jy8LFuLfHwMy/uMq3u8W4s8W4s7/ArLa8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXlxbXFxYWVhYWFZYWl1eY2JgY2NjYmVmbHlzcWpYW29Fe6CflJKJmp6fpZuenqKkoqedm6KbnqqurLG1pKiqqayspLS4rLewrLO1r7O1r7Cqn56fpKKypaaquK2ipqafqK2rmZ+gnpmdn6WamaOcnJ6wqayoqqusrbCzua+4ubqwtry7uquzsrmzvbS3srG2tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU2MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnIuLi/t7LCtLG7u6y5urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXV1hXWl1hYmNjYmJjZGVwalhBIjpxaGmHnJKSjJeenqadmpujpaGkm5+gmZiura2vsqCkoq2rp6G1sLGyrKmws6i6s6e2oaKfnKOhraOiqraroqOmnqamo5aZnZeZmp2fmpednJ2craGsqKOkpq2rs7OqtbCyq7K5tK+qr7Kys7ezrqmtrrK4sLq2ur2/t7OxlIZ6dmZfZl9bWVZTWlVLW1FMSkVIS0lDPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/sp2lo5ilscO1tr2ttLjCzMjGwMW2wcDHzrfAw72zubmyv7axubutsrWvn5qjqqGUmo94f4OEf3hvcXRxaGVkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1ZWWFdYV1VXYGJjYWFiYGBkZnJEGRxIipSQjpmRlI6TnJqem5Wfn6einZ2nm5qaq6evsKqco6O3qaGgrqi1qqenrrGkuLCkt6CjnJmZqqahmq25sKOhpJyioKCTlaGUlpacmZiWl5yVn6meqqSinqOqqrGtqLSsqqets7Clq66zsa+wr6+nqKiyrrK0sLy0uriuo5SCendlX2FXWVhTUlRLTV5MUExHSE1MRT1APj1CPDo3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLrCsb63va2dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyaoamVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dWVVpiYmBgYV9fYGJqXyU3boeLjo6UkpaQkZicmZ2Unp2lpKKlpp6cn6agq6+mn6GjtqehoaKps6KlqKWwprGuq7WfoZ2WlamhopStsbGfo6Oenpick4yglJGTmJiSl5iYl56nm6eiopqkpaWrpKWwp6Wjq6ytpqmur6+rqKqqs6amq6+0sa68trGvr5+Se3hzZWJcW11YTkxRSFJhTVZQT0pOT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G2vbC7sbesnqWmrLi7vMHFurK5tcTJycDCxsXHtsbEs8G/xau3t722vbq7tbKsraiZmZ+ji4p0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1VUVlZSVFJUX19dXl9cXV1gYWxXXIeDiYeNi42VjpCToJeelZqeo6CrpKOjoqSinKqrpJqepbGqoaGepaqeqKKfrayqqa6toqKilZiimpyQq6mwnJ+in5+XmZOKnZGNkpSWkJiYk5yho5yloaKVoKKkpZujq6WipKqkq62lrrKppqWmprWmqqits7W0ubqvqqyejHNxcGBbV1ZWUkdRT0haXE9SSlRLU0xFR0pDODs7PTw5NjY2Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuxrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvLG+w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNOUFldW1tcXFxdXF9ia4OJfYp/iIiHkoyPjpiYoJmZn6anqqerp6mlopikrqSVmKSvqaCcmZugn66ZnKqzn6amn6OjoZWUm5aWkqmprZucn6Ghm5SQjJiNjJGNko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuwpK64paOko6ytqqirr7S3sr21s6uumIV1dGlbWVlTVVJGWExRW1hNVU9QTFFSSU9JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3rqior66bqaist7asvMq7tr+szMbFuMDOz8ezxLu3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2doZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWFlZWVxbWltdXmR6hHqDd4SIg4uHkYyTlp6dmJ6pqKWtq6mwo6eZnqyglJSjqKedmJCPmp6ulpinqpifnZSloJ6SkZKRk5WoqqWamJmenpeOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpaepqKCwsKaxvaefo6y0qq6nr7SwubXAsa6wq5F+cnRjVlRVTlFKR1ZQUlJMTFhOS0xPU0dOS0FDRkVDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsbe4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucWpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUk1OTVJXWFlYWFdaW1tgaXdwdm1/hX+IgpGGkJCUmJabppmeqaalq52mmJ6lm5KOnqKal5eGhZKbpI+VopyWlpWHopqbk4yOipCapaeclZWXnJGTiJSOi4GMjYCQi5KSkqGaoKKWlJmYlaKmmo2ZpKepp6GgtLKos7ihnaO2rKqupLKyprW7taussaKKenNuXk5RUU1PRE5OTlBLRk5OSkpOTlFITUpBSExJSEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrCkp6SqpaCppqSzqqKyw7W1srPGxbe6w8rMxrOtur20uMCvrqmwnqauu6+toJqbnpWViHyEbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtLU1dXVldXV1ZaXWFsaW1ne396gXqMgIqGkY2Qm5+NmJujoaOYpJahm5SNh5majHONg36Ol5aGkpqQlI6Ne5mPnYyCiYCKmKCjnpCTmJaFjoKUfn50io56kIiTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5imuKalsKGxrpyxvKqpr6mZhHh0ZFZNUlBQTUNTTkxQTUJQUUhJTlNOSUpKRUtNR0tLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2Njo4N0E3eLeho7SopqWoo6WlpqamsqemtMG4r7SwycS4ucDOxr6zrLrBrK3EraiippKdpreto6CRlpeSkH54f2ZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KR05TU1NUVFNVWFtdaWRnZHV8dG1LVW6Mf5ODipqViZKQnpidlZSWk42ViYCUiV87Vm98jJSKgIySjI+GhnKLhJaBeYF7hpSdlYOWjpCPg4Z9k3hxcIaNfYmBkI6Ql5qZk4uQip2In5iHiJaemqGgl6euqa2pqZ6WrbOipa2ZrauYqLSjqa2jk390bmBbTlNSV0xEVEpQTUxGTk9JRUxRTUtQSklOUEdKSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKKtoaamqqCmqaejqrCop7TBubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qZh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSEZITlFRTE9SVFVYWWBpZF5xeWxMPz19k4+NeoWSioOIi5qNlpSJkYaEk4V5iX9gSlFueIuShH6EjIuEf39tfn+Td3V2eISNmnBRjYiKhnx+eZR2Z3eGiH6KiJWLjpGTl4yEioiUhZuNgoWSm5aenZSkoqippaSem7CqoaSkkaaqlqKqnKGmp4p3bmZeXEhRUVNNSVVNUklMS09JSEZKTkxNVUtRUlBHSkQ9NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivrKq2vLa4t7PBu7anuci4tqiotbaqsrynnpWOf4mUqZaVi3+Og4J+eHFvWE1LTU1OS01RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZTlFTVFVabX1qbXZjY1hSjoaShXF8hH56g4uSgZKZi456hY9/dX94c291cHSOjoF6foqrhXp7aHZ7jnBybXiBi42SeHuAe4B3c3KSeGh1hYSEhXyVioiKjYuAf4SLjYCUhHyBj5iUnJaRn52pnqChnaCppZ+dmI2no5Ogn5aen6SBc2liXV1KV1BSSEtYUk9KTUxSSkpKTFBITFFNUlVNRklCPTc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTQ3Nzg1Njc1MjUxNDcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX53hnd8d3BvallLSElIR0VISFBUVFRXV1NUVVVVVldYV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxOUVFTVl5zfnZyYXGJlJeNjXlkd350dn2Hj3yDmJF/cIaPe3Z7b2t+rXx0kIt/eoaSgHx/dGZ1fIZsb2hzfIqNh4BteXF9cW12j3FocYF+jnBEi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnZudnqGclo2LpZqOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlJPSU9QTEZEPTs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM1MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6ipsa+xq7y4q7u+uLOsp5uwp6ybj5acpamloZiajoSSeYmPi4t2cXxtdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpZSk5PUVRYXWVvb2eDpanAfXF2YHl2bHl3ho95e4uFbmuLknhzeGlqgIJxlpGMgX2Vf0mSmW5nd36CbWpkbHmFkJKGa3JsfG5yfIZpbXB/c42JhYZ7fn97d3B0dIaCeYF5cHyOi4qTg5aXmJqQk5aWmZedloyDiZ+Si5KNhpCXgHBqb29vWVZYVFJSWU9SVVRSWFVNTkhNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJufpKyvoq2qqLWvrqy0v6u8w7+mopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdW90bHBtZWtrWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SVlpRWFtepYZhmGVvdWJ8bWt9eImHdYGHhXNrmZF0c3xpap2OTHmFk4mEjmYxdodya319g3RmZXV/hISFgGZpbHVrcIB8aHFxfG6TjY97dH59cXFvdW2Df3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtOUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjMzNTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaOlZmLjoV6hJCYlY2QjJCHcYeCdIiMhnpwc3FvcGRwZ19URklDPjw7OTo/QEFEQ0VHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVMQklRSWKusp5ud3RpempvgH+DgHmDhYV5cqCUdHiAc3SUhzVwnaidj6GhhKKFdnCGe4Z8dIyujYmBaGdiam5ybXCDdWlvWHVwjpuRdm1/e31ucm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jnxzcnFtYFxdXlxaWWFfUk5bWlhXTEhKRklHP0NBQkg/Q0Q9Ozo3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTExMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KRgZKIlZGdpKeer5WltKmusK7BsrvBxZaPjJSPgIh8boGQkomDioePhnWChGyViIh7dXh4bHdud2RqXklQRz0/NzQ0ODs6Oz0+QEJFSExMTExOUFFTVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMOEROUlNESoRzfHl5c3tqdIWGenyDgn6LfXWhmXl+hYCEmYSanGGGqp+dioOQjnp3iH6JiI5zi5ePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1Z2hgW1xeU1xnXldRVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydnqaRoKqgsaivwLK7xLqWjpGTh3qGdmt/i5GDfYqDjox4g4BzoYSKfX2Bf3CBfnpod2tSWExARTIxMTM3NjY4ODo8PkFFRkZHSktNT1FSU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUUxLVFxYUktngYV4hnd5b3qNiXh7h4V+lod2oJmHho6SlKWNrKlIhq6wrouBgJSLgouChJKph4CYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGSGyAd3J5dmhta192fYOIf4eFi3mUnJuJi4iRf3p1inZ8eG1vd36BdXVzbVxeXlxjZFhnZlxVUFBXWVBETEtGT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc3ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeQjpWXkpagnaygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiICCiIV4h4l+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz85NC5dlnBzo1VGSUtNTVBXYFhvWVtdZ4mPg5F+gX+Dj498hIePgJmUgZ+gl5Sbmqatk5m7sae7x8Ooi4yhpY6TiYGRfHGDnp+RnX93hYWLkIeQaWhwhIF0jIeEinKGgneIgHt2hHxtdXVmf5SOhoiIh4iHoKqilomOl396gYh5eW9na3h+fIB1bGVeW1teal5iZ2BaT0xOWFJRSVBKRE5HQ0pEQ0FEREI8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3gnp/jH+BkI6KmpuknaGspqqusJeRkYShlIR4d3+MlHx+koaSlX+KgJKbjoSAgYyKgomNg3+Kf2xwal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJUUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSEpMTEtOVl9ifmZma3KYlouXkJCIi4yXhpGOnIqfn5GiqaSjq5OptqKowcKtx694upSafI2hnpmEk4WCjqGflJmRhYqFj5mRlmxwdYqMgpWMjY53j4RxbYWBipaRgoWIcYigloaRiY2PlqS0qJuMlKKDh5KDfX9ramp8goODdWNfZWBbaGxebGxeV0tITlJRTUxMRklQQ0RORkJDRUZDPTo5Nj08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCDgICLjImGkIeEiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw4NTI8P1I1SEhITExNTlJebYl7cn97m5mXpKKfl56UoJObnaedp6qep6upqrWXq7+rtsfIt8jQz76boHBpq6mfhJOShZygmpuZppKRiJWim5t4en6UmJOikpeXgZSee3eVkqqyiIyXn3yUnZuNkZWYo6Glta+ckJinh5aPjYCIbHNzfYF+c2phXmJgYmhkYGhnXFJFSktQT0lJTEZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6MfIqGj5COgYKAiYuKhZKFg4aJgYCHd15iUDQ2MC0xLywuMC8uLy4uMDAxNT5BQU1RUlNRUlNVUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lKTk9RWWyEjnaSiJ6iprG7tqKsqqump7Oqr7Wxsa26sbO9m7LDq7rJy7fDv7ilorCzrK2qo4uWmISlpqCjl4GmmY2iq6iliIWUpKGgq6GkqI+csYuVo6a3upugoq+So52inY+joauuq7K0oZSkqYiZiJKJlXl6foaBaWJpXWZjX2VkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpblh6hHaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRjoOEgYuFhoiShoKFiYeIh4dxbmFARTY0PDIvMTEwLSwrLTAuLTQ/Q0FNVVBSU1VVVlVOW1BHR0Q8Pj5GSENFQTg7PDVDOz1GS0lHSFFPUVeAkZ6Dq6Gvp66+xcGoscS1q7K/sre9tb60wba7uqO4xai1yMe1vbm0qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6orra7srqssLWisayxtbu2tK60oKeoo6eaqa+ssbi3uKaataiMpI6Qkp+GeIKFeFtjZVdnY2JkYWFnYFtUSkRETFVRSElKRElHRUFAQEtEQk1HPDk2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmJXeXVwgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMk4yHhIGOf4GJj4Z/hoiGioeQenhuXVZARU48Njo0NUFCNzY0Ly82Q0hCUVtPUVVXVVxXUF9VSUtKQT8+R0tGRkQ7PkA3RDc/QkpKRUZWVFBejqOsorCxv7K1vsrHtbrEvbKzwLa3wbS+sLd0sbOmusSksMa5sLKxtKiktbaqsaCil5uikqWwrqatq6ekmKCstLuiqLK6tby/zL/Fxb29s8G3ure+trq3uayssaWwqa29sLy6wcGrmLmnlK2Ol5epiH6Dfm1YZGJZbGZrZlhcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqb36Og4COhG56c3iHYrmhmaOJlJSWkpSTjY+WkYeGe4aBjZWKgISBinp8ioeGfIqCgYuDlX13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUVJYWFpnWVRgX0xTUEVBP0lKSEVFQUBEPEU2Qj5IR0pMU1lUXZKttrO5tse8uLvJzLq7wLu3tbu6tr2zubHFYHWypLGanqq9qaWoq6qkorK1oKuon5WWn5mgrqWnpqWfo5Ojp7G0qLKzvbbBvtPJydPGw8XMwsrDwL28vru8t7SvuLe2w7nFvcLHr564qaGrjaSntYiBgXRhY2NfWWNgamdTWGBWUlVJRUVOS0A+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQUlNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWin6Df4J4e4uDh3uLeYGKgpd+dH16a2ZwdVleXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RUWVVKREJLS0lGSEhISEJJOkQ/SEtTVFVcWluSt763vLXEvrm4ycq6trm1t7myt7SzrrW2mGR1p5ytcF6irJyYoKKbpJ6qpZSfn5CTjpaZmKifpqCempmDpJ6spaqwrbiwvbnU0c/X0MrM0szPzsrGv77Cyr3BvMHAxMTFyr7HzbKjurC0rpqruLuYgHxtX2JeWl9jWmRjUVtgU1BLQ0FFRkU8QEU+QUhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFbWWhfb5aSkJRubG90dYe0rKGhn4uZnJmMjZWRmpGFiop+iIaMkIuIfIGDc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlnamppYGZpaWxabXOWraS8iIZnW29nXVpaVEhLTlBKS1BLU1FJTEFKRkpPX15hZmlhlrXFsLiyuruzsMTGta+4sLC7q7Kxpqq3q4y1p52ap5pOmZ2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXmpWWh56ap5usr6iwqLS01NTU1tPM0NPVzdLPzMTCydC+ycnKydHHzM3Cz9G3r8O8w7mktbnBooRxZV5fX1piWVpnWlFdWE9QQkJIRUJIO0FDPkFHPz9BNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCZ3FveXmDoaqeppeMmpuXi42VkZqOfYmLhI2KioqQh3yEgnB/h4GGe4dyg5KLjn1xeHVscXh+cXpteHNtaYFwbWNpbXB4aXd8fsu/wd+nbWN4bmNbYmBKUFJVTlleT11cTlBOVFBUVFxubXaCcZast6uzpq+1qau7v7CqtKWkuKarrqCrtKOOsK2al5iMkJORhI6bgY2mkZyJg4uEiomEi4SUlZiXlJuRnJeZmp+fq6ylqKKsrc/S1dLOzNPU1M/U0c7Hw9TRx83S09PXzNHRxNLWxcHOx8fCqL23zp58cWhgZV9YYlNfW1BRVFFPSD5ARkFCRTxAQT5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VVFNTlp1hoWKd2x3cH1+f6GenqGMjJiTk4uMko+VhXmFj5CNioqIkIZ+gntyfoCAh3qEdYWTkIh/b3Zya3N9e3d7c4J4cmuAc3Jpb3F6eXF6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1hkalNYXF1gY11jd3p9i4GYqaSkoZ+gp6Wqr7iqpbKhoa2ho62hp7GfiKaak5KRiZGOiIGTiWqUooyZhIGGfpGDg5OXrYuVjZWZjoaSkZ6XqLCioaGlpKnJzc/IwszR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuNdXFlYmFaVlpVXFFLR0pKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO09MRkpYcIB1fWhzeHKCiYCdlZ2UhYuViY6JiI2Gjn94g5OYioyHh4uIfoJ3c3t9god3f3qGkZV/g253cG11f3V4fXSFfHlsh3Z0bn12hHR4e521jDtBi8Wlfox8aWVXSUNmY2VjZ2pjbXdbXmZoa25oboCCh5GLnJ2gnZCXmJ6jo6Wxo6OxnqGlnaCooKOxnIWekpGRj4uNi4aDj4R/nJuMjYKEhXmUf4KplaOMkYmXkot+mIuakquzmJucqJynvsPGubbGztLR0tDM0svI1M7Q1drX19jU2djN2NvOydna0dW+ysu1enlwZ19cVFdSXVdGR0pJRUU9Ojc6QEBCOkZEP0RDQURCOz87OzdEQzc1NjU1OzA2Nzk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoSJgYd8eIWWloiOgoeFh3qEeHF6e4OFdXmFjo2ceYtwfG9ven9xe4Bxg4eAbo56dXd9fIJ0fnyGh69zWKnCto2RgnBtYj1eaHJwcXBueHaBZWhvcnV4cXqLho2TkZqVn5WHjJOaoJqeqZ+grJuhmpifpZ6fq5mLmouQko2FfYiHg4WLjqCZk4iDh35smXqEmIaIk4yNlIyGfJyJlJCuqpSWmJ+Zp6+2vamtvsfMycnMy9DJw9LK1NfZ19jX1dvX09nb1dDa2tHWyNTLlnt9a2pdXFFUVWBJQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4+Ojg3REI3NTU0NzkuNTY2NDM1NTQyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD5DR1JqXm1kYmZrdoCIcZGQmoB6gI1+goKBg36De3yEmI2Hi36FhoB3gnlue3uGgXR5kp6OoHaOdYJzdYF9c4CEb4GQgm+ShHV8gYV6doZ7ibfFpMHJuIGWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSUjpeRg4mPlpqWlqWcl5+WnpKRl6KdmauVkJCKjJGCjIWIiIGGkJGem5mIhoyBhZd6iImfl5CIjYqLgn2hiZGMvKGYk5iZnammpq6fqLa/wMG5x8rOzsXNydHW1dXZ1dfb1NbZ2tvX29rZ2M7bxoh9e2lrZ2FVWVZXTkxFTkM7PT08ODo7PTk9QDY9P0A8Pz08OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyKjZJ3dnqKe36Afn98hHp9gpGJhIV6hId7dX10bXx9hn50f5KekZ6DkXuGfniPfniKim6CmoB0mYZ+gYmEe36Qeo+pjo/Dob2LnKSdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWIipCTlI6cmZKUkJaNjJWfnJSglJGNjY+LfpCOjoqEiZKWmp6fiYyUkp2RgouApZmIhI2ChYSBpYaKjLiYnZGVlqKooZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27l7e3pua2hZYl1UUE9JRExCPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEPzczNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1DUVNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4d6fHuLhoJ9dIOFeXN6c22AfoR+d4WbopudlJJ/jIh/mIeAm5JuiKiFeqCLfJGNg4iEnH2akIqMo6KgkKSvn4uQi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5WMh4iMkpKLlJSTjouPioeWmpyPlJaQipGThoCLiJKNioqclpiiooaTnZagiomIjZuQg4iOgIOHhqSFjJGzmJ2SlJehoZ6akpyeqLK4raa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcn93amhfXllVWVlDQUlDPz4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjA6Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnptYX6Sg29td4t4eX96gXyFe3t2hYR/c3CFgnp1d3Z0hIKEfn+SpqSfpaKXip2QlJeLiqiXc4qxjYSnkoSZk4WZjKKVn5iTiJqeo5KpsJ+QlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzciWj4aHiJCSjY2Sk4mFiomFlpmaj4+Uk4aUl4N/j4uZiI2QqpaXo6OImZ6WmoiOhpaXiYSOjIF/h4+kiI6TqJqXk5eZoZmfmZOdm6OztKajvMG+x8XFycjJwsvTzc3UqdLR1tbW2NrU0trOhHWCa2ZgYF9QS1ZcQkJHQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjnx8bX6IeHp+eoGBgn52doCCe2xui355fHd4fISGin6Lo7SopKqzoZanoKWklpWvooOQuJWSs5qNoaCMpJuvoqSdmJCnl6mZrbCkl5SVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinJiFiIiOlIyKk4+HgIaHiJOYlIyKk5OGlJiGhJGQnHSQmLKVlqShiJyZk4+KkIqWmomKlo2GfYyYn4qQkJyamZOZmKCUoZ2Vn5uhsa2jpLe+s8XHxL3Dw7/GzsrJ0qfOzNPR0NbY0s/YvHV8eF9iV2JYUklLT0VCQ0Q1Pjs3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/Pzc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpJRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVxcWUpoYTtIhIt6em2Fhnl8hHiAhYF9cHh8fXxvc416fYF7eIaLiYaEkqi8ramyvbClrrOzqaOisK2KmrWdorilla2kl6mtt6ako5+ZqZiqpK+xqpqZnJSVkZigl5q7u63KoWm2t6qwlZieoquSl72kXqqygomKjJSHkHyOjn2Dho6QlJSIh5KWi4+VjYuMl5mSnJm0lpWrnouclJKNkJKLmJqKkp2Pi4mWoKKNlY2XmZ2TnJielKGglJydpq6ooqSzuKvCyMS2ur28xcjIwtChxsnNzcTX1tDK06NzfWtfW1VhU1FHRD48Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFFQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBmSGFgYnBKQIuJf4Byhod8gYl1goqDfm19fHx+cHeHd42Bh3uNkIyGjJqrwsCwvca8s7TBvLSsq7O2jKiyra29q5u7o6itubirpqaioqSjqq+ysaqdnKSYm5iYnqKmpZOjua+ov7ysrbK5paOnfYiGnK29sIKLi4qQg4+DkY56gYeQjY6ciIiPl42KlJeUkJqWnKeasJqRq52Omo+SjpaRj5WXjpGgkIiUm6SslJaPlJyelKGem5igoJWanqenpKKksLOmwMbDsLC7tsXFw7/Np8fDx8O81dDMxMqKdnZkX1xiXU9MQ0xARUc+QT9CPDo0PkE9PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0I1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUpITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaEZfaWdbXVyTjIyIe4eLhoOMdYaQioFufnuBfnF+gXqUepKUlJiRk5WotMfJwMLMwsO5x7y6r6u5u5eytrqywK+lwKOrsLy8qq6ro6Kep6yvtbGpm6CqnKKclp+wtKeMo7q6tcG7q6icsqSkqJSEjqnExKSCi46GiISGlZSMeoOMkY+RoYyMlJGPiJegmJOZlJaloK6cjKqcjpaPkpGVlY2QlJGPoZOGl5+gsp+Um5SgoZmkoJqgm6CUmJ6npKanpK+tpb/Dwq6ot7XJw762zrLEvsO7s9HJx8G1d3tvXltebFROSURNS0tKQEE9QkQ8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmo2WiouIko+GiXmGk5CBcoB7jH93h4KCj3mNoZaompqYu77JyMrC0snKws29wbOtvL+nur+9vMS4rcGprLO8vaqwqqSlo6yutK62taCfrp+mopmjtL2pnKi8waO2tq+rk7CsqqyWhpqqp6WRgoySpJWJgHWJkXmFjZGQnp+Sj5SLj4yUo5mXm5STop6pn5GlmoyPj5CVloh8jpWSkqOalaCinLWmkKCXpaSjpZ+eppielZecpaOoqKKyrKi7wMSvpbO3zMC6rsOzu73Bua3CwsK/mXB7Y1tZXl1NTU5LR0RDSEJBQURLOjRESDo7NDw3Ri4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxJX1hhWmRlWJ6PnY6Xjp6SiYp/iJ+ShHiFf5R+f5CIiZCAlqGarqejmMO+ycTIxtPNzs3LvMK3sLq9tL3Lu8PBtre8rbTAubyur6ihqai2rq6psreanqyiqKKdq7e3qqWvvsSxvbmzp6q0s62tlpWlraigkY6SscWnlY19kZV9h5GYj6qZl5OTjpOVk6Wdk52Zk6CioZyYn5iLjI+QnohakJaXkpakmWaZo56zpZailqytrKecn6eXmJaYlqGjqKaftaupurvDtKa0tcvBuKq2rLO7uK6ouLq8t4RvcFxaVldQR0xUTks/QUhEREhGRjg1Rk07Pjc+QUsuMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmZkTUamlJyWoZeoloyQg4elkoiBh4Kbg4OVkJCUjpqin6++rqHHvsbFyMfOzs/Syr67trG7u7y/z7XEvbe5t7OytrO4s6ynnKuruaupqK+vl6OupaikpbXBsKuttL7CucC5s6e4tLeyr5WkrbCvpYuTlKCNc8GZfZeZhI6WmYuxlZqZlZKSmZmlo5Wfm5aaqJyboaCZioyPlp1gSpacmpWZpZdUlrCfr5yfpZWvr62mm6GmlJOZmY6dn6ahmbSpqrO8vLursLLHwLimrKutsbGjobKytKVzcWdeXFBTTUZRUVBRO0hLSEZHQUM9OUtUP0E6PUVNLzc1MzQ6QjM0TldOPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs1RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3RiVkZIq5eZn6GorpiQl4eKp5aNiJKFn4eEnJeOnqCao6S1ybSpx7zDxMnLycjMzsa+urOvurjAwc21yLrBubW6sq+vs7SnpJyqtLWrqqetrJmkrqalqay6wKirt7e+wcC+t7Kyw7C3vayjrrWtuqaIm5elmnW+n4SYnY6SmJqLrpahnJuXlJqfoKmep6CZmqqZoaeel5CNkZ2DbXWTopqVnKKfkK2yoquVqaqYqq+mpaGlqpOSmZyJlZyinpawp6mqure+s7Kuvrm2oKOnqKWmnJytqamNZmhjYFNNTUdJT0pVTD1NRU1JSkBDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0M6OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FNVkh+ZV5IRqyUnKGfu66YlJ6Lk6qbkZGTiKqMhqGejKOslKOktse9tMK7w8LIycXCzsjCvbmyr7m1wMPKtsaxwby1u6ypraywo6OZqrS7pqqnrKqdqK+opKurvryorby0t77GvLa1uMCwvb+zqbW3rL+lj6KXkKGfvJ6JmqCZl52dj7efqZylo5qcoZqnpLOhm52lnKepnZiUj5Sbi5aJjKSilJyjn6C1sKWmk7Grmqutn5+lpKqSlpWghJCen5yWqaShobS1uratqLWysp6coqaal5WZq6GeeGNfYV9MSUZITlFJTkVGR0JRSkhAREdBVlNESDxBR1ExO0I3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6Sen8Osm5ekl5mom5Wamo6qlpWoppWtrJmiq7fFwry/t8HCwMjEv83Gu765srC5tL7DyLW/sLy2urenpKurraGhm6uqxKKlqKymnquvrKKqqL64pq2+sLe3xre0uLi+sb7AtrSyta++o5ajlZOak62fkKGhpKKjnpC+pKmdqaydnaGbpp+9opijnqKpq6CdlY2VnpOeh46EjZOepKCdtqymnJayppmwqKCcq5+hjZqVn4SOoZqckqWkmpirsbWxqqWqraybmKChko6QlqmflGllXGJeUEpIS09MSEVESUA9T0hAO0ZJSFtST0s9SE5VNEJGOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0tME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hOo5ujm57Fq6Ceq52crZ+Rop6WpJ+mqquXtrGjqbO2xcK9wLbAwrzJwr/KyLa4tbSxtLS3wsa3vrG4tLq2oKesqquenp+lpMGloaqtoKSprbCip6i9taWxu7e2tcOysre6vrLDwLi4rbS0taOdpJSRk6Csn5ihnaioqqKawqyonaytm5uemKagvaGdpJirq6ymoZmNmp+SnoiOWH+Wn6ahoLmqp5SYtqOes6KhnLGYoI+alZ6Cj6CXlo6io5WQpa6zq6mioqWklZWcmYuPkpOkn4ljZ1xlYU1KS0tPRkVBR0s+PUlBOTlKSk5dUVFJPUxWXDhGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMUJ+goJiew6ekorOgnLKnkqqjn6Oeramsnbuxqay1scjDwcOzwsO+x8S9xMq9sLG2rrG1sMDFtbqxsLq2rZqpsKmpm56moafCrZytsZyqoq6xqqSovbemtru9r7fDrbOzwr+yxrO6t6u0tq2qoqaVlZSiq6Gfn5mnq6+vr7uypZ+pqZmZl5OipLigoaOSrq+rpKWekaGelJ2OkI2UnZqjn6i1p6eNmLSco6+boJywkaGUmJWbgJKilo+OoKCTi6assKWnop2gnpKSmpSFi5KNnJ+AZGhdaGZLSkxLU0FDQElHOztGPjg5Tk1VX1JTSj5PXl09SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZ3JAODxIlndlQTSfpJ+boMKno6mxoKO0qZWxq6aipLKsram7sq2wtbTGv8TEtr/EvsrFtsDJwrWstamwuazAxLS3r622uqWZq7Ksqpihp5itu7ScqLCbrZ+utbKnqruzp7mzuLK4wKq3ssO9tMWnvq6tt7Wpp6yhlpaRpaShoZeXpK63rbG0tp+fqaSZk5STo6C3o6Slla6xsaWppaGem5malZeooJ+Zop+vs6OmjJevmqWrl5ufp5Odj5WZmoaWoJWMkJ2elIupqaqip6GanpaMj5mQgYaViJWfemVqXWxrTlFOTlQ9Q0FOQzs6ST83N1FOXV9SVlFBV2BcQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFpVkNXRox5ZkM7pKScoaW/pqiurqCptaqdt6+ro6q0trGwuLewt7i3xL3Dx728w8LHwbrBxsG6qralrbutwcO3t6qtsryjla2xrbKXpqiRqrmqoaewnaugr7Szqqq3tay7rLOyubesuLDBur2/psOqsLauqaurpp2YmKqhoaCRl6Cwr7OrsLmZm6mfmZaSl6agt6mloqKvsbOrsaeroJygn5uepZ2hmJ2ktLCcn5CTppqhqZuWo6GYmouWmZSWl52UiZKbmZSOqamnoKOcmZuTh4+Zi36Ml4aPm2xpbWJublhRUVpUQUNEVUA7O0hANzpYUGReUFdXRFleXk5MU05fTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhsfWhcVjqJe2NDPaifnKGpvKCqr6qjsbeppbSyq6Gttb2vs7i8u723tsDCv8nEucTDwMC5xb3BuK+2qKu3sry/v7SqrrK4n5esraiumKipjqe7n6Wts56rorGws6yqtrO1vK2wsbWssLWywLrFtqu8r7G3rK2qo7GlnqSonqOWj5ifsqqzqaqzmZ2nm5qUjaCmpLSup6GsrK2xp7Orsamjm56opJ6VoZmcqLapmJqSkZ6ZnqGfkq2gmpqHl5mMnZqdlIuPl5eal6emo6Cel5aWlIGQlYV7j5ODjJdnbXJocXNgR1lmVkRDTVhEWjlIQjU+XVFoXE5aXUdbXl1PTVNYZEpLQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVjE1MT1gVl84KUMzWVVcZ0s1jHpmTEClmZ+kq7ajq6ilrq21qa6zuKansLfGtrC3v8HCtrS6xb7MxbnDwbrAusS4wbqztayquri7ur61q6+xt5mYqKurrJyuq4+rvp6rr7Gjqp+xrbOurraxuLaqra6xp7Wws7q8ybKqtbWxtLCupqCzoJqorKCklZWambGiraClr5aipJqZkoyipaeyqaGmsayqtaSusLSvo5mdraebl56amay4opeTkY+YnKGZmJWuoZ+WgpWZjp6cmpeRi5STnpmlo6OhmZeTkpZ7jJGFe42Lg4yTbG55b3Z9YkZgalpJSFpbPXtKR0U2QWJVaVtNXGFKXFxaUlNTYmFMS0VgYWBQTUlQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NZVExFmpafsKixqayko66ttai3s7ejrLS3ybq0u7vAvrSzt8PAzMe7xL23v8DAuMC9sr2uqLq5uLfCt6yusrqWl6evrKiks6mUr7ukrLKypqejsrSxsrG1sLeyqa6rsqa4r7WzxMW2qbW1q7Cuqaeitp6fprCgo5SbmZSwnqebn6mNqaKdm5WXpaWkt6eisLOrp7Gnra+1rKSZoKyonJydnJSquZyVj4+MmJ2jmJGYqKSgmIWTl5GdnJiXloiXj5ebqJ2loZKWkpCWd4SRhnyGgoSNjW5xeHZ8gFxMZWxcSk9kXT9ie0dJOEdnV2ZbTF5iTFlZV1VYVWldT1BIYV5fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhnMjcnRmFMViUtQi49RUxRPDNya0xFRJGZpK2krK2qpqOwsrKqt7C1n6u1ucm4rsG8w7ezsbXCw8/EwMK+tb7BwLu/vLTEqKq5sba3wLyvrLS0nqGnsa6lprGlnrK1rKqysauoqLW6rLWytauzrKqrqKypua2ysMe/uKW5sKmtraanrbClpKOuo6ibnZuar5mioqKjkKyfo6Cfoammpbikq7S0pKqrqKyutq6inaOoq5ygmZuSpLWaj4mOiJGjoZaPlp+ilpWGkJWUnpuZlpWHmJKVmaecoKCNk5KOkXh+joR9fX2HiopydHN/fn5cU2NuXk5aZ11GRJZbRzpObVhiWk1hYk5WVlZXVVloXlFTTWNaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZDs2KkhkSEorOkk/M0NJUyw+j2xASEmQmqipoamvpKejs7SwtLSwsKCrrb3Muq7BvMextK2zwcPRxMa/wbK+w8K8v7i9xaitt6y0uLzAsayyrqGjp66qqKWxo6qwqq6rsa6urKuzu6e3sLKpsqmqpqWjrbqtq7DCubSsuampqK2pp7GlqaSirqqooZ6bo6yVpZ2YnpmrnaGnqKGspqOtrLawsaCpop+qrbCrnZ6np6mao5iZkKComIaDj4uLn6CQjI6XnpKRiIiSlqGdlpmWhpeTlJelnJ6djJKQjop/f4iEfXeAh4WHdXRyiXdsX1lgbmNRc3FcSzuEfEY/V3VYYFlPY1xNVVZVV1FcYl9TT09oWVdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0zOTc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5KZ0RGODxCMDVFS1gxQJRdQE5GlZasp6CpsZuoqLC1rLi1ramkq6q9ybyxvrjDr7Css8PEzs7Dv8C0wMTEusG1ycSsr7eus7rAvrSurqymqKqxqaapsqa0raqvra2xrrKttLuluLOsrK2nq6CjnrC3rKqtubaktbWkqqesrKqtoKimp7GxpKaloaGrlqqhk5ugpZ6jo6qjrKKeprG2rKyipaOaqautqZ2hpaSkmaCZlo+YnZOBgpCJhZ2gjYuQjZuQko2Fjpmlm5ORm4yTkpKUo5qcmouPi4x8h4GCgnt1gYSBfnV3i6OHeGpeYG5mV2aHZE5AZ5JMRWJ6V2JYUmVVTVZWVVRPXF1hVkxPaldWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjs6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESHQklJRJaQrqShqa+Yqaittaq1sKqkq6qpvMDAubm0vLWmsq/DycvRv8G7ucDAwrrBusLErrG1srS8wb6zsa+trKynt6qlrbCruK6osK+usau1qra1p7W3rKykqaqcpJ6zs6mopLO0n7Wtoaqoq6irp5+rq6i5tqmqqqmhqZ+tm5GqoZ2go6OmoqqenKa0rqelqaKkl6Smp6qcoqSjoJmYn5GOj5mNfoeMh4WenomFjIuQj5KOhYiXo5qOjZuRkpCPkp+YmZeNi4SAdIeBf354dYOAenh+f4idj3BxZmdxeFxhdIhqT12YVkhteVVkVlJiT0xVVVVRT1hbYlZJUWpUVlRHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMjM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMkBmPU5YP0MsP0xUXy9JazdSRjuVja+gpamsmaqjra6ytK+qpK+pqLu/vMGysLmtoravyMfI0cC/vbq8w767xMHAv6+ys7O2vbzBsrK0q7Sppbappa2zsrivoq21sa+xuau5rqqut6uqnqqroKOhta2poZ+usqG0qp6op6ujqqGhrK2ova6rrq2hp6ifrJmPsKGYoqCop56nm5ipsKmin6yioZKhoqOnmJqpppiYmZ2Pi4eViHyNhoSFpJaGg4OMh5CQkoWHlaCWiZGdkZOQjZGclZiPi4aGeHSBf310eHqAe3R0e2qCiKR2aV5lbIF1Z4iLfFJWcF5LeHNUZFNRX01NU1pmTk1XWWVZR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUMzj46woKSlqqKlo6ymtLOxqKSwp6q4v8G9sam6qqetsMnGyNDDvsC9ub/Avcm8wrixsLWyury5wLO1vK25rKO1pqessba4sqanubWttLyvvKWtrbWrrZypr6SfpKyqqJydqrKks6iaqqeqpKmdoqmnqb2rs7CunamkoK+cmrOilqWbpaSfpZqZqKqlnpqpoZuRm6CknZmXqaqRmZqSkIuCj4V9j4OAiJ6Ph4B+jIiSkJGFgpSak4aToo2UkYuRm5OWh4p/gHJ6eX58aHZ8e3VxcX5qhnqFiGRfaGNyhXttZ3ldXlZCV3ttVGFQUllLTE5wdF1JWltoWUZWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6SsJmfn6mkoqGrpLaysaSpsKatucK9t7CkuaypqLDCyMnMwre9v7W4wbrItsO1tLO1sr25ur22rrm2v62is6aqq660t7SpnLm7qLG+srqgrrS2qauerbGjnKWoqaOdm6Swpq+hn6qpp6KqnKOooK28p66xrqGqoqSunp6sppifmqGim5+bmaOqopqZo6OVlpSfoZaclqasjJ+Sj5GMgoqAgI+Be5qUjIl9f4yHkZCNioaSl5GHlKOKkpGHkJmQlIGIfXpsfXZ5eGJ6enJwcXN4aoJ1a4JnY2dhbnOObWJqb19wQV15a1ZeTlFRS0lNU1lWTVxebFdFWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPiORlquYn5enoqGfqKS3r62ir6+orLjDurSuoLmvq6ezusfKx7+4wr2vtL+3xLbDsrC6sbLAtru9t6q6uL6qpLWnqKqvrbiwqJi4vKOtvrS0oa23taamqLCzoJ6lpaehpJmerKeonqCqr6egppeiqJ+wuJ+jsa+hq6GspJynpqiam5ufopWcm5qdqaaWm56okZiSmZ2TmZahqpGbio6Qh32Hf4KOfHyhjIyJeoSNhYuOjYWJk5qOiZWfiZCVgoyXjZF8hXx0cHxxc3RgeHhqb3FxcGt/c2R6bGhlZGFmh4BgW3Jqck1OgGlYWk1RTEtIUFJQR01bX29URVlaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrJ+eoaSht6uwo7Szqam6xbezrqG4ra2rr7XFx8C3v8K5sLW9t7+7vrCsvrCzv7K8wriqu7q4p6i1qKerr6uyr6SYu7akq7q1r56xuK+ppaevspyhpKCko6CWm6+moZ+iqK+hoKKTo6SitrChprGrn6yjrpidqqWon5ianaOTmpuanaWqmpubpZWUl5WcjpOXoqmikYqLkIZ6g36Ei3mPl4qNh3qCiISJjY+Fj5OYjI6WmYuPln6Gl4yPeoF7cHJ2bm9zX3h3ZWxsbGpqhW9mcmlrZmheZHOBYFtrdmlaSn9eXFhPT0tISFJVRzM5XV5sUEVZVVllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyZFcsMpShoZeUm6qco6GiobeqraC7t6WsvcW0sa+jta+srK60w8O8s7+6t7Gzubi6uLqvrsCzs7ivv8C3rb26taaisqmnqbGqrbGgmb+1pKe0taiesrypqKWpsKyZoqecpKWUl6CypJmeo6ipnKKfkqSgpLippKeupp6loaiToKmioaGZm52fkZmblp+hqpuamKCUkZSWmY2Uk6SopJCJio+GeYR7hIZ9nY2Jiod6gYSHiIqShZaTk4uQlpSOjZR7g5iPi3d+fGx0cmxsc2F3dWhoamdncIdoaGljZmpqYGtjamhbZntjYFN0VFxbUkxKRklPU0AhKmheaUxEV1VeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKeoqSRjqSmmp2enaO0raequranrMTBuLCso7aup62utsC/vLLCtrCusra1uLa2raq9s66ysby/t6+8u7Gln7aqpaWzp6mtnZzAq6elr7OqrLW7nqiqq7GlmJ6qnaakkZilrKKYnqSpoZyinJafnae1prCqrqGhnZ6hlaCmn6GgmpuZm5KYnZOlnayhl5adlJONlZeLj5ibqZ+SiIqLiHiFdoGCgZ2HioKKfX+FiIeGkYSWlJCOj5GRkYyTe4OVj4Zzfn5meW9ramtmdXNrY2dkZHaBYmVmZmZqamNrcltfWV5tZGFOaVhaYFZKR0hLTVJYPjlfbGhIQ1VUXVtJSUdFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsrLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxZSlZiZkA6M0JoSCU1mqOgj4ytoZeXoJaks7Gisr22obHGvLqxsaO3rKqtqbi8u7qtwLKurq62rrK4s6mrubGvrrO2uravuL2spp61qZ+fr6Oprpyhv6Cwo66xr7eutZ6tr62uopmdp6mln5Wap6WfmaSiqJ2an5qUnJ6sr6a6qK6ioZqbnpmepJqknZeel5uTmJ+SqJWqp5qTmpqSjJWZjpSUmqmmjo2KiY57gXOBgYqYhYd8iYmFhYqMiZKElJuTko+QkZeOkH+AjY6Db4F/ZnltaGtpZnFya1xoY2N0gWJmZ2pubGdramhuXWxsc3BgVGNpY2ZZSUZMTU9YUVFVYWWAVUFXU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMmNJGhm42PsJ2Zk6GaqbGvn7m/taC0wru9urGmt6+nraS3t7a3rbuurKqrtqmzt66msrWyrqmwtraws7a6pqmftaicnaigqKyap72YrKSur7a1rK2fsa2wqaKbnKOrqJyUnKeknZqpoqSWmp+bkJukqquqvJ+npKCYmpmdoY9ropaZnHCClZqjf3WRqaeelJSekIiYmoCWiqGQeYeUjINtaX52g3FshouGfYWMh3BeY2FnhJiFa4uOlJJ0d4uEfoOQgGeHgGd1aGVXXGhzbU5QamNnc4VoX2Vmbm1qXl9hio+DhGVOS0Q5R1RoXkpHUVBUVUxIUmBvdGVGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCswOD1HNzAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6LpJmGlbCbm5Ogm6qtqqO9xa+pt8K3vb2tprewpaqitrOxsrG5rKmmrLSlr7Siqbe2tqinrLayrrSts6Gpn7OqnqCjm6Wml6u5lKWlr7O3ra6lqa6rrKWhnpyhp6abl6ClpZubp6adk56fmJCeqKmktrCko6KdlpiXl6OIoY6Smoagh5OcoH+lf6WqnpKSmpGIhHN4jY6FiKF2iIxpl4hmfXN4oG+Ih4N+jnx/oaCgmYB8h550h451m4psh4GDbWllY3pscmFThW1ibGmYcVhpcXCIWF5pW2xsW4hybnpyhWeGhFpfR04/R19NRVJWVlFRU1dUZ11NVkhSUk9GR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oiqeXg5yrnJiYnZ+pqaeqv8Ovsbq8tsC/qqW3r6mspLK0rq6ztqqopbCtpbSym621trWmp6iysKyyp62dqqCxp5+iopmgoZqss5SjpaW2vaatp6uqrKimoaCYoKajmZmlo6SYnKSplpSinJOTo6WmobekpKCjmJWTl5KciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZGEfJCQkcpyl7ycxXpytaa7kHuAbZaxq7B5aGxYsa5uZWm9krxuZ3pvco/YflNrY7ayf4FylHOaoaqQV09XYk9WTkZVW1hRUFKMXFdbUEFcRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+OkI8P0E4Oko+NTIqMjJCRS8uMzIuKy8oLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYynk4Gnqp+XnJ6lrLKosMK+srW/tba+wauns6ysqaaus6mutrOnp6a0pae3rZyzsrarpaSnsa2ssKaqnaajsKKhn52Wmp6crauTnaKftLqjqqmira6loZ2amqKnn5ebp6CfmJ6np5GcppqTnaGmoqGxo5+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHGuoaR+eLt9a6GPdrFfarRbpYBlnJFgZoJ7Zn9qeGupZb5yZ6aMdbFqfLF4dJKUY25tp25bhKFFaGaHlkV1nGB+Z3ykp4JaX4yraICVeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TolPV1cvSVRTSkNGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWDraelnqOkqrG3rLW9v7C2xLK3usGmqbCqrqior66isLqvo6StsqOouKees7Owo6Wgqayvq6+mp56joa+bopqWlZaZmqullZqhn7Szoquco62toJ6alqCiqJyYnaOfm5mhpqSPnKKZl6Cfqp6mpqCan6GWlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR+a4Kme4KGiJKUknerZ2uxXKt6jYaUdIlyj4aAf4iQl3iCgouYi4Ogj4SwdnefcWxsbHyLTqRYSGJimX5jaKZgeXJ1U5OHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVdYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOWFVNTAblaCViLOmpqGvqaezrKm7tsKwu8GtuLe/qaytra2mrbGpoK67qqCntKyjq7SkprKzp6Oinqeqsaewp6Wen5+ulZ6ZlJWVl52roJmZpKi1r6Kpj6moqpudlZegpaianpyinpufo6WjlZuel5mcoqmbppmcm6Kgl5ORk5Ocg9WTmblwsMF+xYZ81pSbu3yalaWPjZ2NpHuOh6SCpYJ6rHmPnVaveoh+n2q5Wrl2hoN9poKTfJh6qniNnY96sW6OhHSRvIVvlFCvp8WKUaB6Y2CpYnNyiG2XiGBTtbTIhoCJfGOkM0Kddl1QamljUEBYZ1pkYUpITW5OXFFPWWZZQ0Q/RT8wPTw1OTs3NDw8OD06PEM6Rjo6PzY6QEM7NkBPTEg8OjtESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUDcxJZuilJmyqKimtKqltKmkvLfBsLm/sbW0urK0p7GvorCypp+ttaeap7mtoq+wn7O0sKGknp+mqbCotKijm52dqpWYlpWWlJagqJyZlqitsKmjno+toqiWnZeboKWhmKGhoaGaoaKnm56gnpSYmqagm6eVm5ufoZiQkpSQnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaJ/kaGlfrB2g5HS0nZcrnuFf6Rvm6qma4aEfK19l5mOe7Bykp2OeLNll3SEnm+eZpRRyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBT2tgbGhQVkdJOT1VUlpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YUw2MjCinZOlsKyjq7ytprSmp7a7vLK6vra2tLm4sqW0s6CxsaKeq6+kl6a5raSxsJu0uKqgpZ2hqaSxp6ypo5mcmaedlZOXl5GRoaaflZKlq7CmopaTraClkpSgm6Smn5WapaahmqOfrZmgnp6QlZuhnZyllZ2VmqKflZiVkZuFrHt3qHajjYiGqW+tioKng5iYoYmSmouif5Oaia6Ff4KzXHKzUq59goKkf3HXfXiFfo6dhZqadq+GiZGch3e0YZplmoKClW2SWrBYS5p1mHlmYK1edneIaJiIbF2vd5Wej3hsNXnIrrJfQlRvXmdgRVBsYHBtVlZNLmZkaVNZUDtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BIOjk5oJ6VoLmwl7TCraizqKmyurezt765t7G0urSkt7Kfs6yfnqirn5Sntauor7GqrbSkm6mgn6ehtaamqaKYnZSkoJOSm5iRlKGkmpKQpq2vpqCVmamgoo+RoZmopKCVmaWonZyknq2doZ2gjZOemp2hmJmblpeioJSXkKadhql9faV4oY6NgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02H92h3OogY6bjZKkfJaQn4R7sl6dZKB+g5VtklyrW1qTgJF/aGeqZHJ7gWuYh3Neq1qJoI5rb2VPSkOhXFtMdF1iZ05bYV9yc19LVjdKm5RYR0U9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA1Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKKemprAq5i0wq6rramltLC3sLW+ubmxsLW6qLq0n6+knaSnp56TqbCpr6m1q6quoZign6ako7mio6uglpuQoZ+Uk56Zk5een4+Mi6iwsKedl5uopp+MkqSXqKqnlJepp56eoKKtpKGeooyUoZifoJKel5yVnqGVlo6rnI+ubXK0c6mLdYqnc7R4c7OAkaSjkpyOiaSHkHe4b4x7i6Jqa7ZaoYVll5dpoaKnbZNytHSTmH+yaoWSiK1qdbNhnWaib4eTa5dcrV9NoXyHkVJzo2x5f35vmIdyXa9WPJx3ZlRvbi5cp09jU2tlYm1aY11hcHtjVFpSPj5tbzNDQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimnJufvKGbssCurausp7ept6+1v7S7r663tqrAtaipoJqlo6Gckaqpp7WisqeuqaCXm6efpKu4naKsmpWZjqOilYycoJuYnJ+Rk5SqtrComZSbrKqXjJSlmKWsopGWqrKjn56mq7GZoaOPmKKWn5uWnJahk52pnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyXi4yniHqktnV9d3bCgpqyYIO6ecB8dbhjtYKMh6l8lYGsqXF7f3S8iKegaZ1hpo6voX6MdIeqfb5vc7x0soN1eIGKbpqIcm6NpHS9Xnd9WmF5vGtaVlxqeV5qYWVnY214b1pcWUNBQHNAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueor2hl7LDsK2qq6yxp7evtsSwuLCtua6twLCro6Geo6Gcm5Cpo6qypLSlrKWelZmqmKasuJyirZeUn4+kn5KMnKKdl52akZWSr7myrJaYpKinlJCWpJykrZ6RoKirn5ufqKOzn6OljqeilKKanJiVo5iQr6CSlKmehJCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0n8G7vZp7gbGocYBzkbmDfIaGjIeNfIqHjJd8pLu5vZx1erSjdHeXdnSwdZmeZoZqjbV0cnF3toxef3p9iWiDeW56Y4uscHWFf1hbp2pFZVpUZmBjXmNRZ2dwbHVDTlBNRDpaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJTWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZVJz47PKeeoKK/pZa0w7Ssq6isq6m6rrDFrbOyrbWms7irqaGhpZ6gnZmTq6SsqaW1p6efm5Wgo52rpL2moamWk5uQoZqRj6GnoZOcl5OXlLG1t62ZnqSkoouSkqabpaqblamkpZyaoailp6SpoZGtn5aknpeXl52ej6+olJumoY1qfWmbpniHcn2ZjnR5ZId7vb7Aum+Tg3KWiGByalpem4lgY4iPlWtggJVjbZ13YpVsgJqVlGVeYGNxmoppcot9hpVna39ydXh9fmJbd3SBaFBcboN9e4trWGt6gnNKSm+GcE50TUVYXWdhTFtYZ2NfT1ttdWlxUlFERU07R0k9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz5bTyc/Mj6poKiiwqObtbq2o6ylrqentbGsyKuvsqqzor2wsaafoqedo5uZmaumrqOktKikm5eUoJumrai9p6iklJOalZ+ZkpekqKiQnZGQmJywsr+snKeep6KJk5Gpmqijm5qroKOZm6OnrKOgq6OasJuVp6CWlJ2fnZewpZihp5mbkJycoqOYpaGZm5mZmY+VgWdtfXF3kpiUkoWLtaqNhpiVjoqMmJaHlJWKhJOUkYmOk5SYlJiWmqChmpyUoZ2OgnqlhW1rfZF8gHWKioFxgnh5dnaKgHyKa3OBdIN1ZXd9d2tvem1gY11waE1ZWmZqYFdab3ltbWZUUEZTOU9aTVFPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEosPC1As6CzosChpLKytqCppbKnpbC0qsiqrK+ktKXAprOgnaSknKOVlZ+qpqyio7arn5iWlZ+WramlwJ6ro5SRm5edl5KToZ6eoqeSkpmop7LEsJurnaufkJaWp52qm5yfrJihm5yipK+noqWon66Yl6edmZmgnp2cr6CcoaaVl5KXk5+glaKdl6COlpOKio2Ol66QfJacg5KCi6qphYCZl4mEkJ6IeoSQh4aakoiGipaPm5eNkZidpJaak5GdjX+OZ6Gzr4WKhHZ7kop9d3l6b2Z5kIGAiWt1gXqIc2lzf3t2g4eCa3VkeWZgamZjZGZrWWx7b2lrXVNMUEReVEVAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYmNhX11eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFtHNTwsQLSgua+/rKuusrGgqqayraKss6/Er6mqorGtvKKzm5+moqGcmJenpamlpKWytZ2Uk52Zma+lrb6gq6KQkZ2ZmJSQlKGcl6ichJ6qq6O0yLSgqqSrl5aXmaWdqZqeo6uUnp+eoKmvqqakq6Kum5+goJiknpyfnK+jmJ6nkpeWnJGjmJennJqXZYKSfGV+jZqQY3mObWhre5Kkqmplm5h9Z4aKZWVpaHuOoY9rZ42YkaN3a2qLmaOfmHNsbnqEjoh6WGZehoNebYuJgXZcaHN3dpKAiIJueIJ4gHNteYR0domIj4N8a4dZXmx0ZF5ziWlrfHFrZF9STlhJZFhBSjQ+Rzc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2ln7q8uq+stLGqpaitrrCmra2wvLCopqOtrrCerJafo52hmZmmqpyso6WnqLKtnpSjj6Kvpba5pa6ijo6aoZmTkpqgmZmklXulraKotMS4paKnr5+dlJ2hnqOboqmokp+hnqCpsKurpKugqpynn6egrJahm6WwpJebqZWgnZqRo5adqZedfb2DiHK0coSdhq1oeLnEuHGToqN6ppmZcquCfMvAwLtxjKOIgp99l5mJncC9gpedno2dwsF8gnyTjZrDwH1spbJvjIFvynp/m3eRg46BdnmBgHlxen+HcHeFjJN5bniUY2dgeGRgZYJjXnRnbGRkWUxWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19hX15eXl5fX19eXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVkFCOy84lqO5w7WwsMCpqJSjr6iwrq2msrOuqaSlpq+rn6qYmqKfnJqqp6Kdq6KkqKSktKOcopKmrau3s6euopGRmZylkpGfoZebn52IpqykrK3AwLGhqa+pl5GenKKZoaOqo5Ohop2drK6qraekpKehpqWdrKiRo5qoramanKibq6CVlaSVoKKWnH7OlHh6pIF5lZabX66PXo6ngaKgfKeWm3Org4CvXmOMqnuoh4WgdZiTiLNjgquGoY6Ns2qEr3V9l4i3YYOtWqPNbpB2e9p7f5lwfoeSdn5le4h2dmt8h259hpGRfm2DkGFybXBoYGB5ZFxxaGpkZ2BSVFNXXUtPQzVBSEREOD42O0A/QTs9OEA+Pj9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qnrbOrprKrq6qjqqavqZ+mm5mkl5yir5+gn6inoqWgn7Csmp2Vp66ssKqoq5+UkZqfpJKPnqSXnaejn62lq7CowMezqKmxrpaSnJqhl5+pqZ+VoZ+dnKyuqKyqnKiopKKrkqyylqWiqqqdoqWkoK6fkZimmZ+Zk5OQl6BxhYyXdYWohnGxfZ5yrH6in4Glj552q4J9rX+ccq1+q4eGn3aZknt8l36qiKKMkoydfqt7iZSQn4B7rVedxXuPcJPBfYGVbXVvjG1ldmWGb2F3bnJviYqSj4Nuk5FmcHV1cWFnbWVfb2lpbmdkWFNdYVlSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzV0BGIRxHOkMxLiuw08bGsrSgnaOOo6KirK+2rqixpqiqpq2rq6aho52ZoZWfpaufoaWfqKiinp2wrJealqinrqunpqeel5SZo6GRlKCsmp2mo6+spKy1qrrOsq2mrqyXlJucopmerqycl6Canp+osaqrq5utq6Wjq5qusaGoq66lmKSpqKivoZGVoqOZk5GEpGqkdYl6qXR6snCCpoqZjHGJoJuHpGBgUquFf66Dm3atgaeGhZ96mZeGe2aAo4mkmYaCo32pfoKWh65ffKlWnqOSgXqjn4B7w6/Fi3Kvs7O5cmKpr8J0aIyMmI6CbpyVcW96eHlwbWdlZXJwZnxpY11XYGpYWVVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5hYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1L+hmaunoK+inrC0sK6prKKnpqiqq6mkpZ+bpJ6dpaeno5yrmqKsoaOfr6GcmpKro7WvrqCnmp2Vk6aikJqip5+fpZyxpaSosa23yLK1qqyplpKcm6KZn6WznZqhlJ2fpqytpLCbraqjo6qhs62hqrOxoZqop62utKGRlKKml5qRfKlsnoSHdat5fLBvgqWMiZ+WlqCVgdK4tLjJgYGyX2CUqYOkiYegepiWmniqyXSapJWoqZGTmo2BnIqaxsZ5Z6GCpXSBn46Cfa9dcLRisHVLo4dtp0eCk2SPkJ6RfHGZlYFxfHV+fG5cZmpzcWaBa15hWWRtXF9ZSU1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraylopyyuKyqoaWaqKSqq6qmn6almKqjn66rnaWgrJqeqaWcp7aeopeTqKq1sqybpZyglI+lrJGZnKejn6mnrqGlp6mwtcOys6qtqJOKl5ylm6Gjr6WXoZWZnKWmrZyxnq6opp+so7esobK4r52arqaxsrGjk5amopmejoKdTniagX+feoSjfYOkhYemn52flIS4e3t5uYJ/zMbCtniboZCLn36alpeKdp6YiqWYpKl/sIWdhqCErH2alWOmbaRwj4WQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+lJOMdntzhoBxXG5ueHJqgW9bZF9pbmJkXkxMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19dWlpaWFVTT0hAODgyLiwqLisqJyc/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6Sruaqun5uhrLKzpZ6glaWtra6qp5ymppqjp6GzrqKpprKgmKmklKO2oqKVl6GptLijm6GcopKPobGZnpumpaChr66cpaiitrLFsa2pramRh5CcqJyipJyll56YmpqmpKubsKKupKaYr6S7rKG2tq2dnLSxt6+xpZecrqCjnIWP0bXDt3mHjoWRk5CApnmUoXeMoJKEpYGKcaqGhbRucmqZo5yVip58mJmGh49zr4KmnKOOpouTnYuWkJtucbJdpXSTepxsmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jY6Vjnl+eZCDbmp5aXpzb4B1XmVlb21mZ2BKW1hYPEhIQFU0QEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bW1pYVVJSUUY6MjIzLy8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklknOMiq2+v7y6tJ6Wp6SttaGimZSiqKauq6uYpqKfpqCgtqejqKewo5Sso46kraKdkJqaqrOzpJyknKiRlJeun5+epqKcp521mqKqpLasxLCpq6mhjISOnKKgpqKVmZqdmZuZpqWoma2orqOlm62mvayUva+sn6GvsripsqWaqLCip5d5qJF9fLB3ioCkpYicbbJwoYetfKGPg6eVmICsiYWuhZ+UqqChl4afgJmVgHuSfquAnZuWi6t4naGSipSSgXqvXqSBfaanZJ2AfZdzaq9dpWtwhZldYFuMoG2VkaaZg5aOmY58fISZgGtuf2N/dG6AemBnZnFuaGdoQ1lhWz5LVTNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RUlNTVlpdX2FgYWFhXl1bWlhTUE9OSTcwNDIuKixBVFZWVlRUVVRVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2TmoOoxcK2wLOemqygrbilo46bpKKfsLCqn6Sfna2Znrmgo6ugr6mZrqGQq6ijlomakK6wrKaepZusl5ePrKGgnaahmqSdrpihqKe3qcGvpamknouAjpuan6aekpSZm5SbmqalppuqrKykpZ+pqL6klsKsqqKgq7K4qaylnrKtp6iXda9+kIuchYd+uq2KmWWwjWWVrX2gj4OmlZqBrIqEsIWmmqShoZCEoFxsaoGzYH+te3uDgbFtZ2+ZmYyIsVt+tVykhGvIomSfgHu8WHa1WbJ9Uq6AeqxYgKFtmJCom4yYkpqafHqRn39ldX5jhnh0gXxhamdwbWdlZk9VZFxBVV8+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBRUlRXWl5gX2BhYV5fXFtYVVBOSkZDNTUzLi9AVVlYV1hXV1hXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Kxt726s8GyopyspqS1qKCKmqCenLOzqZ+joJ61maC0qKqsnq+tnaybla+noY6Im46vq6imoaWZrpKYj6iZoZ2ln5qjo6WZoKKqs6m9sKWonpyOfYublqGgmI+RmpySmpipoKKaqa6opqaipam7nqDGpqSooKq0tKutpZ66rKurlICpkqOvjpuAh6SXmZCCgLjDuoOOnJKEp5ecgqyKgq+Ip5ybpqqQftW9wqpio7+9fX6jgoPXuri1hZWTg569voRto4Jvq4RsnH96srDHg2mrsL2seHeivrxzgJaOpp2Rm5KaoHuDk5x7ZH57ZY9neYJ7YWxla2pjUGJbU2pcP1RhQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc3Oz5BQ0ZHSUtNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWzs7C/uLG8sqKcrqaksqadi5ilwKq4sqihv6anspyesZy6qJ+tr6WnlJSwq5eMg5uRrqWirKCjnKqgl4ujkqadp5yaoamjmZ+hrK2quq6oo5qWknyImZGmm5KPkZiZj5iUqZuhmaqpoaunoKOqu56oxKKfraKps7OprqifuaatrZlzdqqluIZkiaBwaK6RipBubnekkJmfgXWumJRwj4txlaijm5eupHJsbGxmi3hvboKZcYF6anFpZ4qXlphxaWmFiGdxhmRdiGJqb1lcZn12pl9hcY6RbmVkf42Tj6GYmZmTmqJ+iZGWdmeIeGmPa3mAeWVtY2ZsYktlWEpsWjpQZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1lcXl5dXFxcXV5dXl1bW1VXXqmUrLOpubiys6qpoa6do7Kpl5K/s8XKv7ernsCsraSip6yfuqOkrqutpo6XrqmPi4WVlq2epqqgnaSjoJGLpJKmmKmal6OqoZadpqanr7qsrJqbkpF7hJaNpZiNkZGZlY6YlqmWoJipo5uxpp2iq7mfr8Gno7Klq6+wqayqprWirLaViqGoprediZajmYeqm5GVnZKpspmao6qgspaioZ2fopyhpaGVq6eNkpKMh5OcnZWRmZOZkY+WhoGlm5iWjouUlIyQhoR9Z4l+dIJ1c4eKcKdsepSRk5KBgY2PkI+dlaKXmpqlhImXj3NqkXdxjHh3fXpqbWRjb2RVYVlAalxIY2FPWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVZZXmBhY11eVFFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWlpcXF5fX2BeXl5fX2BgYF9ZWWCmlqiqpLS2rq6hsKOtn6C1sZCOrMi+xry6q6Olnpynn7Gpo7annam0pqiRmKyii4eJj5ynlaykn5innp6SlKOWp5mompSmoaSQm6iZobW6qKuZmo+MfIGUi6GUipWRlpGQlJimkKCbqp+ctqOdpqu3p67AraK2pa6vr6uoqLG3oK27mJGlpKa2opKep6COqqCOkp+jq6+aoKOvqK+Yo6Cco6qenp6clqudk5mhm5SQlquajpmZl5GWn5KJoZ6WlYWSjZGOlYuAfWaLhXWGdXiHgnOcaoWPlJOQiX2LlZKSmJSjk5+ZpIWKmol8c5dze4yAc3x/am9kXnBqYFtgWm5kUGBlUFo6R0dFPjI9PjkvKiYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlhZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dXl9dXl9fYWFiYWFhYGJiYmRiXFtjl5Wjp6Kvsauuo6mmrJ+ntaqQj52ltb2wrq2io5p6nqOypKWxqZebuaajk5mqnI6Giomcoo+unqKVqJ+gkpaZm62KqZaPqJmpjZmpj565tqSlmZyMiHmClIybk4qVkpSRjZKXo42fn6men7ijf4OvtaKvrnSjvKKxn3d4n6iwuZR1rKOeiYCrf2RcYnagj6WfhJd9bZKznKOnraqiZZ6fknN5mpdwgJiomG1/oqiKZZymnZKYmJaNkpyShp6bkJaEkoePj5KJhXdqjoZ2hnB7hX9/YGiHipSSi1p1lJBnaJCPc3uonJxme5uJhHmZaoWMhG96gGtyZV92cWxraFxmZmJicFNbPk5OTlNHPkBVRDoxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXWBoZmhYUEo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgrrCsq6mlqK2ip62kkpartrGzp5urp6yXc4ydsKCoq6eUl7mgoI+cpJ2Rf4mIm56MrJqilaehnY6Wkp6Eda2PiKebqZGXpImcurOooJmYi4l1d5ONlpOKlJGRlI2QlKGPnKGnmZyylYCMm7Wds4ySjrqmoH6nonqhrbWAjo2lnoOLhpCxqq+Mipekm3qAi6yGm52hp6inh5WFmHelm3qHnIGXp4KCe5yyeoqGoZialZiWg5GXl4WbmWJ6h5CFj5CSi4NtcI6HeYBwf4CEfoVzhYSVkXiWaJJ0oJp1fZmFo6CJmH+UjIWFmmuPjoZseHtxcWdkd29qbGtcZWtqZnRcXklUTFJARTYuWlVVNykhMDk+Pjc0MzU2ODs6PT4+QERJP0lFSkxHU1hbWVxiYWhmWlFIOURMOz5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kfpqytq6isoKevpqappZmUr8i/saKXqKm2npCEnaycp6KgjpC+npqMn5qgkHyGj5mXh6ycoZafoJGMk4mGgJGnjYejnaSUmJ6GnrqyqJ6ako6FcXaQiZWQipSQj5uMkJKfkpehpZaeq4eftIm0mq2KyoeprIi2hY2wga+sgqiMppiNnX2oj3J7d5yPp5dolaR5tIyfnqankpjCgX+riJihcp6AmqV9l4WVsoGhfaGUoZCZl4GPlJyLmZKLfYWTh46WkomDbXKPhX55cYaAg3uDdISAloCPxWZ/qYePo2uehaSdhZqBjo+Hi5pxj5SFaHh1fHhoaHZwaGhsXmRwbGduWWdHXVJNM0U0N05iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5pbFxRRT1LTUBKY1hdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJain6+nqKilq5+jt7Cpq6aalKCjpKukl6aruKOvgKGonaaenYmUvZmTjaGSno95hJaWkYermZucmaGEjot3m5yPn5CInqSclpqYh6O5rqWanIyMfmJtj4uTkI2QjY2YjJGSoI+UoaGZoad+oaeHrZ2glq2PnZyckIWAoIyprYWjjamZjJp/onWAmZRrgq12Tat4h42ckZqopoCpq32DoXt6p2qef5JrZ5eGl7eJnn5uYGRZg5eAjXtkaItymX15lmxdfZdtX1Jwg1xfa3iCX1hkgXyDf5Zwp6prg6NucqVwn4WgamegbVtvjH1nWmCEgGJYUG93Zm10cmtqb11qcGxsallpT11ZRjlBNUhEX2w1LElEUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV11eYnVgTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnaC4oKmjpqyRoLa7qq6imZihoqWtrqGer7WjqJKhoKCnnJqOmbSZkIufjJWLdYGUkoyKppWVmZ6efpKFhaykh5uQipmpmZqbkoimsaeilpqIiYBpboiHi46OiouNkoyRk6ONlJ+gnKGkf5OBj6KhlKB2nJWPp4Kgpn+Fp6uDpXiJfISafqJwc5SIlnyfjXlthpuMmY+bqJmOh517gqJzdqZmnn53pF+Yen2TdKJumLe0unSTiIOAtahkgca4e3CVtoxygJqjYnOsq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRhnZmzlnJ9mJ+zdXNbnrKDamJvdHZxaW9Ya2xyc2ddaV5iTEU9RDZRQlpzMz1TR2BKUj08Mzk1Ojk2RDs7QEpQP1VNT1FARV9fW1pYYGB8ZEhDOE1XVVdiYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlZSjt5iqm5OfjaS2tK2toJqinaSjpq6dnLKurJOYopqhpJmblZ+rm4uIkniLhXGAlo6KkKGPkpSdmH2QiY2ooIeXjomSpJScm42LqailnpCXh4V+anuHfn2QjYOLkZGJkJShg5eeoJ2gnouJd5yYoo2fcaGKh6mHm6WOlKapfa2MfnqgmXqjk3iBdJaIjZx9lp+Gm46Ym6WFomShfIiWkJuNbZ5om45vmpl6gIunfXJpdKuDn4N0qmiVml2bhXaFnmeqa4C4ZlyocIGcYJWMXqd2dYeIfp5omnWGk5KXjoCfb5qRbqeaXal/ebtrfqpcjoRdtGdcbnJ6eGtpXHFqeHlkYGZYYkJRRk83V0NSbzVMW1tfTlpEQTI1MTw7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuJqbSap4hjlJurubGwrJ6mnJypoJ+vnJ6xqa2el6SboaCZl5ego5mGiY1qiIBye5eIjJaWhJGVmJB6ioSVo5yKlI+GjJ+SnZ2JkKmjoJqMkoqBgGmBhnl/l4x7iY6OiJCXm3+Uo5+goZOYcmifiZ+PjHCSjIGph5ieoaWepnuwraOiuJd3o7OjpICIlHmde6uZfqKOnJqWiJdxoXyFja+1fWuakaF5fpi1oqSrqISZfJt9npt/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iianF7jmyAiISZdZt4homxs3+Am5Ond4OebnN9lXCadGukXZV2SGVkYHRxfn5vZmBsaXZ8ZWVhUV9XXVRXQFpGUWhFVFddYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUI8VV9iWmVpVmdobW9iZmdeYWFcXV5gaGJfZWN2bV1lZ2ZrZGZsaWhraZOcgLCtmYRTXqCms7mysqmaooycrJycqpSirKSjqI+gnp2bmpaZoZ2WiIeJd4aBb3mVhZGbi3yRk5aIcoCIkqGcc5GQgYmalaGbhY+pnJuVi4uLfINshIVxgqGMeIaNiIiTmZZ8k6SgnqKIrYZ9tYSOnp17pZZ6qYGVm4+Jn5t8p2h3bX6ZdKFzcnydhplwk4OufaSDpZ2ZgKNvXqlndaJjb6VhnNOQfXuZeHNzYqKGkH6jdKSQdmuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdm258cJZtf3Kicl2kZ3OmYGimbZvUmn6Gm3B6e5hsnHx4l3NuqaRnYGV6cYCFbGhmZG51eGhgY1NcZlFRYkhZSlVhV1RcZmtcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWBmZmpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWllfGReZGdka2RqbWdobGiXmn+vqlRcS36pr7Gzr7Kjm5mFmamgoaSOpqmhmaqLm5mZlJmTkqGYjoeFe3B9hGh9j4OUmoB3kY6PiW9/ho+TkmyXk3yJkpOll4OPq5uUk4uGiXmDdoeAboKfhneAkoaImaOYe5SjpJmfibOhoraLeqynpK6lcKmAmo6FgJqQe6SAoZmGmHKehKSur4qXjICNpI2Vg62gk3a1trXJoXOUi4GfYJ6XqW15loegm3SiiHegfpOXi4FwTWajknCbh3Oke3l0YYOBa36ga3FkX5xxfXOWaHlps7W0xqZzmH16nWucm6t2hZttdniYapp7dZhyUUV9s19qdmt6iGZraGN1dXFuV19UWWlQU2hJV01ZVFZeaWxvVmhXTktBSk1LSEpPQVFLUGVjam1ldHJzf3l8bnWJe3tUUU9sXmlca2lSamhpbGhsZmNlX1xdXV5pYmRpa3tfXWRoY2pmb21laWxloZuIrqWDZD+TobKqrq+1oqKQgJeqoqOljKWnnp2mg5uYl46XkI+ck46Ig3pqeYdlg41/mKB5dY+JjIFphIWSg4yFnY15jYuWppOEmaqYjZKLgYl6gH2LeXCQoYZ5gJWHiZagln+UpaiclZWDZm54nGyiZHtxpXebmHBnpoCVinqkep+Wg5dznneBipWXj7lukYqiYn2ZoJWIbnJpqmt1oG1vpmCbaYuQaZaHm5Z1ooF+mmCMho11cIhiaKBlnn5pm3VvY2aIgW1xolpeW2KhbV2Ii256fXNyZKVteKJkZ6domXOMmXCib1WJkG+gX2aoVIteVJhubXNrcoJtcGlseXRrcFJZV1dmWlRtSVlPXUlYaWlza1lsV1FSRlZcTFhTYVVpa193dHt9cHx8coN7gHN2jYCEdl5ScmJnY3BnUGpoaGtsbmhkZ19dXl1gamJqaXZ1XVxjaGNqanNtZmttY5yjl6V5ZHNti6ato6mwsaafi4CYq52fpoyjopujooGWmZSOmpCLmJCOinuHcYCIaYuLfJibc3WJfpB7ZIOHlYqKlZmCfIiHl6iRgaOtkYaQi4KKfoCAjnNpkKaEfYaTjYiZoI+Ik6mmnYimeJWbfqSIlouxmJ2Qgq+Xn6V2lIZ4qXOlj4SabqSijJKEjYO7bn2lr4OGhYaTlZyffKV6cqiVoJZnnn5vrGSWipaTd6htqqKBiXaJg3erkaaIa5Gwa3azjKlrioVtbZ+ekpVgfquLqnZ+foulnnaffIOklZ2gapuIeKxonq2MtnR3vo2kk1qDp46rYXVydHB8dXFja39vaW1TV1tWYWJda01dUl1KXm1vd2BbcVlcYFtndGVub3JjcnRgd3p+eXJ5g3OEf4F7e4yBgoB2YnhkY25yZFJrZ2hvbHJqZmlhYF5cYWtibWx6b1xcYmlibGp4bWdsbmKVpKmcgX+do5apqZ2opq6kmYqCmKyan6WKm6adqZ2FjZuQh5yRhZKNjI10h3uIhG+NhX6Yk3R0hnOSgm1/i5GHhpOOfXuChpimjn+np4+BjomFlXaCh5JvbIupgYOMlI6JnZ+JjJSqop+PgHWUl4h+gXmUrqJ/gZtxj4Z3jomCfXtyp4xyfn16mJabhJB5e39+h5SVk4p2kJieoIN7fYlrjIVbeXlyenFpbn6SiXGAdYGPlJNxh4SCZYx/X4F/i3d0cpR1b3lubYdshIVedWd3jmWAgIWNqJp9dHuVaomIcIF2fYd3bm5ojHN6fJh4hVxsWHmPaW94cnFveHhwXWuHbmpnVltgV11ma2RWY1VfUV9weXlta3dma2trd31ycnV0YW92YnR7gnh1eoJ1gICAgXiLhYN9e25/bGR5bl5XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5obG9hjZO3qKaJoKKapqOYpJyroqGEhJitkp6hiZunm6mYg4KcjH+WlIeOiomNcoN8j31+j4V7mI90coRxlYV7fZKLhoaPhHl+gIeapY58qKKMhpCQhZWDho6Yd3KEqYaOkp2QiZ+eiIybp5+fqoSJjpWafn6Jlq2nj5Gmj3dvm4+BeJBufqiFcX6VcWtwfYKgjYCTjotobFyCi4ubmp6Oc5WLiHF0a4J3dIFZcm6HkYF+f4xqXWpke4aEiYBgaXh6mnuCioF1gYWBZ3eKhmphcHGBdF5xioGIjqWUhWWLjYNud4uEcYaPenFoaGV8hHuWW1xraG52W3x5eHVuc3ODZ1xti2trYlpaX1tZbHFcX2FaX11ldH98dnB1ZGtra3x9c3x5dWRudWhtfH53enx7eXqAgH5vhoqEe310fnlzf2hUXHFpbHZwdWdraGRdYVhraGtrcXJuV1tlbmxnc3pvaGptYIuKqbChj6Khmp6dl56YqKOifoOZro6glYicopGllX98mIZ9kpmJiYaHinN+gYx2hYyChJeKcm+AcpiGg36Sg4SGiYB6gYSMnKGRg6eiiHmOl4mVi4ucl4SDeq2CkZialYqenYeIoaqfoaKji4iTm5yjmZWqoaemn5Kah5WMenaNjYOnfn+SkJOUnbKmm5WfkI2xkpeDpYyMlZqfiZCbgoiRimt8jnd4ZYOHkYt8iZ6Eh4yQiYiBhYSQd3x6dJmgiIaJnYmEk359ioCAdW9yhIJ+d4WGio+lkIKFjIaCjJCMfYiMipGEem2DhX56mWtzaWF0inF+end3b3d0gl1eb4dobl9eWl1dU2hyVmRdXWJsaHZ8fXRvcGVrammAfW55gHJqcHFsZ4F7coKAeH99f4R7bYKMhnx6eHt9eoN4TmN2anNucHpla2VjYmBbdGZwZ3JxbVVdbHRtaXl6cWdpa2SMh5y5npahoJiUmJmUmKSgnnx/mqyPn46GoJ2LnpZ9eZWEfI6ZioaDhIdueYGBc4GIfomUhG1rfnqXh4SDkH+Ah4SFfIeFj5yfk4isoIRzi5CGkpGLnZF9jXuqhI6TmJaPnJaHh5uln6KanYWCkpqamI+Zpp+lnZyPlX+PiHV7ho2EpXt8jpCRhpmrop6UnZCOqY2QgJ2MiJOZnoKPl36HjoNveIZydWB/hJCGdY2ZgYOQg4eFf4WElW55dnSSoYqLhZqDhIxzf4l7fHJxeoeCeneJjYORpo+Fg46Ag4qJineGiYuMfnFtf4J8b2hsbWhfen9ofnx2dXZ1e3hcX3F+bnRgY1tdX1JnblRlW15ia2l2en9ybG1ka2pogX9sdIFsbHVvenCGeW6HgHaCgH6FdnKCjYh+e3x8f3uCimBoe2p1aWmCZGpjYGlcY3Vob2J1bWxVY3F5ZXB6e3Nlam1ti4metpmgo5+SkZWYi5qen557eJ+nkZyLh6WVi5iZeXqNhXyJkYSMgoKDbnyAeXOBhX6LkX1raH2Cl4mBiI58foaEhnyPgpCdnZOJqZ2BcYyLjJKGoKGKhYx8qJGIkJKXk5aTeI2jn6Cdlpl/gJCbmZKMmqKgo5mXkJp9jIN3f4KOhqB/foyMj3yYpKGik5qRkKaMj4GakYmSl5t+k5J+h46BdXSCcXdhfoCOhnKLln2IjHKMf4KFho9oeHJ4i5iRj3+WfYiKcoGGe3xwd3qKgnh4j4uBlKWSi4WPe4WGh4R2g4SJiXxnc32AeXtxbWtnX35zaHx1dnR8c4BqXmB0dnB3ZGNZX19Sa2lVZVlgYWhqdnmCcWdrZGxoZoCAa25+aG9xbH55h3psjIFzgYF+gXR2go2Gf3x7gIF9f49pcoNudGlhh2hsYl9xVnRvbW1geGhtV2p0dmN1entyYmpveomMnrGRpaScjo+Xj4acoJudfXeloY6YgI2ji4ialnl7hod+g4l/iYKBf3J/e3R2g4V+ipF4Z2N+hpeKgoqMeX2AjYN5loKWmZiNl6Gcf3CMgpGThqWbh4yJg6aVhZOLlpiTkneRnaChl5SWeX6OmJiOlpqco52YkpSaeI2EgneDlY2dfoGJjYxzl6OfopSZj4+ijIqClpeDkpaZfpiNfIiNgXZxfm57ZIB8i4Vxh5OAkYJsh4OBgImFZnVve4WRl4t8kneLiHt/hnt6cX13iIN4g4+HiZehlYGDi3aIhIOCd3yDiod4YHp5fnR/eGdtZWF/amp3c3R2fnF8Y2Ngc251cm1hWmFeW2xlUmNZYWFoa3Z5hnFja2NtZmh8g21pdWhucGmAfYJ5bZCGcoCDg350fIOMgYB+e4KDfnyQbXaJc3VtZYpsamJidlaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5utl6anno2Ml4eGn5OXmX54qp2LmXqXnYuMmJB5fIGMfnyEfIGDgXh0eXp0fYCEgImLgGRffYuVh3+FhnV9fot/fZiGl5WYjaSimYBzh3uTkYmmj4yOipOgkYOSkJWXkYuBj5efmpGQkHN/jZKUiZ2dnqaXl4yUlXKLjIlrhJePmXqHiI+Jb5edmqSUlYuMnoyGgZGcf5KSlYaZiHuKioF5cXpsdWx8f4t+boaTg5V4cYKEfn6LgGVyaXt/lpeDfo1zj4eCeIZ9dXd/fIR/e4KLg4qTo494g4F0iYd9gHR2gomFcGJ8dntyfXBib2NkfGNucHZzeHdzdGJ2YG9sdm5vXFxfXl5qXlBdWWNhaG50e4lsYGlla2Npd4duZ2xpa21ogX17d2+QiHOAhIR9dIGGiXuDfXqBhH19jnJ6i3h4bWyHamhfaXJjh2dxb2V3Z25sYXlpa317eHBheG2LgJiYqZ+kqJ2KipKGip2LlZh+eK+ZjZd9n5SRl5OId357in18gHd4gIBwdXR8b4Z9gYGKf3xhXH6PkYaAg4Nze4CHeo+SiZOSnZWmnJaCfYF9joqRo4iOio2Ymo2GkpmUlo6KiIySnJKPjIxuhJCPkYiemaKglpWJlpBth5iDZYWYjpN6iYSQinCWmpSjk5KJi5mMgX+QnX2SjpKMmY57ioWHc3N2bHFudXyKdG6GkY+TcXWBfIGBiHxlcGx5fJmTfIOIdJCJgHOHeG5/fICFe4SLh4KLlKeMeoZ7foqFd35xcIGHhWZpenV2cXxiX3Bha3RfcWp7eXlsc3BleV5ubHNtclhbX2Bha1tQV1hlY2dxcX+IZ11paWdiZ3GNb2RpaGVpaYF6d3VvjoV0gYKDe3WCiIV4hXx4hIV6f4l3f4t7e3J4g2prX3BodIBrcm9tcmdvbGV8Y26AendxbHd3in6il6GnoKabh4uLgY+ch5OddoKrlZOOh6GNlpSPf3N8doV4eX9zc3uGa3Nwem6LdoCBiG9xW1l+kY2HgH9/dnWAgICgh5KLlJ6aopWYeIp/gY2InJ2Kj4aSmJaFiZWakJeLi42NjJyJjZCDbYmLkJGKnZahm5eUhZeHaYOigWWEnImQfouDi4F3k5iSn5ORiYmUjX59jpd7kYyPjpqSfIqAgm92cGxtb3B7hml0g4+Zi3F3gHWCiIN5ZnJudYCZjnuHg3mTkHl1h3Nvh3qEinmKhYGHjZqihnuDdYKLf3d5bmyBhYNfdHVzcXF5Wl9xYXBrXnBqfXtxbW1qbXZgb29rcW1ZWWJhYm5YUVRaZmdjdXCEg2Nda25kY2Zrkm5gZ2dfaGuBdXJzcIuAdX+DgHl2gIuAeYV/eIiGd4OFfIaLf3t2in9qcWN8Y4Z8bnFtdGpob2x2eF9xf3l8dXV0gIN+pJWarJ6nloWNhH+XlIOQoHaMoJSTh4ubjZaOi3lxeHSCcHKFdHF2iGxwbnZtiHaDfoBublVRgauVh4N4f3dyg3qDoIKTgpWUmp2Tm3iSe4OMkqOZk46JlZmShIeXmYyUi4mPj4edhJCKfHOLhYqOiJyan5uVk3+TfWiEm4ZnhZ+HkYSRgolxg5GYkJyPj4yMj4x3e5GQeo6LjJGWjHyIfIBrd2pua2xse39ien6Pl4F2e4F4g4x9eWdzbHOGlYt+h4V6k49xeYNvdot5iIp5iHyBio+dnYR7enaCi3x3cWpsgoR7YXlxbm1ydFZfcGJyYWBtb3pxaG9mZnN0aXFrYndlXVdmYGByU1FPXGZlXXlwiH1gXGlyYmJlZpFqX2hlW2dwfnBrcXSKfXZ8hoB1dn6MeXuFgXiIg3OGhX6MjIR8eZV4ZnJrg2CIfm9va3pgam50f3VfdH15hnh0c4V9eKCPmbCbpY6Ci3+DmoiAjJ+Ai5qUj4WImI6Pj4R2dHd0gHFwhXRwcoRwa2l3boNufX1tdXNSTYLfyJLWk3twdYR2hKCDlHeWkZmdkZl7lHOFkJ6hk5OQiZOclIZ/l5aIjY2IkYyHm3+OgHd6jX6JjIqcm5yalJJ5jHVmh5CFa4eihJGIl4OGY4yRmY+Vi5eMjIqKcXqUiHuOiIqSkYl6hnx/bXxlc29rbHp6W4F5kJCBen5/gIaOe3pocmpzio+JgYWEfJSKa31+bX+LfYqFfIN4gI6UmZmKfHV3g494cm1ncYCFbmt1cGhqdW5TX29lcFpgbHJ4Z2tqYmZ4cnBxY193YGBWa19edlBOTGFnY116cYl1XVxldmFiZWWOZGFnYllpc3Nua3F2jHx0eoaCdXZ+i3OAhn97iX9yiYiBkYuIfH6YdmVzbnxliH5ucGyAWWxueXlzYHZ6e412cneKd3mei5uumqCQgoV3iJV+fIqeiIagko+FjJiEk46HgXR4cHlxb4RvbW9/c2VleXF9bXp9amhrY6Sawdyu8KFzbHaEdoWjhpNwl5GWoZWcgZJyhouil4mNlYqQnZaDgZaQhYmPgJGJiZZ+h3p1f4l4h4SOnJqYmI6Pdol1bYWIiXyJooORiZyEhV6Lk5eLj4mPi4uEiW17loF9iIWJkY+GdoZ+fmt9ZHh2am55c1iJe5KIhXp+gYGGjH95ZXJpf4mNiYKBfouVhGuBdW2Hj4GOg32BeH6PlJKYj3Ryd4eMdXNxZ3Z6hGN1bnFjanZoUmFxZ2xWX290emFyZGBpfXBzb1tjcmBiVm5ZXHhOTUxkZmJed3OJblxcZHleX2VlhWBjY19ZanNrbmtzd4x9dHeEgXh3e4lxg4R9foh7dIuJiJaGjH9+l3NndXJ5bIx7bnRxgVdxenZ5cmV3eYeNaXaAiXJ/nIaYppujkoR9cYyUd3mMnoWFoY2PfJaNgJmIhHtzd3B0anCBbGltfHVfYXh3fHF1fGhgZHzr2rXJw9yHc2x0gneLm4mPapmRkJ6WlIGJcYWIn42Ei5WKjJiUfI2TiIOJj3uPioWPgX92eIOEcoiCk5yWlJeFjHWGfm+DgYeGmKGCk4yeg4lhg5SPh4qGio6HgYdpfJN/fYOEiY6NgnKHf39xd2h2c2p0d2xajX2Tg4V9gISBhIqCdmFya4iBjomBfn6RkH1tgWt3hI6EkIJ7gHx+j5GPlYhucHmMhXRrcWxzeYJhdWpvXWx3YVJlcmlmU2BwdnVhcGBdaINxc2tXZ2hiaVhtVlt1TEtMZWdeYnNzhWpcXGV5Xl5kZ3thZF9dWWtvZm9qdHiKfnNzgX57dnqIc4WDfH+HdneKho+ZgYyCe5N1bHd2eXiTdG54e31YeYZxgG9neXeSg2R2hoVwipaFmaCaooqHdG+SjHF3j5x+i5qJiX2gf4OZgIF4cnRub2Ryf2lmbXh4XGB5e3txcYBqYWdhf9W2jpGmeG5xd3xxk5GNiGuaj4mdk4yGe2mHi5mGgZKRhoeYjnyNjYGBio18j4x9iYR6dHqDe3GGgJaajpOTgYh1goV0gn+JkZydhpSPn36IYn+Th4WIhYuNgICDZ3yQgH5/goyPkH5tg3yDdWxtd3V1eHZsY46Bj4CFfn2Gf4SJf3BfcW+Ee46LgXt+kIh5cINleYGJhYqBeoR8fpKNj5GDbW55i351bW5rbHt/ZGlsallud1pTanNpYlFjcnhtY2ZeWmqDbnRiXGhfZGxfblVbcE9IT2dlXGdvcYBtWlxjc2BcY2x3ZWVdXVprbGNtanN3hn9xcH98fXR4hniFgnyAh3V5iYGSlXyJhnaIgXB4eXuEk29ue4F3XoOAdIJtaXp0lHNnc4h8cZKRg5mem6CGiHZ2lH9td5SYf4iQhIuOmnyLmnd+dnFwbGphdXxnYmp1eltgeHx6bXF/ZWNoZ1edj19xc5a8xIR3cZSKkIB0mIyHnZSNiHNriI+VgHuUi4GEm4x8ioZ9fImMf5OHdIiFdnZ9gnF1hoGelYaUj4KCcX6Hc4N6iJabloaSjZyAiGZ9k4KAhoSKiXKBfWd9i3t5f3+Hi499aYB9hHZmcHl4dHh0bGuPhouCi395g4GEhIBrXnB3en2Lh4V7gI5/fnKAaHiBhomEgneCen+Wi46LfG1reoh8dnRvaWh+d2VdcWNYcHRTVG9zaWJOaHV5Z2FeXVhvgG90WWVjXWptYHBPWWxSRFRoYlpsb217b1lbXm1jWmNvd2RnXF1ga2pjbGlzd4GDcW5+e390dYN6hIJ8goV2fomBlpF4g4p0gYhzeXl+jZBvb3uBcWqCeXp+bm18dpZraniEdGuTjIWemKCZhYhvfox2anmZj4CCioKWmIp5jpZvenNxbGpkYHR7aWBmcntbYXN9emdwemFlZI6xsndLYlql2tGXcnuSjJF5f5aMhZqSjYZvbIWSkXl5k4aAhJmKfIeAeXiJioSVgG+Kh3F0fXtqeYaDpZGEk4yCf25+gnWCd4Sal5KKk4+UhYdwepKEfoOEioNvgXhogIV4cn9/g4qHfGV8foR2Y3FzgGp6cW91mY2GhIt8d3mAhHqCa1xvfHJ/hoOIfYWHeohxgG1wgoWNgoNxg3d/l4uNg3dtbX6Df3Z6ZWhqfnJhWnhaWXJuTlhydGZgS213dWJeXFtZdX1ycFdnXmZqcV9vTldpUz9ZZ19bcGtneXFbW1lrZVljcHlfaF1eZWxoZmxpcXh/h29tf32BdnCCe4CBf4N/doGFiZeKcYKNcXuGfHp5hJSMdWt6f2xwfnR/fW9yfHuUcG+Af3lmkoqCoZidkYOGZ4eEcGd6l4p+gIWCmYqBfI2NaXhybGxmX2FveW1fYm95XGRsg3phcXZfZGXV676LMjo+i46AcnmGiY+Nd4WZjn+Ujo1/bm2FjIt1fY9/hYKViXyDeG52h4WClnduh4RrdXt0ZXmDhKeMg4+Mg31tf3N1gniEmo+Lj5GSjIuHf3uSh3iAhY2DbIBzaYB+eG18e4GKg3hieYSCcmRxaX9udnJ1gpyMgYCGf3R2foBzgW9aa31zeIiBinuGf3yId3lwa4eCjoKJcYB3fZSJin10bWp2gIB1dVxpaXlxWld9U1pyZk1bc3JmXEpxeHBdW1taXXV/dWlZYltnZW5iaU1XZlE9XmZdXnZmX3VxW1lVb2RaZHB5W2heYGdtZ2praXB4fY5taoKEgHlugXt9gX+CenWCgYyThXCAi253fYB7e4iTiYBpe35rdHxyhntzd31/jHp4hH58a4yMhJudloyCgWyNfmtof4+OfH5/g5SCf32KiGt1cWdpY1tjZ3NvYGFsdGFocIl6YXN0XmJjm6CQblw1Wq+1dWqAin6Th3eImId1kIyKd3BthYKGdHmJeIl9k4h6f3NndYh+fZdvcYV9aHZ5bmV6iYWlh4CHjYl9bX10fn97ipeGgZKQmImLhYp8j4lyfH6FfGl+bWuBe3lqenaCh4FyYHeCfnJkcmd2g251fIaVkoJ9goBwd3p8dX5tWG19dXOKf4Z2hnSCiXp3cm2If45/g3F9e3yRh4h6bW1obYKBdW5daGZ0clJcfE5ccV1PXHNwZFZLdHlrWFlZWmFxgXVhXV1gZmRoaGZOWmhOQWFkXGB2YVx1bVhYU3RhW2VvcldqX2Joa2dtbGlwd3yTbGmEin18cH9+e4F/gnp3gICJi4Rye4dvcXeEf3uJjY+Ean57bnh5d4p3fXiAgod/hH5+em2EjIiYo42FhHt2i3prbYWJknl9e4KSgIB9ioRwcnBjZl5ZZ19wcGBhaHBmam+JdGF0b1tgZGp2e3++nKekybhyhYRzlH15iJSEdJKOh3JzcIR6gnN1hnSId5SJeXlxZHeGeoCSaHGEdWZ3dmRqfISInoKAf46OfXF+coN4fpCOgneVjJSQiIKIeomJbHl6f3Voemlsf3lzaXp2gIN9aGB4iH1ranRoe4FqdoKNkZV/fH5+cXx2fHR+YlV1e3FyiIKCe4Fwhol3eG9vgoGLfXx3fHt0jYSBdWhwZ2yIgnJwXWhjdG9MZnZMXm9WVFp0bmJRT3R5YlJYWF1hcIJzW2FdaGVlY2pkUVtxSURkYlxkcV5ceGhVV1Z3XlxmbmhWbF5hamdlbm5ocHd6k25piIx5fXN7fnmCgYJ8dn2DiIaDcHaDc253goJ+iIuUf3GAfHh6eoGLdIN4f4GBgoR6gHVvfYqLm56IfoZ7d4Z7Z3WHjZF6f4B8iYaEdo+AZ3BuYGVcWGZZbXNhYWFxbGxoiW5gc2lYXmNtgHep2qnHhoizcop5cI52fYiQgXuUi4B1dHV+dn9vcH9thXSUhnh1bGB5gXmIjmVxg29ndW5bbX2BkJOAgXmSkn13emyFdH+PioNylYmRj4iGhnt/hm11dn9taHdmbXx2bWp3dn9/fGBieIZ6aHV2Y358aHWHj46WfXWAdnKAen1tgFlWcn1vc4KGfn93a4iGc3hqdH+Cgnx5e3d5cYp/e3Jnc2Rti4Rsc1tqX3ZmSW9vTFtjWFdWeW1iUFN1dllRVlheYHKEb1xgY21kY11vY1RdckdCZl9eZmldWntjUlZcdVtbZ2thVmtgYG5mZmxxaHB2eI90a46Ndn92eH13gYOBe3R+g4iIg29xf3VxdX2FgYmNi3t3f3iEfH2Fh3iHfH2BfYSAe35ydniLjp+MiXuKd3WDel5+h5qNeYeEdIaHhHeJe2JubVxiW1thVWp0ZGBbaG9wZ4dxYXFmV1xja398ys6HuqJrbm+LbXKEcn6Gi397koV6eXR6dXR6amx2Y4R2koJ2b2dffIF5i4hlcYBqanFjWG17hpyJg4Jyl5N3fXtthm+AiYqGcJaOkIiGjIR7eX9ycnB+Z2hyY254cWpscXd9fHldZXqAeGl1eWeCd2h1iIyOlX1zh2pvfoB4bn1dV3B9bXN+iXuAbW6Kf3B2ZnZ+f36AdXtweHKFe3hxZXJgbYuBa3JYa194XUlwbE5XVl9UVXxrYk9UdnJRUlRXXmJ0hmldYGtqZmJZbmFYY3BHQWhdYWZfXFZ8Xk9WZXFZW2poXVhoYV9yZmpocWdxc3eHeW6VinV/e3d+eYOHgHVzf4WFjoNwcHt4d3V5hoWHjIZ6fH91i359hoSEh39+fn2Gf3x4dnl2kpSffo19i251gHpkhIiYhnSSim+FhYJ6g3VjbmpZX1tdXVVoc2VgWWRycmeBcmFrZFdaX2l/eL6uep+4bmJ0h2l1fHJ6hId7fo2Ad3hzd296dmVqb2GHdY6Bc2piXn13eIqCZXB9aGtrWlZveIukgYV/cJmScX93dIBsf4CPhnKTh4yIhYmFfXl1c29peWFqbWFtdmpna2t5d3p3W2d9fHlmcn5uhXRmdoaNhpaAcItna3uDdGx1Yltuempzeop7gGV0h3xtcGd0fXZ8fnB6anh5f3h3b2VsYWyJfWxuVmpheFZLa2xPUk9pTll9aGJPVXVrTVFUVV5mdoRnXWFxaGdhV2lcXGtpSkVqWmJlV1hVeVpOV25qWV1sZVxaZWNedGZsZXFmc3B0gXhwmYV2f394f3yFh311dIKHf5WDbnN5e3tzcoWGiIiEeYF9do9/fYSJjoSBg3p+i4N7d3x3dpqdmHqKg4dqdn59bISGlYFyj4JxhoJ+goBvZmxnWF1bXFtUZXBlX1hjcnVpdnBkZWJXW1tof3BvcoBzimVmen9qdXd0dISGeIKFend0dm5renBhaGtnhnSNhG5mXl98b3qJfWhtd2ZqZFZXc3COp32EfHaWkHN7cXt4bHl6j4N1l3yIhoOHhH11cXNtaHVdbWlgbXVkZ2Zpem97c1lngXZ1aHCBeIJ2YneFi32Vgm+Ma217gXFmc2Vfa3hmcXWJen1hdYN1aWtxdHlveHdye2V8fX53dW5jZWBshnxta1ZqY3JUTGprUExPcEhefGZhTlZ0ZEtPVFhha3d+Zl1nc2llX1djV2NxXUtLa1hkYlVUVXNWTVl2ZVpfbGBcW2RlX3dnbWJwaXRvcX51dJmBeH+AeIB/hoR6fXaCg36YhW5ydHx7dHGFhY6BgXqLdXSQgH2BlI6AhYR8foyGen6Bdnujpop5iYaFbHV8fHWEg417b4VzeoV9goN1bmppZVZdW1taU2NuZVtYYnR7amltaGBhV15aaYBpbG+AZ21iaXt6a3R1dW+GgnqBfnd2bntoanlqX2VuaIF3kIRnZVhhdml9hnluaW9mZl1VWG9pj6h3gXp8kI54dG59bXF0eI1+d5R0hoOAhYl2anN2aGlvXG1lXm5zX2dianhoe21bbYNzdGpvgX56d2F3hYV6kYZziHJwen9yY3FoW212ZG9yh3p3YXKAb2dpeHNxa3d2c3Vignp9dnVvY2JibXx8a2tVaWJnVExuaFBIUmxFYXlmYk1Ucl9KTVVZZWx4e2ZfbXBqY11WYFZwb1dKU2hYZ15YTVVsVEtdel9cX2xdXVtiZWB6aGxhb292bm93dXqYfXeAgXmAgIeGenl6g32Bk4RxdHR+enZ0hYiQfoF9kWxzlYF7gp+Ff4d9gH6GgoCKe3WErJ9/eoiIhGxygnp2gYGCdW6Hb32AdIqAam9uZWRYX1paWlViamdcWl91gmlebWxcYVdbXGuBZXF1fWlqXm14d2h1eHNuh3x+fnp2c2x6aGl3Z11kc2d6d5KBY2NUZG9mgYR2dmZoamFXVlloY5Cob393f4qOenBve2Z3bXmKenaOcYR9f3+HbmR3dGVoaV1sYl5wcFtnX211ZXpoXXSAbnJrcXt/dnVidYaMfImIgH94cnV+dGFwbFhwcmFvcIN6dGNxgGtgbHpuaWh5d3NwZIN0eHh0cGRgY21yfWpsVGleX1VMdWNRR1diR2N3ZmFMVHFZS0xYWGhsdnplZG1xZmNaWF1Yd2dUSlxjWGlYWEhXZVFJY3hbXV9tW15cYmRef2lqYG90eG1vbnaDl3lygYB9f4mMhn51doZ4hox9dHV1gnl6eoKMjn1/hYlqdJaBe4qdfX6FeYB7fnyGiXNxj66MfHyHkH5mcYh6dH59dnJvhmx8fm2QemNwcGJlXWVWWllXY2ZrYF1dc4ZpWXFuW15YWlxse2Jxd3ZsY1xudHVodXdxboZ5f4F6d29vdGVodGVbZ3VmdnaSel9dU2VlaoKBc3xhY2lcVFdeYmSQpWl5dIKFkHhsbXlmd2x7g3l0h3KBeHx5gGlld21gZ2Ffa2BedWtZZl1vb2J6ZVt3fGtub3B4eXR1ZXODk4CJg4l6dm9yfXJheGNabm9gb3CAenNlcYBkXm11aGNmeHpya22Ac3J7cXFhXmVtbn1kaVRoWVpVTnlfUkpaWUhjdWRhSlVuVUpMWldpbHJ7ZGxsc2JhWVpbYXddVEtjXVlqU1ZHWWFOSGp2WF9hbltbX2JjXYVpaGJueHltb2p2gZB5boN+gIKSiISBdnWJdIyGdHF2doF3fX1+jI+Bf5N+cHiWg32ZknmAgHh5fn9zh4RzcJmie3t/iZZ5ZXWIenN5d2x0cH9seXxwknNecG9hZ2JsVFtaV2lkbWZcXHGJZVNybltZWFdga3VkanVqal9bbnRybXR0dWuHfX+BfXdvbmxkaXBjW2tyZHR2jnNcV1RjX3B/fnGBXGJjXlNaYVxkk59lcnGFg5Bza2p4bG5ueXl6cYB2f3N7entkZnZoXmNbYWhcXndoV2JecGhhd2FbfHZqanJueHR0dGlxgpaEh3+FdnNqcHxtZndXW2lsYXBxf3hzZW9+WmBwcGFeaW98a2pyfXFvdmlvYFtka2x7YWZUZ1VYU1F3XFJQWVJIZHNiYEdWbFFJUFpVa2xrfGVtb3JhW1pYWWxwV1NQZldXaVNURlpcT0lzdVhgY25jWGFhYV6MamNlbXp5bG5pdnmGe2uEfYCFmXyChHl9iG2PhnFvdnp9dIKCfYuPg4OXdHiClIWBn4l1gX+BdH+CcIeDdm+il3R7hoyHe2Z3i29ufHBneHF7bHN2c41rXnRvYmdma1NeXFZoYmxsW1xxjWRPb21cVldVZmhzaGN0ZWVeWnB2b3F2dnpsiH2AfYh3kHNjZGtvYVxubWNzeIdrWlRWYmJ2fHxwhFxjX2NUWmBaY5eVY25wgoWJcmlmeW5kcnVxemt5dHVve392X2dzZFxfV2JkWWF1ZVVfYG1kYXFdXX5vaGlzcXRxdXZsbYWUg4p8hXFyZ258b3FvUlplaWRwcn91c2JsdVVicWpbXm5ke2RrdHxxcXFpbF9YZGlqeF5mVWRVV1FWb1hRV1RQSGVyX2FGWGtPSVlUVm5pZHxpa3hrYVdcVVt0ZFNSVmhRWWdUU0haW1BOeXdbX2VtalpiYV5ej25iZ2x5dm5uaXZ2f35thIB+hpd7f4eBin9rk4hyZ3SAe3WAg36Jjn+Mk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgo2Md3hueo1gZX1xZ3p0eWxtcXeDZ2R8bWRnZ2hTYF9VZ2Bsb1xebo5oTWlsYFVWU29lcmtmeGVlXVpydm5ze3lzbop7gHece3prYWVsbV5gbmplcHl+Z1pWWF9qd3t6b4NfYl5nVllgWGSciGJrcIGGfHdranZsW3VwanlpdXJub3uBc1hrb2BZXlZjZFhlcWNUX2JpYWJsWmB+a2ZsdHVvbXh2bGiGjYCKe4htcWZwe2xxbGFYX2dnbnJ/c3JeaWxTZXBkVWJtYXhhb3R6dGlua2peV2BmaHVcZFZiVlRPWWdTT11PUEhlcF1jR1pqTkpgS1htZV94aG5+ZGBVXlRddVtUUmBnTl5iVVNKXFpRWnZ2XV9mbWhYY2FbXo5xY2hqeHJzbWh2c3mDc4KDe4iOfnyKiI55bo+KdGxzgnN/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6NjY2NjY2Ojo6Ojo6Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjY2NjY2NjY6Ojo6Ojo6Ojo+Ojo6OjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQ0dkaGdnZ2doTUJDQ0RERTkuLi4uLitIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU0OVxgX19fYGFBNTY1NTU3JxscHBwcGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX59fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGiImIiYmJiYeFhYWFhYWEg4ODgoOChYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCQkJCQi46RkYmHjoqQkpORi5CNjI+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2NjY2Ojo6Ojo6Ojo6Ojo6Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIuFh4eHjIaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQiIWFhoWOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCIhYaGh4yIiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfnx2dnh8fHt8fX19fX1+fn5+fn9+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuEiIaGiIWJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4enx6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4qOioqMio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH5/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/gH+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f4CAgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/gIB/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f3+Af39/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSVlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OSkpKSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH19fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTkpOTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKQkpGRkpKTh4WTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkoKBkpGRko51hpGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/fn9+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QiHCEkY+QfHWIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+PkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fX19fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+Mc2+Kj4lyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI12bnuPgnN4ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh3NtboN6dHaAhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWVhYV1RQUVJTUlNNTUpJRkVISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/fn5/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnd0Yl5kX2JrcWZoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9+fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGJebGxdZmdnZWJjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISUpISEhJSUhJVnBzdXl6e3l2dnl6ent9fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1lWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aWmt3bWJuc2piWllfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e31+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01ba3JsYW10cmdRUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTlxkb2tZaXN1cFNNT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAf4FsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQkVJVmNna29wbm1sWk1MTk1OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgm9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQ0dISU5bZ2lncm5uaWZkYF9fWExKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz5JWl1bXWZsbmtvbW1sa2lpa2NSR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gICAgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs9Sltpbm5vam9ta2psbGVQR0VER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GBgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTo6PUdibnNubmxrbGdUQj9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRkVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdHJxdHh4eX1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OTxJX3N0cWZSPzo7PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PDpCbH1pPjo7Pj0+P0BAQD4/QUBAQEFAQEA9Pz89PDo7PT08P0BBQkJBQEFERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDxcbkA+REU/P0FEX2Q8PT07Oz0+QUFAPkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCQ0VIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213SDg7Oj0+QTpJZT08PTw4Ojs/Pz08PTs8QD09PD09Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lHSEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PD1JTEZGdXdNNzg4Ojs+P1dqQTs8PDo7Oz4/Pz09ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENyeUk7XH+Df3p8d1c8PT89PT5FaHRMOj0+Pz09P0FDQDw5O0E/Pj5BPTs/QUBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBR3J5a2KDhIOCg4B9Xj5AQ0BAPUpze1k6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBFbnR9goKBg359hHZNQUNFQD8+WXuAXT9DRUlKSklNTUtFQ0ZGR0VHRUVFREVDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISkxOT1BQTUlHSUdISUlISEdHSEhFQ0VFRUZGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hKT05PT01LR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiEVmyEh4aGhoeIiId8T1hkTElJR0dERENDQEBDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERGR0lKSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKVIGDhISCgoWGhoSChoWEhIaGhoeHhop2b2lTTUA+QT8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYCAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSUllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI5+bGJhUj44P0A3Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUdPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjYxvYGRlWUFXPTU2NTU4NzM1Njg6ODc2NTY1Njc2Nzc3OjY3ODg5Ojc1Nzg5Nzk3NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA2Nzg4PTo9RUNCZYWDgYCCg4ODg4OGiYqKiYmKioqKi4qLjIZqZmtpZlE3ODg1NTg4NTU3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3NjY5Ojk4ODY4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISFhomKioiHh4iIioqMi4qLjoRrbGtiPzw+Pzk5Ozw5Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PDo+Ozk7Ozw7PDs5Ojw4Ojo6Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3Vzdnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLioyNjoBtbGBFREZGQkFBQj9AQ0FAPj0+PkA/Pz9AP0A9PT9CPkBBP0A/PUBAQD4/QTw+PDs6Ozo5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fX17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSg4KChIWEhYSGiYmIiIaGhoeIiYqLi4uLjI2MjXtta09LTUtKR0hIRUZIR0VDQUBCRUNDQUJDQj9AREhFQ0VDRURBRkVGREVGREBCPj1APj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMjIyNi3htYW1kTU9LS0tJSUpKSUZEREdIR0RDRUZEQkhJS0dIR0ZIR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2NjIyMh3l5ZWFPT01MTUpJSkhLR0RHSUhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozs9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyMi4yNhmlSUk9OTk1OSkhIRUpJRUtJR0tKSUpHR0dLTE5MTUhISUpNUU5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVG5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiImMjIuMjIyMjIyMYVRVU1BQT0xLSEdDSEpHTEtHS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSEpKTEpMRkdIR0ZGSUZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyMjI59WlhVVVZVUE5MS0VGRkxPTlBXVVFQT1FTUk1TVE9NU0xQU1VWUlNSUExKTU1NS05HR0pGRkhKRURFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUJAQkJHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjY+MjIxqWlhsY0dUUlJRSzs7UlNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eHp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdHRkU/P0FBRUFDR0VERUxYUk1UVVZYWnyGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKi4x+YYqLi4duXWVWO1laWVRRP0BWVVhcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhVVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enp6e3p7fH17fn9+fX59fX1+fn9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiox6b3BaXF1cU1VTVlZVW1p1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af39/gH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHhIt+Z1paXFpVV1VXUlFXVmOWgFJlclhaV19oUGBmW1tYXGdhR09aaGddW1xdXVdST1NQUFJWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1NTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ+gHxeUldZVlNWU1JRTE9NS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbXFxeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX5+f319fX59fX5/f3+AgH9/f39+fnp4d3ZzdXt/f4CAdGt/fmtyeV5bVlVTUk9LRkNEQU5eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiYeGg4eHh3lvclhLTU9QTU9MSktERUlFQz5UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t8fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXlxZVVBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdmBeTUVARERERENBRVBCQ0FDPUNJR1ZASE5MR11pUEhGTkZERUZJR0hCREhHSUtHREJBREBPUU1SZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5/g4CDg4KAgoCCgYJsTkhAQTs8PkBAP0A/a1BKYEVGSElFQj9HTE5HTVFVSUFFPj88PTw9PT89P0FDQ0A/PT1CPkpOR1VudXR1c3R2eHt8e3x8fH19fX18fn19fH5+f39/gIB/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFZVV1FRV1VQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVEQkFCPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTVdNSEdAQTw5Nzc1OTk9Ozs7ODo4Oj88Qkg/XHN0dXV1dnd5fHx8fXx8fX1+fnx+fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QX11aSUhQUlFPTVBRTlFSVFZYU1NZVE9ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhHSEhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVldeWlhNTFRUU1BRVU9MUlNUWFhUVFlSTVdZWlZYWFZYWV1XV1hoc2tdVmFza2JhX15kYV9eWVRRTk9OTElISkxJSUZDUVBTW1dUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTk4OTc4ODU3NTc4NTk5R21ydHd4eXt7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFNVV1RVUl1uXlJOWl9bVlk7RFZYVFtmSkxQU1JPTU1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8+PDo3ODc2NTk5Njc2NjVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xdUlRaVldVVFdUUlhYWVlZU1VPSkdPUE9PTVJKUFBPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQU01JTEpPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtIRkxNUE1HL0VfUj4zPz5qb2FTUlFAR1VRUFFQUU5RT1FQTEpMTE9QT05QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dXl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1RRU0FHVVBPUVFQTk1OTUtMS0tOT09RTE9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9PTVFTTFRVVFhXVUxMS0k8OTg3Oz5APjw9QUBCPT5FSEdDRUZJR0pKQEZBQUBGSEVKT0hRUmJcUVBST1NPT1BMTE9NTE1MTU9OW1dLTVFPR0lIQ0hKTExKRkZGRT9CQz48Qkc/Qj9BZHBzd3p6e3t8e3p6d3t3eX5+fHtxc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRD05Nzc5P0I+Oz9BQEA+QERJRUNHR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTUtMTU1NTExPTlNkTktMUklJSUVBSEpMTU5KR0lHQkFCQD9FRkVIREtub3Z5eXl7e3p8end0eHV4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4Ojo/Qj88QEJBQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVDS05SVExKSU1UR0lJSkxJS0xJSk1NT1BSUEtHQ0tHQ0JJSUxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent6eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxSEtER0hIR0pLSUpLREZCPT49OTk6O0BCPz1CQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESElMTUhKTEhJSkxLTV1SSEhETkZBQ0pKTUxQTUtNSktGR0dKTU5RTkxibWl2dnd6eXt6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo6QENAPkJDREVJRUlKTEZJSUdGRkRCO0FDQz5AQ0RDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJR0VOSEJGTUtNTE9NTU5NS0hISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJREZGRUNDQkVAREE+Pz46Ozs9Ojw+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9REVCPkFDQ0NER0hJR01QSkZGR0tOT0tGSElGRURFSUpISklGSE9LQ0lNS09NT05PT05KSklMUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRD1CQT5BPTo6PT86PT5AQj5AQkRHSkVJRklIRkZHRUNCQUFGRkNCQkJERURHR0lGTFFMSU9KSkxMSUdIRUdGRENJSUhLSkdLUk1CTk5NUE5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JlZmZkaGhmbmpmbW1oa2ttcmlxdnRzcW12bm9xcnN3c3JzdHV1dnZ2d3Z3d3Z0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQURFPEFAQEM8ODo9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0dFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUlBQUU5PTU5QTUxNU1dWWFhVWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkU8P0JCRDw3Oj4+Oj46QEI+Pz9DRUZERkRFSEVERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdOS0xLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BST1FNTlFOTVBXWlZaWVZaXVlYYWBhYF5oZWNgZGZoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V3dXt+fXh2dHd2dnZ4cGx1cG1zdG5vcnJ4TkhIR0lEQkNIRTxARUJFPTg5Pj49PDxBQjw/PkFBRkNFQ0NJRERFRUZHR0dJRkdLSERJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOS09OT1JVVk9LVVdTUFNRUkxPUVBPVFlaWVxaWVteXl1gY15cYWNrYmBkZmdyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRMSUtJS0ZCRUdFPEBHQ0RAOjw/QD8+P0JBPEA+QUFGQ0VFRElFRkVHRkhIRkhISUtKRkpISEtIRkZMSUhISkdMTE1MTElNS05NTU9MUFBRVVZXT0tWVlVTUlFRTE9SUlBWW1tdXltcXl9fYWBhZF1jYGVmYGVoamNzc2ZqZ2drb3Jxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkVGSUZJRkdESUlHSUhKTEhISkpJTEpGSktISUtKR0tLTU1KSk1NTk5OUEtPUFJUWFZNTlRWVFJSUVBMTlRTUldbXV5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21uc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S0xMTE1HQ0NBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHQ0hJR0hKRklMSElKTUtOTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW5zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSEpJSUtISkpOTE9LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RFS0ZFSk1MS0xMR0dNSUdKS0hLS0lLS05MTkxMTElMTExbc2JkcF5sbVVNTmZzXWZmcWxudGdwaV9hWW5uYnBwYmtqamZvcXRldG5vXG91Z3BNSnF5dmthYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ0dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQkZDRkVGRURDSEhHREVLSEdMTk5MTUxGSk5ISktKSUxKSkpLTE1OTk1NSk1NTltyb29ucHBsa01QUWxXTWlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBdX3JrcWpVdXl4b2Nea2ZiZ3BwamlvcHByc3BxcHFwcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkdCR0RJRkVFQkZJSEhFSExKR01NTktNTkdMTklMS0lKTUlLSkpLT1BPTk1MTk5MXGhkdV1scVdsTlBRbVRZa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDR0RIR0xIRUNDSEtJSEZKTExGTkxMU1JMR0xMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXJrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJpbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQT5EREJHREhJTUlGQ0ZKTEpHRktOTEVPSktXUktHS0pKTklISkxJS0pISEtNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam5fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVDRkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJR0tLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpKT1BRZHFpVFlXXFtcVllbXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRUFFQ0BESERGR0NJS0xIRkRHS0xJRUdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUdISUVGTElKTE9NSlBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUktZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRhYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkRDQkVJRUdHRktKS0hFRklKS0ZFSEhQS01NSk1SSUdFQUhGSklLTEpMSkhGRElGREZHRUZKSENKTktMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl9cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDR0hGSEdIS0pKSURGS0tLRUZJSk5LTktITE5HSEU+R0dMSUtMS0tLSUdESERDREVBRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWFVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0eHl5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUdJRkdISEZGSUdIR0hLSUxEREtLTk1MS0hLSkhJRj9HR05LS0tNS0tLSUZHQ0RAREFISUI/SUpIT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFFbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0dJR0ZGSUxKTkZES0tNTkpMSUtKSEhGQkhIUU1LS09MSktJR0dFRD9FQ0lJQkJHRkVUXVleWF9ZX1tdVVhYT11dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWEhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4iHhYOAfHhcU0tDQUhGREdNUkhDUUpFR0hIRUZLSk1QRUZJSktOTExJS0xJSEdESEtRT01NUExMSktISUNEQUVESUdDQkdGRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdT1lhXGBgX2JjYl1hYldgX1RQT09PWFFcW1tcXF5fYmZmZWxlb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlKS05MTEtMS0lKR0VKTlFRTk9PTU5MTUhLQURBQ0RHRUNCRUdCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU09MUFNSVVpZV1lYWGRXT1NUUFBOTU9UU1pYWFpdXGBhZGVjZ2NrbHBzcnl5f3t6f4SEhIWEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTEdISkhHTUxRUUhMS0tLTk1VTk9KSktHR0tQU1NOUE9OTk5OR0tGYEVEX0xFZmRFTlxJXltybU9NVW1ZTERRYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUZHRkhFRUtPU0lKRmBUSElPSklPTVJRTE1MTE9SVVJPT0lMTUdITVFbWU9QUE5PT09JSlF/UUl8WVlydFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW19WVlh/anR1dV5fdl5XYVtbZltfYGFgYV1gYWdtcGxgcHd0eIGBgoODgn99f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExGSUtFUVZMS05JS1JYV1FOT09NUVROT1FPS0tOR01QU1taU1FST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3NvcnJ7fG9+eG6Acl9gYGJhWmBfZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTktHYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOS09IUVJUWVdWUFRQUFBRS0hneGxjeHJtW0tOVnlwdW11Ym92UGVlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp+bHh6f29ob1l2dmp2dXCAX3JmfWlseHxvXl9fYmFbXWJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3F5e3Nydnl+gXN1em58fXl4cm5OS1N1TkNCRlBQSEpLSUtQT09PTVBaYFpXS1RXUGFeUlZRWVJMUElTVFZYV1dPVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW9tanBhY2Zjb3d4b21wc3l/bnFwa3t6dHNvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWFVNVVlVZVhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfWnB6e15genNjcm94cWhkfWlyfF5UTGxgdnVraXV7em1+eGt8cFxeXmJbXmJkZGdlZWViWmNjaWtrcnNydmdsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbmttT0hLS0hKSEhRUExOT0xLUlJST1NSV1JWVFBXWlZWVFRUYV9QTk1LVFNUUVZWTk5MTU9QSkhRTlBVTEtMU1RUU1RQVlVRUU5RUVhZUk5QVVRYWFhbW1VSU1dbV1hYWk9TVVdYWFJeWVdeVlRQWVJXV1dXWF5aZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2JnZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2p1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PTE1WVFFOVVNOT01MUVBMSlFRS1FNS0tQU1VTUVFTU0lITE5PUVJRUVFUVlJYV1xXU1JQUlRVVlNaUU5TUldWVFlWVVpWVFJVVFRUV1hWXFleYF1cWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGlnamtlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBKTldTUE5VUE5RTkxTUE1PVVNOUU5NTlFVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1ZWWVtUUFRVWFVVWlVXWlZTUldWVVdbWFpfXFVYXlxeXVtdYGFeW2JiY2dmZWRiWF9hYl1gZ2RmZWFeX11dXlpaYFpfZ2BeXV1iaGthZ2ZoZmRgYmNhT0xNTFFRTE9UT09TUU9RW1lXV1hbWVhYVlxqZFZYWVpXVlNTT0pOVlRQT1RQUFBNTVJSUFJYVFFRT01PU1ZPWFJUVVVPTk1RVFZVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFdWVlZZVFhYVlNSWVdVWl5ZXV9eVV5cXmBcW19fX19aYmJkaGdkZGFYYWBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1hWVVdRTE1WU01OUk9RUk9MUVNSVVpVU1BQTVFXV1JXU1NTWE1PT1FUWFZVVVNVWVhbXl1bW1ZRTlVWVVtcV1JUV1ZXWFZUWFtVVFJaWFdcXlpeX2BVYVxhYV1gYl9cYF1jYGNnaGRmYFljYGFfX2VkX2BiW1pcW1xZWllYV1xaXFtgXl9bXl5hYF5jXFlgWlFOT05WUVBUUU9UVFNQV1xcXFheXF5XXF5qcXd5gGNcW1VVV1FNT1ZTTlFRT1JUUkxSVFRZWldVT1JPU1hXVFNVUlJaT1BTUlZbVldXVFZbWFxdW1tdVlNNVFVVXFxWUlVWVlhZU1VaXFVTU11YWl1eXGBgYFZhW2NiXWFkXlxiYWJfY2ZpZGZeW2RgYWBgY2VfYl5ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdcVFdXUU5SWlNSUVRSVFVUS1JXVltaWlNPU1FWVlZUT1dSU1pSVFRUWF1XWFlTWF1YXl1ZWl1UVU5VVldeW1hSVVVZWVlVV1pcVlRXXlpdXWBdYmJdWV9bZWFfZGReXmNjYV5lZmlkZl5dZGFgYWFiZGBiXlhaX1tcW1hYWFdXW1lbYFxbW1xbWFpbXlZeWV1RT09SWlBaVFVWVlNUVF5eYF5eYlxgVV1eYmt5dGx9a1pVWVRQUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVFXUllYWV9bWlRVVlpZWldYWlxXVVteXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNOUFZZUV1VVllXV1VYX19hYWBjXV9UXV9iZWV1gXpoV1lZU1VTVlxYV1dWVlddWE9VXVpeXVxUUldTV1dVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVhUWVpaYVlcVldYW1pbWVlaW1lXXl9gX2NiYWRkXGJcYGZhZGZkXl9kYmJbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5TWVZTXFRWV1lWVlxgYWJjYGNeX1ZbYGRhX3p1b2hZW1lVV1RXW1paXFpYWWBXUFVeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19aXV5ZXVVSWVdZWV1iWl5WV1tcW1xcW1pcWlpfX2BgZGJjZGRiZFlhZmJmZmVeYWJgY15iY2lkY2dfZ15hYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TT1ZZVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXltcWlZXWFlcXF1fW1lbYlZUWF5dYWNcUlZZUFdXV1dXVlNVVFhcXF5gYF1gXFdhXlteW1peWFVYV1tbX2BcX1hZXFxdXl9cW11ZXGBhXmBlY2RlZWZiWGNlZGhnZF5jYGBlY1xlaWRlaV9mXWNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1lYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXF1eYGFgX2JeWWFdXV5ZXF5ZWFVXW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmVjZWZlZmJaZGZmaWdiX2NeYWZkWmloYmZpY2VeYmJjYWBgX11cWlhbWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lWXFtcXVpXXF1fYGJkYWJhXWBYYmNiYGNhYl1bXFtYV1tcX11gX11bYGRdXFhbYmVjYVJcWk9ZWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXVlZVFhdXV9gX2BcW15eYGJjXVxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxjZ2BcaWhiaGllZGBiYWNhX2BfXV1cWVxZWFdYWVhXXFpaV1dYT1haXWFjZmZya39KWVdcWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWVhVW19eXWFhYF5bYGFiZmNfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgWmZnXmFoaGJoaGZjYGJgY2JfX19cXVtaW1lYWFhWWlZcW1pWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeEgoKCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3p6enp6enp7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t6enp6enp6ent7e3t7e3t7e3t7e3t9fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiJDM09LS0tPVnoaJiYmJiYuNjIyMjI6Jf39/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyKlN3m5OTl5OeliYyMjIyMj5CPj4+PkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl5eXp4b29vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9g4SEhISEhH58fHx8fHx8fXx8fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z3enh6enl9eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t5eXl5eXl5ent7ent7e3t7e3t8fHx8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnl9fH19enx7d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiY2MiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en19fX15fHp3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYOEhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3Z7fH18e3p8e3d4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6eXp9fH18e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHt4ent5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoKBgoKCgoGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhYSDhIODgoGBgYGCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh5eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3h5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIKDhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIODgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGBgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKBgoKBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FxcXJzdHR0dHR0dHNzdHNzc3R0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5ubm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKCgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3NzcnJxcXBwcHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnFycXFxcXFxcXFwcHBwcHFvb25ubm1tbm5ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKAgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXF0cXJycXFvfoJucHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcIeIcHJxcHSagW5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxfaKDb3JvjZ98b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcnF1nqJ3cXegnH1vcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFxcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGYqZBvgqOdfnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOBg3lyc3NycnJzcnJzc3NzcnN0cpOppHuJoZ18cnNzc3Jzc3R0dXV1dXV0dXd4d3d3d3d4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn+Afn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH59fHZ2d3d2dXh6eHh4eHh3eHl5oLSppqmpl317eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/f39+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3x7e4qvpKG1qqyjf3t6enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19maWWorGgmaeUfYB/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYGcnI2gsKCfop+AgIGAfn5/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBgJebkJixoZiVnYV9fn5+gH5+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqMjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn9/f39/f3+Afn6AgX5/oaullqSbm5iioId/fn5/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIGBgYODgYGBgoOChISHj6Gyp6GgmZ2dpqisqaGakYeBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OGjZ+tsaabmqCbnpycnqGko52UiIODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KDipeZl5aYoJudnp2ampeQiYaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+QkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYaOlJOXmpydnJWPiYeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOTko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4OIkJSOlJiRh4KChYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoGCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRk5KQjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYGBgoOBgoKCgYCHm4iMh4KDgoGAgIB/gYCAgICAf3+AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CBgH+DiY6AgYKDg4B/f3+AgICAgICAgIKDgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2JhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4qWiISChIKBf3+MlYKCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYaEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSDg4KDgYGEhYSDg4OCgoOEhIOEg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKQjYyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGQjIOBf359fH2MnI6AgoGBgoKFlJSMgYKBgoOCgoKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWEhYWEg4OEg4SDgoaUlJKUko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX19e4GYjICDgYGBgI6UjJCBgoGCgoKBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBlZ+Kfn6AfYeLfoSEg4SCg4OCjYmFjIKCg4ODgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn99fX2Ag4SDgoOEg4SDg4SEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhoaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjYqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/f39/g4OEi4aEhISEhYWEhISEhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAg4+XhoWGhYWFhYWGh4eGhoWGhYWGh4eHiIaHh4aGhoeHh4aGh4eGhoaFg4OEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuIiIWGhYOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH+BlZaSj4iIh4eGh4iHiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGh4WDg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qKnaekmIyJi4uIiYmJiYqLioiIiImJi4uKioiHh4iIiIeHiIiHh4aHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUkpCPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn58e32Zp6SimI+Vi4iIiomIiYuKiYmIiYiKiomLiYaGhoaHhYaIiIiIhoaHhIODhIeIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fIGcoJ2dnI+GhYaHh4eHiIeHiYeHhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYGBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KDgX18fX+Af35+fn18fX58eoOcm5yVhIOCg4OEhoWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKCgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImFhIWEhYKBgYGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+BhISDg4OCgoB9fX+AgIF/fX5+fXx9fXt6eYmbm5eFgIGBgYGCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICBgIGCgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KEhIKDgoOCfn1+f4CAgYB+fX19fX59fHp6e42alYWCgH9/f3+AgH59gH9/gICBf4CAgX9/gIGBfn19f4CBf39+f4CAf4CAgIB/gIKAgIKBgYOBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgYOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Ag4ODgoKBgX99fX5/gICAf359fX18e3t7enp6e4+TkZqPfn5/fn5/fn+Af35/f4B/gIB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6enp5gIyMjIuBf39+f39+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9+gH9/fn9/gIB+foB/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6enp5f4WAgIGBgoCAgH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgH9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFgoGDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fXx8enp5eXl6gYKCgoWDgYKDgYCCgIKBgYODg4OBgYKAgYB/gIGDgYSCgICBgIGBgYCBgIKCf4GAgX+AgH+AgIB+f39+fHyJlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgICBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWEhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eXl8goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgIGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgYGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHh5eXmAgoN/g4yEg4SEhJeXg4OEgX1+gYGCgYKBgoGEhoiMhYOCgoGEgoSDgoOFhISFg4OEg4KDg4KCgoKDg4KCkZCLiIiHiYeGhoSGhYSEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4eHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5eXyBgX6IlYODg4SElJOAgIF/f39+foSLgH+BgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhISEgoGCgoODg4ODg4KBgYGBgH+AgICAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6ent8foGDgYKBg4KAfn1/f3uIkXx8jpZ/fX9/goaKhYODhIOCg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDhIOBgYKCgoOEg4ODgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl5fX1/gH+Bf317e39+fYKVkX+EiH18fn+ChHx8gYKEg39/h4N9g4GAgoKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OEhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx/foqCe3p7enh6e3t8fXx+fn9/fn5+fn18gIGAfYaPgX59gn5/foCCfHyAf4KAgYB+fXuKgn2Af36BgICBgoCCgICAgYB/i5SPjIyOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeFhICGlIiAgoGBgYGAf39/f4B+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF/gIF9f3+Af32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fH18fH2Af4CAfoB+foKUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fX18e318fHx7fHx8enp5e3x7fYWDg4CBgX6Af3+Af4WCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGAgIGBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fn+AgH+AgH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoWDgICAfX59fn9+jISBh359fHx/foKCf319fX2BfHt9fH6BhIOBgH5+fn59fH5/gH1+gH5/foSSjY6Mj42MioaEhYSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgXp+fnx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1+gICDg4J/fn98fHx9fH2Bg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8fYGCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoCCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXt/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+fn9+fn9+fHx9fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHp7fHt8fXp9fn5/gICDh4mJiYqJiomFiJKPjYmKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fX19fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLi4mMkZCOiomGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgoKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn59fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7e3t7eXp5eXl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYF/gYGBf3+Af4CBf4CAgYKBgYWDhIKBgYKBgoGAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH5+fH19fH19fn59fn98fX17fH1+fHx7fH16enl5eXl6e35+gIGDh4SIj46LioeFhISEgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChYWEgoGBgoGCgX+AgoSBf36BgH1+gX59fn+AgH1+gISAfn5/fX59fYqFfX5/fX5+gH58fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImOi4yIhYWFhISCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgYOBf4CBhIF+foB/fX6Afn1+foCAf4F/f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fH17e3t8e3x8fX18ioqJiYaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoGAgICDgH5+gH99f4B9fX5+gIB/gn+BgICAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2CfYB+goB9foCBf3x+fn19fXt9fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX6Af3+BgIGAgICAgYF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhIOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fX5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SEg4GAgIB/gIF+fX1+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn5+fX9+foWFgYGBf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/gH9/gH19fX5/fX5/f39+fX58fX1+gX9/gH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Ag4KDgX9/gYGBgoGBgYGAgYCAgICAgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9gH5/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISDgYOCgYOBf4CBfn6AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fH1+fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhYKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fXl7eXh/fnt8fH59fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzd3ZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH+Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn17f32Afn19f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19foCAgH9/f398gH9/gYCBgIB/fIB/fn9+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t/hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GAgH99gH5+f39/fn19foCBgYB+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgICAgH1+fn+AfXx+fH+AgYCAgICAfH9/gH5/gYB/f32Bf35/f359fXx/gICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn59fXt7fHx5d3t5d3h3d3h7e3t7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fXx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIKAgICAfn9+f399fH5+gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn59fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoCBgYB/gH9/f319f36AgIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af36AgH9/f3+Af4CAgICAf4GBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eoGBeHl8fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e319e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx9fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gH+AgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgYCAgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fH14eHV4eHl7fHx9e3x8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYCBgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH+AgH+Ah35+fHt9fHt9f3h3dnl5ent9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4CGg4OEgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgIGBgIB/gYGBgYGDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99e31/e3p2enh5e3t8fX17fH19fX1+f4CBgICAf4CAgIODgHx/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoKCg4SCg4SDgIGDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgX9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHZ7hIKDgoODhIKEg4OBgoKEhYSCg4ODhIGEg4CDgIGDgoKCgoKBgoB/gYCAgoGCgYKCgoGAgYGBgoKCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SAgoSCg4KCgYKCg4GDhIOEg4SEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF/gICAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhIGCg4WFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODg4ODhICChIOEg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgIGAe32Bfnx5fHp6en18fIF9enx8fX18ent+fn6Af3+BgYCAgICAgoGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgYKEhoSEg4KDhISBg4WDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgIKCg4OCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH1+fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgoKBgYOCf4KDhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX59fn5+fn5/f4B8fYCBgoKDg4WDhIOGhIGCiIaFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4ODgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn9+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChIWLiYSEhISFhYKHhoaEhISEhYSFhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WAfYF1gXqEf39/foWEgoODgoGDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fn6Bg4F9e399foB+fXx8fH19fX18fX1+gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn9+f4KDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WEhoiGhoWChoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXB7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX1/fnx+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnVmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f35+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSFhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFhIWFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6DdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/f3p+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYKAfX9/gX5/fn1+gYB+foGCgICChIeGg4OGhISEhYeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIWEhoWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdweX19bX11b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH18f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWFhYWGiYqHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBhIOEg4WDhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFg4SEg4KBfn9+e3x7fnx8fH1/f319f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4mGhIaFh4WFhYOEhYaFhIaGh4aFhIaEhYaGhoaEh4aHh4aFh4iIiIiFhYeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOEhISEhoSGhYSFhYOGhoWFhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fX9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWDg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaHhYSEhYWDhIeGg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiImIhYaIhYaHhoeGh4aHhYiIh4eFhoaHhYaGhYKEhIWGhYWEhISDhIWFhoaGhYaEhoWGhoWFhoeFhIOEhIOEh4OEgYKEhYOBgICAe3t+fnx8fH59fHx8fX58fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaGh4aHhYeGiIiHh4WHh4eGhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX5+fHx8fn18fX18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaHhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeHiIaGiISDhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx+e3t7ent8fHx7e3t+e3x9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYWEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHiIiHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhIOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn9+fn9+fnx8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhoKBgn96hIx7gISFh4aGhoSEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiIh4eGh4iGhIaGhoeFhYiDhIWEhoaGh4WFhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDgoJ9gYF/foOBfn9/gHx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiIaFiIeIh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhYaGhYWGgoODhYCAgYCAg4CDgHyBgH5+goB9gH+BfYB8fX59fnt+fXx7eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDhIWHhYSDg4eGg4SFhIKFiIWChIODhYWFhYaHhoiIhoWIh4mHhoWFhYOGhIWHg4OGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAfIB/fX6Cfn6AfoB/f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4aEhIaEh4aGhYWFg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH59f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp6e3t8ent7e3x9fn19gH19fHx9gH99fIaDhoaFhoaDhIOFgoWBgYB/f4CAfn+BgXx+f39+gICCgoKEhIOCgYKEgYCDgoGAg4WEgoF/gIKDgoSFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoaGhoWDhISDhIWFhYOEg4OEgoSEgH+Cgn99fn5+fn+Efnt/fHyAgX2BgH1+g3x+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/fn5+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBgoaFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGBfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9f319fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB+fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYCBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fHx+fXx+g317fnx9gH+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pjw+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE9MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1svLy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88Ozk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkeo2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbLy9DR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX2NnY2NjY2NjY2NnZ2dnb3Nzc3Nzc3N3c29vb29va2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU1Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWy8yVhYaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4t6mnp6enp6enp6enp6epl4CCgoKCgoKCgYGBgYGDi4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlNiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18vMblBTU1NTU1RUVFRUVEyg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6Ojo6CHhISEhISEhISEhISEiGdAREREREREQ0NDRERDRlNTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CQDk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fLzHFVWFdXV1hYWFhYWFhRofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWiioaHh4eHh4eHh4eHh4pqRklJSUlJSUlISEhIR0pXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw7Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzM14XmFgYGBgYWFhYWFhWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqampp5COjo6Ojo2NjY2NjY2Qc1FUVFRUVFRUVFRUVVRWYGJiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ojo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2MzMx8XFxcXFxcXFxcXFxcXK0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Oz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLQ0NDQ0M/Pz8/Pz8/Pz83KysrKysrKy8vKy8vLy83Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ozg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjNzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7R1M/PztLSz87O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXW19fX19fX19fX19fY2NfY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Tu53Pz9KnntDP0aWi0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StZWbs9aznqOm1rCgoqrSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/P0Z+gqq7QnZqTncCemJacx8/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pjw8OTY/Qj9COjY0ODo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9HFh5q0wJihnLSYnKKer7HSz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qjo3NDo6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P1qeZtbaZlq25hp6WsLOp1NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PTw5NjQ6OTg6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/KoKO/ypyljKet2KqZqtTPz8/Pz9WlmbatmIGglnibhJ6To9XQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+OTw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDWpZm2rpuoiJx5n6mFmaXV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDQ1aWatre1r6acir2tppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY5OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT0NammrTGo5eXnaWnlpiautXR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhx9LXpZux2J+rpJvQn6ukm9DS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLS0A+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPR1LWCw9XFkI2318KPjbvU0dLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWlqW0xfTUpMSlVMRkI8PD9GRUdLST02Njc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHRw9TR1MfD1dHVxcTV0dLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QURMTEE9Nzc1Ojg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tTS0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9PTc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSUQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNBTEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUUE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29va2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NjU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozs+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e3t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6iop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs7QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKWnp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJydnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QD9CQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3NTc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OSlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6emn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqampKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg5Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz5BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpqaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyfoZ+XkZGQlJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWmpqWlo6CgoaGgmZKQj5abmZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoJ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpKSmpqWkpKOioaGenJuVk5WZnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKio6SkpKSioaGem5qZlqa5n5mZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCjpqGioaKhoJ6cm5ubmaOmkZybnJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgprGuoKCfn56cmZmamp2tYXmdnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpybmpuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKCgn6aSla2foKCem5qZmpmre0OBn56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6foWGWqJ6enJqam5ukn01JhKCdnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52bmadsWqCgm5qam52cr25LTIahnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZilhFR0opqZmp2boaFgWE6HoZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoKGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRcXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmJiZoItdYJGamZudnKOOZVpMgKKenp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1tMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmZ6ZXl9zlZqcnZ2hgGVaTX+inp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmYm2FiYHyUnpyelnNjVU+BoZ6fn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmKBqXFphe5ucnolpXlBUiJ6bnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampaSeHNrWHyVmJ6KW1RQWYuSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGOlZ+fkoCkp5mmmnlVT2SHh4KNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAhaSZi3pijqOSmHOFhWh1f4CCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjkzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+foSih3ZqUHGbjYpXbnl7f358hY6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2ZmHJOR0lzkoOASlxub3aJhYqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GPo4hMMzI7eYR1cj89VmptgZCJiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuip5tfRWROPXl3Z2RINTZUbnGPj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqa6MS4K2hkB7e2hjUl9xUVtviqGhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6iidGjF0qhJgJWMfU9sintaYICjqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKenmZ2kpaOinmKCuL+qha+jmp13R1eBclJzlKKioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqGip6GmrqamnJ5vgpSziLbWppy4sWJQtKNWZJChnqCgnp2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKvq6OjiXd/dXjTu6mTnqhsVaGqaF+Hp6CloqGdn6KYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e3tbS2sqywrZCIf2yYx8SXnKqSdlppc3V1f5KlqaekoJ+jm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKqyt7u8vLq6wrm0s52EdF5RnbCvpKKRhHduc3F3eHl8gomOlJmgpaespqWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1uMPJ0NTRzMe8r6GMbWNSQ4ONfn6AeXVvbWRkaWdqcXJxcXFyeYmpx8e8oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxMfb5OPXx7mtopSEb1dYUERhcmdrcmtoY2VYV1xXW2BoaWdkYGySusC/uamvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca+y8/Uy7mlmI+CblpQVEpDXGZdYWhkYWFpXFRYVVdYWVtYX32huLmrtLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnVycnVyZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEvsPBx8vJupd0X1JOT1JHPV5sYF9lY2FeZGNUVVdWVFVdf6eur6qoq62sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDubfEo2pMQ0VKRD1ZYWFkbGRhXGVfWVNQUFVhi7e5rK6lpKOnpKCgpZmptLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn52Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7d25raWh2WmdyeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExMTCxMGzkFZITUY7SVhfaG1oX1xfWVpUUF2Nqqy4tbKsqaOhramsp62frLS0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnVlZmpqaF5rb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwsijd2BIPz9BXl1ca2RbWFZSXYiour66vLq8rK2mqbu6ube/s7W4ssHGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FodmhqanRueWxeZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcbGx8K1gV1UL1VZXWxfUU1XhLnKx8LExsC8vrSwsLDCvr7BxsC+t7bDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjouUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfXhwZ2BrandtaWZ2b3RjXWNVV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcHCwsXGnE5SgImVVVSDtc7Sxba/v8C/uru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eYBzcGZlZ2RsZWJrbm9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr68xad8dICRlHW8zsfH0MCvvb24ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZWJhY2RkamNnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMnPwLq/wLy7xb26wMS/vb6xc2GAkYmKz8S/wMm+sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjZ2pnZ2pmal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HUjLi/u8O1use2tbi6vLi5trO2no10hMm/v7vBvrnGvcK/vMW4tre0uLa2u7u4trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZnBqZWxoWVlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPw3aozL3Ht7m3rba0t7mztbG7xseWQnzKvr++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnFncWt0ZmNuYFxVSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE161zgLvIz8LAuK60tLu9t7mwvcPIjEZ2zcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxqbnVveGNoY1xjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLGydGYcHOs0dHMysS1ur/EyL6+tL/Av3dTb8vGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdHBtbHRsbG5fY19iYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysnBhnFzpczMy83KxsLDy87BvLi9urBvZGO7yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFjW19gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vaw762vsC+vrqmnKmytsO/pXh1eJvExsvIwcPAwMnKwb+7ubGgfnNsrcjFxL/Awb/Lx8PAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7Sztbitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLdtrc69trnAvKx9bmhubXKBlZhyd3yXvb/GwLnAvL7FxL29uLGwmY9+gpzKwsO8vb+/w8O/v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbG3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3BvalxgYVpTUUFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2ydYGzvba1wqWHaVpeYE1SW1puc3aBn7i4wrqzu7e7vb+6u7uvpJqXiJJ+wMTDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vLSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dnducmFfZl1bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJp4R4iqCvtZ1qZWdWWWBJSU1QU2x2hqWwt765srWyu7m8trm+tJWcppehcq7JxMC9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xaqIfHWMoJhgVENYVUdhalZPRUpgjaCsr7a6tbSyrLy5uLW4wb2Kl7ChpnOly8K/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLbEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c25jXmdZXV5TT05BP0pDQUtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL60kIJ4iI9vTko/ZFlCTneAlGpOQFyBr7WztbK0r6y7uri2ub/FdYGpnZpkp7+4tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlyd3NtdWpsXVxrVF5cUE5IREdNQkdORzg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR7WEZBTodZSkpYd42BY0BTo7mztLKwsa2wubi2u7e6vI+hsaukc6uwqautq6OooJ2enpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlodXRvZVVhZFddUk9NSUBJUkROQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsryqmZmVaE5AUnhwUElJS2ecgFlEUq67sayzr66srba2srS1rqimnpqbnZ+mqJ6gqKmfoaeWmpaXjp2TjpCWjZebpKigoKKioaWlnKOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqmkqaumqayrpqGIeIN8dn96Y3dtbl1RaVVQT0dQTU1DUFJAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqWmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqulvWhFUp2CUVdJSmBKVI1gY2KBrrWqsrSuqquvsLKzraWdkZeTj5egn6KgnKOkn56olJqVlouWkY2Pl5KYnaKqn5+foKOlqJyfoKGcoZ+jqKecp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyWk4+PkpGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnyAdXZ9bmt7ZGlWUmROSUhHT1NOS05IPEVAPTJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra2urm6t7e7rqigoamgqsa/y6BQQXOdd1BuS0tjZnRzX1pecJCxr66ztaqmrKyjm5mUjZGVl5iYnJ+iopydpJ6apJaXl5WPkZGRkpqXm6Ckqp6hoZ6mp6uin6Cnn52fo6aonqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6arqqCbmJiYlZOWmpOVlpqWm5eYmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXyAfnd5fGV5emBiU1ZhSElLS1NUSlNRTTk/QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTHx45XU0plo1plfm9yXFFrY1tkX1xqj7SwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6KYmZeXmJSZmJadm5+lpamgpqSep66uqqaisaOao6amqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblZablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgmxmW1NbWk1RS09PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeq6SMeVVpcnZ1cGN2dlhXY2BjZ1hXVmetrqyvp5+eoqCWkJOboJyZl5KTn5yho5qem5aemp6XmqKdpKCeo56kqKytqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO1uLO4rbK0pKCdpaCsoaGioaCamZaWn5ubmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHZqeHVebVtSYUlSVkhGVldKQ01IPUtJOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqaiuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boqGgo4BugnBgY1hMW1NaTUxQWFJHTExHmKyqqaWgn5qSkZSYmJaWloyIi46UnZydnJ6WnZmmn6CnpbCppq2iqq22sLWysK22uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5t7yvs7C1wby3vrOztaKsoqmpsqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaG5cWFxDV05KR01IQ0ZOPT5MPjQ8OjY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamplJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn52KYVdeZWBXTVFHPj4/Q0M/PkJReKmtqaqmoJ6foqOdnp6anZuUk5WUnp6YlIWenaCZq6Orsa+5sbGwsbC6vby8uba4w76/wr+2urvAw7m9u6yup7GtscK2uMLGwMjKwMm/sLm5vbjCvri0u8bEvcO8uLSqs62qs7Svs66qrqOerKi2sq2jsKaho7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIRUpQST9FQjRGSDk2PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+VfF9eZWBRR0Q8Qz5FPD85Nk5+qrOnpKOioJ6lrKael5yUkZqemZWMioaIhnhsiqWioqursry2w72+srvBw8LFv7/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcbMzMzSx76/wMO+x8bCuMTKycTBx7+6tLq7tbu3sLayq7uyr7y3v7u6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOVlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZVpcRkxNRURUTUVCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxAP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXNqYVdORT5JWXxvYkI9XI6urKCZm5yenpmXl5iSjY+Xl5SPjZCMgoOCdnJwbXCHpayttLjEus3Hy77CzM3NzMfI0MzMzMfKxcXM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbHxsrIz8DJ0c3HxsjGwrzDwb+/v7W+s62/wMPDx8XHxK+/ubK4vcTCwrq8vLWup6euqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl1c2ViZ3JvZ15aWkRPTUNFUElEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojs+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpudlmtmXVRJREA/S4aepZqEoLKto56cn5qYl5STlJeRkI+Mh4SEiIaDgIGBgHlxcm9reKK2u7m8ysHT0tLIzc7R09HR0NDR0c3NztDEzdTV2NHXzcbHyczDxcrPytLX0tfS1dbT1MjMx8zNydPNztPNxsnKysLGzMfJyca/w7OzyMXLy8vPx8q/vr+9wcfFzMzJycDDwK6ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amVWWFJETkdASVFDPkI9OjIyQTxFPDc4PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZxjVExKREM/Q1Ku0b2yr6acnJygpKGdmpSUlZSKfXhxa2ViaHJwcnuFioB1cG1xcm+EnK28x9HR19bV0dbN1NbW09PR0tTU0s/Rw9DT1tjV1dLLyc7Qy8bN0srS1dfZ1tjT1tjN0srP0czP0c3T0MDJyMvEzM3Mz8/Gx8i2wMvA0s3M0MfKyMDEw8jPzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2FlcmNdUlxKS0dBRklKPztBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaWloKKiW0lAQURBRlF2sq+mmpSXn5yaoKCem5yalYl3aWNhX19fX15fX11hbHVzcHBubHBvdYB3mLjV19bX1tPXz9XU2dTUzs/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NfX2NLY0tfZ1dbMz8/JzdLMztHAx8TJx8/O0tHSyMzNwMvNxtTPzM7JxcvHx8nMy9TU0dXP0szTwrnFsaWota6om6irpZ2yqLCzrKyTj5OOiIqOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlFgSkpDRUNTTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqeqqKGjrGZDOD0+RFiCqqifl5WXmZqcn52Ym5yTfXFlY2JfX2FfXmFgXmFgX2BlbXBwbWtucHR5dml8qc3U2NjY0cXT0tfP087L0s3V1NHKz8zT1tLR1s3P1dXRxdHTytDU1dbO09HY2NjXy8jOxMnPzcrMwMnBycrOztDM0M7OzM/PyMzQ0cvOy8PJx8rNy8zS087T0tHQ0Mq9yLmwrru5tau2sK2ouK2zv7uxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0lGRkRNWUU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg/OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLJ7SEZCO1eNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGBeX19eXGJtcW5ucnJ0dXpxYm2ex9XU0KTKz87Tys3OxM3K0tLOxs7MzdTLztLNytbW0MzR1MvM0NHTys7R1dLV1srAysHGzcPIysPNxMbJy8vPy87N0M7UzMbJ0M3Jx8vGx8LGyszO0dHH0M/OzszQxcfBuLm9w8K9w7mysr6wu8PEtaqYpaGYlpGVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR0xJUVFCO0Q/OzY4Ojg6OzU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvcHePmo2Ml5WQk5GRlZaVkIt8ZWJiYmBdXmFjYmBfX2BhYWBfXVtdZ3FxcHFyb2txeXRlbp/PzZuX1snDyMjFxr7Cxc7Ox8XGzcrRyMvNzcXQ0s/NzNTKx8rOz8fHz9LL0M/FusS/xsq9w8fJzsXDyMDHzsjEzcrM0MjFxdDJxsLGycW/wcjNzMzPw8rMycfM0MXFyLvHw8nJws/Bvby/sMHJx7m9qrGyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSUhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChaKqk42Nlo+Fg4ODgX2EhH5zX1teXV5gXmBjZGNfXVxeX2BgX1taXGFrcnBubmlqbW56Z1WAwKJ5u8/DuL/Curq6uL3IxcHDwMPHysjIycfAxcvGyMrNycTBysnBwcvPxMvIv7nBvMbIvsDGz8vEwMO7ysfIu8nGxcrBvsLLxsXEvsa+vcHExszGxry/ysPFx9LFwcnAysrGyMbQw8PGw67Ey8fDyre/vLqzqaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQkdETERGUkA1NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai+uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtmxeeXyfkYqSloZ6gISFf3V4dXJwX1pbXWBgYmNkZGVkYFtcXl1eXmBbWVpcYm5xbmpoaW5tc3lWapR7q8PFwK61uLCxsrCwwbu7u7m4wMHBxL69ub2/ucTJxcbCvcbAt7vDyL/Bybu2u7vFw7+8ws7Dxr6+tcG+xLu9x7zDurW9xsTCw7fAtra/v7zNxL22usi7v77MxMLGw8bJx8nG0MbCzMiyx8nDzszAxcO/vLK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUVCRkpBOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstau3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrPxcnFx8G6xb2srqZgY3aBkouIi4R4f4aGf32De3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF1ncnBsZmVsbW97eF5mkse5v7esr66lqKyqpbeztbOys7S7tb2xt7C1rrK7wrvBxLy/urSyur7AuMi4tLy2wMK9uL3HwcO7ta+ztbu/tMW4u7Wsub2+wL2xu7awt7qzxr23r7y/tbe1xb2+w8bAxMbGx8vFv8bGu8fLv8/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKR0JEQUVGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CZW2dviI6GiIl6eH6FhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX15cW15cXV5aW1tcX2tvbWdlaGtsb35taLq4trOuqKulnKCnpZypqrGsqaups621sLKoraass7u6tsO5urmwqrS5u7PCua/Asb28u7W7x7nDt62qqLCywLa4vbCxqLKztbu8q662p662rryysaq4sK67rru4u8DBvrrDv8bDxcC8xsHHyrjFx8W/x8PDucTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTExNSkVBQz9GQTo6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHEz8fNwcLGv8TEw8PKwsnKv8C8wrqztbXDrqqwkltpfpKIjo97eH2JhXl7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpaWlxkbW5mZWZnaWtweom3r7Sso6KkpJieop6YmqOprKOnoauprKuwo6afqq20trG9uK+3r6ituLSzvLezvbC4ubWyvMGywK+lqaOrsbOzqL2qq6irrK61tKaprqGlr6mzpqiorqaot6yxs7e6uruyvL6/vsS/tcHAx8i3v7/Ft8XDwLu/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpTU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvCy767yba9w766yrfBxMG0try2sa+1vK2pq5JjbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tYV1lcX2ZrZWNlZGZobHGCpaSqopqZnqGRmqKYlY+foKeiop+lpaelrZ+cm6SmrLKwtrensKyoqrSrs7mwtrautrqzsLq6sbakoKSgprGorKm5qqWnp6ins62gp6efnKSmrJ+fp6ShobGtrayytbOzsLW8trvBwLK7vsPBsbm5wrPAvcC1uLy9vrzCx8TDxL/AxKCEeXFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG6vbagnpWdoKa6tquzs7uzxM/Jy8LFuLfHwMy/uMq3u8W4s8W4s7/ArLa8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXlxbXFxYWVhYWFZYW11eZGJhZGVlZGhqbIacp6Wilpedk5iflZOJm5+gpZuen6OloqedmqKbn6qvrbG1pKiqqayspLS4rLewrLO1r7O1r7Cqn56fpKKypaaquK2ipqagqK2rmZ+gnpmdn6WamaOcnJ6wqayoqqusrbCyua+4ubqwtry7uquzsrmzvbS3srG2tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU2MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnHuLi/t7LCtLG7u6y5urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXV1hXWl1hY2NkZGVmZ2lxiZCCk6uXlpOXnZKTjZmfn6adm5ykpqGkm5+hm5iura2usqCkoq2rp6G1sLGyrKmws6i6s6e2oaKfnKOhraOiqraroqOmnaamo5aZnZeZmp2fmpednJ2craGsqKOkpq2rs7OqtbCyq7K5tK+qr7Kys7ezrqmtrrK4sLq2ur2/t7OxlIZ6dWZfZl9bWVZTWlVLW1FMSkVIS0lDPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/sp2lo5ilscO1tr2ttLjBzMjGv8W2wcDHzrbAw72zubmyv7axubutsrWvn5qjqqGUmo94f4OEf3hvcXRxaGVkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1ZWWFdYV1VXYWNkYmJjY2NmaXNzR019kJCSk5qTlpGUnZufm5agoKijnp6onJuaq6eusKqco6O3qaGgrqi1qqenrrGkuLCkt6CjnJmZqqahmq25sKOhpJyjoKCTlaGUlpacmZiWl5yVn6meqqSinaOqqrGtqLSsqqets7Clq66zsa+wr6+nqKiyrrK0sLy0uriuo5SCenZlX2FXWVhTUlRLTV5MUExHSExLRT1APj1CPDo3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLrCsb63va2dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyaoamVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dWVVpiYmFhYmBhY2RrcmVnboiOj4+WlJiSkpidmp2Vn56mpaOmp5+dn6agqq+mn6GjtqehoaKps6KlqKWwprGuq7WfoZ2WlamhopStsbGfoqOdnpick4yglJGTmJiSl5iYl56nm6ehopqkpaWrpKWwp6Wjq6ytpqiur6+rqKqqs6amq6+0sa68trGvr5+Se3hzZWJcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G2vbC7sbesnqWmrLi7vMHFurK5tcTJycDCxsXHtsXEs8G/xau3t722vbq7tbKsraiZmZ+ji4p0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlZSVFJUX19eX2BdX19hY2mBj4WFi4mPjY6XkJGToZeelZuepKGspaSko6OinKqrpJqepbGqoaGepaqeqKKfrayqqa6toqKilZiimpyQq6mwm5+in5+XmZOKnZGNkpSWkJiYk5yho5ykoKKVoKKkpZujq6WipKqkq62lrrKppqWmprSmqqits7W0ubqvqqyejHNxcGBbV1ZWUkdRT0haXE9SSlRLU0xFR0lDODs7PTw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuxrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvLG+w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNOUFldW1xdXV1eXmFjbIiKfouBiouJlI+Qj5mZoZqan6eoqqirp6mmo5mlr6SVmaWvqaCcmZugn66ZnKqzn6amn6OjoZSUm5aWkqmprZucn6Ghm5SQjJiNjJGNko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuwpK64paOko6ytqqirr7S3sr21s6uumIV1dGlbWFlTVVJGWExRW1hNVU9QTFFSSU9JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3rqior66bqaist7asvMq7tr+szMbFuMDOz8ezxLu3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWVlZWVxcXF1eX2R6hnyEeYaLhY2Jk42Ul5+emZ6qqKaurKmwpKian6yglZWkqKedmJCPmp6ulpinqpifnZSloJ6SkZKRk5WoqqWamJmenpeOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpaepqKCwsKaxvaefo6y0q66nr7SwubXAsa6wq5F+cnRjVlRVTlFKR1ZQUlJMTFhOS01PUkdOS0FDRkRDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsbe4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucWpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUU1OTVJXWFlYWVhbW1xgaXp0eW+Ch4KLhZOHkZGVmJecp5qfqqamq52nmaClm5KPn6Oal5eGhZKbpI+VopyWlpWHopqbk4yOipCapaeclZWXnJGTiJSOi4GMjYCQi5KSkqGaoKKWlJmYlaKmmo2ZpKepp6GgtLKos7ihnaO3rKqupLKyprW7taussaKKenNuXk5RUU1PRE5OTlBLRk5OSkpOTlFJTUpBSExJSEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrCkp6SqpaCppqSzqqKyw7W1srPGxbe6w8rMxrOtur20uMCvrqmwnqauu6+toJqbnpWViHyEbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVldYWFdaXWFsbHBqfoJ9g3yNgYuHko6RnKCOmZyjoaOYpJehnJWNh5majHONg36Ol5aGkpqQlI6Ne5mPnYyCiYCKmKCjnpCTmJaFjoKUfn50io56kIiTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5imuKalsKGxrpyxvKqpr6mZhHh0ZFZNUlBQTUNTTkxQTUJQUUhJTlNNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2Njo4N0E3eLeho7SopqWoo6WlpqamsqemtMG4r7SwycS4ucDOxr6zrLrBrK3EraiippKdpreto6CRlpeSkH54f2ZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KR05TU1NUVVRWWFpdaWZrZ3l/d3BMVm+NgJSEi5qWiZKQnpidlZSWlI+WioCUiV87Vm98jJSKgIySjI+GhnKLhJaBeYF7hpSdlYOWjpCPg4Z9k3hxcIaNfYmBkI6Ql5qZk4uQip2In5iHiJaemqGgl6euqa2pqZ6WrbOipq2ZrauYqLSjqa2ik390bmBbTlNSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKKtoaamqqCmqaejqrCop7TBubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qZh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSEZITlFRTU9SVFVYWWBqaGJ1fG9NQD5+lZCOe4aTi4OJjJqNlpSJkoeFlYZ5iX9gSlFueIuShH6EjIuEf39tfn+Td3V2eISNmnBRjYiKhnx+eZR2Z3eGiH6KiJWLjpGTl4yEioiUhZuNgoWSm5aenZSkoqippaSem7CqoaSkkaaqlqKqnKGmp4p3bmZeXEhRUVNNSVVNU0lMS09JSEZKTkxNVEtRUU9GSkQ9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpuipp2foa6hp6ilp6ivrKq2vLa4t7PBu7anuci4tqiotbaqsrynnpWOf4mUqZaVi3+Og4J+eHFvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZTlFTVFVaboFucHhlZVlSjoiThnJ9hX97hIuTgZKZi497ho+AdX94c291cHSOjoF6foqrhXp7aHZ7jnBybXiBi42SeHuAe4B3c3KSeGh1hYSEhXyVioiKjYuAf4SLjYCUhHyBj5iUnJaRn52pnqChnaCppZ+dmI2no5Ogn5aen6SBc2liXV1KV1BSSEtYUk9KTUxSSkpKTFBITFFNUlRNRklCPTc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX53hnd8d3BvallLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxOUVFTVl51gXl0YnOKlJeNjXpleH91d36IkHyDmJKAcYaPe3Z7b2t+rXx0kIt/eoaSgHx/dGZ1fIZsb2hzfIqNh4BteXF9cW12j3FocYF+jnBEi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnZudnqGclo2LpZqOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlJPSU9QTEZEPTs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6ipsa+xq7y4q7u+uLOsp5uwp6ybj5acpamkoZiZjoSSeYmPi4t2cXxtdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpZSk5PUVRYXWZwcGmFpanAfXJ3YXp3bXp3h495e4uFb2yMknhzeGlqgIJxlpGMgX2Vf0mSmW5nd36CbWpkbHmFkJKGa3JsfG5yfIZpbXB/c42JhYZ7fn97d3B0dIaCeYF5cHyOi4qTg5aXmJqQk5aWmZedloyDiZ+Si5KNhpCXgHBqb29vWVZYVFJSWU9SVVRSWFVNTkhNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJufpKyvoq2qqLWvrqy0v6u8w7+lopmVpJiejYSLlKGhmJmRk4tzjnqAhoyGdW90bHBsZWxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SVlpRWVtfpoZhmGZwd2N8bmx+eYqIdYGHhXRsmZF0c3xpap2OTHmFk4mEjmYxdodya319g3RmZXV/hISFgGZpbHVrcIB8aHFxfG6TjY97dH59cXFvdW2Cf3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtOUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaPlZmLjoV6hJCYlY2QjJCHcYeCdIiMhnpwc3FvcGRwZ19URklDPjw7OTo/QEFEQ0VHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVMQklRSWKusp5weXVqe2twgoCEgHqEhYV5cqCUdHiAc3SUhzVwnaidj6GhhKKFdnCGe4Z8dIyujYmBaGdiam5ybXCDdWlvWHVwjpuRdm1/e31ucm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jnxzcnFtYFxdXlxaWWFfUk5bWlhXTEhKRklHP0NBQkg/Q0Q9Ozo3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KRgZKIlZGdpKeer5WltKmusK7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dXh4bHdud2NqXklQRz0/NzQ0OTs6Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMOEROUlNESoRzfnp6dH1rdYaHe3yEg36LfXWhmXl+hYCEmYSanGGGqp+dioOQjnp3iH6JiI5zi5ePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1Z2hgW1xeU1xnXldRVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydnqaRoKqgsaivwLK7xbqWjpGTh3qGdmt/i5GDfYqDjox4g4BzoISKfX2Bf3CBfnpodmtSWExARTIxMTM3NjY4ODo8PkFFR0ZHSktNT1FSU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUUxLVFxYUktngYd6iHh6cHuOinl7iIZ+lod2oZmHho6SlKWNrKlIhq6wrouBgJSLgouChJKph4CYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGSGyAd3J5dmhta192fYOIf4eFi3mUnJuJi4iRf3p1inZ8eG1vd36BdXVzbVxeXlxjZFhnZlxVUFBXWVBETEtGT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc3ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeQjpWXkpagnaygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4l+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz84NC5dlnBzo1VGSUtNTVBXYFhvWVtdaIuRhZN/goCDkJF9hYiQgJmUgaChmJSbmqatk5m7sae7x8Ooi4yhpY6TiYGRfHGDnp+RnX93hYWLkIeQaWhwhIF0jIeEinKGgneIgHt2hHxtdXVmf5SOhoiIh4iHoKqilomOl396gYh6eW9na3h+fIB1bGVeW1teal5iZ2BaT0xOWFJRSVBKRE5HQ0pEQ0FEREI8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3gnp/jH+BkI6KmpuknaGspqqusJeRkYShlIR4d3+MlHx+koaSlX+KgJKbjoOAgYyKgomNg3+Kf2xwal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJUUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSElMTEtOVmBjf2ZmbHSamI2YkZGJjI2Yh5KPnYugn5GjqqWjq5OptqKowcKtx694upSafI2hnpmEk4WCjqGflJmRhYqFj5mRlmxwdYqMgpWMjY53j4RxbYWBipaRgoWIcYigloaRiY2PlqS0qJuMlKKDh5KDfX9ramp8gYKDdWNfZWBbaGxebGxeV0tITlJRTUxMRklQQ0RORkJDRUZDPTo5Nj08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImGkIeEiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw3NTI8P1I1SEhITExNTlJebop7coB8nZqapaSgmJ+WoZScnqedqKqfqKypqrWXq7+rtsfIt8jQz76boHBpq6mfhJOShZygmpuZppKRiJWim5t4en6UmJOikpeXgZSee3eVkqqyiIyXn3yUnZuNkZWYo6Glta+ckJinh5aPjYCIbHNzfYF+c2phXmJgYmhkYGhnXFJFSktQT0lJTEZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6MfIqGj5COgYKAiYuKhZKFg4aJgYCHd15iUDQ2MC0xLywuMC8uLy4uMDAxNT5BQU1RUlNRUlNVUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lKTk9RWW2Fj3aUiaCkp7K8t6Otq6umqLOrr7Wxsa27sbO9m7LDq7rJy7fDv7ilorCzrK2qo4uWmISlpqCjl4GmmY2iq6iliIWUpKGgq6GkqI+csYuVo6a3upugoq+SoZ2inY+joauuq7K0oZSkqYiZiJKJlXl6foaAaWJpXWZjX2VkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpblh6hHaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOEgYuFhoiShoKFiYeIh4dxbmFARTY0PDIvMTEwLSwrLTAuLTQ/Q0FNVVBSU1VVVlVOW1BHR0Q8Pj5GSENFQTc7PDVDOz1GS0lHSFFPUFeAkp+DrKKxqbC/xsKpssW1q7K/sre9tb+0wba7uqO4xai1yMe1vbm0qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6orra7srqssLWisayxtbu2tK60n6ano6eaqa+ssbi3uKaataiMpI6Qkp+GeIGFd1tjZVdnY2JkYWFnYFtUSkRETFVRSElKRElHRUFAQEtEQk1HPTg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmJXeXVwgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhIGOf4GJj4Z/hoiGioeQenhuXVZARU48Njo0NUFCNzY0Ly82Q0hCUVtPUVVXVVxXUF9VSUtKQT8+R0tGRkQ7PkA3RDc/QkpKRUZWVFBejqOsorGzwbS2wMvItbvEvbKzv7a3wbS/sLd0sbOmusSksMa5sLKxtKiktbaqsaCil5uikqWwrqatq6ekmKCstLuiqLK6tby/zL/Fxb29s8G3ure+trq3uayrsKWwqa29sLy6wcGrmLmnlK2Ol5epiH6DfmxYZGJZbGZrZlhcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqb36Og4COhG56c3iHYrmhmaOJlJSWkpSTjY+WkYeGe4aBjZWKgISBinp8ioeGfYqCgYuDlX13enVlUFxkR0VLO1FjYVteU0Y/O0hQRVpjUVJZWFpnWVRgX0xTUEVBP0lKSEVFQUBEPEU2Qj5IR0pMU1lUXZOut7S5t8i+uLzJzLq7wLu3tbu6tr2zubHFYHWxpLGanqq9qaWoq6qkorK1oKuon5WWn5mgrqWnpqWfo5Ojp7G0qLKzvbbBvtPJydPGw8XMwsrDwL69vru8t7SvuLe2w7nFvcLHr564qaGrjaSntYiBgXNhY2NfWWNgamdTWGBWUlVJRUVOS0A+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWin6Df4J4e4qDh3uLeYGKgpd+dH16a2ZwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RUWVVKREJLS0lGSEhISEJJOkQ/SEtTVFVcWluTuL+4vbbFv7q4ycq6trm1t7myt7SzrrW2mGR1p5ytcF6irJyYoKKbpJ6qpZSfn5CTjpaZmKifpqCempmDpJ6spaqwrbiwvbnU0c/X0MrM0szPzsrGv77Cyr3BvMHAxMTFyr7HzbKjurC0rpqruLqYgHttX2FdWl9iWmRjUVtgU1BLQ0FFRkU8QEU+QUhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFbWWhfb5aSkJRubG90dYezq6Chn4uZnJmMjJWRmpGFiop+iIaMkIuIfIGDc3uKgoV7iXSCioaVf3N7eWxtdXtocmVpbGlnamppYGZpaWxabXOWraS8iIZnW29nXVlaVEhLTlBKS1BLU1FJTEFKRkpPX15hZmlhl7bGsLiyury0sMTGta+4sLC7q7Kxpqq3q4y1p52ap5pOmZ2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXmpWWh56ap5usr6iwqLS01NTU1tPM0NPVzdLPzMXCydC+ycnKydHHzM3Cz9G3r8O8w7mktbnBooNwZV5fX1phWFpnWlFdWE9QQkJIRUJIO0FDPkFHPz9BNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCZ3FveXmDoKmeppeMmpuXi42VkZqOfYmLhI2KioqQh3yEgnB/h4GGe4dyg5KLjn1xeHVscXh+cXpueHNtaYFwbWNpbXB4aXd8fsu/wd+nbWN4bmNbYmBKUFJVTlleT11cTlBOVFBUVFxubXaCcZatt6uzpq+1qay7v7CqtKakuKarrqCrtKOOsK2al5iMkZORhI6bgY2mkZyJg4uEiomEi4SUlZiXlJuRnJeZmp+fq6ylqKKsrc/S1dLOzNPU1M/U0c7Hw9TRx83S09PXzNHRxNLWxcHOx8fCqL23zp58cGdfZF9XYVNfW1BRVFFPSD5ARkFCRTxAQT5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VVFNTlp1hoWKd2x3cH1+f6GenqGMjJiTk4uMko+VhXmFj5CNioqIkIZ+gntyfoCBh3qEdYWTkIh/b3Zya3N9e3d7c4F4cmuAc3Jpb3F6eXF6vsuafouxhHZyhHZoYWtdQ1paW1ZlY1hkalNYXF1gY11jd3p9i4GYqaSkoZ+gp6Wqr7iqpbOioa2ho62hp7GfiKaak5KRiZKPiIGTiWqUooyZhIGGfpGDg5OXrYuVjZWZjoaSkZ6XqLCioaGlpKnJzc/IwszR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuNdXBlYmFZVVpUXFFLR0pKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO09MRkpYcIB1fWhzeHKCiYCclJ2UhYuViY6JiI2Gjn94g5OYioyHiIuIfoJ3c3t9god3f3qGkZV/g253cG11f3V4fXSFfHlsh3Z0bn12hHR4e521jDtAi8Wlfox8aWVXSUNmY2VjZ2pjbXdbXmZoa25oboCCh5GLnJ2gnZCXmJ6jo6Wxo6Syn6GlnaCooKOxnIWekpGRj4uOi4aDj4R/nJuMjYKEhXmUf4KplaOMkYmXkot+mIuakquzmJucqJynvsPGubbGztLR0tDM0svI1M7Q1drX19jU2djN2NvOydna0dW+ysu1enlwZl9bU1dSXFdGR0pJRUU9Ojc6QEBCOkZEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Cdi36HkoOJhoSJgYd8eIWWloiOg4eFhnqEeHF6e4OGdXmFjo2ceYtwfG9ven9xe4Bxg4eAbo56dXd9fIJ0fnyGh69zWKrCto2RgnBtYj1eaHJwcXBueHaBZWhvcnV4cXqLho2TkZqVn5WHjJOaoJqeqZ+hrJuhmpifpZ6fq5mLmouQkY2FfYiHg4WLjqCZk4iDh35smXqEmIaIk4yNlIyGfJyJlI+uqpSWmJ+Zp6+2vamtvsfMycnMy9DJw9LK1NfZ19jX1dvX09nb1dDa2tHWyNTLlnt9ampdXFFUVGBJQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4+Ojg3REI3NTU0NzkuNTU2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD5DR1JqXm1kYmZrdoCIcZGQmoB6gI1+goKBg36De3yEmI2Hi36FhoB2gnlue3uGgXR5kp6OoHaOdYJzdYF9c4CEb4GQgm+ShHV8gYV6doZ7ibfFpMHJuIGWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpOUjpeRg4mPlpqWlqWcl5+WnpKRl6KdmauVkJCKjJGCjIWIiIGGkJGem5mIhoyBhZd6iImfl5CIjYqLgn2hiZGLvKGYk5iZnammpq6fqLa/wMG5x8rOzsXNydHW1dXZ1dfb1NfZ2tvX29rZ2M7bxoh9e2lrZ2FVWVZXTkxFTkM7PT08ODo7PTk9QDY9P0A8Pz08OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyKjZJ3dnqKe36Afn98hHp9gpGJhIV6hId6dX10bXx9hn50f5KekZ6DkXuGfniPfniKim6CmoB0mYZ+gYmEe36Qeo+pjo/Dob2LnKScfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdi4uQkoWIipCTlI6cmZKUkJaNjJWfnJSglJGNjY+LfpCOjouEiZKWmp6fiYyUkp2RgouApZmIhI2ChYSBpIeLi7iYnZGVlqKooZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27l7e3pua2hZYl1UUE9JRExCPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEPzczNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1DUVNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4d6fHuLhoJ9dIOFeXJ6c22AfoR+d4WbopudlJJ/jIh/mIeAm5Juh6iFeqCLfJGNg4iEnH2akIqMo6KgkKSvn4uQi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5WMh4iMkpKLlJSTjouPioeWmpyPlJaQipGThoCLiJKNioqclpiiooaTnZagiomIjZuQg4iOgIOHhaSGjJCzmJ2SlJehoZ6ZkpyeqLK4raa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcn93amhfXllVWVlDQUlDPz4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjA6Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnptYX6Sg29td4t4eX96gXyFe3t2hYR/c3CFgXp1dnZ0hIKEfn+SpqSfpaKXip2QlJeLiqiXcoqxjYSnkoSZk4WZjKKVn5iTiJqeo5KpsJ+QlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzceVj4aHiJCSjY2Sk4mFiomFlpmaj4+Uk4aUl4N/j4uZiI2QqpaXo6OImZ6WmoiOhpaXiYSOjIF/h4+kiY6UqJqXk5eZoZmfmZOdm6OztKajvMG+x8XFycjJwsvTzc3UqdLR1tbW2NrU0trOhHWCa2ZgYF9QS1ZcQkJHQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjnx8bX6IeHp+eoGBgn52doCCe2xvin55fHd4fISGin6Lo7SopKqzoZanoKWklpWvooOQuJWSs5qNoaCMpJuvoqSdmJCnl6mZrbCkl5SVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinJiFiIiOlIyKk4+HgIaHiJOYlIyKk5OGlJiGhJGQnHSRmLKVlqShiJyZk4+KkIqWmomKlo2GfYyYn4qQkJyamZOZmKCUoZ2Vn5uhsa2jpLe+s8XHxL3Dw7/GzsrJ0qfOzNPR0NbY0s/YvHV8eF9iV2JYUklLT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVxcWUpoYTtIhIt6em2Fhnl8hHiAhYF9cHh8fXxvc4x5fYF7eIaLiYaEkqi8ramyvbClrrOzqaOisKyKmrWdorilla2kl6mtt6ako5+ZqZiqpK+xqZmYm5SVkZigl5m7u63KoWm2t6qwlZieo6uSl72kXqqzgomKjJSHkHyOjn2Dho6QlJSIh5KWi4+VjYuMl5mTnJm0lpWrnouclJKNkJKLmJqKkp2Pi4mVoKKNlY2XmZ2TnJielKGglJydpa6ooqSzuKvCyMS2ur28xcjIwtChxsnNzcTX1tDK06NzfWtfW1VhU1FHRD48Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBmSGFgYnBKQIuKfoByhod8gYl1goqDfm19fHx+cHeHd42Bh3uNkIyGjJqrw8Cwvca8s7TBvLSsq7O2jKiyra29q5u7o6itubirpqaioqSjqq+ysaqdnKOYm5iYnqKlpZOjua+owLusrbK5paOnfYiGnK29sIKLi4qQg4+DkY56gYeQjY6ciIiPl42KlJeUkJqXnaeasJqRq52Omo+SjpWRj5WXjpGgkIiUm6SslJaPlJyelKGem5ifoJWanqenpKKksLOmwMbDsLC7tsXFw7/Np8fDx8O81dDMxMqKdnZkX1xiXU9MQ0xARUc+QT9CPDo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaEZfaWdbXVyTjIyIe4eLhoOMdYaQioFufnuBfnF+gXqUepKUlJiRk5WotMfJwMLMwsO5x7y6r6u5u5eytrqywK+lwKOrsLy8qq6ro6Kep6yvtbGpm6CqnKKclp+ws6eMorq6tcG7q6icsqSjqJSEjqnExKSCi46GiISGlZSMeoOMkY+RoYyMlJGPiJegmJOZlZeloK6cjKqcjpaPkpGVlY2QlJGPoZOGl5+gsp+Um5SgoZmkoJqgm6CUmJ6npKanpK+tpb/Dwq6ot7XJw762zrLEvsO7s9HJyMG1d3tvXltebFROSURNS0tJQEE9QkQ8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2WiYuIko+GiXmGk5CBcoB7jH93hoGCj3mNoZaompqYu77JyMrC0snKws29wbOtvL+nur+9vMS4rcGprLO8vaqwqqSlo6yutK62taCfrp+mopmjtLypm6m8waO2tq+rk6+rqqyWhpqqp6WRgoySpJWJgHWJkXmFjZGQnp+Sj5SLj4yUo5mXm5WUop6pn5GlmoyPj5CVloh8jpWSkqOalaCinLWmkKCXpaSjpZ+eppielZecpaOoqKKyrKi7wMSvpbO3zMC6rsOzu73Bua3CwsK/mXB7Y1tZXl1NTU5LR0RDSEJBQUNLOjRESDo7NDw3Ri4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxJX1hhWmRlV56QnY6Xjp6SiYp/iJ+ShHiFf5R+f5CIiZCAlqGarqejmMO+ycTIxtPNzs3LvMK3sLq9tL3Lu8PBtre8rbTAubyur6ihqai2rq6psreanqyiqKKdq7e3qaWvvsSxvbizp6q0s62ulpWlraigkY6SscWnlY19kZV9h5GYj6qZl5OTjpOVk6Wdk52ZlKCioZyYn5iLjI+Qnohaj5aXkpakmWaZo56zpZailqytrKecn6eXmJaYlqGjqKaftaupurvDtKa0tcvBuKq2rLO7uK6ouLq8t4RvcFxaVldQR0xUTks/QUhEREhGRjg1Rk07Pjc+QUsuMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmZjTUamlJyWoZeoloyQg4elkoiBh4Kbg4OVkJCUjpqin6++rqHHvsbFyMfOzs/Syr67trG7u7y/z7XEvbe5t7OytrO4s6ynnKuruaupqK+vl6OupaikpbXBsKustL7DucC4s6e4tLeyr5WkrbCvpIuTlKCNc8GZfZeZhI6WmYuxlZqZlZKSmZmlo5Wfm5aaqJyboaCZioyPlp1gSpacmpWZpZdUlrCfr5yfpZWvr62mm6GmlJOZmY6dn6ahmbSpqrO8vLursLLHwLimrKutsbGjobKytKVzcWdeXFBTTUZRUVBRO0hLSEZHQUM9OUtUP0E6PUVNLzc1NDQ6QjM0TldOPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs1RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3NiVkZIq5eZn6GorpiQl4eKp5aNiJKFn4eEnJeOnaCao6S1ybSpx7zDxMnLycjMzse+urOvurjAwc21yLrBubW6sq+vs7SnpJyqtLWrqqetrJmkrqalqay6wKirt7a+wcC+t7Kyw7C3vKyjrrWtuqWIm5elmnW+n4SYnY6SmJqLrpahnJuXlJqfoKmep6CZmqqZoaeel5CNkZ2DbXWTopqUnKOfkK2yoquVqaqYqq+mpaGlqpOSmZyJlZyinpawp6mqure+s7Kuvrm2oKOnqKWmnJysqamNZmhjYFNNTUdJT0pVTD1NRU1JSkBDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0M6OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FNVkh+ZV5IRqyUnKGfu66YlJ6Lk6qbkZGTiKqMhqGejKOslKOktse9tMK7w8LIycXCzsjCvbmyr7m1wMPKtsaxwby1u6ypraywo6OZqrS7pqqnrKqdqK+opKuqvryorby0t77GvLa1uMCwvb+zqbW3rL+lj6KXkKGfvJ6JmqCZl52dj7afqZylo5qboJqnpbOhm52lnKiqnZiUj5Sbi5aJjKShlJyin6C1sKWmk7Grmqutn5+lpKqSlpWghJCen5yWqaShobS1uratqLWysp6coqaal5WZqqGeeGNfYV9MSUZITlFJTkVGR0JRSkhAREdBVlNESDxBR1ExO0I3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6Sen8Osm5ekl5mom5Wamo6qlpWoppWtrJmiq7fFwry/t8HCwMjEv83Gu765srC5tL7DyLW/sLy2urenpKurraGhm6uqxKKlqKymnquvrKKqqL64pq2+sLe3xre0uLi+sb7AtrSyta++o5ajlZOak62fkKGhpKKjnpC+pKidqaycnKCbpp+9opijnqKpq6CdlY2VnpOeh46EjZOepKCdtqymnJayppmwqKCcq5+hjZqVn4SOoZqckqWkmpirsbWxqqWqraybmKChko6QlqmflGllXGJeUEpIS09MSEVESUA9T0hAO0ZJSFtST0s9SE5VNEJGOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0tME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hOo5ujm57Fq6Ceq52crZ+Rop6WpJ+mqquXtrGjqbO2xcK9wLbAwrzJwr/KyLa4tbSxtLS3wsa3vrG4tLq2oKesqquenp+lpMGloaqtoKSprbCipqi9taWxu7e2tcOysre6vrLDwLi4rbS0taOdpJSRk6Csn5ihnaioqqKawqyonaytmpqdmKagvaGdpJirq6umoJmNmp+SnoiOWH+Wn6ahoLmqppSYtqOes6KhnLGYoI+alZ6Cj6CXlo6io5WQpa6zq6mioqWklZWcmYuPkpOkn4ljZ1xlYU1KS0tPRkVBR0s+PUlBOTlKSk5dUVFJPUxWXDhGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMUJ+foJiew6ekorOgnLKnkqmjn6Oeramsnbuxqay1scjDwcOzwsO+x8S9xMq9sLG2rrG1sMDFtbqxsLq2rZqpsKmpm56moafCrZytsZyqoq6xqaSnvbemtru9r7fDrbOzwr+yxrO6t6u0tq2qoqaVlZSiq6Gfn5mnq6+vr7uypZ+pqZmYl5KipLigoaOSrq+rpKWekaGelJ2OkI2UnZqjn6i1p6eNmLSco6+boJywkaGUmJWbgJKilo+OoKCTi6assKWnop2gnpKSmpSFi5KNnJ+AZGhdaGZLSkxLU0FDQEhHOztGPjg5Tk1VX1JTSj5PXl09SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZ3JAODxIlndlQTSfpJ6boMKno6mxoKO0qZWxq6aipLKsram7sq2wtbTGv8TEtr/EvsrFtsDJwrWstamwuazAxLS3r622uqWZq7Ksqpihp5itu7ScqLCbrZ+utLGnqrqzp7mzuLK4wKq3ssO9tMWnvq6tt7Wpp6uglpaRpaShoZeXpK63rbG0tp+fqaSZk5STo6C3o6Slla6xsqWppaGem5malZeon56Zop+vs6KmjZivmqWrl5ufp5Odj5WZmoaWoJWMkJ2elIupqaqip6GZnpaMj5mQgYaViJWfemVqXWxrTlFOTlQ9Q0FOQzs6ST83N1FOXV9SVlFBV2BcQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFpVkNXRox5ZkM7pKScoKW/pqiurqCptaqdt6+ro6q0trGwuLewt7i3xL3Dx728w8LHwbrBxsG6qralrbutwcO3t6qtsryjla2xrbKXpqiRqrmqoaewnaugr7Szqqq3tay7rLOyubesuLDBur2/psOqsLauqaurpp2YmKqhoaCRl6Cwr7OrsLmZm6mfmZaSl6agt6mloqKvsbOrsaeroJygn5uepZ2hmJ2jtLCbn5GUppqhqZuWo6GYmouWmZSWl52UiZKbmZSOqamnoKOcmJuTh4+Zi36Ml4aPm2xpbWJublhRUVpUQUNEVEA7O0hANzpYUGReUFdXRFleXk5MU05fTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhsfWhcVjqJe2NDPaifnKGovKCpr6qisbeopLSxqqGttb2vs7i8u723tsDCv8nEucTDwMC5xb3BuK+2qKu3sry/v7SqrrK4n5esraiumKipjqe7n6Wts56rorGws6yqtrO1vK2wsbWssLSywLrFtqu8r7G3rK2po7GlnqSonqOWj5ifsqqzqaqzmZ2nm5qUjaCmpLSup6GsrK2xp7Krsamjm56opJ6UoJmcqLapl5qTkp+ZnqGfkq2gmpqHl5mMnZqdlIuPl5eal6emo6CelpaWlIGQlYV7j5ODjJdnbXJocXNgR1lmVkRDTVhEWjlIQjU+XVFoXE5aXUdbXl1PTVNYZEpLQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVjE1MT1gVl84KUMzWVVcZ0s1jHpmTECkmqCkq7ajq6ikrq21qa6zuKansLfGtrC3v8HCtrS6xb7MxbnDwbrAusS4wbqztayquri7ur61q6+xtpmYqKurrJyuq4+rvp6rr7Gjqp+xrbOurraxuLaqra6xp7Wws7q8ybKqtbSwtLCupqCzoJqorKCklZWambGiraClr5aipJqZkoyipaeyqaGmsayqtaSusLSvo5mdraebl56amay4opeTkY+YnKGZmJWuoZ+WgpWZjp6cmpeRi5STnpmlo6OhmZeTkpZ7jJGFe42Lg4yTbG55b3Z9YkZgalpJSFpbPXtKR0U2QWJVaVtNXGFKXFxaUlNTYmFMS0VgYWBQTUlQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NYVEtFmpagsKexqayko66ttKi3s7ejrLS3ybq0u7vAvrSzt8PAzMe7xL23v8DAuMC9sr2uqLq5uLfCt6yusbmVl6evrKiks6mUr7ukrLKypqejsrSwsrG0sLeyqa6rsqa4r7WzxMW2qbW1q7Ctqaeitp6fprCgo5SbmZSwnqebn6mNqaKdm5WXpaWkt6eisLOrp7Gnra+1rKSZoKyonJydnJSquZyVj4+MmJ2jmJGYqKSgmIWTl5GdnJiXloiXj5ebqJ2loZKWkpCWd4SRhnyGgoSNjW5xeHZ8gFxMZWxcSk9kXT9ie0dJOEdnV2ZbTF5iTFlZV1VYVWldT1BIYV5fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhnMjcnRmFMViUtQi49RUxRPDNya0xERJGZpK2jrK2qpqOwsrKqt7C1n6u1ucm4rsG8w7ezsbXCw8/EwMK+tb7BwLu/vLTEqKq5sba3wLyvrLS0nqGnsa6lprGlnrK1rKqysauoqLS6rLSytKuzrKqrqKypua2ysMe/uKS5sKmtraanrbClpKOuo6ibnZuar5mioqKjkKyfo6Cfoammpbikq7S0pKqrqKyutq6inaOoq5ygmZuSpLWaj4mOiJGjoZaPlp+ilpWGkJWUnpuZlpWHmJKVmaecoKCNk5KOkXh+joR9fX2HiopydHN/fn5cU2NuXk5aZ11GRJZbRzpObVhiWk1hYk5WVlZXVVloXlFTTWNaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZDs2KkhkSEorOkk/M0NJUyw+j2s/SEmQm6mpoamvpKejs7OwtLSwsKCrrb3Muq7BvMextK2zwcPRxMa/wbK+w8K8v7i9xaitt6y0uLzAsayyraGjp66qqKWxo6qwqq6rsa6urKuzuqa3sLKpsqmqpqWjrbqsqrDCubSsuaioqK2pp7GlqaSirqqooZ6bo6yVpZ2YnpmrnaGnqKGspqOtrLawsaCpop+qrbCrnZ6np6mao5iZkKComIaDj4uLn6CQjI6XnpKRiIiSlqGdlpmWhpeTlJelnJ6djJKQjop/f4iEfXeAh4WHdXRyiXdsX1lgbmNRc3FcSzuEe0Y/V3VYYFlPY1xNVVZVV1FcYl9TT09oWVdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5JZ0RGODxCMDVFS1gxQJRdQE5GlZasp6CpsZuoqLC1rLi1ramkq6q9ybyxvrjDr7Css8PEzs7Dv8C0wMTEusG1ycSsr7eus7rAvrSurqymqKmxqaapsqa0raqvra2xrrKts7qkuLOsrK2nq6CjnrC3q6qtubaktbWjqaesrKqtoKimp7GxpKaloaGrlqqhk5ugpZ6jo6qjrKKeprG2rKyipaOaqautqZ2hpaSkmaCZlo+YnZOBgpCJhZ2gjYuQjZuQko2Fjpmlm5ORm4yTkpKUo5qcmouPi4x8h4GCgnt1gYSBfnV3i6OHeGpeYG5mV2aHZE5AZ5JMRGJ6V2JYUmVVTVZWVVRPXF1hVkxPaldWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQklJRJaRr6Siqa+Yqaittaq1sKqkq6qpvMDAubm0vLWmsq/DycvRv8G7ucDAwrrBusLErrG1srS8wb6zsa6trKynt6qlrbCruK6osK+usau1qra1prS3rKykqaqcpJ6zs6iopLO0n7Wtoamoq6irp5+rq6i5tqmqqqmhqZ+tm5GqoZ2go6OmoqqenKa0rqelqaKkl6Smp6qcoqSjoJmYn5GOj5mNfoeMh4WenomFjIuQj5KOhYiWo5qOjZuRkpCPkp+YmZeNi4SAdIeBf354dYOAenh+f4idj3BxZmdxeFxhdIhqT12YVkhteVVkVlJiT0xVVVVRT1hbYlZJUWpUVlRHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdSRjuVja+gpamsmaqjrK6ytK+qpK+pqLu/vMKyr7mtoravyMfI0cC/vbq8w727w8G/v6+xs7K2vbzBsrK0q7Sppbappa2zsrivoq21sa+xuaq4rqqut6uqnqqroKOhta2poZ+usqG0qp6op6ujqqGhrK2ova6rrq2hp6efq5mPsKKYoqCop56nm5ipsKmin6yhoZKhoqOnmJqopZiYmJyPi4eViHyNhoSFpJaGg4OMh5CQkoWHlaGWiZGekZOQjZGclZiPi4aGeHSBf310eHmAe3R0e2qCiKR2aV5lbIF1Z4iLfFJWcF5KeHNUZFNRX01NU1pmTk1XWWVZR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUMzj46woKSlqqKlo6ymtLOxqKSwp6q4vsG9sKi5qqetsMnGyNDCvb+9ub+/vcm8wrixsLWxury5wLO0vK25rKO1pqessba4sqanubWttLyvu6WtrbWrrZypr6SfpKyqqJydqrKks6iaqqeqpKmdoqmnqb2rs7CunamjoK6bmrOilqWbpaSfpZqZqKqlnpqpoJuRmqCknZmXqamRmZqSkIuCj4V9j4OAiJ6Ph4B+jIiSkJGFgpSblIaToo2UkYuRm5OWh4p/gHJ6eX58aHZ8e3Vwcn5qhnqFiGRfaGNyhXttZ3ldXlZCV3ttVGFQUllLTE5wdF1JWltoWUZWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6SsJmfn6mkoqGrpLaysaSpsKatucK9t7CkuaypqLDCyMnMwbe9v7W4wbrItcO1tLO1sr25ur22rrm2v62is6aqq660t7SpnLm7qLG+srqgrrS2qauerbGjnKWoqaOdm6Swpq+hn6qpp6KqnKOooK28p66xrqGqoqOunp6sppifmqGim5+bmaOqopqao6OVlpOfoZaclqasi5+Rj5GMgouAgI+Be5qUjIl9f4yHkZCNioaTmJGHlKOKkpGHkJmQlIGIfXpsfXZ5eGJ6enJwcHN4aoJ1a4JnY2dhbnOObWJqb19wQV15a1ZeTlFRS0lNU1lWTVxebFdFWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPiORlquYn5enoqGfp6O3r62ir6+oq7jCurOtoLmvq6ezusfKx7+3wr2vtL63xLbCsrC5sbLAtru9t6q5uL6qpLWnqKqvrbiwqJi4vKOtvrS0oa23taamqLCzoJ6lpaehpJmerKeonqCqr6egppeiqJ+wuJ+jsa+hq6GspJympqiam5ufopWcm5qdqaaWm56okZiSmJ2TmZahqpCaiY2Qh32Hf4KOfHyhjIyJeoSNhYuOjYWJk5qOiZWfiZCVgoyXjZF8hXx0cHxxc3RgeHhpb3BxcGt/c2R6bGhlZGFmh4BgW3Jqck1OgGlYWk1RTEtIUFJQR01bX29URVlaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrJ+eoaSht6uwo7Szqam6xLeyrqG4ra2rr7XFx8C3v8G5sLS9t7+7vrCsvrCzv7G8wripu7q4p6i1qKerr6uyr6SYu7akq7q1r56xuK+ppaevspyhpKCko6CWm6+moZ+iqK+hoKKTo6SitrChprGrn6yjrpecqqWon5ianaOTmpuanaWqmpubpZSUl5WcjpOXoqihkImKj4Z6g36Ei3mPl4qNh3qCiISJjY+Fj5OYjI6WmYuPln6Gl4yPeoF7cHJ2bm9zX3h3ZGxsbGpqhW9mcmlrZmheZHOBYFtrdmlaSn9eXFhPT0tISFJVRzM5XV5sUEVZVVllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyZFcsMpShoZeUm6qco6GiobeqraC7t6WsvcW0sa+jta+srK60w8O8s7+6t7Gzubi6t7qvrsCztLmvv8C3rL26taaisqmnqbGqrbGgmb+1pKe0taiesrypqKWpsKyZoqecpKWUl6CypJmeo6ipnKKfkqSgpLippKeupp6loaiSn6mioaGZm52fkZmblp+hqpuamKGUkZSWmY2Uk6SopJCJiY6GeYR7hIZ9nY2Jiod6gYSHiIqShZaTk4uQlpSOjZR7g5iPi3d+fGx0cmxsc2F3dGhoamdncIdoaGljZmlpYGpjamhbZntjYFN0VFxbUkxKRklPU0AhKmheaUxEV1VeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKeoqOQjaSmmp2enaO0raequranrMTBt7Gso7aup62utsC/vLLCtrCusra1uLa2raq9s66ysby/t668u7Gln7aqpaWzp6mtnZzAq6ekr7KprLW7nqiqq7GlmJ6qnaakkZilrKKYnqSpoZyim5afnae1prCqrqGhnZ6hlKCmn6GgmpuZm5KYnZOlnayhl5adk5ONlZeLj5ibqJ+RiImLiHiFdoGCgZ2HioKKfX+FiIeGkYSWlJCOj5GRkYyTe4OVj4Zzfn5meW9ramtmdHNrY2dkZHaBYmVmZmZqamNrcltfWV5tZGFOaVhaYFZKR0hLTVJYPjlfbGhIQ1VUXVtJSUdGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOgj4ytoZeXoJaks7Gisr22obHGvLqxsaO3rKqtqbi8u7qtwLKurq62rrK4s6mrubGvrrO2urawuL2spp21qZ+fr6Oprpyhv6Cwo66wrreutZ6tr62uopmdp6mln5Wap6WfmaSiqJ2an5qUnJ6sr6a6qK6ioZqbnpmepJqknZeel5uTmJ+SqJWqp5qTmpqSjJWZjZSUmqmmjo2KiY57gXOBgYqYhYd8iYmFhYqMiZKElJuTko+QkZeOkH+AjY6Db4F/ZnltaGtpZnFya1xoY2N0gWJmZ2pubGdramhuXWxsc3BgVGNpY2ZZSUZMTU9YUVFVYWWAVUFXU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMmNJGhm42PsJ2Zk6GaqbGvn7m/taC0wru9urGmt6+nraS3t7a3rbuurKqrtqmzt66msrWyrqmwtraws7a6p6iftaicnaigqKyap72YrKOur7W1ra2fsa2wqaKbnKOrqJyUnKaknZqpoqSWmp+bkJujqquqvJ+npKCYmpmdoY9ropaZnHCClZqjf3WRqaeelJSekIiXmYCWiqGQeYeUjINtaX52g3FshouGfYWMh3BeY2FnhJiFa4uOlJJ0d4uEfoOQgGeHgGd1aGVXXGhzbU5QamNnc4VoX2Vmbm1qXl9hio+DhGVOS0Q5R1RoXkpHUVBUVUxIUmBvdGVGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCswOD1HNzAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Ko5mFlbCbm5Ogm6qtqqO9xa+pt8K3vb2tprewpaqitrOxsrG5rKmmrLSlr7Siqbe2tqinrLayrrSts6GpnrOqnqCjm6Wml6u5lKWlr7O3ra6lqa6rrKWhnpyhp6abl6ClpZqbp6adk56fl5CdqKmktrCko6KdlpiXl6OIoY6Smoagh5OcoH+lf6WqnpKSmpGIhHJ4jY6FiKF2iIxpl4hmfXN4oG+Ih4N+jnx/oaCgmYB8h550h451m4psh4GDbWllY3pscmFThW1ibGmYcVhpcXCIWF5pW2xsW4hybnpyhWeGhFpfR04/R19NRVJWVlFRU1dUZ11NVkhSUk9GR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oiqaWgpyrnJiYnZ+pqaeqv8Ousbq8tsC/qqW3r6mspLK0rq6ztqqopbCtpbSym621trWmp6iysKyyp62dqZ+xp5+iopmgoZqss5SjpKW1vKatp6uqrKimoaCYoKajmZmlo6SYnKSplpOinJOSo6WmobekpKCjmJWTl5KciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZGEfJCQkcpyl7ycxXpytaa7kHuAbZaxq7B5aGxYsa5uZWm9krxuZ3pvco/YflNrY7ayf4FylHOaoaqQV09XYk9WTkZVW1hRUFKMXFdbUEFcRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+OkI8P0E4Oko+NTIqMjJCRS8uMzIuKy8oLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYymkoCnqp+XnJ6lrLKosMK9sbW/tba+wauns6ysqaaus6mutrOnp6a0pae3rZyzsrarpaSnsa2ssKaqnaajsKKhn52Wmp6crauTnaKftLqjqqmira6loZ2amqKnn5ebp6CfmJ6np5GcppqTnaGmoqGxo5+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHGuoaR+eLt9a6GPdrFfarRbpYBlnJFgZoJ7Zn9qeGupZb5yZ6aMdbFqfLF4dJKUY25tp25bhKBFaGaHlkV1nGB+Z3ykp4JaX4yraICVeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TolPV1cvSVRTSkNGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCraelnqOkqrG3rLS9v6+2xLK3usGmqbCqrqior66isLqvo6StsqOouKees7Owo6Wgqayvq6+mp56joa+bopqWlZaZmqullZqhnrSzoquco62toJ6ZlqCiqJyYnaOfm5mhpqSPnKKZlqCfqp6mpqCan6GWlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR+a4Gme4KGiJKUknerZ2uxXKt6jYaUdIlyj4aAf4iQl3iCgouYi4Ogj4SwdnefcWxsbHyLTqRYSGJimX5jaKZgeXJ1U5OHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVdYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFUNTAblaCViLOmpqGvqaezrKm7tsKwu8GtuLe/qaytra2mrbGpoK67qqCntKyjq7SkprKzp6Oinqeqsaewp6Sen5+ulZ6ZlJWVl52roJmZpKi0r6Kpj6moqpudlZegpaianpyinpufo6WjlZuel5mcoqmbppmcm6Kgl5ORk5Ocg9WTmblwsMF+xYZ81pSbu3yalaWPjZ2NpHuOh6OCpYJ6rHmPnVaveoh+n2q5Wrl2hoN9poKTfJh6qniNnY96sW6OhHSRvIVvlFCvp8WKUaB6Y2CpYnNyiG2XiGBTtbTIhoCJfGOkM0Kddl1QamljUEBYZ1pkYUpITW5OXFFPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjtESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUDcxJZuilJmyqKimtKqltKmkvLfBsLm/sbW0urK0p7GvorCypp+ttaeap7mtoq+wn7O0sKGknp+mqbCotKijm52dqpWYlpWWlJagqJyZlqetsKmjno+toqiWnZeboKWhmKGhoaGaoaKnm56gnpSYmqagm6eVm5ufoZiQkpSQnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaN/kaGlfrB2g5HS0nZcrnuFf6Rvm6qma4aEfK19l5mOe7Bykp2OeLNll3SEnm+eZpRRyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBT2tgbGhQVkdJOT1VUlpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YUw2MjChnZKlsKyjq7ytprSmp7a7vLK6vra2tLm4sqW0s6CxsaKeq6+kl6a5raSxsJu0uKqgpZ2hqaSxp6ypo5mcmaedlZOXl5GRoaaflZKlqrCmopaTraClkpSgm6Smn5WapaahmqKfrJmgnp6QlZuhnZyllZ2VmqKflZiVkZuFrHt3qHajjYiGqW+tioKng5iYoYmSmouif5Oaia6Ff4KzXHKzUq59goKkf3HXfXiFfo6dhZqadq+GiZGch3e0YZplmoKClW2SWrBYS5p1mHlmYK1edneIaJiIbF2vd5Wej3hsNXnIrrJfQlRvXmdgRVBsX3BtVlZNLmZkaVNZUDtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BIOjk5oJ6VoLmwl7TCraizqKmyurezt764t7G0urSkt7Kfs6yfnqirnpSntauor7GqrbSkm6mgn6ehtaamqaKYnZSkoJOSm5iRlKGkmpKQpq2vpqCVmamgoo+RoZmopKCVmaWonZyknqycoZ2gjZOemp2hmJmblpeioJSXkKadhql9faV4oY6NgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02H92h3OogY6bjZKkfJaQn4R7sl6dZKB+g5VtklyrW1qTgJF/aGeqZHJ7gWuYh3Neq1qJoI5rb2VPSkOhXFtMdF1iZ05bYV9yc19LVjdKm5RYR0U9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA1Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKKempq/q5i0wq6rramltLC3sLW+uLixsLW6qLq0n6+knaSnp52TqbCpr6m0q6quoZign6ako7mio6uglpuQoZ+Uk56Zk5een4+Mi6iwr6edl5uopp+MkqSXqKqnlJepp56eoKKtpKGeooyUoZifoJKel5yVnqGVlo6rnI+ubXK0c6mLdYqnc7R4c7OAkaSjkpyOiaSHkHe4b4x7i6Jqa7ZaoYVll5dpoaKnbZNytHSTmH+yaoWSiK1qdbNhnWaib4eTa5dcrV9NoXyHkVJzo2x5f35vmIdyXa9WPJx3ZlRvbi5cp09jU2tlYm1aY11gcHtjVFpSPj5tbzNDQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimnJueu6GbssCurausp7ept6+1v7S6r663tqrAtaipoJqlo6Gckaqpp7WisqeuqaCXm6efpKu4naKsmpWZjqOilYycoJuYnJ+Rk5SqtrComZScrKqXjJSlmKWsopGWqrKjn52mq7GZoaOPmKKWn5uWnJahk52pnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyXi4yniHqktnV9d3bCgpqyYIO6ecB8dbhjtYKMh6l8lYGsqXF7f3S8iKegaZ1hpo6voX6MdIeqfb5vc7x0soN1eIGKbpqIcm6NpHS9Xnd9WmF5vGtaVlxqeV5qYWVnYm14b1pcWUNBQHNAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueor2hl7LDsK2qq6yxp7evtsOwuLCtua6twLCro6GdoqGbm5Cpo6qypLSlrKWelZmqmKasuJyirZeTn4+kn5KMnKKdl52akZWSr7myrJWXo6enlJCWpJykrJ6QoKirn5ufqKOzn6OljqeilKKanJiVo5iQr6CSlKmehJCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0n8G7vZp7gbGocIBzkbmDfIaGjIeNfIqHjJd8pLu5vZx1erSjdHeXdnSwdZmeZoZqjbV0cnF3toxef3p9iWiDeW56Y4uscHWFf1hbp2pFZVpUZmBjXmNRZ2ZwbHVDTlBNRDpaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZVJz47PKeeoKK/pZa0w7Ssq6isq6m6rrDFrbOyrbWms7irqaKhpZ6gnZmTq6OsqaW1p6efm5Wgo52rpL2moamWk5uQoZqRj6GnoZOcl5OXlLG1t62ZnqSkoouSkqabpaqblamkpZyaoailp6SpoZGtn5aknpeXl52ej6+olJumoY1qfWmbpniHcn2ZjnR5ZId7vb7Aum+Tg3KVh2Byalpem4lgY4iOlWtggJVjbZ13YpVrgJqVlGVeYGNwmopocot9hpVna39ydXh9fmJbd3SBaFBcboN9e4trWGt6gnNKSm+GcE50TUVYXWdhTFpYZ2NfT1ttdWlxUlBERU07R0k9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz5bTyc/Mj6poKiiwqObtbq2o6ylrqentbGsyKuvsqqzor2wsaafoqeco5uZmaumrqOktKikm5eUoJumrai9p6iklJOalZ+ZkpekqKiQnZGQmJywsr+sm6eep6KJk5Gpmqijm5qroKOZm6OnrKOgq6OasJuVp6CWlJ2fnZewpZihp5mbkJycoqOYpaGZm5mZmY+VgWdtfXF3kpeUkoWLtaqNhpiVjoqMmJaHlJWKhJOUkYmOkpSYk5iWmqChmpyUoJ2OgnqlhW1rfZF8gHWKioFxgnh5dnaKgHyKanOBdIN1ZXd9d2tvem1gY11waE1YWmZqYFdab3ltbWZUT0ZTOU9aTVFPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEosPC1As6CzosChpLKytqCppbKnpbC0qsiqrK+ktKXAprOgnaSknKOVlZ+qpqyio7arn5iWlZ+WramlwJ6ro5SRm5edl5KToZ6eoqeSkpmop7LEsJqrnaqfkJaWqJ2qm5yfrJihm5yipK+noqWon66Yl6edmZmgnp2cr6CcoaaVl5KXk5+glaKdl6COlpOKio2Ol66QfJabg5KCi6qphYCZl4mDj56IeoSQh4aakoiGipaOm5eNkZidpJaak5GdjX+OZ6Gzr4WKhHZ7kop9d3l6b2Z5kIGAiWt1gXqIc2lzf3t2g4eCa3VkeWZgamVjZGZrWWx7b2lrXFNMUEReVEVAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYmNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFtHNTwsQLSgua+/rKuusrGgqqayraKss6/Er6mqorGtvKKzm5+moqGcmJenpamlpKWytZ2Uk52Zma+lrb6gq6KQkZ2ZmJSQlKGcl6ichJ6qq6O0yLSfqqSqlpaXmqadqZqeo6uUnp+eoKmvqqakq6Kum5+goJiknpyfnK+jmJ6nkpeWnJGjmJennJqXZYKSfGV+jZqQY3mObWlre5Kkqmplm5h9Z4aKZWVpaHuOoY9rZ42YkaN3a2qLmaOfmHNsbnqEjoh6WGZehoNebYuJgXZcaHN3dpKAh4Jud4J4gHNteYR0doiIj4N8a4dZXmx0ZF5ziWlrfHFrZF9STlhJZFhBSjQ+Rzc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2ln7q8uq+stLGqpaitrrCmra2wvLCopqOtrrCerJafo52hmZmmqpyso6WnqLKtnpSjj6Kvpba5pa6ijo6ZoZmTkpqgmZmklXulraKotMS4paKnr5+dlJ6inqOboqmokp+hnqCpsKurpKugqpynn6egrJahm6WwpJebqZWgnZqRo5adqZedfb2DiHK0coSdhq1oeLnEuHGToqN6ppmZcquCfMvAwLtxjKOIgp99lpiJncC9gpedno2dwsF8gnyTjZrDwH1spbJvjIFvynp/m3eRg46BdnmAgHlxen+HcHeFjJN5bniUY2dgeGRgZYJjXnRnbGRjWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVkFCOy84lqO5w7WwsMCpqJSjr6iwrq2msrOuqaSlpq+rn6qYmqKfnJqqp6Kcq6KkqKSktKOcopKmrau3s6euoZGRmZylkpCfoZibn52IpqykrK3AwLGhqa+pl5GfnaKZoaOqo5Ohop2erK+qraekpKehpqWdrKiRo5qoramanKibq6CVlqSVoKKWnH7OlHh6pIF5lZabX66PXo6ngaKgfKeWm3Org4CvXmOMqnuoh4WgdJeTiLNjgquGoY6Ns2qEr3V9l4i3YYOtWqPNbpB2e9p7f5lwfoeSdn5le4h2dmt8h259hpGRfm2DkGFybXBoYGB5ZFxxaGpkZ2BSVFNXXUtPQzVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qnrbOrprKrq6qjqqavqZ+mm5mkl5yir5+gnqinoqWgn7Csmp2Vp66ssKqoq5+UkZqfpJKPnqWYnqejn62lq7CowMezqKmxrpaSnZuil5+pqZ+VoZ+dna2vqayqnKiopaKrkqyylqWiqqqdoqWkoK6fkZimmZ+Zk5OQl6BxhYyXdYWohnGxfZ5yrH6hnoGlj552q4J9rX+ccq1+q4eGn3aZknt8l36qiKKMkoydfqt7iZSQn4B7rVedxXuPcJPBfYGVbXVvjG1ldmWGb2F3bnJuiYqSj4Nuk5FmcHV1cWFnbWVfb2lpbmdkWFNdYVlSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw08bGsrSgnaOOo6KirK+2rqixpqiqpq2rq6aho52ZoZWfpaufoaWfqKiinp2wrJealqinrqunpqeel5SZo6GRlKCtm52mo6+spKy1qrrOsq2mrqyXlZydopmerqycl6Canp+psqurq5utq6Wjq5qusaGoq66lmKSpqKivoZGVoqOZk5GEpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBgUqyFf66Dm3atgaeGhZ96mZeGe2aAo4mkmYaCo32pfoKWh65ffKlWnqOSgXqjn4B7w6/Fi3Kvs7O5cWKpr8J0aIyMmI6CbpyVcW96eHlwbWdlZXJwZnxpY11XYGpYWVVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1L+hmaunoK+inrC0sK6prKKnpqiqq6mkpZ+bpJ6dpaeno5yrmqKsoaOfr6GcmpKro7WvrqCnmp2Vk6aikJqiqKCfpZyxpaSosa23yLK1qqyplpGdnKKZn6WznZqhlJ2fp6ytpLCbraqjo6qhs62hqrOxoZqop62utKGRlKKml5qRfKlsnoSHdat5fLBvgqWMiZ+Wlp+UgdK4tLjJgYGyX2CUqYOkiYegepiWmniqyXSapJWoqZGSmo2BnIqaxsZ5Z6GCpXSBn46Cfa9dcLRisHVLo4Ztp0eCk2SPkJ6RfHGZlYFxfHV+fG5cZmpzcWaBa15hWWRtXF9ZSU1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraylopyyuKyqoaWaqKSqq6qmn6almKqjn66rnaWgrJqeqaWcp7aeopeTqKq1sqybpZyglI+lrJGZnKijoKqnrqGlp6mwtcOys6qtqJOKl5ylm6Gjr6WXoZWZnKWmrZyxnq+pp5+so7esobG4r52arqaxsrGjk5amopmejoKdTniagX+feoSjfYOkhYemn5yek4S4e3t5uYJ/zMbCtniboZCLn36alpeKdp6YiqWYpKl/sIWdhqCErH2alWOmbaRwj4WQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+lJOMdntzhoBxXG5ueHJqgW9bZF9pbmJkXkxMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19dWlpaWFVTT0hAODgyLiwqLisqJyc/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6Sruaqun5uhrLKzpZ6glaWtra6qp5ymppqjp6GzrqKpprKgmKmklKO2oqKVl6GptLijm6GcopKPobGZnpunpqGisK6cpaiitrLFsa2pramRh5CcqJyipJyll56YmpqmpKubsKKvpaeYr6S7rKG2ta2dnLSxt6+xpZecrqCjnIWP0bXDt3mHjoWRk5CApnmUoXeMoJGEpYGKcaqGhbRucmqZo5yVip58mJmGh49zr4KmnKOOpouTnYuWkJtucbJdpXSTepxsmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jY6Vjnl+eZCDbmp5aXpzb4B1XmVlb21mZ2BKW1hYPEhIQFU0QEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bW1pYVVJSUUY6MjIzLy8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklknOMiq2+v7y6tJ6Wp6SttaGimZSiqKauq6uYpqKfpqCgtqejqKewo5Sso46kraKdkJqaqrOzpJyknKiRlJeun5+ep6SdqJ21mqKqpLasxLCpq6mhjISOnKKgpqKVmZqdmZuZpqWoma2or6Smm62mvayUva+snqGvsripsqWaqLCip5d5qJF9fLB3ioCkpYicbbJwoYetfKGPg6eVmICsiYWuhZ+UqqChl4afgJmVgHuSfquAnZuWi6t4naGSipSSgXqvXqSBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkaaZg5aOmY58fISZgGtuf2N/dG6AemBnZnFuaGdoQ1lhWz5LVTNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RUlNTVlpdX2FgYWFhXl1bWldTUE9OSTcwNDIuKixBVFZWVlRUVVRVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2TmoOoxcK2wLOemqygrbilo46bpKKfr7Cqn6Sfna2Znrmgo6ugr6mZrqGQq6ijlomakK6wrKaepZusl5ePrKGgnaahmqWdrpihqKe3qcGvpamknouAjpuan6aekpSZm5SbmqalppuqrK2kpZ+pqL6klsOsqaKgq7K4qaylnrKtp6iXda9+kIuchYd9uq2KmWWwjWWVrX2gj4OmlZqBrIqEsIWmmqShoZCEoFxsaoGzYH+te3uDgbFtZ2+ZmYyIsVt+tVykhGvIomSfgHu8WHa1WbJ9Uq6AeqxYgKFtmJCom4yYkpmZfHqQn39ldX5jhnh0gXxhamdwbWdlZk9VZFxBVV8+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBRUlRXWl5gYGBhYl5fXFtYVVBOSkZDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Kxt726s8GyopyspqS1qKCKmqCenLOzqZ+joJ61maC0qKqsnq+tnaybla+noY6Im46vq6imoaWZrpKYj6iZoZ2ln5qjo6WZoKKqs6m9sKWonpyOfYublqGgmI+RmpySmpipoKKaqa6opqaipKm7nqDGpqSooKq0tKutpZ66rKurlICpkqOvjpt/h6SXmZCCgLjDuoOOnJKEp5ecgqyKgq+Ip5ybpqqQftW9wqpio7+9fX6jgoPXuri1hZWTg569voRto4Jvq4RsnH96srDHg2mrsL2seHeivrxzgJaOpp2Rm5Kan3uCkpx7ZH57ZY9neYJ7YWxla2pjUGJbU2pcP1RhQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc3Oz5BQ0ZHSUtNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWzs7C/uLG8sqKcrqaksqadi5ilwKq4sqihv6anspyesZy6qJ+tr6WnlJSwq5eMg5uRrqWirKCjnKqgl4ujkqadp5yaoamjmZ+hrK2quq6oo5qWknyImZGmm5KPkZiZj5iUqZuhmaqpoaunoKOqu56oxKKfraKps7OprqifuaatrZlzdqqluIZkiaBwaK6RipBubnekkJmfgXWumJRwj4txlaijm5eupHJsbGxmi3hvboKZcYF6anFpZ4qXlphxaWmFiGdxhmRdiGJqb1lcZn12pl9hcY6RbmVlf42Tj6GYmZmTmaF+iJGWd2eIeGmPa3mAeWVtY2ZsYktlWEpsWjpQZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1lcXl5dXFxcXV5dXl1bW1VXXqmUrLOpubiys6qpoa6do7Kpl5K/s8XKv7eqnsCsraSip6yfuqOkrqutpo6XrqmPi4WVlq2epqqgnaSjoJGLpJKnmKmal6OqoZadpqansLusrJqbkpF7hJaNpZiNkZGZlY6YlqmWoJipo5uxpp2iq7mfr8Gno7Klq6+wqayqprWirLaViqGoprediZajmYeqm5GVnZKpspmao6qgspaioZ2fopyhpaGVq6eNkpKMh5OcnZWRmZOZkY+VhoGlm5iWjouUlIyQhoR9Z4l+dIJ1c4eKcKdsepSRk5KBgY2PkI+dlaKXmpqkhImWj3NqkXdxjHh3fXpqbWRjb2RVYVlAalxIY2FPWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVZZXmBhY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWlpcXF5fX2BeXl5fX2BgYF9ZWWCmlqiqpLS2rq6hsKOtn6C1sZCOrMi+xbu5q6Klnpynn7Gpo7annam0pqiRmKyii4eJj5ynlaykn5innp6SlKOWqJqompSmoaSQm6iZoba7qKuZmo+MfIGUi6GUipWRlpGQlJimkKCbqp+ctqOdpqu3p67AraK2pa6vr6uoqLG3oK27mJGlpKa2opKep6COqqCOkp+jq6+aoKOvqK+Yo6Cco6qenp6clqudk5mhm5SQlquajpmZl5GWn5KJoZ6WlYWSjZGOlYuAfWaLhXWGdXiHgnOcaoWPlJOQiXyLlZKSmJSjk5+ZpIWKmol8c5dze4yAc3x/am9kXnBqYFtgWm5kUGBlUFo6R0dFPjI9PjkvKiYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dXl9dXl9fYWFiYWFhYGJiYmRiXFtjl5Wjp6Kvsauuo6mmrJ+ntaqQj52ltbywra2io5p6nqOypKWxqZebuaajk5mqnI6Giomcoo+unqKVqJ+gkpaZm66LqpaPqJmpjZmpj5+6t6SlmZyMiHmClIybk4qVkpSRjZKXo42fn6men7ijf4OvtaKvrnSjvKKxn3d4n6iwuZR1rKOeiYCrf2RcYnagj6WfhJd9bZKznKOnraqiZZ6fknN5mpdwgJiomG1/oqiKZZymnZKYmJaNkpyShp6bkJaEkoePj5KJhXdqjoZ2hnB7hX9/YGiHipSSi1p1lJBnaJCPc3uonJtmepqJhHmZaoWMhG96gGtyZV92cWxraFxmZmJicFNbPk5OTlNHPkBVRDoxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXWBoZmdYUEo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgrq+sq6mlqK2ip62kkpartrGzp5urp6yXc4ydsKCoq6eUl7mgoI+cpJ2Rf4mIm56MrJqilaehnY6Wkp6Eda2PiKebqZGXpImcu7SooJmYi4l1d5ONlpOKlJGRlI2QlKGPnKGnmZyylYCMm7Wds4ySjrqmoH6nonqhrbWAjo2lnoOLhpCxqq+Mipekm3qAi6yGm52hp6inh5WFmHelm3qHnIGXp4KCe5yyeoqGoZialZiWg5GXl4WbmWJ6h5CFj5CSi4NtcI6GeYBwf4CEfoVzhYSVkXiWZ5J0oJp1fZmFo6CImH+UjIWFmmuPjoZseHtxcWdkd29qbGtcZWtqZXRcXklUTFJARTYuWlVVNykhMDk+Pjc0MzU2ODs6PT4+QERJP0lFSkxHU1hbWVthYWhmWlFIOURMOz5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kfpaysq6isoKevpqappZmUr8i/saKXqKm2npCEnaycp6KgjZC+npqMn5qgkHyGj5mXh6ycoZafoJGMk4mGgJGnjYejnaSUmJ6GnrqyqJ6ako6FcXaQiZWQipSQj5uMkJKfkpehpZaeq4eftIm0mq2KyoeprIi2hY2wga+sgqiMppiNnX2oj3J7d5yPp5dolaR5tIyfnqankpjCgX+riJihcp6AmqV9l4WVsoGhfaGUoZCYl4GPlJyLmZKLfYWTh46WkomDbXKPhX55cYaAg3uDdISAloCPxWZ/qYePo2uehaSdhJqBjo+Hi5pxj5SFaHh1fHhoaHZwaGhsXmRwbGZsWGdHXVJNM0U0Nk5iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5pbFxRRT1LTUBKY1hdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJain6+nqKilq5+jt7Cpq6aalKCjpKukl6aruKOvgKGonaaenYmUvZmTjaGSno95hJaWkYermZucmaGEjot3m5yPn5CInqSclpqYh6O5rqWanIyMfmJtj4uTkI2QjY2YjJGSoI+UoaGZoad+oaeHrZ2glq2PnZyckIWAoIyprYWjjamZjJp/onWAmZRrgq12Tat4h42ckZqopoCpq32DoXt6p2qef5JrZ5eGl7eJnn5uYGRZg5eAjXtkaItymX15lmxdfZdtX1Jwg1xfa3iCX1hkgXyDf5dwp6prg6NucqVwn4WgamegbVtvjH1nWmCEgGJYUG93Zm10cmtqb11qcW1raVhpT11ZRjlBNUhEX2w1LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV11eYnVgTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnaC4oKmjpqyRoLa7qq6imZihoqWtrqGer7WjqJKhoKCnnJqOmbSZkIufjJWLdYGUkoyKppWVmZ6efpKFhaykh5uQipmpmZqbkoimsaeilpqIiYBpboiHi46OiouNkoyRk6ONlJ+gnKGkf5OBj6KhlKB2nJWPp4Kgpn+Fp6uDpXiJfISafqJwc5SIlnyfjXlthpuMmY+bqJmOh517gqJzdqZmnn53pF+Yen2TdKJumLe0unSTiIOAtahkgca4e3CVtoxygJqjYnOsq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRhnZmzlnJ9mJ+zdXNbnrKDamJvdHZxaW9Ya21zcmZdaV5iTEU9RDZRQlpzMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNT1FARV9fW1pYYGB8ZEhDOE1XVVdiYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlZSjt5iqm5OfjaS2tKytoJqinaSjpq6dnLKurJOYopqhpJmalJ6rm4uIkniLhXGAlo6KkKGPkpSdmH2QiY2ooIeXjomSpJScm42LqailnpCWh4V+anuHfn2QjYOLkZGJkJShg5eeoJ2gnouJd5yYoo2fcaGKh6mHm6WOlKapfa2MfnqgmXqjk3iBdJaIjZx9lp+Gm46Ym6WFomShfIiWkJuNbZ5om45vmpl6gIunfXJpdKuDn4N0qmiVml2bhXaFnmeqa4C4ZlyocIGcYJWMXqd2dYeIfp5omnWGk5KXjoCfb5qRbqeaXal/ebtrfqpcjoRdtGdcbnJ6eGtpXHFreXljYGZYYkJRRk83V0NSbzVLW1pfTlpEQTI1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuJqbSap4hjlJurubGvrJ6mnJypoJ+vnJ6xqa2el6SboaCZlpago5mGiY1qiIBye5eIjJaWhJGVmJB6ioSVo5yKlI+GjJ+SnZ2JkKmjoJqMkoqBgGmBhnl/l4x7iY6OiJCXm3+Uo5+goZOYcmifiZ+Pi3CSjICph5ieoaWepnuwraOiuJd3o7OjpICIlHmde6uZfqKOnJqWiJdxoXyFja+1fWuakaF5fpi1oqSrqISZfJt9npt/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iianF7jmyAiISZdZt4homxs3+Am5Ond4OebnN9lXCadGukXZV2SGVkYHRxfn5vZmBsaXZ8ZGViUV9XXVRXQFpGUWhEU1dcYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUI8VV9iWmVpVmdobW9iZmdeYWFcXV5gaGJfZWN2bV1lZ2ZrZGZsaWhraZOcgLCtmYRTXqCms7mysqiaooycrJycqpSirKSjqI+gnp2bmZaYoZ2WiIeJd4aBb3mVhZGbi3yRk5aIcoCIkqGcc5GQgYmalaGbhY+pnJuVi4uLfINshIVxgqGMeIaNiIiTmZZ8k6SgnqKIrYZ9tYSOnpx7pZZ6qYGVm4+Jn5t8p2h3bX6ZdKFzcnydhplwk4OufaSDpZ2ZgKNvXqhndaJjb6VhnNOQfXuZeHNzYqKGkH6jdKSQdmuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdnG18cJZtf3Kicl2kZ3OmYGimbZvUmn6Gm3B5e5dsnHx4l3NuqaRnYGV6cYCFbGhmZG52eGdgY1NcZlFRYkhYSlVhV1RbZWpcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWBmZmpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWllfGReZGdka2RqbWdobGiXmn+vqlRcS36pr7Gzr7Kjm5mFmamgoaSOpqmhmaqKmpiYk5mTkqGYjoeFe3B9hGh9j4OUmoF3kY6PiW9/ho+TkmyXk3yJkpOll4OPq5uUk4uGiXmDdoeAboKfhniBkoaImaOYe5SjpJmfibOhoraLeqynpK6lcKmAmo6FgJqQe6SAoZmGmHKehKSur4qXjICNpI2Vgq2gk3a1trXJoXOUi4GfYJ2XqW16lYegm3SiiHegfpOXi4FwTWajknCah3Oke3l0YYOBa32ga3FkX5xxfXOWaHlps7W0xqZzmH16nWucm6t2hZttdniYapp7dZhyUUV9s19qdmt6iGZraGN1dXFuV19UWWlQU2hJVk1ZVFZdaGtuVmdXTktBSk1LSEpPQVFLUGVjam1ldHJzf3l8bnWJe3tUUE5sXmlca2lSamhpbGhsZmNlYFxdXV5pYmRpa3tfXWRoY2pmbm1laWxloZuIrqWDZD+TobKqrq+1oqKQgJeqoqOljKWnnp2mg5qXlo6XkI+ck46Ig3pqeYdlg41/mKB5dY+JjIFphIWSg4yFnY15jYuWppODmKqYjZKLgYl6gH2LeXCQoYZ6gpWHiZagln+UpaiclZWDZm54nGyiZHtxpXebmHBnpoCVinqkep+Wg5dynneBipWXj7lukYqiYn2YoJWIbXJpqmt1oG1vpl+aaYuQaZaHm5Z1ooF+mmCMho11cIhiaKBlnn5pm3VvY2aIgW1xolpeW2KhbV2Ii256fXNyZKVteKJkZ6domXOMmXCib1WJkG+gX2aoVIteVJhubXNrcoJtcGlseXRrcFJZV1dmWlRtSVlPXUlYaWlzallrVlFSRlZcTFhTYVVpa193dHt9cHx8coN7gHN2jYCEdl5RcmJnY3BnUGpoaGtsbmhkZ19dXl1gamJqaXZ1XVxjaGNqanNtZmttY5yjl6V5ZHNti6ato6mwsaafi4CYq52fpoyjopujooGWmJOOmpCLmJCOinuHcYCIaYuLfJibc3WJfZB7ZIOHlYqKlZmCfIiHl6iRgaOskIaRi4KKfoCAjnNpkKaEfYeUjYiZoI+Ik6mmnYimeJWbfqSIlouxmJ2Qgq+XnqV2lIZ4qXOlj4SabqSijJKEjYO7bn2lr4KGhYaTlZyffKV6cqiVoJZmnn5vrGSWipaTd6htqqKBiXaJg3erkaaIa5Gwa3azjKlrioVtbZ+ekpVgfquLqnZ+foulnnaffIOklZ2gapuIeKxonq2MtnR3vo2kk1qDp46rYXVydHB8dXFja39vaW1TV1tWYWJda01dUl1KXm1ud19bcVlcYFtndGVub3JjcnRgd3p+eXJ5g3OEf4F7e4yBgoB2YnhkY25yZFJrZ2hvbHJqZmlhYF5cYWtibWx6b1xcYmlibWp4bWdsbmKVpKmcgX+do5apqZ2opq6kmYqCmKyan6WKm6adqZ2FjJqPhpyRhZKNjI10h3uIhG+NhX6Yk3R0hnKRgm1/i5GHhpOOfXuChpimjn+mp46BjomFlXaCh5JvbIupgYOMlI6JnZ+JjJSqop+PgHWUl4h+gXmUrqJ/gZtxj4Z3jomCfXtyp4xxfX16mJabhI95e39+h5SVk4p2kJieoIN7fYlrjIVbeXlyenFpbn6SiXGAdYGPlJNxh4SCZYx/X4F/i3d0cpR1b3lubYdshIVedWd3jmWAgIWNqJp9dHuVaomIcIF2fYd3bm5ojHN6fJh4hVxsWHmPaW94cnFveHhwXWuHbmpnVltgV11ma2RWY1VfUV9weHlsa3Zma2trd31ycnV0YW92YnR7gnh1eoJ1gICAgXiLhYN9e25/bGR5bl5XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5obG9hjZO3qKaJoKKapqOYpJyroqGEhJitkp6hiZunm6mYg4Gbi3+WlIeOiomNcoN8j31+j4V7mI90coRwlYV7fZKLhoaPhHl+gIeapY58qKGLhpCQhZWDho6Yd3KEqYaOkp2QiZ+eiIybp5+fqoOIjpWafn6Jlq2nj5Gmj3dvm4+BeJBufqiFcH2VcWtwfYGgjYCTjotobFyCi4ubmp6Oc5WLiHF0a4F2dIFZcm6HkYF+f4xqXWpke4aEiYBgaXh6mnuCioF1gYWBZ3eKhmphcHGBdF5xioGIjqWUhWWLjYNud4uEcYaPenFoaGV8hHuWW1xraG52W3x5eHVuc3ODZ1xti2trYlpaX1tZbHFcX2FaX11ldH97dXB0ZGtra3x9c3x5dWRudWhtfH53enx7eXqAgH5vhoqEe310fnlzf2hUXHFpbHZwdWdraGRdYVhraGtrcXJuV1tlbmxnc3pvaGptYIuKqbChj6Khmp6dl56YqKOifoOZro6glYicopGllX97mIV9kpmJiYaHinN+gYx2hYyChJeKcm+AcpiGg36Sg4SGiYB6gYSMnKGRg6eiiHmOl4mVi4ucl4SDeq2CkZialYqenYeIoaqfoaKji4eTm5yjmZWqoaemn5Kah5WMenaNjYOnfn+SkJOUnbKmm5WfkI2xkpeDpYyMlZqfiZCbgoiRimt8jnd4ZYOHkYt8iZ6Eh4yQiYiBhYSQd3x6dJmgiIaJnYmEk359ioCAdW9yhIJ+d4aGio+lkIKFjIaCjJCMfYiMipGEem2DhX56mWtzaWF0inF+end3b3d0gl1eb4dobl9eWl1dU2hyVmRdXWJsaHV8fHNvcGRrammAfW55gHJqcHFsZ4F7coKAeH99f4R7bYKMhnx6eXt9eoN4TmN2anNucHpla2VjYmBbdGZwZ3JxbVVdbHRtaHl6cWdpa2SMh5y5npahoJiUmJmUmKSgnnx/mqyPn46GoJ2LnpZ9eZSDe46ZioaDhIdueYGBc4GIfomUhG1rfnqXh4SDkH+Ah4SFfIeFj5yfk4eroIRzi5CGkpGLnZF9jXuqhI6TmJaPnJaHh5yln6KanYWCkpqZmI+Zpp+lnZyPlX+PiHV7ho2EpXt8jpCRhpmroZ6UnZCOqY2QgJ2MiJOZnoKPl36GjoNveIZxdWB/hJCGdY2ZgYOQg4eFf4WElW55dnSSoYqLhZqDhIxzf4l7fHJxeoeDeneJjoORpo+Fg46Ag4qJineGiYuMfnFtf4J8b2hsbWhfen9ofnx2dXZ1e3hcX3F+bnRgY1tdX1JnblRlW15ia2l2eX9xbG1ka2pogX9sdIFsbHVvenCGeW6HgHaCgH6FdnGCjYh+e3t8f3uCimBoe2p1aGmCZGpjYGlcY3Vob2J1bWxVY3F5ZXB6e3Nlam1ti4metpmgo5+SkZWYi5qen557eJ+nkZyLh6WVi5iZeXqNhXyJkYSMgoKDbnyAeXOBhX6LkX1raH2Cl4mBiI58foaEhnyPgpCdnZOJqJ2AcIyLjJKGoKGKhYx8qJGIkJKXk5aTeI2jn6Cdlpl/gJCamJKMmqKgo5mXkJp9jIN3f4KOhqB/foyMj3yYpKGik5qRkKaMj4GakYmSl5t+k5J+h46BdXOCcHdhfoCOhnKLln2IjHKMf4KFho9oeHJ4i5iRj3+WfYiKcYGGe3xwd3qKg3l5j4yClKSSi4WPe4WGh4R2g4SJiXxnc32AeXtxbWtnX35zaHx1dnR8c4BqXmB0dnB3ZGNZX19Sa2lVZVlgYWhqdnmCcWdrZGxoZoCAa25+aG9xbH55h3psjIFzgYF+gXR2go2Gf3x6f4F9f49pcoNudGlhh2hsYl9xVnRvbW1geGhtV2p0dmN1entyYmpveomMnrGRpaScjo+Xj4acoJudfXeloY6YgI2ji4ialnl7hod+g4l/iYKBf3J/e3R2g4V+ipF4Z2N+hpeKgoqMeX2AjYN5loKWmZiOl6GcfnCMgpGThqWbh4yJg6aVhZOLlpiTkneRnaChl5SWeX6Ol5eNlpqco52YkpSaeI2EgneDlY2dfoGJjYxzl6OfopSZj4+ijIqClpeDkpaZfpiNfIiNgXZxfW57ZIB8i4Vxh5OAkYJsh4OBgImFZnVve4WRl4t8kneLiHt/hXt6cX13iIR5g4+IipehlYGDi3aIhIOCd3yDiod4YHp5fnR/eGdtZWF/amp3c3R2fnF8Y2Ngc251cm1hWmFeW2xlUmNZYWFoa3Z5hnFja2NtZmh8g21pdWhucGmAfYJ5bZCGcoCDg390fIOMgYB9eoKDfnyQbXaJc3VtZYpsamJidlaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5utl6anno2Ml4eGn5OXmX54qp2LmXqXnYuMmJB5fIGMfnyEfIGDgXh0eXp0fYCEgImLgGRffYuVh36EhnV9fot/fZiGl5WYjaSimX9yh3uTkYmmj4yOipOgkYOSkJWXkYuBj5ifmpGQkHN/jZGTiZ2dnqaXl4yUlXKLjIlrhJePmXqHiI+Jb5edmqSUlYuMnouGgZGcf5KSlYaZiHuKioF5cXlrdWx8f4t+boaTg5V4cYKEfn6LgGVyaXt/lpeDfo1zj4eDeIZ8dXd/fIR/e4KLg4uTo494g4F0iYd9gHR2gomFcGF8dntyfXBib2NkfGNucHZzeHdzdGJ2YG9sdm5vXFxfXl5qXlBdWWNhaG50e4lrYGlla2Npd4duZ2xpa21ogX17d2+QiHOAhIR9dIGGiXuDfXqBhH19jnJ6i3h4bWyHamhfaXJjh2dxb2V3Z25sYXlpa317eHBheG2LgJiYqZ+jqJ2KipKFip2LlZh+eK+ZjZd9n5SRl5OId357in18gHd4gIBwdXR8b4Z9gYGKf3xhXH6PkYZ/g4Nze4CHeo+SiZOSnZOmnJaCfYF9joqRo4iOio2Ymo2GkpmUlo6KiIySnJKPjIxuhJCPkYiemaKglpWJlpBth5iDZYWYjpN6iYSQinCWmpSjk5KJi5mMgX+QnX2SjpKMmY57ioWHc3N2a3BudXyKdG6GkY+TcXWBfIGBiHxlcGx5fJmTfIOIdJCJgHOHeG5/fICFe4SLh4KLlKeMeoZ7foqFd35xcIGHhGVoeXV2cXxiX3Bha3RfcWp7eXlsc3BleV5ubHNtclhbX2Bha1tQV1hlY2dxcX+HZl1paWdiZ3GNb2RpaGVpaYF6d3VvjoV0gYKDe3WCiIV4hXx4hIV6f4l3f4t7e3J4g2prX3BodIBrcm9tcmdvbGV8Y26AendxbHd3in6il6GnoKabh4uLgY+ch5OddoKrlZOOh6GNlpSPf3N8doV4eX9zc3uGa3Nwem6LdoCBiG9xW1l+kY2HgH9/dnWAgICgh5KLlJ6YopWYeIp/gY2InJ2Kj4aSmJaFiZWakJeLi4yNjJyJjpCDbYmLkJGKnZahm5eUhZeHaYOigWWEnImQfouDi4F3k5iSn5ORiYmUjX59jpd7kYyPjpqSfIqAgm92cGxtb3B7hml0g4+Zi3F3gHWCiIN5ZnJudYCZjnuHg3mTkHl1h3Nvh3qEinmKhYKHjZqihnuDdYKLf3d5bmyBhYNec3VzcXF5Wl9xYXBrXnBqfXtxbW1qbXZgcG9rcW1ZWWJhYm5YUVRaZmdjdXCEgmJda25kY2Zrkm5gZ2dfaGuBdXJzcIuAdX+DgHh1gIuAeYV/eIeGd4OFfIaLf3t2in9qcWN8Y4Z8bnFtdGpob2x2eF9xf3l8dXV0gIN+pJWarJ6nloWNhH+XlIOQoHaMoJSThoubjZaOi3lxeHSCcHKFdHF2iGxwbnZtiHaDfoBublVRgauUh4N4f3dyg3qDoIKTgpWUmZyTm3iSe4OMkqOZk46JlZmShIeXmYyUi4mPj4edhJCKfHOLhYqOiJyan5uVk3+TfWiEm4ZnhZ+HkYSRgolxg5GYkJuPj4yMj4x3e5GQeo6LjJGWjHyIfIBrdmpua2xse39ien6Pl4F2e4F4g4x9eWdzbHOGlYt9h4V6k49weYNvdot5iIp5iHyBi4+dnYR7enaCi3x3cWpsgoR7YHhxbm1ydFZfcGJyYWBtb3pxaG9mZnN0aXFrYndlXVdmYGByU1FPXGZlXXlwiHxgXGlyYmJlZpFqX2hlW2dwfnBrcXSKfXZ8hoB1dX6MeXuFgXiIg3OGhX6MjIR8eZV4ZnJrg2CIfW9va3pgam51f3VfdH15hnh0c4V9eKCPmbCbpY6Ci3+DmYeAjJ+Ai5qUj4WImI+Pj4R2dHd0gHFwhXRwcoRwa2l3boNufX1tdXNSTYLfyJLWk3twdYR2hKCDlHeWkZmdkZl7lHOFkJ6hk5OQiZOclIZ/l5aIjY2Iko2Im3+OgHd6jX6JjIqcm5yalJJ5jHVmh5CFa4eihJGIl4OGY4yRmY+Vi5eMjIqLcXqUiHuOiIqSkYl5hXx/bHtlc3BrbHp6W4F5kJCBen5/gIaOe3pocmpzio6JgYSEfJSKa31+bX+LfYqFfIN4gI6UmZmKfHV3g494cm1ncYCFbmt1cGhqdW5TX29lcFpgbHJ4Z2tqYmZ4cnBwY2B3YGBWa19edlBOTGFnYl16cYl1XVxldmFiZWWOZGFnYllpc3Nua3F2jHx0eoaCdXZ+i3OAhn97iX9yiYiBkYuIfH6YdmVzbnxliH5vcGyAWWxueXlzYHZ6e412cneKd3mei5uumqCQgoV3iJV+fIqeiIagko+FjJiEk46HgXR4cHlxb4RvbW9/c2VleXF9bXp9amhrY6Sawdyu8KFzbHaEdoWjhpNwl5GWoZWcgZJyhouil4mNlYqQnZaDgZaQhYmPgJGKiZZ+h3p1f4l4h4SOnJqYmI6Pdol0bYWIiXyJooORiZyEhV6Lk5eLj4mPi4uEiW17loF9iIWJkY+GdoV9fmt9ZHh1am55c1iJe5KIhXp+gYGGjH95ZXJpf4mNiYGCfouVhGuBdW2Gj4GOg32BeH6PlJKYj3Ryd4eMdXNxZ3Z6hGN1bnFjanZoUmFxZ2xWX290emFyZGBpfXBybltjcmBiVm5ZXHhOTUxkZmJed3OJblxcZHleX2VlhWBjY19ZanNrbmtzd4x9dHeEgXh3e4lxg4R9foh7dIuJiJaGjH9+l3NndXJ5bIx7bnRxgVdxenZ5cmV3eYeNaXaAiXJ/nIaYppujkoR9cYyUd3mMnoWFoY2PfJaNgJmIhHtzd3B0anCBbGltfHVfYXh3fHF1fGhgZHzr2rXJw9yHc2x0gneLm4mPapmRkJ6WlIGJcYWIn42Ei5WKjJiUfI2TiIOJj3uQi4WPgX92eIOEcoiCk5yWlJeFjHWGfm+DgYeGmKGCk4yeg4lhg5SPh4qGiY2HgYdpfJN/fYOEiY6NgnGGfn9xd2h2cml0d2xajX2Tg4V9gISBhIqCdmFya4iAjomBfn6RkH1tgWt3hI2EkIJ7gHx+j5GPlYhucHmMhXRrcWxzeYJhdWpvXWx3YVJlcmlmU2BwdnVhcGBdaINxc2pXZ2hiaVhtVlt1TEtMZWdeYnNzhWpcXGV5Xl5kZ3thZF9dWWtvZm9qdHiKfnNzgX57dnqIc4WDfH+HdneKho+ZgYyCe5N1bHd2eXiTdG54e31YeoZxgG9neXeSg2R2hoVwipaFmaCaooqHdG+SjHF3j5x+i5qJiXygf4SZgIF4cnRub2Ryf2lmbXh4XGB5e3txcYBqYWdhf9W2jpGmeG5xd3xxk5GNiGuaj4mdk4yGe2mHi5mGgZKRhoeYjnyNjYGBio18j4x9iYR6dHqDe3GGgJaajpOTgYh0goV0gn+JkZydhpSPn36IYn+Th4WIhIqNgICDZ3yQgH5/goyPkH5tg3yCdGttd3V0d3ZsY46Bj4CFfn2Gf4SJf3BfcW+Ee46LgXt+kIh5cINleYGJhYqBeoR8fpKNj5GDbW55i351bW5rbHt/ZGlsallud1pTanNpYlFjcnhtY2ZeWmqDbnNiW2dfZGxfblVbcE9IT2dlXGdvcYBtWlxjc2BcY2x3ZWVdXVprbGNtanN3hn9xcH98fXR4hniFgnyAh3V5iYGSlXyJhnaIgXB4eXuEk29ue4F3XoOAdIJtaXp0lHNnc4h8cZKRg5mem6CGiHZ2lH9td5SYf4iQhIuOmn2MmnZ+dnFwbGphdXxnYmp1eltgeHx6bXF/ZWNoZ1edj19xc5a8xIR3cZSKkIB0mIyHnZSNiHNriI+VgHuUi4GEm4x8ioZ9fImMf5OHdImFdnZ9gnF1hoGelYaUj4KCcX6Hc4N6iJabloaSjZyAiGZ9k4KAhoOJiXKBfWd9i3t5f3+Hi499aYB8g3Zmb3l4c3d0bGuPhouCi395g4GEhIBrXnB3en2Lh4R7gI5/fnKAaHiBhomEgneCen+Wi46LfG1reoh8dnRvaWh+d2VdcWNYcHRTVG9zaWJOaHV5Z2FeXVhvgG90WWRhXWptYHBPWWxSRFRoYlpsb217b1lbXm1jWmNvd2RnXF1ga2pjbGlzd4GDcW5+e390dYN6hIJ8goV2fomBlpF4g4p0gYhzeXl+jZBvb3uBcWmCeXp+bm18dpZraniEdGuTjIWemKCZhYhvfox2anmZj4CCioKWmIp6j5ZvenNxbGpkYHR7aWBmcntbYXN9emdwemFlZI6xsndLYlql2tGXcnuSjJF5f5aMhZqSjYZvbIWSkXl5k4aAhJmKfIeAeXiJioSVgG+Kh3F0fXtqeYaDpZGEk4yCfm5+gnWCd4Sal5KKk4+UhYdwepKEfoODiYNvgXhogIV4cn9/g4qHfGV8foN2Y3BzgGl5cW91mY2GhIt8d3mAhHqCa1xvfHJ/h4OIfYWHeohxgG1wgoWNgoNxg3d/mIuNg3dtbX6Df3Z6ZWhqfnJhWnhaWXJuTlhydGZgS213dWJeXFtZdX1ycFdmXWZqcV9vTldpUz9ZZ19bcGtneXFbW1lrZVljcHlfaF1eZWxoZmxpcXh/h29tf32BdXCCe4CBf4N/doGFiZeKcYKNcXuGfHp5hJSMdWt6f2tvfnR/fW9yfHuUcG+Af3lmkomCoZidkYOGZ4eEcGd6l4p+gIWCmYqBfI2NaXhybGxmX2FveW1gYm95XGRsg3phcXZfZGXV676LMjo+i46AcnmGiY+Nd4WZjn+Uj41/bm2FjIt1fY9/hYKViXyDeG52h4WClnduh4RrdXt0ZXmDhKeMg4+Mg31tf3N1gniEmo+Lj5GSjIuGfnuSh3iAhY2DbIByaX9+eG18e4GKg3hieYSCcWRxaH5udXJ1gpyMgYCGf3R2foBzgW9ba31zeIiBinuGf3yId3lwa4eCjoKJcYB3fZSJin10bWp2gIB1dVxpaXlxWld9U1pyZk1bc3JmXEpxeHBdW1taXXV/dWlZYltnZW5iaU1XZlE9XmZdXnZmX3VxW1lVb2RaZHB5W2heYGdtZ2praHB4fY5taoGEf3lugXt9gX+CenWCgYyThXCAi253fYB7e4iTiYBpe35qdHxyhntzd31/jHp4hH58a4yMg5udloyCgWyNfmtof4+OfH5/g5SCf32KiGt1cWdpY1tjZ3NvYGFsdGFocIl6YXN0XmJjm6CQblw1Wq+1dWqAin6Th3eImId1kIyKd3BthYKGdHmJeIl9k4h6fnNndYh+fZdvcYZ9aHZ5bmV6iYWlh4CHjYl9bX10fn97ipeGgZKQmIiLhIl8j4lyfH6FfGl+bWuAe3lqenaCh4ByYHeBfnFkcmd1gm51e4aVkoJ9goBwd3p8dX5tV219dXOKf4Z2hnSCiXp3cm2If45/g3F9e3yRh4h6bW1obYKBdW5daGZ0clJcfE5ccV1PXHNwZFZLc3lqWFlZWmFxgXVhXV1gZmRoaGZOWmhOQWFkXGB2YVx1bVhYU3RhW2VvcldqX2Joa2dtbGlwd3yTbGiEiX18cH9+e4F/gnp3gICJi4Rye4dvcXeEf3uJjY+Ean57bnh5d4p3fXiAgod/hH5+em2EjIiYo42FhHt2i3prbYWJknl9e4KSgIB9ioRwcnBjZl5ZZ19wcGBhaHBmam+JdGF0b1tgZGp2e3++nKekybhyhYRzlH15iJSEdJKNh3JzcIR6gnN1hnSId5SJeXlxZHeGeoCSaHGEdWZ3dmRqfISInoKAf46OfXF+coN4fpCOgneVjJSPiIKIeomJbHl6f3Voemlsf3lzaXp2gIN9aGB4h31qanRoe4BqdoGNkZV/fH5+cXx2fHR+YlV1e3FyiIKCe4Fwhol3eG9vgoGLfXx3fHtzjYSBdWhwZ2yIgnJwXWhjdG9MZnZMXm9WVFp0bmJRT3R5YlJYWF1hcIJzW2FdaGVlY2pkUVtxSURkYlxkcV5ceGhVV1Z3XlxmbmhWbF5hamdlbm5ocHd6k25piIx5fXN7fnmCgYJ8dn2DiIaDcHaDc253goJ+iIuUf3GAfHh6eoGLdIN4f4GBgoR6gHVvfYmLm56IfoZ7d4Z7Z3WHjZF6f4B8iYaEdo+AZ3BuYGVcWGZZbXNhYWFxbGxoiW5gc2lYXmNtgHep2qnHhoizcop5cI52fYiQgXuUi4B1dHV+dn9vcH9thXSUhnh0bGB5gXmIjmVxg29ndW5bbX2BkJOAgXmSkn13emyFdH+PioNylYmRj4eFhXt/hm11dn9taHdmbXx2bWp3dn9/fGBieIZ6aHV2Y357aHWGj46WfXWAdnKAen1tgFlWcn1vc4KGfn93a4iGc3hqdH+Cgnx5e3d6cYp/e3Jnc2Rti4Rsc1tqX3ZmSW9vTFtjWFdWeW1iUFN1d1lRVlheYHKEb1xgY21kY11vY1RdckdCZl9eZmldWntjUlZcdVtbZ2thVmtgYG5mZmxxaHB2eI50a46MdX92eH13gYOBe3R+g4iIg29xf3VxdX2FgYmNi3t3f3iEfH2Fh3iHfH2BfoWAe35ydniLjp+MiXuKd3WDel5+h5qNeYeEdIaHhHeJe2JubVxiW1thVWp0ZGBbaG9wZ4dxYXFmV1xja398ys6HuqJrbm+LbXKEcn6Gi397koV6eXR5dXR6amx2Y4R2koJ2b2dffIF5i4hlcYBqanFjWG17hpyJg4Jyl5N3fXtthm+AiYqGcJaOkIiGjIR7eX9ycnB+Z2hyY214cWpscXd9fHldZXmAd2l1eGaCd2h1h4yOlX1zh2pvfoB4bn1dV3B9bXN+iXuAbW6Kf3B2ZnZ+f36AdXtweXOFe3hxZXJgbYuBa3JYa194XUlwbE5XVl9UVXxrYk9UdnNSUlVXXmJ0hmldYGtqZmJZbmFYY3BHQWhdYWZfXFZ8Xk9WZXFZW2poXVhoYV9yZmpocWdxc3aGeW6VinR/e3d+eYOHgHVzf4WFjoNwcHt4d3V5hoWHjIZ6fH91i359hoSEh39+f32Hf3x4dnl2kZOffo19i251gHpkhIiYhnSSim+FhYJ6g3VjbmpZX1tdXVVoc2VgWWRycmeBcmFrZFdaX2l/eL6uep+4bmJ0h2l1fHJ6hId7fo2Ad3hyd296dmVqb2GHdY6Bc2piXn13eIqCZXB9aGtrWlZveIukgYV/cJmScX93dIBsf4CPhnKTh4yIhYmFfXl1c29peWFqbWFtdmpna2t5d3p3W2d9fHhlcn1uhHRmdYaNhpaAcItna3uDdGx1Yltuempzeop7gGV0h3xtcGd0fXZ8fnB6anl6gHh2b2VsYWyJfWxuVmpheFZLa2xPUk9pTll9aGJPVXZsTVFUVV5mdoRnXWFxaGdhV2lcXGtpSkVrWmJlV1hVeVpOV25qWV1sZV1aZWNedGZsZXFmc3B0gXhwmYV2f394f3yFh311c4KHf5WDbnN5e3tzcoWGiIiEeYF9do9/fYSJjoSBg3t+i4N7d3x3dpqdl3qKg4dqdn59bISGlYFyj4JxhYJ+goBvZmxnWF1bXFtUZXBlX1hjcnVpdnBkZWJXW1tof3BvcoBzimVmen9qdXd0dISFeIGFend0dW5renBhaGtnhnSNhG5mXl98b3qJfWhtd2ZqZFZXc3COp32EfHaWkHN7cXt4bHl6j4N1l3yHhoOHhH11cXNtaHVdbWlgbXVkZ2Zpem97cllngXZ1aHCAeIJ2YneFi3yVgm+Ma217gXFmc2Vga3hmcXWJen1hdYN1aWtxdHlveHdye2V9fX53dW5iZWBshnxta1ZqY3JUTGprUExPcEhefGZhTlZ1ZUpPU1hha3d+Zl1nc2llX1djV2JxXUtLa1hkYlVUVXNWTVl2ZVpfbGBcW2NlX3dnbWJwaXRvcX51dJmBd3+AeIB/hoR6fXaCg36YhW5ydHx7dHGFhY6BgHqLdXSQgH2BlI6AhYR9foyGen6BdnujpYp5iYaFbHV8fHWEg417b4VzeoV9goN1bmppZVZdW1taU2NuZVtYYnR7amltaGBhV15aaYBpbG+AZ21iaXt6a3R1dW+GgnqBfnZ1bnpoanlqX2VuaIF3kIRoZVhhdml9hnluaW9mZ11VWG9pj6h3gXp8kI54dG59bXF0eI1+d5R0hYOAhYl2anN2aGlvXG1lXm5zX2dianhoe21bbYNydGpvgH55d2F3hYR4kIZziHJwen9yY3FoW212ZG9yh3p3YXKAb2dpeHNxa3d2c3Vignp9dnVvY2JibXx8a2tVaWJnVExuaFBIUmxFYXlmYk1Ucl5KTVVZZWx4e2ZfbXBqY11WYFVvbldKU2hYZ15YTVVsVEtdel9cX2xdXVtiZWB6aGxhb292bm93dXqYfXeAgXmAgIeGenl6g32Bk4RxdHR+enZ0hYiQfoF9kGxzlYF7gp+Ff4d9gH6GgoCKe3WErJ9/eoiIhGxygnp2gYGCdW6Hb32AdIqAam9uZWRYX1paWlViamdcWl91gmlebWxcYVdbXGuBZXF1fWlqXm14d2h1eHNuh3x+fnp2c2x6Z2l3Z11kc2d6d5KBY2NUZG9mgYR2dmZoamFXVlloY5Cob393f4qOenBve2Z3bXmKenaOcYN9f3+HbmR3dGVoaV1sYl5wcFtnX211ZXpoXXSAbnJrcXt+dXVidYaMe4iIgH94cnV+dGFwbFhwcmFvcIN6dGNxgGtgbHpuaWh5d3NwZIN0eHh0cGRgY21yfWpsVGleX1VMdWNRR1diR2N3ZmFMVHBZS0xYWGhsdnplZG1xZmNaWF1YdmZUSlxjWGlYWEhXZVFJY3hbXV9tW15cYmNef2lqYG50eG1vbnaDl3lygYB9f4mMhn51doZ4hox9dHV1gnl6eoKMjn1+hYlqdJaBe4qdfX6FeYB7fnyGiXNxj66Me3uHkH5mcYh6dH59dnJvhmx8fm2QemNwcGJlXWVWWllXY2ZrYF1dc4ZoWXFuW15YWlxse2Jxd3ZsY1xudHVodXdxboV5f4F6d29vdGVodGVbZ3VmdnaSel9dU2VlaoKBc3xhY2lcVFdeYmSQpWl5dIKFkHhsbXlmd2x7g3l0h3KAeHx5gGlld21gZ2Ffa2BedWtZZl1vb2J6ZVt3fGtubnB4eXR1ZXODk3+Ig4l6dm9yfXJheGNabm9gb3CAenNlcYBkXm11aGNmeHpya22Ac3J7cXFhXmVtbn1kaVRoWVpVTnlfUkpaWUhjdWRhSlRtVUpMWldpbHJ7ZGxsc2JhWVpbYXZcVEtjXVlqU1ZHWWFOSGp2WF9hbltbX2JjXYVpaGJud3ltb2p2gZB4bYN+gIKSiISBdnWJdIyGdHF2doF3fX1+jI+Bf5N+cHiWg32ZknmAgHh5fn9zh4RzcJmienuAiZV5ZXWIenN5d2x0cH9seXxwknNecG9hZ2JsVFtaV2lkbWZcXHGJZVNybltZWFdgbHZkanVqal9bbnRybXR0dWuGfX+AfXdvbmxkaXBjW2tyZHR2jnNcV1RkYHF/fnGBXGJjXlNaYVxkk59lcnGFg5Bza2p4bG5ueXl6cYB2f3N7entkZnZoXmNbYWhcXndoV2JecGhhd2FbfHZqanJveHRzdGlxgpWDh3+FdnNqcHxtZndXW2lsYXBxf3hzZW9+WmBwcGFeaW98a2pyfXFvdmlvYFtka2x7YWZUZ1VYU1F3XFJQWVJIZHNiYEdWa1FJUFpVa2xrfGVtb3JhW1pYWWxwV1NQZldXaVNURlpcT0lzdVhgY25jWGFhYl2MamNlbXp5bG5pdnmGemuEfYCFmXyChHl9iG2PhnFvdnp9dIKCfYuPg4KXdHiClIWBn4l1gX+BdH+CcIeDdm+il3N7houHe2Z3i29ufHBneHF7bHN2c41rXnRvYmdla1NeXFZoYmxsW1xxjWROb21cVldVZ2l0aGN0ZWVeWnB2b3F2dnpsiH2AfYh3kHNjZGtvYVxubWNzeIdrWlRWYmN3fHxwhFxjX2NUWmBaY5eVY25wgoWJcmlmeW5kcnVxemt5dHVve392X2dzZFxfV2JkWWF1ZVVfYG1kYXFdXX5vaGlzcXRwdXZsbYWUgol8hXFyZ258b3FvUlplaWRwcn91c2JsdVVicWpbXm5ke2RrdHxxcXFpbF9YZGlqeF5mVWRVV1FWb1hRV1RQSGVyX2FGWGtPSVhUVm5pZHxpa3hrYVdcVVt0ZFNSVmhRWWdUU0haW1BOeXdbX2VtalpiYF9ej25hZ2t5dm5uaXZ2f35thIB+hpd7f4eBin9rk4hyZ3SAe3WAg36Jjn+Lk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Ld3hueo1gZX1xZ3p0eWxtcXeDZ2R8bWNnZ2hTYF9VZ2Bsb1xebo5oTWlsYFVWU29mc2tmeGVlXVpydm5ze3lzbol7gHece3prYWVsbV5gbmplcHl+Z1pWWF9seHt6b4NfYl5nVllgWGSciGJrcIGGfHdranZsW3VwanlpdXJub3yBc1hrb2BZXlZjZFhlcWNUX2JpYWJsWmB+a2Zsc3VvbXh2bGiGjH+Je4htcWZwe2xxbGFYX2dnbnJ/c3JeaWxTZXBkVWJtYXhhb3R6dGlua2peV2BmaHVcZFZiVlRPWWdTT11PUEhlcF1jR1pqTkpgS1htZV94aG5+ZGBVXlRddVtUUmBnTl5iVVNKXFpRWnZ2XV9mbWhYY2FbXo5wY2hqd3JzbWh2dHmCc4KDeoiOfnyKiI55bo+KdGxzgnN/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2OjYyNjY6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQkuSmpmZmZmaemxubW5ub2pmZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzP5OenJycnJ13ZWdnZ2doY19fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGjY6Ojo6OjouKioqKiYqJiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpORi5KOjZGIj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2MjIyNjY2NjY2NjY2NjY2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6FjYeGiYaIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkIiLhoWEhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCQiIuEh4SGiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjJCIjIaGiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4enx6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4uOjIuOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5KSkpKSk5OTk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkZGRkZKTkpKSk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKPkpGRkpKThoWTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkYKAkpCRko11h5GQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QiHCCkI+Qe3WIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+Mc26Jj4lyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjIx2bXqPgnN4ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh3NtbYJ5dHWAhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWVhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnd0YV5kX2JqcGZoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGFfbWxdZmdnZWJjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aWmt3bGJvc2piWllfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01banJrX2x0c2dRUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTlxjbmtaaXN1cFNNT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tFQ0VJVmJma3Fwbm1sWk1MTk1OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQ0dISU5bZ2hncW5uaWZkYF9fWExKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD1IWVxbXmZsbmtvbW1sa2lpamJRR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs9Slpobm5wam5ta2psbGRPR0VER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs6PUVgbnNubmxsbGZRQj9DRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdHJxdHh4eX1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OTxIXHR1cWVQPjo7PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PDpBanxpPTk7Pj0+P0BAQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDxcbkA+REU/QEFBW2M8PT07Oj0+QUFAPkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213SDg7Oj0+QTpJZD08PTw4Ojs/Pz08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PT1JTEZGdXdNNzg4Ojs+PlZqQTs8PDo6Oz4/Pz09OTo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENyeUk7XH+Df3p8d1c8PT89PT5FaHRMOj0+Pz09P0FDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBR3J5a2KDhIOCg4B9Xj5AQ0BAPUpze1k6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHt9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBFbnR9goKBg359hHZNQUNFQD8+WXuAXT9DRUlKSUlNTUtFQ0ZHR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp7e35/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUZGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7enx9fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hMTUxNTkxJRkdHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVmyEh4aGhoeIiId8UEtMS0hIRkZERENDQEBDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKVIGDhISCgoWGhoOChoWEhIaGhoeHhop1S0pGQj8/QD8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYCAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSUllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI9oQ0E9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUdPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjIlgQzc1NTU3NjY2NTU4NzM1Njg6ODc2NTY1Njc2NzY3OjY3ODg5Ojc1Nzg5Nzk3NzY6PEBHRklHSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA2Nzg4PTo9RUNCZYWDgYCCg4ODg4OGiYuKiYmKioqKi4mKiodmSTU5QDU4ODc0NTc4NTU3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3NjY5Ojk4ODY4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISFhomKioiHh4iIioqMi4qKjINlUFpDOjw9Pjk5Ojs4Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PDo+Ozk7Ozw7PDs5Ojw4Ojo6Ojk5OTw/PDxBQkRISU1LSUtMV29yc3Vzdnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiouLjH1qUz1CREVFQkFAQj9AQ0FAPj0+PkA/Pz9APj89PT9CPkBBP0A/PUBAQD4/QTw+PDs6Ozo5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uLi4yKi3RFQ0dKTEpKR0dIRUZIR0VCQUBDRURDQUJCQj9AREhFQ0VDRURBRkVGREVGREBCPjxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMjIuLiVpKUE5OTE9KSktJSUpKSUVDREZHRkRDRUZEQkhJS0dIR0ZIR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2MjIuMgWxtVU5NT0xKTEpJSkhKRkRHSUhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozs9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyMi4uOfWBYUE9OTUxNSkhIRUlJRUtJR0pKSUpHR0dLTE5MTEhISUpNUU5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVG5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyMi4uKX1RUUk9PTktKR0ZCR0pHTEtGS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0ZGSEZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyLi459WlhUVFZUT01LSkRFR0xPTk9XVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRkhKRERFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUJAQkJHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjY+MjIxpWVhrYkZUUVFQSjs7UlNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdGRkU/P0FBRUFDR0VERUxYUk1UVVZYWnyGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox+YYqLi4dtXGVWOllZWFNRP0BWVVhcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvdHZ4eXh3enl6e3p6fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiox6b3BZW1xbUlRSVlZVW1p1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHhIt+Z1lZXFlUVlRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGddW1xdXVdST1NQUFJWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ+gHxdUVZYVVJVU1FRTE9NS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbXFxeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX5+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVdKTE5PS05LSUpERUlFQz5UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t8fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXlxZVVBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dTEQ/Q0NDQ0JARFBCQ0FDPUNJR1ZASE5MR11pUEhGTkZERUZJR0hCREhHSUtHREJBREBPUU1SZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH1/g4CDg4KAgoCCgYJrTUc/QDs7Pj8/Pz8+a1BKYEVGSElFQj9HTE5HTVJVSUJFPz88PTw9PT89P0FDQ0A/PT1CPkpOR1VudHR1c3R2eHp8e3x8fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFVVV1FRV1VQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTVdNSEdAQjw5Nzc1OTk9Ozs7ODk4Oj88Qkg/XHN0dXV1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QX11aSUhQUlFPTVBRTlFSVFZYU1JZVE9ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGRkhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVldeWlhNS1RUU1BRVU9MUlNUWFhUVFlSTVdZWlZYWFZYWV1XV1hoc2tdVmFza2FhX15kYV9eWVRRTk9OTElISkxJSUZDUVBTW1dUVE5RU1lTXGVVT1NTUU5LSUhDP0E5OTk4OTc4ODU3NTc4NTk6R25xdHd4eXt7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09UVlhYWVNVVExLVFZVVVVXUFNVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxQU1NPTU1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8+PTo3ODc2NTk5Njc2NzVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xdUlRaVldVVFdUUlhYWVlZU1VPSkdPUE9PTVJKUFBPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEpPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtIRkxNUE1HL0VfUj4zPz5qb2FTUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dXl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1NRU0FHVVBPUVFQTk1OTUtMS0tOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVUxMS0k8OTg3Oz5APjw9QUBCPT5FSEdDRUZJR0pKQEZBQUBGSEVKT0hRUmFcUVBST1NPT1BMTE9NTE1MTU9OW1dLTVFPR0lIQ0hKTExKRkZGRT9CQz48Qkc/Qj9BZHBzd3p6ent8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRD05Nzc5P0I+Oz9CQEA+QERJRUNHR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTUtMTU1NTExPTlNkTkpMUklJSUVBSEpMTU5KR0lHQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4Ojo/Qj88QEJBQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVDS05SVExKSU1UR0lJSkxKS0xJSk1NT1BSUEtHQ0xHQ0JKSkxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent6eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxSEtER0hIR0pLSUpLREZCPT49OTk6O0BCPz1CQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESElMTUhKTEhJSkxLTV1SSEhETkZBQ0pKTUxQTUtNSktGR0dKTU5RTkxibWl2dnd6eXt6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo6QENAPkJDREVJRUlKTEZJSUdGRkRCO0FDQz5AQ0RDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJR0VOSEJGTUtNTE9NTU5NS0hISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJREZGRUNDQkVAREI+Pz46Ozs9Oj0+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9REVCPkFDQ0NER0hJR01QSkZGR0tOT0tGSElGRURFSUpISklGSE9LQ0lNS09NT05PUE5KSklMUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUdDQkFCRD1CQT5BPTo6PT86PT5AQj5AQkRGSkVJRklIRkZHRUNCQUFGRkNCQkJERURHR0lGTFFMSU9KSkxMSUdIRUdGRENJSUhLSkdLUk1CTk5NUE5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JlZmZkaGhmbmpmbW1oa2ttcmlxdnRzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQURFPEFAQEM8ODo9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0dFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUlBQUU5PTU5QTUxNU1dWWFhVWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkU8P0JCRDw3Oj49Oj46QEI+Pz9DRUZERkRFSEVERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdOS0xLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BST1FNTlFOTVBXWlZaWVZaXVlYYWBgYF5oZWNgZGZoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V3dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TkhIR0lEQkNIRTxARUJFPTg5Pj49PDxBQj0/PkFCRkNFQ0NJRENFRUZHR0dJRkdLSERJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOS09OT1JVVk9LVVdTUFNRUkxPUVBPVFlaWVxaWVteXl1gY15cYWNrYmBkZ2dyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRMSUtJS0ZCRUdFPEBHQ0RAOjw/QD8+P0JBPEA+QUFGQ0VFRElFRkVHRkhIRkhISUtKRkpISEtIRkZMSUhHSkdMTE1MTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9SUlBWW1tdXltcXl9fYWBhZF1jYGVmYGVoamRzc2ZqZ2drb3Jxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0NFREU8QEZEREM7Pz9CQEBAQ0E/Qj9BQ0hDRkVGSUZJRkdESUlHSUhKTEhISkpJTEpGSktISUtKR0tLTU1KSk1MTk5OUEtPUVJUWFZNTlRWVFJSUVBMTlRTUldbXV5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S0xMTE1HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHQ0hJR0hKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSEpJSUtISkpOTE5LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RFS0ZFSk1MS0xMR0dNSUdKS0hLS0lLS05MTkxMTElMTUxbc2JkcF5sbVVNTmZzXWZmcWxudGdwaV9hWW5uYnBwYmtqamZvcXRldG5vXG91Z3BNSnF5dmthYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQkZDRkVGRURDSEhHREVLSEdMTk5LTU1GSk5ISktKSUxLSkpLTE1OTk1NSk1NTltyb29ucHBsa01QUWxXTWlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBdX3JrcWpVdXl4b2Nea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFSExKR01NTktNTkdMTUlMS0lKTUlLSUpLT1BPTk1MTk5MXGhkdV1scVdsTlBRbVRZa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDR0RIR0xIRUNDSEtJSEZKTExGTkxMU1JMR0xMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXJrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJpbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQT5EREJHREhJTUlGQ0ZKTEpHRktOTEVPSktXUktHS0pKTklISkxJS0pISEtNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam5fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVDRkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJR0tLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVllbXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRUFFQ0BESERGR0NJS0xIRkRHS0xJRUdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUdISUVGTElKTE9MSVBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkRDQkVJRUdHRktKS0hFRUlKS0ZFSEhQS01NSk1SSUdFQUhGSklLTEpMSkhGRElGREZHRUZKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDR0hGSEdIS0pKSURGS0tLRUZJSk5LTktITE5HSEU+R0dMSUtMS0tLSUdESERDREVBRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWFVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0eHl5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUdJRkdISEZGSUdIR0hLSUxEREtLTk1MS0hLSkhJRj9HR05LS0tNS0tLSUZHQ0RAREFISUI/SUpIT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFFbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0dJR0ZGSUxKTkZES0tNTkpMSUtKSEhGQkhIUU1LS09MSktJR0dFRD9FQ0lJQkJHRkVUXVleWF9ZX1tdVVhYT11dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWEhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUhGREdNUkhDUUpFR0hIRUZLSk1QRUZJSktOTExJS0xJSEdESEtRT01NUExMSktISUNEQUVESUdDQkdGRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdT1lhXGBgX2JjYl1hYldfX1RQT09PV1FcW1tcXF5fYmZmZWxlb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlKS05MS0tMS0lKR0VKTlFRTk9PTU5MTUhLQURBQ0RHRUNCRUdCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU09MUFNSVVpZV1lYWGRXT1NUUFBOTU9UU1pYWFpdXGBhZGVjZ2NrbHBzcnl5f3t6f4SEhIWEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUhGR0RLTV1MR0dYTEdISkhHTUxRUUhMS0tLTk1VTk9KSktHR0tPU1NOUE9OTk5OR0tGYEVEX0xFZmRFTltJXltybU9NVW1ZTERQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUZHRkhFRUtPU0lKRmBUSElPSklPTVJRS01MTE9SVVJPT0lMTUdITFBbWU9QUE5PT09JSlF/UUl8WVlxdFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW19WVlh/anR1dV5fdl5XYVtbZltfYGFhYV1gYWdtcGxgcHd0eIGBgoODgn99f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExGSUtFUVZMS05JS1JYV1FNT09NUVROT1FPS0tOR01PUltaU1FST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3NvcnJ7fG9+eG6Acl9gYGJhWmBfZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOS09IUVJUWVdWUFRQUFBRS0hneGxjeHJtW0tOVnlwdW11Ym92UGVlSWZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f29ob1l2dmp1dXCAX3JmfWlseHxvXl9fYmFbXWJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3F5e3Nydnl+gXN1em58fXl4cm5OSlN1TkNCRlBQSEpLSUtQT09PTVBaYFpXS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW9tanBhY2Zjb3d4b21wc3l+bnFwa3t6dHNvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWFVNVVlVZVhSUlleU01NSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfWnB6e15genNjcm94cWhkfWlyfF5UTGxgdnVraXV7em1+eGt8cFxeXmJbXmJkZGdlZWViWmNjaWtrcnNydmdsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbWttT0hLS0hKSEhRUExOT0xLUlJST1NSV1JWVFBXWlZWVFRUYV9QTk1KVFNUUVZWTk5MTU9QSkhRTlBVTEtMU1RTU1RQVlVRUU5RUVhZUk5QVVRYWFhbW1VSU1dbV1hYWk9TVVdYWFJeWVdeVlRQWVJXV1dXWF5aZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2JnZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2p1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PTE1WVFFOVVNOT01MUVBLSlFRS1FNS0tQUlVTUVJTU0lITE5PUVJRUVFUVlJYV1xXU1JQUlRVVlNaUU5TUldWVFlWVFpWVFJVVFRUV1hWXFleYF1cWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGlnamtlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBKTldTUE5VUE5RTkxTUE1PVVNOUU5NTlFVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1ZWWVtUUFRVWFVVWlVXWlZTUldWVVdbWFpfXFVYXlxeXVtdYGFeW2JiY2dmZWRiWF9hYl1gZ2RmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhT0xNTFFRTE9UT09TUU9RW1lXV1hbWVhZVlxqZFZYWVpXVlNTT0pOVlRQT1RQUFBNTVJSUFJYVFFRT01PU1ZPWFJUVVVPTk1RU1ZVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFdWVlZZVFhYVVNSWVdVWl5ZXV9eVV5cXmBcW19fX19aYmJkaGdkZGJYYWBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWFpbZHFtaGRfW1hWVVdRTE1WU01OUk9RUk9MUVNSVVpVU1BQTVFYV1JXU1NTWE1PT1FUWFZVVVNVWFhbXl1bW1ZRTlVWVVtcV1JUV1ZXWFZUWFtUU1JaWFdcXlpeX2BVYVxhYV1gYl9cYF1jYGNnaGRmYFljYGFfX2VkX2BiW1pcW1xZWllYV1xaXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUU9UVFNQV1xcXFheXF5WXF5qcXd5gGNcW1VVV1FNT1ZTTlFRT1JUUkxSVFRZWldVT1JPU1hXVFNVUlJaT1BTUlZbVldXVFZaWFxdW1tdVlNNVFVVXFxWUlRWVlhZU1VaXFVTU11YWl1eXGBgYFZhW2NiXWFkXlxiYWJfY2ZpZGZeW2RgYWBgY2VfYl5ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdcVFdXUU5SWlNSUVRSVFVUS1JXVltaWlNPU1FWVlZUT1dSU1pSVFRUWF1XWFlTWFxYXl1ZWl1UVU5VVldeW1hSVVVZWVlVV1pcVlRXXlpdXWBdYmJdWV9bZWFfZGReXmNjYV5lZmlkZl5dZGFgYWFiZGBiXlhaX1tcW1hYWFdXW1lbYFxbW1xbWFpbXlZeWV1QT09SWlBaVFVWVlNUVF5eYF5eYlxgVV1eYmt5dGx9a1pVWVRQUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVFXUllYWV9bWlRVVlpZWldYWlxWVVteXF5gYV5kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNOUFZZUV1VVllXV1VYX19hYWBjXV9UXV9iZWV1gXpoV1lZU1VTVlxYV1dWVlddWE9VXVpeXVxUUldTV1dVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVhUWVpaYVlcVldYW1pbWVlaW1hXXl9gX2NiYWRkXGJcYGZhZGZkXl9kYmJbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5TWVZTXFRWV1lWVlxgYWJjYGNeX1ZbYGRhX3p1b2hZW1lVV1RXW1paXFlYWWBXUFZeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19aXV5ZXVVSWVdZWV1iWl5WV1tcW1xbW1pcWVpfX2BgZGJjZGRiZFlhZmNmZmVeYWJgY15iY2lkY2dfZ15hYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TT1ZZVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXltcWlZXWFlcXF1fW1lbYlZUWF5dYWNcUlZZUFdXV1dXVlNVVFhcXF5gYF1gXFdhXlteW1peWFVYV1tbX2BcX1hZXFxdXl9cW11YW2BhXmBlY2RlZWZiWGNlZGhnZF5jYGBlY1xlaWRlaV9mXWNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1lYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXF5ZWFVXW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmVjZWZlZmJaZGZmaWdiX2NeYWZkWmloYmZpY2VeYmJjYWBgX11cWlhcWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lWXFtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRdXFhbYmVjYVJcWk9ZWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXVlZVFhdXV9gX2BcW15eYGJjXVxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxjZ2BcaWhiaGllZGBiYWNhX2BfXF1cWVxZWFdYWVhXXFpaV1dYT1haXWFjZmZya39KWVdcWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWVhVW19eXWFhYF5bYGFiZmNfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgWmZnXmFoaGJoaGZjYGJgY2JfX19cXVtaW1lYWFhWWlZcW1pWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeEgoKCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl6e3t7e3t7e3t7e3t7e3t7e3t7e3t6enp6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7fHx8fHx8fHp7e3t7ent7e3p6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvIaJiYmJioJFPj8/Pz87m8O+v76+vcrU0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyNgzoyMzMzMy6h0szMzMzL2eXl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl6enp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8dnV1dXV1dX6DgoKCgoKDhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z3enh6enl+enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t8fHx8fHx8enl5eXl5enp6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3h9eX19fH17eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x6fX18fX14eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHp9e3x9fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh8en18e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHp5enp4e3h4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoSDhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FxcXJzdHR0dHR0dHNzdHNzc3R0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJycnNzcnJxcXBwcHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXF0cXJycXFuf4NucHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcIiIcHFxcHSagG5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxfKKEcHJwjp58bnBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXF1nqN4cHignH1vcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFxcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGYqZFvgqOdfnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOBg3lyc3NycnJzcnJzc3Nzc3NzcpOqpXyKoZ18cnNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH59fHZ2d3d2dXh6eHh4eHh3eHh5obOpp6mql317eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3x7e4qvoqG1qaukf3t6enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19maSWobGfmKaVfYB/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYGcm4yfsKGgop6AgIGAfn5/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBgJebkJewoJiUnIZ8fn5+gH5+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn9/gH6Aoayll6KanJmioYiAfn5/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOChISIkKKypqChmZ2dpqesqaGbkoeBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OGjZ+tr6SamqCbnZydnaCkopyTh4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GDiZWYlpWYn5udnp2amZePiIaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYWNlJOWmZydnJWPiYeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4OHj5WNlJiQhoOChYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoGCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgYCGmYiMhoKCgoGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgH+CiY6AgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf3+MlYKCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGQjIOBf359fH2MnI6AgoGBgoKElJSMgYKBgoOCgoGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX19e4GYjICDgYGBgI6UjJCBgoGCgoKBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBlZ+Kfn6AfYeLfoSEg4SCg4OCjYmFjIKCg4KDgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn99fX2Ag4SDg4SDg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5GSjIqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/f39/g4SDhISEhISEhISEhISEhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhISEhYaGhoWFhYaGh4eGhoWGhYWGh4eHiIaHh4aGhoeHh4aGh4eGhoaFg4OEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhYOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH+AiYWGiIiIh4eGhoiHiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGh4WDg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgoKBgYGBgH+Af39+e3uChoeJioqJiYmIiYmJiYqLioiIiImJi4uKioiHh4iIiIeHiIiHh4aHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUkpCPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn58e3uLjIiLiouKiYiIiYmIiYuKiYmIiYiKiomLiYaGhoaHhYaIiIiIhoaHhIOChIeIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fYGXkIiMjoeHhYaHh4eHiIeHiYeHhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYGBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KDgX18fX+Af35+fn18fX58eoSak5aKg4OBgoOEhoWFg4OFhISEhISEhYSCgoKBhISBgoODhYaFhIKCgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImFhIWEhYKBgYGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+Ag4ODg4OCgoB9fX+AgIF/fX5+fXx9fXt6eoidjYOCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICBgIGCgYOBgYKEg4OFhIGDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KDg4KDgoOCfn1+f4CAgYB+fX19fX59fHp7e4qFgoB/f39/fn+AgH59gH9+gICBf4CAgX9/gIGBfn19f4CBf35+f4CAf4CAgIB/gIKAgIKBgYOBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgYOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Ag4ODgoKBgX99fX5/gICAf359fX18e3t7enp6e4OEg36Af35+fX9/fn+Af35/f4B/gIB/fn1+f39+fXx+f4B+fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6enp5fpaTg3+Af39+f39+gIB/fn9/gH+CgH98fn5/fn59fH9/gH9+fn9+gH9/fn9/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p6enl5gouEgIGBgYCAgH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFgoGDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fX18enp5eXl6gIKCgoWDgYKDgYCCgIKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyJlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgICBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWEhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eXh9goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgIGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgYGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHh5eXmAg4N/g4yEg4SEhJeXg4OEgX1+gYGCgYGBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4ODg4KDg4KCgoKDg4KCkZCLiIiHiYeGhoSGhYSEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4eHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5eXyBgX6IloODg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhISEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6ent8foGDgYKBg4KAfn1/f3uIkXx8jpZ/fX9/goaKhYODhIOCg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDhIOBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYWEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl5fX1/gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEg39/h4N9goGAgoKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODg4KBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXx+fn5/fn59fX18f4GAfYaPgX59gn5/foCCfHyAf4KAgYB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIuOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeFhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF/f4B9f35/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fX18e318fHx7fHx8enp5e3x6fYWDg4CBgX6Afn+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoWDgICAfX59fn9+i4SBh359fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/gH1+gH5/foSSjY2Mj42MioaEhYSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgXp+fnx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1+gICDg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4J/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8fYGCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEg4GCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXt/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+fn9+fn9+fHx9fHx9fH1+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKPjImKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59gICAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fX18fXx9fX19fX18fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLi4mMkZCOiomGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgoKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eXl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYF/gYGBf3+Af4CBf4CAgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH5+fH19fH19fn59fn98fX17fH1+fHx7fH16enl5eXl6e35+gIGDh4SIj46LioeFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgoGCgX+AgoSBf36BgH1+gX59fn+AgH1+gISAfn5/fX59fIqFfX5/fX5+gH59fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH19fYCDgImOi4yIhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgYOBf4CBhIF+foB/fX6Afn1+foCAf4F+f4B/f3+Af31+fn9/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX59fHx7fH17e3t8e3x8fH18ioqJiYaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoGAgICDgH5+gH99f4B9fX5+gIB/gn+BgICAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt9fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX6Af3+BgIGAgICAgYF+foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhYOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SEg4GAgIB/gIF+fX1+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn5+fX9+foWFgYGBf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX9/gH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Bg4KDgH9/gYGAgoGBgYGAgYCAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9gH1/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYSChISFhISEgYOCgYOBf4CBfn6AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+CgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fH1+fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fXl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIWEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICAgH+BgoGAf35/gX5/gIKCgIGDgoSEhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn17f32Afn19f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19foCAgH9/f398gH9/gYCBgIB/fIB/fn9+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t/hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GAgH99gH5+f39/fn19foCBgYB+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgICAgH1+fn+AfXx+fH+AgYCAgICAfH9/gH5/gYB/f32Bf35/f359fXx/gICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3t5d3h3d3h7e3p7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIKAgICAfn9+f399fH5+gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoCBgYB/gH9/f319f36AgIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eoGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gH+AgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYCBgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHt9fHt9f3h3dnl5enx8fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgIGBgIB/gYGBgYGDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99en1/e3p2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgHx/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgX9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHZ7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEg4CDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SAgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF/gICAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhIGCg4WFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgIGAe32Bfnx5fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgYKEhoSEg4KDhISBhIWDgoKCg4OBg4GCgIKAfYCAgYKDgoKCgoSCgIKCg4OCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH1+fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgoKBgYOCf4KDhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX59fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIaFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4ODgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChIWLiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoOCg4GDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fn6Bg4F9e399foB+fXx8fH19fX18fX1+gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoKEfoODfYF9fn9+f4KDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WEhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXB7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX1/fnx+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSFhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/f3p+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYKAfX9/gX5/fn5/gYB+foGCgICChIeGg4OHhISEhYeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIWEhYWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH18f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoOGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEg4WEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFg4SEg4KBfn9+e3x7fnt8fH1/f318f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3yAfnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGh4aFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhYeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhoSGhYSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaHhYSEhYWDhIeGg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYaIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhIKEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIOEh4OEgYKEhYOBgICBe3t+fXx8fH59fHx8fX58fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX99fHx8fn18fX18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaHhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGh4SDhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYWEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn9+fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoSEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYiDhIWEhoaGh4WFhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDgoJ9gYF/foOBfn9/gHx/fH19fn17fn18fXl6enl7fH16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiIaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhYaGhYWGgoODhYCAgYCAg4CDgHyBgH5+goB9gH+BfYB8fX59fnt+fXx7eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgYCCgYCAgIOBfn5+gHl6fYCDhIWHhYSDg4eGg4SFhIKFiIWChIODhYWFhYaHhoiIhoWIh4mHhoWFhYOGhIWHg4OGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAfIF/fX6Cfn6AfoB/f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4aEhIaEh4aGhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaFhoaDhIOGgoWBgYB/f4CAfn+BgXx+f39+gICCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDgoSFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoaGhoWDhISDhIWFhYOEg4OEgoSEgH+Cgn99fn5+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/fn5+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBgoWFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYODg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGBfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9f319fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB+fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYCBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fHx+fXx+g317fnx9gH+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQT03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTV1dTS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNT0io2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX2NnY2NjY2NjY2NnZ2dnb3Nzc3Nzc3N3c29vb3NrT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4t6mnp6enp6enp6enp6epl4CCgoKCgoKCgYGBgYCP0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlNiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6Ojo6CGhISEhISEhISEhISEiGdAREREREREQ0NDREM/XNPT0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CQDg8Oj07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWiiYeHh4eHh4eHh4eHh4pqRklJSUlJSUlISEhIQ2DS09LS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw8Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqampp5COjo6Ojo2NjY2NjY2Qc1FUVFRUVFRUVFRUVVFq0tPS0tLS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Ozs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLQ0NDQ0M/Pz8/Pz8/Pz83KysrKysrKy8vKy8zMzNPU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7R1M/PztHSzs/S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19bW1tbW1tbW1dXV1dXW19fX19fX19fX19fY2NfW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Tu53Pz9O4ns/RnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StZWbs9Wyl5m5upW4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/P0Z+gqq7UnKOostGSfX6vsNHOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OTY/Qj9COjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9HFh5qx1cOGmrXV082ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P1qeZsdTWo5i01NPAoKDQz8/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PT05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9SkmbHU1aKZtNTVsKKp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDUpJmy1dWimbXU1KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDQ1aSas9XVopq21M2en8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY5OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT0NWkmrPV1qOattfDn6DS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhx9LWo5ux1teim7TasqSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPR1bWCw9PVsYPG1rmDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PD9HRUdLST02Njc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHRw9TS0tDD1dHRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz4+QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tTS0tLS1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjY5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDs5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojk7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6ubq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ioqaqnpaSjoqKio6KgoqKhoaGgoKGhoqOko6OlpaaosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpqWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5Pjc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKCgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6enn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqampqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaenpqainpyfoZ+XkZCQlJebnZiWl5aYm5mampqampmXmJqboaGfnp+dnJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY2ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQERBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWmpqWlo6CgoaGgmZKPjpabmZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuYlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/QkBCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpKSmpqWkpKOioaGenJuUmaqcm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKio6SkpKSioaGem5qZmq2qnpmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+goaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCisKehoqKioJ6cm5ubmq55epubnJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgpKWtp5+goJ6cmZmamaaTS4GdnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgn6OieaqkoKCem5qam52oWkmEn56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqSkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6eqG1vq6KfnJqanJysgktPh5+enpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cmqSIVISom5qZm5yeqmRUUYignZ2dnJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5yampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZmgk2Jim52Ym52bopZmXVGHoZ2dnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJycmZiZnJllY32cmJudnKSHZ1xRgqKdnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmZmZqkaGdmiJecnJ6ceWZaVIOinp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmYn25lYmyGnZ2fkG9jVleHoZ+gn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmZ95c3JeeJmcoY5hWVNajp2bnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzk3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampaSm5+UeZqooaqUfGJSYJCSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGOoJ+OfWKJqZiaboOHa3CIh4KNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoN/jKiNeGlScJ2PjFZteXuCfn+CkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+fpCgek9DSXaUg4NJV29zd4J7ho6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgYCglFM0NDt5hXVyQzhOa2+Ah4qOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GPoW5GZFU/enpnZEw8OU1udY2KiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuipJhRdLCRSHuHeG1SaX9ZV3GIkIyYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqayEX7/YrEaSo5qQXWuCe15eg6KhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6imb3q9wKqazKies5pIVoRwUnifqaegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKinmp2kpaOionKBma6Oyc6ynrCyblO+oFRslKOioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqCjp6GmrqamnKCNfYV7htC9mJeonHJSmqxnY46jnaCgnp2go5qWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqpoqCiqKqusbKuq6SpmIh7ap29w6uunol2ZHB4enaHo6Sno6GdoKKZlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e2tLO2srCyp4l1Xk6Wn5CPjYB7c3BzcXh8foWSnaGko6Kkm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuytru+v8C/xb+1q5NwZlhHd4BzdXpxbmloYmJpaW92d3h9g42Yo6ispqSZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1usjS2dzVx7qtn5B4XFtPRV5rZWpwaGRiZ1lXXVleZm5ubW1sboGoyMa7oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxMXZ4t/PvbConI14YlVXTUVebGFjamVhYmldVVxXWVpeY2FcY4CpxcC9uKmvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca8x8fO0MSrjXtvXFNUVktAXmxlZm5lYl5mYVVYWlhWV1dig6W2u7mrtLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnVycnVxZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8TCxsnJwKSIWkxISk5IPlpgYmxxaGFfZVxYVVNUUVaAtsOvrKqqqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMfGxMTDuLPBuqB3TEpRST1NVGJqaW5jX19aXFVTWn+arbe0q66lpKOnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7d25raWh2WmZyeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxb27vpFlVktCSj1eVlhrZ1taWVhWcJCwsau4tbOsqaOhramsp62grLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnVlZmlqaF5qb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jIv8bGtqBsS1lBUnJ7gFpSUFNrn77Aur27vLq8rK2mqbu6ubfAs7W4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmlqanRueWxeZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcXFxcTJwKqNeG+MmZ1TT3GfwtLHxMHEx8G8vrSxsLDCvr7BxsC/uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfXhwZ2BrandsaWZ1b3RjXWNVV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcHBwMLOvHNqhZmXWpHLy83Pxba/v8DAuru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eYBzcGZlZmNrZGJrbW9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28wsGZgI6ZiH/Sy8TI0cGvvb24ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZWJhY2NkamNnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwLu/wLy7xL26wMS/vb22vsiklGaPzcS/wMm/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2plal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjbq/u8O1use3trm7vLi5tbrEyaZCi8m/v7vBvrnGvcK/vMW4tre0uLa2u7u4trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZnBqZWxoWFlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxHipzL3Ht7m4rba0t7mztbK6xcqaRoDKv7++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnFncWt0ZmJuYFxUSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1650gbvIz8LAuK61tbu9t7mxvsPHjkx7zcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxqbnVveGNoYlxjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydKZcXSu0dHMysS1ur/EyL6+tL7AwHtZc8vGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRsbG5fY19hYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrBhnJ0pszMy83KxsLDy87BvLi8urFyaWa7yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFjW19gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vaw762vsC+vrqmnKmytsPApXl2eZzExsvIwcPAwMnKwb+7ubGhgXhxrsjFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7Sztbitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLdtrc69trnAvat9bmhubXKBlZhzeH2Yvb/GwLnAvL7FxL29uLGvnJWDiJzKwsO8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbG3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3FvalxgYFpTUEFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2ydoGzvba1wqWHaVpeYE1SW1tudHeCobi4wrqzu7e7vb+6u7uuo56djpl/v8TDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dndvcWFfZl1bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJp4V4iqCvtZ1qZmdWWWBJSU1QVGx3h6awt765srWyvLm8trm+tZWgq52odK7JxMC9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZuVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xaqIfHaMoZhgVENYVUdhalZPRUphjqGsr7a6tbSyrLy5uLW4wb2LmrOmqnSmy8K/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLbEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c25jXmdZXV1TT05BP0pDQUpKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+0kIJ5iJBvT0o/ZFlCTneAlGpOQVyCsLWztbK0r6y7uri2ub/GdoSsoJxlqb+4tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlyd3NtdWpsXVxrVV5cUE5IREdNQkdORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR8WEZBT4dZSkpYd42BY0FTo7mztLKwsa2wubi2u7e7vJCisaukc6ywqautq6OooZ2dnpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlodXRuZVVhZFddUk9NSUBJU0VOQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmJmUaE0/UnhxUElJS2ecgFpFU6+7sayzr66srba2srS1rqmmnpqbnZ+mqJ6gqKmfoaeWm5aXjp2Tj5CWjZebpKigoKKioaWlnKOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQlpWWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqGIeIN8dn96Y3dtbl1RaVVQT0dQTU1DUFJAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqqlvWhEUp2CUVdJSmBKVY1hZGOBrrWqsrSuqquvsLKzraWdkZeTj5egn6KgnKOkn56olJuWloyXkY2Ql5OYnaOqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnx/dXZ9bmx7ZGlWUmROSkhHT1NOS05IPEVAPDJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgqsa/yqBQQXOddk9tSktjZnRzYFtgcZCxr66ztaqmrKyjm5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGSk5qXm6Ckqp6hoZ6mp6uin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6arqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd5fGV5emBiU1VhSElKS1NUSlNRTTk/QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTGxoxXU0plpFplfW9yXFFrY1tlYF5rj7SwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqSep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5ual5mblJablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgmxmXFNaWk1RS09PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVpcXZ1cGN2dlhYY2BjaFpZV2etrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqayppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO2uLO4rbK0pKCdpaCsoaGioaCamJaVn5ubmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgoB9eHZqeHVebVtSYUlSVUhGVVdKQ01HPUtJOEU8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgo4BvgnBgY1hMW1JaTUxQWFJITU1HmKyqqaWgn5qSkZSYmJaWloyIi46VnZ2dnJ6Xnpmmn6CopbGqp66jq662sLWysa62uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5uLyvs7C1wry3vrOztaKsoqmpsqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaW5cWFxDV05KR01IQ0ZOPT5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjnp2KYldeZWBXTVFHPT9AQ0M/PkJReKmtqaqmn56foqOdnp2anZuUk5WUnp6YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMm/sLm5vbnCvri0u8bEvcO8t7Oqs62qs7Svs66qr6OdrKi2sa2jsKaho7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIREpQST9FQjRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PDs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBRR0U8Qz5GPD45Nk5+qrOno6OioJ6lq6ael5yUkZqemZWMioaIhnhtiKCkoqustLy2w72+s7vBw8LFwL/CxsXFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PKycPBx7+6tLq7tbu3sLayqrqyrry4v7u6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZVpcRkxNRURUTUVDRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8+PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXNqYVdPRT5JWnxvYkI9XI6urKCZm5uenpmXl5eSjY+Xl5SPjZCMgoOCd3JxbXCPpq2utLnFu83Hy77BzM3NzMjI0MzMzMfKxcbM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbGxsrIz8DJ0c3HxsjGwrzEwb6/v7a+s62/wMPDx8THxK+/ubK4vcTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl0c2ViZ3JvZ15aWkRPTURFUElEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPzxAPz45O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpydlWpmXVRJREE/S4aepZmEoLKto56cn5qYl5SSlJaRkI+Mh4SEiIaDgIGBgHlxcm9seaS2urm+y8HT0dPIzc7R09HS0NDR0c3Oz9DFzdTV2NHXzcbHyczDxcrPytPX0dfS1dbT1MjMxszNydPNztPNxsnKysLGzMfJyca/w7OzyMXLy8vPx8q/vr+9wcfFzMzJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amVWWFJETkZASVFDPkI9OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZxiVExKREM/Q1Kv0b2yr6acnJygpKGdmpSTlZSJfXhxa2ViaHJwcnuFioB1cG5xc3CFs8O+xdHQ19bV0tbN1NbW1NPR0tPU0s/Sw9DT1tjV1dLLys7Ry8bN0srS1dbZ1tjT1tjN0srP0czP0czT0MDJyMvEzM3Mz8/Fx8i2wMvA0s3M0MbKycDEw8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2BlcmNdUlxKS0dBRUlKPjtBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWklAQURBRlF2sq+mmpSXn5yaoKCem5yalYl3aWNhX19fX15fX11hbHVzcHBvbHFxdZLEyMfU1tfX1tPW0NXU2dTUzs/V1NTR0czRzdPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1NbMz8/JzdLLztHAxsTJx8/O0dHSyMzNwMvNxtTPzM/IxMvHx8jMy9TU0dXP0szTwrnFsaWota6nm6irpZ2yqLCzrayTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWJjaW1fVlFgSkpDRUNSTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9jU1dnZ0c7Qv7zMyba+rqaqqKGjrGZDOD0+RFiCqqifl5WXmZqcn52YnJySfXFlY2JfX2FfXmFgX2BgX2BlbXBwbmtvcnZ3nMzB09XT2NjW2dHS0tfP087L0s3V1NHKz8zT1tLR1c3P1dXRxdHUytDU1dbO09HY19fXy8jOxMnPzMrMwMnBycrOzs/L0M7OzM/PyMzQ0MvOy8PKx8nNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0pGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PT0/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+jp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF6SEZCO1eNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGBeYF9eXGJtcm9vc3R1dnmkv8zV0dbT09jWzs7Ty87Oxc7K0tLPx87NzdTLztLNy9fW0MzR1MvL0NLTys7R1dLV1crAysHGzcLJysPNxMbJy8vPys7N0M7UzMbJ0M3Jx8vFx8LGyszN0NLH0M/OzszQxcfBuLm9w8O9w7mzsr6xu8PEtqqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR0xJUFFCO0Q/OzY4Ojg6OzU3PT1AOzo8PTk8PTk9PTo+Ojw3Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3Nj88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvcHePmo2Ml5WQk5GRlZaVkIt7ZWJiYmBdXmFjYmBfYGBhYV9fXVtdZ3JycHJzcG1yeaXH087M0M/T1MnEyMjFxr/Dxc/Ox8XHzcrRyMvOzcbR0tDOzNTKx8rOz8fHz9LL0M/FusS/xsq9w8jKzsXDx8DHzcjEzMrMz8jExNDJxsLGycW/wcfMy8zPwsvMycfL0MXFx7vHw8nJws/Bvby/sMHJx7q9qrGyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChaKqk42Nlo+Fg4ODgX2EhH5zYFteXV5gXmBjZGNfXV1eX2BgX1taXGBscnFub2tsb299udHLwsLPy83Eur/Duru6ub7IxsLDwMPIysnIysjBxczGyMrNycTBysnBwcvQxcvIv7nBvMbHvsDGz8vEwMO7ycfJvMnHxcrBvsLLxsXEvsa9vcHDxczFxrzAycPFx9LEwcm/ysrGyMbRw8PGw67Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQkdFTERGU0A1NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtmxeeXyfkYqSloZ6gIWFf3V4dXJwX1tbXWBgYmRkZGVkYFxcXl1eXmBbWVpcYm9ybmtpa3Bvc4/Iu5jAzMDGwbC2ubGxs7Gwwbu7vLq4wcHBxL69ub2/ucTKxcbCvcbAt7vDyb/Bybu2u7rGw7+8ws7Dxr6+tcG9w7u9x7zDurS9xsTCw7fAtra+v7vMw722usi7v77Lw8HGw8bJx8nG0MbCzMeyx8nDzs3BxcO/vbK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUZCRkpBOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrOxcnFx8G6xb2srqZgY3WBkouIi4R4f4aGf32De3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5m46fxMO6wLitsLCmqa2rpbeztbSzs7S7tr2yt7C0rrK7wrzBxLy/urSyur7AuMi4tLy2wcK9uL3HwcS7ta+ytbq/tMW4u7Wsub2+wL2xu7awt7qzxry3r7u/tbe1xby/w8bAxMXGx8zFwMbGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CZW2dviY6GiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX15cW15cXV5aW1tdX2xwbmlmam1uc3uKv7+4uLSvqqumnaGopp2pqrGtqqyptK22sLOprqess7u6tsO5urmwq7S5u7TCua/Asb68u7a8yLnDt62qqLCywLa4vbCxqLGztbu8rK62pq62rruysaq5sK67rry4vMDAvrrDv8bDxcC8xsLIy7jFx8W/x8TDusTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTEtNSkVBQ0BHQTs6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHEz8fNwcLGv8TEw8PKwsnKv8C8wbqztbXDrqqwkltpfpKIjo97eH2JhXp7hIB3bl5dXFxdX2BfX2RjYmNkYmBfXlpbWlpdWlpaWlxlbm9oZmdpa25yhK25sLWtpKOlpZmfo5+YmqSqraSooquqrKuwo6afqq21trG9uK+3r6iuuLS0vLizvLC4ubayvMGywa+mqaOrsbO0qL2qq6irra61tKaoraGkr6mypqiorqWot6yxs7e6uruyvL6+v8W/tcLBx8i3v8DFt8TDwLu/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Nw8e5ucvCy767yba9w766yrfBw8G0try2sa+1vK2pq5JjbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmRmZWhrb3KFqaWro5yan6OTm6OZlo+goaijo5+lpaemrqCdm6SmrLKwt7ensKyoqrSrtLqxtrautrqzsLu6sbeloKSgp7GorKm6qqWmp6ins62gqKefnKSmrJ+fp6SgobGtrayytbO0sbW9trvBwLK7vsPBsrm5wrPAvcC1uLy9vrzCx8TDxL/AxKCEeHFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usC6vbWgnpSdoaa6tquzs7uzxM/Jy8LGuLfHwMy/uMq3u8W4s8W4s7/ArLW8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXlxbXFxYWVhYWFZYW11fZGNjZmdnZ2ttboedqJ2Tk5eelJmglpSLnKChppyfn6Olo6eem6Kcn6uwrbG1pKmqqqyspbS4rbewrLO1r7O2r7Gqn56fpKKypaaqua2ipqagqK2rmaCgnpmdn6WamqOcnJ6wqayoqqusrbCzua+4ubqwtry7uqyzs7mzvbS3sbG2tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU1MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy1t8XPyMjAxru7w8PPvrnHuLi/t7LCtLG7u6y5urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl1iZGRmZmZoaWtyjKeakJGRmJSYnpOUjpqgoKeem52lpqKlm5+hmpmvrq6vsqGlo66rqKK1sLKyrKmws6i7s6e2oaOfnKOirqOiqraro6Omnqamo5aZnZeZm52gmpednJ2craGsqKOkpq2rs7SqtbCyq7O5tK+qsLKys7ezrqmtrrK3sLq2ur3AuLOxlIZ5dWZfZl9bWlZTWlVLW1FMSkVIS0lDPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/s52lo5ilscO1tr2ttLnBzMjGv8W2wcDHzrbAw72zubmyv7axubutsrSvn5qjqqGUmo94f4OEf3hvcXRxaGVkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanagmZCQjZGTlJyUl5KVnpygnJahoamjnp6onJqaq6evsKuco6S4qqGgr6i3q6enrrGkuLCkt6CjnJmZq6ahmq25sKOhpJyioJ+TlKGUlpabmZiWl5yVn6meqqSinaOqqrGtqLSsqqets7Clq66zsa+wr6+nqKiyrrG0sLy0urivo5WCenZlX2FXWVhTUlRLTV5MUExHSExLRT1APj1CPDo3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLrCsb63va6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyaoamVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2NiY2JiY2ZpgJKOkYmOkJGXlZmTlJmem56VoJ+mpaOmp5+cn6agq6+moKKjt6ihoaKps6KlqKWwprGurLWfoZ2WlamhopStsbGfo6Oenpibk4uhlJGTmJiTl5iYl56nm6ehopqkpaWrpKWwp6Wjq6ytpqmusK+rqKqqs6amq6+0sa68trGwr6CTe3hzZWJcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G2vbC7sbesnqWmrLe7vMHFurK5tcTJycDDxsXHtsbEs8G/xau3t722vbq7tbKsraiZmZ+ji4p0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1VUVlZSVFJVYGFfYGFfYGBiZGl+jo6GjYuQjpCZkZOVopiflpygpaGspaSko6SjnaurpZqfpbGqoaGepaqeqKKfrqyqqa6toqKilZiim5yQq6mwnJ+in5+XmJOJnpGNkpOWkJiYk5yho5ykoKKVoKKkpZujq6Wio6ukq62lrrKqpqWmprSmqqits7W0ubqwq6yejHNxcGBbV1ZWUkdRT0haXE9SSlRLU0xFR0pEODs7Pjw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuyrZ2op6+5ubPAyLq2wK/FyMy6wcnMyLXJvLG9w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVVZVVFVVUlJOUVldXF1dXl5fX2JkbYmLf42Ci42LlpCRkJuaoZuboKipq6isp6mmpJmlr6SVmaWvqaCcmZugn66anKuzoKamn6KkoZSUm5aWkqmqrZudn6Ghm5SQjJmOjJGMko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuwpK64pqOko6ytqairr7S3sr21s6uvmIV1dGlbWFlSVVJGWExRW1hNVU9RTFFSSU5KQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+sy8bFuMHOz8ezxLq3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWVpaWl1cXF1fYGR7iH2GeoiMho+KlI+Vl6Cfmp+rqaavrKiwpaman62hlZakqKedmJCPmp6vl5mnqpmgnZSloZ+SkZKRk5Woq6WamZmenpeOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpaepqKCwsKaxvaigo6y0qq6nsLSwubXAsa6xq5B+cnRjVlRWTlJKR1ZQUlJMTFhOS01PUkhOS0FDRkREPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsra4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucmpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUk5OTlJXWFpZWVhcXF1hanx2e3GEiYONhpWIkpKWmpidqJugq6amrJ6omaCmnJOPn6Oal5eGhZKbpJCVo52WlpaIopublIyOipCapaeclZWXm5GTiJSOi4GMjYCQi5KSkqGaoKKWlJmYlaKmmo2ZpKepp6GgtLKos7ihnaO3rKmtpLOyprW7taussaOKenNuXk5RUU1PRE5OTlBLRk5OSkpOTlFJTUpBSExISEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqakt7Glp6SqpaCppqSzqqKyw7W1srPGxre6w8rMxrOsub20uMCvrqmwnqauu6+toJqbnpWViHyEbl9fZnJwdnFqbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhaXWFubnJsgIR/hX2Pgo2IkpCSnaGOmp2joqSYpZainJWNiJmajHONg36Ol5aGkpqQlI6Oe5mPnY2CiYCKmKCjnpCTmJaFjoOUfn50io56kIiTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5imuKalsKGxrpyxvKqpr6qZg3h0ZFZNUlBQTUNTTkxQTUJQUUhJTlNNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2Njo4N0E3eLeho7SopqWoo6WlpqamsqemtMG4r7SwycS4ucDOxr6zrLrBrK3EraiippKdpreto6CQlpeSkH54f2ZXVl9nZmlnaG9jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5UU1NUVVVXWVtdaWhtaHuBeXFNVnCOgZWFjJuXipORn5idlZSWlI+WioCUiV87Vm98jJSKgIySjJCGhnOLhZeBeYF7hpSdlYOWjpGQg4Z9k3hxcIaNfYmBkI6Ql5qZk4uQip2In5iIiJaemqGgl6euqa2pqZ6WrbOipq6ZrKyYqLSjqa2jk390bmBbTlNSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqaCmqaejqrCop7TBubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qYh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSUZITlFRTU9SVFZYWmBramR2fnFOQT9/lZGQfIeUjISKjZuOlpWJkoiGlYd5iX9gSlFueIuShH6EjYuFgH9tf3+UeHZ2eISNmnBRjYiKhnx+eJR2aHeGiH6KiJWLjpGTl4yEioiVhJuNg4SSm5aenZSkoqippaSem7CqoaSkkqaqlqKqnKGmqIl2bmdeXEhRUVNNSVVNUklMS09JSEZKTkxNVEtRUU9HSkQ9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa6hp6ilp6ivrKq2vLa4t7PBu7aouci4tqiotbaqsrynnpWNf4mUqZaVi3+Og4J+eHFvWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlZWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0VEQ0lOT2hZT1FTVFVaboFwc3pnZlpTj4mUh3N+hoB8hYyTgpKZi497ho+AdoB4c291cXSOjoF6foqrhXp7aXZ7jnBybXiBi42SeHuAe4B3c3OSeGd1hYSEhXyVioiKjYuAf4SLjYCUhHyAj5iUnJaRn52pnqChnaCppZ6dmI2npJOgn5aen6SBc2liXV1KV1BSR0tYUk9KTUxSSkpKTFBITFFMUlRNRklCPTc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX92hnd8dm9vallLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51gnp2ZHSLlZiNjntmeYB2eH+IkHyDmJKAcYePfHd7b2t+rX10kIt/eoaSgX1/dGZ2fIZsb2hzfIqNh4BteXF9cW12j3FocYF+jnBEi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnZqdnqGclo2LpZuOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlJPSE5QTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM1MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5adpamkoZiZj4WSeYmPi4t2cXxtdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXWVvcGqGparAfnN4Ynt3bnt4h495e4uGb22Mknl0eWpqgIJxlpGMgX2VgEqTmW5od36CbWpkbHmFkJKGa3JsfG5yfIZpbXB/c42JhYd7fn97d3B0dIaCeYF5cHyOi4qTg5aXmJqQk5aWmZedloyDiZ+Si5KNhpCXgG9qb29vWVZYVFJRWU9SVFRSWFVNTkhNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJufpa2voq2qqLWvrqy0v6u8w7+lopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdW90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SVlpRWFtfpodhmWdyeGR9b2x/eYqIdYGHhXRsmpJ0dHxqap2OTXmFk4mEjmcxdodzbH5+g3RmZXV/hISFgGZpbHVrcIB8aHFxfG6TjY98dH59cXFudW2Cf3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtNUFVWWVhOSUhFSkpIR0NAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLyoqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaPlJmLjoV6hJCYlI2QjI+GcYeCdIiMhnpwcnBvb2RxZ19URklDPjw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVMQUlRSWKvsp9wenZrfGxxgoGEgHqEhYV5cqCVdHiAc3WUhzVxnaidjqGhhKOFdnCHfId8dIyujYmBaGdiam5ybXCDdWlwWHVwjpuRdm1/e31tcm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jntzcXFtYFtdXlxaWWFfUk5bWlhXTEhKRklHP0NBQkc/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlZGdpKeer5WltKmusK7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dXh4bXdud2RqXklQRz0/NzQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fSExNTlBMN0NNUVNES4V0f3t7dX5sdoeHe3yEg36LfXWimnp+hoGEmYSanGGGqp+dioOQjnp3iX6JiI5zi5ePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hHpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1ZmdgW1teU1xnXldQVFhbVUdKSkVLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygmJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjXiKf5OMkZydn6aRoKqgsaivwLK7xbqWjpGUh3uGdmt/jJGCfYqDjox4g4BzoISKfX2Bf3CBfnpodmxSWExARTIxMTM3NjY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUUxLVF1ZUktogod6iXl7cXyPi3l8iIZ+lod2oZqIh4+SlKWNralIhq6vrouBgJSLgouChJKph4CYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGSGyAd3J5dmhta192fYOIf4iEi3mVnJuJi4iRf3p1inZ8eG1vd36BdXVzbVxeXltjZFhnZVxUUFBWWVBETEtGT0lDRkNDQEBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeRjpaXkpagnqygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4l+c4R4X2NXS0I2MC4vMzMxMjM2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz84NC5dlnBzo1VGSUtNTVBXYFlvWVxeaYyShpSAg4GEkZJ+hYiRgZqVgqGhmJWbmqatk5m7sae7x8Ooi4yhpY6UiYGRfHGDnp+RnX93hYWLkIeQaWhwhIF0jIeEinKGgneIgHt2hHxudnVmf5SOh4iJh4iHoauilomOl396gYh5eXBna3h/fH91bGVeW1teal5iZ2BaT0xOV1JRSVBKRE5HQ0pEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3g3p/jH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koaSlX+KgJKbjoOAgYyKgomNg3+KgG1wal1CQDQtLS8vLi4wMjIzNDc3OTs9P0JESElOUVJUUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSUlMTEtOVmBjf2ZnbXSbmY6ZkpKKjY6ZiJKPnYugoJKjqqWkrJOptqKowcKux694upSafI2hnpmEk4WCjqGflJmRhYqFj5mRlmxwdYqMgpaMjY53j4RxbYWBipaRg4WIcYigloaSiY2PlqS0qZuMlKKDh5KDfX9ramp8gYKDdWNeZGBbZ2xdbGxeV0tITlJRTUxMRklQQ0RNRkJDRUZCPTk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImGkYeFiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw3NTI8P1I1SEhITExNTlJebop8c4F8npybp6WhmaCWopScnqieqKufqKypqraXq7+rtsjIt8jQz76boHBpq6mfhJOShZygmpuZppKRiJWim5t4en6UmJOik5eXgZSee3eVkquyiY2Xn3yUnZuNkpWYo6Gmta+ckJioh5aPjYCIbHNzfYF+c2lgXmJgYmhkYGdmXFJFSktQT0lJTEZGTUNITEZHQ0JHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG18YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6MfIqGj5COgYKAiYuKhJKFg4eJgYCHdl5iUDQ2MC0xLywuMC8vLy4uMDAxNT5BQU1RUlNRUlNUUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lKTk9RWW2Fj3eUiaGlqLO8t6Suq6umqLSrsLaysa27sbO+nLPDq7rJyrfDv7ilorCzrK2qo4uWmIWmpqCjl4GmmY2iq6iliIWUpKGgq6GkqI+csYuVo6a3upugorCSop2inZCjoauvrLK1opSkqoiZiJKJlXl6foaAaWJpXWZjXmRkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpb1h6hXaBk4WIgpuDkpCMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOEgYuFhoiShoOFiYeIh4dxbmFARTY0PDMvMTEwLSwrLTEuLTQ/Q0FNVVFSU1VVVlVOW1BHSEU8Pj5GSENFQTc7PDVDOz1GS0lHSFFPUFeBkp+EraKxqbHAxsKqs8W2q7O/s7i+tr+0wba7uqO4xai2yce1vrm0qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6prra7srqssLWisayxtbu3ta60oKeoo6eaqa+ssrm3uKabtqmMpI6Rk5+GeIGFd1tjZVdnY2JkYGFnYFtUSkRETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmNXeXVwgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhIGOf4GJj4eAhoiFioeRenhuXVZARU08Njo1NkFCNzY0Ly82Q0hCUVxQUVVXVVxWUF9VSUxLQT8+R0tGRkQ7PkA3RDc/QkpKRUZWU1Bej6Sto7GzwbW3wczItbvEvbOzwLa4wbW/r7d0sbOlusSksMa5sbOxtKiktbaqsaCil5uikqWwrqatq6ekmKCstLuiqLK6tby/zL/Fxb29s8G3ure+t7q3uayssKWwqa29sLy6wcGrmLmnlK2Ol5eqiH6DfmxYZGJZa2ZqZldcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqb36OhICNhG56c3iHYrmhmaOJlJSWkpSTjY+WkoeGe4aBjZWKgISBinp8i4eGfYqCgYuElX13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUVJYWFpnWVRgYExTUEVBP0lKSEVFQUBEPEU2Qj5IR0pMU1pUXZOuuLS6uMi/ub3JzLu8wbu3tbu6tr20urHGYHWypLGanqu9qaWoq6qkorK1oKuon5WWn5mgrqWnpqWfpJOip7G0p7KyvbbBvtPJydPGw8XMwsrDwL69vru8t7SvuLe2w7nFvcLHr565qaGrjqSotYiBgXNgY2NfWGNgamdSWGBWUlVJRUVOS0A+R0Q9SkE9QkA9Rj47SEE3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj4yEj3NscnJzh9XAtZmgjZWYmZGOl5KWlo6Gh32Gg42Win6Df4N4e4uDh3yLeYGKgpd+dH16a2ZwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RVWVVKREJLS0lGSEhISEJJOkQ/SEtUVFZcWluSucC4vbbFv7q4ycq6trm1t7myt7Wzrra2mGR1qJytcF6irJyYoKKbpJ6qpZSfoJCTjpaZmKifpqCempmDpJ6spaqwrbiwvbnU0c/W0MrM0szPzsrGv77Cyr3BvMHAxMTFyr7IzrOku7C0r5qruLuYf3ttXmFdWl9iWmRjUFtgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/Mzc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5aRkJRubG90dYezq6Chn4uZnJmMjJWRm5KFiop+iIeMkIuJfIGDc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlnamloYGZpaWxabXOWraS8iIZnW29oXVpaVEhLTlBKS1BLU1FITEFKRkpPX15iZ2lhl7fHsLmyur21scTGta+4sbC7q7Kxp6u3q4y2p52ap5pOmp2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXmpWWh56ap5usr6iwqLS01NXV1tPL0NTVzdPPzcXCydC+ycnKydHHzM3C0NG3r8O8xLmltbrCooNwZV5eX1lhWFpmWlFdWE9QQkJIRUJIO0FDPkFHPz9BNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCaHFveXmDoKmeppeMmpuXi42VkZqOfYmLhI2KiouQiHyEgnB/h4GGe4dyg5KLjn1xeHVscXh+cXpueHNsaYFwbWNqbXB4aXd8fsu/wd+nbWN4bmNbYWBKUFJVTlleUF1cTlBOVFFVVFxubXaCcZatuKy0prC1qqy8v7CqtKakuKarrqCrtKOOsa6al5iMkZORhI6bgY2mkZyJg4uEiomEi4SUlZiXk5uQnJiZmp+eq6ylqKKsrc/S1dLOzNPU1NDU0c7Iw9TRx83S09PXzNHRxdLWxcDOx8fCqL63zp57cGdfZF5YYVNeWlBRVFFPSD5ARkFCRTxAQT5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlp1hoWKd2x3b31+f6GenqGMjJiTk4uMko+WhHmFj5CNiomIkYZ/gntyfoCBh3qEdYWTkIh/b3Zya3N9e3d7c4F4cmqAc3Jpb3F6eXF6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1lkalRYXF1gZF5jd3p+i4GYqaOloZ+gqKWqsLiqpbOjoa2io62hp7GfiKaak5KRiZGOiIGTiWqUooyZhIGGfpGDg5OXrYuVjZSajoaTkZ6Xp7ChoaGlpKnIzc/IwszR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuMdHBlYmFZVVpUXFBLR0lKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCclJ2UhYuViY+KiI2Hjn94g5OYioyIiIuJfoN4c3t9g4d3f3qGkZV/g253cG11f3Z4fXSFfHlsh3Z0bn12hHR4e521jDtBi8Wlfox8aWVXSUNmY2VjZ2pkbndbXmZoa25pboCDiJCLnJ2gnZCXmJ6jo6Wxo6Szn6GlnaCooKOxnIWekpKSkIqOi4aDj4R+nJuMjYKEhXqUf4KplaOMkYqXkot+mIuakquzmJucqJynvcPGubbGztLR0tDM0svJ1M7Q1drX19jU2djN2NvOydna0da+y8u1enhwZl5bU1dSW1ZGR0pJRUU9Ojc6QEBCOkZEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHFzhY18l5Cdi3+HkoOJhoWJgYd8eIWWloiOgoeFhnqEeXF7e4OGdXqFjo2ceYtwfG9ven9xe4Fxg4eAbo56dHd9fIJ1fnuGh69zWKnCto2RgnBuYj1eaHJwcXBueHaBZWhvcnV4cXqLho6TkZuVn5WHjJOboJqeqZ+hrJuhmpmfpZ6fq5mLmoyQkY2EfYiHg4WLjqCZk4iDh35smXqEmYaIk4yNlIyGfJyJlI+uqpSWmJ+Zp6+2vamtvsfMycnMy9DJw9LK1NfY19jX1dvX09nb1dDb2tHWyNTLlnt9ampcW1FUVF9IQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4/Ojg3RUI3NTU0NzkvNTY2NDM1NTQyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD9DR1JqXm1kYmZrdoCIcZGPmoB6gI1+goKBg36De3yEmI2Hi36FhoB2gnlve3uGgXR6kp6OoHaOdYJ0dYF9c4CEb4GQgm+ShHV8gYV6doZ7iLfFpMHJuIGWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSVj5eRhImPlpmXlqWcmJ+WnpOSl6OdmauVkJCJjJGCjIWIiIGGkJGem5mIhoyBhZd6iImfl5CIjYqLgn2hipGLvKGYlJiZnKmmpq6fqLa/wMC5x8rOzsXNytHW1dXZ1dfb1NbZ2tvX29ra2M7bxoh9e2lrZ2JVWFZWTkxFTkM7PT08ODo8Pjg9QDY9P0A9Pz48OTg2N0RBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyJjJJ3dnqKe36Afn98hHp9gpGJhIV6hId6dX10bXx9hn50f5OekZ6DkXyGfniPfniKim6CmoB0mYZ+gYmFfH2Qeo+pjo/Dob2MnKOcfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWJi5CSlI6dmpKUkJaNjJWfnJSglJGNjY+LfpCOjouEiZKWmp6fiYyUkp2RgouAppmIhI2ChYSApYeKi7iYnZGVlqKooZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27l7e3pta2dZYlxUUE9JRExCPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NjA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1EUlNSWF5VWGZtbW1pgY6KcXN5int6f3x/e4d6fHuLhoJ9dIOFeXJ6c22AfoR+d4WcopudlJKAjIh/mIeAnJFuh6iFeqCLfJGNg4iEm32akIqMo6KgkKSvn4uQi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5WMh4iMkpOLlJSTjouPioeWm5yPlJaQipKThoCLiJKNioqdlpmiooaTnZagiomIjZyQg4iOf4OHhaSGjJCzmJ2SlZehop+ZkpydqLK5rKa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcn93aWhfXllUWFlDQUhDPz4+OjQ5Ojs3Ojs7Mzs7Pz0+Nzs5OjE6SD46Mzc9QDUxNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjY3ptYX6Rg29td4t4eX96gXyFe3t2hYR/c3CFgXp1dnZ0hIOFfn+SpqSfpqKWip2QlJeLiqiXc4qxjYSnkoSZk4WZjKKVn5iTiJqeo5KpsKCQlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzciWj4aHiI+SjY2Sk4mFiomFlpmbj4+Uk4aUl4N/j4uZiI2QqpaXo6OImZ+WmoiOhpaXioSOjYF/iI+kiY2TqJqXk5eZoZmfmZOdm6OztKajvMG+x8XFycjJwsvTzc3UqdLR1tbW2NrU09rOhHWCa2ZgYF9QS1ZcQkJHQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjn18bX2IeHp+eoGBgn52doCCe2xvi355fHd4fISHi36Lo7SopKuzoZanoKWklpWvooOQuJWSs5mNoaCMpJuvoqSdmJCnl6mZrbCkl5SVlJCLmJqWoMCOo8m5q5qipa2ZkZucsp2GhaiinZiFiIiOlYyLk4+HgYaHiJOYlIyKk5OGlJiGhJGQnHSRmbKVlqShiJyak4+KkIqXmomLlo2GfYyZnoqQj5yamZOZmKCVoZ2Vn5uhsa6jpLe+s8XHxL3Dw7/GzsrJ0qfPzdPR0NbY0s/YvHV8eF9iV2JYUklLT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVtcWUloYTtIhIp6e22Fhnl8hHiAhYF9cHh8fXxvc4x6fYJ7eIWLiYaDkqi8ramzva+lrrOzqaOisKyKmrWdorilla2kl6mtt6ako5+ZqZiqpK+xqpqYm5SVkZigl5m7u63KoWm2t6qwlZieoquSl72kXqmygomKjJSHkXyPjn2Dho6QlJSIh5KWi4+VjYuNlpmTnZq0lpWrnouclJKNkJKLmJuKkp2Pi4mVoKGNlY2XmZ2TnJmelaKglJydpa+ooaWzuKvCyMS2u728xcjIwtChxsnNzcTX1tDL06NzfWtfXFVhU1FHRD48Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBmSGFgYnBJQIuJf4Byhod8gYl1goqDfm19fXx+cHeHd42Bh3uNj4yGjJqrw8Cwvca7s7TBvLSsq7O3jKiyra29q5u6pKitubeqpqaioqSjqq+ysaqdnKOYm5iXnqKlpZKjua6owLusrbK5paSnfYiGnK29r4KLi4qQg46DkY55gYeQjY6ciIiPl42KlJeUkJqXnaeasJqRq52Omo+SjpWQj5WXjpGgkIiUm6OslZaPlJyelKCem5igoZSanqenpKKksLOmwcbDsLC7tsXEw7/Np8fDx8O81tDMxMqKdnVkX1xiXU9LQ0xARUc+QT9CPDo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4/R0BDTkNBPUM9Ozg2Q0I1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaEZfaWdaXVyTjIyIe4eLhoOMdYaQioFufnuBfnF+gXqVepKUlJiRk5WotMfJwMLMwcO6x7y6r6u5u5eytrqzwK6lwKSrsLy8qq6ro6OeqKyvtbCqm6CqnKKclp+wtKeLorq6tcG7q6icsqSkqJSEjqnEw6SCi46HiISGlZSMeYOMkY+SoYyMlJGPiJegl5KZlZemoK6cjKqcjpaPkpGVlY6QlZGPoZOGl5+gsp+Um5SgoZmkoJqgnKCUmJ6npKanpK+tpb/Ewq6pt7XJw762z7LFvsO8s9HJx8G1d3tvX1pebFROSURNS0tJQEE9QkQ8NUFEOzozPThCMzMyMjYzQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2XiYuIko+GiXmGk5CBcoB7jX93hoGCkHqNoZaompqYu77JyMrC0snKws28wbOtvL+nur++vMS4rMGprLO7vaqwqqSlo6yutK22taCgrp+lopijtLypm6i8waO1tq+rkq+sqquWhpqqp6WRgoyTpJWKgHWJknmFjZGQnqCSjpSLj4yUo5mWm5SUo56pn5GlmoyPj5CVloh9j5WSkqOalaCinLWmkJ+XpaSjpZ+eppielZecpaOoqKKyrai7wMSvpbO3zMC5rsOzu73Bua3CwsK/mXB7Y1tYXlxNTU5KR0RDSEJCQUNLOjRESDo7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxJX1hhWmRkV56QnY2Xjp6SiYp/iJ+ShHiFf5V+f5CIipCAlaCZrqejmMO+ycTIxtLNzs3LvMK3sLq9tL3Lu8PBtre8rbPAubyur6ihqai2ra6psreanqyip6Gdq7e3qaWvvsSxvbmzp6mzs62ulpWlraigkY6SscWnlY19kZV9h5GYj6qZmJOTjpOVk6Wek52Zk6GioZyYn5iLjI+PnohakJaXkpalmWWYo56zpZailqutq6ecn6eXmJaYlaGkqaeftqypurzDtaa0tcvBuKq2rLO7uK6ouLq8t4RucFxaVldQR0tTTUs/QUhFREhGRjg1Rk07Pjc+QUouMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmVjTEallJyVoZeoloyQg4elkoiBh4KbhIOVkJGUjpqin6++rqHHvsbFyMfOzs7Syr67trG6u7y/z7XEvbe5t7KytrO3s6ymnKuruaupqK+wl6OupKekpbTBsKuss77CucC5s6e4tLezr5WkrbCvpYuTlaGNc8GZfZaZhI6WmYuxlZqalZKSmZmmo5Wgm5aaqZyboaCZioyPlp1gSpacmpWZpZdUlrCfr5yfpZSvr62mm6GmlJOZmY6doKehmbSpqrO9vLursLLHwLimrKutsbGjobKytKVzcWdeXFBSTUVRUVBRO0hLSUZHQUM9OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3NiVkZIq5eZn6GorpiQl4eKp5aOiJOFoIiEnJePnqCbo6W1ybSpxrzDxMjLycjMzse+urOuubnBwc21yLvBubW6sa+vsrSnpJyqtLWrqaatrJmkrqWlqKy6wKirtra/wcC/uLKyw7C3vaujrrWtuqWIm5emm3a+n4SYnI6SmJqLrpahnJuXlJqfoameqKCam6qZoaeel5CNkZ2DbXWTopqVnaOfkK6yo6uVqaqYq6+lpaGlqpOSmZyJlZyinpaxpqmrure9s7Kuvrm2oKOnqaWmnJysqamNZmhiYFNMTUdITkpVTD1NRU1JSkBDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FNVkh+ZV5IRqyVnKGfu66ZlJ6Lk6qbkZKTiaqNhqGejKOslKSktse9tMG7wsLHycXCzsjCvbmyr7m1wMLKtsaxwby1u6upraywo6OZqrS6pqqnrKqdqK+npKuqvryorby0uL7GvLa1uMCwvcCzqbW2q7+lj6OXkaGfu56JmqCZl52dj7aeqZylo5ucoZqnpbOim56lnKiqnZiVj5Sbi5aJjKShlJyin6G1r6Wmk7Grmqutn5+lpKqRlpWghJCen5yWqaShobS0urWtqLWysp6co6aal5WZqqGeeGNfYV9MSUZITlFJTURGRkJRS0hBREdBVlJESDxBR1ExO0E3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wnl6SensOsm5ekl5mom5Wamo+qlpWoppWtrJmiqrbFwry/uMDCwMjEv83Gu765srC4tL/DyLW/sLy3urenpKurrKGhm6uqxKKlqaymnquvrKKqqL+4pq2+sLe3xra0ubi+sr/BtrSytK+9o5ajlZKbk62fkKGhpKKjnpC+pKmdqaydnaCbpp+9opijnqKpq6Cdlo2VnpOeh46EjZOepKGdtaymnJayppmwqaCbq5+hjZqVn4SOoZqbkqWkmpirsbWxqqWqraycmKChko6QlaiflGplXGJeUEpIS09NSEVDSUA9T0hAO0dJSFtST0s9SE5VNEJFOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hOopukm57FrKGfrJ2crZ+Sop6WpaCmqayXtrGjqrO2xcK9wLa/wbvJwr/KyLa4tbWxtLS3wsa3vrG4tbq2oKetqqudnp+lpMGloKmuoKSprbCipqi9taayvLe2tcOys7e6vrPEwLi4rrS0tKOdpJSRk6Csn5ihnaioqqKawq2pnaytm5uemKagvaGdpJirq6umoJmNmZ+SnoiOWH+WnqahoLiqppSYtqOesqKhnLCYoI+alJ6Cj6CXlo6io5WQpa6zq6mioqWllZWcmYuPkZOkn4ljZ1xlYU1KS0tPRkVBRks+PUlBOTlKSk5dUVFJPUxWXDhGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMT56goZiew6elorOgnLKnk6qjn6OfrKmsnbuxqay1scjDwcOzwsO+x8S9xMq9sLC2rrG1sMDFtbqxsLq2rZqpsKmpm56moajCrZussZyqoq6xqqSnvbemt7u9r7fDrbOzwr+yx7O6t6u0tq2qoqaVlZSiq6Gfn5mnq6+vr7uypp+pqZmZl5OipLihoaOSrq+rpKWekqGelJ2OkI2UnZqjn6e0p6eNmLSco6+bn5yvkaCUmJSagJKilo+OoKCTi6assKWnop2gnpKSmpSFi5KNnJ+AZGhdaGZLSkxLU0JDQElHOztGPjg5Tk1VX1JTSj5PXl09SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZnJAODxIlndlQTSfpJ+bn8Koo6qxoKO0qZWyq6aipLKsram7sq2wtLTGv8TEtcDEvsrFtsDJwrWrtamxuazAxbS4rq22uqWZq7Krqpihp5etu7WbqLCbrZ+utLKnqrqzp7myuLK4wKq4ssK9tMWnvq6tt7Wpp6yhlpaRpaShoZeXpK63rbK1tp+eqKSZlJSTo6C3o6Slla6xsqWppKGempmalZion56Yop+vsqKnjZevmKWrmJufppKdj5WYmoaWoJWMkJ2elIupqaqip6GZnZaMj5mQgYaWiZWfemZqXWxrT1FOTlQ9QkFOQzs6ST83N1FOXV9SVlFBV2BcQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFqVkNXRox5ZkM7pKScoaW/pqiurqCptaqduK+rpKq0t7GwuLewt7i3xb3Dx728xMLHwbnBxsG6qralrbutwcO3uKqtsryjla2wrbKXpqiRqrmqoaewnaugr7Szqqq3tay7rLOyubesuLDBur2/psOqsLauqaqrpp2YmKqhoaCRl6CwrrOrsLmZm6mfmZaSl6agt6mloqKvsbOrsaeroJygn5uepZ2gl52ktLCbn5CUppqgqZuWo6CXmYuWmZSWl52UiZKbmZSOqamnoKOcmJuTh4+Zi36Ml4aPmmxqbWJublhRUVpUQUNFVUA7O0hANzpYUGReUFdXRFleXk5MU09fTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhtfWhcVjqJe2NDPaifnKGpvKGqr6qisbeppbSyq6Gttb2vs7i9u723tsHDv8nEucXDwMC5xb7BuK+2qKu3sry/v7SqrrK4n5esraiumKipjqe7n6Wts5+rorGws6yqtrO1vK2wsbWssLWxwLrFtqu8r7G3rKyporGlnqSon6OWj5ifsqqzqaqzmZ2nm5qUjaCmpLSup6GsrK2xp7Krsamjm56opJ6UoJmbqbapl5qSkp+ZnqGfkq2gmpmHl5iMnZqdlIuPlpeal6amo6CelpaXlIGQlYV7j5ODjJdnbXNocHNfR1lmVkRDTlhEWjlIQjU+XVFoXE5aXUdbXl1PTVJYZEtLQ11jYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVjE1MT1gVl84KUMzWVVcZ0s1jHpmTECkmp+krLajrKikrq21qa6zuKamsLjGtrC3v8HCtrS6xb7MxbnDwbrAusS4wbmytayquri7ur61q6+xt5mYqKurq5yuq4+rvp6rr7Gjqp+xrbKurrayuLaqra6xp7WvtLq8ybKqtbSxtK+upqCzn5qorKCklZWambGiraClr5ahpJmZko2ipaayqaGmsayqtaSusLSvo5mdraebl52Zmay4opeTkY+ZnKGYmJStoZ+WgpWZjp6dmpaRipSTnpqlo6OhmZeTkpZ7jJGFe42Lg4uTbG55b3V8YUZgalpJSFpbPXtKR0U2QWJVaVtNXGFKW1xaU1NTYmFMS0VgYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NYVEtFmpafr6ixqaylo66utam3s7ejrLS3yrq0u7vAvrSzt8TAzMe8xL23v8DAuMC9sr2uqLq5uLfCt6yusrmVl6eurKeksqqUr7ukrLKypqeisbOwsrG1sLeyqa6rsqa4r7WzxMW2qbW1q7Ctqaeitp+fprGgpJSbmJSwnqebn6mNqaKdm5WXpaWktqeisLOrp7GnrbC1rKSZoayonJydm5SquZyVj4+MmJ2imJGYqKSgmIWTl5GdnJiXl4iWj5ebqJykoZKWkpCWd4SRhnyGgoSMjW5xeHZ8f11LZWxcSk9kXD9ie0dJOEdnV2ZbTF5iTVhZV1VYVWldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhnMjcnRmFMViUtQi49RUxRPDNya0xERJGZpK2krK2rpqOwsrKqt7C1n6u1usm4rsG8w7ezsbXCw8/EwMK+tL3BwLu/vLTEqKq5sba3wLyvrLS0naGnsa2lprGlnrK1rKqysauoqLS5rLSytayzrKqrqKypua2ysMe/uKS5sKmtraanrLClpKOuo6mcnZuar5mioqKjkKyfo6Cfoammpbikq7S0pKqrqKyutq6inaOoqpygmZqSpLSZj4mOiJGjoJaOlZ+ilpWGkJWUnpuZlpWHl5KVmaecoKCNk5KOkXh+joR9fX2HiopydHN/fn5cU2RuXk5aZ11GRJZbRzpObVhiWk1hYk5WVlZXVFloXlFSTGRaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZDs2KkhkSEorOkk/M0NJUyw+j2s/SEmQm6mqoamvpKejs7SwtLWxsKCrrb3Muq7BvMextK20wsPRxMW/wbK+w8K8v7i9xaitt6y0uLzAsayyrqGjp66qp6Wxo6uxqq6rsa6urKuyuqe3sbKpsqmqpqWjrbqsqrDCubSsuaipqK2pp7ClqaSirqqoop6coqyVpZ2XnpirnaGnqKGspqKsrLawsaCpop+qrbCsnZ6mp6mao5eYkKComIaDj4uLn6CQjI6XnpKRiIiSlqGdlpiWhpaTk5elnJ2djJKQjYp/f4iEfXeAh4WHdXRyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlPY1xNVVZVV1FcYl9TT09oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5JZ0RGODxCMDVFS1gxQJRdQE5GlZesp6GpsZyoqK+1rLi1rqmkq6u9ybuwvrjDr7CsssTEzs7Dv7+0wcTEusG0ycSsr7eus7rAvrSurqymp6mxqaaosqa0raqwra2xr7Kss7qkuLOsrK2nq6CjnrC3q6qtubaktbWjqaisrKqsoKimp7Gxo6aloaGrlqqhlJugpZ6joqqjrKKeprG2rKyipaOaqauuqZ2hpaSkmZ+ZlY+YnZOBgpCJhZ2gjYuPjZuQk42Fjpmlm5KRm4uTkZGUo5qbmouPi4t8h4GCgnt1gYSBfnV4i6OHeGteYG5nV2aHZE5AZ5JMRGJ6V2JYUmVVTVZVVVRPXF1hVktOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQklJRJeRr6Siqa+Yqaittaq2sKqkq6mpvMHAuLm0vLWmsq/EysvRv8G7uMDAwrrBusLErrG1srS8wb6zsa+trKyot6qmrbCruK6osbCusau1qrW2p7W3q6ykqaqcpJ6zs6iopLO0n7Wtoamoq6irpp+rq6i5tqmqqamhqZ+tm5GpoZ2go6Kmoqqdm6a0rqelqaKkl6Wmp6qcoqOjn5mYn5GOj5iNfoeMh4WenoiFi4uQkJKOhYiWo5qOjZqRkpCOkp+XmZaNi4R/dIeBf354dYOAenh+gIidj3ByZ2dxeFxhdIhpT12YVkhteVVkVlJiT0xWVFVRT1hbYlZIUGpUVlRHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdSRjuVja+fpaqsmaqkra6ytK+qpa+pqbu+u8GxsLmtoravycfI0cC/vbq8w727w8G/v6+ys7K2vbzBsbKzq7OppbWopKyzsrivoq21sa+xuaq4rqqvt6uqnqqroKOhta2poZ+vsqG1qp6op6qjqqGhrK2ova+rrq2hp6efq5mPr6KYoqCopp6nm5ipsKmin6yioZKhoqOnmJqopZiYmJ2Pi4eUiHyNhoSFpJaGg4KMh5CPkoWHlaGWiZKdkZOQjZGclJePioaGeHSBf310eHqBe3R0e2qCiKN2aV5lbIF1Z4iLfFJXcF5LeHNUZFNRX01NU1pnTk1XWWVZR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUM0j46wnqSlqqKlo6ymtLOxqaSwp6q4vsG8sKi5qqeusMnHyNHCvcC+ub+/vcm8wrixsLWyury5wLO0vK25rKO1pqessba4sqanubWttLyvu6WtrbaqrZypr6SfpayrqJydqrKktKmaqqeppKmdo6moqb2rs7CunamjoK6bmrKilqSbpaSfpZqZp6qlnpqpoZuRm6CknZmWqKmRmZqSkIuCj4V9j4J/iJ6Ph4B+jIiSkJGFgpSblIaToo2TkYuRmpKVh4p/gHJ6eH58aHd8e3Vxcn5phnqEiGRgaGNyhXttaHldXlZDWHttVGFQUllLS01wdF1JWltnWkZWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6Sr5ifnqmko6GqpLeysaSpsaetucG9tbCkuayoqLDDycnMwbe9v7W4wbrItcO1tLO1sr25ur22rrm2v62is6aqq661t7SpnLq7qLG/srqgr7S2qayerbGjnKWnqaOdnKSvpq+hn6upp6KqnKOpoK27p66xrqGqoqOunp6sppefmqGim5+amaKqopqao6OVlpOfoZaclqWsi5+Rj5GMgop/f4+AepqUjIl9f4yHkZCNioaTmJGHlKOKkZGHkJmQk4GIfXlsfXZ5eGJ7enJwcXN4aoJ1aoNnY2hhbnOObWJqcGBvQl15a1ZeTlFRS0lNU1lWTVxebVdFWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPSORl6uYn5eno6Gfp6O3r66ir7Cpq7nCurOtoLmvq6ezusfKyL+3wb6vtL63xLbCsrC6sbLAtru+t6q5uL2qpLSmqKqvrbmwqJi4vKOtvrSzoa64taemqLCzoJ6kpaihpJmerKionqCqr6egppeiqKCwuJ+jsa+hq6GspJympqmampufopWcm5mdqaaWm56okJeSmJ2TmZahqZCaiY2Qh32HfoKNfHuhjI2IeYSNhouOjYaJk5qOiZWfiZCVg4yWjZF9hXx0cHxxc3RgeXhqb3BxcGp/c2R6bGhlZGJmh4BgW3JqcU1OgGlYWk1RTEtIUFJRSE1cX29URVlaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrJ+eoaSht6uwo7S0qam6xbezrqC4ra6ssLXFx8C2v8K5sLS9t7+7vrCsvrCzv7K9wrmqu7q4p6i1qKerr6uzsKWYu7akq7q1rp6xuK+ppaevspyhpKCkpKGWm6+moZ+jqK+hoKKTpKSit7ChprGrn6yjr5ecqqWon5ianaOTmpuZnKWqmpubpJSUl5WcjpOXoqihkImKj4Z6g32DinmOl4qNh3qCiISJjY+Fj5OYjI6WmYuOln+Gl4yPeYF7cHJ2bm90X3h3ZW1sbGpqhG9mcmlrZmheZHSBYFtrdmlaSn9eXFhPT0tISFJVRzM5XV5sUUVZVVllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyZFcsMpShoZeUnKqcpKGioLeqrqC7uKWsvcW0sa+jtbCsrK61w8O8s7+6t7Gzubi6t7qvrsCztLmwv8C4rb26taWisqmnqbGrrbGgmb+1pKe1taiesrypqKWpsKyZo6ecpKWUmKGxpZmfo6ipnKKfk6WgpLiopKeupp6loaiSn6iioaGZm52fkZqblp+hqpuamKCUkJOWmY2Uk6OnpJCJiY6GeYR6hIV8nY2Jiod6gYSHiYqShZaTk4uQlpSNjZR8g5eOi3d+fGx0cmxsc2F3dWlpamdnb4ZoaGljZmlpYGpjamhcZntjYFN0VFxbU0xKR0lPU0AhKmheak1EV1VeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKdoqSQjaSmmp2enaO0raequranrMTBt7Gso7aup66utr++vLLBt7Cusra2uLa2raq9s66ysb2/t668u7Gkn7aqpaWzqKqtnZzAq6elr7KprLW7nqipq7GlmJ6pnaakkZmmrKKYnqSpoZuhnJafnae1prCqrqGhnZ6hlKCmn6GgmpuZm5KYnJOlnayhl5aclJKNlZeLj5ibqZ+RiImLiHiFdoGCgZ2HioKJfX+FiIeGkYSWlJCOkJGRkYySe4OVjoZzfX1meG9ramtmdXNrY2dkZHaBY2VmZmZqamNrc1tfWl1tZGFOaVhaYFZKR0hLTVNYPjlfbGlIQ1VUXVtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOgj4usoZiXoJaks7Gisr22obHGvLqxsaS2rKquqLi7urmtwLKurq62rrK4s6msubGvrrO2urawuL2spp61qZ+fr6OprpyiwKCxo66wrrettZ6trq2topqdpqmln5Wap6WfmaWiqJ2an5uUnJ6sr6a6qK6ioZqbnpmepJqknZeel5uTmJ+SqJWqp5qTmpqSjJWZjZSUmqmmjo2KiY57gXSBgYqYhYd8iYmFhYqMipKElJuTko+QkJaOkH+AjI6CcIB+ZnltaGtpZnFya1xoY2N0gWJmZ2pubGdqamhuXWxsdHBhVGNpZGZaSUZMTU9ZUVBWYWWBVUFXU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJGhm42OsJ6ak6GaqbGvn7m/taC0wru9urGmtq+oraS2t7a2rLyvrKqrtqqzuK6ms7Wyrqmwtraxs7W6pqmftaicnaihqKyap72YrKOur7W1rKyfsa2vqaKbnKKrqJyUnKaknZqqoqSWmp+ckJukqqqqvJ+npKCYmpmdoY9ropaZnHCClZqjf3WRqaeelJSekImXmYCWiqGQeYeUjINtaX52g3FshouGfYWMh3BeY2FnhJiFa4uPlJJ0d4uEfoOPf2eGgGd1aGVXXGhzbk5QamNnc4VoX2Vmbm1qXWBhio+EhGZOS0Q5R1RnXkpHUFBVVUxIU2FwdGZGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCswOD1HNjAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Lo5mFlbCbm5Ogm6qtqqO9xa+puMK4vbytp7awpaujtrKxsrC5rammrLSmr7Wjqbi2tqinrLayrrSts6Gpn7OqnqCjm6WmmKu5lKWlr7O3ra6lqa2qrKWhnpygp6abl6ClpZubp6adk5+fmJCeqKmktrCko6KdlpiXl6OIoI6SmYagh5OcoH+kf6WqnpKSmpKIhHJ4jY6FiKF2iIxpl4hmfXN4oG+Ih4N+jnx/oaCgmYB8h550h451m4psh4GDbGhlY3pscWFThW1ibGmYcVhpcXCIWF5pW2xsW4hxbnpyhWeGhFpeR04/R19NRVJWVlFRUldVZ15NV0lSUlBGR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoiqaWg5yrnJmYnZ+qqqeqv8Ousbq9t8C+qqW3sKmspbK0rq+ytqqppbCtpbSznK21trWmp6izsK2yp66dqp+xp5+iopmhoZqts5SjpaW1vaasp6uqrKiloaCYn6ajmZmlo6SYnKSplpSjnJSTo6SmobekpKCjmJWTl5KciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZGEfJCQkcpyl7ycxXpytaa7kHuAbJaxq7B4aGtYsa5uZWm8krxuZ3pvco/YflNrY7ayf4FylXSaoaqQV09XYlBWTkZVW1hRUFKNXFdbUUFdRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYymkoCnqp+XnJ2lrLKosMK9sbW/tbe+waqns6ysqaeus6mvtbOmp6a0pae4r5yzsrarpaSnsa6usKaqnaejsKKhn52Wmp6crauTnqKftLqiqqmhra6loZ2amqGnn5ebp6CfmJ6np5Gcp5qUnaGmoqGxo5+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHGuoaR+eLt9a6GPdrFfarRbpYBlnJFgZoJ7Zn9qeGupZb5yZ6aMdbFqfLF4dJKTY21tp25bhKBFaGaHlkV1nGB+Z3ykp4JaX4uraYCVeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TolQV1cvSVRTSkRFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCrKilnqOkqrG3rLS9v6+2xLK3usGmqbCrrqipr66jsLquo6StsqOouKies7Owo6Wgqq2vrK+mp5+joa+bopqWlZaamqyllpuhn7Szoqucoq2toJ2al6ChqJyYnaOfnJmhpqSPnaKZl6Gfqp6mpqCan6GWlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR/a4Gme4KGiJKUknerZ2uxXKt6jYaUdIlyj4aAf4iQl3iCgouYi4Ogj4SwdnefcWtrbHyLTqRYSGJimX5jaKZgeXJ1U5OHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj+yeVhYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+ViLOmpqGvqaezrKm7tsKwu8KtuLa/qqytra2mrbGpoK68qqCntKyjq7WkprKzp6Sinqeqsqiwp6Wen5+tlZ+YlJWVl52roJmZpKi0rqKpj6moqpudlZigpKeanpyin5ugo6SjlZuel5mdoqmbppmcnKKgl5ORk5Odg9WTmblwsMF+xoZ81pSbu3yalaWPjZ2NpHuOh6SCpYJ6rHmPnVaveoh+n2q5W7p3h4R9poKTfJh6qXiNnY97sW6OhHSRvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITm5OXFJPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjtESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0oLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcxJZuilJmyqKimtKqltKmkvLfBsLnAsbW0urO1p7GvorCypp+ttqiap7mto6+xoLO0saGknp+nqbCotKikm52dqZWYl5WXlZagqJyZlqetsKmjn4+toqiWnpeboaWhmKGhoaGaoaKmm56hnpSZm6afm6eVm5yfoZiQkZSRnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaN/kaGlfrB2g5HS0nZcrnuFf6Rvm6qma4eFfa19l5mOe7Bykp2OeLNllnSEnm+eZpRSyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tgbGhQVUhJOT1WUlpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnZKlsKyjq7ytprSmp7a7vLK6v7e2s7m5sqS0s6CxsaKeq7Ckl6a5raSxsJy0uKqgpp2hqaSxqKyppJmbmaadlZOXmJKSoaaflZKlqrCmopaTraClkpSgm6Smn5WbpqahmqKfrZmgnp6QlZuhnZymlZ2WmqKflZiVkZuFrHt3qHajjYiGqW+tioKng5iYoYmSmouif5OZia6Ff4KzXHKzUq59goKkf3LYfniGfo+dhZqadq+GiZGch3e0YZplmoKClGySWrBYS5p1mHlmYK1edneIaJiIa12vd5Wej3hsNXnIrrJfQlRvXmdgRVBtX3BtVlZNLmZkaVNYUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOjk5n56UoLmwl7TCraizqKmyurezuL65t7G0u7Wkt7Kfs6yfnqisn5SntauosLGrrbSkm6mgn6ihtaamqaKZnZSjoZOSm5iRlKGkmpKQpq2vpqGVmamfoo6RoZmopaGVmaWpnZyknqydoZ2gjZOemp2hmJmblpeioJOXkKaehql9faV4oY6NgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02YB3iHSogY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTgJF/aGeqZHJ7gWuYh3Ndq1qJoI5rb2VPSkOhXFtMdF1iZ01bYV9ydF9LVjdKm5RYR0U9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKKempq/q5i0wq6rramltLC3sbW+ubmysLa6qLq0n6+knaSnp56TqrCpr6m1rKqvoZihoKakpLmio6uglpuQoZ+Uk56Zk5eeno+Mi6iwr6edl5uopp+MkqOXqKunlZepp56eoKOtpKGeoo2UoZifoJKel5yVnqGVlo6rnI+ubXK0c6mLdYqnc7R4c7OAkaSjkpyOiaSHkHe4b4x7i6Jqa7ZaoYVll5dpoKKnbpRytHSTmH+yaoWSiK1rdbNhnWaib4eTapdcrV9NoXyHkVJzo2x5f35vmIdxXK9WPJx3ZlRvbi5cp09jU2tlYm1aY11hcHtjVFpSPj5tbzNDQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimm5udu6GbssCvrausp7ept6+1wLS7r663tqrAtaipoJqlo6Gckaqpp7WjsqiuqqCXnKegpau5naOtm5aZjqSilYydoJuYnJ+Rk5SqtrComZScrKmXjJOlmaWto5GWqrKkn56mq7GZoaOQmaKWoJuWnJehk52pnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyXi4yniHqjtnV9d3bCgpqyYIO6ecB8dbhjtYGMh6l9lYGsqXF7f3S8iKegaZ1hpo6von6MdIeqfb5vc7x0soN1eIGKbpqIcW6NpHS9Xnd9WmF5vGtaVlxqeV5qYWVnY214b1pcWkRBQHNAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5qeoryhl7LDsK2qq6uxp7ivtsSwubCsua6twLGro6Keo6Gbm5CppKqyo7SmraWflpqqmaesuZ2jrZiUoJCln5KMnKKdmJ2akZWSr7myrJWXo6enlJCWpJykrZ6RoKirn5ufqKOzn6OljqihlKKanJiVo5iQr6CSlKmehJCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0nsG7vZl6gbGocIBzkbmDfIaGjIeNfIqHjZd8pLu5vZx1erSjdHaXdnSwdZmeZoZqjbV0cnF3toxef3p9iWiDeW55YouscHWFf1hbp2pFZVpUZmBjXmNRaGdxbXVCTlBNRDtaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+NzA3TFRfRydTYlc4Kk9eXT0rOlZWJz47PKeeoKG/pZa0w7Ssq6isq6m6rrDFrrSxrLamtLisqaGhpZ6gnZmTq6StqaW0p6efm5ago52spL6moaqWk5yQoZqRj6GnoZOcl5OXlLG1t62ZnqSkoouSkqabpaqblqmlpZyaoailp6SpoZKtnpajnpeXl52ej6+olJumoY1qfWmbpniHcn2ZjnR5ZId7vb7Aum+Tg3KVh2FzalpdmolhY4iOlWtggJVjbZ13YpVrgJqVlGVeYGNwmopocot9hZVnan5ydXh9fmJbd3SBaFBcboN9fItrWGt7gnJKSm+GcE50TUVYXWdhTFpYZ2NfT1tudWlyUlBERU47SEk9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz5bTyc/Mj6poKiiwqObtbq1o6ylrqentbGsyKuvsamzor2xsaagoqicopuZmaymr6OjtKmlm5eVoZumrai+p6illJOblZ+ZkpekqKiQnpGQmJywsr+sm6eep6KJk5GpmqijmpqsoKOZm6OnrKOgq6OasZuUp6CWlJ2fnZewpZehp5mbkJycoqOYpaGZm5mZmY+VgWdtfXF3kpeUkoWLtaqMhZeVjoqMmJaHlJWKhJOUkYmOkpSYlJiWmqChmpyUoJ2NgnqlhmxqfJF8gHWKioFxgnh5dnaKgHyKanOBdYN1ZXd9d2tvem1gY11waE1YWmZqYFdacHpubWZUT0ZTOU9aTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6GzosChpLKytqCqprKnpbC0qsiqrK+ktKXAp7OgnaSknKOVlaCqp6yjorarn5mWlp+XraqlwZ6ro5WRm5edl5KToZ6doaeTkpmop7LEsJqrnaufkJeWqJ2qm5yfrZmhm52ipK+noqWon66Yl6ecmZqgnp2cr6CcoaaVl5KXk5+glaKdl6COlpOKio2Ol66QfJabg5KCi6qphYCYl4mDj56IeoSQh4aakoiGipaPm5eNkZido5aak5GdjX+OZqGzr4WKhHZ7kop9dnl6b2Z5kIGAiWt1gXqIcmlzf3t2g4eCa3VkeWZgamVjZGZrWWx7cGlqXFNMUEReVEZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYmNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFtHNTwsQLSguq+/rKuusrGgq6axraKss6/Er6qrorKtvKOzm5+moqGcmZeopammpKWytJ6VlJ2ZmbClrr6grKKQkZ2ZmZSRlKGcl6ichJ+qq6O0yLSfqqSrlpaXmqadqZqeo6yUnp+eoKmvqqakrKKum5+goJiknpyfnK+jmJ6nkpeWnJGjmJennJqXZYKSfGV+jZqQY3mObWlre5Kkqmpkmpd9Z4aKZWVpaHuOoY9saI2YkaN3a2qLmaOemXNsbnqDjYd6WGVehoNebYuJgXZcaHN3d5KAh4JueIJ4gHNteYR0doiIj4N8a4dZXmx1ZF5ziWlrfHFrY15STlhJZFhBSjQ+Rzc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2ln7q8ua+stLGqpaitrbCmra2wvLCppqOtrrCerJago52imZmmqpyto6WoqbKtnpWjj6Kvpba5pq6jjo6aoZmTkpqfmZmklXulraKotMS4paKnr5+elJ6inqOboqmpkp+hnqCqsKuspKugqpunn6egq5Whm6WwpJebqpWgnJqRo5adqZedfb2DiHK0coSdhq1oeLnEuHGToqN6pZmYc6uCfMvAwLtxjKKIg599lpiJncC9gpednY2dwsF8gnuSjZrDwH5spbJujIFvynp/m3eRg46BdnmBgHlxen+HcHeFjJN5bniUY2ZfeWRgZYJjXnRobGRjWExXSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVkFCOy84lqO5w7SwsMCpqJSjr6mwrq2ms7SvqaWlprCrn6uYmqKfnJqqp6KdrKKlqKSktKSdopKmrau3s6euopGRmZylkpGfoJibn52Hpqykq63AwLGhqa+pl5GfnaKaoaOqo5Ogop6era+qraekpKehpqWdraiRpJqoramanKmbq6CVlaSVoKKWnH7OlHh6pIF5lZabX66PXo6ngaKgfKeWm3Org4CvXmONqnunh4WgdZeTiLNjgquGoY2Ns2qErnR9l4i3YYKtWqPNbZB1e9p7f5lwfoiSdn5le4h2dmt8iG59hpGRf22DkGFybHBoYGB5ZFxxaGpkZ2BSVFNXXUtPQzVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTQ3NzE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qnrbOrprKsrKqiqqevqaCnm5mll5yir5+gnqino6ahn7Csmp2Vp66ssKqorJ+UkpufpJOPnqSXnaejnq6lq7Cov8ezqKmxrpaSnZuil5+pqp+VoJ+dna2vqayqnaiopKKrkqyylqWiqqqdo6akoa+fkZimmJ+Zk5ORl6BxhYyXdYWohnGxfZ5yrH6hnoGlj553qoJ9rX+cc61+q4eGn3aZknt8l36qiKKMkYydfqt6iJSQn4B7rVacxHqPb5LBfYGVbXVvjG1ldmWGb2F3bnJviYqSj4RukpFmcHV1cWFnbWVfb2lpbmdkWFNdYVpSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCg+MSkzVkBGIRxHOkMxLiuw08bGsrSgnaOOo6KirK+2rqiwpqiqpq2rq6ahpJ2ZoZWgpaufoqWgqKijn52wrJealqmnrqyop6iel5Sao6GSlKCtm52moq+spKy1qrnNsq2mrqyXlZydopieraydl6CZnp+psqurq5ysq6SjrJuvsaKoq66lmKWqqKmwoZGVoqSZk5GEpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBgUquEf66Dm3atgaeGhp96mZeGe2aAo4mkmYaCo32pfoGWh65ffalVnaKSgXqin4B7w6/Fi3Kvs7O5cWKpr8J0aIyMmI6CbpyVcW56eHlwbWdlZXJwZnxpY11XYGpYWVVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nV1b+hmaunoK+inrC0sK6prKKnpqiqq6mkpp+bpJ6dpqeno5ysmqKsoaOfr6Kcm5OrpLWvrqComp2WlKajkJqiqJ+gpZywpqSosay2yLK1qqyplpGdnKGYn6SznZqhlJ2fp6ytpbCbraqjoqqhs62hqrOwoZqop66utKKSlaKmmJqRe6psnoSHdat5fLBvgqSLiZ+Wlp+UgdK4tLjJgIGyX2CUqYOkiYegepiWmniqyXSapJWoqZGTmoyAnIqaxsd4ZqGCpXOBn46Cfa9dcLRisHVLo4Ztp0eCk2SOkJ6SfHGZlYFxfHV+fG5cZmpzcWaBa15hWWRtXF9ZSU5MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraylopyyuKyqoKWaqKWqq6mmn6ammKqjoK6rnaagrJqeqaWdp7afopeTqaq2sq2bpZyglI+lrJGZnKeioKmmrqGkp6mwtcOys6qtqJOJl52lmqGjrqWXoZWZnKWmrZyxnq+pp56so7esobG4r52arqaysrKjk5anopmejoKdTniagX+feoSjfYOkhIemnpyek4S4e3t5uYJ/zMbCtniboZCLn36alpeKdp6YiqWYpKh/sIWdhqCErH2alGKlbKRwj4SQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+lJOMdnxzhoBxXG5ueHJqgW9bZF9pbmJkXkxMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19dWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6Sruaqun5uhrLKzpZ6glaWura6rp5ymppqjp6Gzr6Kpp7KgmaqllKK1oqKVl6GptLikm6Kdo5KPobGZnpumpKGir66cpaiitrLEsa2pramRh5Ccp5yipJyll56YmpqmpKubsKKvpaaYr6S7rKG2tq2dnLSxt7CxpZecrp+jnIWP0bXDt3mHjoWRk5CApniUoXeMoJGEpYGKcaqGhbRucmqZo5yVip58mJmGh49zr4Klm6KNpouTnYuWkJttcbJdpXOTeptrmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jY6VjXl+eZCDbmp5aXlyb4B1XmVlb21mZ2BKW1hYPEhIQFU0QEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklk3ONiq2/v7y6tJ6Wp6WttaGimZWjqKauq6yZpqKfpqChtqejqaexo5Sso46lraOdkJqaqrOzpJyknKmRlJeun5+epqOcp5y1maKqpLarw7Cpq6mhjISOnKKgpqOVmpqcmZuZp6Woma2pr6Olm62mvayUvbCsnqGvsrmqsqWaqLCip5d5qJB9fLB3ioCkpYicbbJvoIetfKGPg6eVmICsiYWuhZ+UqqChl4afgJmVgHuSfquAnZqWi6t4naCSipSSgXqvXqOBfaanY52AfJdzaq9dpWtwhZldYFuMoG2VkaaZg5aOmY18fISYgGtuf2N/dG6AemFnZnFuaGdoQ1phWz5LVTNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYGFhXV1bWlhTUE9OSTgwNTIuKixBVFZWVlVUVVVVVVRUVVRUVFZXV1hWVVVRSEZJSiMoKL2TmoOpxsK2wbOfmqygrbilo46bpKOfsLCqn6Sfna2Zn7mgo6ugr6marqGQq6iklombkK6wrKaeppusl5ePrKGgnaWhmaScrpihqKe3qcGvpamknouAjpuan6aekpWam5SbmqalpZuqrK2kpZ+qqL6klsKrqaKgq7K4qa2ln7Ktp6iXdq9+kIuchYd9uq2KmWWxjWWVrX2gj4OmlZqBrIqEsIWmmqShoZGFoFtsaoGzYH+te3uDgbFtZ2+ZmIyIsVt+tV2khGvIomSfgHu8WHa1WbJ9Uq6AeqxYgKFtmJCom4yYkpmYfHqQnn9ldX9jhXh0gHxiamdxbWdlZk9WZFxBVV8+SSg+Oj00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRXWl5gX2BhYl5fXFtYVVBOSkdDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt726s8Gzo5yspqS2qKCKmqCfnbOzqZ+joJ61maC0qKqsnq+tnqybla+ooo6Im46vrKinoaaZrpKYj6iZoZ2kn5mjo6aZoKKqs6m9r6Sonp2PfYublqGgmZCSmpySmpipoKKaqa6opqaipam7nqDGpqSooKq0tKutpZ66rKurlICpkqOvjpt/h6SXmZCCgLjDuoOOnJKEp5ecgqyKgq+Ip5ybpqqQftW9wqpio7+9fX6jgoPXuri1hZWTg569voRso4Jvq4RsnH96srDHg2mrsL2seHeivrxzgJaOpp2Rm5Kan3uCkpx7ZH58ZY5neYJ7YWxla2pjUGFbU2pcP1ViQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWzs7G/ubK9sqGcrqalsqadjJilv6q4sqiiv6enspyesZy6qJ+tr6anlJSwrJeMg5uRrqWirKCjnKqgl4qikqadp5yaoaiimZ+hrK6quq2oo5qXk3yHmZGmm5KPkZiYj5iUqZuhmaqpoaqnoKOqu52oxaKgrqOps7OprqifuaatrZlzdaqkt4ZkiaBwaK6RipBubnekkJmfgXWumJRwj4txlaijm5eupHJtbGxmi3hvboKZcYF6anFpZ4qXlphxaWmFiGdxhmRdiGJqb1lcZn12pl9hcY6RbmVlf42Tj6GYmZmTmaF+iZGWd2eIeGmOa3p/eWVsY2ZsYktkWEpsWjpQZUVSJ0s6KyMcIBsiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlZV1dWV1lcXl5dXFxcXV5dXl1bW1VXXqmUrLOpubiys6qpoa6eo7Kpl5K+ssTKv7eqn8CsraShp6yguqOkrqyup46XrqmPi4WWl62dpqqgnaOjoJGLpJKmmaiZlqOqoJadpqansLusrJqbk5J7hJaNpZiNkZGZlI6YlqmWoJipo5uxpp2iq7mfr8Gno7Klq6+wqayqprairLaViqCopbadiZajmYeqm5GVnZKpspmao6qgspaioZ2fopyhpaGVq6eNkpKMh5OcnZWRmZOZkY6VhoGlm5iWjouUlIuQhoR9Z4l+dIJ1c4aKcKdsepSRk5KBgY2PkI+dlaKXmpmkhImWj3NqkXdxjHh3fHpqbWRjb2RVYVlAalxIY2FPWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVFZZXmBhY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltcXF5fX2BeXl5fX2BgYF9ZWWCmlqiqpbS2rq6isKOtn6C1sZCOrMe+xru5q6Olnpymn7GppLennam1p6iRmK2ii4eJj5ynlaykn5innp6SlKOWp5qomZSmoaSQm6iZoba7qKuZmpCMfIGUi6GUipWRlpCQlJimkJ+bqp+ctqOep6u3p67BraO2pa6vr6uoqLK3oK27mJGlpKa2opKep6COqqCOkp+jrK+aoKOvqK+Yo6Cco6qenp2clqudk5mhm5SQlquajpmZlpCWn5KJoZ6VlYWSjZGOlYuAfWaLhXWGdXiHgnOcaoWPlJOQiXyLlZKSmJSjk5+ZpIWKmol8c5dzeouAc3x/am9kXnBqYFtgWW5kUGBlUFo6R0dFPjI9PjkvKiYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFiYWFhYGJiYmRiXFtjl5Wjp6Ovsqyuo6mmrZ+ntaqQkJ2ltbywra2io5p7nqOypKWxqZebuaejk5mqnI6Giomcoo+unqKVqJ+gkpaYmq2LqZaPqJmpjZmpj566t6SlmZuNiHmBlIybk4qVkpSRjZKXo42en6men7ijgISvtaKvr3SjvaOxn3d5n6mwuZR1rKOeiYCqf2RcYnagj6WfhJd9bZKznKOnraqiZZ6fknN5mpdwgJiol21/oqiKZZymnZKYmJaMkpyShp6akJaEkoePj5KJhXdqjoZ2hnB7hX9/YGiHipSSi1p1lJBnaJCPc3uonJtmepqJhHmZaoSLhG95gGtyZV92cGxraFtnZmJicFNcPk5OTlNHPkBVRDkxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXWBoZmdXUUo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgrrCsq6mlqK6ipq2kkpartrGzp5urp6yXdIydsKCoq6eUl7mgoI+cpJ2Rf4mIm56NrJqilaehnY6WkZ6Eda2PiKabqZGXpImcu7SooJmYi4l1d5ONlpOKk5GRlIyQlKGPm6GnmZyyloCMm7Wcs4ySjrumoH6nonqhrbWAjo2lnoOLhpCxqq+Mipekm3qAi6yGnJ2hp6inh5WFmHelm3qHm4GYp4KCe5yyeoqGoZialZiWgpGXl4WbmWN6h5CFj5CSi4NtcI6GeYBwf4CEfoVzhYSVkXiWZ5J0oJp1fZmFo5+ImH+UjIWFmmuOjoZseHtxcWdkeG9qbGtbZWxqZXRcXklUTFJARTUuWlVVNikhMDk9Pjc0MzU2ODs6PT4+QERJP0lFSkxHU1hbWVthYWhmWVFIOUVMPD5iVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kfpaysq6isn6iwpqappZmUr8i/saKXqKm1npCFnaycp6KgjZC+npqNn5qgkHyGj5mYiKycopafoZGMk4mGgJGnjYeinaSUmJ6Hn7qyqJ6ako6FcXaQiZWQipSQj5uMkJKfkpehpZaeq4eftIm0mq2KyoeprYi3hY2wga6sgqiMppiNnX2oj3J7d5yPp5dolaR5tIyfnqankpjCgX+riJihcp6AmqV9l4WVsoGhfaGToJCYl4GOk5yLmZKMfYWTh46WkomDbXKPhX55cYaAg3uDdISAloCPxWZ/qYePo2uehKSdhJqBjo+Hi5pxkJSFaHh1fHhoaHZxaGhsXmRwbWdtWGdHXVJNMkQ0Nk5iZTcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5pbFxRRT1MTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJain6+nqKilq5+jt7CpqqaalKCjpKukl6aruKOwgaGonaaenYmUvZqTjaGSno95hJaWkYirmZubmaKFjot3m5yPn5CInqWclpqYh6O5rqWanIyMfmJtj4uTkI2QjY2YjJGSoI+UoKGZoad+oaeHrZ2glq2PnpydkYWAoIyprYWjjamZjJp/o3WAmZRrgq12Tat4h42ckZqop4Cpq32DoXt6p2qef5JrZ5eGl7eJnn5uYGRZg5d/jHtkaItzmX15lmxdfZdtX1Nwg1xfa3iCX1hkgXyDf5dwp6prg6NucqVwn4WgamagbVtvjH1nWmCEgGJYUG93Zm10c2tqb15rcW1raVhpT15ZRjlBNEhEX2w1LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15eYnVgTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnaC4oKmjpqyRoLa7q62imZihoqWtrqGer7WjqJOhoKCnnJqOmbSakIufjJWLdYGUko2Kp5aVmJ6ff5KFhaykh5qQipmpmZqbkoimsaeilpqIiYBpboiHi46OiouNkoyRk6ONlJ+gnKGkf5OBj6OhlKB3nJWPp4Ohpn+Fp6uDpXiJfISafqJwc5SIlnyfjXlth5uMmY+bqJqPh517gqJzdqZmnn53pF+Yen2TdKJumLe0unSTh4J/tahkgca4e3CVtoxygJqkY3Osq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRgnZmzlnF9mJ+zdXNbnrKDamNvdHZxaG9Ya21zcmZdaV5jTEU9RDZSQlpzMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNT1FARV9eW1pYYGB8ZEhDOExXVVdjYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlZSjt5iqm5OgjaS3tK2toJqinaSjpq6dnLKurJOYoZqhpJmalJ+rm4uIkniLhXGAlo6KkKGPkpSdmH2QiY2ooIeXjomSo5Scm42LqailnpCXh4V+anuHfn2QjYOLkJGJkJShg5efoJ2gnouJd5yYooyfcqGLh6mIm6WOlKapfa2MfnqgmXqjk3iBdJaIjZx9lp+Gm46Ym6WGomShfIiWkJuNbZ5om45vmpl7gIunfXJodKuDnoN0qmiVml2bhXaFnWeqa4C4ZlyocIGcYJWMXqd2dYeIfp5omnSFk5KXjoCfb5qQbqeaXah+eLtrfqpcjoRdtGdcbnJ6eGtpXHFreXljYGZYYkJRRk83V0RTbzVLW1pfT1pEQDE1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW15ZZWdYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuJqbSap4hjlJururGvrJ6mnJypoJ+vnJ6xqa2dl6SboaCZlpahpJmGiY1qiIBye5eIi5aWhJGVmJB6ioSVpJyKlI+GjJ6SnZ2JkKmjoJqMkoqBgGmBhnl/l4x7iY6OiJCXm3+Uo5+goZOYcmifip+PjHCSjIGph5ieoaWepnuwraOiuJd3o7OjpICIlHmde6qaf6KOnJqWiJdxoXyFja+1fWuakaF5fpm1o6SrqISZfJt9nZp/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iianF7jmyAiISZdZt4homxs3+Am5Ond4OdbnN9lXCadGukXZV2SGVkYHRxfn5uZmBsaXZ7ZGRiUV9YXVVXQFpGUWhFU1dcYlheSUQ9Qjg/QTpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUM8VV9iWmZqVmdobW9iZmdeYWFcXV5haGJfZWN2bV1lZ2ZrZGZsaWhraZOcgLCtmYRTXqCms7mysqmaooycrJycqpSirKSiqI+gnp2bmZaYoZ2WiIeJd4aBb3mVhZGbi3yRk5aIcoCIkqGbc5CQgYmalaGbhY+pnJuVi4uLfYNshIVxgqGMeIaNiIiTmZZ8lKShnqKIrYZ9tYSOnpx7pZZ6qYGVm4+Jn5t8p2h3bX6ZdKFzcnydhplwk4OufaSDpp2ZgaRvXqhndaJjb6VhnNOQfXuZeHN0YqKGkH6jc6SPdWuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdm258cJZtf3Kicl2kZ3OmYGimbZvUmn2Gm3B6e5hsnHx4l3NuqaRnYGV6cYCEbGdmZG91d2dhY1NcZlFRYklYSlVhV1NbZWpbZVFGREtNSktCS0U4T0BRTlhTWU9TUWFlZWpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXmoCwq1RcS36pr7G0r7Ojm5mFmamgoaSOpamhmaqKmpiYk5mTkqGYj4iGe3B9hWh9j4OUmoF3kI2PiW9/hY+TkmyXk3yJkpOlloOPq5uUk4uGinmDdoiAboKfhneAkoaImqOYe5SjpJqfibOhoraLeqynpK6lcKmAmo6FgJqQe6SAoZmGmHKehKOur4qXjICNpI2Vg62glHa1tbXJoXOUi4GfYJ2XqW15lYegm3Sih3egfpOXi4FvTWajknCah3Oke3p0YYOBa32ga3FkX5xxfXOWaHlps7W0xqZzmH16nWucm6t2hZttdniYapp7dZhyUEV9s19qdmt5h2ZraGN1dXBuV19UWWlRU2hJVk1ZVFZdaGtuVmdXTktCSk1LSEpPQVFLUGVjam1ldHNzfnl8bnWJe3tUUE9sXmlca2lSamhpbGdsZmNlYFxdXV5pYmRpa3tfXWRoY2pmbm1laWxloZuIrqaEZT+TobKqrq+1oqKQgJeqoqOljKWnnp2mg5uXlo6XkI+ck46Ig3pqeYdlg41/mKB5dY+IjIFphIWRg4yFnY16jYuWppODmaqYjZKLgYl6f32LeXCQoYZ6gZWHiZagln+UpaiclpaEZm54nGyiZHxxpXebmHBnpoCVinqkep+Wg5dyn3eBipWXj7lukYqiYn2ZoJWIbXJpqmt1oG1vpl+aaYuQaZaHm5V0ooB9mmCMho11b4hiaKBlnn5pm3VvY2aIgm1xolpeW2OhbV2Ii256fXNyZKVteKJkZ6domXOMmXCib1WJkG+gX2aoVIteVJhubXNrcoJtcGlseXNrb1JZV1dmWlRtSVlPXUlYaWlzallrVlFSRlZcTVhTYVVpa193dHt9cH18coN7gHN2jYCEdl5RcmJnY3BnUGpoaGtsbmhkZ19dXl1gamNqaXZ1XVxjaWNqanNtZmttY5ykmKV6ZHRti6euo6mwsaafjICYq52fpoyjopujooGWmJOOmpCLmJCOinyHcYCJaYuLfJicc3SJfZB8ZIKHlImJlZmCfIiHl6iRgaOskIaRi4KKfoCAj3NpkKaEfYaUjYiZoI+Ik6mmnYimeJWbfqWIloyymJ6Qgq+Xn6V2lIZ4qXOlj4SabqWijJKEjYO7bn2lr4OGhYaTlZyffKV6cqiVoJZmnn5vrGOVipaTd6htqqKBiXaIg3erkaaIa5Gwa3azjKlrioZtbZ+ekpVgfquLqnZ+foulnnaffIOklZ2gapuIeKxonq2MtnR3vo2kk1mDp46rYXVydHF8dXFja39vaGxTV1tWYWJda01dUl1KXm1ud19bcVlcYFtndGVub3JicXRgd3p+eXJ5g3ODf4F7e4yBgoB2YnhkY25yZFJrZ2hvbHJqZmlhYF5cYmtibWx6b1xcYmlibGp4bWdsbmKVpaqcgH+do5apqp2opq6kmYqCmKyan6WKm6adqZ2FjJqPh5yRhZKNjI10h3uJhHCNhX6YlHR0hXKSg21/i5GHhpOOfXuChpimjn+mp46BjomFlXaCh5NvbIupgYOMlI6JnZ+KjJSro6CPgHWUl4h+gXmUrqN/gZtxj4Z3jomCfXtyp4xxfX16mJabhI95e39+h5OVk4p2kJieoIN7fYlrjIVbeXlyenFpbn6SiXGAdYGPlJNxhoSCZYx/X4B/i3d0cpR1b3lubodshIVedWd3jmWAgIWNqJp9dHuVaomIcIF2fYd3bm1njHN6fJh4hVxrWHmPaW94cnJveHhwXWuHbmpnVltgV11ma2RWYlVfUV9weHlsa3Zmamtsd31ycnVzYW91YnR7gXh1eoN1f4B/gHiKhYN9e21/bGR5bl9XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5obG9hjZS4qKaJoKKapqSYpZyroqGEhJitkp6hiZunm6mYg4Gbi3+WlIeOiomNcoN8j31+j4V7mI90coNwlYV7fJKLhoaPhXl+gIeapY58qKGLhpCQhZWDho6Yd3KEqYaOkp2QiZ+eiIybqJ+gqoOIjpWafn6Jlq2oj5Gmj3dvm4+BeJBufqiFcH2VcWtwfYGgjYCTjoxobV2Di4ubmp6Oc5WLiHF0a4F2dIFZcm6GkYF+foxqXWpke4WEiYBgaXh6mnuCioF1gYWCZ3eKhmphcHGBdV5xioCIjqWUhWWLjYNud4uEcYaQenFnaGV8hHuWW1xqZ252W3x5eHVuc3ODZ1xti2trYlpaX1tabHFcX2FaX11mdH57dXB0Y2tra3x+c3x4dWRtdWhtfH52enx7eXqAgH5vhoqEe31zfnlzf2hVXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbmxnc3pvaGptYIuLqrCgj6Khmp6dl56YqKOifoOZro6glYicopGllX97mIV9kpmJiYaHinN+gYx2hYyChZeKcW+AcpiGg36Sg4SGioF6gYWMnKGRg6eiiHmOl4mVi4ucmISDeq2CkZealYqenYiIoaqfoaKji4eTm5yjmZaqoaemn5KahpSMenaNjYOnfn+SkJKTnLKmm5WfkI2yk5eDpYyMlZqfiZCbgoiRimt8jnd4ZYKGkIt8iZ2Eh4yQiIiAhISQd3x6dJmgiIaJnYmEk359ioCAdW9yhIF9d4aGio+lkIKFjIaCjJCMfYeMipGEeW2DhX56mWtyaGF0inF+end3cHd0gl1eb4dobl9eWl1dU2hyVmRcXWJsaHV7fHNvcGRra2qAfW55gHJqcHBsZ4F7coKAeH99f4R7bYKNhnx5eHt9eoN4TmR2anJtcHpla2VjYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2SMh5y5npaioJiUmJiUmKSgnnx/mqyPn46GoJ2LnpZ9eJSDfI6ZioaDhIdueYGBc4GIfomUhG1rfnqXhoOCj3+Ah4SGfYeFjpyek4eroIRzi5CGkpGLnZJ9jXuqhI6TmJaPnJaHh5yln6KanYWCkpqZmZCapp+lnZ2PlX+PiHV7ho2EpXt8jpCRhpiroZ6UnZCOqo2QgJ2MiJOZnoKPl36GjoNvd4ZxdWB+g4+GdYyYgIOPgoaFfoWElG55dXSRoYqLhZqEhIxzf4l8fHJxeoeCeneKjoORpo+Fg46Ag4qJineGiYuNfnBsf4J8bmhsbWhfen9pfnx2dXZ1e3hcX3B+bnVgY1tdX1JnblRlW15ia2l2en5xbG1ka2pogYBsc4FsbHVveW+GeW6HgHaCgH6FdnGCjYh+e3p8f3uCimBpfGp1aGmCZGpjYGlcY3Vob2J1bWxVY3F5ZXB6e3Nlam1ti4met5qho5+RkZWXi5qen557eJ+nkZyLh6WUi5iZeXqNhXyJkYSMgoKDbnyAeXOBhX6LkX1qaH2Cl4h/h419foaEhn2PgpCcnZKJqJ2AcIyLjJKHoKGKhYx9qJGJkJKXk5aTeIyjoKCdlpl/gJCamJKMm6OhpJmXkZp9jIN3f4KOhp9/foyMj3yYpaGik5qRkKaMj4GakYmSl5t+k5J+h46BdXSCcHdhfYCNhnGLlXyIjHGMf4KFho9od3F4i5iRj3+WfYeKcYGGe3xwd3qKg3l5j4yClKWSi4WPe4aGh4R2g4SJiXxnc32AeXtxbGtnX35zaHx1dnR9c4BqXmB0dnB3ZGNZX19Sa2lVZVlfYWhqdnmCcWdrZG1oZoCBa259aG9ybH55h3psjIFzgYF+gXR2go2Gf3x6f4F9f49pcoNuc2lhh2hsYl9xVnRvbW1geGhtV2p0dmN1entyYmpveomMnrKSpaWcjo+Xj4acoJudfHaloY6YgI2ji4ialnl7hod+g4l/iYKBf3J/e3R2g4V+ipF4Z2N9hpeJgImLeX2AjYN5l4KWmZeNl6GcfnCMgpGUhqabiIyJg6aVhZOLlpeTkneRnaChl5OWeX+OmJeOlpqcpJ2YkpSaeI6EgneDlY2dfoGJjYxzl6OfopOZj4+ijIuDlpiDkpaZfpiMfIiNgXZxfW57ZIB8ioVwh5N/kYJsh4OCgImFZXVue4WRl4t8k3eLiHt/hXx6cX13iIR4hI+IipehlYGDi3aIhIOCd3yDiod4YXp5fnR/eGdtZWF/amp3c3R1fXF8YmNgdG51cm1hWmFeW2xlUmNZYGFoa3Z5hnFjamNtZWh9g2xodGhucGmAfYJ5bZCGcYCEg390fIOMgYB9eoKDfnyQbXaJdHRtZYpsamJidlaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5ytl6aono2Ml4eGn5OXmX54qp2LmXqXnYuLmJB5fIGMfnyDfIGDgXh0eXt0fYGEgImLgGRffYuUhn6EhnV9fop/fZmFl5WYjaSjmX9zh3uUkoqmj4yOipOhkoORkJWXkYuBj5efmpKPkHN/jZKUiZ2dnqaXl4yUlXKLjYlrhJePmXqHiI+Jb5edmqSUlYuMn4yGgpKcf5KSlYeZiHyKioF6cXlrdWx7fot+bYWSgpR4cIGDfn6LgGRxaXt/lpeEfoxzj4eDeIZ8dXd/fIR/e4KLhIuTo494g4F0iYd9gHR2gomFcGF8dnpxfW9ib2NkfGNub3ZzeHdzdGF2YG9sdW1vXFxfXl5qXlBdWWNhaG10e4lsYGlmamNpd4huZmxpam1ogX17d2+QiHOAhIR9dIGGiXuDfXqBhH19jnJ6i3h4bmyHamhfaXJjh2dxb2V3Z25sYXlpa317eHBheG2LgJiZqqCjqJ2KipGGip2LlZh+eK+ZjZd9n5SRlpOId358in18gHd4gIBwdXR8b4Z9gYGKf3xhXH6PkoZ/g4Nze4CHe4+SiZOSnZOmnJaCfYF9joqSpImOio2Ym42GkZiUlo+KiIySnJKPi4xtg4+PkYmemaKhl5WIlpBth5iDZoWYjpN6iISQinCWmpSjk5KJi5mMgn+QnX2Sj5KMmY57ioWHc3J1a3BudXyKdG6GkI6ScXWAfIGCiHxkcGx5fJmTfYOIc5CJgHOHeG5/fH+Fe4SLh4OLlKeMe4d7fouFd35xcIGHhGVoeXV1cHxiX3Bha3RecWp7eXlsc3BleF1ubHNtclhbX2Bha1tQV1hlY2dxcX+HZl1qaWdiZ3GNb2RpZ2VpaYF6d3VvjoV0gYKDe3WCiIV4hXx4hIV6f4l3f4t7e3J4g2prYHBodIBrcm9tcmdvbGV8Y26AendxbHd3in6il6GooKabh4yKgZCch5OddoKrlZOOh6GNlpOPf3R8d4V4eX9zc3uGa3Nwem6Ld4CBiG9xW1l+kY2IgH9/d3WBgYCghpGLk52YoZWYeIp/gY2JnJ2Kj4aSmJaFiZWZkJeLi4yNjJyJjY+CbYmLkJGKnZahnJeUhZeHaYOigmWEnImQfouDi4F3k5iSn5ORiYmVjX9+j5d8kY2PjpqRfIqAg291cGxtb3B7hWlzg46Yi3F3gHWCiYN5ZnJudYCajnuHg3mTkHl2h3NviHqEi3mKhYKHjZqih3uDdYKLf3d5bmyChYNec3VzcXB5Wl9xYXBrXnBqfXtxbW1qbHZgb29qcW1ZWWJhYm5YUVRaZmdjdnCEgmJda25kYmZrkm5gZ2ZgaGuBdXJzcIuAdX+DgHh1gIuAeYV/d4eGd4OFfIeMf3t3in9qcWN8Y4Z8bnFtdGpob2x2eF9xf3l8dXV0gIN+pJWarZ6mloWNg3+XlIOQoHaMoJSThoubjZaOi3pyeHSCcHKFdHF2iGxwbnZtiXeDfoBublVRgauUh4J4gHdyg3qCoYKTgpWUmZyTm3iSe4OMkqSak46JlZmShIeXmYyUi4mPj4edhJCKfHKLhYmOiJyan5uVlH+TfWiEm4ZnhZ+HkoSRgolxg5GYkJyPkIyMj413e5KReo6LjJGWjHyIfIBrdmpua2xse39hen6OloJ2eoB4g4x8eWZza3OGlYt+h4V6k45weYRvdot5iIt5h3yBi4+dnYR8e3aCi313cGpsgoR7YXlxbm1zdFZfcGJyYWBsbnpxaHBmZnN0aHFrYXdlXVdmYWByU1FPXGZlXXlwiHxgXGlyYmJlZpFqX2hlW2dwfnBscXSKfXZ8hYB1dX6MeXuFgXiIg3OGhX6MjYR8eZV4ZnJrg2CIfm9va3pgam50f3VfdH15hnh0c4V9eKCPmbCcpY6Cin+DmoiAjJ6Ai5qUj4WImI+Pj4R3dHd0gHFwhXRwcoRwa2l3boNufX1udXNSTYLfyJLWk3twdYN1hKCDlHeWkpmckZl7lHOFkJ+hk5ORiZOclIZ/l5aJjo2Iko2InH+OgXd6jH6JjIqcm5yblZJ5jHVmh5CGa4eihJGIl4OGY4yRmY+Vi5eMjIqLcXqUiHuOiIqSkYl5hXx+bHtlc3Bra3p5W4B5j4+Ben1+f4aOe3pncmpyio6JgYWEfJSKa31+bX+LfoqFfIN5gI6UmZmJfHV3g5B4cm1ncYCFbmt1cGhqdW5UX29lcFpgbHJ4Z2trYmZ4cnBwY193YGBWa19edlBOS2FnY116cYp1XVxldmFiZWWPZGFmYllpc3Nua3J3jH10eoaCdXZ+i3OAhn97iX9yiYiBkYuIfH6YdmVzbn1liH5ucGyAWWxueXl0YXZ7e412cneKd3mfi5uum5+QgoV3iJV+fYqdiIagkY+FjJiEk46HgXR4cHlxb4RvbW9/c2VleXF9bXp9amhrY6Sawdyu8KFybHaEdoWjhpJvl5GWoZacgZJyhoujl4mOlYqRnZaDgZaQhoqQgJGKiZZ+h3p1f4l4h4SOnJqYmY6Pdol1bYWIinyJooORiZyEhV6Lk5eLj4mPi4uFiW17loF9iIWJkY+GdoV9fWt9ZHh1am55c1eIepKHhXl+gIGGjH95ZXJpf4mOiYGCfouWhGuBdW2HkIGOg32BeH6PlJKYj3Ryd4eMdXNxZ3Z6hGN1bnFjandoUmFxZ2xWX290emFyZF9ofnByblpjcmBiVm5ZXHhOTUxkZ2Jed3OJblxcZHleYGRlhWBjY19ZanJrbmtzd4x+dHeEgXh3e4lxg4R9foh7dIuJiJaGjH9+l3NndXJ5bIt7bnRxgVdxenZ5cmV3eYeMaXaAiXJ/nIeYp5yjkoV9cYyUeHmMnoSFoY2OfJaNgJmHhHtyd3B0anCBbGltfHVfYXh3e3F1fGhgZHzr2rXJw9yHcmx0gXaLm4mOapmQkJ2WlIGJcYWJoI6Fi5WKjJiUfI2TiIOJkHuQi4WPgX92eIOEcoiCk5yWlJeGjHWGfW6DgYiGmKGCk4yeg4lhg5SPh4qGiY2HgYdqfZSAfYOEiY6NgnGGfn9xd2h2cml0d2tajHySgoV9f4OAhIqCdWFyaoeAj4qBfn6RkHxtgWt3hY6FkYJ7gHx+j5GPlYhucHmMhnVrcWxzeYJgdWpvXWt3YFJlcmlmU2BwdnRhcGBdaINxc2pXZ2hiaVhtVlt1TEtMZWdfYnNzhWpcXGV5Xl5kZ3thZF9dWWtuZW9qdHiKfnNzgX57dnqHc4WDfH+HdneKho+ZgYyCe5N1bHd2eXiTdG54en1YeoZxgG9neXeSgmR2hoVwipaFmaGaooqHdG+Ti3J3j5x+i5qJiXygf4SZf4F4cnRub2Ryf2lmbXh4XF95e3txcYBqYWZhf9W2jpGmeG5xd3xxk5GNh2uaj4mck4yGe2mHi5mHgZKRhoeYjnyNjYGBio18j4x9iYR6dHqDe3GGgJaajpOUgYh1g4V1gn+JkZyehpSPn36IYn+Th4WIhIqNgICDZ32RgH5/goyPkH5tgnyCdGttd3V0d3ZrY42BjoCFfnyFf4SJf3BfcW+Ee46LgXt+kId5cINleYGJhouCeoN8fpKNj5GDbm55i351bW5rbHt+ZGlsallud1pSanNpYlFjc3hsYmVeWmqDbnNiXGhfZGxgblVbcE5IT2dlXGdvcYBtWlxjc2BcY2x3ZGVdXVpsbGNtanN3h39xcIB7fXR4hniFgnyAiHV5iYGSlnyJhnaJgXB4eXuEk29ufIF3XoN/dIJtaXpzlHNnc4h8cpKRg5qfm6CGiHZ2lX9td5WYfoiQhIqNmn2MmnZ+dnFwbGphdXxnYmp1eltgeHx6bXF/ZWNnZ1edj19xc5a8xIR3cZSKkH9zmIyHnZSNiHRriI+VgHuUjIGEm4x8ioZ9fImMf5OIdYmFdnZ9gXF1hoGelYaUj4KCcX+Hc4N6iJabl4aTjZyAiGZ9k4KAhoOJiXKCfmd9i3t5f3+Hi499aYB9g3Zmb3l4c3dzbGqOhYqBin94goGEhIBrXXB3en2LiIV7gI5/fXGAaHiBhoqFg3eCen+Wi46LfG1reol8dnRvaWh9d2VdcWNYcHRTVG9zaWJOaHR4ZmFeXVhvgG90WWVjXWptYHBPWWxSRFRoYlpsb217b1lbXm1jWmNwdmRnXF1gbGpjbGlzd4GCcW5+e390dYN6hIJ8goZ2fomBlpF4g4p0gYhzeXl+jZBvb3uBcWmBeXp+bm18dpZraniEdGuUjYWemKCZhYhvfox2anmZj3+CioKVl4p6j5ZvenNwbGpkYHR7aWBmcntbYXN9emdwemFlZI6xsndLYlql2tGXcnuSjJF5f5aMhZmSjYZvbIaSkXp5k4eBhJmKfId/eXiJioSVgG+Kh3F0fXtqeYaDpZGFk42Df25+gnWCd4WZl5OKk4+UhYdwe5KEfoODiYNvgXhogIV4cn9/g4qHfGV8foR2Y3BzgGh5cW91mYyGg4p7dniAhHqCa1tvfHJ/h4OIfYWIeohxgG1wgoWNg4Rxg3d/mIuNg3dtbX2Df3Z6ZWhqfnJhWnhbWXJuTlhyc2ZgS213dWJeW1tZdX1ycFhoXmZqcV9vTldpUj9ZZ19bcGtneXFbW1lrZVljcXlfaF1eZWxoZmxpcXh/h29tf32BdXCBe4CBf4N/doGFiZeKcYKNcXuGfHp5hJSMdWt6f2xvfnSAfW9yfHuUcG+Af3lmkoqCoZidkoOFZ4eDcGd6l4p+gIWCmoqBfI2NaXhya2tmX2FveW1fYm95XWRsg3phcXZfZGXV676LMjo+i46AcnmGiY+Nd4WYjX+Tj41/bm2FjIx1fY9/hYKViXyDeG52h4WDlnduh4RrdXt1ZXmDhKeMg4+Mg31tf3N1gniEmo+Lj5GSjIuGfnuSh3iAhY2DbIByaYB+eG18e4GKg3hieYSBcWRxaH5tdXF1gZuLgX+FfnN1fYBygG9aa3xzeIiBinuGf3yHd3lwa4aCjoKJcYB3fpWKin50bWp2gIB1dVxpaXhxWld+U1pyZUxbc3JmW0pxeHBeW1pZXHV/dWlZYltnZW5iaU1YZlE9XmZdXnZmX3VxW1lVb2RaZXF5W2heYGdtZ2lraXB4fY5taoGEf3lugHt9gX+CenWCgYyThXCAi253foF7e4iTiX9pe31rdHxyhntzd31/jHp4hH58a4yMhJudloyCgGyNfmtof4+Oe35/g5WCf32KiGt1cWdpY1tjZ3NvYGFsdGFocIl6YXN0XmJjm6CQblw1Wq+1dWqAin6ThneHmId1j4yKeHBthYOHdHmJeIl9k4h6fnJndoh+fZdvcYZ9aHZ5bmV6iYWlh4CHjYl9bX11fn97ipeGgZOQl4iLhIl8j4lxfH6FfGl+bWuBe3lqenaCh4ByYHeCfnFkcmd1gm11e4aUkYF9gX9vd3l7dH1sV219dXOKgIZ3hnWBiXp3cm2If45/g3F9e3yRh4h6bm1pbYKCdW5daGZ0clJcfE5ccVxPXHNvZFZLc3lrWFlYWWBxgHVhXV1gZ2RoaGZOWmhOQWFkXGB2YVx1bVhYU3RhW2Vvc1dqX2Joa2dtbGlwd3yTbGiEiX18cH5+fIF/gnp3gICJi4Rye4dvcXeEf3uJjY+Dan57bnh5d4p3fXiAgod/hH5+em2EjIiYo42FhHt2i3lrbYWJknl9e4KSgIB9ioNwcnBiZl5ZZ19wcGBhaHBmam+JdGF0b1tgZGp2e3++nKekybhyhYRzk315iJSEdJGNiHJzcIR7g3N1hnSId5SJeXlwY3eGeYCSaXKEdWZ3dmNqfISInoKAf46PfXF+c4N4fpCOgneVjZSPiIKIe4mJbHl6f3Zoemlsf3lzaXp2gIN9aGB4iH1qanNoe4BqdoGMkZR+en1+cXt2e3N9YVV1e3FziIKBe4Jwhol3d29vgoGLfXx3fHt0jYSBdWhxaGyIgnJwXWhjdG9MZnZMXm9VVFlzbmJRT3R5YlNXV1xhcIJzW2FdaGVlY2pkUVtxSURkYlxkcV5ceGhVV1Z3XlxmbmlWbF5hamdlbm5ocHd6k25piIx5fXJ7fnmCgYJ8dn2DiIaDcHaDc213goJ+iYuUf3GAfHh6eoGLdIN4f4GBgoR6gHVvfYmLm56IfoZ7d4d8aHWGjZF6f4B8iYaEdo+AZ3BuX2RcWGZZbXNhYWFxbGxoiW5gc2lYXmNtgHep2anHhoizcop5cI52fYiQgXqUi4B1dHV+d39wcH9uhXSUhnh0bGB6gXmIjmVxg29ndW5bbX2BkJOAgXmRkn13emyFdH6PioNylYqQjoeFhXt/hm11dn9uaHdlbXx2bWp3dn9/fGBieIZ6aHV1Y357Z3WGjo2VfHR/dXGAenxsfllWcnxvdIKGfn93a4iGc3hqdH+Cgnx5e3d6cYp/fHJndGRti4RtdFtrYHZmSW9vTFtjWFdWeG1iUFN1dllRVVddYHKEb1xgY21kY11vY1RdckdCZl9eZmldWntjUlZcdVtbZ2thVmtgYG5mZmxxaHB2eI90a46MdX92eH13gYOBe3R+g4iIg29xgHVxdX6GgomNi3t3f3iEfH2Fh3iHfH2BfoWAe35zdniLjp+NiXuKd3WDel5+h5qNeYeEdIaHhHeJemJubFtiW1thVWp0ZGBbaG9wZ4dxYXFmV1xja398ys6GuaJrbm6LbXKFcn6Fi397koZ6eXR6dXV7amx2Y4R2koJ2b2dffIF5i4hlcYBqanFjWGx7hpyJg4Jyl5R2fXtth3CAiYqGcJaOkIiFi4R7eX9ycnB+Z2hyY254cWpscXd9fXpdZXqAd2l1eWaCdmd0h4uNlH1yhmpvfoB4bXtcWHB9bHN+iXuBbW6Jf3B2ZnZ+gH6AdXpweXOFe3hxZXJgbYuBa3NYa195XUlwbE5XVl9UVXxrYk9UdnNRUlRWXWJ0hmlcYGtqZmJZbmFYY3BHQWhdYWZfXFZ8Xk9WZXFZW2poXVhnYV9yZmpocWdxc3eHeW6VinR/e3d+eYOHgHVzf4aFjoNwcHx4d3V5h4aHjIZ6fH91i359hoSEh39+fn2Hf3x4dnl2kZOffo19i251gHpkhIiXhnOSim+FhYJ6g3VkbmpZX1tdXVVoc2VgWWRycmeBcmFrZFdaX2l/eL6uep+3bmJ0h2l0fHJ6hId7fo2AeHhzd297d2Vqb2CHdY6Bc2piXn54eIqCZXB9aGtrWlZvd4ukgYV/cZmScX93dIFsf4GPhnKTh4yHhImFfXl1c29peWFqbWFtdmpna2t5d3p3W2d+fHhlc35uhHRmdoaNhpV/b4tma3qCdGx0Yltuempzeop6gWV0hn1tcGd0fnd8fnB6anl6gHh3b2VsYWyJfWxuVmtheFZMa2xPUk9pTll9Z2JPVXZsTVFUVV5mdoRnXmFxaGdhV2ldXGtpSkVrWmJlV1hVeVpOV25qWV1sZV1aZWNedWZsZXFmc3B0gXhwmYV2f394f3yFh312dIKHgJWDbnN5e3tzc4WHiIiEeYF9do9/fYSJjoOBg3t+i4N7d3x3dpqdl3qKg4dqdn59bISGlIByj4JxhoJ+goBwZmxnV11bXFtTZXBlX1hjcnVpdnBkZWJXW1tof3Bvcn9ziWVmen9qdXZ0dISFeIGFend0dW5renFiaGtnhnSNg21mXl98b3qJfWhtd2ZqZFZXc3COp32EfHaWkHN7cnt5bHp6j4N2l3yHhoOHhH11cXNtaHVdbWlfbHVkZ2Zpem97cllngXd1aHCAeIJ2YneFi3yUgW6Lam17gHBlcmVfa3hmcXWJen1hdYN2aWtxdHpveHhye2V9fn53dW5jZWFshnxta1ZqY3JUTGtsUExPcEhee2VhTlZ1ZUtPU1dga3d+Zl1nc2llX1djV2JxXUxLa1hkYlVUVXNXTVl2ZVpfbGBcW2NlX3dnbWJwaXRvcX51dJmBd3+AeIB/hoR6fXaCg36YhW5ydHx7dHGFhY+CgHqLdXSQgH2BlI6AhYR8foyGen6BdnujpYp5iYaFbHV9e3WEg416b4VzeoV9goR1bmppZVZdW1taU2NuZVtYYnR7amhtaGBhV19aaYBpa29/Z2xiaXt6a3R1dW+GgnuBfXZ2bnpoanlqX2VuaYF3kIRnZVhid2l+hnluaW9mZl1VWXBpj6h3gXp8kI54dW99bnJ0eI5+d5R0hYKAhoh2anN2aGlvXG1lXm5zX2dianhoe21bbYNzdGpvgH55d2F2hYR5kIZziHFveX9xYnBoW212Y3Byh3p3YXKAb2dpeHNxa3d2dHVignp9dnVvY2NibXx8a2tVaWJnVExuaFBIUmxFYXhlYU1Uc15KTVVZZWx4e2ZfbXBqZF1WYFVvb1dKU2hYZ15YTVVsVEtcel9cX2tdXVtiZWB6aGxhb292bm93dXqXfXeAgXmAgIeGenl6g32Bk4RxdHR+enZ0hYiQfYF8kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ9/eoiIhGxygnp2gYGCdG6Hb32AdIqAam9uZGRYX1paWlViamdcWl91gmlebWxcYVZbXGuBZXF0fGlqXW14d2h1eHNuhnx+fnp2c2x6aGl4Z11kc2h6d5KBY2NUZG9ngYR2dmZoaWFXVlloZJCob394gIuOenBve2Z4bnmKenaOcYN9f3+GbmR3c2RpaV1sYl5wb1tnX211ZXpoXXSAb3JrcXt+dXZidYWLe4iIgH93cnV+c2BwbFhwcmFwcIN7c2NxgGtgbHpvaWd5d3RwZIN0eXl0cWRhZG1yfmprVGleX1VMdWNRR1diR2N2ZWFMVHFZS0xYWGdsdnplZW1xZmNaWF1Yd2ZUSlxjWGlYWEhXZVFJYnhbXV9tW15dYmNegGlrYG90eG1vbnaDl3lygYB9f4mMhn51doZ4hox9dHV1gnl6eoKMjn1/hIlqdJaBe4qdfX6FeYB7fnyGiXNxj66Me3uHkH5mcYh6dH59dnJvhmx7fm2QemNwb2JlXWVWWllXY2ZrYF1dc4ZpWHBtW15XWlxse2Jxd3VsYltudHVodXdyboZ5f4F6d29vdGVodGVbZ3VmdnaSemBdU2VmaoKBc3xhY2lcVFheYmSQpWl5dIKFkHhsbnhmd2x7g3l0iHKAeHx4gGlmd21gaGFfa2BedWtZZl1vb2J6ZVt3fGtubnB4eXR0ZXODkn+Ig4h6dm9xfHFhd2Nabm9gb3CAe3JlcYBkXm11aWNmeHpybG2AdHJ8cnFhXmVtbn1laVRoWVpVTnlgUktaWUhidGNgSlVuVUpMWlZpbHJ7Y2xsc2NhWlpbYXdcVEtjXVlqU1ZHWWFOSGp2WF9hbVtbX2JjXYVpaGJueHlsb2p2gZB4bYJ+gIGSiISBdnWJdIuGdHF2doJ3fX1+jI+Bf5N+cHiWg32ZknmAgHh5fn9ziIRzcJmie3t/iZZ4ZHWJeXN5dmt0cH9seXxwkXJecG9gZ2JsVFtaV2lkbWZcXHKJZlJybVtZWFdgbHZkanVqaV9bbnVybXR1dWuGfX+AfHdvbmxlaXFjW2tyZHR2jnNcV1RkYHF/fnGBXGJjXlNaYVxkk59lcnGEg5Bza2p4bG5veXl6cYB2f3N6entkZnZoXmNbYWhcXndpV2JecGhhd2FbfHZqanJveHRzdGhxgpWDh3+EdXJqcHtsZXZXW2lsYXBxf3lzZW9+WmBvcWJeaW98a2pyfXFvdmlvYFtka2x7YWdUZ1VYUlF3XFNQWVJIY3NiYEdWbFFJUFpWa2xrfGVtb3JhW1pYWWxwV1NQZldXaVNURlpcT0lzdVhgZG1jWGBhYl2MamRlbXp4a29pdXmFe2uEfYCEmX2ChHl9iG2PhnFvdnp9dIKCfYuPg4KXdHiCk4aBn4l1gX+BdH+CcIeCdW+il3N7hoyHe2Z3i29ufHBneHF7bHN2c41rXnRuYWdma1NeXFZoYmxsW1xxjGROb21cVldVZml0aGN0ZWVdWnB2b3F2dnpsiH2AfYh3kHNjZWtvYV1ubWRzeIhrWlRWYmN3fHxwhFxjX2NUWmBaY5eVY25wg4SJcmpneW5lcnVxemt5dHVven52X2dzZFxfV2JkWWF1ZlZfYG1kYXFdXX5waGlzcXRxdXZrbYWTgol8hXFxZm57b3BuUlplaWRwcn91c2JsdVVicWtbXm5ke2RrdHxxcXFpbF9YZGlqeF5mVWVVVlBVb1hSV1RQSGVyX2FGWGtPSVhUVm5pZHxpa3hrYVdcVlt0ZFNSV2hRWWdUU0haW1BOeHdbX2ZtalpiYF9ej25iZ2t5dm5uaXZ2fn5thIB+hpd7f4eBin5rk4hyZ3SAe3WAg36Jjn+Lk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Md3hueo1gZX1xZ3p0eWxtcXeDZ2R8bWNmZ2hTYF9VZ2Bsb1xebo5oTWlsYFVWU25mc2tmeGRlXVpydm5ze3l0bol7gXece3psYmVsbV5gb2plcXl/Z1pWWF9seHt6b4NfYl5oVllgWGSciGJrcYGGfHdranZsW3VwanlpdXJub3uAc1hrb19ZXldjZFhlcWNUX2JpYWJsWmB+a2Zsc3VvbXh2a2iFjH+JeohtcGVve2xxbGJYX2dnbnJ/c3JeaWxTZXBkVWJtYXhib3V6dGpua2pfWGBmaHVdZFdiVlNPWWdTT11PT0hlb11jR1pqTkpfS1htZV94aG5+ZGBVXlRddVtUU2BnTl5iVVNKXFpRWnZ2XV9mbWhYY2FbXo5xY2hqeHJzbWd2c3mDc4KDe4iOfnyKiI55bpCKdGxzgnR/f4iFh5GElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2OjYyNjY2Oj4+Pjo6OjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQkuSmpmZmZmaemxubW5ucUksMDAvLyxJhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiGgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzP5OenJycnJ13ZWdnZ2drPBgcHB0dGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJh4iIiIiGjZCQkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGjY6Ojo6OjouKioqKiYmGgoKCgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpKSkYmHjoqQkpORi5KOjo6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2MjIyNjY2NjY2NjY2NjY2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6FjomJjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkIiOjYmRiYyQj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCQiY6MiZCIjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fH19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6Li5CIjYyJjoePj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4yOjYuNjI6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXl7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx7e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18e31/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHh4iJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX5+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5OTlJOTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTk5GPk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGRkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKOkJGRkZKTf4STkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkoR5kJGQkohziZGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QjXB7kI+Pd3aIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6OdWyFkIdyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI14bXWOgXR2ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLiHBiZ3hzb3WChYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dndyXGJpXGJka2doa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGBjdGxeam5nZGJjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aW2tza2FtdG5lWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01bZW9rWmlzdGtSUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTlhiaG1ub3BxblNMT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tFQ0ZJVmNmZ3FubWhnXVFOTk5PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFRUtNTVJfam1obm1tamhmY2NjWkxKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD5FVF1fY2lsbmltbGxqamtqZ15PR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs7R1ZfbnBxa21ramltZ1hJRUVER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7PD1RZXFyc29saFhFQD9DRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OTk8S257cVZBODo8PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT09PTw7SmxlOTo7PT0+P0BBQD8/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDxcbkA+REU/P0E6Rl8+Pj07Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213SDg7Oj09QTxLZD08PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PD1JTUZGdXdNNzg4Ojs+PldqQTs8PDo6Oz4/Pz09OTo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3p8d1c8PT89PT5GaHRMOj0+Pz09P0FDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KDhIODg4B9Xj5AQ0BBPUpye1k6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hXZNQUNFQD8+WXuAXT9DRUlKSUlNTUtFQ0ZHR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIRkhGUW5ucHFydXZ5e3t7enx9fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SKbEFBVnSHiYeHh4iDV0hMTUxNTkxJR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVmyEh4aGhoeIiId8UEtMS0hHRkZERUNDQEBDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVIGDhISCgoWGhoSChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhIS01MR0lKTU1OTUpKS0tKTExTbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTU3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjIlUOjg2NTY3NjY2NTY3NzM1Njg6ODc2NTY1Njc2NzY4OjY3ODg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRlBTUlNTUk9QUFJUZXFxc3R0dnl7e3t8fX5+fn9+fX19fX1/f39/f39+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZYWDgYCBg4ODg4OFiYuKiYmKioqKi4mKioFHNTY2NDY4ODc0NTc4NTY3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3Nzc5Ojk4ODc4Njg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2ent7e319fn9+f359fX19fn9/gH5/f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4OEhISFhomKioiHiIiIioqMiomJjHo+PDo4Ozw9Pjk6Ojs4Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PTo9Ozk7Ozw7PDw5Ojw4Ojo6Ojk5OTw/PDxBQkRJSkxLSUtMV29yc3VzdXh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjG9PPj5CREVFQkFAQj9AQkFAPj0+PkA/Pz9APz89PT9CP0FBP0A/PUBAQD4/QT0+PDs6Ozk5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fX17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVCQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uKiouJjGM+REZKTEpKRkdIRUZHR0VCQUBDRUNDQUJDQj9AREhEQ0VDRUVBRkVGREVGREBCPjxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMi4qKh1ZITU1OTE9KSktJSUpKSUVDREZHRkRDRUZEQkhJS0hIR0ZIR0VKSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQUJCQTk4PD47PDs+QD9BPkJCR0dKWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2Mi4qMf1BOUE9NT0xKTEpJSUhKRkRGSEhJRUVIRkZFTExNSUpHRkhJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozw9Oj5APj9AQ0ZJSlFfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyLi4qNck5TUU9OTUxNSkhHRUlJRUpIR0pKSUpHR0dLTE5MTUhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiImMjIuMjIyLi4uLYFRUUk9PTktKSEZCR0pHTEpGS09MS0pKS01MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0ZGSEZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyLi459WVhUVFVUT01LSkRFRktPTk9XVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRkhKRERFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkJHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4xpWVdrYUZUUVFQSTs7UlNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eHp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdGRkU/P0FBRUFDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dtXGVVOllZWFNRP0BWVVlcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3eXl6e3p7fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiot5b3BZW1xbUlRSVlZUW1p1g1lVfZBhXVhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHhIp+Z1lZXFlUVlRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1NTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHxcUVZYVVJVUlFRTE9NS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x9fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3lucVZKTE5PS01LSEpERUlFQz5UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t7fXt9fX1+fX19fn1+f39/f39/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dTEQ/Q0NDQ0I/RFBCQ0BDPUNJR1ZASE5MR11pUEhGTkZERUZJR0hDREhHSEtHREJBREBPUU1SZHJ0dnVzdHV6fHt7e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09PTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5/g4CDg4KAgoCCgYJrTUc/QDs7PkBAPz8+a1BLYUVGSElFQj9HTE5HTVFVSUFFPz88PTw9PT89P0FDQ0A/PD1CPkpOR1VudHR1c3R2eHp8e318fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTkxMUVJRVFZUV1JRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0JCREJcXU97Tk9OTktMTU9PUUxLTVdNSEdAQTw5Nzc1OTk9Ozs7ODk4OT88Qkg/XHN0dXZ1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGRkhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWlhNTFRUU1BRVU9MUlNUV1hUVFhRTFdZWlZYWFZYWV1XWFhoc2tdVmFza2JhX15kYV9eWVRRTk5OTElISkxJSUZDUVBTW1dUVE5RU1lTXGVVT1NTUU5LSUhDP0E5OTk4OTc4ODU3NTc4NTk5R21xdHd4eXt7fH19fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHBubWRdX19ZV09QWFZWU1RWT09UVlhYWVNVVExLVFZVVVVXUFNVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxPUlJPTU1OTk5NSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8+PTo3ODc2NTk5Njc2NjVXcHBzd3l6e3x9fn1+fH19fH19fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xdUlRaVldVVFdUUlhYWVlZUlVPSkdPUE9PTVJKUFBPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEtPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtJRkxNUE1HL0VfUj4zPz5qb2FSUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dXl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEZGSEpNTEVHQ09SQzhFTlNdZ1NQU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVU1MS0k8OTg3Oz5APjw9QUBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hRUmFcUVBST1NPT1BMTE9NTE1MTU9OW1dLTVFPR0lIQ0hKTExKRkZGRT9CQz48Qkc/Qj9BZHBzd3p6e3t8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hERD05Nzc5P0I+Oz9CQEA+QURKRUNHR0lGSUVCQj8+PUNCQUdJRU5PYmVRTU9OV0tMTUtMTU1NTEtPTlNkTkpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p7end0eHV4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dnJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4Ojo/Qj88QEJBQURFR0pGQ0hJR0dIQ0M/Qj8/QEE+REVDTE5SVExKSU1UR0lJSkxKS0xJSkxNT1BSUEtHQ0xHQ0JKSUxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxR0tER0hIR0pLSUpLREdCPT49Ojk6O0FCPz1CQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBDRURJTVBISEtHSEtESElMTUhKTEhJSkxLTV1SSEhETkZBREpKTU1QTUtNSktGR0dKTU5RTkxibWl2dnd6eXx6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo7QENAPkJDRUVJRUlKTEZJSUdGRkRCO0FDQz5AQ0NDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJR0VOSENHTUtNTE9NTU5NS0hISU9SUVJOUmZmZnFvc3h1e3p8bGhqb2VrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUNDQkVAREE+Pz46Ozs9Oj0+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9REVCPkFDQ0NER0hJR01QSkZGR0tOT0tGSElGRURFSUpISklGSFBLRElNS09NT05PUE5KSklMUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRD1CQT5BPTo6PT86PT5AQj5AQkRHSkVJRklIRkZHRUNCQUFGRkNCQkJERUVHR0lGTFFMSU9KSkxMSUdIRUdGRENJSUhLSkdLUk1CTk9NUU5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQUREPEFAQEM8ODk9Pjk/PD9CQEBAREZIRUlGRkhHRkZEQ0VDRElFQ0dFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUlBRUU5QTU5QTUxNU1dWWFdVWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkQ8P0JCRDw3Oj4+Oj46QEI+Pz9CRUZER0RFSEZERURERUZHSkVFSkdDR0hGSEdFQ0ZKSkdNS0xLSEpMRklJS0hFS0tMTE5PUlRQSFNVU1BTT1FNTlFOTVBXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TklIR0lDQUNIRTxARUJFPTk6Pj49PDxBQjw/PkFCRkNFQ0NIRUNFRUZHR0dJRkdLSERISEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9PT1JVVk9LVVdTUVNRUkxPUVBPVFlaWVxaWVteXl5gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QUFGQ0VFRElFRkVHRkhIRkhISUtKRkpISEtIRkZMSUhISkdMTE1MTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9SUlBWW1tdXltcXl9fYWBhZF1jYGVmYGVoamNzc2ZqZ2dscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpKTEpMR0NFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkVGSUZJRkZFSUlHSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUExPUFJUWFZNTlRWVFJSUVBMTlRTUldbXl5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S01MS01HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHREhJR0hKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmhjaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lFQ0lKSklJS0dFS0pHSEpJSUtISkpOTE5LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RFSkVFSk1NS0xMR0dNSUdKS0hLS0lLS05MTkxMTElMTUxbc2JkcF5sbVVNTmZzXWdmcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnF5dmtiYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnZ0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQkZDRkVGRURDSEhHREVLSEdMTU5MTU1GSk5ISktKSUxKSkpLTE1OTk1NSk5NTVtyb29ucHBsa01QUWxXTmlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBdX3JrcWpVdXl4cGNea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFR0tKR01NTktNTkdMTklMS0lKTUlLSUpLT1BPTk1MTk5MXGhkdV1scVdsTlBRbVVaa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkanV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDR0RIR0xIRUNDSEtISEZKTExGTkxMU1JMR0xNSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b250c3ZzSEtISUJFRUVBQD5EREJHREhJTUlGQ0ZKTElHRkpNTEVPSktXUktHS0tKTklJSkxJS0pJSEpNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHR1bnF1bndxcnZ0d3JHR0ZJREVERkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhLSktLSUhJR0tLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVVlbXVhdXFxjZmFhZWJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQ0BESERGR0NJS0xIRkRHS0xIREdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUdISUVGTElKTE9MSVBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R4eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRUxNQkRDQkVJRUdHRktKS0hFRklKS0ZFSEhQSk1NSk1SSUhFQUhGSklLTEpNSkhGRElGREZHRUVKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JiYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDR0hGSEdIS0lJSURHS0tLRUZJSk5LTkxITE5HSEU+R0dMSUtMS0tLSUdESURDREVCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlaUFpfYWFdXmNhYGJiYmNjZVpRWVZVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUdJRkdISEZGSkdIR0lLSUxEREtKTU1MTEhKSkhKRj9HR05LS0tNS0tLSUZHQ0RAREFISUI/SUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFJbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0ZJRkZGSUxKTkZES0tMTkpMSUtKSElGQkhJUU1MS09MSktJR0dFRD9FQ0hIQUJHR0VUXVleWF9ZX1tdVVhYT11dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGFYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhISEhYWFhYSEhYOEhYeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUhGREdNUkhDUUpGSEhIRUZLSk1QRUZJSktOTExJTExISUdESEtRTk1MUExMSktISUNEQUVESEdCQUdFRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdT1lhXGBgX2JjYl1hYldfX1RQT09PV1FcW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlKS05MTExNS0pKR0VKTlFRTk9PTU5MTUhLQURBQ0RGRENCRUZCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU09MUFNSVVpZV1lYWGRXT1NUUFBOTU9UUlpYWFpdXGBhZGVjZ2NrbHBzcnp5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUhGR0RLTV1MR0dYTUhISkhHTUxRUUhMS0tLTk1VTk9LS0tHR0tQU1NOUE9OT05OR0tGYEVEX0xFZmRFTVtJXltybU9NVW1ZTERQYFVrV2dKXVhVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmJiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goGDhISFhYGEhYGDg39+entMSUZHRkhFRUtPU0lKRmBUSElPSklPTVJRS01MTE9SVVJPT0lLTUdITVFbWU9QUE5PT09JSlF/UUl8WVlxdFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVlh/anR1dV9fdl9YYVtbZltfYGFhYV1gYmdtcGxgcHd0eIGBgoODgn99f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExHSUxFUVZMS05JS1JYV1FNT09NUVROT1FQS0tOR01QU1taU1FST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3J7fG9+eG6Acl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKS0dKUE9NTUpOVl5ZVUxRU05ZWk1TU1JOS09IUVJTWVdWUFRQUFBRS0hneGxjeHJtW0tOVnlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f29ob1l2dmp1dXCBYHJmfWlseHxvXl9fYmFbXWNkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3F5e3Nydnl+gXN1em58fXl3cm5OSlN1TkNCRlBQSEpLSUtQT09PTVBaYFpXS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKTHJvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW5tanBhY2Zjb3d4b21wc3l+bnFwant6dHNvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWFVNVVlVZVhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfW3B6e15genNjcm94cWhkfWlyfF5UTGxgdnVraXV7e21+eGt8cFxeX2JbXmJkZGdlZWViWmNjaWtrcnNyd2dsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbWttT0dLS0lKSEhRUExOT0xLUlJST1NSV1JWVFBXW1ZWVFRUYV9QTk1LVFNUUVVWTk5MTU9QSkhRTlBVTEtMU1RTU1RQVlVRUU5RUVhZUk5QVVRYWFhbWlVSU1dbV1hXWk9TVVdYWFJeWVdeVlRQWVJXV1dXWF5bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTU1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PS01WVFFOVVNOT01MUVBLSlJRS1FNS0tQUlVTUVJTU0lITE5PUVJRUVFUVlJYV1xXU1NQUlRVVlNaUU5TUlhWVFlWVFpWVFJVVFRVV1hWXVleYF1cWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0tPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBKTldTUE5VUE5RTkxTUExPVVNOUU5NTlFVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUUFRVWFVVWlVXWlZTUldWVVdbWFpfXFVYXlxeXVtdYGFeW2JiY2dmZWRiWF9hYl1gZ2RmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUExNTFBRTE9UT09TUU9RW1pYV1hbWVhZVlxqZFZYWVpXVlNTT0pOVlRQT1RQUFBOTFFRUFJYVFFRT01PU1ZPV1JUVVVPTk1RU1ZVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFdWVlZZVFhYVlNSWVdWWl5ZXV9eVV5cXmBcW19fX19aYmJkaGdkZGJYYWBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWFpbZHFtaGRfW1lWVVdRTE1WU01OUk9RUk9MUFNSVVpVU1BQTVFYV1JXU1NTWE1PT1FUWFZVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaWFdcXlpeX2BVYVxhYV1gYl9dYF1jYGNnaGRmYFljYGFfX2VkX2BjW1pcW1xZWllYV1xZXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUk9VVFNQV1xcXFheXF5WXF5qcXd5gGNcW1VVWFFNT1ZTTlFRUFJUUktRVFRZWldVT1JPU1hXVFNVUlJaT1BTUlZbVlZXU1ZaWF1eW1teVlNOVFVWXFxWUlRWVlhZU1RZXFVTU11YWl1eXGBgYFZhW2NiXWFjX1xiYWJfY2ZpZGZeW2RgYWBhY2RfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdcVFdXUU5SWlNSUVRSVFVUS1JWVltaWlNPU1FWVlZUT1dSU1pSVFRUWF1XWFhTWFxYXl1ZWl1UVU5WV1deW1hSVVVZWVlVV1lcVVRXXlldXWBdYmJeWV9bZWFfZGReXmNjYV5lZmlkZl1dZGFgYGFiZGBiXlhaX1tcW1hYWFdXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBbVFVWVlRUVF5eYF5eYlxgVV1eYmt5dGx9a1pVWVVRUVNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllZWV9bWlRVVlpZWldYWlxWVVpeXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUVxVVllXV1VYX19hYWBjXV9UXV9iZWV1gXpoWFlZU1VTVlxYV1dWVlddWE9VXVpeXVxUUldTV1ZVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVlUWVpaYVlcVldYW1pbWVlaW1hWXV9gX2NiYWRkXWJcYGZhZGZkXl9kYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWVZTXFRWV1lWVlxgYWJjYWNeX1ZbYGRhX3p1b2hZXFpVV1RXW1pZXFlYWWBXUFZeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19ZXV5ZXlVTWVdZWV1iWl5WV1tcW1xbW1pbWVlfX2BgZGNjZGViZFlhZmNmZmVeYWJgY15iY2lkY2dfZ15hYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TT1ZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXltdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZZUFdWV1dXVlNVVFhcXF5gYF1gXFdhXlteXFteWFZYWFtbX2BcX1hZXFxdXl5cW11YW2BhXmBlY2RlZWZiWGNlZGhnZF5jYGBlY11laWRlaV9mXWNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1pYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXV5ZWFVXW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmVjZWZlZmJaZGZmaWdjX2NeYWZkWmlpY2ZpY2VeYmJjYWBgX11dWlhcWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lXXVtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1tdX11gX11bYGRdXFhaYmVjYVJcWk9YWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXllZVFhdXl9gX2BcW15eYGJjXVxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxjZ2BcaWliaGllZGBiYWNhX2BfXV1cWVxZWFdYWVhXXFpaV1dYT1haXWFjZmZya39KWVdcWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmNiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dXFpbW2NgYmJjYGJkYWBjXmBcXl5eWlhWW19eXWFhYF5bYGFiZWNfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgW2VnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcW1tWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFg4KCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7fHx8fHx8fHp7e3t7enp6e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJioJFPj8/Pz87m8O+v76+waKKjIyMjI2Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyNgzoyMzMzMy6h0szMzMzPqo2QkJCQkot/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHl4eHh4d3d3d3d3d3h5eXl6eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8dnV1dXV1dX6DgoKCgoKAfHx9fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnV1eXZ2dnp7eHt4d3Z3end5eXp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t8fHx8fHx8enl5eXl5enp8e3t8fHt8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3h9eXt7eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYGCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3t5eXt4fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3e3l6e3d8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6end7eXp8eXx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHp5eXp5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhYODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIWFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIKDhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW1tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKCgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93cHBvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJycnNzcnJxcHJ1cHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXJ3dHFycnFuiYZucHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBycIWTcnFxb3uefm5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxd6OQcHFxlZ99b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXJznKiBb3uinn5wcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGUq5twg6OffnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4d3h4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3NzcpOxqouVpp17c3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh4eHh8qa+jsa2vn3x7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58fHx8e4+rmaG0pJ+piHp7enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19maGVo6+fnKOafn9/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYGZm4mYsKGdnZ2DgIGAf39/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBf5eknZSjm5mRnYh7fX5+gH5+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn9/gH6GqK+mnpmdn6appo+FgX9/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOChYaNmquvoJujnZ+eoqSqq6WflIeBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIOGjJ+rqaCZmaKdnp6fnZ6hoJqQhoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KCho+SlJWXnJyen56ZmJONiIaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5ORj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgIOIkJWUkJedmpGKhoeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4KDjJuHkJSKhIKDhYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgoGBiIeNg4KDgoGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgH9/iZGAgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf4CMlYKCgYKEgoGBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSEg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGQjIOBf359fH2MnI6AgoGBgoKFlJSMgYKBgoODgoKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX19e4GYjICDgYGBgI+UjJCBgoGCgoKBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBlZ+Kfn6AfYeLfoSEg4SCg4OCjomFjIKCg4KCgoKDg4OCg4ODgoKCg4ODgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn9+fX2AgoSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIuIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoWFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWEhYaGhoWFhYaGh4eGhoWGhYWGh4eHiIaHh4aGhoeGh4aGh4eHhoaFhIOEhYWGhYWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGh4WEg4SFhoaFhYWGhoaHh4WGh4aHhoeHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoeIioqJiYmIiYmJiYqLioiIiImJi4uKioiHh4iIiYeHiIiHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICFhIKCgoKCgoKAf359fX19fn58e3yDh4mLi4qKiYiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIhoaHhIOChIiIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYeHhoiHh4mJg4OEg4WEhIWFh4iIhoWDg4KDhYeGh4aGhIKCg4SCg4SEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aCgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDiIiGhIOCgoOEhoWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKBgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42QjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSEhYWGh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+Bg4ODg4OCgoB9fX+AgIF/fX5+fXx9fXt6eoGQhISCgYGAgYCCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICAgIGBgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KDg4KDgoOCfn1+f4CAgYB+fX19fX59fHp5fIOCgoF/f39/fn+AgH59gH9+gICBf4CAgX9/gIGBfn19f4CBgH9+gICAgICAgIB/gIKAgIKBgYOBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Ag4OCgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAgH9/f35+fX9/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/f35/gIF/gH5/f3+Af35/gH+FkpKPjo+Mi4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4CAf39+f39+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9/gIB+fYB/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl4fYGAgIGBgYCAgH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fX17enp5eXl6gYKCgoWDgYKDgYCCgIKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKGhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eHh9g4OEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgIGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1/gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4ODg4KDg4KCgoKDg4KCkZCLiImHiYeGhoSGhoWEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5eXyBgX6IloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WEg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgICAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6ent8f4GDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhYWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIB6eXp7fHl5fX1/gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OFhYWFg4ODhIKBgoOCg4OCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXx+fn5/fn59fX18f4GAfYaPgX19gn5/foCCfHyAf4KAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIyOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt6enyCgIF/f4F9f35/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDg4CBgX6Afn+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fn+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoWDgICAfX59fn9+jISBh359fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+gH5/foSSjY2Mj42MioaEhYSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp+fnx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHp7en1/gICDg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4J/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8foCCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEg4GCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fHx9fHx9fH1+e3x7fHx8fH18fXx9fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKPjImKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8fHx8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gIF/fnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX19fX18fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mMkZCOioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn59fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp6eHl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf4CAgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foKRhISDgX9+fXyNh319fn19fH5+fH19fH19fn59fn98fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIj46Li4eFhISEgoGCgoKCgYGBgYKCgoGCgoGCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH58fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImOi4yIhYWFhISCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgYCAgYOBf4CBhIF+foB/fn6Afn1+foCBf4F/f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8e3x7e3t8e3x8fX18iouJiIaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KCg4OEg4WGg4KBf3+Ag4GAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgICAgH9+fH19fX1+fn6CfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn5/gH1+gH19fX6Af3+BgIGBgICAgYF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhYOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B/gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SEg4GAf4B/gIF+fX1+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn5+fX9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhISCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX9/gH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Bg4KDgH9/gYGAgoGBgYCAgYCAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYSChISFhISDgYOCgYOBf4CBfn+AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICBgYCAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICBf3+BgoGAf35/gX5/gIKCgIGDgoSEhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX18foCAgH9/f398gH9/gYCBgIB/fIB/fn9+gH99fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAgICAgHyAfoCAf4GAgH99gX9+f39/fn19foCBgoF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4ODg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYCAgICAfH9/gH5/gYB/f36Bf35/f359fXx/gICAgH5/fn5/fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIGAgIGAfn9+f399fH59gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f36AgIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgIKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eoGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYGBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gH+AgH+Af4CAgH9+fYB/fn9/gH+Af4CAf4CBgYCAgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH18fHx4eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCg4KBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYGBgH+AgH+Ah35+fHt9fHt9f3h3dnl5ent9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgYGBgIB/gYGBgYCDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99e31/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGEgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4KDhIGEg4GDgIGDgoKCgoKBgoB/gYCAgoGCgYGCgoGAgYGBgoKCg4B+gYOBf4CBhISBg3+CgoGDgYKCgYODg4SAgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKBgn+BgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODhIODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe32Bfnx5fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgIKCg4SCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ/g4GChISChIOEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fX99f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH1+fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChISDg4KAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX59fn19fn5/f4B8fYCBgoKDg4WDhIOGhIGCiIeFhIOChISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4OCgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn9+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhYSEhYSFhISDhIOBgoKDg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXqEf39/foSEgoOCgoGDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGEfoODfYF9fn99foKDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX5/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFg4WEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/f3p+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYKAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH18f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEg4WEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXiFg4SEg4KBfn9+e3x7fnt8fH1/f318f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhoSGhoSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaHhYSEhYWDhIeGg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIOEh4OEgYKEhYOBgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX99fHx8fn18fX18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIeIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn9+fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoSEh4iHh4eFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WFhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gH1/fH19fn17fn18fXl6enl7fH16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhYaGhYWGgoODhYCAgYCAg4CDgHyBgH5+goB9gH+CfYB8fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB/f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaFhoaDhIOGgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9fn+CfH1/fn5+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYODg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB+fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTU1NPT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX2NnY2NjY2NjY2NnZ2dnY19fX19fX19fW1tbW1tfa29ra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4t6mnp6enp6enp6enp6emsb69vb29vb29vLy8vL20i4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6Ojo6CGhISEhISEhISEhISEgpWsqqqqqqqqqqmpqamsm1RTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/OzxCQDg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWiiYeHh4eHh4eHh4eHh4WXraurq6urq6urqqqqrZ1ZWFhXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw8Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqampp5COjo6Ojo2NjY2NjY2LnLGvr6+vr6+vr6+vr7GhY2JiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Ozs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLQ0NDQ0M/Pz8/Pz8/PztDT0tLS0tLS0tLS0tPT0czNzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7R1M/P0NTSz8/P09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tbW1tbW1tbX1tbY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Tu53P0ciUp9LRx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StZWbtNGarJyw0ZmsmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/P0Z+gqq/Nk4icnsSShp2czc/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OTY/Qj9COjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9HFh5qx173JmJjFvMmXmcXQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P1qeZsdXSlJafztGSmaHP0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PT05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9WlmbHZsJ/Dm9qto7+e1dHQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDWpZmy1s2Kkp7Hy4iVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDQ1aWas9bN26WZs9Dbo5m11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GP0hIR0VAPDw+Pjw9PTw3NTY5OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT0NammrTNjqeaoK2Qp5ieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEM7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhx9LXpZu0vKOlqKCvp6KpndDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPR1LWCxNWdko261ZqSjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PD9HRUdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHRw9TT07nH1dPTucjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE9Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tTS0tLV1NPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjY5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6iop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT02Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6enn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainpyfoaCYkpGPlJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWmp6alo6CgoaGfmZKVpJqamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpaSlpaWkpKOioaGdnJqWqaqdm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKmpKOkpKSioaGem5qZqn1+nJmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgsbWkoKKhoJ6cm5qaopdQg5ybnJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgoaeSsaKfn56cmZmam6piTIednZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgoJ+qgX2uoqCem5mamqeMTlOKn56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6eopdZia2enJmbnJ2ralVVip6dnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cm52ibWOeoJmZnJ2hmmlgWIygnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZmbonNpf6KYm5yco4tqX1iGoJycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJycmZiZmal1cGqLl5ydnZt8aF9ch6Gdnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmYmZije2xrb4ecnJ6UcGVbX4qhnp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZn4mLknR+nKCjkXhlVWCQoZ+gn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmqCmnI1siLGnpHiKhmNhl5ybnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampaloIh4W2unlpZbdIF8dpSSjZKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZCSqI9rVFBynIqLTl10eICIh4KNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoN/k6h6Oy88eI96eUc6U291gYCCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+f56ZT09UP3uEbmZOOzVQcHp+hY6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgYCkdVOBeFB8lYl5Umh8Ulx1hIqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GNn2GN1sBfpq+kpnBxin9WaIaLiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuio5Flv9Ctldu3psCxVF53aVWEkIuYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqrKBc7OvndHFopisrXFqxYdQe5+ipJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6isjX6ThIrIzrCzqpJ0Rq6xW3CdqaegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZGNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKimmp2kpaOipaGMg2+YsaOenIeBdGN6jHVtlKSioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqCjp6GmrqamnKidgWtRjJKAfoJ2dG9wc3R+gJCjoaGfnp2go5qWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKurKupg3BfSG91bnF2a2llaGZncXZ+ipahpKWfoKKZlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e1s7a6vbuvlGpjV0hca2ZqcWdjY2VaWmFia3V6foiUnaOmnJ2gmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyt77FzdDHwLWmk3deXVNHXHRranFlYGNpWlheWV5lbnBxdHiFmKaup6WYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1vNDc4NnKu6+gkXljXF5TQV9sanF3Z2JeZ15VXFxbW15lZGJjbomyycK5oaeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxMDO19jOuqOPfG9dVlhYTD1eYmh0cm1iYWZbV1dYWFZYWF1xkrDFy7q4t6mvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca6xMDHz9LHpoVdT0tPU0w9VldoYmBxaGFfWFpXWFZUXoexxL2ztLaqtbKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnVycnVxZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8PDxsbBtp3Hs4xcU1ZQQ1ZTXGFmcGVYW1peWFlnkK+/uramqampqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGw8TEubS/ubvKrnldUE5XfHSQl5ZVVFhXWWGBsLepq7K0rK6lpaOnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7d25raWh2WmZyeHN5ZmZeZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxb63vcPDsn1WTHB3l6WdTlFTW3Sgtbeyray4tbOsqaOhramsp62frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF5qb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHv8THw8fIsIBgWJGmkkhMbZezwry+uby6vLq8rK2mqbu6ube/srW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmlqanRueWxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcXFxcLFxc3Qx5OLqItFbbnFyc3GxcHEx8G8vrSxsLDCvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BrandsaWZ1b3RjXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcHBwMHFxsnOsYxeacTQx8vPxba/v8DAuru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZmNrZGJrbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28wcG/wMmTP5TSzMXI0cGvvb24ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZWJhY2NkamNnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMnOwbu/wLy7xL26wMS/vby4u8DFq0iVzMTAwMm/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2plal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HUjbq/u8O1use3trm7vLi5tbrDyalMj8m/v7vBvrnGvcK/vMW4tre0uLa2u7u4trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZnBqZWxoWFlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxHiqy73Ht7m4rba0t7mztbK6xcmcTYTKv7++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnFncWt0ZmJuYFxUSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1651grzIz8LAuK61tbu9t7mxvsPHkVR/zcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxqbnVveGNoYlxjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydKZcnSu0dHMysS1ur/EyL6+tL7Av39hdsvGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRsbG5fY19hYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrBhnN0pszMy83KxsLDy87BvLi8urB4cWm7yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFjW19gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vaw762vsC+vrqmnKqytsPApXl3epzExsvIwcPAwMnKwb+7ubKiin91rsjFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLdtrc69trnAvKp9bmhubXKBlph0eH2Zvb/GwLnAvL7FxL29uLGuoJ+Mjp3KwsO8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3FvalxgYFpTUEFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2ydYGzvba1waSGaVpeYE1SW1tvdHiDori4wrqzu7e7vb+6u7uuoqKml5+AvsTDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dndvcWFfZl1bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJpoR4iqCvtZxqZmdWWWBJSU1QVG14iKewt765srWyvLm8trm+tZWltaWtdq3JxMC9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqmIfHaMoZhfU0NYVUdhalZPRUphjqKtr7a6tbSyrLy5uLW4wb2LnrmrrnWmy8K/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c25jXmdZXV1TT05BPkpCQEpKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+0kIJ5iJBuTks/ZFlCTneAlGlNQV2DsLWztbK0r6y7uri2ub/GdoewpJxmqb+4tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWpsXVxrVV5cUE5IREdNQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR8WEZBT4dZSkpYd42BYkBTo7mztLKwsa2wubi2u7e7vJGjs62kdKywqautq6OooZ2dnpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlodXRuZVVhZFddUk9NSUBJUkROQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmJmUaE0/UnhxUElJS2icgFpFUq67sayzr66srba2srS1rqmnn5qbnZ+mqJ6gqKmfoaeWm5aXjp2Uj5CWjZebpKigoKKioaWlnKOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqGIeIN8dn96Y3htbl1RaVVQT0dQTU1DUFFAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqqlvWhEUp2CUVdJSmBKVY1hZGOBrrWqsrSuqquvsLKzraWdkZeTj5egn6KgnKOkn56olJuWloyXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnx/dXZ9bWt7ZGhWUmROSkhHT1NOS05IPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgqsa/yqBQQXOddk9tSktjZnRzYFxgcpCxr66ztaqmrKuim5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6uin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6arqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd5fGV5emBiU1VhSElKS1NUSlNRTTk/QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTGxoxXU0plpFplfW9yW1FrY1tlYV5rj7SwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5ual5mblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgmxmW1NaWk1RS09PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVpcXZ1cGN2dlhXY2BjaFpZV2etrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO2uLO4rbK0pKCdpaCsoaGioaCamJaVn5ubmKWhoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgoB9eHZqeHVdbVtSYUlSVUhGVVdKQ01HPUtJOEU8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgo4BvgnBgY1hMW1JaTEtQWFJITU1HmKyqqaSfn5mSkpSYmJaWloyIi46VnZydnZ6Xnpmmn6CopbGqp66jq662sLWysa62uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5uLyvs7C1wry3vrOztaKsoqmpsqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaW1cWFxDV05KR01IQ0ZOPT5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjnp2KYldeZWBXTVFHPT4/Q0M/PkJReKmtqaqln56foqOdnp2anZuUk5WUnp2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMm/sLm5vbnCvri0u8bEvcO8t7Oqs62qs7Svs66qr6OdrKi2sa2jsKaho7CxrrCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIREpQST9FQjRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBRRkQ7Qz5GPD85Nk5+qrOno6OioJ6lq6ael5yUkZqemZWMioaIhnhtiKCkoqustLy2w72+s7vBw8LFwL/CxsXFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PKycPBx7+6tLq7tbu3sLayqrqyrry4v7u6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hqZVpbRkxNRURUTUVDRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXNqYVdORT5JWXxvYUI9XI6urKCZm5uenpmXl5eSjY+Xl5SPjZCMgoOCd3JxbXCPpq2utLnFu83Hy77BzM3NzMjI0MzMzMfKxcbM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbGxsrIz8DJ0c3HxsjGwrzEwb6/v7a+s62/wMPDx8THxK+/ubK4vcTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl0c2ViZ3JvZl5aWkRPTURFUElEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpydlWpmXVRJREA/SoWepJmDoLKto56cn5qYl5SSlJaRkI+Mh4SEiIaDgIGBgHlxcm9seaS2urm+y8HT0dPIzc7R09HS0NDR0c3Oz9DFzdTV2NHXzcbHyczDxcrPytPX0dfS1dbT1MjMxszNydPNztPNxsnKysLGzMfJyca/w7OzyMXLy8vPx8q/vr+9wcfFzMzJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amRWV1JETkZASVFDPkI9OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZtiVExKREM/Q1Kv0b2yr6acnJygpKGdmpSTlZSJfXhxa2ViaHJwcnuFioB1cG5xc3CFs8O+xdHQ19bV0tbN1NbW1NPR0tPU0s/Sw9DT1tjV1dLLys7Ry8bN0crS1dbZ1tjT1tjN0srP0czP0czT0MDJyMrEzMzMz8/Fx8i2wMvA0s3M0MbKycDEw8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2BlcmNdUlxJS0dBRUlKPjtBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWklAQURBRlF2sa+mmpSXn5yaoKCem5yalYl3aWNhX19fX15fX11hbHVzcHBvbHFxdZLEyMfU1tfX1tPW0NXU2dTUzs/V1NTR0czRzdPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1NbMz8/JzdLLztHAxsPIxs/O0dHSyMzNwMvNxtTPzM/IxMvHx8jMy9TU0dXP0szTwrnFsaWota6nm6irpZ2yqLCzrayTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWJjaW1fVlFgSkpDRUNSTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjq2ZDOD0+RFiCqqifl5WXmZqcn52YnJySfXFlY2JfX2FfXmFgXmFgX2BlbXBwbmtvcnZ3nMzB09XT2NjW2dHS0tfP087L0s3V1NHKz8zT1tLR1s3P1dXRxdHUytDU1dbO09HY19fXy8jOxMnPzMrMwMrAycrOzs/L0M7OzM/PyMzQ0MvOy8PKx8nNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcWkpGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF7SEZCO1eNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYWBeX19eXGJtcm9vc3R1dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NzdTLztLNy9fW0MzR1MvL0NLTys7R1dLV1crAysHGzcLIysPMxMbIy8vPys7N0M7UzMbJz83Jx8vFx8LGyszN0NLH0M/OzszQxcfBuLm9w8O9w7mzsr6xu8PEtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR0xJUFFCO0M+OzY4Ojg6OzU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvcHePmo2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYWBgYGBhYV9fXVtdZ3JycHJzcG1yeaXH08/L0NDT1MnEyMnFxr/Dxc/Ox8XHzcrRyMvOzcbR0tDOzNTKx8rOz8fHz9LL0M/FusS/xsq9w8jJzsXDx8DHzcjEzMrMz8jExNDJxsLGycW/wcfMy8zPwsvMycfL0MXFx7vHw8nJws/Bvby/sMHJx7m8qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChaKqk42Nlo+Fg4ODgX2EhH5zX1teXV5gXmBjZGNfXV1eX2BgX1taXGBscnFub2tsb299udHIycrPy83Eur/Duru6ub3IxsLDwMPIysjIysjBxczGyMrNycTBysnBwcvQxcvIv7nBvMbHvsDGz8vEwMO7ycfJvMnHxcrBvsLLxsXEvsa9vcHDxczFxrzAycPFx9LEwcm/ysrGyMbRw8PGw67Ey8fEyre/vLq0qaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQkdFTERGU0A1NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtmxeeXyfkYqSloZ6gIWFf3V4dXJwX1pbXWBgYmNkZGVkYFxcXl1eXmBbWVpcYm9ybmtpa3Bvc4/HvcnFy8DGwbC2ubGxs7Kxwry8vLq4wMHBxL69ub2/ucTKxcbCvcbAt7vDyb/Bybu2u7rGw7+8ws7Dxr6+tcG9w7u9x7zDurS9xsTCw7fAtra+v7vMw722usi7v77Lw8HGw8bJx8nG0MbCzMeyx8nDzszBxcO/vbK3sLKnqKi5sKWtsKqtrJR6dnhrZWhgaG9kVl5ZSkZKRkhLQUZCRklAOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrOxcnFx8G6xb2srqZgY3WBkouIi4R4f4aGf32De3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5nb3LwcO6wLitsLCmqa2rpri0trSzs7O7tr2xt7C0rrK7wrzBxLy/urSyur7AuMi4tLy2wcK9uL3HwcS7ta+ytbq/tMW4u7Wsub2+wL2xu7awt7qzxry3r7u/tbe1xby/w8bAxMXGx8vFwMbGu8fLwM7Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CZW2dviY6GiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX15cW15bXV5aW1tdX2xwbmlmam1ucnykxr+4uLSvqqunnqGppp6qrLKtqqyptK22sbOprqess7u6tsO5urmwq7S5u7TCua/Asb68u7a8x7nDt62qqLCywLa4vbCxqLGztbu8rK62pq62rruysaq5sK67rry4vMDAvrrDv8bDxcC8xsLIy7jFx8W/x8TDusTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTEtNSkVBQ0BGQTo6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHEz8fNwcLGv8TEw8PKwsnKv8C8wbqztbXDrqqwkltpfpKIjo97eH2JhXp7hIB3bl5dXFxdX2BfX2RjYmNkYmBfXlpbWlpdWlpZWlxlbm9oZmdpa25yga26sLWtpaOmppmfpJ+Zm6SqrqSooquqrKqwo6afqq21trG8uK+3r6iuuLS0vLizvK+4ubWyvMGywa+lqaOrsbKzqL2qq6irra61tKaoraGkr6mypqiorqWot6yxs7e6uruyvL6+vsS/tcHBx8i3vsDFt8XDwLu/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Nw8e5ucvCy767yba9w766yrfBw8G0try2sa+1vK2pq5JjbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmRmZWhrb3KFqaWrpJ2boKOTnKOal5Cgoqmjop+lpqemraCdm6SmrLKvt7ensKyoqrSrtLqxtrautrmysLq6sbekoKSgprGorKm6qqWnp6ins62gqKefnKSmrJ+fp6SgobGtrayytbO0sbW9trvBwLK7vsPBsbm5wrPBvcC1uLy9vrzCx8TDxL/AxKCEeHFsYmZga29gVFlfSE5oT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usC6vbWgnpSdoaa6tquzs7uzxM/Jy8LGuLfHwMy/uMq3u8W4s8W4s7/ArLW8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW11fZGNjZmdnZ2ttboedqJ6UlJmflJmhl5WLnaChppyfn6Sloqeem6Kbn6uwrbG1pKmqqqyspLS4rbewrLO2r7O1r7Cqn56fpKKypaaqua2ipqagqK2rmaCgnpmdn6WamqOcnJ6wqayoqqytrbCzua+4ubqwtry7uquzs7mzvbS3sbG2tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnHuLe/t7LCtLG7u6y5urGin6mrp5iekG1+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9hYWJjY2JhX1xbW1paWVhYV1dXWFhYWl1iZGRmZmZoaWtyjKebkZKSmZWZn5SVj5uhoaiem52lpqKlm6Chmpmvrq2vsqGlo66rqKK1sLKyrKmvs6e6s6a2oaOfnKOhraOiqraro6Omnqamo5aZnZeZm52gmpednJ2craGsqKOkpq2rs7SqtbCyq7O5tK+rr7Kys7izrqmtrrK3sLq2ur3AuLOxlIZ5dWZfZl9bWVZTWlVLW1FMSkVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/s52lo5ilscK1tr2ttLjBzMjGv8W2wcDHzrbAw72zubmyv7axubutsrSvn5qjqqCUmo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanagmpGRjpKUlZ2Vl5OWn52gnJahoaikn5+pnZubq6avsKuco6S4qaCgr6i3q6enrbCkt7Ckt6CjnJmZqqahm625sKOhpJyioJ+TlKGUlpabmZiWl5yVn6meqqSinaOqqrGtqLSsqqets7Clq66zsbCwr6+nqKiyrrG0sLy0uriuo5WCenZlX2FXWVhTUlRLTV5MUExHSExLRT1APj1CPDo3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLrCsb63va6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyaoamVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2NiY2JiY2ZpgJOPkoqPkZKYlpuTlJqfm56Vn5+npqSnqKCdn6agq6+moKKjt6ihoaKps6KlqKWwprGurLWeoZ2WlamhopStsbGfo6Oenpibk4uhlJGTmJiTl5iYl56nm6ihopqkpaWrpKWwp6Wjq6ytpqmur6+rqKqqs6amq6+0sa68trGwr6CSe3hzZWJcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G2vbC7sbesnqWmrLe7vMHFurG5tcTJycDDxsXHtsbEs8G/xau3t722vbq7tbKsraiZmZ+ji4p0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVSVFJVYGFfYGFfYGBiZGl/j4+HjouRj5GakpOVo5mglpygpaGtpqWlpKSjnaqrpZqfpbGqoaGepaqeqKKfrqyqqa2toqKilZeimpyQq6mwnJ+in5+XmJOJnpGNkpOWkJiYk5yho5ykoaKVoKKkpZujq6Wio6ukq62lrrKqpqWmprSmqqits7W0ubqwq6yejHNxcGBbV1ZWUkZQT0haXE9SSlRLU0xFR0pEODs7Pjw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvLG9w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUVldXF1dXl5fX2JkbYqMgY6DjY2Ml5GSkZyaoZyboKipq6isp6mmpJmlr6SVmaWvqaCcmZugnq6anKu0oKamn6OkoZSTm5aWkqmqrZudoKGhm5SQjJmOjJGMko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuwpK64pqOko6ytqairr7S3sr21s6uvmIV1dGlbWFlSVVJFWExRW1hNVU9RTFFSSU5KQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+sy8bFuMHOz8ezxLq3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWVpaWl1cXF1fYGR8iX+IfImNh5CLlY+WmKGfmqCrqqavrKiwpaman62hlZakqKedmJCPmp6vl5mnqpmgnZSloZ+SkZKRk5Woq6WamZmenpaOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpaepqKCwsKaxvaigo6y0qq6nsLSwubXAsa6xq5B+cnRjVlRWTlJKR1ZQUlJMTFhOSkxPUkdNS0FDRkREPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnamnqbKwpLbGtLm6s8rFubrBy9DKsra4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucmpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUk5OTlJXWFpZWVhcXF1han13fHKFi4SOh5WIk5KXmpieqJufq6amrJ6omaCmnJOPn6Oal5eGhZKbpJCVo52WlpaIopubk4yOipCapaeclZWXm5GSh5SOi4GMjYCQi5KSkqGaoKKWlJiYlaKmmo2ZpKepp6GgtLKos7ihnKO3rKmtpLOyprW7taussaOKenNuXk5RUU1PRE5OTlBLRk5OSkpOTlFJTUpBSExISEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqakt7Glp6SqpaCppqSzqqKyw7W1srPGxra6w8rMxrOsub20uMCvrqmwnqauu6+toJqbnpWViHyEbl9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhaXWFub3NtgYV/hX6Pgo2Jk5CSnaGOmpyjoqSYpZainJWNiJmajHONg36Ol5aGkpqQlI6Oe5mPnYyCiYCKmKCjnpCTmJaFjoOUfn50io56kIiTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5imuKalsKGxrpyxvKqpr6qZg3h0ZFZNUlBQTUNTTkxQTUJQUUhJTlNNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6WlpqamsqemtMG4r7SwycS3ucHOxr6zrLrBrK3EraiippKdpreto6CQlpeSkH54f2ZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5UU1NUVVVXWVtdaWlvanyCenJNV3GOgZaFjJyXi5ORn5idlZSWlI+WioCUiV87Vm98jJSKgIySjJCGhnOLhZeBeYF7hpSdlYOVjpGQg4Z9k3hxcIaNfYmBkI6Ql5qZk4uQipyIn5iIiJaemqGgl6euqa2oqJ6WrbOipq6ZrKyYqLSjqa2jk390bmBbTlNSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqaCmqaejqrCop7TBubC1sMfCt7O9z7+5r661wqeqxKqinZiDlJyxo5qYh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSUZITlFRTU9SVFZYWmBrbGZ4f3JPQT9/lZGQfIiUjISKjZuOlpWJkoiGlYd5iX9gSlFueIuShH6EjYuFgH9tf3+Ud3V2eISNmnBRjYiKhnx+eJR2aHeGiH6KiJWLjpGTl4yEioiUhJuNg4SSm5aenZSkoqippaSem7CqoaSkkqaqlqKqnKGmqIl2bmdeXEhRUVNNSVVNU0lMS09JSEZKTkxNVEtRUU9HSkQ9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa6hp6ilp6ivrKq2vLa4t7PBu7aouci4tqiotbaqsrynnpWNf4mUqZaVi3+Og4J+eHFvWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZTlFTVFZaboJxdHxoZ1tTj4mUiHN+hoF8hYyTgpKZi497ho+AdoB4c291cXSOjoF6foqrhXp6aHZ7jnBybXiBi42SeHuAe4B3c3OSeGd1hYSEhXyVioiKjYuAf4SLjYCUhHyAj5iUnJaRn52pnp+hnaCppZ6dmI2npJOgn5aen6SBc2liXV1KV1BSR0tYUk9KTUxSSkpKTFBITFFMUlRNRklCPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX92hnd8dm9vallLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt3ZXWLlZiNjnxneIB2eH+JkH2EmJKAcYePfHd7b2t+rX10kIt/eoaSgHx/dGZ2fIZsb2hzfIqNh4BteXF9cW12j3FocYF+jnBEi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnZqdnqGclo2LpZuOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlJPSE5QTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5adpamkoZiZj4WSeYmPi4t2cXxtdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcWuHpqrAfnR4Ynt3bnt5iJB5fIuGb22Mknl0eWpqgIJxlpGMgX2Vf0mSmW5od36CbWpkbHmFkJKGa3JsfG5yfIZpbXB/c42JhYZ7fn97d3B0dIaCeYF5cHyOi4qTg5aXmJqQk5aWmZedloyDiZ+Si5KNhpCXgG9qb29vWVZYVFJRWU9SVFRSWFVNTkhNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJufpK2voq2qqLWvrqy0v6u8w7+lopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SVlpRWVxfp4dhmWhyeWR+b2x/eouJdoKIhnRsmpJ0dHxqap2OTXmFk4mEjmYxdodzbH5+g3RmZXV/hISFgGZpbHVrcIB8aHFxfG6TjY97dH59cXFudW2Cf3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSWlhZWVtNUFVWWVhOSUhFSkpIR0NAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpCZlqOorZ6xnqe6r6uysMKxu8PHmpaPlJmLjoV6hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RxZ19URklDPjw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVMQUlRSWKvsp9xendrfGxxgoGFgXqEhoZ5cqCVdHiAc3WUhzVxnaidjqGhhKKFdnCHfId8c4utjYmBaGdiam5ybXCDdWlvWHVwjpuRdm1/e31tcm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jntzcXFtYFtdXlxaWWFfUk5bWlhXS0hKRklHP0NBQkc/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlZGdpKeer5WltKmusK7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dHh4bXdud2RqXklQRz0/NzQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUVNES4Z1f3x7dX5sdoiIfH2Eg3+MfnWimnp+hoGEmYSanGGGqp+dioOQjnp3iX6JiI5zipePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1ZmdgW1teU1xnXldQVFhbVUdKSkVLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydn6aRoKqgsaivwLK7xbqWjpGUh3uGdmt/jJGCfYqDjox4g4BzoISKfHyBf3CBfXpodmxSWExARTIxMTM2NjY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUUxLVF1ZUktog4h7iXl7cXyPjHp8iYd+l4d2oZqIh4+SlKWNralIhq6vrouBgJOKgouChJKph4CYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGSGyAd3J5dmhta192fYKIf4eEi3mUnJuJi4iRf3p1inZ8eG1vd36AdXVzbVxeXltjY1hnZlxUUFBXWVBETEtGT0lDRkNDQEBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeRjpaXkpagnqygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz84NC5dlnBzo1VGSUtNTVBXYFhwWVxeaYyThpSAhIGFkZJ+hYiRgJqVgqGhmJWbmqatk5m7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnX93hYWLkIeQaWhwhIF0jIeEinKGgneHf3t2hHxudnVmf5SOh4iIh4iHoKqilomOl396gYh6eXBna3h/e391bGVeW1teal5iZ2BaT0xOV1JRSVBKRE5HQ0pEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3g3p/jH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koaSlX+KgJKbjoOAgYyKgomNg3+KgG1wal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJTUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSElMTEtOVmBjf2ZnbXSbmo6ZkpKKjY6ZiJKPnYugoJKjqqWkrJOptqKowcKux694upSafI2hnpmEk4WCjqGflJmRhYqFj5mRlmxwdYqMgpaMjY53j4RxbYWBipaRg4WIcYiglYaSiY2PlqS0qZuMlKKDh5KDfX9ramp8gYKDdWNeZGBbZ2xdbGxeV0tITlJRTUxMRklQQ0RNRkJDRUZCPTk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImGkIeFiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw3NTI8P1I1SEhITExNTlJebop8c4F9n5ybp6WhmaGXopScnqieqKufqKypqraXq7+rtsjIt8jQz76boHBpq6mfhJOShZygmpuZppKRiJWim5t4en6UmJOik5eXgZSee3eVkquyiY2Xn3yUnZuNkpWYo6Gmta+ckJioh5aPjYCIbHNzfYF9c2lgXmJgYmhkYGdmXFJFSktQT0lJTEZGTUNITEZHQ0JHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG18YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6MfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMC8vLy4uMDAxNT5BQU1RUlRRUlNUUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lKTk9RWW2Fj3eUiqKmqbS8uKStrKymqLSrsLaysa27sbO+nLPDq7rJy7fDv7ilorCzrK2qo4uWmIWmpqCjl4GmmY2iq6iliIWUpKGgq6GkqI+csYuVo6a3upugorCSop2inZCjoauvrLK1opSkqoiZiJKJlXl6foaAaWJpXWZjXmRkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpb1h6hXaBk4WIgpuDkpCMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOEgYuFhoiShoKEiYeIh4dxbmFARTY0PDMvMTEwLSwrLTEuLTQ/Q0FNVVFSU1VVVlVOW1BHSEU8Pj5GSENFQTc7PDVDOz1GS0lHSFFPUFeBkp+EraOyqbHAxsKqs8W2q7O/s7i+tr+0wba7uqO4xai2yce1vrm0qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6prra7srqssLWisauxtbu3ta60oKeoo6eaqa+ssrm3uKabtqmMpI6Rk5+GeIGFd1pjZVdnY2JkYGFnYFtUSkRETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmNXeXVwgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhIGOf4GJj4eAhoiFioeRenhuXVZARU48Njo1NkFCNzY0Ly82Q0hCUVxQUVVXVVxWUF9VSUtLQT8+R0tGRkQ7PkA3RDc/QkpKRUZWU1Bej6Sto7G0wrW3wcvItbvEvbOzwLa4wbW/r7d0sbOlusSksMa5sbOxtKiktbaqsaCil5uikqWwrqatq6ekmKCstLuiqLK6tby/zL/Fxb29s8G3ube+t7q3uayssKWwqa29sLy6wsGrmLmnlK2Ol5eqiH6DfmxYZGJZa2ZqZldcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqb36OhICNhG56c3iHYrmhmaOJlJSWkpSTjY+WkoeGe4aBjZWKgISBinp8i4eGfYqCgYuElX13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUlJZWFpnWVRgYExTUEVBP0lKSEVFQUBEPEU2Qj5IR0pMU1pUXZOuuLS6uMi/ub3JzLu7wLu3tbu6tr20urHGYHWypLGanqu9qaWoq6qkorK1oKuonpWWn5mfrqWnpqWfpJOip7G0p7KyvbbBvtPJydPGw8XMwsrDwL69vru8t7SvuLe2w7nFvcLHr565qaGrjqSotYiBgXNgY2NfWGNgamdSWGBWUlVJRUVOS0A+R0Q9S0E9QkA9Rj47SEE3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj4yEj3NscnJzh9XAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWin6Df4N4e4uDh3yLeYGKgpd+dH16a2ZwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RVWVVKREJLS0hGSEhISEJJOkQ/SEtUVFZcWluSucC4vbbFv7q4ycq6trm1t7myt7Wzrra2mGR1qJytcF6irJyYoKKbpJ6qpZSfoJCTjpaZl6eepqCempmDpJ6spaqwrbiwvbnU0c/W0MrM0szPzsrGv77Cyr3BvMHAxMTFyr7IzrOku7C0r5qruLuYf3ttXmFdWl9iWmRjUFtgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/Mzc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5aRkJRubG90dYezq6Chn4uZnJmMjJWRm5KFiop+iIeMkIuJfIGDc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlnamloYGZpaWxabXOWraS8iIZnW29oXVpaVEhLTk9KS1BLU1FITEFKRkpPX15iZ2lhl7fHsLiyur21scTGta+4sLC7q7Kxp6u3q4y2p52ap5pOmp2Mjp+WkaaYpZWKk5OIkImPkZGdm6GXmpWWh56ap5usr6iwqLS01NXV1tPM0NPVzdPPzcXCydC+ycnKydHHzM3C0NG3r8O8xLmltbrCooNwZV5eX1lhWFpmWlFdWE9QQkJIRUJIO0FDPkFHPz9BNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCaHFveXmDoKmeppeMmpuXi42VkZqOfYmLhI2KiouQh3yEgnB/h4GGe4dyg5KLjn1xeHVscXh+cXpueHNsaYFwbWNqbXB4aXd8fsu/wd+nbWN4bmNbYWBKUFJVTlleUF1cTlBOVFFVVFxubXaCcZatuKy0prC1qqy8v7CrtKakuKarrqCrtKOOsa6al5iMkZORhI6bgY2mkZyJg4uEiomEi4SUlZeXk5uQnJiZmp+eq6ylqKKsrc/S1dLOzNLU1NDU0c7Iw9TRx83S09PXzNHRxdLWxcDOx8fCqL63zp57cGdfZF5YYVNeWlBRVFFPSD5ARkFCRTxAQT5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlp1hoWKd2x3b31+f6GenqGMjJiTk4uMko+WhHmFj5CNiomHkYZ+gXtyfn+Bh3qEdYWTkIh/b3Zya3N9e3Z7c4F4cmqAc3Jpb3F6eXF6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1lkalRYXF1gZF5jd3p+i4GYqaOkoZ+gqKWqsLiqpbOjoa2io62hp7GfiKaak5KRiZGOiIGTiWqUooyZhIGGfpGDg5OXrYuVjZSajoaTkZ6Xp7ChoaGlpKnIzc/IwszR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuMdHBlYmFZVVpUXFBLR0lKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCclJ2UhYuViY+KiI2Hjn94g5OYioyIiIuIfoJ4c3t9g4d3f3qGkZV/g253cG11f3Z4fXSFfHlsh3Z0bn12hHR4e521jDtBi8Wlfox8aWVXSUNmY2VjZ2pjbndbXmZoa25pboCDiJCLnJ2gnZCXmJ6jo6Wxo6Oyn6GlnaCooKOxnIWekpKSkIqOi4aDj4R+nJuMjYKEhXqUf4KplaOMkYqXkot+mIuakquzmJucqJynvcPGubbGztLQ0tDL0svJ1M7Q1drX19jU2djN2NvOydna0da+y8u1enhwZl5bU1dSW1ZGR0pJRUU9Ojc6QEBCOkZEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHFzhY18l5Cdi3+HkoOJhoWJgYd8eIWWloiOg4eFhnqEeXF6e4OGdXqFjo2ceYtwfG9ven9xe4Fxg4eAbo56dHd9fIJ1fnuGh69zWKnCto2RgnBuYj1eaHJwcXBueHaBZWhvcnV4cXqLho6TkZuVn5WHjJOboJqeqZ6grJuhmpmfpZ6fq5mLmoyQkY2EfYiHg4WLjqCZk4iDh35smXqEmYaIk4yNlIyGfJyJlI+uqpSWmJ+Zp6+2vamtvsfLycnMy8/JxNLK1NfZ19jX1dvX09nb1dDb2tHWyNTLlnt9ampcW1FUVF9IQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD9DR1JqXm1kYmZrdoCIcZGPmoB6gI1+goKBg36De3yEmI2Hi36FhoB2gnlue3uGgXR6kp6NoHaOdYJ0dYF9c4CEb4GQgm+ShHV8gYV6doZ7iLfFpMHJuIGWmo93cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSVj5eRhImPlpmXlqWcl5+WnpOSl6KdmauVkJCJjJGCjIWIiIGGkJGem5mIhYyBhZd6iImfl5CIjYqLgn2hipGLvKCYk5eZnammpq6fqLa/wMC5x8nNzsXNytHW1dXZ1dfb1NfZ2tvX29ra2M7bxoh9e2lrZ2JVWFZWTkxETUI7PT08ODo8Pjg9QDY9P0A9Pz48OTg2N0RBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyJjJJ3dnqKe36Afn98hHp9gpGJhIV6hId6dX10bXx9hn50f5KekZ6DkXyGfniPfniKim6CmoB0mYZ+gYmFfH2Qeo+pjo/Dob2LnKOcfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWJi5CSlI6cmZKUkJaNjJWfnJSglJGNjY+LfpCOjouEiZKWmp6fiYyUkZ2Rgot/pZmIhI2ChYSApYeKi7iYnZGVlqKooZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27l7e3pta2dZYlxUUE9JQ0xBPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1EUlNSWF5VWGZtbW1pgY6KcXN5int6f3x/e4d6fHuLhoJ9dIOFeXJ6c22AfoR+d4WcoZqdlJKAjIh/mIeAnJFuh6iFeqCLfJGNg4iEm32akIqMo6KgkKSun4qQi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5WMh4iMkpOLlJSTjouPioeWm5yPlJaQipKThoCLiJKNioqclpmiooaTnZagiomIjZyQg4iOf4OHhaSGjJCzmJ2SlZehoZ+ZkpydqLK5rKa9wcfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcn93aWhfXllUWFlDQUhDPz4+OjQ5Ojs3Ojs7Mzs7Pz0+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnltYX6Rg29td4t4eX96gXyFe3t2hYR/c3CEgXp1dnZ0hIOFfn+SpqSfpaKWip2QlJeLiqiXc4qxjYSnkoSZk4WZjKKVn5iTiJqeo5Kpr5+RlJCNjoiWjG6Nt4WaxMixm6Glm5yYlpCykWSkzciWj4aHiI+SjY2Sk4mFiomFlpmaj4+Uk4aUl4N/j4uZiI2QqpaXo6OImZ+WmoiOhpaXioSOjYF/iI+kiY2TqJqXk5eZoZmfmZOdm6OztKajvMG+x8XFycjJwsvTzc3UqdLR1tbW2NrU09rOhHWCa2ZgYF9QS1ZcQkJGQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmSDR3WCjn18bX2IeHp+eoGBgn52doCCe2xuin55fHd4fISHi36Lo7OopKuyoZanoKWklpWvooOQuJWSs5mNoaCMpJuvoqSdmJCnl6mZra+kl5SVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinZiFiIiOlYyLk4+HgYaHiJKYlIyKk5OGlJiGg5GQnHSRmbKVlqShiJyak4+KkIqXmomKlo2GfYyYnoqQj5yamZOZmJ+UoJ2Vn5uhsa6jpLe+s8XHxL3Dw7/GzsrJ0qfPzdPR0NbY0s/YvHV8eF9iV2JYUklLT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVtcWUloYTtIhIp6e22Fhnl8hHiAhYB9cHh8fXxvc4x6fYJ7eIWLiYaDkqi8ramyva+lrrOzqaOisKyKmrWdorilla2kl6mtt6ako5+ZqZiqpK+wqZqZm5SVkZigl5m7u63JoWm2t6qwlZieoquSl72jXqmygomKjJSHkXyOjn2Dho2PlJSIh5KWi4+VjYuMl5mSnZq0lpWrnouclJKNkJKLmJqKkp2Pi4mVn6GNlY2XmZ2TnJielaKglJydpa+ooaWzuKvCyMS2u728xcjIwtChxsnNzcTX1tDK06NzfWtfXFVhU1FHRD48Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBmSGFgYnBJQIuJf4Byhod8gYl1goqCfm19fXx+cHeHd42Bh3uNj4yGjJqrw8Cwvca7s7TBvLSsq7O3jKiyra29q5u6pKitubeqpqahoqOjqq+ysaqdnKOYm5iXnqKlpZKjua6owLusrbK5paSnfYiGnK29r4KLi4qQg46DkY56gYeQjY6ciIiPl42KlJeUkJqXnaeasJqRq52Omo+SjpWQj5WXjpGgkIiUm6OslZaPlJyelKCem5igoZSanqenpKKksLOmwcbDsLC7tsXEw7/Np8fDx8O81tDMxMqKdnVkX1xiXU9LQ0xARUY+QT9BPDo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaEZfaWdaXVyTjIyIe4eLhoOMdYaQioFufnuBfnF+gXqVepKUlJiRk5WotMfJwMLMwcO6x7y6r6u5u5eytrqzwK6lwKSrsLy8qq6roqKep6yvtbCqm6CqnKKclp+wtKeLorq6tcG7q6icsqSkqJSEjqnEw6SCi46HiISGlZSMeYOMkY+SoYyMlJGPiJegl5KZlZemoK6cjKqcjpaPkpGVlY6QlZGPoZOGl5+gsp+Um5SgoZmkn5qgnKCUmJ6mpKanpK+tpb/Ewq6pt7XJw762zrLEvsO7s9HJx8G1d3tvX1pebFROSURNS0tJQEE9QkQ8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2XiYuIko+GiXmGk5CBcn97jX53h4GCkHqNoZaompqYu77JyMrC0snKws28wbOtu7+nur++vMS4rMGprLO7vaqwqqSlo6yutK22taCgrp+lopijtLypm6i8waO1tq+rkq+sqquWhpqpp6WRgoyTpJWKgHWJknmFjZGQnqCSjpSLj4yUo5mWm5SUo56pn5GlmoyPj5CVloh9j5WSkqOalaCinLWmkJ+XpaSjpZ+eppielZecpaOoqKKyrai7wMSvpbO3zMC5rsOzu77BuK3CwsK/mXB7Y1tYXlxNTU5KR0RESEJCQUNLOjRESDo7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxJX1hhWmRkV56QnY2Xjp6SiYp/iJ+ShHiFf5V+f5CIipCAlaCZrqejmMO+ycTIxtLNzs3LvMK3sLq9tLzLu8PBtre8rbPAubyur6ihqai2ra6psreanqyip6Gdq7e3qaWvvsSxvbmzp6mzs62ulpWlraigkY6SscWnlY19kZV9h5GYj6qZmJOTjpOVk6Wek52Zk6GioZyYn5iLjI+PnohakJaXkpalmWWYo56zpZailqutq6ecn6eXmJaYlaGkqKeftqypurzDtaa0tcvBuKq2rLO7uK6ouLq8t4RucFxaVldQR0tTTUs/QUhEREhGRjg1Rk07Pjc+QUouMzIwMjVCNTVQV047TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmVjTEallJyVoZeoloyQg4elkoiBh4KbhIOVkJGUjpqin6++rqHHvsbFyMfOzs7Syr67trG6u7y/z7XEvbe5t7KytrO3s6ymnauruKupqK+wl6OupKekpbTBsKuss77CucC5s6e4tLezr5WkrbCupIuTlaGNc8GZfZaZhI6WmYuxlZqalZKSmZmmo5Wgm5aaqZyboaCZioyPlZxgSpacmpSapZdUlrCfr5yfpZSvr62mm6GmlJOZmY6doKeimbSpqrO9vLursLLHwLimrKutsrGjobKytKVzcWdeXFBSTUVRUVBRO0hLSUZHQUM9OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3NiVkZIq5eZn6GorpiQl4eKp5aOiJKFn4iEnJePnqCbo6W1ybSpxrzDxMjLycjMzse+urOuubnAwc21yLvBubW6sa+vsrSno5uqtLSrqaatrJmkrqWlqKy6wKirtra/wcC/uLKyw7C3vaujrrStuaWIm5emm3a+n4SYnI6SmJqLrpahnJuXlJqfoameqKCam6qZoaeel5CNkJ2DbXWTopqVnKKfkK6yo6uVqaqYq6+lpaClqpOSmZyJlZyinpaxpqmrure9s7Kuvrm2oKOnqaWmnJysqamNZmhiYFNMTUdITkpVTD1NRE1JSkFDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FNVkh+ZV5IRqyVnKGfu66YlJ6Lk6qbkZGTiaqNhqGejKOslKSktse9tMG7wsPIycXCzsjCvbmyr7m0wMLKtsaxwby1u6upraywo6OZqrS6pqqnrKqdqK+npKurvryorby0uL7GvLa1uMCwvb+zqbW2q76kj6KXkaGfu56JmqCZl52dj7aeqZylo5ucoZqnpbOim56lnKiqnZiVj5Sbi5aJjKShlJyinqG1r6Wmk7Grmqutn5+lpKqRlpWghJCen5yWqaShobS0urWtqLWysp6co6aal5WZqqGeeGNfYV9MSUdITVFJTURGRkFRS0lBREdBVlJESDxBR1ExO0I3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6SensOsm5ekl5mom5Wamo+qlpWoppWtrJmiqrbFwby/uMHDwcjEv83Gu765srC4tL/DyLW/sLy3urenpKurrKGhm6uqxKKlqaymnquvrKKqqL+4pqy9sLe3xra0ubi+sL7BtrSytK+9o5ajlZKbk62fkKGhpKKjnpC+pKmdqaydnaCbpp+9opijnqKpq6Cdlo2VnpOeh46EjZOepKGdtaymnJayppmwqaCbq5+hjZqVn4SOoZqbkqWkmpirsbWxqqWqraycmKChko6QlaiflGllW2JeUEpIS09MSEVDSUA9T0hAO0dJSFtST0s9SE5VNEJFOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1dNopukm57Fq6Gfq52crZ+Sop6WpaCmqayXtrGjqrO2xcK9wLbAwrzJwr/KyLa4tbWxtLS3wsa3vrG4tbq2oKetqqudnp+lpMGloKmuoKSpra+ipqi9taWxu7e2tcOys7e6vrHDwLi4rrS0tKOcpJSRk6Csn5ihnaioqqKawq2pnaytm5uemKagvaGdpJirq6umoJmNmZ+SnoiOWH+WnqahoLiqppSYtqOesqKhnLCYoI+alJ6Cj6CXlo6io5WQpa6zq6mioqWllZWcmYuPkZOkn4ljZ1xlYU1KS0tPRkVBRks+PUlBOTlKSk5dUVFJPUxWXDhGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMT56goZiew6elorOgnLKnk6qjn6OfrKmsnbuxqay1scjDwcOzwsS+x8S9xMq9sLC2rrG1r8DFtbqxsLq2rZqpsKmpm56moajCrZussZyqoq6wqaSnvbemtrq9r7fDrbOzwr+xxrO6t6u0tq6qoqaVlZSiq6Gfn5mnq6+vr7uypp+pqZmZl5OipLihoaOSrq+rpKWekqGelJ2OkI2UnZqjn6e0p6eNmLSco6+bn5yvkaCUmJSagJKilo+OoKCTi6assKWnop2gnpKSmpSFi5KNnJ+AZGhdaGZLSkxLU0JDQElHOztGPjg5Tk1VXlJTSj5PXl09SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZnJAODxIlndlQTSfpJ+bn8Koo6mxoKO0qZWyq6aipLKsram7sq2wtLTGv8TEtb/EvsrFtsDJwrWrtamxuKzAxbS4rq22uqWZq7Krqpihp5etu7WbqLCbrZ+utLKnqrqzp7mzuLK4wKq4ssK9tMWnvq6tt7Wpp6yhlpaRpaShoZeXpK63rbK1tp+eqKSZlJWTo6C3o6Slla6xsqWppKGempmalZion56Yop+vsqKnjZevmKWrmJufppKdj5WYmoaWoJWMkJ2elIupqaqip6GZnZaMj5mQgYaWiZWfemVqXWxrT1FOTlQ9QkFOQzs6ST83N1FOXV9SVlFBV2BcQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFqVkNXRox5ZkM7pKScoaW/pqiurqCotaqduK+rpKq0t7GwuLewt7i3xb3Dx728xMLHwbnBxsG6qralrbutwcO3uKqtsryjla2wrbKXpqiRqrmqoaewnaufr7Szqqq3tay7q7OyubesuLDBur2/psOqsLauqaqrpp2YmKqhoaCRl6CwrrOrsLmZm6mfmZaSl6agt6mloqKvsbOrsaeroJygn5uepZ2gl52ktLCbn5CUppqgqZuWpKCXmYuWmZSWl52UiZKbmZSOqamnoKOcmJuTh4+Zi36Ml4aPmmxqbWJublhRUVpUQUNFVUA7O0hANzpYUGReUFdXRFleXk5MUk9fTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhtfWhcVjqJe2NDPaifnKGpvKGqr6qisbeopbSyq6Gttb2vs7i8u723tsHDv8nEucXDwMC5xb7BuK+2qKu3sry/v7Spr7K4n5esraiumKipjqe7n6Wts5+rorGws6yqtrO1vK2vsbWssLWxv7rFtqu8r7G3rKyporGlnqSon6OWj5ifsqqzqaqzmZ2nm5qUjaCmpLSup6GsrK2xp7Krsamjm56opJ6UoJmbqbapl5qSkp+ZnqGfkq2gmpmHlpmMnZqdlIuPlpeal6amo6CelpaXlIGQlYV7j5ODjJdnbXNocHNfR1lmVkRDTlhEWjlIQjU+XVFoXE5aXUdbXl1PTVJYZEpLQ11jYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVjE1MT1gVl84KUMzWVVcZ0s1jHpmTECkmp+krLajrKikrq21qa6zuKamsLjGtrC3v8LCtbS6xb7MxbnDwbrAusS4wbmytayqure7ur61q66xt5mYqKurq5ytq4+rvp6rr7Gjqp+xrbKurrWxuLaqra6xp7WvtLq8ybKqtbSxtK+upqCzn5qorKCklZWambGiraClr5ahpJmZko2ipaayqaGmsauqtaSusLSuo5mdraebl52Zmay4opeTkI+YnKGZmJStoJ6VgpSZjp6dmpaRipSTnpqlo6OhmZeTkpZ7jJGFe42Lg4uTbG95b3V8YUZgalpJSFpbPXtKR0U2QWJVaVtNXGFKW1xaUlNTYmFMS0VgYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NYVEtFmpafr6ixqaylo66utam3s7ejrLS3yrq0u7vAv7Wzt8TAzMe8xL23v8DAuMC9sr2uqLq5t7fCt6yusrmVl6eurKeksqqUr7ukrLKypqeisbOwsrG0sLeyqa6rsqa4r7WzxMW2qbW1q7Ctqaeitp+fprGgpJSbmJSwnqebn6mNqaKdm5WXpaWktqeisLOrp7Gnra+1rKSZoayonJydm5SquZyVjo6LmJyimJGYqKOgmIWTl5GenJiXl4iWj5ebqJykoZKWkpCWd4SRhnyGgoSMjW5xeHZ8f11LZWxcSk9kXD9ie0dJOEdnV2ZbTF5iTVhZV1VYVGldUE9IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNya0xERJGZpK2krK2rpqOwsrKqt7C1n6u1usm4rsG8w7ezsbXCw8/EwMK+tL3BwLu/vLTEqKu6sba3v72vrLS0naGnsa2lprGlnrK1rKqysauoqLS5rLSytayzrKqrqKypua2xsMe/uKS5r6mtraanrLClpKOuo6mcnZuar5mioqKjkKyfo6Cfoammpbikq7O0pKqrqKyutq6inaOoqpygmZqSpLSZj4mNh5GjoJaOlZ+ilpWGkJSUnpuZlpWHl5KVmaecoKCNk5KOkXh+joR9fX2HiopydHN/fn5cUmRuXk5aZ11GRJZbRzpObVhiWk1hYk5WVlZXVFloXlFSTGRaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZTs2KkhkSEorOkk/M0NJUyw+j2s/SEmQmqmqoamvpKejs7SwtLWxsKCrrb3Muq7BvMextK60wsPRxMW/wbK+w8K8v7i9xaitt620ubzAsKyyrqGjp66qp6Wxo6uxqq6qsK6urKuyuqe3sbKpsqmqpaWjrbqsqrDCubSsuaipqK2pp7ClqaSirqqoop6coqyVpZ2XnpirnaGnqKGspqKsrLewsaCpop+qrbCrnZ6mp6mao5eYkKComIaDjoqLn6CQjI6XnpKRh4iRlaGdlpiWhpaTk5elnJ2djJKQjYp/f4iEfXeAh4WHdXRyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlPY1xNVVZVV1FcYl9UT09oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5JZ0RGODxCMDVFS1gxQJRdQE1GlZasp6GpsZyoqK+1rLi1rqmkq6u9ybuwvrjDr7CtssTEzs7Dv7+0wcTEusG0ycSsr7ius7nAv7Surqymp6mxqaaosqa0raqwra2xr7Kss7qkuLOsrK2nq5+jnrC3q6qtubaktbWjqaisrKqsoKimp7Gxo6aloaGrlqqhlJugpZ6joqqjrKKeprG3rKyipaKaqaqtqZ2hpaSkmZ+ZlY+YnZOBgpCJhZ2gjYuPjZuQkoyFjpmkm5KRm4uTkZGUo5qbmouPi4t8h4GCgnt1gYSBfnV4i6OHeGteYG5nV2aHZE5AZ5JMRGJ6V2JYUmVVTVZVVVRPXF1iVktOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQklIRJaQr6Siqa+Yqaittaq2sKqkq6mpvMHAuLm0vLWmsq/EysvRv8G7uMDAwrrBusLErrG2srS7wb6zsq+trKyot6qmrbCruK6nsLCusau1qrW2p7W3q6ykqaqco56zs6iopLO0n7Wtoamoq6irpp+rq6i5tqmqqamhqZ+tm5GpoZ2go6Kmoqqdm6a0rqelqaKjl6WmpqmcoqOjn5mYn5GOj5iNfoeMh4WenoiFi4uPkJKNhYeWo5qOjZqRkpCOkp+XmZaNi4R/dIeBf354dYOAenh+gIidj3ByZ2dxeFxhdIhpT12YVkhteVVkVlJiT0xWVFVRT1hbYlZIUGpUVlRHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdSRjuVja+gpamsmaqkra6ytK+qpa+pqbu+u8GxsLmtoravycfI0MC/vbq8w727w8HAv6+ys7K2vbzBsbKzq7OppbWopKyzsrivoq20sa+xuaq4rqqvt6uqnqmroKOhta2poZ6vsqG1qp6op6qjqqGhrK2ova+rrqyhp6efq5mPr6KYoqCopp6nm5ipsKiin6yhoZKhoqKmmJmopZiYmJ2PioeUiHyNhoSFpJaGg4KMh5CPkYWGlKGWiZGdkJOQjZGclJePioaGeHSBf310eHqBe3R0e2qCiKN2aV5lbIF1Z4iLfFJXcF5LeHNUZFNRX01NU1pnTk1XWWVZR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUM0j46xn6SlqqOlo6ymtLOwqaSwp6q4vsG8sKi5qqeusMnGyNDCvcC+ub+/vcm8wrmxsLWyury5wLO0vK25rKO1pqessba4sqanurWttLyvu6WtrbWqrZypr6Sfpayqp5ydqrKktKmaqqeqpKmdoqioqb2rs7CtnamjoK6cmrKilqSbpKSfpJqZp6qlnpqpoZuRm6CknZiWqKmRmZmSkIuCj4V9j4J/iJ6Ph4B+jIiSkJCFgZSblIaTooyTkYuRmpKVh4l+gHJ6eH58aHd8e3Vxcn5phnqEiGRgaGNyhXttZ3ldXlZDWHttVGFQUllLS01wdF1JWltnWkVWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6SsJmfnqmko6GqpLaysaSpsaetucG9trCkuayoqLDDycjMwbe9v7W4wbrItsS2tLO1sr25ur22rrm2v62is6aqq661t7SpnLq7qLG/srqgrrS1qKyerrGjnKWnqaOdnKSvpq+hn6upp6GpnKOooK27p66xrqGqoqOtnp6sppifm6Gim5+amaKqopqao6OVlpOeoZablaWsi56Rj5GMgop/f4+AepqUjIl9f4yHkI+MioaTmJGHlKOJkZGHkJmQk4GIfHlsfXZ5eGJ7enJwcXN4aoJ1aoNnY2hhbnOObWJpcGBvQl15a1ZeTlFRS0lNU1lWTVxebVdFWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPSORl6yYn5emo6Gfp6O3r62ir7Cpq7nCurOtoLmvq6ezusfKyL+3wb6vtL63xLbDsrC6sbLAtru+t6q5uL2qpLSmqKqvrbiwqJi4vKOtvrSzoa63tKamp7CzoJ6kpaehpJmerKionqCqr6egppeiqJ+wuJ+jsa+hq6GtpJumpqmampueopWcm5mdqaaWm56okJeSmJ2TmZahqZCaiY2Ph32HfoKNfHuhjI2IeYSNhYqNjYWJk5qOiZWfiJCVgoyWjZF9hHtzcHxxc3RgeXhqb3BxcGp/c2R6bGhlZGJmh4BgW3JqcU1OgGlYWk1RTEtIUFJRSE1cX29URVlaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrJ+eoaSht6uwo7O0qam6xbayrqC4ra6ssLXFx8C2v8K5sLS9t7+7vrCsvrCzv7K9wrmqu7q4p6i1qKerr6uzr6WYu7akq7q1rp6wuK6ppaevspyhpKCkpKGWm6+moZ+jqK+hoKKTo6Sht7ChprCrn6ujr5ebqqWon5ianaOTmpuZnKWpmZubpJSUl5WcjpOXoqihkImKj4Z6g32DinmOl4qNh3qCiISJjY+Fj5OYjI6WmYqOln6Fl4yPeoB6cHF2bm90X3h3ZW1sbGpqhG9mcmlrZmheZHSBYFtrdmlaSn9eXFhPT0tISFJVRzM5XV5sUUVZVVllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyZFcsMpShoZeUm6qcpKGioLeqrqC7uKWsvcWzsK6jtbCsrK60w8O8s7+6t7Gzubi6uLuvrsCztLmwv8C4rb26taWisqmnqbKqrbGfmb+1pKe1taidsryop6Wpr6yZo6ecpKWUmKGxpZmfo6ipnKKfkqSfo7iopKetpp2loaiSn6iioaGZm5yfkZqblp+hqZuamKCUkJOWmY2Tk6OnpJCJiY6GeYR6hIV8nY2Jiod6gYSHiYmShZaTkouQlZOMjZR7gpeOi3d+e2x0cWxsc2F3dWlpamdnb4ZoaGljZmlpYGpjamhcZntjYFN0VFxbU0xKR0lPU0AhKmheak1EV1VeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKdoqSQjaSmmp2enaO0rKequrenrMTBtrCso7aup66ut7+/vLLBt7Cusra2uLa2rqq9s66ysb2/t668u7Gkn7aqpaWzqKqtnZzAqqelr7KprLW7nqipq7GlmJ6pnaakkZmmraKYnqSpoZuhnJafnae1pq+qrqGhnZ2hlKCmn6GgmpuZm5KYnJOlnKuhl5aclJKMlZeLj5iaqJ+RiImKiHiFdoGCgZ2HioKJfYCFiIeGkISWlJCOkJGQkYySe4OVjoZzfX1meG9ramtmdXNrY2dkZHaBY2VmZmZqamNrc1pfWl1tZGFOaVhaYFZKR0hLTVNYPjlfbGlIQ1VUXVtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOgj4usoZiXoJaks7Gisr22obHGvLqxsaS2rKquqbm8u7qtwLKurq62rrK4s6msubGvrrO2urawuL2spp61qqCfr6Oprpyiv6Cxo66wrrettZ6trq2topqdpqmln5Wap6WfmaWiqJ2an5uUnJ6sr6W6p66ioZqanZmepJqknZeel5uTmJ+SqJWpp5qTmpqRi5WZjZSUmqimjo2KiY57gXSBgYqYhYd8iYmFhYqMipKElJuTko+QkZaOkH+AjI6CcIB+ZnltaGtpZnFya1xoY2N0gWJmZ2pubGdqamhuXWxsdHBhVGNpZGVaSUZMTU9ZUVBWYWWBVUFWU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJGhm42OsJ6ak6GZqbGvn7m/taC0wru9urGmtq+oraW3uLe3rbuurKqrtqqzuK2ms7Wyrqmwtraxs7W6pqmftaidnaihqKyap72YrKOur7W1rKyfsa2vqaKbnKKrqJyUnKaknZqqoqSWmp+ckJukqqqpu5+npKCYmZmdoY9ropaZnHCClZqjf3WRqaeelJSekIiXmYCWiqGQeIaUjINtaX52g3FshouGfYWMh3BeY2FnhJiFa4uPlJJ0d4uEfoOPf2eGgGd1aGVXXGhzbk5QamNnc4VoX2Vmbm1qXWBhio+EhGZOS0Q5R1RnXkpHUFBVVUxIUmFvdGZGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD1HNjAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Lo5mFlbCbm5Kgm6qtqqO9xa+puMK4vbytp7awpaujt7Oys7G5rammrLSmr7Wiqbi2tqinrLayrrSts6Gpn7OqnqGjm6WmmKu5lKWlr7O3ra6lqa2qrKWhnpygp6abl6ClpZubp6edk5+fmJCep6mjta+joqKdlpeXl6OIoI6SmYagh5OcoH+lf6WqnpKRmpGIhHJ4jY6FiKF2iIxpl4hmfXJ4oG+Ih4R+jn1/oaCgmYB8h550h451m4psh4GDbGhlY3pscWFThW1ibGmYcVhqcXCIWV5pW2xsW4hxbnpyhWeGhFpeR04/R19NRVJWVlFRUldVZ15NV0lSUlBGR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoiqaWg5yrnJmYnZ+qqqeqv8Ovsbq9t8C+qqW3sKmspbK0rq+zt6qppbCtpbSznK21trWmp6izsK2yp66dqqCyqJ+iopmhoZqts5OjpKW1vKasp6uqrKiloaCYn6ajmZmlo6SYnKSplpSjnJOTo6SmobejpKCjmJWSl5OciK+Ql5SJqYuWoZuFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2R/wJy/eYSEeZGEfJCQkcpxl7ycxXpytaa7kHuAbJaxq7B4aGtYsa5uZWm8krxuZ3pvco/YflNrY7ayf4FylXSaoaqQV09XYlBWTkZVW1hRUFKNXFdcUEFdRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYymkoCnqp+XnJ2lrLKoscK9srW/tbe+waqns6ysqaeus6mvtrSnp6W0pae4r5yzsrarpaSnsa6usKaqnaeksKOhn52Wmp6crauTnqKfs7qiqqmhra6loZ2amqGnn5ebp6CfmJ6np5Gcp5qUnaGmoaGwop+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJydlJmllHGuoaR+eLt9a6GPdrFfarRbpYBlnJFgZoJ7Zn9qeGupZL5yZ6aMdbFqfLF4dJKTY21tp25bhKBFaGaHlkV1nGB+aHykp4JZX4uraYCVeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TolQV1cvSVRTSkRFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCrKilnaOkqrG3rLW9v7C2xLK3usGmqbCrrqipsK6jsLqvo6StsqOouKies7Owo6Wgqq2vrK+mp5+jorCbopqWlZaamqullZuhnrOzoaucoq2toJ2al6ChqJyYnaOfnJmhpqSPnaKZl6Gfqp6mpp+an6GVlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqJR+a4Gme4KGiJKUknerZ2uxW6t6jYaUdIlyj4aAf4iQl3iCgouYi4Ogj4SwdnefcWtrbHyLTqRYSGJimX5jaKZgeXN2U5KHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj+yeVhYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+ViLOmpqCvqaeyrKq7tsKwu8KtuLa/qqytra2mrbGpoa68qqCntKyjq7WlprKzp6Sinaeqsqiwp6Wen5+ulp+YlJWVl52soJmZpKi0rqGpj6moqpudlZigpKeanpyin5ugo6SjlZuel5mdoqibpZmcnKKglpORk5Odg9WTmblwsMF+xYZ81pSbu3yalaSPjZyNpHuOh6OCpYJ6rHmPnVaveoh+n2q5W7p3h4R9poKTfJh6qXiNnY97sW6OhHSRvIVvlFCvp8WKUaB6Y2CpYnNziG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITm5OXFJPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjtESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcxJZuilJmyqKiltKqltKmkvLfCsLnAsbW0urO1p7GworCypp+ttqiap7mto6+xoLO0sKGknp+nqbCotKikm52dqpaYl5WXlZagqZyZlqetsKiin4+soqiWnZaboaWhmKGhoaGaoaKmm56hnpSZm6afm6eVm5ufoJiQkZSRnYiybmi1cauHbo6mcrRzcrZ7mpeji4+djaN/kaGlfrB2g5HS0nZcrnuFf6Rvm6qma4eFfa19l5mOe7Bykp2OeLNllnSEnm+eZpRSyItawlyfeWJfrWB2dIdil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tgbGhQVUhJOT1WUlpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnZKlsK2jqrytprSmp7a7vLK6v7e2s7m5sqW0s6GxsaKfq7Ckl6a5raSxsJy0uKqgpp2hqaSxqKyppJmbmaielZOXmJKSoaaflpKlqrCmoZWTrZ+lkpOgm6Smn5WapaahmqKfrZmgnp2QlZuhnZyllJ2VmaKelZiVkZuFrHt3qHajjYiGqW+tioKng5iYoImSmoqif5OZia6Ff4KzXHKzUq59goKkf3LYfniGfo+dhpmZdq+GiZGch3e0YZplmoKClGySWrBYS5p1mHlmYK1edneHaJiIa12vd5Wej3hsNXnIrrJfQlRvXmdgRVBtX3BtVlZOLmVkaVNYUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOjk5n56UoLmwlrTCraizqKmyurezuL65t7G0u7WkuLKetKyfnqisn5SntauosbGrrbSkm6mgn6ihtaamqaKZnZSkoZOSm5iRlKKkmpKPpq2vpqCVmamfoo6RoZqopKCVmaWonZyknqycoZ2gjZOemp2gmJmblpehoJOXkKaehql9faV4oY6NgqpwrYuBp4aWn6CJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02YB3iHSogY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTgJF/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFtMdF1iZ01bYV9yc19LVjZKm5RYR0U9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKKempq/q5i0wq6rramltLC3sbW+ubmysLa6qLu0n7CknqSnp56TqrCpr6m1rKqvoZihoKakpLmio6uglpuQoZ+Uk56Zk5een4+Mi6iwr6adlpuopp+MkqOXqKqmlJapp56eoKOto6Geoo2UoZifn5Kel5yVnaGVlo6rnI+ubXK0c6mLdYqnc7R4c7OAkaSjkpyNiaSHkHe4b4x7i6Jqa7ZaoYVll5dpoKKnbpRytHSTmH+yaoWSiK1rdbNhnWaib4eTapdcrV9NoXyHkVJzo2x5f35vmIdxXK9WPJx3ZlRvbi5cp09jU2tlYm1aY11hcHtjVFpRPj5tbzNDQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimm5udu6GbssCurausp7epuK+1wLS7r663tqvAtaipoJulpKGckaqpp7WjsqeuqqCXnKegpKu5naOtm5aZjqSilYydoJuYnJ6RkpSqtrCnmJScrKmXjJOlmaWsopGWqrKjn56mq7CZoaOQmaKWoJuWnJehkpypnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyXioyniHqjtnV9d3bCgpqyYIO6ecB8dbhjtYGMh6l9lYGsqXF7f3S8iKegaZ1hpo6von6MdIeqfb5vc7x0soN1eIGLbpqIcW6NpHS9Xnd9WmF5vGtaVlxqeV5qYWVnYm14b1lbWURBQHNAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5qeoryhl7LDsKyqq6uxp7ivtsSwubCtua6twLGro6Keo6Gbm5Cpo6qypLWmraWelpqqmaasuZ2jrZiUoJCln5KMnKKdmJ2akZWSrrmyrJWXo6enlJCWpJykrJ6QoKirn5ufqKOzn6OljqehlKKanJeVo5ePr6CSlKmehJCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0nsG7vZp7gbGocIBzkbmDfIaGjIeNfIqHjZd8pLu5vZx1erSjdHaXdnSwdZmeZoZqjbV0cnF3toxef3p9iWiDeW55YouscHWFf1hbp2pFZVpUZmBjXmNRaGdxbXVCTlBNRDtaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZWJz47PKeeoKK/pZa0w7Ssq6isq6m6rrDFrrSyrbamtLisqaGhpZ6gnZmTq6Stqqa1p6efm5ago52spL6moaqWk5yQoZqRj6GnoZOcl5OXlLG1t62YnaSkooqSkqWbpaqblqilpZyaoailp6SpoZKtnpajnpeXl52ej6+olJumoY1qfWmbpniHcn2ZjnR5ZId7vb7Aum+Tg3KVh2Fzalpem4lhY4iOlWtggJVjbZ13YpVrgJqVlGVeYGNwmopocot9hZVnan5ydHh9fmJbd3SBaFBcboN9fItrWGx6gnJKSm+GcE50TEVXXWdhTFpYZ2NfT1tudWlyUlBERU47SEk9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz5bTyc/Mj6poKiiwaKbtbq1o6ylrqentbGsyKuvsqq0or2xsaagoqicopuZmaymr6Sktamlm5eVoZumrai+p6illJOblZ+ZkpekqKiQnZGQmJyvsr+sm6eep6KIk5GpmqijmpqsoKOam6OnrKOgq6OasZuUp6CWlJ2fnZewpZehp5mbkJycoqOYpaGZm5mZmY+VgWdtfXF3kpeUkoWLtaqNhpiVjoqMmJaHlJWKhJOUkYmOkpSYk5iWmqChmpyUoJ2NgnqlhmxqfJB8gHWKioFxgnh5dnaKgHyKanOBdYN1ZXd9d2tvem1gY11waE1YWmZqYFdacHpubWZUT0ZTOU9aTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6GzosChpLKyt6CqprKnpbC0qsiqrLCktKXAp7OgnaSknKOVlaCqp6yjo7arn5mWlp+XraqlwZ6ro5WRm5edl5KToZ6doaeTkpmop7LEr5qrnaqfkJeWp52qm5yfrZmhm52ipK+noqWon66Yl6ecmZqgnp2cr6CcoaaVl5KXk5+glaKdl6COlpOKio2Ol66QfJabg5KCi6qphYCZl4mDj56IeoSQh4aakoiGipWPm5eNkZido5aak5GdjX+OZqGzr4WKhHZ7kop9dnl6b2Z5kIGAiWt1gXmIcmlzf3t2g4aCa3VkeWZgamVjZGZrWWx7cGlqXFNMUEReVEZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFtHNTwsQLSguq+/rauusrKgq6axraKss6/Er6qrorKtvKOzm5+moqGcmZeopammpKWytJ6VlJ2ZmbClrr6grKKQkZ2ZmZSRlKGcl6ichJ+qq6KzyLOfqqSqlpaXmqadqJqeo6uUnp+eoKmvqqakrKKum5+goJiknpyfnK+jmJ6nkpeWnJGjmJennJqXZYKSfGV+jZqQY3mObWlre5Kkqmpkmpd9Z4aKZWVpaHuOoY9saIyXkaN3a2qLmaOemXNsbnqDjYd6WGVehoJebYuJgXZcaHN3d5KAh4Jud4J4f3NteYR0doiIjoN8aodZXmx1ZF5ziWlrfHFrY15STlhJZFhBSjQ+Rzc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2ln7q8uq+stLGqpaitrbCmra2wvLCppqOtrrCerJago52imZmmqpyto6WoqbKtnpWjj6Kvpba5pa2jjo6aoZmTkpqfmZmklXulraKotMS4paKnr56dlJ6inqOboqmpkp6hnqCqsKuspKugqpunn6egq5Whm6WwpJebqpWgnJqRo5adqZedfb2DiHK0coSdhq1oeLnEuHGToqN6pZmYc6uCfMvAwLtxjKKIg599lpiJncC9gpednY2dwsF8gnuSjZrDwH1rpbJujIFvynp/m3eRg46BdnmBgHlxen+HcHeFjJN5bniUY2ZfeWRgZYJjXnRobGRjWExXSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVkFCOy84lqO5w7WwsMCpqJSjr6mwrq2ms7SvqaWlprCrn6uYmqKfnJqqp6KdrKKlqKSktKSdopKmrau3s6euopGRmZylkpCfoJibn5yHpqykq63AwLGgqa+pl5GenaGZoaOqpJOgoZ6era+qraekpKehpqWdraiRpJqoramanKmbq6CVlaSVoKKWnH7OlHh6pIF5lZabX66PXo6ngaKgfKeWm3Org4CvXmONqnunh4WgdZeTiLNjgquGoY2Ns2qErnR9l4i3YYOtWaPNbZB1e9p7f5lwfoiSdn5le4d2dmt8iG59hZCRf22DkGFybHBoYGB5ZFxxaGpkZ2BSVFNXXUtPQzVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qorbOrprKsrKqiqqevqaCnm5mkl5yir5+gnqino6Whn7Csmp2Vp66ssKqorJ+UkpufpJKPnqSXnaejnq6lq7Cov8ezqKmxrpaSnZuil5+pqp+VoJ+dna2wqKyqnKiopKKrkqyylqWiqqqdo6akoa+fkZimmJ+Zk5ORl6BxhYyXdYWohnGxfZ5yrH6hnoGlj553qoJ9rX+cc61+qoaGn3aYknt8l36qiKKMkYydfqt6iJSQn4B7rVacxHqPb5LBfYGVbXVvjG1ldmWGb2F3bnJviYqSj4RukpFmcHV1cWFnbWVfb2lpbmdkWFNdYVpSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw08bGsrSgnaOOo6OirK+2rqiwpqiqpq2rq6ahpJ2ZoZWgpaufoqWgqKiinp2wrJealqmnrqyop6iel5Sao6GRk6Csm52moq+spKy1qrnNsq2mrayXlZydopieraydl6CZnp6psqqrqpysq6SjrJuvsaKoq66lmKWqqKmwoZGVoqSZk5GEpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBgUquEf66Dm3atgaeGhp96mZeGe2aAo4mkmYaCo32pfoKVh65ffalVnaKSgXqin4B7w6/Fi3Kvs7O5cWKpr8J0aIyMmI6CbZuVcW56eHlwbWdlZXJwZnxpY11XYGpYWVVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nV1b+hmaunoK+inrC0sK6prKKnpqiqq6mkpp+bpJ6dpqeno5ysmqKsoaOfr6Kcm5OrpLWvrqComp2WlKaikJqiqJ+gpZywpqSosay2yLK1qquplpGdnKGYn6SznZqhlJ2ep6yspa+braqjoqqhs62hqrOwoZqop66utKKSlaKmmJqRe6psnoSHdat5fLBvgqSLiZ+Wlp+UgdK4tLjJgIGyX2CUqYOkiIegepiWmniqyXSZo5WoqZGTmoyAnImaxsd4ZqGCpXOBn46Cfa9dcLRisHVLo4Ztp0eCk2SOkJ6SfHGYlYFxfHV+fG5cZmpzcWaBa15hWWRtXF9ZSU5MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraylopyyuKyqoKWaqKWqq6mmn6ammKqjn66rnaagrJqeqaWdp7WfopeTqaq2sq2bpZyglI+lrJGZnKeioKmmrqGkp6mwtcOysqmsqJOJl5ylmqGjrqWXoZWZnKWmrJuwnq6pp56so7esobG4r52arqaysrKjk5amopmejoKdTniagX+feoSjfYOkhIemnpyek4S4e3t5uYJ/zMbCtniboZCLn36alpeKdp6YiqWYpKh/sIWchZ+ErH2alGKlbKRwj4SQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+k5OMdnxzhoBxXG5ueHJqgW9bZF9pbmJkXkxMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruaqvoJuhrLKzpZ6glaWura6rp5ymppqjp6Gzr6Kpp7KgmKmklKK1oqKVl6GptLikm6Kdo5KPobGYnpumpKGir66cpaiitrLEsa2pramRh5Ccp5yipJyll56ZmZqmpKqbsKKvpaaYr6S7rKG2tq2dnLSxt7CxpZecrp+inYWP0bXDt3mHjoWRk5CApniUoXeMoJGEpYGKcaqGhbRucmqZo5yVip58mJmGh49zr4Klm6KNpouTnYqVkJttcLJdpXOTeptrmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jY6VjXl+eZCDbmp5aXlyb4B1XmVlb21mZ2BKW1hYPEhIQFU0QEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklk3ONiq2/v7y6tJ6Wp6WttaGimZWjqKauq6yZpqKfpqCgtqejqaexo5Sso46kraOdkJqaqrOzpJyknKmRlJetn5+dpqOcp5y1maKqpLarw7CpqqmhjISOm6KgpqOVmpqcmZuZp6Wnma2or6Olm62mvayUvbCsnqGvsrmqsqWaqLCippd5qJB9fLB3ioCkpYicbbJvoIetfKGPg6eVmICsiYWuhZ+UqqChl4afgJmVgHuSfquAnZqWi6t4nZ+RiZSSgHmvXqOBfaanY52AfJdzaq9dpWtwhZldYFuMoG2VkaaZg5WOmY18fISYgGtuf2N/dG6AemBnZXFuaGdoQ1phWz5LVTNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTgwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2TmoOpxsK2wbSfmqygrbilo46bpKOfsLCqn6Sfna2Zn7mgo6ugr6marqGQq6iklomakK6wrKaeppusl5ePrKGgnaWhmaScrpihqKa2qcCvpamjnouAjZuan6aekpWam5SbmqalpZuqrK2kpZ+qqL6klsKrqaKgq7K4qa2ln7Ktp6iXdq9+kIuchYd9uq2KmWWxjWWVrX2gj4OmlZqBrIqEsIWmmqShoZCFoFtsaoGzYH+te3uDgbFtZ2+ZmIyIsVt9tFykg2vIomSfgHu8WHa1WbJ9Uq6AeqxYgKFtmI+nm4yXkZiYfHqQnn9ldX9jhXh0gHxhamdxbWdlZk9WZFxBVV8+SSg+Oj00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRXWl5gYGBhYl5fXFtYVVBOSkZDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt726s8Gzo5yspqS2qKCKmqCfnLO0qZ+joJ61maC0qKqsnq+tnqybla+poo6Im46vrKinoaaZrpKYj6iZoZ2kn5mjo6aZoKKpsqm9r6Wonp2PfYyblqCgmZCSmpySmpipoKKaqa6opqaipam7nqDGpqSooKq0tKutpZ66rKurlICpkqOvjpt/h6SXmZCCgLjDuoOOnJKEp5ecgqyKgq+Ip5ybpqqQftW9wqpio7+9fX6jgoPXuri1hZSTg569voRrooFvq4RsnH96srDHg2mrsL2seHeivrxzgJaOppyRm5GZnnuCkpx7ZH58ZY5neYJ7YWxla2pjUGFbU2pcP1ViQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc4Oj5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWzs7G/ubK9sqGcrqalsqadjJilv6q4sqiiv6enspyesZy6qJ+tr6anlJSwrJeMg5uRrqWirKCjnKqgl4qikqadp5yaoaiimZ+hrK2pua2oo5qXk3yHmZGmmpKPkZiYj5iUqZuhmaqpoaqnoKOqu52oxaKgrqOps7OprqifuaatrZlzdaqkt4ZkiaBwaK6RipBubnekkJmfgXWumJRwj4txlaijm5eupHJtbGxmi3hvboKZcYF6anFpZ4mWlphxaWmEh2ZwhmRdiGJqb1lcZn12pl9hcY6RbmVlf42Tj6GYmZmSmKF+iJCWd2eIeGmOa3p/eWVsY2ZsYktkWEpsWjpQZUVSJ0s6KyMcIBsiLCkYGxgtMi41OjQ1Nzk8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1lcXl5dXFxcXV5dXl1bW1VXXqmUrLOpubiys6qpoa6eo7Kpl5K+ssTJvreqn8CsraShp6yguqOkrqyup46XrqmPi4WWl62dpqqgnaOjoJGLpJKmmaiZlqOqoJadpqansLqrrJqbk5J7hJaNpZiNkZGZlI6YlqiVoJipo5uxpp2iq7mfr8Gno7Klq6+wqayqprairLaViqCopbadiZajmYeqm5GVnZKpspmao6qgspaioZ2fopyhpaGVq6eNkpKMh5OcnJSQmZOZkY6VhYGkmpeWjouTk4uPhoR9Z4l+dIJ1c4aKcKdsepSRk5KBgY2PkI+clKGWmpijg4mWj3NqkXdxjHh3fHpqbWRjb2RVYVlAalxIY2FPWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVZZXmBhY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltcXF5fX2BeXl5fX2BgYF9ZWWCmlqiqpbS2rq6hr6Otn6C1sZCOrMe+xru5q6Olnpymn7GppLennam1p6iRmK2ii4eJj5ynlaykn5innp6SlKOWp5qomZSmoaSQm6eZoba7qKuZmpCMfIGUi6GUipWRlpCQlJimkJ+bqp+ctqOep6u3p67BraO2pa6vr6uoqLK3oK27mJGlpKa2opKep6COqqCOkp+jrK+aoKOvqK+Yo6Cco6qdnp2clqudk5mhm5SQlqqZjZiZl5CWnpGIoJ2VlYWSjJCNlIqAfWaLhXWGdXiHgnOcaoWPlJOQiXyLlZKSl5Sik56Yo4WKmol8c5dzeouAc3x/am9kXnBqYFtgWW5kUGBlUFo6R0dFPjI9PjkvKiYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFiYWFhYGJiYmRiXFtjl5Wjp6Ovsqyuo6mmrZ+ntaqQkJ2ltbywra2io5p7nqOypKWxqZebuaajk5mqnI6Giomcoo+unqKVqJ+gkpaYmq2LqZaPqJmpjZmpj566tqSlmZuNiHmBlIyak4qVkpSRjZKXo42en6men7ijgISvtaKvr3SjvaOxn3d5n6mwuZR1rKOeiYCqf2RcYnagj6WfhJd9bZKznKOnraqiZZ6fknN5mZdwgJiol21/oqiKZZylnJGXmJaMkpyRhp2aj5WDkoeOjpKJhHdqjoZ2hnB7hX9/YGiHipSSi1p1lJBnaJCPc3unm5tmepqJhHmZaoSLhG95gGtyZV92cGxraFtnZmJicFNcPk5OTlNHPkBVRDkxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXWBoZmdXUUo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgrrCsq6mlqK6ipq2kkpartrGyp5urp6yXdIydsJ+oq6eUl7mgoI+cpJ2Rf4mIm56NrJqilKehnY6WkZ6Eda2PiKabqZGXpImcu7SnoJmYi4l0d5ONlpOKk5GRlI2QlKCPm6GnmZyyloCMm7Wcs4ySjrumoH6nonqhrbWAjo2lnoOLhpCxqq+Mipekm3qAi6yGnJ2hp6inh5WFmHelm3qHm4GYp4KCe5yyeoqGoJeZlJiWgpGXl4SamWJ5h5CEjY+RioNtcI6GeYBwf4CEfoVzhYSVkXiWZ5J0oJp1fZmEop+ImH+UjIWFmmuOjYZseHtxcWdkeG9qbGtbZWxqZXRcXklUTFJARTUuWlVVNykhMDk9Pjc0MzU2ODs6PT4+QERJP0lFSktHU1hbWVthYWhmWVFIOUVMPD5iVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicmKOfpqytq6isn6iwpqappZmUr8i/saKXqKm1npCEnaycp6KgjZC+npqNn5qgkHyGj5mYiKycopWfoZGMkomGgJGnjYeinaSUmJ6Hn7qyp52bko6FcHWQiZWQipSQj5uMkJKfkpehpZaeq4eftIm0mq2KyoeprYi3hY2wga+sgqiMppiNnX2oj3J7d5yPp5dolaR5tIyfnqankpjCgX+riJihcp6AmqV9l4WVsoGhfaGToJCYl4GOk5uKmJGLfIWTho2VkomDbXKPhX55cYaAg3uDdISAloCPxWZ/qYePo2uehKOchJqBjo+Hi5pxj5OFaHd0fHhoaHZxaGhsXmRwbWdtWGdHXVJNMkQ0Nk5iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5pbFxRRT1MTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJaioLCnqKilq5+jt7CpqqaalKCjpKukl6aruKOwgKGonaWenYmUvJqUjaGSno95hJaWkYirmZubmaKFjot3mpyPn5CInqWclpqYh6O5raSanIyMfmJtj4uTkI2QjY2YjJGSoI+UoaGZoad+oaeHrZ2glq2PnpydkYWAoIyqrYWjjamZjJp/o3WAmZRrgq12Tat4h42ckZqop4Cpq32DoXt6p2mef5JrZ5eFl7eJnn5uYGRZg5d/jHtkaItymX15lWxdfJZtX1Nwg1xfa3iCX1hkgXyDf5dwp6prg6NucqVwn4WgamagbVtvjH1nWmCEgGJXUG93Zm10c2tqb15rcW1raVhpT15YRjlBNEhEX2s0LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15eYnVgTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnaC4oKmjpqyRoLa7q62imZihoqWtrqGer7WjqJOhoKCnnJqOmbSakIufjJWLdYGUko2Kp5aVmJ6ff5KFhaukh5qQipmpmZqbkoimsaehlZqIiYBpboiIi46OiouNkoyQkqOMlJ+gnKGkf5OBj6OhlKB3nJWPp4Ohpn+GqKuDpXiJfISafqJwc5SIlnyfjXlth5uMmY+bqJqPh517gqJzdqZmnn53pF+Yen2TdKJumLe0unSTh4J/tahkgca4e3CVtoxxf5qkYnOsq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRgnZmzlnF9mJ+zdXNbnrKDamNvdHZxaG9Ya21zcmZcaV5jTEQ9RDZRQlpyMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNTlFARV9eW1pYYGB8ZEhDOExXVVdjYFplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlpSjt5mrm5OgjaS3tK2toJqinaSjpq6dnLKurJOYoZmhpJmalJ+rm4uIkniLhXGAlo6KkKGPkpSdmH2QiY2noIeXjomSo5Scm42Lqailno+Xh4R+anuHf32QjYOLkJGJkJSgg5eeoJ2gnouJd5yYooyfcqGLh6mIm6WPlaapfa2MfnqgmXqjk3iBdJaIjZx9lp+Gm46Ym6WGomShfIiWkJuNbJ5omo1umpl6gIunfXJodKuDnoN0qmiVml2bhXaEnWeqaoC4ZlyocIGcYJWMXqd2dYeIfp5omnSFk5KXjoCfb5qRbqeaXah+eLtrfqpcjoRdtGdcbnJ6eGtpXHFreXljX2ZYYkJRRk83V0NSbzVLW1pfT1pEQDE1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW15ZZWZYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuJqbWbp4hjlJqrubGvrJ6mnJypoJ+vnJ6xqa2dl6SboaCZlpahpJmGiY1qiIBye5eIi5aWhJGVmJB6ioOVo5yKlI+GjJ6SnZ2JkKmjoJqMkYqAgGmAh3l/l4x7iY6OiI+Wm3+Uop+goZOYcmifip+PjHCSjIGph5ieoaWepnuwraOiuJd3o7OipICIlHmde6qaf6KOnJqWiJdxoXyFja+1fWuakaF4fpi0oqOrqISZfJt9nZp/dKpaXW97lot4nmJMfnt6hWN5l0JMn1iianF7jmyAiISZdZt4homxs3+Am5Ond4OdbnN9lXCadGukXZV2SGVkYHRxfn5uZmBsaXZ7ZGRhUV9XXVVXQFlGUWhEU1dcYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUM8VV9iWmZqVmdobW9iZmdeYWFcXV5haGJfZWN2bV1lZ2ZrZGZsaWhraZOcgLCtmYRTXqCms7mysqmaooycrJycqpSirKSiqI+gnp2bmZaYoZ2WiIeJd4aBb3mVhZGbi3yRk5aIcoCIkqCbc5GQgYmalaGbhY+pnJuVi4uKfINshIZxgaGMeIaNiIiTmZZ8k6OgnqKIrYZ9tYSOnpx7pZZ6qYGVm4+Jn5t8p2h3bX6ZdKFzcXyehplwk4OufaSDpp2ZgKRvXqhndaJjb6VhnNOQfHuZeHJzY6KGkH6jc6SPdWuQs4xggpiJc6qyp7x/d4Ntfr6mqbRdm258cJZtf3Kicl2kZ3OmYGimbZvUmn2Gm3B6e5hsnHx4l3NuqaRnYGV6cYCEa2dmZG91d2dgY1NcZlFRYklXSlRhV1NbZWpbZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWFlZWpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXmoCwq1RcS36pr7G0r7Ojm5mFmamgoaSOpamgmaqKmpiYk5mTkqGYj4iGe3B9hGh9j4OUmoF3kI2PiW9/hY+SkmyXk3yJkpOlloOPqpuUkouFiXmDdoiAboKfhneAk4aImaKXepSjpJqfibOhoraLeqynpK6lcKmAmo6FgJqQe6SAoZmGmHKehKOur4qXjICNpI2Vg62glHa0tbXJoXOUi4GfYJ2XqW15lYegm3Sih3egfpKXi4FvTGajknCbh3Oke3p0YYOBa36ga3FkX5xxfXOWaHlps7W0xqZzmH16nWucm6t2hZttdniYapp7dZhyUEV9tF9qdmt5h2ZqZ2N1dXBuVl5UWWlQUmhJVk1ZVFZdaGtuVmdXTktBSk1LSEpPQVFLUGVjam1ldHNzfnl8bnWJe3tUUE9sXmlca2lSamhpbGdsZmNlYFxdXV5pYmRpa3tfXWRoY2pmbm1laWxloZuIrqaEZT+TobKqrq+1oqKQgJeqoqOljKWnnp2mg5uXlo6XkI+ck46Ig3pqeYdlg41/mKB5dY+IjIFphIWRg4yFnY16jYuWppODmKmYjZGLgYh6f32LeXCQoYZ6gZWHiZagln+UpaiclpaEZm54nGyiZHxxpXebmHBnpoCVinqkep+Wg5dynnaBipWXj7lukYqiYn2ZoJWIbXJpqmt1oG1vpl+aaYuQaZaHm5V0ooB9mmCMho11b4hiaKBlnn5pm3VvY2aIgm1xolpfW2KhbV2Ii256fXNyZKVteKJkZ6domXOMmXCib1WJkG+gX2aoVIteVJhubXNrcoJtcGlseXNrb1JZV1dnWlNtSVlPXUlYaWlzallrVlFSRVZcTFhTYVVpa193dHt9cH18coN7gHN2jYCEdl5RcmJnY3BnUGpoaGtsbmhkZ19dXl1gamNqaXZ1XVxjaWNqanNtZmttY5ykmKV6ZHRti6euo6mwsaafjICYq52fpoyjopujooGWmJOOmpCLmJCOinuGcYCIaIuLfJicc3SJfZB8ZIKHlImJlZmCfIiHl6iRgaKskYaQioKKfoCAj3NpkKaEfYaUjYmZoI+Ik6mmnYimeJWbfqWIloyymJ6Qgq+Xn6V2lIZ4qXOlj4SabqSijJKEjYO7bn2lr4OGhYaTlZyffKV6cqiVoJZmnn5vrGOVipaTd6lsqaKBiXaIg3eqkaaHapGwa3azjKlrioZtbZ+ekpVgfquLqnZ+foulnnaffIOklZ2gapuIeKxonq2MtnR3vo2kk1mDpo2rYXVydHF8dXFja39vaGxTV1tWYWJda01dUl1KXm1ud19bcVlcYFtmdGVub3JicXRgd3p+eXJ5g3ODf4F7e4yBgoB2YnhkY25yZFJrZ2hvbHJqZmlhYF5cYmtibWx6b1xcYmlibGp4bWdsbmKVpaqcgH+do5apqp2opq6kmYqCmKyan6WKm6WdqZ2FjJqPh5yRhZKNjI10hnqIhHCNhX6YlHR0hXKSg21/i5GHhpOOfXuChpmmjn+mpo6BjomFlHaCh5NvbIupgYOMlI6JnZ+KjJSro6CPgHWUl4h+gXmUrqN/gZtxj4Z3jomCfXtyp4xxfX16mJabhI95e39+h5OVk4p2kJieoIN7fYlrjIVbeXlyenFpbn6SiXGAdYGPlJNxhoSCZYx/XoB/i3d0cpR1bnlubYZshIVedWd3jmWAgIWNqJp9dHuVaomIcIF2fYd3bm1njHN5fJh4hVxrWHmPaW54cnJveHhwXWuHbmpnVltgV1xma2RWYlVfUV9weHlsa3Zmamtrdn1xcnVzYW91YnR7gXh1eoN1f4B/gHiKhYN9e21/bGR5bl5XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5obG9hjZS4qKaJoKKapqSYpZyroqGEhJitkp6hiZunmqmYg4Gbi3+WlIeOiomNcoN8j31+j4V7mI90coNwlYV7fJKLhoaPhXl+gIeapY58p6GLhpCQhZWDho6Yd3KEqoaNkp2QiZ+eiIybqJ+gqoOIjpWafn6Jlq2oj5Gmj3dvm4+BeJBufqiFcH2VcWtwfYGgjYCTjoxobV2Di4ubmp6Oc5WLiHF0a4F2dIFZcm6GkYF+foxqXWpke4WEiYBgaXd6mnuCioF1gYWCZ3eJhWphcHGBdV5xioCIjqWUhWWLjYNud4uEcYaQenFnaGV8hHqWW1xqZ252W3t5eHVuc3OCZ1xti2trYlpaX1pZbHFcX2FaX11mdH57dXB0Y2tra3x9c3x4dWRtdWhtfH52enx7eXqAgH5vhoqEe31zfnlzf2hUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbmxnc3pvaGptYIuLqrCgj6Khmp6dl56YqKOifoOZro6glYicopGllX97mIV9kpmJiYaHinN9gYx2hYuChZeKcW+AcpiGg32Sg4SGioF6gYWMnKGRg6aiiHiOl4mVioucmISDeq2CkZealYqenYiIoaufoaKji4eTm5yjmZaqoaemn5KahpSMenaNjYOnfn+SkJOUnLKmm5WfkI2yk5eDpYyMlZqfiZCbgoiRimt8jnd4ZYKGkIt8iZ2Eh4uQiIiAhISQd3x5dJmgiIaJnYmEk359in9/dW9yhIF9d4aGio+lkIKFjIaCjJCMfYeMipGEeW2DhX16mWtyaGF0inF+end3cHd0gV1eb4dobl9eWl1dVGhyVmRcXGJsaHV7fHNvcGRra2mAfG55gHJqcHBsZ4F7coKAeH99f4R7bYKNhnx5eHt9eoN4TmR2anJtcHpla2VjYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2SMh5y5npaioJiUmJiUmKSgnnx/mqyPn46GoJ2LnpZ9eJSDe46ZiYaDhIdueYGAcoGIfomUhG1rfnqXh4SDkH+AhoSGfYeFjpyek4ern4Ryi5CGkpGLnZJ9jnuqhI6TmJaPnJaHhpuln6KanYWCkpqZmZCapp+lnZ2PlX+PiHV7ho2DpHp8jpCRhpiroZ6UnZCOqo2Qf52MiJOZnoKOl36GjoNvd4ZxdWB+g4+GdYyYgIOPgoaEfoWElG54dXSRoYqLhZqDhIxzf4h7fHJxeoeCeneKjYORpo6Fg46Ag4qJineGiYqMfnBsf4J8bmhsbWhfen9pfXx2dXZ1e3dcX3B+bnVgY1tdXlJnblRlW15ia2l2en5xbG1ka2pngYBsc4FsbHVveXCFeW6HgHaCgH6FdnGCjYh+e3p8f3uCimBpfGp1aGmCZGpjYGlcY3Vob2J1bWxVY3F5ZXB6e3Nlam1tiomet5qho5+RkZWXi5qen557eJ+nkZyLh6WUi5iZeXqNhXyJkYONgoKDbnx/eXOBhX6LkX1qaH2CmImBiI58fYaEhn2PgpCcnZKJqJ2AcIyLjJKHoKGKhYx9qJGJkJKXk5aTeIyjoKCdlpl/gJCamJKMm6OhpJmXkZp9jIN3f4KOhp9/foyMj3yYpaGik5qRkKaMj4GakYmSl5t+k5J+h46BdHSCcHdhfYCNhnGLlXyIjHGMf4KFho5od3F4i5eRj3+WfYeKcYGGenxwd3qKg3l5j4uClKWSi4SPeoaGh4V2goSJiXxnc32AeXtxbGtnX35zaHx1dnR9c4BqXmB0dnB3ZGNZX15Sa2lVZVlfYWhqdnmBcWdrZG1oZoCBa259aG9xbH54h3psjIFzgYF+gXR2go2Gf3x6f4F9f49pcoNuc2lhh2hsYl9xVnRvbW1geGhtV2p0dmN1entyYmpveoiMnrKSpaWcjo+Xj4acoJudfHaloY6YgI2ji4ialnl7hod+g4p/iYKBf3J/e3R2g4V+ipF4Z2N9hpeKgYqMeH2AjYN5l4KWmZeNl6CcfnCMgpGUhqabiIyJg6aVhZOLlpeTkneRnaChl5OWeX+OmJeOlpqcpJ2YkpSaeI6EgneDlY2cfYGJjYxzl6OfopOZj4+ijIuDlpiDkpaZfpiMfIiNgHZxfW57ZIB8ioVwh5N/kYJsh4KBgImEZXVue4WRl4t8kneLiHt/hXt6cX13iIR4g4+IipehlIGCinaIhIKCd3yDioZ4YXp5fnR/eGdtZWF/amp3c3R1fXF8YmNgdG51cm1hWmFeW2xlUmNZYGFoa3Z5hnFiamNtZWh9g2xodGhucGmAfYJ5bZCGcYCEg390fIOMgYB9eoKDfnyPbXaJdHRtZYpsamJidlaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5yul6aono2Ml4eGn5OXmX54qp2LmXqXnYuLmJB5fIGLfXyEfIGDgXh0eXpzfYCEgImLgGRffYuVh36EhnR9fop/fZmFl5WYjaSimX9zh3uTkoqmj4yOipOhkoORkJWXkYuBj5efmpKPkHN/jZKUiZ2dnqaXl4yUlXKLjYlrhJePmHqHiI+Jb5edmqSUlYuMnoyGgpKcf5KSlYeZiHyKiYF6cXlrdWx7fot+bYWSgpR4cIGDfX6Kf2RxaXt/lpeEfoxzj4eCeIV8dXd/fIR/e4KLg4uSo494g4F0iYd9gHR2gomFcGF8dnpxfW9ib2NkfGNub3ZzeHdzdGF2YG9sdW1vXFxfXl5qXlBdWWNhaG50e4hrYGlmamNpd4huZmxpam1ogX17d2+QiHOAhIR9dIGGiXuDfXqBhH18jnJ6i3h4bmyHamhfaXJjh2dxb2V3Z25sYXlpa317eHBheG2LgJiZqqCjqJ2KipGGip2LlZh+eK+ZjZd9n5SRlpOId357inx7gHd4gIBwdXR8b4Z9gYGKf3xhXH6PkoZ/g4NzeoCHeo+SiZOSnZOmnZWCfYF9jYqSpImOio2Ym42GkZiUlo+KiIySnJKPi4xtg4+PkYmemaKhl5WIlpBth5iDZoWYjpN6iISQinCWmpSjk5KJi5mMgn+QnX2Sj5KMmY57ioWHc3J1a3BudXyKdG6GkI6ScXWAe4GBh3tkcGx5fJmTfYOIc5CJgHOHeG5/fH+Fe4SLh4OLlKeMeod7fYuFd35xcIGGhGVoeXV1cHxiX3Bha3RecWp7eXlsc3BleF1ubHNtclhaX19ha1pQV1hlY2dxcX+HZl1qaWdiZ3GNb2RpZ2VpaIF6d3VvjoV0gYKDe3WCiYV4hXx4hIV6f4l3f4t7e3J4g2prYHBodIBrcm9tcmdvbGV8Y26AendxbHd3in6il6GooKabh4yKgZCch5OddoKrlZOOh6GNlpOPf3R8doV4eX9zc3uGa3Nwem2KdoCBiG9xW1l+kY2HgH9/dnWAgICghpGLk52YoZWYeIp/gIyJnJ2Kj4aSmJaFiZWZkJeLi4yNjJyJjY+CbYmLkJGKnZahnJeUhZeHaYOigmWEnImQfouDi4F3k5iSn5ORiYmVjX9+j5d8kY2PjZqRfIqAg251cGxtb3B7hWlzg46Yi3F3gHWCiIJ4ZnJudYCZjnuHg3mTkHl1h3NviHqEi3mKhYKHjZqih3uDdYGLf3d5bmyChIJec3VzcXB5Wl9xYXBrXnBqfXtxbW1qbHZgb29qcW1ZWGFgYW5YUVRaZmdjdXCEgmJda25kYmZrkm5gZ2ZgZ2uBdXJzcIuAdX+DgHh1gIuAeYV/d4eGd4OFfIeMf3t3in9qcWN8Y4Z8bnFtdGpob2x2eF9xf3l8dXV0gIN+pJWarZ6mloWNg3+XlIOQoHaMoJSThoubjZaOi3pyeHSCcHKFdHF2iGxwbXZtiHaDfoBubVVRgauUh4J4gHdyg3qCoYKTgpWUmZyTm3iSe4OMkqSak46JlZmShIeXmYyUi4mPj4edhI+KfHKLhYmOiJyan5uVlH+TfWiEm4ZnhZ+HkYORgolxg5GYkJyPkIyMj413e5KReo6LjJKWjHyIfIBrdmpua2xse39hen6OloJ2eoB4g4x8eWZza3OGlYt+h4V6k45weYNvdYt5iIt5h3yAi4+dnYR8enaBi3x3cGpsgoR7YHlxbm1zdFZecGJyYWBsbnpxaHBmZnN0aHFrYXdlXVZmYGByU1FOXGZlXXlwiHxfXGlyYmJlZpFqX2hlW2dwfXBscXSKfXZ8hYB1dX6LenuFgHiIg3OGhX6MjYR8eZV4ZnJqg2CIfW9va3pgam50f3VfdH15hnh0c4V9eKCPmbCcpY6Cin+DmoiAjJ6Ai5qUj4WImI+Pj4R3dHd0gHBwhXRwcoRva2l3boNufX1udXNSTYLfyJLWk3twdYN1hKCDlHeWkpmckZl7lHOFkJ+hk5ORiZOclIZ+lpaJjY2Iko2InH+OgHd6jH6JjIqcm5yblZJ5jHZmh5CGa4eihJGIl4OGY4yRmY+Vi5eMjYqLcXqUiHuOiIqTkYl5hXx+bHtlcm9ra3p5W4B5j4+Ben1+f4aOenpncmpyio6JgYWEfJSKa31+bX+KfYqFfIN5gI6UmZmKfHV3g5B4cm1ncYCFbmt1cGhqdW5UX3BlcFpgbHJ4Z2trYmZ4cnBwY193YGBWa19edlBOS2FnY116cIl0XFxldmBhZWWPZGFnYlhpc3Nua3J3jH10eoaCdXZ+i3OAhn96iX9yiYeBkYuIfH6YdmVzbn1liH5vcGyAWWxueXlzYXZ7e412cneKd3mfi5uum5+QgoV3iJV+fYqdiIagkY+FjJiEk46HgXR3cHlxb4RvbW9/c2VleXF9bXp9amhrY6Sawdyu8KFybHaEdoWjhpJvl5GWoZacgZJyhYujl4mOlYqRnZaDgJWQhYmQgJGKiZZ+h3p1f4l4h4SOnJqYmY6Pdol1bYWIinyJooOQiZyEhV6Lk5eLj4mPi4uFiW17loF9iIWJkY+GdoV9fWt9ZHh1am55c1eIepKHhXl+gICFjH54ZXJpf4mOiYGCfouWhGuBdW2Gj4GOg32BeH6PlJKYj3Ryd4eMdXNxZ3Z6hGN1bnFiandoUmFxZ2tWX290emFyZF9ofXByblpjcmBiVm5ZXHhOTUxkZ2Fed3OJblxcZHleX2RlhWBjY19ZanJrbmtzd4x+dHeEgXh3e4lxg4R8foh7dIuJh5aGjH9+l3NndXF5bYt7bnRxgVdxenZ5cmR3eYeMaXaAiXJ/nIeYp5yjkoV9cYyUeHmMnoSFoY2OfJaNgJmHhHtyd3B0anCBbGptfHVfYXh3e3F1fGhgZHzr2rXJw9yHcmx0gXaLm4mOapmQkJ2WlIGJcYWJoI6Fi5WKjJiUfI2SiIOJkHuQi4WPgX92eIOEcoiCk5yWlJeGjHWGfW6DgYiGmKGCk4ueg4lhg5WPh4qGiY2IgYdqfZSAfYOEiY6NgnGGfn9xd2h2cml0d2tajHySgoV9f4OAhIqCdWFyaoeAj4qBfn6RkHxtgWt3hI2FkYJ7gHx+j5GPlYhucHmMhnVrcWxzeYJgdWpvXWt3YFJlcmhmU2BwdnRhcGBdaINxc2pXZ2hiaVhtVlt1TEtMZmdeYnJzhWpbXGV5Xl5kZ3thZF9dWWtuZW9qdHiKfnNzgX57dnqHc4WDfH+HdnaKho6ZgYyCe5N1bHd1eXiTdG54en1YeoZxgG9neXeSgmR2hoVwipaFmaGaooqHdG+Ti3J3j5x+i5qJiXygf4SZf4F4cnRub2Ryf2lmbXh4XF95e3txcYBqYWZhf9W2jpGmeG5xd3xxk5GNh2uaj4mck4yGe2mHi5mGgZKRhoeYjnyNjICBio18j4x9iYR6dHqDe3GGgJaajpOTgYh1g4V1gn+JkZydhZSOn36IYoCTiIWIhIqOgICDZ32RgH5/goyPkH5tgnyCdGttd3V0d3ZrY42BjoCFfnyFf4SIfm9fcW+Ee46LgXt+kId5cINleYGJhYqBeoN8fpKNj5KEbm55i351bW5rbHt+ZGlsallud1pSanNpYlFjc3hsYmVeWmqDbnNhW2dfZGxfblVbcE5IT2dlXGducYBsWltjc2BcY2x3ZGVdXVpsbGNtanN3h39xcIB7fXR4hniFgnyAh3V5iYGSlnyJhnaJgXB4eXuEk29ufIF3XoN/dIFtaXpzlHNnc4h8cpKRg5qfm6CGiHZ2lX9td5WYfoiQhIqNmn2MmnZ+dnFwbGphdXxnYmp1elpgeHx6bXF/ZWNnZ1edj19xc5a8xIR3cZSKkH9zmIyHnZSNiHRriI+VgHuUjIGEm4x8ioZ9fImMf5OIdYmFdnZ9gXF1hoGelYaUj4KCcX+Hc4N6iJabloaTjZyAiGZ9k4KAhoSKiXKCfmd9i3t5f3+Hi499aYB9g3Zmb3l4c3dzbGqOhYqBin94goCEg39qXXB3en2LiIV7gI5/fXGAaHiBhomEgneCen+Wi4+MfW1reol8dnRvaWh9d2VdcWNYcHRTVG9zaGJOaHR4ZmFeXVhvgG9zWWViXWptYHBPWWxSRFRnYVpsbm17b1lbXmxjWmNwdmRnXF1gbGpjbGlzd4GCcW5+e390dYN6hIJ8goV2fomBlpF4g4p0gYhzeXl+jZBvb3uBcWmBeXp+bm18dpZraniEdGuUjYWemKCZhYhvfox2anmZj3+CioKVl4p6j5ZvenNwbGpkYHR7aWBlcntbYXN9emdwemFlZI6xsndLYlql2tGXcnuSjJF5f5aMhZqSjYZvbIaSkXp5k4eBhJmKfIZ/eHiJioSVgG+Kh3F0fXtqeYaDpZGFk4yDfm5+gnWCd4WZmJOKko+UhYdwe5KDfYOEioRvgXhogIV4cn9/g4qHfGV8foR2Y3BzgGh5cW91mYyGg4p7dniAhHmBaltvfHJ/h4OIfYWIeohxgG1wgoWNgoNxg3d/mIuMhHdtbX2Ef3Z6ZWhqfnJhWnhbWXJuTlhyc2ZgS213dWJeW1tZdX1yb1dnXWZqcF9vTldpUj9ZZ19acGtneXFbW1lrZVljcXlfaF1eZWxoZmxpcXh/h29tf32BdXCBe4CBf4J/doGFiZeKcYKNcXuGfHp5hJSMdWt6f2tvfnSAfW9yfHuUcG+Af3lmkoqCoZidkoOFZ4eDcGd6l4p+f4WCmYqBfI2NaXhya2tmX2FveW1fYm95XWRsg3pgcXZfZGXV676LMjo+i46AcnmGiY+Nd4WYjX+Tjo1/bmyFjYx1fY9/hYKViXyCeG52h4WDlnduh4RrdXt1ZXmDhKeMg4+Mg31tf3N1gniEmo+Lj5GSjIuGfnuSh3iAhY2DbIByaYB+eG18e4GKg3hieYSBcWRxaH5tdXF1gZuLgX+FfnN1fYBygG5aa3xzeIiBinuGf3yHd3lwa4aCjoKJcYB3fpWKin50bWp2gIB1dVxpaXhxWld+U1pyZUxbc3JmW0pxeHBeW1tZXHV/dWlZYltnZW5iaUxXZlE9XmZdXXZmX3VxW1lVb2RaZXF5W2heYGdtZ2praXB4fY5taoGEf3lugHt9gH+CenWCgYyThXCAi253foF7e4iTiX9pe31rdHxyhntzd31/jHp4hH58a4yMhJudloyCgGyNfmtof4+Oe35/g5SCf32KiGt1cWdpY1tjZ3NvYGFsdGFocIl6YXN0XmJjm6CQblw1Wq+1dWqAin6ThneHmId1j4yKd3BshYOHdHmJeIl9k4h5fnJndoh+fZdvcIZ9aHZ5bmV6iYWlh4CHjYl9bX11fn97ipeGgZOQl4iLhIl8j4lxfH6FfGl+bWuBe3pqenaCh4ByYHeCfnFkcmd1gm11e4aUkYF9gX9vd3l7dH1sV219dXOKgIZ3hnWBiXp3cm2If45/g3F9e3yRh4h6bm1pbYKBdG5daGZ0clJcfE5ccVxPXHNvZFZLc3lrWFlZWmBxgHVhXV1hZ2RoaGZOWmhOQWFkXGB2YVx1bVhYU3RhW2Vvc1dqX2Joa2dtbGlwd3yTbGiEiX18cH5+fIF/gnp3gICJi4Rye4dvcXeEf3uJjY+Dan57bnh5d4p3fXiAgod/hH5+em2EjIiYo42FhHt2i3lrbYWJknl9e4KSgIB9ioNwcnBiZl5ZZ19wcGBhaHBmam+JdGF0b1tgZGp2e3++nKekyLhyhYRzk315iJSEdJGNiHJzcIR7g3N1hnSId5SJeXlwY3eGeYCSaXKEdWZ3dmNqfISInoKAf46PfXF+c4N4fpCOgneVjZSPiIKIe4mJbHl5f3Zoemlsf3lzaXp2gIN9aGB4iH1qanNoe4BqdoGMkZR+en1+cXt2e3N9YVV1e3FziIKBe4Jwhol3d29vgoGLfXx3fHt0jYSBdWhxaGyIgnJwXWhjdG9LZnZMXm9VVFlzbmJRT3R5YlNYWFxhcIJzW2FcaGVkY2pkUVtxSURkYlxjcV5ceGhVV1Z3XlxmbmlWbF5hamdlbm5ocHd6k25piIx5fXJ7fnmCgIJ8dn2DiIaDcHaDc213goJ+iYuUf3GAfHh5eoGLdIN4f4GBgoR6gHVvfYmLm56IfoZ7d4d8aHWGjZF6f4B8iYaEdo+AZ3BuX2RcWGZZbXNhYWFxbGxoiW5gc2lYXmNtgHep2anHhoezcop5cI52fYiQgXqUioB1dHV+d4BvcH9uhXSUhnh0bGB6gXmIjmVxgm9ndW5bbX2BkJOAgXmRkn13emyFdH6PioNylYqQjoeFhXt/hm11dn9uaHdlbXx2bWp3dn9/fGBieIZ6aHV1Y357Z3WGjo2VfHR/dXGAenxsfllWcnxvdIKGfn93a4iGc3hqdH+Cgnx5e3d6cYp/fHJndGRti4RtdFtrYHZmSW9vTFtjWFdWeG1iUFN1dllRVlhdYHKEb1xgY21kY11uYlRdckdCZl9eZmldWntjUlZcdVtbZ2thVmtgYG5mZmxxaHB2eI90a46MdX92eH13gYOBe3R9g4iIg29xgHVxdX6GgomNi3t3f3iEfH2Fh3iHfH2BfoSAe35zdniLjp+NiXuKd3WDel5+h5qNeYeEdIaHhHeJemJubFtiW1thVWp0ZGBbaG9wZodyYXFmV1xja398ys6GuaJrbm6LbXKFcn6Fi397koV6eXR5dXV7amx2Y4R2koJ2b2dffIF5i4hlcYBqanFjWGx7hpyJg4Jyl5R2fXtth3CAiYqGcJaOkIiFi4R7eX9ycnB+Z2hyY254cWpscXd9fHpdZXqAd2l1eWaCdmd0h4uNlH1yhmpvfoB4bXtcWHB9bHN+iXuBbW6Jf3B2ZnZ+gH6AdXpweXOFe3hxZXJgbYuBa3NYa195XUlwbE5XVl9UVXxrYk9UdnNRUlRWXWJ0hmlcYGtqZmJZbmFYY3BHQWhdYGZfXFZ8Xk9WZXBZW2poXVhnYV9yZmtocWdxc3eHeW6VinR/e3d+eYOHgHVzf4aFjoNwcHt4d3V5h4aHjIZ6fH91i359hoSEh39+fn2Hf3x4dnl2kZOffo19i251gHlkhIiXhnOSim+FhYJ6g3VkbmpZX1tdXVVoc2VgWWRycmeBcmFrZFdaX2l/eL6uep+3bmJ0h2l0fHJ6hId7fo2Ad3dzd297dmVqb2CHdY6Bc2piXn54eIqCZXB9aGtrWlZveIukgYV/cZmScX93dIFsf4GPhnKTh4yHhImFfXl1c29peWFqbWFtdmpna2t5d3p3W2d+fHhlc35uhHRmdoaNhpV/b4tma3qCdGx0Ylttempzeop6gWV0hn1tcGd0fnd8fnB6anl6gHh3b2VsYWyJfWxuVmtheFZMa2xPUk9pTll9Z2JPVXZsTVFUVV5mdoRnXmFwaGdhV2ldXGtpSkRrWmJkVlhVeVpOV25qWV1sZV1aZWNedWZtZHJmc3B0gXhwmYV2f394f3yFh311dIKHgJWCbnN5e3tzc4WHiIiEeYF9do9/fYSJjoOBg3t+i4N7d3x3dpqdl3qKg4dqdn58bISGlIByj4JxhYJ+goBwZmxnV11bXFtUZXBlX1hjcnVpdXBkZWJXW1tof3Bvcn9ziWRleX9qdHZ0dISFeIGEendzdW5renBhaGtnhnSNg21mXl98b3qJfWhtd2ZqZFZXcnCOp32EfHaWkHN7cnt5bHp6j4N2lnuHhoOHhH11cXNtaHVdbWlfbXVkZ2Zpem97cllngXZ1aHCAeIJ2YneFi3yUgW6Lam17gHBlcmVfa3hmcXWJen1hdYN2aWtxdHpveHdxe2V9fn53dW5jZWFshnxta1ZqY3JUTGprUExOcEhee2ZiTlZ1ZUtPU1dga3d+Zl1nc2llX1ZiV2JwXUtLa1hkYVVUVXNWTVl2ZVpfbGBcW2NlX3dnbWJwaXRvcX51dJmBd3+AeIB/hoR6fXaCg36YhW5ydHx6dHGFhY+CgHqLdXSQgH2BlI6AhYR8foyGen6BdnujpYp5iYaFbHV9e3WEg416b4VzeoV9goR1bmppZVZdW1taU2NuZVtYYnR7amhtaGBhV19aaX9pbG9/Z2xhaXp6a3R1dG+GgnuBfXZ1bnpoanlqX2VuaYF3kIRnZVhid2l+hnluaW9mZl1VWG9oj6h3gXp8kI54dW99bnJ0eI5+d5R0hYKAhoh2anN2aGlvXG1lXm5zX2dianhoe21bbYNzdGpvgH55d2F2hYR4j4VziHFveX9xYnBoW212Y3Byh3p3YXKAb2dpeHNxa3d2c3Vignp9dnVvY2NibXx8a2tVaWJnVExtaFBHUmxFYXhmYk1Uc15KTVVZZWx4e2ZfbXFqY1xWX1Vub1dKU2hYZ15YTVVsVEtcel9cX2tdXVtiZWB6aGxhb292bm93dXqXfXeAgXmAgIeGenl6g32Bk4RxdHR+enZ0hYiQfYF8kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ9/eoiIhGxygnp2gYGCdG6Hb32AdIqAam9uZGRYX1paWlViamdcWl91gmlebWxcYVZbXGuBZXJ0fGlqXWx4d2h1d3Juh3x+fnp2c2x6aGl4Z11kc2h6d5KBY2NUZG9ngYR2dmZoaWFXVlloZJCob394gIuOenBve2Z4bnmKenaOcYN9f3+GbmR3c2RpaV1sYl5wb1tnX211ZXpoXXSAb3JrcXt+dXZidYWLe4eHgH93cnV+c2BwbFhwcmFwcIN7c2NxgGtgbHpvaWh5d3NwZIN0eXl0cWRhZG1yfmpsVGleX1VMdGNRR1diR2N3ZmFMVHFZS0xYWGdsdnplZW1xZmNaWF1YdmZUSlxjWGlYWEhXZVFJYnhbXV9tW15dYmNegGlqYG50eG1vbnaDl3lygYB9f4mMhn52doZ4hox9dHV1gXl6eoKMjn1/hIlqdJaBe4qdfX6FeYB7fnyGiXNxj66Me3uHkH5mcYh6dH59dnJvhmx7fm2QemNwb2JlXWVWWllXY2ZrYF1dc4ZpWHBtW15XWlxse2Nxd3VsYltudHVodXZxbYV5f4F5d25vdGVodGVbZ3VmdnaSemBdU2VmaoKBc3xhY2lcVFheYmSQpWl5dIKFkHhsbnhmd2x7g3l0iHKAeHx4gGlmd21gaGFfa2BedWtZZl1vb2J6ZVt3fGtubnB4eXR0ZXODkn+Hgoh6dm9xfHFhd2NZbm9gb3CAe3JlcYBkXm11aWNmd3lya22AdHJ7cnFhXmVtbn1laVRoWVpVTnlgUktaWUhidWRhSlVuVEpMWlZpbHJ7Y2xsc2NhWVpbYXdcVEtjXVlqU1ZHWWFOSGp2WF9hbVtbX2JjXYVpaGFud3lsb2p2gZB4bYJ+gIGSiISBdnWJdIuGdHF2doF3fH1+jI+Bf5N+cHiWg32ZknmAgHh5fn9ziIRzcJmie3t/iZZ4ZHWJeXN5dmt0cH9seXxwkXJecG9gZ2JsVFtaV2lkbWZcXHKJZlJybVtZWFdga3ZjanVqaV9bbXRybXR0dGuGfX+AfHdvbmxkaXFjW2tyZHR2jnNcV1NkYHF/fnGBXGJjXlNaYVxkk59lcnGEg5Bza2p4bG5veXl6cYB2f3J6entkZnZoXmNbYWhcXndpV2JecGhhd2Fbe3ZqanJveHRzdGhxgpWDhn6EdXJqcHtsZXZXW2lsYXBxf3lzZW9+WmBvcWJeaW98a2pyfXFvdmlvYFtka2x7YWdUZ1VYUlF3XFNQWVJIY3NiYUdWbFFJUFpWa2xrfGVtb3FhW1pYWWxwV1NPZldXaVNURlpcT0lydVhgZG1jWGBhYl2MamRkbXl4a29pdXmFe2uEfYCEmX2ChHl9iG2PhnFvdnp9dIGCfYuPg4KXdHiCk4aBn4l1gX+BdH+CcIeCdW+il3N7hoyHe2Z3i29ufHBneHF7bHN2c41rXnRuYWdma1NeXFZoYmxsW1xxjGROb21cVldVZmlzaGN0ZWVdWm92b3F1dXpsiH2AfYh3kHNjZWtvYV1ubWRzeIhrWlRWYmN3fHxwhFxjX2NUWmBaY5eVY25wg4SJcmpneW5lcnVxemt5c3Vven52X2dzZFxfV2JkWWF1ZlZfYG1kYXFdXX5vaGlzcXRxdXZrbYWTgYl7hXFxZm57b3BuUlplaWRwcn91c2JsdVVicWtbXm5ke2RrdHxxcXFpbF9YZGlqeF5mVGVVVlBVb1hRV1RQSGVyX2FGWGtPSVhUVm5pZHxpa3hrYVdcVVt0ZFNSVmhRWWdUU0haW1BOeHdbX2ZtalpiYF9ej25iZ2t5dm5uaXZ2fn5thIB+hpd7f4eBiX5rk4hyZ3SAe3V/g36Jjn+Lk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Md3hueo1gZX1xZ3p0eWxtcXeDZ2R8bWNmZ2hTYF9VZ2Bsb1xebo5oTWlsYFVWU25mc2tmeGRlXVpxdW5ze3hzbol7gXece3psYmVsbV5gb2plcXl/Z1pWWF9seHt6b4NfYl5oVllgWGSciGJrcYGGfHdranZsW3VwanlpdXJtb3uAc1hrb19ZXldjZFhlcWNUX2JpYWJsWmB+a2Zrc3VvbXh2a2iFjH+JeodtcGVve2xxbGJYX2dnbnJ/c3JeaWxTZXBkVWJtYXhhb3R6dGpua2pfWGBmaHVdZFZiVlNPWWdTT11PT0hlb11jR1pqTkpfS1htZV94aG5+ZGBVXlRddFtUU2BmTl1iVVNKXFpRWXV2XV9mbWhYY2FbXo5xY2hqeHJzbWd2c3mDc4KDe4iOfnyKiI55bpCKdGxzgnR/f4iFh5GElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2NjY2NjY2Njo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQkuSmpmZmZmZnqCgoKCgo4BkZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzP5OenJycm5uipKSkpKSnfF1fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGjY6Ojo6Ojo+Pj4+Pj4+LiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpORi5GMjo+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2MjIyNjY2NjIyMjIyMjIyNjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6FjoqGjYaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkIiOioWOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCQiI2MhoyIiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fH19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjJCIi4eGiIWJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4uNiouNio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXl7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pjo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5OTk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpKRkZKSk4qHlJKTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKMi5KRkZKRd4aTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkYlyipKQkoBziZGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj3NwjJCMdHeIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Pd2t6kIZ0d4ePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI57ZWuGfnF1ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4qLh2heaGVnY26ChYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dndvXnJsXGltZ2Voa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaF5odWxdbXVuZmJjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXWdvbV9rc3VsWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01WYmhtc3Bwc25SUVRQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTlRhZWVubW1paFRNTk9QUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tEQ0ZMWmhsaG1sbWlnY1tVUk9OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFRVBUVVpka21nbGxramppaGlnW0xKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz5CSlljaGxrb2xtbGppamtpX1RJRUVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs6Rk5NYW1wcHRwamtpWEtCRUVER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7PTs7S2Bte3NqW0c9QEBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OTo5OEJqbUg5Nzw8PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT09PD08O0dcOTw8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDxcbkA+REU/PkE8RV49Pj07Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213SDg7Oj09QTxLYz08PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PT1JTEZGdXdNNzg4Ojs+PldqQTs8PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+DgHp8d1Y8PT89PT5GaXRMOj0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KChIOCg4B8XT5AQ0BAPUpye1k6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hHVMQUNFQD8+WXuAXT9DRUlKSUlNTUtFQ0ZHR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hMTUxNTkxJR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVmyEh4aGhoeIiId8UEtMS0hHRkZERUNDQEBDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVIGDhISCgoWGhoOChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTU3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjIlUOjg2NTY3NjY2NTY3NzM1Njg6ODc2NTY1Njc2NzY4OjY3ODg5Ozc1Nzg5Nzk3NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZYWDgYCCg4ODg4OFiYuKiYmKioqKi4mKioFHNjc2NDY4ODc0NTc4NTY3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISFhomKioiHiIiIioqMiomJjHo+OTg4Ozw+Pjk6Ojs4OTs5Ojs6Ojk7Ojk9PT0+Ozs8PTo9Ozk7Ozw7PDw5OTw4Ojo6Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3Vzdnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQkFAQj5AQkFAPj0+PkA/Pz9APz89PT9CP0FBP0A/PUBAQD4/QT0+PDs6Ozk5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJTEpKRkdHREZHR0VCQUBDRUNDQUJDQj9AREhEQ0VDRUVBRkVGREVGREBCPjxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFZITUxOTE5KSUtJSUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZIR0VKSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dKWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2Mi4qMf1BOUE5MT0xKTEpJSUhKRkRGSEhJRUVIRkZFTExNSUpHRkhJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozw9Oj5APj9AQ0ZJSlFfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyLi4qNck5SUE5NTUxMSkhHRUlJRUpIR0pKSUpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSEdDQkFDVW5wdXd3eXp4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLX1NTUU5PTUtKR0VCR0pHTEpGS05LS0pKS01MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0ZGSUZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyLi418WFdTU1VTTkxLSkRFRktPTk9XVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRkhKRERFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkJHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toWFdrYUVSUVFQSTs7UlNSYHVcVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdGRkU/P0FBRUFDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dtXGRVOlhYWFNRP0BWVVlcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enl6e3p6fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiot5bnBZWltbUlNSVlZUW1p1g1lVfZBgXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHhIp+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERUlFQz5UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dTEQ/Q0NDQ0I/RFBCQ0BDPUNJR1ZASE5MR11pUEhGTkZERUZJR0hDREhHSEtHREJBREBPUU1SZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5/g4CDg4KAgoCCgYJrTUc/QDs7PkBAPz8+a1BLYUVGSElFQj9HTE1HTVJVSUJFPz88PTw9PT89P0FDQ0A/PD1CPkpOR1VudHR1c3R2eHp8e317fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0JCREJcXU97Tk9OTktMTU9PUExLTVdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT88Qkg/XHN0dXZ1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGR0hCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWlhNS1RUU1BRVU9MUlNUV1hUVFhRTFdZWlZYWFZYWV1XV1hoc2tdVmFza2JhX15kYV9eWVRRTk5OTElISktJSUZDUVBTW1dUVE5RU1lTXGVVT1NTUU5LSUhDP0E5OTk4OTc4ODU3NTc4NTk6R25xdHd4eXt7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHBubWRdX19ZV09QWFZWU1RWT09UVlhYWVNVVExLVFZVVVVXUFNVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxPUlJPTU1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8+PTo3ODc2NTk5Njc2NzVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xdUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKUFBPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEpPUlBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtJRkxNUE1HL0VfUj4zPz5qb2FSUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dXl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1NQU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVU1MS0k8OTg3Oz5APjw9QUBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hRUmFcUVBST1NOT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0hKTExKRkZGRD9CQz48Qkc/Qj9BZHBzd3p6ent8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hERD05Nzc5P0I+Oz9CQEA+QURKRUNHR0lHSUVCQj8+PUNCQUdJRU5PYmVRTU9OV0tLTUtMTU1NTEtPTlNkTkpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4Ojo/Qj88QEJBQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVDTE5SVExKSU1URklJSkxKS0xJSkxNT1BSUEtHQ0xHQ0JKSkxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxR0tER0hIR0pLSUpLREdCPT49Ojk6O0FCPz1CQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBDRURJTVBISEtHSEtESElMTUhKTEhJSkxLTV1SSEhETkZBREpKTU1QTUtNSktGR0dKTU5RTkxibWl2dnd6eXx6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0NGRUdFRkZHRUdCQ0A+PD05Ojo7QENAPkJDRUVJRUlKTEZJSUdGRkRCO0FDQz5AQ0NDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJR0VOSENHTUtNTE9NTU5NS0hISU9SUVJOUmZmZnFvc3h1e3p8bGhqb2VrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUNDQkVAREI+QD46Ozs9Oj0+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9REVCPkFDQ0NER0hJR01QSkZGR0tOT0tGSElGRURFSUpISklGSFBLRElNS09NT05PUE5KSklMUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRD1CQT5BPTk6PT86PT5AQj5AQkRHSkVJRklIRkZHRUNCQUFGRkNCQkJERUVHR0lGTFFMSU9KSkxMSUdIRUZFRENJSUhLSkdLUk1CTk9NUU5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQUREPEFAQEM8ODo9Pjk/PD9CQEBAREZIRUlGRkhHRkZEQ0VDRElFQ0dFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUlBRUU5QTU5QTUxNU1dWWFdVWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkQ8P0JCRDw3Oj4+Oj46QEI+Pz9CRUZER0RFSEZERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdNS0xLSEpMRklJS0hFS0tMTU5PUlRQSFNVU1BTT1FNTlFOTVBXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2loaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TklIR0lDQUNIRTxARUJFPDg6Pj49PDxBQjw/PkFCRkNFQ0NIRUNFRUZHR0dJRkdLSERISEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OT1JVVk9LVVdTUVNRUkxPUVBPVFlaWVxaWVteXl5gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QUFGQ0VFRElFRkVHRUhIRkhISUtKRkpISEtIRkZMSUhISkdMTE1MTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9SUlBWW1tdXltcXl9fYWBhZF1jYGVmYGVoamNzc2ZqZ2dscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpKTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkVGSUZJRkZESUlHSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUExPUFJUWFZNTlRWVFJSUVBMTlRTUldbXl5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S01MS01HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHREhJR0hKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lFQ0lKSklJS0dFS0pHSEpJSUtISkpOTE5LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RFSkVFSk1NS0xMR0dNSUdKS0hLS0lLS05MTkxMTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnF5dmtiYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFREBCQkA+Q0ZHQkZDRkVGRURDSEhHREVLSEdMTU5MTU1GSk5ISktKSUxKSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBdX3JrcWpVdXl4cGNea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFR0tKR01NTktNTkdMTklMS0lKTUlKSUpLT1BPTk1LTk5MXGhkdV1scVdsTlBRbVVaa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDR0RIR0xIRUNDSEtISEZKTExGTkxMU1JMR0xNSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQD5EREJHREhJTUlGQ0ZKTElHRkpNTEVPSktXUktHS0tKTklISkxJS0pJSEpNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVERkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJR0tLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVVlbXVhdXFxjZmFhZWJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQ0BDSERGR0NJS0xIRkRHS0xIREdJUEtMT0tMV0xJRUVISUpISUtJTEpIRkdHSUdISUVGTElKTE9MSVBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRUxNQkRDQkVJRUdHRktKS0hFRUpKS0ZFSEhQSk1NSk1SSUdFQUhGSklLTEpMSkhGRElGREZHRUVKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDR0hGSEdIS0lJSURGS0tLRUZJSk5LTkxITE5HSEU+R0dMSUtMS0tLSUdESURDREVCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUdJRkdISEZGSkdIR0hLSUxEREtKTU1MTEhKSkhKRj9HR05LS0tNS0tLSUZHQ0RAREFISUI/SUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFJbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkRGS0pGRkZIR0ZJRkZGSUxKTkZES0tMTkpMSUtKSElGQkhIUU1LS09MSktJR0dFRD9FQ0hIQUJHR0VUXVleWF9ZX1tdVVhYT11dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUhGREdNUkhDUUpGSEhIRUZLSk1QRUZJSktOTExJTExISUdESEtRTk1NUExMSktISUNEQUVESEdCQUdFRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdT1lhXGBgX2JjYl1hYldfX1RQTk9PV1FcW1tcXF5fYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlKS05MTExNS0pKR0VKTlFRTk9PTU5MTUhLQURBQ0RGRENCRUZCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU09MUFNSVVpZV1lYWGRXT1NUUFBOTU9UUlpYWFpdXGBhZGVjZ2NrbHBzcnp5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUhGR0RLTV1MR0dYTEdISkhHTUxRUUhMS0tLTk1VTk9LS0tHR0tQU1NOUE9OT05OR0tGYEVEX0xFZmRFTVtJXltybU9NVW1ZTERQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmJiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUZHRkhFRUtPU0lKRmBTSEpPSklPTVJRS01MTE9SVVJPT0lLTUdITVFbWU9QUE5PT09JSlF/UUl8WVlxdFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVlh/anR1dV9fdl9YYVtbZltfYGFhYV1gYmdtcGxgcHd0eIGBgoODgn99f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExGSUxFUVZMS05JS1JYV1FNT09NUVROT1FQS0tOR01QU1taU1FST1BQUEpIWnhdVHhlaFpTVFJ2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3J7fG9+eG6Acl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKS0dKUE9NTUpOVl5ZVUxRU05ZWk1TU1JOS09IUVJUWVdWUFRQUFBRS0hneGxjeHJtW0tNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f29ob1l2dmp1dXCBYHJmfWlseHxvXl9fYmFbXWJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3F5e3Nydnl+gXN1em58fXl3cm5OS1N1TkNCRlBQSEpLSUtQT09PTU9aYFpXS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW5tanBhY2Zjb3d4b21wc3l+bnFwant6dHNvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWFVNVVlVZVhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfW3B6e15genNjcm94cWhkfWlyfF5UTGxgdnVraXV7e21+eGt8cFxeX2JbXmJkZGdlZWViWmNjaWtrcnNyd2dsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbWttT0hLS0lJSEhRUExOT0xLUlJST1NSV1JWVFBXW1ZWVFRUYV9QTk1LVFNUUVVWTk5MTU9QSkhRTlBVTEtMU1RTU1RQVlVRUU5RUVhZUk5QVVRYWFhbWlVSU1dbV1hXWk9TVVdYWFJeWVdeVlRQWVJWV1dXWF5bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTU1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PS01WVFFOVVNOT01MUVBLSlJRS1FNS0tQUlVTUVJTU0lITE5PUVJRUVFUVlJYV1xXU1NQUlRVVlNaUU5TUlhWVFlWVFpWVFJVVFRVV1hWXVleYF1cWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0tPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBKTldTUE5VUE5RTkxTUExPVVNOUU5NTlFVUVVRUlRVTktNT1FUVFJSUVZXVFlaW1lTVVJUV1dXWVtUUFRVWFVVWlVXWlZTUldWVVdbWFpfXFVYXlxeXVtdYGFeW2JiY2dmZWRiWF9hYl1gZ2RmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RW1pYV1hbWVhZVlxqZFZYWVpXVlNTT0pOVlRQT1RQUFBOTFFRUFJYVFFRT01PU1ZPV1JUVVVPTk1RU1VVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFdWVlZZVFhYVlNSWVdWWl1ZXV9eVV5dXmBcW19fX19aYmJkaGdkZGJYYWBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWFpbZHFtaGRfW1lWVVdRTE1WU01OUk9RUk9MUFNSVVpVU1BQTVBYV1JXU1NTWE1PT1FUWFZVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaWFdcXlpeX2BVYVxhYV1gYl9dYF1jYGNnaGRmYFljYGFfX2VkX2BjW1pcW1xZWllYV1xZXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUk9VVFNQV1xcXFheXF5WXF5qcXd5gGNcW1VVWFFNT1ZTTlFRUFJUUktRVFRZWldVT1JPU1hXVFNVUlJaT1BTUlZbVlZXU1ZaWF1eW1teVlNOVFVWXFxWUlRWVlhZU1RZXFVTU11YWl1eXGBgYFZhW2NiXWFjX1xiYWJfY2ZpZGZeW2RgYWBhY2RfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdcVFdXUU5SWlNSUVRSVFVUS1JWVltaWlNPU1FWVlZUT1dSU1pSVFRUWF1XWFhTWFxYXl1ZWl1UVU5WV1deW1hSVVVZWVlVV1lcVVRXXlldXWBdYmJeWV9bZWFfZGReXmNjYV5lZmlkZl1dZGFgYGFiZGBiXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBbVFVWVlRUVF5eYF5eYlxgVV1eYmt5dGx9a1pVWVVRUVNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9bWlRVVlpZWldYWlxWVVpeXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUVxVVllXV1VYX19hYWBjXV9UXV9iZWV1gXpoWFlZU1VTVlxYV1dWVlddWE9VXVpeXVxUUldTV1ZVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVlUWVpaYVlcVldYW1pbWVlaW1hWXV9gX2NiYWRkXGJcYGZhZGZkXl9kYmJbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWVZTXFRWV1lWVlxgYWJjYWNeX1ZbYGRhX3p1b2hZXFpVV1RXW1pZXFlYWWBXUFZeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19ZXV5ZXlVTWVdZWV1iWl5WV1tcW1xbW1pbWVlfX2BgZGJjZGViZFlhZmNmZmVeYWJgY15iY2lkY2dfZ15hYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TT1ZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXltdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZZUFdWV1dXVlNVVFhcXF5gYF1gXFdhXlteXFteWFZYWFtbX2BcX1hZXFxdXl5cW11YW2BhXmBkY2RlZWZiWGNlZGhnZF5jYGBlY11laWRlaV9mXWNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1pYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXV5ZWFVXW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmRjZWZlZmJaZGZmaWdjX2NeYWZkWmlpY2ZqY2VeYmJjYWBgX11dWlhcWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lXXVtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRcXFhaYmVjYVJcWk9YWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXllZVFhdXl9gX2BcW15eYGJjXVxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxjZ2BcaWliaGplZGBiYWNhX2BfXV1cWVxZWFdYWVhXXFpaV1dYT1haXWFjZmZya39KWVdcWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmNiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWlhWW19eXWFhYF5bYGFiZWNfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgW2VnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcW1tWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7fHx8fHt8e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7fHx8fHx8fH19fX19fH18e3p6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vb295fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJioJFPj8/Pz9AMCorKysqIozb0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vbnmAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyNgzoyMzMzMzQhGhsbGxsQj+/l5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl6eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8dnV1dXV1dXRzc3Nzc3N9hYSEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z3enh6eXl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t8fHx8fHx8fH19fX19fXt6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3h9eXt9enx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYGCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x5e355fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHl5fHp8e3d4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh8ent8e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHp5enp5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFwcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJycnJzc3Jxb3p/b3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXF5e3BycXBxl4NucHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBycX2eenBxb4agfG9wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcp2fdnB0nJ99b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXJwl6yQbn+jn35wcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnCOsah6iKagfXBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3Nzc5yzpqSnsaJ2c3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh4d3eBq52htqaip4R6eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58fHx8e5KmmaOxoZuklHp7enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19lZ6KlKyenp+agH9/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYCUo5yUnJuXjpuDf4GAfn9/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/gIGAfpqyqaObn5+lp5F9fH1+gH9+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn+AgYSVr6aepZ+fnqSorZ+Rh4F/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOChomWprGpnpuln56foJ+jqKijl4eBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OFipmjn5mYmJ2dnqGfm5ydmZOMhYODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgYeMkZWYmY2VnZuYlI2HhoaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYGDi5ach46bmoyHhoiIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEhIKBhIuKko6FhIODhYWFg4SEhYWDgYKAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgYGBgIiRgoKDgYKAgIB/gYCAgH+Af36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgICAiZGAgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf4CMlYKCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpiKg4WEhISCgJKahoKCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2MnI2AgoGBgoKFlJOMgYKBgoODgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GXjICDgYGBgI+TjJCBgoGCgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeLfoSEg4SCg4OCjomFjIKCg4KCgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn9+fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5GSjIqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/f35/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWEhYaGhoWFhYaGh4eGhoWGhYWGh4eHiIaHh4aGhoeHh4aGh4eGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGh4WEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoeIioqJiYmIiYmJiYqLioiIiImJi4uKioiHh4iIiYeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn58e3yDh4mLi4qKiYiIiomIiYuKiYmIiIiKiomLiYeGhoaHhYaIiImIhoaHhIOChIiIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYeHhoiHhomJg4OEg4WEhIWFh4iIhoWDgoKDhYeGh4aGhIKCg4SCg4SEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoaGhIOBgoOEhYWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKBgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImFhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSEhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+Ag4ODg4OCgoB9fX+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICBgoKAgICAgIGBgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KDg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn+AgH59gH9+gICBf4CAgX9/gICBfn19f4CBf39+f4CAgICAgIB/gIJ/gIKBgYOBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Ag4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf39/f35+fH9/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B+fn5/f4B/f39/gH9/f35/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4CAf39+fn9+gIB/fn9/gH+CgH98fn5/fn59fH9/gH9+fn9/gH9/fn9/gIB+fYB/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl4fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn9+gYCBgX9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgIKDgYCCgIKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKGhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eHh8goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgIGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYGBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4ODg4KDg4KCgoKDg4KCkZCLiIiHiYeGhoSGhYWEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5eXyBgX6IloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WEg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6ent8f4GDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhYWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fX18f4GAfYaPgX59gn5/foCCfHyAf4KAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIyOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF+f4B8fn5/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6BgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDg3+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn9+i4SBh359fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+gH5/foSSjY2Mj42MioaEhYSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp+fnx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1/gICDg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4J/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8foCCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEg4GCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fHx9fHx9fH1+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKPjImKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59gICAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX19fX18fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mMkZCOioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn59fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eXl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf4CAgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH5+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIj46Li4eFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH59fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH19fYCDgImOi4yIhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgYCAgIKBf4CBhIF+foB/fn6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8e3x7e3t8e3x8fH18iouJiIaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoGAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7e36Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX6Af3+BgIGBgICAgYF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhYOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SEg4GAf4B/gIF+fX1+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn5+fX9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhISCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX9/gH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH9/fH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Bg4KDgH9/gYGAgoGBgYCAgYCAgH+AgYCAgoOBgX+AhIB9gYKEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYSChISFhISEgYOCgYOBf4CBfn+AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICBgYCAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICBf3+BgoGAf35/gX5/gIKBgIGDgoSEhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX18foCAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GAgH99gX9+fn9/fn19foCBgoF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYCAgICAfH9/gH5/gYB/f36Bf35/f359fXx/gICAgH5/fn5/fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIGAgIGAfn9+f399fH59gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9e3x8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgIKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eoGBeHl7fHx9fHx7fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gH+AgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCg4KBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHt9fHt9f3h3dnl5enx8fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGDgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99en1/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoODg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGEgYKCgYKBfoCAgIKBgoGBg4KAgYCAgIKCgYSAfoGDgX9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4OChIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBgoKCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SAgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe32Bfnx5fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4GCgIKAfYCAgYKDgoKCgoSCgIKCg4SCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4ODgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoOCg4GDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn99foKDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX5/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYKAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319en17fH18f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEg4WEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFg4SEg4KBfn9+e3x7fnt8fH1/f318f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaHhYSEhYWDhIeGg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIOEh4OEgYKEhYOBgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX99fHx8fn18fX18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx+e3t7ent8fHx7e3t+e3x9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIeIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+DgX9+fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoSEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WFhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gHx/fH19fn17fX18fXl6enl7fH16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhYaGhYWGgoODhYCAgYCAg4CDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaFhoaDhIOGgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4GChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9fn+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYODg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX2NnY2NjY2NjY2NnZ2dnY19fX19fX19fW1tbW1tbT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QTw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4t6mnp6enp6enp6enp6emsb69vb29vb29vLy8vLu/0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6Ojo6CGhISEhISEhISEhISEgpWsqqqqqqqqqqmpqamosNLS0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/OzxCQDg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWiiYeHh4eHh4eHh4eHh4WXraurq6urq6urqqqqqbLS0tLS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw8Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqampp5COjo6Ojo2NjY2NjY2LnLGvr6+vr6+vr6+vr6620tLS0tLS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLQ0NDQ0M/Pz8/Pz8/PztDT0tLS0tLS0tLS0tPT0tXU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7R1M/P0dTU087O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tbW1tbW1tbX1tbW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Tu53P0q2Dg5XP0qSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StZWbtcqavLiZtbOfoanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/P0Z+gqrDEooyAjcWdl5WcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OTY/Qj9COjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9HFh5qzwJ6IrNa6l6GdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P1qeZtbunq5ulspmWr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PT05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9WlmbTBoJ2Wp5CahJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDWpZmy1qO0q59/oKmFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDQ1aWas9bJ2MGcgLytppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GP0hIR0VAPDw+Pjw9PTw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT0NWlmbTJjaGfn5molpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEM7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhx9LWo5qzwqSqo6HDoKuknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPR1bWCw9ipj5Cs18KPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PD9HRUdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHRwtTS1cG/1tLVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tTS0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjY5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QkdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2trb29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NTY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1OTc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ojs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrKytrKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6OTo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbS2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT02Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrqKagnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6enn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeTkpGXmpyalpeXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaenpqainpyfoaCZkZKalpeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWlpqempaWnp6alo6CgoaCfmpOmr5uamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKkpaSmpqakpKOioqGenZqjioebnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKmrqSkpKSioaGem5ufoFuGnJmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgqrSwoqOioJ6cm5qaqXBQi5ubnJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGhoKuTnK6goJ6dmpmaoplTWo+cnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgoKCjoWiXrJ+dm5qbnKpzVl+Pnp6enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6enah0aKSjm5ubnJ+ha2JikZ6dnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cm5qngmyBp5ubnJyikmxkY42fnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZmapoR2cJOam5ydnYJqZWWMoJycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJycmZiZmaaNdXx8jpqdn5Z4Zl9ljaGdnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmYmZmclZSde3+coqCGjH9gZpGgnp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZn6mcimttrqqhZ3+LemeXn6Cgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZl6aliHBfaqSUmFZne318nZybnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampepmWdFSHSZg4VPRWB1gJSRjZKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZCWrYQ9Ojx4jHZuUTk1XnaCh4KNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoN+mKNaXmxQeaGWg1NjakZneIGCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+fp2MWZijb7a8sbyCeZp9TnV+hY6Ni4aNlJKLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioR/gn2geIzczLPWsZ64vGVicmFgiIuOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGMf4iNjIuLiJKKmmizybTI1K+uuqd0i6lqWIiLipCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkZ6hnZOXm6Ganpyjo5NvqZuRwr62sZiNd13KmlWCj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqauqqbOgh5B5lKyUjI99eXJnnZxjeJ2ipJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqWpp6epqo54V4ONe3qAcG5rc3Z8fXagqaegoqKurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKimmp2kpqKhqZ58aEtpdG5weGpoZGprbnqElqSjoKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqGjp6Gmrqanp6+EbGJLXXNub3dnYmNlX15qdH6Om6Khn52go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqpoqChqKmtsLO1vLKWb2VcR1Z2cnN8Z2FkalpaYGNteH+KmaKioaKZlp6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjq6qorra4vMHDva+Ze2VkW0BdbG54e2thX2dbWGBeYWZwc3mBk6KonZ6hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuzusbQ2tXGuKiWfWdiY1U9XmpsdnFyZGJjWVdcX11dYWhqa257kqWup6WZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaXZrcGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1vdLg4dC6pZKDcmFZW1tPP1dyaV5bbmxeXVdZWFpaWFlZW2Ryhp26yL63oaeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDw7zDyM7U0MCjfmFVU1VYUUZJgm56g39eVlhXXFtdWldgfJyyvMDGx7e3t6mvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMHFyMjFv8WtimVWWFVRSWt1o6yjT1VcX2FcXWyQscS8va6psrertbKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx+hH9qZmhha2xnbnVycnVxZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhCQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8TDxsbAsZTEyNK7i2ZVVlFWZqKunU5WV1hbZ4ezt66wrbKmqqqqq62sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3pqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTEubTAtrO+xsiwgFpUU1CZsZFHT1ZZcY6mvLClrbS1rK+lpaOnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7d25raWh2WmdyeHN5ZmZeZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxb64vcDCwsOhblVKjbaFRUtafqGip7Syray4tbOsqaOhramsp62frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF5qb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHv8THxMTIy8asc192X0tXlre5wL2+uby6vLq8rK2mqbu6ube/srW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmlqanRueWxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcXFxcPGxcjM1MyGSUxXoMnByM3GxMHEx8G8vrSxsLDCvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BrandsaWZ1b3RjXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwcLGxsbKzHtHhc7Nx8zQxba/v8DAuru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2NqZGJrbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr69wcC/wMelSp/SzMXJ0cGvvb24ubu7vre0sbm+s7y+sbm1uLu2vLS1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2NkamNnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwbu/wLy7xL26wMS/vby4vMDFr0+ZzcTAwcm/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe3uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2llaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjru/u8O1use3trm7vLi5tbrEyKpQkcm/v7vBvrnGvcK/vMW4tre0uLa2u7u5trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWZlZnBqZWtoWFlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxXmszL3Ht7m4rba0t7mztbK6xcqeUojKv7++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h31rbnFncWt0ZmJuYFxUSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1652hL3Iz8LAuK61tbu9t7mxvsPHk1iDzsPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxqbnVveGNnYlxjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydGZc3aw0dHMysS1ur/EyL6+tL7Av4JmeMvGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOCdG9sbHRsbG5fY15hYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrCh3V2p8zMy83KxsLDy87BvLi8urB9d2u8yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFkW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6zbw762vsC+vrqmnKqzt8PApnt5e57ExsvIwcPAwMnKwb+7ubGjkYV6r8jFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4dGhwXlxfXFpRRUVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xbdtrs69trnAvKp9bmhubXSCl5l0en6avr/GwLnAvL7FxL29uLKupKeSkp3Kw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d212e3FvalxgYFlTUEFGSUdLQEVDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2ydoKzvba1waSGaVpeYE5TW1xwdXmEo7i3wrqzu7e7vb+6u7uvoqitnqSBvsXDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dndvcmFfZl1bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJp4R4i6GwtZxqZmdWWV9JSU1QVG55iamwt765srWyvLm8trm+tZaqvKuxd6zKxMC9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF1d3R3cmxgY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqmHe3aMoZhfU0NZVUhialVPRUpjkKSur7a6tbSyrLy5uLW4wb2Nor6vsHany8K/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c25jXmdZXV1TT05BPkpCQEpKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+0kIF5iJBuTks/ZVlCT3iBk2hNQl6EsbWztbK0r6y7uri2ub/Fd4q0p55mqr+4tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2r6qwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWpsXVxrVV1bUE5IREdNQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR8WEZBT4dYSkpZeI6DY0FUo7mztLKwsa2wubi2u7e7vZKjs66kdKywqautq6OooZ2dnpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodXRvZVVhZFddUU9NSEBJUkRNQz04ODc1Ojc8Pjo7PTg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmJmVaE1AU3lxUElJS2icgFpFVK+7sayzr66srba2srS1rqmnn5qbnp+mqJ6gqKmfoaeWm5aXjp2Uj5CWjZebpKigoKKioaWlnaOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpuZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqGIeIN8dn96Y3dsbl1RaVVQT0dQTUxDUFFAPjs+NDk6NTs5PTs6OTw5OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqqlvGdEU5t/UVhJS2FKVo5iZWSCr7WqsrSuqquvsLKzraWdkZeTjpegn6KgnKOkn56olJuWl4yXkY2Ql5OYnaOqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnx/dXZ9bmt7ZGhWUmROSkhHT1NOS05IPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgqsa/yp9PQXOYc1BuSkxjZnV0YFxic5Gyr66ztaqmrKuim5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6WqqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd5fGV5eWBiU1ZhSElKS1NUSVNRTTk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKXGxoxXU0pmpFpmfW9yW1FrY1xmYmBskbSwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk9PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVpcnd1cGN3dlhXY2BkaVpaV2etrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO2uLO4rbK0pKCdpaCsoaGioaCamJaVn5ubmKWhoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgoB9eHZqd3VebVtSYUlSVUhGVVdKQ01HPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgpH9vgnBgY1hMW1JaTExRWVJITk5ImayqqaSfn5mSkpSYmJaWlYyIi46VnZydnZ6Xnpmmn6CopbGqp66jq662sLSysa62uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5uLyvs7C1wry3vrOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaG1cWFxDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjnpyJYldeZWBXTVFHPT5AQ0Q/PkJSeKmtqaqln56foqOdnp2anJuUk5WUnp2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2u7vAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Oqs62qs7Svs66qr6OdrKi2sa2jsKago7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2t1cnFoVlxRRlVIREpQST9FQTRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBRRkQ7Qz9GPD45Nk5+qrOno6OioJ6lq6aemJyUkZmdmZWMioaIhnhtiKCkoqustLy2w72+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8PKysPBx7+6tLq7tbu3sLayqrqyrru4v7u6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZVlbRktMRURUTUVDRTc6Pzo1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8+PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXJpYVdORT5JWnxvYUE9XI6urKCZm5uenpmXl5iSjY+Xl5OOjZCMgoOCd3JxbXCPpq2utLnFu83Hy77BzM3NzMfJ0czMzMfJxcbM0NLVztPJvcC/w7vGxcjF0dPN1NDT08zKwsXGxsrIz8DJ0czHxsjGwrzDwb+/v7a+s62/wMPDx8XHxK+/ubK4vMTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl0c2ViZ3JvZl5aWkNOTERGUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPzxAPz45O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWlmXFRJREA/S4aepJiDoLKto56cn5qYl5SSlJaRkI+MiISDiIeDgIGBgHlxcm9seaS2urm+y8HT0dPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0tfS1dbT1MjMx8zNytPNztPNxsnKysLGzMfJyca/w7OzyMXLy8vPx8q/vr+9wcbFzczJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amRWV1FETkZASVFDPkI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZthU0xKREM/Q1Kw0r2yr6acnJygpKGdmpSTlZSJfXhxa2ViaHJvcXuFioB1cG5xdHCFs8O+xdHQ19bV0tbN1NbX1NPR09TU08/SxNDT1tjV1tLLyc7Ry8bN0crS1dbZ1tfT19jO0srP0czP0MzT0MDJyMrEzMzMz8/Fx8i2wMvA0s3M0MbKycDEw8jOzdDRz83LyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2BlcmNdUlxJSkdBRUlKPjtBOD01NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWUlAQURBRlF2sq+mmpSXn5yaoKCem5yalYl3aWNhX19gX15fX11hbHVzcHBvbHJxdZLEyMfU1tfX1tPW0NXU2tTUzs/V1NTR0czRztPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1NXMz8/KzdLLz9HAxsPIxs/O0dHSyMzNwMvNxtPPzM7IxMvHx8nMytTU0dXP0szTwrnFsaWota6nm6irpZ2yqLCzrayTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWJjaW1fVlBfSkpDRkNSTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9jU1dnZ0c7Qv7zMyba+rqaqqKGjq2VDOD0+RFiCqqifl5WXmZqcn52YnJySfXFlY2JfX2FfXmFgX2BgX2BlbXBwbmtvcnd3nMzB09XT2NjW2dHS0tfP087L0s3V1NHLz83T1tLR1c3P1dXRxdHUytDU1dbO09HY19fYy8jOxMnPzMrMwMrAycrOzs/L0M7OzM/PyMzQ0MvOy8PKx8nNyszS083T0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF6SEZCO1eNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NztTMztLNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzcLIysPMxMbJysvPy87N0M7TzMbJ0M3Ix8vFx8LGyszN0NLH0M/OzszQxcfBuLm9w8O9w7iysr6xu8PDtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21nYGBxaFlYaFZNR0xJUFFCO0M+OzY4Ojg6OjU3PT1AOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD87PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHw7jK1dbZ2tvYzMzPyNbVxMK1r7Son62XeGxwcXmPmo2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYWBfX2BhYWBfXVtdZ3JycHJzcW1yeaXH08/L0NDT1MrFycnGxr/Dxc/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0M/GusS/xsq9w8jJzsXDx8DHzcjEzMvMz8jExNDJxsLGycW/wcfMy8zPwsvMycfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raO2fmiDhaSrk42Nlo+Fg4ODgX2EhH5zX1teXl5gXmBjZGNfXV1eX2BgX1taXGBscnFvb2tsb299udHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMrNycTCy8nBwcvQxcvIv7nCu8bHvsDGz8vEwMO7ycfJvMnHxcrAvsLLxsXEvsa9vcHDxczFxrzAycPFx9LFwcm/ysnGyMbRw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXx3c3RmaVphbm1aXFhSRExGQkdFTERGU0A1NDMzNT88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9Xa2NnPy9LNzc7IwbXDvrGvtmxeen2hkYqSloZ6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpa3Bvc4/HvcrFy8DGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7rGw7+8ws7Dxr6+tcG9xLu9x7vDurS9xsTCw7fAtra+v7vMw722usi7v77Lw8HGwsXJx8nG0MbCzMiyx8nDzszAxcO/vbK3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9kVl5ZSkZKRkhLQUZCRkpAOTo2NTg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrJxs3NztHI0MbV1NXXzcrOxcnFx8G5xb2rrqZgZHWDk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF5oc3FtZ2ducHJ5nb3MwMO6wLitsLGnqq2sp7i0trSzs7S7tr2xt7C1r7K7wrzBxLy/u7Wyur7AuMi5tLu3wcK9uL3HwcS8ta+ytru/tMW3u7Wrub2+wL2xu7awt7qzxry3r7u/tbe1xby+w8XAxMXGx8vFwMbGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IycjKyMrE0M3Sz83Fx8HGwL+6t8m2qrCZW2dwio+FiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmlmam1ucnykx8C4uLWwq6ynnqKpp56qrLOtqqyqtK22sbOprqess7u6tsO5urqxq7W5u7TCurDAsb68u7a8x7nDtq2qqLCywLa4vbCxp7Gztbu8rK62pq62rruysaq5sK67rru4u8DAvrrDv8bDxcC8xsHHy7jFx8W/x8PDusTGwrvGyczLs7nCvbuziXN2dmtpYGJsaVlXV1tBTEtNSkVBQ0BGQTo5Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHE0MfNwcPGv8TEw8PKwsnKv8C8wrqztbXDrqqwkltqf5KHjo97eH2JhXp7hIF3bl5dXFxdX2BfX2RjYmNkYmBfXVpbWlpdWlpaWlxlbm9oZmhpa25yga26sLWupaSmppqgpKCZnKWrrqSooquqrKuwo6afqq20trG9ua+3sKiuuLSzvLi0vK+4ubayvMGywa6lqKOrsbKzqL2qq6irra61tKaoraGkr6mypqiorqaot6yxs7e6uruyvL6+vsS/tcLBx8i3vsDEt8TDv7u/xMK+xMjMyr+/w8DAqYdzdHNqaVxhb2RXVlhQSFlSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Nw8e5ucvBy767yba9w766yrfBw8G0try2sa+1u62oq5JkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXl1cWlhZW1tZWFpcX2ZrZmRnZWhrb3KFqqWrpZ6coKSUnaSal5Ghoqmjo5+lpqemraCdnKSmrbKwtrensa2oqrSrtLqxtrautrmzsLq6sbeloKSfprGorKm6qqSnp6insq2gqKefnKSmrJ+fp6SgobGtrayytLO0sLW8trvBwLK7vsPBsbm5wrPBvsC1uLy9vrzCx8XDxL/AxKCEeHFsYmZga29gVFlfSE5nT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci0tr24usC6vbagnpSdoaa6tquzs7uzxM/Jy8PGuLfHwMy/uMm3u8W4s8W4s7/ArLW8sqylr7OtoaORaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBhXlxbXFxYWVhYWFZYW15fZGNiZWdnZ2ttb4idqZ+VlZqglZqimJWMnaGip5ygn6Sloqeem6OcoKuwrbG1pKmqqqyspLS4rbewrLO2r7O1r7Cqn56fo6Kypaaqua2ipqagqK2rmaCgnpmdn6WamqOcnJ6vqauoqqytrbCyuK+4ubqwtry7uquzsrmzvbS2sbG2tb+2vcC+w8K7ur2XhHtza19lXmRkWFRXXklXXEtQR0pKR0E8Pz9AOz88MDU1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnHuLe+t7LCtLG7u6y5urGinqmrp5iej21+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRmZmZoaWtyjaeckpOTmpaaoJWVkJuioaienJ2lp6KlnKChm5mvrq6vsqGlo66rp6K1sLKyrKmvs6e6s6a2oaOfm6OhraOiqraro6OmnqWmo5aZnZeZm52gmpeenZ2craGrqKOkpq2rsrOqtbCyq7K5tK+qr7Kys7ezrqmtrrK4sbq2ur3AuLOxlIZ6dWZfZl5bWVZTWlVLW1FMSkVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/s52lo5ilscK1tr2ttLjBzMjGv8W2wcDHzrfAxL2zubmyv7axubutsrSvn5qkqqCUmo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanagm5KTj5OVlp6WmJOXn52hnJahoamkn5+pnZybq6evsKuco6S4qqGgrqi2qqeorbGkuLCkt6CjnJmZqqehm625sKOhpJyioKCTlKGUlpabmZiWl5yVn6meqaSinaOqqrGtqLSsqqets7Clq66zsbCwr6+nqKiyrrK1sLy0uriuo5WCendlX2FWWVhTUlRLTV5MUExHSExLRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyZoamUkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JiY2ZpgJSRk4uQkpOZl5yVlZufnJ+WoKCnpqSnqKCdoKagqq+mn6Kjt6ihoaKos6KlqKWwprGtrLWeoZ2WlamiopStsrGfo6Oenpibk4uhlJGTmJiTl5iYl56nm6eiopqkpaWrpKWwp6Wjq6ytpqiur6+rqKqqs6amq6+0sa+8trGvr6CSe3hzZWFcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLe7vMHFurG5tcTJycDDxsXHtsXEs8G/xau3t722vbq7tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWltZWVpbV1VYV1RUVlVSVFJVYGFfYGFfYGFjZGmAkZGHj42SkJKck5WWpJmgl5ygpaKtpqWlpKSjnaqrpZqfpbGqoKGepaueqKKfrq2pqa6toqKilZiim5yQq6mxnJ+in5+XmJOJnpGNkpOWkJiYlJyho52koaKVoKKlppujq6WipKqjq66lrrKppqWmprSmqqits7W0ubqwqqyejHNxcGBbV1ZWUkZQT0haXE9SSlRMU0xFR0pEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuyrZ2op6+5ubPAybq1wK/FyMy6wcrMyLXJvLG9w8mtsbjBtbzAvLS1qqymlZmbm4iBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXFxdXl5fX2JkbYyNgo+Ejo+NmJKTkpyaopyboampq6msp6mmpJmlr6WVmqWvqaCcmZuhnq+anKu0oKamn6OkoZSTm5aWkqmqrZqdoKGhm5SQjJmOjJGMko2WlZCeoqCjnZyjlZugo6GXoqijo6iroKuvpK64pqOko6ytqqirr7O3sr21s6uvmIV0c2hbWFlTVVJFWExRW1hNVU9RTFFSSU5KQz0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3r6inr66bqaist7arvMq7tr+sy8bFuMHOz8izxLq3u8LIsa24v7e8vbuztaapoJaXmJaHenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWVpaWl1cXF5fYGV9ioCJfYqPiJCMlpGXmaKgm6CrqqavrKixpamaoK2hlZakqKedmJCPmp6ul5mnqpmgnZSloZ+SkZKRk5Woq6WamZmenpaOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpqioqKCxsKaxvaigo6y0q66nsLWwubXAsa6xq5F+cnNiVlRWTlJKR1ZQUlJMTFhOSkxPUkdNS0FDRkREPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3Njc2MTMyMS0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsba3vL3Bw7GwsbettLS7s7Sio52dl5eUg4B2a2dsbnFucmtwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUk5OTlJXWFpZWVlcXF1han54fXOHjIWOiJeJlJOYm5ieqZugq6amrJ6omqGmnJOPn6Oal5eFhJKbpJCVo52WlpaIopublIyOipCapaeclZWXm5GSh5SOi4GMjYCQi5KSkqCaoKKWlJmZlaKmmY2ZpKappqGgtLKos7ihnKO3rKqupLKyprW8taussaOJeXNuXU5RUUxPRE5OTlBLRk5OSkpOTlFJTUpBSExISEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDEqKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqakt7Glp6SqpaCppqSzqqKyw7W1srPGxra6w8rMxrOsub20uMCvramwnqauuq+tn5manZWUh3uDbl9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFucHRugoaBh3+Qg46Kk5GTnaGPmpyjoqSZpZeinJWNiJmajHONg36Ol5aGkpqQlI6Oe5mPnYyCiX+KmKCjnpCTmJaFjoOUfn50io56kIeTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5mmuKamsaGwrpywvKqpr6qZg3dzY1ZNUk9QTUNTTkxQTUJQUUhJTlNNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBrK3DraiippKdprato6CPlZaSkH13fmZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5UU1NUVVVWWVtdampwa32De3NOWHKPgpeGjZyXi5SRoJmdlZSWlY+XioCUiV87Vm98jJSJgIySjJCGhnOLhZeBeYF7hpOdlIOVjpGQg4Z9k3hxcIaNfYqBkY2Pl5qZk4uQip2In5iHiJaemqGgl6euqa2oqJ6XrrOipq6ZrKuYqLSjqa2jk39zbl9bTlNSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygoKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOuoaamqqCmqaejqa+op7TCubC1sMfCt7O9z7+5r661wqeqxaqjnZiDlJyxopqYhpSPi4d9c3VdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSUZITlFRTU9SVFZYWmBsbWd5gHNQQj9/lZKRfYiVjISKjZuOlpWKkoiGlYd5iX9gSlFueIuShH6EjYuFgH9tf3+Ud3V2eISNmnBRjYiKhnx+eJR2aHeGiH6KiZaLjpGTl4yEioiVhJuNgoSSmpaenZSko6ippaSenLGqoaSkkaaplqKqnKKmqIl2bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUU9HSkQ9NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSoqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa+hp6ilp6ivrKq1vLa4trPBu7aouci4tqiotbaqsrynnpaNf4qUqJaVin6Og4J9d3BvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNSkVEQ0lOT2hZT1FTVFVaboJydX1paFxUkImUiHR+hoF8hYyTgpKai497ho+AdoB4c292cXSOjoF6foqrhHp6aHZ7jnBybXiBi42SeHuAe4B2c3KSeGd1hYSEhXyVioiKjYuAf4SLjYCUhHyAj5iVnJaRn52pnp+gnaCppZ6dmI2npJKgoJaen6SBc2hhXV1KV1BSR0tYUk9KTE1SSkpKTFBITFFMUlRNRklCPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyvLi2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX52hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZnaMlpiNjnxneYF2eICJkH2EmJKBcYePfHd7b2t+rX10kIt/e4aSgHx/dGZ2fIZsb2hzfImMh4BteXF9cW12j3FocYF+jnBEi4WCg4V/d3h6jIZ9jHt1fY6Sj5iLkpqbo5aZnJqdnqGclo2LpZqOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5RVktOS09PSlJPSU5QTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM1MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqGmsKyuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5adpamkoZiZj4WSeYmOi4p1cXttdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXWVwcmyIp6rAfnR5Ynt4b3x5iZB6fYuGb22Mknl0eWpqgIJxlpGLgX6WgEmSmW5od36CbWpkbHmFkJKGbHJsfG5yfIZpbnB/c42JhYZ7fn97d3B0dIaCeYF5cHyOjIqUg5aXmJqQkpaXmZedloyDiZ6Si5KNhpCWgG9qb29vWVZYVFJRWU9SVFRSWFVNTkhNSk1PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpaywo62qqLWvrqy0v6u8w7+lopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxfp4dhmmlzeWV+b21/eouJdoKIhnRsmpJ0dHxqap2PTXmFk4mEjmcxdodzbH5+g3RmZXV/hISFgGdpbHVrcYB8aHFxfG6TjY98dH59cXFudm2Cf3d5dWp5iYKIiYOWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra3BoZlhSWldZWVtNUFVWWVhOSUhFSkpIR0NAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpGZlqOorZ6xnqe6r6uysMKxu8PHmpaPlJmLjoV6hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvsqBxe3hsfWxxgoKFgXqEhoZ5cqGVdHiBc3WUhzVxnaidjqGhhKKFdnCHfId8dIyujYmBaGdiam5ybXCCdWlvWHVwjpuSd21/e31tcm5wgHtzdm5idoN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jntzcXFtYFxdXltZWGBfUk5bWlhXTEhKRkpHP0NBQkg/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKefr5WltKmusa7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dHh4bHdud2NpXkpQRz4/NjQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH6Fg3+MfnWimnp+hoGEmYSbnGGGqp+di4OQjnp3iX6JiI5zi5ePhHtdZXF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHl4a25pXXaGfId8h4eOf4qSl4ONhYyGfXGEf4R9dXd7fIl3cHN0ZmdgW1teU1tnXldQVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkZydn6aRoKqgsaivwLK7xbqWjpGUh3uGdmt/jJGCfYqEj4x4g4BzoISKfXyBf3CAfnpndmtSV0xARTIxMTM2NjY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpohIh7iXl8cXyPjHp9iYd+l4d2oZqIh4+SlKWNrapIhq6vr4uBgJOKgouChJKph4CYmIqcdG18gYaHfY5oZ2h5f26Fh4KFcYSGR2yAd3J5dmhta192fYKIf4eEi3mUnZyJi4iRf3p1i3Z8eG1wd36AdHRybFteXlxjY1hnZVxUT1BWWVBETEtGTklDRkNDQEBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeRjpaXkpegnq2hprivs72zl42Si5iLfXRwfomSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTVBXYFhwWVxeaY2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbm6atk5q7sae7x8Ooi4yhpY+UioGRfHGDnp+RnH92hoWLkIeQaWhwhIF0jYeEinGGgneHf3t2hX1udnVmf5SOh4iIh4iHoKuilomOl396goh5eW9na3h/e390bGVeW1teal5iZ2BaT0tOV1JRSVBKRE5HQ0pEQ0BEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3g3uAjH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koWSlX+KgJKbjoOAgYyKgomNg3+KgG1wal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJTUlNTVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElMTEtOVmBjf2dnbXWdm4+akpOLjY6aiJOPnYugoJKjqqWjrJOptqKowcKux694upSafI2hnpmEk4WCjqKfk5iShIqFj5mRlmxwdYqMgpaMjY53j4RxbYWBipaRg4WIcYigloaSiY6PlqS1qZuNlKKDh5ODfX9ramt9gYKDdWNeZGBbZ2xdbGxeV0tHTlJRTUxMRklQQ0RNRkJDRUZCPTk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImGkIeFiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTlBSVFBQUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6WimaGXopScnqieqKufqKypqraXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiJWim5t4en6UmJKhk5eXgZSee3eVkquyiY2Xn3yUnZuNkpWYo6Kmtq+dkZmoh5aPjYGIbHNzfYF9c2lgXmJgYmhkYGdmXFJFSktQT0lJTEZGTUNITEZHREJHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQk1RUlNRUlNUUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2FkHeViqOnqrS9uKStrKynqLSrsLaysq27sbO9nLPDq7rJy7fDv7ilorCzrK2qo4uWmIWmpqCjl4GmmY2iq6iliIWUpKGgq6GkqY+bsIuVo6a3u5uho7CSop2inZCjoauvrLK1opSkqoiZiZKJlXp6foaAaWJpXWZjXmRkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoY1dpb1h6hXaBk4WHgpuDkpCMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOEgYuFhoiShoKEiYaIh4dxbmFARTY0PDMvMTEwLSwrLTEuLTQ/Q0FNVVFSU1VVVlVOW1BHSEQ8Pj5GSENFQTg7PDVDOz1GS0lHSFFPUFeBkqCErqOzqrLAx8Oqs8W2rLO/s7i+tr+0wba7uqO4xai2yce1vrm1qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6orra7srqsr7Wisauxtbu3ta60oKeoo6eaqa+tsrm3uKebtqiMpI6Rk5+GeIKEd1pjZVdnYmJkYGFmYFtVSkRETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRYmNXeXVwgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhIGOf4GJj4eAhoiFiYeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWUF9VSUtLQUA/R0tGRUQ7PkA3RDc/QkpKRUZWU1Bej6Sto7G0w7a4wczJtrvEvbOzwLa4wbW+r7d0sbOlusSksMa5sbOxtKiktbaqsaCilpuikqWwrqatrKekmKCstLuiqLK6tby/zL/Fxb29s8K3ube/t7q3uayssKWwqa29sLy6wsKsmbqok62Pl5eqiH2DfmxYZGJZa2ZqZldcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXU1lVWnZqb36OhICNhG56c3iHYrmhmaKIlJSWkpSTjZCWkoeGe4aBjZWKgISBinp8i4eGfYqCgYqDlX13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUVJYWFpnWVRgYExTUEVBP0lKSEVFQUBDPEU2Qj5IR0pMU1pUXZOuuLW6uMi/ur3JzLu8wLy3tbu6tr20urHGYHWypLGanqu9qqWoq6ukorK1oKunn5WWn5ifrqWnpqWfo5Sjp7G0p7KzvbbBvtPJydPHw8XMwsrDwL69vru8t7SvuLe2w7nFvcLHr565qqGrjqSotoiBgXNgY2NfWGJgamdSWGBWUVVJRUVOS0A+R0Q9SkE9QkA9Rj48SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5MzczNDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnNzh9XAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWin6Df4N4e4uDh3yLeYGKgpd+c316a2ZwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RVWVVKREJLSkhGSEhIR0FJOUQ/SEtUVFZcWluTucC4vbfGwLu5ysq6trm1uLmyt7W0rra2mWR1qJytcF6irJyYoKKbpJ6rpZSfn5CUjpaYl6efpZ+empmDpJ2spaqwrbiwvbnU0c7Wz8nM0szPzsrGv77Cyr3BvMHAxMTFyr7IzrOku7C0r5qruLuYf3ttXmFdWl9hWmRjUFtgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/Mzc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NEQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5aSkJRubG91dYezrKGgn4uZnJmMjJWRm5KFiop+iIeMkIuJfIGEc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlnamloYGZpaWxabXOWraS8iIdnW29oXVpaVEhLTk9KS1BLU1FITEFKR0pPX15iZmlhl7fHsLiyu721scTGtbC4sK+7q7Kxp6u3q421p52ap5pOmp2Mjp+WkaaYpZWKk5OJkImQkZGdm6GXmpWWh56ap5usr6iwp7S01NTU1tLL0NPVzdPPzcXCydC+ycnKydHHzM3C0NG3r8O8xLmltbrCooNwZV5eXllhWFpmWlFdV09QQkJIRUJIO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlVnOQkJiCaHFveXmDoKqepZaMmpuXi42VkZqOfYmLhI2KiouQh3yEgnB/iIGGe4dyg5KLjn1xeHVscXh+cXtueHNsaYFwbWNqbXB4aXd8fsu/wd+nbmN4bmNbYWBKUFJVTlleUF1cTlBOVFFVVFxubXaCcZatuKy0pq+2qqy8wLCrtKakuKarrqCrtKOOsa2al5iMkZORhI6bgY2mkZyJg4uEiomEi4OUlZeXk5yRnJiZmZ+eq6ykp6Ksrc/S1dHNzNLU1NDU0c7Iw9TRx83S09PXzNHRxdLWxcDOx8fCqL63zp57cGdfZF5YYVNeWlBRVFBPSD5ARkFCRTxAQj5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlp1hoWKd2x3cH1+f6GenqGLjJiTk4uMko+WhHmFkJCNiomHkYZ+gXtyfoCBh3qEdYWTkIh/b3Zya3N9e3Z7c4F4cmqAc3JpcHF6eXJ6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1hkalNYXV1gZF5jeHp+i4GYqaOkoZ+gqKWqsLiqpbOjoa2ho62hp7Gfiaaak5KRiZGPiIGUiWqUooyZhICFfpGDg5OWrYuVjZWajoaSkZ6Xp7ChoKGlpKjIzs/IwsvR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuMdHBlYmFZVVpUXFBLR0lKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuViY+KiI2Hj4B4hJSYioyIiIuIfoJ4c3t9g4d3f3qGkZV/g253cG11f3V4fXSFfHlsh3Z0bn12hHV4fJ21jDtBi8Wlfox8aWVXSUNmY2VjZ2pkbnhbXmZoa25pboCDiJGLnJ2gnZCXmJ6jo6axo6Ozn6GlnaCpoKOxnIaekpKSkIqOi4aDj4R+nJuMjYKEhXqUfoKplaOMkYqXkot9l4qakquzmJqcqJynvcPGubbGztLQ0tDL0svJ1M7Q1drX19jU2djN2NvOydna0da+y8u1enhwZl5bU1dSW1ZGR0pJRUU9Ojc6QEBCOkdEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NTQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho19l5Gdi36HkoOJhoWJgYd8eIWWloiOg4eFhnqEeXF6e4SGdXqFjo2ceYtwfG9ven9xe4Fxg4eAbo56dXd9fIJ1fnuGh69zWKnCto2RgnBuYj1eaHJwcXBueHaBZWhvcnV4cXqMh46TkZuVn5WHjJOboJueqp+grJyhmpifpZ6fq5mLmoyQkY2EfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yNlIyGfJyJlI+uqpSVmJ+Zp6+1vamtvsfLycnMy9DJw9LK1NfY19jX1dvX09nb1dDa2tHWyNTLlnt9amlcW1FUVF9IQ0ZJSD5BPT03Oj0/Oz1HPT9BQUFEQT4/Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ2NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo6RD9DR1JqXm1kYmZrdoCIcpGPmoB6gI1+goKBg36De3yEmI2Hi36FhoB2gnlue3uHgnR6kp6NoHaOdYJ0dYF9dICEb4GPgW+ShXR8gIR6doZ7iLfFpMHJuIGWmo93cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSVj5eQg4mOlpmXlqWcl5+WnpORl6OdmauVkJCJjJGCjIWIiIGGkJGem5mJhYyBhpd6iIifl4+IjYqLgn2hipGMvKGYk5eZnammpq6fqLa/wMC5x8rOzsXNydHW1dXZ1dfb1NbZ2tvX29ra2M7cxod9e2lrZ2FVWFZWTkxETUI7PT08ODo8Pjk9QDY9P0A9Pz48OTg2N0RBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NTU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjJJ3dnqKfH6Afn98hHp9gpGJhIV6hId6dX51bXx9hn5zfpKekZ6DkXyGfniOfXiKim6CmoB0mYZ9gYiEe32Qeo+pjo/Dob2LnKOdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWJipCSlY+dmpOUkJaNjJWfnJSglJGNjY+KfpCOjouEiZKWmp6fiYyUkp2Rgot/pZmIhI2ChYSBpYeLi7iYnZGVlqKooZ2enaOvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27h6e3pta2dYYlxUUE9JQ0xBPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1EUlNSWF9WWGZtbW1pgY6KcXN5int6f3x/e4d6fHuLhoJ9dIOFeXJ6c22AfoR+d4WcoZqdlJKAjIh/mIeAm5Juh6iFeqCLfJGNgoiEm32akIqMo6KgkKSuoIuRi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5SMhoiMkpOMlJSUj4uPioeWm52PlZaQipKThYCLiJKNioqclpmio4eTnZagiomIjZyQg4iOf4OHhqSGjJCzmJ2SlZehoZ+ZkpydqLK5rKa9wsfNyMbPzNDMz9fQ0dSu1tXY2tja2tfW2dmfcX92aWhfXllUWFlDQUhDPz4+OjQ5Ojs3Ojs7Mzs7Pz0+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnltYn6Rg29teIt4en96gXyFe3t2hYR/c3CEgXp1dnZ0hIOFfX6SpqSfpaKWip2QlJeLiqiXcoqxjYSnkoSZk4SZjKKVn5iTiJqeo5Kpr5+QlZCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzceVjoaHiZCSjY2TlImFiomFlpmbj5CUk4aUl4R/j4uZiI2QqpeXo6OImZ+WmoiOh5eXioSOjYF/iI+liY2TqZqXk5eZoZmfmZOdm6OztKajvMG+x8XFycjJwsvTzc3UqdLR1tbW2NrU09rOg3OBaWVgX19QS1ZcQkJGQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnWCjn18bX6IeHp+eoGBgn52doCCe2xuin55fHd4fISHi36Lo7OopKuyoZanoKWklpWuooOQt5WSs5mNoaCLpJuvoqSdmJCnl6mZra+kl5WVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinJiFiImOlY2Lk4+HgYaHiJOYlIyLk5OGlJiGg5GQnHSRmbKWl6ShiJyak4+KkIuXmomKlo6GfYyZn4qQkJyamZOZmJ+UoJ2Vn5uhsq6jpbe+s8XHxL3Dw7/GzsrJ0qfOzdPS0NbY0s/Yu3N7d15iV2JYUUlKT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTltcWUpnYTtIhIp6e22Fhnl8hHiAhYB9cHh8fXxvc4x6fYJ7eIaLiYWEkqe8ramyva+lrrOzqKOisKyKmrWeorilla2kl6mtt6ako5+ZqZiqpK+wqZqZnJSVkZigl5m7u63JoGm2uKuwlZifoquSl72jXqqygomKjZWHkXyPjn2Dho6PlJSIh5KWi4+VjYuNl5mSnZm0lpWrnouclJKNkJKMmJuKkp6Pi4mVn6KOlY6Ymp2TnJielaKglJycpa+ooqWzuKvCyMS1u728xcjIwtGhxsnNzcTW1tDL06JxfGpeXFVgU1FHRD89Q0FCOD84NzQ+Rjw8NjwzNTM0NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OTY+PTQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlSGJgY3BKQIuKfoByhod8gYl1goqCfm19fXx/cHeHd42Bh3uNj4yGjJqrwsCwvsa7s7TBvLSsq7O2jKiyrq69q5u6pKituberpqaioaOjqq+ysaqdnKOYm5iXnqKlpZKjua6owLusrbK5paSnfYiGnK29sIOLjIuQg4+DkY96gYeQjY6ciIiPl42LlZeUkJqWnKebsZqRq52OmY+SjpWQkJaXj5GgkYiVm6SslZaPlJyelKGem5mgoZSanqinpKGksLOmwcbDsLC7tsXEw77Np8fDx8O81tDNxMqJdnVkX1xiXU9LQ0xARUY+QT9COzo0PkE9PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZ0dgaWdaXVuTjIyIe4eLhoOMdYaQioFufnuCf3F+gXqVepKUlJiRk5WotMfJwMLMwcO6x7y6r6u5u5eytrqzwK6lwKSrsLu7qq6roqKep6yvtbCqm6CqnKKclp+wtKeLo7q6tcG7q6icsqSkqJSEjqnDxKSCi46HiISGlZSNeoOMkY+RoYyMlJGPiZigl5OZlJemoK6djKqcjpWPkpGVlY6QlZGPoZSGl5+gs5+Um5SgoZmkn5qgnKCUmJ6npKanpK+tpb/Ewq6pt7XJw762zrLFvsO7s9HJyMG1d3tvX1pebFROSURNS0tJQEE9Q0Q8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2WiYuIko+GiXmGk5CBcn97jX53h4GCkHqNoZaompqYu77JyMrC0snKws28wbOtu76nur++vMO4rMGprLO7vaqwqaSlo6yutK22taCgrp+lopijtL2pm6i8waO2tq+rkq+sqquWhpqppqWRgoyTpZWJgHWKknmFjZGQnqCSjpSLj42Uo5mXm5SUo56pn5GlmoyPj4+Vloh9j5WSkqOalaCinLWmkJ+XpaSjpZ+eppielZecpaOpqKKyrai7wMSvpbO3zMC5rsOzu77Bua3CwsHAmXB7Y1tZXlxNTU5KR0RDSEJCQUNLOjRESDo7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmtJX1hhWmRlVp6PnY6Xjp6SiYp/iZ+ShHiFf5V+f5CIipCAlaCZrqejmMO+ycTIxtPNzs3LvMK3sLq8tLzKvMPBtre8rbTAubytr6igqae2ra6psreanqyip6Gdq7e4qaWvvsSxvbmzp6mzs62ulpWlrKegkY6SscWnlY18kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjI+PnohakJeXkpalmWaZo5+zpZajlqytq6ecn6eXmJaYlaGkqKaetqypurzDtaa0tsvBuKq2rLO7uK6ouLq9uINucFxaVldQR0tTTUs/QUhFREdGRzg1Rk07Pjc+QUouMzIwMjVCNTVQV047TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJyRmlJUmViTEamlJyWoZeoloyQg4elkoiBh4KchIOVkJGUjpqin6++rqHHvsbFyMfOzs7Syr67trG6u7y+zrbEvbe5t7KytbO4squmnKuruKupqLCwl6OupKekpbTAsKqss77CusC5s6e4s7ezrpWlra6upIuTlaGNc8GZfZaZhI6WmouxlZqalZKTmZmmo5Wgm5aaqJyboaCZi4yPlp1gSpacmpSapZdUlrCfr5yfpZSvr62mm6GmlJOZmY6doKeimbSpqrO9vLursLLHwLimq6utsbGjobKytKRycWdeXFBSTUVRUVBRO0hLSUZIQUM+OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UkVXUnNiV0ZIq5eZn6GorpiQl4eLp5aOiJKFn4iEnJePnqCbo6W1ybSpxrzDxMjKycjMzse+urOvubjAwc21yLrAuLW6sa+vsrSmo5uqtLSrqaaurJmkrqWlqKy6v6irtra/wcC/uLOywq+3vaujrrSsuKWIm5emm3a+oISYnI6TmZqLrpahnJuXlZugoameqKCamqqZoaeel5CNkZ2DbnaTopqVnaKfkK6yo6uVqaqYq66lpaClqpOSmZyJlZyinpaxp6qrure9s7Kuvrm2n6OnqKWmnJysqamNZWhiYFNMTUdITkpVTD1NRE1JSkFDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uU2FNVkh/ZV5IRqyUnKGfu66YlJ6Lk6qbkZKTiauNh6KejKSslKOjtse9tMG7w8PIycXCzsjCvbmyr7m0wMLKtsaxwby1u6uprayvo6KYqrS6pqqnrKqdqK+npKurvryorLyzuL7GvLe1uMCwvb+zqbW2q76kj6KXkaKfvJ+JmqCZl56djrefqZylo5ucoZqnpbOim52lnKiqnpmVj5Sai5eJjaSilJyin6C1r6Wmk7Grmqutn5+lpKqSlpWghJCen5yVqaWiobS1urWtqLWysp6coqaal5WZqqGeeGJfYV9MSUdITVFJTUVGRkJSSkhBREdBVlNESDxBR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6SensOsm5ell5mpnJaamo+qlpWoppWtrJmhqrbEwry/uMHDwcjEv83Gu765srC4s7/DyLXAsLy3ubenpKurrKGgmqqqxKKlqaymnqyvrKKqqL+4pqy9sLe3xra1ubi+sL7BtrSytK++o5ajlpOblK2fkKGhpaOjn5C+pamdqKydnaGbpp+9opiknqKpq6Gdlo2VnpOfh4+FjZOepKCdtaymnJayp5mwqaCbq5+hjZqVn4SOoZqbkqWkmpissbaxqqWqraycmKChko6QlaiflGllW2JeUEpIS09MSEVDSUA9T0hAO0dJSFtST0s9SE5VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hNopqjm57Fq6GfrJ2drZ+Sop6WpKCnqqyXtrCjqrO2xcK9wLbAwrzJwr/KyLa4tbWxtLS3wca3vrG4tbq2oKetqqydnp+lpMGloKmuoKSpra+ipqe9tqWxu7e2tcOys7e6vrHDwLi4rrS0tKKcpJWRk6Ctn5ihnaioq6Kaw62pnqyum5uemKagvaGdpJirq6umoZmNmp+SnomOWH+WnqahoLiqp5OZt6Ofs6KhnLCYoI+alJ6Cj6CXlo2ipJWQpq6zq6mioqWllZWcmYuPkZOkn4ljZ1xlYU1KS0tPRkVBRks+PUlBOTlKSk5dUVFJPUxXXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxMT56foZiew6elorOhnLKnk6qkn6OframsnbuwqKy1ssjDwcOzwsS+x8S9xcq9sLC2rrG1r7/FtbqxsLq2rZqpsamqmp6moafCrZussZyqoq6wqaSnvbemtrq9r7fDrbOzwr+xxrO6t6u0tq2qoqWVlZSjq6Gfn5mnq6+vr7uypqCpqZmZl5KipLihoaSSrq+spKafkqGelZ6PkY2VnZqjn6e0p6eNmLSco6+bn5yvkaCUmJSagJKilo+OoKGTi6assKWnop2gnpKSmpSFi5KNnJ+AZGhcaGZLSkxLU0JDQElHOztGPjg5Tk1VXlJTSj5PXl49SFBCTUxJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMKoo6qxoaO0qZayq6aipLKsrqm7sq2wtLTGv8TEtsDFvsrFtsDJwrWrtamxuKzAxLS3rq23uqWZq7Krqpifppetu7WbqLCbrZ+utLKnqrqzp7qzuLK4wKq3ssK8tMWnva6tt7Wpp6yhl5aRpaShoZeXpK+4rbK1tqCfqKSZlJWTo6C3o6Slla6xsqWppaKempqalZion56Yop6usqKmjZivmaWsmJufppKdj5WYmoaWn5SMkJyelIupqauip6GZnZaMj5mQgYaWiZWfemVqXWxrT1FOTlQ9QkFOQzs6ST83N1FPXV5SVlFBV2BcQkpTSFdLSDpVZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnBpVkNXRox5ZkM7pKScoaW/pqevr6Gptaqdua+rpKq0t7Gwubawt7i4xb3Dx728xMLHwbnBx8G6qralrbutwcO3uKqtsryjla2wrbKXpaiRqrmqoKewnaqfsLSzqqm2tqy7rLOyubesubDBub2+psKrsLauqaqrpp2YmKqhoaCRl6CwrrOrsLmam6mfmZaSl6agt6mloqKvsbOrsaern5ugoJuepZ2hl52js7Cbn5CUppqhqZuWpKCXmYuWmZSWl52TiJCbmZSOqamnoKOcmJuTh4+Zi36Ml4aPmmxqbWJublhSUVpUQUNFVUA7O0hANzpYUGReUFdXRFleXk1MUk9fS0o+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYEYoQDhsfWhcVjqJe2NDPaifnKGpvKGqsKqjsbippbWyq6Gstb2vs7i8ur23tsHCv8nEucXDwcC5xb7BuK+2p6u3sry/v7WqrrK4n5esraitl6ipjqe7n6Wts56rorGws6yqtrO1va2vsbWssLWxwLnEtqu8r7G3rKyporGlnqSon6OWj5ifsqqzqaqzmZ2nm5mUjaCmpLSup6KsrK6xp7Kssqmjm5+opJ6VoJmbqLWpl5mSkp+Zn6Gfkq2gmpmHlpmMnZqdk4qNlpeal6emo6CelpaXlIGQlYV7j5OEjJdnbXNocHNfR1lmVkRDTlhEWjlIQjU+XVJoXE5ZXUdbXl1PTVJYZEpKQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVjE1MT1gVl44KUMzWVVcZ0s1jHpmTECkmaCkrLajrKmlrq62qq60uaamsLjGt7G3vsHCtbS7xb7MxbnDwbrAusS4wbmztayqure7ur61q66xtpiYqKuqq5utq4+rvZ6rrrGjqp+xrbOurrayubeqra6yp7WvtLq8ybKqtbSxtK+upqCzn5morKCllZWambGiraClr5ahpJmZko2ipaayqaGmsauqtaSusLWvo5ieraebl56Zmay4opeTkI+YnKGZmJStoJ6VgpSZjp6dmpeRi5SSnpqlo6OhmZaTkpZ7jJGFe42Lg4uUbG55b3V8YUZgalpJSFpbPXtKR0U2QWJUaVpNXGFKW1xaUlJTYmFMS0VgYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLipBL0pHUFtHM2NZVEtEmZefr6ixqaylo66utam2tLejq7S3yrq0u7q/vrW0t8PBzce8xL23v8DAuMC9sr2up7q6t7fCt6yusriVl6auq6ejs6qUr7qkrbKxpqeisrOxsrG1sbeyqa6rsqe4r7WzxMS2qbS1q7Ctqaeitp+eprGgpJSbmJSxnaebn6mNqaKdm5WXpaWktqeisLOrp7GnrbC1rKSZoayonJydm5SquZyVjo6LmJyimJGYqKOgl4STl5GenJiXloiWj5eaqJ2koZOWkpCWd4WRh3yGgoSNjW5xeHZ8f11LZWxcSk9kXD9ie0dJOEdnV2VbTV5iTVhZV1VYVGldUE9IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNya0tEQ5GYpK2krK2rpqOwsrOqtrC2n6u1usi5rsG7w7ezsrXCw8/EwMK+tL3BwLq/vbPEqKq5sba3wL2wrLOznaCnsK2lprGlnrK1rKuysKypqLS6rLSztay0rKmrqKypua2xsMe+uKS5r6mtraanrLClo6Ouo6mcnZuar5mio6KjkKyfo6Cfoammpbikq7S0pKqrqKyutq6inaOoqpygmZqSpLSZj4mNh5GjoJaOlZ+hlpSGkJSUnpuZlpWHmJKVmaedoKCNk5GOkXh+joV9fX2HiopydHN/fn5cUmRuXk5aZ11GRJZbRzpObVhiW01hYk5WVlZXVFlnXlFSTGRaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZTs2KkhkSEorOkk/M0NJUyw+j2s+SEmPmqmqoamvpKejs7SxtLWxsaGrrb3Muq7Bu8axtK20wsPRxMa/wbO+w8K8wLi8xaitt6yzuLzBsayyraGkp62pqKSxo6uxqq+rsa6urauzu6e3sbKpsqmrpqWjrbqsqrDCubSsuaipqK2pp7ClqaSirqqoop6coqyVpJ2XnpirnaGnqKGspqKsq7exsaCpop+qrbCsnZ6mp6mao5iZj6ComIaDjoqLn6CQjI6XnpGQh4iRlaGdlpiWhpaTk5elnZ2djJKQjoqAf4iFfXeAh4WHdXNyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlPY1xOVVZVV1BcYV9UT09oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5JZ0RGODxCMDVFS1gxQJRcQE1GlZasp6GpsZyoqbC2rLi0rqqkq6u9ybuxvrfDr7Cts8TEzs7Dv7+0wcTEusG0ycSsr7eusrrAv7SurqulqKqwqaaosqa0raqwrq2xr7Oss7qkuLOsrK2nq6CinrC3q6qturaktbWjqaisrKqsoKimprGyo6aloaGrlqmgk5qgpp6joqqkrKKeprG3rKyipaKaqaqtqZyhpaSkmaCalY+YnZOBgpCJhZ2gjYuPjZuQkoyFjpmknJORm4yTkZGUo5ubmouOi4t8h4GCgnt1gYSCfnV3i6SHeWteYG5nV2aHZE5AZ5JMRGJ6V2JYUmVVTVZVVVRPXF1hVktOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQUlIRJaRr6Siqa+Yqaittau2sKukq6qpvMHAuLmzvLWmsq/EycvRv8G7ucDAwrrBusLErrG1srS7wb6zsq+tq6yotqqlrbCrua6osLCusau1qra1prS2q6ykqaqco52zs6iopLO0oLauoamoq6irpp+rq6i5tqmpqamhqZ+tm5GooZ2go6Kmoqqdm6a0rqelqaKjl6Wmp6qcoqOjoJmYn5GOj5iNfoeNh4WenoiFi4uPj5GNhYeWo5qOjZqRkpGOk5+YmZaNi4R/dIeBgH94dYSAe3h+gIidj3ByZ2dxeFxhdIhpT12YVkhteVVkVlJjT0xWVFVRT1haYlZIUGpUVlNHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdRRTuVja+gpaqsmaqkra6ztK6qpa+pqbu+u8Gxr7itorWvycfI0MC/vbu8w726w8HAv6+xs7K2vbzBsrKzq7SppbWopK2zsrivoq21sa+xuaq4rqqutquqnqmroKOhta2poZ6vsqG1qp6oqKqjqqGhrK2ova+srqyhp6efrJmPr6KYoqCop56nm5ipsKiin6yioZKhoqKmmJqopZiYmJ2PioeUiHyNhoSFpJaGg4KMh5CPkYWGlKGXiZGdkJOQjZGdlZePioWGeHOBf310eHqBe3R0e2qCiKR2aV5lbIF1Z4iLfFJXcF5LeHNUZFNRX01NU1pnTk1XWWVZR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1pOjM4Xz1hZD9GMUNQW1srSFA7WUM0j46xn6SlqqOlo6ymtLOwqaSwp6q4vsG8sKi5qqeusMnGyNDCvcC+ub6+vMm8wrmxsLWyury5wLO0u625rKO1pqessba4sqanurWttLyvu6WtrbWrrZypr6Sfpayqp5ydqrKktKmaqqeqpKmdoqioqb2rtK+tnamjoK6bmrKilqSbpKWfpJqZp6qlnpqpoZuRm6CknZiWqamRmZmSkIuCj4V9j4KAiJ6Ph4B+jIiSkJCFgZSblIaTooyTkYuRm5OVh4l+gHJ6eX58aHd8e3Vxcn5phnqEiGRgaGNyhXttaHldXlZDWHttVGFQUllLS01wdF1JWltoWkVWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6SsJmfn6mlo6GqpLaysaSpsaetucG9tbCjua2oqLDDycjMwbe9wLW3v7rItsO1tLO1sr25ur22rbm2v62is6aqq661t7Sqnbq7qLG/srqgr7S2qayerrGjnKWnqaOdnKSvpq+hn6qpp6GpnKOooK27p66xrqCroqOtnp6sppifm6GinJ+amaKqopqZo6OVlpOeoZablqasi56Rj5GMgop/f4+Be5qUjIl9f4yHkI+MioaTmJGHlKOJkZGHkJqQk4GIfHlsfXZ5eGJ7enJwcXN4aoJ1aoNnY2hhbnOObWJqcGBvQl15a1ZeTlFRS0lNU1lWTVxebVdEWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPSORl6yYn5eno6Gfp6O3r62ir6+pq7nCurOtn7mvq6i0usfKyL+3wr6vtL62xLbDsrC6sbLAtru+uKm5uL2qpLSmqKqvrbiwqZm5vKOtvrSzoa63taemp7CzoJ6kpaehpJmerKionqCqrqegppeiqJ+wuJ+jsa+hq6GtpJumpqmampufo5Wcm5mdqaaWmp6okZiSmJ2TmZahqpCaiY2Ph32HfoKNfHyhjIyIeYSNhYqNjYWJk5qOiZWfiJCVgoyXjZF9hHtzcHxxc3RgeXhqb3BxcGp/c2R6bGhmZGJmh4BgW3JqcU1OgGlYWk1RTEtIUFJRSE1cX29URVhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrKCeoaSht6qwo7S0qam6xbayrqC3rK2tsLXFx8C2v8K5sLW8tr67v6+svrCzv7K9w7mpu7q4p6i1qKerr6uzr6WZvLakq7q1rp+xuK+ppaevspyhpKCkpKGWm6+moZ+jqK+hoKKTo6SitrChprCrn6ujr5ebqqWon5ianaSTmpuZnKWpmZubpJSUl5WcjpOXoqmhkImKj4Z6g32DinmPl4qNh3qCiISJjY+Fj5OYjI6WmYqOln6Fl4yPeoB6cHF2bm90X3h3ZW1sbGpqhG9mcmlrZmleZHSBYFtrdmlaSn9eXFhPT0tISFJVRzM5Xl5tUUVYVlllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyZFcsMpShoZeUm6qdpKGiobeprqC6uKWsvcWzsK6jta+tra60w8O8s7+6t7Gzube5t7qvrsCztLmvv8G4rL26taaisqmnqbKqrbGgmsC1pKe1taiesrypp6Wpr6yZo6ecpKWUmKGxpZmfpKipnKKfkqSfo7iopKetpp2loaiSn6iioaGZm5ygkpqblp+hqpuamKCUkJOWmY2Tk6OopJCJiY6GeYR6g4V9nY2Jiod6gYSHiYmShZaTkouQlZOMjZR7gpeOi3d+e2x0cWxsc2F3dWlpamdnb4ZoaGljZmlqYGtjamhcZXtjYFN0VFxbU0xKR0lPU0AhKmleak1EV1VeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKdoqORjaSnm56enaO1rKequrenrMTBtrCso7Wup66vt7+/vLLBt7Cusra1uLa2raq9s66ysb2/uK68u7Gln7aqpaWzqKqtnp3Aq6ilr7KprLW7nqipq7GlmJ6pnaakkZmmraKYnqSpoZuhnJafnae2pa+qrqGhnZ2hlKCmn6GgmpuZnJGYnJOlnauhl5aclJKMlZeLj5iaqaCRiImKiHmFdoGCgp2Ii4KJfX+FiIeGkISWlZCOkJGQkYySe4OVjoZzfX1meG9ramtndXNrY2dkZHaBY2VmZmZqamNrc1pfWV1tZGFOaVhaYFZKR0lLTVJYPjlfbGlIQ1VTXFtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOfkIytoZiYn5aks7Gisb22obHGvLqxsaS3rKquqbm8u7qtwLKurq62rrK4s6irubGvrrO2urawuL2spp61qqCgr6OprpyiwKCxo66vrbeutZ6trq2topqdp6mln5Wap6WfmaWiqJ2an5uUnJ2sr6W6p66ioZqanZmepJqknpeemJuUmaCSqJWpp5qTmpqRi5WZjpSUmamnjo2KiY98gnSBgYqYhYd8iYmFhYqMipKElJyTko+QkZaOkH+AjI2CcIB+ZnltaGtpZ3Fya1xoY2N0gWJmaGpubGdqamhuXWxsdHBhVWNpZGVaSUZMTU9YUVFWYWWBVEBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJGhmo2OsJ6ak6GZqLKvn7i/tqC0wru9ubGmtrCorqW3uLe3rbuurKqrtqqzuK2ls7Wyrqmwt7axs7W6pqmftaidnqihqKyap76YraOurrS1rayfsa2vqaKcnaOrqJyUnKaknZqqoqSWmp+ckJujq6qpu5+npKCYmZmdoY9ropaZnHCClZqjf3WRqaeelJSekIiXmYCWiqGQeIaUjINuaX52g3FshouGfYSMh3BeY2FnhJiGbIuPlJJ0d4uEfoOPf2eGgGd1aGVXXGhzbk5QamNnc4VnX2Rmbm1qXWBhio+DhGVOS0Q5RlRnXkpHUFBUVUtIUmBvdGVGWlFVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Lo5mGlbCbnJOgm6qtqqO9xa+puMK4vbytp7awpaujt7Oys7G5rammrLSmr7WiqLi2tqinrLezrrSts6GpnrOqnqGjm6WmmKu6laWlr7K2ra6kqa6rrKWhn5ygp6ebl6ClpZubp6edk5+fmJCep6qjta+joqKdlpeXl6OIoI6Smoehh5OcoH+kf6WqnpKRmpGIhHJ4jY6FiKF2iIxpl4hmfXJ4oW+Ih4R+jn1/oaCgmYB8h550h452m4psh4GDbGhlY3prcWFThW1jbGmYcVlqcG+IWF5pW2xsW4hxbnpyhWeGhFpeR04/R19NRVJWVlFRUldUZ15NV0lSU1BGR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoi6aWg5yrnJmYnZ+qqqeqv8Ovsbq9t8C/qqW3sKmtpbK0rq+zt6qppbCtpbSznK21trSmp6izsa2yqK6dqqCyqKCjopmhoZqts5SjpKW1vKasp6uqrKiloaCYoKajmZmlo6SYnKSplpSjnJSTpKWmobejo6CjmJWTl5KciK+QmJSJqYuXoZuFsYCjrJ2TmZ2UeYPUqICHlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxl7ycxXpytaa7kHuAbJaxq7B4aGtYsa5uZWm8krxuaHpvcpDYflNrY7ayf4FylXSaoaqQV09XYlBWTkZVW1hRUFKMXFdcUEBcRFFORUdKPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mkoCnqp+XnJ2lrbKoscK9srXAtbe+wqums62sqaeus6mvtrSnp6W0pae3rpyzsraqpaSnsq6usaaqnaeksaOin52Wmp6drquUnqKfs7mjqqmira6loZ2bmqKnn5ebp6CfmJ6np5Gcp5qTnaGmoqCwop+fo5aWkpeSmYWva2qKjap+Z4OVhq1kcJ2dlJmllHGuoaR+eLt9a6GPdrFfarRbpYBmnJFgZoJ6Zn9qeGupZL5yZ6aMdbFqfLF4dJKTY21tp25bhKBFaGaHlkV1nGB+aHykp4JZX4uraYCWeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TolPWFcvSVRUSkRGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCrKelnqOkqrK3rLS9vrC2xLK3usKnqbCrrqmpsK6jsLqvo6StsqOouKies7Kwo6Wgqq2vrK+mp5+jorCbopuWlZaamqyllpuhnrOyoqucoq2toJ2al6ChqJyYnaOfnJmhpqSPnaKal6Cfqp6mpqCbn6GVlZGWkZqFtZu1eIWpmbWZdoazm7d+k5aWqJR+bIKme4KGiJKUknerZ2uxW6t7j4eUdIlxj4aAf4iQl3iCgouYjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXN1U5OHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVhYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+Vh7OmpqCuqaeyrKm7tsKwu8KtuLa/qqytra6mrbGpoa67qqCntKyjq7WlprOzp6OinaeqsqiwqKWen5+vlp+YlJWVl52soZmZpKi0rqGpj6moqpudlZigpaeanpyin5ugo6SjlZuel5mdoqmbpZmcnKKglpORk5Odg9WTmblwsMJ+xYZ81pSbu3yalaSPjZyNpHuOh6SCpYJ6rHmPnVaveoh+n2q5Wrl2h4R9poKTfJh6qnmNnZB7sW6OhHSQvIVvlFCvp8WKUaB6Y2CpYnNziG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITm1NW1JPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcxJZuik5ixqKils6qltKmkvLfBsLnAsbWzurO1p7Gwo7Cypp+ttaeap7mto6+xoLO0sKCknp+nqbCptKikm52eq5eYl5WXlZWgqZyZlqetsKiin4+soqiWnZaboaWhmKGhoaGaoaKmm56hnpSZm6agm6eVm5ufoJiQkZSRnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaN/kaGlfrB2g5HS0nZcrnuFf6Rvm6qma4eFfa19l5mPe7Fzkp2PebNllnSEnm+eZpRSyItawlyfeWJfrWB2dIdil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tgbGhQVUdJOD1WUVpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnZKlr62kqrytprWlp7a7vLK6v7e1s7m6s6W0tKGxsaKfq6+kl6a5raSxsJy0uKqgpp2hqaSyqKyppJmbmqielZSXmJKSoqeflpKlqrCmoZWTrZ+lkpOgm6Smn5WapaahmqKfrZmgnp2QlZuhnZyllJ2VmaKelZiVkZuFrHt3qHajjoiGqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXiFfo+dhpmad6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1edneHaJiIa12vd5Wej3hsNXnIrrJfQlRvXmdgRVBtX3BtVlVNLmVjaFJYUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOjk5n52Un7iwl7TBraizqKmyurezuL+5t7G0u7SkuLOes6yfnqirnpSntauosbGrrbSkm6mgoKihtqemqaKZnZSkoZOSm5iRlKKlmpKPpq2vpqCVmamfoo6RoZqopKCVmaWonZyknqycoZ2gjZSemp2gmJmblpehoJOXkKaehql9faV4oY+OgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02H92iHSogY6bjZKjfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFtMdF1iZ01bYV9yc19KVjZKm5NYSEU9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKGdmZm/q5e0wq6srammtLC3sbW/ubmxsLW6qbq0nq+knqSnp52TqrCpr6m1rKqvoZihoKalpLqio6uglpuRoqCUk56Zk5een4+Ni6iwr6adlpuopp+MkqOXqKqmlJapp56eoKOto6Geoo2VoZifn5Kel5yVnaGVlo6rnI+ubXK0cqmMdoqnc7R4c7OAkaSjkpyNiaSHkHe4b4x7i6Jqa7ZaoIVll5dpoaKnbZNytHSTmH+yaoWSiK1rdbNhnWaib4eSapdcrV9NoXyHkVJzo2x5f35vmIdxXK9WPJx3ZVRvbi5cp09jU2tlYm1aY11hcHtjVFpRPj5tbzNDQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpudu6GcssCurqurp7epuK+1wLW7sK64tqrBtaiooJulpKGckaqpp7WjsqivqqCXnKegpKu4naOtm5aZj6WjlYydoJqYnJ+Rk5SqtrCnmJScrKmXjJOlmaWsopGWqrKjn56mq7CZoaOPmaKWn5uWnJehkpypnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9lYGsqXF7f3W8iKegaZ1hpo6voX6MdIeqfb5uc7x0soN1eIGLbpqIcW6NpHS9Xnd9W2F5vGtaVlxqeV5qYWVnYm14b1lbWUNBQHJAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0I5p5ueobyil7HDsK2qq6yxp7ivtsSxubCtua6twLGro6Keo6Gcm5Cpo6qypLWmraWelpmqmaasuZ2jrpiUoJCln5KMnKOdl52bkZWSrrmyrJWXo6enlJCWpJykrJ6QoKirn5qeqKOznqOljqeilKKanJeVo5iQr6CSlKmehZCZtX+PkYy3lXiCk5q1d21rbnNveY+Ejol0nsG7vZp7gbKocIB0kbmDfIaGjIaNe4qHjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZqjbV0cnF3toxegHp9imiDeW15Y4uscHWFf1lbp2pFZVpUZmBjXmNRaGdxbXVCTVBMRDpaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZWJz47PKeeoKG/pZa0wrSsq6isq6m6rrDFrrSyrbamtLisqaGhpZ6gnZmTq6Stqqa1p6efm5ago52spL6moaqXlJyQoZqRj6GooZOdmJOXlLG1t62YnaSkooqSkqWbpaqblailpZuZoKimpqOpoZGtnpajnpeXl52ej7ColJunoY5qfmmbpXiHcn2ajnR6ZId7vb7Aum+SgnGVh2Fzalpem4phY4iOlWtggJVkbZ13YpVrgJqVlGVeYGNxmoppcox9hZVnan5ydHh9fmJbd3SBaFBcboR9fItrWGx6gnNKSm+GcE50TEVXXWdhTFpYZ2NfT1tudWlyUk9ERU47SEg9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz1bTyc/Mj6ooKihwqOatLm1o6ylrqentbGryKuwsqq0or2xsaagoqicopuZmaymr6Sktamlm5eVoZumrai+p6imlZOblZ+ZkpekqaiQnZGPmJyvsr+sm6eep6KIk5GpmqijmpusoKOZmaKnrKKfq6KasZuUp6CWlJ2fnZexpJehqJmckZ2coqOYpaGanJqamY+VgWdufXF3kpeUkYWLtaqNhpiVjoqMmJeHlJWKhJKUkYmOkpSYlJiWmqChmpyUoZ6NgnqkhmxqfJB8gHWKioFxgnh5dnaLgHyKa3OBdIN1ZXZ9d2tvem1gY11waE1YWmZqYFdacHpubWZTT0ZTOU9ZTlJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Gzob+hpLGyt6CqprKnpbC0qsirrbCktKXAp7OgnaSknKOVlaCqp6yjo7arn5mWlp+XraqlwZ6rpJWSnJedl5KTop+eoqeTkZmop7LEr5qrnaqfkJeWp52qm5ygrJihmpuhpK+moaWon66Yl6ecmZqgnp6cr6CcoaaVl5KYk5+glaKdmKCOlpOKio2Ol66QfJWbgpKCi6qohoGZl4qEj5+Ie4SQh4aakoiGipWPm5eNkZido5aak5GejX+OZqGzr4WKhHZ7kop9dnl6b2Z6kYGAiWt1gXmIc2lzf3t2g4aCa3VkeWZgamVjZGZrWWx7cGlqXFNMUERfVEZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua+/rKuusrGgq6axraKss7DEsKqrorKtvKOzm5+moqGcmZenpammpKWytJ6VlJ2ZmbClrr6gq6KQkZ2amZSRlKKcl6ichJ6qq6KzyLOfqqSqlpaXmqadqJqfo6qTnp+doKmvqaWjq6Kum5+goJiknpyfna+jmJ6ok5eWm5CjmJennJqXZYKSfGV+jZqQZHmNbGhre5Kkqmplmph+Z4aKZWVpaHuOoY9raI2XkaN3a2qLmaOemXNsbnuEjYd6WGVehoJebYuJgXZcaHN3d5KAh4JueIJ4gHNteYR0doiIjoN8aodZXmx1ZF1ziWlrfHFrY15STldKZFhBSjQ+Rzc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7GqpaitrbCmra2wvLGppqOtrrCerJago52imZmmq5yto6WoqbKtnpWjj6Kvpba5pa6jjo6aoZmTkpqgmZmllXulraKotMS4pKKnr56dlJ6inqOco6mokZ6hnaCqsKqrpKqgqpunn6egq5Whm6WwpJebqpWgnZqRpJadqZeefr2DiHK0coSdhq1oeLnEuHGToqN6ppmZc6qCfMvAwLtxjKKIgp99lpiJncC9gpednY2dwsF8gnySjZrDwH1rpbJujIFvynp/m3eRg46BdnqBgHlxen+HcHeFjJN5bniUY2ZfeWRgZYJjXnRobGRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUS8jRlszUFkvVUFCOy84lqO5w7SwsMCpqJSjr6mwrq2ms7SvqaWmprCrn6uYmqKfnJqqp6KdrKOlqKSktKSdopKmrau4s6evopGRmZ2lkpCfoZibn52Hp6ykq63AwLGgqa+pl5GenaGZoqOpo5KgoZ2dra6prKejo6ehpqWdraiRpJqorambnKmbrKCVlaSVoKKWnH/OlHh6pIF5lZabX66PXo6ngaKgfaeWm3Srg4CvXmONqnunh4WgdZeTiLNjgquGoY6Ns2qFr3R9l4i3YYOtWaPNbZB1e9p7f5lwfoiSdn5le4h2dmt8iG59hZCRfm2DkGFybHBoYF95ZFxxaGpkZmBSVFJXXUtPQzVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52RpKqorbOrprKsrKqjqqavqqCnm5mklpyir5+gnqino6Whn7Csmp2Vp66ssaqorKCUkpufpJKPnqWYnaejnq6kq7Cov8ezqKmxrpaSnZuhl5+pqp+UoJ+cna2vp6upnKeopKKrkqyylqWiqqqdo6akobCgkpmmmJ+Zk5SRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553qoJ9rX+cc61+q4eGn3aYknt8l36qiKKMkYydfqt7iZSQn4B7rVacxHqPb5LBfYGVbXVvjG1ldmWGb2F3bnJviYqSj4NtkpBmcHV1cWFnbWVfb2lpbmdkWFNcYVlRU0M5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSgnKOOo6OirK+2rqiwpqiqpqyrq6eio52ZoZSgpaufoqWgqKiinp2wrJealqmnrqyopqmel5Sao6GRk6Ctm52mo6+so6y1qrnNsq2mrayWlZydopierqydlqCZnZ+psqmqqpusq6SjrJuvsaKoq66lmKWqqKmxopKWo6SZk5GEpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBhUquEf66Dm3atgaaGhp96mZeGe2aAo4mkmYaCo32pf4KVh65ffalVnaKSgXqin4B7w6/Fi3Kvs7O5cWKpr8J0aIyMmI6BbZqUcG55eHlwbWZlZXFwZnxqY11XYGlYWFVMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1b+hmaunoa+inrC0sK6prKKnpqmqq6mkpqCbpJ2cpqeno5ysmqKsoaOfr6Kcm5OrpLWwr6Cpm52WlKaikJqiqKCgpZywpqSosay2yLK1qquplZGdnKKYn6WznZqglJyfp6yspK6araqjoqqhs62hqrOxoZqop66utqKSlqKmmJqRfKpsnoSHdat5fLBvgqSLiZ+Wlp+UgdK4tLjJgIGyX2CUqYOjiIegepiWmniqyXSZpJWoqZGTmoyAnIqaxsd4ZqGCpXOBn46Cfa9dcLRisHVLo4Ztp0eCk2SOkJ6SfHGXk4Bxe3V+fG9bZmpycGWBa15hWWNtXF5ZSU5MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4ramzraylopyyuKyqoKWaqKWqq6qnoKalmKqjn66rnaagrJqeqaWdp7WfopeTqaq1sqycpZyglI+lrJGZm6ejoKmmrqGkp6mwtcOys6qtqJOIlpykmqGjrqaYoZWYnKWmq5uwna6opp+so7esobG5r52arqaysrKkk5enopmejoKdTniagX+feoOjfYOkhIamnpyek4S4e3x5uYJ+zMbCtniboZCLn36alpeKdp6YiqWYpKh/sIWdhZ+ErH2alGKlbKRwj4WQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+k5KLdXtzhX9xXW5ueHJqgW9bZF9obmJkXUxMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruaqvoJuhrLKzpZ6glaWura6qp52mppqjp6GzrqKpp7KgmKmklKK1oqKVl6GptLmjm6KdopOPobGYnpunpaGir66dpKiitrLEsa2pramRh4+bp5yipJyll56YmZqmpKmar6KupaaYr6S7rKG2t62dnbSxt7Cyppedrp+inYWP0bXDt3mHjoWRk5CBpniUoXeMoJGEpYGKcaqGhLRucmqZo5yVip58mJmGh49zr4Klm6KNpouTnYqVkJttcLJcpXOTepxsmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jI2UjXh9eY+Cbmp5aXlyboB1XmVkbm1mZ2BKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklk3ONiq2/v7y6tJ6Wp6WttaGimZWjqKeuq6yZpqKfpqCgtaejqaexo5Sso46kraOdkJqaqrS0pJ2knKmRlJetn5+dp6Sdp5y1mqGqpLarw7Cpq6mhjISNm6GgpqKVmpqcmJuZpqSmmKyorqOlm62mvayUvbCsn6Kvsrmqs6aaqLGippd5qJB9fLB3ioCkpYicbbJvoIetfKGOg6iVmYCsiYWuhZ+UqqGhl4afgJmVgHuSfquAnZqWi6t4nZ+RipSSgXqvXaOBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkaaZgpWOmI17e4SYf2xuf2N+dG6AemBnZXFuaGdoQlphWz5LVDNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTgwNTIuKixBVFZWVlRUVVVVVVRUVVRUVFZXV1hWVVVRSEZJSiMoKL2SmoOpxsK2wbSfmqygrbilo46bpKOfsK+qn6Sfna2Znrmgo6ugr6marqGQq6iklomakK6xrKaeppqsl5ePrKGhnaWhmqScrZigqKa2qcCvpamkn4uAjZuan6aekpSampSamqWkpJqprKykpZ+qqL6klsOsqqKhq7K5qq6mn7Ktp6iXdq9+kIuchYd9uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWmmaShoZGFoFtsaoGzYH+te3uCgbFtZ2+ZmIyIsFt9tFykg2vIomSfgHu8WHa1WrJ9Uq6AeqxYgKFumJCom4uXkZeYfHqPnn5ldX5ihHh0gHxhamZxbWZlZk9WZFxCVV8+Sig+Oj00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRXWl5gX2BhYl5fXFtYVVBOSkZDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaXFxYV1dHQjvSn7Oyt726s8Gzo5uspqS2qKCLmqCfnLOzqZ+joJ61mKC0qKqsnq+tnqybla+poo6Im46vrKinoaaZrpKYj6iaoZ6kn5mjo6WZn6Opsqm9r6SonpyOfYualaCgmY+RmpuSmpeon6GaqK6opqajpam7nqDGpqSooau0tayupp66rKurlICpkqOvjpuAh6SXmJCBgLjDuoOOnJOEp5acgqyKgq+IppubpaqRftW9wqpio7+9fX6jgoPXuri1hZSTg569voRro4Fvq4RsnH96srDHg2qrsL2seHeivrxzgZaOp5yQm5GYnnuCkpx7ZH57ZI5neYJ7YGtla2piUGFbU2pcQFVhQ04pPTo0Lx4fJB4lMiAdJCgwNDk2Njc4Oj5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5WztLG/ubK9sqKdrqWlsqadjJilv6q4sqihv6anspyesZy6qJ+tr6WmlJSwrJeMgpuRrqWirKCjnKqgl4qjkqaep5yaoaiimZ6hrK2pua2oo5qXknuHmZGmm5OOkZiYj5iTqJqgmKmpoaqnoaOqu56oxKKgrqOqs7Sqr6mfuaatrZlzdaqkt4ZkiaBwZ62Pio9tb3ekkJmfgXWumJRwj4txlaijm5eupHJtbWxmi3hvboKZcYF6anFpZ4mWlZhxaWmEh2dwhmRdiGJqb1ldZ353pl9hcY6RbmVlf42Tj6KYmZmRmKB+iJCWd2eIeGmOa3l/eWRsY2ZsYktkWEprWjpRZUVSJ0s6KyMcIBsiLCkYGxgtMi41OjQ1Nzk8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOpubiys6qpoa6eo7KpmJK+ssTJvraqnsCsrKOhqKyguqOkrqytp42XrqmPi4WVlq2epqqgnaOjoJGLpJKnmaiZlqOqoJacpqansLqrrJqbk5J7hJeNpZiNkZGYlI2XlaiVn5ipo5uxpp6iq7mfr8CnpLKlrLCxqq2qprairLaViqCopbadiZajmYepmpCUnZKps5mbo6ugsZaioJ2gopygpaGVq6eNk5KMh5OcnJWQmpOYkY6VhYGkmpeVjYuTk4uPhoR9Z4l+dIJ2dIeLcadsepSRk5KBgY2QkI+dlaGWmpijg4mWjnNqkXdxi3h3fHpqbGRjb2RVYVlAaltIY2FPWStGPSsnITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVFZZXmBhY11eVVFKRUQ+OT1AQVNYW1xaV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbS2rq6isKOtn6C1sZCOrMe9xbu5q6Kmnpumn7Goo7annam1p6mRmK2ii4eJj5uolaykn5innp6SlKOXqJqomZSmoaOQmqeZoba7qKuZmpCNe4GUi6CUipWRlZCQk5elkJ+aqqCctqOep6u3p67BrqO2pq+vsKyoqLK3n627mJGlpKa2opKep5+NqZ+Nkp+jrK+boaOwqK+Xo6Cco6qenp2clqudkpmhm5SQlqqZjZmZlpCWnpGJoJ2VlIWSjJCNlIuAfWaLhXWGdXmIg3OcaoWQlJOQiXyLlpKSl5Sik56Yo4WJmoh7c5dzeot/cnx/am9kXnBqYVtgWW5jUGBkUFo6R0dFPjI9PTgvKyYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9fYWFiYWFhYGJiYmRiXFtjl5WkqKKvsqyuo6mmrZ+ntaqQkJ2ltLyvra2io5p6naKxpKWxqZebuaejlJmqnI6Giomco4+unqKVp5+gkpaYm66LqZaPqJmojJipj5+6tqSlmZuNiHmCk4uak4qVkpSQjZKXoo2dnqien7ijgISvtaKvr3WkvaOyn3d5n6mwuZR1q6OeiYCqf2RcYnagjqSehJd9bpOznaOnraqjZZ2fknN5mZZwgJiol2x/oqiKZZylnJGXmJaMkpyRhp2akJWDkoePj5KJhHdqjoZ2hnB7hoCAYWmHipSSi1p1lJBoaI+Pc3ummppmepqIhHmZaoSLg295gGtxZV92cGxraFtnZWJicFNcPk5OTlNHPkBURDkxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01UVFVZXWBoZmdXUUo8REc8OFVSW2BhYmBeYF9gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgr7Csq6mlqK6jpq2kkpartrCyp5urpqyXdIydsJ+oq6eUl7mgoI+cpJ2Rf4mIm56NrJqilaehnY6WkZ6Eda2OiKaaqZGXpImcurSnoJmYi4l1d5ONlpOKlJGQlIyQk6COm6GnmZyyloCMm7Wds4ySj7unoH6nonqirbWAjo2lnoOLhpCxqq+MipajmnmAi6yGnJ2ip6mnh5WFmHelm3qHm4GXp4KCe5yyeoqGoJeZlJiWgpGXl4SamWN5h5CEjo+Ri4NtcI6HeYBwgIGFf4Z0hoSVkXiWZ5J0oJp0fZmEop6ImH+Ui4WFmmuOjoVseHtxcWdkeG9qbGpbZWtqZXRcXklUTFFARTUuWlRVNykhMDk9Pjc0MzU2ODs6PT4+QERJP0pFSktHU1hbWVthYWhmWVFIOUVLPD5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq2uq6isn6iwpqappZmUrsi+saKXp6m2npCEnaycp6KgjZC+npmNn5qgkHyGjpmYiKycoZWfoJGNk4mGgJGnjIainaSUmJ6Gn7qyp52bko6FcHWQiZWQipSQj5uLj5GfkpehpZaeq4eftIm0mq2KyoeqrYi3hYyvgrCsgqmNpZiNnX2oj3J7d5yPp5ZolaR5tIyfnqaokpjCgX+riJihcp6AmqV9l4WVsYChfaGToJCYl4GOk5uKmJGLfIWTho2VkomDbXKQhX95cYaBhHyEdYSBloCPxWZ/qYePo2ueg6Ocg5qBjo+Hi5pxjpOFaHd0fHdoaHZxaGhrXmRwbWdtWGdHXVJNMkQ0Nk5hYzcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5qbVxRRT1MTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJein7Cnqammq5+jt7CpqqaalKCjpKukl6WruKOwgKGonaWenYmUvZmTjaGSno95hJaWkYirmZubmaGFj4x3m5yPno+HnqSclpqYh6O5rqSanIyMfmJtj4uTkI2QjY2YjI+Rn4+UoaGZoad+oaeHrZ2glq2PnpydkYWAoI2qrYWjjamZjJp/o3WAmZRrgqx1Tat4h42ckZuop4Cpq32DoXt6p2mef5JrZ5eGl7aJnn5uYGRZg5d/jHtkaItymX15lWxdfJZtX1Nwg1xfa3mDYFllgn2DgJdwp6prg6NucqVwn4WgamagbVtvjH1nWmCDf2JXUG93Zm10c2tqb15rcG1saVhpT15YRjlBNEdEXms0LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15eY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeWnaC4oKqkpqyRoLa7q62imZigoqWtrqGdrrajqJOhoKCnnJqOmbSZkIufjJWLdYGUko2KppaVmJ6ef5KFhqykh5qPipipmZqbkoimsaeilZqIiYBpboiIi4+OiouNkoyQkaKMlJ+gnKGkf5OBj6OhlKB3nJaPp4Ohp3+GqKuDpXiKfISafqJwc5SIlnuejHlth5uMmZCbqJqPh517gqJzdqZmnn53pF+Yen2Sc6JumLe0unSTh4J/tahkgca4e3CVt4txgJqkYnOsq2B9aZ2zfm58hoKNgouYcX+jbHKjdJ+FgaRgnZmzlnF9mJ+0dHNbnrKDamJvdHZxaW9Ya2xycmZdaV5jTEQ9RDZRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNTlFARV9eW1pYYGB8ZEhDOExXVVZjYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS3tK2toJqinaOjpq6dnLKurJOYoJihpJmalJ+rm4uIkniLhXGAlo6Kj6GQkpSdl32QiY6ooIeYjoqRo5Scm42Lqailno+Xh4R+a3uHfn2PjYOLkJGJj5Sgg5eeoJ2gnouJd5yYooyfcqGLh6iIm6WPlaapfa2MfnqgmXqjk3iBdJaIjZx9lZ+Gm46Zm6aGomShfIiWkJuNbJ5omo1umpl7gIunfXJodKuDnoN0qmiVml2bhXaEnWiqaoC4ZlyocIGcYJWMXqd2dYeJfp5omnWGk5KXjoCfb5qQbaeaXah+eLtrfqpbjoRds2dcbnJ6eGtpXHFqeHljYGZYYkJRRk83VkNSbzVLW1pfT1pEQDE1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW11ZZWZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4hjlJqrubGvrJ6mnJypn5+vnJ6xqa2dl6OaoaCZlpahpJmGiY1qiIBye5eIi5aWhJGUmI96ioSWo52KlI+Gi56SnZ2JkKmjoJqMkYqAgGmAhnh/l4x7iY6OiI+Wmn+Uop+goZOYcmifip+PjHCSjIGph5ieoaaepnuwraOiuJd3o7OipICIlHmde6qaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZp/dKpaXW97lot4nmJMfnp6hWN5l0JMnlmianJ8jm2AiISZdZt4homxs3+Am5Ond4KdbnN9lXCadGukXZV2SGVkYXRxfn5uZmBsaXZ7ZGViUl9XXVVXQFpGUWhEU1dcYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUM8VV9iWmZqVmdobW9iZmdeYWFcXV5haGJfZWN2bF5lZ2ZrZGZsaWhraZOcgbCumYRUXqCms7mysqmaooycq5ycqpSirKSiqI+enZ2bmZaYoZ2WiIeJd4aBb3mVhZGbi3yRk5aIcn+IkqGbc5GQgYiZlaGbhY6pnJqVi4uKfINshIVxgaGMeIaNiIiTmJV8k6OgnqOIrYZ9tYSOnpx7pZZ6qYGVnI+Jn5t8p2h3bX6ZdKFzcXyehplwk4OufaSDpp6ZgKNvXqhndaNjb6VhnNOQfHuZeHJzY6KGkH6jc6SPdmuQs4xggpiJc6qyqLx/d4Ntfr6mqbRenG59cZduf3Kicl2kZ3OmYWimbZvUmn2Fm3B6e5hsnHx4l3NuqaRnYWV6cYCEa2dmZG51d2dgY1NcZlFRYklXSlRhV1NbZWpcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWFmZWpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+wq1RcS36pr7G0r7Ojm5mFmamgoaSOpaigmKmKmpiYk5mTkqCYjoeGe3B9hGh9j4OUmoF3kI2PiW9/ho+SkmyWk3yJkpOlloOPq5uUkouFiXqDdoeAboGfhneAkoaHmaKXe5SjpJqfibOhoraLeqynpK6lcKiAmpCFgJqQe6SAoZmGmHKehKOur4qXjH+MpI2Vg62hlHa0tbXJoXOUioGfYJ2XqW15lYagm3Whh3egfpKXi4FvTGajknCbh3Oke3p0YYOBa36ga3FkX5xxfXSXaXpps7W0xqZzmH56nWucm6t2hZttdniYapl7dZhyUEV9tF5qdmt5iGZqaGJ0dXBuVl5UWWlQU2lKVk1ZVFZdaGtuVmhXTktBSk1LSEpPQVFLUGVjam1ldXNzf3l8bnWJe3tUUE9sXmhba2lSamhpbGdsZmNlYFxdXF5pYmRpa3tfXWRoY2pmb21laWxloZyIr6aEZj+TobKqrq+1oqKQgJiqoqOljKannZ2mgpuXlo6XkI+ck46Ig3lqeYdlg41/mKB5dY+IjIFphIWSgoyFnY16jYuWppODmKmYjZGLgYl6gH2LeXCQoYZ5gZWHiZaglX+UpaeclpaEZm54nGyiZHxxpXebmHBnpoCVinqkep+Wg5dynnaBipSWj7lukIqiYn2ZoZWIbXJpqmt1oG1upl+aaYuQaJaHmpV1ooB9mmCMho11b4hiaKBlnn5pm3VvY2aIgm1yolpfW2KhbV2JjG57fnNyZKVtd6JkZ6domXOMmXCib1WJkG+gX2aoVIteVJhubXNrcoJtcGlreXNrb1JZV1dnWlRtSllPXUlYaWlzallrVlFSRVZcTFhTYVVpa193dHt9cH18coN7f3N2jYCEdl5RcmJnYnBnUGpoaGtsbmhkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ykmKZ6ZXRti6euo6mwsaafi4CYq52fpo2joZuiooCWmZOOmo+LmJCOinuGcYCIaIuLfJicc3SJfZB7ZIKHlYqJlpmCfIiHl6iRgaKskYaQioKKfoCAjnNpj6WEfYaUjYiYoI6Ik6qmnYmmeJWbfqWIloyymJ6Qgq+Xn6V3lIZ4qXOlj4SabqSijJKEjIO7bn2lr4OGhoaTlZyffKV6cqiVoJZmnn5vq2OWipWSeKhsqaKBiXaIg3eqkaaHapGwa3azjKlrioZtbZ+ekpVgfquLqnZ+f4ylnnaffYSklZ2gapuId6xnnq2MtnR3vo2kk1mDpo2rYXVydHF8dHFjan5uaGxTV1tWYWJda01dUl1KXm1udmBbcVlcYFtmdGVub3JicXRgd3p+eXJ5g3OEf4F7e4yBgoB2YnhkY21zZFJrZ2hvbHJqZmlhYF5cYmtibWx6b1xcYmlibGp3bWdsbmKVpaqdgYCepJapqp2opq6kmYmDmKuan6WKm6WdqZ2FjJqPh5yRhZKNjI10hnqIhHCNhX6YlHR0hXKSg21/i5KHhpOOfXuChpmmjn+mpo6BjoqFlHaCh5JvbIupgIOLlI6JnJ+JjJSqop+PgHWUl4h+gXmUrqN/gZtxj4V4j4qDfntyp4xxfX16l5abhI54e35+h5SVk4p2kJifoIN7fYlrjIVbeXlyenBobn6SiXF/dYGPlJNxhoSCZYx/XoF/i3d0cpR1b3lubodthIVedmh4jmWAgIWNqZt9dHyWaomIcIF2fYZ2bm1njHN5e5h4hVxrWHmPaW54cnJveHhwXWyGbmlnVltgV1xma2RWYlVfUV9weHhsa3Zmamtrdn1xcnVzYW91YnR7gXh1eoN1gIF/gXmLhYN9e21/bGR4bl5XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5obG9hjZS4qKaLoaKapqSYpZyroqGEhJiskp6hiZunmqmYg4Gbi3+Wk4eOiomNcoN8j31+j4V7mI90coNwloV7fZKLhoaQhXl+gIeapY58p6GLhpCQhZSDho6Yd3KFqYWOkZ2QiJ6eiIybqJ+fqoOJjpWafn6Jlq2oj5Kmj3dvnJCCeZFufqiFcH2VcWtwfYGfjH+TjoxobV2Di4ycm56Oc5WLiHF0a4J2dIFZcm6GkYF9foxqXWpke4WEiYBgaXh6mnuCioF1gYWCZ3eKhmthcHGBdl5yioGIj6aVhWWMj4Nud4uEcYaPenFnaGV7g3qWW1xqZ252W3t5eHVuc3OCZlxtimtrYlpaX1pZbHFcX2FaX11mdH56dHB0Y2tra3x9c3x4dWRtdWhtfH52enx7enqAgH5vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbmxnc3lvaGptYIuLqrChkKOhmp6dl56YqKOifoOZrY2glYicopGllX97mIV9kpmJiIaHinN9gIx2hYuChZeKcW+AcpiGhH6ThIOGioF6gYWMnKGRgqaiiHiOmIiUi4ucl4WDeqyCkZeZlIqenYeIoaueoaGji4iTm5yjmZaqoaemoJKbh5WNe3eNjYOnfn+SkZKTnLKmm5WekI2ykpeEpYyMlZufiZCbgoiRimt8jnd4ZYKGkIt8iZ2Eh4uQiIiAhISQd3x5dJmgiIaJnoqElH59ioCAdW9zhIJ+d4aGio+mkIOFjYeDjZCMfYiMipGEeW2DhH16mWpyaGF0inB9end3cHd0gV1eb4Zobl9eWl1dVGhyVmNcXGJsaHV8fHNvcGRra2mAfG55gHJqcHBsZ4F7coKAeH9+f4V7bYKMhnx5eHt9eoN5TmR2anJtcHpla2VjYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2SMh525npaioZiUmJiUmKSgnnuAmquOn42GoJyLnpZ9eZSDe46ZiYaEhIZueIGAc4GIfomUhG1rfnqXh4SDkH+AhoSGfYeFjpyek4esn4Ryi5CGkpGLnZF9jXuqhI2SmJaPnJaHhpumn6GanYaCkZqZmJCapp+lnZ2Qln+PiXV7ho2DpHp8jpCRhpiqoZ2TnY+Nqo6RgJ2MiZOanoKOl36GjoNveIZydWF+g4+GdYuYgYOPgoaFfoWElG55dXSSoYqLhZqDhIxzf4l8fHJye4eDeniKjoOSpo6Fg46Ag4qJineGiYqMfnFtf4F8bmhsbWhfen9ofXx2dXZ1e3dcX3B9bnVgY1tdXlFnblRlW15ia2l2en5xbG1ka2pogYBsc4FsbXVueXCFeW6HgHaCgH6FdnGCjYh+e3p8f3uCimBpfGp1aGmCZWpjYGlcZHVob2J1bWxVY3F5ZXB6e3Nlam1si4met5qho5+RkZWXi5qfn557eJ6nkZyKh6SUi5iZeXqNhXyJkYOMgoKCbnx/eXOBhX2LkH1raH2CmImAh418foaEhn2PgpCcnZKJqZ2AcIyLjJOHoaKKhYx9qJGIkJKXk5aTeIyjn6Cdlpl/gJCamJKMmqOho5qXkZp9jIN3f4KOhqB/foyMj3yYpKChk5mQj6aNj4GakYmTl5t+k5J+h46BdHSCcHZgfYCNhnGKlXyIjHGMf4KFho5od3F4i5iRj36WfYeKcoGGe3xxeHqKhHp5kIuClaWTi4SPeoaGh4V2goSJiHxnc31/eXtxbGtnX35zaHx1dnR9c4BqXmBzdnB3ZGNZX15Sa2lVZVlfYWhqdnmBcWdrZG1oZYCBa21+aHBxa315h3prjIFzgYF+gXR2go2Gf3x6f4F9f49qcoNuc2lih2hsYl9xVnRvbW5geGhtV2p0dmN1entyYmpveYmNnrKSpaWcjo+Xj4adoJudfHaloY6YgIyiioialnh7hod+g4l/iIKBf3F/e3R2g4V+ipF4Z2N9hpeKgYmMeX2AjYN5l4KWmZeNl6GcfnCMgpGUhqabh4yJg6aVhZOLlpeTkneRnaChl5OWeX6OmJeOlpqdpJ2YkpSaeI2EgneDlo2dfoGJjYxyl6OeoZOZjo+ijIuDlpiDkpaZfpiMfIiNgHZxfW56ZIB8ioVwhpN/kIJsh4KBgImEZXVve4aSl4x8kneLiHt/hXx7cX53iIV5hI+JipeilYGCinaIhIKCd3yCioZ4YXp5fXR/eGdtZWF/amp3c3R1fXF8YmNhc251cm1hWmFeW2xlUmNZYGFoa3Z5hnFiamNtZWh9g2xodWlub2d/fYJ5bZCGcYCEg390fIOMgYB+eoKDfnyQbXaJdHRtZYpsamJjdVaEaXFuYHhnbGJqdnBmeXx6cV9xbIaFj5yul6aono2Ml4eGn5OXmX14qpyKmXqXnYuMmJB5fIGMfnyDfICCgXh0eXp0fYCEf4mLgGRefYuVh36EhnV9fop/fZmFl5WYjaSjmX9zh3uUkoqnj4yOipOhkoORkJSXkYuBj5efmpKPkHN/jZKUiZ2dnqaXl42VlXOMjYlrhZePmXqHiJCJb5edmqOTlYqNnoyGgpKcf5KSlYeZiHyKiYF5cXprdWx7fot+bYWSgpR4cIKDfX6Kf2RyaXuAlpeEfoxzj4eDeIZ9dnd/fIWAfIKMg4uTpI94g4F0iYd9gHR2gYmFcGJ8dnpxfW9ib2NkfGNub3ZzeHdzdGF1YG9sdW1vXFxfXl9qXlBdWWNhaG10e4hrX2lmamNod4huZmxpamxngH17d26QiHOAhIR9dIGGiXuDfXqBhH19jnJ6i3h4bmyHamhfaXJih2hxb2V2Z25sYXlpa317eHBhd22LgJmZqqCjqJ2KipGGip6LlZh+d66ZjZd9n5ORlpSId357in17gHZ4f4BwdHR8b4Z9gYCKf3xhW36PkoZ/g4NzeoCHeo+SiZOSnZOmnJWCfYJ8jouSpImOio2Ym42GkZiTlo+KiIySnJKPi4xug4+PkYiemaKhl5aJlpFuh5iDZoWYjpN6iISQinCVmpSikpKJi5mMgn+Qnn2Sj5KMmY57ioSHc3J1a3BudXyKdG6GkI6ScXWAe4GBh3tkcGx4fZmTfYOIc5CJgHOHeW5/fYCFe4WLiIOLlaiMeod7fYuFd35xcIGGhGRpeXV1cHxiX3Bha3RecWp7eXlsc3BleF1ubHNtcllaX19ha1pQV1hlY2dxcX6HZl1qaWdiZ3GNbmRpZ2RpaYF6d3VvjoV0gYKDe3WCiIV4hXx4g4V6gIl3f4t7enJ4g2prX3BodIBqcm9tcWdvbGV8Y26AendxbHd3in6il6GooKabh4yKgY+dh5OddYGqlZOOh6GMlZOQgHR8doV4eX9yc3uFa3Jwem2KdoCBh25xW1h+kY2If39/d3WBgYCghpGLk52YoZWYeIqAgY2JnJ6Kj4aSmJaFiZWZj5aLi4yNjJyJjY+DbYmLkJCKnZahnJeUhZiHaoOigmWFnYqQfouDi4F3k5iRnpGQiYmVjX9+j5h8kY2PjZqRfIqAgm51cGxtb3B7hWlzg46YinF3gHWCiIJ4ZnJudYGZjnuIg3mTkHl2h3NviHuFi3qKhYKHjZujh3uDdYGLf3d5bmyBhIJec3VzcXB4Wl5xYXBrXnBqfXtxbW1qbHZgcG9qcW1aWGFhYm5YUVRaZmdjdm+EgmJda25kYmZrkm5gZmZfZ2uBdXJzcIuAdX+DgHh1gIuAeYV/d4eGd4OFfIeMf3t2in9qcWN8Y4Z8bnFsdGpob2x2eF9xf3l8dHV0gIJ+pJWarZ6nloWNg3+XlIOQoHWLoJSShoubjJWOi3pyeHSCcHKFc3F1iGtvbXZtiHaDfoBtblVRgauVh4J3f3dzgnqCoYKTgpWUmZyTmniSe4ONk6Sak46JlZmShYeXmYyUi4mPj4edhI+KfHOLhYmOiJyan5uVlH+TfmiEm4ZnhaCHkYORgolxg5GXj5uOj4yMj414e5KQeo6LjJKWjHyIfIBrdmpua2xse39hen6OloJ2eoB4g4x8eWdzbHOHlYp+h4V6k45xeYNvdox6iYt5iH2Bi4+enYR8enaBi313cGpsgoN6YXlxbm1ydFZecGJyYWBsbnpxaHBmZnN0aHBrYXdlXVZmYGByU1FOXGZlXXlwiHxfXGlyYmJlZpJqX2hkW2dwfnBrcXSKfXZ8hYB0dX6MeXuGgHiIg3OGhX6NjYR8eZV4ZnJqg2CIfW9va3pgam50f3VfdH15hnh0c4V8eKCPmbCcpY6Cin+DmoeAjJ5/i5qUj4WImI6Oj4R3dHZzgHBvhXRwcoRwa2p3boNufX1tdXNSTYLfyJLWk3xwdYN2hKCDlHeVkpmckZl7lHOFkJ+hk5ORiZKblIZ+lpaIjY2Iko2InH+OgHd6jH6JjIqcm52blZN5jHVmh5CGa4eihJGIl4KFY4yRmY6VipeLjYqLcXqUiHuNiIqTkYl5hXx+bHtlcm9ra3p5W4B5kI6Aen1+f4aOenpocmpzio6JgYWEfJSKa31+bn+LfouGfIN5gI6UmpqKfHV3g5B4cm1ncYCFbmt1cGhqdW5TX3BlcFpgbHJ4Z2trYmZ4cnBwY193YGBWa19edlBOS2FnY116cIl0XFxldmBhZWWPY2FmYlhpc3NtanF2jH10eYaBdXZ+i3OAhn96iX5yiYeBkYuIfH6YdmVzbn1liH5vcGuAWmxueXlzYXZ7e412cneKd3mfi5uum6CQgoV3iJV+fYqdh4agkY+FjJiEk46HgXR3cHlxboRvbW9/c2VleXF9bXl9amhrY6Sawdyu76FzbHaEdoWjhpJvl5GWoZacgZJyhYujl4mOlYqQnZaDgZWQhYmQgJGKiZZ+h3p1f4l4h4SOnJuYmY6Pdol1bYWIinyJooOQiZyEhV6Lk5eKjomOioqEiW17loF9iIWJkY+GdoV9fWt9ZHh1am55c1eIepKHhXl+gICFjH54ZXJpf4mOiYGCfouWhGuBdW2HkIGPhH2BeH6QlZOYkHRyd4eMdXNxZ3Z6hGN1bnFiandoUmFxZ2tWX290emFyZF9ofXBybVpjcmFiVm5ZXHhOTUxkZ2Jed3OJbVxcZHleYGRlhWBjY15ZanJrbmtyd4x+dHeEgXh3e4lxg4R8foh7dIuJh5aGjH9+l3NodXF5bYt6bnRwgFdxenZ5cWV4eYeMaXaAiXJ/nIeZp5yjkoV9cIyUeHmLnYSFoY2OfJaNgJqIhHtzd3BzanCBbGptfHVfYXh3e3F1e2dgZHzr2rXJw9yIc2x0gXaLm4mOapmQkJ6WlIGJcYWJoI6Fi5WKjJiUfI6TiIOJkHuQi4WPgX92eIOEcoiCk5yXlJeGjHWGfW6DgYiGmKGCk4ueg4lhg5SPhomGiY2HgYdqfZSAfYOEiY6NgnGGfn9xd2h2cml0d2tajHySg4V9f4OAhIqCdWFza4iAj4qBfn6RkHxtgWt4hY6FkYJ7gHx+kZKQlohucHmMhnVrcWxzeYJgdWpvXWt3YFJlcmhmU2BwdnRhcGBdaINxc2pXZ2hiaVhtVlt1TEtMZmdfYnJzhWlbXGV5Xl5kZ3thZF9dWWtuZm9pc3iKfnNzgX56dnqIc4WDfH+HdneKho6ZgYyCe5N1bHd1eXiTdG54e3xYeoZxgG9neXeSgmR2hoVxipaFmaGaooqHc2+Ti3J3jpx+i5qJiXyff4Saf4F4cnNub2Ryf2lmbXh4XF95e3txcYBqYWdhf9W2jpCmeG5xd3xxk5GNh2uaj4mdk4yGe2mHi5mGgZKRhoeYjnyNjYGBio18j4x9iYR6dHqDe3GGgJaajpOUgYh0g4V1gn+JkZydhZSOn36IYX+Th4SIhImNf4CDZ32RgH5/goyOkH5tgnyCdGttd3V0d3ZrY42Bj3+FfnyEf4SIfm9ecXCEe46LgXt+kId5cINmeYKKhouCeoN9f5OOj5KEbm55i351bW5sbHt+Y2lsallud1pSanNpYlFjc3hsYmVeWmqDbnNhW2dfZGxfblVbcE5IT2dlXGducYBsW1tjc2BcY2x3ZGVdXVprbGJtanR3hn9xcH98fXR4hniFgnyAh3V5iYGSlnyJhnaJgXB3eXuEk29tfIF3XoN/dIFtaXp0lHNnc4d8cpKRg5qfm6CGiHZ2lX5tdpSXfoiRhIqOmn2MmnZ9dnFvbGphdXxnYmp1elpgeHx6bXF/ZWRoZ1edj15xc5a8xIR2cZSKkH9zmIyHnJSNiHRriI+VgHuUjIGEm4x8i4Z9fImMf5OIdYmFdnZ9gXF1hoGelYaVj4KCcX+Hc4N6iJabloaTjZyAiGV9koJ/hYOJiXKCfmd9i3t5f3+Hi499aYB9g3Zmb3l4c3dzbGqNhYqBin95goCEg39qXXB3enyLiIV7gI5/fXKAaHiChoqFgneCe4CXjI+MfW1reol8dnRvaWh9d2VdcWNYcHRTVG9zaGJOaHR4ZmFeXVhvgG9zWWViXWptYHBPWWxSRFRoYVprbm17b1pbXmxjWmNwdmRnXF1ga2pjbGlzdoGDcW5+e390dYN6hIJ8goV2fomBlpF4g4p0gYhyeXl/jpBvb3yBcWmBeXp+bW18dpZraniEdGuUjYWfmKCahYhufYx2aniYj3+CioKVmIp6j5ZvenNxbGpkYHR7aWBmcntbYXN9emdwemFlZY6xsndKYlqk2dCXcnuSjJF5f5aMhZqSjYZvbIaSkXp5k4eBhJmKfId/eHiJioSVgG+Kh3F0fXtqeYaDpZGEk42Dfm5+gnWCd4WZmJOKko+UhYdvepKDfYODiYNvgnhogIV4cn9/g4qHfGV9foR1Y3BzgGh5cW91mI2Fgop7dniAhHmBalpvfHJ/h4OIfYWIeohygG1wg4aNg4Nxg3iAmIyNhHdtbX2Df3Z6ZWhqfnJhWnhbWXJuTlhyc2ZgS213dWJeW1tZdX1yb1dnXWZqcF9vTldpUj9ZZ19bcGpneXFbW1lrZVljcXlfaF1eZWxoZmxpcXd/h29tf32AdXCBe4CBf4J/doGFiZeKcYKNcXuGfXp6hJSMdWp6f2xvfnR/fW9yfHuUcG+Af3hmkoqCoZickoKFZ4eEcGh6l4l+gIWCmYqBfI2NaXhya2xmX2FveW1fYm95XWRsg3phcXZfZWXV676LMjo+i46AcnmGiY+Nd4WYjX+Tjo1/bmyFjYx1fY9/hYKViXyDeG52h4WDl3duiIRsdXt1ZnmCg6iMg4+Mg31tf3R2gXiEm4+Lj5GSjIuGfnuSh3iAhI2DbIBzaX9+eG18e4GKg3hheYSBcWRxaX5tdHF0gZuLgH+EfnN1fYBzgG5aa310eImCinuGf3yIeHlwa4eCjoKJcYF4f5aKin50bWp2gIB1dVxpaXhxWVd9U1pyZUxbc3JlW0pxeHBeW1tZXHV/dWhZYltnZW5iaU1XZlE9XmZdXXZmX3RwW1lVb2RaZXF5WmheYGdtZ2lsaHB4fo5saoKEf3lugHt9gH+CenWCgYyThXCAi253foF7e4iTiYBpe35rdHxyhntzd31/jHp4hH58a4yMg5udloyBgGyNfmtpf4+Ne35/g5SCf32KiGt1cWdoY1tiZ3NvYGFsdGFocIl6YXN0XmNkm6CQblw1Wa+1dWqAin6ThneHmId1j4yKd3BshYOHdHmJeIl9k4h6f3Nndoh+fZhvcIZ9aHd5bmV6iISlh4GHjYp+bn52fn97ipiGgZOQl4iLhIl8j4hxe32FfGl+bWuAe3pqenaCh4ByYHeBfnFkcmd1gm11e4WVkYF8gX5vd3l7dH1sV219dXOKgYZ3h3WBiXp3cm2If45/g3J+fH2SiIh6bm1pbYKBdW5daGZ0clJbe05ccVxPXHJvZFZLc3lrWFlZWmBxgXVgXV1hZ2RoaGZOWmhOQWFkXGB2Ylx1bVhYU3RhWmRucldqXmJoa2dtbGlwd3yTbGmEin19cH5+e4F/gnp3gICJi4Rye4dvcXeDf3uKjY+Dan57bnh5d4p3fXiAgod/g39+em2FjIiYo42Eg3t2jHlrbYSJknl9e4KRgIB9ioNwcnBjZl5ZZ19wcGBhaHBmam+KdWF0b1thZGl2e3++nKajyLhyhYRzk315iJSEdJGNiHJzcIR7g3N1hnSId5SJeXlxY3eGeYCTaXKEdWZ3dmNqfIOInoKAf46OfXJ+c4N3fpCPgneVjZSPh4KIeomJa3h5fnVoemlsf3lzaXp2gIN9aGB3h35qanNoe4BpdoGMkJR+en19cXt2e3N9YVV1e3FziYOCfIJwhop3d29vgoGLfXx4fXx1jYWCdmhxaGyIgnJwXWhjdG9LZXZMXm9VVFlzbWJRT3R5YlNYWFxhcIJ0W2BcaGVkY2pkUFtxSURkYlxjcV9cd2hVV1Z3XlxlbmhWbF5hamdlb29ocHd6k25piIt5fnN7fnmCgYJ8dn2DiIaDcHaDc213g4N+iYuUf3GAfHh5eoGLdIN4f4GBgoR5gHZvfomLm56IfYZ6d4d8aHSGjZF6f398iYaEdpCAZ3BuX2RcWGVZbXNhYWFxbGxoiW5gc2lZXmRtgHep2qrHhoezcop5cI52fYiQgXqUioB1dHV+d4BwcX5thXSUhXh0bGB6gXmIjmZxg29ndW5bbX2BkJOAgXmSkn14e22GdH+Qi4NylYqQjoeFhXt/hW11dn9uaHdmbXx2bWp3dn9/fGBieIZ6aHV1Y357Z3SGjoyVe3SAdXGAenxsfllWcnxvdIOGf394a4iGc3hqdH+Cgnx5fHd7coqAfHNndGRti4RtdFtrYHZmSG5vTFtjWFdWeG1iUFN1d1lRVlhdYHKEb1xgY21kY11uYlRdckdDZl9eZmldWntiUlZcdVtbZ2thVmtfYW5mZmxxaHB2eI90a46NdX92eH13gYOBe3R9g4iIg29xgHVxdX6GgomNint3f3iEfH2Fh3iHfH2BfoSAe35zdnmMjp+MiXqJd3WDeV5+hpqNeYeDdIaGhHeJe2JubFtiW1thVWp0ZGBbaG9wZ4dyYXFmV11ja398ys6HuaJrbm6LbXKFcn6Fi397koV6eXR5dXV7am11Y4R2koF2b2dffIF5i4llcYFqanFjWG17hpyJg4Jzl5R3fntth3CAiYqGcJaOkIiFi4N6eX5xcW99Z2hyY254cmpscXd9fHpdZXmAd2l1eWaCdmd0h4yNlHxyh2pufoB4bXtcWHB9bHN/inyBbm6Jf3B2ZnZ+gH6AdXtxenOGe3lxZXJgbYyCbHNYa194XUlvbE1XVl9UVXxrYU9UdnNRUlRWXWJ0hWhcYGtqZmJZbmFYY3BHQWhdYGZfXFZ7Xk9WZXBaW2poXVdnYF9yZmpocmhxc3eHeG6VinR/e3d+eYOHgHVzf4aFjoJwcHt4d3V5h4WHjIZ6fH91i359hoSEh39+fn2Hf3x4dXl3kZOffox9i251gHlkg4iXhnSSim+FhYJ6g3VjbmpZX1tdXVVoc2VgWWRycmeBc2JrZFdbYGl/eL6ue5+3bWJ0h2l0fHJ6hId7fo2AeHhzd297d2VqbmCHdY6AcmliX354eYqDZnB9aGprW1dveIqjgYV/cZmTcYB4dIFtf4GQh3KTh4yHg4iFfXl0cm9oeWFqbWFtdmtna2x6d3p3W2d9fHhlc35uhHRldYaNhpV+cItma3qCdGx0Ylttemp0e4t6gWZ0hn1tcGd0fnd8fnF7a3l7gXl3cGVsYWyJfm1uVmtgeFZLa2xPUk9pTll9Z2JOVXZsTVFUVV5mdoNmXWFwaGdhV2ldXGxpSkVrWmJkVlhVeVpOV25qWV1sZVxZZWNedGZsZHJnc3B0gXhwmYV2gH94f3yFh311c4KHgJWCbnN5e3tzcoWHiIiEeYF9do9/fYSJjoOBg3t+i4N7d3x3d5qdl3qKg4dpdn58bISFlIByj4JxhoJ+gn9vZmxnV11bXFtTZXBlX1hjc3VpdXBkZWJXXFxogHBvcoBziWVleX9qdHZ0dISFeIKEend0dW5renBhZ2tnhnSNg21mXl98b3uJfWhtd2ZpZFZXcnCNp3yEfHaWkHN8cnt5bXp6kIR2lnuHhoKGg311cHJtZ3VdbWlfbHVkZ2Zpem97cllngXZ1Z3CAeIJ2YneFi3yUgG6Lam16gHBlcmVga3hmcnaJen1hdYN2aWtxdHpveHhyfGV9fn54dm5jZWFshnxta1ZqYnJUTGlrUExOcEhee2ZhTlV1ZUtPU1dga3d+ZV1nc2llX1ZjV2JwXUtLa1hkYVVUVXNXTVl2ZVpfa2BcWmNlX3dnbWJwaXRvcX51dJmBeICAeIB+hoR6fXaCg36YhW5ydHx6dHGFhY+CgHqLdXSQgH2BlI6AhYR8foyGen6AdnujpYp5iIaFbHV8e3WEgox6b4VzeoV9goN1bmppZVZdW1taU2NuZVtYYXR7amhtaGBiV19baYBpa2+AZ2xhaXp5anR1dG+GgnuBfXZ1bnpoanlqX2VuaYF3kIRoZlhid2l+h3pvaW9nZl1VWG9oj6d2gXp8kI54dW59bXF0eI5+d5R0hYJ/hYh2anJ2Z2hvXG1lXm5zX2dianhoe21bbYNzdGpvgH55d2J3hIR4j4VziHFweX9xYnBoW253ZHBzh3t4YXKAcGdpeHNxa3d2c3Vignp+d3VwY2NjbXx9a2tVaWJnVExtaVBHUmxFYXhmYk1Uc15KTVVZZWx4e2ZfbXFqY1xWX1Vvb1dKU2hYZ15YTVVsVEtcel9bX2tdXVtiZWB6aGxhb291bm93dXqXfXeAgXmAgIeGenl6g32Bk4RxdHR/enZ0hYiQfYB9kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ9/eoiHhGxygnl2gYCCdG6Hb32AdIqAam9uZGRYX1paWlViamdcWl91gmlebWxcYVZcXGuBZXJ0fWlqXWx3dmh1d3Juh3x+fnp2c2x6Z2l3Z11kc2h6d5KBY2NUZG9ngoR3dmZoamFXVlloZJCnbn54gIuOenBve2Z4bnmKenaOcYN9fn+GbmR2c2RoaF1sYl5wb1tnXm11ZXppXXSAb3JrcXt+dXZjdYWKe4eHgH93cnV+c2BwbFlwcmJxcYR7dWRygGxgbHpvamh6d3RwZIN0eXl1cWRhZG1zfmpsVGleX1VMdGNRR1diR2N3ZmFMVHFZS0xYWGdsdnplZW1xZmNaWF1YdmZUSlxjWGlYWEhXZVFJY3lbXWBsW15cYmRegGlqX290eG5vbnaDl3lygYB9gImMhn52doZ4hox9dHV1gnl6eoKMjn1+hIlqdJaBe4qdfX6FeYB7fnyGiHNxj66Me3uGkH5mcYh6dH19dnJvhm17fm2PemJwb2JlXWVWWllXY2ZrYF1dc4ZpWHBtW15YWlxse2Nxd3ZtY1tudHRodXZxbYV5f4F5d25vdGVodGVbZ3VmdnaSemBdU2VmaoKBc31hY2lcVVheYmSQpWh5dIKFkHhsbnhmd2x7g3l0iHKAeHt4f2hldm1gZmFfamBedWtZZV1vbmJ6Zlt4fGtubnB3eXR1ZXKDkn+Hg4h6dm9xfHFhd2Nabm9hcHGBe3NlcYBkXm12aWNmeHpza22AdHN8cnFiXmVtb31laVRoWVpVTnlgUktaWUhidWRhSlVuVEpMWlZpbHJ7Y2xsc2NhWVpbYXdcVEtjXVlqU1ZHWWFOSGp2WF9ibVtbX2JjXYVpaGFueHlsb2p2gZB4bYJ+gIKSiISBdnWJdIuGdHF2doJ4fH1+jJCAfpN+cHiWg32ZknmAgHh5fn9ziINzcJmie3uAiZV5ZHWIeXN5dmtzcH9seXxwkXJecG9hZ2JsVFtaV2lkbWZcXHKJZlJybVtZWFhgbHZkanVqal9bbXRybXR0dGuGfX+AfHdvbmxkaXBjW2tyZHR2jnNcV1NkYHF/fnGCXGFjXlNaYVxkk59lcnGEg5Bza2p4bG5veXl6cYB2f3J5enpkZnVnXmJbYWhcXndpV2JecGhheGFbe3ZqanJvd3RzdGlwgZSDhn6EdnJqcHtsZXZXW2ptYnBygHpzZW9+W2BvcWJeaW99bGpyfXFwd2twYFtla217YWdUZ1VYUlF3XFNQWVJIY3NiYUdWbFFJUFpWa2xrfGVtb3FhW1pYWWxwV1NPZldXaVNURlpcT0lydVlgZG1jWGFgYV6MamNkbXl4a29pdXmFe2uEfYCFmX2ChHl9iG2PhnFvd3p8dIKCfYuPg4KWdHiCk4aBn4l1gX+BdH+CcIeCdW+il3N7houHe2Z3i29ufHBmeHF7bHN2c41rXnRuYWdma1NeXFZoYmxsW1xxjGROb21cVlhVZ2l0aGN0ZWVdWm92b3F1dXpsiH2AfYh3kHNjZGtvYV1ubWRzeIhrWlRWYmN3fHxwhVxjX2NUWmBaY5aVY25wg4SJcmpneW5lcnVxemt5c3Vuen51X2ZzY1teV2JkWWF1ZlZfYW1jYXFdXX5vaGlzcXNwdXVrbISTgYl7hXFyZm57b3BuUlplamVxc4B2c2JsdlVicWtbXm5kfGVrdHxxcnJqbWBZY2lqeF5mVGVVVlBVb1hRV1RQSGVyX2FGWGtPSVhUVm5pZHxpa3hrYVdcVVt0ZFNSVmhRWWdUU0haW1BOeHdbYGZsaVpiYF5ej25iZmt5dW5uaXZ2fn5thIB+hpd7f4eBiX5rk4hyZ3SAenWAg36Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Ld3hue41gZHxxZ3lzeW1tcXaDZ2R8bWNmZ2hTYF9VZ2Bsb1xebo5oTWlsYFVWU29mc2xleGRlXVpxdW5ze3hzbol7gXece3psYmVsbV5gb2plcXl/Z1pWWF9seHt7b4NfYl5oVllgWGSciGJrcYGGfHdranZsW3VwanlpdXJtbnuAclhqbl5ZXVZiZFhlcWRUX2JpYmJtWmB+a2Zrc3VubXd2a2iFjH+JeodtcWZve2xxbGJYX2hob3OAc3NeaW1TZXBkVWJuYXlib3R6dGpvbGpfWGBmaHVdZVZiVlNPWWdTT11PT0hlb11jR1pqTkpfS1htZV94aG5+ZGBVXlRddFtUU2BmTl1iVVNKXFpRWXV2XV9mbWhYYmFbXo5xY2dqd3FzbWd2c3mDc4KDe4iOfnyKiI55bpCKdGxzgXN/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Njo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2NjY2NjY2Nj4+Ojo6NjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQkuSmpmZmZmZnqCgoKCgpV4qLy8vMCxIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzP5OenJycm5uipKSkpKSqVhUcHBwcFzqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGjY6Ojo6Ojo+Pj4+Pj4+IgoODgoKChYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpORi5CLipCJj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2MjIyNjY2NjIyMjIyMjI2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6GjIWKioaIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkIiMhoiHhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCQiI2NiYSGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjJCIjIeFiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4yOioqOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OTlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KSk5OSkpKSkpSSkZSTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpKRkZKTlIOFlJKTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKOg5KRkZONdYmTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkY5vf5KRkXx0iZGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPkHhqhJGKc3aIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Pe2dxjoRydYePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI55XGh1cGRviI6NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4qKhmRpa1xnamuDhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnduY3VsW2p1bmVoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doZ2Bnb29mbHJ0amJjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5ZXGJnanJvcXNtWllfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01SX2NlbW5uamhSUVRQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTk9NTVVja2dsbW1nZVlRT09QUU9OTk9OT1BOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tFRUtSXmhtZ2xtbGpqZmJcVVBPT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhGRlNbXWFmam5qb21ramtrampmWktKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz9AQ1NeY21sbG53cmppa2hfVE1GRUVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozw7R0tCTmJtcHpza2pgS0ZCRUZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7PTw6Pk1gdHBjTkM/QEBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OTs6NjhXZkE4ODs8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT09PDw8OkRZOTw8PT0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDxdbkA+REU/P0E8Rl09Pj07Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213STg7Oj09QTxLYj08PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PT1JTEZGdndONzg4Ojs+PldpQTs8PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnZ3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3l8d1Y8PT89PT5FaXRNOj0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KChIODg4B9XT5AQ0BAPUlye1o6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hHVMQUNFQD8+WHuAXT9DRUlKSUlNTUtFQ0ZHR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFcUNERURDV3WGh4d+WEdISk1MTk9PTEhHSEhISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7enx9fn59fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SKbUFBVnSHiYeHh4iDV0hMTUxNTkxJR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN2d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVmyFh4aGhoeIiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUpISEhHSUlJSklIRkpKSkpJSklKSkpGSUxMS0pLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVYGDhISCgoWGhoSChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqMjIuKiYqLjIlUOjg2NjY3NjY2NDU3NzM1Njg6ODc2NTY1Njc2Nzc4OjY3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCCg4ODg4OFiYqKiYmKioqKi4mKioFHNjc2NDY4ODc0NTc4NTY3Njk5NzY2NzY1Ojk6Ozo7ODk4OTg3Nzc5Ojk4ODc4Njg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISEhomKioiHiIiJioqLiomJjHo+OTg4Ozw9Pjk6Ojw5Ojs5Ojs6OTk7Ojk9PT0+Ozs8PTo+Ozk7Ozw7PDw5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3Vzdnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFAQj5AQkBAPj09PkA/Pj9AP0A9PT9CP0BBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fX17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVCQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uKiouKi14+REdJS0pJRkdHREZIR0VCQEBDRUNCQEJDQj9AREhFQ0VDRUVBRkVGREVGREBCPzxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFZITUxNTE9JSUtJSUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZIR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BOUE5MTkxKTEpJSUhKRkRGSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIR0dHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozw9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyLi4qNck5SUE5NTUxMSkhHRUlJREpIR0tKSEpHR0dLTE5MTEhISUpNUU5QTk1PS0lHSUpISURJSEhGRkdHSEdDQkFDVW5wdXd3eXp4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLX1JSUE1OTUtKR0VCR0pHTEtGS05LS0pKTE1MT1BOSElLTE9RUFBRT09KSUpKTEpMRkdIR0ZGSUZFRUJBQkJcb3J3eHl6enl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418WFZSUlRTT0xLSkRFRktPTk9XVVFQT1FTU01TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRklKRERFRUJEQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkJHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toV1VrYUVSUVFQSTs7UlRSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT05SUFBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdHRkU/P0FBRUJDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKi4x9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXV1XXVpVRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3eXl6e3p7fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiot5bnBYWlxbUlNSVlZUW1p1g1lVfZBgXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU5QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlUVVRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5W11UWVVWXVpLVFpVU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JTVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5UZFV/UlFRTktSVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV2dXNzd3p6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPUNJR1ZASE5MR11pUEhGT0ZERUZJR0hDREhHSEtHREJBREBOUU1SZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYJrTUc/QDo7PkBAPz8+alFLYUVGSElFQj9HTE5HTVFVSUJFPz88PTw9PT89P0FDQ0A/PD1CPkpNR1VudHR1c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsampmYFtRUlpcWV5KSlBRTktMUVJRVFZUV1FRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTFdOSEdAQTw5Nzc2OTk9Ozs7ODk4OT88Qkg/XHN0dXZ1dnh6fHx8fXx8fX1+fnx+fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGRkhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RV1BNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fX5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWlhNTFRUU1BRVU9MUlNUV1hUVFhRTFdZWlZYWFZYWV1XWFhoc2tdVmFza2FhX15kYV9eWVRRTk5OTElISktJSUZDUVBTW1dUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTk4OTc4ODU3NTc4NTk5R25xdHd4eXt7fX59fXx7fXx+fn56fX58fX9/fn1+fn5/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09UVlhYWVNVVExLVFZVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxPUlJPTU1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8/PDo3ODc2NTk5Njc2NjVXcHBzd3l6e3x9fn1+fH19fH19fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xdUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEpPUlBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJRkxNUE1HL0VfUj4zPz5qb2FSUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dnp7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnV5e3p7fXx8e3l8enp+fnx7dXR2cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVU1MS0k8OTg3Oz5APjw9QUBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hQUmFcUVBSTlNOT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0hKTExKRkZGRT9CQz48Qkc/Qj9BZHB0d3t6e3t8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hERD05Nzc5P0I+Oz9CQEA+QURJRUNHR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU5OV0tLTUtMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p7end0eHV4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hKRD9BPTk5OTo/Qj88QEJCQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVES01SVExKSU1UR0lJSkxKS0xJSkxNT1BRUEtHQ0tHQ0JKSkxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxR0tER0hIR0pLSUpLREdCPT49Ojo6O0FCPz1CQkNDSEZJTEpESUlGR0dDQztBQEI+QEBCRURJTVBISEtHSEtESElLTUhKTEhJSktKTVxSSEhETkZBREtKTU1QTUtNSktGR0dKTU5RTkxibWl2dnd7eHx6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0NGRUdFRkZHRUdCQ0A9PD05Ojo6QUNAPkJDRUVJRUlKTEZJSUdGRkNCO0FDQz5AQ0NDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJSEVOSUJGTUxOTE9NTk5NS0hISU9SUVNOUmZmZnFvc3h1e3l8bGhqbmVrcWxzcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUNDQ0VAREI+QD86Ozs9Oj0+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9RUVCPkJDQ0NER0hJR01QSkZGR0tOT0tGSEpGRURFSUpIS0lGSFBLQ0lNTFBNT05PT05KSklMUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZnFsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEdFRUhDQkFCRD1DQj5APTk6PT86PT5AQj5AQkRHSkZJRklIRkZHRUNDQUFGRkNCQ0JERUVHR0lGTFFMSU9KSkxMSUdIRUZFRENJSUhLSkdLUk1CTk9NUU5PT01OT0tLS1BVV1ZVVFhfXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQEREPEJBQUM8ODo9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lKSUtNS09TTkRRUlBRUU5QTU5QTUxNU1dWWFhWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlveU1IR0hIQkJCRkU8QENCRDw3Oj49Oj46QEI+Pz9DRUZERkRFSEZERURERUZHSkVFSkdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BTT1FNTlFOTVBXWlZaWVZaXVpYYWBgYF9oZWNgZGZoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TklIR0lDQUNIRTxARUJFPDg6Pj49PDxBQjw/PkFCRkNFQ0NIRUNFRUZHR0dJRkdLSERJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OT1JVVk9LVVdTUVNRUkxPUVBPVFlaWVxaWVteXl5gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QUFGQ0VFRElFRkVHRUhIRkhISUtKRkpISEtIRkZMSUhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9SUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqZ2dscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkVGSUZJRkZESUlHSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUExPUFJUWFZNTlRWVFJSUVBMTlRTUldbXl5fXV1gX2BhYV9hY2ViZGhiZGlqZ3aLbGtpZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S01MS01HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHREdJR0hKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUVdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lFQ0lKSklJS0dES0pHSEpJSUtISkpOTE5MSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsa1Rfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RFSkVFSk1NS0xMR0dNSUdKS0hLS0lLS05MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWZlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5uXG91Z3BNSnJ5dmtiYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFREBBQkA+Q0ZHQkZDRkVFRURDSEhHREVLSEdMTU5MTU1GSk5ISktKSUxKSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBdX3JrcWpVdXl4cGNea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dIRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFR0tKR01NTkxNTkdMTklMS0lKTUlKSUpLT1BPTk1LTk5MXGhkdV1scVdsTlBRbVVaa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhNR0lERURDQUI9QkFCRkRHRkxIRUNDSEtISEZKTExGTkxMU1JMR0xNSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b250c3ZzSEtISUJFRUVBQD5EREJHREhJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0tKTklISkxJS0pJSEpNTU1NSUtLS1NrYltpXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBtaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVERkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJR0tLS0xHSEtLTExMTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVVlaXVhdXFxjZmFhZWJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQ0BDSERGR0NJS0xIRkRHS0xIREdJUEtMT0tMV0xJRUVISUpISUtJTEpIRkdHSUdISUVGS0lKS05MSVBcV15QXFtgXk1YWVNcXGJeTVlaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRUxNQkRDQkVJRUdHRktKS0hFRUpKS0ZFSEhQSk1NSk1TSEdFQUhGSklLS0lMSkhGRUlGREZHRUVKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2JbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBubneGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDR0hFSEdIS0lJSURGS0tLRUZJSk5LTkxITE5HSEU+R0dMSUtLSkxLSUdFSURDREVCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVZVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUdJRkdISEZGSkdIR0hLSUxEREtKTU1MTEhKSkhKRj9HRk5LS0tNS0tLSUdHQ0RAREFISUI/SUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFJbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0ZJRkZGSUxKTkZES0pMTkpMSUtKSElGQkhJUU1LS09NS0tJSEdFRD9FQ0hIQkJHR0VUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUdGREdNUkhDUUpGSEhIRUZLSk1QRUZJSktOTExJTExJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUdFRFdVRVxVXlNWX1hOVFVOWlpNSktUYGFbX1heXmFdTlliXGBgX2JjYl1hYldfX1RQTk9PV1FdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlLS05MTExNS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENCRUZCTUhCS0xQT05MRk1GR0lKSEdMS01PUElMT1BPU09MUVNSVVpZV1lYWGRXT1NUUFBOTU9UU1tZWFpdXGBhZGVjZ2NrbHBzcnp5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTEdISkhHTUxRUUlMS0xLTk1VTk9LS0xHR0tQU1NOUE9OT05PSEtGYEVEX0xEZmRFTVtJXltybU9NVW1ZTENRYFVrV2dKXVhVXkRNUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpTV1ZUW1xbYGBhYWFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSEVHRkhFRUtPU0lKRmBTR0pPSklPTVJRS01MTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlF/UUl8WVlxc1hQbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVlh/anR1dV9fdl9YYVtcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTkJETExHSUxFUVZMS05JS1JYV1FNT09NUVROT1FQS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFpSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3J7fG9+eW9/cl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKS0dKUE9NTUpOVl5ZVUxRU05YWkxTU1JOTFBJUVJUWVdXUFRQUFBRS0hneGxjeHJtW0tNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp+bHh6f29ob1l2dmp1dXCBYHJnfGlseHxvXl9fYmFbXWJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl3cm5OS1N0TkNCRlBQSEpLSkxRT09PTVBaYFpXS1RXUGFeUlZRWVJMT0lTVFZYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cm1uXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hmZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBJTE1LTFFRUFBQUVdcWFVNVVlVZlhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfW3B6e15genNjcm94cWhkfGlyfF5UTGxgdnVraXV8e21+eGt8cF1eX2JbXmJkZGdlZWViWmNjaWtrcnNyd2dsaWhkZ2Fha2Fnc3JsZ21tcnxrbWhre3RtbWttT0hKS0hJSEhRUExOT01NU1JST1NSV1JWVFBXW1ZWVFRUYV9QTk1LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUE5RUVhZUk5QVVRYWFhbWlVSU1dbV1hXWk9TVVdYWFJdWVdeV1RQWVJWV1dXWF9bZ3JeW1tZXV1fY1pfY2NkZmRjY2JaY2NmZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PTE1WVFBOVVNOT01MUVBLSlJRS1FNS0tPUlVSUVJTUklITE5PUVJRUVFUVlJYV1xXU1NQUVVVVlNaUU9TUlhWVFlWVFpVVFJVU1RVV1hXXVpeYV1bWlpcXGBjW11iY2RmZGRkYVlgYWNhYmhoaW1jYWReX2NdWmRcYm1hXmZlZ21zZGloa2tlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBLT1dTUE5VUE5RTktTUExPVVNOUk5NTlFUUVVRU1RVTktNT1FUVFJSUVZXVFlaW1lTVVJUV1dXWVtUT1RVWFVVWlVXWVVSUldWVVdbWVpfXVVYXlxeXVtdYWFeW2JiY2dmZGRiWF9gYl5gaGVmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RW1pYV1haWlhZVlxqZFZYWVpXVlNTT0pOVlRQT1RQUFBOTVFRUFJYVFFRT01PU1ZPWFJUVVVPTk1RU1VVVFRSVFdWWl1cWlZXUVJXWFZbW1dRVFdWVlZZVFhYVVJSWVdWWl1ZXV9eVl5dXmBcW19fX19aYmJkaGdkZGJZYmBhXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcW1pXW1tcWVpbZHFtaGReW1lWVVdRTE1WUk1OUk9RUk9MUFNSVVpVU1BQTFBYV1JXU1NTWE1PUFJUWFZVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaWFdcXlpeX2BVYVxhYV1gYl9dYF1jYGNnaGRmYFpjYGFfX2VkX2BjW1pcW1xZWllZV1xZXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUk9VVFNQV1xdXFheXF5WXF5qcXd5gGJcW1ZWWFFNT1ZTTlFRUFJUUktRVFRZWldVT1FOU1hXVFNVUlJaT1BTU1ZbVlZXVFZaWF1eW1teVlNOVFVWXFxWUlRWVlhZU1RZXFVTU11YWl1eXGBgYFZhW2NiXWFjX1xiYWJfY2ZpZGZeW2RgYWBhY2RfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUVdSVFBbXV5eW2BcYFVcXWlqcn1zbGdcVVlXUE5SWlNSUVNSVFVUS1JWVltaWlNPU1JWVlZUT1dSU1pSVFRUWF1XWFhTWFxYXl1ZWl1UVU5WV1deW1hSVVVZWVlVV1lcVVRXXlldXWBdYmJeWV9bZWFfZGReXmNjYV5lZmlkZl5eZGFgYGFiZGBiXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFlbXlZeWV1QT09SWlBaVFVWVlNUVF5eYF9eYlxgVV1eYmt5dGx9a1pVWVVRUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlRVVlpZWldYWlxWVVpeXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUVdZUV1VVllXV1VYX19hYWBjXWBUXV9iZWV1gXpoWFlZU1ZTVlxYV1dWVlddWE9VXVpeXV1UUldTV1ZVU1RYUlNWVFhYWF1eWF1bVl1fWF9fWF1WUVlUWVpaYVlcVldYW1pbWVlaW1hWXV9gXmNiYmVkXGJcYGZhZGZkX2BkYmJbZmNoZWNmYWZfYGFhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lWVlxgYWJjYWNfX1ZbYGRhX3p1b2hZXFpVWFRXW1pZXFlYWWBXUFZeXGBhXFRUWFBVV1ZUVldSU1VXWlpcX15aX1xWX19ZXl5ZXlZTWVdZWV1iWl5WV1tcW1xbW1pbWVlfX2BgZGJjZGViZFliZmNmZmVeYWJgY15iY2lkY2dfZ15iYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXlxdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZYUFdWV1dXVlNVVFhcXF5gYF1gXVdhXlteXFteWFZYWFtbX2BcX1hZXVxdXl5cW11YW2BhXmBkY2RlZWZiWGNlZGhnZF5jYF9lY11laWRlaV9mXmNiY2FhYF9fW1hZWllaWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1pYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXV5ZWFZXW1xgXl1gWlpeXV5eYVxbW1pcX2JeYmRjZWZlZmJaZGZmaWdjX2NeYWZlWmlpY2ZpY2VeYmJjYWBgX11dWlhcWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4S1hXXFlXXFtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRcXFhaYmVjYVJcWk9YWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX2BcW15eYGJjXFxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxjZ2BcaWliaGplZGBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXV5fWlhWW19eXWFhYF5bYGFiZWJfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgW2VnXmFoaGJoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7fHx8fHx8e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7fHx8fHx8fH19fX19fHx8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJioJFPj8/Pz9AMCorKysqJWKSjIyNjY6Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyNgzoyMzMzMzQhGhsbGxsUXZaPj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl6eXt4bm9vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8dnV1dXV1dXRzc3Nzc3N5fX19fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z3enh7enl9eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t8fHx8fHx8fH19fX19fXx7e3t7e3x8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3h9en16e317d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x6fXx9fnx3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHp6e31+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7eXx9fH57eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHl4ent5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzdHJxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnBxc3Bvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3F0c3Jxb4aEbnBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXF4g3FycnB3nX9ucHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcXahiHBycI+hfW9wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFyb5Wqf3B3oKF9b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXJwj7GecIGloX1wcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnCMtqqRm7KmenFxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3NzdaCno7OopqV4dHNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh3eHiCqJ+jsaObpI96eXp5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX59fHt8fI+jkZOlnKChlnt7eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19jqCYlpmclpCZgn9/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYCPsaqln6GfoaGDfoGAfn9/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/gIGAg6SuoaehoKCorJ6Ffn1+gH9+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn+AhY+nsaScp6GgoKKjq6mcjIKAgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOChoubqaqjnZqinZ+hoJ6foqWhlYaBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4KEh5CYmJaXmZyMlJ+dm5yalIyIhIODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KBgYSGjpaXlYePmpyWjomHhoeHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+QkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgoGBiJKXjpSak4aHh4iIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEhIKCgoeSloqEhIODhYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgoKCgYiRgoODgYKAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgICAiJGAgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf4CMloKCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpiKg4WEhISCgJKahoKCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpOPjIyKhYSDg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2LnI2AgoGBgoKGlJOMgYKBgoODgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GXi4CDgYGBgI+TjJCBgoGCgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeKfYSFg4SCg4OCjomFjIKCg4KCgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJOSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn9+fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIuIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYKBgX59gYeGg4B+fn9+f35/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYJ/f39/f39/foCAhIWEhYaGhoWFhYWGh4eGhoWGhYWGh4eHiIeHh4aGhoeGh4aGh4eHhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aHhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiYmJiYiHhoeHh4mIh4eHh4eGh4WEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaDgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoeIioqJiYmIiYmJiYqLioiIiImJiouKioiIh4iIiIeIiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhoaFg4mUk5CPkI6KhoSGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgIGEhIKCgoKCgoKAf359fX19fn18e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoeHhYaIiImIhoaHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KDg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn1+fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeIiYeIhoiHhomJg4OEg4WEhIWFh4iIhoWDgoKDhYeGh4aGhIKCg4SCg4SEgoGCgYGBg4OEg4SRkpCOj46Lh4WGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoeHhIOBg4OEhYWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKBgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSEhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Bg4ODg4OCgn99fX+AgIF/fX5+fXx9fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICCg4KAgICAgIGBgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59f4KDg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn9/gH59gH9/gICBf4CAgX9/gIGBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf3+Af35+fX5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4CAf39+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl4foGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgIB/gH+BgH5/f4B+f39+f4B/fX59fXt8hpOSjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fXx7enp5eXl5gIKCgoSDgIKDgYCCgYKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk4+JiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH9/f3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHiIeHh4Z/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAgoN/g42EhISEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoODgoOFhISFg4KDg4KDg4KCgoKDgoKCkpCLiIiHiYeGhoSGhYWEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGh4eHh4aHhX99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIKBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH18fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIuOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OEhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fX18gIGAfYaPgX19gn5/foCCfHyAf4KAgoB+fXuKgn2Af36BgICBgoCCgICAgYB/i5SQjIyOjo2IiIeFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyCgIF+f4F8fn5/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fH18fH2Af4CAfoB+foGUko2NjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDg3+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf319foCAgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2Pjo2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn99i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+gH5/foSSjY2Mj42LioaEhoSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX58e3x8fHp7en1/gICEg4J/fn98fHx9fH2Bg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4J/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXt8fX18enx8foCCgYCAgH18fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEg4GCgYWGhYWGhoeFgYSRj42LiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fH19fHx8e35+e3x7fHx9fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqIi4mFiJKPjImKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH+Af39/f3+AgH9+fn59gICAf39/f4B/gIOCgH+AgYCAgH9/gIF/fnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX19fX18fXt9fH19fnx+fX19fXx7e3t8e3t8e3p7e3p6ent+foOFiIeIiouLiomMkZCOioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX5/fnt+gZKMfH1/ioCNjH5+fX19fn59fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7e3t7eXp5eHl7fn+Dg4SHiYqHiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf4CAgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH5+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIj46Li4eFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGAgYGAgIGCgoKChYWEgoKBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+f399fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImOi4yIhYWFhIODgYKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGCgoGBgoKCgoGBgYODg4KFhoSDgYCAgIOBf4CBhIF+foB/fn6Afn1+foCAf4F/f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fHx7e3t8e3x8fH18iouJiIaGhYSEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH2Jh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhISBgYCAfoCCgH5+foF/fn5/gH1+gH19fX6Af3+BgIGBgICAgYF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhIOBgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SEg4OEg4GAf4B/gIF+fX5+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn59fX9+foWFgYGAf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX98fX1+gX9/gH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYOBf3+Dgn9/gH+Bf4B/fHp7enx7fIKAf4J/f4CAgoKBgX9/f4KAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Bg4ODgH9/gYGAgoGBgYCAgICAgICAgYCAgoOBgX+AhIB9gYOEgICBf4GBgoB9ent7fHx8f35/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYSChISFhISEgYOCgYOBf4CBfn+AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57fHx8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gH+AgH+BgoCAf36AgX5/gIKBgIGDgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX18f4CAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV4eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GAgH99gX9+fn9/fX19foCBgoF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fYCAgYCAgICAfH9/gH5/gYB/f36Bf35/f399fXx/gICAgH5/fn5/fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIGAgIGAfn9+f399fH59gIGCgYCAgYF9foB/fn+Bf4B/f4GAf4B/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgYSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGBgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af35/gH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+eoGTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAf39/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoGBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH5/gIB/fn1+gH5+f4B/f3+Af3+AgYF/gIGAf4GAgYGDgoGAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH9/gIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gH+AgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgYCAgICAgYCAgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx4eHV4eHl7fHx9fHt8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoKCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoCAgIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCgoKCgIKBgYKBgH+AgH+Ah35+fHt9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGDgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgH+Ag4J/fn+CgYCAf36BgIF/gICBgYGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99e31/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoKCg4SCg4SDgIGDg4aDg4OCgoSBhIOBg4CAgoGEgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9/gIOCgIF/gIKDgoCBgoGCgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4KChIGEg4GDgIGDgoKCgoKBgoB/gYCAgoGCgYKCgoGAgYGBgoKCg4B+gYOBf3+BhISBg3+CgoGDgYKCgYODg4SBgoSCg4KCgYKCg4GDhIOEg4SFhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+BgoKAgIKEg4OCgYKCgYOCgoODhIODhICChIOEg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe32Bfnx5fHp6en18fIF+enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ+g4GChISCg4ODhISEg4SEg4SDhYSDg4OCgoB8gIF/fHx9enp8fYB9f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCg4F+gICCgoOCg4ODhIOBgoKDg4KDgoKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEgoGCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4WDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4OCgYSDgYODhIODhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn5+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIOEg4WEhYWEgYSDg4aCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSFhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXqEf39/f4SEgoODgoGDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDfoODfYF9fn99foKDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWChoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f35+gX+Af359gH1/gIF/gH5+f4GAf36Cg4KChIWHh4R+hoSDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgYF/gYGAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX11b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319en17fH19f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiISGhIWFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhIOBg4ODhIWEhYSFhIaDhYaFhYSEhYeGhISFhoWGfXeFhISEg4KBfX9+e3x7fnt8fH1/fn19f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaHhYWFhYaGh4iGhIaFh4aFhYOEhYaFhIaGhoaFhYaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWFhYSGhoaEhIWGg4WEgoSDg4WDg4F9gH98e3x+e3x8fX9+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5/fH19fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWChIWGhoSEg4SEg4SGhIWFhYaFg4aGhYaFhIaHhYWEhYWDhIeGg4KDhIOEgn6BgHx7fX57fHt+fn17fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoeFhIOEhIOEh4OEgYKEhYOBgICAe3t+fnx8fH59fHx8fX18fXx+fXx9fX18fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFhoaGh4eHhYeGiIiHh4WHh4eGhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX5+fHx8fn18fX18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeHiIaGiISDhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx+e3t7ent8fHx7e3t+e3x9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIeIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeFh4eFg4WFg4GCgoGDhYKDfoGCgX+DgX9+fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhoKBgn96hIx7gISFh4aGhoWEh4iHh4eFhYeKh4OHhYaGiIaFh4SGh4mGhoiIh4eGh4iGhIaGhoeFhYiDhIWEh4aGh4WFhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gHx/fH19fn17fX18fXl6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhoeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaIhYWEgoWFhoWGhoeEhYaGhoWGgoODhYGAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgYOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoODf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fn9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhYaEh4aFhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag397gH19f4J+f4F+foF+fn59fX97f3x7enl6enl6e3x5enp6e3t8ent7e3x9fn19gH19fHx9gH99fIaDhoaGhoWDhIOFgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSEhoSGhoeGhoWChISDhIWFhYOEg4OEgoSEgH+Cgn59fn9+fn+Efnt/fHyAgX2BgH1+g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9fn+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYODg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX2NnY2NjY2NjY2NnZ2dnY19fX19fX2NfX19fX1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QTw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4t6mnp6enp6enp6enp6emrrm4uLi4uLi4uLi4uLmwioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6Ojo6CGhISEhISEhISEhISEgpKlo6Ojo6Ojo6Ojo6OllVNSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/OzxCQDg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWiiYeHh4eHh4eHh4eHh4WVpqSkpKSkpKSkpKSkppdXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw8Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqampp5COjo6Ojo2NjY2NjY2MmqqpqampqampqampqaueYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Pzs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLQ0NDQ0M/Pz8/Pz8/PztDR0tLS0tLS0tLS0tLS0c3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7R1M/PztDT0M7S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1tbW1tbW1tbW1tbX19bY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Tu53Pz9K5j77UnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StZWbs9TAlLCcsZa4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/P0Z+gqq7WoqCLkcOTfX6vsNHOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OTY/Qj9COjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9HFh5qxz5iHnbrU0s2ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P1qeZs8iZkJ+g0tPAoKDQz8/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PT05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9WlmbS+qa+RobnXr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDWpZm1v56arZup2KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDQ1aWatcaWpsWYotGen8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GP0hIR0VAPDw+Pjw9PTw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT0NWlmbPRmpybm63Hn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEM7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhx9LWo5qw2aWrpJ7FtKSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPR1bWCw9XMk5Cn17mDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PD9HRUdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHRwtTS1Mu91dLRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE9Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tTS0tLT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjY5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QkdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2trb29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1OTc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubi4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm4uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6OTo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbS2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT02Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrqKagnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6enn5uam6KgmpaXlJqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeTkpSZmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainpyfoaCYkKGsl5ebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWlpqempaWmp6Wlo6CgoaGfmZmalpibmp6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKkpaSmpaWkpKOioqGdnJyiaombnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKltqmjpKSioaGempmlgVaOm5qamJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgp6qwqKChoJ6cm5qdolldlJqbnJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGhoKaigKuln56dmpmZp39VZpWcnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKCgoKCfqnd2raKenJqanKRrYWmVnJ+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnp+enaiMaYyrnJubnKCXbmlrlp2dnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cm5qjkXl1n5yanJ2giGtpa5KfnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZqao5R4fIWYmpyemX1qZ2ySn5ycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmZmZmqCci56AfpignIWNgWZtlKCdnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmZmZqcp6GRcWWmrKFogY15a5efnp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmYoa2Sd2VmppeaWGd9f3idnqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZl6eleE5KcJuEhFJEYXiCnZubnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampermU43PHSSfXBTPzZheo6SjZKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZCWrXNUcFd8sKmZWmduSGt9iIKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoN+lqRchZt8ysWxxZ1+nXpQeIKCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+fpKRcs/XzdWmnLm8a11yXWeAhY6Ni4aNlJKLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioR/gnyZd5rRvcfTx8G0nHelqGNiioqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGMf4iNjYuLiJKMm2+ippW5rKKhiYV2YciLWoiKiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkZ6hnZOXm6GanpyjoJ2Ek3yPpY2Fi3d1cGyml2GBj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqayqqq+nln5YcoZ5eYBta2l1eH94eqChpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqWpqKerqYVwUmB0cXJ6aWZiaWtwfIWiqaegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKimmp2kpqKjsJhwaU9WeHZ0fGhhZGZfX259iqCkoKCfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCjp6Kmraewsql8aWNJUnN1eIFoYGNqWltia3WDkZ2hoJ2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqpoqChqKmttbq8vayKbWdhQlpucH1+bmFfZltZYWFocHh/jZqgoaKZlp6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjq6qnrrnBxszFt6WOcmhpWj9TcG9xbHRoYWFaWF9jYWJqcXZ7jJ+nnZ6hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKq0v87Z2866q5yIb2BhYlNDSnlrYGJtbFtbV1pZXVtaXmNmZmh3j6Wvp6WZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaXZrcGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1vM7a3dTApIp2ZV1ZWlxTSkNtapSelFZUWFddXF1dWFVXW2l+larBx7q2oaeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDw7m9wMbO0c23knVkW1laV1NJVW+qs6ZOVV5hYl9fX2Z3kKe6vsHFxbS2tqmvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xcHFxsG+vMzEsJFvXFVYU1BTobWbTllbXV1gbY6qusG1uamnsbWrtbKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx+hH9qZmhha2xnbnVycnVxZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhCQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8PDxsbBsZK/v87OvJVpWFdaTJm5k0xUWVdgf6a8sKarrLKmqqmpq62sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3pqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTEubXAt7O8wca+qXlYVVGKt4ZMU1VdhKCmt6+lrbS0ra6lpKOnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7d25raWh2WmdyeHN5ZmZeZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxb64vcHDv8e9lmxSWmlaUVJklKufprSyray4tbKsqaOhramsp62frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF5qb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHv8THxMTGyc7KnFZIT1Brrbu3wL2+uby6vLq8rK2mqbu6ube/srW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmlqanRueWxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcXFxcPFxMnL0dOkUkxgsMfAyc3GxMHEx8G8vrSxsLDCvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BrandsaWZ1b3RjXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwcLGxsbIzopJk87Mx8zQxba/v8DAuru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2NqZGJrbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr69wcDAwMWqTqTRzMXJ0cGvvb24ubu7vre0sbm+s7y+sbm1uLu2vLS1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2NkamNnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwbu/wLy7xL26wMS/vb24vMDEr1OczMTAwcm/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe3uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2llaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjry+u8O1use3trm7vLi5tbrEyapUk8i/v7vBvrnGvcK/vMW4tre0uLa2u7u5trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWZlZnBqZWtoWFlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxXmty73Ht7m4rba0t7mztbK7xcqfVYvKv7++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h31rbnFncWt0ZmJuYFxUSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1692hL7Iz8LAuK61tbu9t7mxvsPHlFyGzsPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxqbnRveGNnYlxjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydGbdHex0dHMysS1ur/EyL6+tL6/v4VqesvGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOCdG9sbHRsbG5fY15hYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrCiHZ3qMzMy83KxsLDy87BvLi8ua+CfG28yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFkW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7uqzbw762vsC+vrqmnKqzt8PApnx6fJ/ExsvIwcPAwMnKwb+7ubGjmIp+sMjFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4dGhwXlxfXFpRRUVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xbZtrs69trnAvKp9bmhubXSCl5l1e3+cvr/GwLnAvL7FxL29uLGvp6yXl53Kw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d2x2e3FuaVxgYFlTUEFGSUdLQEVDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2xdoKzvba1waSGaVpeYE5TW1xwdnqFpLi3wrqzu7e7vb+6u7uvoqyyoqiCvsXDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dndvcWFfZl1bVUo9Pz9HRj1HQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJpoR4i6GvtZxqZmdWWV9JSU1QVG97i6mwt765srWyvLm8trm+tZavwLC1eKzKw8C9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF1d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqiHe3aMoZhfU0NZVUhialVPRUplkaWvr7a6tbSyrLy5uLW4wb2Np8KysnanysK/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c25jXmdZXV1TT05BPkpCQEtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+0kIF5iJBuTks/ZVlCT3iBk2hNQ16FsbWztbK0r6y7uri2ub/FeI64qZ9mq7+4tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWpsXVxrVV1bUE5IREdNQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIV8WEZBT4dYSkpZeI6DY0FVo7mztLKwsa2wubi2u7e7vJKks66kdKywqautq6OooZ2dnpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodXRvZVVhZFddUU9NSEBJUkRNQz04ODc1Ojc8Pjk7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmJmVaE0/U3hxUElJS2idgFpFVbC6sayzr66srba2srS1rqmnnpmbnp+mqJ6gqKmfoaeWm5aXjp2Uj5CWjZebpKigoKKioqWlnaOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpuZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqGIeIN8dn96Y3dsbl1RaVVQT0dQTUxDUFFAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqqlvGdEU5t9UVhJS2FKVo1iZWWDr7WqsrSuqquvsLKzraWdkZeTj5egn6KgnKOkn56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnx/dXZ9bmt7ZGhWUmROSkhHT1NOS05IPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgq8a/yp9PQXSYcVBuSkxjZnV0YF1idJKyr66ztaqmrKuim5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6WqqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd5fGV5eWBiU1ZhSElKS1NUSVNRTTk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKXGxoxXU0pmpFlmfW9yW1JrY1xnYmBtkbSwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk9PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVpcnd1cGN3dlhXYmBkaVtaV2itrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO2uLO4rbK0pKCdpaCsoaGioaCamJaVn5ubmKWhoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgoB9eHZqd3VebVtSYUlSVUhGVVdKQ01HPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgpH9vgnBgY1hMW1JaTExRWVJIT05ImayqqaSfn5mSkpSYmJaWlYyIi46VnZydnZ6Xnpmmn6CopbGqp66jq662sLSysa62uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5uLyvs7C1wry3vrOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaG1cWFxDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjnpyJYldeZWBXTVFHPT5AQ0Q/PkJSeKmtqaqln56foqOdnp2anJuUk5WUnp2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2u7vAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Oqs62qs7Svs66qr6OdrKi2sa2jsKago7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2t1cnFoVlxRRlVIREpQST9FQTRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBRRkQ7Qz5GPD45Nk5+qrOno6OioJ6lq6aemJyUkZmdmZWMioaIhnhtiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8PKysPBx7+6tLq7tbu3sLayqrqyrru4v7u6q7itq6q4u7W8rq65o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Npb3hrZVlbRktMRURUTUVDRTc6Pzo1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXJpYVdORT5JWXxvYUE9XI6urKCZm5uenpmXl5eSjY+Xl5OOjZCMgoOCd3JxbXCPpq2utLnFu83Hy7/CzM3NzMfJ0czMzMfJxcbM0NLVztPJvcC/w7vGxcjF0dPN1NDT08zKwsXGxsrIz8DJ0czHxsjGwrzDwb+/v7a+s62/wMPDx8XHxK+/ubK4vMTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl0c2ViZ3JvZl5aWkNOTERGUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWlmXFRJREA/SoaepJiDoLKto56cn5qYl5SSlJaRkI+Mh4SDiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0tfS1dbT1MjMx8zNytPNztPNxsnKysLHzMfJyca/w7OzyMXLy8vPx8q/vr+9wcbFzczJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHtydXZnY2d2amRWV1FETkZASVFDPkI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZthU0xKREM/Q1Kw0b2yr6acnJygpKGdmpSTlZSJfXhxa2ViaHJvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbO1NbX1NPR09TU08/RxNDT1tjV1tLLyc7Ry8bN0crS1dbZ1tfT19jO0srP0czP0MzT0MDJyMrEzMzMz8/Fx8i2wMvA0s3M0MfKycDEw8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2BlcmJdUlxJSkdBRUlKPjtBOD01NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWUlAQURBRlF2sq+mmpSXn5yaoKCem5yalYl3aWNhX19gX15fX11hbHVzcHBvbHJxdZLEyMfU1dfX19PX0NXU2tTUzs/V1NTR0czRztPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1NXMz8/KzdLLz9HAxsPIxs/O0dHSyMzNwMvNxtPPzM/IxcvHx8nMytTU0dXP0szTwrnFsaWota6nm6irpZ2yqLCzrayTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9jU1dnZ0c7Qv7zMyba+rqaqqKGjq2VDOD0+RFiCqqifl5WXmZqcn52YnJySfXFlY2JfX2FfXmFgX2BgX2BlbXBwbmtvcnd3nMzB09XT2NjW2dHS0tfP087L0s3V1NHKz83T1tLR1s3P1dXRxdHUytDU1dbO09HY19fYy8jOxMnPzMrNwMrAycrOzs/L0M7OzM/PyMzQ0MvOy8PKx8nNy8zS083T0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF6SEZCO1eNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NztTMztLNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzcLIysPMxMbJysvPy87N0M7TzMbJ0M3Jx8vFx8HGyszN0NLH0M/OzszQxcfBuLm9w8O9w7iysr6xu8PDtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21nYGBxaFlYaFZNR0xJUFFCO0M+OzY4Ojg6OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHw7jK1dbZ2tvYzMzPyNbVxMK1r7Son62XeGxwcXmPmo2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYWBgX2BhYWBfXVtdZ3JycHJzcW1yeaXH08/L0NDT1MrFycnGxr/Dxc/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0M/GusS/xsq9wsfJzsXDx8DHzcjEzMvMz8jExNDJxsLGyMS/wcfMy8zPwsvMycfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raO2fmiDhaSrk42Nlo+Fg4ODgX2EhH5zX1teXl5gXmBjZGNfXV1eX2BgX1taXGBscnFvb2tsb299udHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMrNycTCy8nBwcvQxcvIv7nCu8bHvsDGz8vEwMO7ycfJvMnHxcrAvsLLxsXEvsa9vMHDxczFxrzAycPFx9LFwcm/ysnGyMbRw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXx3c3RmaVphbm1aXFhSRExGQkdFTERGU0A1NDMzNT88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9Xa2NnPy9LNzc7IwbXDvrGvtmxeen2hkYqSloZ6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpa3Bvc4/HvcrFy8DGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7rGw7+8wc7Dxr6+tcG9w7u9x7vDurS9xsTCwre/tra+v7vMw722usi7v77Lw8HGwsXJx8nG0MbCzMiyx8nDzszAxcO/vbK3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9kVl5ZSkZKRkhLQUZCRkpAOTo2NTg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrJxs3NztHI0MXV1NXXzcrOxcnFx8G5xb2rrqZgZHWDk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5nb3MwMO6wLitsLGnqq2sp7i0trSzs7S7tr2xt7C1r7K7wrzBxLy/u7Wyur7AuMi5tLu3wcK9uL3HwcS8ta+ytru/tMW3u7Wrub2+wL2xurawt7qzxry3r7u/tbe1xby+w8XAxMXGx8vFwMbGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IycjKyMrE0M3Sz83Fx8HGwL+6t8m2qrCZW2dwio+FiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmlmam1ucnykx8C4uLWwq6ynnqKpp56qrLOtqqyqtK22sbOprqess7u6tsO5urqxq7W5u7TCurDAsb68u7a8yLnDtq2qqLCywLa4vbCxp7Gztbu8q661pq62rruysaq5sK67rru4u8DAvrrDv8bDxcC8xsHHy7jFx8W/x8PDusTGwrvGyczLs7nCvbuziXN2dmtpYGJsaVlYV1tBTEtNSkVBQz9GQTo5Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHE0MfNwcPGv8TEw8PKwsnKv8C8wrqztbXDrqqwkltqf5KHjo97eH2JhXp7hIF3bl5dXFxdX2BfX2RjYmNkYmBfXVpbWlpdWlpZWlxlbm9oZmhpa25yga26sLWupaSnp5qgpKCanKWrrqSooquqrKuwpKafqq20trG9ua+3sKiuuLSzvLi0vK+4ubWyvMGywa6lqKOrsbKzqL2qq6irrK61s6WorqGkr6mypqiorqaot6yxsre6uruyvL6+vsS/tcLBx8i3vsDEt8TDv7u/xMK+xMjMyr+/w8DAqYdzdHNqaVxhb2RXV1hQSFlSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Nw8e5ucvBy767yba9w766yrfBw8G0try2sa+1u62oq5JkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXl1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqqWspZ6coaSUnaSal5Gho6mjo5+lpqemraCdnKSmrbKwtrensa2oqrSrtLqxtrautrmysLq6sbeloKSfprGorKm6qqSnp6insq2gp6afm6SmrJ+fp6SgobGtrayytLO0sLW8trvBwLK7vsPBsbm5wrPBvsC1uLy9vrzCx8XDxL/AxKCEeHFsYmZga29gVVlfSE5nT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci0tr24usC6vbagnpSdoaa6tquzs7uzxM/Jy8PGuLfHwMy/uMm3u8W4s8W4s7/ArLW8sqylr7OtoaORaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBhXlxbXFxYWVhYWFZYW15fZGNiZWdnZ2ttb4idqZ+WlZqhlpuimJWMnqGip5ygn6Sloqeem6OcoKuwrbG1pKmqqqyspLS4rbewrLO2r7O1r7Cqn56fo6Kypaaqua2ipqagqK2rmaCfnpmdn6WamqOcnJ6vqauoqqytrbCyuK+4ubqwtry7uquzsrmzvbS2sbG2tb+2vcC+w8K7ur2XhHtza19lXmRkWFRXXUlXXEtQR0pKR0E8Pz9AOz88MDU1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnHuLe+t7LCtLG7u6y5urGinqmrp5iej21+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9hYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtyjaeck5SUmpeaoZaWkJuioaienJ2lp6KlnKChm5mvrq6vsqGlo66rp6K1sLKyrKmvs6e6s6a2oaOfm6OhraOiqraro6OmnqWmo5aZnZeZm52gmpeenZ2craGrqKOkpq2rsrOqtbCyq7K5tK+qr7Kys7ezrqmtrrK4sbq2ur3AuLOxlIZ6dWZfZl5bWVZTWlVLW1FMSkVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/s52lo5ilscK1tr2ttLjBzMjGv8W2wcDHzrfAxL2zubmyv7axubutsrSvn5qkqqCUmo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanagm5OTj5OWlp6WmJOXoJ2hnJahoamkn5+pnZybq6evsKuco6S4qqGgrqi2qqeorbGkuLCkt6CjnJmZqqehm625sKOhpJyioKCTlKGUlpabmJiWl5yVn6meqaSinaOqqrGtqLSsqqets7Clq66zsbCwr6+nqKiyrrK1sLy0uriuo5WCendlX2FWWVhTUlNLTV5MUExHSExLRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyZoamUkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JiY2ZpgZWSlIuRk5OamJyVlpyfnJ+WoKCnpqSnqKCdoKagqq+mn6Kjt6ihoaKos6KlqKWwprGtrLWeoZ2WlamiopStsrGfo6Oenpibk4uhlJGTmJiTl5iYl56nm6eiopqkpaWrpKWwp6Wjq6ytpqiur6+rqKqqs6amq6+0sa+8trGvr6CSe3hzZWFcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLe7vMHFurG5tcTJycDDxsXHtsXEs8G/xau3t722vbq7tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWltZWVpbV1VYV1RUVlVSVFJVYGBfYGFfYWFjZGmAkpKIj42TkZKclJWWpJmgl5ygpaKtpqWlpKSjnaqrpZqfpbGqoKGepaueqKKfrq2pqa6toqKilZiim5yQq6mxnKCin5+XmJOKnpGNkpOWkJiYlJyho52koaKVoKKlppujq6WipKqjq66lrrKppqWmprSmqqits7W0ubqwqqyejHNxb2BbV1ZVUkZQTkhaXE9SSlRLU0xFR0pEODs7PTw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojw8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG9w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUVldXF1dXl9fX2JkbYyNgpCFjpCNmJKUkpyaopyboampq6msp6mmpJmlr6WVmaWvqaCcmZuhnq+anKu0oKamn6OkoZSTm5aWkqmqrZqdoKGhm5SQjJmOjJGMko2WlZCeoqCjnZyjlZugo6GXoqijo6iroKuvpK63pqOko6ytqqirr7O3sr21s6uvmIV0c2hbWFlTVVJFWExRW1hNVU9QTFFSSU5KQz0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc2NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3r6ior66bqaist7arvMq7tr+sy8bFuMHOz8izxLq3u8LIsa24v7e8vbuztaapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGV9ioCJfYqPiJCMlpGXmaKgm6CrqqavrKixpamaoK2hlZalqKedmJCPmp6ul5moq5mgnZSloZ+SkZKRk5Woq6WamZmenpaOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpqioqKCxsKaxvaigo6y0q66nsLWwubXAsa6xq5F+cnNiVlRWTlJKR1ZQUlJMTFhOSkxPUkdNS0FDRkREPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsba3vL3Bw7GwsbettLS7s7Sio52dmJeVhIB2a2dsbnFucmtwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1han54fnSHjIWOiJeJlJOYm5ieqZugq6amrJ6omqGmnJOPn6Oal5eFhJKbpJCVo52WlpaIopublIyOipCapaeclZWXm5GSh5SOi4GMjYCQi5KSkqCaoKKWlJiZlaKmmY2ZpKappqGgtLKos7ihnKO3rKqupLKyprW8taussaOJeXNuXU5RUUxPRE5OTlBLRk5OSkpOTlFJTUpBSExISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDEqKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqakt7Glp6SqpaCppqSzqqKyw7W1srPGxra6w8rMxrOsub20uMCvramwnqauuq+tn5manZWViHyDbl9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFucHVvg4eBh3+Qg46Kk5GTnaGPmpyjoqSZpZeinJWNiJmajHONg36Ol5aGkZqQlI6Oe5mPnYyCiX+KmKCjnpCTmJaFjoOUfn50io56kIeTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5mmuKamsaGwrpywvKqpr6qZg3h0ZFdNUk9QTUNTTkxQTUJQUUhJTlNNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBrK3DraiippKdprato6CPlZaSkH54fmZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVWWVtdampwa36Ee3NOWHKPgpeGjZyXi5SRoJmdlZSWlY+WioCUiV87Vm98jJSKgYySjJCGhnOLhZeBeYF7hpOdlIOVjpGQg4Z9k3hxcIaNfYqBkY2Pl5qZk4uQip2In5iHiJaemqGgl6euqa2oqJ6XrrOipq6ZrKuYqLSjqa2jk390b2BcT1NSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOuoaamqqCmqaejqa+op7TCubC1sMfCt7O9z7+5r661wqeqxaqjnZiDlJyxopqYhpSPi4d+c3VdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTU9SVFZYWmBsbmd6gXNQQj9/lZKRfYiVjISKjZuOlpWKkoiGlYd5iX9gSlFueIuShH6EjYuFf39tf3+Ud3V2eISNmnBRjYiKhnx+eJR2aHeGiH6KiZaLjpGTl4yEioiVhJuNgoSSmpaenZSko6ippaSenLGqoaSkkaaplqKqnKKmqIl2bmdfXUhRUVNNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa+hp6ilp6ivrKq1vLa4trPBu7aouci4tqiotbaqsrynnpaNf4qUqJaVin6Og4J9eHFvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboNydX1paFxUkImUiHR+hoF8hYyTgpKai497ho+AdoB4c292cXSOjoF6foqrhXl7aHZ7jnBybXiBi42SeHuAe4B2c3KSeGd1hYSEhXyVioiKjYuAf4SLjYCUhHyAj5iVnJaRn52pnp+gnaCppZ6dmI2npJKgoJaen6SBc2hiXV1KV1BSR0tYUk9KTE1SSkpKTFBITFFMUlRNRUhBPTc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyvLi2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX52hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZnaMlpiNjnxneYF2eICJkH2EmJKBcYePfHd7b2t+rX10kIt/e4aSgXx/dWZ2fIZsb2dzfImMh4BteXF9cW12j3FocYF+jnBEi4WCg4V/d3h6jIZ9jHt1fY6Sj5iLkpqbo5aZnJqdnqGclo2LpZqOnZeOlpiQeG9tZ2NbWFhVUUpTVVRPUE5RVktOS09PSlJPSU5QTEZEPDw3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqGmsKyuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5adpamkoZiZj4WSeYmOi4p1cXttdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXWVwcmyIp6rAfnR5Ynt4b3x5iZB6fYuGb22Mknl0eWpqgIJxlpGLgX6WgEmSmG5oeH6CbWlkbHmFkJKGbHJsfG5yfIZpbnB/c42JhYZ7fn97d3B0dIaCeYF5cHyOjIqUg5aXmJqQkpaXmZedloyDiZ6Si5KNhpCWgG9qb29vWVZYVFJRWU9SVFRSWFVNTkhNSk1PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpaywo62qqLWvrqy0v6u8w7+lopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxfp4dhmmlzeWV+b21/eouJdoKIhnRsmpJ0dHxqap2PTXmFk4mEjmcxdoZzbH59g3RmZXV/hISFgGdpbHVrcYB8aHFxfG6TjY98dH59cXFudm2Cf3d5dWp5iYKIiYOWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra3BoZlhSWldZWVtNUFVWWVhOSUhFSkpIR0NAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpGZlqOorZ6xnqe6r6uysMKxu8PHmpaPlJmLjoV6hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvsqBxe3hsfWxxgoKFgXqEhoZ5cqGVdHiBc3WUhzVxnaidjqGhhKKFdnCHfId8dIyujYmBaGdiam5ybXCCdWlvWHVwjpuSd21/e31tcm5wgHtzdm5idoN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jntzcXFtYFxdXltZWGBfUk5bWlhXTEhKRkpHP0NBQkg/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKefr5WltKmusa7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dHh4bHdud2NpXkpQRz4/NjQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH6Fg3+MfnWimnp+hoGEmYSbnGGGqp+di4OQjXp3iH6JiY5zi5ePhHtdZXF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHl4a25pXXaGfId8h4eOf4qSl4ONhYyGfXGEf4R9dXd7fIl3cHN0ZmdgW1teU1tnXldQVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkZydn6aRoKqgsaivwLK7xbqWjpGUh3uGdmt/jJGCfYqEj4x4g4BzoISKfHyBf3CAfnpndmtSV0xARTIxMTM2NjY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpohIh7iXl8cXyPjHp9iYd+l4d2oZqIh4+SlKWNrapIhq6vr4uBgJOLgouChJKph4CYmIqcdG18gYaHfY5oZ2h5f26Fh4KFcYSGR2yAd3J5dmhta192fYKIf4eEi3mUnZyJi4iRf3p1i3Z8eG1wd36AdHRybFteXlxjY1hnZVxUT1BWWVBETEtGTklDRkNDQEBDQT06ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeRjpaXkpegnq2hprivs72zl42Si5iLfXRwfomSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFhwWVxeaY2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbm6atk5q7sae7x8Ooi4yhpY+UioGRfHGDnp+RnH92hoWLkIeQaWhwhIF0jYeEinGFgneHf3t2hX1udnVmf5SOhomIh4iHoKuilomOl396goh6eW9na3h/e390bGVeW1teal5iZ2BaT0tOV1JRSVBKRE5HQ0pEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3g3uAjH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koWSlX+KgJKbjoOAgYyKgomNg3+KgG1wal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJTUlNTVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVl9jf2dnbXWdm4+akpOLjY6aiJOPnYugoJKjqqWjrJOptqKowcKux694upSafI2hnpmEk4WCjqKfk5iShIqFj5mRlmxwdYqMgpaMjY53j4RxbYWBipaRg4WIcYiglYaSiY6PlqS1qZuNlKKDh5ODfX9ramt9gYKDdWNeZGBbZ2xdbGxeV0tHTlJRTUxMRklQQ0RNRkJDRUZCPTk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImGkIeFiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTlBSVFBQUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6WimaGXopScnqieqKufqKypqraXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiJWim5t4en6UmJKhk5eXgZSee3eVkquyiY2Xn3yUnpuNkpWYo6Kmtq+dkZmoh5aPjYGIbHNzfYF9c2lgXmJgYmhkYGdmXFJFSktQT0lJTEZGTUNITEZHREJHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQk1RUlNRUlNUUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2FkHeViqOnqrS9uKStrKynqLSrsLaysq27sbO9nLPDq7rJy7fDv7ilorCzrK2qo4uWmIWmpqCjl4GmmY2iq6iliIWUpKGgq6GkqY+bsIuVo6a3u5uho7CSop2hnZCjoauvrLK1opSkqoiZiZKJlXp6foaAaWJpXWZjXmRkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoY1dpb1h6hXaBk4WHgpuDkpCMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOFgYyFhoiShoKEiYaIh4dwbmFARTY0PDIvMTEwLSwrLTEuLTQ/Q0FNVVFSU1VVVlVOW1BHSEU8Pj5GSENFQTc7PDVDOz1GS0lHSFJPUFeBkqCErqOzqrLAx8Oqs8W2rLO/s7i+tr+0wba7uqO4xai2yce1vrm1qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6orra7srqsr7Wisauxtbu3ta60oKenoqeaqa+tsrm3uKebtqiMpI6Rk5+GeIKEd1pjZVdnYmJkYGFmYFtVSkRETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRYmNXeXVxgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhYGOf4GJj4eAhoiFiYeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtLQUA/R0tGRkQ7PkA3RDc/QkpKRUZXVFBej6Sto7G0w7a4wczJtrvEvbOzwLa4wbW+r7d0sbOlusSksMa5sbOxtKiktbaqsaCilpuikqWwrqatrKekmKCstLuiqLK6tby/zL/Fxb29s8K3ubi/t7q3uayssKWwqq29sLy6wsKsmbqok62Pl5eqiX2DfmxYZGJZa2ZqZldcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXU1lVWnZqcH6OhICNhG56c3iHYrmhmaOJlJSWkpSTjZCWkoeGe4aBjZWKgISBinp8i4eGfYqCgYqDln13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUVJZWFpnWVRgYExTUEVBP0lKSEVFQUBDPEU2Qj5IR0pMU1pUXZOuuLW6uMi/ur3JzLu8wLu3tbu6tr20urHGYHWypLGanqu9qqWoq6ukorK1oKunn5WWn5ifrqWnpqWfo5Sjp7G0p7KzvbbBvtPJydPHwsXMwsrDwL69v7u8t7SvuLe2w7nFvcLHr565qqGrjqSntoiBgXNgY2NfWGJgaWdSWGBWUVVJRUVOS0A+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnNzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWi36Df4N4e4uDh3yLeYGKgpd+dH16a2ZwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RVWVVKREJLS0hGSEhIR0FJOUQ/SEtUVFZcWluTucC4vbfGwLu5ysq6trm1uLmyt7W0rra2mWR1qJytcF6irJyYoKKbpJ6rpZSfn5CUjpaYl6efpZ+empmDpJ2spaqwrbiwvbnU0c7W0MnM0szPzsrGv7/Cyr3BvMHAxMTFyr7IzrOku7C0r5qruLuZgHttXmFdWl9hWmNjUFtgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5aSkJRubG91dYezrKGgn4uZnJmMjZWRm5KFiop+iIeLkIyJfIGEc3uKg4V7iXSBioeVf3N7eWxtdXtocmVpbGlmamloYGZpaWxabXOWraS8iIdnW29oXVpaVEhLTk9KS1BLU1FITEFKR0pPX15iZmlhl7fHsLiyu721scTGtbC4sK+7q7Kxp6u3q421p52ap5pOmp2Mjp+WkaaYpZWKk5OJkImQkZGdm6GXmpWWh56ap5usr6iwp7S01NTU1tLLz9TVzdPPzcXCydC/ysnKydHHzM3C0NG3r8O8xLmltrrDooNwZV5eXllhWFpmWlFdV09QQkJIRUJIO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlVnOQkJiCaHFveXmDoKqepZaMmpuXi42VkZqOfYmLhY2KiouQh3yEgnB/iIGGe4dyg5KLj31xeHVscXh+cXtueHNsaIFwbWNqbXB4aXd8fsu/wd+nbmN4bmNbYWBKUFJVTlleUF1cTlBOVFFVVFxubXaCcZatuKy0pq+2qqy8wLCrtKakuKarrqCrtKOOsa2al5iMkZORhI6bgY2mkZyJg4uEiomEi4OUlZeXk5yRnJiZmZ+eq6ykp6Ksrc/S1dHNy9LT1NDU0c7Iw9TRx83S09PXzNHRxdLWxcDOx8fCqL63z556cGZfZF5YYVNdWlBRVFBPSD5ARkFCRTxAQj5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlp1hoWKd2x3cH1+f6GenqGLjJiTk4yLk4+WhHmFkJCNi4qHkYd/gntyfoCBh3qEdYWTkYh/b3Zya3N9e3Z7c4F3cWqAc3JpcHF6eXJ6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1hkalNYXV1gZF5jeHp+i4GYqaOkoZ+gqKWqsLiqpbOjoa2ho62hp7Gfiaaak5KRiZGPiIGUiWqUooyZhICFfpGDg5OWrYuVjZWajoaSkZ6Xp7ChoKGlpKjIzs/IwsvR1NHU087TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDw8yMdHBkYWBZVVpUXFBLR0pKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuViY+KiI6Hj394g5SYio2IiIuJfoJ4c3t9g4d3f3qHkZaAg253cG11f3V4fXSFfHlsh3Z0bn12hHV4fJ21jDtBi8Wlfox8aWVXSUNmY2VjZ2pkbnhbXmZoa25pboCDiJGLnJ2gnZCXmJ6jo6axo6Ozn6GlnaCpoKOxnIaekpKSkIqOi4aDj4R+nJuMjYKEhXqUfoKplaOMkYqXkot9l4qakquzmJqcqJynvcPGubbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydna0da+y8y0eXdwZl5bU1dSW1ZGR0pJRUU9Ojc6QEBCOkdEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NTQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho19l5Gdi36HkoOJhoWJgYd8eIWWloiOg4eFhnqEeXF6e4SGdXqFjo2deYtwfG9ven9xe4Fxg4eAbo56dXd9fIJ1fnuGh69zWKnCto2RgnBuYj1eaHJwcXBueHaBZWhvcnV4cXqMh46TkZuVn5WHjJOboJueqp+grJyhmpifpZ6fq5mLmoyQkY2EfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yNlIyGfJyJlI+uqpSVmJ+Zpq+1vamtvsfLycnMy9DJw9LK1NfY19jX1dvX09nb1dDa2tHWyNTLlXt9amlcW1FUVF9IQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4/Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ2NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo6RD9DR1JqXm1kYmZrdoCIcpGPmoB6gI1+goKBg36DfHyEmI6Hi36GhoB3gnlue3uHgnR6kp6NoHaOdYJ0dYF9dICEb4GPgW+ShXR8gIR6doZ7iLfFpMHJuIKWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSVj5eRhImPlpmXlqWcl5+WnpOSl6OdmauVkJCJjJGCjIWIiIGGkJGem5mJhYyBhpd6iIifl4+IjYqLgn2hipGMvKGYk5eZnammpq6fqLa/wMC5x8nNzsXNydHW1dXZ1dfb1NfZ2tvX29ra2M7cxod9e2lrZ2FVWFZWTkxETUI7PT08ODo8Pjk9QDY9P0A9Pz48OTg2N0RBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NTU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjJJ3dnqKfH6Afn98hHt+gpGJhIV6hId6dX11bXx9hn5zfpKdkZ6DkXyGfniOfXiKim6CmoB0mYZ9gYiEe32Qeo+ojo/Dob2MnKOdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWJi5CSlY+dmpOUkJaNjJWfnJSglJGNjY+KfpCOjouEiZKWmp6fiYyUkp2Rgot/pZmIhI2ChYSBpYeLi7iYnZGVlqKooZ2enaOvt7q1rMDFytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27h6e3pta2dYYlxUUE9JQ0xBPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF9WWGZtbW1pgY6KcXN5int6f3x/e4d7fHuLh4F+dYOFeXJ6c22AfoR+d4WboZqelJKAjIh/mIeAm5Juh6iFeqCLfJGNgoiEm32akIqMo6KgkKSuoIuRi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5WMh4iMkpOMlJSUj4uPiYeWm52PlZaQipKThYCLiJKNioqdlpmio4eTnZagiomIjZyQg4iOf4OHhqSGjJCzmJ2SlZehoZ+ZkpydqLK5rKa9wsfNyMbPzNDMztfQ0dSu1tXY2tja2tfW2dmfcX92aWhfXllUWFlDQUhDPz4+OjQ5Ojs3Ojs7Mzs7Pz0+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnltYn6Rg29teIt4en96gXyGfHt3hoR/c3CFgnp1dnZ0hIOFfX6SpqOfpaKWip2QlJeLiqiXcoqxjYSnkoSZk4SZjKKVn5iTiZqeo5Kpr5+QlZCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzciWj4aHiZCSjY2TlImFiomFlpmbj5CUk4aUl4R/j4uZiI2QqpeXo6OImZ+WmoiOh5eXioSOjYF/iI+liY2TqZqXk5eZoZmfmZOdm6OztKajvMG+yMXFycjJwsrTzc3UqdLR1tbW2NrU09rOg3OBaWVgX19QS1ZcQkJGQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnWCjn18bX6IeHp+eoGBgn52doCCe2xui395fHh4fISHi36Lo7Ooo6uyoZanoKWklpWuooOQt5WSs5mNoaCLpJuvoqSdmJCnlqmZra+kl5WVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinZiFiImOlY2Lk4+HgYaHiJOYlIyLk5OGlJiGg5GQnHSRmbKWl6ShiJyak4+KkIuXmomKlo6GfYyZn4qQkJyamZOZmJ+UoJ2Vn5uhsq6jpbe+tMXHxL3Dw7/GzsrJ0qfOzdPS0NbY0s/Yu3N7d15iV2JYUUlKT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTltcWUpnYTtIhIp6e22Fhnl8hHiAhYF9cHh9fXxvc416fYF7eIaLiYWEkqi7raiyva+lrrOzqKOisKyKmrWeorillaykl6mtt6ako5+ZqZiqpK+wqZqZnJSVkZigl5m7u63JoGm2uKuwlZifoquSl72jXqmygomKjZWHkXyPjn2Dho2PlJSIh5KWi4+VjYuNl5mSnZqzlpWrnouclJKNkJKMmJuKkp6Pi4mVn6KOlY6Ymp2TnJielaKglJycpa+ooqWzuKvCyMS1u727xcjIwtGhxsnNzcTW1tDL06JxfGpeXFVgUlFHRD49Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PTQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlSGJgY3BKQIuKfoByhod8gYl1goqCfm19fXx/cHeHd42Bh3uNj4yGjJqrwsCwvsa7s7TBvLStq7O2jKiyrq69qpu7pKituberpqaioaOjqq+ysaqdnKSYm5iXnqKlpZKjua6owLusrbK5paSnfYiGnK29sIOLjIuQg4+DkY96gYeQjY6ciIiPl42LlZeUkJqWnKeasZqRq52OmY+SjpWQkJaXj5GgkYiVm6SslZaPlJyelKGem5mgoZSanqinpKGksLOmwcbDsLC7tsXEw77Np8fDx8O81dDNxMqJdnVkXlxhXE9LQ0xARUY+QT9COzo0PkE9PTU8Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZ0dgaWdaXVuTjIyIe4eLhoOMdYaQioFufnyCf3F+gXqVepKUlJiRk5WntMbJwMLMwcO6x7u6r6u5u5eytrqzwK6lwKSqsLu7qq6roqKep6yvtbCqm6CqnKKclp+wtKeLo7q6tcG7q6icsqSkqJSEjqnDxKSCi46HiISGlZSNeoOMkY+RoYyMlJGPiZigl5OZlJemoK6djKqcjpWPkpGVlY6QlZGPoZSGl5+gs5+Um5SgoZmkn5qgnKCUmJ6mpKanpK+tpb/Ewq6pt7XJw762zrLFvsO8s9HKyMG1dntuXlpdbFROSUNMS0pJQEE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2WiYuIko+GiXmGk5CBcoB8jX53h4GCkHqNoZaompqYur7IycrC0snKws28wbOtu76nur++vMO3rMGprLO7vaqwqaSlo6yutK22tqCgr5+lopijtL2pm6i8waO2tq+rkq+sqquWhpqppqWRgoyTpZWJgHWKknmFjZGQnqCSjpSLj42Uo5mXm5SUo56pn5GlmoyPj4+Vloh9j5WSkqOalaCinLWmkJ+XpaSjpZ+eppielZebpaOpqKKyrai7wMSvpbO3zMC5rsOzu77BuK3CwsHAmXB7Y1pYXVxNTE1JR0RDSEJCQUNLOjRESDo7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmtJX1hhWmRlVp6PnY6Xjp6SiYp/iZ+ShHiFf5V+f5CIipCAlaCZrqejmMK9ycTIxtPNzs3LvMK3sLq8tLzKvMPBtra7rbO/ubytr6igqae2ra6psreanq2ip6Gdq7e4qaWvvsSxvbmzp6mzs62ulpWlrKegkY6SscWnlY18kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjI+PnohakJeXkpalmmaZo5+zpZajlqytq6ecn6eYmZaZlaGkqKaetqypurzDtaa0tsvBuKq2rLO6uK6ouLq9uINucFxaVldPR0tTTUs/QUhFREdGRzg1Rk07Pjc+QUouMzIwMjVCNTVQV047TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJyRmlJUmViTEamlJyWoZeoloyQg4elkoiBh4KchIOVkJGUjpqin6++rqHHvcbFyMfOzs7Syr67trG6u7y+zrbEvbe4t7KytbO4squmnKuruKupqLCwl6OupKekpbTAsKqss77CusC5s6e4s7ezrpWlra6upIuTlaGNc8GZfZaZhI6WmouxlZqalZKTmZqmo5Wgm5aaqJyboaCZi4yPlp1gSpacmpSapZdUlrCfr5yfpZSvr62mm6GmlJOZmY6doKeimbSpqrO9vLursLLHwLimq6utsbGjobKytKRycGdeXFBSTUVQUFBRO0hLSUZIQUM+OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UkVXUnNiV0ZIq5eZn6GorpiQl4eLp5aOiJKFn4iEnJePnqCbo6W1ybSpxrvDxMjKycjMzse+urOvubjAwc21yLrAubW6sa+vsrSmo5uqtLSrqaaurJmkrqWlqKy6v6irtra/wcC+uLOywq+3vaujrrSsuKWIm5emm3a+oISYnI6TmZqLrpahnJuXlZugoameqKCamqqZoaeel5CNkZ2DbnaTopqVnaKfkK6yo6uVqaqYq6+lpaClqpOSmZuIlJyinpaxp6qrure9s7Kuvrm2n6OnqKWnnJysqamNZWhiYFNMTUdITkpWTD1NRE1JSkFDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uU2FNVkh/ZV5IRqyUnKGfu66YlJ6Lk6qbkZKTiauNh6KejKSslKOjtse9tMG6w8PIycXCzsjCvbmyr7m0wMLKtsaxwby1uquorayvo6KZqrS6pqmmrKqdqK+npKuqvryorLyzt73GvLa1uMCwvb+zqbS2q76kj6KXkaKfvJ+JmqCZl56djrefqZylo5ucoZqnpbOim52lnKiqnpmVj5Sai5eJjaSilJyin6C1r6Wmk7Grmqutn56lpKqRlZWgg5Cen5yVqaWiobS1urWtqLWys56coqaal5WZqqGeeGJfYV9MSUdITVFJTUVGRkJSSkhBREdBVlNESDxBR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6SensKsm5ell5mpnJaamo+qlpWoppWtrJmhqrbEwby/uMHDwcjEv83Gu765srC4s7/DyLW/sLy3ubenpKurrKGhm6urxKKlqKymnqyvrKKqqL+4pqy9sLe2x7a0ubi+sL7BtrSytK++o5ajlpOblK2fkKGipaOjn5C+pamdqKydnaGbpp+9opiknqKpq6Gdlo2VnpOfh4+FjZOepKCdtaymnJayp5mwqKCbq5+hjZmVn4WOoZqbkqWkmpissbaxqqWpraycmKChko6QlamflGplW2JeUEpJS09NSEZDSUA9T0hAO0dJSFtST0s9SE5VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hNopqjm53Eq6GfrJ2drZ+Sop6WpKCnqqyXtrCjqrO2xcK9wLbAwrzJwr/KyLa4tbWxtLS3wca3vrG4tbq2oKetqqydnp+lpMGloKquoKSpra+ipqe9tqWxu7e2tcOys7e6vrHDwLi4rbO0taKcpJWRk6CtoJmhnamoq6Kaw62pnqyum5uemKagvaGdpJirq6umoZmNmp+SnomOWH+WnqahoLiqp5OYt6Ofs6KhnK+YoI+ZlJ2Cj6CXlo2ipJWQpq6zq6mioqWllZWdmYuPkZOkn4ljZlxlYU1KS0tPRkVBRks+PUpBOTlKSk5dUVFKPUxXXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxMT56foZiew6elorOhnLKnk6qkn6OframsnbuwqKy1ssjDwcOzwsS+x8S9xcq9sLG3rrG1r7/FtbqxsLq2rZqpsamqm56moajCrZussZyqoq6wqaSnvbemtrq8r7fErbOzwr+xxrO6t6u0tq2qoqWVlZSjq6Gfn5qnq6+vr7uypqCpqZmZl5KipLihoaSSrq+spKafkqGelZ6PkY2VnZqjn6e0p6eNmLSco6+bn5yvkaCUl5SagJKhlo+OoKGTi6assKWnopygnpKSm5SFi5KNnJ6AY2dcaGZLSkxLU0JDQElHOztGPzk5Tk1VXlJTSj5PXl49SFBCTUxJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMKoo6qxoaO0qZayq6aipLKsrqm7sq2wtLTGv8TEtcDFvsrFtsDJwrartamxuKzAxLS3rq22uqWZq7Krqpigp5etu7WbqLCbrZ+utLKnqrqzp7qzt7K4wKq3ssK8tMWnvq6tt7Wpp6yhl5aRpaSiopeXpK+4rbK1tqCfqKSZlJWTo6C3o6Slla6ysqWppaKempqalZion5+Yop6usqKmjZevmaWsmJufppKdjpWZm4aXn5SMkJyelIupqauip6GZnpaMj5mQgYaWiZSfemVqXWxrT1FOTlQ9QkFOQzs6SUA3N1FPXV5SVlFBV2BcQkpTSFdLSDpVZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnBpVkNXRox5ZkM7pKScoaW/pqivr6Gptaqdua+rpKq0t7Gwubawt7i4xb3Dx728xMLHwbnBx8G6qrelrbutwcO3uKqtsryjla2wrbKXpqiRqrmqoKewnaqfsLSzqqm2tqy7rLKyubesubDBub2+psOrsLeuqKqrpp2YmKqhoqCRl6CwrrOrsLmam6mfmZaSl6agt6mloqKvsbOrsaern5ugoJuepZ2hl52js7Cbn5CUppqhqZuWo6CXmYqWmZSXmJ2TiJCbmZSOqamnoKSbmJuTh4+Zi36MloaOm2tqbmJublhSUVpUQUNFVUA7OklBNzpYUGReUFdXRFleXk1MUk9fS0o+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYEYoQDhsfWhcVjqJe2NDPaifnKGpvaGqsKqjsbippbWyq6Gttb2vs7i8ur23tsHDv8nEucXDwcC5xb7BuK+2qKu3sry/v7WqrrK4n5esraitl6ipj6e7n6Wts56rorGws6yqtrO1va2vsbWssLWxwLnEtqu8r7G4rKyporGlnqSonqSXkJifsqqzqqqzmZ2nm5mUjaCmpLSup6KsrK6xp7Kssqmjm5+opJ6VoJmbqLWpl5mSkp+Zn6GfkayfmZmGlpiMnpqdk4qNlpeal6emo6CelpWWlIGQlYV7j5KEjJdmbXNocHNfR1lmVkRDTlhEWjlIQjY+XVJoXE5aXUdbXl1PTVJYZEpKQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVjE1MT1gVl44KUMzWVVcZ0s1jHpmTECkmaCkrLejrKmlrq62qq60uaansLjFt7G3vsHCtbS7xb7MxbnDwbq/usS3wbmztayqure7ur61q66xt5mYqKuqq5utq4+rvZ6rrrGjqp+xrbOurrayubeqra6xp7WvtLq8ybKqtbSxtK+upqGzn5qorKCllZWambGiraClr5ahpJmZko2ipaayqaGmsauqtaSusLWvo5mdraebl56Zmay4opeTkI+YnKGZmJStoJ6VgpOZjZ6cmpeRi5SSnpqlo6KhmZaTkpZ7jJCFe42Lg4uUbG55b3V8YUZgalpJSFpbPXtKR0U2QWJUaVpNXGFKW1xaUlJTYmFMS0VgYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLipBL0pHUFtHM2NZVEtEmZefr6ixqaylo66utam2tLejrLS3ybq0u7q/vrW0t8PBzce8xL23vr/At7+9sr2up7q6t7fCt6yusrmVl6euq6ejs6qUr7qkrbKxpqeisrOxsrG1sbiyqa6rsqe4r7WzxMS2qbS1q7Ctqaeitp+eprGgpJSbmZSxnqebn6mNqaKdm5WXpaWkt6eisLOrp7GnrbC1rKSZoayom5ydm5SquZyVj46LmZ2imJGYqKOgl4SSlpCdnJiXloiWj5eaqJ2koZKWkpCWd4SQh3yGgoSNjW5xeHZ8f11LZWxcSk9kXD9ie0dJOEdnV2VbTV5iTVhZV1VYVGldUE9IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNya0tEQ5GYpK2kra2rpqOwsrOqtrC2n6u1ucm5rsG7w7ezsrXCw8/EwMK+tb3Av7q/vbPEqKq5sba3wL2wrLS0naGnsK2lprGlnrK1rKuysKypqLS6rLSztay0rKmrqKypua2xsMe+uKS5r6mtraaorbClo6Ouo6mcnZuar5mio6KjkKyfo6Cfoamlpbikq7S0pKqrqKyutq6inaOoqpygmZqSpLSZj4mNh5GjoJaOlZ+hlpSGjpSTnZuZlpWHmJKVmaedoKCNk5GOkXh+joV9fX2HiopydHN/fn5cUmRuXk5aZ11GRJZbRzpObVhiW01hYk5WVlZXVFlnXlFSTGRaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZTs2KkhkSEorOkk/M0NJUyw+j2s+SEmPmqmqoamwpKijs7SxtLWxsaGsrb3Luq7Bu8axtK20wsPRxMa/wbO+wsK8v7i8xaitt6yzuLzBsayyrqGkp62pqKSxo6uxqq+rsa6urauzu6e3sbKpsqmrpqWjrbqsqrDCubSsuaioqK2pp7GlqaSirqqoop6boqyVpZ2XnpirnaGnqKGspaOtrLexsaCpop+qrbCsnZ6mp6mao5iZj6ComIaDjoqLn6CQjI2XnpGQh4iRlaGdlpiWhpaTk5elnZ2djJKQjoqAf4iFfXeAh4WHdXNyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlPY1xOVVZVV1BcYV9UT09oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5JZ0RGODxCMDVFS1gxQJRcQE1GlZasp6GqspypqbC2rLi0rqqkq6u9ybuxvrfDr7Cts8TEzs7Dv7+0wcPEusC0ycSsr7eusrrAv7SurqymqKqwqaaosqa0raqwrq2xr7Oss7qkuLOsrK2nq6CinrC3q6qturaktbWkqaesrKqsoaimprGypKaloaGrlqqhk5qgpp6joqqkrKKeprG3rKyipaKaqaqtqZyhpaSkmaCalY+YnZOBgpCIhZ2gjYuPjZuQkoyEjZmlnJORm4yTkZGUo5ubmouOi4t8h4GCgnt1gYSCfnV3i6SHeWteYG5nV2aHZE5AZ5JMRGJ6V2JYUmVVTVZVVVRPXF1hVktOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQUlIRJaRr6SiqrCYqqittau2sKukq6qpvMHAuLmzvLWmsq/EycvRv8G7ucDAwrnBusLErrG1srS7wb6zsq+trKyotqqlrbCrua6osLCusau1qra1prS2q6ykqaqco52zs6iopLO0oLauoamoq6irp6Cqq6i5tqmqqqmhqZ+tm5GooZ2go6KmoqmdnKa0rqelqaKjl6WmpqmcoqOjn5mYn5GOj5iNfoeNh4WenoiFi4uPj5GNhIaWo5qOjZqRkpGOk5+YmZaNi4R/dIeBgH94dYSAe3h+gIidj3ByZ2dxeFxhdIhpT12YVkhteVVkVlJjT0xWVFVRT1haYlZIUGpUVlNHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdSRTuVja+gpaqsmaukra6ztK6qpa+pqbu+u8Gxr7itorWvycfI0cC/vbu8w726w8HAv6+xs7K2vbzBsrKzq7SppbWppK2zs7ivoq21sa+xuaq4rqqutquqnqqroKOhtq2ooZ6vsqG0qp6op6qjqqGhrK2ova+srqyhp6efrJmPr6KYoqCop56nm5ipsKiin6yioZKhoqKmmJqopZiYmJ2PioeViH2NhoSFpJaGg4KMh5CPkYWGlaGXiZKdkZOQjZGdlZePioWGeHOBf310eHqBe3R0e2qCiKR2aV5lbIF1Z4iLfFJXcF5LeHNUZFNRX01NUlpnTkxWWWVYR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1pOjM4Xz1hZD9GMUNQW1srSE87WEI0j46xoKSlqqOlo6ymtLOwqaSwp6q4vsG8sKi5qqeusMnHyNDCvcC+ub6+vMm8wrmxsLWyury5wLO0u625rKO1p6essra5sqanurWttLyvvKWtrbWrrZypr6Sfpayqp5ydqrKks6iaqqeqpKmeoqmoqb2rtK+tnqmjoK6cmrKilqSbpKWfpJqZp6qlnpqpoZuRm6CknZiWqamRmZqTkIqCj4V9j4KAiJ6Ph4B+jIeSj5CFgZSblIaToo2UkYuRm5OVh4l+gHJ6eX58aHd8e3Vxcn5phnqEiGRgaGNyhXttaHldXlZDWHttVGFQUllLS01wdF1IWltnWUVWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6TsZmfn6mlo6GqpLaysaSpsaetucG9tbCjua2oqLDDycnMwbe9wLW3v7rItsO1tLO1sr25ur22rbm2v62is6eqq6+1t7Sqnbq7qLG/srmgr7S2qayerbGjnKWoqqOdnKSwpq+gn6upp6GpnKOooK27p66xrqGqoqOtnp6sppefm6GinJ+amaKqopqZo6OVlpOeoZablqasi56RkJGMgouAf4+Be5qUjIl9f4yHkJCMioaSmJGHlKSKkpKHkJqQk4GIfHlsfXZ5eGJ7enJwcXN4aoJ1aoNnY2hhbnOObWJqcGBvQl15a1ZeTlFRS0lMU1lWTVxebVdEWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1FdPSOSl6yZn5eno6Gfp6O3r62ir6+pq7nCurOtn7mvq6i0usfKx7+3wr6vtL63xLbDsrC6sbLAtru+uKm5uL2qpLWnqKqwrbmwqZm5vKOtv7S0oa63taamp7CzoJ+lpqihpJmerKipnqCqrqegppeiqJ+wuJ+ksa6grKGtpJumpqmampufo5Wcm5mdqaaWmp6okZiSmJ2TmZahqpCaiY2Qh32If4KOfHyhjIyIeYSNhYqNjYWJk5qOiZWfiZGVg4yXjZF9hHtzcHxxc3RgeXhqb3FxcGt/c2R6bGhmZGJmh4BgW3JqcU1OgGlYWk1RTEtIUFJRSE1bX29URFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBcWzUolpulmJyVrKCeoaSht6qwo7S0qam6xbayrqC3rK2tsLbFx8C3v8K5sLW8t7+7v6+svrCzv7K9w7mpu7q4p6i2qKersKyzsKaYvLajqrq1rp+xuK+ppaevspuhpKCko6GWm6+moZ+jqK+hoKKTo6SitrChprGrn6yjr5ebqqWon5ianaSTmpuZnKWpmZubpJSUl5WcjpOXoqmhkImKj4Z6hH6EinqPl4qNh3qCiISJjY+FjpOYjI6WmYqPl36Gl4yPeoB6cHF2bm90X3h3ZW1sbGtqhG9mcmlrZmleZHSBYFtrdmlaSn9eW1hPT0tISFJVRjI5XV5tUERYVlllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyY1YsMpWioZeUm6qdpKGiobeprqC6uKWsvcWzsK6jta+tra+0w8O8s7+6t7Gzubi6uLqvrsCztLmvv8G4rL26taais6qnqbKrrbGgmsC1pKa0taiesrypqKWpr6yZo6ecpKWUmKGypZmfpKipnKKgk6Sfo7iopKeupp2loaiSn6iioaGZm5ygkpqblp+hqpuamKCUkJOWmY2Tk6OopJCJiY+GeYR7hIZ9nY2Jiod6gYSHiYmShZaTk4yQlZSNjpR7g5eOi3d+e2x0cWxsc2F3dWlpamdnb4ZoaGljZmlqYGtjamhcZXtjYFN0VFxbU0xKR0lPU0AhKmheakxDVlVeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdPJzKeoqORjqSnm56enaO1rKequrenrMTBtrCso7Wup66vt8C/vLLBt7Cusra2uLa2raq9s66ysb2/uK68u7Gln7arpaW0qaqunp3Aq6ikr7KprLW7nqipq7GlmJ6pnaakkZmmraKYnqSpoZuhnJafnae2pa+qrqGhnZ2hlKCmn6GhmpuZnJGYnJOlnauhl5aclJKMlZeLj5iaqaCRiImLiHmFd4KCgp2Ii4KJfYCFiIeGkYSXlZCOkJGRkYySe4OVjoZzfX1meG9ramtndXNrY2dkZHaBY2VmZmZqamRrclpfWV1tZGFOaVhbYFZKR0lLTVJYPjlfbGlIQlRTXFtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOfkIytoZiYn5aks7Gisb22obHGvLqxsaS3rKquqbm8u7uuwbKurq62rrK4s6irubGvrrO2urawuL2tpp61qqCgsKSqrpyiwKCxpK6wrreutZ6trq2topqdp6mln5Wap6WfmaWiqJ2an5uUnJ2sr6W6qK6ioZqanZmepJqknpeemJuUmaCSqJWpp5qTmpqRi5WZjpSUmamnjo2KiY98gnOBgYqYhYd8iYmFhYqMipKElJyTko+QkJaOkH+AjI2CcIB+ZnltaGtpZ3Fya1xoY2N0gWJmaGpubGdqamhuXWxsdHBhVWNpZGVaSUZMTU9YUVFWYWWBVUBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJGhmo2OsJ6ak6GZqLKvn7i/tqC0wru9urGmtrCorqW3uLe3rbuvrKqrtqqzuK2ls7Wyrqmwt7axs7W6p6mftaidnqiiqa2ap76YraOur7W1rayfsa2vqaKcnaOrqJyUnKaknZqqoqSWmp+ckJujq6qpu5+npKCYmZmdoY9ropaZnHCClZqjf3WRqaeelJSekIiXmYCWiqGQeIaUjINuaX52g3FshouGfYSMh3BeY2FnhJiGbIuPlJJ0d4uEfoOPf2eGgGd1aGVXXGhzbk5QamNnc4VnX2Rmbm1qXl9hio+DhGVOS0Q5RlRnXkpHUFBUVUtIUmBvdGVGWlFVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Lo5mGlbCbnJOgm6qtqqO9xa+puMK4vb2tp7ewpaukt7Oys7G5rammrLSmr7WiqLi2tqinrLezrrSts6Kpn7OqnqGknKanmKu6laalr7O3ra6kqa6rrKWhn5ygp6ebl6ClpZubp6edk5+fmJCep6qjta+jo6OclpeXl6OIoI6Smoehh5OcoH+kf6WqnpKRmpGIhHJ4jY6FiKF2iIxpl4hmfXJ4oW+Ih4R+jn1/oaCgmYB8h550h452m4psh4GDbGhlY3prcWFThW1jbGmYcVlqcG+IWF5pW2trW4hxbnpyhWeGhFpeR04/R19NRlJWVlFRUldUZ15NV0lSU1BGR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoi6aWg5yrnJmYnZ+qqqepvsOvsbq9t8C/qqW3sKmtprO0rq+zt6uppbGtpbSznK21trSmp6izsa2yqK6eq6CyqKCjopqhopqts5SjpaW1vKesp6uqrKiloaCYoKajmZmlo6SYnKSplpSjnJSTpKWmobejo6CkmJSTl5KciK+QmJSJqYuXoZuFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxl7ycxXpytaa7kHuAbJaxq7B4aGtYsa5uZWm8krxuaHpvcpDYflNqYrayf4FylXSaoaqQV09XYlBWTkZUW1hRUFKMXFdcUEBcRFFORUdKPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mkoCnqp+XnJ2lrbKnsMK9srXAtbe+wquns62sqaeus6mvtrSnp6a0pae4rpyzsraqpaSnsq6usaaqnqeksaOin56Xm5+drquUnaKfs7qjqqmira6loZ2bmqGnn5ebp6CfmJ6np5Gcp5qTnaGmoqCwop+fo5aVkpiSmYWva2qKjap+Z4OVhq1kcJ2dlJmllHGuoaR+eLt9a6GPdrFfarRbpYBmnJFgZoJ6Zn9qeGupZL5yZ6aMdbFqfLF4dJKTY21tp25bhKBFaGaHlkV1nGB+aHykp4JZX4uraYCWeHlqpzdKr1xYU2xkW0tOV19cV1Y7TolPWFcvSVRUSkRGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCrKelnqOkqrK3q7O9vrC2xLK3usGnqbCrrqipsK6jsLqvpKSusqOpuKies7Kwo6Wgqq2vrK+mp5+jorCbopuXlZebm6yllpuhnrOzoqucoq2toJ2Zl6ChqJyYnaOfnJmhpqSPnaKal6Cfqp6mpqCbn6GVlZGWkZqFtZu1eIWpmbWZdoazm7d+k5aWqJR+bIKme4KGiJKUknerZ2uxW6t7j4eUdIlxj4aAf4iQl3iCgouYjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXN1U5OHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVhYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+Vh7OmpqCuqaeyrKm7tsKwu8KtuLa/qautra6mrbGpoa+8qqGntKyjq7WlprOzp6OinaeqsqiwqKWen5+vlp+YlJWVl52soZmZpKi0rqGpj6moqZqdlZigpaebn52in5ugo6SjlZufl5mdoqmbpZmcnKKgl5ORk5Odg9WTmblwsMJ+xYZ81pSbu3yalaSPjZyNpHuOh6SCpYJ6rHmPnVaveoh+n2q5Wrl2h4R9poKTfJh6qnmNnZB7sW6OhHSQvIVvlFCvp8WKUaB6Y2CpYnNziG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITm1NW1JPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcxJZuik5ixqKils6qltKmkvLfBsLnAsbWzurK0prGwo7Cypp+utqiap7mto6+xoLO0sKCknp+nqbCptKmknJ2eq5eYl5WXlZWgqZyZlqetsKijno+toqaVnpecoaWhmaKhoaGaoaKmm56hnpSZm6agnKeVm5ufoZmPkZSRnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaN/kaGlfrB2g5HS0XZcrnuFf6Rvm6qma4eFfa19l5mPe7Fzkp2PebNllnSEnm+eZpRSyItawlyfeWJfrWB2dIdil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tgbGhQVUdJOD1WUVpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnZKlr62kqrytprWlp7a7vLK6v7e1s7m5sqS0tKGxsaKfrLCkl6a5raSxsJy0uKqgpp2hqaSyqKyppJqcmqielZSXmJKSoqeflpKlqrCmopaTrZ+kkZSgm6Smn5WbpqahmqKfrZqgnp2QlZuhnpymlZ2WmaKflZiVkZuFrHt3qHajjoiGqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXiFfo+dhpmad6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1edneHaJiIa12vd5Wej3hsNXnIrrJfQlNvXmdgRVBtX3BtVlVNLmVjaFJYUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOjk5n52VoLmwl7TBraizqKmyurezuL+5t7G0u7Skt7OftKyfn6isn5SntauosbGrrbSkm6mgoKihtqemqaKZnZWkoZOSm5iRlKKlmpKPpq2vpqCVmamfoY2RopmopaCUmaWonZyknqydoZ2gjZSemp2hmJmclpehoJOYkKaehql9faV4oY+OgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92iHSogY6bjZKjfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFtMdF1iZ01bYV5xc15KVjZKm5NYSEU9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKGdmpq/q5e0wq6srammtLC3sbW/ubmxsLW6qbq0n7CknqWnp56TqrCpr6m1rKqvoZihoKalpLqio6ugl5uRoqCUk56Zk5een4+Ni6iwr6adlpuopp6LkqSXqKunlJapp56eoKOtpKGeoY2VoZifoJKdl5yVnaGVlo+rnI+ubXK0cqmMdoqmc7R4c7OAkaSjkpyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWSiK1rdbNhnWaib4eSapdcrV9NoXyHkVJzo2x5f35vmIdxXK9WPJx3ZVRvbi5cp09jUmtlYm1aY1xfb3piVFpRPj5tbzNDQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpyeu6GcssCurqurp7epuK+1wLW7r664tqrBtqmpoJumpKKdkaqpp7WjsqevqqCXnKegpKu4naOtm5aZj6WjlYydoJqYnJ+Rk5SqtrCnmZScrKmVi5OlmaWtopCWqrKjn56mq7CYoaOPmaKWn5uWnJehkpypnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9lYGsqXF7f3W8iKegaZ1hpo6voX6MdIeqfb5uc7x0soN1eIGLbpqIcW6NpHS9Xnd9W2F5vGtaVltqel5qYWVnYWx3bllbWUNBQHJAQ0crNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueoryhl7HDsK2qq6yxp7ivtsSxubGtuq+uwLGrpKKeo6Gcm5Cpo6qypLWmraWelpmqmaasuZ2jrpiUoJCln5KMnKOdl52bkZWSrrmyrJWXo6enk5CWpJykrJ6QoKirn5ufqKOznqOljqeilKKanJiVo5iPsKCSlKmehZCZtYCQkYy3lXiCk5q1d21rbnNveY+Ejol0nsG7vZp7gbKocIB0kbmDfIaGjIaNe4qHjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbV0cnB3toxegHp9imiDeW15Y4uscHWFf1pbp2pFZFlTZmBjXmNRZ2ZwbHVCTVBMRDpaTT9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZWJz47PKeeoKG/pZa0wrSsq6isq6m6rrDFrrSyrrentLitqaKhpZ6gnZmTq6Stqqa1qKefm5ago52spL6moaqXlJyQoZqRj6GooZOdmJOXlLG1t62YnaSkooqSkqabpaqblqmlpZyaoaimpqOpoZGtnpajnpeXl52ej7ColJunoY5qfmmcpniHcn2ajnR6ZId7vb7Aum+SgnGVh2Fzalpem4phY4iOlWtggJVkbZ13YpVrgJqVlGVeYWNxmoppcox9hZVnan5ydHh9fmJbd3SBaFBcboR9fItrWGx6gnNKSm+GcE11TUVXXmZgS1pXZ2NfT1ttdWlyUk9ERU47SEg9TD8yLTJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz1bTyc/Mj6ooKihwqOatLm1o6ylrqentbGryKuwsqu0o76xsqagoqicopuZmaymr6Sktamlm5eVoZumrai+p6imlZOblZ+ZkpekqaiQnZGPmJyvsr+sm6eep6KIk5GpmqijmpusoKOamqOnrKKfq6KasZuVp6CXlZ2fnZexpJehqJmckZ2coqSYpqKanJqamY+VgWdufXF3kpeUkYWLtaqNhpiVjoqMmJeHlJWKhJKUkYmOkpSYlJiXmqCimpyUoZ6NgnqkhmxqfJB8gHWJioFxgnh5dnaLgHyKa3OBdIN1ZXZ9d2twe21gY11wZ0xYWmZqYFdab3ltbWZTT0ZTOU9ZTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Gzob+hpLGyt6CqprKnpbC0qsirrLCltabAp7SgnaSknKOVlaCqp6yjo7arn5mWlp+XraqlwZ6rpJWSnJedl5KTop+eoqeTkZmop7LEr5qrnaqfkJaWqJ2qm5ygrJihm5yipK+moaWon66Yl6edmZqgnp6cr6CcoaaVl5KYk6ChlaOel6COlpOKio2Ol66QfJWbgpKCi6qohoGZl4qEj5+Ie4SQh4aakoiGipWPm5eNkZieo5aak5GejX+OZqGzr4WKhHZ7kIp8dnl6b2Z6kYGAiWt1gXmIc2lzf3p1g4eCa3VkeWZgaWVjZGZrWWx7b2lqXFJMUERfVEVAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua+/rKuusrGgq6axraKss7DEsKqro7OuvKO0m5+moqGcmZenpammpKWytJ6VlJ2ZmbClrr6gq6KQkZ2amZSRlKKcl6ichJ6qq6KzyLOfqqSqlpaXmqedqJqfpKuTnp+doKmvqaWjq6Kum5+goZiknpyfna+jmJ6ok5eWnJGkmJeonZqXZYKSfGV+jZqQZHmNbGhre5Kkqmplmph+Z4aKZWVpaHuOoY9raI2XkaN3a2qLmaOemXNsbnuEjYd6WGVehoJebIuJgHZcaHN3d5KAh4JueIJ4gHNteYR0d4mIjoR8aoZZXmt0ZF1ziWlrfHFrY15RTVdKZFhBSjQ9Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7GqpaitrbCmra2xvLGpp6Str7CfrZego52imZmmq5yto6WoqbKtnpWjj6Kvpra5pa6jjo6aoZmTkpqgmZmllXulraKotMS4pKKnr56dlJ6inqOco6mokp6hnaCqsKqrpKqgqpunn6igrJahm6WwpJebqpWgnZqSpZeeqpiefr2DiHK0coSdhq1oeLnEuHGToqN6ppmZc6qCfMvAwLtxjKKIgp99lpiJncC9gpednY2dwsF8gnySjZrDwH1rpbJvjIFvynp/m3eRg46BdnqBgHlxen+HcXiFjZN5bniUY2ZfeWRgZYJjXnRnbGRiV0tVSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUS8jRlszUFkvVUFCOy84lqO5w7SwsMCpqJSjr6mwrq2ms7SvqaWmprGrn6uYmqKfnJqqp6KdrKOlqKSktKSdopKmrau4s6evopGRmZ2lkpCfoZibn52Hp6ykq63AwLGgqa+pl5GenaGZoqOqo5OgoZ2era6prKejo6ehpqWdramSpJqorambnKmcrKCWlqWVoaKXnH/OlHh6pIF5lZabX66PXo6ngaKgfKeWm3Srg4CvXmONqnunh4WgdJeTiLNjgquGoY2Ns2qFr3R9l4i3YYOtWaLNbpB1e9p7f5lwfoiSdn5le4h2dmt8iG99hZGRfm2DkGBybHBoYF95ZFxxaGpjZl9RVFJXXUtPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52RpKqorbSrprKsrKukq6awqqCnm5mll5yir5+gnqino6ahn7Csmp2Vpq2ssaqorKCUkpufpJKPnqWYnaejnq6kq7Cov8ezqKmxrpaSnZuhl5+pqp+VoJ+dna6wp6upnKeopKKrk6yzl6Wiqqqdo6alobCgkpmmmaCalJSRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553qoJ9rX+cc61+q4eGn3aYknt8l36qiKKMkYydfqt7iZSQn4B7rVacxHqPb5LBfYGVbXVvjG1ldmWGb2F3bnJviYqSj4NtkpBmcHV1cWFnbWVfb2lpbmdjV1NcYVlSU0M4SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSgnKOOo6OirK+2r6ixpqiqp62rq6eio52ZopWgpaufoqWgqKiin52wrJeal6imrqyopqmel5Sao6GRk6Ctm52mo6+so6y1qrnNsq2mrayWlZydopierqydlqCZnp+qsqmqqpusq6SjrJuvsaKoq66lmKaqqamxopKWo6SalJKFpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBhUquEf66Dm3atgaaGhp96mZeGe2aAo4mkmYaCpH2pf4KVh65ffalVnaKSgXqin4B7w6/Fi3Kvs7O5cWKpr8J0aIyMmI6BbZqUcG55eHlwbWZlZXFwZnxpYl1XYGlYWFVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1b+hmaunoa+inrC0sK+praKnpqqrq6mkpqCbpJ6dpqeno5ysmqKsoaSfr6Kcm5Oqo7Wwr6Cpm52WlKaikJqiqKCgpZywpqSosay2yLK1qquplZGdnKKYn6WznZqglJ2fp6yspK6araujo6qis66iqrOxoZqpqK6vtqKSlaKnmJuRfKpsnoSHdat5fLBvgqSLiZ+Wlp+UgdK4tLjJgIGyX2CUqYOjiIegepiWmniqyXSZpJWoqpGTmoyAnIqaxsd4ZqGCpXOBn46Cfa9dcLRisHVLo4Ztp0eCk2SOkJ6SfHGXk4Bxe3V+fG5bZmpycGWBal9hWGRtXF5ZSU5MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4ramzraylopyyuayqoaaaqKWqq6qnoKalmKqjn6+rnaagrJqeqaWdp7WfopeTqKm1sqycpZyglI+lrJGZm6ejoKmmrqGkp6mwtMKxs6qtqJOJl52kmqGjrqaYoZWZnKamrJuwna6pp56spLesoLG5r52brqeys7Okk5enopmfjoKdTniagX+feoOjfYOkhIamnpyek4S4e3x5uYJ+zMbCtniboZCLn36alpeKdp6YiqWYpKl/sIWdhZ+ErH2alGKlbKRwj4WQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+k5KMdntzhX9xXG1ueHJqgW9bZF9obmJkXUtMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruaqvoJuhrLOzpZ+glaWura6qp52mppqjp6GzrqKpp7KgmamklKK1oqKVl6GotLmjm6KdopOPobGYnpunpaGir66dpKiitrDDsa2pramRh5Ccp5yipJyll56YmZqmpKmar6GvpaaYr6W8raG2t62dnbWyuLCzppedr6CjnYWP0bXDt3mHjoWRk5CBpniUoXeMoJGEpYGKcaqGhLRucmqZo5yVip58mJmGh49zr4Klm6KOpouTnYqVkJttcLJcpXOTepxsmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jI2Ujnl9eY+CbWl4aXlyboB1XWVkbm1mZ2BKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklk3ONiq2/v7y6tJ6Wp6WttaGimZWjqKeuq6yZpqKfpqCgtaejqaexo5Sso46kraOdkJqaqLO0pJ2knKmRlJetn5+dp6Sdp5y1mqGqpLaqwrCpq6mhjISOnKGgpqOVmpqcmJuZp6WmmKyorqOlm62mvqyUvbCsn6KwsrmrtKaaqLGjp5d6qJB9fLB3ioCkpYicbbJvoIetfKGOg6iVmICsiYSuhZ+UqqGhl4afgJmVgHuSfquAnZqXi6t4nZ+RipSSgXqvXaOBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkaaZgpWOmI58e4SYf2ttf2N+dG6AemBnZXFuaGdnQ1phWz5LVDNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTgwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2TmoOpxsK2wbSfmqygrrilo46bpKOfsK+qn6Sfna2Znrmgo6ugr6marqGQq6iklomaj66xrKaeppqrlpeOrKGhnaWhmqScrZigqKa2qL+vpamkn4uAjZuan6aekpSampSamqalpZuqrKykpZ+qqL6klsOsqqKhq7K5qq6mn7OuqKmYdq9+kIuchYd9uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWmmaShoZGFoFtsaoGzYH+te3uCgbFtZ2+ZmIyIsVt9tFykg2vIomSfgHu8WHa1WrJ9Uq6AeqxYgKFumJCom4uXkZiYfHqPnX5kdH5ihHh0gHxhamdxbWZlZU9VZFxCVV8+Sig+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRXWl5gX2BhYl5fXFtYVVBOSkZDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaXFxYV1dHQjvSn7Oyt726s8Gzo5uspqW2qKCLmqCfnLOzqZ+joJ61mKC0qKqsnq+tnqybla+ooo6Im46vrKinoaaYrZGYjqiaoZ6kn5mjo6WZn6Oqsqi7r6SonpyOfYublqGgmY+RmpuSmpipoKKaqa6opqajpam7nqDGpqSooau0tayupp67rKyslYCpkqOvjpuAh6SXmJCBgLjDuoOOnJOEp5acgqyKgq+IppubpaqRftW9wqpio7+9fX6jgoPXuri1hZSTg569voRro4Fvq4RsnH96srDHg2qrsL2seHeivrxzgZaOp5yQm5GYnnuCkpt6Y317ZI5neYJ7YGxla2piUGFaU2pcQFVhQk4qPTo0Lx4fJB4lMiAdJCgwNDk2Njc4Oj5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJW0tLG/ubK9sqKdrqalsqadjJilv6q4sqihv6anspyesZy6qJ+tr6amlJSwrJeMg5uRrqWirKCjm6iel4qjkqaep5yaoaiimZ6hrK2ouK2oo5uXknuHmZKmm5OOkZiYj5iTqZuhmaqpoaqnoaOqu56oxKKgrqOqs7Sqr6ifuqeurppzdaqkt4ZkiaBwZ62Pio9tb3ekkJmfgXWumJRwj4txlaijm5eupHJtbWxmi3hvboKZcYF6anFpZ4mWlphyaWmEh2dwhmRdiGJqb1ldZ353pl9hcY6RbmVlf42Tj6KYmZmRmKB+iJCVdmaHeGmOa3l/eWRsY2ZsYktkWEpsWjpRZUVSJ0s6KyMcIBsiLCkYGxgtMi41OjQ1Nzk8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqmVrbOpubiys6qpoa6eo7KpmJK+ssTJvraqnsCsrKOhqKyguqOkrqytpo2XrqmQjIWVlq2epqqgnaOinpCKpJKnmaiZlqOqoJacpqanr7qrrJqbkpJ7hJaNpZiNkZGYlI2XlaiVn5iqpJuxpp6iq7mfr8CnpLKlrLCxqq2rpreirbeWiqCopbadiZajmYepmpCUnZKpspmao6ugsZaioJ2gopygpaGVq6eNk5KMh5OcnJWQmpOYkY6VhYGkmZeWjouTk4uPhoR9Z4l+dIJ2dIeLcadsepSRk5KBgY2QkI+dlaGWmpijg4mWjXJpkHdxi3h3fHpqbGRjb2RVYFhAaVtIY2FPWitGPSsnITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVZZXmBhY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCmlqmqpLS2rq6isKOtn6C1sZCOrMe9xbu5q6Kmnpumn7Goo7annam0p6iRmKyii4eJj5uolaykn5imnZ2RlKOXqJqomZSmoaOQmqeZobW7qKuYmY+Ne4GUjKGUipWRlZCQk5elkJ+bqqCctqOep6u3p67BrqO2pq+vsKypqbK4oK68mZGlpKa2opKep5+NqZ+Nkp+jrK+aoKOwqK+Xo6Cco6qenp2clqudkpmhm5SQlqqZjZmZlpCWnpGJoJ2VlIWSjJCNlIuAfWaLhXWGdXmIg3OcaoWQlJOQiXyLlpKSl5Sik56Yo4WJmYh7cpZzeot/cnx/am9kXnBqYVtfWG1jUGBkUFo6R0dFPjI9PTgvKyYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVVQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9fYWFiYWFhYGJiYmRiXFtjl5WkqKOvsqyuo6mmraCntaqQkJ2ltLyvra2io5p6naKxpKWxqZecuKajlJmqnI6Giomco5CunqKVp56gkZaYm66LqZaPqJmojJipj5+5tqSlmJqMiHmClIybk4qVkpSQjZKXoo2en6men7ijgISvtaKvr3WkvaOyn3d5oKqxupR1rKSeiYCqf2RcYnagjqSehJd9bpOznKOnraqjZZ2fknN5mZZwgJiol2x/oqiKZZylnJGXmJaMkpyRhp2akJWDkoePj5KJhHdqjoZ2hnB7hoGAYWmHipSSi1p1lJBoaI+Pc3ummppme5qHg3iYaoSLg295gGtxZV92cGxraFtmZWJicFNcPk5OTlNHPkBURDkxLx4fJjQ6MzE2Njc4PDs+QEFBRkhCR0ZJS01UVFVZXWBoZmdXUUo8REc8OFVSW2BhYmBeYF9gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgr7Csq6mlqa6jpq2kkpartrCyp5urpqyXdIydr5+oq6eUl7mfoI+cpJ2Rf4mJm56Mq5milKagnI2WkZ6Eda2OiKaaqZGXpIiburOnoJmXiol1d5ONlpOKlJGQlIyQk6CPm6GnmZyyloCMm7Wds4ySj7unoH6nonqirraAjo6mnoOLhpCxqq+MipajmnmAi6yGnJ2hp6mnh5WFmHelm3qHm4GXp4KCe5yyeoqGoJeZlJiWgpGXloSamWJ5h5CEjo+RioNtcI6HeYBwgIGFf4Z0hoSVkXiWZ5J0oJp0fZmEop6ImH+TioSEmWuOjoVseHtxcWdkeG9qbGpaZWtqZXRcX0lUTFFARTUuWlRVNykhMDk9Pjc0MzU2ODs6PT4+QERJP0pFSktHU1hbWVthYWlmWVFIOUVLPD5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq2uq6isoKixpqappZmUrsi+saKXp6m1no+Enaycp6KgjZC+npqNn5qgkHyGjpiXh6qboJSen5GNk4mGf5CnjIainaSUmJ6Gnrmwp52bk46FcHWQiZWQipSQj5uMkJKfkpehpZaeq4eftIm0mq2KyoeqrYi3hYyvgq+sgqmNpZiNnX2oj3J7d5yPp5ZolaR5tIyfnqaokpjCgX+riJihcp6AmqV9l4WVsYChfaGToJCYl4GOk5uKmJGLfIWSho2VkomDbXKQhX95cYaBhHyEdYSBloCPxWZ/qYePo2ueg6OchJqAjY6GiplxjpOFaHd0fHdoaHVxaGhrXWNwbWdtWGdHXVJNMkQ0Nk5hYzcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5qbVxRRT1MTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJein7Cnqammq6CkuLCpqqaalKCjpKukl6Wqt6OvgKGnnKWenYmUvZmTjaGSno95hJaWkIaqmJmamaCEj4x3mpuOno+HnqSclpqYhqK4rKSanIyMfmJtj4uTkI2QjY2YjJGSoI+UoaGZoad+oaeHrZ2glq2PnpydkYWAoI2qrYWjjamZjJp/o3WAmZRrgqx1Tat4h42ckZuop4Cpq32DoXt6p2mef5JrZ5eGl7aJnn5uYGRZg5d/jHtkaItymX15lWxdfJZtX1Nwg1xfa3mDYFllgn2DgJdwp6prg6NucqVwn4WgamagbFtui3xmWmCDf2JXUG93Zm10cmtqb11qcG1saVhpT15YRjlBNEdEXms0LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15eY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeWnaC4oKqkpqyRobW8q66imZigoqWsrqGdrrWjqJKhoJ+mm5qOmbSZkIufjJWLdYGUkoyKppWTl52dfpKFhaujh5qPipipmZqbkYelsKahlZqIiYBpboiIi4+OiouNkoyQkqOMlJ+gnKGkf5OBj6OhlKB3nJaPp4Ohp3+GqKuDpXiKfISafqJwc5SIlnuejHlth5uMmZCbqJqPh517gqJzdqZmnn53pF+Yen2Sc6JumLe0unSTh4J/tahkgca4e3CVt4txgJqkYnOsq2B9aZ2zfm58hoKNgouYcX+jbHKjdJ+FgaRgnZiylXF8l5+zdHNbnrKDamJvdHZxaW9YamxycmZdaV5jTEQ9RDZRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNTlFARV9eW1pYYGB8ZEhDOExXVVZjYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS3ta6toJqinaOjpq6cm7KurZOYoZmhpJmalJ+rm4uIkniLhXGAlo2Kj6GPkZOdmH2QiY2ooIeYjoqRo5Scm4yLqKilno+Xh4R+a3uHfn2PjYOLkJGJkJSgg5eeoJ2gnouJd5yYooyfcqGLh6iIm6WPlaapfa2MfnqgmXqjk3iBdJaIjZx9lZ+Gm46Zm6aGomShfIiWkJuNbJ5omo1umpl7gIunfXJodKuDnoN0qmiVml2bhXaEnWiqaoC4ZlyocIGcYJWMXqd2dYeJfp5omnWGk5KXjoCfb5qQbaeZXKh+eLtqfalbjoRds2dcbnJ6eGtpXHBqeHljYGZYYkJRRk83VkNSbzVLWlpfT1pEQDE1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW11ZZWZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4hjlJururKxrJ6mnJypn56um56xqaydl6SaoZ+YlpahpJmGiY1qiIBye5eIi5aWhJCTmI96ioSVo5yKlI+Gi56SnZ2JjqijoJqMkYqAgGmAhnh/l4x7iY6OiI+Wm3+Uop+goZOYcmifip+PjHCSjIGph5ieoaaepnuwraOiuJd3o7OipICIlHmde6qaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZp/dKpaXW97lot4nmJMfnp6hWN5l0JMnlmianJ8jm2AiISZdZt4homxs3+Am5Ond4KdbXJ9lG+ZcmqjXZV2SGVkYXNxfn5uZmBsaXZ7ZGViUl9XXVVXQFpFUWhEU1dcYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUM8VV9iWmZqVmdobW9iZmdeYWFcXV5haGJfZWN2bF5lZ2ZrZGZsaWhraZOcgbCtmYRTXqCms7mzs6maooycq5ycqZShrKWiqI+fnp2amZaYoZ2WiIeJd4aBb3mVhZCbi3yQkZaIcn+IkqCbc5GQgYiZlaGbhY2onJqVi4uKfINshIVxgaGMeIaNiIeTmZZ8k6OgnqOIrYZ9tYSOnpx7pZZ6qYGVnI+Jn5t8p2h3bX6ZdKFzcXyehplwk4OufaSDpp6ZgKNvXqhndaJjb6VhnNOQfHuZeHJzY6KGkH6jc6SPdmuQs4xggpiJc6qyqLx/d4Ntfr6mqbRenG59cZduf3Kicl2kZ3OmYWimbZvUmn2Fm294epdrm3t3l3NuqaRnYWV5cYCEa2dmZG51d2dgY1NcZlFRYklXSlRhV1NbZWpcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWFmZWpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+wq1RcS36pr7G0sLOjm5mFmamgoaSOpaigmKmKmpiYk5mTkqCYjoeGe3B9hGh9j4OUmoF3j4yOiG9+hY+SkmyXk3yJkZKkloOOqpqTkouFiXqDdoeAboGfhneAk4eImaKXe5SjpJqfibOhoraLeqynpK6lcKiAmpCFgJuRe6SAopmGmHKehKOur4qXjH+MpI2Vg62hlHa0tbXJoXOUioGeYJ2XqW15lYagm3Whh3egfpKXi4FvTGajknCbh3Oke3p0YYOBa36ga3FkX5xxfXSXaXpps7W0xqZzmH56nWucm6t1hJttdXiYaZp7dZhyUEV9tF5qdmt5iGZqaGJ0dXBuVl5UWWlQU2lKVkxZVFZdaGtuVmhXTktBSk1LSEpPQVFLUGVjam1ldXNzf3l8bnWJe3tUUE5sXmhba2lSamhpbGdsZmNlYFxdXF5pYmRpa3tfXWRoY2pmb2xlaWxloZyIr6aEZj+UobOrr6+2oqKQgJiqoqOljKannZ2mgpuXlo6XkI+ck46Ig3lqeYdlg4x/l6B5dY2Hi4Bng4WRg4yFnY16jIuVppODl6mYjJGLgYl6gH2LeXCQoYZ5gZaIiZaglX+UpaeclpaEZm54nGyiZHxxpXebmHBnpoCWi3ukep+Wg5dynnaBipSWj7lukIqiYn2ZoZWIbXJpqmt1oG1upl+aaYuQaJaHmpV1ooB9mmCMho11b4hiaKBlnn5pm3VvY2aIgm1yolpfW2KhbV2JjG57fnNyZKVtd6JkZ6domXOMmW+ib1OJkG+gX2aoVIteVJhubXNrcoJtcGlreXNrb1JZV1dnWlRtSllPXUlYaWlzallrVlFSRVZcTFhTYVVpa193dHt9cH18coN7f3N2jYCEdl5RcmJnYnBnUGpoaGtsbmhkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ykmKZ6ZXRti6eupKmwsaafi4CYq52fpo2joZuiooCWmZOOmo+LmJCOinuGcYCIaIuLfJibc3SIfI96Y4GGlImJlZmCfIiHlqiRgaKskYaQioKKfoCAjnNpj6WEfYaUjomYoI6Ik6qmnYmmeJWbfqWIloyymJ6Qgq+Xn6V3lId5qXSlj4SabqSijJKEjIO7bn2lr4OGhoaTlZyffKV6cqiVoJZmnn5vq2OWipWSeKhsqaKBiXaIg3eqkaaHapGwa3azjKlrioZtbZ+ekpVgfquLqnZ+f4ylnnaffYSklZ2gapuId6xnn62MtnR3vo2kk1mDpo2rYXVydHF8dHFjan5uaGxTV1tWYWJda01dUl1KXm1udmBbcVlcYFtmdGVub3FicXRgd3p+eXJ5g3OEf4F7e4yBgoB2YnhkY21zZFJrZ2hvbHJqZmlhYF5cYmtibWx6b1xcYmlibGp3bWdsbmKVpaqdgYCepJapqp2op66kmYmDmKuan6WKm6WdqZ2FjJqPh5yRhZKNjI10hnqIhHCNhH6Yk3R0hXKSg2x/i5GHhpOPfXuChZimjn+lpo6BjomFlXaCh5JvbIupgIOLlI6JnJ+JjJSqo6CPgHWUl4h+gXmUrqN/gZtxj4V4j4qDfntyp4xxfX16l5abhI54e35+h5SVk4p2kJifoIN7fYlrjIVbeXlyenBobn6SiXF/dYGPlJNxhoSCZYx/XoF/i3d1c5R1b3lubodthIVedmh4jmWAgIWNqZt9dHyWaomIcIF2fYZ2bW1njHN5e5h4hVxrWHmPaW54cnJveHhwXWyGbmlmVltgV1xma2RWYlVfUV9weHhsa3Zmamtrdn1xcnRzYW91YnR7gXh1eoN1gIF/gXmLhYN9e21/bGR4bl5XbmdodWt4amlqZVxgWmNqZmxxdW5aW2JsZGxseW5obG9hjZS4qKaLoaKapqSZpZyro6GEhJiskp6hiZunmqmYg4Gbi3+Wk4eOiomNcoN8j31+j4V7l45zcoNwlYV7fZKLhoaQhXh9gIaZpI58p6GLhpCQhZaDho6Yd3KFqYWOkZ2QiJ6eiIybqJ+gqoOJjpWafn6Jlq2oj5Kmj3dvnJCCeZFvfqiFcH2VcWtwfYGfjH+TjoxobV2Di4ycm56Oc5WLiHF0a4J2dIFZcm6GkYF9foxqXWpke4WEiYBgaXh6m3uCi4J1gYWCZ3eKhmthcHGBdl5yioGIj6aVhWWMj4Nud4uEcYaPenBmZ2V7g3qWW1xqZ252W3t5eHVuc3OCZlxtimtrYVlaX1pZbHFcX2FaX11mdH56dHB0Y2tra3x9c3t4dGRtdWhtfH52enx7enqAgH5vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbmxnc3lvaGptYIuLqrChkKOhmp6emJ6ZqKOjfoOZrY2glYicopGllX97mIV9kpmJiIaHinN9gYx2hYuBhJaKcW+AcpiGhH6Sg4SGioF6gIOLm6CQgqehh3iOmImVi4ucl4SDeqyCkZeZlIqenYeIoaufoqKji4iTm5yjmZaqoaemoJKbh5WNe3eNjoSnfn+SkZKTnLKmm5WekI2yk5eEpYyMlZufiZCbgoiRimt8jnd4ZYKGkIt8iZ2Eh4uQiIiAhISQd3x5dJmhiIaJnoqElH59ioCAdW9zhIJ+d4aGio+mkIOFjYeDjZCMfYiMipGDd2yChH16mWpyaGF0inB9end3cHd0gV1eb4Zobl5eWl1dVGhyVmNcXGJsaHV8fHNvcGRra2mAfG55f3FqcHBsZ4F7coKAeH99f4R7bYKMhnx6eHx9eoN5TmR3anJtcHpla2VjYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2SMh525npaioZiVmJmVmaShnnyAmquOno2Gn5yLnpZ9eZSDe46ZiYaEhIZueICAcoGIfomUhG1rfnqXh4SDkH+AhoSGfYeEjpudkoern4Ryi5CGk5GLnZF9jXuqhI2SmJaPnJaHhpumn6KanYaCkpqZmJCapqClnZ2Qln+PiXV8h46EpXt8jpCRhpiqop6TnY+Nqo2RgJ2MiZOanoKOl36GjoNveIZydWF/g4+GdYuYgYOPgoaFfoWElG55dXSSooqLhZqEhIxzf4h8fHJye4eDeniKjoOSpo+Fg46Bg4qJineGiYqMfW9sfoF8bmhsbWhfen9ofXt2dXZ1e3dcX3B9bnRfY1tdXlFnblRlW15ia2l2en5xbG1ka2pngYBsc4FsbHVveXCFeW6HgHaCgH6FdnGCjYh+e3t8f3uCimBpe2p1aGmCZGpjYGlcZHVob2J0bWxVY3F5ZXB6e3Nlam1si4met5qho5+SkZaYi5qfn557eJ6nkZuKhqSTi5iZeXqNhXyJkYOMgoKCbnt/eHOBhX2LkX1raH2CmImAh418foaEh32PgZCbm5GJqJyAcIyLjJOHoaKKhYx9qJGIkJKYlJaTeIyjn6Cdlpl/gJCamJKMmqOhpJqXkZp9jIR4gIOOhqB/foyMj3yYpKKik5mQj6aMjoCakYmTl5t+k5J+h46BdHSCcHZgfoCNhnGKlXyIjHGMf4KFho5od3F4i5iRj36XfYeKcoGGe3xxeHqKhHp5kIuClaWTi4WQe4aGh4V2goSJiHtmcnx/eXtxbGpmX35zaHx1dnR9c4BqXmBzdnB3ZGNZX15Sa2lUZFlfYWhqdnmBcWZrZGxoZYCBa21+aG9xbH54h3prjIFzgYF+gXR2go2Gf3x6f4F9f49qcoJtc2lih2hsYl9xVnRvbW5geGhtV2p0dmN1entyYmpveYmNnrKSpaWcjpCYj4adoJudfHaloY6Xf4yiioialnh7hod+g4l/iIKBf3F/e3R2goV+ipF4Z2N9hpeKgYmMeX2AjYN5loGVmJaNlqCbfnCMgpGUhqabh4yJg6aVhZOLl5iTkneRnaCgl5OWeX6OmJeOlpqdpJ2YkpSaeI6EgneElo2dfoGJjYxyl6OfopOZjo+hi4qClpiDkpaZfpiMfIiNgHZxfW56ZIB8ioVwhpN/kIJsh4KBgImEZXVve4aSl4x8k3eKiHt/hXx7cX53iIV5hI+JipeilYGDi3aIhIKCd3yCioZ3YHl4fXR/eGdsZWF/aWp3c3R2fXF8YmNhc251cm1hWmFeW2xlUmNYYWFpbHZ5hnFjamNtZWh9g2xodWhscGmAfYJ5bZCGcYCEg390fIOMgYB+eoKDfnyQbXaIc3RuZYpsamJjdVaEaXFuYHhnbGJqdnBmeXx6cV9xbIaFj5yul6aono2Nl4eGn5OXmX14qpyKmXqWnIuMmJB5fIGMfnyDfICCgXh0eXp0fYCEf4mLgGRefYuVh36EhnV9fop/fZiEl5SXjKSimH9zh3uUkoqnj4yOipOhkoORkJWYkYuBj5ifmpKPkHN/jZKUiZ2dnqaYmI2VlXKMjYlrhZePmXqHiJCJb5eem6STlYqNnouGgZKcf5KSlYeZiHyKiYF5cXprdWx8fot+bYWSgpR4cIKDfX6Kf2RyaXuAlpeEfo1zj4iDeIZ9dnd/fIWAfIKMhIyUpI94hIJ0iYd9gHR2gYmEb2F7dXpxfW9ib2Nke2Jub3ZzeHdzdGF1YG9sdW1vXFxfXl5rXlBdWGNiaW10e4hrX2pmamNod4huZmxoamxogX17d26QiHOBhIR9dIGGiXuDfXqBhH19jnJ6inh4bmyHamhfaXJih2hxb2V2Z25sYXlpa317eHBhd22LgJmZqqCjqJ2KipGGi56LlZh+d66ZjZd9npOQlpSId357in17gHZ4f4BwdHR7b4V9gYCKf3xhW36PkoZ/g4NzeoCHeo+SiJKRnJOlnJWCfYJ9jouSpImOio2Ym42GkZiTlo+KiIySnZOPi4xug4+PkYiemaKhl5aJlpBth5iDZoWYjpN6iISQinCVmpSjkpKJi5mMgn+Qnn2Sj5KMmY57ioSHc3J1a3BudXuLdG6GkI6ScXWAe4CAh3tkcGx4fZmTfYSIdJCKgHOHeW5/fYCFe4WLiISMlaiMeod8fouFd35xcIGGhGRpeXR1cHxiX3Bha3RecGp7eXlsc3BleF1ubHNtcllaX19ia1pQV1hlY2dxcX6HZl1paGdiZ3GNbmRpZ2RpaIF6d3VvjoV0gYKDe3WCiIV4hXx4g4V6gIl3f4t7enJ4g2prX3BodIBqcm9tcWdvbGV8Y26AendxbHd3in6il6GooKabh4yKgpCdh5OddYGqlZOOh6CMlZOQgHR8doV4eX9yc3uFa3Jwem2KdoCBh25xW1h+kY2If39/d3WBgH+ghpGLkp2YoZWYeIqAgY2JnJ6Kj4aSmJaFiZWZj5aLi42NjZ2KjY+DbYmLkJCKnZahnJiVhZiHaYOigmaFnYqQfouDi4F3k5iSn5GQiYmVjX9+j5h8kY2PjZqRfIqAgm51cGxtb3B7hWlzg46YinF3gHSBh4J4ZnJudYGZjnuIhHqTkXl2h3NviHuFi3qKhYKIjpujh3uDdYKLf3d5bmyBhIJec3RycHB5Wl5wYHBqXm9qfHtxbW1qbHZgcG9qcW1aWGFhYm5YUVRaZmdjdm+EgmJda21kYmZrkm5gZmZfZ2uBdXJzcIuAdX+DgHh1gIuAeYV/d4eGd4OFfIeMf3t2in9qcWN8Y4Z8bnFsdGpob2x2eF9xf3l8dHV0gIJ+pJWarZ6mloWNhH+XlIOQoHWLoJSThouajJWOi3pyeHSCcHKFc3F1iGtvbXVtiHaDfoBtblVRgauVh4J3f3dzg3qCoIKSgpOTmJyTmniSe4ONk6Sak46JlZmShYeXmYyUi4mPj4iehI+KfHKLhYmOiJyan5uWlH+TfWeEm4ZnhaCHkYORgolxg5GYkJuOj4yMj414e5KQeo6LjJKWjHyIfIBrdmpua2xse35hen6OloJ3eoB3gox8eWdzbHOHlYp+iIZ7k49xeYNvdox6iYt6iH2Bi5CenYR8e3eCi312cGpsgoN6YXhwbmxydFZeb2JyYF9sbnlxaHBmZ3N0aHBrYXdlXVZmYGByU1FOXGZlXnlwiHxfXGhyYmJlZpJqX2hkW2dwfnBrcXSKfXZ8hYB0dX6MeXuGgXiIg3OGhX6NjYR8eZV4ZnJqg2CIfW9va3pgam50f3VfdH15hnh0c4V8eKCPmbCcpY6Cin+DmoeAjJ5/i5qUj4WImI6Oj4R3dHZzgHBvhXNwcYNvaml2boNufX1tdXNSTYLfyJLWk3xwdYN2hKCDk3eVkpmckZl7lHOFkJ+hk5OSipKblIZ+lpaJjY2IkYyInH6OgHd6jH6IjIqcnJ2blZN5jHVmiJGGbIiihJGIl4KFY4yRmY+VipeLjYqLcXqUiHuOiIqTkYl5hXx+bHtlcm9ra3l5XIB5kI6Ae31+foWNenpocmpzio+JgoWEfJSKa31+bn+LfouGfIR5gY6UmpqKfHZ4g5B4cmxncYCFbmt1b2hqdG1SXm9kcFlfa3F3Z2trYmZ4cm9wY193YGBWa19edlBOS2FnY116cIl0XFxldmBhZWWPY2FmYlhpc3NtanF2jH10eYaCdXZ+i3OAhn96iX5yiYeBkYuIfH6YdmVzbn1liH5vcGuAWmxueXlzYXZ7e412cneKd3mfi5uvm6CQgoV3iJV+fYqdh4agkY+FjJiEk46HgXR3cHlxboRvbW5+cmRleHB9bXp9amhrY6Sawdyu76FzbHaEdoWjhpJvl5GWoZacgZJyhYujl4mOlouQnZaDgZWQhYmPgJGKiZZ+h3t1f4l4hoSNnJuYmY6PdYl1bYWIin2KooOQiZyEhV6Lk5iMj4mOioqEiW17loF9iIWJkY+GdoV9fWt9ZHh1aW54c1iIepKHhXl+gH+Ei354ZXJpf4mOiYKCf4uWhWuBdW2HkIGPhH+CeX+PlZOYkHVzd4iNdXNwZ3Z6hGN1bnBiaXZnUWBxZ2xVX250eWFyZF9ofXByblpjcmFiVm5ZXHhOTUxkZ2Jed3OJbVxcZHleYGRlhWBjY15ZanJrbmtyd4x+dHeEgXh3e4lxg4R9foh7dIuJh5aGjH9+l3NodXF5bYt6bnRwgFdxenZ5cWV4eYeMaXaAiXJ/nIeZp5yjkoV9cIyUeHmLnYSFoY2OfJaNgJqIhHtzd3Bzam+Ba2ltfHVeYXh3e3F1e2dgZHzr2rXJw9yIc2x0gXeLm4mOapmQkJ6WlIGJcYWJoI6Fi5aLjJiUfI6TiIOJj3uQi4WPgX92eIOEcoeCk5uXlJeGjHWGfm+EgYmGmKGCk4ueg4lhg5SPh4qGiY2HgYdqfZSAfYOEiY6NgnGGfn9xd2h2cmlzdmtajHySg4V8f4OAg4mCdWFza4iBj4qBfn6RkH1tgWt4hY6FkYN8gXx/kJKQlohucXmMhnVscGtzeYJgdWpuXWt2X1FkcWlmU2BwdnRgcGBdaIJxc2lXZ2hiaVhtVlt1TEtMZmdfYnJzhWlbXGV5Xl5kZ3thZF9dWWtuZm9pc3iKfnNzgX56dnqHc4WDfICHdneKho6ZgYyCe5N1bHd1eXiTdG54e3xYeoZxgG9neXeSgmR2hoVxipaFmaGZooqHc2+Ti3J3jpx+i5qJiXyff4Saf4F4cnNub2RyfmhmbHd4W195e3txcYBpYGZhf9W2jpCmeG5xd3xxk5GNh2uaj4mck4yGe2mHi5mGgZKRhoeYjnyNjYGBio17j419iIR6dHqDe3GHgZaajpOUgYh0goV1gn+KkpydhZSOn36IYX+TiIWJhImNf4CDZ32RgH5/goyOkH5tgnyCdGttd3V0dnVqYo2Bj3+EfXyEf4SIfm9fcnCEe46MgXx+kIh5cINmeYKKhouCe4R9f5OOj5KEbm95jH51bW9rbHt+ZGlsalludlpSaXJpYlFicndsYmVeWmqDbXNiW2dfZGxfblVbcE5IT2dlXGducYBsW1tjc2BcY2x3ZGVdXVprbGJtanR3hn9xcH97fXR4hniFgn2Ah3V5iYGSlnyJhnaJgXB3eXuEk29tfIF3XoN/dIFtaXp0lHNnc4d8cpKRg5qemp+GiHZ2lX5tdpSXfoiRhIqOmn2MmnZ9dnFvbGphdXxmYml1elpfd3x6bXF/ZWNnZ1edj15xc5a8xIR2cZSJkH5zmIyHnJSNiHRriI+VgHuUjIGEm4x8i4Z9fImMf5SIdYmFdXZ9gXF1h4KelYaVj4KCcX6HdIN7iZecloaTjZyAiGV9koOAhoOJiXKCfmd9i3t5f3+Hi499aYB9g3Zmb3l4c3Zya2qNhYqBiX54goCEg39qXnF3en2MiYV7gI9/fnKAaHiChoqEg3iDe4CXjI+MfW5seol9d3RvaWh9d2VecmNYcHNTVG5zaWJOZ3R4ZmBeXVhugG9zWWViXWptYHBPWWxSRFRoYVprbm17b1pbXmxjWmNwdmRnXF1ga2pjbGlzdoGDcW5+e390dYN6hIJ8gYV2fomBlpF4g4p0gYhzeXl/jpBvb3yBcWmBeXp+bW18dpZraniEdGuUjYWfl5+ZhYhufYx2aniYj3+CioKVmIp6j5ZvenNxbGpkYHR6aF9lcntaYXJ8eWZwemFkZI6xsndKYlqk2dCXcnuRi5F4f5aMhZqSjYZvbIaSkXp5k4eBhJmKfId/eHiJioSWgG+Kh3F0fXtqeYaEppGEk42Dfm19gnaCeIWamJOLko+UhYdvepKEfoODiYNvgXhogIV4cn9/g4qHfGV9foN1Y3BzgGh4cG50mI2Fgol6dniAhHmBaltwfHKAh4SJfYWIeohygG1wg4aNg4Nyg3iAmIyNhHdtbn6Ef3d6ZWhqfnJhWnhaWXJtTlhyc2ZgSm12dGFeW1tZdX1yb1dnXWZqcF9vTldpUj9ZZ19bcGpneXFcWllrZVljcXlfaF1eZWxoZmxpcXd/h29tf32AdXCBe4CBf4J/doGFiZeKcYKNcXuGfXp6hJSMdWp6f2tvfnR/fW9yfHuUcG+Af3hmkoqCoZickoKFZ4eEcGh6l4l+f4WCmYqBfI2NaXhya2xmX2FveW1fYm95XGRsg3lgcHZfZWXV676LMjo+i46AcnmFiI6NdoSYjX+Tjo1/bmyFjYx1fY9/hYKViXyDeG52h4WDl3duiIRsdXt0ZnmDg6iMg4+Mg31tf3R1g3mFmo+Lj5GSjIuGfnuSh3mAhI2DbIBzaX9+eG18e4GKg3hieYSBcWRxaX5tdHF0gZuLgH+EfXN1foBzgG9ba310eImCinuGf3yIeHpxbIiCjoKJcYF4f5WKin50bWp2gIB1dVxpaXhxWVd9U1pxZUxbc3JlW0pwd29dW1pZXXR+dGhZYltnZW5iaU1XZlE9XmZdXXZmX3RwW1lVb2RaZXF5WmheYGdtZ2lsaXB4fY5saoKEf3lugHt9gH+CenWCgYyThXCAi253foF7e4iTiX9oe35rdHxyhntzd31/jHp4hH58a4yMg5udloyBgGyNfmtpf4+Ne35/g5SCf32KiGt1cWdoY1tiZ3NvX2FsdGFocIl5YHN0XmNkm6CQblw1Wa+1dWqAiX2ShnaGmId1j4yKd3BshYOHdHmJeIl9k4h6f3Nndoh+fZdvcIZ9aHd5bmV6iISlh4GHjYp+bn52foB8i5eGgZOQl4iLhIl8j4lyfH2FfGl+bWuAe3pqenaCh4ByYHeBfnFkcmd1gm11e4WVkYF8gX5vd3l8dH5tV21+dnOKgYZ3h3WBiXp3c26JgI5/g3J+fH2SiIh6bm1pbYKBdW5daGZ0clJbe05ccVxPXHJvZFZLc3hqV1lZWmFxgHRgXV1gZmRoaGZOWmhOQWFkW2B2YVx1bVhYU3RhWmRucldqXmJoa2dtbGlwd3yTbGmEin19cH5+e4F/gnp3gICJi4Rye4dvcXeEf3uKjY+Dan57bnh5d4p3fXiAgod/g39+em2FjIiYo42Eg3t2jHlrbYSJknl9e4KRgIB9ioNwcXBjZl5ZZ19wcGBgaHBmam+KdGBzb1thZGl2e3++nKajyLhyhYNzlH14h5SEdJGNiHJzcIR7g3N1hnSId5SJeXlxY3eGeYCTaXKEdWZ3dmNqfIOInoKAf46OfXJ+c4N5f5COgneVjZSPh4KIeomJbXl5fnVoemlsf3lzaXp2gIN9aGB3h35qanNoe4BpdoGMkJR+en19cXt2e3R9YVV1fHJziYOCfIJwhop3eHBwg4KLfXx4fXx1jYWCdmhxaGyIgnJwXWhjdG9LZXZMXm9VVFpzbWJRT3R4YVJXWFxhcIJzW2BcaGVkY2pkUFtxSURkYVxkcV5cd2hVV1Z3XlxlbmhWbF5hamdlb29ocHd7k25piIt5fnN7fnmCgYJ8dn2DiIaDcHaDc213g4N+iYuUf3CAfHh5eoGLdIN4f4GBgoR5gHZvfomLm56IfYZ6d4d8aHSGjZF6f398iYaEdo+AZ29tX2RcWGVZbXNhYGFxbGxoiW1fc2lZXmRtgHep2qrHhoeycop4cI11e4eQgXqUioB1dHV+d4BwcX5thXSUhnh1bGB6gXmIjmZxg29ndW5bbX2BkJOAgXmSkn14e22GdX+PioNzlYqQjoeFhXt/hW11dn9uaHdmbXx2bWp3dn9/fGFieIZ6aHV1Y357Z3SGjoyVe3SAdXGAenxsf1lWcn1vdIOGf394a4iGc3hrdX+Dgnx5fHd7coqAfHNndGVti4RtdFtrYHZmSG5vTFtjWFdWeG1iUFN0dlhQVVheYHGEb1xgYmxkY15uYlRdckdDZl9dZmheWntiUlZcdVtbZ2thVmtfYW5mZmxxaHB2eI90a46NdX92eH13gYOBe3R9g4iIg29xgHVxdX6GgomNint3f3iEfH2Fh3iHfH2BfoSAe35zdnmMjp+MiXqJd3WDeV5+hpqNeYeDdIaGhHeJe2JubFtiW1thVmp0Y2BbaG9wZ4dxYHFmV11ja398ys6HuaJrbW6LbXKFcn2Fi397koV6eXR5dXV7am11Y4R2koJ3b2dffIF5i4llcYFqanFjWG17hpyJg4Jzl5R3fntth3CAiYqGcJaOkIiFi4N6eX5xcW99Z2hyY254cmpscXd9fHpdZXmAd2l1eWaCdmd0h4yNlHxyh2pufoB5bXxdWHB9bXN/inyBbm6Jf3B2Z3d+gH5/dXtxenOGe3lxZXJhboyCbHNYa194XUlvbE1XVl9UVXxrYU9UdXJRUVRWXmJ0hWhcYGppZWJZbmFYY3BHQWhdYGZeXVZ7Xk9WZXBaW2poXVdnYF9yZmpocmhxc3aHeG6VinR/e3d+eYOHgHVzf4aFjoJwcHt4d3V5h4WHjIZ6fH91i359hoSEh39+fn2Hf3x4dXl3kZOffox9i251gHlkg4iXhnSSim+FhYJ6g3RjbmpZX1tdXVRnc2VgWWRycmeBcmFrZFdbYGl/eL6ue5+3bmJzh2h0fHJ6g4d7fo2AeHhzd297dmVqbmGHdY6Bc2piX354eYqDZnB9aGprW1dveIqjgYV/cZmTcYB4dIFsf4GPhnKUh4yHg4iFfXl0cm9oeWFqbWFtdmtna2x6d3p3W2d9fHhlc35uhHRldYaNhpV+cItma3qDdGx0Yltue2t0fIt6gWZ0hn1tcGh1fnd8fXF7a3l7gXl3cGVsYW2Jfm1uVmtgeFZLa2xPUk9pTll8Z2JOVXVrTVBUVV5ndoNmXWFvZ2ZhV2ldXGxpSkVqWmJkV1lVeVpOV25qWV1sZVxZZWNedGZsZHJnc3B0gXhwmYV2gH94f3yFh311c4KHgJWCbnN5e3tzcoWHiIiEeYF9do9/fYSJjoOBg3t+i4N7d3x3d5qdl3qKg4dpdn58bISFlIByj4JxhoJ+gn9vZmxmV11bXFtUZHBlX1hjcnVpdm9kZWJXXFxogHBvcoBziWVleX9qdHZzc4OFeIGEend0dW5renBiZ2tnhnSNhG5mXl98b3uJfWhtd2ZpZFZXcnCNp3yEfHaWkHN8cnt5bHp6j4R2l3uHhoKGg311cHJtZ3VdbWlfbXVkZ2Zpem97cllngXZ1Z3CAeIJ1YXeFi3yUgW6Lam16gXFlcmVgbHlncnaJen1hdYN2aWtxdXpweXdyfGZ9fn54dm5jZWFthnxta1ZqYnFUTGprUExOcEhee2VhTVV0ZEtOU1dhand+ZV1ncmhlX1ZjV2JwXUtLa1hjYVRTVHNWTFl2ZVpfa2BcWmNlX3dnbWJwaXNvcX51dJmBeICAeIB+hYR6fXaCg36YhW5ydHx6dHGFhY+CgHqLdXSQgH2BlI6AhYR8foyGen6Adnujpop5iIaFbHV8e3WEgox6b4VzeoV9goN1bmppZVZdW1taU2NuZVtYYXR7amltaGBiV19aaYBpa2+AZ2xhaHp5a3R0dG+GgnuAfXZ1bnppa3pqX2VuaIF3kIRnZVhid2l+h3pvaW9nZl1VWG9oj6d2gXp8kY54dW9+bnJ0eI5+d5R0hYJ/hYh2anJ2Z2hvXG1lXm5zX2dianhoe21bbYNzdGpvgH55d2B2hIR4j4VziHFweX9xY3BoW252ZHBzh3t4YXKAcGdpeHNxa3d2dHZjg3t+d3VwY2NjbHt8a2tVaWJnVEttaVBHUmxFYXhlYU1Ucl1LTVVZZGt3emVfbXBpZFxWX1VvblZJU2hYZl5XTFRrVEtcel9bX2tdXVtiZWB6aGxhb291bm93dXqXfXaAgXmAf4eGenl6g32Bk4RxdHR+eXZ0hYiQfYB9kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ+AeoiHhGxygnl2gYCCdG6Hb32AdIqAam9uZGRYX1paW1ViamdbWl91gmlebmxcYVZcXGuBZXJ0fWlqXWx3dmd0d3Juh3x+fnp2c2x6aGp4Zl1kcmd6d5KBY2NUZG9ngoR3dmZoamFXVlloZJCnbn54gIuOenBwfGZ4bnmKenaOcYN9fn+GbmR2c2RoaF1sYl5wb1tnXm11ZXppXXSAb3JrcXt+dXVhdIWKe4eHgH93cnV+dGFwbFlwcmJxcYR7dWRygGxgbHpvamh6d3RxZYR0eXl1cWRhZGxyfWpsVGleXlVMdGNRR1diR2N2ZWBLVHBYSk1YWGdrdnpkZW1wZmNaWF1YdmZTSVxjWGhYWEhWZFBIYnlbXWBsW15cYmRegGlqX290eG5vbnaDl3lygYB9f4mLhn51doZ4hox9dHV1gXl6eoKMjn1+hIlqdJaBe4qdfX6FeYB7fnyGiHNxj66MfHuGkH5mcYh6dH19dnJvhm17fm2PemJwb2JlXWVWWllXY2ZrYF1dc4ZpWXFuW15YWlxse2Nxd3ZtY1ttc3RodXZxbYV5f4F5d25vdGVpdWVbZ3RmdnaRel9dU2VmaoKBc31hY2lcVVheYmSQpWh5dIOGkHhsbnlnd2x7g3l0iHKAeHt4f2hldm1gZmFfamBedWtZZV1vbmJ6Zlt4fGtubnB3eXR0ZHKDkn+Hgoh6dm9xfHJhd2Nabm9hcHGBe3NlcYBkXm12aWNmeHpzbG2BdHN8cnFiXmVtbn1laVRoWVpVTnlgUktaWUhjdGNgSVRtVEpNWlZpbHJ7Y2xsc2NhWVpbYXdcU0pjXVhpU1ZHWGBOR2p2WF9ibVtbX2JjXYVpaGFueHlsb2p2gZB4bYJ+gIKSiISBdnWJdIuGdHF2doF3fH1+jJCAfpN+cHiWg32ZknmAgHh5fn9ziINzcJqie3uAiZV5ZHWIeXN5dmtzcH9seXxwkXJecG9hZ2JsVFtaV2hjbWZcXHKJZlNybltZWFhgbHZkanVqal9bbXRxbXR0dGuGfX+AfHdvb2xlaXFjW2tyZHR2j3NcVlNkYHF/fnGCXGFjXlNaYVxkk59lcnGEg5B0a2p5bG5veXl6cYB2f3J5enpkZnVnXmJbYWhcXndpV2JecGhheGFbe3ZqanJvd3RzdGlwgZSDhn6EdnJqcHxtZXZXW2ptYnBygHpzZW9+W2BvcWJeaW97a2tzfXJwd2twYFtla217YWdUZ1VYUlF3XFNQWVJIY3NiYEdWbFJJUFpVa2trfGVtb3FhW1pYWWxwV1JPZldWaFNURllcT0lydVlgZG1jWGFgYV6MamNkbXl4a29pdXmGe2uEfYCFmXyChHl9iG2PhnFvd3p8dIKCfYuPg4KWdHiCk4aBn4l1gX+BdH+CcIeCdW+il3R7houHe2Z3i29ufHBmeHF7bHN2c41rXnRuYWdma1NeXFZoYmxsW1xxjGROb25dVlhVZ2l0aGN0ZWVdWm51bnB1dXpriH2AfYh3kHNjZWtuYVxubWNzeIdrWlRWYmN3fHxwhVxjX2NUWmBaY5aVY25wg4SKc2pneW5lcnVxemt5dHVuen51X2ZzY1teV2JkWWF1ZlZfYW1jYXFdXX5vaGlzcXNwdXVrbISTgYl7hXFyZm57b3FuU1plamVxc4B2c2JsdlVicWtbXm5ke2RrdXxycnJqbWBZY2lqeF5mVGVVVlBVb1hRV1RQSGVyX2FGWGtPSVhUVm1oZHxpa3dqYVdcVVt0ZFNSVmhRWGVTU0hZWlBOeHdbYGZsaVpiYF5ej25iZmt5dW5uaXZ2f35thIB+hpd7f4eBiX5rk4hyZ3SAe3WAg36Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Ld3hue41gZHxxZ3lzeW1tcXaDZ2R8bWNmZ2hTYF9VZ2Bsb1xebo5oTWltYFVWU29mc2xleGRlXVlxdW1ye3hzbYl8gXece3psYmVsbV5gbmplcHl+Z1pWWF9seHt7b4NfYl5oVllgWGSciGJrcYGGfHdranZsW3VwanlpdXJtbnuAclhqbl5ZXVZiZFhlcWRUX2JpYmJtWmB+a2Zrc3VubXd2a2iFjH+JeodtcWZve2xxbGJYX2hob3OAc3NeaW1TZXBkVWJuYXhib3V7dWpvbGpfWGBmaHVdZVZiVlNPWWdTT11PT0hlb11jR1pqTkpgS1htZF94aG59ZGBVXlRddFtUUl9mTlxhVFNKW1lRWnZ2XV9mbWhYYmFbXo5xY2dqd3FzbWd2c3mDc4KDe4iOfnyKiI55bpCKdGxzgXN/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2Njo6OjY6Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2Ojo6Ojo6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQkuSmpmZmZmcW0FEREREQ1hoZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiGgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzP5OenJycnJ9SMTU1NTU0TWFfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJh4eIiIiHjpCQkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGjY6Ojo6OjoiGhoaFhYWHiYiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpGSkYmHjoqQkpORi5KPjI6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2MjIyNjY2Njo6Ojo6Ojo2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6FjoeIjYiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkIiMhYaPiYyQj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCQiIyHiIyIjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjJCIjYeFjIiPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4yPjIuNjI6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Oj46Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OTlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJWVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSkpSPjpSTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpKRkZKSk3yGlJKTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKPfo+SkZOIc4yTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkJB0dpCRkHh0ipGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPkXxofZGJdXaJkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6QgGJqin5sdIiPjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI53XmpmaWNsio6NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4qLhmRvbVtpcmuBhoOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dndvY3FvYWpzcWVoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGNla25zcHJ1bGNjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5ZXGBiY21vcHBtWllfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01PX2hmbG5tZ2VRUFNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTk9MTFZkbWZqbW1qZ1xTT09QUU9OTk9OT1BOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tHR09VYGhuaGxsa2pqaGRfVk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFRVNeYmZoam1sc3BqaWpsa2pmWEpKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4/P01ZXmptbG55c2pqbGZcUkxFRUVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs7R0o+R1lqb3dwa2lZR0RBRUZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7Pj06O0RYbWxfSEE+QUBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5Ojs6NzdTYz03ODw8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PT09O0VZOTs8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDxdbkA+REU/P0E8RVw9PT07Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O212SDg7Oj09QTxKYTw8PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PT1JTEZGdndNNzg4Ojs+P1dpQTs8PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3l8d1Y8PT89PT5GanVNOj0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KChIODg4B9XT5AQ0BAPUpzfFk6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hHVMQUNFQD8+WXyAXT9DRUlKSUlNTUtFQ0ZGR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFcUJERURDV3WGh4d+WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIRkhGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SKbEFBVnSHiYeHh4iDV0hMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN2d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVmyEh4aGhoeIiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUpISEhHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVYGDhISCgoWGhoSChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4OEhYWGiIiIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqMjIuKiYqLjIlUOjg2NTY3NjY2NDU3NzM1Njg6ODc2NTY1Njc2Nzc4OjY3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QT1JUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCCg4ODg4OFiYuKiYmKioqKi4mKioFHNjc2NDY4ODc0NTc4NTY3Njk5NzY2NzY1Ojk6Ozo7ODk4OTg3Nzc5Ojk4ODY4Njg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISEhomKioiHiIiIioqLiomJjHo+OTg4Ozw9Pjk6Ojw5Ojs5Ojs6OTk7Ojk9PT0+Ozs8PTo+Ozk7Ozw7PDw5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3VzdXh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFAQj5AQkBAPj09PkA/Pj9AP0A9PT9CP0BBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fX17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VCQEBDRUNCQEJDQj9AREhFQ0VDRUVBRkVGREVGREBCPzxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFZITUxNS05KSUtJSUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZIR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BOUE5MTktKTEpJSUhKRkRGSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIR0dHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozw9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNck5ST05MTExMSkhHRUlJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSEZDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLX1JSUE1OTUtKR0VCR0pHTEpGS05LS0pKTE1MT1BOSElLTE9RUFBRT09KSUpKTEpMRkdIR0ZHSUZFRUJBQkJcb3J3eHl6enl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418WFZSUlRTT0xLSkRFRktPTk9XVVFQT1JTU01TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRklKRERFRUJEQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkJHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toV1VrYUVSUVFQSTs7UlRSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT05SUFBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdGRkU/P0FBRUFDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enl6e3p6fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiot6bnBYWlxbUlNSVlZUW1p1g1lVfZBgXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU5QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlUVVRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JTVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5UZFV/UlFRTktSVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV2dXNzd3p6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPUNJR1ZASE5MR11pUEhGT0ZERUZJR0hDREhHSEtHREJBREBOUU1SZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYJrTUc/QDo7PkBAPz8+alFLYUVGSElFQj9HTE5HTVFVSUJFPz88PTw9PT89P0FDQ0A/PD1CPkpNR1VudHR1c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT88Qkg/XHN0dXZ1dnh6fHx8fXx8fX19fnx+fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGRkhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RV1BNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fX5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWlhNTFRUU1BRVU9MUlNUV1hUVFhRTFdZWlZYWFZYWV1XV1hoc2tdVmFza2FhX15kYV9eWVRRTk5OTElISktJSUZDUVBTW1dUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODU3NTc4NTk5R21ydHh4eXt7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09UVlhYWVNVVExLVFZVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxPUlJPTU1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8/PDo3ODc2NTk5Njc2NzVXcHB0d3l6e3x9fX1+fH19fH19fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xdUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEpPUlBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I1NTY2OmRvcnV4eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtJRkxNUE1HL0VfUj4zPz5qb2FSUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dnp7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1NRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnV5e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVU1MS0k8OTg3Oz9APjw9QUBCPT5FSEdDRkZJR0pJQEZBQUBGSEVKT0hRUmFcUVBSTlNOT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0hKTExKRkZGRT9CQz48Qkc/Qj9BZHB0d3t6ent8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hERD05Nzc5P0I+Oz9BQEA+QURJRUNHR0lGSUVCQj8+PUNCQUdJRU1PYmVRTU5OV0tLTUtMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHV4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hKRD9BPTk5OTo/Qj88QEJBQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVETE1SVExKSU1UR0lJSkxKS0xJSkxNT1BRUEtHQ0tHQ0JKSkxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxSEtER0hIR0pLSUpLREdCPT49Ojo6O0FCPz1CQkNDSEZJS0pESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESElLTUhKTEhJSktKTVxSSEhETkZBREtKTU1QTUtNSktGR0dKTU5RTkxibWl2dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0NGRUdFRkZHRUdCQ0A9PD05Ojo6QENAPkJDREVJRUlKTEZJSUdGRkRCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJSEVOSUJGTUxOTU9NTk5NS0lISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUNDQ0VAREI+QD86Ozs9Oj0+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9RUVCPkJEQ0NFR0hJR01QSkZGR0tOT0tGSEpGRURFSUpIS0lGSFBLQ0lNTFBNT05PT05KSkhNUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZnFsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEdFRUhDQkFCRD1CQT5BPTk6PT86PT5AQj5AQkRHSkZJRklIRkZHRUNCQUFGRkNCQ0JERUVHR0hGTFFMSU9KSkxMSUdIRUZGRENJSUhLSkdLUk1CTk9NUU9PT01OT0tLS1BVV1ZVVFhfXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQEREPEFAQEM8ODk9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSElGQ0lKSUtNS09TTkRRUlBRUk5QTU5QTUxNU1dWWFhWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlveU1IR0hIQkJCRkQ8P0JCRDw3Oj4+Oj46QEI+Pz9DRUZERkRFSEZERURERUZHSkVFSkdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BTT1FNTlFOTVBXWlZaWVZaXVpYYWBgYF9oZWNgZGZoZ2ppaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TklIR0lDQUNIRTxARUJEPTk6Pj49PDxBQjw/PkFCRkNFQ0NIRUNFRUZHR0dJRkdLSENJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OT1JVVk9LVVdTUVNRUkxPUVBPVFlaWVxaWVxfX15gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2b3RNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QUFGQ0VFRElFRkVHRUhIRkhISUtJRUpISEtIRkZMSUhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9TUlBWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqZ2dscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkVGSUZJRkZESUhHSUhKTUhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUExPUFJUWFZNTlRWVFJSUVBMTlRTUldbXl5fXV1gX2BhYV9hY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93S01MS01HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHREdJR0hKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUVdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSEpJSUtISkpOTE5MSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsa1Rfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RFS0VFSk1NS0xMR0dNSUdKS0hLS0lLS05MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFREBCQkA+Q0ZHQkZDRkVGRURDSEhHREVLSEdMTU5MTU1GSk5ISktKSUxKSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBdX3JrcWpVdXl4cGNea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dIRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFR0tKR01NTkxNTkdMTUlMS0lKTUlKSUpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhNR0lERUVDQUI9QkFCRkRIR0xIRUNDSEtISEZKTExGTkxMU1JMR0xMSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b250c3ZzSEtISUJFRUVBQD5EREJHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1NSUtLS1NrYltpXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVERkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSkpLSUhJR0tLS0xHSEtLTExMTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVVlaXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQ0BDSERGR0NJS0xIRkRHS0xIREdJUEtMT0tMV0xJRUVISUpISUtITEpIRkdHSUdISUVGTElKS05MSVBcV15QXFtgXk1YWVNcXGJeTVlaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRUxNQkREQkVJRUdHRktKS0hFRUpKS0ZFSEhQSk1NSk1TSEdFQUhGSklLS0lMSkhGRUlGREZHRUVKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2JbYF5bVFhXWV5dY2JjYWNmaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dXZhU0pKTUlEQkJDR0hFSEdIS0lJSURGS0tLRUZJSk5LTkxITE5HSEU+R0dMSUtLSkxLSUdFSURDRERCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVZVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUhJRkdISEZGSkdIRkhLSUxEREtKTU1MTEhKSkhKRj9HRk5KS0tNS0tLSUdHQ0RAREFISUI/SUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFJbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0ZJRkZGSUxKTkZES0pMTkpMSUtKSElGQkhIUU1LS09NS0tJSEdFRD9FQ0hIQUFHR0VUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUdGREdNUkhDUUpGSEhIRUZLSk1QRUZJSktOTExJTExJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUdFRFdVRVxVXlNWX1hOVFVOWlpNSktUYGFbX1heXmFdT1liXGBgX2JjYl1hYldfX1RQTk9PV1FdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUENWXklHR0hERk1KUFBFSUlLS05MTExNS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENCRUZCTUhCS0xQT05MRk1GR0lKSEdMS01PUElMT1BPU09MUVNSVVpZV1lYWGRXT1NUUFBOTU9UU1tYWFpdXGBhZGVjZ2NrbHBzcnp5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTEdISkhHTUxRUUlMS0xLTk1VTk9LS0xHR0tQU1NOUE9OT05PSEtGYEVEX0xEZmRFTVtJXltybU9NVW1ZTENQYFVrV2dKXVhVXkRNUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpTV1ZUW1xbYGBhYWFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSEVHRkhFRUtPU0lKRmBTSEpPSklPTVJRS01MTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlF/UUl8WVlxc1hQbUhxbm9hVlBxcXNQQmtzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVlh/anR1dV9fdl9YYVtcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTkJETExGSUtFUVZMS05JS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFpSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3J7fG99eW9/cl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOS09JUVJUWVdXUVRQUFBRS0hneGxjeHJtW0tNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f29ob1l2dmp1dXCBYHJnfGlseHxvXl9fYmFbXWJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl3cm5OS1N0TkNDRlBQSEpLSktQT09PTVBaYFpYS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hmZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUVdcWFVNVVlVZlhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfW3B6e15genNjcm94cWhkfGlyfF5UTGxgdnVraXV8e21+eGt8cF1eX2JbX2JkZGdlZWViWmNjaWtrcnNyd2dsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbWttT0hKS0hJSEhSUExOT0xLUlJST1NSV1JWVFBXW1ZWVFRUYWBQTk1LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhZUk5QVVRYWFhbWlVSU1dbV1hXWk9TVVdYWFJdWVdeVlRQWVJWV1dXWF5bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZWFBPTE1WVFBOVVNOT01MUVBLSlJRS1FNS0tPUlVSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NQUVVVVlNaUU9TUlhWVFlWVFlVVFJVVFRVV1hXXVpeYV1cWlpcXGBjW11iY2RmZGVkYVlgYWNhYmhoaW1jYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUVBLT1dTUE5VUE5RTktTUExPVVNOUk5NTlFUUFRRU1RVTktNT1FUVFJSUVZXVFlaW1lTVVJUV1dXWVtUT1RVWFVVWlVXWVVSUlhWVVdbWVpgXVVYXlxeXVxdYWFeW2JiY2dmZWRiWF9hYl5gaGVmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RW1pYV1haWlhZVlxqZFZYWVpXVlNUT0pOVlRQT1RQUFBOTVFRUFJYVFFRT01PU1ZOV1JUVVVPTk1RU1VVVFRSVFdWWl1cWlZXUVJXWFZbW1dRVFZWVlZZVFhYVVJSWFZWWl1ZXV9eVl5dXmBcXGBfX19aYmJkaGdkZGJZYmBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGReW1lWVVdRTE1WU01OUk9RUk9MUFNSVVpVU1BQTFBXV1JXU1NTWE1PUFJUWFZVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaV1dcXlpeX2BVYVxhYV5gYl9dYF1jYGNnaGRmYFpjYGFfX2VkX2BjW1pcW1xZWlhZV1xZXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUk9VVFNQV1xdXFheXF9XXF5qcXd5gGJcW1ZWWFFNT1ZTTlFRUFJUUktRVFRZWldVT1JOU1hXVFNVUlJaT1BTU1ZbVlZXVFZaWF1eW1teVlNOVFVWXFxWUlRWVlhZU1RZXFVTU11YWl1eXGBgYFZiW2NiXmFjX1xiYWJfY2ZpZGZeW2RgYWBhY2RfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUVdSVFBbXV5eW2BcYFVcXWlqcn1zbGdcVVhXUE5SWlNSUVRSVFVUS1FXVltaWlNPU1JWVlZUT1dSU1pSVFRUWF1XWFhTWFxYXl1ZWl1UVU5WV1deW1hSVVVZWVlVV1lcVlRXXlldXWBdYmJeWV9bZWJfZGReXmNjYV5lZmlkZl5eZGFgYWJiZGBiXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBaVFVWVlRUVF5eYF9eYlxgVV1eYmt5dGx9bFpVWVVRUFNcVFVUVVRWWVdMUlpXXVtdUk9VU1hXVlRQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlRVVlpZWldYWlxWVVpeXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX19hYWBjXWBUXV9iZWV1gXpoWFlZU1ZTVlxYV1dWVlddWE9VXVpeXV1UUldTV1ZVU1RYUlNWVFhYWF1eWF1bVl1fWF9fWF1WUVlUWVpaYVlcVldYW1pbWVlaW1hWXV9gXmNiYmVkXGJcYGZhZGZkX2BkYmJbZmNoZWNmYWZfYGFhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lWVlxgYWJjYWNfX1ZbYGRhX3p1b2hZXFpVWFRXW1pZXFlYWWBXUFZeXGBhXFRUWFBVV1ZUVldSU1VXWlpcX15aX1xWX19ZXl5ZXlZTWVdZWl1iWl5WV1tcW1xbW1pbWVlfX2BgZGJjZGViZFpiZmNnZmVeYWJgY15iY2lkY2dfZ15iYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXlxdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZZUFdWV1dXVlRWVFhcXF5gYF1gXFdhXlteXFteWFZYWFtbX2BcX1hZXVxdXl5cW11YW2BhXmBkY2RlZWZiWWNlZWhnZF5jYWBlY11laWRlaV9mXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1pYW1xYV1leYGJhZWFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgXl1fWlpeXV5eYVxbW1pcYGJeYmRjZWZlZmJaZGZmaWdjX2NfYWZlWmlpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFhXXFlXXFtcXVpXXF1fYGJkYmJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRcXFhaYmVjYVJcWk9YWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX2BcW15eYGJjXFxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxkZ2BcaWliaGlmZWBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXV5fWlhWW19eXWFhYF5bYGFiZWJfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgW2VnXmFoaGJoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t8e3t7e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7fHx8fHx8fHx8fHt7e3t7enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJioJFPj8/Pz89dY2JiYmJhrPW0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyNgzoyMzMzMzBzkIyMjIyIv+nl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHd4d3d3d3d3d3h5eXl6eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8dnV1dXV1dXp9fX18fHuBhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eXZ2dnp7eHt4d3Z3end5enp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t8fHx8fHx8e3t7e3t7e3p6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3h9eX16eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x6fn15e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHp8fHp8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh8eXx9enx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHl4ent5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzdHJxcHBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzdHNzcXB1d29vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3Jzc3Jxb5CDbnBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXF2jHVycm99oHtucHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXKdlXFxcZWie29wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFyb4+viW95oqJ6b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXJwiLKmdoqspHtwcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnCNs6ikprGodnFxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3NzdqGho7Smm6R8c3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh3eHiCp5+cp5+jo5J6eXp5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX59fHx8fIuhjo+YmpmblXt7eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fn1/iKeno52gmpOYgX9/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGBgYCNsqepoqChq6aEfoCAfn9/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/gIB/iqmun6mjoKGlqaSMfnx+gH9+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn+BiJWqr6ScpKGgoaGhqaugjYGAgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoODhoybpqOdnJqfk5ihoJ6dnqGglIWBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGChIyUlpeXmZiHkJ2bm5yYkYuHg4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KAgoOEjJaZlYmSmZySi4eFhoeHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+QkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgoGBhI+XlJaZkIWHh4iIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEhIKDg4SRloiEhYODhYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgoKCgYeRgoODgYKAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgICAiJKAgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4qWiISChIKCf4CMloKCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpiKg4WEhISCgJKahoKCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpOPjIyKhYSDg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2LnI2AgoGBg4KFlJOMgYKBgoODgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GXjICDgYGBgI+Ti5CBgoGCgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeKfYSEg4SCg4OCjomFjIKCg4KCgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJOSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn9+fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjYqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYKBgX59gYeGg4B+fn9+f35/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoWFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWEhYaGhoWFhYWGh4eGhoWGhYWGh4eHiIeHh4aGhoeGh4aGh4eHhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGh4WEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaDgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoeIioqJiYmIiYmJiYqLioiIiImJiouKioiIh4iIiIeIiIiHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhoaFg4mUk5CPkI6KhoSGhYOBgYKBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgIGEhIKCgoKCgoKAf359fX19fn18e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIhoaHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX58fX2Dh4mKioeHhYaHh4eHiIeHiYeIhoiHhomJg4OEg4WEhIWFh4iIhoWDgoKDhYeGh4aGhIKCg4SCg4SEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoaHhIOBg4OEhYWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKBgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42QjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSEhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Bg4ODg4OCgn99fX+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICCg4KAgICAgIGBgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KDg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn9/gH59gH9+gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf39/f35+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4B/f39+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl4fYGAgIGBgX9/gH9/gX+BgICBgYKCgH6Afn9+fn9+gYCCgX9/f3+AgH9/gH+BgH5/f4B+f39+f4B/fX5+fXt8hpOSjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fX17enl5eXl5gIKCgoSDgIKCgYCCgIKBgYOCgoOBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk4+JiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fnx7eXl5eXh8goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42EhISEhJeXg4OEgX1+gYKCgYKBgoGEhoiMhYOCgoGEgoODgoOFhISFg4KDg4KDg4KCgoKDgoKCkpCLiIiHiYeGhoSGhYWEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fX18f4GBfYaPgX59gn5/foCCfHyAf4KAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIuOjoyIiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt7enyCgIF+f4F8fn5/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2NjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDg3+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf319foCAgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY6Pjo2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn9+i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+gH5/foSSjY6Mj42LioaEhoSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX58e3x8fHp7en1/gICEg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgH18fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoGCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fH19fHx8e35+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqIiomFiJKPjImKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8fHx8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX19fX18fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkZCOioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn59fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp6eHl7fn+Dg4SHiYqHiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIj46Li4eFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+f399fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImOi4yIhIWFhIODgYKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGCgoGBgoKCgoGBgYODg4KFhoSDgYCAgIOBf4CBhIF+foB/fn6Afn1+foCBf4F/f4B/fn+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fHx7e3t8e3x8fH18iouJiIaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KCg4OEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH2Jh4eFhYeFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15d3R0gICCgoKCgoOFg4SDgoOEhISEhISBgYCAfoCCgH5/foF/fn5/gH1+gH19fX6Af3+BgIGBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeDhISFhISEhIOBgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEg4GAf4B/gIF+fX5+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn5+fX9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f31/gH1/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYSChISFhISEgYOCgYOBf4CBfn+AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57fHx8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICAgH+BgoGAf35/gX5/gIKCgIGDgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX18f4CAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHuAfoCAf4GAgH99gX9+fn9/fX19foCBgoF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4ODg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYCAgICAfIB/gH5/gYB/f36Bf35/f359fXx/gICAgH5/fn5/fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIGAgIGAfn9+f399fH59gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgIKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57e317enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH9/gIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgYCAgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH18fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoKCgoOAgIKBhIODhIGBg4GCg4KBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYGBgH+AgH+Ah35+fHp9fHt9f3h3dnl5enx8fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGDgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgH+Ag4J/fn+CgYCAf36BgIF/gICBgYGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf4CEfX19e399en1/e3p2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGEgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9+gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4OChIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKEgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe32Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4WDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSEgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXqEf39/f4SEgoODgoGDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4CCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+hoSDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6DdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYGAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiISGhIWFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeGg4SEg4KBfX9+e3x7fnt8fH1/fn18f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX9+fHx+fYB+fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaGhYSEhYWDhIeFg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhYOBgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX99fHx8fn18fX18fnt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeHiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIeIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGEhYKDfoGCgX+DgX9+fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEh4aGh4WFhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gHx/fH19fn17fX18fXl6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWFgoWFhoWGhoeEhoaGhoWGgoODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgYOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fIB+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaGhoWDhIOGgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhIODgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIWFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NPT09PT09PU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX2NnY2NjY2NjY2NnZ2dnY19fX19fX2NfX19fX19bU09PT09PT1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QTw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4t6mnp6enp6enp6enp6emrrm4uLi4uLi4uLi4uLe909PT09PT09PT09PT09Pb4uLi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6Ojo6CGhISEhISEhISEhISEgpKlo6Ojo6Ojo6Ojo6Oiq9PS0tLS0tLS0tLS0tPR3+rq6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/OzxCQDg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWiiYeHh4eHh4eHh4eHh4WVpqSkpKSkpKSkpKSko6zS0tLS0tLS0tLS0tPT0d/q6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw8Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqampp5COjo6Ojo2NjY2NjY2Mmqqpqampqampqampqaiw0tLS0tLS0tLS0tLT0tLg6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLQ0NDQ0M/Pz8/Pz8/PztDR0tLS0tLS0tLS0tLS0tTU1NXV1dXW1tbW1tbX2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7R1M/Pz9PTz8/P09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1tbW1tbW1tbW1tbX19bV1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Tu53P0NChlsvSx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StZWbs9anoKufz5msmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/P0Z+gqq/KnJaQobSVhp2czc/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OTY/Qj9COjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9HFh5qzv5ugqJm1v8mXmcXQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P1qeZssyjoIufxNORmaHP0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PT05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9WlmbHZmMfJlNito7+e1dHQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDWpZmzyJyVlaS7zYiVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDQ1aWat7Gar7OdpdDbo5m11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GP0hIR0VAPDw+Pjw9PTw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT0NWlmbexnpuinJyRp5ieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEM7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhx9LWo5qyyZ2ooaOeqKKpndDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPR1bWCw9evjZGl1JqSjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PD9HRUdLSD01NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHRwtTS1cC91tTTucjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Njc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tTS0tLU1dPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjY5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSUQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09LS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLQDs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT5IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUE/Sk8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QUNDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QkdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2trb29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU2NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NTQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTQ2NDk4NTY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA0NzM3ODY3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a3tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3trW1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDQ3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrKytrKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKinqKilpqioqKeop6ipqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6OTo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qopaanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenp6jpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT02Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6enn5uanKKgmpaVlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqampqempqCbmZuhoJeSnaCXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanp6ainp2foaCXmKiilJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWlpqempaWmpqalo6CgoaGfmqB0j5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKkpaWspqSlpKOioaGdm6aCYZSZm5mbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKktrWlo6SioaGem5yjXWaamZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgpqWTsaKhoJ6cm5qnhVVunJmanJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGhoKCteoytn56dmpqcpmddcZyanZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgoKCfqY1pnKednJqan5dqZ3Kdm56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnp+enaSWdH2pnJqbnKKLa2lwm52dnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cm5qglnt3kZ2anJ6cfWppcpuenJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZmaoKB6ioWQmZ2ekoBrZnOan5ycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmZmZmpugl6B9cpmlm3iOhmlym5+dnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmZmZmcq5+KcWCnqZ1heol5dJ6enp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmYn62NcGBpopCTVF95e4WgnqCgn56dn6Ggnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZl6endEVGbpeAe1A+W3aEnZubnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuam5apmkxERnCVgnFSRzhgeI6SjZKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZCVrHVdeF+Dtq+lYnZ+S2p+iIKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoN/kqhgjrOMzsOswKWAlXpSeoKBkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+foqXctDWydetn7qzY2RwWm6Bho2Ni4aNlJKLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioR/gn2Rf5DNtcLOyL+slHyqrF9oiYyOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGMf4iNjYyLiJKLmHWYoo20qp2eh4JwaM2AYIuLipCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkZ6hnZOXm6GanpyjoZ2KkHqGo4yEiXd0bXaji2aGj4yYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqayqqq+nmX5bZoZ4eH9tamh1dn13hKOhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqWqqKeqrIdxVlt0cXJ5aWViaWlwfIujqaegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKimmZ6lpaKisJ5xa1JSdnd0e2hhZWZeX298i6CkoKCfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqCjp6GmrqiwsqyAaGZLTnB1d4BpYGJpWl1ia3WDkZ2hoJ2go5qWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChp6mttry+vayNbmhjRlVub3x8bmBeZlpaYWJncHh/jpqgoaKYlp6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NtamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7zGy83Gt6aPc2hqXEJOcG50bnNnYmFZWF9jYWJqcXV6jqGonJ2hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKu0wNTd28u5q5uHcGBgYlVGRXVuYF9tbVxbV1pZXVtbXmJkZWh4kqevpqWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaXZrcGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS0t8XS2dbJrpF4Zl1aW1xUTEFraoyYj1lUWFdcXF1dWFVYYHKJobLFw7SyoKeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDw7m9vsHHzdDEoH5pXVlYV1NJVGyns6hOVV5hYl9fX2Z6lq+/vr7AwrK1tqivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xcHFxsC8uczJuZdzXFVYVFFSnLOfTllcXl1gbY6qu8GytqemsbWrtbKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx+hH9qZmhha2xnbnVycnVxZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhCQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8PDxsbBsZO/vMvQv5hqWFdZTJK3lk1VWVhgf6a8sKarrrOnqqmpq62sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2xuZG9taXF4b3pqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTEubXAuLO8wcW/qXdXVVGKvY9NU1Zbg6Cmt6+lrbS0ra+lpKOopKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7d25raWh1WmZyeHN5ZmZeZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxb64vcHDv8e7jWNRYX9lUFNgjaqfprSyray4tbOrqaOhramsp62frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF1qb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHv8THxMTGys7CjVJJUFFmp7q3wL2+uby6vLq8rK2mqbu6ube/srW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhpaXRteWxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcXFxcPFxMnM09OWTU1cqsfAyM3GxMHEx8G8vrSxsLDCvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BrandsaWV1bnRjXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwcLGxsfKzX9Jj83Nx8zQxba/v8DAuru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2NqZGJqbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr69wcHAwMemTaTRzMXJ0cGvvb24ubu7vre0sbm+s7y+sbm1uLu2vLS1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2NjamJnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwbu/wLy7xL26wMS/vb24u8DEsFOezcTAwcm/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe3uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2llaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjry+u8O1use3tri7vbm5tbrDyKtUl8i/v7vBvrnGvcK/vMW4tre0uLa2u7u5trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZnBqZWtoWFlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zQxXmty73Ht7m4rba0t7q0t7O7xcqgVY7Jv7++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h31rbnFncGtzZmJuYFxUSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE2K92hL7Iz8LAuK61tbu+t7qyvsLIlluIzcLCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxqbnRud2NnYlxjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydGbdHex0dHMysS1ur/EyL6+tb/AwIdofc3Gwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOCdG9sbHRsbG5fY15hYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrCiHZ3qMzMy83KxsLDy87BvLm9u7GBem3Ax8TAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFjW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7uq3bw762vsC+vrqmnKqzt8TApnx6fJ/ExsvIwcPAwMnKwcC8urKlloh5s8jFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4dGhwXVxfXFpRRUVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xbZur869trnAvKp9bmhubXSCl5l1e3+cvr/GwLnAvL7FxL29uLGupquWlKLKw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d2x1e3BuaVxfX1lTUEFGSUdLQEVDSDw9Njs5OTw7Ojo7Oz0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2xdoK0vba1waSGaVpeYE5TW1xwdnqFpLi3wrqzu7e7vb+6u7uupa2yoaWHwcXDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dnducWFfZl1bVUo9Pz9HRj1HQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJpoR4i6KwtZxqZmdWWV9JSU1QVG97i6mwt765srWyvLm8trm+tZmxvq6zeLDJxMC9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqiHe3aMoZhfU0NZVUhialVPRUplkaWvr7a6tbSyrLy5uLW4wb2PrMS0tHenysK/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92cm5jXWZZXV1TT05BPkpCQEtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+zkIF5iJBuTktAZVlCT3iBk2hNQ16FsbWztbK0r6y7uri2ub/GfpO6q6Joq7+4tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2r6qwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlsXVtqVF1bUE5IREdNQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIV8WEZBT4dYSUpZeI6DY0FVo7mztLKwsa2wubi2u7e6vZSntK+nd62wqautq6OooZ2dnpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodXRuZVVhY1ddUU9NSEBJUkRNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmJmVaE1AU3lxT0lJTGmdgFpFVbC6sayzr66srba2srS1rqmmn5qbnZ+mqJ6gqKmfoaeWm5eXjp2Uj5CWjZebpKigoKKioqWlnaOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpuZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqGIeIN8dn96Y3dsbl1RaVRQTkdQTUxDUFFAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9waqlvGdEU5x+UFhJS2FKV45iZWWDr7WqsrSuqquvsLKzraWdkZeTj5egn6KgnKOkn56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJuZm6SZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnx/dXZ9bmt7ZGhWUmRNSkhHT1NOS05IPEVAPDI/ODU5Oz47OTg7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgq8a/yp9PQXWZcFBtSkxkZnZ0YV1idJKyr66ztaqmrKuim5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6WqqqCbmJiYlZOWmpOVlZqWm5eXmaGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd5fGV5eWBiU1VgSElKS1NUSVNRTTk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKXHxotXU0pmpFlmfW9yW1JrZFxnYmBtkbWwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblJablpmdpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNogmxlW1NbWU1RSk9PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVqcnd1cGN3dlhXYmBkaVtaV2itrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO2uLO4rbK0pKCdpaCsoaGioaCamJaVn5ubmKWhoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgoB8eHZqd3VebVtSYEhSVUhGVVdKQ01HPUtIOEY8Nzc7Pj08Ojs5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgpH9vgnBgY1dLW1JaTExRWVJIT05ImayqqaSfn5mSkpSYmJaWlYyIi46VnZydnZ6Xnpmmn6CopbGqp66jq662sLSysa62uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5uLyvs7C1wry3vrOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXdtaG1cWFtDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjnpyJYldeZWBXTVFHPT9AQ0Q/PkJSeKmtqaqln56foqOdnp2anJuUk5WUnp2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2u7vAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Oqs62qs7Svs66qr6OdrKi2sa2jsKago7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBe3Rya2t1cnFoVlxRRlVIREpQST9FQTRGSDk1PD43Ozw+PTw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBQRkQ7Qz5GPD45Nk5+qrKno6OioJ6lq6aemJyUkZmdmZWMioaIhnhtiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8PKycPBx7+6tLq7tbu3sLayqrqyrru4v7u6q7itq6q4u7W8rq65o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Npb3hrZVlbRktMRURUTERDRTc6Pzo1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXJpYVdORT5JWXxvYUE9XI6urKCZm5uenpmXl5eSjY+Xl5OOjZCMgoOCd3JxbXCPpq2utLnFu83Hy7/CzM3NzMfJ0czMzMfJxcbM0NLVztPJvcC/w7vGxcjF0dPN1NDT08zKwsXGxsrIz8DJ0czHxsjGwrzDwb6/v7a+s62/wMPDx8XHxK+/ubK4vMTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl0c2ViZ3JvZl5aWkNOTERGUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWlmXFRJREA/S4aepJiDoLKto56cn5qYl5SSlJaRkI+Mh4SDiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0tfS1dbT1MjMx8zNytPNztPNxcnKysLHzMfJyca/w7OzyMXLy8vPx8q/vr+9wcbFzczJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHtydXZnY2d2amRWV1FETkZASlFCPkI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZthU0xKREM/Q1Ow0r2yr6acnJygpKGdmpSTlZSJfXhxa2ViaHJvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbO1NbX1NPR09TU08/RxNDT1tjV1tLLyc7Ry8bN0crS1dbZ1tfT19jO0srP0czP0MzT0MDIyMrEzMzMzs/Fx8i2v8rA0s3M0MfKycDEw8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2BlcmJdUlxJSkdBRUlKPjtBOD01NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWUlAQURBRlF2sq+mmpSXn5yaoKCem5yalYl3aWNhX19gX15fX11hbHVzcHBvbHJxdZLEyMfU1tfX19PW0NXU2tTUzs/V1NTR0czRztPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1NXMz8/KzdLLztHAxsPIxs/O0dHSyMzNwMvMxtPPzM/IxcvHx8nMytTU0dXP0szTwrnFsaWota6nm6irpZ2yqLCzrayTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9jU1dnZ0c7Qv7zMyba+rqaqqKGjq2VDOD0+RFiCqqifl5WXmZqcn52YnJySfXFlY2JfX2FfXmFgX2BgX2BlbXBwbmtvcnd3nMzB09XT2NjW2dHS0tfP087L0s3V1NHKz83T1tLR1s3P1dXRxdHUy9DU1dbO09HY19fYy8jOxMnPzMrMwMrAycrOztDL0M7OzM/PyMzQ0MvOy8PKx8nNy8zS083T0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9xb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF6SEZCO1eOoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NztTMztLNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzcLIysPMxMbJy8vPy87N0M7TzMbJz83Ix8vFx8HGyszN0NLH0M/OzszQxcfBuLm9w8O9w7iysr6xu8PDtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21nYGBxaFlYaFZNR0xJUFFCO0M+OzY4Ojg6OjU3PT1AOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHw7jK1dbZ2tvYzMzPyNbVxMK1r7Son62XeGxwcXmQm42Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYWBgX2BhYWBfXVtdZ3JycHJzcW1yeaXH08/L0NDT1MrFycnGxr/Dxc/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0M/GusS/xsq9wsfJzsXDx8DHzcjEzMvMz8jExNDIxsLGyMS/wcfMy8zPwsvMycfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raO2fmiDhaSrlI6Nlo+Fg4ODgX2EhH5zX1teXl5gXmBjZGNfXV1eX2BgX1taXGBscnFvb2tsb299udHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMrNycTCy8nBwcvQxcvIv7nCu8bHvsDGz8vEwMO7ycfJu8nHxcrAvsLLxsXEvsa9vMHDxczFxrzAycPFx9LFwcm/ysnGyMbRw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXx3c3RmaVphbm1aW1hSRExGQkdFTERGU0A1NDMzNT88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9Xa2NnPy9LNzc7IwbXDvrGvtmxfenyhkYuSloZ6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpa3Bvc4/HvcrFy8DGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7rGw7+8wc7Dxr6+tcG9w7u9xrvDurS8xsTCwre/tra+v7vMw722usi7v77Lw8HGwsXJx8nG0MbCzMiyx8nDzszAxcO/vbK3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jVl5ZSkZKRkhLQUVCRkpAOTo2NTg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrJxs3NztHI0MXV1NXXzcrOxcnFx8G5xb2rrqZgZHaDk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF5oc3FtZ2ducHJ5nb3MwMO6wbitsLGnqq2sp7i0trSzs7S7tr2xt7C1r7K7wrzBxLy/u7Wyur7AuMi5tLu3wcK9uL3HwcS8ta+ytrq/tMW3u7WruL2+wL2xurawt7qzxry3r7u/tbe1xby+w8XAxMXGx8vFwMbGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXVZeYEZLSEhKRkJEQUVFPzw6NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IycjKyMrE0M3Sz83Fx8HGwL+6t8m2qrCZW2hwio+FiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmlma25ucnykx8C4uLWwq6ynnqKpp56qrLOtqqyqtK22sbOprqess7u6tsO5urqxq7W5u7TCurDAsb68u7a8yLnDtq2qqLCywLa4vbCxp7GztLu8q661pq62rruysaq5sK67rru4u8DAvrrDv8bDxcC8xsHHy7jFx8W/x8PDusTGwrvGyczLs7nCvbuziXN3dmtpYGJsaFhYV1tBTEtNSkVBQz9GQTo5Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHE0MfNwcPGv8TEw8PKwsnKv8C8wrqztbXDrqqwkltqf5KHjo97eH2JhXp7hIF3bl5dXFxdX2BfX2RjYmNkYmBfXVpbWlpdWlpZWlxlbm9oZmhpa25yga26sLWupaWnp5qgpKCanKWrrqSooquqrKuwo6afqq20trG9ua+3sKiuuLSzvLi0va+4ubayvMGywK6lqKOrsbKzqL2qq6irrK21s6WorqGkr6mypqiorqWot6yxs7e6uruyvL6+vsS/tcLBx8i3vsDEt8TDv7u/xMK+xMjMyr+/w8DAqYdzdHNqaVxhb2NXVlhQSFlSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvBy767yba9w766yrfBw8G0try2sa+1u62oq5JkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXl1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqqWspZ6coaSUnaSal5Gho6mjo5+lpqemraCdnKSmrLKwtrensa2oqrSrtLqxtrautrmzsLq6sbeloKSfprGoq6i5qqSmp6insq2gp6afm6SmrJ+fp6OgobGtrayytLO0sLW8trvBwLK7vsPBsbm5wrPBvsC1uLy9vrzCx8XDxL/AxKCDeHBsYmZga29gVVlfSE5nT1RHRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci0tr24usC6vbagnpSdoaa6tquzs7uzxM/Jy8PGuLfHwMy/uMm3u8W4s8S4s7/ArLW8sqylr7OtoaORaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBhXlxbXFxYWVhYWFZYW15fZGNiZWdnZ2ttb4idqZ+WlZqhlpuimJWMnqGip5ygn6Sloqeem6OboKuwrbG1pKmqqqyspLS4rbewrLO2r7O1r7Cqn56fo6KypaapuK2ipqagqK2rmaCfnpmdn6WamqOcnJ6vqauoqqutrbCyuK+4ubqwtry7uquzsrmzvbS2sbG2tb+2vsC+w8K7ur2XhHpza19lXmRkWFRXXUlXXEtPR0pKR0E8Pz9AOz88MDU1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnHuLe+t7LCtLG7u6y5urGinqmrp5iej21+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9hYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtyjaeck5SUmpeaoZaWkJuioaienJ2lp6KlnKChm5mvrq6vsqGlo66rp6K1sLKyrKmvs6e6s6a2oKKfnKOhraOiqraro6OmnqWmo5aZnZeZm52gmpednJ2craGrp6Ojpq2rsrOqtbCyq7O5tK+qr7Kys7ezrqmtrrK4sbq2ur3AuLOxlIV5dWZfZl5bWVZTWlVLW1FMSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/s52lo5ilscK1tr2ttLjBzMjGv8W2wcDHzrfAxL2zubmzv7axubutsrSvn5qkqqCUmo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanagm5OTj5OWlp6WmJOXoJ2hnJahoamkn5+pnZubq6evsKuco6S4qqGgrqi2qqenrbGkuLCkt6CjnJmZqqehmqy5r6KhpJyioKCTlKGUlpabmJiWl5yVn6meqaSinaOqqrGtqLSsqqets7Clq66zsbCwr6+nqKeyrrG0r7y0uriuo5SBenZlX2FWWVhTUlNLTV5MUExHSExLRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyZoamUkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JiY2ZpgZWSlIuRk5OamJyVlpyfnJ+WoKCnpqSmp5+doKagqq+mn6Kjt6ihoaKos6KlqKWwpbGurLWeoZ2WlamhopStsbGfo6Oenpibk4uhlJGTmJiTl5iYl56nm6eiopqkpaWrpKWwp6Wjq6ytpqiur6+rqKqqs6Wmq6+0sa68trGvr6CSendyZWFcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLe7vMHFurG5tcTJycDDxsXHtsXEs8G/xau3t722vbq7tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWltZWVlbV1VYV1RUVlVSVFJVYGBfYGFfYWFjZGmAkpKIj42TkZKclJWWpJmgl52gpaKtpqWlo6SjnaqrpZqfpbGqoKGepaueqKKfrqypqa6toqKilZeim5yQq6mwnJ+in5+XmJOKnpGNkpOWkJiYk5yho52koaKVoKKlppujq6WipKukq66lrrKppqWmprSmqaits7W0ubqwqqyejHJwb2BbV1ZVUkZQTkhaXFBSSVRLU0xFR0pEODs7PTw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk1Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG9w8mtsbjBtbzAvLS1qqymlZmbm4iBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUVldXF1dXl9fX2JkbY2Pg5CFjpCNmZOUkpyaopyboampq6isp6mmpJmlr6WVmqWvqaCcmZuhnq+anKu0oKWmn6OkoZSTm5aWkqmqrZqdoKGhm5SQjJmOjJGMko2WlZCdoqCknZyjlZugo6GXoqijo6iroKuvpK23pqOkoqytqqirr7O3sr21s6uvmIV0c2hbWFlTVVJFWExRW1hNVE5QTFFSSU5KQz0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3r6inr66bqaist7arvMq7tr+sy8bFuMHOz8izxLq3u8LIsa24v7e8vbuztaapoJaXmJaHenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYWV9i4CKfYqPiZKNlpGXmaKgm6CrqqavrKixpamaoK2hlZalqKedmJCPmp6ul5moq5mfnZSloZ+SkZKRk5Woq6WamZmenpaOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpqioqKCxsKaxvaifo6y0qq6nsLWwubXAsa6xq5F+cnNiVlRWTlJKR1ZQUlJMTFdNSk1PUkdNS0FDRkREPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3Njc2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsba3vL3Bw7GwsbettLS7s7Sio52dl5eUg4B2a2dsbnFucmtwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1han95fnSHjIaQiZeJlJSYm5ieqZugq6amrJ6omqGmnJOPn6Oal5eFhJKbpJCVo52WlpaIopubk4uOipCapaeclZWXm5GSh5SOi4GMjYCQi5KSkqCaoaKWlJiZlaKmmY2ZpKappqGgtLKnsrihnKK2rKmtpLKyprW8taussaOJeXNuXU5RUUxPRE5OTlBLRk5OSkpOTlFJTUpBSExISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrClp6SqpaCppqSzqqKyw7W1srPGxra6w8rMxrOsub20uMCvramwnqauuq+tn5manZWUh3uDbl9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFucXVvg4eBh3+Qg46KlJGTnaGPmpyjoqSZpZeinJWNiJmajHONg36Ol5aGkZqQlI6Oe5mPnYyCiX+KmKCjnpCTmJaFjoOUfn50io16kIeTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCsn5iluKamsaGwrpywvKqpr6qZg3dzY1ZNUk9QTUNTTkxQTUJQUUhJTlJNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBrK3DraiippKdprato6CPlZaSkH13fmZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdampxa36Ee3NOWHKPgpeGjZyXi5SRn5idlZSWlY+WioCUiV87Vm98jJSKgYySjJCGhnOKhZeBeYF7hpOdlIOVjpGQg4Z9k3hxcIaMfYmBkY2Ql5qYk4uQip2In5iHiJaemqGgl6euqa2oqJ6WrbOipq6ZrKuYqLSjqa2jk39zbl9bTlNSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOuoaamqqCmqaejqa+op7TCubC1sMfCt7O9z7+5r661wqeqxaqjnZiDlJyxopqYhpSPi4d9c3VdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTU9SVFZYWmBsbmd6gXNQQj9/lZKRfYiVjISKjZuOlpWKkoiGlYd5iX9gSlFueIuShH6EjYuFf39uf3+UeHV2eISNmnBRjYiKhnx+eJR2aHeGiH6KiZaLjpGSloyEioiVhJuNgoSSmpaenZSko6ippaSem7CqoaSkkaaplqKqnKKmqIl2bWZeW0hRUVNNSVVNUklMS09JSEZKTkxNVEtRUE9GSUM9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa+hp6ilp6ivrKq1vLa4trPBu7aouci4tqiotbaqsr2mnpWNf4mTqJaVin6Og4J9d3BvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboNydX1paFxUkImUiHR+hoF8hYyTgpKai497ho+AdoB4c292cXSOjoF6foqrhXl7aHZ7jnBybXiBi42SeHqAe4B2c3KSeGd1hISEhXyVioiKjYqAf4SLjYCUhHyAj5iUnJaRn52pnp+gnaCppZ6dmI2npJKgoJaen6SBc2hhXVxKV1BSR0tYUk9KTE1SSkpKTFBITFFMUlRNRUhCPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUyNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyvLi2urSxn7e6sqqdnaypqLKwoZqRjZSAjZyOkX52hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZnaMlpiNjnxneYF2eICJkH2EmJKBcYePfHd7b2t+rX10kIt/e4aSgXx/dWZ2fIZsb2dzfImMh4BseXF9cW12j3FocYF+jnBDi4WCg4V+d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnJqdnqGclo2LpZqOnZeOlpiQeG9tZmNaWFhVUUpTVVRPUE5QVktOS09PSlJPSU5QTEZEPDw3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqGmsKyuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5adpamkoJiZj4WSeYiOi4p1cXttdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcmyIp6rAfnR5Ynt4b3x5iZB6fYuGb22Mknl0eWpqgIJxlpGLgX6WgEmSmG5oeH6CbWlkbHmFkJKGa3NsfG5yfIZpbnB/c42JhIZ7fn97dm90dIaCeYF5cHyOjIqTg5aXmJqQkpaXmZedloyDiZ6Si5KNhpCWgG9qb25vWFZYVFJRWU9SVFRSWFVNTkhNSk1PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpaywo62qqLWvrqy0v6u8w7+lopqVpJiejYSLlKGhmZmRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxfp4dhmmlzeWV+b21/eouJdoKIhnRsmpJ0c3xqap2PTXmFk4mEjmcxdoZzbH59g3RmZXV/hISFgGZpbHVrcYB8aHFxfG6TjY98dH59cXBudW2Cf3d5dWp5iYKIiYOWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra29oZVhSWldZWVtNUFVWWVhOSUhFSkpIR0NAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpGZlqOorZ6xnqe6r6uysMKxu8PHmpaPlJmLjoV6hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvsqBxe3hsfWxxg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKFdnCHfId8dIyujYmAaGdiam5ybXCCdWlvWHVwjpuSd2x/en1tcm5wgHtzdm5idoN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jntzcXFtYFtdXltZWGBfUk5bWlhXTEhKRkpHP0NBQkg/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKefr5WltKmusa7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dHh4bHdud2NpXkpQRz4/NjQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fSExNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH6Fg3+MfnWimXl+hoGEmYSanGGGqp+di4OQjXp3iH6JiY5zi5ePhHpdZHF0enx3im1oamJ5b4WQgnpugXd0hHpwdHl4a25pXXaGfId8h4eOf4qSl4ONhYyGfXGEf4R9dXd7fIl3cHN0ZmdgW1teU1tnXldQVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkZydn6aRoKqgsaivwLK7xbqWjpGUh3uGdmt/jJGCfYqEj4x4g4BzoISKfXyBf3CAfnpndmtSV0xARTIxMTM2NjY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpohIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKpIhq6vr4uBgJOLgouChJKph4CYmIqbdG18gYaHfY5oZ2h5f26Fh4KFcYSGR2yAd3J5dmhta192fYKIf4eEi3mUnZyJi4iRf3p1i3Z8eG1vd36AdHRybFteXltjY1hnZVtUT1BWWVBETEtGTklDRkNDQEBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeRjpaXkpegnq2hprivs72zl42Si5iLfXRwfomSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFhwWVxeaY2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbm6atk5q7sae7x8Ooi4yhpY+UioGRfHGDnp+RnH92hoWLkIeQaWhwhIF0jYeEinGGgneHf3t2hX1udnVmf5SOhomIh4iHoKuilomOl396goh5eW9na3h+e350bGVeW1teal1hZmBaT0tOV1JRSVBKRE5HQ0pEQkFEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3g3uAjH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koWSlX+KgJKbjoOAgYyKgomNg3+KgG1wal1CQDQtLS8vLi4wMjIzNDc3OTs9P0JESElOUVJTUlNTVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSUlLS0tOVl9jf2dnbXWdm4+akpOLjY6aiJOPnYugoJKjqqWjrJOptqKowcKux694upSafI2hnpmEk4WCjqKfk5iShIqFj5mRlmxwdYqMgpaMjY53j4RxbYWBipaRg4WIcYiglYaSiY6PlqS1qZuNlKKDh5ODfX9ramp8gYGCdGJeZGBbZ2tdbGteV0tHTlJRTUxMRklQQ0RNRkFDRUZCPTk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImFkIeFiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTlBSVFBQUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6WimaGXopScnqieqKufqKypqraXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiJWim5t4en6UmJKhk5eXgZSee3eVkquyiI2Xn3yUnpuOkpWYo6KmtrCdkZmoh5aPjYGIbHNzfYB9cmlgXWJgYmhkYGdmW1JFSktQT0lJTEZGTUNITEZHREJHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQk1RUlNRUlNUUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2FkHeViqOnqrS9uKStrKynqLSrsLaysq27sbO9nLPDq7rJy7fDv7ilorCzrK2qo4uWmIWmpqCjl4GmmY2iq6iliIWUpKGgq6GkqY+bsIuVo6a3upugo7CSop2inpCjoauvrLK1opSkqoiZiZKJlXp6fYV/aGFoXGVjXmRkXmZnX1pPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoY1dpb1h6hXaBk4WHgpuDkpCMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOFgYyFhoeShoKEiYaIh4dwbmFARTY0PDIvMTEwLSwrLTEuLTQ/Q0FNVVFSU1VVVlVOW1BHR0Q8Pj5GSENFQTc7PDVDOz1GS0lHSFJPUFeBkqCErqOzqrLAx8Oqs8W2rLO/s7i+tr+0wba7uqO4xai2yce1vrm1qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6orra7srqsr7Wisauxtbu3tK60oKeoo6eaqa+tsrm3uKebtqiMpI6Rkp+GeIKDdlpiZVdmYmJkYGBmYFtUSURETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRYmNXeXVxgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhYGOf4GJjoaAhoiFioeRenhuXVZARU48Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtKQUA/R0tGRkQ7PkA3RDc/QkpKRUZXVFBej6Sto7G0w7a4wczJtrvEvbOzwLa4wbW+r7d0sbOlusSksMa5sbOxtKiktbaqsaCilpuikqWwrqatrKekmKCstLuiqLK6tby/zL/Fxb29s8K3uri+t7q3uayssKaxqq29sLy7wsKsmbqok62Pl5eqiX2CfWtXZGJZa2VqZldcY1lWU0lHRkxRR0NISUFIRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXU1lVWnZqcH6OhICNg256c3iHYrmhmaOJlJSWkpSTjZCWkoeGe4aBjZWKgISBinp8ioeGfYqDgYqDlX13enVlT1xkR0VMO1FjYVteU0Y/O0hQRVpjUVJZWFpnWVRgYE1TUEVBP0lLSEVFQUBDPEU2Qj5IR0pMU1pUXZOuuLW6uMi/ur3JzLu8wLu3tbu6tr20urHGYHWypLGanqu9qqWoq6ukorK1oKunn5WWn5ifrqWnpqWfo5Sjp7G0p7KzvbbBvtPJydPHwsXMwsrDwL69v7u8t7SvuLe2w7nFvcLIsJ65qaGrjqSntoiBgXNgY2JeWGJgaWdSWGBWUVVJRUVOS0A+R0Q9SkE9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5MzczNDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnNzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWi36DgIN4e4uDh3yLeYGKgpd+dH16a2VwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RVWVVKREJLS0hGSEhIR0FJOUQ/SEtUVFZcWluTucC4vbfGwLu5ysq6trm1uLmyt7W0rra2mWR1qJytcF6irJyYoKKbpJ6rpZSfn5CUjpaYl6efpZ+empmDpJ2spaqwrbiwvbnU0c7W0MnM0szPzsrGv7/Cyr3BvMHAxMTFyr7IzrOku7C0r5qruLuZgHttX2FdWV5hWmNjUFtgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NEQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5eSkJRubG91dYezrKGgn4uZnJmMjZWRm5KFiop+iIeLkIuIfIGEc3uKg4V7iXSBiYeVf3N7eWttdXtocmVpbGlmamloYGZpaWxabXOWraS8iIdnW29oXVpaVEhLTk9KS1BLU1FITEFKR0pPX15iZmlhl7fHsLiyu721scTGtbC4sK+7q7Kxp6u3q421p52ap5pOmp2Mjp+WkaaYpZWKk5OJkImQkZGdm6GXmpWWh56ap5usr6iwp7S01NTU1tLLz9TVzdPPzcXCydC/ysnKydHHzM3C0NK4r8O8xLmltrrDooNwZV5eXllgV1lmWlFdV09QQkJIRUJIO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlVnOQkJiCaHFveXmDoKqepZaMmpuXi42VkZqOfYmLhY2KioqQh3yEgnB/iIGGe4dyg5GLj31xeHVrcXh+cXtueHNsaIFwbWNqbXB4aXd8fsu/wd+nbmN4bmNbYWBKUFJVTlleUF1cTlBOVFFVVFxubXaCcZatuKy0pq+2qqy8wLCrtKakuKarrqCrtKOOsa2al5iMkZORhI6bgY2mkZyJg4uEiomEi4OUlZeXk5yRnJiZmZ+eq6ykp6Ksrc/S1dHNy9LT1NDU0c7Iw9TRx83S09PXzNHRxdLWxcDOx8fCqL63z556cGZfY11XYFNdWlBRVFBPSD5ARkFCRTxAQj5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlt1hoWKd2x3cH1+f6GenqGLjJiTk4yLk4+WhHmFkJCNi4qHkYd/gntyfoCBh3qEdYWTkIh/b3Zya3N8fHd7c4F3cWqAc3JpcHF6eXJ6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1hkalNYXV1gZF5jeHp+i4GYqaOkoZ+gqKWqsLiqpbOjoa2ho62hp7Gfiaaak5KRiZGPiIGUiWqUooyZhICFfpGDg5OWrYuVjZWajoaSkZ6Xp7ChoKGlpKjIzs/IwsvR1NHU087TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDw8yMdHBkYWBYVFlUXFBLR0pKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuViY+KiI6Hj394g5SYio2IiIuJfoJ4c3t9g4d3f3qHkZaAg253cG11f3Z4fXSFfHlsh3Z0bn12hHV4fJ21jDtBisWlfox8aWVXSUNmY2VjZ2pkbnhbXmZoa25pboCDiJGLnJ2gnZCXmJ6jo6axo6Ozn6GlnaCpoKOxnIaekpKSkIqOi4aDj4R+nJuMjYKEhXqUfoKplaOMkYqXkot9l4qakquzmJqcqJynvcPGubbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydna0da+y8y0eXdwZl5bU1ZSW1ZGR0pJRUU9Ojc6QEBCOkdEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoWJgod8eIWWloiPg4eFhnqEeXF6e4SGdXqFjo2deYtwfG9ven9xe4Fxg4eAbo56dXd9fIJ1fnuGh69zWKnCto2RgnBuYj1eaHJwcXBueHaBZWhvcnV4cXqMh46TkZuVn5WHjJOboJueqp+grJyhmpifpp6fq5mLmoyQkY2EfYiHg4WLjqCZk4iDh35tmXmEmIaIk4yNlIyGfJuIlI+uqpSVmJ+Zp661vamtvsfLycnMy9DJw9LK1NfY19jX1dvX09nb1dDb2tHWyNTLlXt9amlcW1BTVF5IQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTQyMzIzNjQ2NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo6RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKBhH+DfHyEmI6Hi36GhoB3gnlve3uHgnR6kp6NoHaOdYJ0dYF9dICEb4GPgW+ShXR8gIR6doZ7iLfFpMHJuIKWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSVj5eQg4mOlpmXlqWcl5+WnpKSl6OdmauVkJCJjZGCjIWIiIGGkJGem5mJhYyBhpd6iIifl4+IjYqLgn2hiZCLvKGYk5eanKmmpa6fqLa/wMC5x8nNzsXNydHW1dXZ1dfb1NfZ2tvX29ra2M7cxod9e2lrZ2FUWFVVTUxETkM7PT08ODo8Pjk9QDY9P0A8Pz48OTg2N0RBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NTU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKfH6Afn98hHt+gpGJhIV6hId6dX10bXx9hn5zfpKdkZ6DkXyGfniOfXiKim6CmoB0mYZ9gYiEe32Qeo+ojo/Dob2MnKOdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWJipCSlY+dmpOUkJaMi5WfnJSglJGNjY+KfpCOjouEiZKWmp6fiYyUkp2Rgot/pZmIhI2DhoSApYeLi7iYnZGUlqKnoZ2enaOvt7q1rMDFytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27h6e3pta2dYYFxTUE9JQ0xCPTw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1EUlNSWF9WWGZtbW1pgY+KcXN5int6f3x/e4d7fHuLh4F+dYOFeXJ6c22AfoR+d4WboZqelJKAjIh/mIeAm5Juh6iFeqCLfJGNgoiEm32akIqMo6KgkKSuoIuRi4WMgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5SMhoiMkpOMlJSUj4uPiYeWm52PlZaQi5KThYCLiJKNioqdlpmio4aTnZagiomIjZyQg4iPgIOIhaSGjJCzmJ2SlJehoZ6ZkpydqLK5rKa9wsfOx8bPzNDMztfQ0dSu1tXY2tja2tfW2dmfcX92aWhfXlhUV1hDQEhDPj4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnltYn6Sg29teIt4eX96gXyGfHt3hoR/c3CFgnp1dnZ0hIOFfX6SpqOfpaKWip2QlJeLiqiXcoqxjYSnkoSZk4SZjKKVn5iTiZqeo5Kpr5+QlZCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzceVjoaHiZCSjY2TlImFiomFlpmbj5CUk4aUl4R/j4uZiI2QqpeXo6OImZ+WmoiOh5eXioSOjYF/iJCliY2TqZqXk5aZoZmfmZOdm6OztKajvMG+yMXFycjJwsrTzc3UqdLR1tbW2NrU09rOg3OBaWVgX19PSlVbQkFGQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnWCjn18bX6IeHp+eoGBgn52doCCe2xui395fHh4fISHi36Lo7Ooo6uyoZanoKWklpWuooOQt5WSs5mNoaCLpJuvoqSdmJCnlqmZra+kl5WVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinJiFiImOlY2Lk4+HgYaHiJOYlIyLk5OGlJiGg5GQnHSRmbKWl6ShiJyZk4+KkIuXmomKlo6GfYyZn4qQkJyamZOYmJ+UoJ2Vn5uhsq6jpbe+tMXHxL3Dw7/GzsrJ0qfOzdPS0NbY0s/Yu3N7d15iV2JYUEhKT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/Pzc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTltcWUpnYTtIhIt6e22Fhnl8hHiAhYF9cHh9fXxvc416fYF7eIaLiYWEkqi7raiyva+lrrOzqKOisKyKmrWeorillaykl6mtt6ako5+ZqZiqpK+wqZqZnJSVkZigl5m7u63JoGm2uKuwlZifoquSl72jXqqygomKjZWHkXyPjn2Dho2PlJSIh5KWi4+VjYuNl5mSnZqzlpWrnoublJKNkJKMmJuKkp6QjImVn6KNlY6Ymp2Tm5ielKGglJycpa+ooqWzuKvCyMS1u727xcjIwtGhxsnNzcTW1tDL06JxfGpeXFVgUlBGRD49Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1M0IzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PTQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlSGJgY3BKQIuKfoByhod8gYl1goqCfm19fXx/cHeHd42Bh3uNj4yGjJqrwsCwvsa7srTBvLStq7O2jKiyrq69qpu7pKituberpqaioaOjqa+ysaqdnKSYm5iXnqKlpZKjua6owLusrbK5paSnfYiGnK29sIOLjIuQg4+DkY96gYeQjY6ciIiPl42LlZeUkJqWnKeasZqRq52OmY+SjpWQkJaXj5GgkYiVm6SslJaPlJyelKCem5igoZSanqinpKGjsLKmwcbDsLC7tsXEw77Np8fDx8O81dDNxMqJdXRkXlxhXE9LQkxARUY+QT9COzo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZ0dgaWdaXVuTjIyIe4eLhoOMdYaQioFufnyCf3F+gXqVepKUlJiRk5WntMbJwMLMwcO5yLy6r6u5u5eytrqzwK6lwKSqsLu7qq6roqKep6uutbCqm6CqnKKclZ6wtKeLorq6tcG7q6icsqSkqJSEjqnDxKSCi46HiISGlZSNeoOMkY+RoYyMlJGPiZigl5KZlJemoK6djKqcjpWPkpGVlY6QlZGPoZSGl5+gs56Um5SgoZmkn5qgnKCUmJ6mpKanpK+tpb/Ewq6pt7XJw762zrLFvsO8s9HKyMG1dnpuXlpdbFROSUNMSkpJQEE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2WiYuIko+GiXmGk5CBcoB8jX53h4GCkHqNoZaompqYur7IyMrC0snKws28wbOtu76nur++vMO3rMGprLO7vaqwqaSlo6uutK62taCfrp+mopijtL2pm6i8wKO2tq+rkq+sqquWhpqppqWRgoyTpZWJgHWKknmFjZGQnp+TjpSLj42Uo5mXm5SUo56pn5GlmoyPj4+Vloh9j5WSkqOalaCinLWmkZ+XpaSjpZ6eppielZebpaOpqKKyrKi7wMSvpbO3zMC5rsOzu77BuK3CwsHAmXB7Y1pYXVxNTE1JR0RDSEJCQUNLOjRESDo7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmtJX1hhWmRlVp6PnY6Xjp6SiYp/iZ+ShHiFf5V+f5CIipCAlaCZrqejmMK9yMTIxtPNzs3LvMK3sLq8tLzKvMPBtra7rbO/ubytr6igqae2ra6psreanq2iqKGdq7e4qaWvvsSxvbmzp6mzs62ulpWlrKegkY6SscWnlY18kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjI+PnohakJeXkpalmmaYo5+zpZajlqytq6ebn6eYmZaZlaGkqKaetqupurzDtaW0tsvBuKq2rLO6uK6ouLq9uINucFxaVldPR0tTTUs/QUhFREdGRzg1Rk07Pjc+QUouMzIwMjVCNTVQV047TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJyRmlJUmViTEamlJyWoZeployQg4elkoiBh4KchIOVkJGUjpqin6++rqHHvcXEx8fOzs7Syr67trG6u7y+zrbEvbe4t7KytbO4squmnKuruKqpp6+wl6OupKekpbTAsKqss77CucC5s6e4s7ezrpWlra6upIuTlaGNc8GZfZaZhI6WmouxlZqZlZKTmZqmo5Wgm5aaqJyboaCZi4yPlp1gSpacmpSapZdUlrCfr5yfpZSvr62lmqGmlJOZmY6doKeimbSpqrO9vLursLLHwLimq6utsbGjobKytKRycGdeXFBSTUVQUFBRO0hLSUZIQUM+OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UkVXUnNiV0ZIq5eZn6Gpr5iQl4eLp5aOiJKFn4iEnJePnqCbo6W1ybSpxrvDxMjKyMfMzse+urOvubjAwc21yLrAubW6sa+vsrSno5uqtLSqqaaurJmkrqWlqa26v6irtra+wb++uLOywq+3vaujrrSsuKWIm5emm3a+oISYnI6TmZqLr5ahnJuXlZugoameqKCZmqqZoaeel5CNkZ2DbnaTopqVnaKfkK6yo6uVqaqYq66lpJ+lqZKSmZuIlJyinpawp6mrure+s7Kuvrm2n6OnqKWnnJysqamNZWhjYFNMTUdITkpWTD1NRE1JSkFDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uU2FNVkh/ZV5IRqyUnKGfu6+YlJ6Lk6qbkZKTiauNh6KejKSslKOjtse9tMG6wsPIycXCzsjBvbmyr7m0wMLKtsaxwLy1uquorayvo6KYqrS6pqmmrKqdqK+npKurvruorLyzt73GvLa1uMCwvb+zqbS2q76kj6KXkaKfvJ+JmaCZlp6dj7efqZylo5ucopqopbOhm52lnKiqnpmVj5Sai5eJjaSilJyin6C1r6Wlk7Grmqysn56ko6mSlZWgg5Cen5yVqaWiobS1urWtqLWys56coqaal5WZqqGed2JeYF5LSUdITVFJTUVGRkJSSkhBREdBVlNESDxBR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6SensOtm5ell5mpnJaamo+qlpWoppWtrJmhqrbEwby/uMHDwcjEvs3Gu765srC4s7/DyLW/r7y3ubenpKqrrKCgmqqqxKKlqKymnqyvrKKqqL64pqy9sLe2x7a0ubi+sL7BtrSytK++o5ajlpOblK2fkKGipaOjn5C+pamdqaydnaGbpp+9opiknqKpq6Gdlo2VnpOfh4+FjZOepKCdtaylnJayp5mwqJ+aqp6gjZmVn4WOoZqbkqWkmpissbaxqqWpraycmaChko6QlamflGlkWmFdUEpJS09NSEVDSUA9T0hAO0dJSFtST0s9SE5VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hNopqjm57FrKGfrJ2drZ+So56WpKCnqqyXtrCjqrO2xcK9wLbAwrzJwr7KyLa4tbSws7S3wca2vrC4tLq2oKetqqudnp+lpMGloKquoKSpra+ipqe9taWxu7e2tcOys7e6vrHDwLi4rbO0taKcpJWRk6CtoJihnamoq6Kaw62pnqyum5uemaagvaGdpJirq6umoZmNmp+SnomOV3+VnqahoLiqp5OYtqOfs6Kgm6+Xn4+ZlJ2Cj6CXlo2ipJWQpq6zq6mioqWllZWdmYuPkZOkn4ljZVtkYExJS0tPRkVBRks+PUpBOTlKSk5dUVFKPUxXXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxMT56foZiexKelorOhnLKnk6qkn6OframsnbuwqKy1ssjDwcOzwsS+x8S9xMq9sLC2rrC1r7/FtbmwsLq2rZqpsKmpmp6moafCrZussZyqoq6wqaSnvbemtrq9r7fErbOzwr+xxrO6t6u0tq2qoqWVlZSjq6Gfn5moq7CurruypqCpqZmZl5OipLihoaSSrq+spKafkqGelZ6PkY2UnZqjn6e0p6eMmLSco7CanpuukZ+Ul5SagJKilo+OoKGTi6assKWnopygnpKSm5SFi5KNnJ6AY2ZbaGZLSU1LU0JDQElHOztGPzk5Tk1VXlJTSj5PXl49SFBCTUxJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+bn8Koo6qxoaO0qZayq6aipLKsrqm7sq2wtLTGv8TEtcDFvsrEtcDIwrWrtaiwuKzAxLS3rqy2uqWZq7GrqZifppetu7WbqLCbrZ+utLKnqrqzp7qyt7K4wKq3ssK8tMWnvq6tt7Wpp6yhl5aRpaSiopeYpK+4rbK1tqCfqKSZlJWTo5+3o6Slla6xsqWppaKempqalZion5+Yop6usqKmjZeumaWsl5qepZGbjpSYmoWWn5SMkJyelIupqauip6GZnpaMj5mQgYaWiZSfeWRpXWxqTlBOTlQ9QkFOQzs6SUA3N1FPXV5SVlFBV2BcQkpTSFdLSDpVZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnBpVkNXRox5ZkM7pKOcoaW/pqivr6Gptaqdua+rpKq0t7Gwubawt7i4xb3Dx728xMLHwbnBxsG6qralrbutwcO3t6qtsryjla2wrbGWpaiRqrmqoKewnaqfr7Szqqm2tqy7q7KyubesubDBub2+psOrsLeuqKqrpp2YmKqhoaCRl6CwrrOrsLmam6mfmZaSl6agtqmloqKvsbOrsaern5ugoJuepZyhl52js7Cbn5CUppqhqZuVop+WmIqVmJOWl52TiZCbmZSOqamnoKSbmJuTh46Zi36NloaOm2tpbWFtblhRUVpUQUNFVUA7OklBNzpYUGReUFdXRFleXk1MUk9fS0o+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYEYoQDhsfWhcVjqJe2NDPaifnKGpvaGqsKqjsbippbWyq6Gttb2vs7i8ur23tsHDv8nEucXDwcC4xb3BuK+2p6u3sry/vrWprrK4n5esraitl6epjqe7n6Wts56rorGws6yqtrO1vK2vsbWssLWxwLnEtqu8r7G4rKyporGlnqSon6SXkJifsqqzqaqzmZ2nm5mUjaClpLSup6KsrK6xp7Kssqmjm5+npJ2VoZibqLWpl5mRkp+Zn6GekKyfmJiGlZiLnZqdk4qNlpeal6emo6CdlpWWlIGPlYV7j5KEjJZmbHNocHJfR1lmVkRDTlhEWjlIQjY+XVJoXE5ZXUdbXl1OTVJYZEpKQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVjE1MT1gVl44KUMzWVVcZ0s1jHpmTECkmqCkrLejrKmlrq62qq60uaansLjFt7G3vsHCtbS7xb7MxbnDwbq/usS4wbmztayqure7ur61qq2xtpiYqKuqq5usq4+rvZ6rrrGjqp+xrbOurrayubapra6xp7Wws7q8ybKqtbSxtK+upqGzn5qorKCllZWambGiraClr5ahpJmZko2ipaayqaGmsauqtaSusLWvo5idraeal56Zmay4opiTkI+YnKGZl5Ssn52UgZOZjZ6cmpaQipSSnpqlo6KgmZaSkpZ7i5CFe4yKg4uSa255bnV8YUZgalpJSFpbPXtKR0U2QWJUaVpNXGFKW11aUlJTYmFMS0VgYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLipBL0pHUFtHM2NZVEtEmZefr6ixqaylo66utam2tLejrLS3ybq0u7q/vrW0t8PBzce8xL23vr/At7+9sr2up7q6t7fCt6ytsbmVl6auq6ejsqqUr7qkrbKxp6eisbOxsrG1sbiyqK6rsqe4r7Wzw8W2qbS1q7Ctqaeitp+eprGgpJSbmZSxnaebn6mNqaKdm5WXpaWkt6eisLOrp7GnrbC1rKSZoayom5ydm5SquJyVjo6LmZ2imJCXp6KfloOSlpCdnJiXloiXj5eap52koJKWkZCWdoSQh3uFgoSMjG5xeHZ8f11LZWxcSk9kXD9ie0dJOEdnV2VbTF5iTVhZV1RYVGldUE9IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNya0tEQ5GYpK2kra2rpqOwsrOqtrC2n6u1ucm5rsG7w7ezsrXCw8/EwMG9tL3Av7q/vbPEqKq5sba3v72vq7OznaCnsK2lprClnrK1rKuysKypqLS5rLSztay0rKmrqKypua2xsMe+uKS5r6mtraaorbClo6Ouo6mcnZuar5mio6KjkKyfo6Cfoamlpbikq7S0pKqrqKyutq+inaOoqpugmZqSpLSaj4mNh5GjoJaOlJ6glZOFjpSTnZuZlpSHmJKVmaecoJ+NkpGOkXd+joV8fH2HiolxdHN+fX5cUmRuXk5aZ11GRJZbRzpObVhhW01gYk5WV1ZXVFlnXlFSTGRaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZTs2KkhkSEorOkk/M0NJUyw+j2s+SEmPmqmqoaiwpKijs7SxtLWxsaGsrb3Luq7Bu8axtK20wsPRxMa+wLK+wsK8v7i8xaitt6yzuLzBsKuyraGkp62pqKSwo6uxqq+rsa6urauzu6e3sbKpsqmqpqWjrbqsqbHCubSsuaioqK2pp7GlqaSirqqoop6boqyVpJ2XnpirnaGnqKGspaOtrLexsaCpop+qrbCsnZ6mp6mZo5iYj6CnmIaDjoqLn6GQjI2XnZCQhoiRlaCdlZiVhpaTk5elnJ2ci5GQjYp/f4eFfHd/h4WHdXNyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlPZFxOVVZVV1BcYV9TT05oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5JZ0RGODxCMDVFS1gxQJRcQE1GlZasp6GqspypqLC1rLi0rqqkq6u9ybuxvrfDr7Cts8TEzs7Dv7+0wMPEusC0ycSsr7eusrrAv7OurqulqKqwqaaosqW0raqwrq2xr7Oss7qkuLSsrK6nq6CinrC3q6qturaktbWkqaesrKqsoaimprGypKaloaGrlqmgk5qgpp6joqqkrKKeprG3rKyipaKaqaqtqZyhpaSjmKCalY+YnZSBgpCIhZ2gjYqOjZqPkYuEjZiknJKRm4yTkZGUo5qbmouOi4t8h4GCgnt1gISBfnV3i6OHeWteYG5nV2aHZE5AZ5JMRGJ6V2JYUmVVTVZVVVRPXF1hVUtOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQUlIRJaRr6SiqrCXqqittau2sKukq6qpvMHAuLmzvLWmsq/EycvRv8G7ucDAwrnBusLErrG1srS8wb6zsq6tq6yotqqlrbCqua+osLCusau1qra1prS2q6ykqaqco52zs6iopLS0oLauoamoq6irp6Cqq6i5tqmqqamhqZ+tm5GooZ2go6KmoqmdnKa0rqelqaKjl6Wmp6qcoqOjn5mYn5GOj5mOfoeNh4WenoiEiouPjpGNhIaVopqOjZqRkpGOk5+XmJaNioN/dIeBf394dYN/e3h+gIidj3ByZ2dxeFxhdIhpT12YVkhteVVkVlJjT0xVVFVRT1haYlZIUGpUV1NHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdSRTuVja+fpaqtmaukra6ztK6qpa+pqbu+u8Gxr7itorWvycfI0cC/vbq8w726w8HAv6+ys7K2vbzBsrKzq7OppbWppK2zs7mvoq21sa+xuaq4rqqutquqnqqroKOhtq6ooZ6vsqG0qp6op6qjqqGhrK2ova+srqyhp6efq5iPr6KYoqCop5+nm5mpsKiin6yhoJKhoqOmmJqopZiYmJ2PioeViH2NhoSFpJeGgoKMh4+OkYWFlaCXiZKdkZOQjZGdlZePioWGeHOBf311eHqAe3R0e2qCh6N1aV5lbIF1Z4iLfFJXcF5LeHNUZFNRX01NU1pnTkxWWWVYR1NqUlI+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1pOjM4Xz1hZD9GMUNQW1srSE87WEI0j46wn6SlqqOlo6ymtLOwqaSwp6q4vsG8sKi5qqeusMnHyNDCvcC+ub6+vMm8wrmxsLWyury5wLO0u625rKO1p6essra5sqanurWttLyvvKWtrbWrrZypr6Sfpayqp5ydqrKks6iaqqeqpKmeoqioqb2rtK+tnqmjoK6bmrKilaSbpKWfpJqZqKqlnpqpoZuRmqCknZiWqamRmZmTkIqCj4V9j4KAiJ6Ph4B+jIeRj5CFgJSblIaTooyUkYuRm5KVh4l+gHJ6eX58aHd8enVwcX5phnmEiGRgaGRyhXttZ3ldXlZDWHttVGFQUlhLS01wdF1IWltnWUVWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6TsJmfn6mlo6GqpLaysaSpsaatucG9tbCjua2oqLDDycnMwbe9wLW3v7rItsO1tLO1sr25ur22rbm2v62is6eqq6+1t7Sqnbq7qLG/srmgr7S2qayerbGjnKWoqaKdnKSwpq+gn6upp6GpnKOooK27p66xrqGqoqOtnp6spZefm6CinJ+bmaKqopqZo6OVlpOfoZablqasi56RkJGMgouAf4+Be5qUjYl9foyHkI+MioWSmJGHlKSKkpKHkJqQk4GIfHlsfXZ5eGJ7enJwcHN4aoJ0aoJnY2hhbnOObWJqcGBvQl15a1ZeTlBRSklMU1lWTVxebVdEWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1FdPSOSl6uYn5eno6Gfp6O3r62ir6+pq7jCurOtn7mvq6i0usfKx7+3wr6vtL63xLbDsrC6srPAtbu+uKm5uL2rpLWnqKqwrbmwqZm5vKOuv7S0oa63taemp7CzoJ+lpqegpZmerKipnqCqrqegppeiqJ+wuJ+ksa6grKGspJumpqiampueo5WdnJqdqaaWmp6okZeSmJ2TmZWhqpCaiY2Qh32If4KOfHyhjI2JeYONhYqNjYWIk5qOiZWfiZGVgoyXjZB9hHtzcHxxc3RgeXhqb3BxcGp/c2N6bGhmZGFlh4BgW3JqcU1OgGlYWk1QTEpHUFJRSE1bX29URFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBcWzUolpulmJyVrJ+foaSht6qwo7S0qam5xbayrqC3rK2tsLbFx8C3v8K5sLW8t7+7v6+svrCzv7G9w7mpu7q4p6i2qKersKyzsKaZvLakq7q1rp+xuK+ppaevspuhpKCjpKGWm6+moZ+jqK+hoKKTo6SitrChprGrn6yirpebqqSonpeanaSTmpuanaWpmZubpJSUl5ScjpOXoqmhkImKj4V6hH6EinqPl4qNh3qCiISJjI6FjpOYjI6WmYqPln+Gl4uPeoB6cHF2bnB0X3h3ZW1sbGtphG5mcmlrZmldY3SBYFtrdmlaSn9eW1hPT0tISFJVRjI5XV5tUERYVlllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyY1YsMpWioZeUm6mcpKGiobeprqC6uKWsvcWzsK6jta+tra+0w8O8s7+6t7Czubi6uLqvrsCztLmwv8G4rL26taWis6qnqbKrrbGhmsC1pKe1taiesrypqKWpr6yZo6ecpKWUl6GypZmfpKipnKKgk6Sfo7iopKeupp2loaiSn6ihoaCYmpygkpqblp+hqpuamKCUkJOWmY2UkqOopJCJiY+GeYR7hIZ9nY6Jiod6gYSHiYmRhZWTk4yQlZSNjpR7gpeOi3d+e2x0cWxsc2F3dGhoamdnb4VnaGhjZmlqYGpjaWdbZXtjYFN0VFxbU0xKR0lPU0AhKmheakxDVlVeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdPJzKeoqORjqOmm56enaO1rKequrenrMTBtrCso7Wup66vt8C/vLLBtrCusra2uLa2raq9s66ysb2/uK68u7Gln7arpaW0qaqunp3Bq6ilr7KprLW7nqmpq7GlmJ6pnaekkZimraKYnqSpoZuhnJafnae2pa+qrqGhnZ2hlKCmn6GgmZuZnJGZnZSlnauhl5aclJKMlZeLj5iaqaCRiImLiHmFd4KCgp2Ii4KJfX+FiIaGkYSWlZCOkJGRkYySe4OVjYZzfX1meG9ramtndXNrY2dkZHaAYmVmZmVqamRrclpfWV1tZGFOaVhbYFZKR0lLTVJYPjlfbGlIQlRTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOfkIusoZiYn5aks7Gisb22obHGvLqxsaS3rKquqbm8u7uuwLKurq62rrK4s6irubGvrrO2urawuL2tpp61q6CgsKSqrpyiwKCxpK6wrreutZ6tr62topqdp6mlnpWap6WfmaSiqJ2an5uUnJ2sr6W6qK6ioZqanZmeo5qknZeemJuUmaCSqJWpp5qTmpqRi5SZjZSUmamnjo2KiY98gnOBgYqYhYd8iYmFhYqMipKElJyTkY+QkJaOkH+AjI2CcIB+ZnltaGtpZ3Fya1xoY2NzgWFmaGpubGdqamhuXWxsdHBhVWNpZGVaSUZMTU9YUVFWYWWBVUBWU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJGhmo2PsJ2ak6GZqLKvn7i/tqC0wru9ubGmtrCorqW3uLe3rbuvrKqrtqqzuK2ls7Wyrqmwt7axs7W6p6mftaidnqiiqa2ap76YraOur7S1rayfsa2wqaKcnKOrqJuUnKajnZqpoqSWmp+ckJujq6qpu5+npKCYmZmdoY9roZaZnHCClZqjf3WRqaeelJSekIiXmYCWiqGQeIaUjINuan52g3FshouGfYSMh3BeY2FnhJiGbIuPlJJ0d4uEfoOPf2eGgGd1aGVXXGhzbk5QamNncoRnX2Rmbm1qXl9hio+DhGVOS0Q5RlRnXkpHUFBUVUtIUmBvdGVGWlFVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Lo5mGlLCbnJOgm6qtqqO9xa+puMK4vbytp7awpaukt7Oys7G5rammrLSmr7WiqLi2tqinrLezrrSts6Kpn7OqnqGknKammKu6laalr7K2ra6kqa6rrKWhn52gp6ebl6ClpZubp6edk5+fmJCep6qjta+jo6OclpeXl6OIoY6Smoehh5OcoH+kf6WqnpKRmpGIhHJ4jY6FiKF2iIxpl4hmfXJ4oW+Ih4R+jn1/oaCgmYB8h550h452m4psh4GDbGhlY3prcWFThW1jbGmYcVlqcW+HWF5pW2trW4hxbnpyhWeGhFpeR04/R19NRlJWVlFRUldUZ15NV0lSU09FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoi6aWg5yrnZmYnZ+qqqeqv8Ovsbq9t8C/qqW3sKmtprO0rq+zt6uppbGtpbSznK21trSmp6izsa2yqK6eq6CyqKCjopqgoZqts5SjpaW1vKesp6uqrKiloaCYoKajmZmlo6SYm6OplpSjnJSTpKWmobejo6CkmJSTl5ObiK6PmJSJqYuXoZuFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxl7ycxXpytaa7kHuAbJaxq7B4aGtYsa5uZWm8krxuaHpuco/YflNqYrayf4FylXSaoaqQV09XYlBWTkZUW1hRUFKMXFdcUEBcRFFOREdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mkoCnqp+XnJ2lrbKoscK9srXAtbe+wqums62sqaeus6mvtrSnp6a0pae4rpyzsraqpaSnsq6usaaqnqeksaOin56Xmp6crquUnaKfs7qjqqmira6loZ2amqGnn5ebp6CfmJ2mp5Gcp5qTnaGmoqCwop+fo5aVkpiSmYWvamqKjap+Z4OVhq1kcJ2dlJmllHGuoaR+eLt9a6GPdrFfarRbpYBmnJFgZoJ6Zn9qeGupZL5yZ6aMdbFqfLF4dJKTY21tp25bhKBFaGaHlkV1nGB+Z3ykp4JZX4uraYCWeHlqpzdKr1xYU2xkW0tOV19cV1Y7TolPWFcvSVRUSUNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCrKelnqOkqrK3rLS9vrC2xLK3usKmqbCrrqipsK6jsLqvo6SusqOpuKies7Kwo6Wgqq2vrK+mp5+jorCbopuXlZaamqyllpuhnrOzoqucoq2toJ2Zl6ChqJyZnaOfnJmgpaSPnaKal6Cfqp6mpqCbn6GVlZGWkZqFtZu1eIWpmbWZdoazm7d+k5aWqJR+a4Gme4KGiJKUknerZ2uxW6t7j4eUdIlxj4aAf4iQl3iCgouYjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVhYQSNNaEVCRUFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+Vh7OmpqGuqaeyrKm7tsKwu8KtuLfAqqytra6mrbGpoa+8qqGntK2jq7WkprOzp6Oinaeqsqiwp6Wen5+vlp+YlJWVl52soZmZpKi0r6Kpj6moqpudlZigpaean5yin5ugo6SjlZufl5mdoqmbpZmcnKKgl5ORk5Kcg9WTmblwsMJ+xYZ81pSbu3yalaSPjZyNpHuOh6SCpYJ6rHmPnVaveoh+n2q5Wrl2h4R9poKTfJh6qnmNnZB7sW6OhHSQvIVvlFCvp8WKUaB6Y2CpY3RyiG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITm1NW1JPWWZaQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcxJZuik5ixqKils6qltKmkvLfBsLnAsbW0u7O1p7Gwo7Cypp+utqiap7muo6+xoLO0sKCknp+nqbCptKikm52eq5eYl5aXlZWgqpyZlqetsKmjno+soqiWnZecoaWhmKKhoaGaoaKnm56hnpSZm6agnKeVm5ufoZmPkZSRnIiybmi1cauHbo6mcrRzcrZ7mpeki4+djaN/kaGlfrB2g5HS0XZcrnuFf6Rvm6qma4eFfa19l5mPe7Fzkp2PebNllnSEnm+eZpRSyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tgbGhQVUdJOD1WUVpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnZKlr62kqrytprWlp7a7vLK6v7e1tLq6s6W0tKGxsaKfrLCkl6a6rqSxsJy0uKqfpp2hqaSyqKyppJmbmqielZSYmZKSoqeflpKlqrCmopaTrZ+lkpSgm6Smn5SapaahmqKfrZqgnp2QlZuhnpyllZ2WmaKflZiVkZqFrHt3qHajjoiGqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXiFfo+ehpmZd6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1fd3eHaJiIa12vd5Wej3hsNXnIrrJfQlNvXmdgRVBtX3BtVlVNLmVjaFJYUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOjk5n52Un7iwl7TBraizqKmyurezuL+5t7K1vLWkt7OftKyfn6isn5SntauosbGrrbSkm6mgoKihtqemqaKZnZWloZOSm5iSlKKlmpKQpqyvpqCVmamfoo6RopmopaCVmqWonZyknqydoZ2gjZSemp2hmJmclpehoJOYkKaehql9faV4oY+Og6pwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92iHSogo6bjZKjfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFtMdF1iZk1bYV9yc19KVjZKm5NYSEU9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKGdmZm/q5e0wq6srammtLC3sbW/ubmysLe7qbq0n7CknqWnp56TqrCpr6q1rKqvoZihoKalpLqio6uglpuRoqCUk56alJeen4+Ni6ivr6adlpuopp+MkqSXqKunlJepp56eoKOtpKGeoY2VoZifoJKdl5yVnaGVlo6rm4+ubXK0cqmMdoqmc7R4c7OAkaSjkpyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWSiK1rdbNhnWaib4eSapdcrV9NoXyHkVJzo216f35vmIdxXK9WPJx3ZVRvbi5cp09jUmtlYm1aY11gcHtjU1pRPj5tbzNDQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpudu6GcssCurqurp7epuK+1wLW8sK+5uKvBtqmpoJumo6KdkaqqqLajsqevqqCXnKegpKu4naOtm5aZj6WilYydoZuYnJ+Rk5SrtbCnmZScrKqXjJOlmaWtopGWqrGkn56mq7CYoaOQmaKWn5uWnJehkpypnJSQqpmH1JKau3Oww4DDhn7Vlpu4eIiQmIyYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9lYGsqXF7f3W8iKegaZ1hpo6voX6MdIeqfb5uc7x0soN1eIGKbpqIcW6NpHS9Xnd9W2F5vGtaVltqel5qYWVnYm14b1lbWUNBQHJAQ0crNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueobyil7HDsK2qqqyxp7ivtsSxurGuuq+uwLGrpKKeo6Kcm5CppKqypLWmraWflpmqmaasuJyirpiUoJCln5KMnKOel52bkZWSr7myrJWXo6enk5CWpJykrJ6RoKirn5ufqKOznqOljqehlKKanJiVo5iPsKCSlKmehZCZtYCQkYy3lXiCk5q1d21rbnNveY+Ejol0nsG7vZp7gbKocIB0kbmDfIaGjIaNe4qHjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbV0cnB3toxegHp9imiDeW15Y4uscHWFf1pbp2pFZVpUZmBjXWNRZ2dwbHVCTVBMRDpaTT9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZWJz47PKeeoKG/pZa0wrSsqqisq6m7rrDFrrSyrrentLitqaKhpZ6gnZmTq6Stqqa1qKefm5ago52rpL2moKqXlJyQoZqRj6KooZOdmJOXlLK1t62YnaOjooqSkqabpaqblqmkpZyaoaimpqOpoZGtnpajnpeXl52ej7ColJunoY5qfmmcpniHcn2ajnR6ZId7vb7Aum+SgnGVh2Fzalpem4phY4iOlWtggJVkbZ13YpVrgJqVlGVeYWNxmoppcox9hZVnan5ydHh9fWJbd3SBaFBcboR9fItrWGx6gnNKSm+GcE11TUVXXWdhTFpXZ2NfT1ttdWpxUk9ERU47SEg9TD8yLTJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz1bTyc/Mj6ooKihwqOatLm2o6ylrqeotbKryKuws6u0o76xsqagoqido5uZmaymr6Sktamlm5eVoZqmrai9p6imlZOblZ+ZkpekqaiQnZGPmJywsr+sm6edpqGIk5Gpmqijmpusn6OZmqOnrKKfq6KasZuVp6CXlZ2fnZexpJehqJmckZ2coqSYpqKanJqamY+VgWdtfXF3kpeUkYWLtaqNhpiVjoqMmJeHlJWKhJKUkYmOkpSYlJiXmqCimpyUoZ6NgnqkhmxqfJB8gHSJioFxgnh5dnaLgHyKa3OBdIN1ZXZ9d2twe21gY11waE1YWmZqYFdab3ltbWZTT0ZTOU9ZTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Gzob+hpLGyt6CppbKnpbC1qsirrLCltabAp7SgnaSknKOVlaCqp6yjo7arn5mWlZ+WramlwJ6rpJWSnJedl5KTop+eoqeTkZmop7LEr5qrnKqekJaWqJ2qm5ygrJihm5yipK+moaWon66Yl6edmZqgnp6cr6CcoaaVmJKYk6ChlaOel6COlpOKio2Olq2PfJWbgpKCi6qohoGZl4qEj5+Ie4SQh4aakoiGipWPm5eNkZiepJaak5GejX+OZqGzr4WKhHZ6kIp8dnl6b2Z6kYGAiWt1gXmIc2lzf3p1g4eCa3RkeWZgaWVjZGZrWWx7cGlqXFNMUERfVEVAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua+/rKuusrGgqqaxraKss7DEsKqro7OuvKO0m5+moqGcmZenpammpKWytJ6VlJ2ZmbCmrb6gq6KQkZ2amZSRlKKcl6ichJ6qq6KzyLOfqqSqlpaXmqedqJqfpKuTnp6doKmvqaWjq6Kum5+goZiknpyfna+jmJ6ok5iXnJGkmZionZqXZYKSfGV+jZmPY3mNbGhre5Kkqmplmph+Z4aKZWVpaHuOoY9raI2XkaN3a2qLmaOemXNsbnuEjYd6WGVehoJebIuJgHZcaHN3d5KAh4JueIJ4gHNteYR0d4mIjoN7aYZZXmt0ZF1ziWlrfXFrY15STldKZFhBSjQ9Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7CqpaitrbCnra2wvLGpp6Str7CfrZego52imZmmq5yto6WoqbKtnpWjkKKvpra5pa6jjo6aoZmTkpqgmZmllXulraKos8S4pKKnr56dlJ6inqOco6mpkp6hnaCqsKqrpKqgqpunn6igrJahm6WwpJebqpWhnpuSpZeeqpiefr2Dh3K0coSdha1oeLnEuHGToqN6ppmZc6qCfMvAwLtxjKKIgp99lpiJncC9gpednY2dwsF8gnySjZrDwH1rpbJvjIFvynp/m3eSg46BdnqBgHlxen+HcXiFjZN5bXeUY2ZfeWRgZYJjXnRobGRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUS8jRlszUFkvVUFCOy84lqO5w7SwsMCpqJSjr6mwrq2ms7SvqaWmprGrn6uYmqKfnJqqp6KdrKOlqKSktKSdopOmrau3s6euopGRmZ2lkpCfoZibn52Hp6ykq63AwLGgqa+pl5GenaGZoqOqo5OgoZ2era6prKejo6ehpqWdramSpJqorambnKmcrKGWlqWVoaKXnH/OlHh6pIF5lJabX66PXo6ngaKgfaeWnHSrg4CvXmONqnunh4WgdJeTiLNjgquGoY2Ns2qFr3R9l4i4YYOtWaPNbZB1e9p7f5lwfoiSdn5le4h2dmt8iG9+hZGSfm2Cj2BybHBnYF95ZFxxaGpjZmBSVFJXXUtPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52RpKqorbSrpbKsrKukq6awqqCnm5mll5yir5+gn6ino6Whn7Csmp2Vp66tsauorKCUkpufpJKPnqWYnaejnq6kq7CpwMezqKmxrpaSnZuhl5+pqp+UoJ+dna6wp6upnKeopKKrk6yzl6Wiqqmdo6alobCgkpmmmaCalJSRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553qoJ9rX+cc61+q4eGn3aYknt8l36qiKKMkYydfqt7iZSPn4B7rVacxHqPb5LBfYGVbXVvjG1ldmWGb2F3bnJviouSkINtkpBmcHV1cGBnbWVfb2lpbmdjV1NcYVlSU0M4SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSgnKOOo6OirK+2r6ixpqiqp62rq6eio52ZopWgpaqfoaWgqKiin52wrJealqinr6yopqmel5Sao6GRk6Ctm52mo6+so6y1qrrOsq2mrayWlZydopierqydlqCZnp+qsqmqqpusq6SjrJuvsaKoq66lmKaqqamxopKWo6SalJKFpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBhUquEf66Dm3atgaaGhp96mZeGe2aAo4mkmYaCpH2pf4KVh65efalVnaKSgXqin4B7w6/Fi3Kvs7O5cWKpr8J0aI2MmI+BbZqUcG55eHhvbGZlZXFwZnxpYl1XYGlYWFVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1b+hmaunoa+inrC0sK+praKnpqqrq6mkpqCbpJ6dpqemo5yrmqKsoaSfr6Kcm5OqpLWwr6Cpm52WlKaikJqiqKCgpZywpqSosq23ybK1qquplZGdnKKYn6WznZqglJ2fp6yspK6araujo6qis66iqrOxoZqpqK6vtqKSlqKnmJuRfKpsnoSHdat5fLBvgqSLiZ+Wlp+UgdK4tLjJgIGyX2CUqYOjiIegepiWmniqyXSZpJWoqpGTmoyAm4qZxsZ4ZqGCpXOBn46Cfa9dcLRisHVLo4Ztp0eCk2SPkJ6SfHGXk4Bxe3V+e25bZmpycGWBal9hWGRtXF5ZSU5MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4ramzraylopyyuayqoaaaqKWqq6qnoKalmKqjn6+rnaagrJqeqaWdp7WfopeTqaq2sqycpZuflI+lrJGZm6ejoKmmrqGkp6qwtcKys6qtqJOJl52kmqGjrqaYoZWZnKamrJuwna6pp56spLesoLG5r52brqeys7OklJenopmfjoKdTniagX+feoOjfYOkhIamnpyek4S4e3x5uYJ+zMbCtniboZCLn36alpeKdp6YiqWYpKl/sIWdhZ+ErH2alGKlbKRwj4WQgX2WgnKsYKNzcYCaYLx9UlV1j5Kkl3t+k5KLdXtzhX9xXG1ueHJqgW9bZF9obmJkXUtMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruaqvoJuhrLOzpZ+glaWura6qp52mppqjp6GzrqKpprKgmamklKK1oqKVl6Kptbmjm6KcoZKPobGYnpunpaGir66dpKiitrLEsa2pramRh5Ccp5yipJyll56YmZqmpKmar6GvpaaYr6W8raG2t62dnbWyuLCzppedr6CjnYWP0bXDt3mHjoWRk5CBpniUoXeMoJGEpYGKcaqGhLRucmqZo5yVip58mJmGh49zr4Klm6KOpouTnYqVkJptcLJcpXOTepxsmX97mXxtqWGjcXF/n2JzsrhoeJCUpph9jI2UjXh9eY+CbWl4aXlyboB1XWVkbm1mZ2BKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklk3ONiq2/v7y6tJ6Wp6WttaGimZWjqKeuq6yZpqKfpqCgtaeiqaewo5Sso46kraOdkJqaqrS0pJ2km6eRlJetn5+dp6Sdp5y1mqGqpLarw7Cpq6mhjISOnKGgpqOVmpqcmJuZp6WmmKyorqOlm62mvqyUvbCsn6Kwsrmrs6aaqLGjp5d6qJB9fLB3ioGkpYicbbJvoIetfKGOg6iVmICsiYSuhZ+UqqGhl4afgJmVgHuSfquAnZqXi6t4nZ+RiZOSgHmvXaOBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkqaZgpWOmI17e4SYf2ttf2N+dG6AemBnZXFuaGdnQ1phWz5LVDNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYGFhXl1bWlhTUE9OSTgwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2SmoOpxsK2wbOfmqygrrilo46bpKOfsK+qn6Sfna2Znrmgo6ugr6marqGQq6iklomakK6xrKafppqsl5iPrKGhnaWhmqWdrZigqKa2qcCvpamkn4uAjZuan6aekpSampSamqWkpJqprKykpZ+qqL6klsOsqqKhq7K5qq6noLOuqKmYdq9+kIuchYd8uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWmmaShoZGFoFtsaoGzYH+te3uCgbFtZ2+ZmIyIsFt9tFykg2vIomSfgHu8WHa1WrJ9Uq6AeqxYgKFumJCom4uXkZiYfHmPnX5kdH5ihHh0gHxhamdxbWZlZU9VZFxCVV8+Sig+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRYWl5gYGBhYl5fXFtYVVBOSkZDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaXFxYV1dHQjvSn7Oyt726tMKzo5uspqW2qKCLmqCfnLOzqZ+joJ61mKC0qKqsnq+tnqybla+ooo6Im46vrKinoqaZrpKZj6iaoZ2kn5mko6WZn6Oqsqm9r6Wonp2OfYualaCgmY+RmpuSmpeon6GaqK6opqajpam7nqDGpqSooau0tayupp67rayslYCpkqOvj5uAh6SXmJCBgLjDuoOOnJOEp5acgqyKgq+IppubpaqRftW9wqpio7+9fX6jgoPXuri1hZSTg569voRro4Fvq4RsnH96srDHg2qrsL2seHeivrx0gZaOp5yQm5GYnXqCkZt6Y317ZI5neYJ7YGxla2piUGFaU2pcQFVhQk4qPTo0Lx4fJB4lMiAdJCgwNDk2Njc4Oj5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5WztLG/ubG9sqKdrqalsqadjJilv6q4sqihv6anspyesZy6qJ+tr6amlJSwrJeMg5uRrqWirKGjnKqfmIujkqaep5yaoaiimZ6hrK2qua6oo5uXknuHmZGmm5OOkZiYj5iTqJqgmKmpoaqnoaOqu56oxKKgrqOqs7SqsKmguqeurppzdaqkt4ZliaBwZ62Pio9tb3ekkJmfgXWumJRwj4txlaijm5eupHJtbWxmi3hvboKZcYF6anFpZ4mWlZhxaWmEh2dwhmRdiGJqb1ldZ353pl9hcY6RbmZlgI2Tj6KYmZmRmJ99h5CVdmaHeGmOa3l/eWRsY2ZsYktkWEpsWjpRZUVSJ0s6KyMcIBsiLCkYGxgtMi41OjQ1Nzk8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOpubmys6qpoa6eo7KpmJK+ssTJvraqnsCsrKOhqKyguqOkrqytpo2XrqmQjIWVlq2epquhnqOjn5GLpJKnmaiZlqOqoJacpqanr7qsrJqbk5J7hJeNpZiNkZGYlI2XlaiVn5ipo5uxpp6iq7mfr8CnpLKlrLCxqq2rp7ejrbeWiqCopbadiZaimIepmpCUnZKps5mbo6ugsZaioJ2gopygpaGVq6eNk5KMh5OcnJWQmpOYkY6VhYGkmpeVjYuTk4uPhoR9Z4l+dIJ2dIeLcadsepSRk5KBgY6QkI+dlaGWmpiig4iVjXJpkHdxi3h3fHpqbGRjb2RVYFhAaltIY2FPWitGPSsnITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVFZZXmBhY11eVVFKRUQ+OT1AQVNYW1xaV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW2rq6isKOtn6C1sZCOrMe9xbu5q6Kmnpumn7Goo7annam0p6iRmKyii4eJj5unlqyloJmnnp6SlaOXqJqomZSmoaOQmqeZobW7qKuYmpCNe4GUi6CUipWRlZCQk5elkJ+aqqCctqOep6u3p67BrqO2pq+vsKypqbO4oK68mZGlpKa2opKdpp+NqZ+Nkp+jrK+boaOwqK+Xo6Cco6qenp2clqudkpmhm5SQlqqZjZmZlpCWnpGJoJ2VlIWSjJCNlIuAfWaLhXWGdXmIg3OcaoWQlJOQiX2MlpKSl5Sik56YooSJmYd7cpZzeot/cnx/am9kXnBqYVtfWW5jUGBkUFo6R0dFPjI9PTgvKyYrKSYdJjQwNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVVQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9fYWFiYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mmraCntaqQkJ2ltLyvra2io5p6naKxpKWxqZecuKajlJmqnI6Giomco4+un6KVp5+hkpeYm66LqpaPqJmojJipj5+5tqWmmZuNiHmCk4uak4qVkpSQjZKXoo2dnqien7ijgISvtaKvr3WkvaOyoHd5oKqyupR1rKSeiYCqf2RcYnagjqSehJd9bpOznaOnraqjZZ2fknN5mZZwgJiol2x/oqiKZZylnJGXmJaMkpyRhp2akJWDkoePj5KJhHdqjoZ2hnB7hoGAYWmHipSSi1p1lZFoaI+Pc3ummplleZmHg3iYaoSLg295gGtxZV92cGxraFxnZWJicFNcPk5OTlNHPkBURDkxLx4fJjQ6MzE2Njc4PDs+QEFBRkhCR0ZJS01UVFVZXWBoZmdXUUo8REc8OFVSW2BhYmBeYF9gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOhr7Gsq6mlqa6jpq2kkpartrCyp5urpqyXdIydr5+oq6eUl7mfoI+cpJ2Rf4mIm56Nq5qilaehnY6XkZ6Eda6PiKaaqZGXpImcurSooJmYi4l1d5ONlZOKlJGQlIyQk6COm6GnmZyyloCMm7Wds4ySj7ynoH6nonqirraBjo6mnoOLhpCxqa+MipajmnmAi6yGnJ2ip6mnh5WFmHelm3qHm4GXp4KCe5yyeoqGoJeZlJiWgpGXloSamWN5h5CEjo+RioNtcI6HeYBwgIGFf4Z0hoSVkXiWaJJ0oJp0fZmEop6HmH+Ti4OEmWuOjoVseHtxcWdkeG9qbGpcZmtqZXRcX0lUTFFARTUuWlRVNykhMDk9PjY0MzU2ODs6PT4+QERJP0pFSktHU1hbWVthYWlmWlFIOUVLPD5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq2uq6isoKixpqappZmUrsi+saKXp6m1no+Enaycp6KgjZC+npqNn5qgkHyGjpmYiKycoZafoJGNk4mGgJGojYeinaSUmJ6Gn7qyp56bko6FcHWQiZSQipSQj5uMkJKfkpehpZaeq4eftIm0mq2Kyoeqroi3hYyvgrCug6mNpZiNnX2oj3J7d5yPp5ZolaR5tIyfnqaokpjCgX+riJihcp6AmqV9l4WVsYChfaGToJCYl4GOk5uKmJGLfIWTho2VkomDbXKQhX95cYaBhHyEdYSBloCPxWZ/qYePo2ueg6ObhJqBjo6GiplxjpOFaHd0fHdoaHVxaGhrXmRwbWdtWGdHXVJNMkQ0Nk5hYzcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5qbVxRRT1MTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJein7Cnqaimq6CkuLCpqqaalKCjpKukl6Wqt6OvgKGnnKWenYmUvZmTjaGSno95hJaWkYirmZubmaGFj4x3m5yPn5CInqSclpqYh6O5rqWanIyMfmJtj4uTkI2QjY2YjJGSn4+UoaGZoad+oaeHrZ2glq2PnpydkYWAoI2rroajjamZjJp/o3WAmZRrgqx1Tat4h42ckZuop4Cpq32DoXt6p2mef5JrZ5eGl7aJnn5uYGRZg5d/jHtkaItymX15lWxdfJZtX1Nwg1xfa3mDYFllgn2DgJdwp6prg6NucqVwn4WgaWagbVtuinxmWmCDf2JXUG93Zm10cmtqb15rcG1saVhpT11YRjlBNEdEXms0LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15eY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeWnaC4oKqkpqyRobW8q66imZigoqWsrqGdrrWiqJKhoJ+mm5qOmbSZkIufjJWLdYGUko2KppaVmJ6ef5KFhqykh5uQipipmZqbkoimsaeilpqIiYBpboiIi46OiouNkoyQkqKMlJ+gnKGkf5OBj6OhlKB3nJaPp4Ohp3+GqayEpXiKfISafqJwc5SIlnuejHlth5uMmZCbqJqPh517gqJzdqZmnn53pF+Yen2Sc6JumLe0unSTh4J/tahkgca4e3CVt4txgJqkYnOsq2B9aZ2zfm58hoKNgouYcX+jbHKjdJ6EgKNgnZmzlnF8l5+zdHNbnrKDamJvdHZxaW9Ya2xycmZdaV5iS0U9RDZRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNTlFARF9eW1lYYGB8ZEhDOExXVVZjYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS3ta6toJqinaOjpq6cm7GtrJOYoZmhpJmalJ+rm4uIkniLhXGAlo2Kj6GQkpSdl32QiY2ooYeYjoqRo5Scm42LqailnpCXh4V+a3uHfn2PjYOLkJGJj5Sgg5eeoJ2gnouJd5yYooyfcqGLh6iIm6WPlqeqfq2MfnqgmXqjk3iBdJaIjZx9lZ+Gm46Zm6aGomShfIiWkJuNbJ5omo1umpl7gIunfXJodKuDnoN0qmiVml2bhXaEnWiqaoC4ZlyocIGcYJWMXqd2dYeJfp5omnWGk5KXjn+fbpqQbaeaXah+eLtrfqpbjoRds2dcbnJ6eGtpXHFqeHljYGZYYkFRRk83VkNSbzVLWlpfT1pEQDE1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW11ZZWZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4hjlJururKxrJ6mnJypn56um56wqKydl6SaoZ+YlpahpJmGiY1qiIBye5eIi5aWhJGUmI96ioSWpJ2KlI+Gi56SnZ2JkKmjoJqMkoqAgGmAhnh/l4x7iY6OiI+Wmn+Uop+goZOYcmifip+PjHCSjIGph5ieoqefp3yvraOiuJd3o7OipICIlHmde6qaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZp/dKpaXW97lot4nmJMfnp6hWN5l0JMnlmianJ8jm2AiISZdZt4homxs39/m5OndoKdbnN9lG+Zc2ukXZV2SGVkYXNxfn5uZmBsaXZ7ZGViUl5XXVVXQFpFUWhEU1dcYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUM8VV9iWmZqVmdobW9iZmdeYWFcXV5haGJfZWN2bF5lZ2ZrZGZsaWhraZOcgbCtmYRUXqCms7mzs6maooycq5ycqZShq6ShqI+fnp2amZaYoZ2WiIeJd4aBb3mVhZCbi3yRk5aIcn+IkqGcc5GQgYiZlaGbhY6pnJqVi4uLfINshIVxgaGMeIaNiIiTmJV8k6OgnqOIrYZ9tYSOnpx7pZZ6qYGVnI+KoJx8p2h3bX6ZdKFzcXyehplwk4OufaSDpp6ZgKNvXqhndaNjb6VhnNOQfHuZeHJzY6KGkH6jc6SPdmuQs4xggpiJc6qyqLx/d4Ntfr6mqbRenG59cZduf3Kicl2kZ3OmYWimbZvUmX2Fm3B6epdrm3x4l3NuqaRnYWV5cICEa2dmZG51d2dgY1RbZlFRYklXSlRhV1NbZWpcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWFmZWpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+wq1RcS36pr7G0sLOjnJmFmamgoaSOpaigmKmKmZiYk5mTkqCYjoeGe3B9hGh9j4OUmoF3kI6PiW9/ho+SkmyXk3yJkZKkloOOqpqTkouFiXqDdoeAboGfhneBkoaImaKXe5SjpJqfibOhoraLeqynpK6lcKiAmpCFgJuRe6SAopmGmHKehKOur4qXjH+MpI2Vg62hlHa0tbXJoXOUioGfYJ2XqW15lYagm3Whh3egfpKXi4FvTGajknCbh3Kke3p0YYOBa36ga3FkX5xxfXSXaXpps7W0xqZzmH56nWucm6t1hJttdXiYaZp6dZhyUEV9tF5qdmt5h2ZqaGJ0dXBuVl5UWWlQU2lJVk1ZVFZdaGtuVmdXTUpCSk1LSEpPQVFLUGVjam1ldXNzf3l8bnWJe3tUUE5sXmhba2lSamhpbGdsZmNlYFxdXF5pYmRpa3tfXWRoY2pmb2xlaW1loZyIr6aEZj+UobOrr6+2oqKQgJiqoqKljKWnnZ2mgpqXlo2XkI+ck46Ig3lqeYZlg4x/l6B5dY6IjIFphIWSgoyFnY16jIuVppODl6mYjJGLgYl6gH2LeXCQoYZ5gZWHiZaglX+UpaeclpaEZm54nGyiZHxxpXebmHBnpoCWi3ukep+Wg5dynnaBipSWj7lukIqiYn2ZoZWIbXJpqmt1oG1upl+aaYuQaJaHmpV1ooB9mmCMho11b4hiaKBlnn5pmnVvY2aIgm1yolpfW2KhbV2JjG97fnNyZKVtd6JkZ6dpmXOMmW+ib1OJkG+gX2WoVIteVJhubXNrcoJtcGlreXNrb1JZV1dnWlRtSllPXUlYaWlzallrVlFSRVZcTFhTYVVpa193dHt9cH18coN7f3N2jYCEdl5RcmJnYnBnUGpoaGtsbmhkZ19dXl1ga2JqaXZ1XVxjaWNqanNsZmttY5ykmKZ6ZXRti6eupKmwsaafi4CYq52fpoyioZuiooCWmJONmo+LmJCOinuGcYCIaIuLfJibc3SJfZB7ZIKHlYqJlpmCfIiHlqiRgaKskYaQioKKfoCAjnNpj6WEfYaUjYiYoI6Ik6qmnYmmeJWbfqWIloyymJ6Qgq+Xn6V3lId5qXSlj4SabqSijJKEjIO7bn2lr4OGhoaTlZyffKV6cqiVoJZmnn5vq2OWipWSeKhsqaKBiXaIg3eqkaaHapGwa3azjKlrioZtbZ+ekpVgfquLqnZ+f4ylnnaffYSklZ2gapuId6xnn62MtnR3vo2kk1mDpo2rYXVydHB8dXFjan5uaGxTV1tWYWJda01dUl1KXm1udmBbcVlbYFtmdGVub3FicXRgd3p+eXJ5g3OEf4F7e4yBgoB2YnhkY21zZFJrZ2hvbHJqZmlhYF5cYmtibWx6b1xcYmlibGp3bWdsbmKVpaqdgYCepJapqp2op66kmYmDmKuanqSJm6WdqZ2FjJqOhpyRhZKNjI10hnqIhG+NhH6Yk3R0hnKSg21/i5KHhpOPfXuChZimjn+lpo6BjomFlXaCh5JvbIupgIOLlI6JnJ+JjJSqo6CPgHWUl4h+gXmUrqN/gZtxj4V4j4qDfntyp4xxfX16l5abhI54e35+h5SVk4p2kJifoIN7fYlrjIVbeXlyenBobn6SiXF/dYGPlJNxhoSCZYx/XoF/i3d1c5R1b3lubodthIVedmh4jmWAgIWNqZt9dHyWaomIcIF2fYZ2bW1njHN5e5h4hVtrWHmPaW53cnFweHhwXWyGbmlnVltgV1xma2RWYlVfUV9weHhsa3Zlamtrdn1xcnRzYW91YnR7gXh1eoN1gIF/gXmLhYN9e21/bGR4bl5XbmdodWt4amlqZVxgWmNpZmxxdW5aW2JrZGxseW5obG9hjZS4qKaLoaKapqSZpZyro6GEhJiskp6hiZqmmqmYg4Gbin6Wk4eOiomNcoN8j31+j4V7l45zcoNwlYV7fZKLhoaQhXh9gIaZpI58p6GLhpCQhZaDho6Yd3KFqYWOkZ2QiJ6eiIybqJ+gqoOJjpWafn6Jlq2oj5Kmj3dvnJCCeZFvfqiFcH2VcWtwfYGfjH+TjoxobV2Di4ycm56Oc5WLiHF0a4J2dIFZcm6GkYF9foxqXWpke4WEiYBgaXh6m3uCi4J1gYWCZ3eKhmthcHGBdl5yioGIj6aVhWWMj4Nud4uEcYaPenBmZ2V7g3qWW1xqZ252W3t5d3Vuc3OCZlxtimtrYlpaX1pZbHFcX2FaX11mdH56dG90Y2tra3x9c3t4dGRtdWhtfH52enx7enqAgH5vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbmxnc3lvaGptYIuLqrChkKOhmp6emJ6ZqKOjfoOZrY2flYicopGllX97mIR8kpmJiIaHinN9gIt2hYuBhJaKcW+AcpiGhH6ThIOGioF6gIOLm6CQgqehh3iOmImVi4ucl4WDeqyCkZeZlIqenYeIoaufoqKji4iTm5yjmZaqoaenoJKbh5WNe3eNjoSnfn+SkZKTnLKmm5WekI2yk5eEpYyMlZufiZCbgoiRimt8jnd4ZYKGkIt8iZ2Eh4uQiIiAhISQd3x5dJmhiIaJnoqElH59ioCAdW9zhIN/d4aGio+mkIOFjYeDjZCMfYiMipGDd2yChH16mWpyaGF0inB9end3b3Z0gV1eb4Zobl9eWl1dVGhyVmNcXGJsaHV8fHNvcGRrammAfG55f3FqcHBsZ4F7coKAeH99f4R7bYKMhnx6eHx9eoN5TmR2anJtcHpla2VjYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2SMh525npaioZiVmJmVmaShnnyAmquOno2GoJyLnpZ9eZSDe46ZiYaEhIZueICAcoGHfomUhG1rfnqXh4SDkH+AhoSGfYeEjpudkoern4Ryi5CGk5GLnZF9jXqqhI2SmJaPnJaHhpumn6KanYaCkZqZmJCapp+lnZ2QloCQiXZ7h46EpXt8jpCRhpiqoZ2TnY+Nqo6RgJ2MiZOanoKOl36GjoNveIZydWF/g4+GdYuYgYOPgoaFfoWElG55dXSSoYqLhZqEhIxzf4h8fXJye4eDe3iKjoOSpo+Fg46BhIqJineGiYqMfW9sfoF8bmhsbWdfen9ofXt2dHZ1e3dcX3B9bnVgY1tdXlFnblRlW15ia2l2en5xbGxka2pogYBsc4FsbHVveXCFeW6HgHaCgH6FdnGCjYh+e3t8f3uCimBpfGp1aGmCZWpjYGlcY3Vob2J0bWxVY3F5ZXB6enJlam1si4met5qho5+SkZaYi5qfn557eJ6nkZyKh6WUi5iZeXqMhXyJkYOMgoKCbnt/eHOBhX2LkX1raH2CmImBiI58foaEh32PgZCbm5GJqJyAcIyLjJOHoaKKhYx8qJGIkJKXk5aTeIyjoKCdlpl/gJCamJKMmqOho5mXkZt+jYV4gIOOhqB/foyMj3yYpKChk5mQj6aNj4GakYmTl5t+k5J+h46BdHSCcHZgfoCNhnGKlXyIjHGMf4KFho5od3F4i5iRj36XfYeKcoGGe3xxeHqKhHp5kIyClaWTi4WQe4aHh4V2goSJiHtmcnx/eXtxbGpmX35zaHx1dnN8c4BqXmBzdnB3ZGNZX15Sa2lUZFlfYWhqdnmBcWZrZGxoZYCBa21+aG9xbH54h3prjIFzgYF+gXR2go2Gf3x6f4F9f49qcoNuc2lih2hsYl9xVnRvbW5geGhtV2p0dmN1entyYmpveYmNnrKSpaWcjpCYj4adoJudfHaloY6YgIyiioialnh7hod+g4l/iIKBf3F/e3R2goV+ipF4Z2N9hpeKgoqMeX2AjYN5loGVmJaNlqCbfnCMgpGUhqabh42Jg6aVhZOLlpeTkneRnaChmJOWeX6OmJeOlpqdpJ2YkpSbeY+FgneElo2dfoGJjYxyl6OeoZOZjo+ijIuDlpiDkpaZf5iMfIiNgHZxfW56ZIB8ioVwhpN/kIJsh4KBgImEZXVve4aSl4x8k3eKiHt/hXx7cX53iIV5hI+JipeilYGDi3eIhIOCd3yCioZ3YHl4fXR/eGdsZWF/aWp3c3R1fXF8YmNhc251cm1hWmFeW2xlUmNYYGFoa3Z5hnFjamNtZWh9g2xodWhscGmAfYJ5bZCGcYCEg390fIOMgYB+eoKDfnyQbXaJdHRtZYpsamJjdVaEaXFuYHhnbGJqdnBmeXx5cV9xbIaFj5yul6aono2Nl4eGn5OXmX14qpyKmXqXnYuMmJB5e4CLfXyDfICCgXh0eXp0fYCEf4mLgGRefYuVh3+Fh3R9fop/fZiEl5SXjKSimH9zh3uUkoqnj4yOipKgkYORkJSXkYuBj5igmpKQkHN/jZKUiZ2dnqaYmI2VlnONjoprhZePmXqHiJCJb5edmqOTlYqNnoyGgpKcf5KSlYeZiHyKiYF5cXprdWx8fot+bYWSgpR4cIKDfX6Kf2RyaXuAlpeEfo1zj4iDeIZ9dnd/fIWAfIKMhIyUpI94hIJ0iYd9gHR2gYmEb2F7dXpxfW9ib2Nke2Jub3ZzeHdzdGF1YG9sdW5vXFxfXl5rXlBdWGNhaG10e4hrX2pmamNod4huZmxoamxogX17d26QiHOBhIR9dIGGiXuDfXqBhH19jnJ6i3h4bmyHamhfaXJih2hxb2V2Z25sYXlpa317eHBhd22LgJmZqqCjqJ2KipGGi56LlZh+d66ZjZd9n5ORlpSId317inx7gHZ4f4BwdHR7b4V9gYCKf3xhW36PkoaAhIRzeoCHeo+SiJKRnJOlnJWCfYJ9jouSpImOio2Xmo2FkZiTlo+KiIySnZOPi4xug4+PkYiemaKhl5aJlpBuiJmDZoWYjpN6iISQinCVmpSikpKJi5mMgn+Qnn2Sj5KMmY57ioSHc3J1a3BudXuLdG6GkI6ScXWAe4GBiHxkcGx4fZmTfYSIdJCKgHOHeW5/fYCFe4WLiISMlaiMeod8fouFeH5xcIGGhGNoeXR1cHxiX3Bha3RecGp7eXhsc3BleF1ubHNtc1haX19ia1pQV1hlY2dxcX6HZl1paGdiZ3GNbmRpZ2RpaIF6d3VvjoV0gYKDe3WCiIV4hXx4g4V6gIl3f4t7enJ4g2prX3BodIBqcm9tcWdvbGV8Y26AendxbHd3in6il6GooKabh4yKgpCdh5OddYGqlZOOh6GMlZOQgHR7doV4eX9yc3uFa3Jwem2KdoCBh25xW1h+kY2IgICAd3WBgH+ghpGLkp2YoZWYeIqAgY2JnJ6Kj4aSl5aFiZWZj5aLi42NjZ2KjY+DbYmLkJCKnZahnJiUhZiHaoSjgmaFnYqQfouDi4F3k5iRnpGQiYmVjX9+j5h8kY2PjpqSfIqAgm51cGxtb3B7hWlzg46YinF3gHSCiIJ4ZnJudYGZjnuIhHqTkXl2h3NviHuFi3qKhYKIjpujh3uDdYGLf3h5b2yBhIJecnRycHB4Wl5wYHBqXm9qfXpwbW1qbHZgcG9qcW1aWGFhYm5YUVRaZmdjdm+EgmJda21kYmZrkm5gZmZfZ2uBdXJzcIuAdX+DgHh1gIuAeYV/d4eGd4OFfIeMf3t2in9qcWN8Y4Z8bnFsdGpob2x2eF9xf3l8dHV0gIJ+pJWarZ6nloWNhH+XlIOQoHWLoJSThoubjJWOi3pyeHSCcHKFc3F1iGtvbXVtiHaDfoBtblVRgauVh4J4gHdzg3qCoIKSgpOTmJyTmniSe4ONk6Sak46JlZiShIaXmYyUi4mPj4iehI+KfHOLhYmOiJyan5qWlH+TfmiFnIdnhaCHkYSRgolxg5GXj5uOj4yMj414e5KQeo6LjJKWjHyIfIBrdmpua2xse35hen6OloJ3eoB4g4x8eWdzbHOHlYp+iIZ7k49xeYNvdox6iYt6iH2Bi5CenYR8e3eCi313cWpsgoN6YHhwbmxydFZeb2JyYF9sbnlwaG9mZnN0aHBrYXdlXVZmYGByU1FOXGZlXXlwiHxfXGhyYmJlZpJqX2hkW2dwfnBrcXSKfXZ8hYB0dX6MeXuGgXiIg3OGhX6MjYR7eZV4ZnJqg2CIfW9va3pgam50f3VfdH14hnh0c4V8eKCPmbGcpY6Cin+DmoeAjJ5/i5qTj4WImI6Oj4R3dHZzgHBvhXNwcYNvaml2boNufX1tdXNSTYLfyJLWk3xwdYN2hKCDk3eUkZmckJl7lHOFkJ+hk5OQipKbk4Z+lpaIjY2IkYyInH6OgHh6jX6IjIqcnJ2blZN6jXVniJGGbIiihJGIl4KFY4yRmY6VipeLjYqLcXqUiHuOiIqTkYl5hXx+bHtlcm9ra3l5XIB5kI6Ae31+f4aOenpocmpzio+JgoWEfJSKa31+bn+LfouHfIR5gY+VmpmKfHZ4g5B4c21ncYCEbWp0b2hqdG5TXm9kcFlfa3F3ZmtqYmZ4cm9wY193YGBWa19edlBOS2FnY116cIl0XFxldmBhZWWOY2FmYlhpc3NtanF2jH10eYaCdXZ+i3OAhn96iX5yiYeBkYuIfH6YdmVzbn1liH5vcGuAWmxueXlzYXZ6e412cneKd3mfi5uum6CQgoV3iJV+fYqdh4WgkY+FjJiEk46HgXR3cHlxboRvbW5+cmRleHB9bXp9amhrY6Sawdyu76FzbHaEdoWjhpJvlpGVoJWcgZJyhYujl4mOlYqQnZaDgJWQhYmPgJGKiZZ+h3t1f4l4hoSNnJuYmY6Pdop2boWIin2KooOQiZyEhV6Lk5eKjomOioqEiW17loF9iIWJkY+GdoV9fWt9ZHh1aW54c1iIepKHhXl+gICFjH54ZXJpf4mOiYKCf4uWhWuBdW2HkIGPhH6Cen+QlZOYj3Vzd4iNdXNxZ3V6g2J0bXBiaXZnUmFxZ2xVX250eWFyZF9ofXByblpjcmFiV25ZXHhOTUxkZ2Jed3OJbVxcZHleYGRlhWBjY15ZanJrbmtyd4x+dHeEgXh3e4lxg4R9foh7dIuJh5aGjH9+l3NodXF5bYt6bnRwgFdxenZ5cWV3eYaMaHaAiXJ/nIeZp5yjkoV9cIyUeHmLnYSFoY2OfJaNgJqIhHtzd3Bzam+Ba2ltfHVeYXh3e3F1e2dgZHzr2rXJw9yIc2x0gXeLm4mOapiQj52Wk4GJcYWJoI2Ei5WKjJiTfI2TiIOJj3uQi4WPgX92eIOEc4eCk5uXlJeGjHWHf3CEgYmGmKGCk4ueg4lhg5SPhomGiY2HgYdqfZSAfYOEiY6NgnGGfn9xd2h2cmlzd2xajHySg4V9f4OAhIqCdWFza4iBj4qBfn6RkH1tgWt4hY6FkYN8gXx/kZKQlohucXqMhnVscWxyeYFgdGluXWt2YFJlcWlmU2BwdnRgb2BdaIJxc2lXZ2hiaVhtVlt1TEtMZmdfYnJzhWlbXGV5Xl5kZ3tgZF9dWWtuZm9pc3iKfnNzgX56dnqIc4WDfICHdneKho6ZgYyCe5N1bHd1eXiTdG54e3xYeoZxgG9neHeSgmN2hoVxipaFmaGaooqHc2+Ti3J3jpx9ipqJiXyff4Saf4F4cnNub2RyfmhmbHd4W195e3txcYBqYWdhf9W2jpCmeG5xd3xxk5GNh2qZjomckoyGe2mHi5mGgZKRhoeYjXyNjYGBio17j419iIR6dHuDe3GGgJaajpOUgYh1g4V1g3+KkpydhZSOn36IYX+Th4SIhImNf4CDZ32RgH5/goyOkH5tgnyCdGttd3RzdnVrY42Bj3+FfnyEf4SIfm9fcnCEe46MgXx+kIh5cINmeYKKhouCe4R9f5OOj5KDbm95jH51bW9rbHt+Y2hralludlpSanJpYlFicndsYmVeWmqDbXNiW2dfZGxgblVbcE5IT2dlXGducYBsW1tjc2BcY2x3ZGVdXVprbGJtanR3hn9xcH97fXV4hniFgn2Ah3V5iYGSlnyJhnaJgXB3eXuEk29tfIF3XoN/dIFtaXp0lHNnc4d8cpKRg5qfm6CGiHZ2lX5tdpSXfoiRhIqOmn2MmnZ9dnFvbGphdXxmYml1elpfd3x6bXF/ZWRoZ1edj15xc5a8xIR2cZSJkH5zmIyGnZOMiHRriI+VgHuUi4GEm4x8i4Z9fImMf5SIdYmFdXZ9gXF1hoGelYaVj4KCcn+HdIN7iZecloaTjZyAiGV9koJ/hYOJiXKCfmd9i3t5f3+Hi499aYB9g3Zmb3h4c3ZzbGqNhYqBin95goCEg39qXnF3en2MiYV7gI9/fnKAaHiChoqFg3iDfICXjI+MfW5seol9d3RvaWh9d2VdcWNYcHNTVG5zaWJOZ3R4ZmBdXFhugG9zWWViXWptYHBPWWxSRFRoYVprbm17b1pbXmxjWmNvdmRnXF1ga2pjbGlzdoGDcW5+e390dYN6hIJ8gYV2fomBlpF4g4p0gYhzeXl/jpBvb3yBcWmBeXp+bW18dpVraniEdGuUjYWfmKCahYhufYx2aniYj3+CioKVmIp6j5ZvenNxbGpkYHR6aF9lcntaYXJ8eWZwemFlZY6xsndKYlqk2dCXcnuRi5F4fpWLhZmSjYZvbIaSkXp5koaBhJmKfId/eHiJioSWgG+Kh3F0fXtqeYWDpZGEk42Df29+gnaCeIWamJOLko+UhYdvepKDfYODiYNvgnhogIV4cn9/g4qHfGV9foN1Y3BygGh4cW91mI2Fgop7dniAhHmBaltwfHKAh4SJfYWIeohygG1wg4aOg4Nyg3iAmYyNhHdtbn6Ef3d6ZWhqfXJgWXdaWXJtTlhyc2ZgSm12dGFdW1tZdH1yb1dnXWZqcF9vTldpUj9ZZ19bcGpneXFcWllrZVljcHlfaF1eZWxoZmxpcXd/h29tf32AdXCBe4CBf4J/doGFiZeKcYKNcXuGfXp6hJSMdWp6f2tvfnR/fW9yfHuUcG+Af3hmkoqCoZickoKFZ4eEcGh6l4l+f4WCmYqBfI2NaXhya2xmX2FveW1fYm95XGRsg3phcXZfZWXV676LMjo+i46AcnmFiI6NdoSYjX+Tjo1/bmyFjYx1fY9/hYKViHyDeG52h4WDl3duiIRsdXt0ZnmCg6iMg4+Mg31uf3R1g3mFm5CLj5GSjIuGfnuSh3iAhI2DbIByaX9+eG18e4GKg3hieYSBcWRxaH5tdHF0gZuLgH+FfnN1foBzgG9ba310eImCinuGf3yIeHlwa4iCj4OJcYF4f5aKin50bWp2gIB1dVxpaXhxWVd9U1pxZUxbc3JlW0pwd29dW1pZXXR+dGhZYltnZW5iaUxXZlE9XmZdXXZmX3RwW1hUb2RaZHB5WmheYGdtZ2lsaXB4fY5saoKEf3lugHt9gH+CenWCgYyThXCAi253foB7e4iTiX9oe35rdHxyhntzd31/jHp4hH58a4yMg5udloyBgGyNfmtpf4+Ne35/g5SCf32KiGt1cWdoY1tiZ3NvX2FsdGFocIl6YXN0XmNkm6CQblw1Wa+1dWqAiX2ShnaGmId1j4yKd3BshYOHdHmJeIl9k4h6fnJndoh+fZdvcIZ9aHd5bmV6iISlh4GHjYp+bn51foB8i5iGgZOQl4iLhIl8j4hxe32FfGl+bWqAe3pqenaCh4ByYHeBfnFkcmd1gm11e4WVkYF8gn9vd3l8dH5tV21+dnOKgYZ3h3WBiXl4cm2IgI+AhHJ+fH2SiIh6bm1pbYKBdW5daGZ0clJbe05ccVxPXHJvZFZLc3hqV1lZWmFxgHRgXV1gZmRoaGZOWmhOQWFkW2B2YVx1bVhXUnRhWmRucldqXmJoa2dtbGlwd3ySbGmEin19cH5+e4F/gnp3gICJi4Rye4dvcXeDf3uKjY+Dan57bnh5d4p3fXiAgod/g39+em2FjIiYo42Eg3t2jHlrbYSJknl9e4KRgIB9ioNwcXBjZl5ZZ19wcGBgaHBmam+KdWF0b1thZGl2e3++nKajyLhyhYNzlH14h5SEdJGNiHJzcIR7g3N1hnSId5SJeXlxY3eGeYCTaXKEdWZ3dmNqfIOInoKAf46OfXJ+c4N5f5GPgneVjZSPh4KIeomJa3h5fnVoemlrf3lzaXp2gIN9aGB3h35qanNoe4BpdoGMkJR+en5+cXt2e3R9YVV1fHJziYOCfIJwhol3eHBvgoKLfn14fXx1jYWDdmhxaGyIgnJwXWhjdG5LZXZMXm9VVFpzbWJRT3R4YVJXWFxhcIJzW2BcaGVkY2pkUFtxSURkYVxkcV5cd2hVVlR3XlxlbmhWbF5hamdlb29ocHd7k25piIt5fnJ7fnmCgYJ8dn2DiIaDcHaDcm13goN+iYuUf3CAfHh5eoGLdIN4f4GBgoR5gHZvfomLm56IfYZ6d4d8aHSGjZF6f398iYaEdo+AZ29tX2RcWGVZbXNhYGFxbGxoiW5gc2lZXmRtgHep2qrHhoeycop4cI11e4eQgXqUioB1dHV+d4BwcX5thXSUhnh0bGB6gXmIjmZxg29ndW5bbX2BkJOAgXmSkn14e22GdYCQi4NzlYqQjoeFhXt/hW11dn9uaHdlbXx2bWp3dn9/fGFieIZ6aHV1Y356Z3SGjoyVe3SAdXGAenxsf1lVcn1vdIOGf394a4iGc3hqdH+Dg316fHd7coqAfHNnc2Vti4RtdFtqX3ZlSG5vTFtjWFdWeG1iUFN0dlhQVVheYHGEb1xgY21kY15uYlRdckdDZl9dZmheWntiUlZcdVtbZ2thVmtfYW5mZmxxaHB2eI50a46NdX92eH13gYOBe3R9g4iIg29xf3RxdX6GgomNint3f3iEfH2Fh3iHfH2BfoSAe35zdnmMjp+MiXqJd3WDeV5+hpqNeYeDdIaGhHeJe2JubFtiW1thVmp0Y2BbaG9wZ4dyYXFmV11ja398ys6HuaJrbW6LbXKFcn2Fi397koV6eXR5dXV7am11Y4R2koJ3cGdefIF5i4llcYFqanFjWG17hpyJg4Jzl5R3fntth3CAiYqGcJaOkIiFi4N6eX5xcW99Z2hyYm14cmpscXd9fHpdZXmAd2l1eGaCdmd0h4yNlHxyh2lufoB5bXxdV3B9bXN/inyBbm6Jf3B2Z3Z+gH6BdXtxenOGe3lxZXJhboyCbHNYa194XElvbE1XVl9UVXxrYU9UdXJRUVRWXmJ0hWhcYGtqZmJZbmFYYnBHQWhdYGZeXVZ7Xk9WZHBaW2poXVdnYF9yZmpocmdwc3eGeG6VinR/end+eYOHgHVzf4aFjoJwcHt3d3V5h4WHjIZ6fH91i359hoSEh39+fn2Hf3x4dXl3kZOffox9i251gHlkg4iXhnSSim+FhYJ6g3RjbmpZX1tdXVRnc2VgWWRycmeBc2JrZFdbYGl/eL6ue5+3bmJzh2h0fHJ6g4d7fo2AeHhzd297dmVqbmGHdY6Bc2piXn54eYqEZnF9aGprW1dveIqjgYV/cZmTcYB4dIFtf4GQhnKUh4yHg4iFfXl0cm9oeWFqbWBtdmtna2x5d3p3W2d9fHhlc31uhHRldYaNhpV+cItma3qDdGx0Yltue2t0fIt6gWZ0hn1tcGd0fnd9fnJ7a3l7gXl3cGVsYW2Jfm1uVmtgd1ZLa2xPUk9pTll8Z2JOVXVrTVBUVV5ndoNmXWFwaGdgV2ldXGtoSkVqWmJkV1lVeVpOV25qWV1sZVxZZWNedGZsZHJncnB0gHhwmYV2f354f3yFh311c4KHgJWCbnN4enpzc4WHiIiEeYF9do9/fYSJjoOBg3t+i4N7d3x3d5qdl3qKg4dpdn58bISFlIByj4JxhoJ+gn9vZmxnV11bXFpTZHBlX1hjcnVpdnBlZWJXXFxogHBvcoBziWVleX9qdHZzc4OFeIGEend0dW5renBiZ2tnhnSNhG5mXl98b3uJfmhsd2ZpZFZXcnCNp3yEfHaWkHN8cnt5bXp6kIR2l3uHhoKGg311cHJtZ3VdbWhfbHVkZ2Zpem97cllngXZ1aHCAeIJ1YXeFi3yUgW6Lam16gXFlc2VgbHlncnaJen1hdYN2aWtxdHpweXhyfGV+fn54dm5jZWFthnxta1ZqYnFUTGlrUExOcEhee2ZhTVV0ZEpOU1dhand+ZV1nc2llX1ZjV2JwXUtLa1hjYlVUVXNXTVh1ZFpfa2BcWmNlX3dnbWJwaXNvcX51dJmBeH+AeH9+hYR6fXaCg36YhW5ydHt6dHGFhY+CgHqLdXWRgH2BlI6AhYR8foyGen6Adnujpop5iIaFbHV8e3WEgox6b4VzeoV9goN1bmpoZVZdW1taU2NuZVtYYXR7amltaF9iV19baYBpa2+AZ2xhaHp5a3R0dG+GgnuAfXZ1bnpoanlqX2VuaIF3kIRnZVhid2l+h3pvaW9mZl1VWG9oj6d2gXp8kY54dW9+bnF0eI5+d5R0hYJ/hYh2anJ2Z2hvXG1lXm1zX2dhanhoe21bbYNzdGpvgH55d2B2hIR4j4VziHFweX9xY3BoW252ZHBzh3t4YXKAcGdpeHNxa3d2dHVig3t+d3VwY2NjbXx9a2tVaWJnVEtsaFBHUmxFYXhmYk1Ucl1KTFRZZGt3emVfbXBpZFxWX1Vvb1dKU2hYZl5YTVVsVEtbeV9bX2tdXVtiZWB6aGxhb291bm93dXqXfXd/gXmAf4eGenl6g32Bk4RxdHR+eXZ0hYiQfYB9kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ+AeoiHhGxygnl2gYCCdG6Hb32AdIqAanBtZGRYX1paWlViamdbWl91gmlebmxcYVZcXGuBZXJ0fWlqXWx3dmd0d3Juh3x+fnp2c2x6Z2l4Zl1kcmd6d5KBY2NUZW9ngoR3dmZoaWBXVlloZJCnbn54gIuOenBwfGZ4bnmKenaOcYN9fn+GbmR2c2RoaF1sYl1vb1tnXmx0ZXppXXSAb3JrcXt+dXVhdIWKe4eHgH93cnV+dGFwbFlwcmJxcYR7dWRygGxgbHpvamh6d3RwZIR0eXp1cWRhZG1zfmpsVGleXlVMc2NRR1diR2N2ZmFLVHBYSktXWGdrdnpkZW1wZmNaWF1YdmZUSlxjWGhYWUlXZVFIYnhaXmBsW15cYmRegGlqX290eG5vbnaDl3lygYB9f4iLhn51doZ4hox9dHV1gXl6eoKMjn1+hIlqdJaBe4qdfX6FeYB7fnyGiHNxj66MfHuGkH5mcYh6dH19dnJvhm17fm2PemJwb2FlXmVWWVlXY2ZrYF1dc4ZpWXFuW15XWlxse2Nxd3ZtY1ttc3RodXZxbYV5f4F5d25vdGVodGVbZ3RmdnaRel9dUmVmaoKBdH1hY2lcVFheYmOQpWh5dIOGkHhsbnlnd2x7g3l0iHKAeHt4f2hldm1gZmFfamBddGtZZV1vbmJ6Zlt4fGtubnB3eXR0ZHKDkn+Hgoh6dm9xfHJhd2Nabm9hcHGBe3NlcYBkXm12aWNmeHpzbG2BdHN8c3FhXmVtb31laVRoWVpVTnlgUktaWUhidGRhSVRtU0lLWldpbHJ7Y2xsc2NhWVpbYXdcU0tjXVhpU1dIWWBOR2l1WF5hbVtbX2JjXYVpaGFueHlsb2p2gZB4bYJ+gIGSiISBdnWJdIuGdHF2doF3fH1+jJCAfpN+cHiWg32ZknmAgHh5fn9ziINzcJqie3uAiZV5ZHWIeXN5dmtzcH9seXxwkXJecG9gZ2JsVFpZV2hjbWZcXHKJZlNybltZWFhgbHZkanVqal9bbXRxbXR0dGuGfX+AfHdvb2xlaXFjW2tyZHR2j3NcV1RkYHF/fnGCXGFjXVNaYFxjk59lcnGEg5B0a2p5bG5veXl6cYB3f3J5enpkZnVnXmJbYWhcXndoV2JdcGhheGFbe3ZqanJvd3RzdGlwgZSDhn6EdnJqcHxtZXZXW2ptYnBygHpzZW9+W2BvcWJeaW98bGtzfXJweGtwYFtla217YWdUZ1VYUlF3XFNQWVJIY3NiYEdWa1FIT1pVa2trfGVtb3FhW1pYWWxwV1JPZldXaVNURlpcT0lydFhfY21jWGFgYV6MamNkbXl4a29pdXmGe2uDfYCFmXyChHl9iG2PhnFvd3p8dIKCfYuPg4KWdHiCk4aBn4l1gX+BdH+CcIeCdW+il3R7houHe2Z3i29ufHBmeHF7bHN2c41rXnRuYWdla1JdW1ZoYmxsW1xxjGROb25dVlhVZ2l0aGN0ZWVdWm51bnB1dXpriH2AfYh3kHNjZWtuYVxubWNzeIdrWlRWYmN3fHxwhVxjX2NUW2BZYpaVY25wg4SKc2pneW5lcnVxemt5dHRuen51X2ZzY1teV2JkWWF1ZlVfYG1jYXFdXX5vaGlzcXNwdXVrbISTgYl7hXFyZm57b3FuU1plamVxc4B2c2JsdlVicWtbXm5kfGVrdXxycnJqbV9ZY2lqeF5mVGVVVlBVblhSV1RQSGVyX2FGWGpOSFdUVm1oZHxpa3dqYVdcVVt0ZFNSVmhRWWZUU0haW1BOeHZaXmVsaVpiYF5ej25iZmt5dW5uaXZ2f35tg4B+hpd7f4eBiX5rk4hyZ3SAe3WAg36Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Ld3hue41gZHxxZ3lzeW1tcXaDZ2R8bGNmZ2hTX19VZ2Bsb1xebo5oTWltYFVWU29mc2xleGRlXVlxdW1ye3hzbYl8gXece3psYmVsbV5gbmplcHl+Z1pWWGBrd3t6b4NeYl5nVllgV2OciGJrcYGGfHdranZsW3VwanlpdXJtbnuAclhqbl5ZXVZiZFhlcWNUXmJpYmJtWmB+a2Zrc3VubXd2a2iFjH+JeodtcWZve2xxbGJYX2hob3OAc3NeaW1TZXBkVWJuYXlib3V7dWpvbGpfWGBmaHVdZVZiVlNPWWZTT11PT0hlb11jR1ppTUlfS1htZF94aG59ZGBVXlRddFtUUl9mTl1iVFNKXFpRWnV1XF5lbWhYYmFbXo5xY2dqd3FzbWd2c3mDc4GDe4iNfnyKiI55bpCKdGxzgXN/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2Njo6OjY6Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQkuSmpmZmZmcW0FERERERTkvMDAwMCxIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzP5OenJycnJ9SMTU1NTU3JxwdHR0dGDqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGjY6Ojo6OjoiGhoaFhYWEg4ODgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpORi5GNjY+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2MjIyNjY2Njo6Ojo6Ojo6Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6FjYeHjIaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkIiMhoWOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCQiIuHh4yIiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjJCIjIaGiIWJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4yOioqMio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Oj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OTlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlZWVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KSk5OTkpKRkpSIjJSTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkZCSkZKTkHeMk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKQd4mSkZOAdY6SkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkJJ5bo2SjnR2jJGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPkX9neJKHdXeLkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6PgmFphnpodIqPjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI53YGtiZ2Rui42NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4qLh2RvbltqcmyBhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dndwY3BwZGtycWRoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGRlaW1zcHJ1a2JjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXWBhY2xub29rWllfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST05QXmlmbG5rZ2NRUFNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTk9MTFVkbWZqbWtpZlxTT09QUU9OTk9OT1BOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tHSU9VYGhuaGtsa2lqaGRfV09OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFRFJdYmZoam5sc29qaWpsa2llVUpKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4+PktWXGltbG55c2pqbGZbUUpEREVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs7R0o9Rllrbndwa2lZR0RCRUVER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7Pj06O0Zbbm1gSUE+QUBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5Ojs6NzhWZD84ODw8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PT09O0VZOTs8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtdbkA+REU/P0E8RFs9PT07Oz0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213SDg7Oj09QTxJYDw8PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PT1JTUZGdndNNzg4Ojs+PlVnQDs8PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnZ3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3l8d1Y8PT89PT5FaXRLOj0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VASHJ5a2KChIODg4B9XT5AQ0BBPUlzfFk6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg399hHVMQUNFQD8+WXyAXT9DRUlKSUlNTUtFQ0ZHR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFcUJERURDV3WGh4d+WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn59fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SKbEFBVnSHiYeHh4iDV0hMTUxNTkxJR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN2d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVmyEh4aGhoeIiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMS0pLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVYGDhISCgoWGhoSChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4OEhYWGiIiIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqMjIuKiYqLjIlUOjg2NTY3NjY2NDU3NzM1Njg6ODc2NTY1Njc2Nzc4OjY3ODg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCCg4ODg4OFiYuKiYmKioqKi4mKi4FHNjc2NDY4ODc0NTc4NTY3Njk5NzY2NzY1Ojk6Ozo7ODk4OTg3Nzc5Ojk4ODc4Njg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISEhomKioiHiIiIioqMiomJjHo+OTg4Ozw9Pjk6Ojw5Ojs5Ojs6OTk7Ojk9PT0+Ozs8PTo9Ozk7Ozw7PDw5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3Vzdnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFAQj5AQkBAPz09PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGREVGREBCPzxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRleEgoOEhYWGhoeJiYiHhoaGh4mJiouMjYyMi4qKiFZITUxNS05KSUtJSUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf39/gICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dKWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BOUE5MTktKTEpJSUhKRkRGSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozw9Oj5APj9AQ0ZJSlFfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNck5ST05MTExMSkhHRUlJREpIR0tKSEpHR0dLTE5MTEhISUpNUU5PTk1PS0lHSUpISURJSEhGRkdHSEdDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLX1JSUE1OTUtKR0VCR0pHTEpGS05LS0pKTE1MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0VGSUZFRUJBQkJcb3J3eHl6enl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418WFZSUlRST0xLSkRFRktPTk9XVVFQT1JTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toV1VrYUVSUVFQSTs7UlRSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT05SUFBQUUtMS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdGRkU/P0FBRUFDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlbY2BWWWJyXV1WXVpWRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enl6e3p7fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiot6bnBYWlxbUlNSVlZUWlp0g1lVfZBgXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlUVVRXUlFXVWKWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9MS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x9fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5UZFV/UlBRTktSVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV2dXNzd3p6e3t7fXt9fX1+fX19fn1+f39/f39/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXVtZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPUNJR1ZASE5MR11pUEhGT0ZERUZJR0hDREhHSEtHREJBREBOUU1SZHJ0dnVzdHV6fHp7e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYJrTUc/QDo7PkBAPz8+alFLYUVGSElFQj9HTE5HTVFVSUJFPz48PTw9PT89P0FDQ0A/PD1CPkpNR1VudHR1c3R2eHp8en17fH19fX18fn19fH5+f39/gIB/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsampmYFtRUlpcWV5KSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT88Qkg/XHN0dXZ1dnh6fHx8fXx8fX1+fnx+fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUVFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGRkhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RV1BNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fn5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFdZWlZYWFZYWV1XWFhoc2tdVmFza2FhX15kYV9eWVRRTk5OTElISktJSUZDUVBTW1dUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTk4OTc4ODU3NTc4NTk5R25ydHh4eXt7fX59fXx7fXx+fn56fX58fX9/fn1+fn5/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxPUlJPTU1OTk1MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8/PTo4ODc2NTk5Njc2NzVXcHB0d3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEpPUlBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I1NTY2OmRvcnV4eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJRkxNUE1HL0VfUj4zPz5qb2FSUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dnp7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJEREFAR0hHSEZGSEpNTEVHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnV5e3t7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9PTVFTTFRVVFhXVU1MS0k8OTg3Oz9APjw9QEBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hQUmJcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0hKS0xKRkZGRD9CQz48Qkc/Qj9BZHB0d3t6ent8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hERD05ODc5P0I+Oz9CQEA+QURJRUNHR0lGSUVCQj8+PUNCQUdJRE1PYmVRTU5OV0tMTUtMTU1NTEtOTlNkTkpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p8end0eHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hKRD9BPTk5OTo/Qj88QEJCQURFSEtGQ0hJR0dIQ0M/Qj8/QEE+REVDS05SVExKSU1UR0lJSkxKS0xJSkxNT1BSUEtHQ0xHQ0JKSkxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR4eXZ4anFvamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxSEtER0hIR0pLSUpLREdCPT49Ojo6O0FCPz1CQkNDSEdKTEpESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESElLTUhKTEhJSktKTVxSSEhETkZBREtKTU1QTUtNSktGR0dKTU5RTkxibWl2dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0NGRUdFRkZHRUdCQ0A9PD05Ojo6QUNAPkJDREVJR0tKTEZJSUdGRkRCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NSElMR0ZHSUlMTktJSEVOSUJGTUxOTU9NTk5NS0lISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUNDQ0VAREI+QD86Ozs9Oj0+Q0E+QUNFRkpHSkhLSEdHR0ZFQ0A9RUVCPkJDQ0NFR0hJR01QSkZGR0tOT0tGSEpGRURFSUpIS0lGSFBLQ0lNTFBNT05PT05KSkhNUlVUUk9XZGBhbWdwcm9yeXpnZWhoZGlsZnFsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEdFRUdDQkFCRD1CQT5BPTk6PT86PT5AQj5AQkRHSkZKRklIRkZHRUNCQUFGRkNCQ0JERUVHR0hGTFFMSU9KSkxMSUdIRUdGRENJSUhLSkdLUk1CTk9NUE9PT01OT0tLS1BVV1ZVVFhfXlxpYW1pbmhyc2JlZmVkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQEREPEFAQEM8ODk9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSElGQ0lKSUtNS09TTkRRUlBRUk5QTU5QTUxNU1dWV1hWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlveU1IR0hIQkJCRkU8P0JCRDw3Oj4+Oj46QEI+Pz9CRUZERkRESEZERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BTT1FNTlFOTVBXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TklIR0lDQUNIRTxARUJEPTk6Pj49PDxBQjw/PkFCRkNFQ0NIRUNFRUZHR0dJRkdLSENJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OT1JVVk9LVVdTUVNRUkxPUVBPVFlaWVxaWVteXl5gY15cYWNrYmBkZ2hyhWhnamZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2b3RNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QUFGQ0VFRElFRkVHRUhIRkhISUtJRUpISEtIRkZMSUhISkdMTExNTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9TUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkVGSEZJRkZESUhHSUhKTUhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUExPUFJUWFZNTlRWVFJSUVBMTlRTUldbXl5fXV1gX2BhYV9hY2ViY2hiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93S01MS01HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHREdJR0hKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUVdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSEpJSUtISkpOTE5MSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsa1Rfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDRENFRURGQkZGR0RFS0VFSk1NS0xMR0dNSUdKS0hLS0lLS05MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWZlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFREBCQkA+Q0ZHQkZDRUVGRURDSEhHREVLSEdMTU5MTU1GSk5ISktKSUxKSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dIRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFR0tKR01NTkxNTkdMTklMS0lKTUlKSUpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhNR0lERURDQUI9QkFCRkRIR0xIRUNDSEtISEZKTExGTkxMU1JMR0xMSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b250c3ZzSEtISUJFRUVBQD5EREJHQ0hJTUlGQ0ZKTElHRktNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1NSUtLS1NrYltpXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVERkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSkpLSUhJR0tLS0xHSEtLTExMTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVVlaXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQ0BDSERGR0NJS0xIRkRHS0xIREdIUEtMT0tMV0xJRUVISUpISUtITEpIRkdHSUdISUVGTElKS05MSVBcV15QXFtgXk1YWVNcXGJeTVlaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRhYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRUxNQkREQkVJRUdHRktKS0hFRUpKS0ZFSEhQSk1NSk1TSEdFQUhGSklLTElMSkhGRUlGREZHRUVKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2JbYF5bVFhXWV5dY2JjYWNmaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDR0hFSEdIS0lJSURGS0tLRkZJSk5LTkxITE5HSEY+R0dMSUtLSkxLSUdFSURDRERCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVZVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VDRUhJRkdISEZGSkdIRkhLSUxEREtKTk1MTEhKSkhKRz9HRk5KS0tNS0tLSUdHQ0RAREFISUI/SUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFJbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0ZJR0ZGSUxKTkZES0pMTkpMSUtKSElGQkhJUU1LS09NS0tJSEdFRD9FQ0hIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVtSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUdGREdNUkhDUUpGSEhIRUZLSk1QRUZJSktOTExJTExJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUdFRFdVRVxUXlNWX1hOVFVOWlpNSktUYGFbX1heXmFdTlliXGBgX2JjYl1hYldfX1RQTk9QWFJdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUENWXklHR0hERk1KUFBFSUlLS05MS0tMS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENBRUZCTUhCS0xQT05MRk1GR0lKSEdMS01PUElMT1BPU09MUVNSVVpZV1lYWGRXT1NUUFBOTU9VVFtYWFpdXGBhZGVjZ2NrbHBzcnp5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTEdISkhHTUxRUUlMS0xLTk1VTk9LS0xHR0tQU1NOUE9OT05PSEtGYEVEX0xEZmNFTVtJXltybU9NVW1ZTENQYFVrV2dKXVhVXkRNUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYU2tTVlZUW1xbYGBhYWFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSEVHRkhFRUtPU0lKRmBTSEpPSklPTVJRS01MTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlF/UUl8WVlxc1hQbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVlh/anR1dV9fdl9YYVtcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTkJETExGSUtFUVZMS09JS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFpSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3J7fG99eW9/cl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOS09JUVJUWVdXUVRQUFBRS0hneGxjeHJtW0tNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp+bHh6f29ob1l2dmp1dXCBYHJnfGlseHxvXl9fYmFbXmJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNDRlBQSEpLSktQT09PTVBaYFpYS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cWxtXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hmZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHNvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUVdcWFVNVVlVZlhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfW3B6e15genNjcm94cWhkfGlye11VTGxgdnVraXV7e21+eGt8cF1eXmJbX2JkZGdlZWViWmNjaWtrcnNyd2dsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbWttT0hKS0hJSEhSUExOT0xLUlJST1NSV1JWVFBXW1ZWVFRUYWBQTk1LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhZUk5QVVRYWFhbWlVSU1dbV1hXWk9TVVdYWFJdWVddVlRQWVJXV1dXWF9bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZWFBPTE1WVFBOVVNOT01MUVBLSlJRS1FNS0tPUlVSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NQUVVVVlNaUU9TUlhWVFlWVFlVVFJVVFRVV1hXXVpeYV1cWlpcXGBjW11iY2RmZGRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUVBLT1dTUE5VUE5RTktTUE1PVVNOUk5NTlFUUFRRU1RVTktNT1FUVFJSUVZXVFlaW1lTVVJUV1dXWVtUT1RVWFVVWlVXWVVSUlhWVVdbWVpfXVVYXlxeXVxdYWFeW2JiY2dmZGRiWF9hYl5gaGVmZGFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RWllYV1haWlhZVlxqZFZYWVpXVlNUT0pOVlRQT1RQUFBOTVFRUFJYVFFRT01PU1ZOV1JUVVVPTk1RU1VVVFRSVFdWWl1cWlZXUVJXWFZbW1dRVFZWVlZZVFhYVVJSWFZWWl1ZXV9eVl5dXmBcXGBfX19aYmJkaGdkZGJZYmBhXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGReW1lWVVdRTE1WU01OUk9RUk9MUFNSVVtVU1BQTFBXV1JXU1NTWE1PUFJUWFZVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaV1dcXlpeX2BVYVxhYV5gYl9dYF1jYGNnaGRmYFpjYGFfX2VkX2BjW1pcW1xZWlhZV1xZXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUk9VVFNQV1xdXFheXF9XXF5qcXd5gGJcW1ZWWFFNT1ZTTlFRUFJUUktRVFRZW1dVT1JOU1hXVFNVUlJaT1BTU1ZbVlZXVFZaWF1eW1teVlNOVFVWXFxWUlRWVlhZU1RZXFVTU11YWl1eXGBgYFZiW2NiXmFjX1xiYWJfY2ZpZGZeW2RgYWBhY2RfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUVdSVFBbXl9eW2BcYFVcXWlqcn1zbGdcVVhXUE9SWlNSUVNSVFVUS1FXVltaWlNPU1JWVlZUT1dSU1pSVFRUWF1XWFhTWFxYXl1ZWl1UVU5WV1deW1hSVVVZWVlVV1lcVVNWXlldXWBdYmJeWV9bZWJfZGReXmNjYV5lZmlkZl5eZGFgYWFiZGBiXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBaVFVWVlRUVF5eYF9eYlxgVV1eYmt5dGx9bFpVWVVRUFNcVFVUVVRWWVdMUlpXXVtdUk9VU1hXVlRQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlRVVlpZWldYWlxWVFpeXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX19hYWBjXWBUXV9iZWV1gXpoWFlZU1ZTVlxYV1dWVlddWE9VXVpeXV1UUldTV1ZVU1RYUlNWVFhYWF1eWF1bVl1fWF9fWF1WUVlUWVpaYVlcVldYW1pbWVlaW1hWXV9fXmNiYWRkXGJcYGZhZGZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lWVlxgYWJjYWNfX1ZbYGRhX3p1b2hZXFpVWFRXW1pZXFpYWWBXUFZeXGBhXFRUWFBVV1ZUVldSU1VXWlpcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1pbWVpfX2BgZGJjZGViZFpiZmNnZmVeYWJgY15iY2lkY2dfZ15iYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXlxdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZZUFdWV1dXVlRWVFhcXF5gYF1gXFdhXlteXFteWFZYWFtbX2BcX1hZXVxdXl9cW11YW2BhXmBkY2RlZWZiWWNlZWlnZF5jYWBlY11laWRlaV9mXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1pYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXV5ZWFZXW1xgXl1fWlpeXV5eYVxbW1pcX2JeYmRjZWZlZmJaZGZnamdjX2NfYWZlWmlpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFhXXFlXXFtcXVpXXF1fYGJkYmJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRcXFhaYmVjYFJcWk9YWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX19cW15eYGJjXFxXXF5gYmJjZWRmZGVmZFxlZmhqZ2NhYlxkZ2BcaWliaGlmZGBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXV5fWlhWW19eXWFhX15bYGFiZWJfXVRcYGBjZGRmZWdlZmZlXmVmaGlnZGRgW2VnXmFoaGJoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7fHx8fHx8fHx8fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vb295fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJioJFPj8/Pz89dY2JiYmJiYuMjIyMjI2If39/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vbnmAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyNgzoyMzMzMzBzkIyMjIyMj5CQkJCQkIx/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV0dnd3d3d3d3h5eXl6eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8dnV1dXV1dXp9fX18fHx8fX19fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z3enh6enl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3h9eX19enx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x6fX15fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHt8e3p8e3d4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7en18e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHl4enp5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3JycnJxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzdHJxcHBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3Nzcm9+e29vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3VycnJwc5h7b3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXF0lXxwcm+IoHZwcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcnCUoXVwc52gdnBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxb4mxkW5+pKB2cHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXJwg7OpfJCvo3dwcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnCNsaerqK+kdHJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3NzdZ+iorOlm6N6c3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh3eHiApZ6apZ+ko496eXp5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX59fHt8fYqikJCXmpeZknt7eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fn1+hqappJ6gm5WVf39/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYCKsaipoqGhq6OCfoCAfn9/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/gICAiqeun6ijoKGlqaSMf3x+gH9+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Af4CBiJaqrqSbpKGgoaGhqaqfjoGAgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOChoyapqOdnJqglJmhoJ6dnqGfkoSBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGCg4qSlZiXmZiIkJ2bm5yYkImFg4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KAgYKDjJaZlYmRmZySi4eFhoaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIOCgoGBhJCXk5aZkIWHh4iIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEhIKDg4WRl4mEhIODhYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgoKCgYiRgoODgYKAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgICAiZOAgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2JhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf3+Nl4KCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpiKg4WEhISCgJObhYKCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSSkpOPjIyKhYSDg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fHyLnI2AgoGBgoKFlJSLgYKBgoODgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJOUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GXi4CDgYGBgI+TjI+BgoGCgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeKfYSFg4SCg4OCjomFjIKCg4KCgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJOSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn9+fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIuIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYKBgX59gYeGg4B+fn9+f35/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhoaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWEhYaGhoWFhYWGh4eGhoWGhYWGh4eHiIeHh4aGhoeGh4aGh4eHhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aHhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiYmJiYiHhoeHiImIh4eHh4eGh4WEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoeIioqJiYmIiYmJiYqLioiIiImJiouKioiIh4iIiIeIiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoSGhYOBgYKBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn18e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoeHhYaIiImIhoaHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4ODg4WJiomHhYeFhIWFgoCBhISCg4KCgoOBfn1+fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeIiYeIhoiHhomJg4OEg4WEhIWFhoiIhoWDg4KDhYeGh4aGhIKCg4SCg4SEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4OFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoeHhIOBg4OEhYWFg4OFhISEhIWEhYSCgoKChISBgoODhYaFhIKBgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSEhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Bg4ODg4OCgn99fX+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICCg4KAgICAgIGBgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59f4KDg4KDg4OCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn9/gH59gH9/gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf39/f35+fX5/fn+Af35/f4B/gYB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gYGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4B/f39+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn5/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl4fYGAgYGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/gH+BgH5/f4B+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/gH+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fH17enl5eXl5gIKCgoSDgIKDgYCCgYKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgYGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CJiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgYGBgYB/f3+AgICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42EhISEhJeXg4OEgX1+gYKCgYKBgoGEhoiMhYOCgoGEgoODgoOFhISFg4KDg4KDg4KCgoKDgoKCkpCLiIiHiYeGhoSGhYWEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGh4eHh4aHhX99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBg4WFhoaEg4WFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIB6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEgoB/h4N9g4F/goKAg4OEhISEhIKEg4SFgYSRkY6LjIuOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fX18gIGAfYaPgX59gn5/foCCfHyAf4KAgoB+fXuKgn2Af36BgICBgoCCgICAgYB/i5SPjIyOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt7enyCgIF+f4F8fn5/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fH18fH2Af4CAfoB+foKUko2NjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6BgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDg3+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf319foCAgYB/f359fX19fnt8fX9/f4B9f35/jJGNjI2Pjo2HhIaGhYSEg4ODg4KDg4ODgoGBgYGAgIGBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn9+i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+gH5/foSSjY2Mj42LioaEhoSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fX19fn6BgYKDgHp9fXx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fnx+fX58e3x8fHp7en1/gICEg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjIyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8foCCgYCAgH18fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoGCgYWGhYWGhoeFgYSRj42KiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+AgH9/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fH19fHx8e35+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJi4mFiJKPjIiJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8fHx8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gIF/fnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX19fX18fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkZCOioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX5/fnt+gZKMfH1/ioCNjH5+fX19fn59fn19fXx+fXx9fH19fX59fX5+fHt7e3x8fXx7e3t7eXp6eHl7fn+Dg4SHiYqHiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoGAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enp5eXl7e35+gIGDh4SIj46LioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+f399fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImOi4yIhIWFhIODgYKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGCgoGBgoKCgoGBgYODg4KFhoSDgYCAgIOBf4CBhIF+foB/fX6Afn1+foCAf4F/f4B/fn+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fHx7e3t8e3x8fH18iouJiIaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH2Jh4eFhYeFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKCgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn9/gH1+gH19fX6Af3+BgIGBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeDhISFhISEhYOBgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEg4GAf4B/gIF+fX5+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn59fX9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4CAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4KDgH9/gYGAgoGBgYCAgICAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f35/gH1/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYSChISFhISEgYOCgYOBf4CBfn+AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDgoGBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gH+AgH+BgoGAf35/gX5/gIKBgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX18foCAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fn5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHuAfoCAf4GAgH99gX9+fn9/fX19foCBgoF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgYCAgH1+fn+AfXx+fICAgYCAgICAfIB/gH5/gYB/f36Bf35/f399fXx/gICAgH5/fn5/fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fXt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIGAgIGAfn9+f399fH59gIGCgYCAgYF9foB/fn+Bf4B/f4GAf4B/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgYSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGBgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af35/gH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+eoGTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAf39/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgYCAgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH18fHx4eHV4eHl7fHx9fHt8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoKBgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICBgICBgYCCg4KCgIKBgYKBgH+AgH+Ah35+fHt9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGDgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgH+Ag4J/fn+CgYCAf36BgIF/gICBgYGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBfoCAgIKBgoKBgoKAgYCAgIKCgYSAfoGDgn9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4KChIGEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBgoKCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEg4SEhIWDhIKBg4KCg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKEgoKDgH+AgoGAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe32Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKCgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4OCgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSFhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WAfYF1gXqEf39/f4WEgoODgoGDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgXx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f35+gX+Af359gH1/gIF/gH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgYF/gYGAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiISGhIWFhYWGh4WFhYWFh4eIhoSGhYaGhYWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeGg4SEg4KBfX9+e3x7fnt8fH1/fn18f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4aFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWFhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX9+fHx+fYB+fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaGhYSEhYWDhIeFg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOCgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoODgoKCf4B7fX99fHx8fn18fX18fnt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeHiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGEhYKDfoGCgX+DgX9+fn9+f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4SHhYaGiIaFh4WGh4iGhoiIh4eGh4iGhIaGhoeFhYeDhIWEh4aGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gHx/fH19fn17fX18fXl6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGgoODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgYOCfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoODf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fIB+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fn9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGEhYSEhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhYaEh4aFhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH59f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fn19gH19fHx9gH99fIaDhoaGhoWDhIOGgoWBgYB/f4CAfn+Bgn1+f39+gICCgoKEhIODgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSEhoSGhoeGhoWChISDhIaFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+BfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dTU1NTU1NTU1NTV1dXV1dTU1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX1dXV1dXV1dXV1dXV1dXY29zd3Nzc3N3c29vb29va2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QTw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4utHU1NTU1NTU1NTU1NTYrnyBgoKCgoKCgYGBgYGDi4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjoqbO09LS0tLS0tLS0tLS2ZE7REREREREQ0NDRERDRlNTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/OzxCQDg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKSnzdPS0tLS0tLS0dHR0tmUQEhJSUlJSUlISEhIR0pXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw8Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamprM7T0tLS0tLS0tLR0tLZmU1UVFRUVFRUVFRUVVRWYGJiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLV1dXV1dXV1dXU1NTV1dDLy8rKysrKy8vKy8vLy83Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7T1NDPztLUz87O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1NTU1NTV19fX19fX19fX19fY2NfY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7QppLF0dKooNDP0aSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Sqp2slM6znqOn1q+foanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/QyZeZhaWroZqTncCemJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OTY/Qj9COjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9GksL2ai5uhnLSYnKKdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0NW5nIedlq25hp6Wr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PT05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9DRmqKPnIGglnibhJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDVp6SlrJuoiJx5n6mFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDSwJ2izLa1r6acir2tppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GP0hIR0VAPDw+Pjw9PTw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT1KSgj7nAo5eXnaWnlpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEM7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyMamvZWRqKOrpJvQn6uknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNTKjpOXkKjJkI2318KPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PD9HRUdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS1MKvsLPQ1cfD1dHVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHU1tbW0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6iop6iop6ipqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKinqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKjoqGfn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT02Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGempubnZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6enn5uam6KgmpWXlpqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJaeopKYmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpKWop6ainp2foZ+eqZ+QlJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWlpqempaSlpqalo6CgoaGep3mOj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKkpaSrsKOkpKOioaGcopZhkZWZm5mbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjqrCroqOioaGemqZzX5eamZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoa2SqKWhoJ6cm52fXWSam5manJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGhoKCol4Gsn56dmpikiFhmmZyanZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgoKCgo6Rvm6SdnJqapXliZpicm56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6enp6neYekm5qcnaB4a2aTnZydnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cm5ucon6AnJmbm52VdWpnj5+dnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZmamqp/fYmTnJybiHFoaI6fnZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJycmZiZmZiif4aCgpmenIFwYmiOn56dnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmYmZmXoJubfHqbo5uAh2tlkJ+enp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZm6mciGduraqMaIOBbJSfnqCgnp6dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZl6CmiHRfZZ6Wgldye3qbnJubnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuam5WinnRSTW+VhHhJWXB3kZSRjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGPp5VTOUB0iXFnRTpVb4GHhoKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAiqh5TmhUdIt3ZU9VQ193foCCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+foKgX3WMYn+nnohdhntRa399hY6Ni4aNlJKLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2MlmO51I+9uqm3h3R8aVl/hoqOi42QmZyUlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGMf4iNjYyLh5KJlYKBz8Sc1a2asJ5fgnFUepGJiZCPjY+UlJiQlZyanZ6orrKvsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkZ6hnZOXm6GanZujoZxuj7qkuNGxqK6TbLOnVXSUj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqbCjdI2VfrG8s6uVh12WxGxvnKKhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqWpp6iqr5KLdnunl46Pf3pqbZF6b5ajqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlBPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKimmp2kpaOhoauUfFtpkX57gHJva3Nxe3uUnaKioKGfoaGooJyeoaWhoKajop6koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqCjp6GmraenoqynfWxTW3dvcXZrZ2RqZm54gY+eoKGgnp2go5qWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaioZ+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChp6mutLe2ubauj2pjT1Zua2tzaGJkYltgZm92gI2bo6WhoaKYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NtamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6CjqqqptMLGxsjHv7OmknViYEpPb3FtdGdgZ2dYXVtgZ2xvdX6Jk5ykn6GhmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuywNjh3tXGt6qdkXxnYl9GUmpucXhoYGJpWVteW1xdYWJhYGZ8ob29qKSYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZscGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1tr/J1dbHrZiOgnVlYGNcQVFsaHV2bWJjZFpZWltYWVtZV2eNtcC/tq6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmc290aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDw7m9vsHI0M2tgGZdWVdcVUJKcWhtZ3JnYV9YW1dZV1RTYo68wri3u7C1tqivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1dm5tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xcHFxcHBwL2OZlZVV1JIRHRrYmBvZ1lbWV1bXlhjjLrFvqWlsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx+hH9pZmhha2xnbnZxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8PDxsbBsZTHyraFXlZUT0diaICLjFZVXWBhXWKDscG5rrKnq6ioqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH50a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTEubXAtrXJz6NrVVVRU1+YqaVRVlteXmaVwLemq7O1ra6lpKOnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7dm5raWh1WmZyeHN5ZmZeZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxb63vcPKun1VVFRMj62eTVRXV2iWu7Sxray4tbKsqaOhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF1qb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHv8XHw8fCi1hRS4awk0lPVWigwb2/uby6vLq8rK2mqbu6ube/srW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhpaXRteWxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcXFxMPFx8mndE16sopHTnitzM3GxMHEx8G8vrSxsLDCvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BrandsaWV1bnRjXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcHBwMDGy8OTZH1kS4PJycvQxba/v8DAuru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2NqZGJqbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28wcDAxJNQSXPJzsTI0MGvvb24ubu7vre0sbm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2NjamJnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwbu/wLy7xL26wMS/vby4u7/FeUmgzcS/v8m/sMG/ure7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2llaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjry+u8O1use3trm7vLi5tbrEypdNpcjAv7vBvrnGvcK/vMW4tre0uLa2u7u5trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhxbWVlZnBqZWtoWFlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zQxXmty73Ht7m4rba0t7mztbK7xcqfUKTJv7++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZmJuYFxUSEtLREpDQ0c+Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE2K52hL7Iz8LAuK61tbu9t7mxvsPHmFGizsPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoBxZmxpbnRud2NnYlxjUUtVSEVFQ0dCPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydGZc3ex0dHMysS1ur/EyL6+tL/Aw41Vls/Gwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRsbG5fY15hYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrCh3V3qMzMy83KxsLDy87BvLi9uruBXYvMxsTAwL/EwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXh8YHFjW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7uq3bwr62vsC+vrqmnKqzt8TApnt5fJ/ExsvIwcPAwMnKwb+7urKuemx6x8bFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4dGhwXVxfXFpRRUVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xbZtr869trnAvKp9bmhubXSCl5l1en+cvr/GwLnAvL7FxL29uLGxoIZ7cbzIw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d2x1e3BuaVxfX1lTUEFGSUdLQEVDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2xdYK0vbW1waSGaVpeYE5TW1xwdnqFpLi3wrqzu7e7vb+6u7utrqKfioOvxcPDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dnducWFfZl1bVUo9Pz9HRj1HQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJpoR3i6KwtZxqZmdWWV9JSU1QVG97i6mwt765srWyvLm8trm+sq2wqZeUlcfHw8C9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqiHe3aMoZhfU0NZVUhialVPRUplkaWvr7a6tbSyrLy5uLW4wb2hsbCko3q/yMK/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92cm5jXWZZXV1TT05BPkpCQEtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+zkIF5iI9uTktAZVlCT3iBk2hNQ16FsbWztbK0r6y7uri2ub/FjLW/rq1urL64tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlsXVtqVF1bUE5IREdNQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR7WEZBT4dYSUpZeI6DY0FVo7mztLKwsa2wubi2u7e6vp6wta6vfqywqautq6OooZ2dnpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodXRuZVVhY1ddUU9NSEBJUkRNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmJmUaE0/U3lxT0lJTGidf1pFVbC6sayzr66srba2srS1rqmlnZmanJ6nqJ6gqKmfoaeWm5eXjp2Uj5CWjZebpKigoKKioqWlnaOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpuZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqGIeIN8dn96Y3dsbl1RaVRQTkdQTUxDUFFAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9waqlvGZEU5x+UFhJS2FJV41iZWWDr7WqsrSuqquvsLKzraWdkZeTj5ign6KgnKOkn56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJyZm6OZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnx/dXZ9bmt7ZGhWUmRNSkhHT1NOS05IPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgq8a/yp5OQXaZbk9tSkxkZnZ0YV1idJKyr66ztaqmrKuim5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6WqqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyWm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd5fGV5eWBiU1VgSElKS1NUSVNRTTk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTHxotWU0pmo1lmfW9yW1JrY1xnYmBtkbSwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysbSqsq6jmZydnqGYm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNogmxlW1NbWU1RSk9PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVpcXd1b2N3dlhXYmBkaVtaV2itrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO2uLO4rbK0pKCdpaCsoaGioaCamJaVn5ubmKWhoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgoB8eHZqd3VebVtSYEhSVUhGVVdKQ01HPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgo39vgnBgY1dLW1JaTExRWVJIT05ImayqqaSfn5mSkpSYmJaWlYyIi46VnZydnZ6Xnpmmn6CopbGqp66jq662sLSysa62uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5uLyvs7C1wry3vrOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXdtaG1cWFtDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjnpyJYldeZWBXTVFHPT9AQ0Q/PkJSeKmtqaqln56foqOdnp2anJuUk5WUnp2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Oqs62qs7Svs66qr6OdrKi2sa2jsKago7CxrrCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t1cnFoVlxRRlVIREpQST9FQTRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBQRkU7Qj5GPD45Nk5+qrKno6OioJ6lq6Wel5yUkZmdmZWMioaIhnhtiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzTx76/wMK+x8bCt8PKycPBxr66tbq7tbu3sLayqrqyrru4v7u6q7itq6q4u7W8rq65o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Npb3hrZVlbRktMRURUTERDRTc6Pzo1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXJpYVdORT5JWXxvYUE9XI6urKCZm5uenpmXl5eSjI6Wl5OOjZCMgoOCd3JxbXCPpq2utLnFu83Hy7/CzM3NzMfJ0czMzMfJxcXM0NLVztPJvcC/w7vGxcjF0dPN1NDT08zKwsXGxsrIz8DJ0czHxsjFwrzDwb6/v7a+s62/wMPDx8XHxK+/ubK4vMTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWkNOTERGUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWlmXFRJREA/SoWepJiDoLKto56cn5qYl5SSlJaRkI+Mh4ODiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NHXzcbHyczDxcrPytPX0tfS1dbT1MjMx8zNytPNztPNxcnKysHHzMfJyca/w7OzyMXLy8vPx8q/vr+9wcbFzczJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpCLgHpydXZnY2d2amRWV1FETkZASlFCPkI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZthU0xKREM/Q1Ow0r2yr6acnJygpKGdmpSTlZSJfXhwa2ViaHJvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbO1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0crS1dbZ1tfT19jO0srP0czP0MzT0MDIx8rEzMzMzs/Fx8i2v8rA0s3Mz8bKyL/Ew8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkdBRUlKPjtBOD01NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWUlAQURBRlF2sq+nmpSXn5yaoKCem5yZlYl3aWNhX19gX15fX11hbHVzcHBvbHJxdZLEyMfU1tfX19PW0NXU2tTUzs/V1NTR0czQztTX1tPV0M/S09HJ09HI0NjX2NHX0dfZ1NXMz8/KzdLLztHAxsPIxs/O0dHSyMzNwMvMxtPPzM7IxMvHx8nMytTU0dXP0szTwrnFsaWota6nm6irpZ2yqLCzrayTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjq2VDOD0+RFiCqqifl5WXmZqcn52YnJySfXBlY2JfX2FfXmFgX2BgX2BlbXBwbmtvcnZ3nMzB09XT2NjW2dHS0tfP087L0s3V1NHKz8zT1tLR1s3P1dXRxdHUy9DU1dbO0tDY2NfYy8jOxMnPzMrMwMrAyMrOztDL0M7OzM/PyMzQ0MvOysPKx8nNy8zS083T0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZW5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF5SEZCO1eOoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NztTMztLNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzcLIysPMxMbJysvPy87N0M7TzMbJz83Ix8vFx8HGyszNz9HH0M/NzszQxcfBuLm9w8O9w7iysr6xu8PDtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21nYGBxaFlYaFZNR0xJUFFCO0M+OzY4Ojg6OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHw7jK1dbZ2tvYzMzPyNbVxMK1r7Son62XeGxwcXmQm42Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYWBgX2BhYWBfXVtdZ3JycHJzcW1yeaXH08/L0NDT1MrFycnGxr/Dxc/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0M/GusS/xsq9wsfJzsXDx8DHzcjEzMvMz8jExNDIxsLGyMS/wcfMy8vOwsvMycfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raO2fWiDhaSrlI6Nlo+Fg4ODgX2EhH5zX1teXl5gXmBjZGNfXV1eX2BgX1taXGBscnFvb2tsb299udHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMrNycTCy8nBwcvQxcvIv7nCu8bHvsDGz8vEwMO7ycfJu8nHxcrAvsLLxsXEvsa9vMHDxczFxbzAycPFx9LFwcm/ysnGyMbRw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXx3c3RmaVphbm1aW1hSRExGQkdFTERGU0A1NDMzNT88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrGvtWxeenyhkYuSloZ6gIWFf3V4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpa3Bvc4/HvcrFy8DGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvDyb/Bybu3u7rGw7+8wc7Dxr6+tcG9w7u9xrvDurS8xsTCwre/tra+v7vMw7y1usi6v77Lw8HGwsXJx8nG0MbCzMiyx8nDzszAxcO/vbK3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jVl5ZSkZKRkhLQUVCRkpAOTo2NTg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrJxs3NztHI0MXV1NbXzcrOxcnFx8G5xb2rrqVfZHWDk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5nb3MwMO6wbitsLGnqq2sp7i0trSzs7S7tr2xt7C1r7K7wrzBxLy/u7Wyur7AuMi5tLu3wcK9uL3HwcS8ta+ytrq/tMW3u7WruL2+wL2xurawt7qzxry3r7u/tbe1xby+w8XAxMXGx8vFwMbGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXVZeYEZLSEhKRkJEQUVFPzw6NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IycjKyMrEz83Sz83Fx8HGwL+6t8m2qrCYW2hvio+FiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmlmam1ucnykx8C4uLWwq6ynnqKpp56qrLOtqqyqtK22sbOprqess7u6tsO5urqxq7W5u7TCurDAsb68u7a8yLnDtq2qqLCywLa4vbCxp7GztLu8q661pq62rruysaq5sK67rru4u8DAvrrDv8bDxcC8xsHHy7jFx8W/x8PDusTGwrvGyczLs7nCvbuziXN3dmtpYGJsaFhXV1tBTEtNSkVBQz9GQTo5Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHE0MfNwcPGv8TEw8PKwsnKv8C8wrqztbXDrqqwkVtqf5KHjo97eH2JhXp7hIF3bl5dXFxdX2BfX2RjYmNkYmBfXVpbWlpdWlpZWlxlbm9oZmhpa25yga26sLWupaWnp5qgpKCanKWrraSooquqrKuwo6afqq20trG9ua+3sKiuuLSzvLi0va+4ubWyvMGywK6lqKOrsbKzqL2qq6irrK21s6WorqGkr6mypqiorqWot6yxsre6uruyvL6+vsS/tcHBx8i3vsDEt8TDv7u/xMK+xMjMyr+/w8DAqYdzdHNqaVxhb2NXVlhQSFlSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvBy767yba9w766yrfBw8G0try2sa+1u62oq5JkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqqWspZ6coaSUnaSal5Gho6mjo5+lpqemraCdnKSmrLKwtrensa2oqrSrtLqxtrautrmysLq6sbeloKSfprGoq6i5qqSnp6insq2gp6afm6SmrJ+fp6OgobGtrayytLO0sLW8trvBwLK7vsPBsbm5wrPBvsC1uLy9vrzCx8XDxL/AxKCDeHBsYmZga29gVVlfSE5nT1RHRktGPD1APTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci0tr24usC6vbagnpSdoaa6tquzs7uzxM/Jy8PGuLfHwMy/uMm3u8W4s8S4s7/ArLW8sqylr7OtoaORaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ttb4idqZ+WlZqhlpuimJWMnqGip5ygn6Sloqeem6OboKuwrbG1pKmqqqyspLS4rbewrLO2r7O1r7Cqn56fo6KypaapuK2ipqagqK2rmaCfnpmdn6WamqOcnJ6vqauoqqutrbCyuK+4ubqwtry7uquzsrmzvbS2sbG2tb+2vsC+w8K7ur2XhHpza19lXmRkWFRXXUlXXEtPR0pKR0E8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnHuLe+t7LCtLG7u6y5urGinqmrp5iej21+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9hYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtyjaeck5SUmpeaoZaWkJuioaienJ2lp6KlnKChm5mvrq6vsqGlo66rp6K1sLKyrKmvs6e6s6a2oKKfnKOhraOiqraro6OmnqWmo5aZnZeZm52gmpednJ2craGrp6Ojpq2rsrOqtbCyq7O5tK+qr7Kys7ezrqmtrrK4sbq2ur3AuLOxlIV5dWZfZl5bWVZTWlVLW1FMSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/s52lo5ilscK1tr2ttLjBzMjGv8W2wcDHzrfAxL2zubmzv7axubutsrSvn5qkqqCUmo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanagm5OTj5OWlp6WmJOXoJ2hnJagoamkn5+pnZubq6evsKuco6S4qqGgrqi2qqenrbGkuLCkt6CjnJmZqqehmqy5r6KhpJyioKCTlKGUlpabmJiWl5yVn6meqaSinaOqqrGtqLSsqqets7Clqq6zsbCwr6+nqKeyrrG0r7y0uriuo5SBenZlX2FWWVhTUlNLTV5MUExHSExLRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyZoamUkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JiY2ZpgZWSlIuRk5OamJyVlpyfnJ+WoJ+npqSmp5+doKagqq+mn6Kjt6ihoaKos6KlqKWwpbGurLWeoZ2WlamhopStsbGfo6Oenpibk4uhlJGTmJiTl5iYl56nm6eiopqkpaWrpKWwp6Wjq6utpqiur6+rqKqqs6Wmq6+0sa68trGvr6CSendyZWFcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLe7vMHFurG5tcTJycDDxsXHtsXEs8G/xau3t722vbq7tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWltZWVpbV1VYV1RUVlVSVFJVYGBfYGFfYWFjZGmAkpKIj42TkZKclJWWpJmgl52gpaKtpqWlo6SjnaqrpZqfpbGqoKGepaueqKKfrqypqa6toqKilZeim5yQq6mwnJ+in5+XmZOKnpGNkpOWkJiYk5yho52koaKVoKKlpZujq6WipKukq66lrrKppqWmprSmqaits7W0ubqwqqyejHJwb2BbV1ZVUkZQTkhaXFBSSVRLU0xFR0pEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG9w8issbjBtbzAvLS1qqymlZmbm4iBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUVldXF1dXl9fX2JkbY2Pg5CFjpCNmZOUkpyaopyboampq6isp6mmpJmlr6WVmaWvqaCcmZuhnq+ZnKuzoKWmn6OkoZSTm5aWkqmqrZqdoKGhm5SQjJmOjJGMko2WlZCdoqCknZujlZugo6GYoqijo6iroKuvpK23pqOkoqytqqirr7O3sr21s6uvmIV0c2hbWFlTVVJFWExRW1hNVE5QTFFSSU5JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3r6ior66bqaist7arvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbuztaapoJaXmJaHenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYWR9i4CKfYqPiZKNlpGXmaKgm6CrqqavrKixpaman62hlZalqKedmJCPmp6ul5moqpmfnZSloZ+SkZKRk5Woq6WamZmenpaNjIuThomNg4+LkpWRoJ6hpJiVn5WaoaKelJulpqioqKCxsKaxvaifo6y0qq6nsLWwubXAsa6xq5F+cnNiVlRWTlJKR1ZQUlJMTFdNSk1PUkdNS0FDRkREPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsba3vL3Bw7GvsbettLS7s7Sio52dl5eUg4B2a2dsbnFucmtwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1han95fnSHjIaQiZeJlJSYm5ieqZugq6amrJ6omqCmnJOPn6Oal5eFhJKbpJCVo52WlpaIopubk4uOipCapaeclZWXm5GSh5SOi4GMjYCQi5KSkqCaoaKWlJiYlaKmmY2ZpKappqGgtLKnsrihnKK2rKmtpLKyprW8taussaOJeXNuXU5RUUxPQ01OTlBLRk5OSkpOTlFITUpBSExISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrClp6SqpaCppqSzqqKyw7W1srPGxra6w8rMxrOsub20uMCvramwnqauuq+tn5manZWUh3uDbl9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFucXVvg4eBh3+Qg46KlJGTnaGPmpyjoqSZpZeinJWNh5majHONg36Ol5aGkZqQlI6Oe5mPnYyCiX+KmKCjnpCTmJaFjoKUfn50io16kIeTkJCdm5qakZaQnY6jo46JmqChpKSborSvrLCsn5iluKamsaGwrpywvKqpr6qZg3dzY1ZNUk9QTUNTTkxQTUJQUUhJTlJNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBrK3DraeippKdprato6CPlZaSkH13fmZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdaWpxa36Ee3NOWHKPgpeGjZyXi5SRn5idlZSWlY+WiYCUiV87Vm98jJSKgIySjJCGhnOKhZeBeYF7hpOdlIOVjpGQg4Z9k3hxcIaMfYmBkY2Ql5qYk4uQip2In5iHiJaemqGgl6euqa2oqJ6WrbOipq6ZrKuYqLSjqa2jk39zbl9bTlNSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOuoaamqqCmqaejqa+op7TCubC1sMfCt7O9z7+5r661wqeqxaqinZiDlJyxopqYhpSPi4d9c3VdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTU9SVFZYWmBsbmd6gXNQQj9/lZKRfYiVjISKjZuOlpWJkoiGlYZ5iX9gSlFueIuShH2EjYqFf39uf3+UeHV2eISNmnBRjYiKhnx+eJR2aHeGiH6KiZaLjpGSloyEioiVhJuNgoSSmpaenZSko6ippaSem7CqoaSkkaaplqKqnKKmqIl2bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa+hp6ilp6ivrKq1vLa4trPBu7aouci4tqiotbaqsr2mnpWNf4mTqJaVin6Og4J9d3BvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboNydX1paFxUkImUiHR+hoF8hYyTgpKai497ho+AdoB4c292cHSOjoF6foqrhHl7aHZ7jnBybXiBi42SeHqAe4B2c3KSeGd1hISEhXyVioiKjYqAf4SLjYCUhHyAj5iUnJaRn52pnp+gnaCppZ6dmI2npJKgoJaen6SBc2hhXVxKV1BSR0tYUk9KTE1SSkpKTFBITFFMUlRNRUhBPTc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyvLi2urSxn7e6sqqdnaypqLKwoZqRjZSBjpyOkX52hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZnaMlpiNjnxneYF2eICJkH2EmJKBcYePfHd7b2t+rX10kIt/e4aSgXx/dWZ2fIZsb2dzfImMh4BseXF9cW12j3FocYF+jnBDi4WCg4V+d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnJqdnqGclo2LpZqOnZeOlpiQeG9tZmNaWFhVUUpTVVRPUE5QVktOS09PSlJPSE5QTEZEPDw3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqGmsKyuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5acpamkoJiZj4WSeYiOi4p1cXttdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcmyIp6rAfnR5Ynt4b3t5iZB6fYuGb22Mknl0eWpqgIJxlpGLgX6WgEmSmG5oeH6CbWlkbHmFkJKGa3NsfG5yfIZpbnB/c42JhIZ7fn97dm90dIaCeYF5cHyOjIqTg5aXmJqQkpaXmZedloyDiZ6Si5KNhpCWgG9qb25vWFZYVFJRWU9SVFRSWFVNTkhNSk1PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpaywo62qqLWvrqy0v6u8w7+lopqVpJiejYSLlKGhmZmRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxfp4dhmmlzeWV+b21/eouJdoKIhnRsmpJ0c3xqap2PTXmFk4mEjmcxdoZzbH59g3RmZXV/hISFgGZpbHVrcX98aHFxfG6TjY98dH59cXBudW2Cf3d5dWp5iYKIiYOWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra29oZVhSWldZWVtNUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpGZlqOorZ6xnqe6r6uysMKxu8PHmpaPlJmLjoV6hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvsqBxe3hsfWxxg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKFdnCHfId8dIyujYmAaGdiam5ybXCCdWlvWHVwjpuSd2x/en1tcm5wgHtzdm5idoN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jntzcXFtYFtdXltZWGBfUk5bWlhXTEhKRkpHP0NBQkg/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKefr5WltKmusa7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dHh4bHdud2NpXkpQRz4/NjQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH6Fg3+MfnWimXl+hoGEmYSanGGGqp+di4OQjXp3iH6JiY5zi5ePhHpdZHF0enx3im1oamJ5b4WQgnpugXd0hHpwdHl4a25pXXaGfId8h4eOf4qSl4ONhYyGfXGEf4R9dXd7fIl3cHN0ZmdgW1teU1tnXldQVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkZydn6aRoKqgsaivwLG6xbqWjpGUh3uGdmt/jJGCfYqEj4x4g4BzoISKfHyBf3CAfnpndmtSV0xARTIxMTM2NjY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpohIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKpIhq6vr4uBgJOLgouChJKph4CYmIqbdG18gYaHfY5oZ2h5f26Fh4KFcYSGR2yAd3J5dmhta192fYKIf4eEi3mUnZyJi4iRf3p1i3Z8eG1vd36AdHRybFteXltjY1hnZVtUT1BWWVBETEtGTklDRkNDQEBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeRjpaXkpegnqyhprivs72zl42Si5iLfXRwfomSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFhwWVxeaY2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbm6atk5q7sae7x8Ooi4yhpY+UioGRfHGDnp+RnH92hoWLkIeQamhvg4F0jYeEinGFgneHf3t2hX1udnVmf5SOhomIh4iHoKuilYmOl396goh6eW9na3h+e350bGVdWltdal1hZmBaT0tOV1JRSVBKRE5HQ0pEQkFEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3g3uAjH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koWSlX+KgJKbjoOAgYyKgomNg3+KgG1wal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJTUlNTVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVl9jf2dnbXWdm4+akpOLjY6aiJKPnYugoJKjqqWjrJOptqKowcKux694upSafI2hnpmEk4WCjqKfk5iShIqFj5mRlmxwdYmMgpaMjY53j4RxbYWBipaRg4WIcYiglYaSiY6PlqS1qZuNlKKDh5ODfX9ramp8gYGCdGJeZF9bZ2tdbGteV0tHTlJRTUxMRklQQ0RNRkFDRUZCPTk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImFkIeFiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTlBSVFBQUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6WimaGXopScnqeeqKufqKypqraXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiJWim5t4en6UmJKhk5eXgZSee3eVkquyiI2Xn3yUnZuOkpWYo6Kmtq+dkZmoh5aPjYGIbHNzfYB9cmlgXWFfYWdkYGdmW1JFSktQT0lJTEZGTUNITEZHREJHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQk1RUlNRUlNUUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2FkHeViqOnqrS9uKStrKynqLSrsLaysq27sbO9nLPDq7rJy7fDv7ilorCzrK2qo4uWmIWmpqCjl4GmmY2iq6ikiIWUpKGgq6GkqY+bsIuVo6a3upugo7CSop2inpCjoauvrLK0opSkqoiZiZKJlXp6fYV/aGFoXGViXWRkXmZnX1pPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoY1dpb1h6hXaBk4WHgpuDkpCMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOFgIuFhoeShoKEiYaIh4dwbmFARTY0PDIvMTEwLSwrLTEuLTQ/Q0FNVVFSU1VVVlVOW1BHR0Q8Pj5GSENFQDg7PDVDOz1GS0lHSFJPUFeBkqCErqOzqrLAx8Oqs8W2rLO/s7i+tr+0wba7uqO4xai2yce1vrm1qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayys5iWqq6orra7srqsr7Wisauxtbu3tK60oKeoo6eaqa+tsrm3uKabtqiMpI6Rkp+GeIKDdlpiZVdmYWFjYGBmYFtUSURETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRYmNXeXVxgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhYGOf4GJjoaAhoiFioeRenhuXVZARU48Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtKQUA/R0tGRkM7PkA3RDc/QkpKRUZXVFBej6Sto7G0w7a4wczJtrvEvbOzwLa4wbW+r7d0sbOlusSksMa5sbOxtKiktbaqsaCilpuikqWwrqatrKekmKCstLuiqLK6tby/zL/Fxb29s8K3uri+t7q3uayssKaxqq29sLy7wcGrmbqok62Pl5eqiX2CfWtXZGJZa2VqZVdcY1lWU0lHRkxRR0NISUFIRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXU1lVWnZqcH6OhICNg256c3iHYrmhmaOJlJSWkpSTjZCWkoeGe4aBjZWKgISBinp8ioeGfYqDgYqDlX13enVlT1xkR0VMO1FjYVteU0Y/O0hQRVpjUVJZWFpnWVRgYE1TUEVBP0lKSEVFQUBDPEU2Qj5IR0pMU1pUXZOuuLW6uMi/ur3JzLu8wLu3tbu6tr20urHGYHWypLGanqu9qqWoq6ukorK1oKunn5WWn5ifrqWnpqWfo5Sjp7G0p7KzvbbBvtPJydPHwsXMwsrDwL69v7u8t7SvuLe2w7nFvcLIr565qaGrjqSotoiBgHNgY2JeWGJgaWdSWGBWUVVJRUVOS0A+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWi36Df4J4e4uDh3yLeYGKgpd+dH16a2VwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RVWVVKREJLS0hGSEhIR0FJOUQ/SEtUVFZcWluTuMC4vbfGwLu5ysq6trm1uLmyt7W0rra2mGR1qJytcF6irJyYoKKbpJ6rpZSfn5CUjpaYl6efpZ+empmDpJ2spaqwrbiwvbnU0c7W0MnM0szPzsrGv7/Cyr3BvMHAxMTFyr7IzrOku7C0r5qruLuZgHtsXmFdWV5hWmNjUVtgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5eSkJRubG91dYezrKGgn4uZnJmMjZWRm5KFiop+iIeLkIuIfIGEc3uKg4V7iXSBiYeVf3N7eWttdXtocmVpbGlmamloYGZpaGxabXOWraS8iIdnW29oXVpaVEhLTk9KS1BLU1FITEFKR0pPX15iZmlhl7fHsLiyu721scTGtbC4sK+7q7Kxp6u3rIy1p52ap5pOmp2Mjp+WkaaYpZWKk5OJkImQkZGdm6GXmpWWh56ap5usr6iwp7S01NTU1tLLz9TVzdPPzcXCydC/ysnKydHHzM3C0NK4r8O8xLmltrrDooNvZF1dXllgV1lmWlFdV09QQkJIRUJIO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlVnOQkJiCaHFveXmDoKqepZaMmpuXi42VkZqOfYmLhY2KioqQh3yEgnB/iIGGe4dyg5GLj31xeHVrcXh+cXtueHNsaIFwbWNqbXB4aXd8fsu/wd+nbmN4bmNbYWBKUFJVTlleUF1cTlBOVFFVVFxubXaCcZatuKy0pq+2qqy8wLCrtKakuKarrqCrtKKOsa2al5iMkZORhI6bgY2mkZyJg4uEiomEi4OUlZeXk5yRnJiZmZ+eq6ykp6Ksrc/S1dHNy9LT1NDU0c7Iw9TRx83S09PXzNHRxdLWxcDOx8fCqL63z556b2ZeYl1XYFNdWlBRVFBPSD5ARkFCRTxAQj5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlt1hoWKd2x3cH1+f6GenqGLjJiTk4yLk4+WhHmFkJCNi4qHkYd/gntyfoCBh3mEdYWTkIh/b3Zya3N8fHd7c4F3cWqAc3JpcHF6eXJ6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1hkalNYXV1gZF5jd3p+i4GYqaOkoZ+gqKWqsLiqpbOjoa2ho62hp7Gfiaaak5KRiZGPiIGUiWqUooyZhICFfpGDg5OWrYuVjZWajoaSkZ6Xp7ChoKGlpKjIzs/IwsvR1NHU087TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDw8yMc29kYWBYVFlUXFBLR0pKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuViY+KiI6Hj394g5SYio2IiIuJfoJ4c3t9g4d3f3qHkZaAg253cG11f3Z4fXSFfHlsh3Z0bn12hHV4e521jDtBisWlfox8aWVXSUNmY2VjZ2pkbnhbXmZoa25pboCDiJGLnJ2gnZCXmJ6jo6axo6Ozn6GlnaCpoKOxnIaekpKSkIqOi4aDj4R+nJuMjYKEhXqUfoKplaOMkYqXkot9l4qakquzmJqcqJynvcPGubbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydna0da+y8y0eXdvZV5bU1ZSW1ZGR0pJRUU9Ojc6QEBCOkdEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoWJgod8eIWWloiOg4eFhnqEeXF6e4SGdXqFjo2deYtwfG9ven9xe4Fxg4eAbo56dXd9fIJ1fnuGh69zWKnCto2RgnBuYj1eaHJwcXBueHaBZWhvcnV4cXqLho6TkZuVn5WHi5OboJueqp+grJyhmpifpp6fq5mLmoyQkY2EfYiHg4WLjqCZk4iDh35tmXmEmIaIk4yNlIyGe5uIlI+uqpSVl5+Zp661vamtvcbLycnMy9DJw9LK1NfZ19jX1dvX09nb1dDb2tHWyNTLlXp8amlcW1BTVF5IQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo6RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKBhH+DfHyEmI6Hi36GhoB3gnlue3uHgnR6kp6NoHaOdYJ0dYF9dICEb4GPgW+ShXR8gIR6doZ7ibfFpMHJuIKVm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSVj5eQg4mOlpmXlqWcl5+WnpKSl6OdmauVkJCJjZGCjIWJiIGGkJGem5mJhYyBhpd6iIifl4+IjYqLgn2hiZCLvKGYk5eanKmmpa6fqLa/wMC5x8nNzsXNydHW1dXZ1dfb1NfZ2tvX29ra2M7cxod8e2hqZmBUWFVVTUxETkM7PT08ODo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKe36Afn98hHt+gZGJhIV6hId6dX10bXx9hn5zfpKdkZ6DkXyGfniOfXiKim6CmoB0mYZ9gYiEe32Qeo+ojo/DoLyMnKOcfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWJipCSlY+cmpOUkJaMi5WfnJSglJGNjY+KfpCOjouEiZKWmp6fiYyUkp2Rgot/pZmIhI2DhoSApYeLi7iYnZGUlqKnoZ2enaOvtrq1rMDFytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27h5eXlta2ZXYFxTUE9JQ0xCPTw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEPzgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF9WWGZtbW1pgY6KcXJ5int6f3x/e4d7fHuLh4F+dYOFeXJ6c22AfoR+d4WboZqelJKAjIh/mIeAm5Juh6iFeqCLfJGNgoiEm32akIqMo6KfkKOuoIuRi4WLgZOGV3Kti5+rm4+DmJuPj45bgqKRgoyfk5SMhoiMkpOMlJSUj4uPiYeWm52PlZaQi5KThYCLiJKNioqdlpmio4aTnZagiomIjZyQg4iPf4OHhaSGjJCzmJ2SlJehoZ6Zkpydp7K4rKa9wsfOx8bPzNDMztfQ0dSu1tXY2tja2tfW2dmfcX51aWdeXVhUV1hDQEhDPj4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnltYn6Sg29td4t4eX96gXyGfHt3hoR/c3CFgnp1dnZ0hIOFfX6SpqOfpaKWip2QlJeLiqiXcoqxjYSnkoSZk4SZjKKVn5iTiZqdopKpr5+QlZCNjoiWjG6Nt4WaxMiym6Glm5yYlpGykWSkzceVjoaHiY+SjY2TlImFiomFlpmbj5CUk4aUl4R/j4uZiI2QqpeXo6OImZ+WmoiOh5eXioSOjIF/h4+liY2TqZqXk5aZoZmfmZOdm6KztKWjvMG+yMXFycjJwsrTzc3UqdLR1tbW2NrU09rOg3OBaWRfXl5PSlVbQkFGQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnWCjnx8bH2IeHp+eoGBgn52doCCe2xui395fHh4fISHi36Lo7Ooo6uyoZanoKWklpWuooOQt5WSs5mNoaCLpJuvoqSdmJCnlqiZra+kl5WVlJCLmJmWoMCOo8m4q5qipa2ZkZqcsp2GhaiinJiFiImOlY2Lk4+HgYaHiJOYlIyLk5OGlJiGg5GQnHSRmbKWl6ShiJyZk4+KkIuXmomKlo6GfYyYn4qQkJyamZOYmJ+UoJ2Vn5uhsa6jpLe+tMXHxL3Dw7/GzsrJ0qfOzdPS0NbY0s/Yu3N7d15hVmFXUEhKT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTltcWUpnYTtIhIt6em2Fhnl8hHiAhYF9cHh8fXxvc416fYF7eIaLiYWEkqi7raiyva+lrrOzqKOisKyKmrSeorillaykl6mtt6ako5+ZqZiqo6+wqZqZnJSVkZegl5m7u63JoGm2uKuwlJieoquSl72jXqqygomKjZWHkXyPjn2Dho2PlJSIh5KWi4+VjYqMlpmSnZqzlpWrnoublJKNkJKMmJuKkp6QjImVn6KNlY6Ymp2Tm5ielKGglJycpa+ooqWzuKvCyMS1u727xcjHwtGhxsnNzcTW1tDL06JxfGpeW1VfUlBGRD49Q0FBOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlSGJgY3BKQIuKfoByhod8gYl1goqCfm19fXx/cHeHd42Bh3uNj4yGjJqrwsCwvsa7srTBvLStq7O2jKiyrq69qpu7pKituberpqaioqOjqa+ysaqdnKSYm5iXnqKlpZKjua6owLusrbK5paSnfYiGnK29sIOLi4uQg4+DkY96gYeQjY6ciIiPl42LlZeUkJqWnKeasZqRq52OmY+SjpWQkJaXj5GgkYiVm6SslJaPlJyelKCem5igoZSanqinpKGjsLKmwcbDsLC6tsXEwr7Np8fDx8O81dDNxMqJdXRjXVthW05LQ0xARUY+QT9COzo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZ0dgaWdaXVuTjIyIe4eLhoOMdYaQioFufnyCf3F+gXqVepKUlJiRk5WntMbJwMLMwcO5yLy6r6u5u5eytrqzwK6lwKSqsLu7qq6roqKep6uutbCqm6CqnKKclZ6wtKeLorq6tcG7q6icsqSkqJSEjqnDxKSCi46HiISGlZSNeoOMkY+RoYyMlJGPiZifl5OZlJemoK6djKqcjpWPkpGVlY6QlZGPoZSGl5+gs56Um5SgoZmkn5qgnKCUmJ6mpKanpK+tpb/Ewq6pt7XJw762zrLFvsO8s9HKyMG1dnpuXVlda1NNSUNMSkpJQEE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2WiYuIko+GiXmGk5CBcoB8jX53h4GCkHqNoZaompqYur7IyMrC0snKws28wbOtu76nur++vMO3rMGprLO7vaqwqaSlo6uutK62taCfrp+mopijtL2pm6i8wKO2tq+rkq+sqquWhpqppqWRgoyTpZWJgHWKknmFjZGQnp+TjpSLj42Uo5mXm5SUo56pn5GlmoyPj4+Vloh9j5WSkqOalaCinLWmkZ+XpaSjpZ6eppielZebpaOpqKKyrKi7wMSvpbO3zMC5rsOzu77BuK3CwsHAmW96Y1lXXFxMTE1JR0RDSEJCQUNLOjRESDo7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmtJX1hhWmRlVp6PnY6Xjp6SiYp/iZ+ShHiFf5V+f5CIipCAlaCZrqejmMK9yMTIxtPNzs3LvMK3sLq8tLzKvMPBtra7rbO/ubytr6igqae2ra6psreanq2iqKGdq7e4qaWvvsSxvbizp6mzs62ulpWlrKegkY6SscWnlY18kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjI+PnohakJeXkpalmmaYo5+zpZajlqytq6ebn6eYmZaZlaGkqKaetqupurzDtaW0tsvBuKq2rLO6uK6ouLq9uINub1tYVVZPRktTTUs/QUhFREdGRzg1Rk07Pjc+QUouMzIwMjVCNTVQV047TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJyRmlJUmViTEamlJyWoZeployQg4elkoiBh4KchIOVkJGUjpqin6++rqHHvcXEx8fOzs7Syr67trG6u7y+zrbEvbe4t7KytbO4squmnKuruKqpp6+wl6OupKekpbTAsKqss77CucC4s6e4s7ezrpWlra6upIuTlaGNc8GZfZaZhI6WmouxlZqZlZKTmZmmo5Wgm5aaqJyboaCZi4yPlp1gSpacmpSapZdUlrCfr5yfpZSvr62lmqGmlJOZmY6doKeimbSpqrO9vLursLLHwLmmq6utsbGjobKytKRycGZdW09RTEVQUFBRO0hLSUZIQUM+OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UkVXUnNiV0ZIq5eZn6Gpr5iQl4eLp5aOiJKFn4iEnJePnqCbo6W1ybSpxrvDxMjKyMfMzse+urOvubjAwc21yLrAubW6sa+vsrSno5uqtLSqqaaurJmkrqWlqa26v6irtra+wb++uLOxwq+3vaujrrSsuKWIm5emm3a+oISYnI6TmZqLr5ahnJuXlZufoameqKCZmqqZoaeel5CNkZ2DbnaTopqVnaKfkK6yo6uVqaqYq66lpJ+lqZKSmZuIlJyinpawp6mrure+s7Ktvbm2n6OnqKWnnJysqamNZWdhX1JMTUdHTkpWTD1NRE1JSkFDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uU2FNVkh/ZV5IRqyUnKGfu6+YlJ6Lk6qbkZKTiauNh6KejKSslKOjtse9tMG6wsLIycXCzsjBvbmyr7m0wMLKtsaxwLy0uquprayvo6KYqrS6pqmmrKqdqK+npKurvruorLyzt73GvLe1uMCwvb+zqbS2q76kj6KXkaKfvJ+JmaCZlp6dj7efqZylo5ucoZqopbOhm52lnKiqnpmVj5Sai5eJjaSilJyin6C1r6Wlk7Grmqysn56ko6mSlZWgg5Cen5yVqaWiobS1urWtqLWys56coqaal5WZqqGed2JeYF5LSUZITVFJTUVGRkJSSkhBREdBVlNESDxBR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkREnG9iR0Wol6SensOtm5ell5mpnJaamo+qlpWoppWtrJmhqrbEwry/t8HDwMfEv83Gu765srC4s7/DyLW/r7y2ubemo6urrKCgmqqqxKKlqKymnqyvrKKqqL64pqy9sLe2x7a0ubi+sL7BtrSytK++o5ajlpOblK2fkKGipaOjn5C+pamdqKydnaGbpp+9opiknqKpq6Gdlo2VnpOfh4+FjZOepKCdtaylnJayp5mwqJ+aqp6gjZmVn4WOoZqbkqWkmpissbaxqqWpraycmaChko6QlamflGlkWmFdUEpHS09MSEVDSUA9T0hAO0dJSFtST0s9SE5VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlY1dMopqjm57FrKGfrJ2drZ+So56WpKCnqqyXtrCjqrO2xMO9wLa/wrzIwr7KyLa4tbSws7S3wca2vrC4tLm1n6atqqudnp+lpMGloKquoKSpra+ipqe9taWxu7e2tcOys7e6vrHDwLi4rbO0taKcpJWRk6CtoJihnamoq6Kaw62pnqyum5uemaagvaGdpJirq6umoZmNmp+SnomOV3+VnqahoLiqp5OYtqOfs6Kgm6+Xn4+ZlJ2Cj6CXlo2ipJWQpq6yq6mioqWllZWdmYuPkZOkn4ljZVtkYExJSktORkVBRks+PUpBOTlKSk5dUVFKPUxXXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxLTp6foZiexKelorOhnLKnk6qkn6OframsnbuwqKy1ssjDwcKzwsS9xsS9xMq9sLC2rrC1r7/FtbmwsLq1rJqosKmpmp6moafCrZussZyqoq6wqaSnvbemtrq9r7fErbOzwr+xxrO6t6u0tq2qoqWVlZSjq6Gfn5moq7CurruypqCpqZmZl5OipLihoaSSrq+spKafkqGelZ6PkY2UnZqjn6e0p6eMmLSco7CanpuukZ+Ul5SagJKilo+OoKGTi6atsKWnopygnpKSm5SFi5KNnJ6AY2ZbaGZLSUxKU0JDQElHOztGPzk5Tk1VXlJTSj5PXl49SFBCTExJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+bn8Koo6qxoaO0qZayq6aipLKsrqm7sq2wtLTGv8TEtsDEvsrEtcDIwrWrtaiwuKzAxLS3rqy2uqWZq7GrqZifppetu7WbqLCbrZ+utLKnqrqzp7qyt7K4wKq3ssK8tMWnvq6tt7Wpp6yhl5aRpaSiopeYpK+4rbK1tqCfqKSZlJWTo5+3o6Slla6xsqWppaKempqalZeon5+Yop6usqKmjZeumaWsl5qepZGbjpSYmoWWn5SMkJyelIupqauip6GZnpaMj5mQgYaWiZSfeWRpXWxqTlBNTlQ9QkFOQzs6SUA3N1FPXV5SVlFBV2BcQkpTSFdLSDpVZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzODA2cFtiSDA1SnBpVkNXRox5ZkM7pKOcoaW/pqivr6Gptaqdua+rpKq0t7Gwubawt7i4xb3Dx728xMHHwLnBxsG6qralrbutwcO3t6qtsryila2wrbGWpaiRqrmqoKewnaqfr7Szqqm2tqy7q7KyubesubDBub2+psOrsLeuqKqrpp2YmKqhoaCRl6CwrrOrsLmam6mfmZaSl6agtqmloqKvsbOrsaern5ugoJuepJyhl52js7Cbn5CUppqhqZuVop+WmIqVmJOWl52TiZCbmZSOqamnn6SbmJuTh46Zi36NloaOm2tpbWFtblhRUVpUQUNFVUA7OklBNzpYUGReUFZXRFleXk1MUk5fS0o+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoQDhsfWhcVjqJe2NDPaifnKGpvaGqsKqjsbippbWyq6Gttb2vs7i8ur23tsHDv8nEucXDwMC4xb3BuK+2p6u3sry/vrWprrG3n5erraitl6epjqe7n6Wts56rorGws6yqtrO1vK2vsbWssLWxwLnEtqu8r7G4rKyporGlnqSon6SXkJifsqqzqaqzmZ2nm5mUjaClpLSup6KsrK6xp7Kssqmjm5+npJ2UoZibqLWpl5mRkp+Zn6GekKyfmJiGlZiLnZqdk4qNlpeal6amo6CdlpWWlIGPlYV7j5KEjJZmbHNocHJfR1lmVkRDTlhEWjlIQjY+XVJoXE5ZXUdbXl1OTVJYZEpKQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVjE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmqCkrLejrKmlrq62qq60uaansLjFt7G3vsHCtbS7xb7MxbnDwbq/usS4wbmztayqure7ur61qq2xtpiYqKuqq5usq4+rvZ6rrrGjqp+xrbOurrayubapra6xp7Wws7q8ybKqtbSxtK+upqGzn5qorKCllZWambGiraClr5ahpJmZko2ipaayqaGmsauqtaStsLWvo5idraeal56Zmay4opiTkI+YnKGZl5Ssn52UgZOZjZ6cmpaQipSSnpqlo6KgmZaSkpZ7i5CFe4yKg4uSa255bnV8YUZgalpJSFpbPXtKR0U2QWJUaVpNXGFKW11aUlJTYmFMS0VgYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLipBL0pHUFtHM2NZVEtEmZefr6ixqaylo66utam2tLejrLS3ybq0u7q/vrW0t8PBzce8xL23vr/At7+9sr2up7q6t7fCt6ytsbmVl6auq6ejsqqUr7qkrbKxp6eisbOxsrG1sbiyqK6rsqe4r7Wzw8W2qbS1q7Ctqaeitp+eprGgpJSbmZSxnaebn6mNqaKdm5WXpaWkt6eisLOrp7GnrLC1rKSZoayom5ydm5SquJyVjo6LmZ2imJCXp6KfloOSlpCdnJiXloiXj5eap52koJKWkZCWdoSQh3uFgoSMjG5xeHZ8f11LZWxcSk9jXD9ie0dJOEdnV2VbTF5iTVhZV1RYVGldUE9IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNya0tEQ5GYpK2kra2rpqOwsrOqtrC2n6u1ucm5rsG7w7ezsrXCw8/EwMG9tL3Av7q/vbPEqKq5sba3v72vq7OznaCnsK2lprClnrK1rKuysKypqLS5rLSztay0rKmrqKypua2xsMe+uKS5r6mtraaorbClo6Ouo6mcnZuar5mio6KjkKyeo6Cfoamlpbikq7S0pKqrqKyutq+inaOoqpugmZqSpLSaj4mNh5GjoJaOlJ6glZOFjpSTnZuZlpSHmJKVmaecoJ+NkpGOkXd+joV8fH2HiolxdHN+fX5cUmRuXk5aZl1GRJZbRzpObVhhW01gYk5WV1ZXVFlnXlFSTGRaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZTs2KkhkSEorOkk/M0NJUyw+j2s+SEmPmqmqoaiwpKijs7SxtLWxsaGsrb3Luq7Bu8axtK20wsPRxMa+wLK+wsK8v7i8xaitt6yzuLzBsKuyraGkp62pqKSwo6uxqq+rsa6urauzu6e3sbKpsqmqpqWjrbqsqbHCubSsuaioqK2pp7GlqaSirqqoop6boqyVpJ2XnpirnaGnqKGspaOtrLexsaCpop+qrbCsnZ6mp6mZo5iYj6CnmIaDjoqLn6GQjI2XnZCQhoiRlaCdlZiVhpaTk5elnJ2ci5GQjYp/f4eFfHd/h4WHdXNyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlPZFxOVVZVV1BcYV9TT05oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5KMC5JZ0RGODxCMDVFS1gxQJRcQE1GlZasp6GqspypqLC1rLi0rqqkq6u9ybuxvrfDr7Cts8TEzs7Dv7+0wMPEusC0ycSsr7eusrrAv7OurqulqKqwqaaosqW0raqwrq2xr7Oss7qkuLSsrK6nq6CinrC3q6qturaktbWkqaesrKqsoaimprGypKaloaGrlqmgk5qgpp6joqqkrKKeprG3rKyipKKaqaqtqZyhpaSjmKCalY+YnZSBgpCIhZ2gjYqOjZqPkYuEjZiknJKRm4yTkZGUo5qbmouOi4t8h4GCgnt1gISBfnV3i6OHeWteYG5nV2aHZE5AZ5JMRGJ6V2JYUmVVTVZVVVRPXF1hVUtOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQUlIRJaRr6SiqrCXqqittau2sKukq6qpvMHAuLmzvLWmsq/EycvRv8G7ucDAwrnBusLErrG1srS8wb6zsq6tq6yotqqlrbCqua+osLCusau1qra1prS2q6ykqaqco52zs6iopLS0oLauoamoq6irp6Cqq6i5tqmqqamhqZ+tm5GooZ2gpKKmoqmdnKa0rqelqaKjl6Smp6mcoqOjn5mYn5GOj5mOfoeNh4WenoiEiouPjpGNhIaVopqOjZqRkpGOk5+XmJaNioN/dIeBf394dYN/e3h+gIidj3ByZ2dxeFxhc4hpT12YVkhteVVkVlJjT0xVVFVRT1haYlZIUGpUV1NHUFlVST5JSE9RUHhMTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdSRTuVja+fpaqtmaukra6ztK6qpa+pqbu+u8Gxr7itorWvycfI0cC/vbq8w726w8HAv6+ys7K2vbzBsrKzq7OppbWopK2zs7mvoq21sa+xuaq4rqqutquqnqqroKOhtq6ooZ6vsqG0qp6op6qjqqGhrK2ova+srqyhp6efq5iPr6KYoqCop56nm5mpsKiin6yhoJKhoqOmmJqopZiYmJ2PioeViH2NhoSFpJeGgoKMh4+OkYWFlaCXiJGdkJOQjZGdlZePioWGeHOBf311eHqAe3R0e2qCh6N1aV5lbIF1Z4iLfFJXcF5KeHNUZFNRX01NU1pnTkxWWWVYR1NqUlI+Qk5RYVE6SUhMU0lxUExTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSE87WEI0j46wn6SlqqOlo6ymtLOwqaSwp6q4vsG8sKi5qqeusMnGyNDCvcC+ub6+vMm8wrmxsLWyury5wLO0u625rKO1pqessra5sqanurWttLyvvKWtrbWrrZypr6Sfpayqp5ydqrKks6iaqqeqpKmeoqioqb2rtK+tnqmjoK6bmrKilaSbpKWfpJqaqKqlnpqpoZuRmqCknZiWqamRmZmTkIqCj4V9j4KAiJ6Ph4B+jIeRj5CFgJSblIWTooyUkYuRm5KVh4l+gHJ6eX58aHd8enVwcX5phnmEiGRgaGRyhXttZ3ldXlZCV3ttVGFQUlhLS01wdF1IWltnWUVWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6TsJmfn6mlo6GqpbeysaSpsaatucG9tbCjua2oqLDDycnMwbe9wLW3v7rItsO1tLO1sr25ur22rbm2v62is6arq6+1t7Sqnbq7qLG/srmgr7S2qayerbGjnKWoqaKdnKSwpq+gn6upp6GpnKOooK27p66xrqGqoqOtnp6spZefm6CinJ+bmaKqopqZo6OVlpOfoZablqasi56RkJGMgouAf4+Be5qUjYl9foyHkI+MioWSmJGHlKSJkpKHkJqQk4GIfHlsfXZ5eGJ7enJwcHN4aoJ0aoJnY2hhbnOObWJqcGBvQV15a1ZeTlBRSklMU1lWTVxebVdEWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1FdPSOSl6uYn5eno6Gfp6O4r62ir6+pq7jCurOtn7mvq6i0usfKx7+3wr6vtL63xLbDsrC6srPAtbu+uKm5uL2rpLWnqKqwrbmwqZm5vKOuv7S0oa63taemp7CzoJ+lpqegpZmerKipnqCqrqegppeiqJ+wuJ+ksa6grKGspJumpqiampueo5WcnJqdqaaWmp6okZeSmJ2TmZWhqpCaiY2Qh32If4KOfHyhjI2JeYONhYqNjYWIk5qOiZWfiJGVgoyXjZB9hHtzcHxxc3RgeXhqb3BxcGp/c2N6bGhmZGFlh4BgW3JqcU1OgGlYWk1QTEpHUFJRSE1bX29URFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBcWzUolpulmJyVrJ+foaSht6qwo7S0qam5xbayrqC3rK2tsLXFx8C3v8K5sLW8t7+7v6+svrCzv7G9w7mpu7q4p6i1qKersKyzsKaZvLakq7q1rp+xuK+ppaevspuhpKCjpKGWm6+moZ+jqK+hoKKTo6SitrChprGrn6yirpebqqSonpeanaSTmpyanaWpmZubpJSUl5ScjpOXoqmhkImKj4V6hH6EinqPl4qNh3qCiISJjI6FjpOYjI6WmYqPln+Gl4uPeoB6cHF2bnB0X3h3ZW1sbGtphG5mcmlrZmldY3SBYFtrdWlaSn9eW1hPT0tISFJVRjI5XV5tUERYVlllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyY1YsMpWioZeUm6mcpKGiobeprqC6uKWsvcWzsK6jta+tra+0w8O8s7+6t7Czubi6uLqvrsCztLmwv8G4rL26taWis6qnqbKrrbGhmsC1pKe1taiesrypqKWpr6yZo6ecpKWUl6GypZmfpKipnKKgk6Sfo7iopKeupp2loaiSn6ihoaCYmpygkpqblp+hqpuamKCUkJOWmY2UkqOopJCJiY+GeYR7hIZ9nY6Jiod6gYSHiYmRhZWTk4yQlZSNjpR7gpeOi3d+e2x0cWxsc2F3dGhoamdnb4VnaGhjZmlqYGpjaWdbZXtjYFN0VFxbU0xKR0lPU0AhKmheakxDVlVeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdPJzKeoqORjqOmm56enaO1rKequrenrMTBtrCso7Wup66vt8C/vLLBtrCusra2uLa2raq9s66ysb2/uK68u7Gkn7arpaW0qaqunp3Bq6ilr7KprLW7nqmqq7GlmJ6pnaekkZimraKYnqSpoZuinJafnae2pa+qrqGhnZ2hlKCmn6GgmZuZnJGYnZSlnauhl5aclJKMlZeLj5iaqaCRiImLiHmFd4KCgp2Ii4KJfX+FiIaGkYSWlY+OkJGRkYySe4OVjYZzfX1meG9ramtndXNrY2dkZHaAYmVmZmVqamRrclpfWV1tZGFOaVhbYFZKR0lLTVJYPjlfbGlIQlRTXFtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOfkIusoZiYn5aks7Gisb22obHGvLqxsaS3rKquqbm8u7quwLKurq62rrK4s6irubGvrrO2urawuL2tpp61qqCgsKSqr5yiwKCxpK6wrreutZ6tr62topqdp6mlnpWap6WfmaSiqZ2an5uUnJ2sr6W6qK6ioZqanZmeo5qknZeemJuUmaCSqJWpp5qTmpqRi5SZjZSUmamnjo2KiY98gnOBgYqYhYd8iYmFhYqMipKElJyTkY+QkJaOkH+AjI2CcIB+ZnltaGtpZ3Fya1xoY2NzgWFmaGpubGdqamhuXWxsdHBhVWNpZGVaSUZMTU9YUVFWYWWBVUBWU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJGhmo2PsJ2ak6GZqLKvn7i/tqC0wru9ubGmtrCorqW3uLe3rbuvrKqrtqqzuK2ls7Wyrqmwt7axs7W6p6mftaidnqiiqa2ap76YraOur7S1rayfsa2wqaKcnKOrqJuUnKajnZqpoqSWmp+ckJujq6qpu5+npKCYmZmdoY9roZaZnHCClZqjf3WRqaeelJSekIiXmYCWiqGQeIaUjINuan52g3FshouGfYSMh3BeY2FnhJiGa4uPlJJ0d4uEfoOPf2eGgGd1aGVXXGhzbk5QamNncoRnX2Rmbm1qXl9hio+DhGVOS0Q5RlRnXkpHUFBUVUtIUmBvdGVGWlFVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Lo5mGlLCbnJOgm6qtqqO9xa+pt8K4vbytp7awpaukt7Oxs7G5rammrLSmr7WiqLi2tqinrLezrrSts6Kpn7OqnqGkm6anmKu6laalr7K2ra6kqa6rrKWhn52gp6ebl6ClpZubp6edk5+fmJCep6qjta+jo6OclpeXl6OIoY6Smoehh5OcoH+kf6WqnpKRmpGIhHJ4jY6FiKF2iIxpl4hmfXJ4oW+Ih4R+jn1/oaCgmYB8h550h452m4psh4GDbGhlY3prcWFThW1jbGmYcVlqcW+HWF5pW2trW4hxbnpyhWeGhFpeR04/R19NRlJWVlFRUldUZ15NV0lSU09FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoi6aWg5yrnZmYnZ+qqqeqv8Ovsbq9t8C/qqW3sKmsprO0rq6zt6uppbGtpbSznK21trSmp6izsa2yqK6eq6CyqKCjopqho5qts5SjpaW1vKesp6uqrailoaCYoKajmZmlo6SYnKSplpSjnJSTpKWmobejo6CkmJSTl5ObiK6PmJSJqYuXoZuFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxl7ycxXpytaa7kHuAbJaxq7B4aGtYsa5uZWm8krxuaHpuco/YflNqYrayf4FylXSaoaqQV09XYlBWTkZUW1hRUFKMXFdcUEBcRFFOREdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mkoCnqp+XnJ2lrbKoscK9srXAtbe+wqums6ysqaevs6mvtrSnp6a0pae4rpyzsraqpaSnsa6usaaqnqeksaOin56Xm5+drquUnaKfs7qjqqmira6loZ2amqGnn5ebp6CfmJ6np5Gcp5qTnaGmoqCwop+fo5aVkpiSmYWvamqKjap+Z4OVhq1kcJ2ck5mllHGuoaR+eLt9a6GPdrFfarRbpYBmnJFgZoJ6Zn9qeGupZL5yZ6aMdbFqfLF4dJKTY21tp25bhKBFaGaHlkV1nGB+Z3ykp4JZX4uraYCWeHlqpzdKr1xYU2xkW0tOV19cV1Y7TolPWFcvSVRUSUNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCrKelnqOkqrK3rLS9vrC2xLK3usKmqbCrrqmpsK6jsLqvo6SusqOouKies7Kwo6Wgqq2vrK+mp5+jorCbopuXlZebm6yllpqhnrOzoqucoq2toJ2Zl6ChqJyZnaOfnJmhpqSPnaOal6Cfqp6mpqCbn6GVlZGWkZqFtZu1eIWpmbWZdoazm7d+k5WWqJR+a4Gme4KGiJKUknerZ2uxW6t7j4eUdIlxj4aAf4iQl3iCgouYjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVhYQSNNaEVCRUFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+Vh7OmpqGuqaeyrKm7tsKwu8KtuLfAqqytra6mrbGpoa+8qqGntK2jq7WkprOzp6Oinaeqsqiwp6Wen5+vlp+YlJWVl52soZmZpKi0r6Kpj6moqpudlZigpaean5yin5ugo6SjlZufl5mdoqmbpZmcnKKgl5ORk5Kcg9WTmblwsMJ+xYZ81pSbu3yZlaSPjZyNpHuOh6OCpYJ6rHmPnVaveoh+n2q5Wrl2h4R9poKTfJh6qnmNnZB7sW6OhHSQvIVvlFCvp8WKUaB6Y2CpY3RyiG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITm1NW1JPWWZZQ0Q+RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcxJZuik5ixqKils6qltKmkvLfBsLnAsbW0u7O1p7Gwo7Cypp+utqiap7muo6+xoLO0sKCknp+nqbCptKiknJ2eqpeYl5aXlZWgqpyZlqetsKmjno+soqiWnZecoaWhmKKhoaGaoaKmm56hnpSZm6agnKeVm5ufoZmPkZSRnIiybmi1cauHbo6mcrRzcrZ7mZeji4+djaN/kaGlfrB2g5HS0XZcrnuFf6Rvm6qma4eFfa19l5mPe7Fzkp2PebNllnSEnm+eZpRSyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tfbGhPVUdJOD1WUVpXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnZKlr62kqrytprWlp7a7vLK6v7e1tLq6s6W0tKGxsaKfrLCkl6a6rqSxsJy0uKqfpp2hqaSyqKyppJqcmqielZSYmJKSoqeflpKlqrCmopaTrZ+lkpSgm6Smn5SapaahmqKfrZqgnp2QlZuhnpyllZ2WmaKflZiVkZqFrHt3qHajjoiGqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXiFfo+ehpmZd6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1fd3eHaJiIa12vd5Wej3hsNXnIrrJfQlNvXmdgRVBtX3BtVlVNLmVjaFJYUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOjk5n52Un7iwl7TBraizqKmyurezt7+5t7K1vLWkt7OftKyfn6isn5SntauosbGrrbSkm6mgoKihtqemqaKZnZWloZOSm5mSlKKkmpKQpqyvpqCVmamfoo6RopmopaCVmqWonZyknqydoZ2gjZSemp2hmJmclpehoJOYkKaehql9faV4oY+Og6pwrYuBp4aVn6GIl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92iHSogo6bjZKjfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFtMdF1iZk1bYV9ydF9KVjZKm5NYSEU9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKGdmZm/q5e0wq6srammtLC3sbW/ubmysLe7qbq0n7CknaWnp56TqrCpr6m1rKqvoZihoKalpLqio6ugl5uRoqCUk56alJeen4+Ni6ivr6adlpuopp+MkqSXqKunlJepp56eoKOtpKGeoY2VoZifoJKdl5yVnaGVlo6rm4+ubXK0cqmMdoqmc7R4c7OAkaSikZyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWSiK1rdbNhnWaib4eSapdcrV9NoXyHkVJzo216f35vmIdxXK9WPJx3ZVRvbi5cp09jUmtlYm1aY11hcHtjU1pRPj5tbzNDQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpudu6GcssCurqurp7epuK+1wLW8sK+5uKvBtqmqoJumo6KdkaqqqLajsqevqqCXnKegpKu4naOtm5aZj6WilYydoZuYnJ+Rk5SrtbCnmZScrKqXjJOlmaWtopGWqrGkn56mq7CYoaOQmaKWn5uWnJehkpypnJSQqpmH1JKau3Oww4DDhn7Vlpu4eIeQl4yYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9lYGsqXF7f3W8iKegaZ1hpo6voX6MdIeqfb5uc7x0soN1eIGKbpqIcW6NpHS9Xnd9W2F5vGtaVltqel5qYWVnYm13b1lbWUNBQHJAQ0crNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueobyil7HDsK2qqqyxp7ivtsSxubGuuq+uwLGrpKKeo6Kcm5Cpo6qypLSmraWflpmqmaasuZ2jrpiUoJCloJKMnKOel52bkJWSr7mxrJWXo6enk5CWpJykrZ6RoKirn5ufqKOznqOljqeilKGanJiVo5iPsKCSlKmehZCZtYCQkYy3lXiCk5q1d21rbnNueo+Ejol0nsG7vZp7gbKocIB0kbiDfIaGjIaNe4qHjZd8pLu5vZx1erOjdHaXdXSwdZmeZoZpjbV0cnB3toxegHp9imiDeW15Y4uscHWFf1pbp2pFZVpUZmBjXWNRZ2dwbHRCTVBMRDpaTT9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz47PKeeoKG/pZa0wrSsqqisq6m7rrDFrrSyrrentLitqaKhpZ6gnZmTq6Stqaa1qKefm5ago52spL6moaqXlJyQopuRj6KooZOdmJOXlLK1t62YnaSkooqSkqabpaqblqmkpZyaoaimpqOpoZGtnpajnpeXl52ej7ColJunoY5qfmmcpniHcn2ajnR6ZId7vb7Aum+SgnGVh2Byalpem4phY4iOlWtgf5VjbZ13YpVrgJqVlGVeYGNxmopocox9hZVnan5ydHh9fWJbd3SBaFBcboR9e4trWGx6gnNJSm+GcE11TUVXXWdhTFpXZ2NfT1ttdWpxUk9ERU47SEg9TD8yLTJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6ooKihwqOatLm2o6ylrqeotbKryKuwsqu0o76xsqagoqido5uZmaymr6Sltamlm5eVoZqmram+p6imlZOblaCakpekqaiQnZGPmJywsr+sm6edp6KIk5Gpmqijmpusn6OZmqOnrKKfq6KasZuVp6CXlZ2fnZexpJehqJmckZ2coqSYpqKanJqamY+VgWdtfXF3kpeUkYWLtaqNhpiVjoqMmJeHlJWKhJKUkYmOkpSYlJiXmqCimpyUoZ6NgnqkhmxqfJB8gHSJioFxgnh5dnaLgHuKa3OBdIN1ZHd9d2twe21gY11waE1YWmZqYFdab3lubWZTT0ZTOU9ZTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Gzob+hpLGyt6CppbKnpbC1qsirrLCltabAp7SgnaSknKOVlaCqpq2jo7arn5mWlZ+WramlwZ6ro5WSnJeemJOUop+eoqeTkZmop7LEr5qrnKufkJaWqJ2qm5ygrJihm5yipK+moaWon66Yl6edmZqgnp6cr6CcoaaVmJKYk6ChlaOel6COlpOKio2Olq2PfJWbgpKCi6qohoGYloqEj5+Ie4SQh4WZkoiGipWPm5eNkJeeo5aak5GejX+OZqGzr4WKhHZ6kIp8dnl6b2Z6kYGAiWt1gXmIc2hzf3p1g4eCa3RkeWZgaWVjZGZrWWt7cGlqXFNMUERfVEVAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua+/rKuusrGgqqaxraKss7DEsKqro7OuvKO0m5+moqGcmZenpammpKWztZ6VlJ2ZmbCmrr6gq6KQkZ2amZORlaGcl6ichJ6qq6KzyLOfqqSrlpaXmqedqJqfpKuTnp6doKmvqaWjq6Kum5+goZiknpyfna+jmJ6ok5iXnJGkmZionZqXZYKSfGV+jZmPY3mNbGhre5Kkqmplmph+Z4aKZWVpaHuOoY9raI2XkaJ3a2qLmKOemXNsbnqEjYd6WGVehoJebIuJgHZcaHN3d5KAh4JueIJ4gHNteYR0d4mIjoN7aYZZXmt0ZF1ziWlqfXFrY15STldKZFhBSjQ9Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7CqpaitrbCnra2wvLGpp6Str7CfrZefo52imZmmq5yto6WnqbKtnpWjkKKvpra5pa6jjo6aoZmSkpugmZmllXulraKos8S4pKGnr56dlJ6inqOco6mpkp6hnaCqsKqrpKqgqpumn6igrJahm6WwpJebqpWhnpuSpZeeqpiefr2Dh3K0coSdha1oeLnEuHGToqN6ppmZc6qCfMvAwLtxi6KIgp99lZiIncC9gpadnY2dwsF7gnySjZrDwH1rpbJvjIFvynp/m3eSg46BdnqBgHlxen+HcXiFjZN5bXeUY2ZfeWRgZYJjXnRobGRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO5w7Swr8CpqJSjr6mwrq2msrSvqaWmprGrn6uYmqKfnJqqp6KdrKKlqKWktKSdopOmrau4s6evopGRmZ2lkpGgoZibn52Hp6ykq63AwLGhqa+pl5GenaGZoqOqo5OgoZ2dra6prKejo6ehpaWdramSpJqorambnKmcrKGWlqWVoaKXnH/OlHh6pIF4lJabX66PXo6ngaKgfKeWm3SrgoCvXmONqnqnh4WgdJeTiLNjgquGoY2Ns2qEr3R9l4i4YYOtWaPNbZB1e9p7f5lwfoeSdn5le4h2dmt8iG9+hZGSfm2Cj2BybHBnYF95ZFxxaGpjZmBSVFJXXUtPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3CwL+1tLC4l52RpKqorbOrpbKsrKukq6awqqCnm5mll5yir5+gn6ino6WhnrCsm52Vp66tsaqorKCUkpufpZOPn6WYnaejnq6kq7CowMazqKmxrpaSnZuhl5+pqp+VoJ+cna2vp6upnKeopKKrk6yzl6Wiqqmdo6alobCgkpmmmaCalJSRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553qoJ9rX+ccq1+q4eGn3aYknp8l36qiKKMkYydfqt7iZSPn4B7rVacxHqPb5LBfYGVbXVvjG1ldmWGb2F3bnJviouSkINtkpBmcHV1cGBnbWVfb2lpbmdjV1NcYVlSU0M4SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSgnaOOo6OirK+2rqixpqiqp62rq6eio52ZopWgpaqfoaWgqKiin52vrJialqinr6yopqmel5Sao6KRlKGtm52mo6+so6y0qrnNsq2mrayWlZydopierqydlqCZnZ+psqmqqpusq6SjrJuvsaKoq66lmKWqqamxopKWo6SalJKFpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBgUquEf66Dm3augaaGhp96mZaGe2aAo4mkmYaCpH2pf4KVh65efalVnaKSgXqin4B7w6/Fi3Kvs7O5cWKpr8J0aI2MmI+BbZqUcG55eHhvbGZlZXFwZnxpYl1XYGlYWFVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1b+hmaunoa+inrC0sK+praKnpqqrq6mkpqCbpJ6dpqemo5yrmqKsoaSfr6Kdm5OqpLWwr6Cpm52WlKajkJqiqKCgpZywpqSosa23yLK1qquplZGdnKKYn6WznZqglJyfp6yspK6araqjoqqis66iqrOxoZqpqK6vtqKSlqKnmJuRfKpsnoSHdat5fLBvgqSLiZ+Wlp+UgdK4tLjJgIGyX1+UqYOjiIegepiVmniqyXSZpJWoqpGTmoyAm4qZxsZ4ZqGCpXOBn46Cfa9dcLRisHVLo4Ztp0eCk2SPkJ6SfHGXk4Bxe3V+e25bZmpycGWBal9hWGRtXF5ZSU5MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4ramzraylopyyuayqoaaaqKWqq6qnoKalmKqjn6+rnaagrJqeqaWdp7WfopeTqaq2sqycpZyglZClrJGZnKejoKmmrqGkp6mwtcKys6qtqJOJl52kmqGjrqaYoZWYnKWmq5uwna6opp+spLesoLG5r52brqeys7OklJenopmfjoKdTniagX+feoOjfYOkhIamnpyek4S4e3x5uYJ+zMbCtniboZGLn36alpaKdp6YiqSYpKl/sIWdhZ+ErH2alGKlbKRwj4WQgX2WgnKsYKNzcYCaYLx9UlV1j5Kkl3t+k5KLdXtzhX9xXG1ueHJqgW9bZF9obmJkXUtMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruaqvoJuhrLOzpZ+glaWura6qp52mppqjp6GzrqKpprKgmamklKO2oqKVl6Kptbmjm6KdopOQobGZnpynpaGir66dpKiitrLEsa2pramRh5Ccp5yipJyll56YmZqmpKmar6KupaaYr6W8raG2t62dnbWyuLGzppedr6CjnYWP0bXDt3mHjoWRk5CBpniUoXeMoJGEpYGKcaqGhLRucmqZo5uVip58mJmGh49zr4Klm6KOpouTnYqVkJptcLJcpXOTepxsmX97mXxtqWGjcXF/n2JzsrhoeJCUpph9jI2UjXh9eY+CbWl4aXlyboB1XWVkbm1mZ2BKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklk3ONiq2/v7u6tJ6Wp6SttaGimZWjqKeuq6yZpqKfpqCgtaeiqaewo5Sso46krqOdkJqaqrS0pJ2knKiRlJeuoKCdp6Sdp5y1mqGqpLasw7Cpq6mhjISOnKGgpqKVmpqcmJuZpqSmmKyorqOlm62mvqyUvbCsn6Kws7mrtKaaqLGjp5d6qJB9fLB3ioGkpYicbbJvoIetfKGOg6eVmICsiIWuhZ+UqaChl4afgJmVgHuSfquAnZqWi6p4nZ+QiZOSgHmvXaOBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkqaZgpWOmI17e4SYf2ttf2N+dG6AemBnZXFuaGdnQ1phWz5LVDNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTgwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2SmoOpxsK2wbOfmqygrrilo46bpKOfsK+qn6Sfna2Znrmgo6ugr6marqGQq6mklomakK6xrKafppqsl5iPrKGhnaWhmqWdrZigqKa2qcCvpamkn4uAjZuan6aekpSampSamqWkpJqprKykpZ+qqL6klsOsqqKhq7K5qq6noLOuqKmYdq9+kIuchYd8uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWmmaShoZGFoFtsaoGzYH+te3uCgbFsZ2+ZmIyIsFt9tFukg2vIomSfgHu8WHa0WrJ9Uq6AeqxYgKFumJCom4uXkZiYfHmPnX5kdH5ihHh0gHxhamdxbWZlZU9VZFxCVV8+Sig+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRXWl5gYGBhYl5fXFtYVVBOSkZDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaXFxYV1dHQjvSn7Oyt726tMKzo5uspqW2qKCLmqCfnLOzqZ+joJ61mKC0qKqsna+tnqybla+ooo6Im46vrKinoqaZrpKZj6iaoZ2kn5mko6WZn6Oqsqm9r6Wonp2OfYualaCgmY+RmpuSmpeon6GaqK6opqajpam7nqDGpqSooau0tayupp67rayslYCpkqOvjpuAh6SXmJCBgLjDuoOOnJOEp5acgqyKgq+IppubpaqRftW9wqpio7+9fX6jgoPXuri1hZSTg569voNro4Fvq4RsnH96srDHg2qrsL2seHeivrx0gZaOp5yQm5GYnXqCkZt6Y317ZI5neYJ7YGxla2piUGFaU2pcQFVhQk4qPTo0Lx4fJB4lMiAdJCgwNDk2Njc4Oj5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5WztLG/ubG9sqKdrqalsqadjJilv6q4sqihv6anspyesZy5qJ6tr6amlJSwrJeMg5uRrqWirKGjnKqfmIujkqaep5yaoaiimZ6hrK2qua6oo5uXknuHmZGmm5OOkZiYj5iTqJqgmKmpoaqnoaOqu56oxKKgrqOqs7SqsKmguqeurppzdaqkt4ZliaBwZ62Pio9tb3ekkJmfgXWumJRwj4txlaijm5eupHJtbW1linhvboKZcYF6anFpZ4mWlZhxaWmEh2dwhmRdiGJqb1lcZ353pl9hcY6RbmVkgI2Tj6KYmZmRmJ99h5CVdmaHeGmOa3l/eWRsY2ZsYktkWEpsWjpRZUVSJ0s6KyMcIBsiLCkYGxgtMi41OjQ1Nzk8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOpubmys6qpoa6eo7KpmJK+ssTJvraqnsCsrKOhqKyguqOkrqytpo2XrqmQjIWVlq2epquhnqOjn5GLpJKnmaiZlqOqoJacpqanr7qsrJqbk5J7hJeNpZiNkZGYlI2XlaiVn5ipo5uxpp6iq7mfr8CnpLKlrLCxqq2rp7ejrbeWiqCopbadiZaimIepmpCUnZKps5mbo6ugsZaioJ2fopygpaGVq6eNk5KMh5OcnJWQmpOYkY6VhYGkmpeVjYuTkoqPhoR9Z4l+dIJ2dIeLcadsepSRk5KBgY6QkI+dlaGWmpiig4iVjXJpkHdxi3h3fHpqbGRjb2RVYFhAaltIY2FPWitGPSsnITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVZZXmBhY1xeVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW2rq6isKOtn6C1sZCOrMe9xbu5q6Kmnpumn7Goo7annam0p6iRmKyii4eJj5unlqyloJmnnp6SlaOXqJqomZSmoaOQmqeZobW7qKuZmpCNe4GUi6CUipWRlZCQk5elkJ+aqqCctqOep6u3p67BrqO2pq+vsKypqbO4oK68mZGlpKa2opKdpp+NqZ+Nkp+jrK+boaOwqK+Xo6Cco6menp2clqudkpmhm5SQlqqZjZmZlpCWnpGJoJ2VlIWSjJCNlIqAfWaLhXWGdXmIg3OcaoWQlJOQiX2MlpKSl5Sik56YooSJmYd7cpZzeot/cnx/am9kXnBqYVtfWW5jUGBkUFo6R0dFPjI9PTgvKyYrKSYdJjQwNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVVQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9fYWFiYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mmraCntaqQkJ2ltLyvra2io5p6naKxpKWxqZebuKajlJmqnI6Giomco4+un6KVp5+hkpeYm66LqpaPqJmojJipj5+5tqWmmJuNiHmCk4uak4qVkpSQjZKXoo2dnqien7ijgISvtaKvr3WkvaOyoHd5oKqyupR1rKSeiYCqf2RcYnagjqSehJd9bpOznaOnraqjZZ2fknN5mZZwgJiol2x/oqeKZZylnJGXmJaMkpyRhp2akJWDkoePjpKJhHdqjoZ2hnB7hoGAYWmHipSSi1p1lZFoaI+Pc3ummplleZmHg3iYaoSLg295gGtxZV92cGxraFxnZWJicFNcPk5OTlNHPkBURDkxLx4fJjQ6MzE2Njc4PDs+QEFBRkhCR0ZJS01UVFVZXWBoZmdXUUo8REc8OFVSW2BhYmBeYF9gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOhr7Gsq6mlqa6jp62kkpartrCyp5urpqyXdIydr5+oqqeTl7mfoI+cpJ2Rf4mIm56Nq5qilaehnY6WkZ6Eda6PiKaaqJGXpImcurSooJmYi4l1d5ONlZOKlJGQlIyQk6COm6CmmZyyloCMm7Wds4ySj7ynoH6nonqirraBjo6mnoOLhpCxqa+MipajmnmAi6yGnJ2ip6mnh5WFmHelm3qHm4GXp4KCe5yxeoqGoJeZlJiWgpGXloSamWN5h5CEjo+RioNtcI6HeYBwgIGFf4Z0hoSVkXiWaJJ0oJp0fZmEop6HmH+Ti4OEmWuOjoVseHtxcWdkeG9qbGpcZmtqZXRcX0lUTFFARTUuWlRVNykhMDk9PjY0MzU2ODs6PT4+QERJP0lFSktHU1hbWVthYWlmWVFIOUVLPD5hVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq2uq6isoKixpqeppZmUrsi+saKXp6m1no+Enaycp6KgjZC+npqNn5qgkHyGjpmYiKycoZafoJGNk4mGgJGojYeinaOTl56Gn7qyp56bko6FcHWQiZSQipSPj5uLkJKfkpegpJaeq4eftIm0mq2Kyoeqroi3hYyvgrCug6mNpZiNnX2oj3J7d5yPp5ZolaR5tIyfnqaokpjCgX+riJihcp6AmqV9l4WVsYChfaGToJCYl4GOk5uKmJGLfIWTho2UkomDbXKQhX95cYaBhHyEdYSBloCPxWZ/qYePo2ueg6ObhJqBjo6GiplxjpOFaHd0fHdoaHVxaGhrXmRwbWdtWGdHXVJNMkU0Nk5hYzcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5qbVxRRT1MTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJein7Cnqaimq6CkuLGqq6ealKCjpKukl6Wqt6OvgKGnnKWenYmUvZmTjaGSno95hJaWkYirmZubmaGFj4x3m5yPn5CInqSblZmYh6O5rqWanIyMfmJtj4uTkI2QjI2YjJGSn4+UoKGZoad+oaeHrZ2glq2PnpydkYWAoI2rroajjamZjJp/o3WAmZRrgqx1Tat4h42ckZuop4Cpq32DoXt6p2mef5JrZ5eGl7aJnn5uYGRZg5d/jHtkaItymX15lWxde5ZtX1Nwg1xfa3mDYFllgn2DgJdwp6prg6NucqVwn4WgaWagbVtuinxmWmCDf2JXUG93Zm10cmtqb15rcG1saVhpT11YRjlBNEdEXms0LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15eY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeWnaC4oKqkpqyRobW8rK6imZigoqWsrqGdrrWiqJKhoJ+mm5mNmLSZkIufjJWLdYGUko2KppaVmJ6ef5KFhqykh5uQipipmJmakoimsaeilpqIiYBpboiIi46OiouNkouQkqKMlJ6gnKGkf5OBj6OhlKB3nJaPp4Ohp3+GqayEpXiKfISafqJwc5SIlnuejHlth5uMmZCbqJqPh517gqJzdqZmnn53pF+Yen2Sc6JumLe0unSTh4J/tahkgca4e3CVt4txgJqkYnOsq2B9aZ2zfm58hoKNgouYcX+jbHKjdJ6EgKNgnZmzlnF8l5+zdHNbnrKDamJvdHZxaW9Ya2xycmZdaV5iS0U9RDZRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNTlFARV9eW1lYYGB8ZEhDOExXVVZjYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS3ta6toJuinaOjpq6cm7GtrJOYoZmhpJmalJ6rm4uIkniLhXGAlo2Jj6GQkpSdl32QiY6ooIeYjoqRo5Ocm42LqailnpCXh4V+a3uHfn2PjYOLkJCJj5Sgg5eeoJ2gnouJd5yYooyfcqGLh6iIm6WPlqeqfq2MfnqgmXqjk3iBdJaIjZx9lZ+Gm46Zm6aGomShfIiWkJuNbJ5omo1umpl7gIunfXJodKuDnoN0qmiVml2bhXaEnWiqaoC4ZlyocIGcYJWMXqd2dYeJfp5omnWGk5KXjn+fbpqQbaeaXah+eLtrfqpbjoRds2dcbnJ6eGtpXHFqeHljYGZYYkFRRU83VkNSbzVLWlpfT1pEQDE1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW11ZZWZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4hjlJururKwrJ2mnJypn56um56wqKydl6SaoZ+Ylpago5mGiY1qiIBye5eIi5aWhJGUmI96ioSWo52KlI+Gi56SnZ2JkKmjoJqMkoqAgGmAhnh/l4x7iI6OiI+Wmn+Uop+goZOYcmifip+PjHCSjIGph5ieoqefp3yvraOiuJd3o7OipICIlHmde6qaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZp/dKpaXW97lot4nmJMfnp6hWN5l0JMnlmianJ8jm2AiISZdZt4homxs39/m5OndoKdbnN9lG+Zc2ukXZV2SGVkYXNxfn5uZmBsaXZ7ZGViUl5XXVVXQFpGUWhEU1dcYlheSUQ9Qjg/QjpJRjhMRVhBV1FbVkRGYlxaYEtgbX5yRUM8VV9iWmZqVmdobW9iZmdeYWFcXV5haGJfZWN2bF5lZ2ZrZGZsaWhraZOcgbCtmYRUXqCms7mzs6maooycq5ycqZSiq6ShqI+fnp2amZWYoZ2WiIeJd4aBb3mVhZCbi3yRk5aIcn+IkqGbc5GQgYmZlaCbhY6pnJqVi4uKfINshIVxgaGMeIWNiIiTmJV8k6OgnqOIrYZ9tYSOnpx7pZZ6qYGVnI+KoJx8p2h3bX6ZdKFzcXyehplwk4OufaSDpp6ZgKNvXqhndaJjb6VhnNOQfHuZeHJzY6KGkH6jc6SPdmuQs4xggpiJc6qyqLx/d4Ntfr6mqbRenG59cZduf3Kicl2kZ3OmYWimbZvUmX2Fm3B6epdrm3x4l3NuqaRnYWV5cICEa2dmZG51d2dgY1RbZlFRYklXSlRgV1NbZWpcZVFGQ0tNSktCS0U4T0BRTlhSWU9TUWFmZWpSY3d5d0lGRWNdZVpoaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+wq1RcS36pr7G0sLOjm5mFmamgoKSOpaigmKmKmZiYk5mTkqCYjoeGe3B9hGh9j4OUmoF3kI6PiW9/ho+SkmyXk3yJkZKkloOOqpqTkouFiXqDdoeAboGfhniAkoaHmaKXe5SjpJqfibOhoraLeqynpK6lcKiAmpCFgJuRe6SAoZmGmHKehKOur4qXjH+MpI2Vg62hlHa0tbXJoXOUioGfYJ2XqW15lYagm3Whh3egfpKXi4FvTGajknCbh3Kke3p0YYOBa36ga3FkX5xxfXSXaXpps7W0xqZzmH56nWucm6t1hJttdXiYaZp6dZhyUEV9tF5qdmt5h2ZqaGJ0dXBuVl5UWWlQU2hJVk1ZU1ZdaGtuVmdXTUtBSU1LSEpPQVFLUGVjaW1ldXNzf3l8bnWJe3tUUE5sXmhba2lSamhpbGdsZmNlX1xdXF5pYmRpa3tfXWRoY2pmb21laWxloZyIr6aEZj+UobOrr6+2oqKQgJiqoqKljKWnnZ2mgpqXlo2XkI+ck46Ig3lqeYZlg4x/l6B5dY6IjIFphIWSgoyFnY16jIuVppODl6mYjJGLgYl6gH2LeXCQoYZ5gZWHiZaglX+UpaeclpaEZm54nGyiZHxxpXebmHBnpoCWi3ukep+Wg5dynnaBipSWj7lukIqiYn2ZoZWIbXJpq2p1oG1upl+aaYuQaJaHmpV1ooB9mmCMho11b4hiaKBlnn5pmnVvY2aIgm1yolpfW2KhbV2JjG97fnNyZKVtd6JkZ6domXOMmW+ib1OJkG+gX2WoVIteVJhubXNrcoJtcGlreXNrb1JZV1dnWlRtSVlPXUhYaWlzallrVlFSRVZcTFhTYVVpa193dHp9cH18coN7f3N2jYCEdl5RcmJnYnBnUGpoaGtsbmhkZ19dXl1ga2JqaXZ1XVxjaWNqanNsZmttY5ykmKZ6ZXRti6eupKmwsaafi4CYq52fpoyioZuiooCWmJONmo+LmJCOinuGcYCIaIuLfJibc3SJfZB7ZIKHlYqJlpmCfIiHlqiRgaKskYaQioKKfoCAjnNpj6WEfYaUjYiYoI6Ik6qmnYmmeJWbfqWIloyymJ6Qgq+Xn6V3lId5qXSkjoSabqSijJKEjIO7bn2lr4OGhoaTlZyffKV6caiVoJZmnn5vq2OWipWSeKhsqaKBiXaIg3eqkaaHapGwa3azjKlrioZtbZ+ekpVgfquLqnZ+f4ylnnaffYSklZ2gapuId6xnn62MtnR3vo2kk1mDpo2rYXVydHB8dXFjan5uaGxTV1tWYWJda01dUl1JXm5udmBbcVlbYFpndGVub3FicXRgd3p+eXJ5g3OEf4F7e4yBgoB2YnhkY21zZFJrZ2hvbHJqZmlhX15cYmtibWx6b1xcYmlibGp3bWdsbmKVpaqdgYCepJapqp2op66kmYmDmKuanqSJm6WdqZ2FjJqOhpyRhZKNjI10hnqIhG+NhH6Yk3R0hnKSg21/i5KHhpOPfXuChZimjn+lpo6BjomFlXaCh5JvbIupgIOLlI6JnJ+JjJSqo6CPgHWUloh+gXmUrqN/gZtxj4V4j4qDfntypoxxfX16l5abhI54e35+h5SVk4p2kJifoIN6fYlrjIVbeXhyenBobn6SiXF/dYGPlJNxhoSCZYx/XoF/i3d1c5R1b3lubodthIVedmh4jmWAgIWNqZt9dHyWaomIcIF2fYZ2bW1njHN5e5h4hVtrWHmPaW53cnFweHhwXWyGbmlnVltgV1xla2NVYlVfUV9weHhsa3Zlamtrdn1xcnRzYW91YnR7gXh1eYN1gIF/gXmLhYN9e21/bGR4bl5XbmdodWt4amlqZVxgWmNpZmxxdW5aW2JrZGxseW5obG9hjZS4qKaLoaKapqSZpZyro6GEhJiskp6hiZqmmqmYg4Gbin6Wk4eOiomNcoN8j31+j4V7l45zcoNwlYV7fZKLhoaQhXh9gIaZpI58p6GLhpCQhZaDho6Yd3KFqYWOkZ2QiJ6eiIybqJ+gqoOJjZSafn6Jlq2oj5Kmj3dvnJCCeZFvfaiFcH2VcWtwfYGfjH+TjoxobV2Di4ycm56Oc5WLiHF0a4F2dIBYcm6GkYF9foxqXWpke4WEiYBgaXh6m3uCi4J1gYWCZ3eKhmthcHGBdl5yioGIj6aVhWWMj4Nud4uEcYaPenBmZ2V7g3qWW1xqZ252W3t5d3Vuc3OCZlxtimtrYlpaX1pZbHFcX2FaXl1mdH56dG90Y2trant9c3t4dGRtdWhtfH52enx7enqAgH5vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbmxnc3lvaGptYIuLqrChkKOhmp6emJ6ZqKOifoOZrY2flYicopGllX97mIR8kpmJiIaHinN9gYt2hYuBhJaKcW+AcpiGhH6ThIOGioF6gIOLm6CQgqehh3iOmImVi4ucl4WDeqyCkZeZlIqenYeIoaufoqKji4iTm5yjmZaqoaemoJKbh5WNe3eNjoSnfn6SkZKTnLKmm5WekI2yk5eEpYyMlZufiZCbgoiRimt8jXd4ZYKGkIt8iZ2Eh4uQiIiAhISQd3x5dJmhiIaJnoqElH59ioCAdW9zhIN/d4aGio+mkIOFjYeDjZCMfYiMipGDd2yChH16mWpyaGF0inB9end3b3Z0gV1eb4Zobl9eWl1dU2hyVWNcXGFsaHV8fHNvcGRraml/fG55gHFqcHBsZ4F7coKAeH99f4R7bYKMhnx6eHx9eoN5TmR2anJtcHpla2VjYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2SMh525npeioZiVmJmUmaShnnyAmquOno2GoJyLnpZ9eZSDe46ZiYaEhIZueICAcoGHfomUhG1rfnqXh4SDkH+AhoSGfYeEjpudkoern4Ryi5CGk5GLnZF9jXuqhI2SmJaPnJaHhpumn6KanYWDkZqZmJCapp+lnZ2QloCQiXZ7h46EpXt8jpCRhpiqoZ2TnY+Nqo6RgJ2MiZOanoKOl36GjoNveIVydGB/g4+GdYuYgYOPgoaFfoWDlG15dXSSoYqLhZqEhIxzf4l8fHJye4eDeniKjoOSpo+Fg46Bg4qJineGiYqMfW9sfoF8bmhsbWdfen9ofXt2dHZ1e3dcX3B9bnRgY1tdXlFnblRkWl5ia2l2en5xbGxka2pngIBsc4FsbHRveW+FeW6HgHaCgH6FdnGCjYh+e3t8f3uCimBpfGp1aGmCZWpjYGlcY3Vob2J0bWxVY3F5ZXB6enNlam1si4met5qhpJ+SkZaYi5qfn557eJ6nkZyKh6WUi5iZeXqMhXyJkYOMgoKCbnt/eHOBhX2LkX1raH2CmImBiI58fYaEh32PgZCbm5GJqJyAcIyLjJOHoaKKhYx8qJGIkJKXk5aTeIyjoKCdlpl/gJCamJKMmqOho5mXkZt+jYV4gIOOhqB/foyMj3yYpKChk5mQj6aNj4KakYmTl5t+k5J+h46BdHSCcHZgfoCNhnGKlXyIjHGMf4KFho5nd3F4i5iRj36XfYeKcoGGe3xxeHqKhHp5kIyClaWTi4WQe4WGh4V2goSJiHtmcnx/eXtxbGpmX35zaHx1dnN8c4BqXmBzdnB3ZGNZX15Sa2lUZFlfYWhqdnmBcWZrZGxoZYCBa21+aG9xa314hnprjIFzgYF+gXR2go2Gfnx6f4F9f49qcoNuc2lih2hsYl9xVnRvbW5geGhtV2p0dmN1entyYmpveYmNnrKRpKWdjpCYj4adoJudfHaloY6YgIyiioialnh7hod+g4l/iIKBf3F/e3R2goV+ipF4Z2N9hpeKgoqMeH2AjYN5loGVmJaNlqCbfnCMgpGUhqabh42Jg6aVhZOLlpeTkneRnaGhl5OWeX6OmJeOlpqdpJ2YkpSbeY+FgneElo2dfoGJjYxyl6OeoZOZjo+ijIuDlpiDkpWZf5iMfIiNgHZxfW56ZIB8ioVwhpN/kIJsh4KBgImEZXVve4aSl4x8k3eKiHuAhXx7cX53iIV5hI+JipeilYGDi3eIhIOCd3yCioZ3YHl4fXR/eGdsZWF/aWp3c3R1fXF8YmNhc250cm1hWmFeW2xlUmNYYGFpa3Z5hnFjamNtZWh9g2xodWhsb2mAfIF5bZCGcYCEg390fIOMgYB+eoKDfnyQbXaJdHRtZYpsamJjdVaEaXFuYHhnbGJqdnBmeXx5cV9xbIaFj5yul6aono2Nl4eGn5OXmX14qpyKmXqXnYuMmJB5e4CLfXyDfICCgXh0eXp0fYCEf4mLgGRefYuVh3+Fh3R9fop/fZiEl5SXjKSimH9zh3uUkoqnj4yOipKgkYORkJSXkYuBj5ifmpKQkHN/jZKUiZ2dnqaYmI2VlnONjoprhZePmXqHiJCJb5edmqOTlYqNnoyGgpKcf5KSlYeZiHyKiYF5cXlrdWx8fot+bYWSgpR4cIKDfX6Kf2RyaXuAlpeEfo1zj4iDeIZ9dnd/fIWAfIKMhIyUpI94hIJ0iYd9gHR2gYmEb2F7dXpxfW9ib2Nke2Jub3ZzeHdzdGF1YG9sdW5vXFxfXl5rXlBdWGNhaG10e4hrX2pmamNod4huZmxoamxogXx6d26QiHOBhIR9dIGGiXqDfXqBhH19jnJ6i3h4bmyHamhfaXJih2hxb2V2Z25sYXlpa317eHBhd22LgJmZqqCjqJ6KipGGip6LlZh+d66ZjZd9n5ORlpSId317inx7gHZ4f4BwdHR7b4V9gYCKf3xhW36PkoaAhIRzeoCHeo+SiJKRnJOlnJWCfYJ9jouSpImOio2Xmo2FkZiTlo+KiIySnJOPi4xug4+PkYiemaKhl5aJlpBuiJmDZoWYjpN6iISQinCVmpSikpKJi5mMgn+Qnn2Sj5KMmY57ioSHc3J1a3BudXuLdG6GkI6ScXWAe4GBiHxkcGx4fZmTfYSIdJCKgHOHeW5/fYCFe4WLiISMlaiMeod8fouFeH5xcIGGhGNoeXR1cHxiX3Bha3RecGp7eXhsc3BleF1ubHNtc1haX19ia1pQV1hlY2dxcX6HZl1paGdiZ3GNbmRpZ2RpaIB6d3VvjoV0gYKDe3WCiIV3hXx4g4V6gIl3f4t7enJ4g2prX3BodIBqcm9tcWdvbGV8Y26AendxbHd3in6il6GooKabh4yKgZCdh5OddYGqlZOOh6GNlZOQgHR7doV4eX9yc3uFa3Jwem2KdoCBh25xW1h+kY2IgICAdnWAgH+ghpGLkp2YoZWYeIqAgY2JnJ6Kj4aSl5aFiZWZj5aLi42NjJ2KjY+DbYmLkJCKnZahnJiUhZiHaoSjgmaFnYqQfouDi4F3k5iRnpGQiYmVjX9+j5h8kY2PjpqRfIqAgm51cGxtb3B7hWlzg46YinF3gHWCiIJ4ZnJudYGZjnuIhHqTkXl2h3NviHuFi3qKhYKIjpujh3uDdYGLf3h4b2yBhIJecnRycHB4Wl5wYHBqXm9qfXpwbW1qbHZgcG9qcW1aWGFhYm5YUVNaZmdjdW+EgmJda21kYmZrkm5gZmZfZ2uBdXFzcIuAdX+DgHh1gIuAeIV/d4eGd4OFfIeMf3t2in9qcWN8Y4Z8bnFsdGpob2x2eF9xf3l8dHV0gIJ+pJWarZ6mloWNhH+XlIOQoHWLoJSThoubjJWOi3pyeHSCcHKFc3F1iGtvbXVtiHaDfoBtblVRgauVh4J4gHdygnqCoIKSgpOTmJyTmniSe4ONk6Sak46JlZiShIaXmYyUi4mPj4iehI+KfHKLhYmOiJyan5qWlH+TfmiFnIdnhaCHkoSRgolxg5GXj5uOj4yMj414e5KQeo6LjJGWjHyIfIBrdmpua2xse35hen6OloJ3eoB4g4x8eWdzbHOHlYp+iIZ7k49xeYNvdox6iYt6iH2Bi5CenYR8e3eCi313cWpsgoN6YHhwbmxydFZeb2JyYF9sbnlwaG9mZnN0aHBrYXdlXVZmYGByU1FOXGZlXnlwiHxfXGhyYmJlZpJqX2hkW2dwfnBrcXSKfXZ8hYB0dX6MeXuGgXiIg3OGhX6NjYN7eZV4ZnJqg2CIfW9va3pgam50f3VfdH14hnh0c4V8eKCPmbGcpY6Cin+DmoeAjJ5/i5qTjoWIl46Oj4R2dHZzgHBvhXNwcYNvaml2boNufX1tdXNSTYLfyJLWk3xwdYN2g5+Dk3eUkZmckJl7lHOFkJ+hk5OQipKbk4Z+lpaIjY2IkYyInH6OgHd6jH6IjIqcnJ2blZN6jXVniJGGbIiihJGIl4KFY4yRmY6VipeLjYqLcXqUiHuOiIqTkYl5hXx+bHtlcm9ra3l5XIB5kI6Ae31+f4aOenpocmpzio+JgYWEfJSKa31+bn+LfouHfIR5gY+VmpmKfHZ4g5B4c21ncYCEbWp0b2hqdG5TXm9kcFlfa3F3ZmtqYmZ4cm9wY193YGBWa19edlBOS2FnY116cIl0XFxldmBhZWWOY2FmYlhpc3NtanF2jH10eYaCdXZ+i3OAhn96iX5yiYeBkYuIfH6YdmVzbn1liH5vcGuAWmxueXlzYXZ6e412cneKd3mei5uvm6CQgoV3iJV+fYqdh4WgkY+FjJiEko6HgXR3cHlxboRvbW5+cmRleHB9bXp9amhrY6Sawdyu76FzbHaEdoSihZJvlpGVoJWcgZJyhYujl4mOlYqQnZaDgJWQhYmPgJGKiZZ+h3p1f4l4hoSNnJuYmY6Pdop2boWIin2Ko4SRiZyEhV6Lk5eKjomOioqEiW17loF9iIWJkY+GdoV9fWt9ZHh1aW54c1iIepKHhXl+gICFjH54ZXJpf4mOiYKCf4uWhWuBdW2HkIGPhH6Cen+QlZOYj3Vzd4iNdXNxZ3V6g2J0bXBiaXZnUmFxZ2xVX250eWFyZF9ofXByblpjcmFiV25ZXHhOTUxkZ2Jed3OJbVxcZHleYGRlhWBjY15ZanJrbmtyd4x+dHeEgXh3e4lxg4R9foh7dIuJh5aGjH5+l3NodXF5bYt6bnRwgFdxenZ5cWV3eYaMaHaAiXJ/nIeZp5yjkoV9cIyUeHmLnYSFoY2OfJaNf5qIhHtyd3Bzam+Ba2ltfHVeYXh3e3F1e2dgZHzr2rXJw9yIc2x0gXaKmomOapiQj52Wk4GJcYWJoI2Ei5WKjJiTfI2TiIOJj3uQi4WPgX92eIOEcoeCk5uXlJeGjHWHf3CEgYmGmKGCk4yegolhg5SPhomGiY2HgYdqfZSAfYOEiY6NgnGGfn9xd2h2cmlzd2xajHySg4V9f4OAhIqCdWFza4iBj4qBfn6RkH1tgWt4hY6FkYN8gXx/kZKQlohucXqMhnVscWxyeYFgdGluXWt2YFJlcWlmU2BwdnRgb2BdaIJxc2lXZ2hiaVhtVlt1TEtMZmdfYnJzhWlbXGV5Xl5kZ3tgZF9dWWtuZm9pc3iKfnNzgX56dnqIc4WDfICHdneKho6ZgYyCe5N1bHd1eXiTdG54e3xYeoZxgG9neHeSgmN2hoVxipaFmaGaooqHc2+Ti3J3jpx9ipqJiXyff4OZf4F4cXNub2RyfmhmbHd4W195e3txcYBqYWdhf9W2jpCmeG5xd3xxkpGNh2qZjomckoyGe2mHi5mGgZKRhoeYjXyNjYGBiY17j419iIR6dHqCenCGgJaajpOUgYh1g4V1g3+KkpyehpWPn36IYX+Th4SIhImNgICDZ32RgH5/goyOkH5tgnyCdGttd3RzdnVrY42Bj3+FfnyEf4SIfm9fcnCEe46MgXx+kIh5cINmeYKKhouCe4R9f5OOj5KDbm95jH51bW9rbHt+Y2hralludlpTaXJpYlFicndsYmVeWmqDbXNiW2dfZGxfblRbcE5IT2dlXGducYBsW1tjc2BcY2x3ZGVdXVprbGJtanR3hn9xcH98fXR4hniFgn1/h3V5iYGSlnyIhnaJgXB3eXuEk29tfIF3XoN/dIFtaXp0lHNnc4d8cpKRg5qfm6CGiHZ2lX5tdpSXfoiRhIqOmnyMmnZ9dnFvbGphdXxmYml1elpfd3x6bXF/ZWRoZ1edj15xc5a8xIR2cZSJkH5zmIyGnZOMiHRriI+VgHuUi4GEm4x8ioZ9fImMf5SIdYmFdXZ9gXF1hoGelYaVj4KCcn+HdIN7iZecl4aTjZyAiGV9koJ/hYOJiXKBfWd9i3t5f3+Hi499aYB9g3Zmb3h4c3ZzbGqNhYqBin95goCEg39qXnF3en2MiYV7gI9/fnKAaHiChoqFg3iDfICXjI+MfW5seol9d3RvaWh9d2VdcWNYcHNTVG5yaWJOZ3R4ZmBdXFhugG9zWWViXWptYHBPWWxSRFRoYVprbm17b1pbXmxjWmNvdmRnXF1ga2pjbGlzdoGDcW5+e390dYN6g4J8gYV2fomBlpF4g4p0gYhyeXl/jpBvb3yBcWmBeXp+bW18dpVraniEdGuUjYWfmKCahYhufYx2aniYj3+CioKVmIp5j5ZvenNwbGpkYHR6aF9lcntaYXJ8eWZwemFlZY6xsndKYlqk2dCXcnuRi5F4fpWLhZmRjYZwbIaSkXp5koaBhJmKfId/eHiJioSWgG+Kh3F0fXppeYWDpZGEk42Df29+gnaCeIWamJOKk4+UhYdvepKDfYODiYNvgXhogIV4cn9/g4qHfGV9foN1Y3BygGh4cW91mI2Fgop7dniAhHmBaltwfHKAh4WIfYWIeohygG1wg4aOg4Nyg3iAmIyNhHdtbn6Ef3d6ZWhqfXJgWXdaWXJtTlhyc2ZgSm12dGFdW1tZdH1yb1dnXWZqcF9vTldpUj9ZZ19bcGpneXFcWllrZVljcHlfaF1eZWxoZmxpcXd/h29tf32AdXCBen+Bf4J/doGFiZeKcYKNcXuGfHp6hJSMdWp6f2tvfnR/fW9yfHuUcG+Af3hmkoqCoZickoKFZ4eEcGh6l4l+f4WCmYqBfI2MaXhya2xmX2FveW1fYm95XGRsg3phcXZfZWXV676LMjo+i46AcnmFiI6NdoSXjX+Tjo1/bmyFjYx1fY9/hYGViHyDeG52h4SClnduiIRsdXt0ZnmCg6eMg4+Mg31uf3R2gnmFm4+Lj5GSjIuGfnuSh3iAhI2DbIByaX9+eG18e4GKg3hheYSBcWRxaH5tdHF0gZuLgH+FfnN1fYBzgG9ba310eImCinuGf3yIeHlwa4iCj4OJcoF4f5aKin50bWp2gIB1dVxpaXhxWVd9U1pxZUxbcnJlW0pwd29dW1pZXXR+dGhZYltnZW5iaU1XZlE9XmZdXXZmX3RwW1lVb2RaZHB5WmheYGdtZ2lsaXB4fY5saoKEf3lugHt9gH+CenWCgYyThXCAi253foB7e4iTiX9oe35rdHtyhntzd31/jHp4hH58a4yMg5udloyBgGyNfmtpf4+Ne35/g5SCf32KiGt1cWdoY1tiZ3NvX2Fsc2FocIl6YXN0XmNkm6CQblw1Wa+1dWqAiX2ShnaGl4Z0j4yKd3BshYOHdHmJeIl8k4h6fnJndoh+fZdvcIZ9aHZ5bWV5iISlh4GHjYp+bX12f4B8i5iGgZOQl4iLhIl8j4hxe32FfGl+bWqAe3pqenaCh4ByYHeBfnFkcmd1gm11e4WVkYF8gn9vd3l8dH5tV21+dnOLgYZ3h3WBiXl4cm2IgI+AhHJ+fX2SiIh6bm1pbYKBdW5daGZ0clJbe05ccVxPXHJvZFZLc3hqV1lZWmFxgHRgXV1gZmRoaGZOWmhOQWFkW2B2YVx1bVhYU3RhWmRucldqXmJoa2dtbGlwd3ySbGmEin19cH5+e4F/gnp3gICJi4Rye4dvcXeDf3uKjY+Dan57bnh5dop3fXiAgod/g39+em2FjIiYo42Eg3t2jHlrbYSJknl9e4KRgIB9ioNwcXBjZl5ZZ19wcGBgZ3Bmam+KdWF0b1thZGl2e3++nKajyLhyhYNzlH14h5SDdJCMiHJycIR7g3N1hnSId5SIeXlxY3eGeYCSaHKEdWZ3dmNqfIOInoKAf46OfXF+c4R4f5GPgneVjZSPh4KIeomJa3h5fnVoemlrf3lzaXp2gIN9aGB3h35qanNoe4BpdoGMkJR+en5+cXt2e3R9YVV1fHJyiYOCfIJwhol3eHBvgoKLfn14fXx1jYWDdmhxaGyIgnJwXWhjdG5LZXZMXm9VVFlzbWJRT3R4YVJXWFxhcIJzW2BcaGVkY2pkUFtxSURkYVxkcV5cd2hVV1Z3XlxlbmhWbF5hamdlb29ocHd7k25piIt5fnJ7fnmCgYJ8dn2DiIaDcHaDcm13goN+iYuUf3CAfHh5eoGLdIN4f4GBgoR5gHZvfomLm56IfYZ6d4d8aHSGjZF6f398iYaEdo+AZ29tX2RcWGVZbXNhYGFxbGxoiW5gc2lZXmRtgHep2qrHhoeycop4cI11e4ePgHqTioB1dHV+d4BvcX5thXSUhnh0bGB6gXmIjmVxg29ndW5bbX2BkJOAgXmSkn13em2GdX+Qi4NzlYqQjoeFhXt/hW11dn9uaHdlbXx2bWp2dn9/fGFieIZ6aHV1Y356Z3SGjoyVe3SAdXGAenxsf1lVcn1vdIOGfn94a4iGc3hqdH+Dg316fHh7coqAfHNnc2Vti4RtdFtqX3ZlSG5vTFtiV1dWeG1iUFN0dlhQVVheYHGEb1xgY21kY15uYlRdckdDZl9dZmheWntiUlZcdVtbZ2thVmtfYW5mZmxxaHB2eI50a46NdX92eH13gYOBe3R9g4iIg29xf3RxdX6GgomNint3f3iEfH2Fh3iHfH2BfoSAe35zdnmMjp+MiXqJd3WDeV5+hpqNeYeDdIaGhHeJe2JubFtiW1thVmp0Y2BbaG9wZ4dyYXFmV11ja398ys6HuaJrbW6LbXKFcn2Fin97koV6eXR5dXR6am11Y4R2koJ3cGdefIF5i4llcYFqanFjWGx7hpyJg4Jzl5R3fntth3CAiYqGcJaOkIiFi4N6eX5xcW99Z2hyYm14cmpscXd9fHpdZXmAd2l1eGaCdmd0h4yNlHxyh2lufoB5bXxdV3B9bXN/inuBbm6Jf3B2Z3Z+gH6BdXtxenSGe3lxZXJhboyCbHNYa194XElvbE1XVl5UVXtrYU9UdXJRUVRWXmJ0hWhcYGtqZmJZbmFYYnBHQWhdYGZeXVZ7Xk9WZHBaW2poXVdnYF9yZmpocmdwc3eGeG6VinR/end+eYOHgHVzf4aFjoJwcHt3d3V5h4WHjIZ6fH91i359hoSEh39+fn2Hf3x4dXl3kZOffox9i251gHlkg4iXhnSSim+FhYJ6g3RjbmpZX1tdXVRnc2VgWWRycmeBc2JrZFdbYGl/eL6ue5+3bmJzh2h0fHJ6g4Z7fY2AeHhzdm97dmVqbmGHdY6Bc2piXn54eYqDZnF9aGprWlZveIqjgYV/cZmTcYB4dIFtf4GQhnKUh4yHg4iFfXl0cm9oeWFqbWBtdmtna2t6d3p3W2d9fHhlc31uhHRldYaNhpV+cItma3qDdGx0Yltue2t0fIt6gWZ0hn1tcGd0fnd9fnF7a3p7gXl3cGVsYW2Jfm1uVmtgd1ZLa2xPUk9oTll8Z2JOVXVrTVBUVV5ndoNmXWFwaGdgV2ldXGtoSkVqWmJkV1lVeVpOV25qWV1sZVxZZWNedGZsZHJncnB0gHhwmYV2f354f3yFh311c4KHgJWCbnN4enpzc4WHiIiEeYF9do9/fISJjoOBg3t+i4N7d3x3d5mdl3qKg4dpdn58bISFlIByj4JxhoJ+gn9vZmxnV11bXFtTZHBlX1hjcnVpdnBlZWJXXFxogHBvcoBziWVleX9qdHZzc4OFeIGEend0dW5qenBiZ2tnhnSNhG5mXl98b3uJfmhsd2ZpZFVXcnCNp3yEfHaWkHN8cnt5bXp6kIR2l3uHhoKGg311cHJtZ3VdbWhfbHVkZ2Zpem97cllngXZ1Z3CAeIJ1YXeFi3yUgG6Lam16gHBlcmVgbHlmcnaJe31hdYN2aWtxdHpweXhyfGZ+fn54dm5jZWFthnxta1ZqYnFUTGlrUExOcEdee2ZhTVV0ZEpOU1dhand+ZV1nc2llX1ZjV2JwXUtLa1hjYlVUVXNXTFl2ZFpfa2BcWmNlX3dnbWJwaXNvcX51dJmBd3+AeH9+hYR6fXaCg36YhW5ydHt6dHGFhY+CgHqLdXWRgH2BlI6AhYR8foyGen6AdnujpYp5iIaFbHV8e3WEgox6b4VzeoV9goN1bmpoZVZdW1taU2NuZVtYYXR7amltaF9iV19aaYBpa2+AZ2xhaHp5a3R0dG+FgXp/fXZ1bnpoanlqX2VuaIF3kIRnZVhid2l+h3pvaW9mZl1VWG9oj6d2gXp8kY54dW9+bnJ0eI5+d5R0hYJ/hYh2anJ2Z2hvXG1lXm1zX2dhanhoe21bbYNzc2lvgH55d2B2hIR4j4RziHFweX9xY3FoW252ZHBziHt4YXKAcGdpeHNxa3d2dHZjg3t+d3VwY2NjbXx9a2tVaWJnVEtsaFBHUmxFYXdmYk1Ucl1KTFRZZGt3emVfbXBpZFxWX1VubldKU2hYZl5YTVVsVEtcel9bX2tdXVtiZWB6aGxhb291bm93dXqXfXd/gXmAf4eGenl6g32Bk4RxdHR+eXZ0hYiQfYB9kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ5/eoiHhGxygnl2gYCCdG6Gb3yAdIqAanBtZGRYX1paWlViamdbWl91gmlebmxcYVZcXGuBZXJ0fWlqXWx3dmd0d3Juhnt+fXl2c2x6Z2l4Zl1kcmd6d5KBY2NUZW9ngoR3dmZoaWBXVlloZJCnbn54gIuOenBwfGZ4bnmLenaOcYN9fn+GbmR2c2RoaF1sYl1vb1tnXmx0ZXppXXSAb3JrcXt+dXVhdIWKeoeHgH93cnV+dGFvbFlwcmJxcYR7dWRygGxgbHpvamh6d3RxZYR0eXp1cWRhZG1zfmpsVGleXlVMc2NRR1diR2N2ZmFLVHBYSktXWGdrdnpkZW1wZmNaWF1YdmZUSlxjWGhYWUlXZVFIYnlaXWBsW15cYmRegGlqX290eG5vbnaDl3lygYB9f4iLhn51doZ4hox9c3V1gXl6eoKMjn1+hIlqdJaBe4qdfX6FeYB6fnyGiHNxj62Me3uGkH5mcYh6dH19dnJvhmx7fm2PemJwb2FlXmVWWVlXY2ZrYF1dc4ZpWXFuW15XWlxse2Nxd3ZtY1ttc3RodXZxbYV5f4B5d25vdGVodGVbZ3RmdnaRel9dUmVmaoKBdH1hY2lcVFheYmOQpWh5dIOGkHhsbnlnd2x7hHp0iHKAeHt4f2hldm1gZmFfamBddGtZZV1vbmJ6Zlt4fGtubnB4eXR0ZHKDkn+Hgoh6dm9xfHJhd2Nabm9hcHGBfHNlcYBkXm12aWNmeHpzbW6BdHN8c3FhXmVtb31laVRoWVpVTnlgUktaWUhidGRhSVRtU0lLWldpbHJ7Y2xsc2NhWVpbYXZcU0tjXVhpU1dIWWBOR2p2WF9hbVtbX2JjXYVpaGFueHlsb2p2gZB4bYJ+gIGSiISBdnWJc4uGc3F2doF3fH1+jJCAfpN+cHiWg32ZknmAgHh5fn9ziINzcJmhe3uAiZV5ZHWIeXN5dmtzcH9reXxwkXJecG9gZ2JsVFpZV2hjbWZcXHKJZlNybltZWFhgbHZkanVqal9bbXRxbXR0dGuGfH+AfHdvbmxkaXFjW2tyZHR2j3NcV1RkYHF/fnGCXGFjXVNaYFxjk59lcnGEg5B0a2p5bG5venp6cYB3f3J5enpkZnVnXmJbYWhcXndoV2JdcGhheGFbe3ZqaXJvd3RzdGlwgZSDhn6EdnJqcHttZXZXW2ptYnBygHpzZW9+W2BvcWJeaW98bGtzfXJweGtwYFtla217YWdUZ1VYUlF3XFNQWVJIY3NiYEdWa1FIT1pVa2trfGVtb3FhW1pYWWxwV1JPZldXaVNURlpcT0hydVlgZG1jWGFgYV6MamNkbXl4a29pdXmGe2uDfYCFmXyChHl9h22PhnFvd3p8dIKCfYuPg4KWdHiClIWBn4l1gX+BdH+CcIeCdW+il3R7houHe2Z3i29ufHBmeHF6bHN2c41rXnRuYWdla1JdW1ZoYmxsW1xxjGROb25dVlhVZ2l0aGN0ZWVdWm51bnB1dXpsh32AfIh3kHNjZWtuYVxubWNzeIdrWlRWYmN3fHxwhVxjX2NUW2BZYpaVY25wg4SKc2pneW5lcnVyemt5dHRuen51X2ZzY1teV2JkWWF1ZlVfYG1jYXFdXX5vaGlzcXNwdXVrbISTgYh7hXFyZm57b3FuU1plamVxc4B2c2JsdlVicWtbXm5kfGVrdXxycnJqbV9ZY2lqeF5mVGVVVlBVblhSV1RPSGVyX2FGWGpOSFdUVm1oZHxpa3dqYVdcVVt0ZFNSVmhRWWZUU0haW1BOeHdbYGZsaVpiYF5ej25iZmt5dW5uaXZ2f35tg4B+hpd7f4eBiX5rkohyZ3SAe3WAg36Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Ld3hue41gZHxxZ3pzeWxtcXaDZ2R8bGNmZ2hTX19VZ2Bsb1xebo5oTWltYFVWU29mc2xleGRlXVlxdW1ye3hzbYl7gHece3psYWVsbV5gbmplcHl+Z1pWWGBrd3t6b4NeYl5nVllgV2OciGJrcYGGfHdranZsW3Zwa3lpdXJtbnuAclhqbl5ZXVZiZFhlcWNUXmJpYmJtWmB+a2Zrc3VubXd2a2iFi36IeodtcWZve2xxbGJYX2hob3OAdHNeaW1TZXBkVWJuYXlib3V7dWpvbGpfWGBmaHVdZVZiVlNPWWZTT11PT0hlb11jR1ppTUlfS1htZF94aG59ZGBVXlRddFtUUl9mTl1iVFNKXFpRWnZ2XV9mbWhYYmFbXo5xY2dqd3FzbWd2c3mDc4GDe4iNfnyKh455bpCKdGxzgXN/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6NjY2NjY2Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjYyNjY6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENERERERUIxLzAwMDAuXHBubW5ub2pmZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU1Mx4cHBwdHRtTamdnZ2doY19fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4iHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYaFg4ODhISEhIiKioqKiYqJiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpOQiZCOjZGIj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo6Ojo6Pj4+Pjo2NjY2NjY2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIyIh4eGiYWIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkY2GhoWFhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCPh4uEh4SGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fH19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIyEioaGiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYiLjIuOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OTlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OTkpKRk5KGk5STlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkY6RkZKThXyUk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKSfISSkZJ4f5OTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkJKCbY2SiXF/kZGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPkIRnfZKAdH6Qj4+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Phmhwj3x0e46Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI6BXWl2bWV7jYyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4qLiGdmbV5pZ3SGhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV1dndxYHRuYXB0amVoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doZ2Nmbm1dbHVwZWJjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXWZqb3Fxc3RlWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST05RX2Nlbm9vbmJPUVRQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTk9MTVBfaGdtbmxnYVJNTk9PUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tIRklOWGZtaGxtbGpoY1xXVVFPT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQlBaW11kaW9pa2xqaWppa2tjUkhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4+PUxeZ2xrbmtvbWlpamxlVElDREVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozw7R0tHXW1tbnhxaWpoVkhBRUZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7Pjs6T2lwenNsY0k9QEBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OTo6QVd0cVg/Nzw8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT09PD47O1dfOjo8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtdbkA+REU/P0E7Rlg7PT07Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213SDg7Oj09QTtJWzo8PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVE8PT1JTEVGdXdNNzg4Ojs+PlBgOzs9PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3l8d1Y8PT89PT5CXWpBOz0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KChIOCg4B9XT5AQ0BAPkZudk06PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hHVMQUNFQD8/V3yBXD9DRUlKSUlNTUtFQ0ZHR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFcUJERURDV3WGh4d+WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SKbEFBVnSHiYeHh4iDV0hMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN2d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVWyEh4aGhoeIiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUlHSEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVYGDhISCgoWGhoOChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Njg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqLjIuKiYqLjIlUOjg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4OjY3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCCg4ODg4OFiYuKiYmKioqKi4mKioFHNjc2NDY4ODc0NTc4NTY3Njk5NzY2NzY1Ojk6Ojo7ODk4OTg3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISEhomKioiHiIiIioqMiomJjHo+OTg4Ozw9Pjk6Ojw5Ojs5Ojs6OTk7Ojk9PT0+Ozs8PTo9Ozk7Ozw7PDw5OTw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3Vzdnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFAQj5AQkBAPj09PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhEQ0VDRUVBRkVGREVGREBCPzxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFZITUxNS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dKWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BOUE5MTktKTEpJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozw9Oj9APj9AQ0ZJSlFfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNck5ST05MTExMSkhHRUlJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSEdDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLX1JSUE1OTUtKR0VCR0pHTEpGS05LS0pKTU1MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0VHSUZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkRFRktPTk9XVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/Q0JGVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toV1VrYUVSUVFQSTs7UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT05SUFBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdGRkU/P0FBRUFDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlbY2BWWWJyXV1WXVpWRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enl6e3p6fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiot6bnBYWlxbUlNSVlZUWlp0g1lVfZBgXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlUVVRXUlFXVWKWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9MS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5UZFV/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV2dXNzd3p6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXVtZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPUNJR1ZASE5MR11pUEhGTkZERUZJR0hDREhHSEtHREJBREBOUU1SZHJ0dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYJrTUc/QDo7PkBAPz8+alFLYUVGSElFQj9HTE5HTVFVSUJFPz48PTw9PT89P0FDQ0A/PD1CPkpNR1VudHR1c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT88Qkg/XHN0dXZ1dnh6fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGR0hCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RV1BNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1RUU1BRVU9MUlNUV1hUVFhRTFdZWlZYWFZYWV1XV1hoc2tdVmFza2FhX15kYV9eWVRRTk5OTElISktJSUZDUVBTW1dUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODU3NTc4NTk5R25ydHh4eXt7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxPUlJPTU1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8+PTo3ODc2NTk5Njc2NzVXcHB0d3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEpPUlBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I1NTY2OmRvcnV4eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtJRkxNUE1HL0VfUj4zPz5qb2FSUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dnp7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnV5e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVU1MS0k8OTg3Oz9APjw9QUBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hQUmFcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0hKS0xKRkZGRD9CQz48Qkc/Qj9BZHB0d3t6ent8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hERD05Nzc5P0I+Oz9CQEA+QURJRUNHR0lGSUVCQj8+PUNCQUdJRE1PYmVRTU5OV0tMTUtMTU1NTEtOTlNkTkpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hKRD9BPTk5OTo/Qj88QEJCQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVDS05SVExKSU1URklJSkxKS0xJSkxNT1BSUEtHQ0xHQ0JKSkxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxSEtER0hIR0pLSUpLREdCPT49Ojo6O0FCPz1CQkNDR0ZJTEpESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESElLTUhKTEhJSktKTVxSSEhETkZBREtKTU1QTUtNSktGR0dKTU5RTkxibWl2dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0NGRUdFRkZHRUdCQ0A9PD05Ojo6QENAPkJDREVJRUlKTEZJSUdGRkRCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NSElMR0ZHSUlMTktJSEVOSUJGTUxOTU9NTk5NS0lISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUNDQ0VAREI+QD86Ozs9Oj0+Q0E+QUNFRkpGSUhLSEdHR0ZFQ0A9RUVCPkJEQ0NFR0hJR01QSkZGR0tOT0tGSEpGRURFSUpIS0lGSFBLQ0lNTFBNT05PUE5KSkhNUlVUUk9XZGBhbWdwcm9yeXpnZWhoZGlsZnFsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEdFRUdDQkFCRD1CQT5BPTk6PT86PT5AQj5AQkRHSkZKRklIRkZHRUNCQUFGRkNCQ0JERUVHR0hGTFFMSU9KSkxMSUdIRUdGRENJSUhLSkdLUk1CTk9NUE9PT01OT0tLS1BVV1ZVVFhfXlxpYW1pbmhyc2JlZmVkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQEREPEFAQEM8ODk9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSElGQ0lKSUtNS09TTkRRUlBRUk5QTU5QTUxNU1dWV1hWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlveU1IR0hIQkJCRkQ8P0JCRDw3Oj4+Oj46QEI+Pz9CRUZERkRESEZERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BTT1FNTlFOTVBXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TklIR0lDQUNIRTxARUJFPTg6Pj49PDxBQjw/PkFCRkNFQkNIRUNFRUZHR0dJRkdLSENJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OT1JVVk9LVVdTUVNRUkxPUVBPVFlaWVxaWVteXl5gY15cYWNrYmBkZ2hyhWhnamZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2b3RNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QUFGQkVERElFRkVHRUhIRkhISUtJRUpISEtIRkZMSUhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9TUlBWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hCRkVGSEZJRkZESUhHSUhKTUhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUExPUFJUWFZNTlRWVFJSUVBMTlRTUldbXl5fXV1gX2BhYV9hY2ViY2hiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93S01MS01HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0dHRkpHREdKR0dKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUVdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0hFQ0hJSUhJS0dES0pHSEpJSUtISkpOTE5MSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsa1Rfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RESkVFSkxMSkxMR0dNSUdJS0hLS0lLS05MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFREBCQkA+Q0ZHQkZDRkVGRURDSEhHREVLSEdMTU5LTU1GSk5ISktKSUxKSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dIRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFR0xKR01NTkxNTkdMTUlMS0lKTUlKSUpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhNR0lERUVDQUI8QkFCRkRIR0xIRUNDSEtISEZKTExGTktMU1JMR0xMSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQD1DREJHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1NSUtLS1NrYlppXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVERkFAQUVFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSkpLSUhJR0tLS0xHSEtLTExMS0lLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVVlaXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQ0BDSERGR0NJS0xIRkRHS0xIREdJUEtMT0tMV0xJRUVISUpISUtITEpIRkdHSUdISUVGTElKS05MSVBcV15QXFtgXk1YWVNcXGJeTVlaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRUxNQkREQkVJRUdHRktKS0hFRUpKS0ZFSEhQSk1NSk1TSEdFQUhGSklLS0lMSkhGRUlGREZHRUVKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2JbYF5bVFhXWV5dY2JjYWNmaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDR0hFSEdIS0lJSURGS0tLRkZJSk5LTkxITE5HSEY+R0dMSUtLSkxLSUdFSURDRERCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVZVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUhJRkdISEZGSkdIRkhLSUxEREtKTU1MS0hKSkhKRj9HRk5KS0tNS0tLSUdHQ0RAREFISUI/SUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFJbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0ZJRkZGSUxKTkZES0pMTkpMSUtKSElGQkhIUU1LS09NS0tJSEdFRD9FQ0hIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUdGREdNUkhDUUpGSEhIRUZLSk1QRUZJSktOTExJTExJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUdFRFdVRVxUXlNWX1hOVFVOWlpNSktUYGFbX1heXmFdTlliXGBgX2JjYl1hYldfX1RQTk9PV1FdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUENWXklHR0hERk1KUFBFSUlLS05MS0tMS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENBRUZCTUhCS0xQT05MRk1GR0lKSEdMS01PUElMT1BPU09MUVNSVVpZV1lYWGRXT1NUUFBOTU9UU1tYWFpdXGBhZGVjZ2NrbHBzcnp5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTEdISkhHTUxRUUlMS0xLTk1VTk9LS0xHR0tQU1NOUE9OT05PSEtGYEVEX0xEZmNFTVtJXltybU9NVW1ZTENQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpTV1ZUW1xbYGBhYWFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSEVHRkhFRUtPU0lKRmBTSEpPSklPTVJRS01MTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlF/UUl8WVlxc1hQbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVlh/anR1dV9fdl9YYVtcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTkJETExGSUtFUVZMS09JS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFpSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3J7fG99eW9/cl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOS09JUVJTWVdXUVRQUFBRS0hneGxjeHJtW0tNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f29ob1l2dmp1dXCBYHJnfGlseHxvXl9fYmFbXWJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNCRVBQSEpLSktQT09PTVBaYFpYS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cWxtXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUVdcWFVNVVlVZlhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd+dlVMV2tofWxtbHhfW3B6e15genNjcm94cWhlfGlye11VTGxgdnVraXV7e21+eGt8cF1eXmJbX2JkZGdlZWViWmNjaWtrcnNyd2dsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbWttT0hKS0hJSUhRUExOT0xLUlJST1NSV1JWVFBXW1ZWVFRUYWBQTk1LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUk5QVVRYWFhbWlVSU1dbV1hXWk9TVVdXWFJdWVddVlRQWVJXV1dXWF5bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZWFBPTE1WVFBOVVNOT01MUVBLSlJRS1FNS0tPUlVSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NQUVVVVlNaUU9TUldWVFlWVFlVVFJVVFRUV1hXXVpeYV1cWlpcXGBjW11iY2RmZGVkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUVBLT1dTUE5VUE5RTktTUE1PVVNOUk5NTlFUUFRRU1RVTktNT1FUVFJSUVZXVFlaW1lTVVJUV1dXWVtUT1RVWFVVWlVXWVVSUlhWVVdbWVpfXVVYXlxeXVxdYWFeW2JiY2dmZGRiWF9hYl5gaGVmZGFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RWllYV1haWlhZVlxqZFZYWVpXVlNUT0pOVlRQT1RQUFBOTVFRUFJYVFFRT01PU1ZOV1JUVVVPTk1RU1VVVFRSVFdWWl1cWlZXUVJXWFZbW1dRVFZWVlZZVFhYVVJSWFZVWl1ZXV9eVl5dXmBcXGBfX19aYmJkaGdkZGJZYmBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGReW1lWVVdRTE1WU01OUk9RUk9MUFNSVVpVU1BQTFBXVlFXU1NTWE1PUFJUWFZVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaV1ZcXlpeX2BVYVxhYV5gYl9dYF1jYGNnaGRmYFpjYGFfX2VkX2BjW1pcW1xZWlhZV1xZXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUk9VVFNQV1xdXFheXF9XXF5qcXd5gGJcW1ZWWFFNT1ZTTlFRUFJUUktRVFRYWldVT1JOU1hXVFNVUlJaT1BTU1ZbVlZXVFZaWF1eW1teVlNOVFVWXFxWUlRWVlhZU1RZXFRTU11YWl1eXGBgYFZiW2NiXmFjX1xiYWJfY2ZpZGZeW2RgYWBhY2RfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUVdSVFBbXV5eW2BcYFVcXWlqcn1zbGdcVVhXUE5SWlNSUVNSVFVUS1FXVltaWlNPU1JWVlZUT1dSU1pSVFRUWF1XWFhTWFxYXl1ZWl1UVU5WV1deW1hSVVVZWVlVV1lcVFNWXlldXWBdYmJeWV9bZWJfZGReXmNjYV5lZmlkZl5eZGFgYWFiZGBiXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBaVFVWVlRUVF5eYF9eYlxgVV1eYmt5dGx9bFpVWVVRUFNcVFVUVVRWWVdMUlpXXVpcUk9VU1hWVlRQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlRVVlpZWldYWlxWVFpeXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX19hYWBjXWBUXV9iZWV1gXpoWFlZU1ZTVlxYV1dWVlddWE9VXVpeXV1UUldTV1ZUU1RYUlNWVFhYWF1eWF1bVl1fWF9fWF1WUVlUWVpaYVlcVVZYW1pbWVlaWlhWXV9fXmNiYWRkXGJcYGZhZGZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lWVlxgYWJjYWNeX1ZbYGRhX3p1b2hZXFpVWFRXW1pZXFlYWWBXUFZeXGBhXFRUWFBVV1ZUVldSU1VXWlpcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1laWVpfX2BgZGJjZGViZFpiZmNnZmVeYWJgY15iY2lkY2dfZ15iYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXlxdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZZUFdWV1dXVlRWVFhcXF5gYF1hXFdhXlteXFteWFZYWFtbX2BcX1hZXVxdXl5cWlxYW2BhXmBkY2RlZWZiWWNlZWhnZF5jYWBlY11laWRlaV9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5SV1lWV1pYW1xYV1leYGJhZWFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXV5ZWFZXW1xgXl1fWlpeXV5eYVxbW1pcX2JeYmRjZWZlZmJaZGZmaWdjX2NfYWZlWmlpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFdXXFlXXFtcXVpXXF1fYGJkYmJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRcXFhaYmVjYFJcWk9YWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX19cWl5eYGJjXFxXXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxkZ2BcaWliaGlmZWBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXV5fWlhWW19eXWFhX11bYGFiZWJfXVRcYGBjZGRmZWdlZmZlXmVmaGhnZGRgW2VnXmFoaGJoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t7e3t7enp6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3x7enp6enp6enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiYmMjY2NjY2LsMG+vr6+vcrT0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMjI+QkJCQkI67zsvLzMzL2+bl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl5eXp4b29wcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9fX19fX18fYCCgoKCgoKEhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z4e3h5eXl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7enp6enl5eXl5enp6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8fHt8e318eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3l9fX19fn14eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHp9fH1+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp+e3x8e357eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXx6enp5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3JycnJxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzdHJwcHFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNyc3RzcXODcW9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3dzc3Jvg5Fvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXJxkYRwcnCXj25wcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcnCIpHVve6SQb3BwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcIGvjG2Hp5JwcXBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXJxfa6icI+mlXFxcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGCsqmQobGScHJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3Nyc5uqorOnq5VydHNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh4eHd9p6CjsJ+coYF7eXp5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX59fHx8fIiml5usoKOiiHp6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fn1+iKCRkJ6blZiPfn9/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGBgYGGqKmhmp6ZmJR8gIGAfn9/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/f4GAgpWwpaahn6KqpYl+fX1+f39+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Af4CCh4+hsqqepqGfoKKoq6CUi4SBgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBhouaqa6po5ykoZ+ioaCipKOej4KBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGCg4yZnZmamqGbnaKgnJ2ak4iDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KAgYSLlJaZmoySnZualoyGhoeHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIOBgoGEkJiViI6amo6Hh4iIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEhIKCi5aNk5eMg4KDhYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgoKBgpCThIKDgYKAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgIB/iI9/gYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf4CKkoCCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpiKg4WEhISCgI6Yg4KCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjYyKhYSDg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2LnI2AgoGBg4KBlZqGgoKBgoODgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GXjICDgYGBgIuVko6AgoGCgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeKfYSEg4SCg4OCjYmFjYKCg4KCgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn99fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYKBgX59gYeGg4B+fn9+f35/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWEhYaGhoWFhYWGh4eGhoWGhYWGh4eHiIeHh4aGhoeHh4aGh4eGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeHh4eGh4WEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoeIioqJiYmIiYmJiYqLioiIiImJiouKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoSGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn58e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIhoaHhIOChIiIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaHhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4SEgoGCgYGBg4OEg4ORkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoaGhIOBg4OEhYWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKBgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSEhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Ag4ODg4OCgn99fX+AgIF/fX5+fX19fXt6en6EhISCgIGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICCg4KAgICAgIGBgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KDg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn9/gH59gH9+gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf39/f35+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4B/f39+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl4fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/gH+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fX17enl5eXl5gIKCgoSDgIKDgYCCgIKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CJiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoODgoOFhISFg4KDg4KDg4KCgoKDgoKCkpCLiIiHiYeGhoSGhYWEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fX18f4GBfYaPgX59gn5/foCCfHyAf4KAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIuOjoyIiIeFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt7enyCgIF+f4F8fn5/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2NjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDg3+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf359foCAgYB/f359fX19fnt8fX9/f4B9f35/jJGNjI2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fXx/hoSDgICBfX59fn9+i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+f35/foSSjY2Mj42LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fnx+fX58e3x8fHt7en1+f4CEg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CMjIyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8foCCgYCAgH18fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoGCgYWGhYWGhoeFgYSRj4yKiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fH19fHx8e35+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKOi4iJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX19fX18fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkY+NioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn59fn19fXx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eXl7fn+Eg4SHiYqHiY6QjYuJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIj46LioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+f399fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImOi4yHhIWFhIODgYKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgYCAgIOBf4CBhIF+foB/fX6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fHx7e3t8e3x8fH18iouJiIWGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH2Jh4aEhYeFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn5/gH1+gH19fX6Af3+BgIGBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeDhISFhISEhYOBgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEg4GAf4B/gIF+fX1+gH5+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn59fX9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYSChISFhISEgYOCgYOBf4CBfn+AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDgoGBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICAgH+BgoGAf35/gX5/gIKBgIGDgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX18foCAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHuAfoCAf4GAgH99gX9+fn9/fX19foCBgoF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fH+AgYB/gICAfIB/gH5/gYB/f36Bf35/f359fXx/gICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIGAgIGAfn9+f399fH59gIGCgYCAgYF9foB/fn+Bf4B/f4GAfoB/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgIKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH9/gIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoKBgoOAgIKBhIODhIGBg4GCg4KBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHt9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGDgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGEgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgX9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4OChIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYGAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhISEhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiISGhIWFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeGg4SEg4KBfX9+e3x7fnt8fH1/fn18f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX9+fHx+fYB+fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaGhYSEhYWDhIeFg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOCgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoODgoKCf4B7fX99fHx8fn18fX18fnt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeHiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGEhYKDfoGCgX+DgX9+fn9+f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEh4aGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gHx/fH19fn17fX18fXl6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGgoODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgYOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fIB+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaGhoWDhIOGgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIWFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYODg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dTU1NTU1NTU1NTV1dXV1dTU1dXV1dXV1dTU1NTV1dTS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX1dXV1dXV1dXV1dXV1dXY29zd3Nzc3N3c29vb3NrT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4utHU1NTU1NTU1NTU1NTYrnyBgoKCgoKCgYGBgYCP0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM+OD46Pz9BPT9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjoqfP09LS0tLS0tLS0tLS2ZE7REREREREQ0NDREM/XNPT0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKOoz9PS0tLS0tLS0tLS0tmUQEhJSUlJSUlISEhIQ2DS09LS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamprM/T0tLS0tLS0tLS0tPZmU1UVFRUVFRUVFRUVVFq0tPS0tLS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLU1dXV1dXV1dXU1NTU1dDLy8rKysrKy8vKy8zMzNPU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7T1NDOztLUz8/S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1NTU1NTV19fX19fX19fX19fY2NfW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7QppLF0dO5n9DRnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Sqp2slM2zl5q6upW4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/QyZeZhaWvoKKnstGSfX6vsNHOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOTY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9GksL2XoceGmrXV082ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0NW5mKTapJm11NPAoKDQz8/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9DRmp232KKZtdTUr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDVp6Sg0taimbXU1KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpBQ0ZEQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDSwJ2iydTVopq21M6en8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT1KSgj7fQ1qOZttfDn6DS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT06Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyMamvZWRptqimrTZsaSn1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNTKjpOXkKbasYPG1rmDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS1MKvsLPR09HD1NLSwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0+QUVMTEE9Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHU1tbW09LS1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9Pjc4Njk2Nzg5OTs7PT9APDw4OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Nzc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njg5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIQEU9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDxEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpaampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampaOjoqKioqGgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnp2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT02Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysqKagnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqamp6emn5uam6KgmpaWlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhn5aTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainpyfoJ6bk5GQlJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQERBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoZ6ptZOQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/QkBCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqSkpKOioaCdraOWk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6qpo6SioaGdo42Km5mZmJmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoqKsr6GhoJ6cmqdzgp6cmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGhoKGhp6Kkn56cmZqgYXyfm5uanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCgn6eWpZ+dm5qek1l5oJubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6enZ2kjpuenJqapIZYdKGbnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cmpqZpI+QmpubnKR5X2+inZydnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbnJuampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiZmqOOjZWZm52geGlpnJ6cnZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJycmJiZmZiljYqPlpudnHhqZZSfnp6dnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmZmZiWpY+EiZKdnZR3amSPoJ6en5+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYlp+MgIKKnp6JdGhii5+enp+gn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeeinl6eZychGxiXo2gnJubnp2dnZ2hoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampaLmZOEd3eYnodtYV2Kl5KRjZKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkJGOjZmbiXKQnJyEe3Rkg42Fh4GNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoKAgZKdiHhah5OWbG57c4GHfYCBkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoF9f3KYlHRkT3WLjGBccXODe318ho6Ni4aNlJKLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIiYR/gn59oIdfS0l0g3xaSmFreoSEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGMf4iNjYuLh5KJj554SUJFdHhtVT5MZHOLi42JiZCPjo+UlJiQlZyanZ6orrKvsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkZ6hnZOXm6GanZyin6CUYVNbSnRyY1dGRVNsf5CRjouYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqauqqa+khFaCjVR0fGxcWW1VX3eWn5+hpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqWpp6epo3RqwL1Qf5OHb197a1Zum6GhqKegoqKuq6uqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKimmp2kpqKhoZtlh8a9Zamhk5decYNdYJecmaKioKCfoKGooJyeoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXVxQVU9YT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqGip6GmrqamnJ+ZX421vpvKpJOpdWivcleNm5ufnqCfnp6go52XmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9bVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChp6mtsbKvq6OjpG2ClZWoxp2SoYRGrI1YhqGfnZ6lpKWgpLOllZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NtamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6CjqqqnuMG+uba3s66sra+EfXtsrbugnJqAV4OBZ4OooZeepaKZlrC+oJ2hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyt8/e3tjNyby3ubqviXhkaqejmpaKe2hrcnZ6h4uFhYR2b424qaOrpqWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZscGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1trvD1+DYzsa9uraumnhqUGOUhIOEenJtaGhua2xsa2ZfWneytKq1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmc290aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDw7m9v8TUz7muqaSelIBkX0pcfG5wd29paGJdX15hYF5aVG63sqq0vLC1tqivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1dm5tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xcHFyczGoZGOiHxoV1hJU2tlZm5oYmVgWVtYWlpZVWyzuaKmsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx+hH9pZmhha2xnbnZxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8PDxsbAwq+UdG1kWlZXRU5nYmFqZGBnZllaWVhYVGazvLKmqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH50a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTEubTHuoBZU1NXVUBPZmRhaWRgZmlbWFdYU2KpuLO1rK6lpKOopKCfpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7d25raWh1WmZyeHN5ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxMKyeVFLTk89UWNiZW1mX2RoXllXV2Squ6q4tbOsqaOhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF1qb255eGNiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwr2CT01NQE1nXmdramBiYV5cWWSlwbu6vLq8rK2mqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhpaXRteWxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzsXIv3xTTkVHb2BhYWxiXF1eW12bx8LEx8G8vrSxsLDBvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BrandsaWV1bnRiXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcOuf1RNSGpjXF9uXVRaWVuSyLe/v8DAuru9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2NqZGJqbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBw7uGVElZXm15gVBQU1aGyMOvvb24ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2RjamNnY1taWlxZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwbu/wLy7xL26wMTBuotXR05/lZJFS1p+uMu+sMG/ure7vrq1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2pmaV1WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HWjru+u8O2uce3tbe6vLq5lm5KeJ2RQFqQtrzBvrnGvMK/vMW4tre0uLa2u7u5trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZm9pZWxoWFhOS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zQxXisy73HuLm4rbaztrmztrS0hnybiVagv8C+vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZmJtYFxUSUtKREpDQ0c+Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1611gr3Iz8LAuK61tLq9t7ixv7+blYGXzcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoBxZmxpbnRueGNnYlxjUUtUSEVFQ0dCPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydGYcXWw0dHMysS1ur/DyL6+tL/Dr3xptczFwr7BvL/DzMrHxcbAub68xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fY15gYU5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrBhXN0qMzMy83KxsLDy87BvLi8url1WLbIxsTAwL/EwMrKw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXh8YHFjW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7uq3bwr62vsC+vrqmnKqzt8TApXl3ep7ExsvIwcPAwMnKwb+7urC2dla1xsXFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4c2hwXVteXVlSRkRDTUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xbRtr869trnAvKp9bmhubXSCl5hzeX6avr/HwLnAvL7FxL29uLKvrm5UqcXGw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d2x1e3BuaVtfX1lTUEFGSEdLQEVDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2wdYK0vbW1waSGaVpeYE5TW1xwdHiEo7i3wrqzu7e7vb+6u7utr6xsV5zFw8PDvry/u7u4tcHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZl1bVEo9Pz9HRj1HQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJpYR4jKKwtZxqZmdVWV9JSU1RVG55iaiwt765srWyvLm8trm+sbSob1+KwcPHw8C9v7mzr7K9uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2JcXk9JQj89SURGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqeHe3aNopdgU0NZVUhialVPRUplkKOur7a6tbSyrLy5uLW4wbq6nH9serzCx8K/ubq1rqWss7GmsK2onqCgpa22tcK3trSlqKuosLazsrq2u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92cm5jXWdYXV1TT01BPkpCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+zkIF5iI9uTkpAZVlCUHiAk2hMQ16DsbWztbK0r6y7uri2ub/Es5+WgnqovLu4tbKxra2fpKannaSlnZaZmZqfqa65rKurn6WopKuur6ewrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlsXVtqVF1cUE5IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO4tZWMiIR7WEZCUYhYSUpZeI6CYkFVpLmztLKwsa2wubi2u7e6v62xsqqfoLmuqautq6OooZ2dnpeYoZWSlpeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlpdXRuZFVhY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrupmJmUaE1AVHlxT0lJS2idf1pFVrG7sayzr66srba2srS1rqminpubnZ6np56gqKmfoaeWm5eXj52Uj5CWjpebpKigoKKioaWlnaOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mopujnJWQjI+QkJOQl5WWmJ+enpuZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn96Y3dsbl1RaFRQTkdQTUxCUFFAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9waqlvWZEU6GEUFhJS2BJWI1hZWWEr7WqsrSuqquvsLKzraWdkZeTj5ignqKgnKOkn52olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso52enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJyZm6SZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXZ9bWt7ZGhWUmRNSkhHT1JOSk5IPEVAPDJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgq8a/y55OQXWcb1BuSkxjZnZ1YV1ic5Kyr66ztaqmrKuim5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpaKbmJ6vqK6yq6WqqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd4fGR5eWBiU1VgSElKS1NUSVJRTTk/QjY3PDY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTHxotWUktmo1hnfW9yW1JrY1xnYmFtkbSwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqSep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7qopqunq6uprKynoKCjsa6ysbSqsq6jmZydnqGZm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxmW1NaWk1RSk9PVUxTTUI3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVpcXd1b2R3dlhXYmBkaVtaV2itrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe/sKyxrq2pqrSxsKirqLK2uLO4rbK0pKCdpZ+soaGioaCamJaWn5ubmKWhoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVqd3VebVtSYEhSVUhGVVZKQ01HPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgo39vgnBgY1dMW1NaTExRWVJIT05ImayqqaSfn5mSkZOYmJaWlYyIi46VnZydnZ6XnpmnoKCopbGqp66jq662sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wry3vrOztaKsoqmosqmqqKeompmemqqnoJmnoJ+fp6ilpJ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXZtaG1cWFxDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjnpyJYldeZWBXTVFHPT9AQ0Q/PkNSeKmtqaqln56eoqOdnp2anJuUk5WUnZ2YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Oqs62qs7Wvs66qr6OdrKi2sa2jsKago6+xrrCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t0cnFoVlxRRlRJREpQST9FQTRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBQRkU7Qj5GPD45Nk5+qrOno6OioJ6lq6Wel5yUkZmdmJSMioaIhnhtiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8TKycPBxr66tbq7tbu3sLayqrqyrru3v7u6q7itq6q4u7W8rq65o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hrZVpbRktMRURUTURDRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8+PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXJpYVdORT5JWnxvYUE9XI6urKCZm5uenpmXl5eSjI6WlpOOjZCLgoOCd3JxbXCPpq2utLnFu83Hy7/CzM3NzMfJ0czNzMfJxcXM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwsXGxsrIzr/I0czHxcfFwrzDwb+/v7a+s66/wMPDx8THxK6/uLK4vMTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTERGUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPzxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWlmXFRJREA/SoaepJiDoLKto56cn5qYl5SSlJaRkI+Mh4ODiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV19HXzcbHyczDxcrPytPX0tfS1dbT1MjMxszNydLNztPNxcjKysHHzMfJyMa/w7OzyMTLy8vPx8q/vr+9wcfFzczJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETkZASlFCPkI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjk6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZthU0xKREM/Q1Sx0b2yr6acnJygpKGdmpSTlZSJfXhwa2ViaHFvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbO1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1dbZ1tfT1tjO0srP0czP0MzT0L/Ix8rEzMzMzs/Fxse2v8q/0s3M0MbJyMDEw8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUlKPjtBOD01NTg2Ozg1OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWUlAQURBRlF2sq+nmpSXn5yaoKCem5yZlYl3aWNhX19gX15fX11ibHV0cHBvbHJxdZLEyMbU1tfX19PW0NXU2tTUzs/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NfX2NHX0tjZ1NbMz8/KzdLLztDAxsLIxs7O0dHSyMvNwMrMxtPPzM7IxcrHx8jMytTU0dXP0szTwrnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9jU1dnZ0c7Qv7zMyba+rqaqqKGjq2VDOD0+RFiCqqifl5WXmZqcn52YnJySfXBlY2JfX2FfX2FhX2BgX2BmbnBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1c3P1dXRxdHUytDU1dbO0tDY2NjXy8jOxMnPzMrMwMnAyMrNztDL0M3Oy87PyMvQ0MvOysLJx8nMy8zS083T0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKWsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF5SEZCO1eOoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYGBgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NzdTMztPNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzcLIycPMw8XIysvPys3N0M7TzMbJz83Ix8vFx8HGyszN0NHH0M/OzczQxcfBuLm9w8K9w7mysr6xu8PDtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21nYGBxaFlYaFZNR0xJUFFCO0M+OzY4OTg6OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD87PDs8PTg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7Son62XeGxwcnuRmo2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYmBfX2BhYWBfXVtdZ3JxcXJzcG1yeaXH08/L0NDT1MrFycnGx7/Dxc/Ox8XHzcrSyMvOzsbR0tDNzNTKx8vOz8fHz9LL0M/GusS/xsq9wsfJzsTCx8DHzcjEzMrMz8jExNDIxsLGyMW/wcfMzMzPwsvMycfL0MTFx7vHw8nJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvr25zczG0NXV2drb2NDJz8/R08jCt7u7raO2fWiDhaSrlI6Nlo+Fg4ODgX2EhH5zX1teXl5gXmBjZGNfXF1eX2BgX1taXGBrcnJvb2tsb299udHIycrPy83EusDDu7u7ur7JxsLDwMPIysnIysjBxczGyMvNycTCysnBwcvQxcvIv7nCu8bHvr/Gz8vDv8O7ycfJu8jHxcrAvsLLxsXEvsa9vMDDxczFxbzAysPFx9LFwcm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXx3c3RmaVphbm1aW1hSRExGQkdETERGU0A1NDMzNT88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKvtmxeeX2ikYuSloZ6gIWFf3Z4dXJwX1pbXWBgYmNkZGVkYFtcXV1fXmBbWVpcYm9yb2tpbHBvc4/HvcrFy8DGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvDyb/Bybu3u7rGw7+8wc3Dxr6+tcG9w7u9xrzDurS8xsTCw7fAtra+v7vMw7y2usi6v77Lw8HGwsXJx8nG0MbCzMiyx8nDzszBxcO/vbK3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9kVl5ZSkZKRUdLQUVCRkpAOTo2NDg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NbXzcrOxcnFx8G5xb2srqVfZHWEk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYmFkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5nb3MwMO6wLitsLGnqq2sp7i0trSzs7S7tb6xtrC1r7K8wrzBxLzAu7Wyur7AuMi5tLu3wcK9t7zGwcO8ta6ytbq/tMW3u7WruL2+wL2xu7awtrqzxby3r7u/tbe0xby+wsXAw8XGx8vFwMbGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HGwL+6uMm2qrCYW2hvio+FiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhma25ucnykx8C4uLWwq62nnqKpp56qrLOtqqyptK63sbOprqass7y6tsO5urqxq7W5u7TCurDAsb68u7a8x7nCt62qqLCywLa4vbCxqLGztbu8rK61pq62rruysaq5sK27rru4u8DAvrnDv8bDxcG8xsLIy7jFx8W/x8PDusTGwrvGyczLs7nDvbuziXN3dmtpYWJsaFlXV1tBTEtNSkVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk9OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fNwcPGv8TEw8PKwsnKv8C8wrqztbXDrqqwkVtqf5KHjo97eH2JhXp7hIB3bl5dXFxdX2BfX2RjYWRjYmBfXVpbWlpdWlpaWlxlbm9oZmdpa25yga26sLWupaSnp5qgpKCanKWrraSooquqrKuwo6afqq21trG9ua+3sKiuuLS0vLi0va+4ubWyvMCywK+lqKOrsbKzqL2qq6irrK21tKaorqGkr6mypqiorqaot62xsre6uruyvL6+vsS/tcLBx8i3vr/Ft8TDv7u/xMK+xMjMyr+/xMDAqYdzdHNqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvByr67yba9w766yrfBw8G0try2sa+1u62oq5JkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGBfXV1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqqWspZ6coaSUnaSbl5Gho6mjo5+lpqemraCdnKSmrLKwtrensa2oqrWrtLmxtrautrmysLq6sbeloKSfprGoq6i5qqSmp6insq2gp6afm6SmrJ6fp6OgobGtrayytLO0sLW9trvBwLK6vsPBsbm5wrPBvsC1uLy9vrzCx8TDxL/AxKCDeHBsYmZga29gVVleSE5nT1RHRktGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5Ozo7Nzg6Ojw5OD46Pz05ODw6Oz06Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbagnpSdoaa6tquzs7uzxM/Jy8LGuLbHwMy/uMm3u8W4s8S4s7/ArLa8sqylr7OtoaORaXKGhYaAfHh1c29tamppcGleYF1cXFxeX19hY2JgYGBhXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ttb4edqZ+VlZqhlpujmJWNnqGip5ygn6Sloqeem6OboKuwrbG1pKmqqqyspLS4rbewrLO2r7O1r7Cqn56fo6KypaapuK2ipqagqKyrmaCfnpmdn6WamaObnJ6wqaunq6usrbCyuK+4ubqwtry7uquzsrmzvrS2srG2tb+2vsC9w8K7ur2XhHpza19lXmRkWFRXXUlXXEtQR0pKR0E8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7w8PPvrrHuLi/t7LCtLG7u6y6urGinqmrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtxjKick5SUmpeaoZaWkJuioaienJ2lp6KlnKChm5mvrq6vsqGlo66rp6K1sLKyrKmvs6e6s6a2oKKenKOhraOiqraro6OmnqWmo5aZnZeZm52gmpednJ2craKrp6Sjpq2rsrOqtbCyq7K5tK+qr7Kys7izrqmsrrK4sLq2ur3AuLOxlIV5dWZfZl5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lo5ilscK1tr2ttLjCzMjGv8W2wcDHzrfAxL2zubmzv7axubutsrSvn5qkqqCUmo94f4OEf3hvcXRxaGVkaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanahm5OTj5SWlp+XmZSXoJ6hnJagoamkn5+pnZubq6evsKubo6S4qqGgrqi2qqenrbGkuLCkt6Cim5mZqqehmqy5r6KhpJyin6CTlKGUlpabmJeWl5yVn6qeqaSinaOqqrCtqLSsqqets7Clq66zsbCwrq+nqKiyrbG0sLy0uriuo5SBenZlX2FWWVhTUlNLTV5MT0tHR0xMRT1BPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrby7tbu8tbm5sK+wqpyZoamUkYqLgIB8d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZpgZWSlIuRk5SamJyVlpygnJ+WoJ+npqSmp5+doKagqq+mn6Kjt6ihoaKos6KlqKWwpbGurLWeoZ2VlamhopStsbGfo6Odnpibk4uhlJGTmJiTl5eZl56nnKehopqkpaWrpKWwp6Wjq6utpqmur6+rqKqqs6amrK+0sa68tbGvr6CSendzZWFcW11YTkxRR1FhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLi7vMHFurG5tcTJycDDxsXHtsXEs8K/xau3t722vbq6tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1VUVlVSVFJVYGBfYGFfYWFiZWmAkpKIkI6TkpOclJWWo5mgl52gpaKtpqWlo6SjnKqrpZqfpbGqoKGepaqeqKKfrqypqa6toqKilZeim5yQq6mwnJ+in56XmZOKnpGNkpOWkJiYk5yho52koaKVoKGkpZujq6WipKqjq66lrrKppqWmprSmqaits7W0ubqwqqyejHJwcGBbV1ZWUkZRTkhZW09SSVRLU0xFRklEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+Njk4Ojg4NjU5Ojs8OTc/PDk1Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAybq1wK/FyMy6wcrMyLXJvLG+w8issbjBtbzAu7S0qqymlZqbm4iBcoiDe3RpaWlsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVVZVVFVVUlJOUVldXF1dXl9fX2JkbY2Og5CGj5COmZOUkpyao5yboaipq6isp6mmpJmlr6WVmaWvqaCcmZugnq+ZnKuzoKWmn6OkoZSTm5aWkqmqrZqdoKGgm5SQjJmOjJGMko2WlZCeoqGknZujlZugo6GXoqijo6iroKuwpK23pqOkoqytqqirr7O3s761s6uvmIV0c2hbWFlTVVJFWExRW1hNVE5QTFFSSU5JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTU4Ojs4OTc2OTg5OjY6PTk5NTc3NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3rqmor66bqaist7asvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbuztaapoJaXmJaHenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYWR9i4CKfoqPiZKNl5GXmaKgm6CrqqavrKiwpaman62glZalqaedmJCPmp6ul5ioqpmfnZSloZ+SkZKRk5Woq6WamZmenpaNjIuThoiNg4+LkpWRoJ6hpJiVn5WaoaKelJulpqioqKCxsKaxvaifo6y0qq6nsLWwubXAsa6xq5F+cnNiVlRWTlJKR1ZQU1FMTFdNSk1PUkdNS0FDRkRDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3Njc2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKWxt6qmo7GrnaqnqbKxpLbGtLm6s8rFubrBy9DKsba3vL3Bw7GvsbettLS7s7Sio52dl5eUg4B2a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXV1han95f3SIjIaQiZeJlJOYm5ieqZugq6amrJ6omqCmnJOPn6Oal5eFhJKbo5CVo52WlpaIopubk4uOipCapKeclZWXm5GSh5SOi4GLjoCQi5KSkqCaoaKWlJiYlaKmmY2ZpKappqGgtLKnsrehnKK2rKmtpLKyprW8taussaOJeXNuXU5RUUxPQ01OTlBLRk5OSkpOTlFITUpBR0tISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrClp6SqpaCopqWzqqKyw7W1srPGxra6w8rMxrOsub20uMCvramwnqauuq+un5manZWUh3uDbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFucnVvg4eBiICRhI6KlJGTnqGPm5yjoqSZpZeinJWNh5majHONg36Ol5aGkZqQlI6Oe5mPnYyCiX+KmKCjnpCTmJaFjYKUfn5ziY56kIeTkJCdm5qakZaQnY6jo46JmqChpKSborSvrK+tn5iluKamsaGwrpywvKqpr6qZg3dzY1ZNUk9QTkNTTkxQTEJQUUhJTlJNSEpKREpMRkpLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7Sppqaoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBrK3DraeippKdpraso6CPlZaSkH13fmZXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdaWtxa36Ee3NOWHKPgpeGjZyXi5SRn5idlZSWlY+WiYCUiV87Vm98jJSJgIySjJCGhnOKhZeBeYF7hpOdlIOVjpGQg4Z9k3hxcIWMfYmBkY2Ql5qYk4uQiZ2In5iHiJaemqKgl6euqa2oqJ6XrbOipq6ZrKuYqLSiqa2jk39zbl9bTlNSV0xEVEpQTExGTk9JRUxRTUtPSklMUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOuoaamqqCnqaejqbCop7TCubC1sMfCt7O9z7+5r661wqeqxaqjnZiDlJyxopqYhpSPi4d9c3VdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBsbmh6gXRPQj9/lZKRfYiUjYSKjZuOlpWJkoiGlYZ5iX9gSlFueIuShH2EjYqFf39uf3+UeHV2eISNmnBRjYiKhnt+eJR2Z3eGiH6KiZaLjpGSloyEiYiVhJuNgoSSmpafnZSko6ippaSem7CqoaSkkaaqlqKqnKKmqIl2bWZeW0hRUVNNSVVNUklMS09JSEZKTkxNVEtRUE9GSUM8NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4Ozc3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSoqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa+ip6ilp6ivraq1vLa3t7PBu7aousi4tqiotbaqsr2nnpWNf4mTqJaVin6Og4J9d3BvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboNydX5paFxUj4mUiXR/hoF8hYyTgpKai497ho+AdoB4c292cXSOjoF6foqrhHl7aHZ7jnBybXiBi42SeHqAe4B2c3KSd2h1hISEhXyVioiKjYqAf4SLjYCUhHyAj5iUnJaRn52pnp+gnaCppZ6dmIynpJKgoJaen6SAc2hhXV1KV1BSR0tYUk9KTE1SSkpKTFBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUyNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+ppa2ssLGqvbSyu7i2urSxn7e6sqqdnaypqLKwoZqRjZSBjpyOkX92hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZnaNlpiNjn1neYF2eICJkH2EmJKBcYePfHd7b2t+rX10kIt/e4aSgXx/dWZ2fIVsb2dzfImMh4BseXF9cW12j3FocYF+jnBDi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnZqdnqGclo2KpJuOnpeOlpiQd29tZmJaWFhVUUpTVVRPUE5QVktOS09PSlFPSE5QTEZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqGmsK2uq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5acpamkoJeZj4WSeYiOi4p1cXttdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXWVwcmyIp6rAfnR5Ynt4b3x5iZB6fYuGb22Mknl0eWpqgIJxlpGLgX6WgEmSmG5oeH6CbWlkbHmFkJKGa3NsfG5yfIZpbnB/c4yJhIZ7fn97dm90dIaCeYF5cHyOjIqTg5aXmJqQkpaXmZedloyDiZ6Ri5KNhpCWgG5pb29vWFZYVFJRWU9SVFRSWFVNTkhOSk1OS0NITUdFQDo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2woq2qqLWvrqy0v6u8w7+lopqVpJeejYSLlKGhmZiRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxfp4himmlzeWV+cG1/eouJdoKIhnRsmpJ0c3xqap2PTXmFk4mEjmcxdoZzbH5+g3RmZXV/hISFgGZpbHVrcX98aHFxfG6SjY98dH59cXBudW2Cf3d5dWp5iYKIiYOWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra29oZVhRWldZWVtNUFVWWVhOSUhFSkpIR0JAR0RDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLyoqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpGZlqSorp+ynqe6r6uysMKxu8PHmpaPlJmLjoZ5hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6Bxe3hsfWxxg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKFdnGHfId8dIyujomAaGdiam5ybXCDdWlwWHVwjpuSd2x/e31tcm5wgHtzdm5idoN/hoCFkJCKiomRi5GMi46DdXiKjoB+g4B9j3tycHBsYFtdXlxZWGBfUk5bWlhXTEhKRklHP0JBQkg/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGepaefr5WltKmusa7BsrvBxpaQjJSPgIh9boGQkomDioePhnWChGyViIh7dHh4bHdud2NpXkpQRz5ANzQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sd4iIfH6Fg3+MfnWimXl+hoGFmYSanGGGqp+di4OQjnp3iX6JiI5zi5eQhHpdZHJ0enx3im1oamJ5b4aQgnpvgXd0hHpwdHl4a25pXXaHfYd8h4eOf4qSl4ONhYyGfXGEf4N9dXd7fIl3cHN0ZmdgW1teVFxmXldQVFhbVUdKS0RLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkZ2dn6aRoKqgsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEj4x4g4BzoISKfXyBf3CAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpohIl7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKpIhq6vr4uBgJOKgouChJKph4CYmIqbdG19gYaHfY5oZ2h5f26Gh4KFcYSGR2yAd3J5dmhta192fYOIf4iEi3mUnZyJi4iRf3p1i3Z8eG1vd31/dHRybFteXVtjY1hnZVxVUFBWWVBETEtGTklDRkNDQEBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrKy8wMCtudTIyNDIwTIFcNT08XoR0fH6JhYiRjpaXkpegnayhprivs72zl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj85NC5dlnBzo1VGSUtNTlBXYFhwWVxeaY2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbm6atk5q7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnH92hYWLkIiQaWhvg4B1jYeEi3GGgneHf3t2hX1udnVmgJSOhomIh4iHoKuilomOmH96gol6eW9na3h+en9zbGVeWltdal1hZmBZT0tOV1JRSVBKRE5HQ0pEQkFEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjH+BkI6KmpuknaGspquvsZeRkYShlIR4d3+MlHx+koWSlX+KgJKbjoOAgYyKgomNg3+Jf21wal1CQDQtLS8vLi8wMjIzNDc3ODs9P0JESEpOUVJTUlNTVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSEpLS0tOVl9jf2dnbXWdm4+akpOLjY6aiJKPnYugoJKjqqWjrJOptqKowcOux694upSafI2hnpmEk4WCj6Kfk5iShIuFj5qRlmxwdYmLgpaMjY93j4RxbYWBipaRg4WIcoiglYaSiY6PlqS1qZuNlaKDh5ODfoBramt8gIGCdGJeZF9bZ2tdbGteV0tHT1JRTkxMRklQQ0RNRkFDRUZCPTo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYZxdpKGfpeWmpWenpynoKqWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpGCgICLjImGkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTlBSVFBQUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2cp6WimaGXopScnqeeqKufqKypqraXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiZaimpp3en6UmJKhkpaYgZSee3eVkquyiI2Xn32UnZuOkpWYo6KmtrCdkZmoiJaPjYGJbHNyfH99cmlgXWFfYWdkYGdmW1JFSktQT0lJTEZGTUNITEZHREJHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQk1RUlNRUlNUUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2FkHeViqOnqrS9uKSurKynqLSrsLaysq27sbO9nLPDrLvJy7fDv7ilo7CyrK2qo4uWmIWmpqCjl4GmmY2iq6ikiIWUpKGgqqCkqY+csYuVo6e3upugo7CSop2inpCjoauvrLK1opSkqoiZiZKKlnp6fYV/aGFoXGViXWRjXmZnX1pPRElIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqb1h6hXaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOFgYyFhoeShoKEiYaIh4dwbmFARTY0PDIvMTEwLSwrLTEuLTM/REFNVVFSU1VVVlVOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBkqCErqOzqrLAx8Oqs8W2rLO/s7i+tr+0wba7uqO4xai2yce1vrm0qKO0rbGxm5qSmp+Jp6+rpZR2n6SXoayys5iWqq2orra7srqsr7Wisayxtbu3ta61oKeno6eaqa+tsrm3uKebtqmMpY6Rk6CGeIKDdlpiZVdmYWFjX2BmYFtUSURETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRYmNXeXVxgZR9hIaSdYV/gYx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhYGOf4GJjoZ/homFioeRenhuXVZARU48Njo0NkFCNzY0Ly82Q0hDUVxPUVVXVVxWT15VSUtKQUA+R0tGRUQ7PkA3RDc/QkpKRUZXVFBej6Sto7G0wra4wczJtrvEvbOzwLe4wbW+r7d0sbOlusWksMa5sbOxtKiktbaqsaCilpqikqWwraatrKekmKCstLqiqbK6tbu+zL/Fxb29s8K3uri+t7q3uayssKaxqq29sLy6wsKsmbqolK6Pl5iriX6CfWtXZGJZa2VqZVdbY1lWU0lHRkxRR0NISUFIRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXU1lVWnZqcH6OhIGNg256c3iHYrmhmaOJlZSWk5STjZCWkoeGe4aBjZWKgYSBinp8i4eGfYqDgYqDlX13eXVlT1xkR0VMO1FjYVteU0Y/O0hQRVtjUVJZWFpnWVRgYE1TUEVBP0lKSEVGQUBDPEU2Qj5IR0tMU1pUXpOvuLW6uMm/ur3JzLu8wLy3tbu7t720urHGYHWypbGanqu9qqWoq6qjorK1oauonpWWn5mfrqWnpqWfpJSip7G0p7KzvbbBvtPJydPHwsXMwsrDwL69v7u8t7SvuLe2w7nFvcPIsJ65qqGrjqSntomBgHNgYmJeWGJgaWZSWGBWUlVJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWZmZGOl5KWlo6Gh32Gg4yWi3+Df4J4e4uDh3yLeYGKgpd/c316a2VwdVldXFBlZWJgZWRdW1hXXE1lbVVSbW1fbl9YZ2VVWVVKREJLSkhGSEhIR0JJOUQ/SEtUVFZcWluTucC4vbfGwLu5ysq6trq2uLmyt7W0rra2mWR1qJ2tcF6irJyYoKObpJ6qpZSgn5CUjpaYl6ifpZ+empmDpJ2spaqwrbewvbnU0c7X0MnM0szPzsrHwL/Cyr3BvMHAxMTFyr/IzrOku7C0r5uruLyZgHpsXmFdWV5hWmNjUVxgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5eSkJRubG91dYezrKGgn4uZnJmMjZWRm5KFiop+iIeLkIuIfIGEc3uKg4V7iXSBiYaVf3N7eGttdXtocmVpbGlmamloYGZpaGxabnSWraS8iIdnW29oXVpaVEhLTk9KS1BLU1FITEFKRktQX15iZmpimLfHsLizu721scTGtbC5sLC7q7Kxp6q3rI21p52bp5pPmp2Mjp+WkaaYpZWKk5OJkImPkZGem6GXmpWWhp6ap5usr6iwqLS01NTU1tLL0NTVzdPPzcXCydC+ysnKydHHzM3D0NK4sMO8xLmltrrDooNwZF1dXllgWFlmWlFdV09QQkJHREJIO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlVnOQkJiCaHFveXmDoKqepZaMm5uXi42VkZqOfYmLhY2KioqQh3yEgnB/iIGGe4dyg5GLj31xeHVrcXh+cXtueHNsaYFwbWNpbXB4aXd8fsu/wt+nbmN3b2NbYWBKUFJVTlleUF1cTlBOVFFVVFtubXaCcZatuKyzp7C2qqy8wLCrtaakuKarrqCrtKOOsa2amJiMkZORhI6bgY2mkZyJg4uEiomEi4OTlZeWk5yRnJiZmZ+eq6ykp6Ksrc/S1dHNzNLT09DU0c7Iw9TRx83S09PXzdHRxdLWxcDOx8fDqL63z556b2ZeY15XYFNdWlBRVVBOSD5ARkFCRTxAQj9FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlt1hoWKd2x3cH1+f6GenqGLjJmTk4yLk4+WhHmFkJCNi4qIkYd/gntyfoCBh3mEdYWSkYl/b3Zya3N8fHd7c4F3cWuAc3JpcHF6eXJ6vsuafoyyhHZyhHdoYWpdQ1paW1ZlY1hkalNYXVxgZF5jd3p+i4GZqaSkoZ+gqKWqsLiqpbSjoa2ho62hp7Gfiaaak5KRiZGPiIGUiWqVooyZhICFfZGDg5OWrYuVjZWajoaSkZ6Xp7ChoKGlpKjIzs/IwsvR1NHU087TzcbW08zU2NbW2NXX1cnU2s3J19fRyqzDw8yMc3BjYWBYVFpUXFBLR0pKSkA7OjtEQUQ8QkM+SEI+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuWiY+KiI6Hj393g5SYio2IiIuJfoJ4c3t9g4h3f3qHkZaAg254cG11f3Z4fXSFfHlth3Z0bn12hHV4fJ21jDtBi8Wlfox8aWVWSUNmY2VjZ2pkbnhbX2Zoa25pboCDiJGLnZ6gnZCXmJ+jpKayo6SzoKGlnaCpoKKxnIaekpKSkIuPi4aDj4R+nJuMjYOEhXqUfoKplaOMkoqXkot9l4qbkquzmJqcqJynvcPGubbGzdLQ0tDM0svJ1M7R1drX19jU2djN2NvOydra0tW+y8y0eXdvZV5aU1ZSW1dGR0pJRUU9Ojc6QEFCOkdEQEVDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoWJgod8eIWXl4mPg4eFh3qEeXF6e4SGdXqFjo2ceoxwfG9ven9xfIFxg4eAbo56dXd9fIJ1f3uGh7B0WKnCto2RgnBuYj1eaHJwcXBueHaBZWlvcnV4cXqLh46TkZuVoJWHjJOboJufqp+grZyhmpmfpZ6fq5mLmoyQkY2EfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yNlIyGe5uIlI+uqpSVl5+Zp661vamtvcbLyMnMy8/Jw9HK1NfZ19jX1dvX09nb1s/b2tHWydTLlXp8amlcW1BTVF5IQ0VJSD5BPT03Oj0/Oz1HPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo6RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKBhH+EfHyEmI6Hi36GhoB3gnlve3uGgXV6kp6NoHaOdYJ0dYF9dICEb4GPgW+ShHR8gIV6doZ7ibfGpcLJuIKWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdW2TlpSVj5eQg4mPl5qXlqWcl6CXn5KSl6OdmauVkJGKjZGCjIWJiIGGkJGenJmJhoyBhph6iIifl4+IjYqMgnyhiZCLvKGYk5eanKmmpa6fqLa/wMC5x8nNzsXNytHW1dXZ1dfb1NbZ2tvX29ra2M7cxod8emhpZWBUWFZVTUxETkM7PT08OTo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKe36AfoB8hXt+gZGJhYV6hId7dX10bXx9hn5zfpKdkZ6DkXyGfniOfXmKim6CmoB0mIV9gYiFe32Qeo+pjo/DoLyMnKScfYmEfYlyjIp+c6aanJiThXuPkIiEaEdwoKSdjIuQkoWJi5CSlY+cmpKUkZaNi5WfnZSglJGOjZCLfpCOjouEiZKWmp+fiYyUkp2Rgot/pZmIhI2DhYSBpYeLi7iYnZGUlqKnoZ2enaOvtrq1rMDFytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27h5eXltamZXYFxUUE9IQ0xCPT0+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEPzgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4h6fHuLh4J+dYOFeXN6c22AfoR9d4WboZqdlJKAjIh/mIeAm5Juh6iFeqCLfJGOgoiDnH2akYqMo6KfkKSvoIuRi4WLgZKGV3Kti5+rm4+DmJuPj45bgqKRgoyfk5WMh4iMkpKMlJSUj4yPioeWm52PlZaRi5KThYCLiJKNioqdlpmiooaTnZagiomIjZyQg4iPf4OHhaSGjJCzmJ2SlJehoZ6Zkpydp7K4rKa9wsfOx8bPzNDMztfQ0dSu1tXY2tja2tfW2dmfcX51aGdeXVhUV1hDQEhDPj4+OjQ5Ojs3Ojs6Mzs7Pzw+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnltYn6Sg29td4t4eX96gX2Ge3t3hoR/c3CFgnp1dnZ0hIOFfX+SpqOfpaKWip2QlJeLiqiXcoqxjISnkYSZk4WZjKKWoJiTiZueopKpr6CRlZCNjoiVi26Nt4WaxMiym6Glm5yYlpCykGSkzceWj4aHiY+Sjo2TlImFiomFlpqbj5CUk4aUl4N/j4uZiI2QqpeXo6OImZ+Xm4iPh5eXioSOjIF/h4+liY2TqZqXk5aZoZmfmZOdm6KztKWjvMG+yMXFycjJwsrTzc3UqdLR1tbW2NrU09rOg3SBaWRfXl5OS1RaQkFHQztBPTgzNzs8Ojg+NjQ5Ojw6ODI/OToyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnWCjnx8bH2IeHp+eoGBgn52doCDfGxvi395fHh4fISHi32Ko7Ooo6uzoZanoKWklpWuooOQt5WSs5mNoaCMpJuvoqSdmJCnlqiZra+kl5WWlJCLmJmWoMCOo8m4q5uipq2ZkZqcsp2GhaiinJiFiImOlY2Lk46IgYaHiJKYlIyLk5OGlJiGg5GQnHSRmbKWl6ShiJyalI+KkIuXmomKlo6GfYyYn4qQkJyamZOYmJ+UoJ2Vn5uhsa6jpLe+tMXHxL3Dw7/GzsrJ0qfOzdPS0NbY0s/Yu3N7d15hVmFXUUlJT0VBQkU1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTltcWUpnYDtIhIt6em2Fhnp8hHiAhYB9cHh8fXxvc416fYF7eIaLiYWDkqe7raiyva+lrrOzqKOisKyKmrSdo7iklayklqmtt6ako5+ZqZiqo6+wqpqZnJSVkZefl5m7u63JoGm2uKuwlJieo6uSl72jXqqygomKjZSHkXyOjn2Dho2PlJWIh5KWi5CVjYqMl5iSnZmzlpWqnoublJKNkJKMmZuKkp6Qi4mVn6KNlY2Ymp2TnJmelKGglJycpa+ooqWzuKvCyMS1u727xcjHwtGhxsnNzcTW1tDL1KJxfGpeW1RfUlBHRD48Q0FCOD84NzQ+Rjw8NjwzNTM0NTQ1M0IzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OTY+PTQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlR2JgY3BKQIuKf4Fyhod9gYl1goqDf219fXx/cHeHd46ChnuNj4yGjJqrwsCvvca7srTBvLStq7O2jKiyrq69qpu7pKituberpqaioqOjqa+ysaudnKSYm5iXnqKlpZKjua6ov7usrbK5paOmfYiGnK29sIOLjIuQg4+DkY96gYeQjY6ciIiPl42LlZeUkZqWnaeasZqRq52Omo+SjpWQkJaXj5GgkYmVm6OslJaPlJyelKCem5igoZWanqenpKGksLKmwcbDsLC6tsXEwr7Np8fDx8O81dDNxMqIdHNjXVthW05LQkxARUY+QT9COzo0PkE9PTU8Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZkZgaWdaXVuTjIyIe4eLh4OMdYaQioFvfnyCf3F+gXqVepGUlJiQk5antMbJv8LMwcO5yLy6r6u5u5eytrqywK6lwKSqr7u7qq2roqKep6uvtbCqm6CqnKKclZ6wtKeLorq5tcG7q6icsqSjqJOFjanDxKSCi4+HiISGlZSNeoOMkY+RoYyMlJGPiZefmJOZlJemoK6djKqcjpaPkpGVlY6QlZGPoZSGl5+gs56UmpSgoZmkn5qgm6CUmJ6mpKanpK+tpcDEwq6pt7XJw762zrLFvsS8s9HJyMG1dXltXVlda1NNSUNMS0tJQEE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZltNZVxmVGNqmY2XiouIk5CGiXmGk5CBcoB8jX94h4KCkHqNoZaomZqYur7HyMrC0snKws29wbOsu76nur+9u8O4rMGprLO7vaqwqqOlo6uutK22taCfrp+mopijtL2pm6i8waO2tq+rkq+sqquWhpmppqWRgoyTpZWJgXWKknmFjZGQnp+Tj5SLkI2Uo5mXm5SUo56pn5GlmoyPj5CVloh9j5WSkqOblaCinLWmkJ+WpaSjpZ6eppielZebpaOpqKKyrKi8wMSvpbO3zMC5rsOzu77CuKzCwsHAmW56YllYXVxMTE1KR0RDSEJCQUNLOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmtJX1hhWmRkVp6QnY6Xjp6SiYp/iJ+ThHiFf5V+f5CIipGAlaGarqakmMO+yMPIxdPNzs3Lu8K3r7q9tLzKvMPBtra8rbO/ubyur6igqae2ra6psreanq2iqKGdq7e4qaWvvsOxvbmzp6mzs6ytlpakq6egkY6SscWnlY58kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjY+PnohakJeXkpalmmaYo5+zpZailqytq6ebn6aXmZaZlaGkqKaetqupurzEtaW0tsvBuKm2rLO7uK6ouLq9uINub1tYVVZPRktTTks/QUhFREhGRzk1Rk07Pjc+QUouMzIwMjVCNTVPVk47TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJyRmlJUmViTEamlJyWoZeplo2Qg4elkoiBh4KchIOVkJGUjpqin6++rqHHvcXEx8bOzs7Syr67trG6u7y+zrbEvbe4t7KytbO3s6ymnKuruKupp6+wl6OvpKikpbTAsKqss77CucC5s6e3s7eyrpWkrK6upIuTlaGNdMGafZaZhI6WmouxlZqZlZKTmZmmo5Wgm5aaqJyboaCZi42Plp1gSpacmpSapZdUlrCfr5yfpZSvr6ylmqGllJOZmY6doKeimbSpqrO8vLursLLHwLmlq6utsbGjobKytKRxb2ZcW09RTEVQUFFRO0hLSUZIQkM+OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UUVXUnNiV0ZIq5eZoKKor5mQl4eLp5aOiJKFn4iEnZePnqCao6S1yLSpxrvDw8jKycfMzse+urKuubjAwc21yLrAubW5sa+vsrSno5uqtLSrqaaurJmkrqWlqay6v6irtra+wb++uLKywrC4vKujrrSsuKWIm5emm3a+oISYnI6TmZqLr5ahnJuXlZufoameqKCZmqmZoaeel5CNkZ2DbnaSopqVnaKfkK2yo6uVqaqYq66lpKCkqJKSmZyIlJyinpexp6mrure+s7Ktvbm2oKOnqKWnnJysqamMZWZhX1JMTUdHTkpWTD1NRE1JSkFDRDxQVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uU2FNVUh/ZV5IRayVnKGfu66ZlJ6Mk6qbkZKTiauNh6KejKStlKOjtsa9tMG6wsLIyMXCzsjCvbmyr7i0wMLKtsaxwby0uquorayvo6KZqrS7pqmmq6qdqK+npKuqvbyorbyzt73GvLa1t8Cvvb+zqLS2q76kj6OXkaKfvJ+JmaCZlp6dj7efqZylo5ucoZqopbOhm52lnKipnpmVj5Sbi5eJjaShlJyjnqC0r6Wlk7Crmausnp6ko6mRlZWgg5Cen5yVqaWiobS0urWtqLWys5+coqaal5WZqqGed2FeYF5KSUZITVFJTkVGRkJSS0lBREdBVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnG9iR0Wnl6Sfn8OsnJekl5mpnJaamo+qlpaoppWtrZmhq7bEwru+t8HDwMfEvs3Hu765srC4s7/DyLW/r7y2urempKqrrKCgmqqrxKKlqKumnquvq6KpqL64pq29sLe2x7a1ubi+sL7BtrSytK+9o5ejlpOblK6fkKGipaOjn5C+pamdqKydnaGbpp+9opmjnqKpq6Gdl42VnpOfh4+FjZKepKCdtaymnJWyp5mwp5+aqp6gjZmVn4SOoZqbk6WkmpissbayqqWpraycmaChko6QlqmflGlkWmFdT0pIS09NSEVESUE9T0hBO0dJSFtST0s9SE9VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlY1dMopqjm57FrKGfrJ2crp+So56WpKCnqqyXtrCjqrO2xMK9v7bAwrzIwr7KyLa4tbSws7S3wca2vrC4tLm1n6asqqudnp+lpMGloKmtoKSpra+ipqe9taWxvLe1tcOys7e5vrHDwLe3rbO0taKcpJWRk6CtoJihnaipq6Kaw62pnqyum5uemaagvqGdpJirq6umoZmNmp+SnomOWH+VnqWhoLiqp5OYtqOfs6Ggm6+Xno6ZlJ2Cj5+Xlo6ipJWQpq6yq6mioqWllpWdmYuPkZOkn4ljZVtkYExJSktPRkVBRko/PUpCOTlKS05dUVFJPUxXXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxLTp6foZiew6elorOgnLKnk6qkn6Oframsnbuwqay1ssfDwcKzwsS9xsS8xcq8sLC2rrC1r7/FtbmwsLq1rJqosKmpmp6moafCrZussJyqoq6wqaSnvbemtrq8rrbDrbOzwr+xxrO6tqu0ta2qoqWVlZSjq6Gen5qoq7Cur7uypqCpqZmZl5OipLmgoaSSrq+spaafkqGelZ6PkY6VnZmjn6e0pqeNmLSco6+anpuukZ6Ul5SagJKhlY+OoKGTi6assKWnopygnpOSm5SFi5KNnJ6AY2ZbaGVLSUxKU0JDQEhHOztGPzk5Tk1VXlJTSj5PXl49SFBCTExJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMKoo6qyoaO1qZayq6aipbKsrqm7sq2wtbTGv8TEtcDFvsrEtsDIwrWrtaiwuKzAxLS3rqy2uaWZq7Krqpefppetu7WbqLCbrZ+utLGnqrqyp7mzt7K4wKq3ssK8s8Wnvq6tt7Spp6yhl5aRpaSiopeYpK64rbG1tqCfqKSZlJWTpKC3oqSllq2xsqWqpqGempqblpion5+Yop6vsqKmjZeumaWsl5mepZGbjpSYmoWWn5SMkJyelIupqaqip6GZnpaMj5mQgYaWiZSfeWVpXWxpTlBNTlQ9Q0FNQzo6SUA3N1FPXV5SVlFBV2BcQkpTSFZLSDpVZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SnBpVkNXRox5ZkM7pKOdoaa/pqevr6Cptaudua+rpKq0t7Gwubewt7i4xb3Dx728xMHHwLnBxsG6qralrbutwcO3uKqtsruila2wrbKWpaeRq7mqoKewnaqfsLSyqqm2tay7rLKyubesubDCur2+psKqsLevqaqrpp2YmKqhoaCRmKCwrrOrsLmam6mfmZaSl6agtqmloqKvsbOrsaern5ugoJuepZyhl52js7Can5CTpZqhqZqVop+WmImUmJOWl52TiJCbmZSOqainn6OcmJuTh46Zi36NloWPm2tpbWFtblhRUVpVQUNFVEA7O0hBNzpYUGReUFZXRFleXk1MUk5eS0o+WmReTkhQTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjqJe2NDPaifnKGpvaGqsKqjsbippbWyq6Gttb2vs7i8ur23tsHCv8nEucXDwMC4xL7BuK+2qKu3sry/v7SprrG3n5erraitl6epj6e7n6Wts56rorGws6yptrO1vK2vsbWssLWxwLrEtqu8rrG4q6yporGlnqSpn6OXkJmfsqqzqaqzmZ2nm5mUjaCmpLSup6GsrK2xp7Kssqmkm5+opJ6UoZibqLWpl5mSkp+ZnqGekKyfmJiGlZiLnZqck4qNlpeal6alo6CdlpWWlIGPlYV7j5KDjJdmbHNocHJfR1lmVkRDTlhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xjYFBLTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVTE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmqCkrLekrKmlrq62qa6zuaansbjGt7G3vsHCtbS6xb7MxbnDwLq/usS4wbmytayqure6ur61qq2xtpmYp6uqq5usq4+rvZ6rrrGjqp+wrbOurraxubapra6wp7aws7u8ybKqtbSxtK+upqGzn5qoraCllZWambGjraClr5ahpJmZko2ipaeyqaGmsauptaWusLWvo5mdraeal56Zmay4o5iUkY+YnKGYl5Ssn52UgZOZjZ6dmpaQipSTnpqlo6KgmZaSkpZ7i5CFe4yLg4yTa254bnV8YUZgallJSFpbPXtKR0U2QWJUaVpNXGFKW11aUlJSYmBMS0VfYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLipCL0pHUFtIM2NZVUtEmZegsKixqaylo66utam3tLijrLS3yru0u7q/vrS0t8PBzce7w723vr/AuL+9sb2up7q5t7fCt6ytsbmVl6auq6ejsqmUr7qkrbKxp6eisrOwsrC0sbeyqK6rsaa4r7Wzw8W2qbS1q7Ctqaeitp+eprGgpJSbmZSxnqebn6mNqaKdm5WXpaWlt6eisbOrp7GnrLC1rKSZoayom5ydm5SquZyVjo6LmZ2imJCXpqGfloSSl5CdnJiWloiXkJebqJ2koJKWkZCWdoSQh3yFgoSNjG5xeHZ8f11LZWxcS09jXD9ie0dJOEdnV2VbTF5iTVhZV1RYVGldUE9IYV5fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RU1RPDNya0pEQ5GZpK2kra2rp6SwsrOqt7C2n6u1ucm5rsG7wrezsrXCw8/EwMG+tb3Av7q/vbPEqKq5sLa3wL2vrLOznKCnsK2lprClnrK1rKuysKypqLS5rLSytayzrKmsqKypua6xsMe+uKW5r6mtraaorbClo6Ouo6mcnZyar5mio6KjkKyeo5+foaqmprilq7S0pKmrqKuvtq6inaOoqpugmpqSpLSaj4mNiJKjoJWNlJ2glJOFjpSTnZuYlpWHmJKVmaecoJ+NkpGOkXd+joV9fH2HiopxdHJ+fX5cUmRvXk5aZl1GRJZbRzpObVhhW01gYU5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZDs2KkhkSEorOkk/M0JJUyw+j2s9R0iPm6mqoqmvpKiks7SxtLWxsaGsrb3Muq7BvMextK20wsPRxca+wLK+wcK8v7i8xaitt6yzuLzBsKyyraCkp62pqKSwo6qxqq+rsa6vrauzu6e3sbKpsqmrpaWjrbqsqrHCubSsuqioqK2pqLGlqaSirqqoop6boqyVpJ2XnpirnaGnqaGspaKsq7exsaCoop+qrrCsnZ6mp6mZo5iZj6CnmIaDjoqLn6CPi4yWnI+PhoiRlaCdlpiVhpaTk5elnJ2cjJGQjYp/f4iFfXd/h4WHdHNyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlOY1xOVVZVV1BcYl5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5KMC5JZ0RGODxCMDVFS1gxQJRbP01GlZesp6KqspypqbC2rLi1rqqlq6u9ybyxvrfDr7Gts8TEzs7Dv7+0wMPEusC0ycSsr7eusrnAv7Ourqulp6qwqaeosaW0raqwrq2xr7Oss7ukuLSsrK6nq5+jnrC3q6qturaktrWkqaesrKqtoaimprGypKaloaGrlqmglJqgpp6koqqkrKKeprG3rK2ipKKaqKqtqZyhpaSkmaCZlY+YnZSBgpCIhZ2gjYuOjJmPkIuEjZiknJKRm4yTkpKUo5qbmouOi4t8h4GCg3t0gISCfnR4jKSHeWteYG5nV2aHZE5AZ5JMRGJ5V2JYUmVVTVZVVlRPXF1hVUtOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGQEhIRJeSr6SjqrCXqqmttau2saukq6qpvMHAuLmzvLWms6/EycvRvsG7ucC/wrnBusLErrG1srO7wb6zsq6tq6yntqqlra+rua+osLCusau1qra1p7W2q6ykqaqco52zs6iopLS0oLauoamoq6isp6CrrKi5tqmqqamhqZ+tm5GooZ2gpKKmoqmdnKa0rqelqaKjl6SmpqmcoqSjn5mZn5GOj5mOfoeNh4WenoiFiouPjpCNhIaVo5qOjZuRkpGPkp+XmZaNioN/dIeBf394dYN/e3h+gImej29xZ2dxeFxhdIhpT12YVkhteFVkVlFiT0xVVFVRT1hbYlZIUGpUV1RHUFlVST5JSE9RUHhMTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJi8yUmMwMj9mPU5YP0MsPkxUXy9JazZRRTuVja+gpaqtmaukra+ztK6qpa+pqbq+u8Gxr7iuoravycfI0cC/vbq8w766w8HAv6+ys7K1vbzBsrKzq7OppbWopK2zs7mvo621sa+xuaq4rqqutquqnqqrn6Ogtq2poZ+vs6G0qp6op6qjqqGhrK2ova+srqyhp6efq5iPr6KYoqCop56nm5mqsKiin6yhoZKhoqOmmJqoppeXmJ2PioeViH2NhoWEpJeFgoKMh4+OkYSFlKGXiJGdkJORjZGdlZePioWGeHSBf311eXqAe3R0e2qCh6N1aV5lbIJ1Z4iLfFJXcF5KeHNTZFNRXk1NUlpnTkxWWWVYR1NpUlE+Qk5RYVE6SUhMU0lxUExTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsMExoOjM4Xz1hZD9GMUNQW1srSE86V0I0kI6xn6Smq6OmpKymtLOwqaOwp6q4vsC8sKi5qqeusMnGyNDCvcC+ub6/vMm8wrmwsLWyury5wLO0u625raO1pqessba5sqenurWttbyvvKWtrbWrrZypr6Ofpayrp5yeqrOks6iaqqeppKmdo6moqb2stK+unamjoK6bmrKjlqSbpKWfpJqaqKqlnpqpoZuRmqClnZiWqamRmJmTkIqCj4V9j4KAiJ6Phn9+jIeRj5CEgJOblIWTooyUkYuRm5OVh4l+gHJ6eX58aXd8enVwcX5phnmEiGRgaGNzhXptZ3ldXlVCV3psVGFQUllLS01wdF1IWltnWUVWZlBDPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RltAKo+TsZmfn6ilpKGrpLeysqSosKesuMG9tbCjuayoqLDDycnMwbe9wLW3v7rItsO1tLO1sr25ur22rbm2v62is6arq6+1uLSqnbq7qLK/srqgr7S2qayerbCinKWoqaOenKSxprCgn6qpp6Kqm6OooK28qK6wrqGroqOunp6sppefm6GjnJ+bmqOpopqZo6OVlpOfoZablqasi56RkJGMgouAf46Be5qUjYl8f4uGkI+MiYWSmJGHlKOKkpKHkJqQk4GIfHlsfXZ5eGJ7enJwcHN4aoJ0aoNnZGhhb3OObWJqcGBvQVx4a1VeTlBRSklMU1pXTVxebVdEV2BPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTyk9M1FcPSOSmKuYn5enpKKfqKS4r66ir6+pq7jCurKtn7ivq6i0usfKx7+3wr6wtL63xLbDsq+6srPAtbu+uKm5uL6rpLWnqKqwrbmwqZm5vKOuv7S0oa64taemp7CzoJ+kpqehpZmfraipnqCqr6egppejqaCwuJ+ksa+hq6GspJumpqmampueo5WcnJqdqaaWmp6nkZeSmJ2TmZWhqpCaiY2Qh32HfoKNfHyhjI2JeYOMhYqMjYWIk5qOiZWfiJGVgouXjZB9hXtzcHxxc3RgeXhqb3BxcGp/c2N6bGlmZGFmhoBgW3JqcUxNf2lYWk1QTEpIUFJRSU1bX29URFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBcWjUolpylmJyWraCfoaSht6uwo7S0qai5xbayrqC3rK2ssLXFx8C3v8K6sbW9t7+7v6+svrC0v7K9w7mpu7u4p6i1qKersKyzsKaZvLakq7u1rp+xuLCppaevspuhpKCjpKGWnLCmoZ+ip6+ioKKTo6Wit7ChprGrn6yirpicqqSonpeanaSTmpyanaWpmZybpJSUl5ScjpOXoqmhkImLj4Z6hH2EinmOl4qNh3qCiISIjI6FjZSZjI6WmYqPl36Gl4uPeoB6cHF2b290X3h3ZW1sbGpphG5mcmlsZmldZHOBYFtrdWlaSX1dW1hPT0tIR1JVRjI5XV5tUERXVlllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5ZG04NEdBZltIVERVXWhELjwyY1YsMpWioZeUm6qdpKGioLiqrqC6uKasvcWzsK+jtbCtra+0w8O8s7+6uLGzubi6uLqvrsCztLmwv8G4rL27taais6qnqbKrrbGhmsC1pKe1taiesrypqKapr6yZo6eco6aUmKGypZmfo6ipnKKgk6SgpLiopKeupp6loKiSn6iioaCYm52gkpqblqChqpubmKGUkZSWmY2UkqOopJCJio+GeYR7hIZ9nY2Kiod6gYSIiIiRhZWTk4yQlZSNjpR7g5eOi3d+e2x0cWxsc2F4dGhoamdncIZnaGlkZmlqYGpiamdbZXtjYFNzVFxbU0xKR0lPU0AhKmhdakxDVlVeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OWdPJzKeo6ORjqOnm52enaO1raaqubenrMPBtrCso7Wup66vt8C/vLHBtrGusra2uLe2raq9tK+ysb2/uK68vLGln7arpaW0qaqun53Bq6ilsLKprLW7nqmqq7GlmJ6qnaakkZmnraKYnqSpoZuinZegnae2pa+qr6GhnZ2hlKCmn6GgmZuZnJKZnZSlnauhl5adlJONlZeLj5iaqKCSiIqLiHmFd4KCgpyIi4KJfH+EiIaFkYSWlY+OkJGRkYyTe4OVjYVzfX1meG9ramxndXNrY2dkZHaAYmVmZmVqamRrcVpeWV1tZGFOaFdaYFZKR0hLTVJYPjlfbGlIQlRTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1m6OfkIusoZiYoJaltLGhsb23obHGvLqxsaS3rKuuqbm8u7qtv7Gvrq62r7O4s6isurGvrrS2uravub6tpp61q6CgsKSrr52iwKCxo66wrreutZ6tr6ytopqdp6mlnpWbqKWfmaSiqZ2aoJuUnJ6sr6W6qK6ioZqanZmeo5qknZeemJuUmaCSqJaqp5qTmpqRi5SZjZSUmamnjo6KiY98gnOBgYuYhYd8iYmEhYqMipOEk5ySkpCQkZaOkH+AjI2DcIB+ZnltaGtqZ3Fya1xoZGNzgWFmaGpubGdramhtXGxrdHFhVGJoZGVaSUZMTU9YUVFWYWWBVEBWU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJKhmo2OsJ2ak6GaqbKvn7i/tqC0wru9ubGmtrCorqW3uLe3rLquraqrt6q0ua6ms7Wyrqmxt7axs7W6p6mftqmdnqmiqa2ap76YraOur7W1rayfsa2vqaKcnKOrqJuVnKejnZqpoqSWmqCckZykq6qpu5+npKCYmZmdoY9roZaZnHGClZqjgHWSqaeelJSekIiXmYCWiqGQeIaUjINuan52g3FshouGfYSLhm9eY2FnhJeGa4uPlJN1d4uEfoOQf2eGgGh1aWZXXGhzbk5QamRncoRnX2Rmbm1qXmBhipCEhWVOS0Q4RlRnXkpHUFBUVUtIU2FvdGVGWlFVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NlmBbDE2T2tbTlxLW2ZiPkcxUWQ9Ky6MpJmGlbCbnJOhm6qtqqO9xK+pt8K4vbytp7awpaukt7Oxs7C4raqnrLSmsLWjqLi2tainrLezrrSts6Kqn7SrnqGknKanmKu6laalr7K3ra6kqa6rrKWhn5ygp6ebl6GlpZubp6edk5+fmJCeqKqjta+jo6OclpeXl6OIoY6Smoehh5OdoH+lf6aqnpKRmpGIhHJ4jY6FiKF2iY1pl4hmfXJ4oXCIh4R+jXx/oaCgmYB7h550iI52m4psh4GDbWhlY3pscWJUhm1jbGmYcVlqcW+HWF5pW2trW4hxbnpyhmeGhFpeRk0/R19NRlJWVlFRUldVZ15NV0lSU09FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoi6aXg5yrnZmZnZ+qqqepvsOusrq8t8C/qqS3sKmsprO0rq6ztquppbGtpbW0nK62trSlp6mzsa2yqK+fq6GyqaCjo5qho5qts5SjpKW2vKesp6uqrKiloaCYoKajmZmmo6SYnKSplpSjnJSTpKWmobejo6CkmJSTl5ObiK6PmJSJqYuXopuFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxlrycxXtytqa7kHuAbJaxq7B4aGtYsa5uZWm8krxuaHpuco/YflNqYrayfoFylHSaoaqQV09XYU9WTkZUW1hRUFKMXFdcUEBcRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mkoGmqZ+XnJ6lrbKosMK9srXAtbe/wqums6ysqaevs6mvtrOoqKa1pqe4r5yzsraqpaSosa6usaaqnqeksaShoJ6Xm6CdrquUnaGftLqjqqmira6lop2amqGnn5ebqKCfmJ6np5Gcp5uUnaGmoqCwop+fo5aVkpiSmYWvamqKjap+Z4SVhq1kcJ2ck5mllHGuoaR+eLt9a6GQdrFfarRbpYBmnJFgZoJ6Zn9qeGupZL5yZ6aMdrFqfLF4dJKTY21tp25bhKBFaGeHlkV1nGB+Z3ykp4JZX4uraYCVeHlqpzdKr1xXU21jW0tOV19cV1Y7TolPV1cvSVRTSURFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuRoZWDrKelnqOlqrK4rLS9vq+2xLK3usKmqLCrrqmpsK6jsbqvpKWus6Opuaies7Kwo6Wgqq2vrK+mp5+jorCbopuXlZebm6yllpuhnrSzoqucoq2toJ6al6CiqJ2ZnqSfnJqhp6SPnaOal6Cfqp6mpqCbn6GVlZGWkZqFtZu1eIWpmbWZd4ezm7d+k5WWqJR+a4Gme4KGiJKUknirZ2uxW6t7j4eUdIhxj4aAf4iQl3iDgouYjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYpwuUaJvW1NraGBMS1tkWFxaQj6xeFdYQSNNaEVDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+UiLOmpqGuqaezrKq7tsKwu8KtuLfBqqytrq6mrrKpoa+8qqGntK2kq7WkprKzp6OhnaiqsqiwqKWen5+vlp+ZlJWWmJ2sopqZpKi0r6Kpj6moqpuelZigpaean5yin5ugo6WjlZuemJqdoqqbpZmcm6KglpORk5Kcg9WTmblwsMJ+xoZ81pSbu3yZlaSPjZyNpHuOh6OCpYJ6rHmPnVaveoh+n2q5Wrl3hoN8poKTfJh6qnmNnZB7sW6OhHSQvIVvlFCvp8WKUaB6Y2CpY3RyiG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITWxLW1JPWWZZQ0Q+RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcyJZuhk5ixqKils6qltaikvLfBsLnAsbW0u7O1p7Gwo7Cypp+utqibqLmuo6+xoLO0sKCknp+oqrGptKmknJ2eqpeYl5aXlZagqZ2alqitsKmjno+soqiWnpecoaWhmKKhoaGaoqKnm56hnpWZm6agnKeVm5ufoZiPkpSRnIiybmi1cauHb46mcrRzcrZ7mZeji46cjaJ+kaGlfrB2g5HS0XZcrnuFf6Rvm6qma4eEfK19l5mPe7Fzkp2PebNllnSEnm+eZpRSyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpkZlhBT2tfbGhPVUdJOT1WUltYWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnJGlsK2kqrytprWlp7a7vLK6v7e2tLq6s6W0s6GxsaKfrK+kmKa6rqSxsZy0uKqfpp2iqqSyqKyqpJqcmqielZSYmJKSoqeflpKlq7CmopaTrZ+lkpShm6Smn5SapaahmqOfrZqgnp2QlpuhnZyllZ2WmaKflZiWkpqFrHt3qHajjomHqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXiFfY6ehpmad6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1fd3eHaJiIa16vd5Wej3hsNXnIrrJfQlRvXmdgRVBtX3BtVlVNLmVjaVNZUTtCREFMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOTg4n52UoLiwl7TBraizqKmyurezuL+5t7K1vLWlt7OftKyfn6irn5WntquosbGrrbSkm6mgoKihtqemqqOZnpWloZSTm5mSlKKlmpKQpqyvpqCVmamfoo+RopmopaCVmqWonZyknq2doZ2gjZSem52hmJmclpaioJOYkKadhql9faV4oY+Og6pwrYuBp4aVn6GIl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92h3OngY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFtMdF1iZk1bYV9ydF9KVjZKm5NYSEU9SEZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MDAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzE/OKGdmZm/q5e0wq6rrammtLC3sLW/ubmysLe8qbq0n7CknqWnp56TqrCpsKm1rKuvoZihoKalpLqio6ugl5uRoqCVlJ6alJieoI+Ni6ivr6adlpuopp+MkqSXqKunlJepp56foKOtpKGeoY2VoZmfoJKdl5yVnqGVlo6rm4+ubXK0cqmMdoqmc7R4c7OAkaSikZyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWSiK1rdbNhnWaib4eSapdcrWBNoXyHkVJzo216f35vmIdxXK9WPJx3ZVRvbi5cp09jUmtlYm1aY11gcHtjVFpRPj5tbzNCQkA/TTkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7PDAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpuduqGcssCuraurp7epuK+1wLW8sK+5uKvBtqmqoJumpKGdkaqqqLajsqivqqCXnKegpKu4naOtm5aZj6WjlY2doZuYnJ+Qk5SrtbCnmZScrKqXjJOlmaWtopGWqrGjoJ6nq7CYoaOQmaKXn5uWnJehk5yqnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIeQl4yYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIeqfb5uc7x0soN1eIGLbpqIcW6NpHS9Xnd9W2F5vGtaVltqel5qYWZnYm13b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkE5p5qeobyil7HDsK2qqqyxp7ivtsWxurGuu7CuwbKspKKeo6Gcm5GppKqypLWmraSflpqqmaasuJ2jrpiVoZCloJKMnKOel52akJWSr7mxrJWXo6enlJGWpJ2krZ2QoKirn5ufqaOznqOljqeilaKanJeVo5iPsKCSlKqehZCZtYCQkYy3lXiCk5q1d21rbnNueY+Ejol0nsG7vZp7gbKocIB0kbiDfIaGjIaNe4uGjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbZ0cnB3toxegHp9imiDeW55Y4uscHWFf1lbp2pFZFlTZmBjXWNRZ2ZxbXVCTVBNRDtaTT5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz47PKeeoKC/pZa0w7Ssq6esq6m7rrDGr7WzrrentLitqaKhpZ6gnZmUq6Stqqa1qKefm5ago56spL6noaqXlJ2QopuRj6KooZOdl5OXlLK1t62YnaOkoouSkaacpqublqikpZyaoaimp6OpoZGtnpeknpeXl52ej7ColJynoo5qfmmcpniHc32aj3R6ZYd6vb7Aum+SgnGVh19yalpemolhY4iOlWtgf5VjbZ13YpVrgJqVlGVeYGNxm4ppcox9hpVnan5ydHh9fWJbd3SBaFBcboR9e4trWGx7gnNJSm+GcE51TUVXXWZgTFtYZ2NfT1ttdWlxUlBERU48SEk9TD8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6on6ihwaObtLq2o6ylrqeotbGsyKyvs6u1o76xsqegoqmdopuamaymrqSltamlm5iVoZunram+qKmmlZSclaCakpekqaiQnZGPl5ywsr+sm6edp6KJk5Gpm6mkm5uroKOZmqOnrKOfq6KasJuVp6CWlZ2fnZexpJihqJmckZ2co6OZpqKanJqamY+WgWdtfXF3kpeUkYWKtaqNhpiVj4qMmJeHlJWKhJKUkYmOkpSYlJiXmqCimpyUoZ2NgnqlhmxqfJB8gHSJioFxgnh5dnaLgHuKa3OBdIN1ZHd9d2twe21gY11wZ01ZWWZqYFdacHpubGZTT0ZTOU9aTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC5As6Czor+ho7Gyt6CppbKnpbC1qsmrrLGltabAqLShnaSlnKOVlqCqpqyjo7ern5mWlp+XraqmwZ+spJWSnJeemJOUop+eoqaTkZmop7LEr5qrnKqfj5aWqZ6rnJygrJihm5yipK+noqWonq6Yl6edmZqhnp6csKCcoqaVmJOYk6ChlaOel6COlpOKio2Olq2PfJWbgpKCi6qohoGYloqEj5+Ie4SQh4WZkoiGipWPm5eNkJeeo5aak5GdjX6OZqGzr4WKhHZ6kIp8dnl6b2Z6kYGAiWt1gXmIcmhzf3p2g4iCa3RkeWZgamVjZGZrWWt7cGlqXFNMUERfVUVAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rKuusrKgqqaxraKss7DFsKqso7OuvKS0nJ+loqGdmZeopammpKWztZ6VlJ2ZmbCmrr6grKKQkZ6amZORlaGcl6ichJ6pq6KzyLOfqqOql5aXmqedqJuepKuTnp+doKmvqqajq6Ktm5+goZmknpyena+jmJ6ok5iXnJGkmZionZqXZYKSfGV+jZmPY3mNbGhrepGkq2tlmph+Z4WKZWVpaHuOoY9raI2XkaN4a2qLmKOemHNsbnqEjYd6WGVehYJebIuKgHZcaHN3d5KAh4JueIJ4gHNteYR0d4mIjoN7aYZZXmt0ZF1ziWlqfHFsY15STldKZFhBSjQ9Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7CqpaitrbCnrq2wvbGpp6Str7CfrZefo52hmpmnq5yto6WoqbKunpWjkKKvpre5pa6jjo6aoZmSkpugmZmllXulrKKotMS4pKGnrp+elZ6jnqOco6qokp6hnaCqsKqro6qgqZumn6ihrJahm6WwpJecq5WhnpuSpZeeqpiefr2Dh3K0coSdhq1oeLnEuHGToqN7ppiZc6qCfMvAwLtxi6KIgp99lZiJnsC9gpadnY2dwsF7gnuSjZrDwH1qpbFvjIFvynp/m3eSg46BdnqBgHlxen+HcXiFjZN5bXeUY2ZfeGRgZYJjXnRnbWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqJSjr6mwrq2msrWvqaWmprCroKuYmqKfnJuqp6KcrKOlqKWktKSdopKmrqu4s6evopGRmp2lkpGgoZebn52Hpqukq63AwLCgqa+pl5KfnaKZoaOqo5OgoZ2dra6prKajo6ehpaaeramSpJuprambnaqcrKGWl6WWoaOXnH/OlHh6pIF5lZabX66PXo6ngaKgfKeVm3Srg4CvXmONqnqnh4WgdJeTiLNjgquGoI6Ns2qErnR9l4e4YYOtWaPNbpB1e9p7f5lwfoiSdn5le4h2dmt9iG5+hZGSfm2Cj2Bxa3BnYF95ZFxxaGpjZmBSVFJXXktPQzVBSEVEOT42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3Cv7+1tLC3l52RpKqorbOrpbKsrKukq6evqqCnm5mkl5yir5+gnqino6WhnrCsm56Vp66tsaqorKCUkpufpZOPn6WXnaejnq2kqrCowMazqKmxrpaSnZyil5+pqp+UoZ+cna2vp6upnKeopKKrkq20l6aiqqmdo6alobCgkpqnmqCalJSRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553qoJ9rX+ccq1+q4eGn3aYknp8l36qiKKMkYydfqt7iZSPn4B7rVacxHqPb5LBfYGVbXVwjG1ldmWGb2F3bnJviouSkINtkZFlcHR1cGBnbWVgb2lpbmZjV1NdYVlSU0M5SklARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSfnaOOo6OhrK+2rqmxp6iqp62rq6eio52ZopWgpqufoaWgqKiin52wrJialqinr6yop6mel5Sao6KRlKGtm52mo6+so6u0qrrNsq2mrqyWlJydopmfrqydlqCZnZ+psqmqqpusq6SjrJuwsaKorK6lmKaqqamxopKWo6WalJKEpGqkdYl6qXR6snCCpYmZjHGIoJqHpGBgUquEf66Dm3augaaGhp96mZaGe2aAo4mkmYWCo32pfoGVh65ffKhVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2NmI+BbZqTcG55eHdvbGZlZXJwZnxpYl1XYGlYWFVMTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1b+hmaunoa+inrC0sK+praKnpqqrq6mkpqCbpZ+cpqemo5ysmqKsoaSfr6KdmpKqpLWwrqCpm52WlKekkJqiqKCgpZyxpqOnsay2yLK1qqyqlZGdnKKZoKWznZqglJyfp6yrpK6araqjoquis66iqrOxoZqpqK6vtqOTlqOnmJuRfKpsnoSHdat5fLBvgqSKiZ+WlZ+UgdK4tLjJgIGyX1+UqYOkiIegeZiVmniqyXSZo5WnqZCTmox/m4qaxsZ4ZaGCpXOBn46Cfa9ecLVjsXVLo4Ztp0eCk2SPkJ6SfHCXk4Bxe3V9e25bZmpzcWaBal9hWWRtXF5ZSU5NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC8+LTVPVFEdHDs8RjIsJKekwca4ramyraylopyyuayqoaabqKWqq6qnoKalmKqjn66rnaagrJqeqaWdp7afopeTqKq2sqybppyglZClrJGZnKejn6mmrqGjp6mwtMKys6qtqJOJl52kmqGjr6aXoZSYnKWmq5uwnq6opp+so7etobK5r52brqeys7OklJeno5mfjoKdTniagX+feoOjfYOkhIenn5yek4S4e3x5uYJ+zMbCtniboZGLn32alpaKdp6YiqSYo6h+sIWdhZ+ErH2alGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpKkl3x9k5KLdXpzhX9xXG1veHJqgm9aZF9obmNkXUtNUVRCSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruKuvoJuhrLOzpp+glaaura6qp52mppujp6CyrqKpprKgmaqklKO2oqKVl6KptLiknKKdopOQobGZnpynpaGir66dpKihtrLDsa2pramRh5Ccp5yipJyllp2YmZqmpKmar6KupaaYr6W8raG3t62enbWyuLCzppidr6GjnoWP0bXDt3mHjoWRk5CBpniUoneMoJGEpYGKcaqGhLRucmqZo5uVip98mJmGh49zr4Klm6KNpouTnYmVkJptcLJcpXOTepxsmX97mX1uqWGjcXF/n2JzsrhoeI+Uppl+jI2TjHh9eY6CbWl4anlzboB0XWRkbm1mZ2BKW1lYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklk3ONiq2/v7u6tZ6Wp6SttaGjmZWjqaeuqquZpqKfpqGgtaejqaewo5Sso46kraOdkJqaqrS0pJ2knKiRlJeuoKCepqOcp5y0mqGqo7arw7Cpq6mhjISOnKGgpqKVmpqbmJuZpqSmmKyorqOlm62nvqyUvbCsn6Kwsrmrs6eaqLGkp5h6qJB9fLB3ioGkpYicbbJvoYetfKGOg6iVmICsiIWuhZ+UqaChloafgJmVgHuSfquAnZqWi6p4naCPiZSSgHmvXaOBfKanZJ2AfJd0a69dpWtwhZldYFuMoG2VkqeZg5SNl4x7e4OXf2tsf2N+dW2AemBnZXFuaGdoQ1phWz1LVDNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTgwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZWV1hWVVVRSEZJSiMoKL2SmoSpxsK2wbSfmqygrrilo46bpKKfsK+qn6Sfna2Znrigo6ugr6marqGQq6mklomaj66wrKefp5qsl5iPrKKhnaWhmqScrZifqKa2qcCvpamkn4uAjpuan6aekpWampSamqakpJqprKykpaCqqL+ll8OsqqKhq7K5qq6noLOuqKmYdq9+kIuchYd8uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWlmaShoZGFoFtsaoGzYH+te3uCgbFsZ2+Zl4yIsVt9tFukg2vIomWfgHu7WXa1WrJ9Uq+AeqxYgKFumJCom4uXkZeXfHmPnX5kc35ihHh0gHxhamdxbWZlZU9VZFxCVV8+Sig+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBQUlRXWl5gX2BhYl5fXFtYVVBOSkZDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5uspqW2qKCLmqCfnLOzqZ+jn521mKCzqKqrnq+tnqybla+poo6Im46vrKinoqeZrpKZj6iZop2ln5mjoqWZn6Oqsqm9r6Wonp2OfYublaCgmZCSmpuRmpipoKGZqK6npqajpam7n6DGp6Wpoau0tayupp67rayslYCpkqOvjpuAh6SXmJCBgLjDuoOOnJOEp5acgqyKgq+IppubpaqRftW9wqpio7+9fX6jgoPXuri1hZSTg569voRqo4Fvq4RtnX96srDHg2qrsL2seHeivrx0gZaOp5yQm5GYnXqCkZt6Y317ZI1neYJ7YGtla2piUGFbU2pcQFVhQ04qPTo0Lx4fJB4lMiAdJCgwNDk2Njc3Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5WztLG/ubG9sqKdrqalsqadjJilv6q4saihv6amspyesZy5qJ6tr6WnlJSwrJeMg5uRrqajrKGknKmfmIujkqaep5yaoKiimJ6grK2qua6oo5uXknuHmZGmm5OPkZiYj5iUqZqgmKmpoaqnoaKru56pxaOgr6Oqs7Sqr6mguqeurppzdaqkt4ZliaBwZ62Pio9tb3ikj5mfgXWumZVwj4txlaijm5eupHJtbW1linhvbYKZcYF6anFpZ4mWlZhxaWmEhmdwhmRdiWNqb1ldZ353pmBicY6Rb2ZkgI2Tj6KYmJmSl599h4+VdmaHeGiOa3l/eWRsY2ZsYktkV0psWTpRZUVSJ0s6KyMcIBojLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqmVrbOpubmys6qpoa6eo7KpmJK+ssPIvraqnsCrrKOgp6yfuqOkraytpo2XrqmQjIWVlq2epquhn6OjoJGLpJKnmaiZlqOpoJacpqaor7qsrJqbk5J7hJaNpZiNkZKYlI6YlaiVn5ipo5uxp56jrLqfsMGnpLOmrLCxqq2rp7ijrbeWiqCopbadiZaimIepmpCUnZOqs5mbo6ugsZahoZ2fopygpKGVq6eNk5KMh5KcnJSQmpOYkY6VhYGkmZeVjYuTkoqPhoR9Z4p/dIJ2dIeMcadte5SRlJKBgY6QkI+dlKGWmZeig4iVjXJpkHdwi3h3fHpqbGRjb2RVYFhAaVtIY2FPWitGPSsnITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERkpLS01QUFFYVVZZXmBhY1xeVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW2rq6isKStn6C1sZCOrMa9xLu4qqKlnpumnrCoo7annam1pqiRmKyii4iJj5ynlqyloJmnnp6TlaOWqJqomZSmoaOQm6iZobW7qKuZmpCNfIGUi6GUipWSlZCQlJelkJ+aqqCctqOeqKy3p67BrqO3p6+vsKypqbK4oK68mZGlpKa2opKdpp+NqZ+Nkp+jrK+boaOwqK+Xo6Cco6menp2clqudkpmhm5SQlqqZjZmZlpCWnpGJoJ2VlIWSjJCNlIqAfWaLhnWGdnmIg3OcaoaQlJSQiX2MlpKSl5Ohk52XooSJmYd6cpZzeop/cnx/am9kXnBqYVtfWW5jUGBlUFo6R0dFPjI9PjcvKyYrKSYdJjQwNjY1ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVVQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFiYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mnraCntaqQkJ2ls7uvrKyio5p6naKxpKWwqZabuKajk5mqnI6Giomco5Cun6OVp5+gkpaYm66KqpaPqJmnjJmoj5+5tqWmmZyNiXmCk4uak4qVkpSQjZKXoo2enqmen7ikgISvtaKwr3WkvqOyoHd5oKqxu5R1rKSeiYCqf2RcYnagjqSehJd+bpOznaOnraqjZZ2fknN5mZdwgJiol2x/oqiKZZylnJGXmJaMkpyQhp2akJWDkoaPjpKJhHdqjod2hnF8hoCAYWmIipSSi1p2lZFoaI+OcnqmmplleZmHgniYaoOKg295gGtxZV92cGxraFxmZWJicFNcPk5OTlNHPkBUQzoxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS01UVFVZXWBoZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpuVpqOhr7Gsq6mlqa6jp62lkpartrCyppqqp6uXc4ydsJ+oq6eTl7mgoI+cpJ2Rf4iIm56Nq5qilKehno6XkZ6Fda6PiKaaqJGXpImcurSooJmYi4l1d5ONlpOKlJGQlIyQk6COm6CnmZyyloCMnLWds4ySj7ynoH6nonqirreBjo6mnoOLhpCxqa+MipajmnmBi6yGnJ2ip6mnh5WFmHelm3qHm4GXpoKCe5yxeoqFoJeZlJiVgpGXloSamWN5h5CEjo+RioNtcI+HeYBxgIGFf4Z0hoSVkniWaJJ0oJp0fZmEoZ6HmH+TioODmWuOjYVseHtxcWdkeG9qbGpbZWtqZnRcX0lUTFFARTUuWVVVNykhMDk9PjY0MzU2ODs6PT4+QERJQEpFSktHU1haWVthYGhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq6uq6isoKixpqeqpZmUrsi+sKGWpqm1npCEnaycp6KgjZC+npqNn5qgkH2Gj5mXiKycoZafoJGNk4iGgJGojYeinKOTl56Gn7qyp56bko6FcHWQiZWQipSPj5uLj5KfkpegpJaerIiftIm0mq2Kyoeqroi3hYyvgrCug6mNpZiNnXyoj3J7d5yPp5ZolaR5tIufnqaokpjCgX+riJihcZ6AmaR9l4WVsYChfKGUoJCYloCOk5uKmJGLfIWSho2UkomDbXOQhX96coaBhHyEdYSBl4CPxWZ/qYePo2ueg6KbhJqBjY6FiplxjpOFaHd0fHdoaHVxZ2hrXmRwbWdtWGhHXVJNMkU0Nk5hYzcmMzxER0Q5NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYV1qbFxRRT1LTUBKZFldY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJein7Coqailq6CkubGqq6aalKCjpKqjlqWqt6OvgKGnnKWenYmUvZqTjaGRnZB5hJaWkYirmZubmaGFj4x2m5yPn5CInqSblZmYh6O5rqSZnIyMfmJtj4uTkI2QjI2Yi5CSn4+UoKGZoah+oaeHrZ2glq2PnpydkYWAoI2qroajjamZjJp+onWAmZRrgqx1Tat4h42dkZuop4Cpq32DoXt6p2mef5JrZ5eGl7aJnn1uYGRZg5Z/jHtkaItymX15lWxde5ZtX1Nwg1xfa3mDYFllgn2DgJdwp6prg6NucqVwn4SfaWagbVtuinxmWmCDf2JXUG93Zm10cmtqb15qcG1salhpT11YRjlBNEdEX2s0LElDUU1OPTg0ODU5OzZAOzs9QU8+UVJMTUJKXF1fV15eYnZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWNpa2RiZGRnZGJnZWFjaJeWnaC5oaqjpqyRoba8rK6jmZegoqWsraGdrrWjqJKhoKCmm5mNmLSZkIufjJWMdYGUkoyKppaVmJ6ef5KFhaykh5uQipipmJmakoimsaeilZqIiYBpboiIi46OiouNkouQkqKMlJ6gnKKlf5OBj6OhlKB3nJaPp4Ohp3+GqayEpXiKfISafaJwc5SIlnuejHlth5yMmZCbqJqPh517gqJzdqZmnn52pF+Yen2Sc6JumLe0unSSh4J/tahkgca4e3CVt4txgJqkY3Osq2B9ap2zfm58hoKOgouYcX+jbHKjc56EgKRgnZmzlnF8l5+0dHNbnrKDamJvdHZyaG9Ya2xzc2ZdaV5iS0U9RDVRQVpyMj1TR19KUj08Mzk1Ojo2RDs7QElRP1VNTlFARV9eW1lYYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS3ta6toJuinKOjpq2cm7GtrJOXoZmhpJmalJ6rm4uJkniLhnCAlo2Jj6GQkpSdl32QiY6ooIeYjoqRo5Ocm42MqailnpCWh4R+a3uHf32QjYOLkJCJj5Sgg5eeoJ2gn4uJd5yYooyfcqGLh6iIm6WPlqeqfq2MfnqgmXqjk3iBdJaIjZx9lqCHm46Zm6aGomShfIiWkJuNbJ5om41umpl7gIqnfXJodKuDnYN0qmiVml2bhXaEnWiqaoC4ZlyocIGcYZWMXqd2doiJf55omnWGk5KXjn+fbpqQbaeaXal+eLtrfqpbjoRdtGdcbnJ5eGtpXHFqeXljYGZYYkFRRU83VkNSbjRLWlpfTlpEQDE1MTs7N0g/OkNIVT9ZUlldPkRiXlZgUWFjfWlFQjlOW11YZGZYZmdubWJiZV9iYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4ljlJururKwrJ2mnJyon56um56wqKydl6SaoZ+Ylpago5mGiY1qiIBye5eIi5aWhJGUmI96ioSWo52KlI+Gi56SnZyJkKmjoJqMkYqAgGmAhnl/l4x7iI6OiI+Wmn+Top+goZOYcmifip+PjHCSjIGph5ieoqefp3yvraOiuJd3o7OipICIlHmde6uaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZl+dKpaXW97lot4nmJMfnp6hWN5l0JMnlmianF8jm2BiYSZdZt4homxs39/m5OndoKdbnN9lG+Zc2ukXZV2SGVjYHNxfn9uZmBsaXZ7ZGViUl5XXVVXQFlGUWdEU1dbYlheSUQ9Qjg/QTpJRThMRVdBVlFbVkRGYlxaYEtgbX5xRUM8VV9iWmVqVmdobW9iZmdeYWFcXV5haGJfZWN2bF5lZ2ZrZGZsaWhraZOdgbGtmYRUXqCms7mzs6maooycq5ycqZShq6SiqI+fnp2amZWYoJ2WiIeJd4WBbnmVhZCbi3yRk5aIcn+IkqGbc5GQgYmZlaCbhY6pnJqVi4uKfIRshIVxgqGMeIWNiIiSmJV8k6OhnqKIroZ9tYSOnpx7pZZ6qYGVnI+KoJx8p2h3bX6ZdKFzcXyehplwk4OufaSDpp6agKNvXqhndaNjb6VhnNOQfHuZeHJzY6KFkH6jc6OPdWuQs4xggpiJc6qyqLx/d4Ntfr6mqbRenG59cZdugHOicl2kZ3OmYWimbZvUmX2Fm3B5epdrm3t4l3NuqaRnYGV5cICEa2dmZG52d2dgY1NbZlFRYklXSVRgV1NbZWpcZVFGQ0tNSktCSkU4UEBRTldSWU9TUWBmZWlTY3d5d0lGRWNeZVpoaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+xq1RcS36pr7G0sLOjm5mFmaigoKSOpKigmKmKmZiYk5mTkqCYjoiGe3B9hGh9j4OUmoF3kY6PiW9/ho+TkmyXk3yIkZKkloOOqpqUkouFiXmDd4iAboKfh3eAk4aImaKXe5SipJqfibOhoraLeqynpK6lcKiAmpCFgJuRe6SAoZmGmHKehKOur4qXjICMpI2Wg66hlHa1tbXJoXOUioGfYJ2XqW15lYagm3Whh3egfpKXioBvTGajknCbh3Kke3l0YYOCa36ga3FkYJxyfnSXaXpps7W0xqZzmH56nWucm6t1hJttdXeYaZp6dZhyUEV9tF5qdmt5iGZqaGJ0dXBuVl5UWWlQU2hJVUxZU1VdaGtuVmdXTUtBSk1LSEpOQVFLUGVjaW1ldXNzf3l8bnWJe3tUUE5sXmhba2lSamhpbGdsZmNlX1xdXF5pYmRpa3tfXWRoY2pmb21laWxloZyIr6aEZj+UobOrr6+2oqKQgJepoqKljKWnnZ2mgpqXlo2XkI+ck46Ig3lqeYZlg4x/l6B5dY+JjIFphIWSg4yFnY16jIqVppODl6mYjJGLgYl6gH2LeXCQoYZ5gZWHiZagln+UpaiclpaEZm54nGyiZHxxpXebmHBnpoCWi3ukep+Wg5dynnaBipSWj7lukIqiYn2ZoZWIbXJpq2p1oG1upl+aaYuQaJaHmpV1ooB9mmCMhox0b4hiaKBlnn5pmnVvY2aIgm1yolpfW2OhbV2JjG97fnNyZKVtd6JkZ6domXOMmW+ib1OJkG+gX2WoVIteVJhubXNrcoJtcGlreXNrb1JZV1dmWlNtSVhPXUlYaWhzallrVlFSRVZcTFhSYVVoal93dHp9cHx8coN7f3N2jYCEdl5RcmJnYnBnUGpoaGtsbmhkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ykmKZ6ZXRti6eupKmwsaafi4CXq52fpYyioZqiooCWmJONmo+LmJCOinuGcYCIaIuLfJibc3SJfZB7ZIKHlYqJlZmCfIiGlqiQgaKskYaQioKKfoCAjnNoj6WEfYaUjYmYoI6Ik6qnnYmmeJabf6SIloyymJ6Qgq+Xn6V3lId5qXSkjoSabqSijJKEjIO7bn2lr4KGhoaTlpyffKV6caiVoJZmnn5vq2OWipWSd6hsqaKBiXWHgnerkaaHapGwa3azjKlrioZtbZ+ekpVhf6uLqnZ/f4ylnnaffYSklZ2gapuId6xnn62NtnR3vo2kk1mDpo2rYXVydHB8dHFjan5uaGxTVltWYWJda01dUl1JXW1tdmBbcVlcYFpndGVub3FjcXRgeHp+eXJ5g3OEfoB7e4yBgoB2YnhkY21zZFJrZ2hvbHJqZmlhX15cYmtibWx7b1xcYmlibGp3bWdsbmKVpaqdgYCepJapqp2op66kmYmDmKuanqSJmqWdqZ2FjJqOhpyRhZKNjI10hnqIhG+NhH6Yk3R0hnKSg21/i5KHhpOPfHuBhZimjn+lpo6BjomFlXaCh5JvbIupgYOLlI6JnJ+JjZSro6CPgHWUloh+gXmUrqN/gZtxj4V4j4qDfntypoxxfX16l5abhI54e35+h5SVk4p2kJifoIN6fYlrjIVbeXhyenBobn6SiXF/dIKPlJNxhYOCZYx/XoF/i3d1c5R1b3lubodthIVedmh4jmWAgYWOqZt9dHyWaomIb4B2fYZ2bW1njHN5e5h4hVtrWHmPaW53cnFveHhwXWyGbmpnVlpgV11la2NWYVVfUV9weHlsa3ZlamtqdnxxcnRzYW91YnR7gXh1eoN2gIB/gHiLhYN9e21/bGR4bl5XbmdodWt4amlqZFxgWmNqZWxxdW5aW2JrZGxseW1obG9hjpS4qKaLoaKapqSZpZyroqGEhJiskp6hiZqmm6mYg4Gbin6Wk4eOiomNcoN8j31+j4V7l45zcoRwlYV7fZKLhoaQhXh+f4aZpI58p6GLhpCQhZaDho6Yd3KFqYaOkp2QiJ6eiIybqJ+gqoOJjZSafn6Jlq2oj5Kmj3dvnZGCeZFvfaiFcH2VcWtwfYGfjH+TjoxobV2Di4ycm56Oc5WLiHF0a4F2dIFZcm6HkYF9foxqXWpkeoWDiIBfaXh6m3uCi4J1gYaCZ3eKhmthcHKCdl9yi4GJj6aVhWaMj4Nud4uEcYaPenBmZ2R7g3qWW1xqZ252W3t5d3Vuc3OCZlxtimtsY1lZXltZbHFcX2FaXl1mdH57dW90Y2trant9cnt4dGRtdGhtfH52enx8enqAgH5vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbWxnc3lvaGptYIuLqbChkKOhmp6emJ6ZqKOifoOYrY2flYibopGllX97mIR8kpmJiIaHinN9gIt2hYuBhJaKcW+AcpiGhH6ThIOGioF6gIOLm6CQgqeiiHiOmImVi4udl4WDeq2CkZiZlIqenYeIoaufoqKji4eTm5yjmZaqoaemoJKbh5WNe3eNjoSnfn+SkZKTnLKmm5WekI2yk5iEpYyMlZufiZCbgoiRimt8jXd4ZYKGkIp8iZ2Eh4uQiIiAhYSQd3x5dJqhiIaJnoqElH59i4GBdXBzhYN/d4eHipCmkYSFjYeDjZCMfYiLiZCCd2yChH16mWpyaGF0inB9end2b3Z0gV1eb4dob2BeWlxdU2hyVWNcXGFsaHV8fHNvcGRraml/fG55f3FpcHBsZoB7coKAeH99f4V7bYKMhnx6eHx9eoN5TmR2anJtcHpka2ViYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2WMh525npeioZiVmZiUmaShnnx/mquOno2GoJyLnpZ9eZSDe46ZiYaEhIZueICAcoGHfomUhG1rfnqXh4SDkH+AhoSGfYaDjpudkoern4NyipCGk5GMnZF9jXqqhI2SmJaPnJeHhpumn6KanYaDkZqZmZCapqClnZ2QloCQinZ7h46EpXt8jpCRhpiqoZ2TnY+Nqo6RgJ6MiZOanoKOl36GjoNvd4VxdWF+go+GdYuYgIOPgoaFfoWDlG14dXSSooqMhZmFhI10gIl8fXJye4eEe3iLjoSSpo+Gg4+BhIqKineGiIqMfG9rfoF8bmhsbWdeen9ofXt2dHZ1e3dcYHB9bnVgY1tdXlFnblRlW15ha2l2en5xbGxka2pogIBsc4FsbHRveW+FeW2HgHaCgH6FdnGCjYh+e3t8f3uCimBpe2p1aGmCZWpjYGlcZHVob2J0bWxVY3F5ZXB6enJlam1ti4met5qhpJ+SkZaXi5qfn557eJ6nkZyKh6WUi5iZeXqMhXyJkYOMgoKCbnx/eHOBhX2LkX1raH2CmImBiI58foaEh32PgZCbm5GIp51/cIuLjJOHoaGKhY18qJGIkJKXk5aTeIyjoKGdlpp/gZCamJKMmqOho5qXkZt+jYV4gIOOh6B/fYyNkHyYpKChk5mQj6aNkIGbkYmTl5t9kpJ+h46BdHOCcHZgfX+NhnKKlXyIjHGMf4KFho5od3F4jJiRj3+WfoeKcoGGfHxxeXuLhHp6kYyDlqWTi4aQfIaGh4V2goSJiHplcnx/eHpxbGpmXn5zaHx1dnR8c4BqXmB0dnB4ZGNZX15Sa2hUZVlfYWhqdniBcWZrZGxoZoCBa25+aG9xa354hnprjIFzgYF+gXR2go2Gfnx6f4F9f49qcoNuc2lih2hsYl9xVnRvbW5geGhtV2p0dmN1e3pyYmtveYmNnrKRpKWdjpCYj4adoZudfHaloY6YgIyiioialnh7hod+g4l/iYKBf3F/e3R2goV+ipF4Z2N9hpeKgoqNeH2AjIN5loGVmJaNlqCbfm+MgpGUhqabh42JhKaVhZOLlpeTkneRnaGhl5SXen6OmJeOlpqdpJ2YkpSbeY+FgneElo2dfoGJjYxzl6OeoZOZjo+ijIyDl5iDkpaZfpiNfIiNgXZxfW56ZIB8ioVwhpJ/kIJsh4KBgImEZXVve4eSl4x8k3iLiXt/hnx7cX53iYV5hJCKi5eilYKEjHeIhIOCd3yCioZ2YHh4fXR+eGdsZGF/aWp3c3R1fXF8YmNhc251c21hWmFeW2xlUmNYYGFpa3Z5hnFiamNtZWl9g2xodWhsb2mAfYF5bZCGcYCDg390fIOMgYB+eoKDfnyQbXaJdHRtZYpsamJjdVaEaXFuYHhnbGJqdnBmeXt5cV9ybIaFj5yul6aono2Nl4eGn5OXmX14qp2KmXqXnYuMmJB5e4GLfXyDe4CDgXh0eXpzfYCEf4mLgGRefYuVh3+Fh3V9fop/fZiEl5SXjKShmH9yh3uUkoqnj4yOipOgkoOSkJSXkYuBj5igmpKQkXN/jZKUiZ2dnqaXl42VlnONjoprhZePmXqHiJCJb5edmqOTlYqNn4yHgpKcf5OSlYaZiHyKiYF6cXlrdWx7fYt+bYWSgpR3cIKDfX6Kf2RyaXuAlpeEfo1zkIiDeId+dniAfYaAfIONhIyUpI95hIJ0iYd9gHR2gYmEbmF7dXpxfW9hb2Nke2Jub3ZzeHdzdGF1X29sdW5vXFtfXl5rXlBdWGNhaG10e4hrX2pmamNpd4huZmxoamxogX17d2+QiHOBg4R9dIGGiXqDfXqBhH19jnJ6i3h4bmyHa2hfaXJih2hyb2Z2Z25sYXlpa317eHBheG2LgJmZqqCjqJ6Ki5KGip6LlZh9d66ZjZd9n5SRlpSId357inx7gHZ3f4BwdHR7b4V9gYCKfnxhXH6QkoaAhIRzeoCGeo+SiJKRnJOlnJWCfoF9jouSpImOio2Ymo2GkZiTlo+KiIySnJOQjI1ug4+PkYmemaKhl5aJlpFuiJmEZoWYjpR6iYWQi3CVmpSikpKJi5qMgn+Rnn2Sj5KLmY57ioSHc3J1a3FudHuLdG6FkI2ScXSAe4GBiHxkcGx4fZmTfYSIdJCKgHOIeW+AfYCGfIWMiYSMlaiMe4h8fouFeH5xcIGGhGNoeXR1cHxiXnBga3RecGp7eXhsc3BleF1tbHNtc1haXl9ia1pQV1hlY2dxcX+HZl1paGdiZ3GObmRpZ2RpaIF6d3VvjoV0gYKDe3WDiYV3hXx4hIV6gIp3f4t7e3J4g2prX3BodIBrcm9tcWdvbGV8Y26AeXZxbHd3in6il6GooKabh4yLgZCch5OcdYGqlZOOh6GNlpOQgHR7doV4eX9yc3uFa3Jwem2KdoCBh25xW1l+ko2IgICAdnWAgICghpCLkp2YoZSYeIp/gY2JnJ6Kj4aSmJaFiZWZj5aLi42NjZ2KjpCDbYmLkJGJnJahnJiVhZeIaYSjgmaFnYqRfouDi4F3k5iRnpGQiYmVjn9+kJh8kY2PjZqSfIqAgm51cGxtb3B7hWlzg46YinB3f3SCiIJ4ZnJvdYGZjnyIhHqUkXl2iHRwiXuFjHqLhoOJjpujiHyEdoKLf3h4b2yBhIJecnNycXB4Wl5wYHBqXm9qfXpwbW1qbHZgcG9qcm1aWGFhYm5YUVRaZmdjdXCEgmJda21kYmZrk25gZmZfZ2uBdXJzcIuAdX+DgHh1gIuAeIV/d4eGd4OFfIaMf3t2in9qcWN8Y4Z8b3FtdGpob2x2eF9xf3l7dHV0gIJ+pJWarZ6mloWMhH+XlIOQn3WLoJSThoubjJWNi3pyeHSCcHKFdHF1iGtvbXVtiHaDfoBtblVRgauVh4J4gHdzgnqCoIKSgpOTmJySmniSe4ONk6Sak46JlZmShIeXmYyUi4mPj4iehJCKfHOLhYmOiJyan5qWlICTf2iFnIdnhaCHkoORg4lxg5GXj5uOj4yMkI14e5KQeo6LjJGWjHyIfIBrdmpua2tsen9hen6OloJ2eoB4g4x8eWdzbHSHlYt+iIZ7k5BxeoRwdox6iYx6iX2CjJCenYV8fHeCjH13cWpsgoN6YHhvbWxydFZeb2JyYF9sbnlwaG9mZnN0aHBrYXdlXVZmYGByU1FOXGZlXXlwiHxfXGhyYmJlZpJqX2hkW2dwfnBrcHSKfXZ8hYB0dX+MeXuGgXiIg3OGhX6MjIR7eZV4ZnJqg2CIfm9va3tgam50f3VfdH14hnh0c4V8eKCPmbCcpY+Cin+DmoiAjJ9/i5qTjoWIl46Oj4R2dHdzgHBvhXRwcYNwaml2boNufXxtdXNSTYLfyJLWk3xwdYN2g5+Ck3eUkZmckJl7lHOFkJ+hk5OQipOblIZ+lpaIjY2IkYyInH+OgHd6jH6Ii4qcnJ2blZN6jXZniZKHbIijhJKHl4OGY4yRmY6VipeMjYqLcXuUiHuOiIqTkYp6hXx+bHtlcm9qa3l5XIB5kI6Ben1+f4aOenpoc2pzio6JgYWFfZWLa35/boCLfouHfIR6go+VmpqKfHZ4g5B5c21ncYCEbWp0b2hqdG5TXm9kcFlfa3J4ZmtqYmZ4cm9wY193YGBWa19ed1BOS2FnY116cYl0XFxldmBhZWWPZGBlYlhpc3Nua3F2jH10eYaBdXZ+i3OAhn97iX5yiYeBkYqIfH6YdmVzbnxlh35vcGt/WmxueXlzYXZ6e412c3eKd3mfi5uvm6CQgoV3iJV+fYqdh4WfkY6FjJeEk46HgXR3cHlxboRvbW5+cmRkeHF9bXl9amhsY6Sawdyu76FzbHWEdoSihZJvlpCVoJWcgZJxhoujl4mOlYqQnZaDgJWQhYmPgJGKiZZ+h3p1f4l4hoSNnJuYmY6Pdop2boaJi32Ko4SRiZ2FhV6Lk5eKj4mOi4uEim18loF9iIWJkY+GdoV9fWt9ZHh1aW54c1iIepKGhnl+gICFi354ZnNqf4mOiYKCgIyWhWuBdm6IkIKPhH6Ben+QlZOZkHRzeIiNdXNxZ3V6g2J0bXBianZnUmBxZ2xVX250eWFyY19ofXBybltjcmBiV25aXHhOTUxkZ2FednOJbVxcZHleYGRmhWBjYl5ZanJrbmtyd4x+dHeEgXh3e4lxg4R9foh7dIuJiJaHjH5+mHNodXF5bIt6bnRxgVdxenZ5cWV3eYaMaXeAiXJ/nIeZp5yjkoR9cIyUeHmLnYSFoY2Ne5aNf5mIhHtyd3Bzam+Ba2ltfHReYHh3e3F1e2dhZXzr2rXJw9yIc2x0gXeKmoiNaZiQj52Wk4GJcYWJoI2Ei5WKjJiUfI2TiIOJj3uQi4WPgn92eIOEcoeCk5uWlJiGjHWHf3CEgomHmKGDlIyfg4lhg5SPh4qGio2HgYdpfZR/fYOEiY6OgnGGfn9xd2h2cmlzd2xajHySgoZ9f4OAhImCdWFza4iBj4qBfn+SkH1tgmx4ho+GkoN8gH2AkZOQlohvcXqMhnVscWxyeYFgdGluXWt2YFJlcmlmU19wdnRgb2BdaIJwcmpXZ2hiaVhtVlx1TUtMZWdeYnJzhWlbXGV5Xl5kZ3tgZF9cWWtuZm9pc3iKfnNzgX56dnqIc4WDfYCHdneKho6YgYyBe5N2bHd1eXiTdG54e31ZeoZxgG9neHeSgmR2hoVxipWFmaGaooqHdG+Ti3J3jpx9ipqJiXyff4OZf4F4cXNub2RyfmlmbHd4W155e3txcYBqYWdhf9W2jpCneG9xd3xxkpCMh2qZjomckoyGe2mIi5qHgZKRhoeYjXyNjYGBiY17j41+iYV6dHuCenCGgJaZjpOUgol1g4Z2g3+Kk5yfhpWPn36IYYCTh4WIhIqOgH+DZ32RgH5/goyPkH5tgnyCdGttdnRzdnVrYo2Bj3+FfnyEfoOHfm9fcnCFe46MgXx+kYh6cINmeYOKhouDfIR+gJSPkJKEbm96jH51bm9rbHt+Y2hralludlpSaXJqYlFicnhsYmVdWmqDbXNhW2dfZGxfblRbcE5IT2dlXGducYBsW1tjc2BcY2x3ZGVdXVpsbGJtanR3hn9xb398fHR4hniFgn2Ah3V5iYGSlnyIhnaJgXB3eXuDk29tfIF3XoN/dIFtaXp0lHNnc4d8cpGRg5qfm6CGiHZ2lX5tdpSXfoiQg4qNmnyLmnZ9dnFvbGphdXxnYml1elpfeHx6bXF/ZWRoZ1edj15xc5e8xYR2cZSJkH5yl4yGnZOMiHRriY+WgXuUi4GEm4x8i4Z9fImMf5SIdYmFdnZ9gXF1hoGelIaVj4ODcX+IdIN7iZicl4aTjp2AiGV9k4KAhoSJiXKBfWd9i3t5f3+HjI99aYB9g3Zmb3h4c3ZzbGqNhYqBin94goCDgn9qXnF4en2MiYV7gY+AfnKBaXiCh4uFhHmDfIGYjI+MfW5se4l9d3RvaWh9d2VdcWNYb3NTU25zaWFOZnR4ZmBdXFhugG5zWWViXWptYHBPWWxSRFRoYVprbm17b1pbXm1jWmJvd2NmXF1ga2pjbGlzdoGDcW5+e390dYN6g4J8gYV2fomBlpF4g4p0gYhyeXl+jZBvb3yBcWmBeXp+bW18dpVraniEdGyTjYWfmKCZhYhufYx2aniYj3+CioKVl4p5j5ZvenNwbGpkYHN6aWBlcntaYHJ8eWdwemFlZY6xsndKYlqk2tCXcnuRi5B4fpWLhZmRjYZvbIaSknp5koaBhJiKfId/eHiJioSWgG+Kh3F0fnppeYWDpZGEk42Df29+g3aDeIWbmJOKkpCUhYdwe5KDfYODiYNvgXhogIV4cn9/g4uHfGV9foN2Y3BzgGh4cG90mIyFgop7dnh/g3mBalxwfXKAh4WIfYaJeohygW5xg4aOhIRzhHiAmYyNhHhubn6Ef3d7ZWhqfXJgWXdaWXFuTlhyc2dgSmx2dGFdW1tZdH1yb1dnXWZqcF9vTldpUj9ZZl9acGtneXFbW1hrZVljcHlfaFxeZWxoZmxpcXd/h29sf32AdXCBeoCBf4J/doGFiZeKcYKNcXuGfHp5hJOMdGp6f2tvfnR/fW9yfHuUb26Af3hnkoqCoZmckoKGZ4eEcGh6lol+f4WCmYqBfI2MaXhya2xmX2FveG1fYm95XGRsg3phcXZfZWXU6r6KMjo+i46AcnmFiI6NdoOXjX6Tjo1/bmyFjYx2fY9/hYKViXyDeG52hoSDl3duiIRrdXt0ZnmCg6eMg4+MhH1uf3R2g3mFm5CLkJGSjIuGfnuSh3iAhI2DbIByaX9+eG18e4GKhHhheYSBcWRxaH5tdHF1gZuLgH+FfnN2fYBygG9bbH50eImCinuGf3yIeHpxbIiDj4OKcoF5f5aLin50bWt2gIB1dl1paXhxWVd8U1pxZUxbcnJlW0pwd29cW1pZXXR+dGhZYltnZW5jaU1XZlE9XmZcXXZlX3RwW1lVb2RZZXB5WmheX2dtZ2psaXB4fY5saYKEf3lugHt9gX+CenWCgYyThXCAi253foB7e4iTiX9oe35qdHtyhntzd31/jHl4hH58a4yMg5udloyBgGyOfmtpf46Ne35/g5SCf32KiGt1cWdoY1tiZ3JvX2Fsc2FocIl6YXN0XmNkm6CPblw1Wa+1dWqAiX2ShnaGl4Z0j4uKd3BthYOHdXmKeIl9k4h6f3Nndoh+fphvcIZ9aHZ5bWV5iIWlh4GHjYp+bn51f4B8i5mHgpOQmIiLhIl8j4lxe32FfGl+bWuAe3pqenaCh4ByYHeBfnFkcmd1gm11e4WUkYF8gX9vd3l8dH5sV29+dnOLgYZ3h3WBiXp4cm6JgI+AhXJ+fX6SiIl6bm5pbYKCdW5daGZ0clJbe05ccVxPXHJwY1ZLc3hqV1lZWmFxgHRgXV1gZ2RoaWZOWmhOQWFkW2B2YVx0bVhYU3RhWmRucldqXmFoa2dtbGlwd3ySa2iEiXx9cH5+e4F/gnp3gICJi4Rye4dvcXeDf3uKjY+Dan57bnd5dop3fXiAgod/g39+em2EjIiYo42Eg3t2jHprbYSJkXl9e4KRgIB+ioNwcnBjZl5ZZ19wcGBgZ3Bmam+KdWF0b1thZGp2e3++nKajyLhxhYRzlH14hpSCdJCNiHJycIR7g3R1h3SId5SIeXlxY3eGeoCTaXKEdWZ3dmNqfIOInoKAf4+PfXJ/c4R4f5GQgniWjZSPh4KIe4mJbHh5fnVoemlrf3lzaXp2gIN9aGB3h31qa3Roe39pdoGLkJR+en5+cHt2e3N+YlV2fHJyiYOCfIJwhol3eHBwg4KMfn15fnx1joWCdWlxaWyIgnJwXmhjc25LZXVMXm9VVFlzbmJQT3N4YVJXWFxhcIJzW2FcaGVkY2pkUFtxSURkYVxkcV5dd2hVV1Z3XlxlbmhWa15hamdlb29pcHd7k25piIx5fnN7fniCgYJ8dn2DiIaDcHaDcm53goN+iYuTf3CAfHh5eoGMdIN4f4GBgoR5gHZvfomLmp6IfYV6d4d8aHSGjZF6f398iYaEdo+AZ29tX2RcWGVZbXJhYGFxbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4cI11e4ePgHqTioB1dHV+d4BwcX9thXSUhnh1bGB6gnmIjmZxg29ndW5bbX2BkJOAgXmSk314e22HdYCQi4NzloqRjoeFhXuAhW11dn9uaHdlbXt2bWp2dn9/fGFieIZ6aHR1Y316Z3WGjoyVe3SAdXGAenxsf1lWc31vdIOGfn94a4iGc3lrdH+Dg316fXh7couAfHJndGVti4NtdFtrX3VlSG5uTFtiV1dWeG1iT1N0dlhQVVheYXGEb1xgY21kY11uYlRdckdDZl9dZmhdWnpjUlZcdVtbZ2thVmpfYG5mZmtxaHB2eI50a46MdX92eH53gYOBe3R+g4iIg29xf3RxdX6GgomNint3f3iEfHyFh3iHfH2BfoWAe35zdnmMjp+NiXqKdnWDeV5+hpqMeYeDdIWGhXeJemJubFtiW1thVmpzY2BbZ25vZ4dyYXFmV11ja398ys6HuaJqbW2KbHGEcXyEin57koV6eXR5dXV7am11Y4R2koJ3cGdefYJ5i4llcYFranFjWGx7hpyJg4Jzl5R3fntuh3GBiYuHcZaOkIiFi4N7eX5xcW99Z2hyYm54cWpscXh9fHpdZXmAd2l1eGaCdmd0h4uNlHxyh2lvfoB4bXxdWHF+bXN/inuBbm6Jf3F2Z3d/gX+BdnxxenSGfHlyZnNhbouCbHNYa193XElva05XVl5UVXtrYU9UdXJRUVRWXmJ0hWhcYGtqZmJZbmFYYnBHQWhdYGZeXVV7Xk9WZHBZW2poXVdnYF9yZmtncmdwc3eGeG6VinR/enh+eYKHgHVzgIaFjoJwcHt3d3V6h4aHjIZ6fH91i359hYSEh39+fn2Hf3x4dXl3kZOff4x9i211gHlkg4iXhnOSim+FhYF6g3RjbmpZX1tdXVRnc2VgWWRycmeBc2JrZVdaYGl/d76ue5+3bmJzhmh0fHJ6g4Z6fYx/eHhzdm97dmVqbmGHdY6Bc2piXn54eYqDZnF9aGprWlZveIqjgYV/cZmTcYB4dYFtgIGQh3KUiIyHg4iFfXl1cm9oeWFqbWBtdmpna2x6d3p3W2d9fHhlcn1uhHRldYWMhpV/b4tma3qDdGx0YlxvfGt0fIt6gWZ0hn1tcWh1fnh9f3J8bHp6gXp3cGVsYm2Jfm1uVmtgd1ZLamtPUk9oTll8aGJOVXVqTFBUVV5mdoNmXWFwaGdgV2ldW2toSkVqWmJkV1lVeVpOV25qWV1sZVxZZWNedGZtZHFmcnB0gHdwmoR2f354f3yFh311c4KIf5WCbnN4enpzc4WHiYiEeIB9do9/fYSJjoSChHt+i4N7d3x3d5qdl3qKg4dpd358bISFlIByj4JxhoJ+gn9vZmxnV11bXFtUZHBlX1hjc3VpdXBkZWNXXFxogHBvcoBziWRleH5pdHZzc4OFeIGEeXd0dW5re3BiaGtnhnSNhG5mXV99b3uJfWhsd2ZpZFVXcnCNp3yEfHaWkHN8c3t5bXt6kIR2l3yHhoKGg311cHJtZ3VdbWhfbHVkZ2Zpem97cllngXd0Z3CAeIJ1YneFinyUgG6Lam16gHBlcmVgbHlmcnaJe31hdYN2aWtxdHpweXhyfWZ+f394dm5jZWFthnxta1ZrY3FTTGlrUExOcEdee2ZhTVV0Y0pOU1dgand9ZV1nc2llX1ZjV2FwXUxLa1hjYVVUVXNXTVh1ZFpfa2BcWmNlX3dmbWJwaXNvcn50dJmBd3+AeH9+hoR6fXaChH6YhW5ydHt6dHGFhY+CgHqLdXSRf32BlI6AhYR8foyGen6AdnujpYp5iIaFbHV8e3WEgox6boVzeoV9gYN1bmpoZVZdW1taU2JuZVtYYXR7amhtaF9iV19baYBqa2+AZ2xhaHl5a3R0dG+FgXp/fXZ1bnpoanlqX2VuaIF3j4RnZVhid2l+hnpvaW9mZl1VWG9oj6d2gXp8kI55dW9+b3J1eY5/d5R0hYJ/hYh1anJ2Z2hvXG1lXm1zX2dhanhoe21bbYNzc2lvgH55d2F3hIR4j4RziHFveX9xYnBoW252ZHBziHt4YXKAcGdqeHNxa3d2dHdjg3t+d3ZwZGNjbnx9a2tVamNnU0tsaFBHUmxFYXhlYU1Tcl1KTVRZZWt3emVebXBpZF1WX1VubldLU2hYZl5YTVVsVUtceV9bX2tdXVtiZWB6aGxhb291bm93dXqXfXeAgXqAf4eGenl6g36Bk4RxdHR+end0hYiQfYB9kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ9/eoiHhGxygnp2gYCBdW6Hb3yAc4mAam9tZGRYX1paWlViamdbWl91gmlebWxcYVZcXGuBZnJ0fWlqXWt2dmh0d3Juhnt+fXl2cm16aGl3Zl1kcmd6d5KBY2NUZW9mgoR3dmZoaWBXVlloZJCnbn54gIuOenBwfGZ4bnmLenaOcYN9fn+GbmR2c2RoaF1sYl1vb1tnX211ZXpoXXSAb3JrcXt+dXVidIWKeoeGgH93cnV+dGFwbFlwcmJxcYR7dWRygGxhbHpvamh5d3RyZoV1enp1cWRhZG5zfmpsVGlfXlRMc2NRR1diR2J2ZWBLVHBYSkxYWGdrdnpkZW5wZmNaWF1YdmVUSlxjWGhYWUlXZVFIYnhaXV9sW15cYmRegGlqX290eW1vbnaDl3lygYB9f4iLhn12doZ4h4x9c3V1gXl6eoKMjn1+hIlqdJaBe4qdfX6FeYB6fnyGiHNxj66Me3uGkH5mcoh6dH19dnJvhmx7fmyPemJwb2FlXmVWWVlXY2ZrYF1dc4ZpWHBtW19XW1xse2Nwd3ZsYlttc3RndXZxbYV5f4B5d25vdGVpdGVbZ3RmdnaRel9dUmZmaoKBdH1hY2lcVFheYmOQpWh5dIKFkHhtbnlnd217hHp0iHKAeHx4f2hldm1gZmFfamBddGtZZV1vb2J6ZVt3fGtubnB4eHR0ZHKDkn6Hgoh6dm9xfXJhd2Rabm9hcHGBfHNlcYBkXm52aWNmeXp0bW6BdXN9c3FiXmZub31laVRpWVlUTnhfUkpaWUhidGNgSVRtVElMWlZpbHJ7Ymxsc2JhWVpbYXZbU0tkXVhpU1dIWWBOR2l1WF5hbVtbX2JjXYVpaGFueHlsb2t2gZB4bYN+gIGSiISBdnWJdIyGc3F2doF3fH1+jI+AfpN+cHiWg32ZknmAgHh5fn9ziINzcJmie3p/iZV5ZHWIeXN4dmx0b35seXxwkXJecG5gZ2JsVFpaV2hjbWVcXHKJZlJybVtaWFhgbHZkaXVqal5abXNxbHR0dGuGfH6AfHdvbmxkaXFjW2tyZHR2j3NbV1RkYHJ/fnKCXGFjXVNaYFxkk59lcnGFhJF0bGp5bG9vent7cYB2f3J6enpkZXVnXmJbYWhcXndoV2Jdb2hhd2FbfHZqaXJvd3RzdGhwgZSChn6EdnJqcHtsZnZXXGptYnBygHpzZW9+W2BwcWJeaXB8bGx0fnJxeGtwYFxlbG17YWdUZ1VXUlB2W1NQWlJIY3NiYEdWa1FJUFpVa2trfGVtb3FgW1pYWWxwV1JQZldXaFNURlpcT0hydVhfY21jWGFgYV6MamNkbXl4a29pdXmGe2uDfYCFmXyChHl9iG6PhnFvd3p8dIKCfIuPg4KWdHiClIWBn4l1gYCBdH+CcIeCdW+il3R7houHe2Z4i29ue29meHB6bHN2c41rXnRuYWdla1NdW1VnYmxsW1xxjGROb21cVlhVZ2l0aGJ0ZWVdWm51bnB1dXpsh3x/fIh3kHNjZWtvYVxubWNzeIdrWlRWY2N3fHxwhVxjX2NUW2BaY5aVY25wg4WKc2poem5lcnZze2t5dHVven51X2ZyY1teV2JkWWF1ZlVfYG1kYXFdXX5waGlzcXNwdXVrbYSTgYh7hXFyZm58b3FuU1plamVxc4B2c2JsdlVicWtbXm5lfGVsdXxycnJqbWBZZGpqeF5mVGVVVlBVblhRV1RQSGVyX2FGV2pPSFhUVm1pZHxpa3drYVdcVVt0Y1NSV2lRWWZUU0haW1BOeHdbX2ZsaVpiYF5ej25iZmt5dW5vaXZ2f35tg4B+h5d7f4eBin9rk4hyZ3SAe3WAg32Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9gnVupYxzgY2Md3hue41gZHxxZnpzeWxtcXaDZ2R8bGNmZ2hTX19UZ2Bsb1xebo5oTWlsYFVWU29mc2tleGRlXVlwdG1ye3hzbYh7gHece3psYWVsbV5gbmplcHl+Z1pWWGBreHt7b4NeYl5nVllgWGSciGJrcYGHfXdrandsW3Zxa3lpdXJtb3uAclhqbV9ZXVZiZFhlcWNUXmFpYmJsWmB+bGZrc3VubXd2a2iFjH+IeodtcWVve2xxbGJYX2hob3OAdHNeaW1TZXBlVWJuYXlicHV7dWtvbGpfWGFnaHVdZVZiVlNOWWZTT11PT0hlb11jR1lpTUlfS1htZF94aG59ZGBVXlRddFtUUmBmTl1hVFNKXFpRWnV1XV9mbWhYYmFbXo5xY2dqd3Fzbmh2c3mDc4KDe4iNfnyKh456bpCKdGxzgnR/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6NjY2NjY2Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjYyNjY2Oj4+Pjo6OjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENERERERUIxLzAwMDAuXHBubW5ucUksMDAvLyxJhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiGgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU1Mx4cHBwdHRtTamdnZ2drPBgcHB0dGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJh4iIiIiGjZCQkJCQkIyHh4iHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYaFg4ODhISEhIiKioqKiYmGgoKCgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpKSkYmHjoqQkpOQipCNjo6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo6Ojo6Pj4+Pjo2NjY2NjY2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIyIiIiJjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkY2IjYmQiYuQj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCPh42MiY+GjY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn9+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIyEi4yJjYaPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYiLjoyNi46Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3t8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6ent7fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9fHx9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3x9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOkI+NioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSVlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5SSk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpKSkZKSg5CTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKSkpKSi4qSko16kZKSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkZKId5GShHePkZGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4tuipF6dYyQj4+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+PimiAj3Z1iY+Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2JaXeMdXWGjY2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4BobYFxc4GFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV1dnd1aGBnYGRpbmdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGZfa2xgamhpZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdnl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXGN0bWVxcGVdWllfW1hXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01SaHBsYXB1a1RQUVRQUE5OT01LTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTlRmbG5jb3NyV05OTk9QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQkVJTWFoa3Fxb25ZTE5SVlBPT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQUtPR0hOYWhmcG9raGNeY2hXSEhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4+QFReWV1obWlubWxqamxsVkZCREVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozw8RVlmaWtvam1tamprbFdCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7PE5pbm9rbWxpaWxVQD9DRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo4N0lpb21wbmtrVzw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT09PEpncndzbFw/PT0+P0BBQD8/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV0dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtdbkA+REU/PkdbeXJUQDw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O212SDg7Oj0+QD1nXDk8PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVE8PT1JTEVGdnZNNzg4Ojw/P1NVOTs9PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3l8d1Y8PT89Pj9CVVs6Oz0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KChIOCg4B9XT5AQ0BAPz5aYz47PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hXVMQUNFQD8/UHJ2TD9DRUlKSUlNTUtFREZHSEZHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQUVlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFcUJERURDV3WHiIh/WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn59fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SKbEFBVXSHiYeHh4iDV0hMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEhHSEZGRkhKSUlJSUhdb29xcnR2d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVWyFh4aGhoeIiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA9PkBBQUBCRD8+P0RGSERFR0lKSUlISElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVYGDhISCgoWGhoOChoWEhYaGhoeIhop1SUlGQj8/QD8/Pjw8PD46OjxBQUA+PDk5ODw8PTs+Ozk6P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTExTbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/gH5RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4SEhYWGh4iIiImJjI5mQkI+ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqLjIuKiYqLjIlUOjg2NTY3NjY2NDY3NjM1Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCBg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njo5NzY2NzY1Ojk6Ozo7ODk4OTg3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3eXt6e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISEhomKioiHiIiJioqMiomJjHo+OTg4Ozw9Pjk6Ozs4OTs5Ojs6OTk7Ojk9PT0+Ozs8PTo+Ozk7Ozw7PDw5OTw4Ojo7Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3V0dnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4B/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5BQ0VFQUFBQj5AQkBAPj09PkA/Pz9AP0A9PT9CP0FBP0FAPUBAQD4/QT0+PDs6Ozk5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uKiouKi14+Q0dJS0pJRkdHREZIR0VCQEBDRUNCQUJDQj9AREhEQ0VERUVCRkVGREVGREBCPzxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcXR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERliFgoOEhYWGhoeJiYiHhoaGh4mJiouMjYyMi4qKiFdHTE1NS05JSUtJSUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQEFDQkRDQ0REQ0A9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf39/gICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JCR0dJWYWCg4WFhoeIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNT05MTktKTEpJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAOTg8Ozs9Oj9APj9AQ0ZJSVBfgoOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNck5RT05MTEtMSkhHRUpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhISEhYWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLX1JSUE1OTUtKR0ZCR0pHTEpGS05LSkpKTU1MT1BOSElLTE9RUVBRT09KSEpKTUpMRkdIR0ZHSEZFRUJBQkJcb3J3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418WFZSUlRST0xLSkRFRktPTk9XVVFQT1FTUk1TVE9NUkxQU1VWUlNRUExKTU1NS05HR0pGRklKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0hHR0hGPkBCPT89PUI/Q0NGVk5GTk9QVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toV1ZrYUVSUVFQSTs7UVNSYHVdVVZUVllZUllYUlpmUFVXWl1SVFdRUE5SUVBQUUtMS0hISkhFRklJSUhJaXJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSUdGRkU/P0FBRUJDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXV1WXVpWRVFZWltZX1RaZ1JWVlhVVFZUT09NSkxLSUlMTUtPTVNvc3Z4eXh3enl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot5bnBYWltaUlRSVlZUWlp1g1lVfZBgXFhdX1dJVl1dW1tfWUlZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p/ZllZXFlTVVRXUlFXVmOWgFFlclhaV19nUGBmW1tYXGdhR09aaGdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5W11UWVVWXVpMVFpUU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHFzdnZ0dHZ4eXl7e3x9fX1+f319fX59fX5/f3+AgH9/f4B+fnt4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiYeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5UY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxtcnV2dXR0d3t6ent7fXt9fX1+fX19fn1+f39/f39/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hDREhHSEtHREJBREFPUU1TZHN0dnVzdHZ6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09PTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYJsTUc+Pzs7PkBAPz8+alFLYUVGSElFQj9HTE1HTVFVSUJFPz88PTw9PT89P0FDQ0A/PD1CPkpNR1VudXV1c3R2eHp8e318fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFVUV1FRV1VQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTFdNSEdAQTw5Nzc1OTk9Ozs7ODk4OT87Qkg/XHN0dXZ1dnh6fHx8fXx8fX19fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGRkhCQUdJRUVGRE1ST2FXUldRUFNTUlVbT09RV1BNSURGPjo5NjU4Nzk3OTozNjY3OTU8Qj1lc3R2eHd5ent9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhSTFhZWlZYWFZYWV1XWFhoc2tdVmFza2FhX15kYV9eWVVRTU9OTElISktJSEZDUVBTW1dUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODU3NTc4NTk5R21xdHh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09UVlhYWVNWVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxQUlJPTU1OTk5MSkZRUFVZU1ROSk9PVVNUXFZSVVNST01MSUhIRj8+PTo3ODc2NTk5Njc2NzVXcHBzd3l6e3x9fX19fH19fH19fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI9WE1JQVE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEtPUVBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I0NTY2OmRvcXV3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZGQUZHR0hGSkRISkhHRUhMSEtJRkxNUE1HL0VfUj4zQD5qb2FSUlFARlVRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz09PDk9RzY2NzdEbXB0dnl7e3x8fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XV1ZZWVZRUVFPQD47PT9BQkFDQEJFREFAR0hHSEZGSEpNS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnV5e3t7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9PTVFTTFRWVFdXVUxMS0k9OTg3Oz9APjw9QUBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hQUmJcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0lKTExKRkZGRT9CQz48QkY/Qj9BZHB0d3t6e3t8e3p6d3x3eX1+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz9CQEA+QURJRUNIR0lGSUVCQj8+PUNCQUdKRU1PYmVRTU5OV0tMTUtMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p7end0eHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QEJCQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVDS05RVExKSU1UR0lJSkxKS0xJSkxNT1BSUEtHQ0xHQ0JKSkxNT01JSklHQ0NDREhKTUxJWXJtd3l4ent7eXx2cnB1cnR5eXZ4anFua2xsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEpDR0hIR0pLSUpLREdCPT49Ojo6O0BCPz1CQkJDSEZKTEpESUlGR0dDQztBQEI+QEBDRENJTVBHSUtHSEtESElLTUhKTEhJSktKTV1SSEhETkZBQ0tLTU1QTktNSktGR0dKTU5RTkxibWl2dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0RGRUdFRkZHRUdCQ0A9PD05Ojo6QENAPkJDREVJRkpKTEZISUdGRkRCO0JDQz5ARERDRUdMTkhLTkhESEVJTE5NSElMR0ZHSUlMTktKSEVOSUJGTUxPTU9NTk5NS0lISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmZrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKQ0VGRUJDQkVAREI+QD86Ozs9Oj0+Q0E+QUNFR0pGSUhLSEdHR0ZFQ0A9RUVCPkJEQ0NFR0hJR01QSkZGR0tOT0tGSElGRURFSUpIS0lHSFBLRElNTFBNT05PT05LSkhNUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhERUdDQkBCRD1CQT5APTo6PT87Pj5AQj5BQkRHS0ZJRklIRkZHRUNDQUFGRkNCQ0JERUVHR0hGTFFMSU9KSkxMSUdIRUZFRENJSUhLSkdLUk1CTk9NUE9PT05PT0tLS09VV1ZVVFhfXlxpYW1pbmhyc2JlZmVkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0dGSEJCQERFPEFAQEM8ODk9Pjk/PD9CQEBAREZIRUhGRkhHRUVEQ0VDRElGQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSElGQ0lKSUtNS1BTTkRRUlBRUk5PTU5QTUxNU1dWV1hWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlvek1IR0hIQkJCRkU8QEJCRDw3Oj49Oj46QEI+Pz9DRUZERkRESEZERUNERUVHSkVFSkdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTE9PUlRPSVNVU1FTUFFNTlFOTVBXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2lpaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdW5wcnN5TklJR0lEQUNIRTxARUJFPTg6Pj49PDxBQj0/PkFCRkNFQkNIRUNFRUZHR0dJRkhLSENJSEdJSEZESEtJR0tITUxKS0xITEtNS0pOTE9OUFJVVk9LVVdUUVRRUkxPUVBPVFlaWlxaWVxeXl5gY15cYWNrYmBkZ2hyhWhnamZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHVNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JCPEA+QUFGQ0VERElFRkVHRUhIRkhHSUtKRkpISEtIRkZMSEhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvdkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAREE/Qj9BQ0hCRkVGSEZJRkZESUhHSUhKTUhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUEtPUFJVWFZNTlRWVFNSUVBMTlRTUldbXl5fXV1gX2BhYV9hY2ViY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93S01MTE1HQ0NBRDw/RUVFQz1BQUNCQkNFQUJEQUFFR0NHSEdHRkpHQ0dKR0dKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJCRUdDQ0lGQ0hKSklJS0dES0pHSEpJSUtISkpOTE5MSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1JQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSktKRkI/QEI/PURFRkRDQ0JFRURGQkVGSENESkVFSkxNS0xMR0dNSUdJS0hLS0lLSk5MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW14bWt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFREBBQj8+QkZHQkZDRURFRURDSEhHREVLR0dMTU5LTU1HSk5ISktKSUxLSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3BwamlvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPUBARkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTUlMS0lKTUlKSkpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lERUVDQUI8QkBCRkRHRkxIRUNDSEtISEZKTExGTktMU1JMR0xMSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQD5DREJHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1MSUtLS1NrYlppXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG9qaWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkZISEtNSUhKSUtLSUhJR0tLTExGSEtLTExMS0lLTE5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZXJpVFlXXFtcVVlaXVhdXFxjZmFhZWJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DSERGR0RJS0xIRkRHS0xIREdIUEtMT0tMV0xJRkVISUpISUtJTEpIRkdHSUdISUVGTElKS05MSU9cV15QXFtgXk9YWVNcXGJeTVlaTVhhUkpZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkVJRUdHRktKS0hFRUpKSkdFSEhQSk1NSk1TSUhGQUhGSklLTElMSkhGRUlHREZHRUVKSENKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl5cXlNbXmNeWl1gY2BZX2JbYF5bVFhXWV5dY2JjYWNmaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDR0dFSEdIS0lJSURGS0tLRkZJSk5LTkxITE5ISEY+R0dMSUtMSktLSUdFSURDRERCR0pEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFeXmNhYGJiYmNjZVpRWVZVXFpdY2BfX2NlYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUhJRkdISEZGSkdIRkhLSUxEREtKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdHQ0RAREFISUI/SUpIT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlOXlFPXF9hY2RjY2JcZGNiZGNmWFFVVFJbWFphX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNFS0pGRkZIR0dJRkZGSUxKTkVES0pMTkpMSUtKSElGQkhIUU1LS09NS0tJSEdFRD9FQ0lIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVllgUlFfX2FiYWBiYmBjYmFkZGJYT1FRUVtTW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUdGREdNUkhDUUpGSEhIRUZLSk1QRUdJSktOTExJTEtJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUdFQ1dVRVxUXlNWX1hOVFVOWltNSktUYGFbX1heXmFdT1liXGBgX2JjYl1hYldfX1RQTk9QWFJdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUENWXklHR0hERk1KUFBFSUlLS05MS0tNTEpKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENBRUZCTUhCS0xQT05MRk1GR0lKSEdMTE1PUElMT1BPU1BMUVNSVVpZV1lYWGRXT1NUUFBOTU9VVFtZWVtdXGBhZGVjZ2NrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTUdISkhHTUxRUUlMS0xLTk5VTk9LS0xHR0tQVFNOUE9OT05PSEtGYEVEX0xEZmNFTVtJXltybU9NVW1ZTENQYFVsV2dKXVdVXkRMUVVMTVRWUVJUWFdUWFVUXFVQZlpoaGRYU2tTVlZVW1xbYGBhYWFiYGZoZm5saHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPU0lLRmBUSEpPSklPTVJRS01MTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlF/UUl8WVlyc1hQbUhxbm9hVlBxcXNQQ2tzbXF0cFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVVd/anR1dV9fdl9YYVxcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTkJETExGSkxGUlZMS05JS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFlSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1menV4cXF6cX5zfWt1fWJSZ3xlc3Nvc3J7fG99eW9/cl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhLS0hKUE5NTUpOVl5ZVUxRU05ZWk1TU1JOTE9JUVJUWVdXUFRQUFBRS0hneGxjeHJtWktNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUml7bGlqenp9bHh6f3Bob1h2dmp1dXCAYHJnfWlseHxvXl9fYmFbXWJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNCRVBQSEpLSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRLaHh9eGB5e3NuYV5tb2NSZ3F1bm15cHdsdnR0cWxtXHR+emtteXxrdG18a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBJTE1LTFFRUVBQUVdcWVVNVVlVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhlfGlyfF1US2xgdnVraXZ8e21+eGt8cF1eXmJbX2JkZGdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsZ21tcnxrbWhre3RtbWttT0hKS0hJSUhRUExOT0xLU1NTT1NSV1JWVFBXW1ZWVFRUYWBQTk5LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VSU1dbV1hXWk9TVVdXWFJdWVddVlRPWVJXV1dYWV5bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZWFBPTE1WVFFOVVNOT01MUVBLSlJSS1FNS0tPUlVSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NQUVVWVlNaUU9TUldWVFlWVFlVVFJVVFRUV1hXXVpeYV1cWlpcXGBjXF1iY2RmZGVkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhUUVBLT1dTUE5VUE5RTktTUE1PVlROUU5NTlFUUFVRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUT1RVWFVVWlVXWVVSUlhWVVdbWVpfXVVZXlxeXVxdYGFeW2JiY2dmZGRiWF9hYl5gaGVmZGFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RWllYV1haWlhZVlxqZFZYWVpXVlRUUEtPVlRQT1RQUFBOTVFRUFJYVFFRT01PU1ZOV1JUVVVPTk1RU1VVVFRSVFhWWl1cWlZXUVJXWFZbW1dRVFZWVlZZVFdYVVNSWFZVWl1ZXV9eVl5dXmBcXGBfX19aYmJkaGdkZGFZYmBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTE1WU01OUk9RUk9MUFNSVVpVU1BQTFBXVlJXU1NTWE1PUFJUWFVVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaV1ZcXlpeX2BVYVxhYV1gYmBdYF1jYWNnaGRmYFljYGFfX2VkX2BjW1pcW1xZWlhZV1xZXFtgXl9bXl5hYF9iXFlgWlFOT05WUVBUUk9VVFNQV1xdXFheXF9XXF5qcXd5gGNcW1ZWWVFOT1ZTTlFRUFJUUktRVFRZWldVT1JOU1hXVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFVWXFxWUlRWVlhZU1RZXFRTU11YWl1eXGBgYFZiW2NiXmFjX11iYWJfZGZpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUVdSVFBbXV5eW2BcYFVcXWlqcn1zbGdcVVhXUU9SWlNSUVRSVFVUS1FXVltaWlNPU1JWVlZUT1ZSU1pSVFVUWF1XWFhTWFxYXl1ZWl1UVU5WV1dfW1hSVVVZWVlVV1lbVFNWXlldXWBdYmJeWWBbZWJfZGRfXmNjYV1lZmlkZl1eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBaVFVWVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWVVRUVNcVFVUVVRWWVdMUlpXXVpcUk9VU1hWVlRQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlRVVlpZWldYWVxWVFpeXF5gYV9kY1xeXV1lYWJmZF5fZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXV9UXV9iZWV2gntoWFlZU1ZTVlxXV1dWVlddWFBVXVpeXV1UU1hTV1ZUU1RYUlNWVFhYWF1eWF1bVl1fWF9fWF1WUVlUWVpaYVlcVVZYW1pbWVlaWlhWXV5fXmNiYWRkXGJcYGZhZGZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lXVlxgYWJjYWNeX1ZbYGRhX3p1b2hZXFpVV1VXW1pZXFlYWWBXUFZeXGBhXFRVWFBVV1VTV1ZSU1VXWlpcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1laWVleX2BgZGJjZWViZFpiZmNnZmVeYWJgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJga2ZoXlxdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZZUVdWV1ZXVlRWVFhdXF5gYF1hXFdhXlteXFteWFZYWFtbX2BcX1hZXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYGBlY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5SV1lWV1pYW1xYV1leYGJhZWFkYV1eWWJjYl9hYGFeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQWFdYWVlXVlhWXV1eYGFgX2JeWWFdXV5ZXV5ZWFZXW1xgXl1fWlpeXV5eYVxbW1pcYGJeYmRjZWZlZmJaZGZnaWdjX2NeYWZkWmlpYmZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFdXXFlXXFtcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl1bXFtYV1tcX11gX11bYGRcXFhaY2VjYFJcWU9YWFpbWlpXWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX19cWl5eYGJjXFxXXF5gYmJjZWRnZWVmZFxlZmhpZmNiYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYUFhaXWFjZmZya39KWVddW1pfXFteXFhdW15fYWNiYWFdYltiZGJgY2NiXFtbWldYaXFgXGBfXVxhY19eWVlkZWRhU19aUVlYXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl5fWlhWW19eXWFhX11bYGFiZWJfXVRcYGBjZGRmZGdmZWZlXmVmaGhnZGRgW2ZnXmFoaGNoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3x7enp6enp6e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiYmMjY2NjY2LsMG+vr6+waKKjIyMjI2Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMjY+QkJCQkI67zsvLzMzPqo2QkJCQkot/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHl4eHh4d3d3d3d3d3h5eXl5eXp3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9fX19fX18fICDgoKCgoKAfH19fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnV1eXZ2dnp7eHt4d3Z4e3h5eXp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7enp6enp5eXl5enp8e3x8fHt8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8e3t7eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3l8ent4e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHl5e3d8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp/e3l7eXx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXx7eXl5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgoGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4OEhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRfdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB3fHt7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnV9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycnFwb3BxcXFzdHNzc3JxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKCgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeG9wcHJycnJxcXBwcXFxcnJzc3NzcXFycG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5ubm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNycnJxhXNvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcXJyentxcXiWcW9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcnB+lnFvg5xyb3BwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcHake26Qn3ZvcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFwdqqIb5mhem9xcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnB2q5VxnaJ9cHJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3NzdHqronueon1ydHNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh4eHh4lLKlpKunfnt7eXp5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX59fHx8fX+mpqKypKiLent7enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX1+hqico6uanpt+f39/fHx9gIOCgIB/fX19fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYGNo5OgrZ+hn4R/gIGAfn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/f4GBgIqejJSunJabh31+fX5/f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn+Dg4B+iKWimZ+blpyUg4WJjYV/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpKQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBhIuQlpikrqaim52gp6mhoaCSgX+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGChJSpsLCknaKdnp+hoqOfkoKDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KAgpSfn52ZoZ2doJ+dnZOHh4eHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgo2UlZefnZ6hnpuViIeJiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhISEhIiTlp2Xmp6ckoSDhYWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOCgoKCgouVl4uRnJaEgYKAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOBf4CAf4eSio+ShYGDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4qWiISChIKBfoKJjIKCgoKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgIqOgIKCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhISDg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCPjIOBf359fH2MnI2AgoGCgoOAj5OBgoKCgoODgYGBgoOFg4ODg4ODhISCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GXjICDgYGBgYKZmYSBgoGCgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2Kh4ODg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeKfoSEg4SCg4ODhY2NhYKCg4OCg4ODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJOSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYWFgoB+fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIaGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIuIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYKBgX59gYeGhIB+fn9/f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhoaFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoWFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYJ/f39/f39/foCAhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeGh4aGhoaHhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgYB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEhIGAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGh4WEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQjIeGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoiIioqJiYmIiYmJiYqLioiIiImJi4uKioiHh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5COkI6KhoSGhYOBgYKBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgIGEhIKCgoKCgoKAf359fX19fn18e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomKiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KDg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn1+fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4SEgoGBgYGBg4OEg4ORkpCOj46Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4mLioaEhoSChoaCgoSEg4ODg4KCgX59fX+Afn5+fn18fX18eXyDhoaHhIOBg4OEhYWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKCgYKCg4OFg4SEhYSEhoSEhIWDgoOBgoODhIWEh5KRj42PjIqFhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Bg4ODg4OCgn99fn+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICCg4KAgICBgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn5+f4KDg4KDg4OCfX1+f4CAgYB+fX19fX59fHp6en+CgoF/f39/fn9/gH59gH9/gICBf4CAgX9/f4CBfn19f4CBgH9+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+f4B/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAgH9/f35+fX5/fn+Af35/f4B/gYB/fn5+f39+fXx+f4B/fn5/f4B/f39/gIB/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGChISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gYGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4B/f39+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9/gIB/foB/f35+fn9/fn5+fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYGAgYGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/gH+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enl5eXl5gIKCgoSDgYKCgX+BgIGBgYOCgoOBgYKAgYB/gIGDgYSCgICBgIGBgICBf4KCf4GAgX+Af3+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoOCgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHiIeHh4Z/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g4yEg4SEhJeXg4OEgX1+gYKCgYGBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KEg4KDg4KCgoKDgoKCkpCLiImHiYeGhoSGhYWEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHiIiGhoeHh4aHhX99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eX2BgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgICAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfn1+fnuIkXx8jpaAfX5/goaKhYODhIKBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH18fn+DhHx8gYKEgoB/h4N9g4F/goKBg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OEhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXx+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHyAf4KAgoB+fXuKgn2Af36BgICBgoGCgICBgYB/i5SQjIuOjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f3+AfHqBgXh7gIKBg4WEg4WFhoeEhYCGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyCgIF+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foGUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgICAgIB/f399e3p9gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDg4CBgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn9+jISBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+gH5/foSSjYyMj42LioaEhoSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX58e3x8fHt7en1/gICEg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjIyNi4qIhISEg4SEg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXt8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoGCgYWGhYaGhoeFgYSRj42KiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn5+fHx8fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHp7fHt7fXp9fn5/gICDh4mJiYqJiomFiJGOjIiJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59gICAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX18fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeHi4uLiomMkY+NioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgoJ/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eHl7fn+Dg4SHiYqHiY6QjYuJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99fYB+fH9/iYN/foOQhISDgX9+fXyNh319fn19fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo6KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChYWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCCgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgYCAgIOBf4CBhIF+foB/fn6Afn1+foCBf4F+f4B/fn+Af31/f39/f4B+f3+Afnx9fHx+fn5+gX+AfYKAfH2AgH17fX19fHx8fHx7e3t8e3x8fH18ioqIiIWGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGChIODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgYCAgH9+fH19fX1+fn2CfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH2Jh4eFhYeFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+fn9/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeDhISFhISDhYOBgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXl4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEg4GAf4B/gIF+fX1+gH5+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn59fX9+foWFgYGAf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChYCDgoKCg4KDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgICAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgICAgYGBgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f35/gH1/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWBhISFhISEgYOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnd2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBfn58fn9+fn+Bgn+BgYKDh4WBf39+foCAgYGAgICAgYKBgIB+gIJ/foGCg4GBg4KDg4WDf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICAf3+BgoCAf32AgX5/gIKCgIGDgoSFhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV4eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAgICAgHuAfoCAf4GAgH99gX9+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4ODg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhoWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gICAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH99fX6Agn9+gIB/foKEgoKDhYWCgn59fXt7fHx6d3x5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAfoB/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgYSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoOFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYGBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoKBgoOAf4KBhIODhIGBg4GCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgoCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICDg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBf4GAgIKBgoGBgoKAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoOFhoSCg4ODhIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB8gIF/fHx9enp8foB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WChoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhYSBg4SFg4SGhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoKCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISEhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhYSEhYeGhISFhoWFfXeGg4SEgoGBfX9+e3x7fnt8fH1/fn18fn6BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KDhIOEgX6AgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOCgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoODgoKCf4B7fX59fHx8fn18fX18fnt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GDgoGEhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGh4SDhIWCgYKBgISDg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3t7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhIGBg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaGhoWDhIOGgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIWFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fXyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9fn+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3p6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fXx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX1dXV1dXV1dXV1dXV1dXW19fX19fX19fW1tbW1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4utHU1NTU1NTU1NTU1NTVybu9vb29vb29vb29vb60ioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM+OD46Pz9BPT9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjoqfP09LS0tLS0tLS0tLS1L+oqqqqqqqqqqqqqqqsm1NSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKOoz9PS0tLS0tLS0tLS0tTBqaurq6urq6urq6urrp1YV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamprM/T0tLS0tLS0tPT09PVwq2vr6+vr6+vr6+vr7GhYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLU1dXV1dXV1dXU09PT1NPS0tLS0tLS0tLS0tPT0c3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7T1NDP0NTSz8/P09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1NTU1NTU1tXW1tbW1tbW1tbX1tbY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7QppLF08iUp9LRx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Sqp2slMmarJyw0ZmsmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/QyZeZhaanl4icnsSShp2czs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOTY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9GksL2XosDJmJjFvMmXmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0NW5mKbWlJafztGSmaDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9DRmp27s5/Dm9qto7+e1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDVp6Sg082Kkp7Hy4iVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDSwJ2iyNXN26WZs9Dbo5m11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT1KSgj7jIj6eaoK2Qp5ieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyMamvZWUjKelqKCvp6KpndDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNTKjpOXkKihko261ZqSjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS1MKvsLPS1LnH1dPTucjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHU1tbW0tLV1NPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6iop6iop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampaOjoqKioqGgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnp2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqamp6emn5uam6KgmpaWlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhn5eSk5KXmpyal5eXmJuamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyfoZ+XkZGQlJeanZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGgmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWkpKOioaGenJuVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6OkpKSioaGem5qZmJmZmJmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaGhn56cm5uam5ucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoZ+fn56cmZminZubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgn6Cfn6CgoKCem5mcsZ6am5ybm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6enZydpKKfnJqZo6yenJycnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cmpqbm6mjm5qanKOLnp2dnZydnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiZm5qmopqZm56XdJ6cnZ6cnZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJycmJiZmZqZo56ZmZuhjmSbnZ2fnp6dnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mZmZiYmKGal5qco4JcmKCdnp6en5+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJiilZSbnKN4WpCinZ2enp+gn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXopGOnZuhcVuFpZ6enJubnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampaMkp2OiJmVnG9idp6WlZKRjZKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2QkI+LkY+LjI+QkJGOioiWjX6Lio50aGmLiIyFh4GNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJh4SBhoKAgomVkIl6in+FdmpkgoCHfYCBkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoF9f3N8jYyEeouEhXNqYIaKeX18ho2Ni4aNlJKLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLhoiGhIiIioR/gn96e4aHfneHgIJvZ1uCi4KEhYqPi42RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjYuLh5KKh4aWiHZsgYV+aGNYf46Oio2JiZCPjo+UlJiQlZyanZ6orrKvsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ2gnZOXmqGanZyioZWPoYtzbH6YiGVgWYGRkY6RjouYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqamnoqWoqayqqa+gnaaRfHuLnZpyYl+Hl5SXn5+hpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurquqrKShoqWpp6eoqKmcjXh7lo6WeHBtk52XnqGhqKegoqKuq6uqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mopKemmZ2kpqKhoKSminpmYY2DhWNwc4udlp+amaKioKCfoKGooJyeoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXVxQVU9YT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraemnJ2mnHpmVk5+e3lOX2p4mpucmZufnqCfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9bVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqusbOuq6KhrJJrUUpJd3RvRVFha5CjnZ2fnZ6koqKhoKKYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NtamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Ciqqqnr7e2tbW2s66rr6uCXEhDR3JpZkNGWGZ+n5qcm5aip6WnqZ+jm56hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKqyuL29vLu6v7SusbyecVBXTURvYV9IRE9gb5WWk5qWo6uotq2io6SrpqWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZscGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1trzByMC7vca6ubi8jWFZjnJDbGBfTlJXWmaRn5aipKinoLqmqqu1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDw7m9w9TWx8DCvLu6uohWe8KqTm5uZ1FbZF1ciKyop6yii5S1pqu0vLC1tqivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1dm5tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMLV4NrKtby8wMCSUIvAv2F9gnldSmlwU3qzuKicgm+WsKOmsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx+hH9pZmhha2xnbnVxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8PCy9vZyrPBvMDGpVWCoqJwnI+FfEV3jlVrq7CUemNxq7Smqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH50a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTNz8O9uLi+xa9jdHtri7eSiJlXe49da5CFcmFajbe1rK6lpKOopKCfpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7d25raWd1WmZyeHN5ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExcvCq6mtsreecHFtXKS4kIidaGdyaGhqZV5XaKS6tbOsqaKhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb254d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XLy6+XmZydjnZwY2CqqoyLlHBgZGdhXVxYVYu7vLq8rK2mqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx87Dm4aIg3lnX01goZmHjItzZWBeWFdYVWe0ycC8vrSwsLDBvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnRiXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIyrR+cWpdUVBCXIyCf4J9b2ZbWFRVVVSJwsDAurq9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZmNqZGJqbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8LBkl5STUhLQVV2aW5zb2hnXVhUVlNgqcC4ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2NjamJnY1taWlxZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwbu/wLy7xq9uSUZESEBNZFlgZ2ZiaGRZU1JbjL+/ure7vrm1uLS4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpmZ2llaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8LXjbq+usO1uce3nGBBQEU7SlxTWGFhYGdoXFJTfrTFvMG/vMS3tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZm9pZWxoWFhOS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zQxHWqy73HuLm3rbePUEBBOExYU1NdX15laF1TYaHByMPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncWtzZmJtYFxUSUtKREpDQ0c+OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE16xygL3Iz8LAt621rX1PPzhNVVJTXmBbYWJeVYy4vcfLx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoBxZmxpbnRueGNnYlxjUUtUSEVFQ0dCPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydKWbnKu0tHMysS1ur+ugkw8TFdPVF9gWVpbVm+3vcDDzMrHxcbAub68xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fY15gYU5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrBhHBypszMy83KxsLCyb51R0deUFJaYlZRUlyiwr/FwMrJwsPDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd8YHFjW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7ua3bwr62vsC+vrqmnKqzt8TApXZ0d53ExsvIwcPAv8nLpmxLXVJQVmZOSlmPxMDAwb/Kx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4c2hwXVteXVlSRkRDTUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xbRtr869trnAvKp9bmhubXSCmJdwd3yYvr/GwLi/vL3Ew7yodGZYVmNwTVuQwMS8vb+/w8K+vse8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1e3BuaVtfX1lTUEFGSEdLQEVDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2wdYK0vbW1waSGaVleYE5TW1xvcnaCoLi3wrqzure6vL66vbGNbmZ0hG+Zv8TCvbu+urq4tcHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZl1bVEo9Pz9HRj1HQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJpYR4jKKwtZxqZmdVWV9JSU1RVGx1h6awt765srWxu7i7tbnAr592eZqtvcPFw8C8v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2JcXk9JQj89SURGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqeHe3aNoZdfU0NZVUhialVORElkjqGsr7a6tbOxq7u4uLS4wbu7gnWbt7zBxsK+ubm1raWss7GmsK2onqCfpa22tcK3trSlqKuosLazsrq2u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve292cm5jXWdYXV1TT01BPkpCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+zkIF5iI9tTUpAZVlCUHiBk2dMQl2CsLWztbK0r6y7ubi2ub/Ct411hK61uru4tbKxrayfpKannaOlnZaZmZqfqa65rKurn6WopKuur6ewrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlsXVtqVF1cUE5IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO4tZWMiIV7V0VCUYhYSUpYeI2BYUBWpLmztLOwsa2wubi2u7e6vrGsqqSurbiuqaqsq6OooZ2dnZeXoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFVhY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrupmJmUZ0w/VHlxTklJS2idflhFWLO7sayzr66srba2srS1rqiinZubm5ynp56fqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mopujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn96Y3dsbl1RaFRQTkdQTUxCUFFAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9waqlvWZFU6GEUFdJS19JWItgZWaEr7WqsrSuqquvsLKzraWckJaSjpefnqGgnKOkn56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enpqXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJyZm6SZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXZ9bWt7ZGhVUmRNSkhHT1JOSk5IPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgrMa/y55OQXWcbk9tSk1jZnZ0YF1ic5Gyr66ztaqmrKuim5mUjZCVlpiXm5+hoZudpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpaKbmJ6vqK6yq6WqqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd4fGR5eWBiU1VgSElKS1NUSVJRTTk/QjY3PDY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKXHxotWUktmo1hmfW9yW1FrY1xnYmBskbSwsLispqGcnZqUl5qZj42QlZGLjY2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSqsq6jmZydnqGZm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk9PVUxTTUI3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOLeFRqcXd2b2R3dlhXYmBkaVtbVmetrqyvp5+eoqCWkJOboJuYl5GSn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWn5ubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVqd3VdbVpRYEhSVUhGVVZKQ01HPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgo35ugnBgY1dMW1JaTExRWVJIT01HmqyqqaSfn5mSkZOYmJaVlYyIio6VnZydnZ6WnpqmoKCopbGqp66jq662sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6elpJ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXZtaG1cWFxDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjnpuIYVdeZWBXTVFGPT9AQ0Q/PkJRd6mtqaqln56eoqOdnp2anJuUk5SUnZ2YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Oqs62qs7Wvs66qr6Odq6e2sq2isKago6+xrrCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t0cnFoVlxRRlRJREpQST9FQTRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBQRkU7Qj5GPD45Nk5+qrOno6OhoJ6lq6Wel5yUkZmdmJSMioaIhnhtiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8TKycPBxr66tbq7tbu3sLWyqrqyrru3v7u6q7itq6q4urW8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hrZVpbRktMRURTTURCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXJpYVdORT5JWnxvYUE9XI6urKCZm5uenpmXl5eSjI6Wl5OOjZCLgoOCd3JxbXCPpq2utLnFu83Hy7/CzM3NzMfJ0czNzMfJxcXM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwsXGxsrIzr/I0czHxcfFwrzDwb+/v7a+s66/wMPDx8THxK6/uLK4vMTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTERFUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpydlWlmXFRJREA/SoeepJiDoLKto56cn5qXlpSSlJaRkI+Mh4ODiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0tfS1dbT1MjMxszNydLNztPNxcjKysHHzMfJyMa/w7OzyMTLy8vPx8q/vr+9wcfFzczIycDDv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZthU0xKREM/Q1Sx0b2yr6acnJygpKGdmpSTlZSJfXdwa2ViaHFvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbO1NbX1NPR09TU08/Sw9DT1tjV1tLLyc7Ry8bN0srS1dbZ1tfT19jO0srP0czP0MzT0L/Ix8rEzMzMzs/Fxse2v8q/0s3M0MbJyMDEw8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUlKPjtBOD01NTg2Ozg1OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKgWUlAQURBRlF3sq+nmpSXn5yaoKCem5yZlYl3aWNgX19gX15fX11ibHV0cHBvbHJxdZLEyMbU1tfX19PW0NXU2tTUzs/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NfX2NHX0tjZ1NbMz8/KzdLLztDAxsLIxs7O0dHSyMvNwMrMxtPPzM7IxcrHx8jMytTU0dXP0szTwrnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjqmVDOD0+RFiCqqifl5WXmZqcn52YnJySfXBlY2JfX2FfXmFgX2BgX2BmbXBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NHKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NfXy8jOxMnPzMrMwMnAyMrNztDL0M3OzM7PyMvQ0MvOysLJx8nMy8zS083T0dHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKWsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2ppLF5SEZCO1eOoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYGFgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NzdTMztPNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzMLIycPMw8XIysvPys3N0M7TzMbJz83Ix8vFxsHGyszN0NHG0M7OzczQxcfBuLm9w8K9w7mysr6xu8PDtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21nYGBwaFlYaFZNR0xJUFFCO0M+OzY4Ojg6OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7Son62XeGxwcnuRmo2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYmBfX2BhYWBfXVtdZ3JxcXJzcG1yeaXH08/L0NDT1MrFycnGxr/Dxc/Ox8XHzcrSyMvOzsbR0tDNzNTKx8vOz8fHz9LL0M/GusS/xsm9wsfJzsTCx8DHzcjEzMrMz8jExNDIxsLGyMS/wcfMzMzPwsrLycfL0MTFx7vHw8nJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvr25zczG0NXV2drb2NDJz8/R08jCtru7raO2fWiDhaSrlI6Nlo+Fg4ODgX2EhH5zX1teXl5gXmBjZGNfXF1eX2BgX1taXGFrcnJvb2tsb299udHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMvNycTCysnBwcvQxcvIv7nBu8bHvr/Gz8vDv8O7ycfJu8jHxcrAvsLLxsXEvsa9vMDDxczFxbzAycPFx9LFwcm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXt3cnRmaVphbm1aXFhSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrGvtmxeeX2ikYuSloZ6gIWFf3Z4dXJwX1pbXWBgYmNkZGVkYFtcXV1fXmBbWVpcYm9yb2tpbHBvc4/HvcrFy8DGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvDyb/Bybu3u7vGw7+8wc3Dxr6+tcG9w7u9xrvDurO8xcTCw7e/tba+v7vMw7y1usi6v77Lw8HGwsXJx8nG0MbCzMeyx8nDzszBxcO/vbK3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jVl5ZSkZKRUdLQUVCRkpAOTo2NDc4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NbXzcrOxcnFx8G5xb2rraVfZHWEk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYWFkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5nb3MwMO6wLitsLGnqq2sp7i0trSzs7S7tb6xtrC1r7K8wrzBxLzAu7Wyur7AuMe5tLu2wcK9t7zGwcO8ta6ytbq/tMS3u7WruL2+wL2xurawtrqzxby2rru/tbe0xby+wsXAw8XGx8vFwMXGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HGwL+6t8m2qrCYW2hvio+FiIl6eH6Ghnd3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhma25ucnykx8C4uLWwq62nnqKpp56qrLOtqqyptK63sbOprqass7y6tsO5urqxq7W5u7PCurDAsb68vLa8x7nCt62qqLCywLa4vbCxqLGztbu8q661pq62r7uysKq5sK27rru4u8DAvrnDv8bDxcG8xsLIyrjFx8W/x8PDusTGwrvGyczLs7nCvbuziXN2dmtpYWJsaFlXV1tBTEtNSkVBQz9GQTo5Ojk5NTc1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fNwcPGv8TEw8PKwsnKv8C8wrqztLXDrqmwkVtqf5KHjo97eH2JhXp7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpZWlxlbm9oZmdpa25yga26sLWupaSnp5qgpKCanKWrraSooquqrKuwo6afqq21trG9ua+3sKiuuLS0vLi0vK+4ubWyvMCywK+lqKOrsbKzqL2qq6irrK20s6aorqGkr6mypqeorqWot62xsre6uruyvL6+vsS/tcLBx8i3vr/Ft8TDv7u/xMK+xMjMyr+/w8DAqYdzdHJqaV1hb2NXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvBy767yba9w766yrfBw8G0try2sa+1u62oq5JkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXl1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqqWspZ6coaSUnaSbl5Gho6mjo5+lpqemraCdnKSmrLKwtrensa2oqrWrtLmxtrautrmysLq6sbaloKSfprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6OgobGtrayytLO0sLW9trvBwLK6vsPBsbm5wrPBvsC1uLy9vrzCx8TDxL/AxKCDeHBsYmZfa29gVVleSE5nT1RHRktGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbagnpSdoaa6tquzs7uzxM/Jy8LGuLbHwMy/uMm3u8W4s8S4s7/ArLW8sqylr7OtoaOSaXKGhYaAfHh1c29tamppcGleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ttb4edqZ+VlZqhlpuimJWNnqGip5ygn6Sloqeem6OboKuwrbG1pKmqqqyspLS4rbewrLO1rrO1rrCqn56fo6KypKapuK2ipqagqKyrmaCfnpmdn6WamaOcm56wqaunq6usrbCyuK+4ubqwtry7uquzsrmzvrS2srG2tb+2vsC9w8K7ur2XhHpza19lXmRkWFRXXUlXXEtQR0pKR0E8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7w8PPvrrHuLi/t7LCtLG7vKu5urGinqmrp5iekG1+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtxjKick5SUmpeaoZaWkJuioaienJ2lp6KlnKChm5mvrq6vsqGlo66rp6K1sLKyrKivs6e6s6a2oKKenKOhraOiqraro6OmnqWmo5aZnZeZm52gmpednJ2craKrp6Sjpq2rsrOqtbCyq7K5tK+qr7Kys7izrqmsrrK4sLq2ur3AuLOxlIV6dWZeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lo5ilscK1tr2ttLjCzMjGv8W2wcDGzrfAxL2zubmzv7axubussrSvn5qkqqCUmo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanahm5OTj5SWlp+XmZSXoJ6hnJagoamkn5+pnZubq6evsKubo6S4qqGgrqi2qqenrbGkuLCkt6Cim5mZqqahmqy5r6KhpJyin6CTlKGUlpabmJeWl5yVn6qeqaSinaOqqrCtqLSrqqets7Clq66zsbCwrq+nqKiyrbG0sLy0uriuo5SBenZkXmFWWVhTUlNLTV5MT0tHR0xMRT1BPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMuywcLBrby7tbu8tbm5sK+wqpyZoamUkYqLgIB8d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZpgZWSlIuRk5SamJyVlpygnJ+WoJ+npqSmp5+doKagqq+mn6Kjt6ihoaKos6KlqKWwpbCurLSeoZ2VlamhopStsbGfo6Odnpibk4uhlJGTmJiTl5eZl56nnKehopqkpaWrpKWwp6Wjq6utpqmur6+rqKqqs6amrK+0sa68tbGvr6CSendyZWFcWl1YTkxRR1FhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLi7vMHFurG5tcTJycDDxsXHtsXEssK/xau3t722vbq6tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVSVFJVYGBfYGFfYWFjZWmAkpKIkI6TkpOclJWWo5mgl52gpaKtpqWlo6SjnaqrpZqfpbGqoKGepaqeqKKeraypqa6toqKilZeim5yQq6mwnJ+in56XmZOKnpGNkpOWkJiYk5yho52koaKVoKGkpZujq6WipKqjq66lrrKppqWmprSmqaits7W0ubqwqqyejHJwb2BbV1ZVUkZRTkhZW09SSVRLU0xFRklEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG+w8issbjBtbzAu7S0qqymlZqbnIiBcoiDe3RpaWpsZ2prbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUVldXF1dXl9fX2JkbY2Og5CGj5COmZOUkpyao5yboampq6isp6mmpJmlr6WVmaWvqaCcmZugnq+ZnKuzoKWmn6OkoZSTm5aWkqmqrZqcn6Ggm5SQjJmOjJGMko2WlZCeoqCjnZujlZugo6GXoaijo6iroKuwpK23pqOkoqytqqirr7O3s761s6uvmIV0c2hbWFlTVVJFWExRW1hNVE5QTFBRSU5JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbuztaWpoJaXmJeHenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGR9i4CKfoqPiZKNl5GXmaKgm6CrqqavrKiwpaman62glZakqaedmJCPmp6ul5ioqpmfnZSloZ6SkZKRk5WnqqWamZmenpaNjIuThoiNg4+LkpWRoJ6hpJiVn5WaoaKelJulpaioqKCxsKaxvaifo6y0qq6nsLWwubXAsa6xqpF+cnNiVlRVTlJKR1ZQUlFMTFdNSkxOUkdNS0FDRkRDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKWxt6qlorGrnaqnqbKxpLbGtLm6s8rFubrBy9DKsba3vL3Bw7GvsbettLS7s7Sio5ydl5eUg4B2a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1han95f3SIjIaQiZeJlJOYm5ieqZugq6amrJ6omqCmnJOPn6Oal5eFhJKbo5CVo52WlpaIopubk4uOipCapKeclZWXm5GSh5SOi4GLjoCQi5KSkqCaoKKWlJiYlaKmmY2ZpKaopqGgtLKnsrehnKK2rKmtpLKyprW8taursaOJeXNuXU5RUUxPQ01OTlBLRk5OSkpNTlFITUpBR0tISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrClp6SqpaCopqWzqqKyw7W1srPGxra6w8rMxrOsub20t8Cvramwnqauuq+un5manZWUh3uDbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFucXVvg4eBiICRhI6KlJGTnqGPm5yjoqSZpZeinJWNh5majHONg36Ol5aGkZqQlI6Oe5mPnYyCiX+KmJ+jnpCTmJaFjYKUfn5ziY56kIeTkJCcm5qakZaQnY6jo46JmqCho6SborSvrK+tn5iluKamsaGwrpywvKqpr6qZg3dzY1ZNUk9QTkNTTkxQTEJQUUhJTVJNSEpKREpMRkpLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBrK3DraehppKdpraso6CPlZaSj354fmZXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdaWpxa36Ee3NOWHKPgpeGjZyXi5SRn5idlZSWlY+WiYCUiV87Vm98jJSJgIySjJCGhnOKhZeBeYF7hpOdk4OVjpGQg4Z9k3hxcIWMfYmBkY2Pl5qYk4uQiZ2In5iHiJaemqGgl6euqa2oqJ6XrbOipq2ZrKuYqLSiqa2jk350bl9bTlNSV0xEVEpQTExGTk9JRUxRTUtPSklMUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOuoaamqqCnqaejqbCop7TCubC1sMfCt7O9z7+5r661wqeqxamjnZiDlJyxopqYhpSPi4d9c3VdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBsbmh6gXRPQj9/lZKRfYiUjYSKjZuOlpWJkoiGlYZ5iX9gSlFueIuShH2EjYqFf39ufn+UeHV2eISNmW9RjYiKhnt+eJR2Z3eGiH6KiZaLjpGSloyDiYiVhJuNgoSSmpaenZSko6ippaSem7CqoaSkkaaqlqKqnKKmqIl1bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpyjp52foa+hp6ilp6ivraq1vLa3t7PBu7aousi4tqiotbaqsr2mnpWNf4mTqJaVin6Og4J9eHBuWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboNzdX5paFxUj4mUiXR/hoF8hYyTgpKai497ho+AdoB4c292cHSOjoF6foqrhHl7aHZ7jnBybXiBi42SeHqAe4B2c3KSd2h1hISEhXuVioiKjYqAf4SLjYCUhHyAj5iUnJaRn52pnp+gnaCppZ6dmIynpJKgoJaen6SAcmhhXV1KV1BSSEtYUk9KTE1SSkpKTFBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnJ+0qa+ppa2ssLGqvbSyu7i2urSxn7e6sqqdnaypqLKwoZqRjZSBjpyOkX92hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZnaNlpiNjn1neYF2eICJkH2EmJKBcYePfHd7b2t+rX10kIt/e4aSgXx/dWZ2fIVsb2dzfImMh4BseXF9cW12j3FocYF+jnBDi4SCg4V/d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnZqdnqGclo2KpJuOnpeOlpiQd29tZmJaWFhVUUpTVVRPUE5QVktOS05PSlFPSE5QTEZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5acpamkoJeZj4WSeYiOi4p1cXttdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcmyIp6rAfnR5Ynt4b3x5iZB6fYuGb22Mknl0eWpqgIJxlpGLgX6WgEmSmG5oeH6CbWlkbHmFkJKGa3NsfG5yfIZpbnB/c4yJhIZ7fX57dm90dIWCeYF5cHyOjIqTg5aXmJqQkpaXmZedloyDiZ6Ri5KNhpCWgG5pb29vWFZYVFJRWU9SVFRSWFVMTkhNSk1OS0NITUdFQDo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2wo62qqLWvrqy0v6u8w7+lopmVpJeejYSLlKGhmZiRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxfp4himmlzeWV+cG1/eouJdoKIhnRsmpJ0c3xqap2PTXmFk4mEjmcxdoZzbH5+g3RmZXV/hISFgGZpbHVrcX98aHFxfG6SjY98c318cXBudW2Cfnd5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra29oZVhRWldZWVtNUFVWWVhOSEhFSkpIR0JAR0RDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpGZlqOorp6ynqe6r6uysMKxu8PHmpaPlJmLjoZ5hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6Bxe3hsfWxxg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKEdnGGfId8dIytjomAZ2diam5ybXCDdWlwWHVwjpuSd2x/en1tcm5wgHtzdm5idoN/hoCFkJCKiomRi5GMi46DdXiKjoB+g4B9j3tycHBsYFtdXlxZWGBfUk5bWlhXTEhJRkpHPkJBQkg/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5WltKmusa7BsrvBxpaQjJSPgIh9boGQkomDioePhnWChGyViIh7dHh4bHdud2NpXkpQRz5ANzQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sd4iIfH6Fg3+MfnWimXl+hoGFmYSanGGGqp+di4OQjXp3iH6JiI5zipePg3pdZHJ0enx3im1oamJ5b4aQgnpugXd0hHpwdHl4a25pXXaHfId8h4eOf4qSl4ONhYyGfXGEf4N9dXd7fIl3cHN0ZmdgW1teVFxmXldQVFhbVUdKS0RLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkZ2dn6aRoKqgsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEj4x4g4BzoISKfHyBf3CAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpohIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKpIhq6vr4uBgJOKgouChJKph4CYmIqbdG19gYaHfY5oZ2h5f26Gh4KFcYSGR2yAd3J5dmhta192fYKIf4eEi3mUnZyJi4iRf3p1i3Z8eG1vd31/dHRybFteXVtjY1hnZVxVUFBWWVBETEtGTklDRkNDQEBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6JhYiRjpaXkpegnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFhwWVxeaY2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbm6atk5q7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnH92hYWLkIiQaWhvg4B1jYeEi3GFgneHf3t2hX1udnVmgJSOhomIh4iHoauilomOmH96gol6eW9na3h+en5zbGVeWltdal1hZl9ZT0tOV1JRSVBKRE5HQ0pEQkFEREE7Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koWSlX+KgJKbjoOAgYyKgomNg3+Jf21wal1CQDQtLS8vLi8wMjIzNDc3ODs9P0JESEpOUVJTUlNTVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVl9jf2dnbXWdm4+akpOLjY6aiJKPnYugoJKjqqWjrJOptqKowcOux694upSafI2hnpmEk4WCj6Gfk5iShIuFj5qRlmxwdYmLgpaMjY93j4RxbYWBipaRg4WIcoigloaSiY6PlqS1qZuNlaKDh5ODfX9ramt8gIGCc2JeZF9bZ2tcbGxeV0tHT1JRTkxMRklQQ0RNRkFDRUZCPTo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYZxdpKGfpeWmpWenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpGCgICLjImGkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTlBSVFBQUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2cp6WimaGXopScnqeeqKufqKypqraXq76rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiZaimpp3en6UmJKhkpaYgZSee3eVkquyiI2Xn32UnZuOkpWYpKKmtbCdkZmoiJaPjYGIbHNyfH99cWhfXWFfYWdkYGdmW1FFSktQT0lJTEZGTENITEZGQ0JHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG58YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQU1RUlNRUlNUUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2FkHeViqOnqrS9uKSurKynqLSrsLaysq27sbO9nLPDrLvJy7fDv7ilo7CyrK2qo4uWmIWmpqCjl4GmmY2iq6ikiIWUpKGgqqCkqY+csYuVo6e3upugo7CSop2jnpCjoauvrLK1opSkqoiZiZKKlXl6fYV/aGFoXGViXWRjXmdmX1pPRElIU05GSExGSkdFRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqb1h6hXaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOFgYyFhoeShoKEiYaIh4dwbmFARTY0PDIvMTEwLSwrLTEuLTM/Q0FNVVFSU1VVVlVOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBkqCErqOzqrLAx8Oqs8W2rLO/s7i+tr+0wba7uqO4xai2yce1vrm0qKO0rbGxm5qSmp+Jp6+rpZR2n6SXoayys5iWqq2orra7srqsr7Wisayxtbu3ta61oKeno6iaqa+tsrm3uKebtqmMpY6Rk5+GeIKDdVpiZFZmYWFjX2BmX1tUSURETFVRSElKRElHRUFAQEpEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRYmNXeXVxgZR9hIaSdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhYGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVxPUVVXVVxWT15VSUtKQUA+R0tGRUQ7PkA3RDc/QkpKRUZXVFBej6Sto7G0wra4wczJtrvEvbOzwLe3wbW+r7d0sbOlusWjsMa5sbOxtKiktbaqsaCilpqikqWwraatq6ekmKCstLuiqbK6tLu+zL/Fxb29s8K3uri+t7q3uayssKawqq29sL27wsKsmbqolK6Pl5iriX2CfWtXY2JZamVqZVdbY1lWU0lHRkxRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXU1lVWnZqcH6OhIGNg256c3mHYrihmaOJlZOWk5STjZCWkoeGe4aBjZWKgYSBinp8ioeGfIqDgYqDlX13eXVlT1xkR0VMOlFjYVteU0Y/O0hQRFtjUVJZWFpnWVRgYE1TUEVBP0lKSEVGQUBDPEU2Qj5IR0pMU1pUXZOvuLW6uMm/ur3JzLu8wLy3tbu7tr20urHGYHWypbGanqq9qqWoq6qjorK1oauonpWWn5mfrqWnpqWfo5Sip7G0p7KzvbbBvtPJydPGwsXMwsrDwL69v7u8t7SvuLe2w7rGvcPIsJ65qaGrjqSntomAf3JgYmJeWGFfaWdSWGBWUVVJRUVOS0E+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWi3+Df4N4e4uDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1lbVVSbW1fbl9YZ2VVWVVKREJLS0hGSEhIR0JJOUQ/SEtUVFZcWluSucC4vbfGwLu5ysq6trq2uLmyt7W0rra2mWR1qJytcF6hrZyYoKKbpJ6qpZSgn5CUjpaYl6ifpZ+empqDpJ2spaqwrbewvbnU0c/Xz8nM0szPzsrGwL/Cyr3BvMHAxMTFyr/IzrOku7C0r5uruLyZf3psXmFcWV1hWmNjUVxgU1BLQ0JFRkU8QEU+QUhBQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5eSkJRubG91dYezrKGhn4uZnJmMjZWRm5KFiop+iIaMkIuIfIGEc3uKg4V7iXSBiYaVf3N7eGttdXtocmVpbGlmamloYGZpaGxabnSWraS8iIdnW29oXVpaVEhLTk9KS1BLU1FITEFKRktQX15iZmlimLfHsLizu721scTGtbC5sLC7q7Kxp6q3rI21p52bp5pPmp2Mjp+VkaaYpZWKk5OJkImPkZGem6GXmpWWhp6ap5usr6iwp7O01NTU1tLL0NTVzdPPzcXCydC+ysnKydHHzM3C0NK4sMO8xLmltrrDooJvZF1dXllgWFllWlFdV09PQkJHREJIO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlVnOQkJiCaHFveXmDoKqepZeMm5uXi42VkZqOfYmLhI6KiouQh3uEgnB/iIGGe4dyg5GLj31xeHVrcXh+cXtteHNsaYFwbWNpbXB4aXd8fsu/wt+nbmN3b2NbYWBKUFJVTlleUF1cTlBOVFFVVFtubXaCcZatuKyzp7C2qqy8wLCrtaakuKarrqCrtKOOsa2amJiMkZORhI6bgY2mkZyJg4uEiomEi4OTlZeWk5uRnJiZmZ+eq6ykp6Ksrc/S1dHNzNLT09DU0c7Iw9TRx83S09PXzdLRxdLWxcDOx8fCqL63z556b2ZeYl5XX1NdWk9QVFBOSD5ARkFCRTxAQj5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlt1hoWKd2x3cH1+f6GenqCLjJmTk4yLk4+WhHmFj5CNi4qIkYd/gntyfoCBh3mEdYWSkYl/b3Zya3N8fHd7c4F3cWuAc3JpcHF6eXJ6vsuafoyyhHZyhHdoYWpdQ1paW1ZlY1hkalNYXVxgZF5jd3p+i4GZqaSkoZ+gqKWqsLiqpbSjoa2ho62hp7Gfiaaak5KRiZGPiIGUiWqVooyZhICFfZGDg5OWrYuVjZWajoaSkZ2Xp7ChoKGlpKjIzs/IwsvR1NHU087TzcbW08zU2NbW2NTX1cnU2s3J19fRyqzDw8uMc29jYF9YVFlTXFBLR0pKSkA7OjtEQUQ8QkM+SEI+QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuWiY+KiI6Hj393g5OZio2IiIuJfoN4c3t9g4h3f3qHkZaAg254cG11f3Z4fXSFfHlth3Z0bn12hHV4fJ21jDxBi8Wlfox8aWVWSUNmY2VjZ2pkbnhbX2Zoa25pboCDiJGLnZ6gnZCXmJ+jpKayo6SzoKGlnaCpoKKxnIaekpKSkIuOi4aDj4R+nJuMjYOEhXqUfoKplaOMkoqXkot9l4qakauzmJqbp5ynvcPGubbGzdLQ0tDL0svJ1M7R1drX19jU2djN2NvOydra0tW+y8y0eHdvZV1aUlZRWldGR0pJRUU9Ojc5QEFCOUdEQEVDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoKJhoWJgYd8eIWWloiPg4eFh3qEeXF6e4SGdXqFjo2ceoxwfG9ven9xfIFxg4eAbo56dXd9fIJ1f3uGh7B0WKnCto2RgnBuYj1eaHJwcXBueHaBZWlvcnV4cXqLh46TkZuVoJWHjJOboJufqp+grZyhmpmfpZ6fq5mLmoyQkY2EfYiHg4WLjp+Zk4iEh35tmXmEmIaIk4yNlIyGe5uIlI+uqpSVl5+Zp661vamtvcbLyMnMy8/Jw9HK1NfZ19jX1NvX09nb1s/b2tHWydTLlXp7aWhcWlBTVF1IQ0VJSD5BPT03Oj0/Oz1HPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo6RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKBhH6DfHyEmI6Hi36GhoB3gnlue3uGgXV6kp6NoHaOdYJ0dYF9dICEb4GPgW+ShHR8gIV6doZ7ibfGpcLJuIKWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdW2TlpSVj5eQg4mPl5qXlqWcl6CXn5KSl6OdmauVkJCKjZGCjIWJiIGGkJGenJmJhYuBhph6iIifl4+IjYqMgnyhiZCLvKGYk5eanKmmpa6fqLa/wMC5x8nNzsXNytHW1dXZ1dfb1NfZ2tvX29ra2M7cxod8emhpZWBUWFZVTUxETkM7PTw8OTo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKe36Afn98hXt+gZGJhIV6hId7dX10bXx9hn5zfpKdkZ6DkXyGfniOfXmKim6CmoB0mIV9gYiFe32Qeo+pjo/DoLyMnKOcfYmEfYlyjIp+c6aanJiThXuOkIiEaEdwoKSdjIuQkoWJipGSlY+cmpKUkZaNi5WfnZSglJGNjZCLfpCOjouEiZKWmp+fiYyUkp2Rgot/pZmIhI2DhYSBpYeLi7iYnZGUlqKnoZ2enaOvtrq1rMDFytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27h5eXltamZXYFxUUE9IQ0xCPT0+OTk6Ojk5Ozw2Pz4+PD05Ojs7MzdEPzgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4h6fHuLh4J+dYOFeXN6c22AfoR9d4WboZudlJKAi4h/mIeAm5Juh6iFeqCLfJGOgoiDnH2akYqMo6KfkKSuoIuRi4WLgZKGV3Kti5+rm4+DmJuPj41bgqKRgoyfk5WMh4iMkpKMlJSUj4yPioeWm52PlZaRi5KThYCLiJKNioqdlpmiooaSnZagiomIjZyQg4iPf4OHhaSGjJCzmJ2SlJehoZ6Zkpydp7K4rKa9wsfOx8bPzNDMztfQ0dSu1tXY2tja2tfW2dmfcX51aGdeXVhUV1hDQEhDPj4+OjQ5Ojs3Ojs6Mzs7Pzw+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnhtYn6Sg29td4t4eX96gXyGe3t3hoR/c3CFgnp1dnZ0hIOFfX+SpqOfpaKWiZ2PlJeLiqiXcoqxjISnkYSZk4WZjKKWoJiTiZudopKpr5+RlJCNjoiVi26Nt4WaxMiynKGlm5yYlpCykGSkzceWj4aHiY+Sjo2TlImFiomFlpqbj5CUk4aUl4N/j4uZiI2QqpeXo6OImZ6Xm4iPh5eXioSOjIF/h4+liY2TqZqXk5aZoZmfmZOdm6KztKWjvMC+yMXFycjJwsrTzc3UqdLR1tbW2NrU09rPg3OAaWRfXl5OS1RaQkFHQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnWCjnx8bH2IeHp+eoGBg352doCDfGxui395fHh4fISHi32Ko7Ono6qyoZann6WklpWuooOQt5WSs5mNoaCMpJuvoqSdmJCnlqiZra+kl5SWlJCLmJmWoMCOo8m4q5qipq2YkZqcsp2GhaiinJiFiImOlY2Lk46IgYaHiJKYlIyLk5OGlJiGg5GQnHSRmbKWl6ShiJyak4+KkIuXmomKlo6GfYyYn4qQkJyamZOYmJ+UoJ2Vn5uhsa6jpLe9tMXHxL3Dw7/GzsrJ0qfOzdPS0NbY0s/Yu3N7d15hVmFXUUlJT0VBQkU1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTltcWUlmYDtIhIt6em2Fhnp8hHiAhYB9cHh8fXxvco16fYF7eIaLiYWDkqe7raiyva+krbOzqKOisKyKmrSdo7iklayklqmtt6ako5+ZqZepo6+wqpqYnJSVkZefl5m7u63JoGm2uKuwlJieo6uSl72jXqqygomKjZSHkXyOjn2Dho2PlJWIh5KWi4+VjYqMl5iSnZqzlpWrnoublJKNkJKMmZuKkp6Qi4mVn6KNlY2Ymp2TnJmelKGglJycpa+ooqWzt6vCyMS1ur27xcjHwtGhxsnNzcTW1tDL1KJxfGleW1RfUlBGRD48Q0FBOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlR2JgYnBJQIuKf4Fzhod9gYh1goqDf219fXx/cHeGd42Bh3uNj4yGjJmqwsCvvca7srTBvLStq7O2jKiyrq69qpu7pKituberpqaioqOjqa+ysaqdnKSYmpeXnqKlpZKjua6ov7usrbK5paOmfYiGnK29sIOLjIuQg4+DkY96gYeQjI6ciIiPl42LlZeUkZqWnaeasZqRq52OmY+SjpWQkJaXjpGgkYmVm6OslJaPlJyelKCem5igoZWanqenpKKksLKmwcfDsLC6tsXEwr7Np8fDx8O81dDNxMqIdHNjXVpgW05LQktAREY+QT9COzo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZkZgaWdaXVuTjIyIe4eLh4OMdYaQioFvfnyCf3F+gXqVepGUlJiQk5WntMbJv8LMwcO5x7y6r6u5u5eytrqywK6lwKSqr7u7qq2roqKep6uvtbCqm5+qm6GblZ6vs6eLorq5tcG7q6icsqSjqJOFjanDxKSCi4+HiISGlZSNeoOMkY6RoYyMlJGPiZefmJOZlJemoK6djKqcjpWPkpGVlY6QlZGPoZSGl5+gs56UmpSgoZmkn5qgm6CUmJ6mpKanpK+tpcDEwq6ot7XJw762zrLFvsS8s9HJyMG1dXltXVlcalNNSUNMS0pKQEE9QkQ8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZltNZVxmVGNqmY2XiouIk5CGiXmGk5CBcoB8jX94h4KCkHmNoZaompqYur7HyMrC0sjKws29wbOsu76nur+9u8O4rMGprLO7vaqwqqOlo6yttK22taCfrp6mopijs7ypm6i8waO2tq+rkq+sqquWhpmppqWRgoyTpZWJgXWKknmFjZGQnZ+Tj5SLkI2Uo5mXm5SUo56pn5GlmoyPj5CVloh9j5WSkqOblaCinLWmkJ+WpaSjpZ6eppielZebpaOpqKKyrKi8wMSvpbO3zMC5rsOzu77CuKzCwsHAmW56YllXXVtMS01KR0RDSUJCQUNLOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmtJX1hhWmRkVp6QnY2Xjp6SiYp/iJ+ThHeFf5V+f5CIipB/laGarqajmMK9yMPIxdPMzs3Lu8K3r7q9tLzKvMPBtra8rbO/ubyur6igqae2ra6psreanq2iqKGdqre3qaSvvsOxvbmzp6mzs6ytlpakq6egkY6SscWnlY58kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjY+PnohakJeXkpalmmaYo5+zpZailqytq6ebn6aXmJaZlaGkqKaetqupurvEtaW0tsvBuKm2rLO7uK6ouLq9uINub1tYVVZPRktTTks/QUhFREhGRzg1Rk07Pjc+QUouMzIwMjVCNTVPVk47TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJyRmlJUmViTEallJyWoZeplo2Qg4elkoiBh4KchIOVkJCUjpqin6++rqHGvcXEx8bOzs7Syr67trG6u7y+zrbEvbe4t7KytbO3s6ymnKuruKqop6+wl6OupKekpLTAsKqss77CucC5s6e3s7eyrpWkrK6upIuTlaGNdMGafZaZhI6WmouxlZqZlZKTmZmmo5Wgm5aaqJyboaCZi42Plp1gSpacmpSapZdUlrCfr5yfpZSvr6ylmqGllJOZmY6doKeimbSpqrO8vLursLLHwLmlq6utsbGjobKytKRxb2ZcW09RTEVQUFBRO0dLSEZIQkM+OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UUVXUnNiV0ZIq5eYoKKor5mQl4eLp5aOiJKFn4iEnZeOnqCao6S1yLSpxrrDw8jKyMfMzsa+urKuubjAwc21yLrAubW5sa+vsrSno5uqtLSqqaaurJmkrqWlqKy6v6irtra+wb++uLKywrC4vKujrrSsuKWIm5emm3a+oISYnI6TmZqLr5ahnJuXlZufoameqKCZmqmZoaeel5CNkZ2DbnaSopqVnaKfkK2yo6uVqaqYq66lpKCkqJKSmZyIlJyinpexp6mrura+s7Ktvbm2oKOnqKWnnJysqamMZGZhX1JLTEdHTkpWTD1NRE1JS0FDRDxQVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uU2FNVUh/ZV5IRauVnKGfu66ZlJ6Mk6qbkZKTiaqNh6KejKStlKOjtsa9tMG6wcLHyMXCzsjBvbmyr7m0wMLKtsaxwby0uquorayvo6KZqrS7pqmmq6qdqK+npKqqvbynrLyzt73GvLa1t8Cvvb+zqLS2q76lj6KXkaKfvJ+JmaCZlp6dj7efqZylo5ucoZqopbOhm52lnKipnpmVj5Sbi5eJjKShlJyinqC0r6Wlk7Crmausnp6ko6mRlZWgg5Cen5yVqaWiobS0urWtqLSysp6coqaal5WZqqGed2FeYF5KSUZITVFJTkVGRkJSS0lBREdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnG9iR0Wnl6Sfn8OsnJekl5mpnJabmo+qlpanppWtrJmiq7bEwru+t8HCwMfEvs3Hu725srC4s7/DyLW/r7y2urempKurrKCgmqqrxKKlqKumnquvq6KpqL64pq29sLe2x7a1ubi+sL7BtrSytK+9o5ajlpOblK6fkKGipaOjn5C9pamdqaydnaGbpp+9opmjnqKpq6Gdl42VnpOeh4+EjZOepKCdtaymnJWyp5mwp5+aqp6gjZmVn4SOoZqbkqWkmpissbayqqWpraycmKChko6QlqmflGlkWmFdT0pHS09MSEVESUE9T0hBO0dJSFtST0s9SE9VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlY1dMopqjm57FrKGfrJ2crp+So56WpKCnqauXtrCjqrK1xMK9v7bAwrvIwr7KyLa4tbSxs7S3wca2vrC4tLm1n6asqqudnp+lpMGloKmtoKSpra+ipqe9taWxvLe1tcOys7e5vrHDwLe3rbO0taKcpJWRk6CtoJihnaipq6Kaw62pnqytm5uemaagvaGdpJirq6umoZmNmp+SnomOV3+VnqWhoLiqp5OYtqOfs6Ggm6+Xno6ZlJ2Cj5+Xlo6ipJWQpa6yq6mioqWllpWcmYuPkZOkn4liZVtkYExJSkpPRkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxLTp6foZiew6elorOgnLKnk6ukoKOframsnbuwqKy1scjDwcKzwsS9xsO8xcq8sLC2rrC1r7/FtbmwsLq1rJqosKmpmp6moafCrZussJyqoq6wqaSnvbemtrq8rrbDrbOzwr+xxrO6tqu0ta2poaWVlZSjq6Gen5qoq7Cur7uypqCpqZmZl5OipLigoaSSrq+spaafkqGelZ6PkI2VnZmjn6e0pqeNmLSco6+anpuukZ6Ul5SagJKhlY+On6GTi6assKWmopygnpOSmpSFi5KNnJ6AYmZbaGVLSUxKU0JDQEhHOztGPzk5Tk1VXlJTSj5PXl49SFBCTExJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMKoo6qyoaO1qZWyq6eipbKsrqm7sqywtbTGv8TEtcDEvsrEtsDIwrWrtaiwuKzAxLS3rqy2uaWZq7Krqpefppetu7WbqLCbrZ+utLGnqrqyp7mzt7K4wKq3ssK8s8Wnvq6tt7Spp6uhlpaRpaSiopeYpK64rbG1tqCfqKSZlJWTo6C3oqSllq2xsqWqpqGempqalpion5+Yop6vsqKmjZeumaWsl5mepZGbjpSYmoWWn5SMkJyelIupqaqip6CZnpaMj5mQgYaWiZSfeWRpXWxpTlBNTlQ9Q0FNQzo6SUA3N1FPXV5SVlFBV2BcQkpTSFZLSDpVZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SnBpVkNXRox5ZkM7pKOdoaa/pqevr6Cptaqdua+ro6q0t7Gwubevtri3xL3Dx728w8HHwLnBxsG6qralrbutwcO3uKqtsruila2wrbKWpaeRq7mqoKewnaqfsLSyqqm2tay7rLKyubesubDCur2+psKqsLevqaqrpp2YmKqhoaCRmKCwr7OrsLmam6mfmZaSl6agtqmloqKvsbOrsaern5ugoJuepZyhl52js7Can5CTpZqhqZqVop+WmImUmJOWl52TiJCbmZSPqainn6Obl5uTh46Zi36NloWPm2tpbWFtblhRUVpUQUNFVEA7O0hBNzpYUGReUFZXRFleXk1MUk5eS0o+WmReTkhQTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjqJe2NDPaefnKGpvaGqsKqjsbippbSzq6Gttb2vs7i8ur22tsDCv8nEuMTCwMC4xL3BuK+2qKu3sry/v7SprrG3n5erraitl6epj6e7n6Wts56rorGws6yptrO1vK2vsbWssLWxwLrEtqu8r7G4q6yporGlnqSpn6OXkJmfsqqzqaqzmZ2nm5mUjaCmpLSup6GsrK2xp7Kssqmkm5+oo52UoZibqLWpl5mSkp6ZnqGekKyfmJiGlZiLnZqck4qNlpeal6alo6CdlpWXlICPlIV7j5KDjJZmbHJocHJfR1lmVkRDTlhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiYFBLTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVTE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmqCkrLekrKmlrq62qa+zuaamsLfFt7G2vsHCtbS6xb7MxbnDwLq/usS4wbmytayqure6ur61qq2xtpmYp6uqq5usq4+rvJ2srrGjqp+wrbOurraxubapra6wp7Wvs7u8ybKqtbSxtK+upqCzn5qoraCllZWambGjrZ+lr5ahpJmZko2ipaeyqaGmsauptaWusLWvo5mdraeal56Zmau4o5eTkY+YnKGYl5Ssn52UgZOZjZ2dmpaQipSTnpqlo6KgmZaSk5Z7i5CFe4yLg4uSa254bnV8YUZgallJSFlaPXtKR0U2QWJUaVpNXGFKW11aUlJSYmBMS0VfYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLipCL0pHUFtIM2NZVUtEmZagsKixqaylo66utam3tLijq7S3yru0u7q/vrS0t8PBzce7w723vr/AuL+9sb2up7q5t7fCt6utsbmVl6auq6ejsqmUr7ukrbKxp6eisrOwsrC0sbeyqK6rsaa4r7Wzw8W2qLS1q7Ctqaeitp+eprGgpJSbmZSxnqebn6mNqaKdm5WXpaWlt6eisbOrp7GnrLC1rKSZoKyom5ydm5SquJuUjo6LmJyimJCXpqGfloSSlpCdnJiWloiXkJebqJ2koJKWkZGXdoSQh3yFgoSNjG5xeHZ8f11LZWxcS09jXD9ie0dJOEdnV2VbTF5iTVhZV1RYVGldUE9IYV5fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RU1RPDNya0pEQ5CZpK2kra2rp6SwsrOqt7C2n6u1ucm5rsG7wrezsrXCw8/EwMG+tb3Av7q/vbPEqKq5sLa3v72vq7OznKCnsK2lprClnrK1rauysKypqLS5rLSytayzrKmsqKypua2xsMe+t6S5r6mtraWorbClo6Ouo6mcnZyar5mio6KjkKyeo5+foaqmprilq7S0pKmrqKuvtq6inaOoqpugmZqSpLSZj4mNh5GioJWNlJ2glJOFj5SSnZuYlpWHmJKVmaecoJ+NkpGOkXd+joV9fH2HiopxdHJ+fX5cUmRvXk5aZl1GRJZbRzpObVhhW01gYU5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZDs2KkhkSEorOkk/M0JJUyw+j2s9R0iPm6mqoamvpKiks7SxtLWxsaGrrbzLuq7Au8extK20wsPRxca+wLK+wcK8v7i8xaitt6yzuLzAsKuyraCkp62pqKSwo6qxqq+ssK6vrauzuqa2sLKpsqmrpaWjrbqsqrHCubSruaioqK2pqLGlqaSirqqoop6boqyVpJ2XnZirnaGnqaGspaKsq7exsaCoop+qrrCsnZ6mp6iZo5iYj6CnmIaDjoqLnqGPi4yWnI+PhoeQlZ+dlpiVhpaTk5eknJ2ci5GPjop/f4eFfXd/h4WHdHNyiXZsX1lgbmNRc3JcSzuEfEY/V3VYYFlOY1xNVVZVV1BcYl5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5KMC5JZ0RGODxCMDVFS1gxQJRbP01GlZesp6KqspypqbC2rLi1rqqlq6q9ybuwvrfCr7Gts8TDzs7Dv7+0wMPEusC0ycSsr7eusrnAv7Otraulp6qwqaeosaW0rauwrq2xr7Oss7qkuLOsrK6nq5+jnrC3q6qturaktbWkqaesrKqtoaimprGypKaloaGrlqmgk5qgpp2koqqkrKKeprG3rKyipKKaqKqtqZyhpaSjmKCZlY+YnZOBgpCIhZygjYuOjJmPkIuEjZijm5KRm4yTkpKUopmbmouNi4t8hoGBg3t0gISCfnR4jKSHeWteYG5nV2aHZE5AZ5JMRGJ5V2JYUmVVTVZVVVRPXF1hVUtOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQEhIRJaSr6SiqrCXqqmttau2saukq6qpvMDAuLmzvLWms6/EycvRvsG7ucC/wrnBusLErrG1srO7wb6zsa6tq6yntqqlra+rua+osbGusau1qra1p7S2q6ykqaqco52zs6iopLS0oLWtoamoq6msp6CrrKi5tqmqqamhqZ+tm5GooZ2gpKKmoqmdnKa0rqelqaKjl6Smp6mcoqSjn5mYn5GOj5mNfoeMh4SenoiFiouPjpCNhIaVopqOjZuRkpGPkp+XmZaMioN/dIaBf394dYN/e3h+gImej29xZ2dxeFxhdIhpT12YVkhteFVkVlFiT0xVVFVRT1hbYlZIUGpUVlRHUFlVST5JSE9RUHhMTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsPkxUXy9JazZRRTuVja+gpaqtmaukra+ztK6qpa+pqbq+u8Cxr7iuorawycfI0MC/vbu8w766w8HAv6+ys7K1vbzCsrKzq7OppbWppa2zs7mvo662sa+xuaq4rqqutqyqnqqrn6Ogtq2ooZ6vs6G0qp6op6qjqqGhrK2ova+srqyhp6efq5iPr6KYoaCop56nm5mqsKiin6yhoZKhoqOmmJqopZeXmJ2PioeViHyNhoWEpJeFgoKMh4+OkYSFlKCXiJGdkJORjZGclZePioWGeHSBf311eHqAenR0emmCh6N1aV5lbIJ1Z4iLfVJXcF5KeHNTZFNRXk1NUlpnTkxWWWVYR1NpUlE+Qk5RYVE6SUhMU0lxUExTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSE86VkI0kI6xn6Smq6OmpKymtLOwqaOwp6q4vsC8sKi5qqeusMnGyNHDvcC+ub6/vMm8wrmwsLWyury5wbO0u625raO1pqessba5sqenurWttbyvvKWtrbWrrZypr6Ofpayqp5yeqrOks6iaqqeppKmdo6moqb2stK+unamjoK6bmrKjlaSbpKWfpJqaqKqlnpqpoZuRmqCknZiWqamRmJmTkIqCj4V9j4KAiJ6Phn9+jIeRj5CEgJOblIWTooyUkYuRm5OVh4l+gHJ6eX58aXd9enVxcX1ohnmEiGRgaGNzhXptZ3ldXlVCV3psVGFQUllLS01wdF1IWltnWUVWZlBDPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj07RVo/Ko+TsJmfn6ilpKGrpLeysqSosKesuMG9tbCjuayoqLDDycnMwbe9wLW3v7rItsO1tLO1sr25ur63rbm2v62is6aqq6+1uLSqnru7qLK/srqgr7S2qauerbCinKWoqaKenKSxprCgn6qpp6Kqm6OooK28qK6wrqGroqOunp6sppeemqGjnJ+bmqOpopqZo6OVlpOeoZablqasi56RkJGMgouAf46Be5qUjYl8f4uGkI+MiYWSmJGHlKOKkpKHkJqQk4GIfHlsfXZ5eGJ7enFwcHN4aYF0aoNnZGhhb3OObWJqcGBvQVx4a1VeTlBRSklMU1pXTV1ebVdEV2BPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTyk8MlBbPSOSmKuYn5enpKKfqKS4r66ir6+pq7jCurKtn7ivq6i0usfLx7+3wr6wtL63xLbDsq+6srPAtru+uKm5uL6rpLWnqKqwrbmwqZq6vKSuv7S0oa63taemp7CyoJ+kpqegpZmfraionqCqr6egppejqZ+wuJ+ksa+hq6GspJumpqmampueo5WcnJqdqaaWmp6nkZeSmJ2TmZWhqpCaiY2Qh32HfoKNfHyhjI2JeYOMhYqMjYWIk5qOiZWfiJGVgouXjZB9hXtzcHxxc3RgeXhpb3Bxb2p/c2N6bGlmZGFmhoBgW3JqcUxNf2lYWk1QTEpIUFJRSU5cX29URFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBaWjUolpylmJyWraCfoaSht6uwo7S0qai5xbayrqC3rK2ssLXGyMC3v8K6sbW9t7+7v6+svbC0v7K9w7qpu7u4p6i2qKersKyzsKaavLekq7u1rp+wuK+ppaavsZuhpKCjo6GWm7CmoZ6ip6+ioKKTo6Wit7ChprGrn6yirpicqqSonpeanaSTmpyanaWpmZybpJSUl5ScjpOXoqmhkImKj4V6hH2EinmOl4qNh3qCiISIjI6FjZSZjI6WmYqPl36Gl4uPeoB6cHF2b290X3h3ZWxsbGpphG5mcmlsZmldZHOBYFtrdWlaSX1dW1hPT0tIR1JVRjI5Xl5tUERXVlllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y2w4NEdBZltIVERVXWhELjwyYlYsMpWioZeUm6qdpKGioLeqrqC6uKasvcWzsK+jtbCtra+1xMS8s7+6uLGzubi6uLqvrsCztLiwv8G4rL26taais6qnqbKrrbGhm8C2pKe1taiesrypqKaor6yZo6eco6aUmKKypZmeo6ipnKKgk6SgpLiopKeupp6loKiSn6iioaCYm52gkpqblqChqpubmKGUkZSWmY2TkqOopJCIio6FeYR7hIZ9nY2Kiod6gYSIiIiRhZWTk4yQlZSNjpR7g5eOi3d+e2x0cWxsc2F4dGhpamdmb4ZnaGlkZmlqYGliamdbZXtjYFNzVFxbU0tKR0lPU0AhKmleakxDVlVeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OWZPJzKeo6ORjqOnm52enaO1raaqubenrMPBtrCso7Wup66vt8DAvLLBt7Gusre2uLe2raq9s6+ysb2/uK68vLGln7arpaWzqaqun57Bq6ilsLKprLW7nqmqq7Gll56qnaakkZmnraKYnqSpoZyinZegnae2pq+qr6GhnZ2hlKCln6GgmZuZnJKZnZSlnauhl5adlJONlZeLj5iaqKCSiIqKiHmFd4KCgZyIi4KJfH+EiIaFkYSWlY+Oj5GRkYySe4OVjYVzfX1meG9ramxndXNrY2dlZHWAYmVmZmVqamRrcVpeWV1tZGFOaFdaYFZKR0lLTVJYPjlfbGlIQlRTXFtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0FmSCU1m6OfkIusoZiYoJals7Ghsb23obHGvLqxsaS2q6uuqbm9u7uuwLKvrq22r7O4s6irubGvrrS2urawub6tpp61q6CgsKSrrp2jwaCxo66wrreutZ6tr6ytopmcp6mknpWbqKWfmaSiqJ2aoJuUnJ2ssKa5qK6ioZqanZido5qknZeemJuUmaCSqJaqp5qTmpqRi5SZjZSUmamnjo6KiY97gnOBgYqYhYd8iYmEhYqMipOEk5ySko+QkZaOkICAjI2DcIB+ZnhtaGtqZ3Fya1xoY2NzgWFmaGpubGdramdtXGxrdHFhVGJoZGVaSUZMTU9YUVFWYWSBVEBWU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZUMnNJKhmo2OsJ2ak6GZqbKvn7i/tqC0wru9ubGmtrCorqS3uLe3rbuvraqrt6q0ua6ms7Wyrqmxt7axs7W6p6mftqmdnqmiqaybqL+YraOur7W1ra2fsa2vqaKbnKOrqJuVnKejnZqpoqSWmqCckJujq6qpu5+npKCYmZmdoI9roZaYnHGClZqjgHWSqaeelJSekIiXmYCWiqGQeIaUjINuan52g3FshouGfYSLhm9eY2FnhJeGa4uPlJN1d4uEfoOQgGeGgGh1aWZXXGhzbk5QamNncoRnX2RmbmxqXmBhipCEhWVOS0Q4RlRnXkpHUFBUVUtIU2FvdGVGW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUWQ9Ky+Mo5mGlbCbnJOhm6qtqqO9xK+pt8K4vbytp7awpaukuLOys7G5raqnrLSmsLWjqLi2tainrLezrrSts6Oqn7SrnqGknKanmay7laalr7K3ra6lqa2rrKWhn5ygp6abl6GlpZubp6edk56fmJCep6qjta+jo6OclpeYl6OIoY6Smoehh5OdoH+lf6aqnpKRmpGIg3J4jI6FiKF2iY1pl4hmfXJ4oW+Ih4R+jXx/oaCgmYB7h550iI52m4psh4GCbWhlY3pscWFUhm1jbGmYcVhqcG+HWF5pW2trW4hxbnpyhmeGhFpeRk0/R19NRlJWVlFRUldVZ15NWEpSUk9FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oi6aXg5yrnZmZnZ+qqqepvsOusrq8t8C/qqS3sKmsprK1rq+ztquppbGtpbWznK21trSlp6mzsa2yqK+fq6GyqaCjopqhopuutJWjpKW2vKatp6uqrKiloaCYoKajmZmmoqSYnKSplpSjnJSTpKWmobejo6CkmJSTmJOciK6PmJSJqYuXopuFsYCjrJ2TmZ2UeYLUqH+HlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxlrycxXtytqa7kHuAbJaxq7B5aGtYsa5uZWm8krxuaHpuco/YflNqYrayfoFylHSaoaqQV09XYU9WTkZUW1hRUFKMXFdcUEBcRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2lk4CmqZ+XnJ6lrbKosMK9srXAtbe/wqums6ysqaevs6mvtrOoqKa1pqe4r5yzsraqpaSosa6usaaqnqeksaShoJ6Xm5+drqyUnaGftLqiqqihra6lop2amaGnn5ebp6CfmJ6np5Gcp5qUnaGmoqCwop+fo5aVkpiSmYWvamqKjap+Z4SVhq1kcJ2ck5mllHGuoaR+eLt9a6GQdrFfarRbpYBmnJFgZoJ6Zn9qeGupZL5yZ6aMdrFqfLF4dJKUY21tp21bhKBFaGeHlkV1nGB9Z3ykp4JZX4uraYCVeHlqpzdKr1xXU21jW0tOV19cV1Y7TolPV1cvSVRTSURFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuRoZSCrKelnqOlqrK3rLS9vq+2xLK3usKmqLCrrqmpsK6jsbqvpKWus6Opuaies7Kwo6Wgqq2vrK+mp5+jorCbopuXlZeam62llpuhnrSzoauboq2toJ6ZlqChqJyYnqSfnJmhp6SPnaKal6Cfqp6mpqCbn6GVlZGWkZqFtZu1eIWpmbWZd4ezm7d+k5WWqJR+a4GmeoKGiJKUknirZ2uxW6t7j4eUdIhxj4aAf4iQl3iDgouXjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYpwuUaJvW1NraGBMS1tkWFxaQj6xeFdYQSNNaEVDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+UiLOmpqGuqaezrKm6tsKwu8KtuLfBqqytrq6mrrKpoa+8qqGntK2kq7WkprKzp6OhnaiqsqiwqKWen5+vlp+ZlJWWmJ2soZqZo6i0rqKpj6moqpuelZegpKeanpyin5ugo6WjlpuemJmdoqqbpZqcm6KglpORk5Kcg9WTmblwsMJ+xoZ81pSbu3yZlaSPjZyNpHuOh6SCpYJ6rHmPnVaveoh+n2q5Wrl3hoN8poKTfJh6qnmNnZB7sW6OhHSQvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhoCJfGOkM0Kddl1QaWhkUEBYZ1pkYUpITWxLW1JPWWZZQ0Q+RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcyJZuik5ixqKiltKqltaiku7fBsLnAsbW0u7O1p7Gwo7Cypp+utqibqLmuo6+xoLO0sKCknp+oqrGptKmknJ2eqpeYl5aXlZagqZ2alqetsKijn4+soqiWnpeboaWhmKKhoaGaoqKnm56hnpWZm6agm6eVm5ufoZiPkpSRnIiybmi1cauHb46mcrRzcrZ7mZeji46cjaJ+kaClfrB2g5HS0XZcrnuFf6Rvm6qma4aEfK19l5mPe7Fzkp2PebNllnSEnm+eZpRSyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRTUWpjZlhBT2tfbGhPVUdJOT1WUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnJGlsK2kqrutprWlp7a7vLK6v7e2tLq6s6W0s6GxsaKfrK+kmKa6rqSxsZy0uKqfpp2hqqSyqKyqpJqcmqielZSYmJKSoqeflpKlq6+mopaTrJ+lkpSgm6Smn5SapaahmqOfrZqhn56QlpuhnZyllZ2VmaKflZiWkpqFrHt3qHajjomHqW+tioKng5iYoYmSmoqif5OZiK6Ff4KzXHKzUq59g4Kkf3HXfXeEfY6ehpmZd6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1ed3eHaJiIa16vd5Wej3hsNXnIrrJfQVRvXmdgRVBsX3BtVlVNLmVjaVNZUTpBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOTg4n52UoLiwl7TBraizqKmyuri0uL+5t7K1vLWlt7OftKyfn6irn5WntquosbGrrbSkm6mgoKihtqemqqOZnpWloZSTm5mSlKKlmpKQpqyupqGVmqmfoo+RopmopaCVmqWonZyknq2doZ2gjZSem52gmJmclpeioJOYkKadhql9faV4oY+Og6pwrYuBp4aVn6GIl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92h3OngY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFpMdF1iZk1bYV9ydF9KVjZKm5NYSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MDAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzE/OKGdmZm/q5e0wq6rramltLC3sbW/ubmysLe8qbq0n7CknqWnp56TqrCpsKm1rKuvoZihoKalpLqio6ugl5uRoqCVlJ6alJieoI+Ni6ivr6adl5unpp+MkqSXp6qnlJepp56foKOtpKGeoY2VoZmfoJKdl5yVnqGVlo6rm4+ubXK0cqmMdoqmc7R4c7OAkaSikZyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWSiK1rdbNhnWaib4eSapdcrWBNoXyHkVJzo216f35vmIdxXK9WPJx3ZVRvbi5cp09iUmtlYmxaY11gcHtjVFpRPj5tbzNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7PDAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpuduqGcssCuraurp7epuK+1wLW8sK+5uKvBtqmqoJumpKGdkaqqqLajsqivqqCXnKegpKu4naOtm5aZj6WjlY2doJuYnJ+Qk5Srta+nmZSbrKmXjJOlmKSsopGWqrGjoJ6nq7GZoaOQmaKXn5uWnJehk5yqnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIeQl4yYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eIGKbpqIcW6NpHS9Xnd9W2F5vGtaVltqel5qYWZnYm13b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkE5p5qeobyil7HDsK2qqqyxp7ivtsWxurGuu7CuwbGrpKKeo6Gcm5GppKqypLWmraSflpqqmaasuJ2jrpiVoZCloJKNnKOel52akJWSr7mxrJWXo6enlJGWpJyjrJ6RoKirn5yfqaOznqOljqeilaKanJeVo5iPsKCSlKmehZCZtYCQkYy3lXiCk5q1d21rbnNueY+Ejol0nsG7vZp7gbKocIB0kbiDfIaGjIaNe4qGjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbV0cnB3toxegHp9iWiDeW15Y4uscHWFf1lbp2pEZFlTZmBjXWNRZ2ZxbXVCTVBNRDtaTT5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz07PKeeoKC/pZa0w7Ssq6esq6m7rrDGr7WzrrentLitqaKhpZ6gnZmUq6Stqqa1qKefm5ago56spL2moaqXlJ2QopuSj6KoopOdl5OXlLK1tq2YnaOkoouSkaabpaqblqikpZyaoamnp6OpoZGtnpeknpeXl52ej7ColJunoY5qfmmcpniHc32aj3R6ZYd6vb7Aum+SgnGVh19yalpemolhY4iOlWtgf5VjbZ13YpVrf5qVlGVeYGNxm4ppcox9hpVnan5ydHh9fWJbd3SBaFBcboR9e4trWGx6gnNJSm+GcE50TUVXXWZgTFtYZmNfT1ttdWlxUk9ERU08SEk9TD8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6on6ihwaObtLq2o6ylrqeotbGsyKyvs6u1o76xsqegoqmdopuamaymrqSltamlm5iVoZunram+p6mmlZSclaCak5elqaiQnZGPl5ywsr+sm6edp6KJk5Gpmqijm5uroKOam6OnraOfq6KasJuVp6CWlZ2fnZexpJihp5ickZ2co6OZpqKanJqamY+WgWdtfXF3kpeUkYWKtaqNhpiVj4qMmJeHlJWKhJKUkYmOkZOYlJiXmqCimpyUoZ2NgnqlhmxqfJB8gHSJioFxgnh5dnaLgHyKa3OBdIN1ZHd9d2twem1gY11wZ01ZWWZpYFdacHpubGZTT0ZTOU9aTVJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Czor+ho7Gyt6CppbKnpbC1qsmrrLGltabAp7ShnaSlnKOVlqCqpqyjo7ern5mWlp+XramlwZ6rpJWSnJeemJOUop+eoqeTkZmop7LDr5qrnKqfj5aWqZ2qnJygrJihm52ipbCnoqWonq6Yl6edmZqhnp6csKCcoqaVmJOYk6ChlaOel6COlpOKio2Olq2PfJWbgpKCi6qohoGYloqEj5+Ie4SQh4WZkoiGipWOm5eNkJeeo5aak5GdjX6OZqGzr4WKhHZ6j4p8dnl6b2Z6kYGAiWt1gXmIcmhzf3p2g4eCa3RkeWZgamVjZGZrWWt7cGlqXFJMUERfVUVAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rKuusrKgqqaxraKss7DFsKqso7OuvKS0nJ+loqGdmZeopammpKWztZ6VlJ2ZmbCmrb6grKKQkZ6amZSRlaGcl6ichJ6pq6KzyLOfqqOql5aXmqedqJuepKuTnp+doKqvqqajq6Ktm5+goZmknpyena+jmJ+ok5iXnJGkmZionZqXZYKSfGV+jZmPY3mNbGhrepGkq2tlmph+Z4WKZWVpaHuOoY9raI2XkaJ3a2qLmKOemHNsbnqEjYd6WGVehYJebIqJgHZcaHN3d5KAh4JueIJ4gHNteYR0d4mIjoN7aYZZXmt0ZF1ziWlqfHFsY11STlhKZFhBSjQ9Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7CqpaitrbCnrq2wvbGpp6Str7CfrZefo52hmpmnq5yto6WoqbKunpWjkKKvpre5pa6jjo6aoZmTkpugmZiklXulrKKos8O3pKGnrp+elZ6jnqOco6qokp6hnqCqsaqro6qgqZumn6ihrJahm6WwpJecqpWhnpuSpZeeqpiefr2Dh3K0coSdhq1oeLnEuHGToqN7ppiZc6qCfMvAwLtxi6KHgp99lZiJnsC9gpadnY2dwsF7gnuSjJrDwH1qpbFvjIBvynp/m3eSg46BdnqBf3lxen+HcXiFjZN5bXaTY2ZfeGRgZYJjXnRnbWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqJSjr6mwrq2msrWvqaWmprCrn6uYmqKfnJuqp6KcrKOlqKWktKSdopKmrqu4s6evopGRmp2lkpGgoZebn52Hpqukq62/wLGgqa+pl5KfnaKZoaOqo5OgoZ6era+prKajo6ehpaaeramSpJupramcnaqcrKGWl6WWoaOXnH/OlHh6pIF5lZabX66PXo6ngaKgfKeVm3Srg4CvXmONqnqnh4WgdJeSiLNjgquGoI6Ns2qErnR9loe4YYOtWaPNbo91e9p7f5lwfoiSdn5le4h2dmt9iG5+hZGSfm2Bj2Bxa3BnYF95ZFxxaGpjZmBSVFJXXktPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3Cv7+1tLC3l52RpKqorbOrpbKsrKukq6evqqCnm5mkl5yir5+gnqino6WhnrCsm56Vp66tsaqorKCUkpufpZOPn6WXnaejnq2kqrCowMazqKmxrpaSnZyil5+pqp+UoZ+dna6wqKupnKenpKKrkq20l6aiqqmdo6elobCgkpqnmqCalJSRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553qoJ9rX+ccq1+q4eGn3aYknp8l36qiKKMkYydfqt7iZOPn4B7rVacxHqPb5LBfYGVbXVwjG1ldmWGb2F3bnJviouSkINtkZFlcHR1cGBnbWVfb2lpbmZjV1NdYVlSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSfnaOOo6OhrK+2rqmxp6iqp62rq6eio52ZopWgpqufoaWgqKiin52wrJealqinr6yop6mel5Wao6KRlKGtm52mo6+so6u0qrrNsa2mrquWlJydopifrqydlqCZnp+qs6mqqpurqqSjrJuwsaKorK6lmKaqqamxopKWo6WalJKEpGqkdYl6qXR6snCCpYmZjHGIoJqHpGBgUquEf66Dm3augaaGhp96mZaGe2aAo4mkmYWCo32pfoGUh65efKlVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2NmI+BbZqTcG55eHdvbGZlZXJwZnxpYl1XYGlYWFVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1b+hmaunoa+inrC0sK+praKnpqqrq6mkpqCbpZ+cpqemo5ysmqKsoaSfr6KdmpKqpLWwrqCpm52WlKajkJqiqKCgpZyxpqOnsay2yLK1qqyplZGdnKKZoKWznZqglJ2fp6yspK6arKqjoquis66iqrOxoZqqqK6vtqOTlqOnmJuRfKpsnoSHdat5fLBvgqSKiZ+WlZ+UgdK4tLjJgIGyX1+UqYOkiIegeZiVmniqyXSZo5WnqZCTmox/m4maxsZ4ZaGCpXOBn46Cfa9ecLVjsXVLo4Ztp0eCk2SPkJ6SfHCXk4Bxe3V9e25bZWpzcWaBal9hWWRtXF5ZSU1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC8+LTVPVFEdHDs8RjIsJKekwca4ramyraylopyyuayqoaabqKWqq6qnoKalmKqjn66rnaagrJqeqaWdp7afopeTqKq2sqybppyglZClrJGZnKejn6mmrqGjp6mwtMKxs6qtqJOJl5ykmqGjr6aYoZWZnKWmq5uwnq2op56so7etobK5r52br6ezs7OklJeno5mfjoKdTniagX+feoOjfYOkhIenn5yek4S4e3x5uYJ+zMbCtniboZGLn32alpaKdp6YiqSYo6h+sIWdhZ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpKkl3x9k5KLdXpzhX9xXG1veHJqgm9aZF9obmNkXUtNUVRCSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruKuvoJuhrLOzpp+glaaura6qp52mppqjp6CyrqKpprKgmaqklKO2oqKVl6KptLiknKKdopOQobGZnpynpaGir66dpKihtrLDsa6pramRh5Ccp5yipJyll56ZmpqmpKmar6KupaaYr6W8raG3t62dnbWyuLCzppidr6GjnoWP0bXDt3mHjoWRk5CBpniUoneMoJGEpYGKcaqGhLRucmqZo5uVip98mJmGh49zr4Klm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGjcXF/n2JzsrhoeI+Uppl+jI2TjHh9eY6CbWl4aXlzboB0XWRkbm1mZ2BKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklk3ONiq2/v7u6tZ6Wp6SttaGjmZWjqaeuqquZpqKfpqGgtaejqaewo5Sso46kraOdkJqaqrS0pJ2knKmRlJetoKCepqOcp5y0mqGqo7arw6+pq6mhjISOnKGgpqKVmpqcmZuZp6WmmKyorqOlm66nvqyUvbCsn6Kws7mrtKeaqLGkp5h6qJB9fLB3ioGkpYicbbJvoYetfKGOg6eVmICsiIWuhZ+UqaChloafgJmVgHuSfquAnZqWi6p4naCPiZOSgHmvXaOBfKanZJ2AfJd0a65dpWtwhZldYFuMoG2VkqeZg5SNl4x7e4OXf2tsf2J+dG2AemBnZXFuaGdoQ1phWz1LVDJVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZWV1hWVVVRSEZJSiMoKL2SmoSpxsK2wbSfmqygrbilo46bpKKfsK+qn6Sfna2Znrigo6ugr6marqGQq6mklomaj66wrKafp5qsl5iPrKKhnaWhmqScrZifqKa2qcCvpamjn4uAjpuan6aekpWampSamqalpJqprKyjpKCqqL+kl8OsqqKhq7K5qq6noLOuqKmYdq9+kIuchYd8uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWlmaShoZGFoFtsaoGzYH+te3uCgbFsZ2+Zl4yIsFt9tFukg2vIomWfgHu8WXa1WrJ9Uq+AeqxYgKFumJCom4uXkZeXfHmOnX5kc35ihHh0gHxhamdxbWZlZU9VZFxBVF8+Sig+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5uspqW2qKCLmqCfnLOzqZ+jn521mKCzqKqrnq+tnqybla+ooo6Im46vrKinoqeZrpKZj6iZop2ln5mjoqWZn6Opsqi8r6Wonp2OfYublaCgmY+SmpuRmpipoKGZqK6npaajpam7n6DGp6Wpoau0tayupp67rayslYCpkqOvjpuAh6SXmJCBgLjDuoOOnJOEp5acgqyKgq+IppubpaqRftW9wqpio7+9fX6jgoPXuri1hZSTg569voRqo4Fvq4RtnX96srDHg2qrsL2seHeivrx0gZaOp5yQm5GYnXqCkZt6Y317ZI1neYJ7YGtla2piUGFbU2pcQFVhQ04qPTo0Lx4fJB4lMiAdJCgwNDk2Njc3Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWztLG/ubG9sqKdrqalsqadjJilv6q4saihv6amspyesZy5qJ6tr6WnlJSwq5eMg5uRrqajrKGknKmfmIujkqaep5yaoKiimJ6grK2qua6oo5qXknuHmZGmm5KOkZiYj5iUqZqgmKmpoaqnoaKru56pxaOgr6Oqs7Sqr6mguqeurppzdaqkt4ZliaBwZ62Pio9tb3ikj5mfgXWumZVwj4txlaijm5eupHJtbW1linhvbYKZcYB5aXFpZ4mWlZhxaGmEhmdwhmRdiWNqb1ldZ353pmBicY6Rb2VkgI2Tj6KYmJmSl599h46VdmaHeGiOa3l/eWRsY2ZsYktkV0psWTpRZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOpubmys6qpoa6eo7KpmJK+ssPIvraqnsCrrKOgp6yfuqOkraytpo2XrqmQjIWVlq2epqqhn6OjoJGLpJKnmaiZlqOpoJacpaanr7qrrJqbkpJ7hJeNpZiNkZGYlI6YlaiVn5ipo5uxp56jrLqfsMGnpLOmrLCxqq2rp7ijrbeWiqCopbadiZaimIepmpCUnZOqs5mbo6ugsZahoZ2fopygpKGVq6eNk5KMh5KcnJSQmpOYkI6VhYGkmpeVjYuSkoqPhoR9Z4p/dIJ2dIeLcKdte5SRk5KBgY6QkI+dlKGWmZeig4iUjXJpkHdwi3h3fHpqbGRkb2RVYFhAaVtIY2FPWitGPSsnITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERkpLS01QUFFYVVZZXmBhY1xeVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCmlqmqpbW2rq6isKStn6C1sZCOrMa9xLu4qqKlnpumnrCoo7annam1pqiRmKyii4iJj5ynlqykoJmnnp6TlaOWqJqomZSmoaOQm6iZobW6p6uYmpCNfIGUi6CUipSRlZCQlJelkJ+aqqCctqOdp6y3p67BrqO3p6+vsKypqbK4oK68mZGlpKa2opKdpp+NqZ+Nkp+jrK+boaOwqK+Xo6Cco6menp2clqudkpmhm5SQlqqZjZmZlpCWnpGJoJ2VlIWSjJCNlIqAfWaLhnWGdnmIg3OcaoaQlJSQiX2MlpKSl5Ohk52XooSImId6cpZzeop/cnx/am9kXnBqYFtfWW5jUGBlUFs6R0dFPjI9PTcvKyYrKSYdJjQwNjY1ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFiYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mnraCntaqQkJ2ls7uvrKyio5p6naKxpKWwqZabuKajk5mqnI6Giomco5Cun6OVp5+gkpaYm66KqpaPqJmnjJmoj565tqSlmJuNiXmCk4uak4mVkpSQjZKXoo2enqmenrikgISvtaKwr3WkvqOyoHd5oKqxu5R1rKSeiYCqf2RcYnagjqSehJd+bpOznaOnraqjZZ2fknN5mZdwgJiol2x/oqiKZZylnJGXmJWLkZyQhp2akJWDkoaPjpKJhHdqjod2hnF8hoCAYWmHipSSi1p1lZBoaI+OcnqmmZlleZmHgniYaoOKg295gGtxZV92cGxraFxmZWJicFNcPk1OTlNHPkBUQzoxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS01UVFVZXWBoZmdXUEo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpuVpqOhr7Gsq6mlqa6jp62lkpartrCyppqqp6uXc4ydsJ+oq6eTl7mgoI+cpJ2Rf4iIm56NrJqilKehno6XkZ6Eda6PiKaaqJGXpIiburSnoJmYi4l1d5ONlpOKlJGQlIyQk6COm6CnmZyyloCMnLWds4ySj7ynoH6nonqirreBjo6mnoOLhpCxqa+MipajmnmBi6yGnJ2ip6mnh5WFmHelm3qHm4GXpoKCe5yxeoqFoJeZlJiVgZGXloSZmWN5h5CEjo+RioNtcI+HeYBxgIGFf4Z0hoSVkniWaJJ0oJp0fZmEoZ6HmH6Si4ODmWuOjYVseHtxcWdkeG5qbGpbZWtqZnRcX0hUTFFARTUuWVVVNykhMDk9PjY0MzU2ODs6PT4+QERJQEpFSktHU1hbWVthYGhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq6uq6isoKixpqeqpZmUrsi+sKGWpqm1no+Dnaycp6KgjZC+npqNn5qgkH2Gj5mXiKycoZafoJGNk4iGgJGojYeinKOTl56Gnrqyp56bko6FcHWQiZWQipSPj5uLj5KfkpegpJaerIiftIm0mq2Kyoeqroi3hYyvgrCug6mNpZiNnXyoj3J7d5yPp5ZolaR5tIufnqaokpjCgX+riJihcZ6AmaR9l4WVsYChfKGUoJCYloCOk5uKl5GLfIWSho2UkomDbXOQhX96coaBhHyEdYSBl4CPxWZ/qYePo2ueg6Kbg5qAjI6FiplwjpOFaHd0fHdoaHVxZ2hrXmRvbWdtWGhHXVJNMkU0Nk5hYzcmMzxER0Q5NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYV1qbFxRRT1LTUBKZFldY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJein7Coqailq6CkubGqq6aalKCjpKqjlqWqt6Ovf6GnnKWenYmUvZqTjaGRnZB5hJaWkYirmZubmaGFj4x2m5yPn5CInqSblZmYhqK5rqSZnIyMfmJtj4uTkI2QjI2Yi5CSn4+UoKGZoah+oaeHrZ2glq2PnpydkYWAoI2qroajjamZjJp+onaAmZRrgqx1Tat4h42dkZuop4Cpq32DoXt6p2mef5JrZ5eGl7aJnn1uYGRZg5Z/jHtkaIpymX15lWxde5ZtX1Nwg1xfa3mDYFllgn2DgJdwp6prg6NucqVwn4SfaWWfbFtuinxmWmCDf2JXUG93Zm10cmtqb15qcG1salhpT11YRjlBNEdEX2s0LElDUU1OPTg0ODU5OzZAOzs9QU8+UVJMTUJKXF1fV15eYnZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWNpa2RiZGRnZGJnZWFjaJeWnaC5oaqjpqyRoba8rK6jmZegoqWsraGdrrWiqJKhoJ+mm5mNmLSZkIufjJWMdYGUkoyKppaVmJ6ef5KFhaykh5uQipiomJmakYelsaeilZqIiYBpboiIi46OiouNkouQkqKMlJ6gnKKlf5OBj6OhlKB3nJaPp4Ohp3+GqayEpXiKfISafaJwcpOIlnuejHlth5yMmZCbqJqPh517gqJzdqZmnn52pF+Yen2Sc6JumLe0unSSh4J/tahkgca4e3CVt4txgJqkY3Osq2B9ap2zfm58hoKOgouYcX+jbHKjc56EgKRgnJizlnF8l5+0dHNbnrKDamJvdHZyaG9Ya2xzc2ZdaV5iS0U9RDVRQVpyMj1TR19KUj08Mzk1Ojo2RDs7QElRP1VNTlFARV9eW1lYYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS3ta6toJuinKOjpq2cm7GtrJOXoZmhpJmalJ6rm4uJkniLhnCAlo2Jj6GQkpSdl32QiY6ooIeYjoqRopObmoyKqKilno+Wh4R+a3uHf32QjYOLkJCJj5Sgg5eeoJ2gn4uJd5yYooyfcqGLh6iIm6WPlqeqfq2MfnqgmXqjk3iBdJaIjZx9lqCHm46Zm6aGomShfIiWkJuNbJ5om41umpl7gIqnfXJodKuDnYN0qmeUml2bhXaEnWiqaoC4ZlyocIGcYZWMXqd2doiJf55omnWGk5KXjn+fbpqQbaeZXah+eLtrfqpbjoRdtGdcbnJ5eGtpXHFqeXljYGZYYkFRRU43VkNSbjRLWlpfTlpEQDE1MTs7N0g/OkNIVT9ZUlldPkRiXlZgUWFjfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4ljlJururKwrJ2mnJyon56um56wqKydl6SaoZ+Ylpago5mGiY1qiIBye5eIi5aWhJGUmI96ioSWo52KlI+Fi52RnJyIj6ijoJmLkYqAgGmAhnl/l4x7iI6OiI+Wmn+Top+goZOYcmifip+PjHCSjIGph5ieoqefp3yvraOiuJd3o7OipICIlHmde6uaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZl+dKpaXW97lot4nmJMfnp6hWN5l0JMnlmianF8jm2BiYSZdZt4homxs39/m5OndoGdbXJ9lG+Zc2qkXZV2SGVjYHNxfn9uZmBsaXZ7ZGViUl5XXVVWQFlGUWdEU1dbYlheSUQ9Qjg/QTpJRThMRVdBVlFbVkRGYlxaYEtgbX5xRUM8VV9iWmVqVmdobW9iZmdeYWFcXV5haGJfZWN2bF5lZ2ZrZGZsaWhraZOdgbGtmYRUXqCms7mzs6maooycq5ycqZShq6ShqI+fnp2amZWYoJ2WiIeJd4WBbnmVhZCbi3yRk5aIcn+IkqGbc5GQgIiYlJ+ahI6pnJqUiouKfINshIVxgqGMeIWNiIiSmJV8k6OhnqKIroZ9tYSOnpx7pZZ6qYGVnI+KoJx8p2h3bX6ZdKFzcXyehplwk4OufaSDpp6agKNvXqhndaNjb6VhnNOQfHuZeHJzY6KFkH6jc6OPdWuQs4tggpiJc6qyqLx/d4Ntfr6mqbRenG59cZdugHOicl2kZ3OmYWimbZvUmX2Emm94epdrm3t3l3NtqaRnYGV5cICEa2dmZG52d2dgY1NbZlFRYUhXSVRgV1NbZWpcZVFGQ0tNSktCSkU4UEBRTldSWU9TUWBmZWlTY3d5d0lGRWNeZVpoaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+xq1RcS36pr7G0sLOjm5mFmaigoKSOpKigmKmKmZiYk5mTkqCYjoiGe3B9hGh9j4OUmoF3kY6OiW9/hpCTkmyXk3yIkZGjlYOOqpqUkouFiXmDdoiAboKfh3eAk4aImaKWepOipJqfibOhoraLeqynpK6lcKiAmpCFgJuRe6SAoZmGmHKehKOur4qXjH+MpI2Wg66hlHa0tbXJoXOUioGfYJ2XqW15lYagm3Whh3egfpGWioBvTGajknCbh3Kke3l0YYOBa36ga3FkYJxyfnSXaXpps7W0xqZzmH56nWucm6t1hJttdXeYaZp6dZhxUEV9tF5qdmt5iGZqaGJ0dXBuVl5UWWlQU2hJVUxZU1VdaGtuVmdXTUpBSk1LSEpOQVFLUGVjaW1ldXNzf3l8bnWJe3tUUE5sXmhba2lSamhpbGdsZmNlX1xdXF5pYmRpa3tfXWRoY2pmb21laWxloZyIr6aEZj+UobKrr6+2oqKQgJepoqKljKWnnZ2mgpqXlo2XkI+ck46Ig3lqeYZlg4x/l6B5dY+JjIFphIWSg4yFnY16jIqVpZKDl6mXjJGLgYl6gH2LeXCQoYZ5gZWHiZaglX+UpaiclpaEZm54nGyiZHxxpXebmHBnpoCWi3ukep+Wg5dynnaBipSWj7lukIqiYn2ZoZWIbXJpq2p1oG1upl+aaYuQaJaHmpV1ooB9mmCLhYx0b4hiaKBlnn5pmnVvY2aIgm1yolpfW2OhbV2JjG97fnNyZKVtd6JkZ6domXOMmW+ib1OJkG+gX2WnVIteVJhubXNrcoJtcGlreXNrb1JZV1dmWlNtSVhPXUlYaWhzallrVlFSRVZcTFhSYVVoal93dHp9cHx8coN7f3N2jYCEdl5RcmJnYnBnUGpoaGtsbmhkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ykmKZ6ZXRti6eupKmwsaafi4CXq52fpYyioZqiooCWmJONmo+LmJCOinuGcYCIaIuLfJibc3SJfZB7ZIKHlYqJlZmCfIiGlqeQgKGskIWQioKKfYCAjnNoj6WEfYaUjYiYoI6Ik6qnnYmmeJabf6SIloyymJ6Qgq+Xn6V3lId5qXSkjoSabqSijJKEjIO7bn2lr4KGhoaTlpygfKV6caiVoJZmnn5vq2OWipWSd6hsqaKBiXWHgnerkaaHapGwa3azjKlrioZtbZ+ekpVhf6uLqnZ/f4ylnnaffYSklZ2gapuId6xnn62NtnR3vo2kk1mDpo2rYXVydHB8dHFjan5uaGxTVltWYWJda01dUl1JXW1tdmBbcVlbYFpndGVub3FjcXRgeHp+eXJ5g3OEfoB7e4yBgoB2YnhkY21zZFJrZ2hvbHJqZmlhX15cYmtibWx6b1xcYmlibGp3bWdsbmKVpaqdgYCepJapqp2op66kmYmDmKuanqSJmqWdqZ2FjJqOhpyRhZKNjI10hnqIhG+NhH6Yk3R0hnKSg21/i5KHhpOPfHuBhZeljX+lpo6BjomFlXaCh5JvbIupgYOLlI6JnJ+JjZSro6CPgHWUloh+gXmUrqN/gZtxj4V4j4qDfntypoxxfX16l5abhI54e35+h5SVk4p2kJifoIN6fYlrjIVbeXhyenBobn6SiXF/dIKPlJNxhYOCZYx/XoF/i3d1c5R1b3lubodthIVedmh4jmWAgYWOqZt9dHyWaomIb4B2fYZ2bW1njHN5e5h4hFtrWHmPaW53cnFveHhwXWyGbmpnVlpgV11la2NWYVVfUV9weHlsa3ZlamtqdnxxcnRzYW91YnR7gXh1eoN2gIB/gHiLhYN9e21/bGR4bl5XbmdodWt4amlqZFxgWmNqZWxxdW5aW2JrZGxseW1obG9hjpS4qKaLoaKapqSZpJyroqGEhJiskp6hiZqmm6mYg4Gbin6Wk4eOiomNcoN8j31+j4V7l45zcoRwlYV7fZKLhoaQhXh+f4aYo417p6GLhpCQhZaDho6Yd3KFqYaOkpyQiJ6eh4ybqJ+gqoOJjZSafn6Jlq2oj5Kmj3dvnZGCeZFvfaiFcH2VcWtwfYGfjH+TjoxobV2Di4ycm56Oc5WLiHF0a4F2dIFZcm6HkYF9foxqXWpkeoWDiIBfaXh6m3uCi4J2gYaCZ3eKhmthcHKCdl9yi4GJj6aVhWaMj4Nud4uEcYaPenBmZ2R7g3qWW1xqZ252W3t5d3Vuc3OCZlxtimtsY1lZXltZbHFcX2FaXl1mdH57dW90Y2trant9cnt4dGRtdGhtfH52enx8enqAgH5vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbWxnc3lvaGptYIuLqbChkKOhmp6emJ6ZqKOifoOYrY2flYibopGllX97mIR8kpmJiIaHinN9gIt2hYuBhJaKcW+AcpiGg36ThIOGioF6gIOLm5+Pgqehh3iOmImVi4udl4WDeq2CkZiZlIqenYeIoaufoqKji4iTm5yjmZaqoaemoJKbh5WNe3eNjoSnfn+SkZKTnLGmm5WekI2yk5iEpYyMlZufiZCbgoiRimt8jXd4ZYKGkIp8iZ2Eh4uQiIiAhYSQd3x5dJqhiIaJnoqElH59i4GBdXBzhYN/d4eHipCmkYSFjYeDjZCMfYiLiZCCd2yChH16mWpyaGF0inB9end2b3Z0gV1eb4dob2BeWlxdU2hyVWNcXGFsaHV8fHNvcGRraml/fG55f3FpcHBsZoF7coKAeH99f4V7bYKMhXx6eHx9eoN5TmR2anJtcHpka2ViYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2WMh525npaioZiVmZiUmaShnnx/mquOno2GoJyLnpZ9eZSDe46ZiYaEhIZueICAcoGHfomUhG1rfnqXhoODkH+AhoSGfIaDjZudkoeqn4NyipCGk5GLnZF9jXqqhI2SmJaPnJeHh5umn6KanYaDkZqZmZCapqClnZ2QloCQinZ7h46EpXt8jpCRhpiqoZ6TnZCOq46RgJ6MiJOanoKOl36GjYJvd4VxdWF+go+GdYuYgYOPgoaEfoWDlG14dXSSooqMhZmFhI10gIl8fXJye4eEe3iLjoSSpo+Gg4+BhIqKineGiImMfG9rfoF8bmhsbWdeen9ofHt2dHZ1e3dcYHB9bnVgY1tdXlFnblRlW15ha2l2en5xbGxka2pngIBsc4BrbHRveW+EeW2GgHaCgH2EdnGCjYd+e3t8f3uCimBpe2p1aGmCZWpjYGlcZHVob2J0bWxVY3F5ZXB6enJlaW1ti4met5qho5+SkZaXi5qfn557eJ6mkZuKh6WUi5iZeXqMhXyJkYOMgoKCbnx/eHOBhX2LkX1raH2Bl4iBiI58fYWEh3yPgI+bm5GIp51/cIuLjJOHoaGKhY18qJGIkJKXk5aTeIyjoKGdlpp/gJCamJKMmqOho5qXkZt+jYR4gIOOh6B/fYyNj3yYpKChk5mQkKeNkIGbkYmSl5t9kpJ+ho2BdHOCcHZgfX+NhnKKlXyIjHGMf4KFho5od3F4jJiRj3+WfoeKcoGGfH1weHuLhHp6kYyDlqWTi4aQfIaGh4V2goSIiHplcnx/eHpxbGpmXn5zaHx1dnR8c4BqXmB0dnB4ZGNZX15Sa2hUZVlfYWhqdniBcWZrY2xoZX+Ba219aG9xa314hnpri4FzgYF+gXR2go2Gfnx6f4F9f49qcoNuc2lhh2hsYl9xVnRvbW5geGhtV2p0dmN1e3pyYmpueYmNnrKSpaWcjpCYj4adoZudfHakoI6Xf42iioialnh7hod+g4l/iYKBf3F/e3R2goV+ipF4Z2N9hpeKgoqNeH2AjIN5loCVl5aNlaCbfm+MgpGUhqabh42JhKaVhZOLlpeTkneRnaGhl5SXen6OmJeOlpqdpJ2YkpSbeY+FgneElo2dfoGJjYxzl6KeopOZjo+ijIyDl5iDkpaZfpiNfIiNgXZxfW56ZIB8ioVwhpJ/kIJsh4KBgImEZXVve4eSl4x8k3iLiXt/hnx7cX53iYV5hJCKi5eilYKEjHeIhIOCd3yCiYV2YHh4fXR+eGdsZGF/aWp3c3R1fXF8YmNhc251c21hWmFeW2xlUmNYYGFpa3Z5hnFiamNtZWh9g2xodGhsb2mAfIF5bZCGcYCDg390fIOMgX9+eoKDfnyQbXaJdHRtZYpsamJjdVaDaXFuYHhnbGJqdnBmeXt5cV9ybIaFj5yul6aono2Nl4eGn5OXmX14qpyKmXqXnYuMmJB5e4CLfXyDe4CDgXh0eHpzfYCEf4mLgGRefYuVh36Fh3R9fol/fZeEl5OWjKOhmH9yh3uUkoqnj4yOipOgkoOSkJSXkYuBj5igmpKQkXN/jZKUiZ2dnqaXl42VlnONjoprhZePmXqHiJCJb5edmqOTlYqNn4yHgpKcf5KSlYaZiHyJiYF5cXlrdWx7fYt+bYWSgpR3cIKDfX6Kf2RyaXuAlpeEfo1zkIiDeId+dXiAfYaAfIOMhIyUpI95hIJ0iYd9gHR2gYiEbmF7dXpxfW9hb2Nke2Jub3ZzeHdzdGF1X29sdW5vXFtfXl5rXlBdWGNhaG10e4hrX2plamNod4huZmxoamxogXx7d2+Qh3OBg4R9c4GGiXqCfXqBhH19jnJ6i3h4bmyHa2hfaXJih2hyb2V2Z25sYXloa317eHBhd22LgJmZqqCjqJ2Ki5KGip6LlZh9d66YjJd9npSRlpSId357inx7gHZ3f4BwdHN7b4V9gYCKf3xhXH6PkYZ/hIRzeoCGeo+Rh5KRm5KlnJWCfoF9jouSpImOio2Ymo2GkZiTlo6KiIySnJOQjIxug4+PkYmemaKhl5aJlpFuiJmEZoWYjpR6iYWQi3CWmpSikpKJi5qMgn+RnnySj5KLmY57ioSHc3J1a3FudHuLdG6FkI2ScXSAe4GBiHxkcGx4fZmTfYSIdJCKgHOIeW+AfYCGfIWMiISMlaiMe4h8fouFeH5xcICFg2NoeXR1cHxiXnBga3RecGp7eXhrc3BleF1tbHNtc1haXl9ia1pQV1hlY2dxcX+HZl1paGdiZ3GNb2RpZ2RpaIB6d3RujoV0gYKDe3WCiYV3hXx4hIV6gIl3f4t7e3J5g2prX3BodIBrcm9tcWdvbGV8Y26AeXZxbHd3in6il6GooKabh4yLgZCch5OcdYGqlJKOh6CNlpOQgHR7doV3eH9yc3uFa3Jwem2KdoCBh25xW1h+kY2IgICAdnWAgH+ghpCKkpyXoZSYeIp/gY2JnJ6Kj4aSmJaFiZWZj5aLi42NjZ2KjpCDbYiKkJGJnJahnJiVhZeIaoSjgmaFnYqRfouDi4F3k5iSn5KRiYmVjn9+kJh7kY2PjZqSfIp/gm51cGxtb3B7hWlzg46YinB3f3SCiIJ4ZnJvdYGZjnyIhHqUkXl2iHRwiXuFjHqLhoOJjpujiHyEdoKLf3h4b2uBg4FecnNycXB4Wl5wYHBqXm9pfHpwbW1qbHZgcG9qcm1aWGFhYm5YUVRaZmdjdXCEgmJda21kYmZrk21gZmZfZ2uBdXFycIuAdX+DgHh1gIuAeIV/d4eGd4OFe4aMf3t2ioBqcWN8Y4Z8b3FtdGpob2x2d19xf3l7dHV0gIJ+pJWarZ6mloWMg3+XlIOQn3WLn5SThouajJWNi3pyeHSCcHKFdHF1iGtvbXVtiHaDfoBtblVRgauUh4J4gHZygnmBoIKRgZOSmJySmniSe4ONk6Sak46JlZmShIeXmYyUi4mPj4iehJCKfHKKhYmOiJyan5qWlICTfmiFnIdnhaCHkoORg4lxg5GXj5uOkI2MkI14e5KQeo6LjJGWjHyIfIBrdmpua2tsen9hen6OloJ2eoB4g4x8eWdzbHSHlYt+iIZ7k5BxeoRwdox6iYx7iX2CjJCenYV8fHeCjH13cWpsgYJ5YHhvbWxydFZeb2JyYF9sbnlwZ3BmZnN0aHBrYXdlXVZmYGByU1FOXGZlXXlwiHxfXGhyYmJlZpJqX2hkW2dwfnBrcHOKfXZ8hYB0dX+MeXuGgXiIg3OGhX6MjIR7eZV4Z3Jqg2CIfm9va3pgam50f3RfdH14hnh0c4V8eKCPmbCcpY+Cin+DmoiAjJ9/i5qTjoWIl46Oj4R2dHZzgHBvhXNwcYNwaml2boNufXxtdXNSTYLfyJLWk3xwdYN1g6CCk3eVkZmbkJl7lHOFkJ+hk5SQipOblIZ+lpaIjY2IkY2InH+OgHd6jH6Ii4qcnJ2alZN6jXZniZGHbIijhJKHl4OGY4yRmY6VipeMjYqLcXuUiHuOiIqSkYl5hXt+bHtlcm9qa3l5XIB5kI6Ben1+f4aOenloc2pzi4+JgYWFfZWLa35+boCLfouHfYR6gY+VmpqKfHZ4g5B5c21mcICDbWp0b2hqdG5TXm9kcFlfa3J4ZmtqYmZ4cm9wY194YGBWa19edlBOS2BnY116cYl0XFxldmBhZWWPZGBlYVhpc3NtanF2jHx0eYaCdXZ+i3N/hn97iX5yiYeBkYqIfH6YdmVzbnxlh35vcGt/WWxueXlzYXZ6e412c3eKd3mfi5uvm6CQgoV3iJV+fYqdh4WfkY6FjJeEk46HgXR3cHlxboRvbW5+cmRkeHF9bXl9amhsY6Sawdyu76Fza3WDdYSihZJvlpCVoJWcgZFxhoujl4mOlouQnZaDgJWQhYmPgJKKiZZ+h3p1f4l4hoSNnJuYmI6Pdop2boaJi32Ko4SRiZ2FhV6Lk5eKj4mOi4uEim18loF9iIWJkI+GdoV9fWt9ZHh1aW54c1iIepKGhnl+gICFi354ZXNqf4mOiYKCgIyWhWuBdm6IkIKPhH+Cen+QlZOZkHRzeIeNdXNxZ3V6g2J0bXBianZnUmBxZ2xVX250eWFyY19ofXBybltjcmFiV25aXHhNTUxkZ2FednOJbVxcZHleYGRmhWBjYl5ZanJrbmtzd4t9dHeEgXh3e4lxg4R9foh7dIuJiJaHjH5+mHNodXF5bIt6bnRwgFdxenZ5cWV3eYaMaXeAiXJ/nIeZp5yjkoR9cIyUeHmLnYSFoY2Ne5aNf5mIhHtyd3Bzam+Ba2ltfHReYHh3e3F1e2dhZXzr2rXJw9yIc2x0gXaKmoiNaZiPj52Vk4GJcYWJoI2Ei5aKjJiUfI2TiIOJj3uRi4WPgn92eIODcoeCk5uWlJiGjHWHf3CEgomGmKGDlIyfg4lhg5SPh4qGio2HgYdpfZR/fYOEiY6NgnGGfn9xd2h2cmlzd2xajHySgoZ9f4OAhImCdWFza4iBj4qCfn+SkH1tgmx4ho+GkYN9gX2AkpOQlohvcXqMhnVscWxyeIFfdGluXWt2YFJlcmlmU19wdnRgb2BdaIJwcmpXZ2hjaVhtVlx1TEtMZWdeYnJzhWlbXGV5Xl5kZ3tgZF9cWWtuZm5pdHeKfnNzgX56dnqIc4WCfICHdneKho6YgYyBe5N2bHd1eXiTdG54en1YeYVxgG9neHeSgmR2hoVxipWFmaGaooqHdG+Ti3J3jpx9ipqJiXyff4OZf4F4cXNtb2RyfmlmbHd4W155e3txcYBqYWdhf9W2jpCmeG5xd3twkpCMh2qZjoickoyFe2mIi5qHgZKRhoeYjXyNjYGBiY57kI1+iYV6dHuCenCGgJaZjpOUgYh1g4Z2g3+KkpyfhpWPn36IYYCTh4WIhIqOgH+DZ32RgH5/goyOkH5tgnyCdGttdnRzdnVrYo2Bj3+FfnyEf4SIfm9fcnCFe4+Mgnx+kYh6cINmeYOKhouDfIR+gJSPkJKEbm95jH51bm9rbHp9Y2hralludlpSaXJqYlFicnhsYmVdWmqDbXNhW2dfZGxfblRbcE5IT2dlXGducYBsW1tjc2BcY2x3ZGVdXVpsbGJtanN2h39xb398fHR4hniFgn2Ah3V5iYGSlnyIhnaJgXB3eXuDk29tfIF3XoN/dIFtaXp0lHNnc4d8cpGRg5qfm6CGiHZ2lX5tdpSXfoiQg4qNmnyLmnZ9dnFvbGphdXxnYml1elpfeHx6bXF/ZWRoZ1edj15xcpa8xIR2cZSJkH5yl4yGnJOMiHNriY+WgXuUi4GEm4x8i4Z9fImMf5SIdYmFdnZ9gXF1hoGelIaVj4OCcX+IdIN7iZicl4aTjp2AiGV9k4KAhoSJiXKBfWd9i3t5f3+Hi498aYB9g3Zmb3h4c3ZzbGqNhYqBin94goCEg39qXnF4en2MiYV7gY+AfnKBaXiCh4uFhHiDfIGYjI+MfW5te4l9d3RvaGh9dmRccWNYb3NTU25zaWFOZnR4ZmBdXFhugG5zWWViXWptYHBPWWxSRFRoYVprbm17b1pbXm1jWmJvd2NmXF1ga2pjbGlzdoGDcW5+e390dYN6g4J8gYV2fomBlpF4g4p0gYhyeXl+jZBvb3yBcWmBeXp+bW18dpVraniEdGyTjYWfmKCZhYhufYx2aniYj3+CioKVl4p5j5ZvenNwbGpkYHN6aF9lcntaYHJ8eWdwemFlZY6xsndKYlqk2dCXcXuRi5B4fZWLhZmRjYZvbIaSknp5koaBhJiKfId/eHiJioSWgG+Kh3F0fnppeYWDpZGEk42Df29+g3aDeIWbmJOKkpCUhYdwe5KDfYODiYNvgXhogIV4cn9/g4qHfGV9foN2Y3BzgGh4cG90mIyFgop7dniAhHmBalxwfXKAh4WJfYaJeohygW5xg4aOhIRzhHiAmYyNhHhubn6Ef3d7ZWhqfXFgWXdaWXFuTlhyc2dgS2x2dGFdW1tZdH1yb1dnXWZqcF9vTldpUj9ZZl9acGtneXFbW1hrZVljcHlfaFxeZWxoZmxpcHd/h25sf32AdXCBeoCBf4J/doGFiZeKcYKNcXuGfHp5hJOMdGp6f2tvfnR/fW9yfHuUb26Af3hnkoqCoZmckoKGZ4eEcGh6lol+f4WCmYqBfI2MaHhya2xmX2FveG1fYm95XGRsg3phcXZfZWXU6r6KMjo+i46AcnmFiI6NdoOXjX6Tjo1/bmyFjYx2fY9/hYKViXyDeG52h4SDl3duiIRsdXt0ZnmCg6eMg4+LhH1uf3R2g3mFm5CLkJGSjIuGfnuSh3iAhI2DbIByaX9+eG18e4KKhHhheYSBcWRxaH5tdHF1gZuLgH+FfnN2fYBzgG9bbH50eIqCi3uGgHyIeHpxbIiDj4OKcoF5f5aLin50bWt2gIB1dl1paXhwWVd8U1pxZUxbcnJlW0pwd29cW1pZXXR+dGhZYltnZW5jaU1XZlE9XmZcXXZmX3RwW1lUb2RZZXB5WmheX2dtZ2psaW93fY5saYKEfnlugHt8gH+CenWCgYyThXCAi253foB7e4iTiX9oe31qdHtyhntzd31/jHl4hH18a4yMg5udloyBgGyOfmtpf46Ne35/g5SCf32KiGt1cWdoY1tiZ3JvYGFsc2FocIl6YXN0XmNkm6CPblw1Wa+1dWqAiX2ShnaGl4Z0j4uKd3BthYOHdXmJeIl9k4h6f3Nndoh+fphvcIZ9aHZ5bWV5iISlh4GHjYl+bn51f4B8i5mHgpOQmIiLhIl8j4hxe32EfGl+bWuAe3pqenaCh4ByYHeBfnFkcmd1gm11e4WUkYF8gX9vd3l8dH5sV29+dnSLgYZ3h3WCiXp4cm6JgI6AhXJ+fX6SiIl6bm5pbYKCdW5daGZ0clJbe05ccVxPXHJwY1ZLc3hqV1lZWmFxgHRgXV1gZ2RoaWZOWmhOQGFkW2B2YVx0bVhXU3RhWmRucldqXmFoa2dtbGlwd3ySa2iEiXx8cH5+e4F/gnp3gICJi4Rxe4dvcXeDf3uKjY+Dan57bnd5dop3fXiAgod/g35+em2EjIiYo42Eg3t2jHprbYSJkXl9e4KRgIB+ioNwcnBjZl5ZZ19wcGBgZ3Bmam+KdWF0b1thZGp2e3++nKajyLhxhYRzlH14hpSCdJCNiHJycIR7g3R1h3SId5SIeXlxY3eGeoCTaXKEdWZ3dmNqfIOInoKAf4+PfXJ+c4R4f5GQgniWjZSPh4KIeomJbHh5f3Voe2lrf3lzaXp2gIN9aGB3h31qa3Roe39pdoGLkJR+en5+cHt2e3N+YlV2fHJzioSCfYNwhop3eHBwg4KMfn15fnx1joWCdWlxaWyHgnJwXmhjc25LZXVMXm9VVFlzbmJQT3N4YVJXWFxhcIJzW2FcaGVkY2pkUFtxSURkYVxjcV5dd2hVV1V3XVtlbmhWa15hamdlb29pcHZ7k25piIx5fXJ7fniCgYJ8dn2DiIaDcHaDcm53goN+iYuTf3CAfHh5eoGMdIN4f4GBgoR6gHVvfomLmp6IfYV6d4d8aHSGjZF6f398iYaEdo+AZ29tX2RcWGVZbXJhYGFxbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4cI11e4ePgHqTioB1dHV+d4BwcX9thHSUhnh1bGB6gnmIjmZxg29ndW5bbX2AkJOAgXmSkn14e22HdYCQi4NzloqRjoeFhXuAhW11dn9uaHdlbXt2bWp2dn9/fGFieIZ6aHR1Y316Z3WGjoyVe3SAdXGAenxsf1lWc31vdISHf4B5a4iGc3lrdH+Dg316fXh7couAfHJndGVtioNtdFtrX3VlSG5uTFtiV1dWeG1iT1N0dlhQVVheYXGEb1xgY21kY11uYlRdckdDZl9dZmhdWnpjUlVcdVtbZ2thVmpfYG5mZmtxaHB1eI50a46MdX92eH53gYOBe3R+g4iIg29xf3RxdX6GgomNint3f3iEfHyFh3iHfH2BfoWAe35zdnmMjp+NiXqKdnWDeV5+hpqMeYeDdIWGhXeJemJubFtiW1thVmpzY2BbZ25vZ4dyYXFmV11ja398ys6HuaJqbW2KbHGEcXyEin57koV6eXR5dXV7am11Y4R1kYJ3cGdefYJ5i4llcYFranFjWGx7hpyIgoJzl5R3fntuh3GBiYuHcZaOkIiFi4N7eX5xcW9+Z2hyYm54cWpscXd9fHpdZXmAd2l1eGaCdmd0h4uNlHxyh2lvfoB4bXxdWHF+bXOAi3yBbm+Jf3F2Z3d/gX+BdnxxenSGfHlyZnNhbouCbHNYa193XElva05XVl5UVXtrYU9UdXJRUVRWXmJ0hWhcYGtqZmJZbmFYYnBHQWhdYGZeXVV7Xk9WZHBZW2poXVdnYF9yZmtncmdwcneGeG6VinR/end+eYKHgHVzgIaFjoJwcHt3d3V6h4aHjIZ6fH91i359hYSEh39+fn2Hf3x4dnl3kZOff4x9i211gHlkg4iXhnOSim+FhYF6g3RjbmpZX1tdXVRnc2VgWWRycmeBc2JrZVdaYGl/d76ue5+3bmJzhmh0fHJ6g4Z6fYx/eHhzdm97dmVqbmCHdY6Bc2piXn54eYqDZnF9aGprWlZveIqkgYV/cZmTcYB4dYFtgIGQh3KUiIyHg4iFfXl0cm9oemFqbWBtdmpna2t5d3p3W2d9fHhlcn1uhHRldYWMhpV/b4tma3qDdGx0YlxvfGt0e4t7gmZ1h31tcWd1fnh9f3J8bHp6gXp3cGVsYm2Jfm1uVmtgd1ZLamtPUk9oTll8aGJOVXVqTFBUVV5mdoNmXWFwaGdgV2ldW2toSkVrWmJkV1lVeVpOVm1qWV1sZVxZZWNedGZtZHFmcm90gHdwmoV2f353f3yFh311c4KIf5SCbnN4enpzc4WHiYiEeIB9do9/fISJjoSChHt+i4N7d3x3d5qdl3qKg4dpd358bISFlIByj4JxhoJ+gn9vZmxnV11bXFtUZHBlX1hjc3VpdnBlZWJXXFxogHBvcoBziWRleH5pdHZzc4OFeIGEeXd0dW5re3FhZ2tnhnSNhG5mXV99b3uJfWhsd2ZpZFVXcnCNpnyEfHaWkHN8c3t5bXt6kIR2mHyHhoKGg311cHJsZ3VdbWhfbHVkZ2Zpem97cllngXd1Z3CAeIJ1YneFinyUgG6Lam16gHBlcmVgbHlmcneKe35idYN2aWtxdHpweXhyfWZ+f394dm5jZWFthnxta1ZrY3FTTGlrUExPcEdee2ZhTVV0Y0pOU1dganZ9ZV1nc2llX1ZjV2FwXUxLa1hjYVVUVHNXTFh1ZFpfa2BcWmNlX3dmbWJwaXNucX50dJmBd3+Ad39+hoR6fXWChH6XhW5ydHt6dHGFhY+CgHqLdXSQgH2BlI6AhYR8foyGen6AdnujpYp5iIWEbHV8e3WEgox6boVzeoV9gYN1bmpoZVZdW1paU2JuZVtYYXR7amhtaV9iV19aaYBqa2+AZ2xhaHl5a3R0dG6FgXp/fXZ1bnpoanlqX2VuaYF3j4RnZVhid2l+h3pvaW9mZl1VWG9oj6d2gXp8kI55dW9+b3J1eY5/d5R0hYJ/hYh1anJ2Z2hvXG1lXm1zX2dhaXhoe21bbYJyc2lvgH55d2F3hIR4j4RziHFveX9xYnBoW253ZHBziHx5YnOAcGdqeHNya3d2dHdjg3t+d3ZwZGNjbnx9a2xWamNnU0tsaFBHUmxFYXhmYU1TcV1JTVRZZWt3emVebXBpZF1WX1VubldLU2hYZl5YTVVsVUpceV9bX2tdXVpiZWB6aGxhb291bm93dXqYfXeAgXqAf4eGenl6g36Bk4RxdHR+enZ0hYiQfYB9kGxzlIF7gp+Ff4d9gH6GgoCKe3aErJ9/eoiHhGxygnp2gYCBdW6Hb3yAc4mAam9tZGRYX1pZWlViamdbWl91gmlebWxcYVZcXGuBZnJ0fWlqXWt2dmh0d3Fthnt+fXl2cmx6aGl3Zl1kc2h6d5KBY2NUZW9mgoR3dmZoaWBXVlloZJCnbn54gIuOenBwfGZ4bnmLe3aOcYR9fn+GbmR2c2RoaF1rYl1vb1tnX2x1ZXpoXXSAb3JrcXt+dXVidIWKeoeGgH93cnV+dGFwbFlwc2JxcoV8dGRygGxhbHpvamh5d3RxZoV1enp1cGRhZG5zfmpsVWpeXlRMc2NRR1diR2J2ZmFLVG9XSkxYWGdrdnpkZW5wZmNaWF1YdmVUSlxjWGhYWUhXZVFIYnhaXV9sW15cYWRef2lqYG90eG1vbnaDl3lygYB9f4iLhn12doZ4h4x9c3V1gXh6eoKMjn1+hIlqdJaBe4qdfX6FeYB6fnyGiHNxj66Me3uGkH5mcoh6dH19dnJvhmx7fmyPemJwb2FlXmVWWVlXY2ZrX11dc4VoWXBuWl5XWlxse2Nwd3ZsYlttc3RndXVwbYV5f4B5d25vdGVpdGVbZ3VmdnaRel9dUmZmaoKBc31hY2lcVFheYmOQpWh5dIKFkHhtbnlnd217hHp1iHKAeHx4f2hldm1gZmFfamBddGtZZV1vb2J6ZVt3e2tubnB4eHR0ZHKDkn6Hgoh6dm9xfXJhd2RabnBhcHGCfHNmcoBkXm52aWNmeXp0bW6BdXN8c3FiXmZub31lalRpWVlUTnhfUkpaWUhidGNhSVRtU0lMWlZpbHJ7Ymxsc2JhWVpbYXZcU0tkXVhpU1dHWWBOR2l1WF5hbVtbX2JiXYVoaGFueHlsbmp2gZB5boN+gIGSiISBdnSJdIyGc3F3doF3fH1+jI+AfpN+cHiWg32ZknmAgHh5fn9ziINzcJmie3p/iZV5ZHWIeXN4dmx0b35seXxwkXJecG5gZ2JsVFpZV2hjbWVcXHGJZVNybltaWFhgbHZkaXVqal5abXNxbHRzdGqGfH6AfHdvbmxkaXFjW2pyZHR2j3NbVlNkYHF/fnGBXGFjXVNaYFxjkp9lcnGFhJF0bGp5bG9vent6cYB2fnJ6enpkZXVnXmJaYWdcXndoV2Jdb2hhd2Fbe3ZqaXJvd3RzdGhwgZSChn6EdnJqcHtsZnZXW2ptYnBzgXpzZm9+W2BwcWJeaXB8bGtzfnJxeGtwYFxlbG17YWhUZ1VXUlB2W1NQWlJIY3NiYEdValBIT1pVa2trfGVtb3FgW1pYWWxwV1JQZldXaVNURlpcT0hydVhfY21jWGFgYV2LaWNkbXl4a25pdXmGe2uDfX+EmXyChHl9iG6PhnFvd3p8dIKCfIuPg4KWdHiClIWBn4l1gICBdH+CcIeCdW+il3R7houHe2Z4i29ue29meHB6bHN2c41rXnRuYWdla1JdW1VnYmxsW1xxjGRPb25dVlhVZ2l0aGJ0ZWVdWm51bnB1dXprh3x/fIh3kHNjZWtvYVxubWNzeIdrWlRWYmN3fHxwhVxjX2NUW2BZY5aVY25wg4WKc2poem5lcnZze2x6dHVven51X2ZyY1teV2JkWWF1ZVVfYG1kYXFdXX5waGlzcXNwdXVrbYSTgYh7hXFyZm58b3FuU1plamVxdIF2c2JtdlVicWtbXm5lfGVsdXxycnJqbWBZZGpqeF9nVGVVVlBVblhRV1RQSGVyX2FGV2lOSFhUVm1pZHxpa3drYVdcVVt0Y1NSV2hRWWZUU0haWlBOeHdbX2ZsaVpiYF5ej25iZmt5dW5vaHZ2f35tg4B+hpd7f4eBin9rk4hyZ3SAe3WAg32Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9gnVupYxzgY2Ld3hueoxgZHxxZnpzeWxtcXaDZ2R8bGNmZ2hTX15UZ2Bsb1xebo5oTmltYFRWU29mc2tleGRlXVlwdG1yenhzbYh7gHece3prYWVsbV5gb2plcHl+Z1pWWGBrd3t7b4NeYl5nVllgV2SciGJrcYGHfXdrandsW3Zxa3lpdXJtb3uAclhqbV9ZXVZiY1hlcWNTXmFpYmJsWmB+bGZrc3VubXd2a2iFjH+IeodtcWVve2xxbGJYX2hob3SBc3JeaW1TZXBlVWJuYXlicHZ7dWtvbGpfWGFnaHVdZVZiVlNOWWZTT11PT0hlb11jR1lpTUlfS1htZF94aG59ZGBVXlRddFtUUmBmTl1hVFNKXFpRWXV1XV9mbWhYYmFbXo5xY2dqd3FzbWh2dHmDc4KDeoiNfnyKh456bpCKdGxzgnR/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6NjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjoyMjY2NjY2Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENERERERUIxLzAwMC8sgKSgoKCgo4BjZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU1Mx4cHBwcHBh+qaSkpKSnfFxfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4iHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYaFg4ODhISEg4yQj4+Pj4+LiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpOQio+Mjo+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo6Ojo6Pj4+PjYyMjIyMjIyNjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIyIh4qGjYaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkY2IioWOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCPh42MhoyIiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIyEiYeGiIWJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYiKiouNio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTkpKTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKSkpKRkZGRkpOTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkZGQkZGSjZCSkZGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+Pj4+Ij5B9jJCQj4+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+OjnuNjHaKj46Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjIyOc4eKc4WOjI2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4NugoJwf4iFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV1dnd1cWZtanFzb2doa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGdsZ2lmcm5oZ2NiYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXlxlZl5ybF1eWllfW1hXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST05QU2FiWWtkVFFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BZaGhiaWJRT09OT1BQUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQ0ZKTWNya2dwalVOTUxNT09PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkA/QEJQbHNtaXNxX09LS1JMSEhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz49QklCPE9pcG1kcnRmRUpeVEZCREVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7OztBWVE+RWZtaWBwcWlSYWZFRUZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTpHW1NTY2pqbnFtamhtVD5DRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODpNY2NpbGpyb21rbGNAPUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT5dbW9wbXFubGtsTzs+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtdbT8+Q0tmcnFvcG5qa108Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O212SDg8OUtrcm9wbmtnRzs4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVE8PT1JTEVGdXZNNzg5OEpscnJwbVM7PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3l7d1Y8Pj89PUpmd21SPT0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KChIOCg4B9XT5AQ0BBPkV0Vjs8PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hHVNQUNFQEBBTnZqSEBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFcEJERURDWHWGiIl+WEdJSkxMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN2d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVWyEh4aGhoeHiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUlISElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVYGDhISCgoWGhoOChoWEhIaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4SEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqLjIuKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCCg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ozo7ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3eXt6e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISEhomKioiHiIiIioqMiomJjHo+OTg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0+Ozs8PTo+Ozk7Ozw7PDw5OTw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3V0dnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPj09PkA/Pz9AP0A9PT9CP0FBP0FAPUBAQD4/QT0+PDs6Ozk5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+Q0dJS0pJRkdHREZIR0VCQEBDRUNDQUJDQj9AREhEQ0VERUVBRkVGREVGREBCPzxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERliFgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFdHTE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JCR0dJWYWCg4WFhoeIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTEpJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktHRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAOTg8Ozw9Oj9APj9AQ0ZJSVBfgoOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNck5RT01MTEtMSkhIRUpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLX1JSUE1OTUtKR0ZCR0pHTEpGS05LS0pKTU1MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0VHSEZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418WFZSUlRST0xLSkRFRktPTk9XVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRklKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/Q0JGVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toVlVrYUVSUVFQSTs7UVNSYHVdVVZUVllZUllYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0hISkhFRklJSUhJaXJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSUdGRkU/P0FBRUJDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXV1WXVpWRVFZWltZX1RaZ1JVVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlRSVlZUWlp1g1lVfZBgXFhdX1dJVl1dW1tfWUlZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVVRXUlFXVmOWgFFlclhaV19nUGBmW1tYXGdhR09aaGdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haW1xeVFFRUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5TY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxtcnV2dXRzd3t6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hCQ0hHSEtHREJBREFPUE1TZHN0dnVzdHZ6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc/Pzs7PkBAPz8+alFLYUVGSElFQj9HTE1HTVFVSUJFPz88PTw9PT89P0FDQ0A/PD1CPkpNRlVudXV1c3R2eHp8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGRCQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87Qkg/XHN0dXZ1dnh6fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWEdGRkhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RV1BNSURGPjo5NjU4Nzk3OTozNjY3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1RUU1FRVU9MUlNUV1hUVFhSTFdZWlZYWFZYWV1XV1hoc2tdVmFza2FhX15kYV9eWVVQTU9OTElISktJSEZDUVBTWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODU3NTc4NTk5R25xdHd4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxQUlJPTU1OTk5MSkZRUFVZU1ROSk9PVVNUXFZSVVNST01LSUhIRj8+PTo3ODc2NTk5Njc2NzVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI8WE1JQVE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEtPUlBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I0NTY2OmRvcXV3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZGQUZHR0hGSkRISkhHRUhMSEtIRkxNUE1HL0VfUj4zQD5qb2FSUlFARlVRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dnl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEVGSEpNS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFdXVUxMS0g9OTg3Oz9APjw9QUBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hQUmFcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0lKTExKRkZGRD9CQz48QkY/Qj9BZHBzd3p6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz9CQEA+QURJRUNHR0lGSUVCQj8+PUNCQUdKRU1PYmVRTU5OV0tMTUtMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QEJCQURFR0tGQ0lJR0dIQ0M/Qj8/QEE+REVDS05RVExKSU1URklJSkxKS0xJSkxNT1BSUEtHQ0tHQ0JKSkxNT01JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEtDR0hIR0pLSUpLREdCPT49Ojo6O0BCPz1CQkJDSEZKTEpESUlGR0dDQztBQEI+QEBDRENJTVBHSUtHSEtESElLTUhKTEhJSktKTV1SSEhETUdBREtLTU1QTktNSktGR0dKTU5RTkxibWl2dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo6QENAPkJDREVJRkpKTEZJSUdGRkRCO0JDQz5ARERDRUdMTkhLTkhESEVJTE5NSElMR0ZHSUlMTktKSEVOSUJGTUxPTU9NTk5NS0lISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmVrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKQ0VGRUJDQkVAREI+QD46Ozs9Oj0+Q0E+QUNFR0pGSUhLSEdHR0ZFQ0A9RUVCPkJEQ0NFR0hJR01QSkZGR0tOT0tGSEpGRURFSUpIS0lGSFBLRElNTFBNT05PT05LSkhNUlVUUk9XZGBhbWdwcm9yeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTUhERUdDQkBCRD1CQT5BPTo6PT87Pj5AQj5AQkRHS0ZJRklIRkZHRUNCQUFGRkNCQ0JERUVHR0hGTFFMSU9KSkxMSUdIRUZFRENJSUhLSkdLUk1CTk9NUE9PT05PT0tLS09VV1ZVVFhfXlxpYW1pbmhyc2JlZmVkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0dGSEJCQERFPEFAQEM8ODk9Pjk/PD9CQEBAREZIRUhGRkdGRUVEQ0VDRElGQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSElGQ0lKSUtNS09TTkRRUlBRUk5PTU5QTUxNU1dWV1hWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlvek1IR0hIQkJCRkU8P0JCRDw3Oj4+Oj46QEI+Pz9DRUZERkRER0VERUNERUZHSkVFSUdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTE9PUlRPSFNVU1FTUFFNTlFOTVBXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ5TklIR0lEQUNIRTxARUJFPTg6Pj49PDxBQjw/PkFCRkNFQkNJRUNFRUZHR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OUFJVVk9LVVdUUVRRUkxPUVBPVFlaWVxaWVteXl5gY15cYWNrYmBkZ2hyhWhnamZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHVNSUtISkVCRUdFPEBHQ0RAOjw+QD8+P0NCPEA+QUFGQ0VERElFRkVHRUhIRkhHSUtJRkpISEtIRkZMSEhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlBWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvdkpLTEpMR0JFREU8QEZEREI7Pz9BQEBAQ0E/Qj9BQ0hCRkVGSEZJRkZESUhHSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OT0tPUFJVWFZNTlRWVFNSUVBMTlRTUldbXl5fXV1gX2BhYV9hY2ViY2hiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93S01MTE1HQ0NBRDw/RUVFQz1BQUNCQkNFQUJEQUFFR0NHSEdHRkpHQ0hJR0dKRklMSElKTUtNTEdLSUhMS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJCRUdDQ0lGQ0hKSklJS0dES0pHSEpJSUtISkpOTE5MSUxISk1LWmZKZFxLbFNIT05fblVrc1txcGJ3Y1JQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSktKRkM/QEI/PURFRkRDREJFRUVGQkVGSENESkVFSkxNS0xMR0dNSkdJS0hLS0lLSk5MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW14bWx2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9CQj8+QkZHQkZDRURFRURDSEhHREVLR0dMTU5LTU1HSk5ISktKSUxLSkpLTU1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPUBARkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklMS0lKTUlKSkpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lERUVDQUI8QkBCRkRHRkxIRUNDSEtISEZKTExGTktMU1JMR0xNSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ubm9vcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQD5DREJHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1MSUtLS1NrYlppXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG9qaWRbcGZkcFxaXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkZISEtNSUhKSUtLSUhJR0tLTExGSEtLTExMS0lLTE5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZXJpVFlXW1tcVVlaXVhdXFxjZmFhZWJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DSERGR0NJS0xIRkRHS0xIREdIUEtMT0tMV0xJRUVISUpISUtJTEpIRkdHSUdISUVGTElKS05MSU9cV15QXFtgXk9YWVNcXGJeTVlaTVhhUkpZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkVJRUdHRktKS0hFRUpKSkdFSEhQSk1NSk1TSUhGQUhGSklLTElMSkhGRUlHREZHRUVKSENKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl5cXlNbXmNeWl1gY2BZX2JbYF5bVFhXWV5dY2JjYWNmaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDR0dFSEdIS0lJSURGS0tLRkZJSk5LTkxITE5ISEY+R0dMSUtLSktLSUdFSURDRERCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFeXmNhYGJiYmNjZVpRWVZVXFpdY2BfX2NlYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUhJRkdISEZGSkdIRkhLSUxEREtKTk1MS0hKSkhKRz9HRk5KS0tNS0tLSUdHQ0RAREFISUI/SUpIT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlOXlFPXF9hY2RjY2JcZGNiZGNmWFFVVFJbWFphX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNFS0pGRkZIR0dJRkZGSUxKTkVES0pMTkpMSUtKSElGQkhIUU1LS09NS0tJSEdFRD9FQ0hIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVllgUlFfX2FiYWBiYmBjYmFkZGJYT1FRUVtTW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUdGREdNUkhDUUpGSEhIRUZLSk1QRUdISktOTExJTEtJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUdFQ1dVRVxUXlNWX1hOVFVOWltNSktUYGFbX1heXmFdT1liXGBgX2JjYl1hYldfX1RQTk9QWFJdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUENWXklHR0hERk1KUFBFSUlKS05MS0tNTEpKR0RKTVFRTk5PTU5MTkhLQURBQ0RGRENBRUZCTUhCS0xQT05MRk1GR0lKSEdMTE1PUElMT1BPU1BMUVNSVVpZV1lYWGRXT1NUUFBOTU9VVFtZWVtdXGBhZGVjZ2NrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTUdISkhHTUxRUUlMS0tLTk5VTk9LS0xHRktQU1NOUE9OT05PSEtFYEVEX0xEZmNFTVtJXltybU9NVW1ZTENQYFVsV2dKXVdVXkRMUVVMTVRWUVJUWFdUWFVUXFVQZlpoaGRYU2tTVlZVW1xbYGBhYWFiYGZoZm5saHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPU0lLRmBUSEpPSklPTVJRS01MTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1hQbUhxbm9hVlBxcXNQQ2tzbXF0cFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVVd/anR1dV9fdl9YYVxcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTkJETExGSkxGUVZMS05JS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFlSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1menV4cXF6cX5zfWt1fWJSZ3xlc3Nvc3J7fG99eW9/cl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhLS0hKUE5NTUpOVl5ZVUxRU05ZWk1TU1JOTE9JUVJUWVdXUFRQUFBRS0dmeGxjeHJtWktNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUml7bGlqenp9bHh6f29nb1h2dmp1dXCAYHJnfWlseHxvXl9fYmFbXWJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNCRVBQSEpLSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRLaHh9eGB5e3NuYV5tb2NSZ3F1bm15cHdsdnR0cWxtXHR+emtteXxrdG18a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBJTE1LTFFRUVBQUVdcWVVNVVlVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhlfGlyfF1US2xgdnVraXZ8e21+eGt8cF1eXmJbX2JkZGdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsZ21tcnxrbWhre3RtbWttT0hKS0hJSUhRUExOT0xLU1NTT1NSV1JWVFBXW1ZWVFRUYWBQTk5LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VSU1dbV1hXWk9TVVdXWFJdWVddVlRPWVJXV1dYWV5bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZWFBPTE1WVFFOVVNOT01MUVBLSlFSS1FNS0tPUlRSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NQUVVVVlNaUU9TUldWVFlWVFlVVFJVVFRUV1hXXVpeYV1cWlpcXGBjXF1iY2RmZGVkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhUUVBLT1dTUE5VUE5RTktTUE1PVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUT1RVWFVVWlVXWVVSUlhWVVdbWVpfXVVZXlxeXVxdYGFeW2JiY2dmZGRiWF9gYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RWllYV1haWlhZVlxqZFZYWVpXVlRUUEtPVlRQT1RQUFBOTVFRUFJYVFFRT01PU1ZOV1JUVVVPTk1RU1VVVFRSVFhWWl1cWlZXUVJXWFZbW1dRVFZWVlZZVFhXVFNSWFZVWl1ZXV9eVl5dXmBcXGBfX19aYmJkaGdkZGFZYmBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGRfW1lWVlhRTE1WU01OUk9RUk9MUFNSVVpVU1BQTFBXVlJXU1NTWE1PUFJUWFVVVVNVWVhbXl1bW1ZST1VWVltbV1FUV1ZXWFZUWFpUU1JaV1ZcXlpeX2BVYVxhYV1gYmBdYF1jYWNnaGRmYFljYGFfX2VkX2BjW1pcW1xZWlhZV1xZXFtgXl9bXl5hYF9iXFlgWlFOT05WUVBUUk9VVFNQV1xdXFheXF9XXF5qcXd5gGNcW1ZWWFFOT1ZTTlFRUFJUUktRVFRZWldVT1JOU1hXVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFVWXFxWUlRWVlhZU1RZXFRTU11YWl1eXGBgYFZiW2NiXmFjX11iYWJfZGZpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUVdSVFBbXV5eW2BcYFVcXWlqcn1zbGdcVVhXUU9SWlNSUVRSVFVUS1FXVltZWlNPU1JWVlZUT1ZSU1pSVFVUWF1XWFhTWFxYXl1ZWl1UVU5WV1dfW1hRVFVZWVlVV1lbVFNWXlldXWBdYmJeWWBbZWJfZGRfXmNjYV1lZmlkZl1eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBaVFVWVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWVVRUVNcVFVUVVRWWVdMUlpXXVtcUk9VU1hWVlRQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlNUVlpZWlZYWVxWVFpeXF5gYV9kY1xeXV1lYWJmZF5fZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXV9UXV5iZWV2gntoWFlZU1ZTVlxXV1dWVlddWFBVXVpeXV1UUlhTV1ZUU1RYUlNWVFhYWF1eWF1bVl1fWF9fWF1WUVlUWVpaYVlcVVZYW1pbWFlZWlhWXV5fXmNiYWRkXGJcYGZhZGZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lXVlxgYWJjYWNeX1ZbYGRhX3p1b2hZXFpVV1VXW1pZXFlYWWBXUFZeXGBhXFRVWFBVV1VTV1ZSU1VWWlpcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1laWVleX2BgZGJjZWViZFpiZmNnZmVeYWJgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJga2ZoXlxdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZYUVdWV1ZXVlNWVFhcXF5gYF1hXFdhXlteXFteWFZYWFtbX2BcX1hZXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYGBlY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5SV1lWV1pYW1xYV1leYGJhZWFkYV1eWWFjYl9hYGFeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQWFdYWVlXVlhWXV1eYGFgX2JeWWFdXV5ZXV5ZWFZXW1xgX11fWlpeXV5eYVxbW1pcYGFeYmRjZWZlZmJaZGZnaWdjX2NeYWZkWmlpYmZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFdXXFlXXFtcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl1bXFtYV1tcX11gX11bYGRcXFhaY2VjYFJcWU9YWFpbWllYWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX19cWl5eYGJjXFxYW15gYmFjZWRnZWVmZFxlZmhpZmNiYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYUFhaXWFjZmZya39KWVddWlpfXFteXFhdW15fYWNiYWFdYltiZGJgY2NiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUVlYXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl5fWlhWW19eXWFhX11bYGFiZWJfXVRcYGBjZGRmZGdmZWZlXmVmaGhnZGRgW2ZnXmFoaGNoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7fHx8fHt8e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3x9fXx8fH18enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiYmMjY2NjY2QRigqKioqIovb0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMjY+QkJCQkJQ7FhoaGhsQj+/l5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl5eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9fX19fX19fXZzc3Nzc3N9hYSEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z4e3h6eXl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7enp6fH19fX19fXt6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8fHt9enx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3l8e355fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHl5fHp8e3d4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp/e3t8e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXx7enp5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJwcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcXFycnFxcXBwcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwdXJwcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXF6cW+Ldm9wcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcY1zc5h4cHFxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnFwl3t2oH9wcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3Sfgnukh3F0dHNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHd3d3d4f6eMiKaQd3x7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t7fH1+qZKGpZV6e3t7eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fHx/fIKrnIqilX19f39/fHx9gIOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgICAgIKAmq+op6eVf39/gIGAfn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/f4GBgIWspqWvpp+Cf35/fn5+f39+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn5/gX9+j6mZoqqbo49/gH5/gH+AgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBg4OCgYGfoZOfpJifmICAhI6Cf4CBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGDi4uFgZidip2qm52ahIibkoKDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GFlZuMkp2Tna6Zk56fn5qIh4eHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKNpaqsqaOdpZmdpKKdkIeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOTpqihnJ+am56fnpaEhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOCgoSRl5aYnZmcnpyajICAgIB+gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOBf4ONkpaal5ugnZOEg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mXiISChYaQlpmXnJ+biIGEg4GBgIGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhIqTmZWanJCCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSDg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2MnI2AgoGCg4eSjZGOg4GBgoODgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GYjICDgIGCgISJiIGBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2Kh4ODg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeKfoSEg4SCg4ODgoSDgIKCg4OCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4WDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn9+fn1/g4SDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYKBgX59gYeGg4B+fn9/f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYaFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn58e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn1+fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomJg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4OEg4ORkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX59fX+Afn5+fn18fX18eXyDhoaHhIOBg4OEhYWFg4OFhISEhISEhYSCgoKBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Cf3+Ag4ODg4OCgn99fn+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICCg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59gIKDg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn9/gH59gH9+gICBf4CAgX9/f4CBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAgH5/fn5+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f39+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5+fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enl5eXl5gIKCgoSDgYKDgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYOCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyJk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWCiIWCgYGBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g4yEg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDgoKCkpCLiImHiYeGhoSGhYWEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRko6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GAfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICAgoGCgICBgYB/i5SPjIuOjoyIh4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyCgIF+f4F8fn5/f32AgoGAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkoyMjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDg3+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f35/jJGOjI2OjY2HhIaGhYSEhIOCg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX5/f31+gH5/foSSjYyMj42LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX58e3x8fHt7en1+gICDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjIuNi4mHhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgX+AgHx8fXt8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoGCgYWGhYWGhoeFgYSRj42KiYuHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fX9+fHx8fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKOjIiJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fX19fXx9fX18fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkY+NioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eXl7fn+Eg4SHiYqHiY6PjYuJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgYCAgIOBf4CBhIF+foB/fn6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH2Jh4eFhYeFhYWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeDhISFhISDhIOBgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn6AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn59fX9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCg4KDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWBhISFhISEgYOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBfn58fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgYKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/fn9/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoGAf35/gX5/gIKCgIGDgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHuAfoCAf4GBgH99gH5+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4ODg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gICAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9e3x8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx7fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYGBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhIODhIGBg4GCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgoCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4ODhIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYSFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhYSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoKCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISEhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xudoKBgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhYSEhYeGhISFhoWFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn6BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGiIWHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOCgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhYWHhYWHhYaFhoWEg4SDg4SHgYOAgoODgoKCf4B7fX59fHx8fn18fX18fnt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GDgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhICAg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaGhoWDhIOGgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIWFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3p6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dTU1dXU1NTU1NXV1dXV1dXV1dXV1dXV1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX1dXV1NTU1NXV1dXV1dXW19fX19fX19fW1tbW1tbT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4utHT09PT09PT09PU1NTVybu9vb29vb29vb29vby/0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPT5ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjoqfP09LS0tLS0tLS0tLS1L+oqqqqqqqqqqqqqqqosNLS0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKOoz9PS0tLS0tLS0tLS0tTBqaurq6urq6urq6urqrHR0tLS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozw8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamprM/T0tLS0tLS0tPT09PVwq2vr6+vr6+vr6+vr6620tLS0tLS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLU1dXV1dXV1dXU09PT1NPS0tLS0tLS0tLS0tPT0tXU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7T1NDO0dTU087O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1NTU1NTU1tXW1tbW1tbW1tbX1tbW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7QppLF1K2Dg5XP0qSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQD06ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Sqp2slcObvLiZtLOfoanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/QyZeZhaafqI6AjcWdmJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw9OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9GksL2ajKOJrNa6mKKdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0NW5m4urrZulspmWr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9DRmqClpJyWp5CahJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDVp6Sg1aS0q59/oKmFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDSwJ2iyNfK2cGcgLytppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT1KSgj7nDj6Gfn5molpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyMamvZWTk6irop/DoKuknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEE+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNTKjpOXkKqrjY+s2MKPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS1MKvsLPQ1sC/1tLVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHU1tbW0tLV1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Nzc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njg5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpaampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyBc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqGgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnp2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJuamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWmpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo57amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ozw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6SioaCem5mZmJmZmZmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzs6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaGhn56cm5qampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+em5qam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5qZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmZmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmJudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJibm5ycoZ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJSZmZiVm6aWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4SMlouMipGci46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomQjpaCjH6OkoyIhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9ho2Zm5CEjHuNio+Ken19ho6NioaNlJKLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLhoiFhIiIiYR/gn96fHqJlZGQgoVphoWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+iZCLf4eNjIuKh5KKh4aNm5aLkYh/X4aFiIyOi46KiZCPjo+UlJiQlZyanZ6orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ2gnZOXmqCZnZuioZWQm6yRk5uYe1mGj4mRkY6SjouYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKuqqa+hmqCsio6hn3ZZg5mNmJSYoKChpJ6bmqWnpKmrr6ylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuur6qqq6ShoqSpp6apqKKmpIWGp6N0W3OgmZ2Yn6GiqaegoqKurKuqp62vqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpaepp6moo6emmZykpqKhoaGhpZyCgqGicmNmmZ+elp+bmqKioKGfoaKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXVxQVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn6WSgH6dnXFoX42ioZucmpygnqGfnp6go5mWm5ikoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq7CpqKqooZ+gp6mtsLKvrKOipqGuinx+pZ5valyEpKWinp2gnp+loqKen6KYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbWmBfWlxWXGhkbmNuamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66ruYN3fbKmbGlYfqWio5qcnJeiqKWhn56jm52hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnlqYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLh6cnGwr2dmVIGlnp+WlZqXpKqmpqGko6SrpqWZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHVrcWhpaWFZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1tby8vry8vsa6uLe6vbSud25lrLdrYFKNraWlnZekpKeopK6kq6u1ta+zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb62qX51aaK2dWBWnLWurqqqp6ynp6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5ea2Nibnd1dm5sW2JRVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+t6aJfn2Vo4Rtaqq8rK+vtKmqpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha21mbnVxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/DybCWiHuGjJGJeYChuLCfmrCurKStsLSnqqmoqq2sqaalnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/vLu+xL7FyMbGxMTEubTAt7S7xcudgnhmdoSGfGx8hqa2qpmit7CmsLu1rK6lpKOopKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyeHN5ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsnFv8PAy83PysfEw8TCxL64vcq9iW5hU2J9fmlVZ3CNs6qdprSzrLLAtbOsqaOhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF1rb254d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzs/PzMPHxsjJyMfKzsrJx8jHv8bLpHleTkhUd3VeRFlieae3wL6+uay5wbq8rK2mqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhqaXRteGxdZFtWYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M7HzMnCwsfBzNXXzcvKzsXJvIprUEU/TnBoWD1OXGyVxMzGxrCZusS7vrSwsLDBvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnRiXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPEv7++xMvIysvJvLzIxsnV29XNycnFyad2WkxXRUpoXVY9SVZje7zQxrCQibnCu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZmNqZGJqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMnDy9nTyMPCwcaiaUxilWpIYVZYQU1VXmmv1r2TdoW8uru7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2RkamNnY1taWlxZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrRwb3P07y0vL29rmxGgL6PSmBXWkRUX1tfosaje2iTw7e7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJjaGpnZ2lmaV1WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3r663tbm/u8LWi7q/wtm5oaWvtLh3SYOrjkxoZWNCVXNgV5GfgmxlqMa/vMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXhxbWVlZm9pZWxoWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zQxHOpy77czZqPlqKwgU1xfnBXf3hxTlaBZVV4dmtjbsHGxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZmJtYFxUSUtKREpCQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wuLuyvb67xLa1uLW3wL7EvMLE2Ktwf7zI1N6yhIWPmX1VY2ZWcpmCfm5VdGNaY2JhXIXSx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxpbnRueGNnYlxjUUtUSEVFQ0hDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vcfKysPHydKUbHGt0dDb1JJ2fH90XmJdTpWlg4SJVF1dXFlZWGGq0snHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fY15gYU5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvG08O6vrzEvre8wL/J0MfIysrAgm5vo8vLz+C4c2prZ2BgV1WooYCDkl5YWVZRVVJ5xsvJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa7uarbw762vsC+vreimKavs8LAo3RydJnEx8rW14ZXVVFPUEVbn5F5g4lnWlRPTk9WnMnLxsLAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4c2dwXVteXVlSRURDTUlBRT1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xrVsq828tbnAvKd6bGduanJ/lZZtdHeVvb/GwdWoVUJAPkI5Wol9cX9/aVtTTExOdrfAwcK+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX99dmx1e3BuaVtfX1pTUEFGSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM6xdoCyvLW2waGFaVpfX0xSW1ttbnJ9nbi3wri9u3NENTU5NFJyampzcGRfV0xLXKDAurm3tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN1dnducWBfZl1bVEo9Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLKpoR3iqGvtJhoY2ZVWWBKSk1QVGpzhKOvt765s7aeaDcwNTNGXVVeZGJgYl1PTHa0v7iyrrK8uq67tLOmq6itur64y8K/vqyrsK+zu7e5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2JbXk9IQj89SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqeIe3aNoZReU0JZVEhibFdQRklji5+qr7a6tbSyrZRQMzExQVBGUVdYWGBgUFyYubq0raWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWdYXF1STk5BPkpCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+zkIF5iI5rTkpAaFhCT3eDlmxMQld+sLSztbK0r66td0wwMD9FO0VWV1FYXVF8sLKxrKyepKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdGlsXVtqVF1cUE1IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO4tZWNiYR5VkZBUohXSkpWdoyAYT9Vp7iztLKwsa2wuaR7QC0+WnuXp6KSc1Valausq6OnoJ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFVhY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrupmJmVaE1AVnpuT0lJTGaaf1dFVa+7sayzr66srbW3oGZnk6mnn5qbnqB/d52ep6mfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mo5ujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn96Y3dsblxRaFRQTkdQTUxCT1FAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9waqmvWRFVaKDUFlJS2FKWIljZmaBrLWqsrSuqqqusK2rsKecj5aRjZaeoKCfmqOkn56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZm6SZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXZ9bWt7ZGhVUWNNSkhHT1JNSk5HPEVAPDJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgrMbAyppOQnedbk9vS05iZnVyYF9mdI2wr66ztaqmq6qinJiSjI+UlZaXmp6ioZucpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd4fGR5eWBiUlVgSElKS1NUSVJQTDk/QTY3PDY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKXGxohXUktmol5pfnJ2WVJrY11pZmVqi7SwsLispqCbnZmUl5mYjo2QlJCKjY2TmKKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSqsq6imZydnqGZm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk9PVUxTTEE3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqONeVVscnV1bWJ1clhZYF9kaV1gWGKsrqyvp5+doZ+WkJObn5qYlpGSnpuho5uem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVqd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgo35vgW5gZFdNW1JYS0tRV1FJUk9Dl6yqqaSfnpiSkpOYl5WUlIuHio2UnZydnZ6Xnpmmn6CopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6elpJ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXZtaG1cWFxDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn5yIYVdfZmBWTU9FPD4/Q0M+PUJRd6itqaqln52doqOdn52Zm5uTkpSTnZ2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Ops62qs7Wvs66qr6Odq6e2sa2isKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t0cnFoVlxRRlRIREpQST9FQTRGSDk1Oz42Ozw+PTw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+Te2BeZV9QRUU6REBGPD45Nk5+qrOno6OhoJ6lq6Wel5yUkZmdmJSMioaIhnhtiKCjoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8TKycPBxr66tLq6tbu3sLWyqrqyrru3v7u6q7itq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hrZVpbRktMRURTTURCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZyZe3JpYFVORD5KXH1wYkE9XI6urKCZm5uenpmXl5eSjI6Wl5OOjZCLgoOCd3JxbXCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcXM0dLVztPJvcC/w7vGxcjF0dPN09DT08zKwsXGxsrIzr/I0czHxsfFwbzDwb+/v7a+s66/wMPDx8THxK6/uLK4vMPCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTERFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWhkW1NIREA/TIqhqZqDoLKto56cn5qXlpSSlJaRkI+Mh4ODiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0tfS1dbT1MjMxszNydLNztPNxcjKysHGy8fJyMa/w7OzyMTLy8vPx8q/vr+9wcfEzMzIycDDv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZtiU0tJREI/RFaz0r2ysKacnJygpKGdmpSTlZSJfXdwa2ViaHFvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1dbZ1tfT19jO0srP0czP0M3T0L/Ix8rEzMzMzs/Fxse2v8q/0s3M0MbJyMDEw8jOzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUlKPjtBOD00NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKgWUlAQURAR1F5sq6nmpSXn5yaoKCem5yZlYl3aWNgX19gX15fX11ibHV0cHBvbHJxdZLEyMbU1tfX19PW0NXU2tTUzs/V1NTR0czRzdPX1tPV0M/S09HJ09HI0NfX2NHX0tjZ1NbMz8/KzdLLztDBxsPIxs7N0dHSyczNwMrMxtPPzM7IxcrHx8jMytTU0dXP0szTwrnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjq2VDOD0+RViCqqifmJWXmZqcn52YnJySfXBlY2JfX2FfX2FgX2BgX2BmbnBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NfXy8jOxMnPzcrMwMrAyMrNztDL0M7OzM7PyMvQ0MvOysLJx8nMy8zS083T0dHQ0Mq9yLmwrru4taq2sK2ouK2zvruxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw9ODc4NTU7PkA9OTw8ODs+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2ppLF6SkhDPViMoZuVk5ebnp6enJOWl5SIa15eXmFkYmBgYWFgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Uy87Oxc7K0tLPx87NzdTLztPNy9fW0MzR1MvM0NLTys7R1NLV1crAysLFzMLIycPMw8XIysrPys3M0M7TzMbIz8zIx8vFxsHGyszN0NHG0M7NzczPxcfBuLm9w8O9w7mysr6xu8PDtaqYpaGZlpGVlZKLlI2akZSUj4+UgomGeXFya21nYGBwaFlYaFZMRkxJUFBCO0M+OzY3Ojg6OjU3PT1BPDo8PDk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7Son66VeG9zdYKSmY2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYmBfX2BhYWBfXVtdZ3JycXJzcG1yeaXH08/L0M/T1MrFycnGxr/Dxs/Ox8XHzcrSyMvOzsbR0tDNzNTKx8vOz8jHz9LL0c/GusS/xsm9wsfJzsXCyMDHzcjEzMrMz8jExNDIxsLGyMS/wcfMzMzPwsrLyMfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrGyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raO2fWiDhKWrk42Nlo+Fg4ODgX2EhH5zYFteXl5gXmBjZGNfXF1eX2BgX1taXGBrcnJvb2tsb3B9udHIycrPy83EusDDu7u6ur7JxsLDwMPIy8nIysjBxczGyMvNycTCysnBwszQxcvIv7nBu8bIvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa9vMDDxczFxbzAysLFx9LFwMm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWbo6CblHt3cnRmaVphbmxaXFhSRExGQkdETERGU0A1NDMzND89Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrGvtWxfen6kkIqSloZ6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFtcXV1fXmBbWVpcYm9yb2tpbHBvc4/HvcnFzMDGwrC2urKys7Kxwry8vLq4wcHBxb69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7vGw7+8wc3Dxr6+tcG9w7q9xrvDurO8xcTCwre/tba+v7vMw7y1usi6v77LxMHGwsXJxsnG0MbCzMeyx8nDzszBxcPAvbO3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jV15ZSkZKRkhKQUVCRUlAOTo2NDg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NbXzcrPxcnFx8G5xb2rraVfZXWGk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYWFkZWJdXFtcXlxeXVpbXF5oc3FtZ2ducHJ5nb3MwMO6wLiusLGnqq2sp7i0t7Szs7S7tb6yt7C1r7K8wrzBxLzAu7Wyur7AuMe5tLu2wcK8uL3GwcO7ta+ytrq/tMS3u7WruL29wL2xurawtrqzxby2rru/tbe0xby+w8XAw8XGyMvFwMbGu8fLwM/Jx8PGwsO3w729trm+x7+stbq1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HFwL+6t8m2qrCZW2lxjI+FiIl6eH6Ghnd3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhma25ucnykx7+5uLWwq62nnqKpp56rrbOtqqyptK63sbOprqass7y6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCywLa4vbCxqLKztbu8q661pq62r7uysKq5sK27rru4u8DAvrnCv8fDxcC8xsLIyrjFx8W/x8TDusTGwrvGyczLs7nCvbuziXN2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PTlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHF0MfNwcPGv8TEw8PKwsnKv8C8wrqztLXDrqmwkVtqf5KHjo97eH2JhXp7hIB3bl5dXFxdX2BfX2RjYWRjYmBfXVpbWlpdWlpaWlxlbm9oZmdpa25yga25sLWupaSnp5qgpKGanKWsrqSooquqrauwo6afqq21trG9ua+3r6iuuLS0vLi0vK+4ubWyvMGywK6lqaOrsbKzqL2qq6irra20s6aoraGkr6mypqeorqaot6yxsre6uryxvL2+vsS/tcLBx8i3v8DFt8TDv7u/xMK+xMjMyr+/xMDAqYdzdHJqaV1hb2NXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QjuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvByr67yba9w766yrfBw8G0try2sa+1u62oq5NlbYiDh4uAe31/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqaWrpZ6boaWUnqWbmJGho6qjo6ClpqemraCdnKSmrLKwtrensKyoqrSrtLqxtrautrmyr7q6sbaloKSfprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6SgobGtrayytLO0sLW8trvBwLK6vsPBsrm5w7PBvcC1uLy9vrzCx8TDxL/AxKCDeHBsYmZfa29gVVleSE5nT1RIRUtGPD0/PTo7OzgyNTUzNjk6ODs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbagnpWdoaa6tquzs7uzxM/Jy8LGuLbHwMy/uMm3u8W4s8S4s7/ArLW8sqylr7OtoaOSaXGGhYaAfHl1c29tamppcGleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4edqJ+VlZqhlpyjmZaNn6Gjp5ygoKSloqeem6OboKuwrbG2o6mqqqyspLS5rbewrLO1rrO1rrCqn56fo6KypKapuK2ipqagqKyrmZ+gnpmdn6WamaOcm52vqaunqqysrbGyuK+4ubuwtry8uquzs7mzvrS2srG2tb+2vsC9w8K7ur2XhHpzbF9lXmRkWFRXXUlXXEtQR0lKR0E8Pz9AOz88MDQ1MzU6Ozk6ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7w8PPvrrHuLi/t7LCtLG7vKu5urGinqmrp5eekG1+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtxjaeck5SUm5ibopeWkZyioqienJ2lp6KlnKChm5mvrq6usqCmoq6rp6K1sbKyrKivs6e6s6a2oKKenKOhraOiqrWqoqOmnqWmo5aZnpeZm52gmpednZ2craKrp6Skpq2rs7SqtbCzq7K5tK+qr7Kys7izrqmsrrK4sLu2ur3AuLOxlIV5dWZeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzMjGv8W2wcDGzrfAxL2zubmzv7axubussrSvn5qkqZ+Umo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanahm5OUj5SXl6CXmZWXoJ6hnZagoamkn5+pnZubq6evsKubo6S4qqGgrqi2qqenrbGkuLCkt6Cim5mZqqahmqy4r6KhpJyin6CTlKGUlpabmJeWl5yVn6qeqaSinaOqqrCuqLSrqqets7Clq66zsbCwrq+nqKiyrbG0sLy0uriuo5SBeXVkXmFWWVhTUlRLTV5MT0tHR0xMRT1BPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ijqrvAvcC5rrS4wczHxcLDvcW4yMuywcLBrby7tbu8tbm5sK+wqpyZoaiUkYqLgIB8d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2NiY2JjZGZpgZaTlYuSlJScmZ2WlpygnJ+WoJ+npqSmp5+doKagqq+mn6Kkt6ihoaKotKKlqKWwpbGurLSeoZ2VlamhopStsbGfoqOdnpibk4uhlJGTmJiTl5eYl56nnKehopqkpaWrpKWwp6Wjq6utpqmur66rqKqqs6amrK+0sa+8tbGvr6CSendyZWFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsXHtsXEssK/xau3t722vbq6tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVTVVJVYGBfYGFfYWFiZWqAk5OJkI6Uk5SdlZaXpJmgl52gpaKtpqWlo6SjnKqrpZqfpbGqoKGepaueqKKeraypqa6toqKilZijm5yQq6mwnKCin56XmZOKnpGNkpOWkJiYlJyho52koaKVoKKkppujq6WipKqjq66lrrKppqWmprSmqaits7W0ubqvqqyejHJxb2BbV1ZWUkdRT0haW09SSVRLU0xFRklEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk1Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG+w8issbjBtbvAu7S0qqymlZqbnIiAcoiDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl9fX2JkbY6PhJGHj5COmpOVkpybo5yboaipq6isp6mmpJmlr6WVmaWvqqCcmZugnq+ZnKuzoKWmn6OkoZSTm5aWkqmqrZqcoKGgm5SQjJmOjJCMkY2WlZCdoqCjnZyjlZugo6GXoqijoqiroKuwpK23paOkoq2tqqirr7O3s761s6uvmIV0c2hbWVlTVVJFWExRW1hNVE5QTFBRSU5JQj0/P0E/PTc1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbuztaWpoJaXmJeHenSAdndubWhtbW1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGR+jIGLf4uPiZKNl5GXmaKgm6CsqqavrKiwpaman62glZakqaidmJCPmp6ul5ioqpmfnZSloZ6SkZKRk5WnqqWamZmenpaNjIuThomNg4+LkpWRoJ6hpJiVn5WaoaKelJulpaeoqKCxsaaxvKefoqy1q66nsLWwuLXAsa2xq5F+cnNiVlRVTlJKR1ZQUlFMTFdNSkxOUkdNS0FDRkRDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3Njc2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOX+zrKWxt6qlorGrnaqnqbKxpLbGtLm6s8rFubrBy9DKsba4u73Bw7GvsbettLO7s7Sio5ydl5eUg393a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3WIjIaQipeJlJOYm5meqZugq6amrJ6omqCmnJOPn6Obl5eFhJKbo5CVo52WlpaIopublIuOipCapKeclZWXm5GSh5SOi4GLjYCQipKSkqCaoKKWlJiZlaKmmY2ZpKaopqGgtLKnsrehnKK3rKqupLKyprW8tayrsaOJeXNtXU5RUUxPQ01OTlBLRk5OSkpNTlFITUpBR0tISEM9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrCkp6SqpaCopqWzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatuq+un5manZWUh3uDbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFvc3ZwhIiCiICRhI6KlJGUnqGPm5yjoqSYpZeinJWNh5majHSNg36Ol5aGkZqQlI6Oe5mPnYyCiX+JmJ+jnpCTmJaFjYKUfn50io56kIeTkJCdm5qakpaQnY6jo46JmqCho6SborSvrK+tn5iluKamsaGwrpywu6qpr6qZg3dzY1ZNUk9QTkNTTkxRTEJQUUhJTVJNSEpKREpMRkpKPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6alp6ans6eltMG4sLSwycS3ucHOxr2zrLrBq63DraehppKdpraso6CPlZaSj354fmVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVWWVtdaWxybH+FfHROWHKPgpeGjZ2Xi5SRn5idlZSWlY+WiYCTil87V298jJSJgIySjJCGhnOKhZeBeYF7hpOdk4OVjpGQg4Z9k3hxcIWNfYmBkY2Pl5qZk4uQiZ2In5iIh5aemqGgl6euqa2pqJ6WrbOipq2ZrKuYqLOiqa2jk35ybmBbTlNSV0xEVEpQTExGTk9JRUxRTUtPSklMUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaijqrCop7TBubC1sMfCt7O9z7+5r661wqeqxamjnZiDlJuxopqYhpSPi4d9c3VdUExSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l7gnRRQkB/lZKRfYmVjYSKjZuOlpWJkoiGlYZ5iX9gSlFueIuShH2EjYqFf39ufn+UeHV2eISNmW9RjYiKhnt+eJR2Z3eGiH2KiZWLjZGSl4yEioiVhJqMgoSSmpaenZSko6ippaSemrCroaSkkaaqlqKqnKKmqIl1bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foa+hp6ilp6iwraq2vLa3t7PBu7anusi4tqiotbaqsrymnpWNf4mTqJaVin6Og4J9eHBuWE1LTU1OS01RV1tcWlhaVVVWVlZXWVlYWFlZWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNSkRERElOT2hZTlFTVFVaboNzdn5qaVxVj4mUiXR/hoF8hYyTgpKai497ho+AdoB4c292cXSNjoF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4B2cnKSd2h1hISEhXuViYiKjYuAf4SLjICUg3yAj5iUnJaRnp2pnp+gnaCppZ6dmIynpJOhoJaen6SAcmhhXF1KV1BSR0pYUk9KTE1SSkpKTFBJTFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppa2ssLKqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjZSAjpyOkX92hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZneNl5iNj31oeYF2eICJkH2EmJKBcoePfHd7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfYmMiIBseXF9cW12j3FocYF+jnBDi4SCg4V/d3d6i4V9jHt1fo6Sj5iKkpqbo5aZnZqdnqGclo2KpJuOnpeOlpiQd29tZWJaWFhVUUpTVVRPUE5QVktOS05PSlFOSE9PTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsa+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZjoWSeYiOi4p1cXxtdXBqbWpYS0ZHRUFAQ0RJTExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcmyIp6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ7fX57dm90c4WCeYF5cHyOjIqUg5aXmJqQkpWXmZedloyDiZ6Ri5KNhpCWgG9qbm9uWFZYVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2wo6yqqLWvrqy0v6u8wr+mopmVpJeejYSLlKGhmJiRk4tzjnqAhoyGdG90a3FsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxgp4himml0emV+cG1/eouJdoKIhnRsmpF0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcX98aHFxfG6Tjo98c318cXBudm2Cf3d5dWp5iYKIiYSWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra29oZVhRWldZWVtNUFVWWVhOSUhFSkpIR0JARkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6e7r6uysMKxu8PHmpaPlJmLjoZ5hJCYlI2QjI+GcYeCdIeMhnpwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhtfWxxg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYmAZ2diam5ybXCDdWlvWHVwjpuSd2x/en1tcm5wgHpzdm5idoN+hoCFkJCKiomRi5GMi46DdXiKjoB+g4B9j3tycHBsYFtcXlxZWGFfUk5bWlhXTEhKRkpHPkJBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGdpKeer5Wltaqusa7BsrvBxpaQjJSPgIh9boGQkomDioePhXWChGyViIh7dHh4bHdud2NpXkpQRz5ANzQ0OTs7Oz0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sd4iIfH6Fg3+MfnaimXl+hoGFmYWbnGGGqp+di4OQjXp3iH6JiI1zipeQg3pdZHJ0enx3im1oamJ5b4aQgnpugXd0hHpwdHl3a25pXXeHfId8h4ePf4uSl4ONhYyGfXGEf4N9dXd7fIl3cHN0ZWdfW1teVFxnXldRVVhbVUdKSkRMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkpydn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYSLfX2Bf3CAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJKoh4CYmIqbdG18gYaHfY5oZ2h4f26Fh4KFcYSGR2yAd3J5dmhta193fYOJf4iFi3qVnZuJi4iRf3p1i3Z8eG1vd31/dHRybFtdXVtjY1hnZlxVT1BWWVBETEtGTklDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbmqWtk5q7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnH92hYWKkIiQaWhvg4B0jIeEi3GFgneHf3t2hX1udnVmgJSPhomJh4iHoaqilomOmH96gol6eW9na3h+en5yamReWlpdal1hZmBZT0tOV1JRSFBKRE5HQ0pEQkBEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMyME+DXzQ/O251cGZ4g3uAjICBkY6KmpuknaGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYyLgomNg3+Jf21wal1CQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpOUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdmo+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6Gfk5iShIuFj5mRlmxwdYmLgpaMjY93j4RxbYWBipaRg4WIcoihloeTiY6PlqW1qZuNlaKDh5ODfX9ramt8gIGBc2FdY15aZmtcbGteV0tHT1JRTk1MRklQQ0RNRkFDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpeWmpWenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioSYkpGCgICLjYmFkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NFTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2cqKWimaGXopWdn6ieqKugqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiZWimpp4en6UmJKhkpaYgZSee3eVkquziI2Xn32UnpyOk5aZpKKmtrCdkZmoiJaPjYGIbHNyfH98cWhgXGBeYmdjYGhnW1JFSktQT0lKTEZGTUNITEZGQ0JHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYyKhJKFg4aJgYCGd19iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQU1RUlNQUlNVUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2GkHeVi6OnqrS9uKSurKynqLSrsLaysq27sbO+nLPDrLvJy7fDv7ilo7CyrK2qo4uWmIWmpqCjl4GmmY2iqqikiIWUpKGgqqGkqY+csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opSkqoiZiZKKlXl6foV+Z2BoXGViXWRjX2ZmX1pPRElIU09GSExGSkdFRkhBS0VDRkdBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRj4OFgIuFhoeShoKEiYaIh4dxbmFARTY0PDIvMTEwLSwrLTEuLTM/REFNVVFSU1VVV1VOW1BHR0U8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrHBx8Oqs8W2rLO/s7i+tr+0wba7u6S4xqi2yce1vrm0qKO0rbGxm5mSmp+JqK+rpZR2n6SXoauxs5mWqq2orra7srqsr7Wisayxtby3ta61oKeno6iaqbCtsrq4uKebtqmMpY6Rk5+GeIKDdVlhZFZlYWFjYGFmX1tUSURETFVRSElKRElHRUFAQEpEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRY2RXeXVxgZR9hYeTdoV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk42HhIGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtKQUA+R0tGRUQ7PkA3RDc/QkpKRUZXVFBej6Wuo7G0w7a4wczJtrvEvbOzwLe3wbW/sLd0sbOmusWksMa5sbOxtKiktbaqsaCilpuikqWwrqatq6ekmKCss7qiqbK6tLu+zL/Fxb29s8K3uri/t7q3uayssKawqq2+sL27wsKsmbqolK6Pl5eriX2CfGpXYmFXamVqZVdbZFlWU0lHRkxRR0NHSUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlVWnZqcH+PhIGOhG56c3mHYrihmaKIlZOWk5STjZCWkoeHe4aBjZaKgISBinp8i4eGfIqDgYqDlX14enVlT1xkR0VMOlFjYVteU0Y/O0hQRFpjUVFZWFpnWVRgYE1TUEVBP0lKSEVGQUBDPEU2Qj5IR0pMU1pUXZOvuLW6uMm/ur3JzLu8wby3tbu7t720urHGYXWypbGanqq9qqWoq6qjorK1oauon5WWn5ifrqWnpqWfo5SiprG0p7KyvbbBvdPJytPGwsXLwcrDwL69v7u8t7SvuLe2w7rFvcPIsJ65qqKrjqWotomBf3JfYWJdV2FfaGZSWGFWUlVJRUVOS0E+R0Q9S0I9QkA9Rj07SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbGxxkI2FkHNscnJziNXAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWin+Df4N4e4uDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1fbl9YZ2VVWVVLREFLS0hGSUhIR0JJOUQ/SEtUVFZcWluSucC4vbfGwLu5ysq6t7q2uLmyt7W0rra2mWR1qJytcF6hrZyYoKKbpJ6qpZSgn5CUjpaYl6ifpZ+empqEpJ2spaqwrLewvbnU0c/Xz8nM0czPzsrGwL7Cyr3BvMHAxMTFyr/IzrSku7C0r5urubyaf3psXWBcWV5hWWNjUVxgU1BLQ0JFR0U8QEU+QUhBQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkJRvbG91dYezrKGhn4uZnJmMjZWRm5KFiop+iIaMkIuJfIGEc3uKg4Z7iXSBiYaVf3N7eGttdXtocmVpbGlmamloYGZpaGxabnSXraS8iIdnW29oXVpaVEhLTk9KS1FLVFFITEFKR0tQX15iZmlhl7fHsLizu721scTHtbC5sLC7q7Kxp6q3rI22p52bp5pPmp2MjqCWkaaYpZWKk5OJkImPkZGem6GXmpWWh56appusr6ivp7O01NTU1tLLz9TVztPPzcXCydC/ysnKydHHzM3C0NK4sMO8xLmltrrEooJvY1xcXlhhWFllWlFdV09PQkJIRUJJO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiCaHFveXmDoKqeppeMm5uXi46VkZqOfYmLhI6KiouQh3yEgnB/h4GGe4dyg5GLj35xeHVrcXh+cXtteHNsaYFwbWNpbnB4aXd8fsu/wt+nbWN4bmNbYWBKUFJVTlleUF5dTVBOVFFVVFxubnaCcpetuKyzp7C2qqy8wLGrtaakuKarrqGrtKOOsa6amJiMkZORhI6bgY2nkpyJg4uEiomEi4OTlZiXk5uRnJiZmZ6eq6ykp6Gsrc/S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxcDOx8fDqL630J56b2ZdYl1XYFNdW09QVFBOSD5BRkFCRTxAQj5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd2x3cH1+f6GenqGLjZmTk4yMk4+WhXmFj5CNi4qIkYd/gntyfoCBh3mEdYWSkYl/b3Zya3N8e3d8c4F3cWuAc3Job3F6eXJ7vsubfoyyg3ZyhHZoYWpdQ1paW1dmZFhla1NYXV1gZF5jeHt+i4GZqqSkoZ+gqKWqsLiqpbSjoa2ho62ip7GfiaaalJKRiZGOiIGUiWuVoo2ZhICFfZGDg5OWrYuVjZWZjoWSkJ2Xp7ChoKGkpKjIzs/IwsvR1NHU087TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzEw8uLc29jYF9YVFpTXFBKR0lKSkA7OjtFQkQ8QkM+SEI+QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuWiY+KiI6Hj394hJOZio2IiIuJfoJ4c3t9g4d3f3qHkZaAg254cG11f3Z4fnSFfHlth3Z0bn12hHV5e522jDxBi8alfo18aWVWSUNmY2VjaGpkb3hbX2Zpa25pboCDiZGLnZ6gnZCXmJ+jpKaypKSzoKGlnaCpoKKxnIaekpKSkIuOi4aDkIR+nJuMjYOEhXqUfoKplaOMkoqXkot9l4qakaqzmJqbp5ynvcPGubbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydra0tW/y8y0eHZvZV1ZUlZRWlZGR0pJRUU9Ojc5QEFCOUdEQEVDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgYd8eIWWloiPg4eFh3qEeHF6e4SGdXqFjo2ceoxwfG9ven9xfIFxg4eAbo56dXd9fIJ1f3yHiLB0WanCtoySgnBuYj1eaHJwcXBueHeBZWlvcnV4cnqLh46UkpuVoJWHjJOboJufqp+grZyhmpmfpZ6frJmLmoyRkY2EfYiHg4WLjp+Zk4iEh35tmXmEmIaIk4yOlIyGe5uIk4+uqpSVl56Yp661vamtvcbLyMnMy8/Iw9HK1NbY19jX1dvX09nb1tDb2tHWydTLlXl7aWlbWlBSVF5IQkVJST5BPT03Oj0/Oz1HPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKBhH6DfHyEl46Hi36GhoB3gnlue3uGgXV6kp6NoHaPdYJ0dYF9dICEb4GPgW+ShHR8gYV6doZ7ibfGpcLJt4GWm493cGVOZmOBeoF3hqKQi3h5d3uDf3yEdW6TlpSVj5iQg4qPlpqXl6Wcl6CXn5OSl6OdmauVkJCKjZGCjIWJiIGFkJGenJmJhYuBhph6iYifl4+IjoqMgnyhiZCLvKGYk5eanKmmpa6fqLW+wMC5x8nNzsXNydHW1tXZ1dfb1NfZ2tvX29rZ2M7cxoZ6emhpZGBUV1ZVTUpETkQ7PTw8OTo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqLfH6Afn98hXt+gZGJhIV6hIh7dX10bXx9hn5zfpKdkZ6DknyGfniOfXmKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLyMnKOcfYmEfYlzjIp+c6aanJiUhXuPkImEaEdwoKSdjIuQkoWJi5CSlY+cmpKUkZeNjJWfnZShlJGNjZCLfpCOjouEiJKVmp+fiYyUkp6Rgot/pZmIhI6DhoSApYaKi7iYnZGVlqKnoZ2enaOutrq1q7/GytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld4eHhsamRXYFtUUE5HQ0xCPT0+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4h7fHuLh4J+dYOGeXN6c22AfoR9d4WboZudlJKAi4h/mIeAnJJuh6iFeqCLfJGOg4iEnH6akYqNo6KfkKSuoIuRi4WLgZKGV3Kti5+rm4+DmJuQkI5bgqKRgoyfk5WMh4iMkpOMlJSUj4yPioiWm52PlZaRi5KUhoCLiJKNiYqclpmiooaSnZahi4qIjZyQg4iPgIOHhaSGjJCzmJ2SlJehoZ6Zkpyep7G4rKW8wsfNx8bPzNDMztfP0dSu1tXY2tja2tfW2dqfb3x1aGdcXVhTV1hDQElEPj4+OjQ5Ojs3Ojs6Mzs7Pzw+Nzs5OjE5Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhtYn6Sg29td4t4eX96gXyGfHt3hoR/c3CFgnp1dnZ0hIOFfX+SpqOfpaKWiZ2PlJeLiqiXcoqxjISnkYSZk4WZi6KWoJiTiZudoZKpr5+RlJCNjYiVi26Nt4WaxMiynKGlm5yYlpCykGSkzceWj4WHiZCSjo2TlImFioqGlpqbj5CUk4aUl4R/j4uZiI2QqpeXo6OImZ6Wm4mPh5eXioSOjYF/h4+liY2TqZqXk5aZoZmfmZOdm6OztKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgnJ/aGNfXV5OSlRaQkFHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo+OkVNRkhSV1NSQmOBRnWCj318bX6IeHp+eoGBg352doCDfGxui395fHh4fISHi32Ko7Ono6qyoZann6WklpWuooOQuJWSs5mNoaCMpZuvo6SdmJCnlqeZra+kl5SWlJCLmJmWoMCOpMm4q5uipq2YkZqcsp2GhaiinJiFiImOlY2Lk46IgYaHiJOYlIyLk5OGlJiGhJGQnHSRmbKWl6ShiJyZk4+KkIuXmomKlo6GfYyYnomQkJyamZOYmKCUoJ2Vn5uhsa6ipLe+tMXHxL3Dw7/GzcrJ0qfOzdPS0NbY09DYu3J5dlxgVV9XUEhJTkVCQ0U2Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY2PTpKRkRHTltcWUlmYDtIhIt6em2Fhnp8hHiAhYF+cHh8fXxvco16fYF7eIaLiYWDkqe7raiyva+lrbOzqKOisKyKmrWdo7ikla2klqmtt6ako5+ZqZipo6+wqpqYnJSVkZefl5m7u63JoGm2uKuwlJieo6uTl76jXqqygomKjZSHkXyOjn2Dho6PlJWIh5KWi4+VjYuMl5iSnZm0lpWrnoublJKNkJKMmZuKkp6Qi4mVoKGNlI2Ymp2TnJmelKGglJydpa+ooaWzuKvCyMS1ur27xcfHwtGhxsnNzcTX1tHL06FwemhdWVNeUk9GRD48Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlR2JgYnBJQIuKfoFzhod9gYh1goqDf219fXx/cHeGd42Bh3uNj4yGjJmqwsCvvca7s7TBvLStq7O2jKiyrq68qpu7pKitubirpqaioaOjqK+ysaudnKSYm5iXnqKlpZGjua6ov7ysrbK5paOnfYiGnK29sIOLjIuQg4+DkY96gYeQjI6ciIePl42LlZeUkZqWnaeasZqRrJ2Omo+SjpWQkJaXjpGgkYmVm6OslJaPlJyelKCem5igoZWanqenpKKksLKmwcfDsLC6tsXEwr7Np8fDx8O81dHNxMqIdHNiXFpgW01KQkxARUc/QT9COzo0PkE8PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZkZgaWdaXVuTjIyIe4eLhoOMdYaQioFvfnyCf3F+gXqVepGUlJiQk5WntMbJv8LMwcO5x7y6r6u5u5eytrqywK6lwKSrr7u8qq2roqKdp6qutLCqm5+qm6GblZ+wtKeLorq5tcG7q6mcsqWkqJSFjanDxKSCi4+HiISGlZSNeoOMkY6RoYyMlJGPiZefl5OZlZemoK6djKqcjpaPkpGVlY6QlZGPoZSGl5+gsp6UmpSgoZmkn5qgnKCUmJ6mpKanpK+tpcDEw66ot7XJw762zrLEvsS8s9HKyMK1dHltXFhcalNNSERMS0tKQUE9Q0Q8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpNZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KCkHmNoZaompqYur7IyMrB0snKwsy9wbOsu76nur+9vMS3rMGprLK7vaqwqaOlo6yts622taCfr56lopijtLypm6i8waO2tq+rkq+sq6yXhpmppqWRgoyTpZWJgXWKknmFjZGQnp+Tj5SLkI2Uo5mXnJWUo56pn5GlmoyPj5CVloh9j5WSkqOblaCinLWmkJ6XpaSjpZ6eppielZebpaOpqKKyrKi8wMSvpbO3zMC5rsSzu77CuKzCw8LAmG15YVhXXFtLS01KRkRESUJCQUNLOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY2Xjp6SiYp/iZ+ThHeFf5V/f5CIipB/laGarqajmMK9yMPHxdPNzs3Lu8K3r7q9tLzKvMPBtba8rbO/ubyur6igqKe2ra2psbeanq2ip6Gdq7e3qaWvvsOxvbmzp6q0s62ulpakq6egkY6SscWnlY58kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjZCPnohakJeXkpalmWWYo56ypZailqytq6ebn6aXmJaZlaGkqaaftqupurzEtaW0tsvBuKm2rLK6uK6ouLq9uINsblpXVFVORkpTTks/QkhFREhHRzk1Rk07Pjc+QUouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJxRmlJUmViTEallJyWoZeplo2Qg4emk4iBh4KchIOVkJCUjpqin6++rqHGvcXExsbOzs7Syr67trG6u7y+zrbEvbe5t7KytbO4s6ymnKuruKqop6+wl6OupKekpLTAsKqss77CucC5s6e4tLiyrpWkrK6upIuTlaGNdMGafZaZhI6WmouxlZqZlZKTmZmmo5Wfm5aaqJycoaCai42Qlp1gSpacmpWapZZUlrCfr5yfpZSvr6ymmqGmlJOZmY6doKeimbSpqrO8vLursLLHwLilq6utsbGjobKytKRxbmZcWk5QS0RQUFBRO0dKSUdIQkM+OUtVP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UUVXUnNiV0ZIqpeZoKKor5mRl4eLp5aOiJKFn4eEnZeOnqCao6S1yLSpxrrDw8fKyMjMzca+urKuubjAwc22yLrBuba6sa+usrSno5uqs7SqqKatrJmkrqWkqKy6v6irtra+wb++uLKyw7G5vayjrrSsuKWIm5emm3a+oISYnI6TmZqLrpehnJuXlZufoameqKCZmqmZoqeemJCNkZ2DbnaSopqVnaKekK2yo6uVqKqYq66lpJ+lqZOSmZyIlZyinpexpqmrura+s7Ktvbm2oKOnqKWnnJysqamMY2VhX1JLTUdITklVTD1NRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauUnKGfu6+ZlJ6Mk6qbkZKTiauNh6KejKStlKOjtsa9tMG6wsLHyMXBzcjBvbmyr7m0wMLKtcaxwby1uquoraywo6KZqrS6pqmmq6qdqK+no6qqvbynrLyzt73GvLe1uMCwvcCzqLS2q76lj6KXkaKfvJ+JmaCZlp6dj7efqZylo5ucoZqopbOhm52lnKiqnpmVj5Sbi5eJjKWilJ2inqC0r6Wlk7Crmausnp6ko6mRlZWgg5Cen5yWqaSiobS1u7WtqLWys56coqWal5WZqqGed2FdYF1KSUZITVFJTUVGR0JSTElBRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Wnl6Sfn8Osm5ekl5mpnJabmo+qlpanppWtrZmhq7bEwru+t8HCwMfDvc3Hu725sq+4s7/DyLW/r7y2uremo6qsraCgmqqqxKKlqKumnquvrKKpqL64pq29sLe2x7a1ubi/sL7BtrSytK+9o5ajlpOblK6fkKGipaOjn5C9pamdqaydnaGbpp+9opmjnqKpq6Gdlo2VnpOeh4+EjZOepKCdtaymnJWyp5mwp5+aqp6gjZmVn4SOoZqbk6WkmpissbayqqWqraycmKCgko6QlqmflGhjWmJdTklIS09MSEVESUE9UElBPEdJSFtST0s9SE9VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlY1dNopqjnJ7FrKGfrJ2crp+So56WpaCnqauXtrCiqrK1xMK9v7bAwrvIwr3KyLa4tbSws7S3wca2vrC4tLm1n6asqqudnZ6lo8GloKmtoKSpra+ipqe9taWxvLe2tcOys7e6vrHDwLe3rbO0taKcpJWRk6CtoJihnaipq6Kaw62pnqytm5uemaagvaGdpJirq6ymoZmNmp+SnomOV3+WnqWhoLiqp5OYtqOfs6Ggm6+Xno6ZlJ2Cj5+Xlo6ipJWQpa6yq6mioqallZWcmIuPkZOkn4liZVtkYExJSktPRkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxLTp6foZmew6elorOgnLKnk6ukoKSframsnbuwqKy1scfDwcKzwsS9xsO8xMq8r7G2rbC1r7/FtbmxsLq1rJqosKmpmp2loafCrZussJyqoq6wqaSnvbemtrq8rrbDrbOzwr+xxrO6tqu0ta2poaWVlZSjq6Gen5qoq7Cur7uypqCpqZmZmJOipLigoaSSrq+spaefkqGelZ6PkI2UnZqin6e0pqeNmLSco6+anpuukZ6Ul5SagJKhlo+On6GTi6assKWnopyhnpKSmpOFi5KNnJ6AYmZbaGZKSUxKU0JDQElHOztHPzk5Tk1VXlJTSj5PXl09SFBCTExJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMOopKqyoaO1qZWyq6eipLKsrqm7sqywtbTGv8TEtcDEvcjDtsDIwrWrtaiwuKzAxLS3rqy2uaWZq7Grqpifppetu7WbqLCbrZ+utLGnqrqyp7mzt7K4wKq3ssK8s8Wnvq6tt7Spp6uhlpaRpaSiopeYpK64rbG1tqCfqKSZlZWTpKC3oqSllq6ysqaqpqGem5qalpionp6YoZ6vsqKmjZeumaWsl5mepZGbjpOYmoWWn5SMkJyelIupqaqip6CZnpaMjpmQgoaWiZSfeWRpXWtqTVBOTlQ9Q0FOQzo6SUA3N1FPXV5SVlFBV2BcQkpTSFZLSDpVZV1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SnBpVkNXRox5ZkM7pKSdoaa/pqivr6Cptaqdua+ro6q0t7Gwubevtri4xb3Dx728w8HGwLnBxsG6qrakrbutwcO4uKqtsruila2wrbKWpaeQqrmqoKewnaqgsLSyqqm2tay7rLKyubesubDCur2+psKqsLevqaqrpp2YmKqhoaCRmKCwr7OrsLmam6mgmZaSl6aht6mloqKvsbSrsqirn5ugoJuepZuhl52js7Can5CTpZqhqZqVop+WmImUmJOWl52TiJCbmZSPqainn6Obl5uTh46Zi36NloWPm2tpbWFsbldQUlpUQUNFVEA7O0lBNzpYUGReUFZXRFleXU1MUk5eS0o+WmReTkhQTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGqsKqjsbippbSzq6Gttb2vs7i8ur22tsDCv8nEuMTCv8C4xL7Bt6+1qKu3sry/v7WprrG3n5erraitlqeojqe7n6Wts56rorGws6yptrO1va2vsbWssLWxwLrEtqu8r7G4q6yporGlnqSpn6OXkJmfsqqzqaqzmZ2nm5qVjaCmpLSup6GsrK2xp7OtsqmjnJ+oo52ToJibqLWpl5mSkp+Zn6GekKyfmJiGlZiLnZqdk4qNlpeal6alo6CdlpWXlIGPlIV7j5KDjJZmbHJncHJfR1lmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiYFBLTU5YV1hQSlZWV009RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVTE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmaCkrLekrKmlrq62qa+zuaamsLfFt7G3vsHCtbS6xb7MxbjCv7q/usS4wbmytayqure6ur60qq6wtZiYp6uqq5usq4+rvJ2srrGjqp+wrbOurraxubepra6xp7Wvs7u8ybKqtbSxtK+upqCzn5qoraCllZWambGjrZ+lr5ahpJmZko2ipaeyqaGmsauptaWvsbWvo5mdraeal56Zmay4o5eTkI+YnKGYl5Ssn52UgZOZjZ2dmpaQipOSnpqloaGgmZaSk5Z7i5CGe4yKg4uSa254bnZ8YUZhallJSFlbPXtKR0U2QWJUaVpNXGFKW11aUlJSYmBMS0VfYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDXlFcLipCL0pHUFtIM2NZVUtEmZagsKixqaylo66utam3tLijq7S3ybu0u7u/vrS0t8PBzce7w7y2vr/AuL+8sb2up7q5t7fBtqutsbiUl6auq6ejsqmUr7ukrbKxp6eisrOwsrC0sbizqa6rsqe4r7Wzw8W2qLS1q7Ctqaeitp+eprGgpJSbmZSxnqebn6mNqaKdm5WXpaWlt6eisbOrp7GorrC1rKSZoKyom5ucm5SpuJyUjo6LmZyimJCXpqGfloSSlpCdnJiWloiWj5ebp5yjoJKWkZGXdoSQh3uFgYSNjG5xd3Z8f11MZWxcS05jXD9ie0dJOEdnV2VbTF5iTVhZV1RYVGldT09IYV5fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnRmFMViUtQi49RU1RPDNya0pEQ5CZpa6kra2rp6SwsrOqt7C2n6u1ucm5rsG8wrezsrXCw8/Ev8G9tL3Av7q/vLPEqKm5sLa2v7yvrLOynKCnsK2lprClnrK1rauysKypqLS5rLSyta20rKmrqKypua2xsMe+t6S5r6mtraWorbClo6Ouo6mcnZyar5mio6KjkKyeo5+foaqlprmlq7S0pKmrqayvtq6inaOoqpufmZqSpLSaj4mNh5GioJaNlJ6glJOFjpSSnZuYlpWHl5KVmaabn5+NkpGOkXd+joV8fH2HiopydHJ+fX5cU2RvXk5aZl1GRJZbSDtObVhhW01gYU5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhkSEorOkk/M0JJUyw+j2s9SEiPm6qqoqmvpKijsrSxtLWxsaGrrbzLuq7Au8extK20wsPRxcW+wLK+wcK8v7e8xKett6yzuLzAsKuyraCkp62pqKSwo6qxqq+ssK6vrauzuqa2sLKpsqmrpqWjrbqsqrHCubSruaioqK2pqLGlqaSirqqoop6boqyVpJ2XnpirnaGnqaGspaOtrLexsaCooqCrrrCsnZ+nqKmZpJiZj6CnmIaDjomLn6GPi4yWnI+PhoeQlaCdlpiVh5aTk5eknJ2ci5GPjop/f4iGfHd/h4WHdHNyiXZsX1lgbmNRc3FcSzuEfEY+V3VYYFlOY1xNVVZVV1BcYl5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5JZ0RGODxCMDVFS1gxQJRbP01GlZitp6KqspypqK+2rLi1rqqlq6q9ybuwvrjDr7Gts8TDzs7Dvr+0wMPEusC0ycSsr7eusrnAv7Surqulp6qwqaeosaW0rauwrq2xr7Oss7qkuLOsrK6nq6CinrC3q6qturaktbWkqaesrKqtoaimprGypKaloaGrlqmgk5qgpp6koqqkrKKfp7G3rKyipKKbqaqtqZyipaSkmKCZlo+YnZOBgo+IhZygjIqOjJmPkIuEjZikm5KRm4yTkpGUopmbmYqOi4t8hoGCg3p0gISCfnR3jKSHeWteYG5nV2WHZE5AZ5JMRGJ5V2JYUmVVTVZVVVRPXF1hVUtOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGQEhIRJeSr6SjqrCXqqistau2saukq6qpvMDAuLmzvLWms6/EycvRv8G7ucC/w7nBusHErrG1srO7wb6zsa6sq6uotqqlra+rua+osbGusau1qra1p7S2q6ykqaqdo52zs6iopLS0oLWtoamoq6msp6CrrKi5tqmqqamhqZ+tm5GooZ2gpKKmoqmdnKa0rqelqaKjmKSmpqmcoqSjn5mYn5GOj5mOfoeLhoSenoiFi4uOjpCNhIaVo5qOjZuRkpGPkp+XmJaMioN/dIaBf394dYN/e3h/gYidj29xZ2dxeFxgc4hqT12YVkhteFVkVlFiT0xVVFVQT1hbYlVIUGpUVlRHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUWMwMj9mPU5YP0MsPkxUXy9KazZQRTuVjrCgpaqtmaukrK6ztK6qpa+pqbq+u8Cxr7iuorawycfI0MC+vbu8wr26w8HAv66ysrK1vbzCsrKzqrOopLWopKyzs7mvo662sa+xuaq4rqqutqyrnqqsn6Ogtq2ooZ6vs6G0qp6op6qkqqGhrK2ova+srqyhp6efq5iPr6KYoqCop56nm5mqsKmjn6yioZOioqOmmJmppZeXmJ2PioeViH2NhoSEpJaFgoKLho6OkYSFlKCXiJGdkJOQjZGclJaPioWFeHSBf311eHmAe3RzemmCh6N1aV5lbIJ1Z4iMfVJYcF5KeHNTZFNRXk1NUllmTkxWWWVZRlNpUlI/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsMExoOjQ4Xz1hZD9GMUNQW1srSE86VkI0kI+xoKSmq6OmpKymtLOwqaOwp6q4vsC8sKi5qqeusMnGyNHCvb++ub6/vMm8wrmwsLSxuru5wbO0u6y4rKO1pqarsba5sqenurWttbyvvKWtrbWrrZypr6Ofpayqp5yeqrOks6iaqqeppKmdo6moqb2stK+unamjoK6bmrKjlaSbpKWfpJqaqKulnpuqoZuSm6CknZiWqamRmJmTkIqCj4V9j4KAiJ6Phn99i4aQj5CEgJOblIWTooyUkouRmpGUh4l+f3F6eX58aXd8enVxcX1ohniEh2RgaGNyhXptZ3ldXlZCV3ptVGFQUllLS05xdF1IWltnWUVVZlBEPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj07RVo/Ko+TsZmfn6ilpKGrpLeysqSosKesuMG9tbCjuayoqLDDycnMwba9v7W3v7rItsO1tLO1sb24ur63rbm1v62hs6apqq+1uLSqnru7qLK/srqgr7S2qayfrrCinKWoqaKenKSxpq+gn6qpqKKqm6OooK28qK6wrqGroqOunp6sppeemqGjnJ+bmqOqopqapKSVlpSfoZablqasi56RkJGMgouAf46Be5qUjYl8fouFjo+MiYWSmJGHlKOJkpKHkJmPk4GIfHlrfXZ5eGJ7enFwcXN4aYFzaoNnZGhhb3OObWJqcGBwQVx4a1ZeTlBRSkpNU1lWTV1ebVdEWGBPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQwQmhZMTNTPWVfREw2S1dlTyk8M1BbPSOSmKyZn5enpKKfqKS4r66ir6+pq7jCurKtn7ivq6i0usfLx7+3wb6vtL63xLbDsa65srLAtbu+uKm5t72rpLWnp6mwrbmwqZq6vKSuv7S0oa63taenp7CzoJ+kpqegpZmeraeonqCprqegppejqZ+wuJ+ksa+hq6GspJumpqmampueo5WcnJqdqaaWm5+okpiTmJ2TmZWhqpCaiY2Qh32HfoKNfHyhjIyIeYOMhImMjYSHk5qOiZWfiZGVgouWjJB9hHtzb31xc3RgeXhpb3Bxb2p/cmR6bGlmZGFmhoBgW3Nqck1Nf2lYWk1QTEpIUFJQSU5cX29URFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaaEgqPzBaWTUolp2lmJyWraCfoaSht6uwo7S0qai5xbayrqC3rK2ssLXGyMC3v8G5sLS9t7+7v6+rvbC0v7G9w7qpu7q3p6i2qKaqsKyzsKaavLekq7u1rp+wuK+ppqevsZuhpKCjo6GWnK+moZ+ip6+ioKKTo6Wit7ChprGrn6yirpicqqSonpeanaSTmpyanaaqmZycpJWVl5WcjpOXoqmhkImKj4V6hH2EinmOl4qNhnmCh4SIjI6EjJOZjI6WmYqPln6Gl4uPeoB6cHJ3b290X3h3ZGxsbGpphG5mc2lrZmldZHOBYFtrdWlaSX1eW1hPT0tIR1JVRjI5Xl5tUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKjsrMTM5Y2w4NEdBZltIVERVXWhFLjwyYlUsMpajoZeUm6qdpKGioLeqrqC6uKasvcWzsK+jtbCtra+1xMS8s7+6t7Czubi6uLqurb+ztLivv8G4rL26taais6qmqLKrrbGhm8C1pKe1taiesryqqKapr6yZo6eco6aUmKKypJmfpKipnKKgk6SgpLiopKeupp6loKiSn6iioaCYm52gkpqblqChqpubmaGUkZSWmY2UkqOopJCJio6FeYR7hIZ9nY2KioZ5gISIiIiRhJSTk4yQlZSNjpR7g5eOi3d+e2x0cmxsc2F4dGhoamdmb4VnaGljZmlqYGliamdbZXtjYFNzVFtbU0tKR0lPU0AhKmleakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OWVPJzKeo6ORjqOnm52enaO1raaqubenrMPBtrCso7Wup66vt8DAvLLBtrGusra2uLe2rKm9s6+ysb2/uK67vLGln7arpaS0qauun57Cq6ilsLKprLS7nqmqq7GlmJ6qnaakkZmmraKYnqSpoZyinZegnae2pq+qr6GgnZ2hlKCln6GgmZuZnJKZnZSlnayimJadlJONlZeLj5iaqKCRiImLiHmFd4KCgZyIi4KJfH+EiIaFkYOVlY+OkJGRkY2Se4OVjYVzfX1meG9ramxndXNrY2dkZHWAYmVmZmVqamRrcVpeWV1tZGFOaFdaYFZKR0lLTVJYPjlfbGlIQlRTXFtJSEZFQS48PzlBODlSR0A3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxZSlZiZkE6M0FnSCU1mqOekIusoZiYoJals7Gisb23obHGu7mxsaS2q6uuqbm9u7uuwLKvrq22r7O4s6irubGvrbS2urawub6tpp61q6CgsKWrrp6kwqCyo66wrrettZ6tr6ytopmcp6mknpWbqKWfmaWjqJ2aoJuUnJ2tsKa5qK6ioJqanpmeo5qknZeemJuUmqCSqJaqp5qTmpqRi5WZjZSUmamnjo2KiY98gnSCgYqYhYd8iYmEhIqMiJKEk5ySko+QkZaOkH+AjI2CcIB/ZnluaGtqZ3Fya1xoY2NzgWFmaGpubGdramdtXGxsdXFhVGJoZGVaSUZMTU9YUVFWYWWBVEBWU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZUMnNJKgmo6OsJ2ak6GZqbKwn7jAtqC0wru9ubGmtrCorqS3uLe3rbuvraqrt6q0ua6ls7Wxrqmxt7axs7W6p6mftqmdnqmjqq2cqcCZraOur7W1ra2fsa2vqaKbnKOrqJuVnKejnZqpoqSWmqCckJujq6qpu5+opJ+XmpmeoY9ropaYnHGClpukgHWSqaeelJSekIiXmYCWiqGQeIaUjINuan53g3FshouGfYSLhm9eY2BnhJeGa4uQlJN1d4uEfoOPf2eGgGh1aWZXXGhzbk5QamNncoRnX2RmbmxqXmBgipCEhmdPS0Q4RlRnXkpHUVBVVUtIU2FvdGVGW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUWQ9Ky+Mo5mHlLCbnJOhm6qtq6O9xa+pt8K4vb2tp7awpaukuLOys7G5raqnrLSmsLWjqLi2tainrLezrrSts6Oqn7SrnqGknKenmay7laalr7K3ra6lqK6rrKWhn5ygp6abl6GlpZubp6edk56fmJCeqKqjta+jo6OblpeYl6OIoY6Smoehh5SdoX+lf6aqnpKRmpGIg3J4jY6FiKF2iY1pl4hmfXN4oW+Ih4R+jXx/oaCfmYB7h550iI52m4psh4GDbGhlY3pscWJUhm1jbGmYcVhqcG+HWF5pW2trW4hxbnpyhmiHhFpeRk0/R19NRlJWVlFRUldUZ15NWEpSUk9FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8ojKaXg5yrnZmZnZ+qqqepv8Ousbq8t8C/qqW3sKmsprK1rq+ztquppbGtpbWznK21trSmp6mzsa2yqK+fq6GyqaCjo5qio5yutZWkpKW2vKasp6qqrKiloaCYoKajmZmmo6SYnKSplpSinJSTpKWmoLajo6CjmJSSl5ObiK6PmJSJqYuXopuFsYCjrJ2TmZ2UeYLUqH+HlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxlrycxXtytqe6kHqBbJaxq7B5aGtYsa5uZWm8krxuaHpuco/YflNqYrayf4FylHWaoaqQV09XYU9WTkZUW1hRUFKMXFdcUEBcRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mk4GmqZ+XnJ6lrbKosMK9srXAtbe/wqums6ysqaevs6qvtrOoqKa1pqe4r52zsraqpaSnsa6usaaqnqeksaShoJ6XnKCer62VnqGftLqiqqihra6lop2amaGnn5ebp6CfmJ6np5Gcp5uUnaGmoqCvop+fo5aWkpeRmIWvamqKjap+Z4SVh61kcJ2ck5mllHGuoaR+eLt9a6GPdrFfarRbpYBmnJFgZoJ6Zn9qeGqpZb5yZ6aMdrJqfLF4dJKTY21tp21bhKBFaGeHlkV1nGB9aHykp4JZX4uraYCVeHpqpzdKr1tXU21jW0tPWF9cV1Y7TohPV1cvSVRTSURFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuRopWCrKelnqOlqrK3rLS9vrC2xLK4u8KnqbCrrqmpsK6ksLqvpKWus6Opuames7Kwo6Wgqq2vrLCmp5+jorCbopuXlZeanK2ml5uhnrSzoauboq2toJ6alqChqJyYnqSgnJmhp6SQnaOal6Cfq5+mpp+an6GWlZCWkJmFtZu1eIWpmbWZd4ezm7d+k5WWqJR+a4GmeoKGiJKUknerZ2uxW6x7j4eUdIhxj4aAgIiQl3iDgouXjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYp0uUaJuW1NraGBMS1xkWFxaQj6weFdYQSNNaEVDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nVzdKOWFVNTAblZ+UiLOmpqGuqaezrKm7tsKwu8KtuLfBqqytrq6mrrKpoa+8qqGntK2kq7WlprKzp6OinqiqsqiwqKWen5+vlp+ZlZWWmJ6topqao6i0rqGpj6moqpuelZegpKeanp2jn5ugo6WjlZufmJqdoqqbppmbm6KglpKRk5Ocg9WTmblwsMJ+xoZ81pSbu3yZlaSPjZyNpHuOh6SCpYJ6rHmPnVave4l+n2q5Wrl3hoN8poKTfJh6qnmNnJB7sW2OhHSQvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhoCJfGOkM0Kddl1RamhkUEBYZ1pkYUpITWxLW1NPWWZaQ0Q/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcyJZuik5ixqKiltKqltKikvLfBsLnAsba1vLO1p7Gwo7Cypp+utqibqLmuo6+xoLO0sKCknp+oqrGptKmknJ2eqpeYl5aXlZahq52blqetsKijno+soqiWnpeboaWhmKGhoqGaoqKnm56hnpWZm6agnKeUm5qfoZiPkpWRnYiybmi1cauHb46mcrRzcrZ7mZeji46cjaJ+kaGlfrB2g5HS0XZcrnyGf6Rvm6qma4aEfK19l5mPe7Fzk52PebNllnSEnm+eZpRSyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tfbGhPVUdJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnJGlsK2kqrutprSlp7a7vLK6v7e2tbq6s6W0tKGxsaKfrLCkmKa6rqSxsZ20uKqfpp2iqqWyqK2qpJqcmqielZSYmJKSo6igl5Klq6+mopaTrZ+lkpShm6Smn5SapqahmqOfrZqgnp2QlpuhnZyllJyVmaKflZmWkpuFrHt3qHajjomHqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXeEfY6dh5mZd6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1ed3eHaJiIa16vd5Wej3hsNXnIrrJfQVRvXmdgRVBsX3BtVlVNLmVjaVNZUTpBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOTg4n52UoLiwl7TBraiyqKqyuri0uL+5t7K2vLWkt7OftKyfn6irn5WntquosbGrrrSkm6mgoKihtqemqqOZnpWloZSTm5mSlKKlmpOQpqyupqCVmamfoo+RopmopaCVmaWonZyknq2doZ2gjZSem52gmJmclZeioJOYkaadhql9faV4oY+Og6pwrYuBp4aVn6GIl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rbmVPSkOhXFpMdF5iZk1aYV9ydF9KVjZKmpNZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MDAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzE/OKGdmZm/q5e0wq6rramltLC4sbW/ubqzsbe8qbq0n7CknqWnp56UqrGpsKm1rKuvoZihoKakpLqio6ugl5uRoqCVlJ6alJieoI+NjKivr6adlpuopp+MkqSXp6qnlJepp56foKOtpKGeoY2VoZmfoJKdl5yVnqGVlo+rm4+ubXK0cqmMdoqmc7R4c7OAkaSikZyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWTiK1rdbNhnWaib4eSapdcrWBNoXyHkVJzo216f35vmIdxXK9WPJx3ZlRvbi5cp09iUmtlYW1ZYlxhcHtjVFpRPj5tcDNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7PDAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpuduqGcssCuraurp7epuK+1wLW8sa+5uKrAtamqoJumo6GdkqqqqLajsqiuqqCXnKegpau4naOtm5aZj6WjlY2doJuYnJ+Qk5Srta+nmZScrKqXjJOlmaSsopGXqrKkoJ6nq7CYoaOQmaKXoJuWm5ehk5yqnJSRq5mH1JKau3Oww4DDhn7Vlpu4eIeQl4yYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eIGKbpqIcW6NpHS9XXd9W2F5vGtaVltqel5qYGRmYm13b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5qeobyil7HDsK2qqqyxp7mvtsSxurKuu7CuwLGspKKeo6Gcm5GppKqypLWmraSflpqqmaasuJyirpiVoZCloJKNnKOemJ2bkJWSr7mxrJWXo6enlJGWpJyjrJ6RoKirn5ufqKKznqKljqeilKGanJeWpJiPsKCSlKqehZCZtYCQkYy3lXiCk5q1d21rbnNueY+Ejol0nsG7vZp7gbKocIB0kbiDfIaGi4eNe4qGjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbV0cnB3toxef3p9iWiDeW15YouscHWFf1lbp2pEZFlTZmBjXWNQZ2ZxbXVCTlBMRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz07PKeeoKC/pZazw7Ssq6esq6m7rrDGr7WzrrentLitqaKhpZ6gnZmUq6Stqqa1qKefm5ago56spL6moauXlJ2QopuSj6KoopOdl5OXlLK1tq2YnaOkoouSkaabpaqblqikpZyaoailpqOpoZKtn5ejnpeWl52ej7CplJunoY5qfmmcpniHc36aj3R6ZYd6vb7Aum+SgnGVh19yalpemolhY4iOlWtgf5VjbZx2YpRrf5qVlGVeYGNxm4ppcox9hpVnan5ydHh9fWJbd3SBaFBcboN8e4trWGx6gnJJSm+FcE10TUVXXWZgTFtYZ2NeT1ttdWlxUU9ERU07SEk8TD8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6on6ihwaObtLq2o62lrqeotbGsyKyws6u1o76xsqegoqmdopuamaymrqSltamlm5iVoZunrai+p6mmlZSclaCak5ilqaeRnZGPl5ywsr+sm6edp6KJk5Gpmqikm5uroKOZm6OmrKKfqqKasJuVpqCWlZ2fnZexpZihp5ickZ2co6OZpqKanJqamY+WgWdtfXF3kpeUkYWKtaqNhpiVj4qMmJeHlJWKhJKTkYmNkZOYlJiXmqCimpyUoZ2OgnqlhWxqfJB8gHSJioFxgnh5dnaKgHuJanOBdIN1Y3d9dmtwe21gY11wZ01ZWWVqX1dacHpubWZTT0ZTOU9aTlJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Czor+ipLGyt6CqpbKnpbC1qsmrrbGltabAp7ShnaSlnKOVlqCqpqyjo7ern5mWlp+XramlwJ6rpJWSnJeemJOUop+doqeTkZmop7LDr5qrnKqfj5aWqZ2qm5ugrZihm5yipK+moaSonq2Yl6admZqhnp6dsKCcoqaVmJKYk6ChlaOel6COlpOKio2Olq2PfJWbgpKCi6qohoGYloqEj5+Ie4SQh4WZkIeGiZWOm5eNkJiepJaak5GdjX+NZqGzr4WJhHZ6j4p8dnl6b2d5kIGAiWt1gXmIcmhzf3p2g4iCa3RkeWZgaWRiZGZqWWt7cGlqXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rKuusrKgqqaxraKss7DFsKqso7OuvKS0nJ+loqGdmZeopammpKWztZ6VlJ2ZmbCmrr6gq6OQkZ6amZSRlaGclqichJ6pq6KzyLOfqqOql5aXmqedqJqdo6uTnp+doKquqaWjq6Gtm5+goZmlnpyenbCkmJ+ok5iXnJGkmZionZqXZoOSfGV+jZmPY3mNbGhrepGkq2tlmph+Z4WKZWVpaHuOoY5raIyXkaJ3a2qLmKOfmXNsbnqEjId6WGVehYFebIqJgHZcaHN3d5GAh4JueIJ4gHNteYN0d4iIjoN7aoZZXmt0ZF1ziWlqfHFsY11RTVdKZFhASjQ9Rjc/RkQ3MTw9P0FEPDxER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7GqpaitrrCmrq2wvbGpp6Str7CfrZefo52hmpmnq5yto6WoqbKunpWjkKKvpra5pa6jj46aoZmTkpugmZiklXulrKKos8O3pKGnrp+elZ6jnqOboqmpkp6hnqCqr6qro6qfqJumn6ihrJahm6WwpJecqpWhnpuSpZeeqpiefr6Dh3K0coSdhq1oeLnEuHGToqN7ppiZc6qCfMvAwLtxi6KHgp98lZiJnsC9gpadno2dwsF7gXuSjZrDwH1rpbFvjIBvynp/m3eRg46BdnqBf3lxen+HcXiFjJN5bXeTYmZfeGRfZYJjXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqJSjr6mwrq2msrWvqqWmprCrn6uYmqKfnJuqp6KcrKOlqKWktKSdopOmray3s6evopKRmp2lkpGgoZebn5yHpqukq62/wLGgqa+pl5KfnaKZoaKpo5OgoZ2era6orKajoqegpaWeramRpJupraqcnaqcrKGWl6WVoaOXnH/OlHh6pIF5lZabX66PXo6ngaKgfKeVm3Srg4CvXmONqnqnh4WgdJeSiLNjgquGoY6Ns2qErnR9loe4YYKtWaPNbo91e9p7f5lwfoiTdn5le4h2dmt9iG5+hZGSfm2Bj2Bxa3BnYF95ZFxxaGpkZmBSVFJXXktPQzVBSEVEOD42O0A/QTs9N0A+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3CwL+1tLC3l56RpKqorbOrprKsraykq6ewqqCnm5mll5yir5+gnqino6ahnrCsm56Vp66tsaqorKCUkpufpZOPn6WXnqijnq2kqrCowMazqKmxrpaSnZyil56oqp+VoJ+cna6vp6qpm6enpKGrkqy0lqaiqqmdo6elobChk5qnmqCalJSRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKKMkYudfqt7iZOPn4B7rVacxHqPb5LBfYGVbXVwjG1ldmWGb2F3bnJviouSkINtkZBkb3R1cGBnbWVfb2lpbmZjV1NdYVlSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSfnaOOo6OhrK+2rqiwp6mqqK6rq6eipJ2ZopWfpqufoaWgqKiin52wrJealqinr6yop6mel5Sao6KSlKGtm52mo6+so6u0qrrNsa2mrquWlJydopmerKydlqCZnZ6psampqZurqaOirJuvsaKorK6lmKaqqamxopKXo6WalJKEpGqkdYl6qXR6snCCpYmZjHGIoJqHpGBgUqyEf66Dm3augaaGhp96mZaGe2aAo4mkmYaBo32pfoGUh65efKlVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2NmI+BbZqTb215eHdvbGZlZXFwZnxpYl1XYGlYWFVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1cChmauooa+inrC0sK+prKOopqqqq6mkpqCbpJ6dpaemo5ysmqKsoaSfr6KdmpKqpLWwrqCpm52WlKejkJqiqJ+gppyxpqOnsay2yLK1qqyplZGdnKKZn6SznZqglJyfp6uro66arKmioaqjs62iqrOxoZqqqK6vtqOTlqOnmJuRfKpsnoSHdat5fLBvgqSLiZ+WlZ+UgdK4tLjJgIGyX1+UqYOkiIegeZiVmniqyXSZo5WnqZCSm4x/m4maxsZ4ZaGCpXOBn46Cfa9ecLVjsXVLo4Ztp0eCk2SPkJ6SfHCXk39we3V9e25bZWpycWaBal9hWWRtXF5ZSU1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC8+LTVPVFEdHDs8RjIsJKekwca5ramyraylopyyuayqoaabqKaqrKmmoKalmKujn66rnaagrJqeqaWdp7afopeTqKq2sqybppyglZClrZGZnKaioKqmrqGjp6mwtMKxs6qtqJOJl5ykmqCirqaYoZWYnKWmq5qvna2opp6so7esobK5r52br6ezs7OllJino5mfjoKdTniagX+feoOjfYOkhIenn5yek4S4e3x5uYJ+zMbCtniboZGLn32alpaKdp6YiqSYo6h+sIWchZ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpKkl3t9k5KLdXpzhX9xXG1ud3JqgW9aZF9obmNkXUtNUVRCSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruKuvoJyhrLOzpp+glaWura6qp52mppqjp6GyrqKpprKgmamklKO2oqKVl6KptLiknKKdo5OQobGZnpympKGir66dpKihtrLDsa6pramRh5Ccp5yiopyll56YmZmlpKiarqGupaaXsKW8raG3t62dnbWyuLCzp5ier6GjnoWP0bXDt3mHjoWRk5CBpniUoneMoJKEpYGKcaqGhLRucmqZo5uVip98mJmGh49zr4Klm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+Upph+jI2Ti3h9eY6CbWl4aXhzbn90XWRkbm1mZ2BKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklk3ONiq2/v7u6tZ6XqKSttaGjmZWjqaeuqquZpaKfpaCgtaaiqaewo5Sso4+lraOdkJqaqrS0pJ2knamSlJeuoKCdpqOcp5y0mqGqo7arw6+pq6mhjISOnKGgpaGVmpqcmJqZpqSmmKunraKkm62nvqyVvbCsn6Kws7mrtKebqbGkp5h6qJB9fLB3ioGkpYicbbJvoYetfKGPg6iVmICsiIWuhZ+UqaChloafgJmVgHuSfquAnZqWiqp4naCPiZOSgHmvXaOBfKanZJ2AfJd0a65dpWtxhZldYFuMoG2VkqeZgpSNl4x7e4OXf2tsf2J9dG2AemBnZXFuaGdoQ1phWz1LVDJVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTcwNTIuKixBVFZWVlVUVVVVVVRUVVRTVFZWV1hWVVVRSEZJSiMoKL2SmoSpxsK2wbSfmqygrrilpI6bpKOgr6+qn6Sfna2Znrigo6ugr6qarqGQqqmklombkK6wrKefp5utmJiPrKKhnaWhmaScrZifqKa2qcCvpamjnouAjZuan6adkpWampSamqWjpJqorKyjpJ+qqL6kl8OsqqKhrLK6q66noLOuqKmYdq9+kIuchYd8uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWlmaShoZCFoFtsaoGzYH+te3uCgLFsZ26Zl4yIsFt9tFukg2vIomWfgHu8WXa1WrJ9Uq+AeqxYgKFtmI+om4uYkZaWe3mOnX5kc35ig3d0gHxhamZxbWZlZU9VZFxCVF4+SSg+OT00ISItJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBQUlRXWl5gX2BhYl5fXFtYVVBOSkdDNTUzLy9AVVpYV1dXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMKzo5uspqW2qKGLmqCfnbOzqZ6joJ21mKCzqKqrnq+un6ubla+ooo6Im46vrKmnoqeZrpOZj6iaop2ln5mjoqWZn6Opsqi8r6WonZyOfYublaCgmY+SmpuSmZeonqGZqK6npqajpam7n6DGp6Wpoau0tq2upp67rayslYCpkqOvj5uAh6SXmJCBgLjDuoOOnZOEp5acgqyKgq+IppubpaqQftW9wqpio7+9fX6jgoPXuri1hZSTg569voRqo4Fvq4RtnX96srDHg2qrsL2seHeivrt0gJaOpp2QnJGXnHmCkZt6Y317ZIxmeYJ7YGtla2piUGJbU2pcQFRhQk4pPTo0Lx4fJB4lMiAdJCgwNDk2Njc3Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWztLG/ubK9sqKdrqals6aei5ilvqm3saihv6amspyesZy5qJ6tr6anlZSwrJeMg5uRrqajraGknKqgmIujkqeep5yaoKiimJ6grK2qua6oo5qWknuHmZGmm5KOkZiYj5iTqJmgmKmpoaqnoaOru56pxaOgr6Ors7Wrr6mguqeurppzdaqkt4ZliaBwZ62Pio9tb3ekkJmfgXWumZVwj4txlaijm5eupHJtbW1linhvbYKZcYB5aXFpZ4mWlZhxaGmEhmdwhmRdiWNqb1ldZ353pmBicY6Rb2ZkgI2SjqKYmJmRlp58h46VdmaHeGiNanl+eWRsY2ZsYktlWEpsWTpRZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOqurmys6qpoa6epLKpmJK9ssTIvraqnsCrrKOhp6yfuqOkraytpo6WrqmQjIWVl62epqqin6OjoJGMpJKnmaiZlqOpoJacpaanr7qrrJqbkpJ7hJeNpZiNkZGYlI2YlaeUn5ipo5uxp56jrLqfsMGnpLOmrLGyq62rp7ijrbeWiqGopbadiZaimIepmpCUnZOqs5mbo6ugsZahoZ2gopygpKGVq6aMkpKMh5KcnJSQmpOYkI2VhoGkmpeVjYuTkoqPhoR+Z4p/dIJ2dIeMcadte5SRlJOBgY+Pj4+dlKGWmZeigoiUjXJpkHdwi3d2fHpqbGRkb2NVYFlAaVtIY2FPWitGPSsmITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERkpLS01PUFFYVFZZXl9hY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCmlqmqpbW3rq6isKStoKC1sZCOq8a9xLq4qqKlnZumnrGpo7annam1p6iRmKyii4iJj5yolqykoZmnnp6TlaOXqJqomZSmoaOQm6iZobW6qKuZmpCNfIGUi6CUipSRlZCQk5elj5+aqqCctqOdp6y3p6/BrqO3pq+vsK2pqbK4oK68mZGmo6a2opKdpp+NqZ+Nkp+jrK+aoaOxqK+Xo6Cco6menp2clquckpmhm5SQlqqZjZmZlpCVnpGJoJ2VlIWSjJCMlIqAfmaMhnWGdnmIg3OcaoaQlJSRin2MlpKSmJOhk56XooSImId6cpZzeop/cXt/am5kX3BpYFtgWm1jUGBkUFs6R0dEPTI9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFjYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mnraCotaqQkJ2mtLuvrKyio5p6naKxpKWwqZabuaejlJmqnI6Giomco5Cun6OWqKChkpeYm6+LqpaPqJmnjJmoj565tqSlmZuNiXmCk4uak4mVkpSQjZGWooyenqmen7ikgISvtaKwr3SkvqOyoHh6oKqxu5R1rKSeiYCqfmRcYnagjqSehJd+bpOznKOnrqqjZZ2fk3N5mZdwgJiol2x/oqiKZZylnJGXmJaLkZuRhp2akJWCkoeOjpKJhXdrj4d2hnF8hoCAYWmHipSSi1t2lZFnaJCOcnummZlleZmHgniYaoSKgm55f2twZWB2b2traFxmZWJib1NcPk5OTlJHPUBUQjkxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCRkZJS01UVFVZXF9oZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpuVpqOhsLGsq6mlqK2jp62kkpWrtrCyppqqp6uXc4ydsJ+oq6eTl7mgoI+cpJ2Rf4iIm56Nq5qjlaeino6XkZ6Fda6QiKaaqJGXpIicurSooJmYi4l1d5OMlZKJk5GQlIyPk6COm6CnmZyzloCMnLWds4ySj7ynoX6nonqirreBjo2mnoOLhY+xqa+MipajmnmBi6yGnJ2ip6mnh5WFmHelm3qHm4GXpoKBe5yxeoqFoJeZlJiWgZCWloSZmWN5h5CEjY+SioNtcI+HeYBxgIGFf4Z0hoSVkniWaJN0oJp0fZmEoZ2HmH6Si4ODmWuOjYVreHtxcGdkd25pbGpbZWtqZXNcXklUTFFARTUuWVRVNikhMDk9PjY0MzU2ODs6PT4+QERIP0lFSktHU1haWVthYWhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq6uq6isoKiwpqeppZmUrse+sKGWpqm1no+Dnaycp6KgjZC+npmNn5qgkH2Gj5mXiKudopafoJGNk4mGgJGojoeinKOTl56Gnrqyp56bko6FcHWQiJOPiZOPj5uLj5GekZehpJaerIiftIm0mq2Lyoeqroi3hY2wgrCug6mNppmNnXyoj3J7d5yPp5ZolaR5tIufnqaokpnCgX+riJihcZ6AmaR9l4WVsYChfKGUoJCYloCOk5uKl5GLfIWTho2Vk4mDbXORhX96coaBhHyEdIWCl4GPxWaAqYePo2ueg6Kag5qAjI6FiplwjZOFaHd0e3ZnaHVwZ2dsXmNvbGdtWGhHXVFMMkU0Nk1gYzcmMzxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFldY2ZoZ2JiYmJkY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplJein7Coqailq6CkubCqq6aalKCkpaujlqWqt6Ovf6GnnKWenYmUvZqTjaGRnZB5hJaWkYermZubmaGFj4x3m5yPoJGInqSblZmYhqK5rqSZnIyMf2Jtj4qSj4yPjI2Yi5CRno6UoKGZoah+oaeHrZ2glq6Pnp2dkYaBoI2qroakjaqajJp+onaAmZRrgqx1Tat4h42dkZuop4Cqq32DoXt6p2mef5JrZ5eGl7aJnn1uYGRZg5Z/jHtkaIpymX15lWxde5dtX1NwhFxfbHmDYFllgn2EgZhxp6prg6NucqVwn4SfamWfbFtuinxmWl+Df2JXUG92ZW10cWpqb15qb21salhpT11YRTlBNEdDXms0LElDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWJpa2RiZGRnZGJnZWFjaJeWnaC5oaqjpqySoba8q66imZegoqatraGdrrWiqJKhoKCmnJmOmLSZkIuejJWMdYGUko2KppaVmJ6ef5KFhqykh5yRipipmJmakoelsaeilZqIiYBpboiHio2NiYuNkouQkqGLlJ6gnKKlf5OBj6OhlKB3nJaPp4Ohp3+GqayEpXmKfYSafaJwcpOIlnuejHlth5yMmZCbqJqPh518gqJzdqZmnn52pF+Yen2Sc6JumLe0unSSh4J/tahkgca4e3CVt4txgJukY3Osq2B9ap2zfm59h4OOgouXcYCjbHOkc56EgKRgnZmzlnF8l5+0dHNbnrKDamJvdHVxaG9Ya2xyc2ZdaV5iS0Q9RDVRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pXYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS4ta6toJuinKOjpq2cm7GtrJOXoZmhpJmalJ6rm4uJkniLhnCAlo2Kj6CQk5Sdl32QiY6ooIeYj4qRopObmoyLqKilno+Wh4R+a3uHfn2PjYOLkJCJj5SggpaeoJ2gn4uJd5yYooygcqKLiKmInKaQlqeqfq6MfXqgmXqjk3iBdJaIjZx9lqCHm46Zm6aGomShfIiWkJuNbJ5om41umpl7gIqnfXJodKuDnYN0qmeUml2bhXaEnWiqaoC4ZlyocIGcYZWMXqd2dYmKf55omnWHk5KYjn+fbpqQbaeZXah+eLtrfqpbjoRdtGdcbnF6eGtpW3FqeHljYGZYYkFQRU43VkJSbjRLWlpfTlpDQDE1MTs7N0g/OkNHVD9ZUlldPkRiXlZgUWFjfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4ljlJusurKwrJ2mnJyon56um56wqKydl6SaoZ+Ylpago5mGiY1qiIBye5eIi5aWhJGUmI96ioSWpJ2KlI+Fi52RnJyJj6ijoJmLkYqAgGmBh3h/lot7iI6OiI+Wmn+Uo5+gopOYcmifip+PjHGSjIGpiJmfo6efp3ywraOiuJd3o7OipICIlHmde6uaf6KOnZuXiZdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZp+dKpaXW97lot4nmJMfnp6hWN5l0JNn1mianF8jm2BiYSZdZt5h4mxs39/m5OndYGdbnJ9lG+Zc2qkXZV2SGVjYHNxfn5uZWBsaHZ8ZGViUl5XXVRWQFlFUWdEU1dbYlheSUQ9Qjg/QjpJRThMRFdBVlFbVkRGYlxaYEtgbX5xRUM8VV9iWmVqVmdobW9iZmZeYWFcXV5haGJfZWR2bF5lZ2ZrZGZsaWhraZOdgbGtmYRUX6Cns7mzs6maooycq5ycqZShq6ShqI+fnp2amZWYoJ2WiIeJd4WBbnmVhZCbi3yRk5aIcoCJk6Gcc5GQgYiYlJ+ahI6pnJqUiouKfINshIVxgaCLeIWNiIeSmZV8k6Ohn6OIroZ9tYSOnp17pZZ6qYGWnZCKoJx8p2h2bX6ZdKFzcXyehplwk4OufaSDpp6agaNvXqhndaNjb6VhnNOQfHqZeHJzY6KFkH6jc6OPdWuQs4tggpiJc6qyqLx/d4Ntfr6mqbRenG59cZdvgXOicl2jZ3SmYWimbZvUmXyEm294epdrm3t3l3JtqaRnYGV5cICEa2dmZG11eGdgY1RbZlFRYklXSVRfV1NbZWpcZFBFQ0tNSktCSkU4UD9QTVdTWE9SUmBmZWlSY3d5d0lGRWNdZFpoaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm4Cxq1RcS36pr7G0sLOjnJmFmaigoKONpKigmKmKmZiYk5mTkqCYjoiGe3B9hGh9j4OUmoF3kY2OiW9/hpCTkmyXlH2IkZGjlYOOqpqUkouFiXmDdoeAboKfhniAk4aImaKXepOipJqgibOhoraLeqynpK6lcKmAmo+GgZySfKSAopmGmHKehKOtroqXjICMpI2Wg66ilXa1tbXJoXOUioGfYJ2XqW15lYafmnWhh3egfpGWioBvTGajknCah3Kke3l0YYOCbH6ga3FkYJxyf3SXaXtps7W0xqZzmH57nWqbm6t1g5psdHeXaZp6dZhyUER9s15qdmt5h2ZqZ2J0dHFuVl5UWWhPUWhJVUxZU1VdaGtuVmdXTUpBSk1LSEpOQVFKUGRjaW1ldHJzfnl7bnWJe3tUUE9sXmhba2lSamhpbGdsZ2NlX1xdXF5pYmRoa3tfXWRoY2pmb21laWxloZyJsKeEZj+UobKrr6+2oqKQgJepoqKljKWnnZ2mgpqXlo2XkI+ck46Ig3lqeYZlg4x/l6B5dY+IjIFphIWSg4yFnY16jIqVpZKDl6mXjJGLgYl6gH2LeHCQoYd5gZWHiZagln+UpaiclpaEZ254nGyiZHxxpXebmHBnp4GXjHulep+Wg5dynnaBiZSWj7lukIqiYn2ZopWIbXJpq2p1oG1upmCbaYuQaJaHmpV1ooB9mmCLhYx0b4hiaKBlnn5pmnVvY2aIgm5yolpfW2Ohbl2JjG97f3NyZKVtd6JkZ6domHOLmG6hb1OIj2+gX2WnVItdVJhtbXNrcoJscGhreHNrb1JYV1ZmWVJtSVhPXUlYaWhzallrVlFSRVZcTFhSYVRoal53dXp8cHx8coN7f3J2jYCEdl5RcmJnYnBnUGpoaGtsbmdkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ylmaZ6ZXRti6eupKmwsaafi4CXq52epYyioZqiooCWmJONmo+LmJCOinuHcYCIaIuLfJibc3SKfZB8ZIKHlYqKlZmCfIiGlqeQgaKskIWQioKKfYCAj3Noj6aEfYaUjYmYoI6IkqqnnYmmeJacfqWJloyymJ6Qgq+Xn6V4lYh6qXSlj4SabqSijJKEjIO7bn2lr4KGhoeTlpyffKV6caiVoJZnnn5vq2OWipWSd6hsqaKBiXWHgnerkaaIa5Gwa3azjKlrioZubZ+ekpVhf6uLqnaAf4ymn3effYWllZ2gaZqHdqxnnq2Mt3N3vo2kk1mDpo2rYXVydHB8dHFian5uaG1TVltVYWFca01dUl1JXW1tdmBbcVlbYFpnc2Vub3FjcXRgd3p+eXJ5g3OEf4B7e4yBgoB2YnhkY21zZFJsZ2hvbHJpZmlhX15cYmtibWx6b1xcYmlibGp3bWdsbmKVpqqdgYCepJapqp2op66kmYmDmKuanqSJmqWdqZ2FjJqOhpyRhZKNjI10hnqIhG+NhH6Yk3R0hnKSg21/i5KHhpSPfHuBhZeljX+lpo6BjomFlXaCh5JvbIupgYOMlI6JnJ+JjZOro6CQgHWUl4h+gXmUrqN/gZtxj4V5kIuEf3typoxxfX16l5abhI54e35+h5SVk4p2kJifoIN6fYlsjIVbeXhxeXBobn6SiXF/dIKPlJNxhYOCZY1/X4F/i3d1c5R1b3lubodthIZed2l4jWaBgoaOqZt+dHyXaomIb4B2fYZ2bWxnjHN5e5h4hFtrWHmPaG53cnFveHhvXWyGbmlnVlpgV1xla2NWYVVfUV9weHlsa3ZlamtqdnxxcnRzYW91YnN7gXh1eYJ1gIB/gHiLhYN9e21/bGR4bl5XbmdodWt4amlqZFxgWmNqZWxwdW5aW2JrZGxseW1obG9hjpS5qaeLoaKapqSZpJyroqGEhJiskp2giZqmm6mYg4Gbin6Wk4eOiomNcoN8j31+j4V7l450coNwloV7fZKLhoaQhXh+f4aYo417p6GLhpCQhZaDho6XdnKFqoaOkpyQiJ6eiIybqKCgq4OJjpSafn6Jlq2oj5Omj3dvnZGDepJvfqiFcH2VcWtwfIGfjH+TjoxobV2Di4ybm56Oc5WLiHF0a4J2c4BZcm6HkYF9foxqXWpke4WDiIBfaXh7m3uCi4J2gYaCaHmLh2thcXKDd19zjIKJkKeVhmaMj4Nud4uEcYaPem9lZ2R6g3qWW1xqZ252W3t4d3Vuc3OCZlxtimtsYllZXlpYbHJcX2FaXl1mdH57dW90Y2trant8cnt4dGRtdGdse352enx7enp/f35vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGtqcXJtV1tlbmxnc3lvaGptYIuMqrGikKOhmp6el56ZqKOifoOYrY2flIebopGllX97mIR8kpmJiIaHinN9gIt2hYuBhJaKcW+AcpiGhH6ShIOGioF6gIOLm5+Pgqahh3iOmImVi4ucl4SDeq2CkZiZlIqenYeIoaugoqKji4iTm5yjmZaqoaemoJKbh5aOe3iOjoSnfn+SkZKTnLGmm5WekI2yk5iEpYyMlZufiZCbgomRimt8jXZ3ZYKGkIp7iZ2Eh4uPiIiAhYSQd3x5dZqhiIaKn4uFlH9+jIGAdnB0hoR/eIiHi5CmkISFjYiDjZCMfYiLiZCBdmyChHx5mWpyaGF0inB9end2b3Z0gV1eb4Zobl9eWlxdU2hyVmNcXGFsaHV8fHNvcGRraml/e214f3Fpb3BsZoB7coKAeH99gIR6bYOMhnx6eHx9eoN5TmR2a3NtcHpka2ViYmBbdGZwZnJybVVdbHRtaXl6cWdpa2WMiJ26n5aioZiVmZiUmaSgnnt/mquOno2Fn52LnpZ9eZSDe46ZiYaEhIZueICAcoGIfomUhG1rfnqXhoSDkH+AhoSGfIeDjZudkoeqn4NyipCGk5KMnZF9jXuqhI2SmJaPnJeGhpunoKKanYaDkZqZmZCapqCmnZ2QloCQinZ8h46EpXt8jpCRhpiqoZ6TnZCOq46RgJ6MiZOanoKOl36GjYJveIVxdGB/go+GdYuXgIOPgoaEfoWDlG54dXSSoYuMhZqFhI10gIl8fHJye4iEe3mLjoSTp4+GhI+ChIqKineGiImLfG9rfoB7bmhsbWdeen9ofHt2dHZ1e3dcYHB9bnVgY1pdXlFnbVNlW15ha2l2en5xbGxka2pngH9sc4BsbHRveG6EeW6HgHaCgH2EdnGCjYh+e3t8f3uCimBpe2p1aGmCZGpjYGlcZHVob2J1bWxUY3F5ZXB6enJlaW1ti4qft5qho5+SkZaXi5qfn557eJ6mkJuKhqSUi5iZeXqNhXyJkYOMgoGCbXx/eHOBhX2LkX1raH2Bl4iBiI58foaEh3yPgI+bm5GIp51/cIuLjJOHoaGKhY18qJGIkJKXk5aTeIyjoaGelpp/gJCamJOMm6OhpJqXkZt+jYR4f4OPh6CAfYyMj3yYpKChk5mQkKeNj4GbkYmSl5t9kpJ+ho2BdXSCcHZgfX+NhnKKlXyIi3KMf4KFho5od3F4jJiSj3+XfoiLcoGGfH1weHuLhHp6kY2DlqaTi4aRfIaGh4V2goSJiHplcnt/eXpxbGpmXn5zaHx1dnR8c4BqXmB0dnB4ZGNZX15Ta2hUZFlfYWhqdniBcWZrY2xoZX+Aam1+aG5xa313hnprjIFzgYF9gXR2go2Gfnx7f4F9f49qcoNuc2lhh2hsYl9xVnRvbW5geGhtV2p0dmN1e3tyYmpueYmNn7KSpaWcjpCYj4acoJucfHakoI2Xf4yiioialnh7hod+g4l/iYKAf3F/e3R2g4V+ipF4Z2N9hpeKgoqNeH2AjIN5loCVl5aNlqCbfm+MgpGUhqabiI2JhKaVhZOLlpeTknaRnqGhmJSXen6OmJeOlpudpJ2YkpSbeY+FgneEl42dfoGJjYxzl6KeopOZjo+ijIyDl5iDkpaZfpiNfIiNgXZxfW56ZIB8ioVwhpN/kIJsh4KBgImEZXVvfIeSl419k3iLiXt/hnx7cX53iYV5hJCKi5iilYGEjXeIhIOCd3yCiYZ2X3h3fXR+eGdsZGF/aWp3c3R1fXF8YmNhc251c21hWmFeW2tkUmJYYGFpa3Z5hnFjamNtZWh8g2xodGhsb2h/fIJ5bZCGcYCDg390fIOMgX9+eoKDfnyQbXaJdHRtZYpsamFjdVaEaXFuYHlnbGJqdnBmeXx6cWBybIaFkJytl6aono2Nl4eGn5OXmH14qpyKmXqXnIuMmJB5e4GLfXyDe4CCgHh0eHpzfYCEf4mLgGRefYuVh3+Fh3R9fop/fZeEl5OWjKOhmH9yh3uTkoqnj4yOipOhkoSSkJSXkYuBj5igmpKQkXR/jZKUiZ2dnqeYmI2VlnONjoprhZiPmXqHiJCJb5edmqOTlYqNn4yHgpKcf5KSlYaZiHyJiYF6cXlrdWx7fYt+boWSgpR3b4KDfX6Kf2RyanuAlpeEf410kImDeId+dXiAfYaAfIOMhY2UpJB5hYJ0iYd9gHR2gYiEbmB7dXpxfW9hb2Nke2Jub3ZzeHdzdGF2X29sdW5vXFxfXl5qXk9dWGNhaG10e4hrX2plamNod4dtZmxoaWxogHx6d2+Qh3OBg4R9c4GGiXqCfXqBhH19jnJ6i3h4bmyHa2hfaXFjh2hxb2V3aG5sYXloa317eHBhd22LgZmaqqCkqJ2KipGGip6KlZd9d66YjJd+npORlpSId357in17gHZ4f4BwdHN7b4Z9gYCKf3xhXH6PkYZ/g4RzeoCGeo+Rh5KRm5Klm5WCfoF8jouSpImOio2Ym42GkZiTlo6JiYyTnZOQjI1ug5CPkYmemaKhl5aKl5FuiJmEZoaZjpN6iYWQinCWmpSikpKJi5qMgn+RnnySj5KLmY57ioSHdHN1a3FudHuLdG6FkI6ScXSAe4GCiHxkcWx5fZmUfYSIdJCLgHOIeW+AfYCGfIWMiIWNlaiNe4h9fouFeH5xcICFg2NoeHR1cHxiXnBga3RecWp6eHhrc3BleF1tbHNtc1laXmBialpQV1hlY2dxcX+HZl1paGdiZ3GOb2RpZ2VqaIB6d3RujoV0gYGCe3WCiYV3hXx4hIV6gIl3f4t7enJ5g2prX3BodIBrcm9tcWdvbGV8Y26AeXZxbHd3in+imKKooaabh4yKgZCchpOcdYGqlJKOh6CMlpOQgHR8doV3eH9yc3uFa3Jvem6KdoCBh25xW1l+kY2If4CAdnWAgH+ghpCKkpyXoZSYeIp/gY2JnZ6Kj4aSmJaFiZWZj5aMi42OjZ2KjpCDbYiKkJGJnJahm5iVhpiIaYSjgmaFnYqRfouDi4F3k5iSn5KRiYmVjn9+kJd8kY2PjZqSfYp/gm52cGxtb3B7hWlzg46XinB3f3SCiYJ4ZnNvdoGZjnyJhHqUkXl2iHRwiXuFjHqLhoOJj5yjiHyEd4KLf3h4b2uBg4FdcnNxcHB4Wl5wYHBqXm9pfHpwbW1qbHZgcG9qcm1aWGFhYm5YUVNaZmdjdXCEgmJdam1kYmZrkm1gZmZfaGqBdXFycIuAdX+CgHh1gIuAeIV/d4eGd4OFe4aMf3t2in9qcWN8YoZ8b3FsdGpob2x2d19xf3l7dHV0gIJ+pJWarZ+nloWNg3+XlIOQn3WLn5SThoubjJWNi3pyeHSCcHKFdHF1iGxvbHVtiHeDfoBtblVRgauUh4J4gHZygnmBoIKRgZOSmJySmniSe4ONk6Sak46JlZmThYeXmYyUjImPj4iehZCKfHKKhYmOiJyan5uWlICUf2iFnIdnhqCIkoSRg4lxg5GXj5uOkI2MkI14e5KQeo6LjJGWjHyIfIBrdmpua2tsen9heX6OlYF2eoB3g418eWd0bHSHlYt/iIZ7lJBxeoRwdox6iYx7iX2CjJGfnYV9fHiCjH13cWpsgYJ5X3dvbWxyc1Zeb2JyYF9sbnlwZ3BmZnN0aHFrYXdlXVZmYWByU1BOXGZlXXlwiHxfXWhyYmJlZpJpX2hkW2dwfnBrcHOKfXZ8hYB0dX+MeXuGgHiIg3OGhX6MjIR7eZV3ZnJqg2CIfm9va3pgam50f3RfdH15hnh0c4V8eKCPmbCcpY6Cin+DmoiAjJ5/i5qTj4SImI6Oj4R2dHZzgHBvhXNwcYNwa2l2boNufXxtdXNSToLfyJLWk3xvdIR2g6CCk3eVkZmbkJp7lHOFkJ+hk5OQipOblIZ+lpWIjY2IkY2JnICOgXh6jH6IjIqcnJ2blZN5jXZniJGHbIijhJKHl4OGY4yRmY6VipeMjYqLcXuUiHuOiIqSkYl5hXt+bHtlcm9ra3l5XIB5j46Aen1+f4aOenloc2tzi4+JgoWFfZWMa35+boCLfouHfYR6gY+WmpqKfXd4g5B5c21ncICEbWp0b2hqdG5TXm9kcFlfa3J4ZmtqYmZ4cnBwY194YGBWa19edk9OTGBnY115cYl0XFxldmBhZWWPZGBmYVhpc3Nua3F2jHx0eYaCdXZ+i3N/hn97iX5yiYeBkYqIfH6YdmVzbXxliH5vcGyAWmxueXlzYXZ6e412c3eKd3mfi5uum6CQgoV3iJV+fYqdh4WfkY6FjJeEk46HgXR3cHlxboRvbW5+cmRkeHF9bXp9amhsY6Sawdyu76Fza3WEdoWihZJvlpCVoJScgZJxhoujl4mOlYqQnZaDgJWQhYmPgJKKipd/h3t1f4l4hoSNnJuYmY+Pdop2boaIi32Ko4SRiZ2FhV6LlJeKj4mOi4uEim18loF9iIWJkI+GdoV9fWt9ZHh1am54c1iIepKHhXp+f4CFi354ZXNqf4mOiYKCgIyWhWuBdm6IkIKPhH+Cen+QlpOZkHV0eIiNdXNxZ3V6g2J0bW9iaXZnUmBxZ2xVX250eWFyY19ofXBybltjcmFiV25aXHdNTUxkZ2FednOJbVxcZHleYGRmhWBjYl5ZanJrbmtydox9dHeEgXh3e4lxg4R9foh7dIuJiJaHjH5+mHNodXF5bYt6bnRwgVhxenZ5cWV3eYaMaXeAiXJ/nIeZp5yjkoR8cIyUeHmLnYSFoY2Oe5WNf5mIhHtyd3Bzam+Ba2lsfHReYHh3e3F1e2dhZXzr2rXJw9yIc2xzgXeKmoiNaZiPj52Vk4GJcYWJoI2Ei5WKjJiUfI2TiIOJj3uRi4aQgn92eIODcoeCk5uWlJiGjHaHf3CEgYmHmaGDlIyeg4lhg5WPh4mGio2HgYdpfZR/fYOEiY6NgnGGfn9xd2h2cmlzd2xajHySgoV8f4OAhIqCdWF0bIiBj4qCfn+SkH1tgmx4ho+GkYN9gX2AkpOQl4lvcnqNhnVscWxyeIFfc2luXGt2YFJkcmlmU19wdnRgb2BdaIJxc2pXZ2hjaVhtVlt1TEpMZWdeYnJzhWlbXGV5Xl5kZ3tgZF9cWWtuZW9qc3eKfnNzgX56dnqIc4WCfICHdneKho6YgYyBe5N2bHZ1eXiTdG54en1YeYVxgG9neXeSgmR2hoVxipWFmaGbooqGc2+Si3J3jpx9ipqJiXyff4OZf4F4cXNub2RyfmhmbHd3W195e3txcYBpYWdhf9W2jpCmeG5xd3twkpCMh2qZjoickoyFe2mIi5qHgZKRhoeYjXyNjYGBiY58kI1+ioV6dXuCenCGgJaZjpOUgYh1g4Z2g3+Kk52ehpWPn36IYYCTh4WIhIqOgH+DZ32RgH5/goyPkH5tgnyCdGttdnRzdnVrYo2Bj3+FfnyEf4SHfnBfc3GFe4+Mgnx+kYh6cINmeYOKhouDfIR+gJSPkZOEbnB6jH91bm9rbHp9YmhqaVhtdlpSaXJqYlFicnhsYmVdWWqDbXNiXGdfZGxfblRbb05IT2dlXGducYBsW1xjc2BcY2x3ZGVdXVpsbGJtanN2h39xb398fHR4hniFgn2Ah3V5iYGSlnyIhnaJgW93eXuEk3BtfIF3XoN/dIFtaXtzlHNnc4d8cpGRg5qfm6CGh3Z2lH5tdpSXfoiRg4qNmnyLmnZ9dnFvbGphdHxnYml1elpfeHx6bXF/ZWRoaFedj15xcpa8w4N1cZSJkH5yl4yGnJOMiHNriY+WgXuUi4GEm4x8i4Z9fImMf5SIdYmFdnd9gXF1hoGelIaVj4OCcn+IdYR7iZicl4aTjp2AiGV9k4KAhoSJiXKBfWd9i3t5f3+Hi458aYB8g3Zmb3h4c3ZzbGqNhYqBin94gYCEg39rXnJ4en2MiYV7gY+AfnKBaXiCh4uFhHiDfIGXjZCMfW5te4l9d3VvaGh9dmRccGJXcHNTU25zaWFOZnR4ZmBdXFhugG9zWWViXWptYHBPWWtRRFNnYVprbm17b1pbXm1jWmJvd2NmXF1gbGpjbWpzdoKDcW5+e390dYN6g4J8gYV2fomBlpF4g4p0gYhyeHl+jZBvb3yBcWmBeXp+bW18dpVraniEdGyTjIafmKCZhYhufYx2aniYj3+CioOVl4l5jpZvenNwbGpkYHR6aGBlcXpaYXJ9eWdwemFlZY+xsndKYlqk2dCWcXuQi5B4fZWLhZmRjYZvbIaSknp5koaBhJiKfId/eHiJioSWgHCMiHF0fXppeYWDpZGEk42Df29+g3aDd4WbmJOKkpCUhYdwe5KDfYODiYNvgXhogIV4cn9/g4qGe2V9foR1ZHBzgGh4cG91mIyFgop7dniAhHmBa1xxfXKAh4WJfYaJeohygW5xg4aOhIRzhHiAmY2NhHhub3+Ef3d7ZWhqfXFgWXdaWHFuTldyc2dgS2x2dGFdW1tZdH1yb1dnXWZqcV9vTldoUT9ZZl9acGtneXFbW1hrZVljcHlfaFxeZW1oZmxpcXd/h29sf32AdXCBeoCBf4J/doGFiZeKcYKNcXuGfHl5g5OMdWp6f2tvfnR/fW9yfHuUb26Af3hnkoqCoZmdkYKGZ4eDb2h6lop+gIWCmYqBfI2MaXhya2xmX2FveW1fYm95XGRrgnphcXZfZWbU6r6KMjo+i46AcnmFiI6NdoOXjX6Tjo1/bmyFjYx2fY9/hYKViXyDeG52h4SDl3dviYVsdXt0ZnmCg6eMg4+LhH1uf3R2g3mGnJCLkJGSjIuGfnuSh3iAhI2DbIByaX9+eG18e4GKg3dheYSBcWRxaH5tdHF1gZuLgH+FfnJ1fYBygG9bbX50eIqCi3uGf3yIeHpxbIiDj4OKcoF5f5aLi390bmt3gIB1dVxpaXdwWVd8U1pxZUxbcnJlW0pwd29cW1pZXXR+dWhZYltnZm5jaUxXZlE9XmZcXXVlX3RwW1lVb2RZZHF5WmheX2dtZ2praXB3fY5saYKEfnlugHt8gH+CenWCgYyThXCAi254foB6e4iSiX9oe35rdHtyhntzd31/jHl4hH18a4yMg5udloyBgGyOfmtofo6Ne35/g5SCf32KiGt1cWdoY1tiZ3JvYGFsdGFocIl5YnN0XmNkm6CPblw1Wa+1dWqAiX2ShnaGl4Z0j4uKd3BthYOHdXmJeIl9k4h6f3Nndoh+fphvcYZ+aHZ5bWV5iISlh4CHjYl+bn51f4B9jJmHgpOQmIiLhIl8j4hxe32EfGl+bWuAe3pqenaBh4FyYHeBfnFkcmd1gm10e4WUkYF8gX9ud3l8dH5sWG9/dnSLgYZ3h3WBiXp4c26JgI6AhXJ+fX6TiYl6bm5qboKCdW5dZ2ZzcVFbe05ccVxPXHJwZFZLc3hqV1lZWmFxgHRgXV1gZ2RoaWZOWWhNQGFkW2B2YVx0bVhYU3RhWmRvcldqXmFoa2dtbGlwd3ySa2iEiXx8cH5+e4F/gnp3gICJi4Rxe4dvcXeDf3uJjY+Dan57bnd5dop3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISJknl9e4KRgIB+ioNwcnBjZl5ZZ19wcGBgZ3Bmam+KdGF0b1thZGp2e3++nKajyLhxhYRzlH14hpSCdJCNiHJycIR7g3R1h3SId5SIeXlxY3eGeoCTaXKEdmZ3dmNqfIOInoJ/f46OfXJ+c4R5gJGQgniWjZSPiIKIeomJbHh5f3Voe2lrf3lzaXp2gIJ9aGB3h31qa3Roe39pdoGMkJR+en5+cHt2e3N+YlZ3fXJzioSCfIJwhol3eHBwg4KMfn15fnx1joaDdmlxaW2IgnJwXWhjc25KZXVMXm9WVFlzbmJRT3N4YVJYWF1icIJzW2FdaGVkY2pkUVpwSURkYVtjcF5dd2hVV1Z3XlxlbmhWa15hamdlb29ocHZ6km5piIx5fXJ7fniCgYJ8dn2DiIaDcHaDcm53goJ+iYuTf3CAfHh5eoGMdYN4f4GBgoR6gHVvfomLmp6IfYV6d4Z7Z3SFjJB6f398iYaEdo+AZ29uX2RcWGVZbXJhYGFxbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4cI11e4ePgHqTioB1dHV+d4BwcX9thHSUhnh1bGB6gnmIj2Zxg29ndm5bbX2AkJOAgHiSkn14e22HdYCQi4NzloqRjoeFhXuAhW11dn9uaHdlbXt2bWp2d39/fGBieIZ6aHR1Y356Z3SFjoyVe3R/dXGAenxsf1lWdH1vdISHf4B4a4iGc3hrdX+Dg316fXh7couBfXNndGVui4RtdFtqX3VkSG5uTFtiV1dWeG1iUFN0dlhQVVheYXGEb1xgY21lY15uYlRcckdCZl9dZmhdWnpjUlZcdVtbZ2thVmpfYG9mZmtxaHB1eI10a46MdX92eH53gYOBe3R+g4iIg29xf3RxdX6FgomNint3f3iEfHyFh3iHfH2BfoSAe35zdnmMjp+NiXqJdnSDeV59hZmMeYeDdIWGhXeJe2JubFtiW1thVmpzY2BcZ25vZodxYXFmV11ja398ys6IuaJqbW2KbHGEcnyEin57koV6eXR5dXV7amx1Y4R1kYJ3cGdefYJ6i4llcoJranFjWGx7hpyIgoFzl5R3fntuh3GBiouHcZaOkIiFi4N7eX5xcW9+Z2hyYm54cWprcXd8fHlcZXmAd2l1eGaCdmd0h4uNlHxyhmlvfoB4bXxdWHF+bHOAi3yBbm6Jf3F2aHd/gX+BdnxxenSHfHpyZnNhboyCbHNYa193W0lua01WVV5UVXtrYU9UdXJRUVRWXmJ0hWhcYGxqZmNZbmFYYnBHQWhdYGZfXVV7Xk9WZHBaW2poXVdnX15yZmtncmdwcnaFeG6VinR/enh+eYKHgHVzgIaFjoJwcHt4dnR5hoaGi4Z6fH91i359hYSEh39+fn2Hf3x4dnl3kpOff4x8i212gHljg4eXhnOSim+FhYF6g3RjbmpZX1tdXVRnc2VgWWRycmaBc2JrZVdbYGl/d76ue6C3bWJzhmh0fHJ6g4Z6fYx/eHhzdm97dmVqbmCHdY6Bc2piXn54eYuEZnF+aGprWlZveIqkgYV/cZmTcYB4dYFtgIKRh3KUiIyHg4iFfXl0cm9oemFqbWBtdmtnamt5d3p3W2d9fHhlcn1uhHRldYWMhpV/b4tma3qDdGx0Ylxve2p0e4t7gWV0hn1tcWd1fnh9f3J8bHp6gXp4cGZsYm6Kfm1uVmtgd1VKamtPUk9oTll8aGJOVXZqTFBUVV9ndoNmXWBxaGdhV2ldW2toSkVrWmJkV1lVeVpOV25qWV1sZVxaZGJedGZtZHFncm90gHdwmYV2f353f3yFh311c4KIf5SCbnN4enlycoWHiIiEeYF9do9/fISJjoSChHt+i4N7d3x3d5qdl3qKg4Zpd318bIOEk4Byj4JxhoJ+gX9vZmxnV11bXFtUZHBlX1hjc3VpdnBlZWJXXFxogHBvcoB0iWVleH5pdHZzc4OEeIGEeXd0dW5re3BhZ2tnhnSNhG5mXV99cHuJfmltd2ZpZFVXcnCNpnyEfHaWkHN8c3t5bXt7kYR2mHyHhoOGg311cHJsZ3VdbWhfbHVkZ2Zpem97cllngXd1Z3CAd4J1YneFinyUgG6Lam16gHBlcmVgbXlmcneKe35idYJ2aWtxdHpweXhyfWZ+f395d25jZWJuhnxta1ZqYnBTS2lrT0xPcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2llYFZjV2JwXUxLa1hjYVVUVXNXTFl1ZFpfa2FcW2NkX3dmbWJwaXNucX50dJmBd3+Ad39+hoV6fXWChH6XhW5ydHt6dHCEhY+BgHqLdXSRgH2BlI6AhYR9foyGe36AdnujpYp5iIWEbHV8e3WDgox6boVzeoR9gYN1bmpoZVZdW1paU2JuZVtYYnN7amhtaV9iV19aaYBqa2+AaGxhaHl4a3R0dG6FgXt/fXZ1bXpoanlqX2VuaIF2j4RnZVhid2l+h3tvaW9nZl1VWG9oj6d2gXp8kI55dW9+b3J1eI5/d5R0hYJ/hYh2anJ2Z2hvXG1lXm1zX2dhaXhoe21bbYJyc2lvgH55d2F3hIR4j4RziHFveX9xYnBoXG93ZHFziHx4YnOAcGdqeHNya3d2dHdjg3t/d3ZvZGNjbnx9a2xVaWJmU0ttaE9HUmxFYXhmYU1Tcl1JTVRZZWt3emVebXBpZFxWX1VubldLVGhYZl5YTVVsVEpceV9bX2tdXVpiZWB6aGxhb291bm93dXqYfXeAgXqAf4eGenl6g36Bk4RxdHR+enZ0hYiQfYB9kGxzlYF8g5+Ff4d9gH6GgoCKe3aErJ9/eoiHhGxygnp2gICBdW6Hb3x/c4mAam9tZGRYX1pZWlViamdbWl51gWlebWxcYVZcXGuBZnJ0fWpqXWt2dmd0d3FthXt9fXl2cmx6aGl4Zl1kc2h6d5KBY2NUZXBngoV3d2ZoamBXVlloZJCnbn54gIuOenBwfGZ4bnmLe3aOcYR9fn+GbmR2c2RoaF1rYl1vb1tnX2x1ZXpoXXSAb3JrcXt9dXVidIWKeoeGgH93cnV+dGFwbFlxdGJxcoV8dGRyf2xhbHpvamh5d3RxZoV1enp1cGRhZG5zfmlsVGleXVRLc2NRR1diR2J2ZmFLVG9XSkxYWGdsdnpkZW5wZmNaV11YdmVUSlxjWGhYWUlXZVFIYnhaXV9sW15cYWRef2lqYG90eG1vbnaDmHlygYB9f4iLhn11doZ4h4x9c3V1gnh6eoKMjn1+hIlqdJeBe4udfX6FeoF6fnyGiHNxj66Me3uGkH5mcoh6dHx8dnJvhmx7fmyPemJwb2FlXWVWWVlWY2ZrYF1cc4VpWXBuWl5XWlxse2Nwd3ZsYlttc3RndXVwbYR4foB5d25udGVpdGVbZ3VmdnaRel9dUmVmaoKCdH1iY2lcVFheYmOQpWh5dIKFkHhtbnlnd217hHp1iHKAeHx4f2hldm1gZmFfamBddGtZZV1vb2J6ZVt3e2tubnB3eHN0ZHKDkn6Hgoh6dm9yfXJhd2Rbb3BicHGCfHNmcYBkXm52aWNmeXp0bW6BdXR9c3FiXmZub31kalNoWFlUTXdfUUpaWUhidGNhSVRtU0lMWldpbHJ7Ymxsc2JhWVpbYXZbU0tkXVhpU1dIWWBOR2l1WF5hbVtbX2JiXYVoaGFueHlsbmp2gZB5boN+gIGSiISBdnSJdIyGc3F3doF3fH1+jI+AfpN+cHiWg32ZknmAgHh5fX90iINzcJmie3p/iZV5ZHWIeXN4dWx0b35seXxwkXJecG5gZ2JsVFtaV2hjbWZcXHGIZVNybltaWFhgbXdkaXVqal5abXNxbXRzdGqFfH5/fHdubmxkaXFjW2pyZHR2j3NbV1NkYXKAf3KCXWJjXVNaYFtjk59lcnGFhJF0bGp5bG9vent6cYB2fnJ6enpkZnZnXmJaYWdcXndoV2Jeb2hhd2Fbe3ZqaXJud3NzdGhwgZSChn6EdnNqcHxsZnZXXGttYnBzgXpzZm9+W2BvcWJfaXB8bGtzfnJxeGtwYFtlbG16YWdTZ1VXUlB2W1JQWlJIY3NiYEdValBIT1pWa2xrfGVtb3FgW1pYWWxwV1JQZldXaVNURlpcT0hydVhfY21jWGFgYV2LamNkbXl4a25pdXmGe2uDfX+EmXyChHl9iG6PhnFvd3p8dIKCfIuPg4KWdHiClIWBn4l1gICBc3+BcIeCdW+il3R7houHe2Z4i29ue29meHB6bHN2coxrXnRuYWdla1JdW1ZnYmxsWlxxjGRPb25dVlhVZ2p1aGJ0ZWVdWm51bnF1dXprh3x/fIh3kHNkZGtuYVxubWNzeIdrWlRWYmN4fX1xhV1jX2NUW2BZY5aVY25wg4WKc2poem5lcnZze2x6dHVven51X2ZyY1teV2JkWWF1ZVVfYG1kYXFdXX5waGlzcXNwdXVrbYSTgYh7hXFyZm58b3FuU1tmamZxdIF2c2JsdlVicWpbX25lfGVsdXxycnNqbWBZZGpqd15mVGRVVlBUbVdRV1RQSGVyX2FGV2lOSFhUVm5pZHxpa3drYVdcVVt0ZFNSV2hRWWZUU0haWlBNeHdbX2VsaVpiYF5ej25iZmt5dW5vaHZ2f39tg4B+hpd7f4iBin9rk4hyZ3SAe3WAg32Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9g3ZupYxzgY2Ld3hueoxgZHxwZnpzeWxtcXaCZ2R7bGNmZ2hTXl5UZ2Bsb1tebo1oTmltYFRWU29ndGxleGRlXVlwdG1yenhzbYh7gHace3prYWVsbV5gb2plcHl+Z1pWWGBreHx7cIRfYl5nVllgV2SciGJrcYGHfXdrandsW3Zxa3lpdXJtb3uAclhqbl9ZXVZiY1hlcWNTXmFpYmJsWmB+bGZrc3VubXd2a2iFjH+IeodtcWZwfGxxbGNZYGhpb3SBc3JeaWxSZXFkVGJuYXlicHZ7dWtwbWtfWGFnaHRcZVZhVlNOWGVST1xPT0hlb11jR1lpTUlfS1htZGB4aG59ZGBVXlRddFtUUmBmTl1hVFNKXFlQWXV2XV9mbWhYY2FbXo5wY2dqd3FzbWh2dHqDc4KDeoiNfnyKh456bpCKdGxzgnR/f4iFh5KElY96fYyPiJGbhIB8jIRzf4FzdHhxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6NjY2NjY2Njo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjoyMjY2NjY2Nj4+Ojo6NjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx8fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENERERERUIxLy8vLy8sgKSgoKCgpV4qLy8vMCxIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU1Mx8dHR0dHBh+qaSkpKSqVhUcHBwcFzqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4iHh4aJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYaFg4ODhISEg4yQj4+Pj4+IgoODgoKChYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpOQio+LipCJj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo6Ojo6Pj4+PjYyMjIyMjI2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIyIhoWJiYWIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkY2GhoeFhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCPh4yNiYSGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIyEioaGiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYiKiYqOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKSkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn9+fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKSkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/fn5/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjYyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OKioeHiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cnBxa2xycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGdtZWpmaGVoZ2NiYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXlxdXmJpYF1eWllfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01QUFxXXmxXVVJRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQYFddclVPT09OT1BQUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0xjVFt0VktQTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDR2ZUVXVTSlBMSUlKSEhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4B/gICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4+PEVEPT9KY1tVcEtERkhHRkdCRERERkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PlVkYl5nT0FFRUZERkZERklIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GBgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7PjxIYm1oZmxgRkM/TENDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3PT04OVVscmtqcGtONUpYPkBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdXN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0NAT0I8WG5xbmxzcVtDY1U9P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtdbT9SWUpSa29rZ3JyZl9qSDs+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGRD48PD1APTg6O252R0FiXVxpbmhjcW5rbGY+OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWlE8PD1LTkhIdnZNOFdqaGtuam9xbm1sVjo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUg8X4CDgHp7d1Y7Q2BzdHJvdXFub2BBPz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VASHJ5a2WDhIODg4B9XT4/R2h4dXJzcG1sTD5FQkJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXR3enx7fHt9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R+goKBhH59hHVMQkNDT2x3eHt6cV9FRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERUVDZIKHh4iFXkZJSkxMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gIB4gISFg4SJbUFBV3WFiIeHh4mCV0hMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVW2GiIaHhoeIiYh8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUlISElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVoGEhISCgoaGhoSChoWFhYaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1LR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSklmhYSEhH+Bg4OCg4SEhYWGh4iIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWmGhISBfoGDg4OCg4SGiYqLi4uKiYqLjIlUOjg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCBg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojo6Ojo7ODk4OTg3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3eXt6e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1yhICBg4SEhISEhomKioiHiIiJioqMiomJjHo+OTg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs8PTo+Ozk7Ozw7PDw5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPj0+PkA/Pz9AP0A9PT9CP0FBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSg4KChIWEhYSGiYmIiIaGhoeIiYqLjIuKiouKi14+REdJS0pJRkdHREZIR0VCQEBDRUNDQUJDQj9AREhFQ0VERUVBRkVGREVGREBCPzxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dnd6eXp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRliFgoOEhYaGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX1+f35+fn1+f4B/f4CAf39/gICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JCR0dKWYWCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNT01LTktKTEpJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTktHR0dHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozw9Oj9BPkBAQ0ZJSlFggoOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhHRUpIREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSEZDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojw4PT47PUE+P0BESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLX1JSUE1OTUtKR0ZCR0pHTEpGS09MS0pKTU1MT1BOSElLTE9RUFBRT09KSUpKTEpMRkdIR0VHSUZFRUJAQkJcb3J3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkRFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExKTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/Q0NGVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI+Li4tnVlVrYUVSUVFQSTs7UVNSYHVdVVZUVllZUllYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0hISkhFRklISUhJaXJ2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RaZ1JVVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot5bnBYWltaUlRSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUlZWFlbXVhYWVdSUU5QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p/ZllZXFlTVVRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1NTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haW1xeVFFRUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x9fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5TY1V/UlFRTUtSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxtcnV2dXNzd3t6ent7fXt9fX1+fX19fn1+f39/f39/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUUhHT0ZERUZIR0hCQ0hHSEtHREFBREBPUE1TZHN0dXVzdHV6fHp7e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYltYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc/Pzs7PkBAPz8+a1FLYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQz8+PD1CPkpNRlVudXV1c3R2eHp8e318fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsampmYFtRUlpcWV5JSlBRTktMUVJRVFZUV1JRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en17eHp8fHh3eGRCQEBCPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTFdOSEdAQjw5Nzc1OTk9Ozs7ODk4OT87Qkg/XHR0dXZ1dnh6fHx8fXx8fX1+fnx+fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWEdGRkhCQUdJRUVGRE1SUGFXUlhRUFNTUlVbT09RV1BNSkNGPjo6NjQ4Nzk3OTozNjY3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fn5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFhZWlZYWFZYWV1XV1hoc2tdVmFza2FhX11kYV9eWVVQTU9OTElISktJSEZDUVBTWldUVE5RU1lTXGVVT1NUUU5MSUhDP0E5OTg4OTc4ODU3NTc4NTk5R25ydHh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxQUlJPTU1OTk5MSkZRUFVZU1ROSk9PVFNUXFZSVVNST01LSUhIRj8/PTo3ODc2NTk5Njc2NjVXcHF0d3l6e3x9fn19fH19fH19fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI8WE1JQVE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEtPUVBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I0NTY2O2VwcnZ3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZGQUZHR0hGSkRISkhHRUhMSEtIRkxNUE1HL0VfUj4zQD5qb2FSUlFARlVRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzZEbnF1d3p7e3x8fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEVGSEpOS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLSEZGRUQ8QUE+O0BFOzw4OVRxcnR5e3t7fXx8e3l8enp+fnx7dXR2cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9PTVFTTFRVVFdXVUxMS0g9OTg3Oz9APjw9QEBCPT5FSEdERkZJR0tKQEZBQUBGSEVKT0hQUmFcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0lKTExKRkZGRT9CQz48QkY/Qj9BZHF1d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz9BQEA+QURJRUNISElHSUVCQj8+PUNCQUhKRU1PYmVRTU5OV0tMTUtMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p7end0eHV4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QEJBQURFR0tGQ0lJR0dIQ0M/Qj8/QEE+REVDS05RVExKSU1UR0lJSkxKS0xJSkxNT1BSUEtHQ0tHQ0JKSkxNT01JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFva2xsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtER0hIR0pLSUpLREdCPT49Ojo6O0BCPz1CQkJDSEZKTEpESUlGR0dDQztBQEI+QEBDRENJTVBHSUtHSEtESElLTUhKTEhJSkxLTV1SSUhETUdBREtLTk1QTktNSktGR0dKTU5RTkxjbml3dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo6QERAPkJDREVJRkpKTEZJSUdGRkRCO0JDQz5ARERDRUdMTkhLTkhESEVJTE5NSElMR0ZHSUlMTktKSEVOSUJGTUxPTU9NTk5NS0hISk9SUVJOUmZnZnJvc3h1e3p8bGhqbmVrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKQ0VGRUJDQkVAREI+QD46Ozs9Oj0+Q0E+QUNFR0pGSUhLSEdHR0ZFQ0A9RUVCPkJDQ0NFR0hJR01QSkZGR0tOT0tGSEpGRURFSUlIS0lGSFBLRElNTFBNT05PT05KSklNUlVUUk9XZGBhbWdwcm9yeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkBCRDxCQT5BPTo6PT87Pj5AQj5AQkRHS0ZJRklIRkZHRUNCQUFGRkNCQ0JERUVHR0hGTFFMSU9KSkxMSUdIRUZFRENJSEhLSkdLUk1DTk9NUU9PT05PT0tLS09VV1ZVVFhgXlxpYW1pbmhyc2JlZmVkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJqa3NNR0dGSEJCQERFPEFBQEM8ODk9Pjk/PD9CQEBAREZIRUhGRkdGRUVEQ0VDRElFQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSElGQ0lJSktNS09TTkRRUlBRUk5PTU5QTUxOU1dWV1hWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlvek1IR0hIQkJCRkU8QEJCRDw3Oj4+Oj46QEI+Pz9DRUZERkRER0VERUNERUZHSkVFSUdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTU9PUlRPSVNVVFFTUFFNTlFOTVFXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2poaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdW5wcnN5TklIR0lEQUNIRTxARUJFPTg6Pj49PDxBQj0/PkFCRkNFQkNJRUNFRUZHR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OUFJVVk9LVVZUUVRRUkxPUVBPVFlaWlxaWVteX15gYl5cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cXVNSUtISkVCRUdFPEBHQ0RAOjw+QD8+P0JCPEA+QUFGQ0VERElFRkVHRUhIRkhHSUtJRkpISEtIRkZMSEhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZvdkpLTEpMR0JFREU8QEZEREI7Pz9BQEBAREE/Qj9BQ0hCRkVGSEZJRkZESUlHSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk5MTk5OUEtPUFJVWFZNTlRWVVNSUVBMTlRTUldbXl5fXV1gX2FhYWBiZGVhY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dWVxc2twcWpydm93Sk1MTE1HRERBRDw/RUVFQz1BQUNCQkNFQkJEQUFFR0NHSEhHRkpHQ0dJR0dKRklMSElKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQT1RPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWJobWdiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTUxMTEdFQUBEPj5ERUZDQENBRURERkNDRUdDQ0lGQ0hKSklJS0dFS0pHSEpJSUtISkpOS05MSUxISk1LWmZKZFxLbFNIT05fblVrc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRgd3VoamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUtOSktKRkM/QEI/PURFRkRDQ0JFRUVGQkZGSENESkVFSk1NS0xMR0dNSUdJS0hLS0lLSk5MTU1MTElMTExbc2JkcF5sbVVNTmZzXWZlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW15bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFREBCQj8+Q0ZHQkZDRURFRURDSEhHREVLR0dMTU5LTU1HSk5ISktKSUxLSkpLTU1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3FwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPUBARkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklMS0lKTUlLSkpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkanV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lERURDQUI8QkFCR0RHRkxIRUNDSEtISEZKTExGTktMU1JMR0xMSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ubm9vcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3ZzSEtISUJFRUVBQD5DREJHQ0hJTUlGQ0ZKTElHRktNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1NSUtLS1NrYlppXl9pY3JyWl9Zam9fZWVVa19jW2FiUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcnV0d3JISEZJREVERkFAQUVFREdCSEpMSEZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSUtLSUhJR0tLTEtGSEtLTExMS0lLTE5UW1xUUFRMUE9OT09WUU9PUU9PUUpJTlBRZHFpVFlXW1tcVVlaXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0hERUdGRkFFQz9DSERGR0NJS0xIRkRHS0xIREdIUEtMT0tMV0xJRUVISUpISUtITEpIRkhHSkdISUVGTElKS05MSU9cV15QXFtgXk9YWVNcXGJeTVlaTVhhUkpZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF1iX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQUNEQkRJRUdHRktKS0hFRUpKSkdFSEhQSk1NSk1TSUhGQUhGSklLTElMSkhGRUpHREZHRUZKSENKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl5cXlNbXmNeWl1gY2BZX2JbYF5bVFhYWV5dY2JiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDRkdFR0dJS0pJSURGS0tLRkZJSk5KTkxITE5ISEY+R0dMSUtLSkxLSUdFSURDQ0VBRkpEQEpMSk9bY1lfXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFeXmNhYGJiYmNjZVpRWVZVXFldY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0dDR0VCRUdIRkdISUZHSkdIRkhLSUxEREtLTk1MTEhKSkhKRz9HRk5LS0tNS0tLSUdHQ0RAREFISUI/SUpIT11hWltkXV9UUVNYXVxcXF9aS1dcTFJcWUlNXlBPXF9hY2RjY2JcZGNiZGNmWFFVVFNbWFphXl5eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0lGRkdJR0dJRkZGSUxKTkVES0pMTkpMSUtKSElHQkhIUU1LS09MS0tJSEdFRD9FQ0hIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYWBiYmBjYmFkZGJYT1FRUltTW11dXV1fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSktOTExJTEtJSUhESEtRT01NUExNS0tISUNEQUVESEdCQUdFQ1dVRVxUXVNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXWBgX2JjYl1hYldfX1RQTlBRWFJdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUERXX0lHR0hERk1KUFBGSklKS05MS0tNTEpKR0VKTVFRTk5PTU5MTkhLQURBQ0RGRENBRUZCTUhDTExQT09MRk1GR0lKSEdMTE1PUElMT1BQU1BMUFRTVVpZV1lYWGRXT1NUUFBPTlBVVFtYWVpdXGBhZGVjZ2NrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0hZTUdISkhHTkxRUUlMSktLTk5VTk9LS0xHR0tQU1NOUE9OT05PSEtFYEVEX0xEZmNFTVtJX1xzbU9NVm1ZTENQYFVsV2dKXVdVXkRNUVVMTVRWUVNUWFdUWFVUXFVQZlpoaGRYU2tTVlZVW1xbYGBhYmJiYGZoZm5saHJ6fH1+gYSEhIODg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPU0lLRmBUSEpPSklPTVJRS0xLTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1hQbUhxbnBhVlBxcXNQQmtzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVVd/anR1dV9gd2BYYVxcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExGSkxGUVZMS09JS1JYV1FOTk5MUVROT1FQS0xPR01QU1taVFFRT1BQUEpIWnhdVHhlaFlSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9wgV1menV4cXF6cX5zfWt1fWJSZ3xlc3Nvc3N8fW99eW9/cl9gYGJiWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhLS0hKUE9NTUpOVl5ZVUxRU05YWkxTU1JOTFBJUVJUWVdXUVRQUFBRS0hmeGxjeHJtWktNVXlwdW11Ym52UGRlSWZ2cW13b4BqZnh4aVhzUml7bWlqenp+bHh6f29nb1h2dmp1dXCAYHNofGlseHxvX19fY2JaXmNkZmlqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNCRVBQSEpLSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUElTVFVYV1dPVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnR0cWxtXHR+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hmZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBKTE1LTFFRUVBQUVdcWVVOVllVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhlfGlye11US2xgdnVraXV7e21+eGt8cF1eXmJbXmJkZGdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraG1tcnxrbWhre3RtbWttT0hKS0hJSUhSUExOT0xLU1NTT1NSV1JWVFBXWlZWVFRUYWBRT05LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VSU1dbV1hXWk9TVVdXWFJdWVddVlRPWVJXV1dYWV9bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlNRTVFQT0xWVlRQVFVYVVlVUlpdVlVUV1VZWFBPTE1WVFFOVVNOT01MUU9KSVFSS1FNS0tPUlRSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NRUlVVVlNaUU9TUldWVFlWVFlVVFJVVFRUV1hXXVpeYV1cWlpcXGBjXF1iY2RnZWVkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGRmaFBKS0xPT0xNVFBOU1FRTVhYVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1dTUE5VUE5RTktTUExOVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lSVVJUV1dXWVtUT1RVWFVVWlVXWVVSUlhWVVdbWVpfXVVZXlxeXVxdYGFeW2JiY2hmZWRiWF9gYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RW1pYV1haWlhYVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFBOTVFRT1FYVFJRT01PU1ZOV1JUVVVPTk1RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1dRVFZWVlZZVFhXVFNSWFZVWl1ZXV9eVl5dXmBcXGBfX19aYmJkaGhlZGFZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNRVVpVVFBQTFBXVlJXU1NTWE1PUFJUWFVVVVNVWVhbXl1bW1ZST1VWVltbV1FUV1ZXWFZUWFpUU1JaV1ZcXlpfX2BVYVxhYV1gYl9cYF1jYWNnaWRlYFljYGFfX2VlX2BjW1pcW1xZWllZV1xZXFtgXmBbXl5hYF9iXFlgWlFOT05WUVBUUU9VVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUktRVFRZWldVT1JOU1hWVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFVWXFxWUlRWVlhZU1RZXFRSUl1YWl1eXGBhYFdiW2NiXmFjX1xiYWJfZGdqZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUldSVFBbXV5dW2BcYFVcXWlqcn1zbGdcVVlXUU9SW1NSUVRSVFVUS1FXVltZWlNPU1JWVlVTT1ZSU1pSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WV1deW1hRVFVZWVlVV1lbVFNWXlldXWBdYmNfWWBbZWJfZGReXmNjYV1lZ2pkZl5eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFpbXlZeWV1QT09SWlBaVFVWVlNUVF5eYF5eYlxhVV1eYmt5dGx9bFpVWlVRUVNcVFVUVlRWWVdMUlpWXVtcUk9VU1hXVlNQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlNUVlpZWlZYWVxWVVpeXF5gYV9kZF1eXV1lYWJmZF5eZGNgXGdlaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxYV1dWVlddWFBVXFleXV1UUlhSV1ZUUlRYUlNWVFhYWF1eWF1bVV5fWF9fWF1WUVlUWVpaYVlcVVZYW1paWFlZWlhWXV5fXmNiYWVlXGJcYGZiZGZkX19kYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5TWlZTXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2hZXFpVV1VXW1pZXFlYWWBXUFVeW2BhXFRVWFBVV1VTVlZSU1VWWlpcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1laWVleX2BgZGJjZWViZFpiZmNnZmVeYWJgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGFeWVlhZGJgbGZoXlxdW1ZXWFlcXFxfW1lbYlZUV15dYWNcUlZYUVdWV1ZWVlNWVFhcXF5gYF1hXVdhXlteXFteWFZYWFtbX2BcX1hZXVxdXl5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYF9lY11maWRlaV9mXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5SV1lWV1pZW1xZV1leYGJhZGFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFpYXWBjZF9SWFlQV1ZYWVlXVldWXF1eYGFgX2JeWWFdXV5ZXV1ZWFZXW1xgX11fWlpeXV5eYVxbW1pbX2FeYmRjZWZlZmJaZGZnaWdjX2NeYWZlWmlpYmZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFdXXFlXXVxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl5cXFxYV1tdX11gX11bYGRcXFhaY2VjYFJcWU9YV1lbWllYWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX19cWl5eYGJjXFxYW11gYmFjZWRnZWVmZFxlZmhpZmNiYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYUFhaXWFjZmZya39KWVddWlpfXVxeXFldW15fYWNiYWFdYltiZGJgY2NiXVxbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUVhXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl5fWlhWW19eXWFhX11bYGFiZWJfXVRcX2BjZGRmZGdmZWZlXmVmaGhnZGRgW2ZnXmFoaGNoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFg4GDg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7fHx8fHx8e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3x9fX19fHx8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiYmNjY2NjY2QRigrKysqJWOSjIyNjY6Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMjI+QkJCQkJQ7FhsbGxsUXZaPj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl5eXt4bm9vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9fX19fX19fXZzc3Nzc3N5fX19fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z4e3l7enl9eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7enp6fH19fX19fXx7e3t7e3x8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8fX56e317d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3l9fHx9fnx3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3fHl5e31+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp/e3x8fH57eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXx7e3p5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgoGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJzcoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3Vzc3R2c3Rzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd3dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fYN6hoh5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh4eHl5eXh6enp6enp7e3t8fX58e3t6e3x7kn+Mknl7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHt+fXyahZCaf359f39/fHx9gIOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgH9+gIKBgaKHk5+FgH9/gIF/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyIhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+foCAgICDpomWood+f35+fn1+f39+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5/gH9/f4SojJSjiX6AgH5+fn+AgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpKQioqLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYGBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgYGCgoF/hamRkKKJfoGBf39/f4CBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoWFg4OWq6OhoIeBgoKCg4KDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAg4SBjaypq7ClkoeHhomIh4iHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFhISBgoKbqJ2lqqCgi4aJk4uIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEi4qEhaSdlKCil6GVg5GYhoWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKHl5KDmZeOnJ+XnpmRnZKAgYB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOTqZiUlpCgppeYnqGci3+Af3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4qXiIeeq6mfmqGrlpmfnZmHgoGBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYaEhIODg4KEjpmLhI+goqCcn6OZnJ2ck4SDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2MnI+Bh5GSk5acmZucmpODgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX19fIKXi4GDg42Qk5eXnJ+ZiYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2Kh4ODg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Lfn+AfYeLfoSEg4SCiY6SjomOnJSDg4KCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4WDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYqAi4V9homBf4aFhYWGh4N+fn2Dh4SEg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYOCgX9+goeGhIF/f4CAgICAhISDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/f35+hYKAgICAgICAf4GBhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeGh4aGhoaGhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICFhX9/fn+Af4CAgICAgICAgYB/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgY2IgYCBgoKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJiouKioiIh4iIiIeHiIeHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoWGhYOBgYGBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgIGEhIKCgoKCgoKAf359fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KDg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn1+fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIOCg4SCg4SEgoGBgYGBg4OEg4ORkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Afn5+fn18fX18eXyDhoeHhIOCg4OEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Cf3+Bg4ODg4OCgn99fX+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICCg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4KEgoGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59gIKDg4KDgoOCfX1+f4CAgYB+fX19fX19fHp6eoCCgoF/f39/fn9/gH59gH9/gICBf4CAgYB/gIGBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4ODhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf35/f35+fX5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf39/f35+fn5+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5+fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn9+gYCCgX9/f3+AgH9/gH+BgH5/gIB+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4KDg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enl5eXl5gIKCgoSDgYKCgX+BgIGBgYOCgoOBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAgoN/g4yEg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBg4WFhoaEg4WFg4WEg4OEg4SEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSSkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICAgoGCgIGBgYB/i5SPjIuOjo2Ih4eFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyCf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foGUkYyMjY6OioWGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNjI2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn9+jISBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyMj42LiYaEhoSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX58e3x8fHp7en1/gICDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Ai5CNjIuNjIqHhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f35/f359g3x8fX18f319fX17fH5+f35+fn9+fHx8fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt8fXp9fn5/gICDh4mJiYqIiomFiJGOjIiJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+f359f4CAf39/f4B/gIOCgH+AgYCAgH9/f4B/fnx6fH19fn19fn6Mhn19fnx7g4J9fX18fXx9fX18fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mNkY6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Dg4SHiYqIiY6QjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoGAgIGDgoB/gX99foB+fH9/iYJ/foKQhISDgX9+fXyNh319fn19fH9+fH19fH19fn59fn98fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChYWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5+fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgIOBf4CBhIF+foB/fn6Afn1+foCBf4F+f4B/f3+Af31/f39/gIB+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH2JhoaFhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKCgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn9/gH1+gH19fX6Af3+BgIGBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCgoKEgoGBgICCgYCAgoKDgYGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYOBf4CDgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9+f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB+fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f35/gH1/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIGEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/fn9/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoCAf36AgX5/gIKCgIGDgoSFhoSAfn18fHx8e3l2eXl6eXd5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl9d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fX5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoF/goOCg4WHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHuAfoCAf4GBgH99gH5+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt9eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fYCAgYB/f4CAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn59fXt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcm94d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/fn59fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af35/gH9/f3+Af4CAgICAf4GAgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX99foB/f4CCgICAgIB/f4CAf359foB+fYCAf39/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuOfnh3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXl7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYGCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgYCAgICAgYGAgYKBgYCBgICAf3+Afn99fn1+fnt9fH17fHx4eHZ4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgn9/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgoCCgoKCgIKBgYGBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgIGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoGAgYCAgIGCgYSAfoGDgn9+gIOCgIF+gIKDgoCBgYGCgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4OChIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGCg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYODg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+BgoGAgIKEg4OCgYKCgYOCgoODhIODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF+enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4ODhIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhIWEg4GCgH2Bgn99fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4CChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4aCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhYSFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgoF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISEhYKHhoaEhYSEhYSFhISEhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WAfYF1gXmDf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4CEg4B/fX1+fn6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDfoODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGc4SDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIF/gH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6DdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn1+gYB+foGCgICBhIeGg4OGhIWEhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXt5eXR+gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KBgX5+f319en17fH19f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWFhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4eGg4eGhYWDhIaGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhoeGhISFhoSFfXeFhISEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoaFhoaFg4OFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH98e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn9+fn5+fH19fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhoaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGiIWHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt+fn17fH59fn59f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aHhoaEhIaGh4aIhoSFhYaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOBgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aFh4aHhYeGiIiHh4WHh4eGhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYWFh4WEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fnt8fHt8fHx9e3t7fXx7fnx7fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4aHh4aGh4eFh4aIiIeGhYeHh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9e3t7ent8fHx7e3t+e3x9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWIioeFh4aHh4iHhYiFhoeIhoaHh4aHh4iIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn9+fnx8fX99e319fH16eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhYKBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4OHhYaGiIaFh4SGh4mGhoiIh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODgoJ9gYGAfoOBfn9/gHx/fH19fn17fX18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgYGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhoeIiYaFiIeIh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGg4ODhYGAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH6AgoJ9fn9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhYaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhYaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag397gH19f4J+gIF9foF+fn59fX97f3x7enl6enl6e3x5enp6e3t8ent7e3t9fn19gH19fHx9gH99fIaDhYaGhoaDhIOFgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIWFhYOEg4OEgoSEgH+Cgn59fn9+fn+Efnt/fHyAgX2BgH1+g3x+fn19fnt+fHt6eXp6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3p6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dTU1dXU1NTU1NXV1dXV1dXV1NTV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX1dXV1NTU1NXV1dXV1dXV2NjX19fX2NfX19fX1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4utHT09PT09PT09PU1NTVx7e5ubi4uLi4uLi4uLmwioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPT5ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjoqfP09LS0tLS0tLS0tLS1L2go6Ojo6Ojo6Ojo6OllVNSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKOoz9PS0tLS0tLS0tLS0tW+oqWlpKSkpKSkpKSkppdXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozw8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamprM/T0tLS0tLS0tPT09PVwKaoqKmpqampqampqaueYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Pzs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLU1dXV1dXV1dXU09PT1NPS0tLS0tLS0tLS0tLS0c3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7T1NDPztDT0M7S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1NTU1NTU1tbW1tbW1tbW1tbX19bY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7QppLF0dK5j77UnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQD06ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Sqp2slM3BlLCcsZa4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/QyZeZhaWwpqCLkcOTfX6vsNHOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw9OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9GksL2Ym5yHnbrU0s2ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0NW5mpidkJ+g0tPAoKDQz8/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9DRmqChrK+RobnXr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDVp6Sju56arZup2KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDSwJ2iy8WWpsWYotGen8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT1KSgj7jLm5ybm63Hn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyMamvZWRqqmrpJ7FtKSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEE+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNTKjpOXkKfPkpCn17mDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS1MKvsLPQ1cu91dLRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHU1tbW09LT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqGgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnp2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJuamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6SioaCem5mZmJmZmZmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaGhn56cm5qampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+em5qam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5qZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmZmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmJudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJKLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+iZCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiQlZyanZ6orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZuioZWQm6Cko5qTjYiIi4mRkY6SjouYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKuqqa+hm5+ho6Ogmp6gnJSNmJSYoKChpJ6bmqWnpKmrr6ylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuur6qqq6ShoqSpp6apqKOinZubpKGlqKOgmJ2Yn6GiqaegoqKurKuqp62vqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpaepp6moo6emmZykpqKhoaGhoJ6ZmZ+gpqajop6elp+bmqKioKGfoaKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXVxQVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn6Cqnpmcm6qkoaSfoZucmpygnqGfnp6go5mWm5ikoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq7CpqKqooZ+gp6mtsLKvrKOipqGqsqGkoqOroqWkoqWjnp2gnp+loqKen6KYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbWmBfWlxWXGhkbmNuamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rt7WksrGwm6KnnqKjo5udnJeiqKWhn56jm52hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnlqYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1s7iynra0uX+dqqSin6CXlZqXpKqmpqGko6SrpqWZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHVrcWhpaWFZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1tby8vry8vsa6uLe6vbSwrJOxu7lrj7iyqqamn5ikpKeopK6kq6u1ta+zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb6zqaWHrsG3YXq+wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5ea2Nibnd1dm5sW2JRVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+sK+egK28sl5ptsO6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha21mbnVxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/DwrW7lH2qtaVeYaC8u7Ggm7GvrKSsrrSnqqmoqq2sqaalnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/vLu+xL7FyMbGxMTDuLTAt7S8wcK5wYd7s8WiYWGGubu2rJujt7CmrLS1rK6lpKOopKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyeHN5ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsnFv8PAy83PysbEw8PBxL64vsHDwbp9fL/VpmRicrGztKqfp7Syrqu4tbOsqaOhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF1rb254d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzs/PzMPHxsjJyMjJx8XJx8jHv8XHxMeydHa916RlY2autLe3wL6+ur26vLq8rK2mqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhqaXRteGxdZFtWYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M7HzMnCwsfCy8vIxszKzsXGxcPIqmxwstefY2NetcTByMzGxMHEx8G8vrSwsLDBvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnRiXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPEv7++xMvIysvJvLzIx8nNyMPIycnFxcPCwqNlaZ/SmmBhXr7Px8vOxLe/v8DAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZmNqZGJqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMnDxcTAw8HCwcPCw8GcZGOHx55bXmPEzcXI0MGuvb64ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2RkamJnY1taWlxZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrSwLvAwby7xb27wcTEo2lkeL2jW1xrxsXAwMm/sMG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJjaGpnZ2llaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3r663tbm/u8HZirLCu8O1use3trm7wKZ2cnemnWhpgMbAv7vBvrnGvMLAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXhxbWVlZm9pZWxoWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zRxnagzL3Ht7m4rre1vrGdhYSCk5V7f5nFwL++vby/ycLHyL7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZmJtYFxUSUtKREpCQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wuLuyvb67xLa1uLW3wL7EvMLE2K1ye7bJz8LAuK+1vr+gjoR9h4SPgYSZsMLCv769vMfGy8rEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxpbnRueGNnYlxjUUtUSEVFQ0hDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi6vcfKycLIydKWb3Cp0tHMysS1u8mviHhwZX15hW9zgIi1xL7BvMC/t8rJxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fY15gYU5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvH0sK5vrzEvre8wb/Iz8bIysrAhHByos3Ly83KxsXBlXBiWU9sc3tXWGhymb/BwL/EqKTIxMPEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa7uK7cwr62vsC+vbSelKKrr7++o3Z0d6LQycvIwcPDpnhcTUZBX29wSUVYYX2qxb/BsoiZyMPAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4c2dwXVteXVlSRkRDTUlBRT1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7yK1ssc29tbnAvKR2amdsaG98kZRudHmi0cbIwbi/vYdiTEJBOlRoZEU6TlhoksPAtJBynsi+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX99dmx1e3BuaVtfYFlTUEFGSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wNCpcoO0vba1v56EaFlfXktRWlprb3J9o82+urm0vbR4UEBRZUBLXFlHOUdTXHu8uZxyaay8tcHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN1dnducWBfZl1bVEo9Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLLoIJ2i6Kws5FmYGVVWV9LSk1PU2xzhKXHu6KjrbiwhEVAcJZRRVJRSzpKUlVsqqF/ZHK2r7K8uq67tLOmq6itur64y8K/vqyrsK+zu7e5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FbXk9IQj89SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xaKGeXWNoo5bUkFYVEdhbVlTR0ljjaOqw8aZhJCjsKVCR3uaX0JQUU45U1pSYYt/aV+Jt6Wss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWZYXF1STk5BPkpCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uMKwjn94h45oTklBa1dCT3WFmXBNQ1Z9sLvRrnp2gqGmRkhod1hCWFhbPFZjUlpvaGBfobOepKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdGlsXVtqVF1cUE1IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO4s5KMiIN3VUVAVIlWSkpTdYt/YkBZqbmyx8+SZ2yDhEtGU1VJZJGfqZ6Xe1FWXlxXcq+noZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrqnmJmWaEw/YIBqTklJTWeaf1ZHWa26sa/SunJbYWRRRVBwlamlnpqcnp+BVFBTU5Svn6eWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mo5ujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn96Y3dsblxRaFRQTkdQTUxCT1FAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wammvWFCXKN9T1pJS2FLW4lmbXOOr7WpvNKXVU9PUG6isKecj5WRjpeeoo5TSVylpJ2olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZm6SZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXZ9bWt7ZGhVUWNNSkhHT1JNSk5HPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgq8XAyZZOQnada1FxTFBhZ3dwX2BrgZmwsK7Gul0+YJSlnpiSjI+UlZeXm5+mi1ByoJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd4fGR5eWBiUlVgSElKS1NUSVJQTDk/QTY3PDY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTGxoZXUk1kn15ufXV5V1FrY15qZ2x4jrSvtMJ/hKGfnZmUl5mYj42QlJCLjZCBiqGdl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSqsq6imZydnqGZm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk9PVUxTTEE3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOPeVdzdXJ0aV9yblhZXV5kZ1liX2isrquwqKOfoqCWkJOboJqYlpGSnpuhpZuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVqd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgon5ve2lgY1dNW1JVSEpPVVBHUlNKmayqqaSfn5mSkZOYmJaVlIuHio2UnZydnZ6Xnpmmn6CopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6elpJ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXZtaG1cWFxDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjn5yIX1ZfZl9VTExEOj4+QkM+PkNTeKmtqaqln56foqOdnp2anJuTkpSTnZ2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Ops62qs7Wvs66qr6Odq6e2sa2isKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t0cnFoVlxRRlRIREpQST9FQTRGSDk1Oz42Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+Te2BgZl5OREU8SkVIPD86Nk5+qrOno6OhoJ6lq6Wel5yUkZmdmJSMioaIhnhtiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8TKycPBxr66tLq6tbu3sLWyqrqyrru3v7u6qritq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hrZVpbRktMRURTTURCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZyZe3JpX1RMRD5LYIJzZUI9XI6urKCZm5uenpmXl5eSjI6Wl5OOjZCLgoOCd3JxbXCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcXM0dLVztPJvcC/w7vGxcjF0dPN09DT08zKwsXGxsrIzr/I0czHxsfFwbzDwb+/v7a+s66/wMPDx8THxK6/uLK4vMPCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTERFUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWhkW1NIQ0BATZCnsJyDoLKto56cn5qXlpSSlJaRkI+Mh4ODiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1dbT1MjMxszNydLNztPNxcjKysHGy8fJyMa/w7OzyMTLy8vPxsq/vr+9wcfEzMzIycDDv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZtgUktIRENARli20ryyr6acnJygpKGdmpSTlZSJfXdwa2ViaHFvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1dbZ1dfT19jO0srP0czP0M3T0L/Ix8rEzMzMzs/Fxse2v8q/0s3Mz8bJyL/Ew8jOzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUlKPjtBOD00NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSln6KhWUk/QUNBSVN8sq2mmZSXn5yaoKCem5yZlYl3aWNgX19gX15fX11ibHV0cHBvbHJxdZLEyMbU1tfX19PW0NXU2tTUzs/V1NTR0czRzdPX1tPV0M/S09HJ09HI0NfX2NHX0tjZ1NbMz8/KzdLLztDBxsPIxs7N0dHSyczNwMrMxtPPzM7IxMrHx8jMytTU0dXP0szTwrnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjq2dDOT0+R1qDq6efl5WXmZqcn52YnJySfXBlY2JfX2FfX2FgX2BgX2BmbnBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NfXy8jOxMnPzcrMwMrAyMrNztDL0M7OzM7PyMvQ0MvOysLJx8nMy8zS083T0dHQ0Mq9yLmwrru4taq2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2ppLB6S0pFP1qNoZuVk5ebnp6enJOWl5SIa15eXmFkYmBgYGFgYGFeX19eXGJtcm9vc3R2dnmkvszV0dbU09jWzs7Uy87Oxc7K0tLPx87NzdTLztPNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzMLIycPMw8XIysrPys3M0M3Ty8bIz8zIx8vFxsHGyszN0NHG0M7NzczPxcfBuLm9w8O9w7mysr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomGeXFya21nYGBwaFlYaFZMRkxJUFFCO0M+OzY3Ojg6OjU3PT1AOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7SooK6TeHJ2e4uVmo2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYmBfX2BhYWBfXVtdZ3JycXJzcG1yeaTG08/L0M/T1MrFycnGxr/Dxs/Ox8XHzcrSyMvOzsbR0tDNzNTKx8vOz8jHz9LL0c/GusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS/wcfMzMzPwsrLyMfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raO2fGaDg6esk46Nlo+Fg4ODgX2EhH5zYFteXl5gXmBjZGNfXF1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPIy8nIysjBxczGyMvNycTCysnBwszQxcvIv7nBu8bIvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa9vMDDxczFxbzAysLFx9LFwMm/ysnGyMbQw8PGw6/Ey8fEyre/vLq0qaykpZifmKyjoaWbo6CblHt3cnRmaVphbmxaXFhSRExGQkdETERGU0A1NDMzND89Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrGvtWtfeX+mkIqSloZ6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFtcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wcHBxb69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7vGw7+8wc3Dxr6+tcG9w7q9xrvCurO8xcTCwre/tba+v7vMw7y1usi6v77LxMHGwsXJxsnG0MbCzMeyx8nDzs3BxcPAvbO3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NbXzcrPxcnFx8G5xb2rraRfZXSHk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYWFkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5nb3MwMO6wLiusLGnqq2sp7i0t7Szs7S7tb6yt7C1r7K8wrzBxLzAu7Wyur7AuMe5tLu2wcK8uL3GwcO7ta+ytrq/tMS3u7SruL29wL2xurawtrqzxby2rru/tbe0xby+w8XAw8XGyMvFwMbGu8fLwM/Kx8PGwsO3w729trm+x7+stbq1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HFwL+6t8m2qrCYW2hxjI+FiIl6eH6Ghnd3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aXFtdX2xwbmhma21ucnykx7+5uLWwq62nnqOqp56rrbOtqqyptK63sbOprqass7y6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCywLa4vbCwp7Kztbu8q661pq62r7uysKq5sK27rru4u8DAvrnCv8fDxcC8xsLIyrjFx8a/x8TDusTGwrvGyczLs7nCvbuziXN2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHF0MfNwcPGv8TEw8PKwsnKv8C8wbqztLXDrqmwkVxqfpKHjo97eH2JhXp7hIB3bl5dXFxdX2BfX2RjYWRjYmBfXVpbWlpdWlpaWlxlbm9oZmdpa25xga25sLWupqWop5qgpaGanKWsrqSooquqrauwpKafqq21trG9ua+3r6iuuLS0vLi0vK+4ubWyvMGywK6lqaOrsbKzqL2qq6irra20s6aoraGkr6mypqeorqaot6yxsre6uryxvL2+vsS/tcLBx8i3v8DFt8TDv7u/xMK+xMjMyr++xMDAqYdzdHJqaV1hb2NXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvByr67yba9w766yrfBw8G0try2sa+1u62oq5NlbIiDh4uAe31/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqaWrpaCcoqWUnqWbmJGho6qjo6ClpqemraCdnKSmrbKwtrensKyoqrSrtLqxtrautrqyr7q6sbaloKSgprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6SgobGtrayytLO0sLW8trvBwLK6vsPBsrm5w7PBvb+1uLy9v7zCx8TDw77AxKCDeHBsYmZfa29gVVleSE5nT1RHRUtGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NjY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbagnpWdoaa6tquzs7uzxM/Jy8LGuLbHwMy/uMm3u8W4s8S4s7/ArLW8sqylr7OtoaOSaXGGhYaAfHl1c29tamppcGleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4edqaCXlpuilpyjmZaNn6Gjp5ygoKSloqeem6OboKuwrbG2o6mqqqyspLS5rbewrLO1rrO1rrCqn56fpKKypKapuK2ipqagqKyrmZ+gnpmdn6WamaOcm52vqaunqqysrbGyuK+4ubuwtry8uquzs7mzvrS2srG2tb+2vsC9w8G7u72XhHpzbF9lXmRkWFRXXUlXXEtQR0lKR0E8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7w8PPvrrHuLi/t7LCtLG7vKu5urGinqmrp5eekG1+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtxjaedlJWVm5ibopeWkZyioqienJ2lp6KlnKChm5murq6usqCmoq6rp6K1sbKyrKivs6e6s6a2oKKfnKOhraOiqrWqoqOmnqWmo5aZnpeZm52gmpednZ2craKrp6Skpq2rs7SqtbCzq7K5tK+qr7Kys7izrqmsrrK4sbu2ur2/t7OxlIV5dWZeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzMjGv8W2wcDGzrfAxL2zubmzv7axubussrStnpqkqZ+Umo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanahnJOVkJWXl6CXmZWXoJ6hnZagoamkn5+pnZyaq6evsKubo6S4qqGgrqi2qqenrbGkuLCkt6Cjm5mZqqahmqy4r6KhpJyin6CTlKGUlpabmJeWl5yVn6qeqaSinaOqqrCuqLSrqqets7Clq66zsbCvrq+mqKiyrbG0sLy0ubeuo5SBeXVkXmFWWVhTUlRLTV5MT0tHR0xMRT1BPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ijqrvAvcC5rrS4wczHxcLDvcW4yMuywcLBrby7tbu8tbm5sK+wqZuZoaiUkYqLgIB8d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZpgZaTloySlJSbmZ2WlpygnJ+WoJ+npqSmp5+dn6agqq+mn6Kkt6ihoaKotKKlqKWwpbGurLSeoZ2VlamhopStsbGfoqOdnpibk4uhlJGTmJiTl5eYl56nnKehopqkpaWrpKWwp6Wjq6utpqmur66rqKqps6amrK+0sa+8tbGvr6CSendyZWFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsXHtsXEssK/xau3t722vbq6tbKrrKeYmJ+ji4l0iYh+dm5jYWZpaGZnaWZqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVTVVJVYGBfYGFfYWFjZWqAlJOKkI6Uk5SdlZaXpJmgl52gpaKtpqWlo6OinKqrpZqfpbGqoKGepaueqKKeraypqa6toqKilZijm5yQq6mwnKCin56XmZOKnpGNkpOWkJiYlJyho52koaKVoKKkppujq6WipKqjq66lrrKppqWmprSmqaits7W0ubqvqayejHJxb2BbV1ZWUkdRT0haW09SSlRLU0xFRklEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojw8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG+w8issbjBtbvAu7S0qqymlZqbnIiAcoiDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl9fX2JkbY6QhJGHj5GPmpOVk5ybo5yboampq6isp6mmpJmlr6WVmaWvqqCcmZugnq+ZnKuzoKWmn6OkoZWTm5aWkqmqrZqcn6Ggm5SQjJmOjJGMkY2WlZCdoqCjnZyjlZugo6GXoqijoqiroKuwpK23paOkoq2tqqirr7O3s761squvmIV0c2hbWVlTVVJFWExRW1hNVE5QTFBRSU5JQj0/P0E/PTc1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc2NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbuztaapoJaXmJeHenSAdndubWhtbW1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGR+jIGLf4uQipKNl5GXmaKgm6CrqqavrKiwpaman62glZakqaidmJCPmp6ul5ioqpmfnZSloZ6SkZKRk5WnqqWamZmenpaNjIuThomNg4+LkpWRoJ6hpJiVn5WaoaKelJulpaeoqKCxsaaxvKefo6y1q66nsLWwuLXAsa2xq5F+cnNiVlRVTlJKR1ZQUlFMTFdNSkxOUkdNS0FDRkRDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKWxt6qlorGrnaqnqbKxpLbGtLm6s8rFubrBy9DKsba4u73Bw7GvsbettLO7s7Oio5ydl5eUg393a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3WJjYeQipeJlJSYm5meqZugq6amrJ6omqCmnJOPn6Obl5eFhJKbo5CVo52WlpaIopublIuOipCapKeclZWXm5GSh5SOi4GLjYCQipKSkqCaoKKWlJiZlaKmmY2ZpKaopqGgtLKnsrehnKK3rKqtpLKyprW8tayrsaOJeXNtXU5RUUxPQ01OTlBLRk5OSkpOTVFITUpBR0tISEM9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrCkp6SqpaCopqWzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatuq+tn5manZWUh3uDbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFvc3ZwhIiCiICRhI+LlJGUnqGPm5yjoqSZpZeinJWNh5majHONg36Ol5aGkZqQlI6Oe5mPnYyCiX+JmJ+jnpCTmJaFjYKUfn50io56kIeTkJCdm5qakpaQnY6jo46JmqCho6SborSvrK+tn5iluKamsaGwrpywu6qpr6qZg3dzY1ZNUk9QTkNTTkxRTEJQUUhJTlJNSEpKREpMRkpKPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6alp6ans6eltMG4sLSwycS3ucHOxr2zrLrBq63DraehppKdpraso5+PlZaSj354fmVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdaWxybH+FfHROWHKQg5eHjp2Xi5SRn5idlZSWlY+WiYCTil87V298jJSJgIySjJCGhnOKhZeBeYF7hpOdk4OVjpGQg4Z9k3hxcIWNfYmBkY2Pl5qZk4uQiZ2In5iIh5aemqGgl6euqa2pqJ6WrbOipq2ZrKuYqLOiqa2jk35ybmBbTlNSV0xEVEpQTExGTk9JRUxRTUtPSklMUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaijqrCop7TBubC1sMfCt7O9z7+5r661wqeqxamjnZiDlJuwopmXhpSPi4d9c3VdUExSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l7gnRRQkB/lZKSfYmVjYSKjZuOlpWJkoiGlYZ5iX9gSlFueIuShH2EjYqFf39ufn+UeHV2eISNmW9RjYiKhnt+eJR2Z3eGiH2KiZWLjZGSl4yEioiVhJqMgoSSmpaenZSko6ippaSemrCroaSkkaaqlqKqnKKmqIl1bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foa+hp6ilp6iwraq2vLa3t7PBu7anusi4tqiotbaqsrymnpWNf4mTqJaVin6Og4J9eHBuWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaVxVj4mUiXR/h4F8hYyTgpKai497ho+AdoB4c292cHSNjoF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4B2cnKSd2h1hISEhXuVioiKjYuAf4SLjICUg3yAj5iUnJaRnp2pnp+gnaCppZ+dmIynpJOhoJaen6SAcmhhXF1KV1BSSEpYUk9KTE1SSkpKTFBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppa2ssLKqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjZSBjpyOkX92hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g3x4ZneNl5iNj31oeYF2eICJkH2EmJKBcoePfHd7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfYmMiIBseXF9cW12j3FocYF+jnBDi4SCg4V/d3d6i4V9jHt1fo6Sj5iKkpqbo5aZnZqdnqGclo2KpJuOnpeOlpiQd29tZWJaWFhVUUpTVVRPUE5QVktOS05PSlFOSE9PTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsa+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZjoWSeYiOi4p1cXxtdXBqbWpYS0ZHRUFAQ0RJTExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ7fX57dm90c4WCeYF5cHyOjIqUg5aXmJqQkpWXmZedloyDiZ6Ri5KNhpCWgG9qbm9uWFZYVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2wo6yqqLWvrqy0v6u8wr+mopmVpJeejYSLlKGhmJiRk4tzjnqAhoyFdG90a3FsZGxqWU5FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxgp4himml0emV/cG1/eouJdoKIhnRsmpF0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcX98aHFxfG6Tjo98c318cXBudm2Cf3d5dWp5iYKIiYSWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra29oZVhRWldZWVtNUFVWWVhOSUhFSkpIR0JARkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6e7r6uysMKxu8PHmpaPlJmLjoZ5hJCYlI2QjI+GcYeCdIeMhnpwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYmAZ2diam5ybXCDdWlvWHVwjpuSd2x/en1tcm5wgHpzdm5idoN+hoCFkJCKiomRi5GMi46DdXiKjoB+g4B9j3tycHBsYFtcXlxZWGFfUk5bWlhXTEhKRkpHPkJBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGdpKeer5Wltaqusa7BsrvBxpaQjJSPgIh9boGQkomDioePhXWChGyViIh7dHh4bHdud2NpXklQRz5ANzQ0OTs7Oz0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoGFmYSbnGGGqp+di4OQjXp3iH6JiI1zipeQg3pdZHJ0enx3im1oamJ5b4aQgnpugXd0hHpwdHl3a25pXXeHfId8h4ePf4uSl4ONhYyGfXGEf4N9dXd7fIl3cHN0ZWdfW1teVFxnXldRVVhbVUdKSkRMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkpydn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYSLfX2Bf3CAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cnyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJKoh4CYmIqbdG18gYaHfY5oZ2h4f26Fh4KFcYSGR2yAd3J5dmhta193fYOJf4iFi3qVnZuJi4iRf3p1i3Z8eG1vd31/dHRybFtdXVtjY1hnZlxVT1BWWVBETEtGTklDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbmqWtk5q7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnH92hYWKkIiQaWhvg4B0jIeEi3GFgneHf3t2hX1udnVmgJSPhomJh4iHoaqilomOmH96gol6eW9na3h+en5yamReWlpdal1hZmBZT0tOV1JRSFBKRE5HQ0pEQkBEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjICBkY6KmpuknaGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYyLgomNg3+Jf21wal1CQTQtLS8vLi8wMjIzNDc3ODs9P0JESEpOUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdmo+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6Gfk5iShIuFj5mRlmxwdYmLgpaMjY93j4RxbYWBipaRg4WIcoihloeTiY6PlqW1qZuNlaKDh5ODfX9ramt8gIGBc2FdY15aZmtcbGteV0tHT1NRTk1MRklQQ0RNRkFDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpeWmpWenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioSYkpGCgICLjYmFkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NFTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2cqKWimaGXopWdn6ieqKugqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiZWimpp4en6UmJKhkpaYgZSee3eVkquziI2Xn32UnpyOk5aZpKKmtrCdkZmoiJaPjYGIbHNyfH98cWhgXGBeYmdjYGhnW1JFSktQT0lKTEZGTUNITEZGQ0JHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYyKhJKFg4aJgYCGd19iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQU1RUlNQUlNVUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2GkHeVi6OnqrS9uKSurKynqLSrsLaysq27sbO+nLPDrLvJy7fDv7ilo7CyrK2qo4uWmIWmpqCjl4GmmY2iqqikiIWUpKGgqqGkqY+csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opSkqoiZiZKKlXl6foV+Z2BoXGViXWRjX2ZmX1pPQ0lIVE9GSExGSkdFRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRj4OFgIuFhoeShoKEiYaIh4dxbmFARTY0PDIvMTEwLSwrLTEuLTM/REFNVVFSU1VVV1VOW1BHR0U8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrHBx8Oqs8W2rLO/s7i+tr+0wba7u6S4xqi2yce1vrm0qKO0rbGxm5mSmp+JqK+rpZR2n6SXoauxs5mWqq2orra7srqsr7Wisayxtby3ta61oKeno6iaqbCtsrq4uKebtqmMpY6Rk5+GeIKDdVlhZFZlYWFjYGFmX1tUSkRFTFVRSElKRElHRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRY2RXeXVxgZR9hYeTdoV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk42HhIGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtKQUA+R0tGRUQ7PkA3RDc/QkpKRUZXVFBej6Wuo7G0w7a4wczJtrvEvbOzwLe3wbW/sLd0sbOmusWksMa5sbOxtKiktbaqsaChlpuikqWwrqatq6ekmKCss7qiqbK6tLu+zL/Fxb29s8K3uri/t7q3uayssKaxqq2+sL27wsKsmbqolK6Pl5eriX2CfGpXYmFXamVqZVdbZFlWVElHR0xRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlVWnZqcH+PhIGOhG56c3mHYrihmaOJlZOWk5STjZCWkoeGe4aBjZaKgYSBinp8ioeGfIqDgYqDlX14enVlT1xkR0VMOlFjYVteU0Y/O0hQRFpjUVFZWFpnWVRgYE1TUEVBP0lKSEVGQUBDPEU2Qj5IR0pMU1pUXZOvuLW6ucm/ur3JzLu8wby3tbu7t720urHGYXWypbGanqq9qqWoq6qjorK1oauonpWWn5ifrqWnpqWfo5SiprG0p7KyvbbBvdPJytPGwsXLwcrDwL69v7u8t7Swube2w7rFvcPIsJ65qqKrjqWotomAf3FfYmJdV2FfaGZSWGFWUlVJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbGxxkI2FkHNscnJziNXAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWin+Df4N4e4uDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1fbl9YZ2VVWVVLREFLS0hGSUhIR0JJOUQ/SEtUVFZcWluSucC5vbfGwLq4ysu6t7q2uLmyt7W0rra2mWR1qJytcF6hrZyYoKKbpJ6qpZSgn5CUjpaYl6ifpZ+empqEpJ2spaqwrLewvbnU0c/Xz8nM0czPzsrGwL7Cyr3BvMHAxMTFyr/IzrSku7C0r5urubyaf3lsXWBcWV5hWWNjUVxgU1BLQ0JFR0U8QEU+QkhCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkJRvbG91dYezrKGhn4uZnJmMjZWRm5KFiop+iIeMkIuJfIGEc3uKg4V7iXSBiYaVf3N7eGttdXtocmVpbGlmamloYGZpaGxabnSXraS8iIdnW29oXVpaVEhLTk9KS1FLVFFITEFKR0tQX15iZmlhl7fHsLmzu761scTHtbC5sLC7q7Kxp6q3rI22p52bp5pPmp2MjqCWkaaYpZWKk5OJkImPkZGem6GXmpWWh56appusr6ivp7O01NTU1tLLz9TVztPPzcXCydC/ysnKydLHzM3C0NK4sMO8xLmltrrEooJuY1xcXlhhWFllWlFdV09PQkJIRUJJO0FEPkFHPz9CNztDPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiCaHFveXmDoKqeppeMm5uXi46VkZqOfYmLhY6KiouQh3yEgnB/iIGGe4dyg5KLj35xeHVrcXh+cXtteHNsaYFwbWNpbnB4aXd8fsu/wt+nbWN4bmNbYWBKUFJVTlleUF5dTVBOVFFVVFxubnaCcpetuKy0p7C2q6y8wLGrtaakuKarrqGrtKOOsa6amJiMkZORhI6bgY2nkpyJg4uEiomEi4OTlZiXk5uRnJiZmZ6eq6ykp6Gsrc/S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxcDOx8fDqL630J56bmVdYl1XYFNdW09QVFBOSD5BRkFCRTxAQj5FRD5APzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd2x3cH1+f6GenqGLjZmTk4yMk4+WhXmFj5CNi4qIkYd/gntyfoCBh3mEdYWTkYl/b3Zya3N8e3d8c4F3cWuAc3Job3F6eXJ7vsubfoyyg3ZyhHZoYWpdQ1paW1dmZFhla1NYXV1gZF5jeHt+i4GZqqSkoaChqKaqsLiqpbSjoa2ho62ip7GfiaaalJKRiZGOiIGUiWuVoo2ZhICFfZGDg5OWrYuVjZWZjoWSkJ2Xp7ChoKGkpKjIzs/IwsvR1NHU087TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzEw8uLc29iYF9YVFpTXFBKR0lJSkA7OjtFQkQ8QkQ+SEI/QkM7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuWiY+KiI6Hj394hJSZio2IiIuJfoJ4c3t9g4d3f3qHkZaAg254cG11f3Z4fnSFfHlth3Z0bn12hHV5e522jDxBi8alfo18aWVWSUNmY2VjaGpkb3hbX2Zpa25pboCDiZGLnZ6gnZCXmJ+jpKaypKSzoKGlnaCpoKKxnIaekpKSkIuOi4aDkIR+nJuMjYOEhXqUfoKplaOMkoqXkot9l4qakaqzmJqbp5ynvcPGubbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydra0tW/y8y0eHZuZF1ZUlZRWlZGR0pKRUU9Ojc5QEFCOkhEQEVDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgYd8eIWWloiPg4eFh3qEeXF6e4SGdXqFjo2deoxwfG9ven9xfIFxg4eBbo56dXd9fIJ1f3yHiLB0WanCtoySgnBuYj1eaHJwcXBueHeBZWlvcnV4cnuLh46UkpuVoJWHjJOboJufqp+grZyhmpmfpZ6frJmLmoyRkY2EfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yOlIyGe5uIk4+uqpSVl56Yp661vamtvcbLyMnMy8/Iw9HK1NbZ19jX1NvX09nb1s/b2tHWydTLlXl7aGhbWVBSVF5IQ0VJST5BPj03Oj0/Oz5IPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKBhH6DfHyEl46Hi36GhoB3gnlue3uHgXV6kp6NoHaPdYJ0dYF9dICEb4GPgm+ShHR8gYV6doZ7ibfGpcLJt4GWm493cGVOZmOBeoF3hqKQi3h5d3uDf3yEdm6UlpSVj5iQg4qPlpqXl6acl6CXn5OSl6OdmauWkZCKjZGCjIWJiIGFkJGenJmJhYuBhph6iYmfl4+IjoqLgnyhiZCLvKGYk5eanKmmpa6fqLW+wMC5x8nNzsXNytHW1tXZ1dfb1NfZ2tvX29rZ2M7cxoZ6eWdoZWBUV1ZVTUtETkQ7PD08OTo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqLfH6Afn98hXt+gZGJhIV6hIh7dX10bnx9hn50fpKdkZ6DknyGfniOfXmKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLyMnKOcfYmEfYlzjIp+c6aanJiUhXuPkImEaEdxoaSdjIuQkoWJi5CSlY+dmpOVkZeNjJWfnZShlJKOjZCLfpCOjouEiJKWmp+fiYyUkp6RgouAppmIhI6DhoSApYaKi7iYnZGVlqKnoZ2enaOutrq1q7/GytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld4eHdraWRXYFtUUE9IRExCPT0+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4h7fHuLh4J+dYOGeXN6c22BfoV9d4WboZudlJKAi4h/mIeAnJJuh6iFeqCLfJGOg4iEnH6akYqNo6KfkKSuoIuRi4WLgZKGV3Kti5+rm4+DmJuQkI5cgqKRgoyfk5WMh4iMkpOMlJSUj4yPioiWm52PlZaRi5KUhoCLiJKNiYqclpmjo4aSnZahi4qIjpyQg4iPgIOHhaSGjJCzmJ2SlJehoZ6Zkpyep7G4rKW8wsfNx8bPzM/MztfP0dSu1tXY2tja2tfW2dqfb3x0Z2dcXVhTV1hDQElEPj4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE5Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhtYn6Sg29td4t4eX96gXyGfHt3hoR/c3CFgnp1dnZ0hIOFfX+SpqOfpaKWiZ2PlJeLiqiXcoqyjYSnkYSZk4WZi6KWoJiTiZudoZKpr5+RlJCNjYiVi26Nt4WaxMiynKGlm5yYlpGykWSkzceWj4WHiZCSjY2TlIqFioqGlpqbj5CUk4aVl4R/j4uZiI2QqpeXpKOImZ6Wm4mPh5eXioSPjYF/h4+liY2TqZqXk5aZoZmfmZOdm6OztKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgnJ/aGNfXV5OSlRaQkFHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo+OkVNRkhSV1NSQmOBRnWCj318bX6IeHp+eoGBg352doCDfGxui395fHh4fISHi32Ko7Ono6qyoZann6WklpWuooOQuJWSs5mNoaCMpZuvo6SdmJCnlqeZra+kl5SWlJCLmJmWoMCOpMm4q5uipq2YkZucsp2GhaiinJiFiImOlY2Lk4+IgYaHiJOYlIyLk5OGlJiGhJGQnHSRmbOWl6WhiJyZk4+KkIuXmomKlo6GfYyYnomQkJyamZOYmKCUoJ2Vn5uhsa6ipLe+tMXHxL3Dw7/GzcrJ0qfOzdPS0NbY09DYu3J5dlxgVV9XUEhJTkVCQ0U1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY2PTpKRkRHTltcWUlmYDtIhIt6em6Fhnp8hHiAhYF+cHh8fXxvco16fYF7eIaLiYaDkqe7raiyva+lrbOzqKOisKyKmrSeo7ikla2klqmtt6ako5+ZqZipo6+wqpqYnJSVkZefl5m7u63JoWm2uKuwlJieo6uTl76jXqqygomKjZSHkXyOjn2Dho6PlJWIh5OXjJCVjYuMl5iSnZm0l5arnoublJKNkJKMmZuKkp6Qi4mVoKGNlI2Ymp2TnJmelKGglJydpa+ooaWzuKvCyMS1ur27xcfIwtGhxsnNzcTX1tHL06FwemhdWVNeUk9GRD48Q0FCOD84NzQ+Rjw8NjwzNTM0NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlR2JgYnBJQIuKfoFzhod9gYh1goqDf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7TBvLStq7O2jKiyrq68qpu7pKitubirpqaioaOjqK+ysaudnKSYm5iXnqKlpZKjua6owLusrbK5paSnfYiHnKy9sIOMjIuQg4+DkY96gYeQjI6ciIePl42LlZeUkZqWnaeasZqRrJ2Omo+SjpSQkJaXjpGgkYmVm6OslJaPlJyelKCdm5igoZWanqenpKKksLKmwcfDr7C6tsXEwr7Np8fDx8O81dHNxMqIdHNiXFlfW01KQkxARUc/QT9COzo0PkE8PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZkZgaWdaXVuTjIyIe4eLhoOMdYaQioFvfnyCf3F+gXqVepGUlJiQk5WntMbJv8LMwcO5x7y6r6u5u5eytrqywK6lwKSrr7u8qq2roqKdp6qutLCqm5+qm6GblZ+wtKeLorq6tcG7q6mcsqWkqJSFjqrDxKSCi4+HiISGlZSNeoOMkY6RoYyMlJGPiZefl5OZlZimoK6djKqcjpaPkpGUlY6QlZGPoZSGl5+gsp6UmpSgoZmkn5qgnKCUmZ6mpKanpK+tpcDEw66ot7XJw762zrLEvsS8s9HKyMK1dHltXFhcaVNMSERMS0tKQUE9Q0Q8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpNZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KCkHmNoZaompqYur7IyMrB0snKwsy8wbOtu76nur+9vMS3rMGprLK7vaqwqaOlo6yts622taCfr56lopijtLypm6i8waO2tq+rkrCtq6yXhpqqpqWRgoyTpZWJgHWKknmFjZKQnp+Tj5SLkI2Uo5mXnJWUo5+qn5GlmoyPj5CVloh8j5WSkqOblaCinLWmkJ6XpaSjpZ6eppielZebpaOpqKKyrKi8wMSvpbO3zMC5rsSzu77CuKzCw8LAmG15YVhXXFtLS01KRkRESUJCQUNLOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY2Xjp6SiYp/iZ+ThHeFf5V/f5CIipB/laGarqajmMK9yMPHxdPNzs3Lu8G3r7q9tLzKvMPBtba8rbO/ubyur6igqKe2ra2psbeanq2ip6Gdq7e3qaWvvsOxvbmzp6q0s62ulpalrKigkY6SscWnlY58kZV9h5GYjqmZmJOTj5OVk6Wek52Zk6GjopyYn5mLjZCPnohakJaXkpalmWWYo56ypZailqytq6ebn6aXmJeZlaGkqaaftqupurzEtaW0tcvBuKm2rLK6uK6ouLq9uINsblpXVFVORkpTTks/QkhFREhHRzk1Rk07Pjc+QUouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJxRmlJUmViTEallJyWoZeplo2Qg4emk4iBh4KchIOVkJCUjpqin6++rqHGvcXExsbOzs7Syr67tbG6u7y+zrbEvbe5t7KytbO4s6ymnKuruKqop6+wl6OupKekpLTAsKqstL7CucC5s6e4tLiyrpWlra+upYuTlaGNdMGafpeZhY6WmYqxlZqZlZKTmZmmo5Wfm5aaqZ2coaCai42Qlp1gSpacmpWapZZUlrCfr5yfpZSvr6ymmqGmlJOZmY6doKeimbSpqrO8vLursLLHwLilq6utsbGjobKytKRxbmZcWk5QS0RQUFBRO0dKSUdIQkM+OUtVP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UUVXUnNiV0ZIqpeZoKKor5mRl4eLp5aOiJKFn4eEnZePnqCao6S1yLSpxrrDw8fKyMjMzca+urOuubjAwc22yLrBuba6sa+usrSno5uqs7SqqKatrJmkrqWkqKy6v6irtre/wb++uLKyw7G5vayjrrWsuaaInJimm3a/oIWZnY6TmZmKrpehnJuXlZufoameqKCZmqqaoqeemJCNkZ2DbnaSopqVnaKekK2yo6uVqKqYq66lpJ+lqZOSmZyIlZyinpexpqmrura+s7Ktvrm2oKOnqKWnnJysqamMY2VhX1JLTUdITklVTD1NRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauUnKGfu6+ZlJ6Mk6qbkZKTiauNh6KejKStlKOjtsa9tMG6wsLHyMXCzcjCvbmyr7m0wMLKtcaxwby0uquoraywo6KZqrS6pqmmq6qdqK+no6qqvrynrLyzt73GvLe1uMCxvcCzqbW3q76lj6OXkaKfvJ+JmqCZlp6djrefqZylo5ucoZqopbOhm52mnKiqnpmVj5Sbi5eJjKWilJ2inqC0r6Wlk7Crmausnp6ko6mRlZWgg5Cen5yWqaSiobS1u7WtqLWys56coqWal5WZqqGed2FcX11KSEZHTVFJTUVGR0JSTElBRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Wnl6Sfn8Osm5ekl5mpnJaamo+qlpanppWtrZmhq7bEwru+t8HCwMfEvs3Hu725sq+4s7/DyLW/r7y2ubemo6qsraCgmqqqxKGkqKumnquvrKKpqL+4pq29sLe2x7a1ubi/sb/BtrSztK++o5ejlpOblK2gkaGipaOjn5C+pamdqaydnaGbpp+9opmjn6Kpq6Gdlo2VnpOeh4+FjZOepKCdtaymnJWyp5mwqJ+aqp6gjZmVn4SOoZqbk6WkmpissbayqqWqraycmKCgko6QlqmflGhjWWFdTklHSk5LSEVESUE9UElBPEdJSFtST0s9SE9VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlY1dMopqjnJ7FrKGfrJ2crqCTo5+XpaCnqauXtrCiqrK1xMO9wLa/wrvIwr7KyLa4tbSws7O3wca2vrC4tLm1n6asqqudnZ6lo8GloKmtoKSpra+ipqe9tqaxvLe2tcOys7e5vrLDwLe4rrO1taOdpJWRk6CtoJminamoq6Oaw62pnqytm5uemaagvaKdpZirq6ymoZmNmp+SnomOV3+WnqWhoLiqp5OYtqOfs6Ggm6+Xno6ZlJ2Cjp+Xlo6ipJWQpq6zq6mioqallZWcmIuPkZOkn4liZVpjYExISkpORkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxLTp6foZmew6elorOgnLKnk6qkoKSframsnbuwqKy1scfEwcKzwsO8xsO8xMq9r7G2rbC0r7/FtbmxsLm1rJqosKmpmp2loafCrJussZyqoq6wqaSnvbemt7q8rrbDrbOzwr+yxrO6t6y0tq2qoqaWlZSjrKKfn5qoq7Cvr7yypqCpqZmZmJOipLigoaSTr6+spaefkqGelZ6PkI2VnZqin6e0pqeNmLSco6+anpuukZ6Ul5SagJKhlo+On6GTi6assKWnopyhnpKSmpOFi5KNnJ6AYmZbZ2VKSUxKUkFDQElHOztHPzk5Tk1VXlJTSj5PXl09SFBCTExJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMOopKqyoaO1qZayq6aipLKsrqm7sqywtbTGv8TEtcDEvcnEtcDIwrWrtaiwuKzAxLS3rqy2uaWZq7Grqpifppetu7SbqLCbrZ+utLKnqrqzp7qzt7K4wKq3ssK8tMWnvq6tt7WqqKyhl5aRpqWio5iYpa+4rrK1tqCfqKSZlZWTpKC3oqWmlq6ysqaqpqGem5qalpion6CYoZ6vsqKmjZeumaWsl5qepZGbjpOXmYWWn5SMkJyelIupqaqip6CZnpaMjpmQgoaWiZSfeWRpXWtqTVBNTlQ9Q0FOQzo6SUA3N1FPXV5SVlFBV2BcQkpTSFZLSDpVZV1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SnBpVkNXRox5ZkM7pKSdoaa/pqivr6Cptaqdua+qo6q0t7Gwubevtri4xb3Dx728w8HGwLjBxsG6qrakrbutwcO4uKqtsbuila2wrbKWpaeQqrmpoKewnaqgsLSyqqm2tay8rLKyubesubDCur2+psOrsLevqaurpp6YmKuioqCRmKGxr7OrsbqbnKmgmZaSl6aht6mlo6KvsbSrsqirn5ugoJuepZyilp2js7Can5CTpZqhqZqVop+WmImUmJOWl52TiJCbmZSPqainn6Obl5uTh46Zi36NloWPm2tpbWFsbldQUVpUQUNFVEA7O0lBNzpYUGReUFZXRFleXU1MUk5eS0o+WmReTkhQTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGqsKqjsbippbSyq6Gttb2vs7i8ur22tsDCv8nEucTBwMC4xL3Bt6+1qKu3sry/v7WprrG2nperraitlqeojqe7n6Sts56rorGws6yptrS1va2vsbWssLWxwLrEtqu8r7G4q62qo7GmnqSqoKSXkJmfs6qzqquzmp2nm5qVjaCmpLSup6Ktra6xp7OtsqmknJ+opJ6VoZibqLWpl5mSkp+ZnqGekayfmJiFlZiLnZqdk4qNlpeal6alo6CdlpWXlIGPlIV7j5KDjJZmbHJncHJfRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiYFBLTU5YV1hQSlZWV009RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVTE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmaCkrLekrKmlrq62qa+zuaamsLfFt7G3vsDBtbS6xb7MxbnCv7q/ucS4wbmytayqura7ub61qq2xtpmYp6uqq5usq4+rvZ6srrGjqp+wrbOurraxubepra6xqLWvs7u8ybKqtbSxtK+up6GzoJqoraCllZWambKjraCmr5ahpJqako2ipaeyqaKnsqyqtqWvsbWvpJmdraeamJ+Zmay4o5eTkI+YnKGYl5Ssn52UgZOZjZ2dmpaQipSTnpqloqKgmZWRk5V6i5CGe4yKg4uSa254bnZ7YEVhallJSFlbPXtKR0U2QWJUaVtNXGFKW11aUlJSYmBMS0VfYGBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDXlFcLipCL0pHUFtIM2NZVUtEmZagsKiyqa2lo66utam3tLijq7S3ybu0u7u/vrS0t8PAzMi7w7y2vr7AuL+8sb2up7q5t7bDt6utsrmVl6auq6ejsaqUr7ukrbKyp6eisrOwsbG1sbizqa6rsae4r7W0w8W2qbS1q7Ctqqejtp+fp7KgpJSbmZSynqecoKqNqaOem5aYpaWlt6eisrSsp7GnrbC1rKWZoKyom5ydm5SpuJyUjo6LmZyimJCXpqGfloOSlpCdnJiWloiXkJebqJ2koJKVkJCWdoSQh3uFgYSNjG5xd3Z8flxLZWxcS05jXD9ie0dJOEdnV2VbTF5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnRmFMViUtQi49RU1RPDNya0pEQ5CZpa6lra6rp6SwsrOqt7C2n6u1ucm5rsG8wrezsbXCw87Fv8G9tL2/v7q/vLPEqKm5sLa2wL2vq7OznKCnsK2lprClnrK2rauysKypqLS5rLSyta20rKmsqKypua6xsce/uKS5r6mtraaorbCmpKSuo6mcnZuasJmio6KjkKyepKCfoqqmprmlrLW1pKmrqayvtq+jnqOoqpugmpqSpLSaj4mNh5GioJaNlJ6glJOFjpOSnZuYlpWImJOVmaecoJ+MkpCNkHd+joV8fH2HiopydHJ+fX1bUmRvXk5aZl1GRJZbSDtObVhhW01gYk5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhkSEorOkk/M0JJUyw+j2s9SEiPm6qqoqqwpKiks7SxtLWxsaGrrbzLuq7Au8extK20wsLRxcW+wLK+wcK8v7e8xKest6yzuLzAsKuyraCkp62pqKSwo6uxqq+ssK6vrquzuqe2sLKpsqmrpaWkr7qsqrHCubWruaioqKyqqLGlqqSirqqoop6boqyVpJ2YnpmsnaKnqaKtpqOtrLexsqCpoqCrrrCsnp+nqKmZpJiZj6CnmIaDj4qLn6GPi4yWnI+PhoeQlaCdlpiVh5aTk5eknJ2ci5GPjYl/foiGfHd/h4WHdHNyiXZsX1lgbmNRc3FcSzuEfEY+V3VYYFpPY1xOVVZVV1BcYl5TT05oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5JZ0RGODxCMDVFS1gxQJRbP01GlZetp6KqspypqbC2rLi1rqqlq6q9ybuwvrfCr7Css8TDzs7Dvr+0wMLEusG0ycSsr7etsri/vrOtrqulp6qwqaeosaW0rquwrq2xsLOss7qkuLOsrK6nq5+in7G4q6qtureltbWjqaesrKqtoamnprGyo6aloaGslqqhlJugpp6koqukraOfp7G3ra2jpaKbqaquqZ2ipaSkmKCZlo+YnZOBgpCJhZygjIqOjJmPkIuEjZikm5KRm4yTkpGUopmbmoqOiop8hoGCg3p0gISCfnR3jKSHeWteYG5nV2WHZE5AZ5JMRGJ5V2JYUmVVTVZVVVRPXF1hVUtNaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGQEhIRJeSr6SjqrCYq6mttau2saukq6qpvMDAuLmzu7Wlsq/EycvRv8G7ucC/wrnBusHErrK1sbO7wL6zsa6sq6uotqqlrbCrubCpsbGvsq22qra1p7S2rKykqaqco5+1s6iopLS0oLWtoamoq6mrp6Crq6i5tqmqqamiqaCtm5KpoZ2gpKKmo6qenaa1rqimqqKjl6Wnp6qcoqSjn5mYn5GOj5mOfoeMh4SenoiFi4uPjpCNhIaVo5qOjZuRkpGPkp+XmZaMioN/dIaBf394dYN/e3h/gYidj29xZ2dxeFxgc4hqT12YVkhteFVkVlJjUE1VVFVQT1hbYlVIUGlUVlRHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUWMwMj9mPU5YP0MsPkxUXy9KazZQRTuVjrCgpautmqulra6ztK+qpa+pqbq+u8CxrriuobWvycfI0cC+vbu8wr26w8G/v66ysrG1vbzCsbKzqrOopLWppa2zs7mwo622sq+yuaq4rqqutaurnqqsn6Ogtq2ooZ+vs6G0qp6op6qkq6GirK2ova+srq2hp6ifq5mQr6GYoqGop5+om5mqsKmjn6yioZOio6OnmJqopZeXmZ2PioeViH2NhYSEpJaFgoKLh4+OkYSElKCXiJGdkJORjZGdlJePioWFeHSBf311eHmAe3RzemmCh6R1aV5lbIJ1Z4iMfVJYcF5KeHNTZFNRXk1NUllmTkxWWWVZRlNpUlI/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsMExoOjQ4Xz1hZD9GMUNQW1srSE86VkI0kI+xoKSmq6OmpKymtLOxqqSwp6q4vsC8r6a4qqeusMnGyNHDvb++ub6/vMm8wbiwsLSxuru5wbO0u6y4rKK0pqessra5s6emu7WttbyvvKatrLWrrZypr6Sgpayqp5yeqrOks6iaqqeppKmeo6moqb2stK+unamkoK6cm7KjlaScpKWfpJqaqKulnpuqoZuSm6GlnZiXqamRmJqTkIqCj4V+j4J/iJ6Phn99jIeRj5CEf5OblIWTooyUkYuRm5KVh4h+f3F6eX58aXd8enVxcX1ohnmFiGRgaGNyhXptZ3ldXlZCV3ptVGFPUlhLTE5xdF1IWltnWUVVZlBEPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj07RVo/Ko+TsZmfn6mlpKGrpLeysqWpsKesuMG9ta+iua2oqLDDycnMwba9v7W3v7rItsO1tLO1sb24ur63rbm1v62hs6aqq7C1uLSqnbu8qLK/srmgr7O1qqyfrrCjnKWoqaKenKWxpq+gn6qpqKKqnKSpoK28qK6wrqGro6Sunp6tppefm6GjnJ+bmqOqopqapKSVlpSfopablqasi56RkJGMgouBgI6AepqUjYl8fouGj4+MioSSmJGHlKOKkpKHkJqPk4GHfHlrfXZ5eGJ7enFwcXN4aYF0a4NnZGhhb3OObWJqcGBwQVx4a1ZeTlFRSkpNU1lWTV1ebVdEWGBPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQwQmhZMTNTPWVfREw2S1dlTyk8M1BbPSOSmKyZn5enpKKfqKS4r66ir6+oqrjCubKtn7mvq6i0usfKyL+3wb6vtL63xLbDsa+6srLAtbu+uKm5t72rpLSnqKqwrrmxqpm6vaSvv7S0oK63taanp7CzoJ6kpqehpZmeraeonqCprqehp5ejqaCwuJ+ksa+hrKCspJymp6mampufo5WdnJqdqaaWm5+okpiTmJ2SmZahqpCaiY6Qh32If4KOfHuhjIyIeYOMhYqMjYWHkpqOiZWfiJGVgouXjJF9hHtzb31xc3RgeXhpb3Bxb2p/c2R7bGlmZGFmhoBgW3Nqck1Nf2lYWk1QTEpIUFJRSU5cX25TRFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaaEgqPzBaWTUolp2lmJyWraCfoaSht6uwpLSzqKi5xLWxrqC3rK6tsLXGyMC3v8G5sLS9t7+7v6+rvbC0v7G9w7qpu7q3p6i1qKersK2zsaeZvLekq7u2r5+xt7CppaevspuhpKCjpKGXm6+moZ+ip6+ioKKTpKWit7ChprGrn6yirpecqqWpnpeanaWTm5yanaaqmZycpJWVl5WcjpOXoqmhkImKkIZ6hH6EinmOl4qNhnmCh4SIjI6FjZOYjI6WmYqPl36Gl4uPeoB6cHJ3bm90X3h3ZGxsbGpphG5mc2lrZmldZHOBYFtrdWlaSX1eW1hPT0pISFJVRjI5X15sUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKjsrMTM5Y2w4NEdBZltIVERVXWhFLjwyYlUsMpajoZeUnKqdpaGioLeqrqC6uKWrvcWyr66jta+sra+1xMS8s7+6t7Czubi6uLuurcCztLivv8G4rL26taais6qnqrOrrbKimsC2pae0tamesrupp6apr6yZoqeco6aUmKKypJmfpKipnKKgk6WgpLiopKeup56loKeSn6mioaCZm52gkpuclqChq5ubmaGUkZSWmo6UkqOopJCIio+GeYR8hYZ9nY2KioZ5gISIiIiRhZWTkoyQlZSNjpR7g5iPi3d+e2x0cmxsc2F4dGhoamdmb4VnaGljZmlqYGliamdbZXtjYFNzVFtbU0xJR0lPU0AhKmleakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OWVPJzKeo6ORjqSnm56enaO1raaquremq8PBtq+so7Wup6+vt8DAvLLBtrGusra2uLe1rKm9s6+ysb2/uK67u7GlnrarpaW0qauuoJ7Cq6ilr7OqrLW7naiqq7GlmJ6qnqakkZmmraKYnqSpoZyinZegnae1pq+qrqGhnpyhlaCmn6GgmZuZnJKZnZSlnayimJaelJONlZeMj5iaqaCRiIqLiXmFd4KCgZyIi4KJfH+EiIaFkYSWlY+OkJGRkYySe4OVjoZyfX1meG9ramxndXNrY2dlZHWAYmVmZmVqamRrcVpeWV1tZGFOaFdaYFZKR0lLTVJYPjlgbGlHQlRTXFtJSUdGQS48PzlBODlSR0A3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxZSlZiZkE6M0FmSCU1mqOekIusoZiYoJaltLGisb22oLDGu7mxsaS3rKquqbm9u7utwLKvrq22r7O3sqaqubGvrbS2urawuL2tpp21qp+gsKWrrp6kwqCypK6xr7ettZ6tr62uopmdqKqlnpWbqKWfmaWjqJ2aoJuUnJ2sr6W5p62ioZqbnpmeo5qknZeemJuUmqCSqJaqp5qTm5ySjJWZjZSUmainjY2KiY98gnSCgYqYhYd8iYmEhIqMiJKEk5ySko+QkZaOkH+AjI2Db4B/ZnluaGtqZ3Fya1xoY2NzgWFlaGpubGdramdtXGxsdXFhVGJoZGVaSUZMTU9YUVFWYWWBVEBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZUMnNJKgmo6OsJ2ak6GaqbKwn7jAtZ+zwru9ubGmtq+orqW3uLe3rLuvraqrt6q0uK2ksbWxrqmxt7axs7W6p6iftqmcnqmjqq2cqcCZraSusLa1ra2fsa2wqqKbnKSsqJuVnKejnZqpoqSWmqCckJujqqmpu56mpKCYmpmeoY9ropaYnHGClpukgHWSqaeelJWfkYmXmYCWiqCPeYaUjINuan53g3FshouGfYSLhm9eY2BnhJeGa4uQlJN1d4uEfoOPf2aGgGh1aWZXXGlzbk5QamNncoRnX2RmbmxqXmBgipCEhmdPS0Q4RVRnXkpHUVBVVUtIU2FvdGVGW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUWQ9Ky+Mo5mHlLCbnJOgm6qtq6O9xa+otsK4vb2tp7awpaukuLOys7C5raqnrLSmsLSip7e1tainrLezrrSts6Kpn7SrnaGknKenmay7laalr7O4ra6lqK6rrKWhn5yhp6abmKGmpZubp6edk56fmJCeqKmita+joqOdlpeYl6OIoY6Smoehh5SdoX+lf6aqnZKSm5KIhHJ4jY6EiKF2iI1pl4hmfXN4oW+Ih4R+jXt/oaCfmYB7h550iI52m4psh4GDbWhlY3pscWJUhm1jbGmYcVhqcG+HWF5pW2trW4hxbnpyhmiHhFpeRk4+Rl9NRlJWVlFRUldUZ15MWEpSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8ojKaXg5yrnZmZnZ+qqqepv8Ousbq8t8C/qqW3sKmsprK1rq+ztquppbGtpbWym6y0trSmp6mzsa2yp6+fqqCyqaCko5qio5yutZWkpaa2vaetp6qqrKimoqCYoKejmZmmo6SYnKSplpSinJSTpKWmoLajpKCjmJWTmJOciK6PmJSJqYuXopuFsYCjrJyTmp6VeYLUqH+HlMGbx3l4saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHqBbJaxq7B5aGtYsa5vZWm8krxuaHpuco/YflNqYrayf4FylHWaoaqQV09XYU9WTkZUW1hRUFKMXFdcUEBcRFBORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mk4GmqZ+XnJ6lrbKpsMK9srXAtbe/wqumtK2tqaevs6qvtrSoqKa1pqe4rZyysLWqpaSnsa6usaaqnqeksaSioZ6XnKCer62VnqKftLqjq6mhra6lop2bmqKon5ibqKCfmJ6np5Gcp5uUnaGmoqCvop+fo5aWk5iSmYWvamqKjap+Z4SVh61kcJ2clJqmlXGuoaR+d7t8a6GPdrFfarRbpYBmnJFgZoF6Zn9qeGqpZb5yZ6aMdrJqfLF4dJKTY21tp21bhKBFaWeHlkV1nGB9Z3ukp4JZX4uraYCVeHpqpzdKr1tXVGxjW0tPWF9cV1Y7TohPV1YvSFNTSkRFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuRopWCrKelnqOlqrK4rLS9vrC2xLK3usKnqbCrr6mpsK6ksLqwpKWus6OpuKiesrGwo6Wgqq2vrLCmp5+jorCco5yYlZebnK2ml5uinrSzoaycoq2toJ6al6CiqZyZnqSgnJmhp6SQnaOal6Cfq5+mpp+an6GWlZGXkZqFtZu1eIWpmbWZd4ezm7d+k5aWqZR+a4GmeoKFiJOUknerZ2uxW6x7j4eUdIhwj4aAf4iQl3iDgouXjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYp0uUaFuW1RrZ2BMS1xkWFxaQj6weFdYQSNMaEVDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nVzdKOWFVNTAclZ+UiLOmpqGuqaezrKm7tsKwvMKtuLfBqqytrq6mrrKpoa+8qqGntK2kq7WlprKyp6OinqiqsqiwqKWen5+ulp+ZlZWWmJ6topqapKi1r6Gpj6moqpuelZigpaian5yjn5ugo6WjlZufmJqdoqqbppqdm6Kgl5ORk5Ocg9WTmblwsMJ+xoZ81pSbu3yZlaSPjZyNpHuOh6SCpYJ6rHmPnVave4l+n2q5Wrl3h4R9poKTfJh6qnmNnI97sW2OhHSQvIVvlFCvp8WKUaB6Y2CqYnNyh22XiGBTtbTIhoCJfGOkM0Kddl1RamhjUEBYZlpkYUpITWxLW1NPWWZaQ0Q/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUTcyJZuik5ixp6ils6qltKikvLfBsLrAsbW1vLO1p7Gwo7Cypp+utqibqLmuo6+xoLOzr6Cknp+nqbCotKmknJ2eqpeYl5aXlZahqp2bl6itsKmjn4+soqeWnpecoaWhmKGhoqGaoqKnm56hnpWZm6agnKeVnJufoZmQkpWRnYiybmi1cauHb46mcrRzcrZ7mZeji46cjaJ+kaClfrB2g5HS0XZcrnyGf6Rvm6qma4aFfa19l5mPe7Fzk52OeLNllnSEnm+eZpRSyItawlyfeWJfrV92c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2pfbGlPVUdJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi+hnJGlr6ykqrutprSlp7a7vLK6v7e2tbq6s6W0tKGxsaKfrLCkmKa6rqSxsZ20t6ifpp2iqqSxp6yppJqcmqielZSYmJKSo6igl5Omq7CmopaTrZ+lkpShm6SmoJSapqahmqOfrZqgnp2QlpuhnZyllZ2VmqKflpmWkpuFrHt3qHajjomHqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXeFf4+dhpmZd6+GipGch3e0YZplmoGClGySWrBYS5p1mHlmYK1edneHaJiIa16vd5Wej3hsNXnIrrJfQVRvXmdgRVBsX3FtVlVNLmVjaVNZUTpBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjg4n52UoLiwl7TBraiyqKmyuri0uL+5t7K2vbWluLOftKyfn6irn5WntquosbKrrbSjm6mgoKihtaamqqOZnpWloZSTnJmSlaKlmpOQp6yvpqCVmamfoo+RopmopqCVmaWonZyknq2doZ2gjZSem52gmJmclpeioJOYkaadhql9faV4oY+Og6pwrYuBp4aVn6GIl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqY3J7gWuYh3JdrFqJoI5rbmVPSkOhXFpMdF5iZU1aYV9yc19KVjZKmpNZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MDAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE+OKGdmZm+q5e0wq6rramltLC4sbW/ubqzsbe8qru0n7CknqWnp56UqrGpsKq1rKuvoZihoKako7mio6ugl5uRoqCVlJ+alJifoI+NjKmwr6adlpuopp+MkqSXqKunlJepp56foKOtpKGeoY2VoZmfoJKdl5yVnqGVlo+rm4+ubXK0cqmMdoqmc7R4c7OAkaSikZyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWTiK1rdbNhnWaib4eSapdcrWBNoXyHkVJzo2x5f35vmIdxXK9WPJx3ZlRvbi5cp09iUmtlYWxZYlxgcHtjVFpRPj5tcDNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7PDAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjgxQjilmpuduqGbssCuraurp7epuK+0wLW8sa+5uKvBtqmqoJumpKGdkqqqp7ajsqiuqqCXnKegpau5naOtm5aZj6WjlY2doZuZnJ+Qk5Srtq+nmZScrKqXjJOlmaWso5GXqrKkoJ6nq7CYoaOQmaKXoJuWm5ehk5yqnJSRq5mH1JKau3Oww4DDhn7Vlpu4eIeQl4yYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbpqIcW6NpHS9XXd9W2F5vGtaVltqel5qYGRmYm13b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5qeobyil7HDsK2qqqyxp7mvtsWxurKuu7CuwbKspKKeo6Gcm5GqpKqypLSmraSflpqqmaasuJyirpiVoZCloJKNnKOemJ2akJaTr7mxrJWXo6inlJGWpJykrZ6RoKirn5ufqaOznqKljqeilKGanJeVpJiPsKCSlaqehZCZtoCQkYy3lXiCk5u1d25rbnNueY+EjolznsG7vZp7gbKocIB0kbiDfIaGi4eNe4qGjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbV0cnB3toxef3l9iWiDeW15YouscHWFf1lbp2pEZFlTZmBjXWNRZ2ZxbHVCTlBMRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz07PKeeoKC/pZa0w7Ssq6esq6m7rrDGr7WzrrentbitqaOhpZ6gnZmUrKStqqa1qKifm5ago56spL6moauXlJ2QopuSj6KoopOdl5KYlLK1tq2YnaSkoouSkaabpaublqikpZyaoammp6OpoZKtn5ejnpeWl52ej7CplJynoo5qfmmcpniHc36aj3R6ZYd6vr7Aum6Sg3GUhl9yalpemolhZIiOlWtgf5VjbZx2YpRrf5qVlGVeYGNxm4ppcox9hpVnan5ydHh9fWJbd3SBaFBcboN8e4trWGx6gnJJSm+FcE10TUVXXWZgTFtYZ2NeT1ttdWlxUU9ERU07SEk8TD8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6on6ihwaObtLq2o62lrqeotbGsyKyws6y1o76xsqagoqmdopuamaynrqSktamlm5eVoZunrai+p6mmlZSclaCak5ilqaeRnpCPmJywsr+sm6aep6KJk5Gpmqikmpurn6OZm6OnraKfqqKasJuVpqCWlZ2fnZexpZiiqJmckZ2co6OZpqKanJqampCWgWdtfXF3kZeUkYWKtaqNhpiVjoqMmJeHlJWKg5KTkYmNkZOYlJiXmqCimpyUoZ2OgnqlhWxqfJB8gHSJioFxgnh5dnaKgHuJanOBdIN1Y3d9dmtwe21gY11wZ01ZWWVqX1dab3ptbWZTT0ZTOU9aTlJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Czor+ipLGyt6CqpbKnpbC1qsmrrbGltabAqLShnqSlnKOVlqCrpqyjo7asoJmWlp+XramlwJ6rpJWSnJeemJOUop+eoqeTkZiop7LDr5qrnauej5aWqZ6qnJygrJihmpyipa+moaSonq2Yl6admZqhnp6dsKCdoqaVmJOYlKChlaOel6COlpSLio2Olq2PfJWbgpKCi6qohoGYloqEj5+Ie4SQhoWZkIeGiZWOm5eNkJiepJaak5GdjX+NZqGzr4WJhHZ6j4p8dnl6b2d5kIGAiWt1gXmIcmhzf3p2g4iCa3RkeWZgaWRiZGZqWWt7cGlqXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rKuusrKgqqaxraKss7DFsKqto7OuvKS0nJ+no6GdmZeopqmmpKaztZ6VlJ2ZmbCmrr6gq6OQkZ6amZSRlaGcl6mchJ6prKKzyLOfqqSrlpaXmqedqJufpKuUnp+doKquqaWjq6Gtm5+goZmlnpyenbCkmZ+ok5iYnZGlmZionZqXZoOSfGV+jpmPY3mNbGhrepGkq2tlmph+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKOfmXNsbnqEjId6WGVehYFebIqJgHZcaHN3d5GAh4JueIJ4gHNteYN0d4iIjoN7aoZZXmt0ZF1ziWlqfHFsY11RTVdKZFhASjQ9Rjc/RkQ3MTw9P0FEPDxER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7GqpaitrrCmrq2wvbGpqKStr7GfrZefpJ6hmpmmq5yso6aoqbKunpWjkKKvpra5pa6jj46aoZmTkpugmZmllnulrKKos8O3pKKnr56elZ6jnqOco6qokZ6hnqCqr6qro6qfqJumn6ihrJahm6WwpJicqpWhnpqTpZeeqpiefr6DiHK0coSdhq1oeLnEuHGToqN7ppiZc6qCfMvAwLtxi6KHgp98lZiJnsC9gpadno2dwsF7gXuSjZrDwH1rpbFvjIBvynp/m3eRg46BdnqBf3lxen+HcXiFjJN5bXeTYmZfeGRfZYJjXnRobWRiWExWSVFaSE9FMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqJSjr6mwr62msrWvqqamprGrn6uYm6OgnJuqp6Kdq6KlqKWktKOdopOmray3s6evopKRmp2lkpGgoZecn52Hp6ukq62/wLChqa+pl5KfnaKZoqOqo5KgoZ2era6orKajo6ehpaWeramRpJupraqcnaqcrKGWl6WWoaOXnH/OlHl6pIF5lZabX66PXo6ngaKgfKeVm3Srg4CvXmONqXqnh4WgdJeSiLNjgquGoY6Ns2qErnR9loe4YYKtWaPNbo91e9p7f5lwfoiTdn5le4d2dmt9iG5+hZGSfm2Bj2Bxa3BnYF95ZFtwaGpkZmBSVFJXXktPQzVBSEVEOD42O0A/QTs9N0A+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3CwL+1tLC4mJ6RpKqorbSrprKsraykq6ewqqCnm5mll5yir5+gnqino6ahnrCsm56Vp66tsaqorKCUkpufpZOPn6WXnqijnq6kq7CowMazqKmxrpaSnZyil5+pqp6UoZ+cna6vp6qpm6enpKKrkqy0lqaiq6qeo6emobCgk5qnmqCalJSRl6BwhYyXdISoh3GxfJ1xrH6hnoGlj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKKMkYudfqt7iZOPn4B7rVacxHqPb5LBfYGVbXVwjG1ldmWGb2F3bnJviouSkINtkJBlb3R1cGBnbWRfb2lpbmZjV1NcYVpRUUI5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSfnaOOo6Ohra+2rqiwp6mqqK6rq6eipJ2ZopWfpqufoqWgqKiin52wrJealqinr6yop6mel5Sao6KSlKGtm52mo6+so6y1qrrNsa2nrqyWlJydopifrqyclqCZnZ6psampqZurqqSjrJuvsaKorK6mmaarqqqxopKXo6SalJKEpGqkdYl6qXR6snGCpYmZjHGIoJqHpGBgUqyEf66Dm3augaaGhp96mJaGe2aAo4mkmYaBo32pfoGUh65efKlVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2NmI+BbZqScG55d3dvbGZkZXFwZntoY11XYGpYWFRLTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNjYqMVBLTCMgQTlENCwnw8nW1cChmauooa+inrC1sK+prKOopqqqq6mkpqCbpJ6dpaemo5ysmqKsoaSfr6KdmpKqpLWwrqCpm52WlKejkJqiqJ+gppyxpqOnsay2yLK1qqyplZGdnKKZoKWznZqhlJyfp6uro66arKqjoqujs62iqrOxoZuqqK+wtqOTlqOnmJuRfKpsnoSHdat5fLBvgqSLiZ+WlZ+UgdK4tLjJgIGyX1+UqYOkiIegeZiVmniqyXSZo5WnqZCSm4x/m4maxsZ4ZaGCpXOBn46Cfa9ecLVjsXVLo4Ztp0eCk2SPkJ6SfHCXkoBwenR8e21bZmpycWaBal5iWWNtXF5YSE1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC8+LTVPVFEdHDs8RjIsJKekwca5ramzrqylopyyuayqoaabqKaqrKmmoKalmKujn66rnaWgrJqeqaWdprWfopeTqKq2sqybppyglZClrZGZnKejoKqnrqKjp6qwtMKys6qtqJOJl52lm6GjrqaXoZWZnaWmq5qvna2op56so7esobK5r52br6eztLOklJiopJqfjoKdTniagX+feoOjfIKkhIenn5yek4S4e3x5uYJ+zMbCtniboZGLn32ZlpeKdp6YiqSYo6h+sIWchZ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpKkl3x+kpGKdHpzhH5wW21ud3JqgW9aZF9obmNkXUtNUVRCSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mprKSruauvoJyhrLOzpp+glaWura6qp52mppqjp6GyrqKoprKgmamklKK1oqOVl6KptLiknKKdo5OQobGZnpynpqGir66dpKiitbLDsa2qraqRh5Ccp52jpJyll56ZmZqmpKiarqGupaaYsKW8raG3t62enbWyubGzp5iesKKknoWP0bXDt3mHjoWRk49/pniUoneMoJKEpYGKcaqGhLRucmqZo5uVip97lpiGh49zr4Klm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+Upph+jIyTind8eY2BbWl4aXhzbn90XWRkbm1maGBKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklk3ONiq2/v7u6tZ6XqKSttaGjmZWjqaeuqquZpaKfpaCgtaaiqKewo5Sro46kraOdkJqaqrS0pJ2knamSlJeuoKCepqScp5y1mqCqo7Wrw7Cpq6mijISOnKKhpqKVmpucmZyZpqSmmKunraOlm62nvqyVvrCtn6Ows7qstKebqbGlp5h6qJB9fLB3ioGkpYibbLFvoYetfKGPg6iVmICsiIWuhZ+UqaChloafgJiVgHuSfquAnZqWiqp4naCPiZOSgHmvXaOBfKanZJ2AfJd0a65dpWtxhZldYFuMoG2VkaeZg5SMlot6eoKWfmtsf2J9dG1/emBnZXFvaGdoQ1lgWz1LVDJVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZWV1hWVVVRSEZJSiMoKL2SmoSpxsK3wbSfm62grrilpI6bpKOgr6+qn6Sfna2Znrmgoqqgr6qaraGQqqiklombkK6wrKefp5utmJiPrKKhnaWimqWcrZifqKa2qcCvpaqkn4uAjpyan6aekpWampSbm6akpJqorKyjpKCqqL6kl8OsqqKhrLK6q66noLOvqaqYdq9+kIuchYd9uq2KmGSwjGWVrX2hj4OmlZqBrIqEsIWlmaShoY+EoFtsaoGzYH+te3uCgLFsZ26Zl4yIsFt9tFukg2vIomWfgHu8WXa1WrJ9Uq+AeqxYgKFtmI+omoqXkZaWe3iNnH5kc35ig3d0gHxhamZxbmZlZU9VY1tCVF4+SSg+OT00ISItJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBOSkdDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMKzo5yspqW2qKGLmqCfnbOzqZ6joJ21mKCzqKqrna+un6ubla+ooo6Im46vrKmnoqeZrpOZj6iaop6ln5qjo6WZn6Opsqi8r6Wonp2OfYublaCgmY+SmpuSm5ipn6GZqK6npaajpam7n6DGp6Wpoau0tq2up5+8ra2slYGpkqOvj5uAhqSXmJCBgLjDuoOOnZOEp5acgqyKgq+IppubpamPftW9wqpio7+9fX6jgoPXuri1hZSTg569voRqo4Fvq4RtnX96srDHg2qrsL2teHeivrt0gJaOppyPm5KXnXqBkJt6Y317ZIxmeYJ7YGtla2piUGJbU2pcQFRhQk4pPTo0Lx4fJB4lMiAdJCgwNDk2Njc3Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWztLG/ubK9s6Kdrqals6aei5ilvqm3saihv6amspyesZy5qJ6tr6anlZSwrJeMg5uRrqajrKGknKqhmIujkqeep5yaoaiimJ6grK2qua6oo5uXk3uHmZGmm5KOkZiYj5mUqpqgmKmpoaqnoaOru56pxaOgr6Ors7WrsKqgu6ivr5pzdaqkt4ZliZ9wZ62Pio9tb3ekkJmfgXWumZVwj4txlaijm5eto3JtbW1linhvbYKZcYB5aXBpZ4mWlZhxaGmEhmdwhmRdiWNqb1ldZ353pmBicY6Sb2ZkgI2SjqKYl5mRlp99h46VdmaHeGiNanl+eWRsY2ZsYktkWEprWTpRZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOqurmys6upoq6epLKpmJK9scPIvraqnsCrrKOhp6yfuqOkraytpo6WrqmQjIWVl62epqqin6OjoJGMpJKnmamZlqOqoJacpaanr7qrrJqbk5N7hJeNpZiNkZGYlI6YlqiUn5ipo5uxp56jrLqfsMGnpLOmrLGyq66sqLmkrriWiqGopbadiZail4epmpCUnZOqs5mbo6ugsZahoZ2gopygpKGVqqaMkpKMh5KcnJSQmpOYkI6VhoGkmZeVjYuTkoqPhoR+Z4p/dIJ2dIeMcadse5WRlJOBgY+Pj4+dlKCWmJahg4eTjXFpkHdwind2fHpqbGRkb2NVYFhAaVtIY2FPWitGPSsmITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERkpLS01PUFFYVVZZXl9hY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW3rq6isKStn6C1sZCOq8W8xLu4qqKlnZumnrGpo7annam1p6iRmKyii4iJj5ynlqykoZmnnp6TlaOXqJqpmZSmoaOQm6iZobW6qKuZmpCNfIGUi6CUipSRlZCQk5elj5+aqqCctqOdp6y3p6/BrqO3pq+vsK2qqrO5oa+9mZKmo6a2opKdpp6NqZ+Nkp+jrK+aoaOxqK+Xo6Cco6menp2clqudkpmhm5SQlqqZjZmZlpCWn5GJoJ2VlIWSjJCMlIqAfmaMhnWGdnmIg3OcaoaRlJSRin2MlpKSmJOhk52WoIOHl4d6cpZzeYl/cXt/am5kX3BpYFtgWW1jUGBkUFs6R0dEPTI9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFiYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mnraCotaqQkJ2ks7uvrKyio5p6naKxpKWwqJabuKejlJmqnI6Giomco5Cun6OWqKChkpeYm66Lq5aPqJmnjJmoj565tqSlmZuNiXmClIuak4mVkpSQjZGWooyenqmen7ikgISvtaKwr3SkvqOyoHh6oKqyu5V2raSfioCqfmRcYnafjqSehJd+bpOznKOnrqqjZZ2fk3N5mZdwgJiol2x/oqiKZZylnJGXmJWLkpyRhp2akJWCkoeOjpKJhXdrj4d2hnF8hoCAYWmIi5WTi1t2lZFnaJCOcnulmJhkeZiGgniYaYOKgm55f2twZWB2b2traFtmZWJib1NcPk5OTlJHPUBUQjkxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCRkZJS01UVFVZXF9oZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpuWpqOhsLGsq6mlqK2jp62kkparta+yppqqpquXc4ydsJ+oqqaUlrmgoI+cpJ2Rf4iIm56Nq5qjlaeino6XkZ6Fda6QiKaaqJGXpIicurSooJmYi4l1d5OMlpOKlJGQlIyPk6COm6CnmZyzloCMnLWds4ySj7ynoX6nonqjr7eBjo6mnoSLhY+xqa+MiZajmnmBi6yGnJ2ip6mnh5WFmHelm3qHm4GXpoKBe5yxeoqFoJeZlJiWgpGXloSZmWN5h5CEjY+SioNtcI+HeYBxgIGFf4Z0hoSWkniWaJN0oJp0fJmDoJyGmH6SiYKDmWqNjIVreHtxcGdkd25pbGtbZWtqZXNcXklUTFFARTUuWVRVNikhMDk9PjY0MzU2ODs6PT4+QERIP0lFSktHU1haWVthYWhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicmKOfpq6uq6isoKiwpqeppZmUrsa9sKGWpqm1no+Dnaycp6KgjZC+npmNn5qgkH2FjpmXiKudopagoZKNk4mGgJGojoeinKOTl56Gnrqyp56bko6FcHWQiZWQipSPj5uLj5GfkpegpJaerIiftIm0mq2Lyoeqroi3hY2wg7Gug6mNppiNnXyoj3J7d5uPp5ZolaR5tIufnqaokpnCgX+riJihcZ6AmaR9l4WVsYChfKGUoJCYloCOk5uKl5GLfIWTho2Vk4mDbXORhX96coaBhHyEdIWCl4GPxWaAqYePo2ueg6GZg5qAjIyDiZhwjpKFaHd0e3ZnaHVwZ2dsXmNvbGdtWGdHXVFMMkU0Nk1gYzcmMzxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFldY2ZoZ2JiYmJkY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubCqq6aalKCjpKqklqWptqOvf6GnnKWenYmUvZqTjaGRnZB5hJaWkYermZubmqKFj4x3m5yPoJGInqSblZmYhqK5rqWanIyMf2Jtj4uTkI2QjI2Yi5CRn4+UoKGZoah+oaeHrZ2glq6Pnp2dkYaBoI2rr4akjaqajJp+onaAmZNqgqx1Tat4h42dkZuop4Cqq32DoXt6p2mef5JrZ5eGl7aJnn1uYGRZg5Z/jHtkaIpymX15lWxde5dtX1NwhFxfbHmDYFllgn2EgZhxp6prg6NucqVwn4OeaWWfbFttiXtlWV+Df2JXUG92ZW10cmpqb15qb21salhpT11XRTlBNEdDXms0LElDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySoba8q66imZegoaWtraGdrbWiqJKhoKCmnJmOmLSZkIuejJWLdYGUkY2KppaVmJ6ff5KFhqykh5yRipipmJmakoelsaeilZqIiYBpboiHi46OiouNkouQkqKMlJ6gnKKlf5OBj6OhlKB3nJaPp4Ohp3+Gqa2FpXmKfYSafaJwcpOHlnuejHlth5yMmZCbqJqPh518gqJzdqZmnn52pF+Yen2Sc6JumLe0unSSh4J/tahkgca4e3CVt4txgJukY3Osq2B9ap2zfm59h4OOgouXcYCjbHOkc56Df6RgnZmzlXB8l560dHNbnrKDamJvc3VxaG9Ya2xyc2ZdaV5iS0Q9RDVRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pXYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjaS4ta6toJuinKOjpq6cm7GtrJOXoZmhpJmalJ6rm4uJkniLhXCAlo2Kj6CQk5Sdl32QiY6ooIeYj4qRopObmoyLqKilno+Wh4R+a3uHf32PjYOLkJCJj5SggpaeoJ2gn4uJd5yYooygcqKLiKmInKaQlqirf66MfXqgmXqjk3iAc5aIjZx9lqCHm46Zm6aGomShfIiWkJuNbJ5om41umpl7gIqnfXJodKuDnYN0qmeUml2bhXaEnWiqaoC4ZlyocIGcYZWMXqd2dYmKf55omnWHk5KYjn+fbpqQbaeZXah+d7trfqpbjoRdtGdcbnF5d2tpW3FqeHljYGZYYkFQRU43VkJSbjRLWlpfTlpDQDE1MTs7N0g/OkNHVD9ZUlldPkRiXlZgUWFjfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrabqIljlJusurKwrJ2mnJyon56um56wqKudl6SaoZ+Ylpago5mGiY1qiIBxe5eIi5aWhJGUmI96ioSWpJ2KlI+Fi52RnJyJj6ijoJmLkYqAgGmBhnl/l4x7iI6OiI+Wmn+Uo5+gopOYcmifip+PjHGSjIGpiJmfo6igqH2wraOiuJd3o7Oio3+IlHmde6uaf6KOnZuXiZdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZp+dKpaXW97lot4nmJMfnp6hWN5l0JNn1mianF8jm2BiYSZdZt5h4mxs39/m5OndYGdbnJ8lG+ZcmqkXZV2SGVjYHNwfX1uZWBsaHZ8ZGRhUV5WXVRWQFlFUWdEU1dbYlheSUQ9Qjg/QjpJRThMRFdBVlFbVkRGYlxaYEtgbX5xRUM8VV9iWmVqVmdobW9iZmZeYWFcXV5haGJfZWR2bF5lZ2ZrZGZsaWhraZOdgLGumYRTX6Cns7mzs6maooycq5ycqZShq6ShqI+fnp2amZWYoJ2WiIeJd4WBbnmVhZCai3yRk5aIcoCJk6Gcc5GQgYiYlJ+ahI6pnJqUiouKfINshIVxgaGMeIWNiIeSmZV8k6Shn6OIroZ9tYSOnp17pZZ6qYKWnZCKoZ19p2h2bX6ZdKFzcXydhZlwk4OufaSDpp6agaNvXqhndaNjb6VhnNKQfHqZeHJzY6KFkH6jc6OPdWuQs4tggpiJc6qyqLx/d4Ntfr6mqbRenG59cZdvgXOicl2jZ3SmYWimbZvUmXyEm294eZdrm3p3l3JtqaRnYGV5cH+Da2dmZG11d2dgYlNbZVFRYUlXSVRfV1NbZWpcZFBFQ0tNSktCSkU4UD9QTVdTWE9SUmBmZWlSY3d5d0lGRWNdZFpoaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm4Cxq1RcS36pr7G0sLOjnJiFmaigoKONpKigmKmJmZiYk5mTkqCYjoiGe3B9hGh9j4KUmoF3kY2OiW9/hpCTkmyXlH2IkZGjlYOOqpqUkouFiXmDdoiAboKfhneAk4aImaKXepSjpZqfibOhoraLeqynpK6lcKmAmpCFgZySfKSAopmGmHKehKKtromXjICMpI2Wg62hlHa1tbXJoXOUioGfYJ2WqW15lYafmnWhh3egfpGWioBvTGajknCah3Kke3l0YYOCbH6ga3FkYJxyf3SXaXtqtLW0xqZzmH57nWqbm6t1g5psdHeXaZp6dZhyUER9s15qdmt4h2ZqZ2J0dHFuVl5UWWhPUmhJVUxZU1VdaGtuVmdXTUpBSk1LSEpOQVFKUGRjaW1ldHJzfnl7bnWJe3tUUE9sXmhba2lSamhpbGdsZmNlX1xdXF5pYmRoa3tfXWRoY2pmb21laWxloZyJsKeEZj+UobKrr6+1oqOQgJepoqKljKWnnZylgpqXlo2XkI+ck46Ig3lqeYZlg4x/l6B5dY+IjIFphIWSg4yFnY16jIqVpZKDl6mXjJGLgYl6gH2LeXCQoYZ5gZWHiZagln+VpqmclpaEZ254nGyiZHxxpXecmHBnp4GXjHulep+Wg5dynnaBiZSWj7lukIqiYn2YoZWIbXJpq2p1oG1upmCbaIqQaJaHmpV1ooB9mmCLhYx0b4hiaKBlnn5pmnVvY2aIgm5yolpfW2Ohbl2JjG97f3NyZKVtd6JkZ6domHOLmG6hb1OIj2+gX2WnVItdVJhtbXNrcYFtcGhreHNrb1JYV1ZmWVNtSVhPXUhYaWhzallrVlFSRVZcTFhSYVRoal53dXp8cHx8coN7f3J2jYCEdl5RcmJnYnBnUGpoaGtsbmdkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ylmaZ6ZXRti6eupKmwsaafi4CXq52epYyioZqiooCWmJONmo+LmJCOinuHcYCIaIuLfJibc3SKfZB8ZIKHlYqKlZmCfIiGlqeQgaKskIWQioKKfYCAjnNoj6aEfYaUjYmYoI6Ik6unnYmmeJacf6WJloyymJ6Qg6+Xn6V4lYh6qXSlj4SabqSijJKEjIO8bnylr4KGhYaSlpyffKV6caiVoJZnnn1uq2OWipWSd6hsqaKBiXWHgnerkaaIa5Gwa3azjKlrioZubZ+ekpVhf6uLqnaAf4ymn3effYWllZ2gaZqHdqxnnq2Mt3N3vo2kk1mDpo2rYXVyc297dHFian5uaG1TVltVYWFca01dUl1JXm1tdmBbcVlbYFpnc2Vub3FjcXRgd3p+eXJ5g3OEf4B7e4yBgoB2YnhkY21zZFJsZ2hvbHJpZmlhX15cYmtibWx6b1xcYmlibGp3bWdsbmKVpqqdgYCepJapqp2op66kmYqDmKuanqSJmqWdqZyEjJqOhpyRhZKNjI10hnqIhG+NhH6Yk3R0hnKSg21/i5KHhpSPfHuBhZeljX+lpo6BjomFlXaCh5JvbIupgYOLlI6JnJ+JjZSrpKCQgHWUl4l/gXmUrqN/gZtxj4Z5kIuEf3typoxxfX16l5abhI54e35+iJSVk4p2kJifoIN6fYlsjIVbeXhxeXFobn6SiXF/dIKPlJNxhYOCZY1/X4F/i3d1c5R1b3lubodthIZed2l4jWaBgoaOqZt+dHyXaomIb4B2fYV2bWxnjHN5e5h4hFtrWHmPaG53cnFvd3hvXWyGbmlnVlpgV1xla2NVYVVfUl9weHlsa3ZlamtqdnxxcnRzYW91YnN7gXh1eYJ1gIB/gHiLhYN9e21/bGR4bl5XbmdodWt4amlqZFxgWmNqZWxwdW5aW2JrZGxseW5obG9hjpS5qaeLoaKapqSZpJyro6GEhJiskp2giZqmmqiYgoGbin6Wk4eOiomNcoN8j31+j4V7l450coNwloV7fZKLhoaQhXh+f4aYo417p6GLhpCQhZaDho6Yd3KFqoaOkpyQiJ6eiIybqKCgq4OJjpSbgH6Jlq2oj5OmkHhvnZGDepJvfqiFcH2VcWtwfIGfi3+SjoxobV2Di4ybm56Oc5WLiHF0a4J2c4BZcm6HkYF9foxqXWpke4WDiIBfaXh7m3uCi4J2gYaCaHmLh2thcXKDd19zjIKJkKeVhmaMj4Nud4uEcYWNeW9lZ2R6g3qWW1xqZ252W3t4d3Rtc3KCZlxtimtsYllZXlpYbHFbX2FaXl1mdH57dW90Y2trant8cnt4dGRtdGdse352enx7enp/f35vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGtqcXJtV1tlbmxnc3pvaGptYIuMqrGhkKOhmp6emJ6ZqKOifoOYrY2flIebopCllX97mIR8kpmJiIaHinN9gIt2hYuBhJaKcW+AcpiGhH6ThIOGioF6gIOLm5+Pgqahh3iOmImVi4udl4WDeq2CkZiZlIqenYeIoaugoqKji4iTnJ2jmZaqoaemoJKbiJeOfHiOjoSnfn+SkZKTnLGmm5SekI2yk5iEpYyMlZufiZCbgomRimt8jXZ3ZYKGkIp7iZ2Eh4uPiIiAhYSQd3x5dZqhiIaKn4uFlH9+jIGAdnB0hoR/eIiHi5CmkYSFjYiDjZCMfYiLiI+BdmyChHx5mWpyaGF0inB9end2b3d0gV1eb4Zobl9eWlxdU2hxVWNcXGFsaXV8fHNvcGRraml/e214f3Fpb3BsZoB7coKAeH99gIR6bYOMhnx6eHx9eoN5TmR2a3NtcHpka2ViYmBbdGZwZnJybVVdbHRtaHl6cWdpa2WNiJ26n5eioZiVmZiUmaSgnnt/mquOno2Fn5yLnpZ9eZSDe46ZiYaEhIZueICAcoGIfoiUhG1sfnqXhoSDkH+AhoSGfIeDjZudkoeqn4NyipCGk5KMnZF9jXuqhI2SmJWPnJeGhpunoKKanYaDkZqamZCapqCmnZ2QloGRind8iI6EpXt8jpCRhpipoZ2TnY+Nq42RgJ6MiZOanoKOl36GjYJveIVxdGB/go+GdYuXgIOPgoaEfoWDlG55dXSSoouMhZqFhI10gIp8fHJye4iEe3mMj4STp4+GhI+ChIqKineGiImLfG9rfoB7bWhsbWdeeX9ofHt2dHV1e3dcYHB9bnVgY1pdXlFmbVNlWl5ha2l2en5xbGxka2pngH9sc4BsbHRveG6EeW6HgHaCgH2EdnKDjYh+e3t8f3uCimBpe2p1aGmCZGpjYGlcZHVob2J1bmxUY3F5ZXB6enNlaW1ti4qft5uipJ+SkZaXi5qfn557eJ6mkJuKhqSUi5iZeXqNhXyJkYOMgoGCbXx/eHOBhX2KkX1raH2Bl4iBiI58foaEh3yPgI+bm5GIp51/cIuLjJOHoaGKhY18qJGIj5KXk5aTeIyjoaGelpp/gJCamJOMm6OhpJqXkZt/joV5gIOPh6CAfYyMj3yXpKCgk5mQj6aNj4GbkYmSl5t+kpJ+ho2BdXSCcHZgfX+NhnKKlXyIi3KMf4KFho5od3F4jJiSj3+XfoiLc4KHfHxweXuMhHp7ko2DlqaTi4aRfIaGh4V2goOIh3plcnt+eHpwbGpmXn1zaHx1dXN8coBqXmB0dnB4ZGNZX15Ta2hUZFlfYWdqdniBcWZrY2xoZX+Aam1+aG5xa313hnprjIFzgYF9gXR2go2Gfnx7f4F9f49qcoNuc2lhh2hsYl9xVnRvbW5geGhtV2p0dmN1e3tyYmpueYmNn7KSpqWcjpCYj4acoJucfHakoI2Xf4yiioialnh7hod+g4l+iIKAf3F/e3R2goV+ipF4Z2N9hpeKgoqNeH2AjIN5loCVl5aNlqCbfm+MgpGUhqabiI2JhKaVhZKLlpeTknaRnqGhmJSXen6OmJeOlpudpJ2Zk5ScepCGg3iFl42dfoGJjYxzl6KeoZOZjo+ijIuDlpiDkpaZfpiNfIiNgXZxfW56ZH98ioVwhpN/kIJsh4KBgImEZXVvfIeSl419k3iLiXyAh3x7cX54ioV5hZGKi5iilYGEjXeIhIOCd3yBiYZ2X3h3fXN9d2ZsZGF+aWp3c3R0fXF8YmNhc251c21hWmFeW2tkUmJXYGFoa3Z5hnFiamNtZWh8g2xodGhsb2h/fIJ5bZCGcYCDg39zfIOMgX9+eoKDfnyQbXaIdHRtZYpsamFjdVaEaXFuYHlnbGJqdnBmeXx6cWBybIaFkJyul6aono2Nl4eGn5OXmH14qpyKmHmXnIuMmJB5e4GLfXyDe4CCgHh0eXpzfYCEf4mLgGRefYuVh3+Fh3R9fop/fZeEl5OWjKOhmH9yh3uTkoqnj4yOipOhkoORkJSXkYuBj5igmpKQkXR/jZKUiZ2dnqeYmI2VlnSOjotshpiPmXqHiJCJb5edmqOTlYqNn4yGgZKcf5KSlYaZiHyJiYF6cXlrdWx7fYt+boWSgpR3b4KDfX6Kf2RyanuAlpeEf410kImDeYd+dXiAfYeAfISOhYyUpJB5hYJ0iYd9gHR2gYeDbmB7dXpxfG9hbmNle2Jub3Zyd3dzdGF2X29sdW5vXFxfXl5qXk9dV2NhaG10e4lrX2plamNod4dtZmxoaWxogHx6d2+Qh3OBg4R9c4GGiXqCfXqBhH19jnJ6inh4bmyHa2hfaXFjh2hxb2V3aG5sYXloa317eHBhd22LgZmaqqCjqJ2KipGGip6KlZd9d66YjJZ9npORlpSId357in18gHZ3f4BwdXR7b4Z9gYCKf3xhXH6PkYZ/g4RzeoCGeo+Rh5KRm5Klm5WCfoF8jouSpImOio2Ym42GkZiTlo6JiYyTnZOQjI1ug5CPkYmemaKhl5aKl5FviJmEZ4aZjpR6iYWQinCVmpShkpKIi5mMgn+QnnySj5KLmY57ioSHdHN1a3FudXuLdG6FkI6ScXSAe4GCiHxkcWx5fZmUfYSIdJCLgXSIeW+AfoGHfIWNioWNlaiNe4h9fouFeH5xcICFg2NoeHR2cHtiXnBha3VecWp6eHhscnBleF1tbHNtc1laXmBialpQV1dlY2dxcX+HZl1paGdiZ3GOb2RpZ2VqaIB6d3RujoV0gYGCe3WCiIV3hXx4hIV6gIl3f4t7enJ5g2prX3BodIBrcm9tcWdvbGV8Y26AeXZxbHd3in+imKKooKabh4yKgZCchpOcdYGqlJKNhqCMlpOQgHR8doV3eH9yc3uFa3Nwem6KdoCBh25xW1l+kY2If4CAdnWAgH+ghpCKkpyXoZSYeIp/gY2JnZ6Kj4aSmJaFiZWZj5eMi42OjZ2KjpCDbYiKkJGJnJahm5iVhpiIaoWjg2eGnYqRfouDi4F3k5iRnpGQiImVjX9+j5d8kY2PjZqSfIp/gm52cGxtbnB7hWlzg46XinB3f3SCiYJ4ZnNvdoGZjnyJhHqUkXp3iHRwiXuGjXqLh4SJj5yjiHyEd4KLf3h4b2uBgoFdcnNxcXF4Wl5wYHFrXm9pfHlwbW1qbHZgcG9qcm1aWGFhYm5YUVNaZmdjdXCEgmJdam1kYmZrkm1gZmZfaGqBdXFycIuAdX+CgHh1gIuAeIV/d4eGd4OFe4aMf3t2in9qcWN8YoZ8b3FsdGpob2x2d19xf3l7dHV0gIJ+pJWarZ6mloWMg3+XlIOPn3WLn5SThYqbjJWNi3pyeHSCcHKEc3F1iGxwbXVtiHeDfoBtblVRgauUh4J4gHZygnmBoIKRgZOSmJySmniSe4ONk6Sak46JlZmThYeXmYyUjImPj4iehZCKfHKKhYmOiJyan5uWlIGUf2mGnYhnhqGIkoSRg4lxg5GXj5qNj4yLj413e5KQeo6LjJGWjHyIfIBrdmpua2tsen5heX6OlYF2eoB3g418eWd0bHSHlYt/iIZ7lJBxeoRwd4x6iox6iX6DjJGfnYV9fHiCjH13cWpsgYJ5X3dvbWxyc1Zeb2JyYV9sbnlwZ3BmZnN0aHFrYXdlXVdmYWByU1BOXGZlXXhwiHxfXGhyYmJlZpJpX2hkW2dwfnBrcHOKfXZ8hYB0dX+MeXuGgXiIg3OGhX6MjIN7eZV3ZnJqg2CIfm9va3pgam50f3RfdH15hnh0c4V8eKCPmbCcpY+Cin+Dmoh/i55/i5qTj4SImI6Oj4R2dHZzgHBvhXNwcYNva2l2bYJufXxtdXNSToLfyJLWk3xvdIR2g6CCk3eVkZmbkJp7lHOFkJ+hk5OQiZOblIZ+lpWIjY2IkY2InICOgXh6jH6IjIqcnJ2blZN6jnZoiZKHbIijhZKHl4OGY4yRmY+ViZaMjYqLcXuUiXqNiIqSkYl5hXt+bHtlcm9ra3l5XIB5j42Aen1+f4aOenloc2tzi4+KgoWFfZWMa35+boCMf4yHfYR7g5CVmpqKfHd4g5F5c21mcH+DbGp0b2hqdG1TXm9kcFlga3F3ZmtqYmZ4cnBwY194YGBWa19edk9OS2BmY115cYl0XFxldmBhZWWPZGBmYVhpc3Nua3F2jHx0eYaCdXZ+i3N/hn97iX5yiYeBkIqIfH6YdmVzbXxliH5vcGyAWmxueXlzYXZ6e412c3eKd3mfi5uum6CQgoV3iJV+fImch4WfkY6FjJeEk46HgXR3cHlxboRvbW5+cmRkeHB8bXp9amhsY6Sawdyu76Fza3WEdoWihZJvlpCVoJScgZJxhoujl4mNlYqQnZaDgJWQhYmPgJKKipd/h3t1f4l4hoSNnJuYmY+Pd4x2boaJi32Ko4SRiZ2FhV6LlJeKj4iOi4uEiWx8loF9iIWJkI+GdoV9fWt9ZHh1am54c1iIepGGhXp+f4CFi354ZXNqf4qOioOCf4yWhWuBdm6IkYKQhX+Ce4CRlpOZkHV0eIiNdXNxZ3V5gmJ0bW9iaXZnUmBxZ2xVX250eWByY19ofXBybltjcmFiV25aXHdNTUxkZmFednOJbVxcZHleYGRmhWBjYl5ZanJrbmtydox9dHeEgXh3e4lxg4R9foh7dIuJiJWGjH5+mHNodXF5bYt6bnRwgVhxenZ5cWV3eYaMaXeAiXJ/nIeYp5yjkoR8cIyUeHmLnYSFoY2Oe5WNf5mIhHtyd3Bzam+Ba2lsfHReYHh2e3B1e2dhZXzr2rXJw9yIc2xzgXeKmoiNaZiPj52Vk4GJcYWJoI6FipWKjZiUfI2TiIOJj3uRi4aQgn92eIODcoeCk5uWlJiGjHeIf3CFgomHmaKDlIyeg4lhg5WPh4mGiY2HgIdpfZR/fYOEiY6NgnGGfn9xd2h2cmlzd2xajH2SgYV8f4OAhIqCdWF0bIiBj4uCfn+SkX1tgmx4hpCGk4R9gX6BkpOQl4lvcnqNhnVscWtyeIBfc2luXGt2YFJkcmlmU19wdnRgb2BdaIJxc2pXZ2hjaVhtV1t1TEpMZWdfYnJzhWlbXGV5Xl5kZ3tgZF9cWWtuZW9qc3eKfnNzgX56dnqIc4WCfICHdneKho+YgoyBe5N2bHZ1eXiTdG54en1YeYVxgG9neXeSgmR2hoVxipaFmaGbooqGc2+Si3J3jpx9ipqJiXyff4OZf4F4cXNub2RyfmhmbHd3W195e3pxcYBpYWdhf9W2jpCmeG5xd3twkpCMh2qZjoickoyFe2mIi5qHgZKRhoeYjXyNjYGBiY58kI1+ioV6dXuCenCGgJaZjpOUgYh1g4Z2g4CLk52fhpWPn36IYYCTh4WIhImNf3+DZ32Qf35/gouPkH5tgnyCdGttdnRzdnVrYo2Bjn+FfnyEf4SHfnBfc3GFfI+Ngnx/kol6cINmeYOKh4yDfIR+gJSQkZOEbnB6jH91bm9qbHp9YmhqaVhsdVpSaXJqYlFicnhsYWVdWmqDbXNiXGdfZGxfblRbb05IT2dlXGducYBsWltjc2BcY2x3ZGVdXVpsbGJtanN2h39xb398fHR4hniFgn2Ah3V5iYGSlXyIhnaJgW93eXuEk3BtfIF3XoN/dIFtaXtzlHNnc4d8cpKRg5qfm6CGh3Z2lH5tdpOXfoiRg4qNmnyLmnZ9dnFvbGphdHxnYml1elpfd3x6bXF/ZWRoaFedj15xcpa8w4N1cZSJkH5yl4yGnJOMiHNriY+WgXuUjIGEm4x8i4Z9fImMf5SIdYmFdnd9gXF1hoGelIaVj4OCcn+IdYR8iZidmIeTjp2AiGV9k4KAhYOJiXKBfWd+i3t4fn+Hi458aYB8g3Zmb3h4c3ZzbGqNhYqBin94gYCEg39rXnJ4en6NioV7go+AfnKAaXiDh4uGhHiDfIGXjZCMfW5te4l9d3VvaGd8dmNccGJXb3JTU25zaWFOZnR4ZWBdXFhugG9zWWViXWptYHBPWWtRRFNnYVprbm17b1pbXm1jWmJvd2RmXF1gbGpjbWpzdoKDcW5+e390dYN6g4J8gYV2fomBlpB4g4p0gYhyeHl+jZBvb3yBcWmBeXp+bW18dpVraniEdGyUjYWemKCZhYhufYx2aniYjn+CioKVl4l5jpZvenNwbGpkYHR7aGBlcXpaYXJ9eWdxemFlZY+xsndKYlqk2dCWcXuQi5B4fpWLhZmRjYZvbIaSknp5koaAhJiKfId/eHiJioSWgG+LiHF0fXppeYWDpZGEk42Df29+g3aEeYWbmJOLkpCUhYdwe5KDfYODiYNugXhogIR4cn9/goqGe2V9foR1ZHBzgGh4cG91mI2Fgop7dniAhHmBa1xxfXKBiIWJfYaJeohygG5xhIeOhIVzhHiAmY2NhHhub3+Ef3d7ZWhqfXBfWXdaWHFtTldyc2dgS2x2dGBdW1tZdH1yb1dnXWZqcV9vTldoUT9ZZ19bcGpneXFbW1hrZVljcHlfaFxeZW1oZmxpcXd/h29sf32AdXCBen+BfoJ/doGFiZeKcYKNcXuGfHl5g5OMdWp6f2tvfnR/fW9yfHuUb26Af3hnkoqCoZmdkYKGZ4eDb2d6lYl+f4WBmYqBfI2MaXhya2xmX2FveW1fYm95XGRrgnphcXZfZWbU6r6KMjo+i46AcnmFiI6NdoOXjH6Sjo1/bmyFjYx2fY9/hYKViXyDeG52hoSDl3dviIVrdXt0ZnmCg6eMg4+LhH1uf3R2g3mGnJCMkJGSjIuGfnuSh3iAhI2DbIByaX9+eG18e4GKg3dieYSBcWRxaH5tdHF1gZuLgH+FfnJ1fYBygXBbbX50eIqDi3uHgHyIeHpxbIiDj4SLcoF5f5eLi390bmt3gIB1dVxpaHdwWVd8U1pwZUxacnJlW0pwd29cWlpZXXR+dWhZYltnZm5jaUxXZlE9XmZcXXVlX3RvWllUb2RZZHF5WmheX2dtZ2psaXB3fY5saYKEfnlugHt9gX+CenWCgY2ThXCAi254foB6e4iSiX9oe31qdHtyhntzd31/jHl4hH18a4yMg5udloyBgGyOfmtofo6Me35/g5SCf32KiGt1cWdoY1tiZ3JvYGFsdGFocIl5YnN0XmNkm6CPblw1Wa+1dWqAiX2ShnaFloVzjouKd3BthYOHdXmJeIl9k4h6f3Nndoh+fphvcYZ+aHZ5bWV5iISlh4CHjYl+bn52f4B8jJmHgpOQmIiLhIl8j4hxe32EfGl+bWuAe3ppenaBh4FyYHeBfnFkcmd1gm10e4WUkYF8gX9ud3l8dH5tWG9/dnSMgoZ3iHaCiXp4c26JgY+BhXJ+fX6TiYl6bm5qboKCdW5cZ2ZzcVFbe05ccFxPW3JwZFZLc3hqV1lZWmFxgHRgXV1gZ2RoaWZOWWhNQGFkW2B2YVx0bFdXU3RhWmRvcldqXmFoa2dtbGlwd3ySa2iEiXx8cH5+e4GAgnp3gICKi4Nxe4dvcXeDf3uJjY+Dan57bnd5dop3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISIkXh9e4GRgIB+ioNwcnBjZl5ZZ19wcGBgZ3Bmam+KdGF0b1thZGp2e3++nKajyLhxhYRzlH14hpOCc5GNiHJycIR7g3R1h3SId5SIeXlxY3eGeoCTaXKEdmZ3dmNqfIOInoJ/f46OfXJ+c4R5gJGQgniWjZSPiIKIe4mJbHl5f3Voe2lrf3lzaXp2gIJ9aGB3h31qa3Roe39pdoGMkJR+en5+cHt2e3R+YlZ3fXJzioSCfINxhop3eHBwg4KNf315fn12joaDdmlxaW2IgnJwXWhjc25KZXVMXm5VVFlzbmJRT3N4YVJYWF1icIJzW2FdaGVkY2pkUVpwSURkYVtjcF5dd2dUVlZ3XVtlbmhWa15hamdlb29ocHZ6km5piIx5fXJ7fniBgYF8dn2EiIaDcHaDcm53goJ+iYuTf3CAe3d5eoGMdYN4f4GBgoR6gHVvfomLmp6IfYV6d4Z7Z3SFjJB6f397iYaEdo+AZ29uX2RcWGVZbXJhYGFxbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4cI11e4ePgHqTioB1dHV+d4BwcX9thHSUhnh1bGB6gnmIj2Zxg29ndm5bbX2AkJOAgHiSkn14e22HdYCQi4R0loqRjoeFhXt/hWx1dn9taHdlbXt2bWp2d39/fGBieIZ6aHR1Y356Z3SFjoyVe3R/dXGAenxtf1lWdH5vdYSHf4B5bIiGdHhrdX+DhH17fXh7couBfXNndGVui4RtdFtqX3VkSG5uTFtiV1ZVeG1iUFN0dlhQVVheYXGEb1xgY21lY15uYlRcckdCZl9dZmhdWnpiUVVcdVtbZ2thVmpfYG5mZmtxaHB1eI50a46NdX92eH53gYOBe3R+hIiHg29xf3RxdX6FgomNint3f3iDfHyFh3iHfH2BfoSAe35zdnmMjp+NiXqJdnSDeV59hZmMeYaDdIWGhXeJe2JubFtiW1thVmpzY2BcZ25vZodxYXFmV11ja398ys6IuaJqbW2KbHGEcnyFin97kYV6eXR5dXV7amx1Y4R1kYJ3cGdefYJ6i4llcoJranFjWGx7hpyIgoFzl5R3fntuiHGBiouHcZeOkIiFi4N7eX5xcW99ZmhyYm54cWprcXd8fHlcZXmAd2l1eGaCdmd0h4uNlHxyhmlvfoB5bnxdWHJ/bXSAi3yCb2+Jf3F2aHd/gX+Bdn1xenSHfHpyZnNhboyCbHNYa193W0lua01WVV5UVXtrYU9UdXJRUVRWXmJ0hWhcYGxqZmNZbmFYYnBHQWhdYGZfXVV7Xk9WZHBZW2poXVdoYF9yZmtocmdwcneGeG6VinR/enh+eYKIgHVzgIaFjYJwcHt4d3V5hoaGi4Z6fH91i359hYSEh39+fn2Hf3x4dnl3kpOff4x8i212gHljg4eXhnOSi2+FhYF6g3RjbmpZX1tdXVRnc2VgWWRycmaBc2JrZVdbYGl/d76ue6C3bWJzhmh0fHJ6g4Z7fYx/eHhzdm97dmVqbmCHdY6Bc2piXn54eYuEZnF+aGprWlZveIqkgYV/cZmTcYB4dYJtgIKRh3OViIyHhIiFfXh0cm5oeWBqbWBtdmtnamt5d3p3W2d9fHhlcn1uhHRldYWMhpV/b4tma3qDdW10YlxvfGt1fIx8gWZ1h31tcWd1fnh+f3J9bHp6gXp4cGZsYm6Kfm1uVmtgd1VKamtPUk5oTll8aGJOVXZqTFBUVV9ndoNmXWBxaGdhV2ldW2toSkVrWmJkV1lVeVpOVm1qWV1sZVxaZWNedGZtZHFncm91gXdwmYV2f353f3yFh311c4KIf5WCbnN4enpzc4WHiIiEeYF9do9/fISJjoSChHt+i4N7d3x3d5qdl3qKg4Zpd318bIOEk4Byj4JxhYJ+gX9vZmxmV11bXFtUZHFlX1hjc3VpdXBlZWNXXFxogHBvcoB0iWVleH5pdHZzc4OFeICEeXd0dW5re3BhZ2tnhnSNhG5mXV99cHuJfmltd2ZpZFVXcnCNpnyEfHaWkHN7c3x6bnt7kIV2mHyHhoOGg3x0cHJsZ3VcbWhfbHRkZ2Zpem97cllngXd0Z3CAd4J1YneFinyUgG6Lam16gXFmc2VgbXpnc3eKfH5idYN2aWtxdHpweXlzfWZ+f395d25jZmJuhnxta1ZqYnBTS2lrT0xOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2lmYFZjV2JwXUxLa1hjYVVUVXNWTFh1ZFpfa2FcW2NlX3dmbWJwaXNucn90dJqBd3+Ad39+hoV6fXWChH6XhW5ydHt6dXGEhY+BgHqLdXSRgH2BlI6AhYR9foyGe36AdnujpYp5iIWEbHV8e3WDgox6boVzeoR9gYN1bmpoZVZdW1paVGJuZFtYYnN7aWhtaWBiV19aaYBqa2+AaGxhaHl4a3R0dG6FgXt/fXZ1bXpoanlqX2VuaIF2j4RnZVhid2l+h3tvaW9nZl1VWG9oj6d2gXp8kI55dW9+b3N1eY+Ad5V0hYJ/hYh2anJ2Z2huW2xkXWxzX2dhaXhoe21abYJyc2lvgH55d2F3hIR4j4RyiHFveX9yY3FoXG93ZHFziHx4YnOAcGdqeHNybHh3dXdkg3t/d3ZvZGRjbnx9a2xVaWJmU0ttaE9HUmtFYXhnYU1TcV1JTVRZZWt3e2VebXFpZF1WX1VubldLVGhYZl5YTlVsVEpceV9bX2tdXVpiZWB6aGxhb291bm93dXqYfXeAgXqAf4eGenh6g36Bk4RxdHR+enZ0hYiQfYB9kGxzlYF8g5+Ff4d9gH6GgoCKe3aErJ9/eoiHhGxygnp2gICBdW6Hb3x/c4mAam9tZGRYX1pZWlViamdbWl51gWlebmxcYlZcXGuBZnJ0fWlqXWt2dmd0d3FthXt9fXl2cmx6aGl4Zl1kc2h6d5KBY2NUZXBngoV3d2ZoamBXVlloZJCnbn54gIuOenBwfGZ5b3qMe3aOcYR9fn+GbmR2c2RoaFxrYl1vb1tnX2x1ZHpoXXSAb3JrcXt9dXVidIWKeoeGf393cnV/dWFwbFlxdGJxcoV8dWRyf2xhbHpvaml6eHVyZoV1enp1cGRhZG5zfmlsVGleXVRLc2NRR1ZhR2J2ZmFLVG9XSkxYWGdsdnpkZW5xZmNaV11YdmVUSlxjWGhYWUlXZVFIYnhaXV9sW15cYWRef2lqYG90eG1vbnaDmHlygYB8f4iLhn11doZ4h4x9dHV1gnh6eoKMjn1+hIlqdJeBe4udfX6FeoF6fnyGiHNxj66Me3uGkH5mcoh6dHx8dnJvhmx7fmyPemJwb2JlXWVWWVlXZGZrYF1cc4VoWHFuWl5XWlxse2Nwd3ZsYlttc3RndXVwbYR4foB5d25udGVpdGVbZ3VmdnaRel9dUmVmaoKCdH1iY2lcVFheYmOQpWh5dIKFkHhtbnlneG18hXt1iHKAeHx4f2hldm1gZmBeal9dc2tZZV1vb2J6ZVt3e2tubnB3eHN0ZHKDkn6Hgoh6dm9yfXJieGRbb3BicXGCfHNmcYBkXm52aWRneXp0bm+BdXR9c3FiX2Zub31kalNoWFlUTXdfUUpZWUhidGRhSVRtU0lMWldpbHJ7Ymxsc2NhWlpbYXZbU0tkXVhpU1dHWWBOR2l1WF5hbVtbX2JiXYVoaGFueHlsbmp2gZB5boN+gIGSiISBdnSJdIyGdHJ3doF3fH1+jI+AfpN+cHiWg32ZknmAgHh5fX90iINzcJmie3p/iZV5ZHWIeXN4dWx0b35seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGIZVJybltaWFhgbHdkaXVqal5abXNxbXRzdGqFfH5/fHdubmxkaXFjW2pyZHR2j3NbV1NkYXKAf3KCXWJjXVNaYFtjk59lcnGFhJF0bGp5bG9wenx7cYB3f3J6enpkZnZnXWJaYWdbXndoV2Jeb2hhd2Bbe3ZqaXJud3NzdGhwgZSChn6EdnJqcHxtZndXXGttYnFzgXpzZm9+W2BvcWJfanF9bGx0fnNxeGtwYVxlbGx6YWdTZ1VXUlB2W1JQWVJJY3NiYEdValBIT1pWa2xrfGZtb3FhXFpYWWxwV1JQZldXaVNURlpcT0hydVhfY21jWGFgYV2LamNkbXl4a25pdXmGe2uDfYCEmXyChHl9iG6PhnFvd3p8dIKCfIuPg4KWdHiClIWBn4l1gICBc3+BcIeCdW+il3R7houHe2Z4i29ue29meHB6bHN2coxrXnRuYWdla1JdW1ZnYmxsWlxxjGRPb25dVlhVZ2p0aGJ0ZWVdWm51bnF1dXlrh3x/fIh3kHNkZGtuYVxubWNzeIdrWlRWYmN4fX1xhV1jX2NUW2BZY5aVY25wg4WKc2poem5lc3ZzfGx6dHVven51X2ZyY1teVmJkWGF1ZVVfYG1kYXFdXX5waGlzcXNwdXVrbYSTgYh7hHFyZm59cHJvU1tmamZxdIF3c2JsdlVicWpbX25lfGVtdnxzcnNqbWBaZGpqd15mVGRVVlBUbVdRV1NQSGVyX2FGWGlOSFhUVm5pZHxpa3hrYldcVVt0ZFNSV2hRWWZUU0haWlBNeHdbX2VsaVpiYF5ej25iZmt5dW5vaHZ2f39sg4B9hpd7f4iBin9rk4hyZ3SAe3WAg32Ijn+Lk3J9ipGFh5+Ge3+GjHOAhnN9g3ZupYxzgY2Ld3hueoxgZHxwZnpzeWxtcXaCZ2R7bGNmZ2hTXl5UZ2Bsb1tebo1oTmptYFRWU29ndGtleGRlXVlwdG1yenhzbYh7gHace3prYWVsbV5gb2plcHl+Z1pWWGBreHx7cIRfYl5nVllgV2SciGJrcYGHfXdra3hsW3ZxbHppdnNub3uAclhqbl9ZXVVhY1dkcWNTXmFpYmJsWmB+bGZrc3VubXd2a2iFjH+IeodtcWZwfG1ybWNZYGhpb3SBdHJeaWxSZXFkVGJuYnpjcXZ7dWtwbWtfWGFnaHRcZVZhVlNOWGVST1xPT0hlcF1jRllpTUlfS1htZGB4aG5+ZGBVXlRddFtUUmBmTl1hVFNKXFlQWXV2XV9mbWhYY2FbXo5wY2dqd3FzbWh2dHqDc4GDeoiNfnyKh456bpCKdGxzgnR/f4iFhpGElY96fYyPiJGbhIB8jIRzf4FzdHhxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6Ojo6OjY6Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6Ojo6Pj4+Ojo2Ojo6Ojo6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx8fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENERERERUIxLy8wMDAvPkREREREQ1hoZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU1Mx8dHR0cHBwuNzU1NTU0TWFfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJh4eIiIiHjpCQkJCQkIyHh4iHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYaFg4ODhISEhIWFhoWFhYWHiYiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpGSkYmHjoqQkpOQiZCPjI6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo6Ojo6Pj4+Pjo6Ojo6Ojo2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIyIh4eIjYiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkY2GhYaPiYyQj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCPh4uHiIyIjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIyEi4eGjIiPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYiLjIuNjI6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKSkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGdtZ2pnaGVoZ2NiYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXl1ZWV5iYV5eWllfW1hXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01QUVFRUVJWVlJRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFPTk1PT09OT1BQUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0pOSU5OTE1PTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDRVNCVVBIS09LSUlKSEhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4+PEVEPT9GWUNbVj5FRUdHR0dCRERERkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUNdRF5hPkFEREZDRkZERklIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs8Pj06Q2A+XGtDQUI/QUBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo2OTo5OTpGZ0BcbT85ODw8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0Q7Pj0+O0ZpS1xtPjo8Pj0/P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtdcEI+REY/TWRYXWU+PT07PD4+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGRD48PD1APTg6Om53Sjc8OUVaY2BgZEk7PD1EOjs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAW1E8PD1MUElIdndPNzg5VGhtZ2hsYEE7TlE5Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQEV1eUg8YYGEgHp7d1xGPUFlcnRsbXJtT0ZmTzo9PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSXN5a2aEhIOCg4B9YFhRRmJxcnFvdXFgYGlKQEJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHt9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBHcHR9goKBg359hHRKU2ZYYXFydHZ8dGttY0lKSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVpc32BfH+EfnmGcUJIZG1sdoGGh4eEdGtWSU1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH94gISFg4SKbUBPc4GFh4eHh4iGZ0pMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goOEg4WHhYeCVmyEh4eHhoeIiYh8UUtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUlISElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVoKEhISCgoaGhYOChYWFhYaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSklmhYSEhH+Ag4OCg4SEhYWGh4iIiIiJi45mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCBg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ojo7ODk4OTg3Nzc5Ojk4ODY4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3eXt6e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1yhICBg4SEhISEhomKioiHiIiJioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3V0dXh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPj0+PkA/Pz9AP0A9PT9CP0FBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSg4KChIWEhYSGiYmIiIaGhoeIiYqLi4uKiouKi14+REdJS0pJRkdHREZIR0VCQUBDRUNDQUJDQj9AREhFQ0VERUVBRkVGREVGREBCPzxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRliFgoOEhYaGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JCR0dKWYWCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTEpJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTktHR0dHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozw9Oj9BPkBAQ0ZJSlFggoOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhIRUpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0BFSEpMV3KDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLX1JSUE1OTUtKR0ZCR0pHTEpGS09MS0pKTU1MT1BOSElLTE9RUVFRT09KSUpKTEpMRkdIR0VHSUZFRUJAQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUhLTFBXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkRFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExKTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/Q0JGVk5GT1BQVFl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI+Li4tnVlVrYUVSUVFQSTs7UVNSYHVdVVZUVllZUllYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0hISkhFRklISUhJaXJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVlZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RaZ1JVVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceYWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlRSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUlZWFlbXVhYWVdSUU5QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVVRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haW1xeVFFRUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5TY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxtcnV2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hCQ0hHSEtHQ0JBREBPUE1TZHN0dXVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYltYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc/Pzs7PkBAPz8+a1FLYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQz8+PD1CPkpNRlVudXV1c3R2eHp8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en17eHp8fHh3eGRCQEBCPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87Qkg/XHR0dXZ1dnh6fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWEdGRkhCQUdJRUVGRE1SUGFXUlhRUFNTUlVbT09RV1BNSkNGPjo6NjQ4Nzk3OTozNjY3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFhZWlZYWFZYWV1XV1hoc2tdVmFza2FhX11kYV9eWVVQTU9OTEhISktJSEZDUVBTWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25xdHd4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk9PVFNUXFZSVVNST01LSUhIRj8/PTo3ODc2NTk5Njc2NjVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI8WE1JQVE9Y2FRU1FQTlBRUE5OTVBOVFJQUk1JTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I0NTY2O2VwcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZGQUZHR0hGSkRISkhHRUhMSEtIRkxNUE1HL0VfUj4zQD5qb2FSUlFARlVRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzZEbnF0dnl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEVGSEpOS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTEpMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFdXVUxMS0g9OTg3Oz9APjw9QUBCPT5FSEdERkZJR0pKQEZBQUBGSEVKT0hQUmFcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0lKTExLRkZGRD9CQz48QkY/Qj9BZHF1eHt6e3t8e3p6d3x3eX1+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz9CQEA+QURJRUNIR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTUtMTU1MTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QEJCQURFR0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVExKSU1URklJSkxKS0tJSUxNT1BSUEtHQ0tHQ0JKSkxNT01JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtER0hIR0pLSUpLREdCPT49Ojo6O0BCPz1CQkNDR0ZKTEpFSUlGR0hDQztBQEI+QEBDRURJTVBHSUtHSEtESElLTUhKTEhISkxLTV1SSUhETUZBREtLTk1QTktNSktGR0dKTU5RTkxjbml2dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0RGRUdERUVHRUdCQ0A+PD06Ozo6QERAPkJDREVJRkpKTEZJSUdGRkRCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NSElMR0VGSUlMTktKSEVOSENHTUxPTU9NTk5NTElISk9SUVJOUmZnZnJvc3h1e3p8bGhqbmVrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUJCQkVAREI+Pz46Ozs9Oj0+Q0E/QUNFR0pGSUlMSEdHR0ZFQ0A9RUVCPkJEQ0NFR0hJR01QSkZGR0tOT0tGSEpGRURFSUlIS0lGSFBLRElNTFBNT05PT05KSklNUlVUUk9XZGBhbWdwcm9yeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRDxCQT5BPTo6PT87Pj5AQj9AQkRHS0ZJR0lIRkZHRUNCQUFGRkNCQ0JERURHR0hGTFFMSU9KSkxLSUdIRUZFRENJSEhLSkdLUk1CTk9NUU9PT05PT0tLS1BVV1ZVVFhgXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJqa3NNR0dGSEJCQERFPEFBQEM8ODk9Pjk/PD9CP0BAREZIRUhGRkdGRUVEQ0VDRElGQ0ZFQkVHRUVGR0VKTUtIUU1KS0hISUVGSElFQ0lJSktNS09TTkRRUlBRUk5PTU5QTUxOU1dWV1hWWF1aXWRgaGJqaWdrX2VlZ2NnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlvek1IR0hIQkJCRkU8QEJCRDw3Oj0+Oj46QEI+Pz9DRUZERkRER0VDRUNERUZHSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSUpMRklJS0hFS0tMTU5PUlRPSVNVVFFTUFFNTlFOTVFXWlZaWVZaXVpYYWBgYF5oZWNgZGVoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnN5TklIR0lEQUNIRTxARUJFPTg6Pj49PDxBQjw/PkFCRkNFQkNIRENFRUZHR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEtNS0lNTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVteX15gYl5cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cXVNSUtISkVCRUdFPEBHRERAOjw+QD8+P0NCPEA+QUFGQ0VEREhERkRHRUhIRkhHSUtKRkpISEtIRkZMSEhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1JRTE9TUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZvdkpLTEpMR0JFREU8QEZEREI7Pz9BQEBAREE/Qj9BQ0hCRkVGR0VJRUZESUlHSUhKTUhISkpJTEpGSktISUpKR0tLTU1KSk5MTk5OT0tPUFJVWFZNTlRWVVNSUVBMTlRTUldbXl5fXV1gX2FhYWBiY2VhY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93Sk1MTE1HRERBRDw/RUVFQz1BQUNCQkNFQkJEQUFFR0NISEhHRkpGQ0dJR0dKRklMSEpKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQT1RPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWJnbmhiaWhobXh2bGhqbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTUxMTEdFQUBEPj5ERUZDQENBRURERkNDRUdDQ0lGQ0hKSklJS0ZES0pHSEpJSUtHSkpOS05MSUxISk1LWmZKZFxLbFNIT05fblVrc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRgd3VpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUtOSktKRkM/QEI/PURFRkRDREJFRUVGQkZGSENESkVFSkxNS0xNR0dNSUhJS0hLSklLSk5MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW15bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9CQj89Q0ZHQkZDRURFRURDSEhHREVLR0dMTU1LTU1HSk5ISktKSUxLSkpLTU1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3FwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPT9ARkdCR0RJRUVEQkZJSEhFR0tKR01NTkxNTkhMTUlMS0hKTUlLSkpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnaGFkanV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0d0lNR0lERUVDQUI8QkFCRkRHRkxIRUNDSEtISEZKTExGTktMU1JMSExMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNnYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0JHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1NSUtLS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVEREdCSEpMSEZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSktLSUhJR0tLTEtGSEtLTExMS0lLTE5UW1xUUFRMUE9OT09WUU9PUU9PUUpJTlBRZHFpVFlXW1tcVVlaXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DR0NFR0NJS0xIRkRHS0xIREdIUEtMT0tMV0xJRUVISUpISUtJTEpIRkhHSkdISUVGTElJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUkpZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF1iX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJREdHRktKS0hFRUpKSkdFSEhQSk1NSk1TSUhGQUdGSklLS0lMSklGRUpHREZHRUVKSENKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl5cXlNbXmNeWl1gY2BZX2JbYF5bVFhYWV5dY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRkZJSk5KTkxITE5HSEY+R0dMSUtLSktLSUdFSURDQ0VBRkpEQEpMSk9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFeXmNhYGJiYmNjZVpRWVZVXFleZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0dDR0VCRUdIRkdISUZHSkdIRkhLSUxEREtLTk1MTEhKSkhKRz9HRk5KS0tNS0tLSUdHQ0RAREFISUE/SUpIT11hWltkXV9UUVNYXVxcXF9aS1dcTFJcWUlNXlBPXF9hY2RjY2JcZGNiZGNmWFFVVFNbWFphXl5eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0lGRkdIR0dJRkZGSUxKTkVES0pMTkpMSUtKSElHQkhIUU1LS09NS0tJSEdFRD9FQ0hIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYWBiYmBjYmJkZGJYT1FRUltTW15dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSktOTExJTEtJSUhESEtRT01NUExNS0tISUNEQUVESEdCQUdFQ1dVRVxUXVNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXWBgX2JjYl1iYldfX1RQTlBRWFJdXFtcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUERXX0lHR0hERk1KUFBGSklKS05MS0tMS0pKR0VKTVFRTk5PTU5MTkhLQURBQ0RGRENBRUZCTUhDTExQT09MRk1GR0lKSEdMTE1PUElMT1BQU1BMUFRTVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVpdXGBhZGVjZ2NrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0hZTUdISkhHTkxRUUlLS0tLTk5VTk9LS0xHR0tQU1NOUE9OT05PSEtFYEVEX0xEZmNFTVtJX1xzbU9NVm1ZTENQYFVsV2dKXVdVXkRMUVVMTVRWUVNUWFdUWFVUXFRQZlpoaGRYU2tUV1ZVW1xbYGBhYmJiYGZoZm5saHJ6fH1+gYSEhIODg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPU0lLR2BUSEpPSklPTVJRS0xLTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1dQbUhxbnBhVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVVd/anR1dV9gd2BYYVxcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExGSkxGUlZMS05JS1JYV1FOTk5MUVROT1FQS0xPR01QU1taVFFST1BQUEpIWnhdVHhlaFlSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9wgV1menV4cXF6cX5zfWt1fWJSZ3xlc3Nvc3N8fW99eW9/cl9gYGJiWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhLS0hKUE5NTUpOVl5ZVUxRU05YWkxTU1JOTFBJUVJUWVdXUFRQUFBRS0dmeGxjeHJtWktMVXlwdW11Ym52UGRlSWZ2cW13b4BqZnh4aVhzUml7bWlqenp9bHh6f29nb1h2dmp1dXCAYHNofGlseHxvXl9fY2JaXWJkZ2lqZWdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNCRVBQSEpLSkxQT09QTVBaYFpYS1RXUGFeUlZRWVNNUElTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnR0cWxtXHR+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hmZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBKTE1LTFFRUVFQUVdcWVVOVllVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhlfGlye11US2xgdnVraXV7e21+eGt8cF1eXmJbXmJkZGdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraG1tcnxrbWhre3RtbWttT0hKS0hJSUhSUUxOT01MVFNTT1RSV1JWVFBXWlZWVFRUYWBRT05LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VSU1dbV1hXWk9TVVdXWFJdWVddVlRPWVJXV1dYWV9bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTE1LSlNRTVFQT0xWVlRQVFVYVVlVUlpdVlVUV1VZWFBPTE1WVFFOVVNOT01MUVBLSlFSS1FNS0tPUlRSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NRUlVVVlNaUU9TUldVVFlWVFlVVFJVVFRUV1hXXVpeYV1cWlpcXGBjXF1iY2RnZWVkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFBKS0xPT0xNVFBOU1FRTVhYVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1dTUE5VUE5RTktTUE1PVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUT1RVWFVUWVVXWVVSUlhWVVdbWVpfXVVYX11eXVxdYWFeW2JiY2hmZWRiWF9gYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RW1pYV1haWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFBOTVFRUFJYVFJRT01PU1VPV1JUVVVPTk1RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1dRVFZWVVZYVFdXVFNSWFZVWl1ZXV9eVl5dXmBcXGBgX19aYmJkaGhlZGFZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlJXU1NTWE1PUFJUWFVVVVNVWVhbXl1cW1ZST1VWVltbV1FUV1VXWFZUWFpUU1FaV1ZcXlpfX2BVYVxgYV1gYl9cYF1jYWNnaGRmYFljYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXmBbXl5hYF9iXFlgWlFOT05WUVBUUk9VVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUktRVFRZWldVT1JOU1hWVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFVWXFxWUlRWVlhZU1RZXFRSUlxXWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGZpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dW2BcYFVcXWlqcn1zbGdcVVlXUU9SW1NSUVRSVFVUS1FXVltZWlNPU1JWVlVTT1ZSU1pSVFVUWFxXWFhTWFxYXl1ZWl1UVU5WV1deW1hRVFVYWVlVV1lbVFNWXVldXWBdYmNeWWBbZWJfZGReXmNjYV1lZmlkZl1eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFpbXlZeWV1QT09SWlBaVVVWVlRUVF5eYF5eYlxhVV1eYmt5dGx9bFpVWlVRUVNcVFVUVVRWWVdMUlpWXVtcUk9VU1hXVlNQWFJTV1NXVlVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlNUVlpZWlZYWVxWVVpdXF5hYV9kZF1eXV1lYWJmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllaV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxYV1dWVlddWFBVXFleXV1UUlhSV1ZUUlRYUlNWVFlYWV1eWF1bVV5fWF9fWF1WUVlUWVpaYVlcVVZYW1paWFlZWlhWXV5fXmNiYWVlXWJcYGZiZGZkX19kYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWlZTXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2hZXFpWWFVXW1pZXFlYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXW1pcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1lbWVleX2BgZGJjZWViZFpiZmNnZmVeYWJgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhWWFdYXV9iYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcUlZYUVdWVlZWVlNWVFhcXF9gYF1gXVdhXlteXFteWFZYWFtbX2BcX1hZXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFpYXWBjZF9SWFlQWFdYWVlXVlhWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgX11fWVleXV5eYVxbWllcX2JfYmRjZWZlZmJaZGZnaWdjX2NeYWZkWmlpYmZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFdXXFlXXVxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl5cXFxYV1tdX11gX11bYGRcXFhaY2VjYFJcWU9YV1lbWllYWllgXWBiYmBhY19cYl1fXVteXlpZVVhdXV9gX19bWl5eYGJjXFxXW11gYmFjZWRnZWVmZFxlZmhpZmNiYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYUFhaXWFjZmZya39KWVddWlpfXVxeXFldW15fYWNiYWFdYltiZGJgY2NiXVxbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXV5fWlhWW19eXWFhX11bYGFiZWJfXVNcX2BjZGRmZGdmZWZlXmVmaGhnZGRgW2ZnXmFoaGNoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFg4GDg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t8e3t7e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x8fHt7e3x8fHt7e3t7enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiYmNjY2NjY2Ni4mJiYmJhrPW0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMjJCQkJCQkJCNjIyMjIyIv+nl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHd4d3d3d3d3d3h5eXl5eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9fX19fX19fXx8fHx8fHuBhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eXZ2dnp7eHt4d3Z4e3h5enp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7enp6ent7e3t7e3p6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8fH16eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3l9fn15e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3fHp8fHp8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp+e319enx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXx6ent5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t7eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHt+fH1+fn5+fn59f39/fHx9gIOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgH9+f4GAgIB/gIGBgH9/gIF/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+foB/f4CAhH+DgX5/f35+fn1+f39+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+f3+Mfo2Ffn9/f35+fn+AgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/gZeClIx+f4CBf39/f4CBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoKGnoaXlICCgYGCgoKDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgYOBgoqhiJmah4eGhoaGh4iHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFhIOBgYGBi6OKmpyJhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODgoCNo4mXnIiEhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOCgoKCgY2jj5aZhIKDgYGBgYB+gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjoSBgICFn6apqJeCgoGDhoN/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4qXiYSDhJitp6usoI6BgoSQhIGBgIGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYaEhIODg4KEjpmPhYWJpaGZpaObnomClJWEg4KBgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2NnZmThIiflJCfnJSdlZKejoKDgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX1+fIKXk6GdjJOSjZialJmhoZuHgYGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2Kh4ODg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlp+Lfn+AfYeLf4SGlailn5KRlY+JlaCdmYSCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4WDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGSoIqAjIV9hoiBgIaJnKGikIN/fn6Clp2RgoODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qQgoSKhYOCgX9/g4iPj4aAf3+AgH+CjoaDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiIF/gIB/hoJ/f4CAgICAgICAg4WEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICFhX9/f3+AgICAgICAgICAgX9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyIgYCBgoKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn1+fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomJg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGBgYGBg4OEg4ORkpCOj46Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Afn5+fn18fX18eXyDhoeHhIOBg4OEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Cf3+Bg4ODg4OCgn99fX+AgIF/fX5+fXx9fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59gIKDg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn9/gH59gH9/gICBf4CAgX9/gIGBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4ODhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4OCgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAgH5/f35+fX5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f35+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5+fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgYKDgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g4yEg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4WEg4OEg4WEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGBg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSSko6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICAgoGCgICBgYB/i5SPjIuOjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyCf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYyMjY6OioWGh4WEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNjI2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyMj42LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1/gICDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhYKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNjIuIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeFgYSRjoyLiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn9/gICDh4mJiYqJiomFiJGNi4iJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fX18fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLi4mNkY6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY6QjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fXx8fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgIOBf4CBhIF+foB/fn6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgYCAgH9+fH19fX1+fn2CfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH2JhoaFhYeFhYWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WFhYODg4SEg4OEgoGAf4B/gIF+fX1+f35+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCg4KEgoGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOBf4CDgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OCg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBfn58fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCg4GBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/f39/fH5/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoGAf35/gX5/gIKCgIGDgoSEhoSAfn18fHx8e3l2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fX5+gH99fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV4eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAgICBf3uAfoCAf4GBgH99gH5+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4ODg4aEgIF+fH18fHt9eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/f4GAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcm94d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f4B9fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4GBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYGCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCAgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx4eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoN/f4KBhIODhIGBg4GCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhH+Ag4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBg4GAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4ODhIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIOEg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIGEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4CDhISFg4KCg4OCgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn5+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgoF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISEhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX1+fn6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGc4SDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdYJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH97f318gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6DdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISEhoeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXt6eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhIOBg4OEhIWEhYSFhIaDhoeFhoSEhoeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoaCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aHhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOBgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhYWHhYWHhYaFh4WEg4SDg4SHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fnt8fHt8fH19e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWIioeFh4aHh4iHhYiFhoeIhoaHh4aHh4iIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4OHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aHh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6enx5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIOGgoWBgYB/f4CAfn+Agnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhYSGh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dTU1dXU1NTU1NXV1dXV1dXV1NTV1dXV1dTU1NTU1NPS09PT1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX1dXV1NTU1NXV1dXV1dXV2NjX19fX2NfX19fX19bT0tLT09TU09PT09TU1dXV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4utHT09PT09PT09PU1NTVx7e5ubi4uLi4uLi4uLe909LS09PS0tLS0tLT09Pb4uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPT5ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjoqfP09LS0tLS0tLS0tLS1L2go6Ojo6Ojo6Ojo6Ohq9LS0tPS0tLS0tLS0tLQ3+vr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKOoz9PS0tLS0tLS0tLS0tW+oqWlpKSkpKSkpKSko63S0tLS0tLS0tLS0tPS0N/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozw8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamprM/T0tLS0tLS0tPT09PVwKaoqKmpqampqampqaiw0tLS0tLS0tLS0tLT09Hf6unp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLU1dXV1dXV1dXU09PT1NPS0tLS0tLS0tLS0tLS09TV1tbW1tbW1tbW1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7T1NDPz9PTz8/P09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1NTU1NTU1tbW1tbW1tbW1tbX19bW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7QppLF0tChlsvTx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQD06ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Sqp2slM6ooKufz5msmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/QyZeZhaakn5aQobSVhp2czs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw9OjY/QkBCOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9GksL2aip2gp5m0v8mXmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0NW5mZ2lnoygxNKSmaDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9DRmp29m8XJlNmto7+e1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDVp6Sixp2TlqO7zYiVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDSwJ2izbKbrrOdpdDbo5m11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT1KSgj7usn5qhnJyRp5ieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyMamvZWTmKGpn6KeqKKpndDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEE+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNTKjpOXkKqzjZCl1JqSjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS1MKvsLPR1sC91tTTucjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHU1tbW0tLU1dPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09LS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqGgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnp2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJuamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6SioaCem5mZmJmZmZmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaGhn56cm5qampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+em5qam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5qZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmZmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmJudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJKLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+iZCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46JiZCPjo+UlJiQlZyanZ6orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZuioZWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKuqqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqWnpKmrr6ylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuur6qqq6ShoqSpp6apqKOinJubpKClqKOgmJ2Yn6GiqaegoqKurKuqp62vqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpaepp6moo6emmZykpqKhoaGhoJyYmZ+goaSkop6elqCbmqKioKGfoaKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXVxQVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWm5ikoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq7CpqKqooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbWmBfWlxWXGhkbmNuamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm52hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnlqYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpqWZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHVrcWhpaWFZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1tby8vry8vsa6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta+zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5ea2Nibnd1dm5sW2JRVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha21mbnVxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaalnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/vLu+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrLS1rK6lpKOopKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyeHN5ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsnFv8PAy83PysbEw8PBxL64vsHDwMS/wc/Pzserr7a0taugp7Szrqu4tbOsqaOhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF1qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzs/PzMPHxsjJyMjJx8XJx8jHv8XHxMTJzMrSz9POvLi2tLi4wb6+ur26vLq8rK2mqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhqaXRteGxdZFtWYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M7HzMnCwsfCy8vIxszKzsXGxcPFysfK0M3QzMfEwMPCyc3HxcHEx8G8vrSwsLDBvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnRiXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPEv7++xMvIysvJvLvIxsjNyMPIycnFxcPCwMW1wsnKyL7Fx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZmNqZGFqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5x9DKxMTAw8HCwcPCw76/obfBwcGgusfMy8XI0cKwvr64uru7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2RjamJnY1taWlxZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMvUt7vAwby7xb27wcS/v5KnvcK7eqnAycTAwMrAscG/u7e7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJjaGpnZmllaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3r663tbm/u8Hel37JvMO1use3trm7vb2Km73GtmCVwMXAv7zBvrjGvMK/vMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXhxbWVlZm9pZWtoWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zQy32AuMTHt7m4rre1uL21gJG9yKxWfMDGwMC/vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZmFtYFxUSUtKREpCQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uyvb67xLa1uLW3wL7EvMLE1qp0d5DGz8LAuK+1tbvDqnmJv8mdVWa1y8PCv7++vcfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxpbnRueGNnYltjUUtUSEVFQ0hDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOxuby9sry+vMW4sbe5vsrKyMPGy86Kc3SOzNHMysS1usDEzpdxhcHHkFhal87Gwr/CvMDDzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYk5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzPzLy6vrzEvre9vLCvv73By8mxenV6jcbMy83KxsLEy9OEbYK/voZeWHrKxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW11fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLbAuMvYvb62v8C/r4V2b3t2hJe0mXF5e4+/x8vIwcPBwMnLc2l7ubR8YVdoxsbFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4c2dwXVteXVlSRURDTUlBRT1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xXJ8wcy8trnDrYdnW2NeUFtfcH9vdnySur/GwLnAvL7GwmVhcq2zdWFWYcHHw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX99dmx1e3BuaVtfYFlTUEFGSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5xcp0Z4a1vba2nm5qZ1VfW0lMUVNeb3OBnri4wrqzu7e7vr1hWmSgtHddVGfCw8TDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN1dnducWBfZl1bVEo9Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS1t8fGfHRphaW2mGJTRV9RTWllU0xIUHF4iKGwt765srWyvLq7Z1VXmLx+U1BywcTGxMC9v7mzr7G8uq67tLOmq6itur64y8K/vqyrsK+zu7e5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FbXk9IQj89SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fDuYV6bm6OoG9PSUJrUkNce4eHW0ZXiKansLa6tbSyrLy6unRVUIW3gUxUgr/Bx8O/ubq1raWttrGmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWZYXF1STk5BPkpCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4ur2RgXdyhX5XRkJXiFFLTmF9h35RQ0+GurKztbK0r6y7urqEZlt4n4FccZe5u724trKxraugra6onaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdGlsXVtqVF1cUE1IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbK/oYeDhH1mTEBVenBMSkxOh6tvVj9zvrmztLKwsa2wurerjoN0haWpqamtrrivqqutrKOorLSnnZeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvtaqTjZCbY0VWnXlSV0hRYUl8f2Njd665sqyzr66srbeplY2dpKmkn5ycnZ2nqJ6gqKihqbexn5aXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mo5ujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn96Y3dsblxRaFRQTkdQTUxCT1FAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKq5sp6itVFBep13WGtKVWNpdnVkanqdsrSqsrSuqqupkpSrr6edkJeTj5ignqGgnKSlraepoJqWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZm6SZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXZ9bWt7ZGhVUWNNSkhHT1JNSk5HPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoaigsMG5vXxPS2yqXGp+cXZTXm9hYG1ogJaxr66ztaqnoaGjnZmUjZCVl5iYnJ+iopufraqQl5eXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGfnJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd4fGR5eWBiUlVgSElKS1NUSVJQTDk/QTY3PDY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnaHDwYBVVmZwfXZtZnpyVF9iZGpsYmxwlLSwsLispqGdnpqVmJqZkI6RlZGMjo6UnKOMdpeampeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSqsq6imZydnqGZm5uamJmblJablpmdpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk5PVUxTTEE3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqesaWQe22GcGJlV1FcVVdLTlVaVE9fWWy0s6uvp5+eoqCXkZSboJuYl5KTn5yhpJiGbHWdm5+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVqd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGhooRkWl9pYVZOUEY/P0FERUJHUkxPqLaqqaSfn5mSkpSYmJaVlYyIi46VnZ2eeWGGn5mmn6CopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6elpJ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXZtaG1cWFxDV05KR01HQkZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn5mBX15mYFJFRTxLPEY8Qj8+QEFNeqmtqaqln56eoqOen52anJuUk5WUnZ6Yln10k6Kaq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Wvs66qr6Odq6e2sa2isKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t0cnFoVlxRRlRIREpQST9FQTRGSDk1Oz43Ozw/PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can6CJdmphV05EP0xffmxfQzwzNUt7qrKno6OhoJ6lq6Wel5yUkZmdmJSMioaIhnhvgp2koqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8TJycPBxr66tLq6tbu3sLWyqrqyrru3v7u6qritq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hrZVpbRktMRURTTURCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZyZcWpgVUlFQEFSjZ6kilBHXo2urKGZm5uenpmXl5eSjI6Wl5OOjZCLgoOCd3JxbXGOpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcXM0dLVztPJvcC/w7vGxcjF0dPN09DT08zKwsXGxsrIzr/I0czHxcfFwbzDwb+/v7a+s66/wMPDx8THxK6/uLK4vMPCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTERFUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelGVYUExFREFGXr7Ww6OTo7Ouo56cn5qXlpSSlJaRkI+Mh4ODiIeDgIGBgHlxcm9seaS2urm9y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1dbT1MjMxszNydLNztPNxcjJysHGy8fJyMa/w7OzyMTLy8vPxsq/vr+9wcfEzMzIycDDv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZtcTENERkRLVXi6uKuvr6acnJygpKGdmpSTlZSJfXdwa2ViaHFvcXuFioB1cG5xdHCFs8K9xNHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1dbZ1dfT19jO0srP0czP0M3T0L/Ix8rEzMzMzs/Fxse2v8q/0s3Mz8bJyL/Ew8jOzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUlKPjtBOD00NTg2Ozg2OjxAPjs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSln6KjXkU7QUJJWmyarqyom5SXn5yaoKCem5yZlYl3aWNgX19fX15fX11ibHV0cHBvbHJxdZLEx8XU1tfX19PW0NXU2tTUzs/V1NTR0czRzdPX1tPV0M/S09HJ09HI0NfX2NHX0tjZ1NbMz8/KzdLLztDAxsPIxs7N0dHSyczNwMrMxtPPzM7IxMrHx8jMytTU0dXP0szTwrnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjsHNEQEE/U22dsKifl5WXmZqcn52YnJySfXBlY2JfX2FfX2FgX2BgX2BmbnBwbmtvcnd3nMvA0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NfXy8jOxMnPzcrMwMnAyMrNztDL0M7OzM7PyMvQ0cvOysLJx8nMy8zS083T0dHQ0Mq9yLmwrru4taq2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2ppap/YmdiaYedn5uVk5abnp6enJOWl5SIa15eXmFkYmBgYGFgYGFeYF9eXGJtcm9vc3R2dnmkvcvV0dbU09jWzs7Uy87Oxc7K0tLPx87NzdTLztPNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzMLIycPMw8XIysrPys3M0M3Ty8bIz83Ix8vFxsHGyszN0NHG0M7NzczPxcfBuLm9w8O9w7mysr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomGeXFya21nYGBwaFlYaFZMRkxJUFFCO0M+OzY3Ojg6OjU3PT1BPDo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7Son62Jc4SHocOqloyMl5WQk5GRlZaVkIt8ZWFiYmBdXmFjYmBgX2BhYWBfXVtdZ3JycXJzcG1yeaTG08/L0M/T1MrFycnGxr/Dxs/Ox8XHzcrSyMvOzsbR0tDNzNTKx8vOz8jHz9LL0c/GusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS/wcfMzMzPwsrLyMfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raS1c2N/gLaskI6Nlo+Fg4ODgX2EhH5zYFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb3B9uNHIycrPy83EusDDu7u6ur7JxsLDwMPIy8nIysjBxczGyMvNycTCysnBwszQxcvIv7nBu8bIvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa9vMDDxczFxbzAysLFx9LFwMm/ysnGyMbQw8PGw6/Ey8fEyre/vLq0qaykpZifmKyjoaWbo6CblHt3cnRmaVphbmxaXFhSRExGQkdETERGU0A1NDMzND89Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrGwsWVleou2kIuSloZ6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wcHBxb69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7vGw7+8wc3Dxr6+tcG9w7q9xrvCurO8xcTCwre/tba+v7vMw7y1usi6v77LxMHGwsXJxsnG0MbCzMeyx8nDzs3BxcPAvbO3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jV15ZSkZKRkhKQUVCRUlAOTo2NDg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NbXzcrPxcnFx8C5xb2rr55caXKXlIuIioR4f4aGf36Ee3R0Y1xcXV5gYGJjYmJlZWJdXFtcXlxeXVpbXF5oc3FtZ2ducHJ5nb3MwMO6wLiusLGnqq2sp7i0t7Szs7S7tb6yt7C1r7K8wrzBxLzAu7Wyur7AuMe5tLu2wcK8uL3GwcO7ta+ytrq/tMS3u7SruL29wL2xu7awtrqzxby2rru/tbe0xby+w8XAw8XGyMvFwMbGu8fLwM/Kx8PGwsO3w729trm+x7+stbq1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HFv765t8m2qrGSXG11kY6GiYl6eH6Ghnd3gXxzaF1dXV1fYF9gZGFfZGVjX19cW15cXV5aXFtdX2xwbmhma21ucnykx7+5uLWwq62nnqOqp56rrbOtqqyptK63sbOprqass7y6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCywLa4vbCwp7Kztbu8q661pq62r7uysKq5sK27rru4u8DAvrnCv8fDxcC8xsLIyrjFx8a/x8TDusTGwrvGyczLs7nCvbuziXN2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHF0MfNwcPGv8TEw8PKwsnKvsC8wbqytLTDrqmwjl9vgJCIjpB7eH2JhXp7hIB3bl5dXFxdX2BfX2RiYmNjYmBfXlpbWlpdWlpaWlxlbm9oZmdpa25xga25sLWupqSnp5qgpaGanKWrrqSooqyqrauwpKafqq21trG9ua+3r6muuLS0vLi0vK+4ubWyvMGywK6lqaOrsbKzqL2qq6irra20s6aorqGkr6mypqeorqaot6yxsre6uryxvL2+vsS/tcLBx8i3v8DFt8TDv7u/xMK+xMjMyr++xMDAqYdzdHJqaV1hb2NXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QjuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvByr67yba9w766yrfBw8G0tbu1sK60u62nqpFpaYeEh4uAe31/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXl1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqaWrpaCboaWUnqWbmJGho6qjo6CmpailraCdnKSmrLKwtrensKyoqrSrtLqxtrautrmysLq6sbaloKSgprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6SgobGtrayytLO0sLW8trvBwLK6vsPBsrm5w7PBvb+1uLy9v7zCx8TDw77AxKCDeHBsYmZfa29gVVleSE5nT1RHRUtGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbagnpWdoaa6tquzs7uzxM/Jy8LGuLbHwMy/uMm3u8W4s8S4s77Aq7W7saukrrOtn6GQZ2yGhoaAfHl1c29tamppcGleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4edqaCXlZqhlpyjmZaNn6Gjp5ygoKSmoqeem6Kbn6uwrbG2o6mqqqyspLS5rbewrLO1rrO1rrCqn56fpKKypKapuK2ipqagqKyrmZ+gnpmdn6WamaOcm52vqaunqqysrbGyuK+4ubuwtry8uquzs7mzvrS2srG2tb+2vsC9w8G7u72XhHpzbF9lXmRkWFRXXUlXXEtQR0lKR0E8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7w8PPvrrHuLi/t7LCtLG7u6u4ubChnqirp5adkGt9hoZ/eHJtb21rYl5hZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dYWFhYWl5iZGRlZmZoaWtxjaidk5SUm5ibopeWkZyioqienJ2lpqKlnKCgm5murq6usqCmoq6rp6K1sbKyrKivsqe6s6a2oKKfnKOhraOiqrWqoqOmnqWmo5aZnpeZm52gmpednZ2craKrp6Skpq2rs7SqtbCzq7K5tK+qr7Kys7izrqmsrrK4sbu2ur2/t7OxlIV5dWZeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzMjGv8W2wcDGzrfAxL2zubmzv7axuLqssbSunpmjqZ+TmY10gISEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanahnJOVkJWXl6CXmZWXoJ6hnZahoamkn56onZyaq6evsKubo6S4qqGgrqi2qqanrbCkuLCkt6Cjm5mZqqahmqy4r6KhpJyin6CTlKGUlpabmJeWl5yVn6qeqaSinaOqqrCuqLSrqqets7Clq66zsbCvrq+mqKiyrbG0sLy0ubeuo5SBeXVkXmFWWVhTUlRLTV5MT0tHR0xMRT1BPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va6dp6ijqrvAvcC5rrS4wczHxcLDvcW4yMuywcLBrby7tbu8tbi5r66vqZuYoKiUkImIf4F9d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2NiY2JjZGZpgZaTloySlJSbmZ2WlpygnJ+WoaCmpqSmp5+dn6agqq+mn6Kkt6ihoaKotKKlqKWwpbGurLSeoZ2VlamhopStsbGfoqOdnpibk4uhlJGTmJiTl5eYl56nnKehopqkpaWrpKWwp6Wjq6utpqmur66rqKqps6amrK+0sa+8tbGvr6CSendyZWFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsXHtsXEssK/xau3t722vbq6tbKrrKeYl56ji4hziYh/d25jYWZpaGZnaWZqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVTVVJVYGBfYGFfYWFjZWqAlJOKkY6Uk5SdlZaXpJmgl52hpaGtpqSko6OinKqrpZqfpbGqoKGdpaueqKGeraypqa6toqKilZijm5yQq6mwnKCin56XmZOKnpGNkpOWkJiYlJyho52koaKVoKKkppujq6WipKqjq66lrrKppqWmprSmqaits7W0ubqvqayejHJxb2BbV1ZWUkdRT0haW09SSlRLU0xFRklEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG+w8issbjBtbvAu7SzqaumlZqbnIiAcoiDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl9fX2JkbY6QhJGHj5GPmpOVk5ybo5yboampq6isp6impJmlr6WVmaWvqqCcmZugnq+anKuzoKWmn6OkoZWTm5aWkqmqrZqcn6Ggm5SQjJmOjJGMkY2WlZCdoqCjnZyjlZugo6GXoqijoqiroKuwpK23paOkoq2tqqirr7O3s761squvmIV0c2hbWVlTVVJFWExRW1hNVE5QTFBRSU5JQj0/P0E/PTc1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc2NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbqytKWpoJaXmJeHenSAdndubWhtbW1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGR+jIGLf4yRipKNl5GXmaKgm6CrqqaurKiwpKman62glZakqaidmJCPmp6ul5ioqpmfnZSloZ6SkZKRk5WnqqWamZmenpaNjIuThomNg4+LkpWRoJ6hpJiVn5WaoaKelJulpaeoqKCxsaaxvKefo6y1q66nsLWwuLXAsa2xq5F+cnNiVlRVTlJKR1ZQUlFMTFdNSkxOUkdNS0FDRkRDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKWxt6qlorGrnaqnqbKxpLbGtLm6s8rFubrBy9DKsba4u73Bw7GvsbettLO6srKhopydl5eUg393a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjoeQipeJlJSYm5meqZugqqalrJ6omqCmnJOPn6Obl5eFhJKbo5CVo52WlpaIopublIuOipCapKeclZWXm5GSh5SOi4GLjYCQipKSkqCaoKKWlJiZlaKmmY2ZpKaopqGgtLKnsrehnKK3rKqtpLKyprW8tayrsaOJeXNtXU5RUUxPQ01OTlBLRk5OSkpOTVFITUpBR0tISEM9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrCkp6SqpaCopqWzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatuq+snpiZnJSTh3uDbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFvc3ZxhYiCiICRhI+LlJGUnqGPm5yjoqSZpZeinJWNh5majHONg36Nl5aGkZqQlI6Oe5mPnYyCiX+JmJ+jnpCTmJaFjYKUfn50io56kIeTkJCdm5qakpaQnY6jo46JmqCho6SborSvrK+tn5iluKamsaGwrpywu6qpr6qZg3dzY1ZNUk9QTkNTTkxRTEJQUUhJTlJNSEpKREpMRkpKPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6alp6ans6eltMG4sLSwycS3ucHOxr2zrLrBq63DraeippKdpratop6OlJWRjn54fmVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdaWxybX+FfHROWHKQg5eHjp2Xi5SRn5idlZSWlY+WiYCTil87V298i5SJgIySjJCGhnOKhZeBeYF7hpOdk4OVjpGQg4Z9k3hxcIWNfYmBkY2Pl5qZk4uQiZ2In5iIh5aemqGgl6euqa2pqJ6WrbOipq2ZrKuYqLOiqa2jk35ybmBbTlNSV0xEVEpQTExGTk9JRUxRTUtPSklMUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaijqrCop7TBubC1sMfCt7O9z7+5r661wqeqxamjnZiDlJuwopmWhZOOioZ9c3VdUExSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRRQkB/lZKSfYmVjYSKjZuOlpWJkoiGlYZ5iX9gSlFueIqRhH2EjYqFf39ufn+UeHV2eISNmW9RjYiKhnt+eJR2Z3eGiH2KiZWLjZGSl4yEioiVhJqMgoSSmpaenZSko6ippaSemrCroaSkkaaqlqKqnKKmqIl1bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foa+hp6ilp6iwraq2vLa3t7PBu7anusi4tqiotbaqsrymnpaOf4mTqJWUiX2Ng4F8d3BuWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlZWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaVxVj4mUiXR/h4F8hYyTgpKai497ho+AdoB4c292cXSNjYF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4B2cnKSd2h1hISEhXuVioiKjYuAf4SLjICUg3yAj5iUnJaRnp2pnp+gnaCppZ+dmIynpJOhoJaenqSAcmhhXF1KV1BSSEpYUk9KTE1SSkpKTFBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppa2ssLKqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjpSBjZuNkH52hXd7dW5uaVlLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g3x4ZneNl5iNj31oeYF2eICJj32EmJKBcoePfHd7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfYmMiIBseXF9cW12j3FocYF+jnBDi4SCg4V/d3d6i4V9jHt1fY6Sj5iKkpqbo5aZnZqdnqGclo2KpJuOnpeOlpiPd29tZWJaWFhVUUpTVVRPUE5QVktOS05PSlFOSE9PTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsa+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZj4WSeoiNiol1cHttdHBpbGpYS0ZHRUFAQ0RJTExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ7fX57dm90c4WCeYF4cHyOjIqUg5aXmJqQkpWXmZedloyDiZ6Ri5KNhpCWf25pbm9uWFZYVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2wo6yqqLWvrqy0v6u8wr+mopmVpJeejYSLlKGhmJiRk4tzjnqAhYuFdG50a3BsZGtqWU5FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxgp4himml0emV/cG1/eouJdoGIhnRsmpF0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcX98aHFxfG6Tjo98c318cXBudW2Cf3d5dWp5iYKIiYSWkpKQi42RlJSOl42AeYiXiIaKhoCQiHZqam9oZVhRWldZWVtNUFVWWVhOSUhFSkpIR0JARkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6e7r6uysMKxu8PHmpaPlJmLjoZ5hJCYlI2QjI+GcYeCdIeMhXpvcnBub2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYmAZ2diam5ybHCDdWlvWHVwjpuSd2x/e31tcW1wgHpzdW5idoN+hoCFkJCKiomRi5GMi46DdXiKjoB+g4B9j3pxcG9rYFtcXlxZWGFfUk5bWlhXTEhKRkpHPkJBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGdpKeer5Wltaqusa7BsrvBxpaQjJSPgIh9boGQkomDioePhXWChGyViId7dHh4bHdud2NpXklQRz5ANzQ0OTs7Oz0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoCEmYSbnGGGqp+di4OQjXp3iH6JiI1zipeQg3pdZHJ0ent3im1oamJ5b4aQgnpugXd0hHpwdHl3a25pXXeHfId8h4ePf4uSl4ONhYyGfXGEf4N9dXd7fIl2cHN0ZWdfW1teVFxnXldRVVhbVUdKSkRMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkpydn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYSLfX2BfnCAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cnyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJKoh4CYmIqbdG18gYaHfY5oZ2h4f26Fh4KFcYSFR2yAd3J5dmhta193fYOIf4iFi3qVnZuJi4iRf3p1i3Z8eG1vd31/c3NybFtdXVtjY1hnZlxVT1BWWVBETEtGTklDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FOR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbmqWtk5q7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnH92hYWKkIiQaWhvg4B0jIeEi3GFgneHf3t2hX1udnVmgJSPhomJh4iHoaqilomOmH96gol6eW9na3h+en5yamReWlpdal1hZmBZT0tOV1JRSFBKRE5HQ0pEQkBEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjICBkY6KmpuknaGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYyLgomNg3+Jf21wal1CQTQtLS8vLi8wMjIzNDc3ODs9P0JESEpOUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdmo+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6Gfk5iShIuFj5mRlmxwdYmLgpaMjY93j4RxbYWBipaRg4WIcoihloeTiY6PlqW1qZuNlaKDh5ODfX9ramt8gIGBc2FdY15aZmtcbGteV0tHT1NRTk1MRklQQ0RNRkFDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpeWmpWenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioSYkpGCgICLjYmFkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NFTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2cqKWimaGXopWdn6ieqKugqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiZWimpp4en6UmJKhkpaYgZSee3eVkquziI2Xn32UnZyOk5aZpKKmtrCdkZmoiJaPjYGIbHNyfH98cWhgXGBeYmdjYGhnW1JFSktQT0lKTEZGTUNITEZGQ0JHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYyKhJKFg4aJgYCGd19iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQU1RUlNQUlNVUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2GkHeVi6OnqrS9uKSurKynqLSrsLaysq27sbO+nLPDrLvJy7fDv7ilo7CyrK2qo4uWmIWmpqCjl4GmmY2iqqikiIWUpKGgqqGkqY+csYuVo6e3u5ugo7CTop2jnpGkoquvrbO1opSkqoiZiZKKlXl6foV+Z2BoXGViXWRjX2ZmX1pPQ0lIVE9GSExGSkdFRkhBS0ZDRkdBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRj4OFgIuFhoeShoKEiYaIh4dxbmFARTY0PDIvMTEwLSwrLTEuLTM/REFNVVFSU1VVV1VOW1BHR0U8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrHBx8Oqs8W2rLO/s7i+tr+0wba7u6S4xqi2yce1vrm0qKO0rbGxm5mSmp+JqK+rpZR2n6SXoauxs5mWqq2orra7srqsr7Wisayxtby3ta61oKeno6iaqbCtsrq4uKebtqmMpY6Rk5+GeIKDdVlhZFZlYWFjYGFmX1tUSkRFTFVRSElKRElHRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRY2RXeXVxgZR9hYeTdoV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk42HhIGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtKQUA+R0tGRUQ7PkA3RDc/QkpKRUZXVFBej6Wuo7G0w7a4wczJtrvEvbOzwLe3wbW/sLd0sbOmusWksMa5sbOxtKiktbaqsaChlpuikqWwrqatq6ekmKCss7qiqbK6tLu+zL/Fxb29s8K3uri/t7q3uayssKaxqq2+sL27wsKsmbqolK6Pl5eriX2CfGpXYmFYamVqZVdbZFlWVElHR0xRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlVWnZqcH+PhIGOhG56c3mHYrihmaOJlZOWk5OTjZCWkoeGe4aBjZaKgYSBinp8i4eGfIqDgYqDlX14enVlT1xkR0VMOlFjYVteU0Y/O0hQRFpjUVFZWFpnWVRgYE1TT0VBP0lKSEVGQUBDPEU2Qj5IR0pMU1pUXZOvuLW6ucm/ur3JzLu8wby3tbu7t720urHGYXWypbGanqq9qqWoq6qjorK1oauonpWWn5ifrqWnpqWfo5SiprG0p7KyvbbBvdPJytPGwsXLwcrDwL69v7u8t7Swube2w7rFvcPIsJ65qqKrjqWotomAf3FfYWJdV2FfaGZSWGFWUlVJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbGxxkI2FkHNscnJziNXAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWin+DgIN4e4uDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1fbl9YZ2VVWVRKREFLS0hGSUhIR0JJOUQ/SEtUVFZcWluSucC5vbfGwLq4ysu6t7q2uLmyuLW0rra2mWR1qJytcF6hrZyYoKKbpJ6rpZSgn5CUjpaYl6ifpZ+empqEpJ2spaqwrLewvbnU0c/Xz8nM0czPzsrGwL/Cyr3BvMHAxMTFyr/IzrSku7C0r5urubyaf3lsXV9cWF1gWWNjUVxgU1BLQ0JFR0U8QEU+QkhCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkJRvbG91dYezrKGhn4uZnJmMjZWRm5KFiop+iIeMkIuJfIGEc3uKg4V7iXSBiYaVf3N7eGttdXtocmVpbGlmamloYGZpaGxabnSXraS8iIdnW29oXVpZVEhLTk9KS1FLVFFITEFKR0tQX15iZmlhl7fHsLmzu761scTHtbC5sLC7q7Oxp6q3rI22p52bp5pPmp2MjqCWkaaYpZWKk5OJkImPkZGem6GXmpWWh56appusr6ivp7O01NTU1tLLz9TVztPPzcXCydC/ysnKydLHzM3C0NK4sMO8xLmltrrEooJuY1xcXVhgV1hmWlFdV09PQkJIRUJJO0FEPkFHPz9CNztDPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiCaHFveXmDoKqeppeNm5uXi46VkZqOfYmLhY6KiouQh3yEgnB/iIGGe4dyg5KLj35xeHVrcXh+cXtteHNsaYFwbWNpbnB4aXd8fsu/wt+nbWN4bmNbYWBKUFJVTlleUF5dTVBOVFFVVVxubnaCcpetuKy0p7C2q6y8wLGrtaaluKesrqGrtKOOsa6amJiMkZORhI6bgY2nkpyJg4uEiomEi4OTlZiXk5uRnJiZmZ6eq6ykp6Gsrc/S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxcDOx8fDqL630J56bmVdYlxWYFJdW09QVFBOSD5BRkFCRTxAQj5FRD5APzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd2x3cH1+f6GenqGLjZmTk4yMk4+WhXmFj5CNi4qIkYd/gntyfoCBh3mEdYWTkYl/b3Zya3N8e3d8c4F3cWuAc3Job3F6eXJ7vsubfoyyg3ZyhHZoYWpdQ1paW1dmZFhla1NYXV1gZF5jeHt+i4GZqqSkoaChqKaqsLiqpbSjoa2io62ip7GfiaaalJKRiZGOiIGUiWuVoo2ZhICFfZGDg5OWrYuVjZWZjoWSkJ2Xp7ChoKGkpKjIzs/IwsvR1NHU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzEw8uLc29iYF9YVFlSXFBKR0lJSkA7OjtFQkQ8QkQ+SEI/QkM7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuWiY+KiI6Hj394hJSZio2IiIuJfoN4dHt9g4d3f3qHkZaAg254cG11f3Z4fnSFfHlth3Z0bn12hHV5e522jTxBi8alfo18aWVWSUNmY2VjaGpkb3hbX2Zpa25pboCDiZGLnZ6gnZCXmJ+jpKaypKSzoKGlnqGpoKKxnIaekpKSkIuOi4aDkIR+nJuMjYOEhXqUfoKplaOMkoqXkot9l4qakaqzmJqbp5ynvcPGubbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydra0tW/y8y0eHZuZF1ZUlVQWlZGR0pKRUU9Ojc5QEFCOkhEQEVDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgod8eIWWl4iPg4eFh3qEeXF6e4SGdXqFjo2deoxwfG9ven9xfIFxg4eBbo56dXd9fIJ1f3yHiLB0WanCtoySgnBuYj1eaHJwcXBueHeBZWlvcnV4cnuLh46UkpuVoJWHjJOboJufqp+grZyimpmfpZ6frJmLmoyRkY2EfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yOlIyGe5uIk4+uqpSVl56Yp661vamtvcbLyMnLy8/Iw9HK1NbY19jX1NvX09nb1s/b2tHWydTLlXl7aGhbWVBSU15IQ0VJST5BPj03Oj0/Oz5IPT9BQUFEQD4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKChH6EfHyEl46Hi36GhoB3gnlue3uHgXV6kp6NoHaPdYJ0dYF9dICEb4GPgm+ShHR8gYV6doZ8ibfGpcLJt4GWm493cGVOZmOBeoF3hqKQi3h5d3uDf3yEdm2TlpSVj5iQg4qPlpqXl6acl6CXn5OSl6OdmauWkZCKjZGCjIWJiIGFkJGenJmJhYuBhph6iYmfl4+IjoqLgnyhiZCLvKGYk5eZnKmmpq6fqLW+wMC5x8nNzsXNytHW1tXZ1dfb1NfZ2tvX29rZ2M7cxoZ6eWdoZWBUV1ZVTUtETkM7PD08OTo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqLfH6Af4B9hXt+gZGJhIV6hIh7dX10bnx9hn50fpKekZ+DknyGfniOfXmKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLyMnKOcfYmEfYlzjIp+c6aanJiUhXuPkImEaEdwoKSdjIuQkoWJi5CSlY+dmpOVkZeNjJWfnZShlJKOjZCLfpCOjouEiJKWmp+fiYyUkp6RgouAppmIhI6DhoSApYaKi7iYnZKVlqKnoZ2enaOutrq1q7/GytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld4eHdraWRXYFtUUE9IRE1CPT0+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgI6KcXJ5int6f31/fIh6fHuLh4J+dYOGeXN6c22BfoV9d4WboZuelJKAi4h/mIeAnJJuh6iFeqCLfJGOg4iEnH6akYqNo6KfkKSuoIuRi4WLgZKGV3Kti5+rnI+DmJuQkI5cgqKRgoyfk5WMh4iMkpOMlJSUkIyPioiWm52PlZaRi5KUhoCLiJKNiYqclpmjo4aSnZahi4qIjpyQg4iPgIOHhaSGjJCzmJ2SlJehoZ+Zkpyep7G4rKW8wsfNx8bPzM/MztfP0dSu1tXY2tja2tfW2dqfb3x0Z2dcXVhTV1hDQElEPj4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE5Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhtYn6Sg25td4t4eX96gXyGfHt3hoR/c3CFgnp1dnZ0hIOFfX+SpqOfpaKWiZ2PlJeLiqiXcoqyjYSnkYSZk4WZi6KWoJiTiZudoZKpr5+RlZCNjYiVi26Nt4WaxMiynKGlm5yYlpGykWSkzceWj4WHiZCSjY2TlIqFioqGlpqbj5CUk4aVl4R/j4uZiI2QqpeXpKOImZ6Wm4mPiJeXioSPjYF/h4+liY2TqZqXk5aZoZifmZOdm6OztKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgnJ/aGNfXV5OSlRaQkFHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo+OkVNRkhSV1NSQmOBRnWBjn18bX6IeHp+eoGBg352doCDfGxui395fHh4fISHi32Ko7Ono6qzoZann6WklpWuooOQuJWSs5mNoaCMpZuvo6SdmJCnlqeZra+kl5WWlJCLmJmWoMCOpMm4q5uipq2YkZudsp2GhaiinJiFiImOlY2Lk4+IgYaHiJOYlIyLk5OGlJiGhJGQnHSRmbOWl6WhiJyZk4+KkIuXmomKlo6GfYyYnomQkJyamZOYmJ+UoJ2Vn5uhsa6ipLe+tMXHxL3Dw7/GzcrJ0qfOzdPS0NbY09DYu3J5dlxgVV9XUEhJTkVCQ0U1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY2PTpKRkRHTltcWUlmYDtIhIt6e26Fhnp8hHiAhYF+cHh8fX1vc416fYF7eIaLiYaDkqe7rKiyva+lrbOzqKOisKyKmrSeo7ikla2klqmtt6ako5+ZqZipo6+wqpqZnJSVkZefl5m7u63JoWm2uKuwlJieo6uTl76jXqqygomKjZSHkXyOjn2Dho6PlJWIh5OXjJCVjYuMl5iSnZm0l5arnoublJKNkJKMmZuKkp6Qi4mVoKGNlI2Ymp2Tm5ielKGglJydpa+ooaWzuKvCyMS1ur27xcfIwtGhxsnNzcTX1tHL06FwemhdWVNeUk9GRD48Q0FBOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlR2JgYnBJQIuKfoFzhod9gYh1goqDf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7TBvLStq7O3jKiyrq68qpu7pKitubirpqaioaOjqK+ysaudnKSYm5iXnqKlpZKjua6owLusrbK5paSnfYiHnKy9sIOMjIuQg4+DkY96gYeQjI6ciIePmI2LlZeUkJqWnaeasZqRrJ2Omo+SjpSQkJaXjpGgkYmVm6OslJaPlJyelKCdm5igoZSanqempKKksLKmwcfDr7C6tsXEwr7Np8fDx8O81dHNxMqIdHNiXFlfW01KQkxARUc/QT9COzo0PkE8PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZkZgaWdaXVuTjIyIe4eLhoOMdYaQioFvfnyCf3F+gXqVepGUlJiQk5WntMbJv8LMwcO5x7y6r6u5u5eytrqywK6lwKSrr7u8qq2roqKdp6qutLCqm5+qm6GblZ+wtKeLorq6tcG7q6mcsqWkqJSFjqrDxKSCi4+HiISGlZSNeoOMkY6RoYyMlJKPiZefl5OZlZimoK+djKqcjpaPkpGUlY2QlZGPoZSGl5+gsp6UmpSgoZmkn5qgnKCUmJ6mpKampK+tpcDEw66ot7XJw762zrLEvsS8s9HKyMK1dHltXFhcaVNMSERMS0tKQUE9Q0Q8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpNZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KCkHmNoZaompqYur7IyMrB0snKwsy8wbOtu76nur+9vMS3rMGprLK7vaqwqaOlo6yts622taCfr56lopijtLypm6i8waO2tq+rkrCtq6yXhpqqpqWRgoyTpZWJgHWKknqFjZGQnp+Tj5SLkI2Uo5mXnJWUo5+qn5GlmoyPj5CVloh8j5WSkqOblaCinLWmkJ6XpaSjpZ6eppielZebpaOop6KyrKi8wMSvpbO3zMC5rsSzu77CuKzCw8LAmG15YVhXXFtLS01KRkRESUJCQUNLOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY2Xjp6SiYp/iZ+ThHeFf5V/f5CIipB/laGarqajmMK9yMPHxdPNzs3Lu8G3r7q8tLzLvMPBtba8rbO/ubyur6igqKe2ra2psbeanq2ip6Gdq7e3qaWvvsOxvbmzp6q1s62ulpalrKigkY6SscWnlY58kZV9iJGZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjZCPnohakJaXkpalmWWYo56ypZailqysq6ebnqaXmJeYlaGkqKaftqupurzEtaW0tcvBuKm2rLK6uK6ouLq9uINsblpXVFVORkpTTks/QUdEREhGRzk1Rk07Pjc+QUouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJxRmlJUmViTEallJyWoZeplo2Qg4emk4iBh4KchIOVkJCUjpqin6++rqHGvcXExsbOzs7Syr67tbG6u7y+z7bEvbe5t7KxtbO4s6ymnKuruKqop6+wl6OvpKekpLTAsKqstL7CucC5s6e5tbiyrpWlra+upYuTlaGNdMGafpeZhY+WmoyxlZqZlZOTmZmlo5Wfm5aaqZ2coaCai42Qlp1gSpacmpWapZZUlrCfr5yfpZSvrqymmqCllJOZmY6cn6eimbSpqrO8vLursLLHwLilq6utsbGjobKytKRxbmZcWk5QS0RQUFBRO0dKSUdIQkQ+OUtVP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UUVXUnNiV0ZIqpeZoKKor5mRl4eLp5aOiJKFn4eEnZePnqCao6S1yLSpxrrDw8fKyMjMzca+urOuubjBwc22yLrBuLW6sa+usrSno5uqs7SqqKatrJmkrqWkqKy6v6irtre/wb++uLKyw7G5vayjrrWsuqaInJimm3a/oIWZnY6TmZqLr5ehnJuXlZufoameqKCZmqqaoqeemJCNkZ2DbnaSopqVnaKekK2yo6uVqKqXqq6lpJ+lqZOSmZyIlJyinpaxpqmrura+s7Ktvrm2oKOnqKWnnJysqamMY2VhX1JLTUdITklVTD1MRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauUnKGfu6+ZlJ+Lk6qbkZKTiauNh6KfjKStlKOjtsa9tMG6wsLHyMXCzcjCvbmyr7m0wcLKtcaxwby0uquoraywo6KZqrS6pqmmq6qdqK+no6qqvrynrLyzt73GvLe1uMCxvcCzqbW3q7+lj6OYkaKgvJ+JmqCZl56ej7efqZylo5ucoZqopbOhm52mnKiqnpmVj5Sbi5eJjKWilJ2inqC0r6Wlk7Crmausnp6jo6mRlZWgg5CenpyVqaSiobS0urWtqLWys56coqWal5WZqqGed2BcX11KSEZHTVFJTUVGRkJSTEpBRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Wnl6Sfn8Osm5ekl5mpnJaamo+qlpaoppWtrZmhq7bEwru+t8HCwMfEvs3Hu725sq+4s7/DyLW/r7y2ubemo6qsraCgmqqqxKGkqKumnquvrKKpqL+4pq29sLe2x7a1ubi/sb/BtrSztK++o5ekl5SclK6gkaGipaOjn5C+pamdqKydnaGbpp+9opmjn6Kpq6Gdlo2VnpOeh4+FjZOepKCdtaymnJWyp5mvqJ+aqZ6gjZmVn4SOoZqbk6WkmpissbaxqqWqraycmKCgko6QlqielGhiWWFdTklHSk5LSEVESUE9UElBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlY1dMopqjnJ7FrKGfrJ2drqCTo5+XpaCnqauXtrGjqrK1xMO9wLa/wrvIwr7KyLa4tbSws7O3wca2vrC4tLm1n6asqqudnZ6lo8GloKmtn6Spra+ipqe9tqaxvLe2tcOys7e5vrLDwLe4rrO1taOdpZaSlKGuoJminamoq6Oaw62pnqytm5uemaagvaKdpZirq6ymoZmNmp+SnomOV3+WnqWhoLiqp5OYtqOfsqGgm66Wno6ZlJ2Cjp+XlY6ipJWQpq2yq6mhoqWllZWcmIuPkZOknolhZFpjYExISkpORkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxLTp6foZmew6elorOhnLOnk6qkoKSframsnbuwqKy1scfEwcKzwsO8xsO8xMq9r7G2rbC0r7/FtbmxsLm1rJqosKmpmp2loafCrJussZuqoq6wqaSnvbemt7q8rrbDrbOzwr+yxrO6t6y0tq2qoqaWlZWkrKKfn5qoq7Cvr7yypqCpqZmZmJOipLigoaSTr6+spaefkqGelZ6PkI2VnZqin6e0pqeNmLSco6+anpuukJ6Tl5SagJKhlY+On6GTi6assKWmoZygnpKSmpOFi5KNnJ5/YWVbZ2VKSUxKUkFDQElHOztHPzk5Tk1VXlJTSj5PXl09SFBCTExJOU1jXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMOopKqyoaS1qZWyrKeipLKsrqm7sqywtbTGv8TEtcDEvcnEtcDIwrWrtaiwuKzAxLS3rqy2uaWZq7Grqpifppetu7SbqLCbrZ+utLKnqrqzp7qzt7K4wKq3ssK8tMWnvq6tt7WqqKyhl5eSpqWio5iYpa+4rrK1tqCfqKSZlZWTpKC3oqWmlq6ysqaqpqGem5qalpion6CYoZ6vsqKmjZeumaWrl5qdpJGbjpOXmYWWn5SMkJyelIupqaqip6CYnZSMjpmQgoaWiZSfeGNoXWtqTVBNTlQ9Q0FOQzo6SUA3N1FPXV5SVlFBV2BcQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SnBpVkNXRox5ZkM7pKSdoaa/pqivr6GptaqdubCro6q0t7Gwubevtri4xb3Dx728w8HGwLjBxsG6qrakrbutwcO4uKqtsbuila2wrbKWpaeQqrmpoKewnaqgsLSyqqm2tay8rLKyubesubDCur2+psOrsLevqaurp56YmauioqCRmKGxr7OrsbqbnKmgmZaSl6aht6mlo6KvsbSrsqirn5ugoJuepZyilp2js7Can5CTpZqgqJqVoZ6VmImUmJOWl5yTiJCbmZSOqainn6Obl5qSho6Zi36NloWPm2pobGFsbldQUVpUQUNFVEA7O0lBNzpYUGReUFZXRFleXU1MUk5eS0o+WmReTkhQTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGqr6ujsbippbWzrKGttb2us7i8ur22tsDCv8nEucTBwMC4xL3Bt6+1qKu3sry/v7SprrG2nperraitlqeojqe7n6Sts56rorGws6yptrS1va2vsbWssLWxwLrEt6u8r7G4q62qo7GmnqWqoKSXkJmfs6qzqquzmp2nm5qVjaCmpLSup6Ktra6xp7OtsqmknJ+opJ6VoZibqLWpl5mSkp+ZnqCekKuel5eFlZiLnZmck4qNlpeal6aloqCdlZWWk4CPlIV7j5KDjJZlbHJncHJfRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV009RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVTE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmaCkrLekrKmmrq62qa+0uqemsLfFt7G2vsDBtbS6xb7MxbnCv7q/ucS4wbmytayqura7ub20qq2wtZiYp6uqq5usq46rvZ6rrrGjq6CxrbOurraxubepra6xqLWvs7u8ybKqtbSxtK+up6GzoJqoraCllZaamrKjraCmr5ahpJqako2ipaeyqaKnsqyqtqWvsbWvpJmdraeamJ+Zmay4o5eTkI+YnKGYl5SrnpyTgJOYjZ2cmpaRipSTnpqloaGgmJWRk5V6i5CFe4yKg4uSa254bnV7YEVhallJSFlbPXtKR0U2QWJUaVtNXGBKW11aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDXlFcLipCL0pHUFtIM2NZVUtEmZagsKiyqa2lpK6utam3tLikq7S3ybu0urq/vrS0t8PAzMi7w7y2vr7AuL+8sb2up7q5t7bBtqutsbiUl6auq6ejsaqUr7ukrLKyp6ijsrOwsbG1sbizqK6rsae4r7W0w8W2qbS1q7Ctqqejtp+fp7KgpJWbmpWynqecoKqNqaOem5aYpaWlt6eisrSsp7GnrrC1rKWZoKyom5ydm5SpuJyUjo6LmZyil5CYpaCelYORlZCdnJiWlYiXkJebp5yjoJKVkJCWdoSQh3uFgYSNi21xd3V8flxLZWxcS05jXD9ie0dJOEdnV2VbTV5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnRmFMViUtQi49RU1RPDNya0pEQ5CZpa6lra6rp6SwsrOqt7C2n6u1ucm5rsG8wrezsbXCw87Fv8G9tL2/v7q/vLPEqKm5sLa2v7yvq7OynKCnsK2lpbClnrK1rKuysKypqLS5rLSytay0ramsqKupua2xsce/uKS5r6mtraaorbCmpKSuo6mcnpybsJqio6OjkayepKCfoqqmprmlrLW1paqrqKyvtq+jnqOoqpugmpqSpLSaj4mNh5GioJWNlJ2fk5KEjpKSnZuYlZSHmJOVmaabn5+MkpCNkHd+joV8fH2HiolxdHJ+fX1cU2RvXk5aZl1GRJZbSDtObVhhW01gYk5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhkSEorOkk/M0JJUyw+j2s9SEiPm6qqoqqwpKiks7SxtLWxsaGrrb3Luq7Au8extK20wsLRxcW+wLK+wcK8v7e8xKest6yzuLvAsKuyraCkp62pqKSwo6qxqq+ssK6urayzu6e2sLKpsqmrpaWjrbqsqrHCubWruaioqKyqqLGlqqSirqqoop6co6yVpJ2YnpmsnaKnqaKtpqOtrLixsqGpoqCrrrCsnp+nqKmZpJiZj6CnmIaDj4qLn6CPi4yWm46OhYeQlaCdlpeVhpaTk5eknJ2cipGPjYl/foiGfHd/h4WGdHNxiXZsX1lgbmNRc3FcSzuEfEY+V3VYYVlOY1tOVVZVV1BcYl5TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5JZ0RGODxCMDVFS1gxQJRbPk1GlJetp6Kqspypqa+2rLi1rqqlq6q9yLuwvbfCr7Css8TDzs7Dvr+0wMLEusG0ycSsr7etsri/vrOtrqulp6qwqaeosaW0rquwrq2xr7Kts7ukuLOsrK6nq5+inrC3q6qturaltbWjqaesrKqtoamnprGypKamoaGslqqhlJugpp6koqukraOfp7G3ra2jpaKbqaquqZ2ipaSkmKCZlo+YnZOBgpCJhZygjIqOjJmNkIuDjJejm5KQm4yTkpGUopmbmYqOiop8hoGCg3p0gISCfnR3i6SIeWteYG5nV2WHZE5AZ5JMRGJ5V2JYUmVUTVZVVVRPXF1hVUtNaVdVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGQEhIRJaSr6SjqrCYq6mttau2saulrKqpvMDAuLizu7Wlsq/EycvRv8G7ucC/wrnBusHErrK1sbO7wL6zsa6sq6uotqqlra+rubCosbGvsau1qra1p7S2rKykqaqco56zs6iopLS0oLWtoamoq6irp6Crq6i5tqmqqqqiqaCtm5KpoZ2gpKKmo6qenaa1rqimqqKjl6Wnp6qcoqSjn5mYn5GOj5mOfoeMh4SenoeEioqOjZCMhIaVopqOjJqRkpGPkp+XmJaLioN/dIaBf394dYN/e3h+gIidj29xZ2dxeFxgc4hqT12YVkhteFVkVlJiUE1VVFVQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUWMwMj9mPU5YP0MsPkxUXy9JazdQRTuVjrCgpaqtmaulrK6ztK+qpa+pqLq+vMCwrriuobWvycfI0cC+vbu8wr26w8G/v66ysrG1vLzCsbKzqrOopLWppa2zs7mwo662sa+yuqu5rqqutauqnqmrn6Kgtq2ooZ+vs6G0qp6op6qjqqGirK2ova6srq2hp6ifq5mQr6GYoqGop5+om5mqsKmjn6yioZOio6OnmJqopZeXmZ2PioeViH2NhoWEpJaFgoKLho6NkISEk6CWiJGdkJOQjZGclJePiYWFeHSBf311eHmAe3R0emmBhqN1aV5lbIJ1Z4iLfFJYcF5KeHNTZFNRXk1NUllmTkxWWWVZRlNpUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsMExoOjQ4Xz1hZD9GMUNQW1srSE86VkI0kI+xoKSmq6OmpKymtLOxqqSwp6q4vsG7r6e5qqeusMnGyNHCvL++ub6/vMm8wbiwsLSxuru4wLKzu6y4rKK0pqessra5s6enu7Wttr2wvKatrLWrrZypr6Ofpayqp5yeqrOks6iaqqeppKmdo6mnqb2qs6+unamkoK6cm7KjlaScpKWfpJqaqKulnpuqoZuSm6GlnZiXqamRmJqTkIqCj4V+j4KAiJ6Phn99i4eQjo+Ef5Obk4WTooyUkouRm5KVh4h+f3F6eX58aXd8enVxcX1ohniEh2RgaGNyhXptZ3ldXlZCV3ptVGFPUlhLTE5xdF1IWltnWUVVZlBEPkpORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj07RVo/Ko+UsZmfn6mlpKGrpLeysqWosaesuMG9tbCjua2oqLDDycnMwba9v7W3v7rItsO1tLO1sb24ur62rbm1v62hs6aqq7C1uLSrnry8qLLAs7qgr7O1qqyerrCjnKWoqaKenKWxpq+gn6qpqKKpm6SooK27p62wrqGro6Sunp6tppefm6GjnJ+bmqOqopqapKSVlpSfopablqasi56RkJGMgouBgI+Be5qVjYl8fouGjo2LioSSmJGHlKOJkpKHkJqPk4GHfHlrfXZ5eGJ7enFwcXN4aYFzaoNnZGhhb3ONbWJpcGBwQVx4a1ZeTlFRSkpNU1lWTV1ebVdEWGBPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQwQmhZMTNTPWVfREw2S1dlTyo8MlBbPSOSmayZn5enpKKfp6O4r66ir6+pq7jCurOtn7mvq6i0usfKyL+3wb6vtL63xLbDsa+6srLAtbu+t6m5t72rpLSnqKqwrrmxqpu7vaSwwLW0oa63taanp7GzoJ6kpqehpZmeraeonqCprqegppejqKCwuJ+isa+hrKGspJymp6mampufo5WdnJqdqaaWm5+okpiTmJ2SmZahqpCaiY6Qh32If4KOfXyhjY2IeYOMhYmMjIWHkpqOiZWfiZGVgouXjJF9hHtzb31xc3RgeXhpb3Bxb2p/cmN6bGlmZGFmhn9gW3Jqck1Nf2lYWk1QTEpIUFJRSU5cX25TRFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaaEgqPi9aWTUol52lmJyWraCfoaSht6uxpLS0qai5xLWyrqC3rK6tsLXGyMC3v8G5sLS9t7+7v6+rvbC0v7G9w7mpu7q3p6i1qKersK2zsaeavbekrby2r5+xt7CopaevsZugpKCjpKGXm6+moZ+ip6+ioKKTpKSjt7ChprGrn6yjr5icqqWpnpeanaWTm5yanaaqmZycpJWVl5WcjpOXo6mhkImKkIZ6hH6EinqPl4qNhnmCh4SIi46FjZOYjI6WmYqPln6Gl4uPeoB6cHJ3bm90X3h3ZGxsbGpphG1lcmlrZmldZHOAX1prdWlaSX1eW1hPT0pISFJVRjI5X15sUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKjsrMTM5Y2w4NEdBZltIVERVXWhFLjsyYlUsMpajoZeUnKqdpaGioLeqrqC6uKasvcWzr66ita+sra+0w8S8s7+6t7Czubi6uLuurcCztLivv8G4rLy6taais6qnqbOrrbKinMG2pai1tamesruqp6apr6yZoqeco6aUmKKypJmfpKipnKKgk6WgpLmopKeup56loaiSn6mioaCZm52gkpuclqChq5ubmaGUkZSWmo6Uk6OopJCIio+GeYR8hYZ9nY2Ki4Z5gISHiIeRhZWTkoyQlZSNjpR7g5iPi3d+e2x0cmxsc2F4dGhoamdmb4VnZ2hjZmlqYGliaWZaZXtjYFNzVFtbU0xJR0lPU0AhKmleakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OWVPJzKepKORjqSnm56enaO1rKequbenrMPBtrCsorWup6+vt8DAvLLBtrGusra2uLe2rKq9s6+ysb2/t667u7GlnrarpaW0qauuoJ/Cq6ilsLOqrLW7naiqq7GlmJ2qnqakkZmmraKYnqSpoZyinZegnae2pq+qrqGhnp2hlaCmn6GgmZuZnJKZnZSlnayimJeelJONlZeMj5iaqaCRiImLiXmFd4KCgp2Hi4KJfH+EiIaEkISWlY+OkJGRkY2Te4OVjoZyfX1meG9ramxndXNrY2dkZHV/YWRmZmVqamNqcVleWF5tZGFOaFdaYFZJR0hLTVJYPjlgbGlHQlRTXFtJSUdFQS48PzlBODlSR0A3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0FmSCU1m6SfkIytoZmYoJaktLGisb23obHGu7mwsaO3rKquqbm9u7utwLKvrq22r7O4s6irubGvrrS2u7avuL2tpp21q6ChsKWrrp6kwqCypK6xr7ettZ6tr62uopmdqKqlnpWbqKWfmaWjqJ2aoJyUnJ2tsKa5qK6joZqanpmeo5qknZeemJuUmqCSqJWqp5uTm5ySjJWZjZSUmainjY2KiY98gnSCgYuYhYd8iYmEhIqMiJKEk5ySko+QkZaOkH+AjI2Db4B/ZnluaGtqZ3Fya1xoY2Jyf2FlaGpubGdqaWZsXGxtdXFhVGJoZGVZSUZMTU9YUVFWYWWBVEBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFJZUMnNJOimo6OsJ2ak6GaqbKwn7jAtqC0wru9ubGltq+orqW3uLe3rLuvraqrt6q0ua6ls7WxrqmxtrawsrW6p6iftqmenqmiqq2cqcCZraSusLa1ra2fsa2wqqKbnKOsqJuVnKejnZqpoqSWmqCckZujq6qpu5+opKCYmpmeoY9ropaYnHGClpukgHaRqaeelZWfkYmXmYCWiqCPeYaUjYNuan53g3FshouGfYSLhm9eY2BnhJeGa4uQlJN1d4uEfoOPf2aGgGh1aWZXXGlzbk5QamNmcYRnX2RmbmxpXl9fiZCEhmdPS0Q4RVRnXkpHUFBVVUtIU2FvdGVGW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUGQ9Ky+NpJmHlbCbnJOgm6quq6O9xa+pt8K4vbytprawpaukuLOys7C5raqnrLSmsLWjqLi2tainrLayrrSts6Kpn7SrnqKknKeomqy7laalr7O4ra6lqK6rrKWhnpygp6abmKGmpZubp6edk56gmZCeqKqjtbCjo6OdlpeYl6OIoY6Smoehh5SdoX+lf6aqnpKSm5KIhHJ4jY6EiKF2iI1pl4hmfXN4oW+Ih4R+jXt/oaCfmYB7h550iI52m4psh4GDbWhlY3pscWJUhm1jbGmYcVhqb26GWF5pW2tqW4hwbXlyhmiHhFpeRk4+Rl5NRVJWVlFRUldUZ15MWEpSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8ojKaXg5ysnZmZnZ+qqqepv8Ousbq8t8C+qqS3sKmsprK1rq+ztquppbGtpbWznK21trSmp6mzsa2yp6+fqqCyqJ+ko5qho5yutZWkpaa2vaasp6qqrKimoqCYoKejmZmmo6SYnKSplpSinJWTo6WmoLekpKCjmJWTmJOciK6PmJSJqYuXopuFsYCkrJyTmZ2VeYLUqH+HlMGbx3l3saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHqBbJaxq7B5aGtYsa5vZWm8krxuaHltco/YflNqY7ayf4FxlHWaoaqQV09XYU9WTkZUW1hRUFKMXFdcUEBdRVFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFcXTQxIY2mk4GmqZ+XnJ2lrLKosMK9srXAtbe+wqumtK2tqaevs6qvtrSoqKa1pqe4r52zsraqpaSnsa6tsaaqnqeksaSioZ6Xm6Cer62VnqKftLqiqqihra6lop2bmqKon5ibqKCfmJ6np5Gcp5uUnaGnoqCwo5+fo5aWk5iSmYWvamqKjap+Z4SVh61lcZ2clJmllXGuoaR+d7t8a6GPdrFfarRbpYBmnJFgZoF6Zn9qeGqpZb5yZ6aMdrJqfLF4dJKTY21tp21bhKBFaWeHlkV1nGB9Z3ukp4JZX4uraYGVeHpqpzdKr1tXVGxjW0tOV19cV1Y7TohPV1YvSVRUSkRFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuRopWCrKelnqOkqbG3rLO9vrC3xLK4usKnqbCrr6mpsK+ksLqwpKWus6Opuames7Kwo6Wgqq2vq6+mp5+jorCco5yYlZebnK2ml5uhnrSzoauboq2toJ6Zl6CiqZyZnqSgnJmhp6SQnaOal6GfrJ+mp6Cbn6GWlZGXkZqFtZu1eIWpmbWZd4ezm7d+k5WVqJR+a4GmeoKFiJKUknerZ2uxW6x7j4eUdIhwj4aAgIiQl3iDgouXjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYp0uUaFuW1RrZ2BMS1tkWFxaQj6weFdYQSNNaUVDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOWFVNTAclZ+UiLOlpqGuqaezrKm7tsKwvMKtuLfBqqytrq6mrrKpoa+8qqGntK2kq7WlprKzp6Oinqiqsqiwp6Wen5+vlp+ZlZWWmJ+topqapKi1r6Gpj6moqpuelZigpaian5yjn5ugo6WjlZufmJqdo6ubppqdm6Kgl5OSk5Ocg9WTmblwsMJ+xoZ81pSbu3yZlaWPjZyNpHuOh6SCpYJ6rHmPnVave4l+n2q5Wrl3hoR9poKTfJh6qnmOnI97sW2OhHSQvIVvlFCvp8WKUaB6Y2CqYnNyh2yXiGBTtbTIhoCJfGOkM0Kddl1RamhjUEBYZlpkYUpITWxLW1NPWWZaQ0Q/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUTcyJZuik5ixp6ils6qltKiku7fBsLrAsbW1vLO1p7Gwo7Czpp+utqibqLmuo6+xoLO0sKCknp+nqbCotKmknJ2eqpeYl5aXlZahq56al6itsKmjn4+soqeWnpecoaWhl6GhoqGboqKnm56hnpWZm6agnKeVnJufoZmQkpWRnYiybmi1cauHb46mcrRzcrZ7mZikjI+cjaJ+kaClfrB2g5HS0XZcrnyGf6Rvm6qma4aFfa19l5mPe7Fzk52OeLNllnSEnm+eZpRSyItawlyfeWJfrV92c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2pfbGlPVUZJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi+hnJGlr6ykqrutprSlp7a7vLK6v7e2tbq6s6W0tKGxsqOfrLCkmKa6rqSxsZ20uKqfpp2iqqSxp6yppJqcmqielZSYmJKSo6igl5OmqrGmopaTrZ+lkpShm6Smn5Sapqahm6OfrZqgnp2QlpyinpyllZ2VmqKflpmWkpuFrHt3qHajjomHqW+tioKng5iZoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXeFf4+dhpmZd6+GipGch3e0YZplmoGClGySWrBYS5p1mHlmYK1edneHZ5iIa16vd5Wej3hsNXnIrrJfQVRvXmdgRVBsX3FtVlVNLmVjaVNZUTpBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjg4n52UoLiwl7TBraizqKmyurizuL+5t7K2vbWluLOftKyfoKirn5WntquosbKrrrSkm6mgoKihtaamqqOZnpWloZSTnJmSlaKlmpOQp6yvpqCVmamfoo+RopmopZ+UmaWonZylnqydoZ2gjZSfm56gmJmclpeioJOYkaadhql9faV4oY+Og6pwrYuBp4aVoKGJl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqY3J7gWuYh3FdrFqJoI5rbmVPSkOhXFpMdF5iZU1aYV9yc19KVTZKmpNZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MDAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE+OKGdmZm+q5e0wq6rramltLC4sbW/ubqzsbe8qru0n7CknqWnp56UqrGpsKq1rKuvoZihoKako7mio6ugl5uRoqCVlJ+alJifoI+NjKmwr6adl5uopp+MkqSXqKqmk5epp56foaOtpKGeoY2UoZifoJKdl5yVnqGVlo+rm4+ubXK0cqmMdoqmc7R4c7OAkaSikpyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWTiK1qdbNhnWaib4eSapdcrWBNoXyHkVJzo2x5f35vmIZwXK9WPJx3ZlRvbi5cp09iUmtlYWxZYlxgcHtjU1lRPj5tcDNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7PDAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjgxQjilmpuduqGbssCuraurp7epuK+0wLW8sa+5uKvBtqmqoJumpKGdkqqqp7ajsqiuqqCXnKegpau5naOtm5aZj6WjlY2doZuZnJ+Rk5Srtq+nmZScrKqXjJOlmaWsoZGXqrKkoJ6oq7CYoaOQmaKXoJuWm5ehk5yqnJSRq5mH1JKau3Oww4DDhn7Vlpu4eIiQl4yYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbpqIcW6NpHS9XXd9W2F5vGtaVltqel5qYGRmYm13b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5qeobyil7HDsK2qqquxp7mvtsSxurKuu7CuwbKspaKeo6Gcm5GqpKqypLSnraSflpqqmaasuJyirpiVoZCloJKNnKOemJ2akJaTr7mwq5WXo6inlJCWpJykrJ2RoKirn5ufqaOznqKljqeilKGanJeVpJiPsKCSlaqehZCZtoCQkYy4lXiCk5u1d25rbnNueY+EjolznsG7vZp7gbKocH90kbiDfIaGi4eNe4qGjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbV0cnB3toxef3l9iWiDeW15YouscHWFf1lbp2pEZFlTZmBjXWNRZ2ZxbHVCTlBMRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz07PKeeoKC/pZa0w7Ssq6esq6m7rrDGr7WzrrentbitqaOipp6gnZmUrKStqqa1qKifm5ago56spL6moauXlJ2QopuSj6KoopOdl5KYlLK1tq2YnaSkoouSkaabpaublqikpZyaoammp6OpoZKtn5ejnpiXl52ej7CplJynoo5qfmmcp3iJc36aj3R6ZYd6vr7Aum6Sg3GUhl9yalpemolhZIeOlWtgf5VjbZx2YpRrf5qVlGVeYGNxm4ppcox9hpVnan5ydHh9fWJbd3SBaFBcboN8e4trWGx6gnJJSm+FcE10TUVXXGZgTFtYZ2NeT1ttdWlxUk9ERU07SEk8TD8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6on6ihwaObtLq2o62lrqeotbGsyKyws6y1o76xsqago6mdo5uamaynrqSktamlm5eVoZunrai+p6mmlZSclaCak5ilqaeRnpCPmJywsr+sm6aep6KJk5Gpmqikmpurn6OZm6OnraKfqqKasJuVpqCXlZ2fnZewpZiiqJmckZ2co6SZp6OanJqampCWgWdtfXF3kZeUkYWKtaqNhpiVjoqMl5eHlJWKg5KTkYmNkZOYlJiXmqCimpyUoZ2OgnqlhWxqfJB8gHSJioFxgnh5dnaKgHuJanOBdIN1Y3d9dmtwe21gY1xwZ01ZWWVqX1dab3ptbWZTT0ZTOU9aTlJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1AsqCzor+ipLGyt6CqpbKnpbC1qsmrrbGltabAqLSgnqSlnKSWlqCrpqyjo7asoJmWlqCXramlwJ6rpJWSnJeemJOUop+eoqeTkZiop7LDr5qrnauej5aWqZ6qnJygrJihmpyipa+moaSonq2Yl6admZqhnp6csKCdoqaVmJOYlKCilqOel6COlpSLio2Olq2PfJWbgpKCi6qohoGYloqEjp+Ie4SQhoWZkIeGiZWOm5eNkJiepJaak5GdjX+NZqGzr4WJhHZ6j4p8dnl6b2d5kIGAiWt1gXmIcmhzf3p2g4iCa3RjeWZgaWRiZGZqWWt7cGlqXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rKuusrKgqqaxraKss7DFsKqto7OuvKS0nKCmoqGdmZeopqmmpKaztZ6VlJ2ZmbCmrr6gq6OQkZ6amZSRlaGcl6mchJ6prKKzyLOfqqSrlpaXmqedqJufpKuUnp+doKquqaWjq6Gtm5+goZmlnpyfna+jmZ+ok5iYnZGlmZipnpqXZoOSfGV+jpmPY3mNbGhrepGkq2tlmph+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKOfmXNsbnqEjId6WGVehYFebIqJgHZcaHN3d5GAh4JueIJ4gHNteYN0d4iIjoN7aoVZXmt0ZF1ziGhqfHFsY11RTVdKZFhASjQ9Rjc/RkQ3MTw9P0FDOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7GqpaitrrCmrq2wvbGpqKStr7GfrZefo56hmpmmq5yso6aoqbKunpWjkKKvpra5pa6jj46aoZmTkpugmZmllnulrKKos8O3pKKnr56elZ6jnqOco6mokZ6hnqCqr6qro6qfqJumn6ihrJahm6WwpJicqpWhnpqTpZieq5mefr6DiHK0coSdhq1oeLnEuHGToqN7ppiZc6qCfMvAwLtxi6KHgp98lZiJnsC9gpadno2dwsF7gXuSjZrDwH1rpbFvjIBvynp/m3eRg46Bd3qBf3lxen+HcXiFjJN5bXaSYmZfeGRfZIBiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqJSjr6mwr62msrWvqqamprGrn6uYmqKgnJuqp6Kdq6KlqKWktKOdopOmray3s6evopKRmp2lkpGgoZecn52Hp6ukq62/wLChqa+pl5KfnaKZoqOqo5KgoZ2era6orKajoqegpaWeramRpJupraqcnaqcrKGWl6WWoaOYnH/OlHl6pIF5lZabX66PXo6ngaKgfKeVm3Srg4CvXmONqXqnh4WgdJeSiLNjgquGoY6Ns2qErnR9loe4YYKtWaPNbo91e9p7f5lwfoiTdn9le4h2dmt9iG5+hZGSfm2BjmBxa3BnYF94ZFtwaGpkZmBSVFJXXktPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3CwL+1tLC4mJ6RpKqorbSrprKsraykq6ewqqCnm5mll5yir5+gnqino6Whn7Csm56Vp66tsauorKCUkpufpZOPn6WXnqijnq6kq7CowMazqKmxrpaSnZyil6Cpqp6UoZ+cna6vp6qpm6enpKGrkq20lqaiq6qeo6emobCgkpqnmqGblJSRl6BwhYyXdYSoh3GxfJ1xrH6hnoGlj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKKMkYudfqt7iZOPn4B7rVacxHqPb5LBfYGVbXVwjG1ldmWGb2F3bnJviYqRkINtkI9kb3R1cGBnbWRfb2lpbmZjV1NcYVpSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSfnaOOo6Ohra+2rqiwp6mqqK6rq6eipJ2ZopWfpqufoqWgqKiin52wrJealqinr6yop6mel5Sao6KSlKGtm52mo6+so6y1qrrNsa2nrqyWlJydopifrqyclqCZnZ6psampqZurqaOirJuvsaKorK6mmaarqqqxopKXo6WblJKFpGqkdYl6qXR6snCCpYmZjHGIoJqHpGBgUqyEf66Dm3augaaGhp96mJaGe2aAo4mkmYaBo32pfoGUh65efKlVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2MmI+BbZqSb215d3dvbGZkZXFwZntoY11XYGpYWFVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNjYqMVBLTCMgQTlENCwnw8nW1cChmauooa+inrC1sK+prKOopqqqq6mkpqCbpJ6dpaemo5ysmqKroaSfr6KdmpKqpLWwr6Cpm52WlKejkJqiqJ+gppyxpqOnsay2yLK1qqyqlZGcnKGZn6WznZqhlJyfp6uro66arKmioaqjs62iqrOxopuqqK+wtqOTlqSnmJuRfKpsnoSHdat5fLBvgqSLiZ+WlZ+UgdK4tLjJgIGyX1+UqYOkiIegeZiVmniqyXSZo5WnqZCSm4x/m4maxsZ4ZaGCpXOBn46Cfa9ecLVjsXVLo4Ztp0eCk2SPkJ6TfHCXkn9wenR8e21bZmpycWaBal5iWWNtXF5ZSU1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC8+LTVPVFEdHDs8RjIsJKekwca5ramzrqylopyyuayqoaabqKaqrKmmoKalmKujn66rnaWgrJqeqKWdprWfopeTqKq2sqybpZ2glZClrZGZnKejoKqnrqKjp6qwtMKys6qtqJOJl5ykmqGjrqaXoZWYnKWmq5qvna2opp6so7esobK5r56br6eztLOllJeno5mfjoKdTniagX+feoSjfIKkhIenn5yek4S4e3x5uYJ+zMbCtniboZGLn32alpeKdp6YiqSYo6h+sIWchZ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpGjl3x+kpGKdHpzhH5wW21ud3JqgW9aZF9obmJkXUtNUVRCSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mprKSruauvoJyhrLOzpp+glaWura6qp52mppqjp6GyrqKoprKgmamklKK1oqOVl6GptLmkm6Odo5OQobKZnpynpqGir66dpKiitbLDsa2qraqRh5CcppyjpJyll56ZmZmlpKiarqGupaaXsKW8raG3t62enrWyubGzp5idr6GjnoaP0bXDt3mHjoWRk4+ApniUoneMoJKEpYGKcaqGhLRucmqZo5uVip98mJmGh49zr4Klm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+Tpph+jIyTind8eY2BbWl4aXhzbn90XWRkbm1maGBKWlhYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklk3ONiq2/v7u6tZ6XqKSttaGjmZWjqaeuqquZpaKfpaCgtaaiqKewo5Sro46kraOdkJqaqrS0pJ2lnamSlJeuoKCep6Scp5y1mqCqo7arw7Cpq6mijISOnKGgpqKVmpucmZqZpqSmmKunraKlm62nvqyVvrCtn6Ows7qstKebqLGkp5h6qJB9fLB3ioGkpYicbbJvoYetfKGPg6iVmICsiIWuhZ+UqaChloafgJmVgHuSfquAnZqWiqp4naCPiZOSgHmvXaOBfKanZJ2AfJd0a69dpWtxhZldYFuMoG6VkaaZg5SNlot6eoKWf2tsf2J9dG1/emBnZXFvaGdoQ1lgWz1LVDJVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWldTUE9OSTcwNTIuKixBVFZWVlVUVVVVVVRUVVRTVFZWV1hWVVVRSEZJSiMoKL2SmoSpxsK3wbSfm62frrilpI6bpKOgr6+qn6Sfna2Ynrmgoqqgr6mZraGQqqiklombkK6wrKafp5utmJiPrKKhnaaimqWdrZifqKa2qcCvpaqkn4uAjZuaoKaekpWampSamqWjo5moq6ujpJ+pqL6kl8OsqqKhrLK6q66noLOvqaqYdq9+kIuchYd9uq2KmGWwjGWVrX2hj4OmlZqBrIqEsIWlmaShoZCFoFtsaoGzYH+te3uCgLFsZ26Zl4yIsFt9tFukg2vIomWfgHu8WXa1WrJ9Uq+AeqxYgKFtmI+omoqXkJaWe3iNnH1kc31ig3d0gHxhamZxbmZlZU9VY1tCVF4+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBQUlRXWl5fYGBhYl5fXFtYVVBOSkdDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5ytpqW2qKGLmqCfnbOzqZ6joJ20mKCzqKqrna+tnaubla+poo6Im46vrKmnoqeZrpOZj6iaop6ln5mjo6WZnqOpsqi8r6Wonp2OfIualaGgmZCSmpuSmZeonqCYqK2npaWjpam7n6DGp6Wpoau0tq2up5+8ra2slYGpkqOvj5uAhqSXmJCBgLjDuoOOnZOFp5ecgqyKgq+IppuapaqQftW9wqpio7+9fX6jgoPXuri1hZSTg569voRqo4Fvq4RtnX96srDHg2qrsL2teHeivrt0gJaOppyPmpGWnHmBkJp5Y316ZIxmeYJ7YGtla2piUGJbU2pcQFRhQk4pPTo0Lx4fJB4lMiAdJCgwNDk2Njc3Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWztLG/ubK9s6Kdrqals6adi5ilvqm3saihv6amspuesZy5qJ6trqWmlZSwrJeMg5uRrqajrKGknKqhmIujkqeeqJyaoamimZ6gq62pua6oo5uXk3uHmZGmm5OPkZiYj5iTqZmfmKmooKqmoaOru56pxaOgr6Ors7WrsKqgu6ivr5pzdaqkt4ZliZ9wZ62Pio9tb3ekkJmfgXWumZVwj4txlaejm5iupHJtbW1linhvbYKZcYB5aXFpZ4mWlZhxaGmEhmdwhmRdiWNqb1ldZ353pmBicY6Sb2ZkgI2SjqKYl5iQlZ58h46UdWaGd2iNanl+eWRsY2ZsYktkWEprWTpRZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOqurmys6upoq6eo7KpmJK9scPIvraqnsCrrKOgp6yfuqOkrayspo6WrqmQjIWVl62epqqin6OjoJGMpJKnmamZlqOqoJacpaWnr7qrrJqbkpJ7hJaNpZeNkZGYlI2YlaeUnpeoopqwpp6irLqfsMGnpLOmrLGyq62rp7mkrriWiqGopbadiZail4epmpCUnZOqs5mbo6ugspaioZ2gopygpKGVq6aMkpKMh5KcnJSQmpOYkI2VhoGkmZeVjYuTkoqPhoR+Z4p/dIJ2dIeMcadse5WRlJOBgY+Pj4+dlKCVmJaggoeTjHBoj3Zwind2fHpqbGRkb2NVYFhAaVtIY2FPWitGPSsmITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERkpLS01QUFFXVFZZXl9hY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW3rq6isKStn6C1sZCOq8W8xLu4qqKlnZulnbCpo7annam0pqeRmKyii4iJj5ynlqykoZmnnp6TlaOXqJqpmZSmoaOPmqeZobW6qKuZmpCNfIGUi6GUipWRlZCQk5elj56ZqJ+ctqOdp6y3p6/BrqO3pq+vsK2pqbO5oa+9mZKmo6a2opKdpp6NqZ+Nkp+jrK+aoaOxqK+XpKCco6menp2cl6uckpmhm5OQlqqZjZmZlpCVnpGJoJ2VlIWSjJCMlIqAfmaMhnWGdnmIg3OcaoaRlJSRin2MlpKSmJOhk52WoIOHl4Z5cZVyeYl/cXt/am5kX3BpYFtgWW1jUGBkUFs6R0dEPTI9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFjYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mnraCotaqQkJ2ks7uvrKyio5p6naKxpKWwqJabuKailJmqnI6Giomco5Cun6OWqKChkpeYm66Lq5aPqJqojJioj565tqSlmZuNiXmBk4yak4qVkZSQjZGWooydnqien7ikf4SvtaKwr3SkvqOyoHh6n6myu5V2raSfioCqfmRcYnafjqSehJd+bpOznKOnrquiZZ6fk3N5mZdwgJiol2x/oqeJZZylnJGXmJaLkZuRhp2akJWCkoeOjpKJhXdrj4d2hnF8hoCAYWmIi5WTi1t2lZFnaJCOcnulmJhkeZiGgXeXaYOKgm55f2twZWB2b2traFtmZWJib1NbPk5OTlJHPUBUQjkxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCRkZJS0xTVFVZXF9oZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpuWpqOhsLGsq6mlqK2jp62kkparta+xppqqpquXc4ycr5+oqqaUlrigoI+co52Rf4iIm56Nq5qjlaeino6XkZ6Fda6QiKaap5GWo4iburSooJmYi4l1d5ONlpOKlJGQlIyPk6COmp+mmZyyloCMnLWds4ySj7ynoX6nonqirreBjo6mnoSLhY+xqa+MiZajmnmBi6yGnJ2ip6moh5WGmHalm3qHm4GXpoKBe5yxeoqFoJeZlJiWgZCWloSZmWN5h5CEjY+SioNtcI+HeYBxgIGFf4Z0hoSWkniWaJN0oJp0fZmDoJyGmH6RiYGDmGqNjIVreHtxcGdkd25pbGtbZWtqZXNbXklUTFFARTUuWVRVNikhMDk9PjY0MzU2ODs6PT4+QERIP0lFSktHUlhaWVthYWhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicmKOfpq6uq6isoKiwpqeppZmUrsa9sKGWpqi1no+DnKucpqGfjZC+npmNn5qgkH2FjpmXiKudopagoZKNk4mGgJGojoeinKOTlp2Gn7myp56bko6FcHWQiZWQipSPj5uLj5GfkpafpJaerIiftIm0mq2Kyoeqroi3hY2wg7Gug6mNppiNnXyoj3J7d5uOppZolaR5tIufnqaokpnCgX+riJihcZ6AmaR9l4WVsYChfKGUoJCYloCOk5uKl5GLfIWTho2Vk4mDbXORhX96coaBhHyEdIWCl4GPxWaAqYePo2ueg6GZgpmAi4yDiZhwjpKFaHd0e3ZnaHVwZ2dsXmNvbGdsWGdHXVFMMkU0Nk1gYzcmMzxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFldY2ZoZ2JiYmJkY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubCqq6aalKCjpKqjlqSptqOvf6CnnKWenYmTvJmTjaCRnZB5hJaWkYermZubmqKFj4x3m5yPoJGInqSblZiXhqK4raWanIyMf2Jtj4uTkI2QjI2Yi5CRn4+Tn6GZoah+oaeHrZ2glq6Pnp2dkYaBoI2rr4akjaqajJp+onaAmZNqgat1Tat4h42dkZuop4Cqq32DoXt6p2mef5JrZ5eGl7aJnn1uYGRZg5Z+jHtkaIpymX15lWxde5dtX1NwhFxfbHmDYFllgn2EgZhxp6prg6NucqVwn4OeaWWfbFttiXtlWV+Df2JXUG92ZW10cmpqb15qb21saVhpT11XRTlBNEdDXms0LElDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySoba8q66imZegoaWtraCcrbWiqJKgn5+mm5mOmLSZkIqejJWLdYGUkY2KppaVmJ6ff5KFhqykh5yRipiol5makYelsKailZqIiYBpboiHi46OiouNkouQkqKMk56gnKKlf5OBj6OhlKB3nJaPp4Ohp3+Gqa2FpXmKfYSafaJwcpOHlXqdjHlth5yMmZCbqJqPh518gqJzdqZmnn52pF+Yen2Sc6JumLe0unOSh4F/tahkgca4e3CVt4txgJukY3Osq2B9ap2zfm59h4OOgouXcYCjbHOkc56Df6RfnZmzlXB8l560dHNbnrKDamJvc3VxaG9Ya2xyc2ZcaV5iS0Q9RDVRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pXYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjaS4ta6toJuinKOjpa6cm7GtrJOXoJigpJmak56rm4uIkXiLhXCAlo2Kj6CQk5Sdl32QiY6ooIeYj4qRopObmoyLqKikno+Wh4R+a3uHf32PjYOLkJGJj5SggpadoJ2gn4uJd5yYooygcqKLiKmInKaQlqirf66MfXqgmXqjk3iAc5aHjJx9lqCHm46Zm6aGomShfIiWkJuNbJ5om41umpl7gIqnfXJoc6mCnIJzqmeUml2bhXaEnWiqaoC4ZlyocIGcYZWMXqd2dYmKf55omnWHk5KYjn+fbpqQbKeZXKh+d7trfqpbjoRdtGdcbnF5d2tpW3FqeHliX2ZYYkFQRU43VkJSbjRLWlpfTlpDQDE1MTs7N0g/OkNHVD9ZUlldPkRiXlZgUWFjfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrabqIljlJusurKwrJ2mnJyon56um52wqKudl6KZoZ+Ylpago5mGiYxqiIBxe5eIi5aWhJGUmI96ioSWpJ2KlI+Fi52RnJuJj6ijoJmLkYqAgGmBhnl/l4x7iI6PiI+Wmn+Top+gopOYcmifip+PjHCSjIGpiJmfo6igqH2wraOiuJd3o7Oio3+IlHidequaf6KOnZuXiZdxoXyFja+1fWuakaF4fpi0o6OrqISZfJp8nJl+c6paXW97lot4nmJMfnp6hWN5l0JNn1mianF8jm2BiYSZdZt5h4mxs39/m5OndYCdbXF8lG+ZcmqkXZV2SGVjYHNwfX1uZWBsaHZ8Y2RhUV5WXVRWQFlFUWdEU1dbYlheSUQ9Qjg/QjpJRThMRFdBVlFbVkRGYlxaYEtgbX5xRUM8VV9iWmVqVmdobW9iZmZeYWFcXV5haGJfZWR2bF5lZ2ZrZGZsaWhraZOdgLGumYRTX6Cns7mzs6maooycq5ycqZOhq6ShqI+enZyamZWYoZ2Wh4aJd4WBbnmVhZCai3yRk5aIcoCJk6Gcc5GQgYiYlJ+ahI6onJqUiouKfINshYVxgaGMeIWNiIiSmZV8kqShn6OIroZ9tYSOnp17pZZ6qYKWnZCKoZ19p2h2bX6ZdKFzcXydhZhvk4KufaSDpp6agaNvXqhndaNjb6VhnNOQfHqZeHJzY6OFkH6icqKOdWuPs4tggpiJc6qyqLx/d4Ntfr6mqbRenG59cZdvgXOicl2jZ3SmYWimbZvUmXyDm293eZdrm3p3l3NtqaRnYGV5cH+Da2dmZG11eGdgYlNbZVFRYklXSVRfV1NbZWpcZFBFQ0tNSktCSkU4UD9QTVdTWE9SUmBmZWlSY3d5d0lGRWNdZFpoaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+xq1RcS36pr7G0sLOjnJiFmKigoKONpKigmKmJmZeYk5mSkqCYjoeFe3B9hGh9j4KUmoF3kY2OiW9/hpCTkmyXlH2IkJGjlYOOqpmUkoqFiXmDdoeAboKfhneAk4aImaKXeZOipJqfibOhoraLeqynpK6lcKmBmpCFgZySfKSAopmGmHKehKKtromXi3+MpI2Wg66ilHa1trXJoXOUioGfYJ2XqW15lYafmnWhh3egfpGWioBvTGajknCah3Kke3l0YYOCbH6ga3FkYJxyf3SXaXtps7W0xqZzmH57nWqbm6t1g5psdHeXaZp6dZhyUER9s15qdmt4h2ZqZ2J0dHFuVl5UWWhPUmhJVUxZUlVdaGtuVmdXTUpBSk1LSEpOQVFKUGRjaW1ldHJzfnl7bnWJe3tUUE9sXmhba2lSamhpbGdsZmNlX1xdXF5pYmRoa3tfXWRoY2pmb21laWxloZyJsKeEZj+UobKrr6+1oqOPgJepoqKljKWnnZylgpmXlo2XkI+bko6IgnlqeYZlg4x+lqB5dY+IjIFphIWSg4yFnY16jIqUpZKDl6iXjJCKgYl6gH2LeHCQoYZ5gZWHiZagln+UpaiclpaEZ254nGyiZHxxpXecmHBnp4GXjHulep+Wg5dynnaBiZSWj7lukIqiYn2ZopWIbXJpq2p1oG1upmCbaYuQaJaHmpV1ooB9mmCLhYx1b4hiaKBlnn5pmnVvY2aIgm5yolpfW2Ohbl2JjG97f3NyZKVtd6JkZ6domHOLmG6hb1OIj2+gX2WnVItdVJhtbXNrcYFtcGhreHNrb1JYV1ZmWVNtSVhPXUhYaWhzallrVlFSRVZcTFhSYVRoal53dXp8cHx8coN7f3J2jYCEdl5RcmJnYnBnUGpoaGtsbmdkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ylmaZ6ZXRti6eupKmwsaafi4CXq5yepYyioZqiooCVmJONmo+Kl5COi3uHcYCIaIuLe5eac3SKfZB7ZIKHlYqKlZmCfIiFlqaPgaGrkIWPiYKKfYCAj3Noj6aEfYaUjYiYoI6IkqqnnYmmeJacfqWJloyymJ6Qg6+Xn6V4loh6qXSlj4SabqSijJKEjIO8bnylr4KGhoeTlpyffKV6caiVoJZnnn5vq2OWipWSd6hsqaKBiXWHgnerkaaIa5Gwa3azjKlrioZubZ+ekpVhf6uLqnaAf4ymn3effYWllZ2gaZqHdqxnnq2Mt3N3vo2kk1mDpo2rYXVyc297dHFian5uaG1TVltVYWFca01cUl1JXW1td2BbcVlbYFpnc2Vub3FjcXRgd3p+eXJ5g3OEf4B7e4yBgoB2YnhkY21zZFJsZ2hvbHJpZmlhX15cYmtibWx6b1xcYmlibGp3bWdsbmKVpqqdgYCepJapqp2op66jmYmCl6uanqSJmqWdqZyEjJqOhpyRhZKNi4x0hnqIhG+MhH2Xk3R0hnKSgm1/i5KHhpSPfHuBhZekjX+lpY6BjYmElHWCh5JvbIupgYOLlI6JnJ+JjZOro6CQgHWUl4h+gXmUrqN/gZtxj4Z5kIyEf3typoxxfX16l5abhI54e35+iJSVk4p2kJifoIN6fYlsjIVbeXhxeXBobn6SiXF/dIKPlJNxhYSCZY1/X4F/i3d1c5R1b3lubodthIZed2l4jWaBgoaOqZt+dHyXaomIcIB2fIV2bWxnjHN5e5h4hFtrWHmPaG53cnFvd3hvXWyGbmlnVlpgV1xla2NVYVVfUV9weHlsa3ZlamtqdnxxcnRzYW91YnN7gXh1eYJ1gIB/gHiLhYN9e21/bGR4bl5XbmdodWt4amlqZFxgWmNqZWxwdW5aW2JrZGxseW5obG9hjpS5qaeLoaKapqSZpJyroqCEhJeskp2giZqmmqiYgoGbin6Wk4eOiYiNcoJ8j31+joR6l490coNwlYV7fZOLhoaQhXh+f4aYoox7pqCLhY+QhJWCho6Xd3KFqoaOkpyQiJ6eiIybqKCgq4OJjpSafn6Jlq2oj5OmkHhwnZGDe5JvfqiFcH2VcWtwfIGfi3+SjoxobV2Di4ybm56Oc5WLiHF0a4J2c4BZcm6HkIF9foxqXWpke4WDiIBfaXh7m3uCi4J2gYaCaHmLh2thcXKDd19zjIKJkKeVhmaMj4Nud4uEcIWNeW9lZ2R6g3qWW1xqZ252W3t4d3Rtc3KCZlxtimtsYllZXlpYbHFbX2BaXl1mdH57dW90Y2trant8cnt4dGRtdGdse352enx7enp/f35vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGtqcXJtV1tlbmxnc3pvaGptYIyMqrGikKOhmp6emJ6ZqKKhfYKYrY2flIebopCllX97l4R8kpiIiIaGinJ8gIt2hYuBhJWKcW+AcpiGhH6ShIOGioF6gIOLmp6PgqaghniOl4iVi4udl4SDeq2CkZiZlIqenYeIoaugoqKji4iTm5yjmZaqoaemoJKbiJeOfHiOjoSnfn+SkZKTnLGmm5SekI2yk5iEpYyMlZufiZCbgomRimt8jXZ3ZYKFkIp8iZ2Eh4uPiIiAhYSQd3x5dZqhiIaKn4uFlH9+jIGAdnB0hoR/eIiHi5CmkISFjYiDjZCMfIeKiI+BdmyChHx5mWpyaGF0inB9end2b3d0gV1eb4Zobl9eWlxdU2hxVWNbXGFsaHV8fHNvcGRraml/e214f3Fpb3BsZoB7coKAeH99gIR6bYOMhnx6eHx9eoN5TmR2a3NtcHpka2ViYmBbdGZwZnJybVVdbHRtaHl6cWdpa2WNiJ26n5aioZiVmZiUmaSgnnt/mauOno2Fn5yKnpZ8eJSCe46ZiYaEhIZteICAcoGHfoiThG1sfnqXhoSDkH+AhoSGfIeDjZqckoapnoNyio+FkpGLnZF9jXuqhI2SmJWPnJeGhpunoKKanYaDkZqZmZCapqCmnZ2QloGRind8h46EpXt8jpCRhpipoZ2TnI+Nqo6RgJ6MiZOanoKOl36GjYJveIVxdGB+go+GdYuXgIOPgoaEfoWDlG55dXSSoouMhZqEhI10gIp8fHJye4iEe3mMjoSTp4+GhI+BhIuKineFh4mLfG9rfoB7bWhsbWdeeX9ofHt2dHV1e3dcYHB9bnVgY1pdXlFmbVNlWl1haml2eX5xa2xka2pngH9sc4BsbHRveG6EeW6HgHaCgH2EdnKCjYh+e3t8f3uCimBpe2p1aGmCZGpjYGlcZHVob2J1bmxUY3F5ZXB6enNlaW1ti4qft5qho5+SkZaXi5qfn557eJ2mkJuKhqSUi5iZeHqNhXuJkYOMgoGCbXx+eHOAhX2KkHxraH2Bl4iBiI58foaEh3yPgI+am5GIppx/cIuKi5KHoKGKhYx8qJGIj5KXk5aTeIyjoaGelpp/gJCamJOMm6OhpJqXkZt+joV5gIOPh6CAfYyMj3yXpKCgkpmQj6aNj4GbkYmSl5t+kpJ+ho2BdXSCcHZgfX+NhnKKlXyIi3KMf4KFho5od3F4jJiSj3+XfoiKc4KHfHxweXuMhXp7kY2DlqaTi4aRfIaHh4V1goOIh3plcnt+eHpwbGpmXn1zaHx1dXN8coBqXmB0dnB4ZGNZX15Sa2hUZFlfYWdqdniBcWZrY2xoZX+Aam1+aG5xa313hnprjIFzgYF9gXR2go2Gfnx7f4F9f49qcoNuc2lhh2hsYl9xVnRvbW5geGhtV2p0dmN1e3tyYmpueYmNn7KSpaWcjpCYj4acoJucfHakoI2Xf4yiioialnh7hod+g4l+iIKAf3F/enR1goV+iZB4Z2N9hpeKgoqNeH2AjIN5loCVl5WMlp+afW+LgZGThqabh4yJhKaVhZKLlpeTknaRnqGhmJSXen6OmJeOlpudpJ2Zk5ScepCFg3iEl42dfoGJjYxzl6KeoZKYjo+ijIuDlpiDkpaZfpiNfIiNgXZxfW56ZH98ioVwhpN/kIJsh4KBf4mEZXVvfIeSl419k3iLiXyAh3x7cX54ioZ5hZGKi5iilYGEjXeJhYOCdnuBiYZ2X3h3fXN9d2ZsZGF+aWp3c3R0fXF8YmNhc251c21hWmBeW2tkUmJXYGFoa3V4hnBiamNtZWh8g2xodGhsb2h/fIJ5bZCGcYCDg39zfIOMgX9+eoKDfnyQbXaIdHRtZYpsamFjdVaEaXFuYHlnbGJqdnBmeXx6cWBybIaFkJytl6aono2Nl4eGn5OXmH13qpyKmHmXnIuLmI95e4CLfXyDe4CCgHh0eHpzfYCDf4iLgGRefYuVh3+Fh3R9fYl/fZeElpOWjKOgl35yh3qTkYqnj4yOipOgkYORkJSXkYuBj5igmpKQkXR/jZKUiZ2dnqeYl42VlnSOj4pshpiPmXqHiJCJb5edmqOTlYqNn4yGgZKcf5KSlYaZiHyJiYF6cXlrdWx7fYt+boWSgpR3b4KDfX6Kf2RyanuAlpeEf410kImDeYd+dXiAfYeBfYONhY2UpJB4hYJ0iYd9gHN1gIeDbmB7dXpxfG9hbmNke2Jub3Zyd3dzdGF2X29sdW5vXFtfXV5qXk9dV2NhaG1zeolrX2plamNod4dtZmxoaWxogHx6d2+Qh3OBg4R9c4GGiXqCfXqBhH19jnJ6inh4bmyHa2hfaXFjh2hxb2V3aG5sYXloa317eHBhd22LgZmaqqCkqJ2KipGGip6KlZd9d66YjJZ9npORlpOId317inx8gHZ3f4BwdHN6b4V8gYCKfnxgXH6PkYZ/g4Rzen+Geo+Rh5GRm5Kkm5SBfYB7jYqSpImNio2YmoyGkZiTlo6JiYyTnZOQjI1ug5CPkYmemaKhl5aJlpFviJqEZ4aZjpN6iYWQinCVmpShkpKIi5mMgn+QnnySj5KLmY57ioSHdHN1a3FudXuLdG6FkI6ScXSAe4GBiHxkcWx5fZmUfYSIdJCLgXSIeW+AfoGHfIWMiYWNlaiNe4h9fouFd35wb4CFg2NoeHR1b3tiXnBganRecWp6eHhscnBleF1tbHNtc1haXl9halpQV1dlY2dxcX+HZl1paGdiZ3GOb2RpZ2VqaIB6d3RujoV0gYGCe3WCiIV3hXx4hIV6gIl3f4t7enJ5g2prX3BodIBrcm9tcWdvbGV8Y26AeXZxbHd3in+imKKooaabh4yKgZCchpOcdIGqlJKNhqCMlpOQf3R7doV3eH9yc3uFa3JveW2KdoCAhm5xW1l+kY2If4CBdnWAf3+gho+KkZyXoJOXd4l+gIyInZ6Kj4aSmJaFiZWZj5eMi42OjZ2KjpCDbYiKkJGJnJahm5iVhZeIaoWjg2eGnYqRfouDi4F3k5iRnpGQiImVjX9+j5d8kY2PjZqSfIp/gm52cGxtbnB7hWlzg46XinB3f3SCiYJ4ZnNvdoGZjnyJhHqUkXp3iHRwiXuGjXuLhoSJj5yjiHyEd4KLgHh4bmqAgoFdcnNxcG94Wl5wYHBqXm9pfHlwbW1qbHZgcG9qcm1ZWGFhYW5YUVNaZmdjdXCEgmJdam1kYmZrkm1gZmZfaGqBdXFycIuAdX+CgHh1gIuAeIV/d4eGd4OFe4aMf3t2in9qcWN8YoZ8b3FsdGpob2x2d19xf3l7dHV0gIJ+pJWarZ+nloWMg3+XlIOPn3WKn5SShoqbjJWNi3pyeHSBcHKEc3F1iGxvbHVtiHaDfX9tblVRgauUh4J4gHZygnmBoIGRgZKSl5uRmniReoKMkqSak46JlZmShIeXmYyUjImPj4iehZCKfHKKhYmOiJyan5uWlH+Uf2mGnYhnhqGIkoSRg4lxg5GXj5qNj4yLj413e5KQeo6LjJGWjHyIfIBrdmpua2tsen5heX6OlYF2eoB3g418eWd0bHSHlYt/iIZ7lJBxeoRwd4x6io17iX6DjJGfnYV9fHiCjH12cGlrgYJ5X3dvbWtxc1Zeb2JxYV9sbnlwZ3BmZnN0aHFrYXdlXVZmYWByU1BOXGZlXXhwiHxfXGhyYmJlZpJpX2hkW2dwfnBrcHOKfXZ8hYB0dX+MeXuGgXiIg3OGhX6MjIN7eZV3ZnJqgmCIfm9va3pgam50f3RfdH15hnh0c4V8eKCPmbCcpY+Cin+Dmoh/i55/ipmTjoSImI6Oj4R2dHZzgHBvhXNwcYNva2l2bYJufXxtdHNSToLfyJLWk3xwdIJ1g5+Ck3eUkJiaj5h7k3KFkJ+hk5OQiZOblIZ+lpWIjY2IkY2InICOgXh6jH6IjImcm52blZN5jXZoiZKHbIijhZKHl4OGY4yRmI6ViZaMjYqLcXuUiXqNiIqSkYl5hXt+bHtlcm9qa3l5W4B5j42Aen1+f4aOenloc2tzi4+KgoWFfZWMbH5/b4CMf4yHfYR5gY+WmpqKfHd4g5B5c21mcH+DbGp0b2hpc21TXm9kcFlga3F3ZmtqYmZ4cnBwY194YGBWa19ddlBOS2BmY115cYl0XVxldmBhZWWPZGBmYVhpc3Nua3F2jHx0eYaCdXZ+i3N/hn97iX5yiYeBkIqIfH6YdmVzbXtlh35vcGyAWmxueXlzYXZ6e412cneKd3mfi5uum6CQgoV3iJV+fImch4WfkI6FjJeEk46HgXV3cHlxboRvbW5+cmRkeHB8bXp9amhsY6Sawdyu76Fza3WDdYSihZFulY+Un5ObgZFwhYujl4mNlYqQnZaDgJWQhYmPgJKKipd/h3t1f4l4hoSNm5uYmY+Pdop2boaJi32Ko4SRiZ2FhV6LlJeKjoiOi4uEiWx8loF9iIWJkI+GdoV9fWt9ZHd1am14c1eIepGGhXp+f4CFi354ZXNqf4qOioOCf4yWhWuCdW6IkYKRhX+CeX+QlpOZkHV0eIiNdXNxZ3V5gmJ0bW9iaHVnUmBxZ2xVX250eWByY19ofXBybltjcmFiV25ZXHdNTUxkZmFednOJbVxcZHleYGRmhWBjYl5YanJrbmtydox9dHeEgXh3e4lxg4R9foh7dIuJiJWGjH5+mHNodXB4bIt6bnRwgVhxenZ5cWV3eYaMaXaAiXJ/nIeYp5yjkoR8cIyUeHmLnYSFoY2Oe5WNf5mIhHtyd3Bzam+Ba2lsfHReYHh2e3B1e2dgZXzr2rXJw9yIc2xzgHaKmoiNaZePjpyUkoGIcIWIoI6FipWKjZiUfI2TiIOJj3uRi4aQgn92eIODcoeCkpuWlJiGjHaHf3CFgomHmaKDlIyeg4lhg5WPhomGiY2HgIdpfZR/fYOEiY6NgnGGfn9xd2h1cmlzd2tajH2SgYV8f4OAhIqCdWF0bIiBj4uCfn+SkX1ugmx5hpCGk4R9gXx/kpOQl4lvcnqNhnVscGtyeIBfc2luXGp2YFJkcmlmU19wdnRgb2BdaIJxc2pXZ2hjaVhtV1t1TEpMZWdfYnJzhWlbXGV5Xl5kZ3tgZF9cWWtuZW9qc3eKfnNzgX56dnqIc4WCfH+GdneKho+YgoyBe5N2bHZ1eHiTdG54en1YeYVxgG9neXeSgmR2hoVxipaFmaGbooqGc2+Si3J3jpx9ipqIiXuff4OZf4F4cXNub2RyfmhmbHd3W195e3pxcX9pYWdhf9W2jpCmeG5xd3twkpCMh2qYjYibkYuFe2iHi5mGgZKRhoeYjXyNjYGBiY58kIx+ioV6dXuCenCGgJWZjpOUgYh1g4Z2g4CLk52fhpWPn36IYX+Th4SIhImNf3+DZ32Qf35/gouPkH5tgnyCdGttdnRzdnVrY42Bjn+FfnyEf4SHfnBfc3GFfI+Ngnx/kol6cYNmeoSKh4yDfIV9f5SQkZOEbnB6jH91bW5qbHp9YmhqaVhsdVpSaXJqYlFicnhsYWVdWmqDbXNiXGdfZGxfblRab05IT2dlXGducX9rWltjc2BcY2x3ZGVdXFpsbGJtanN2h39xb398fHR4hniFgn1/h3V5iYGSlXyIhnaJgW93eXuEk3BtfIF3XoN/dIFtaXtzlHNncoh9cpKRg5qfm6CGh3Z2lH5tdpOXfYeQg4qNmnyLmnZ9dnFvbGphdHxnYml1elpfd3x6bXF+ZWNoaFedj15xcpa8w4N1cZSIkH5ylouGnJOMh3JqiI+WgHuUjIGEm4x8i4Z9fImMf5SIdYmFdnd9gXF1hoGelIaVj4OCcn+IdYR8iZidmIeTjp2AiGZ9k4J/hYOJiXKBfWd+i3t4fn+Hi458aYB8g3Zlb3h4cnZzbGqNhYqBin94gYCEg39rXnJ4en6NioV7go+AfnKAaXmDh4uGhHmEfICXjZCMfW5te4l9d3RuaGd8dmNccGJXb3JTU25zaWFOZnR4ZWBdXFhugG9zWWViXWptYHBPWWtRRFNnYVprbm17bllbXm1jWmNvd2RmXF1gbGpjbGpzdoKDcW5+e390dYN7g4J8gYV2fomBlpB4g4p0gYhyeHl+jZBvb3yBcWmBeXp+bW18dpVraneEdGyUjYWemKCZhYhufYx2aniYjn6BioKVl4p5jpZvenNwbGpkYHR7aF9lcXpaYHJ9eWdxemFlZY+xsndKYlqk2dCWcXuQipB3fZSLhJmRi4Vua4WSknp5koaAhJiKfId/eHiJioSWgG+MiHF0fXppeYWDpZCEk42Df29+g3aEeYWbmJOLkpCUhYdwe5KCfYKDiYNugXhogIV4cn9/goqGe2V9foR1Y3Byf2h4cG91mI2Fgop7dniAhHmBa1xxfXKBiIWJfYaJeohygW5xhIeOhIVzhHiAmY2NhHhub3+Ef3Z6ZWhqfXBfWXdaWHFtTldyc2dgS2x2dGBdW1tZdH1yb1dnXWZqcV9uTldoUT9ZZ19bcGpneHBaWllrZVljcHlfaFxeZW1oZmxpcXd/h29sf32AdW+Ce3+BfoJ/doGFiZeKcYKNcXuGfHl5g5OMdWp6f2xvfnR/fW9yfHuUb26Bf3hmkoqCoZmdkYKGZ4eDb2d6lYl+f4WBmYqBfI2MaXhya2xmX2FveG1fYm94XGRrgnphcXZfZWXU6r6KMjo+i46AcXmFh46NdoOWjH6SjYx/bWyFjYx2fY9/hYKViXyDeG52hoSDl3dviIVrdXt0ZnmCg6eMg4+LhH1uf3R2g3mGnJCMkJGSjIuGfnuShnd/hI2DbIByaX9+eG18e4GKg3dieYSBcWRxaH5tdHF1gZuLgH+FfnJ1fYBygXBbbX50eIqDi3uHgHyIeHpxbIiDkISLcoF5f5eLi390bmt2f4B1dVxpaHdwWVd8U1pwZUxacnJlW0pwd25cWlpZXXR+dWhZYltnZm5jaUxXZlE9XmZcXXVlX3RwWllUb2RZZHF5WmheX2dtZ2psaXB3fY5saYKEfnlugHx9gX+CenWCgY2ThXCAi254foB6e4iSiX9oe31qdHtyhntzd31/jHl4hH18a4yMg5udloyBgGyOfmtofo6Me35/g5SCf32KiGt1cWdoY1tiZ3JuYGFrc2FocIl5YXN0XmNkm6CPblw1Wa+1dGmAiHyShnaFloVzjoqJd3BthYOHdXmJeIl9k4h6f3Nndoh+fphvcYZ+aHZ5bWV5iISlh4CHjYl+bn52f4B8jJmHgpOQmIiLhIl8j4hwe32Ee2h+bWuAe3ppenaBh4FyYHeBfnFkcmd1gm10e4WUkYF8gX9ud3l8dH5tWG9/dnSMgoZ3iHaCiXp4c26JgY+BhXJ+fX6TiYl6bm5qbYGCdW5dZ2ZzcVFbe05ccFxPW3JwZFZLc3hpV1lZWmFxgHRgXV1gZ2RoaWZOWWhNQGFkW2B2YV11bVhXU3RhWmRvcldqXmFoa2dtbGlwd3ySa2iEiXx8cH5+e4GAgnp3gICKi4Nxe4dvcXeDf3uJjY+Dan57bnd5dop3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISIkXh9e4GRgIB+ioNwcnBjZl5ZZ19vcGBgZ3Bmam+KdGF0b1thZGp2e3++nKajyLhxhYNzk3x4hpOCc5GMh3JycIR7g3R1h3SId5SIeXlxY3eGeoCTaXKEdmZ3dmNqfIOInoJ/f46OfXJ+c4R5gJGQgniWjZSPiIKIe4iJa3h5fnVnemhrf3lzaXp2gIJ9aGB3h31qa3Roe39pdoGMkJR+en5+cHt2e3R+YlZ3fXJzioSCfINxhop3eHBwg4KNf315fn12joaDdmlxaWyHgnJwXWhjc25KZXVMXm5VVFlzbmJRT3N4YFJYWF1icIJzW2FdaGVkY2pkUVpwSURkYVtjcF5dd2hVV1V3XVtlbmhWa15hamdlb29ocHZ6km5piIx5fXJ7fniBgYF8dn2EiIaDcHaDcm53goJ+iYuTf3CAe3d5eoGMdIN4f4GBgoR6gHVvfomLmp6IfYV6d4Z7Z3SFjJB6f397iYaEdo+AZ29uX2RcWGVZbXJgYGBwbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4b4x1e4aOgHqTiX91dHV+d4BwcX9thHSUhnh1bGB6gnmIj2Zxg29ndm5bbX2AkJOAgHiSkn14e22HdYCQi4R0loqRjoeFhXt/hWx0dn9tZ3dlbXt1bWp2d39/fGBieIZ6aHR1Y356Z3SFjoyVe3R/dXGAenxtf1lWdH5vdYSHf4B5bIiGdHhrdX+DhH17fXh7c4uBfXNndGVtioRtdFtqX3VkSG5uTFtiV1ZVeG1iUFN0dldQVVheYXGEb1xgY21lZF5uYlRcckdCZl5dZmheW3tiUVVcdVtbZ2thVmpfYG5mZmtxaHB1eI50a46NdX92eH53gYOBe3R+hIiHg29xf3RxdX6FgomNint3f3iDfHyFh3iHfH2BfoSAe35zdnmMjp+NiXqJdnSDeV59hZmMeYaDdIWGhXeJe2JubFtiW1thVmpzY2BbZ25vZodxYXFmV11ja398ys6IuaJqbW2KbHGEcXyEiX57kYR5eXR5dXV7amx1Y4R1kYJ3cGdefYJ6i4llcoJranFjWGx7hpyIgoFzl5R3fntuiHGBiouHcZeOkIiFi4N7eX5xcW99ZmhxYm14cWprcXd8fHlcZXmAd2l1eGaCdmd0h4uNlHxyhmlvfoB5bnxdWHJ/bXSAi3yCb2+Jf3F2aHd/gX+Bd31xenSHfHpyZnNhboyCbHNYa193W0lua01WVV5UVXtrYU9UdXJQUVRWXmJ0hWhcYGxqZmNZbmFYYnBHQWhcX2VfXVZ7Xk9WZHBZW2poXVdoYF9yZmtocmdwcneGeG6VinR/enh+eYKIgHVzgIaFjYJwcHt4d3V5hoaGi4Z6fH91i359hYSEh39+fn2Hf3x4dnl3kpOff4x8i212gHljg4eXhnOSi2+FhYF6g3RjbmpZX1tdXVRnc2VgWWRxcWaBc2JrZVdbYGl/d76ue6C3bWJzhmhze3F5goV7fYx+d3hzdm97dmVqbmCHdY6Bc2piXn54eYuEZnF+aGprWlZveIqkgYV/cZmTcYB4dYJtgIKRh3OViIyIhIiFfXh0cm5oeWBqbWBtdmpnamt5d3p3W2d9fHhlcn1uhHRkdYWMhpV/b4tma3qDdW10YlxvfGt1fIt8gWZ1h31tcWd1fnh+f3J9a3p6gXp4cGZsYm6Jfm1uVmtgd1VKamtPUk5oTll8aGJOVXVqTFBUVV9ndoNmXWBxaGdhV2ldW2toSkVrWWFjV1lVeVpOVm1qWV1sZVxaZWNedGZtZHFncm91gXdwmYV2f353f3yFh311c4KIf5WCbnN4enpzc4WHiIiEeYF9do9/fISJjoSChHt+i4N7d3x3d5qdl3qKgoZpd318bIOEk4Byj4JxhYJ+gX9vZmxmV11bXFtUZHBkX1djcnVpdXBlZWNXXFxogHBvcoB0iWRkeH5pdHVzc4KEeICEeXZ0dW5re3BhZ2tnhnSNhG5mXV99cHuJfmltd2ZpZFVXcnCNpnyEfHaWkHN7c3x6bnt7kIV2mHyHhoOGg3x0cHJsZ3VcbWhfbHRkZ2Zpem97cllngXd1Z3CAd4J1YneEinyUgG6Lam16gXFmc2VgbXpnc3eKfH5idYN2aWtxdHpxeXlzfWZ+f395d25jZmJuhnxta1ZqYnBTS2lrT0xOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2lmYFZjV2JwXUxLa1hjYVVUVXNWTFh1ZFpfa2FcW2NlX3dmbWJwaXNucX50dJqBd3+Ad39+hoV6fXWChH6XhW5ydHt6dXGEhY+BgHqLdXSRgH2BlI6AhYR9foyGe36AdnujpYp5iYWDa3V8e3WDgox6boVzeYR9gYN1bmpoZVZdW1paVGNuZVtYYnN7aWhtaWBiV19aaYBqa2+AaGxhaHl4anN0dG2EgXt/fXZ1bXpoanlqX2VuaIF2j4RnZVhid2l+h3tvaW9nZl1VWG9oj6d2gXp8kI55dW9+b3N1eY+Ad5V0hYJ/hYh2anJ2Z2huW2xkXWxzX2dhaXhoe21abYJyc2lvgH55d2B3hIR4j4RyiHFveX9yY3FoXG93ZHFziHx4YnOAcGdqeHNybHh3dXdkg3t/d3ZvZGRjbnx9a2xVaWJmU0ttaE9HUmtFYXhnYU1TcVxJTVRZZWt3e2VebXFpZF1WX1VubldLVGhXZl5YTlVsVEpceV9bX2tdXVpiZWB6aGxhb291bW92dXqYfXeAgXqAf4eGenh6g36Bk4RxdHR+enZ0hYiQfYB9kGtzlYF8g5+Ff4d9gH6GgoCKe3aErJ9/eoiHg2tygnp2gICBdW6Hb3x/c4mAam9tZGRYX1pZWlViamdbWl51gWlebmxcYVZcXGuBZnJ0fWlqXWt2dWd0d3FshXt9fXl2cmx6aGl4Zl1kc2h6d5KBY2NUZXBngoV3d2ZoamBXVlloZJCnbn54gIuOenBwfGZ5b3qMe3aOcYR9fn+GbmR2c2RoaFxrYl1vb1tnX2x1ZHpoXXSAb3JrcXt9dXVhdIWKeoeGf393cnV/dWFwbFlxdGJxcoV8dWRyf2xhbHpvaml6eHVyZoV1enp1cGRhZG5zfmlsVGleXVRLc2NRR1ZhR2J2ZmFLVG9XSkxXWGdrdnpkZW5xZmNaV11YdmVUSlxjV2hYWUlXZVFIYnhaXV9sW15cYWRef2lqYG90eG1vbXaDmHlygYB8f4iLhn11doZ4h4x9dHV1gnh6eoKMjn1+hIhqc5eBe4udfX6FeoF6fnyGiHNxj66Me3uHj31lcoh6dHx8dnJvhmx7fWyPemJwb2JlXWVWWVlXZGZrYF1cc4VoWHFuWl5XWlxse2Nwd3ZsYltscnNndHVwbIR5foB5d25udGVpdGVbZ3VmdnaRel9dUmVmaoKCdH1iY2lcVFheYmOQpWh5dIKFkHhtbnlneG18hXt1iHKAeHx4f2hldm1gZmBeal9dc2tZZV1vb2J6ZVt3e2tubnB3eHN0ZHKDkn6Hgoh6dm9yfXJieGRbb3BhcXGCfHNmcYBkXm52aWRneXp0bm+BdXR9c3FiX2Zub31kalNoWFlUTXdfUUpZWUhidGRhSVRtU0lMWldpbHF7Ymxsc2NhWlpbYXZbU0tkXlhpU1dHWWBOR2l1WF5hbVtbX2JiXYVoaGFueHlsb2p2gZB5bYN+gIGSiISBdnSJdIyGdHJ3doF3fH1+jI+AfpN+cHiWg32ZknmAgHh5fX90iINzcJmie3t/iJR4ZHWIeXN4dWx0b35seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGIZVJybltaWFhgbHdkaXVqal5abXNxbHNzc2qFfH5/fHdubmxkaXFjW2pyZHR2j3NbV1NkYXKAf3KCXWJjXVNaYFtjk59lcnGFhJF0bGp5bG9wenx7cYB2f3J6enpkZnZnXWJaYWdbXndoV2Jdb2hhd2Bbe3ZqaXJud3NzdGhwgZSChn6EdnJqcHxtZndXXGttYnFzgXpzZm9+W2BvcWJfanF9bGx0fnNxeGtwYVxlbGx6YWdTZ1VXUlB2W1JQWVJJY3NiYEdValBIUFpVa2trfGVtb3FhXFpYWWxwV1JQZlZXaVNURlpcT0hydFhfY21jWGFgYV2LamNkbXl4a29pdXmGe2uDfYCEmXyChHl9iG6PhnFvd3p8dIKCfIuPg4KXdHeClIWBn4l1gICBc3+BcIeCdW+il3R7houGe2V4i29ue29meHB6bHN2coxrXnRuYWdla1JdW1ZnYmxsWlxxjGRPb25dVlhVZ2p0aGJ0ZWVdWW10bXB1dXlqh3x/fIh3kHNkZGtuYVxubWNzeIdrWlRWYmN4fX1xhV1jX2NUW2BZY5aVY25wg4WKc2poem5lc3ZzfGx6dHVven51X2ZyY1teVmJkWGF1ZVVfYG1kYXFdXX5waGlzcXNwdXVqbYSTgYh7hHFyZm59cHJvU1tmamZxdIF3c2JsdlVicWpbX25lfGVtdnxzcnNqbWBaZGpqd15mVGRVVlBUbVdRV1NQSGVyX2FGWGlOSFdUVm1oZHxpa3hrYldcVVt0ZFNSV2hRWWZUU0haWlBNeHdbX2VsaVpiYF5ej25iZmt5dW5vaHZ2f39sg4B9hpd7f4iBin9rk4hyZ3SAe3WAg32Ijn+Mk3N8ipGFh5+Ge3+GjHOAhnN9g3ZupYxzgY2LdndteoxgZHxwZnpzeWxtcXaCZ2R7bGNmZ2hTXl5UZ2Bsb1tebo1oTmptYFRWU29nc2tleGRlXVhvdGxyendybIh7gHace3prYWVsbV5gb2plcHl+Z1pWWGBreHx7cIRfYl5nVllgV2SciGJrcYGHfXdra3hsW3ZxbHppdXNub3uAclhqbl9ZXVVhY1dkcWNTXmFpYWJsWmB+bGZrc3VubXd2a2iFjH+IeodtcWZwfG1ybWNZYWhpb3SBdHJeaWxSZXFkVGJuYnpjcXZ7dWtwbWtfWGFnaHRcZVZhVlNOWGVST1xPT0hlcF1jRllpTUlfS1htZF94aG5+ZGBVXlRddFtUUmBmTl1hVFNKXFlQWXV2XV9mbWhYY2FbXo5wY2dqd3Fzbmd2dHqDcoGDeoiNfnyKh456bpCKdGxzgnR/f4iFhpGElY95foyPiJGbhIB8jIRzf4FzdHhxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6Ojo6OjY6Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2Ojo6Ojo6Pj46Oj4+OjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx8fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENERERERUIxLy8vLzAvPkRERERERTguLy8wMCxIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU1Mx8dHBwcHBwuNzU1NTU2JxscHB0dGDqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4iHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYaFg4ODg4ODg4WFhoWFhYWEg4KCgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpOQiY+OjY+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo6Ojo6Pj4+Pjo6Ojo6Ojo6Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIyIhoaHjIaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkY2HhoWOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCPh4uHh4yIiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIyEioaGiIWJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYiLioqMio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKSkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGdtZ2pnaGVoZ2NiYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXl1ZWV5iYV5eWllfW1hXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01QUVFRUVFWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT1BQUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4+PEVEPT9FQT9AQUBERUdHR0dCRERERkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFAQENEPUFEREZDRkZERklIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs8Pj07PDs4OkBAQUI/QUBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo2OTo5Ojs8Pzc9Ozo6ODw8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PT9APT09P1E+PT09PEFMO0xCOTs8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RAPTw+QEE/QTtaeU89Q0U+RFg8WU47PDw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGRD48Oz1APTk6Om93WTc7OjxHXj1gXDk7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcXJycnR1dnp7fX19fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFDX0k8O0ZjZ19Xd3dYNzg4OE1iQmVoPDs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQE98dEZGdYaGhoJ8d1k8PT88U2pHZ2s+Oz0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VAVXZ6cHaEg4OBgoB9WT5AQz5Tb0xkaD07PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHt9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBQdHN/g4CBhHx8hW1GQkNEQlJpZHNySUBDRUhJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUdsc32AeX+FgH2Gc0ZDRERNZ32HiIh+WEdIUVBMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B6f4B8goSGhYWLbEBAVneGiIeHh4iCWFJeTkxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLTlx8g4WEhISFhoiAVmyFh4aHhoeIiId+aVZLS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUlISElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKWoOEhIWAgYWHhoOChYWEhYaGhoeIhol7S0lGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSklohYSFhH+Ag4OCg4SEhYWGh4iIiImJjI1mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWmGhYSBgIKEg4OCg4SGiYqLi4uKiYqLjIlUOjg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCaIWDgYGCg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojo6Ojo7ODk4OTg3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3eXt7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj52hIGCg4OEhISEhomKioiHiIiJioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz89SoGDgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPj0+PkA/Pz9AP0A9PT9CP0FBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJVhIKChIWEhYSGiYmIiIaGhoeIiYqLi4uKiouKi14+REdJS0pJRkdHREZIR0VCQUBDRUNDQUJDQj9AREhFQ0VERUVBRkVGREVGREBCPzxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRVqFgoOEhYaGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX1+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JDR0dKW4WCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNT01LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTktHR0dHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODg8Ozw9Oj9BPkBAQ0ZJSlFggoOFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhIRUpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0BFSUtNVnKDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLX1JSUE1OTUtKR0ZCR0pHTEpGS09MS0pKTU1MT1BOSElLTE9RUVFRT09KSUpKTEpMRkdIR0VHSUZFRUJAQkJcb3J3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUhMTVFXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkRFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExKTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNHVk5GT1FRVVl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI+Li4tnVlVrYUVSUVFQSjs7UVNSYHVdVVZUVllZUllYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0hISkhFRklISUhJaXJ2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVlZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQPkBWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RaZ1JVVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUlZWFlbXVhYWVdSUU5QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haW1xeVFFRUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5TY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxtcnV2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hCQ0hHSEtHQ0JBREBPUE1TZHN0dXVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYltYU1FQVVJzV2VbT09PTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc/Pzs7PkBAPz8+a1FLYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQz8+PD1CPkpNRlVudXV1c3R2eHp8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en17eHp8fHh3eGRCQEBCPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87Qkg/XHR0dXZ1dnh6fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWEdGRkhCQUZJRUVGRE1SUGFXUlhRUFNTUlVbT09RV1BNSkNGPjo6NjQ4Njk3OTozNjY3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFhZWlZYWFZYWV1XV1hoc2tdVmFza2FhX11kYV9eWVVQTU9OTEhISktJSEZDUVBTWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODU3NTc4NTk5R25xdHh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk9PVFNUXFZSVVNST01LSUhIRj8/PTo3ODc2NTk5Njc2NjVXcHBzeHl6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSkhPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI8WE1JQVE9Y2FRU1FQTlBRUE5OTVBOVFJQUk1JTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I0NTY2O2VwcXV4eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZGQkZHR0hGSkRISkhHRUhMSEtIRkxNUE1HL0VfUj4zQD5qb2FSUlFARlVRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzZEbnF0dnp7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEVGSEpOS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTEpMS0xOT09RTU9PTUhMTElLS0xLSEZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fXx8e3l8e3p+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFdXVUxMS0g9OTg3Oz9APjw9QEBCPT5FSEdERkZJR0pKQEZBQUBGSEVKT0hQUmFcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0lKTExKRkZGRD9CQz48QkY/Qj9BZHF1eHt6e3t8e3p6d3x4eX1+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz9BQEA+QURJRUNISElHSUVCQj8+PUNBQUdJRE1PYmVRTU9OV0tMTUtMTU1MTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QEJBQURFR0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS01RVExKSU1URklJSkxKS0tJSUxNT1BSUEtHQ0tHQ0JKSkxNT01JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFvamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtER0hIR0pLSUpLREdCPT49Ojo6O0BCPz1CQkNDR0ZKTEpFSUlGR0hDQztBQEI+QEBDRUNJTVBHSUtGSEtESElLTUhKTEhISkxLTV1SSUhETUZBREtKTk1QTktNSktGR0dKTU5RTkxjbml2dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0RGRUdERUVHRUdCQ0A+PD06Ozo6QERAPkJDREVJRkpKTEZJSUdGRkRCO0JDQz4/Q0NDRUdMTkhLTkhESEVJTE5NSElMR0VGSUlMTktKSEVOSENHTUxPTU9NTk5NTElISk9SUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUJCQkVAREI+Pz46Ozs9Oj0+Q0E/QUNFR0pGSklMSEdHR0ZFQ0A9RUVCPkFDQ0NFR0lJR01QSUZGR0tOT0tGSEpGRURFSUlIS0lGSFBLRElNTFBNT05PT05KSklNUlVUUk9XZGBhbWdwcm9yeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRD1CQT5BPTo6PT87Pj5AQj9AQkRHS0ZJR0lIRkZHRUNCQUFGRkNCQ0JERURHR0hGTFFMSU9KSkxLSUdIRUZFRENJSEhLSkdLUk1DTk9NUU9PT05PT0tLS1BVV1ZVVFhgXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJqa3NNR0dGSEJCQUREPEFBQEM8ODk9Pjk/PD9CP0BAREZIRUhGRkdGRkVEQ0VDRElGQ0ZFQkVHRUVGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS09TTkRRUlBRUU5PTU5QTUxOU1dWV1hWWF1aXWRgaGJqaWdrX2VlZ2NnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlvek1IR0hIQkJCRkU8QEJCRDw3Oj0+Oj46QEI+Pz9DRUZERkRER0VDRURERUZHSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTU5PUlRPSVNVVFFTUFFNTlFOTVFXWlZaWVZaXVpYYWBgYF5oZWNgZGVoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdW5vcnN5TklIR0lEQUNIRTxARUJFPTg6Pj49PDxBQjw/PkFCRkNFQkJHRENFRUZHR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEtNS0lNTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVteX15gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cXVNSUtISkVCRUdFPEBHQ0RAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRHRUhIRkhHSUtKRkpISEtIRkZMSEhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZvdkpLTEpMR0JFREU8QEZEREI7Pz9BQEBAREE/Qj9BQ0hCRURGSEVJRUZESUhGSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk5MTk5OUExPUFJVWFZNTlRWVVNSUVBMTlRTUldbXl5fXV1gX2FhYWBiZGVhY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93Sk1MTExHRENBRDw/RUVFQz1BQUNCQkNFQkJEQUFFR0NIR0hHRkpGQ0dJR0dKRklMSEpKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQT1RPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWJnbmhiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTUxLTEdFQUBEPj5ERUZDQENBRURERkNDRUdDQklGQ0hKSUhJS0ZES0pHSEpJSUtHSkpOS05MSUxISk1LWmZKZFxLbFNIT05fblVrc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRgd3VpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUtOSktKRkM/QEI/PURFRkRDREJFRUVGQkZGSERESkVFSkxMSkxNR0dNSUhJS0hLSklLSk5MTU1MTElMTExbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW15bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFREBCQj89Q0ZHQkZDRURFRURDSEhHREVLR0dMTU1LTU1HSk5ISktKSUxLSkpLTU1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3FwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRUVFQkJCPT9ARkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkhMTUlMS0hKTUlLSkpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnaGFkanV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0d0lNR0lERURDQUI8QkFCRkRHRkxIRUNDSEtISEZKTExGTktMU1JMR0xMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNnYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0JHQ0hJTUlGQ0ZKTElHRktNTEZPSktXUktHS0pKTklISkxJS0pJSEpMTU1NSUtKS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVEREdCSEpMSEZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSktLSUhJR0tLTEtGSEpKTExMS0lLTE5UW1xUUFRMUE9OT09WUU9PUU9PUUpJTlBRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0hERUdGRkFFQz9DR0NFR0NJS0xIRkRHS0xIREdIUEtMT0tMV0xJRUVISUpISUtJTEpIRkhHSkdISUVGTEhJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUkpZYVpTYGRcYVhbZGRWVllcWVpYXFZZXF1iX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0UEJDRExNQkNEQkRJREdHRktKS0hFRUpKSkZFSEhQSkxNSk1TSUhGQUdGSklLS0pMSklGRUpHREZHRUVKR0NKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl5cXlNbXmNeWl1gY2BZX2JbYF5bVFhYWV5dY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRUVISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSURDQ0VBRkpEQEpLSU9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFeXmNhYGJiYmNjZVpRWVZVXFleZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0dDR0VCRUdIRkdISUZHSkdIRkhLSUxEREtLTk1MTEhKSkhKRz9HRk5LS0tNS0tLSUdHQ0RAREFISUE/SUpHT11hWltkXV9UUVNYXVxcXF9aS1dcTFJcWUlNXlBPXF9hY2RjY2JcZGNiZGNmWFFVVFNbWFphXl5eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0lGRkdIR0dKRkZGSUxKTkVES0pMTkpMSUtKSElHQkhIUU1LS09NS0tJSEdFRD9FQ0hIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYWBiYmBjYmJkZGJYT1FRUltTW15dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSktOTExJTEtJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUZFRFdVRVxUXVNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXWBgX2JjYl1iYldfX1RQTlBRWFJdXFtcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUERXX0lHR0hERk1KUFBGSklKS05MS0tMS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENBREZCTUhDTExQT09MRk1GR0lKSEdMTE1PUElMT1BQU1BMUFRTVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVpdXGBhZGVjaGNrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0hZTUdISkhHTkxRUUlLS0tLTk5VTk9LS0xHR0tQU1NOUE9OT05PSEtFYEVEX0xEZmNETVtJX1xzbU9NVm1ZTENQYFVsV2dKXVdVXkRNUVVMTVRWUVNUWFdUWFVUXFRQZlpoaGRYVGtUV1ZVW1xbYGBhYmJiYGZoZm5saHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPU0lLR2BUSEpPSklPTVJRS0xLTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1dQbUhxbnBhVlBxcXNQQmtzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVVd/anR1dV9gd2BYYVxcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExGSkxGUlZMS09JS1JYV1FOTk5MUVROT1FQS0xPR01QU1taVFFST1BQUEpIWnhdVHhlaFlSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9wgV1lenV4cXF6cX5zfWt1fWJSZ3xlc3Nvc3N8fW99eW9/cl9gYGJiWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhLSkhKUE5NTUpOVl5ZVUxRU05YWkxTU1JOTFBJUVJUWVdXUFRQUFBRS0dmeGxjeHJtWkpMVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVhzUWh6bWlqenp+bHh6f29nb1h2dmp1dXCAYHNofGlseHxvXl9fY2JbXWJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNCRVBQSEpLSkxQT09QTVBaYFpYS1RXUGFeUlZRWVNNUElTVFZYV1dQVVBPTlJKS3JvdXVxdXFkaGBWbkxxcF5GaHlXdlRMaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnR0cWxtXHR+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBKTE1LTFFRUVFQUVdcWVVOVllVZlhSUlleVE1OSVRUV1dZV09TTk5OUUhSbUhpd0tgZHZ2VVdsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhlfGlye11US2xgdnVraXV7e21+eGt8cF1eXmJbXmJkZGdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraGxtcnxrbWhre3RtbWttT0hKS0hJSUhSUExOT01MVFNTT1RSV1JWVFBXWlZWVFRUYWBRT05LVFRTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VSU1dbV1hXWk9TVVdXWFJdWVddVlRPWVJXV1dYWV9bZ3JeW1taXF1fY1pfY2NkZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hvemhnZ2t1amhnaWxRSUtLTE1LSlNRTVFQT0xWVlRQVFVYVVlVUlpdVlVUV1VZWFBPTE1WVFFOVVNOT01MUVBLSlFSS1FNS0tPUlRSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NRUlVVVlNaUU9TUldVVFlWVFlVU1JVU1RUWFlXXVpfYV1cWlpcXGBjXF1iY2RnZWRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFBKS0xPT0xNVFBOU1FRTVhXVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1dTUE5VUE5RTktTUE1PVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUT1RVWFVUWVVXWVRSUldVVVdcWltfXVZZX11eXVxdYWFeW2JiY2hmZWRiWF9gYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RWllYV1haWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFBOTVFRUFJYVFJRT01PU1VPV1JUVVVPTk1RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1dRVFZWVlZZVFdXVFJSWFZVWl9aXV9fV19dXmBcXGBgX19aYmJkaGhlZGFZYmBiXl5mZGRgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlJXU1NTWE1PUFJUWFVVVVNVWVhbXl1cW1ZST1VWVltcV1FUV1VWWFZUWFpUU1FaV1ZcXltfX2BWYlxgYV1gYl9cYF1jYWNnaWRmYFljYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXmBbXl5hYF9iXFlgWlFOT05WUVBUUk9VVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUktRVFNZWldVT1JOU1hWVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFVWXFxWUlRWVlhZU1RZXFRSUlxXWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dW2BcYFVcXWlqcn1zbGdcVVlXUU9SW1NSUVRSVFVUS1JWVVtZWlNPU1JWVlVTT1ZSU1pSVFVUWFxXWFhTWFxYXl1ZWl1VVU5WV1deW1hRVFVYWFhVV1lbVFNWXVldXWBdYmNeWWBbZWJfZGReXmNjYV1lZmlkZl5dZGFgYWFjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFlbXlZeWV1QT09SWlBaVVVWVlRUVF5eYF5eYlxgVV1eYmt5dGx9bFpVWlVRUVNcVFVUVlRWWVdMUlpWXVtcUk9VU1hXVlNQWFJTV1NWVlVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlNUVlpZWlZYWVxWVVpdXF5gYV9kZF1eXV1lYWJmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllaWFZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxXV1dWVlddWFBVXFleXV1UUlhSV1ZUUlRYUlNWVFlYWV1eWF1bVV5fWF9fWF1WUVlUWVpaYVlcVVZYW1paWFlaWlhWXV5fXmNiYWVlXWJcYGZiZGZkX19kYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWlZTXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2hZXFpWWFVXW1pZXFlYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXW1pcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1lbWVleX2BgZGJjZWViZFpiZmNnZmVeYWJgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcUlZYUVdWVlZWVlNWVFhcXF9gYF1hXVdhXlteXFteWFZYWFtbX2BcX1hZXVxdXl5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFpYXWBjZF9SWFlQWFdYWVlXVlhWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgX11fWVleXV5eYVxbWllcX2FfYmRjZWZlZmJaZGZnaWdjX2NeYWZkWmlpYmZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFdXXFlXXVxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl5cXFxYV1tdX11gX11bYGRcXFhaY2VjYFJcWU9YV1lbWllYWllgXWBiYmBhY19cYl1fXVteXlpZVVhdXV9fX19bWl5eYGJjXFxXW11gYmFjZWRnZWVmZFxlZmhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVhXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXVxeXFhdW15fYWNiYWFdYltiZGJgY2NiXVxbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXV5fWlhWW19eXWFhX11bYGFiZWJfXVNcX2BjZGRmZGdmZWZlXmVmaGhnZGRgW2ZnXmFoaGNoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFg4GDg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3x8fHt7e3t6e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiYmMjIyMjI2Ni4mJiYmJiYuMjIyMjI2Ifn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMjY+Pj4+PkJCNjIyMjIyMj5CQkJCQkYt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl5eXp4b29vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9fX19fX19fXx8fHx8fHx8fX19fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXZ2dnp7eHt4d3Z4e3h6enl9eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7enp6ent7e3t7e3t7e3t7e3t8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8fH19enx7d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3l8fX15fHp3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3fHp8fHp8e3d4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp+fH18e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXx7enp5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHt+fH1+fn5+fn18f39/fHx9gIOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgH9+f4GAgIB/gIGBf35/gIF/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+foB/f4B/f39/fn9/fn5+fn1+f39+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+f35+f39+f35/f35+fn+AgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f4CBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoOCh4ODgoCCgYGCgoKDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgYOBgoSFhYWGhoeGhoaGh4iHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFhIOBgYGChYeGh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4KGjYOMh4WFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOCgYKCgYiTgJKIgYKDgYGBgYB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIKDkYeAf4B/i5qAlY5/goKDg4CAf3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKCg4OCg4mZjIOChIGPnIOYkoKCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIODhYWEg4OBgH+Dj5qPg4WEgpKchJeUhIKCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gISQiYOAfnx8e3uMnY6AgoKBkZuElZWEgoKBgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/hZuUiH99fXyBgIGViICDgn+PnJKYlIGBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2Kh4ODg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICEm56JfoOBfYmJfoKDg4SCiJ+goZOJgYKCgYSHgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4WDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIKVoIiCjYV+g4V/f4aGhYWcn4Z+fX1/goOHloyDg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4uSgoSGhImBf39+goiGhYh/fH5/f39/iJ2ahISEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISCgYCBhIF/f36AioJ+f39/f39/fn+Fno2DhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEhIGAgIGMh4B+fn+Bf3+Af3+AgH9/gH6Dh4WGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAg4mFgoCBgoKBgYGBgH+Af39+e3mAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4J/gIKFhIKCgoKCgoKAf359fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4eHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFg4GChISDg4KCgoOBfn1+fn5+fn59fH59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIOCg4SCg4OEgoGCgYGBg4OEg4SRkpGOj46Lh4WGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaBgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoeHhIOBg4OEhYWFg4OFhISEhIWEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Bg4ODg4OCgn99fX+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GOj4+LiIWFg4KEgoGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn5+gIKDg4KDgoOCfX1+f4CAgYB+fX19fX19fHp6eoCCgoF/f39/fn9/gH59gH9/gICBf4CAgYB/gIGBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f4CBgoOEgYKCg4ODhIWAgH98fX1+fX1+f4B/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAgH5/f35+fX5/fn+Af35/f4B/gYB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f35+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5+fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgYKCgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g4yEg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBg4WFhoaEg4WFg4WEg4OEg4WEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGBg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIKBg42Jf31/g4SGhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N8goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICAgoGCgICBgYB/i5SPjIuOjo2Ih4iFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyCf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fX18fH2Af4CAfoB+foKUkYyMjY6OioWGh4WEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6AgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNjI2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyMj42LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhYKEg4J/gH5/goKCf3+Cgn+Ai5CNjIuNjIuIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4B/gYF/f32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn5+fHx8fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt8fXp9fn5/gICDh4mJiYqJiomFiJGOjIiJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIODgH+AgYCAgH9/gIF/fnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fX18fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mNkY6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY6QjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWEhIKBgYKBgoGAgIGDgoB/gX99foB+fH9/iYJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fXx8fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgIOBf4CBhIF+foB/fn6Afn1+foCAf4F+f4B/fn+Af3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4GAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH2JhoaFhYeFhYWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDg4OEhISEhYSBgYCAfoCCgH5/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCg4KEgoGBgICCgYCAgoGDgYGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYOBf4CDgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9+f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB+fn9/f359f3x+fn6Bf4F/f35/gH+Ag4KDgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f31/gHx/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBfn58fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzd3ZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/fn9/fH5/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoCAf36AgX5/gIKCgIGDgoSFhoSAfn18fHx8enl2eXl6eXd5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl9d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fX5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH5+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4N+foCAgX+Bg4KDg4aEgIF+fH18fHt9eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH99fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6enp6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn59fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGBgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4GBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgICAgYB+fn9/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf399foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgYF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF2doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgH+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4B/f4CBgX+AgICAgYCAgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx4eHV4eHl7fHx9fHt8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoN/f4KBhIODhIGBg4CCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgn9/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhH+Ag4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99e31/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBg4GAgYCAgIGCgYSAfoGDgn9+gIOCgIF+gIKDgoCBgYGCgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4OChIGEhIGDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGCg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYODg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+BgoGAgIKEg4OCgYKCgYOCgoODhIODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF+enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIGEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4ODhIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4aCg4KDgYKChIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhYWEhYSEhISDhIOBgoODg4SEhoSFhIODhISEfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WAfYF1gXqEf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX1+fn6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGc4SDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH97f318gH6AgH5+gICBgH5+f35+gX+Af359gH1/gIF/gH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgYF/gYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISEhoeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt6eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWFhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4eGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn59f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aHhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFh4WEg4SDg4SHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fnt8fHt8fH19e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn9+fnx8fX99e319fH16eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhIeKh4OHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGh4WGhoSDhIWCgYKBgIODgoJ9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhoeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaHhoWGg4ODhYGAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoODf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH6AgoJ9fn9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhYaGhoaDhIOFgoWBgYB/f4CAfn+AgXx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhYSGh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g3x+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+BfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9/fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dTV1NTU1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX29vb29vb29vb29vb29vc3Nzb3Nvb29vc29vb29va2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI+MjIyMjIyMjIyMjIyNiIGCgYGBgYGBgYGBgYGDi4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPT9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxaVVZWVlZWVlZWVlZWV05DQ0NDQ0REQ0NDRERDRlNTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWeX1laWlpaWlpaWlpaWltTSEhISEhISEhISEhIR0pXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqo2hkZWVlZWVlZWVkZGVlXVNUVFRUVFVUVFRUVVRWYGJiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Oz87Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMzMzMzMzLy8vLy8vLy8vKy8zLy83Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7OztDU0s/PztLUz87O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fW19fX19fW1tbW1tbW19fX19fX19fX19fY2NfY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs/KlqXRz9KooNDP0aSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/PnKqdrNaynqOn1q+foanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Qy5SImp3InpqTncCemJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9G9yJmbrJqhnLSYnKKdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0peUoq2alq25hp6Wr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P07ObxJ2tmIGglnibhJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NHOjZCjnJ2oiJx5n6mFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRy9qonJG5r6acir2tppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyY6lmqClppeXnaWnlpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyruhpqeczaCrpJvQn6uknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTnpCNttfFkI2318KPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dK6xNXR1MfD1dHVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS1dTS0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkM8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqGgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnp2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqampqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmpeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJuamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6SioaCem5mZmJmZmZmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaGhn56cm5qampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+em5qam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5qZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmZmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmJudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+iZCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZuioZWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKuqqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqWnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuur6qqq6ShoqSpp6apqKOinJubpKClqKOgmJ2Yn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpaepp6moo6emmZykpqKhoaGhoJyYmZ+goaSkop6elqCbmqKioKGfoaKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXVxQVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpikoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3Yl9cVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6qqrKioq7CpqKqooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbWmBfWlxWXGhkbmNuamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLavs7CrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm52hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnlqYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpqWZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHVrcWhpaWFZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1tby8vry8vsa6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta+zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5ea2Nibnd1dm5sW2JRVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha21mbnVxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaalnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrLS1rK6lpKOopKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyeHN5ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8PBxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOsqaOhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjJyMjJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndWhqaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfBy8vIxszKzsXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8C7vrSwsLDBvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnRiXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcLDv7++xMvIysvJvLzIyMnNyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAv8DAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZmNqZGFqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7m4uby9wcfBxru4zt3Ow8TAw8HCwcPCw769wsDAwcLLw8bMy8XI0cKwvr64uru7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2RjamJnY1taWlxZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vb+5vrq6tMC4tbeyrrq7tsC3wN6ekMK/wby7xb27wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJiZ2pnZmllaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3r663tLe/utDDfYbKvsO1use3trm7vbm6trvFxcq9ucXAv7zBvrjGvMK/vMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhxbWVlZm9pZWtoWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubm5v7/XnXeBqcTHt7m4rre1uLq0t7O7xcbLwbzGwMC/vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZmFtYFxUSUtKREpCQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb67xLa1uLe6w7/FvMHOxIB3eZTGz8LAuK+1tby+uLqyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZmxpbnRueGNnYltjUUtUSEVFQ0hDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub6+sry+vMS3srqwo6e5s73HzKJ0eXqXz9HMysS1usDEyL+/tb/Bv8bGv8vGw7/CvMDDzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYk5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxs8Dc28W5vrzEvrigd2tvcWuAlbiHc35/mcrMy83KxsLEy83Fv7m9ubnAw7/IxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW11fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi1vLbBiq3YxL62wL6dfWRaZ1JOWFx2fHR+gp/DxsvIwcPBwMnKyMG7u7Czvb3AxcbFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4c2dwXVteXVlSRkRDTUlBRT1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7trrAt2VupsnAtreGYmBmVGRdTk5RVGh0e4ikvr/GwLnAvL7FxMC1urKwrb+5v8PHw8O9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX99dmx1e3BuaVtfYFlTUEFGSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri4y7VtZ2+YtbiEWU5GZkxPdGpgT01YdHqOrLi3wrqzu7e7vcG1nr2usLC2s7nBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN1dnducWBfZl1bVEo9Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2uM22eXVlc5yiXk5HVXpMSGZ+lINbQ3WJmauxt765srWyvLm/qoi8s7O3n6i4vcPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FbXk9IQj89SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7bHs4B5cWyLdlFFR3R/TU5PX4qBcEZSfqa0sLa6tbSyrLy5vp93uby5t3aUvbzBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWZYXF1STk5BPkpCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO3vbmNgnp6eWRLR3t8YU1JUWWnpWFOSnCuu7CztbK0r6y7uMGMb63FuK1cdrm2vLy4trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdGlsXVtqVF1cUE1IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO/nYeHi4haRHaXcltaSV5gUpFxbm2gwbiztLKwsa2wubi/cmegwrKwp6WxrrmuqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvtqmWj5OoT0p9s2xqcV1rXnVxY2Nuh7G5sa2zr66srba3tF2Dpauknp2dnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mopujnJWQjI+PkJOQl5WWmJ+enpqYppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn96Y3dsblxRaFRQTkdQTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKmzs6KtlUxUcqZzdH2Mc05ubWVwcG6TqLaqsrSuqquvsLChsaadkZiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZmqOZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXZ9bWt7ZGhVUWNNSkhHT1JNSk5HPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoaigrcG/qFdaeHVucVpfZGJcWVtpbGJmc4Oyr66ztaqmrKujnpmUjZGWl5mZnKCiopydpZ6bpJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd4fGR5eWBiUlVgSElKS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnZ6/t3hjcnxmZ2VXWlpRSkdLT1BMVWJfm7KwsLispqGcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSqsq6imZydnqGZm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk5PVUxTTEE3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeqaedh2FYZmhcTkpGRD5AQkVCQ0xWT32xrayvp5+eoqCWkJOboJuZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgnn9jZWZYSkJJT2ZSS0FDPkBGSUhfo6qqqaSfn5mSkZOYmJaWlYyIi46VnZ2dnZ6Xnpmmn6CopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6elpJ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXZtaG1cWFxDV05KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjoIt3a19SS0NEVn+Lf2hGPTo6OThRhaqtqaqln56foqOdnp2anJuUk5WUnp6YlIadmqGaq6SssrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Wvs66qr6Odq6e2sa2ir6aho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rya2t0cnFoVlxRRlRIREpQST9FQTRGRzk1Oz43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can591aV5USkZERmezxMGNXVBJQk97qrKno6OhoJ6lq6Wel5yUkZmdmJSMioaIhnhtiKCkoqurs7y2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8TJycPBxr66tLq6tbu3sLWyqrqyrru3v7u6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hrZVpbRktMRURTTURCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZyXaldOS0lISFN90cu0k5yOgpavraGZm5uenpmXl5eSjI6Wl5OOjZCLgoOCd3NxbnGOpaywub3Fu83Hy7/CzM7NzMfJ0czNzMfJxcXM0dLVztPJvcC/w7vGxcjF0dPN09DT08zKwsXGxsrIzr/I0czHxcfFwbzDwb+/v7a+s66/wMPDx8THxK6/uLK4vMPCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTERFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyek1xNQ0ZJSVlmkrqsjYO0ubGso56cn5qXlpSSlJaRkI+Mh4ODiIeDgIGBgHlycnBseKbBysrFysHT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1dbT1MjMxszNydLNztPNxcjJysHGy8fJyca/w7OzyMTLy8vPxsq/vr+9wcfEzMzIycDDv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZ5eSD5ERVdmhqyfnqGtq6OcnJygpKGdmpSTlZSJfXdwa2ViaHFvcXuFioB2cG5xc2+Iw8/NyNHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1dbZ1dfT19jO0srP0czP0MzT0L/Ix8rEzMzMzs/Fxse2v8q/0s3Lz8bJyL/Ew8fOzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUlKPjtBOD00NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKGpcEdFRUhihLzEqquqm5SXn5yaoKCem5yZlYl3aWNgX19gX15fX11ibHVzcXBvbHJxdY+9ycXU1tfX19PWz9XU2tTUzs/V1NTR0czRzdPX1tPV0M/S09HJ09HI0NfX2NHX0tjZ1NbMz8/KzdHLztDAxsPIxs7N0dHRyMzNwMrMxtPOzM7IxMrHx8jMytTU0dXP0szTwbnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjr4Jia2p6nMK/rqifl5WXmZqcn52YnJySfXBlY2JfX2FfXmFgX2BgX2BmbXBwbmtvcnd3mcq/0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NfXy8jOxMnPzcrMwMnAyMrNztDL0M3OzM7PyMvQ0MvOysLJx8nMysvS083T0dHQ0Mq9yLmwrru4taq2sK2ouK2zvruxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2pp5Z7iIypzc6xm5qVlJabnp6enJOWl5SIa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R1dnmkvcvV0NXT09jWzs7Uy83Oxc7K0tLPx87NzdTLztPNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzMLIycPMw8XIysrPys3M0M3Ty8bIz83Ix8vFxsHGyszN0NHG0M7NzczPxcfBuLm9w8O9w7iysr6xu8PDtaqYpaKZlpGVlZKLlI2akZSUj4+UgomGeXFya21nYGBwaFhYaFZMRkxJUFFCO0M+OzY3Ojg6OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7SooK54ZYODus6qlI2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYWBgX2BhYWBfXVtdZ3JxcXJzcW5yeaPF0s7L0M/T1MrFycnGxr/Dxs/Ox8XHzcrSyMvOzsbR0tDNzNTKx8vOz8jHz9LL0c/GusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS/wcfMzMzPwsrLyMfL0MTFx7vHw8jJws/Avby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raSwZmZ8jNGrkI6Nlo+Gg4ODgX2EhH5zYFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299t9DHycrOy83EusDDu7u6ur7JxsLDwMPIy8nIysjBxczGyMvNycTCysnBwszQxcvIv7nBu8bIvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa8vMDDxczFxbzAysLFx9LFwMm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWbo6CblHt3cnRmaVphbmxaW1hSRExGQkdETERGU0A1NDMzND89Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKypF1qc6a4joqSl4Z6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpa3Bvco/FvMnEy7/GwbC2urKys7Kxwry8vLq4wcHBxb69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7vGw7+8wc3Dxr6+tcG9w7q9xrvCurO8xcTCwra/tbW+v7vMw7y1usi6v77LxMHGwsXJxsnG0MbCzMeyx8nDzs3AxcPAvbO3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NbXzcrPxcnFx8C5xb2rr5JdbnaokouIi4V4gIaGf36Ee3R0Y1xcXV5gYGJjYmJlZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J4nLzLv8K6wLeusLGnqq2sp7i1t7Szs7S7tb6yt7C1r7K8wrzBxLzAu7Wyur7AuMe5tLu2wcK8uL3GwcO7ta+ytrq/tMS3u7SruL29wL2xurawtrqzxby2rru/tbe0xby+w8XAw8XGyMvFwMbGu8fLv8/Jx8PGwsO3w729trm+x7+stbq1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HFwL65t8m2qrCIXnGBl42FiIl7eH6GhnZ3gXxzaF1dXV1fYF9gZGFfY2VjX19cW15cXV5aXFtdX2twbmlmam1ucnukxr64t7Svq6ynnqKqp56rrbOtqqyptK63sbKprqass7y6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCywLa4vbCwp7Kztbu8q661pq62r7uysKq5sK27rru4u8DAvrnCv8fDxcC8xsHHyrjFx8W/x8TDusTGwrvGyczLs7nCvbuziXN2dmtpYGJsaFlXV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHF0MfNwcPGv8TEw8PKwcnKvr+8wLqytLTDrqmwjGhshJKHjo97eH6KhXp7hIB3bl5dXFxdX2BfX2RjYmNjYmBfXVpbWlpdWlpaWlxkbm9oZ2hpa25xgay4r7StpaSnp5qgpaGanKWrrqSooqyqraqwpKafqq21trG9ua+3r6muuLS0vLi0vK+4ubWyu8GywK6lqaOrsbKzqL2qq6irra20s6aorqGkr6mypqeorqaot6yxsre6uryxvL2+vsS/tcLBx8i3v8DFt8TDv7u/xMK+xMjMyr++xMDAqYdzdHJqaVxhb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvByr67yba9w766ybfBw8G0tbu1sK60u62nqY1pYIaEh4uAe31/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXl1cWlhZW1tZWFpcX2ZrZmVnZWhqb3KFqaSqpZ6boaWUnqSbmJGho6qjo6CmpailraCdnKSmrLKwtrensKyoqrSrtLqxtrautrmyr7q6sbakoKSgprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6OgobGtrayytLO0sLW8trvBwbK6vsPBsrm5w7PBvb+1uLy9vrzCx8TCw77AxKCDeHFsYWZfa29gVFleSE5nT1RHRUtGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbWgnpWdoaa6tquzs7uzxM/Iy8LGuLbHwMy/uMm3u8W4s8S4s77Aq7W7saukrrKsoKGNZG+HhYaAfHl1c29tamppcGleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4ecqJ+VlZqhlpyimZaNn6Gjp5ygoKSmoqeem6Kbn6uwrbG2o6mqqqyspLS5rbewrLO1rrK1rrCqn56fpKKypKapuK2ipqagqKyrmZ+gnpmdn6WamaOcm52vqaunqqysrbGyuK+4ubuwtry8uquzs7mzvrS2srG2tb+2vcC9w8G7u72XhHpzbF9lXmRkWFRXXUlXXEtQR0lKR0E8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7w8PPvrrHuLe+t7LBtLG7u6u4ubChnqiqppeekGZ+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9hYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtxjKeck5SUm5ibopeWkZyioqmenJ2lpqKlnKCgm5murq6usqCmoq6rp6K1sbKyrKivsqe6s6a1oKKfnKOhraOiqrWqoqOmnqWmo5aZnpeZm52gmpednZ2craKrp6Skpq2rs7SqtbCzq7K5tK+qr7Kys7izrqmsrrK4sbq2ur2/t7OxlIV5dWZeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzMjGv8W2wcDGzrfAxL2zubmyv7axuLqssbStnpmjqJ+Smoduf4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanahm5OUj5WXl6CXmZWXoJ6hnZahoamkn56onZyaq6evsKubo6S4qqGgrqi2qqanrbCkuLCkt6CinJmZqqahmqy4r6KhpJyin6CTlKGUlpabmJeWl5yVn6qeqaSinaOqqrCuqLSrqqets7Clq66zsbCvrq+mp6eyrbG0sLy0ubeuo5SBeXVkXmFWWVdTUlRLTV5MT0tHR0xMRT1BPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ijqrvAvcC5rrS4wczHxcLDvcW4yMuywcLBrby7tLu8tLi5r66vqJuYoKeTkIqAfIB8d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZpgZaTlYuSlJScmZ2WlpygnJ+WoaCmpqSmp5+dn6agqq+mn6Kkt6ihoaKotKKlqKWwpbGurLWeoJ2VlamhopStsbGfoqOdnpibk4uhlJGTmJiSl5eYl56nnKehopmjpaWrpKWwp6Wjq6utpqmur66rqKqps6WmrK+0sa+8tbGvr6CSendyZWFcWl1YTkxSR1JhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWnrbe7vMHFurG5tcTJycDDxsXHtsXEssK/xaq3t722vbq6tbKrrKaYl56hi4hzhYd+dm5jYWZpaGZnaWZqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVTVFJVYGBfYGFfYWFiZGqAk5OJkI+Uk5SdlZaXpJmgl52hpaGtpqSko6OinKqrpZqfpbGqoKGdpaueqKGeraypqa6toqGilZijm5yQq6mwnKCin56XmZOKnpGNkpOWkJiYk5yho52koKKVoKKkppujq6WipKqjq66lrrKppqWmprSmqaits7W0ubqvqayejHJxb2BbV1ZVUkdRT0hZW09SSVRLU0xFRklEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuyr6uxrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG+w8issbjBtbvAu7SzqaqklJmam4d/cYiDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl5fX2JkbY6PhJGHj5GPmpOVk5ybo5yboampq6isp6impJmkr6WVmaWvqp+cmZugnq+anKuzoKWmn6KjoZSTm5aWkqmprJqcn6GgmpSQjJmOjJCMkY2WlZCdoaCjnZujlZugo6GXoqijoqiroKuwpK23paOkoq2tqqirr7O3s761squvmIV0c2hbWFlTVVJFWExRW1hNVE5QTFBRSU5JQjw/P0E/PTc1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7arvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbqytKWon5WWl5WGeXSAdndubWhtbW1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1cXF5fYGR+jIGLf4yRipKNl5GXmaKgm6CrqqaurKiwpKman62glZakqKedl5CPmp6ul5ioqpmfnZSloJ6SkJKRk5WnqqWamZmenpWNjIuThomNg4+LkpWRoJ6ho5iVn5WaoaKelJulpaeoqKCxsaaxvKefo6y1q66nsLWwuLXAsa2xq5F+cnNiVlRVTlJKR1ZQUlFMTFdNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKWxt6qlorGrnaqnqbKxpLbGtLm6s8rFubrBy9DKsba4u73Bw7GvsbettLO6srKhopuclpaTgn52a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjoeQipeJlJSYm5meqZugqqalrJ2omqCmnJOPn6Obl5eFhJKbo5CVo52WlpaIopublIuOipCapKeclZWXm5GRh5SOi4GLjYCQipKSkqCaoKKWlJiZlaKmmY2ZpKaopqGgtLKnsrehnKK3rKqtpLKyprW8tayrsaOJeXNtXU5RUUxPQ01OTlBLRk5OSkpOTVFITUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrCkp6SqpaCopaWzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatua6snpiZnJSShnqCbV9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFvc3ZxhYiCiICRhI+LlJGUnqGPm5yjoqSZpZeinJWNh5iajHONg36Nl5aGkZqQlI6Oe5mPnIyCiX+JmJ+jnpCTmJaFjYOUfn50io56kIeTkJCdmpqakZWQnY6io46JmqCho6SborSvrK+tn5iluKamsaGwrpywu6qpr6qZg3dzY1ZNUk9QTkNTTkxRTEJQUUhJTlJNSEpKREpMRktKPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBq63DraeippKdprWrop6OlJWRjn12fWVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdaWxybX+FfHROWHKQg5eHjp2Xi5SRn5idlZSWlY+WiYCTiV87Vm98i5SJgIySjJCGhnOKhZaBeYF7hpOdk4OVjpGQg4Z9k3hxcIWNfYmBkY2Pl5qZk4uPiZyIn5iIh5aemqGgl6euqa2pqJ6WrbOipq2ZrKuYqLOiqa2jk35ybmBbTlNSV0xEVEpQTExGTk9JRUxRTUtPSklNUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqKijqrCop7TBubC1sMfCt7O9z7+5r661wqeqxaminZiDlJuvoZiWhZOOioZ8cnVdUUxSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRRQkB/lZKSfYmVjYSKjZuOlpWJkoiGlYZ5iX9gSlFueIqRhH2EjYqFf39ufn+Ud3V2eISNmW9RjYiKhnt+eJR2Z3eGiH2KiZWLjZGSl4yEioiVhJqMgoSSmpaenZSko6ippaSemrCroaSkkaaqlqKqnKKmqIl1bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUU9GSUM9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foa+hp6ilp6ivraq1vLa3t7PBu7anuci4tqiotbaqsrymnZaOf4mTqJWUiX2Ng4F8d3BuWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaVxVj4mUiXR/h4F8hYyTgpKai497ho+AdoB4c251cHSNjYF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4B2cnKSd2h1hISEhXuVioiKjYuAf4SLjICUg3yAj5iUnJaRnp2pnp+gnaCppZ+dmIynpJOhoJaenqSAcmhhXF1KVk9SR0pYUk9KTE1SSkpKTFBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppayrsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjZSAjZuNkH52hXd7dW5uaFhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g3x4ZneNl5iNj31oeYF2eICJj32EmJKBcYePfHd7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfYmMiIBseXF9cW12j3FocYF+jnBDi4SCg4V/d3d6i4V9jHt1fY6Sj5iKkpqbo5aZnZqdnqGclo2KpJuOnpeOlpiPd29tZWJaWFhVUUpTVVRPUE5QVktOS05PSlFOSE9PTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsa+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZjoSSeYiNiol1cHttdHBpbGlXS0ZHRUFAQ0RJTExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ7fX57dm90c4WCeYF4cHyOjIqUg5aXmJqQkpWXmZedloyDiZ6Ri5KNhpCWf25pbm9uWFVYVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2wo6yqqLWvrqy0v6u8wr+mopmVpJeejYSLlKGhmJiRk4tzjnp/hYuFdG50a3BsZGtqWE5FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxgp4himml0emV/cG1/eouJdoGIhnRsmpF0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcX98aHFxfG6TjY98c318cXBudW2Cf3d5dWp5iYKIiYSWkpKQi42RlJSOl42AeYiXiIaKhoCQiHZqam9oZVhRWVdZWVtNUFVWWVhOSUhFSkpIR0JARkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6e7r6uysMKxu8PHmpaPlJmLjoZ5hJCYlI2QjI+GcYeCc4eMhXpvcnBub2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4GFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYmAZ2Ziam5ybHCDdWlvWHVwjpuSd2x/e31tcW1wgHpzdW5idoN+hoCFkJCKiomRi5GMi46DdXiKjoB+g4B9j3pxcG9rYFtcXlxZWGBfUk5bWlhXTEhKRkpHPkJBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGdpKeer5Wltaqusa7BsrvBxpaQjJSPgIh9boGQkomDioePhXWCg2yViId7dHh4bHdud2NpXklQRz5ANzQ0OTs7Oz0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoCEmYSbnGGGqp+di4OQjXp3iH6JiI1zipeQg3pdZHF0ent3im1oamJ5b4WQgnpugXd0hHpwdHl3a25pXXeHfId8h4ePf4uSl4ONhYyGfXGEf4N9dXd7fIl2cHN0ZWdfW1tdVFxnXldRVVhbVUdKSkRMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkpydn6aRoKugsaivwLG6xbqWjpGTh3qFdmt/jJGCfYqEjox4g4BzoYSLfXyBfnCAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJKoh4CYmIqcdG18gYaHfY5oZ2h4fm6Fh4KFcYSFR2yAd3J5dmhta193fYOIf4iFi3qVnZuJi4iRf3p1i3Z8eG1vd31/c3NybFtdXVtjY1hnZlxVT1BWWVBETEtGTklDRkNDQUBDQT05Nzc6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbmqWtk5m7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnH92hYWKkIiQaWhvg4B0jIeEi3GFgneHf3t2hX1udnVmgJSPhomJh4iHoaqilomOmH96gol6eW9na3h+en5yamReWlpdal1hZmBZT0tOV1JRSFBKRE5HQ0pEQkBEREE8OTg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjICBkY6KmpuknaGspquvsJeRkYOhlIR4d3+MlHx/koaSlX+KgJKbjoOAgYyLgomNg3+Jf21wal1CQTQtLS8vLi8wMjIzNDc3ODs9P0JESEpOUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdmo+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6Gfk5iShIuFj5mRlmxwdYmLgpaMjY93j4RxbISBipaRg4WIcoihloeTiY6PlqW1qZuNlaKDh5ODfX9ramt8gIGBc2FdY15aZmtcbGteV0tHT1NRTk1MRklQQ0RNRkFDRUZCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpeWmpWenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioSYkpGCgICLjYmFkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NFTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2cqKWimaGXopWdn6ieqKugqKypqrWXq76rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiZWimpp4en6UmJKhkpaYgZSee3aVkquyiI2Xn32UnZyOk5aZpKKmtrCdkZmoiJaPjYGIbHNyfH98cWhgXGBeYmdjYGhnW1JFSktQT0lKTEZGTUNITEZGQ0JHREA6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYyKhJKFg4aJgYCGd19iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQU1RUlNQUlNVUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2GkHeVi6OnqrS9uKSurKynqLSrsLaysq27sbO+nLPDrLvJy7fDv7ilo7CyrK2qo4uWmIWmpqCil4GmmY2iqqikiIWUpKGgqqGkqY+csYuVo6e3u5ugo7CTop2jnpGkoquvrbO1opSkqoiZiZKKlXl6foV+Z2BoXGViXWRjX2ZmX1pPQ0lIVE9GSExGSkdFRkhBS0ZDRkZBOjg2PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRj4OFgIuFhoeShoKEiYaIh4dxbmFARTY0PDIvMTEwLSwrLTEuLTM/REFNVVFSU1VVV1VOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrHBx8Oqs8W2rLO/s7i+tr+0wba7u6O3xai2yce1vrm0qKO0rbGxm5mSmp+Jp6+rpZR2n6SXoauxs5iWqq2orra7srqsr7Wisauxtbu3tK61oKeno6iaqbCtsrq4uKebtqmMpY6Rk5+GeIKDdVlhZFZlYWFjYGFmX1tUSkRFTFVRSElKRElHRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRY2RXeXVxgZR9hIeTdoV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk42HhIGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtKQUA+R0tGRUQ7PkA3RDc/QkpKRUZXVFBej6Wto7G0w7a4wczJtrvEvbOzwLe3wbW/sLd0sbOmusWkr8a5sbOxtKiktbaqsaChlpuikqWwrqatq6ekmKCss7qiqbK6tLu+zL/Fxb29s8K3uri+t7q3uayssKaxqq2+sL27wsKsmbqolK6Pl5eriX2CfGpXYmFYamVqZVdbZFlWVElHR0xRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlVWnZqcH+PhIGOhG56c3mHYrihmaOJlZOWk5OTjZCWkoeGe4aBjZaKgYSAinp8i4eGfIqDgYqDlX14enVlT1xkR0VMOlFjYVteU0Y/O0hQRFpjUVFZWFlnWVRgYE1TT0VBP0lKSEVGQUBDPEU2Qj5IR0pMU1pUXZOvuLW6ucm/ur3JzLu8wLy3tbu7t720urHGYHWypbGanqq9qqWoq6qjorK1oauonpWWn5ifrqWnpqWfo5SiprG0p7KyvbbBvdPJytPGwsXLwcrDwL69v7u8t7Swube2w7rFvcPIsJ65qqKrjqWotomAf3FfYmJdV2FfaGZSWGFWUlZJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbGxxkI2FkHNscnJziNXAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWin+Df4J4eouDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1fbl9YZ2VVWVRKREFLS0hGSUhIR0JJOUQ/SEtUVFZcWluSucC5vbfGwLq4ysu6t7m2uLmyt7W0rra2mGR1qJytcF6hrZyYoKKbpJ6rpZSgn5CUjpaYl6ifpZ+empqEpJ2spaqwrLewvbnU0c/Xz8nM0czPzsrGwL/Cyr3BvMHAxMTFyr/IzrSku7C0r5urubyaf3lsXV9cWF1gWWNjUVxgU1BLQ0FFRkQ8QEU+QkhCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkJRvbG91dYizrKGhn4uZnJmMjZWRm5KFiop+iIeMkIuJfIGDc3uKg4V7iXSBiYaVf3N7eGttdXtocmVpbGlmamloYGZpaGxabnSXraS8iIdnW29oXVpZVEhLTk9KS1FLVFFITEFKR0tQX15iZmlhl7fHsLmzu761scTHta+5sLC7q7Kxp6q3rI22p52bp5pPmp2MjqCWkaaYpZWKk5OJkImPkZGem6GXmpWWh56appusr6ivp7O01NTU1tLLz9TVztPPzcXCydC/ysnKydLHzM3C0NK4sMO8xLmltrrEooJuY1xcXVhgV1hmWlFdV09PQkJIRUJJO0FEPkFHPz9CNztDPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiCaHFveXmDoKqeppeNm5uXi46VkZqOfYmLhY6KiouQh3yEgnB/h4GGe4dyg5KLj35xeHVrcXh+cXtteHNsaYFwbWNpbnB4aXd8fsu/wt+nbWN4bmNbYWBKUFJVTlleUF5dTVBOVFFVVFxubnaCcpetuKy0p7C2q6y8wLGrtaaluKesrqGrtKOOsa6amJiMkZORhI6bgY2mkZyJg4uEiomEi4OTlZiXk5uRnJiZmZ6eq6ykp6Gsrc/S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxcDOx8fDqL630J56bmVdYlxWYFJdW09QVFBOSD5BRkFCRTxAQj5FRD5APzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd2x3cH1+f6GenqGLjZmTk4yMk4+WhXmFj5CNi4qIkYd/gntyfn+Bh3mEdYWTkYl/b3Zya3N8fHZ8c4F3cWuAc3Job3F6eXJ7vsuafoyyg3ZyhHZoYWpdQ1paW1dlZFhla1NYXVxgY11jeHt+i4GZqqSkoaChqKaqsLiqpbSjoa2io62ip7GfiaaalJKRiZGOiIGUiWqVoo2ZhICFfZGDg5OWrYuVjZWZjoWSkJ2Xp7ChoKGkpKjIzc/IwsvR1NHU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzEw8uLc29iYF9YVFlSXFBKR0lJSkA7OjtFQUQ8QkQ+SEI/QkM7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuWiY+KiI6Hj394hJSZio2IiIuJfoN4c3t9g4d3f3qHkZaAg254cG11f3Z4fXOFfHlth3Z0bn12hHV5e521jDxBi8alfo18aWVWSUNmY2VjaGpkb3hbX2Zoa25pboCDiZGLnZ6gnZCXmJ+jpKaypKSzoKGlnqGpoKOxnIaekpKSkIuOi4aDkIR+nJuMjYOEhXqUfoKplaOMkoqXkot9l4qakaqzmJqbp5ynvcPGuLbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydra0tW/y8y0eHZuZF1ZUlVQWlZGR0pKRUU9Ojc5QEFCOkhEQEVDQUNCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgod8eIWWl4iPg4eFh3qEeXF6e4SGdXqFjo2deoxwfG9ven9xe4Fxg4eBbo56dHd8fIJ1f3yHiLB0WKnCtoySgnBuYj1eaHJwcXBueHeBZWlvcnV4cnuLh46TkpuVoJWHjJOboJufqp+grZyimpmfpZ6frJmLmoyRkY2EfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yNlIuGe5uIk4+uqpSVl56Ypq61vamtvcbLyMnLy8/Iw9HK1NbZ19jX1NvX09nb1s/b2tHWydTLlXl7aGhbWVBSU15IQ0VJST5BPj03Oj0/Oz5IPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKChH6EfHyEl46Hi36GhoB3gnlue3uHgXR5kp6NoHaPdYJ0dYF9dICEb4GPgm+ShHR8gYV6doZ8ibfGpcLJt4GWm493cGVOZmOBeoF3hqKQi3h5d3uDf3yEdm2TlpSVj5iQg4qPlpqXl6acl6CXn5OSl6OdmauWkZCKjZGCjIWJiIGFkJGenJmJhYuBhpd6iIifl4+IjYqLgnyhiZCLvKGXk5eZnKelpa6eqLW+wMC5x8nNzsXNytHW1tXZ1dfb1NfZ2tvX29rZ2M7cxoZ6eWdoZWBUV1ZVTUtETkM7PD08OTo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqLfH6Af4B9hXt+gZGJhIV6hIh7dX10bnx9hn50fpKekZ+DknyGfniOfXmKim6CmoB0mIV+gYmFfH6Qeo+pj5DCoLyMnKOcfYmEfYlzjIp+c6aanJiUhXuPkImEaEdwoKSdjIuQkoWJi5CSlY+dmpOVkZeNjJWfnZShlJKOjZCLfpCOjouEiJKWmp+fiYyUkp6Rgot/pZmIhI6ChoSApYaKi7iYnZGVlqGmoJ2enaOutrq1q7/GytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld4eHdraWRXYFtUUE9IRE1CPT0+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgI6KcXJ5int6f31/fIh6fHuLh4J+dIOGeXN6c22BfoV9d4WboZuelJKAi4h/mIeAnJJuh6iFeqCLfJCOg4iEnH6akYqNo6KfkKSuoIuRi4WLgZKGV3Kti5+rm4+DmJuQkI5cgqKRgoyfk5WMh4iMkpOMlJSUj4yPioiWm52PlZaRi5KUhYCLiJKNiYqdlpmjo4aSnZahioqIjpyQg4iPgIOHhaSGjJCzmJySlJehoJ6Zkpydp7G4rKW8wsfNx8bPzM/MztfP0dSu1tXY2tja2tfW2dqfb3x0Z2dcXVhTV1hDQElEPj4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE5Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhtYn6Sg25td4t4eX56gXyGfHt3hoR/c3CFgnp1dnZ0hIKEfX+SpqOfpaKWiZ2PlJeLiqiXcoqyjISnkYSZk4SZi6KWoJiTiZudoZKpr5+RlZCNjYiVi26Nt4WaxMiynKGlm5yYlpGykWSkzceWj4WHiZCSjY2TlIqFioqGlpqbj5CUk4aVl4R/j4uZiI2QqpeXpKOImZ6Wm4iPh5eXioSPjIF/h4+liY2TqJmWk5aZoZifmZOcm6KztKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgnJ/aGNfXV5OSlRaQkFHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo+OkVNRkhSV1NSQmOBRnWBjn18bX6IeHp+eoGBg352doCDfGxui395fHh4fISHin2Ko7Ono6qzoZann6WklpWuooOQuJWSs5mMoaCMpJuvo6SdmJCnlqeZra+kl5WWlJCLmJmWoMCOpMm4q5uipq2YkZudsp2GhaiinJiFiImOlY2Lk4+IgYaHiJKYlIyLk5OGlJiGhJGQnHSRmbOWl6WhiJyZk4+KkIqXmomKlo6GfYyYnomQkJyamZOYmJ+UoJ2Vnpuhsa6ipLe+tMXHxL3Dw7/GzcrJ0qfOzdPS0NbY09DYu3J5dlxgVV9XUEhJTkVCQ0U1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY2PTpKRkRHTltcWUlmYDtIhIt6e26Fhnp8hHiAhYF+cHh8fX1vc416fYF7eIaLiYaDkqe7rKiyva+lrbOzqKOisKyKmbWdo7ikla2klqmtt6akop+ZqZipo6+wqZqZnJSVkZefl5m7u63JoWm2uKuwlJieo6uTl76jXqqygomKjZSHkXyOjn2Dho6PlJWIh5KXjJCVjYuMl5iSnZm0l5arnYublJKNkJKMmZuKkp6Qi4mVoKGNlI2Ymp2Tm5ielKGglJydpa+ooaWzuKvCyMS1ur27xcfIwtGhxsnNzcTX1tHL06FwemhdWVNeUk9GRD48Q0FBOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlR2JgYnBJQIuKfoFzhod9gYh1goqDf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7TBvLStq7O2jKeyrq68qpu7pKitubirpqaioaOjqK+ysaqcnKSYm5iXnqKlpZKjua6owLusrbK5paSnfYiHnKy9sIOMjIuQg4+DkY96gYeQjI6ciIePl42LlZeUkJqWnaeasZqRrJyOmo+SjpSQkJaXjpGgkYmVm6OslJaPlJyelKCdm5igoZSanqempKKksLKmwcfDr7C6tsXEwr7Np8fDx8O81dHNxMqIdHNiXFlfW01KQkxARUc/QT9COzo0PkE8PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZkZgaWdaXVuTjIyIe4eLhoOMdYaQioFvfnyCf3F+gXqVepGUlJiQk5Wns8bJv8LMwcO5x7y6r6u5u5eytrqywK6lwKSrr7u8qq2roqKdp6qutLCqm5+qm6GblZ+wtKeLorq6tcG7q6mcsqWkqJSFjqrDxKSCi4+HiISGlZSNeoOMkY6RoYyMlJKOiJefl5OZlZimoK+djKqcjZWPkpGUlY2QlZGPoZSGl5+gsp6UmpSgoZmkn5qgnKCUmJ6mpKampK+tpcDEwq2ot7XJw762zrLEvsS8s9HKyMK1dHltXFhcaVNMSERMS0tKQUE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpNZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KCkHmNoZaompqYur3IyMrB0snKwsy8wbOtu76nub+9vMS3rMGprLK7vaqwqaOlo6yts622taCfrp6lopijtLypm6i8waO2tq+rkrCtq6yXhpqqpqWRgoyTpZWJgHWKknqFjZGQnp+Tj5SLj42Uo5mXnJWUo5+qn5GlmoyPj5CVloh8j5WSkqOblaCinLWmkJ6XpaSjpZ6eppielZebpaOop6KyrKi8wMSvpbO3zMC5rsSzu77BuKzCw8LAmG15YVhXXFtLS01KRkRESUJCQUNLOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY2Xjp6SiYp/iZ+ThHeFf5V/f5CIipB/laGarqajmMK+yMPHxdPNzs3Lu8G3r7m8tLzLvMPBtba8rbO/ubyur6igqKe2ra2psbeanq2ip6Gdq7e3qaWvvsOxvbmzp6q1s62ulpalrKigkY6SscWnlY59kZV9iJGZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjI+PnohakJaXkpalmWWYo56ypZailqysq6ebnqaXmJeYlaGkqKaftqupurzDtKaztcvBuKm2rLK6uK6ot7q9uINsblpXVFVORkpTTks/QUdEREhGRzk1Rk07Pjc+QUouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJxRmlJUmViTEallJyWoZeplo2Qg4emk4iBh4KchIOVkJCUjpqin6++rqHGvMXExsbOzs7Syr67tbG6u7y+z7bEvbe5t7KxtbO4s6ymnKuruKqop6+wl6OvpKekpLTAsKqstL7CucC5s6e5tbiyrpWlra+upYuTlaGNdMGafpeZhY+WmoyxlZqZlZOTmZmlo5Wfm5aaqZ2coaCai42Plp1gSpacmpWapZZUlrCfr5yfpZSvrqymmqCllJOZmY6cn6eimbSpqrO8vLuqsLLHwLilq6utsbGjobGytKRxbmZcWk5QS0RQUFBRO0dKSUdIQkQ+OUtVP0E6PUVNMDc1NDQ6QjM0TldPPEpLT1VOUUpPSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UUVXUnNiV0ZIqpeZoKKor5mRl4eLp5aOiJKFn4eEnZePnqCao6S1yLSpxrrDw8fKyMjMzca+urOuubjBwcy2yLrBuLW6sa+usrSno5uqs7SqqKatrJmkrqWkqKy6v6irtre/wb++uLKyw7G5vayjrrWsuqaInJimm3a/oIWZnY6TmZqLr5ehnJuXlZufoameqKCamqqaoqeemJCNkZ2DbnaSopqVnaKekK2yo6uVqKqXqq6lpJ+lqZOSmZyIlJyinpaxpqmrura+s7Kuvrm2oKOnqKWnnJusqamMY2VhX1JLTUdITklVTD1MRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauUnKGfu6+ZlJ+Lk6qbkZKTiauNh6KfjKStlKOjtsa9tMC6wsLHyMXCzcjCvbmyr7m0wMLKtcaxwby0uquoraywo6KZqrS6pqmmq6qdqK+no6qqvrunrLyzt73GvLe1uMCxvcCzqbW3q7+lj6OXkaKgvJ+JmqCZl56ej7efqZylo5ucoZqopbOhm52mnKiqnpmVj5Sbi5eJjKWilJ2inqC0r6Wlk7Crmausnp6jo6mRlZWgg5CenpyVqaSiobS0urWtqLWys56coqWal5WZqqGed2BcX11KSEZHTVFJTUVGRkJSTEpBRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Snl6SfnsOsm5ekl5mpnJaamo+qlZWoppWtrZmhq7bEwru+tsHCwMfEvs3Hu725sq+4s7/DyLW/r7y2ubemo6qsraCgmqqqxKGkqKumnquvrKKpqL+3pq29sLe2x7a1ubi/sb/BtrSztK++o5ejlpSclK6gkaGipaOjn5C+pamdqKydnaGbpp+9opijn6Kpq6Gdlo2VnpOeh4+FjZOepKCdtaymnJWyp5mvqJ+aqZ6gjZmVn4SOoZqbk6WkmpissbaxqqWqraycmKCgko6QlqielGhiWWFdTklHSk5LSEVESUE9UElBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlYlZMopqjnJ7FrKGfrJ2drqCTo5+WpaCmqauXtrGjqrK1xMO9v7W/wrvIwr7KyLa4tbSws7O3wca2vbC4tLm1n6asqqudnZ6lo8GloKmtn6Spra+ipqe9taaxvLe2tcOys7e5vrLDwLe4rrO1taOdpJWSlKGuoJminamoq6Oaw62pnqytm5uemaagvaKdpZirq6ymoZmNmZ+SnomOV3+WnqWhoLiqp5OYtqOfsqGgm66Wno6ZlJ2Cjp+XlY6ipJWQpq2yq6mhoqWllZWcmIuPkZOknolhZFpjYExISkpORkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckhFNj11ZVxLTZ6foZiew6elorOhnLKnk6qkoKSfrKmsnbuwqKy1scfEwcKzwsO8xsO8xMq9r7G2rbC0r7/EtbmwsLm1rJqosKmpmp2loafCrJussZuqoq6wqaSnvbamt7q8rrbDrbOzwr+yxrO6t6y0tq2qoqaWlZWkrKKfn5qoq7Cvr7yypqCpqZmZmJOipLigoaSTr6+spaefkqGelZ6PkI2VnZqin6e0pqeNmLSco6+anpuukJ6Tl5SagJKhlY+On6GTi6assKWmoZygnpKSmpOFi5GNnJ5/YWVbZ2VKSUxKUkFDQElHOztHPzk5Tk1VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfo5+boMOopKqyoaO0qZWyrKeipLKrrqm7sqywtbTGv8TDtcDEvcnEtcDIwrWrtaiwuKzAxLS3rqy2uaWZq7Grqpifppetu7SbqLCbrZ+utLGnqrqyp7qzt7K4wKq3ssK8tMWnvq6tt7WqqKyhl5eSpqWio5iYpa+4rrK1tqCfqKSZlZWTpKC3oqWmlq6ysqaqpqGem5qalpion6CYoZ6vsqKmjZeumaWrl5qdpJGbjpOXmYWWn5SMkJyelIupqaqip6CYnpaMjpmQgYWViZSfeGNoXWtqTVBNTlQ9Q0FOQzo6SUA3N1FPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SnBoVkNXRox5ZkM7pKOcoaa/pqivsKGptaqdubCro6q0trGwubevtri4xL3Dx728w8HGwLjBxsG6qrakrbutwMK3t6qssbuila2wrbKWpaeQqrmpoKewnaqgsLSyqqm2tay8rLKyubesubDCur2+psOrsLevqaurp56YmauioqCRmKGxr7OrsbqbnKmgmZaSl6aht6mlo6KvsbSrsqirn5ugoJuepZyilp2js7Can5CTpZqgqJqVoZ6VmImUmJOWl5yTiJCbmZSOqainn6Obl5uTh46Zi32LloWPm2pobGFsbldQUVpUQUNFVEA7O0lBNzpYUGReUFZXRFleXU1MUk5eS0o+WmNeTkhQTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGqsKujsbippbWzrKCstL2us7i8ur22tsDCv8jEucTBwMC4xL3Bt6+1qKu3sry+v7SprrG2nperraitlqeojqe7n6Sts56rorGws6yptrS1va2vsbWssLWxwLrEt6u8r7G4rK2qo7GmnqWqoKSXkJmfs6qzqquzmp2nm5qVjaCmpLSup6Ktra6xp7OtsqqknJ+opJ6VoZibqLWpl5mSkp+ZnqCekKuel5eFlZiLnZmck4qNlpeal6aloqCdlZWXk4CPlIV6jpKDjJZlbHJncHFfRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV009RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVTE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmqCkrLejrKmlrq62qa+0uqemsLfFt7G2vsDBtbS6xb7MxbnCv7q/ucS4wbmytayqura7ub60qq2wtZiYp6uqq5usq46rvZ6rrrGjq6CxrbOurraxubepra6xqLWvs7u8ybKqtbSxtbCvp6GzoJqoraCllZabmrKjraCmr5ahpJqako2ipaeyqaKnsqyqtqWvsbWvpJmdraeamJ+Zmay4opeTkI+YnKGYl5SrnpyTgJOYjZ2cmpaRipSTnpqloaGgmJWRk5V6i5CFe4yKg4uSa254bXV7YEVhallJSFlbPXtKR0U2QWJUaVtNXGBKW11aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDXlFcLipCL0pHUFtIM2NZVEpEmZagsKixqa2lpK6utai3tLikq7S3ybu0urq/vrS0t8PAzMi7w7y2vr7AuL+8sb2up7q5t7bBtqutsbiUl6auq6eisaqUr7ukrLKyp6ijsrOwsbG1sbizqK6rsae4r7W0w8W2qbS1rLGuqqejtp+fp7KgpJScmpWynqecoKqNqaOem5aYpaWlt6eisrSsp7GnrrC1rKWZoKyom5ydm5SpuJyUjo6LmZyil5CYpaCelYORlZCdnJiWlYiXkJebp5yjoJKVkJCWdoSQh3uFgYSNi21xd3V7flxLZWxcS05jXD9ie0dJOEdnV2VbTV5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnRmFMViUtQi49RU1RPDNyakpDQ5CZpa6lra6rp6SwsrOqt7C2oKu1ucm5rsG8wrezsbXCw87Fv8G9tL2/v7q/vLPEqKm5sLa2v7yvq7OynKCnsK2lpbClnrK1rKuysKypqLS5rLSytay0ramsqKupua2xsce/uKS5sKmtraaorbCmpKSuo6mcnpybr5qio6OjkKyepKCfoqqlprmlrLW1paqrqKyvtq6jnqOoqpugmpqSpLSajomNh5GioJWNlJ2fk5KEjpKSnZuYlZSHmJOVmaabn5+MkpCNkHd+joV8fH2HiolxdHJ+fX1cU2RvXk5aZl1GRJZaRztObVhhW01gYk5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhkSEorOkk/M0JJUyw+j2s8R0iPm6qqoqmwpKiks7SxtLWxsaGrrb3Luq7Au8extK20wsLRxcW+wLK+wcK8v7e8xKest6yzuLvAsKuyraCkp62pqKSwo6qxqq+ssK6vrqyzu6e2sLKpsqmrpaWjrbqsqrHCubWruaioqK2qqLGlqqSirqqoop6co6yVpJ2YnpmsnaKnqaKspaOtrLixsqCpoqCrrrCsnp+nqKmZpJiZj6CnmIaDj4qLn6CPi4yWm46OhYeQlaCdlpeVhpaTk5eknJ2cipGPjYl/foiGfHd/h4WGdHNxiHVsX1lgbmNRc3FcSzuEfEY+V3VYYVlOY1tOVVZVV1BcYl5TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5JZ0RGODxCMDVFS1gxQJRaPkxFlJetp6Kqspypqa+2rLi1rqqlq6q9yLuwvbfCr7Css8TDzs7Dvr+0wMLEusG0ycSsr7etsri/vrOtrqulp6qwqaeosaW0rquwrq2xsLOts7ukuLOsrK6nq5+inrC3q6qturaltbWjqaesrKqtoamnprGyo6aloaGslqqhlJqgpp6koqukrKKfp7G3ra2jpaKbqaquqZ2ipaSkmKCZlo+YnZOCgpCJhZygjIqOjJmNkIuDjJejm5KQm4yTkpGUopmbmYqOiop8hoGCg3p0gISCfnR3i6OHeGpeYG5nV2WHZE5AZ5JMRGJ5V2JYUmVUTVZVVVRPXF1hVUtNaVdVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGP0hGRJaSr6SjqrCYq6mttau2saulq6qpvMDAuLizu7Wlsq/EycvRv8G7ucC/wrnBusHErrK1sbO7wL6zsa6sq6uotqqmra+rubCosbGvsqy2qra1p7S2rKykqaqco56zs6iopLS0oLWtoKmoq6irp6Crq6i5tqmqqqmiqaCsm5KpoZ2gpKKmo6mdnKa1rqimqaKjl6Wnp6qcoqSjn5mYn5GOj5mOfoeMh4SenoeEioqOjZCMhIaVopqOjJqRkpGPkp+XmJaLioN/dIaBf394dYN/e3h+gYidj29xZ2dxeFxgc4hqT12YVkhteFVkVlJiUE1VVFVQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YP0MsPkxUXy9KajZPRDuVjrCgpautmaulrK6ztK+qpa+pqLq+vMCwrriuobWvycfI0cC+vbu8wr26w8G/v66ysrG1vLzCsbKzqrOopLWppa2zs7mwo662sa+yuqu5rqqutauqnqmrn6Kgtq2ooZ+vs6G0qp6op6qjqqGirK2ova+srq2hp6ifq5mQr6GYoqGop5+ompmqsKmjn6yioZOio6OnmJqopZeXmJ2PioeViH2NhoWEpJeFgoKLho6NkISEk6CWiJGdkJOQjZGclJePiYWFeHSBf311eHmAe3RzemmBhqN1aV5la4F1Z4iLfFJYcF5KeHNTZFNRXk1NUllmTkxWWWVZRlNpUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExoOjM4Xz1hZD9GMUNQW1srSE45VUE0kI+xn6Smq6OmpKymtLKxqqSwp6q4vsG7r6e5qqeusMnGyNHCvL++ub6/vMm8wbiwsLSxuru4wLKzu6y4rKK0pqessra5s6enu7Wttr2wvKatrLWrrZypr6Ofpayqp5yeqrOks6iaqqeppKmdo6mnqb6rtK+unamkoK6cm7KjlaScpKWfpJqaqKulnpuqoZuSm6GlnZiXqamRmJqTkIqCj4V+j4KAiJ6Phn99i4eQjo+Ef5Obk4WTooyUkouRm5KVh4h+f3F6eX58aXd8enVwcH1ohXiEh2RgZ2NyhXptZ3ldXlZCV3ptVGFPUlhLTE5xdF1IWltnWUVVZlBEPkpORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj07RFg+Ko+UsZmfn6mlpKGrpLeysqWosaesuMG9tbCjua2oqLDDycnMwba9v7W3v7rItsO1tLO1sb24ur62rbm1v62hs6aqq7C1uLSrnry8qLLAs7qgr7O1qqyerrCjnKWoqaKenKWxpq+gn6qpqKKpm6SooK28qK6wrqGro6Sunp6tppefm6GjnJ+bmqOqopqapKSVl5Sfopablqasi56RkJGMgoqBgI+Ae5qVjYl8fouGjo2LioSSmJGHlKOJkpKHkJqPk4GHfHlrfXZ5eGJ7enFwcXJ4aIBzaoNnZGhhbnOObWJpcGBwQVx4a1ZeTlFRSkpNU1lWTV1ebVdEWGBPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQwQmhZMTNTPWVfREw2S1dlTyo8Mk9aPSKSmayZn5enpKKfp6O4r66ir7Cpq7jCurOtn7mvq6i0usfKyL+3wb6vtL63xLbDsa+6srLAtbu+t6m5t72rpLSnqKqwrrmxqpu7vaSwwLW0oa63taanp7GzoJ6kpqehpZmeraeonqCprqegppejqKCwuJ+jsa+hrKGspJympqiampufo5WdnJqdqaaWm5+okpiTmJ2SmZahqpCaiY6Qh32Hf4KOfHyhjY2IeYOMhYmMjIWHkpqOiZWfiZGVgouXjJF9hHtzb31xc3RgeXhpb3Bwb2l+cWN6bGllY2Fmhn9gW3Jqck1Nf2lYWk1QTEpIUFJRSU5cX25TRFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaaEgqPi9ZWDUol52lmJyWrKCfoaSht6uxpLS0qqi5xLWyrqC3rK6tsLXGyMC3v8G5sLS9t7+7v6+rvbC0v7G9w7mpu7q3p6i1qKersK2zsaeavbekrby2r5+xt7CopaevsZugpKCjpKGXm6+moZ+ip6+ioKKTpKSjt7ChprGrn6yjr5icqqWpn5eanaWTm5yanaaqmZycpZaVl5WcjpOXo6mhkImKkIZ6hH6EinqPl4qNhnmCh4SIi46FjZOYjI6WmYqPln6Gl4uPeoB6cHJ3bm90X3h3ZGxsa2log21mcmlrZWhcY3OAX1prdWlaSX1eW1hPT0pISFJVRjI5X15sUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKjsrMTM5Y2w4NEdBZltIVERVXWhFLjsyYVQsMpajoZeUnKqdpaGioLeqrqC6uaasvcSzsK6ita+sra+0w8S8s7+6t7Czubi6uLuurcCztLivv8G4rLy6taais6qnqbOrrbKim8G2pai1tamesruqp6apr6yZoqeco6aUmKKypJmfpKipnKKgk6WgpLmopKeup56loaiSn6mioaCZm52gkpuclqChq5ubmaGVkpWWmo6Uk6OopJCIio+GeYR8hYV9nY2Ki4Z5gISHiIeRhZWTkoyQlZSNjpR7g5iPi3d+e2x0cmxsc2F4dGhoamdlb4RnZ2hjZmhqX2hiaWZaZXtjYFNzVFtbU0xJR0lPU0AhKmleakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OGROJzKepKORjqSmm56enaO1rKequbeorMPAtrCsorWup6+vt8DAvLLBtrGusra2uLe2rKq9s6+ysb2/t667u7GlnrarpaW0qauuoJ/Cq6ilsLOqrLW7naiqq7GlmJ2qnqakkZmmraKYnqSpoZyinZegnae2pq+qrqGhnp2hlaCmn6GgmZuZnJKZnZSlnayimJeelZSOlZeMj5iaqaCRiIqLiXmFd4KCgp2Hi4KJfH+EiIaEkISWlY+OkJGRkY2Se4OVjoZyfX1meG9ramxndXNrY2dkY3R/YWRlZmVpamNqcVleWF5tZGFOaFdaYFZJR0hLTVJYPjlgbGlHQlRTXFtJSUdGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0FmSCU1m6SfkIytoZmYoJaktLGisb23obHGu7mwsaO3rKquqbm9u7utwLKvrq22r7O4s6irubGvrrS2u7avuL2tpp21q6ChsKWrrp6kw6CypK6xr7ettZ6tr62uopmdqKqlnpWbqKWfmaWjqJ2aoJyUnJ2tsKa5qK6joZqanZmeo5qknZeemJuUmqCSqJarqJuTnJySjJWZjZSUmainjY2KiY98gnSCgYqYhYd8iYmEhIqMiJKEk5ySko+QkZaOkH+AjI2Db4B/ZnhuaGtqZ3Fya1xoY2Jyf2BkZ2ptbGdqaWZsXGxtdXFhVGJoZGVZSUZMTU9YUVFWYWWBVEBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFJZUMnNJOimo6OsJ2ak6GaqbKwn7jAtqC0wru9ubGltq+orqW3uLe3rLuvraqrt6q0ua6ls7WxrqmxtrawsrW6p6iftqmenqmiqq2cqcCYraSusLa1ra2fsa2wqqKbnKOsqJuVnKejnZqpoqSWmqCdkZujq6qpu5+opKCYmZmeoI9ropaYnHGClpukgHWSqqeelZWfkYmXmYCWiqCPeYaUjYNuan53g3FshouGfYSLhm9eY2BnhJeGa4uQlJN1d4uEfoOPf2aGgGh1aWZXXGlzbk5QamNmcYRmXmRmbmxpXl9fiZCEhmdPS0Q4RVRnXkpHUFBVVUtIU2FvdGVGW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUGQ9Ky+NpJmHlbCbnJOgm6quq6O9xa+pt8K4vbytprawpaukuLOys7C5raqnrLSmsLWjqLi2tainrLayrrSts6Kpn7SrnqKknKeomqy8laalr7O4ra6lqK6rrKWhnpygp6abmKGmpZubp6edk56gmJCeqKqjtbCjo6OdlpeYl6OIoY6Smoehh5SdoX+lf6ernpOSm5KIhHJ4jY6EiKF2iI1pl4hmfXN4oW+Ih4R+jXt/oaCfmYB7h550iI52m4psh4GDbWhlY3pscWJUhm1jbGmYcVhqb26GV15pW2tqW4hwbXlyhmiHhFpeRk4+Rl5NRVJWVlFRUldUZ15MWEpSUk9FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVZhNy8ojKaXg5ysnZmZnZ+qqqepv8Ousbq8t8C+qqS3sKmsprK1rq+ztquppbGtpbWznK21trSmp6mzsa2yp6+fqqCyqJ+ko5qho5yutZWkpaa2vaasp6qqrKimoqCYoKejmZmmo6SYnKSplpSinJWTo6WmoLekpKCjmJWTmJOciK6PmJSJqYuXopuFsYCkrZ6Ump6VeYLUqH+HlMGbx3l3saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHqBbJaxq7B5aGtYsa5vZWm8krxuaHltco/YflJrY7ayf4FxlHWaoaqQV09XYU9WTkZUW1hRUFKMXFdcUEBdRVFOREdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mk4GmqZ+XnJ2lrLKosMK9srXAtbe+wqumtK2tqaevs6qvtrSoqKa1pqe4r52zsraqpaSnsa6tsaaqnqeksaSioZ6Xm6Cfr62VnqKftLqiqqihra6lop2bmqKon5ibqKCfmJ6np5Gcp5uUnaGnoqCwo5+fo5aWkpiSmYWvamqKjap+Z4SVh61lcJ6dlJqmlXGuoaR+d7t8a6GPdrFfarRbpYBmnJFgZoF6Zn9qeGqpZb5yZ6aMdrJqfLF4dJKTY21tp21bhKBFaWaHlkV1nGB9Z3ukp4JZX4uraYGVeHpqpzdKr1tXVGxjW0tOV19cV1Y7TohPV1YvSVRUSUNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuRopWCrKelnqOkqbG3rLO9vrC3xLK3usKnqbCrr6mpsK+ksLqwpKWus6OpuKmes7Kwo6Wgqq2vq6+mp5+jorCco5yYlZebnK2ml5uinrSzoauboq2toJ6Zl6CiqZyZnqSgnJmhp6SQnaOal6GfrJ+mp6Cbn6GWlZGXkZqFtZu1eIWpmbWZd4ezm7d/lJaXqZR+a4GmeoGFiJKUknerZ2uxW6x7j4eUdIhwj4aAgIiQl3iDgouXjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYp0uUaFuW1RrZ2BMS1xkWFxaQj6weFdYQSNNaUVCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOWFVNTAclZ+UiLOlpqGuqaezrKm7tsKwvMKtuLfBqqytrq6mrrKpoa+8qqGntK2kq7WlprKzp6Oinaeqsqiwp6Wen5+vlp+ZlZWWmJ+topqapKi1r6Gpj6moqpuelZigpaiZn5yjn5ygo6SjlpufmJqdo6ubppqdm6Kgl5OSk5Ocg9WTmblwsMJ+xoZ81pSbu3yalqWQjZyNpHuOhqOCpYJ6rHmPnVWve4l+n2q5Wrl3hoN8poKTfJh6qnmOnI97sW2OhHSQvIVvlFCvp8WKUaB6Y2CqYnNyh2yXiGBTtbTIhoCJfGOkM0Kddl1RamhjUEBYZlpkYUpITWxLW1NPWWZaQ0Q/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUTcyJZuik5ixp6ils6qltKiku7fBsLrAsbW1vLO1p7Gwo7Czpp+utqibqLmuo6+xoLO0sKCknp6nqbCotKmknJ2eq5eZl5aXlZahq56al6itsKmjn4+soqeWnpecoaWhl6GhoqGboqKnm56hnpWZm6agnKeVnJufoZmQkpWRnYiybmi1cauHb46mcrRzcrZ7mpikjI+cjaJ+kKClfrB2g5HS0XVbrnyGf6Rvm6qma4aEfK19l5mPe7Fzk52OeLNllnSEnm+eZpRSyItawlyfeWJfrV92c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2pfbGlPVUZJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi+hnJGlr6ykqrutprSlp7a7vLK6v7e2tbq6s6W0tKGxsqOfrLCkmKa6rqSxsZ20uKqfpp2hqqSxp6yppJqcmqmelpWYmJKSo6igl5OmqrGmopaTrZ+lkpShm6Smn5Sapqahm6OfrJqhn56QlpyinpyllZ2VmqKflpmWkpuFrHt3qHajjomHqW+tioOog5mZoYmSmoqif5KYia6Ff4KzXHKzUq5+g4Kkf3HXfXeEfY6dh5mZd6+GipGch3e0YZplmoGClGySWrBYS5p1mHlmYK1edneHZ5iIa16vd5Wej3hsNXnIrrJfQVRvXmdgRVBsX3FtVlVNLmVjaVNZUTpBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjg4n52UoLiwl7TBraizqKmyurizuL+5t7K2vbWluLOftKyfoKirn5WntquosbKrrrSkm6mgoKihtaamqqOZnpWloZSUnJmSlaKlmpOQp6yvpqCVmamfoo+RopmopqCVmaWonZyknqydoZ2gjZSfm56gmJmclpeioJOYkaadhql9faV4oY+Og6pwrYyCp4aWoKGKl5eIo4KRh5SqfICLnXlvsVqng4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqY3J7gWuYh3FdrFqJoI5rbmVPSkOhXFpMdF5iZU1aYV9yc19KVTZKmpNZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljo+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE+OKGdmZm+q5e0wq6rramltLC4sbW/ubqzsbe8qru0n7CknqWnp56UqrGpsKq1rKuvoZihoKako7mio6ugl5uRoqCVlJ+alJifn4+NjKmwr6adl5uopp+MkqSXqKunlJepp56foaOspKGeoY2UoZifoJKdl5yVnqCVlo+rm4+ubXK0cqmMdoqmc7R5dLOAkqSikpyNiaSHj3a4b4x7i6Jra7ZZoYZll5dpoaKnbZNytHSTmH+yaoWTiK1rdbNhnWaib4eSapdcrWBNoXyHkVJzo2x5f35vmIZwXK9WPJx3ZlRvbi5cp09iUmtlYWxZYlxgcHtjU1lRPj5tcDNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjgxQjilmpuduqGbssCuraurp7epuK+0wLW8sa+5uKvBtqmqoJumpKGdkqqqp7ajsqiuqqCXnKegpKu5naOtm5aZj6Wjlo2doZuZnJ+Qk5Srtq+nmZScrKqXjJOlmaWso5GXqrKjoJ6nq7CYoaOQmaKXoJuWm5ehk5ypnJSRq5mH1JKau3Oww4DDhn7Vlpy4eIiQmIyXiYyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbpqIcW6NpHS9XXd9W2F5vGtaVltqel5qYGRmYm13b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5qeobyil7HDsK2pqquxp7mvtsWxurKuu7CuwbKspaKeo6Gcm5GqpKqypLSmraSflpqqmaasuJyirZiVoZCloJONnKOemJ2akJaTr7mxq5WXo6inlJCWpJykrZ6RoKirn5ufqaOynqOljqeilKGanJeVpJiPsKCSlaqehZCZtYCQkYy4lXiCk5u1d25sbnNueY+EjolznsG7vJp7gbKocIB0kbiDfIaGi4eNe4qGjZd8pLu5vZx1erOjdHaXdXSwdZmeZoZpjbV0cnB3toxef3l9iWeDeW15YouscHWFf1lbp2pEZFlTZmBjXWNRZ2ZxbHVCTlBMRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz07PKeeoKC/pZa0w7Ssqqesq6m7rrDFr7WzrrentbitqaOipp6gnZmUrKStqqa1qKifm5ago56rpL6moaqXlJ2QopuSj6KoopOdl5KYlLK1tq2YnaSkoouSkaabpaublqikpZyaoammp6OpoZKtn5ejnpeXl52ej7CplJynoo5qfmmcp3iJc36aj3R6ZYd6vb7Aum6Sg3GUhmByalpemolhZIeOlWtgf5VjbZx2YpRrf5qVlGVeYGNxmolocox9hpVnan5xdHh9fWJbd3SBaFBcboN8e4tqWGt6gnJJSm+FcE10TUVXXGZgTFtYZ2NeT1ttdWlxUk9ERU07SEk8TD8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6ooKihwaOatLq2oqylrqeotbGsyKyws6y1o76xsqago6mdo5uamaynrqSktamlm5eVoZunrKi+p6mmlZSblaCZk5ilqaeRnpCPmJ2wsr+sm6aep6KJk5Gpmqikmpurn6OZm6OnraKfqqKasJuVpqCXlJ2fnZewpZiiqJmckZ2co6SZp6OanJqampCWgWhufXF3kZeUkYWKtaqNhpiVjoqMl5eHlJWKg5KTkYmNkZOYlJiXmqCimpuUoJ2OgnqlhmtpfJB8gHSJioFxgnh5dnaKgHuKanOBdIN1Y3d9dmtwe21gY1xwZ01ZWWVqX1dab3ptbWZTT0ZTOU9aTlJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1AsqCzob+ipLGyt6CppbKnpbC1qsmrrbGltabAqLSgnqSlnKSVlqCrpqyjo7asoJmWlqCXramlwJ6rpJWSnJeemJOUop+eoqeTkZipp7LDr5qrnauej5aWqZ6qnJygrJihmpyipa+moaSonq2Yl6admZqhnp6csKCdoqaVmJOYk6CilqOel6COlpSLio2Ol62PfJWbgpKCi6qohoGYloqEjp+Ie4SQhoWZkIeGiZWOm5eNkJieo5aZk5GdjX+NZqGzroSJhHZ6j4p8dnl6b2d5kIGAiWt1gXmIcmhzf3p2g4iCa3RjeWZgaWRiZGZqWWt7cGlqXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rKuusrKgqqaxraKss7DFsKqto7OuvKS0nKCmoqGdmZeopammpKaztZ6VlJ2ZmbCmrr6gq6OQkZ6amZSRlaGcl6mchJ6prKK0yLOfqqSrlpaXmqedqJufpKuUnp6cn6quqaWjq6Gtm5+goZilnpyfna+jmZ+ok5iYnZGlmZipnpqXZoOSfGV+jpqPY3mNbGhrepGkq2tlmph+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKOfmHNsbnqEjYZ5WGVdhYFebIqJgHZcaHN3d5GAh4Jud4J4gHNteYN0d4iIjoN7aoVZXmt0ZF1ziWlqfHFsY11RTVdKZFhASjQ9Rjc/RkQ3MTw9P0FDOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+rs7CqpaitrrCmrq2wvbGpqKStr7GfrZefo56hmpmmq5yso6aoqbKunpWjkKKvpra5pa6jj46aoZmTkpugmZmllnulrKKos8O3pKKnr56elZ6jnqOco6mokZ6gnZ+qr6qro6qfqJumn6egrJahm6WwpJicqpWhnpqTpZieq5mefr6DiHK0coSdhq1oeLnEuHGToqN7ppiZc6qCfMvAwLtxi6KHgp98lZiJnsC9gpadno2dwcF7gXuRjJrCv31rpbFvjIBvynp/m3eRg46AdnmBf3lxen+HcXiFjJN5bXaSYmZfeGRfZYJjXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqJSjr6mwr62msrWvqqamprGrn6uYmqKgnJuqp6Kcq6KlqKWktKOdopKmray3s6evopKRmp2lkpGgoZecn52Hp6ukq62/wLChqa+pl5KfnaKZoqOqo5KgoZ2dra6orKajoqegpaWdramRpJupraqcnaqcrKGWl6WWoaOYnH/OlHl6pIF5lZabX66PXo6ngaGgfKeVm3Srg4CvXmONqnqnh4WgdJeSiLNjgquGoY6Ns2mErnR9loe4YYKtWaPNbo91e9p7f5lwfoiSdX9le4h2dmt9iG5+hZGSfm2BjmBxa3BnYF95ZFtwaGpkZmBSVFJXXktPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3Cv7+1tLC3mJ6RpKqorbSrprKsraykq6ewqqCnm5mll5yir5+gn6ino6Whn7Csm56Vp66tsauorKCUkpufpZOPn6WXnqijnq6kqrCov8azqKmxrpaSnZyil6Cpqp6UoJ+cna6vp6qpm6enpKGrkq20lqWjqqqeo6emobCgkpqnmqGblJSRl6BwhYyXdYWoh3GwfJ1yrH6hnoGlj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKKMkYudfqt7iZOPn4B7rVacxHqPb5LBfYGVbXVwjG1ldmWGb2F3bnJviYqRkINtkI9kb3R1cGBnbWRfb2lpbmZjV1NcYVpSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuv1MbGsrSfnaOOo6OhrK+2rqiwp6mqqK6rq6eipJ2ZopWfpqqfoqWfqKiin52wrJealqinrqyop6mel5Sao6KSlKGtm52mo6+so6y0qbnNsa2nrqyWlJydopifrqyclqCZnZ6psampqZurqaOirJuvsaKorK6mmaarqqqxopKXo6WblJKFpGqkdYl6qXR6snCCpYmZjHCIoJqHpGBgUqyEf66CmnaugaaGhp96mJaGe2aAo4mkmYaBo32pfoGUh65efKlVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2MmI+BbZqSb215d3dvbGZkZXFwZntoY11XX2lYWFVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNjYqMVBLTCMgQTlENCwnwsnV1cChmauooa+inrC1sK+prKOopqqqq6mkpqCbpJ6dpaemo5ysmqKroaSfr6KdmpKqpLWwr6Cpm52WlKejkJqiqJ+gppyxpqOosay2yLK1qqyplZGcnaKZn6WznJqglJyfp6uro66arKmioaqjs62iqrOxoZuqqK+wtqOTlqSnmJuRfKpsnoSHdat5fLBvgqSLiZ+WlZ6UgdK4tLjJgIGyXl+UqYOkiIegeZiVmniqyXSZo5WnqZCSm4x/m4maxsZ4ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SPkJ6TfHCXkn9wenR8e21bZmpycWaBal5iWGNtXF5ZSU1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC8+LTVPVFEdHDs8RjIsJKekwMa5raiyrqylopyyuayqoaabqKaqrKmmoKalmKujn66rnaWgrJqeqKWdprWeopeTqKq2sqybpZyglZClrZGZnKejoKqnrqKjp6mwtMKxsqqtqJOJmJ2kmqGjrqWXoZWYnKWmq5qvna2opp6so7esobG5r52br6eztLOklJiopJqfjoKdTniagX+feoSjfIKkhIamnpyek4S4e3x5uYJ+zMXCtniaoZGLn32alpeKdp6YiqSYo6h+sIWchZ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpGjl3x+kpGKdHpzhH5wW21ud3JqgW9aZF9obmJkXUtNUVRCSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mprKSruauvoJyhrLOzpp+glaWura6qp52mppqjp6GyrqKoprKgmamklKK1oqOVl6GptLmkm6Odo5OQobKZnpynpqGir66dpKihtbHDsa2qramRh5GcppyjpJyll56YmZmlpKiarqGupaaXsKW8raG3t62dnbWyubGzp5iesKKknoaP0bXDt3mHjoWRk4+ApniUoneMoJKEpYGKcaqGhLRucmqZo5uVip98mJmGh49zr4Klm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+Tpph+jIyTind8eY2BbWl4aXhzbn90XWRkbm1laGBKWlhYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklknONiq2/v7u6tZ6XqKSttaGjmZWjqaeuqquZpaKfpaCgtaaiqKewo5Sro46kraOdkJqaqrS0pJ2lnamRlJeuoKCep6Scp5y1mqCqo7WrwrCpq6mhjISPm6GgpqKVmZqcmJqZpqSmmKunraKlm62nvqyVvbCsn6Ows7qstKebqbKlqJh6qJB9fLB3ioGkpYicbbJvoYetfKGOg6eVmICsiIWuhZ+UqKChloafgJmVgHuSfquAnZqWiqp4naCPiZOSgHmvXaOBfKanZJ2AfJd0a65dpWtxhZldYFuMoG6VkaaZg5SNlot6eoKWf2tsf2J9dG1/emBnZXFvZ2doQ1lgWz1LVDJVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZWV1hWVVVRSEZJSiMoKLySmoSpxsK3wbSfm62frrilpI6bpKOgr6+qn6Sfna2Ynrmgoqqgr6mZraGQqqmklomakK6wrKafp5utmJiPrKKhnaaimqWdrZifqKW2qL+vpamknouAjpuaoKaekpSampOamqWjo5moq6ujpJ+pqL6kl8OsqqOhrLK6q66noLOvqaqYdq9+kIuchYd9uq2KmGSwjGWVrX2gj4OmlZqBrIqEsIWlmaShoZCFoFtsaoGzYH+te3uCgLFsZ26Zl4yIsFt9tFukg2vIomWfgHu8WXa1WrJ9Uq+AeqxYgKFtmI+omoqXkJaWe3iNnH1kc31ig3d0gHxhamZxbWZlZU9VY1tCVF4+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5ytpqW2qKGLmqCfnbOzqZ6joJ20l6CzqKqrna+tnaubla6ooo6Im46vq6imoqeZrpOZj6iaoZ6ln5mjo6WZnqOpsqi8r6Sonp2OfIualaGgmY+SmpuRmZeonqCYqK2npaWjpam7n6DGp6Wpoau0tq2up5+8rq2slYGpkqOvjpuAhqSXmI+AgLjDuoOOnZOFp5ecgqyKgq+IppuapaqQftW9wqpio7+9fH6jgoPXuri1hZSTg569voRqo4Fvq4RtnX96srDHg2qrsL2teHeivrt0gJaOppyPmpGWnHmBkJp5Y316ZIxmeYJ7YGtla2piUGJbU2pcQFRhQk4pPTo0Lx4fJB4lMiAdJCgwNDk2Njc3Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWztLG/ubK9s6Kdrqals6adi5ilvqm3saihv6amsZuesZy5qJ6trqWmlZSvrJeMg5qRrqajrKGknKqhmIujkqaeqJyaoamimZ6gq62pua2oo5uXk3uHmZGmm5OPkZiYjpiTqZmfmKmooKqmoaOru56pxaOgr6Ors7WrsKqgu6ivr5pzdaqkt4ZliZ9wZ6yPio9tb3ekkJmfgXWumZVwj4txlaejm5iupHJtbW1lindubYKZcYB5aXFpZ4mVlZhxaGmEhmdwhmRdiWNqb1ldZ353pmBicY6Sb2ZkgI2SjqKYl5iQlZ58h46UdWaGd2iNanl+eWRsY2ZsYktkWEprWTpRZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOqurmys6upoq6eo7KpmJK9scPIvraqnsCsrKOgp6yfuqOkrayspo6WramQjIWVlqyepaqhn6OjoJGMpJKnmamZlqOqoJacpaWnr7qrrJqbkpJ7hJaNpZeNkZGYk42YlaeUnpeoopqwpp6irLqfsMGopLOmrLGyq66sqLmjrriWiqGopbadiZail4apmpCUnZOqs5mbo6ugspaioZ2gopygpKGVq6aMkpKMh5KcnJSQmZOYkI2VhoGkmZeVjYuTkoqPhoR+Z4p/dIJ2dIeMcadse5WRlJOBgY+Pj4+dlKCVmJaggoeTjHBoj3Zwind2fHpqbGRkb2NVYFhAaVtIY2FPWitGPSsmITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERkpLS01QUFFXVFZZXl9hY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW3rq6isKStn6C1sZCOq8W8xLu4qqKlnZulnbCpo7annam0pqeRmKyii4iJjpynlqukoZmnnp6TlaOXqJupmZSmoaOPmqeZobW6qKqYmpCNfIGUi6GUipSRlZCQk5elj56ZqJ+ctqOdp6y3qK7BrqO3p6+vsK2qqrO5oa+9mZKmo6a2opKdpp6NqZ+Nkp+jrK+aoaOxqK+XpKCco6menp2cl6uckpmhm5OQlqqZjZiYlpCVnpGIoJ2VlIWSjJCMlIqAfmaMhnWGdnmIg3OcaoaRlJSRin2MlpKSmJOhk52WoIOHl4Z5cZVyeYl/cXt/am5kX3BpYFtgWW1jUGBkUFs6R0dEPTI9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFiYWFhYGJiYmRiXFtjl5Wkp6Ows6yuo6mnraCotaqQkJ2ks7uvrKyio5p6naKxpKWwqJabuKailJipnI6GiombopCunqOVp5+hkpeYm66Lq5aPqJqojJioj565tqSlmJuNiXmBk4yak4qUkZOQjZGWooydnqien7ikf4SvtaKvr3WkvqOyoHh6oKuyu5V3raSfioCqfmRcYnafjqSdg5d+bpOznKOnrquiZZ6fknN5mZdwgJiol2x/oqeJZZylnJGXmJaLkZuRhZ2akJWCkoeOjpKJhXdrj4d2hnF8hoCAYWmIi5WTi1t2lZFnaJCOcnulmJhkeZiGgXeXaYOKgm55f2twZWB2b2traFtmZWJib1NbPk5OTlJHPUBUQjkxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS0xTVFVZXF9oZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpuWpqOhsLGsq6mlqK2jp62kkparta+xppqqpquXc4ucr5+oqqaUlrigoI+co52RfoiIm52Nq5qjlaeino6XkZ6Fda6QiKaap5GWo4iburSnoJmYi4l0dpONlpOKlJGQlIyPk6COmp+mmZyyloCMnLWds4ySj7ynoX6nonqjr7eBjo6nn4SLhY+xqa+MiZaimnmBi6yGnJ2ip6moh5WGmHalm3qHm4GXpoKBe5yxeoqFoJeZlJiWgZCWloSZmWN5h5CEjY+SioNtcI+HeYBxgIGFf4Z0hoSWkniWaJN0oJp0fJmDoJyGmH6RiYGDmGqNjIVreHtxcGdkd25pbGtbZWtqZXNbXklUTFFARTUuWVRVNikhMDk9PjY0MzU2ODs6PT4+QERIP0lFSktHUlhaWVthYWhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicmKOfpq6tq6isoKiwpqeppZmUrsa9sKGWpqi1no+DnKucpqGfjZC+npmNn5qgkH2FjpmXiKudopafoJGNk4mGgJGojoeinKOTlp2Gn7myp52ako6FcHWQiZWQipSPj5uLj5GfkpafpJaerIiftIm0mq2Kyoeqroi3hY2wg7Gug6mNppiNnXyoj3J7d5uOppZolaR5tIufnqaokpnCgX+riJihcZ6AmaR9l4WVsYChfKGUoJCYloCOk5uKl5GLfIWTho2Vk4mDbXORhX96coaBhHyEdIWCl4GPxWaAqYePomueg6GZgpmAi4yDiZhwjpKFaHd0e3ZnaHVwZ2dsXmNvbGdsWGdHXVFMMkU0Nk1gYzcmMzxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFldY2ZoZ2JiYmJkY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubCqq6aalKCjpKqjlqSptqOvf6CnnKWenYmTvJmTjaCRnZB5hJaWkYermZubmaGFj4x3m5yPoJGInqSblZiXhqK4raWZm4yMf2Jtj4uTkI2QjIyXi5CRn4+Tn6GZoah+oaeHrZ2glq6Pnp2dkYaBoI2rr4akjaqajJp+onaAmZNqgat1Tat4h42dkZuop4Cqq32DoXt6p2mef5JrZ5eGl7aJnn1uYGRZg5Z+jHtkaIpymX15lWxde5dtX1NwhFxfbHmDYFllgn2EgZhxp6prg6NucqVwn4OeaWWfbFttiXtlWV+Df2JXUG92ZW10cmpqb15qb21saVhpT11XRTlBNEdDXms0LElDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySoba8q66imZegoaWtraCcrbWiqJKgn5+mm5mOmLSZkIqejJWLdYGUkY2KppaVmJ6ef5KFhqykh5yRipiol5makYelsKailZqIiYBoboiHi46OiYuNkouQkqKMk56gnKKlf5OBj6OhlKB3nJaPp4Ohp3+Gqa2FpXmKfYSafaJwcpOHlXqdjHlth5yMmZCbqJqPh5x7gqJzdqZmnn52pF+Yen2Sc6JumLe0unOSh4F/tahkgca4e3CVt4txgJukY3Osq2B9ap2zfm59h4OOgouXcYCjbHOkc56Df6RfnZmzlXB8l560dHNbnrKDamJvc3VxaG9Ya2xyc2ZcaV5iS0Q9RDVRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pXYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS4ta6toJuinKOjpa6cm7GtrJOXoJigpJmak56rm4uIkXiLhXCAlo2Kj6CQk5Sdl32QiY6ooIeYj4qRopObmoyLqKikno+Wh4R+a3qGf32PjYOLkJGJj5SggpadoJ2gn4uJd5yYooygcqKLiKmInKaQlqirf66MfXqgmXqjk3iAc5aHjJx9lqCHm46Zm6aGomShfIiWkJuNbJ5om41umpl7gIqnfXJoc6mCnIJzqmeUml2bhXaEnWiqaoC4ZlyocIGcYZWMXqd2dYmKf55omnWHk5KYjn+fbpqQbKeZXKh+d7trfqpbjoRdtGdcbnF5d2tpW3FqeHliX2ZYYkFQRU43VkJSbjRLWlpfTlpDQDE1MTs7N0g/OkNHVD9ZUlldPkRiXlZgUWFjfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrabqIljlJusurKwrJ2mnJyon56um52wqKudl6KZoZ+Ylpago5mGiYxqiIBxe5eIi5aWhJGUmI96ioSWo52KlI+Fi52RnJuJj6ijoJmLkYqAgGmBhnl/l4x7iI6Oh4+Wmn+Top+gopOYcmifip+PjHCSjIGpiJmfo6igqH2wraOiuJd2o7Oio3+IlHidequaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJp8nJl+c6paXW97lot4nmJMfnp6hWN5l0JNn1mianF8jm2BiYSZdZt5h4mxs39/m5OndYCdbXF8lG+ZcmqkXZV2SGVjYHNwfX1uZWBsaHZ8Y2RhUV5WXVRWQFlFUWdEU1dbYlheSUQ9Qjg/QjpJRThMRFdBVlFbVkRGYlxaYEtgbX5xRUM8VV9iWmVqVmdobW9iZmZeYWFcXV5haGJfZWR2bF5lZ2ZsZGZsaGhraZOdgLGumYRTX6Cns7mzs6maooycq5ycqZOhq6ShqI+enZyamZWYoZ2Wh4aJd4WBbnmVhZCai3yRk5aIcoCJk6Ccc5GQgYiYlJ+ahI6onJqUiouKfINshYVxgaGMeIWNiIeSmZV8kqShn6OIroZ9tYSOnp17pZZ5qYKWnZCKoZ19p2h2bX6Zc6BzcXydhZhvk4KufaSDpp6agaNvXqhndaNjb6VhnNOQfHqZeHJzY6KFkH6icqKOdWuPs4tggpiJc6qyqLx/d4Ntfr6mqbRenG59cZdvgXOicl2jZ3SmYWimbZvUmXyDm293eZdrm3p3l3NtqaRnYGV5cH+Da2dmZG11eGdgYlNbZVFRYUlXSVRfV1NbZWpcZFBFQ0tNSktCSkU4UD9QTVdTWE9SUmBmZWlSY3d5d0lGRWNdZFpnaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+wq1RcS36pr7G0sLOjnJiFmKigoKONpKigmKmJmZeYk5mSkqCYjoeFe3B9hGh9j4KUmoF3kY2OiW9/hpCTkmyXlH2IkJGjlYOOqpmUkoqFiXmDdoeAboKfhneAkoaImaKXeZOipJqfibOhoraLeqynpK6lcKmBmpCFgZySfKSAopmGmHKehKKtromXi3+MpI2Wg66ilHa0tbXJoXOUioCfYJ2XqW15lYafmnWhh3egfpGWioBvTGajknCah3Kke3l0YYOCbH6ga3FkYJxyf3SXaXtps7W0xqZzmH57nWqbm6t1g5psdHeXaZp6dJhxUER9s15qdmt4h2ZqZ2J0dHFuVl5UWWhPUmhJVUxZUlVcZ2tuVmdXTUpBSk1LSEpOQVFKUGRjaW1ldHJzfnl7bnWJe3tUUE9tXWhba2lSamhpbGdsZmNlX1xdXF5pYmRoa3tfXWRoY2pmb21laWxloZyJr6eEZj+UobKrr6+1oqOPgJepoqKljKWnnZylgpmXlo2XkI+bko6IgnlqeYZlg4x+lqB5dY+IjIFphIWSg4yFnY16jIqUpZKDl6iXjJCKgYl6gH2LeHCQoYZ5gZWHiZagln+UpaiclpaEZ254nGyiZHxxpXecl3Bnp4GXjHulep+Wg5dynnaBiZSWj7lukIqiYn2ZopWIbXJpq2p1oGxupmCbaYuQaJaHmpV1ooB9mmCLhYx1b4hiaKBlnn5pmnVvY2aIgm5yolpfW2Ohbl2JjG97f3NyZKVtd6JkZ6domHOLmG6hb1OIj2+gX2SnVItdVJhtbXNrcYFtcGhreHNrb1JYV1ZmWVNtSVhPXUhYaWhzallrVlFSRVZcTFhSYVRoal53dXp8cHx8coN7f3J2jYCEdl5Rc2FnYnBnUGpoaGtsbmdkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ylmaZ6ZXRti6eupKmwsaafi4CXq5yepYyioZqiooCVmJONmo+Kl5COi3uHcYCIaIuLe5eac3SKfZB7ZIKHlYqKlZmCfIiFlqaPgaGrkIWPiYKKfYCAj3Noj6WEfYaUjYiYoI6IkqqnnYmmeJacfqWJloyymJ6Qg6+Xn6V4loh6qXSlj4SabqSijJKEjIO8bnylr4KGhoeTlpyffKV6caiUoJZnnn5vq2OWipWSd6hsqaKBiXWHgnerkaaIa5Gwa3azjKlrioZubZ+ekpVhf6uLqnaAf4ymn3effYWllZ2gaZqHdqxnnq2Mt3N3vo2kk1mDpo2rYXVyc297dHFian5uaG1TVltVYWFca01cUl1JXW1tdmBbcVlbYFpnc2Vub3FjcXRgd3p+eXJ5g3OEf4B7e4yBgoB2YnhkY25zZFJsZ2hvbHJpZmlhX15cYmtibWx6b1xcYmlibGp3bWdsbmKVpqqdgYCepJapqp2op66jmYmCl6uanqSJmqWdqZyEjJqOhpyRhZKNi4x0hnqIhG+MhH2Xk3R0hnKSgm1/i5KHhpSPfHuBhZekjX+lpY6BjYmElHWCh5JvbIupgIOLlI6JnJ+JjZOro6CQgHWUloh+gXmUrqN/gZtxj4Z4kIyEf3typoxxfX16l5abhI54e35+iJSVk4p2kJifoIN6fYlrjIVbeXhxeXBobn6SiXF/dIGPk5NxhYSCZYx/X4F/i3d1c5R1b3lubodthIVed2l4jWaBgoaOqZt+dHyXaomIcIB2fIV2bWxmjHN5e5h4hFtqWHmPaG53cnFvd3hvXWyGbmlnVlpgV1xla2NVYVVfUV9wd3lsanZlamtqdnxxcnRzYW91YnN7gXh1eYJ1gIB/gHiLhYN9e21/bGR5bl5XbmdodWt4amlqZFxgWmNqZWxwdW5aW2JrZGxseW5obG9hjpS5qaeLoaKapqSZpJyroqCEhJeskp2giZqmmqiYgoGbin6Wk4eOiYiNcoJ8j31+joR6l490coNwlYV7fZOLhoaQhXh+f4aYoox7pqCLhY+QhJWCho6Xd3KFqoaOkpyQiJ6eiIybqKCgq4OJjZSafn6Jlq2oj5OmkHhwnZGDe5JvfqiFcH2VcWtwfIGfi3+SjoxobV2Di4ybm56Oc5WLiHF0a4J2c4BZcm6HkIF9fotpXWlke4WDiIBfaXh7m3uCi4J2gYaCaHmLh2thcXKDd19zjIKJkKeVhmaMj4Nud4uEcIWNeW9lZmN5g3qWW1xpZm52W3t4d3Rtc3KCZlxtimtsYllZXlpYbHFbX2BaXl1mdH17dG9zY2trant8cnt4dGRtdGdse352enx7enp/f35vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGtqcXJtV1tlbmxnc3pvaGptYIyMqrGikKOhmp6emJ6ZqKKhfYKYrY2flIebopCllX97l4R8kpiIiIaGinJ8gIt2hYuBhJWKcW+AcpiGhH6ShIOGioF6gIOLmp6PgqaghniOl4iVi4udl4SDeq2CkZiZlIqenYeIoaugoqKji4iSm5yjmZaqoaemoJKbiJeOfHiOjoSnfn+SkZKTnLGmm5SekI2yk5iEpYyMlZufiZCbgoiRiWt8jXZ3ZYKFkIp8iZ2Eh4uPiIiAhYSQd3x5dZqhiIaKn4uFlH9+jIGAdnB0hoR/eIiHi5CmkISFjYiDjZCMfIeKiI+BdmuBg3x5mWpyaGBzinB9end2b3d0gV1eb4Zobl9eWlxdU2hxVWNbXGFsaHV7fHJucGRraml/e214f3Fpb3BsZoB7coKAeH99gIR6bYOMhnx6eHx+eoN4TmR2a3NtcHpka2ViYmBbdGZwZnJybVVdbHRtaHl6cWdpa2WNiJ26n5aioZiVmZiUmaSgnnt/mauOno2Fn5yKnpZ8eJSCe46ZiYaEhIZteICAcoGHfoiThG1rfnqXhoSDkH+AhoSGfIeDjZqckoapnoNyio+FkpGLnZF9jXuqg42Sl5WPnJeGhpunoKKanYaDkZqZmZCapqCmnZ2QloGRind8h46EpXt8jpCRhpipoZ2TnI+Nqo6RgJ6MiZOanoKOl36GjYJveIVxdGB+go+GdYuXgIOPgoaEfoWDlG15dXSSoouMhZqEhI10gIp8fHJye4iEe3mMjoSTp4+GhI+BhIuKineFh4mLfG5rfYB7bWhsbWdeeX9ofHt2dHV1e3dcYHB9bnVgY1pdXlFmbVNlWl1haml2en5wa2xka2pngH9sc4BsbHRveG6EeW6HgHaCgH2EdnKDjYh+e3t8f3uCimBpe2p1aGmCZGpjYGlcZHVob2J1bmxUY3F5ZXB6enNlaW1ti4qft5qho5+SkZaXi5qfn557eJ2mkJuKhqSUi5iZeHqNhXuJkYOMgoGCbXx+eHOAhX2KkHxraH2Bl4iBiI58foaEh3yPgI+am5GIppx/cIuKi5KHoKGKhYx8qJGIj5KXk5aTeIyjoaGelpp/gJCamJOMm6OhpJqXkZt+joV5gIOPh6CAfYyMj3yXpKCgkpmQj6aNj4GbkYmSl5t+kpJ+ho2BdXSCcHZgfX+NhnKKlXyIi3KMf4KFho5od3F4jJiSj3+XfoiKc4KHfHxweXuMhXp7kY2DlqaTi4aRfIaHh4V1goOIh3plcnt/eHpwbGpmXn1zaHx1dXN8coBqXmB0dnB4ZGNZX15Sa2hUZFlfYWdqdniBcWZrY2xoZX+Aam1+aG5xa313hnpri4FzgYF9gXR2go2Gfnx7f4F9f49qcoNuc2lhh2hsYl9xVnRvbW5geGhtV2p0dmN1e3tyYmpueYmNn7KSpaWcjpCYj4acoJucfHakoI2Xf4yiioialnh7hod+g4l+iIKAf3F/enR1goV+iZB4Z2N9hpeKgoqNeH2AjIN5loCVl5WMlp+afW+LgZGThqabh4yJhKaVhZKLlpeTknaRnqGhmJSXen6OmJeOlpudpJ2Zk5ScepCGg3iEl42dfoGJjYxzl6KeoZKYjo+ijIuDlpiDkpaZfpiNfIiNgXZxfW16ZH98ioVwhpN/kIJsh4KBf4mEZXVvfIeSl419k3iLiXyAh3x7cX54ioZ5hZGKi5iilYGEjXeJhYOCdnuBiYZ2X3h3fXN9d2ZsZGF+aWp3c3R0fXF8YmNhc251c21hWmBeW2tkUmJXYGFoa3V4hnBiamNtZWh8g2xodGhsb2h/fIJ4bZCGcYCDg39zfIOMgX9+eoKDfnyQbXaIdHRtZYpsamFjdVaEaXFuYHlnbGJqdnBmeXx6cWBybIaFkJytl6aono2Nl4eGn5OXmH13qpyKmHmXnIuLmI95e4CLfXyDe4CCgHh0eHpzfYCDf4iLgGRefYuVh3+Fh3R9fYl/fZeElpOWjKOgl35yh3qTkYqnj4yOipOgkYORkJSXkYuBj5igmpKQkXR/jZKUiZ2dnqeYl42VlnSOjopshpiPmXqHiJCJb5edmqOTlYqNn4yGgZKcf5KSlYaZiHyJiYF6cXlrdWx7fYt+boWSgpR3b4KDfX6Kf2RyanuAlpeEf410kImDeYd+dXiAfYeBfYONhY2UpJB4hYJ0iYd9gHN1gIeDbmB7dXpxfG9hbmNke2Jub3Zyd3dzdGF2X29sdW5vXFtfXV5qXk9dV2NhaG1zeolrX2llamNod4dtZmxoaWxogHx6d26Qh3OBg4R9c4GGiXqCfXqBhH18jnJ6inh4bmyHa2hfaXFjh2hxb2V3aG5sYXloa317eHBhd22LgZmaqqCkqJ2KipGGip6KlZd9d66YjJZ9npORlpOId317inx8gHZ3f4BwdHN6b4V8gYCKfnxgXH6PkYZ/g4Rzen+Geo+Rh5GRm5Kkm5SBfYB7jYqSpImNio2YmoyGkZiTlo6JiYyTnZOQjI1ug5COkYmemaKhl5aJlpFviJqEZ4aZjpN6iYWQinCVmpShkpKIi5mMgn+QnnySj5KLmY57ioSHdHN1a3FudXuLdG6FkI6ScXSAe4GBiHxkcWx5fZmUfYSIdJCLgXSIeW+AfoGHfIWMiYWNlaiNe4h9fouFd35wb4CFg2NoeHR1b3tiXnBganRecWp6eHhscnBleF1tbHNtc1haXl9halpQV1dlY2dxcX+HZl1paGdiZ3GOb2RpZ2VqaIB6d3RujoV0gYGCe3WCiIV3hXx4hIV6gIl3f4t7enJ5g2prX3BodIBrcm9tcWdvbGV8Y26AeXZxbHd3in+imKKooaabh4yKgZCchpOcdIGqlJKNhqCMlpOQf3R7doV3eH9yc3uFa3JveW2KdoCAhm5xW1l+kY2If4CBdnWAf3+gho+KkZyXoJOXd4l+gIyInZ6Kj4aSmJaFiZWZj5eMi42OjZ2KjpCDbYiKj5GKnJahm5iVhZeIaoWjg2eGnYqRfouDi4F3k5iRnpGQiImVjX9+j5d8kY2PjZqSfIp/gm52b2xtbnB7hWlzg46XinB3f3SCiYJ4ZnNvdoGZjnyJhHqUkXp3iHRwiXuGjXuLhoSJj5yjiHyEd4KLgHh4bmqAgoFdcnNxcG94Wl5wYHBqXm9pfHlwbW1qbHZgcG9rcm1ZWGFhYW5YUVNaZmdjdXCEgmJdam1kYmZrkm1gZmZfaGqBdXFycIuAdX+CgHh1gIuAeIV/d4eGd4OEe4aMf3t2in9qcWN8YoZ8b3FsdGpob2x2d19xf3l7dHV0gIJ+pJWarZ+nloWMg3+XlIOPn3WKn5SShoqbjJWNi3lyeHSBcHKEc3F1iGxvbHVtiHaDfX9tblVRgauUh4J4gHZygnmBoIGRgZKSl5uRmniReoKMkqSak46JlZmShIeXmYyUjImPj4iehZCKfHKKhYmOiJyZn5uWlH+Uf2mGnYhnhqGIkoSRg4lxg5GXj5qNj4yLj413e5KQeo6LjJGWjHyIfIBrdmpua2tsen5heX6OlYF2eoB3g418eGd0bHSHlYt/iIZ7lJBxeoRwd4x6io17iX6DjJGfnYV9fHiCjH12cGlrgYJ5X3dvbWtxc1Zdb2JxYF9sbnlwZ3BmZnN0aHFsYXdlXVZmYWByU1BOXGZlXXhwiHxeXGhyYmJlZpJpX2hkW2dwfnBrcHOKfXZ8hYB0dX+MeXuGgXiIgnOGhH6MjIN7eZV3ZnJqg2CIfm9va3pgam50f3RfdH15hnh0c4V8eKCPmbCcpY+Cin+Dmoh/i55/ipmTjoSImI6OjoR2dHZzgHBvhXNwcYNva2l2bYJufXxtdHNSToLfyJLWk3xwdIJ1g5+Ck3eUkJiaj5h7k3KFkJ+hk5OQiZKblIZ+lpWIjY2IkY2InICOgXh6jH6IjImcm52blZN5jXZoiZKHbIijhZKHl4OGY4yRmI6UiZaMjYqLcXuUiXqNiIqSkYl5hXt+bHtlcm9qa3l5W4B5j42Aen1+f4aOenloc2tzi4+KgoWFfZWMbH5/b4CMf4yHfYR6go+VmpqKfHd4g5B5c21mcH+DbGp0b2hpc21TXm9kcFlfa3F3ZmtqYmZ4cnBwY193YGBWa19ddk9OS2BmY115cYl0XFtldmBhZWWOY2FmYVhpc3Nua3F2jHx0eYaBdXZ+i3N/hn97iX5yiYeBkIqIfH6YdmVzbXxliH5ucGuAWmxueXlzYXZ6e412cneKd3mfi5uum6CQgoV3iJV+fImch4WfkI6FjJeEk46HgXR3cHlxboRvbW5+cmRkeHB8bXp9amhsY6Sawdyu76Fza3WDdYSihZFulY+Un5ObgZFwhYujl4mNlYqQnZaDgJWQhYmPgJKKipd/h3t1f4l3hoSNm5qYmY6Pdop2boaJi32Ko4SRiZ2FhV6LlJeKjoiOi4qEiWx8loF9iIWJkI+GdoV9fWt9ZHd1am14c1eIepGGhXp+f4CFi354ZXNqf4qOioOCf4yWhWuCdW6IkYKRhX+CeoCRlpOZkHV0eIiNdXNxZ3V5gmJ0bW9iaHVnUmBxZ2tVX250eWByY19ofXBybltjcmFiV25ZXHdNTUxkZmFednOKbVtcZHheYGRlhV9jYl5YanJrbmtydox9c3eEgXh3e4lxg4R9foh7dIuIiJWGjH5+mHNodXF5bYt6bnRwgVhxenZ5cWV3eYaMaXaAiXJ/nIeYp5yjkoR8cIyUeHmLnYSFoY2Oe5WNf5mHhHtyd3Bzam+Ba2lsfHReYHh2e3B1e2dgZXzr2rXJw9yIc2xzgHaKmoiNaZePjpyUkoGIcIWIoI6FipWKjZiUfI2TiIOJj3uRi4aQgn92eIODcoeCkpuWlJiGjHaHf3CFgomHmaKDlIyeg4lhg5WPhomGiY2HgIdpfZR/fYOEiY6NgnGGfn9xd2h1cmlzd2tajH2SgYV8f4OAhIqCdWF0bIiBj4uCfn+SkX1ugmx5ho+Gk4R9gX2AkpOQl4lvcnqNhnVscGtyeIBfc2luXGp2YFJkcWhmU19wdnRgb2BdaIJxc2pXZ2hjaVhtV1t1TEpMZWdfYnJzhWhbXGV5Xl5kZ3tgZF9cWWtuZW9qc3eKfnNygX56dnqIc4WCfH+GdneKho+YgoyBe5N2bHZ1eXiTdG54en1YeYVxgG9neXeSgmR2hoVxipaFmaGbooqGc2+Si3J3jpx9ipqIiXuff4OZf4F4cXNub2RyfmhmbHd3W195e3pxcX9pYWdhf9W2jpCmeG5xd3twkpCMh2qYjYibkYuFe2iHi5mGgZKRhoeYjXyNjYGBiY18kIx+ioV6dXuCe3CGgJWZjpKUgYh1g4Z2g4CLk52fhpWPn36IYX+Th4SIhImNf3+DZ32Qf35/gouPkH5tgnyCdGttdnRzdnVrY42Bjn+FfnyEf4SHfnBfc3GEfI+Ngnx/kol6cYNmeoOKh4yDfIV+gJSPkZOEbnB6jH91bW5qbHp9YmhqaVhsdVpSaXJpYlFicnhsYWVdWmqDbXNiW2dfZWxfblRab05IT2dlXGducYBsWltjcl9cY2t3ZGVdXFpsbGNtanN2h39xb398fHR4hniFgn1/h3V5iYGSlXyIhnaJgW93eXuEk3Bte4F3XoN/dIFtaXtzlHNncoh9cpKRg5qfm6CGh3Z2lH5tdpOXfYeQg4qNmnyLmnZ9dnFvbGphdHxnYml1elpfd3x6bXF+ZWNoaFedj15xcpa8w4N1cZSIkH5ylouGnJOMh3JqiI+WgHuUjIGEm4x8ioZ9fImMf5SIdYmFdnd9gXF1hoGelIWUj4OCcn+IdYR8iZidmIeTjp2AiGZ9k4J/hYOJiXKBfWd+i3t4fn+Hi458aYB8g3Zlb3h4cnZzbGqNhYqBin94gYCEg39rXnJ4en2NioV7go+AfnKAaXmDh4uGhHmEfIGYjZCMfW5te4l9d3RuaGd8dmNccGJXb3JTU25zaGFOZnR4ZWBdXFhugG9zWWVhXmpuYHBPWWtRRFNnYVprbm18blpbXmxiWmNvdmNmXF1gbGljbGpzdoKDcW5+e390dYN7g4J8gYV2fomBlpB4g4p0gYhyeHl+jZBvb3yBcWmBeXp+bW18dpVraneEdGyUjYWemKCZhYhufYx2aniYjn6BioKVl4p5jpZvenNwbGpkYHR7aF9lcXpaYHJ9eWdxemFlZY+xsndKYlqk2dCWcXuQipB3fZSLhJmRi4Vua4WSknp5koaAhJiKfId/eHiJioSWgG+MiHF0fXppeIWDpZCEk4yDf29+g3aEeYWbmJOLkpCUhYdwe5KCfYKDiYNugXhogIV4cn9/goqGe2V9foR1Y3Byf2h4cG91mI2Fgop7dniAhHmBa1xxfXKBiIWJfYaJeohygW5xhIeOhIVzhHmBmY2OhHhub3+Ef3Z6ZWhqfXBfWXdaWHFtTldyc2dgS2x2dGBdW1tZdH1yb1dnXWZqcV9uTldoUT9ZZ19bcGpneXFaWllrZVljcHlfaFxeZW1oZmxpcXd/h29sf32AdW+Ce3+BfoJ/doGFiJeKcYKNcXuGfHl5g5OMdWp6f2tvfnR/fW9yfHuUb26Bf3hmkoqCoZmdkYKGZ4eDb2d6lYl+f4WBmYqBfI2MaXhya2xmX2FveG1fYm94XGRrgnphcXZfZWXU6r6KMjo+i46AcXmFh46NdoOWjH6SjYx/bWyFjYx2fY9/hYGViXyDeG52h4SDl3dviIVrdXt0ZXmCg6eLg46LhH1uf3R2g3mGnJCMkJGSjIuGfnuShnd/hI2DbIByaX9+eG18e4GKg3dieYSBcWRxaH5tdHF0gZqKgH+FfnJ1fYBygXBbbX50eIqDi3uHgHyIeHpxbIiDj4SLcoF5f5eLi390bmt3gIB1dVxpaHdwWVd8U1pwZUxacnJlW0pwd25cWlpZXXR+dWhZYltnZW5jaUxXZlE9XmZcXXVlX3RwWllUb2RZZHF5WmheX2dtZ2psaXB3fY5saYKEfnlugHx9gX+CenWCgYyThXCAi254foB6e4iSiX9oe31qdHtyhntzd31/jHl4hH18a4yMg5udloyBgGyOfmtofo6Me35/g5SCf32KiGt1cWdoY1tiZ3JuYGFrc2FocIl5YXN0XmNkm6CPblw1Wa+1dGmAiHyShnaFloVzjouJdnBshYOHdXmJeIl8koh6f3Nndol+fphvcYZ+aHZ5bWV5iISkhoCHjYl+bn52f4B8jJmHgpOQmIiLhIl8j4hwe32Ee2h+bWuAe3ppenaBh4FyYHeBfnFkcmZ1gm10e4WUkYF8gX9ud3l8dH5tWG9/dnSMgoZ3iHaCiXp4c26JgY+BhXJ+fX6TiYl6bm5qboKCdW5dZ2ZzcVFbe05ccFxPW3JwZFVLc3hpV1lZWmFxgHRgXV1gZ2RoaWZOWWhNQGFkW2B2YV11bVhXU3RhWmRvcldqXmFoa2dtbGlwd3ySa2iEiXx8cH5+e4GAgnp3gH+Ki4Nxe4dvcXeDf3uJjY+Dan57bnd5dop3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISIkXh9e4GRgIB+ioNwcnBjZl5ZZ19vcGBgZ3Bmam+KdGF0b1thZGp2e3++nKajyLhxhYNzk3x4hpOCc5GMiHJyb4N7g3R1h3SId5OIeXlxY3eHeoCTaXKEdmZ3dWNqfIOHnYF/f46OfXJ+c4R5gJGQgniWjZSPiIKIe4iJa3h5fnVnemhrf3lzaXp2gIJ9aGB3h31qa3Rne39pdoGMkJR+en5+cHt2e3R+YlZ3fXJzioSCfINxhop3eHBwg4KNf315fn12joaDdmlxaW2IgnJwXWhjc25KZXVMXm5VVFlzbmJRT3N4YFJYWF1icIJzW2FdaGVkY2pkUVpwSURkYVtjcF5dd2hVV1V3XVtlbmhWa15hamdlb29ocHZ6km5piIx5fXJ7fniBgYF8dn2EiIaDcHaDcm53goJ+iYuTf3CAe3d5eoGMdIN4f4GBgoR6gHVvfomLmp6IfYV6d4Z7Z3SFjJB6f397iYaEdo+AZ29uX2RcWGVZbXJgYGBwbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4b4x1e4aOgHqTiYB1dHR+d4BwcX9thHSUhnh0a2B6gnmIj2Zxg29ndm1bbX2AkJN/gHmSkn14e22HdYCQi4R0loqRjoeFhXt/hWx0dn9tZ3dlbXt1bWp2d39/fGBieIZ6aHR1Yn16Z3SFjoyVe3R/dXGAenxtf1lWdH5vdYSHf4B5bIiGdHhrdX+DhH17fXh7c4uBfXNndGVui4Rtc1tqX3VkSG5uTFtiV1ZVeG1iUFJ0dldQVVheYXGEb1xgY21kY15uYlRcckdCZl9dZmheW3tiUVVcdVtbZ2thVmpfYG5mZmtxaHB1eI50a46MdX52eH53gYOBe3N+hIiHg29xf3RxdX6FgomNint3f3iDfHyFh3iHfH2BfoSAe35zdnmLjp+NiXqJdnSDeV59hZmMeYaDdIWGhXeJe2JubFtiW1thVmpzY2BbZ25vZodxYXFmV11ja398ys6IuaJqbW2KbHGEcXyEiX57kYV6eXN5dXV7amx1Y4R1kYJ3b2ZefYJ6i4llcoJranFjWGx7hZuIgoFzl5R3fntuiHGBiouHcZeOkIiFi4N7eX5xcW99ZmhxYm14cWprcXd8fHlcZXmAd2l1eGaBdmd0h4uNlHxxhmlvfoB5bnxdWHJ/bXSAi3yCb2+Jf3F2aHd/gX+Bd31xenSHfHpyZnNhboyCbHJYa193W0lua01WVV5UVXtrYU9UdXJQUVRWXmJ0hWhcYGxqZmNZbmFYYnBHQWhdYGZfXVZ7Xk9WZHBZW2poXVdoYF9yZmtocmdwcneGeG6VinR/enh+eYKIgHVyf4eFjYJwcHt4d3V5hoaGi4Z6fH91i359hYSEh39+fn2Hf3x4dnl3kZOff4x8i212gHljg4eXhnOSi2+FhYF5gnRjbmpZX1tdXVRnc2VgWWRxcWaBc2JrZVdbYGl/d76ue6C3bWJzhmhze3F5goV7fYx/d3hydm97dmVqbmCHdY6Bc2piXn54eYuEZnF+aGprWlZveImjgYR/cZmTcYB4dYJtgIKRh3OViIyIhIiEfXh0cm5oeWBqbWBtdmpnamt5d3p3W2d9fHhlcn1thHRldYWMhpV/b4tma3qDdW10YlxvfGt1fIt8gWZ1h31tcWd1fnh+f3J9a3p6gXt4cGZsYm6Jfm1tVmtgd1VKamtPUk5oTll8aGJOVXVqTFBUVV9ndoNmXWBxaGdhV2ldW2toSkVrWmJkV1lVeVpOVm1qWV1sZVxaZWNedGZtZHFncm91gXdwmYV2f353f3yFh311c4KJf5WCbnN4enpzc4WHiIiEeYF9do9/fISJjoSChHt+i4N7d3x3d5qdl3qKg4Zpd318bIOEk4Byj4JxhYJ+gX9vZmxmV11bXFtUZHBkX1djcnVpdXBlZWNXXFxof3BvcoB0iWRkeH5pdHVzc4KEeICEeXZzdW5renBhZ2tnhnSNg25mXV99cHuJfmltd2ZpZFVWcm+NpnyEe3aWkHN7c3x6bnt7kIV2mHyHhoOGg3x0cHJsZ3VcbWhfbHRkZ2Zpem97cllngXd1Z3CAd4F1YneEinyUgG6LaW16gXFmc2VgbXpnc3eKfH5idYN2aWtxdHpxeXlzfWZ+f394d25jZmJuhnxta1ZqYnBTS2lrT0xOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2lmYFZjV2JwXUxLa1hjYVVUVXNWTFh1ZFpfa2FcW2NlX3dmbWJwaXNucn90dJqBd3+Ad39+hoR6fXWChH6XhW5ydHt6dXGEhY+BgHqLdXSQf3yBlI6AhYR9foyGe36AdnujpYp5iIWEbHV8e3WDgox6boVzeYR9gYN1bmpoZVZdW1paU2JuZFtYYnN7aWhtaWBiV19aaYBqa2+AZ2thaHl4anN0dG2EgXt/fXZ1bXtoanlqX2VuaIF2j4RnZVhid2l+h3tvaW9nZl1VWG9oj6h3gXp8kI55dW9+b3N1eY+Ad5V0hYJ/hYd1anJ2Z2huW2xkXWxyX2dhaXhoe21abYJyc2lvgH55d2B3hIR4j4Ryh3FveX9yY3FoXG93ZHFziHx4YnOAcGdqeHNybHh3dXdkg3t/d3ZvZGRjbnx9a2xVaWJmU0ttaE9HUmtFYXhnYU1TcVxJTVRZZWt3e2VebXFpZF1WX1VubldLVGhXZl5YTlVsVEpceV9bX2tdXVpiZWB6aGxhb291bnB3dXqYfXeAgXqAf4eGenh6g36Bk4RxdHR+enZ0hYiQfYB9kGtzlYB7gp+Ff4d9gH6GgoCKe3aErJ9/eoiHhGxygnp2gICBdW6Hb3x/c4mAam9tZGRYX1pZWlViamdcWl51gWlebmxcYVZcXGuBZnF0fWlpXWt2dWd0d3FshXt9fXl2cmx6aGl4Zl1kc2h6d5KBY2NUZXBngoV3d2ZoamBXVllnY4+nbn53gIuOenBwfGZ5b3qMe3aOcYR9fn+GbmR1c2RoaFxrYl1vb1tnX2x1ZHpoXXSAb3JrcXt9dXVhdIWKeoeGf393cnV/dWFwbFlxdGJxcoV8dWRyf2xhbHpvaml6eHVyZoV1enp1cGRhZG5zfmlsVGleXVRLc2NRR1ZhR2J2ZmFLVG9XSkxXWGdrdnpkZW5xZmNaV11YdmVUSlxjV2hYWUlXZVFIYnhaXV9sW15cYWRef2lqYG90eG1wbnaDmHlygYB8f4iLhn51dYZ5h4t9dHV1gnh6eoKMjn1+hIhqc5eBeoqdfX6FeoF6fnyGiHNxj66Me3uGj35mcoh6dHx8dnJvhmx7fWyPemJwb2JlXWVWWVlWY2ZrYF1cc4VoWHFuWl5XWlxse2Nwd3ZsYltscnNndHVwbIR5foB5d25udGVpdGVbZ3VmdnaRel9dUmVmaoKCdH1iY2lcVFhdYmOQpWh4dIKFkHhtbnlneG18hXt1iHKAeHx4f2hldmxgZmBeal9dc2tZZV1vb2J6ZVt3e2tubnB3eHN0ZHKDkn6Hgoh6dW9yfXJieGRbb3BhcXGCfHNmcYBkXm52aWRneXp0bm+BdXR9c3FiX2Zub31kalNoWFlUTXdfUUpZWUhidGRhSVRtU0lMWldpbHF7Ymxsc2NhWlpbYXZbU0tkXlhpU1dHWWBOR2l1WF5hbVtbX2JiXYVoaGFueHlsb2t2gZB5bYN+gIGSiISAdnSJdIyGdHJ3doF3fH1+jI+AfpN+cHiWg3yZknmAgHh5fX90iINzcJmie3t/iJV4ZHWIeXN4dWx0b35seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGIZVJybltaWFhgbHdjaXVqal5abXNxbHNzc2qFfH5/fHdubmxkaXFjW2pyZHR2jnNbV1NkYXKAf3KCXWJjXVNaYFtjkp9lcnGFhJF0bGp5bG9wenx7cYB2f3J6eXlkZXVoXWJaYWdbXndoV2Jdb2hhd2Bbe3ZqaXJud3NzdGhwgZSChn6DdXJqcHxtZndXXGttYnFzgXpzZm9+W2BvcWJfanF9bGx0fnNxeGtwYVxlbGx6YWdTZ1VXUlB2W1JQWVJJY3NiYEdValBIUFpVa2trfGVtb3FhXFpYWWxwV1JQZlZXaVNURlpcT0hydFhfY21jWGFgYV2LamNkbXl4a29pdXmGe2uDfYCEmXyChHl9iG6PhnFvd3p8dIKCfIuPg4KXdHeClIWBn4l1gICBc3+BcIeCdW+il3R7houGe2V4i25ue29meHB6bHN2coxrXnRuYWdla1JdW1ZnYmxsWlxxjGRPb25dVlhVZ2p0Z2J0ZWVdWW10bXB1dXlqh3x/fIh3kHNkZGtuYVxubWNzeIdrWlRWYmN4fX1xhV1jX2NUWmBZY5aVY25wg4WKc2poem5lc3ZzfGx6dHVveX51XmZyY1teVmJkWGF1ZVVfYG1kYXFdXX5waGlzcXNwdXVqbYSTgYh7hHFyZm59cHJvU1tmamZxdIF3c2JsdlVicWpbX25lfGVtdnxzcnNqbWBaZGpqd15mVGRVVlBUbVdRV1NQSGVyX2FGWGlOSFdUVm1oZHxpa3hrYldcVVt0ZFNSV2hRWWZUU0haWlBNeHdbX2VsaVpiYF5ej25iZmt5dW5vaHZ2f39sg4B9hpd7f4iBiX5rk4hyZ3SAe3WAg32Ijn+Mk3N8ipGFh5+Ge3+GjHOAhnN9g3ZupYxzgY2LdndteoxgZHxwZnpzeWxtcXaCZ2R7bGNmZ2hTXl5UZ2Bsb1tebo1oTmptYFRWU29nc2tld2RlXVhvdGxyendybIh7gHace3prYWVsbV5gb2plcHh+Z1pWWGBreHx7cIRfYl5nVlhfV2SciGJrcYGHfXdra3hsW3ZxbHppdXNub3uAclhqbl9ZXVVhY1dkcWNTXmFpYWJsWmB+bGZrc3VubXd2a2iFjH+IeodtcGZwfG1ybWNZYWhpb3SBdHJeaWxSZXFkVGJuYnpjcXZ7dWtwbWtfWGFnaHRcZVZhVlNOWGVST1xPT0hlcF1jRllpTUlfS1htZF94aG5+ZGBVXlRddFtUUmBmTl1hVFNKXFlQWXV2XV9mbWhYY2FbXo5wY2dqd3Fzbmd2dHqDcoGDeoiNfnyKh455bpCKdGxzgnR/f4iFhpGElY95foyPiJGbhIB8jIRzf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyNjIyNjI2NjY2NjY6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQk6lr62tra6wf2tubm5ub2pmZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzQam2tLS0tLd8ZWhnZ2doY19fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGj5CQkJCQkYuKioqKiYqJiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpOQipGOjZGIj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Mi4uMjIyMjY2NjY2NjY2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6HiYeGiYWIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQj4aIhoWFhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPiYaFh4SGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGiIaGiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmOjIuOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3t8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKSkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGdtZ2pnaGVoZ2NiYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXl1ZWV5iYV5eWllfW1hXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT1BQUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFFQD46Oz4+PEVEPT9FQT9AQUBERUdHR0dCRERERkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7PDw8SEw9PUFBP0JDPUFEREZDRkZERklIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk4Ojw8Pj07Ozo4OkBAQUI/QUBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5Ojs7ODc4OTs6ODw8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT07S2VAPT0+PTw8PDs7Ojs8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QD89Pz1reFQ9Q0U/PkA9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGRD88PD1ATUxGSHd1WTc8Oj09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkBJblA7PWSBgn51enZTNzg4Ojw+Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDP1d7eVJlhIODg4R8eFI8PT89QkZBRD87PD0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VAWXR3e4KBgYN8gIN7TD9AQz9KUj1NRzw8PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHt9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQT9SdXN+gHuAhHt+hmJAQ0NFPk9bTG1oSUBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUZrdX5/eYKEhYWGfUpERkRCY36FiIl+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR114f4KDhISGhoeNakFCVnSFh4eHh4eCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTFh/hIWFgIOGh4l9U22Eh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUlISElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKXoSEhYR/gYOGhoSChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSklqhoWFgoCDgYKCg4SEhYWGh4iIiImJjI5mREM9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWeGhYJ/gIOEg4KCg4SGiYqLjIuKiYqLjIlePzc2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCaoSBgIGCg4ODg4OFiYqKiYmKioqKi4mJioJINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ojo7ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3eXt7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOUF7hICCg4SEhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw5OTw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz89UIOCgYKEhYSFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5BQ0VFQUFBQj5AQkBAPj0+PkA/Pz9AP0A9PT9CP0FBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJZhYKChIWEhYSGiYmIiIaGhoeIiYqLi4qKiouJi14+REdJS0pJRkdHREZIR0VCQEBDRUNDQUJDQj9AREhFQ0VERUVBRkVGREVGREBCPzxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQERERV6GgoOEhYaGhoiJiYiHhoaGh4mKiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JDSEhKXYaCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTUtIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ozw9Oj9APkBAQ0ZKSlFjgoOFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhIRUpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0BFSUtNVnKDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLX1FRUE1OTUtKR0ZCR0pHTEpGS09MS0pKTU1MT1BOSElLTE9RUVFRT09KSUpKTEpMRkdIR0VHSUZFRUJAQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUhMTVFXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1VRUlRST0xLSkRFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExKTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNHVk5GT1FRVVl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlVrYUVSUVFQSjs7UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE1SUFBQUUtLS0hISkhFRklISUhJaXJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVlZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4ZsW2RVOlhYWFNQPkBWVVlbY2BWWWJyXl1WXVpWRVFZWltZX1RZZ1JVVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enp6e3p6fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSVlZUWlp0g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU5QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFhTVlRXUlFXVWKWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9MS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haW1xeVFFRUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5TY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxtcnV2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hCQ0hHSEtHQ0JBREBPUE1TZHN0dXVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYltYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc/Pzs7PkA/Pz8+a1FKYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQz8+PD1CPkpNRlVudXV1c3R2eHt8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en17eHp8fHh3eGRCQEBCPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87Qkg/XHR0dXZ1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWEdGRkhCQUZJRUVGRE1SUGFXUlhRUFNTUlVbT09RV1BNSkNGPjo6NjQ4Njk3OTozNjY3OTU8Qj1ldHR2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFhZWlZYWFZYWV1XV1hoc2tdVmFza2FhX11kYF9eWVVQTU9OTEhISktJSEZDUVBTWldUVE1RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25ydXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk9PVFNUXFZSVVNST01LSUhIRj8/PTo3ODc2NTk5Njc2NjVXcHBzeHl6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSkhPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI8WE1JQVE9Y2FRU1FQTlBRUE5OTVBOVFJQUk1JTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I0NTY2O2VwcXV4eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQkZHR0hGSkRISkhHRUhMSEtIRkxNUE1HL0VfUj4zQD5qb2FSUlFARlVRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzZEbnF0dnp7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEVGSEpOS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTEpMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fXx8e3l9e3p+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFdXVUxMS0g9OTg3Oz9APjw9QUBCPT5FSEdERkZJR0pKQEZBQUBGSEVKT0hQUmFcUVBSTlNPT09MTE9NS01MTU9OW1dLTVFPR0lIQ0lKTExKRkZGRD9CQz48QkY/Qj9BZHF1eHt6e3t8e3p6d3x4eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz9CQEA+QURJRUNIR0lHSUVCQj8+PUNCQUdJRE1PYWVRTU9OV0tMTUtMTU1MTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QEJCQURFR0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS01RVExKSU1URklJSkxKS0tJSUxNT1BSUEtHQ0tHQ0JKSkxNT01JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtER0hIR0pLSUpLREdCPT49Ojo6O0BCPz1CQkNDR0ZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTU9HSEtGSEtESElLTUhKTEhISkxKTV1SSUhETUZBREtKTk1QTktNSktGR0dKTU5RTkxjbml2dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0RGRUdERUVGRUdCQ0A+PD06Ozo6QERAPkJDREVJRkpKTEZJSUdGRkRCO0JDQz4/Q0NDRUdMTkdLTkhESERJTE5NSElMR0VGSUlMTktKSEVOSENHTUxPTU9NTk5NTElISk9SUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUJCQkVAREI+Pz46Ozs9Oj0+Q0E/QUNFR0pHSUlMSEdHR0ZFQ0A9RUVCPkFDQ0NFR0hJR01QSUZGRktOT0tGSEpGRURESUlIS0lGSFBLRElNTFBNT05PT05KSklNUlVUUk9XZGBhbWdwcm9yeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRD1CQT5BPTo6PT87Pj5AQj9AQkRHSkZKR0lIRkZHRUNCQUFGRkNCQ0JERURHR0hGTFFLSU9KSkxLSUdIRUZFRENJSEhLSkdLUk1DTk9NUU9PT05PT0tLS1BVV1ZVVFhgXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJqa3NNR0dGSEJCQUREPEFBQEM8ODk9Pjk/PD9CP0BAREZIRUhGRkdGRUVEQ0VDRElGQ0ZFQkVHRUVGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS09TTkRRUlBRUU5PTU5QTUxOU1dWV1hWWF1aXWRgaGJqaWdrX2VlZ2NnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlvek1IR0hIQkJCRkU8QEJCRDw3Oj0+Oj46QEI+Pz9DRUZERkRER0VDRUNERUZHSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSUpMRklJS0hFS0tMTU5PUlRPSVNVVFFTUFFNTlFOTVFXWlZaWVZaXVpYYWBgYF5oZWNgZGVoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnN5TkhIR0lEQUNIRTxARUJFPTg6Pj49PDxBQjw/PkFCRkNFQkJHRENFRUZHR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEtNS0lOTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVteX15gYl1cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cXVNSUtISkVCRUdFPEBHQ0RAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRHRUhIRkhHSUtKRkpISEtIRkZMSEhISkdMTExMTElNS05NTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZvdkpLTElMR0JFREU8QEZEREI7Pz9BQEBAREE/Qj9BQ0hCRURGR0VJRUZESUhGSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUEtPUFJVWFZNTlRWVVNSUVBMTlRTUldbXl5fXV1gX2FhYWBiY2VhY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93Sk1MTExHRENBRDw/RUVFQz1BQUNCQkNFQkJEQUFFR0NIR0hHRUpGQ0dJR0dKRklMSEpKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQT1RPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWJnbmhiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTUxLTEdFQUBEPj5ERUZDQENBRURERkNDRUdDQklGQ0hKSkhJS0ZES0pHSEpJSUtHSkpOS05MSUxISk1LWmZKZFxLbFNIT05fblVrc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRgd3VpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUtOSktKRkM/QEI/PURFRkRDREJFRUVGQkZGSENESkVFSkxMSkxNR0dNSUhJS0hLSklLSk5MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW15bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9CQj89Q0ZHQkZDRURFRURDSEhHREVLR0dMTU1LTU1HSk5ISktKSUxKSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3FwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRUVFQkJCPT9ARkdCR0RJRUVEQkZJSEhFR0tKR01NTkxNTkhMTUlMS0hKTUlLSkpKT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnaGFkanV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0d0lNR0lERUVDQUI8QkFCRkRHRkxIRUNDSEtISEZKTExGTUtMU1JMR01MSE5KSUhOSEpKSUhOT01OTEpNTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNnYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0JHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpMTU1NSUtKS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVEREdCSEpMSEZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSktLSUhJR0tLS0tGSEpKTExMS0lLTE5UW1xUUFRMUE9OT09WUU9PUU9PUUpJTlBRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DR0NFR0NJS0xIRkRHS0xIREdIUEtMT0tMV0xJRUVISUpISUtJTEpIRkhHSkdHSUVGTEhJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUkpZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF1iX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJREdHRktKS0hFRUpKSkdFSEhQSkxNSk1TSUhFQUhGSklLS0lMSklGRUpHREZHRUVKR0NKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl5cXlNbXmNeWl1gY2BZX2JbYF5bVFhYWV5dY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRkVISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSURDQ0VBRkpEQEpLSU9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVZVXFleZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZER0VCRUdIRkdISUZHSkdIRkhLSUxEREtKTk1MTEhKSkhKRz9HRk5KS0tNS0tLSUdHQ0RAREFISUE/SUpHT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlBPXF9hY2NjY2JcZGNiZGNmWFFVVFNbWFphXl5eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNFS0lGRkdIR0dJRkZGSUxKTkVES0pMTkpMSUtKSElHQkhIUU1LS09MS0tJSEdFRD9FQkhIQUFHRkRUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYGBiYmBjYmJkZGJYT1FRUltTW15dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSktOTExJTEtJSUdESEtRT01MUExNS0tISUNEQUVDSEdCQUZFQlZVRVxUXVNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXWBgX2JjYl1iYldfX1RQTlBRWFJdXFtcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUERXX0lHR0hERk1KUFBFSklKS05MS0tMS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENBREZBTEhDTExQT09MRk1GR0lKSEdMTE1PUElMT1BQU1BMUFRTVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVpdXGBhZGVjaGNrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0hZTUdISkhHTkxRUUlLSktLTk5VTk9LS0xHR0tQU1NOUE9OTk5PSEtFYEVEX0xEZmNETVtIXlxzbU9NVm1ZTENQYFVsV2dKXVdVXkRMUVVMTVRWUVNUWFdUWFVUXFRQZlpoaGRYU2tUV1ZVW1xbYGBhYmJiYGZoZm5saHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPU0lLR2BUSEpPSklPTVJRS0xLTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1dQbUhxbnBhVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVVd/anR1dV9gd2BYYVxcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExGSkxGUlZMS09JS1JYV1FOTk5MUVROT1FQS0xPR01QU1taVFFST1BQUEpIWnhdVHhlaFlSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9wgV1lenV4cXF6cX5zfWt1fWJSZ3xlc3Nvc3N8fW99eW9/cl9gYGJiWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhLSkhKUE5NTUpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUVRQUFBRS0dmeGxjeHJtWkpMVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdzUWh6bWlqenp9bHh6f29nb1h2dmp1dXCAYHNofGlseHxvXl9fY2JbXWJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5NSlN0TkNCRVBQSEpLSkxQT09QTVBaYFpYS1RXUGFeUlZRWVNNUElTVFZYV1dQVVBPTlJKS3JvdXVxdXFkaGBWbkxxcF5GaHlXdlRLaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnR0cWxtXHR+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUtLW1ZIR0VHUlBKTE1LTFFRUVFQUVdcWVVOVllVZlhSUlleVE1OSVRUV1dZV09TTk5OUUhSbUhpd0tgZHZ2VVdsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhlfGlye11US2xgdnVraXV7e21+eGt8cF1eXmJbXmJkZGdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraGxtcnxrbWhre3RtbWttT0hKS0hJSUhSUExOT01MVFNTT1RSV1JWVFBXWlZWVFRUYWBRT05LVFRTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VSU1dbV1hXWk9TVVdXWFJdWVddVlRPWVJXV1dYWV9bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hvemhnZ2t1amhnaWxRSUtMTE1LSlNRTVFQT0xWVlRQVFVYVVlVUlpdVlVUV1VZWFBPTE1WVFFOVVNOT01MUVBLSlFSS1FNS0tPUlRSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NRUVVVVlNaUU9TUldVVFlWVFlVU1JVU1RUV1hXXVpeYV1cWlpcXGBjXF1iY2RnZWRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFBKS0xPT0xNVFBOU1FRTVhXVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1dTUE5VUE5RTktTUE1PVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUT1RVWFVUWVVXWVRSUldVVVdbWVpfXVVYX11eXVxdYWFeW2JiY2hmZWRiWF9gYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RWllYV1haWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFBOTVFRUFJYVFFRT01PU1VPV1JUVVVPTk1RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1dRVFZWVVZYVFdXVFJSWFZVWl1ZXV9eVl5dXmBcXGBgX19aYmJkaGhlZGFZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlJXU1NTWE1PUFJUWFVVVVNVWVhbXl1cW1ZST1VWVltcV1FUV1VXWFVTWFpUU1FaV1ZcXlpfX2BVYVxgYV1gYl9cYF1jYWNnaGRmYFljYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXmBbXl5hYF9iXFlgWlFOT05WUVBUUk9VVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUktRVFNYWldVT1JOU1hWVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFVWXFxWUlRWVlhZUlNZXFRSUlxXWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGZpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dW2BcYFVcXWlqcn1zbGdcVVlXUU9SW1NSUVRSVFVUS1JWVVtZWlNPU1JWVlVTT1ZSU1pSVFVUWFxXWFhTWFxYXl1ZWl1UVU5WV1deW1hRVFVYWFhUVlhbVFNWXVldXWBdYmNeWWBbZWJfZGReXmNjYV1lZmlkZl1eZGFgYWFjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFpbXlZeWV1QT09SWlBaVVVWVlRUVF5eYF5eYlxgVV1eYmt5dGx9bFpVWlVRUVNcVFRUVVRWWVdMUlpWXVtcUk9VU1hXVlNQWFJTV1NWVlVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlNUVlpZWlZXWVxWVVpdXF5hYV9kZF1eXV1lYWJmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllaV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxYV1dWVlddWFBVXFleXV1UUlhSV1ZUUlRYUlNWVFlYWV1eWF1bVV5fWF9fWF1WUVlUWVpaYVlcVVZYW1paWFlZWlhWXV5fXmNiYWVlXWJcYGZiZGZkX19kYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWlZTXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2hZXFpWWFVXW1pZW1lYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXW1pcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1lbWVleX2BgZGJjZWViZFpiZmNnZmVeYWJgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhWWFdYXV9iYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcUlZYUVdWVlZWVlRWVFhcXF9gYF1gXVdhXlteXFteWFZYWFtaX2BcX1hZXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk1SV1lWV1pYW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFpYXWBjZF9SWFlQWFdYWFhXVlhWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1tgX11fWVleXV5eYVxbWllcX2JfYmRjZWZlZmJaZGZnaWdjX2NeYWZkWmlpYmZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4S1dXXFlXXFxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl5cXFxYV1tdX11gX11bYGRcXFhaY2VjYFJcWU9YV1lbWllYWllgXWBiYmBhY19cYl1fXVteXlpZVVhdXV9gX19bWl5eYGJjXFxXW11gYmFjZWRnZWVmZFxlZmhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVhXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXFxeW1hdW15fYWNiYWFdYltiZGFfY2NiXVxbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXV5fWlhWW19dXGFhX11bYGFiZWJfXVNcX2BjZGRmZGdmZWZlXmVmaGhnZGRgW2ZnXmFoaGNoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t6enp7e3t7e3t7enp6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t6enp7enp6enp6enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiI2xtbS0tLOzu76+vr6+vcrT0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyLkbvAv8DAv7/JzMzMzMzL2+bl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl6enp4b29wcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9gIGBgYGAgIGCgoKCgoKEhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z4e3d6enl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t6enp6enl6eXl5eXl5enp6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8e3x9e318eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x8fX19fn14eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3enx9e31+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp9fHx8e357eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4enp5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t7eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHt+fH1+fn5+fn19f39/fHx9gIOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgH9+f4GAgIB/gIGBf35/gIF/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+foB/f4CAf39/fn9/fn5+fn1+f39+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+f35+f39/f35/f35+fn+AgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f4CBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoKCh4ODgoCCgYGCgoKDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgYOBgoWFhYWGhoeGhYaGh4iHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFhIKBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEg4ODg4KDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoeCgYKCgoGBgYKBgoKDgYGAgIB+gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgYGGmoiAf4CAgH+AgoGAgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoGDhIKCgoGBhY6djIOChIKBf4CCgYKCgYKEg4GBgIGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChoWEg4F+fXyAk52Ng4WEg4eFgYCBgoOCgoSDg4KBgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gIWUi4V+fH19fnuNn4uBgoGBi4t/hoSCgoKBgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9+hp6Xh31/gH6LhYCRhIGDgX+PkoGTi4CBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2Kh4ODg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICEnKCIgYyCfYaFfYKEg4SCgZSYgomIgIKCg4OCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4WDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGUn4WEiISHgYB+foWFhYSFjoV9fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4iQgYKBgoV/f359goeGg4B+fn9/f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4OCgICAiYR/fn1/hYF/f4CAf39/foCAhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpGRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgIONhoOAfn6Af39/gICAgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgICBhYSCg4KBgYKBgYGBf3+Af39+e3qBi4yJioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgYSFhIKCgoKCgoKAf359fX19f358enyPjImLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFg4OFhIOEg4KCgoOBfn1+fn5+fn59fX59fX6Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomJg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4OEg4ORkpGOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoWAgYSDg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoaHhIOBg4OEhYWFg4OFhISEhISEhYSCgoOBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Cg4ODg4OCgn99fX+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn5+gIODg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6en+CgoF/f39/fn9/gH59gH9+gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Ag4ODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAgH5/fn5+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f35+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5+fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYGAgICBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgIKDgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4WEg4OEg4WEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICAgoGCgICBgYB/i5SPjIuNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYyMjY6OioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNjI2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fXx/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyMj42LioaEhoSEg4ODg4KCgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhYKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNjIuIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXp8fX18enx8foCCgYCAgHx8fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeFgYSRjoyLiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJGNi4iJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLi4mNkY6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY6QjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fXx8fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgYJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgIKBf4CBhIF+foB/fn6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGCgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH2JhoaFhYeFhYWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCg4KEgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOBf4CDgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBfn58fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/fn9/fH5/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoGAf36AgX5/gIKCgIGDgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fX5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH5+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4N+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4GBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoN/f4KBhIODhIGBg4CCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhH+Ag4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGAf4KBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBg4GAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAg4WDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIGEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX1+fn6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhYSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhIJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHem19cnN2c3ZtbndscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH97f318gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWEhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISEhoeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aHhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhYWHhYWHhYaFh4WEg4SDg4SHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fnt8fHt8fHx9e3t7fXx7fnx7fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gHx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6enx5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIOGgoWBgYB/f4CAfn+Agnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhYSGh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dTV1NTU1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX29vb29vb29vb29vb29vc3Nzb3Nvb29vc29vb29rT0tPT09PT1NTU1NTU1dbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI+MjIyMjIyMjIyMjIyNiIGCgYGBgYGBgYGBgX+P09LS0tLS0tPT09LT09Ld4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxaVVZWVlZWVlZWVlZWV05DQ0NDQ0REQ0NDRERAXNLT0tLS0tLS0tLS0tLQ4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWeX1laWlpaWlpaWlpaWltTSEhISEhISEhISEhIRGDR09LS0tLS0tLS0tLS0N/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqo2hkZWVlZWVlZWVkZGVlXVNUVFRUVFVUVFRUVVFr0tPS0tLS0tLS0tLS0tLe6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMzMzMzMzLy8vLy8vLy8vKy8zLzdTU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7OztDU0s/Pz9HTz8/S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fW19fX19fW1tbW1tbW19fX19fX19fX19fY2NfW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs/KlqXRz9K4n9HRnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/PnKqdrdWyl5i4upW4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Qy5SImp3MnaOosdGSfX6vsNLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9G9yJmZwsWIm7bV082ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0peUn8vXpZu11NPAoKDQz9DQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P07ObxJjU1aKatdTUr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NHOjZCewteimbXU06OhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRy9qoma/aopq21M6en8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyY6lmp602aOatdfDn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyruhpqecy9eim7TZsqSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTnpCNttbVsoTG1rmDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dK6xNXS0tHE1dHRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz4+QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS1dTS0tLT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PTk7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODo4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Njg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfn5+fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ozw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzs6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+goaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0E+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ6enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmZeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZyanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqSpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaepp6moo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6qqraioq7CpqKqooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT48Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLavs7CrsbKxop+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKShn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopqYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FtaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1try8vry8vsa6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NDREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9taHF4b3lqaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGw8TDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7G+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N5ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8PBxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLWzv8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjJyMjJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcfBy8vIxszKzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1b3RiXWJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcLDv7++xMvIysvJvLrV1snMyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2RqZWFqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7m4uby9wcfBxrnKypzBxsPAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vcS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJnY1taWlxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vcC5vrq6tMC4tbeyrrq7tsC52pt+vMK+wLy7xL67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrq1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb7Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygp6GjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJiZ2pnZmllaV1WVlRZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3r663tbi9ycqDhKXHusO1use4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoaKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhxbWVlZm9pZWtoWFhOS0tLUklMSEM5PTg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDk3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3ube6u7q7v9Gpe3+Jur/Ht7m4rbe1uLq0uLO7xcbLwbzGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyYnZ6knJaco5yeoZymln5/h3xrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK+wtrmyvb67xLa3t6aYp6antsTIjHl+hbnJz8LAuK61tby+uLqyvsTEysXBysPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZmxpbnRueGNnYltjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwutHTtLu+vMW6tI5uaHBja3mfrHt7goW70dHMysS1usDDyL++tb/Bv8bGv8vGw7/BvMDDzMrHxcbAub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzw7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRDxBQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxs8Syxtm8vbvHrY54Y2JqTlJaYH55f4WJvMrMy83KxsLEy87CvLm9ubnAw7/IxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi1vLi9aXe9zr+4r29ZYmRTbGdTUVFbc32Ej7vDx8vIwcPBwMnKwsC7urC0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysq+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKSen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7trvBwHRpfau+tnBWSlZqSVqBd3NUUGZ8hZq8vb/GwLnAvL7FxL29ubKwrri3v8PHw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX99dmx1enBuaVtfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJDQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5yb96d2l/qZdWT0p3dE1RbHmDe1BUgomht7i3wrqzu7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKOoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZl1aVEo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2uMjAg35zcZNsT0hciWhPT0+Brn1dS3ikqLGyt765srWyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cWxfY2FbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fEu4yDe3h+YUlgjGpeUU9ega6OXlBOe7a2sLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWZYXF1STk1BPklCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4usGbjIWJflNNiJ54alpWbF51h25veqW8trG0tbK0r6y7uri2usDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO8qpCNlppMVYq9ZHuCiWdie2pibXagvriytLOwsa2wubi2vri7v7Kysq6xrrmvqqutrKOooZ2enpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrCkmqSdTGB+j3lseX1jYWprdHltgqS3sq2zr66srra2s7y1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mopujnJWQjI+PkJOQl5WWmJ+enpqYppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdQTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKm0v7Ozb2GFb2lpV2NdXlNUWWNhXHF7oraqsrSuqquvsLK1raWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZmqOZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSkhHT1JNSk5HPEVAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoaihpsPDkFV1bmZvZldbUUhFR0lMS05hZXuzr6+ztaqmrKuinJmUjpGWl5mZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR5eWBiUlVgSUlKS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnp27soN9YV9tYVRIRlFLSURJR0VKVVlcpbKwsLispqGcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysbSqsq+imZydnqGZm5uamJmblJablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5PVUxTTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopueo6ehf2doX1RHSVZ9fmhTR0NCRkxQU4qxrqyvp5+eoqCXkZOboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGhj3dqW1FKRkxxoKegbE5FQkA/QlSDoKuqqaSfn5mSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6ilpJ+dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCV05KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempykoHlnXFJNS0pSjdnZwI91ZFZJRFORrKitqaqln56eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Svs66qr6Odq6e2sa2isKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rya2t1cnBoV1tRRVRIREpQST9FQTRGSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian5+aoJ5uVk5MTk1WZ6HQu6CXuKaQiZiuuK6no6OhoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLBxr66tLq6tLu3sLWyqrqyrru3v7u6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hqZFpbRktMRURTTERCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGinZyVYE5GSkxWa36nuKqGjNTWxr+3qJ+anJuenpmXl5eSjI6Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcXM0NLVztPJvcC/w7vGxcjF0dTN09DT08zKwsbGx8rIzr/I0czHxcfFwbzDwb6/vrW+s66/v8LDx8THxK6/uLK4vMPBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jn5yelFxKQkhMaHmpuKGQf7HLu6+pop6cn5qYlpSSlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1dbT08jMx8zNydLNztPNxcjJysHGy8fIyca/w7OzyMTLysvPxsq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoKJsSkpMVXWizdK7oaSzqqOcnJygpKCdmpSUlZSJfHdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ1tbW0tbN1NbX1NPR09TU08/Sw9DT1tjV1tLLyc7Ry8bN0srS1tbZ1dfT1tjO0srP0czO0MzSz7/Ix8rDzMzMzs/Fxse2v8q/0c3Lz8bJyL/Dw8jOzM/Qz83Kx824t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUhJPjtBOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKGsgWVydpCz0dvRva+pmZWYoJyaoKCem5yZlYl3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1dbMz8/KzdLLztDAxsLHxc7N0dHRyMzNwMrMxdPOy87IxMrHxsjMytPT0dXP0szTwbnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1eVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGloYKKkrTS0tXCraagl5aYmpucn52YnJ2TfXFlY2NfX2FfX2FgX2BgX2BmbnBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NjXy8jOxMnPzMrMwMm/x8nNzs/L0M3OzM7PyMvQ0MrOysLJx8nMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNV0U7QD0zMzw9ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2pp4FsiIfA1cywm5uWlJebnp6fnJSWmJSIa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vcnR2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPx87NzdTMztPNy9fW0MzR1MvM0NLTys7R1dLV1cq/ycHFzMLIycLMw8XIysrPys3M0M3Ty8bIz83Ix8vFxsHFyszNz9HG0M7NzczPxcfBuLm9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeXBxa21nYGBwaFhYaFZMRkxJUFBCO0M+OzY3Ojg5OjU3PT1AOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7SooKxqaH6T1tCqlY6NmJaRk5KRlpaWkIt8ZWFiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0c/FusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS+wMfMy8vOwsvLyMfL0MTFyLvHw8nIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raWlX213qtSqkI6Ol5CHhISEgn6FhX9zYFteXl5gXmBjZGNfXV1eX2BgX1taXGBrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMvNycTCy8nBwszQxczIv7nBu8bHvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa8vMDDxczFxbvAysLFx9LFwcm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWbo6CblHt2c3RmaVphbmxaW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKylV5wd7i0j4uTl4d7gYWGgHZ4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrG2urKys7Kxwry8vLq4wcHCxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw7+8wc3Dxr29tcG9w7q9xrvCurO8xcTBwra/trW9v7vMw7y1usi6v77LxMHGwsbJxsjG0MbCzMeyx8nDzs3BxcPAvbO3sLKnqKi5sKWtsKqtrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7RysrKx83NztHI0MbV1NbXzcrPxcnFx8G5xb2rr4Zgc4OwkoyJi4V5gYeHgH6EfHR0Y1tcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i1t7Szs7S8tr2xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wcK8uL3GwcO7ta6ytrq/tMS3u7WruL29wL2xuravtrqzxby3rru/tbe0xby+w8XAw8XGyMvFwMbGu8jLv8/Kx8PGwsO3w729trm+x7+stbq1t7aOeXR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HFwL66uMm1qbGGaHOTnoyGiYp7eX6Ghnd4gn10aV5dXV1fYF9gZGFfZGVjX19cW15cXV5aW1tdX2xwbWhmam1ucnykx7+4uLWwq6ynnqKqp56rrbOtqqyptK+3sLKprqassry6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCywLa4vbCwp7Kztbu8q661pa61rruysKm5sK27rru4u8DAvbnCv8fDxcG8xsLIy7jFx8W/xsPDusTGwrvGyczLs7nCvLuziHN2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fOwcPGv8TEw8PKwcnKvr+8wLqytLTDrqmviWtjiZOIjpB8eH6KhXp7hIF3bl5dXF1dX2BfX2RiYWNjYmBfXVtbWlpdWlpaWlxlbm9oZmdpa25yga25sLWupqWnp5qgpaGanKWrrqSooqyqrKqwo6afqq21trG9ua+3r6muuLS0vLi0vK+4ubWyu8GywK6lqaKrsbKzqL2qq6irrK20s6aoraGkr6mypqeorqaot6yxsre6uruyvL2+vsS/tcLBx8i3v8DFt8TCv7u/xMK+xMjMyr++xMDAqYdzdHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvBy767yba9w766ybfBw8G0tbu1sK60u62oqIpjZ4uEiIuAe36Afnh0f3xzd2VfXVxcXl9gXl9jY2FiYGBfXV1cWlhaW1tZWFpcX2ZrZmVnZWlrb3KFqqWspaCcoqWUnqSbmJKho6qkop+mpailraCdnKWmrLKvtrensKuoqrSrtLqxtrWutrmyr7q6sbakoKSfprGnq6i5qqSmp6insq2gp6afm6SmrJ6fp6OgobGtrayytLO0sLW8trvBwbK6vsPBsrm5w7PAvb+1uLu9vrzCx8TCw77AxKCDeHBrYWZfa29gVFleSE5nT1RIRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci0tb24usC6vbWgnpWdoaa6tquzs7uzxM/Iy8LGuLfHwcy/uMm3u8W4s8S4s77Aq7W7saukrrKsoKKNYXuHhoaBfHl1dG9ta2pqcWleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlpuhlpuimJaNnqGjp5ufoKSmoqiem6Kbn6uwrLG2o6mqqqyspLS5rbewrLO1rrK1rrCqn52fpKKypKapuK2ipqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqysrbGyuK+4ubuwtru7uquzs7qzvbS2sbG1tL+2vcC9w8G7u72Xg3tza19lXmRkWFRXXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7xMPPvrnHuLe+t7LBtLG7u6u4ubChnqiqppeeiWWDhYZ/eHJucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dYWFhYWl5iZGVlZmZoaWtyjaedlJWVm5ibopaWkZyioqidm52lpqKmnKCgm5murq2usqCloq6rp6K1sbKyrKivsqe6s6a1oKKem6OhraOiqrWqoqOmnaamo5aZnpeZm52gmpednZ2craGrp6Skpq2rs7SqtbCzq7K5tK+qr7Kys7ezrqmsrrK4sLq2ur2/t7OxlIV5dWVeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lpJilscK1tr2ttLjCzMjGv8W2wb/HzrfAxL2zubmyv7axuLqssbStnpmjqJ+Smn1ogIOEf3hvcXRxaWZkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanainJSUkJWXl6CXmZWYoJ6hnJahoqmkn5+pnZyaq6evsKqbo6S4qqGgrqi2qqanrbCkuLCkt6Cim5mZqqahmqy4sKKhpJyin5+TlKGUlpabmJeWl5yVn6qeqqSinaOqqrCuqLSrqqetsrClq66zsbCwrq+mp6eyrrG0sLy0ubeuo5SBeXVkXmFWWVdTUlRLTV5MT0tHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64va6dp6ijqrvAvcC5rrS4wczHxcLDvcW3yMyywcLBrby7tLu8tLi5r66vqJuYoKeTkIp0e4B8d3FpbHJ0cGloZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZqgZaTlYySlJSbmZ2WlpygnKCWoaCnpqSmp5+dn6agqq+mn6Kkt6ihoaKotKKlqKWwpbCtq7SeoJ2VlamhopStsbGfoqOdnpibk4uhlJGTmJiSl5eYl56nnKehopmjpaWrpKWwp6Wjq6utpqmur66rqKqps6WmrK+0sa+8tbGvrqCSenZyZGFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsbHtsbEs8K/xaq3t722vbq6tbKrrKaYl56ii4hyfYh+dm5jYmZpaGZoamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVlbV1VYV1VUVlVTVFJVYGBfYGFfYGFjZGmBlJOJkY+Uk5SdlJWXpJmgl52hpqKtpqSko6OinKqrpZmfpbGqoKGdpaudp6Geraypqa2soaKilZijm5yQq6mwm5+in56XmZOJnpGNkpOWkJiYk5yho52koKKVoKKkppujq6WipKqkq66lrrKppqWmprSmqaits7W0ubqvqayei3Jwb2BbV1ZVUkdQT0haW09SSVRLU0xFRklDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLTE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvbG+xMmssbjBtbvAu7SzqKmklJmam4h+cIeDe3RpaWlsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl9fX2JkbY6QhJGHkJGPmZOVk5ybo5yboampq6isp6impJmlrqSUmaWvqZ+bmZugnq6ZnKuzoKWmn6KjoZWTm5aWkqmqrZqcoKGgmpSQjJmOjJGMkY2WlZCdoaCjnJujlZugo6GXoqijoqiroKuvo623paOjoqytqqirr7O3s761s6uvmIR0c2hbWFhTVVFFWExRW1hNVE5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQwLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtqLO2rqmnr66bqairt7asu8q7tr+sy8bFuMHOz8izxLu3u8PIsa24v7e8vbqys6OnnpSWl5WGeHOAdndubWhtbm1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGR+jYGLf4yQipKNl5GXmaKgm6CrqqaurKivpKman6yglZakqKedl5CPmp6ulpioqpmfnZSloJ6SkJKRk5Wnq6WamZmenpWNjIuThomNg4+LkpWRoJ6ho5eVn5WaoaKelJulpaeoqKCxsKaxvKefo6y0q66nsLWwubXAsa2xq5B9cnNiVlNWTlJJRlZQUlFMTFdNSkxOUkdNSkFDRkRDPkA2NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qmorCrnaqnqbKxpbbGtLm6s8rFubrBy9DLsba4vL7Bw7GwsrettLO6srGhoZqbl5aSgn52a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVhcXF1haoB6f3aJjYeQipeJlJSYm5meqZugqqalq52omqGlm5OPn6Obl5eFhJKbo4+Uo52WlpaIopubk4uOipCapKeclZWXm5GRh5SOi4GLjYCQipKSkqCan6KVlJiZlaKmmY2ZpKaopqGftLKosrehnKK3rKqtpLKyprW8tayrsaOJeHNtXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDEqKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrGlp6OppaCopaWzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatua6rnZiZnJSShXqBbV9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRhI+LlJGUnqGPm5yjoaOYpZeinJWNh5iajHONg36Nl5aGkZmQlI6Oe5mPnIyCiX+KmJ+jnpCTmJaFjYKUfn50io56kIeTkJCdmpmakZWQnY6io46JmqChpKSborSvrK+sn5iluKamsaGxrpywvKqpr6qZgndzY1ZNUk9QTUNTTkxRTUJQUUhJTlJNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6emtMG4sLSwycS3ucHOxb6zrLrBq63DraiippKdprWroZyOlJWRjnx2fWVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKQg5eGjp2Xi5SQn5idlZSWlY+WiYCTiV87V298i5SJgIyRjJCGhnOKhZaBeYF6hZSdlIOVjpGQg4Z9k3hxcIWNfYmBkY2Pl5qYk4qPiZyIn5iIh5aemqGgl6evqa2oqJ+WrbOipq6ZrKuYqLSiqa2jk31ybmBbTlNSVkxEVEpQTUxGTk9JRUxRTUtPSklNT0ZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygoKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaijqrCop7TBubG1sMfCt7O9z7+5r661wqeqxamjnZiDlJuuoJiVhZOOioZ7cnRcUUxSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkB/lZGRfYmUjYSKjZuNlpWJkoiGlYZ5iH9gSlFueIqRhH2EjYqFf39ufn+Ud3V1d4SNmXBRjYiKhnt+eJR2aHeGiH2KiZWLjZGSlouEioiVhJqMgoSSm5aenZSko6ippaSem7CqoaSkkaaqlqKqnKKmqIl0bWdeW0hRUVJNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4Ozc3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foq+hp6ilp6ivrKq1vLa4t7PBu7anuci4tqiotbaqsrymnpWOf4mTp5WUiX2Ng4F8dm9tWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYyTgZKZi497ho+Adn94c251cHSNjoF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4F2cnKSd2d1hISEhHuViYiKjIuAf4SLjICUg3yBj5iVnJWRn52pnp+gnaCppZ+dmI2npJOhn5aenqSAcmhhXF1KVk9SR0pYUk9KTE1SSkpKTFBJTFFMUlRMRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppayrsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjZSAjZuNkH52hXd7dW9uaFhLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g3x4ZneNl5iNj31oeYF2eICJj32EmJKBcYePfHd7b2t+rX1zkIt/e4aSgX1/dGZ2fIZsb2hzfImMiIBseXF9cG11j3FpcYB+jnBDi4SCg4V/d3d6i4V9jHt1fo6Sj5iKkpqbo5aZnZqdnqKdlo2LpZuPnpeOlpiPd29tZWJaWFdUUUpTVVRPUE5QVktOS05PSlFOSE5PS0VDPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM1MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsa+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZjoSSeYiNiol1cHttdHBpbGlXS0ZHRUFAQ0RJTExNUVJQUVNUVFRVVldXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ6fX57dm90c4WCeYF4cHyOjIqUg5aXmJqQkpWXmZeel4yDiZ+Ri5KNhpCWf25pbm9uWFVXVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzs5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2woqyqqLWvrqy0v6u8wr+mopmVpJedjYSLlKGhmJiRk4tzjnp/hYuFdG50a3BsZGtqWE5FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxgp4himml0emV/cG1/eouJdoGIhnRsmpJ0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcYB8Z3Fxe26TjY97c318cXBudW2Cf3h5dWp5iYKIioSWk5KQi42RlJSPl46AeYiXiIaKhoCQiHZqam9oZVhRWldZWVtNUFVWWVhOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6e7r6uysMKxu8PHmpaPlJmLjYV5hJCYlI2QjI+GcYeCc4eMhXpvcnBub2RwZl9URklDPzw7OTo/QEFEREVHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4GFgXqEhoZ5cqGVdHiBc3WUhzVxnaidjqGhhKKFdnCGfId8c4ytjYmAZ2Ziam5ybXCDdWlvWHVwjpqSd2x/e31tcW1wgHpzdm5jdoR+hoCFkJGKi4mRi5GMi4+DdXiLj4B+g4B+j3pxcG9rYFtcXltZWGBfUk5bWlhXTEhKRkpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKyoqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGepKeer5Wltaqusa7BsrvBxpaQjJSQgIh9boGQkomDioePhXWCg2yViId7dHh4bHdud2NpXklQRz5ANzQ0OTs7PD0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoGFmYSbnGGGqp+di4OQjnp3iH6JiI1zipePhHpdZHF0ent3imxnamJ5b4WPgnpugXd0hHpwdHp3a25pXneHfYd8iIePgIuSl4ONhY2HfXGEf4R9dXd7fIl2cHN0ZWdfW1tdU1tmXldRVVhbVUdKSkRMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkp2dn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYSLfX2BfnCAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc218gYaHfY5oZ2h4fm6Fh4KFcYSFR2uAd3J5dmhta193fYOJf4iFjHqVnpuJi4iRf3p1i3Z8eG1vd35/c3NybFtdXVtjY1hmZVxVUFBWWVBETEtGTklDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMzM2Njg6PT9AQkVHSEpMTlFUVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYiRgZqVgqChl5WbmqWtk5q7sae7x8OoioyhpY+UiYGRe3GDnp+RnH92hYWKj4iQaWhvg4B1jYeEi3GGgneHgHt2hX1udnVngJSPhomIiIiHoauhlomOmH96gol6em9na3h+en5yamReWlpdalxhZl9ZT0tOV1JRSFBKRE5HQ0pEQkBEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjICBkY+LmpuknaGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYyLgomNg3+Jf21wal1CQTQtLS8vLi8wMjIzNDc3OTs9P0JFSEpOUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSEpMS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCjqGflJmShIqFj5iRlmxwdYmLgpaMjY92j4RxbIWBipaSg4WIcomhloeTiY+PlqW1qZuNlaKDh5OEfX9ramt8gIGBc2FdY15aZmtca2teV0tHT1NRTk1MRklQQ0RNRkFDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpiWmpWfn5ynoKqWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioWZkpGCgICLjYmFkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI1NTc7P0NFTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWdn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJSShpyhmpqZp5GRiJWimpp4en6UmJKhkpeXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJaPjoGIbHNyfH98cWhgXGBeYmdjYGdnXFFFSktQT0lKTEZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYyKhJKFg4aJgYCGd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTU9RWW2GkHeVi6OnqrS9uKWurKynqLSrsLeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2rpIuWmIWmpqCil4GmmY2iqqikiIWUpKGgqqGkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlqoiZiZKKlnp6foV+Z2BoXGViXWRjX2ZmXltPQ0lIVE9GSExGSkdFRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBlIWIgpyDkpCNktrInZZzVpeIj4icj3yGjI6KinqIgoeRjoOFgIuFhoeShoKEiYaIh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSU1VVV1VOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Ors8a2rLO/s7i+tr+0wba7u6S4xqm2yce1vrm0qKO0rbGxnJqSmp+Jp6+rpJV2n6SXoauxs5iWqq6orra7srqsr7Wisayxtby3ta61oKeoo6ibqbCtsrq4uKebtqmMpI6Rk6CHeIKDdVlhZFZlYWFjYGFlX1pVSkRFTFVRSElKRElHRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoV+gI17v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhYGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY1MC82Q0hDUVxPUVVXVVxWT15VSUtKQUA/R0tGRUQ7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczJtrzFvbOzwLe4wrW/sLh0srSmusWksMa5sbOxtKiktbaqsaCilpuikqWwrqWtrKekmKCss7qiqbK6tbu+zL/Fxb29s8K3uri/t7q3uaytsKaxqq2+sL27wsKsmbqolK6PmJiriX6CfGpXYmFYamVqZVdbY1lWVElHR0xRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNz9GUUxBTFJXVFlVWndqcH+PhIGOhW56cnmIYrihmaOJlZOWk5OTjZCXkoeHe4aBjZWKgISAinp8i4eGfIqDgYqDlX13eXVlT1xkR0VMOlFkYVteU0Y/O0hQRFpjUVFZWFlnWVRgYE1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tMU1pUXZOvuLW6ucnAu73JzLu8wLy3tby7t761urLGYHWzpbGanqu9qqWoq6qjorK1oauonpWWn5igrqWnp6WepJSip7G0p7KyvLbBvdPJytPGwsXMwsrDwL69v7u8t7Swube3w7rGvcPJsJ65qqKsj6Wot4mBf3FfYWFcV2FfaGZSWGFWUlVJRUZOS0E+R0Q9S0I9QkA9Rj07SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5MzczNTI2PzhAPkdLUlRUUlBQUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1obGxxkI2FkHRtc3JziNXAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWi3+Df4J4eouDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1fbl9YZ2VVWVRKREFLSkhGSEhISEJJOUQ/SEtUVFZcWluSucC5vbfGwLu5ysu6t7m2uLmzuLW0rra2mWR1qJ6tcF6irJyYoaObpJ6rpZSgn5CUjpaYl6ifpp+fmpmEpJ2spaqwrbewvbnU0c/Xz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/IzrSku7C1sJusub2af3lsXV9bWF1hWWNjUVtgU1FLQ0FFRkQ8QEU+QkhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkZRvbG91dYizrKGhn4uZnJmMjZWRm5KFiop+iIeMkIuJfIGEc3uJg4Z8iXSCioaVf3N7eGxtdXtocmVpbGlmamloYGZpaG1abXSXraS8iIdnW29oXVpZVEhKTlBKS1FMVFFJTEFKR0tQX19iZmlhmLfHsLmzu762ssTHta+5sLC7rLOxp6q3rI22p56bp5pPm52MjqCWkaaYpZWKk5OJkImPkZGem6GYm5WXh56appusr6ivp7O01NTV1tLLz9PVztPPzcXCydC/ysnLydLIzc3C0NK4sMS8xLqmtrvEo4JuY1xcXVhgV1hmWlFdV05QQ0JIRUJJO0FEPkFIPz9CNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDk9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiDaHFveXmDoKqeppeNm5uXi46VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj31xeHVscXh+cXtteHNsaYFwbWNpbXB5aXd9fsu/wt+nbWN4bmNbYWBKUFJVTlleUF1dTlFOVFFVVFxubneCcpauuKy0p7C2q629wLGrtaaluKesrqGstKOOsa6amJiMkZSRhI6bgY2mkZyJg4uEiomEi4OUlZiXlJuRnJiZmZ6eq6ykp6GsrM7S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxsDOx8jDqb+40J55bmVdYlxWX1JdW09QVFBOSD5BRkFCRTxAQj5FRT4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd213cH1+gKGenqGLjZmTk4yMk4+WhHmFkJCNi4qIkYd/gntyfoCCh3qFdYWTkYl/b3ZzbHN8e3Z8c4F3cWuAc3Jpb3F6eXJ7vsuafoyyg3ZyhHZoYWpdQ1paW1ZmZFhla1RYXVxgY11jeHt/i4GZqqSkoaChqaaqsbiqpbSjoq2io62ip7GfiaaalJKRipKOiIKTiWuVoo2ZhICFfpGDg5OWrYuVjZWZjoWSkJ2Xp7ChoKGkpKjHzc/IwsvQ09HU0s7TzcbW0szU2NbW2NXX1cnU2s3J19bRyq3Ew8yKcm9iYF9YU1lSXFBKR0lJSkA7OjtFQUQ8QkQ+SEI/QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeXKCiYGdlZ2UhYuWiY+KiI6Hj393hJSZi42IiIuJfoN4c3t9g4d3gHuHkZeBg253cG11f3Z4fXOFfHlth3Z0b312hHV5e521jDxBi8alfo18aWVWSUNlY2ZjaGpkb3lbX2Zoa25pboCDiZGLnZ6gnZCXmJ+jo6aypKSzoKKlnqGpoKKxnIaekpKSkIuOi4aDj4R+nJuMjYOEhXqUfoKplaOMkoqYkot9l4qakauzmJqbp5ynvcPGuLbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydra0ta/zMy0d3ZuZF1ZUlVQWVZGR0pKRUU9Ojc5QEFCOkhEQEVDQURBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoOJhoWKgod8eIWWl4iPg4eGh3qEeXF6e4SGdXqFjo2deoxwfG9wen9yfIFxg4eBbo56dHd9fIJ1f3yHiLB0WKnCtoySgnBuYj1eaHJwcXBueHeCZWlvcnV4cnuLh46UkpuWoJaHjJOboJufqp+grZyimpmfpZ6frJmLmoyRko2FfYiHg4SLjqCZk4iEh35tmXmEmIaIk4yNlYyGe5uIk4+uqpSVl56Ypq62vaitvcbLyMnLy9DJw9HK1NbY19jX1dvX09nb1s/b2tHWyNXLlXl7aGhbWVBTU11IQ0VJST5BPj03Oj0/Oz5IPUBBQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTQyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDk5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfHyEl46Hi36Gh4B3gnlue3uGgXR6kp6NoXaPdYJ0dYF9dICEb4GQgm+ShHR8gYV6doZ7ibfGpMLJuIGWm493cGVOZmOBeoF3hqKQi3l5d3uDf3yEdm2UlpSVj5eQg4mPlpqXl6acmKCXn5OSl6OdmquWkZGLjZKDjIWJiIGFkJGenJmJhYyBhpd7iIifl5CJjYqLgnyhiZCLvKGXk5eZnKimpa6ep7W+wMC5x8nNzsXNytHW1dTZ1dfb1NbZ2tvX29rZ2M7bxoZ6eWZoZF9UV1ZVTUtETUM7PT08OTo8Pjk+QTY+P0A9Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXp+gpGJhIV6hYh7dX10bnx9hn50f5KekZ+DknyGfniOfXiKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLyMnKScfYmEfYlzjIp+c6aanJmUhXuPkImEaEdxoaSdjIuQkoWIi5GSlY+dmpOVkZeNjJWfnZShlJKOjpCLfpCPjouEiJKWmp+fiYyUkp6Rgot/ppmIhY6ChoSApYaKjLiYnZGUlqGnoJ2enaOutrq1q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld4eHdqaWRWYFtTT05IRExCPT0+OTk6Ojk5PD02QD4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY+KcXJ4int7f31/fIh6fHuLh4J+dYOGeXN6c22BfoR9d4aboZuelJKAi4h/mIeAnJJuh6iFeqCLfJCOg4iEnH6akYqNo6KgkKSvoIuRi4WLgZKGV3Kti5+snI+DmJuQkI5cg6KRgoyfk5WMhoiMkpOMlJWUkIyPioiWm52PlZaRi5KUhoCLiZKNiYqdlpmjo4aTnZahi4qIjpyQg4iPgIOHhaSGjJCzmJySlJehoZ6Zkpudp7G4rKW8wcfNx8bPzM/Mz9fP0dSu1tXY2tna2tfW2dqfb3x0Z2ZcXVhTVldDQElEPj8+OjQ5Ojs3Ojs6Mzs8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhsYn6Sg25td4t4eX56gX2GfHt2hoSAc3CFgnt2dnV0hIOFfX6SpqOepqKWiZ2QlJaLiqiXcoqyjISnkYSZk4SZjKKWoJmTiZqdopKpr5+RlZCOjYiVi26Nt4SaxMiynaKlm5yYlpGykGOkzciVjoaHiZCSjo2TlIqFioqGlpqbj5CUk4eVmISAj4uZiI2QqpeXpKOImZ6Wm4mPh5eXi4WPjIF/ho+liY2TqJmWk5aYoZifmZOdm6KytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgnJ/aGJeXV1OSVRZQUJHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnaBjn18bX6IeHp+eoKCg352doCCfGxui396fHh4fISHin6Ko7Ono6qzoZann6WjlpWuooOQuJWSs5mMoaGMpJuvo6SdmJCnlqeZrK+kl5WWlZCLmJmWoMCOo8m5q5ujpq2YkZudsp2FhaiinJiFiYmOlY2Lk4+IgYaHiZOYlYyLlJOHlJiGhJGQnHSRmbOWl6WhiJyak5CKkYqXm4mKlo6GfYyYnomQkJyamZOYl5+UoJ2Vnpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0NbY09DYu3J5dl1gVV9WT0hKTkRCQ0U1Pjo3Nzo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpJRU5FRDo2QUBCUz45RE8zMjM1NjU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6e26Fhnp8hHiBhYF+cHh8fn1vco16fYF8eIaLiYaEkqe7rKiyva+krbOzqKOisKyKmrSdo7ikla2kl6mtt6ako5+ZqZepo6+wqZqZnJSVkZegmJq7u67KoWq2uKuwlJifo6uTl76jXqqygomKjZSHkXyOjn2Dho6PlJWIh5OXjJCVjYuMl5iSnZm0l5arnYuclJKNkJKMmZuKkZ6Qi4mVn6GNlI2Ymp2Tm5ielKGglJycpa+ooaSzuKvCyMS1ur27xcfHwtGgxsnNzcTX1tHL1KFwemhcWlNeUU9FQz48Q0FCOD84NzU+Rjw8NTwzNTM0NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFFQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKQIuKf4Fzhod9goh1g4qCf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7TBvLStq7O2i6eyra68qpu7pKitubirpqaioaOjqK+ysaqcnKSYmpeXnqKlpZKkuq6pwLytrbK5paSnfYiHnKy9sIOMjIuQg4+DkY96gYiQjY6ciIePl42LlZeUkJqWnaeasZqRrJyOmo+SjpWRkJaXjpGgkYmUm6OslJaPlJydkp+dm5igoZSanqempKKksLKmwcbDr7C6tsXEwr7NpsfDx8O81dHNxMqIdHNiXFlfW01KQkxARUc+QT9COzo0PkE8PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0I1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZUdgaWdaXVyTjIyIe4eLhoOMdYaRioFvfnuBf3F+gXqVepKUlJiQk5Wns8bJv8LMwcO5x7y6r6u5upeytrqywK6lwKSrr7u8qq2roqKdp6qutLCqm5+qm6GblZ+wtKeLo7q6tsG8rKicsqWkqJSFjqrDxKSCi4+HiISGlZSNeoONkY+RoYyMlJKOiJefl5OZlZimoK+djKqcjZWPkpGUlY6QlZGPoZSGl5+gsp6UmpSgoJikn5qgm6CUmJ6mpKampK+tpcDEwq6ot7XJw762zrLEvsS8s9HKyMK1dXltXFhcaVNMSERMS0tKQUE9Q0Q8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpOZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KCkHmNoZaompqYur3HyMnB0snKws28wbOtu76nur+9vMS3rMGprLO7vqqwqaOlo6yts622taCfrp6lopijtLypm6i9waO3t7CrkrCtq6yXhpqqpqWRgoyTpZWJgXaKknqFjZKQnp+Tj5SLj42Uo5mXnJWUo5+qn5GlmoyPj5CVloh8j5WSkqOalaCinLWmkJ6XpaOipZ6dppielZebpaOop6KyrKi8wMSvpbO3zMC5rsSzu77BuKzCw8LAmW15YVhXXFtLS01KRkRESUJCQURMOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iaCThHiFf5V/f5CIipB/lqGZrqajmMK+x8PHxdPNzs3LvMK3sLm8s7zLvMPBtba7rbO/ubyur6igqKe2ra2psbeanq2ip6Gdq7e3qaWwv8Sxvrmzp6q1s62ulpalrKigkY6SscWnlY59kZV9iJGZkKqZmJOTj5OVk6Wek52Zk6GjopyYn5mLjI+PnohakJaXkpalmWWYo56ypZailqysqqebnqaXmJeYlaGkqKaftqupurzDtaaztcvBuKm2rLK6uK6ot7q9uIJsblpXVFVORkpTTks/QUdEREhHRzk1Rk07Pjc9QEouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJxRmlJUmViTEallJyWoZeplo2Rg4emk4iCh4KchIOVkJCUjpqin6++rqHGvMXExsbOzs7Syr67trG6u7u+z7bEvbe4t7KxtbO4s6umnKuruKqop6+wl6OvpKekpLXAsKqstL/DusC6s6e5tbiyrpWlra+vpYuTlaGNdMGafpeZhY+WmoyxlZqalZOTmZmlo5Wfm5aaqZ2coaCai42Plp1gSpacmpWapZZUlrCfr5yfpZSvrqylmqCllJOZmY6cn6eimbSpqrO8vLyqsLLHwLilq6utsbGjobGytKRwbmZcWk5QS0RQUFBRO0dKSUdIQ0M+OktVP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLp5aOiZOFn4eEnZePnqCao6S1yLSpxrrCw8fJyMjMzca+u7OuubjAwc22yLrBuLW6sK+vs7Smo5uqs7SqqKatrJmkrqWkp6y6v6irtbe/wb++ubOyxLG5vayjrrWsuqaInJimm3a/oIWZnY6TmZqLr5ehnJyXlZufoameqKCamqqaoqeemJCNkZ2DbnaSopqVnaKekK6yoquVqKqXqq6lpJ+lqJKSmZyIlJyinpaxpqmrura+s7Kuvrm2oKOnqKWnnJusqamMYmVhX1JLTUdITklVTD1MRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauUnKGfu6+ZlJ+Lk6qbkZKTiauNh6KfjKStlKOjtsa9tMG6wsLHyMXCzcjBvbmyr7m0wMLKtcWxwby0uqqora2woqKZqrS7pqmmq6qdqK+no6qqvrunrby0t73HvLe1uMGxvcCzqbW3q7+lj6OYkaKgvJ+JmqCZl56ej7efqZylo5ucoZqopbOhm52mnKiqnpmWj5Sbi5eJjKWilJ2inqC0r6Wlk7Crmaurnp2ko6iRlZWgg4+enpyVqaSiobS0urWtqLWys56coqWal5WYqqGed2BcX11KSEZHTVFJTUVGRkJSTEpCRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Wnl6SfnsOtm5ekl5mpnJaamo+qlpWnppWtrZmhq7bEwru+t8HCwMfEvs3Gu725sq+4s7/CyLW/r7u2uLampKqsraCgmqqqxKKlqKumnquvrKKpqL+3pq29sLe2x7a1uLi/sb/BtrSztK++o5ejlpSclK6gkaKipaOjn5C+pamdqKudnaCbpp+9opijn6Kpq6Gdl42VnpOeh4+FjZOepKGdtaylnJWyp5mvp5+aqZ6gjZmVn4SNoJqbk6WkmpirsbWxqqWqraycmKCgko6QlqielGhiWWFdT0lHSk5MSEVESUE9UElBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQzxDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTpuUkY8S3hlYldMopqjnJ7FrKGfrJ2drqCTo5+WpaCmqauXtrGjqrK1xMS9v7a/wrvIwr7KyLa4tbWws7O3wca2vrC4tLi1n6asqqydnZ6lo8GloKqtn6Spra+ipqe9taWxvLi2tsOys7e5vrLDwLe4rrO1taOdpZWSlKGuoJminamoq6Oaw62pnqytm5uemaahvaKdpZirq6ymoZmNmZ+Sn4mPV3+Wn6ahoLiqp5OYtqOfsqGgm66Wno6ZlJ2Cjp+XlY6ipJWQpq6yq6mhoqWllZWdmIuPkZOknolhZFljYExISkpORkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckhFNj11ZVxLTp6foZiew6ilorOhnLKok6ukoKSframsnbuwqKy1scjFwcKzwsO8xsO8xMq8r7C2rbC0r7/EtLmxsLm0rJmosKmpmp2loafCrZussZuqoq6wqaSnvbamt7u9r7fDrLOzwr+yxrO6t6y0tq2qoqaWlpWkrKKfn5qoq7Cvr7yypqCpqJmZmJOipLigoaSTr6+spaefkqGelZ6PkI2VnZqjn6ezpqaNmLSco66anpuukJ6Tl5SagJGhlo6Nn6GTi6assKWmoZygnpKSmpOFi5KNnJ5/YWVbZ2VKSUxKUkJDQElHOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo5+boMOopKqyoaO0qpWzrKeipLKsrqm7sqywtbTGwMTDtcDEvcnEtcDIwbSrtaivuKy/xLS3rqy2uaWZq7Grqpifppetu7SbqLCbrZ+utLGnqrmyp7qzt7K5wKq3ssK8tMWnvq+tt7WqqKyhl5eSpqWio5iYpa+4rrK1tqCfqaSZlZWTpKC3o6Smlq6ysqerpqGem5qblpion6CYop6vsqKmjZeumaWrl5mepJGbjZOXmoWVnpSMj5yelIupqaqhp6CYnpWMjpmQgYWViZSfeGNoXWtqTVBNTlQ9Q0FOQzo6SUA3N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKOcoaa/pqivsKGptaudubCro6q0trGwubevtri4xb7Dx728xMHGwLjAxsC6qbakrLuswMK3t6mssbqila2wrbKWpaeQqrmpoKewnaqgsLSyqqm2tq27rLOzuresubDCur2+psOrsLevqaurp56YmauioqCRmKGxr7OrsbqbnKmgmZaSl6aht6mlo6KwsbSrsqirn5ugoJuepZ2il52js7Can5CTpZqgqJqUop6VmImUmJOWlpyTiJCbmZSOqaimn6Kbl5uTh46Zi32MloWPm2pobGFsbldQUVpUQUNFVEA7O0lBNzpYUGReUFZXRFleXU1MUk5eS0o+WmNeTkhQTltVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKGpvaGqr6ujsbippbWzrKCttb2us7i8ur22tsDDv8jEucTBwMC4xL3At6+1p6u3sbu+v7SprrG2nperraitlqeojqe7n6Sts56rorGws6yptrS1va2vsbWssLWxwLrFt6u8r7G4rK2qo7Gmn6WqoKSXkJmgs6qzqquzmp2nm5qVjqCmpLSup6Ktra6xp7OtsqqknJ+opJ6VoZmbqLWpl5mSkp+ZnqCekKuel5iFlZeLnZmbk4qNlpeal6akoqCdlpWXk4CPlIV7jpKDjJZlbHJncHFfRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0dERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19hVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqGkrLakramlr662qq+1uqemsLfFt7G3v8DBtbS6xb7MxbnCv7q/ucO3wLixtKupura6ub60qq2xtZiYp6yqq5usq46rvZ6rrrGjq6CxrbOurrayubeqra6xqLWvs7u9yrKqtrWxtK+up6GzoJuoraCllZabmrKjraCmr5ehpJqako2ipaeyqaKnsqyqtqWusbWvpJmdraeamJ+Zmay4o5eTkI+YnKGYl5Srn5yTgZOYjZ2cmpWPiZSTnpqkoaGgmJaRk5V6i4+Fe4yKg4uSa254bXV7YEVhallJSFlaPXtKRkQ2QWJUaVtNXGBKW11aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVEtEmZegsaixqq2mpK+utam3tLmkq7S3ybq0uru/vrS0t8PAzMi7w7y2vb+/t767sLytp7q4t7bCtqutsbeUl6auq6ejsaqUr7ukrLKyp6ijsrOwsbG1sbizqa6rsae4r7W0w8W2qbW2rLCtqaejtp+gp7GgpJScmpWxnqecoKqOqaOem5aYpaWlt6eisrSsp7KnrbC1rKWZoKyom5ydm5SquJyUjo6LmZyil5CYpaGelYORlZCdnJiWlIeXkJeappujoJKWkJCVdoSQh3uFgYSNi21xd3V7flxLZWxcS05jXD5ie0dJOEdnV2ZbTF5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktJV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi49RUxRPDNya0pDQ5GZpa6lra6rp6WxsrOqt7G3oKu1uci4rsG8w7ezsbXCws7Fv8G9tL2/v7q+u7HDp6m4sLa2v7yvq7OynJ+nsa2mpbClnrK1rKuysKypqLS5rLSytay0raqsqKupuK2xsMe/uKW5sKmtraWorbCmpKSvpKmcnpybr5mjo6KjkayepKCfoqqlprmlrLW1paqrqKyvtq6jnaOpqpugmpqSpLSaj4mOh5GioJWNlJ2glJKFjpKSnZuYlZOGl5OVmaaanp+MkpGOkHd+jYV8fH2HiolxdHJ+fX1cU2RvXk5ZZlxGRJZbRztObVhiW01gYk5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVdTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorOkk/M0JJUyw+j2s8R0iPnKqroqmxpKmls7SxtLWysqGrrb3Luq7Au8extK20wsLRxcW+wLK9wMK8v7e8xKest6yzuLzAsKuxraCjp62qqKSwo6qxqq+ssK6vrqyzu6e2sLKpsqmrpaWjrbqsqrHCubWsuqipqK2qqLGlqqSjrqqoop+co6yVpZ6YnpmsnaGnqaKspaOtrLixsqCpoqCrr7Csnp+nqKmZpJiZj6CnmIaEj4qLnqCPi4yVm46NhYeQlaCdlpiVhpaTk5ekm5yci5KQjYl+foeFfHd/h4WGdHNxiHVrX1lgbmNRc3FcSzuEfEY+V3RYYFpOY1tOVVZVV1BcYl5TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJRaPkxFlZitqKGqs5yqqrC2rbi1rqulqqq9yLuxvbfCr7Css8TDzs7Dvr+0wMLDusCzyMSsrretsrjAvrOtrqukp6qwqaeosaW0rquwrq2xsLOts7ukuLOsrK6nq6CinrC3qqqturaltrWjqqesrKqtoamnprKypKamoaGslqqhlZqgpp6koqukrKKfp7G3ra2jpaKbqquuqZ2ipaSkmKCZlo+YnZOCg5CJhZ2gjIqOi5iNj4qDjJejm5KQm4yTkpGUopmbmYqOi4p8hoCBg3p0gISCfnR3jKSIeGpeYG5nV2WHY04/Z5NMRWJ5V2JYUmVUTVZVVVRPXF1hVUtNaVdVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGPkhGRJeSsKWjqrGYq6qttau2saulrKqpvMDAuLizu7Wlsq/EycvRv8G7ub+/wbnBusHErrG1sbO6wL6zsa6tq6uotqqmrq+rubCosbGvsqy2qra1p7S2rKykqauco560sqiopLS0oLatoKmoq6mrp6CrrKm5tqmqqqqiqaCsnJKpoZ2gpKKmo6mdnKa1rqimqaKjmKWmp6qcoqSjn5mYn5GOj5mOf4eNh4WenoeEioqNjI+MhIaUopqOjJqRkpGPkp+WmJaLioN/dIaBf394dYN/e3h/gYidj29xZ2dxeFxgc4hqT16ZVkhteFVkVlFiUE1VVFVRT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KajZPRDuVjrCgpauumqylra6ztK+rpa+pqLq+vMCwrritobavycfI0cC+vbq8wr26w8G/v66ysrG1vLzCsbGzq7OopLWppa2zs7mwo662sa+yuqu5rqqutqyqnqmsn6Kgtq2ooZ+vs6G0qp6op6qjq6GirK2ova+srq2hp6ifq5mQr6GYoqGop5+ompmqsamjn62ioZOio6OnmJqppZiXmZ2PioeViH2NhoWEpJeFgoKLho6NkISEk6CWiJGdkJOQjZGclJePiYWFeHSBf311eHmAe3RzemmBhqN1aV5la4F1Z4iMfVNYcF5KeHNTZFNRXk1NUllmTkxWWWVZRlNpUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExoOjQ4Xz1hZD9GMUNQW1srSE45VUE0kI+xn6SmrKSnpKymtLKxqqSwp6q4vsG7r6e5qqausMnHyNHDvL++uL6/vMm8wbiwsLWxuru4wLKzu624raK0pqessra5s6enu7Wttr2wvKatrLWrrZypr6Ofpayrp5yeqrOks6iaqqeppKmeo6mnqb6rtK+unamkoK6cm7KjlaScpKWfpJqaqKulnpuqoZuSm6GlnZiXqaiSmJqTkIqCj4V+j4KAiJ6Phn99i4eQjpCEf5Obk4WTooyUkouRmpGVh4h+f3F6eX58aXh8enVwcH1ohXiEiGRhaGNyhXptZ3ldXlZCV3ptVGFQUlhLS05xdV1IWltnWUVVZlBEPkpORENBOUhHS1M/amFKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmNCSjdHU2BVKj07RFg/Ko+UsZmfoKmlpKGrpLeysqapsaesuMG9tbCjuayoqLHDycnNwba9v7W3v7nItsO1tLO1sb24ur62rbm2v62hs6aqq7C1uLWrnry8qLLAs7qgr7O1qqyfrrCjnKWoqaOenKWxpq+gn6qpqKKqnKSooK28qK6wrqGro6Sunp6tppefm6GjnJ+bmqKqo5qapKSVl5Sfopabl6ari56RkJGMgoqBgI+Ae5qVjYl8fouGj46MioSSmJGHlKOJkpKHkJmPk4CIfHlrfXZ5eGN7enFwcXJ4aIB0aoNnZGhhbnOObWJpcGBwQVx4bFVeT1FRSkpNVFlXTV1ebVdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQwQmhZMTNTPWVfREw2S1dlTyo8M09ZPSOSmayZn5inpKKfp6O4r66jr7Cpq7jCurOtn7ivq6i0u8jLyL+3wr6vtL23xLfDsa+6srPAtbu+t6m5uL2rpLSnqKqwrrmxqpu7vaSwwLW0oa63taanp7GzoJ6kpqehpZmeraeonqCprqegp5ikqKCwuJ+jsa+hrKGspJymp6mampufo5WdnJqdqaaXm5+okpiTmJ6TmZahqZCaiY6Qh32Hf4KOfHyhjY2IeYOMhImMjIWIkpqOiZWfiZGVgouWjJF8hHtzb31xc3RgeXhpb3Fwb2l+cWN6bGllY2Bmhn9gW3Jqck1NfmhYWk1QTEpIUFJQSU5cX25URFhbUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaaEgqPi9ZWDUol52lmJ2WraCgoaSht6uxpLO0qqi5xLWyrqC3rK6tsLXGyMG3v8G5sLS8t7+7v6+rvbC0v7G9w7mpu7q3p6i1qKersK2zsaeavbekrby2r5+xt7CopaewspugpKCkpKGXnK+moZ+ip6+ioKKTpKSjt7ChprGrn6yjr5icqqWpnpeanaWTm5yanaarmpycpZaVl5WdjpSXo6ihkImKkIZ6hX6Ei3qPl4qNhnmCh4SIi46FjZOYjI6WmYqPln6Gl4uPeYB6cHJ3b290X3l3ZGxsa2log21lcmprZWhcY3OAX1prdWlaSX1dW1hPT0pISFJVRjI5X15sUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdBZltIVERVXWhFLjsyYFQsMpajoZeVnKmdpaGioLeqr6C6uaasvcSzsK6ita+srq+0xMS9s7+6t7Czubi6uLuursCztLivv8G4rL26taais6qnqbOrrrKim8G2pai1tamesruqp6apsKyZoqecpKaUmKKypJmfpKipnKKgk6WgpLmopKeup56loaiSn6mioaCZm52gkpqclqCiq5ubmaGVkpWWmo2Uk6OnpI+Iio+GeYR8hYV9nY2Ki4Z5gISHiIiRhZWTkoyQlZSNjpR7g5eOind+e2x0cmxsdGJ4dWhoamdlb4RnaGhkZmlqYGhiaWZaZXtjYFNzVFtbU0xJR0lPU0AhKmleakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OGNOJzKepKOSjqSmnJ6enaO1raequreorMPAtrCsorWtp6+vuMDAvbHBt7Gusre2uLe2rKq9s6+ysb2/t667u7Gln7arpaW0qauuoJ/Cq6ilsLOqrLS6naiqq7GlmJ2qnqakkZmmraKYnqSpoZyinZegnae2pq+qrqGhnp2hlaCmn6KgmZuZnJKZnZSlnq2jmJeelZSOlZiMj5iaqKCRiImKiHmFd4KCgp2Hi4KJfH+EiIaFkISWlY+OkJGRkY2Se4OVjYZzfn1meG9ra2xodXNrY2dkY3R/YmRlZmVpamNpcVleWF1tZGFOaFdaYFZJR0hLTVJYPzlgbGlHQlVTXFtJSUdFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxZSlZiZkE7M0FmSCU1m6SgkYytoZmYoJaltLGisb63obHGu7mwsaO2q6uuqbm9vLutwLKvrq22r7O4s6iruLGurrS2u7avuL2tpp21q6ChsaWrr5+kw6CypK6xr7ettZ2tr62uo5mcp6qlnpWbqKWfmaWip5yaoJyUnJ2tsKa5qK6jopqanpmeo5qknZeemJuUmqGSqJWsqZuUm5ySjJWZjpSUmamnjY2KiY97gnSCgYqYhYd8iYmEhIqMiJKFk5ySko+QkZaOkH+AjY2Cb4F/ZnluaGtqZ3Fya1xoZGJygGBkZ2ptbGdqaWZsXGxtdXFhVGJoY2VZSUZMTU9YUVBVYWWBVEBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFJZUMnNJOim4+OsJ2ak6GaqbKwn7jAtqC0wru9ubGltq+prqW3ube4rLuvraqrt6q0ua6lsrWxrqmxtrawsrW6p6iftqmenqqiqq2cqcCYraSusLa1rKyesa2wqqKbnKOsqJuVnKejnZqpoqOVmqCdkZujq6qpu5+npKCYmpqeoY9ropaYnHGClpykgHaRq6ielZWfkYmXmYCXi6CPeYaTjINtaX53g3FshouGfYSLhm9eY2BnhJeGa4uQlJJ1d4uEfoOPf2aHgGh1aWZXXGlzbk5QamRmcYRmXmRmbmxpXl9fiZCEhmhPS0Q4RVRnXkpHUFBVVUtHU2BvdGVFW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi82NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUGQ9Ky+NpJmHlbCbnJOgm6qtq6O9xa+pt8K4vbytp7awpqukuLSys7C5raqnrLSmsLWjqLi2tainrLayrrSts6Kpn7SrnqKknKeomqy8laalr7O4ra2kqK6rrKWhnpygqKebmKGmpZubp6edkp+gmZGeqKqjtbCjo6OdlpiYl6OIoY+Smoehh5SeoX+lf6ernpOSm5KIhHJ4jI6EiKF2iIxpl4hmfXN4oW+Ih4R+jXt/oaCfmX97iJ50iI52m4psh4GDbWhlY3pscWJUhm1jbWmYcVhqcG6GV15pW2tqW4hwbXlyhmiHhFpeRk4+Rl5NRVJWV1FRUldUZ15MWUtSUk9FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVZhNy8ojKaXhJysnZmZnZ+rqqiqv8Ousbq8t8C+qqS3saqsprO1rq+ztquppbGtpbWznK21trSlp6izsa2yp6+fqqCyqJ+ko5qipJyutZWkpaa2vaasp6mqrKimoqCZn6ajmZmmo6SYnKSplpOinJWTo6WmobekpKCkmJWTmJSciK6QmJSJqYuXo5yFsYCkrZ6Ump6VeYLUqH+HlMGbx3l4saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJaxq7B5aGtYsa5vZWm8krxuaHptco/YflNqY7ayf4FxlHWaoaqQV09XYU9WTkZUW1hRUFOLXFdbUEBcRVFOREdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY6mk4GmqZ+XnJ2lrbKpscK9srXAtbe+wqumtK2tqaivtKqvtrSop6a1pqe4r52zsbWqpaSnsa6tsaaqnqeksaSioZ+XnKCfr62VnqKftLqiqaigra6lop2bmqGon5ibqKCfmJ6np5Gcp5uUnaGno6Cwo5+go5aWkpiSmYWwa2qKjap+Z4SWh61lcZ6dlZqmlXGuoaR+d7t8a6GPdrFfarRbpYBmnJFgZoF6Zn9qeGqpZb5yZ6aMdrFqfLF4dJKTY21tp25bhKBFaWeHlkV1nGB+Z3ujp4JZX4uraYGVeHpqpzdKr1tXVGxjW0tOV19cV1Y7TohPV1YvSVRTSUNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuSopWCrKelnqOkqrG3rbS9vrC3xLK4usKnqbCsr6mpsa+ksLqwpKWus6OpuKmes7Kwo6Wgqq2vq6+mp5+jorCco5yYlZibna2ml5uinrSzoaqboa2toJ6al6CiqZyZnqSgnJmhp6SQnaObmKGfrJ+mpqCboKGWlZGWkZqGtZu1eIWpmbWZd4ezm7d/k5aXqZR+a4GmeoGFiJKUknerZ2qxW6x7j4eUdIhwj4aAf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLTqRYSGNjmX5jaKZgeXJ1U5KGXlCpbWNxfoeAYp0uUaJuW1RrZ2BMS1xkWFxaQj6weFdYQSNNaEVCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOWFVNTAclp+UiLOmpqGuqaezrKq7tsKwvMKtuLfBqqytrq+mrrKpoa+8qqGnta2jq7WlprKzp6Oinaeqsqiwp6WeoJ+vlp+ZlZaXmJ+topqapKi1r6Gpj6moqZuelZigpaian52jn5ygoqWjlZuemJqdo6ubppmbm6Kgl5ORk5Odg9WTmblwsMJ+xoZ81pSbu3yalqWQjZuMpHqNh6OCpYJ6rHmPnVWve4l+n2q5Wrl3hoN9poKTfJh6qnmNnY97sW6OhHSQu4VvlE+vp8WKUaB6Y2CqYnNyh2yXh19TtbTIhoCJfGOkM0Kddl1RamhkUEBYZlpkYUpITWxLWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUTgyJZyhk5ixqKils6qltKilvLfBsLrAsbW1vLO2p7Gxo7Gzpp+utqibqLquoq+xoLO0sKCknp6nqbCotKmlnJ2eq5eZl5eXlpehqp2al6itsKmjn46soqeWnpecoaWhmKKhoqGaoqKnm56gnpWZm6agnKeUm5qfoZmQkpWRnYiybmi1cauIcI6mcrRzcrZ7mpikjY+bjaJ+kKClfrB2g5HS0XVbrnyGf6Rvm6qma4aFfa19l5mPe7Fzk52OeLNllnSFnm6eZpRSyItawlyfeWJfrWB3c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2pfbGlQVUZJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi+inZGkr6ykqrutprSlqLa7vLK7v7e2tLu7s6W1tKKysqOfrLCkmKa6rqSxsJy0uKqgpp2hqqSxp6yqpZqdmqmelpWYmZOToqegl5OmqrGmoZaSrJ+lkpShm6Smn5WbpqehmqOfrZqgnp6QlpyinpyllJyVmqKflZiWkpuFrHt3qHajj4qHqW+tioOog5mZooqSmYuifpKYia6Ff4KzXHKzUq5+g4Kkf3HXfXeEfo+dhpmad6+GipGch3e0YZplmoKBlWySWrBYS5p1mHlmYK1ed3eHZ5iIal2vd5Wej3hsNXnIrrJfQVRvXmhgRVBsX3BtVlVNL2VjaVNZUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjg4n52UoLiwmLTBraiyp6qyuri0uL+6uLO2vbWluLSgtKyfoKirn5WntqyosLGrrbSkm6mgoKihtaamqqOZnpWloZSUnJmTlqOlm5OQp6yvpqCVmKmfoo+RopmopqCVmqapnp2knqydoJ2gjZSfm56gmJmclpeioJSYkaedhql9faV5oY+Pg6pwrYyCp4aWoKGKl5eIo4GQiJSqfICLnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRsklyrW1qTf5F/aGeqZHN7gWuYh3FdrFqJoI5rbmVPSkOhXFpMdF5jZk1aYV9zdF9KVTVKmpJZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljo+MTAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE+OKGcmZm+rJi0wq6rrammtLC4sbW/urqzsbe8qru1oLGknqWnp56TqrGpr6q1rKuvoZihoKako7mio6uhl5yRoqCVlJ+alJmgoJCNjKmwr6adl5qnpp+NkqSXqKunlJeqqJ+foKOto6CdoY2VoZifoJKdl5yVnqGVl4+rm4+ubXK0dKmMd4qmc7R5dLOAkqSjkpyMiaSHjna4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSapdcrWBNoXyHkVJzo2x5f35umIZvXK9WPJx3ZlRvbi5cp09iUmtlYm1ZYlxgcXxjU1lQPj5tbzNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjgxQjilmpudu6KcssCuraurp7epuK+1wLW8sa+5uKvBt6qqoJumpKGdkquqp7WjsqiuqqCXnKigpKu5naOtnJaZj6Wjlo2doZyZnZ+Rk5Wrtq+nmZSbrKmXjJOlmaWso5GXq7KkoJ6oq7CZoaKPmaKXoJuWm5ehk52pnJSRq5mH1JKau3SxxIDDhn3Vlpy4eIiRl4yXiYynh3mjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbpqIcG2NpHS9XXd9W2F5vGtaVltqel5pYGRmYm14b1lbWUNBQHI/Q0YrNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuOTctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5ppmeoryil7HDsK2pqqyxp7ivtsSxu7Kuu7CuwbKspaKeo6Gcm5GqpKqypLWnraSflpqqmaasuJyirpmVoZCloJONnKOemJ6akJaSr7mwq5WXo6inlJGWpZykrZ6RoKirn5ygqaSznqKkjqeilKGanJeVpJiPsKCSlaqehZCZtYCRkY24lXiCk5u1d25sbnNueY+EjolznsG7vJp7gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1erOjdHaXdXSwdZieZoZpjbZ0cnB3toxef3p9iWeDeW15YouscHWFf1lbp2pFZFpUZmBjXWJRZ2dxbXVCTVBMRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz43MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlY4Kk9dXT0rO1ZWJz07PKadoKG/pZa0w7Ssqqesq6m7rrDGr7W0r7intbitqaOipp6gnZmUrKStqqa1qKifm5ago56spL6moaqYlZyRopuSj6GoopOdl5KYlLK1tq2YnaSkoouSkqabpaublqikpZyboqmmpqOooJGtnpainpeXl52ej7CplJynoo5qfmmcp3iJc36ajnV6ZYd7vb7Aum6Sg3GUhl9yalpemolhZIeOlWtggJVjbZx2YpRrf5qVlGVeYGNxm4pocox9hpVnan5xdHl9fGJbd3SBaFBcboN8e4tqWGx5gnJJSm+FcE10TUVXXWZhTFtYZ2NeT1ttdWlxUk9ERU47SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUtPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0lSX0knU2BWNClQXkwoMz5bTyc/Mj6on6ihwaOatLq2o6ylrqeotbKsyKyws6y1o76xsqago6mdo5uamaynrqSktaqlm5iVopumrai+p6mmlpSblaCak5ilqaeRnpCPmJywsr+sm6aep6KJk5Gqmqikmpurn6OZm6OnraKfqqGZsJuUpqCXlJ2fnZewpZmiqJmckZ6co6SZp6OanJqbmpCWgmhufHF2kZeUkYSJtKmNhpiVjoqMl5eHlJWKg5KTkYmNkZSZk5iXmqCim5uUoJ2OgnqkhWtqfJB8gHSJioFxgnh5dnaKgHuKanOBdIN1ZHd9dmtwe21gY1xwaE1ZWWVqX1dZb3ptbWZTT0ZTOU9aTlJPKCs7SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeUzEwVF46Kz04XUssPC1AsqCzob+ipLGyt6CppbKnpbC1qsmrrbGmtabAqLSgnqSlnKSVlqCrpqyjo7esoJmWlqCXraqlwJ6rpJaSnJeemJOUop+eoqeSkZmop7LDr5qrnauej5aWqZ6qnJygrJihm52ipa+moqSnnq2YlqadmZqhnp6csKCdoqeWmJOZlKCilqOfl6COlpSLio2Ol62Pe5WbgpKBiamohYGYloqEjp+Ie4SQhoWZkIeGiZWOm5eNkJieo5aak5GdjX6NZqKzroWJhHZ6j4p9dnl6b2d5kIGAiWt1gXmIcmh0f3p2g4iCa3RjeWZgaWRjZGZqWGt7cGlqXFJMUERfVUZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15dXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01MRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rauusrKgqqayraKss7DFsKqso7OvvaS0nKCmoqGdmZeopaimpKaztZ6VlJ6Zma+mrr6gq6ORkZ6amZSRlaGcl6mdhZ6prKKzyLSgqqSrlpaYmqedqJufpKuUnp+eoKquqaWiqqGtm56foZilnpyfna+kmZ+ok5iXnZKlmpipnpqXZoOSfGV+jpqPY3iNbGhrepCjq2tlmph+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKOfmHNsbnqEjYZ5WGVdhYFea4qKgXZbaHN3d5GAh4JueIJ4gHNteYR0d4iIj4N7aoVYXmt0ZF1ziGlqfHFsY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FJW0kvN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+rs7CrpaitrrCmrq6wvbGpqKStsLGfrZefo56hmpmmqpuso6aoqbOunpWjkKKvpra5pa6jj46aoZmTkpqgmZmllnulrKKos8O4pKKnr56elZ6jnqOco6mokZ6hnqCqr6qroqmfqJulnqegrJahm6WwpJicq5ahnpuTpZieq5mefr6DiHK0coWehq1oeLnEuHGSoaN7ppiZc6qCfMvAwLtxi6KHg598lZiInsC9gpadno2dwcF7gXqRjJrCv31rpbFvjIFvynp/m3eRg46AdnmBf3lxen+HcXiFjJN5bXaSYmZfeGNfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqZSjr6mwr62msrWvq6amprGrn6uYmqKgnJuqp6Kcq6KlqKSktKSdo5Omrqy3s6evopKRmp2lkpGgoZecn52Hpqukq62/wLChqa+pl5KfnaKZoqOqo5KgoZ6dra6prKWjoqagpKWdramRpJupraqcnaqcrKKWl6WWoaOYnH/OlHl6pYJ5lZabX66PXo6ngKGhfaeWm3Srg4CvXmSNqXqnh4WgdJeSiLNjgquGoY6Ns2mErnR8loe4YYKtWaPNbo91e9t7f5lwfoiSdX9le4d2dmt9iG5+hZGSfm2BjmBxa3BmYF94ZFtwaGpjZmBSVFJXXUpPQzVBSEVEOD42O0A/QTs9OEA+Pj9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCstLUowJztcOkwtIVBARjQuMa3CwMC1tLC3mJ6RpKqorbSrprKsrKykrKawqqCnm5qmmJyisJ+hn6ino6ahnrCsm56Wpq6tsauorKCUkpufpZOPn6WXnqijnq6kq7Cov8azqKmxrpaSnZyil6Cpqp+UoJ6cna2vp6qpm6emo6Grkq20lqaiq6qeo6emobChkpqnmqGblJSRl6BwhYyXdYWoh3GxfJ1xrH6hn4Klj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKKMkYudfqt7iJOPoIB6rVacxHqPb5LBfYGVbXVwjG1mdmWGb2F3bnJviYqRkINtkI9lb3R2b2BmbWRfb2lpbmZjV1NcYVpSUkM4SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXVxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc+V0otPSc+MSkzVkBGIRxHOkMxLiuv1MbHsrSfnaOOo6OhrK62r6mwp6mqqK6rq6eio52ZopWfpqufoqWfqKiin52wrJeblqinr62op6mel5Sao6KSlKGtm52mo66so6y1qbnNsq2mrqyWlJydopifrqydlp+ZnZ+psampqZurqaOiq5uvsaKorK6mmaarqqqxo5OXo6WblJKFpGqkdYl6qXR6snCCpYmZjHCIoJqHpF9gUquEf66Cm3augaeGhp96mJaFe2aAo4mkmYaBo32pfoCUh65efKhVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2MmI+BbZqSb255eHdubGZlZHFwZntoY11XX2lYWFRMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNjYqMVBLTCMgQTlENCwnwsnV1sChmauooa+inrC1sK+prKOopqqrq6mkpqCbpZ+dpaemo5ysmqKroaSfr6Kdm5OqpLawrqCpm52WlKejkJqiqJ+gppywpqOosay2yLK1qqyqlZGcnaKZn6WznZqgk5yfp6uro66arKiioaqis62iqrOxoZuqqK+vtqOTl6SnmJuRfKpsnoSHdat5fLBvgqSLiZ+WlZ+VgdK4tLjJgIGyXl+UqYOkh4egepiVmXiqyXSZo5WnqZCSm4x+m4maxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SPkJ6TfHCXkn5we3V9em1cZmpycWaBal5iWGNtXF5ZSU1NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5PUE1GTEpWRipMMC8+LTRPVFEdHDs8RjIsJKikwca5raiyrqylopyyuayqoaabqKaqrKmnoKalmKqjn66rnaagrJqfqaWdprWeopeTp6q1sqybppyglZClrZGZnKejoKqnrqGjp6mwtMKys6qtqJOJmJ2kmqGjrqSWoZWYnKWmq5qvna2opp6so7esobK5r52br6eztLOllZiopJqfjoKdTniagX+feoSjfIKkhIenn5yek4S4fHx5uYJ+zMXCtniboZCLn36alpeKdp6YiqSYo6h+sIWchJ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpGjl3x+kpGJdXpzhH5wXG1ud3JqgW9aZF9obmJkXUtMUVRBSEdGSTo5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTI6UFtUHBs2P0gsLSCMh5mprKSruauvoJyhrLO0pp+glaWurq6ppp2mppqjp6GyrqGpprKgmaiklKK1oqOVl6GptLmkm6Oeo5OQobKZnpynpqGir62dpKiitbHDsa2qramRh5GcppyjpJyklp6YmZmlpKiarqGtpaaYr6W8raK3t62enrWyubKzp5mesKKknoaP0bXDt3mHjoWRk4+ApniUoneMoJKEpYKLcauGhLRucmqZo5yViZ98mJmGh49zr4Klm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+Tpph+jIySi3h9eY2BbWl3aXhzbn90XWRkbm1laGBKWldYPEdHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklknOMiq6/v7u7tZ6XqKSttqGimZWjqaeuqauZpaGfpaCgtaeiqaewo5Sro46kraOdkJqaqbO0pJ2mnamSlJeuoKCep6Scp5y1mqCqo7arwrCpq6qhjISOm6GgpqKVmJmcmJqYpqSmmKunraKlm62nvqyVvrCtn6Ows7qstKebqbKlqJh6qJB9fLB3ioGkpYicbbJvoYetfKGPg6iWmYCsiYSuhZ+UqaCiloWfgJmVgHuSfquAnZqWiqp4naCPiZOSgHmvXaOBfKanZJ2AfJd0a65dpWtxhZldYFuMoG6VkaaZg5SNlot6eoKWfmttfmJ9dG5/emBnZXFvZ2doQ1lgWz1KUzJVOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTcwNTIuKixBVFZWVlVUVVVVVVRUVVRTVFdXV1hWVVVRSEZJSiMoKLySmoSpxsO2wbSfm62grrilpI6bpKOgr6+qn6Oena2Ynrmgoqugr6qZraGQqqmklomakK6wrKafp5usmJiPrKKhnaaimqWcrZifqKa2qL+vpamknoyAjpuaoKaekpSZmpOamqWko5moq6ujpJ+pqL6kl8OsqqOirLO6rK+nobSwqaqZdq9+kIuchYd9uq6KmGWwjGWVrX2hj4OnlZqBrIqEsIWlmaShopCEoFtsaoGzYH+te3uCgLFsZ26Zl4yIsVt9tFukg2vIomWfgHu8WXa1WrJ9Uq+AeqxYgKFtmI+omoqXkJWWe3iNnH1kc31ig3d0gHxhamZwbWZlZU9VY1tBVF4+SSg+OT00ISItJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gX2BhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5ytpqW2qKGLmaCfnbOzqZ6in520mKCzqKqrnrCunaubla6poo6Im46vrKimoqeZrpOZj6iaoZ6ln5qjo6WZnqKpsqi8r6Sonp2PfIublaGgmY+SmpuRmZeonqGYqK2npaWjpam7n6DGp6Wpoqu0tq2up6C9rq2tloGpkqOvjpuAhqSXmJCBgLjDuoOOnJOFp5ecgqyKgq+IppuapaqRftW9wqpio7+9fH6jgoPXuri1hZSTg569voRqo4Fvq4RunX96srDHg2qrsL2teHeivrt0gJaOppyPmpCVnHmBkJp5Ynx6ZIxmeYJ7YGtla2piUGJbU2pcQFRhQk4pPTo0Lx4fJB4lMiAdJCgwNDk2Njc4Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPzxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJW0tLG/ubK9s6Kdrqals6adjJilv6q3saihv6amsZuesZy5qJ6trqWmlZSvrJeMg5qRr6ajrKGknKqhmIujkqaep5yaoaiimZ6gq62pua2oo5uXk3uHmZGmm5OPkZiYjpiTqZmfmKmooKqmoaOru56pxaOgr6Ors7WrsKqhvKiwsJp0daqkt4ZliZ9wZ62Pio9tb3ekkJmfgXWumZVwkIxxlaejm5iupHJtbW1lindubYKZcYB5aXFpZ4mWlZhxaGmFhmdwhmReiWNqb1ldZ353pmBicY6Sb2ZkgI2SjqKYl5iQlZ58h46UdWWGd2iNanl+eWRsY2ZsYktkWEprWTpQZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiUrbOqurmys6qpoq6epLKpmJK9scPIvraqnsCrrKOgpqufuqOkrayspo6WraqPjIWVl62fpaqhn6OjoJGMpJKnmamZlqOqoJacpaWnr7qrrJqbkpJ7hJeNpZeNkZGYk42YlaeUnpeoopqwpp6irLqfsMKopLOmrLGyq66sqLmkr7iWiqGopbadiZaimIepmpCUnZOqs5mbo6ygspaioJ6gopygpKGVq6aMkpOMh5KcnJSQmZOYkI6VhoGkmpeVjYuTkoqPhoR+Z4t/dIJ2dIiMcadtfJWRlJOBgY+Pj4+dlKCVl5aggoeTjHBoj3Zwind2fHpqbGRkb2NVYFlAaVpHYmBPWitGPSsmITc0MC4fHCElMigqNzk5NDY5Oz4/QUJERkpLS01PUFFXVFZZXl9hY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW4r66isKStn6C1sZGOq8W8xLu4qqKlnZumnbCoo7annam0pqeRmKyji4iJj5ynlqukoZmnnp6TlaOXqJupmZSmoaSQmqeZobW6qKqYmpCNfIGUjKGUipSRlZCQk5elj56ZqJ+ctqOdp6y3p67CrqO3pq+vsK2qqrS6oq+9mZKmo6a2o5Kdpp6NqZ+Nkp+jrK+aoaOxqK+XpKCcpKqenZ2cl6uckpmhm5OQlqqZjZiYlpCWnpGIoJ2VlIWSjJCMlIuBfmaMhnWGdnmIg3OcaoeRlJSRin2MlpKSmJOhkpyWoIOHl4Z5cZVyeYl/cXt/am5kX3BpYFtgWW1iUGBjUFs6R0dEPTI9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WXF5eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJWkp6Ows6yuo6mnraCotaqQj5yls7uvrKyhopl6naKwpKWxqZabuKailJmpnI6GiombopCunqOWp5+hkpeYm66Lq5aPqJmojJioj565tqSlmJuNiXmBk4yak4qUkZOQjZGWooydnqien7ikf4SvtaKwr3SkvqOyoHh6oKuzvJV2rqSfioCqfmRcYnafjqSehJd+bpOznKOorquiZZ6gk3N5mZZwgJiol2x/oqeJZZylm5CXmJaLkZuRhZ2akJWCkoeOjpKJhXhrkId2hnF8hoGAYWmIi5WTi1t2lZFnaJCOcnqkmJhkeZiGgXeXaYOKgm55f2twZV92b2traFtmY2Jib1NbPk5OTlJHPUBUQjkxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS0xTVFVZXF9oZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyVpqOhsLGsq6mlqK2jp62kkparta+xppqqpquXc4ucr5+oqqeTlrigoI+cpJ2RfoiImp6Nq5qjlKeino6XkZ6Fda6QiKaaqJGWo4iburSnoJmYi4l0dpONlZOKlJCQlIyPk6COmp+mmZyyloCMnLWdtIySj72noX6nonqjr7iBjo6nn4SLhY+xqa+MiZajmnmBi6yGnJ2ip6qoh5WGmHelm3qHm4GXpoKBe5yxeoqFn5eZlJiWgZCWloSZmmN5h5CEjo+Si4NucZCIeYFxgIGGf4Z0h4WWkniWaJN0oJp0fJmDn5yGmH6RiYGCmGqNjIRreHtxcGdkd25pbGtbZWppZXJbXklUTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+QERJQElFSktHUlhaWVthYWhmWlFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrsa9sKCVpai1no+DnKucpqGfjZC+npmNn5qgkH2FjpmXiKudopWfoJGNk4mGgJGojoeinKOTlp2Gn7myp52ako6FcHWPiJOQipSPj5uLj5GfkpafpJaerIiftIm0mq6Lyoirrom3hY2wg7GvhKmNp5iNnXyoj3J7d5uOppZolaR5tIufnqaokpnCgX+riJihcZ6AmqR9l4WVsYGhfKCTn4+Yl4COk5uJmJKLfIWTho2Vk4mDbXORhoB7coaBhX2FdIWCl4GPxWaAqYePomqeg6CYgZl/iouDiJhvjJKEZ3d0e3ZnaHVwZ2dsXmNubGZsWGhHXFFMMkU0Nk1gYzYmNDxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFldY2ZoZ2JiYmJkY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGqq6aalKCjpKqilaOptqOvf6CnnKWenYmTvJmTjaCRnZB5hJaWkYermZuamaGFj4x3m5yPoJGInqSblZiXhqK4raWZm4yMf2Jtj4qSj42QjIyXi5CRn4+Tn6GZoah+oaeHrZ6glq6Pn52dkYaBoI2rr4ekjaqajJp+o3aAmJNrgat1Tat4h42dkZuop4Gqq32DoXt6p2mef5JrZ5eGl7aInn1tYGNYg5d/jHtkZ4tzmX15lmxdfJduX1NxhFxgbHmDYFllgn2EgZhxp6prg6NucqVwn4OeaGSfbFpsiHplWV+CfmFXUG92ZW50cmpqb15qb2xraFdpT11XRTlBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fYnZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySoba8q66imZegoaWsrJ+crbWjqJKgn5+mm5mOmLSZkIuejJWLdYGUkY2KppaVl56ef5KFhqykh5yRipiol5makYelsKailZqIiX9oboiHio6OiYuNkouQkqKMk56gnKKlf5OBj6OhlKB3nJaQp4Ohp4CGqq6FpXmLfYSafaJwc5OHlnuejHlth5uMmZCbqJqPh518gqJzdqZmnn53pF+YenySc6JumLe0unSSh4GAtqhkgca4e3CVt4xxgJukY3Osq2B9ap2zfm59h4OOgouXcYCjbHOkc56Df6RenZmzlm97l56zdHJbnrKCaWJvdHVxaG9Ya2xycmVcaV5iS0Q9RDVRQVlxMjxSRl9KUj08Mzk1Ojo2RDs7QElQP1RNTlFARF9eW1pYYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmsnJOgjaS4ta6toJuinKOjpKybmrGtrJOXoJigpJmak56rm4uIkniLhXCAlo2Kj6CQk5Sdl32QiY6ooYeYj4qRopObmoyLqKikno+WhoN9anqGf32PjIKLkJCJj5SggpadoJ2gn4uJd5yYooygcqKLiKmInKeRl6irf66MfXqgmXqjk3iAc5eIjJx9lp+Gm42Zm6aGo2ShfImWkJuNbJ5omo1umpl6f4qnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2dYmKf55omnWHk5KYjn+ebpmQa6aZXKh+d7tqfalajoRds2dcbnF5d2tpW3FpeHljX2VXYkFQRU43VkJSbTRKWlpfTlpDQDE1MTs7N0g/OkNHVD9ZUlldPkRiXlZgUWFkfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrabqIljlJusurKwrJ2mnJynn52tmp2wqKudl6KZoZ+Ylpago5mGiY1piIBxe5eIi5aWhJKVmI96ioSWo52JlI+Fi52RnJuJj6ijoJmLkIl/f2mBhnl/lot6iI2Oh4+Wmn+Top+gopOYcmifiqCPjHCSjIKpiJmfo6mgqH2wraSiuJd2o7Oio3+IlHidequafqKOnZuXiJdyoXyFja+1fWuakaF4fpi0o6OrqISYe5p8nJl+c6paXW97l4t4nmJNf3t7hWN6l0JNn1mianJ8jm2BiYSZdZt5h4mxs39/mpKmdH+dbXF8lG+ZcmmjXZV2SGVjYHNwfX5uZWBsaHZ8ZGNgUV5WXVRWQFlFUWdEUldbYlheSUQ9QjhAQjpJRThMRFdBVlFbVkRGYlxaYEtgbX5yRUM8VV9iWmVqVmdobG5iZmZeYWFcXV5haGJfZWR2bF5lZ2ZrZGZsaGhraZOdgbGumYRTX6Cns7mzs6maooubqZybqJKhq6ShqI+enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32RkpaIcoCJkqCccpGQgIiYlJ+ahI6onJqUioqJe4NrhIVxgaCLd4WNiIeSmZV8kqShn6OIroZ9tYSPnp17ppZ6qYKWnZCLoZ5+p2h3bX6Zc6BzcXydhZhvk4KufaODpp6agaNwXqlndaNjb6VhnNOQfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyqLx/d4Ntf7+mqrRenG9+cZdvgXOicl2jZ3SmYWimbZvTmHuDm253eZdrm3p2l3JsqaVnX2V5cH+Ea2dmZG12eGhfYVJbZVFRYklXSVRfV1NbZWpcZFBGQ0tMSktCSkU4UD9QTVdTWE9SUmBmZWlSZHh5d0lGRWNdZFloalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiYm3+wrFRcS36pr7K1sLOjnJiFmKegoKONpKigmKmJmZeYk5mTkqCXjYiFe3B9hGh9j4KTmoF3kY2OiXB/hpCTkmyXk3yIkJGjlYOOqpqUkoqFiXmDdYiAboKfhnd/koaImaKXeZOipJqfibOhoraLeqynpK6lcKmAmpCFgZySfaSAopmGmHKehKKsromXi4CMpI2Wg66ilHa1trXJoXOUioCfYZ6XqW15lYefmnWhh3egfZCWioFvTGaiknCaiHOke3l0YYOCbH6gbHJkYJxyf3SXaXtps7W0xqZzmH57nWqbm6t1gpptdHeXaZp5dJhxUEV8s15qdWp4h2ZqZ2J0dHFuVl5UWWhQUmhJVUxYUlZcZ2tuVmdXTUpBSk1KSEpOQVFKUGVjaW1ldHJzfnl7bnWJe3tUUE9tXWhba2lSamhpbGdsZ2NlX1xdXF5pYmRoa3tfXWRnY2pmb21laW1lopyJr6eFZj+UobOrr6+1oqKQgJeooqKkjKWnnZylgpmXlo2XkJCbko2Ig3lqeYZlg4x+l6B5dY+IjIFphIWSg4yFnY16jIqUpZKCl6mXjJGLgIl5f3yLeXCQoYZ5gJWHiZagln+UpaiclpaEZ254nGyiZHxxpXecmHBnp4GXjHuleqCWg5dyn3aAiZSWj7lukIqiYn2ZopWIbnJpq2p1oGxupmCbaYuQaJaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VvY2aIgm5yolpfW2Shbl6JjG97f3NyZKVueKJkZ6domHOLmG6hb1OIj2+gXmSnVItdU5htbXJqcYFtcGhreHNrcFJYV1dmWVNtSVhPXEhYaWhzallrVlFSRVZcTFhSYVVoal53dXp8cHx8coN7f3J2jYCEdl5Rc2FnYnBnUGpoaGtsbmdkZ19dXl1ga2JqaXZ1XVxjaGNqanNsZmttY52lmKZ6ZXRti6eupaqwsaafi4CWqpyepYyioZqiooCVmJONmo+Ll5CNinuGcYCIaIuLfJeac3SKfZB7ZYOHlYqKlZmCfIiFlqaPgaKrkIWQioGKfX9/jnNpj6WEfIWTjYiYoI6IkqqnnommeJacfqWJloyymJ6Qg6+Xn6V4loh6qXSlj4SabqWijJKEjIO8bnylr4KGhYaUl5ygfKV6caiUoJZnnn5vrGOWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlrioZubZ+ekpVhf6uLqnaAf42nn3effYWklZ2gaZqHdqxnnq2MtnN3voykk1mDpo2rYXVxc297dHFian5uaGxTVltVYWFca01cUl1JXW1tdmBbcVlbYFpnc2Vub3JjcXRgd3t+eXJ5g3OEf4B7e4yBgoB2YnhkY25zZFJsZ2hvbHJpZmlhX15cYmtibGx6b1xcYmlibGp3bWdsbmKVpqqcgYCepJapqp6op66jmYmCl6qZnqSJmqWdqZ2Ei5qPhZyRhZKNi410hXqIg2+NhH2Wk3R0hnKSgm1/jJKHhpSPfXuBhJekjX+lpY2AjYmElHWCh5JvbIupgIOLlI6JnJ+JjZOrpKCQgHWVl4h+gXmUrqN/gZtxj4Z4kIyFgHtyp4xxfX16l5abhI54e359iJSVk4p2kJieoIN6fYlsjIVbeXlyeXFobn6SiXF/dIGPlJNxhYOBZY1/X4GAjHd1c5R1b3lvbodthIZfd2l4jmaBgoaOqpx+dH2XaomIb4B2fIV2bWxnjHN4e5d3hFtqWHiPaG13cXBvd3hvXWyGbmlnVlpgV1xla2NVYVVeUV9wd3lsanZlampqdXxxcnRzYW91YnN7gXh1eYJ1gIB/gHiLhYN9e21/bGR5bl5XbmdodWt4amlqZFxgWmNqZWxwdW5aW2JrZGxseW1obG9hjpW6qaeLoaKapqSZpJ2roqCDg5erkZ2giZqmmqiYgoGbi36WlIeOiYiNcoJ8j31+j4R6l450coNwlYV7fZKLhoaQhXh+gIaYoox7p6GLhY+PhJWCho6Xd3KFqoaOkpyQiJ6eiIybqKCgq4OJjpWafn6Jlq2oj5KnkHhwnpGDe5NvfqmFcH2VcWpvfIGfi3+SjoxobV2Di4ybmp6Oc5WLiHF0a4J2c4BZcm6HkIF9fotpXWljeoWDiIBfaXh7m3yDjIN2gYaCaHmLh2thcXODd2BzjIKJkKeVhmaNj4NudouDcIWNeW9lZmN5gnqVWlxpZm52W3p5d3Rtc3KCZlxtimtsYllZXlpZbHFbX2BZXl1mdH17dG9zY2traXt8cXt4dGRtdGhsfH51eXx7enp/f35vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGtqcXJtV1tlbmxnc3pvaGptYIyMq7GikKOhmp+emJ6ZqaOhfYOXq4yflIebopCllX97l4R8kpmIiYaGinJ9gIt2hYuBhJaKcW+AcpiGhH6ShIOGioF6gIOKmp6Pgqagh3iNl4iVi4ucl4WDeq2CkZiZlIqenYeIoaugoqKjjIiTm5yjmZaqoaemoJKbiJePfHmPjoSofn+SkZKTnLClmpSdkI2yk5iEpoyMlJqfiZCbgomRimt8jnZ3ZYKGkIp8iZ2Eh4uPh4iAhIOQd3x6dZqiiYeLnouFlH9+jIGBdnF0hoWAeIiHipGmkYSGjoiDjZCMfIeKiI+BdmuBg3t5mWlyaGBzinB9enZ1b3d0gV1eb4dobl9fWlxdU2hxVWNbW2FsaHV7fHJucGRramh/e214f3Fpb3BsZoF7coGAeIB9gIR6bYOMhnx6eHx+eoN4TmR2a3NtcHpka2ViYmBbdGZwZnJxbFVdbHRtaHl6cWdpa2WNiJ26n5aioZiVmZiUmKSgnXuAmaqNno2Fn5yKnpZ8eZSCe46ZiYaDhIZteIGAcoCHfoiThG1rfnqXhoSDkH6AhoSGfYeDjJqckoeqnoJxio+FkpGLnJF9jXuqhI2Sl5WOnJaGhpunoKKanYaDkpqZmZCapqCmnZ2Ql4GRind9iI6FpXt8j5CRhpiqoZ2TnI+Nq42RgJ6MiJKZnoKOl36GjYJveIVxdGB/g4+GdYuXgIOPgoaEfoWDlG55dXSToouNhZqEhI10gIp9fHJze4iEe3mMjoSTp4+GhI+Cg4qJiXaFh4mLe25rfX97bWhrbGdeeX5nfHt2c3V1e3dcYHB9bnVgY1tcXlFmbVNlWl1ha2l2en5xa2xka2pngIBsc4BsbHRveG6EeW6GgHaCgH2EdnGCjYh+e3t8f3uCimBpe2p1aGmCZGpjYGlbY3Vob2J1bWxUYnF5ZXB6enNlam1ti4qfuJqho5+SkpaXi5qfnp17eJ6lkJuJhqSUi5iZeXqNhXyJkYOMgoGCbXx/eHKAhX2KkHxraH2Bl4iBiI58foaEh3yPgI+am5GIp5x/cIuKi5KGoKGKhYx8qJKIj5KXk5aSd42joaGelpp/gZCamZOMm6OhpJqXkZt/joR5gISPh6GAfoyNj3yXpKCgkpmQj6aNj4GbkYmSl5t+kpJ+ho2BdXSCcHZgfYCNhnKKlXyIi3KMf4KFho5od3F4jJiSj3+XfoiKc4KHfHxxeXqMhXp7ko2DlqaTi4aRfIWGh4R1goOIh3lkcnt+eHlwbGpmXn1yaHx1dXN8coBqXmB0dnB4ZGNZXl5Sa2hUZFheYWdqdniBcWZrY2xoZYCAam1+aG5xa313hnlri4FygYF9gXR2go2Gfnx7f4F9f49qcoNuc2lhh2hsYl9xVXRvbW5geGhtV2p0dmN1e3tyYmpveomNn7KSpaWcjpCYj4adoJqcfHakoI2Wf4yiioialnh7hod+g4l+iIKAf3B/e3R1goV+iZB4Z2N9hpeKgoqNeH2AjIN5loCVl5WMlqCafW+LgZCThqWbh4yJg6aWhZKKlZeSkXaRnqGhmJSYen+OmJeOlpudpJ6Zk5Sceo+Fg3iFl42efoGKjoxzl6KeoZKYjo+ijIuDlpiDkpaZfpiNfIiNgXZxfW16ZIB8ioVwhpN/kIJsh4KBf4mEZXVvfIeSl419k3iLiXyAh3x8cn94iod5hZGKi5iilYKEjHeIhIKBdnuBiYV0Xnh3fHN9d2ZrZGB+aWp2c3R0fXF8Y2Nhc251c21hWWBeW2xkUmJXX2Boa3V5hnBiamNtZWh8g2xodGhsb2h/fIJ4bZCGcYCCgn90fIOMgX9+eoKDfnyQbXaIdHRtZYpsamFjdVaDaXFuYHlnbGJqdnBmeXx6cWBybIaGkJ2ul6aono2Nl4eGoJOXmH13qZyKmHmXnIuLmJB5fICLfXyDe4CCgHhzeHpzfYCEf4iLgGRefYuVh36Eh3R9fop/fZiElpOWjKOhl35yh3uTkYqmj4yOipKgkYORj5SXkYqBj5igmpKQknSAjZKUiZ2dnqeYmI2Vl3SNjopshpiQmXqHiJCJb5edmqOTlYqNn4yGgZKcf5KSlYaZiHyJiYF6cXlqdWx7fot+boWSgpR3b4KDfX6Kf2RyanuAlpeEf410kImDeYd+dniAfYaBfYSOhYyUpJB5hYN0iYd9f3N1gIeDbWB6dXlwe29hbmJke2Fub3Zyd3dzdGJ2YG9sdW5vXVteXV5qXk9dV2JhaG1zeolrX2llamNod4htZmxoam1ogHx6d26Qh3OAg4R9dIGGiXqCfXqBhH18jnJ6inh4bmyHa2hfaXJjh2hxb2V3aG5sYXpoa317eHBhd22LgZmaqqCkqJ2KipGGip6KlZd9dq2YjJZ9npORlpOId357inx7gHZ3f4BwdHN6b4V9gYCKfnxgXH6PkYZ/g4RzeoCGeo+Rh5GRm5Kkm5SBfYB8jYqSpIiNio2Xmo2FkZiTlY6JiYyTnZOQjI1uhJCPkYmemaKhl5aJl5JviZmEZ4aaj5R6iYWQinCWmpShkpKIi5mMgn+QnnySj5KLmY57ioSHdHN1a3FudXyLdG6FkI6ScXSAe4GBiHxkcWx5fZmUfYSIdJCLgXSIeW5/fYCHfYWNioWNlaiNe4h9fouFd31wb4CFg2Nod3N0bnpiXm9ganRecGp6eHhscnBleV1tbHNtc1haXl9halpQV1hkY2dxcX+HZl1paGdiZ3GOb2RpZ2VqaIB6d3RujoVzgIGCe3WCiIV3hXx4hIV6gIl3f4t7enJ5g2prX3BodH9rcW5tcWdvbGV7Ym6AeXZxbHd3in+jmKKooaabh4yKgY+dhpOcdICplJGMhqCMlZOQf3R7doV4eH9yc3uFa3JveW2JdoCAhm5xW1l+kY2IgICAdnWAf3+gho+KkZyXoJOXd4l+gIyInJ2Jj4aSl5WEiJSZj5aLi42OjZ2KjpCEbomLj5GKnJahm5iVhZiIa4Wjg2eGnYqRf4uEi4F3k5iRnpGQiImVjX9+j5d8kY2PjZqSfIp/gm52b2ttb3B7hWlzg46XinB3f3SCiYJ4ZnNvdoGZjnyJhHqUkXp3iHRwiHuGjHuLh4SJj5yjiHyEd4KLgHh4bmqAgoFdcnJwb293Wl5wYG9qXm9pfHlwbW1qbXZgcG9rcm1ZWGFhYm5YUVNZZWZjdXCEgmJdam1kYmZrkm1gZmZfaGuBdXJycIuAdH+CgHh2gIuAeIV/d4eGd4OEe4aMf3t2in9qcWN8YoZ8b3BsdGpob2x2d19xf3l7dHV0gIJ/pZWarZ+nloWNg3+XlYOPn3WKn5OShYqajJWNi3pyeHSCcHKFc3F1iGxvbXVtiHeDfX9tblVRgauUh4J4gHZygnmCoIGRgZOSl5uRmniReoKMkqSak46IlZiShIaWmYyTi4mPj4iehZCKfHOLhYmPiJyZn5uWlICUf2mGnIhoh6GIkoSRg4lxg5GXj5qNj4yLj413e5KQeo6LjJGWjHyIfIBrdmpta2tsen5heX6OlYF2eoB3g418eWd0bHSHlYt/iIZ7lJBxeoRwd4x6iox7iX6DjJGfnYV8fXiCi312cGlrgYJ5X3dubGtxclVdbmJxYF9tbnlwZ3BmZ3N1aHBrYXdlXVZmYGByU1BOXGZlXXhwiHxfXWhyYmJlZpJqX2hkW2dwfnBrcXOKfXZ8hYB0dX+MeXuGgXiIgnOGhH6MjIR7eZV3ZnJqg2CHfm9va3pgam50f3RfdH15hnh0c4V8eKCPmbCcpY+Cin+DmoiAi55/ipmTjoSIl42Oj4R2dHZzgHBvhXNwcYNvaml2bYJufXxtdXNSToLfyZLWk3xwdIJ1g6CCkneUkJibj5h7k3KFkJ+hk5OQipKblIZ+lpWIjY2IkY2InICOgXh6jH6IjIqcm52blZN5jXdoiZKHbImkhZOIl4OGY4yRmI6UipaMjYqLcXuUiXqNiIqSkYl5hXt+bHtlcm9qa3l5W4B5j46Aen1+f4aOenpoc2tzi4+KgoWFfZWMbH5/b4CMf4yIfYR6gpCWmpuLfHd4g5B5c21mcH+DbGl0bmdoc21TXm5kcFlfa3F3ZmtqYmZ4c29wY193YGBWa19edlBOTGBmY115cYl0XFtldmBhZWWOY2FmYVhpc3Nua3F2i3x0eoaBdXZ+i3N/hn96iH5yiYeBkYqIfH6YdmVzbnxlh35ucGuAWmxueXlzYHZ6e412cneKd3mfi5uum6CQgoV3iJV/fYmch4WfkY6FjJeEk46HgXV3cHlxboRvbW5+cmRkeHB8bXp9amhsY6Sawdyu76Fza3WDdYShhZFulY+Un5SbgZFwhYujl4mOlYqQnZaDgJWQhYmPgJKKipd/h3t1f4l4hoSNm5qYmY6Qdot3b4eJi32LpIWSiZ2FhV6LlJeKjomOi4qEiWx8loF9iIWJkI+GdoV9fWt9ZHd1am14c1eIepGGhXp+f4CFjH55ZXNqf4qOioOCf4yWhWuCdW6IkYKRhX+CeoCRlpSZkHR0eIiNdXRxZ3V5gmJ0bW9haHVmUmBwZ2tVX250eWByY19ofXFybVpicmFiV25ZXHdNTUxjZmFednOKbVtcZHleYGRmhF9jY15YanJrbmtyd4t9c3eEgXh3e4lxg4R9foh7dIuJiJaGjH5+mHNodXF5bYt6bnRwgVhxenZ5cWR3eYaMaXaAiXJ/nIeYp5yjkoR9cIyUeHmLnYSFoY2OfJWMf5qIhHtyd3Bzam+Ba2lsfHReYHh2e3B1e2dgZXzr2rXJw9yIc2xzgHaJmoiNaZePjpyUkoGIcIWIoI6Ei5WKjZiUfI2TiIOJj3uRi4aQgn92eIOEcoeCkpuWlJiGjHaHf3GFgomHmaKDlIyeg4lhg5WOhomGiY2HgIdpfZR/fYOEiY6NgnGGfn9xd2h1cmlzd2tajH2SgYV8f4OAhIqCdmJ0bIiBj4uCfn+SkX1ugmx5ho+Gk4R9gX2AkpORl4lucnqMhnVscWtyeIBfdGluXGp1YFJkcWhmU19wdnRgb2BdaIJxcmlXZ2hjaVhtV1t1TEpMZWZeYnJzhWhbXGV5Xl5kZ3phZF9cWWtuZW9qdHeKfnNzgX56dnqIc4WDfH+HdneKho+YgY2Ce5N2bHd1eXmTdG54en1YeYVxgG9neHeSgmR2hoVxipaFmaGbooqGc2+Si3J3jpx9ipqIiXuff4OZf4F4cXNub2RyfmhmbHd3W195e3pxcX9pYWdhf9W2jpCmeG5xd3twkpCMh2qYjYibkYuGe2iHi5mGgZKRhoeYjXyNjYGBio18kIx+ioV6dXuCenGGgJWZjpOUgol1hId3hICLk52fhpaPn36IYX+Th4SIhImNf3+DZ32Qf35/gouPkH5tgnyCdGttdnRzdnVrY42Bjn+FfnyEf4SIf3Bfc3GFfI+Ngnx/kol6cYNmeoOKh4yDfIV+gJWPkZOEbnB5jH91bW5qa3p9YmhqaVhrdVpSaXJpYlBicnhsYWVdWmqDbXNiW2dfZGxfblRab05IT2ZkXGducYBsWltjcl9cY2x3ZGVdXFpsbGJtaXN2hn9xbn98fHR4hniFgnyAh3V5iYGSlnyJhnaJgW94eXuEk3Bte4F3XoN/dIFtaXpzlHNncoh9cpKRg5qfm6CGh3Z2lH9tdpOXfYeQg4qNmXyLmnZ9dnFvbGphdHxnYml1elpfeHx6bXF+ZWNoaFedj15xcpa8w4N1cZSIkH5ylouGm5KMh3JqiI+WgHuUjIGEm4x8ioZ9fImMf5SIdYqGdnZ9gXF1hoGelIWUj4ODcoCIdYV8iZidmIeUjp2AiGZ9k4J/hYOJiXKBfWd+i3t4fn+Hi458aYB8g3Zlb3h4c3ZzbGqNhYqBin94gYCEg39rXnJ4en6NioV7go+AfnKAaXmDh4uGhHmEfIGYjZCMfW5te4l9d3RuaGd8dmNccWJXbnJTU25zaGFNZnR4ZWBdXFhugG9zWWVhXmptYHBPWWtRRFNnYFprbm18blpbXmxjWmJvd2RnXF1gbGpja2lzdoGDcG1+fH90dYN7g4J8goV2fomBlpF4g4p0gYhyeXh+jZBvb3yBcWmBeXp+bWx8dpVraneEdGyUjYWemKCZhYhufYx2aniYjn6BioKVl4l5jpZvenNwbGpkYHR7aF9lcXpaYXJ9eWdxemFlZY+xsndKYlqk2dCWcXuQipB3fZSLhJmRjIVua4WSknp5koaBhJiKfId/eHiJioSWgHCMiHF0fXppeYWDpZCEk42Df29/g3eEeYWbmZSLk5CUhYdwe5KCfYKDiYNugXhogIR4cn9/g4qGe2V9foR1Y3Byf2h4cG91mI2Ggop7dniAhHmBa1xxfXKBiIWJfYaJeohygW5xhIeOhIVzhHmBmY2NhHhub36EgHd6ZWhqfHBfWXdaWHBsTldxc2dgSmx2dGBdW1tZdH1yb1dnXWZqcV9uTldoUT9ZZl5ab2tneXFaWllrZVljcXlfaFxeZW1oZWtocXd/h25rf36AdW+Ce4CBfoN/doGFiZeKcYKNcXuGfHl5hJOMdWp6f2xvfnR/fW9ye3uUb26Bf3hmk4qDoZmckoKGZ4eDb2h6lYh9f4SBmImBfI2MaXhya2xmX2FveG1fYm94XGRsg3phcXZfZWXU6r6KMjo+i46AcXmFh46NdoOWjH6SjYx/bWyFjIt1fY9/hYKViXyDeG52h4SDl3dviIVrdXt0ZnmCg6eLgo+LhH1ugHV3g3mGnJCMkJGSjIuGfnuShnd/hI2DbH9yaIB+eG18e4GKg3dheYSBcWRxaH5tdHF0gZuLgH+FfnJ1fYBzgXBbbX50eIqDi3uHgHyIeHpxbIiDj4SLcoJ6gJeLi390bmt3gIB1dVxpaHdwWFZ7U1lvZExacnJlW0lwd25cWlpZXXV+dGhZYltnZW5jaUxXZlE9XmVcXXVlX3RwWllUb2RZZHF5WmheYGdtZ2lsaXB3fY5saYKEfnlugHx8gX+CenWCgY2ThXCAi254foB7e4iSiX9oe35rdHtyhntzd31/jHl4hH18a4yNhJudloyBgGyOfmtofo2Men5/g5SBfn2KiGt1cWdoY1tiZ3JuYGFrc2FocIl6YnN0XmNkm6CPblw1Wa+1dGmAiHyShnaFloVzj4uJdnBthYKGdHmJeIl8koh6f3Nndol+fphvcYZ+aHZ5bWV5iISkh4CHjYl+bn52gIF8jJmHgpOQmImLhIl8j4hwe32Ee2h+bGqAe3ppenaBh4FyYHeBfnFkcmZ1gm11e4SUkYF8gX9ud3l8dH9tWG9/dnSMgoZ3iHaCiXp4c26JgY+BhXN/fX+TiYl6bm5qboKCdW5dZ2ZzcVFaek1ab1xOW3JwZFVLc3hpV1lZWmFxgHRgXV1gZmRoaWZOWWhNQGFkW2B1YVx0bVhXU3RhWmRvcldqXmJoa2dtbGlwd3ySbGmEiXx8cH5+e4F/gnp3gH+Ki4Nxe4dvcXeDf3uJjY+Dan57bnd5d4p3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISIkHh9e4GRf39+ioNwcnBjZl5ZZ19vcGBgZ3Bmam+JdGF0b1thZGp2e3++nKajyLhxhYNzk3x4hpOCc5CMiHJycIR7gnN1h3SId5OIeXlxY3eHeoCTaXKEdmZ3dmNqfIOHnoF/f46PfXJ/dIV5gJGQgniWjZSPiIKIe4iJa3h5fnVnemhsf3lzaXp2gIJ9aGB3h31qa3Rne4BpdoCLkJR+en5+cHt2e3R+YlZ3fXJzioSCfINxhop3eHBwg4KNf315fn12joaDdmlxaW2IgnJwXWhjc25KZHVLXW5VU1lzbmJRT3N4YFJYWFxhb4JzW2FcaGVlY2pkUVpwSURjYVpjcF5dd2hVVlV3XltlbmhWa15hamdlb29ocHZ6km5piIx5fXJ7fnmCgYF8dn2DiIaDcHeDcm52goN9iYuTf3CAfHh5eoGMdIN4f4GBgoR6gHVvfoqLm56IfYV6d4Z7Z3SFi5B6fn97iIWEdo+AZ29uX2RcWGVZbXJgYGBwbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4b4x1e4aOgHqTiYB1dHV+d39vcX9thHSUhnh0a2B6gnmIj2Zxg29ndm5bbX2BkJR/gHmRkn15e22HdoCQi4R0loqRjoeFhXt/hWx0dn9tZ3ZlbXt1bWp2d39/fGBieIV5aHR1Yn17Z3SGjoyVe3R/dXGAenxtf1lWdH5vdYSHf4B5bIiGdHhrdX+DhH17fXl7c4uBfXNndGVui4Rtc1tqX3VkSG5uTFphV1ZVeG1iUFJ0dldQVVheYXGEb1xgY21kZF5uYlRcckdCZl9dZmhdWnpiUVVcdVtbZ2thVmpfYG5mZmtxaHB1eI50a46MdX92eH13gYOBe3N9g4iHg29xf3RxdX6FgYmNint3f3iDfHyGh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeV59hZiMeYaDdIWGhHeJe2JubFtiW1thVmpzY2BbZ25vZodxYXFmV1xja398ys6HuaFqbW2KbHGEcXyDiX57kYV6eXN5dXV7amx1Y4R1kYJ3b2ZefYJ6i4llcoJranFjWGx7hpuIgoFzl5R3f3xtiHGBiouHcZeOkIiFi4N7eX5xcXB9ZmhxYm14cWprcXd8fHlcZHmAd2l1eGaBdmd0h4uNlHxxhmlvfoB5bnxdWHJ/bXSAi3yCb2+Jf3F2aHd/gX+Bdn1ye3WHfHpyZnNhboyCbHJYa193W0lua01VVF5UVXtrYU9UdXJQUVRWXmJ0hWlcYGtqZmNZbmFYYnBHQWhcYGZfXVV7XU9VZHBaW2poXVdoYF9yZmtocmdwcneGeG6VinR/enh+eIOHf3Vyf4aFjYJwcHt4d3V6hoWGjIV6fH91i359hoSEh39+fn2Hf3x4dnl4kZOgf4x9i212gHljg4aWhXORim+FhYF6g3RjbmpZX1tdXVRnc2VgWWRxcmaBc2JrZVdbYGl/eL6ue6C3bWJzhmhze3F5goV7fYx/d3hydm97dmVqbmCHdY6Bc2piXn54eYuEZnF+aGprWlZvd4qjgYR/cZmTcYF5dIJtgIKRh3OViIyIhImFfXh0cm5oeWBqbWBtdmpnamt5d3p3W2d9fHhlcn1thHRldYWMhZV/b4tma3qDdW10YlxvfGt1fIt8gWZ1h31tcWd1fnh+f3J9bHt7gXp4cGZsYm6Jfm1tVmtgd1VKamtPUU5oTVl8aGJOVXVqTFBUVV5mdYNmXWBwaGdhV2ldW2toSkVrWmFkV1lVeVlOVm1qWV1sZVxaZWNedGZtZHFncm91gXhwmYV2f353f3yFh311c4KIgJWCbnN4enpzc4WGiIiDeIF9do9/fISKjoSChHt+i4N7d3x3d5qdl3qKgoZpd318bIOEk39yj4JwhYJ+gX9vZmxnV11bXFtUZHBkX1dicnVpdXBlZWJXXFxof3BvcoBziWRkeH5pdHVzc4KEeICEeXZzdW5renBhZ2tnhnSNg25mXV99cHuJfmltd2ZpZFVWcm+NpnyEe3aWkHR8c3x6bXt7kIV2mHyHhoKGg3x0cHJsZ3RcbGhebHRkZ2Zpem97cllngHZ1Z3CAd4F1YneEinyUgG6Lam16gXFmc2VgbXpnc3eKfH5idYN2aWtxdHpwenlzfmZ+f395d25kZmJuhnxta1ZqYnBTS2hqT0tOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2llYFZjV2JwXUxLa1hjYlVVVXNWTFh1ZFpfa2FcWmNlX3dmbWJwaXNucn91dJqBd3+Ad39+hYV6fHWChH6XhW5ydHx6dHGEhY+BgHmLdXSRf3yBlY6AhYR9foyGe36AdnujpYp5iIaEa3V8enWDgot5boVzeYR9gYN1bmpoZVZdW1paU2JuZFtYYXN7aWhtaWBiV19baoBpa2+AZ2thaHl4anN0dG6EgXp/fXV1bnpoanlqX2VuaIF2j4RnZVhid2l+h3tvaW9nZl1VWG9njqh3gXp8kI55dW9+b3J1eY+Ad5V0hYJ/hYd1anJ2Z2huW2xkXW1zX2dhanhoe21abYJyc2lvgH55d2B3hIR3j4RyiHFveYByY3FpXG93ZHF0iHx4YnOAcGdqeHNybHh3dXhkg3t/eHZwZGNjbnx9a2xVaWJmU0trZ09HUmtFYXhnYU1TcVxKTVRZZWt3e2VebXFpZF1WYFVubldLU2hXZl5YTlVsVEpceV9bX2tdXVtjZWB6aGxhb291bm94dXqYfXeAgXqAf4eGenl6g36Bk4RxdHR/eXZ0hYiQfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aErJ9/eoiIg2tygXl1gICBc26Gbnx/c4mAam9tZGRYX1pZWlViamdbWl51gmlebWxcYVZcXGyBZXF0fWlpXWt2dmd0d3JthXt9fXl1cmx5aGl4Zl1kc2h6d5KBY2NUZXBngoV3d2ZoamBXVllnY4+nbn53gIuOenBwfGZ4b3qNfHaOcYR9fn+GbmR2c2RoaFxrYl1vb1tnX211ZHpoXXSAb3JrcXt9dXVhdIWKeoeHgH93cnV/dWFwbVlxdGJxcoV8dWRyf2xhbHpvaml7eXZyZoV2e3p1cWVhZW1zfmlsVGleXVRLcmJQRlZhR2J2Z2FLVG9XSkxXWGdrdnpkZW5xZmNaV11ZdmVVSlxjV2hYWUlXZVFIYnhaXV9sW15cYWRef2lqYG90eG5vbnaDl3lygYB8f4iLhn51dYZ5h4x9c3V1gnl6eoKMjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj66Me3uHj31lcYd5c3x8dXFuhWx7fmyPemJwb2JlXWVWWVlWY2ZrYF1cc4VoWHBuWl5XWlxse2JwdnZsYltsc3NndXVwbIR5foB5d25udGVpdGVbZ3VmdnaRel9dUmZma4OCdH1iY2lcVFhdYmOPpWh4dIKFkHhtbnlnd218hXt1iHKAeHx4f2hldm1gZmBeal9dc2tZZV1vb2J6ZVt3e2tubm93eHN0ZHKDkn6Hgoh6dm9yfXNieGRbb3BhcXGCfHNmcYBkXm52aWRneXt1bm+CdXR9c3FiX2Zub31kalNoWFlUTXdfUUpZWEhidWRhSVRtU0pMWldpbHF7Ymxsc2NhWVlbYXZbU0xjXVhpU1dIWWFOR2l1WF5hbVtbX2JiXYVoaGFueHlsb2p2gZB4bYJ+gIGSiISBdnSJdIyGc3F3dYJ3fH1+jI+AfpN+cHeVg3yZknmAgHh5fn90iINzcJmie3p/iZR4ZHWIeHN4dWtzbn5seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGJZVNybltaWFhgbHZjaXVqal5abXNxbHNzc2qFfH5/fHZubmxkaXFjW2pyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFtjkZ5lcnGFhJF0bGp6bW9we3x8cYB3f3J6eXlkZXVoXWJaYGdbXnZoV2JdcGhhd2Bbe3ZqaXJud3NydGhwgZSChn6EdnJqcH1tZndXXGttYnFzgXpzZm9+W2BvcWJfanF+bGx1fnNxeGtwYVxlbGx6YWdTZ1VXUlB1W1FPWVJJY3RiYEdValBJUFpVa2trfGVtb3FhW1pYWWxwV1NPZldXaVNURlpcT0hydVhfY21jWGBgYV2LamNkbXl4a29pdXmGe2uDfX+EmXyChHl9iG6PhnFvd3p9dIKCfIuPg4KXdHeCk4WBn4l1gICBc3+CcYeCdW+il3R7houGe2V3im5ue29md3B6bHN2coxrXnRuYWdla1JdW1VnYWxsWlxwjGRPb25dVlhVZ2p0Z2J0ZWVdWW50bnB1dXlrh3x/fIh2j3NkZGtuYVxubWNzeIdrWlRWY2R4fX1xhVxjX2NUWmBZY5WVY25wg4WKc2poe29mc3dzfGx6dHVveX51XmZyY1teVmFkWWF0ZVVfYG1kYXFdXX5waGlzcXNwdHVqbYSTgYh7hXFyZm59cHJvVFtmamZxdIF3c2JsdlVicWpbX29mfWZtd31zc3NqbWBaZGpqd15mVGRVVlBUbVdRVlNQSGRzX2FGWGlOSFdUVm1oZHxpa3hrYldcVVt0ZFNSV2hRWWZUU0haWlBNeHdbX2VsaVliYF5ej25iZmt5dW5vaHZ2f39sg399hpd7f4iBin5rk4hyZ3SAe3WAg32Ijn+Lk3J8ipGFh5+Ge3+GjHOBhnN9g3ZupYxzgY2LdndteoxgZHxwZnhyeWxtcXaCZ2R7bGNmZ2hTX15VZ19sb1tebo1oTmltYFRWU29nc2xmd2RlXVhwdGxyendybYh7f3acenlrYWVsbV5gb2plcHh+Z1pWWGBseHx7cINfYl5nVlhfV2SbiGJrcYGHfXdra3ltXHdxbHppdnNub3uAclhqbl9ZXVViY1hkcWJTXmFoYmJsWmB+bGZrc3VubXd2a2iFi36IeohtcWVwfW1ybWNZYWhpb3SBdHJeaWxSZXFkVGJuYnpjcXd7dmtwbWtfWGFnaHRcZVZhVlNOWGVST1xPT0hlcF1jRllpTUlfS1htZF94aG5+ZGBUXlRddVxUU2BmTl1hVFNKXFlQWXV2XV9mbWhYY2FbXo5wY2dqd3Fzbmd2dHqDcoGCeYiNfnyKiI56bpCKdGxzgnR/f4iFhpGElY95foyPh5GbhIB8jIRygIFzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyNjIyNjI2NjY2NjY6Oj4+Pjo6OjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQk6lr62tra6wf2tubm5ucUosMDAvLyxJhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzQam2tLS0tLd8ZWhnZ2drPRodHRwcGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJh4eIiIiHjpCQkJCQkIyHh4eHhoeJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGj5CQkJCQkYuKioqKiYqGg4ODgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpGSkYmHjoqQkpOQipGOjo6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Mi4uMjIyMjY2NjY2NjY2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6HiomJjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQj4aLjYmQiYuPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPiYiMiY+HjY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGiYyIjYaPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNjYuNi46Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH5/f35+fX1/f39/fn5/gICAf39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSVlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn9+fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/fn5/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjYyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fXx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISUdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2doaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdnl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVFWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tKSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFFQD46Oz4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZDRkZER0lIQz9AP0BBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAgH+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PTs3ODs8Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXNxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc6OkA/ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT8/Pj09amk+PT09PDw8PDs8Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExLSUlJSUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUI/PT9CREQ/Pj0+PkBAPEp4c0w9Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGRUo/PDtSb21nZXhzSDg8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lHSEhISklKS0pKTkxJSV9wcXJycnR1dnp7fX18fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCBdk1OTk1OTkxMTlBOTD5BPDw9Pz5CQz8/QUFBQkBNemM9V4GFhoaCeXJGODg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhKSkpMSkZGZ3BvcXF0dnV3e3x9fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF7TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDP1Z3e2d9g4KDfoJ+dkc9PT8+PT5DRD87PD0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BvcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJFQ0VAV3V0f4F9goN5gYVyREBAQ0BAP0BAPj08PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3x9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBOdHJ+fXiChYGDhl89Q0NFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS01KR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVmd4CBgYSFh4aIhEtDRURDV3WGiYp+WEdISkxMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEZISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR1hzgYSFhYOFiIiNZT9BVnSHiYeHhoeCV0lMTUxNTUxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMSliChYaEgYKGiIp8VGyFh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKY4aGhoOBg4KEhIODhYWEhIWGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkpsh4aEgYOGgIGCg4OEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+PDw9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGg4F/gIOEhISDg4SGiYqLi4uKiYqLjIlUOjg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNFcoWAgIGCg4OEg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ojo8ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09QUldrcXJ0dHV3eXt7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOUaAhICDhIWEhISEhomKioiHh4iJioqMiomJjHo+OTg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDs5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz89VIWDgoOFhoWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD8/QT0+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVCQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJdh4ODhYaFhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGRUZGREBCPz1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQERERWGHg4OFhYaGhoiJiYiHhoaGh4mKiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JDSEhKX4WCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTUtIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f39+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODg8Ozw9Oj9APkBAQ0ZKSlBng4OFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhHRUpIREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojw4PT47PUE+P0BFSUtNVnODg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIuLi4uLXlFRUE1OTUtKR0ZDR0pHTEpGS09MS0pKTU1MT1BOSElLTE9RUFBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJcb3J3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUhMTVFXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1VSUlRST0xLSkVFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExLTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNGVk5GT1FRVVl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs6UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBQUUtMS0dISUhFRklISUhJanJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f3+AgICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVlZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQPkBWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RZZ1JVVlhVVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3eXl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot5bnBYWltaUlNSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVlYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/gICAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFhTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtxeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlBRTUtSVFJNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlRVWlxtcnZ2dXNzd3t6ent7fXt9fX1+fX19fn1+f39/gICAf319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUEhGT0ZERUZIR0hCQ0hHSEpHQ0JBREBPUE1SZHN1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo7PkBAPz8+a1BLYUVGSElFQj9HTE5HTVFVSUJFPz48PTw9PT89P0FDQj8+PD1CPkpNRlVudXV1c3R2eHt8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsampmYFtRUlpcWV5JSlBRTktMUVJRVFZUV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBREJbXE97Tk9PTktMTU9PUUxLTFdNSEdAQTw5Nzc1OTk9Ozs7ODk4OT87QUg/XHR1dXZ1dnd5fHx8fXx8fX19fnx+fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGRExRT2FXUlhRUFNTUlVbT09RVlBNSkNGPjo5NjQ4Njk3OTozNjY3OTY8Qj1mdHV2d3d5eXt9fXx8e3x9fX5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhSTFhZWlZYWFZYWV1XV1hoc2tdVmFza2FhX11kYF9eWVVQTU9OTElISktJSEZDUE9TWldUVE1RU1lTXGVVT1NUUk5LSUhDP0E5OTg4OTc4ODQ3NTc4NTg5R25zdXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk5PVVNUXFZSVVNSTk1MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3l6e3x9fX1+fH19fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSkhPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUk1JTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQkZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUU9KTE1NS0dFRURCOz09PDk9RzY2NzdEbnF1d3p8e3x8fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTEVHQ09SQzhFTlNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTU9OTUlNTElLTExLR0ZGRUQ8QUE+O0BFOzw4OVRxcnV5e3t7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPzw9QUBCPT5FSEdERkZJR0tKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT09MTE9NS01MTU9OW1dLTVFPSEpIQ0lLTUxKRkZGRT9CQz48QkY/Qj9BZHF1eHt6e3t8e3p6d3x3eX1+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENBQUdJRE1PYWVRTU9OV0tMTUtMTU1MTEtOTlNkTUpMUklJSUVBSEtNTU5LR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p7end0eHV4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QUJCQURER0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVExKSU1URklJSkxKS0tJSUxNT1BSUEtHQ0tHQ0JKSkxNT05JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFva2xsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtDRkhIR0pLSUpLREdCPT49Ojo6O0FCPz1CQ0NDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTVBHSEtGSEtESElLTUhKTEhISkxLTV1SSUhETUZCRUtLTk1QTktNSktGR0dKTU5RTkxjbml3dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0NGRUdERUVGRUdCQ0A+PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkNCO0JDQz4/Q0NDRUdMTkhLTkhESEVJTU5NR0lMR0VGSUlMTktKSEVOSENHTUxOTVBNTk5NTElISk9SUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VGRUJDQkVAREI+Pz46Ozs9Oj0/Q0E/QUNGR0pHSUlMSEdHR0ZFQ0A9RUVCPkFDQ0NFR0hJR01QSUZGR0tOT0tGSElGRURESUlIS0lHSFBLREpNTFBOUE5PT05KSklNUlVUUk9XZGFhbWdwcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRD1CQT5BPTo6PT86Pj9AQj9AQkVHSkZKR0lIRkZHRUNCQUFGRkNCQkJERURHR0hGTFFMSU9KSkxLSUdIRUZFRENJSEhLSkhLUk1DT09OUVBQT05PT0xLS1BVV1ZVU1hgXl1pYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJra3NNRkZFSEJCQUREPEFBQEM8ODk9Pjo/PD9CP0BAREZIRUhGRkdGRUVEQ0VDRElGQ0ZFQkVHRUVGR0VKTUtIUU1KS0hISUVGSUhFQ0lJSktNS1BTTkRRU1FRUk9QTU5QTUxOU1dWV1hWWF5bXWRgaGJqaWdrX2VlZ2NnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1IR0dIQkJCRkU8QENCRDw3Oj0+Oz46QEI+Pz9DRUZERkRER0VDRUNERUZHSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSUpMRklIS0hFS0tMTU5PU1RPSVNVVFFUUFFNTlFOTVFXWlZaWVZaXlpYYWBgYF5oZWNgZGVoZ2poaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdW5vc3N5TklIR0lEQUNIRTxARUNFPTg6Pj4+PT1BQj0/PkFCRkNFQkNHRENFRUZHR0dJRkhKSENISEdJR0ZESEtJR0tITUtKS0xITEpNS0lOTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVxfX15gY11cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF3cXVNSUtISkVCRUdFPEBHRERAOTw+QEA/P0JCPEA+QUFGQ0VEQ0hERkRHRUhIRkhHSUtKRkpISEtIRkZMSEhISkdMTExMTElNS01OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltcXmBfYWBiZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvdkpLTEpMR0JFREU8QEZEREI7Pz9BQUFAREFAQj9BQ0hCRURGR0VJRUZESUhGSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk9OT0xPUFJVWFZNTlRWVVNSUVBMTlRTUldbXl5fXV1gYGFhYWBiZGViY2liZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3Z0dXV3dnV1dWVxc2twcWpydm93Sk1MTE1HRENBRDw/RUVFQz1BQUNCQUNFQUNEQUFFR0NIR0hHRUpGQ0dKR0dKRklMSElKTUpNTEdLSUhMS05RS1JRTFNNS05OT1BQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGVhYWNpbmhiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxLTEdEQUBEPj5ERUZDQENBRURERkNCRUdDQklGQ0hKSkhJS0ZES0pHSElJSUtHSkpPS05MSUxISk1LWmZKZFxLbFJIT05fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDQ0JFRUVGQkZGR0NESkVFSkxMSkxNR0dNSkhKSkhLSklLSk5MTU1MTElMTUxbc2JkcF5sbFVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXHB1Z3BNSnJ5dmtiYGtlZW14bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ0dGJtdWtwcGxycnF6S0xJSUdFREBBQj89QkZHQkZDRURFRURDSEhHREVLR0dMTU1KTU1GSk5ISUtKSUxKSkpLTU1OTk1NS05NTVtyb29ucHBsa05QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcYHNscWpVdXl4cGNea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPT9ARkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkhMTklMS0lKTUlLSUpLT1BPTk1MTk1MXGhkdV1scVdsTk9RbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0d0lNR0lERURDQUI8QkBCRkRHRkxIRUNDSEtISEZKTExGTUtMUlJMR01NSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNnYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0JHQ0hJTUlGQ0ZKTElHRkpNTEZOSktXUktHS0pKTklISkxJS0pJSEpMTU1NSUtLS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBtaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcnV0d3NISEZJREVERkFAQUVEREdCSEpMSEZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSktLSUhJR0tLS0tGSEpKTExMS0lLTE5UW1xUUFRNUE9OT09WUU9PUU9PUUpKT1BRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdJUEtMT0tMV01JRUVISUpISUtJTEpIRkhHSkdHSUVGTEhJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQUNEQkRJRUdHRktKS0hFRUpKSkZFSEhQSkxNSk1TSUhFQUhGSklLS0lMSklGRUpIRUZHRUVKR0NKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY2BZX2JbYF5bVFhYWl9eZGJiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDRkdFR0dJSkpJSURGS0tLRUZISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVBRkpEQEpLSU9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJiYmNjZVpSWVZVXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUxEQ0tLTk1MTEhKSkhKRz9HRk5KS0tMS0tLSUdIRERAREFISUE/SUpHT11hWltkXV9UUVJXXVxcXF9aS1dcTFJcWUlNXlBQXV9hY2NjY2JcZGNiZGNmWFFVVFNcWFthX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkZIR0dKRkZGSUxKTkVDS0pMTkpMSUtKSElHQkhIUU1LS09MS0tJSEdFRD9EQkhIQUFHRkRUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYGBiYmBjYmJkZGJYT1FRUltTXF5dXV1fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUUpGSEhIRUZLSk1QRUdJSktOTExJTEtJSUdESEtRT01MUExNS0tISUNFQERDSEdCQUZFQlZVRVxUXlNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXGBgX2JjYl1iYldfX1RQT1BRWFJdXFtcXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUERWXklHR0hERk1KUFBGSklKS05MS0tMS0pKR0VKTVFRTk9QTU5MTkhLQURAQkNGRENBREVBTEhDTExQT09MRk1GR0lKSEdMTE1PUUlMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVpeXmFhZWZjaGRrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5MR0dYTUhISkhHTkxRUUlMS0tLTk5VTk9LS0xHR0tQU1NOUE9OT05PSEtFYERDX0xEZmNETVtIXlxzbU9NVm1ZTENQYFVsV2dKXVhWXkRMUVVMTVRWUVJUWFdUWFVUXFRQZlpoaGRZVGtUV1ZVW1xcYGBhYmJiYGZoZm5saHJ6fH1+gYSEhIODg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVElLR2FUSEpPSklPTVJRS01LTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1hQbUhxbm9hVlBxcXNQQmtzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZWl9WVVd/anR1dV9hdl9YYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoOEgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSUxGUlZMS09JS1JYV1FOT09MUVROT1FQS0xPR01QUlpaVFFRT1BQUEpIWnhdVHhkaFlSVFF2Z3RscGJuZmtRck9Nd21qcnBzcnFycG9wgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3N8fW9+eW9/cmBgYGJiWmFgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUE9NTUpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUFRQUFBRS0dmeGxjeHFtWkpMVXlwdW11Ym52UGRlSWZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Bnb1h2dmp2dXCAYXNofWlseHxvX19fY2JbXmNkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN2em58fXl4cm5OSlN0TkRCRVBQSUtLSkxQT09PTVBaYFpYS1RXUGFeUlZRWVNNUElTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaGFWbkxxcF5GaHlXdlRMaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUtLW1ZIR0VHUlBKTE1LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VVdsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraG1tcnxrbWhre3RtbWttT0dKS0hKSEhSUUxOUE1MVFNST1NTV1JWVFBXWlZWVFRUYWBRT05LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU9QVVRYWFhbW1VTU1dbV1hXWk9TVVdXWFFdWFZdVVNPWFJXV1dYWmBbZ3JeW1xbXV1fY1pfY2NlZmRjY2JZY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlRSTVFRUExWVlRQVFVYVVlVUlpdVlVUV1VZWFBPTE5XVFFOVVNOUE1MUVBLSlFSS1FNS0tPUlRSUVFTU0lITU5PUVJRUVFUVlJYV1xXU1NRUlVVVlNaUU5TUlhVVFlWVFlVU1JVU1RVWFlXXlpfYV1cW1pcXGBjXF1iY2RnZWRkYVlgYWNhYmloaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGRmaFBKS0xPT0xNVFFPVFFRTVhXVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUE5RTktTUE1PVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUT1RVWFVUWVVXWVRSUldVVVdcWVtgXlZZX11eXVxdYWFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNhUEtNTFBRTE9UUFBTUU9RWllYV1haWlhYVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRUFJYVFJRT01PU1VOV1JUVVVPTk5RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1dRVFZWVVZZVFdXVFJSWFZVWl9aXmBfVl5dXmBcXGBgX19aYmJkaGhlZGJZYmBiXl9mZGRgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlFXU1NTWE1PUFJUWFVVVVNVWVhbXl1bW1ZST1VXVltcV1FUV1VXWFZUWFpUU1FZV1ZcXltfX2BVYVxgYV1gYl9cYF1jYWNnaWRmYFpjYGFfX2VlX2BjW1pcW1xZWllZV1xZXFtgXl9bXl5hYF9iXFlgWlFOT05WUVBVU1BVVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUkxRVFNZWldVT1JOU1hWVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFZWXFxWUlRWVlhZU1RZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dW2BcYFVcXWlqcn1zbGdcVVlXUU9SW1NSUVRSVFVUS1JWVVtZWlNPU1JWVlVTT1ZSU1pSVFVUWFxXWFhTWFxYXl1ZW15VVU5WV1deW1hRVVVYWFhVV1lbVFNWXVldXWFeY2NeWWBbZWJfZGReXmNjYV1lZmlkZl5eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFlbXlZeWV1QT09SWlBaVVVXVlNUVF5eYF5eYlxgVV1eYmt5dGx9bFpVWlVRUVNcVFVUVVRWWVdMUlpWXVtcUk9VU1hWVlNQWFJTV1NXVlZbXVhbWVVaXlhfXllcWlJXUllYWV9aWVNUVlpZWlZYWVxWVVpdXF5gYV9lZF1eXV1lYWJmZF5fZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllaWFZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxXV1dWVlddWFBVXFleXV1UU1hSWFZTUlRYUlNWU1lYWF1eWF1bVV5fWF9fWFxWUllUWVpaYFhbVFZYW1paWFlaWlhWXV5fXmNiYWVlXWJcYGZiZGZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1aW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2hZXFpWWFVXW1pZXFlYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXW1pcX15aX1xWX19aXV5ZXlZTWVdZWl1iWV1VVltcW1xbW1lbWVleX2BgZGJjZWViZFpiZmNnZmVeYWNgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWlhXXFtcYF1WXV1TUFZaVlZaVVlVWFdYXV9iYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcU1ZZUFZWVlZWVlRWVFhcXF9gYF1gXVdgXlteXFteWFZYWFtbX19bXldYXVxdXl5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYWBlY11maWRlaV9mXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZGFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQWFdYWFhXVldWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgX11fWVleXV5eYV1bWllcX2FfYmRkZWZnZ2JaZGZnaWdjX2NeYWZlWmhpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFhXXVxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl5cXFxYV1tdX11gX11bYGRcXFhaY2VjYVJcWU9YV1lbWllYWllgXWBiYmBhY19cYl1fXVtfXlpZVVhdXV9gX19bWl5eYGJjXFtXW11gYmJjZWRnZmVnZFxlZmhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXVxeXFhdXF5fYWNiYWFdYltiZGFfY2NiXVxbWldYanFgXGBfXVxhY19eWVljZWRhVF9aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl5fWlhWW19dXGFhX11bYGFiZWJfXVNcX2BjZGRmZWdmZWZlXmVmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t6enp7e3t7e3t6e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t6enp7enp6ent6e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiI2xtbS0tLOzu76+vr6+waGKjIyMjI2Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyLkbvAv8DAv7/JzMzMzMzPqo2QkJCQkot/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIOBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXl6enp3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9gIGBgYGAgIGCg4ODg4N/fHx8fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eXZ2dnp7eHt4d3Z4e3d6eXp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t6enp6enl6eXl5eXp6ent8e3t8fHt8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8enx7eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x7eXt4fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3ent5e3d8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp9e3l8eHx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4eXl5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIODgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JycXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW1tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYGDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOBhoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn+Afn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH59e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqGhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f4CAgIGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4CAf4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoOCgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn59f39+f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpKQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgYOBgoSFhYWGhoeGhYaGh4eHhoaGh4eGhYSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFhIKBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEg4ODg4GDhIWEhIWFhIOChIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBho2CgoKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf3+AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGCgYKCgYKPm4WAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICBgIKDgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCCg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKBgH9/hZabiISChIKBf4CCgYKCgYKEgoGBgYGCg4KCgoODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpGRkY6NjIeFhIODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4OEhIOBgIKDioiGgH19fXt/l5yJg4WEhISCgYCBgoOCgoSEg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYSEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCAhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gIaZkIZ9fn5+h36NnIWBgoCBgoKBgIKCgoKCgoODgoKBgoOFg4ODg4ODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWEhYWEg4ODg4SDgoaUlJKUko+Ni4eEhIODgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB+fn9+hp6dhoCJgH+HgYCMgoGDgYCAgYKEg4GBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoKDgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICDmqGIhYmDg4GAfYGEg4SDg4ODgoCAgIKCg4OCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISEg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGQnYSCgoSHfn59fYSFhYSFhH99fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4aMgoB/gIWAfX17goeGg4B/fn5+f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4OCgH+EjYR/fX2AhoF/f4CAf39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaHhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4CAgYWEg4OBf4CAf39/gICAgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIOBf4CDhYOBgoKCgoKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYGBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4OCg4SEhIKCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWEg4OFg4OEg4KCgoOBfn19fn5+fn59fH59fX2Dh4mKioeHhYaHh4eHiIeHiYeIhoiHhomIg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OFgoGBgYGBg4OEg4SRkpGOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoWAgoSDg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoODhIWDgoOBgoODhIWEh5KRj42QjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+BgICBg4ODg4OCgn99fX+AgIF/fX5+fXx9fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn5+gIKDg4KDg4OCfX1+foCAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/gIGBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB/fX9+fX6Ag4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf35/fn5+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e39/fn9/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6eXl5fYB/gIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/gH+BgH5/f4B+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/gH+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKAfn59fX1+foB9fX19fX19fX17enl5eXl5gIKCgoSDgIKDgX+BgIGBgYOCgoOBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fXyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f3+AgICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoOBgYGBhIOCg4KCgoKAgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH9/f3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAgoN/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBg4WFhoaEg4WFg4WEg4OEg4SEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OEhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8gIGBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICBgoGCgIGBgYB/i5OPjIuNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fX18fH2Af4CAfoB+foGTkYyMjY6OioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGOjI2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgIGBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyMj42LioaEhYSEhIODg4KCgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyAg32Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNjIuIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXt9e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWHhoeGgYSRjoyLiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+enx7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYuJi4mFiJGNi4iJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8fHx8fH+Af39/f3+AgH9+f359f4CAf39/f4B/gIOCgH+AgYCAgH9/gIF/fnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX57fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mNkY6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgIF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Dg4SHiYqIiY6QjYuIiIWEhIKBgoKCgoKCgYKCgoKBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iIJ/foKQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn98fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f35+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGBgYGAgIGCgoKChYWEgoGBgYGDgX+AgoSBf36BgH1+gX59f3+AgH1+f4SAfn5/fX59fYqFfX5+fX5+gH99fXx8fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGCgoGBgoKCgoGBgYODg4KFhoSDgICAgIOBf4CBg4F+foB/fn6Afn1+foCAf4F+f4B/fn9/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH6JhoaFhYeFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHV0gICCgoKCgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIGBgICAgoF+foB/gYB/gICAf359fX19fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+f35+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChH+DgoKCg4KEgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYOBf4CDgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9+f4GAfoGCgoOBgYODgoOChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYWEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f35/gH1/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYGDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIGEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBfn58fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/f4GCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzd3ZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH5/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoCAf36AgX5/gIKBgIGEgoSFhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fX5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOBfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SDgoKEgoGBgoGAgoGAgX9+fn5+gH59fnx/gICAf4CBf3uAfoCAf4GAgH99gH5+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4N+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHh7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fYCAgYB/gIGAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH99fX6Agn9+gIB/foGEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6enp6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fn58fX+AgICAf39/fn59fH5/f39/fX1/f31+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+gIF/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXt8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgX+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af39/gH9/f3+Af4CAgICAf4CAgYGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx9fX5+fn18enx8e319e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgICAgYB+fn9/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fX+Af39/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgYF/gIGAf4GAgYGDgoCAgICAgH1+gH2Ag4J7fn57e317enx7e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgYCAgIB/gYCAgYGBgYCBgICAf3+Afn99fn1+fnt9fH18fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+gH+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGBgoOAf4KBhIODhIGBg4GCgoGBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgn9/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x9fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGAf4KBgYGCg4KCg4GDg4KBgIGAf4CEfX19e399en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9+gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOCf3+BhISBg3+CgoGDgYKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISFhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t8enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+BgoGAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF9enx8fX18ent+fn6Af3+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eXZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAg4WDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB8gIF/fHx9enp7fYB+f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIGEhYWCgoODhIKDgoOCg4F+gICCgoOCg4ODhIKCgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4CChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4WAfoKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4aCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgoF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISEhYOHhoaEhISEhYSFhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4F/fX5+fn6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISDhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4CCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4GEfoODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH98f318gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIF/gH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFhIWFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgYF/gYGAfX9/gX5/fn1/gYB+foGCgICBhIeGg4OGhIWFhoeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImKiIaEhoaFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319en17fH19f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWGh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIaGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFg4SEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn9+fn5/fH19fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt9fn17fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWEhoaGhYaEhoWGh4WFhoaFhIOEhIOEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fX18fHx9fH59e3yBf318fXx9fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aFh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYWFh4WEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeHh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYOEg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9fHt7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWIioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhISGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4KCgoCDhYKDfoGBgX+DgX9+fn99fnx8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gHx7e3t7fHuJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhYKBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiIh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODgoJ9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWFhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhoeIiYaFiIeIh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaHhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn57e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH6AgoJ9fn9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGEhYSEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhYaEh4aFhYWGg4SFhIWGhYaEg4SEhYOFhYGAg4N/fn+Af3+Ag398gH19f4J+gIF+foF+fn59fX97f3x7enl6enl6enx5enp6e3t8ent7e3x9fn19gH19fHx9gH99fIaDhoaGhoaDhIOFgoWBgYB/f4B/fn+AgXx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhYWGh4WHhoaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn5+fn9+fn+Efnt/fHyAgX2BgH19g3x+fn19fnt+fHt6eXt6eXp6e3l6enp7e3x6e3x8e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+BfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYOBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgoOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fX+CfH9/fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fXx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX29vb29vb29vb29vb29vY1tfX19fX19fW1tbW1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI+MjIyMjIyMjIyMjIyJor+8vb29vb29vb29vb60ioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxaVVZWVlZWVlZWVlZWUnyuqqqqqqqqqqqqqqqsm1NSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWeX1laWlpaWlpaWlpaWlaAr6urq6urq6urq6urrp1YV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqo2hkZWVlZWVlZWVkZGRhhrKvr6+vr6+vr6+vr7GhYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMzMzMy8/T09LS0tLS0tLS0tPT0c3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7OztDU0s/P0NTSz8/P09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fW19fX19fW1tbW1tbV1dbV1tbW1tbW1tbX1tbY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs/KlqXR0ciUp9LRx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/PnKqdrdGZrJyw0ZmsmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Qy5SImp3ElIicnsSShp2czs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9G9yJmZwr/JmJjFvMmXmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0peUn8zSlJafztGSmaDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P07ObxJjZr5/Cm9qto7+d1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NHOjZCew86Lk57Hy4iVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRy9qoma/P26WZs9Dbopm11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTc5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyY6lmqCrkaeZoK2QqJieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyruhpqefsaSkqKCvp6KpnNDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTnpCNttackY661ZqRjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dK6xNXT07nH1tPTuMjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS1dTS0tLV1NPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ6enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqSpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaepp6moo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6qqrKioq7CpqKqooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLavs7CrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FtaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1try8vry8vsa6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9taHF4b3lqaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGw8TDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N5ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8PBxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjJyMjJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwc7DysrIxszKzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1b3RiXWJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcLDv7++xMvIysvJus7TyMjNyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2RqZWFqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7m4ubu+wcfBxcPTianPxMTBxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vcS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJnY1taWlxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vcC5vrq6tMC4tbezrrq7tr7MtoSe0ry/wby7xL67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrq1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb7Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygp6GjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJiZ2pnZmllaV1WVlRZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3sK63tbi/z5uBirXBusO1use4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoaKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtoWFhOS0tLUklMSEM5PTg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube4tK24sra9xcWHgYCfxL7Ht7m4rbe1uLq0uLO7xcbLwbzGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PT05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK+xtrqxvb67xLa3nH53gnSEk8Gse4GCnMnGz8LAuK61tby+uLqyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRueGNnYltjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrq6Owu9Tau7q+vMaynXdjbGRQW2F9j3qFhpnLztHMysS1usDDyL++tb/Bv8bGv8vGw7/BvMDDzMrHxcbAub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRDxBQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxs8Sistu/vL26fWRvYGBzW1RVWGx8hoibyMjMy83KxsLEy87CvLm9ubnAw7/IxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi1vLfBb2+wzcG0elpKZGNLcH5uYFFZeIKLoMXCx8vIwcPBwMnKwsC7urC0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysq+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru/x31vdqS/m1VST4NnT1x8gYNsRmuCkKzDvb/GwLnAvL7FxL29ubKwrri3v8PHw8S8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVtfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5x8iCf25/pXNRTGKVX1FRVY6Wdk5li5yuuLi4wrqzu7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZl1aVEo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2uMfIioN4dI1hTGKKcVxPVmSwundWUH6vsLKxt765srWyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cWxfY2FbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fDw5GIf395VlGOlGttVmVwZ5R+cW1eh7yzsLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWZYXF1STk1BPklCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4ucOikImQfkpemMN0gYqQXXZ8aWp0irS7tbG0tbK0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbK7r5SQnZZMYo2UdnCAemNqbHN+enOeurmytLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrSmnaqOV4FvbmpcaF9dVlleZ2NpgJe4sq2zr66srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mopujnJWQjI+PkJOQl5WWmJ+enpqYppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdQTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKmxwLevaHh4a3NoWV5QSkhKTFFPWmtuoraqsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZmqOZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSkhHT1JNSk5HPEVAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoaihpcTDjmBlY3JjVExGXUlQRk1LS1NeXXy2r6+ztaqnrKuinJmUjpGWl5iZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR5eWBiUlVgSUlKS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel5+lnp25sYV6Z2pjVkhQXo57bFNLR0dOVFRkq7KwsLispqGcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysbSqsq+imZydnqGZm5uamJmblJablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5PVUxTTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKcopueo6eafWxdVExJVYOqsZ9oUEZDQ0dNXpSwrayvp5+eoqCXkZOboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6koaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmZ6boaGhhm5gVVBOT1yr4Nq6j3ViU0hCTYuZmquqqaSfn5mSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6ilpJ+dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCV05KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempykoHRZUk9SUl11uNK6oKm5noR5ia7Eo6itqaqln56eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Svs66qr6Odq6e2sa2isKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rxa2t1cnBoV1tRRVRIREpQST9FQTRGSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian5+aoJxmUElOUF11jbK9qYei3NbO1NnItK6no6OhoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLBxr66tLq6tLu3sLWyqrqyrru3v7u6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Rob3hqZFpbRktMRURTTERCRTc6Pzs1NDk5Nzg+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGinZyUXUtFTFN1hbO2pJKJxePc0cS1pp+ZnJuenpmXl5eSjI6Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcXM0NLVztPJvcC/w7vGxcjF0dTN09DT08zKwsbGx8rIzr/I0czHxcfFwbzDwb6/vrW+s66/v8LDx8THxK6/uLK4vMPBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jn5yelmNKSU1cfqrR0Lags9PMuq+oop+dn5qYlpSSlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1dbT08jMx8zNydLNztPNxcjJysHGy8fIyca/w7OzyMTLysvPxsq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoKV3XWdog7DS2trWyrqyqqOenZ2hpaCdmpSUlZSJfHdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1tbZ1dfT1tjO0srP0czO0MzSz7/Ix8rDzMzMzs/Fxse2v8q/0c3Lz8bJyL/Dw8jOzM/Qz83Kx824t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkdBRUhJPjtBOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKGqiYGSr87U2drPvK+om5aYoJyboaKfm5yZlYl3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dfX19PWz9XU2tTUzs/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1dbMz8/KzdLLztDAxsLHxc7N0dHRyMzNwMrMxdPOy87IxMrHxsjMytPT0dXP0szTwbnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGmlXuTksXW0tXCraahmJWXmZqdoJ6ZnJ2SfXFlY2NfX2FfX2FgX2BgX2BmbnBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NjXy8jOxMnPzMrMwMm/x8nNzs/L0M3OzM7PyMvQ0MrOysLJx8nMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNV0U7QD0zMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2ppnZpf5TT1s2wnJuWlZebnp6fnZSWmJSIa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPx87NzdTMztPNy9fW0MzR1MvM0NLTys7R1dLV1crAycHFzMLIycLMw8XIysrPys3M0M3Ty8bIz83Ix8vFxsHFysvMz9HG0M7NzczPxcfBuLm9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeXBxa21nYGBwaFhYaFZMRkxJUFBCO0M+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7Sooahkb3yo2dCqlY6NmJaRk5KRlpaWkIt8ZWFiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0M/FusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS+wMfLy8vOwsvLyMfL0MTFyLvHw8nIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raacXm93utCrkI6Ol5CHhISEgn6FhX9zYFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMvNycTCy8nBwszQxcvIv7nBu8bHvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa8vMDDxMvFxbvAysLFx9LFwcm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWbo6CblHt2c3RmaVphbmxaW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwLTDvrKyjWBygb+wkIuTl4d7gYWGgHZ4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrG2urKys7Kxwry8vLq4wcHCxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw7+8wc3Dxr29tcG9w7q9xrvCurO8xcTBwra/trW9v7rLw7y1usi6v77LxMHGwsbJxsjG0MbCzMeyx8nDzs3BxcPAvbO3sLKnqKi5sKWtsKqtrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7RysrKx83NztHI0MbV1NbXzcrPxcnFx8C4xb2rr35kdZC1koyJi4V5gYeHgH6EfHR0Y1tcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i1t7Szs7S8tr2xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wcK8uL3GwcO7ta6ytrq/tMS3u7WruL29wL2xuravtrqzxby3rru/tbe0xby+w8XAw8XGyMvFwMbGu8jLv8/Kx8PGwsO3w729trm+x7+stbq1t7aOeXR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HFwL64t8m1qbCCbXGXmo2GiYp7eX6Ghnd4gn10aV5dXV1fYF9gZGFeZGVjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+4uLWwq6ynnqKqp56rrbOtqayptK+3sLKprqassry6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCywLa4vbCwp7Kztbu8q661pa61r7uysKm5sK27rru4u8DAvbnCv8fDxcG8xsLIy7jFx8W/xsPDusTGwrvGyczLs7nCvLuziHN2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fNwcPGv8TEw8PKwcnKvr+8wLqys7TDrqmuhmhkipKIjpB8eH6KhXp7hIF3bl5dXF1dX2BfX2RjYmNjYmBfXVtbWlpdWlpaWlxkbm9oZmdpa25yga25sLWupqWnp5qgpaGanKWrrqSooqyqrKqwo6afqq21trG9ua+3r6muuLS0vLi0vK+3ubWyu8GywK6lqaKrsbKzqL2qq6irrK20s6aorqGkr6mypqeorqaot6yxsre6uruyvL2+vsS/tcLBx8i3v8DFt8TCv7u/xMK+xMjMyr++xMDAqYdzdHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvBy767yba9w766ybfBw8G0tbu1sK60u62op4dfcY6DiIuAe36Afnh0f3xzd2VfXVxcXl9gXl9jY2FiYGBfXV1cWlhaW1tZWFpcX2ZrZmVnZWlrb3KFqqWspaCcoqWUnqWbmJGho6qkop+mpailraCdnKWmrLKvtrensKuoqrSrtLqxtrWutrmxr7q6sbakoKSfprGnq6i5qqSnqKinsq2gp6afm6SmrJ6fp6OgobGtrayytLO0sLW8trvBwbK6vsPBsrm5w7PAvb+1uLu9vrzCx8TCw77AxKCDeHBrYWZfa29gVFleSE5nT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci0tb24usC6vbWgnpWdoaa6tquzs7uzxM/Iy8LGuLfHwcy/uMm3u8W4s8S4s77Aq7W7saukrrKsn6KKYYKHhoaBfHl1dG9ta2pqcWleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlpuilpyjmZaNn6Gjp5ufoKSmoqiem6Kbn6uwrLG2o6mqqqyspLS5rbewrLO1rrK1rrCqn52fpKKypKapuK2ipqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqysrbGyuK+4ubuwtry8uquzs7qzvbS2sbG1tL+2vcC9w8G7u72Xg3tza19lXmRkWFRXXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7xMPPvrnHuLe+t7LBtLG7u6u4ubChnaiqppadgmWChYZ/eHJucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dYWFhYWl5iZGRlZmZoaWtyjaedlJWVm5ibopeWkZyioqidm52lpqKmnKCgm5iurq2usqCloq6rp6K1sbKyrKivsqe6s6a1oKKem6OhraOiqrWqoqOmnaamo5aZnpeZm52gmpednZ2craGrp6Skpq2rs7SqtbCzq7K5tK+qr7Kys7ezrqmsrrK4sLq2ur2/t7OxlIV5dWVeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lo5ilscK1tr2ttLjCzMjGv8W2wb/HzrfAxL2zubmyv7axuLqssbStnZijqJ6SmndpgYOEf3hvcXRxaWZkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanainJSUkJWXl6CXmZWXoJ6hnJahoqmkn5+pnZyaq6evsKqbo6S4qqGgrqi2qqanrbCkt7Ckt6Cim5mZqqahmqy4sKKhpJyin5+TlKGUlpabmJeWl5yVn6qeqqSinaOqqrCuqLSrqqets7Clq66zsbCwrq+mp6eyrrG0sLy0ubeuo5SBeXVkXmFWWVdTUlRLTV5MT0tHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64va6dp6ijqrvAvcC5rrS4wczHxcLDvcW3yMyywcLBrby7tLu8tLi5r6+vp5uYn6eSj4pweoB8d3FpbHJ0cGloZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZqgZaTlYySlJSbmZ2WlpygnKCWoaCnpqSmp5+dn6agqq+mn6Kkt6ihoaKotKKlqKWwpbCtq7SeoJ2VlamhopStsbGfoqOdnpibk4uhlJGTmJiSl5eYl56nnKehopmjpaWrpKWwp6Wjq6utpqmur66rqKqps6WmrK+0sa+8tbGvrqCSenZyZGFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsbHtsbEs8K/xaq3t722vbq6tbKrq6WYl52hiodxfIh+dm5jYWZpaGZoamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1VUVlVTVFJVYGBfYGFfYGFjZGmBlJOJkI6Uk5SdlZaXpJmgl52hpqKtpqSko6OinKqrpZmfpbGqoKCdpaudp6Keraypqa2soaKilZijm5yQq6mwm5+in56XmZOKnpGNkpOWkJiYk5yho52koKKVoKKkppujq6WipKqkq66lrrKppqWmprSmqaits7W0ubqvqayei3Jwb2BbV1ZVUkdRT0haW09SSlRLU0xFRklDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojw8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvbG+xMmssbjBtbvAu7SzqKmklJiZmod+cIeDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl5fX2JkbY6QhJGHj5GPmpOVk5ybo5yboampq6isp6ilpJmlrqSUmaWvqZ+bmZugnq6Zm6uzoKWmn6KjoZWTm5aWkqmqrZqcn6GgmpSQjJmOjJGMko2WlZCeoaCjnJujlZuho6GXoqijoqiroKuvo623paOjoqytqqirr7O3s761s6uvmIR0c2hbWFhSVVFFWExRW1hNVE5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtqLO2rqmnr66bqaist7asvMq7tr+sy8bFuMHOz8izxLu3u8PIsa24v7e8vbqys6OnnpSVlpSFeHOAdndubWhtbm1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1cXF5fYGR+jYGLf4yQipKNl5GXmaKgm6CrqqaurKivpKian6yglZakqKedl5CPmp6ulpioqpmfnZSloJ6SkJKRk5Wnq6WamZmenpWNjIuThoiNg5CLkZWRoJ6ho5eVn5WaoaKelJulpaeoqKCxsKaxvKefo6y0q66nsLWwubXAsa2xq5B9cnNiVlNWTlJJRlZQUlFMTFdNSkxOUkdNSkFDRkRDPkA2NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qmorCrnaqnqbKxpbbGtLm6s8rFubrBy9DLsba4vL7Bw7GwsrettLO6srGhoZqblpWSgX52a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipeJlJSYm5meqZugqqalq52omaGlm5OPn6Obl5eFhJKbo4+Uo52WlpaIopubk4uOipCapKeclZWXm5GRh5SOi4GLjX+QipKSkqCan6KVk5iYlaKmmY2ZpKaopqGftLKosrehnKK3rKqtpLKyprW8tayrsaOJeHNtXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrGlp6OppaCopaSzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatua6rnZiZm5SShXqBbV9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRhI+LlJGUnqGPm5yjoaOYpZeinJWNh5iajHONg36Nl5aGkZmQlI6Oe5mPnIyCiX+KmJ+jnpCTmJaFjYKUfn50iY55kIeTj5CdmpmakZWQnY6io46JmqChpKSborSvrK+sn5iluKamsaGxrpywvKqpr6qZgndzY1ZNUk9QTUNTTkxRTUJQUUhJTlJNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6emtMG4sLSwycS3ucHOxb6zrLrBq63DraiippKdprWroZyOlJWRjnx2fWVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKQg5eGjp2Xi5SQn5idlZSWlY+WiYCTiV87V298i5SJgIyRjJCGhnOKhZaBeYF6hZSdlIOVjpGQg4Z9k3hxb4WNfYmBkY2Pl5qYk4qPiZyHn5iHiJaemqGgl6evqa2oqJ+WrbOipq6ZrKuYqLSiqa2jk31ybmBbTlNSVkxEVEpQTUxGTk9JRUxRTUtPSklNT0ZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaejqbCop7TBubG1sMfCt7O9z7+5r661wqeqxamjnZiDlJuuoJiVhZOOioZ7cnRcUUxSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkB/lZGRfYmUjYSKjZuNlpWJkoiGlYZ5iH9gSlFueIqRhH2EjYqFf39ufn+Ud3V1d4SNmXBRjYiKhnt+eJR2aHeGiH6KiJWKjZGSlouEioiUhJqMgoSSm5aenZSko6ippaSem7CqoaSkkaaqlqKqnKKmqIl0bWdeW0hRUVJNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foq+hp6ilp6ivraq1vLa4t7PBu7anuci4tqiotbaqsrymnpWOf4mTp5WUiX2Ng4F8dm9tWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYyTgZKZi497ho+Adn94c251cHSNjoF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4F2cnKSd2d1hISEhHuViYiKjIuAf4SLjH+Ug3yBkJiVnJWRn52pnp+gnaCppZ+dmI2npJOhn5aenqSAc2hgXFxKVk9SR0pYUk9KTE1SSkpKTFBJTFFMUlRMRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppa2ssLGqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjZSAjZuNkH52hXd7dW9uaFhLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g3x4ZneNl5iNj31oeYF2eICJj32EmJKBcYePfHd7b2t+rX1zkIt/e4aSgX1/dGZ2fIZsb2hzfImMiIBseXF9cG11j3FpcYB+jnBDi4SCg4V/d3d6i4V+jHt1fo6Sj5iKkpqbo5aZnZqdnqKdlo2LpZuPnpeOlpiPd29tZWJaV1dUUUpTVVRPUE5QVktOS05PSlFOSE5PS0VDPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsK+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZjoSSeYiNiol1cHttdHBpbGlXS0ZHRUFAQ0RJTExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXWVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ6fX57dm90c4WCeYF4cHyOjIqUg5aXmJqQkpWXmZeel4yDiZ+Ri5KNhpCWfm5pbm5uV1VXVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzs5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2woqyqqLWvrqy0v6u8wr+mopmVpJedjYSLlKGhmJiRk4tzjnp/hYuFdG50a3BsZGtqWE5FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxgp4himml0emV/cG1/eouJdoGIhnRsmpJ0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcYB8Z3Fxe26TjY97c318cXBudW2Cf3h5dWp5iYKIioSWk5KQi42RlJSPl46AeYiXiIaKhoCQiHZqam9oZFdRWldZWVtNUFVWWVhOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6a6r6uysMKxu8PHmpaPlJmLjYV5hJCYlI2QjI+GcYeCc4eMhXpvcnBub2RwZl9URklDPzw7OTo/QEFEREVHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4GFgXqEhoZ5cqGVdHiBc3WUhzVxnaidjqGhhKKFdnCGfId8c4ytjYmAZ2Ziam5ybXCDdWlvWHVwjpqSd2x/e31tcW1wgHpzdm5jdoR+hoCFkJGKi4mRi5GMi4+DdXiLj4B+g4B+j3tycG9sYFtcXVtZWGBfUk5bWlhXTEhKRkpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGepKeer5Wltaqusa7BsrvBxpaQjJSQgIh9boGQkomDioePhXWCg2yViId7dHh4bHdud2NpXklQRz5ANzQ0OTs7PD0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoGFmYSbnGGGqp+di4OQjnp3iH6JiI1zipePhHpdZHF0ent3imxnamJ5b4WPgnpugXd0hHpwdHp3a25pXneHfYd8iIePgIuSl4ONhY2HfXGEf4R9dXd7fIl2cHJzZmdfW1tdU1tmXldRVVhbVUdKSkRMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkp2dn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYSLfX2BfnCAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc218gYaHfY5oZ2h4fm6Fh4KFcYSFR2uAd3J5dmhta193fYOJf4iFjHqVnpuJi4iRf3p1i3Z8eG1vd35/c3Nxa1teXVtjY1hmZVxVUFBWWVBETEtGTklDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT9AQkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYiRgZqVgqChl5WbmqWtk5q7sae7x8OoioyhpY+UiYGRe3KEnp+RnH92hYWKj4iQamhvg4B1jYeEi3GGgneHgHt2hX1udnVngJSPhomIiIiHoauhlomOmH97gol6em9na3h+eX5yamReW1tdaVxhZl9ZT0tOV1JRSVBKRE5HQ0pEQkBEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjICBkY+LmpuknaGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYyLgomNg3+Jf21wal1CQTQtLS8vLi8wMjIzNDc3OTs9P0JFSEpOUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSEpMS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6KflJmShIqFj5iRlmxwdYmLgpaMjY92j4RxbIWBipaSg4WIcomhloeTiY+PlqW1qZuNlaKDh5OEfX9ramt8gH+Bc2FdY19aZmpca2teV0tHT1NRTk1MRklQQ0RNRkFDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpiWmpWfn5ynoKqWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioWZkpGCgICLjYmFkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI1NTc7P0NFTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWdn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJSShZyhmpqZp5GRiJWimpp3en6UmJKhkpeXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNzfH56cWhgXGFfYWZjYGdnXFFFSktQT0lKTEZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYyKhJKFgoaJgYCGd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTU9RWW2GkHeVi6OnqrS9uKWurKyoqbSrsLeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2rpIuWmIWmpqCil4GmmY2iqqikh4WTpKGgqqGkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlq4iaiZKKlnp7foR9ZmBoXGViXWNjXmZmXltPQ0lIVE9GSExGSkdFRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBlIWIgpyDkpCNktrInZZzVpeIj4icj3yGjI6KinqIgoeRjoOFgIuFhoeShoKEiYaIh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSU1VVV1VOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Ors8a2rbS/s7i+tr+0wba7u6S4xqm2yce1vrm0qKO0rbGxnJqSmp+Jp6+rpJV2n6SXoauxs5iWqq2orra7srqsr7Wisayxtby3ta61oKeoo6ibqbCtsrq4uKebt6mNpY6Rk6CHeYGCdFhhZFZlYWBiX2BlX1pVSkRFTFVRSEpKRElHRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoV+gI17v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhYGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY1MC82Q0hDUVxPUVVXVVxXUF9VSUtKQUA/R0tGRUQ7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczJtrzFvbS0wLe4wrW/sLh0srSmusWksMa5sbOxtKiktbaqsaCilpuikqWxrqWtrKekmKCss7qiqbK6tbu+zL/Fxb29s8K3uri/t7q3uaytsKaxqq2+sL27wsKsmbqolK6PmJiriX6BempXYmFYamRoZFZaY1lWVElHR0xRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFlVWndqcH+PhIGOhW56cnmIYrihmaOJlZOWk5OTjZCXkoeHe4aBjZWKgISAiXp8i4eGfIqDgYqDlX13eXVlT1xkR0VMOlFkYVteU0Y/O0hQRFpjUVFZWFlnWlRgYE1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tMU1pUXZOvuLW6ucnAu73JzLu9wLu3tby7t761urLGYHWzpbGanqu9qqWoq6qjorK1oaunnpWWn5igrqWnp6WepJSip7G0p7KyvLbBvdPJytPGwsXMwsrDwL69v7u8t7Swube3w7rGvcPJsJ65qqKsj6Wot4mBfnFfYWFcV2FfaGZSWGFWUlVJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBQUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1obGxxkI2FkHRtc3JziNXAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWi3+Df4J4eouDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1eb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZcWluSucC5vbfGwLu5ysu6trq2uLmzuLW0rra2mWR1qJ6tcF6irJyYoaObpJ6rpZSfn5CUjpaYl6ifpp+fmpmEpJ2spaqwrbewvbnU0c/Xz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/IzrSku7C1sJusub2af3lsXWBbWF1hWmNiUVtgU1FLQ0FFRkQ8QEU+QkhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkZRvbG91dYizrKGhn4uZnJmMjJWRm5KFiop+iIeMkIuJfIGEc3uJg4Z8iXSCioaVf3N7eGxtdXtocmVpbGlmamloYGZpaG1abXSXraS8iIdnW29oXVpZVEhKTlBKS1FMVFFJTEFKR0tQX19iZmlhmLfHsLmzu762ssTHtrC5sbC7rLOxp6q3rI22p56bp5pPm52MjqCWkaaYpZWKk5OJkImPkZGem6GYm5WXh56appusr6ivp7O01NTV1tLLz9PVztPPzcXCydC/ysnLydLIzc3C0NK4sMS8xLqmtrvEo4JuY1xcXVhgV1pmWlBcV05QQ0JIRUJJO0FEPkFIPz9CNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDk9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiDaHFveXmDoKqeppeNm5uXi42VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj31xeHVscXh+cXtteHNsaIBwbWNpbXB5aXd9fsu/wt+nbWN4bmNbYWBKUFJVTlleUF1dTlFOVFFVVFxubneCcpauuKy0p7C2q629wLGrtaaluKesrqGstKOOsa6amJiMkZSRhI6bgY2mkZyJg4uEiomEi4OUlZiXlJuRnJiZmZ6eq6ykp6GsrM7S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxsDOx8jDqb+40J55bmVdYlxWX1JdW05PU1BOSD5BRkFCRTxAQj5FRT4/Pzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd213cH1+gKGenqGLjZmTk4yLk4+WhHmFkJCNi4qIkYd/gntyfoCCh3qFdYWTkYl/b3ZzbHN8e3Z8c4F3cWqAcnJpb3F6eXJ7vsuafoyxg3ZyhHZoYWpdQ1paW1ZmZFhla1RYXVxgY11jeHt/i4GZqqSkoaChqaaqsbmqprSjoq2io62ip7GfiaaalJKRipKOiIKTiWuVoo2YhIGFfpGDg5OWrYuVjZWZjoWSkJ2Xp7ChoKGkpKjHzc/IwsvQ09HU0s7TzcbW0szU2NbW2NXX1cnU2s3J19bRyq3Ew8yKcm9iYF9YU1lSW09KR0lJSkA7OjtFQUQ8QkQ+SEI/QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeXKCiYGdlZ2UhYuWiY+KiI6Hj393hJSZi42IiIuJfoN4c3t9g4d3gHuHkZeBg253cG11f3Z4fXOFfHlsh3Z0b312hHV5e521jDxBisalfo18aWVWSUNlY2ZjaGpkb3lbX2Zoa25pboCDiZGLnZ6gnZCXmJ+jo6aypKSzoKKlnqGpoKKxnIaekpKSkIuOi4aDj4R+nJuMjYKEhXqUfoKplaOMkoqYkot9l4qakauzmJqbp5ynvcPGuLbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydra0ta/zMy0d3ZuZF1ZUlVQWVZFRkpJRUU9Ojc5QEFCOkhEQEVDQURBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgod8eIWWl4iPg4eGh3qEeXF6e4SGdXqFjo2deoxwfG9wen9yfIFxg4eAbo56dXd9fIJ1f3yHiLB0WKnCtoySgXBuYj1eaHJwcXBueHeCZWlvcnV4cnuLh46UkpuWoJaHjJOboJufqp+hrZyimpmfpZ6frJmLmoyRko2FfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yNlYyGe5uIk4+uqpSVl56Ypq62vaitvcbLyMnLy8/Jw9HK1NbY19jX1NvX09nb1s/b2tHWyNXLlXl6aGhbWVBTU11IQkVJST5BPj03Oj0/Oz5IPUBBQUFEQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTQyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDk5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfHyEl46Hi36Gh4B3gnlue3uGgXR6kp6NoXaPdYJ0dYF9dICEb4GQgW+ShHR8gYV6doZ7ibfGpMLJuIGWm494cGVOZmOBeoF3hqKQi3l5d3uDf3yEdm2UlpSVj5eQg4mPlpqXl6acmKCXn5OSl6OdmauWkZGLjZKDjIWJiIGFkJGenJmJhYuBhpd7iIifl5CJjYqLgnyhiZCLvKGYk5eZnKimpa6ep7W+wMC5x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bxoZ6eWZoZF9UV1ZVTUtETUM7PT08OTo8Pjk+QTY+P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXp+gpGJhIV6hYh7dX10bnx9hn50f5KekZ+DknyGfniOfXiKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLyMnKOcfYmEfYlzjIp+c6aanJmUhXuPkImEaEdxoaSdjIuQkoWIi5GSlY+dmpOVkZeNjJWfnZShlJKOjpCLfpCPjouEiZKWmp+fiYyUkp6Rgot/ppmIhY6ChoSApYaKjLiYnZGUlqGnoJ2enaOutrq1q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld4eXdqaWRWYFtTT05IRExCPT0+OTk6Ojk5PD02QD4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY+KcXJ4int7f31/fIh6fHuLh4J+dYOGeXN6c22BfoR9d4aboZuelJKAi4h/mIeAnJJuh6iFeqCLfJCOg4iEnH6akYqNo6KgkKSvn4uRi4WLgZKGV3Kti5+snI+DmJuQkI5cg6KRgoyfk5WMhoiMkpOMlJWUkIyPioiWm52PlZaRi5KUhoCLiZKNioqdlpmjo4aTnZahi4qIjpyQg4iPgIOHhaSGjJCzmJySlJehoZ6Zkpudp7G4rKW8wcfNx8bPzM/Mz9fP0dSu1tXY2tna2tfW2dqeb3x0Z2ZcXVhTVldDQElEPj8+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhtYn6Sg25td4t4eX56gX2GfHt2hoSAc3CFgnt2dnV0hIOFfX6SpqOepqKWiZ2QlJaLiqiXcoqyjYOmkYSZk4SZjKKWoJmTiZqdopKpr5+RlJCOjYiVi26Nt4SaxMiynaKlm5yYlpGykGOkzciVjoaHiZCSjo2TlIqFioqGlpqbj5CUk4eVmISAj4uZiI2QqpeXpKOImZ6Wm4mPh5eXi4WPjIF/ho+liY2TqJmXk5aYoZifmZOdm6KytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgnJ/aGJeXV1OSVRZQUJHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnaBjn18bX6IeHp+eoKCg352doCCfGxui396fHh4fISHin6Ko7Ono6qzoZann6WjlpWuooOQuJWSspmMoaGMpJuvo6SdmJCnlqeZrK+kl5SWlZCLmJmWoMCOo8m5q5ujpq2YkZudsp2FhaiinJiFiYmOlY2Lk4+IgYaHiZOYlYyLlJOHlJiGhJGQnHSRmLKWl6WhiJyak5CKkYqXm4mKlo6GfYyYnomQkJyamZOYl5+UoJ2Vnpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0NbY09DYu3J5dl1gVV9WT0hKTkRCQ0U1Pjo3Nzo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpJRU5FRDo2QUBCUz45RE8zMjM1NjU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUlmYDtIhIt6e26Fhnp8hHiBhYF+cHh8fn1vco16fYF8eIaLiYaEkqe7rKiyva+krbOzqKOisKyKmrSdorikla2kl6mtt6ako5+ZqZepo6+wqpmYnJSVkZegmJq7u67KoWq2uKuwlJifo6uTl76jXqqygomKjZSHkXyOjn2Dho6PlJWIh5OXjJCVjYuMl5iSnJm0l5WrnYuclJKOkJKMmZuKkZ6Qi4mVn6GNlI2YmZySm5ielKGglJycpa+ooaSzuKvCyMS1ur27xcfHwtGgxsnNzcTX1tHL1KFwemhcWlNeUU9FRD48Q0FBOD84NzU/Rjw8NTwzNTM0NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKQIuKf4Fzhod9goh1g4qCf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7TBvLStq7O2jKeyra29qpu7pKitubirpqahoqOjqK+ysaqdnKSYm5eXnqKmpZKkuq6pwLytrbK5paSnfoiGnK29sIOMjIuQg4+DkY96gYiQjY6ciIePl42LlZeUkJqXnaiasZqRrJyOmo+SjpWRkJaXjpGgkYmUm6OslJaPlJydk6Cdm5igoZSanqempKKksLOnwcbDr7C6tsXEwr7NpsfEx8O81dHNxMqIdHJhW1lfW01KQkxARkc+QT9COzo0PkE8PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0I1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUpITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZUdgaWdaXVyTjIyIe4eLhoOMdYaRioFvfnuBf3F+gXqVepKUlJiQk5Wns8bJv8LMwcO5x7y6r6u5u5eyt7qywK6lwKSrr7u8qq2ro6Oep6qutLCqm6Cqm6GblZ+wtKeLo7q6tsG8rKicsqWkqJSFjqrExKSCi4+HiISGlZSNeoONkY+RoYyMlJKOiJefl5OZlZimoK6djKqcjpaPkpGVlY2QlZGPoZSGl5+gsp6UmpSfoZikn5qgm6CUmJ6lo6ampK+upb/Ewq6ot7XJw762zrLEv8S8s9HJyMK1dHhsXFhbaVJMSERMS0tKQUE9Q0Q8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpOZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KBkHqNoZaompqYur3HyMnB0snKws28wbOtu76nusC+vMS3rMGprLO7vqqwqaSlo6yts622taCfrp6lopijs72pm6i9waO3t7CrkrCtq6yXh5qqp6WRgoyTpZWJgXaKknqFjZKQnp+Tj5SLj42Uo5mXnJWVo56pn5GlmoyPj4+Vloh8j5WSkqOalaCinLWmkJ6XpKOipZ6dppielZebpKOop6KyrKi8wMSvpbO3zMC5rsSzu77CuK3Cw8LAmW15YVhXW1tLS01KRkRESUJCQURMOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iaCThHiFf5V/f5CIipCAlqGZrqajmMK+x8PHxdPNzs3LvMK3sLm8tLzLvMPBtba7rbO/ubyur6igqKe2ra2psreanqyip6Gdq7e4qaSwv8Sxvrmzp6q1s62ul5alrKigkY6SscWnlY59kZV9iJGZkKqZmJOTj5OVk6Wek52ZlKGjopyYn5iLjI+PnohakJaXkpakmWWYo56ypZailqysqqebnqaXmJaYlaCjqKWftqupubzDtaaztcvAuKq2rLK6uK6ouLq9uIJrblpXVFRORkpTTks/QkhEREhHRzk1Rk07Pjc9QEouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJxRmlJUmViTEallJyWoZeplo2Rg4emk4iCh4KchIOVkJCTjpqin6++rqHGvMXExsbOzs7Syr67trG6u7y/z7bEvbi4t7KxtbO4s6umnKuruKqop6+wl6OupKekpLXAsKustL/DusC6s6e5tbiyrpWlra+vpYuTlaGNdMGafpeZhY+WmoyxlZqalZOTmZmlo5Wfm5aaqZ2coaCZioyPlp1gSpacmpWapZZUlrCfr5yfpZSvrqulmqCllJOYmI6cn6aimbSpqrO8vLyqsLLHwLilq6utsbGjobKytKRwbWZcWk5QS0VQUFBRO0hKSUdJQ0M+OktVP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLp5aOiZOFn4eEnZeOnaGao6S1yLSpxrrCw8fKyMjMzca+u7OuubjBwc21x7rBuLW6sK+vs7Smo5uqtLSqqKaurJqkraWkp6y6v6irtre+wb++ubOyxLG5vayjrrWsuqaInJimm3a/oIWZnY6TmZqLr5ehnJyXlZufoameqKCamqqZoaeemJCNkZ2DbnaSopqVnaKekK6yoquVqKqXqq2jo5+lqJKSmZyIlJyinpexp6mrura+s7Ktvrm3oKOnqKWnnJytqamMYmVgX1FLTUdITklVTD1NRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauVnKGfu6+ZlJ+Lk6ubkZKTiauNh6KfjKStlKOjtsa9tMG6wsLHyMXCzcjBvbmyr7m0wMLKtcWxwby0uqqora2woqOYqrS7pqmmq6qdqK+no6qqvrynrby0uL3HvLe1t8GxvcCzqbW3q7+lj6OYkaKgvJ+JmqCZl56ej7efqZylo5ucoZqopbOhm56mnKiqnpmVj5Sbi5eJjKWilJ2inqC0r6Wlk7CrmaurnZ2ko6iRlZWgg4+enpuVqaShobS0urWtqLWys56coqWal5WZqqGed2BcX11KSEZHTVFJTUVGR0JSTEpCRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Wnl6SfnsOtm5elmJmpnJaamo+qlpWnppWtrZmhq7bEwru+t8HCwMfEvs3Gu725sq+4s7/CyLW/r7u2uLampKqrraCgmquqxKKlqKumnquvrKKpqL+3pq2+sbi2x7a1ubi/sr/Bt7WztK++o5ejlpSclK6gkaKipaOjn5C9pKmdqKudnaCbpp+9opijn6Kpq6Gdl42VnpOeh4+FjZOepKGdtaymnJayp5mvp5+aqZ6gjZmVn4SNoJqbk6WkmpirsbWxqqWqraycmKCgko6QlqielGhiWWFdT0lHSk5MSEVESUE9UElBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQzxDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTpuUkY8S3hlYldMopqjnJ7FrKGfrJ6drqCTo5+WpaCmqauXt7GjqrO1xMS9v7a/wrvIwr7KyLa4tbWws7O3wca2vrC4tLi1n6asqqydnZ6lpMGloKqtn6Spra+ipqe9taWxvLm3tsOys7e5v7LEwLi4rrO1taOdpZWSlKGuoJminamoq6Oawq2pnqytm5uemaahvaKdpZirq6ymoZmNmZ+Sn4mPV3+Wn6ahoLiqp5OYtaOfsqGgm66Wno6ZlJ2Cjp+XlY6ipJWQpq6yq6mhoqWllZWdmIuPkZOknolhZFljYExISkpORkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckhFNj11ZVxLTp6foZmew6ilorSinLKok6ukoKSframsnbyxqKy1scjFwcKzwsO8xsO8xMq8r7C2rbC0r7/EtLmxsLm0rJmosKmpmp2loafCrZussZuqoq6wqaSnvbamt7u9r7fDrbOywsCyx7O6t6y0tq2qoqaWlpWkrKKfn5qoq7Cvr7uypqCpqJmZmJOipLigoaSTr6+spaefkqGelZ6PkI2VnZqjn6ezpqaNmLSbo66anputkJ6Tl5SagJKhlo6Nn6GTi6assKWmoZygnpKSmpOFi5KNnJ5/YWVbZ2VKSUxKUkJDQElHOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo5+coMOopKqyoaO0qpWzrKeipLKsrqm7sqywtLTGwMTDtcDEvcnEtcDIwbSrtaivuKy/xLS3rqy2uaWZq7Grqpefppetu7SbqLCbrZ+utLKnqrmyp7qzt7K5wKq3scO9tManvq+tt7WqqKyhl5eSpqWio5iYpa+4rrK1tqCfqKSZlZWTpKC3o6Smlq6ysqerpqGem5qblpion6CYop6vsqKmjZeumaWrl5mepJGbjZOXmoWWn5SMj5yelIupqaqhp6CZnpWMjpmQgYWViZSfeGNoXWtqTVBNTlQ9Q0FOQzo6SUA3N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKOdoaa/pqivr6GptKudubCro6q0trGwubewt7i4xL3Dx728xMHGwLjAxsC6qbakrLuswMK3t6mssbqila2wrbKWpaeRqrmpoKewnaqgr7Szqqm2tq27rLOzuresuLDDur6/psOrsLevqaurp56YmauioqCRmKGxr7OrsLmanKmgmZaSl6aht6mlo6KwsbSrsqirn5ugoJuepZ2il52js7Can5CTpZqgqJqUop6VmImUmJOWl52UiJCbmZSOqKimn6Obl5uTh46Zi32MloWPm2pobGFsbldQUVpUQUNFVEA7O0lBNzpYUGReUFZXRFleXU1MUk5eS0o+WmNeTkhQTltVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGrsKujsbippbWzrKCttbyus7i8ur22tsDCv8jEucTBwMC4xL3At6+2p6u3sbu+v7SprrG2nperraitl6eojqe7n6Sts56rorGws6yptrS1va2vsbWssLSxwbrFt6u8r7G4rK2qo7Gmn6WqoKSXkJmgs6qzqqqzmp2nm5qVjqCmpLSup6Ksra6xp7OtsqqknJ+opJ6VoZmbqLWpl5mSkp+ZnqCekKuel5eFlZeLnZmclIqNlpeal6aloqCdlpWXk4CPlIV7jpKDjJZlbHJncHFfRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0dERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19hVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqCkrLakramlr662qq+1uqemsLfFt7G3vsHCtLS6xb7MxbnCwLm+ucO3wLmytayqura6ub60qq2xtZiYp6yqq5urq46rvZ2rrrGjq6CwrbOurrayubeqrq6yqLWvs7u9yrKqtrWxtK+up6GzoJuoraCllZabmrKjraCmr5ehpJqako6jpaezqaGmsqyqtqWusbWvpJmdraeamJ+Zmay4o5eTkI+YnKGYl5Srn5uSgJOYjJ2cmZaRipSTnpqloqGgmJaRk5V6i4+Fe4yKg4uSa254bXV7YEVhallJSFlaPXtKRkQ2QWJUaVtNXGBKXF1aUlNSYmFMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVEtEmZegsaixqq2mpK+utam3tLmkrLO3yrq0urq/vrSzt8PAzMi8w7y2vb+/t7+8sb2up7q4t7bCtqutsbeUl6auq6ejsKqUr7ukrLGyp6ijsbSwsbG1sbizqa6rsqe3r7W0w8W2qbW2rLCtqaejtp+gp7GgpJScmpWxnqecoKqOqaOem5aYpqaluKeisbSsp7KnrbC2rKSZoKyom5ydm5SquJyUjo6LmZyil5CYpaGdlIKSlo+cnJiWlYiXkJeap5yjoJKWkJCVdoSQh3uFgYSMi21xd3V7flxLZWxcS05jXD5ie0dJOEdnV2ZbTF5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktJV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi49RUxRPDNya0pDQ5GZpa6lra6rp6WxsrOqt7G3oKu1ucm4rsG7wreysbXCws7FwMG9tLy/v7q/vLLEqKm4sLa2v7yuq7OynJ+nsa2mpa+lnbK1rKuxsa2pqLS6rLSytay0raqsqKypuK2xsMe/uKW5sKmtraWorbCmpKSvpKmcnpybr5mjo6Kjkayeo6CgoqqmprmlrLW1pKqrqKyvtq6jnaOpqpugmpqSpLSaj4mNh5GioJWNlJ2gk5GEjpOSnZqYlZSHl5OVmaebn56MkpGOkHd+jYV9fHyHiolxdHJ+fX1cU2RvXk5ZZlxGRJZbRztObVhiW01gYk5WV1ZXVFhnXlFSTGNaW1RLR09UU05HSVdTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorOkk/M0JJUyw+j2s8R0iPnKqroqmxpKmls7SxtLWysqGrrbzMuq7Au8extKy0wsLRxca+wLK9wMK8v7e8xKest6yzuLvAsKuxraCjp62qqKSwo6qxqq+ssK+wr6uzu6e2sbKpsqmrpqWjrbqsqrHCubWsuqipqK2qqLGlqqSjrqqoop+co6yVpZ6YnpmsnaKnqaKspqOtrLixsqCpoqCrr7GsnZ+nqKmZo5iZj6CnmIaEj4qLnqCPi4yWnI+OhoeQlJ+dlpiVhpaTk5ekm5yci5KQjYl+foeFfHd+h4WGdHNxiHVrX1lgbmNRc3FcSzuEfEY+V3RYYFpOY1tOVVZVV1FcYl5TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJRaPkxFlZitqKGqs5yqqrC2rbi1rqulqqq9ybyxvbfCr7Gss8TDzs7Dvr+zwMLDusCzyMSsrretsrjAvrOtrqukp6qwqaeosaa0rqqwrq2xsLSttLukuLOsrK6nq6Cinq+3qqqturaltrWjqqesrKqtoamnprKypKamoaGslqqhlZqgpp6koqqlraKfp7G3ra6jpaKbqqutqZyhpaSkmKCalo+YnZOCg5CJhZygjIqOjJmOkIuDjJejm5KQm4yTkpGUopmbmYqOi4p8hoCBg3p0gIOBfnR3jKOIeGpeYG5nV2WHY04/Z5NMRWJ5V2JYUmVUTVZVVVRPXF1hVUtNaVdVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGPkhGRJeSsKWjqrGYq6qttau2saulrKqpvMDAuLizu7WlsrDEycvRv8G7uL+/wbnBusHErrG1sbO6wL6zsa6tq6uotqqmrq+qubCosbGvsq22qre2p7S3rKykqauco56zs6iopLS0oLatoKmoq6mrp6CrrKm5tqmqqqqiqaCsnJKpoZ2gpKKmo6qenKe1rqimqqKjmKWmp6qcoqSjn5mZoJGOj5mOf4eMh4WenoeEioqOjZCNg4aUopqOjJqRkpGPkp+WmJaLioN/dIaBf395dIN/enh/gYidj29xZ2dxeFxgc4hrT16ZVkhteFVkVlFiUE1VVFVQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KajZPRDuWjrChpquumqylra6ztK+rpbCqqbq+u8CwrritobavycfI0cC+vLq8wr26w8G/v66ysrG1vLvCsbGzq7OopLWppa2zsrmwo663sq+yuau5r6mttqyqnqmsn6Kgta2ooZ+vsqK0qp6op6qjq6GirK2ova+srq2iqKigrJmQr6GYoqCop56om5mqsKmjn62ioZOio6OnmJqppZiXmZ2PioeViH2NhoSDo5eFgoKLho6NkYSEk6CWh5CckJOQjZGclJePioaFeHSBf3x1eHmAe3RzemmBhqN1aV5la4F1ZoiLfVJYcF1KeHNTZFNRXk1NUllmTkxWWWRYRlNpUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsL0tnOjQ4Xz1hZD9GMUNQW1srSE45VUE0kY+yoKSmrKSnpKymtLKxqqSxqKq4vsG7r6e5qqausMnHyNHDvL++uL6/vMm8wbiwsLWxuru4wLKzu624raK0p6essra5s6iovLWttbywvaasrLWrrZypr6OfpKuqp5yeqrKks6iaqqeppKmeo6mnqb2rtK+unamkoK6cm7KjlaScpaWfpJuaqaulnpuqoZuSm6GlnZiXqaiSmJqTkIqCj4V+j4J/h52Phn9+jIeQjpCEf5Obk4WToYyUkouRmpGVhol+f3J7eX18aHd8enVwcH1ohXiEiGRhaGNyhXlsZnhdXVVBVnptVGFQUlhLS05xdV1IWltnWUVVZlBEPkpORENBOUhHS1M/amFKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLS9GakkxNFg9ZmNCSjdHU2BVKj07RFg/Ko+UsZmfoKmlpKGrpLeysqapsaesuMG9tbCjuayoqLHDycnNwba9v7W3v7nItsO1tLK1sb24ur62rbm2v62hs6eqq7C1uLWrn728qbK/s7ugr7O1qayfrrCjnKSoqqKenKSwprCgn6upqKKqnKSooK27p66wrqCro6Sunp6tppefm6GjnJ+cmqOqo5qapKSVl5Sfopabl6ari56RkJGMgoqBgI+Ae5mUjYl8f4uGj46MioSSmJGGlKOJkpKHkJmPk4CIfHlsfXZ4eGN7enFwcXJ4aIB0aoNnZGhhbnONbGFpb19vP1t4bFVeT1FRSkpNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhZMTNTPWVfREw2S1dlTyo8M09ZPSOTmayZn5inpKKfp6O4r66jr7Cqq7jCurOtn7ivq6i0u8jLyL+3wr6vtL23xLfDsa+6srPAtbu+t6m5uL2rpLSoqaqwrrmxqpu7vaSwv7W1oa62taanp7GzoJ6kpqehpZmfrKipnqCqr6ehp5ikqKCwuJ+ksa+gq6GspJymp6mampyfo5WdnZqeqaaXm5+okpiTmJ6TmZahqZCaiY6Qh32Hf4KOfXygjIyIeIOLhYmMjIWIkpqOiZWeiJCUgouWjJF8hXtzcH1xc3RgeXhpb3Fwb2l+cWN6bGllY2BmhX5fWnNqcUtMfmhYWk1QTEpIUFJQSU5cX25TRFhbUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1MjxmZDI0TT9lXUZPPVJaaEgqPi9ZWDUol52mmZ2WraCgoaSht6uxpLO0qqi5xbWyrqC3rK6tsLXGyMG3v8G5sLS8t7+7v6+rvbC0v7G9w7mpu7q3p6i1qKirsK2zsKeavrelrby1r56wt7CopaewspugpKCkpKGXnK+moZ6ip6+ioKKTpKSjt7ChprGrnqyjr5icqqWpnpibnqWTm52anaaqmpycpZaVl5WdjpSXo6ihkImKkIZ6hX6EinqOl4qNhniBh4SIi46FjZOYjY6WmIqOlX6Gl4uPeYB7cHJ3b290X3l3ZGxsa2log21lcmprZWhcY3N/X1psdmlaSH1dW1hPT0pISFJVRjI5Xl5sUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdBZltIVERVXWhFLjsyYFQsMpajoZeVnKmdpaGioLeqr6C6uaasvcWzsK6ita+srq+0xMS9s7+6t7Czubi6uLqursCztLivv8G4rL26taais6uoqbOrrrKjnMK2pqm2tKmesruppqapsKyZoqecpKaUmKGypZmepKmpnKKgk6WgpLmopKeup52loaiTn6mioaCZm52gkpucl6Ciq5ubmaGVkpWWmo2Uk6OnpI+Iio+GeYR8hYV8nI2JioZ4gIOHiIiRhZWTkoyQlZSNjZN7g5eOind+e2x0cmxsc2F4dWhoamdlb4RnaGhkZmlqYGhiaWZaZXpjYVJzVFtbU0xJR0lPU0AhKWleakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OGNOJzKepKOSjqSmnJ6enaO1raequreorMPBt7CsorStp6+vt8DAvbHBt7Gusre2uLe2rKq9s6+ysb3At668vLGln7aspqW0qauuoJ/DrKmmsLOrrLS6naiqq7GlmJ2qnqelkZmmraKZnqSpoZuinZegnae2pa+qrqGhnp2hlaCmn6KgmZyanJKanpWmnq2jmJeelZSOlJiMj5iaqKCRiImKiHmFd4KCgpyHi4KJe36EiIaFkISWlY+Pj5GRkYySe4OVjYZzfn1meG9ramxndXNrY2dkY3R/YmRlZmVpamNpcFleWF1sZGFNaFdaYFZJR0hLTVJYPjlfbGlHQlVTXFtJSUdGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE7M0FlSCU1m6SgkYyuoJmYoJaltLGisb63obHGvLmwsaO2q6uuqbm9vLutwLKvrq22r7O4s6irubKvrbS2u7avuL2tpp61q6ChsaWrr5+lw6Cyo66xr7ettZ2tr6yuo5mcp6qln5WbqKWfmaWjqZ2aoJyUm52tsKa5qK6jopqanpmeo5qknZeemJuUmqGSqJWsqZuUnJySjJWZjpSUmamnjY2KiY97gnSCgYqYhYd8iYiEhIqMiJKFk5ySko+QkZaOkH+AjY2Cb4F/ZnltaGtqZ3Fya1xoZGJygGBkZ2ptbGdqaGZsXGxtdXFhVGJoY2VZSUZMTU9YUVBVYWWBVEBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFJZUMnNJOim4+OsZ2bk6GaqbKwn7jAtqG0wry9ubGltq+prqW3ube4rLuvraqrt6q0ua6ls7ayr6mxtraxsrW6qKmftqmen6qiqq2cqsGZrqSusLa1rKyesa2vqqObnKOsqJyVnKejnZqpo6WWmqCdkZujq6qpu5+npKCYmpqeoY9ropaYnHGClpykgHaRq6ielpagkYmXmYCXi6CPeYaTjINtaX53g3BshoqGfYSLhm9eY2BnhJeGa4uQlJJ1d4uEfoOPf2aHgGh1aWZXXGlzbk5QamRmcYNmXmRmbmxpXl5fiZCFh2hPS0Q4RVRnXkpHUFBVVUtHU2BvdGVFW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE2T2tbTlxLW2ZiPkcxUGQ9Ky+NpJmHlbGbnJOgm6qtq6O9xa+pt8O4vbytp7awpqukuLSys7G5raqnrbSmsLWjqLi3tqmnrLazrrSts6Kpn7SrnqKknKeomq28laelr7O3ra2kqK6qq6ahnpygqKecl6GmpZubp6edk5+gmZCep6qjtbCjo6OdlpiYl6OIoY+Smoehh5SeoX+lf6ernpOTnJOJhHJ4jI6EiKF2iIxpl4hmfXN4oG+Ih4R+jXx/oaCfmX97iJ50iI52m4psh4GDbWhlY3pscWJUhm1jbWmYcVhqcG6GV15pW2tqW4hwbXlyh2mHhFpeRk4+Rl5NRVJWV1FRUldUZ15MWUtSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVZhNy8ojKaXhJyrnJmZnZ+rqqiqv8Ovsrq9t8C+qqS3r6qsprO1rq+ztquppbGtpbWznK21t7Wmp6izsa2yqK+fqqGzqaCkpJqipJ2vtpWkpqa2vKasp6mqrKemoqCZn6ajmZmmo6SYnKSplpSinJSToqWmobekpKCkmJWTmJSciK6QmJSJqYuXo5yFsYCkrZ6Ump6VeYLUqH+HlMGbx3l4saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJaxq7B5aGtYsa5vZWm8krxuaHptco/YflNqY7ayf4BxlHWaoaqQV09XYU9WTkZUW1hRUFOLXFdbUEBcRVFOREdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY6mk4GmqZ6XnZ2lrbKpscK9srXAtbe+wqums6ysqaivtKqvtrOop6a1pqe4rp2zsrarpqSnsq6tsaaqnqeksqSiop+XnKCfsK2VnqOftLmiqaihra6kop6bmqGon5ibqKGfmJ6np5Gcp5uUnaGmoqCwo5+go5aWkpiSmYWwa2qKjap+Z4SWh61lcZ6dlZqmlXGuoaR+d7t8a6GPdrFfarRbpYBlnJFgZoF6Zn9qeGqpZb5yZ6aMdrFqfLF4dJKTY21tp25bhKBFaWeHlkV1nGB+Z3ujp4JZX4uraYCUeHpqpzdKr1tXVGxjW0tOV19cV1Y7TohPV1YvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuSopWCrKaln6OkqrG3rbS9vrC3xbK4usKnqa+rrqmpsa6ksLqwpKSus6Opuames7OxpKWgqq2wrK+mqJ+jorGdpJ2YlZibna6nl5uhn7Syoaqboa2toJ6al6CiqZ2ZnqShnJmhp6SQnaOal6Cfq56mp6CboKGWlZGWkZqGtZu1eIWpmbWZd4ezm7d/k5aXqZV+a4GmeoGFiJKUknerZ2qxW6x7joeUdIlwj4aAf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLTqRYSGNjmX5jaKZgeXJ1UpOGXlCpbWNxfYaAYp0uUaJuW1RrZ2BMS1xkWFxaQj6weFdYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOWFVNTAclp+UiLOmpqKuqaezrKq7tsKwvMKtuLfBqqytrq6mrrKpoa+8qqGnta2jq7WkpbOzp6OinaeqsqiwqKWeoJ+vlp+ZlZaXmJ+uo5qapKi0rqGpj6moqZuelZigpaman52jn5ygoqWjlZuemJqdoqqcpZqbm6Kgl5ORk5Odg9WTmblwsMJ+xoZ81pSbu3yalqWQjZuMpHqNh6OCpYJ6rHmPnVWve4l+n2q5Wrl3hoN9poKTfJh6qnmNnY97sW6OhHSQu4VvlE+vp8WKUaB6Y2CqYnNyh2yXh19TtbTIhoCJfGOkM0Kddl1RamhkUEBYZlpkYUpITWxLWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUTgyJZyhk5ixqKils6qltKilvLfBsLrAsbW1vLO2p7Gxo7Gzpp+vtqibqLquoq+xoLO0sKCknp6nqbCptKmlnJ2eq5eZl5eXlpeiq56al6itsKijn46soqeWnpecoaaimKKhoqGaoqKnm56gnpWZmqagnKeVm5ufoZmQkpWRnYiybmi1cauIcI6mcrRzcrZ7mpikjY+bjaJ+kKClfrB2g5HS0XVbrnyGf6Rvm6qma4aFfa19l5mPe7Fzk52OeLNllnSFnm6eZpRSyItawlyfeWJfrWB3c4Zil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2pfbGlQVUZJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi+inZGkr6ykqrutprSlqLa7vLK7v7e2tLu7s6W1tKKysqOgrLCkmKa6rqSxsJy0uKmgpp2hqqWyqKyqpZqdmqmelpWYmZOTo6mgl5Omq7ClopaSrJ+lkpShnKWnoJWbpqehmqOfrZqgnp6QlpuinpyllJyWmqKflZiWkpuFrHt3qHajj4qHqW+tioOog5mZooqSmYuifpKYia6Ff4KzXHKzUq5+g4Kkf3HXfXeEfo+dhpmad6+GipGch3e0YZplmoKBlWySWrBYS5p1mHlmYK1ed3eHZ5iIal2vd5Wej3hsNXnIrrJfQlRvXmhgRVBsX3BtVlVNL2VjaVNZUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjg4n52UoLiwmLTBraiyp6qyuri0uL+6uLO2vbWluLSgta2foKmrn5WntqyosLGrrbSkm6mgoKiitaemqqOZnpWloZSUnJmTlqOmm5OQp6yvpaGVmKmfoo+RopqppqGVmqapnp2knqydoJ2gjZSem56gmJiblpeioJSYkaedhql9faV5oY+Pg6pwrYyCp4aWoKGKl5eIo4GQh5SqfICLnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRsklyrW1qTf5F/aGeqZHN7gWuYh3FdrFqJoI5rbmVPSkOhXFpNdF1jZk1aYV9zdF9KVTVKmpJZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE+OKGcmZm+rJi0wq6rrammtLC4sbW/urqzsbe8qru1oLGlnqWnp56TqrGpr6q1rKquoZihoKakpLqio6uhl5yRoqCVlJ+alJmfoJCNjKmwr6adl5qnpp+NkqSYqKuolJeqqJ+foKOto6CdoY2UoZifoJKcl5yVnqGVl4+rm4+ubXK0dKmMd4qmc7R5dLOAkqSjkpyMiaSHjna4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSapdcrWBNoXyHkVJzo2x5f35umIZvXK9WPJx3ZlRvbi5bp09iU2tlYm1ZYlxgcXxjU1lQPj5tbzNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7PDAwMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjgxQjmkmpudu6KcssCuraurp7epuK+1wLW8sa+5uKvBt6qroZynpKKdkquqp7WjsqiuqqGXnKigpKu5naOtnJaZj6Wjlo2doZyZnZ+Rk5Wrtq+nmZSbrKmXjJOmmqWto5GXq7KjoJ6oq7CZoKKPmKKXn5uWm5ehk52pnJSRq5mH1JKau3SxxIDDhn3Vlpy4eIiRl4yXiYynh3mjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbpqIcG2NpHS9XXd9W2F5vGpbVltpeV5pYGRmYm14b1lbWUNBQHI/Q0YrNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuOTctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0A5p5qeoryil7HDsK2pqqyxp7ivtsSxu7Kuu7CuwbKspaOepKGcm5GqpKqypLWnraSflpqqmaasuZ2jrpmVoZCloJONnKOemJ6akJaSr7mwq5WXo6inlJGWpZ2krZ6RoKiroJygqaSynqOljqailaGZnJeVpJiPsKCSlaqehZCZtYCRkY24lXiCk5u1d25sbnNueY+EjolznsG7vJp7gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1erOjdHaXdXSwdZieZoZpjbZ0cnB3toxegHp9iWeDeW15YouscHWFf1hbp2pEZVpUZmBjXWJRZ2ZxbXVCTVBMRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz43MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlY4Kk9dXT0rO1ZWJz07PKeeoaG/pZazw7Ssqqesq6m7rrDGr7W0r7intbitqaOipp+gnZmUrKStqqa1qKifm5ago56spL6moaqYlZyRopuSj6GoopOdl5KYlLK1tq2YnqSkoouSkqacpauclqmlpp2boqmmpqOpoZKtn5ejnpeXmJ6ej7CplJynoo5qfmmcp3iJc36ajnV6ZYd7vb7Aum6Sg3GUhl9yalpemolhZIeOlWtggJVjbZx2YpRrf5qVlGVeYGNxm4pocox9hpVnan5xdHl9fGJbd3SBaFBcboR9e4tqWGx5gnJJSm+FcE10TUVXXWZhTFtYZ2NeT1ttdmpyUk9ERU47SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUtPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0lSX0knU2BWNClQXkwoMz5bTyc/Mj6ooKihwaOatLq2o6ylrqeotbKsyKyws6y1o76xsqago6mdo5uamaynrqSltaqlm5iVopumram/qKmmlpSblaCak5ilqaeRnpCPmJywsr+sm6eep6KJk5Gqm6ikm5usoKOam6OnrKKfqqKasJuVpp+WlJ2fnZewpZmiqJmckZ6co6SZp6OanJqbmpCWgmhufHF2kZeUkYSJtKmNhpiVjoqMl5eHlJWKg5KTkYmNkZSZk5iXmqCim5uUoJ2OgnqkhWtqfJB8gHSJioFxgnh5dnaKgHuJanOBdIN1ZHd9dmtwem1gY1xwaE1ZWWVqX1dZcHpubmZTT0ZTOU9aTlJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeUzEwVF46Kz04XUssPC1AsqCzob+ipLGyt6CppbKnpbC1qsmrrbGmtabAqLSgnqWlnKSWlaCrp6yjo7esoJmWlqCXraqmwZ+spJaSnJeemJOUop+eoqeSkZmop7LDr5qrnauej5aWqZ6rnJ2grZihm52ipa+moaSon62Yl6admpqgnp6csKCdoqeWmJOZlKCilqOfl6COlpSLio2Ol62Pe5WbgpKBiamohYGYloqEjp+Ie4SQhoWZkIeGiZWOm5eNkJieo5aak5GdjX6NZqKzroWJhHZ6j4p9dnl6b2d5kIGAiWt1gXmIcmh0f3l1g4iCa3RjeWZgaWRjZGZqWGt7cGpqXFJMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15dXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXVEwNU1bMTdFNFxHNTwsQLOgua++rauusrKgqqayraKss7DFsKqso7OvvaS0nKCnoqGdmZeopqmmpKaztZ6VlJ6Zma+mrr6gq6ORkZ6amZSRlaGcl6mdhZ6prKKzyLSgqqSrlpaYmqeeqZygpKuUnp+eoKquqaajq6Ktm5+goZqlnpyfna+kmZ+ok5iXnZKlmpipnpqXZoOSfGV+jpqPY3iNbGhrepCjq2tlmph+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKOfmHNsbnqEjYZ5WGVdhYFea4qKgXZbaHN3d5GAh4JueIJ4gHNteYRzdoiJj4N7aoVYXmt0ZF1ziGlrfHFsY11RTldJZFhASjQ+Rjc/RkQ3MTw9P0FDOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kvN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+rs7CrpaitrrCmrq6wvbGpqKStsLGfrZegpJ6hmpmmq5yso6aoqbOunpWjkKKvpra5pa6jj46aoZmTkpqgmZmllnulrKKos8O4paKnr5+elZ6jn6ScpKqokp6hnqCqr6qro6qgqJumn6ihrJWhm6WwpJicq5ahnpuTpZieq5mefr6DiHK0coWehq1oeLnEuHGSoaN7ppiZc6qCfMvAwLtxi6KHg598lZiInsC9gpadno2dwcF7gXqRjJrCv31rpbFvjIFvynp/m3iRg46AdnmBf3lxen+Hb3eFjJN5bXaSYmZfeGNfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19eXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqZSjr6mwr62msrWvq6amprGrn6uYm6KgnJuqp6Kdq6KlqaWktKSdo5Omrqy4tKevopKRmZ2lkpGgoZecn52Hpqukq62/wLGhqq+ql5KfnqKZoqSqo5OgoZ6dra6prKajo6agpaWdrqmRpJupraqcnaqcrKKWmKWWoaOYnH/OlHl6pYJ5lZabX62PXo6ngKGgfKeVm3Srg4CvXmSNqXqnh4WgdJeSiLNjgquGoY6Ns2qErnR8loe4YYKtWaPNbo91e9t7f5lxfoiSdX9le4d2dmt9iG59hZCSfm2BjmBxa3BmYF94ZFtxaGpjZmBSVFJXXUpPQzVBSEVEOD42O0A/QTs9OEA+Pj9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCstLUowJztcOkwtIVBARjQuMa3CwMC1tLC3mJ6RpKqprbSqpbKsrKykrKawqqCnm5qmmJyisJ+gn6ino6ahn7Csm56Wpq6tsauorKCUkpugpZOPnqWXnqijnq6kq7Cov8azqKmxrpaTnZ2il6Cpqp+VoZ6dna6vp6qpm6emo6Grkq2zlqajq6qeo6emobChkpqnmqGblJSRl6BwhYyXdYSoh3GwfJ1yrH6hn4Glj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKKMkYudfqt7iJOPoIB6rVacxHqPb5LBfYGVbXVwjG1mdmWGb2F3bnJviYqRkINtkY9lb3N1b2BmbWRfbmlpbmZjV1RcYVpSUkM4SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc+V0otPSc+MSkzVkBGIRxHOkMxLiuv1MbHsrSfnaOOo6Oira62rqixp6mqqK6rq6eio52ZopWfpqufoqWfqKiin56wrJiblqinr62op6mel5WapKKSlKGtm52mo66so6y1qbnNsq2mrqyXlZydopmfrqydlqGZnp+psampqZurqaOiq5uvsaKorK6mmaarqqqxo5OXo6WalJKFpGqkdYl6qXR6snGCpYmZjHCIoJqHpF9gUquEf66Cm3WugqeGhp96mJaFe2aAo4mkmYaBo32pfoCUh65efKhVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2MmI+BbZqSb254d3dubGZlZHFwZntpY1xXX2lYWFRMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5hYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNjYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C1sK6prKOopqqrq6mkpqCbpZ+dpaemo5ysmqKroaSfr6Kem5OqpLawrqCpm52WlaekkZuhqJ+gppywpqOosay2yLK1qqyqlZKdnaKZn6WznZqhlJyfpquro66arKiioaqis62iqrOyopuqqK+vtqOTlqSnmJuRfKpsnoSHdat5fLBugqSLiaCWlZ+VgdK4tLjJgIGyXl+UqYOkh4egepiVmXiqyXOZo5WoqZCSm4x+m4maxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SPkJ6Se3CXkn5wenR8em1cZmpycWaBaV5hWGNtXF5ZSU1NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTRPVFEdHDs8RjIsJKikwca5raiyrqylop2yuayqoaWbqKaqrKmnoKalmKqjn66rnaagrJqfqaWdp7WfopeTqKu2sqybppyglpGmrZGZnKejoKqnrqGipqmwtMKys6qtqJSJmJ2lm6Kjr6WXoZWZnKWlq5qvna2opp6so7esobG5sJ2br6eztLOllZiopJugjoKdTniagX+feoSjfIKkhIamnpyek4S4fHx5uYJ+zMXCtniaoJCLn36alpeKdZ6XiqSZpKh+sIWchJ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpGjlnt9kpGJdXlyhH5wW2xud3JqgW5aY19obmJkXUtMUVRBSEdGSTo5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTI6UFtUHBs2P0gsLSCMh5mprKSruauvoJuhrLO0pp+glaWurq6ppp2mppqjp6GyrqGpprKgmaiklKK1oqOVl6Gptbmkm6Oeo5OQorGZnpynpqGir66co6eitbHDsa2qraqRh5Gcp52jpJ2ll56YmZmlo6iarqGtpaaYr6W8raK3t66dnrWyubKzp5mesKKknoaP0bXDt3mHjoWRk4+ApniUoneMoJKEpYKLcauGhLRucmmZo5yViZ98mJmGh49yroKlm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+Tpph9i4ySi3h8eI2BbGh3aXhzbn90XGRkbm1laGBKWldYPEdHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklknOMiq6/v7u7tZ6XqKSttqGimZWjqaeuqauZpaGfpaCgtaeiqaewo5Sro46kraOdkJqaqrS0pJ2mnamSlZeuoKCep6Scp5y1mZ+po7arwrCpq6mijYSPnKKhpqOWmZqcmJuYpaSmmKunraKlm62nvqyVvrCtn6Ows7qstKebqbKlqJh6qJB9fLB3ioGkpYicbbJvoYetfKGPg6iWmYCsiYSuhZ+UqKCiloWfgJmVgHuSfauAnZqWiqp4naCPiZOSgHmvXaOBfKanZJ2AfJd0a65dpWtxhZldYFuMoG6VkaeZgpSNlot6eYGWf2psfmJ9dG5/eWBmZXFvaGdoQ1lgWz1KUzJVOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTcwNTIuKixBVFZWVlVUVVVVVVRUVVRTVFdXV1hWVVVRSEZJSiMoKLySmoSpxsO2wbSfm62grrilpI6bpKOgr6+qn6Oena2Ynrmgoqugr6qaraGQqqmklomakK6xrKafqJutmJiPraKhnqWimqWcrZifqKa2qL+vpamkn4yAjpuaoKaekpSZmpSamqWjo5moq6ujpJ+pqL6kl8OsqqOirLO6rK+nobSwqauZdq9+kIuchYd9uq2KmGSwjGWVrX2gj4OmlZqBrIqEsIWlmaShopCEoFtsaoGzYH+te3uCgbFsZ26Zl4yIsVt9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46omoqXkJWWeniNnH1kc31hg3hzgHxhaWZwbWZlZU9VY1tBVF49SSg+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXV1hXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5ytpqW2qKGLmaCfnbOzqZ6in520mKCzqKqrnrCtnqubla6poo6Im46vrKimo6iZrpOZj6maoZ6ln5qjo6WZn6Kpsqi8r6Wonp2PfIublaGgmZCRmpuRmZeonqGYqK2npaWjpam7n6DGp6Wpoqu0tq2up6C9rq2tloGpkqOvjpuAhqSXmI+BgLjDuoOOnJOFp5ecgqyKgq+IppuapaqRftW9wqpio7+9fH6jgoPXuri1hZSTg569voRqo4Fvq4RunX96srHHg2qrsL2teHeivrt0gJWNppyPmpCVnHmBkJp5Yn16Y4xneIF7YGtla2piUGJbU2pcQFRhQk0pPDo0Lx4fJB4lMiAdJCgwNDk2Njc4Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPzxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJW0tLG/ubK9s6Kdrqals6adjJilv6q3saihv6amsZuesZy5qJ6tr6WnlZSvrJeMg5qRr6ajrKGlnKqhmIujkqaep5yaoaiimZ6gq62pua6opJuXk3uHmZGmm5OPkZiYj5iTqZmfmKmooKqmoaOru56pxaOgr6Ors7WrsKqhvKiwsJp0daqkt4ZliZ9wZ6yPio9tb3ekkJmfgXWumZVwkIxxlaejm5iupHJtbW1lindubYKZcYB5aXFpZ4mWlZhxaGmFhmdwhmReiWNqcFldZ353pmBicY6Sb2ZkgI2SjqKXl5iQlZ58h46UdWWGd2iManh+eWRsY2ZsYktkWEprWTpQZUVRJ0s5KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiUrbOqurmys6qpoq6epLKpmJK9scPIvbWpnsCrrKOgpqufuqOkrayspo6WraqPjIWVl62fpaqin6OjoJGMpZOnmaiZlqOqoJacpaWnr7qrrJqbk5J7hJeNpZeNkZCYlI2YlaeUnpeoopqwpp6irbqgscKopLSmrLGyq66sqLmkr7iWiqGopbadiZaimIapmpCUnZOqs5mboqugspaioJ6gopygpKGVq6aMkpOMh5KcnJSQmZOYkI6VhoGkmpeVjYuTkoqPhoR+Z4uAdIN2dIiMcadtfJWRlJOBgY+Pj46dlKCVl5WggoeTjHBoj3Zvind2fHppbGRkb2NVYFlAaVpHYmBOWSpFPSsmIjc0MC4fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW4r66isKStn6C1sZGOq8W8xLq3qqGlnZumnbCoo7annam0pqeRmKyji4iJj5ynlqykoZqnnp6TlaOXqZqomZSnoaSQmqeZobW6qKuYmpCNfIGUjKGUipSRlZCPk5elj56ZqJ+ctqOdp624qLDCrqO4p6+vsK2qqrS6oq+9mZKmo6a2o5Kdpp6NqZ+Nkp+jrK+aoaKwqK+XpKCcpKqenZ2cl6uckpmhm5OQlqqZjZiYlpCWnpGIoJ2VlIWSjJCMlIuBfmaMh3WHdnmIg3OcaoeRlJSRin2MlpKSmJOhkpyVoIOGl4Z5cZVyeIl/cXt+am5kX3BpYFtgWW1iUGBkUFo6R0ZFPTM9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WXF5eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJWkp6Ows6yuo6mnraCotaqQj5yls7quq6uhopl6naKwpKWxqZabuKajlJmpnI6GiombopCunqSWqKChkpeZm66LqpaPqJmojJioj565tqSlmJuNiXmBk4yak4qVkZSQjZKWooydnqien7ikf4SwtqOxsHSkv6SyoHh6oKuzvJV2rqSfioCqfmRcYnafjqSdg5d+bpOznKOnrauiZZ6gk3N5mZZwgJiol2x/oqeJZZylm5CXmJaLkZuRhZ2akJWCkoeOjpKJhXhrkId2h3F8hoGAYWmIi5WTi1t2lZFnaI+OcnqkmJhleJiGgXeXaYOJgm55f2twZV91b2traFxmY2Jib1JbPk1OTlJHPUBUQjkxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXF9oZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyVpqOhsLGsq6mlqa2jp62kkparta+xpZqqpquXc4ucr5+oq6eTlrigoI+co52RfoiImp6Nq5qjlaeino6Xkp6Fda2PiKaaqJGWo4iburSooJmYi4l1dpOOlpOKk5GQlIyPk6COmp+mmZyyloCMnLWetY2Sj72ooX6nonqjr7iBjo6nn4SLhY+xqa+MiZaimnmBi6yGnJ2ip6moh5WGmHelm3qHm4GXpoKBe5yxeoqFn5eZlJiWgZCWloSZmmN5h5CEjo+Si4NucZCIeoFxgIGGf4Z0h4WWkniWaJN0oJp0fJmDn5uGmH6RiYGCmGqNjIRqeHtxcGdkd25pbGpbZWppZXJbXkhTTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+QERJQElFSktHUlhaWFthYWhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrsa9sKGWp6i1no+DnKucp6KgjZC+npmNn5qgkH2FjpmXiKudopWgoZKNlImGgJGnjYainKOTlp2Gn7myp52ak4+FcHWQipWQipSPj5uLj5GfkZafpJaerIiftIm0mq6Lyoerrom3hY2wg7GvhKmNp5iNnXyoj3J7d5uOppZolaR5tIufnqaokpnCgX+riJihcZ6AmqR9l4WVsYGhfKCTn4+Yl4COk5uJmJKLfIWTho2Vk4mDbXORhoB7coaBhX2FdIWCl4GPxWaAqYePomqegp+YgZmAiouDiJhvjZKEZ3d0e3ZnaHVwZ2drXmJubGZsWGhHXFFMMkU0Nk1gYzYmNDxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFldY2ZoZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGqq6aalKCjpKqilqWptqOvf6CnnKWenYmUvZmTjaCRnZB5g5aWkYermZuamqGFj4x3m5yPn5CInqSblZiXhqK4raWZm42Nf2JtkIuTkI2PjIyXi5CRn4+Tn6GZoah+oaeHrZ6glq6Pn52dkYaBoI2rr4ekjaqajJp+o3aAmJNrgat1Tat4h42dkZuop4Gqq32DoXt6p2mef5JrZ5eGl7aInn1tYGNYg5d/jHtkZ4tzmX15lmxdfJduX1NxhFxgbHmDYFllgn2EgZhxp6prg6NucqVwn4OdZ2SfbFpsiHplWV+CfmFXUG92ZW50cmpqb15qb2xraFdpT11XRTlBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fYnZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySora8q66imZegoaWsrKCdrrWjqJGgn6CmnJmOmLSZkIuejJWLdYGUkY2KppaVl56efpOFhqykh5uQipiol5makYelsKailZmIiYBpboiHi46OiYuNkouQkqKMk56gnKKlf5OBj6OhlKB3nJaQp4Ohp4CGqq6FpXmLfYSafaJwc5OHlnuejHlth5uMmZCbqJqPh518gqJzdqZmnn53pF+YenySc6JumLe0unSSh4GAtqhkgca4e3CVt4xxgJukY3Osq2B9ap2zfm59h4OOgouXcYCjbHOkc56DfqNenZmzlm97l56zdHJbnrKCaWJvdHVxaG5Za2xzcmVcaV5iS0Q9RDVRQVlxMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pYYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmsnJOgjqW4ta6toJuinKOjpa2bmrGtrJOXoJigpJqalJ6rm4uIkniLhXCAlo2Kj6CQk5Scln2RiY6ooYeYj4qRopObmoyLqKikno+Wh4R+a3uGfn2PjYOLkJCJj5SggpadoJ2gn4uJd5yYooygcqKLiKmInKeRl6irf66MfXqgmXqjk3iAc5eIjJx9lp+Gm42Zm6aGo2ShfImWkJuNbJ5omo1umpl6f4qnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2dYmKf55omnWHk5KYjn+ebpmQa6aZXKh+d7tqfalajoRds2dcbnF5d2poW3BqeXliX2ZYYkFQRU43VkJSbTRKWlpfTlpEQDE1MTs7N0g/OkNHVD9ZUlldPkRiXVZgUWFkfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZyJqrabqIljlZysurKwrJ2mnJynn56ump2wqKudl6KZoZ+Zlpago5mGiY1piIBxe5eIi5aWhJKVl455ioSWo52JlI+Fi52RnJuJj6ijoJqLkYqAgGmBhnh/lox7iI2Oh4+Wmn+Top+gopOYcmifiqCPjHCSjIKpiJmfo6mgqH2wraSiuJd2o7Oio3+IlHidequafqKOnZuXiJdyoXyFja+1fWuakaF4fpi0o6OrqISYe5p8nJl+c6paXW97l4t4nmJNf3t7hWN6l0JNn1mianJ8jm2BiYSZdZt5h4mxs39/mpKmdH+dbXF8lG+ZcmmjXZV2SGVjYHNwfX1tZF9raXd8ZGRhUl5WXVRWQFlFUWdEUldbYlhfSUQ9QjhAQjpJRThMRFdBVlFbVkRGYVxaYEtgbX5yRUM8VV9iWmVqVmdobG5iZmZeYWFcXV5haGJfZWR2bF5lZ2ZsZGVsaGhraZOdgbGumYRTX6GntLqzs6maooubqZycqZOhq6ShqI+enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32Rk5WHcoCJkqCccpGQgIiYlJ+ahI6onJqViouKfINshYVxgaGMeIWNiIeSmZV8kqSgn6OIroZ9tYSPnp17ppZ6qYKWnZCLoZ59p2h3bX6Zc6BzcXydhZhvk4KufaODpp6agaNwXqlndaNjb6VhnNOQfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyqLx/d4Ntf7+mqrRem29+cZdvgXOicl2jZ3SmYWimbZvTmHuDm253eZdrm3p2l3JsqaVnX2V5cH+EamZmY252eGhgY1NbZVFRYklXSVRfV1NbZWpcZVFFQ0tMSktCSkQ4UD9QTVdTWE9SUWBlZWlSZHh5d0lGRWNdZFloalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiYm3+wrFRcS36psLK1sLOjnJiFmKagoKONpKigmKmJmZeYk5mTkqCXjoeFe3B9hGh9j4OTmoF3kY2OiXB/ho+TkmyXk3yIkJGjlYOOqpqUkoqFiXmDdoeAboGfhneAkoaImaKXeZOipJqfibOhoraLeqynpK6lcKmAmpCFgZySfaSAopmGmHKehKKsromXi4CMpI2Wg66ilHa1trXJoXOUioCfYZ6XqW15lYefmnWhh3egfZCWioFvTGaiknCaiHOke3l0YYOCbH6gbHJkYJxyf3SXaXtps7W0xqZzmH57nWqbm6t1gpptdHeXaZp5dJhxUEV8s15qdmt4h2ZqZ2J0dXFuVl5UWWhQUmhJVUxYUlZdZ2tuVmdXTUpBSk1KSEpOQVFKUGVjaW1ldHJzfnh7bnWJe3tUUE9tXWhba2lSamhpbGdsZmNlX1xcXF5pYmRoa3tfXWRnY2pmb2xlaWxlopyJr6eFZj+UobOrr6+1oqKQgJeooqKkjKWnnZylgpmXlo2XkJCbko6Ig3lqeYZlg4x+lqB5dY+IjIFphIWSg4yFnY16jIqUpZKDl6mXjJGLgIl6gH2KeHCQoYZ5gZWHiZagln+UpaiclpaEZ254nGyiZHxxpXecmHBnp4GXjHuleqCWg5dyn3aAiZSWj7lukIqiYn2ZopWIbnJpq2p1oGxupmCbaYuQaJaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGaIgm5yolpfW2Shbl6JjG97f3NyZKVueKJkZ6domHOLmG6hb1OIj2+gXmSnVItdU5htbXNrcYFtcGhreHNrb1JYV1dmWVNtSVhPXEhYaWhzallrVlFSRVZcTFhSYVVoal53dXp8cHx8coJ7f3J2jYCEdl5Rc2FnYnBnUGpoaGtsbmdkZ19dXl1ga2JqaXZ1XVxjaGNqanNsZmttY52lmKZ6ZXRti6eupaqwsaafi4CWqpyepYyioZqiooCVmJONmo+Ll5COinuHcYCIaIuLfJeac3SKfZB7ZYOHlYqKlZmCfIiFlqaPgaKskIWQioGKfYCAj3Npj6WEfYaUjYiYoI6IkqqnnommeJacfqWJloyymJ6Qg6+Xn6V4loh6qXSlj4SabqWijJKEjIO8bnylr4KGhYaTlpygfKV6caiUoJZnnn5vrGOWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4ZubZ+ekpVhf6uLqnaAf42nn3effYWklZ2gaZqHdqxnnq2MtnN3voykk1mDpo2rYXVyc297dHFian5uaGxTVltVYWFda01dUl1JXWxtdmBbcVlbYFpnc2Vub3JjcXRgd3t+eXJ5g3ODfoF7e4yBgoB2YnhkY25zZFJsZ2hvbHJpZmlhX15cYmtibGx6b1xcYmlibGp3bWdsbmKVpqqcgYCepJapqp6op66jmYmCl6qZnqSJmqWdqZ2Ei5qPhZyRhZKNjI10hnqIg2+NhH2Wk3R0hnKSgm1/jJKHhpSPfXuBhJekjX+lpY6BjYmElHWCh5JvbIqogIKLlI6JnJ+JjZOro6CQgHWVl4h+gXmUrqN/gZtxj4Z4kIyFgHtyp4xxfX16l5abhI54e359iJSVk4p2kJmfoIN6fYlsjIVbeXlyeXFobn6SiXF/dIGPlJNxhYOBZY1/X4GAjHd1c5R1b3pvbodthIZfd2l4jmaBgoaOqpx+dH2XaomIb4B2fIV2bWxnjHN4e5d3hFtqWHiPaG13cnFvd3hvXWyGbmlnVlpgV1xka2RVYVVeUV9wd3lranZlampqdXxxcnRzYW91YnN7gXh1eYJ1f4B/gHiLhYN9e21/bGR5bl5XbmdodWt4amlpZFxgWmNqZWxwdW5aW2JrZGxseW1obG9hjpW5qKaLoaKapqSZpJ2roqCDg5erkZ2giZqmmqiYgoGbi36WlIeOiYiNcoJ8j31+j4R6l450coNwlYV7fZKLhoaQhXh+gIaYoox7p6GLhY+PhJWCho6Xd3KEqYWNkpyQiJ6eiIybqKCgq4OJjpWafn6Jlq2oj5KnkHhwnpGDe5NvfqmFcH2VcWpvfIGfi3+SjoxobV2Di4ycm56Oc5WLiHF0a4J2c4BZcm6GkIF9fotpXWljeoWDiIBfaXh7m3yDjIN2gYaDaXmLh2thcXODd2BzjIKJkKeVhmaNj4NudouDcIWNeW9lZmN5gnqVWlxpZm52W3p5d3Rtc3KCZlxtimtsYllZXlpZa3FbXmBZXl1mc317c29zY2traXt8cXt3dGRtdGhsfH51eXx7enl/gH9vhoqEe31zfnlzf2lUXHFpbHVvdWdrZ2RdYVhraGtqcXJtV1tlbmxnc3pvaGptYIyMqrChkKOhmp+emJ6ZqaOhfYOXq4yflIebopCllX97l4R8kpmIiIaGinJ9gIt2hYuBhJaKcW+AcpiGhH6ShIOGioF6gIOKmp6Pgqagh3iOl4iVi4udl4SDeqyBkJeZlIqenYeIoaugoqKjjIiTm5yjmZaqoaemoJKbiJePfHmPjoSofn+SkZKTnLClmpSdkI2yk5iEpoyMlZufiZCbgomRimt8jnZ3ZYKGkIp8iZ2Eh4uPh4iAhIOQd3x6dZqiiYeLn4uGlX9+jIGAdnF0hoWAeIiHipGmkYSGjoiDjZCMfIeKiY+BdmuBg3t5mWlyaGBzinB9end2b3d0gV1eb4dobl9fWlxdU2dxVWNbW2FsaHR7fHJucGRramh/e214f3Fpb3BsZoF7coGAd4B9f4R6bYKMhnx6eHx+eoN4TmR2a3NtcHpka2ViYmBbdGZwZnJxbFVdbHRtaHl6cWdpa2WNiJ26n5aioZiVmZiUmKSgnXt/maqNno2Fn5yKnpZ8eZSCe46ZiYaEhIZteIGAcoCHfoiThG1rfnmXhoSDkH6AhoSGfYeDjZqckoeqnoNyio+FkpKLnZF9jXqpg42Sl5WOnJaGhpunoKKanYaDkpqZmZCapqCmnZ2Ql4GSi3d9iI6FpXt8j5CRhpiqoZ2TnI+Nqo6SgJ6MiZOanoKOl36HjoJveIVxdGB/g4+GdIuXgIOPgoaEfoWElG55dXWToouNhpuFhY50gIp9fXJze4mEe3mMjoSTp4+GhI+Cg4qKinaFh4iLfG5rfX97bWhrbGdeeX5nfHt2dHV1e3dcYHB9bnVgY1pcXlFmbVNlWl1ha2l2eX5wa2xka2lngIBsc4BsbHRveG6EeW6GgHaCgH2FdnGCjYh+e3p8f3uCimBpe2t1aGmCZGpjYGlbY3Vob2J1bWxUYnF5ZXB6enJlam1ti4qfuJqhpJ+TkpaXi5qfnp16d52lkJuJhqSUi5iZeXqNhXyJkYOMgoGCbXt/eHKAhX2KkHxraHyAl4iBiI58foaEh3yPgY+am5GIp5x/cIuKi5KHoKGKhYx8p5GHj5KXk5aSd42joaGelpp/gZCamZOMm6OhpJqXkZt/joV5gISPh6GAfoyNj3yXpKCgkpmQj6aNkIKbkYmSl5t+kpJ+h46BdXSCcHZgfYCNhXGKlXyIjHKNfoKFhY5oeHJ5jJmSkICYfoiLcoKHfH1xenyMhXp7ko2DlqWTi4aRfIWGh4V1goOIiHplcXp/eXpwbGpmXn1yaHx1dXN8coBqXmB0dnB4ZGNZXl5Sa2hUZFheYWdqdniBcWZrY2xoZX+Aam1+aG9xa313hnpri4FygYF9gXR2go2Gfnx6f4F9f49qcoNuc2lhh2hsYl9xVXRvbW5geGhtV2p0dmJ1entxYmpveomNn7KSpaWdjpCYj4adoJqcfHWjoI2Wf4yiioialnh7hod+g4l+iIKAf3B/e3R1goV+iZB4Z2N8hZeKgoqNeH2AjIN5loCVl5WMlqCafW+LgZCThqabh4yJg6WVhJKKlZeSkXaRnqGhmJSYen+OmJeOlpudpJ6Zk5ScepCGg3iFl42efoGKjoxzl6KeoZKYjo+ijIyDlpiDkpaZfpiNfIiNgXZxfW16ZIB8ioVwhpN/kIJsh4KBf4mEZXVvfIeTmI19lHiMiXyAh318coB5iod5hZGKi5iiloKEjHeIhIOCdnuBiYV1YHd3fXR9d2ZrZGB+aWp2c3R0fXF8Y2Nhc251c21hWWBeW2xkUmJXX2Boa3V5hnBjamNtZmh8g2xodGhsb2h/fIJ4bZCGcYCCgn90fIOMgX9+eoKDfnyQbXWJdHRtZYpsamFjdVaDaXFuYHhmbGJqdnBmeXt5cWBybIaFkJ2umKaono6Nl4eGoJOXmHx3qZyKmHmXnIuLmJB5fICLfXyDe4CCgHhzeHpzfYCEf4iLgGRefIqVh36Eh3R9fop/fZiElpOWjKOhl35yh3uTkYqnj4yOipKgkYORj5SXkYqBj5igmpKQknSAjZKUiZ2dnqeYmI2Vl3SOj4pshpiQmXqHiJCJb5edmqOTlYqNn4yGgpKcf5KSlYaZiHuKiYF6cXlqdWx7fot+bYWRgpR3cIKDfX6LgGRyanyBl5iFf450kYmDeYd+dniBfoeBfYSOhY2UpJB5hYN0iYd9gHN0gIeDbWF6dHpxfG9hbmNke2Fub3Zyd3dzdGJ2YG9sdW5vXVteXV5qXk9dV2JhaG1zeolrX2plamNod4htZmxoam1ogHx6d26Qh3OAg4R9dIGGiXqCfXqBhH19jnJ5i3l4bmyHa2hfaXJjh2hxb2Z2Z21sYXpoanx6eHBhd22LgZmaqqCkqZ2KipGGip6KlZd9dq2YjJZ9npORlpOId357inx7gHZ3f4BwdHN6b4V9gYCKfnxgXH6PkYZ/g4RzeoCGeo+Rh5GRm5Kkm5SBfYB8jYqSpImNio2Xmo2FkZiTlY6JiYyTnZOQjI1uhJCPkYmemaKhl5aJl5JvipqFZ4aaj5R6iYWQinCWmpShkpKIi5mMgoCRnnySj5KLmY57ioSHdHN1a3FudXyLdG6GkI2RcXSAe4GCiHxlcW15fpqUfYWJdJGLgXSJeW+BfoGHfYWNioWNlqiNe4h9fouFd31wb4CFg2Nod3N1cHpiXnBhanRecGp6eHhscnBleV1tbHNtc1haXl9halpQV1hkY2dxcX+HZl1paGZiZ3GObmRpZ2VqaIB6d3RujoVzgIGCe3WCiIV4hHx3g4V6gIl3f4t8e3J5g2prX3BodH9rcW5tcWdvbGV7Ym1/eXZxbHd3in+jmKKooaebh4yKgY+dhpOcdICplJGMhqCMlZOQf3R7doV4eH9yc3uFa3JveW2JdoCAhm5xW1l+kY2IgICAdnWAf3+gho+KkZyXoJOXd4l+gIyInJ6Kj4aSl5WEiJSZj5aLi42OjZ2KjpCEbomLj5GKnJahm5iVhZiIa4akg2eGnYqRf4uEi4F3k5iRnpGQiImVjn9+j5d8kY2PjZqSfIp/gm92b2ttb3B7hWlzg46XinF3gHSCiIJ5ZnRvdoKaj3yJhXqVknp3iXRwiXyHjXuLh4SJj5yjiHyEd4KLgHh4bmqAgoBdcnJxcHB4Wl5xYW9qXm9pfHlwbW1qbXZgcG9rcm1ZWGFhYm5YUVNZZWZjdXCEgmJda21kYmZrkm1gZ2ZfaGuBdXJycIuAdH+CgHh2gIuAeYV/d4eGdoOFfIeMgHt2in9qcWN8YoZ8b3BsdGpob2x2d19xfnl7dHV0gIJ/pZWarZ+nloWNg3+XlYOPn3WKn5OShYqajJWNi3pyeHSCcHKFc3F1iGxvbXVtiHeDfX9tblVRgauUh4J4gHZygnmCoIGRgZOSl5uRmniReoOMkqSak46JlZiShIaWmYyTi4mPj4iehZCKfHOLhYiPiJyZn5uWlICUf2mGnYhoh6GIkoSRg4lxg5GXj5qNj4yLj413e5KQeo6LjJGWjHyIfIBrdmpta2tsen5heX6OlYF2eoF3g4x8eWd0bHSHlox/iIZ7lJFxeoVweI17i417iX6DjZGenoV8fXiCi312cGlrgYJ4X3dvbWtxclVecGJxYF9tbnlwZ3BmZ3N1aHBrYXdlXVZlYGByU1BOXGVkXXhwiHxfXGhyYmJlZpJqX2hkW2dwfnBrcXOKfXZ8hYB0dX+MeXuFgHiIg3OGhX6MjIN7eZV3ZnJqg2CHfm9va3pgam10f3RfdH14hnh0c4V8eaGQmrGcpo6Din+DmoiAi55/ipmTjoSIl42OjoR2dHZzgHBvhXNwcYNvaml2bYJufXxtdXNSToLfyZLWk3xwdIN1g5+CkneUkJibj5h7k3KGkJ+hk5OQipKblIZ+lpWIjY2IkY2InICOgXh6jH6IjIqcm52blZN5jXdoipKIbImkhZKIl4OGY4yRmI6UipaMjYqLcXuUiXuOiIqSkYl5hXt+bHtlcm9qa3l5W4B5j46Aen5+f4aOenpoc2tzio+JgYWFfZaMbH5/b4GNf42IfoR7g5CWmpuLfHd4g5B5c21mcH+DbGh0b2doc2xTXm9lcFlfa3F4ZmtqYmZ4c29wY193YGBWa19edlBOTGBmY115cYl0XFtldmBhZWWOY2FmYVhpc3Nua3F2i3x0eoaBdXZ+i3N/hn97iX9yiYeBkYqIfH6YdWVzbnxliH9vcGyAWmxueXlzYHZ6e412cneKd3mfjJuvm6CQgoV3iJV/fYmch4WfkY6FjJeEk46HgXV3cHlxboRvbW5+cmRkeHB8bXp9amhsY6Sawdyu76Fza3WDdYShhZFulY+Un5SbgZFxhoujl4mOlYqQnZaDgJWQhYmPgJKKipd/h3t1f4l4hoSNm5qYmY6Qdot3b4eKjH6LpIWSiZ2FhV6LlJeKjomOi4qEiWx7l4J9iIWJkI+GdoV9fWt9Y3h1aW14c1eIepGGhXp+f4CFjH55ZXNqf4mOiYKDgIyXhmyCdm6JkYORhX+CeoCRlpSZkHR0eIiNdXRxZ3V5gmFzbG9haHVmUmBxZ2tVXm1zeWByY19ofXFybVpicmFiV25aXHdNTUxjZmFednOKbVtcZHleYGRmhF9jY15YanJrbmtyd4t9c3eEgXd3fIhxg4R9foh7dIuIiJaGjH5+l3JndXF5bYx7b3RwgVhxenZ5cWR3eYaMaXaAiXKAnYiZqJyjkoR9cIyUeHmLnYSFoY2OfJWMf5mHhHtzd3Bzam+Ba2lsfHReYHh2e3B1e2dgZXzr2rXJw9yIc2xzgHaJmoiNaZePjpyUkoGIcYaJoI6Ei5WKjZiUfI2TiIOJj3uRi4aQgn92eIOEcoeCkpuWlJiGjHaHf3GGg4qHmqKDlIyeg4lhg5WOhomGiY2HgIdpfZR/fYOEiY6NgnGGfn9xd2d2cmlzd2tajH2SgYV8gIOAhIqCdmJ0bIiBj4qCfoCTkX1ugmx5h5CHk4R9gX6BkpSRl4lucnqMhnVscWtyeIBfcmhuXGp1YFFlcmlmU19vdnRfb2BdaIJxcmlXZ2hjaVhtV1t1TEpMZWZeYnJzhWhbXGV5Xl5kZ3phZF9cWWtuZW5qdHeKfnNzgX56dnqHc4WDfH+Hd3aKho+Ygo2Ce5J0a3d1eXmTdW94en1YeYVxgG9neHeSgmR2hoVxipaFmaGbooqGc2+Si3J3jpx9ipqIiXuff4OZf4F5cnNub2RyfmlmbHd3W195e3pxcX9pYWdhf9W2jpCmeG5xd3txkpCMh2qYjYibkYuGemiIi5mGgZKRhoeYjXyNjYGBio18kIx+ioV6dXuCenGGgJWZjpOUgol1hId3hICLk52fhpaPn36IYX+Th4SIhImNf3+CZn2RgH5/gouPkH5tgnyCdGttdnRzdnVrY42Bjn+FfnyEf4SIf3Bfc3GFfI+Ngnx/kol6cYNme4SLh42EfIV+gZWPkZOEbnB5jH91bW5qa3p9YmdpaVhrdVpSaXJpYlBicnhsYWVdWmqDbXNiW2dfZGxfblRab05IT2ZkXGducYBsWltjcl9cY2x3ZGVdXFpsa2JtanN2hn9xb398fHR4hXiFgnyAiHV5iYGSlnyJhnaJgW94eXuEk29ufIF3XoN/dIFtaXpzlHNncoh9cpKRhJqfm6CGh3Z2lH9tdpOXfYeQg4qNmXyLmnZ+d3FvbGphdHxnYml1elpfeHx6bXF+ZWNoaFedj15xcpa8xIR2cZSIkH5ylouGm5KMh3JqiY+WgHuUjIGEm4x8ioZ9fImMf5SIdYqGdnZ9gXF1hoGelIWUj4ODcoCIdYV8ipmdmIeUjp2AiGZ9k4J/hYOJiXKBfWZ+i3t5fn+Hi458aYB8g3Zmb3h4c3ZzbGqNhYqBin94goCFg39rXnJ4en2NioZ8go+BfnKBaXmEiIyGhXmEfYGYjZCMfW5te4l9d3RuaGd8dmNbcGJXbnJTU25zaGFNZnR4ZWBdXFhugG9zWWVhXmptYHBPWWtRRFNnYFprbm18blpbXmxjWmJvd2RnXF1gbGljbGlzdoGDcW5+fH90dYN6g4J8goV2foiBlpF4g4p0gYhyeXh+jZBvbnyBcWmBeXp+bWx7dZVraneEdGyUjoaemKCZhYhufYx2aniYjn6BioKVl4l5jpZvenNwbGpkYHN6aGBlcXpaYXJ9eWdxemFlZY+xsndKYlqk2dCWcnuQipB3fZSLhJmRjIVubIaTkXp5koaBhJiKfId/eHiJioSWgHCMiHF0fXppeYWDpZCEk42Df29/g3eEeYacmZSLk5CVhYdwe5KCfYKDiYNugXdogIV4cn9/g4qGe2V9foR1Y3Byf2h4cG91mI2Ggop8dniAhHmBa1xxfnKBiIWJfoaJe4lygW5xhYePhYVzhHqCmY2NhHhub36EgHd6ZWhqfHBfWHZaWHBsTldxc2dgSmx2dGBdW1tZdH1yb1dnXWZqcGBvTldoUT9ZZl5ab2tneXFaWllrZVljcXlfaFxeZW1oZWtpcXd/h29sf36AdW+Ce4CBfoN/doGFiJeKcYKNcXuGfHl5hJOMdWp6f2xvfnR/fW9ye3uUb26Bf3hmk4uDoZmckoKGZ4eDcGh6lYh9foSBmImBfI2MaXhya2xmX2FueG1fYm94XGRsg3phcXZfZWXU6r6KMjo+i46AcXiFiI6NdoOWjH6SjYx/bWyFjYx2fY9/hYKViHyCeG52h4SDl3dviIVrdXt0ZnmCg6eLgo+LhH1ugHR2hHqHnZGMkJKTjIqGfnuShnd/hI2DbH9yaIB+eG18e4GKg3dieYSBcWRxaH5tdHF0gZuLgH+FfnN1fYBzgXBbbX91eYuDi3uHgHyIeHpxbImEkISLcoJ6gJeLi390bmt3gIB1dVxpaHdwWFZ7U1pwZExbcnJlW0lweG9cWlpZXXV+dGhZYltnZW5jaUxXZlE9XmVcXXVlX3RwWllUb2RZZHF5WmheYGdtZ2lsaXB3fY5saYKEfnlugHx8gX+CenWCgI2ThXCAi253foB7e4iSiX9oe35qdHtyhntzd31/jHl4hH18a4yNhJudloyBgGyOfmtofo2Men5/g5SBfn2KiGt1cWdoY1tiZ3JuYGFsc2FocIl6YnN0XmNkm6CPblw1Wa+1dGmAiHyShnWFloVzj4qJdnBshYOHdXmJeIl8k4d6fnNndol+fphvcYZ+aHZ5bWV5iISkh4CHjYl+bn51f4F9jJmIgpSSmYiKhIl8j4hwe32Ee2h+bGqAe3ppenaCh4ByYHeBfnFkcmZ1gm11e4SUkYF8gX9ud3l8dH9tWG+Ad3WMgoZ4iHaCiXp4c26KgZCBhnN/fX+TiYh6bm5qboKCdW5dZ2VzcVFaek5cb1xPXHNwZFVLc3hpV1lZWmFxgHRgXV1gZmRoaWZOWmhOQGFkW2B1YVx0bVhXU3RhWmRvcldqXmJoa2dtbGlwd3ySbGmEiXx8cH5+e4F/gnp3gH+Ki4Nxe4dvcXeEf3uJjY+Dan57bnd5d4p3fXiAgod/g35+em2FjIiYo42Eg3t2jHlrbISIkHh9e4GRf39+ioNwcnBjZl5ZZ19vcGBgZ3Bmam+JdGF0b1thZGp2e3++nKajyLhxhYNyknx4hpOCc5GMh3Jyb4N7g3R1h3SId5OIeXlxY3eHeoCTaXKEdmZ3dWNqfIOHnoF/f46PfXJ/c4R5gJKRg3iWjpWOh4KIe4iIa3h5fnVnemhsf3lzaXp2gIN9aGB3h31qa3Rne4BpdoCLkJR+en1+cHt2e3R+YlZ3fnNzioSCfYNxh4p3eHFwhIKNf355fn12joaDdmlxaW2IgnJwXWhicm5KZHVMXm5VVFpzbmJRT3N4YFJYWFxhb4JzW2FcaGVlY2tkUVtwSURjYVpjcF5dd2hVVlV3XltlbmhWa15hamdlb29ocHZ6km5piIx4fXJ7fnmCgYF8dn2DiIaDcHeDcm53g4J9iYuTf3CAfHh5eoGMdIN4f4GBgoR6gHVvfoqLm56IfYV6d4d7Z3SFi5B6fn97iIWEdo+AZ29uX2RcWGVZbXJgYGBwbGtoiW5gc2lZXmRtgHep2qnHhoeycYl3b4x1e4aOgHqTiX91dHR+d4BwcX9thHSUhXh0a2B6gnmIj2Zxg29ndm5bbX2AkJR/gXmSk355e2yHdoGRjIR0loqRjYaFhXt/hGx1dn9tZ3ZlbXt1bWp3dn9/fGBieIV5aHR1Yn17Z3SGjo2Ve3SAdXF/enxtf1lWdH5wdYWHf4F5bImGdHlsdYCDhH57fXl7c4uBfHNndGVui4Rtc1tqX3VkSG5uTFphV1ZWeG1iUFJ0dldQVVheYXGEb1xgY21kZF5vYlRdckdCZl9dZmhdWnpiUVVcdVtbZ2thVmpfYG5lZmtxaHB1eI50a46NdX52eH13gYOBe3N9g4iHg29xf3RxdX+FgYmNint3f3iDfHyGh3iHfH2BfoSAe35zdnmMjqCNiXqJdnWDeV59hZiMeYaDdIWGhHeJe2JubVxiW1thVmpzY2BbZ25vZodxYXFmV1xja398ys6HuaFqbW2KbHGEcXyEiX57kYV5eXN5dXV7amx1Y4R1koF2b2ZefYJ6i4llcoJranFjWG16hpuIgoJ0mJV4f3xtiHGCioyIcpiOkIeEi4N7eH1xcXB9ZmhxYm14cWprcXh9fHpcZHmAd2l1eGaBdmd0h4uOlXxxh2pufYF5bnxdWHJ/bXSBi3yCb2+Kf3F2aHd/gYCBd31xe3WHfHpyZnNhboyCbHJYa193W0lua01VVF5UVXtrYU9UdXJQUVRWXmJ0hWlcYGtqZmNZbmFYYnBHQWhcYGZfXVV7XU9VZHBaW2poXVdoYF9yZWpocmdwcneGeG6VinR/end+eIOHf3Vyf4aFjYJwcHt4d3V6hoWGjIV6fH91i359hoSEh39+fn2Hf3x4dnl4kZOgf4x9i212gHljg4aWhXORim+FhYF6g3RjbmtaX1tdXVRnc2VgWWRycmaBc2JrZVdbYGl/eL6ue6C3bWJzhmhze3F5goV7fYx/d3hydm97dmVqbmCHdY6AcmliXn94eYuEZnF+aGprWlZvd4qjgYR/cpuUcoF5dIJugYKSiHSViIyHg4iFfXh0cm5oeWBqbWBtdmpnamt5d3p3W2d9fHhlcn1thHRldYWNhpZ/b4tmanqDdW10YlxvfGt1fYx8gWZ1h31ucWh1f3h+f3N9bHt7gXp4cGZsYm6Jfm1tVmtgd1VKamtPUU5oTVl8aGJOVXVqTFBUVV5mdYNmXWBwaGdhV2ldW2toSkRqWmFkV1lVeVlOVm1qWV1sZVxaZWNedGVsZHFncm91gXhwmYV2f353f3yFh311c4KIgJWCbnN5e3pzc4WGiIiDeIF9do9/fISKjoSChHt+i4N7d3x3d5qdl3qKgoZpd318bIOEk4Byj4JwhYJ+gX9vZmxnWF1bXFtUZHBkX1dicnVpdW9lZWJXXFxof3BvcoBziWRkeH5pdHVzcoKEeICEeXd0dW5renFiZ2tnhnSNg21mXl99cHuJfmltd2ZpZFVXcm+Np3yEfHaXkXR8c3x6bnx7kYV3mX2HhYKGg310cHJsZ3RcbGhebHRkZ2Zpem97cllngHZ0Z3CAd4F1YneFinyUgG6Lam16gXFmc2VgbXpnc3iKfH5idoN2amtxdHtxenl0fWZ+f395d25kZmJuhnxta1ZqYnBTS2lqT0tOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2llYFZjV2JwXUxLa1hjYlVVVXNWTFh1ZFpfa2FcWmNlX3dmbWJwaXNucn90dJqBd3+Ad39/hoR6fHWChH6XhW5ydHx6dHGEhY+BgHmLdXSRf3yBlY6AhYR9foyGe36AdnujpYp5iIaEa3V8e3WDgox6b4VzeYR9gYN1bmpoZVZdW1paU2JuZFtYYXJ6aWhsaF9iV19baoBpa2+AZ2tgaHl4anN0dG6EgXp/fXV1bnpoanlqX2VuaIF2j4NmZVhid2l+h3tvaW9nZl1VWG9oj6l3gXp8kI55dXB/cHJ1eY5/eJV1hoJ/hYd1anJ2Z2huW2xkXW1zX2dhanhoe21abYJyc2pvgH55d2F3hIR3j4RyiHFveX9yY3FpXHB4ZHF0iHx4YnOAcGdqeHNybHh3dXhkg3t/eHZwZGNjbnx9a2xVaWJmU0tsaE9HUmtFYXhnYU1TcVxKTVRZZWt3e2VebXFpZF1WYFZubldLU2hXZl5YTlVsVEpceV9bX2tdXVtjZWB6aGxhb291bm94dXqYfXeAgXqAgIeFenl6g36Bk4RxdHR/eXZ0hIiQfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aErJ9/eoiIg2tygnp2gX+BdW6Gbnx/c4mAam9tZGRYX1pZWlViamdbWl50gWlebWtcYVZcXGyBZXF0fWlpXGt2dmd0d3JthXt9fXl1cmx5aGl4Zl1kc2h6d5KAYmJUZXBngoV3d2ZoamBXVllnY4+ob353gIuOenBxfmh4b3mMe3ePcoR9fn+GbmR2c2RoaFxrYl1vb1tnX211ZHpoXXSAb3FrcXt9dXVhdIWKeoeHgH93cnV/dWFwbVpydGJxcoV8dWVygGxhbHpvaml7eXZyZoV2e3p1cWVhZW1zfmlsVGleXVRLc2NQR1ZhR2J2Z2FLVG9XSkxXWGdrdnpkZW5xZmNaV11ZdmVVSlxjV2hYWUlXZVFIYnhaXV9sW15cYWRef2lqYG90eG5vbnaDl3lygYB8f4iLhX11dYZ5h4x9c3V1gnl6eoKLjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj66Me3uHj31lcoh6dH18dnJvhWx7fmyPemJwb2JlXWVWWVlWY2ZrYF1ccoRoWG9tWl5XWlxse2Jwd3ZtYlpsc3NndXVwbIR5foB5d25udGVpdGVbZ3VmdnaReV5dUmZma4OCdH1iY2lcVFhdYmOQpWh4dIKFkHhtb3poeG17hHt1iXOAeHx4f2hldm1gZmBeal9dc2tZZV1vb2J6ZVt3e2tubm93eHN0ZHKDkn6Hgoh6dm9yfXNieGRbb3FicXGCfHNncoBkXm52aWRneXt1bm+CdXR9c3FiX2Zub31kalNoWFlUTXdfUUpZWEhidWRhSVRtU0pMWldpbHF7Ymxsc2NhWVlbYXZbU0xjXVhpU1dIWWFOR2l1WF5hbVtbX2JiXYVoaGFueHlsb2p2gZB4bYJ+gIGSh4OBdnSJdIyGc3F3dYJ3fH1+jI+AfpN+cHeVg3yZknmAgHh5fn90iINzcJmie3p/iZR4ZHWIeXN4dWx0b35seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGJZVNxbVpaWFhgbHZjaXVqaV5ZbXNxbHNzc2qFfH5/fHZubmxkaXFjW2pyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFtjkp9lcnGFhJF0bGt6bW9we3x8cYF3f3J6eXlkZXVoXWJaYGdbXnZoV2JdcGhhd2Bbe3ZpaXJud3NydGhwgZSChn6EdnJqcH1tZndXXGtuYnFzgXpzZ29+W2BvcWJfanF+bGx1fnNxeGtwYVxlbGx6YWdTZ1VXUlB1W1JQWVJIY3RiYEdValBJUFpVa2trfGVtb3FhW1pYWWxwV1NPZldXaVNURlpcT0hydVhfY21jWGBgYV2LamNkbXl4a29pdXmGe2uDfX+EmXyChHl9iG6PhnFvd3p9dIKCfIqOgoKXdHeCk4WBn4l1gICBc3+CcYeCdW+il3R7houGe2V4i29ue29meHB6bHN2coxrXnRuYWdla1JdW1VnYWxsWlxwjGRPbm1cVlhVZ2p0Z2J0ZWVdWW50bnB1dXlrh3x/fIh2j3NkZGtuYVxubWNzeIdrWlRWY2R4fX1xhVxjX2NUWmBZY5WVY25wg4WKc2poe29mc3dzfGx6dHVveX51XmZyY1teVmFkWWF0ZVVfYG1kYXFdXX5vaGlzcXNwdHVqbYSSgYh7hXFyZm59cHJvVFtma2ZxdIF3c2NsdlVicWpbX29mfWZtd31zc3NqbWBaZGpqd15mVGRVVlBUbVdRV1NQSGRzX2FGWGlOSFdUVm1oZHxpa3hrYldcVVt0ZFNSV2hRWWZUU0haWlBNeHdbX2VsaVliYF5ej25iZmx5dW5vaHZ2f39sg399hpd7f4eBin5rk4hyZ3SAe3WAgnyIjn+Lk3J8ipGFh5+Ge3+GjHOBhnN9g3ZupYxzgY2LdndteoxgZXxwZnpzeWxtcXaCZ2R7bGNmZ2hTX15VZ19sb1tebo1oTmlsX1RWU29nc2xmeGRkXFhwdGxyendybYh7f3acenlrYWVsbV5gb2plcHh+Z1pWWGBseHx7cINfYl5nVlhfV2SbiGJrcYGHfXdra3htXHdxbHtqdnNub3uAclhqbl9ZXVViY1hkcWJTXmFoYmJsWmB9a2Zrc3VubXd2a2iFi36IeohtcWVwfW1ybWNZYWlpb3SBdHNfaWxTZXFkVGJuYnpjcXd7dmtwbWtfWGFnaHRcZVZhVlNOWGVST1xPT0hlcF1jRllpTUlfS1htZF94aG5+ZGBUXlRddVxUU2BmTl1hVFNKXFlQWXV2XV9mbWhYY2FbXo5wY2dqd3Fzbmd2dHqDcoGCeYeNfnyJh456bpCKdGxzgnR/f4eEhpGElY95foyPh5GbhIB8jIRygIFzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyNjIyNjY2NjY2NjY2Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQk6lr62tra2upJ+goKCgo4BjZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzQam2tLS0tLWoo6SkpKSnfFxfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiZmZmZko+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGj5CQkJCQkY+Pj5CPj4+LiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpOQipGMjo+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Mi4uMjIyMjIyMjIyMjIyNjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6HioqGjYaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQj4aLi4aOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPiYiNhoyJiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGiIeGiIaJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNiouMiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pjo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2doaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFFQD46Oz4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDo2ODs8Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXNxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTg5Ok4/ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgYGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT4+PTtGeV87PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExLSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DREQ/Pj09QElIQ1h5b0M+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGRU5AOkBlfn54cndvPjk8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBOTD5BPDw9Pz5CQz8/QUFBQkBNe2ZAa4eEhIOCenA/OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDP1V1eXGBgYKCfISAckI9PT89PT5DRD87PD0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VAVXV0gX98g4N8hYVoQUFAQ0BAP0BAPj08PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3x9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBMc3N/f32DhYaGh18+Q0NFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS01KR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVmd4GDhIWGh4eJhEtERURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR1h0goSGhIKFiIiNY0BCVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMSluEhoeDgYOGiIl9V2yEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExJZYeHhoGDhYCBgoOEhYWEhIWGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkpsh4aDgIOEgIGDg4OEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+PDw9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWmFgYB+gIKEhISDg4SGiYqLjIuKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNFdoV/gIGDg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ojo8ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcnJ0dHV3eXt7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOUiCg4CDhIWEhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw5Ozw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz88V4aDgoOFhoWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD8/QT0+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJgh4ODhYaFhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGRUZGREBCPz1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQERERWOIg4OFhYaGhoiJiYiHhoaGh4mKiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JDSEhKYIaCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTUtIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ozw9Oj9APkBAQ0ZKSlBog4OFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhHRUpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0BFSUtNVnODhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLXlFRUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUhMTVFXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1VSUlRST0xLSkVFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExLTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNGVk5GT1FRVVl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs6UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISUhFRklISUhJanJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f3+AgICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVlZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQPkBWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RZZ1JVVlhVVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVlYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/gICAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFhTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVFJNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlRVWlxtcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f4B/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUEhGT0ZERUZIR0hCQ0hHSEpHQ0JBREBPUE1SZHN1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo7PkA/Pz8+a1FLYUVGSElFQj9HTE5HTVFVSUJFPz48PTw9PT89P0FDQj8+PD1CPkpNRlVudXV1c3R2eHt8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBREJcXU97Tk9PTktMTU9PUU1LTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87QUg/XHR1dXZ1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGRE1SUGFXUlhRUFNTUlVbT09RVlBNSkNGPjo6NjQ4Njk3OTozNjY3OTY8Qj1mdHV2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFhZWlZYWFZYWV1XV1hoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUVBTWldUVE1RU1lTXGVVT1NUUk5LSUhDP0E5OTg4OTc4ODQ3NTc4NTg4R25zdXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk9PVVNUXFZSVVNSTk1MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSkdPUE9PTVJKT1BQUE5OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUkxJTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQkZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUU9KTE1NS0dFRURCOz08PDk9RzY2NzZEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZ1NRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUlNTElMS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPz09QUBCPT5FSEdERkZJR0tKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT09MTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRD9CQz48QkY/Qj9BZHF0d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz9BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVRTU9OV0tMTUtMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5LR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QUEhLRT9CPTk5OTo/Qj88QUJCQURER0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVExKSU1URklJSkxKS0xJSUxNT1BSUEtHQ0xHQ0NKSkxNT05JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtDRkhIR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTVBHSEtGSEtESElLTUhKTEhISkxLTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbml3dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0NGRUdERUVGRUdDQ0A+PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkRCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NR0lMR0VGSUlMTktKSEVPSUNHTUxOTVBNTk5NTElISU9SUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VGRUJDQkVAREI+Pz46Ozs9Oj0/Q0E/QUNGR0pHSUlMSEdHR0ZFQ0A9RUVCPkFEQ0NFR0hJR01QSUZGR0tOT0tGSEpGRURESUlIS0lHSFBLREpNTFBOT05PT05KSkhNUlVUUk9XZGFhbWdwcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRD1CQT5BPTo6PT86Pj5AQj9AQkVHSkZKR0lHRkZGRURCQUFGRkNCQkJERURHR0hGTFFMSU9KSkxLSUdIRUZFRENJSEhLSkhLUk1DT09OUVBPT05PT0tLS1BVV1ZVVFhgXl1pYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJra3NNRkZFSEJCQUREPEFBQEM8ODk9Pjo/PT9CP0BAREZIRUhGRkdGRkVEQ0VDRElGQ0ZFQkVHRUVGR0VKTUtIUU1KS0hISUVGSUhFQ0lJSktNS1BTTkRRU1FRUk5PTU5QTUxOU1dWV1hWWF5bXWRgaGJqaWdrX2VlZ2NnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRkU8QENCRDw3Oj0+Oz46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSUpMRklIS0hFS0tMTU5PUlRPSVNVVFFUUFFNTlFOTVFXWlZaWVZaXlpYYWBgYF9oZWNgZGVoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vcnN5TUhIR0lEQUNIRTxARUNFPTg6Pj48PDxBQjw/PkFCRkNFQkJIRENERUZGR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEpNS0lOTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVxfX15gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCRUdFPEBHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRHRkhIRkhISUtKRUpISEtIRkZMSEhISkdMTExMTElNS01OTU9MUFBRVVZXT0pWVlVTU1JRTE9SUlFWW1tdXltcXmBfYWBiZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvdklKTElMR0JFREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRURGSEVJRUZFSUhGSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk9OT0xPUFJVWFZNTlRWVVNSUVBNTlRTUldbXl5fXV1gYGFhYWBiZGViY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3Z0dXV3dnV1dGVxc2twcWpydm93Sk1MS01HRENBRDw/RUVFQz1BQUNCQkNGQkNEQUFFR0NIR0hHRkpGQ0dKR0dKRklMSElKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGVhYWNpbmhiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdEQUBEPj5ERUZDQENBRURERkNDRUdDQklFQkhKSkhJS0ZES0pHSElJSUtHSkpPS05MSUxISk1LWmZKZFxLbFJIT05fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDREJFRURHQkZGR0NESkRFSkxMSkxNR0dNSkhKSkhLSklLSk5MTU1MTElMTUxbc2JkcF5sbFVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXHB1Z3BNSnJ5dmtiYGtlZW14bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9CQj89QkZHQkZDRURFRURDSEhHREVLR0dMTU1KTUxGSk5ISUtKSUxKSkpLTU1OTU1NS05NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcYHNscWpVdXl4cGNea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPT8/RkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklMS0lKTUlLSkpLT1BOTk1MTk1MXGhkdV1scVdsTk9RbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0d0lNR0lERUVDQUI8QkBCRkRHRkxIRUNDSEtISEZKTExGTUtMUlJMR01NSE5KSUhOSEpKSUhOT05OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNnYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0JHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpMTU1MSUtLS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3NISEZJREVERkFAQUVEREdCSEpMSEZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSUtLSUhKR0tLS0tHSEpKTExMS0lLTE5UW1xUUFRNUE9OT09WUU9PUU9PUUpKT1BRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdJUEtMT0tMV01JRUVISUpISUtITEpIRkhISkdHSUVGTEhJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R4eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRUpKSkdFSEhQSkxNSk1TSUhFQUhGSklLS0lMSkhGRUpIRUZHRUVKR0NKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY2BZX2JbYF5bVFhYWl9eZGJiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4dnJ5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRUZISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVBRkpEQEpLSU9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJiYmNjZVpSWVZVXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUxEQ0tKTk1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRERAREFISUE/SUpHT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlBQXV9hY2NjY2JcZGNiZGNmWFFVVFNcWFthX15fYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdIR0dKRkZGSUxKTkVDS0pMTkpMSUtKSElHQkhIUU1LS09NS0tJSEdFRD9FQkhIQUFHRkRUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYGBiYmBjYmJkZGJYT1FRUltTXF5dXl5fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSUtOTExJTEtJSUdESEtRT01MUExNS0tISUNFQUVDSEdCQUZFQlZVRVxUXlNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXGBgX2JjYl1iYldfX1RQT1BRWFJdXFxdXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUERXX0lHR0hERk1KUFBGSklKS05MS0tMS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENBREVBTEhDTExQT09MRk1GR0lKSEdMTE1PUUlMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVteXmFhZWZjaGNrbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5MR0hZTUdISkhHTkxRUUlMSktLTk5VTk9LS0xHR0tQU1NOUE9OT05PSEtFYEVEX0xEZmNETVtIXlxzbU9NVm1ZTENQYFVsV2dKXVhWXkRMUVVMTVRWUVJUWFdUWFVUXFRQZlpoaGRZVGtUV1ZVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVElLR2BUR0pPSklPTVJRS01LTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1hQbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZWl9WVVd/anR1dV9hdl9YYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoOEgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSUxGUlZMS09JS1JYV1FOT09NUVROT1FQS0xPR01QU1taVFFST1BQUEpIWnhdVHhkaFlSVFF2Z3RscGJuZmtRck9Nd21qcnBzcnFycG9wgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3N8fW9+eW9/cmBgYGJhWmFgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUE9NTUpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUVRQUFBRS0dmeGxjeHFtWkpMVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Bnb1h2dmp2dXCAYXNofWlseHxvX19fY2JbXmJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN2em58fXl4cm5OSlN0TkNCRVBQSUtLSkxQT09PTVBaYFpYS1RXUGFeUlZRWVNNUElTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaGFWbkxxcF5GaHlXdlRLaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLW1ZIR0VHUlBKTE1LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VVdsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraGxtcnxrbWhre3RtbWttT0dKS0hKSEhSUUxOUE1MVFNST1NTV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT05MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VTU1dbV1hXWlBTVVdXWFFdWFZdVVNPWFJXV1dYWmBbZ3JeW1xbXV5fY1pfY2RlZmRjY2JZY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlRSTVFRUExWVVRQVFVYVVlVUlpdVlVUV1VZWFBPTE5XVFFOVVNOUE1MUVBLSlFSS1FNS0tPUlRSUVFTU0lITU5PUVJRUVFUVlJYV1xXU1NQUVVVVlRaUU5TUldVVFlWVFlVU1JVU1RVWFlXXlpfYV1cW1pcXGBjXF1iY2RnZWRkYVlgYWNhYmloaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFBKS0tOT0xNVFFPVFFRTVhXVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUE1STktTUE1PVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtTT1NVV1VUWVVXWVRSUldVVVdcWVpgXVZZX11eXVxdYWFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UUFBTUU9RWllYV1haWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRUFJYVFJRT01PU1VOV1JUVVVPTk5RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1ZQU1ZVVVZYVFdXVFJSWFZVWl9aXmBeVl5dXmBcXGBgX19aYmJkaGhlZGJZYmBiXl9mZGNgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlFXU1NTWE1PUFJUWFVVVVNVWVhbXl1cW1ZST1VWVltbV1FTV1VWWFVTWFpUU1FZV1ZcXltfX2BVYVxgYV5gYl9cYF1jYWNnaWRlYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXl9bXl5hYF9iXFlgWlFOT05WUVBVU1BVVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUkxRVFNZWldVT1JOU1hWVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFZWXFxWUVRWVlhZUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dW2BcYFVcXWlqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVtZWlNPU1JWVlVTT1ZSU1pSVFVUWFxXWFhTWFxYXl1ZW15UVU5WV1deW1hRVFVYWFhUVlhbVFNWXVldXWFeY2NeWWBbZWJfZGReXmNjYV1lZmlkZl1eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYF1bXFxbWFpbXlZeWV1QT09SWlBaVVVXVlRUVF5eYF5eYlxgVV1eYmt5dGx9bFpVWlVRUVNcVFRUVVRWWVdMUlpWXVtcUk9VU1hWVlNQWFJTV1NXVlZbXVhbWVVaXldfXllcWlJXUllYWV9aWVNUVlpZWlZXWVxWVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllaV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxYV1dWVlddWFBVXFleXV1UU1hSWFZTUlRYUlNWVFhYWF1eWF1bVV5fWF9fWFxWUllVWVpaYVlcVVdXWlpaWFlaWlhWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1aW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZUXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2haXFpWWFVXW1pZW1pYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXWlpcX15aX1xWX19aXV5ZXlZTWVhZWl1iWl5WV1pbW1taW1lbWVleX2BgZGNkZWViZFpiZmNnZmVeYWNgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWlhXXFtcYF1WXV1TUFZaV1ZaVVhVWFdYXV9iYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcU1ZYUFZWVlZWVlNWVFhcXF9gYF1hXVdgXlteXFteWFZYWFtbX2BcX1hYXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYWBlY11maWRlaF9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWJjYl9hYGFfXFxdWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQWFdYWFhXVldWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgX11fWVleXV5eYV1bWllcX2JfYmRkZWZnZ2JaZGZnaWdjX2NeYWZkWmhpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmJhXWBYY2RiYGNhY15cXFxYV1tdX11gX11bYGRcXFhaY2VjYVJcWU9YV1lbWllXWlpgXWBiYmBhY19cYl1fXVtfXllZVVhdXV9gX19bWl5eYGJjXFtXW11gYmJjZWRnZmVnZFxlZmhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddWlpfXVxeXFldXF5fYWNiYWFdYltiZGFfY2JiXVxbWldYanFgXGBfXVxhY19eWVljZWRhVF9aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJfXVNcX2BjZGRmZWdmZWZlXmVmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t6enp7fHx8fHt8e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t6ent9fX19fH18enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiI2xtbS0tLS4USYrKysqIovb0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyLkbvAv8DAv8RJFBsbGxsQju/l5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIOBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl5eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9gIGBgYGAgXdzc3Nzc3N9hYSEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXZ2dnp7eHt4d3Z4e3h6eXl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t6enp6enl6fH19fX19fXt6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8ent9enx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x7en15fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3ent5fHp7end4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp9fHx9e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4e3p5e3h4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOEhIKBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKFhIODg4GDhIWEhIWFhIOChIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCAjYyBgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGCgYKBgIOWloOAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIKDgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCCg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgYKEhIJ/fX18h5qYhoSChIKBf4CCgYKCgYKEgoGBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4OEhYOBgYODi4iFfnx8fX5/mZqGhIWEhISCgYCBgoOCgoSEg4KCgYGEhYSDg4OCgoOEhIODg4ODhYWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSDg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gIaakYZ8gn+Cin6QmoOBgoGBgoKBgIKCgoKBgoODgoGBgoOFg4ODg4ODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWEhYWEg4OEg4SDgoaUlJKUko+Ni4eEhIODgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9+hZ2ehYOLgICFgIGJgYGDgYGBgYKEg4GBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICCmaGHhIWIh39/foGEg4SCg4ODgoCAgIKCgoKCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIKQnIOAgIGBfn59fYSFhYSFgn99fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4aLgYB/g4uBfX18g4eGg4B+f35+f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4OCf3+Fh4SBf36BhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4B/goWCgoSCgYCAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIOBf4CEhIOBgYGBgoKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KBg4SDg4KCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWEgYKEg4ODg4KCgoOBfn19fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomIg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4OEg4SRkpGOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoWAgoSDg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+CgICCg4ODg4OCgn99fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59gIKDg4KDgoOCfX1+foCAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB/fX9+fX5/goODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAfn5/f35+fH5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39+fn9/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgIKDgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fXyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4WEg4OEg4WEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICBgoGCgIGBgYB/i5OPjIuNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYyMjY2OioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNjI2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyMj42LioaEhYSEg4ODg4KCgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWHhoeGgYSRjoyLiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXt9fn5/gICDh4mJiYuJi4mFiJGNi4iJh4WFg4KCg4SEg4KCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLi4mNkY6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY6QjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgIKBf4CBg4F+foB/fn6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH6JhoaFhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHV0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCg4KEgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOBf4CDgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH5/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/f39+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fX5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SDgoKEgoGBgoGAgoGAgX9+fn5+gH59fnx/gICAf4CBf3yAfoCAf4GAgH99gH9+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHh7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fYCAgYB/gIGAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn5+fHt7fHx5d3x5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+gIF/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4GBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx7e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhIODhIGBg4CCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGAf4KBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OCgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISFhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF9enx8fX18ent+fn6Af3+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOCgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2Bgn99fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f398fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4OCgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn5/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEg4SFhYOHhoaEhYSEhYSFhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX1+fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISDhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4KDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH98f318gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChoaGhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImKiIaEhoaFhYOFhoWGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWGh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIOEhIODh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFh4WEg4SDg4SHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYOEg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9fHt7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4KCgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gHx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWHhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhYSEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6enx5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIOGgoWBgYB/f4CAfn+Agnx+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhYSGh4WHhoaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH19g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX29vb29vb29vb29vb29vY1tfX19fX19fW1tbW1tbT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI+MjIyMjIyMjIyMjIyJor+8vb29vb29vb29vby/0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxaVVZWVlZWVlZWVlZWUnyuqqqqqqqqqqqqqqqosNLS0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWeX1laWlpaWlpaWlpaWlaAr6urq6urq6urq6urqrHR0tLS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqo2hkZWVlZWVlZWVkZGRhhrKvr6+vr6+vr6+vr6620tLS09LS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Pzs7Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMzMzMy8/T09LS0tLS0tLS0tPT0tTU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7OztDU0s/O0dXU087O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fW19fX19fW1tbW1tbV1dbV1tbW1tbW1tbX1tbW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs/KlqXR062Dg5XP0qSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/PnKqdrcuauriZtbOfoanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Qy5SImp68ooyAjcWemJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9G9yJmbrKCIrNa6maGdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0peUorGorZumspmWr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P07ObxJrBop2Vp5CahJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NHOjZCexKe0q59/oKmFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRy9qombDO2sGcgLytppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTc5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyY6lmqCnkaGfoJmolpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyruhpqeet6Sro57DoKuknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTnpCNttmnj4+s2MKPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dK6xNXS1b+/1tLVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS1dTS0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ6enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPW1xkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqSpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaepp6moo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6qqrKioq7CpqKqooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLavs7CrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FtaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1try8vry8vsa6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NDREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9taHF4b3lqaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGw8TDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N5ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8PBxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMjJx8XJx8jHv8XHxMTHyMrTz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwsnBysrIxszKzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1b3RiXWJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcLDv7++xMvIysvHvdTTx8jNyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2RqZWFqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7m4ubu9wcfBxM2/kMvGxcTBxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vcS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJnY1taWlxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vcC5vrq6tMC4tbizrrq7tr/Rn4jAzru/wby7xL67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrq1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb7Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJiZ2pnZmllaV1WVlRZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBQEM9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3sK23trjEy4yFm8i9u8O1use4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoaKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtoWFhOS0tLUklMSEM5PTg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube5uLC6tLm8ybqDhYa1xL7Ht7m4rbe1uLq0uLO7xcbLwbzGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7mxvb67xLa4pYeAi3uOnMWjfIOFscvGz8LAuK61tby+uLqyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRueGNnYltjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrq6OwuMnTtrq+vMa0onhlcmVVYGaHjX2Hh6rOztHMysS1usDDyL++tb/Bv8bGv8vGw7/BvMDDzMrHxcbAub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRDxBQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxs7/LyNu+vb28gWp2YGd2XldWXHOAiYuozMjMy83KxsLEy87CvLm9ubnAw7/IxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi1vLXGkHHB08C0fVtMb2FQfH91YlZgfoaRqcbCx8vIwcPBwMnKwsC7urC0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysq+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru70pdyg7XCm1hUVo1iUmSAhIVtSXKGl7TCvb/GwLnAvL7FxL29ubKwrri3v8PHw8S8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVtfYFlTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz5DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wteYf3KLrnZST2yZWlJVWpqUd0xujqK0uLi4wrqzu7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZl1aVEo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucPVnYl9eJVgTmqNdV1RXWy6tXVUV4+4tbKxt765srWyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cWxfY2FbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAyp+JgX2AWFiSj2dxYHdyepd3bmtfi72zsLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWZYXF1STk1BPklCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4ucWrlYmMeExmoMN9hpuQXX95bHV5ibG6tbG0tbK0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO7t5aToIpNaJKTdm95cmhpa3aBd3ilvLiytLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsremnaiTWIBwc21ka19ZV1hbYl9sgZu5sq2zr66srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mopujnJWQjI+PkJOQl5WWmJ+enpqYppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdQTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKmwwLGzfHh2cnRlV1ZPSUlLTk9PXGtwprWqsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZmqOZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSkhHT1JOSk5HPEVAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamhpsfEpmFmaXJgUk9KcFVWSk9KTFReXYG3r6+ztaqnrKuinJmUjpGWl5mZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR5eWBiUlVgSUlKS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnpy7vH1vaWphVEpXcJyLellMRkdOVFRorrKwsLispqGcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysbSqsq+imZydnqGZm5uamJmblJablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk9PVUxTTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKcopueqauWfWtdVE1NXJ3Ey6lvWUxFQ0dNYZiwrayvp5+eoqCXkZOboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6koaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmZ6boaGjim9fVVJRVWnA49K0nYdvWUpFVJGYnauqqaSfn5mSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6ilpJ+dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCV05KR01HQ0ZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjondZUlFUVmiDwMyzmLHIsJSKmLnFoqmtqaqln56eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Svs66qr6Odq6e2sa2isKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rxa2t1cnBoV1tRRVRIREpQSD9FQTRGSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian5+aoZ1oUEtQUWmBnLW6p4ez4NvW29rItK6no6OhoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLBxr66tLq6tLu3sLWyqrqyrru3v7u6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Rob3hqZFpbRktMRURTTERCRTc6Pzs1NDk5Nzg+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGinZyVXUxHTlh+k8C4pJCY1eTb0cS0pp+anJuenpmXl5eSjI6Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0dLVztPJvcC/w7vGxcjF0tTN09DT08zKwsbGx8rIzr/I0czHxcfFwbzDwb6/vrW+s66/v8LDx8THxK6/uLK4vMPBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jn5yelmFKSk5mirrX07+vwNTLua6oop+dn5qYlpSSlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTW2NLXzcbHyczDxcrPytPX0dfS1dbT08jMx8zNydLNztPNxcjJysHGy8fIyca/w7OzyMTLysvPxsq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoKR1XWdtjbzY3NrWy7qyqqOdnZ2hpaCdmpSUlZSJfHdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ1tbW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1tbZ1dfT1tjO0srP0czO0MzSz7/Ix8rDzMzMzs/Fxse2v8q/0c3Lz8bJyL/Dw8jOzM/Qz83Kx824t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkdBRUhJPjtBOD00NTg1Ozg2OjxAPjs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSln6Osin+Ts9LV2trPvK6om5WYoJyboaKfm5yZlYl3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dfX19PWz9XU2tTUzs/V1NTR0czRzdTX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1dbMz8/KzdLLztDAxsLHxc7N0dHRyMzNwMrMxdPOy87IxMrHxsjMytPT0dXP0szTwbnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGlnICUlsfY09bCraahmJWXmZudoJ6ZnZ2TfXFlY2NfX2FfX2FgX2BgX2BmbnBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxtHUytHU1dbO0tDY2NjXy8jOxMnPzMrMwMm/x8nNzs/L0M3OzM7PyMvQ0MrOysLJx8nMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNV0U7QD0zMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2pp39sgZTT1s2wm5uWlZebnp6fnZSWmJSIa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPx87NzdTMztPNy9fW0MzR1MvM0NLTys7R1dLV1crAycHFzMLIycLMw8XIysrPys3M0M3Ty8bIz83Ix8vFxsHFyszNz9HG0M7NzczPxcfBuLm9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeXBxa21nYGBwaFhYaFZMRkxJUFBCO0M+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7SooKpob32n2dCqlY6NmJaRk5KRlpaWkIt8ZWFiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0M/FusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS+wMfMzMvOwsvLyMfL0MTFyLvHw8nIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raWiX294udCrkI6Ol5CHhISEgn6FhX9zYFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMvNycTCy8nBwszQxcvIv7nBu8bHvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa8vMDDxczFxbvAysLFx9LFwcm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWbo6CblHt2c3RmaVphbmxaW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKykV9ygL6wkIuTl4d7gYWGgHZ4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrG2urKys7Kxwry8vLq4wcHCxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw7+8wc3Dxr29tcG9w7q9xrvCurO8xcTBwra/trW9v7vMw7y1usi6v77LxMHGwsbJxsjG0MbCzMeyx8nDzs3BxcPAvbO3sLKnqKi5sKWtsKqtrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7RysrKx83NztHI0MbV1NbXzcrPxcnFx8G5xb2rr4NjdY+1koyJi4V5gYeHgH6EfHR0Y1tcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i1t7Szs7S8tr2xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wcK8uL3GwcO7ta6ytrq/tMS3u7WruL29wL2xuravtrqzxby3rru/tbe0xby+w8XAw8XGyMvFwMbGu8jLv8/Kx8PGwsO3w729trm+x7+stbq1t7aOeXR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrEz83Sz83Fx8HFwL66uMm2qrCBa3KZnI2GiYp7eX6Ghnd4gn10aV5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+4uLWwq6ynnqKqp56rrbOtqayptK+3sLKprqassry6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCxwLa4vbCwp7Kztbu8q661pa61rruysKm5sK27rru4u8DAvbnCv8fDxcG8xsLIy7jFx8W/xsPDusTGwrvGyczLs7nCvLuziHN2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fNwcPGv8TEw8PKwsnKvr+8wLqytLTDrqmuhmtkipKIjpB8eH6KhXp7hIF3bl5dXF1dX2BfX2RjYmNjYmBfXltbWlpdWlpaWlxkbm9oZ2dpa25yga25sLWupqWnp5qgpaGanKWrrqSooqyqrKqvo6afqq21trG9ua+3r6muuLS0vLi0vK+3ubWyu8GywK6lqaKrsbK0qL2qq6irrK20s6aorqGkr6mypqeorqaot6yxsre6uruyvL2+vsS/tcLBx8i3v8DEt8TCv7u/xMK+xMjMyr++xMDAqYdzdHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvBy767yba9w766yrfBw8G0tbu1sK60u62op4hgbY2DiIuAe36Afnh0f3xzd2VfXVxcXl9gXl9jY2FiYGBfXl1cWlhaW1tZWFpcX2ZrZmVnZWlrb3KFqqWspaCcoqWUnqWbmJGho6qkop+lpaelraCdnKWmrLKvtrensKuoqrSrtLqxtrWutrmxr7q6sbakoKSfprGoq6i5qqSnqKinsq2gp6afm6SmrJ6fp6SgoLGtrayytLK0sLW8trvBwbK6vsPBsrm5w7PAvb+1uLu9vrzCx8TCw77AxKCDeHBrYWZfa29gVFleSE5nT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbWgnpWdoaa6tquzs7uzxM/Jy8LGuLfHwcy/uMm3u8W4s8S4tL7Aq7W7saukrrKsn6GLYYCHhoaBfHl1dG9ta2pqcWleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlpuilpyjmZaNnqGjp5ufn6Oloqiem6Kbn6uwrLG2o6mqqqyspLS5rbewrLO1rrK1rrCqn52fpKKypaapuK2ipqafqKyrmZ+gnpmdn6WamqOcm52vqaunqqusrbGyuK+4ubuwtry8uquzs7mzvbS2sbG1tL+2vcC9w8G7u72Xg3tza19lXmRkWFRXXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7xMPPvrnHuLe+t7LBtLG7u6u4ubChnaiqppadhWaChYZ/eHJucG5rYl5iZmZdXV5dXV1cXV9hYWJjY2JhX1xbW1paWVhYV1dYWFhYWl5iZGRlZmZoaWtyjaedlJWVm5ibopeWkZyjoqidm52lpqKmnKCgm5iurq2usqCloq6sp6K1sbKyrKivsqe6s6a1oKKem6OiraOiqrWqoqOmnaamo5aZnpeZmp2gmpeenJybrKGrp6Okpq2rs7SqtbCzq7K5tK+pr7Kys7ezrqmsrrK4sLq2ur2/t7OxlIV5dWVeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lo5ilscK1tr2ttLjCzMjGwMW2wb/HzrfAxL2zubmyv7axuLqssbStnZijqJ6RmnppgYOEf3hvcXRxaWZkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanainJSUkJWXl6CXmZWYoZ6hnJahoqmkn5+pnZyaq6evsKqbo6S4qqGgrqi2qqanrbCkt7Ckt6Cim5mZqqahmqy4sKKhpJyin5+TlKGUlZabmJeWl5yVn6mdqaOhnaOqqrCuqLSrqqets7Clq66ysbCwrq+mp6eyrrG0sLy0ubeuo5SBeXVkXmFWWVdTUlRLTV5MT0tHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64va6dp6ijqrvAvcC5rrS4wczHxcLDvcW3yMyywcLBrry7tbu8tbi5r6+vp5uYn6eSj4pyeoB8d3FpbHJ0cGloZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2NiY2JjZGZqgZaTlYySlJSbmZ2Xl5ygnKCWoaCmpaSmp5+dn6agqq+mn6Kkt6ihoaKotKKlqKWwpbCtq7SeoJ2VlaqhopStsbGfoqOdnpibk4uhlJGTmJiTl5eYl52mm6ehopmjpaWrpKWwp6Wjq6utpqiur66rqKqps6WmrK+0sa+8tbGvrqCSenZyZGFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsbHtsbEs8K/xau3t722vbu6tbKrq6WYl52hiodxe4d+dm5jYWZpaGZnamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtaWVpbV1VYV1RUVlVTVFJVYGBfYGFfYGFjZGmBlJOJkY+Uk5SdlZaXpJmgl5ygpaKtpqSko6OinKqrpZmfpbGqoKGdpaudp6Keraypqa2soaKilZijm5yQq6mwm5+in56XmZOKnpGNkpOWkJiYk5yhop2koKGVoKKkppujq6WipKqkq66lrbKppqWmprSmqaits7W0ubqvqayei3Jwb2BbV1ZVUkdRT0haW09SSlRLU0xFRklDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvbG+xMmssbjBtbvAu7SzqKmklJiZmod+cIeDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl9fX2JkbY6QhJGHkJGPmpOVk5ybo5yboKipq6isp6ilpJmlrqSUmaWvqZ+bmZugnq6Zm6uzoKWmn6KjoZWTm5aWkqmqrZqcn6GgmpSQjJmOi5CMko2WlZCeoaCjnJujlZuho6GXoqijoqiroKuvo623paOjoqytqqirr7O3s761s6uvmIR0c2hbWFhSVVFFWExRW1hNVE5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtqLO2rqmnr66bqaist7asvMq7tr+sy8bFuMHOz8izxLu3u8PIsa24v7e8vbqys6OnnpSVlpSFeHOAdndubWhtbm1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGR+jYGLf4yQipKNl5GXmaKgm6CsqqaurKivpKian6yglZakqKedl5CPmp6ulpioqpmfnZSloJ6SkJKRk5Wnq6WamZmenpWNjIuThoiNg5CLkZWRoJ6ho5eVn5WaoaKelJulpaeoqKCxsKaxvKefo6y0q66nsLWwubXAsa2xq5B9cnNiVlNWTlJJRlZQUlFMTFdNSkxOUkdNSkFDRkRDPkA2NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qmorCrnaqnqbKxpbbGtLm6s8rFubrBy9DLsba4vL7Bw7GwsrettLO6srGhoZqblpWSgX52a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipeJlJSYm5meqZugqqalq52omaGlm5OPn6Obl5eFhJKbo4+Uo52WlpaIopubk4uOipCapKeclZWXm5GRh5SOi4GLjX+QipKSkqCan6KVk5iYlaKmmY2ZpKaopqGftLKosrehnKK3rKqtpLKyprW8tqyrsaOJeHNtXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrGlp6OppaCopaSzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatua6rnZiZm5SShXqBbV9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRhI+LlJGUnqGPm5yjoaOYpZeinJWNh5iajHONg36Nl5aGkZmQlI6Oe5mPnIyCiX+KmJ+jnpCTmJaFjYKUfn50iY55kIeTj5CdmpmakZWQnY6io46JmqChpKSborSvrK+sn5iluKamsaGxrpywvKqpr6qZgndzY1ZNUk9QTUNTTkxRTUJQUUhJTlJNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6emtMG4sLSwycS3ucHOxb6zrLrBq63DraiippKdprWroZyOlJWRjnx2fWVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKQg5eGjp2Xi5SQn5idlZSWlY+WiYCTiV87V298i5SJgIyRjJCGhnOKhZaBeYF6hZSdlIOVjpGQg4Z9k3hxb4WNfYmBkY2Pl5qYk4qPiZyHn5iHiJaemqGgl6evqa2oqJ+WrbOipq6ZrKuYqLSiqa2jk31ybmBbTlNSVkxEVEpQTUxGTk9JRUxRTUtPSklNT0ZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaejqbCop7TBubG1sMfCt7O9z7+5r661wqeqxamjnZiDlJuuoJiVhJOOioZ7cnRcUUxSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkB/lZGRfYmUjYSKjZuNlpWJkoiGlYZ5iH9gSlFueIqRhH2EjYqFf39ufn+Ud3V1d4SNmXBRjYiKhnt+eJR2aHeGiH6KiJWKjZGSlouEioiUhJqMgoSSm5aenZSko6ippaSem7CqoaSkkaaqlqKqnKKmqIl0bWdeW0hRUVJNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foq+hp6ilp6ivraq1vLa4t7PBu7anuci4tqiotbaqsrymnpWOf4mTp5WUiX2Ng4F8dm9tWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYyTgZKZi497ho+Adn94c251cHSNjoF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4F2cnKSd2d1hISEhHuViYiKjIuAf4SLjH+Ug3yBkJiVnJWRn52pnp+gnaCppZ+dmI2npJOhn5aenqSAcmhgXFxKVk9SR0pYUk9KTE1SSkpKTFBJTFFMUlRMRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTQ3Nzk1Njc2MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppa2ssLGqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjpSBjpuNkH52hXh7dW9uaFhLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g315Z3eNl5iNj31oeYF2eICJj32EmJKBcYePfHd7b2t+rX1zkIt/e4aSgX1/dGZ2fIZsb2hzfImMiIBseXF9cG11j3FpcYB+jnBDi4SCg4V/d3d6i4V+jHt1fo6Sj5iKkpqbo5aZnZqdnqKdlo2KpZuPnpeOlpiPdm5tZWJaV1dUUUpTVVRPUE5QVktOS05PSlFOSE5PS0VDPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsK+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZj4SSeoiNiop2cX1udHBpbGlXS0ZHRUFAQ0RJTExNUVJQUVNVVFRVVldXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ6fX57dm90c4WCeYF4cHyOjIqUg5aXmJqQk5aXmZeel4yDiZ+Ri5KNhpCWfm1obW5uV1VXVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzs5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2woqyqqLWvrqy0v6u8wr+mopmVpJedjYSLlKGhmJiRk4tzjnqAhYuGdW91bHBsZGtqWE5FRkNAPD4+QUZGR0tLS01QUlJSVFVUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV/cG1/eouJdoGIhnRsmpJ0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcYB8Z3Fxe26TjY97c318cXBudW2Cf3h5dWp5iYKIioSWk5KQi42RlJSPl46AeYiXiIaKhoCQh3Zqam5nZFdRWldZWVtNUFVWWVhOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6a6r6uysMKxu8PHmpaPlJmLjYV5hJCYlI2QjI+GcYeCdIeMhXlwc3Fub2RwZl9URklDPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4GFgXqEhoZ5cqGVdHiBc3WUhzVxnaidjqGhhKKFdnCGfId8c4ytjYmAZ2Ziam5ybXCDdWlvWHVwjpqSd2x/e31tcW1wgHpzdm5jdoR+hoCFkJGKi4mRi5GMi4+DdXiLj4B+g4B+j3pxcG9rX1pcXVtZWGBfUk5bWlhXTEhKRkpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGepKeer5Wltaqusa7BsrvBxpaQjJSQgIh9boGQkomDioePhXWChGyViId7dXh4bHdud2NpXklQRz5ANzQ0OTs7PD0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoGFmYSbnGGGqp+di4OQjnp3iH6JiI1zipePhHpdZHF0ent3imxnamJ5b4WPgnpugXd0hHpwdHp3a25pXneHfYd8iIePgIuSl4ONhY2HfXGEf4R8dXd7fYl1b3JzZWZfW1tdU1tmXldRVVhbVUdKS0VLRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXI9MjMzMzFFflc0PTlcjHiKgJSMkp2dn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4FzoYSLfX2Bf3CAfnpndmtSV0xARTIxMTM2NzY4ODo8PkJFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc218gYaHfY5oZ2h4fm6Fh4KFcYSFR2uAd3J5dmhta193fYOJf4iFjHqVnpuKi4iRf3p1i3Z8d21vd35/c3JxalpdXFtjY1hmZVxVUFBWWVBETEtGTklDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJicrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NWS0I2MC4vMjMxMzM2Njg6PT9AQkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYmRgZqVgqChl5WbmqWtk5q7sae7x8OoioyhpY+UiYGRe3KEnp+RnH92hYWKj4iQamhvg4B1jYeEi3GGgneHgHt2hX1udnVngJSPhomIiIiHoauhloqOmH97gol6em9na3h+eH1xamNdWlpdaVxhZl9ZT0tOV1JRSVBKRE5HQ0tEQ0BEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjICBkY+Lm5uknKGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYuLgomNg3+Jf2xwal1CQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSEpMS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6KflJmShIqFj5iRlmxwdYmLgpaMjY92j4RxbIWBipaSg4WIcomhloeTiY+PlqW1qZuNlaKDh5OEfX9ramt8gH+AcmFcYl5ZZmpca2teV0tHT1NRTk1MRklQQ0RORkJDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpiWmpSfn5ynoKqWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioWYkpGCgICLjYmFkIaEiIV4eH9nTVI+Ly4uLC8uLS8wMDAyMTI1NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWcn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJSShZyhmpqZp5GRiJWimpp3en6UmJKhkpeXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNzfH56cGdgW19eYWZjYGdnXFFFSktQT0lKTEZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNio6Me4qGj5COgYKAiYyKhJKFgoaIgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrS9uKWurKynqLSssLeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2rpIuWmIWmpqCil4GmmY2iqqikh4WTpKGgqqGkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlq4iaiZKKlnp7foR9Zl9nW2RhXWNjXmZmXltPQ0lIVE9GSExGSkdFRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBlIWIgpuDkpCNktrInZZzVpeIj4icj3yGjI6KiXqIgoeRjoOFgIuFhoeShoKEiYaHh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSU1VVV1VOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Ors8a2rLPAs7m+tr+0wba7u6S4xqm2yce2vrm0qKO0rbGxnJqSmp+Jp6+rpJV2n6SXoauxs5iWqq2orra7srqsr7Wisayxtby3ta61oKeoo6ibqbCtsrq4uKebt6mNpY6Rk6CHeYGCdFhgY1VlYWBiX2BlX1pVSkRFTFVRSEpKRElHRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoV+gI17v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhYGOf4GJjoaAhoiFioeRenhuXVZARU08Njo0NkFCNzY1MC82Q0hDUVtPUVVXVVxXUF9VSUtKQUA/R0tGRUQ7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczJtrzFvbOzwLe4wrW/sLh0srSmusWksMa5sbOxtKiktbaqsaCilpuikqWxrqatrKekmKCss7qiqbK6tbu+zL/Fxb29s8K3uri/t7q3uaytsKaxqq2+sL27wsKsmbqolK6PmJiriX6BemlWYWBXaWRoZFZaY1lWVElHR0xRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFlVWndqcH+PhIGOhW56cnmIYrihmaOJlZOWk5OTjZCXkoeHe4aBjZWKgISAiXp8i4eGfIqCgYqDlX13eXVlT1xkR0VMOlFkYVteU0Y/O0hQRFpkUVFZWFlnWlRgYE1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tMU1pUXZOvuLW6ucnAu73JzLu9wLy3tby7t761urLGYHWzpbGanqu9qqWoq6qjorK1oaunnpWWn5mfrqWnp6WepJSip7Czp7KyvLbBvdPJytPGwsXMwsrDwL69v7y8t7Swube3w7rGvcPJsJ65qqKsj6Wot4mBfnFeYWFcVmFeZ2VSWGFWUlVJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBQUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1obGxxkI2FkHNsc3JziNXAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWi3+Df4J4eouDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1eb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZcWluSucC5vbfGwLu5ysu6trq2uLmzuLW0rra2mWR1qJ6tcF6irJyYoaObpJ6rpZSfn5CUjpaYl6ifpZ+fmpmDpJ2spKqwrbewvbnU0c/Xz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/Iz7Sku7C1sJusub2afnhrXF9cWV1hWWJiUVtgU1FLQ0JFRkU8QEU+QkhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkZRubG91dYizrKGhn4uZnJmMjJWRm5KFiop+iIeMkIuJfIGEc3uJg4Z8iXSCioaVf3N7eGxtdXtocmVpbGlmamloYGZpaG1abXSXraS8iIdnW29oXVpZVEhKTlBKS1FMVFFJTEFKR0tQX19iZmlhmLfHsLmzu762ssTHtrC5sbC7rLOxp6q3rI22p56bp5pPm52MjqCWkaaYpZWKk5OJkImPkJKem6GYm5WWh56Zppusr6ivp7O01NTV1tLLz9PVztPPzcXCytC/ysnLydLIzc3C0NK4sMS8xLqmtrvEooFtYltcXVhgV1llWVBcV05RQ0JIRUJIO0FEPkFIPz9CNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDk9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiDaHFveXmDoKqeppeNm5uXi42VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj31xeHVscXh+cXtteHNsaIBwbWNpbXB5aXd9fsu/wt+nbWN4bmNbYWBKUFJVTlleUF1dTlFOVFFVVFxubneCcpauuKy0p7C2q629wLGrtaaluKesrqGstKOOsa6amJiMkZSRhI6bgY2mkZyJg4uEiomEi4OUlZiXlJuRnJeZmZ6eq6ykp6GsrM7S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxsDOx8jDqb+40J14bWRcYVxWX1JdWk5PU1BOSD5BRkJCRTxAQj9FRT4/Pzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd213cH1+gKGenqGLjZmTk4yLk4+WhHmFkJCNi4qIkYd/gntyfoCCh3qFdYWTkYl/b3ZzbHN8e3Z8c4F3cWqAcnJpb3F6eXJ7vsuafoyxg3ZyhHZoYWpdQ1paW1ZmZFhla1RYXVxgY11jeHt/i4GZqqSkoaChqaaqsbmqprSjoq2io62ip7GfiaaalJKRipKOiIKTiWuVoo2YhIGFfpGDg5OWrIuVjZWZjoWSkJ2Xp7ChoKCkpKjHzc/IwsvQ09HU0s7TzcbW083U2NbW2NXX1cnU2s3J19bRyq3Ew8uJcW5iX19XU1lSW09KR0lJSkA7OjtFQkQ8QkQ+SEI/QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeXKCiYGdlZ2UhYuWiY+KiI6Hj393hJSZi42IiIuJfoN4c3t9g4d3gHuHkZeBg253cG11f3Z4fXOFfHlsh3Z0b312hHV5e521jDxBisalfo18aWVWSUNlY2ZjaGpkb3lbX2Zoa25pboCDiZGLnZ+gnZCXmJ+jo6aypKSzoKKlnqGpoKKxnIaekpKSkIuOi4aDj4R+nJuMjYKEhXqUfoKplaOMkoqYkot9l4qakauzmJqbp5ynvcPGuLbGzdLQ0tDM0svJ1M/R1drX19jU2djN2NvOydra0ta/zMy0dnVtY1xZUlVQWVZFRkpJRUU9Ojc6QEFDOkdFQEVDQURBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NTQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgod8eIWWl4iPg4eGh3qEeXF6e4SGdXqFjo2deoxwfG9wen9yfIFxg4eAbo56dXd9fIJ1f3yHiLB0WKnCtoySgXBuYj1eaHJwcXBueHeCZWlvcnV4cnuLh46UkpuWoJaHjJOboJufqp+hrZyimpmfpZ6frJmLmoyRko2FfYiHg4WLjqCZk4iDh35tmXmEmIaIk4yOlYyGe5uIk4+uq5SVl56Ypq62vaitvcbLyMnLy8/JxNLK1NbY19jX1NvX09nb1tDb2tHWyNXMlXh6aGdaWU9SU11IQkVJST5BPj03Oj0/Oz5IPUBBQUFEQT4+Ojg3REI3NTU0NzkuNTY2NDM1NTQyMzIzNjQ2NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfHyEl46Hi36Gh4B3gnlue3uGgXR6kp6NoXaPdYJ0dYF9dICEb4GQgW+ShHR8gYV6doZ7ibfGpMLJt4GVm494cGVOZWOCeoF3hqKQi3l5d3uDf3yEdm2UlpSVj5eQg4mPlpqXl6acmKCXn5OSl6OdmquWkZGLjZKDjIWJiIGFkJGenJmJhYuBhpd7iIifl5CJjYqLgnyhiJCLvKGYk5eZnKimpa6ep7W+wMC5x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bxoV5eGVoY19TVlZVTUtETUM7PT08OTo8Pjk+QTY+P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NTU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXp+gpGJhIV6hYh7dX10bnx9hn50f5KdkZ+DknyGfXiOfXiKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLuMnKOcfYmEfYlyjIp+c6aanJmUhXuPkImEaEdxoaSdjIuQkoWIi5GSlY+dmpOVkZeNjJWfnZShlJKOjpCLfpCPjouEiJKWmp+fiYuUkZ2Rgot/ppmIhY6ChoSApIaKi7iYnZGUlqGnoJ2enaOutrq1q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld3d3ZpaWRWX1pTT05IRExCPT0+OTk7Ojk5PD02QD4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY+KcXJ4int7f31/fIh6fHuLh4J+dYOGeXN6c22BfoR9d4aboJqelJKAi4d/mIeAnJJuh6iFeqCLfJCOg4iEnH6akYqNo6KfkKOun4uRi4WLgZKGV3Kti5+snI+DmJuQkI5cg6KRgoyfk5WMhoiMkpOMlJWUkIyPioiWm52PlZaRi5KUhoCLiZKNioqdlpmjo4aTnZWgi4qIjpyQg4iPgIOHhaSFi5CzmJySlJehoZ6Zkpudp7G4rKW8wcfNx8bPzM/Mz9fP0dSu1tXY2tna2tfW2dmebntzZmVbXFdSVldDQElEPj8+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhtYn6Sg25td4t4eX56gX2GfHt2hoSAc3CFgnt2dnV0hIOFfX6SpqOepaKWiZ2QlJaLiqiXcoqyjYOmkYSZk4SZjKKWoJmTiZqdoZKor5+RlJCOjoiVi26Nt4SaxMiynaKlm5yYlpGykGOkzciVjoaHiZCSjo2TlIqFioqGlpqbj5CUk4eVmISAj4uZiI2QqpeXpKOImZ6Vm4mPh5eXi4WPjIF/ho+kiI2TqJmXk5aYoZifmZOdm6KytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgXF+Z2JdXVxOSVRZQUJHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnaBjn18bX6IeHp+eoKCg352doCCfGxui396fHh4fISHin6Ko7Ono6qzoZann6WjlpWuooOQuJWSspmMoaGMpJuvo6SdmJCnlqeZrK+kl5SWlZCLmJmWoMCOo8m5q5ujpq2YkZudsp2FhaiinJiFiYmOlY2Lk4+IgYaHiZOYlYyLlJOGlJiGhJGQnHSRmLKWl6WhiJyak5CKkYqXm4mKlo6GfYyYnomQkJyamZOYl5+UoJ2Vnpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0NbY09DYunF4dVxfVF9VT0hKTkRCQ0U1Pjo3Nzo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6e26Fhnp8hHiBhYF+cHh8fn1vco16fYF8eIaLiYaEkqe7rKiyva+krbKzqKOisKyKmrSdorikla2kl6mtt6ako5+ZqZepo6+wqZmYnJSVkZegmJq7u67KoWq2uKuwlJmeo6uTl72jXqqygomKjZSHkXyOjn2Dho6QlJSIh5OWjJCVjYuMl5iSnJm0l5arnYuclJKNkZKMmZuKkZ6Qi4mVn6GNlI2YmZySm5ielKGglJycpa+ooaSzuKvCyMS1ur27xcfHwtGgxsnNzcTX1tHL1KFveWdbWVNeUE9FQz48Q0FCOD84NzU/Rjw8NTwzNTM1NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OTY+PTQ3VEtDVVFKNzw6SUFFQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKQIuKf4Fzhod9goh1g4qCf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7PAvLStq7O2i6eyra29qpu7pKitubirpqahoqOjqK+ysaqdnKSYm5eXnqKmpZKkuq6pwLytrbK5pqSnfoiGnK29sIOMjIuQg4+DkY96gYiQjY2ciIePl42LlZeUkZqXnaiasZqRrJyOmo+SjpWRkJaXjpGgkYmUm6OslJaPlJydk6Cdm5igoZSanqempKKksLOnwcbDr7C6tsXEwr/NpsfEx8O81dHNxMqHcnJgWlleWkxKQkxARkc+QT9COzo0PkE8PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0I1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZUdgaWdaXVyTjIyIe4eLhoOMdYaRioFvfnuBf3F+gXqVepKUlJiQk5Wns8bJv8LMwcO5x7y6r6u5upeytrqywK6lwKSrr7u8qq2ro6Oep6qutLCqm6Cqm6GblZ+wtKeLo7q6tsG8rKics6WkqZSFjqnExKSCi4+HiISGlZSNeoONkY+RoYyMlJKPiJegmJOZlZimoK6djKqcjpaPkpGVlY2QlZGPoZSGl5+gsp6UmpSfoZikn5qgm6CUmJ6lo6ampK+upb/Ewq6ot7XJw762z7LEv8S8s9HJyMK1c3drW1dbaVFMSERMSktKQUE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpOZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KBkHqNoZaompqYur3HyMnB0snKws28wbOtu76nur++vMS3rMGprLO7vqqwqaSlo6uts622taCfrp6lopijs72pm6i9waO3t7Crk7Gtq6yXh5qpp6WRgoyTpZWJgXaKknqFjZKQnp+Tj5SLj42Uo5mXnJWVo56pn5GlmoyPj4+Vloh8j5WSkqOalaCinLWlkJ6XpKOipZ6dppielZebpKOop6KyrKi8wMOvpbK3zMC5r8Szu7/CuK3Cw8LAmGx4YFdWWlpKS01KRkRESEJCQURMOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iaCThHiFf5V/f5CIipCAlqGZrqajmMK+x8PHxdPNzs3Lu8K3sLm8s7zLvMPBtba7rbO/ubyur6igqKe2ra2psreanqyip6Gdq7e4qaSwv8Sxvrmzp6q1tK6ul5alrKigkY6SscWnlY59kZV9iJGZkKqZmJOTj5OVk6Wek52ZlKGjopyYn5iLjI+PnohakJaXkpakmWWYo56ypJahlqysqqebnqaXmJaYlaCjqKWftqupubvDtKWztcvAuKq2rLK7uK6ouLq9uIJrbVlWVFRNRUpTTks/QkhFREhHRzk1Rk07Pjc9QEouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJxRmlJUmViTEallJyWoZeplo2Rg4emk4iCh4KchIOVkJCTjpqin6++rqHGvMXExsbOzs7Syr67trG6u7u+z7bEvbi4t7KxtbO4s6umnKuruaqop6+vl6OupKekpLXAsKustL/DusC6s6e5tbizr5Wlra6upYuTlaGNdMGafpeZhY+WmoyxlZualZOTmpmlo5Wgm5aaqZ2coaCZioyPlp1gSpacmpWapZZUlrCfrpyfpJSvrqulmqCllJOYmI6cn6aimbSpqrO8u7uqsLLHv7mmrKytsbGjobKytKRvbGVbWU5PS0VPUFBRO0hKSEdJQ0M+OktVP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLp5aOiZOFn4eEnZeOnaGao6S1yLSpxrrCw8fKyMfMzca+u7OuubjAwcy1x7rBuLW6sK+vs7Smo5uqtLSpqKatrJqkraWkqKy6v6irtre+wb++ubOyxLK5vayjrrWsuaaInJimm3a/oIWZnY6TmZqLr5ehnJyXlZufoamfqKCZmqqZoaeemJCNkZ2DbnaSopqVnaKekK6yoqqUqKqXqq2jo5+lqJKSmZyIlJyinpexp6mrura9s7Ktvrm3oKOnqKWnnJytqamMYmRfXlFKTEZITklVTD1NRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauVnKGfu6+ZlJ+Lk6ubkZKTiauNh6KfjKOtlKOjtsa9tMG6wsLHyMXCzcjBvbmyr7m0wMLKtcWxwby0uqqoraywoqOYqrS7pammrKqdqK+no6qqvrynrby0uL3HvLe1t8GxvsC0qbW3q7+lj6OYkaKgvJ+JmqCZl56ej7efqZylo5ucoZqopbOhm56mnKiqnpmVj5Sbi5eJjKWilJ2inqC0r6Wkk6+rmaurnZ2ko6iRlZWgg4+enpuVqaShobS0urWtqLWys56co6Wal5WZqqGedl5bX11KSEZHTVFJTUVGR0JSTEpCRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKBZFQ0OS0xOmdcRkNDnHBiR0Wnl6SfnsOtm5elmJmpnJaamo+qlpWnppWtrZmhq7bEwru+t8HCwMfEvs3Gu725sq+4s7/CyLW/r7u2uLampKqrraCgmquqxKKlqKumnquvrKGoqL+3pq2+sbi2x7a1ubi/sr/Bt7SztK++o5ejlpSclK6gkaKipaOjn5C9pKmdqKudnaCbpp+9opijn6Kpq6Gdl42VnpOeh4+FjZOepKGdtaylm5Wxp5mvp5+aqZ6gjZiUnoONoJqbk6WkmpirsbWxqqWqraycmKCgko6QlqielGdiWGBdTkhHSk5LSEVESUE+UEhAPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTpuUkY8S3hlYldMopqjnJ7FrKGfrJ6drqCTo5+WpaCmqauXtrGjqrO1xMS9v7a/wrvIwr7KyLa4tbWws7O3wca2vrC4tLi1n6asqqudnZ6lpMGloKqtn6SprK+ipqe9taWxvLm3tsOys7e5v7LEwLi4rrO1taOdpZWSlKGuoJminamoq6Oawq2pnqytm5uemaahvaKdpZirq6ymoZmNmZ+Sn4mPV3+Wn6ahoLiqppOYtaOfsqGgm66Wno6YlJ2Bjp+XlY6ipJWQpq6yq6mhoqWllZWdmIuPkZOknolgZFljYEtISkpORkVBRko+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckhFNj11ZVxLTp6foZmew6ilorSinLKok6ukoKSframsnbuwqKy1scjFwcKzwsO8xsO8xMq8r7C2rbC0r7/EtLmxsLm0rJmosKmpmp2loafCrZussZypo62wqaSnvbamt7u9r7fDrbOywsCyx7O6t6y0tq6qoqaWlZWkrKKfn5qoq7Cvr7uypqCpqJmZmJOipLigoaSTr6+spaefkqGelZ6PkI2VnZqjn6ezpqaMmLObo66anputkJ6TlpOZf5Ghlo+Nn6GTi6assKWmoZygnpKSmpOFi5KNnJ5/YGVaZ2VKSUxKUkJDQElHOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo5+coMOopKqyoaO0qpWzrKeipLKsrqm7sqywtLTGwMTDtcDEvcnEtcDIwbSrtaivuKy/xLS3rqy2uaWZq7Grqpefppetu7SbqLCbrZ+ttLKnqrmyqLqzt7K5wKq3scO9tManvq+tt7WpqKyhl5eSpqWio5iYpa+4rrK1tqCfqKSZlZWTpKC3o6Smlq+ysqerpqGem5qblpion6CYop6vsqKmjJeumKSrl5mepJGbjZOWmYSVnpSMj5yelIupqaqhp6CZnpWMjpmQgYWViZSfeGNoXGpqTVBNTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKOdoaa/pqivr6GptKudubCro6q0trGwubewt7i4xL3Dx728xMHGwLjAxsC6qbakrLuswMK3t6mssbqila2wrbKWpaeRqrmpoKewnaqgr7Szqqm2tq27rLOzuresuLDDur6/psOrsLeuqaurpp6YmauioqCRmKGxr7OrsLmanKmgmZaSl6aht6mlo6OwsbSrsqirn5ugoJuepZ2il52js7Can4+TpZqgqZqUop6VmImTl5KVlpyTiJCbmZSOqKimn6Obl5uTh46Zi32MloWPm2pobGBsbldQUVpUQUNFVEA7O0hBNzpYUGReUFZXRFleXU1MUk5eS0o+WmNeTkhQTltVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGrsKqjsbiqpbWzrKCttbyus7i8ur22tsDCv8jEucTBwMC4xL3At6+2p6u3sbu+v7SorrG2nperraitl6eojqe7n6Sts56rorCws6uptrS1va2vsbWssLSxwbrFt6u8r7G4rK2qo7GmnqWpoKSXkJmgs6qzqqqzmp2nm5qVjqCmpLSup6Ktra6xp7OtsqqknJ+oo56VoZmbqLWpl5mRkp6ZnqCekKuel5eFlJeKnJibk4qNlpeal6aloqCdlpWXk4CPlIV7jpKDjJZlbHJnb3FeRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19hVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqCkrLakramlrq62qq+1uqemsLfFt7G3vsHCtLS6xb7MxbnCwLm+ucO3wLmytKupura6ub20qa2wtZiYp6yqq5urq46rvZ2rrrGjq6CwrbOurbayubeqrq6yqLWvs7u9yrKqtrWxtK+up6GzoJuoraCllZabmrKjraCmr5ehpJqako6jpaezqaGmsqyqtqWusbWvpJmdraeamJ+Zmau3opeTkI6XnKGXlpOrnpuSf5KXjJ2cmpaQiZSSnpmloqGgmJaRk5V6i4+Fe4yKg4uSam14bXV7YEVhallJSFlaPXtKRkQ2QWJUaVtNXGBKXF1aUlNSYmFMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVEtEmZegsaixqq2mpK+utam3tLmkrLO3yrq0urq/vrSzt8PAzMi8w7y2vb+/t7+8sb2tp7q4t7bBtqqssbeUl6auq6ejsKqUr7ukrLGyp6ijsbSwsbC1sbizqa6rsqe3r7W0w8W2qbW2rLCtqaijtqCgp7GgpJScmpWxnqecoKqOqaOem5aYpqaluKeisbSsp7KnrbC2rKSZoKyom5ydm5SpuJyUjo6KmJyil4+XpaCdlIKRlY+cnJiWlIeWj5eap5yjoJKWkJCVdoSQh3uFgYSMi21wd3V7flxLZWxcS05jXD5ie0dJOEdnV2ZcTV5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi49RUxRPDNya0pDQ5GZpa6lra6rp6SwsrOqt7G3oKu1ucm4rsG7wreysbXCws7FwMG9tLy/v7q+vLLEp6m4sLa2v7yuqrOynJ+nsa2mpa+lnbK1rKuxsa2pqLS6rLOytay0raqsqKypuK2xsMe/uKW6sKmtraWorbCmpKSvpKmcnpybr5mjo6Kjkayeo6CgoqqmprmlrLW1pKqrqKyvtq6jnaOoqpugmpqSpLOZjomNh5CioJSNk5yfk5GEjZKSnZqZlZOHl5KVmaebn56MkpGOkHd+jYV9fHyHiYhwc3F+fX1cU2RvXk5ZZlxGRJZbRztObVhiW0xfYk5WV1ZXVFhnXlFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorOkk/M0JJUyw+j2s8R0iPnKqroqmxpKmls7SytLWysqGrrbzMuq7Au8extKy0wsLRxca+wLK9wMK8v7e7xKest6yzuLu/r6qxraCjp62qqKSwo6qxqq+ssK+wr6uzu6e2sLKpsqmrpqWjrbqsqrHCubWsuqioqK2qqLGlqaSjrqqoop+co6yVpZ6YnpmsnaKnqaKspqOtrLixsqCpoqCrr7GsnZ+np6mZo5iZj6CnmIaEjoqLnp+Oi4yVm46NhYaPlJ+clZeUhpaTk5ekm5yci5KQjYl+foeFfHd+h4WGdHJxiHVrX1lgbmNRc3FcSzuEfEY+V3RYYFpOY1xOVVZVV1FcYl5TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJRaPkxFlZitqKGqs5yqqrC1rbi1rqulqqq9ybyxvrfCr7Gss8TDzs7Dvr+zwMLDusCzyMOrrretsri/vrKtraukp6qwqaeosaa0rqqwrq2xsLSttLukt7KrrK6nq6Cinq+3qqqturaltrWjqqesrKqtoamnprKypKamoaGslqqhlZqgpp6koqqlraKfp7G3ra6jpaKbqqutqZyhpaSkmKCalY+YnJOBgo+IhZyfi4qNi5iNj4qCi5ejmpGQmouTkpGTopmbmYqOi4p8hoCBg3p0gISBfXN2i6OIeGpeYG5nV2WHY04/Z5NMRWJ5V2JYUmVUTVZVVVRPXF1hVUtNaVdVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGPkhGRJeSsKWjqrGYq6qttqu2saulrKqpvMDAuLizu7WlsrDEycvRv8G7uL+/wbnBucDErbG1sbO6v72ysK6tq6qotqqmrq+qua+osbGvsq22qre3prO1q6ykqauco56zs6iopLS0oLatoKqoq6msp6CrrKm5tqmqqqqiqaCsnJKpoZ2gpKOmo6qenKe1rqimqqKjmKWmp6qcoqSjn5mYn5COj5iNfoeMhoSenYaDiomNjY+MgoWUopmNjJmQkZGPkp+WmJaLioN/dIaBf395dIN/end+gIedj29xZ2dxeFxgc4hrT16ZVkhteFVkVlJiT01VVFVQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KajZPRDuWjrChpquumqylra+zta+rpbCqqbq+vMCxrritobavycfI0cC+vLq8wr26w8C+v66xsrG1vLrBsbGyq7OopLWppa2zsrmwo622sbCzuqu5r6mttauqnqmsn6Kgta2ooZ+vsqK0qp6op6qkqqGirK2ova+srq2iqKigrJmQsKGYoqCnp56om5mqsKmjn62ioZOio6OnmJqppZiXmZ2OioeUiH2NhoSEpJaEgYKKho2MkIODk6CWh5CckJKQjZGclJePioaFeHSBf3x1eHmAe3RzemiAhqN1aV5la4F1Z4iLfVNYcF5KeHNTZFNRXk1NUllmTkxWWWRYRlNpUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUE0kY+yoKSmrKSnpKyntLKxqqSxqKq4vsG8r6i5qqausMnHydHDvL++uL6/vMm7wLiwr7Sxuru3wLKzu6y4rKK0p6essra5s6eovLWutr2wvaasrLWrrZypr6OfpKuqp5yeqrKks6iaqqeqpKmdo6mnqb2rtK+unamkoK6cm7OjlaScpaWfpJuaqaulnpuqoZuSnKGlnZiXqaiSmJqTkIqCj4V+j4J/iJ6PhX59i4aQjY+Ef5Kak4WToYyTkYuRmpGVhol+f3J7eX18aHd8enVwcH1ohXiEiGRhaGNyhXptZnhdXlZCV3ptVGFQUlhLS05xdV1IWltnWUVVZlBEPkpORENBOUhHS1M/amFKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNCSjdHU2BVKj06RFg/Ko+UsZmfoKmlpaGrpbeysqapsaesuMG9tbCjuayoqLHDycnNwba9v7W3v7nItsO1s7G1sb23ub21rbm1vq2hs6eqq7C1uLSrn728qbPAs7ugr7O1qauerbCjnKSoqqOenKWwprCgn6upqKKqm6SooK27p66wrqCro6Sunp6tppefm6GjnJ+cmqOqo5qapKSWl5Sfopabl6ari56RkJGMgoqAgI+Ae5qVjYh7fouFjo2LioORl5CGlKOJkZGHkJmPk4CIfHlsfXZ4eGN7enFwcXJ4aIB0aoNnZGhhbnOObWFpcGBwQVx4bFVeT1FRSkpNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQxQmhZMTNTPWVfREw2S1dlTyk7Mk9ZPSOTmayZn5inpKOfqKS4r66jr7Cqq7jCurOun7ivq6i0u8jLyL+3wr6vtL23xLbDsa65sbPAtLq9t6m5uL2rpLSoqaqwrrmxqpu7vaSwwLW1oa62taamp7GzoJ6kpqehpZmfrKipnqCqr6ehppijqKCwuJ+jsa6gq6GspJymp6mampufo5WdnZqeqaaXm6CokpmTmZ6TmZahqZCaiY6Qhn2Hf4KOfXyhjYyIeIKLhImLi4WHkpmOiZWeiJCVgouXjJF8hXtzcH1xc3RgeXhpb3Fwb2l+cWN6bGllY2Bmhn9fWnNrckxMfmhYWk1QTEpIUFJQSU5cX25TRFhbUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPi9ZWDUol52mmZ2WraCgoaSht6uxpLO0qqi5xbazrqC3rK6tsLXGyMG3v8G5sLS8t7+7vq+rva+0v7C8wripu7q3p6i1qKirsKyzsKeavrelrby2sJ6wt7CopaevsZugpKCkpKGXnK+moZ6ip6+ioKKTpKSjt7ChprGqnqyjr5icqqWpnpianqWTm52anaaqmpycpZaVl5WdjpSXo6ihkImLj4R6hX6EinqOl4qNhniBhoOIi42FjZOXjI6WmIqPln6Gl4uPeYB7cHJ3b290X3l3ZGxsa2log21lcmprZWhcY3N/X1psdmlaSH1dW1hPT0pISFJVRjI6X15sUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdBZltIVERVXWhFLjsxYFQsMpajoZeVnKmdpaGjobeqr6C6uaasvcWzsK+jta+srq+0xMS9s7+6t7Czubi6uLqurb+ztLivv8G4rL26tKais6uoqbOrrrGjnMG2pqm2taqesruppqaosKyZoqecpKaUmKGypZmepKmpnKKgk6WfpLmopKetpp6loaiTn6mhoaCZm52gkpucl6Ciq5ubmaGVkpWWmo2Uk6OnpI+Iio6FeYR8hYV8nI2JioZ4gIOHh4eRhZWSkoyQlZSNjpR7g5eOind+e2x0cmxsc2F4dWhoamdlb4RnaGhkZmlqX2hiaWZaZXpjYVJzVFtbU0xJR0lPU0AhK2peakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OGNOJzKepKOSjqSmnJ6enqS1rKequreorMPBt7CsorStp6+vt8DAvbHBt7Gusba2uLe1rKq8s6+ysb3At668vLGln7aspqW0qauuoKDDq6mmsLOrrLS6naiqqrGmmJ2qnqelkZmmraKZnqSqoZuinZegnKe2pa+qrqChnZ2hlaCmn6GgmZuanJKanpWmnq2jmJeelZSOlJiMj5iap5+RiImKiHiFd4KCgpyHi4KJe36Eh4aEkISVlY+Pj5GRkY2Se4OVjYZzfn1meG9ramxndXNrY2dkY3R/YWRlZmVpamNpcFleWF1sZGFNaFdaYFZJR0hLTVJYPzlgbGlHQlVTXFtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkE6M0FlSCU1m6SgkYyuoJmYoJaltLGisb63obHGvLmwsaO2q6uuqbm9vLutwLKvrq22r7O4s6erubCurrS2u7avuL2tpp61q6ChsKWrr5+lw6Gzpa+xr7ettZ2tr6yuo5mcp6qln5WbqKWgmaWjqZ2aoJyUm52ssKW5p62ioZqanpmeo5qlnZaemJuUmqGSqJWsqZuUnJySjJWZjpSUmKimjY2KiY97gnSCgYqYhYd8iYiEhImMiJKElJySko+QkZaOkH+AjY2Cb4F/ZnltaGtqZ3Fya1xoY2Fyf2BkZ2ptbGdqaGZsXGxtdXFhVGJoY2VZSUZMTU9YUVBVYWWBVEBWU1lURkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFJZEInNJOim4+OsZ2bk6GaqbKwn7jAtqG0wry9ubGmtq+prqW3ube4rLuvraqrt6q0uK2ls7WxrqmxtraxsrW6qKmftqmen6qiqq2cqsGZrqWvsLa1rKyesa2vqqObnKOsqJyVnKeknZqpo6WWmqCdkZujq6qpup+mpKCYmpqeoY9ropWYnHGClpykgHaRq6ielpagkYmXmYCXi5+PeIWTjINtaX53g3BshoqGfYSKhm9dZGBnhJeGa4uQlJJ1d4uEfoOPf2aHgGh1aWZXXGl0bk5QamRmcYJmXmRmbmxpXl5fiZCFh2hPS0Q4RVRnXkpHUFBVVUtHU2BvdGVFW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE2T2tbTlxLW2ZiPkcxUGI8Ky+NpJmHlbGbnJOgm6qtq6O9xa+pt8O4vbytp7awpqukuLSys7G5raqnrLSmsLWjp7e2tainrLazrrSts6Kpn7SrnqKlnKeomq69laemr7O3ra2kqK6qq6ahnpygqKecl6Gmppycp6eek5+gmZCep6qjtK+joqOclpiYl6OIoY+Smoehh5SeoX+lf6ernpOTnJOJhHJ4jI6Dh6B2iIxpl4hmfXN4oG+Ih4N+jHx/oaCfmX97iJ50iI52m4psh4GDbWhlY3pscWJUhm1jbWmYcVhqcG6GV15pW2tqW4hwbXlyh2mHhFpeRk4+Rl5NRlJWV1FRUldUZ15MWUtSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVZgNy8ojKaXhJ2snZmZnZ+rqqiqv8Ovsrq9t8C+qqS3saqsprO1rq+ztquppbGtpbWznKy1trSlp6izsa2yqK+fqqGzqZ+ko5qio52vtpWkpqa2vKasp6mqrKemoqCZoKekmZmmo6SZnKSql5SinJSToqWmoLako6CjmJWTmJSciK6QmJSJqYuXo5yFsYCkrZ6Ump6VeYLUqH+HlMCbx3l4saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJaxq7B4aGtYsa5vZWm8krxuaHptcY/YflNqY7ayf4BxlHWaoaqQV09XYU9WTkZUW1hRUFOLXFdbUEBcRVFOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXDQxIY6mk4Gnqp+XnZ2lrbKpscK9srXAtbe+wqumtK2tqaivtKqvtrOop6a1pae4rpyysbWqpaSnsq6tsaaqnqeksqShoZ+XnKCgsK2VnqOftLmiqaihra6kop6bmqKpoJibqKGfmJ6op5Gcp5uUnaGmoqCwo56fo5aWkpiSmYWwa2qKjap+Z4SWh61lcZ6dlZqmlXGuoaR+d7p8a6GPdrFfarRbpYBlnJFgZoF6Zn9qeGqpZb5yZ6aMdrFqfLF4dJKTY21tp21bhKBFaWeHlkV1nGB9Znujp4JZX4uraYCUeHpqpzdKr1tXVGxjWktPV19cV1Y7TohPV1YvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuSopWCraeln6OkqrG3rbS9vrC3xbK4usKnqbCsr6mpsa6ksLqwpKSus6Opuames7Owo6Wgqq2wrK+mp5+jorGco5yYlZicna6nl5uhn7Syoaqboa2toJ6al6Ciqp2ZnqShnJqhp6SQnaOal6Cfq5+lpqCan6GVlZGWkZqFtZu1eIWpmbWZd4ezm7d/k5aXqZV+a4GmeoGFh5KUknerZ2qxW6x7joeUdIhwjoaAf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLTqRYSGNjmX5jaKZgeXJ1UpOGXlCpbWNxfYaAYp0uUaJuW1RrZ2BMS1xkWFxaQj6weFdYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMiw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nVzdKOWFVNTAclp+UiLOmpqKuqaezrKq7tsKwvMKtuLfBqqytrq+mrrKpoa+8qqGnta2jq7WkprOzp6Oinaeqsqiwp6WeoJ+wl6CalZaXmJ+uo5qapKi0rqGpj6moqZuelZigpaman52jn5ygo6WjlZuemJqdoqqcpZqbm6KglpORk5Odg9WTmblwsMJ+xoZ81pSbu3yalqWQjZuMpHqNh6OCpYJ6rHmPnVWve4l+n2q5Wrl3hoN9poKTfJh6qnmNnY97sW6OhHSQu4VvlE+vp8WKUaB6Y2CqYnNyh2yXh19TtbTIhoCJfGOkM0Kddl1RamhkUEBYZlpkYUpITWxLWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0oLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUTgyJZyhk5ixqKils6qltKilvLfBsLrAsbW1vLO2p7Gxo7Gzpp+vtqibqLquoq+xoLO0sKCknp6nqbCptKmlnJ2eq5iZmJeXlpeiq56al6itsKijn46soqeWnpecoaaimKKhoqGaoqKnm56gnpWZmqagnKeVm5ufoJiQkpWRnYiybmi1cauIcI6mcrRzcrZ7mpikjY+bjaJ+kKClfrB2g5HS0XVbrnyGf6Rvm6qma4aFfa19l5mPe7Fzk52OeLNllnSFnm6eZpRSyItawlyfeWJfrWB3c4Zil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBT2pfbGlQVUZJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi+inZGkr6ykqrutprSlqLa7vLK7v7e2tLu7s6W1tKKysqOgrK+kmKa6rqSxsJy0uKmgpp2hqqWyqKyqpZqdmqmflpWYmZOTo6mgl5Omq7ClopaSrJ+lkpShnKWnoJWbpqehmqOfrZqgnp6QlpuinpyllJyVmaKelZiWkpuFrHt3qHajj4uHqW+tioOog5mZooqSmYuifpKYia6Ff4KzXHKzUq5+g4Kkf3HXfXeEfo+dhpmad6+GipGch3e0YZplmoKBlWySWrBYS5p1mHlmYK1ed3eHZ5iIal2vd5Wej3hsNXnIrrJfQlRvXmdgRU9rX3BtVlVNL2VjaVNZUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjg4n52UoLiwmLTBraiyp6qyuri0uL+6uLO2vbWluLSgta2foKmrn5WntqyosLGrrbSkm6mgoKiitaemqqOZnpWlopSUnJmTlqOmm5OQp6yvpaGVmKmfoo+RopqppqGVmqapnp2knqydoJ2gjZSem56gmJiblZehoJSYkaedhql9faV5oY+Qg6pwrYyCp4aWoKGKl5eIo4GQh5SqfICLnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRsklyrW1qTf5F/aGeqZHN7gWuYh3FdrFqJoI5rbmVPSkOhXFpNdF1iZk1aYV9zdF9KVTVKmpJZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE+OKGcmZm+rJi0wq6rrammtLC4sbW/urqzsbe8qru1oLGlnqWnp56TqrGpr6q1rKquoZihoKakpLqio6uhl5uRoqCVlJ+alJmfoJCNjKmwr6adl5qnpp+NkqSYqKuolJeqqJ+foKOto6CdoY2UoZifoJKcl5yVnaGVl4+rm4+ubXK0dKmMd4qmc7R5dLOAkqSjkpyMiaSHjna4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSapdcrWBNoXyHkVJzo2x5f35umIZvXK9WPJx3ZlRvbi5bp09iU2tlYmxaYlxgcXxjU1lQPj5tbzNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7PDAwMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjgxQjmlmpudu6KcssCuraurp7epuK+1wLW8sa+5uKvBt6qroZynpKKdkquqp7WjsqiuqqGXnKigpKu5naOtnJaZj6Wjlo2doZyZnZ+Rk5Wrtq+nmZSbrKmXjJOmmqWtpJKXq7KkoJ6oq7CZoaKPmKKXoJuWm5ehk5ypnJSRq5mH1JKau3SxxIDDhn3Vlpy4eIiRl4yXiYynh3mjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbpqIcG2NpHS9XXd9W2F5vGpaVltpeV5pYGRmYm14b1lbWUNBQHI/Q0YrNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0A5ppmeoryil7HDsK2pqqyxp7ivtsSxu7Ouu7CuwbKspaOepKGcm5CqpKqypLWnraSflpqqmaasuZ2jrpmVoZCmoJONnKOemJ6akJaSr7mwq5WXo6enlJGWpZ2krZ6RoKiroJyfqaSynqKkjqahlKGZnJeWpJiPsKCSlaqehZCZtYCRkY24lXiCk5u1d25sbnNueY+EjolznsG7vJl6gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnB3toxegHp9iWeDeW15YouscHWFf1hbp2pEZFpUZl9jXWJQZ2ZxbXVCTVBMRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rO1ZWJz07PKadoKG/ppazw7Ssqqesq6m7rrDGr7W0r7intbitqqOipp+gnZmTrKStqqa1qKifm5ago56spL6moaqYlZyRopuSj6GoopOel5KYlLK1tq2YnaSkoouSkqacpauclqmlpp2boqmnpqOooJGsnpejnpeXmJ2ej7CplJynoo5qfmmcp3iJc36ajnV6ZYd7vb7Aum6Sg3GUhl9yalpdmolhZIeOlWtggJVjbZt2YpRrf5qVlGVeYGNxm4locox9hpRman5xdHl9fGJbd3SBaFBcboR9e4tqWGx5gnJJSm+FcE10TUVXXGZhTFtXZmNeT1ptdmpyUk9ERU47SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0lSX0knU2BWNClQXkwoMz5bTyc/Mj6on6ihwaOatLq2o6ylrqeotbKsyKywtKy1o76xsqego6mdo5uamaynrqSltaqlm5iVopumram/qKmmlpSblaCak5ilqaiRnpCPmJywsr+sm6edp6GJk5Gqm6mknJusoKOam6OnrKKfqqGZr5qVpp+WlJ2fnZewpZmiqJmckZ6co6SZp6OanJqbmpCWgmhufHF2kZeUkYSJtKmNhZiVjoqMmJeHlJWKg5KSkImNkZSZk5iXmqChmpuUoJ2OgnqkhWxpfJB8gHSJioFxgnh5dnaKgHuJanOBdIN1ZHd9dmtwem1gY1tvaE1YWGVqX1dZcHpvbmZTT0ZTOU9aTlJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeUzEwVF46Kz04XUssPC1AsqCzob+ipLGyt6CppbOnpbC1qsmrrbGmtabAqLShnqWlnKSWlaCrp6yjo7esoJmWlqCXraqmwZ+spJaSnJeemJOUop+eo6eSkZmop7LDr5mrnauej5aWqZ6rnJ6grZihm52ipa+moaSnnqyYl6admZqhnp6csKCdoqeWmJOZlKCilqOfl6COlpSLio2Plq2Pe5WbgpKBiamohYCYloqEjp+Ie4SQhoWZkIeGiZWOm5eNkJieo5aZkpCdjX6NZaGzroWJhHZ6j4p9dnl6b2d5kIGAiWt1gXmIcmh0f3p2g4iCa3RjeGZfaGRjZGZqWGt7cWpqXFJMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15dXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rauusrKgqqayraKss7DFsKqso7OvvaS0nKCnoqGdmZeopqmmpKaztZ6VlJ6Zma+mrr6gq6ORkZ6amZSRlaGcl6mdhZ6prKKzyLSfqaSqlpaYmqeeqZygpKuUnp+eoKquqaWiqqGsm5+goJilnpyenK+kmZ+ok5iXnZKlmpipnpqXZoOSfGV+jpqPY3iNbGhrepCjq2tkmZh+Z4WKZWVpaHqNoY5rZ4yXkaJ3a2qLmKKfmHNsbnqEjYV5WGVdhYFea4qKgXZbaHN3d5GAh4JueIJ4gHNteYR0d4iJj4N7aIRYXWpzZF1ziGlqfHFsY11RTldJZFhASjQ+Rjc/RkQ3MTw9P0FDOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kvN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+rs7CrpaitrrCnrq6wvbGpqKStsLGgrZegpJ6hmpmmq5yso6aoqbOunpWjkKKvpra5pa6jj46aoZmTkpqgmZmmlnulrKKos8O4paKnr5+elZ6jn6ScpKqokp6hnqCqr6mqoqmfp5umn6egrJWhm6WwpJicq5ahnpuTpZieq5mefr6DiHK0coWehq1oeLnEuHGSoaN7ppiZc6qCfMvAwLtxi6KHg558lZiInsC9gpadnY2cwcF7gXqRjJrCv31rpbFvjIFvynp/m3iRg46AdnmBf3lxen+HcHiFjJN5bHWRYmVeeGRfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqZSjr6mwr62msrWvq6amprGroKuYm6KgnJuqp6Kdq6KlqaWktKSdo5Omrqy4tKevopKRmZ2lkpGgoZicoJ2Hpqukq62/wLGhqq6qlpKfnaKZoqSqo5OgoZ6drK6pq6WjoqWgpKWcramRpJuorqqcnaqcrKKWl6WWoaOYnH/OlHl6pYJ6lZabX62PXo6ngKGgfKeVm3Srg4CvXmSNqXqnh4WfdJeSiLNjgquGoI2NsmqErnR8loe4YYKtWaPNbo91e9t7f5lxfoiSdX9le4h2dmt9iG5+hZCSfmyAjV9wam9mYF94ZFxxaGpjZmBSVFJXXUpPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3NzE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCstLkowJztcOkwtIVBARjQuMa3CwMC1tLC3mJ6RpKqprbSrprKsraykrKawqqCnm5qmmJyisJ+gn6ino6ahn7Csm56Wpq6tsauorKCUkpufpZOPnqWXnaijnq6kq7Cov8azqKmxrpaTnJyil6Cpqp+VoZ6dna6vp6qom6amo6Cqkq2zlqajq6qeo6emobChkpqnmqGblJSRl6BwhYyXdYSoh3GwfJ1yrH6hn4Glj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKGLkYucfqt7iJKOoIB6rVacxHqPb5LBfYGVbXVwjG1mdmWGb2F3bnJuiIqRj4NtkI5kbnN1b2BmbWRfbmlpbmZjV1RcYVpSUkM4SUlARDw+PEBFRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc+V0otPCg9MSkzVkBGIRxHOkMxLiuv1MbHsrSfnaOOo6Oira62r6mwp6mqqK6rq6eio52ZopWfpqufoqWfqKiin56wrZiblqinr62op6mel5WapKKSlKGtm52no66so6y1qbnNsq2mrqyXlZucopmfrqydlqGZnp+psampqJqqqKOhq5uvsaKorK6mmaarqqqxo5OXo6WalJKFpGqkdYl6qXR6snGCpYmYjHCIoJqHpF9gUquEf66Cm3WugqeGhp96mJaFe2aAo4mkmIaBo32pfoCUhq5efKhVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J1aIyLl4+BbJmRbm14d3dubGZlZHFwZntpY1xXX2lYWFRMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C1sK+prKOopqqrq6mkpqCbpZ+dpaemo5ysmqKroaSfr6Oem5OqpLawrqCpm52XlaekkZuiqJ+gppywpqOosay2yLK1qqyqlZGcnaKZn6WznZqhlJyfpquroq2Zq6ihoamis62iqrOyopuqqK+vtqOTlqSnmJuRfKpsnoSHdat5fLBugqSLiJ+WlZ+VgdK3tLjJgIGyXl+UqYOkh4egepiVmXiqyXOZo5SnqZCSm4x+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2OOj52Se3CWkX1venR8em1cZmpycWaBaV5hWGNtXF5ZSU1NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5PUE1GTEpWRipMMC8+LTRPVFEdHDs8RjIsJKikwca5raiyrqylop2yuayqoaabqKaqrKmnoKalmKqjn66rnaagrJqfqaWdp7WfopeTqKu2sqybppyglZCmrZGYm6aioKqnrqGjp6mwtMKys6qtqJSJl52lm6Kjr6WXoZWZnKWlq5qunKynpZ6ro7esobG5sJ2br6eztLOllZiopJugjoKdTniagX+feoSjfIKkhIamnpyek4S4e3x5uYJ+zMXCtniaoJCLn36alpeKdZ6XiqSYo6h+sIWchJ6DrH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1j5Gjlnt9kZCIc3pyhH5wW2xud3JqgW5aY19obmJkXUtMUVRBSEhGSTo5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTI6UFtUHBs2P0gsLSCMh5mprKSruauvoJuhrLO0pp+glaWurq6ppp2mppqjp6GyrqGpprKgmaiklKK1oqOVl6Gptbmkm6Odo5OQorGZnZumpKGir62dpKiitbHDsa2qraqRh5Gcp52jpJ2ll56YmZmlo6iZraGspKWXr6W8raK3t66dnrWyubKzp5mesKKknoaP0bXDt3mHjoWRk4+ApniUoneMoJKEpYKLcauGhLRucmmZo5yViZ98mJmGh49yroKlm6KNpouTnYmUkJptcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+TpZh9i4uRind8eI2BbGh3aXhzbn90XGRkbm1laGBKWldYPEdHQFQzQEY+PCooNjMuMDEzKSY0Ojs8PT9AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklknOMiq6/v7u7tZ6XqKSttqGjmZWjqaeuqauZpaGfpaCgtaeiqaewo5Sro46kraOdkJqaqrS0pJ2mnKmSlJeuoJ+dpaOcp5y1mqCqo7arwrCpq6mijYSPnKKhpqOWmZqcmJuYpaSmmKqmrKGkm6ynvqyVvrCtn6Ows7qstKebqbKlqJh6qJB9fLB3ioCkpYicbbJvoIetfKGPg6iWmYCsiYSuhZ+UqKCiloWfgJmVgHuSfauAnZqWiqp4naCPiJOSgHmvXaOBfKanZJ2AfJd0a69dpWtxhZldYFuMoG6VkaaZgpOLlYp5eYKWf2psfmJ9dG5/eWBmZXFvaGdoQ1lgWz1KVDJUOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVVRSEZJSiMoKLySmoSpxsO2wbSfm62grrilpI6bpKOgr66pn6Oena2Ynrmgoqugr6qaraGQqqmklomakK6wrKafqJutmJiPraKhnqWhmqWcrZifqKa2qL+vpamkn4yAjpuboKaekpSZmpSamqSjo5moq6uio56pqL6kl8OsqqOirLO6rK+nobSwqauZdq9+kIqchYd8uq2JmGSwjGWVrX2gj4OnlpqBrIqEsIWlmaShopCEoFtsaoGzYH+te3uCgbFsZ26Zl4uIsVt9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46omomWj5SVeXeNm31jcn1hg3hzgHxhaWZwbWZlZU9VY1tBVF49SSg+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXV1hXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5ytpqW2qaGLmaCfnbOyqJ6in520mKCzqKqrnrCtnqybla6poo6Im46vraimo6iZrpOaj6maoZ6ln5mjo6WZnqKpsqi7r6Wonp2PfIublqGgmpCRmpuRmZennqGYqK2mpKSipKm7nqDGp6Wpoqu0tq2up6C9rq2tloGpkqOujpuAhqSXmI+BgLjDuoOOnJOEp5ecgqyKgq+IppuapaqRftW9wqpio7+9fH6jgoPXuri1hZOSgp69voRqo4Fvq4RunH96srHHg2qrsL2teHeivrt0gJWNppuOmY+Vm3iAj5l5Ynx6Y4xneIF7YGtla2piUGJbU2pcQFRhQk0pPDo0Lx4fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJW0tLG/ubK9s6Kdrqams6aejJilv6q3sKegv6amsZuesZy5qJ6tr6WnlZSvrJeMg5qRr6ajrKGlnKqgmIujkqaep5yaoaiimZ6gq62pua6opJuXk3uHmZKmm5OPkZiYj5iTqJmfmKmon6mmoaKqu56pxaOgr6Ors7WrsKqhvKiwsJp0daqkt4VliZ9vZ6yPio9tb3ekkJmfgXWvmZVwkIxxlaejm5iupHJtbW1lindubYKZcYB5aXBpZ4mVlZdxaGmFhmdwhmReiWNqcFldZ353pmBicY6Sb2ZkgI2SjqKXlpePlJ17ho2TdGWGd2iManh+eWRsY2ZsYktkWEprWTpQZUVRJ0s5KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiUrbOqurmys6qpoq6fpLOqmJK9scPIvbWpnsCrrKOgpqufuqOkrayspo6WraqPjIWVl62fpaqin6SkoJGMpZOnmaiZlqOqoJacpaanr7mrrJqbk5J7hJeNppiOkZCYlI2XlaeUnpeoopqvpp2irLmfsMGopLOmrLGyq66sqLmkr7iWiqGopbaciZahl4apmpCUnZOqs5mbo6yhs5eioJ6gopygpKGVq6aMkpOMh5KcnJSQmZOYkI6VhYCkmpeVjYuTkoqPhoR9Z4uAdIN2dIeMcadtfJWRlJOBgY+Pj46dk6CVlpWfgYaTi3BnjnZvind2fHppbGRkb2NVYFlAaVpHYmBOWSpFPSsmIjc0MC4fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVVFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW4r66isKStoKG2sZCOq8S7xLq3qqGlnZumnbCoo7annam0pqeRmKyji4iJj5ynlqykoZqnnp+TlaOXqZqomZSnoaSQmqeZobW6qKuYmpCNfIGUjKGUipSRlZCPk5elj56ZqJ+btaOdpqu3qK7CrqO3pq+vsK2qqrS6oq+9mZKmo6a1opGdpp6NqZ+Nkp+jrK+aoaOxqbCYpKGcpKqenZ2cl6uckpmhm5OQlqqZjZiYlpCWnpGIoJ2UlIWSjJCMlIuAfmaMh3WHdnmIg3OcaoeRlJSRin2MlpKSmJKgkZuVn4KGl4V4cZRyeIl/cXt+am5kX3BpYFtgWW1iUGBkUFo6R0ZFPTM9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WXF5eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJWkp6Ows6yuo6mnraCotaqRkJyjsrquq6uhopl6naKwpKWxqZabuKajlJmpnI6GiombopCunqSWqKChkpeZnK6LqpaPqJmojJioj565tqSlmJuNiXmBlIybk4qVkZSQjZGWoYydnqienrejf4OvtaKwr3SkvqOyoHh6oKuzvJV2rqSfioCqfmRbYXafjqSdg5d+bpOznKOorqujZZ6gk3N5mZZwgJiol2x/oqeJZZylm5CXmJaLkZuQhZ2akJSCkoeOjpKJhXdrj4d2h3F8hoGAYWmIi5WTi1t2lZFnaI+NcXqjl5ZkeJiGgHaXaIOJgm55f2twZV92b2traFxmY2Jib1JbPk1OTlJHPUBUQjkxLh4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXF9oZmdXUUo8REc8OVZSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6mlqa2jp62lkpaqtK6xpZmppquWc4ucr5+oq6eTlrigoI+cpJ2RfoiImp6Nq5qklaeino6Xkp6Fda6QiaaaqJGWo4iburSooJmYi4l1dpOOlpOKk5GQlIyPkp+Nmp+mmZuyloCMm7WdtIySj72noX6nonqjr7iBjo6nn4SLhY+wqa+MiZaimXmBi6yGnJ2iqKqoiJWGmHelm3qHm4GXpoKBe5yxeoqFn5eZlJiWgZCWloSZmmJ5h5CEjo+Si4NucZCIeoFxgIGGf4Z0h4WWkniWaJN0oJp0fJmDnpuFmH6RiYGCl2mNjIRqeHtxcGdkd21pbGpbZWppZXJbXkhTTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWhmWVFIOURLPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrca8sKGVpai0nY+DnKubp6KgjZC+npmNn5qgkH2FjpmXiKudo5agoZKNlImGgJGojoeinKOTlp2Gn7myp52ak4+FcHWQipWQipSPj5uLj5GekZafo5WdrIiftIm0mq6Lyoirrom3hY2wg7GvhKmNp5iNnXyoj3J7d5uOppZolaR5tIufnqepkpnCgX+riJihcZ6AmqR9l4WVsYGhfKCTn4+Yl4COk5uJmJKLfIWTho2Vk4mDbXORhYB7coaBhX2FdIWCl4GPxWaAqYePomqegp+YgZmAiouDiJhvjZKEZ3d0e3ZnaHVwZmdrXmJubGZsWGZGXFBMMkU0Nk1gYzYmNDxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGqq6aalJ+ipKqilaOptqKvf6CmnKWenYmUvZmTjaCRnZB5g5aWkYermZybmqGFj4x3m5yPoJGInqSblZiXhqK4raWZm42Nf2JtkIuTkI2PjIyXi5CRno6Tn6CYoah+oaeHrZ2glq6Pn52dkYaBoI2rsIekjaqajJp+o3aAmJNrgat0Tat4h42dkZupqIKqq32DoXt6p2mef5JrZ5eGl7aInn1tYGNYg5d/jHtkZ4tzmX15lmxdfJduX1NxhVxgbHmDYFllgn2EgZhxp6prg6NucqVwn4OdZ2SfbFpsiHplWV+CfmFXUG92ZW10cWpqb15qb2xraFdoTl1XRTlBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fYnZgTUQ6TU9NVGJcW2ZmaWliYmRhZGRiYWJgYmRjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySora8q66imZefoaWsrJ+crbSip5Ggn5+mnJmOmLSZkIuejJWLdYGUkY2KppaWmJ6ef5OFhqykh5yRipiol5makYelsKailZmIiYBpboiHi46OiYuNkouQkaGMk56fm6Klf5OBj6OhlKB3nJaQp4Ohp4CGqq6FpXmLfYSafaJwc5OHlnuejHlth5uMmZCbqZuPh518gqJzdqZmnn53pF+YenySc6JumLe0unSSh4GAtqhkgca4e3CVt4xxgJukY3Ssq2B9ap2zfm59h4OOgouXcYCjbHOkc56DfqNenZmzlm97l56zdHJbnrKCaWJvc3VxaG9Za2xycmVcaF1iS0Q9RDVRQVlxMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pYYGB8ZElDOExXVVZiYVplZmtrYmJlYWRjYGFiYGNjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmsnJOgjqW4ta6toJqinKOjpKybmrGsq5KXoJigpJqalJ6rm4uIkniLhXCAlo2Kj6CQk5Sdl32RiY6ooYeYj4qSo5ObmoyLqKikno+Wh4R+a3uGfn2PjYOLkJCJj5OfgpeeoJ2gn4uJd5yYooygcqKLiKmInKeRl6isf66MfXqgmXqjk3iAc5eIjJx9lp+Gm42Zm6aGo2ShfImWkJuNbJ5omo1umpl6f4qnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2dYmKf55omnWHk5KYjn+ebpmQa6aZXKh+d7tqfalajoRds2dcbXF4d2tpW3BpeHhiXmVXYkFQRE83VkJSbTRKWlpfTlpEQDE1MTs7N0g/OkNIVT9YUlldPkRiXVZgUWFkfWlFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZyJqrabqIljlZysurKwrJ2mm5unn52tmp2wp6udl6KZoZ+Zlpago5mGiY1piIBxe5eIi5aWhJKVmI96ioSWo52JlZCGi52RnJuJj6ijoJqLkYqAgGmBhnh/lox7iI2Oh46Vmn6Uo5+gopOYcmifiqCPjHCSjIKpiJmfo6mhqH2wraSiuJd2o7Oio3+IlHidequafqKOnZuXiJdyoXyFja+1fWuakaF4fpi0o6OrqISYe5p8nJl+c6paXW97l4t4nmJNf3t7hWN6mEJNn1mianJ8jm2BiYSZdZt5h4mxs39/mpKmdH+dbXF8lG+ZcmmjXZV2SGVjYHNwfH1uZWBraHZ7YmNgUV5WXFRWQFlFUWdEUldbYlhfSUQ9QjhAQjpJRThMRVhBVlFbVkRGYVxaYEtgbX5yRUM8VV9iWmVqVmdobG5iZmZeYWFcXV5gaGJfZWN2bF5lZ2ZsZGVsaGhraZOdgbGumYRTX6GntLqzs6maooubqZybqJKhq6Ogp46enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32RkpaIcoCJkqCccpGQgYiYlJ+ahI6onJqViouKfIRshIVxgaGMeIWNiIeSmJR8k6SgnqOIroZ9tYSPnp17ppZ6qYKWnZCLoZ59p2h3bX6Zc6BzcXydhZhvk4KufaODpp6agaNwXqlndaNjb6VhnNOQfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyqLx/d4Ntf7+mqrRem29+cZdvgXOicl2jZ3SmYWimbZvTmHqCm253eZdrm3p2l3JsqaVnX2R5cH6Ea2dmY212d2ZfYVJbZVFRYklXSVRfV1NbZWpcZVFFQ0tMSktCSkQ4UEBRTldTWE9SUWBlZWlSZHh5d0lGRWNdZVpoalNpaGpvY2pnYGJfXF1dX2hiYWhle2ReZGdka2RqbGZobGiYm3+wrFRcS36psLK1sLOjnJiFmKagoKKNpKifl6iJmZeYk5mTkqCXjYiFe3B9hGh9j4OTmoF3kY2OiXB/ho+SkmyXk3yIkJGjlYOOqpqUkoqFiXmEdoeAboGfhneAkoaImaGWeZOio5qgibOhoraLeqynpK6lcKmAmpCFgZySfaSAopmGmHKehKKsromXi4CMpI2Wg66ilHa1trXJoXSUioCfYZ6XqW14loafmnWhh3egfZCWioFvTGaiknCaiHOke3l0YYOCbH6gbHJkYJxyf3SXaXtps7W0xqZzmH57nWqbmqt0gpptc3eXaZp5dJhxUEV8s15qdWp4h2ZqZ2J0dHBtVV1TWWhQUmhJVUxYUlZdZ2tuVmdXTUpBSk1KSEpOQVFKUGVjaW1ldHJzfnh7bnWJe3tUUE9tXWhba2lSamhpbGdsZmNlX1xcXF5pYmRoa3tfXWRnY2pmbm1laWxlopyJr6eFZj+UorOrr6+1oqKQgJeooqGji6SmnZylgZqXlo2XkJCbko2Ig3lqeYZlg4x+lqB5dY+IjIFphIWSg4yFnY16jIqUpZKCl6mXjJGLgIl6gH2LeXCQoYZ5gJSHiZaflH+UpaeclpaEZ254nGyiZHxxpXecmHBnp4GXjHuleqCWg5dyn3aAiZSWj7lukIqiYn2ZopWIbnJpqmt1oGxupmCbaYuQaJaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGaIgm5yolpfW2Shbl6JjG97f3NyZKVueKJkZ6domHKLmG6hb1KIj2+gXmSnVItdU5htbXJqcYFscGhreHNrb1FXVlZmWVNtSVhPXEhYaWhzallrVlFSRVZcTFhSYVVoal53dXp8cHx8coJ7f3J2jYCEdl5Rc2FnYnBnUGpoaGtsbmdkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmKZ6ZXRti6eupaqwsaafi4CWqpyepIyhoZqhoYCVmJONmo+Ll5CNinuGcYCIaIuLfJeac3SKfZB7ZYOHlYqKlZmCfIiFlqaPgaKrkIWQioGKfYCAjnNpj6WEfYWTjYiYn42HkqqmnommeJacfqWJloyymJ6Qg6+Xn6V4loh6qXSlj4SabqWijJKEjIO8bnylr4KGhYaTlpygfaZ6caiUoJZnnn5vq2KWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4ZubZ+ekpVhfquLqnaAf42nn3effYWklZ2gaZqHdatmnq2MtnN3voykk1mDpo2rYXVxc297dHBian5uaGxSVVpVYGFda01dUl1JXWxtdmBbcVlbYFpnc2Vub3JjcXRgd3t+eXJ5g3ODfoF7e4yBgoB2YnhkY25zZFJsZ2hvbHJpZmlhX15cYWpibGx6b1xcYmlibWl3bWdsbmKVpqqcgYCepJapqp6op66jmYmCl6qZnaOJmqWcqJ2Ei5qPhZyRhZKNi410hXqIg2+NhH2Wk3R0hnKSgm1/i5KHhpOPfXuBhJekjX+lpY2AjYmElHWDh5JvbIqogIKLk42InJ6JjJOqo6CQgHWVl4h+gXmUrqN/gZtxj4Z4kIyFgHtyp4xxfX16l5abhI54e359iJSVk4p2kJmfoYR7fYlrjIVbeXlyeXBobn2RiXF/dIGPlJNxhYOBZY1/X4GAjHd1c5R1b3pvbodthIZfd2h4jmaBgoaOqpx+dH2XaomIb391fIR1bWxmjHN4e5d3hFtqWHiPaG13cXBvd3dvXWyGbWlnVllfV1xka2RVYVVeUV9wd3lrandlampqdXxxcXRzYW91YnN7gXh1eYJ1f4B/gHiLhYN9e21/bGR5bl5XbmdodWt4amlpZFxgWmNpZWxwdW5aW2JrZGtreW1obG9hjpW6qaeLoaKapqSZpJ2roqCDg5erkZ2giZqmmqiYgoGbi36WlIeOiYiNcoJ8j31+j4R6l450coNwlYV7fZKLhoaQhXh+gIaYoox7p6GLhY+PhJWCho6Xd3KEqYWNkpyPiJ6eh4uap6Cgq4OJjpWafn6Jlq2oj5KnkHhwnpGDe5NvfqmFcH2VcWpvfIGfi3+SjoxobV2Di4ycm5+Pc5WLiHF0a4J2c39Zcm6Gj4F9fotpXWljeoWDiIBfaXh7m3yDjIN2gYaDaXmLh2thcXODd2BzjIKJkKeVhmaNj4NudouDb4SMeG5kZmN5gnqVWlxpZm52W3p5d3Rtc3KCZlxtimtrYllZXVpYa3FbXmBZXl1mc317c290Y2pqaXt8cXp3dGRtdGhsfH51eXx7enl/gH9vhoqEe31zfnlzf2lUXHFpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbmxnc3luaGptYIyMq7GikKOhmp+emJ6ZqaOhfYOXq4yflIebopCklH97l4R8kpmIiYaGinJ9gIt2hYuBhJaKcW+AcpiGhH6Sg4SGioF6gIOKmp6Pgqagh3iNl4iVi4ucl4WDeqyBkJeZk4menYeIoaqfoqKjjIiTm5yjmZaqoaemoJKbiJePfHmPjoSofn+SkZKTnLClmpSdkI6yk5iEpoyMlZugiZCbgomRimt8jnZ3ZYKGkIp8iZ2Eh4uPh4iAhIOQd3x6dZqiiYeLn4uGlX9+jIGAdnF0hoWAeIiHipGmkYSGjoiDjZCMfIaKh46AdWuBg3t5mWlyaGBzinB9enZ1b3d0gVxeb4dobl9eWltcU2dxVWNbW2FsaHR7fHJucGNqaWh/e214fnFob3BsZoF7coGAd4B9f4R7bYKMhnx6eHx+eoN4TmR2anNucHtla2ViYmBbc2ZwZnJxbFVdbHRtaXl6cGdpa2WNiJ26n5aioZiVmZiUmKSgnXt/maqNnY2Fn5yKnpZ8eJSCe46ZiYaDhIZteIGAcoCHfoiThG1sfnqXhoSDkH6AhoSGfYeDjJqckoeqnoJxio+FkpGLnJF9jXqpg42Sl5WOm5aGhpumoKKanYaDkpmZmJCapp+mnZ2Ql4GSi3d9iI6FpXt8j5CRhpipoZyTnI+Nqo6SgJ6NiZOan4OPl3+HjoJveIVxdGB+g4+FdIuXgIOOgoaEfoWElG55dXWToouNhpuFhY50gIp9fXJze4mEe3mMjoSTp4+GhI+Cg4qJiXWEh4iKe25qfX97bWhrbGdeeX5nfHt2c3V1enZcYHB9bXRgYlpcXlFmbVNlWl1ha2l2eX5wa2xja2pngIBrcoBsa3RveG6EeW6GgHaCgH2FdnKCjYh+e3p8f3uCimBpe2t1aGmDZWpjYGlbY3Vob2J1bWxUYnF5ZHB6enJlam1ti4qfuJqhpJ+TkpaXi5qfnp16d52lkJuJhqSUi5iZeXmNhXyJkYOMgoGCbXx/eHKAhX2KkH1raH2Bl4iBiI58foaEh3yPgI+ampGIp5x/cIuKi5KGoKGKhYx8p5GHj5KXk5aSd42joKGdlpp/gZCZmJOMmqKho5qXkZt/joV5gISPh6GAfoyNj3yXpKCgkpmQj6aNkIGbkYmTmJt+kpJ+h46BdXSCcHZgfYCNhXGKlXyHi3GMfoKFhY5oeHJ5jJmSkICYfoiLcoKHfH1xenyMhXt7ko2DlqWTi4aRfIWGh4R1gYKGh3lkcXp+eHlwbGpmXn1yaHx1dXN8c39qXmBzdnB3ZGNZXl5SamhUZFheYWdqdniBcWZrY2xoZX+Aam1+aG9wan13hXpri4FygYF9gXR2go2Gfnx6f4F9f49qcoNuc2lhiGlsYl9xVXRvbW5geGhtV2p0dmJ1entxYmtveomNn7OSpaWdjpCYj4adoJqcfHWjoI2Wf4yiioialnh7hod+g4l+iIKAf3B/e3R1goV+iZB4Z2N9hpeKgoqNeH2AjIN5loCUlpWNlp+afW+LgZCThqWbh4yJg6WVhJKKlZeSkXaRnaGhmJSYen+OmJaOlpqcpJ6Zk5SbepCGg3iFl42efoGKjoxzl6KdoJKYjo+ijIyDl5iDk5aaf5iNfIiNgXZxfW16ZIB8ioVwhpJ/kIJrh4KBf4mEZXVvfIeTmI19lHiMiXyAh318coB5iod5hZGKi5iiloKEjHeIhIKBdnqAiIR0X3d3fHN9d2ZrZGB+aWp2c3N0fXB7Y2Ngc211cm1hWWBeW2xkUmJXX2Boa3V5hnBjamNsZmh8g2todGhsb2h/fIF5bZCGcYCCgn90fIOMgX9+eoKDfnyQbXWJdHRtZYpsamFjdVaDaXFuYHhmbGJqdnBmeXt5cWBybIaFkJ2umKaono6Nl4eGn5OXmHx3qZyKmHmXnIuLmJB4e4CLfXyDe4CCgHhzeHpzfYCEf4iKgGRefYuVh36Eh3R9fop/fZiElpOWjKKgl35yh3uTkYqmj4yOipKgkYORj5SXkYqBj5igmpKQknSAjZGTiZydnqaYmI2Vl3SOj4pshpiQmXqHiJCJb5edmaKTlIqMn4yGgpKcf5OSlYeZiHuJiYF6cXlqdWx7fYt9bYWRgpN3b4GDfX6LgGRyanyBl5iFf450kYmDeYd+dniBfoeBfYSOhY2UpJB5hYN0iYd9f3J0f4aCbGB6dHlwe29hbmJke2Fub3Zyd3dzc2F2X25rdW5vXVteXV5qXU9dV2JhaG1zeolrX2plamNod4dtZmxoamxngHx6d2+Qh3OAg4R9dIGGiXqCfXqBhH19jnJ5i3l4bmyHa2hfaXJjh2hxb2Z2Z21sYXpoanx6eHBhd22LgZmaqqCkqZ2KipGGip6KlZd9dq2YjJZ9npORlpOId317inx7gHZ3f4BwdHN6b4V9gYCJfXthXH6PkYZ/g4RzeoCGeo+Rh5GRnJKkm5SBfYB8jYqSpIiNio2Xmo2FkZiTlY6JiYyTnZOQjI1uhJCOkYiemaGgl5aJlpJvipqFZ4aaj5R6iYWQinCWmpOhkpKIi5mMgoCRnn2SkJOMmY97iYSHdHN1a3FudXuKdG6GkI2RcXSAe4GCiHxlcW15fpqUfYWJdJGLgXSJeW+BfoGHfYWNioWNlqiNe4h9fouFd31wbn+EgmJnd3N0bnpiXm9ganRecGp6eHhscnBleF1tbHNtc1haXl9halpPV1hkY2dxcX+HZl1paGZiZ3GNbmRpZ2VpaIB6d3VvjoVzgIGCe3WCiIV4hHx3g4V6gIl3f4t8e3J5g2prX3BodH9rcW5tcWdvbGV7Ym1/eXZxbHd3in+jmKKooaebh4yKgY+chpOcdICqlJGMhqCMlZOQf3R7doR3eH9yc3uFa3JveW2JdoCAhm1wW1l+kY2IgICAdnWAf3+gho+KkZyXoJOXd4l+gIyInJ2Jj4aSl5aEiJSZj5aLi42OjZ2KjpCEbomLj5GKnJagm5iVhZiIa4akg2eGnYqRf4uEi4F3k5iRnZGQiImVjn9+j5h8kY2PjZqSfYp/gm92b2ttb3B6hWlzg46XiXB3gHSCiIJ5ZnRvdoGaj3yJhXqVknp3iXRwinyHjXuLh4SJj5yjiHyEd4KLgHh4bml/gX9ccXJxb293Wl5wYG9qXm9pfHpwbW1qbXZgcG9qcW1ZWGFhYm1XUVNZZWZjdXCEgmJda21kYmZrkm1gZmZfZ2uBdXFycIuAdH+CgHh2gIuAeYV/d4eGdoOFfIeMgHt2in9qcWN8Y4Z8b3BsdGpob2x2d19xfnl7dHV0f4J/pZWarZ+nloWNg3+XlYOPnnWKn5OShYqajJWNi3pyd3SCcHKFc3F1iGxvbXVtiHeDfX9sbVVRgauUh4J4gHZygnmCoIGRgZOSmJuRmniReoKMkqSak46IlZiSg4aWmYyTi4mPj4iehZCKfXOLhYiPiJyZnpuWlICUf2mGnYhoh6GIkoSRg4lxg5GXjpqOj4yLj413e5KQe46MjZGWjXyIfIBrdmpta2tsen5heX2OlYF2eoF3g4x8eWd1bHWHlox/iIZ7lJFxeoVweI17i417iX6DjZGenoV8fXiCi312cGhrgIF3XnZvbWtwclVdbmJxYF9tbnlwZ3BmZ3N1aHBrYXdlXVZlYGByU1BOW2ZlXXhwiHxfXGhyYmJlZpFpX2hkW2dwfm9rcXOKfXZ9hYB0dX+MeXuFgHiIg3OGhX6MjIN7eZV4ZnJqg2CHfm9va3pgaW50f3RfdH14hnh0coV8eaGQmrGcpo6Din+DmoiAi55+ipmSjoSIl42OjoR2dHZzgHBvhXNwcYNvaml2bYJufXxtdXNSToLfyZLWk3xwdIN1g6CCkneUkJibj5h7k3KFkJ+hk5OQipKbk4V+lpWIjY2IkY2InICOgXh6jH6IjImbm5yalZN5jXdoipKIbImkhZOIl4OGY4yRmI6UiZaLjYqLcXuUiXuNiIqTkYp6hXt+bHtlcm9qa3l5W4B5j42Aen1+f4aOenpodGt0i5CKgoaFfZaMbH5/b4GNf42IfoR6g5CWmpuLfHd4g494cmxlcH+Ca2h0b2doc2xTXm5kcFlfa3F4ZmtqYmZ4c29wY193YGBWa19edlBOTGBmY115cYp0XFtldmBhZWWOY2FmYVhpc3Nua3F2i3x0eYaBdXZ+i3N/hn96iX9yiYeBkYqIfH6YdmVzbnxliH9vcGyAWmxueXlzYHZ6e412cneKd3mfjJuvm6CQgoV3iJV/fYmchoSfkI6FjJeEk46HgXV3cHlxboRvbW5+cmRkeHB8bXp9amhsY6Sawdyu76Fza3WDdYShhZFulY+Un5SbgZFwhYujl4mOlYqQnZWCgJWQhYmPgJKKipd/h3t1f4l4hoSNm5qXmY6Qdot3b4iKjH6LpIWSiZ2FhV6LlJeKjoiOi4qEiWx7l4J9iIWJkY+GdoV9fWt9Y3h1aW14c1eIepGGhHl+f4CFjH55ZnRqgIqPioODgIyXhmyCdm6JkYORhX+CeoCRlpSZkHR0eIeNdXNwZnR5gWFzbG9haHVmUmBwZ2tVXm1zeWByY19ofXFybVpicmFiV25aXHdNTUxjZmFednOKbVtcZHleYGRmhF9jY15YanJrbmtyd4t9c3eEgXh3fIhxg4R9foh7dIuIiJWGjH5+l3NodXF5bIx7bnRwgVhxenZ5cWR3eYaMaXaAiXKAnYiZqJyjkoR9cIyUeHmLnYSEoI2OfJWMf5mHhHtzd3Bzam+Ba2lsfHReYHh2e3B1e2dgZXzr2rXJw9yIc2xzgHaJmoiNaZePjpyUkoGIcIWIoI6Ei5WKjJiTfI2SiIOJj3uRi4aQgn92eIOEcoeCkpuWk5iGjHaHf3GGg4qHmqKDlIyeg4lhg5WOhomFiYyHgIdpfZR/fYOEiY6OgnGGfn9xd2d2cmlzd2tajH2SgYR8f4OAhIqCdmJ0bImCkIuCf3+TkX1ugmx5h5CHk4R9gX6BkpSRl4lucnqMhnVscGpxd39ec2huXGp1YFJkcWhmU19vdnRfb2BdaIJxcmlXZ2hjaVhtV1t1TEpMZWZeYnJzhWhbXGV5Xl5kZ3phZF9cWWtuZW5qdHeKfnNzgX56dnqHc4WDfH+Hd3aKhY+YgY2Ce5N2bHd1eXmTdW54en1YeYZxgG9neHeSgmR2hoVxipaFmaGbooqGc2+Si3J3jpx9iZmIiXuff4OZf4F5cnNub2RyfmlmbHd3W194enpxcX9pYWdhf9W2jpCmeG5xd3txkpCMh2qYjYibkYuGe2iHi5mGgZKRhoeXjXyNjICAiY18kIx+ioV6dXuCenGFgJSYjpKTgYl1hId3hICLlJ2fhpaPn36IYX+Th4SHg4mNf3+CZn2RgH5/goyPkH9tgnyCdGttdnRzdnVrY42Bjn+EfnyEf4SIf3Bgc3GGfI+Ngnx/kol6cYNme4SLh42EfIV+gZWPkZOEbnB5jH51bW5panl8YWdpaVhrdVpSaXJpYlBicnhsYWVdWmqDbXNiW2dfZGxfblRab05IT2ZkXGducYBrWltjcl9cY2x3ZGVdXFpsa2JtanN2hn9xb398fHR4hXiFgnyAiHV5iYGSlXyIhnaIgXB4eXuEk29te4F3XoN/dIFtaXpzlHNncoh9cpKRhJqfm6CGh3Z2lH9tdpOXfYeQg4qNmXyLmnZ+d3FvbGphdHxnYml1elpfeHx5bXF+ZWNoaFedj15xcpa8xIR2cZSIkH5ylouGm5KMh3JqiI+WgHuUjIGEm4x8ioZ8e4mMf5SIdYqGdnZ9gXF1hYGdk4WUj4ODcoCIdYV8ipmdmIeUjp2AiGZ9k4J/hYOJiXGBfWZ+i3t5fn+Hi459aYB8g3Zmb3h4c3ZzbGqNhYqBiX94gYCFg39rX3J5e36NioZ8go+BfnKBaXmEiIyGhXmEfYGYjZCMfW5te4l9d3RuZ2Z7dWJbcGJXbnJTU25zaGFNZnR4ZWBdXFhugG9zWWVhXmptYHBPWWtRRFNnYFprbm18blpbXmxjWmJvd2RnXF1gbGljbGlzdoGDcW5+fH90dYN6g4J8goV2foiBlpB4g4p0gYhyeXh+jZBvb3uBcWmBeXp+bWx7dZVraneEdGyUjoaemKCZhYhufYx2aniYjn6BioKVl4l5jpZvenNwbGpkYHN6aGBlcXpaYXJ9eWdxemFlZY+xsndKYlqk2dCWcnuQipB3fpSKhJmRjIVua4WSkXp5koaAhJiKfId/eHiJioSWgHCMiHF0fXppeYWDpJCEk4yDfm9/g3eEeYacmZWLk5CUhYdwe5KCfYKDiINugXdogIV4cn9/g4qHfGV9foR1Y3Byf2h4cG91mIyFgop8dniAhHmBa1xxfnOBiIWJfoaJe4lygW5xhYePhYVzhHqCmY2NhHhub36Ef3Z6ZGdpe29eWHZaWHBsTldxc2dgSmx2dGBdW1tZdH1yb1dnXWZqcGBvTldoUT9ZZl5ab2pnenFaWllrZVljcXlfaFxeZW1oZWtpcXd/h29sf36AdW+Ce4CBf4N/doGFiJeKcYKNcXuGfHl5hJOMdWp6f2xvfnV/fW9ye3uUb26Bf3hmk4uDoZmckoKGZ4eDcGd6lYh9foSBmImBfI2MaXhya2xmX2FueG1fYm94XGRsg3phcXZfZWXU6r6KMjo+i46AcXiFiI6NdoOWjH6SjYx/bWyFjYx2fY9/hYGViHyCeG52h4SDl3dviIVsdXt0ZnmCg6aLgo+Lg31ugHV3hHqHnZGMkZKTjIuGfnuShnd/hIyDa39yaIB+eG18fIKKhHdieYSBcWRxaH5tdHF0gZuLgH6FfnN1fYBzgW9bbX91eIuDi3uHgHyIeHpxbImEkISLcoJ6gJeLi390bWt3gIB1dVxoZ3ZvWFZ7UllvZExacnJlW0lweG9cWlpZXXV+dGhZYltnZW5jaUxXZlE9XmVcXXVlYHVwWllUb2RZZHF5WmheYGdtZ2lsaXB3fY5saYKEfnlugHx8gX+CenWCgY2ThXCAi253foB7e4iSiX9oe31qdHtyhntzd31/jHl4hH18a4yNhJudloyBgGyNfmtofo2Men5/g5SBfn2KiGt1cWdoY1tiZ3JuYGFrc2FocIl6YnN0XmNkm6CPblw1Wa+1dGmAiHyShnWFloVzj4qJdnBshYOHdXmJeIl8k4d6fnNndol+fphwcYZ+aHZ5bWV5iISkhoCHjYl+bn52gIF9jJqIgpSRmImLhIl8j4hwe32Ee2h+bGqAe3ppenaBh4ByYHeBfnFkcmZ1gm11e4SUkYF8gX9ud3l8dH9tWHCAd3WMgoZ4iHaCiXp4c26KgZCBhnN/fX+TiYh6bm1qboKCdW5dZ2RycFFaek1ab1xOW3JwZFVLc3hpV1lZWmFxgHRgXV1gZmRoaWZOWmhOQGFkW2B1YV11bVhXU3RhWmRvcldqXWFoa2dtbGlwd3ySbGmEiXx8cH5+e4F/gnp3gH+Ki4Nxe4dvcXeEf3uJjY+Dan57bXd4dop3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISIkHh9e4GRf39+ioNwcnFjZl5ZZ19vcGBgZ3Bmam+JdGF0b1thZGp2e3++nKajyLhxhYNyknx4hpOCc5GMh3Jyb4N7g3R1h3SId5OIeXlxY3eHeoCTaXKEdmd3dWNqfIKHnYF/f46PfXJ/dIV6gJKRg3mWjpWPiIKIe4iIa3h5fnVnemhsf3lzaXp2gIN9aGB3h31qanNne4BpdoCLkJR+en1+cHt2e3R+YlZ3fXJzioSCfYNxh4p3eHFwhIKNf355fn12joaDdmlxaW2IgnJwXWdhcW1KZXVLXW5VU1lzbmJRT3N4YFJYWFxhb4JzW2FcaGVlY2tkUVtwSURjYVpjcF5deGhVVlV3XltlbmhWa15hamdlb29ocHZ6km5piIx4fXJ7fnmCgYF8dn2DiIaDcHeDcm53g4J9iYuTf3CAe3h5eoGMdIN4f4GBgoR6gHVvfoqLm56IfYV6d4Z7Z3SFi5B6fn97iIWEdo+AZ29uX2RcWGVZbXJgYGBwbGtoiW5gc2lZXmRtgHep2qnHhoeycYl3b4x1e4aOgHqTiX91dHV+d4BwcX9thHSUhnh1a2B6gnmJj2ZxhHBndm5bbXyAkJN/gHmRkn15e22Id4GSjIR0loqRjoeFhXt/hGx1dn9tZ3ZlbXt1bWp3dn9/fGBieIV5aHR1Yn17Z3SGjoyVe3SAdXF/enxtf1lWdH9wdYWHf4F5bImGdHlsdYCDhH57fXl7c4uBfHNndGVui4Rtc1tqXnRkR21tTFphV1ZVeG1iUFJ0dldQVVheYXGEb1xgY21kZF5vYlRdckdCZl9dZmhdW3tiUVVcdVtaZ2thVmpfYG5lZmtxaHB1eI50a46NdX52eH13gYOBe3N9g4iHg29xf3RxdX+FgYmNint3f3iDe3yFh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeV59hZiMeYaDdIWGhHeJe2JubVxiW1thVmpzY2BbZ25vZodxYXFmV1xja398ys6HuaFqbW2KbHGEcXyEiX57kYV5eXN5dXV8amx1Y4R1koJ3b2ZefYJ6i4lmcoJranFjWG16hZuIgYFzl5R3f3xuiXKCi4yIcpiOkYmFi4N7eH1xcXB9ZmhxYm14cWprcXh9fHpcZHmAd2l1eGWCdmd0h4uNlHxxh2pufYF5bnxdWHJ/bnSBi3yCb2+Kf3F2aHd/gYCBd31xe3WHfHpyZnNhboyCbHJYal12W0htak1VVF5UVXtrYU9UdXJQUVRWXmJ0hWlcYGtqZmNZbmFYYnBHQWhcYGZeXVZ7XU9VZHBaW2poXVdoYF9yZWpocmdwcneGeG6VinR/end+eIOHf3Vyf4aFjYJwcHt4d3V6hoWGjIV6fH90i359hoSEh39+fn2Hf3x4dnl4kZOgf4x9i211gHljg4aWhXORim+FhYF6g3RjbmpZX1tdXVRnc2VgWWRxcmaBc2JrZVdbYGl/eL6ue6C3bWJzhmhze3F5goV7fYx/d3hydm97dmVqbmCHdY6Bc2piXn94eYuEZ3F+aGtrWlZvd4mjgYR/cZmTcYB5dYNugYOSiHOViI2IhImFfXh0cm5oeWBqbWBtdmpnamt5d3p3W2d9fHhlcn1thHRldYWMhZV/b4tmanqDdW10YlxwfWx1fYx8gWZ1h31ucWh1f3h+f3N9bHt7gXp4cWZsYm6Jfm1uVmpfdlVKaWpPUU5oTVl8aGJOVXVqTFBUVV5mdYNmXWBwaGdhV2ldW2toSkRqWmFkV1lVeVlOVm1qWV1sZVxZZWNedGVsZHFncm91gXhwmYV2f353f3yFh311c4KIgJWCbnN5e3pzc4WGiIiDeIF9dY9+fISKjoSChHt+i4N7d3x3d5qdl3qKgoZpdn18bIOEkn9yj4JwhYJ+gX9vZmxnV11bXFtUZHBkX1dicnVpdXBlZWJXXFxof3BvcoBziWRkeH5pdHVzcoKEeICEeXd0dW1renFiZ2tnhnSNg25mXV99cHuJfmlteGZpZFVXcm+NpnyDe3aWkHR8c317bnx8kYV3mXyIhoOGg310cHJsZ3RcbGhebHRkZ2Zpem97cllngHZ0Z3CAd4F1YneFinyUgG6Lam16gXFmc2Vhbntnc3iKfH5idoN2amtxdXtxenp0fWZ+f395d25kZmJuhXxtalZpYW9SSmhqT0tOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2llYFZjV2JwXUxLa1hjYVVUVXNWTFh1ZFpfa2FcWmNlX3dmbWJwaXNucn91dJqBd3+Ad39/hoR6fHWChH6XhW5ydHx6dHGEhY+BgHqLdXSQf3yBlY6AhYR9foyGe36AdnujpYp5iIaEa3V8enWDgYt5b4VzeYR9gYN1bmpoZVZdW1paU2JuZFtYYXN7aWhtaWBiV19baoBpa2+AZ2tgaHl4anN0dG6EgXp/fXV1bnpoanlqX2VuaIF2j4RnZVhid2l+h3tvaXBnZl1VWG9njqh3gXp8kI55dXB/cHN2eo+AeJV1hoOAhYh2anJ2Z2huW2xkXW1zX2dhanhoe21abYJyc2pvgH55d2F3hIR3j4RyiHFveX9xY3BoXHB4ZHF0iHx4Y3OAcGdqeXRybHh3dnhkg3t/eHZwZGNjbnx8a2tVaGFlU0prZ09HUmtFYXhnYU1TcVxKTVRZZWt3e2VfbXFpZF1WYFZubldLU2hXZV5YTlVsVEpceV9bX2tdXVtjZWB6aGthb291bm94dXqYfXeAgXqAgIeFenl6g36Bk4RxdHR/eXZ0hIiQfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aErJ9/eoiIg2tygXl1gH+BdG6Gbnx/c4mAam9tZGRYX1pZWlViamdbWl51gmlebWxcYVZcXGyBZXF0fWlpXGt2dWd0d3JthXt9fXl1cmx5aGl4Zl1lc2h6d5KBY2NUZXBngoV3d2dpamBXVllnY4+nbn53gIuOenBxfWh6b3qNfHePcoR9f3+GbmR1c2RoaFxrYl1vb1tnX211ZHpoXXSAb3FrcXt9dXVhdIWKeoeHgH93cnV/dWFwbVpydGJxcoV8dWVygGxhbHtvaml7eXZyZoV2e3p1cWRhZW1zfmlsVGheXFRLcmJQRlZhR2J2Z2FLVG9XSkxXWGdrdnpkZW5xZmNaV11ZdmVVSlxjV2dYWUlXZVFIYnhaXV9sW15cYWRef2lqX250eG5vbnaDl3lygYB8f4iLhX11dYZ5h4x9c3V1gnl6eoKLjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj66Me3uHj31lcYd5c3x7dXJvhWx7fmyPemJwb2JlXWVWWVlWY2ZrYF1cc4VoWHBuWl5XWlxse2Jwd3ZtYlpsc3NndHVwbIR5foB5d25udGVpdGVbaHVmdnaRel9dUmZma4OCdH1iY2lcVFhdYmOPpWh4dIKFkHhtb3poeG58hXt1iXOAeHx4f2hldm1gZmBeal9dc2tZZV1vb2J6ZVt3e2tubm93eHN0ZHKDkn6Hgoh6dm9yfXNid2Rbb3FicXGCfHNncoBlXm52aWRneXt1bm+CdXR9c3FiX2Zub31kaVNnWFhUTXdfUUpZWEhidWRhSVRtU0pMWldpbHJ7Ymxsc2NhWVlbYXZbU0xjXVhpU1dIWWFOR2l1WF5hbVtbX2JiXYVoZ2FueHlsb2p2gZB4bYJ+gIGSh4OBdnSJdIyGc3F3dYJ3fH1+jI+AfpN+cHeVg3yZknmAgHh5fn90iINzcJmie3p/iZR4ZHWIeHN3dWx0b35seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGJZVNybltaWFhgbHZjaXVqaV5ZbXNxbHNzc2qFfH5/fHZubmxkaXFjW2tyZHR2jnNbV1NlYXKAf3KCXWJjXlNaYFtjkZ5lcnGFhJF0bGt6bW9we3x8cYF3f3N6enpkZXVoXWJaYGdbXnZoV2JdcGhhd2Bbe3ZpaXJud3NydGhwgZSChn6EdnJqcH1tZndXXGtuYnFzgXpzZ29+W2BwcWFfanF+bGx1fnNxeGtwYVxlbGx6YWdTZlRXUU91W1FPWVJIY3RiYEZValBJUFpVa2trfGVtb3FhW1pYWWxwV1NPZldXaFNURlpcT0hydFhfY21jWGBgYV2LamNkbXl4a29pdXmGe2uDfX+EmXyChHl9iG6PhnFvd3p9dIKCfIqOgoKXdHeCk4WBn4l1gICBc3+CcYeCdW+il3R7houGe2V3im5uem5meHB6a3N2coxrXnRuYWdla1JdW1VnYWxsWlxwjGRPb25dVlhVZ2p0Z2J0ZWVdWW50bXB1dXlrh3x/fIh2j3NkZGtuYVxubWNzeIdrWlRWY2R4fX1xhVxjX2NUWmBZY5WVY25wg4WKc2poe29mc3dzfGx6dHVven51XmZyY1teVmFkWWF0ZVVfYG1kYXFdXX5vaGlzcXNwdHVqbYSSgYh7hXFyZm59cHJvU1tma2ZxdIF3c2NsdlVicmtaX29mfWZtd31zc3NqbWBaZGpqd15mVGRUVVBUbVdRVlNQSGRzX2FFWGlOSFdUVm1oZHxpa3hrYldcVVt0ZFNSV2hRWWVUU0haWlBNeHZaX2VsaVliYF5ej25hZmx5dW5vaHZ2f39sg399hpd7f4eBin5rk4hyZ3SAe3WAgnyIjn+Lk3J8ipGFh5+Ge3+GjHOBhnN9g3ZupYxzgY2LdndteoxgZHtwZnpzeGxtcXaCZ2R7bGNmZ2hTX15VZ19sb1tebo1oTmltYFRWU29nc2xmeGRkXFhwdGxxenhybYh7f3acenlrYWVsbV5gb2plcXh+Z1pWWGBseHx7cINfYl5nV1hfV2SbiGJrcYGHfXdra3htXHdxbHtqdnNub3uAclhqbl9ZXVViY1hkcWJTXmFoYmJsWmB9a2Zrc3VubXd2a2iFi36IeohtcWVwfW1ybWNZYWlpb3SBdHNfaWxTZXFkVWJuYnpjcXd7dmtwbWpfWGFnaHRcZVVhVVJOWGVST1xPT0hlcF1jRllpTUlfS1htZF94aG5+ZGBUXlRddVxUU2BmTl1hVFNKXFlQWXV1XV9lbWhYY2FbXo5xYmdqd3Fzbmd2dHqDcoGCeYeNfnyJh456bpCKdGxzgnR/f4eEhpGElY95foyPh5GbhIB8jIRygIFzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Njo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyNjIyNjY2NjY2NjY2Nj4+Ojo6NjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQk6lr62tra2upJ+goKCgpV4qLy8vMCxIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzQam2tLS0tLWoo6SkpKSqVhUcHBwcFzqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX59fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGj5CQkJCQkZCPkJCPj4+IgoODgoKChYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpOQipCLi5CJj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Mi4uMjIyMjIyMjIyMjI2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6HiIWJi4aIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQj4aKhoeHhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPiYiOiISGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGh4eFiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNioqOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2doaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFFQD46Oz4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7PDw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PTo3Ojw8Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTg5O0s7OTo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgYCBgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT4+PTpNelI6PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExLSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz49QEhHQF56aT0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpLS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFREg/O0BjfHt1c3hsOTk8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcXJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBOTD5BPDw9Pz5CQz8/QUFBQkBFc2I/a4WEhISBeWw7OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhKSkpMSkZGZ3BvcXF0dnV3e3x9fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDP010em2AgIOBe4N+cEA9PT8+PT5DRD88PD0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhtb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VATnN1gH57g4N8hIRoQUFAQ0BAP0BAPj08PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3x9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBJcnN/fn2EhYWFhl0+Q0NFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS01KR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARURmdoCEhYWFh4eJgkpERURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR1l5goWHhIGGiYmMYUBCVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTGCEh4iDgYOHiIl7V2yEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExJZIeHhYGDhYCBgYOEhoWEhIWGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkpsh4aCf4ODgYGDg4OEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+PDw9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWmFgYB+gIKEhISDg4SGiYqLjIuKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNFdYV/gIGDg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ojo8ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcnJ0dHV3eXt7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOUeBg4CDhIWEhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw5Ozw4Ojo7Ojk5OTw/PD1BQkRJSk1LSkxMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz88VoaDgoOFhoWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD8/QT0+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJgh4ODhYaFhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGRUZGREBCPz1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQERERWSIg4OFhYaGhoiJiYiHhoaGh4mKiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QEBBP0JDSEhKYIaCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAOTg8Ozw9Oj9APkBAQ0ZKSlBog4OFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhHRUpJREpIR0xKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0BFSUtNVnODg4SEhYWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLXlFRUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUhMTVFXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1VSUlRST0xLSkVFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExLTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNGVk5GT1FRVVl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs6UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISUhFRklISUhJanJ2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f3+AgICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVlZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQPkBWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RZZ1JVVlhVVFZUT09NSkxKSUlMTUtPTVRwdHZ4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVlYWVdSUU1QUU1NT1NRUVVSYnRzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/gICAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFhTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3R3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFpaZHF0dnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVFJNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlRVWlxtcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f4CAf319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVVFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUEhGT0ZERUZIR0hCQ0hHSEpHQ0JBREBPUE1SZHN1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo7PkBAPz8+a1FLYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQj8+PD1CPkpNRlVudXV1c3R2eHt8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTFdOSEdAQjw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXZ1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGRE1SUGFXUlhRUFNTUlVbT09RVlBNSUNGPjo6NjQ4Njk3OTozNjY3OTY8Qj1mdHV2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhSTFhZWlZYWFZYWV1XV1hoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUVBTWldUVE1RU1lTXGVVT1NUUU5MSUhDP0E5OTg4OTc4ODQ3NTc4NTg4R25ydXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk9PVFNUXFZSVVNSTk1MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3l6e3x9fn1+fH19fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSkdQUE9PTVJKT1BQUE5OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUkxJTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUU9KTE1NS0dFRURCOz08PDk9RzY2NzdEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTU9PTUlNTElMS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V4e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPzw9QUBCPT5FSEdERkZJR0tKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT1BMTE9MSk1MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRD9CQz48QkY/Qj9BZHF0d3p6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVRTU9OV0tMTktMTUxMTEtOTlNkTUpMUklJSUVBSEpMTU5LR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zb3V0bHBwcm9vb3J2dnJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0dLRT9CPTk5OTo/Qj88QUJCQURER0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVExKSU1URklJSkxKSktJSUxNT1BSUEtHQ0xHQ0NKSkxNT01JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFudnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtDRkhIR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTU9HSEtGSEtESElLTUhKTEhISkxLTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbml3dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0NGRUdERUVGRUdDQ0A+PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkNCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTU5NR0lMR0VGSUlMTktKSEVPSUNHTU1OTVBOT09NTElISU9SUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VGRUJDQkVAREI+Pz46Ozs9Oz0/Q0E/QUNGR0pHSklMSEdHR0ZFQ0A9RUVCPkFEQ0NFR0hJR01QSUZGR0tOT0tGSEpGRURESUlIS0lGSFBLREpNTFBOT05PUE5KSkhNUlVUUk9XZGFhbWdwcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRD1CQT5BPTo6PT87Pj5AQj9AQkVHSkZJR0lHRkZGRURCQUFGRkNCQkJERURHR0hGTFFMSU9KSkxLSUdIRUZFRENJSEhLSkdLUk1DT09OUVBPT05PT0tLS1BVV1ZVU1hgXl1pYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJra3NNRkZFSEJCQUREPEFBQEM8ODk9Pjo/PT9CP0BAREZIRUhGRkdGRkVDQ0VDRElGQ0ZFQkVHRUVGR0VKTUtIUU1KS0hISUVGSUhFQ0lJSktNS1BTTkRRU1FRUk5PTU5QTUxOU1dWV1hWWF5bXWRgaGJqaWdrX2RlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRkU8QENCRDw3Oj0+Oz46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSEpMRklIS0hFS0tMTU5PUlRPSVNVVFFUUFFNTlFOTVFXWlZaWVZaXlpYYWBgYF9oZWNgZGVnZ2ppaGpmaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vcnN5TUhIR0lEQUNIRTxARUNFPTg6Pj48PDxBQj0/PkFCRkNFQkJIQ0NERUZGR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEpNS0lOTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVxfX15gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCRUdFPEBHRERAOTw+QD8+P0NCPEA+QUFGQ0VFQ0hERkRHRkhIRkhISUtKRUpISEtIRkZMSEhISkhMTExMTElNS01OTU9MUFBRVVZXT0pWVlVTU1JRTE9SUlFWW1tdXltcXmBfYWBiZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvdklKTElMR0JFREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRUVGR0VJRUZFSUhGSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk9OT0xPUFJVWFZNTlRWVVNSUVBNTlRTUldbXl5fXV1gYGFhYWBiZGViY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3Z0dXV3dnV1dGVxc2twcWpydm93Sk1MS01HRENBRDw/RUVFQz1BQUNCQkNFQUNEQUFFR0NIR0hHRkpGQ0dKR0dKRklMSElKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGVhYWNpbmhiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdEQUBEPj5ERUZDQENBRURERkNDRUdDQklFQkhKSUhIS0ZES0pHSElJSUtHSkpPS05MSUxISk1LWmZKZFxLbFJIT05fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDREJFRURGQkZGR0NESkRFSkxMSkxNR0dNSkhKSkhLSklLSk5MTU1MTElMTUxbc2JkcF5sbFVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXHB1Z3BNSnJ5dmtiYGtlZW14bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9CQj89QkZHQkZDRURFRURDSEhHREVLR0dMTU1KTUxGSk5ISUtKSUxKSkpLTU1OTU1NS05NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcYHNscWpVdXl4cGNea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPT8/RkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklMS0lKTUlLSkpLT1BOTk1MTk1MXGhkdV1scVdsTk9RbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0d0lNR0lERUVDQUI8QkBCRkRHRktHRUNDSEtISEZKTExGTktMUlJMR01NSE5KSUhOSEpKSUhOT05OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0JHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpMTU1MSUtLS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBtaFxqXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3NISEZJREVERkFAQUVEREdCSEpMR0ZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSUtLSUhKR0tLS0tHSEpKTExMS0lLTE5UW1xUUFRNUE9OT09WUU9PUU9PUUpKTlBRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdJUEtMT0tMV01JRUVISUpISUtITEpIRkhISkdHSUVGTEhJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R4eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRUpKSkdFSEhQSkxNSk1TSUhFQUhGSklLS0lMSkhGRUpIRUZHRUVKR0NKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY2BZX2JbYF5bVFhYWl9eZGJiYWNlaWVrcnBvcHBub3eHhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRUZISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVBRkpEQEpLSU9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJiYmNjZVpSWVZVXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUxEQ0tKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRERAREFISUE/SElHT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlBQXV9hY2NjY2JcZGNiZGNmWFFVVFNcWFthX15fYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdIR0dKRkZGSUxKTkVDS0pMTkpMSUtKSElHQkhIUU1LS09NS0tJSEdFRD9FQkhIQUFGRURUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYGBiYmBjYmJkZGJYT1FSUltTXF5dXl5fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4iHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSUtOTExJTEtJSUdESEtRT01MUExMS0tISUNFQUVDSEdCQUZFQlZVRVxUXVNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXGBgX2JjYl1iYldfX1RQT1BRWFJdXFxdXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUERXX0lHR0hERk1KUFBGSklKS05MS0tMS0pKR0VKTVFRTk9PTU5MTkhLQURBQ0RGRENBREVBTEhDTExQT09MRk1GR0lKSEdMTE1PUUlMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVteXmFhZWZjaGNrbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5MR0hZTUhISkhHTkxRUUlMSktLTk5VTk9LS0xHR0tQU1NPUE9OT05PSEtFYEVEX0xEZmNETVtIXlxzbU9NVm1ZTENQX1VsV2dKXVhWXkRMUVVMTVRWUVJUWFdUWFVUXFRQZlpoaGRZVGtUV1ZVW1xcYGBhYmJiYGZpZ25saHJ6fH1+gYSEhIODg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVElLR2BUSEpPSklPTVJRS01LTE9SVVJPT0pMTkdITVFbWU9QUE5PUFBKS1B/UUl8WVlyc1hQbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZWl9WVVd/anR1dV9hdl9YYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSUxGUlZMS09JS1JYV1FOT09NUVROT1FQS0xPR01QU1taVFFST1BQUEtIWnhdVHhkaFlSVFF2Z3RscGJuZmtRck9Nd21qcnBzcnFycG9wgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3N8fW9+eW9/cl9gYGJhWmFgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUE9NTUpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUFRQUFBRS0dmeGxjeHFtWkpMVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Bnb1h2dmp2dXCAYXNofWlseHxvX19fY2JbXmJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN1em58fXl4cm5OSlN0TkNCRVBQSUtLSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUElTVFVYV1dQVVBPTlJKTHJvdXVxdXFkaGFWbkxxcF5GaHlXdlRLaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLW1ZIR0VHUlBKTE1LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VVdsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraGxtcnxrbWhre3RtbWttT0dKS0hKSEhSUUxOUE1MU1NST1NTV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT05MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VTU1dbV1hXWlBTVVdXWFFdWFZdVVNPWFJXV1dYWmBbZ3JeW1xbXV5fY1pfY2NlZmRjY2JZY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlRSTVFRUExWVlRQVFVYVVlVUlpdVlVUV1VZWFBPTE5XVFFOVVNOUE1MUVBLSlFRS1FNS0tPUlRSUVFTU0lITU5PUVJRUVFUVlJYV1xXU1NQUlVVVlRaUU5TUldVVFlWVFlVU1JVU1RVWFlXXlpfYV1cW1pcXGBjXF1iY2RnZWRkYVlgYWNhYmloaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFBKS0tOT0xNVFFPVFFRTVhXVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUE1STktTUE1OVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtTT1NVV1VUWVVXWVRSUldVVVdcWVpgXVZZX11eXVxdYGFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNhUEtNTFBRTE9UUFBTUU9RWllYV1haWlhYVl1qZFZYWVpXVlRUUEtPVlRQT1RQUFFOTVFRT1JYVFJRT01PU1VOV1JUVVVPTk5RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1ZQU1ZVVVZYVFdXVFJSWFZVWl9aXmBeVl5dXmBdXGBgX19aYmJkaGhlZGJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlFXUlNTWE1PUFJUWFVVVVNVWVhbXl1cW1ZST1VXVltbV1BTV1VWWFVTWFpUU1FZV1ZcXltfX2BVYVxgYV5gYl9cYF1jYWNoaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXl9bXl5hYF9iXFlgWlFOT05WUVBVU1BVVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUkxRVFNZWldVT1JOU1hWVFJUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFZWXFxWUVRWVlhZUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGheXGRgYWBhY2VfYl9ZWl5bXFtZWFlXV1pbWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dW2BcYFVcXWlqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVtZWlNPU1JWVlVTTlZSU1pSVFVUWFxXWFhTWFxYXl1ZW15UVU5WV1deW1hRVFVYWFhUVlhbVFNWXVldXWFeY2NeWWBbZWJfZGReXmNjYV1lZmllZ15dZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFpbXlZeWV1QT09SWlBaVVVXVlRUVF5eYF5eYlxgVV1eYmt5dGx9bFpVWlVRUVNcVFRUVVRWWVdMUlpWXVtcUk9VU1hWVlNQV1JTV1NXVVZbXVhbWVVaXldfXllcWlJXUllYWV9aWlNUVlpZWlZXWVxWVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGVlYl9kYV9hYGJiX2BeV1heWlxcWllaV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxYV1dWVlddWFBVXFleXV1UU1hSWFZTUlRYUlNWVFhYWF1eWF1bVV5fWF9fWFxWUllVWVpaYVhcVVdXWlpaWFlaWlhWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1aW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZUXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2haXFpWWFVXW1pZW1lYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXWlpcX15aX1xWX19aXV5ZXlZTWVhZWl1iWV5WV1pbW1taW1lbWVleX2BgZGNkZWViZFphZmNnZmVeYWNgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWlhXXFtcYF1WXV1TUFZaV1ZaVVlVWFdYXmBiYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcU1ZZUFZWVlZWVlNWVFhdXF9gYF1hXVdgXlteXFteWFZYWFtbX2BbXlhYXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYWBlY11maWRlaF9mXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZGFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFlYXWBkZF9SWFlQWFZYWFhXVldWXV5eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgX11fWVleXV5eYV1bWllcX2JfYmRkZWZnZ2JaZWdnaWdjX2NeYWZkWmhpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFhXXVxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFhaYmVjYVJcWU9YV1lbWllXWllgXmFiYmBhY19cYl1fXVtfXllZVVhdXV9gX19bWl5eYGJjXFtXW11gYmJjZWRnZmVnZFxmaGhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddWlpfXVxeXFhdXF5fYWNiYWFdYltiZGFfY2JiXVxbWldYanFgXGBfXVxhY19eWVljZWRhVF9aUVlXXF1cW1pbW2RhY2JjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJfXVNcX2BjZGRmZWdmZWZlX2ZnaWhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t6enp7fHx8fHx8e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t6ent9fX19fHx8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiI2xtbS0tLS4USYrKysqJWKSjIyNjY6Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyLkbvAv8DAv8RJFBsbGxsUXZaPj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIOBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl6ent4bm9vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9gIGBgYGAgXdyc3Nzc3J5fX19fn59fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z4e3h7enl9eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t6enp6enl6fH19fX19fXx7e3t7e3x8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8e316e317d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x8fHx9fnx3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3enx6e31+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp9fHx8fH57eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4enp5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgoOBgoWFhoWGhoeGhoaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOEhIKBgYGChIWIh4eHhoaIh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoOEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgoGBj4iBgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf3+AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGCgYOCgISZkYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCCg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIJ/fn19iJuVhYSChIKBf4CCgYKCgYKEg4GBgYGCg4KCgoODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4OEhYOBgYOCiYiFfnx8fX6BmpiEhIWEhISCgYCBgoOCgoSEg4KCgYGEhYSDg4OCgoOEhIODg4ODhYWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjYyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH9/gIOXkYZ9gX6CiX6SmIKCgoGBgoKBgIKCgoKCgoODgoKBgoOFg4ODg4ODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJOUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/f39/g5uehYSKf4CEf4KJgoGDgYGBgYKEg4GBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBmKKHhYSJhn5+foGDg4SCg4ODgoCAgIKCgoOCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGQnYSAgIGBfX19fYWFhYSFgn99fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4aOgoB/hYyBfX19g4eGg4B+f35+f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4OBf4CGhoOAf3+BhoF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4B/g4aDgoOCgYCAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISCgIGFhIOBgoGBgoKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4OCg4SDg4KCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWEgoKEg4ODg4KCgoOBfn19fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomIg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4OEg4SRkpGOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoWAgoSDg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+BgICCg4ODg4OCgn99fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59gIKDg4KDg4OCfX1+foCAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+f4B/fX9+fX6AgoODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAfn5/f35+fH5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39+fn9/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/gH+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgIKCgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgYGBgICBgIKCf4GAgX+AgH+AgIB+f39+fXyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4WEg4OEg4SEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgICAgICAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhoWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICBgoGCgIGBgYB/i5OPjIuNjo2Ih4eFhYSEg4KCgYKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKTkYyMjY2OioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNi42OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjIyLjo2LioaEhYSEhIODg4KCgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGDgYWGhYWGhoeGgYSRjoyLiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYqIi4mFiJGOi4iJh4WFg4KCg4SEg4KCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mMkI6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB/gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjYyKioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChYWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIOBf4CBg4F+foCAfX6Afn1+foCAf4F+f4B/fn9/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18iYqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH2JhYaFhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHV0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX19fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIaChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+f35+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChH+DgoKCgoKDgYGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYOBf4CDgn9/gH+Bf4B/fHt7enx7fIGAf4J/f4GAgoKBgX9+f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB+fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgX9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f31/gHx/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWBhISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIGEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoCAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/f39+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fX5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SDgoKEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgYB+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHh7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn5+fHt7fHx5d3x5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+gIF/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4GBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx7e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhIODhIGBg4CCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGAf4KBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t8enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF+enx8fX18ent+fn6Af3+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ+g4KChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKCgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fH19fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn5/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4aCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIB/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEg4SFhYOHhoaEhIWEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFgoGEg4B/fX1+fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISDhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4KDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH98f318gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFhIWFhYSChoaGhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn1/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIaEhoaFhYOFhoWGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWGh4eIhoSGhYeGhoWEhYWEhYWGiYqHhoSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGgoSEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSDhYWChIeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX5+fH18f3x+fnx9gYB9fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIOEg4KDh4OEgYKEhIOBgICAe3t+fnx8fH19fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhoaIhYaFh4WEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeHh4iGhoSGhYOEg4ODg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWIioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeHh4eFg4aFgoGCgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYKBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiIh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGh4aGhoSDhIWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeIh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWHhoeEhoaGhYWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoODf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH6AgoJ9fn9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGEhYSEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhYaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag397gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIOFgoWBgYB/f4CAfn+AgXx+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fX+CfH9/fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX29vb29vb29vb29vb29vZ19fX19fX19jX1tfX1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI+MjIyMjIyMjIyMjIyKoLq4uLi4uLi4uLi4uLmwioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxaVVZWVlZWVlZWVlZWUnmno6Ojo6Ojo6Ojo6OllVNSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWeX1laWlpaWlpaWlpaWld8qKSkpKSkpKSkpKSkppdXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqo2hkZWVlZWVlZWVkZGRhg6ypqampqampqampqaucYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Pzs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMzMzMy87S0tLS0tLS0tLS0tLS0M3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7OztDU0s/PztDT0M7S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fW19fX19fW1tbW1tbV1tbW1tbW1tbW1tbX19bY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs/KlqXRz9K5j77UnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/PnKqdrNXAlLCcsZa4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Qy5SImpzOo6CLkcOTfX6vsNLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9G9yJmZu5qHnbrU0s2ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0peUoL6ZkJ+g0tPAoKDQz9DQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P07ObxJu+qa+RobnXr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NHOjZChrKCarZup2KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRy9qom6CapsWYotGen8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTc5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyY6lmp+vnpybm63Hn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyruhpqecz6arpJ7FtKSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTnpCNttbLkpCn17mDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dK6xNXR1Mu91dLRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS1dTS0tLT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkBCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPW1xkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqSpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6qqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLavs7CrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1try8vry8vsa6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9taHF4bnlqaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGw8TDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N4ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8PBxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjJyMjJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcfBysrIxszKzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1b3NiXWJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcLDv7++xMvIysvIu7rIx8nNyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2RqZWFqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7m4ubu9wcfBxMjGx8nDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1paWlxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vcC5vrq6tMC4tbeyrrq8tsfUucu+wbu/wby7xL67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJiZ2pnZmllaV1WVlRZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3r663tbfTwJjUu7+8u8O1use4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtoWFhOS0tLUklMSEM5PTg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLe7vcHEube3trW5ubm60rSMuMPCwr7Ht7m4rbe1uLq0uLO7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK+wuLuyvb67xLa1uLa4wMDFu82ohJXCy8nGz8LAuK61tby+uLqyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRueGNnYltjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrq6Oxub2+srq+vMW4sbi4tsO5v8PEn4SLucrMztHMysS1usDDyL++tb/Bv8bGv8vGw7/BvMDDzMrHxcbAub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzw7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzCvc3EvbvEv7mxlYqOeoiVrZeFjK7GycjMy83KxsLEy87CvLm9ubnAw7/IxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi1vLa6vMbI28K1v7ywjGpxcVhiZniJio2owcbCx8vIwcPBwMnKwsC7urC0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru8vbrSssHJtrSSdHloYn5pW1pccIqPqbvBvb7GwLnAvL7FxL29ubKwrri3v8PHw8S8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVtfYFlTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC30LamxraOZ1Jubk9zi393Xll+krG5t7i3wrqzu7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZV1aVEo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/tsm0lrGhZ1hVi3BTXXqCh4BNaJi1trKyt765srWyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cWxeYmBbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbvGspOehVhTZ5xmUldXkql+WFqnw7mzsLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXGZYXF1STk1BPklCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4ure7z7mYk3JSZY58ZlRibaW9hmNTdp67trG0tbK0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO1uce+oJJkUouZcnp5i3KCknVwdW2iwbiztLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrLAvqycVl6UxJWBmJJmdXV2gH59r7+4sayzr66srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq5+mopujnJWQjI+PkJOQl5WWmJ+enpqYppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqnvcm1pFZkhZN+aXRsZ2Nma3VxcJCus7OqsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqulqbGjpaieoJyVk5CPkZCYkJaVmJefmJuZmqOZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSkhHTlJOSk5HPEVAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamin7TPwKxdeHV4dGRpWVBPU1JXV2B3hqm1rq+ztaqmrKuinJmUjpGWl5mZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR5eWBiUlVgSUlKS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnp6pzc2Zb3p2dGNTTVRIUElQTUxVZGeItbCwsLispqGcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSpsa+imZydnqGZm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVExTTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKcopuepMqwaGprc2JSU1WFdWpTT0pKUVZZY6evrayvp5+eoqCXkZOboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rLK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmZ6boaGsmHhua2BUTFh6qrCgbFJIRUdMUVaNq6qqqaSfn5mSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby2vbOztaKsoqmosqmrqKeompmemqqnn5mnoJ+fp6ilpJ+dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCV05KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempykoJ+IbWBVUFFbot3gw41wW0tEQERhlrCtqaqln56eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO7t7Ops62qs7Svs66qrqOdq6e2sqyisKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rxa2t1cnBoV1tRRVRIRElPSD5FQTRGSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+Uc2JXU1RZbbPcxrCrrIxtVVuBrLCmo6OhoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8PJycLBxr66tLq6tLu3sLWyqrqyrru3v7q6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXlxa2Rob3hqZFpbRktMRURTTERCRTc6Pzs1NDk5Nzg+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZudiV9TUVVZboe1xbOUntjKrKOwrKCZnJuenpmXl5eSjI6Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPN09DT08zKwsXGxsrIzr/I0czHxcfFwbzDwb6/vrW+s62/v8LDx8THxK6+uLK4vMPBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHh0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jn5ydm3xTSk9SZ4OitrKlia3Mu7Gso56cn5qYlpSSlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytLX0dfS1NbT08jMx8zNydLNztPNxcjJysHGy8fIyca/w7OzyMTLysvOxcq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydHZoY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoaVxTkVNVXeTxcqunKOxqaKcnZygpKCdmpSUlZSJfHdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0cnS1dbZ1dfT1tjO0snP0czO0MzSz7/Ix8rDzMzMzs/Fxse2v8q/0c3Lz8XJyL/Dw8jOzM/Qz83Kx824t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZvY2BlcmJdUlxJSkdBRUhJPjtBOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSln6GseE1JTl6Et9vVuK2qmpSXn5uboKGfm5yZlYl3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czQztPX1tPV0M/S09HJ09HH0NjX2NHY0tfZ1dbMz8/JzdLLztDAxsLHxc7N0dHRyMvNwMrMxdPOzM7IxMnGxsjMytPT0dXP0szTwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKKjs4tbZW2Jt9fGr6afl5WXmZqdoJyZnJ2TfXFlY2NfX2FfX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxtHUytDU1dbO0tDY2NjXy8jOxMnPzMrMwMm/x8nNzs/L0M3Oy87Ox8vQ0MrOysLJxsnMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dW9wbmthZG5wYVdcWklGRkRNV0U7QD0zMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2po7ObeIqnztSzm5uVk5ebnp6enJSWmJWIa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1cq/ycHFzMLIycLMw8XIysrPys3M0M3Ty8bIz8zIx8vExsHFyszNz9HG0M7NzczPxcfAuLm9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeXBya21nYGBwaFhYaFZMRkxJUFBCO0M+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7SooKujiI2SuNSslI2NmJWQlJKRlpaWkIt8ZWFiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS+wMfMzMvOwsvLyMfM0MTFx7vHw8nIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raO1kmiAiMSukI2Ol4+Gg4SEgn6FhX9zYFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMvNycTCy8nBwsvQxMvIv7nBu8bHvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsW8vMDDxczFxbvAysLFx9LEwMi/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWbo6CblHt2c3RmaVphbmxaW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrGvuYJifo+2j4qSl4d6gIWGgHZ4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw7+8wc3Dxr29tcG9w7q9xrvCurO8xcTBwra/tbW9v7vMw7y1usi6v77Lw8HFwsbJxsjG0MbCzMeyx8nDzs3BxcPAvbO3sLKnqKi5sKWtsKqtrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7RysrKx83NztHI0MbV1NbXzcrPxcnFx8G5xb2rrK5vZXaPk4uIioV5gIaGgH6EfHR0Y1tcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i1t7Szs7S6tL2xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wcK8uL3GwcO7ta6ytrq/tMS3u7WruL29v72xuravtrqzxby3rru/tbe0xby+w8XAw8XGyMvFwMbGu8fLv8/Kx8PGwsO3w729trm+x7+stbq1t7aOeXR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrEz83Sz83Fx8HFwL65uMm2qq+jZWl1jI+GiIl7eH6Ghnd4gn10aV5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+4uLWwq6ynnqKqp56rrbOtqauptK62sLKprqassry6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCxwLa4va+wp7KztLu8q621pq61r7uysKm5sK27rru4u8C/vbnCv8fDxcG8xsHHy7jFx8W/xsPDusTGwrvGyczLs7nCvLuziHN2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fNwcPGv8TEw8PKwcnKvsC8wbqytLXEr6qvm2Fsf5GIjo97eH6Khnp7hIF3bl5dXF1dX2BeX2RjYmNjYmBfXVtbWlpdWlpaWlxkbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwo6afqq21trG9ua+3r6mut7S0vLi0vK+3ubWyu8GywK6lqaKrsbKzqL2qq6irrK20s6aoraGkr6mypqeorqWot6yxsre6uruyvL2/vsS/tcLAx8i3v8DEt8TCv7u/xMK+xMjMyr++w8DAqYdzdHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvBy767yba9w765yrfBw8G0try2sa+1vK6oqZdlb4iDiIuAe36Afnh0f3xzd2VfXVxcXl9gXl9jY2FiYGBfXl1cWlhaW1tZWFpcX2ZrZmVnZWlrb3KFqqWspaCcoqWUnqSbmJKho6qkop+lpaelraCdm6SmrLKvtrensKuoqrSqtLqxtrWutrmxr7q6sbakoKSfprGnq6i5qqSnqKinsq2gp6afm6SmrJ6fp6SgoLGtrayytLK0sLW8trvBwbK6vsPBsrm5w7PAvb+1uLu9vrzCx8TCw77AxKCDeHBrYWZfa29gVFleSE5nT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbWgnpWdoaa6tquzs7uzxM/Jy8LGuLfHwcy/uMm3u8W4s8S3s7/ArLa8sqylr7StoKKUbHiFhoaBfHl1c29ta2ppcWleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlpuhlpuimJaNnqGjp5ufn6Oloqiem6Kbn6uwrLG2o6mqqayspLS5rbewrLO1rrK1rrCqn52fpKKypKapuK2ipqafqKyqmZ+gnpmdn6WamqOcm52vqaunqqusrbCyuK+4ubuwtru7uquzs7mzvbS2sbG1tL+2vcC9w8G7u72Xg3tza19lXmRkWFRXXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7xMPPvrnHuLe+t7LBtLG7u6y6urGinqmrp5edkHF/hYZ/eHJucG5rYl5iZmZcXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGVlZmZoaWtyjaedlJWVm5ibopaWkZyioqidm52lpqKmnKCgmpiurq2usqCloq2rp6G1sbKyrKivsqe6s6a1oKKem6OiraOiqbWqoqOmnaamo5aYnpeZmp2gmpednJybrKGrp6Okpq2rs7OqtLCyqrK5tK+pr7Kys7ezrqmsrrK4sLq2ub2/t7OxlIV5dWVeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lo5ilscK1tr2ttLjCzMjGwMW2wb/HzrfAxL2zubmyv7axuLqtsrWvn5qjqqGSmY15f4OEf3hvcXRxaGZkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanainJSUkJWXl6CXmZWYoJ6hnJahoqmkn56pnJqaq6evsKqbo6S4qaCfrqi2qqanrbCkt7Ckt6Cim5mZqqagmqy4sKKhpJyin5+TlaGUlZabmJeWl5yVn6mdqaOhnaOqqrCtqLSrqqatsrClqq6ysbCvrq+mp6eyrrG0r7y0ubeuo5SBeXVkXmFWWVdTUlRLTV5MT0tHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64va6dp6ejqrvAvcC5rrS4wczHxcLDvcW3yMyywcLBrby7tbu8tbm5sLCxqpyZoamVkImMgYB8d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZqgZaTlYySlJSbmZ2WlpygnKCWoaCmpaSmp5+cn6agqq+mn6Kkt6ihoaKotKKlqKWwpbCtq7SeoJ2VlaqhoZStsbGfoqOdnpibk4uhlJGTmJiSl5eYl52mm6ehopmjpaWrpKWwp6Wjq6utpqiur66rqKqps6WmrK+0sa68tbGvrqCSenZyZGFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsbHtsbEs8K/xau3t722vbu7trOtraiZmJ+ji4hziYh+dm5jYWZpaGZoamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVSVFJVYGBfYGFfYGFjZGmBlJOJkY+Uk5SdlJWXpJmgl5ygpaGtpqSko6OinKqrpZmfpbGqoKCdpaudp6Keraypqa2soaKilZijm5yQq6mwm5+in56XmZOKnpGNkpOWkJiYk5yhop2koKGVoKGkppujq6WipKqkq66lrbKppqWmprSmqaits7W0ubqvqayei3Jwb2BbV1ZVUkdRT0haW09SSVRLU0xFRklDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG9xMmssbjCtbzBvLS1q6ymlZmbm4d/coiDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl5fX2JkbY6QhJGHkJGPmZOVk5ybo5yboKipq6isp6ilo5ikrqSUmaWvqZ+bmZugnq6Zm6uzoKWmn6KjoZWTm5aWkqmprZqcn6GgmpSQjJmOjJCMko2WlZCeoaCjnJujlZuho6GXoaijoqiroKuvo623paOjoqytqqirr7K3sr21s6uvmIRzc2hbWFhSVVFFWExRW1hNVE5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtqLO2rqmnr66bqaist7asvMq7tr+sy8bFuMHOz8izxLq3u8PIsay4v7e8vru0t6eqoJaWmJWFeXSAdndubWhtbm1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1cXF5fYGR+jYGLf4yQipKNl5GXmaKgm6CrqqaurKivo6ian6yhlZakqKedl5CPmp6ulpioqpmfnZSloJ6SkJKRk5WnqqWamZmenpWNjIuThoiNg5CLkZWRoJ6ho5eVn5WaoaKelJulpaeoqKCxsKaxvKefo6y0q66nsLWwubXAsa2xq5B9cXJiVlNWTlJJRlZQUlFMTFdNSkxOUkdNSkFDRkRDPkA2NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qmorCrnaqnqbKxpbbGtLm6s8rFubrBy9DLsba3vL7Bw7GwsrittLS7tLalpJ2cl5aSgX52a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipeJlJSYm5meqZugqqalq52nmaClm5OPn6Obl5eFhJKbo4+Uo52WlpaIopubk4uOipCapKeclZWXnJGRh5SOi4GLjX+QipKSkqCan6KVk5iYlaKmmYyZpKaopqGftLKosrehnKK3rKqtpLKypbW8taursaOJeHJtXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrGlp6OppaCopaSzqqKyw7W1srPGxre6w8rMxrOsub20t8CvramxnqauurCwoZubnZWThnqCbV9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRhI+LlJGUnqGPm5yjoaOYpZaim5WNh5iajHONg36Nl5aGkZmQlI6Oe5mPnIyCiX+KmJ+inpCTmJaFjYKUfn50iY55kIeTj5CdmpmakZWQnY6io46JmqCho6OborSvrK+sn5iluKamsaGxrpywu6qpr6qZgnZyYlVNUk9QTUNTTkxRTUJQUUhJTlJNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTExNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6emtMG4r7SwycS3ucHOxb6zrLrBq63Draiip5KdpreupaKQlpeTj313fWVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKQg5eGjZyXi5SQn5idlZSWlI6WiYCTiV87V298i5SJgIyRjJCGhnOKhZaBeYF6hZSdlIOWjpGQg4Z9k3hxb4WNfYmBkY2Pl5qYk4qPiZyHn5iHiJaemqGgl6evqa2oqJ+WrbOipq6ZrKuYp7Siqa2jk35ybV9bTlNSVkxEVEpQTUxGTk9JRUxRTUtPSklNT0ZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaejqbCop7TBubC1sMfCt7O9z7+5r661wqeqxamjnZmDlJyxpJ2aiJSQjId8c3VdUUxSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkB/lZGRfYmUjYSKjZuNlpWJkoiFlYZ5iH9gSlFueIqRhH2EjYqFf39ufn+Ud3V1d4SNmXBRjYiKhnt+eJR2aHeGiH6KiJWKjZGSlouEioiUhJqMgoSSmpaenJSko6ippaSem7CqoaSkkaaqlqGpnKKmqIl1bGVeW0hRUVJNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpuip52foq+hp6ilp6ivraq1vLa4t7PBu7anuci4tqiotbaqsrymnpaOf4qUqZeYjX+OhIR9d3FuWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYyTgZKZi497ho+Adn94c251cHSNjoF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4B2cnKSd2d1hISEhHuViYiKjIuAf4SLjH+Ug3uBkJiVnJWRn52pnp+gnaCppZ+dmI2npJOgn5aenqSAcmhgXFxKVk9SR0pYUk9KTE1SSkpKTFBITFFMUlRMRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Yo6GYnJ+0qa+ppa2ssLGqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjpSBjpyPlIF4iHp9d3BwaVhLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g315Z3eNl5iNj31oeYF2eICJj32EmJKBcoePfHd7b2t+rX1zkIt/e4aSgX1/dGZ2fIZsb2hzfImMiIBseXF9cG11j3FpcYB+jnBDi4SCg4V/d3d6i4V9jHt1fo6Sj5iKkpqbo5aZnZqdnqKdlo2KpZuPnpeOlpiPdm5tZWJaV1dUUUpTVVRPUE5QVktOS05PSlFOSE5PS0VDPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CflqCmr6yuq6ipsK+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZj4WSeomPjI14cn9vdnFsbmtYS0ZHRUFAQ0RJTExNUVJQUVNVVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXmVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ6fX57dm90c4WCeYF4cHyOjIqUg5aXmJqQk5WWmZeel4yDiZ+Ri5KNhpCWfm1obW5uV1VXVFJRWU9SVFRTWFVNTkhOSk1OSkNITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepa2woqyqqLWvrqy0v6q7wr+mopmVpJedjYSLlKGhmJiRk4tzjnqAho2IdnB2bXFtZmxrWU5FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV/cG1/eouJdoGIhnRsmpF0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcYB8Z3Fxe26TjY97c318cXBudW2Cfnd5dWp5iYKIiYOWk5KQi42RlJSPl46AeYiXiIaKhoCQh3Zqam5nZFdRWldZWVtNUFVWWVhOSUhFSkpIRkJBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6a6r6uysMKxu8PHmpaOlJmLjYV5hJCYlI2QjI+GcYeCdIeNiHtxc3FvcGZxZ19URklDPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4GFgXqEhoZ5cqCVc3iAc3WUhzVxnaidjqGhhKKFdnCGfId8c4ytjYmAZ2Ziam5ybXCDdWlvWHVwjpqSd2x/e31tcW1wgHpzdW5jdoN+hoCFkJGKi4mRi5GMi4+DdXiLj4B+g4B+j3pxcG9rX1pcXVtZWGBeUk5bWlhXTEhKRUpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKHlpGepKeer5Wltaqusa7BsrvBxpaPjJSQgIh9boGQkomDioePhXWChGyViIl8dXh4bXdud2RpXklQRz5ANzQ0ODs7PD0+QEJFSExMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoGFmYSbnGGGqp+di4OQjnp3iH6JiI1zipePhHpdZHF0ent3imxnamJ5b4WPgnpugXd0hHpwc3p3a25pXneHfYd8iIePgIuSl4ONhY2HfXGEf4R8dXd7fYl1b3JzZWZfW1tdU1tmXldRVVhbVUdKSkRLRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHiKf5SMkp2dn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYSLfX2Bf3CBfnpodmtSV0xARTIxMTI2NzY4ODo8PkJFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc218gYaHfY5oZ2h4fm6Fh4KFcYSFR2uAd3F5dmhta192fYOJf4iFjHqVnpuKi4iRf3p1i3Z8d21vd35/c3JxalpdXFtjY1hmZVtVT1BWWVBETEtGTklDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aXkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4l+c4R4X2NWS0I2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYmRgZqVgqChl5WbmqWtk5q7sae7x8OoioyhpY+UiYGRe3KEnp+RnH92hYWKj4iQamhvg4B1jYaEi3GGgneHgHt2hX1udnVngJSPhomIiIiHoauhlomOmH97gYl6em9na3h+eH1xamNdWlpdaVxhZl9ZT0tOV1JRSVBKRE5HQ0tEQ0FEQ0E8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O251cGZ4g3uAjICBkI+LmpqknKGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYuLgomNg3+Kf2xwal1CQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6KflJmShIqFj5iRlmxwdYmLgZaMjY92j4RxbIWBipaSg4WIcomhloeTiY+PlqW1qZuNlaKDh5OEfX9ramt8gH+AcmFcYl5ZZmpca2teV0tHT1NRTk1MRklQQ0RORkJDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpeWmpSfn5ynoKqWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioWYkpGCgICLjYmFkIeEiIV4eH9nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWcn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJSShpyhmpqZp5GRiJWimpp3en6Ul5GhkpeXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNzfH56cGdgW19eYWZjYGdnXFFFSktQT0lKTEZGTUNITEZGQ0JHREA6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNio6Me4qGj5COgYOAiYuKhJKFg4aIgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrS9uKWurKynqLSssLeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2rpIuWmIWmpqCil4GmmY2iqqikh4WTo6GgqqCkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlqoiaiZKKlXp7foR9Zl9nW2RhXWNjXmZmXltPQ0lIVE9GSExGSkdFRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hHaBlIWIgpuDkpCNktrInZZzVpeIj4icj3yGjI6KiXqIgoeRjoOFgIuFhoeShoKEiYaHh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSU1VVV1VOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Ors8W2rLPAs7m+tr+0wba7u6S4xqm2yce2vrm0qKO0rbGxnJqSmp+Jp6+qpJV2n6SXoauxs5iWqq2orrW7srqsr7Wisayxtby3ta61oKeoo6ibqbCtsrq4uKebt6mNpY6Rk6CHeYGCdFhgY1VlYWBiX2BlX1pVSkRFTFVRSEpKRElHRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoV+gI17v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhYGOf4GJjoZ/hoiFioeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxXUF9VSUtKQUA/R0tGRUQ7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczJtrvEvbOzwLe4wrW/sLh0srSmusWksMa5sbOxtKiktbaqsaCilpuikqWxraWtrKekmKCss7qiqbK6tbu+zL/Fxb29s8K3uri/t7q3uaytsKaxqq2+sL27wsKsmbqolK6PmJiqiX6Be2pWYWBXaWRoZFZaY1lWVElHR0xRR0NISUFIRD4/QkJLQEBMQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFlVWndqcH+PhIGOhW56cnmIYrihmaOJlZOWk5OTjZCXkoeHe4aBjZWKgISAiXp8i4eGfIqCgYqDlX13eXVlT1xkR0VMOlFkYVteU0Y+O0hQRFpkUVFZWFlnWlRgYE1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tMU1pUXZOvuLW6ucnAu73JzLu9wLu3tby7t761urLGYHWzpbGanqu9qqWoq6qjorK1oaunnpWWnpifrqWnp6WepJSip7Czp7KyvLbBvdPJytPGwsXMwsrDwL69v7u8t7Swube3w7rGvcPJsJ65qqKsj6Wot4mBfnFeYWBcVmFeZ2VSWGFWUlVJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRTUVBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1obGxxkI2FkHNsc3JziNXAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWi3+Df4J4eouDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1eb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZcWluSucC5vbfGwLu5ysu6trq2uLmzuLW0rra2mWR1qJ6tcF6irJyYoaKbpJ6rpZSfn5CUj5aYl6ifpZ+empmDpJ2spKqwrbewvbnU0M/Xz8nM0szPzsrHv7/Cyr3BvcLAxcTFyr/Iz7Sku7C1sJusub2afnhrXF9bWF1gWWJiUVtgU1FLQ0JFRkU8QEU+QkhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkZRubG91dYizrKGhn4uZnJmMjJWRm5KFiop+iIeMkIuJfIGEc3uJg4Z8iXSCioaVf3N7eGxtdXtocmVpbGlmamloYGZpaG1abXSXraS8iIdnW29oXVpZVEhKTlBKS1FMVFFJTEFKR0tQX19iZmlhmLfHsLmzu762ssTHtrC5sbC7rLOxp6q3rI22p56bp5pOm52MjqCWkaaYpZWKk5OJkImPkJKem6GYm5SWh56Zppusr6ivp7O01NTU1tHLz9PVztPPzMXCytC/ysnLydLIzc3C0NK4sMS8xLqmtrvEooFtYltbXVdfV1llWVBcV05RQ0JIRUJIO0FEPkFIPz9CNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiDaHFveXmDoKqeppeNm5uXi42VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj31xeHVscXh+cXtteHNsaIBwbWNpbXB5aXd9fsu/wt+nbWN4bmNbYWBKUFJVTlleUF1dTlFOVFFVVFxubneCcpauuKy0p7C2q629wLGrtaaluKesrqGstKOOsa6amJiMkZSRhI6bgY2mkZyJg4uEiomEi4OUlZiXlJuQnJeZmZ6eq6ykp6GsrM7S1dHNzNLT1NDU0c7Iw9TRyM7S09PXzdLRxdLWxsDOx8jDqb+40J14bWRcYVxVXlFdWk5PU1BOSD5BRkJCRTxAQj9FRT4/Pzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PjU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd213cH1+gKGenqGLjZmTk4yLk4+WhHmFkJCNi4qIkYd/gntyfoCCh3qFdYWTkYl/b3ZzbHN8fHZ8c4F3cWqAcnJpb3F6eXJ7vsuafoyxg3ZyhHZoYWpdQ1paW1ZmZFhla1RYXVxgY11jeHt/i4GZqqSkoaChqaaqsbmqprSjoq2io62ip7GfiaaalJKRipKOiIKTiWuVoo2YhIGFfpGDg5OWrIuVjZWZjoWSkJ2Xp7ChoKCkpKjIzc/HwcvQ09HU087TzcbW083U2NbW2NXX1cnU2s3J19bRyq3Ew8uJcW5iX19XUlhSW09KR0lJSkA7OjtFQkQ8QkQ+SEI/QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE1Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeXKCiYGdlZ2UhYuWiY+KiI6Hj393hJSZi42IiIuJfoN4c3t9g4d3gHuHkZeBg253cG11f3Z4fXOFfHlsh3Z0b312hHV5e521jDxBisalfo18aWVWSUNlY2ZjaGpkb3lbX2Zoa25pboCDiZGLnZ+gnZCXmJ+jo6aypKSzoKKlnqGpoKKxnIaekpKSkIuOi4aDj4R+nJuMjYKEhXqUfoKplaOMkoqXkot9l4qakauzmJqbp5ynvcPGuLbGzdLQ0tDL0svJ1M/R1drX19jU2djN2NvOydra0ta/zMy0dnVtY1xZUlVQWVVFRkpJRUU9Ojc5QEFDOkdFQEVDQURBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRWT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgod8eIWWl4iPg4eGh3qEeXF6e4SGdXqFjo2deoxwfG9wen9xfIFxg4eAbo56dXd9fIJ1f3yHiLB0WKnCtoySgXBuYj1eaHJwcXBueHeCZWlvcnV4cnuLh46UkpuWoJaHjJOboJufqp+hrZyimpmfpZ6frJmLmoyRko2FfYiHg4WLjqCZk4iDh35tmXmEmIaIk4yOlIyFe5uIk4+uqpSVl56Ypq61vKitvcbLyMnLy8/IxNLK1NbY19jX1NvX09nb1s/b2tHWyNXMlXh6aGdaWU9SU11IQkVJST5BPj03Oj0/Oz5IPUBBQUFEQT4+Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfHyEl46Hi36Gh4B3gnlue3uGgXR6kp6NoXaPdYJ0dYF9dICEb4GQgW+ShHR8gYV6doZ7ibfGpMLJt4GVm494cGVOZWOCeoF3hqKQi3l5d3uDf3yEdm2UlpSVj5eQg4mPlpqXl6acmKCXn5OSl6OdmauWkZGLjZKDjIWIiIGFkJGenJmJhYuBhZd7iIifl5CJjYqLgnyhiJCLvKGYk5eZnKimpa6ep7W+wMC5x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bxoV5eGVoY19SVlZVTUtETUM7PT08OTo8Pjk+QTY+P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXp+gpGJhIV6hYh7dX10bnx9hn50f5KdkZ+DknyGfXiOfXmKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLuMnKOcfYmEfYlyjIp+c6aanJmUhXuPkImEaEdxoaSdjIuQkoWIi5GTlY+dmpOVkZeNjJWfnZShlJKOjpCLfpCPjouEiJKWmp+fiYyUkZ2Qgot/ppmIhY6ChoSApIaKi7iYnZGUlqGnoJ2enaOutrq1q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld3d3ZpaWRWX1pTT05IRExCPT0+OTk6Ojk5PD02QD4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgI6KcXJ4int7f31/fIh6fHuLh4J+dYOGeXN6c22BfoR9d4aboJqelJKAi4d/mIeAnJJuh6iFeqCLfJCOg4iEnH6akYqNo6KfkKOun4uRi4WLgZKGV3Kti5+snI+DmJuPkI5bg6KRgoyfk5WMhoiMkpOMlJWUkIyPioiWm52PlZaRi5KUhoCLiZKNioqdlpmjooaTnZWgi4qIjpyQg4iPgIOHhaSFi5CzmJySlJehoZ6Zkpudp7G4rKW8wcfNx8bPzM/Mz9fP0dSu1tXY2tna2tfW2dmebntzZmVbXFdSVldDQElEPj8+OjQ4Ojs3Ojs6Mzs7Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhsYn6Sg25td4t4eX56gX2GfHt2hoSAc3CFgnt2dnV0hIOFfX6SpqOepaKWiZ2QlJaLiqiXcoqyjYOmkYSZk4SZjKKWoJmTiZqdoZKor5+RlJCOjoiVi26Nt4SaxMiynaKlm5yYlpGykGOkzciVjoaHiZCSjY2TlIqFioqGlpqbj5CUk4eVmISAj4uZiI2QqpeXpKOImZ6Wm4mPh5eXi4WPjIF/ho+kiI2TqJmXk5aYoZifmZOdm6KytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgXF+Z2JdXVxOSVRZQUJHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnaBj318bX6IeHp+eoKCg352doCCfGxui396fHh4fISHin6Ko7Ono6qzoZann6WjlpWuoYOQuJWSspmMoaGMpJuvo6SdmJCnlqeZrK+kl5SWlZCLmJmWoMCOo8m5q5ujpq2YkZudsp2FhaiinJiFiYmOlYyLk4+IgYaHiZOYlYyLlJOGlJiGhJGQnHSRmLKWl6ShiJyak5CKkYqXm4mKlo6GfYyYnomQkJyamZOYl5+UoJ2Vnpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0NbY09DYunF4dVxfVF9VT0hKTkRCQ0U1Pjo3Nzo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6e26Fhnp8hHiBhYF+cHh8fn1vco16fYF8eIaLiYaEkqe7rKiyva+krbKzqKOisKyKmrWdorikla2kl6mtt6ako5+ZqZepo6+wqZmYnJSVkZegmJq7u67KoWq2uKuwlJieo6uTl72jXqqygomKjZSHkXyOjn2Dho6QlJSIh5OWjJCVjYuMl5iSnJm0l5arnYuclJKOkZKMmZuKkZ6Qi4mVn6GNlI2YmZySm5ielKGglJycpa+ooaSzuKvCyMS1ur27xcfHwtGgxsnNzcTX1tHL1KFveWdbWVNeUE5FQz48Q0FBOD84NzU/Rjw8NTwzNTM1NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKQIuKf4Fzhod9goh1g4qCf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7PAvLOsq7O2i6eyra29qpu7pKitubirpqahoqOjqK+ysaqdnKSYm5eXnqKmpZKkuq6pwLytrbK5pqSofoiGnK29sIKMjIuQg4+DkY96gYeQjY2ciIePl42LlZeUkZqXnaiasZqRrJyOmo+SjpWQkJaXjpGgkYmUm6OslJaPlJydk6Cdm5igoZSanqempKKksLOnwcbDr7C6tsXEwr/NpsfEx8O81dHNxMqHcnJgWlleWkxKQktARkc+QT9COzo0PkE8PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZUdgaWdaXVyTjIyIe4eLhoOMdYaRioFvfnuBf3F+gXqVepKUlJiQk5Wns8bJv8LMwcO5x7y6r6u5upeytrqywK6lwKSrr7u8qq2ro6Oep6qutLCqm6Cqm6GblZ+wtKeLo7q6tsG8rKicsqWkqJSFjqnExKSCi4+HiISGlZSNeoONkY+RoYyMlJGOiZefmJOZlZimoK6djKqcjpaPkpGVlY6QlZGPoZSGl5+gsp6UmpSfoZikn5qgm6CUmJ6lo6ampK+upb/Ewq6ot7XJw762z7LEv8S8s9HJyMK1c3drW1dbaVFMSENMSktKQUE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpOZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB7jX94h4KBkHqNoZaompqYur3HyMnB0snKwsy8wbKtu76nur++vMS3rMGprLO7vqqwqaSlo6uts622taCfrp6lopijs72pm6i9waO3t7Crk7Gsq6yXh5qpp6WRgoyTpZWJgXaKkXqFjZKQnp+Tj5SLj42Uo5mXnJWVo56pn5GlmoyPj4+Vloh8j5WSkqOalaCinLWlkJ6XpKOipZ6dppielZebpKOop6KyrKi8wMOvpbK3zMC5r8Szu77CuK3Cw8LAmGx4YFdWWlpKS01KRkRESEJCQURMOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iaCThHiFf5V/f5CIipCAlqGZrqajmMK+x8PHxdPNzs3Lu8G3sLm8s7zLvMPBtba7rbO/ubyur6igqKe2ra2psreanqyip6Gdq7e4qaSwv8Sxvrmzp6q1s62ul5alrKigkY6SscWnlY59kZR9iJGZkKqZmJOTj5KVk6Wdk52ZlKGjopyYn5iLjI+PnohakJaXkpakmWWYo56ypJahlqysqqebnqaXmJaYlaCjqKWftqupubvDtKWztcvAuKq2rLK6uK6ot7q9uIJrbVlWVFRNRUpTTks/QUhFREhHRzk1Rk07Pjc9QEouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJxRmlJUmViTEallJyWoZeplo2Rg4emk4iCh4Kcg4OVkJCTjpqin6++rqHGvMXExsbOzs7Syr67trG6u7u+z7bEvbi4t7KxtbO4s6umnKuruaqop6+vl6OupKekpLXAsKustL/DusC6s6e5tbizr5alra6upYuTlaGNdMGafZaZhY+WmoyxlZualZKTmZmlo5Wfm5aaqZ2coaCZioyPlp1gSpacmpWapZZUlrCfrpyfpJSvrqulmqCllJOYmI6cn6aimbSpqrO8u7uqsLLHv7mmrKutsbGjobGytKRvbGVbWU5PS0VPUFBRO0dKSEdJQ0M+OktVP0E6PUVNMDc1NDQ6QjM0TldPPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLp5aOiZKFn4eEnZeOnaGao6S1yLSpxrrCw8fKyMfMzca+u7OuubjAwcy1x7rBuLW6sK+vs7Smo5uqtLSpqaatrJqkraWkqKy6v6irtre+wb++ubOyxLK5vayjrrWsuaaIm5imm3a/n4SZnY6TmZqLr5ehnJuWlZufoamfp6CZmqqZoaeemJCNkZ2DbnaSopqVnaKekK6yoqqUqKqXqq2jo5+lqJKSmZyIlJyinpexp6mrura9s7Ktvrm3oKOnqKWnnJusqamMYmRfXlFKTEZITklVTD1NRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauVnKGfuq+ZlJ+Lk6ubkZKTiauNh6KfjKOtlKOjtsa9tMG6wsHGyMXCzcjBvbmyr7i0wMLKtcWxwby0uqqoraywoqOYqrS7paimq6qdqK+no6qqvrynrby0uL3HvLe1t8GxvsC0qbW3q7+lj6KYkaKgvJ+JmqCZl56ej7efqZylopucoZqopbOhm52lnKiqnpmVj5SbipaJjKSilJ2inqC0r6Wkk6+rmauqnZ2ko6iRlZWfg4+enpuVqaShobS0urWtqLWys56coqWal5WYqqGedl5bX11KSEVGTVFJTUVGR0JSTEpCRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Wnl6SfnsOtm5elmJmpnJaamo+qlpWnppWtrZmhq7bEwru+t8DCwMfEvs3Gu725sq+4s7/CyLW/r7u2uLampKqrraCgmquqxKKkqKumnquvrKGoqL+3pq2+sbi2x7a1ubi/sr/Bt7SztK++o5ejlpSclK6gkaKipaOjn5C9pKmdqKudnaCbpp+9opijnqKpq6Gdlo2VnpOeh4+EjZOepKCdtaylm5Wxp5mupp6ZqZ2fjZiUnoONoJqbk6WkmpirsbWxqqWqraycmKCgko6QlqielGdiWGBdTkhHSk5LSEVESUE+UEhAPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTpuUkY8S3hlYlZMopqjnJ7FrKGfrJ6drqCTo5+WpZ+mqauXtrGjqrO1xMS9v7a/wrvIwr7KyLa4tbWws7O3wca2vrC4tLi1n6asqqudnZ6lpMGkn6mtn6SprK+ipqe9taWxvLm3tsOys7e5v7LEwLi4rrO1taOdpZWSlKGuoJminamoq6Oawq2pnqytm5uemaahvaGdpJirq6ymoZmNmp+SnomOV3+Wn6ahoLiqppOYtaOfsaCfmq6Wno6YlJ2Bjp+XlY6ipJWQpq6yq6mhoqWllZWdmIuPkZOknolgZFljYEtISkpORUVBRko+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckhFNj11ZVxLTp6foZmew6ilorSinLKok6ukoKOframsnbuwqKy1scjFwcKzwsO8xsO8xMq8r7C2rbC0r7/EtLmxsLm0rJmosKmpmp2loafCrJussJypo62wqaSnvbamt7u9r7fDrbOywsCyx7O6t6y0tq6qoqaWlZWkrKKfn5qoq7Cvr7uypqCpqJmZmJOipLigoaSTr6+spaeekqGelJ6PkI2VnZqinqezpqaMmLObo66anZutkJ6TlZOZf5Ghlo+Nn6GTi6assKWmoZygnpKSmpOFi5KNnJ5/YGVaZ2VKSUxKUkJDQElHOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo5+coMOopKqyoaO0qpWzrKeipLKsrqm7sqywtLTGwMTDtb/EvcnEtcDIwbSrtaivuKy/w7O3rqy2uaWZq7Grqpefppetu7Sbp7CbrZ+ttLKnqrmyqLqzt7K5wKq3scO9tManvq+tt7WpqKuhl5eSpqWiopiYpa+4rrK1tqCfqKSZlZWTpKC3oqSllq+xsqeqpqGem5qalpeon5+YoZ6vsqKmjJeumKSql5mepJCajZOXmYSVnpSMj5yelIupqaqhp6CZnpWMjpmQgYWViZSfeGNoXGpqTVBNTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKOdoaa/pqivr6GptKudubCro6q0trGwubewt7i4xL3Dx728xMHGwLjAxsC6qbakrLuswMK3t6mssbqila2wrbKWpaeRqrmpoKawnaqgr7Szqqm2tq27rLOzuresuLDDur6/psOrsLeuqaurp56YmauioqCRmKGxr7OrsLmanKmgmZaSl6aht6mlo6KwsbSrsqirn5ugoJudpZyhl52js7Can4+TpZqfqJqUop2Ul4mTl5KVlpyTiJCbmZSOqKimn6Obl5uTh46Zi32MloWPm2pobGBsbldQUVpUQUNFVEA7O0hBNzpYUGReUFZXRFleXU1MUk5eS0o+WmNeTkhQTltVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGrsKujsbiqpbWzrKCttbyus7i8ur22tsDCv8jEucTBv7+4xL3At6+2p6u3sbu+v7SorrG2nperraitl6eojqe7n6Sss56rorCws6uptbS1va2vsbWssLSxwbrFt6u8r7G4rK2qo7GmnqSpn6SXkJmfs6qzqqqzmp2nm5qVjqCmpLSup6Gsra6xp7OtsaqknJ+oo56VoZmbqLWpl5mRkp6ZnZ+dkKqdlpeElJeKnJibk4qNlpeal6aloqCdlpWXk4CPlIV7jpKDjJZlbHJnb3FeRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19hVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqCkrLakramlrq62qq+1uqemsLfFt7G2vsHCtLS6xb7MxbnCwLm+ucO3wLmytKupura6ub20qa2wtZiYp6uqq5urq46rvZ2rrrGjq6CwrbOurbayubeqrq6yqLWvs7u9yrKqtrWxtK+up6GzoJuoraCllZWamrKjraCmr5ehpJqako6ipaeyqaGmsqyqtqWusbWvpJmdraeamJ+Zmau3opeTkI6XnKGXlpOrnpqSf5KXjJ2cmZWQiZSSnpmloqGgmJaRk5V6i4+Fe4yKg4uSam14bXV7YUVgallJSFlaPXtKRkQ2QWJUaVtNXGBKW11aUlNSYmFMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVEtEmZegsaixqq2mpK+utam3tLmkrLO3yrq0urq/vrSzt8PAzMi8w7y2vb+/t7+8sb2tp7q4t7bBtqqssbeUl6auq6ejsKqUr7ukrLGyp6ijsbSwsbC1sbiyqa6rsqe3r7W0w8W2qbW2rLCtqaijtqCgp7GgpJSbmZWxnqecoKqOqaOem5aYpqWlt6eisbSsp7KnrbC2rKSZoKyom5ydm5SpuJyUjo6KmJyil4+XpZ+dlIKRlY+cm5eVlIeWj5eap5yjoJKWkJCVdoSQh3uFgYSMi21wd3R7flxLZWxcS05jXD5ie0dJOEdnV2ZcTV5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi49RUxRPDNya0pDQ5CZpa6lra6rp6SwsrOqt7G3oKu1ucm4rsC7w7eysbXCws7FwMG9tLy/v7q+vLLEp6m4sLa2v7yuqrOynKCnsK2mpa+lnbK1rKuxsa2pqLS6rLSytay0rKqsqKypuK2xsMe/uKW6sKmtraWorbCmpKSvo6mcnpybr5mjo6Kjkayeo6CgoqqlprmlrLW1pKqrqKyvtq6jnaOoqpugmpqSpLOZjomNh5CioJSNk5yfk5GEjZKSnZqYlJOHl5KVmaebn56MkpGOkHZ+jYV9fHyHiYhwc3F9fH1cU2RuXk5ZZlxGRJZbRztObVhiW0xfYk5WV1ZXVFhnXlFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorOkk/M0JJUyw+j2s8R0iPnKqroqmxpKmls7SytLWysqGrrb3Muq7Au8extKy0wsLRxca+wLK9wMK8v7e7xKest6yzuLu/r6qxraCjp62qqKSwo6qxqq+ssK+wr6uzu6a2sbKpsqmrpqWjrbqsqrHCubWsuqioqK2qqLGlqaSirqqoop+co6yVpZ6YnpmsnaKnqaKspqOtrLixsqCpoqCrr7GsnZ+np6mZo5iZj6CnmIaEjoqLnp+Oi4yVm46NhYaPlJ+clZeUhpaTk5ekm5yci5KQjYl+foeFfHd+h4WGdHJxiHVrX1lgbmNRc3FcSzuEfEY+V3RYYFpOY1xOVVZVV1FcYl5TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJRaPkxFlZitqKGqs5yqqrC1rbi1rqulqqq9ybyxvbfCr7Gss8TDzs7Dvr+zwMLDusCzyMOrrretsri/vrKtraukp6mwqaeosaa0rqqwrq2xsLSttLukuLOsrK6nq6Cinq+3qqqturaltrWjqqesq6qtoaimprGypKamoaGslqqhlZqgpp6koqqlraKfp7G3ra6jpaKbqqutqZyhpaSkmKCalY+YnJOBgo+IhZyfi4qNi5iNj4qCi5ejmpGQmouTkpGTopmbmYqOi4p8hoCBg3p0gISBfXN2i6OHeGpeYG5mV2WHY04/Z5NMRWJ5V2JYUmVUTVZVVVRPXF1hVUtNaVdVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGPkhGRJeSsKWjqrGYq6qttqu2saulrKqpvMDAuLizu7WlsrDEycvRv8G7uL+/wbnBucDErbG1sbO6v72ysK6tq6uotqqmra+qua+osbGvsq22qre3prS3q6ykqaqco56zs6iopLS0oLatoKqoq6irp6Crq6i5tqmqqqqiqaCsnJKpoZ2gpKOmo6qenKe1rqimqqKjmKWmp6qcoqSjn5mYn5COj5iNfoeMhoSenYaDiomNjY+MgoWUopmNjJmQkZGPkp+WmJaLioN/dIaBf395dIN/end+gIedj29xZ2dweFxgc4hrT16ZVkhteFVkVlJiT01VVFVQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YP0MsPkxUXy9KajZPRDuWjrChpquumqylra+zta+rpbCqqbq+vMCwrritobavycfI0MC+vLq8wr26w8C+v66xsrG1vLrBsbGyq7OopLWppa2zs7mwo622sbCzuqu5r6mttqyqnqmsn6Kgta2noZ+vsqK0qp6op6qjqqGirK2ova+srq2iqKigrJmQsKGYoqCnp56om5mqsKmjn62ioZOioqOnmJqppZiXmZ2OioeUh32NhoSEpJaEgYKKho2MkIODk6CWh5CckJOQjZGclJeOioaFeHSBf3x1eHmAenRzeWh/hqN1aV5la4F0Z4iLfVNYcF5KeHNTZFNRXk1NUllmTkxWWWRYRlNpUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjM4Xz1hZD9GMUNQW1sqSE05VUE0kY+yoKSmrKSnpKyntLKxqqSxqKq4vsG8r6e5qqausMnHyNHDvL++uL6/vMm7wLiwr7Sxuru3wLKzu6y4rKK0p6essra5s6eovLWutr2wvaasrLWrrZypr6OfpKuqp5yeqrKks6iaqqepo6mdo6mnqb2rtK+unamkoK6cm7OjlaScpaWfpJuaqaulnpuqoZuSm6GknZiXqaiSmJqTkIqCj4V+joJ/iJ6PhX59i4aQjY+Ef5Kak4WToYyUkouRmpGVhol+gHJ7eX18aHd8enRwcHxnhHiEiGRhZ2NxhXptZnhdXlZCV3ptVGFQUlhLS05xdV1IWltnWUVVZlBEPkpORENBOUhHS1M/amJKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNBSjdHU2BVKj06RFc+Ko+UsZmfoKmlpaGrpbeysqapsaesuMG9tbCjua2oqLHDycnNwba9v7W3v7nItsO1s7G1sb23ub21rbm1vq2hs6eqq7C1uLSrn728qbPAs7ugr7O1qauerbCjnKSoqqOenKSwprCgn6upp6Kqm6SooK27p66wrqCro6Sunp6tppefm6GjnJ+cmqOqo5qapKSWlpSfoZabl6ari56RkJGLgoqAf46Ae5qVjYh7fouFjo2LioORl5CGlKOJkpKHkJmPk4CIfHlsfXZ4eGN7e3FwcHJ3Z39zaoNnZGdgbXOObWFpcGBwQVx4bFVeT1FRSkpNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy8zJiw6JDQxQmhZMTNTPWVfREw2S1ZkTyk7Mk9YPSOTmayZn5inpKOfqKS4r66jr7Cqq7jCurOtn7ivq6i0usjLyL+3wr6vtL23xLbDsa65sbPAtLq9t6m5uL2rpLSoqaqwrrmxqpu7vaSwwLW1oa62taamp7GzoJ6kpqehpZmerKipnqCqrqegppijqJ+wuJ+jsa6gq6GspJymp6mampufo5WdnZqeqaaXm6CokpiTmJ6TmZahqZCZiY6Phn2HfoKOfXyhjYyIeIKLhImLi4WHkpmOiZWeiJGVgouXjJF8hXtzcH1xc3RgeXhpbnBwbmh9cWN6bGllY19lhX9fWnNrckxMfmhYWk1QTEpIUFJQSU5cX25TRFdaUmdPSExFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNioqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPi9YVzUol52mmZ2WraCgoaSht6uxpLO0qqi5xLWzrp+3rK6tsLXGyMC3v8G5sLS8t7+7vq+rva+0v7C8wripu7q3p6i1qKirsKyzsKeavrelrby2sJ6wt7CopaevsZugpKCkpKGWm6+moZ6ip6+hoKKTpKSit6+hprGqnqyjr5icqqWpnpianqWTm52anaaqmpycpZaVl5ScjpOXo6ihkIiLj4V6hH6EinqOl4qNhniBhoOIi42FjZOXjI6WmIqPln6Gl4uPeYB6cHJ3b290X3l3ZGxsa2logm1lcmprZGhbYnN/X1psdmlaSH1dW1hPT0pISFJVRjI6X15sUENXVlllTUhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdBZltIVENUXWhFLjsxX1MsMpajoZeVnKmdpaGjobeqr6C6uaasvcSzsK+itK+srq+0xMS8s7+6t7Czubi6uLqurb+ztLivv8G4rL26tKais6uoqbOrrrGjnMG2pqm2taqesruppqaosKyZoqecpKaUmKGypZmepKmpnKKgk6WfpLmopKetpp6loaiTn6mhoaCZm52gkpucl6Ciq5ubmaGVkpSWmo2Tk6OnpI+Iio6FeYR8hIV8nI2JioZ4gIOHh4eRhZWSkoyQlZSNjpR7g5eOind+e2x0cmxsc2F4dWhnaWdlboRnaGhkZmhqX2diaWZaZXpjYVJzVFtbU0xJR0lPU0AhK2peakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OGJOJzKepKOSjqSmnJ6enqS1rKequreorMPAt7CsorStp6+vt8DAvbHBt7Gusba2uLe1rKq8s6+ysb3At667u7Gln7aspqW0qauuoKDDq6mmsLOrrLS6naiqqrGmmJ2qnqekkZmmraKZnaSqoZuinZegnKe2pa+qrqChnZ2hlaCmn6GgmZuanJKanpWmnq2jmJeelZSNlJeMj5iap5+RiIqKh3iFd4KCgpyHi4KJe36Eh4aEkISVlY+Pj5GRkY2Se4OVjYZzfn1meG9ramxndXNrYmdkY3R/YmRlZmVpamNocFleWF1sZGFNaFdaYFZJR0hLTVJYPzlgbGlHQlVTXFtISEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BkRyU1m6SgkYyuoJmYoJaltLGisb63obHGu7mwsaK2q6uuqbi9vLutwLKvrq22r7O4s6erubCurrS2u7avuL2spp61q6ChsKWrr5+lw6Gzpa+xr7ettZ2tr6yuo5mcp6qln5WbqKWfmaSjqZyan5yUm52ssKW5p62ioZqanpmeo5qlnZaemJuUmqGSqJWsqZuUnJySjJWZjpSUmKimjY2KiY57gnSCgYqYhYd8iYiEhImMiJKElJySko+QkZaOkH+AjY2Cb4F/ZnltaGtqZ3Fya1xoZGJyf2BkZ2ptbGdqaGZsXGxtdXFhVGJoY2VZSUZMTU9YUVBVYWWBVEBWU1lURkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFJZEInNJOim4+OsZ2bk6GaqbKvn7jAtqC0wbu9ubGltq+prqW3ube4rLuvraqrt6q0uK2ls7WxrqmxtraxsrW6p6mftqmen6qiqq2cqsGZrqWvsLa1rKyesa2vqqObnKOsqJyVnKeknZqpo6WVmqCdkZujq6qpup+mpKCYmpqeoY9ropWYnHGClpykgHaRq6ielpagkYmXmYCXi5+PeIWTjINtaX53g3BshoqGfYSKhm9dZGBnhJeGa4uQlJJ1d4uEfoOPf2aHgGh1aWZXXGl0bk5QamRmcYJmXmRmbmxpXl1fiZCFh2hPS0Q4RVRnXkpHUFBVVUtHU2BvdGVFW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE2T2tbTlxLW2ZiPkcxT2I8Ky+NpJmHlbGbnJOgm6qtq6O9xa+pt8K4vb2tp7awpqukt7Sys7G5raqnrLSmsLWjp7e2tainrLazrrSts6Kpn7SrnqKlnKeomq69laemr7O3ra2kqK6qq6ahnpygqKecl6Gmppybp6edkp6gmZCep6qjtK+joqOclpiYl6OIoY+Smoehh5SeoX+lf6ernpOTnJOIhHJ4jI6Dh6B2iIxpl4hmfXN4oG+Ih4N+jHx/oaCfmX97iJ50iI52m4psh4GDbWhlY3pscWJUhm1jbWmYcVhqcG6GV15pW2tqW4hwbXlyh2mHhFpeRk4+Rl5NRlJWV1FRUldUZ15MWUtSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVZgNy8ojKaXhJ2snZmZnZ+rqqiqv8Ovsrm8t8C/qqS3saqsprO1rq+ztquppbGtpbWznKy1trSlp6izsa2yqK+eqqGzqZ+ko5qio52vtpWkpqa2vKasp6mqrKemoqCZoKekmZmmo6SZnKSplpOinJSToqWmoLako6CjmJWTmJSciK6QmJSJqYuXo5yFsYCkrZ6Ump6VeYLUqH+HlMCbx3l4saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7B4aGtYsa5vZWm8krxuaHptcY/YflNqY7ayfoBxlHWaoaqQV09XYU9WTkZUW1hRUFOLXFdbUEBcRVFOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXDQxIY6lk4Gnqp+XnZ2lrbKpscK9srW/tbe+wqumtK2tqaivtKqvtrOop6a1pae4rpyysbWqpaSnsq6tsaaqnqeksqShoZ+XnKCgsK2VnqOftLmiqaihra6kop6bmqKpoJibqKGfmJ6np5Gcp5uUnaGmoqCwo56fo5aWkpiSmYWwa2qKjap+Z4SWh61lcZ6dlZqmlXGuoaR+d7p8a6GPdrFfarRbpYBlnJFgZoF6Zn9qeGqpZb5yZ6aMdrFqfLF4dJKTY21tp21bhKBFaWeHlkV1nGB9Znujp4JZX4uraYCUeHpqpzdKr1tXVGxjWktPV19cV1Y7TohPV1YvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuSoZWCrKeln6OkqrG3rbS9vrC3xbK4usKnqLCsr6mpsa6ksLqvpKSus6Opuames7Owo6Wgqq2wrK+mqJ+jorGco5yYlZicna6nl5uhn7Syoaqboa2toJ6al6Ciqp2ZnqShnJqhp6SQnaOal6Cfq5+lpqCan6GVlZGWkZqFtZu1eIWpmbWZd4ezm7d/k5aXqZV+a4GmeoGFh5KUknerZ2qxW6x7joeUdIhwjoaAf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLTqRYSGNjmX5jaKZgeXJ1UpOGXlCpbWNxfYaAYp0uUaJuW1RrZ2BMS1xkWFxaQj6weFdYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWFVNTAclp+UiLOmpqKuqaezrKq7tsKwvMKtuLfBqqytrq+mrrKpoa+7qqGnta2jq7WkprOzp6OhnaeqsqiwqKWeoJ+wl6CalZWXmZ+uo5qapKi0rqGpj6moqZuelZigpaman52jn5ygoqWjlZuemJqdoqqcpZqbm6KglpORk5Odg9WTmblwsMJ+xoZ81pSbu3yalqWQjZuMpHqNhqKBpYJ6rHmPnVWve4l+n2q5Wrl3hoN9poKTfJh6qnmNnY97sW2OhHSQu4VvlE+vp8WKUaB6Y2CqYnNyhmyXh19TtbTIhoCJfGOkM0Kddl1RaWhkUEBYZlpkYUpITWxLWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUDcyJZyhk5ixqKils6qltKilvLfBsLrAsbW1vLO2p7Gxo7Gzpp+vtqibqLquoq+xoLO0sKCjnp6nqbCptKmlnJ2eq5iZmJeXlpeiq56al6itsKijn46soqeWnpecoaaimKKhoqGaoqKnm56gnpWZmqagnKeVm5ufoJiQkpWRnYiybmi1cauIcI6mcrRzcrZ7mpikjY+bjaJ+j5+kfrB2g5HS0XVbrnyFf6Rvm6qma4aFfa19l5mPe7Fzk52OeLNllnSFnm6eZpRSyItawlyfeWJfrWB2c4Zil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBT2pfbGlQVUZJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi6inZGkr6ykqrutprSlqLa7vLK7v7e2tLu7s6W0tKKysqOgrK+kmKa6rqSxsJy0uKmgpZ2hqqWxqKyqpZqdmqmflpWYmZOTo6mgl5Omq7ClopaSrJ+lkpShnKSnoJWbpqeimqOfrZqgnp6QlpuinpyllJyVmaKelZiWkpuFrHt3qHajj4uHqW+tioOog5mZooqSmYuifpKXh66Ff4KzXHKzUq59goKkf3HXfXeEfo+dhpmad6+GipGch3e0YZplmoKBlWySWrBYS5p1mHlmYK1ed3eHZ5iIal2vd5Wej3hsNXnIrrJfQlRvXWhgRU9rX3FtVlVNL2VjaVNZUTtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjc3n52UoLiwmLPBraiyp6qyuri0uL+6uLO2vbWluLSgta2foKmrn5WntqyosLGrrbSkm6mfn6ihtaemqqOZnpWlopSUnJmTlqOmm5OQp6yvpaGVmKmfoo+RopqppqGVmqapnp2knqydoJ2gjZSem56gmJiblZehoJSYkaedhql9faV5oY+Qg6pwrYyCp4aWoKGKl5eIo4GQh5SqfICLnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRsklyrW1qTf5F/aGeqY3J7gWuYh3FdrFqJoI5rbmVPSkOhXFpNdF1jZk1aYV9zdF9KVTVKmpJZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE9N6GcmZm+rJi0wq6rrammtLC4sbW/urqzsbe8qbu1oLGlnqWnp56TqrGpr6q1rKquoZihoKakpLmio6uhl5uRoqCVlJ6blJmgoJCNjKmwr6adl5qnpp+NkqSYqKuolJeqqJ+foKOto6CdoY2UoZifoJKcl5yVnaGVl4+rm4+ubXK0dKmMd4qmc7R5dLOAkqSjkpyMiaSHjnW4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSapdcrWBNoXyHkVJzo2x5f35umIZvXK9WPJx3ZlRvbi5bp09iUmtlYmxaYlxgcXxjU1lQPj5tbzNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7PDAwMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjkxQTilmpudu6KcssCuraurp7epuK+1wLW8sa+5uKvBt6qroZynpKKdkquqp7WjsqiuqqGXnKigpKu5naOtnJaZj6Wjlo2doZuZnZ+Rk5Wrtq+nmZSbrKmXjJOmmqWtpJKXq7OkoJ6oq7CZoaKPmKKXoJuWm5ehk5ypnJSRq5mH1JKau3SxxIDDhn3Vlpy4eIiRl4yXiYynh3mitnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbZqIcG2NpHS9XXd9W2F5vGpaVltpeV5pYGRmYm14b1lbWUNBQHI/Q0YrNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkA5ppmeoryil7HCsK2pqqyxp7ivtsSxurKuu7CuwbKspaOepKGcm5CqpKqypLWnraSflpqqmaasuZ2jrpmVoZCmoJONnKOemJ6akJaSr7mwq5WXo6enlJGWpZ2krZ6RoairoJyfqaSynqKkjqahlKGZnJeWpJiPsKCSlaqehZCZtYCRkY24lXiCk5u1d25sbnNueY+EjolynsG7vJl6gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnB3toxef3l9iWeDeW15YouscHWFf1hbp2pEZFpUZl9jXWJQZ2ZxbXVCTVBMRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoKG/pZazwrSsqqesq6m7rrDGr7W0r7intbitqqOipp+gnZmTrKWtqqa1qKifm5ago56spL6moaqYlZyRopuSj6GooZOel5KYlLK1tq2YnaSkoouSkqacpauclqmlpp2boqmnpqOooJGsnpejnpeXmJ2ej7CplJynoo5qfmmcp3iJc36ajnV6ZYd7vb7Aum6RgnGUhV9yalpdmolhZIeOlWtgf5VjbZt2YpRrf5qVlGVeYGNxm4locox9hpRman5xc3l9fGJbd3SBaFBcboN8e4pqWGx5gnJJSm+FcE10TUVXXGZhTFtXZmNeT1ptdmpyUk9ERU47SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5bTyc/Mj6on6ihwaOatLq2o6ylrqeotbKsyKyws6y1o76xsqago6mdo5uamaynrqSltaqkm5iVopumram/qKmmlpSblaCak5ilqaiRnpCPmJywsr+sm6edp6GJk5Gqm6iknJusoKOam6OnrKKfqqGZr5qVpp+WlJ2fnZewpZmiqJmckZ6co6SZp6OanJqampCWgmhufHF2kJeUkYSKtKmNhZiVjoqMmJeHk5WKg5KSkImNkZSZk5iXmqChmpuUoJ2OgnqkhWxpfJB8gHSJioFxgnh5dnaKgHuJanOBdIN1ZHd9dmtwem1gY1tvaE1YWGVqX1dZcHpvbmZTT0ZTOU9aTlJPKCs7SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzob+ipLGxt6CppbOnpbC1qsmrrbGmtabAqLShnqWlnKSWlaCrp6yjo7esoJmWlqCXraqmwZ+spJaSnJeemJOUop6eo6eSkZmop7LDr5mrnauej5aWqZ6rnJ6grZihm52ipa+moaSnnqyYl6admZqhnp6csKCdoqeWmJOZlKCilqOfl6COlpSLio2Olq2Pe5SbgpGBiqmohYCYloqEjp+Ie4OQhoWZkIeGiZWOm5eNkJieo5aZkpCdjX6NZaGzroSJhHZ6j4p9dnl6b2d5kIGAiWt1gXmIcmh0f3p2g4iCa3RjeGZfaGRjZGZqWGt7cWpqXFJMUERfVUZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15dXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLSgua++rautsbKgqqayraKss7DFsKqso7KvvKS0nKCnoqGdmZeopqmmpKWztZ6VlJ6Zma+mrr6gq6ORkZ6amZSRlaGcl6mdhZ6prKKzx7OfqaSqlpaYmqeeqZygpKuUnp+eoKquqaWiqqGsm5+goJilnpyenK+kmZ+ok5iXnZKlmpipnpqXZoOSfGV+jpqPY3iMbGhqepCjq2tkmZh+Z4WKZWVpaHqNoY5rZ4yXkaJ3a2qLmKKfmHNsbnqEjYV5WGVdhYFea4qKgXZbaHN3d5GAh4JueIJ4gHNteYR0d4iJj4N7aIRYXWpzZF1ziGlqfHFsY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kuNlpPNilFWS9ETzFZQzs/Lj2ln7q8ua+rs7CrpaitrrCnrq6wvbGpqKStsLCfrZegpJ6hmpmmq5yso6aoqbOunpWjkKKvpra5pa6jj46aoZmTkpqgmZmmlnulrKKos8O4paKnr5+elZ6jn6ScpKqokp6hnqCqr6mqoqmfp5umn6egrJWhm6WwpJicq5ahnpuTpZieq5mefr6DiHK0coWdhq1od7nEuHGSoaN7ppiZc6qCfMvAwLtxiqKHg558lZiInsC9gpadnY2cwcF7gXqRjJrCv31rpbFvjIFvynp/m3iRg46AdnmBf3lxen+HcHiFjJN5bHWRYmVeeGRfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqO4w7Swr7+pqZSjr6mwr62msravqqamprGroKuYm6KgnJuqp6Kdq6KlqaWktKSdo5Omrqy4tKevopKRmZ2lkpGfoZiboJ2Hpqukq62/wLGhqq6ql5KfnaKZoqSqo5OgoZ6drK6pq6WjoqWgpKWcramRpJuorqqcnaqcrKKWl6WWoaOYnH/OlHl6pYF5lZabX62PXY6ngKGgfKeVm3SrgoCvXmSMqXqnh4WfdJeSiLNjgquGoI2NsmqErnR8loe4YYKtWaPNbo91e9t7f5lxfoiSdX9le4h2dmt9iG5+hZCSfmyAjV9wam9mYF94ZFtxaGpjZmBSVFJXXUpPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMa3CwMC1tLC3mJ6RpKqprbSrprKtraykrKawqqCnm5qmmJyisJ+gn6ino6ahn7Csm56Wpq6tsauorKCUkpufpZOPnqWXnaijnq6kq7Cov8azqKmxrpaTnZ2il6Cpqp+VoZ6dna6vp6qom6amo6Cqkqyzlqaiqqqeo6emobChkpqnmqGblJSRl6BwhYyXdYSoh3GwfJ1yrH6hn4Glj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKGLkYucfqt7iJKOoIB6rVacxHqPb5LBfYGVbXVwjG1mdmWGb2F3bnJuiIqRj4NtkI5kbnN1b2BmbWRfbmlpbmZjV1NcYFpSUkM4SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCc9MSkzVkBGIRxHO0MxLSuv1MbHsrSfnaOOo6Oira62r6mxp6mqqK6rq6eio52ZopWfpqufoqWfqKiin56wrZiblqinr62op6mel5WapKKSlKGtm52no66so6y1qbnNsq2mrqyXlZydopmfrqydlqGZnp+psampqJqqqKOhq5uvsaKoq66mmaarqqqxo5OXo6WalJKFpGqkdYl6qXR6snGCpYmYjHCHoJqHpF9gUquEf66Cm3WugaaGhp96mJaFe2aAo4mkmIaBo32pfoCUhq5efKhVnaKSgXqjn4B7w6/FjHOvs7O5cWKpr8J1aIyLl4+BbJmRbm14d3dubGZlZHFwZntpY11WX2lYWFRMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C1sK+praOop6qrq6mkpqCbpZ+dpaempJysmqKroaSfr6Oem5OqpLawrqCpm52XlaekkZuhqJ+gppywpqOosay2yLK1qqyqlZKdnaKZn6WznZqhlJyfpquroq2Zq6ihoamisq2iqrKyoZuqqK+vtqOTlqSnmJuRfKpsnoSHdat5fLBugqSLiJ+WlZ6VgdK3tLjJgIGyXl+UqYOkiIegepiVmXiqyXOZo5SnqZCSm4x+momaxsZ3ZaGCpXOCoI6Cfa9eb7VjsXVLo4Ztp0eCk2OOj52Se3CWkX1venR8em1cZmpycWaBaV5hWGNtXF5ZSU1NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTRPVFEdHDs8RjIsJKikwca5raiyrqylop2yuayqoaabqKarrKmnoKalmKqjn66rnaagrJqfqaWdp7WfopeTqKu2sqybppyglZCmrZGZnKejoKqnrqGjp6mvtMKys6qtqJSJl52lm6Kjr6WXoZWZnKWlq5qunKynpZ6ro7esoLG4sJ2br6eztLOllZiopJugjoKdTniagX+feoSjfIKkhIamnpyek4S4e3x5uYJ+zMXCtniaoJCLn36alpeKdZ6XiqSYo6h+sIWbhJ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV0jpGjlnt9kZCIc3pyhH5wW2xud3JqgW5aY19obmJkXUtMUVRBSEhGSTo5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTI6UFtUHBs2P0gsLSCMh5mprKSruauvoJuhrLO0pp+glaWvrq6ppp2mppqjp6GyrqGpprKgmaiklKK1oqOVl6Gptbmkm6Odo5OQorGZnpynpaGir62dpKiitbHDsa2qraqRhpGcp52jpJ2ll56YmZmlo6iZraGspKWXrqW7rKG3t66dnrazubGzp5mesKKknoaP0bXDt3mHjoWRk4+ApniUoneMoJKEpYKLcauGhLRucmmZo5yViZ98mJmGh49yroKlm6KNpouTnIiTkJptcLJcpXOTepxsmX97mX1uqWGicXF/n2Jzsrhod4+TpZh9i4uRind8eI2BbGh3aXhzbn90XGRkbW1laGBKWldYPEdHQFQzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklknOMiq6/v7y7tZ6XqKSttqGjmZWjqaeuqauZpaGfpaCgtaeiqaewo5Sro46kraOdkJqaqrS0pJ2mnKmSlJeuoKCepqSdp5y1mqCqo7WrwrCpq6mijYSPnKKhpqOWmZqcmJuYpaSmmKqmrKGkm6ymvayUvbCtn6Ows7qstKebqbKlqJh6qJB9fLB3ioGkpYicbbJvoIetfKGPg6iWmYCsiISuhZ+UqKCiloWfgJmVgHuSfauAnZqWiqp4nZ+OiJOSgHmvXaOBfKanZJ2AfJd0a65dpWtxhZldYFuMoG2UkKaZgpOLlYp5eYKWf2psfmJ9dG5/eV9mZXFuZ2doQ1lgWz1KVDJUOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVVRSEZJSiMoKLySmoSpxsO2wbSfm62grrilpI6bpKOgr66pn6Oena2Ynrmgoqugr6qaraGQqqmklomakK6xrKafqJutmJiPraKhnqWhmqWcrZifqKa2qL+vpamkn4yAjpuboKaekpSZmpSamqSjo5mnqquio56pqL6kl8OsqqOiq7O6rK+nobSwqauZdq9+kIqchYd8uq2JmGSwjGWVrX2gj4OnlpqBrIqEsIWlmaShopCEoFtsaoGzYH+te3uCgbFsZ26Zl4uIsVt9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46omomWj5SVeXeNm31jcn1hg3hzf3xgaWZwbWZlZU9VY1xBVF49SSg+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBgYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5ytpqW2qaGLmaCfnbOyqJ6in520mKCzqKqrnrCtnayblK6poo6Im46vraimo6iZrpOaj6maoZ6ln5mjo6WZnqKpsqi7r6Wonp2PfIualqGgmpCRmpuRmZennqCYp6ympKSipKm7nqDGp6Wpoqu0tq2up6C9rq2tloGpkqOujpuAhqSXmI+BgLjDuoOOnJOEp5ecgqyKgq+IppuapaqRftW9wqpio7+9fH6jgoPXuri1hZOSgp69voRqo4Fvq4RunH96srHHg2qrsL2teHeivrt0gJWNppuOmY+Vm3iAj5l5Ynx6Y4xneIF7YGtla2piUGJbU2lcQFRhQk0pPDo0Lx4fJB4lMiAdJCgwNDk2Njc4Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJW0tLG/ubK9s6Kdrqams6aejJilv6q3sKegv6amsZuesZy5qJ6trqWnlJSvrJeMg5qRr6ajrKGlnKqgmIujkqaep5yaoaiimZ6gq62pua6opJuXk3uHmZGmm5OPkZiYj5iTqJmfl6ion6mmoaKqu56pxaOgr6Ors7WrsKqhvKiwsJp0daqkt4VliZ9vZ6yPio9tb3ekkJmfgXWvmZVwkIxxlaejm5iupHJtbW1lindubYKZcYB5aXBpZ4mVlZdxaGmFhmdwhmReiWNqcFldZ353pmBicY6Sb2ZkgI2SjqKXlpePlJ17ho2TdGWGd2iManh+eGRsY2ZsYktkWEprWTpQZUVRJ0s5KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiUrbOpurmys6qpoq6fpLOqmJK9scPIvbWpnsCrrKOgpqufuqOkrayspY2WraqPjIWVl62fpaqin6SkoJGMpZOnmaiZlqOqoJacpaanr7mrrJqbk5J7hJeNppeNkZCYlI2XlaeUnpenopqvpp2irLmfsMGopLOmrLGxq66sqLmkr7iWiqGopbaciZahl4apmpCUnZOqs5mbo6yhs5eioJ6gopygpKGVq6aMkpOMh5KcnJSQmZOYkI6VhYCkmpeVjYuTkoqPhoR9Z4uAdIN2dIeMcadtfJWRlJOBgY+Pj46dk6CVlpWfgYaTi3BnjnZvind2fHlpa2Rkb2NVYFlAaVpHYmBOWSpFPSsmIjc0MC4fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVVFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW4rq6isKStoKG2sZCOq8S7xLq3qqGlnZumnbCoo7annam0pqeRl6yji4iJj5ynlqykoZqnnp+TlaOXqZqomZSnoaSQmqeZobW6qKuYmpCMe4GUjKGUipSRlZCPk5elj56ZqJ6btaOdpqu3qK7CrqO3pq+vsK2qqrS6oq+9mZKmo6a1opGdpp6NqZ+Nkp+jrK+aoaOxqbCYpKGcpKqenZ2cl6uckpmhm5OQlqqZjZiYlpCWnpGIoJ2UlIWSjJCMlIuAfmaMh3WHdnmIg3OcaoeRlJSRin2MlpKSmJKgkZuVn4KGl4V4cZRyeIl/cXt+aW5kX3BpYFtfWW1iUGBkUFo6R0ZFPTM9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJWkp6Ows6yuo6mnraCotaqRkJyjsrquq6uhopl6naKwpKWxqZabuKajlJmpnI6GiombopCunqSWqKChkpeZnK6LqpaPqJmojJioj565tqSlmJuNiHmBk4ybk4qVkZSQjZGWoYydnaednrijf4OvtaKwr3SkvqOyoHh6oKuzvJV2rqSfioCqfmRbYXafjqSdg5d+bpOznKOorqujZZ6gk3N5mZZwgJiol2x/oqeJZZylm5CXmJaLkZuQhZ2akJSCkoeOjpKJhXdrj4d2h3F8hoGAYWmIi5WTi1t2lZFnaI+NcXqjl5ZkeJiGgHaXaIOJgm54fmpwZV91b2traFxlY2Jib1JbPk1OTlJHPUBUQjkxLh4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXF9oZmdXUUo8REc8OVZSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6mlqa2jp62lkpaqtK6xpZmppquWc4ucr5+oq6eTlrifoI+co52RfoiImp6Nq5qklaeino6Xkp6Fda6QiaaaqJGXo4iburSooJmYi4l1dpOOlpOKk5GQlIyPkp+Nmp+mmJuyloCMm7WdtIySj72noX6nonqjr7iBjo6nn4SLhY+wqa+MiZaimXmBi6yGnJ2iqKqoiJWGmHelm3qHm4GXpoKBe5yxeoqFn5eZlJiWgZCWloSZmmJ5h5CEjY+Si4NucY+IeoFxgIGGf4Z0h4WWkniWaJN0oJp0fJmDnpuFmH6RiYGCl2mNjIRreHpwcGdkd21pbGpbZGppZXJbXkhTTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWhmWVFIOURLPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrca8sKGVpai0nY+DnKubp6KgjZC+npmNn5qgkH2FjpmXiKudo5agoZKNk4mGgJGojoeinKOTl56Gn7myp52ak4+FcHWQipWQipSPj5uLj5GekZafo5WdrIiftIm0mq6Lyoirrom3hY2wg7GvhKmNp5iNnXyoj3J7d5uOppZolaR5tIufnqepkpnCgX+riJihcZ6AmqR9l4WVsYGhfKCTn4+Yl4COk5uJmJKLfIWTho2Vk4mDbXORhYB7coaBhX2FdIWCl4GPxWaAqYePomqegp+YgZmAiouDiJhvjZKEZ3d0e3ZnaHVwZmdrXmJubGZsWGZGXFBMMkU0Nk1gYzYmNDxER0Q6NjM2NTg7OD49PT5CTD9OSUpLQ1BaXVxXYl5qbFxRRT1LTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkuLGqq6aalJ+ipKqilaOptqKvf6CmnKWenYmUvZmTjaCRnZB5g5aWkYermZybmqGFj4x3m5yPoJGInqSblZmYhqK4raWZm42Nf2JtkIuTkI2PjIyXi5CRno6Tn6CYoah+oaeHrZ2glq6Pn52dkYaBoI2rr4ekjaqajJp+onWAmJNrgat0Tat4h42dkZupqIKqq32DoXt6p2mef5JrZ5eGl7aInn1tYGNYg5d/jHtkZ4tzmX15lmtdfJduX1NxhVxgbHmDYFllgn2EgZhxp6prg6NucqVwn4OdZ2SfbFpsiHplWV+CfmFXUG92ZW10cWpqb15qb2xraFdoTl1XRTlBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fYnZgTUQ6TU9NVGJcW2ZmaWliYmRhZGRiYWJgYmRjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySoba8q66imZefoaWsrJ+crbSip5Ggn5+mnJmOmLSZkIuejJWLdYGUkY2KppaWmJ6ef5OFhqykh5yRipipmJmakoelsKailZmIiYBpboiHi46OiYuNkouQkaGMk56fm6Klf5OBj6OhlKB3nJaQp4Ohp4CGqq6FpXmLfYSafaJwcpKHlnuejHlth5uMmZCbqZuPh518gqJzdqZmnn53pF+YenySc6JumLe0unSSh4GAtqhkgca4e3CVtoxxgJukY3Ssq2B9ap2zfm59h4OOgouXcYCjbHOkc56DfqNenZmzlm97l56zdHJbnrKCaWJvc3VxaG9Za2xycmVcaF1iS0Q9RDVRQVlxMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pYYGB8ZElDOExXVVZiYVplZmtrYmJlYWRjYGFiYGNjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmsnJOgjqW4ta6toJqinKOjpKybmrGsq5KXoJigpJqalJ6rm4uIkniLhXCAlo2Kj6CQk5Sdl32RiY6ooYeYj4qSo5ObmoyLqKekno+Wh4R+a3uGfn2PjYOLkJCJj5OfgpacoJ2gn4uJd5yYooygcqKLiKmInKeRl6isf66MfXqgmXmjk3iAc5eIjJx9lp+Gm42Zm6aGo2ShfImWkJuNbJ5omo1umpl6f4qnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2dYmKf55omnWHk5KYjn+ebpmQa6aZXKh+d7tqfalajoRds2dcbXF4d2tpW3BpeHhiXmVXYkFQRE83VkJSbTRKWlpfTlpEQDE1MTs7N0g/OkNIVT9YUlldPkRiXVZgUWFkfWlFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZyJqrabqIljlZysurKwrJ2mm5unn52tmp2wp6udl6KZoZ+Zlpago5mGiY1piIBxe5eIi5aWhJKVmI96ioSWo52JlY+Gi52RnJuJj6iioJqLkYqAgGmBhnh/lox7iI2Oh46Vmn6ToZ6gopOYcmifiqCPjHCSjIKpiJmfo6mhqH2wraSiuJd2o7Oio3+IlHidequafqKOnZuXiJdyoXyFja+1fWuakaF4fpi0o6OrqISYe5p8nJl+c6paXW97l4t4nmJMf3t7hWN6mEJNn1mianJ8jm2BiYSZdZt5h4mxs39/mpKmdH+dbXF8lG+ZcmmjXZV2SGVjYHNwfH1uZWBraHZ7YmNgUV5WXFRWQFlFUWdEUldbYlhfSUQ9QjhAQjpJRThMRVhBVlFbVkRGYVxaYEtgbX5yRUM8VV5iWmVqVmdobG5iZmZeYWFcXV5gaGJfZWN2bF5lZ2ZsZGVsaGhraZOdgbGumYRTXqGntLqzs6maooubqZybqJKhq6Ogp46enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32Rk5aIcoCJkqCccpGQgYiYlJ+ahI6onJqViouKfIRshIVxgaGMeIWNiIeSmJR8kqOgnqOIroZ9tYSPnp17ppZ6qYKWnZCLoZ59p2h3bX6Zc6BzcXydhZhvk4KufaODpp6agaNwXqlndaNjb6VhnNOPfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyp7x/d4Ntf7+mqrRem29+cZdvgXOicl2jZ3SmYWimbZvTmHqCm253eZdrm3p2l3JsqaVnX2R5cH6Ea2dmY212d2ZfYVJbZVFRYUlXSVRfV1NbZWpbZVFFQ0tMSktCSkQ4UEBRTldTWE9SUWBlZWlSZHh5d0lGRWNdZVpoalNpaGpvY2pnYGJfXF1dX2hiYWhle2ReZGdka2RqbGZobGiYm3+wrFRcS36pr7K1sLOjnJiFmKagoKKNpKifl6iJmZeYk5mTkqCXjYiFe3B9hGh9j4OTmoF4kY2OiXB/ho+SkmyXk3yJkZKjlYOOqpqUkoqFiXmEdoeAboGfhneAkoaImaGWeZOio5qgibOhoraLeqynpK6lcKmAmpCFgZySfaSAopmGmHGehKKsromXi4CMpI2Wg66ilHa1trXJoXSUioCfYZ6XqW14loafmnWhh3egfZCWioFvTGaiknCaiHOke3l0YYOCbH6gbHJkYJxyf3SXaXtps7W0xqZzmH57nWqbmqt0gpptc3eXaZp5dJhxUEV8s15qdWp4h2ZqZ2J0dHBtVV1TWWhQUmhJVUxYUlZdZ2tuVmdXTUpBSk1KSEpOQVFKUGVjaW1ldHJzfnh7bnWJe3tUUU9sXmhba2lSamhpbGdsZmNlX1xcXF5pYmRoa3tfXWRnY2pmbm1laWxlopyJr6eFZj+UobOrr6+1oqKQgJeooqGji6SmnZylgZqXlo2XkJCbko2Ig3lqeYZlg4x+lqB5dY+IjIFphIWSg4yFnY16jIqVpZKCl6mXjJGLgIl6gH2LeXCQoYZ5gJSHiZaflH+UpaeclpaEZ254nGyiZHxxpXecmHBnp4GXjHuleqCWg5Zyn3aAiZSWj7lukIqiYn2ZopWIbnJpqmt1oGxupmCbaYuQaJaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGaIgm5yolpfW2Shbl6JjG97f3NyZKVueKJkZ6domHKLmG6hb1KIj2+gXmSnVItdU5htbXJqcYFscGhreHNrb1FXVlZmWVNtSVhPXEhYaWhzallrVlFSRVZcTFhSYVVoal53dXp8cHx8coJ7f3J2jYCDdl5Rc2FnYnBnUGpoaGtsbmdkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmKZ6ZXRti6eupaqwsaafi4CWqpyepIyhoZqhoYCVmJONmo+Ll5CNinuGcYCIaIuLfJeac3WJfZB7ZYOHlYqKlZmCfIiGlqaQgaKrkIWQioGKfYCAjnNpj6WEfYWTjYiYn42HkqqmnommeJacfqWJloyymJ6Qg6+Xn6V4loh6qXSlj4SabqWijJKEjIO8bnylr4KGhYaTlpygfaZ6caiUoJZnnn5vq2KWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4ZubZ+ekpVhfquLqnaAf42nn3effYWklZ2gaZqHdatmnq2MtnN3voykk1mDpo2rYXVxc297dHBian5uaGxSVVpVYGFda01dUl1JXWxtdmBbcVlbYFpnc2Vub3JjcXRgd3p+eXJ5g3ODfoF7e4yBgoB2YnhkY25zZFJsZ2hvbHJpZmlhX15cYWpibGx6b1xcYmlibWl3bWdsbmKVpqqcgYCepJapqp6op66jmYmCl6qZnaOJmqWcqJ2Ei5qPhZyRhZKNi410hXqIg2+NhH2Wk3R1hnKRg21/i5KHhpOPfXuBhZeljX+lpY2AjYmElHWDh5JvbIqogIKLlI6JnJ6JjJOqo6CQgHWVl4h+gXmUrqN/gZtxj4Z4kIyFgHtyp4xxfX16l5abhI54e359iJSVk4p2kJmfoYR7fYlrjIVbeXlyeXBobn2RiXF/dIGPlJNxhYOBZY1/X4GAjHd1c5R1b3pvbodthIZfd2h4jmaBgoaOqpx+dH2XaomIb391fIR1bWxmjHN4e5d3hFtqWHiPaG13cXBvd3dvXWyGbWlnVllfV1xka2RVYVVeUV9wd3lrandlampqdXxxcXRzYW91YnN7gXh1eYJ1f4B/gHiLhYJ9e25/bGR5bl5XbmdodWt4amlpZFxgWmNpZWxwdW5aW2JrZGtreW1obG9hjpW6qaeLoaKapqSZpJ2roqCDg5erkZ2giZqmmqiYgoGbi36WlIeOiYiNcoJ8j31+j4R6l450c4RwlYV7fZKLhoaQhXh+gIaZo4x7p6GLhY+PhJWCho6Xd3KEqYWNkpyQiJ6eh4uap6Cgq4OJjpWafn6Jlq2oj5KnkHhwnpGDe5NvfqmFcH2VcWpvfIGfi3+SjoxobV2Di4ycm5+Oc5WLiHF0a4J2c39Ycm6Gj4F9fotpXWljeoWDiIBfaXh7m3yDjIN2gYaDaXmLh2thcXODd2BzjIKJkKeVhmaNj4NudouDb4SMeG5kZmN5gnqVWlxpZm52W3p5d3Rtc3KCZlxtimtrYllZXVpYa3FbXmBZXl1mc317c290Y2pqaXt8cXp3dGRtdGhsfH51eXx7enl/gH9vhoqEe310fnlyf2hUXHFpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbmxnc3luaGptYIyMq7GikKOhmp+emJ6ZqaOhfYOXq4yflIebopCklH97l4R8kpmIiYaGinJ9gIt2hYuBhJaKcm+AcpiGhH6Sg4SGioF6gIOKm5+Pgqagh3iNl4iVi4ucl4WDeqyBkJeZlIqenYeIoaqfoqKjjIiTm5yjmZaqoaemoJKbiJePfHiPjoSofn+SkZKTnLClmpSdkI6yk5iEpoyMlZugiZCbgoiRimt8jnZ3ZYKGkIp8iZ2Eh4uPh4iAhIOQd3x6dZqiiYeLn4uGlX9+jIGAdnF0hoWAeIiHipGmkYSGjoiDjZCMfIaKh46AdWuBg3t5mWlyaGBzinB9enZ1b3d0gVxeb4dobl9eWltcU2dxVWNbW2FsaHR7fHJucGNqaWh/e214fnFob3BsZoB7coGAd4B9f4R7bYKMhXx6eHx9eoN4TmR2anNucHtla2ViYmBbc2ZwZnJxbFVdbHRtaXl6cGdpa2WNiJ26n5aioZiVmZiUmKSgnXt/maqNnY2Fn5yKnZZ8eJSCe46ZiYaDhIZteIGAcoCHfYiThG1rfnqXhoSDkH6AhoSGfYeDjZudkoeqnoJxio+FkpGLnJF9jXqpg42Sl5WOm5aGhpumoKKanYaDkpmZmJCapp+mnZ2Ql4GSi3d9iI6FpXt8jpCRhpipoZyTnI+Nqo6SgJ6NiJOan4OPl36GjoJveIVxdGB+g4+FdIuXgIOOgoaEfoWElG55dXWToouNhpuFhY50gIp9fXJze4mEe3mMjoSTp4+GhI+Cg4qJiXWEh4iKe25qfX97bWhrbGdeeX5nfHt2c3V1enZcYHB9bXRgYlpcXlFmbVNlWl1ha2l1eX5wa2xja2pngH9rcoBsa3RueG6EeW6GgHaCgH2FdnGCjYd9e3p8f3uCi2Bpe2t1aGmDZWpjYGlbY3Vob2J1bWxUYnF5ZHB6enJlam1ti4qfuJqhpJ+TkpaXi5qfnp16d52lkJuJhqSUipiZeHqNhXyJkYOMgoGCbXx/eHKAhX2KkH1raH2Bl4iBiI58foaEh3yPgI+bm5GIp5x/cIuKi5KGoKGKhYx8p5GHj5KXk5aSd42joKGdlpp/gZCZmJOMmqKho5qXkZt/joV5gISPh6GAfoyMj3yXpKCgkpmQj6aNkIGbkYmTmJt+kpJ+h46BdXSCcHZgfYCNhXGKlXyHi3GMfoKFhY5oeHJ5jJmSkICYfoiLcoKHfH1xenyMhXp7ko2DlqWTi4aRfIWGh4R1gYKGh3lkcXp+eHlwbGpmXn1yaHt1dXN8c39qXmBzdnB3ZGNZXl5SamhUZFheYWdqdniBcWZrY2xoZX+Aam19Z25wan13hXpri4FygYF9gXR2go2Gfnx6f4F9f49qcoNuc2lhiGlsYl9xVXRvbW5geGhtV2p0dmJ1entxYmtveomNn7OSpaWdjpCYj4adoJqcfHWjoI2Wf4yiioialnh7hod+g4l+iIKAf3B/e3R1goV+iZB4Z2N9hpeKgoqNeH2AjIN5loCVl5WNlp+afW+LgZCThqWbh4yJg6WVhJKKlZeSkXaRnaGhmJSYen+OmJaOlpqcpJ6Zk5SbepCGg3iFl42efoGKjYxzl6KdoJKYjo+ijIyDl5iDk5aaf5iNfIiNgXZxfW16ZIB8ioVwhpJ/kIJrh4KBf4mEZXVvfIeTmI19lHiMiXyAh318coB4iod5hZGKi5iiloKEjHeIhIKBdnqAiIR0X3d3fHN9d2ZrZGB+aWp2cnN0fXB7Y2Ngc211cm1hWWBeW2xkUmJXX2Boa3V5hnBjamNsZmh8g2todGhsb2h/fIF4bY+GcYCCgn90fIOMgX9+eoKDfnyQbXWJdHRtZYpsamFjdVaDaXFuYHhmbGJqdnBmeXt5cWBybIaFkJ2umKaono6Nl4eGn5OXmHx3qZyKmHmXnIuLmI94e4CLfXyDe4CCgHhzeHpzfYCEf4iKgGRefYuVh36Eh3R9fop/fZiElpSWjKKgl35yh3uTkYqmj4yOipKgkYORj5SXkYqBj5igmpKQknSAjZGTiZydnqaYmI2Vl3SOj4pshpiQmXqHiJCJb5edmaKTlIqMn4yGgpKcf5OSlYeZiHuJiYF6cXlqdWx7fYt9bYWRgpN3b4GDfX6LgGRyanyBl5iFf450kYmDeYd+dniBfoeBfYSOhY2UpJB5hYN0iYd9f3J0f4aCbGB6dHlwe29hbmJke2FubnVyd3dzc2F2X25rdW5vXVteXV5qXU9dV2JhaG1zeolrX2plamNod4dtZWxoaWxngHx6d2+Ph3OAg4R9dIGGiXqCfXqBhH19jnJ5i3l4bmyHa2hfaXFjh2hxb2V2Z21sYXpoanx6eHBhd22LgZmaqqCkqZ2KipGGip6KlZd9dq2YjJZ9npORlpSIdn17inx7gHZ3f4BwdHN6b4V9gYCJfnxhXH6PkYZ/g4RzeoCGeo+Rh5GRm5Kkm5SBfYB8jYqSpIiNio2Xmo2FkZiTlY6JiYyTnZOQjI1uhJCOkYiemaGgl5aJlpJvipqFZ4aaj5R6iYWQinCWmpOhkpKIi5mMgoCRnn2Sj5OMmY57iYSHdHN1a3FudXuKdG6GkI2RcXSAe4GCiHxlcW15fpqUfYWJdJGLgXSJeW+Bf4GHfYWNioWNlqiNe4h9fouFd31wbn+EgmJnd3N0bnpiXm9ganRecGl6eHhscnBleF1tbHNtc1haXl9halpPV1hkY2dxcX+HZV1paGZiZ3GNbmRpZ2RpaIB6d3VvjoRzgIGCe3WCiIV4hHx3g4V6gIl3f4t8e3J5g2prX3BodH9rcW5tcWdvbGV7Ym1/eXZxbHd3in+imKKooaebh4yKgY+chpOcdICqlJGMhqCMlZOQf3N7doR3eH9yc3uFa3JveW2JdoCAhm5wW1l+kY2IgICAdnWAf3+gho+KkZyXoJOWd4l+gIyInJ2Jj4aSl5aEiJSZj5aLi42OjZ2KjpCEbomLj5GKnJagm5iVhZiIa4akg2eGnYqRf4uEi4F3k5iRnZGQiImVjn9+j5h8kY2PjZqSfYp/gm92b2ttb3B6hWlzg46XiXB3gHSCiIJ5ZnRvdoKaj3yJhXqVknp3iXRwinyHjXuLh4SJj5yjiHyEd4KLgHh4bml/gX9ccXJxb293Wl5wYG9qXm9pfHlwbW1qbXZgcG9qcW1ZWGFhYm1XUVNZZWZjdXCEgmJda21kYmZrkm1gZmZfZ2uBdXFycIuAdH+CgHh2gIuAeYV/d4eGdoOFfIeMgHt2in9qcWN8YoZ8b3BsdGpob2x2d19xfnl7dHV0f4J+pZWarZ+nloWNg3+XlYOPnnSKn5OShYqajJWOi3pyd3SCcHKFc3F1iGxvbXVtiHeDfX9tblVRgauUh4J4gHZygnmCoIGRgZOSmJuRmXiReoKMkqSak46IlZiSg4aWmYyTi4mPj4iehZCKfXOLhYiPiJyZnpuWlICUf2mGnYhoh6GIkoSRg4lxg5GXjpqOj4yLj413e5KQeo6LjZGWjXyIfIBrdmpta2tsen5heX2OlYF2eoF3g4x8eWd1bHWHlox/iIZ7lJFxeoVweI17i417iX6DjZGenoV8fXiCi312cGhrgIF3XnZvbWtwclVdbmJxYF9tbXlwZ3BmZ3N1aHBrYXdlXVZlYGByU1BOW2ZkXXhwiHxeXGhyYmJlZpFpX2dkWmhwfm9rcXOKfXZ9hYB0dX+MeXuGgHiIg3OGhX6MjIN7eZV4ZnJqg2CHfm9va3pgaW10f3RfdHx4hnhzcoV8eaGQmrGcpo6Din+DmoiAi51+ipmSjoSIl42OjoR2c3ZzgHBvhXNwcYNvaml2bYJufXxtdHNSToLfyZLWk3xwdIN1g6CCkneUkJibj5h7k3KFkJ+hk5OQipKbk4V+lpWIjY2IkY2InICOgXh6jH6IjImbm5yalZN5jXdoipKIbImkhZKIl4OGY4yRmI6UiZaLjYqLcXuUiXuNiIqTkYl6hXt+bHtlcm9qa3l5W4B5j42Aen1+f4aOenpodGt0i5CKgoaFfZaMbH5/b4GNf42IfoR6g5CWmpuLfHd4g494cmxlcH+Ca2h0b2doc2xTXm5kcFlfa3B4ZmtqYmZ4c29wY193YGBWa19ddk9NS2BmY115cYp0XFtldWBhZWWOY2FmYVhpc3Nua3F2i3x0eYaBdXZ+i3N/hn97iX9yiYeBkYqIfH6YdmVzbnxliH9vcGuAWWtueXlzYHZ6e412cneKd3mfjJuvm6CQgoV3iJV+fImch4SfkI6FjJeEk46HgXV3cHlxboRvbW5+cmRkeHB8bXp8amhsY6Sawdyu76Fza3WDdYShhZFulY+Un5SbgZFwhYujl4mOlYqQnZWCgJWQhYmPgJKKipd/h3t1f4l4hoSNm5qXmY6Qdot3b4iKjH2LpIWSiZ2Fhl6LlJeKjoiOi4qEiWx7l4J9iIWJkY+GdoV9fWt9Y3h1aW14c1eIepGGhHl+f4CFjH55ZnRqgIqPioODgIyXhmuBdm6JkoORhX+CeoCRlpSZkHR0eIeNdXNwZnR5gWFzbG9haHVmUmBwZ2tVXm1zeWByY19ofXFybVpicmFiV25aXHdNTUxjZmFednOKbVtcZHheYGRmhF9jY15YanJrbmtyd4t9c3eEgXh3fIhxg4R9foh7dIuIiJWGjH5+l3NodXF5bIx7bnRwgVhwenZ5cWR3eYaMaXaAiXKAnYiZqJyjkoR9cIyUeHmKnYOEoI2OfJWMf5mHhHtzd3Bzam+Ba2lsfHReYHh2e3B0emdgZXzr2rXJw9yIc2xzgHaKmoiNaZePjpyUkoGIcIWIoI6Ei5WKjJiTfI2SiIOJj3uRi4aQgn92eIOEcoeCkpuWk5iGjHaHf3CGg4qHmqKDlIyeg4lhg5WOhomFiYyHgIdpfZR/fYOEiY6NgnGGfn9xd2d2cmlzd2tajH2SgYR8f4OAhIqCdmJ0bImCkIuCf3+TkX1ugmx5h5CHk4V9gX6BkpSRl4lucnqMhnVscGpxd39ec2huXGp1YFJkcWhmU19vdnRfb2BdaIJxcmlXZ2hjaVhtV1t1TEpLZWZeYnJzhWhbXGV5Xl5kZ3phZF9cWWtuZW5qdHeKfnNzgX56dnqHc4WCfH+Hd3aKhY+YgY2Ce5N2bHd1eXmTdW54en1YeYZxgG9neHeSgmR2hoVxipaFmaGbooqGc2+Si3J2jpt9iZmIiXuff4OZf4F5cnNub2RyfmlmbHd3W194enpxcX9pYWdhf9W2jpCmeG5xd3txkpCMh2qYjYibkYuGe2iHi5mGgZKRhoeXjXyNjICAiY18kIx+ioV6dXuCenGFgJSYjpKTgYl1hId3hICLlJ2fhpaPn3+IYX+Th4SHg4mNf3+CZn2Rf35/goyPkH5tgnyCdGttdnRzdnVrY42Bjn+EfnyEf4SIf3Bgc3GGfI+Ngnx/kol6cYNme4SLh42EfIV+gZWPkZOEbnB5jH51bW5panl8YWdpaVhrdVpSaXJpYlBicnhsYWVdWmqDbXNiW2dfZGxfblRab05ITmZkXGducYBrWltjcl9cY2x3ZGVdXFpsa2JtanN2hn9xb398fHR4hXiFgnyAiHV5iYGSlXyIhnaIgXB4eXuEk29te4F3XoN/dIFtaXpzlHNncoh9cpKRhJqfm6CGh3Z2lH9tdpOXfYeQg4qNmXyLmnZ+d3FvbGphdHxnYml1elpfeHx5bXF+ZWNoaFedj15xcpa8xIR1cZSIkH5ylouGm5KMh3JqiI+WgHuUjIGEm4x8ioZ8e4mMf5SIdYqGdnZ9gXF1hYGdk4WUj4ODcYCIdYV8ipmdmIeUjp2AiGZ9k4J/hYOJiXGBfWZ+i3t5fn+Hi499aYB8g3Zmb3h4c3ZzbGqNhYqBiX94gYCFg39rX3J5e36NioZ8go+BfnKBaXmEiIyGhXmEfYGYjZCMfW5te4l9d3RuZ2Z7dWJbcGJXbnJTU25zaGFNZnR4ZWBdXFhugG9zWWVhXmptYHBPWWtRRFNnYFprbm18bllbXmxjWmJvd2RmW11gbGljbGlzdoGDcW5+fH90dYN6g4J8gYV2foiBlpB4g4p0gYhyeXh+jZBvb3uBcWmBeHp+bWx7dZVraneEdGyUjoaemKCZhYhufYx2aXiYjn6AioKVl4l5jpZvenNwbGpkYHN6aF9lcXpaYHJ9eWdxemFlZY+xsndKYlqk2dCWcnuQipB3fZSKhJmRjIVua4WSkXp5koaAhJiKfId/eHiJioSWgHCMiHF0fXppeYWDpJCEk4yDfm9/g3eEeYacmZWLk5CUhYhwe5KCfYKDiINugXdogIV4cn9/g4qHfGV9foR1Y3Byf2h4cG91mIyFgop8dniAhHmBa1xxf3OBiIWJfoaJe4lygW5xhYePhYVzhHqCmY2NhHhub36Ef3Z6ZGdpe29eWHZaWHBsTldxc2dgSmx2dGBdW1tZdH1yb1dnXWZqcGBvTldoUT9ZZl5ab2pnenFaWllrZVljcXlfaFxeZW1oZWtpcXd/h29sf36AdW+Ce4CBfoJ/doGFiJeKcYKNcXuGfHl5hJOMdWp6f2xvfnR/fW9ye3uUb26Bf3hmk4uDoZmckoKFZ4eDcGd6loh9foSBmImBfI2MaXhya2xmX2FueG1fYm94XGRsg3phcXZfZWXU6r6KMjo+i46AcXiFiI6NdoOWjH6SjYx/bWyFjYx2fY9/hYGViHyCeG52h4SDl3duiIVsdXt0ZnmCg6aLgo+Lg31ugHV3hHqHnZGMkZKTjIuGf3uShnd/hI2Da39yaIB+eG18e4GKg3dieYSBcWRxaH5tdHF0gZuLgH6FfnN1fYBzgW9bbX91eIuDi3uHgHyIeHpxbImEkISLcoJ6gJeLi390bWt3gIB1dVxoZ3ZvWFZ7UllvZExacnJlW0lweG9cWlpZXXV+dGhZYltnZW5jaU1XZlE9XmVcXXVlYHVwWllUb2RZZHF5WmheYGdtZ2praXB3fY5saYKEfnlugHx8gX+CenWCgY2ThXCAi253foB7e4iSiX9oe31qdHtyhntzd31/jHl4hH18a4yNhJudloyAgGyNfmtofo2Men5/g5SBfn2KiGt1cWdoYltiZ3JuYGFrc2FocIl6YnN0XmNkm6CPblw1Wa+1dGmAiHyShnWFloVzj4qJdnBshYOHdXmJeIl8k4d6fnNndol+fphvcYZ+aHZ5bWV5iISkhoCHjYl+bn52gIF9jJqIgpSRmImLhIl8j4hwe32Ee2h+bGqAe3ppenaBh4ByYHeBfnFkcmZ1gm11e4SUkYF8gX9ud3l8dH5sWHCAd3WMgoZ4iHaCiXp4c26KgZCBhnN/fX+TiYh6bm1qboKCdW5cZ2RycFFaek1ab1xOW3JwZFVLc3hpV1lZWmFxgHRgXV1gZmRoaWVOWmhOQGFkW2B1YV11bVhXU3RhWmRvcldqXWFoa2dtbGlwd3ySbGmEiXx8cH5+e4F/gnp3gH+Ji4Nxe4dvcXeEf3uJjY+Dan57bXd4dop3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISIkHh9e4GRf39+ioNwcnFjZl5ZZl9vcGBgZ3Bmam+JdGF0b1thZGp2e3++nKajyLhxhYNyknx4hpOCc5GMh3Jyb4N7g3R1h3SId5OIeXlxY3eHeoCTaXKEdmd3dWNqfIKHnYF/f46PfXJ/dIV6gJKRg3mWjpWPiIKIe4iIa3h5fnVnemhsf3lzaXp2gIN9aGB3h31qanNne4BpdoCLkJR+en1+cHt2e3R+YlZ3fXJzioSCfYNxh4p3eHFwhIKNf355fn12joaDdmlxaW2IgnJvXWdhcW1KZXVLXW5VU1lzbmJRT3N4YFJYWFxhb4JzW2FcaGVlY2tjUFtwSURjYVpjcF5dd2hVVlV3XltlbmhWa15hamdlb29ocHZ6km5piIx4fXJ7fnmCgYF8dn2DiIWDcHeDcm53g4J9iYuTf3CAe3h5eoGMdIN4f4GBgoR6gHVvfoqLm56IfYV6d4Z7Z3SFi5B6fn97iIWDdo+AZ29uX2RcWGVZbXJgYGBwbGtoiW5gc2lZXmRtgHep2qnHhoeycYl3b4x1e4aOgHqTiX91dHV+d4BwcX9thHSUhnh1a2B6gnmIj2ZyhHBndm5bbXyAkJN/gHmRkn15e22Id4GSjIR0loqRjoeFhXt/hGx1dn9tZ3ZlbXt1bWp3dn9/fGBieIV5aHR1Yn17Z3SGjoyVe3SAdXF/enxtf1lWdH9wdYWHf4F5bImGdHlsdYCEhH57fXl7c4uBfHNndGVui4Rtc1ppXnRkR21tTFphV1ZVeG1iUFJ0dldQVVheYXGEb1xgY21kZF5vYlRdckdCZl9dZmhdW3tiUVVcdVtaZ2thVmpfYG5lZmtxaHB1eI50a46NdX52eH13gYOBe3N9g4iHg29xf3RxdX+FgYmNint3f3iDe3yFh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeV59hZiMeYaDdIWGhHeJe2JubVxiW1thVmlzY2BbZ25vZodxYXFmV1xja398ys6HuaFqbW2KbHGEcXyEiX57kYV5eXN5dXV8amx1Y4R1koJ3b2ZefYJ6i4lmcoJranFjWG16hZuIgYFzl5R3f3xuiXKCi4yIcpiOkYmFi4N7eH1xcXB9ZmhxYm14cWprcXh9fHpcZHmAd2l1eGWCdmd0h4uNlHxxh2pufYF5bnxdWHJ/bnSBi3yCb2+Kf3F2aHd/gYCBd31xe3WHfHpyZnNhboyCa3JXal12W0htak1VVF5UVXtrYU9UdXJQUVRWXmJ0hWlcYGtqZmNZbmFYYnBHQWhcYGZeXVZ7XU9VZHBaW2poXVdoYF9yZWpncmdwcneGeG6VinR/end+eIOHf3Vyf4aFjYJwcHt4d3V6hoWGjIV6fH90i359hoSEh39+fn2Hf3x4dnl4kZOgf4x8i211gHljg4aWhXORim+FhYF6g3RjbmpZX1tdXVRnc2VgWWRxcmaBc2JrZVdbYGl/eL6ue6C3bWJzhmhze3F5goV7fYx/d3hydm97dmVqbmCHdY6Bc2piXn94eYuEZ3F+aGprWlZvd4mjgYR/cZmTcYB5dYNugYOSiHOViI2IhImFfXh0cm5oeWBqbWBtdmpnamt5d3p2Wmd9fHhlcn1thHRldYWMhZV/b4tmanqDdW11YlxwfWx1fYx8gWZ1h31ucWh1f3h+f3N9bHt7gXp4cWZsYm6JfmxtVmlfdlVKaWpPUU5oTVl8aGJOVXVqTFBUVV5mdYNmXWBwaGdhV2ldW2toSkRqWmFkV1lVeVlOVm1qWV1sZVxZZWNedGVsZHFncm91gXhwmYV2f353f3yFh311c4KIgJWCbnN5e3pzc4WGiIiDeIF9dY9+fISKjoSChHt+i4N7d3x3d5qdl3qKgoZpdn18bIOEkn9yj4JwhYJ+gX9vZmxnV11bXFtUZHBkX1dicnVpdXBlZWJXXFxof3BvcoBziWRkeH5pc3VzcoKEeICEeXd0dW1renFiZ2tnhnSNg25mXV99cHuJfmlteGZpZFVXcm+NpnyDe3aWkHR8c317bnx8kYZ3mXyIhoOGg310cHJsZ3RcbGhebHRkZ2Zpem97cllngHZ0Z3CAd4F1YneFinyUgG6Lam16gXFmc2Vhbnpnc3iKfH5idoN2amtxdXtxenl0fWZ+f395d25kZmJuhXxtalVpYW9SSmhqT0tOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2llYFZjV2JwXUxLa1hjYVVUVXNWTFh1ZFpfa2FcWmNlX3ZmbWJwaXNucn91dJqBd3+Ad39/hoR6fHWChH6XhW5ydHx6dHGEhY+BgHmLdXSQf3yBlY6AhYR9foyGe36AdnujpYp5iIaEa3V8enWDgYt5b4VzeYR9gYN1bmpoZVZdW1paU2JuZFtYYXN7aWhtaWBiV19baoBpa2+AZ2tgaHl4anNzdG6EgXp/fXV1bnpoanlqX2VuaIF2kIVnZVhid2l+h3tvaXBnZl1VWG9njqh3gXp8kI55dXB/cHN2eo+AeJV1hoOAhYh2anJ2Z2huW2xkXW1zX2dhanhoe21bbYJyc2pvgH55d2F3hIR3j4RyiHFveX9xY3BoXHB4ZHF0iHx5YnOAcGdqeXRybHh3dnhkg3t/eHZwZGNjbnx9a2tVaGFlU0prZ09HUWtFYHhnYU1TcVxKTVRZZWt3emVfbXFpZF1WYFZubldLU2hXZV5YTVVrVEpceV9bX2tdXVtjZWB5aGthb291bm94dXqYfXeAgXqAgIeFenh5g36Bk4RxdHR/eXZ0hIiQfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aErJ9/eoiIg2tygXl1gH+BdG6Gbnx/c4mAam9tZGRYX1pZWlViamdbWl51gmlebWxcYVZcXGyBZXF0fWlpXGt2dWd0d3JshXt9fXl1cmx5aGl4Zl1lcmh6d5OBY2NUZXBngoV3d2ZoamBXVllnY4+nbn53gIuOenBxfWh6b3qNfHePcoR9f3+GbmR1c2RoaFxrYl1vb1tnX211ZHpoXXSAb3FrcXt9dXVhdIWKeoeHgH93cnV/dWFwbVpydGJxcoV8dGVygGxhbHtvaml7eXZyZoV2e3p1cWRhZW1zfmlsVGheXFRLcmJQRlZhR2J2Z2FLVG9XSkxXWGdrdnpkZW5xZmNaV11ZdmVVSlxjV2dYWUhXZVBIYnhaXV9sW15cYWNef2lqX250eG5vbnaDl3lygYB8f4iLhX51dYV4h4x9c3V1gnl6eoKLjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj66Me3uHj31lcYd5c3x7dXJuhmx7fmyPemJwb2JlXWVWWVlWY2ZrYF1cc4VoWHBuWl5XWlxse2Jwd3ZtYlpsc3NndHVwbIR5foB5d25udGVpdGVbZ3RmdnaSel9dUmVma4OCdH1iY2lcVFhdYmOPpWh4dIKFkHhtb3poeG58hXt1iXOAeHx4f2hldm1gZmBeal9dc2tZZV1vb2J6ZVx3e2tubm93eHN0ZHKDkn6Hgoh6dm9yfXNid2Rbb3BicXGBfHNncoBkXm52aWRneXt1bm+CdXR9c3FiX2Zub31kaVNnWFhUTXdfUUpZWEhidWRhSVRtU0pMWlZpbHJ7Ymxsc2NhWVlbYXZbU0xjXVhpU1dHWWBOR2l1WF5hbVtbX2JiXYVoZ2FueHlsb2p2gZB4bYJ+gIGSh4OBdnSJdIyGc3F3dYJ3fH1+jI+AfpN+cHeVg3yZknmAgHh5fn90iINzcJmie3p/iZR4ZHWIeHN3dWtzbn5seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGJZVNybltaWFhgbHZjaXVqaV5ZbXNxbHNzc2mFfH5/fHZubmxkaXFjW2tyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFtjkZ5lcnGFhJF0bGt6bW9we3x8cYF3f3N6enpkZXVoXWJaYGdbXnZoV2JdcGhhd2Bbe3ZpaXJud3NydGhwgZSChn6EdnJqcH1tZndXXGtuYnFzgXpzZm9+W2BwcWFfanF+bGx1fnNxeGtwYVxlbGx6YWdTZlRXUU91W1FPWFFIY3RiYEZValBJUFpVamtrfGVtbnFhW1pYWWxwV1NPZldXaFNURlpcTkhydFhfY21jWGBgYl2LamNkbXl4a29pdXmGe2uDfX+EmXyChHl8h22PhnFvd3p9dIKCfIqOgoKXdHeCk4WBn4l1gICBc3+CcYeCdW+il3R7houGe2V3im5uem5md3B6a3N2coxrXnRuYWdla1JdW1VnYWxsWlxwjGRPb25dVlhVZ2p0Z2J0ZWVdWW50bXB1dXhqhnx/fIh2j3NkZGtuYVxubWNzeIdrWlRWY2R4fX1xhVxjX2NUWmBZY5WVY25wg4WKc2poe29mc3dzfGx6dHVven51XmZyY1teVmFkWWF0ZVVfYG1kYXFdXX5vaGlzcXNwdHVqbYSSgYh7hXFyZm59cHJvU1tma2ZxdIB2c2NsdlVicmtaXm9mfWZtd31zc3NqbWBaZGpqd15mVGRUVVBUbVdRVlNPR2RzX2FFWGlOSFdUVm1oZHxpa3drYldcVVt0ZFNSV2hRWWVUU0haWlBNeHZaX2VsaVliYF5ejm5hZmx5dW5vaHZ2f39sg399hpd7f4eBiX5rk4hyZ3SAe3WAgnyIjn+Lk3J8ipGFh5+Ge3+GjHOBhnN9g3ZupYxzgY2LdndteoxgZHtwZnlyeGxtcXaCZ2R7bGNmZ2hTX15VZ19sb1tebo1oTmltYFRWU29nc2xmeGRkXFhwdGxxenhybIh7f3acenlrYWVsbV5gb2plcXl+Z1pWWGBseHx7cINfYl5nV1hfV2SbiGJrcYGHfXdra3htXHdxbHtqdnNub3uAclhqbl9ZXVViY1hkcWJTXmFoYmJsWmB9a2Zrc3VubXd2a2iFi36IeohtcWVwfW1ybWNZYWlpb3SBdHNeaWxTZXFkVWJuYnpjcXd7dmtwbWpfWGFnaHRcZVVhVVJOWGVST1xPT0hkcF1jRllpTUlfS1htZF94aG59ZGBUXlRddVxUU2BmTl1hVFNKXFlQWXV1XV9lbWhYY2FbXo1wY2dqd3Fzbmd2dHqDcoGCeYeNfnyJh455bpCKdGxzgnR/f4eEhpGElY95foyPh5GbhIB8jIRygIFzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2Njo6OjY6Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyNjIyNjI6Ojo6Ojo6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQk6lr62tra6xYUBEREREQ1hoZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzQam2tLS0tLhZMDU1NTU0TWFfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJiIiIiIiHjpCQkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGj5CQkJCQkYmFhoaGhoWHiYiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpGSkYmHjoqQkpOQipGPjI6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Mi4uMjIyMjo6Ojo6Ojo2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6HioiIjYiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQj4aKhYaPiYyPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPiYeHiIyIjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGiIeGjIiPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmOjIuNjI6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Oj46Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2doaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFFQD46Oz4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PTk3OTs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTg5OTk4ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs9PT9APjxNTDk8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DRERBPj0+QEE/PmpvQj0/Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGREA8PD1ARERFbXlJNjo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAQVhAPlt4fHt5eVM3Ojg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQT9GeFhjhISEg4J7Xzs+PT8+PT5DRD87PD0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0RBP0p0eICBgoF7g4FoP0FAQ0BAP0BAPj08PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3x9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUFATHN8gHuCg36FhVk+Q0NFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5OS0pJR0dIS01KR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVKcH1/fYOFhoaHaEFFRURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSE1yf4OEhIKFh4iKVUFBVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTGeAhIaDgISIiYxwTm2Eh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKU4CFhoKAgoSGh4OAhoWEhIWGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkpdhYWEgIKFgIKCg4SEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+PDw9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWCGhIF+gIKEg4KCg4SGiYqLjIuKiYqLjIlUOzg2NTY3NjY2NDU3NzM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCXoSAgICCg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ojo8ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUVdrcnJ0dHV3eXt7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOjxqhoGCg4SEhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ojs4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw5Ozw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+RXqEgYKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFAQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD8/QT0+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QENQgYODhIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGRUZGREBCPjxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERlaDgoOFhYaGhoiJiYiHhoaGh4mKiouMjYyMi4qKiFdHTE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QEBBP0JCR0dKWYSCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAOTg8Ozw9Oj9APkBAQ0ZJSVBggoOFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhHRUpJREpIR0xKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FER0pMVnKDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLXlFRUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1VSUlRST0xLSkVFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExLTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNGVk5GTU9QVFl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs6UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISUhFRklISUhJanJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQPkBWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RZZ1JVVlhUVFZTT09NSkxKSUlMTUtPTVNvc3Z4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1daWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUV1hYWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFhTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlFVU1VUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVFJNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlNUWlxtcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f4B/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVVFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUEhGT0ZERUZIR0hCQ0hHSEpHQ0JBREBPUE1TZHN1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl1cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo7PkA/Pz8+a1FLYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQj8+PD1CPkpNRlVudXV1c3R2eHt8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXZ1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGRE1SUGFXUlhRUFNTUlVbT09RVlBNSUNGPjo6NjQ4Njk3OTozNjY3OTY8Qj1mdHV2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFhZWlZYWFZYWV1XV1hoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUVBTWldUVE1RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTg4R25ydXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk5PVFNUXFZSVVNSTk1MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSkdQUE9PTVJKT1BQUE5OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUkxJTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUU9KTE1NS0dFRURCOz08PDk9RzY2NzZEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZlJRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUlNTElMS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V4e3p7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9APzw9QUBCPT5FSEdERkZJR0tKQEZBQUBGSEVKT0hQUWFcUVBSTlNPT1BMTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRD9CQz48Qkc/Qj9BZHF0d3p6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVQTE5OV0tMTktMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5LR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0dLRT9CPTk5OTo/Qj88QUJCQURER0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVEtKSE1URklJSkxKS0xJSUxNT1BSUEtHQ0xHQ0NKSkxNT05JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtDRkhIR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTU9HSEtHSEtESElLTUhKTEhISkxLTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbml3dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0NGRUdERUVGRUdDQ0A+PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkRCO0JDQz5AQ0NDRUZLTUhLTkhESEVJTE5NR0lMR0VGSUlMTktKSEVPSUNHTU1OTVBOT09NTElISU9SUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VGRUJDQkVAREI+Pz46Ozs9Oz0/Q0E/QUNGR0pHSUlMSEdHR0ZFQ0A9REVCPkFEQ0NFR0hJR01QSUZGR0tOT0tGSEpGRURESUlIS0lGSFBLREpNTFBOT05PUE5KSkhNUlVUUk9XZGFhbWdwcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRD1CQT5BPTo6PT87Pj5AQj9AQkVHSkZKR0lHRkZGRURCQUFGRkNCQkJERURHR0hGTFBMSU9KSkxLSUdIRUZFRENJSEhLSkdLUk1DT09OUVBPT05PT0tLS1BVV1ZVVFhgXl1pYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJra3NNRkZFSEJCQUREPEFBQEM8ODk9Pjo/PT9CP0BAREZIRUhGRkdGRkVDQ0VCRElGQ0ZFQkVHRUVGR0VJTUtIUU1KS0hISUVGSUhFQ0lJSktNS1BTTkRRU1FRUk5PTU5QTUxOU1dWV1hWWF5bXWRgaGJqaWdrX2RlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRkU8QENCRDw3Oj0+Oz46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSUpMRklIS0hFS0tMTU5PUlRPSVNVVFFUUFFNTlFOTVFXWlZaWVZaXlpYYWBgYF9oZWNgZGVnZ2ppaGpmaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vcnN5TUhIR0lEQUNIRTxARUNFPTg6Pj48PDxBQjw/PkFCRkNFQkJIQ0NERUZGR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEpNS0lOTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVtfX15gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCRUdFPEBHRERAOTw+QD8+P0NCPEA+QUFGQ0VFQ0hERkRHRkhIRkhISUtKRUpISEtIRkZMSEhISkhMTExMTElNS01NTU9MUFBRVVZXT0pWVlVTU1JRTE9SUlFWWltdXltcXmBgYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvd0lKTElMR0JFREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRUVGR0VJRUZFSUhGSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV1gYGFhYWBiZGViY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3Z0dXV3dnV1dGVxc2twcWpydm93SkxMS01HRENBRDw/RUVFQz1BQUNCQkNFQUNEQUFFR0NIR0hHRkpGQ0dKR0dKRklMSElKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGVhYWNpbmhiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdEQUBEPj5ERUZDQENBRURERkNDRUdDQklFQkhKSUhIS0ZES0pHSElJSUtHSkpPS05MSUxISk1LWmZKZFxLbFJITk5fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDREJFRURGQkZGR0NESkVFSkxMSkxNR0dNSkhKSkhLSklLSk5MTU1MTElMTUxbc2JkcF5sbFVNTmZzXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXHB1Z3BNSnJ5dmtiYGtlZW14bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9CQj89QkVGQkZDRURFRURDSEhHREVLR0dMTU1KTUxGSk5ISUtKSUtKSkpLTU1OTU1NS05NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBcYHNscWpVdXl4cGNea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPT8/RUdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklMS0hJTUlLSkpLT1BOTk1MTk1MXGhkdV1scVdsTk9RbVVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lERUVDQUI8QkBCRkNHRktHRUNDSEtISEZKTExGTktMUlJMR01NSE5KR0hOSEpKSUhOT05OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0FFQ0hJTUlGQ0ZKTElHRkpNS0ZPSktXUktHS0pKTklISkxJS0pJSEpMTU1MSUtLS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBtaFxqXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVEQ0ZCSEpMR0ZDRktMSUVGSk9MSU9JTFtRSkZISEtNSUhKSUtLSUhKR0tLS0tHSEpKTExMS0lLTE5UW1xUUFRNUE9OT09WUU9PUU9PUUpKTlBRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHSkxIREdJUEtMT0tMV01JRUVISUpISUtITEpIRkhISkdHSUVGTEhJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRUpKSkdFSEhQSkxNSk1TSUhFQUhGSklLS0lMSkhGRUpIRUZHRUVKR0NKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY2BZX2JbYF5bVFhYWl9eZGJiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRUZISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVCRkpEQEpLSU9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFeXmNhYGJiYmNjZVpSWVZVXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUxEQ0tKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRERAREFISUE/SElHT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlBQXV9hY2RjY2JcZGNiZGNmWFFVVFNcWFthX15fYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdIR0dKRkZGSUxKTkVDS0pMTkpMSUtKSElHQkhIUU1LS09NS0tJSEdFRD9FQkhIQUFGRkRUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2FiYWBiYmBjYmJkZGJYT1FSUltTXF5dXl5fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSUtOTExJTEtJSUdESEtRT01MUExMS0tISUNFQUVDSEdCQUZFQlZVRVxUXVNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXGBgX2JjYl1iYldfX1RQT1BRWFJdXFxdXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUERXX0lHR0hERk1KUFBGSklKS05MS0tMS0pKR0VKTVFRTk9PTU5MTkhLQURBQ0RGRENBREVBTEhDTExQT09MRk1GR0lKSEdMTE1PUUlMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVteXmFhZWZjaGNrbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5MR0hZTUdISkhHTkxRUUlMSktLTk5VTk9LS0xHR0tQU1NOUE9OT05PSEtFYEVEX0xEZmNETVtIXlxzbU9NVm1ZTENQX1VsV2dKXVhWXkRMUVVMTVRWUVJUWFdUWFVUXFRQZlpoaGRZVGtUV1ZVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVElLR2BUSEpPSklPTVJRS01LTE9SVVJPT0pMTUdITVFbWU9QUE5PUFBKS1B/UUl8WVlyc1hQbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZWl9WVVd/anR1dV9hdl9YYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoOEgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSUxGUlZMS09JS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUEtIWnhdVHhkaFlSVFF2Z3RscGJuZmtRck9Nd21qcnBzcnFycG9wgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3N8fW9+eW9/cl9gYGJhWmFgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUE9NTUpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUVRQUFBRS0dmeGxjeHFtWkpMVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Bnb1h2dmp2dXCAYXNofWlseHxvX19fY2JbXmJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN1em58fXl4cm5OSlJ0TkNCRVBQSUtLSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUElTVFVYV1dQVVBPTlJKTHJvdXVxdXFkaGFWbkxxcF5GaHlXdlRLaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlBKTE1LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VVdsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraGxtcnxrbWhre3RtbWttT0dKS0hKSEhSUUxOUE1MU1NST1NTV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT05MTU9QSkhRTlBVTEtLU1RSUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VTU1dbV1hXWlBTVVdXWFFdWFZdVVNPWFJXV1dYWmBbZ3JeW1xbXV5fY1pfY2NlZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlRSTVFRUExWVVRQVFVYVVlVUlpdVlVUV1VZWFBPTE5XVFFOVVNOUE1MUVBLSlFSS1FNS0tPUVRSUVFTU0lITU5PUVJRUVFUVlJYV1xXU1NQUVVVVlRaUU5TUldVVFlWVFlVU1JVU1RVWFlXXlpfYV1cW1pcXGBjXF1iYmRnZWRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFBKS0tOT0xNVFFPVFFRTVhXVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUE1STktTUE1OVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtTT1NVV1VUWVVWWVRSUldVVVdcWVpgXVZZX11eXVxdYGFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNhUEtNTFBRTE9UUFBTUU9RWllYV1haWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRT1JYVFJRT01PU1VOV1JUVVVPTk5RU1VVVFRSVFhWWl1cWlZWUVJXWFZbXFZQU1ZVVVZYVFdXVFJSWFZVWl9aXmBeVl5dXmBdXGBgX19aYmJkaGhlZGJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlFXU1NTWE1PUFJUWFVVVVNVWVhbXl1cW1ZST1VWVltbV1FTV1VWWFVTWFpUU1FZV1ZcXltfX2BVYVxgYV5gYl9cYF1jYWNnaWRlYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXl9bXl5hYF9iXFlgWlFOT05WUVBVU1BVVFNQV1xcXFheXF9XXF5qcHd5f2NcW1ZWWFJOT1dTTlFRUFJUUkxRVFNZWldVT1JOU1dWVFJUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFZWW1tWUVRWVlhZUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGZeXGRgYWBhY2RfYl9ZWl5bXFtZWFlXV1pbWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dW2BcYFVcXWhqcn1ybGhcVVlXUU9SW1NSUVRSVFVUS1JWVVtZWlNPU1JWVVVTTlZSU1pSVFVUWFxXWFhTWFxYXl1ZW15UVU5WV1deWldRVFVYWFhUVlhbVFNWXVldXWFeY2NeWWBbZWJfZGReXmNjYV1lZmlkZl1eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFpbXlZeWV1QT09SWlBaVVVXVlRUVF5eYF5eYlxgVV1eYmt5dGx9bFpVWlVRUVNcVFRUVVRWWVdMUlpWXVtcUk9VU1hWVVNQV1JTV1NXVVZbXVhbWVVaXldfXllcWlJXUllYWV9aWVNUVlpZWlZXWVxWVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllaV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxYV1dWVlddWFBVXFleXV1UU1hSWFZTUlRYUlNWVFhYWF1eWF1bVV5fWF9fWFxWUllVWVpaYVhcVVdXWlpaWFlZWlhWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWlZUXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2haXFpWWFVXW1pZW1lYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXWlpcX15aX1xWX19aXV5ZXlZTWVhZWl1iWV5WV1pbW1taWllbWVleX2BgZGNkZWViZFpiZmNnZmVeYWNgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWlhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXmBiYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcU1ZYUFZWVlZWVlNVVFhdXF9gYF1gXVdgXlteXFteWFZYWFtbX19bX1hYXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYWBlY11maWRlaF9nXmNiY2FhYF9fW1hZW1laWlhZWFdbXFpbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQWFZXWFhXVldWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgXlxfWVpeXV5eYV1bWllcX2JfYmRkZWZnZ2JaZGZnaWdjX2NeYWZkWmhpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFhXXVxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhY15cXFxYV1tdX11gX11bYGRcXFhaY2VjYVJcWU9YV1lbWllXWlpgXWBiYmBhY19cYl1fXVtfXllZVVhdXV9fXl9bWl5eYGJjXFtXW11gYmJjZWRnZmVnZFxlZmhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddWlpfXVxeXFldW15fYWNiYWFdYltiZGFfY2JiXVxbWldYanFgXGBfXVxhY19eWVljZWRhVF9aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJeXFNcX2BjZGRmZWdmZWZlXmVmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t6enp7e3t8e3t7e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t6ent7fHt7e3t7enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiI2xtbS0tLO1lYeJiYmJhrPW0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyLkbvAv7+/v8GaioyMjIyIv+nl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXl6eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9gIGBgYCAgX58fHx8fXyBhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eHZ2dnp7eHt4d3Z4e3d5enp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t6enp6enl6ent7e3t7e3p6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8e3x6eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x8fX15e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3enx8fHp8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp9fHx9enx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4ent5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFhIKBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYGChIGCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SBgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgYiRgoKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKChIKCg4KCi5iHhYSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChIWEg4F/fnyIm4uDhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCDjYV+fH5/f3+Zj4GCgoGBgoKBgIKCgoKBgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIOWin2Af4KKf42NgYGDgYGBgYKEg4GBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAgpqNgouCgoOAf4SDg4SCg4ODgoCAgIKCgoOCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIKCmIyEhYeHfX9+gIaFhYSFgn99fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISGhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFhIOSiIGBgIR/f359hYeGg4B+f35+f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhIaDgYCEjIJ+fX2BhoF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISDg4KAgYWEg4KAfn6Af39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCDhYOCg4KBgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4OAgYWEhIKCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFg4KEhIOEg4KCgoOBfn19fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4OEg4SRkpGOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoODg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+CgICBg4ODg4OCgn99fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59gIKDg4KDgoOCfX1+foCAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIB/gIJ/gIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAfn5/fn5+fH5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/f35/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39+fn9/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB+fYB/f35+fn9/fn5/fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgIKDgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgIB/gIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFhoaHh4aHh4iGhoeHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhoWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5OPjIuNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYyMjY2OioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNi42OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyLjo2LioaEhYSEg4ODg4KCgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGDgYWGhYWGhoeGgYSRjoyLiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYuJi4mFiJGNi4iJh4WFg4KCg4SEg4KCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLi4mMkI6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjYyKioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBg4F+foCAfX6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18iYqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH2JhYaFhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHV0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIaChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCg4KDgYGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOBf4CDgn9/gH+Bf4B/fHt7enx7fIGAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f31/gHx/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWBhISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIGEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/f39+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fX5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SDgoKEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgYB+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f32Af35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn5+fHt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+gIF/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4GBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4GBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx7e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgYKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhIODhIGBg4CCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5eXx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGAf4KBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIGEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f398fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIB/gYN/fn58fn19f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFgoGEg4B/fX1+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISDhYSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4KDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH98f318gH6AgH5+gICBgH5+f35+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChoaGhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhoWGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn5+fn5+fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWEhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSDhYWDhIeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIOEhIODh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFh4WEg4SDg4SHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYOEg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFgoGCgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWHhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6enx5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIOGgoWBgYB/f4CAfn+Agnx+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH19g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX29vb29vb29vb29vb29vZ19fX19fX19jX1tfX19bT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI+MjIyMjIyMjIyMjIyKoLq4uLi4uLi4uLi4uLe90tLS0tLS0tPT09LT09Pc4uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojg3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxaVVZWVlZWVlZWVlZWUnmno6Ojo6Ojo6Ojo6Ohq9LS0tLS0tLS0tLS0tLR3+rq6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWeX1laWlpaWlpaWlpaWld8qKSkpKSkpKSkpKSko6zS0tLS0tLS0tLS0tLS0d7q6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqo2hkZWVlZWVlZWVkZGRhg6ypqampqampqampqaiw0tLS09LS0tLS0tLS0tHe6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Pz87Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMzMzMy87S0tLS0tLS0tLS0tLS0tTU1NXV1dXV1dbV1tbW2NnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7OztDU0s/Oz9PTz87Q1NLPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fW19fX19fW1tbW1tbV1tbW1tbW1tbW1tbX19bV1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs/KlqXRz8+il8rSxpKr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/PnKqdrNeooKugzpmtmrPSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Qy5SImp3CnJWQobOVhp2dzs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9G9yJmbq52fp5m0wMmXmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0peUoMOioIygxdORmKDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P07ObxJjal8XJlNiso7+d1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NHOjZCgtqCUlaG7zYiVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRy9qonYufr7OdpdDbopm11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyY6lmqOQopqinJyRqJieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo4Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyruhpqedvp6poKKeqaKpnNDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Nzo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTnpCNttmujpGl1JqRjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dK6xNXS1cG91tPTuMjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc2Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS1dTS0tLU1dPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2dna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Nzk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29rb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2trZ2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29vb3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2tra2trb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PTw9PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZiYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/Pz9AOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmZqamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJCRkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKRkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ycnJycnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2cnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnJ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lSWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mpqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqaop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israahop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6qqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoKWorKempaWjo6eklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d3B9eWZbW2BfWlxWXGhkb2NuaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLavs7CrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yjp6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2JsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1try9vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqWnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMHFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOzMzHwcPHx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclYyHkouYmJWanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQkE9QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxsDFx8vI1MvKx8a/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmSiZWRl5WUmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eHp7dm5raWd1WmZyd3N4ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL63vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2RqZWJqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vbq6tL+4tbeyr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrq1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pnZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtoWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL7DwLrEwr7HuLm4rbe1uLq0uLO7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLSysbHysnGz8LBuK61tby+uLqyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYlxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrq6Owub2+s7y+vMW4sri5vcfJysLN2cjLycjMztHMysS1usDDyL++tb/Bv8bGv8vGw7/BvMDDzMrHxcbAub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fY15hYU5ITT9FQD9EQzw7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRDxBQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbG18er1MXEysjMzM3KxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL66wMrCxtPAlMLDv8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysq+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e8trnBurq4uLXEwcTJuYydvLnBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVxfYFlTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4wLa1wLO1srKqrqa3ua+Lj6+2uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6yvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZV1aVUo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw6Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q2ttHAssC3sJ2QjH53io6fjIyltbOyt765s7WyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLnSzLC/rKGAbH1tYGdpeoqOpbezsLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BPklCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq6svLK4ube7v7y+1cWyqYF4fl9sh2pjXmF6kam9trG0trK0r627uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq1ubu1tbO1u7y/ws29oIBkWoRdVoWKjHxhW5Cvxrm0tLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz08PDo6QD08PDtAPkJAQT8+OTU4OzxGQkNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrK6uMjFs4djWWuWXFdkeImLeUqCt8a5sq2zsK+srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lo5ujnJWQjI+PkJOQlpWWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelraqota/Lx6ZzV12Ej1dWYWaypXZQaLe+trOqsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbGjpaieoJyVk5CPkZCYkJaVmJafmJuZm6OZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0VAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQUQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamioK2owsaZYlp/inZlZHp1r6N2Zl93m6+0rq+ztaqnrayjnJmUjpGWl5iZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWm5eXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel5+lnp6lpL3DlVZom5d0i5mJb4x+dX15eqKqs7GwsLitp6GcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSpsa+imZydnqGZm5uamJmblJablpicpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVUxSTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKcopufoaHCyJFRc6W0gISGeGlwcXuDeH+oqbCurqywp6CfoqCXkZSboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rLG0pKCdpZ+soaGioKCamJaWoJubmKShoJ6koZ+empyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ6empqSmZ6coqKfx82PVHaKinNvamBbXVxeZWFujaCqqKqsqqWfn5mSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmqqKeompmemqqnn5mmoJ+fp6ilpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjoMbRk2F8enloYFdMSUtOUE9RXGuDqq+uqaqmoJ6eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO7t7Ops62qs7Svs66qrqOdq6e2sayir6aho6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rxa2t1cnBoV1tRRVRIRElPSD5FQTRFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PDs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJibn6Cbn6DEyIdxeHZnVlJSbldXTk1ER2GNrK6mo6OioJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLAxr66tLq6tLu3sLayqrqyrru3vrq6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Rob3hqZVpbRktMRURTTERCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqGcnqGinpuas51rbHBoVVBcfKaVeVJNZ5SurKCZnJuenpmXl5eSjI6Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPN09DT08zKwsXGx8rIzr/I0czHxcfFwbzDwL6+vrW+s62/v8LCxsTHxK6+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPzxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKWorK2qoJ2jn5ydmayVcm1jV05SaLTT06SNpLOupJ+dn5qYlpSSlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytLX0dfS1NbT08jMx83NydLNztPMxcfJysHGy8bIyMW/w7OzyMTLysrOxcq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoKSsmHpmWFNSWHfT17+yr6ednJ2gpKCdmpSUlZSJfHdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0cnS1dbZ1dfT1tjO0srP0czO0MzSz7/HxsrDzMzLzs/Fxse2v8q/0czLz8XJx7/Dw8jOzM/Qz83Kx824t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkdBRUhJPjtAOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKrtY9nWlRVVmiTua6kmpWYoJyaoKGfm5yZlYl3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czQztPX1tPV0M/S09HJ09HH0NjX2NHY0tfZ1dbMz8/KzdLLzs+/xcLHxc7N0dDRyMvNwMrMxdPOy87IxMnGxsjMytPT0dXP0szTwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNRTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7QwLzMyba+rqaqqKGksbR/VVBTUmWTraafmJaYmpudoJ2ZnJ2TfXFlY2NfX2FfX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxtHUytDU1dbO0tDY2NjXy8jNxMnPzMrLv8m/x8nNzs/L0M3Oy87Ox8vP0MrOysLJxsnMysvR0szT0dHPz8q9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNV0U7QDwzMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PT0/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLGqrK2qpbGpbU1KTliSoJuVlJecnp+fnZSWmJSJa15eXmFkYmBgYGFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1crAysHFzMLIycLMw8XIysrOys3M0M3Ty8XIz8zIx8rExsDFysvNz9HG0M7NzczPxcfAuLm9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeHBxa21nYGBwaFhYaFZMRkxJUFBCO0Q+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3Nj88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1sLWooauqrWFIRFGLm42MmJWQlJKRlpaWkIt8ZWJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS+xsm9wsfJzsTCyMDHzcfDy8rLz8fDxNDIxsHFx8S+wMfLy8vOwsrLyMfM0MTFx7vHw8jIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndudGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCt7y8rqWzp7NkSUuCmI6Nlo+Gg4SEgn6FhX9zYFxeXl5gXmBjZGNfXV1eX2BgX1taXGBrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMvNycTCy8nBwsvQxMvIv7nBu8XHvb/Gz8vDv8O7ycbIu8jGxMq/vcLLxsXEvsW8vL/DxMvFxLzAycLFx9LEwMi/ysnGx8bQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWao6CblHt2c3RmaVphbmxaW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzLz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXEv7Oxt6u5dVd5loyTl4Z6gIWGgHZ4dXJwX1pbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wcHBxb+9ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw768wc3Dxr29tcG9w7q8xrvCubO8xcTCwra/tbW9v7rLw7y1usi6v73Lw8HFwsXIxsjG0MbCzMeyx8nDzs3BxcPAvbK3sLKnqKi5sKWtsKutrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsPEyM7RysrKx83NztHI0MbV1NbXzcrPxcnFx8G6x76trrKusIZ4kY2Ki4V4gIaGgH6EfHR0Y1tcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i1t7Szs7S6tb6yt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wMK8uL3GwcO7ta6ytrq+tMS3u7WruL29v72wuravtrqyxby2rru/tLa0xb2+wsXAw8XGyMvFwMbGu8fLv8/Kx8PGwsO2w729trm+x7+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMXIzczQzM3IysjKycrEz83Sz83Fx8HFwcC7ucu4rbCxr5d/j5CGiYp7eH6Ghnd4gn10aV5dXV1fYF9gZGFeZGVjX19cW15cXV5aW1tdX2xwbWhmam1ucnykx7+4uLWwq6ynnqKqp56rrbOtqauptK22sbKprqassry6tsO5urqxq7W5u7TCurC/sb28u7a8x7nCtq2qqLCxv7W3vK+wp7KztLu8q621pa62rrqxsKq4sK27rru4u8C/vbnCv8fDxcG8xsHHy7jFx8W/xsPDucTGwrvGyczLs7nCvLqyiHJ2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fNwcPGv8XFw8PKwsnKv8C9wru0trbFsauwrqp8dpOIj5B8eH6KhXp7hIF3b15dXF1dX2BeX2RjYmNjYmBfXVtbWlpdWlpaWlxlbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwo6afqq20trG9ua+3r6iut7S0vLizvK+4ubSxvMGxwK6lqKKrsbKzp7yqq6irrK20s6WoraGkr6mypaeoraWot6ywsre6uruxu72+vsS/tcLAx8i3v8DEt8TCv7u/xMK+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvBy767yre+xL+7yrjBxMK2uL63srC2vrCqqqqdboODiIuAe36Afnh0f3xzd2ZfXVxdXl9gXl9jY2FiYGBfXl1cWlhaW1tZWFpcX2ZrZmVnZWlrb3KFqqWspqCcoaWUnaSbmJKho6qjop+lpaimrqCdm6Slq7KvtrensKynqrSqtLqxtrWutrmxr7q5sbekn6OfprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6SgoLGtrayytLK0sLW8trvBwbK6vsPBsrm5wrPAvb+1uLu9vrzCx8TCw7+/xKCDd3BrYWZfa29gVFleSE5nT1RIRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc3ODY2Njs6Ojs5Ozs8ODU5PDo+PkA7jci1tb24usC6vbWgnpWdoaa6tquzs7uzxM/Jy8LGuLfHwcy/uMq4vMa5tMW4tMDCrri+tK6nsbexo6Omj3SGhoaBfHl1dG9ta2pqcWleYF1cXFxeYF9hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlZqhlpuimJaNnqGippufn6Oloqiem6KbnqqwrbG1oqmqqaurpLS5rbewrLO1rrK1rrCqn52eo6KypKapuK2ipqafqKyqmZ+gnpmdn6WamqOcm52vqaunqqusrbCyuK+4ubuwtru7uquzs7mzvbS2sbG1tL+2vcC9w8G6u72Xg3pya19lXmRkWFRXXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7xMPPvrnIubm/uLPCtbK9va68vLSkoauuq5mgn4p/hoZ/eHJucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGVlZmZoaWtyjaidlJSUm5iboZaWkZyhoqidm52lpqKmnKCgmpitrq2usqCloq2rpqG0sLGxrKivsqe6s6a2oaKem6OhraOhqbWqoqOmnaWmo5aYnpeZmp2gmpednJybrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7Kys7ezrqmsrrK4sLq2ub2/t7KxlIV5dWVeZV5bWVZTWlVLXFFMSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzMjGwMW3wsDHzrfAxL60urqzwLezuryvtbexoZ2nraOXnZiLf4SEf3hvcXRxaWZkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn56pnJqaq6evsKubo6O3qqCfrqi2qaanrbCkt7Ckt5+im5iYqqahmqy4sKKhpJyioKCTlaGUlZabmJeWl5yVn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysbCvrq+mp6eyrrG0r7y0ureuo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ejqrvAvcC5rrS4wczHxcLDvca4yMyywcPCrr28try9trq7s7O0rJ6cpKyXlI2RhYB9d3FpbHJ0cGloZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltjY2NiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSmp5+cn6agqq+mn6KjtqigoaKotKGlqKWwpbCtrLWeoJ2VlKmhopStsbGfoqOdnZibk4uhlJGTmJiSl5eYl52mm6ehopmjpaWrpKWwp6Wjq6utpqiur66rqKqps6WmrK+0sa68tbGvr6CSenZyZGFcWl1YTkxSSFJhTVdQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWnrbe7vMHFurG5tcTJycDDxsbItsbEs8LAxqy4uL63vry9uLawsKucm6Omj412i4d/dW5jYmZpaGZoamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVSVVJVYGBfYGFfYGFjZGmBk5OIkI6UkpOclJWWo5mglpygpaGtpqSkoqOinKqrpZmepbGpoKCdpauep6Gera2pqa6toaGilJejm5yQq6mwm5+in56XmZOKnpGNkpOWkJiYk5yhop2koKGVoKGkppujq6WipKqkq66lrbKppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZWUkdQT0haXE9SSVRLU0xFRklDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY6ODY5ODk4OTs5QDl7tbSttLuyr6uxrZ2op6+5ubPAyLq1wK/Gyc27wcrMyLXKvbG+xMqusrnDt73Cvre3rrCpmZ6gn4qFdYiDe3RpaWlsZ2psbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl5fX2JkbY6PhJGHkJGOmZOUkpyaopyboKeoqqiqpqilo5ikrqSUmaWvqZ+bmZugnq6Zm6qzn6Wmn6KjoZSTm5aWkqmprZqcn6GgmpSQjJmOi5CMko2WlZCeoaCjnJuilZugoqCYoqijoqiroKuvpK63paOkoqytqqirr7K3sr21s6uvmIRzc2hbWFhTVVFFWExRW1lNVU5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmnr62bqaist7asu8q7tr+szMfGucHOz8i0xby3u8TJsq65wbi+wL22uaqupJqcnpqJf3d/dndubWhtbm1waGdpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4yQipKNl5GXmaKgm5+qqaauqqevo6eZn6yglZakqKedl5CPmp6ulpenqpmfnZSloZ6SkJOSk5WnqqWamZmdnZaNjIyUhoiNg5CLkpWRoJ6go5eVn5WaoKKdk5ulpaeoqKCxsKaxvKego6y0q66nsLWwubXAsa2xq5F9cXJiVlNWTlJJRlZQUlJMTFhNSkxOUkdNSkFDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurvCy9DLsbi4vL7BxLKxs7mutra9trmnqKGinp6YhYZ5amdsbnFucWpwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipeJlJSXm5mdqJqfqaWkqp2nmKClm5KPnqKal5aFhJKao4+TopyWlpaIopqak4uOi5CapKeclZWXm5CSh5SOjIGLjX+QipKSkqGan6KVlJiYlaKlmYyZpKaopqGftLKosrehnaK3rKqtpLKypbW7taursaOJeHJtXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6OppaCppaSzqqKyw7W1srPGxre6w8rMxrOtu761uMGwrqqyn6iwvbKypJ+gpZ2bi3+KcF5fZnJwdnFpbmllaGhqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRhI6KlJGTnaCPmpuioaOYpJahm5WNh5iajHONgn2Nl5aFkJmQlI6Oe5mOnIyCioCJmJ+inpCTmJaEjoKTfn50iY55kIeTkJCdmpmakJWQnY6io46JmqCho6OborSvrK+sn5mluKamsaGxrpywu6qpr6qZgnZyYlVNUk9QTUNTTkxRTUJQUUhJTlNNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTExNzY0Nzg5Ojo2NTo4N0E3eLeio7Sopaaoo6alpqams6eltMG4r7SwycS3ucHOxb6zrbvCrK7ErqmjqJOfqLmwqKWVnJ6bloJ9hGdXVl9nZmlnaG5jamlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXi5OQn5edlZSWlI6WiX+TiV87V297i5SJgIuSjJCGhnOKhJaBeYJ6hZSdlIOWjpCPg4Z9knhyb4WNfYmBkY2Pl5mYk4qPiZyHnpeHiJaemqGgl6evqa2oqJ6XrbOipq6ZrKuYp7Siqa2jk35ybV9bTlNSVkxEVEpQTUxGTk9JRkxRTUtPSklNUEZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaeiqbCop7TBubC1sMfCt7O9z7+5r6+2w6irxqqknpqElZ20pp+ejJqXlI2BeHteUExSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkF/lZGRfYmUjISKjZqNlZWKkoiFlYZ4iH9gSlFueIqRhH2EjYmFf39ufn+Ud3V1d4SNmXBRjYiKh3x+eJN2aHeGiH6KiJWKjZCRlouEioiUhJqMgYSSmpaenJSko6ippaSem7CqoaSkkaaqlqGpnKKmqIl1bGVeW0hRUVJNSVVNU0lMS09JSEdLTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivraq2vLa4t7PCu7aousi4tqiotbaqs76on5aPgIuVq5makIOUioqDfXZ0Wk1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYySgZKZi497ho+AdX94c251cHSNjYF5fYqqhXl6aHZ7jnBybXiBi4ySeHqAe4B2cnKSd2h1hISEhHuViYiKjIqAf4SLjH+Ug3uAj5iVnJWRn52pnp+gnaCppZ+dmI2npJOgn5aenqSAcmdgXFxKVk9RR0pYUk9KTU1SSkpKTVBITFFMUlRMRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Yo6GYnJ+0qa+ppa2ssLGqvbSyu7i2u7WyoLe6sqqdnaypqLOwopuSj5WBj56RloR7jX+CfHZ1blpLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g315Z3eNl5iOj31neYF2eICJj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfImMh4BseXF9cG11j3FpcYB+jnBDi4SCg4V/d3d6i4V9i3p1fo6Sj5iKkpqbo5aZnZqdnqKdlo2KpZuPnpeOlpiPdm5sZWJaV1dUUUpTVVRPUE5QVktOS05PSlFOSE5PS0VDPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CflqCmr6yuq6ipsK+xq7y4rLu+ubOtqJuwp6ybj5acpamloZiakIaTeoqRjo96dYJyenZwcW9aS0ZHRUFAQ0RJTExNUVJQUVNVVFRVVldXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4bnx5iJB5fIuFb22MkXhzeGpqgIJylpGLgX2WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ6fX57dm90c4WCeYF3cHyOjIqUg5aXmJqQk5WWmZeel4yDiZ+Ri5KNhpCWfm1obW5uV1VXVFJRWU9SVFRTWFVNTkhOSk1OS0NITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw0NTY3NDg1SEE4OTV3mZGbmZqepa2woqyqqLWvrqy0v6u8wr+mopqVpJedjYSLlKGhmZmRlIt0jnqBh46KeHN5b3Vwam5uW05FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouJdoGIhnRsmpF0c3tqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcYB8Z3Fxe26TjY97c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJSPl46AeYiXiIaKhoCQh3Zqam5nZFdRWldZWVtNUFVWWVhOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6a6rquysMKxu8PHm5aPlZmLjYV5hJCYlI2QjI+GcYeCdIiOiXxzdXJxcWhyamFURklDPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6BxfHhtfWxyg4GFgXqEhoZ5cqCVdHiAc3WUhzVxnaidjqGhhKKFdnCGfId8c4ytjYmAaGZiaW5ybXCDdWlvWHVwjpqSd2x/e31tcW1wgHpzdm1idoR/hoCFkJGKi4qSi5GMi4+DdXiLj4B+g4B+j3pxcG9rXlpcXVtZWGBeUk5bWlhXTEhKRUpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKHlpGepKeer5Wltamtsa7BsrvBxpeQjJSQgIh9boGQkomDioePhXWChGyWiYp9d3l5bnhweGZqXklQRz5ANzQ0ODs7PD0+QEJFSUxMTE1OUFFTVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH2Fg3+MfnaimXl+hoGFmYSbnGGGqp+dioKQjnp3iH6JiI5zipePg3tcZHF0ent3imxnamJ5b4WPgnpugXd0hHpwdHl3a25pXXeHfYd8iIePgIuTl4ONhY2GfXGEf4R8dXd7fYl1b3JzZWZfW1pdU1tmXldRVVhbVUdKSkRLRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjXiKf5SMkp2dn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYWMfn6Cf3CAfnppd2tSV0xARTIxMTI2NzY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp8iYZ+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc2x8gYaHfY5oZ2h4fm6FhoKFcYSFR2uAd3J5dmhta192fYOIf4iFjHqVnpyKi4iRf3t1i3Z8d21vd35/cnJxa1pcXFtjY1hmZVtVT1BWWVBETEtGTklDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aXkpehnayhprivs72zl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NWS0I2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj85NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYmRgZqVgqGhl5WbmqWtk5q7sae7x8Ooi4yhpY+UiYGRe3KEnp+RnH92hYWKj4eQaWhvg4B0jIaEi3GGgneHgHt2hX1udnVngJSPhomIh4iHoauilomOmH97gol6em9na3h+eH1xamNdWlpdaVxhZl9ZT0tOV1JRSVBLRE5HQ0tEQ0FEQ0E8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O251cGd4g3uAjICBkI+LmpqknKGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYuLgomNg3+Kf2xwal1DQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6KflJmShIqFj5iRlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhloaTio+PlqW1qZuNlaKDh5OEfn9ramt8gH+AcmBcYl5ZZmpca2teV0tHT1NRTk1MRklQRERORkJDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmhZcINwdYdxdpKGfpeWmpSfn5ynoKqWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioWYkpGCgICLjYmFkIeEiIV4eH9nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWcn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJSShpyhmpqZp5GRiJWimpp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNzfH56b2dfW19eYWZjYGdnXFFFSktQT0lKTEZGTUNITEZGQ0JHREA6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHF1YG59YneOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNio6Me4qGj5COgYOAiYuKhJKFg4aIgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrS9uKWurKynqLSssbeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2rpIuWmIWmpqCil4GmmY2iqqikh4WTo6CgqqCkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlq4maipOKlXp7foR9Zl9nW2RhXWNjXmZmXltPQ0lIVE9GSExGS0hFRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1hqcFh6hXaBlIWIgpuDkpCNktrInZZzVpeIj4icj3yGjI6KiXqIgoeRjoOFgIuFhoeShoKEiYaHh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSVFVVV1VNW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Ors8W2rLPAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbGxnJqSmp+Jp6+qpJV2n6SXoauxs5iWqa2orrW7srqsr7Wisayxtby3ta61oKeno6ibqbCtsrq4uKect6mNpY+Sk6CGeYKCdFhgY1VlYWBiX2BlX1pVSkRFTFVRSUpKREpIRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoZ+gI17v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhYGOf4GJjoZ/hYiFioeRenluXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxXT19VSUtKQUA/R0tGRUQ7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczJtrvEvbO0wbe4wrW/sLd0sbSmusWksMa5sbOxtKiktbaqsaCilpuikqWxraWtrKekmKCssrqiqLK5tbu+zL/Fxb29s8K3uri/t7q3ua2tsaaxqq2+sL27wsKsmbuola2PmJiqiX6CemlXYWBXaWRoZFZaY1lWVElHR0xRR0RJSkFIRD4/QkJLQEBMQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFpWWndqcH+PhIGOhW56c3iIYrihmqOJlZSWk5STjZCXkoeHe4aBjZWKgISBinp8i4eGfYqCgYuElX14eXVlT1xkR0VMOlFkYVteU0Y+O0hQRFpkUVFZWFpnWlRgYU1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tNU1pUXpSvuLW6ucnAu73JzLu9wLu3tby7t761urLGYHWypbGanqu+qqWoq6qjorK1oaunnpWWnpifrqWnpqWfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrDwL69v7u8t7Swube3w7rGvsPJsJ66qqKsj6WotomBfnFeYWBcVmFeZ2VSWGFWUlVJRUVOS0A+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5MzczNTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbWxxkI2FkHNtc3JziNXAtZmgjZWZmpGOl5GWlo6Gh32Gg4yWi3+Df4N4e4uEh3uLeYGKgpd/dH16a2VwdlldXFBlZWJgZWRdW1hXXE1kbVVSbW5fb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZdWlyTucC5vbfGwLu5ysu7t7q2uLmzuLW1rra2mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUj5aYl6ifpZ+empmDpJ2spKqwrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/Jz7Sku7G1sJusub2afnhqXF9bWF1gWWJiUVtgU1FLQ0JFRkU8QEU+QkhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop+iIeMkIyJfIGDc3uKg4V8inSCioaVf3N7eGxtdXxpc2VpbGlmamppYGZpaG1abXSXraS8h4dnW29oXVpZVEhKTlBKS1FMVFFITEFKR0tQX19iZ2pil7fHsLmzu762ssTHtrC5sbC7rLOxp6u3rI22p56cp5pOm56NjqCWkaaYpZWKk5OIkYmPkJKem6GYm5WWh56Zppqsr6ivp7Oz09TU1tHLz9PVztPPzMbDytC/ysnLydLIzc3D0dK4sMS9xLqmt7vEooBtYltbXFdfV1llWVBcV05RQ0JIRUJIO0FEPkFIPz9CNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDk9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkJmDaHFveXmDoKqeppeNm5uYi42VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj31xeHVscHh/cntueHNsaYBwbWNpbXB5aXd9fsu/wt+nbWN4b2RbYWBKUFJVTlleUF1dTlBOVFFVVFxubneDcpauuKy0qLC2q629wLGrtaaluKesrqCstKSPsa6bmJiMkZSRhI+bgY2mkZyJg4uEiomEioOUlZiXlJuRm5eZmZ6eq6ykp6GsrM7S1dHNzNLT1NDU0c7Iw9TRyM7S09PWzdLRxdLWxsDOyMjDqb+40J14bGRcYVxVXlFdWk5PU1BOSD5BRkJCRTxAQj9FRT4/Pzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd213cH1+gKGenqGLjZmTk4yMk5CWhXmGkJCNi4qIkYd/gntyfoCCh3qFdoWTkYl/b3ZzbHN8fHd8c4J4cWuAcnJpb3F6eXJ7vsuafoyxg3ZyhXdoYWpdQ1paW1dmZFhla1RYXVxgY11jeHt/i4GZqqSkoqChqaaqsbmrprSjoq2io62hp7GfiaablZORipKOiIKUiWuVoo2ZhIGGfpGDg5OWrIuVjZWZjoWSkJ2Xp7CioKCkpKjHzc/HwcvQ09HU0s7TzcbW083U2NbW2NXX1cnU2s3J19bRyq3Ew8yKcW1iX15XUlhSW09KR0lJSkA7OjtFQkQ8QkQ+SEI/QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCiYGdlZ6UhYuWiY6KiI6Ij4B4g5SZi42IiIuJfoN4c3t9hId3gHuHkZeBg253cG11f3Z4fXSGfHlsh3Z1b312hHV5e521jDxBisalfo18amVXSUNlY2ZjaGpkb3lbX2Zoa25pboCEiJGMnp+gnpGXmJ+jo6aypKWzoKKlnqGon6KxnIefkpKTkYuOi4aDj4R+nJuMjYKEhXqUfoKqlaOMkoqYkot9l4qakauzl5qbp5ynvcPFubbFzdLQ0c/L0svJ1M/R1drX19jU2djN2NvOydra0ta/zM21dnVtY1xYUVVQWVVFRkpJRUU9Ojc6QEFDOkdFQEVDQURBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXFzho18l5Gdi36HkoKJhoWKgoh9eYWXl4iPg4eGh3qEeXF6e4SGdnqGjo2deoxwfG9wen9ye4BxhIeAbo56dXd9fIJ1f3yHibB0WanCtoySgXBuYz1eaHJwcXBueHeCZWlvcnV4cnuLh46TkpuWoJaIjJOboJufqp+hrZyimpmfpZ6frJmMmoyRko6FfYiHg4WLjqCZk4iDh35tmXmEmYaIk4yNlYyGe5uIk4+uq5SVl56Ypq61vKitvcbLyMnLy8/Jw9HK1NbY19jX1dvX09rb1tDb2tHWydXMlHd5Z2daWU9SU11IQkVJST5BPj03Oj0/Oz5IPUBCQUFEQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChH6EfH2EmI6HjH6Gh4B3gnlue3uHgnR6kp6NoXaPdYJ0dYF9dICEb4KQgm+ShHR8gYV6dod8ibjGpcPJt4GVm494cGVOZWOCeoF3hqKQi3l5d3uEf3yEdm2UlpSVj5iRg4mPlpqXl6acmKCXn5OSl6OdmauWkZGLjZKDjIWJiIGGkJGenJmJhYuBhZd7iImfl5CJjYqLgnyhiJCLvKGYk5eZnKimpa6ep7W+wMC5x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bx4V5d2VoY19TVlZVTUtETkQ7PT08OTo8Pjk+QTY+P0A9QD48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKfH6Af398hXt+gpGKhYZ6hYh7dX11bX19hn50f5KekZ+DknyGfXiPfnmLim+Dm4B0mYZ9gYmFfH6Re5CpjpDDoLyMnKOcfYmEfYlyjIt/c6aanJmUhXuPkYmEaUdxoaSdjIuQkoWIi5GTlY+dmpOVkZeNjJWfnZShlJKOjpCLfpCPjouEiJKWmp+fiYyUkZ2Qgox/ppmIhY6ChoSApIaKi7iYnZGUlqGnoJ2enaOutrq1q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27d3d3ZpaWRWXlpTT05IRExCPT0+OTk7Ojk5PD02QD4+PT05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXN4int7f31/e4h7fXuLh4N+dYSGeXN6dG2BfoR9d4aboZuelJKAi4d/mIeAnJJuiKmFeqCLfJCOg4iEnH6akYmNo6KfkKOun4uRi4WLgZKGV3Kti5+snI+EmJyQkI5cg6KRgo2fk5WMh4iMkpOMlJWUkIyPioiWm52PlZaRi5OUhoCLiZKNioqdlpmjooaTnZWgioqIjpyQg4iPgIOHhaSFi5CzmJySlJehoZ6Zkpudp7G4rKW8wcfNx8bPzM/Mz9fP0dSu1tXY2tna2tfW2dmebntzZmVbXFdSVVdDQElEPz8+OjQ5Ojs3Ojs6Mzs8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhsYn6Sg29td4t4en97gX2GfHt2hoWAc3CFgnt2d3Z0hIOFfX+SpqKfpqKWiZ2QlJeKiqeXcoqyjYSnkoSZk4SajKOWoJiTiZudoZKor5+RlJCOjoiVi26Nt4SaxMiynaKlm52YlpGykGSkzciVjoaHiZCSjY2TlIqFioqGlpqbj5CUk4eVmISAj4uZiI6QqpeXpKOImZ6WmomPhpeXi4WPjIF/ho+liI2TqJmXk5aYoZifmZOdm6KytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgXF9Z2JdXVxOSVRZQUJHRDtBPTgzNzs8Ojg9NjQ5Ojw6NzI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnaBj318bX6IeHp+e4KCg392doCDfG1ui396fHh4fISHin6Lo7Ono6qzoZann6WklpWuooORuJWRs5qMoaGMpJuwo6SdmJGnlqeZrK+kl5SWlZCLmJmXocCOo8m5q5yjpq2Zkpudsp2FhaiinJiFiYmOlYyLk4+IgYaHiZOYlYyLlJOGlZiGhJGQnHWRmLKWl6ShiJ2ak5CKkIqXm4mKlo6GfYyYnomQkJyamZOYl5+UoJ2Vnpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0dbY09DYunF4dFtfVF9VT0hKTkRCQ0U1Pjo3Nzo/PDw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6em6Fhnp8hHmBhoF+cHh8fn1vco16fYF8eIaLiYaEkqe7rKiyva+krbOzqKOhsKyKmrWdorilla2kl6mtuKeko5+aqZepo6+wqZmYnJSVkZegmJq7u67KoWq2uKuwlJmfo6yTl72jXqqyg4qKjZSHkXyOjn2Dho6PlJWIiJOWjJCWjYuMl5iTnZm0l5arnYuclJKOkZKMmJuKkZ6Qi4mVn6GNlI2YmZySm5ielKGglJycpa+ooaSzuKvCyMS1ur27xcfHwtGgxsnNzcXX1tHL1KFveWdbWVNdUE9FQz48Q0FCOD84NzU/Rz08NjwzNTM0NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKQIuKf4Fzhod9goh1g4qCf218fX1/cHeHd46Ch3uNj4yGjJmqwsCvvca7s7TAvLStq7O2jKiyra29q5u7pKitubirpqaioqSiqa+ysaqdnKSYm5iXnqKmpZKkuq+pwLytrbK5pqSofoiGnK28sIOMjIuQg4+DkY56gYeQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaXjpGgkYmUm6OslJaPlJydk6Cdm5igoZSanqempKKjsLOnwcbDr7C6tsXEwr/NpsfEx8O81dHNxcqHcnFgWlheWkxKQktARkc+QT9COzo0PkE9PTU8Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0Q/Q0ZcZUdgaWdaXVyTjIyIe4eMh4OMdYaRioFvfnuBf3F+gXuVepKUlJiQk5Wns8bJv8LMwsO5x7y7r6u5u5eyt7qywK6lwKSrr7u8qq2ro6Oep6uutLCpm6Cqm6Gblp+wtaeLo7q7tsG8rKicsqWkqJSFjqnEw6SCi4+HiISGlZSNeoSNkY+RooyMlJGOiZefmJOZlZimoK6djKqcjpaPkpGVlY2QlZGPoZSGl5+gsp6UmpSfoZikn5qgm6CUmJ6lo6ampK+upb/Ew66ot7bJw762z7LEv8S8s9HJyMK1c3drW1ZaaFFMSENMS0tKQUE9Q0Q8NUFEOzszPThCMzMyMjYzQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVlOZVxmVGNqmY2XioyIk5CGiXmGlJCBcoB8jX94h4KCkHqOoZaompqYur7HyMnB0snKws29wrOtu76nur+9u8O3rMGprLO7vqqwqqSlpKyus622taCfrp+lopijs72pm6i9waS3t7Crk7Gsq6yXh5qpp6WRgoyTpZWJgXaKkXqFjZKQnp+Tj5SLj42Uo5mWnJSUo56qn5GlmoyPj4+Vloh8j5WSkqOalaCinLWlkJ6XpKOipZ6dppielpebpKOpp6KyrKi8wMSvpbK3zMC5r8Szu77CuK3Cw8LAmGt4YFdWWlpKS01KRkRESEJCQURMOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iaCThHiFf5V/f5CIipCAlqGZrqakmMK9x8PHxdPNzs3LvMK3sLm8tLzLvMPBtra7rbO/ubyur6igqai2ra6psreanqyip6Geq7e4qqWwv8Wxvbmzp6q1s62ul5alrKigkY6SssWnlY59kpV9iJKZkKqZmJOTj5KVk6Wekp2ZlKGjopyYn5iLjI+PnohakJaXkpakmWWYo56zpZahlqysqqebnqaXmJaYlaCkqKWftqupubvDtKWztcvAuKq2rLK6uK6ouLq9uIJqbVlWU1RNRUpSTks/QUhFREhHRzk1Rk07Pjg9QEouMzIwMjVCNTVQV048TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJwRWlJUmViTEallJyXopeplo2Rg4emk4iCh4Kcg4OVkJCUj5qin6++r6HGvMXExsbOzs7Syr67trG6u7y/z7XDvbi4t7KxtbO4s6umnKusuaqpp6+vl6OupKekpbXAsKustL/DusC6s6e5tbizr5alra6upIuTlaGNdMGafZeZhI+WmoyxlZualZKTmZmlo5Sgm5eaqZycoaCZio2QlpxgSpacmpWapZZUlrCfr5yepJSvrqulmqCllJOZmI6coKeimbSpqrO8u7uqsLLHv7mmrKutsbGjobGytKRvbGRbWU5PS0VPUFFRO0dKSEdJQ0M+OktVP0E6PUVNMDc1NDQ6QjM0TldPPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLp5aOiJOFn4eEnZeOnaGbo6S1yLWpxrrCw8fKyMjMzca+u7OuubjBwc21x7rBuLW6sK6vs7SmpJuqtLWqqaatrJqkraWkqKy6v6irtre+wr++ubOyxLK5vayjrrWsuaaIm5emm3a/n4SZnY6TmZqLrpehnJuWlZufoamep5+ZmqqZoaeemJCNkZ2DbnaSopqVnaKekK6yoqqUqKqXqq2jo5+lqJKSmZyIlJyinZaxp6mrura9s7Ktvrm3oKOnqKWnnJusqamMYWRgXlFKTEZITUlWTD1NRE5KS0JDRDxRVj1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh/ZV5IRauVnKGfu6+ZlJ+Lk6ubkZKTiauNh6KfjKStlKOjtsa+tMC6wsLHyMXCzcjBvbmyr7i0wMLKtcWywby0uqqora2wo6OYqrS7pqmmq6qdqa6no6qrvryorby0uL7HvLe2uMGxvsG0qbW3q76lj6KYkqKgvJ+JmqCZl56ej7efqZylopucoZqopbOhm52mnKiqnpmVj5Sbi5eJjKSilJ2inqC1r6Wkkq+rmauqnZ2ko6iRlZWfg4+enpuVqaShobS0urWtqLWys56coqWal5WYqqGedl9bX11KSEVGTVFITUVGR0JSTElCRUdBVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWdcRkNDnHBiR0Wnl6SfnsOtm5elmJmpnJabm4+qlpWnppWtrJmiq7bEwry+t8HCwMfEvs3Gu725srC4s7/CyLW/sLy2uLampKusraGhmqqqxaKkqaumnqyvq6KpqL+3pq2+sbi2x7a1ubjAs7/Ct7WztK++o5ejlpSclK6gkKGjpaOjn5C9pKmeqKudnaCbpp+9opmjn6Kpq6Gdlo2VnpOeh4+EjZOfpKCetaylm5Wxp5mupp6ZqZ2fjZiUnoSNoJqbk6WkmpirsbWxq6WqraycmKCgko6QlaielGdiWGBdTkhHSk5LSEVESUE+UEhAPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTQ2QDk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTpuUkY8S3hlYlZMopqjnJ7FrKGfrJ6drqCSo5+WpZ+mqqyXtrGjqrO2xMS9v7W/wrvIwr7KyLa4tbSws7O3wcW2vrG4tbi1n6asqqydnZ6lpMGkn6qtoKSpra+ipqi9taWxvLm2tsSytLi6v7PEwbi4rrO1taOdpZWSlKGuoJminqioq6Oawq2pnqytm5uemaahvqGdpJirq6ymopmNmp+Sn4mOV3+Wn6ahoLiqppOYtaOfsaCfmq6Wno6Yk52Bjp+XlY6io5aQpq6yq6mhoqWllZWdmIuPkZKknolgY1ljYEtISkpORUVBRko+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTp6foZmew6ilorSinLKok6uloKOframsnbuwqKy2scjFwcKywsO9xsO8xMq8r7C2rbC0r7/EtLmxsLm0rJmosKmqmp2loajBrJussJyqo66xqaSovbamt7u+r7fErbSzw8Czx7S7t6y0tq2qoqaWlZWkrKKfn5qoq7Cvr7uypqCpqJqZmJOipLmgoaSTr6+spaefkqGelZ6PkI2Vnpqinqe0pqaMmLObo66anZutkJ6TlZOZf5Ghlo+Nn6GTi6assKWmoZygnpKSmpOFi5GNnJ5/YGVaZ2VKSUxKUkJDQElHOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo5+coMOppKqyoaO0qpazrKeipLKsrqm7sa2wtbTGwMTDtcDEvcnEtcDIwbSrtaivuKy/w7O3rqy2uaWZq7Krqpifppetu7Sbp7CbraCutLKnq7myp7qzuLK5wKq3ssS+tcaov6+tt7Wpp6yhl5eSpqWiopiYpa+4rrK1tqCfqKSalZWTpKC3oqSllq+xsqeqpqKfm5qblpeon6CYoZ6vsqKmjJeumKSql5mepJCajZOXmYWVnpSMj5ydk4upqaqhp6CZnpWMjpmPgYWViJSfeGJoXGpqTVBNTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7o6Odoaa/p6ivr6GptaudurGro6q0trGwubewt7i4xL3Dx728xMHGwLjAxsC5qbakrLuswMK3t6qssbqila2xrbKWpaeRqrmpn6awnaugsLSzqqq2tq27rLOzubesuLDDu76/psOrsLeuqaurpp6YmauioqGRl6Gxr7OssLmanKmgmZaSl6aht6mlo6KwsbSrs6isn5ugoJudpZ2il52js7Can4+TpZqfqJqUop2Ul4mTlpKVlpyTiJCamZSOqKimn6Obl5uTho6Yi32MloWOmmpobGBsbldQUVpUQUNFVEA7O0hBNzpYUGReUFZXRVlfXU1MUk5eS0o+WmNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaefnaKpvaKrsKujsbiqpba0rKCttb2us7i7ur22tsDCv8jEucTCwMC4xL3Bt6+1p6u3sbu+v7SprrG2nperrqiul6aojqe7n6Sss56sorGws6yqtrS1va6wsbWssLWywbvFt6u9r7G4rK2qo7GmnqWpn6SYkJmfs6qzq6qzmp2nm5qVjqCmpbSup6Gtra6xp7StsqqknJ+oo56VopmbqLWpl5mRkp6ZnZ+dkKqdlpeElJaKnZmck4qNlpeal6aloqCdlpWXk3+PlIV7jpKDi5ZlbHJnb3FeRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqGkrLakraqmr663qq+1uqensbfFt7G3vcHCtbS6xb7MxbnCwLq+ucS3wLmytKupura7ub60qa2wtZiYp6yqrJurq4+rvZ2rrrKjq5+wrbSurbayubiqrq+yqLWvtLy9yrOqtrWxtLCvp6GzoJuoraCmlpaamrKjraClr5ehpJqako6jpaezqaGms6yptaWvsbWvpJmdraeamJ+amau3opeTkY6XnKGXlpSrnpqSf5KXjJ2cmZaQiZSSnpmloqGgmJaRk5V6io+Fe4yKg4uSam14bXV7YUVgallJSFlaPXtKRkQ2QWJUaVtNXGFKW11aUlJSYmFMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVUtEmZehsaixqq2mpK+utqm3tLmkrLS3ybu0urq/v7Szt8PAzMi8w7y3vb+/t7+8sb2tp7q5t7bCtqqssbeUl6auq6ijsKqUr7qjrLGzp6ijsrSxsbC1sbi0qq6rsqe3r7a0xMa2qba2rLCtqaejtqCgp7GhpJScmZWxnqecoKqOqKOenJaYpqaluKeisrWsp7GnrrC2rKSZoKyom5yenJSpuJyUjo6KmJuil4+YpZ+dlIKRlY+cm5eWlYiWj5eap5yjoJKWkJCVdoSQh3uFgYSMi21wd3R7flxLZWxcS05jXD5ie0dJOEdnV2ZcTF5iTVhZV1RXVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi09RUxRPDNya0lDQ5CZpa6lra6rp6Wxs7Sqt7G3oKu1ucm5rsC7wrizsbXCws7FwMG9tL2/v7q+vLLEp6m5sLa2v7yuq7OynKCnsa2mpa+lnrK1q6qxsq2qqbS7rbSytay0raqsqK2pua2yscjAuKW6sKmtraWorrCmpaOvpKmcnpybr5mjo6Kjkayeo6CgoqqmprmlrLW2paqrqK2vtq6jnaOpqpugmpqSpLOZjomNh5ChoJSMlJyfk5GEjZKSnZqYlZOHl5KVmaebn56MkpGOkHZ9joV8fHyHiYhwc3F9fH1cU2RuXk5ZZlxGRJZbRztObVhiW0xgYk5WV1ZXVFlnXVFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorO0g/M0JIUyw+kGs7R0iPnKqroqmxpKmls7SxtLWysqGsrr3Muq7AusextK20wsLRxca+wLK9wMK8v7e7xKest6yzuLvAr6uxraCjp62qqKSwpKuyqq+ssK+wrquzvKe2sbKpsqmrpqWjrbqsqrHDuratu6moqK2qqbOlqaSjrqqoop+dpKyVpZ6YnpmsnaKoqqKspqOtrLixsqGpoqCsr7GsnZ+nqKmZpJmZj6CnmIaEjoqLnp+OioyVm46NhYaPlJ+clZeUhpaTk5ekm5ycipKQjYl+fYeFfHd+h4WGc3JxiHVrX1lgbmNRc3FcSzuEfEY/V3RYYVpOY1tOVlZVV1FcYl9TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJVaPkxFlZitqKGqs5yqqrC2rbi1rqulq6q9ybuwvbfCr7Gss8TDzs/Dv76zv8LDusCzyMOrrretsri/vrKtraukp6qwqaeosaa0r6qwrq2ysbSstLukuLOsrK6nq6CjnrC3q6qtu7elt7akqqesrKuuoamnprGypKemoqKslqqhlJugpp6koqulraKfp7G3ra6jpqKbqqutqZyipaSkmaCalo+YnJOCgo+IhZyfi4qOi5iNj4qCi5ejmpGQmoyTkpGTopmbmoqOi4p8hYCBg3p0gISBfXN2i6OHeGpeYG5mV2WHY04/Z5NMRWJ5V2JZUmVUTVZVVlRPXF1hVUtNaVdWV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qis6Sk9eNESGPkhGRJeSsKWjqrGYq6qttqy2saulrKqpvMDAuLizu7Wmsq/EycvRv8G6uL+/wrnBucDErbG1sbO6v72ysK6tq6untqqmra+qubCosbKusq23qre3prS3q6ykqaqco56zs6iopLS1oLeuoKqoq6msqKCrrKm5tqmqqaqjqaCsnJKqoZ2gpKOmo6qenKe1rqimqqOjmKWnp6qco6SjoJqYoJGOj5iNf4eMh4OdnYaEioqNjY+Mg4WUopmNjJmQkZGPkp+WmJaLioN/dIaAfn94dIN/end+gYidj29xZ2dxeFxgc4hrT16ZVkhteFVkVlFjT01VVFVQT1hbYlVIUGlVVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zMzEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDuWjrChpquumqulrLC0ta+rprCqqbq+u8CwrrmuobevycfI0MG+vbu8wr26w8C+v66ysrG1vLrBsbGyq7OopLSopa2zsrmwo622sbCyu6u6r6mttqyqnqqsn6Ogtq2ooZ+vsqK0qp6op6qjqqGirK2ova+srq2iqKigrJmQsKKYoqCnp56nm5mqsamjoK2ioZSjo6OnmJqppZiYmJ6OioeUiH2NhoSDo5aEgYGLho6MkIODk6CWiJCckJOQjZGclJeOioaFeHSBf3x1eHmAenRzeWh/hqR1aV5ka4F0Z4iMfVNYcF5LeHNTZVNRXk1NUllmTkxWWWRYRlNpUlE/Q05RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEuLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1srSE05VUE0kY+yoKSnrKSno6yntbOxq6WxqKq4vsC8r6e5qqavsMnHyNHDvL++ub6/vMm7wbiwr7Sxuru3wLKzu6y4rKK0p6essra5s6eovLWutr6wvaasrLWrrZypr6Sgpa2rp5yeqrKks6ibq6epo6mdpKmoqb2stK+unamkoK6cm7OjlaScpaWfpJubqaumn5uqopuTnKGlnpiXqamSmJqUkIqCj4V+joJ/h52PhX59i4aQjY+Ef5Oak4WSoYyUkYuRmpGVhol+f3J7en58aHh8enVwcHxnhHiEiGRhZ2JyhXptZ3hdXVZBV3ptVGFQUlhLTE5xdV1IWltnWUVVZlBEPkpORENBOUhHS1M/amFKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNBSjdHU2BVKj05RFc+Ko+UsZmfoKmmpaCqpbizs6apsaetuMG9ta+iuK2oqLDCycnMwba9wLW3v7nItcO1s7G1sb23ub21rbm2v62hs6erq7C1uLWrn728qbPBtLygr7O1qqufrbCjnKWoqqOem6SwprCgn6upqKGpnKSooa27qK6wrqCro6Sunp+tppefm6GjnKCcmqSqo5ubpaWWl5Wfopabl6asjJ6RkZGLgoqAgI6Ae5mUjIh7fouFjo2LioOSmJGGk6KJkpKHkJmPk4CIfHlsfnZ5eGN7e3FwcHJ3aIBzaoNnZWdgbXONbGFpb2BvQFt4a1VeT1FRSkpNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw0Ly49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQxQmhZMTNTPWVfREw2S1ZkTyo7Mk5YPSOTmayZoJinpKOfp6S4sK+kr7Cqq7jCurOtn7ivq6i0usjLyL+3wr6wtL23xLbDsa65sbPAtLq9t6m5uL2rpLSoqaqwrrmxqpu7vaSwwbW2oa62taanp7GzoJ6kpqehpZmfrKipnqCqr6egppijqaCxuZ+jsa6gq6GspJymp6mampufo5WdnZueqaaXnKCokpmUmJ6TmZahqpGaiI6Phn2Hf4KOfXygjIyIeIKLhImLi4WHkpqPiJWeiJGVgoyXjJF8hXtzcH1xdHRgeXhpbnBwbmh9cWN7bWllY19lhX5fWnNrckxMfmhYWk5QTEpIUFJQSU5cX25TRFdaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPjBYVjUol52mmZ2WrKCgoaSiuKuypbS0qqm5xLWzrZ+3ra6tsLXGyMG3v8K5sbS8tr+7vq+rva+0v7C8wripu7q3p6i1qairsK2zsKeavrelrby3sp+wt7CopaevsZuhpKCkpKGXm6+moZ6jqK+hoKGTpKSit7ChprGqnqyjr5icqqWpnpianqWTm52bnqermp2dpZaWmJSdjpOXoqiikIiLj4V6hH6Ei3qOl4qNhniBh4OIi42FjZOYjY6WmIqPl36Gl4uPeYF6cHJ3b290X3l3ZGxsa2logm1lcmtrZWhaYnN/XlpsdmlaSH1dW1hPT0pISFJVRjI6X15sUENXVlllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdCZ1tIVENUXWhFLjsxX1QsMpajoZeVnamepqGjobiqr6G7uaasvcSzr66ita+tra+0xMS9s7+6t7Gzubi6uLqurb+ztLivv8G4rL26tKais6uoqrOrrrKjnMG2pam3t6uesruppqWor6uZoqecpaaUmKGypZmepKqpnKGglKWfpLmopKetpp6loaiTn6mioaGZm52gkpudl6Ciq5ybmaGVk5WWm46Tk6OnpI+Iio6GeYR8hYV8nI2JioZ4gIOHh4eRhZWTkoyQlZONjpR7gpeOind+e2x1cm1sc2J5dWhnaWdlboRnZ2hkZmhqX2ZiaWZaZXpjYFJzVFtbU0xJR0lPU0AhK2peakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3OGJNJzKepKOSjqWmnJ6enqS1raiqureorMPAt6+sobWup6+vt8HAvbLBt7Gusra1uLe1rKq8s6+ysb3At668vLGln7aspqa0qauuoaDDrKmnsbSsrLS6naiqq7GlmJ6qnqilkZmmraKZnaSqoZuinZegnae2prCqrqChnZ2hlaCmn6KgmZuanJKanpWmnq2imJeelZSOlZiMj5iap6CQh4qKiHiFd4KCgpyHi4KJe36EiIaEkISWlY+PkJGQkY2Te4OVjYZyfn1neXBramxndXNrYmdkY3R/YWRlZmVpamNob1leWF1sZGFNaFdbYFZJR0hLTFJYPjlgbGlHQlVTXVtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI3ODVceU4yPkhpWkxaSlZiZkE6M0BlRyU1m6SgkYyuoJqYoJeltLKjsr63obHFu7mwsaK2q6uvqbm+vbytwLKvrq62r7O4sqerubGurrS2u7awuL2tpp61q6ChsaWrr5+lxKGzpa+yr7ettZ2tr6yuopmdp6qln5WbqKagmaSjqZyan5yVnJ2tsKa6qK2ioZqanpmfpJqlnZaemJuUmqGSqJatqZuUnZyTjJWZjpSUmKenjY2KiY57gnSCgYqYhYd8iYiEhIqMiJKFk5yTko+QkZaOkH+AjY2Db4F/ZnluaGtqZ3Fya1xoY2Jyf2BkZ2ptbGdqZ2RsXGxtdnFhVGJoY2VaSUZMTU9YUVBVYWWBVEBWU1lVRkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGRAQTFJZEMnNJOim4+PsZ2blKGaqbKwn7nAtqC0wbu9ubGltq+prqW3ubi5rbuvraqrt6q0ua2lsrWxrqmxt7axs7W6qKmftqmen6qiqq2cqsKZr6Wvsba1rKyesa2vqqKbnaSsqJyVnKeknZmpo6WVmqCdkZyjq6qpu5+mpKCYmpqeoo9ropWYnHGDlpykgHaRq6ielpahkYmXmYCXip+PeIWTjYNtaX53g3BshoqGfYSKhm9dZGBnhJeGa4uQlJJ1d4uEf4OQf2aIgGh2aWZYXWl0bk5QamRmcYJmXmRmbmxpXl1eiZCFiGhPS0Q4RVRnXkpIUFBVVUtIU2BvdGVFW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTlxLW2ZiPkcxT2I8Ky+NpJmHlbGbnZOgnKqtq6O9xa+pt8K4vb2tp7awpqukuLSztLG5raqnrLSmsLWip7i2tainrLazrrSts6Kpn7SrnqKknKeomq69lainsLS4ra2kqK6qq6ain5yhqKecl6Gmppybp6edkp6gmZCeqKqjtbCjoqOclpiYmKSJoY+SmoehiJSeoX+lf6esnpSTnZOIg3J4jY6Dh6B1iI1pl4hmfXN4oG+Ih4N+jHx/oaCfmX97h550iI52m4psiIKDbWllZHttcmJUhm1jbWmYcVhqcG6GV15pW2tqW4hwbXlyh2mHhFpeRk4+Rl5NRVJWVlFQUldUZ15MWUtSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05cTFxnXz1LMVVgNy8ojKaXhJ2snZmZnZ+rqqiqv8Ovsrm8t8C/qqS3saqsprO1rq+ztquppbGtpbWzm6y1trSlp6izsa2yqK+fqqGzqaCkpJqipJ2wt5Wlpqe2vaasp6mqrKemoqCZoKikmZmmo6WZnKWplpOinJSTo6amoLako6CjmJWTmJOciK6QmJSJqYuYpJyGsYCkrZ6Ump+VeYLUqH+HlMCbxnh3saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJaxq7B5aGxYsa5vZWm8krxuaHptcY/YflNqY7ayfoBxlHWaoaqQV09YYU9WTkZUW1hRUFOLXFdbUEBcRVFOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01eZ1w+TDFaXDQxIY6mk4Gnqp+XnZ2lrbKpscK9srW/tbi/wqumtK2tqaivtKqvtrOop6a2pae4r5yysrWqpaSnsq+usaaqnqeksqSiop+XnKCfsa6Vn6OgtLqiqaihra6lop2bmqKqoJibqKGfmJ2oqJGcp5qUnqKno6Cwo56fo5aWkpiSmYWwa2qKjap+Z4WWh61lcZ6dlZqnlnGuoaR+d7p8a6GPdrFfarRbpYBlnJFgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZKUY21tp25chKBFaWeHlkV1nGB9Znujp4JZX4uraYCSeHpqqDhKr1tXVG1jW0xPWF9cV1Y7TohPV1YvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlkzMRuSopWCrKeln6OkqrG3rbS9vrC3xbK4usKnqLCsr6mpsa+ksbqwpKSvs6Opuames7Kwo6Wgqq2wrK+mqJ+jorGdpJ2YlZibna+ol5yin7Szoauboa2toJ6al6Cjqp2ZnqShnJmhp6SQnaObmKGfrJ+lpqCan6GVlZGWkZqGtZu1eIWpmbWZd4ezm7d/k5aXq5V+a4GmeoGFhpGUknerZ2qxW6x7joeUdIhwjoaBf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLT6VYSGNjmX5jaKZgeXF1UpOGXlCpbWNxfYaAYZ0vUqJuW1RrZ2BMS1xjWFxaQj6weFdYQSNNaEZDREFAQTE5Pjg5Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAyO0YsMC44NDAsLigvMiw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOGFVNTAcl6CUiLOmpqKuqaizrKq7tsKwvMKtuLfBqqytr66nrrOqoq+8qqGnta2jq7WkpbKzqKOhnaeqsqiwqKaeoKCwlqCalpaXmqCvo5uapKi1rqGpj6mnqZqdlpigpambn52jn5ygoqWjlZuemJmdoqqbpZqcmqKglpORk5OdhNWTmblxsMJ/xoZ81pScu3yblqaQjZyMpHqNhqKBpYJ6rHmPnVave4l+n2q5Wrl3hoN9poKTfJh6qnmOnZB7sW6OhHSQu4VulVCvp8WKUaB6Y2CqYnNyhmyXh19TtbTIhYCJfGOkM0KddV1QamhkUEBYZlpkYUpITWtKWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUDcyJZyik5mxqKils6qltKekvLfBsbrAsra0vLO2p7Kxo7GzpqCvtaibqLquoq+xoLK0saGknp6oqbCptKmlnJ6erJeZmZeXlpiirJ6bl6mtsKijn46soqeWnZicoaaimKKho6GaoqKnm56gnpWZmqWgnKeVm5ufoJiQkpWQnYiybmi1cauIcI6mcrR0c7Z7m5ikjY+cjaJ+j5+kfrB1g5HS0XVbrnyFf6Rvm6qma4aFfa19l5mPe7Fzk52PeLNllnSFnm6eZpRSyYtawlyfeWJfrV92c4Zil4heWcqdb7+AdU1LtVNVxmRUUWpjZlhBT2pfbGlQVUZJOD1XUltWWUlDP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VFPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVByaDknV2lcQk5UX2VQNUc9YU02Mi6inZGlr6ykqrusprWlp7a7vLK7v7i3tbu7tKa1tKKysqOgrK+kmKa6rqSxsJy0uKqgpZ2hqqWyqKyqpZqdm6mflpWYmZKTo6qhl5Onq7ClopaSrJ+lkpShnKSnoJWbp6eimqOfrZqgnp6QlZuhnZyllZ2VmaKelZmWkpuFrHt3qHajj4uHqW+tioOnhJqZooqSmYuifpKXh66Ff4KzXHKzUq59goKkf3HXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1edneHZ5iIal2vd5Wfj3hsNXnIrrJfQlRvXWdgRVBsYHFtVlVNLmViaFNZUDtCREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjc3oJ2UoLiwmLPBrKiyp6qyuri0ub65uLO2vbamuLSgta2goKmrn5WntqyosLGrrbSkm6mfoKiitaemqqSZnpWlopSUnJqSlqOmm5SQp62vpaGVmKmfoo+RopqppqGVmqapnp2knqydoJ2gjZSem56hmJmclpehoJSYkaadhql9faV5oY+Qg6pwrYyBpoaWoKKKl5eIo4GQh5Sqe3+LnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRtk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmVPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpJYSEU9SEZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE9N6Kcmpq/rJi0wq6rraimtLC4sba/ubqzsbi9qru1oLGln6anp56TqrGpr6q1raqvoZihoKakpLqio6yhl5uRo6CVlZ+blZmgoJCOjKmwr6adl5qopp+NkqSYqKuolZipqJ+foKOto6CdoY2UoJifoJKcl5yVnaGVlo+rm4+ubnK0dKmMd4qmc7R5dLSBk6WjkpyMiaSHjnW4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZwXK9WPJx3ZlRvbi5bp09iUmtlYmxaYlxgcHxjU1lRPj5tbzJCQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjkxQTilmpudu6KcssCuraurp7epuK+1wbW9sa+6uazBtqqroZ2npKKdkquqp7WjsqiuqqGXnKigpau5naOtnJaZkKWjlo6eoZyZnp+Rk5Wrtq+nmZSbrKmXjJSmmqWto5KXq7KkoJ6oq7CZoaKPmKGXoJuWm5ehk5ypnZSQqpmH05Oau3SxxIDDhn3Vlpu4eYmSmYyXiYynh3mitnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6von6MdIerfb5uc7x0soN1eICKbZqIcW2NpHS9XXd9W2F5vGpaVltpeV5pYWRmYm15b1lbWUNBQHI/Q0YrNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkA5ppmeoryil7HCsK2pqqyxp7ivt8Wxu7KuvLCuwbKspaOfpKGcm5CqpKqypLWnraSflpqqmaasuZ2jrpmVoZCmoJONnKOemJ6akJaTr7mwq5WXo6enlJCWpZ2krZ6RoKiroJufqaSynqKkjaahlKGam5eWpJiPsKCSlamfhZCZtYCRkY24lXiCk5u1d25sb3NueY+EjolznsG7vJl6gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnF3toxef3l9iGeDeW15YouscHSFf1hbp2pEZFlUZl9jXWNRZ2dxbXVCTVBNRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz43MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYVc4Kk9dXT0rO1ZWJz06PKadoKG/ppazwrSrqqisq6m7rrHGr7W0rrintbmtqaOjp5+gnZiTrKStqqa1qKifm5ago56spb6noaqYlZyRopuSj6GooZOel5KYlLK1tqyYnaSkoouSkqacpauclqmlppyZoKinpqOooJGsnpejnpeWmJ2ej7Cpk5ynoo5qfmmcp3iJc36bjnV6ZYd7vr/Aum6SgnGVhV9yalpdmolhZIeOlWtgf5VjbZx2YpRrgJqVlGVeX2Nxm4locox8hpRman5xdHl+fWJbeHSBaFBcboN8e4pqWGx5gXJJSm+FcE5zTUVXXGZhTFtXZmNeT1ptdmpyUk9ERU08SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5bTyc/Mj6on6ihwaSatLq2o6ymrqeotbKsyKyws6y2pL6ys6agpKqdo5uZmaynrqSltaqkm5iVopumram/qKmmlpSblqCak5ilqaeRnpCPmJywsr6sm6edp6KJk5Gqm6ikm5usoKSamqKnrKKfqaGZr5qVpp+WlJ2fnZexpZmiqJmckZ6co6SZp6OanZqampCWgmhufXF2kZeUkYOJtKmNhZiVjoqMmJaHk5WKg5OTkIiNkZSZk5mXmqChmpuUn5uNgnqkhWxpe5B9gHWJi4Jygnh5dnaKgHuJanOBdIN1ZHd9dmtwem1gY1tvZ0xYWWVqX1dZcHpvbmZTT0ZSOU9aTlJPKCs7SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzob+ipLGxt6CpprOnpbC1qsmrrbKmtabAqLShnqWmnKWVlaCrp6yjo7esoJmWlqCXraqmwZ+spJaSnJeemJSUop6eo6iSkJmop7LDr5qrnaqej5eWqZ6rnJ2grZihm5yipa+moaSnnqyYl6admZqhnp6csKGdoqeVmJOZlKCilqOfmKGOlpSLio2Pl62Pe5WbgpGAiamohYCYloqEjp+Ie4OQhoWakYeGiZWOm5eOkJieo5aZkpCcjX6NZaGzroSJhHd7kIp9d3l6b2d5kIGAiWt1gXmIcmlzf3l1g4eCa3RjeGZfaGRjZGZqWGt7cGprXFNMUERfVUZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX11dXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLSgua++rKutsbKgqqayraKss7DGsKutpLOvvKS0nKCnoqGdmZeopqmmpKWztZ6VlJ6Zma+mrr6grKORkZ6amZSSlqGcl6mdhZ2prKK0x7OfqaSqlpaYmqeeqZygpKuUnp+eoKquqKajq6Gsm5+goJiknpyfnLCkmZ+ok5iXnZKlmpipn5uXZoOSfGV+j5qPY3iMbGhqepCjq2tkmZd+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKKfmHNsbnqEjIZ5WGVdhYJebIuKgnZbaHN3d5GAh4JueIJ4f3NteYRzd4iIjoN7aYVYXWpzZF1ziGlrfHFtY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kuNlpPNilFWS9ETzFZQjs/Lj2ln7q8ua+rs7CrpaitrrCnrq2wvbGqqKWtsLCfrZigpJ6impqnrJyso6aoqbOunpWjkKKvpra5pa6jj46aoZmTkpugmJmmlnulrKKos8O3paKnr5+elZ6jn6ScpKqokp6hnqCqr6qqo6qfp5umn6egrJahnKWxpJecq5ahnpuTpZeeq5mefr6DiHK0coWeha1od7nEuHGSoaN7ppiYc6qCfMvAwLtxiqOHgp58lpiInsC9gpadnY2cwcB7gXqRjJrCv31rpbJvjIFvynp/m3eRg46AdnmBf3lxe4CGcHiFjJN5bHaRYmVeeGRfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19hX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqO4w7Swr7+pqZSjr6mwr62msrWvqqanpbGrn6uYm6KgnJuqp6Kdq6KlqaWktKSdo5Omrqy4tKevopKRmZ2lkpGgoZeboJ2Hpqqkq62/v7Ghqa6pl5KfnqKZoqSqo5OgoZ6drK6orKajoqWgpKWcraiRpJupraqcnqqdraKWl6WWoaOYnX/OlHl6pYF6lpabX62PXY6ogKChfKeVmnSrg4CvXmSMqXqoh4WfdJeSiLNjgquGoI2Ns2qErnR8loe4YYKtWaPNbpB1e9t7f5lxfoiSdX9le4h2dmx9h259hZCRfmyBjV9wam9mYF94ZFxxaGpjZmBSVFNXXkpPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMa3CwMC1tLC3mJ6Ro6qprbSrprKtraykrKawqqCnm5qmmJyir5+hn6ino6ahn7Csm56Wpq6tsKuorKCUkpufpZOPnqWXnaijnq6kq7Cov8azqKmxrpaSnpyil6Gqqp+VoZ6dnK2up6qom6alo6GqkqyzlqWiqqqepKimobGik5qnmqCalJSRl6BwhYyYdYSoh3GwfJ1yrH2gn4Glj553q4J9rX+ccq1+q4eGn3aYknt8l36qiKGMkYucfqt7iJKOoIB6rVacxHqPb5LBfYGVbXVwjG1md2WGb2F3bnJuiIqRj4NtkI5kbnN1b2BmbWRfb2hqbmZjV1NcYFpSUkM5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv1MbHsrSfnaOOo6Kira62r6mxp6mrqK6rq6aio52ao5afpqufoqagqKiin56wrJibl6ior6yop6mel5WapKKSlKGtm52no66so6y1qbnNsq2mrqyWlZydopmfrqydlqGZnp6psKipqJqqqKOiq5uvsaKorK+mmqesqqqyo5OXo6WalJGEpGqkdYl6qXV6snGCpYmYjHCHn5qHpF9gUquEf66Cm3WugqeGhp96mZeFe2aAo4mkmYaBo32pf4GUhq5efKhVnaKSgXqjn4B7w6/FjHOvtLO5cWKpr8J1aIyMl46BbJmRbm14d3dua2ZkZHFwZntpY11WX2lYWFRMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C1sK+qraOop6qrq6mkpqCbpZ+dpqempJ2smqKroaSfr6Kem5OqpLawrqCpm52XlaekkZuhqJ+gppywpqOosay2yLK1qayqlZGcnaKZoKW0nZqhlJyfpqqroq2Zq6ehoaqis62iqrOyopyrqa+vt6SUlqOnmJuSfKpsnoSHdat5fLBugqSLiJ+WlZ6VgdK3tLjJgIGyXl+UqYOkh4egepiVmXiqyXOZo5SoqZCTmox+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SOj5ySe3CWkX1venR8em1bZWpycWaBaV5hWGNtXF5ZSUxMS0VEQkI9QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwca5ramzrqylop2yuayqoaabqKarrKmmoKalmKqjn66snaahrJqfqaWdp7Wgo5iTqKu2sqybppyglpGmrZGZnKejoKqmrqGjp6mwtMKxsqqtqJSJmJ2lm6KkrqWXoZWZnKWlqpqunKympZ6so7esoLK5sJ6cr6eztLSmlZiopJugjoKdTniagX+feoSjfIKkhIamnpyelIS4e3x5uYJ/zMbDtneboZCLn36alpeJdp+XiqSYpKh+sIWchJ6ErH2ZlGGlbKNwj4WQgX2XhHKsYKRycYCaYLx9UlV1jpGjlnt8ko+Ic3pyhH1wXGxud3JqgW5aY19obmJkXUxMUVNBSEdGSTk5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuhrLO0pp+hlaavrq6ppp2mppqjp6GyrqKpp7KgmaiklKK1o6SWl6KqtbmknKOdo5OQorGZnpympaGir62dpKiitbHDsa2qraqRh5Gcp52jpJyll56YmZmlo6iZraGspKWYr6W7rKG3t66enrWyubK0qJmesKKknoaP0bXDt3mHjoWRk4+ApniUoneLoJKFpYKLcauGhbRucmmZo5yViZ98l5mGh5BzroKlm6KNpouTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicXF/n2Jzsrhod4+TpJh9iouRind8eI2BbGh3aXhzbn90XGRkbW1laGBKWldYPEhGP1QzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq6/v7y7tZ6XqKSttqGimZWjqaeuqauZpaGfpaGgtaeiqaewo5Sro46kraSfkJqaqrS0pJ2mnKmSlJeuoKCepqScp5y1mqCqo7Wrwq+pq6mijISPnKKgpqOVmZqcmJuYpqOmmKqmrKGkm62mvayVvrCtn6Ows7qstaicqbKlqZh6p5F9fLB3ioCkpYicbbJvoIete6GPg6iVmoCsiYWuhaCUqKGil4WfgJmVgHuSfquAnZqWi6t4naCPiJOSf3mvXaOBfKanZJ6AfJd0a65dpWtxhZldYFuMoG2UkKWYgZOMlYp5eYGWfmpsfWJ9dG1/eV9mZXBuZ2doQllfWz1KUzJUOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWldTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVlVRSEZJSiMoKLySmoSpxsO2wbSfmq2grrilo46bpKOgr66pn6Oena2Ynrmgoqugr6qaraCQqqmllomakK6wrKagqJutmJmPraKhnaWhmaScrZifqKW2qL+upKmjn4yAjpubn6aekpSZmpSZmaSjo5mnqquio56pqL6kl8Osq6OirLO6rK+oorSwqquZdq9+kIqchYd8uq2JmGSwjGWVrX2hj4OnlpuBrYqEsIWmmaShopCEoFtsaoGzYH+te3uCgLJsZ26Zl4uIsVt9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46nmomWj5SVeniNm3xjc3xhg3hzf3xgaWZwbWZlZU9VY1xBVF49SCg+OT00ISEtJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBOSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt727tMGzo5ytpqW2qaCLmaCfnbOxqJ6in520mKCzqKqrnrCtnqualK6ooo6Im46vrKmno6iZr5Oaj6maoZ6lnpmjoqWZn6Opsqi8r6Wonp2OfIualqGgmZCRmpuRmJaonqCYp6ympKSipKm7nqDGp6Wpoqu0tq2vqKC9r66ul4GpkqOujpuAhqSXmJCBgLjDuoOOnZOEp5idgqyKgq+JppuapaqRftW9wqpio7+9fH6jgoPXure1hZOSgp69voRqo4Fvq4RunX96srHHg2ursL2seHeivrt0gJWNpZuOmY+Vm3iAkJl5Ynx6Y4xneIF7YGtla2piUGJbU2lcQFRgQkwpPDo1Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLG/urK9s6Kdrqals6adjJilv6m2sKehv6amsZuesZy5qJ+trqWnlJOvrJeMg5qRrqajrKKlnKqgmIujk6aep5uaoKiimZ6grKypuK2no5qXk3uHmZKmm5OPkZiYj5eTqJmfl6ion6mmoaKru56pxaOgr6Ors7WrsauivamwsJt0dqqktoVliZ9vZ6yPio9tb3ekkJqggXWwmpZwkI1ylqejm5iupHJtbWxlinhubYKZcYB6aXBpZomWlZhxaGmFhmdwhmRdimNpb1ldZ354pmBico+Sb2ZkgI2TjqGXlpePlJx8ho6UdGWGd2eManh+eGRsY2ZsYktkWEprWTpQZERQJ0o6KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSqu7qys6qpoq6epLOqmJK9scPIvrSpnr+rrKOgpqufuqOkraytpY2WraqQjIWVl62fpaqin6SkoJGLpZKnmamZlqOqoJacpaanr7mqq5qbk5J7hJeOppeOkZCYlI2XlKaTnpenopqwpp2irLmgsMKopLOmrLGyq6+tqbqlsLmXi6GppbaciZahl4apmpCUnZOqs5mbo6yhs5ejoZ6hopygpKGVq6aMkpOMh5KcnJSQmZOYkI6VhH+kmpeVjouTkoqPhoR+Z4uAdIN2dIeMcadtfJWSlJOBgY+Pj46ck6CUlpSfgYaTi3BnjnZuiXd1fHlpa2Rkb2NVYFlAaVpHYmBOWCtFPSsmITY0MC8fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCllqmppba4rq6isKWtn6C2sZCOqsS7xbq3qaGlnZulnbCoo7annam1pqeRmKyji4iJj5ynlqykopqonp+TlaOXqJqpmZSmoaSQmqeZobS5p6qYmpCMe4GUjKGUipSRlZCPkpekjp6ZqJ6btaOdpqy3qK/CrqO3pq+vsK2qq7W7orG+mpKmpKa1opGdpp6NqZ+Nkp+jrLCboaSyqbCZpaGdpKuenp2cl6uckpmim5SQlqqZjZiYlpCWnpGHoJ2VlIWSjJCNlYuBfmaNh3WHdnmIhHScaoeRlZWSin2MlpKSl5KgkZqUnoOGloV4cZRyeIl+cXt+aW5kX3BpYFtfWW1iUGBkT1k5R0ZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJWkp6OxtKyuo6mnraCotaqQj5yjsruuqquhopl6nKKwpKWxqZabuKajlJipnI6GiombopCun6SXqKChkpeZm66LqpaPqJmojJiojp64tqOlmJuNiHmBk4ybk4qVkZSQjZGWoYudnaednrijf4OvtaKwr3SkvqOyoHh6oayzvZZ3rqWgioCqfmRbYXafjqSdg5d+bpOznKOor6ujZZ+glHR6mpZwgJiol2x+oqiKZZ2lm5CXmJaLkpuQhJ2akJSDkoeOjpKJhXdrkIh2h3F8hoGAYWmJi5WTjFt2lZFnaI+Ncnmilpdld5eGgHaXaIKJgm55fmpwZV92b2traFtlY2Fhb1JaPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXWBoZ2dYUUk8REc8OVZSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6mlqa2jp62lkpaqtK6xpZmppqqXc4ucr5+oq6eTlrifoI+cpJ6QfoiIm56NrJqklaiino6XkZ6FdK6PiKWaqJGWo4ibubOnoJmZi4l1dpONlpOKk5GQlIyPk5+Nmp6lmJuyloCMm7WdtIySj72noX6nonqksLmBjo6nn4SLhY+wqa+MiZaimXmBi6yGnJ2iqKqoiJWHmXelm3qHm4GXpoKBe5yyeoqGn5eZlJiWgZCWloSZmmN5h5CEjY+Si4NucZCIeoFxgIGGf4Z0h4WWkniWaJN0oJp0fJmCnZqFmH2RiYGCmGmMjIRqeHpwcGdkeG5pbGpbZGlpZXJbXUhUTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWhmWVFIOURLPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrca8r6CVpai0nY+DnKubp6KgjZC+npmNn5qhkHyFjpmXiKydo5ahoZKOlImGgJGojoeinKOTlp2Gnrmxp52ak4+FcHWQiZSQipSPj5uLjpGekZWeo5WdrIiftIm0mq6Lyoirr4m3hY2wg7GvhKmNp5iNnXyoj3J7d5uOppZolaR5tIufnqaok5nCgn+riJihcZ6AmqV9l4WVsYGhfKCTn4+Yl4COk5uJmJKLfIWTho2Uk4mDbXOShoB7coaBhH2FdYaCmIGPxWaAqYePomqdgZ6XgJmAiouDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZrWGdHXFFMMkU0Nk1hYzcmNDxER0Q6NjM2NTg7OD49PD5CTD9OSUpLQ1BaXVxXYl5qbFxRRT1LTUBKZFhdY2doZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGqq6ealJ+ipKqilaSptqKvf6CmnKWenYmUvJmTjaCRnY95g5aWkYirmZybmqKFj4x3m5yOoJGInqSblZiXhqK4rKWZm42Nf2JtkIuTkI2PjIyXi4+Rn46SnqCZoah+oaeHrZ2glq6QoJ6dkYaCoI2sr4ekjaqajJp+onWAmJNrgat0Tat4h42dkpuoqIKqq36EoXt6p2mef5JsZ5eGl7WInn1tYGNYg5d/jHtkZ4tzmX15lmtdfJduX1NxhVxgbHmDYFllgn6EgZhxp6prg6NucqVwn4KcZ2SebFpsiHplWV+CfmFXUG92ZW10cWpqbl5qb2xraFdoTl1YRTlANEdEXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKW11fV15fYnZgTUU6TU9NVGJcW2ZnaWliYmRhZGRiYWJgYmRjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oKqjpqyRoba8q6+imZefoaWsq5+crbSip5Ggn5+mm5mNmLSZkIuejJWLdYGUkYyKppaWmJ+ef5OFhqyjh5yRipipmJmakYelsKailZmIiYBpboiHi46OiYuMkYuPkaGMk52fm6Klf5OBj6OhlKB3nJaQp4OiqICGqq2FpXmLfYSafaJwcpKHlnuejHlth5uLmZGcqZuPh518gqJzdqZmnn53pF6Ye32Sc6JumLe0unOSh4GAtqhkgca4e3CVtoxxgJukY3Ssq2B9ap2zfm59h4OPgouXcYCjbHOkc56CfaNenJmzlm97l56zdHJbnrKCaWJvc3VxaG5Ya2xycmRcaF1hS0Q9RDVRQVpxMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1lYYGB8ZElDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4tq2uoJqinKOjpKubmrGsq5KXoJigpJmalJ6rm4uIkXiLhXCAlo2Jj6GQk5Sdl32Rio6ooIeYj4qSopObmoyKqKekno+Wh4R+a3uGfn2PjYOLj4+JjpOfgpacoJ2gn4uJd5yYoo2gcqKLiKmInKeRmKmrf66MfXqgmXmjk3iAc5eIjJx9lp+Gm46ZnKeHo2ShfYmWkJuMbJ5omo1umpl6f4qnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2domKgJ1omnWHk5KYjn+ebZmQaqaZXKh+d7tqfalajoRds2dcbnF4d2tpW3BqeXhhXmRWYUFQRU83VkJSbjRKWlleTlpEQDE1MTs7N0g/OkNHVT9YUlhdPkRiXVZgUWFjfWpFQjlOW15ZZGZYZmdtbWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZyJqrabqIljlZysurKwrJ2mm5unn52smZ2wp6udl6KZoZ+Zlpago5mGiY1piIBxe5eIi5aXhJKVmI96ioSWo5yJlZCGi52RnJuIj6iin5qMkYqAgGmBhnl/lox7iI2Oh46Vmn+ToZ6gopOYcmifiqCPjHCSjIKpiJmgpKqhqH2wraSiuJd2o7Oio3+IlHideqqafqKPnpyYiZhyoX2FjbC1fWuakaF4fpi0o6OrqISYe5p8nJp+c6paXW97l4t4nmJMf3t7hWR6mEJNn1mianJ8jm6BioSZdZt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfX1uZl9raHZ7YmNfUF1WXFRWQFlFUWdFUlZcYVhfSUQ9QjhAQTpJRThMRVhBVlFaVkRGYVxaYEtgbX1yRUM8VV5iWmVqVmhobW9iZmZeYWBcXV5gaGJfZWN2bF5lZ2ZsZGVsaGhraZSdgbGumYRTX6GntLqzs6maooubqZycp5Kgq6Ogp4+enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32Rk5aIcoCJkqCbcpKQgYiZlJ+ahI6om5mVi4qKfINshIVxgaGMeIWNiIeRl5R8kqOgnqOIroZ9tYSPnp17ppZ6qYKWnpGLop19p2h3bX6Zc6BzcXydhZhvk4KufaODp5+bgaRwXqlodaNjb6VhnNOPfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyp7x/d4Ntf7+mqrRenG9+cpdvgXOicl2jZ3SmYGimbJrTmHqCm253eZdrm3l2l3JsqaVnX2R5cH+Da2dmY252d2ZfYVFaZVBRYUhXSVRfV1NbZGpbZVFGQ0tMSktCSkQ4UEBQTVhTWE9SUWBlZWlSZHh5d0pGRWNdZVpoalNpaGpvY2pmYGNfXF1dX2hiYWhle2ReZGdka2RqbGZobGiYm3+wrFRcS36pr7K1sLOjnJiEl6agoKOMpKefl6iJmZeYk5mTkaCXjYiFe3B9hGh9j4KTmoF3kY6OiXB/ho+TkmyYlHyJkZKjlYOOqpqTkouFiXmDdoeAboGehneAkoWHmKGWeZOio5qgibOhoraLeqynpK6lcKmAm5GGgZySfKSAopmGmHGehKKtromXi4CMpI2Wg66ilHa1trXJoXSUi4KeYZ2XqW15lYefmnWhh3egfZCWioFvTGajknCaiHOle3l0YoOCbH6gbHJkYJxyf3SXantps7W0xqZzmH56nWqbmqt0gpptc3eXaZl5dJhxUER9s15qdWp4h2ZrZ2J0dHBtVl1TWGdPUmhJVUxYUlZdZ2tuVmdXTUpBSk1KSEpOQVFKUGRjaW1ldHJzfnh7bnWJe3tUUU5sXmhba2lSamhpbGdtZmNlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlopyJr6eFZj+UobKsr6+1oqKPf5anoqGji6SmnJulgZqXlo2XkI+bko2Ig3lqeYZlg4x+lp95dY+IjIFphIWSg4yFnY16jIqVpZKCl6mXjJGLgIl5f3yLeXCPoIZ5gZSGiJaflH+UpaeclpaEZ254nGyiZHxxpXicmHBop4KYjHyleqCWg5Zyn3aAiZSVj7lukIqiYn2ZopaJbnJpqmt1oG1vpmCbaYuQaZaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGeIgm5zolpfW2Shbl2JjG97f3NyZKVueKJkZqdomHKLmG6hb1KIj26gXmSnVItdVJhtbXJqcYFtcGhreHNrb1FYVlVlWVNtSVhPXEhYaWhzallrVlFSRVZcTFhSYVVoal53dXp8cHx8coJ7f3N2jYCDdl5Rc2FnYnBnUGpoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupaqxsaafi3+WqpydpIuhoZmhoYCVmJONmo+Ll5CNinuGcYCIaIuKfJeac3SJfZB7ZYOHlYqJlpmCfIiGlqaQgaKrkIWQioGKfX9/jnNpj6WEfYWTjIeYn42HkqqmnommeJacfqWJloyymZ6Rg6+Xn6V5l4h5qXSlj4SabqWijJKEjIO8bn2lr4KGhoeUl52gfaZ6caiUoJZnnn5vrGOWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4Zubp+ekZVif6uLqneAf42nn3effYWklZ2gaZqHdatmnq2MtnN2voykk1mDpo2rYXVxc297dHFian5uaGxTVlpVYGBcakxcUl1JXmxtdmBbcVlbYFpnc2Vub3FjcXRgd3p+eXJ5g3KDfoF7e4yBgoB2YnhkY25zZFJsZ2hvbXJpZmlhX15cYWpibGx6b1xcYmlhbWl3bWdsbmKVpqqdgYCepJaqqp6op66jmYiBlqqZnaOJmqScqJ2Ei5qPhZyRhZKNi410hXqIg2+NhH2Xk3N1hnKRg21/i5KGhpSPfXuChZeljX+lpY2AjYmElHWCh5JvbIuogIKLk42InJ6JjJOqo6CQgHSUl4h+gXmUr6R/gpxxj4Z5koyEgHtyp4xxfX16l5abhI14e35+iJSVk4p3kZmgoYR7fYlrjIVbeXlzeXBpbn6SiXF/dIGPlJNxhYOCZY1/X4GAjHh2dJR1b3tvboluhIZfd2l4jmaCgoaOqpx+dH2XaomIb391fIR1bWxmjHN3e5d3hFtqWHmPaG53cXBvd3hvXWyGbWlnVlpfV1xka2RVYVVeUV9wd3lrandlampqdXxwcXRzYW91YnN7gXh1eoF1f4B/gXmLhYJ9e21/bGR5bl5XbmdodWt4amlpZFxgWmNpZWxwdW5aW2JrZGtreW1obG9hjpW6qaeLoaKbpqSZpJ2roqCDg5aqkZ2giJmmmqiYg4Gbi36WlIeOioiNcoJ8j31+j4R6l450coRwlYV7fZKLhoaQhXh+gIaYo4x7p6GLhY+PhJWCho6Xd3GEqoWNkZyPh56eh4uaqKCgq4OJjpWbf36Kl62okJOnkHhxnpODe5NvfqmFcH2VcWpvfIGfi3+SjoxobV2DjIycnJ+Oc5WLiHF0a4J2dIBZcm6GkIF9fotpXWljeoWDiIBfaXh7nHyDjYN2gYeDaXmMiGticXODd19yjYKJkKeVhmaNj4Nud4uDb4SMeG5kZmN5gnqVWlxpZm52W3p4d3Rtc3KCZlxtimtrYlpZXVlYa3FbXmBZXl1mc317c290Y2pqaXt8cnp3dGRtdGhse351enx7eXl/gH9whoqEe31zfnlyf2hUXHFpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbmxncnlvaGptYIyMq7GhkKOhmp+emJ6ZqaOhfYKWq4yelIeaoZCklH97mIR8kpmIiIaGinJ9gIt2hYuBhJaKcm+AcpiGhH6Sg4SGioF6gISLmp+Pgqagh3iNl4iVi4ucl4WDeqyBkJeZk4menYeIoaufoqKji4iTm52jmZaqoqinoZOciZiQfHmPjoSofn+SkZKTnLGlmpSdkI6yk5iEpoyMlpygiZGbgomSimt8jnZ3ZYKGkIp8iZ2Eh4uPh4iAhYSQd3x7dZujiYiLn4uGlX9+jYKBdnF0hoV/eImHipGmkYSGjoiDjJCLe4aJh46AdWuBg3t5mWlyaGB0inB9enZ1b3d0gV1db4dobl9fWltcUmdxVWNbW2FsaHR7fHJucGRqaWh/e214fnBob29sZoB7coGAd399f4R7bYOMhnx6eHx+eoN4TmR2anNucXtla2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5aioZiVmZiUmKSgnXt/mKmNnoyFn5yKnZZ8eJSCe46ZiYaDhIZteIGAcoCHfoiThG1rfnqXh4SDkH6AhoSGfYeDjZudkYapnoJxio+FkpGLnJF9jXqpg4yRl5WOm5aGhpumoKKanYaDkpqZmJCapqCmnp6QloGSi3d9iI6EpXt8j5CQhZiqoJyTnI+Nqo6SgJ6NiZSan4OOl36GjoJveIZxdWF+hI+GdIuXgIKOgoaEfoWElG55dnWUo4yOhpuFhY51gIt9fXNzfImEe3mMj4STp4+GhI+Cg4qJiXWFhoeJe25qfX97bWhrbGdeeX5nfHt2dHV1endcYHB9bXRgY1pbXlFmbVNlWl1haml1eX5wbGxjampngH9rcn9ranNueG6EeW6GgHaCgH2FdnGCjYh+e3p8gHuCi2Bpe2t1aGmDZWpjYGlbY3Vob2J1bWtUYnF5ZW95enJlam1ti4qfuJqhpJ+TkZaXi5qfnp17d5ylkJuJhqSUipiZeHmNhXyJkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foaEh3yPgI+bm5CHppx/cIuKi5KGoKGKhYx8p4+GjpKXk5aSd42joKGdlpp/gZCZmJOMmqKho5qYkZt+joV6gYSOh6B/foyMjnyXpKCgkpmQj6aNkIGbkYmTl5x+kpF9ho2AdXSBcHZgfYCOhnGKlXyHinGMfoKFhY5oeHJ5jZmSkICXfoiLc4KIfX1yenyMhXt6kY2DlqWTi4WRfIWGh4V1gYKFhnlkcXp+eHlwbGlmXn1zaHx1dXN8cn9qXmB0dnB3ZGNYXV5SamhUZFheYGdqdniBcWZrY2xnZX+Aam19Z21wan13hnpri4FygYF9gXR2go2Gf3x6gIF9f49pcoNudGliiGlsYl9xVXRvbW5geGhsV2p0dmJ1entxYmtveYmNn7OSpaWdjpCYj4adoJqcfHWjn42Xf4yhioialnh7hod+g4l+iIKBf3B+enR1goV+iZB3Z2N9hpeLgoqNeH2AjYN5loCVl5WNlZ+afW+LgZCThqWbh4yJg6WTg5GKlpeSkXaRnaGhmJSYen+Ol5aOlpqcpJ2Zk5SbepCGhHmFlo2dfYGKjYtyl6KeoJKYjo+ijIyDl5iDk5aaf5eMe4iMgHZxfW16Y4B8i4VwhpN/j4Frh4KBf4mEZnZvfYiTmY5+lHiMiX2AiH18coB5ioZ6hJGKi5iiloGDjHeIhIKBdnuAh4N0X3d3fHN9d2ZrY2B+aWp2c3R1fXF8Y2Nhc251cm1hWV9dWmtkUmJXX2Boa3V5hnBiamNsZmh8g2todGhsb2h/fIF4bY+GcYCCgn90fIOMgYB+eoKDfnyQbXWJdHRtZYpsamJjdVaDaXBuYHhnbGFqdnBmeXt5cV9xbIWFkJ2umKeono6Nl4eFn5OWmH12qJuJmHmWnIuMmI94e4CLfXyDe4CCgXhzeHlzfYCDf4iKgGRefYuViH6FiHR9fop/fpiElpOWjKOgl35xh3uTkIqmj4yOipKfkIKQj5SXkYqBj5igmpKQknSAjZGTiZydnqaYmI6VlnSOj4tthpiPmXqHiJCJb5edmqKTlIqMn4yGgpKcf5OSloeZiHuJiYF5cXlqdWx7f4t+bYWRgpN3b4KDfX6LgGVzan2Bl5iFf450kYmEeoh+dniBfoeBfYONhY2UpJB5hYJ0iYd9f3J0f4WBbGB6dHlwfG9hbmJke2Fub3Zzd3dzc2F2YG9rdW5vXVteXV1qXU9dV2JhaG1zeolrX2llamNod4htZmxoaWxngHx6d2+Ph3OAg4R9dIGGiXqDfXqBhH19jnJ5i3l4bmyHa2hfaXJjh2hxb2V2Z21sYXpoa3x7eHBhd22LgZmaqqGkqZ6KipGGip6KlZd9dqyXjJZ8npORlpSIdn17inx7gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkYaAhIRzeoCGeo+Rh5GRm5KkmpOBfYB8jYmRo4iNio2XmYyFkZiTlY6JiYyTnZOQjI1uhJCOkYiemaGgl5aJl5FvipqFZ4aZjpR6iYWQinCWmpOhkpKIi5mMgoCRnn2Sj5OMmo97ioSGc3N1a3FudXyLdG6GkI2RcXSAfIGCiHxlcW16fpuUfoWJdJGLgXSJem+Bf4KIfYWMioWNlqiNe4h9fouFd35wbn6DgWJnd3N0bnpiXW9ganRecGp6eHhscnBleV1tbHNtc1haXV9halpPV1dkY2ZxcX+IZV1paGdiZ3GNbmRpZ2RpaIB6d3VvjoRzgYGDe3WCiIV4hXx3g4V6gIp3f4t7e3J5g2prX3Boc39rcW5tcWdva2V7Ym5/eXZwa3Z3iX+jmKKooaebiIyKgY+chpOcdICplJGNhqCMlZOQf3N7doR3eH9yc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWAf3+gho+KkZyXoJOWd4l+gIyHnJ2Jj4aSl5WDiJSZj5aLi42OjZ2KjpCEbomLj5GKnJagm5iVhpiIa4WkhGeHnYqRfouEi4F3k5iRnZGQiImVjn9+j5h8kY2QjpqSfYuAgm52b2ttb3B7hmlzg46XinF3gHSCiIJ5Z3RvdoKbj32KhXqVknp3inVxinyHjXuLhoSJj5yjiHyEdoGLgHh4bmp/gH5ccXJxb294Wl1vYG9qXm9pfHpwbW1qbXdgcG9qcW1ZWGBhYW1XUVNZZWZidXCEgmJda21kY2Zrkm1gZmZfZ2uBdXFycIuAdH+CgHh2gIuAeYZ/d4eGdoOFfIaMgHt2in9qcWJ8YoV8b3BsdGpobmx2d19xfnl7dHVzf4J+pZWarZ+nloWMg36WlIOPnnSJn5OShYqajJWNi3pyd3SCb3KFc3F1iGxubHVtiHeDfX9tblVRgauUh4J5gHZygnmCoIKRgZKRl5uRmXeQeoKLkaOak46IlZiRg4aWmYuTi4iPj4iehZCKfHOLhYiPiJyZnpuWlICUf2mGnYloh6CIkoSRg4lxg5GXj5qNj4yLj413e5KQe46MjZKXjXyIfIBrdmlta2xsen9ieX2OlYF2eoF3g4x8eWh1bXWIlox/iYZ7lJFyeoVxeI57i417iX6DjZGfnoV9fXiBi313cGhrgIB3XndvbWtxclZdbmFxYV9tbnlwZ3BmZnR1aHFrYXdlXVZlYGByU1BOW2VkXXhwiHxeXGhxYmJlZpFpX2dkW2hwfm9rcXOKfXZ9hYF0dX+MeXuGgHiIg3OGhX6MjIR8eZV4ZnFqg1+Hfm9va3pgaW10f3RfdHx4hndzc4V8eaGQmrGcpY6Cin+CmYiAi51+ipiSjoSIl46OjoR2dHZzgHBvhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xvdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2JnH+OgXh6jH+IjIqbm5yalZN5jXdpiZKIbYmkhZOImIOGY4yRmI2UiZaLjYmLcHqViXyOiYqSkYl6hXx+bXxlcm9ra3l5W4B5j46Ben5+f4aOenpodGx1jJCKg4aFfZaMbH5/b4GMf42IfoR7g5GWm5uLfHd4g494c2xlcH+Ca2l0b2doc21TXm5kcFpfa3F4ZmtrYmd4c29xY193YGBWa19edk9NS2BmY115cYp0XFtldmBhZWWOY2BmYlhpcnNta3F2i3x0eYaCdXZ+i3N/hn97iX9yiYeBkYqIfX6ZdmVzbn1liH9vcGuAWmtueXlzYHZ6e412cneKd3mfjJuvm6CQgoV4iJR+fImch4SekI6FjJeEk46HgXR3cHlwboRvbW5+cmNkeHB8bnp8amhsY6Sawdyu76Fza3WDdYShhJFulY+Un5SagZFwhYujl4mOlYqQnZWDgJSPhIiPgJKKipd+h3t1f4l4hoWOm5qXmY6PdYp3cIeJjH6MpYWTip2Fhl6LlJeJjoiOi4qEiWx8l4J9iIWJkY+GdoV+fmt9Y3h0aW14c1eIepGHhXl+f4CFjH55ZnRrgYuPi4SDgIyXhmyCdm6JkYORhX+Ce4GRl5OZkHR0eIeMdXNxZnR5gWFzbW9haHVmUmBwZ2tVXm1zeWByY2BpfXFyblpicmFiV25aXHdNTUxjZmFednOKbVtcZHheYGRmhF9jY15ZaXJrbmtyd4t9c3eEgXh3fIhxg4R9fYh7dIuIiJWHjH9/mHNodXF5bYx7bnRwgFdweXZ5cWR2eIaMaXaAinKAnYiZp5yjkoR8cIyUeHmKnYOEn42OfJWNgJmHhHtyd3Bzam+Ba2lsfHReYHh2e3B0emdgZXzr2rXJw9yIc2xzgHaKmoiMaZePjpyUkoGIcIWIoI6EipWKjJeTfI2SiIKIj3qRi4aPgoB3eIOEcoeCk5uWk5iGjHWHf3GGgoqImqOElY2fhIlhg5WPhYiGiYyHgIdofZR/fYOEiY6NgnGGfn9yd2d2cmhzd2tajH2SgoV8gIOAhIqCdmJ0bYqCkYyDf3+TkX1ugmx5h5CHk4R9gn6Bk5SRl4lucnqMhXRscGpxd39ec2huXGl1X1JkcWhmU19vdnRfb2BdaIJxcmpXZ2hjaVhtV1t1TEpMZWZeYnJzhWhbXGV5Xl5kZ3phZF9dWWtuZW5qdHeKfnNygX56dnqHc4WDfH+Hd3aKhY+Ygo2Ce5N2bHd2eXiTdW54en1YeYVxgG9neHaRgmR2hoVxipaGmaGbooqGc2+Si3J2jpt9iZmIiXuff4SZf4F4cXRub2RyfmhmbHd3W194e3pxcX9pYWdhf9W2jpCmeG5xd3txkpCMhmqYjYibkYuGe2iHi5mGgZKQhoaXjXuMjICAiY17kI1+iYV6dXuDe3GGgJWZjpKTgYl1hId3hICLk56gh5aQn36IYX+Th4OHg4mNf3+CZn2RgH5/goyPkH5tg3yCdGttd3VzdnVrY42Bjn+FfnyEf4SIf3Bgc3KGfJCOg31/kol6cYNme4SLh42EfIV/gZSPkZOEbnB5jH50bG5panl8YWdpaVhrdVpSaXJpYlBicnhsYmVeWmqDbnNiW2dfZG1fblRab05ITmZkXGducYBrWltjc19cY2x3ZGVdXVpsbGJtanN2hn9xb398fHR4hXiFg3yAh3V5iYGSlXyJhnaJgXB4eXuEk29te4B2XoN/dIFtaXpzlHNncoh9cpKRhJqfm6CGhnV1lH5tdpOXfYeQg4qNmXyMmnZ+dnFvbGphdHxnYml1eVpgd3t5bXF+ZWNoaFedj15xcpa8xIR2cZSIj31xlouGm5KMh3JqiI+WgHuUjIGEmox8ioV8e4mLf5SIdYmGdnd9gXJ1hoGelIWUj4ODcoCJdYV8ipmemYeVjpyAiGZ9k4J+hIOJiXKBfWZ+jHx5f3+Hi499aYB9g3Zmb3l4c3ZzbGuOhYqBin94goCFg39rX3J5e36Oi4Z8go+BfnKBaXmEiIyGhXmEfYKYjJCMfW5te4l9dnNuZ2Z7dWJbcGJXbnFTU25zaGFOZnR4ZWBeXVlvgG9zWWVhXmpuYHBPWWtRRFNnYFprbm18bllbXm1jWmJvd2RnXF1ga2ljbGpzdoGDcG1/fH90dYN6g4J8goV2foiBlpB4hIt0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGyTjYWfmKCZhIhufYx2aniYjn6AiYKUl4l5j5ZvenNwbGlkYHN6aF9lcXpaYHJ8eWdxemFlZY+xsndKYlqk2dCWcXuQio93fZOKhJiRjIVua4WSknp5koaBhJiKfIZ/eHeJioSWgG+LiHF1fnpqeYWDpZCEkoyDf29/g3aEeYabmZWMlJGUhIhwe5KCfIKDiINugXdogIR4cn+Ag4qHfGV9foR2Y3BzgGh4cG91mY2Gg4p8dniAhHmBa1xxf3OCiYaKfoaJe4lygW5xhYePhYVzhXqCmY2NhHhub36Ef3Z5ZGdpe3BeWHZaWHBsTldxc2dgS2x2dGBdXFpZdH1zb1dnXWZqcWBvTldoUj9ZZl5ab2pnenFaWllrZVpjcXlfaFxeZWxoZWtpcXd/h25sf36AdW+Ce4CCfoJ/doGFiJeKcYKNcXuGfHp5hJOMdWp6f2tvfnR/fW9ye3qTcG+Bf3hnkouDoZmckoKFZoaDb2d5lYh9foSBmImBfI2MaXhya2tmX2FveW1fYm94XGRrgnphcXZfZWXU6r2LMjo+i45/cXiFiI6NdoKVjH6SjYx/bWyFjIt1fY9/hYGViHyCeG52h4SDl3duiIVsdXt0ZnmCg6eLgo6LhH1ugHV3hXqHnZGNkZKTjIuGf3uShnd/g4yCa39yaIB+eG18fIGKg3dheYSBcWRxaH5tdXF1gZuLgH+FgHN1foFzgW9cbn91eYuDi3uHgHyIeHpxbImEkISLcoN6gJaLin90bWt3gIB0dFxoZ3ZvWFZ7UllwZExacnJlW0lweG9cW1tZXXR+dGhZYltnZW5jaU1XZlE9XmVcXXVmYHVwWllUb2RZZHF5WmhdX2ZtZ2lraXB3fY5saYKEfnlugHx8gX+CenWCgY2ThHCAi253fYB7e4iSiX9oe31qc3tyhntzd35/jHp4hH18a4yNhJudloyAgGyNfWtofo2Len5+g5OCfn2KiGt1cWdoYltiZ3NvX2Frc2BocIh6YnN0XmNkm6CPblw1Wq+1dGmAiHyShnaFlYVzjoqJdnBshYKGdHmJeIl8k4h6fnJndYl+fphvcYZ+aHZ5bmZ5h4Skh4CGjIl+bn92gIJ+jZqIgpSRmImLhIl8j4hwe32Ee2h+bGuAe3ppenaBh4ByYHeBfnFkcmZ0gm11e4aVkYF8goFvd3p9dX5sWXCAd3WMgoZ4iHaCiXp4c26KgZCBhnN/fX+TiIl6bm1qboKBdG1cZ2RycFFaek1bb1xPXHJvZFVLc3hpV1laWmFxgHRgXV1gZmRoaWZOWmhNQGBjW2B2YV11bVhXU3RhWmRvcldqXmJoa2dtbGlwd3ySbGmEiXx8cH5+e4F/gnp3gH+Ki4Nxe4hvcXeDf3uJjY+Dan57bXd4dop3fXiAgod/g35+em2EjIiYo42Eg3p1i3hrbIOHkHh9eoGRgIB+ioNwcnFjZl5ZZl9vb19gZ3Bmam+JdGF0b1thZGp2e4C/nKakyLhxhYNyknx4hpKCc5CLh3Fyb4N6gnN1h3SId5SIeXlwY3eHeoCTaXKEdmd3dWNqfIKInYF/f46PfXOAdIV6gZKQg3mWjpWPiIKIe4iIa3h5fnRnemhsf3lzaXp2gIN9aGB3h31qa3RneoBpdoGMkZR+en5+cHx3fHR+YlZ4fnNzioSCfYNxh4p3eHFwhIKNf355fn12joWDdmlxaW2IgXBvXWdhcW1KZXVLXW1VVFpzbmJRT3N4YFJYWF1hb4JzW2FcaGVlY2tkUVtwSUNjYFtjcF5deGhVVlV3XltlbmhWa15haWdlbm5ocHZ6km5piIx4fXJ7fnmCgYF8dn2DiIaDcHeEcm13g4J9iYuTf3CAe3d5eoGMdIN4f4GBgoR6gHVvfoqLm56IfYV6d4V7Z3SFjI95fn97iIWDdo+AZ3BuX2RbWGVZbXJhYGBwbGtoiW5hdGlZXmRugHep2qrHhoeycYl3b4x1e4aNf3qSiX90c3R+d39vcX9thHSUhnh1a2B6gnmJj2ZxhHBndm5bbXyAkJN/gHmRkn14e26Id4GSjYV0loqRjoeFhXt/hGx0dn5tZ3ZlbXt1bWp3dn9/fGFieIV5aHV1Yn17Z3WGjo2Ve3SAdnGAe31tf1lXdX9wdYWHf4F5bImGdHlsdYCEhH57fXl7c4uBfXNndGVui4Nrc1ppXnRkR21tTFphV1ZWd21iUFJ0dldQVlheYXGEb1xgY21kZF5vY1VeckZCZV9dZmhdW3piUVVcdVtaZ2thVmpfYG5lZmtxaHB1eI50a46NdX52eH13gYOBe3N9g4iHg29ygHRxdX6FgYmNint3f3eDe3yFh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeF59hZiLeIaDdIWGhHeJe2JubVthWlthVmlzY2BbZ25vZodxYXFmV1xja398ys6HuaFqbW2KbHGEcXyDiX56kIR5eHN5dXV8amx1Y4R1koJ3b2ZefYJ6i4plcoJranFjWG16hZuIgoFzlpN2fnxvinGCi42IcpiOkYmFi4N7eH1xcW98ZmhxYm14cWprcXh9fHpdZXmAd2l2eGaCd2d0h4yOlHtxh2pvfoB5bnxdWXN/bnSBi3yCb2+Kf3F2aHd/gYCBd31xe3WHfXpyZnNhbouBanJXal52W0htak1WVF5TVXtrYU9UdXJQUVRXXmJ0hWldYGtqZmNZbmFZZHBHQGdcYGZfXFV6XU9VZHBaW2poXVdoYF5yZmtncWdwcneGeG6VinR/end+eIOHf3Vyf4aFjoNwcHt4dnV6hoWGjIV6fH90i359hoSEh39+fn2Hf3x4dnl4kZOff4x8i211f3hkgoaVhXORim+FhYF6g3RjbmpZX1pdXVRncmRgWGRxcmaBc2JrZVdbYGp/eL6ue6C2bmJzhmhze3F5gYR6fYt+d3dydm97dmVqbmCHdY6Bc2piXn94eYuEZnF/aGtrWlZvd4mjgYR/cZmScYB5doRugYOTiXOViI2IhImFfXh0cm5oeGBqbWBtdmpnamt5d3p2Wmd9fHhlcn5uhHRldYWNhpZ+b4xna3qDdW10Yl1xfWx1fYx7gWZ1h31ucWh1f3h+f3N9bHt7gnt4b2VsYm6JfWttVmlfdlVKaWpPUU5oTVh7aGFOVXVqTFBUVV9mdYNmXmBwaGdhV2ldXGxoSkRqWWFkV1lUeFlOVm1qWV1rZFxZZWNedGZsZHFncm91gXhwmYV2f353f3yFh311c4KIgJWDbnN5e3pzcoWGiIiDeIF9dY9+fISKjoSChHt+i4N7d3x3d5qdl3qKgoZpdn17bIOEkn9xjoFwhYJ+gX9wZmxnV11aXFtTZHBkXldicnVpdXBlZWJXXFxpf3BvcoBziWRkeH5pdHV0coGDd4CDeXZzdW1renFiZ2tnhnSNg25mXV99cHuJf2lteGdqZFVXcm+NpnyEe3aWkHR8c318bnx8koZ3mXyIhoOGg310cHFsZ3RcbGhebHRkZ2Zpem97cllngHZ1aHCAeIJ2YneFi3yUgG6Mam17gnFmc2Vhbnpnc3iKfH5idoN2amtxdXtxenp0fWZ+f4B5d25jZmJuhnxsalVpYm9SSmhqT0tOb0dee2ZhTVV0Y0pOU1dhanZ+ZV1nc2llYFZjV2NwXUxLalhjYVVUVHNWTFh1ZFpea2BcWmNlX3ZnbWJwaXNucn91dJqBd3+Ad39/hoR6fHSChH6XhW5ydHx6dHGEhY+BgHmLdXSQf3yBlY6AhYR9foyGe36AdnujpYp5iIaEa3V8enWDgYt6boRzeYR9gYN1bmpoZVZdW1paU2JtZFtYYXN7aWhtaWBiV19baoBpa3CAZ2tgaHl4anN0dG6EgHp/fHV1bnpoanlqX2VuaIF2kIRnZVhid2p+h3tvaXBnZl1VWG9njqh3gXp8kY55dXB/cHN2eo+AeJV1hoOAhYh2anF1Z2huW2xkXW1yX2dhanhoe21bboJydGpvgH55eGF3hYR4j4VziHJveYByY3FpXHF4ZHJ0iXx5YnOAcGdqeXRxbHh4dXhkg3t/eXdxZGRjbnx9a2tVaGFlUkprZ09HUWtFYXhnYU1Tcl1KTVRaZWt2emVfbXFpZF1WYFZubldLU2hXZV5YTlVsVEpceV9bX2tdXVtjZWB5aGxgb291bm94dXqYfXeAgXqAgIeGenh5gn6Bk4RxdHR/eXZ0hIiRfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aEq59/eoiIg2tygXl1gH+BdG6GbnyAc4qAam9tZGRYX1pZWlRhamdbWl50gmlebWxcYVZcXGyBZXF0fWlpXGt2dWdzdnJthXt9fHh1cmx5Z2l4Zl1lcmh6d5OBY2NUZXBngoV3d2doamBXVllnY4+nbn53gIuPe3Bxfmh6b3qNfHePcoR9f3+GbmR1cmRoaFxrYVxvb1xnX211ZHpoXXSAb3JrcXt9dXZidIWLe4iHgYB4cnV/dWFwbVtydGNxc4V9dWVygGxhbHtvaml7enVyZoV2e3t2cWViZW1zfmlsVGddXFRLcmJQRlZhR2J3Z2FLVG9XSkxYWGdrdXpkZW5xZmRaV11YdmZVSlxjV2dYWUlXZVBIYnhaXV9sW15cYWNefmlqX250eG5vbnaDl3lygYB8f4mMhn51dYZ5h4x9c3V1gnl6eoKMjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj62Me3uHj31lcYd5c3x7dXJuhWx7fmyPemJwb2JlXWVWWVlWY2ZrX11ccoVoWHBuW15XWlxse2Jwd3ZtYlpsc3NndHVwbIR4fn94d25udGRpdGVbZ3RmdnaSeV9dUmZmaoOCdH5iY2lcVFheYmOPpGh4dIOGkXhtb3tpeG58hXt1iXOAeHx4f2hkdmxgZmBeal9cc2tZZV1vb2J6ZVt3fGtubm93eHN0ZHODkn6Hg4l7dnByfnNieGRccHBicXKCfXRncoBlXm52aWRmeXx1bm+CdXR9dHJiX2Zub31kaVNnWFdTTXdfUUpZWEhidWRhSVRtU0pNWldpbHF7Ymxsc2NiWlpbYXdcU0xjXVhpU1dIWWBNRml1WF5gbFtbX2JiXIRpZ2FueHlsb2p2gZB4bYN+gIGTiISBdnOIdIyGc3F3dYJ3fH1+jJCAfpN+cHeVg3yZknmAgHh6foB0iIN0cJmie3p/iZR4ZHWHeHN4dWtzbn5reHxwkXJecG9gZ2JsVFtaV2hjbWZcW3GJZVNybltaWFhgbHZjaXVqaV5ZbXNwbHNzc2mEfH5+e3ZvbmxkaXFjW2tyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJF0bGx7bm9we3x8cYF3f3N6enpjZXVoXWJaYGdbXnZoV2Jdb2hhd2Bbe3ZpanJud3NydWhxgpWDhn2DdnNqcX1uZndYXWxuY3JzgXp0Z29+W2BwcWFfanF9bGx1fnNxeGtwYVxlbGx6YWdTZlRWUVB1W1FPWFFIY3RiYEZVa1BJUFpVa2tqfGVtbnFgW1pYWWxxV1NPZldXaFNURllcTkhydVhfY21jWGBgYV2LamNkbXl4a29pdXmGe2uDfX+EmnyChHl8h26PhnFvd3p9dIKCfIuPgoKXdHeCk4WBn4l1gYCBdH+CcYeCdW+il3N7houGe2V3im5tem5md3B6a3N2coxrXnRuYWdla1JdW1ZnYWxrWlxwjGRPb25dVlhVZ2p0Z2J0ZWVdWW10bW91dHhqhnx/e4d2j3NkZGtuYV1ubWNzeIdrWlRWY2R4fX1xhl1jX2NUWmBZYpWVY25wg4WKdGtofHBmc3dzfGx6dHVven51XmVyY1teVmFkWGF0ZVVfYG1kYXFdXX5waGlzcXNwdHZrbYSTgYh6hHFzZ29+cXNvVFxna2ZxdIF3c2NsdlVicmtaXm9mfWVtd31zc3NrbWBaZGpqd15mVGRUVVBUbVdRVlNPR2RzX2FFWGlPSFdUVm1oZHxpa3dqYVddVVt0ZFNSV2hRWWVUU0haWlBNeHZaX2VsaVliYF5ejm5hZmt5dW5vaHZ2f39sg4B9h5d7gIeBiX5rk4hyZ3SAe3WAgn2Ijn+Lk3J8ipGFh5+Ge3+GjHOBhnN+gnZupYxygY2LdndteoxgZHtwZnhyeGxtcXaCZ2R7bGNmZ2hTX15VZ19sbltebY1oTmltYFRWU29nc2xmeGRkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcXl+Z1pWWGBseHx7cIRfYl5nV1hfV2SbiGJrcIGHfXhsa3luXHdxbHtqdnNub3uAclhpbV5ZXVViY1dkcGNTXmFoYWJsWmB+a2Zrc3VubXd2bGmFjH+JeYdtcWZxfW5zbmNaYWlpb3SCdHNfaWxTZXFkVWJuYnpjcXd7dmtwbWtgWWFnaHRcZVVhVVJOWGVST1xPT0hkcF1jRllpTUlfS1htZF94aG59Y19UX1RddVxUU2BmTl1hVFNKXFlQWXR1XV9lbGhYY2FbXo1xY2dqeHFzbmd2dHqDcoKDeoiOfnyJh415bpCKdGxzgnR/f4eFhpKElY95foyPh5GbhIB8jIVzgIFzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2Njo6OjY6Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyNjIyNjI6Ojo6Ojo2Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQk6lr62tra6xYUBERERERTguLy8vLytIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzQam2tLS0tLhZMDU1NTU3JxwdHR0dGDqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e31+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmako+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGj5CQkJCQkYmFhYWFhYWEg4ODgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpOQipGNjY+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Mi4uMjIyMjo6Ojo6Ojo6Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fX19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6HiYeHjIeKkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQj4aKh4aOhoyPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPiYeIh4yIiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGh4eGiIaJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fn5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNioqMiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Oj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCh42OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnl9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjYyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3R0dHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFFQD46PD4+PEVEPj9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJydHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk5Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5NTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo5OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1xcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0FAPzw7Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5e3t7fX5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPzw7S0c4ODo8OT09QD06PDs7PDs4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcXJycnR1dnp7fX18fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz4+OTdkbDs4Ojg4Ojs9Pz88Ozs8Ozo7Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x9fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF7TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQUA/QEA9PUZJSmt5TTw+PT89PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fX5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX1RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJFQ0RCQEBDW0FRdH2BfXtcP0BAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA/QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBvcXBydXR3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUFCQEFvY3+EhYKDfmk/QkNFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0RFRkZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYCAgIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUZDSnaAgoGEe4CFdERERURDV3WGiYp+WEdJSkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSUlRdoF8gISBg4hwRENBVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDQ0RGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSlV4gX6ChIaGh4NVTmyEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdXZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKWH2DhISBg4eHiH1/hoWEhIaGhoeHhop1SUlGQj8/QD8/Pjw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9ydHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhJSUtRdoSGhH6BhYODhISEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJTEhxhoWBfoGDgoOCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NzM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNES3uGhIGCg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojo6Ojo8ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUVdrcnJ0dHV3ent7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1NfoSCg4SEhISEhomKioiHiIiJioqMiomJjHo+Ojg4Ozw9Pjk6Ojs4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDs5Ozw4Ojo7Ozk5OTw/PDxBQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo5Oz8/QUp9g4KEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFAQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD4/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PTw+QERDVYKDhIWEhYSGiYmIiIaGhoeIiYqLi4uKiouKi14+REdJS0lJRkdIREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6eXp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BP0JDR0VohIOFhYaGhoiIiIiHhoaGh4mKiouMjYyMi4qKiFdHTExNS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QEBBP0JCRkZLSnWEg4WFh4iIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAOTg8Ozw9Oj9APkBAQ0RISFBbf4SFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSklHRUpIREpIR0tKSEpHR0dLTE5MTEhISUpNUE5PTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A5Ojw4PT47PUE+P0FDRkhKVHGDhISEhYWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLXlJSUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUFBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAgH9/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUZJSU5UeIWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVFRktPTk9XVlFQT1FTUk5TVE9NU0xQU1VWUlNSUExLTU1NS05HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZFR0dHR0hGPkBCPT89PUI/QkNGVk5FTE5NUVZ7hoSFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZU1lYUlpmUFVXWl1SVFdRUE5SUFBQUUtMS0dISUhFRklISUhJanN2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUJDR0VERUxYUk1TVFNWWHyGhYeGhYaHiIiHiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1XXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NSkxKSUlMTUtPTVNvdHZ4eXh3enl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1dZWFpZeIWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUV1hYWVpugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p/ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlFVUlVTV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5cVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiYeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlBRTktSVFFNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlNUWl1tcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVVFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBDQ0BDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hCQ0hHSEpHREJBQ0BPUE1SZHR1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xzdnp7eHl1cm5zdHN5eH5+g4CDgoKAgoCCgYFrTEc+Pjo7PkA/Pz4+alBLYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQj8/PD1CPkpNRlVvdXV2c3R2eHt8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBQ0FbXE97Tk9PTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXZ1dnd5fHx8fXx8fX19fnx+fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfX2BlYF1ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGQ0xRT2FXUlhRUFNTUlVbT09RVlBNSUNGPjo6NjQ4Njk3OTozNjU3OTU8Qj1mdHR2d3d5eXt9fXx8e3x9fX5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1RUU1BRVU9MUlNUV1lUVFhRTFhZWVZYWFZYWV1XV1hoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUE9TWldUVE1RU1lTXGVVT1NUUk5MSUhDP0E6OTg4OTc4ODQ3NTc4NTg5R25ydXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk5PVFNUXFZSVVNTT01MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3p6e3x9fn1+fH19fH19fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xeUlRaVldUU1ZUUlhYWVlZUlVPSkdQUE9PTVJKT1BQUE5OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUkxJTEtPUVBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRT1BQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTU1NS0dFRURCOz09PDk9RzY2NzdEbnF1d3p7e3x8fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZ1NRU0FHVVBPUlFQTU1OTEpMS0xOT09RTU9PTUlNTElMS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPz09QUBCPT5FSEZERkZJR0tKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT1BMTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRT9DQz49Qkc/Qj5BZHF0d3t6e3t8e3p6d3x3eX1+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz9BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVQTU9OV0tMTktMTU1MTEtOTlNkTUpMUkhJSkZBSUpMTU5LR0lGQkFCQD9FRkVIRExvcHd6enl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0dLRT9CPTk5OTo/Qj88QUJCQURER0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVEtKSU1URklJSkxKS0tJSkxNT1BSUEtHQ0xIRENKSkxNT01JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEtDRkdHR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTU9HSEtGSEtESElLTUhKTEhJSkxKTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbml3dnZ7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZHBGS0NGRUZERUVGRUdDQ0A+PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkNCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NR0lMR0ZGSUlMTktKSEVPSUNHTU1OTVBOT09NTElISU9TUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VFREJDQkVAREI+Pz46Ozs9Oz0/Q0E/QUNGR0pHSklMSEdHR0ZFQ0A9RUVCPkFEQ0NFR0lJR01QSUZGR0tOT0tGSElGRURESUlIS0lGSFBLREpNTFBOT05PUE5KSklNUlVVUk9XZGFhbWdwcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQUFCRDxCQT5BPTo6PT87Pj9AQj9AQkVHSkZJR0lHRkZGRURDQUFGRkNCQkJERUVHR0hGTFBMSU9KSkxLSUdIRUZFRENJSEhLSkdLUk1DT09OUVBPT05PT0tLS1BVV1ZVU1hfXl1pYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNRkdFR0JCQUREPEFBQEM8ODk9Pjo/PT9CP0BAREZIRUhGRkhGRUVDQ0VCQ0lGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTk5QTUxOU1dWV1hWWF1aXWRgaGJqaWdrX2RlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRkU8QENCRDw3Oj0+Oz46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpMRklISkhFS0tMTE5PU1RPSVRVVFFUUFFNTlFOTVFXWlZaWVdaXVpYYWBgYF9oZWNgZGVnZ2poaGpmaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQkNIRTxARUJEPDg6Pj48PD1CQj0/PkFCRkNFQkJIQ0NERUZGR0dJRkdKSENJSEdJR0ZESEtJR0tJTUtKS0xITEpNS0lOTE5OT1JVVk9MVlZUUVRRUkxPUVBPVFlaWVxaWlxfX15gY15cYWNrYmBkZ2hyhWhnaWZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXRydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCRUdFPEBHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRGRkhIRkhHSUtKRUpISEtIRkZMSEhISkhNTExMTElNS01OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZV1kYGVnYGVoamNzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF3dXV1d3Z1d3NndHJrcXJrcndvd0lKTElLR0JFREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRURGR0VJRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tLTU1KSk1MTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYWBjZGViY2ljZGlqZ3aLbGtpaG1vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3d0dXV3dnV1dWVxc2twcWpydnB3Sk1MTE1HQ0NBRDw/RUVFQz1BQUNCQkNFQUNEQUFFR0NIR0hHRkpGREdKR0dKRklMSElKTUpNTEdLSUhLS05RS1JRTFNNS05NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGViYWNpbmljaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdFQUBEPj5ERUZDP0NBRUNERkNDRUdDQklFQkhKSUhIS0ZES0pHSEpISUtHSkpOS05MSUxISk1LWmZKZFxLbFJIT01fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsa1Vfd3ZpamhoZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkNDQ0JFRURGQkZGR0RESkVFSkxMSkxNR0dNSkhKS0dLSklKSk5MTU1MTElMTUxbc2JkcF5sbFVNTmZzXmdmcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXG91Z3BNS3J5dmtiYWtlZWx4bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQj89QkVHQkZDRURFRURDSEhHREVLSEdLTU1KTUxGSk5ISktKSUtKSkpLTU1OTU1NS05NTVtyb29ucHBsa05QUWxYTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBcYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHByc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRkVFQkFCPT8/RUdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklNS0hJTUlLSkpLTk9OTk1MTk1MXGhkdV1scVdsTlBRblVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFkaXR5a29ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZKTEtGTUtMUlJMR01NSE5KSEhOSEpKSUhOT05OTEpNTUpac3Bwb3FxbWxPUVNvWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqW150Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b250c3Z0SEtISkNFRUVAQD5DQ0FGQ0hKTUlGQ0ZKTElHRktNTEZPSktXUktHS0pKTklISkxJS0pJSEpMTU1MSUtLS1NrYlppXl9qY3JyWl9aam9gZWVVa19jW2FiUWBtaFxqXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGtucHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcnV0d3JISEZKREVERkFAQUVEQ0dCSEpMR0ZDRktMSUVGSk9MSU9JTFtRSkZISEtNSUhKSUtLSUhJR0tLS0tHSEpKTExMS0lLTE5UW11UUFVNUVBOT09VUlBPUU9PUUpKTlBRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1enl4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHSkxIREdJUEtMT0tMV01JRkVISUpISUtITEpIRkhISkdHSUVGS0hJS05MSU9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRUpKSkZFSEhQSkxNSk1SSUhFQUhGSklLS0lMSkhGRUpIRUZHRUVKR0JKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY2BZX2JbYF5bVFlYWl9eZGJiYWNmaWVrcnBvcHBubneGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRUZJSU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVCRkpEQEpLSk9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJiYmNjZVpSWFZWXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eHl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUxEREpKTU1MTEhKSkhKRz9HRk5LS0tNS0tLSUdIRERAREFISUE/SUpHUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFRXV9hY2NjY2JcZGNiZGNmWFFWVVNcWFthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdJR0dKRkZGSUxKTkVESkpMTkpMSUtKSUlHQkhIUU1LS09MS0tJSEdFRD9FQkhIQUFHRkRUXVleWF9YX1tdVVhYUF1dUUtKV15YXltdVlphUlJfX2JiYGBiYmBjYmJkZGJYT1JRU1xTXF5dXl5fX2BkaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSk1QRUdJSktOTExJTEtJSUdESEtRT01MUExMS0tISUNFQUVDSEdCQUZFQlZVRVxUXVNWYFhOVFVOWltNSktVYGFbX1hfXmJdT1liXGBgX2JjYl1iYldfX1RQT1BRWVNeXFxdXV5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUURXX0lHR0hERk1KUFBGSklKS05MTEtNS0pKR0VKTlFRTk9PTU5NTkhLQURBQ0RGRENBREVBTEhDTExQT09NRk1GRkhKSEdMTE1PUElMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlFVVFxZWVtdXGFhZWZjaGRrbHFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5NR0hZTUhISkhHTUxRUUlMSktLTk1VTk9LS0xHR0tQU1NOUE9OT09PSExGYEVEX0xEZmNETVtIXlxzbU9NVm1ZTENQX1VsV2dKXVdVXkRMUVVMTVNWUVJUWFdUWFVUXFRQZlpoaGRZVGtUWFdVW1xbYGBhYmJiYGdpZ25saHJ6fH1+gYSEhIODg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPT0pMTUdITVFbWU9QUE5PUFBKS1F/UUl8WVlyc1dQbUhxbm9hVlBxcXRPQmtzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl9WVVd/anR1dV9hdl9ZY1xcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoOEgn99foB2eHptdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMTE9IS1JYV1FOT09MUVROT1FQS0tOR01QU1taVFFST1BQUEtIWnhdVHhkaFlSU1B2Z3RscGJuZmtSck9Md21qcnBzcnFycG9wgF1menV4cXF6cX5yfWt1fWJSaHxlc3Nvc3N8fXB+eW9/cl9gYGJiW2FgaGtua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hLUU9NTkpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUVRQUFFSS0dneGxjeHFtWktMVHlwdW11Ym52UGRlSWV2cW13b4BqZnh4aVhyUml7bWlqenp+bHh6f3Bnb1h2dmp2dXCAYXNofWlseHxvX19fY2JcX2RlZmlqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN1em58fXl4cm5OSlJ0TkNCRVBQSEtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlNKS3JvdXVxdXFkaGFWbkxxcF5HaHlXdlRLaHl9eGB5e3NuYV5tb2RTZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW18a3B2dXheX19iXl1fZWRqaGhlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUxLWlZIR0VHUlBLTE5LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT05OUUlSbUhpd0tgZHZ1VVdsT25se3Jhamd/dlVLV2tofWxtbHhgW3B6e19genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWhmZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraG1tcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUE1MU1NST1NSV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9QSkhRTlBVTEtLUlNSUlRQVlVRUU9SUlhYUU5QVVRYWFhbW1VTU1dbV1hXWlBTVVdXWFFdWFZdVVNPWFJWV1dYWmBbZ3JeW1xbXV1fY1pfY2NlZ2VjY2JaY2NnZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTVJRUExWVlRQVFVYVVpVUlpdVlVUV1VZWFBPTE5XVVFOVVNOUE5MUVBLSVFRS1FNS0tPUVRSUVFTU0lJTU5PUVJRUVFUVlJYV1xXU1NQUlVVVlRaUU5TUldVVFlWVFlVU1JVU1RVWFhXXlpfYV1cW1pdXWBjXF1iYmRnZWVlYllgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGRmaFFKS0tOT0xNVFFPVFFRTVhXVVRWWFdXWlZUXGBWV1ZZVVhUUVBLT1hUUU5VUE5RTktTUE1OVVNOUk5NTlFTUFRRU1RVTkxOT1FUVFJSUVZXVVlaW1lTVVJUWFdXWVtTT1NVV1VUWVVWWVRSUldVVlhcWVtgXVZZX11eXVxdYGFeW2JiY2hmZWViWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlRUT0tPV1VQT1RQUFFOTVFRT1JYU1JRT01PU1VOV1FUVVVPTk5RU1VVVFRSVFhWWl1cWlZWUVJXWFZbXFZQU1ZVVVZZVFdXVFJSWFZWW19aXmBfVl9dXmBcXGBgX19aYmJkaGhlZWJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU05OUlBSUk9MUFNSVVpVVFBQTFBXVVFWUlNTWE1PUFFUWFVVVVNVWVhbXl1cW1ZST1VWVltbV1FTV1VWWFVTWFpUU1FZV1ddX1tfX2BWYlxgYV5gYl9cYF1jYWNnaWVnYVpjYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXl9bXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5f2NcW1ZWWVJOT1dTTlFSUVNUUkxRVFNZW1dVT1JOU1hWU1JUUlJaT1FTU1ZbVlZWVFZaWF1eXFxeVlNOVFZWW1xWUVRWVlhZUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGheXGVgYWBhY2RfYl9ZWl9bXFtZWFlXV1pbWmFdXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dXGBcYFVcXWhqcn1ybGhcVVlXUU9SW1NSUVRTVVVUS1JWVVpaWlNPU1JVVVVTTlZSU1pSVFVUWF1XWFhTWFxYXl1ZW15VVU5WV1deWldRVVVYWFhUVlhbVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZ15dZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBbVVVXVlRUVF5eYF9eYlxgVV1eYmt5dGx9bFpVWlZRUVRcVFRUVVVWWVdMUlpWXFpcUlBVU1dVVVNPV1JTV1NXVlZbXVhbWVVaXlhfXllcWlJXUllYWWBaWVNVVlpZWlZXWVxVVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGZlYl9kYV9hYWJiX2BeV1heWlxcWllaV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hSV1VTUlNYUlNWVFlYWF1eWF1bVV5fWF9fWFxWUVlVWVpaYVhcVVZXWlpaWFlZWlhWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmJbZmJoZmNmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWldUXFVWV1lXVlxgYWJjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZXFpYWWBWT1RdW2BhXFVVWVBUVlRSVlZSU1VXW1tcX15aX1xWX19aXV5ZXlZTWVhaWV1iWV5WV1pbW1taWllbWVlfX2BgZGNkZWViZFpiZmNnZmVeYWNgY15jY2llZGdfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllVWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVlNWVFhdXV9gYF1hXVdgXlteXFteWFZYWFtaX19bX1hYXVxdXV1bWlxYWl9hXmBkY2RmZmZiWWNmZWhnZF5jYV9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWlhaWFdbW1pbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWJjYl9hYGFfXV1dWFdbW11dX19cWl1jWFlYXWBjZF9SWVlQV1ZXWFhXVldWXV1eYGFhX2JeWWFdXV5ZXV5ZWFVXW1tgXl1fWVleXV5eYFtaWllbX2FfYmRkZWZnZ2JaZGZnaWdjX2NeYGZlWmhpY2ZpY2ZfYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFhaY2VjYVJcWU9YVllbWllXWlpgXmFiYmBhY19cYl1fXVtfXllZVFhdXV9fXl9bWl5eYGJiXFxXW11gYmJjZWRnZmVnZFxlZmhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1ZYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYWNiYWFdYltiZGFfY2JiXVxbWldYanFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJeXFNcX2BjZGRmZWdmZWZlX2ZmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t6enp7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t6ent7fHt7e3t7e3p6e3t7fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiI2xtbS0tLO1lYeJiYmJioyNjY2Ojo6Jf39/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyLkbvAv7+/v8GaioyMjIyMjpCPj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4ODhIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl6eXp4b29vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9gYGBgYGAgX58fHx8fHx9fX19fn59fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z4e3d6enp+eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t6enp6enl6ent7e3t7e3t7e3t7e3t8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8e3x8en16d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x7fH15fXl3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3enx8fHp7end4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp8fH18e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4enp5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2VmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKCgoKBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCKkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiYOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjI+LioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjImHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIyLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyIhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpKQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoKCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYOEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgoGDg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDgoODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+QkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKCgoOEg4KCg4ODgoKEhIODg4KDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRk5KQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBg4KCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYGBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIGCgoKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCCg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgYKChIKCg4SCg4WFhoSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgYOCg4WFg4ODhIKIjoOFhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhYWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjYyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgYGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCBg4KBgIGBf4qZhYGCgoGBgoKBgIKCg4KCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgYKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+Ni4eEhIODgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gICAg4GAf357gZiMgIGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgIGJg35+f4J9j5WCg4SCg4ODgoCAgIKCgoKCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhYSDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhISDg4GBgoODg4ODg4KBgYKCgoKCgoOCgYGBgYCAgICAgH+AgYCAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIKBg4+DgYF/ioSDkoWFhISFgn99fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhIWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIuIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISEg4ODg4SFhIKFkoKKhoWCgX6ChoeGg4F+f35+f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGBgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4eSgoaEh35+f3+FhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeGhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoODhISEhYSDgoKDg4SDh42BgX+Hgn5+foCAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoeHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4SEhIGAgYuFgH+AgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4WDgYCDg4KCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhYKAgoODg4KCgoOBfn19fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIhIOEg4WEhIWFhoiIhoWDgoKEhYeGh4aGhIKCg4SCg4OEgoGBgYGBg4OEg4SRkpGOj46Lh4WGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4mLioaEhoSChoeDf4GEg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBgoOEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoODhIWDgoOBgoODhIWEh5KRj42PjIqFhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKBgICCgH+Bg4SDg4OCgn99fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+f359foOEg4KDg4OCfX1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBf319f4CBf39+f4CAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB/fX9+fX5/g4ODgoKBgX99fX5+gICAf359fX18e3t7enp6eoCAf35/fn5+fX5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39+fn9/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKDgYGCgIGCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6eXl5fYB/gIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISCgoOEgoKCgoKBf359fX1+foB9fX19fX19fXx7enl5eXl5gIKCgoSDgIKDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgoSCgICBgYGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaHhYWFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX9+f4F/gIKBhYWFh4aHh4aHh4iGh4eHhoeHhn99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIWEf318fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImIiYeFhoWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoKBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9g4F/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn99fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4GAgYB+fXuKgn2Af36BgICBgoGCgICAgYB/i5OPjIuNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fH18fH2Af4CAfoB+foGTkYyMjY2OioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNi42OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjIyLjo2LioaEhYSEhIODg4KCgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNi4qIhISEg4SEg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx8e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeGgoSRjoyLiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt8fXp9fn5/gICDh4mJiYqIi4mFiJGNi4iJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gIGAfnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mMkI6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+f3+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35+fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjYuIiIWEhIKBgoKCgoKCgYKCgoKBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjYyKioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBg4F+foCAfn6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH18fX19fHx7fHx7e3t8e3x8fH18iYqIiIWGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYB/gIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaFhoeFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHV0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIGBgICAgoF+foB/gYB/gICAf359fX19fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+f35+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChH+DgoKCgoKDgYGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/gH9/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOBf4CDgn9/gH+Bf4B/fHt8enx7fIGAf4J/f4GAgoKBgX9+f4GAfoGCgoOBgYODgoOChIKBgYGAgYKAfoCAf399fn59fX1+fX57e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH6AfH19foB+fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgX9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f319gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fXh+f398fHx+fX6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIGEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzd3ZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSFhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4ODg4KBgoOCgYOCf4F/f39+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fYB/fX5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOBfHx6e3t7ent3dnh1cnN2cXh5cniFhYWFg4SDgoKEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3yAfoCAf4GAgH99gH9+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f32Af35/f399fXyAgICBgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn59fXt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6enp6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f4B9fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+gIF/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGBgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af36AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+eoGTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e319e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgoCBgYGBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuNfnd3eXx8e318fHx8e318fX19fXx9fH5+fn9/fnx7fH17fX17eXp7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGEg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgH+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgYCAgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH18fHx4eHV4eHl7fHx9e3x8fHx9fn9/f39+fX1+gH+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhYODhIGBg4CCg4KBgICBgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgIB/gIGBgICAgICBgYCCgoKCgIKBgYGBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fXx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3p5dHF1bndwdXpydnmFhYKDgoODgoOEhICAgoGGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgICAgYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCgoaDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9/gIOCgIF+gIKDgoCBgYGCgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enNweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4OChIGEhIGDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYODg4SBgoSCg4KCgYKCg4GDhIOEhISFhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/ent8enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4WFhYODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+BgoGAgIKEg4OCgYKCgYOCgoODhIODhICChIOEg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF+enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoaGhYSEg4OEhIKEhYWCgoODhIKDgoOCg4F+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f398fYGBgoKDg4aDhIOGhIGDiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCg4OBg4J/goODg4OCg4CChYODg4OEg4OEg4GCg4SFg4KCg4OCgYSDgYODhIOEhISFhISEhYWFhYSDg4R/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+BgIB/gISEg4OEhYOEg4V/f4KKi4WEhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OCg4OFgoGEhIWFhoSCgIOHhIOEg4WEhYWEgYSDg4aCg4KDgYKChIOCg4OFg4OFhYSFhYeHhoeFhISFhIB/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWKiYSEg4SFhYOHhoaEhISEhYSFhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXqDf39/f4SEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFgoGEg4F/fn5+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4OFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4KDfoODfYF9fn59foKDgXx/gH1/gH59fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4aDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfX9+fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhoWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2d3em5wdYJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIF/gH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFhIWFhYSChYWEhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoF/gYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWGh4eIhoSGhYeGhoWEhYWFhYWGiYmHhoSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIaGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn6BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYeGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoaFhoaFg4KFhYaFhYOFg4SEhYSFhYSFhYOGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5+fH19fnt8fH98e3t9f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWEhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGg4aGhYaFhIaGhYSEhYWDhYeFg4KChYOEgX6AgHx7fX57fHt9fn17fH59fn58f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaFhoWGh4WFhoaFhIOEhIOEh4OEgYKEhIOBgICBe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eGhoeEgoSDhIaFhoWEhISEhIWGhoaGhoWHhYWHhYWFh4WEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aHh4aGh4eFh4aIiIeGhYeHiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn9+f3x8fX99e319fH16eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4SHhYaGiIaFh4SGh4mGhoiIh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYeGh4aGhYaGhoWGhoSDhIWCgYKBgIODgoJ9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWFhoSFhIOHiIaGhoWEhomGgoaEhoaGhYWHhYeIiIaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhYGAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SGhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYWCgoODf36AgICBf4OAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhYSEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhYaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N/fn+Af3+Ag397gH19f4J9gIF9foF+fX19fX97f3x7enl6enl6enx5enp6e3t8ent7e3x9fn19gH19fHx9gH99fIaDhoaGhoaEhYOFgoWBgYB/f4CAfn+Agn1+f39+gICBgoKEhIOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgICCgn99fX9+fn+Efnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x8e31+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+BfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn18fn58foN+fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fXx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXV1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1NXU1dTU1NTV1NTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fY3N3d3d3d3d3d3d3d3d3c29zb29vb3Nvb29vb29va2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5s3hzc3Nzc3Nzc3Nzc3NzeoKBgYGBgYGBgYGBgYGDi4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpZkyKSsrKysrKysrKysrKTVFQ0NDRENDQ0RDQ0NDRlNTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKabOC8wMDAwMDAwMDAwMC87SUhISEhISEhISEhIR0pXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamroEU9Pj4+Pj4+Pj4+Pj49SFVUVFRUVVRUVFRVVVRWYGJiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs/Oz87Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHKysrKysrKysnJycnJycrLy8vLy8vLy8vLy8zMy83Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7Oz9HOztLUz87O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW2NfX19fX19jX1tfX19fW19fX19fX19fX19fY2NfY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7O0cGn0dKooNDP0aSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7O0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Pz9Gdj8W0nqOn1q+foanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pz9O6r6q4n5qTncCemJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz8/Tn7GdqJqhnLSYnKKdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/RwJyJnp+blq25hp6Wr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P1KOigaCYm4GglnibhJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0cSfgXuahZ+oiJx5n6mFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NWrr7zA03a0sKacir2tppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyYd/haCVppeXnaWnlpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhxtPT1ZyYwqKrpJvQn6uknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNLR0teoh87GkI2318KPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHSz8XU1MfD1dHVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tPU0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS1try9vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N4ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2RqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcLGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vbq6tL+4tbizr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrq1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pnZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVkZm9pZWtoWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYlxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Bv8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fY15hYU5ITT9FQD9EQzw7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRDxBQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3KxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysq+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE9Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcLDu7iztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVxfYFlTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7jAsK+1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6yvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZV1aVUo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcK+2MC0sbSyt765s7WyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHD0NK0yLS0sLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BPklCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq6svLK4ube7v725vsC0v7u8uri+wrzCydXJl87EtLK0trK0r627uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxu8W8wcvNwo6nybm0tLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDs6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrK6ure3uLi7tK+0rLCvpJywtreNibW6sq2zsK+srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lo5ujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxr73KsqaorZWLjXZwf4SfjIWht7SrsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbGjpaieoJyVk5CPkZCYkJaVmJafmJuZm6OZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0VAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqW91KuinZyAbIF0YWNlcoOKm7e1r6+ztaqnrayjnJmUjpGWl5mZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWm5eXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yepKiurayrq6+qr6mel56lnZ6lpqSfwM+pknx3gV5rkXVvZV9ukKC+tLGxsLitp6GcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSpsa+imZydnqGZm5uamJmblJablpicpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVUxSTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOfnsLHmXhjYYpcV4KLkIhsUompw7Otraywp6CfoqCXkZSboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rLG0pKCdpZ+soaGioKCamJaWoJubmKShoJ6koZ+empyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tnpmona6fp56coZ2empqSmZ6coaKgn6fJuYhhWnaXWlhhbZCPfk50tMazp6qsqqWfn5mSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnn5mmoJ+fp6ilpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3pLCmn56dnZeYlZmem5yjn52u0apzWWSMiVhbb2m3rXZaWaC6s66uqaumoJ6eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Svs66qrqOdq6e2sayir6aho6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rxa2t1cnBoV1tRRVRIRElPSD5FQTRFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+drM6eYF+Ih3d4hYd1no1ycnOUsK6npKSioJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLAxb65tLm6tLu3sLWyqrqxrru3vrq6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Rob3hqZVpbRktMRURTTERCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8+PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpybnq3JmFZvn5l5kpx/a3p6jaayqqCanZyfnpqXmJeSjI+Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM09DT08zKwsXGx8rHzr/I0czHxcbEwbvDwL6+vrW9s62/v8LCxsTHxK6+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPzxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKWorK2qoZ2jn5ydmqa3zJFUeaCkentuZm+RqbGspJ+doJuYl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytLX0dfS1NbT08jMx83NydLMztPMxcfJysHFy8bIyMW+wrKzyMTLysrOxcq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOepKOfoKSqw86KWHqGhG5ocZCur6WdnZ2hpaGempWUlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU0s/Rw9DT1tjV1tLLyc7Ry8bN0cnS1dbZ1dfT1tjO0srP0czO0MzSz7/HxsrDzMzLzs/Fxse2wMq/0czLz8XJx7/DwsjOzM/Qz83KyM64t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkdBRUhJPjtAOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcLFsbaooqWmoaKrtc/Pj2R7fW9ulK2tnJWYoJyboaKfnJ2alop3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czQztPX1tPV0M/S09HJ09HH0NjX2NHY0tfZ1dbMz8/JzdHLzs+/xcLHxc7N0dDRyMvMwMrLxdPOy87IxMnGxsjMytPT0dXP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNRTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaauuKirt9fU1dnZ0c7QwLzMybe/r6erqaOksbTRx4xvdnGEqayhmJaYmpudoZ2anJ6TfXFlY2JfX2FgX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxtHUytDU1dbO0tDY2NjXy8jNw8jOzMrLv8m/x8jNzs/L0M3Oy87Ox8vP0MrOysLJxsnMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNV0U7QDwzMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKWtrr60sMDY0tfa3NbPzcvE09DCwbGqra6rpbKxxKFtbG6QoZyVk5ecnp+fnZSWmJSJa15eXmFkYmBgYGFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1cq/ysHFzMLIycLMw8XIysrOys3M0M3Ty8XIz8zIx8rExsDFysvNz9HG0M7NzczPxcfAt7m9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeHBxa21nYGBxaFlYaFZMRkxJUFBCO0Q+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD87PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHwrjL1dXZ2tvYzM3PyNbVxcO3sLWpoq2suLyhb22Omo2Ml5WQlJKRlpaWkIx8ZWJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS+xsm9wsfJzsTBx8DHzcfDy8rLz8fDxNDIxsHFx8S+wMfLy8vOwsrLyMfM0MTFx7vHw8jIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndudGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvr26zc3G0NXV2drb2NDKz9DS1MnEuLy8rqW2qr66oXeJlo6Nlo+Gg4SEgn6FhX90YFxeXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPHysnIysjBxczGyMvNycTCy8nBwsvQxMvIv7nBu8XHvb/Gz8vDv8O7ycbIu8jGxMq/vcLLxsXEvsW8vL/DxMvFxLzAycLFx9LEwMi/ysnGx8bQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWao6CblHt2c3RmaVphbm1aW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzLz9HMx8LDx83OzszVz9XZ2NnQzNPOztDKw7bEv7Syuq++toh9lYyTl4Z6gIWGgHZ4dXJxX1pbXWBgYmRkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wMHBxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw768wc3Dxr6+tcG9w7q8xrvCubO8xcTCwra/tbW9v7rLw7y1usi6v73Lw8HFwsXIxsjG0MbCzMeyx8nDzs3BxcPAvbK3sLKnqKi5sKWtsKutrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsPEyM7Sy8rKx83Oz9LJ0MbV1NbXzszQxsvHycS8yL+usLa0t6+CjI2Ki4V4gIaGgH6EfHR1ZFxcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i1t7Sys7S6tb6xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wMK8uL3GwcO7ta6ytrq+tMS3u7WruL29v72wuravtrqyxby2rru/tLa0xb2+wsXAw8XGyMvFwMbGu8jLv8/Kx8PGwsO2w729trm+x7+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzM7IysnLycrEz83Sz8/GycTJxMK+u8y6rrK3tLKrjJCGiYl7eH6Ghnd4gn10aF5dXV1fYF9gZGFeZGVjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+4uLWwq6ynnqKqp56rrbOtqauptK22sLKprqassry6tsO5urqxq7W5u7TCurC/sb28u7a8x7nCtq2qqLCxv7W3vK+wp7KztLu8q621pa62rrqxsKq4sK27rru4u8C/vbnCv8fDxcG8xsHIy7jFx8W/xsPDucTGwrvGyczLs7nCvLqyiHJ2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbO0svDxsLF0MfOwsTGwMXFw8PKwsnLwcK/xb63ubnHs6+0tq+tppGJj5F8eH6KhXp7hIF3b15dXF1dX2BeX2RjYmNjYmBfXVtbWlpdWlpaWlxkbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwpKafqq21trG9ua+3r6iut7S0vLi0vK+4ubSxvMGxwK6lqKKrsbKzp7yqq6irrK20s6WoraGkrqmypaeoraWot6ywsre6uruxu72+vsS/tcHAx8i3v8DEt8TCv7u/xMK+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0dDNxMi6uszCzL+8yre+xL+7y7jCxMO3usC6tbO5wrWxsrOnqZODiY2BfH6Afnh0f3xzd2ZfXVxdXl9gXl9jY2FiYGBfXV1cWlhaW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnaSbmJKho6qjop+lpaelrJ+dm6SmrLKvtrensKynqrSqtLqxtrWttrmxr7q5sbekn6SfprGnq6i5qqSnqKinsq2gp6afm6SlrJ6fp6SfoLGtrayytLK0sLW8trvBwbK6vsPBsrm5wrPAvb+1uLu9vrzCx8TCw7+/xKCDd3BrYWZfa29gVFleSE5nT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbWgnpSdoaa6tquzs7uzxNDJy8PHubjJws3Aucu4vMa5tca5tcDDsLrBt7KrtLu2qqyupZuEh4eBfXp1dG9ta2pqcWleYF1cXFxeYF9hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlZqhlpuimJaNnqGippufn6Oloaeem6Kbn6qwrbG1oqmqqaurpLS5rbewrLK1rrK1rrCqn52eo6KypKapuK2ipqafqKyqmZ+gnpmdn6WamqOcm52vqaunqqusrbCyuK+4ubuwtru7uquzs7mzvbS2sbG1tL+2vcC9w8G6u72Xg3pya19lXmRkWFRXXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bQyMjBx7y8xcTPv7rIubnAubTDtrK9vrC+v7iopLC0saGoqZ6IhoeAeHNucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtyjaidlJSUm5iboZaWkZyhoqidm52lpqGlnKCgmpitrq2usqCloq2rpqG0sLGxrKivsqe6s6a2oaKem6OhraOhqbWqoqOmnaWmo5aYnpeZmp2fmpednZycrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7Kys7ezrqmsrrK4sLq2ub2/t7KxlIV5dWVeZV5bWVZTWlVLXFFMSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzcjHwMa3wcDIz7jCxb60u7u0wLi0u72xt7q1paGss6qgp6SUfISEgHlwcnRxaWZkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFhYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn56pnJqaqqavsKubo6O3qqCfrqi2qaanrbCjt7Ckt5+im5iYqqahmqy4sKKhpJyioKCTlaGUlZabmJeWl5yVn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysbCwrq+mp6eyrrG0r7y0ureuo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ejqrvAvcC5rrS4ws3JxsPEvsa4ycyzwsPCr729t72+t7u8tbW3saKhqrOenpabhoB8eHJqbXJ0cGloZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSmp56cn6Wfqq+mn6KjtqigoaKotKGlp6SvpbCtrLWeoJ2VlKmhopSssbGeoqOdnZibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaWrpKWwp6Wjq6utpqiur66rqKqps6Wmq6+0sa68tbGvr6CSenZyZGFcWl1YTkxSSFJhTVdQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqSnrbe7vMHFurG5tcXKy8HEx8fIt8bFtMPAx6y4ub+4v72+ubiytK+goKqtlpZ/kYd/dW5kYmdpaGZoamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVlbV1VYV1RUV1ZTVFJVYGBfYGFfYGFjZGmBk5OIkI6UkpOclJWWo5mglpygpaGtpaSjoqOhm6qrpZmepbGpoKCdpauep6GerK2pqK6toqGilJejm5yQqqiwm5+in56XmZOKnpGNkpOVkJiYk5uhopykoKGVoKGkppujq6WipKqkq66lrbKppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZWUkdRT0haXE9SSVRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojw8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY6ODY5ODk4OTs5QDl7tbSttLuyr6uxrZ2np6+5ubPAyLq1wK/Gyc27wsvMyLbKvrK/xcqus7rEuL7Dv7m5sLSvnqOop5SOfYuEfHVpaWlsZ2psbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl5fX2JkbY6PhJGHkJGOmZOUkpyaopyboKeoqqiqpqilo5ikrqSUmaWvqZ+bmZugnq+Zm6qzn6Wmn6OjoZSTm5aWkqiprJqcn6GgmpSQjJmOjJCMko2WlZCeoaCjnJuilZugoqCYoqijoqiroKuvpK63paOkoqytqqirrrK3sr21s6uvmIRzc2hbWFhSVVJFWExRW1lNVU5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmnr62bqaist7asvMq7tr+szMfGucLPz8e0xby4vMTKsq66wrm/wb+4u6yyqZ+ipqKUin2Bd3hvbmhtbm1waGdpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4yQipKNl5GXmaKgm5+qqaauqqevo6eZn6yglZakqKedl5CPmp6ulpenqpmfnJSloZ6SkJOSk5WnqqSamZmdnZaNjIyUhomNg5CLkpWRoJ6go5eVn5WaoKKdk5ulpaeoqKCxsKaxvKego6y0q66nsLSwubXAsa2xq5F9cXJiVlRWTlJJR1ZRUlJMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurvCy9DKsri5vb/CxbOytLqvt7e/uLuqrKeqpqahkJJ/a2dtbnJucWpwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipeJlJSXm5mdqJqfqaWkqp2nmKClm5KPnqKal5aFhJKao4+TopyVlpWHopqak4uOi5Cao6ablZWXm5CSh5SOjIGLjYCQipKSkqGan6KVlJiYlaKlmYyYpKaopqGftLKosrehnaK3rKqtpLKyprW7taursaOJeHJtXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6OppaCppaSzqqKyw7W1srPHxri7xMrNxrStu762ucGxr6uzn6mxvrS1p6OlrKamlYqXdl9gZ3NxdnFpbmllaGhqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRhI6KlJGTnaCPmpuioaOYpJahm5WNh5iajHONgn2Nl5aFkJmQk46Oe5mOnIyCioCJmJ+inpCTmJaEjoKTfn50iY56kIeTkJCdmpmakJWQnY6io46JmqCho6OborSvrK+sn5mluKamsKGwrpywu6qpr6qZgnZyYlVNUk9QTUNTTkxRTUJQUUhJTlNNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTExNzY0Nzg5Ojo2NTo4N0E3eLeio7Sopaaoo6alpqams6eltMG4r7SwysW4usHPxr6zrbvCra/Fr6qkqZOgqbqyqqiZoKWkoYyHkmxXV19oZ2lnaG5jamlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXi5OQn5edlZSWlI6WiX+TiV87V297i5SJgIuSjI+FhnOKhJaBeYJ6hZSdlIOWjpCPg4Z9knhyb4WNfomBkY2Pl5mYk4qPiZyHnpeHiJaemqGgl6evqa2oqJ6XrbOipq2YrKuYp7Siqa2jk35ybV9bTlNSVkxEVEpQTUxGTk9JRkxRTUtPSklNUEZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaeiqbCop7TBubC1sMjDuLS+z8C5r6+2w6isx6uln5qEl561qKGgkJ+dnJiMg4hjUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkF/lZGRfYmUjISKjZqNlZWKkoiFlYZ4iH9gSlFueIqRhH2EjYmFf39ufn+Ud3V1d4SNmXBRjYiKh3x+eJN2aHeGiH6KiJWKjZCRlouEioiUhJqMgYSSm5aenJSko6ippaSem7CqoaSkkKWqlqGpnKKmqIl1bGVeW0hRUVJNSVVNU0lMS09JSEdLTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivraq2vLa4t7PCvLeousm5tqiptrers76ooJiQgYyWrJuckoaZkJKMh4CAX01MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYySgZKZi497ho+AdX94c251cHSNjYF5fYqqhXl6aHZ7jnBybXiBi4ySeHqAe4B2c3KSd2d1hISEhHuViYiKjIqAf4SLjH+Ug3uAj5iVnJWRn52pnp+gnaCppZ+dmIynpJOgn5aenqSAcmdgXFxKVk9SR0tYUk9KTU1SSkpKTVBITFFMUlRMRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Yo6GYnJ+0qa+ppa2ssLGqvbSyu7i2u7WyoLe7s6udnq2qqrSwo5yTkJaDkJ+SmIZ+koSKg35+eGBLSUlIR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g315Z3eNl5iOj31neYF2eICJj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfImMh4BseXF9cG11j3FpcYB+jnBDi4SCg4V/d3d6i4V9i3p1fo6Sj5iKkpqbo5aZnZqdnqKdlo2KpZuPnpeOlpiPdm5sZWJaV1dUUUpTVVRPUE5RVktOS05PSlFOSE5PS0VDPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CflqCmr6yuq6ipsK+xq7y4rLu+ubOtqJuxp62ckJadpqqlopmbkYaTe4uSj5F8d4Z2gHx4eXhgS0ZHRkFAQ0RJTExNUVJQUVNVVFRVVldXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXWVwcm2Ip6rAfnV5Ynt4bnx5iJB5fIuFb22MkXhzeGpqgIJylpGLgX2WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ6fX57dm90c4WCeYF3cHyOjIqUg5aXmJqQk5WWmZeel4yDiZ+Ri5KNhpCWfm1obW5uV1VXVFJRWU9SVVVTWFVNTkhOSk1OS0NITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepa2woqyqqLWvrqy0v6u8wr+mopqVpZiejoWMlqKimZmSlY10j3uCiI6LeXV7cXp0cHR2YU9FR0RAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouJdoGIhnRsmpF0c3tqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcX98Z3Fxe26TjY97c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJSPl46AeYiXiIaKhoCQh3Zqam5nZFdRWldZWVtNUFVWWVlOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6a6rquysMKxu8PHm5aPlZmLjYZ6hZGZlY6RjZGIcoiDdomOin10dXN1dGx2bmVVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6BxfHhtfWxyg4GFgXqEhoZ5cqCVdHiAc3WUhzVxnaidjqGhhKKFdnCGfId8c4ytjYmAaGZiaW5ybXCCdWlvWHVwjpqSd2x/e31tcW1wgHpzdm1idoR/hoCFkJGKi4qSi5GMi4+DdXiLj4B+g4B+j3pxcG9rYFtcXVtZWGBfU05bWllYTEhKRUpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKHlpGepKeer5Wltamtsa7BsrvBxpeQjJSQgYl9boKRkomEi4iPh3aDhW2WiYt+eHl6cHpye2ltXkpQRz5ANzQ0ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH2Fg3+MfnaimXl+hoGFmYSbnGGGqp+dioKQjnp3iH6JiI5zipePg3tcZHF0ent3imxnamJ5b4WPgnpugXd0hHpwdHl3a25pXXeHfYd8iIePgIuTl4ONhY2GfXGEf4R8dXd7fYl1b3JzZWdfW1pdU1tmXldRVVlcVkdKSkRLRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjXiKf5SMkp2dn6aRoKugsaivwLG6xbqWjpGUiHqFdmuAjJKDfouEj415g4F0ooWMfn6CgHKCgHxreGtTV0xARTIxMTI2NzY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp8iYZ+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc2x8gYaHfY5oZ2h4fm6FhoKFcYSFR2uAd3J5dmhta192fYOIf4iFjHqVnpyKi4iRf3t1i3Z8d21vd35/cnJxa1tdXFtjY1hnZVxVUFBXWVBETEtGTklDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aXkpehnayhprivs72zl42Si5iLfXRwf4mTf32Mg5OVfYZ+hqWIiYCDiIZ5iIt/dYZ4X2NWS0I2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj85NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYmRgZqVgqGhl5WbmqWtk5q7sae7x8Ooi4yhpY+UiYGQe3KDnZ+RnH52hYWKj4eQaWhvg4B0jIaEi3GGgneHgHt2hX1udnVngJSPhomIh4iHoauilomOmH97gol6em9na3h+eH1xamNdWlpdaVxhZl9aT0xOWFJRSVBLRE5HQ0tEQ0FEQ0E8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O251cGd4g3uAjICBkI+LmpqknKGspquvsJeRkYShlIR4d3+MlH1/koaTln+KgJKbjoSBgoyLgoqOhICKf2xwal1DQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafIyhnpiEkoWCj6Gfk5iShIqFj5iRlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhloaTio+PlqW1qZuNlaKDh5OEfn9ramt8f3+AcmBcY15ZZmpcbGteWEtIT1NRTk1MRklQRERORkJDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmhZcINwdYdxdpKGfpeWmpSfn5ynoKqWk5ieZ2Wkmn6EkpJ6gJGJkZJ9ioWZkpGDgICLjYmGkYeFiIV4eH9nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWcn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpqZp5GRiJWimpp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNzfH56b2dfW2BeYWZjYGdnXFJFS0tQT0lKTEZGTUNITEZGQ0JHREA6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHF1YG59YneOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNi46Ne4qGj5COgoOAiYyKhZOFg4aIgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUdHQUFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKynqLSssbeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2qo4uWmIWmpqCil4KmmY2iqqikh4WTo6CgqqCkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlq4maipOKlXp7foR9Zl9nW2RhXWNjXmZmX1tPREpIVE9GSExGS0hFRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1hqcFh6hXaBlIWIgpuDkpCNktrInZZzVpeIj4icj3yGjI+LinqIgoeRjoOFgIuFhYiShoKEiYaHh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSVFVVV1VNW1BHR0Q8Pj5GSENEQDc7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLByMSrs8W2rLPAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbGxm5mSmp+Ip6+qpJR2n6SXoauxs5iWqa2orrW7srqsr7Wisayxtby3ta61oKeno6ibqbCtsrq4uKect6mNpY+Sk6CGeYGCdFhgY1VlYWFiX2BmX1tUSkRFTFZRSUpKREpIRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoZ+gI17v7ujvIK0lJONm4+EiI+TiYl5h4CMk4yHhYGOf4GJj4Z/hYiFioeRenluXVZARU48Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxXT19VSUtKQUA/R0tGRUM7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczKtrvEvbO0wbe4wrW/sLd0sbSmusWksMa5sbOxtKiktbaqsaCilpuikaWxraWtq6ekmKCss7qiqLK5tbu+zL/Fxb29s8K3uri/t7q3ua2tsaaxqq2+sL27wsKsmbuola2PmJiqiX6Be2lWYWBXaWRpZFZbY1lWVElIR0xRR0RJSkFIRD4/QkJLQEBMQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFpWWndqcH+PhIGOhW56c3iIYrihmqOJlZSWk5STjZCXkoeHe4eBjZWKgISBinp8i4eGfYqCgYuElX14enVlT1xkR0VMOlFkYVteU0Y+O0hQRFpkUVFZWFpnWlRgYU1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tNU1pUXpSvuLW6ucnAu73KzLu9wLu3tby7t761urLGYHWypbGanqu+qqWoq6qkorK1oaunnpWWnpifrqWnpqWfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrDwL69v7u8t7Swube3w7rGvsPJsJ66qqKsj6WotomBfXFeYWBcVmFeZ2VSWGFWUlZJRUZNS0A+SEQ9S0I9QkA9Rj07SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbWxxkI2FkHNsc3JziNXAtZmgjZWZmpGOl5GWlo6Gh32Hg42Wi3+Df4N4e4uEh3uLeYGKgpd/dH16bGVwdlldXFBlZWJgZWRdW1hXXE1kbVVSbW5fb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZdWlyTucC5vbfGwbu5ysu7t7q2uLmzuLW1rra2mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUj5aYl6ifpZ+empmDpJ2spKqwrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/Jz7Sku7G1sJusub2afnhqXF9bWF1gWWJiUVtgU1FLQ0JFRkU8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIyJfIGDc3uKg4V8inSCioaVf3N7eWxtdXxpc2VpbGlmamppYGZpaG1abXSXraS8h4dnW29oXVpZVEhKTlBKS1FMVFFITEFKR0tQX19iZ2pil7fHsLmzu762scTHtrC5sbC7rLOxp6u3rI22p56cp5pOm56NjqCWkaeYpZWKk5OIkYmPkZGdm6GYm5WWh56Zppqsr6ivp7Oz09TU1tHLz9PUztPPzMbDytC/ysnLydLIzc3D0dK4r8S8xLqmt7vEooBtYltbXFdfV1llWVBcV05RQ0JJRUNJO0FEPkFIPz9BNztEPkBJPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDk9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkJmDaHFveXmDoKqeppeNm5uYi42VkZqOfYmMhY6KiouQiHyEgnB/h4GGe4dyg5KLj35xeXVscHh/cntueHNsaYBwbWNpbXB5aXd9fsu/wt+nbWN4b2RbYWBKUFJVTlleUF1dTlBOVFFVVFxubneDcpauuKy0qLC2q629wbGrtaaluKesrqGstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEioOTlZiXlJuRm5iZmZ6eq6ykp6GsrM7S1dHNzNLT09DU0c7Iw9TRyM7S09PWzdLRxdLWxsHPyMjDqb+40J14bGRcYVxVXlFdWk9PVFBOSD5BR0JDRjxBQj9GRT5APzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd213cH1+gKGenqGLjZmTk4yMk5CWhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAcHdzbHN8fHd8c4J4cWuAcnJpb3F6eXN7vsuafoyxg3ZyhXdoYWpdQ1paW1dmZFhla1RYXVxgY11jeHt/i4GZqqSkoqChqKeqsbmrprSjoq2io66ip7GfiaablZORipKOiIKUiWuVoo2ZhIGGfpGDg5OXrYuVjZWZjoWSkJ2Xp7CioKCkpKjHzc/HwcvQ09HU0s7TzcbW083U2NbW2NXX1cnU2s3K2NbRyq3Ew8yKcW1iX15XUlhSW1BKR0pJSkA7OjtFQ0Q8Q0Q+SEM/Q0I7Ozk8OUdDNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCiYGdlZ6UhYuWiY6KiI6Ij4B4g5SZi42IiIuJfoN4c3t9hId3gHuHkZeBhG94cG11f3Z4fXSGfHlsh3Z1bn12hHV5e521jDxBisalfo18amVXSUNlY2ZjaGpkb3lbX2Zoa25pboCEiJGMnp+gnpGXmJ+kpKaypKWzoKKlnqGpoKKxnIefkpKTkYuOi4aDj4R+nJyMjYKEhXqUfoKqlaOMkoqYkot9l4qakauzmJqbp5ynvcPFubbFzdHQ0c/L0svJ1M/R1drX19jU2djN2NvOydra0ta/zM21dnVtY1xYUlVQWVVGRkpJRUU9Ojc6QEFCOkdFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXFzho18l5Gdi36HkoKJhoWKg4h9eYWXl4mPg4eGh3qEeXF6e4SGdnqGjo2deoxwfW9wen9ye4BxhIeAbo56dXd9fIJ1f3yHibB0WarCt42SgXBuYz1eaHJwcXBueHeCZWlvcnV4cnuLh46TkpuWoJaIjJOboJufqp+hrZyimpqfpp+frJmMmoyRk46FfYiHg4WLjqCZk4iDh35tmXmEmYaIk4yOlYyGe5uIk4+uqpSVl56Ypq61vKitvcbLyMnLy8/Iw9HK1NbY19jX1dvX09rb1tDa2tHWyNXMlHd5Z2ZaWU9SU11IQkVJST5BPj04Oj0/Oz5IPUBCQUFEQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfH2EmI6Hi36Gh4B3gnlue3uHgnR6kp6NoXaPdoN0dYF9dICEb4KQgm+ShHV8gYV6dod8ibjGpcPKuIKWnI94cGVOZWOCeoF3hqKQi3l5d3uEf3yEdm2UlpSVj5iRg4mPl5qXl6acmKCXn5OSl6OdmauWkZGLjpKDjIWJiIGGkJGenJmJhYuBhZd7iImfl5CJjoqLgnyhiJCLvKGYk5eZnKimpa2ep7W+wL+4x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bx4V5d2VnY15SVlZVTUtETkQ7PT08OTo8Pjk+QTc+P0A9QD48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXt+gpGKhYZ6hYh7dX11bX19hn50f5KekZ+DknyGfXiPfnmLim+Dm4B0mYZ9goqFfH6Re5CpjpDDoL2MnKScfoqEfYlyjIt/c6aanJmUhXuPkYmEaUdxoaSdjIuQkoWIi5GTlY+dm5OUkZeNjJWfnZShlJKOjpCMfpCPjouEiJKWmp+fiYyUkZ2Qgox/ppmIhY6DhoSApIaKi7iYnZGUlqKnoJ2dnaOutrq0q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27d3d3ZpaWNVXlpTT05IRExCPT0+OTk7Ojk5PD02QD4+PT05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXN4int7f32AfIh7fXuLh4N+dYSGeXN6dG2BfoR9d4aboZuelJKAjId/mIeAnJJuiKmFeqCLfJGPg4mEnH6akYmNo6KfkKSvoIuRi4aLgZKGV3Kti5+snI+EmJyQkI5cg6KRgo2fk5WMh4iMkpOMlJWVkIyPioiWm52PlZaRi5OUhoCLiZKNioqdl5mjooaTnZWgioqIjpyQg4iPgIOHhaSFi5CzmJySlJehoZ6Zkpudp7G4rKS8wcfNx8bPzM/Mz9fP0dSu1tXY2tna2tfW2dmebntzZWVbW1ZSVVdDQElEPz8+OjQ5Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhsYn6Sg29td4t4en97gX2GfHt2hoWAc3CFgnt2d3Z0hIOFfX+SpqKfpqKXip2QlJeKiqeXcoqyjYSnkoSZlIWajKOWoJiTiZueopOpsKCRlZCOjoiVi26Nt4SaxMiynaKlm52YlpGykGSkzciVjoaHiZCSjo2TlIqFioqGlpqbj5CUk4eVmIR/j4uZiI6QqpeXpKOImZ6WmomPhpeYioWPjYJ/ho+liI2TqZqXk5eZoZifmZOcmqKytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgXF9ZmFcXF1OSVRZQUJHRDtBPjgzNzs8Ojg9NjQ6Ojw6NzI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBj318bX6IeHp+e4KCg392doCDfG1ui396fHh4fISHin6Lo7Ono6qzopenn6WklpWuooORuJWRs5qNoaGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJmXocCOo8m5q5yjpq2Zkpudsp2FhaiinJiFiYmOlY2Lk4+IgYaHiZOYlYyLlJOGlZiGhJGQnHWRmLKWl6ShiJ2ak5CKkIqXm4mLlo6HfYyYnomQkJyamZOYmJ+UoJ2Unpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0dbY09DYunF4dFtfVF9VT0hKTkRCQ0U1Pjo3Nzo/PDw3PTQzNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6em6Fhnp8hHmBhoF+cHh8fn1vco16foJ8eIaLiYaEkqe7rKiyva+lrbOzqKOhsKyKmrWdorilla2kl6mtuKelo5+aqZepo6+wqpqZnJSVkZegmJq7u67KoWq2uKuwlJmfo6yTl72jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJOWjJCWjYuNl5iTnZm0l5WrnYuclJKOkZKMmZuKkp6Qi4mVn6GNlI2Ymp2SnJielKGglJydpa+ooaWzuKvCyMS1ur27xcfHwtGgxsnNzcXX1tHL1KFveWdbWVJdUE9FQz48Q0FCOD84ODU/Rz08NjwzNTM0NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKP4uKf4Fzhod9gol1g4qCf218fX1/cHeHd46Ch3uNj4yGjJmqwsCvvca7s7TAvLStq7O2jKizra29q5u7pKitubirp6aioqSiqa+ysaudnKSYm5iXnqKmpZKkuq+pwLytrbK5paWofoiGnK28sIOMjIuQg46DkY96gYeQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaXjpGgkYmUm6SslJaPlJydk6Gdm5igoZSanqempKKksLOnwcbDr7C6tsXEwr/NpsfEx8O81dHNxcqHcnFgWlheWkxKQktARkc+QT9COzo1PkE9PTU8Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0Q/Q0ZcZUdgaWdaXVyTjIyIe4eMh4OMdYaRioFvfnuBf3F+gXuVepKUlJiQk5Wns8bJv8LMwsO5x7y7r6u5u5izt7qywK6lwaSrsLy9q66ro6Oep6uutLCqnKCqnKGblp+wtaeLo7q7tsG8rKmcsqWkqZSFjqnEw6SCi4+HiISGlZSNeoSNkY+RooyMlJGOiZefmJOZlZimoK6djKqcjpaPkpGVlY2QlZGPoZSGl5+gsp6UmpSfoJikn5qgm6CUmJ6lo6ampK+upcDEw66ot7bJw762z7LEv8S8s9HJyMK1c3drW1ZaaFFMSENMS0tKQUE9Q0Q8NUFEOzszPThCMzMyMjYyQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVlOZVxmVGNqmY2XioyIk5CGiXmHlJCBcoB8jX94h4KCkHqOoZaompqYur7HyMnB0snKws29wrOtvL6our+9u8O3rMKprLO8vqqwqqSlpKyus622taCfr5+lopijs72pm6i9waS2t7Csk7GtrK2Xh5qpp6WRgoyTpZWJgXaKkXqFjZKQnp+Tj5SLj42Uo5mWnJSUo56qn5GlmoyPj4+Vloh8j5WSkqOalZ+hnLWlkJ6XpaOipZ6dppielpebpKOpp6KyrKi8wMSvpbK3zMC5r8Szu77CuK3Cw8LAmGt4YFdWWlpKS01KRkRESENCQURMOjRESDk7NDw3RS4xMjM1MkIyNVNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iqCThHiFf5V/f5CIipCAlqGZrqakmMK9x8PHxdPNzs3LvMK3sLm8tL3LvMPBtre8rbPAuryur6igqai2ra6psrebnq2ip6Geq7e4qqWwv8Wxvbm0qKq1tK6vl5alrKigkY6SssWnlY59kpV9iJKZkKqZmJOTj5KVk6Wekp2ZlKGjopyYn5iLjI+PnohakJaXkpelmWWYo5+zpZahlqysqqebnqaXmJaYlaCkqKWftququrvDtKWztcvAuKq2rLK6uK6ouLq9uIJqbVlWU1RNRUpSTks/QUhFREhISDk1Rk07Pjg9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJwRWlJUmViTEallJyXopeplo2Qg4emk4iCh4Kcg4OVkJCUj5qin6++r6HGvMXExsbOzs7Syr67trG6u7u+z7XDvbi5t7KxtbO4s6umnKusuaqpp6+vmKOvpKekpbXAsKustL/DusC6tKi5tbmzr5alra6upIuTlaGNdMGafZeZhI+WmoyxlZualZKTmZmlo5Sgm5eaqZycoaCZio2QlpxgSpacmpWapZZVl7Cfr5yepJSvrqylmqCllJOZmI6coKeimbSpqrO8u7uqsLLHv7mmrKutsbGjobGytKRvbGRbWU5PS0VPUFFRO0hKSUdJQ0M+OktVP0E6PUVNMDc1NDQ6QjQ0TVdPPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRmIeLqJaOiJOFn4eEnZeOnaGbo6S1yLWpxrrCw8fKycjMzca+u7OuubnBwcy1x7rBubW6sK+vs7WnpJuqtLWqqaatrJqkrqWkqKy6v6irtre+wr++ubSzxLK5vayjr7WsuaaIm5emm3a/n4SZnY6TmZqLrpehnJuWlZufoamep5+ZmqqZoaeemJCNkZ2DbnaSopqVnaKekK6yoqqUqKqXqq6kpJ+lqJKSmZyIlJyinZaxp6mrura9s7Ktvrm3oKOnqKWnnJusqamMYWRgXlFKTEZITUlWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh/ZV5IRauVnKGfu6+ZlJ+Mk6ubkZKTiauNh6KfjKStlKOjtsa+tMC6wsLHyMXCzcjBvrmyr7i0wMLKtcWywby0uqqpra2wo6OYqrS7pqmmq6qdqa+no6qrvryorb20uL7HvLe2uMGyvsG0qbW3q76lj6KYkqKfvJ+JmqCZl56ej7efqZylopucoZqopbOhm52mnKiqnpmVj5Sbi5eJjKSilJ2inqG1r6Wkk6+rmauqnZ2ko6iRlZWfg4+enpuVqaShobS0urWtqLWys56coqWal5WYqqGedl9bX11KSEVGTVFJTUVGR0NTTEpCRUdBVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWdcRkNDnHBiR0Wnl6SfnsOtm5elmJqpnJabm4+qlpWnppWtrJmiq7bEwry+t8HCwMfDv83Gu725srC4s7/CyLW/sLy2uLampKusraGhmqqqxaKkqaumnqyvq6KpqL+4p62+sbi2x7a1ubjAsr/Ct7WztK++o5ejlpSblK6gkKGjpaOjn5C9pKmeqKudnaCbpp+9opmjn6Kpq6Gdlo2VnpOeh4+EjZOfpKCetaylm5Wxp5mupp6ZqZ2fjZiUnoSNoJqbk6WkmpirsbWxq6WqraycmKCgko6QlaielGdiWGBdTkhHSk5LSEVESUA+UUlBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTQ2QDk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTpuUkY8S3hlYlZMopqjnJ7FrKGfrJ6erqCSo5+WpZ+mqqyXtrGjqrO2xMS9v7W/wrvIwr7Kx7W4tbSws7O3wcW2vrG4tbi1n6asqqydnZ6lpMGkn6qtoKSpra+ipqi9taWxvbm2tsSytLi6v7PEwbi4rrO1taOdpZWRlKGuoJminqioq6Oawq2pnqytm5uemaagvqGdpJirq6ymopmNmp+Sn4mOV3+Wn6ahoLiqppOYtaOfsaCfmq6Wno6Yk52Bjp+XlY6io5aQpq6yq6mhoqWllZWdmIuPkZKknolgY1ljYEtISkpORUVBRko+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTp6foZmew6ilorSinbKok6uloKOframsnbuwqKy2scjFwcKywsO9xsO8xMm8r7C2rbC0r7/EtLmxsLq0rJmosKmqmp2loajBrJussJyqo66xqaSovbant7u+r7fErbSzw8Czx7S7t6y0tq2qoqaWlZSkrKKfn5qoq7Cvr7uypqCpqJqZmJOipLmgoaSTr6+spaefkqGelZ6PkI2Vnpqinqe0pqaMmLObo66anZutkJ6TlZOZf5Ghlo+Nn6GTi6assKWmoZygnpKSmpOFi5GNnJ5/YGVaZ2VKSUxKUkJDQElHOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo6CcoMOppKqzoaS0qpazrKeipLKsrqm7sa2wtbTGwMTDtcDEvcnEtb/IwrSrtaivuKy/w7O3rqy3uqWZq7Krqpifppetu7Sbp7CbraCutLKnq7mzqLq0uLK5wKq3ssS+tcaov6+tt7Wpp6yhl5eRpqWiopiYpa+4rrK1tqCfqKSalZWTpKC3oqSllq+xsqeqpqKfm5qblpeon6CYoZ6vsqKmjJeumKSql5mepJCajZOXmYWVnpSMj5ydk4upqaqhp6CZnpWMjpmPgYWViJSfeGJoXGpqTVBNTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKSdoqa/p6ivsKGptaudurGro6q0trGwubewt7i4xL3Dx728xMHGwLjAxcC6qbakrLuswMK3t6qssruila2xrbKWpaeRqrmpn6awnaugsLSzqqm2tq28rbOzubesuLDDu76/psOrsLeuqaurp56YmauhoqGRl6Gxr7OssLmanKmgmZaSl6aht6mlo6KwsbSrs6isn5ugoJudpZ2il52js7Can4+TpZqfqJqUop2Ul4mTlpKVlpyTiJCamZSOqKimn6Obl5uTho6Yi32MloWOmmpobGBsbldQUVpUQUNEVEA7O0hBNzpYUGReUFZXRVlfXU1MUk5eS0o+WmNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaifnaKqvaKrsKujsbiqpba0rKCttb2us7i7ur22tsDCv8jEucTCwMC4xL3Bt6+1p6u3sbu+v7SprrG3n5errqiul6aojqe7n6Sss56sorGws6yqtrS1vq6wsbWssLWywbvFt6u9r7G4rK2qo7GmnqWqn6SYkJmfs6qzq6qzmp2nm5qVjqCmpbSup6Gtra6xp7StsqqknJ+oo56VopmbqLWpl5mRkp6ZnZ+dkKqdlpeElJaKnZmck4qNlpeal6aloqCdlpWXk3+PlIV7jpKCjJZlbHJnb3FeRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqGkrLalraqmr663qq+1u6insbfFt7G3vcHCtbS6xb7MxrnCwLq+ucO3wLmytKupura7ub60qa2wtZiYp6yqrJurq4+rvp6srrKjq5+wrbOurrayubiqrq+yqLWvtLy9yrOqtrWxtLCvqKKzoJuoraCmlpaamrKiraClr5ehpJqako6jpqizqaGms6yqtqWvsbWvpJmdraeamJ+amau3opeTkY6XnKGXlpSrnpqSf5KXjJ2cmZaQiZSSnpmloqGgmJaSk5V5io+Fe4yKg4qSam14bXV7YUVgallJSFpaPXtKRkQ2QWJUaVtNXGFKW11aUlJSYmFMS0VeYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVUtEmZehsaixqq2mpK+utqm3tbqkrLS3ybu0urq/v7Szt8PAzMi8w7y3vb+/t7+8sb2tp7q5t7bCtqqssbeUl6auq6ijsKqUr7ukrbGzp6ijsrSxsrG1sbizqa6rsqe3r7a0xMa2qba2rLCtqqmktqCgp7GhpJScmZWxnqecoKqOqaOenJaYpqaluKejsrWsqLKnrrG2rKWZoKyom5yenJSpuJyUjo6KmJuil4+YpaCclIKRlY+dm5eWlYiWj5eap5yjoJKWkZCVdYSQh3uFgYSMi21wd3R7flxLZWxcS05jXD9ie0dJOEdnV2ZcTF5iTVhZV1RXVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi09RUxRPDNya0lDQ5CZpa6lra+rqKWxs7Srt7K3oKu1ucm5rsC7wrizsbXCw87FwMG9tL2/v7q+vLLEp6m5sLa2v7yuq7OynKCnsa2mpa+lnrK1rKuxsq2qqbS7rLWzta20rKqsqK2pua2yscjAuKW6sKmtraWprrCmpaOvpKmcnpybr5qjo6Kjkayeo6CgoqqmprmkrLW2pausqK2vtq6jnqOpqpugmpqSpLOZjomNh5ChoJSMlJyfkpGDjZKSnZqYlZOHl5KVmaebn56MkpGNkHZ9joV8fHyHiYhwc3F9fH1cU2RuXk5ZZlxGRJZbRztObVhiW0xgYk5WV1ZXVFlnXVFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorO0g/M0JIUyw+kGs7R0iPnKqroqqxpKmls7SxtbWysqKrrr3Muq7AusextK20wsLRxca+wLK9wMK8v7e7xKest6yzuLvAr6uxraCjp62qqKSwpKuyqq+ssK+wrquzvKe3sbKps6uspqWjrbqsqrHDuratu6moqK2qqbOlqaSjrqqoop+dpK2VpZ6YnpmsnaKoqqKtpqStq7iysqGpoqCsr7GsnqCnqKmZpJmZj6CnmIaEjoqLnp+OioyVm46NhIaPlJ+clZeUhpaTk5ekm5yci5ORjYl+foeFfHd+h4WGc3JxiHVrX1lgbmNRc3FcSzuEfEY/V3RYYVpOY1tOVlZVV1FcYl9TT05nWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJVaPkxFlZitqKKrs5yqqrC2rbm2r6umq6q9ybuwvbfCr7Gss8TDzs/Dv7+0wMLDusCzyMOrrretsri/vrKtraukp6qwqaeosaa0r6qwrq2ysbSstLykuLOtrK6orKCjnrC3q6qtu7elt7akqqesrKuuoamnprGypKemoqKsl6qhlZugpp6koqulraOfp7G4rq6jpqKbqquuqZ2ipaSkmaCalo+YnJOCgo+IhZyfi4qOi5iNj4qCi5ejmpGQmoyTkpGTopmbmYqPi4t8hoGBg3p0gISBfXN2i6OHeGpeYG5mV2WHY04/Z5NMRWJ5V2JZUmVUTVZVVlRPXF1hVUtNaFZWV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qis6Sk9eNESGPkhGRJeSsKWjq7GYq6qttqy2sqymrKqpvMDAuLizu7Wmsq/EycvSv8G7ucC/wrnBucDErbG1sbO6v72ysK6tq6untqqmra+qubCosbKusq23qre3p7S3q6ykqquco56zs6iopLS1oLeuoKqoq6msqKCrrKm5tqmqqaqjqqCtnJKqoZ2gpKKmo6qenae0r6imqqKjmKWnp6qco6SjoJqYoJGOj5iNf4eMh4OdnYaEioqNjY+LgoWUopqNjJmQkZGPkp+WmJaMi4R/dIeBfn94dIN/end+gYidj29xZ2dxeFxhc4hrT16ZVkhteFVkVlFjT01VVFVQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDuWjrGhpquumqylrbC0ta+rprCqqbq+u8CwrrmuobevycfI0cC+vbu8wr26w8C+v66ysrG1vLrBsbGyq7OopLSopa2zs7mwo663srCyu6u6r6qutqyqnqqsn6Ogtq2ooZ+vs6K1qp6op6qjqqGirK2ova+srq2iqKigrJmQsKKYoqCnqJ6nm5mqsaqjoK2ioZSjo6OnmJqppZiYmJ6OioeUiH2NhoSEpJaEgYGLho6MkIODk6CWiJCckJOQjZGclJeOioaGeHSBf3x1eHmAenRzeWh/hqR1aV5ka4F0Z4iMfVNYcF5KeHNTZVNRXk1NUlpmTkxWWWRYRlNpUlE/Q05RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUE0kI+yoaSmrKSnpK2ntbOxq6WxqKq4vsC8r6e5qqavsMnHyNHDvL++ub6/vMm7wbiwsLSxuru3wLKzu6y4rKK0p6essra5s6iovbautr6wvaetrLWsrZypr6Sgpa2rp5yeq7OltKibq6epo6mdpKmoqb2stK+unaqkoK6cm7OjlaScpaWfpJubqaumn5uqopuTnKGlnpiXqamSmJqUkIqCj4V+j4OAiJ6PhX59i4aQjY+Ef5Oak4WSoYyUkYuRmpGVhol+f3J7en58aHh8enVwcHxnhHiEiGRhZ2JyhXptZ3hdXVVAV3ptVGFQUlhLTE5ydV1IWltnWUVVZlBEPkpORENBOUhHS1M/amFKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNBSjdHU2BVKj05RFc+Ko+UspmgoKmmpaGrpbizs6apsaetuMG9ta+iuK2oqLDCycnMwba9wLW3v7nItcO1s7K1sry3ub21rbm2v62hs6erq7C1uLWsn769qrPBtLyhr7O1qqufrbCjnKWoqqOem6Wxp7Cgn6upqKGpnKSooa27qK6xrqCro6Sunp+tppefm6GjnKCcmqSqo5ubpaSWl5Wfopabl6asjJ6RkZGLgoqAgI6Be5qUjYh7fouFjo2LioOSmJGGk6KJkpKHkJmPk4CIfHlsfnZ5eGN7e3FwcHJ3aIBzaoNnZWdgbXONbGFpb2BvPlp4a1VeT1FRSklNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQxQmhZMTNTPWVfREw2S1ZkTyo7Mk5YPSOTma2aoJinpKOfqKS4sK+kr7Cqq7jCurOtn7ivq6i0usjLyL+3wr6wtL23xLbDsa65srO/tLq9t6m5uL2rpLSoqaqxrrqxq5y8vaWwwbW2oq+3taanp7GzoJ6kpaehpZmfrKipnqCqr6egppijqaCxuZ+jsa+hrKGspJymp6mampufpJWdnZueqqeYnKCpk5mUmJ6TmZahqpGaiI6Phn2Hf4KOfXyhjI2IeIKLhImLi4WHkpqPiJWeiJGVgoyXjJF8hXtzcH1xdHRgeXhpbnBwbmh9cWN7bWllY19lhX5fWnNrcktLf2hYWk5QTEpIUFJQSU5cX25TRFhaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPjBYVjUol56nmp2WrKCgoaSiuKuypbS0qqm5xLWzrZ+3ra6tsLXGyMG3v8K5sbS8tr+7vq+rvbCzvrG8wripu7q3p6i1qairsa2zsaibvremrby3sp+xuLCopaevsZuhpKCkpKGXnK+noZ+jqK+hoKGTpKSit7ChprGrn6yjr5icqqWpnpeanqWTm52bnqesm52dppeWmJSdjpOXoqiikIiLj4V6hH6Ei3qOlomNhniBh4OIi42FjZOYjY6WmIqPl36Gl4uPeYF6cHJ3b290X3l3ZGxsa2logm1lcmtrZWhaYnN/XlpsdmpaSH1dW1hPT0pISFJVRjI6X15sUERYVlllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdCZ1tIVENUXWhFLjsxX1QsMpajopiVnamepqGjobiqr6G7uaasvcSzr66ita+tra+0xMS9s7+6t7Gzubi6uLqurb+ztLivv8G4rL26tKais6uoqrOrrrKjncK2pqm3t6ufsruppqWor6uZoqecpaaUmKGzppmepaqpnKGglKWfpLmopKetpp6loaiTn6mioaGZm52hkpudl6CjrJybmqKWk5WWm46Tk6OnpI+Iio6GeYR8hYZ9nI2JioZ4gIOHh4eRhZWTkoyQlZONjpR7gpeOind+e2x1cm1sc2J5dWhnaWdlboRnZ2hkZmhqX2ZiaWZaZntjYVJzVFtbU0xJR0lPU0AhK2peakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3OGJNJzKepKSSjqWmnJ6enqS1raiqureorMPAt6+sobWup66vt8HAvbLBt7Gvsra1uLe1rKq8tK+ysb3At668vLGln7aspqa1qauvoaDErKqnsbSrrLS6nqiqq7GlmJ2qnqilkZmmrqOYnqSqoZuinZegnae2pq+qrqGhnZ2hlaCmn6KgmZuanJKanpWmnq6jmJeflpSOlZiMj5iap6CQh4qKiHiFd4KCgpyHi4KJe36EiIaEkISWlY+PkJGQkY2Te4OVjYZyfn1neXBramxndXNrYmdkYnR/YmRlZmVpamNnb1leWF1tZGFNaFdbYFZJR0hLTFJYPjlgbGlHQlVTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0FkRyU1nKSgkYyuoJqYoJeltLKjsr63obHFu7mwsaO2rKuuqbm+vbytwLKvr662r7O5sqerubGvrrO2u7awub6spZ61q6ChsaWrr5+lxKGzpa+yr7ettZ6tr6yuopmdp6qln5WbqKagmaSjqZyan5yVnJ2tsKa5p62ioZqanpmfpJqlnZaemJuUmqGSqJatqZuUnZyTjJWZjpSUmKenjY2KiY57gXSCgoqYhYd8iYiEhIqMiJKFk5yTko+QkZaOkH+AjY2Db4F/ZnluaGtqZ3Fya1xoY2Fyf2BkZ2pubGZqZ2RsXGxtdnFhVGJoY2VaSUZMTU9YUVBVYWWBVEBWU1lVRkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFJZEInNJOinI+PsZ2blKGaqbKwn7nAtqC0wbu9ubGmtrCprqW3ubi5rbuvraurt6q0ua2lsrWxr6mxt7axs7a7p6mftqmdn6qjqq2dqsKZr6Wvsba1rKyesa2vqqKbnaSsqJyVnKeknpqpo6WVmqCdkZyjq6qpup+mpKCYmpqeoo9ropWYnHGDlpykgHaRq6ielpahkYmXmYCXip+PeIWTjYNtaX53hHJshoqGfYSKhm9dZGBnhJeGa4uQlJJ1d4uEf4OQf2aIgGh2aWZYXWl0bk5QamNmcYJmXmRmbmxpXl1eiZCFiGhPS0Q4RVRnXkpIUFBVVUtIU2BvdGVFW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTlxLW2ZiPkcxT2I8Ky+NpJqHlbGbnZOgnKqtq6O9xa+pt8K4vbytp7axpqukuLSztLG5rqqnrLSlsLWip7i2tainrLazrrSus6Kpn7SrnqKlnKeom669lainsLS4ra6kqK6qq6ain5yhqKecl6Gmppycp6edkp6gmZCeqKqjtK+joqOclpiYmKSJoY+SmoehiJSeoX+lf6esn5STnZOIg3J4jY6Dh6B1iI1pl4lmfnN5oG+Ih4N+jHx/oaCgmX97h550iI52m4psiIKDbWllZHttcmJUhm1jbWmYcVhpcG6GV11pW2tqW4hwbXlyh2mHhFpeRk4+Rl5NRVJWVlFQUldUZ15MWUtSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05cTFtnXz1LMVVgNy8ojaaXhJ2snZmZnZ+rqqiqv8Ovsrm8t8C/qqS3saqsprO1rq+ztquppbGtpbWzm6y1trSmp6izsa2yqK6eqqGzqaCkpJqipJ2wt5Wlpqe2vaasp6mqrKemoqCZoKikmZmmo6WZnKWplpOinJSTo6amobako6CjmJWTmJOciK6QmJSJqYuYo5yGsYCkrp6Vm5+VeYLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJaxq7B5aGxYsa5vZWm8krxuaHptcI/YflNrYrayfoBxlHWaoaqQV09YYU9WTkZUW1hRUFOLXFdbUEBcRVFOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01eZ1w+TDFaXDQxIY6mk4Gnqp+XnZ2lrbKpscK9srW/tbi/wqumtK2tqaivtKqvtrSoqKa2pai5r5yysraqpaSnsq+usaarnqeksqSioZ+XnKGgsa6Vn6OgtLqiqqihra6lop2bmqKqoJibqKGfmJ6op5Gcp5qUnqKno6Cwo56fo5aWkpiSmYWwa2qKjap+Z4WWh61lcZ+elZqnlnGuoaR+d7p8a6GPdrFfarRbpYBlnJFgZoF6ZoBpeGqpZb5yZ6aMdrFqfLF4dZKUY21tp25chKBFaWeHlkV1nGB9ZnujpoJZX4uraYCSeHpqqDhKr1tXVG1jWkxPWF9cV1Y7TohPV1YvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlkzMRuSopWCrKeln6OkqrG3rbS9vrC3xbK4usOnqbCsr6mpsa+ksbqwpKWvs6Opuames7Kwo6Wgqq2wrK+mqJ+jorGco52YlZidna+ol5yin7Szoauboa2toJ6al6Cjqp2ZnqShnJqhp6SQnaObmKGgrJ+mpqCan6GVlZGWkZqGtZu1eIWpmbWZd4ezm7d/lJeXq5Z+a4GmeoGFhpGUknerZ2qxW6x7joeUdIhwjoaAgIiQl3iDgouXjIOgj4WwdnefcWtqbHyLT6VYSGNjmX5jaKVfeXF1UpKHXlCpbWNxfYaAYZ0vUqJuW1RrZ2BMS1xjWFxaQj6weFdYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0YsMC44NDAsLigvMiw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOGFVNTAcl6CUiLOmpqKuqaizrKq7tsKwvMKtuLfCq6ytr66nrrOqoq+8q6Knta2jq7alpbKzqKOhnaeqsqiwqKaeoKCwlqCalpaXmqCvo5uapKi1rqGpj6moqpudlpigpqmbn52jn5ygo6WjlZufmJqeo6ubpZqcmqKglpORk5OdhNWTmblxsMJ/xoZ81pScu3ybl6eQjZyMpHqNhqKBpYJ6rHmPnVave4l+n2q5Wrl3hoN9poKTfJh6qnmOnZB7sW6OhHSQu4VulVCvp8WKUaB6Y2CqYnNyhmyXh19TtbTIhYCJfGOkM0KddV1QamhkUEBYZlpkYUpITWtKWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLjAwNDgzKy0oLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3RzphUDcyJZyik5mxqKmls6qltKikvLfBsbrAsra1vbS2qLKxo7GzpqCvtqmbqLquo7CyobK0saGknp6nqbGptKmlnJ6erJeZmZeXlpiirJ6bl6mtsKijn46soqiXnZicoaeimKKho6GboqKnm56gnpWZm6ahnKeVm5ufoJiQkpWQnYiybmi1cauIcI6mcrR0c7Z7m5mmjY+cjaJ+j5+kfrB1g5HS0XVbrnyFf6Rvm6qma4aFfa19l5mPe7Fzk52PeLNllnSFnm6eZpRSyYtawlyfeWJfrV92c4Zil4heWcqdb7+AdU1LtVNVxmRUUWpjZlhBT2pfbGlQVUZJOD1XUltWWUlDP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVByaDknV2lcQU5UX2VQNUc9YU02Mi6inZGlsK2lqrutp7Wlp7a7vLK7v7i3tbu7tKa1tKKysqOgrLClmKe6rqSysZ20uKqgpZ2hqqSyqKyqpZqdm6mflpWYmZKTo6qhl5Onq7ClopaSrJ+mk5ShnKWnoJWbp6eimqOfrpqhnp6QlpyinpyllZ2VmaKelZmWkpuFrHt3qHajj4uHqW+tioOng5qao4qSmYuifpKXh66Ff4KzXHKzUq59goKkf3HXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1edneHZ5iIal2vd5Wfj3hsNXnIrrJfQlRvXWdgRVBsYHFtVlVNLmViaFNZUDtCREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDMzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjc3oJ2UoLixmLPBraiyp6qyuri0ub65uLO2vramuLSgta2goKmsoJWntqyosbKrrbSkm6mfoKiitaemqqSZnpWlopSUnJqSlqOmm5SQp62vpaGVmKmfoo+RopqppqGVmqapnZ2knq2doZygjZSfm56hmJmclpehoJSYkaadhql9faV5oY+Qg6pwrYyBpoaWoaKKl5aIo4GQh5Sqe3+LnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRtk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmVPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpJYSEU9SEZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVRfYkw3RklfQzE9N6Kcmpq/rJi0wq6rraimtLC4sba/ubqzsbi8qru1oLGln6anp5+UqrGpsKq2raqvoZihoKakpLqio6uhl5uRo6CVlZ+blZmgoJCOjKmwr6adl5unpp+NkqSYqKyolZipqJ6foKSto6GeoY6VoZifoJKcl5yVnaGVlo+rm4+ubnK0dKmMd4qmc7R5dLSBk6Wjk5yMiaSHjnW4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZwXK9WPJx3ZlRvbi5bp09iUmtlYmxaYlxgcHxjU1lRPj5tbzJCQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjkxQTilmpudu6KcssCuraurp7epuK+1wbW9srC6uKvBtqqroZ2npKKdkqurp7ajs6iuqqGXnKigpau5naOtnJaZkKWjlo6eoZuZnp+Rk5Wrtq+nmZSbrKmXjJSmmqWto5GXq7KkoJ6oq7CZoaKQmaKXoJuWm5ehk5ypnZSQqpmH05Oau3SxxIDDhn3Vlpu4eYmRmI2XiYynh3mitnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6von6MdIerfb5uc7x0soN1eICKbZqIcW2NpHS9XXd9W2F5vGpaVltpeV5pYWRmYm15b1lbWUNBQHI/Q0YrNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkA5p5qforyimLHCsK2pqqyxqLmvt8WyvLOvvLCuwbKtpqOfpKGdnJGqpaqypLWnraSglpqqmaasuZ2jrpmVoZCmoJONnKOfmZ+akJaTr7mwq5WXo6enlJCWpZ2krZ+RoKirn5yfqaSynqKkjqeilKGanJeWpJiPsKCSlamfhZCZtoCRko24lXiCk5u1d25sbnNveY+EjolznsG7vJl6gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1ebOjdXaXdXSwdZieZoZpjbZ0cnF3toxef3l9iGeDeW15YouscHSFf1hbp2pEZFlUZl9jXWNRZmZxbXVCTVBNRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJTWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz43MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppazwrSrqqitq6q7r7HGsLa0r7intbmuq6Sip5+gnZmUrKStqqa1qKifnJago56spb6noaqXlZyRopuSj6GoopSel5KYlLK1tq2YnaSkoouSkqacpaudlqmlppyboqmnpqOooZKsnpeinpeXmJ2ej7Cpk5ynoo9rfmmcqHmJc36bjnV6ZYd7vr/Aum6SgnGVhV9yalpdmolhZIeOlWtgf5VjbZx2YpRrgJqVlGVeX2Nxm4loc418hpRman5xdHl+fWJbeHSBaFBcboN8e4pqWGx5gXJJSm+FcE5zTUVXXGZhTFtXZmNeT1ptdmpyUk9ERU08SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4wLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5bTyc/Mj6on6ihwaSatLq2o6ymrqeotbKsyK2xtK22pL6xs6ehpKqdo5yamqynrqSltaqkm5iWopumram/qKmllZSblqCak5ilqaiSn5CPmJywsr+sm6edp6KJk5Gqm6iknJysn6Oam6OnrKKfqqKarpuVpqCWlZ2fnZexpZmiqJmckZ6co6Wap6OanZqampCWgmhufXF2kZeUkYOJtKmNhZiVjoqMmJeHk5WKg5OTkIiNkZSZk5mXmqChmpuUoJyOgnqkhWxpe5B9gHWJi4Jygnh5dnWKgHuJanOBdIN1ZHd9dmtwem1gY1tvZ0xYWWVqX1dZcHpvbmZTT0ZSOU9aTlJPKCs7SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgxMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+ipLGxt6CpprOnpbC1qsmsrrKmtabAqLShnqWmnKWWlqCrp6yjo7esoJmXlqCXraqmwZ+spJaSnJeemJSUop6eo6iSkJmop7LDsJqrnaqej5eWqZ6rnJ6hrZihm52ipa+loaSonquYl6admZqhnp6csKGdoqeVmJSZlKGjlqSfmKGOlpSLio2Pl62Pe5WbgpGAiamohYCYloqEjp+Ie4OQhoWakYeGiZWOm5eOkJieo5aZkpCdjX6NZaGzroSJhHd7kIp9d3l6b2d5kIGAiWt1gXmIcmlzf3l1g4eCa3RjeGZfaGRjZGZqWGt7cGprXFNMUERfVUZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX11dXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLSgua++rKutsbKgqqayraKss7DGsaytpLOvvKS0nKCnoqGdmZeopqmmpKWztZ6VlZ2Zma+mrr6grKOSkp6amZSSlqGcl6mdhZ2prKK0x7OfqaSqlpaYmqeeqZygpauUn5+doKquqKSjq6Gsm5+foJilnpyfnLCkmZ+ok5iYnZKlmpmpn5uXZoOSfGV+j5qPY3iMbGhqepCjq2tkmZd+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKKfmHNsbnqEjIZ5WGVdhYJebIuKgnZbaHN3d5GAh4JueIJ4f3NteYRzd4iIjoN7aYVYXWpzZF1ziGlrfHFtY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kuNlpPNilFWS9ETzFZQjs/Lj2ln7q8ua+rs7CrpaitrrCnrq2wvbKrqKWtsLCfrZigpJ6impqnrJyso6aoqbOunpajkKKvpra5pa6jkI+aoZmTkpugmJmmlnulrKKotMO4paKnr5+elZ6jnqOdpKqokp+hnqCqr6mpo6qep5umnqegrJahnKWxpJicq5ahn5uTpZifq5mefr6DiHK0coWeha1od7nEuHGSoaN7ppiYc6qCfMvAwLtxiqOHgp58lpiInsC9gpadnY2cwcB7gXqRjJrCv31rpbJvjIFvynp/m3eRg46AdnmBf3lxe4CGcHiFjJN5bHaRYmVeeGRfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqO4w7Swr7+pqZSjr6mwr62msrawq6anpbGroKuYm6KgnJuqp6Kdq6KlqaWltKSeo5Omrqy4tKevo5KSmZ2lkpGgoZeboJ2Hpqukq62/wLGhqa6pl5KfnqKZo6Sqo5OgoZ6drK6nq6ajoaWfpKScramRpJupraqcnaudraKXmKaXoqSYnX/OlHl6pYF6lpabX62PXY6ogKChfKeVmnSrgoCvXmSMqXqoh4WfdJeSiLNjgquGoI2Ns2qErnN8loe4YYKtWaPNbpB1e9t7f5lxfoiSdX9le4h2dmx9h259hZCRfmyAjV9wam9mYF94ZFxxaGpjZmBSVFNXXkpPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTQ3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztbOkwtIVBARjQuMa3CwMC1tLC3mJ6Ro6qprbSrprKtraykrKawqqGnm5qmmJyir5+hn6ino6ahn7Csm56Wpq6tsKuorKCUkpufpZOQn6WXnaijnq6kq7Cov8azqKmxrpaSnpyil6Gqqp+VoZ6dnK2upqmom6amo6CqkqyzlqWiqqqepKenorGik5unm6GblZSRl6BwhYyYdYSoh3GwfJ1yrH2gn4Glj553q4J9rX+ccq1+q4eGn3aYknt8l36qiKGLkYucfqt6iJKOoIB6rVacxHqPb5LBfYGVbXVwjG1md2WGb2F3bnJuiIqRj4Nsj45kbXN1b2BmbWRfb2hqbmZjV1NcYFpSUkM5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv1MbHsrSfnaOOo6Kira62r6mxp6mrqK6rq6aio52ao5afpqufoqagqKiin56wrJibl6ior6yop6mel5Wao6KSlKGtm52no66so6y1qbnNsq2mrqyWlZydopmfrqydlqGZnp6psKepqZqqqKOhq5uvsaKorK+mmaarqquypJOYpKablZKFpGqkdYl6qXV6snGCpYmYjHCHn5qHpF9gUquEf66Cm3WugqeGhp96mZeFe2aAo4mkmIaBo32pf4GUhq5efKhVnaKSgXqjn4B7w6/FjHOvtLO5cWKpr8J0aIyMl46BbJiRbmx4eHdua2ZkZHFwZntpY1xWX2lYWFRMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C1sK+praOop6qrq6mkpp+bpZ+dpqempJ2smqKroaSfr6Kem5OqpLawrqCpm52XlaajkJqiqJ+gppywpqOosay2yLK1qayqlZGcnaKZoKW0nZqhlJyfpqqqoq2Zqqihoamis62iqrOyopyqqLCwt6WUl6SomZ2SfKpsnoSHdat5fLBugqSLiJ+WlZ6VgdK3tLjJgIGyXl+UqYOkh4egepiVmXiqyXOZo5SoqZCTmox+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SOj5ySe2+VkH1ueXR8em1bZWpycWaBal5hWGNtXF5ZSUxMS0VEQkI9QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwca5ramzrqylop2yuayqoaabqKarrKmmoKakmKujn66snaahrJqfqaWdp7Wgo5iTqKu2sqybppyglpCmrZKanKejoKqmraGjp6mwtMKxsqqtqJSJmJ2lm6KkrqWXoZWZnKWlqZmunKynpZ6ro7esoLK5sJ6cr6i0tLSmlpippJuhj4KdTniagX+feoSjfIKkhIamnpyelIS4e3x5uYJ/zMbDtneboZCLn36alpeJdp+XiqSYpKh+sIWbhJ6ErH2ZlGGlbKNwj4WQgX2XhHKsYKRycYCaYLx9UlV1jpGjlnt8kY6Hcnlyg31wXGxud3JqgW9aY19obmJkXUxMUVNBSEdGSTk5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuhrLO0pp+hlaavrq6ppp2lpZqjp6GyrqKpp7KgmaiklKK1o6SWl6KqtbmknKOdo5OQobKZnpumpaGirqycpKiitbHDsa2qraqRh5Gcp52jpJyll56YmZmlo6eYraGspKWXrqW7rKG3t66enrWzubK0qJmfsaKln4eP0bXDt3mHjoWRk4+ApniUoneLoJKFpYKLcauGhbRucmmZo5yViZ98l5mGh5BzroKlm6KNpouTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicXF/n2Jzsrhod4+TpJh9iouQiHZ7eI2BbGh3aXhzboB1XWRkbW1laGBKWldYPEhGP1QzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq6/v7y7tZ6XqKSttqGimZWjqaeuqauZpaGepqGgtaeiqaewo5Sro46kraSekZqaqrS0pJ2mnKmSlJeuoKCepqScp5y0maGqo7Wrwq+pq6mijISPnKKgpqOVmZqcmJuYpqOll6mmrKGkm6ymvayVvrCtn6OwtLustaidqrOlqZl7qJF9fLB3ioGkpYicbbJvoIete6GPg6iWmYCsiYWuhaCUqKGil4WfgJmVgHuSfquAnZqWi6p4naCPiJOSf3mvXaOBfKanZJ6AfJd0a65dpWtxhZldYFuMoG2UkKWYgZOLk4l4eYGWfmpsfWJ9dG2AemBnZXBuZ2doQllfWz1KUzJUOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWldTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiMoKLySmoSpxsO2wbSfmq2grrilo46bpKOgr66pn6Oena2Ynrmgoqugr6qaraCQqqmllomakK6wrKagqJutmJmPraKhnaWhmqWcrZigqKW2qL+upKmjn4uAjZubn6aekpSZmZOamqSjo5inqqqio56pqL6kl8Osq6OirLO7rLCoorWxqqyZdq9+kIqchYd9uq2JmGSwjGWVrX2hj4OnlpuBrYqEsIWmmaOhopGFoFtsaoGzYH+te3uCgLJsZ26Zl4uIsVt9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46nmoqWj5OUeXiNm3xjc3xhg3hzgHxhaWZwbWZlZU9VY1xBVF49SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBOSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt727tMGzo5ytpqW2qaCLmaCfnbOxqJ6in520mKCzqKqrnrCtnqualK6ooo6Im46vrKmno6iZr5Oaj6maoZ6ln5qko6WZnqOpsqi8r6Wonp2OfIqalqGgmZCRmZqRmZeonp+Xp6ylpKSipKm7nqDGp6Wpoqy1t66vqKC9r66ul4GpkqOujpuAhqSXmJCBgLjDuoOOnZOEp5idgqyKgq+Jp5yapauRftW9wqpio7+9fH6jgoPXure1hZOSgp69voRqo4Fvq4RunX96srHHg2ursL2seHeivrt0gJWNpZuPmY6UmneAkJl5Ynx6Y4xneIF7YGtla2phUGJbU2lcQFRgQkwpPDo1Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLG/urK9s6Kdrqals6adjJilv6m2sKehv6amsZuesZy5qJ+trqWnlJOvrJeMg5qRrqajrKKlnKqgmIujk6aep5yaoaiimZ6grKypuK2no5qXk3uHmJKmm5OPkZiXjpiUqJmelqinnqmmoaKru56pxaOgr6OrtLWrsauivKmwsJt0dqqktoVliZ9wZ6yPio9tb3ekkJqggXWwmpZwkI1ylqijm5iupHJsbWxlinhubYKZcYB6aXBpZomWlZdxaGmFhmdwhmRdimNpb1ldZ354pmBico+Sb2ZkgI2TjqGXlpeOlJt7ho6UdGWGd2eManh+eGRsY2ZsYktlV0prWTpQZERQJ0o6KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSqu7qys6qpoq6epLOqmJK9scPHvbSpnr+rrKOgpqufuqOkraytpY2VraqQjIWVl62fpaqin6SkoJGLpZKnmamZlqOqoJacpaanr7mqq5qbk5J7g5WNppeOkZGXk4yXlaaTnZanoZmwpp2irLmgsMKopLOmrLGyq6+tqbqlsLmXi6GppbadiZaimIapmpCUnZOqs5mbo6yhtJejoZ6hop2hpKGVq6eMkpOMh5KcnJSQmZOYkI6VhH+kmpeVjouTkoqPhoR+Z4uAdIN2dIeMcadtfJWSlJOBgY+Pj46ck5+UlpSegIaTi3BnjnZuiXd1fHlpa2Rkb2NVYFhAaVpHYmBOWCtFPSsmITY0MC8fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCllqmppba4rq6isKWtn6C2sZCOqsS7xLm3qaGlnZulnbCoo7annam1pqeQl6yji4iJj5ynlqykopqonp+TlaOXqJqpmZSnoaSQmqeZobS5p6qYmpCNe4CTjKGUipSRlY+Okpekjp2Yp56btaOdpqy3qK/CrqO3p7Cvsa6qq7W7orG+mpKmpKa1opKdpp6NqZ+Nkp+jrLCboaSyqrGZpaGdpKqenp2cl6ydkpqim5SQlqqZjZiYlpCWnpGHoJ2VlIWSjJCNlYuBfmaNh3WHdnmIhHScaoeRlZWSin2MlpKSl5GgkZuVnoKGloV4cZRyeIl+cXt+aW5kX3BpYFtfWW1iUGBkT1k5R0ZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJWkp6OxtKyuo6mnraCotaqQj5yjsrqtqquhopl6nKKwpKWxqZabuKajk5epnI6GiombopCun6SXqKChkpeZm66LqpaQqJmojJiojp64tqOlmJuNiXmAkoybk4qVkZOPjJGWoYucnKednrejf4OvtaKwr3SkvqOyoHh7oayzvZZ3rqWgioCqfmRcYnafjqSdg5d+bpOznKOor6ukZZ+glHR6mpdxgJmpmGyAo6iKZZylm5CXmJaLkpuQhJ2akJSDkoeOjpKJhXdrkIh2h3F8hoGAYWmJi5WTjFt2lZFnaI+McXqjl5Zkd5eGgHaXaIKJgm55fmpwZV92b2trZ1xlY2Fhb1JaPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXWBoZ2dYUUk8REc8OVZSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6mlqa2kp62lkpaqtK6xpZmppqqXc4udr5+oq6eTlrigoI6bpJ6QfoiImp6NrJqklaiino6XkZ6FdK6QiaaaqJGWo4ibubOnoJiZi4l1dpKNlpOKk5GQk4uPk5+NmZ6lmJuyloCMm7WdtIySj72noX6nonuksLmCjo+nn4SLhY+xqa+MiZaimXmBi6yGnJ2iqKupiJWHmXelm3qHnIGXp4KBe52yeoqGn5eZlJiWgZCWloSZmmN5h5CEjY+Si4NucZCIeoFxgIGGf4Z0h4WWkniWaJN0oJp0e5mCnpqEmH2RiYGCmGmMjIRqeHpwcGdkd21pbGpcZGlpZXJbXEhUTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWhmWVFIOURLPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrcW8r6CVpai0nY+DnaucpqKgjZC+npmNn5qhkHyFjpmYiKydo5ahoZKOlImGgJGojoeinKOTlp2Gnrmxp52ak4+FcHWQiZSQipSPjpuLjpGdkJWeo5SdrIiftIm0mq6Lyoirr4m3hY2wg7KwhamOp5iNnXyoj3J7d5uOppZolaR5tIufn6epk5nCgn+riJihcZ6AmqV9l4WVsoChfaCTn4+Yl4COk5uJmJKLfIWTho2Uk4mDbXOShoB7coaBhH2FdYaCmIGPxWaAqYePomqdgZ6XgJmAiouDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZsWGZGXFFMMkU0Nk1hYzcmNDxER0Q6NjM2NTg7OD49PT5CTD9OSUpLQ1BaXVxXYl5qbFxRRT1LTUBKZFhdY2doZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGqq6ealJ6ipKqilaSptqKvf6CmnKWenYmUvZmTjaCRnY95g5aWkYirmZybmqKFj4x3m5yOoJGInqSblZiXhqK4rKWZm42Nf2Jtj4uTkI2PjIyXi4+Rno2SnqCYoKh+oaeHrZ2glq6QoJ6dkYaCoI2ssYikjquajJp+onWAmJNrgat0Tat4h42dkpupqYKqq36EoXt6p2mef5JsZ5eGmLaJnn5uYGNYg5d/jHtkZ4tzmX15lmtdfJduX1NxhVxgbHmDYFllgn6EgZhxp6prg6NucqVwn4KcZ2SebFpsiHplWV+CfmFXUG92ZW10cWpqbl5qb2xraFdnTl1YRTlANEdEXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKW11fV15fYnZgTUU6TU9NVGJcW2ZnaWliYmRhZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiWnaC5oKqjpqyRoba8q6+imZafoKWrq5+crbSip5Ggn5+mm5mNmLSZkIuejJWLdYGUkY2KppaWmJ+ef5OFhqyjh5yRipipmJmakYelsKailZmIiYBpboiHi46OiYuMkYuPkaCLkp2fm6Glf5OBj6OhlKB3nJaQp4OiqICGq6+GpXqLfYSafaJwcpKHlnuejHlth5uLmZGcqZyPh518gqJzdqZmnn53pF6Ye32Tc6JumLe0unOSh4GAtqhkgca4e3CVtoxxgJukY3Ssq2B9ap2zfm59h4OPgouXcYCjbHOkc56CfaNenJmzlm97l56zdHJbnrKCaWJvc3VxaG5Ya2tycmRbaF1iTEQ9RDVRQVpxMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1lYYGB8ZElDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4tq2uoJqhm6KjpKubmrGsq5KXoJigpJmalJ6rm4uIkniLhXCAlo2Kj6GQk5Sdl32Rio6ooIeYj4qSopObmoyKqKekno+Wh4R+a3uHfn2PjYOLj4+JjpOegZWbn5ygn4uJd5yYoo2gcqKLiKmInKeRl6msgK6MfXqgmXmjk3iAc5eIjJx9lp+Gm46ZnKeHo2ShfYmWkJuMbJ5omo1umpl7gIqnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2domKgJ1omnWHk5KYjn+ebZmQaqaZXKh+d7tqfalajoRds2dcbnF4d2tpW3Bpd3hhX2ZXYkJQRU83VkJSbjRKWlleTlpEQDE1MTs7N0g/OkNHVT9YUlhdPkRiXVZgUWFjfWpFQjlOW15ZZGZYZmdtbWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZyJqrabqIljlZysurKwrJ2mm5qnn52smZ2wp6udl6KZoZ+Zlpago5mGiY1piIBxe5eIjJaXhJKUmI96ioSWo5yJlZCGi52RnJuIj6iin5qMkYqAgGmBhnl/lox7iI2Oh46VmX6SoZ6gopOYcmifiqCPjHCSjIKpiJmgpKmiqX2wraSiuJd2o7Oio3+IlHidequafqKPnpyYiZhyoX2FjbC1fWuakaF4fpi0o6OrqISYe5p8nJp+c6paXW97l4t4nmJMf3t7hWR6mEJNn1mianJ8jm6BioSZdpt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfX1uZl9raHV7YmNgUV5XXFRWQFlFUWdFUlZcYVhfSUQ9QjhAQTpJRThMRVhBVlFaVkRGYVxaYEtgbX1yRUM8VV5iWmVqVmhobW9iZmZeYWBcXV5gaGJfZWR2bF5lZ2ZsZGVsaGhraZSdgbGumYRTX6GntLqzs6maoouaqZucp5Kgq6Ogp4+enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32Rk5aIcoCJkqCbcpKQgYiZlJ+ahI6om5mVioqKfIRshIVxgaGMeIWNiIeRl5N7kaKfnqOIroZ9tYSPnp17ppZ6qYKWnpGLop5+p2h3bX6Zc6BzcXydhZhvk4KufaODp5+bgaRwXqlodaNjb6VhnNOPfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyp7x/d4Ntf7+mqrRenG9+cpdvgXOicl6kZ3SmYGimbJrTmHqCm253eZdrm3l2l3JsqaVnX2R5cH+Ea2dmY211d2ZfYVJbZlBRYUhXSVRfV1NbZGpbZVFGQ0tMSktCSkU4UEBQTVhTWE9SUWBlZWlSZHh5d0pGRWNdZVpoalNpaGpvY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGZobGiYm3+wrFRcS36pr7K1sLOjnJiEl6agoKOMpKefl6iJmZeYk5mTkaCXjoiFe3B9hGh9j4OTmoF3kY6PiXB/h4+TkmyYlHyJkZKjlYOOqpqTkoqFiXmEd4iAboGehneAkoWHmKCWeZOio5qgibOhoraLeqynpK6lcKmAm5GGgZ2TfaSAopmGmHGehKKtromXi4CMpI2Vg6+ilHa1trXJonSUi4KeYZ2XqW15lYefmnWhh3egfZCWioFvTGajknCaiHOle3l0YoOCbH6gbHJkYJxyf3SXa3tqtLW0xqZzmH56nGqamqt0gZptc3eXaZl5dJhxUER9s15qdWp4h2ZrZ2J0dHBtVl1TWWhPUmhJVUxYUlZcZ2tuVWdXTUpBSk1KSEpOQVFKUGRjaW1ldHJzfnh7bnWJe3tUUU9tXmhba2lSamhpbGdtZmNlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlopyJr6eFZj+UobKsr6+1oqKPf5anoqGji6SmnJulgZqXlo2XkI+bk46Ig3lqeYZlg4x+lp95dY+IjIJphIWSg4yFnY16jIqVpZKCl6mXjJGLgIl6gH2LeXCPoIZ5gZSGiJWelX+TpaeclpaEZ254nGyiZHxxpXicmHBop4KYjXyleqCWg5Zyn3aAiZSVj7lukIqiYn2ZopaJbnNqq2t1oG1vpmCbaYuQaZaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGeIgm5zolpfW2Shbl2JjHB7f3RyZKVueKJkZqdol3KLmG6hb1KIj26gXmSnVItdVJhtbXJqcYFtcGhreHNrb1FYVlZmWVNtSVhPXEhYaGhzallrVlFSRVZcTFhSYVVoal53dXp8cHx8coJ7f3N2jYCDdl5Rc2FnYnFnUGtoaGtsb2hkZ19dXV1gamJpaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupaqxsaafi3+WqpydpIuhoZmhoYCVmJONmo+Ll5COi3uGcYCIaIuKfJeac3SJfZB8ZYOHlYqJlpmCfIiGlqaQgaKrkIWQioGKfYCAjnNpj6WEfYWTjIeXn46HkqqmnommeJacfqWJloyymZ6Rg6+Xn6V5l4l6qXSmj4SabqWijJKEjIO8bn2lr4KHhoeUl52hfaZ7cqiUoJZnnn5vrGOWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4Zubp+ekZVif6uLqneAf46nn3effYWklZ2gaZqHdaxmnq2MtnN2voykk1mDpo2rYXVxc297dHFian5uaGxTVlpWYWBcakxcUl1JXWxtdmBbcVlbYFpnc2Vub3FjcXRgd3p+eXJ5g3KDfoF7e4yBgoB2YnlkZG5zZFJsZ2dvbXJpZmlhX15cYWpibGx6b1xcYmlhbWl3bWdsbmKVpqqdgYCepJaqqp6op66jmYiBlqqZnaOJmqScqJ2Ei5qPhZyRhZKNjIx0hXqIg2+NhH2Xk3N1hnKRg25/i5KGhpSPfXuChZeljX+lpY2AjYmElHWDh5JvbIuogIKLk42Im56Ii5Oqo6CQgHSUl4h+gXmUr6R/gpxxj4Z5koyFgHtyp4xxfX16l5abhI14e35+iJSVk4t3kZmgoYR7folrjIVbeXlzeXBpbn6SiXF/dIGPlJNxhYOCZY1/X4GAjHh2dJR1b3tvboluhIZfd2l4jmaCg4aPqpx/dH2XaomIb391fIR1bWxmjHN3e5d3hFtqWHmPaG53cnFvd3hvXWyGbWlnVlpfV1xka2RVYVVeUV9vd3lrandlampqdXxwcXRzYW91YnN7gXh1eoF1f4B/gXmLhYJ9e21/bGR5bl5XbmdodWt4amlpZFxgWmNpZWxxdW5aW2JrZGtreW1obG9hjpW6qaeLoaKbpqSZpJ2roqCDg5aqkZ2giJmmmqiYg4Gbi36WlIeOiomMcoJ8j31+j4R6l450coRwlYZ7fZKLhoaQhXh+gIaYo4x7p6GLhY+PhJWCho6Yd3GEqoWNkZyPh56dhoqaqKCgq4OJjpWbf36Kl62okJOnkHhxnpODe5Nwf6mGcH2VcWpvfIGfi3+Sjotobl2EjIycnKCPc5WMiHF0a4J2dIBZcm6GkIF9fotpXWljeoWDiIBfaXh7nHyDjYN2gYeDaXmMiGticXODd19yjYKKkKiWh2eNj4Nud4uCb4OLd25kZmN5gnqVWlxpZm52W3p4d3Rtc3KCZlxtimtrYlpZXVlYa3FbXmBZXl1mcn16dG90Y2pqaXt8cnp3dGRtdGhse351enx7eXl/gH9whoqEe31zfnpyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbmxncnlvaGptYIyMq7GhkKOhmp+emJ6ZqaOhfYKWq4yelIeaoZCklH97mIR8kpmIiIaGinJ9gIt2hYuBhJaKcm+AcpmHhH6Sg4SGioF6gISLmp+Pgqagh3iNl4iVi4ucl4SDeqyBkJeZk4mdnIaHoaufoqKji4iTm52jmZaqoqinoZOciZiQfHmPj4Wofn6SkZKTnLGlmpSdkI2xkpiEpoyMlpygipGcg4mSimt8jnZ3ZYKGkIp8iZ2Eh4uPh4iAhYSQd3x7dZujiYiLn4uGlX9+jYKBdnF0hoV/eImIi5GnkYSHjoiDjJCLe4WJh42AdWuBg3t5mWlyaGB0inB9end2b3ZzgV1db4dnbl9fWltcUmdxVWNbW2FsaHR7fHJucGRqaWh/e214fnBob3BsZoB7coGAd399f4R7bYOMhnx6eHx+eoN4TmR2anNucXtla2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5aioZiVmZiUmKSgnXt/mKmNnoyFn5yKnZZ8eJSCe46ZiYaDhIdteIGAcoCHfYeThG1rfnqXh4SDkH6AhoSGfYeDjZudkYapnoJxio+FkpGLnJF9jXqpg42Rl5WOnJaFhZumoKKanYaEk5qZmZCZpqCmnp6Ql4KTi3h9iI+Fpnx8j5CRhZiqoJyTnI+Nqo2RgJ6NiZSan4OPmH+HjoNweIZxdGF+hI+GdYyYgIKOgoaEfoWElW55dnWUo4yOhpuFhY51gIt9fXNzfImEe3mNj4WTqJCHhI+Cg4qJiXWEhoeJe25qfX97bWhrbGdeeX5nfHt2dHV1endcYHB9bXVgY1pbXlFmbVNlWl1ha2l1en5wa21ja2lngH9rcn9ranNueG6DeW6GgHaCgH2FdnKCjYd+e3p8gHuCi2Bpe2t1aGmDZWpjYGlbY3Vob2J1bWtUYnF5ZW95enJlam1ti4qfuJqhpJ+TkZaXi5qfnp17d5ylkJuJhqSUipiZeHmNhXyJkYOMgoKCbHt/eHKAhHyJkHxraH2Cl4mBiI58foaEh3yPgI+bm5CHppx/cIuKjJKGoKGKhYx8p5GIj5KWk5aSdoyjoKGdlpp/gpGamZONmqKipJuYkZx/j4Z6gYWPiKGAfoyNj3yXpKCgkpmQkKaMj4GckoqTl5x+k5N+h46BdnSCcHZgfYCOh3KKlnyHinGMfoKFho9oeHJ5jZmTkICYf4mMc4KIfX1yenyMhXt7ko6El6aUjIaRfIWGh4V0gYKGhnlkcXp+eHlwbGpmXn1zaHx1dXN8c39qXmB0dnB3ZGNYXV5SamhUZFheYWhqdniBcWZrY2xoZX+Aam19Z21wan13hXpri4FygYF9gXR2goyGf3x6gIF9f49qcoNudGliiGlsYl9xVXRvbW5geGhsV2p0dmJ1entxYmtveYmNn7OSpaWdjpCYj4adoJqcfHWjn42Xf4yhioialXh7hod+g4l+iIKBf3B+enR1goR9iJB3Z2N9hpeLgoqNeH2AjYN5loCVl5WNlZ+afW+LgZCThqWbh4yJg6aVhJKKlZeSkXaQnaGhmJSYeoCPmJePl5qdpJ6Zk5Sce5GHhHiGl46efoKKjoxzl6KeoJKYjo+ijIuDmJmEk5aaf5iNfImNgXdyfm57ZIB8i4ZwhpOAj4Frh4OBgImFZnZvfYiTmY5+lHmMiX2AiH18coB5ioZ6hZKKjJmjl4OEjHeIhIKBdnqAh4R0X3d3fHN9d2ZrY2B+aWp2c3R1fXF8Y2Nhc251cm1hWV9dWmtkUmJXX2BpbHV5hnBjamNsZmh8g2todGhsb2h/fIF4bY+GcYCCgn90fIOMgYB+eoKDfnyQbXWJdHRtZYpsamFjdVaDaXBuYHhnbGFqdnBmeXt5cV9xbIWFkJ2umKeono6Nl4eFn5OWmH12qJuJmHmWnIuMmI94e4CLfXyDe4CCgXhzeHlzfYCDf4iKgGRefYuViH6FiHR9fop/fpiElpOWjKOgl35xh3uTkYqmj4yOipKgkYORj5OXkIqAjpegm5KQknSBjpKUiZ2dnqeZmI6VmHWPkItthpmQmXuHiJCJb5edmqKTlIqNnoyGgZOdf5OSloeaiXyKioF6cnprdWx7f4t+boWSg5N3b4KEfn6LgGVzan2Bl5iFgI50kYmEeoh+dniBfoeBfYSOho2VpZF5hYJ0iYd9f3J0f4aCbGB6dHlwfG9hbmJke2Fub3Zzd3dzc2F2YG9sdW5vXVteXV1qXU9dV2JhaG1zeolrX2plamNod4htZmxoaWxngHx6d2+Ph3OAg4R9dIGGiXqDfXqBhH19jnJ5i3l4bmyHa2hfanJjh2hxb2V2Z21sYXpoa3x7eHBhd22LgZmaqqGkqZ6KipGGip6KlZd9dqyXjJZ8npORlpSIdn17inx7gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkYaAhIRzeoCGeo+Rh5GRm5KkmpOBfIF8jYqSo4iNio2Xmo2FkZiTlY6IiIuSnZSRjY1uhJCPkYmemaKhl5eJl5Jwi5uFZ4eaj5R6iYWQinCWmpOhkpKIi5mMgn+Rnn2Sj5OMmo97ioWHdHN2a3FudXyLdG6GkY6ScXSAfIKCiHxlcW16fpuUfoWKdZGLgXSJem+Bf4KIfYWNioaOlqqOe4h9fouFd31wbn+EgmJnd3N0bnpiXnBhanRecGp6eHhscnBleV1tbHNtc1haXV9halpPV1dkY2ZxcX+IZV1paGdiZ3GNbmRpZ2VpZ4B6d3VvjoRzgYGDfHWCiIV4hXx3g4V6gIp3f4t7e3J5g2pqX3Fpc39rcW5tcWdva2V7Ym5/eXZwa3Z3iX+jmKKooaebiIyKgY+chpOcdICplJGNhqCMlZOQf3N7doV3eH9yc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWAf3+gho+KkZyXoJOWd4l+gIyInJ2Jj4aSl5aFiJSYj5aLi4yNjJ2Lj5GEbomLj5GKnJahnJiWhpiJbIalhWeHnoqRfoyEjIF3k5iRnZGQiImUjX5+kJh8kY2QjpqSfYuAg292cGxtb3B7hmlzg46YinB3gHWCiYN5Z3NvdoKbj32KhXuVknp3inVxinyHjXuLh4WKj5ykiXyEdoGLgHd4bWl/gX9ccXJxb294Wl5wYW9qXm9pfHpwbW1qbXdgcG9rcW1ZWGBhYW1XUVNZZWZidXCEgmJda21kY2Zrkm1gZmZfZ2uBdHFycIuAdH+CgHl2gIuAeYZ/d4eGdoOFe4eMgHt2in9qcWN9Y4V8b3BsdGpobmx2d19xfnl7dHVzf4J+pZWarZ+nloWMg36WlIOPnnSJn5OShYqajJWNi3pyd3SCcHKFc3F1iGxubHVtiHeDfX9tblVRgauUh4J5gHZygnmCoIKRgZKRl5uRmXeQeoKMkqSak46IlZiSg4aWmIuTi4iOj4iehZGLfXOLhYiPiJyZn5uWlYCUgGmHnoloh6GIkoSRhIpxg5GXj5qOj4yLj413e5OQe46LjZKXjXyIfIFrd2pua2xten9ieX6OloF2eoF3g418emh1bXWIlox/iYd7lJFyeoVxeI57i417iX6EjpGfn4Z9fXiBi313cGhrgIF3XndvbWtxclVeb2JxYV9tbnlwZ3BmZnR1aHFsYXdlXVZlYGByU1BOW2VkXHhwiHxeXGlxYmJlZpFpX2dkW2dvfm9rcXOKfXZ9hYB1dn+MeXuGgHiIg3OGhX6MjIR8eZV4ZnFrhGCHfm9va3pgaW10f3RfdHx4hndzc4V8eaGQmrGcpY6Cin+CmYiAi51+ipiSjoSIl46OjoR2dHZzgHBvhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xvdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2JnH+OgXh6jH+IjIqcm5yblpR6jndpipOJbYmkhZOImIOGY4yRmI2UiZaLjYmLcHqViXyOiYuTkYp6hXx/bXxlc29rbHp5XIB5j46Ae31+f4aOe3ppdWt0jJCKg4aGfZaNbH9/cIGNgI6JfoR7g5GWm5uLfXd4gpB5c2xlb36Ca2l0b2doc21TXm5kcFpfa3J5Z2trYmd4c29xZF93YGFWa19edk9NS2BlY1x5cYp0XFtldWBhZWWOY2BmYlhpcnNta3F2i3x0eYaCdnd+i3N/hn97iX9yiYeBkYqIfX6ZdmVzbn1liH9vcGuAWmtueXlzYHZ6e412cneKd3mfjJuvm6CQgoV4iJR+fImch4SekI6FjJeEk46HgXR3cHlwboRvbW5+cmNkeHB8bnp8amhsY6Sawdyu76Jza3WDdYShhZFulY+Un5SagZFwhYujl4mOlYqQnZWDgJSPhIiPgJKKipd+h3t1f4l4hoWOm5qXmY+Qdot3cIiKjH6MpYWTip2Fhl6LlJeJjoiOi4qEiWx8l4J9iIWKkY+GdoV+fmt9Y3h0am94c1iIepGHhXp/f4CFjH56ZnRqgYuPi4SEgIyYhmyCd2+JkoORhX+Ce4GRl5OZkXV0eIaNdnNxZnR4gWFzbW9haHVmUmBwZ2tVXm10emFyY2BpfXFybltjcmFjV25aXHdNTUxjZWFddnOKbVtcZHheYGRmhF9jY15ZaXJrbmtyd4t9c3eEgXh4fIlxg4R9fYh7dIuIiJWHjH9/mHNodXF5bYx7bnRwgFdweXZ5cWR2eIaMaXaAinKAnYiZp5yjkoR8cIyUeHmKnYOEn42OfJWNgJmHhHtyd3Bzam+Ba2lsfHReYHh2e3B0emdgZXzr2rXJw9yJc2xzgHaKmoiNaZePjpyUkoGIcIWIoI6EipWKjJeTfI2SiIKIj3qRi4aPgoB3eIOEcoeCk5uWlJiGjXaHf3GGg4qIm6OElY2fhIlhg5WPhYiGiYyHgIdofZR/fYKFiY6OgnGGfn9yd2d2cml0d2xajH2SgoV9gIOAhIqCdmJ1bYqCkYyDf4CTkn5ug216iJGIk4V9gn6Bk5SRl4lvcnqMhnVscGpxd39ec2huXGl1X1JkcWhmU19vd3Vgb2BdaIJxcmpXZ2ljaVhtV1t1TEpMZWZeYXJzhWhbXGV5Xl5kZ3phZF9dWWtuZW5qdHeKfnNygX57dnqHdIWDfH+Hd3aKhY+Ygo2Ce5N2bHd2eXiTdW54en1YeYVxgG9neHaRgmR2hoVxipaGmaGbooqGc2+Si3J2jpt9iZmIiXuff4SZf4F4cXRub2RyfmhmbHd3W194e3pxcX9pYWdhf9W2jpGneG5xd3txkpCNh2qYjYibkYuGe2iHi5mGgZKQhoaXjXuMjICAiY17kI1+iYV6dXuDe3GGgJWZjpKUgol1hIh4hICMlZ6gh5aQoH+IYX+Th4OHg4mNf3+CZn2RgH5/goyPkH9tg3yCdGttd3V0d3ZrY42Bjn+Ef3yEf4WIfnBgdHKGfZCOg32Akop6cYRne4WMiI2EfIV/gZWQkZOFb3B5i390bW5panh8YWdpaVhrdVpSaXJpYlBicnltYmVeWmqDbnNiXGdfZW1fblRab05ITmZkXGZucoBrWltjc19cY2x3ZGVdXVpsbGJtanN2hoBxb398fXR4hniFg3yAh3V5iYGSlXyJhnaJgXB4eXuEk29te4B2XoN/dIFtaXpzlHNncoh9cpKRhJqfm6CGhnV1lH5tdpOXfYeQg4qNmXyMmnZ+dnFvbGphdHxnYml1eVpgd3t5bXF+ZWNoaFedj19yc5e8xIR2cZSIkH5ylouGm5KMh3JqiI+WgHuUjIGEmox8ioV8e4mLf5SIdYmGdnd9gXJ1hoGelIWUj4ODcoCKdoV8ipqemYeVj52BiWZ9k4J+hIOJiXKBfWZ+jHx5f3+Hi499aYB9g3Zmb3l4c3dzbGuOhYqBioB4goGFg39rX3N5e36Oi4Z8gpCBfnOCaXqEiYyGhXmEfYKZjpGMfm5te4h9dnNuZ2Z7dWJbcGJXbnFTU25zaGFOZnR5ZmBeXVlvgG9zWWViXWpuYHBPWWtRRFNnYFpqbm18bllbXm1jWmJvd2RnXF1ga2ljbGpzdoGDcG1/fH90dYN6g4J8gYV2foiBlpB4hIt0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGyTjYWfmKCZhIhufYx2aniXjn6AiYKUl4l5j5ZvenNwbGlkYHN6aF9lcXpaYHJ8eWdxemFlZY+xsndLYlql2tCWcXuQipB4fZOKhJiRjIVua4WSkXp5koaBhJiKfIZ/eHeJioSWgG+LiHF1fnpqeYWDpZCEk42Df29/hHeEeYedmpWMlJGVhYhwe5KCfIKDiINugXdogIR4cn+Ag4qHfGV9f4R1Y3BzgGl5cG91mY2Gg4p8dniAhXqBalxyf3OCiYaKfoeKe4lygm5yhYiPhoZzhHqCmo6OhHhub36Ef3Z5ZGdpe3BeWHZaWHBsTldxc2dgS2x2dWFeXFpZdH1zb1dnXWZqcmBvTldoUj9ZZl5acGtoenFbWllrZVpjcXlfaFxeZWxoZWtpcXd/iG9sf36AdW+Ce4CCf4J/doGFiJeKcYKNcXuGfHp5hJOMdWp6f2tvfnR/fW9ye3qTcG+Bf3hnkouDoZmckoKFZoaDb2d5lYh9foSBmImBfI2MaXhya2tmX2BveW1fYm94XGRrgnphcXZfZWXU6r2LMjo+i45/cXiFiI6NdoOWjH6SjYx/bWyFjYx1fI9/hYGViHyCeG52h4SDl3duiIVsdXt0ZnmCg6eLgo6LhH5ugHV3hXqInpGNkZOTjouHf3uShnd+g4yCa39yaIB+eG18fIGKg3dheYSCcmRxaH5udXF1gpuLgH+FgHN1foFzgW9cbn91eYuEi3uHgX2JeXtybYmEkYWMc4J6gJeMi390bWt3gIB0dFxoZ3ZvV1Z7UllwZExacnJlW0lxeG9cW1tZXXR+dGhZYltnZm5jaU1XZlE9XmVcXXVlX3RvWllUb2RZZHF5WmhdX2ZtZ2lraXB3fY5taYKEfnlugHx8gX+CenWCgY2ThHCAi253fYB7e4iTiX9oe31qc3tyhntzd35/jHp4hH18bIyNhJudloyAgGyNfWtofo2Len5+g5OCfn2KiGt1cWdoYltiZ3NvX2Frc2BocIh6YnN0XmNkm6CPblw1Wq+1dGmAiHyShnWFloZzjoqJdnBshYOHdXmJeIl8k4h6fnJndYl+fphvcYZ+aHZ5bmZ5h4Skh4CGjIl+bn92gIJ+jZqIg5WSmYqLhYl8j4hwen2Ee2h+bGqAe3pqeneCh4ByYHaBf3Jkcmd2gm11e4aVkYF8goFvd3p8dX9tWXCAd3WMg4d4iHaDiXt5dG+KgZGChnN/fn+UiYl6b25qboKBdG5dZ2RycFBaek1bb1xPXHJvZFVLc3hpV1lZWmFxgHRgXV1gZ2RoaWZOWmhNQGBjW2B2YVx0bFhXU3RhWmRvcldqXmJoa2dtbGhwd3yTbGiEinx8cH9+e4F/gnp3gH+Ki4Nxe4hvcXeDf3uKjY+Dan57bXd4dop3fHiAgod/g35+em2EjIiYo42Eg3p1i3hrbIOHkHh9eoGRgIB+ioNwcnFjZl5ZZl9vb19gZ3Bmam+JdGF0b1thZGp2e4C/nKakyLhxhYNyknx4hpODc5CLh3Fyb4N7g3R0h3SId5SIeXlwY3eHeoCTaXKEdmd3dWNqfIKInYF/f46PfXOAdIV6gZKQg3qXj5aQiIKIe4iIa3h5fnRnemhrf3lzaXp2gIN9aGB3h35ranRoe4BpdoGMkZR+en5+cHx2fHR/YlZ4fnNzi4WCfYRxh4p4eXFxhIOOgH96fn12j4aDdmlxaW2IgXFvXWdhcW1JZHVLXW1VVFpzbmJRT3R4YVJYWF1hb4JzW2FdaGVlZGtkUVtwSUNjYFtjcF5cdmdVVlV3XltlbmhWa15haWdlbm5ocHd6k21piIx5fXJ7fnmCgYF8dn2DiIaDcHeEcm13goJ+ioyTf3CAe3d5eoGLdIN4f4GBgoR6gHVvfoqLm56IfYV6d4V7Z3SFjI95fn97iIWDdo+AZ3BuX2RcWGVZbXJhYGBwbGtoiW5hdGlZXmRugHep2qrHhoeycYl3b4x1e4aOgHqSiX90c3R+d4BwcX9thHSUhnh1a2B6gnmJj2ZxhHBndm5bbXyAkJN/gHmRk355fG6Id4KSjIV1l4uSj4eFhnt/hGx0dn5tZ3ZkbXt1bWl3dn9/fGFieIV6aHV1Yn17Z3WGjo2Ve3SAdnGAe31tgFpXdX9wdoWIf4F6bYmGdHpsdoGEhX98fnl8dIuCfnNodGVui4Nsc1ppXnRkR21tS1phV1ZWd21iUFJ0dlhQVlheYXGEb1xgY21kZF5vY1VeckZCZV9dZmhdW3piUVVcdVtaZ2thVmpfYG5lZmtxaHB2eI50a46NdX52eH53gYOBe3N9g4iHg29ygHRxdX6FgomOint3gHiDe3yFh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeF59hZiLeIaDdIWGhHeJemJubVxiW1thVmlzY2BbZ25vZodxYXFmV11jbH98ys6HuaFqbW2KbHGEcXyDiX57kYR5eHN5dXV7amx2Y4R1koJ3b2ZefYJ6i4plcoJranFjWG16hZuIgoFzl5R4f31vinKEi4yIc5iPkYmGi4N7eX1wcG98ZmhxYm14cWprcXh9fHpdZXmAd2l2eGaCd2d0h4yOlH1yh2pvfoF5bn1dWXN/bnWBi3yCb3CKgHF3aXiAgoCCd35ze3WHfXtzZ3NhbouBa3JYal52W0dtakxWVF5TVXtrYU9UdXJQUVRXXmJ0hWldYGxqZmNZbmFZZHBHQGdcYGZeXVZ7Xk9VZHBaW2poXVdoYF5yZmtncWdwc3eGeG6VinR/enh+eYOHgHVyf4aFjoNwcHt4dnV6hoWHjIZ6fH90i359hoSEh39+fn2Hf3x4dnh4kZOff4x8i211f3hkgoaVhXORim+FhYF6g3RjbmpZX1tcXVRncmRgWGRxcmaBc2JrZVdbYGp/d76ue6C2bmJzhmhze3F5gYR7fox+d3dydm97dmVqb2CHdY6Bc2piXn94eYuEZnF/aGtrWlZvd4mjgYR/cZmTcoF5doRvgoORiHSWiY2IhYmFfXh0cW5oeF9qbF9tdmpnamt5d3p2Wmd9fHhlcn5uhHRldYWNhpZ/cIxna3qEdW51Yl1xfWx1fYx8gmZ2h31ucWl2f3l/gHN+bXt8gnt5cWZsYm2JfWxuV2pfdlVKaWpOUU5oTVh7aGFOVXZrTFFUVV9mdYNmXmFxaGdiV2ldXGxoSkRqWWFkV1lVeVlNVm1qWV1rZFxZZWNedGZsZHFncnB1gXhwmYV2f353f3yFh311c4KIgJWDbnN5e3pzcoWHiYiDeYF+dY9+fISKjoSChHt+i4N7dnt3d5qdl3qKgoZpdn17bIOEkn9xjoFwhYJ+gX9wZmxnWF1bXFtTZHBkXldicnVpdXBlZWJXXFxogHBvcoBziWRkeH5pdHVzcoGDd4CEeXZzdW5renFiZ2tnhnSNg25mXV99cHuJf2lteWdqZFVXcm+NpnyEe3aWkXR9c317b318kYZ4mn2IhoOGg311b3FsZ3RcbGdebHRkZ2Vpem97cllngHZ1aHCBeIJ2YneFi3yUgW+Mam17gnFnc2Zhbnpnc3iLfH5id4N3amxydntxe3p0fmd/f4B5d29kZmJuhXxsa1ZpYm9SSmhqT0tOb0dee2ZhTVV0Y0pOU1dhanZ+ZV1nc2lmYFZjV2NwXUxLalhjYVVUVXNWTFh1ZFpea2BcWmNlX3ZnbWJwaXNvcn91dJmCd3+Ad39/hoV6fXSChH6XhW5zdHx6dHGEhY+BgHqLdnSQf3yBlY6AhYR9foyGe36AdnujpYp5iIaEa3V8enWDgYt6boRzeYR9gYN1bmpoZVZdW1paU2JtZFtYYXN7aWhtaWBiV19baoBqa3CAZ2tgaHl4anN0c22DgHp/fHV1bnpoanlqX2VuaIF2kIRnZVhid2p+h3tvanBnZl1VWG9njqh3gXp8kY55dnF/cHR3epCBeZZ1hoOAhYh2anF1Z2duW2xjXW1yX2dhanhoe21bboJydGpvgX56d2F3hYR4j4VziHJveYByY3FpXHF4ZHJ0iXx5Y3SAcWhqenVybXl4dnlkhHx/eXdxZGRjbnx9a2tVaGFlUkpsZ09HUWtFYXhnYU1TcV1KTVRaZWt2emVfbXFpZF1WYFZubldLU2hXZV5YTlVsVEpceV9bX2tdXVtjZWB5aGxgb291bnB4dXqYfXeAgXqAgIeGenh5gn6Bk4RydXR/eXZ0hIiRfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aEq59/eoiIg2tygXl1gH+BdG6GbnyAc4qAam9tZGRYX1pZWlRhamdbWl50gmlebWxcYVdcXGyBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cmx5Z2l4Zl1lc2h6d5OBY2NUZXBngoV3d2dpamBXVllnY4+nb353gIuOe3Fyfmh6cHuOfXiQcoR9f3+GbmR1cmRnZ1xqYVxvb1xnX211ZHpoXXSAb3Jrcnx+dXZidIWLe4iHgYB4cnV/dWFwbVtydGNxc4V8dWVzgG1hbXtwa2p7eXZzZoZ2e3t2cWViZW1yfmpsVGhdXFRLcmJQRlZhR2J3Z2FLVG9XSkxYWGdrdXpkZW5xZmRaV11YdmVUSlxiV2dYWUlXZVBIYnhaXV9sW15cYWNefmlqX250eG1wbnaDl3lygYB8f4mMhn51dYZ5h4x9dHZ1gnl6eoKMjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj62Me3uHj31lcYd5c3x7dXJuhWx7fmyPemJwb2JlXWVWWVlXY2ZrX11ccoVoWHBuW15YWlxse2Nwd3ZtYlpsc3NndHVvbIN4foB4d25udGRpdGVbZ3VmdnaSeV9dUmZmaoOCdH5iZGlcVFheYmOPpGh4dIOGkHlucHtpeW58hnx2inOBeHx4f2hkdmxgZl9eaV5cc2tZZV1vb2J6ZVt3fGtubm94eXN1ZHODkn6Hg4l7dnByfnNieGRccHBicXKCfXRncoBlXm53aWVoenx1bm+CdXR9dHJiX2Zubn1laVRnWFdTTXdfUUpZWEhidWRhSVRtU0pNWldpbHF7Ymxsc2NiWlpbYXdcU0xkXVhpU1dIWWBNRml1WF5gbFtbX2JiXIRpZ2FueHlsb2p2gZB4bYN+gIGTiISBdnOIdIyGdHJ3doJ3fH1+jJCAfpN+cHeVg3yZknmAgHh6foB0iIN0cJmie3p/iZR4ZHWHeHN4dWtzbn5reHxwkXJecG9gZ2JsVFpaV2hjbWZcW3GJZVNybltaWFhgbHZjaXVqaV5ZbXNwbHNzc2mEfH+AfHZvbmxkaXFjW2tyZHV2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcnGFhJF0bGx7bnBxe319coF4gHN6enpjZXVoXWJZYGdaXnZoV2Jdb2hhd2Bbe3ZpanJueHNydWhxgpWDh36EdnNqcX1uZndYXWxuY3JzgXp0Z29+W2BwcmJga3J+bW11f3NxeGtwYVxlbGx6YWdUZlRWUVB1W1FPWFFIY3RiYEZVa1BJUFpVa2tqfGVtbnFiW1pYWWxxV1JQZ1dXaFNURllcTkhydVhfY21jWGBgYV2LamNkbXl4a3BpdXmGe2uDfX+EmnyChHl8h26PhnFud3p9dIKCfIuPgoKXdHeCk4WBn4l1gYCBdH+CcYeCdW+il3N7houGe2V3im5tem5md3B6a3N2coxrXnRuYWdla1JdW1VnYWxrWlxwjGRPb25dVlhVZ2l0aGJ0ZWVdWW10bW91dHhqhnx/fIh2j3NkZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1jX2NUWmBZY5WVY25wg4WKdGtofHBmdHh1fW16dXZven51XmVyY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGlzcXRwdXZrbYSTgYl7hXFzZ29+cXNvVFxna2ZxdIF3c2NtdlZicmxbX3BnfmZtd35zc3NrbWBaZGpqd19nVGRUVVBUbVdRVlNPR2RzX2FFWGlPSFdUVm1oZHxpa3drYlddVVt0ZFNSV2lSWWZUU0haWlBNeHZaX2VsaVliYF5ejm5hZmt5dW5vaXZ2f39sg4B9h5d7gIeBiX5rk4hyZ3SAe3WAgn2Ijn+Lk3J8ipGFh5+Ge3+GjHOBhnN+gnZupYxygY2LdndteoxgZHtwZnhyeGxtcXaCZ2R7bGNmZ2hTX15VZ19sbltebY1oTmltYFRWU25ndGtleGRkXFhvc2xxendybId7gHecenlrYWVsbV5gb2plcXl+Z1pWWGBseHx7cIRfYl5nVlhfV2SbiGJrcYGHfXhsa3luXHdzbXtqdnRvb3uAclhpbV5YXFVhYldkcGNTXmFoYWJsWmB+a2Zrc3ZvbXd3bGmFjH+Je4htcWZxfW5zbmNaYWlpb3SCdHNeaW1TZXFlVWNvY3tkcnd8d2twbWtgWWFnaHRdZVZhVVJOWGVST1xPT0hkcF1jRllpTUlfS1htZF94aG59ZGBVX1RddVxUU2BnT11hVVNKXFlQWXR1XV9lbGhYY2FbXo1xY2dqeHFzbmh2dHqDcoKDeoiOfnyJh415bpCKdGxzgnR/f4eFhpKElY95foyPh5GbhIB8jIVzgIFzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2MjIyMjIyNjY2NjY2Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjI2NjY6Njo6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQVLM2tjY2Njci2lubm5ub2pmZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUyRtjq5+fn5+uLYmdnZ2doY19fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGk5SUlJSUlY2JioqKiYqJiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZGSkYmHjoqQkpKTj46OjZGIj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Li4uLi4yMjY2NjY2NjY2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fX19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkJCHiYeGiYWIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQjYSHhoWFhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJGJg4WFh4SGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjI6Ih4aGiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNkI6NjIuOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCh42OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4qKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjYyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3R0dHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJydHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg5Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1c3J2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgYGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9CQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fX5/fn5+fn5/f39/f39/f4B/gICAgICAgYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCBdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz49Ojo6PDo4Ojg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF7TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9P0A/PT5BQD0+PT89PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJFQ0RBP0BAQD89QEA8Q2NEQEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD46Pj0+PDxHe1s+Q0NFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hERkhEQD48Oz5AREVEQEFGQlFlbnB5cUVERERDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSElHVWVhfoWFhYB6VEFBVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLS0peeoCDg4F8g35jTmyEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdXZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS2R/gX6DgX2EgnuAhoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhJSEtLZn9+fYKEg4GChISEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4enx7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dIS0dqgIKCgoOCgoOCg4SGiYqLjIuKiYqLjIlUOzg2NTY3NjY2NTU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg5Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUJERWaCgoKBg4ODg4KFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojo7Ojo8ODk4OTc3Nzc5Ojk4ODc4NTg4O0E9Pj5CQT9BS0xPUVBRT09PUVdrcnJ0dHV3ent7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOj1DU4GDg4SEhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDs5Ozw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj8+QT9ZhIOEhYWFhoeJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD4/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PDs9P0NCQGeFhIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERkVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/PzxAPkFARUJOfoOEhYaGhoiIiIiHhoaGh4mKiouMjYyMi4qKiFdHTExNS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZIR0VLSUtJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3PD47PDs+QD9BPkFARERIQ2qFgoWFh4iIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLR0VHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ozw9Oj9APj8/QkNGRUxXfoOEhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSklIRkpKRUpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojs4PD07PUE9PkBCREZHUW+Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIuLi4uLXlJSUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAgH9/f1VFQ0VFR0dFRDs/QTs9PDk/PT1AQkdGQEVHRUpRd4aDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVFRktPTk9XVlFQT1FTUk5TVE9NU0xQU1VXUlNSUExLTU1NS05HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI+QkJGVk1ES0xJTlJ6hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZU1lYUlpmUFVXWl1SVFdRUE5SUFBQUUtMS0dISUhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUJDRkVERUxYUkxSUlBTVXqGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1XXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NSkxKSUlMTUtPTVNvdHZ4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTUlZYVlhXd4WEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RTVldXV1ltgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlFVUlVTVl91eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5cVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVZSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlNUWl1tcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVVFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBDQ0BDPkJIR1ZASU5NR11pUUhGT0ZERUZIR0hCQ0hHSEpHREJBQ0BPUE1SZHR1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xzdnp7eHl1cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo7PkA/Pz4+a1FLYUVGSElFQj9ITU1HTVFVSkJFPz48PTw9PT89P0FDQj8/PD1CPkpNRlVvdXV2c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBQ0JcXU97Tk9PTktMTU9PUExLTFdOSUdAQjw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXZ1dnd5fHx8fXx8fX1+fnx+fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfX2BlYF1ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGQ01SUGFXUlhRUFNTUlVbT09RVlBNSUNGPjo5NjU4Njk3OTozNjU3OTU8Qj1mdHV2d3d5eXt9fXx8e3x9fX5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1RUU1BRVU9MUlNUV1hUVFhRTFdZWVZYWFZYWV1XV1hoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUVBTWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk4R25ydXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVlhYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk5PVFNUXFZSVVNTT01MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3p6e3x9fn1+fH19fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhYWVlZUlVPSkdPUE9PTVJKT1BQUE5OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUkxJTEtPUVBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRT1BQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz09PDk9RzY2NzZEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZ1NRU0FHVVBPUlFQTU1OTEpMS0xOT09RTU9PTUhMS0lLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QUBCPT5FSEZERkZJR0tKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT1BMTE9NS01MTU9OW1ZLTVFPR0lIRElKTExLRkZGRD9DQz49Qkc/Qj5BZHF0d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVQTU9OV0tMTktMTU1MTEtOTlNkTkpMUklJSUVBSUpMTU5LR0lGQkFCQD9FRkVIRExvcHd6enl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0dLRT9CPTk5OTo/Qj88QUJCQURER0tGRElJR0dIQ0M/Qj8/QEE+REVDS05RVEtKSU1URklJSkxKS0tJSkxNT1BSUEtHQ0xHQ0NKSkxNT05JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEtDRkhIR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTU9HSEtGSEtESElLTUhKTEhJSkxKTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbml3dnZ7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZHBGS0NGRUdERUVGRUdDQ0A9PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkNCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NR0lMR0ZGSUlMTktKSEVPSUNHTU1OTVBOT09NTElISU9TUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VGRUJCQUVAREI+Pz46Ozs9Oz0/Q0E/QUNGR0pHSklMSEdHR0ZFQz89RUVCPkFDQ0NFR0hJR01QSUZGR0tOT0tGSElGRURESUlIS0lGSFBLREpNTFBOT05PUE5KSkhNUlVVUk9XZGFhbWdwcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQUBBRDxCQT5BPTo6PT87Pj9AQj9AQkVHSkZKR0lHRkZGRURDQUFGRkNCQkJERUVHR0hGTFBMSU9KSkxLSUZIRUZFRENJSEhLSkdLUk1DT09OUVBPT05PT0tLS1BVV1ZVVFlgX11pYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNRkdFR0FCQENEPEFBQEM8ODk9Pjo/PT9CP0BAREZIRUhGRkhGRUVDQ0RCRElGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTk5QTUxOU1dWV1hWWF5bXWRgaGJqaWdrX2RlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRUU8QENCRDw3Oj0+Oz46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhFS0tMTE5PUlRPSVRVVFFUUFFNTlFOTVFXWlZaWVdaXltYYWBgYF9oZWNgZGVnZ2poaGpmaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQkNIRTxARUJEPDg6Pj48PD1CQjw/PkFCRkNFQkJIQ0NERUZGR0dJRkdLSENJSEdJR0ZESEtJR0tJTUtKS0xITEpNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVFlaWVxaWlxfX15gY15cYWNrYmBkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCRUdFPEBHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRGRkhIRkhHSUtKRUpISEtIRkZMSEhISkhNTExMTElNS01OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZV1kYGZnYGVoamNzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF3dXV1d3Z1d3NndHJrcXJrcndvd0lKTElLR0JFREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRURGSEVJRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tLTU1KSk1MTU5OT0xPUFJVV1ZOTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYWBjZGViZGljZGlqZ3aLbGtpaG1vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3d0dXV3dnV1dWVxc2twcWpydnB3SkxMTE1HQ0NBRDw/RUVFQz1BQUNCQkNFQUNEQUFFR0NHR0dGRUpGREdKR0dKRklMSElKTUtNTEdLSUhLS05RS1JRTFNNS05NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGZiYWNpbmljaWhobXh2bWhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdFQUBEPj5ERUZDP0NBRUNERkNDRUdDQkhFQkhJSUhIS0ZES0pHSEpISUtHSkpOS05MSUxISk1LWmZKZFxLbFJIT01fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsa1Vfd3ZpamhoZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDQ0JFRURGQkZGR0RES0VFSkxMSkxNR0dOSkhKS0dLSklLS05MTU1MTElMTUxbc2JkcF5sbFVNTmVzXmdmcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXHB1Z3FNS3J5dmtiYWtlZWx4bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ0dGJtdWtwcGxycnF6S0xJSUdFRD9BQj89QkVHQkZDRURFRURCSEhHREVLSEdLTU1KTUxGSk5ISktKSUtKSklKTE1OTU1NS05NTVtyb29ucHBsa05QUWxYTWlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBcYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHByc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkFCPT9ARUdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklNS0hKTUlLSUpKTk9OTk1MTk1MXGhkdV1scVdsTk9RblVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFkaXR5a29ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZKTEtGTUtMUlJMR01NSE5KSUhOSEpKSEhOT05OTEpNTUpac3Bwb3FxbWxPUVNvWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqW110Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNFRUVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRktNTEZPSktXUktHS0pKTklJSkxJS0pJSEpMTU1MSUtLS1NrYlppXl9qY3JyWl9aa29gZWVVa19jW2FiUWBtaFxqXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGtucHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcnV0d3JJSEZKREVERkFAQUVEQ0dCSEpMR0ZER0tMSUVGSk5LSU9JTFtRSkZISEtNSUhKSktLSUhKR0tLS0tHSEpKTExMS0lLTE5UW11UUFVNUVBOT09VUlBPUU9PUUpKTlBRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZl9eZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdIUEtMT0tMV01JRkVISUpISUtITEpJRkhISkdHSUVGS0hJS05MSU9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYVhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQUNEQkRJRUdHRktKS0hFRUpKSkdFSEhQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHRUVKR0JJTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY19ZX2JbYF5bVFlYWl9eZGJiYWNmaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDRkdFR0dJSkpJSURGS0tLRkZJSU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVCRkpEP0lLSE5bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJiYmNjZVpSWFZWXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUxEREpKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRERAREFISUE+SElGT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFRXV9hY2NjY2JcZGNiZGNmWFFWVVNcWFthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdJR0dKRkZGSUxKTkVESkpMTkpMSUtKSElHQkhIUU1LS09NS0tJSEhFRD9FQkhIQUBGRURUXVleWF9YX1tdVVhYUF1dUUtKV15YXltdVlphUlJfX2JiYGBiYmBjYmJkZGJYT1JSU1xTXF5dXl5fX2BkaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtJSUdESEtRT01MUExMS0tJSURFQUVDSEZBQEZFQlZVRVxUXlNWYFhOVFVOWltNSktVYGFbX1hfXmJdT1liXGBgX2JjYl1iYldfX1RQT1FSWVNeXFxdXl9gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUURXX0lHR0hERk1KUFBGSklKS05MTEtNS0pKR0VJTlFRTk9PTU5NTkhLQURBQ0RGREJBREVBTEhDTExQT09NRk1GRkhKSEdMTE1PUElMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlFVVFxZWVteXmFhZWZjaGRrbHFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5NR0hZTUdISkhHTkxRUUlMSktLTk1VTk9LS0xHR0tPU1NOUE9OT09PSEtGYEVEX0xEZmNETVtIXlxzbU9NVm1ZTENQX1VsV2dKXVdVXkRMUVVMTVNWUVJUWFdUWFVUXFRQZlpoaGRZVGtUWFdVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhIODg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVEpLR2BUR0pPSklPTVJRS01LTE9SVVJPT0pMTUdITVFbWU9QUE5PUFBKS1F/UUl8WVlyc1dQbUhxbm9hVlBxcXRPQmtzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl9WVVd/aXR1dV9hdl9ZYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoODgn99foB2eHptdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMTE9ITFJYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUUtJWnhdVHhkaFlSU1B2Z3RscGJuZmtSck5Md21qcnBzcnFycG9wgF1menV4cXF6cX5yfWt1fWJSZ3xlc3Nvc3N8fXB+eW9/cl9gYGJiW2FgaGtua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hLUU9NTkpOV15ZVUxRU05ZWUxTU1JOTE9JUVJUWVdXUVRQUFFTTEhneGxjeHFtWktMVHlwdW11Ym52UGRlSWV2cW13b4BqZnh4aVdyUml7bWlqenp9bHh6f3Bnb1h1dWp2dXCAYXNofWlseHxvX19fY2JcX2RlZmlqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN2em58fXl4cm5OSlJ0TkNCRVBQSUtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlNKS3JvdXVxdXFkaGFWbkxxcF5HaHlXdlRLaHh9eGB5e3NuYV5tb2RTZ3J1bm15cHdsdnN0cWxtXHN9emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUxLWlZIR0VHUlBLTE5LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUUlSbUhpd0tgZHZ1VVdsTm5se3Jhamd/dlVLV2tofWxtbHhgW3B6e19genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraG1tcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUE1MU1NST1NSV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTlBVTEtLUlNSUlJPVlVRUU9SUlhYUU5QVVRYWFhbW1VTU1dbV1hXWlBTVVdXWFFdWFZdVVNPWFJWV1dYWmBbZ3JeW1xbXV1fY1pfY2NlZmRjY2JaY2NnZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTVJRUExWVVRQVFVYVVpVUlpdVlVUV1VZWFBPTE5XVFBOVVNOUE5MUVBLSlFRS1FNSktPUVRSUVFTUklJTU5PUVJRUVFUVlJYV1xXU1NRUVVVVlRaUU5TUVdVVFlWVFlVU1JVU1RVWFlYXlpfYV1cW1pdXWBjXF1iYmRnZWRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFRTVhXVVRWWFdXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUU5STkxTUE1OVVNOUU5NTlFTUFRRU1RUTkxOT1FUVFJSUVZXVVlaW1lTVVJUWFdXWVtTT1NUV1VUWVVWWVRSUldVVlhcWltgXVZZX11eXVxdYGFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRT1JYU1FRT01PU1VOV1FUVFVPTk5RVFVVVFRSVFhWWl1cWlZWUVJXWFZbXFZQU1VVVVZZVFdXVFJSWFZWW19bXmBfVl9dXmBcXGBgX19aYmJkaGhlZGJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9NUFNSVVpVU1BQTFBXVVFWUlNTWE1PUFFUWFVVVVNVWVhbXl1cW1ZST1VWVVtbVlFTVlVWWFVTWFpUU1FZV1dcX1tgX2BWYlxgYV5gYl9cYF1jYWNnaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOT1dTTlFRUFJUUkxRVFNZW1dVT1JOU1hVU1JUUlJaT1FTU1ZbVlZWVFZaWF1eXFxeVlNOVFZWW1tVUVNUVlhYUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGdeXGVgYWBhY2RfYl9ZWl9bXFtZWFlXV1pbWmFdXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dXGBcYFVcXWhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVpaWlNPU1FVVVVTTlZSU1pSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WVldeWlhRVFRYWFhTVllcVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl1eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBbVVVXVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVNPV1JTV1NXVVZbXVhbWVVaXlhfXllcWVJXUllYWV9ZWVNVVVpZWVVXWVxVVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGZkYl9kYV9hYGJiX2BeV1leWlxcWllaV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hSV1VTUlNYUlNWVFhYWF1eWF1bVV5fWF9fWFxWUVlVWVpaYVhcVVdXWlpaWFlaWldWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmFbZmNoZmNmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWldUXFVWV1lXVlxgYWFjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlRSVlZSU1VXW1tcX15aX1xWX19aXV5ZXlZTWVhZWl1iWV5WV1pbW1tbW1laWFlfX2BgZGNkZWViZFpiZmNnZmVeYWJgY15jY2llZGdfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllVWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVlNVVFhdXV9gYF1hXVdgXlteXFteWFZYWFtaX19bX1hYXFxdXV5bWlxXWl9hXmBlZGRmZmZiWWNmZWhnZF5jYF9lY11maWRlaF9nXmNiY2FhYF9fW1hZW1laWlhaWFdbXFpbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFlYXV9jZF9SWVlQV1ZXWFdXVldWXV1eYWJhX2JeWWFdXV5ZXV5ZWFVXW1tgXlxfWVldXV5eYFxaWllbX2JfYmVkZWZnZ2JaZGZnaWdjX2NeYGZlWmlpY2ZpY2ZfYmJjYWBgX11dWlhbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXF1YV1tdX11gX11bYGRcXFhaYmVjYVJcWU9YVllaWVlXWlpgXmFiY2BhY19cYl1fXVtfXllZVFhdXV9fXl9bWl5eYGJiXFxXW11gYmJjZWRnZmVnZFxlZmhpZmNhYlxjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGFfY2JiXVxbW1hYanFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1pbW2NgY2NjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJeXFNcX2BjZGRmZWdmZWZlX2ZmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t7e3t7enp6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x7e3t7fHt6ent6enp6enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiodzcXJycnFvqcG+vr6+vsrT0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMiXJvb29vb2yy0MzMzMzM2+bl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f3+AeXd3d3d3d3h5eXl6eXp4b29vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8enp6enl5eX+DgoKCgoKEhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3V2d3p7eHt4d3Z2eHh5eXl9eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7e3t7enl5eXl5enp6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3d8e3t8e317d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3eX58fH19fnx3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d7fn19fH1+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7fHx8e357eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5d3h6enp5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2VmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjI+LioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIyLiIqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyIhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn9/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoKCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYOEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKCgoOEg4KCg4ODgoKEhIODg4KDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYGBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCCg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhoSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpGRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjYyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgYGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBf4GBgICCgYKCgoGBgoKBgIKCgoKBgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgYKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhIODgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4eCgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgoGCkoyCg4SCg4ODgoCAgIKCgoKCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIKBgoaGg4KBfn+RmYaFhISFgn99fX1+goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISGhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4KDhYiCfn1+fYWcjIaGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4OJioCAfoWKf5OPhIF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeGhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SDgoqKg4iCg4WAhISAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoeHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODjomGhouDf4CAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4SQh4GCgoKCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhYiDgoKCg4KCgoOBfn1+fn5+fn59fH59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGBgYGBg4OEg4SRkpGOj46Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoeCgYKEg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBgoOEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42QjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKBgICCgH5/hISDg4OCgoB9fX+AgIF/fX5+fXx9fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59fYCEhIKDg4OBfn1+f4CAgYB+fX19fX59fHp6en+CgoF/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBfn19f4CBf39+gICAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB/fX9+fX6Ag4ODgoKBgX99fX5+gICAf359fX18e3t7enp6eoCAgH5/fn5+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gX5+gIKEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKDgYGCgIGDhISBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOCg4ODgoKCgoKBfn59fX1+foB9fX19fX19fXx7enl5eXl5gIKCgoSDgIKDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHiIeGh4eAfYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgIB/gIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHhoeHhn99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf318fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImIiYeFhoWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn99fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5OPjIuNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYyMjY6PioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNi42Ojo2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyLjo2LioaEhYSEg4ODg4KCgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5/f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e317ent7e4CGhYKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fXx6en16foJ+gYOEgoGCgYWGhYWGhoeGgoSRjoyLiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYuJi4mFiJGOi4iJh4WFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gIGAfnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3t8e3x8e3p7e3p6ent+foKFiIeIiouLi4mMkI6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjYyKioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBg4F+foCAfn6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fX19fHx7fHx7e3t8e3x8fH18iYqIiIWGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaFhoeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHV0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIaChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCg4KEgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOBf4CDgn9/gH+Bf4B/fHt7enx7fIGAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f319gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYSBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fXh+f398fHx+fX6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4ODg4KBgoOCgYOCf4F/f39+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fX5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXh5cniFhYWFg4SDgoKEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhoWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f32Af35/f359fXyAgICBgH5/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn59fHt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6enp6eHN3dXFxcnB4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYF9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+gIF/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af36AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+eoGTjXp8fXx7fXl7enp4eYGBeHl8fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgICAgYB+fn9/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf399foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuNfnd3eXx8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGEg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH18fHx3eHV4eHl7fHx9e3x8fHx9fn9/f39+fX1+gH+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGBgoOAf4KBhYODhIGBg4GCgoGBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgIB/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fXx8e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5dHF1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCgoaDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgICAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7enp7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEg4SFhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/ent7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCg4OBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4R/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OCg4OFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4aCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIB/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWKiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFgoGEg4B/fn5+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3x/c4KDf4ODfYF9fn59foKDgXx/gH1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4aDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfX9+fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhoWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWEhYaGhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWEhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGg4aGhYaFhYaGhYSDhYWDhYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX59fH18f3x+fnx9gYB9fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaFhoWGh4WFhoaFhIOEhIOEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eGhoeEgoSDhIaFh4WEhIOEhIWGhoaGhoWHhYWHhYaFh4WEg4SDg4SHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aHh4aGh4eFh4aIiIeGhYeHh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWEhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WFhIOFhYeGh4aGhYaGhoWGhoSDhYWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeIh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOCfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fn9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFg4SEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N+fn+Af3+Ag398gH19f4J9gIF+foF+fX19fX97f3x7enl6enl6enx5enp7e3t8ent7e3t9fn19gX19fHx9gH99fIaDhoaGhoaEhIKFgoWBgYB/f4CAfn+Agn1+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn59fX9+fn+Efnt/fHyAgX2BgH19g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+BfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58foN+fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXV1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1NXU1dTU1NTV1NTU1NTV1dTS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fY3N3d3d3d3d3d3d3d3d3c29zb29vb3Nvb29vb3NrT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5s3hzc3Nzc3Nzc3Nzc3NzeoKBgYGBgYGBgYGBgYCP0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojg3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpZkyKSsrKysrKysrKysrKTVFQ0NDRENDQ0RDQ0M/XNPT0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKabOC8wMDAwMDAwMDAwMC87SUhISEhISEhISEhIQ2DS09LS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamroEU9Pj4+Pj4+Pj4+Pj49SFVUVFRUVVRUVFRVVVFq0tPS0tLS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs/Pzs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHKysrKysrKysnJycnJycrLy8vLy8vLy8vLy8zMzNPU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7Oz9HOztDSzs/S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW2NfX19fX19jX1tfX19fW19fX19fX19fX19fY2NfW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7O0cGn0dG4oNDRnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/Pz9Gdj8Szlpi6upW4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pz9O6r6q8n6OostGSfX6vsNLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz8/Tn7Gbv8eHmrTV082ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/RwJyJmr3ao5i11NPAoKDQz9DQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P1KOigZvA16GYtNPTr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0cSfgXuWq9ihmLTT06OhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NWrr7zAz5PToZm11M2en8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyYd/hZ6k2aKZtdfDn6DS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhxtPT1ZyYv9ehmrPZsqSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNLR0teoh8vWsYPF1rmDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHSz8XU0dDD1NHSwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tPU0tLS1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQkQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3rqmqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS1try9vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOzMvHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQkA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N4ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBQ0JAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yc7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2RqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcLGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vbq6tL+4tbizr7u8t8C3vcK/wbu/wby7xb67wcTAvr65vMHBy769ycTAwMrAscG/u7i7vrq1t7O4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OTY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDk3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYlxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5hYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3KxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysq+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcLDu7mztLrBvb/GwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVxfYFlTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6yvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZVxaVUo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw6Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7OysrSyuL65s7WyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BPklCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCysi+wLi4trK0trK0r627uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2r6qwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub21sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u+v7m0tLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz08PDs6QD08PDs/PkJAQT8+OTU4OzxGQkNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrK6ure3tbW8s6+0q7a6uMDEwbq7v723sq2zsK+srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lo5ujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4Oz9AQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxsK6vsqemsKSvrrXBurW51ce1s7SrsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbGjpaieoJyVk5CPkZCYkJaVmJafmJuZm6OZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0VAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQUQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmkpa6lrKy0vLesudmzu621r6+ztaqnrayjnJmUjpGWl5mZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWm5eXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yepKiurayrq6+qr6mel56lnZ6lpqShop+moKKvq6yttbK3prXUmcG3srGxsLitp6GcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSpsa+imZydnqGZm5uamJmblJablpicpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVUxSTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOfnaCfoqCir6+ssLGqqKqyyZamyLCuraywp6CfoqCXkZSboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rLG0pKCdpZ+soaGioKCamJaWoJubmKShoJ6koZ+empyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tnpmona6ep56coZ6empqSmZ6coaKgoJ2hpK6dn6mso56XhXuMkbGUiLWvqKqsqqWgnpmSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnn5mmoJ+fp6ilpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7Cmn56dnZeYlZmem5yjn5+do6bOo5uloIl2g3NiaGt9h4Ohs66uqaunoJ6eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Svs66qrqOdq6e2sayir6aho6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rya2t1cnBoV1tRRVRIRElPSD5FQTRFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PDs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWen6GdnJibn6CboJ+fl6Kw0auUjoiBYnGObGJdYHigsa+npKSjoJ6lq6ael5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLAxb65tLm6tLu3sLWyqrqxrru3vrq6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfXpya2Rob3hqZVpbRktMRURTTERCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKcus6ihm5jh19Xh4iPj5ywqqGanZyfn5mXmJiSjI+Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM09DT08zKwsXGx8rHzr/I0czHxcbEwbvDwL6+vrW9s62/v8LCxsTHxK6+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6OsnZ+upqWxqsXGzM7Nv7DBqKWorK2qoZ2jn5ydmqmTmcbClWtcapdbVHGbsLOtpJ+doJuYl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytLX0dfS1NbT08jMx83NydLMztPMxcfJysHFy8bIyMW+wrKzyMTLysrOxcq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOfpKOfoKSsmp/PtIFaXH2Ra5CurqWdnZ2hpaGempWUlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU0s/Rw9DT1tjV1tLLyc7Ry8bN0cnS1dbZ1dfT1tjO0srP0czO0MzSz7/HxsrDzMzLzs/Fxse2wMq/0czLz8XJx7/DwsjOzM/Qz83KyM64t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkdBRUhJPjtAOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcLFsbaooqWmoaKrtaWl0qhqWnWVo62tnJWYoJyboaKfnJ2alop3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czQztPX1tPV0M/S09HJ09HH0NjX2NHY0tfZ1dbMz8/JzdHLzs+/xcLHxc7N0dDRyMvMwMrLxdPOy87IxMnGxsjMytPT0dXP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNRTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+uqqqrnaauuKirt9fU1dnZ0c7QwLzMybe/r6erqaOksbWxr82hWmSfrauimZaYmpudoZ2anJ6TfnJlY2JfX2FgX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxtHUytDU1dbO0tDY2NjXy8jNw8jOzMrLv8m/x8jNzs/L0M3Oy87Ox8rP0MrOysLJxsnMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNV0U7QDwzMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PT0/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1raWtrr60sMDY0tfa3NbPzcvE09DCwbGqra6rpbKxtr7Ml1qQopyWk5ecnp+fnZSWmJSJa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1crAysHFzMLIycLMw8XHysrOys3M0M3Ty8XIz8zIx8rExsDFysvNz9HG0M7NzczPxcfAt7i9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeHBxa21nYGBxaFhYaFZMRkxJUFBCO0Q+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3Nj88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHwrjL1dbZ2tvYzM3PyNbVxcO3sbWqo62suLfJzZeImo6NmJWQlJKRlpaWkIx8ZmJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS+xsm9wsfJzsTBx8DHzcfDy8rLz8fDw9DIxsHFx8S+wMfLy8vOwsrLyMfM0MTFx7vHw8jIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndudGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvr26zc3H0NXV2drb2NDKz9DS1MnEub2+r6e3qr25zsmhlI6Ol4+Gg4SEgn6FhX90YFxeXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7IxsLDwMPHysnIysjBxczGyMvNycTCy8nBwsvQxMvIv7nBu8XHvb/Gz8vDv8O7ycbIu8jGxMrAvcHLxsXEvsW8vL/DxMvFxLzAycLFx9LEwMi/ysnGx8bQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWao6CblHt2c3RmaVphbm1aW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzLz9HMx8LDx83Pz8zV0NbZ2NnQzNPOz9DKw7fGwLW1u7C/ttKzkYyTmId6gIWGgHZ4dXJxX1pbXWBgYmRkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wMHBxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw768wc3Dxr6+tcG9w7q8xrvCubO8xcTBwra/tbW9v7rLw7y1usi6v73Lw8HFwsXIxsjG0MbCzMeyx8nDzs3BxcPAvbK3sLKnqKi5sKWtsKutrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsPEyM7Sy8rKx83Oz9LJ0cbW1NbYzszQx8zIysS9ycGxtLm2ubS7k42Ki4V5gIaGgH6EfHR1ZFxcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i0t7Sys7S6tb6xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wMK8uL3GwcO7ta6ytrq+tMS3u7WruL29v72wuravtrqyxby2rru/tLa0xb2+w8XAw8XGyMvFwMbGu8jLv8/Kx8PGwsO2w729trm+x7+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzM7Iy8nLysvF0c7T0M/HycXJxMO/vM+8sre7uLW0m46HiYl7eX6Ghnd4gn10aF5dXV1fYF9gZGFeZGVjX19cW15cXV5aW1tdX2xwbWhmam1ucnykx7+4uLWwq6ynnqKqp56rrLOtqauptK22sLKprqassry6tsO5urqxq7W5u7TCurC/sb28u7a8x7nCtq2qqLCxv7W3vK+wp7GztLu8q621pa62rrqxsKq4sK27rru4u7+/vbnCv8fDxcG8xsHIy7jFx8W/xsPDucTGwrvGyczLs7nCvLqyiHJ2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbO0szDxsLF0MfOwsTHwMbGxMTLwsrLwcPAxr+4urrJtrO5urOxqZGJj5B8eX6Khnp7hYF3b15dXF1dX2BeX2RjYmNjYmBfXVtbWlpdWlpaWlxkbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwpKafqq21trG9ua+3r6iut7S0vLi0vK+4ubSxvMGxwK6lqKKrsbKzp7yqq6irrK20s6WoraGkrqmypaeoraWot6ywsre5uruxu72+vsS/tcHAx8i3v8DEt8TCv7u/xMK+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0dDNxMi6uszCzMC8yri/xcC7y7nCxcS4u8G7t7W7w7aztbaprZSDiY2BfH6Afnh0f3xzd2ZfXVxdXl9gXl9jY2FiYGBfXl1cWlhaW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnaSbmJKho6qjop+lpaelrJ+dm6SmrLKvtrensKynqrSqtLqxtrWttrmxr7q5sbekn6OfprGnq6i5qqSnqKinsq2gp6afm6SlrJ6fp6SfoLGtrayytLK0sLW8trvBwbK6vsPBsrm5wrPAvb+1uLu9vrzCx8TCw7+/xKCDd3BrYWZfa29gVVleSE5nT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc3ODY2Njs6Ojs5Ozs8ODU5PDo+PkA7jci1tb24usC6vbWgnpSdoaa6tquzs7uzxNDJy8PHubjJws3Aucu5vMe7tce6tcLEsbvDubOttr24rK+xqZ6Eh4eCfXp2dG9ta2pqcWleYF1cXFxeYF9hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlZqhlpuimJaNnqGippufn6Oloaeem6Kbn6qwrbG1oqmqqaurpLS5rbewrLK1rrK1rrCqn52eo6KypKapuK2ipqafqKyqmZ+gnpmdn6WamqOcm52vqaunqqusrbCyuK+4ubuwtru7uquzs7mzvbS2sbG1tL+2vcC9w8G6u72Xg3pya19lXmRkWFRYXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bQyMnBx7y8xcTPv7vJurrBurTEt7O+v7G/wbmqprG2s6SsraOJhoeAeXNucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtyjaidlJSUm5iboZaWkZyhoqidm52lpqGlnKCgmpitrq2usqCloq2rpqG0sLGxrKivsqe6s6a2oaKem6OhraOhqbWqoqOmnaWmo5aYnpeZmp2fmpednZycrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7Kys7ezrqmsrrK4sLq2ub2/t7KxlIV5dWVeZV5bWVZTWlVLW1FMSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzcjHwca4wsHIz7jCxr+1vLy1wbm1vL6zuLy3pqOttq2jq6iWfYSFgHlwcnRxaWZkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFhYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn56pnJqaqqavsKubo6O3qqCfrqi2qaanrbCjt7Ckt5+im5iYqqahmqy4sKKhpJyioKCTlaGUlZabmJeWl5yVn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysbCwrq+mp6eyrrG0r7y0ureuo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ejqrvAvcC5rrS4ws3JxsPEvse5yc20w8TDsL6+uL6/uL29t7e5s6Sjrbehopqfh4B9eXJqbXJ0cGhoZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSmp56cn6Wfqq+mn6KjtqigoaKotKGlp6SvpbCtrLWeoJ2VlKmhopSssbGeoqOdnZibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaWrpKWwp6Wjq6utpqiur66rqKqps6Wmq6+0sa68tbGvr6CSenZyZGFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqSnrbe7vMHFurG5tcXKy8HEx8fIt8fFtMTByK65usC6wL6/u7m0trKio62xmZuDlIiAd29kYmdpaGZoamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUV1ZTVFJVYGBfYGFfYGFjZGmBk5OIkI6UkpOclJWWo5mglpygpaGtpaSjoqOhm6qrpZmepbGpoKCdpauep6GerK2pqK6toqGilJejm5yQqqiwm5+in56XmZOKnpGNkpOVkJiYk5uhopykoKGVoKGkppujq6WipKqkq66lrbKppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZWUkdRT0haXE9SSVRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODY5ODk4OTs5QDl7tbSttLuyr6uxrZ2np6+5ubPAyLq1wK/Gyc27wsvNyLfLv7PAxsuvtLvFub/Fwbq7s7axoKarqZeSgYyEfHVqampsaGpsbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl5fX2JkbY6PhJGHkJGOmZOUkpyaopyboKeoqqiqpqilo5ikrqSUmaWvqZ+bmZugnq+Zm6qzn6Wmn6OjoZSTm5aWkqmqrZqcn6GgmpSQjJmOi5CMko2WlZCeoaCjnJuilZugoqCYoqijoqiroKuvpK63paOkoqytqqirrrK3sr21s6uvmINzc2hbWFhSVVJFWExRW1lNVU5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmnr62bqaist7asvMq7tr+szMfGucLP0Mi1xr25vsXLs6+7w7rAwsC6vq+0q6GlqaaXj4CBd3hvbmlubm5waGdpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4yQipKNl5GXmaKgm5+qqaauqqevo6eZn6yglZakqKedl5CPmp6ulpenqpmfnJSloZ6SkJOSk5Wnq6WamZmdnZaNjIyUhoiNg5CLkpWRoJ6go5eVn5WaoKKdk5ulpaeoqKCxsKaxvKego6y0qq6nsLSwubXAsa2xq5B9cXJiVlRWTlJJR1ZRUlJMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMS0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurvCy9HMs7i6vsDExrSytbuwuLnBur2tr6msqKqllZiCa2dtbnJvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipiJlJSXm5mdqJqfqaWkqp2nmKClm5KPnqKal5aFhJKao4+TopyVlpWHopqak4uOi5CapKeclZWXm5CSh5SOjIGLjYCQipKSkqGan6KVlJiYlaKlmYyYpKaopqGgtLKns7ehnaK3rKmtpLKyprW7taursaOIeHFsXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0tIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDEqKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6OppaCppaSzqqKyw7W1srPHxri7xMrNx7Wvu7+3usOysay0oaqywLa3qaanr6mqmZCfeV9gZ3NxdnFqbmllaGhqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRg46KlJGTnaCPmpuioaOYpJahm5WNh5iajHONgn2Nl5aFkJmQk46Oe5mOnIyCioCJmJ+inpCTmJaEjoKTfn50iY56kIeTkJCdmpmakJWQnY6io46JmqCho6OborSvrK+sn5mluKalsKGwrpywu6qpr6qZgXZyYlVNUk9QTUNTTkxRTUJQUUhJTlNNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTExNzY0Nzg5Ojo2NTo4N0E3eLeio7Sopaaoo6alpqams6eltMG4r7SwysW4usHPxr+0rrzDrrDGsKulqpShq7y0rKubo6inpZGOmm9XV2BoZ2loaW5jamlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXi5OQn5edlZSWlI6WiX+TiV87V297i5SJgIuSjI+FhnOKhJaBeYJ6hZSdlIOWjpCPg4Z9knhyb4WNfomBkY2Pl5mYk4qPiZyHnpeHiJaemqGgl6evqa2oqJ6XrbOipq2YrKuYp7Siqa2jkn1ybV9bTlNSVkxEVEpQTUxGTk9JRkxRTUtPSklNUEZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygoKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaeiqbCop7TBubC1sMjDuLS+z8C6sLC3xKqtyKyloJuFmJ+3qqOjkqGgn5yRiZBmUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkF/lZGRfYmUjISKjZqNlZWKkoiFlYZ4iH9gSlFueIqRhH2EjYmFf39ufn+Ud3V1d4SNmXBRjYiKh3x+eJN2aHeFh36KiJWKjZCRlouEioiUhJqMgYSSm5aenJSko6ippaSem7CqoaSkkKWqlqGpnKKmqIh0bGVeW0hRUVJNSVVNU0lMS09JSEdKTkxNVEtRUU9GSEM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSoqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivraq2vLa4t7PCvLeousm5tqiptrestL+poJmRgY2Xrp2elYmbkpSPi4WGYk1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYySgZKZi497ho+AdX94c251cHSNjYF5fYqqhXl6aHZ7jnBybXiBi4ySeHqAe4B2c3KSd2d1hISEhHuViYiKjIqAf4SLjH+Ug3uAj5iVnJWRn52pnp+gnaCppZ+dmIynpJOgn5aenqR/cmdgXFxKVk9SR0tYUk9KTU1SSkpKTVBITFFMUlRNRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTQ3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEzNzIxOTg3OTg3NzU6PDs3dq6Yo6GYnJ+0qa+ppa2ssLGqvbSyu7i2u7WyoLe7s6udnq2qqrOwo5yTkJeEkqGUmoiAlIaLhYGCfWJLSUlIR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYF2eICJj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfImMh4BseXF9cG11j3FocYB+jnBDioSCg4V/d3d6i4V9i3p1fo6Sj5iKkpqbo5aZnJqdnqKdlo2KpZuPnpeOlpiPdm5sZWJaV1dUUUpTVVRPUE5RVktOS05PSlFOSE5PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+flqCmr6yuq6epsa+xq7y4rLu+ubOtqJuxp62ckJadpqqlopmbkYeUfYyTkJJ9eYd4gn57e3xiS0ZHRkFAQ0RJTExNUVJQUVNVVFRVVldXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4bnx5iJB5fIuFb22MkXhzeGpqgIJylpGLgX2WgEmSmG5oeH6CbGljbHmFkJKGa3NsfG5ye4ZobXB/c42JhIV6fX57dm90c4WCeYF3cHyOjIqUg5aXmJqQk5WWmZeel4yDiZ+Ri5KNhpCWfm1obW5uV1VXVFJRWU9SVVVTWFVNTkhOSk1OS0NITkdFQDo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw0NTY3NDg1SEE4OTV3mZGbmZqepa2woqyqqLWvrqy0v6u8wr+mopqVpZiejoWMlqKimZmSlY11kH2DiY+MenZ8cnt2cnZ5ZE9FR0RAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouJdoGIhnRsmpF0c3tqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcH98Z3Bwe26TjY57c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJSPl46AeYiXiIaKhoCQh3Zqam5nZFdRWldZWVtNUFVWWVlOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImZGalqSorp6yn6a6rquysMKxu8PHm5aPlZmLjYZ6hZGZlY6RjZGIc4iEd4qPi351dnR2dW13cWdVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfWxyg4GFgXqEhoZ5cqCVdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYmAaGZiaW5ybXCDdWlvWHVwjpqSdmx/e31tcW1wgHpzdm1idoR/hoCFkJGKi4qSi5GMi4+DdXiLj4B+g4F+j3pxcG9rXlpcXVtZWGBfU05bWllYTEhKRUpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGepKeer5Wltamtsa7BsrvBxpeQjJSQgYl9boKRkomEi4iPh3aDhW6Xiox/eXp7cXtzfGpuXkpQRz5ANzQ0ODs7PD0+QEJFSUxMTE1OUFFTVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH2Fg3+MfnaimXl+hoGFmYSbnGGGqp+dioKQjXp2iH6JiI5zipePg3tcZHF0ent3imxnaWF5b4WPgnpugXd0hHpwdHl3a25pXXeHfYd8iIePgIuTl4ONhY2HfXGEf4R8dXd7fYl1b3JzZWZfW1pdU1tmXldRVVhcVkdKSkRLRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjXiKgJSMkp2dn6aRoKugsaivwLG6xbqWjpGUiHqFdmuAjJKDfouEj415g4J0ooaNf3+CgXODgHxreWxTV0xARTIxMTI2NzY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp8iYZ+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc2x8gYaHfY5oZmd4fm6FhoKFcYSFR2uAd3J5dmhta192fYOIf4iFjHqVnpyKi4iRf3t1i3Z8d21vd35/cnJxalpcXFtjY1hnZVxVUFBXWVBETEtGTklDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjc1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoV0fH6KhYiRj5aYkpegnayhprivs72zl42Si5iLfXRwf4mTf32Mg5OVfYZ/h6WIiYGDiIZ5iIt/dYZ5X2NWS0I2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj85NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYmRgZqVgqGhl5WbmqWtk5q7sae7x8Ooi4yhpY6TiYGQe3KDnZ+RnH52hYWKj4eQaWhvg4B0jIaEi3GGgneHgHt2hX1udnVngJSPhomIh4iHoauilomOmH97gol6em9na3h9eHxxaWNdWlldaVxhZl9aT0xOWFJRSVBLRE5HQ0tEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O251cGd4g3uAjICBkI+LmpqknKGspquvsJeRkYShlIR4d4CNlH1/koaTln+KgJKbjoSBgoyLgoqOhICKgGxwal1DQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafIyhnpiEkoWCj6Gfk5iShIqFj5iRlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhloaTio+PlqW1qZuNlaKDh5OEfn9ramt8fn5/cV9cYl5ZZmpcbGteWEtIT1NRTk1MRklQQ0RORkJDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmhZcINwdYdxdpKGfpeWmpSfn5ynoKqWk5ieZ2Wkmn6Fk5J6gJGJkZJ9ioWZkpGDgICLjYmGkYeEiIV4eH9nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw4NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWcn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpqZp5GRiJWimpp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNze316b2ZeW19eYGZjYGdnXFJFS0tQT0lKTEZGTUNHTUZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHF1YG59YneOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNi46Ne4qGj5COgoOAiYyKhZOFg4aIgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUdHQUFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKynqLSssbeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2qo4uWmIWmpqCil4KmmY2iqqikh4WTo6CgqqCkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlqomaipOKlXp7foN8ZV9mW2RgXWJjXmZmX1tPREpIVE9GSExGS0hFRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1hqcFh6hXaBlIWIgpuDkpCNktrInZZzVpeIj4icj3yGjI+LinqIgoeRjoOFgIuFhYiShoKEiYaHh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSVFVVV1VNW1BHR0Q8Pj5GSENEQDc7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLByMSrs8W2rLPAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbCxm5mSmp+Ip6+qpJR2n6SXoauxs5iWqa2orrW7srqsr7Wisayxtby3ta61oKeno6ibqbCtsrq4uKect6mNpY+Sk6CGeYGBc1dgYlRlYGBiX19lX1tUSkRFTFZRSUpKREpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoZ/gI17v7ujvIK0lJOOm4+EiI+TiYl5h4CMk4yHhYGOf4GJj4Z/hYiFioeRenluXVZARU48Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxXT19VSUtKQUA/R0tGRUM7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczKtrvEvbO0wbe4wrW/sLd0sbSmusWksMa5sbOxtKiktbaqsaCilpuikaWxraWtq6ekmKCss7qiqLK5tbu+zL/Fxb29s8K3uri/t7q3ua2tsaaxqq2+sL27wsKsmbuola2PmJiqiX6AeWlWYV9XaWNpZFVbY1lWVElIR0xRR0RJSkFIRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFpWWndqcH+PhIGOhW56c3iIYrihmqOJlZSWk5STjZCXkoeHe4eBjZWKgISBinp8i4eGfYqCgYuElX14enVlT1xkR0VMOlFkYVteU0Y+O0hQRFpkUVFZWFpnWlRgYU1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tNU1pUXpSvuLW6ucnAu73KzLu9wLu3tby8t761urLGYHWypbGanqu+qqWoq6qkorK1oKuonpWWnpifrqWnpqWfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrDwL69v7u8t7Swube3w7rGvsPJsJ66qqKsj6WotomAfXBeYGBcVmBdZ2VSWGFWUlZJRUZOS0A+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5MzczNTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbWxxkI2FkHNsc3JziNXAtZmgjZWZmpGOl5GWlo6Gh32Hg42Wi3+Df4N4e4uEh3uLeYGKgpd/dH16bGVwdlldXFBlZWJgZWRdW1hXXE1kbVVSbW5fb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZdWlyTucC5vbfGwLu5ysu7t7q2uLmzuLW1rra2mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUj5aYl6ifpZ+empmDpJ2spKqwrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/Jz7Sku7G1sJusub2afnhqXF9bWF1gWGFiUVtgU1FLQ0JFRkU8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIyJfIGDc3uKg4V7inSCioaVf3N7eWxtdXxpc2VpbGlmamppYGZpaG1abXSXraS8h4dnW29oXVpZVEhKTlBKS1FMVFFITEFKR0tQX19iZ2pil7fHsLmzu762scTHtrC5sbC7rLOxp6u3rI22p56cp5pOm56NjqCWkaeYpZWKk5OIkYmPkZGdm6GYm5WWh56Zppqsr6ivp7Oz09TU1tHLz9PUztPPzMbDytC/ysnLydLIzc3D0dK4r8S8xLqmt7vEooBtYltbXFhfV1hkWU9cV05RQ0JJRUNJO0FEPkFIPz9CODtEPkBJPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDk9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkJmDaHFveXmDoKqeppeNm5uYi42VkZqOfYmMhY6KiouQiHyEgnB/h4GGe4dyg5KLj35xeXVscHh/cntueHNsaYBwbWNpbXB5aXd9fsu/wt+nbWN4b2RbYWBKUFJVTlleUF1dTlBOVFFVVFxubneDcpauuKy0qLC2q629wbGrtaaluaesrqGstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEioOTlZiXlJuRm5iZmZ6eq6ykp6GsrM7S1dHNzNLT09DU0c7Iw9TRyM7S09PWzdLRxdLWxsHPyMjDqb+40Jx3bWRbYFxVXlFdWk9PVFBOSD5BR0JDRjxBQj9GRT5APzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzU5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd213cH1+gKGenqGLjZmTk4yMk5CWhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAcHdzbHN8fHd8c4J4cWuAcnJpb3F6eXN7vsuafoyxg3ZyhXdoYWpdQ1paW1dmZFhla1RYXV1gY15jeHt/i4GZqqSkoqChqKeqsbmrprSjoq6ipK6ip7GfiaablZORipKOiIKUiWuVoo2ZhIGGfpGDg5OXrYuVjZWZjoWSkJ2Xp7CioKCkpKjHzc/HwcvQ09HU0s7TzcbW083U2NbW2NXX1cnU2s3K2NbRyq3Ew8yJcW5hXl1XUlhSW09KR0pJSkA7OjtFQ0Q8Q0Q+SEM/Q0I7Ozk8OUdDNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCiYGdlZ6UhYuWiY6KiI6Ij4B4g5SZi42IiIuJfoN4c3t9g4d3gHuHkZeBhG94cG11f3Z4fXSGfHlsh3Z1bn12hHV5e521jDxBisalfo18amVXSUNlY2ZjaGpkb3lbX2Zoa25pboCEiJGMnp+gnpGXmJ+kpKaypKWzoKKlnqGpoKKxnIefkpKTkYuOi4aDj4R+nJyMjYKEhXqUfoKqlaOMkoqYkot9l4qakauzmJqbp5ynvcPFubbFzdHQ0c/L0svJ1M/R1drX19jU2djN2NvOydra0ta/zM20dXRtY1tXUVRQWFVFRkpJRUU9Ojc6QEFCOkdFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXFzho18l5Gdi36HkoKJhoWKg4h9eYWXl4mPg4eFh3qEeXF6e4SGdXqGjo2deoxwfW9wen9ye4BxhIeAbo56dXd9fIJ1f3yHibB0WarCt42SgXBuYz1eaHJwcXBueHeCZWlvcnV4cnuLh46TkpuWoJaIjJOboJufqp+hrZyimpqfpp+frJmMmoyRk46FfYiHg4WLjqCZk4iDh35tmXmEmYaIk4yOlYyGe5uIk4+uqpSVl56Ypq61vKitvcbLyMnLy8/Iw9HK1NbY19jX1dvX09nb1s/b2tHWyNXMk3Z4Z2ZZWE9SU1xHQkVJST5BPj04Oj0/Oz5IPUBCQUFEQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfH2EmI6Hi36Gh4B3gnlue3uHgnR6kp6NoXaPdoN0dYF9dICEb4KQgm+ShHV8gYV6dod8ibjGpcPKuIKWnI94cGVOZWOCeoF3hqKQi3l5d3uDf3yEdm2UlpSVj5iRg4mPl5qXl6acmKCXn5OSl6OdmauWkZGLjpKDjIWJiIGGkJGenJmJhYuBhZd7iImfl5CJjoqLgnyhiJCLvKGYk5eZnKimpa2ep7W+wL+4x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7cxoV4d2VnY15TVlZUTEtETUQ7PT08OTo8Pjk+QTc+P0A9QD48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXt+gpGKhYZ6hYh7dX11bX19hn50f5KekZ+DknyGfXiPfnmLim+Dm4B0mYZ9goqFfH6Re5CpjpDDoL2MnKScfoqEfYlyjIt/c6aanJmUhXuPkYmEaUdxoaSdjIuQkoWIi5GTlY+dm5OUkZeNjJWfnZShlJKOjpCMfpCPjouEiJKWmp+fiYyUkZ2Qgox/ppmIhY6DhoSApIaKi7iYnZGUlqKnoJ2dnaOutrq0q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27d3dnVpaGRVX1pST05IQ0xDPT0+OTk7Ojk5PD02QD4+PT05Ojo7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXN4int7f32AfIh7fXuLh4N+dYOGenN6dG2BfoR9d4aboZuelJKAjId/mIeAnJJuiKmFeqCLfJGPg4mEnH6akYmNo6KfkKSvoIuRi4aLgZKGV3Kti5+snI+DmJyQkI5cg6KRgo2fk5WMh4iMkpOMlJWVkIyPioiWm52PlZaRi5OUhoCLiZKNioqdl5mjooaTnZWgioqIjpyQg4iPgIOHhaSFi5CzmJySlJehoZ6Zkpudp7G4rKS8wcfNx8bPzM/Mz9fP0dSu1tXY2tja2tfW2dmdbXpyZWVbW1ZSVVZDQElEPz8+OjQ5Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhsYn6Sg29td4t4en97gX2GfHt2hoWAc3CFgnt1d3Z0hIOFfX+SpqKfpqKXip2QlJeKiqeXcoqyjYSnkoSZlIWajKOWoJiTiZueopOpsKCRlZCOjoiVi26Nt4SaxMiynKKlm52YlpGykGSkzciVjoaHiZCSjo2TlIqFioqGlpqbj5CUk4eVmIR/j4uZiI6QqpeXpKOImZ6VmomPhpeYioWPjYJ/ho+liI2TqZqXk5eZoZifmZOcmqKytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgHB8ZWBbXFxNSVNYQUJHRDtBPjgzNzs8Ojg9NjQ6Ojw6NzI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBj318bX6IeHp+e4KCg392doCDfG1ui396fHh4fISHin6Lo7Ono6qzopenn6WklpWuooORuJWRs5qNoaGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJmXocCOo8m5q5ujpq2Zkpudsp2FhaiinJiFiYmOlY2Lk4+IgYaHiZOYlYyLlJOGlZiGhJGQnHWRmLKWl6ShiJ2ako+KkIqXm4mLlo6HfYyYnomQkJyampOYmJ+UoJ2Unpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0dbY09DYunB3c1peU15UT0hJTUVCQ0Q1Pjo3Nzo/PDw3PTQzNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6em6Fhnp8hHmBhoF+cHh8fn1vco16foJ8eIaLiYaEkqe7rKiyva+lrbOzqKOhsKyKmrWdorilla2kl6mtuKelo5+aqZepo6+wqpqZnJSVkZegmJq7u67KoWq2uKuwlJmfo6yTl72jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJOWjJCWjYuNl5iTnZm0l5WrnYuclJKOkZKMmZuKkp6Qi4mVn6GNlI2Ymp2SnJielKGglJydpa+ooaWzuKvCyMS1ur27xcfHwtGgxsnNzcTX1tHL06BueGZaWFFcUE5FQz48Q0FCOD84ODU/Rz08NjwzNTM0NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKP4uKfoFzhod9gol1g4qCf218fX1/cHeHd46Ch3uNj4yGjJmqwsCvvca7s7TAvLStq7O2jKizra29q5u7pKitubirp6aioqSiqa+ysaudnKSYm5iXnqKmpZKkuq+pwLytrbK5paWofoiGnK28sIOMjIuQg46DkY56gYeQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaXjpGgkYmUm6SslJaPlJydk6Gdm5ifoZSanqempKKksLOnwcbDr7C6tsXEwr/NpsfEx8O81tHNxMqGcnBfWVddWUxKQUtARkc+QT9COzo1PkE9PTU8Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0Q/Q0ZcZUdgaWdaXVyTjIuIe4eMh4OMdYaRioFvfnuBf3F+gXuVepKUlJiQk5Wns8bJv8LMwsO5x7y7r6u5u5izt7qywK6lwaSrsLy9q66ro6Oep6uutLCqnKCqnKGblp+wtaeLo7q7tsG8rKmcsqWkqZSFjqnEw6SCi4+HiISGlZSNeoSNkY+RooyMlJKPiZefmJOZlZimoK6djKqcjpaPkpGVlY2QlZGPoZSGl5+gsp6UmpSfoJikn5qgm6CUmJ6lo6ampK+upcDEw66ot7XJwr62z7LEv8S8s9HJyMK0cnZqWVZZaFBMSEJMS0tKQUE9Q0Q8NUFEOzszPThCMzMyMjYyQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVlOZVxmVGNqmY2XioyIk5CGiXmHlJCBcoB8jX94h4KCkHqOoZaompqYur3HyMnB0snKws29wrOtvL6our+9u8O3rMKprLO8vqqwqqSlpKyus622taCfr5+lopijs72pm6i9waS2t7Csk7GtrK2Xh5qpp6WRgoyTpZWJgXaKkXqFjZKQnp+Tj5SMj42Vo5mWnJSUo56qn5GlmoyPj4+Vloh8j5WSkqOalZ+hnLWlkJ6XpaOipZ6dppielpebpKOpp6KyrKi8wMSvpbK3zL+5r8Szu77CuK3Cw8LAl2p3YFZVWllJSkxJRkRESENCQURMOjRESDk7NDw3RS4xMjM1MkIyNVNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iqCThHiFf5V/f5CIipCAlqGZrqakmMK9x8PHxdPNzs3LvMK3sLm8tL3LvMPBtre8rbPAuryur6igqai2ra6psrebnq2ip6Geq7e4qqWwv8Wxvbm0qKq1tK6vl5alrKigkY6SssWnlY59kpV9iJKZkKqZmJOTj5OWk6Wekp2ZlKGjopyYn5iLjI+PnohakJaXkpelmWWYo5+zpZahlqysqaebnqaXmJaXlaCkqKWftququrvDtKWztcvAuKq2rLK7ua6ouLq9uIFpbFhVU1NNREpSTUs/QUhFREhISDk1RU07Pjg9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJwRWlJUmViTEallJuXopeplo2Qg4emk4iCh4Kcg4OVkJCUj5qin6++r6HGvMTExsbOzs7Syr67trG6u7u+z7XDvbi5t7KxtbO4s6umnKusuaqpp6+vmKOvpKekpbXAsKystL/DusC6tKi5tbmzr5alra6upIuTlaGNdMGafZeZhI+WmoyxlZualZKTmpqlo5Sgm5eaqZycoaCZio2QlpxgSpacmpWapZZVl7Cfr5yepJSvrqulmqCllJOYmI2coKeimbSpqrO7u7uqsLLHv7mmrKutsrKjobKytKRua2NaWE1PSkRPT1BRO0hLSUdJQ0M+OktUP0E6PUVNMDc1NDQ6QjQ0TVdPPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRmIeLqJaOiJOFn4eEnZeOnaGbo6S1yLWpxrnCw8fKycjMzca+u7OuubnBwcy1x7rBubW6sK+vs7WnpJuqtLWqqaatrJqkrqWkqKy6v6istre+wr++ubSzxLK5vayjr7WsuaaIm5emm3a/n4SZnY6TmZqLrpehnJyXlZugoaiep5+ZmqqZoaeemJCNkZ2DbnaSopqVnaKekK6yoqqUqKqXqq2jo5+kqJGRmZuHlJyinpaxp6mruba9s7Kuvrm3oKOnqKWmnJytqamLYGNeXlBJS0ZHTUlWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc3P0I3NVRXTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh/ZV5IRauVm6Gfu6+ZlJ+Mk6ubkZKTiauNh6KfjKStlKOjtsa+tMC6wsLHyMXCzcjBvrmyr7i0wMLKtcWywby1uqqpra2wo6OYqrS7pqmmq6qdqa+no6qrvryorb20uL7HvLe2uMGyvsG0qbW3q76lj6KYkqKfvJ+JmqCZl56ej7efqZylopucoZqopLOhm52mnKipnpmVj5Sbi5eJjKSilJ2inqG1r6Wkk6+rmauqnZ2jo6iQlJSfgo+enpuVqaShobO0urWtqLWys56coqWal5WZqqGedV5aXVxJR0VGTVBITUVHR0NTTEpCRUdBVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWZcRkNDnHBiR0Wnl6SfnsOtm5elmJqpnJabm4+qlpWnppWtrJmiq7bEwry+t8HCwMfDv83Gu725srC4s7/CyLW/sLy3ubelpKusraGhmqqqxaKkqaumnqyvq6KpqL+4p62+sbi2x7a1ubjAsr/Ct7WztK++o5ejlpSblK6gkKGjpaOjn5C9pKmeqKudnaCbpZ+9opmjn6Kpq6Gdlo2VnpOeh4+EjZOfpKCetaylm5Wxp5mvpp2ZqpyfjZiUnoSNoJqbkqWkmpirsbWxqqWqraycmKCgko6QlaielGZgWF9cTkhHSk5LSEVESUE+UUlBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTQ2QDk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTptUkY8S3hlYlZMopqjnJ7FrKGfrJ6erqCSo5+WpZ+mqqyXtrGjqrO2xMS9v7W/wrvIwr7Kx7W4tbSws7O3wcW2vrG4tbi0n6asqqydnZ6lpMGkn6qtoKSpra+ipqi9taWxvbm2tsSytLi6v7PEwbi4rrO1taOdpZWRlKGuoJminqioq6Oawq2pnqytm5udmaagvaGdpJirq6ymopmNmp+Sn4mOV3+Wn6WhoLiqppOYtaOfsaCemq6WnY2Yk52Bjp+XlY6io5aQpq6yq6mhoaWllZWdmIuPkZKknolfYlhiX0tISkpORUVBR0s+PUpCOTlKSk5dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTp6foZmew6ilorSinbKok6uloKOframsnbuwqKy2scjFwcKywsO9xsO8xMm8r7C2rbC0r7/EtLmxsLm0rJmosKmqmp2loajBrJussJyqo66xqaSovbant7u+r7fErbSzw8Czx7S7t6uztq2qoqaWlZSkrKKfn5qoq7Cvr7uypqCpqJmZl5OipLigoaSTr6+spaefkqGelZ6PkI2Vnpqinqe0pqaMmLObo66ZnZuskJ6TlZOZf5GhlY+Nn6GTi6asr6WmoZygnpKSmpOFi5GNnJ1/X2RaZmRKSUxKUkJDQElIOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo6CcoMOppKuzoaS0qpazrKeipLKsrqm7sa2wtbTGwMTDtcDEvcnEtb/IwrSrtaivuKy/w7O3rqy2uaWYqrKrqpifppetu7Sbp7CbraCutLKnq7mzqLq0uLK5wKq3ssS+tcaov6+ttrWpp6yhl5eRpqWiopiYpa+4rrK1tqCfqKSalZWTpKC3oqSllq+xsqeqpqKfm5qblpeon6CYoZ6vsqKmjJeumKSql5mepJGajJOXmYWVnpSMj5ydk4uoqaqhp6CYnpWMjpmPgYWViJSed2JnXGppTE9NTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKOdoqa/p6ivsKGptaudurGro6q0trGwubewt7i4xL3Dx728xMHGwLjAxcC6qbakrLuswMK3t6mssbqhlK2xrbKWpaeRqrmpn6awnaugsLSzqqm2tq28rbOzubesuLDDu76/psOrsLeuqaurp56YmauhoqGRl6Gxr7OssLmanKmgmZaSl6ahtqmlo6KwsbSrs6isn5ugoJudpZyil52js7Can4+TpZqfqJqTop6Ul4iTlpKVlpyTiJCamZSOqKimn6Obl5uTho6Yi32MloWNmWlna2BsbVdQUVpUQUJFVEA7O0hBNzpYUGReUFZXRVlfXU1MUk5eS0o+WmNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaifnaKqvaKrsKujsbiqpba0rKCttb2us7i7ur22tsDCv8jEucTCwMC4xL3Bt6+1p6u3sbu+vrSorrG2nparrqiul6aojqe7n6Sss56sorGws6yqtrS1vq6wsbWssLWywbvFt6u9r7G4rK2qo7GmnqWqn6SYkJmfs6qzq6qzmp2nm5qVjqCmpbSup6Gtra6xp7StsqqknJ+oo56VoZmbqLWplpmRkp6ZnZ+dj6uelpeElJaKnZick4mNlpeal6aloqCdlZWXk3+PlIV7jpKCi5Vka3Fnb3FeRllmVkRCTVhEWjlIQjY+XFFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqGkrLalraqmr663qq+1u6emsbfFt7G3vcHCtbS6xL7MxrnCwLq+ucO3wLmxtKupura7ub60qa2wtZiYp6yqrJurq4+rvp6srrKjq5+wrbOurrayubiqrq6xqLWvtLy9yrOqtrWxtLCvp6GzoJuoraCmlpaamrKiraClr5ehpJqako6jpqizqaGms6yqtqWvsbWvpJmdraeamJ+amau3opeTkY6XnKGXlpSrnpqSf5KXjJ2cmZaQipSSnpmloqGgmJaRk5V5io+Fe4yKgomRam13bXV7YUVga1lJSFpaPXtKRkQ2QWJUaVtNXGFKW11aUlJSYmFMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVUtEmZehsaixqq2mpK+utqm3tbqkrLS3ybu0urq/v7Szt8PAzMi8w7y3vr6/t768sbytp7q5t7bCtqqssLeUlqeuq6ijsKqUr7ukrbGzp6ijsrSxsrG1sbizqa6rsqe3r7a0xMa2qba2rLCtqaejtqCgp7GhpJScmZWxnqecoKqOqaKem5aYpqaluKejsrWsqLKnrrG2rKWZoKyom5yenJSpuJyUjo6KmJuil4+YpaCclIKRlY+dm5eWlYiWj5iap5yjoJKWkZCVdYSQh3uEgYOLimxvdnR7flxLZW1cS05jXD9ie0dJOEdnV2VcTF5iTVhZV1RXVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi09RUxRPDNya0lDQ5CZpa6lra+rqKWxs7Srt7K3oKu1ucm5rsC7wrizsbXCw87FwMG9tL2/v7q+vLLEp6m5sLa2v7yuq7Kxm6Cnsa2mpa+lnbK1rKuxsq2qqbS7rLWzta20rKqrqKypua2yscjAuKW6sKmtraWorrCmpaOvpKmcnZybr5qjo6Kjkayeo6CfoqqmprmkrLW2pausqK2vtq6jnqOpqpugmpqSpLOZjomNh5ChoJSMlJyfkpGDjZKSnZqXlZOHl5KVmaebn56MkpGNkHZ9joV8e3uGiYhwcnF9fH1cU2RvXk5ZZlxGRJZbRztObVhiW0xgYk5WVlVXVFlnXVFSTGNaWlRLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorO0g/M0JIUyw+kGs7R0iPnKqroqqxpKmls7SxtbWysqKrrr3Muq7AusextK20wsPRxca+wLO+wcK7vre7xKest6yzuLzAr6uxrJ+jp62qqKSwpKqyqq+ssK+wrquzvKe3sbKps6mrpaWjrbqsqrLDuratu6moqK2pqLKlqaSjrqqoop6co62VpZ6YnpmsnaKnqaKtpqStq7iysqGpoqCsr7GsnqCnqKmZpJmZj6Cml4aEjoqLnp+OioyVm46NhIaQlJ+clJeUhpaUk5ekm5ycipKQjYl+foeFfHd+hYSFcnFwiHVrX1pgbmNRc3FcSzuEfEY/V3RYYVpOY1tOVlZVV1FcYl9TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJVaPkxFlZitqKKrs5yqqrC2rbm2r6umq6q9ybuwvbfCr7Gss8TDzs/Dv7+0wMLDur+zyMOrrretsri/vrKtraukp6qwqaeosaW0rqqwrq2ysbSstLyluLOtrK6nq5+jnrC3q6qtu7elt7akqqesq6qtoamnprGypKeloaGsl6qhlZugpp6koqqkraOfp7G4rq6jpqKbqquuqZ2ipaSkmaCalo+YnJKBgo+IhZyfi4qOi5iNj4qCi5ejm5GQmouTkpGTo5mbmoqOi4t8hoGBg3p0f4KAfHJ1i6SHeGpeYG5mV2WHY04/Z5NMRWJ5V2JZUmVUTVZVVVRPXF1hVUtNaFZVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qis6Sk9eNESGPkhGRJeSsKWjq7GYq6qttqy2sqymrKqpvMDAuLizu7Wmsq/EycvRv8G7ub++wbjBucDErbG1sbO6v72ysK2sqquntqqmra+qubCosbKusq23qre3p7S3q6ykqaqco56zs6iopLS1oLeuoKqoq6irp6CrrKm5tqmqqamiqqCtm5KqoZ2gpKKmo6qenae0r6imqqKjmKWnp6qco6SjoJqYoJGOj5iNfoeMh4OdnYaEioqNjY+LgoWUopqNjJmQkpGPk5+WmJaMi4N/dIeBfn94dIJ+eXZ+gIedj29xZ2dxeFxhc4hrT16ZVkhteFVkVlFjT01VVFRQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDuWjrGhpquumqylrbC0tbCsprCqqbq+u8CwrrmuobevyMfI0cC+vbu8wr26w8C+v66ysrG1vLvBsbGyq7OopLSopa2zs7mxo663srCyu6u6r6qutqyqnqqsn6Ogtq2ooZ+ws6K1qp6op6qjqqGirK2ova+srqyiqKigrJmQsKKYoqCnp56nm5mqsaqjoK2ioZSjo6OnmJqppZiYmJ6OioeUh32MhoSDo5aEgYGLho2MkIODk6CWiJCckJOQjZGclJePioWGeHSBf3x1eHl/enNzeWd/hqR1aV5ka4B0Z4iMfVNYcF5KeHNTZVNRXk1NUlpmTkxWWWRYRlNpUlE/Q05RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUE0kI+yoaSmrKSnpK2ntbOxq6Wwp6q4vsC8r6e5qqavsMnHyNHCvL++ub6/vMm6wLiwr7Sxuru3wLKzu6y4rKK0p6essra5s6iovbautr6wvaetrLWsrZypr6Sgpa2rp5yeq7OltKibq6epo6mepKmoqb2stK+tnaqkoa6cm7OjlaScpaWfpJuaqaumn5uqopuTnKGlnpiXqamSmJqUkIqCj4V+joKAh52PhX59i4eQjY+Ef5Oak4WSoYyUkYuRm5KVh4l+f3J7en58aHh8enRvcHtnhHiEiGRhZ2FxhHptZ3hdXVVAV3ptVGFQUlhLTE5ydV1IWltnWUVVZlBEPkpORENBOUhHS1M/amFKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNBSjdHU2BVKj05RFc+Ko+UspqgoKmmpaGrpbizs6aqsaetuMG9ta+iuK2oqLDCycnMwba9wLW3v7nItcK1s7K1sry3ub21rbm2v62hs6erq7C1uLWsn769qrPBtLyhr7O1qqufrbCjnKWoqqOem6Wxp7Cgn6upqKGpnKSooa27qK6wraCro6Svn5+tppefm6GjnJ+cmqSqo5ubpaSWl5Wfopabl6asjJ6RkZGLgoqAgI6Ae5mTjYh8fouGj42LioOSmJGGk6KJkpKHkJqPk4CIfHlsfnZ5eGN7enFvb3F2Z4BzaoNnZGdfbHKNbGFpb2BvPlp4a1VeT1FRSklNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTNTPWVfREw2S1ZkTyo7Mk5YPSOTma2aoJinpKOfqKS4sK+jr7Cqq7jBubOtn7ivq6i0usjLyL+2wr6wtL23xLbDsa65srO/tLu+t6m5uL2rpLSoqaqxrrqxq5y8vaWwwbW2oq+3taanp7GzoJ6kpaehpZmfrKipnqCqr6egppijqaCxuZ+jsK+hrKGtpJymp6mampufpJWcnZqeqaaXnKCpk5mUmJ6TmZahqpGaiI6Phn2HfoKNfXygjIyIeIKLhImLi4WHk5qPiJWeiJGVgoyXjJF9hXtzcH1xdHRgeXhobnBwbmh9cWN7bWllYl5khX5fWnJqcUtKf2hYWk5QTEpIUFJQSU5cX25TRFhaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPjBYVjUol56nmp2WrKCgoaSiuKuypbS0qqm5w7WzrZ+3ra6tsLXGyMG3vsG5sbS8tr+7vq+qvbCzvrG8wrmpu7q3p6i1qairsa2zsaibvrimrby3sp+xuLCopaevsZuhpKCkpKCXm6+noZ+jqK+hoKGUpKSit7ChprCrn6yjr5icqqWpnpeanqWTm52anaarmp2dppeWmJSdjpOXoqiikIiLj4V6hH6EinqOlomNhniBh4OIi42FjZOYjY6WmIqPl36Gl4uPeYF6cHJ3b290X3l3ZGtsa2hngm1lcmtrZWhZYXN/XlprdWlZR31dW1hPT0pISFJVRjI6X15sUERYVlllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdCZ1tIVENUXWhFLjsxX1QsMpajopiVnamepaGjobiqsKG7uaasvcSzsK6ita+tra+0xMS9s766t7Gzubi6uLqurb+ztLivv8G4rL26tKais6uoqrOsrrKjncK2pqm3t6ufsruppqWor6uZoqecpaaUmKGyppmepampnKGglKWfpLmopKetpp6loaiTn6mioaGZm52hkpudl6Ciq5ybmqKWk5WWm46Tk6OnpI+Iio6GeYR8hYZ9nIyJioZ4gIOHiIiRhZWTkoyQlZONjpR7gpeOi3d+e2x1cm1sc2J5dWhnaWdlbYRnZ2hkZmhpXmZiaWZaZXpiYFFzVFtbU0xJR0lPU0AhK2peakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3OGJNJzKepKSSjqWmnJ6enqS1raiqurenrMPAt6+sobWup66vt8HAvbHBt7Cvsra1uLe1rKq8tK+ysb3At668vLGln7aspqa1qquvoaDErKqnsbSrrLS6nqipq7GlmJ6qnqilkpqmrqOYnqWqoZuinZegnae2pq+qrqGhnZ2hlaCmn6KgmZuanJKanpWmnq2imJeflpSOlZiMj5iap6CQh4qKiHiFd4KCgpyHioKJe36EiIaEkISWlY+PkJGQkY2Se4OVjoZzf31neXBramxndXNrYmdkYnR/YWRlZmVpaWJnb1leWF1tZGBNaFdbYFZJR0hLTFJYPjlgbGlHQlVTXVtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OUROPUI8MCo8QDtBPC01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0FkRyU1nKSgkYyuoJqYoJeltLKjsr63obHFu7mwsaO2rKuuqbm+vLutwLKvr662r7O5sqerubGvrrO2u7awub6spZ61q6ChsaWrr5+lxKGzpa+ysLettZ6srqyuopmdp6qln5Wcp6agmaSjqZyaoJyVnJ6tsKa5p62ioZqanpieo5qlnZaemJuUmqGSqJatqZuUnZyTjJWZjpSUmKenjY2KiY57gXSCgoqYhYd8iYiEhIqMiJKFk5ySko+QkZaOkH+BjY2Db4F/ZnluaGtqZ3Fya1toY2Fyf2BkZ2pua2ZqZmRsXGxtdnFhVGJoY2VaSUZMTU9YUVBVYWWBVEBWU1lVRkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFJZEInNJOinI+OsZ2blKGaqbKwn7nAtqC0wbu9ubGmtrCprqW3ube4rLuvraurt6q0ua2lsrWxr6mxt7axs7a7p6mftqmdn6qjqq2dqsKZr6Wvsba1rKyesa2vqqKbnaSsqZyVnKeknpqpo6WVmqCdkZyjq6qpup+mpKCYmpqdoY9ropWYnHGDlpykgHaRq6ielpahkYmXmYCXip+PeIWTjYNtaX53hHJshoqGfYSKhm9dZGBnhJeGa4uQlJJ1d4uEf4OQgGaIgGh2aWZYXWl0bk5QamNmcYJmXmRmbmtpXV1eiZCFiGhPS0Q4RVRnXkpIUFBVVUtIU2BvdGVFW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTlxLW2ZiPkcxT2I8Ky+NpJqHlbGbnZOgnKqtq6O9xa+pt8K4vbytp7axpqukuLSys7C5rqqnrLSlsLWip7i2tainrLazrrSus6Kpn7SrnqKlnKeom669lainsLS4ra6kqK2qq6ahn5yhqKicl6Gmppycp6idkp6gmJCfqKqjtK+joqOclpiYl6OIoY+SmoahiJSeoX+lf6esnpSTnZOIg3J4jI6Dh6B1iI1pl4lmfnN5oG+Ih4N+jHx/oaCfmX97h550iI52m4psh4KDbmllZHttcmJUhm1jbWmYcVhpcG6GV11pW2tqWohwbXlyh2mHhFpeRk4+Rl5NRVJWVlFQUldUZ11MWUtSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05cTFtnXz1LMVVgNy8ojaaXhJ2snZmZnZ+rqqiqv8Ovsrm8t8C/qqS3saqsprO1rq+ztquppbGtpbWzm6y1trSmp6izsa2yqK6eqqGzqaCkpJqipJ2wt5Wlpqe3vaasp6mqq6emoqCZoKikmpmno6SZnKWqlpOjnJSUpKamobako6CjmJWTmJOciK6QmJWJqYuYo5yGsYCkrZ6Ump+VeYLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7B5aGxYsa5vZWm8krxuaHptcI/YflNrYrayfoBxlHWaoaqQV09YYU9WTkZUW1hRUFKLXFdbUEBcRVFOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01eZ1w+TDFaXDQxIY6mk4Gnqp+XnZ2lrbKpscK9srW/tbi/wqumtK2tqaivtKqvtrSoqKa2pai5r5yysraqpaSnsq+usaarnqeksqSioZ+XnKGgsa6Vn6OgtLqiqqigrK2kop2bmqKqoJibqaCfmJ6oqJGcp5uUnqKno6Gwo56fo5aWkpiSmYWwa2qLjap+Z4WWh61lcZ6dlZqnlnGuoaR+d7p8a6GPdrFfarRbpYBlnJFgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZKUY21tp25chKBFaWeHlkV1nGB9ZnujpoJZX4uraYCSeHpqqDhKr1tXVG1jWkxPWF9cV1Y7TohPVlYvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlkzMRuSopWCraelnqOkqrG3rbS9vrC3xbK4usOnqbCsr6mpsa+ksbqwpKWvs6Opuames7Kwo6Whqq2wrK+mqJ+jorGco52YlZidnq+ol5yin7Szoaqboaysn56al6Cjqp2ZnqWhnJqhp6SQnaObmKGgrJ+mpqCan6GVlZGWkZqGtZu1eYWpmbWZd4ezm7d/k5aXq5Z+a4GmeoGFhpGUknerZ2qxW6x7joeUdIhwjoaBf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLT6VYSGNjmX5jaKVfeXF1UpKHXlCpbWNxfYaAYZ0vUqJuW1RrZ2BMS1xjWFxaQj6wd1dYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMiw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOGFVNTAcl5+UiLOmpqGuqaizrKq7tsKwvMKtuLfCq6ytr66nrrOqoq+8q6Knta2jq7alpbKzqKOhnaeqsqiwqKaeoKCwlqCalpaXmqCvo5uapKi1rqGpj6mnqZudlpigpqmbn52jn5ygo6WjlZufmJqeo6ubpZqcmqKglpORk5OdhNWTmblxsMJ/xoZ81pScu3yblqaQjZyMpHqNhqKBpYJ6rHmPnVave4l+n2q5Wrl3hoN9poKTfJh6qnmOnZB7sW2OhHSQu4VulVCvp8WKUaB6Y2CqYnNyhmyXh19TtbTIhYCJfGOkM0KddV1QamhkUEBYZllkYUpITWtKWlNPWWZaQ0M/RT8wPDw1OTs3NDw8OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLjAwNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVxKW1BfZlQ3RzphUDcyJZyik5mxqKmls6qltKekvLfBsbrAsra1vbS2p7Kxo7GzpqCvtqmbqLquo7CyobK0saGknp6nqbGptKmlnJ6erJeZmZeXlpiirJ6bl6mtsKijn46soqeWnZicoaaimKKho6GboqKnm56gnpWZm6ahnKaUm5ufoJiQkpWQnYiybmi1cauIcI6mcrR0c7Z7m5iljY+cjaJ+j5+kfrB1g5HS0XVbrnyFf6Rvm6qma4aFfa19l5mPe7Fzk52PeLNllnSFnm6eZpRSyYtawlyfeWJfrV92c4Zil4heWcqdb7+AdU1LtVNVxmRUUWpjZVhBT2pfbGlQVUZJOT1XUltWWUhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VFPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVByaDknV2lcQU5UX2VQNUc9YU02Mi6inZGlr6ylqbqsprWlp7a7vLK7v7i3tbu7tKa1tKKysqOgrLClmKe6rqSysZ20uKqgpZ2hqqSyqKyqpZqdm6mflpWYmZKTo6qhmJOnq7ClopaSrJ+lkpShnKSnoJWbp6eimqOfrpqhnp6QlpyinpyllJ2VmaKelZmWkpuFrHt3qHajj4uHqW+tioOnhJqZooqSmYuifpGXh66Ff4KzXHKzUq59goKkf3HXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1edneHZ5iIal2vd5Wfj3hsNXnIrrJfQlRvXWdgRVBsX3BtVlVNLmViaFNZUDtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjc3oJ2UoLixmLPBrKiyp6qyuri0ub65uLO2vramuLSgta2goKmsoJWntqyosbGrrbSkm6mfoKiitaemqqSZnpWlopSUnJqSlqOnm5SQp62vpaGVmKmfoo+RopqppqGVmqapnZ2knq2doZygjZSfm56gmJiclpehoJSYkaadhql9faV5oY+Qg6pwrYyBpoaWoKKKl5aIo4GQh5Sqe3+LnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRtk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmVPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpJYSEU9SEZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVRfYkw3RklfQzE9N6Kcmpq/rJizwq6rraimtLC4sba/ubqzsri8qru1oLGln6anp5+UqrGpsKq2raqvoZihoKakpLqio6uhl5uRo6CVlZ+blZigoJCOjKmwr6adl5unpp+NkqSYqKyolZipqJ6foKSto6GeoY6VoZifoJKcl5yVnaGVlo+rm4+ubnK0dKmMd4qmc7R5dLSBk6Wjk5yMiaSHjnW4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZwXK9WPJx3ZlRvbi5bp09iUmtlYmxaYlxgcHxjU1lRPj5tbzJCQkA/TTkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjkxQTilmpudu6Kcsb+uraurp7epuK+1wbW9srC7uKvBtqqroZ2npKKdkqurp7ajs6iuqqGXnKigpau5naOtnJaZkKWjlo6eoZyYnp+RlJWrtq+nmZSbrKmXjJSmmqWto5GXq7KkoJ6oq7CZoaKQmaKXoJuWm5ehk5ypnZSQqpmH05Oau3SxxIDDhn3Vlpu4eYmRmI2XiYynh3mitnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6von6MdIerfb5uc7x0soN1eICKbZqIcW2NpHS9XXd9W2F5vGpaVltpel5pYWRmYm15b1lbWUNBQHI/Q0cqNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkA5p5mforyil7HCsK2pqqyxqLmvt8Wxu7OvvLCuwbKtpqOfpKGdnJGqpaqypLWnraSglpqrmaesuZ2jrpmVoZCmoJONnKOemJ6akJaTr7mwq5WXo6enlJCWpZ2krZ+RoKirn5yfqaSynqKkjqeilKGanJeVpJiPsKCSlamfhZCZtoCRkY24lXiCk5u1d25sbnNveY+EjolznsG7vJl6gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnB3toxef3l9iGeDeW15YouscHSFf1hbp2lEZFlUZl9jXWNRZmZxbXVCTVBNRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJTWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppazwrSrqqitq6q7r7HGr7W0r7intbmuq6Sip5+gnZmUrKSuqqa2qKifnJago52spL6noaqXlZyRopuSj6GooZOel5KYlLK1tqyYnaSkoouSkqacpaudlqmlppyboqmnpqOooZKsnpeinpeXmJ2ej7Cpk5ynoo9rfmmcqHmJc36bjnV6ZYd7vr/Aum6SgnGVhV9yalpdmolhZIeOlWtgf5VjbZx2YpRrgJqVlGVeX2Nxm4locox8hpRman5xdHl+fWJbeHSBaFBcboN8e4pqWGx5gXJJSm+FcE5zTURWXGZhTFtXZmNeT1ptdmpyUk9ERU08SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5bTyc/Mj6on6ihwaSatLq2o6ymrqeotbKsyKywtK22pL6xs6ehpKqdo5yamqynrqSltaqkm5iVopumram+qKillZSblqCak5ilqaeRnpCPmJywsr6sm6edp6KJk5Gqm6iknJysn6Oam6OnrKKfqqKarpuVpqCWlZ2fnZexpZmiqJmckZ6co6Wap6OanZqampCWgmhufXF2kZeUkYOJtKmNhZiVjoqMmJaHk5WKg5OTkIiNkZSZk5mXmqChmpuUn5uNgnqkhWxpe5B9gHWJi4Jygnh5dnWKgHuJanOBdIN1ZHd9dmtwemxfYltvZ0xYWWVqX1dZcHpvbWZTT0ZSOU9aTlJPKCs7SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Gxt6CpprOnpbC1qsmrrbKmtabAqLShnqWmnKWWlqCrp6yjpLesoJmXlqCXraqmwZ+rpJaSnJeemJSUop6eo6iSkJmop7LDr5qrnaqej5eWqZ6rnJ6hrZihm52ipa+loaSonquYl6admZqhnp6csKGdoqeVmJSZlKGjlqSfmKGOlpSLio2Pl62Pe5WbgpGAiamohYCYloqEjp+Ie4OQhoWakYeGiZWOm5eOkJieo5aZkpCcjX6NZaGzroSJhHd7j4p+d3l6b2d5kIGAiWt1gXmIcmlzf3l1g4eBanRjeGZfaGRjZGZqWGt7cWprXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15dXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLOgua++rKutsbKgqqayraKss7DGsKutpLOvvKS0nKCnoqGdmZeopqmmpKaztZ6VlZ2ZmbCmrr6gq6KRkZ6amZSSlqGcl6mdhZ2prKK0x7OfqaSqlpaYmqeeqZygpauUn5+doKquqKSjq6Gsm5+foJilnpyfnLCkmZ+ok5iZnZKlmpmpn5uXZoOSfGV+j5qPY3iMbGhqepCjq2tkmZd+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKKfmHNsbnqEjIZ5WGVdhYJebIuKgnZbaHN3d5GAh4JueIJ4f3NteYRzd4iIjoN7aYVYXWpzZF1ziGlrfHFtY11RTldJZFhASjQ9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kuNlpPNilFWS9ETzFZQjs/Lj2ln7q8ua+ssrCrpaitrrCnrq2wvbGqqKWtsLCfrZigpJ6impqnrJyso6aoqbOunpajkKOwpra5pa6jj4+aoZmTkpugmJmmlnulrKKos8O3paKnr5+elZ6jnqOdpKqokp+hnqCqr6mpo6qep5umnqegrJahnKWxpJicq5ahn5uTpZifq5mefr6DiHK0coWeha1od7nEuHGSoaN7ppiYc6qCfMvAwLtxiqOHgp58lpiInsC9gpadnY2cwcB7gXqRjJrCv31rpbJvjIFvynp/m3eRg46AdnmBf3lxe4CGcHiFjJN5bHWRYmVeeGRfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqK4w7Swr7+pqZSjr6mwr62msrWvq6anpbGroKuYm6KgnJuqp6Kdq6KlqaWltKSeo5Omrqy4tKevopKRmZ2lkpGgoZeboJ2Hpqukq62/v7Ghqa6pl5KfnqKZo6Sqo5OgoZ6drK6nq6ajoaWfpKScramRpJupraqcnaudraKXmKaXoqSYnX/OlHl6pYF6lpabX62PXY6ogKChfKeVmnSrg4CvXmSMqXqoh4WfdJeSiLNjgquGoI2Ns2qErnN8loe4YYKtWaPNbpB1e9t7f5lxfoiSdX9le4h2dmx9h259hZCRfWuAjV9wam9mYF94ZFxxaGpjZmBSVFNXXkpPRDVBSEVEOD42O0A/QTs9OEA+Pj9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMa3Bv7+0tLC3mJ6Ro6qprbSrprKtraykrKawqqGnm5qmmJyir5+hn6ino6ahn7Csm56Wpq6tsKuorKCUkpufpZOQn6SXnaejnq6kq7Cov8azqKmxrpaSnpyil6Gqqp+VoZ6dnK6upqmom6amo6CqkqyzlqWiqqqepKenorGik5unm6GblZSRl6BwhYyYdYSoh3GwfJ1yrH2gn4Glj553q4J9rX+ccq1+q4eGn3aYknt8l36qiKGLkYucfat6iJKOoIB6rVacxHqPb5LBfYGVbXVwjG1md2WGb2F3bnJuiIqRj4Nsj45kbXN1b2BmbWRfb2hqbmZjV1NcYFpSUkM4SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv08XGsrOgnaOOo6Kira62r6mxp6mrqK6rq6aio52ao5afpqufoqagqaiin56wrJibl6ior6yop6mel5Wao6KSlKGsmp2mo6+so6y1qbnNsq2mrqyWlZydopmfrqydlqGZnp6qsaepqZqqqKOhqpqvsaKorK+mmaarqquypJOYpKablZKFpGqkdYl6qXV6snGCpYmYjHCHn5qHpF9gUquEf66Cm3WugqeGhp96mZeFe2aAo4mkmIaBo32pfoGUhq5efKhVnaKSgXqjn4B8w6/FjHOvtLO5cWKpr8J0aIyMl46BbJiRbmx4eHdua2ZkZHFwZntpY1xWX2lYWFRMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1cChmauooa+in7C1sK+praOop6qrq6mkpp+bpZ+dpqempJ2smqOsoaSfr6Kdm5OqpLawrqCpm5yXlaajkJqip5+gppyxpqOosay2yLK1qayqlZGcnaKZoKW0nZqhlJyfp6upoq2Zqqihoamhs62iqrOyopyqqLCwt6WUl6SomZ2SfKpsnoSHdat5fLBugqSLiJ+WlZ6VgdK3tLjJgIGyXl+UqYOkh4egepiVmXiqyXOZo5SnqJCSmox+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SOj5ySe2+VkH1ueXR8em1bZWpycWaBal5hWGNtXF5ZSUxMS0VEQkI9QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXVxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwMa5ramyrqylop2yuayqoaabqKarrKmmoKakmKujn66snaahrJqfqaWdp7WfopeTqKu2sqybppyglpClrZKanKaioKqmraGjp6mwtMKxsqqtqJSJmJ2lm6Kkr6aXoZWZnKWlqZmunKumpJ6ro7asoLG5sJ6cr6i0tLSmlpippJuhj4KdTniagX+feoSjfIKkhIamnpyelIS4e3x5uYJ/zMbDtneboZCLn36alpeJdp+XiqSYpKd+r4Sbg56ErH2ZlGGlbKNwj4WQgX2XhHKsYKRycYCaYLx9UlV1jpGjlnt8kY6Hcnlyg31wXGxud3JqgG5aY19obmJkXUxMUVNBSEdGSTk5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuhrLO0pp+hlaavrq6ppp2lpZqjp6GyrqKpp7KgmamklKK1oqOVl6KqtbmknKOdo5OQobKZnpumpKCir62cpKiitbHDsa2qraqRh5Gcp52jpJ2ll56YmZmlo6eYraGsoqSXrqW7rKG3t66enrWzubK0qJmfsaKln4eP0bXDt3mHjoWRk4+ApniUoneLoJKFpYKLcauGhbRucmmZo5yViZ98l5mGh5BzroKlm6KMpoqTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicXF/n2Jzsrhod4+TpJh9iouQiHZ7eI2BbGh3aXhzbn50XGRkbW1laGBKWldYPEhGP1QzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq2/v7y7tZ6XqKSttqGimZWjqaeuqauZpaGepqGgtaeiqaewo5Sro46kraOdkJqaqrS0pJ2mnKmSlJeuoKCepqOcp5y1maGqo7Wrwq+pq6mijISPnKKgpqOWmpqcmJuYpqOll6mmrKCjm6ymvayUvrCtn6OwtLustaidqrOlqZl7qJF9fLB3ioGkpYicbbJvoIete6GPg6iWmYCsiYWuhaCUqKGil4WfgJmVgHuSfquAnZmWiqp3naCPiJOSf3mvXaOBfKanZJ6AfJd0a65dpWtxhZldYFuMoG2UkKWYgpOLk4l4eYGWfmpsfWJ9dG1/eWBnZXBuZ2doQllfWz1KUzJUOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWldTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiMoKLySmoSpxsO2wbSfmq2grrilo46bpKOgr66pn6Oena2Ynrmgoqugr6qarqGRqqmllomaj66wrKagqJutmJmPraKhnaWhmaScrZefqKW2qL+upKmjn4uAjpubn6aekpSZmpSamqSjo5inqqqho56pqL6ll8Osq6OirLO7rK+oorWxqqyZdq9+kIqchYd9uq2JmGSwjGWVrX2hj4OnlpuBrYqEsIWmmaOhopGFoFtsaoGzYH+te3uCgLFsZ22Zl4uIsVt9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46nmYmVj5OUeXeMm3xjc3xhg3hzf3xhaWZwbWZlZU9VY1xBVF49SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gX2BhYl9fXFtYVVBOSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Sxt727tMGzo5ytpqW2qaCLmaCfnbOxqJ6in520mKCzqKqrnrCtnqybla6ooo6Im46vrKino6iZrpOaj6maoZ6lnpmjoqWYnqKpsqi8r6Wonp2OfIublqGgmZCSmpuRmZeonp+Xp6ylpKSipKm7nqDGp6Wpoqy1t66vqKG9r66ul4GpkqOujpuAhqSXmJCBgLjDuoOOnZOEp5idgqyKgq+Jp5yapauRftW9wqpio7+9fH6jgoPXure1hZOSgp69voRqo4Fvq4RunX96srHHg2ursL2seHeivrt0gJWNpZqNmY6Umnd/j5l4YXx5Y4xneIF7YGtla2phUGJbU2lcQFRgQkwpPDo1Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLG/urK9s6Kdrqals6adjJilv6m2sKehv6amsZuesZy5qJ+trqWnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6aep5uaoKiimJ2grKypuK2no5qXk3uImZKmm5OPkZiYj5iUqJmelqinnqmmoaKru56pxaOgr6OrtLWrsauivaqwsJx0dqqkt4VliZ9wZ6yPio9tb3ekkJqggXWwmpZwkI1ylqijm5iupHJsbWxlinhubYKZcYB6aXBpZomWlZdxaGmFhmdwhmRdimNpb1ldZ354pmBico+Sb2ZkgI2TjqGWlZaOlJt6hY2TdGSGd2eManh+eGRsY2ZsYktlV0prWTpQZERQJ0o6KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurmys6qpoq6epLOqmJK9scPHvbSpnr+rrKOgpqufuqOkraytpY6WraqQjIWVl62fpaqin6SjoJGLpZKnmamZlqOqoJacpaanr7mqq5qbk5J7hJaOppeOkZGYk42XlaaTnZanoZmwpp2irLmgsMKopLOmrLGyq6+tqbqlsLmXi6GppbWciZaimIapmpCUnZOqs5mbo6yhtJejoZ6hopyhpKGVrKeMkpOMh5KcnJSQmZOYkI6VhH+kmpeVjouTkoqPhoR+Z4uAdIN2dIeMcadtfJWSlJOBgY+Pj46ckp+UlZSegIWSi3BnjnZuiXd1fHlpa2Rkb2NVYFhAaVpHYmBOWCtFPSsmITY0MC8fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW3rq6isKStn6C2sZCOqsS7xLm3qaGlnZulnbCoo7annam1pqeRmKyji4iJj5ynlqyjoZqonp6TlaOXqJqpmZSmoaOPmqeZobS5p6qYmpCNfIGUjKGUipWRlZCPkpekjp2Yp56btaOdpqy3qK/CrqO3p7Cvsa6qq7W7orG+mZKmpKa1opKdpp6NqZ+Nkp+jrLCboaSyqrGZpaGdpKuenp2cl6yekpqim5SQlqqZjZiYlpCWnpGHoJ2VlIWSjJCNlYuBfmaNh3WHdnmIhHScaoeRlZWSin2MlpKSl5GgkZqUnoKGloV4cZRyeIl+cXt+aW5kX3BpYFtfWW1iUGBkT1k5R0ZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjl5Wkp6Ows6yuo6mnraCotaqQj5yjsrqtqquhopl6nKKwpKWxqZabuKajlJipnI6GiombopCunqSWqKChkpeZm66LqpaPqJmojJiojp64tqOlmJuNiXmBlIybk4qVkZSQjZGWoYucnKednrijf4OvtaKwr3SkvqOyoHh7oay0vZZ3rqWgioCpfmRcYnafjqSdg5d+bpS0nKOor6ykZZ+glHR6mpdxgJmpmGyAo6iKZZylm5CXmJaLkpuQhJ2akJSDkoeOjpKJhXdrkIh2h3F8hoGAYWmJi5WTjFt2lZFnaI+McXmilpZkd5eGgHaXaIKJgm55fmpwZV92b2trZ1xlY2Fhb1JaPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0dJS0xUVVVZXWBoZ2dYUUk8REc8OVZSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6mlqa2kp62kkpaqtK6xpZmppqqXc4udr5+oq6eTlrigoI+cpJ6QfoiImp6Nq5qklaeino6XkZ6FdK6PiKWaqJGWo4ibubOnoJmZi4l1dpONlpOKk5GQlIyPk5+NmZ6lmJuyloCMm7WdtIySj72noX6nonuksLmCjo+nn4SLhY+xqa+MiZaimXmBi6yGnJ2iqKupiJWHmXelm3qHnIGXp4KBe52yeoqGn5eZlJiWgZCWloSZmmN5h5CEjY+Si4NucZCIeoFxgIGGf4Z0h4WWkniWaJN0oJp0e5mCnZqEmH2RiIGCmGmMjIRqeHpwcGdkd21pbGpcZGlpZXJbXEhUTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWhmWVFIOURLPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrcW8r6CVpae0nY+DnKucpqKgjZC+npmNn5qhkHyFjpmYiKydo5ahoZKNlImGgJGojoeinKOTlp2Gnrmxp52ak4+FcHWQiZSQipSPjpuLjpGdkJWeo5Sdq4eftIm0mq6Lyoirr4m3hY2wg7KwhamOp5iNnXyoj3J7d5uOppZolaR5tIufn6epk5nCgn+riJihcZ6AmqV9l4WVsoChfaCTn4+Yl4COk5uJmJKLfIWTho2Uk4mDbXOShoB7coaBhH2FdYaCmIGPxWaAqYePomqdgZ6XgJmAiouDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZsWGZGXFFMMkU0Nk1hYzcmNDxER0Q6NjM2NTg7OD49PT5CTD9OSUpLQ1BaXVxXYl5qbFxRRT1LTUBKZFhdY2doZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGpq6aalJ6ipKqilaSptaKvf6CmnKWenYmUvZmTjaCRnY95g5aWkYirmZybmqKFj4x3m5yOoJGInqSblZiXhqK4rKWZm42Nf2Jtj4uTkI2PjIyXi4+Rno2SnqCYoKd+oaeHrZ2glq6QoJ6dkYaCoI2ssYikjquajJp+onWAmJNrgat0Tat4h42dkpupqYKqq36EoXt6p2mef5JsZ5eGmLaJnn5uYGNYg5d/jHtkZ4tzmX15lmtdfJduX1NxhVxgbHmDYFllgn6EgZhxp6prg6NucqVwn4KcZ2SebFpsiHplWV+CfmFXUG92ZW10cWpqbl5qb2xraFdnTl1YRTlANEdEXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKW11fV15fYnZgTUU6TU9NVGJcW2ZnaWliYmRhZGRiYWJgY2RjYWJqa2RiZGRnZGJnZWFjaJiWnaC5oKqjpqyRoba8q66imZafoKWrq5+crbShp5Ggn5+mm5mNmLSZkIuejJWLdYGUkY2KppaWmJ+efpOFhqyjh5yRipipmJmakYelsKailZmIiYBpboiHi46OiYuMkYuPkaCLkp2fm6Glf5OBj6OhlKB3nJaQp4OiqICGq6+GpXqLfYSafaJwcpKHlnuejHlth5uLmZGcqZyPh518gqJzdqZmnn53pF6Ye32Tc6JumLe0unOTh4GAtqhkgca4e3CVtoxxgJukY3Ssq2B9ap2zfm59h4OPgouXcYCjbHOkc56CfaNenJmzlm97l56zdHJbnrKCaWJvc3VxaG5Ya2tycmRbZ11hS0Q9RDVRQVpxMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1lYYGB7ZElDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4ta2toJqhm6KjpKubmrGsqpKXoJigpJmalJ6rm4uIkniLhXCAlo2Kj6GQk5Sdl32Rio6ooIeYj4qSopObmoyKqKekno+Wh4R+a3uHfn2PjYOLj4+JjpOegZWbn5ygn4uJd5yYoo2gcqKLiKmInKeRl6msgK6MfXqgmXmjk3iAc5eIjJx9lp+Gm46ZnKeHo2ShfYmWkJuMbJ5omo1umpl7gIqnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2domKgJ1omnWHk5KYjn+ebZmQaqaZXKh+d7tqfalajoRds2dcbnF4d2tpW3Bpd3hhXmRWYUFQRU83VkJSbjRKWlleTlpEQDE1MTs7N0g/OkNHVT9YUlhdPkRiXVZgUWFjfGlFQjlOW15ZZGZYZmdtbWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZyJqrabqIljlZysurKwq52lm5qnn52smZ2wp6qdlqKZoZ+Zlpago5mGiY1piIBxe5eIjJaWhJKUmI96ioSWo5yJlY+Gi52RnJuIj6iin5qMkYqAgGmBhnl/lox7iI2Oh46VmX6SoZ6gopOYcmifiqCPjHCSjIKpiJmgpKmiqX2wraSiuJd2o7Oio3+IlHidequafqKPnpyYiZhyoX2FjbC1fWuakaF4fpi0o6OrqISYe5p8nJp+c6paXW97l4t4nmJMf3t7hWR6mEJNn1mianJ8jm6BioSZdpt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfX1uZl9raHV7YmNfUF1WXFRWQFlFUWdFUlZcYVhfSUQ9QjhAQTpJRThMRVhBVlFaVkRGYVxaYEtgbX1xRUM8VV5iWmVqVmhobW9iZmZeYWBcXV5gaGJfZWR2bF5lZ2ZsZGVsaGhraZSdgbGumYRTX6GntLqzs6iaoouaqZucp5Kgq6Ogp46enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32Rk5aIcoCJkqCbcpKQgYiZlJ+ahI6om5mVi4qKfIRshIVxgaGMeIWNiIeRl5N7kaKfnqOIroZ9tYSPnp17ppZ6qYKWnpGLop5+p2h3bX6Zc6BzcXydhZhvk4KufaODp5+bgaRwXqlodaNjb6VhnNOPfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyp7x/d4Ntf7+mqrRenG9+cpdvgXOicl6kZ3SmYGimbJrTmHqCm252eZdrm3l2l3JsqaVnX2R5cH+Ea2dmY211d2ZfYVFaZVBRYUhXSVRfV1NbZGpbZVFGQ0tMSktCSkU4UEBQTVhTWE9SUWBlZWlSZHh5d0lGRWNdZVpoalNpaGpvY2pmYGNfXF1dX2liYWhlfGReZGdka2RqbGZobGiYm3+wrFRcS36pr7K1sLKjnJiEl6agoKOMpKefl6iJmZeYk5mTkaCXjoiFe3B9hGh9j4OTmoF3kY6PiXB/h4+TkmyYlHyJkZKjlYOOqpqTkouFiXmEd4iAboGehneAkoWHmKCVeZKio5mgibOhoraLeqynpK6lcKmAm5GGgZ2TfaSAopmGmHGehKKtromXi4CMpI2Vg6+ilXa1trbJonSUi4KeYZ6XqW15lYagm3Whh3egfZCWioFvTGajknCaiHOle3l0YoOCbH6gbHJkYJxyf3SXa3tqtLW0xqZzmH56nGqamqt0gZpsc3eXaZl5dJdxUER9s15qdWp4h2ZrZ2J0dHBtVVxSWGdPUmhJVUxYUlVcZ2tuVWdXTUpBSk1KSEpOQVFKUGRjaW1ldHJzfnh7bnWJe3tUUU9tXmhba2lSamhpbGdtZmNlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlopyIr6eFZj+UobOsr6+1oqKPf5anoqGji6SmnJulgZqXlo2XkI+bk46Ig3lqeYZlg4x+lp95dY+IjIJphIWSg4yFnY16jIqVpZKCl6mXjJGLgIl6gH2LeXCPoIZ5gZSGiJWelH6TpaeclpaEZ254nGyiZHxxpXicmHBop4KYjXykeqCWg5Zyn3aAiZSVj7lukIqiYn2ZopaJbnNqq2t1oG1vpmCbaYuQaZaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGeIgm5yolpfW2Ohbl2JjHB7f3RyZKVueKJkZqdol3KLmG6hb1KIj26gXmSnVItdVJhtbXJqcYFtcGhreHNrb1FWVVVlWVNtSVhPXEhYaGhzallrVlBSRVZcTFhSYVVoal53dXp8cHx8coJ7f3N2jYCDdl5Rc2FnYnFnUGtoaGtsb2hkZ19dXV1gamJpaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupaqwsaafi3+WqpydpIuhoZmhoYCVmJONmo+Ll5COi3uGcYCIaIuKfJeac3SJfZB8ZYOHlYqJlpmCfIiFlqaQgaKrkIWQioGKfYCAjnNpj6WEfYWTjIeXn42GkammnYmmeJacfqWJloyymZ6Rg6+Xn6V5l4l6qXSmj4SabqWijJKEjIO8bn2lr4KHhoeUl52hfaZ7cqiUoJZnnn5vrGOWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4Zvb6CekZRhf6uLqneBf46nn3effYWklZ2gaZqHdaxmnq2MtnN2voyjk1mDpo2rYHVxc297dXBian5uaGxTVVlVYGBcakxcUVxJXWxtdmBbcVhbX1pnc2Vub3FjcXRgd3p+eXJ5g3KDfoF7e4yBgoB2YnlkZG5zZFJsZ2dvbHJpZmlhX15cYWpibGx6b1xcYmlhbWl3bWdsbmKVpqqcgYCepJaqqp6op66jmIiBlqqZnaOJmqScqJ2Ei5qPhZyRhZKNjIx0hXqIg2+NhH2Xk3N1hnKRg25/i5KGhpSPfXuChZeljX+lpY2AjYmElHWDh5JvbIuogIKLk42Im56Ii5KqoqCQgHSUl4h+gXmUr6R/gZxxj4Z5koyFgHtyp4xxfX16l5abhI14e35+iJSVk4t3kZmgoYR7folrjIVbeXlzeXBpbn6SinJ/dIGPlJNxhYOCZY1/X4GAjHd2dJR1b3tvb4luhIZed2l4jmaCg4aPqpx/dH2XaomIb391fIR1bWxmjHN3e5d3hFpqV3mPaG13cnFvd3hvXWyGbWlnVlleV1xka2RVYVReUV9vd3lrandlampqdXxwcXRzYW91YnN7gXh1eYF1f4B/gXmLhYJ9e21/bGR5bl5XbmdodWt4amlpZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW5qaeLoaKbpqSZpJ2rop+Dg5aqkZ2giJmmmqiYg4Gbi36WlIeOiomMcoJ8j31+j4R6l450coRwlYZ7fZKLhoaQhXh+gIaYo4x7p6GLhY+PhJWCho6Yd3GEqoWNkZyPh56dhoqaqJ+gqoOJjpWbf36Kl62okJOnkHhxnpODe5Nwf6mGcH2VcWpvfIGfi3+Sjotobl2EjIycnKCPc5aMiHF0a4J2dIBZcm6GkYJ+fotpXWljeoWDiIBfaXh7nHyDjYN2gYeDaXmMiGticXKDd19yjYKKkKiWh2eNj4Nud4uCb4OLd25kZmN5gnqVWltpZm12W3p4d3Rtc3KCZlxtimtrYllYXVlYa3FbXmBZXl1lcn16c290Y2pqaXt8cnp3dGRtdGhse351enx7eXl/gH9whoqEe31zfnpyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMqrGhkKOhmp+emJ6ZqKKhfYKWq4yelIeaoZCklH97mIR8kpmIiIaGinJ9gIt2hYuBhJaKcm+AcpmHhH6Sg4SGioF6gISLmp+Pgqagh3iNl4iVi4ucl4SDeqyBkJeZk4mdnIaHoaqfoaKji4iTm52jmZaqoqinoZOciZiQfHmPj4Wofn6SkZKTnLGlmpSdkI2xkpiEpoyMlpygipGcg4mSimt8jnZ3ZYKGkIp9iZ2Eh4uPh4iAhYSQd3x7dZujiYiLn4uGlX9+jYKBdnF0hoV/eImIi5GnkYSHjoiDjJCLe4WJh41/dWqBg3t5mWlxaGBzinB9end2b3ZzgVxeb4dnbl9eWVpcUmdxVWNbW2FsaHR7fHJucGNqaWh/e214fnBob3BsZoB7coGAd399f4R7bYOMhnx6eHx+eoN4TmR2anNucXtla2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5aioZiVmZiUmKSgnXp/mKmNnoyFn5yKnZZ8eJSCe46ZiYaDhIdteIGAcoCHfoiThG1sfnqXh4SDkH6AhoSGfYeDjZudkYapnoJxio+FkpGLnJF9jXqpg42Rl5WOnJaFhZumn6KanYaDkpqZmZCZpqCmnp6Ql4KTi3h9iI+Fpnx8j5CRhZiqoJyTnI+Nqo2RgJ6NiZSboIOPl3+HjoNweIZxdGF+hI+GdYyYgIOPgoaEfoWElW55dnWTo4yOhpuFhY51gIx+fXJzfImEe3mNj4WTqJCHhI+Cg4mJiHWEhoaJem1qfX96bWhrbGZeeX5nfHt2dHV1endcYHB9bXVgY1pbXlFmbVNlWl1ha2l1en5wbGxjampngH9rcn9ranNueG6DeW6GgHaCgH2FdnKCjYd+e3p8f3uCi2Bpe2t1aGmDZWpjYGlbY3Vob2J1bWtUYnF5ZW95enJlam1ti4qfuJqhpJ+SkZaXi5qfnp16d5ylkJuJhqSUipiZeHmNhXyJkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foaEh3yPgI+bm5CHppx/cIuKjJKGoKGKhYx8p5CHj5KWk5aSdoyjoKGdlpp/gZCamZONmqKipJuYkZx/j4Z6gYWPiKGAfoyNj3yXpKCgkpmQkKaMj4GckoqUmJx+k5N+h46BdnSCcHZgfYCOh3KKlnyIjHGMfoKFhY9peHJ5jZmTkICYf4mMc4KIfX1xenyMhXt7ko6El6aUjIaRfISFhoR0gIGFhXhkcXp+eHlwa2pmXn1zaHx1dXN8c39qXmB0dnB3ZGNYXV5SamhUZFheYWhqdniBcWZrY2xnZX+Aam19Z21wan13hXpri4FygYF9gXR2goyGf3x6gIF9f49qcoNudGliiGlsYl9xVXRvbW5geGhsV2p0dmN0enpxYmtveYmNn7OSpaWcjpCYj4acoJqbe3Wjn42Xf4yhioialXh7hod+g4l+iIKBf3B+enR1goV+iZB3Z2N9hpeLgoqNeH2AjYN5loCVl5WNlZ+afW+LgZCThqWbh4yJg6aVhJKKlZeSkXaQnaGhmJSYen+OmJePl5qdpJ6Zk5Sce5GHhHiGl46efoKKjoxzl6KeoJKYjo+ijIuDmJmEk5aaf5iNfImNgXdyfm57ZIB8i4ZwhpOAkIJrh4OBgImFZnZvfYiTmY5+lHmMiX2AiH18coB5i4Z6hZKKjJmjl4OEjHeHg4KBdXl/hoNzXnd3fHN9d2ZrY2B+aWp2c3R1fXF8Y2Nhc251cm1hWV9dWmtkUmJXX2BpbHV5hnBiamNsZmh8g2todGhsb2h/fIF4bY+GcYCCgn90fIOMgYB+eoKDfnyQbXWJdHRtZYpsamJjdVaDaXBuYHhnbGFqdnBleHt5cF9xbIWFkJ2umKaono2Nl4eFn5KWl3x2qJuJmHmWnIuMmI94e4CLfXyDe4CCgXhzeHlzfYCDf4iKgGRefYuViH6FiHR9fop/fpiElpOWjKOgl35xh3uTkYqmj4yOipKgkYORj5OXkIqAjpegmpKQknSAjZKUiZ2dnqeZmI6VmHWPkItthpmQmnuHiJCJb5edmqKTlYqNnoyGgZOdgJOTloeaiXyKioF6cnprdWx8f4t+boWSg5R4b4KEfn6LgGVzan2Bl5iFgI50kYmEeoh+dniBfoeBfYSOho2VpZF5hYJ0iIZ8f3Jzf4WBbF95dHhwe25hbmJke2Fub3Zzd3dzc2F2YG9sdW5vXVteXV1qXU9dV2JhaG1zeolrX2llamNod4htZmxoaWxngHx6d2+Ph3OAg4R9dIGGiXqDfXqBhH18jnJ5i3l4bmyHa2hfaXJjh2hxb2V2Z21sYXpoanx7d3Bhd22LgZmaqqCkqJ2KipGGip2KlJd8dqyXjJZ8npORlpSIdn17inx7gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkYaAhIRzeoCGeo+Rh5GRm5KkmpOBfIF8jYqSo4iNio2Xmo2FkZiTlY6IiIuSnZOQjI1uhJCPkYmemaKhl5eJl5Jwi5uFZ4eaj5R7iYWQinCWmpShkpKIi5mMgn+Rn32Sj5OMmo97ioWHdHN2a3FudnyLdG6GkY6ScXSAfIGCiHxlcW16fpuUfoWKdZGLgXSIeW6AfoGIfYWNioaOlqqOe4h9foqFd31vbn+DgWJnd3N0bnphXW9ganRecGp6eHhscnBleV1tbHNtc1haXV9halpPV1dkY2ZxcX+IZV1paGdiZ3GNbmRpZ2VpZ4B6d3VvjoRzgYGDfHWCiIV4hXx3g4V6gIp3f4t7e3J5g2prX3Boc39rcW5tcWdva2V7Ym5/eXdwa3Z3iX+jmKKooaabiIyKgY+chpKbdICplJGNhqCMlZOQf3N7doV3eH9yc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWAf3+gho+KkZyXoJOWd4l+gIyInJ2Jj4aSl5aFiJSYj5aLi4yNjJ2KjpCEbomLj5GKnJahnJiWhpiJbIalhWeHnouSf4yEjIF3k5iRnZGQiImUjX5+kJl8kY2QjpqSfYuAg292cGxtb3B7hmlzg46YinB3gHWCiYN5Z3NvdoKbj32KhXuVknp3iXRwinyHjXuLh4WKj5ykiXyEdoGKf3d3bWp/gH9ccXJxb293WV1vYG9qXm9pfHpwbW1qbXdgcG9rcW1ZWGBhYW1XUVNZZWZidXCEgmJda21kY2Zrkm1gZmZfZ2uBdHFycIuAdH+CgHl2gIuAeYZ/d4eGdoOFe4eMgHt2in9qcWJ8YoV8b3BsdGpobmx2d19xfnh7dHVzf4J+pZWarZ+nloWMg36WlIKOnnSKn5OShYqajJWNi3pyd3SCcHKFc3F1iGxubHVtiHeDfX9tblVRgauUh4J5gHZygnmCoIKRgZKRl5uRmXeQeoKMkqSak46IlJiSg4aWmIuTi4iOj4iehJCKfHOLhYiPiJyZn5uWlYCUgGmHnoloh6GIk4WRhIpxg5GXj5qOj4yLj413e5ORe46LjZKXjXyIfIFrd2pua2xten9ieX6OloF2eoF3g419emh1bXWIlox/iYd7lJFye4Vwd417i417iX6EjpGfn4Z9fXiBinx2b2hrf4B3XndvbWtwclVdbmFxYV9tbnlwZ3BmZnN1aHFsYXdlXVZlYGByU1BOW2VkXHhwiHxeXGhxYmJlZpFpX2dkW2dvfm9rcXOKfXZ9hYB1dn+MeXuGgHiIg3OGhX6MjIR8eZV4ZnFqg1+Hfm9va3pgaW10f3Rfc3x4hndzc4V8eaGQmrGcpY6Cin+CmYh/ipx+ipiSjoSIl46OjoR2dHZzgHBvhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xvdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2JnH+OgXh6jH+IjIqcm5yblpR6jndpipOJbYmlhpOJmIOGY4yRmI2UiZaLjYmLcHqViXyOiYuTkYp6hXx/bXxlc29rbHp5XIB5j46Ae31+f4aOe3ppdWt0jJCKg4aGfZaNbH+AcIKNgI6JfoR7g5GWm5uMfXd4go94cmtlbn2Ba2l0b2doc2xTXm9kcFpfbHJ3ZmtrYmd4c29xZF93YGFWa19edU9NS2BlY1x5cYp0XFtldmBhZWWOY2BmYlhpcnNta3F2i3x0eYaCdnd+i3N/hn56iX9yiYeBkYqIfX6ZdmVzbnxlh39ucGuAWmtueHlyYHZ6e412cnaKdnmfjJuvm6CQgoV4iJR+e4ichoSekI6FjJeEk46HgXR3cHlwboRvbW5+cmNkeHB8bnp8amhsY6Sawdyu76Jza3WDdYShhJFulY+Un5SagZFwhYujl4mOlYqQnZWDgJSPhIiPgJKKipd+h3t1f4l4hoWOm5qXmY+Qdot3cIiKjH6MpYWSip2Fhl6LlJeJjoiOi4qEiWx8l4J9iIaKkY+GdoV+fmt9Y3h0am94c1iIepGHhXp/f4CFjH56ZnRqgYuPi4SEgIyYhmyCd2+JkoORhX+Ce4GRl5SbkXV0eIaMdXJwZXN3gGBzbG9haHVmUmBwZ2tVX250eWFyY2BpfXFybltjcmFjV25aXHdMTExjZWFddnOKbVtcZHheYGRmhF9jY15ZaXJrbmtyd4t9c3eEgXh4fIlxg4R8fYh7dIuJiJWGjH9/mHNodXF5bIt7bnRwgFdweXZ5cWR2eIaMaHaAiXGAnYiZp5yjkoR8cIyUd3iJnIOEn42OfJWNgJmHhHtyd3Bzam+Ba2lsfHReYHh2e3B0emdgZXzr2rXJw9yJc2xzgHaKmoiMaZePjpyUkoGIcIWIoI6EipWKjJeTfI2SiIKIj3qRi4aPgoB3eIOEcoeCk5uWlJiGjXaHf3GGg4qImqSElY2fhIlhg5WPhYiGiYyHgIdofZR/fYKFiY6PgnGGf39yd2d2cml0d2xajH2SgoV9gIOAhIqCdmJ1bYqCkYyDf4CTkn5ug216iJGIk4V9gn6Bk5SRmIpvcnqMhXRrb2lwdn5ec2huXGl1X1JkcWhmU19wdnRgb2BdaIJxcmpXZ2ljaVhtV1t0TEpMZWZeYXJzhWhbXGV5Xl5kZ3phZF9dWWtuZW5qdHeKfnNygX57dnqHdIWDfH+Hd3aKhY+YgY2Ce5N2bHd2eXiSdW53en1YeYVxf25meHaRgmR2hoVxipaGmaGbooqGc2+Si3J2jZp8iZmIiXuff4SZf4F4cXRub2RyfmhmbHd3W194e3pxcX9pYWdhf9W2jpGmeG5xd3txkpCMhmqYjYibkYuGe2iHi5mGgZKQhoaXjXuMjICAiY17kI1+iYV6dXuDe3GGgJWZjpKUgol1hIh4hYGMlZ6gh5aQoH+IYX+Th4OHg4mNf3+CZn2RgH5/goyPkH9tg3yCdGttd3V0d3ZrY42Bjn+Ef3yEf4WIf3BgdHKGfZCOg32Akop6cYRne4WMiI2EfIV/gZWQkpSFb3B5i390bG1pand6YWdpaVhrdVpSaXJpYlBicnhsYmVeWmqDbnNiXGdfZW1fblRab05HTmZkXGZucoBrWltjc19cY2x3ZGVdXVpsbGJtanN2hoBxb398fXR4hniFg3yAiHZ4iYGSlXuJhnaJgW94eXuDkm9te4B2XoN/c4FtaHpzlHNnc4d8cpKRhJqfm6CGhnV1lH5tdZKWfYeQg4qNmXyMmnZ+dnFvbGphdHxnYml1eVpgd3t5bXF+ZWNoaFedj19yc5e8xIR2cZSIj31xlouGm5KMh3JqiI+WgHuUjIGEmox8ioV8e4mLf5SIdYmGdnd9gXJ1hoGelIWUj4ODcoCKdoZ9i5qemoeVj52BiWZ9k4J+hIOJiXKBfWZ+jHx5f3+Hi499aYB9g3Zmb3l4c3dzbGuOhYqBioB4goGFhIFrX3N5e36Oi4Z8gpCBfnOCaXqEiYyGhXmEfYKZjZGNfm5te4h9dnRuZmV7dGJbcGJXbnFTU21yaGFOZnR4ZmBeXVlvgG9zWWViXWpuYHBPWWtRRFNnYFpqbm18bllbXm1jWmJvd2RnXF1ga2ljbGpzdoGDcG1/fH90dYN6g4J8gYV2foiBlpB4hIt0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGuTjYWfmKCZhIhufYx2aXeXjn6AiYKUl4l5j5ZvenNwbGlkYHN6aF9lcXpaYHJ8eWdxemFlZY+xsndLYlql2dCWcXuQio93fZOKhJiRjIVua4WSkXp5koaBhJiKfIZ/eHeJioSWgG+LiHF1fnpqeYWDpZCEk42Df29/hHeFeoedmpWMlJGVhYhwe5KCfIKDiINugXdogIR4cn+Ag4qHfGV9foR2Y3BzgGl5cG91mY2Gg4p8dniAhXqDa1xyf3OCiYaKfoeKe4lygm5yhYiPhoZzhHqCmo2OhXlub36Ef3Z6ZGZoe29eWHZaWHBsTldxc2ZgS2x3dGFdXFpZdH1zb1dnXWZqcmBvTldoUj9YZl5acGtoenFbWllrZVpjcXlfaFxeZWxoZWtpcXd/iG9sf36AdW+Ce4CCf4J/doGFiJeJcYKNcXuGfHp5g5OMdWp5fmtvfnR/fW9ye3qTcG+BfnhnkouDoZmckYKFZoaDb2d5lYh9foSBmImBfI2MaHhya2xmX2BveW1fYm94XGRrgnphcXZfZWXU6r2LMjo+i45/cXiFiI6NdoKVjH6SjYx/bWyFjYx1fI9/hYGViHyCeG52h4SDl3duiIVsdXt0ZnmCg6eLgo6LhH5ugHZ4hXuInpKNkZOTjouHf3uShnd+g4yCa39yaIB+eG18fIKKg3dheYSBcWRxaH5udXF1gpuLgH+FgHN1foFzgW9cbn91eYuEi3uIgX2JeHpybYmEkYWMc4J6gJeMi4B1bWt2gIB1dFtnZ3VuV1Z7UllwZEtacnJlW0lweG9cW1tZXXR+dGhZYltnZm9kak1XZlE+XmVcXXVlYHVwWllUbmRZZHF5WmhdX2ZtZ2lraXB3fY5taYKEfnlugHx8gX+CenWCgY2ThHCAi253fYB7e4eSiX9oe31qc3tyhXpzd35+jHp4hH18a4yNhJudloyBgGyNfWtofo2Len5+g5OCfn2KiGt1cWdoYltiZ3NvX2Frc2BocIh6YnN0XmNkm6CPblw1Wq+1dGmAiHyShnWFlYVzjoqJdnBshYOHdXmJeIl8k4h6fnJndYl+fphvcYZ+aHZ5bmZ5h4Skh4CGjIl+bn93gYJ+jpuIg5WSmYqLhYl8j4hwen2Ee2h+bGqAe3pqeneCh4ByYHeBfnFkcmd2gm11e4aVkYF8goFvd3p8dX9tWXCAd3WNg4d4iHaDiXp4c2+LgZGCh3N/fn+UiYp7b25qbYGBdG1cZmRycFBaek1bb1xPW3JvZFVLc3hpV1lZWmFxgHRgXV1gZ2RpaWZOWWhNQGBjW2B1YV11bFhXU3RhWmRvcldqXmJoa2dtbGhwd3yTbGiEinx8cH9+e4F/gnp3gH+Ki4Nxe4hvcXeDf3uJjI+Dan57bXd4dop3fHiAgYd/g35+em2EjIiYo42Eg3p1i3hrbIOHkHh9eoGRgIB+ioNwcnBjZl5ZZl9vb19gZ3Bmam+JdGF0b1thZGp2e4C/nKakyLhxhYNyknx4hpKCc5CLh3Fyb4N7g3R0h3SId5SIeXlwY3eHeoCTaXKEdmd3dWNqfIKInYF/f46PfXOAdYZ6gZORhHqXj5aQiIKIe4iIa3h5fnRnemhrf3lzaXp2gIN9aGB3h31qanRoe4BpdoGMkZR+en5+cHx2fHR/YlZ4fnNzi4WCfYRxh4p3eHFxhIOOgH96fn12j4aEd2pxaWyHgXFvXGZhcW1JZHVLXW1VU1lybmJRT3R4YVJYWF1hb4JzW2FdaGVlZGtkUFtwSUNjYFtjcF5dd2hVVlV2XVtlbmhWa15haWdlbm5ocHd6k21piIx5fXJ7fnmCgYF8dXyDiIaDcHeEcm13goJ+iYuTf3CAe3d5eoGLdIN4foGBgoR6gHVvfoqLm56IfYV6d4V7Z3SFjI95fn97iIWDdo9/Z29uX2RcWGVZbXJhYGBwbGtoiW5hdGlZXmRugHep2qrHhoeycYl3b4x1e4aNf3qSiX90c3R+d4BwcX9thHSUhnh1a2B6gnmJj2ZxhHBndm5bbXyAkJN/gHmRk355fG6Jd4KSjYV1l4uSj4eFhnt/hGx0dn5tZ3ZkbXt1bWl3dn9/fGFieIZ6aHV1Yn17Z3WGjo2Ve3SAdnGAe31tgFpXdX9wdoWIf4B6bYmGdHlsdoGEhX98fnl8dIuCfnRodGVuioNsc1loXnNkR21tS1phV1ZVd21iUFJ0dlhQVlheYXGEb1xgY21kZF5vY1RdckZCZV9dZmddW3tiUVVcdVtbZ2thVmpfYG5lZmtxaHB2eI50a46NdX52eH53gYOBe3N9g4iHg29ygHRxdX6FgYmNint3gHiDe3yFh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeF59hZiLeIaDdIWGhHeJemJubFtiW1thVmlzY2BbZ25vZodxYXFmV11jbH98ys6HuaFqbW2KbHGEcXyDiX56kIR5eHN5dXV7amx2Y4R1koJ3b2ZefYJ6i4plcoJranFjWG16hZuIgoFzl5R4f31viXKEi42Jc5iPkYmGi4N7eX1wcG98ZmhxYm14cWprcXh9fHpdZXmAeGl2eGaCd2d0h4yOlH1yh2pvfoF5b31eWXN/bnWBi3yCb3CKgHF3aXiAgoCCeH5ze3WHfXtzZ3NhbouBa3FXaV12W0dtakxWVF5TVXtrYU9UdXJQUVRXXmJ0hWldYGxqZmNab2FYY3BHQGdcYGVeXFZ7Xk5WZXBZW2poXVdoYF5yZmtncWdwc3eGeG6VinR/enh+eYOHgHVxf4aFjoNwcHt4dnV6hoWHjIZ6fH90i359hoSEh39+fn2Hf3x4dnh4kZOff4x9i211f3hkgoaVhXORim+FhYF6g3RjbmpZX1tcXVRncmRgWGRxcmaBc2JrZVdbYGp/d76ue6C2bmJzhmhze3F5gYR6fYt+d3dydm97dmVqb2CHdY6Bc2piXn94eYuEZnF/aGtrWlZvd4mjgYR/cZmTcoF5doRvgoOTiXSWio6IhYmFfXh0cW5oeF9qbF9tdmpnamt5d3p2Wmd9fHhlc35uhHRldYWNhpZ/cIxna3qEdW51Yl1xfWx1fYx7gmZ2h31ucWl2f3l/gHN+bXt8gnt5cWZsYm2JfWxtVWlfdlVKaWpOUU5oTVh7aGFOVXZrTFFUVV9mdYNmXmBxaGdiV2ldXGtoSkRqWWFkVllVeVlNVm1qWV1rZFxZZWNedGZsZHFncnB1gXhwmYV2f353f3yFh311coKIgJWDbnN5e3pzcoWHiYiDeYF+dY9+fISKjoSCg3p+i4N7dnt3d5qdl3qJgoZpdn17bIOEkn9xjoFwhYJ+gX9wZmxnWF1bXFtTZHBkXldicnVpdXBlZWJXXFxogHBvcoBziWRkeH5pdHVzcoGDd4CDeXZzdW5renFiZ2tnhnSNg25mXV99cHuJf2lteWdqZFVXcm+NpnyEe3aWkXR9c317b318kod4mn2IhoOGg311b3FsZ3RcbGdebHRkZ2Vpem97cllogXd1aHCBeIJ2YneFi3yUgW+Mam17gnFnc2Zhbnpnc3iLfH5id4N3amxydntxe3p0fmd/f4B5d29kZmJuhXtsalVoYm9SSmhqT0tOb0dde2ZhTVV0Y0pOU1dhanZ+ZV1nc2lmYFZjV2JwXUxLalhjYVVUVXNWTFh1ZFlea2BcWmNlX3ZnbWJwaXNvcn51dJmCd3+Ad39/hoV6fHSChH6XhW5ydHx6dHGEhY+BgHqLdnSQf3yBlY6AhYR8foyGe36AdnujpYp5iIWEa3V8enWDgIt6boRzeYR9gYN1bmpoZVZdW1paU2JtZFtYYXN7aWhtaWBiV19baoBqa3CAZ2tgaHl4anN0c22DgHp/fHV1bnpoanlqX2VuaIF2kIRnZVhid2p+h3tvanBnZl1UWG9njqh3gXp8kY56dnF/cHR3epCBeZZ0hYOAhYh2anF1Z2duW2xjXW1yX2dhanhofG1bboJydGpvgX56d2F3hYR4j4VziHJveYByY3FpXHF4ZHJ0iXx5Y3SAcWhqenVybXl4dnlkhHx/eXdxZGRjbnx8ampUaGFlU0prZ09HUWtFYHhmYU1TcV1KTVRaZWt2e2VfbXFpZF1WYFZubldLU2hXZV5YTVVsVEpceV9bXmtdXVtjZWB5aGxgb291bnB3dXqYfXeAgXqAgIeGenh5gn6Bk4RxdHR/eXZ0hIiRfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aEq59/eoiHg2tygXl1gH6AdG6GbnyAc4qAam9tZGRYX1pZWlRhamdbWl50gmlebWxcYVdcXGyBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cmx5Z2l4Zl1lc2d6d5OBY2NUZXBngoV3d2dpamBXVllnY4+nbn53gIuOe3Fyfmh6cHuOfXiQcYR9f3+GbmR1cmRnZ1xqYVxvb1xnX211ZHpoXXSAb3Jrcnx+dXZidIWLe4iHgYB4cnV/dWFwbVtydGNxc4V8dWVzgG1hbXtwa2p7eXZzZoZ2e3t2cWViZW1zfWlrU2ddXFRLcWJQRlZhR2J2ZmFLVG9XSkxYWGdrdXpkZW5xZmRaV11YdmVUSlxiV2dXWUhXZVBIYnhaXV9sW15cYWNefmlqX250eG1wbnaDl3lygYB8f4mMhn51dYZ5h4x8dHV1gnl6eoKMjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj62Me3uHj31kcYd5c3x6dXJvhWx7fmyPemJwb2JlXWVWWVlXY2ZrX11ccoVoWHBuW15YWlxse2Nwd3ZtYlpsc3NndHVvbIN4fn94d25udGRpdGVbZ3VmdnaSeV9dUmZmaoOCdH5iZGlcVFddYmOPpGh4dIOGkXltcHtpeW58hnx2iXOAeHx4f2hkdmxgZl9eaV5cc2tZZV1vb2J6ZVt3fGtubm94eXN1ZHODkn6Hg4l7d3ByfnNieGRccHBicXKCfXRncoBlXm53aWVoenx1bm+CdXR9dHJiX2ZubnxkaFNnWFdTTHZfUEpZWEhidGNhSVRtU0pNWldpbHF7Ym1sc2NiWlpbYXdcU0xjXVhpU1dHWWBNRml1WF5gbFtbX2JiXIRpZ2FueHlsb2p2gZB4bYN+gIGTiISBdnOIdIyGdHJ2dYJ3fH1+jJCAfpN+cHeVg3yZknmAgHh6foB0iIN0cJigent/iZR4Y3WHeHN3dGt0b35reHxwkXJecG9gZ2JsVFpaV2hjbWZcW3GJZVNybltaWFhgbHZjaXVqaV5ZbXNwbHNzc2mEfH5+e3ZvbmxkaXFjW2tyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJF0bGx7bnBxe319cYF4gHN6enpjZXVoXWJZYGdaXnZoV2Jdb2hhd2Bbe3ZpanJueHNydWhxgpWDh36EdnNqcX1uZndYXWxuY3JzgXp0Z29+W2BwcmJga3J+bW11f3NxeGtwYVxlbGx5YGZSZVRWUU90WlFPWFFIY3NiYEZVa1BJUFpVa2trfGVtb3FiW1pYWWxxV1JQZldWaFNURlpcTkhxdFhfY21jWGBgYV2LamNkbXl4a3BpdXmGe2uDfX+EmnyChHl8h26Ph3Jvdnp9dIGCfIuPgoKXdHiBk4WBn4l1gYCBdH+CcYeCdW+hlnN7houGemV3im5tem5meHB6a3N2coxrXnRuYWdla1JdW1VnYWxrWlxwjGRPb25dVlhVZ2l0aGJ0ZWVdWW10bW91dHhqhnx/e4d2j3NkZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1jX2NTWl9ZYpWVY25wg4WKdGtofHBmdHh1fWx6dXZven51XmVyY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGlzcXRwdXZrbYSTgYl7hXFzZ3B+cXNvVFxna2ZxdIF3c2NtdlZicmxbX3BnfmZtd35zc3NrbWBaZGpqdl5mU2NUVVBTbFZQVlNPR2RyX2FFWGlPSFdUVm1oZHxpa3hrYlddVVt0ZFNSV2hRWGVUU0haWlBNd3ZaX2VsaVliYF5ejm5hZmt5dW5vaXZ2f39sg4B9h5d7gIeBiX5rk4hyZ3SAe3V/gn2Ijn+Lk3J8ipGFh5+Ge3+GjHOBhnN+gnZupItygY2LdndseoxgZHtwZnpzeGxtcXaCZ2R7bGNmZ2hTX15VZ19sbltebY1oTmltYFRWU25ndGtleGRkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcHl+Z1pWWGBseHx7cIRfYl5nVlhfV2ObiGJrcIGHfXhsa3luXHdzbXtpdXRvb3uAclhpbV5YXFVhYldkcGNTXmFoYWJsWmB+a2Zrc3ZvbXd3bGmFjH+Je4htcmdxfW5zbmRaYWlpb3SCdHNeaW1TZXFlVWNvY3tkcnd8d2twbWtgWWFnaHRcZFVgVVJOV2RSTltPT0dkb11iRllpTUlfS1htZGB4aW5+ZGBVX1RddVxUU2BmTl1hVVNKXFlQWXR1XV9lbGhYY2FbXo1xY2dqeHFzbmh2dHqDcoKDeoiOfnyJh415bpCKdWxzgnR/f4eFhpKElY95fYyPh5GbhIB8jIVzgIFzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2MjIyMjIyNjY2NjY2Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjI2NjY6Njo6Oj4+Pjo6OjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQVLM2tjY2Njci2lubm5ucUksMDAvLyxJhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUyRtjq5+fn5+uLYmdnZ2dsPBgcHB0dGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e31+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJiIiIiIiHjZCQkJCQkIyHh4eHiIeJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGk5SUlJSUlY2JioqKiYqGgoKCgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpKSkYmHjoqQkpKTj46Ojo6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Li4uLi4yMjY2NjY2NjY2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fX19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkJCHiomJjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQjYSKjYiQiYuPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJGJgoiMiI+HjY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjI6IiIyIjYaPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fn5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNkI6MjYuNi46Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCh42OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnl9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjYyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHh6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPj9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdXh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk5Ozs6QDo7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5NTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ3eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg5Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs9PD4/PTw9Ozo8PT09PDw8PDs8Ojs8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1xcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5e3t7fX5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcXJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz49Ojo6PDo4Ojg4Ojs9Pz88Ozs8Ozo7Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF7TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9Pz8+PD5APz09PT8+PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHSEVEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhscHBwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX1RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD46Pjw/PTw6PTxAQkJFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0RFRkZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYCAgIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBREVDQD1IREFERERDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEZISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FBQ0ZKSElGSEhKSEZBQF9oREJBVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSktMS0xIVF9ocXtXTmyEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdXZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLTExgWGd/hIaEfnl/hoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSEtMT215g4SDf4CBhISEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4enx7fHx+f35/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQkZIS0hQdYKBgIKCgoODg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg5Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo8REJERU12gX+BgoODgoOFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojo6Ojo8ODk4OTc3Nzc5Ojo4ODc4NTg4O0E9Pj5CQT9BS0xPUVBRT09QUVdrcnJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxETniCgoODhISEhomKioiHh4iJioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw6Ozw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj49QEBPf4KDhISGhoeJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD4/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw8Ojs7PDs9PkFBP2KDg4WEhYSGiYmIh4aGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERkVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj4/PzxAPkFAREFNf4OEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKiFdHTExNS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZIR0VLSUtJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3PD47PDo9Pz9BPUBARENHQmqFgoWFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLR0VHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ozs8OT5APj8/QUJFREtWfoOEhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSklIRkpKRUpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojs4PD07PUE9Pj9BREVGTm6Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIuLi4uLXlJSUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0VHSUZFRUJAQkJccHJ3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAgH9/f1VFQ0VFR0dFRDs/QTs9PDk/PT5AQkdGP0RGREhNdYaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVFRktPTk9XVlFQT1FTUk5TVE9NU0xQU1VXUlNSUExLTU1NS05HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI+QkNGVk1DSktITE95hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZU1lYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISUhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUJDRkVERUxYUkxRUVBSU3qGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4ZsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1XXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NSkxKSUlMTUtPTVNvdHZ4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTUlZXVldWdoWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot5bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU1LSklJRkJEQEE6UFFRV1hQUE9RU1RTV1dXWFhtgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU09PTUtKRUM/QDtQUFpaW1NTUU9SUlFVUlVTVl91eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f31+fX59fX5/f3+AgIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5cVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVZSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlBRTktSVFFNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlNUWl1tcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVVFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBDREBDPkJIR1ZASU5NR11pUUhGT0ZERUZIR0hCQ0hHSEpHREJBQ0BOUE1SZHR1dnVzdHV6fHp7e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xzdnp7eHl1cm5zdHN5eH5+g4CDgoKAgoCCgYFrTEc+Pjo7PkA/Pz4+alBKYUVGSElFQj9ITU1HTVFVSkJFPz48PTw9PT89P0FDQj8/PD1CPkpNRlVvdXZ2c3R2eHt8e317fH19fX18fn19fH5+f39/gH9/f397eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFZUV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0JBQ0FbXE57Tk9PTktMTU9PUExLTFdOSUdAQjw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dnZ1dnd5fHx8fXx8fH1+fnx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfX2BlYF1ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGQ0xRT2FXUlhRUFNTUlVbT09RVlBNSUNGPjo5NjU4Njk3OTozNjU3OTU8Qj1mdHV3eHd5eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1RUU1BRVU9MUlNUV1hUVFhRTFdZWVZYWFZYWV1XV1hoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk4R25ydXh5ent7fX59fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk5PVFNUXFZSVVNTT01MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0eHl6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhYWVlZUlVPSkdPUE9PTVJKT1BQUE5OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUkxJTEtPUVBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRT1BQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTU1NS0dFRURCOz09PDk9RzY2NzdEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZ1NRU0FHVVBPUlFQTU1OTEpMS0xOT09RTU9PTUhMS0lLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QUBCPT5FSEZERkZJR0pKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT1BMTE9NS01MTU9OW1ZLTVFPR0lIRElKTExLRkZGRD9DQz49Qkc/Qj5BZHF0d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVQTU9OV0tMTktMTU1MTEtOTlNkTkpMUklJSUVBSEpMTU5LR0lGQkJCQD9FRkVIRExvcHd6enl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0dLRT9CPTk5OTo/Qj88QUJBQURER0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVEtKSU1URklJSkxKS0tJSkxNT1BSUEtHQ0xHQ0NKSkxNT01JSklHQ0NDRElKTUxJWnNueHl4ent7eXx2cnB1cnR5eXZ4anFvamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEtDRkhIR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTU9HSEtGSEtESElLTUhKTEhJSkxKTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbmp3dnZ7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZHBGS0NGRUdERUVGRUdDQ0A9PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkNCO0JDQz5AQ0NDREdMTkhLTkhESEVJTE5NR0lMR0ZGSUlMTktKSEVPSUNHTU1OTVBOT09NTElISU9TUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VGRUJCQUVAREI+Pz46Ozs9Oz0/Q0E/QUNGR0pHSklMSEdHR0ZFQz89RUVCPkFDQ0NER0lJR01QSUZGR0tOT0tGSElGRURESUlIS0lGSFBLREpNTFBOT05PUE5KSkhNUlVVUk9XZGFhbWdxcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQUBBRDxCQT5BPTo6PT87Pj9AQj9AQkVHSkZKR0lHRkZGRURDQUFGRkNCQkJERUVHR0hGTFBMSU9KSkxLSUZIRUZFRENJSEhLSkdLUk1DT09OUVBPT05PT0tLS1BVV1ZVU1lgX11pYW5pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNRkdFR0FCQENEPEFBQEM8ODo9Pjo/PT9CP0BAREZIRUhGRkhGRUVDQ0RCRElGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTk5QTUxOU1dWV1hWWF5aXWRgaGJqaWdrX2RlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRUU8QENCRDw3Oj0+Oj46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhFS0tMTE5PUlRPSVRVVFFUUFFNTlFOTVFXWlZaWVdaXlpYYWBgYF9oZWNgZGVnZ2poaGpmaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQUNIRTxARUJEPDg6Pj49PDxCQjxAPkFCRkNFQkJIQ0NERUZGR0dJRkdLSENJSEdJR0ZESEtJR0tJTUtKS0xITEpNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVFlaWVxaWlxfX15gY15cYWNrYmBkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCREdFPEBHRERAOTw+QD8+P0NCPEA+QkFGQ0VEQ0hERkRGRkhIRkhHSUtKRUpISEtIRkZMSEhISkhNTExMTElNS01OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBhZV1kYGZnYGVoamNzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF3dXV1d3Z1d3NndHJrcXJrcndvd0lKS0lLR0JEREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRURGSEVJRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tLTUxKSk1MTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXF5gYGFhYWBjZGViZGljZGlqZ3aLbGtpaG1vc3FwcXBwcnl3cnV1dHNtbXNzbXFzb3R1dHNwc3d0dXV3dnV1dWVxc2twcWpydnB3SkxLS0xHQ0NBRDw/RUVFQz1BQUNCQkNFQUNEQUFFR0NHR0hGRUlGQ0dKR0dKRklMSElKTUtNTEdLSUhLS05RS1JRTFNNS05NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGZiYWNpbmljaWhobXh2bWhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdFQUBEPj5ERUZDP0NBRUNERkNDRUdDQkhFQkhJSUhIS0ZES0pHSEpISUtHSkpOS05LSUxISk1LWmZKZFxLbFJIT01fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsa1Vfd3ZpamhoZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDQ0JFRURGQkZGR0RES0RESkxMSkxNR0dOSUhKS0dLSklLS05MTUxMTElMTExbc2JkcF5sbFVNTmVyXWdmcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXG91Z3FNS3J5dmtiYWtlZWx4bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQj89QkVHQkZDRURFRURCSEhHREVLSEdLTU1KTUxGSk5ISktKSUtKSklKTE1OTU1NS05NTVtyb29ucHBsa05QUWxYTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBcYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHBxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRkVFQkFCPT8/RUdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklNS0hKTUlLSUpKTk9OTk1MTk1MXGhkdV1scVdsTk9RblVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZKTEtGTUtMUlJMR01NSE5KSUhOSEpKSEhOT05OTEpNTUpac3Bwb3FxbWxPUVNvWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqW110Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISkNFRUVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRktNTEZPSktXUktHS0pKTklJSkxJS0pJSEtNTU1MSUtLS1NrYlppXl9qY3JyWl9aa29gZWVVa19jW2FiUWBtaFxqXG5paWRab2VkcF1aXGtbbXFjcHNsZGdjZGdgYGtucHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVEQ0dCSEpMR0ZER0tMSUVGSk5LSU9JTFtRSkZISEtNSUhKSktLSUhKR0xLS0tHSEpKTExMS0lLTE5UW11UUFVNUVBOT09VUlBPUU9PUUpKTlBRZHFpVFlWW1tcVVlbXVhdXFxjZmFhZmJjZl9eZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdIUEtMT0tMV01JRkVISUpISUtITEpJRkhISkdHSUVGS0hJS05MSU9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RhYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R4eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRkpKSkZFSEhQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHRUVKR0JJTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY19ZX2JbYF5bVFlYWl9eZGJiYWNmaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4dnJ5dnhycXh2dHZhU0pKTUlEQkJDRkdFR0dJSkpJSURHS0pLRkZJSU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVCRkpEP0lLSE5bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJiYmNjZVpSWFZWXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUtEREpKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRURAREFISUE+SElGT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFRXV9hY2NjY2JcZGNiZGNmWFFWVVNcWFthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdJR0dKRkZGSUxKTkVESkpMTkpMSUtKSElHQkhIUU1LS09NS0tJSEhFRD9FQkhIQUBGRUNUXVleWF9YX1tdVVhYUF1dUUtKVl5YXltdVlphUlJfX2JiYGBiYmBjYmJkZGJYT1JSU1xTXF5dXl5fX2BkaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtJSUdESEtRT01MUExMS0tJSUNFQUVDSEZBQUZEQVZVRVxUXlNWYFhOVFVOWltNSktUYGFbX1hfXmJdT1liXGBgX2JjYl1iYldfX1RQT1FSWVNeXFxdXl9gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUURXX0lHR0hERk1KUFBGSUlKS05MTEtNS0pKR0VJTlFRTk9PTU5NTkhLQURBQ0RGREJBQ0RATEhCTExQT09NRk1GRkhJSEdMTE1PUElMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlFVVFxZWVteXmFhZWZjaGRrbHFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5NR0hZTUdISkhHTkxRUUlLSktLTk1VTk9LS0xHR0tPU1NPUE9OT09PSEtGYEVEX0xEZmNDTFtIXltzbU9NVm1ZTENQX1RsV2dKXVdVXkRNUVVMTVNWUVJUWFdUWFVUXFRQZlpoaGRZVGtUWFdVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entLSUVGRkhFRUtPVEpLR2BUR0pPSklPTVJRS01LTE9SVVJPT0pMTUdITVFbWU9QUE5PUFBKS1F/UUl8WVlyc1dQbUhxbm9hVlBxcXRPQmtzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl9WVVd/aXR1dV9hdl9ZYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoOEgn99foB2eHptdn50eH6AfH6AgYKEfICDen+Bf353d01JRUhNTUJETExHSkxGUlZMTE9ITFJYV1FOT09MUVROT1FQS0tOR01QU1taVFFST1BQUUtJWnhdVHhkaFlSU1B2Z3RscGJuZmtSck5Md21qcnBzcnFycG9wgF1menV4cXF6cX5yfWt1fWJSZ3xlc3Nvc3N8fXB+eW9/cl9gYGJiW2FgaGtua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUU9NTkpOV15ZVUxRU05ZWUxTU1JOTE9JUVJUWVdXUVRQUFFTTEhneGxjeHFtWktMVHlwdW11Ym52UGRlSWV2cW13b4BqZnh4aVhyUml7bWlqenp9bHh6f3Bnb1h1dWp2dXCAYXNofWlseHxvX19fY2JcX2RlZmlqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NydXl+gXN2em58fXl4cm5NSlJ0TkNCRVBQSUtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlNKS3JvdXVxdXFkaGFWbkxxcF5HaHlXdlRLaHh9eGB5e3NuYV5tb2RTZ3J1bm15cHdsdnN0cWxtXHN9emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlBLTE5LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUUlSbUhpd0tgZHZ1VVdsTm5se3Jhamd/dlVLV2tofWxtbHhgW3B6e19genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsaG1tcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUE1MU1NST1NSV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTlBVTEtLUlNSUlJPVlVRUU9SUlhYUU5QVVRYWFhbW1VTU1dbV1hXW09SVFdXWFFdWFZdVVNPWFJWV1dYWmBbZ3JeW1tbXV1fY1pfY2NlZmRjY2JaY2NnZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTVJRUExWVVRQVFVYVVpVUlpdVlVUV1VZWFBPTE5XVFBOVVNOUE5MUVBLSlFRS1FNSktPUVRSUVFTUklJTU5PUVJRUVFUVlJYV1xXU1NRUVVVVlRaUU5TUVdVVFlWVFlVU1JVU1RVWFlYXlpfYV1cW1pdXWBjXF1iY2RnZWRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGRmaFFKS0tOT0xNVFFPVFFRTVhXVVRWWFdXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUU5STkxTUE1OVVNOUU5NTlFTUFRRU1RUTkxOT1FUVFJSUVZXVVlaW1lTVVJUWFdXWVtTT1NUV1VUWVVWWVRSUldVVlhcWltgXVZZX11eXVxdYGFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRT1JYU1FRT01PU1VOV1FUVFVPTk5RVFVVVFRSVFhWWl1cWlZWUVJXWFZbXFZQU1VVVVZYVFdXVFJSWFZWW19bXmBfVl9dXmBcXGBgX19aYmJkaGhlZGJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9NUFNSVVpVU1BQTFBXVVFWUlNTWE1PUFFUWFVVVVNVWVhbXl1cW1ZST1VWVVtbVlFTVlVWWFRTWFpUU1FZV1ddX1tgX2BWYlxgYV1gYl9cYF1jYWNoaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOT1dTTlFRUFJUUkxRVFNZW1dVT1JOU1hVU1JUUlJaT1FTU1ZbVVZWVFZaWF1eXFxeVlNOVFZWW1tVUVNUVlhYUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGdeXGVgYWBhY2RfYl9ZWl9bXFtYWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dXGBcYFVcXWhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVpaWlNPU1FVVVVTTlVRUlpSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WVldeWlhRVVRYWFhTVllcVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl1eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBbVVVXVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVNPV1FTV1NXVVZbXVhbWVVaXlhfXllcWVJXUllYWV9ZWVNVVVpZWVVXWVxVVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGZkYl9kYV9hYGJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hSV1VTUlNYUlNWVFhYWF1eWF1bVV5fWF9fWFxWUVlVWVpaYVhcVVZXWlpaWFlaWldWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmFbZmJoZmNmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWldUXFVWV1lXVlxgYWFjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlRSVlZSVFVXW1tcX15aX1xWX19aXV5ZXlZTWVhZWl1hWV5WV1pbWltbW1laWFlfX2BgZGNkZWViZFpiZmNnZmVeYWJgY15jY2llZGdfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllVWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVlNWVFhdXV9gYF1hXVdgXlteXFteWFZYWFtaX19aXlhYXFxdXV5bWlxXWl9hXmBlZGRmZmZiWWNmZWhnZF5jYF9lY11maWRlaF9nXmNiY2FhYF9fW1hZW1laWlhaWFdbW1pbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXV1dWFdbW11dX19cWl1jWFlXXGBjZF9SWVlQV1ZXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXV5ZWFVXW1tgXlxfWVldXV5eYFxaWllbX2FfYmVkZWZnZ2JaZGZnaWdjX2NeYGZlWmlpY2ZpY2ZfYmJjYWBgX11dWlhbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFdaYmVjYVJcWU9YVllbWVlXWlpgXmFiY2BhY19cYl1fXVtfXllZVFhdXV9fXl9bWl5eYGJiXFxXW11gYmJjZWRnZmVnZF1lZmhpZmNhYlxjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1ZYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGFfY2JiXVxbWldYanFgXGBfXVxhY19dWFljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJeXFNcX2BjZGRmZWdmZWZlX2ZmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x7e3t7fHt6ent6enp6e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiodzcXJycnFvqcG+vr6+waKKjIyMjI2Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMiXJvb29vb2yy0MzMzMzQqo2QkJCQkot/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4ODhIOBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXl6enp3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8enp6enp5eX+DgoKCgoOAfHx9fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eHZ2dnp7eHt4d3Z2eHl4eXp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7e3t7enl5eXl5ent7e3t8fHt8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3d8e3t8eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3eX57eXt4fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d7fnt5e3d8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7e3l8eHx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5d3h6eXl5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2VmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCKkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiYOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjI+LioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGioyIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyIhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4ODgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoKCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYOEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgoGDg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4OEg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4GCg4ODgoKEhIODg4KChIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRk5KQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYKCgYGBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCCg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhoSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOCgYOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhYWEhIODgoKBgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgYGAgYGAf4CBgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBgIGBgICCgYKCgoGBgoKBgIKCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgYKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+Ni4eEhIODgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgoGCgoODg4SCg4ODgoCAgIKCgoKCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISEg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgYGCgYCAgICAgH+AgYCAhIOFhYSFhYWFhIWFg4SEhYODhIWEgoKCg4KChIKBgoaFg4WDg4SEhYaFhISFgn99fX1+goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICBgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4KDhIWFhoWGhoeNh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGBgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhIOBh5mMhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeGhoaFhIOEhYWGhIWFhoaHh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SDg4KFhoKAfn5+j4l/f39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoeHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODg4qGf4GAhYGAgIKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4WEj4KFg4KCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaDgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhIWRg4SDg4KCgoOBfn1+fn5+fn59fH59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIhIOEg4WEhIWFhoiHhoWDgoKEhYeGh4aGg4KCg4SCg4SEgoGCgYGBg4OEg4SRkpGOj46Lh4WGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFhoiLioaEhoSChoaBg5CEg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoODhIWDgoOBgoODhIWEiJKRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKBgICBf32AhoODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+f358fICDg4KDg4OBfn1+f4CAgYB+fX19fX59fHp6en+CgoF/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBfn19f4CBf39+gICAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB/fX9+fX5/g4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAgH9/fn5+fH5/fn+Af35/f4B/gYB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gX5+gIKEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKDgYGCf4GDhISBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p6eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/gH+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBgoODgoKCgoKBf359fX1+foB9fX19fX19fXx7enl5eXl5gIKCgoSDgIKDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgYGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaFhIKCgYGCgoODg4ODgoODgoKBgICAgYGBgYB/f39/gICAgH+AgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWFgICDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKAgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHiIeGh4Z/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGEhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX9+f4F/gIKBhYWFh4aHh4aHiIiGhoeHhoeHh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFgH18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImIiYeFhoWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhISFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9g4F/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OEhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn99fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fXuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjo2Ih4eFhYSEg4KCgYKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fH18fH2Af4CAfoB+foGTkYyMjI2PioWGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f35/i5CNi4yOjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgIGBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+jISBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSRjIyLjo2LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5/f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e317ent7e4CGhYKEg4J/gH5/goKCf3+Cgn+Ai4+MjIuMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fXx6en16foJ+gYOEgoGCgYWGhYWGhoeGgoSRjoyLioqHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYuJi4mFiJGNi4iJh4WFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gIGAfnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3t8e3x8e3p7e3p6ent+foKFiIeIiouLi4mMkI2MiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Dg4SHiYqIiY2PjIqIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iIJ/foKQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjYyJiYaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImMiYuHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBg4F+foCAfn6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iYmHiIWGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHV0gICCgoKDgoOFg4SDgoOEhISEhISBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIaChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+f35+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgX+Af35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChICDgoKCg4KEgoGBgICCgYCAgoGDgYGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgn9/gH+Bf4B/fHt7enx7fIGAf4F/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYWEhIKEg4GDgoCAgX5/gH6AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f319gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fXh+f398fHx+fX6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzd3ZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fX5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXh5cniFhYWFg4SDgoKDgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3yAfoCAf4GAgH99gH9+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhoWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f32Af35/f399fXyAgICBgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn59fXt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcnB4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f4B9fH59gICCgYB/gYF9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/f359fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+gIF/gH+AgoCAgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICBgICAfn2Af4B/gYKCf4KCf4CBfn+BgX+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+eoGTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx9fX5+fn18enx8e319e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgoCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCf4CAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx7fH17fX17eXl7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGEg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYGCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgH+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gYCAf4CAf4CBgX+AgICAgYCAgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9e3x8fHx9fn9/f39+fX1+gH+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGBgoOAf4KBhYODhIGBg4GCgoGBgICBgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgIB/gIGBgICAgICBgYCCg4KCgYKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5enx9fXx9e3x9fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCgoaDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGCgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGCg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYODg4SBgoSCg4KCgYKCg4GDhIOEhISFhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t8enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODhIODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/g4eDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCg4F+gICCgoOCg4ODhIKBgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYGBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCg4OBg4J/goODg4OCg4CChYODg4OEg4OEg4CChISFg4KCg4OCgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+BgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OCg4OFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIB/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWKiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISEfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WBfYF1gXqDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFgoGEg4B/fn5+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4KDf4ODfYF9fn59foKDgXx/gH1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4aDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfX9+fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhoWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdYJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFg4WFhYSChYWEhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWFhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhIOBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFg4SEhYSFhYSFhYOGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5+fHx9fnt8fH98e3t9f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWEhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGg4aGhYaFhYaGhYSEhYWChYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX59fH18f3x+fnx9gYB8fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIOEg4KEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4iGhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFh4WEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeHh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWEhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn9+fnx8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4mGhoiIh4eGh4iGhIeGhoeFhYeDhIWEh4aGh4WFhIOFhYeGh4aGhYaGhoWGhoSDhYWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWFhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SGhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYaCgoKEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH6AgoJ9fn9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGEhYSEhoaHiIeFhYiGiYeFg4SEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N+fn+Af3+Ag397gH19f4J9gIF+foF+fX59fX97f3x7enl6enl6enx5enp7e3t8ent7e3x9fn19gX19fHx9gH99fIaDhoaGhoWDhIKFgoWBgYB/f4CAfn+AgXx+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn59fX9+fn+Efnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x8e31+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58foN+fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXV1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1NXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX3N3d3d3d3d3d3d3d3d3a1tfX19fX19fW1tbW1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tHtzc3Nzc3Nzc3Nzc3NwlMC8vb29vb29vb29vb60ioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpZo0KSsrKysrKysrKysrJGSwqaqqqqqqqqqqqqqsm1NSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKaePS4wMDAwMDAwMDAwMCposqurq6urq6urq6urrp1YV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamro0s8Pj4+Pj4+Pj4+Pj45cbSvr6+vr6+vr6+vr7GhYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs/Ozs7Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHKycrKysrKysnJycnJyc3T09LS0tLS0tLS0tPT0c3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7Oz9HO0NTSz87Q1NLPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW2NfX19fX19jX1tfX19fW1dbV1tbW1tbW1tbX1tbY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7O0cGn08iUqNLQxpOr0s7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/Pz9Gdj8Ccq5uw0JmtmbPSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pz9O6r6u1lYecnsWThp2dzs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz8/Tn7Gbv77ImJnGvcmWmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/RwJyJmr3TlJafztGRmKDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P1KOigZvEsp/Cm9qto7+d1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0cSfgXuWrdCLk57Hy4iVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NWrr7zAz5TK26WZs9Dbopm11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyYd/haCbkaeZoK2QqJieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhxtPT1ZybpaakqKCvp6KpnNDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNLR0teoiMydkY661ZqRjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHSz8XU07nH1tPTuMjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tPU0tLV1NPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUUlBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raGd1WmZyd3N4ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcLGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vbq6tL+4tbezr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYlxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5hYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3KxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcLDu7mztLrBvb/GwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVxfYFlTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZVxaVUo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7OysrSyuL65s7WyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BPklCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCysi+wLi4trK0trK0r627uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u/v7m0tLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrK6ure3tbW8s6+0q7a6uMDEwbu1vL23sq2zsK+srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lo5ujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxsK6vsqemsKSvrrXBurW3sre2s7SrsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbGjpaieoJyVk5CPkZCYkJaVmJafmJuZm6OZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0VAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmkpa6lrKy0vLets7Gvsa61r6+ztaqnrayjm5mUjpGWl5mZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWm5eXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDk+QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yepKiurayrq6+qr6mel56lnZ6lpqShop+moKKvq6yttbK2pq+zq6mqtLGxsLitp6GcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSpsa+imZydnqGZm5uamJmblJablpicpKGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVUxSTEE3PUI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOfnaCgo6Cir6+sr7GstqiusbCoprGuraywp5+eoqCXkZSboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rLG0pKCdpZ+soaGioKCamJaWoJubmKShoJ6koZ+empyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tnpmona6ep56coZ2empqSmZ6coaKgoJ2ioJ+en6mrp6ypqrSsq6zKwKSrqKqsqqWgnpmSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnn5mmoJ+fp6ilpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7Cmn56dnZeYlZmem5yjn5+dpJ6bnZyloqSjoqqwrKao1LSlrK+uqaunn56eoaKdnp2anJyUk5WUnp2YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Svs66qrqOdq6e2sayir6Wgo6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rya2t1cnBoV1tRRVRIRElPSD5FQTRFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6SdlZubn5uenJ+lpqWgo8i0sq6npKSjoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLAxb65tLm6tLu3sLWyqrqxrru3vrq6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfXpya2Rob3hqZFpbRktMRURTTERCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKgn5KZn5mSmpifmY+JorGzqKCanZyfnpqXmJeSjI+Wl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM09DT08zKwsXGx8rHzr/I0czHxcbEwbvDwL6+vrW9s62/v8LCxsTHxK6+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6OsnZ+upqWxqsXGzM7Nv7DBqKWorK2qoZ2jn5ydmqmTmqCavqOSjpaMgouaqbCqo5+doJuYl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytLX0dfS1NXT08jMx83NydLMztPMxcfJysHFy8bIyMW+wrKzyMTLysrOxcq/vr+8wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3pydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOfpKOfoKSsm5anr8usjI2Ri5mvr6adnZ2hpaGem5WUlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU0s/Rw9DT1tjV1tLLyc7Ry8bN0cnS1dbZ1dfT1tjO0srP0czO0MzSz7/HxsrDzMzLzs/Fxse2wMq/0czLz8XJx7/Dw8jOzM/Qz83KyM64t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcLFsbaooqWmoaKrtaear8TGpYaGoK+snJWYoJyboaKfnJ2alYp3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czQztPX1tPV0M/S09HJ09HH0NjX2NHY0tfZ1dbMz8/JzdHLzs+/xcLHxc7N0dDRyMvMwMrLxdPOy87IxMnGxsjMytPT0dXP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+uqqqrnaauuKirt9fU1dnZ0c7QwLzMybe/r6erqaOksbWyo7fLu5uUqquhmJaYmpudoJ6ZnJ6TfnFlY2JfX2FfX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxtHUytDU1dbO0tDY2NjXy8jNw8jOzMrLv8m/x8jNzs/L0M3Oy87Ox8rP0MrOysLJxsnMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wbmthZG5wYVdcWklGRkRNV0U7QDwzMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp564trW1raWtrr60sMDY0tfa3NbPzcvE09DCwbGqra6rpbKxuKq7zq+jnpyWk5ecnp+fnZSXmJSJa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1crAycHFzMLIycLMw8XIysrOys3M0M3Ty8XIz8zIx8rExsDFysvNz9HG0M7NzczPxcfAt7i9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeHBxa21nYGBxaFhYaFZMRkxJUFBCO0Q+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHwrjL1dbZ2tvYzM3PyNbVxcO3sbWqo62suLmvv8qhl46NmJWQk5KRlpaWkIx8ZmJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS+xsm9wsfJzsTBx8DHzcfDy8rLz8fDw9DIxsHFx8S+wMfLy8vOwsrLyMfM0MTFx7vHw8jIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndudGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvr26zc3H0NXV2drb2NDKz9DS1MnEub2+r6e3qr24t8Osko6Ol4+Gg4SEgn6FhX90YFxeXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7IxsLDwMPHysnIysjBxczGyMvNycTCy8nBwsvQxMvIv7nBu8XHvb/Gz8vDv8O7ycbIu8jGxMrAvcHLxsXEvsW8vL/DxMvFxLzAycLFx9LEwMi/ysnGx8bQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWao6CblHt2c3RmaVphbm1aW1hRRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzLz9HMx8LDx83Pz8zV0NbZ2NnQzNPOz9DKw7fGwLW1u7C/triwkYyTmId6gIWGgHZ4dXJxX1pbXWBgYmRkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wMHBxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw768wc3Dxr6+tcG9w7q8xrvCubO8xcTBwra/tbW9v7rLw7y1usi6v73Lw8HFwsXIxsjG0MbCzMeyx8nDzs3BxcPAvbK3sLKnqKi5sKWtsKutrJR5dndqZGdgaG9jVl5ZSkVKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Oz9LJ0cbW1NbYzszQx8zIysS9ycGxtLm2ubSukY2Ki4V5gIaGgH6EfHR1ZFxcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i0t7Sys7S6tb2xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wMK8uL3GwcO7ta6ytrq+tMS3u7WruL29v72wuravtrqyxby2rru/tLa0xb2+w8XAw8XGyMvFwMbGu8jLv8/Kx8PGwsO2w729trm+x7+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzM7Iy8nLysvF0c7T0M/HycXJxMO/vM+8sre7uLa1m46HiYl7eX6Ghnd4gn10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+4uLWwq6ynnqKqp56rrLOtqauptK22sLKprqassry6tsO5urqxq7W5u7TCurC/sb28u7a8x7nCtq2qqLCxv7W3vK+wp7GztLu8q621pa62rrqxsKq4sK27rru4u7+/vbnCv8fDxcG8xsHIy7jFx8W/xsPDucTGwrvGyczLs7nCvLqyiHJ2dmtpYWJsaFlXV1tBTEtMSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbO0svDxsLF0MfOwsTHwMbGxMTLwsrLwsPAxr+5u7rJtrO6u7SzqpGJj5B8eX6Khnp7hYF3b15dXF1dX2BeX2RjYmNjYmBfXVtbWlpdWlpaWlxkbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwpKafqq21trG9ua+3r6iut7S0vLi0vK+4ubSxvMGxwK6lqKKrsbKzp7yqq6irrK20s6WoraGkrqmypaeoraWot6ywsre5uruxu72+vsS/tcHAx8i3v8DEt8TCv7u/xMK+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe6xLC2sJuZlZyYqqmwsbO1va/F0dDNxMi6uszCzMC8yri/xcC7y7nCxcS5u8K8uLa8xLe0t7mssJWDiY2BfH6Afnh0f3xzd2ZfXVxdXl9gXl9jY2FiYGBfXl1cWlhaW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnaSbmJKho6qjop+lpaelrJ+dm6SmrLKvtrensKynqrSqtLqxtrWttrmxr7q5sbekn6SfprGnq6i5qqSnqKinsq2gp6afm6SlrJ6fp6SfoLGtrayytLK0sLW8trvBwbK6vsPBsrm6wrPAvb+1uLu9vrzCx8TCw7+/xKCDd3BrYWZfa29gVVleSE5nT1RHRUpGPD1APTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usG7vbWgnpSdoaa6tquzs7uzxNDJy8PHubjJws3Aucu5vMe7tce6tcLFsbzEurWut766r7G0raGEh4eCfXp2dG9ta2pqcWleYF1cXFxeYF9hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlZqhlpuimJaNnqGippufn6Oloaeem6Kbn6qwrbG1oqmqqaurpLS5rbewrLK1rrK1rrCqn52eo6KypKapuK2ipqafqKyqmZ+gnpmdn6WamqOcm52vqaunqqusrbCyuK+4ubuwtru7uquysrmyvbS2sbG1tL+2vcC9w8G6u72Xg3pya19lXmRkWFRYXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bQyMnBx7y8xcTPv7vJurrBurTEt7PAwLLAwrurqLO4taavsKaKhoiAeXNucG5rYl5iZmZcXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtyjaidlJSUm5iboZaWkZyhoqidm52lpqGlnKCgmpitrq2usqCloq2rpqG0sLGxrKivsqe6s6a2oaKem6OhraOhqbWqoqOmnaWmo5aYnpeZmp2fmpednJycrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7KysrezrqmsrrK4sLq2ub2/t7KxlIV5dWVeZV5bWVZTWlVLW1FMSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lo5ilscK1tr2ttLjCzcjHwca4wsHIz7jCxr+1vLy2wrm1vb+0ub25qKSvua+lr6yZfYSFgHlwcnRxaGVkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFhYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn56pnJqaqqavsKubo6O3qqCfrqi2qaanrbCjt7Ckt5+im5iYqqahmqy4sKKhpJyioKCTlaGUlZabmJeWl5yVn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysa+wrq+mp6eyrrG0r7y0ureuo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64va6dp6ejqrvAvcC5rrS4ws3JxsPEvse5yc20w8TDsL6/uL/Aub6/uLi7taWlrrmkpp+iiIB9eXJqbXJ0cGhoZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSmp56cn6Wfqq+mn6KjtqigoaKotKGlp6SvpbCtrLWeoJ2VlKmhopSssbGeoqOdnZibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaWrpKWwp6Wjq6utpqiur66rqKqps6Wmq6+0sa68tbGvr6CSenZyZGFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqSnrbe7vMHFurG5tcXKy8HEx8fIt8fFtMTByK65usG7wb/AvLq2uLSkpa+zm5+Hl4iAd29kYmdpaWZnaWdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUV1ZTVFJVYGBfYGFfYGFjZGmBk5OIkI6UkpOclJWWo5mglpygpaGtpaSjoqOhm6qrpZmepbGpoKCdpauep6GerK2pqK6toqGilJejm5yQq6iwm5+in56XmZOKnpGNkpOVkJiYk5uhopykoKGVoKGkppujq6WipKqkq66lrbGppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZVUUZRT0haXE9SSVRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKyyrZ2np6+5ubPAyLq1wK/Gyc27wsvNyLfLv7PAxsuvtLzGusDFwry9tbizo6iurJqWhI2DfHVqampsaGpsbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl5fX2JkbY6PhJGGkJGOmZOUkpyaopyboKeoqqiqpqilo5ikrqSUmaWvqZ+bmZugnq+Zm6qzn6Wmn6OjoZSTm5aWkqiqrZqcn6GgmpSQjJmOi5CMkoyWlJCeoaCjnJuilZugoqCYoqijoqiroKuvpK23paOkoqytqqirrrK3sr21s6uvmINzc2hbWFhSVVJFWExRW1lNVU5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmor62bqaist7asvMq7tr+szMfGucLP0Mi1xr25vsXLtK+7w7vBw8K8v7G2raSorKmbk4OBd3hvbmlubm5waGdpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLfoyQipKNl5GXmaKgm5+qqaauqqevo6eZn6yglZakqKedl5CPmp6ulpenqpmfnJSloZ6SkJOSk5Wnq6WamZmdnZaNjIyUhoiNg5CLkpSQoJ6go5eVn5WaoKKdk5ulpaeoqKCxsKawvKefo6y0qq6nsLSwubXAsa2xq5B9cXJiVlRWTlJJR1ZRUlJMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurvCy9HMs7i6vsDExrWztryxubrCvL+vsauuq62omZ6Fa2dtbnJvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipiJlJSXm5mdqJqfqaWkqp2nmKClm5KPnqKal5aFhJKao4+TopyVlpWHopqak4uOi5CZpKiclZWXm5CSh5SOjIGLjYCQipKSkaGan6KVlJiYlaKlmYyYpKaopqGgtLKnsrehnaK3rKmtpLKyprW7taursaOIeHFsXU5QUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0tIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6OppaCppaSzqqKyw7W1srPHxri7xMrNx7Wvu7+3usOysa21oau0wbi5rKipsaysnJOje15gZ3NxdnFqbmllaGhqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRg46KlJGTnaCPmpuioaOYpJahm5WNh5iajHONgn2Nl5aFkJmQk46Oe5mOnIyCin+KmJ+inpCTmJaEjoKTfn50iY56kIaSkJCdmpmakJWQnY6io46JmqCho6OborSvrK+sn5mluKalsKGwrpywu6qpr6qZgXZyYlVNUk9QTUNTTkxRTUJQUUhJTlNNSEpKQ0pMRktKPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTExNzY0Nzg5Ojo2NTo4N0E3d7eio7Sopaaoo6alpqams6eltMG4r7SwysW4usHPxr+0rrzDrrDGsKymqpSirL22rq6dpaqqqJORnnBXV2BoZ2loaW5jamlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXi5OQn5edlZSWlI6WiX+TiV87V297i5SJgIuSjI+FhnOKhJaBeYJ6hZOdlIOWjpCPg4Z9knhyb4WNfomAkI2Pl5mYk4qPiZyHnpeHiJaemqGgl6evqa2op56XrbOipq2YrKuYp7Siqa2jkn1ybV9bTlNSVkxEVEpQTUxGTk9JRUxRTUtPSklNUEZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaeiqbCop7TBubC1sMjDuLS+z8C6sLC3xKmtyKymoZyFmaC4q6WmlKOioZ+UjJNnUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l7gnRQQkF/lZGRfYmUjISKjZqNlZWKkoiFlYZ4iH9gSlFueIqRhH2EjYmFf39ufn+Ud3V1d4SNmXBRjYiKh3x+eJN2aHeFiH6KiJWKjZCRlouEioiUhJqMgYSSm5aenJSko6ippaOem7CqoaSkkKWqlqGpnKKmqIh0bGVeW0hRUVJNSVVNU0lMS09JSEZLTkxNVEtRUU9GSEI8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivraq2vLa4t7PCvLeousm5tqiptrestb+qoZqRgo6Yr56gl4udlJaSj4iKY01MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYySgZKZi497ho+AdX94c251cHSNjYF5fYqqhXl6aHZ7jnBybXiBioySeHqAe4B2c3KSd2d1hISEhHqViYiKjIqAf4SLjH+Ug3uAj5iVnJWRn52pnp+gnaCppZ+dmIynpJOgn5aenqR/cWdgXFxKVk9SR0tYUk9KTU1SSkpKTVBITFFMUlRNRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Yo6GYnJ+0qa+ppa2ssLGqvbSyu7i2u7WyoLe7s6udnq2qq7SypJ2VkZeEkqKVm4qBlYeNiISFgWRLSUlIR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYF2eICJj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgX1/dGZ2fIVsb2hzfImMh4BseXF9cG11j3FocYB9jnBDioSCg4V+d3d6i4V9i3p1fo6Sj5iKkpqbo5aZnZqdnqKdlo2KpZuPnpeOlpiPdm1sZWJaV1dUUUpTVVRPUE5RVktOS05PSlFOSE5PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+flqCmr6yuq6ipsa+xq7y4rLu+ubOtqJuxp62ckJadp6umo5qckoeUfY2UkZN/eoh4g4B9fn9kSkZHRkFAQ0RJTExNUVJQUVNVVFRVVldXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4bnx5iJB5fIuFb22MkXhzeGpqgIJylpGLgX2WgEmSmG5oeH6BbGljbHmFkJKGa3NsfG5ye4ZobXB+c42IhIV6fX57dm90c4WCeYF3cHyOjIqTg5aXmJqQk5WWmZeel4yDiZ+RipKNhpCWfm1obW5uV1VXVFJRWU9SVVVTWFVNTkhOSk1OS0NITkdFQDo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepa2woqyqqLWvrqy0v6u8wr+mopqVpZiejoWMlqKjmZqTlo51kH2EipCOfHd9c3x3dHd7Zk5FR0RAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouJdoGIhnRsmpF0c3tqa52PTXmFkomEjmcxdoZzbH59g3RmZXR+hIOFgGZpbHVrcH98Z3Bwe26SjY57c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJSPl46AeYiXiIaJhoCQh3VpaW5nZFdRWldZWVtNUFVWWVlOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImZGalqSorp6yn6a6rquysMKxu8PHm5aPlZmLjYZ6hZGZlY+RjZKJc4iEd4qPjH92d3V3dm94c2lURklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfWxyg4GFgXqEhoZ5cqCVdHiAc3WUhzVxnaidjqGhhKKEdnCGfIZ8c4ytjYiAaGZiaW5ybXCDdWlvWHVvjpqSdmx/e3xtcW1wf3pzdm1idoR/hoCFkJGKi4qSi5GMi4+DdXiLj4B+g4F+j3lwb25qXlpcXVtZWGBfU05bWllYTEhKRUpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5Wltamtsa7BsrvBxpeQjJSQgYl9boKRkomEi4iQh3aDhW6Xiox/eXp7cXt0fGtvXkpQRz5ANzQ0ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH2Fg3+MfnaimXl+hoGEmYSbnGGGqp+dioKQjXp2iH6JiI1zipePg3tcZHF0ent3imxnaWF4b4WPgnpugXd0hHpwc3l3a25pXXeHfYd8iIePgIuTl4ONhY2HfXGEf4R8dXd7fYl1bnFyZWZfW1pdU1tmXldRVVhcVkdKS0RMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHiKgJSMkZ2dn6aRoKugsaivwLG6xbqWjpGUiHqFdmuAjJKDfouEkI55g4J0ooaNf3+CgXODgX1semxTV0xARTIxMTI2NzY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp8iYZ+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc2x8gYaHfY5oZ2d4fm6FhoKFcYSFR2uAd3F5dmhta192fYOIf4iFjHqVnpyKi4iRf3t1i3Z8d21vd35/cnFwalpcXFtjY1hnZVxVUFBXWVBETExGT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aYkpegnayhprivs72zl42Si5iLfXRwf4mTf32Mg5OVfYZ/h6WIiYGDiIZ5iIt/dYZ5X2NWS0I2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYmRgZqVgqGhl5WbmqWtk5q7sae7x8Ooi4yhpY6TiYGQe3KDnZ+RnH52hYWKj4eQaWhvg4B0jIaEi3GGgneHgHt2hX1udnVngJSPhomIh4iHoauilomOmH97gol6em9na3h9eHxxaWNdWlldaVxgZl9aT0xOWFJRSVBLRE5HQ0tEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O251cGd4g3uAjICBkI+LmpqknKGspquvsJeRkYShlIR4d4CMlH1/koaTln+KgJKbjoSBgoyLgoqOhICKgGxwal1DQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafIyhnpiEkoWCj6Gfk5iShIqFj5iRlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhloaTio+PlqW1qZuNlaKDh5OEfn9ramt8fn6AcV9cYl5ZZmpca2teWEtIT1NRTk1MRklQRERORkJDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcINwdYdxdpGGfpeWmpSfn5ynoKqWk5ieZ2Wkmn6Fk5F5gJGJkZJ9ioWZkpGDgICLjYmGkYeEiIV4eH9nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWcn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpqZp5GRiJWimpp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNze316b2ZeW19eYGZjYGdmXFJFS0tQT0lKTEZGTUNHTUZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHF1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNi46Ne4qGj5COgoOAiYyKhZOFg4aIgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUZHQUFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKynqLSssbeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2qo4uWmIWmpqCil4KmmY2iqqikh4WTo6CgqqCkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlqomaipOKlXp7foN8ZV9mW2RgXWJjXmZmX1tPREpIVE9GSExGS0dFRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1hqcFh6hXaBlIWIgpuDkpCNk9rInZZzVpeIj4icj3yGjI+KinqIgoeRjoOFgIuFhYiShoKEiYaHh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSVFVVV1VNW1BHR0Q8Pj5GSENEQDc7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLByMSrs8W2rLPAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbCxm5mSmp+Ip6+qpJR2n6SXoauxs5iWqa2orrW7srqsr7Wisayxtby3ta61oKeno6ibqbCtsrq4uKect6mNpY+Sk6CGeYGBc1dgYlRlYGBiX19lX1tUSURFTFZRSUpKREpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRYmRXenVxgZR9hIaTdoZ+gIx7v7ujvIK0lJOOm4+EiI+TiYl5h4CMk4yHhYGOf4GJj4Z/hYiFioeRenluXVZARU48Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxXT19VSUtKQUA/R0tGRUM7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczKtrvEvbO0wbe4wrW/sLd0sbSmusWksMa5sbOxtKiktbaqsaCilpuikaWxraWtq6ekmKCss7qiqLK5tbu+zL/Fxb29s8K3uri/t7q3ua2tsaaxqq2+sL27wsKsmbuola2PmJiqiX6AemlWYV9XaWNpZFVbY1lWVElIR0xRR0RJSkFIRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFlWWndqcH+PhIGOhW56cniHYrihmqOJlZSWk5STjZCXkoeHe4eBjZWKgISBinp8i4eGfYqCgYuElX14enVlT1xkR0VMOlFkYVteU0Y+O0hQRFpkUVFZWFpnWlRgYU1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tNU1pUXpSvuLW6ucnAu73KzLu9wLu4tby8t761urLGYHWypbGanqu+qqWoq6qkorK1oKuonpWWnpifrqWnpqWfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrDwL69v7u8t7Swube3w7rGvsPJsJ66qqKsj6WotomAfW9dYF9cVWBdaGVSWGFWUlZJRUZNS0A+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbWxxkI2FkHNsc3JziNXAtZmgjZWZmpGOl5GWlo6Gh32Hg42Wi3+Df4N4e4uEh3uLeYGKgpd/dH16bGVwdlldXFBlZWJgZWRdW1hXXE1kbVVSbW5fb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZdWlyTucC5vbfGwLu5ysu7t7q2uLmzuLW1rra2mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUj5aYl6ifpZ+empmDpJ2spKqwrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/Jz7Sku7G1sJusub2afXdpW15aWFtfWGFiUVtgU1FLQ0JFRkU8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIyJfIGDc3uKg4V7inSCioaVf3N7eWxtdXxpc2VpbGlmamlpYGZpaG1abXSXraS8h4dnW29oXVpZVEhKTlBKS1FMVFFITEFKR0tQX19iZ2pil7fHsLmzu762scTHtrC5sbC7rLOxp6u3rI22p56cp5pOmp6NjqCWkaeYpZWKk5OIkYmPkZGdm6GYm5WWh56Zppqsr6ivp7Oz09TU1tHLz9PUztPPzMbDytC/ysnLydLIzc3D0dK4r8S8xLqmt7vEon9sYVpbXFdfV1hkWU9cV05RQ0JJRUNJO0FEPkFIPz9CODtEPkBJPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkJmDaHFveXmDoKqeppeNm5uYi42VkZqOfYmMhY6KiouQiHyEgnB/h4GGe4dyg5GLj35xeXVscHh/cntueHNsaYBwbWNpbXB5aXd9fsu/wt+nbWN4b2RbYWBKUFJVTlleUF1dTlBOVFFVVFxubneDcpauuKy0qLC2q629wbGrtaaluaesrqGstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEioOTlZiXlJuRm5iZmZ6eq6ykp6GsrM7S1dHNzNLT09DU0c7Iw9TRyM7S09PWzdLRxdLWxsHPyMjDqb+40Jx3bGNbYFtVXlFcWk9PVFBOSD5BR0JDRjxBQj9GRT5APzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd213cH1+gKGenqGLjZmTk4yMk5CWhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAcHdzbHN8fHd8c4J4cWuAcnJpb3F6eXN7vsuafoyxg3ZyhXdoYWpdQ1paW1dmZFhla1RYXV1gY15jeHt/i4GZqqSkoqChqKeqsbmrprSjoq6ipK6ip7GfiaablZORipKPiIKUiWuVoo2ZhIGGfpGDg5OXrYuVjZWZjoWSkJ2Xp7CioKCkpKjHzc/HwcvQ09HU0s7TzcbW08zU2NbW2NXX1cnU2s3K2NbRyq3Ew8yJcG1gXl1WUldRW09KR0pJSkA7OjtFQ0Q8Q0Q+SEM/Q0I7Ozk8OUdDNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCiYGdlZ6UhYuWiY6KiI6Ij4B4g5SZi42IiIuJfoN4c3t9g4d3gHuHkZeBhG94cG11f3Z4fXSGfHlsh3Z1bn12hHV5e521jDxBisalfo18amVXSUNlY2ZjaGpkb3lbX2Zoa25pboCEiJGMnp+gnpGXmJ+kpKaypKWzoKKlnqGpoKKxnIefkpKTkYuOi4aDj4R+nJyMjYKEhXqUfoKqlaOMkoqYkot9l4qakauzmJqbp5ynvcPFubbFzdHQ0c/L0svJ1M7R1drX19jU2djN2NvOydra0ta/zM20dXRsYltYUVNQWFVFRkpJRUU9Ojc6QEFCOkdFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXFzho18l5Gdi36HkoKJhoWKg4h9eYWXl4mPg4eGh3qEeXF6e4SGdXqGjo2deoxwfW9wen9ye4BxhIeAbo56dXd9fIJ1f3yHibB0WarCt42SgXBuYz1eaHJwcXBueHeCZWlvcnV4cnuLh46TkpuWoJaIjJOboJufqp+hrJyimpqfpp+frJmMmoyRko6FfYiHg4WLjqCZk4iDh35tmXmEmYaIk4yOlYyGe5uIk4+uqpSVl56Ypq61vKitvcbLyMnLy8/Jw9LK1NbY19jX1NvX09nb1s/b2tHWyNXMk3Z4ZmVZWE5RUlxHQkVJST5BPj04Oj0/Oz5IPUBCQUFEQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfH2EmI6Hi36Gh4B3gnlue3uGgnR6kp6NoXaPdoN0dYF9dICEb4KQgm+ShHV8gYV6dod8ibjGpcPKuIKWnI94cGVOZWOCeoF3hqKQi3l5d3uDf3yEdm2UlpSVj5iRg4mPl5qXl6acmKCXn5OSl6OdmauWkZGLjpKDjIWJiIGGkJGenJmJhYuBhZd7iImfl5CJjYqLgnyhiJCLvKGYk5eZnKilpa2ep7W+wL+4x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7cxoV4dmRmYl1SVlVUTEtETUQ7PT08OTo8Pjk+QTc+P0A9QD48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXt+gpGKhYZ6hYh7dX11bX19hn50f5KdkZ+DknyGfXiPfnmLim+Dm4B0mYZ9goqFfH6Re5CpjpDDoL2Mm6ScfoqEfYlyjIt/c6aanJmUhXuPkYmEaUdxoaSdjIuQkoWIi5GTlY+dm5OUkZeNjJWfnZShlJKOjpCMfpCPjouEiJKWmp+fiYyUkZ2Qgox/ppmIhY6DhYSApIaKi7iYnZGUlqGmoJ2dnaOutrq0q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27d3dnVoZ2NUXllST05IQ0xDPT0+OTk7Ojk5PD02QD4+PT05Ojo7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5PzxEUlNSWF5VWGZtbW1pgY6KcXN4int7f32AfIh7fXuLh4N+dYOGenN6dG2BfoR9d4aboZuelJKAjId/mIeAnJJuiKmFeqCLfJGOg4mEnH6akYmNo6KfkKSvoIuRi4aLgZKGV3Kti5+snI+DmJyQkI5bg6KRgo2fk5WMhoiMkpOMlJWVkIyPioiWm52PlZaRi5OUhoCLiZKNioqdl5mjooaTnZWgioqIjpyQg4iPgIOHhaSFi5CzmJySlJehoZ6Zkpudp7G4rKS8wcfNx8bPzM/Mz9fP0dSu1tXY2tja2tfW2dmdbXpyZGRaWlZRVVZDQElEPz8+OjQ5Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnhsYn6Sg29td4t4en97gX2GfHt2hoWAc3CFgnt1d3Z0hIOFfX+SpqKfpqKXip2QlJeKiqeXcoqyjYSnkoSZlIWajKOWoJiTiZueopOpsKCRlZCOjoiVi26Nt4SaxMiynKKlm52YlpGxkGSkzciVjoaHiZCSjo2TlIqFioqGlpqbj5CUk4eVmIR/j4uZiI6QqpeXpKKImZ6VmomPhpeYioWPjYF/ho+liI2TqJqXk5eZoZifmZOcmqKytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgHB8ZWBbXFxNSVNYQUJHRDtBPjgzNzs8Ojg9NjQ6Ojw6NzI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBj318bX6IeHp+e4KCg392doCDfG1ui396fHh4fISHin6Lo7Ono6qzopenn6WklpWuooORuJWRs5qMoaGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJmXocCOo8m5q5ujpq2Zkpudsp2FhaiinJiFiYmOlY2Lk4+IgYaHiZOYlYyLlJOGlZiGhJGQnHWRmLKWlqShh52ako+KkIqXm4mLlo6HfYyYnomQkJyamZOYl5+ToJ2Unpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0dbY09DYunB3c1peU15UT0hJTUVCQ0Q1Pjo3Nzo/PDw3PTQzNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6em6Fhnp8hHmBhoF+cHh8fn1vco16foJ8eIaLiYaEkqe7rKiyva+lrbOzqKOhsKyKmrWdorilla2kl6mtuKelo5+aqZepo66wqpqZnJSVkZefl5q7u67KoWq2uKuwlJmfo6yTl72jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJKWjJCVjYuNlpiTnZm0l5WrnYqclJKOkZKMmZuKkp6Qi4mVn6GNlI2Ymp2SnJielKGglJydpa+ooaWzuKvCyMS1ur27xcfHwtGgxsnNzcXX1tHL06BueGZaWFFcUE5FQz48Q0FCOD84ODU/Rz08NjwzNTM0NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKP4uKfoFzhod9gol1g4qCf218fX1/cHeHd46Ch3uNj4yGjJmqwsCvvca7s7TAvLStq7O2jKizra29q5u7pKitubirp6aioqSiqa+ysaudnKSYm5iXnqKmpZKkuq+pwLytrbK5paSofoiGnK28sIOMjIuQg46DkY96gYeQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaXjpGgkYmUm6SslJaPlJydk6Gdm5ifoZSanqempKKksLOnwcbDr7C6tsXEwr/NpsfEx8O81tHNxMqGcnBfWVddWUxKQUtARkc+QT9COzo1PkE9PTU8Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0Q/Q0ZcZUdgaWdaXVyTjIuIe4eMh4OMdYaRioFvfnuBf3F+gXuVepKUlJiQk5Wns8bJv8LMwsO5x7y7r6u5u5izt7qywK6lwaSrsLy9q66ro6Oep6uutLCqnKCqnKGblp+wtaeLo7q6tsG8rKmcsqWkqJSFjqnEw6SCi4+HiISGlZSNeoONkY+RooyMlJKOiZefmJOZlZimoK6djKqcjpaPkpGVlY2QlZGPoZSGl5+gsp6UmpSfoJikn5qgm6CUmJ6lo6ampK+upcDEw66ot7XJwr62z7LEv8S8s9HKyMK0cnZqWVZZaFBMSEJMS0tKQUE9Q0Q8NUFEOzszPThCMzMyMjYyQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVlOZVxmVGNqmY2XioyIk5CGiXmHlJCBcoB8jX94h4KCkHqOoZaompqYur3HyMnB0snKws29wrOtvL6our+9u8O3rMKprLO8vqqwqqSlpKyus622taCfr5+lopijs72pm6i9waS2t7Csk7GtrK2Xh5qpp6WRgoyTpZWJgXaKkXmFjZKQnp+Tj5SMj42Uo5mWnJSUo56qn5GlmoyPj4+Vloh8j5WSkqKalZ+hnLWlkJ6XpaOipZ6dppielpebpKOpp6KyrKi8wMSvpbK3zL+5r8Szu77BuKzCw8LAl2p3YFZVWllJSkxJRkRESENCQURMOjRESDk7NDw3RS4xMjM1MkIyNVNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iqCThHiFf5V/f5CIipCAlqGZrqakmMK9x8PHxdPNzs3LvMK3sLm8tL3LvMPBtre8rbO/uryur6igqai2ra6psrebnq2ip6Geq7e4qqWvv8Wxvbm0qKq1tK6vl5alrKigkY6SssWnlY59kpV9h5GZkKqZmJOTj5KWk6Wekp2ZlKGjopyYn5iLjI+PnohakJaXkpekmWWYo5+zpZahlqysqaebnqaXmJaXlaCkqKWftququrvDtKWztcvAuKq2rLK7ua6ouLq9uIFpbFhVU1NNREpSTUs/QUhFREhISDk1RU07Pjg9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJwRWlJUmViTEallJuXopeplo2Qg4emk4iCh4Kcg4OVkJCUj5qin6++r6HGvMTExsbOzs7Syr67trG6u7u+z7XDvbi5t7KxtbO4s6umnKusuaqpqK+vmKOvpKekpbXAsKystL7DusC6tKi5tbmzr5alra6upIuTlaGNdMGafZeZhI6WmoyxlZualZKSmpqlo5Sgm5eaqZycoaCZio2QlpxgSpacmpWapZZVl7Cfr5yepJSvrqulmqCllJOYmI2coKeimbSpqrO7u7uqsLLHv7mmq6utsrKjobKytKRua2NaWE1PSkRPT1BRO0hLSUdJQ0M+OktUP0E6PUVNMDc1NDQ6QjQ0TVdPPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRmIeLqJaOiJOFn4eEnZeOnaGbo6S1yLWpxrnCw8fKycjMzca+urOuubnBwcy1x7rBubW6sK+vs7WnpJuqtLWqqaatrJqkrqWkqKy6v6istre+wr++ubSzxLK5vayjr7WsuaaIm5emm3a/n4SZnY6TmZqLrpehnJyXlJqgoaiep5+ZmqqZoaeemJCNkZ2DbnaSo5qVnaKdkK6yoqqUqKqXqq2jo5+kqJGRmZuHlJyinpaxp6mruba9s7Kuvrm3oKOnqKWmnJutqamLYGNeXlBJS0ZHTUlWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc3P0I3NVRXTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh/ZV5IRauVm6Gfu6+ZlJ+Mk6ubkZKTiauNhqKfjKStlKOjtsa+tMC6wsLHyMXCzcjBvrmyr7i0wcLKtcWywby1uqqpra2wo6OYqrS7pqmmq6qdqa+no6qrvryorb20uL7HvLe2uMGyvsG0qbW3q76lj6KXkqKfvJ+JmqCZl56ej7efqZylopucoZqopLOhm52mnKipnpmVj5Sbi5eJjKShlJ2inaC1r6Wkk6+rmauqnZ2jo6iQlJSfgo+enpuVqaShobO0urWtqLWys56coqWal5SZqqGedV5aXVxJR0VGTFBITUVHR0NTTEpCRUdBVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWZcRkNDnHBiR0Wnl6SfnsOtm5elmJqpnJabm4+qlpWnppWtrJmiq7bEwry+t8HCwMfDv83Gu725srC4s7/DyLW/sLy3ubelpKusraGhmqqqxaKkqaumnqyvq6KpqL+4p62+sbi2x7a1ubjAsr/Ct7WztK++o5ejlpSblK6gkKGjpaOjn5C9pKmeqKudnaCbpZ+9opmjn6Kpq6Gdlo2VnpOeh4+EjZOfpKCetaylm5Wxp5mvpp2ZqpyfjZiUnoSNoJqbkqWkmpirsbWxqqWqraycmKCgko6QlaielGZgWF9cTkhHSk1LSEVESUE+UUlBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVpLQ05SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTQ2QDk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTptUkY8S3hlYVZLopqjnJ7FrKGfrJ6erqCSo5+WpZ+mqqyXtrGjqrO2xMS9v7W/wrvIwr7Kx7W4tbSws7S3wcW2vrG4tbi0n6asqqydnZ6lpMGkn6qtoKSpra+ipqi9taWxvbm2tsSytLi6v7PEwbi4rrO1taOdpZWRlKGuoJminqioq6Oawqypnqytm5udmaagvaGdpJirq6ymopmNmp+Sn4mOV3+Wn6WhoLiqppOYtaOfsaCemq6WnY2Yk52Bjp+XlY6io5aQpq6yq6mhoaWllZWdmIuPkZKknolfYlhiX0tISkpORUVBR0s+PUpCOTlKSk5dUVFJPUxWXDlGST1ETUk4SGJbTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTp6foZmew6ilorSinbKnk6uloKOframsnbuwqKy2scjFwcKywsO9xsO8xMm8r7C2rbC0r77EtLmxsLm0rJmosKmqmp2loajBrJussJyqo66xqaSovbant7u+r7fErbSzw8Czx7S7t6uztq2qoqaWlZSkrKKfn5qoq7Cvr7uypqCpqJmZl5OipLigoaOTr6+spaefkqGelZ6PkI2VnpqinqezpqaMmLObo66ZnZuskJ6TlZOZf5GhlY+Nn6GTi6asr6WmoZygnpKSmpOFi5GNnJ1/X2RaZmRKSUtKUkJDQElIOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU5jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo6CcoMOppKqzoaS0qpazrKeipLKsrqm7sa2wtbTGwMTDtcDEvcnEtb/IwbSrtaiwuKy/w7O3rqy2uaWYqrKrqpifppetu7Sbp7CbraCutLKnq7mzqLq0uLK5wKq3ssS+tcaov6+ttrWpp6yhl5eRpqWiopiYpa+4rrK1tqCfqKSalZWTpKC3oqSllq+xsqeqpqKempqblpeon6CYoZ6usqKmjJeumKSql5mepJGajJOXmYWVnpSMj5ydk4uoqaqhp6CYnpWMjpmPgYWViJSed2JnXGppTU9NTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKOdoqa/p6ivsKGptaudurGro6q0trGwubewt7i4xL3Dx728xMHGwLjAxcC5qbakrLutwMK3t6mssbqhlK2xrbKWpaeRqrmpn6awnaugsLSzqqm2tq28rbOzubesubDDu76/psOrsLeuqaurp56YmauhoqGRl6Gxr7OssLmanKmgmZaSl6ahtqmlo6KwsbSss6isn5ugoJudpZyil52js7Can4+TpZqfqJqTop6Ul4iTlpKVlpyTiJCamZSOqKimn6Obl5uTho6Yi32MloWNmWlna2BsbVdQUVpVQUJFVEA7O0hBNzpYUGReUFZXRVlfXU1MUk5eS0o+WmNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaifnaKqvaKrsKujsbiqpba0rKCttb2us7i7ur22tsDCv8jEucTCwMC4xL3Bt6+1p6u3sby+vrSorrG2nparraiul6aojqe7n6Sss56sorGws6yqtrS1vq6wsbWssLSywbvFt6u9r7G4rK2qo7GmnqWqn6SYkJmfs6qzq6qzmp2nm5qVjqCmpbSup6Gtra6xp7StsqqknJ+oo56VoZmbqLWplpmRkZ2ZnZ+dj6uelpeElJaKnZick4mNlpeal6aloqCdlZWXk3+PlIV7jpKCi5Vka3Fnb3FeRllmVkRCTVhEWjlIQjY+XFFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqGkrLalraqmr663qq+1u6emsbfFt7G3vcHCtbS6xL7MxrnCwLm+ucO3wLmxtKypura6ub60qa2wtZiYp6uqrJurq4+rvp6srrKjq5+wrbOurrayubiqrq6xqLWvtLy9yrOqtrWxtK+up6GzoJuoraCmlpaamrKiraClr5ehpJqako6jpqizqaGms6yqtqWvsbWvpJmdraeamJ+amau3opeTkY6XnKGXlpSrnpqSf5KXjJ2cmZaQiZSSnpmloqGgmJaRk5V5io+Fe4yKgomRam13bXV7YEVga1lJSFpaPXtKRkQ2QWJUaVtNXGFKW11aUlJSYmFMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLitCL0pHUFtIM2NZVUtEmZehsaixqq2mpK+utqm3tbqkrLS3ybu0urq/v7Szt8PAzMi8w7y2vb+/t768sbytprq5t7bCtqqssLeUlqeuq6ijsKqUr7ukrbGzp6ijsrSxsrG1sbizqa6rsqe3r7a0xMa2qba2rLCtqaejtqCgp7GhpJScmZWxnqecoKqOqaKem5aYpqaluKejsrWsqLKnrrG2rKWZoKyom5yenJSpuJyUjo6KmJuil4+YpaCclIKQlI+cm5eWlYiWkJiap5yjoJKWkZCVdYSQh3uEgYOLimxvdnR7flxLZW1cSk5jXD9ie0dJOEdnV2VcTF5iTVhZV1RXVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi09RUxRPDNya0lDQ5CZpa6lra+rqKWxs7Srt7K3oKu1ucm5rsC7wrizsbXCw87FwMG9tL2/v7q+vLLEp6m5r7a2v7yuqrKxm6Cnsa2mpa+lnbK1rKuxsq2qqbS7rLWzta20rKqrqKypua2yscjAuKW6sKmsrKWorrCmpaOvpKmcnZybr5qjo6Kjkayeo6CfoqqmprmkrLW2pausqK2vtq6jnqOpqpugmpqSpLOZjomNh5ChoJSMlJyfkpGDjZKSnJqXlZOHl5KVmaebn56MkpGNkHZ9joV8e3uGiYhwcnF9fHxcU2RuXk5ZZlxGRJZbRztObVhiW0xgYk5WVlVXVFlnXVFSTGNaWlRLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEorOkg/M0JIUyw+kGs7R0iPnKqroqqxpKmls7SxtbWysqKrrr3Muq7AusextK20wsPRxca+wLK+wcK7vre7xKest6uyt7u/r6uxrJ+jp62qqKSwpKqyqq+ssK+wrquzvKe3sbKps6mrpaWjrbqsqrLDuratu6mpp6ypqLKlqaSjrqqoop6co62VpZ6YnpmsnaKnqaKtpqStq7iysqGpoqCsr7GsnqCnqKmZpJmZj6Cml4aEjoqLnp+OioyVm46NhIaPlJ+clJeUhpaUk5ekm5ycipKQjYl+foeFfHd+hYSFcnFwiHVrX1pgbmJRc3FcSzuEfEU/V3RYYVpOY1tOVlZVV1FcYl9TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJVaPkxFlZitqKKrs5yqqrC2rbm2r6umq6q9ybuwvbfCr7Gss8TDzs/Dvr+0wMLDur+zyMOrrretsri+vrKsraukp6qwqaeosaW0rqqwrq2ysbSstLykt7OsrK6nq5+jnrC3q6qtu7elt7akqaerq6qtoamnprGypKeloaGsl6qhlZugpp6koqukraOfp7G4rq6jpqKbqquuqZ2ipaSkmaCalo+YnJKBgo+IhZyfi4qOi5iNj4qCi5ejm5GQmouTkpGTo5mbmoqOi4t8hoGBg3p0f4KAfHJ1i6SHeGpeYG5mV2WHY04/Z5NMRWJ5V2JZUmVUTVZVVVRPXF1hVUtNaFZVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qis6Sk9eNESGPkhGRJeSsKWjq7GYq6qttqy2sqymrKqpvMDAuLizu7Wmsq/EycvRv8C7ub++wbjBucDErbG1sbO6v72ysK2sqquntqqmra+qubCosbKusq23qre3p7S3q6ykqaqco56zs6iopLS1oLeuoKqoqqirp6CrrKm5tqmqqamiqqCtnJKqoZ2gpKKmo6qenae0r6imqqKjmKWnp6qco6SjoJqYoJGOj5iNfoeMh4OdnYaDioqNjY+LgoWUopqNjJmQkZGPk5+WmJaMi4N/dIeBfn94dIJ+eXZ+gIedj29xZ2dwd1xhc4hrT16ZVkhteFVkVlFjT01VVFRQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDuWjrGhpquumqylrbC0tbCsprCqqbq+u8CwrrmuobevyMfI0cC+vbu8wr26w8C+v66ysrG1vLrBsbGyq7OopLWopa2zs7mxo663srCyu6u6r6qutqyqnqqsn6Ogtq2ooZ+ws6K1qp6op6mjqqGirK2ova+srqyiqKifrJmQsKGYoqCnp56nm5mqsaqjoK2ioZSjo6OnmJqppZiYmJ6OioeUh32MhoSDo5aEgYCLho2LkIODk6CWiJCckJOQjZGclJePioWGeHSBf3x1eHl/enNzeWd/hqR1aV5kaoB0Z4iMfVNYcF5Kd3NTZFRRXk1NUlpmTkxWWWRYRlNpUlE/Q05RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUE0kI+yoaSmrKSnpK2ntbOxq6Wwp6q4vsC8r6e5qqavsMnHyNHCvL++ub6/vMm6wLiwr7Sxuru3wLKzuqy4rKK0p6essra5s6iovbautr6wvaetrLWsrZypr6Sgpa2rp5yeq7OltKiaqqepo6mepKmoqb2stK+tnaqkoK6cm7OjlaScpaWfpJuaqaumn5uqopuTnKGlnpiXqamSmJqUkIqCj4V+joKAh52PhX59i4eQjY+Ef5Oak4WSoYyUkYuRm5KVh4l+f3J7en58aHh8enRvcHtnhHiEiGRhZ2FxhHptZ3hdXVVAVnpsVGJQUVhLTE5ydV1IWltnWUVVZlBEPkpORENBOUhHS1M/amJKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNBSjdHU2BVKj05RFc+Ko+UspqgoKmmpaGrpbizs6aqsaetuMG9ta+iuK2oqLDCycnMwba9wLW3v7nItcK1s7K1sry3ub21rbm1v62gs6erq7C1uLWsn769qrPBtLyhr7O1qqufrbCjnKWoqqOem6Wxp7Cgn6upp6GpnKSooa27qK6wraCro6Svnp+tppefm6GjnJ+cmqSqo5ubpaSWl5Wfopabl6asjJ6RkZGLgoqAgI6Ae5mTjYh7fouGj42LioOSmJGGk6KJkpKHkJqPk4CIfHlsfnZ5eGN7enFvb3F2Z4BzaoNnZGdfbHKNbGFpb2BvPlp4a1VeT1BRSklNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTNTPWVfREw2S1ZkTyo7Mk5YPSOTma2aoJinpKOfqKS4sK+jr7Cqq7jBubOtn7ivq6i0usjLyL+2wr6wtL23xLbDsa65srO/tLq9t6i5t72qo7Soqaqxrrqxqpy8vaWwwbW2oq+3taanp7GzoJ6kpaehpZmfrKipnqCqrqagppijqaCxuZ+jsK+hrKGtpJympqmampufpJWcnZqeqaaXnKCpk5mUmJ6TmZahqpGaiI6Phn2HfoKNfXygjIyIeIKLhImLi4WHk5qPiJWeiJGVgoyXjJF9hXtzcH1xdHRgeXhobnBwbmh9cWN7bWllYl5khX5fWnJqcUtKfmhYWk5QTEpIUFJQSU9cX25TRFhaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPi9YVjUol56nmp2WrKCgoaSiuKuypbS0qqm5w7WzrZ+3ra6tsLXGyMG3vsG5sbS8tr+7vq+qvbCzvrC8wrmou7q3pqe1qKirsa2zsaibvremrby3sp+xuLCopaevsZuhpKCkpKCXm6+noZ+jqK+hn6KUpKSit7ChprCrn6yjr5icqqSonpeanqWTm52anaarmp2dppeWmJSdjpOXoqiikIiLj4V6hH6EinqOlomNhniBh4OHi42FjZOYjY6WmIqPl36Gl4uPeYF6cHJ3b290X3l3ZGtsa2hngm1lcmtrZWhZYXN/XlprdWlZR3xdW1hPTkpISFJVRjI6Xl5sUERYVlllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdCZ1tIVENUXWhFLjsxXlMsMpajopiVnamepqGjobiqsKG7uaasvcSzsK6ita+tra+0xMS9s766t7Gzubi6uLqurb+ztLivv8G3rL26tKWis6uoqrOsrrKjncK2pqm3t6ufsruppqWor6uZo6ecpaaUmKGzppmepampm6GglKWfpLmopKetpp6loaiTn6mhoaGZm52hkpudl6Ciq5ybmqKWk5WWm46Tk6OnpI+Iio6GeYR8hYZ9nIyJioZ4gIOHiIeRhZWTkoyQlZONjpR7gpeOi3d+e2x1cm1sc2J5dWhnaWdlbYRnZ2hkZmhpXmZiaWZaZXpiYFFzVFtbU0tJR0lPU0AhK2leakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3N2FNJzKepKSSjqWmnJ6enqS1raiqurenrMPAt6+sobWup66vt8HAvbHBt7Cvsra1uLe1rKq8tK+ysL3At668vLGkn7aspqa1qauvoaDErKqnsbSrrLS6nqipq7GlmJ2qnqilkpqmrqOYnaSqoZuinZegnae2pq+praGhnp2hlaCmn6KgmZuanJKanpWmnq2imJeflpSOlZiMj5iap6CQh4qKiHiFd4KCgpyHioKJe36EiIaEkISWlY+PkJGQkY2Se4OVjoZzf31neXBramxndXNrYmdkYnR/YWRlZmVpaWJnb1leWF1sY2BNZ1daYFZJR0hLTFJYPjlgbGlHQlVTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BjRiU1nKSgkYyuoJqYoJeltLKjsr63obHFu7mwsaO2rKuuqbm+vLutwLKvr662r7O5sqerubGvrrO2u7awub6spZ61q6ChsaWrr5+lxaGzpa+ysLettZ6srqyuopmdp6qln5Wcp6agmaSjqZyaoJyVnJ6tsKa5p66ioZqanpieo5qlnZaemJuUmqGSqJatqZuUnZyTjJWZjpSUmKenjY2KiY57gXSCgoqYhYd8iYiEhIqMiJKFk5ySko+QkZaOkH+BjY2Db4F/ZnluaGtqZ3Fya1toY2Fyf2BkZ2pua2ZqZmRsXGxtdnFgU2JoY2VaSUZMTU9YUVBVYWWBVEBWU1lVRkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFIY0InNJOinI+OsZ2blKGaqbKwn7nAtqCzwbu9ubGmtrCprqW3ube4rLuvraurt6q0ua2lsrWxr6mxtraxs7a7p6mftqmdn6qjqq2dq8OZr6Wvsba1rKyesa2vqqKbnaSsqZyVnKeknZmpo6WVmqCdkZyjq6qpup6npKCXmpqdoY9ropWYnHGDlpykgHaRq6ielpahkYmXmYCXip+PeIWTjYNtaX53hHJshoqGfYSKhm9dZGBnhJeGa4uQlJJ1d4uEf4OQgGaIgGh2aWZYXWl0bk5QamNmcYJmXmRmbmtpXV1eiZCFiGhPS0M3RFRnXUpIUFBVVUtIU2BvdGVFW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTlxLW2ZiPkcxT2E8Ky+NpJqHlbGbnZOgnKqtq6O9xa+pt8K4vbytp7axpqukuLSys7C5rqqnrLSlsLWip7i2tainrLazrrSus6Kpn7SrnqKlnKeom6++lainsLS4ra6kqK2qq6ahn5yhqKicl6Gmppybp6idkp6gmJCfqKqjtK+joqOclpiYl6OIoY+SmoahiJSeoX+lf6esnpSTnZOIg3J4jI6Dh6B1iI1pl4lmfnN5oG+Ih4N+jHx/oaCfmX97h550iI52m4psh4KDbmllZHttcmJUhm1jbWmYcVhpcG6GV11pW2tqWohwbXlyh2iHhFleRk0+Rl5NRVJWVlFQUldUZ11MWUtSUk9FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05cTFtnXz1LMVVfNzAojaaXhJ2snZmZnZ+rqqiqv8Ousrq8t8C/qqS3saqsprO1rq+ztquppbGtpbWzm6y1trSmp6izsa2yqK6eqqGzqaCkpJqipJ2wt5Wlpqe3vaasp6mqq6emoqCZoKikmpmno6SZnKWqlpOjnJSUpKamobako6CkmJWTmJOciK6QmJWJqYuYo5yGsYCkrZ6Ump+VeYLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7B5aGxYsa5vZWm8krxuaHptcI/YflNrYrayfoBxlHWaoaqQVk5XYU9WTkZUW1hRUFKLXFdbUEBcRVFOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01eZ1w+TDFaXDQxIY6mk4Gnqp+XnZ2lrbKpscK9srW/tbi/wqumtK2tqaivtKqvtrSoqKa2pai5r5yysraqpaSnsq+tsaarnqeksqSioZ+XnKGgsa6Vn6OgtLqiqqigrK2kop2bmqKqoJibqaCfmJ2oqJGcp5uUnqKno6Gwo56fo5aWkpiSmYWwa2qLjap+Z4WWh61lcZ6dlZqnlnGuoaR+d7p8a6GPdrFfarRbpYBlnJBgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZKUY21tp25chKBFaWeHlkV1nGB9ZnujpoJZX4uraYCSeHpqqDhKr1tXU2xjWkxPWF9cV1Y7TohPVlYvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlgzMRuSopWCraelnqOkqrG3rbS9vrC2xbK4usOnqbCsr6mpsa+ksbqwpKWvs6Opuames7Kwo6Whqq2wrK+mqJ+jorGco52YlZidnrCol5yioLSzoaqboaysn56al6Cjqp2ZnqWhnZqhp6SQnaObmKGgrJ+lpqCaoKGVlZGWkZqGtZu1eYWpmbWZd4ezm7d/k5aXq5Z+a4GmeoGFhpGUknerZ2qxW6x7joeUdIhwjoaAf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLT6VYSGNjmX5jaKVfeXF1UpKHXlCpbWNxfYaAYZ0vUqJuW1NrZ19MS1xjWFxaQj6wd1dYQSNNaEZCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWFVNTAclp+UiLOmpqGuqaizrKq7tsKwvMKtuLfCq6ytr66nrrOqoq+8q6Knta2jq7alpbKzqKOhnaeqsqiwqKaeoKCwlqCalpaXmqCvo5uapKi1rqGoj6mnqZudlpigpqmbn52jn5ygo6WjlZufmJqeo6ubpZqcmqKglpORk5OdhNWTmblxsMJ/xoZ81pScu3yblqaQjZyMpHqNhqKBpYJ6rHmPnVWve4l+n2q5Wrl3hYN9poKTfJh6qnmOnZB7sW2OhHSQu4VulVCvp8WKUaB6Y2CqYnNyhmyXh19TtbTIhYCJfGOkM0KddV1QamhkUEBYZllkYUpITWtKWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3RzphUDcyJZyikpixqKmls6qltKekvLfBsbrAsra1vbS2p7Kxo7GzpqCvtqmbqLquo7CyobK0saGknp6nqbGptKmlnJ6erJeZmZeXlpiirJ6bl6mtsKijno6soqeWnZicoaaimKKho6GboqKnm56gnpWZm6ahnKaUm5ufoJiQkpWQnYiybmi1cauIcI6mcrR0c7Z7m5iljY+cjaJ+j5+kfrB1g5HS0XVbrnyFf6Rum6qma4aFfa19l5mPe7Fzk52PeLNllnSFnm6eZpRSyYtawlyfeWJfrV92c4Zil4heWcqdb7+AdU1LtVNVxmRUUWpjZVhBT2pfbGlQVUZJOT1XUltWWUhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQU5UX2VQNUc9YU02Mi6inZGlr6ylqbqsprWlp7a7vLK7v7i3tbu7tKa1tKKysqOgrLClmKe6rqSysZ20uKqgpZ2hqqSyqKyqpJqdm6mflpWYmZKTo6qhmJOnq7CloZaSrJ+lkpShnKSnoJWbp6eimqOfrpqhnp6QlpyinpyllJ2VmaKelZmWkpuFrHt3qHajj4uHqW+tioOnhJqZooqSmYuifpGXh66Ff4KzXHKzUq59goKjfnHXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1edneHZ5iIal2vd5Wfj3hsNXnIrrJfQlRvXWdgRVBsX3BtVlVNLmViaFNZUDtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjc3oJ2ToLixmLPBrKiyp6qyuri0ub65uLO2vramuLSgta2goKmsoJWntqyosbGrrbSkm6mfoKiitaemqqOZnpWlopSUnJqSlqOmm5SQp62vpaCUmKmfoo+RopqppqGVmqapnZ2knq2doZygjZSfm56gmJiclpehoJSYkaadhql9faV5oY+Qg6pwrYyBpoaWoKKKl5aIo4GQh5Sqe4CLnXlvsVqog4KIoHh02H92h3SngY6bjZKkfJWQn4R7sl6cZKB9gpRtk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmVPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpJYSEU9SEZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8T2VkQSZVZls/MVRfYkw3RklfQzE9N6KcmZm/rJizwq6rraimtLC4sba/ubqzsri8qru1oLGln6anp5+UqrGpsKq2raqvoZihoKakpLqio6uhl5uRo6CVlZ+blZigoJCOi6mwr6adlpqnpp+NkqSYqKyolZipqJ6foKSto6GeoY6VoZifoJKcl5yVnaGVlo+rm4+ubnK0dKmMd4qmc7R5dLSBk6Wjk5yMiaSHjnW4bot7i6Jra7ZaoYZll5dooKKnbZRytHSTmH+yaoWSiK1qdbRhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZwXK9WPJx3ZlRvbi5bp09iUmtlYmxaYlxgcHxjU1lRPj5tbzJCQkA/TTkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjkxQTilmpyduqKcsb+uraurp7epuK+1wbW9srC7uKvBtqqroZ2npKKdkqurp7ajs6iuqqGXnKigpau5naOtnJaZkKWjlo6eoZyYnp+Rk5Wrtq+mmZObrKmXjJSmmqWto5GXq7KkoJ6oq7CZoaKQmaKXoJuWm5ehk5ypnZSQqpmH05Oau3SxxIDDhn7Vlpu4eYmRmI2XiYynh3mitnR9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6von6MdIerfb5uc7x0soN1eICKbZqIcW2NpHS9XXd9W2F5vGpaVltpel5pYWRmYm15b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkA5p5mforyil7HCr62pqqyxqLmvt8Wxu7OvvLCuwbKtpqOfpKGdnJGqpaqypLWnraSglpqrmaesuZ2jrZmVoZCmoJONnKOemJ6akJaSr7mwq5WXo6enlJCWpZ2krZ+RoKirn5yfqaSynqKkjqeilKGam5eVpJiPsKCSlamfhZCZtoCRkY24lXiCk5u1d25sbnNveY+EjolynsG7vJl6gbKocIB0kbmDe4aGioaNe4qGjZd8pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnB3toxef3l9iGeDeW15YouscHSFf1hbp2lEZFlUZl9jXWNRZmZxbXVCTU9MRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppazwrOrqqisq6q7r7HGr7W0r7intbmuq6Sip5+gnZmUrKSuqqa2qKifnJago52spL6noaqXlZyRopuSj6GooZOel5KYlLK1tqyYnqOkoouSkqacpaudlqmlppyaoamnpqOooZKsnpeinpeWmJ2ej7Cpk5ynoo9rfmmcqHmIc36bjnV6ZYd7vr/Aum6SgnGUhV9yalpdmolhZIeOlWtgf5RjbZt2YpRrgJqVlGVeX2Jxmolocox8hpRman5xdHl+fWJbeHSBaFBcboN8e4pqWGx5gXJJSm+FcE5zTURWXGZhTFtXZmNeT1ptdmpyUk9ERU08SEk8TD4yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5bTyc/Mj6on6ihwaSatLm2o6ymrqeotbKsyKywtK22pL6xs6ehpKqdo5yamqynrqSltaqkm5iVopumram+qKillZSblqCak5ilqaeRnpCPmJywsr6sm6edp6KJk5Gqm6iknJysn6Oam6OnrKGfqqKarpuVpqCWlJ2fnZexpZmiqJmckZ6co6Wap6OanZqampCWgmhufXF2kZeTkIOJtKmNhZiVjoqMmJaHk5WJg5OTkIiNkZSZk5mXmqChmpuUn5uNgnqkhWxpe5B9gHWJi4Jygnh5dnWKgHuJanOBdIN1ZHd9dmtwemxfYltvZ0xYWWVqX1dZcHpvbWZTT0ZSOU9aTlJPKCs7SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Gxt6CpprOnpbC1qsmrrbKmtabAqLShnqWmnKWWlqCrp62jpLesoJmXlqCXraqmwZ+rpJaSnJeemJSUop6eo6iSkJmop7LDr5mrnKqej5eWqZ6rnJ6hrZihm52ipa+loaSonquYl6admZqhnp6csKGdoqeVmJSZlKGjlqSfmKGOlpSLio6Pl62Pe5WbgpGAiamohYCYloqEjp+Ie4OQhYWakYaFiZWOm5eOkJieo5aZkpCcjX6NZaGzroSJhHd7j4p+d3l6b2d5kIGAiWt1gXmIcmlzf3l1g4eBanRjeGZfaGRjZGZqWGt7cWprXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15dXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLOgua++rKutsbKgqqayraKss7DGsKutpLOvvKS0nKCnoqGdmZeopqmmpKaztZ6UlZ2ZmbCmrr6gq6KRkZ6amZSSlqGcl6mdhZ2prKK0x7OfqaSqlpaYmqeeqZygpauUn5+doKquqKSjq6Gsm5+foJiknpyfnLCkmZ+ok5iZnZKlmpmpn5uXZoOSfGV+j5qPY3iMbGhqepCjq2tkmZd+Z4WKZWVpaHqNoY5qZ4yXkaJ3a2qLmKKemHJrbnqEjIZ5WGVdhYJebIuKgnZbaHN3d5GAh4JueIJ4f3NteYRzd4iIjoN7aYVYXWpzZF1ziGlrfHFtY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kuNlpPNilFWS9ETzFZQjs/Lj2ln7q8ua+ssrCrpaitrrCnrq2wvbGqqKWtsLCfrZigpJ6impqnrJyso6aoqbOunpajkKOwpra5pa6jj4+aoZmTkpugmJmmlnulrKKos8O3paKnr5+elZ6jnqOdpKqokp+hnqCqr6mpo6qep5umnqegrJahnKWxpJicq5ahn5uTpZifq5mefr6DiHK0coWeha1od7nEuHGSoaN7ppiYc6qCfMvAwLtxiqOHgp58lpiInsC9gpadnYycwcB7gXqRjJrCv31rpbJvjIFvynp/m3eRg46AdnmBf3lxe4CGcHiFjJN5bHWRYmVeeGNeZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqK4w7Swr7+pqZSjr6mwr62msrWvqqanpbGroKuYm6KgnJuqp6Kdq6KlqKWltKSeo5Omrqy4tKevopKRmZ2lkpGgoZeboJ2Hpqqkq62/v7Ghqa6pl5KfnqKZo6Sqo5OgoZ6drK6nq6ajoaWfpKScraiRpJupraqcnaudraKXmKaXoqSYnX/OlHl6pYF6lpabX62PXY6ogKChfKeVmnSrgoCvXmSMqXqoh4WfdJeSiLNjgquGoI2Ns2qErnN8loe4YYKtWaPNbpB1e9t7f5lxfoiSdX9le4h2dmx9h259hZCRfWuAjV9wam9mYF94ZFtxaGpjZmBSVFNXXkpPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMa3Bv7+0tLC3mJ6Ro6qprbSrprKtrKykrKawqqGnm5qmmJyir5+hn6ino6Whn7Csm56Wpq6tsKuorKCUkpufpZOQn6SXnaejnq2jq7Cov8azqKmxrpaSnpyil6Gqqp+VoZ6dnK6upqmom6Wlo6GqkqyzlqWiqqqepKenorGik5unm6GblZSRl6BwhYyYdYSoh3GwfJ1yrH2gn4Glj553q4J9rX+ccq1+q4eGn3aYknt8l36qiKGLkYucfat6iJKPn396rVacxHqPb5LBfYGVbXVwjG1md2WGb2F3bnJuiIqRj4Nsj45kbXN1b2BmbWRfb2hqbmZjV1NcYFpSUkM4SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv08XGsrOgnaOOo6Kira62r6mxp6iqqK6rq6aio52ao5Wfpqufoqagqaijn56wrZiblqinr6yop6mel5Wao6KSlKGsmp2mo6+so6y1qbnNsq2mrqyWlZydopmfrqydlqGZnp6qsaepqZqpp6OhqpqvsaKorK+mmaarqquypJOYpKablZKFpGqkdYl6qXV6snGCpYmYjHCHn5qHpF9gUquEf66Cm3WugqeGhp96mZeFe2aAo4mkmIaBo32pfoGUhq5ee6hVnaKSgXqjn4B8w6/FjHOvtLO5cWKpr8J0aIyMl46BbJiRbmx4eHdua2ZkZHFwZntpY1xWX2lYWFRMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1cChmauooa+in7C1sK+praOop6qrq6mkpp+bpZ+dpqempJ2smqKsoaOfr6Oem5OqpLawrqCpm5yXlaajkJqip5+gppuxpqOosay2yLK1qayqlZGcnaKZoKW0nZqhlJyfp6upoq2Zqqehoamhs62iqrOyopyqqLCwt6WUl6SomZ2SfKpsnoSHdat5fLBugqSLiJ+WlZ6VgdK3tLjJgIGyXl+UqYOkh4egepiVmXiqyXOZo5SnqJCSmox+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SOj5ySe2+VkH1ueXR8em1bZWpycWaBal5hWGNtXF5ZSUxMS0VEQkI9QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwMa5ramyrqylop2yuayqoaabqKaqrKmmoKakmKujn66rnaahrJqeqaWdprWfopeTqKu2sqybppyglpClrZKanKaioKqmraGip6mwtMKxsqqtqJSJmJ2lm6Kkr6aXoZWZnKWlqZmunKympZ2ro7asoLG5sJ6cr6i0tLSmlpippJuhj4KdTniagX+feoSjfIKkhIamnpyelIS4e3x5uYJ/zMbDtneboZCLn36alpeJdp+XiqSYpKd+r4Sbg56ErH2ZlGGlbKNwj4WQgX2XhHKsYKRycYCaYLx9UlV1jpGjlnt8kY6Hcnlyg31wXGxud3JqgG5aY19obmJkXUxMUVNBSEdGSTk5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuhrLO0pp+hlaWvrq6ppp2lpZqjp6CyrqKpp7KgmamklKO1o6OVl6KqtbmknKOdo5OQobKZnpumpKCir62co6iitbHDsa2qraqRh5Gcp52jpJ2ll56YmZmlo6eYraGso6WXrqW7rKG3t66enrWzubK0qJmfsaKln4eP0bXDt3mHjoWRk4+ApniUoneLoJKFpYKLcauGhbRucmmZo5yViZ98l5mGh5BzroKlm6KMpoqTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicXF/n2Jzsrhod4+TpJh9iouQiHZ7eI2BbGh3aXhzbn50XGRkbW1laGBKWldYPEhGP1QzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq2/v7y7tZ6XqKSttqGjmZWjqaeuqauZpaGepqGgtaeiqaewo5Sro4+kraOdkJqaqrS0pJ2mnKmSlJeuoKCepqOcp5y1maCqo7Wrwq+pq6mijISPnKKgpqOWmpqcmJuYpqOll6mmrKGkm6ymvayUvrCtn6OwtLustaidqrOlqZl7qJF9fLB3ioGkpYicbbJvoIete6GPg6iWmYCsiYWuhaCUqKGil4WfgJmVgHuSfquAnZmWiqp3naCPiJOSf3mvXaOBfKanZJ6AfJd0a65dpWtxhZldYFuMoG2UkKWYgpOLk4l4eYGWfmpsfWJ9dG1/eV9nZXBvZ2doQllfWz1KUzJUOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiMoKLySmoSpxsO2wbSfmq2grrilo46apKOgr66pn6Oena2Ynrmgoqugr6qarqGRqqmllomaj66wrKagqJutmJmPraKhnaWhmaScrZefqKW2qL+upKmjn4uAjpubn6aekpSZmpSamqSjo5inqqqhop6pqL2kl8Osq6OirLO7rK+oorWxqqyZdq9+kIqchYd9uq2JmGSwjGWVrX2hj4OnlpuBrIqEsIWmmaOhopGFoFtsaoGzYH+te3qCgLFsZ22Zl4uIsVp9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46nmYmVj5OUeXeMm3xjc3xhg3hzf3xgaWZwbWZlZU9VY1xBVF49SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Sxt727tMGzo5ytpqW2qaCLmaCfnbOxqJ6in520mKCzqKqrnrCtnqybla6ooo6Im46vrKino6iZrpOaj6maoZ6lnpmjoqWYnqKpsqi8r6Wonp2OfIublqGgmZCSmpuRmZeonp+Xp6ylo6SipKm6nqDGp6Wpoay1t66vqKG9r66ul4GpkqOujpuAhqSXmJCAgLjDuoOOnZOEp5idgqyKgq+Jp5yapauRftW9wqpipL+9fX6jgoPXure1hZOSgp69voRqo4Fvq4RunX96srHHg2ursL2seHeivrt0gJWNpZqNmY6Umnd/j5l4YXx5Y4xneIF7YGtlamliUGJbU2lcQFRgQkwpPDo1Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLG/urK9s6Kdrqals6adjJilv6m2sKehv6amsZuesZy5qJ+trqWnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6aep5uaoKiimJ2grKypuK2no5qXk3uImZKmm5OPkZiYj5iUqJmelqinnqmmoaKrup6pxaOhsKSrtLWrsauivaqwsJx0dqqkt4VliZ9wZ6yPio9ub3ekkJqggXWwmpZwkI1ylqijm5iupHJsbWxlinhubYKZcYB6aXBpZomVlZdxaGmFhmdwhmRdimNpb1ldZ354pmBico+Sb2ZkgI2TjqGWlZaOlJt6hY2TdGSGd2eManh+eGRsY2VsYktlV0prWTpQZERQJ0o6KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurmys6qpoq6epLOqmJK9scPHvbSpnr+rrKOgpqufuqOkraytpY6WraqQjIWVl62fpaqin6SjoJGLpZKnmamZlqOqoJacpaanr7mqq5qbk5J7hJaOppeOkZGYlI2XlaaTnZanopmvpp2irLmfsMKopLSmrLGyq6+tqbqlsLmXi6GppbWciZaimIapmpCUnZKqs5mbo6yhtJejoZ6hopyhpKGVrKeMkpOMh5KcnJSQmZOYkI6VhH+kmpeVjYuSkoqPhoR+Z4uAdIN2dIeMcadtfJWSlJOBgY+Pj46ckp+UlZSegIWSi3BnjnZuiXd1fHlpa2Rkb2NVYFhAaVpHYmBOWCtFPSsmITY0MC8fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW3rq6isKStn6C2sZCOqsS7xLm3qaGlnZulnbCoo7annam1pqeRmKyji4iJj5ynlqyjoZqonp6TlaOXqJqpmZSmoaOPmqeZobS5p6qYmpCNfIGUjKGUipWRlZCPkpekjp2Yp56btaOdpqu3qK/Cr6S4p7Cvsa6qq7W7orG+mZKmpKa1opKdpp6NqJ+MkZ+jrLCaoaSyqrGZpaGdpKuenp2cl6yekpqim5SQlqqZjZiYlpCWnpGHoJ2VlIWSjI+NlYuBfmaNh3WHdnmIhHScaoeRlZWSiX2MlpKSl5GgkZqUnoKGloV4cZRyeIl+cXt+aW5kXnBpYFtfWW1iUGBkT1k5R0ZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjl5Wkp6Ows6yuo6mnraCotaqQj5yjsrqtqquhopl6nKKwpKWxqZabuKajlJipnI6GiombopCunqSWqKChkpeZm66LqpaPqJmojJiojp64tqOlmJuNiXmBlIybk4qVkZOQjZGWoYucnKednrejf4OvtaKwsHSkv6SyoHh7oay0vZZ3rqWgioCpfmRcYnafjqOdg5Z+bpS0nKOor6ykZZ+glHR6mpdwgJmpmGyAo6iKZZylnJCXmJaLkpuQhJ2akJSDkoeOjpKJhXdrkIh2h3F8hoGAYWmJi5WTjFt2lZFnaI+McXmilpZkd5eGgHaXaIKJgm55fmpwZV91b2trZ1xlY2Fhb1JaPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXWBoZ2dYUUk8REc8OVZSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6mlqa2kp62kkpaqtK6xpZmppqqXc4udr5+oq6eTlrifoI+cpJ6QfoiImp6Nq5qklaeino6XkZ6FdK6PiKWaqJGWo4ibubOnoJmZi4l1d5ONlpOKk5GQlIyPk5+NmZ6lmJuyloCMm7WdtI2Sj72noX6nonuksLmCjo+nn4SLhY+xqa+MiZaimXmAi6yGnJ2iqKupiJWHmXelm3qHnIGXp4KBe52yeoqGoJeZlJiWgZCWloSZmmN5h5CEjY+Si4NucZCIeoFxgIGGf4Z0h4WWkniWaJN0oJp0e5mCnZqEmH2RiIGCmGmMjIRqeHpwcGdkeG1pbGpcZGlpZXJbXEhUTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrcW8r6CVpae0nY+DnKucpqKgjZC+npmNn5qhkHyFjpmYiKydo5ahoZKNlImGgJGojoeinKOTlp2Gnrmxp52ak4+FcHWQiZSQipSPjpuLjpGdkJWeo5Sdq4eftIm0mq6Lyoirr4m3hY2wg7KwhamOp5iNnXyoj3J7d5uOpZZnlKR5tIyfn6epk5nCgn+riJihcZ6AmqV9l4WVsoChfaCTn4+Yl4COk5uJmJKLfIWTho2Uk4mDbXOShoB7coaBhH2FdYaCmIGPxWaAqYePomqdgZ6XgJmAioyDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZsWGZGXFFMMkU0Nk1gYzcmNDxER0Q6NjM2NTg7OD49PT5CTD9OSUpLQ1BaXVxXYl5qbFxRRT1LTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGpq6aalJ6ipKqilaSptaKvf6CmnKWenYmUvJmTjaCRnY95g5aWkYirmZybmqKFj4x3m5yOoJGInqSblZiXhqK4rKWZm42Nf2Jtj4uTkI2PjIyXi4+Rno2SnqCYoKd+oaeHrZ2glq6QoJ6dkYaCoI2ssYikjquajJp+onWAmJNrgap0TKp4h42dkpupqYKqq36EoXt6p2mef5JsZ5eGmLaJnn5uYGNYg5d/jHtkZ4tzmX15lmtdfJduX1NxhVxgbHmDYFllgn6EgZhxp6prg6NucqVwn4KcZ2SebFpsiHplWV+CfmFXUG92ZW10cWpqbl5qb2xraFdnTl1YRTlANEdEXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKW11fV15fYnZgTUU6TU9NVGJcW2ZmaWliYmRhZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiWnaC5oKqjpqyRoba8q66imZafoKWrq5+crbShp5Ggn5+mm5mNmLSZkIuejJWLdYGUkY2KppaWmJ+efpOFhqyjh5yRipipmJmakYelsKailZmIiYBpboiHi46OiYuMkYuPkaCLkp2fm6Glf5OBj6OhlKB3nJaQp4OiqICGq6+GpXqLfYSafaJwcpKHlnudjHlth5uLmZGcqZyPh518gqJzdqZmnn53pF6Ye32Tc6JumLe0unOSiIGAtqhkgca4e3CVtoxxgJukY3Ssq2B9ap2zfm59h4OPgouXcYCjbHOkc56CfaNenJmzlm97l56zdHJbnrKCaWJvc3VxaG5Ya2tycmRbZ11hS0Q9RDVRQVpwMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1lYYGB7ZElDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4ta2toJqhm6KjpKubmrGsqpKXoJigpJmalJ6rm4uIkXiLhXCAlo2Kj6GQk5Sdl32Rio6ooIeYj4qSopObmoyKqKekno+Wh4R+a3uHfn2PjYOLj4+JjpOegZWbn5ygn4uJd5yYoo2gcqKLiKmInKeRl6msgK6MfXqgmXmjk3iAc5eIi5x9lZ+Gm46ZnKeHo2ShfYmWkJuMbJ5omo1umpl7gIqnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2domKgJ1omnWHk5KYjn+ebZmQaqaZXKh+d7tqfalajoRds2dbbnF4d2tpW3Bpd3hhXmRWYUFQRU83VkJSbTRKWlleTlpEQDE1MTs7N0g/OkNHVT9YUlhdPkRiXVZgUWFkfGlFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG5xYGRlZWtkY2loZ2tplZyJqrabqIljlZysurKwq52lm5qnn52smZ2wp6qdlqKZoZ+Zlpago5mGiY1piIBxe5eIjJaWhJKUmI96ioSWo5yJlY+Gi52RnJuIj6iin5qMkYqAgGmBhnl/lox7iI2Oh46VmX6SoZ6gopOYcmifiqCPjHCSjIKpiJmgpKmiqX2wraSiuJd2o7Oio3+IlHiceqqZf6KPnpyYiZhyoX2FjbC1fWuakaF4fpi0o6OrqISYe5p8nJp+c6paXW97l4t4nmJMf3t7hWR6mEJNn1mianJ8jm6BioSZdpt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfH1uZl9raHV7YmNfUF1WXFRWQFlFUWdFUlZcYVhfSUQ9QjhAQTpJRThMRVhBVlFaVkRGYVxaYEtgbX1xRUM8VV5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWR2bF5lZ2ZsZGVsaGhraZSdgbGumYRTX6GntLqzs6iaoouaqZucp5Kgq6Ogp46enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32Rk5aIcoCJkqCbcpKQgYiZlJ+ahI6om5mVi4qKfIRshIVxgaGMeIWNiIeRl5N7kaKfnqOIroZ9tYSPnp17ppZ6qYKWnpGLop5+p2h3bX6Zc6BzcXydhplvkoKtfKODp5+bgaRwXqlodaNjb6VhnNOPfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyp7x/d4Ntf7+mqrRenG9+cpdvgXOicl6kZ3SmYGimbJrTmHqCm252eZdrm3l2l3JsqaVnX2R5cH+Ea2dmY211d2ZfYVFaZVBRYUhXSVRfV1NbZGpbZVFFQ0tMSktCSkU4UEBQTVhTWE9SUWBlZWlSZHh5d0lGRWNdZVpoalNpaGpvY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGZobGiYm3+wrFRcS36pr7K1sLKjnJiEl6agoKOMpKefl6iJmZeYk5mTkaCXjoiFe3B9hGh9j4OTmoF3kY6PiXB/h4+TkmyYlHyJkZKjlYOOqZqTkouFiXmDdoiAboGehneAkoWHmKCVeZKio5mgibOhoraLeqynpK6lcKmAm5GGgZ2TfaSAopmGmHGehKKtromXi3+MpI2Vg6+ilXa1trXJonSUi4KeYZ6XqW15lYagm3Whh3egfZCWioFvTGajknCaiHOle3l0YoOCbH6gbHJkYJxyf3SXa3tqtLW0xqZzmH56nGqamqt0gZpsc3eXaZl5dJdxUER9s15pdWp4h2ZrZ2JzdHBtVVxSWGdPUmhJVUxYUlVcZ2tuVWdXTUpBSk1KSEpOQVFKUGRjaW1ldHJzfnh7bnWJentUUU9tXmhba2lSamhpbGdtZmNlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlopyIr6eFZj+UobOsr6+1oqKPf5anoqGji6SmnJulgZqXlo2XkI+bk46Ig3lqeYZlg4x+lp95dY+IjIJphIWSg4yFnY16jIqVpZKCl6iXjJGLgIl6gH2LeXCPoIZ5gZSGiJWelH6TpaeclpaEZ254nGyiZHxxpXicmHBop4KYjXykeqCWg5Zyn3aAiZSVj7ltj4qiYn2ZopaJbnNqq2t1oG1vpmCbaYuQaZaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGeIgm5yolpfW2Ohbl2JjHB7f3RyZKVueKJkZqdol3KLmG6hb1KIj26gXmSnVItdVJhtbXJqcYFtcGhreHNrb1FWVVVlWVNtSVhPXEhYaGhzallrVlBSRVZcTFhSYVVoal53dXp8cHx8coJ7f3N2jYCDdl5Rc2FmYnFnUGtoaGtsb2hkZ19dXV1gamJpaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupaqwsaafi3+WqpydpIuhoZmhoYCVmJONmo+Ll5COi3uGcYCIaIuKfJeac3SJfZB8ZYKHlYqJlpmCfIiFlqaQgaGrkIWQioGKfYCAjnNpj6WEfYWTjIeXn42GkammnYmmeJacfqWJloyymZ6Rg6+Xn6V5l4l6qXSmj4SabqWijJKEjIO8bXylr4KHhoeUl52hfaZ7cqiUoJZnnn5vrGOWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4Zvb6CekZRhf6uLqneBf46nn3effYWklZ2gaZqHdaxmnq2MtnN2voyjk1mDpo2rYHVxc297dXBian5uZ2xTVVlVYGBcakxcUVxJXWxtdmBbcVhbX1pnc2Vub3FjcXRgd3p+eXJ5g3KDfoF7e4yBgoB2YnlkY25zZFJsZ2dvbHJpZmlhX15cYWpibGx6b1xcYmlhbWl3bWdsbmKVpqqcgYCepJaqqp6op66jmIiBlqqZnaOJmqScqJ2Ei5qPhZyRhZKNjIx0hXqIg2+NhH2Xk3N1hnKRg25/i5KGhpSPfXuChZeljX+lpY2AjYmElHWCh5JvbIuogIKLk42Im56Ii5KqoqCQgHSUl4h+gXmUr6R/gZxxj4Z5koyFgHtyp4xxfX16l5abhI14e319iJSVk4t3kZmgoYR7folrjIVbeXlzeXBpbn6SinJ/dIGPlJNxhYOCZY1/X4GAjHd2dJR1b3tvb4luhIZed2l4jmaCg4aPqpx/dH2XaomIb391fIR1bWxmjHN3e5d3hFpqV3mPaG13cnFvd3hvXWyGbWlnVlleV1xka2RVYVReUV9vd3lrandlampqdXxwcXRzYW91YnN7gXh1eYF1f4B/gHmLhYJ9e21/bGR5bl5XbmdodWt4amlpZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW5qaeLoaKbpqSZpJ2rop+Dg5aqkZ2giJmmmqiYgoGbi36WlIeOiomMcoJ8j31+j4R6l450coRwlYZ7fZKLhoaQhXh+gIaYo4x7p6CLhY+PhJWCho6Yd3GEqoWNkZyPh56dhoqaqJ+gqoOJjpWbf36Kl62okJOnkHhxnpODe5Nwf6mGcH2VcWpvfIGfi3+Rjotobl2EjIycnKCPc5aMiHF0a4J2dIBZcm6GkYJ+fotpXWljeoWDiIBfaXh7nHyDjYN2gYeDaXmMiGticXKDd19yjYKKkKiWh2eNj4Nud4uCb4OLd25kZmN5gnqVWltpZm12W3p4d3Rtc3KCZlxtimtrYllYXVlYa3FbXmBZXl1lcn16c290Y2pqaXt8cnp3dGRtdGhse351enx7eXl/gH5vhYmEe31zfnlyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMqrGhkKOhmp+emJ6ZqKKhfYKWq4yelIeaoZCklH97mIR8kpmIiIaGinJ9gIt2hYuBhJaKcm+AcpiHg36Sg4SGioF6gIOLmp+PgqaghniNl4iVi4ucl4SDeqyBkJeZk4mdnIaHoaqfoaKji4iTm52jmZaqoqinoZOciZiQfHmPj4Wofn6SkZKTnLGlmpSdj42xkpiEpoyMlpygipGcg4mSimt8jnZ3ZYKGkIp9iZ2Eh4uPh4iAhYSQd3x7dZujiYiLn4uGlX9+jYKBdnF0hoV/eImIi5GnkYSHjoiDjJCLe4WJh41/dWqBg3t5mWlxaGBzinB9end2b3ZzgVxeb4dnbl9eWVpcUmdxVWNbW2FsaHR7fHJucGNqaWh/e214fnBob3BsZoB7coGAd399f4R7bYOMhnx6eHx+eoN4TmR2anNucXtla2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5aioZiVmZiUmKSgnXp/mKmNnoyFn5yKnZZ8eJSCe46ZiYaDhIdteIGAcoCHfoiThG1rfnqXh4SDkH6AhoSGfYeDjZudkYapnoJyio+FkpGLnJF9jXqpg42Rl5WOnJaFhZumn6KanYaDkpqZmZCZpqCmnp6Ql4KTi3h9iI+Fpnx8j5CRhZipoJyTnI6NqY2RgJ6NiZSboIOPl3+HjoNweIZxdGF+hI+GdYyYgIOPgoaEfoWElW55dnWTo4yNhpuFhY51gYx+fXJzfImEe3mNj4WTqJCHhI+Cg4mJiHWEhoaJem1qfX96bWhrbGZeeX5nfHt2dHV1endcYHB9bXRgY1pbXlFmbVNlWl1hamh1en5wbGxjampngH9rcn9ranNueG6DeW6GgHaCgH2FdnKCjYd+e3p8f3uCi2Bpe2t1aGmDZWpjYGlbY3Vob2J1bWtUYnF5ZW95enJlam1ti4qfuJqhpJ+SkZaXi5qfnp16d5ylkJuJhqSUipiZeHmNhXyJkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foaEh3yPgI+bm5CHppx/b4uKjJKGoKGKhYx8p5CHj5KWk5aSdoyjoKGdlpp/gZCamZONmqKipJuYkZx/j4Z6gYWPiKGAfoyNj3yXpKCgkpmPkKaMj4GbkomUmJx+k5N+h46BdnSCcHZgfYCOh3KKlnyIjHGMfoKFhY9peHJ5jZmTkICYf4mMc4OJfX1xenyMhXt7ko6El6aUjIaRfISFhoR0gIGFhXhkcXp+eHlwa2pmXn1zZ3x1dnN8c39qXmB0dnB3ZGNYXV5SamhUZVheYGdpdniBcWZrY2xnZX+Aam19Z21wan13hXpri4FygYF9gXR2goyGf3x6gIF9f49qcoNudGliiGlsYl9xVXRvbW5geGhsV2p0dmN0enpxYmtveYmNn7OSpaWcjpCYj4acoJqbe3Wjn42Xf4yhioialXh7hod+g4l+iIKBf3B+enR1goV+iZB3Z2N9hpeLgoqNeH2AjYN5loCVl5WNlZ+afW+LgZCThqWbh4yJg6aVhJKKlZeSkXaQnaGhmJSYen+OmJePl5qdpJ6Zk5Sce5GHhHiGl46efoKKjoxzl6KdoJKYjY+hjIuDl5iDk5aaf5iNfImNgXdyfm57ZIB8i4ZwhpOAkIJrh4OBgImFZnZvfYiTmY1+lHmMiX2BiX18coB5i4Z6hZKLjJmjl4OEjHeHg4KBdXp/hoNzXnd3fHN9d2ZrY2B+aWp2c3N1fXF8Y2Nhc251cm1hWV9dWmtkUmJXX2Boa3R5hnBiamNsZmh8gmtodGhsb2h/fIF5bI+FcYCCgn90fIOMgYB+eoKDfnyQbXWJdHRtZYpsamJjdVaDaXBuYHhnbGFqdnBleHt5cF9xbIWFkJ2umKaono2Nl4eFn5KWl3x2qJuJmHmWnIuMmI94e4CLfXyDe4CCgXhzeHlzfYCDf4iKgGRefYuViH6Fh3R9fop/fpeElpOWjKOgl35xh3uTkYqmj4yOipKgkYORj5OXkIqAjpegmpKQknSAjZKUiZ2dnqeZmI6VmHWPkItthpmQmnuHiJCJb5edmaGTlYqMnoyGgZOcf5OTloeaiXyKioF6cnprdWx8f4t+boWSg5R4b4KEfn6LgGVzan2Bl5iFgI50kYmEeYh+dniBfoeBfYSOho2VpZF5hYJ0iIZ8f3FzfoWBbF95dHhwe25hbmJke2Ftb3Zyd3dzc2F2YG9sdW5vXVteXV1qXU9cV2JhaG1zeolrX2llamNod4dtZmxoaWxngHx6d26QiHOAg4R9dIGGinqDfXqBhH18jnJ5i3l4bmyHa2hfaXJjh2hxb2V2Z21sYXpoanx7d3Bhd22LgZmaqqCkqJ2KipGGip2KlJd8dqyXjJZ8npORlpSIdn17inx7gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkYZ/hIRzeoCGeo+RhpGRm5KkmpOBfIF8jYqSo4iNio2Xmo2FkZiTlY6IiIuSnZOQjI1uhJCPkYmemaKhl5eJl5Jwi5uFZ4eaj5R7iYWQinCWmpOgkZGIipmMgn+Sn32Sj5OMmo97ioWHdHN2a3FudnyLdG6GkY6ScXSAfIGCiHxlcW16fpuUfoWKdZGLgnWJem+Bf4GIfYWNioaOlqqOe4h9foqFd31vbX6DgWJnd3N0bnphXW9ganRecGp6eXhscnBleV1tbHNtc1haXV9halpPV1dkY2ZxcX+HZV1paGdiZ3GNbmRpZ2VpZ4B6d3VujoVzgYGDfHWCiIV4hXx3g4V6gIp3f4t7e3J5g2prX3Boc39rcW5tcWdva2V7Ym5/eXdwa3Z3iX+jmKKooaabiIyKgY+chpKbdICplJGNhqCMlZOQf3N7doV3eH9yc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWAf3+gho+KkZyXoJOWd4l+gIyInJ2Jj4aSl5aFiJSYj5aLi4yNjJ2KjpCEbomLj5GKnJahnJiWhpiJbIalhWeHnouSf4yEjIF3k5iRnZCQiImUjX5+kJl8kY2QjpqSfYuAg292cGxtb3B7hmlzg46YinB3gHWCiYN5Z3NvdoKbj32KhXuVknt3inVxi3yGjXuLh4WKj5yliXyEdoGKf3d3bGl+gH9ccXJxb293WV1vYG9qXm9qfHpwbW1qbXdgcG9rcW1ZWGBhYW1XUFNZZWZidW+EgmFda21kYmZrkm1gZmZfZ2uBdHFyb4uAdH+CgHl2gIuAeYZ/d4eGdoOFe4eMgHt2in9qcWJ8YoV8b3BsdGpobmx2d19xfnh7dHVzf4J+pZWarZ+nloWMg36WlIKOnnSKn5OShYqajJWNi3pyd3SCcHKFc3F1iGxubHVtiHeDfX9tblVRgauUh4J4gHZygnmCoIKRgZKRl5uRmHeReoKMkqSak46IlJiSg4aWmIuTi4iOj4iehJCKfXOLhYiPiJyZn5uWlYCUgGmHnoloh6GIk4WRhIpxg5GXj5qNj4yLj413e5ORe46LjZKWjXyIfIFrd2pua2xten9ieX6OloF2eoF3g419emh1bXWIl4yAiYd7lJFye4ZxeI57i417iX6EjpGfn4Z9fXiBinx2b2hqf4B3XndvbWtwclVdbmFxYV9sbnlwZ3BmZnN1aHFsYXdlXVZlYGBxU1BOW2VkXHhwiHteXGhxYmJlZZFpX2dkW2dvfm9rcXOKfXZ8hYB1dn+MeXuGgHiIg3OGhX6MjIR8eZV4ZnFqg1+Hfm9va3pgaW10f3Rfc3x4hndzc4V8eaGQmrGcpY6Cin+CmYh/ipx+ipiSjoSIl46OjoR2dHZzgHBvhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xvdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2JnH+OgXh6jH+IjIqcm5yblpR6jndpipOJbYmlhpOJmIOGY4yRmI2UiZWLjImLcHqViXyOiYuTkYp6hXx/bXxlc29rbHp5XIB5j46Ae31+f4aOe3ppdWt0jJCKg4aGfZaNbH+AcIGNgI6JfoR7g5GWm5uMfXd4go94cmtlbn2Baml0bmdoc2xTXm9kcFpfbHJ3ZmtrYmd4c29xY193YGFVa19edU9NS2BlY1x5cYp0XFtldWBhZWSOY2BmYlhpcnNta3F2i3x0eYaCdnd+i3N/hn56iX9yiYeBkYqIfX6ZdmVzbnxlh39ucGuAWmtueHlyYHZ6e412cnaKdnmfjJuvm6CQgoV4iJR+e4ichoSekI6FjJeEk46HgXR3cHlwboRvbW5+cmNkeHB8bnp8amhsY6Sawdyu76Jza3WDdYShhJFulY+Un5OagZFwhYujl4mOlYqQnZWDgJSPhIiPgJKKipd+h3t1f4l4hoWOm5qXmY+Qdot3cIiKjH6MpYWSip2Fhl6LlJeJjoiNioqEiWx8l4J9iIaKkY+GdoV+fmt9Y3h0am94c1iIepGHhXp/f4CFjH56ZnRqgYuPi4SEgIyYhmyCd2+JkoORhX+Ce4GRl5SbkXV0eIaMdXJwZXN3gGBzbW9haHVmUmBwZ2tVX250eWFyY2BpfXFybltjcmFjVm5aXHdMTExjZWFddnOKbVtcZHheYGRlhF9jY15ZaXJrbmtyd4t9c3eEgXh4fIlxg4R8fYh7dIuIiJWGjH9/mHNodXF5bIt7bnRwgFdweXZ5cWR2eIaMaHaAiXGAnYiZp5yjkoR8cIyUd3iJnIOEn42OfJWMf5mHhHtyd3Bzam+Ba2lsfHReYHh2e3B0emdgZXzr2rXJw9yJc2xzgHaKmoiMaZePjpyTkYGIcIWIoI6EipWKjJeTfI2SiIKIj3qRi4aPgoB3eIOEcoeCk5uWlJiGjXaHf3GGg4qImqSElY2fhIlhg5WPhYiFiIyGgIdofZR/fYKFiY6PgnGGf39yd2d2cml0d2xajH2SgoV9gIOAhIqCdmJ1bYqCkYyDf4CTkn5ug216iJGIk4V9gn6Bk5SRmIpvcnqMhXRrb2lwdn5dc2huXGl1X1JkcWhmU19wdnRgb2BcaIJxcmpXZ2ljaVhtV1t0TEpMZWZeYXJzhWlbXGV5Xl5kZ3pgZF9dWWtuZW5qdHeKfnNygX57dnqIdIWDfH+HdnaKhY+YgY2Ce5N2bHd2eXiSdW53en1YeYVxf25meHaRgmR2hoVxipaGmaGbooqGc2+Si3J2jZp8iZmIiXuff4OZf4F4cXRub2RyfmhmbHd3W194e3pxcX9pYWdhf9W2jpGmeG5xd3txkpCMhmqYjYibkIqFe2iHi5mGgZKQhoaXjXuMjICAiY17kI1+iYV6dXuDe3GGgJWZjpKUgol1hIh4hYGMlZ6gh5aQoH+IYX+Th4OHg4iMf3+CZn2RgH5/goyPkH9tg3yCdGttd3V0d3ZrY42Bjn+Ef3yEf4WIf3BgdHKGfZCOg32Akop6cYRne4WMiI2EfIV/gZWQkpSFb3B5i390bG1pand6YWdqaVhrdVpSaXJpYlBicnhsYmVeWmqDbnNiXGdfZW1fblRab05HTmZkXGZucoBrWltjc19cY2t2ZGVdXVpsbGJtanN2hoBxb398fXR4hniFg3yAiHZ4iYGSlXuJhnaJgW94eXuDkm9te4B2XoN/c4FtaHpzlHNnc4d8cpKRhJqfm6CGhnV1lH5tdZKWfYeQg4qNmXyMmnZ+dnFvbGphdHxnYml1eVpgd3t5bXF+ZWNoaFedj19yc5e8xIR2cZSIj31xlouGm5KLh3JqiI+WgHuUjIGEmox8ioV8e4mLf5SIdYmGdnd9gXJ1hoGelIWUj4ODcoCKdoZ9i5qemoeVj52BiWZ9k4J+hIKIiXGBfWZ+jHx5f3+Hi499aYB9g3Zmb3l4c3dzbGuOhYqBioB4goGFhIFrX3N5e36Oi4Z8gpCBfnOCaXqEiYyGhXmEfYKZjZGNfm5te4h9dnRuZmV7dGJbcGJXbnFTU21yaGFOZnR4ZmBeXFlvgG9zWWViXWpuYHBPWWtRRFNnYFpqbm18bllbXW1jWmJwdmRnXF1ga2ljbGpzdoGDcG1/fH90dYN6g4J8gYV2foiBlpB4hIt0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGuTjYWfmKCZhIhufYx2aXeXjn6AiYKUl4l5j5VvenNwbGlkYHN6aF9lcXpaYHJ8eWdxemFlZY+xsndLYlql2dCWcXuQio93fZOKhJiQi4Vua4WSkXp5koaBhJiKfIZ/eHeJioSWgG+LiHF1fnpqeYWDpZCEk42Df29/hHeFeoedmpWMlJGVhYhwe5KCfIKCiINugHdogIR4cn+Ag4qHfGV9foR2Y3BzgGl4cG91mY2Gg4p8dniAhXqDa1xyf3OCiYeKfoeKe4lygm5yhYiPhoZzhHqCmo2OhXlub36Ef3Z6ZGZoe29eWHZaV3BsTldxc2ZgS2x3dGFdW1pZdH1zb1dnXWZqcmBvTldoUj9YZl5acGtoenFbWlhrZVpjcHlfaFxeZWxoZWtpcXd/iG9sf36AdW+Cen+Cf4J/doGEiJeJcYKNcXuGfHp5g5OMdWp5fmtvfnR/fW9ye3qTcG+BfnhnkouDoZmckYKFZoaDb2d5lYh9foSBmImBfI2MaHhya2xmX2BveW1fYm94XGRrgnphcXZfZWXU6r2LMjo+i45/cXiFh42NdYKVjH6RjIt/bWyFjIx1fI9/hYGViHyCeG52h4SDl3duiIVsdXt0ZnmCg6eLgo6LhH5ugHZ4hXuInpKNkZOTjouHf3uShnd+g4yCa39yaIB+eG18fIKKg3dheYSBcWRxaH5udXF1gpuLgH+FgHN1foFzgW9cbn91eYuEi3uHgX2IeXtybYmEkYWMc4J6gJeMjIB1bWt2gIB1dFtnZ3VuV1Z7UllwZEtacnJlW0lweG9cW1tZXXR+dGhZYltnZm9kak1XZlE+XWVcXXVlYHVwWllUbmRZZHF5WmhdX2ZtZ2lraXB3fY5taYKEfnlugHx8gX+CenWBgY2ThHCAi253fYB7e4eSiX9oen1qc3tyhXpzd35+jHp4hH18a4yNhJudloyBgGyNfWtofo2Len5+g5OCfn2KiGt1cWdoYltiZ3NvX2Frc2BocIh6YnN0XmNkm6CPblw1Wq+1dGmAiHyShnWFlYVzjoqJdnBshYOHdXmJeIl8k4d5fnJndYl+fphvcYZ+aHZ5bmZ5h4Skh4CGjIl+bn93gYJ+jpuIg5WSmYqLhYl8j4hwen2Ee2h+bGqAe3pqeneCh4ByYHeBfnFkcmd2gm11e4aVkYF8goFvd3p8dX9tWXCAd3WNg4d4iHaDiXt5dG+LgZGChnN/fn+UiYp7b25qbYGBdG1cZmRycFBaek1bb1xPW3JvZFVLc3hpV1lZWmFwgHRgXV1gZ2RpaWZOWWhNQGBjW2B1YV11bFhXU3RhWmRvcldqXmJoa2dtbGhwd3yTbGiEinx8cH9+e4F/gnp3gH+Ki4Nxe4hvcXeDf3uJjI+Dan17bXd4dop3fHiAgYd/g35+em2EjIiYo42Eg3p1i3hrbIOHkHh9eoGRf39+ioNwcnBjZl5ZZl9vb19gZ3Bmam+JdGF0b1thZGp2e4C/nKakyLhxhYNyknx3hpKCc5CLh3Fyb4N7g3R0h3SId5SIeXlwY3eHeoCTaXKEdmd3dWNqfIKInYF/f46PfXOAdYZ6gZORhHqXj5aQiIKJe4iIa3h5fnRnemhrf3lzaXp2gIN9aGB3h31qanRoe4BpdoGMkZR+en5+cHx2fHR/YlZ4fnNzi4WCfYRxh4l4eXFxhIOOgH96fn12j4aEd2pxaWyHgXFvXGZhcW1JZHVLXW1VU1lybmJRT3R4YVJYWF1hcIJzW2FdaGVlZGtkUFtwSUNjYFtjcF5dd2hVVlV2XVtlbmhWa15haWdlbm5ocHd6k21piIx5fXJ7fnmCgYF8dXyDiIaDcHeEcm13goJ+iYuTf3CAe3d5eoGLdIN4foGBgoR6gHVvfoqLm56IfYV6d4V7Z3SFjI95fn97iIWDdo9/Z29uX2RcWGVZbXJhYGBwbGtoiW5hdGlZXmRugHep2qrHhoeycYl3b4x0eoWNf3qSiX90c3R+d4BwcX9thHSUhXh1a2B6gnmJj2ZxhHBndm5bbXyAkJN/gHmRk355fG6Jd4KSjYV1l4uSj4eFhXt/hGx0dn5tZ3ZkbXt1bWl3dn9/fGFieIZ6aHV1Yn17Z3WGjo2Ve3SAdnGAe31tgFpXdX9wdoWIf4B6bYmGdHpsdoGEhX98fnl8dIuCfnRodGVuioNsc1loXnNkR21tS1phV1ZVd21iUFJ0dlhQVlheYXGEb1xgY21kZF5vY1RdckZCZV9dZmddW3tiUVVcdVtbZ2thVmpfYG5lZmtxaHB2eI50a46NdX52eH52gYOBe3N9g4iHg29ygHRxdX6FgYmNint3f3eDe3yFh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeF59hZiLeIaDdIWGhHeJemJubFtiW1thVmlzY2BbZ25vZodxYXFmV11jbH98ys6HuaFqbW2KbHGDcXuDiX56kIR5eHN5dXV7amx2Y4R1koJ2b2ZefYJ6i4plcoJranFjWG16hZuIgoFzl5R4f31viXKEi42Jc5iPkYmGi4N7eX1wcG98ZmhxYm14cWprcXh9fHpdZXmAeGl2eGaCd2d0h4yOlH1yh2pvfoF5b31eWXN/bnWBi3yCb3CKgHF3aXiAgoCCd35ze3WHfXtzZ3NhbouBa3FXaV12W0dtakxWVF5TVXtrYU9UdXJQUVRXXmJ0hWldYGxqZmNab2FYY3BHQGdcYGVeXFZ7Xk5WZXBZW2poXVdoYF5yZmtncWdwc3eGeG6VinR/enh+eYKHgHVxf4aFjoNwcHt4dnV6hoWHjIV6fH90i359hoSEh39+fn2Hf3x4dnh4kZOff4x9i211f3hkgoaVhXORim+FhYF6g3RjbmpZX1tcXVRncmRgWGRxcmaBc2JrZVdbYGp/d76ue6C2bmJzhmhze3F4gYR6fYt+d3dydm97dmVqb2CHdY6Ac2piXn94eYuEZnF/aGtrWlZvd4mjgYR/cZmTcoF5doRvgoOTiXSWio6IhYmFfXh0cW5oeF9qbF9tdmpnamt5d3p2Wmd9fHhlc35uhHRldYWNhpZ/cIxna3qEdW51Yl1xfWx1fYx7gmZ2h31ucWl2f3l/gHN+bXt8gnt4cWZsYm2JfWxtVWlfdlVKaWpOUU5oTVh7aGFOVXZrTFFUVV9mdYNmXmBxaGdiV2ldXGtoSkRqWWFkVllVeVlNVm1qWV1rZFxZZWNedGZsZHFncnB1gXhwmYV2f353f3yFh311coKIgJWDbnN5e3pzcoWHiYiDeYF9dY9+fISKjoSCg3p+i4N7dnt3d5qdl3qJgoZpdn17bIOEkn9xjoFwhYJ+gX9wZmxnWF1bXFtTZHBkXldicnVpdXBlZWJXXFxogHBvcoBziWRkeH5pdHVzcoGDd4CDeHZzdW5renFiZ2tnhnSNg25mXV99cHuJf2lteWdqZFVXcm+NpnyEe3aWkXR9c317b318kod4mn2Ih4OGg311b3FsZ3RcbGdebHRkZ2Vpem97cllngXd1aHCBeIJ2YneFi3yUgW+Mam17gnFnc2Zhbnpnc3iLfH5id4N3amxydntxe3p0fmd/f4B5d29kZmJthXtsalVoYm9SSmhqT0tOb0dde2ZhTVV0Y0pOU1dhanZ+ZV1nc2lmYFZjV2JwXUxLalhjYVVUVXNWTFh1ZFlea2BcWmNlX3ZnbWJwaXNvcn51dJmCd3+Ad39/hoV6fHSChH6XhW5ydHx6dHGEhY+BgHqLdXSQf3yBlY6AhYR8fYyGe36AdnujpYp5iIWEa3V8enWDgIt6boRzeYR8gYN1bmpoZVZdW1paU2JtZFtYYXN7aWhtaWBiV19baoBqa2+AZ2tgaHl4anN0c22DgHp/fHV0bXpoanlqX2VuaIF2kIRoZVhid2p+h3tvanBnZl1UWG9njqh3gXp8kI56dnF/cHR3epCBeZZ1hoOAhYh2anF1Z2duW2xjXW1yX2dhanhoe21bboJydGpvgX56d2F3hYR4j4VziHJveYByY3FpXHF4ZHJ0iXx5Y3SAcWhqenVybXl4dnlkhHx/eXdxZGRjbnx8ampUaGFlU0prZ09HUWtFYHhmYU1Tcl1KTVRaZWt2emVebXFpZF1WYFZubldLU2hXZV5YTVVsVEpceV9bXmtdXVtjZWB5aGxgb291bnB3dXqYfXZ/gXmAgIeGenh5gn6Bk4RxdHR/eXZ0hIiRfYB8kGtzlYB7gp+Ffod9gH6GgoCKe3aEq59/eoiHg2tygXl1gH6AdG6Gbnx/c4qAam9tZGRYX1pZWlRhamdbWl50gmlebWxcYVdcXGyBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cmx5Z2l4Zl1lc2d6d5OBY2NUZXBngoV3d2dpamBXVllnY4+nbn53gIuOe3Fyfmh6cHuOfXiQcoR+f3+GbmR1cmRnZ1xqYVxvb1xnX211ZHpoXXSAb3Jrcnx+dXZidIWLe4iHgYB4cnV/dWFwbVtydGNxc4V8dWVzgG1hbXtwa2p7eXZzZoZ2e3t2cWViZW1yfWlrU2ddXFRLcWJQRlZhR2J2ZmFLVG9XSkxYWGdrdXpkZW5xZmRaV11YdmVUSlxiV2dXWUhXZVBIYnhaXV9sW15cYWNefmlqX250eG1wbnaDl3lygYB8f4mMhn51dYZ5h4x8dHV1gnl6eoKMjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj62Me3uHj31kcYd5c3x6dXJuhWx7fmyPemJwb2JlXWVWWVlXY2ZrX11ccoVoWHBuW15YWlxse2Nwd3VsYllsc3NndHVvbIN4fn94dm1udGRpdGVbZ3VmdnaSeV9dUmZmaoOCdH5iZGlcVFddYmOPpGh4dIOGkXltcHtpeW58hnx2inOBeXx4f2hkdmxgZl9eaV5cc2tZZV1vb2J6ZVt3fGtubm94eXN1ZHODkn6Hg4l7d29yfnNieGRccHBicXKCfXRncoBlXm53aWVoenx1bm+CdXR9dHJiX2ZubnxkaFNnWFdTTHZfUEpZWEhidGNhSVRtU0pNWldpbHF7Ym1sc2NiWlpbYXdcU0xjXVhpU1dHWWBNRml1WF5gbFtbX2JiXIRpZ2FueHlsb2p2gZB4bYN+f4GTiISBdnOIdIyGdHJ2dYJ3fH1+jJCAfpN+cHeVg3yZknmAgHh6foB0iIN0cJigent/iZR4Y3WHeHN3dGtzbn5reHxwkXJecG9gZ2JsVFpaV2hjbWZcW3GJZVNybltaWFhgbHZjaXVqaV5ZbXNwbHNzc2mEfH5+e3ZubmxkaXFjW2tyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJF0bGx7bnBxe319c4F3gHN6enpkZXVoXWJZYGdaXnZoV2Jdb2hhd2Bbe3ZpanJueHNydWhxgpWDh36EdnNqcX1uZndYXWxuY3JzgXp0Z29+W2BwcmJga3J+bW11f3NxeGtwYVxlbGx5YGZSZVRWUU90WlFPWFFIY3NiYEZValBJUFpVa2trfGZub3FiW1pYWWxxV1JQZldWaFNURlpcTkhxdFhfY21jWGBgYV2LamNkbXl4a3BpdXmGe2uDfX+EmnyChHl8h26Ph3Jvdnp9dIGCfIuPgoKXdHiBk4WBn4l1gYCBdH+CcYeCdW+hlnN7houGemV3im5tem5md3B6a3N2coxrXnRuYWdla1JdW1VnYWxrWlxwjGRPb25dVlhVZ2l0aGJ0ZWRcWG10bW91dHhqhnx/e4d2j3NjZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1jX2NTWl9ZYpWVY25wg4WKdGtofHBmdHh1fW16dXZwen92X2VyY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGlzcXRwdXZrbYSTgYl7hXFzZ3B+cXNvVFxna2ZxdIF3c2NtdlZicmxbX3BnfmZtd35zc3NrbWBaZGppdl5mU2NUVVBTbFZQVlNPR2RyX2FFWGlOSFdUVm1oZHxpa3hrYlddVVt0ZFNSV2hRWGVUU0haWlBNd3ZaX2VsaVliYF5ejm5hZmt5dW5vaXZ2f39sg399h5d7gIeBiX5rk4hyZ3SAe3V/gn2Ijn+Lk3J8ipGFh5+Ge3+GjHOBhnN9gnZupItygY2LdndseoxgZHtwZnhyeGxtcXaCZ2R7bGNmZ2hTX15VZ19sbltebY1oTmltYFRWU25ndGtleGRkXFhvc2xxendybId7f3abenhrYWVsbV5gb2plcHl+Z1pWWGBseHx7cIRfYl5nVlhfV2ObiGJrcIGHfXhsa3luXHdzbXtqdnRvcHyAc1hpbV5YXFVhYldkcGNTXmFoYWJsWmB+a2Zrc3ZvbXd3bGmFjH+Je4htcmdxfW5zbmRaYWlpb3SCdHNeaW1TZXFlVWNvY3tkcnd8d2twbWtgWWFmZ3RcZFVgVVJOV2RSTltPT0dkb11iRllpTUlfS1htZGB4aW5+ZGBVX1RddVxUU2BmTl1hVVNKXFlQWXR1XV9lbGhYY2FbXo1xY2dqeHFzbmh2dHqDcoKCeoiOfnyJh415bpCKdWxzgnR/f4eFhpKElY95fYyPh5GbhIB8jIVzgIFzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2MjIyMjIyNjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjIyNjY2NjY2Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQVLM2tjY2NjasJ2goKCgo4BjZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUyRtjq5+fn5+m2oKOkpKSnfFxfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGkpSUlJSUlJCPj4+Pj4+LiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpKTj46Mjo6Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2LiouLi4yMjIyMjIyMjIyNjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkJCHiYuGjIaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQjYSKi4aOhYyPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJGJgoeNhoyJiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjI6IhoeGiIaJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNkI6MiouMiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2doaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fX5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz49Ojo6PDo4OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9P0A+PD5APz09PT89PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD46Pjw/PTw6Pj0/QkJFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBQ0RCPz5BP0FERURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSElHSEhJR0dDREVDRENBVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSktMSktJSEZFR05HT2yEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS05MS01MSElPcHCAhoWEhIWGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l6e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSUtMT1FUT1hsc3qBhYSEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQkZIS0hLVHBlfIOEg4KCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg5Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo8REJERkRdfH+CgoKCgoKFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojo7Ojo8ODk4OTc3Nzc5Ojo4ODc4NTg4O0E9Pj5CQT9BS0xPUVBRT09PUVdrcnJ0dHV3eXt7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxEP2aDgoODhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw6Ozw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj49P0BEd4ODhISGhoeJiIeGhoaIiYiJi4yLiYqKjGw8Oz5BQ0VFQUFBQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD4/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw8Ojs7PDs9PkFAPmKFg4SDhYSGiYmIh4aGhoeIiYqLi4qKiouKi14+REZJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERkVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj4+Pzs/PUA/Qz9LfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKiFdHTExNS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZIR0VLSUtJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3PD47PDo9Pz5APD8/Q0JFQGiEgoWFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLR0VHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ozs8OT0/PT4+QEFEQ0lUfoOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSklIRkpKRUpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eHp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojs4PD06PT88PT5AQkRFTW2Eg4SEhIWGh4iIiIiIh4aIiIiIiImMjIuMjIyLi4uLXlJSUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0VHSUZFRUJAQkJccHJ3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDk/PT0/QUVFPkNFQ0dMdYaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVFRktPTk9XVlFQT1FTUk5TVE9NU0xQU1VXUlNSUExKTU1NS05HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI+QUFFVUxCSUpHS015hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZU1lYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISUhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUJDRkVEREtXUUtQUE9QUXmGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1XXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NSkxKSUlMTUtPTVNvdHZ4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hNSU1QS0lKT1NSUVVWVlZUdYWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU1LSklJRkJEQEE6UFFRV1hQUE9RU1NSVldXV1dsgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU09PTUtKRUM/QDtQUFpaWlJTUU9SUlFVUlVTVl51eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVZSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlNUWl1tcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVVFMSUxJYWySdFBRU05RUlBTW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBDREBDPkJIR1ZASU5NR11pUUhGT0ZERUZIR0hCQ0hHSEpHREJBQ0BOUE1SZHR1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFSUFVZU1VRUVRST1Zga2xzdnp7eHl1cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo7PkA/Pz4+alBKYUVGSElFQj9ITU1HTVFVSkJFPz48PTw9PT89P0FDQj8/PD1CPkpNRlVvdXZ2c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yaW1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBQ0FbXE57Tk9PTktMTU9PUExLTFdOSUdAQjw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dnZ1dnd5fHx8fXx8fHx+fXx9fX19f39/f39+f39/fXh1d3p7enZ5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfXl9lYF1ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RVlBNSUNGPjo5NjU4Njk3OTozNjU3OTU8Qj1mdHV3eHd5eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx5eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1RUU1BRVU9MUlNUV1hUVFhRTFdZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9NTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk4R25ydXh5ent7fX59fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTU1MSkZQUFVZU1ROSk5PVFNUXFZSVVNTT01MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhYWVlZUlVPSkdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBQT05OTVBOVFJQUkxJTEtPUVBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFAR1RRT1BQUU5RT1BPTEpMTE9QTk1QUVFOUE9KTE1NS0dFRURCOz09PDk9RzY2NzZEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZ1NRU0FHVVBQUlFQTU1OTEpMS0xOT1BRTE5OTUhMS0lLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QUBCPT5FSEZERkZJR0pKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT09MTE9NS01MTU9OW1ZKTVFPR0lIRElKTExLRkZGRD9DQz49Qkc/Qj5BZHF0d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVQTU9OV0tMTktLTU1MTEtOTlNkTUpMUklJSUVBSEpMTU5LR0lGQkJCQD9FRkVIRExvcHd6enl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0dLRT9CPTk5OTo/Qj88QUJBQURER0tGRElJR0dIQ0M/Qj8/QEE9Q0VDS05RVEtKSU1URklJSkxKS0tJSkxNT1BSUEtHQ0xHQ0NKSkxNT05JSklHQ0NDRElKTUxJWnNueHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEtDRkdHR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QD9CRUNJTU9HSEtGSEtESElLTUhKTEhJSkxKTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbmp3dnZ7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZHBGS0NGRUZERUVGRUdDQ0A9PD06Ozo6QERBP0JDRUVJRkpKTEZJSUdGRkRCO0JDQz4/QkNDREdMTkhLTkhESERJTE5NR0lMR0ZGSUlMTktKSEVPSUNHTU1OTVBOT09NTElISU9TUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VFRUJCQUVAREI+Pz46Ozs9Oz0/Q0I/QUNGR0pHSklMSEdHR0ZFQz89RUVCPkFDQkNFR0hJR01QSUZGRktOT0tGSElGRURESUlIS0lGSFBLREpNTFBOT05PUE5KSkhNUlVVUk9XZGFhbWdxcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdERUdDQUBBRDxCQT5BPTo6PT87Pj9AQj9AQkVHSkZKR0lHRkZGRENCQUFGRkNCQkJERUVHR0hGTFBMSU9KSkxLSUZIRUZFRENJSEhLSkdLUk1DT09OUVBPT05PT0tLS1BVV1ZVVFlgX11pYW5pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNRkdFR0FCQENEPEFBQEM8ODo9Pjo/PT9CP0BAREZIRUhGRkhGRUVDQ0VCRElGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTk5QTUxOU1dWV1hWWF5aXWRgaGJqaWdrX2RlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRUU8QENCRDw3Oj0+Oj46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhFS0tMTE5PUlRPSVRVVFFUUFFNTlFOTVFXWlZaWVdaXlpYYWBgYF9oZWNgZGVnZ2ppaGpmaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQUNIRTxARUJEPDg6Pj49PDxCQjxAPkFCRkNFQkJHQ0NERUZGR0dJRkdLSENJSEdJR0ZESEtJR0tITUtKS0xITEpNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVFlaWVxaWlxfX15gY15cYWNrYmBkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSEtISkVCREdFPEBHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRGRkhIRkhHSUtKRUpISEpIRkZMSEhISkdMTExMTElNS01OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBhZV1kYGZnYGVoamNzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvd0lKS0lLR0JEREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRURGR0VJRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tLTUxKSk1MTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXF5gYGFhYWBjZGViZGljZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3d0dXV3dnV1dGVxc2twcWpydnB3SkxLS0xHQ0NBRDw/RUVFQz1BQUNCQkNFQUNEQUFFR0NHR0dGRUlGQ0dKR0dKRklMSElKTUtNTEdLSUhLS05RS1JRTFNNS05NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGZiYWNpbmhjaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdFQUBEPj5ERUZDP0NBRUNERkNDRUdDQklFQkhJSUdISkZES0pHSEpISUtHSkpOS05LSUxISk1LWmZKZFxLbFJIT01fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsa1Vfd3ZpamhoZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDQ0JFRURGQkZGR0NES0RESkxLSUtMR0dOSkhKS0dLSklKSk5MTUxMTElNTExbc2JkcF5sbFVNTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXHB1Z3FNS3J5dmthYWtlZWx4bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQj89QkVHQkZDRURFRURCSEhHREVLR0dLTU1KTUxGSk5ISktKSUtKSklKTE1OTU1NS05NTVtyb29ucHBsa01QUWxYTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBcYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dIRkVFQkFCPT8/RUdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklNS0hKTUlLSUpKTk9OTk1MTk1MXGhkdV1scVdsTk9RblVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZJTEtGTUtMUlJMR01NSE5KSUhOSEpKSEhOT05OTEpNTUpac3Bwb3FxbWxPUVNvWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqW110Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNFRUVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklJSkxJS0pJSEtNTU1MSUtLS1NrYlppXl9qY3JyWl9Za29gZWVVa19jW2FiUWBtaFxqXG5paWRab2VkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JJSEZJREVERkFAQUVEQ0dCSEpMR0ZER0tMSUVGSk5LSU9JTFtRSkZISEtNSUhKSktLSUhKR0xLS0tHSEpKTExMS0lLTE5UW11UUFVNUVBOT09VUlBPUU9PUUpKT1BRZHFpVFlWW1tcVVlbXVhdXFxjZmFhZmJjZl9eZmttaG10eHJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdIUEtMT0tMV01JRkVISUpISUtITEpJRkhISkdHSUVGS0hJS05MSU9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRkpKSkZESEhQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHRUVKR0JJTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY19ZX2JbYF5bVFlYWl9eZGJiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURHS0pKREVJSU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVDREVCRkpEP0lLSE5bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJhYmNjZVpSWFZWXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUtEREpKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRERAREFISUE+SElGT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFRXV9hY2NjY2JcZGJhZGNmWFFWVVNcWFthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdJR0dKRkZGSUxKTkVESkpMTkpMSUtKSElHQkhIUU1LS09NS0tJSEhFRD9FQkhIQUBGRUNUXVleWF9YX1tdVVhYUF1dUUtKVl5YXltdVlphUlJfX2JiYGBiYmBjYmFkZGJYT1JSU1xTXF5dXl5fX2BkaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtJSUdESEtRT01MUExMS0tJSURFQUVDSEZBQUZEQVZVRVxUXlNWYFhOVFVOWltNSktUYGFbX1hfXmJdT1liXGBgX2JjYl1iYldfX1RQT1FSWVNeXFxdXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUURXX0lHR0hERk1KUFBGSUlKS05MTEtNS0pKR0VJTlFRTk9PTU5NTkhLQURBQ0RGREJBQ0RATEhCTExQT09NRk1GRkhJSEdMTE1PUElMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlFVVFxZWVteXmFhZWZjaGRrbHFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5NR0hZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tPU1NOUE9OT09PSEtGYEVEX0xEZmNDTFtIXltzbU9OVm1ZTENQX1RsV2dKXVdVXkRMUVVMTVNWUVJUWFdUWFVUXFRQZlpoaGRZVGtUWFdVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entLSUVGRkhFRUtPVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPT0pMTUdITVFbWU9QUE5PUFBJS1F/UUl8WVlyc1dQbUhxbm9hVlJycXRPQmtzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl9WVVd/aXR1dV9hdmBZYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoOEgn99foB2eHptdn50eH6AfH6AgYKEfICDen+Bf353d01JRUhNTUJETExHSkxGUlZMTE9IS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUUtJWnhdVHhkaFlSU1B2Z3RscGJuZ2tRck9Md21qcnBzcnFycG9wgF1menV4cXF6cX5yfWt1fWJSZ3xlc3Nvc3N8fW9+eW9/cl9gYGJiW2FgaGtua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUU9NTkpOVl5ZVUxRU05ZWUxTU1JOTE9JUVJUWVdXUVRQUFFTTEhneGxjeHFtWktMVHlwdW11Ym93UWRkSWV2cW13b4BqZnh4aVdyUml7bWlqenp9bHh6f3Bnb1h1dWp2dXCAYXNofGlseHxvX19fY2JcX2RlZmlqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NydXl+gXN2em58fXl4cm5NSlJ0TkNCRVBQSUtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlNKS3JvdXVxdXFkaGFWbkxxcF5HaHlXdlRLaHh9eGB5e3NuYV5tb2RTZ3J1bm15cHdsdnN0cWxtXHN9emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlBLTE5LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUUlSbUhpd0tgZHZ1VVdsTm5se3Jhamd/dVRLV2tofWxtbHhgW3B6e19genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsaG1tcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUE1MU1NST1NSV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTlBVTEtLUlNSUlJPVlVRUU9SUlhYUE5QVVRYWFhbW1VTU1dbV1hXW09SVFdXWFFdWFZdVVNPWFJWV1dYWmBbZ3JeW1tbXV1fY1pfY2NlZmRjY2JaY2NnZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTVJRUExWVVRQVFVYVVpVUlpdVlVUV1VZWFBPTE5XVFBOVVNOUE5MUVBLSlFRS1FNSktPUVRSUFFTUklJTU5PUVJQUFFUVlJYV1xXU1NRUVVVVlRaUU5SUVdVVFlWVFlVU1FVU1RVWFlYXlpfYV1cWlpdXWBjXF1iYmRnZWRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFRTVhXVVRWWFdXWlZUXGBWV1VZVVhUUVBLT1hTUE5VUU5STkxTUE1OVVNOUU5NTlFTUFRQUlRUTkxOT1FUVFFRUVZXVVlaW1lTVVJUWFdXWVtTT1JUV1VUWVVWWVVRUVdVVlhcWltgXVZZX11eXVxdYGFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRT1JYU1FRT01PU1VOV1FUVFVPTk5RVFVVUlJSVFhWWl1cWlZWUVJXWFZbXFZQU1VVVVZYU1dXVFJRWFZWW19bXmBfVl9dXmBcXGBgX19aYmJkaGhlZGJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9NUFNSVVpVU1BQTFBXVVFWUlNSWE1PUFFUWFVUVFNVWVhbXl1cW1ZST1VWVVtbVlFTVlVWWFRTWFpUU1FZV1ddX1tgX2BWYlxgYV1gYl9cYF1jYGNnaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOT1dTTlFRUFJUUkxRVFNZW1dVT1JOU1hVU1JUUlJaT1FTU1ZbVlZWVFZaWF1eXFxeVlNOVFZWW1tVUVRUVlhYUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGdeXGVgYWBhY2RfYl9ZWl9bXFtYWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dXGBcYFVcXWhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVpaWlNPU1FVVVVTTlVRUlpSVFVUWF1XWFhTWFxYXl1ZWl1UVU5WVldeWlhRVFRYWFhTVllcVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl1eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBbVVVXVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVNPV1FTV1NXVVZbXVhbWVVaXlhfXllcWVJXUllYWV9ZWVJUVVpZWVVXWVxVVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGZkYl9kYV9hYGJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hSV1VTUlNXUVNWVFhYWF1eWF1bVV5fWF9fWFxWUVlVWVpaYVhbVFZXWlpaWFlZWldWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmFbZmNoZmNmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWldUXFVWV1lXVlxgYWFjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlRSVlVRU1VXW1tcX15aX1xWX19aXV5ZXlZTWVhZWl1hWV1VVlpbWltaWllaWFlfX2BgZGNkZWViZFpiZmNnZmVeYWJgY15jY2llZGdfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllVWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVVNVVFhdXV9gYF1hXVdgXlteXFteWFZYWFtaX19aXldYXFxdXV1bWlxXWl9hXmBlZGRmZmZiWWNmZWhnZF5jYF9lY11maWRlaF9nXmNiY2FhYF9fW1hZW1laWlhaWFdbXFpbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXV1dWFdbW11dX19cWl1jWFlXXGBjZF9SWVlQV1ZXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXV5ZWFVXW1tgXlxfWVldXV5eYFxaWllbX2JfYmVkZWZnZ2JaZGZnaWdjX2NeYGZlWmlpY2ZpY2ZfYmJjYWBgX11dWlhbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFdaYmVjYVJcWU9YVllbWVlXWlpgXmFiY2BhY19cYl1fXVtfXllZVFhdXV9fXl9bWl5eYGJiXFxXW11gYmJjZWRnZmVnZF1lZmhpZmNhYlxjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGFfY2JiXVxbWldYaXFgXGBfXVxhY19dWFljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJeXFNcX2BjZGRmZWdmZWZlX2ZmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7fHx8fHt8e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x7e3t7e3x9fX19fH18enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiodzcXJycnJ0PigrKysqIovb0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMiXJvb29vb3IyFxsbGxsQju/l5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl5eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8enp6enp6enVzc3Nzc3N9hYSEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z2eHl6eXp+eXl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7e3t7fH19fX19fXt6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3d8e3p8en17eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3eX57eX15fXp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d7fnx5fHp7end4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7fHx9e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5d3h6e3p5e3h4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn1+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKAgYGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGCg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhoSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBf4GBgICCgYKCgoGBgoKBgIKCgoKBgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgoGCgoODg4SCg4ODgoCAgIKCgoOCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIKBgoaFg4WDg4SEhIWFhISFgn99fX1+goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISGhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4KDhIWFhoWGhoWFh4eGg4B+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhoeHhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SDg4KEhYSFh4eFh4OAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoWEg4SCgYGBgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4WDiIiDgYGBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhIOKjYKCgoKCgoOBfn1+fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4OEg4SRkpGOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFhoiLioaEhoSChoaCgIeGg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKBgICBf31+g4ODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+f358fH+Dg4KDgoOBfX1+f4CAgYB+fX19fX59fHp6en+CgoF/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBfn19f4CBf39+gICAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB+fX59fH1+goODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAgH5/fn5+fH5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gH59f4GEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKDgYGBfoCCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4ODgoKCgoKBfn59fX1+foB9fX19fX19fXx7enp5eXl5gIKCgoSDgIKDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHhoeIh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFgH18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImIiYeFhoWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBg4OCg4KCgYGAgH+Bfn99fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjY2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foGTkYyMjY2PioWGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6AgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f35/i5CNjIyOjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH6Afn5/fX+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSRjIuLjo2LioaEhYSEg4ODg4KDgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5/f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e317ent7e4CGhYKEg4J/gH5/goKCf3+Cgn+Ai4+MioqMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fXx6en16foJ+gYOEgoGCgYWGhYWGhoeGgoSRjoyKiIqHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYuJi4mFiJGNi4iIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3t8e3x8e3p7e3p6ent+foKFiIeIiouLi4mMkI2MiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjIqIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fX59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjYyJiYaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fX5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImMiYuHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgYJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBg4F+foCAfX6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iYmHiIWGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGCgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH6JhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIaChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChICCgoKCg4KEgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgn9/gH+Bf4B/fHt7enx7fIGAf4F/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH5/fH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f319gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fXh+f398fHx+fX6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fX5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXd5cniFhYWFg4SDgoKDgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgoB+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhoWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/f4GAfIB/gH5/gYB/f32Af35/f359fXyAgICBgH5/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn5+fHt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcnB4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYF9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+gIF/gH+AgoCAgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGEg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhYODhIGBg4CCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5eXx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCgoaDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgICAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aEhIODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/g4eDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIB/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWLiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFgoGEg4B/fn5+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goR1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3x/c4KDf4ODfYF9fn59foKDgXx/gH1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4aDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2enmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfX9+fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhoWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWEhYaGhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWEhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGg4aGhYaFhYaGhYSDhYWChYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX59fH18f3x+fnx9gYB9fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaFhoWGh4WFhoaFhIOEg4KEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFh4WEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4KCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWDhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WFhIOFhYeFh4aGhYaGhoWGhoSDhYWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx+fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoWGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fH9+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFg4SEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N+fn+Af3+Ag398gH19f4J9gIF+foF+fX19fX97f3x7enl6enl6enx5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoWDhIKFgoWBgYB/f4CAfn+Agnx+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn59fX9+fn+Efnt/fHyAgX2BgH19g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58foN+fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXV1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1NXV1dXV1dXV1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fY3N3d3d3d3d3d3d3d3d3a1tfX19fX19fW1tbW1tbT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5s3hzc3Nzc3Nzc3Nzc3NwlMC8vb29vb29vb29vby/0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpZkyKSsrKysrKysrKysrJGSwqaqqqqqqqqqqqqqosNLS0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKabOC8wMDAwMDAwMDAwMCposqurq6urq6urq6urqrHR0tLS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamroEU9Pj4+Pj4+Pj4+Pj45cbSvr6+vr6+vr6+vr6620tLS09LS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHKysrKysrKysnJycnJyc3T09LS0tLS0tLS0tPS0tXU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7Oz9HO0dTU087O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW2NfX19fX19jX1tfX19fW1dbV1tbW1tbW1dbW1tbV1dbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7O0cGn1K2Dg5XP0qSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Pz9GdkLmcvLiZtbOfoanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pz9O6r6yspo6AjcafmJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw9OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz8/Tn7GeqKGJrNa6mKGdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/RwJyJnaSqrJulspmWr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxCQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P1KOigZ6tpJyVqJCahZ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ozo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0cSfgXuWraezq59/n6mFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NWrr7zAz5TI2cGcgLytppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT87Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyYd/haCXj6Cfn5iolpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhxtPT1ZybrKWrop/DoKuknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNLR0teoh8+pjo6t2MKPjbvV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHSz8XU1L+/1dLVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo8PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tPU0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5ODQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj87ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ozw5Ozs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg3ODQ7Pzw/PTk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODc3NzY0Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODU1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpqbm5ubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOzMvHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raGd1WmZyd3N4ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yc7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcLGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vbq6tL+4tbezr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYlxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysW1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5hYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3LxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVteXVlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcPDu7mztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVxfX1lTUEFFSUdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZVxaVUo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7KysrSyt766s7WyvLq8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU9IQT89SENGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6trSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BP0pCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCyse+wLi5trK0trO0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZNRjg2NjU6Njo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub21sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u/v7m0tLOxsa6wubm2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtq6mur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLfAwb68vLy5rq2vsrK6ure3tbW8tK+0q7a6uMDEwbu2vL24sq2zsK+srre2s7S1r6qknpucnJ6oqJ+gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lopujnJWQjI+Pj5OQlpWWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTExCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxsK6vsqemsKSvrrXBurW3sre2srSrsrSuqquvsLKzrqWekpiUj5mgn6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaeeoJyVk5CPkZCYkJaVmJefmJuZm6OZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0RAPTI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmjpK6lrKy0vLessrGvsa21r6+ztaqnrayjnJmUjpKWl5mZnKCjopudpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqa6yq6WqqqCamJiYlZOWmpOVlZmWmpeXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDg+QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yeo6iurayrq6+qr6mfl56lnp6lpqSgop+moKKuq6yttbK2pq+0q6mqtLGwsLitp6GcnZqUmJqakY6RlZGMj46UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysbSpsa+imZydnqGZm5uamJmblJWblpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVUxSTEE3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOenaCfo6Cir6+sr7Gstqetsa2mprCuraywqKCfoqCXkZScoZyZmJKTn52ipJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rLG0o6CdpaCsoaGioKCamJaVn5ubmKShoJ6koaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQk1HPUpIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm46Tnpmona6ep56coZ2empqSmZ6coqKgoJ2in5+en6msp6ypqrSrq62rpaWrqKqsqqWgnpmSkpSYmZeWloyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaGroqmosqmqqKeompmdmqqnn5mnoJ+fp6ilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7CmoJ6dnZeYlpmem5ykn5+dpJ2anZyloqSjoqqvrKepo6ChrK6uqqunoJ6eoqOen56anJyUk5WUnp6YlIaemqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvri0u8bEvMK7t7Opsq2qs7Svs66qrqOdq6e2sayir6Wgo6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t1cnBoV1tRRVRIRElPSD5FQTNFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6WdlZubn5qenJ6lpqedoKCrsa6npKSjoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK9x8bCt8PJyMLAxb65tLm6tbu3sLWyqrqxrru3vrq6qretq6q4urS8rq65o6ajnqeloqOpppqbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfXpya2Rob3hqZVpbRkpMRERTTERCRDc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZWalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKfn5CWn5mSmpadm5mjoa+zqaGanZ2fn5qXmJeSjI+Wl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMjJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM09DT08zKwsXGxsrHzr/J0MvGxMbEwbvDwb6+vrW9s62/v8LDxsTHxK6/uLK4vMTBwbq8vLWup6euqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQkA1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6Osnp+upqWxqsXGzM7Nv7DCqaWora2qoZ2jn5ydmqmTmaGQjqCTjZSSl5mksbGrpKCdoJuZl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV19LXzcbHyczDxcrPytPX0dfS1NXT08jMx83NydLMztPNxMfJysHFy8bIyMW+wrOzyMTLysrOxcq/vr+8wcfEzMzIycDDv62ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3pydXVnY2d2aWRWV1FETUZASVFCPUI8OjIzQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOepKOfoKSsm5aployWjYyNl6awrqWdnp2hpaGem5WUlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU08/Sw9DT1tfV1tLLyc7Ry8bN0srS1dbZ1dfT1tjO0snO0czO0MzSz7/HxsrDzMzLzs/Fxse2wMq/0s3Lz8XJyL/Dw8jOzM/Qz8zKyM64t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx3c3ZvY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ojc2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKbqaaipquao7Cxqai10NTX2tLHxsu0tsLFsrapoqWmoaKrtaeasaCYnYyQpq2rnJWYoZ2boaKfnJ2blYp3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUz8/V1NTR0szRztPX1tPV0M/S09HJ09HI0NjX2NHX0tfZ1dbMzs/JzdHLzs+/xcLHxc7N0dDRyMvMwMrLxdTOy87IxMnGxsjMytPT0dXP0szSwbnFsqWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjQ0Oj01Mjc1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpoK+uqqqsnqauuKirt9jU1dnZ0c7QwLzMybfAr6erqaOksbazo7aqrMOnqamhmJaYmpudoZ6anZ6UfnJlY2JfX2FgX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L083V1NLKz8zT1tLR1s3P1dXRxtHUytHU1dbO0tDY2NjXy8jNw8nOzMnLv8i/yMnNzs/L0M3Oy87Px8vP0MrOysLJxsnMysvR0szT0tHP0Mq9yLmwrbu4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wbmthZG5wYVdcWklGRkRMV0U7QDwzMzw9ODY4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PT0/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+jp564trW1raWtrr60scDZ0tfa3NfPzcvE09DCwrKrra6sprOyuauyvMaioZyWlJebnp+fnZSWl5WJbF5eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1crAysHFzMLIycLMw8XIysrOys3M0M3Ty8XIz8zIx8rEx8DFycvN0NHG0M7NzczPxcfAt7m9w8O9w7mys76xvMTEtaqYpaKZlpGVlpKLlI2akZSUj4+UgomFeHBxa25oYGBxaFlYaFZNR0xJUFBCO0Q+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3Nj88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHw7nL1dbZ2tvYzc3QydbWxcS4sraqpK6submxssSslo2NmJaQk5KRlpaWkIx8ZWJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrRyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/GusS+xsm9wsfJzsTCx8DHzcfDy8rLz8fDw8/IxsHFyMO+wMfLy8zOwsrLyMfL0MTFx7vHw8jIws/Avby/scHKx7q9qrGyp6Wdop2YkJqQpJmXmZGVmImPgndudGRsYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbOxrMnNysjEvr26zc3H0NXW2drb2NDK0NDS1MrFur6+sKi3q765uLOlkY6OlpCGg4SEgn6FhX90YFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7IxsLDwMPHysnIysfBxczGyMvNycTCy8nCwsvQxMvIv7nBu8XHvb/Gz8vDv8O7ycbIu8jGxMrAvcHLxsXEvsW8vL/DxMvFxbzAycLFx9LFwMi/ysrGyMbQw8PGw6/Ey8fEyre/vLq0qaylpZifmKyjoaWao6CblHt2c3Rmalthbm1aW1hRRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzLz9HMx8LDx83Pz83W0NbZ2NnQzdTOz9DLxLjGwba1vLHAtrqtkYyTl4d7gIWGgHZ4dXJwX1pbXWBhYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrG2urKys7Kxwry8u7m4wMHBxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw768wc3Cxr6+tcG9w7q8xrvCubO8xcPCwra/tbW+v7rLw7y1usi6v73LxMHFwsbIxsjG0MbCzMiyx8rDzs3BxcPAvbO3sLOoqKi5saWtsKutrJR5dndqZWhgaG9jVl5ZSkVKRkhLQUZCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Oz9LJ0cfW1dbYzszQyM3IysW+ysGytbq3uravkY2Ki4V5gIaGgH6EfHR1ZFxcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i0t7SzsrO6tb2xt7C1r7K7wrzBxLy/u7Wzu77AuMe5tLu2wMK8uL3GwcO8ta6ytrq+tMW3u7WruLy9wL2wuravtrqyxby2r7u/tLa0xb2+w8XAw8XGyMvGwMbGu8jLv8/Kx8PGwsO3w769trm+x7+stbq1t7aOeHR4Z2dlYmtuXlZeYEZLSEhKRkJDQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzc7Jy8nLysvG0c/T0c/IysbKxsTAvc+9s7i9ube2m46HiYl7eX6Ghnd4gn10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+4uLWwq6ynnqKqp56rrLOtqaups622sLKprqassry6tsO5urqxq7W5u7TCurC/sb29u7a8yLnDt62qqLCywLa4vK+wp7GztLu8q621pq62rrqxsKq5r627rru4u7+/vbnCv8fDxcG8xsHIy7jFx8W/x8TDusTGwrvGyczLs7nCvLqyiHJ2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PTlBPT9APzw+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbO0szExsHF0MjPw8THwcbGxcXMw8rMwsTBx8C6vLvKt7S7vbW1q5GJkJB8eX6KhXp7hIF3bl5dXV1dX2BfX2RiYmNjYmBfXltbWlpdWlpZWl1lbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwo6afqq21trG9ua+3r6iuuLS0vLizvK+4ubWyvMGywa6lqaKrsbKzqLyqq6irrK20tKaorqGkr6mypaeorqWot6ywsre5uruxvL2+vsS/tcHBx8i3v8DFt8TCv7u/xMO+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFpSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe6xLC2sJuZlZyYqqmwsbO1va/G0dDNxMi7u8zDzMC9yri/xcC8zLrDxsW6vMO9ube9xbi1uLuuspWDiY2Be36Afnh0f3xzd2ZfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnqSbl5Gho6qjop+lpaelrKCdm6SmrLKvtrensKynqrSrtLmwtrSttrmysLq5sbekn6OfprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6SfoLGtrayytLK0sLW8trvBwbK6vsPBsrm6wrPAvb+1uLu9vrzCx8TCw7+/xKCDd3BrYWZfa29gVVlfSE5oT1RIRUpGPD1APTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc3ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG7vrWgnpWeoaa6tquzs7uzxdDJzMPHubjJws7Busu5vci7t8e7tsPGs73Fu7avuL+7sLK2sKKEh4eCfXl2dG9ta2pqcWlfYF1cXF1fYF9hY2JgYGBgXVxbXFxYWVhYWFZYW11eZGNiZWdnZ2ptb4idqaCXlZqhlpuimJWNnqGippufn6Oloaeem6Kbn6qwrbG1oqmqqauspLW4rbevrLO1rrO1rrCqn52eo6KypKapuK2ipqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqusrbCyuK+4ubuwtru7uquysrmyvbS2sbG1tL+1vcC9w8G6u72Xg3pya19lXmRkWFRYXklXXUtQR0lKRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZm6SmwLKvtqy0t8bQycnBx7y8xcXQwLzKurrCu7XFuLXAwbPBw7usqbS5t6ews6mLhoiAeXNucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1pbWVhXV1dXWFhYW15iZGRlZmZoaWtyjaidlJSUm5iboZaWkJyhoaidm52lpqGlnKCgmpitrq2usqCloq2rp6G1sLGxrKivs6e6s6a2oaKem6OhraOhqbWqoqOmnaWmo5aYnpeZmp2fmZednJybrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7KysrezrqmsrrG3sLq2ub2/t7KxlIV5dWVfZV5bWVZTWlVLW1FMSUVIS0lCPT9BQUBAOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vr2/s52lo5ilscK1tr2ttLjDzcnIwca4wsHI0LnDx8C2vL22w7q2v8C1ur66qaawurCnsa+bfYWFgHlwcXRxaGZkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn56pnZuaqqavsKubo6O3qqCfrqi2qaanrbCkt7Ckt6Cim5iYqqahmqy4sKKhpJyhn6CTlaGUlpabmJeWl5yUn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysa+wrq+mp6eyrrG0r7y0ubeuo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xLRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6ep6ejqrvAvcC5rrS4ws3Ix8TFvse6ys21xMXFsb+/ucDBub/Aubm8t6emsLulqKCkiYF+eHJqbHJ0cGloZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbXFpYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSmp5+cn6Sfqq+mn6KjtqigoaKos6Glp6SvpbGtrLWeoJ2VlKmhopSssbGeoqKdnpibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaWrpKWwp6Wjq6utpaiur66rqKqps6Wmq6+0sa68tbGvr6CSenZyZGFcW11YTkxRR1JhTVdQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sresnqSnrbe7vMHFurG5tcXKy8HEx8fJuMjGtcXCya+6vMK7wsDBvbu3ubWlprG1naGJmIiAd29kYmdpaGZoamdqbWBdXFtaWllaXF1cW1xeX1xaWVtZWVpbV1VYV1RUV1VTVFJVYGBfYGFfYGFjZGmBlJOJkY6UkpOclJWWo5mglpygpaGtpaSkoqOhm6qqpZmepbGpoKCcpKqdp6GerK2pqK6toqGilJejm5yPq6mwm5+inp6XmJOKnpKNkpOVj5iYkpuhopykoKGVoKGkppujq6WipKqjq66krrGppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZVUUZRT0haXE9SSlRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDc7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY6ODU5ODk4OTs5QDl7tbSttLuysKyyrZ2np6+5ubPAyLq1wK/Gyc67wsvNybfLv7TAx8ywtr3Hu8HHw72+trm0pKqvrpyZh46DfHVpamptaGpsbmtrbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl9fX2JkbY6PhJGGj5GPmZOUkpyaopyboKeoqqiqpqilo5ikrqSUmaWvqZ+bmJugnq6Zm6qzn6Wmn6OjoZSTm5aWkqiqrZqcoKGgmpSQjJmOi5CMkoyWlJCeoaCjnJuilZugoqCYoqijoqiroKuvpK23paOjoqytqqirr7O4sr21s6uvmIRzc2hbWVlSVVJGWUxQXFlNVE5QTFBSSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTU3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmor62bqaist7asvMq7tr+szMfGucLP0Mm1xr66vsbLtbG9xLzCxMO9wLK4rqWqrqqdl4aBd3hvbmlubm5xZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1dXF5fYGR+jYGLf4uQipKNl5GXmaKgm5+qqaatqqevo6eZn6yglZakqKedl5CPmp6ulpenqpmfnZSloZ6SkJKSk5Wnq6WamZqdnZaNjIyUhoiNg5CLkpSQoJ6go5eVn5WaoKKek5ulpaeoqKCxsKawvKego6y0q66nsLSwubXAsa2xq5B9cXJiVlRVTlJJR1ZRU1JMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurzDy9HMs7m6vsDEx7a0t72yurvDvcGws62wra+qm6KIa2hub3JvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3WJjoeQiZiJlJSXm5mdqJufqqWkqp2nmKClm5KPnqKal5aFhJKao4+TopyVlpWHopqak4uOi5CZpKeclZWXm5CSh5SOjIGLjYCQipKSkaGan6GVlJiYlaKlmYyZpKaopqGgtLKnsrehnaK3rKqtpLKyprW8taursaOIeHJtXU5QUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0tISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6SppaCppaSzqqKyw7W1srPHx7i7xMrNx7WvvL+4vMSzs662oqy0w7m6ramrs66unpanfV5gZ3NxdnFqbmlmaGhqX1hZWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVlhYWVhbXWFvc3ZxhYiCh4CRg46KlJGTnaCPmpyioaOYpJahm5WNh5iajHONgn2Nl5aFkJmQk46Oe5mOnIyCioCKmJ+inpCTmJaEjoKTfn50iY56kIaSkJCdmpmakJWQnY6io46JmqChpKOborSvrK+sn5iluaalsKGwrpywu6qpr6qZgXZyY1ZNUk9QTUNTTkxRTUNQUEhJTlNNSEpKREpMRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3d7eio7SopaWoo6alpqams6eltMG4r7Swysa5usLPx7+1r73Dr7HHsq2nq5Wkrr+3sK+fpqysqpWUonJXVl9oZ2loaW5jamhnYlxYWFhYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXi5OQn5edlZSWlI6WiX+TiV87V297i5SJf4uRjI+FhnOKhJaBeYJ6hZOdlIOVjpGPg4Z9k3hyb4WNfomAkI2Pl5mYk4qPiZyInpeHiJaemqGgl6evqa2pqJ+XrbSipq2YrKuYp7Siqa2jkn1ybV9bTlNSVkxEVEpQTUxGT09JRUxRTUtQSklNUEZJSD03NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXi3oKOuoaamqqCnqaeiqbCop7TBurG1sMnDubS/z8C6sbG4xKuuya6no52GmqK5rKanlaWko6CWjpZpUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l7gnRQQkB/lZGRfYmUjISKjZuNlpWKkoiGlYZ4iH9gSlFueIqShHyEjImEf39ufn+Ud3V2eISNmXBRjYiKh3x+eJR2aHeFiH6KiJWKjZCSlouEioiUhJqMgYSSm5aenJSko6ippaOem7CroaSkkKaqlqGqnKKmqIh0bGVeW0hRUVJNSVVNU0lMTFBJSEZLTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49Nzs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl2tpyjp52foa6hp6ilp6ivraq2vLa4t7PCvLeousm5t6mqt7ittsCqopuSg4+ZsZ+hmYyflpiUkYqMZU1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/hoF7hYySgZKZi497ho+AdX94c251cHSNjoF5fYqqhXl6aHZ7jnBybXiBioySeHqAe4B2c3KSd2d1hISEhHqViYiKjIuAf4SLjH+Ug3uAj5iVnJWRn52pnp+gnqCppZ+dmIynpJOgoJadnqR/cWdgXFxKVk9RR0tYUk9KTU1SSkpKTVBITFFMUlRNRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDw3dq6Yo6GYnJ6zqa+ppayssLGqvbSyvLi2urWyoLe7s6udn62rrLWzpZ2WkpiGk6OWnIuCl4mPiYaGg2ZKSUpJR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWVhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYF2eH+Jj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgX1/dGZ2fIVsb2hzfImMh4BseXF9cG11j3FocYB9jnBDioSCg4V+d3d6i4V9i3p1fo6Sj5iKkpqbo5aZnZudnqKdlo2KpJuPnZeOlpiPdm1sZWJaWFhUUUpTVVRPUE5RVktOS05PSlFPSU9PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+elqCmr6yuq6ipsa+xrLy4rLu+ubOtqJuxqK2ckJeep6ynpJudk4iWfo6VkZWAfIp6hYB/f4FlSkdIRkJAQ0RJTExNUVJQUVNVVFRVVldXV1hXWVlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4b3x5iI95fIuFb22MkXhzeGpqf4JylpGLgX2VgEqSmG5od36BbGljbHmFkJKGa3NsfG5ye4ZobXB+c42Ig4V6fX57dm90dIWCeYF3cHyOjIqTg5aXmJqQk5aXmZeel4yDiZ+RipKMhpCWfm1obW5uV1VXVFFRWk9TVVVUWFVNTkhNSk1OS0NJTkdFQDo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepK2voqyqqLWvrqy0v6u8wr+mo5qVpZiejoWMlqKkm5qTl492kX6Fi5GPfHh+dH14dXd8Zk9FR0RAPD4+QUZHR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqckGZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouIdYGIhnRsmpF0c3tqa52OTHmEkomEjmcxdoZzbH59g3RmZXR+hISFgGZpbHVrcH98Z3Bwe26SjY57c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJWPl46AeYiXiIaJhn+Qh3VpaW5nZFdRWVdYWVtNUFVWWllOSUlFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImZGalqSorZ6yn6a6rquysMOyu8PHm5ePlJmLjoZ6hZGalo+SjpKJdIqEd4uPjH92d3Z5d294c2lVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfW1xg4GFgXmEhoZ5cqCVdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYiAaGZiaW5ybXCDdWlvWHVvjpqRdmx/enxtcW1wf3pzdW1idoR/hoCFkJGKi4qSi5GMi4+DdXiLj4B+goB9j3lwb25qXlpcXVtZWGBfU05bW1lYTEhKRkpHP0NBQkc/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5Wltamtsa7Bs7vBxpeQjJSQgYl9boKRk4qEi4iQiHaEhW+Yiox/eXt7cnx0fGtvXkpQRz5ANzQ1ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH2Fg3+MfnaimXl+hoCEmYWbnGGGqp+dioKQjXp2iX6JiI5zipePg3tcZHF0ent3imxnaWF4b4WPgnpugXdzhHpwc3l3a25pXXeHfYd8iIePgIuTl4ONho2GfXGEf4R8dXd7fYh0bnFyZWZeW1pdU1tmXldRVVldVkdLS0VMRz9GQERDP0FBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHeJf5SMkZ2dn6aRoKugsamvwLK7xrqWj5GUiHqGdmuAjJKDfouFkI55hIJ1ooaNf3+CgHODgX1seWxTWExBRTMxMTI2NjY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUktphIh7iXl7cXyPjHt8iYZ+l4d2oZmIh4+SlKWNrKlIh62wr4qAgJOKgouChJGph4CYmIqcc2x8gYaHfY5oZ2d4fm6FhoGFcYSGR2uAd3F5dmhta193fYOIf4iFjHqVnpyKi4mRf3t1i3Z8d21vd35+cnFwaltcXFtjYlhnZVxVUFFYWlFETExHT0lERkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjc1Njc2ODtERkxNTUxDNysiJicrKSsrKy8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYeRj5aYkpehnayhprivs720l42Si5iLfXRwf4qTf36Ng5SVfYZ/h6WIiYGDiIZ5iYuAdYZ5X2NXTEM2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFUVFVUVFZVU1FPR0M/ODAsI4dbPj85NC5dlnBzo1VGSUtNTlBXYFlwWlxfao2Th5WAhIKFkZN+hYmRgZqWgqChmJWbmqWtk5m7sae7x8OnioyhpY6TiYGQfHKEnp+RnX52hYWLj4eQaWhvg4B0jIaEi3GGgneHf3t2hX1udnVngZWPhomIiImIoqujlomOmIB7gol6em9na3h9eHxxaWNdWlldaVxhZl9aT0xOWFNRSVFLRE5HQ0tEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O252cGd4g3uAjICBkI+Lm5qknKGspquvsJeSkYShlIR4d4CNlH1/koaTln6KgZKcjoSBgoyLgoqOhICLgG1wal5DQTQtLS8vLy8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSElLS0tOVmBjf2dnbnWdm4+ak5OLjY6aiJOPnYugoZKjqaWjrJOotqKowcOuyK94upSafIyhnpiEk4WCj6Gfk5mShIqFj5iRlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhl4eTiY+Pl6W2qZuNlaKDh5OEfn9ramt9fn5/cV9bYl5ZZmpcbGtfWEtIT1NRTk1MRklRRERORkJDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcINwdYdxdpGGfpeWmpSfn5unoKqWk5ieaGakmn6Fk5J6gZKJkpJ9i4WZkpGDgIGLjYmGkYeEiIV4eH9oTlI+Ly8uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw4NTI8P1I1SEhITExNTlJeb4p8c4J9oJ2bp6aimaGXopWcn6ieqaufqKypqrWXq7+rtsjJt8nRz76boHBpq6mfhJOShZyhmpqap5GRiJWimpp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2VnpyOk5aapKOntrCdkpqoiJeQjoGIbHNzfH16bmZeW19eYWdkYGdnXFJFS0tRT0lKTUZGTUNITUZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDU0Njk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmM0FAaWJeUHF1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJiJiNeYKNi46NfIqGkJCPgoOAiYyJhZOFg4aJgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUZIQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKyoqbWssbeysq27sbO+nLPErLvJy7jEv7elo7CyrK2qo4uWmIWmpqCimIKmmY2iqqikh4WTo6CgqqCkqY6csYuVo6e3u5yho7CTo52jnpGkoquwrbO1opWmqomaipOKlXp7foN8ZV5mWmNgXWJjXmZnX1tPREpIVE9GSUxGS0dGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NTQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1hqcFh6hXaBlIWIgpuDkpGMktrInZZzVpeIj4icj3yGjI+LinuIg4eRj4OFgYyGhYiShoKEiYaHh4dxbmFARTY0PDMvMTEwLSwrLTEvLTQ/REFOVlFSVFVVV1VNXFFHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Srs8W2rbTAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbCxm5mSmp+Jp6+qpJV3n6SXoauxs5iWqa2orrW7srqsr7Wisayytby4tK61oKioo6ibqbCts7q4uKicuKmNpY+Sk6CHeYGBc1hfYlVkYGBiX19mYFtVSkRFTFZRSUpLRUpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMXFpRYmRXenVxgZV9hIaTdoZ+gI17v7ujvIK0lJOOm4+EiI+Tiol6h4GMk42HhYGOgIGKj4aAhoiFioeRenluXVdARU48Njo0NkFCNzY0Ly82Q0hDUVxPUVVXVV1XUF9VSUtKQUA/R0tGRkQ7PkA3RDc/QkpKRUdXVFBej6SupLK0w7a4wczKtrvEvbO0wbe4wrW/sLh0sbSmusWksMa5sbOytKiktraqsaCilpuikqWxraWtrKekmKCss7qiqLK5tbu+zL/Fxb29s8K3ure/uLq4uq2tsaaxqq6+sL28w8Osmbuola6PmJmriX6AemhVYF9WaGNpZFZbY1lWVElIR0xRR0RJSkFJRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlWWndqcH+PhIGOhW97cniIYrmhmaOJlZSWk5SUjpCXkoeHe4eCjpaKgYSBint8i4iGfIqCgYuElX14enVmT1xkR0VMOlFkYFteU0Y/O0hQRFpjUVFZWVpnWlRgYU1TT0VBP0lKSEVGQUBDPUU2Qj9IR0tNU1pUXpSvuLW7ucnAu73Kzby9wby4try8t761urPGYXWypbGanqu+qqWoq6qkorK1oKuonpWWnpifrqWnp6WfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrEwL6+wLy8uLSwube3w7rGvsTJsJ66q6Ksj6Wpt4mAfG9dX19dVV9daGVTWWFWUlZJRUZOS0E+SEU9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQEpNUFJMUV1obWxxj42GkHNscnJ0iNXAtZqgjZWZmZGOl5KWlo6GiH2Hg42Wi3+DgIN5e4uEh3uLeYGKgpd/dH16a2VwdlldXFBlZWJgZWRdW1hYXE1kbVVSbW5fb19YZ2VVWVVLREJLS0hGSEhISEJJOURASEtUVFZdWlyTucC5vrjGwbu5ysu7t7q2ubm0uLW1rra3mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUjpaYl6iepp+fmpmDpJ2spKqxrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr7BvcLAxcTGysDJz7SkvLG1sJysub2afXZpW15aWFteWGJiUVtgU1FLQ0JGR0U8QEY/QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy4mKiooLS4wLEBNKy81NG2JSTBIiXQ/PkJEQENER0tPRFJcWmlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIyJfIGEc3uKg4V7inSBioeVf3R7eWxtdXxpc2VpbGhmamlpYGZpaW1abXSXraS9iIdnW29oXlpZVEhLT1BKS1FMVFFITEFKR0tQX19iZ2pil7fHsLq0u762scXHtrC5sbG7rbOxqKu4rY22qJ6cp5pOmp6Mj6CWkaeYpZWKk5OJkYmPkZKdm6GYm5WWh56ZppqssKivp7Oz09TU1tHLz9PUztPPzMbDytC/ysnLydLIzc7D0NK4sMS9xLqmt7vEon9sYVpbXFdeVlhkWU9cV05RQ0JJRUNJPEFEPkJIP0BCODtEPkBJPTU2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkZmDaHJveXmDoaqeppeMm5uYi46VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj35xeXVscHh/cntueHNsaYBwbWNpbnB5aXd9fsu/w9+nbmN4b2RbYWBLUFJVTllfUF5dTlFOVFFVVFxubneDcpauuKy1qLC2q629wbKrtaaluaisr6GstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEi4OUlZeXlJuQnJiZmZ6eq6ykp6KsrM7S1dHNzNLT09DU0c7Iw9TRyM7S09PXzdLRxdLWxsHPyMjDqb+40Jx3bGNbYFtVXlFcWk9PVFBOSD5BR0JDRj1BQj9GRT5APzo9PT08SkI0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd2x3cH1+gKCenqGMjZmTlIuMk4+WhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAb3dzbHN9fHd8c4J4cWuAcnJpcHJ6eXN7vsuaf42yhHZyhXdpYWpdQ1paW1dmZFhla1RYXV1gY15jeHt/i4GZqqSkoqChqaaqsbmrprSjoq6ipK6ip7GfiaablZORipKPiIKUiWuVoo2ZhIGGfpGDg5OXrIuVjpWajoaSkZ2Xp7CioKGlpKjIzc/HwsvQ09HU0s7TzcbW083U2NbW2NXX1crU2s3K2NbRy63Ew8yJcG1gXl1WUldSWk9KR0pJSkA7OjtFQkQ9Q0Q+SEM/Q0I7PDk8OkdDNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCioCdlZ6UhYuWiY+KiY6Ij4B4hJSZi42IiIuJfoN4c3x9hId3gHuHkZeBhG94cW11f3Z4fXSGfHlsh3Z1bn12hXZ5e521jDxBi8alfo19amVXSUNlY2ZjaGpkb3lbX2Zoa25pboGEiZGMnp+gnpGXmaCjpKaypKWzoKKln6GpoaKxnIefkpKTkYuOi4eEj4R+nJyMjYKEhXqUf4OqlqOMkouYk4t9l4qakaqzmJucp5ymvcPFubbFzdHQ0tDL0svJ1M/R1drX19jU2djN2NvOydra0ta/zM20dXRsYltXUVNQWFVFRkpJRUU9Ojc6QEJDOkhFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzIqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXF0ho19l5GejH6HkoOJhoWKgoh9eIWXl4mPg4eGh3qEeXF7e4WGdXqGjo6deo1wfXBweoBye4FyhIeAbo56dXd9fYJ1f3yHibB0WarCt42SgnFuYz1eaHJwcXBueHeCZWlvcnZ4cnuMh4+TkpuWoJaIjJOcn5ufq6ChrJyimpqgpp+frJmMmo2Rk46FfYiIg4WLjqCZk4iDh35smXmEmYeIk4yOlYyGe5uIk4+uq5SVl5+Ypq61vKmtvcbLyMnLy8/JxNLK1NfY19jX1NvX09nb1s/b2tLWydXMk3V4ZmVYV05RUlxHQkVJST5BPj04Oj5APD5IPUBCQUFFQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZsdoCIcZGQm4B5gI5+g4GChX+EfH2EmI6Hi36Gh4F3g3lue3uHgnR6kp6OoXaPdoN0dYF+dICEb4GQgm+ShXV8gYV6dod8ibjGpcPKuIKWnI94cGZOZWOCe4F3hqKQi3l6d3uEgHyEdW2UlpWWkJiRg4mPl5qXl6admKCWn5OSl6OemquWkZGLjpODjIWJiYGGkJGenJmJhYuBhpd7iImfl5CJjoqLgnyhiZCLvKGYk5eanKimpa2ep7W+wL+4xsnNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bxoN2dmRmYV1SVVVUTUtETUQ7PTw8OTo8Pzk9QTc+P0A9Pz49OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47OTo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1caXR6eWyJjZJ3dnqKfH6Af4B+hXt+gpGKhYZ6hYh8dn51bX19h350f5KekZ+DknyHfniPfnmLim+Dm4F0mYZ9goqFfH6Re5Cpj5DDoL2Mm6ScfoqEfYlzjIt/c6aanJiUhXuPkYmEaUdxoaSejIyRkoWIi5CSlY+dm5OUkZeNjJWfnZShlZKOjpGMf5CPjouEiZOWmp+fiYyUkp2Rg4x/ppmIhY6DhoSApYaKi7iYnZGVlqGmoJ2dnaOutrq0q8DGytDIx83P09LS2NLV18DX2Nnb2Nra2dnX27Z2dXRnZmJUXVlST09IQ0xDPT0+OTk7Ojk5PD02QD4/PT05Ojo7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTzxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5PzxEUlNSWF9WWGZtbW1pgY6KcXN4int7gHx/fIh7fXyLh4N+dYSGenN6c22BfoV+d4aboZuelJKAjIh/mIeAnJJuiKmFe6CMfJGOg4mEnH6bkYqNo6KfkaSvoIuRi4aLgZOGV3Kti5+rm5CDmZyQj45bg6KRgo2fk5SMhoiMkpKMlJWVkIyPioiWm52PlZeSjJOUhoCLiZOOioqdl5mjooaTnZagi4qJjp2Qg4iPgIOHhaWFi5CzmJySlJehoJ6Zkpudp7G4rKS9wsfNyMbPzNDMztfP0dSu1tXY2tja2tfW2dqdbHlxY2NaWlZRVVdDQElEPz8+OjQ5Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnhsYn6Rg29td4t4en97gX2HfHx3hoWAc3CFgnt1d3Z0hYOFfX+SpqKfpqKXip2QlJeLiqiXcoqyjYSokoSZlIWajKOWoJiTiZueopOpsKCRlZGOjoiWjG+Nt4SaxMiynKKmnJyYlpGxkGSkzceVjoaHiZCSjY2TlYqFioqGlpmbj5CUk4eWmISAj4uZiI6QqpeXpKKImZ6WmomPh5iYioWPjYF/h4+liI2TqJqXlJaYoZifmZOcmqKytKWjvMG+x8bFycjJwsrTzM3UqNLR1tbW2NrU09rOf297ZGBbXFtNSVNZQkFHRDtCPjgzNzw8Ojg+NjQ6Ojw6NzI/OjkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBjn18bX6IeHp+e4KCg393doGDfG1ui397fXh4fIWHin6LorOno6uzopenn6WklpWuooORuJWSs5qMoqGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJqXocCOo8m4q5yjpq2Ykpudsp2FhqiinJiFiYmOlYyLk4+IgYaHiZOYlYyLlJOHlZmGhJGQnHWRmLOWl6Whh52ak4+LkIqXm4mLlo6GfYyYnomQkJybmpOYl5+ToJ2Unpugsa6ipLe+tMXHxL3Dw8DGzcrJ06bOzNPS0dbY09DYum92clleU15UTkhJTUVCQ0Q1Pjo3Nzo/PDw3PTQyNjY5Nzc0PjU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTVpcWUpmYDtIhIt6em6Fhnp8hHiBhoF+cHh8fn1vco16foJ8eIaLiYaEkqa7raiyvbClrbOzqKOhsKyKmrWdo7illa2ll6mtuKeko5+aqZiqpK6wqpqZnJSVkZegmJq7u67KoWq3uKuwlJmfo6yTl76jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJOWjJCWjYuNlpiTnZm0l5arnYqclJKOkZKMmZuKkp6Qi4mWn6GNlI2Ymp2SnJielKGglJydpa+ooaWzuKzCyMS2ur28xcfHwtGgxsnNzcXX1tHL059td2VZV1BcUE5FQz48Q0FCOEA4ODU/Rz09NjwzNTM0NTQ1NEI0OTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkSGJgYnBKQIuKfoBzhod9goh1g4qCf259fH1/cHeHd46Ch3yNj4yGjJmqwsCvvca7s7TAvbStq7O2jKizra29q5u7paiturirp6aioqSjqa+ysaudnKSZm5iXn6KmppKkuq+pwLytrrK5paSofoiGnK29sIKLjIuQg46DkY96gYiQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaYj5KhkYmUm6SslJaPlJydk6Gdm5ifoZSanqempKKksLOnwcbDr7C6t8XEw7/NpsfEx8S91tDNxMqFcXBfWVdcWExKQUtBRkc/QUBDOzo0PkE9PTU9Nj4zNDMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0Q/Q0ZcZUZgaWdaXVyTjIyJe4eMh4OMdYeRioFvfnuCf3F+gXuVepKUlJiQk5ans8bJv8LMwsO5x727r6u5u5izt7qywK6lwaSrsLy9qq6ro6Oep6uutLCqnKCqnKGclp+wtaiMo7q6tsG8rKmds6WkqJSFjqnEw6SCi4+HiISGlZSNeYONkY+RoYyMlJKOiZefmJOZlZimoK+djKucjZaPkpGVlY6QlZKPoZSGl5+gsp6UmZOgoJikn5qgm6CUmJ6lpKampK+upsDEw66ot7bJw762z7LEv8S8s9HKyMK0cnZqWlVZZ1BMSEJMS0xKQUE+REQ8NUFFOzszPThCMzMyMjYzQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVpNZVxmVGJrmY2WioyIk5CGiXmHlJCBcoB7jX94h4KCkHqNoZaompqZur3HyMnB0snKws29wrOtvL6ou8C9u8O3rMGprLO8vqqwqqSlpKyus622taCfr5+lopijs72pm6i9waS2uLCslLKsrKyXh5qppqWRgoyTpZaKgXWKknmFjpKQnqCTj5OMj42Uo5mWnJWVo56qn5GlmoyPj4+Vloh8j5aTkqOalZ+hnLWlkJ6WpaOipZ6dppielZebpKOpp6KyrKi8wMOvpbO3zL+5r8Szu77BuKzCw8LAl2p3X1ZVWVhKSkxJRkRESENDQURMOjRESTo7NDw4RS4xMjM1MkIyNVNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmlIX1hiWmNjVp6PnI6Xjp6SiYp/iqCThHiFf5Z/f5CIipGAlqGZrqekmMK9x8PHxdPNzs3LvMK3sLq8tL3LvMPBtre8rbO/ur2ur6igqai2ra6psrebnq2jqKGeq7e4qqWwv8Wyvrq0qKu2tK6ul5alrKifkY2SssWnlo58kpV8h5KZj6qZmJOTj5KVk6Sdk52ZlKGjopyYn5iLjI+PnohakJaXkpekmWWYo5+ypZWhlqurqaebn6aXmJaYlaGkqKWftququrvDtKW0tcvAuKq2q7K7uK6ouLq9uIBoa1hVU1NNRUlSTUs/QUhFRUhISDk1RU07Pjg9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PkBCRkJwRWpJUmVhTEallJyXopeployRg4imk4iCh4KchIOVkJCUj5qin6++r6HHvMTEx8bOzs7Syr67trG6u7y+z7XDvbi5t7OxtbO4s6unnKusuaqpp6+vmKOvpaekpbXAsaystL/DusC6tKi6trm0r5alra6upIuTlKGNdMKafZeZhI6XmYyxlZualZKSmZmlo5Wgm5eaqZ2boaCZio2QlpxgSpacmpWapZZVl7Cgr5yfpJSurqulmqCllJOYmI2coKeimrSpqrO7u7uqsbLHwLmmrKutsrKjobKytKRta2NaV01PSkRPT1BSO0dLSUdJQ0M+OktVP0E6PUVNMDc1MzQ6QjQ0TVdPPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpaZoKKosJmRl4eLqJaOiJOFoIiEnZePnaGbo6W1ybWpxrrCw8jKycjMzca/u7OuubnBwcy1x7rBubW6sK+vs7WnpJuqtLWqqaatrJqkrqWkqKy7v6istre/wb++ubSzxLK5vq2jr7WsuaaIm5emm3a/n4SZnY6TmpqMrpehnJyXlJugoaieqJ+ZmqqaoaeemJCNkZ2DbnaSopqVnaKdka6yo6qUqKqXqq2jo5+kqJGRmZyHlJ2inpaxp6mruba9srKuvrm2oKOnqKWmnJutqamLYGNfXk9KS0ZHTUpWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc3P0I3NVVYTz9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh+ZV5IRauVm6Gfu6+ZlZ+Mk6uckZKTiauNhqGejKOtlKOktsa+tMC6wsLHycXCzsjCvrmyr7m1wcLKtcWywby1uqqora2wo6OYqrS7pqmmq6qdqa+no6qrvbyorb21uL7HvLe2uMGyvsG0qrW3q76lkKOYkqKgvZ+JmqCZl56ej7efqZylopucoZqopLOgm52mnKiqnpiVj5Sbi5eJjKSilJ2inaC1r6Wkk6+rmaqqnZ2jo6iQlJSfgo+enpyVqaShobO0urStqLWys56co6Wal5WYqqGedV1aXlxJR0VGTVFJTUVHR0JTTEpCRUdBVlNDSD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKBZFQ0OS0xOWZcRkNDnXBiR0Wnl6SfnsOtnJelmJqqnJabm4+qlpWnppWtrJiiq7bEwry+t8HCwMfEv83Gu725srC5s7/DyLW/sLy2ubampKusraGhmqqrxaKkqaumnqyvq6Kpqb64p62/sri3x7a1ubjAs8DCuLWztK++o5ejl5SclK6fkKKjpaOjn5C9pKmeqKydnaGbpZ69oZmjn6KprKGdl42VnpOeh4+EjZOfpKCetaylnJWxp5mupp2ZqZ2fjZiUnoOOoJqbkqWkmpirsbWxqqWqrqybmKCgko+QlaielGVfV2BcTkhHSk5MSEVESUE+UUlBPEdJSFxST0s9SE9VNEJGOT5IRzVDYVtLQk5SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTQ2QDk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTltUkY8S3hlYVZLopqjnJ7FrKGerJ+erqCTo5+WpKCmqayYtrGiqrO2xcS9v7W/wrvIwr/Kx7W4tbSxs7S3wcW2vrG4tbm0n6esqqydnp6lpMGln6quoKWpra+ipqi9taaxvbm3tsSztLi6v7TEwbm5rrO1taOdpZWSlKGuoJminqioq6Oawqypnqyum5uemaagvaGdpJirrKymopqNmp+TnomOV3+Wn6WhoLiqppOYtaOesaCfmq6WnY2Yk5yBjp+XlY6ipJaQpq2yqqmioqWllZWdmIuPkZKknolfYlhiX0tISkpORkVBR0s/PUpCOTlKSk5dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTZ6foZmexKilorSinbOok6uloKOfrKmsnbuwqKy2scfFwcKywsO9xsS9xMm8r7C2rbC0r7/EtLmxsLm0rJmosamqmp2loafCrZussZyqo66xqaSovbant7u+r7fErbSzw8C0x7S7uKy0tq2qoqaWlZWkrKKfoJunq7Cvr7uypqCpqZmZmJOio7igoaOSr7CspaefkqGelZ6QkI2VnpqinqezpqaMmLOboq2anZuskJ2TlZKZf5Ghlo+Nn6GUi6arr6SmopygnpGRmpOFi5GNm51/X2RaZmRKSExKU0JDQElIOztGPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MjUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo6CcoMOppKqzoqS1qpazraehpLKsrqm7sq2xtbTGwMTDtcDEvsnEtb/IwrSrtaiwuay/xLO3rqy2uaWYqrKrqpifppetu7SbqLCbraCutLKnq7mzqLq0ubO5wKq3ssS+tceov6+utrWpp6yhmJeSpqWiopiYpa+4rrK1tqCfqKSalZWUpKC3oqWllq+ysqeqpqKempqblpion6CYoZ6usqKmjZeumKSrlpmeo5CajJKWmIWVnpSMj5ydlIuoqaqhp6GYnpWLjpmPgYWUiJOed2JnXGppTU9OTlQ+Q0FOQzs6ST83N1JPXV9SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAxLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SW9oVUNXRox5ZkM7pKOdoqa/p6evsaGptqueurGso6u0trGwubewt7i4xL3Dx729xMLGwLjAxcC6qbakrLutwcK3t6mssbqilK2xrbKWpKeRqrmqn6axnaugsLSzqqm2tq29rbSzubitubHDu7+/psSrsbevqaurp5+YmauhoqGRmKKxr7OssLmanKmgmpeTmKegtqmmo6KxsbSss6isn5ugoJuepZyil52js7Can5CTpZqfqJmUop2Ul4iTlpKVlpyTiJCamZSOqaimn6Ocl5uShY6Zi32LlYSNmWlna2BsbVdQUVtVQUJFVEA8O0lBNzpYUGReUFdXRVlfXk1MUk5eS0o+WmNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjYxLS0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaifnaKqvaKqsKyksriqpra1rKCttb2vs7i7ur63tsDCv8jEucXCwL+4xL3Bt6+1p6u3sry+vrSorrG2nparrqiul6aojqe7n6Wss5+sorGws6yqtrS1vq6wsbWssLSzwbvGt6y9sLG4rK2qo7KmnqWqn6SXkZqgs6qzq6qzmp2nnJqVjqGmpLSuqKGtrq6xqLStsqqknJ+opJ6VopmbqLWplpmSkp2ZnZ+dkKudlpeElJaKnZick4qNlpeal6alo5+dlpWXkn+PlIV7jZKCi5Vka3Fnb3FeRllmVkRCTVhEWjlIQjY+XFFoXE9ZXUdbXl1PTVJYZEpKQ1xiX1BLTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVVcZ0s2jHpmTECkmqGlrbelraqmr663qq+1u6emsbfFt7G2vcHCtbW6xL7MxrnDwLm+ucO4wLmytKupura6ub60qq2wtZiYp6yqrJurq4+rvp6srrKjq6CxrbOurrayubiqrq+xqLWvtby9yrOqt7WxtK+up6G0oJuoraCmlpaamrKiraCmr5ehpJqak46jpaizqaGms6yrtqWvsrWvpJmdrKeamJ+amau3o5eTkY6XnKGXlpSqnZqRf5KXjJ2cmZaQipSTnpmloqKgmJaSk5V6i4+Fe4yKgoqRam13bXV7YUVga1lJSFpaPXtKRkQ2QWJUaVtNXGFLXF1aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRfVF8vNShDX1FcLitCL0pHUFtHM2NZVEtEmZehsamyqq2mpK+utqm3tbqkrLS3ybu0u7q/v7Szt8PAzMi8w7y2vb+/t7+8sb2tp7q5t7bCtqussbeUlqeuq6ijsKqUr7ukrbGzp6ijsrSxsrG1sbi0qa+ssqe3r7e0xMa3qba2rLCtqaijtqCgp7GhpJScmZWxnqecoKqOqaOem5aYpqaluKejsrWsqLKnrrG2rKWZoKyom5yenJSpuJyUjo6KmJuil4+YpaCck4KQlI+cm5eWlYiWkJiap5ykoJKWkZCVdoSPh3uEgYOLimxvdnR7flxLZW1cSk5kXD9ie0dJOEdnV2VcTF5jTVhZV1VXVGldT09IYF1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkdmMjcnR2JMViUtQi49RUxRPDNya0lDQ5Gapa+lrq+rqKWxs7Srt7K4oau1ucm5rcG7wrizsbXCws7FwMG9tL2/v7q+vLLEp6m5sLa2v7yuq7OxnKCnsa2mpq+lnbK1rauxsqypqLW7rLWzta20raqsqKypua6yscjAuaW6sKmsrKWorrGmpaOvpKmcnZybr5qjo6Ojka2fpKCgoqump7mkrLW2pausqa2wtq6inqOpqpugm5uSpLSZjomNh5ChoJSMlJyfkpCDjZKSnJqXlZOHl5OVmaebn56MkpGNkHZ9jYV8e3yGiYhwcnF9fH1cU2RuXk5ZZ1xGRJZbRztObVhiW0xgYk5WV1ZXVFhnXVFSTGNZW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLysxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEorOkg+M0JIUyw+kGs7R0iPnKqroqqxpamls7WytbaysqGrrr3Muq3AusextK20wsPSxca+wLK+wMK7vre7xKest6yyt7zAr6uxrKCjp62qqKSwo6qyqrCssK+wrquzvKe3sbKps6qrpaWjrbqtqrLDuratu6mpp6ypqLKmqqSjrqqoop6co62VpZ6YnpmsnaKnqaKtpqStq7iysqGqoqCsr7GsnqCnp6mZo5mZj6Cml4aEjoqLnqCOioyVmo6NhIWPlJ+clJeUhpaUk5eknJycipKQjYl/foeFfHZ+hYSFcnFwiHVrX1lgbmJRc3FcSzuEfEY/V3RYYVpOZFtOVlZVV1FcYV5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxO1xKMC5KZ0RGODtCMDVFS1gxQJVZPUxFlZitqKKrs5yqqrC3rbi2r6umq6u9ybywvbbCr7Gss8TDzs/Dvr+0wMLDur+zyMOrrretsri+vrKtraukp6qwqKeosaW0rquxr62ysbSstLykuLOtrK+oq5+jnrC3q6qtu7elt7akqaerq6quoamnprGypKeloaGsl6qhlZugpp6loqukraOfp7G4rq6jpqObqquuqZ2ipaSkmJ+blo+YnJKBgo+IhZyfi4qOi5iNjomCi5eim5GQmouTkpGTo5mbmoqOi4t9hoGBg3pzf4KAfHJ1i6SHeGteYG5mV2WHY04/Z5NMRWJ5V2JZUmVUTVZVVlRPXF1hVUtOaFZWV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZWWi4wSmdBQTw8Qis6Sk9eNESGPUdGRJeTsaajrLGYq6qttqy2sqymrKqpvMDAt7iyu7Wmsq/EycvRv8C7ub++wbnBucDErbG1sbO6wL6ysK6sqquotqqmrq+qubCosrKvs623qre3p7S3q6ylqaqcpJ60s6mopLS1oLeuoKqoqqirp6CrrKm5tamqqamiqqCtnJOqoZ2gpaKmo6qfnae0r6imqqOjmKWnp6qcoqSjoJmYoJGOj5iNfoeMh4OdnYaDioqOjY6LgoWUopqNjJmQkpGPk5+XmZaMioN/dIaBf394dIJ+eXZ+gIedj29yZ2dwd1xhc4hrT16ZVkhteFVkVlFjT01WVFVQT1hbYlVIT2lUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJi8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDyWjrGipquvmqylrbC0tbCsprCqqLq+u8CwrrmuobawyMfI0cC+vbu7wb26wsC+v66ysrG1vLvCsbGzq7OppLWopa2zs7mxo664srCyu6u6sKqutquqn6qsn6Ogtq2poZ+ws6K1qp6op6mjqqGirK2ova+srq2iqKigrJmQsKGYoqCnp56om5mqsaqjoK6ioZSjo6OomJqopZiXmJ6PioeViH2NhoSEo5aEgYGLho2LkIODk5+WiJGckJOQjZGclJePioaGd3SBf3x1eHl/eXNzeWd/hqR2aV9la4B0Z4iMfVNYb15KeHNTZFRRXk1NUlpmTkxWWWRYR1JoUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUA0kZCzoaWnrKSnpK2ntbOyq6Wxp6q4vsC8r6e5qqavscnHyNHDvL++uL2+vMi6wbiwr7Sxuru4wLKyuqy4rKK0p6essra5s6iovbautr6wvaeurLWsrZypr6Ogpa2rqJyeq7OltKibqqepo6meo6moqb2stLCunaqkoa6cm7OjlqScpaWfpZybqaumn5yropyTnKKlnpiXqKmSmJqUkIqCj4V+j4OAiJ2PhX59i4eQjY+Df5Oak4WTooyUkYuRm5KVh4l+f3J7en58aHh8eXRvcHtnhHiEiWRhZ2FyhHptZ3hdXlQ/V3ttVGJQUVhLTE5ydV1IWltnWUVVZVBEPkpPRENBOUhHS1M/amJKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNCSjdHU2BVKj05RFc9KpCVspqgoKqmpaGrpbizs6apsaasuMG9ta+iuK2oqLDCycnMwba9wLS3v7rItcK1s7K1sry3ub21rbm1v62gs6erq7C1uLWsn769qrPBtLyhr7O1qqyfrbCjnKapqqSem6Wxp7Cgn6upp6GpnKSooa28qK6xrqGro6Svn5+tppefm6GjnJ+cmqSro5ybpaWWl5Wgo5ebl6WsjJ6RkZGLgoqAgI6Ae5mUjYh7fYuGj42LiYSSmJCGlKOJkpKHkJqQk4GJfXlrfnZ5eGN8enBvb3F2Z4BzaoRoZWdfbHONbGFpb2BvPVp5a1VeT1BRSklNVFpXTV1ebFdEV19PXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPikdNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTNTPmVfREw2S1ZkTyo7MU5XPSOUma2aoZiopaOfqKS4sK+kr7Cpq7jBubOtn7mvq6i0usjLyL+2wr6vtL23xLbDsq65srO/tLq9t6i5uL2qo7Soqaqxrrqxqpy8vaWwwbW2oq+2taemp7Czn56kpqiipZmfrKipnqCrrqagppijqKCxuZ+jsa+hrKGtpJynpqmampufpJWdnZueqqeXnKGqk5mUmZ+TmZahqZGaiY6QhnyHfoKNfXygjI2IeIKLhImLi4WHk5qPiZWeiJGVgoyXjZF9hXxzcH1xdHRgenhobW9wbmh9cWN7bWllYl1lhX5fWnNqcUpJf2lYWk5QTEpIUFJRSU9cX25TRFhaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQiosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPi9XVTUol56nmp2XraGhoaSiuKqxpbS0qai5xLWzrZ+3ra6tsLTGyMC2vsG5sLS8tr67vq+rvbCzvrC8w7mou7q3p6e1qKirsa2zsaicv7imrby3sp+xt7CopaevsZuhpKClpaCXm7CnoZ+jqK+hn6GUpKSit7ChprGrn6yjr5icqqSpn5eanqWTm52bnqermpyeppeWmJaejpOXoqiikImLj4Z6hH6EinqOlomNhniBh4OHi42FjZOYjY+WmYqPl36GmIyPeoF6cHJ3b290X3l3ZGtra2hngm1lcmtrZGhYYXN/XlpsdWlZRX1dW1hPT0tISFJVRzI6Xl5sUERXVVllTUhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEhCZ1tIVENUXWhFLjsxXlEsMpako5iWnaqepqGjobiprqG7uKWsvcSzsK6ita+tra+0xMS9s766t7Czubi6uLqurb+ztLivv8G3q726tKWis6uoqrOsrrKjncO3pqm3t6ufs7uqp6aor6uZoqecpKeUmKGzppqepampnKGglKWfpLmppKetpp6loaiTn6mhoaGZm52hkpudl6GjrJycmqKWk5WWm46Tk6OnpJCIio6GeYR8hYZ9nI2JioZ4gIOHiIeRhZWTkoyRlZSOjpR7gpePi3d/fGx1cm1sc2J5dGhmaWdlbYRnZ2hkZmhpXmViaWZZZXpiYFBzVFtbU0tJR0lPU0AhK2leakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3N2FMJzKfpKWTj6WnnJ6enqS1raequrenrMPAt6+sorWup66vt8HAvbHBt7Cusra1ubi1rKq8tK+ysb3At668vLGkn7aspqa1qquvoaDFrKqnsbWsrLS6nqipq7GlmJ2qnqilkpqmrqOZnqSqoZuhnJignae2pq+qrqGhnp2hlaCmn6KgmZyanJOanpWmn66jmJeflpWOlZiMj5iaqKCQh4qKiHiFd4KCgpyHioKIe3+EiIaEkISWlY+PkJGQkYyTe4OVjoZzf31neXBra2xndXNrYWdkYnN/YWRlZmVpaWJmb1peWF1sY2FNZ1dbYFZJR0hLTVJYPzlgbGlHQlVTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLC9BKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BiRiU1naShkoyuoJqZoJeltLKjsr63obHGu7qwsKO2rKuuqbm+vbutwLKvr662rrO5s6erubGvrrO2u7avub6spp61q6ChsaWrsKCmxaGzprCzsLettZ6srqyuopmdp6qmn5Wcp6agmaWjqZyan5yVnZ6tsKa5p66ioZqanpmfo5qlnZefmJyVmqGTqZetqJuUnp2UjZWajpWUmKenjY2KiY57gXSCgouYhYZ8iYiEhIqMiJKFk5ySkZCQkZePkH+BjY2DcIJ/Z3luaGtqZ3Fya1toY2Fyf2BkZ2tua2ZqZmRsXG1tdnFhU2JoY2VaSUdMTU9ZUVBWYWWBVEBWUlpURkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy40PDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFIYkInNJSjnI+PsZ2blKGbqbOwn7nAtqG0wru9ubGmtrCprqW4uri4rLuwraurt6q1ua2lsrWxr6mxtraxs7a7p6mgtqmdn6qjqq6dq8SZr6awsbe1rKyesa2vqqKbnaSsqZyVnKeknpmqo6WVmqCdkpyjq6qpup6npKCXmpqeoY9ro5aZnXGDl5ylgXaSrKielZeikoqYmYCXip+PeIWTjYNtaX53hHJshoqGfYSKhm9dZGBnhJeGa4uQlJJ1eIuEf4OQgGeIgGh2aWZYXWl0bk5QamNmcYJmXmRmb2tpXVxeiZCFiGhPS0M4RVRnXUpIUFBVVkxIU2FwdGVGW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTlxLW2ZiPkcxTmE8Ky+OpJqIlbGbnZOgnKuuq6O9xa+pt8K4vrytp7axpqukuLSzs7C5rqqnrLSlsbWip7i2tainrbazrrSutKKpn7SrnqOlnaeom7C/lainsbS5ra6kqK2qq6ahn5yhqKicl6Gmppycp6idk56gmZGfqKqjtK+joqOclpiZl6OIoY+SmoihiJWfon+lgKitn5SUnpSJhHJ4jI6DiKB1iI1pl4lmfnN5oG+Hh4N+jHx/oaCfmX97h550iI52m4psh4KDbmllZHttcmJUhm1jbWmYcVhpcG6GV11pW2tqWohwbXlyh2iHhFleRk0+Rl5NRVJWVlFQUldUZ15MWkxSUlBFRkc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOi8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05cTFtnXz1LMVReNy8ojaeYhJ2snZmZnZ+rqqiqv8Ovsrq8uMG/qqS3saqsprS1rq+ztquppbGtpbazm6y1trSmp6izsa2yqK6eq6GzqaCkpZuipZ6xuJWmp6e3vqasp6mqq6emoqCZoaikmpmno6WZnKWqlpOjnJWUpKamobako6CkmJWUmJSciK6QmJWKqoyYo52GsYGlrp6Vm6CXeoLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7F5aGxYsa5vZWm8krxuaHptcI/YflNrYrayfoBxlHWaoaqQVk5YYU9WTkZVXFhRUFKLXFdbUEBcRFBOQ0ZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01eZ1w+TDFaWzQxIY+nlIGnqp+XnZ6lrbKpscK9srXAtbi/wqumtK2tqaiwtaqwtrSoqKa1pai5r5yysraqpaSnsq+usaarnqeksqSioaCXnKKgsq+Wn6ShtbqiqqigrK2kop2bmqOqoJibqaGfmJ6oqJGcp5uUnqKno6Gwo56fo5aXk5iSmYWva2qLjqp/aIWWh61mcZ+elpuol3GuoaR+d7p8bKGPdrFfarRbpYBlnJBgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZGUY21tp25chKBFaWeHlkV1nGB9ZnujpoJZX4uraH+ReHpqqDhKr1tYVG1jWkxPWF9cV1Y7TohQV1YvSVNTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMvLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlgzMRuSopWDraeln6Olq7K4rbS9vrC3xbK4u8OnqbCssKmqsa+ksbqwpaWvs6Oquames7Kwo6Whqq2wrK+mqJ+jorGco52ZlpmdnrCpmJyioLWzoaqboaysn56al6Cjqp2ZnqWhnZqhqKSQnaObmKGgrJ+lpqCaoKGWlZGXkZqGtZu1eYaqmraZd4ezm7d/lJeYrJd/a4GmeoGFh5GUknerZ2qxW6x7joeUdIhwjoaAf4iQl3iDgoqXjIOgj4WwdnefcWtrbXyLT6VYSGNjmX5jaKVfeXF1UpKHXlCpbmNxfIaAYZ0vUqJuW1RrZ2BMS1xkWFxaQj6wd1dYQSNNaUZCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0YtMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWFUNTAcl6CUibOmpqGuqaizrKq7tsKwvMOtubfCq62tr6+nr7Oqoq+8q6Kota2jrLalpbKzqKOinaeqs6mwqKaeoKCwlqCalpaXm6Cwo5uapKi1r6Goj6mnqpudlpigpqman52joJygo6WklpuemJqeo6ubpZqcmqKglpORk5OdhNWTmblxscJ/xod91pScu32cl6iSj52NpHuNhqKBpYJ6rHmPnVave4l+n2q5Wrl3hYR9poKUfJl6qnmOnZB7sW2OhHSQu4ZvlVCvp8WKUaB6Y2CqYnNyh2yXh19StbTIhX+JfGOkM0KddVxQamhkUEBYZllkYUpITWtKW1NPWWZaQ0M/RT8wPDw1OTw3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3SDphUDcyJZyjk5mxqKmls6qltKekvLfBsLrAsre1vbS2qLKxpLKzpqCvtqmbqLquo7CyobK0saGknp6oqbGptKmlnJ6erJeZmZiYlpmirJ6bl6musamjno6soqeWnZicoaeimKKhoqGboqOonJ+hnpWZm6ehnKaUm5ufoJiQkpWQnYiybmi1cauIcI6nc7R1dLZ7nJmmjpCdjaN+j56jfrB1g5HS0nVcrnyFf6Rum6qmaoaFfa19mJmQe7Fzk52PebNllnSFnm6fZpRSyYtawlyfeWJfrV92c4Zil4heWcqdb8CAdE1LtVNVxmRVUWpjZVhBT2pfbGlQVUZJOT1XUltWWUhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQU5UX2VQNUc9YU02Mi6jnpGlr62lqbqsprWlp7a7vLK7v7i3tby8tKa1taOysqOgrLClmKe6rqSysZ20uKqgpZ2hqqWyqKyqpZqdm6mflpWZmZOUpKqhmJOnq7GmoZaSrJ+lkpShnKWnoJWbpqeim6Ogrpqhnp6Qlpyjn5yllJ2VmaKelZmWkpuFrHx4qHajj4uHqXCui4SohJqao4uTmouifZKXh66Ef4KzXHKyU699goKjfnHXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1edneHZ5iIal2vd5Wfj3hsNXnIrrNfQ1RvXmdgRVBsX3BtVlVNLmVjaFJZUDtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQmBJOjc3oJ2Un7exmbPBrKiyp6qyuri0ub65uLO3vramubWhta2goKmsoJWntqyosbGrrbSkm6mgoKiitaemqqSZnpWlopSUnJmSlaSnm5SQp62wpaCUmKmfoo+RopqppqGVmqapnp2kn62doZ2gjpWfnJ+gmJiclpehoJSYkaadh6l+f6Z5oY+QhKpwrY2Cp4aXoaKKmJeIo4GQhpSqen+LnXlwsVqog4KIoHh02H92h3SngY6bjZKkfJWQn4R7sl6cZKB9gpVuk1yrXFuTf5F/aGeqY3J7gGqYhnFeq1qJoI9rbmVPSkOhXFpNdF1iZk1aYV9ydF9KVTZKmpFYSEU9R0VBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8T2VkQSZVZls/MVRfYkw3RkhfQzE9N6KdmZi+rZizwq6rraimtLC4sbW/ubqzsrm8qru2obKln6anp5+UqrGpsKq2raqvoZiioKakpLqjo6yhl5uRo6CVlZ6alJihoZCOjKmwsKadlpqnpp+NkqSYqKyolZipqJ+foKSuo6GeoY6VoZmfoJKcl5yVnaGVlo+rm4+ubnK0dKmMd4umdLR6dbSClKaklJ2NiaSHjnW4bot7i6Jra7ZaoYZll5dooKKnbZRytHOTmX+zaoWSiK1qdbRhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZwXK9WPJx3ZlRvbi5bp09iUmtlYmxaYlxgcHxjU1pRPj9sbzJCQkA+TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQTilmpucuqOcsb+uraurp7epuK+1wbW9srG7uKvCt6qsoZ2npKKdkqurp7ajs6iuqqGXnaigpau4naOtnJaZkKWjlo6doJuYnqCRk5WrtrCmmZObrKmXjJSmmqWto5GXq7KkoJ6orLCZoaOQmaKXoJuWm5ehk5ypnZSQqpmH1JSau3WxxIDEh37Wl5y4eYqSmY6Yioynh3mitnV9d3bCgpqyYYO6ecB8dbhitYGMh6l9loKsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eIGKbZqIcW2NpHS9XXd9W2F5vGpaVltpeV5pYWRmYm15b1hbWUNBQHE/Q0crNEgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvVF5gSzU8TFwtNkA5p5qfobujmLHDr62pqqyxqLmvt8Wxu7OvvLCuwbKtpqOfpKKcnJGqpaqypLWnraSflpqrmaetuJ2jrpmVoZCmoJOOnaOemJ+akZaTr7mwq5WXo6enlJCWpZ2krZ+RoKirn5ufqaSynqOljqeilaKanJeVpJmQsKCSlaqfhZCZtoCSko24lniDk5u2d25sb3RveY+EjolynsG7vJl6gbKocIB0kbmDfIaGioeNe4qGjZd9pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnF3toxef3l9iWeDeW15YouscHWFf1hbp2lEZFlUZl9jXWNRZ2ZxbXVCTU9MRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/p5azwrOrqqisq6q7r7HGr7W0sLintbmuq6Sip5+gnZmUrKSuqqa2qKifnJahpJ6spb6noaqXlZyRopuSkKKoopOel5KYlLK1tqyYnqOkoouTkqacpqudlqmlppyZoKinp6OpoZKsnpeinpeWmJ2ekLCplJynoo9rf2qcqXmJdH+bj3Z7Zod7vr/Aum+Sg3GUhV9yalpdmolhZIeOlWtgf5RjbZx2YpRrgJqVlGVeYGNxmolocox8hpRman5xdHl+fWJbeHSBaFBcboN8e4pqWGx5gXJJSm+FcE5zTURWXGZgTFpXZmNfT1ptdmpyUk9ERU08SEk8TD4yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1Q0ZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5cTyc/Mj6on6ihwqSatLm2o6ymrqeotbKsyKywtK22pL6xs6ehpKqdo5yamqynrqSltaqkm5iVopynram+qKmllZSblqCak5mmqaiRn5CPmJywsr6sm6edp6KJk5Kpm6iknJysn6OamqKnrKKfqqKarpuVpqCXlZ2fnZixpZmiqJmdkp+dpKabqKSbnZqcm5GXgmhufXJ3kZeUkISJtKqNhZiVjoqMmJaHlJWJg5OTkImNkZSZk5mXmp+hmpuUn5uNgnqkhWxpe5F9gHWJi4Jygnh5dnWKgHuJanOCdIN1ZHd9dmtwemxfYltvZ01YWWZqX1dZcHpvbWZTT0ZSOVBaTlJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Gxt6CpprOnpbC1qsmrrbKmtabAqLShnqWmnKWWlqCrp62jpLesoJmXlqCYraqmwZ+spJaSnJefmJSVop+eo6iTkZmoqLLDr5mrnKqej5aWqZ6rnJ6hrZihm5yhpa+moaSonqyZl6admZqhnp6dsKGdoqeWmZSalKGjl6SgmaGOl5WLi46QmK6PfJWbgpGBiamohoCXloqEjp+Ie4SRhoWakYeGipWOm5eOkJieo5aZkpCcjX+NZaGzroSJhHd7kIp+d3l6b2d5kIGAiWt1gXmIcml0f3l1g4eBanRjd2VfaGRjZGZqWGt7cWprXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLOgua+/rautsbKgqqayraKss7DGsKutpLOvvKS0nKCoo6GemZeopqmmpKaztZ6VlZ6amrCmrr6hrKKRkZ6ampSSlqKcl6mdhZ2qrKO0x7OfqaSqlpaYmqeeqZygpauUn5+cn6quqKWjq6Gsm5+foZiknpyfnbCkmZ+plJmZnpOmm5mqn5yXZoSTfWV/j5uQY3mMbGhqepCjq2tkmZd+Z4WKZWVpaHqNoo5raIyXkaJ3a2qLmaKfmHNsbnqEjIZ5WGVdhYJebIuKgndcZ3N3d5GAh4JveIJ4f3NteYRzd4iIjoN7aYVYXWpzZF1ziGlrfHFtY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXV9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0ouNlpPNilFWS9ETzFZQjs/Lj2ln7q9uq+ss7CrpaitrrCmrq6wvbGqqKWusLCfrZigpJ6impqnrJyso6aoqbOunpakkKOwpra5pa6jj4+aopqTkpugmZmmlnulrKKotMO3paKnr5+dlZ6jnqOdpKqokp+gnZ+qr6mqo6qep5umnqegrJahnKWxpJedrJain5uUppmgrJmffr2EiXO0c4Wfhq1od7nEuHGSoaN7ppiYc6qCfMvAwLpxi6OHg559lpiInsC9gpadnY2cwcF8gXqRjJrCwH1rpbJvjYFvynp/m3eRg46Ad3mBgHlxe4CGcHiFi5N5bHWRYmVed2NfZYBiXnRobWRiWEtWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19hX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SVtMKiNDUC8jRlszUFkvVUFCOy84lqK5w7Swr7+pqZSjr6mwr62msravqqanprGroKuYm6OgnJuqp6Kdq6KlqKWltKSeo5Omrqy4tKevopKRmZ2mk5GgoZiboJ6Ipqukq62/v7Ghqa+plpKfnqKZo6Sqo5OgoZ2crK6oq6ajoqWfpKWcramRpJuprqqcnqudrqOXmKaXoqSYnX/OlHp7pYJ6lpebX62PXY6ogKGhfaeVm3Srg4CvXmSMqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3R8loe4YYKuWaPNbpB2e9t7f5lxfoiSdX9le4h2dmx+h259hZCRfWuAjF9wam9mYF94ZFtxaGpjZmBSVFNXXkpPQzVBSEVEOD41O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dW1dPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMazBwL+0tLC3mJ6Ro6qprbWsprKtrKykrKawqqGnnJqmmJyir5+hn6ino6ahn7Csm56Wpq6tsKuorKCUkpufpZOQn6WXnaijnq2jqrCov8WzqKmxrpaTnpyil6Gqqp+VoZ6cm62upqmom6amo6CqkqyzlqWiqqqepKenorKik5unm6GblZSRl6BxhoyYdoWoh3GxfJ1xrH2goIGlj554q4J+rX+dcq1/rIeGn3aYknt8l36qiKGLkYucfat6iJKPn396rVacxHuQcJPBfYGVbXVwjG1md2WGb2F3bnJuiIqQj4Nsj45kbXN1b2BmbWRfb2lqbmZjV1NcYFpSUkM5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv08bHsrOfnaOPo6Kira+3r6mxp6iqqK6rq6eipJ2ao5afpqugoqagqKijn56wrZiblqinr6yop6mel5WapKKSlKGtmp2no6+soqy1qbnMsa2mrquWlZydopmfrqydlqGZnZ2psaepqJuqqKOhqpuvsaKoq66mmqerq6uzpJOYpKablZKFpGqkdYp6qXV7snGCpYqYjHCIoJuHpF9hUquFgK6DnHWugqiGhp96mZeGe2aAo4qkmIaBo32pf4GUhq5ee6hVnaKSgXqjn4B8xLDFjHOvtLO5cmKpr8J1aIyLl46BbJiQbmx4eHdua2ZkZHFxZntpY1xWX2lYWFRMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAnJyErLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C1sLCpraOop6qrq6ikpqCbpZ+dpqempJ2smqKsoaOfr6Oem5OqpLWwrqCpm5yWlaekkZuiqJ+gppywpaKosay2x7G1qayplZGdnaKZoKW0nZqhlJuep6upoq2aq6ihoamis62iqrOyopyrqbCwuKWUl6SomZ2SfKpsnoSIdqt5fLBugqSLiZ+WlZ6WgdK4tLjJgYKyX2GUqYOliIegepiWmnmqyXSao5SnqJCSmox+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eDk2SOj5yRe2+VkH1ueXR8em1bZWpycWaAal5hWGNtXF5ZSUxMSkVEQkE9QTxBP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwMa5ramyrq2lop2zuayroaabqKaqrKmmoKalmKqjn66snaahrZqfqaWdp7Wgo5iUqKu2sqybppyglpCmrZKanKejoKqnrqGjp6mws8GxsqmtqJSJmJ2lm6Kkr6aXoZWXm6WlqZmunKumpJ6ro7asobG5sJ6csKi0tLWmlpmppJuhj4KdTniagoCfeoSjfIKkhIamn5yflIS4fHx6uYJ/zMbDtnebopGLn36Zl5eKdp+XiqSYpKd+r4Wbg56ErH2ZlGGlbKNwj4WQgX2WhHKsYKRzcYCaYbx9UlV1jpGilnt8kY6Hcnlyg31wXGxud3JqgG5aY19obmJkXUxMUVNBSEdGSDo6Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuirLO1pp+hlaWvrq6op56lpZqkp6GyrqKpp7OgmqmklKO1o6OVl6GptbmknKOdo5OQorKZnpumpaGir62cpKiitbHCsK2qraqRh5Gcp52jpJ2ll56YmJilo6eYraGsoqSXr6W7rKK3tq6enrazurO1qZqfsaKln4eP0bXDt3qHjoWRk4+ApniUoneMoZKFpYOLcquHhrRucmmZpJ2Vip99l5mHh5BzroKlm6KMpoqTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicnJ+n2Jzsrhod4+TpJd9iouQiHZ7eI2BbGh3aXhzbn50XGRkbW1laGBKWldYPEhGP1MzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq6/v7y7tZ6XqKSutqKjmZWjqaetqaqZpaKfpqGgtaeiqaexpJSro4+kraSdkJqaqrS0pJ2mnKmSlJevoKCepqOcp5y1maCqo7Wqwq+pq6mijISPnKKhpqOWmpqcmJqXpaOll6mnrKCjm6ymvayVvrCtn6OxtLuttqmdq7SlqZl7qJF9fLB4i4CkpYicbbJvoYetfKKPg6iXmoGsiYathaCUqKCjl4WfgZmWgXuSfquBnZmWiqp3naCPiJOSf3mvXaOBfKanZJ6AfJd0a65dpWxyhZldYFuMoG2UkKWYgpOLk4l4eYGWfmpsfWJ9dG1/eV9nZXBuZ2doQllfWj1KUzJTOEFBQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTgxNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVlVRSEZJSiMoKLySm4SpxsO2wbSfmq2grrmmo46ao6Ogr66pn6Oena2Znrmgo6ugr6qarqGRqqmllomaj62wrKegqJutmJmPraKhnaWhmaScrZefqKW2qL6upKmjn4yAjpuboKaekpSZmpOZmaWjopinqqqho56pqL2kl8Otq6OirLO7rbCpo7WxqqyZdq9+kIqchYd9uq2JmGSwjGWWrX2hj4Onl5yCrYuFsIanmqSiopGFoFxsa4KzYH+te3uCgLFsZm6Zl4uIsVp9tFykg2vIomafgXu7WXa1WrJ9U6+BeqxYgKFtl46nmYiVjpOUeXeMm31jc3xig3h0gHxhamZwbWZlZU9VY1xBVF49SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt727tMGzo5ytpqW3qaCLmaCfnbKxqJ6in521mKCzqKqrnrCtnqycla6ooo6Im46vrKmno6iZrpOaj6maoZ6lnpmjoqWYnqKosai7rqSonp2PfYublqGgmZCRmpuSmZeonp+Xp6ylpKSipKm6n6DGp6apoay1t66wqaG+sK6ul4GpkqOujpuAhqSXmJCAgLjDuoOOnZOEqJmdg6yLg6+KqJybpquRftW9wqpipL+9fX+jgoPXure1hJSSgp69voRqo4Fvq4RunX96srHHg2ursL2teXiivrt0gJWNpZqNmY6Umnd/j5l5Ynx6ZIxneYF7YGtla2phUGJbU2lcQFRgQkwpPDo0Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLG/urK9s6Kdrqems6adjJelv6m2r6ehv6amspuesZ25qJ+tr6WnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6aep5uaoKiimJ2gq6ypuKyno5qXk3uImZKmm5OPkZiYj5eTqJielqinnqimoaKrup6pxaOhsKSrtLWrsqyjvqqwsJx0dqqkt4VliZ9wZ6yQio9ubnelj5qggXaxm5dxkY5yl6mkm5ivpHJsbW1mi3hvboOZcYB6aXBpZ4mWlZdxaGmFhmdwhmRdimNpb1pdZ354pmBico+ScGZkgI2SjqGWlZeOk5t6hY2TdGSGd2iManh+eWRsY2ZsYktlV0prWTpQZERQJ0o5KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurmys6qpoq6fpLOqmZK9scPHvLSpnr+rrKOgp6uguqOkrayspo6WraqQjIWVl62fpqqin6SjoJGLpZKnmamZlqOpoJacpaWmrrmqrJmak5J7hJeOppeOkZGYlI2XlKaTnZanopmvpp2irLmgsMKopbSnrLGyq6+uqrymsLmXi6GppbWciZaimIapm5CUnZKqtJmbo6yitJikop+io52ipaKWrKeMkpONh5OdnZWQmZOYkI6VhH+kmpeVjouTkoqPhoR+Z4yBdIN3dIeMcadtfZaTlJSBgY+Pjo6ckp6UlZOegIWTi3Boj3Zvind2fHlpbGVkb2NVYVhAaVpHYmBOWCtFPSsmITY0MC8fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW3rq6isKWtoKG3sZGOqsS8w7m2qaGknZulnbCopLennam0paeRmKyji4iJj5ynlq2koZqonp6TlaOXqJqpmZSmoKOPmqeYoLS5p6qYmpCNfIGVjKGUi5WRlZCPkpekjp2Yp56btaOdpqu3qK/Cr6S4p7Cvsa6rrLa8o7G+mZKmpKa1opKdpp6NqZ+Nkp+irbGaoaSyq7KapqKepaufn56dl62ek5qinJSQl6uZjZiYlpCWnpGHoJ6UlIWTjI+NlYuBf2aNiHWId3qJhHScaoiSlpWSiX2MlpGRl5GfkJqTnYKGl4V4cZRyeYl/cXt+am5kX3BpYFxfWW1iUGBkT1g5RkZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJakqKOws6yuo6mnraCotaqQj5ujsrmtqquhopl6nKKxpKaxqZabuKWilJipnI6GiombopCvnqSWqKChkpeZm66LqpaPqJinjJiojp24taOlmJuNiXmClIybk4qVkZOQjZGWoYucnKednrejf4OvtaOwsHWkv6SyoHh6oq21vpd3rqWgioCpfmRcYnafjqSeg5Z+bZS0nKOor6ylZqChlHR6m5hwgZmqmWyAo6mKZZylnJGXmJaLkpuQhJ2bkJSDk4eOjpKJhXhrkIh2h3F8hoGBYWmJjJWTjFt2lZFnaI+NcXmhlpVkeJiFgHaXaIOJgm55f2pwZV92b2trZ1xlY2Fhb1JZPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0dJS0xUVVVZXWBoZmdYUUk8REc8OVVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6qlqa6kp62lkpaqtK6wpZmppaqXc4udr5+oq6eUlrmfoI+cpJ6RfoiImp6NrJqklaeino6XkZ6Fda6PiKWaqJGWo4ibubOnoJiYi4l1d5ONlpOKk5GQlIyPk5+NmZ6lmJuyloCMm7WdtI2Sj72noX6no3ulsbqDjo+nn4SLhY+xqa+MiZaimnmAi6yGnJ6jqaupiZaHmXemnHuInIGYp4OBe52ze4qGoJiZlZiWgZCWloOZmmJ5iJGEjo+Si4RucZCIeoJxgYGGgId0h4WXk3iWaJN0oJp0e5mCnJqEmH6RiIGCmGmMjIRreHtxcGdkeG5pbGpcZGlpZXJbXEhTTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWlmWVFIOURMPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKSfpq6uq6itoKmxp6eppZmUrcW8r6CUpae0nY+DnKucpqKgjZC+npmNn5qhkX2Gj5iXiKydo5ahoZKNlImGgJGojoeinKOTlp2Gnrmxp52ak4+FcHWQiZSQipSPjpuLjpGdkJWeo5Sdq4eftIm0mq6Lyoirr4q3hY2whLOxhamOp5iNnXyoj3J7d5yOppZolaR5tIygoKiqk5nCgoCriZmhcp6Am6V9l4WVs4GhfaGTn4+Yl4COlJyJmJKLfIWTho2Vk4qEbnSShoB7c4eBhH2FdYaDmIGPxWaAqYePomqdgZ6XgJmAiouDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmNubGZsWGVGXVFMMkU0Nk1gYzcmMzxFR0Q6NjM2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBJZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZejoLCpqaimrKClubGpq6aalJ6ipKmhlKOptaKvf6CmnKWenYmUvZqTjaCSnZB5g5aVkYirmZybmqKFj4x3m5yOoJGInqOblpiXhqK4rKWZm42Nf2Jtj4uTkI2PjIyXi4+Rno2SnqCYoKd+oaeHrZ2glq6QoJ6dkYeCoI2tsYikjquajJp+onaAmZRrgat1Tat4h42dkpyqqYKqq36EoXx7p2qegJNsZ5eGmLeJnn5uYGNYg5d/jHtkZ4tzmX15l2xdfJduYFNxhVxgbXqEYFllgn6FgZlxqKtrg6NucqVwn4KcZ2SebFpsiHplWV+CfmFXUG92ZW10cWpqb15qb2xraFdnTl1YRTlANEdEXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJLTUJKW11fV15fY3VgTUU6TU5NVGJcW2ZmaWliYmRhZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiXnqC5oaqkpqySora9q66imZafoKWrq5+crbShp5Ggn5+mm5mOmbSZkIuejJWLdYGUkY2KppaWmJ+efpOFhqykh5yRipiomJmZkYelr6ailZmIiYBpboiHi46OiYuNkYuPkaCLkp2fm6Glf5OBj6OhlKB3nJaQp4OjqYCGrK+HpXqLfYSafaJwc5OHlXuejHlth5yMmpKdqpyPh519g6J0d6Znnn53pV6Ye32Tc6JumLe0unOSiIGAtqhkgca4fHCVtoxxgJujY3Ssq2F+ap2zfm5+iIOPg4yYcYCjbHOkc56CfqNenJmzlm97l56zdHJbnrKCaWJvc3VxaW9Ya2tycmRbZ11hTEQ9RDVRQVpwMjxSR19KUj08Mzk1Ojo2Qzw7QElQP1ROTlFARV9eW1lYYGB7ZElDOExXVVZjYVpmZmtrYmJlYWRjYGFiYGRjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4ta2toJqhm6KjpKyamrGsq5KXoJigpJmalJ6sm4uJkXiLhXGAlo2Kj6GQk5Sdl32RiY6ooIeYj4qSopObmoyKqKekno+Wh4R+a3uHfn2PjYOLkJCJjpOegZWbn5ygn4uJd5yYoo2gcqGMiamJnaiRmKqtgK6MfXqgmXmjk3iAc5eIjJx9lZ+HnI6anaeIo2ShfoqWkJuNbZ5om45vmpl7gIqnfXJodKqDnYJzqmeUml2bhXaFnWiqaoG4ZlypcIGcYZWMX6d2d4qKgJ1omnWHk5KYjn+ebZmQaqaZXKh+d7tqfalajoRds2dbbnF4d2tpW3Bpd3hhXmVWYUJQRU83VkJSbjRKWlpeTlpEQDE1MTs7N0g/OkNIVT9ZU1hdPkRiXVZgUWFjfGlFQjlOW11YZGZYZmZubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtkY2loZ2tplp2JqracqIljlZysu7Kwq52lm5qnn52smZ2wp6qdlqKZoZ+Zlpago5mGiY1piIBye5eHjJaWhJKUmI96ioSWpJ2JlZCGi52RnJuIj6ihn5qMkYqAgGmBhnl/lox7iI2OiI6VmX6SoZ6gopOYcmifiqCPjHCSjIKpiZqhpaqjqn6wraSiuJd2o7Oio3+IlHideqqZf6KPnp2YiZhyoX2HjbC1fWyakaF4fpm1o6OrqISZfJp8nJp+c6paXW97l4t4nmJNf3t7hWR6mEJNn1mianN8jm+CioSZdpt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfH1uZl9saHV7YmNfUF1WXFRWQFlFUWdFUlZcYVheSUQ9Qjg/QTpIRThMRVhBV1JaVkVGYVxaYEtgbX1xRUM8VV5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWR2bF5lZ2ZsZGVsaGhraZSdgbGumoRTXqGntLqzs6iaoouaqZubp5Kgq6Ogp4+enZyamZWYoZ2Wh4eJd4WBbnmVhJCbi32Rk5aIcoCJkqGbcpKQgYiYlJ+ahI6om5mVi4qKfINshIVxgaGMeIWNiIeRl5N7kaKfnqOIroZ9tYSPnp17ppZ6qYKXnpGMo6B+p2h3bX6Zc6BzcXydhZhvk4KtfKOEp5+bgqRwXqlodqNkcKZhnNOPfHuZeHJzY6KGkH6icqKPdWuPs4tggpiKdKqyqLx/d4Nuf7+mqrRenG9/cpdwgnOicl6kZ3SmYGimbJrTmHqCm252eZdrm3l2l3JsqaVnX2R5cH+DbGhmZG11d2ZfYVJaZVBRYUhXSVRfV1NbZGpbZFBFQ0tMSktBSkQ4UEBQTVhTWE9TUWBlZWlTZHh5d0lGRWNdZVpoaVNpaGpvY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGZobGiYm3+xrFRdS36pr7K1sLKjnJiEl6agoKKMpKefl6mJmZeYk5mTkqCXjoeGe3B9hGh8j4OTmoJ3kY6PinCAho+TkmyYlHyIkZKjlYOOqZqTkoqFiXmEdoiAboGfhneAkoWHmKCVeZKio5mgibOhoraLeqynpK6lcKmAm5GGgZ6UfaSBopqGmHGehKKtromXi3+MpI2Vg6+jlXe1trbJonOUi4KfYJ6XqW15loegm3Whh3egfpCWi4FvTGajknGbiHOle3p1YoOCbX6gbHJkYJxzf3SXa3tqtLa0xqZzmH56nGqamqt0gZpsc3eXaZl5dJdxUER9s15qdmt4h2ZrZmJzdHBtVVxSWGdPUmhJVUxYUlVcZ2tuVWdXTUpBSk1LSEtOQVFKUGRjam1ldXNzfnh7bnWJentVUU9tXmhca2lSamhpbGdtZ2NlX1xcXF9pYmRoa3tfXWRnY2pmbmxlaW1lop2JsKiFZUCUobOsr6+1oqKPf5anoqGji6SmnJumgpqXlo2XkJCbko6Ig3lreYZlg4x/l595dY+IjIJqhYWShIuFnY16jIqVpZKCl6iXjJGLgIl6gH2LeXCPoIZ5gZSGiJWelH6TpaeclpaEZ254nGyiZHxypXicmHBop4KZjn2le6GXg5Zyn3aAiZSVj7ltj4qiYn2Zo5eJbnNrq2t1oG1vpmCbaYuQaZaHm5V1ooF+mmCLho11b4hiaKFmnn9qm3VwZGeIgm9yoltfW2Shbl6JjHF8gHRyZKVueKJkZqdol3KLl22hb1KIj26gXmSnVItdVJhtbXJrcYFtcGhreHNrb1FWVVVlWVNtSVhPXEhYaGhzallrVlFSRVZcTVhTYVVoal53dXt8cH18coJ7f3N3joCEd15Rc2FnYnBnUGtoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupaqwsaafi3+WqpydpIuhoZqhoYCVmJONmo+Ll5COinyGcYCIaIuKfJeac3WJfZB8ZYOHlYqJlZqCfIiGlqaPgKGrkIWQioGKfYCAjnNpj6WEfYWTjIeXn42GkammnYmmeJacfqWJloyymZ6RhK+Xn6V5mIl7qXWnkISabqWijJKEjIO8bXylr4KHhoeVl52ifqZ7cqiUoJZon35vrGOWipaTeKhtqqOBiXWIgnerkaaIa5KxbHezjKlsi4Zvb6CekpVif6uMqneBgI6nn3effYWklZ2gaJqHdatmnq2MtnN2voyjk1mDpo2rYXVydG97dXBian5uZ2xTVVlVYGBca0xcUlxJXWxtdmBbcVhbX1pnc2Vub3FjcXRgd3p+eXJ5g3KDfoF7e42BgoB3YnlkY25zZFJsZ2dvbXJpZ2lhX15cYWpibGx7b1xcYmlibWl3bWdsbmKWpqudgYCepJapqp6op66jmYiBlqmZnaOJmqScqJ2Ei5qPhZyRhZKNjIx0hXqIg2+NhX6Xk3N1hnKRg25/i5KHhpSQfXuChZekjX+lpY2AjYmElHWCh5NvbIuogIKLk42Im56Ii5KqoqCQgHSUl4h+gXmUr6R/gpxxj4Z5ko2GgHtyqI1xfX16l5abhI14e319iJSVk4t3kZmhooV8f4lrjIVcenlzenFpb36TinGAdIKPlJNxhoSCZY1/X4GBjHh3dJR1cHpvb4lvhYZfd2l4jmeCg4aPqpx/dH2XaomIb351fIN1bWxmjHN4e5d3hFpqV3mPaW53cnFvd3hvXWuFbWlnVlleVlxka2RVYVVeUV9vd3lrandlampqdXxwcXRzYW91YnN7gXh1eYJ1f4B/gHmLhYJ+fG6AbWR5bl5XbmdpdWt4amlpZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW6qaeLoaKbpqSZpJ2roqCDg5aqkZ2giZmmmqiYg4Gbi36WlIeOiomMcoJ8jnx+j4R7l450coRwlYZ8fZKLhoaPhnl+gIaYo4x7p6CKhY+PhJWDho6Yd3GEqoWNkZyPh56dhoqaqJ+gqoOJjpWbf36Kl62okJOokXhxn5OEfJRwf6qHcH2VcWpvfIGfi3+Rjotobl2EjY2cnaCQc5eMiHF0a4N2dIBZcm+HkYJ+f4xqXWlke4WEiIBgaXh7nHyDjYN2goeEaXqMiWxicXODd19zjYOKkaiWh2eNj4Nud4uCb4OLd21kZWN5gnqVWltpZm12W3t5d3Rtc3KDZlxtimtrYllYXVlYa3FbXmBZXl1lcn57c290Y2pqaXt8cnp3dGRtdGhse391en17eXl/gH9whomEe31zfnpyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMq7GhkKOhmp+emJ6ZqKOhfYKWq4yflIeaoZCklX97mIR8kpmJiIaGinJ9gIt2hYuChJaKcm+AcpiHhH6Tg4OGioJ6gISKmp+PgqaghniOl4iVi4ucl4SDeqyBkJeZk4mdnIaHoaqfoaKji4iTm52jmZaroqinoZOciZmQfXqQkIapf3+SkZKTnLGlmpSdj42xkpiEpo2Nlp2hipGdg4mSimx9jnd3ZoOGkYt8iZ6Fh4uPiIiBhYSRd3x7dZukioiLoIyHln+AjYOBd3F1hoV/eYmIi5GnkYSHjoiDjJCLeoWJh41/dWqAg3x5mWlxaGBzinB9e3d2b3d0gV1eb4dnbl9eWVpcUmdxVWNbW2FsaHR7fHJucGNqaWh/e214fnBob3BsZoB7coKAd399f4R7bYOMhnx6eXx9eoN4TmR2anNucXtla2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5ajoZiVmZiUmKSgnXt/mKmNnYyFn5yKnZZ8eJSCe46ZiYaDhIdteIB/coCHfoiThG1rfnqXh4SDkH6AhoSHfIeDjZudkYapnoNyio+GkpKLnJF8jXupg42Rl5WOm5aFhZumn6KanYaDkpqZmZCZpqGmnp6Ql4KTjHh9iY+Fp3x9j5CRhZipoJyTnI6NqY2SgJ6NiZSboISPmH+Ij4RweYZydWF/hJCHdoyYgYOPgoaEfoaElW56dnWUpIyOhpuGhpB1gYx+fnNzfImFe3mNj4WUqJCHhI+Cg4mJiHSDhoaJem1qfH97bWhrbGdeeX5nfHx2dHZ1endcYHB9bXRgY1pbXVBmbVNlWl1hamh1en5wbGxjampngH9rcn9ranRud26EeW6GgHaCgH2Fd3KDjYd+fHt8gHuCi2Bpe2t2aGmDZWpjYGlcY3Vnb2J1bWtUYnF5ZW95enJlam1ti4qfuJqhpJ+TkpaXi5qfnpx6d5ylkJuJhqSTipiZeXmNhXyJkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foaEh32PgI+bm5CIppx/cIuLjJKGoKGKhYx8p5CHjpGWkpWSd4yjoKGdlpp/gZCamZONmqOipJuYkpyAkId7gYWPiKKBfo2NkHyXpKCgkpmQkKWMj4GckYmUmJx/k5N/iI+CdnWCcXdhfoGOh3OKln2IjHGMfoKFho9oeHJ5jZqTkYCYf4mMc4OJfX1yenyMhXt7ko6El6aUjYaRfISFhoR0gIGFhXhkcXp+eHlwa2pmXn1zZ3x1dnN8cn9qXmB0dnB3ZGNYXV5SamhUZVheYGdpdniBcWZrY2xnZX+Bam19Z25wan13hXpri4FygYF+gXV2go2Gf3x6gIF9f49qcoNudGliiGlsYl9xVnRvbG5geGhsV2p0dmN0enpxYmtveYmNn7OSpaadjpCYj4acoJqbfHWjn42Xf4yhioialnd7hod+g4l+iIKBf3B+enR1goV+iZB3Z2N9hpeKgoqNeH2AjYN5loCVl5WNlZ+afW+LgZGThaWbh4yJg6aVhJGKlZeSkXaRnaGhmJSYen+OmJePl5qdpZ6alJWde5KIhXmHl46ff4KKjo1zl6KdoJKYjo+hjIyDl5iDk5aaf5mOfYqOgndyfm57ZIB8i4Zxh5OAkYJrh4OBgIqFZnZvfYiUmo5+lHmNi32CiX58coB5i4Z6hZKLjJmjl4OEjHeHg4KBdXp/hoNzXnd3fHN9d2ZrY2B+aWp2c3N1fXF8Y2Nhc251cm1hWV9dWmtkUmJXX2Boa3R5hnFiamNsZmh8gmtodGhsb2h/fIF5bI+FcYCDg390fIONgYB+eoKDfnyQbXWJdHRtZopsamJjdVaDaXBtYHlnbGFqdnBleHt5cF9xbIWFkJ2vmKepno6Nl4eFn5OVl3x3qJuJmHmWnIuMmZB4e4CLfXyDe4CCgXhzeHlzfYCDf4iKgGRefYuViH6Fh3R9f4p/fpiElpOWjKOgl35yh3uTkYqmj4yOipKgkYOQj5OXkIqBj5igmpKQknSAjpKUip2dnqeZmI6VmHWQkYtth5mQm3uIiZCJb5edmaKTlYqMnYuGgZOdf5OTloiainyLioJ6cnprdm18f4x/boWTg5R4b4KEfn6LgWVzan2CmJiFgI50koqFeol/d3mBfoeBfYSOho2VpZF5hYJ0iIZ8f3FzfoWBbGB6dHlwe25hbmJke2Ftb3Zyd3dzc2F2YG9sdW5vXFpeXV1qXU9cV2JhaG1zeolrX2llamNod4dtZmxoaWxngHx6d26QiHOAg4R9dIGGiXqDfXqBhH18jnJ5i3l4bmyHa2hfaXJih2hxb2Z2Z21sYXpoanx7d3Bhd22LgZmaq6GkqZ6Ki5GGiZ6KlJZ8dqyXjJZ8npORlpSIdn17inx7gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkYZ/hIRzeoCGeo+Rh5GRm5Kkm5OBfYF8jYqSo4mNio2WmoyFkJeSlY6JiIySnZOPjI1uhJCOkYmemaKhmJeKl5Nwi5uGZ4iaj5R6ioWRi3CWmpOhkZKHiZiMgn+Sn32Sj5OMmY98i4aIdHN2a3Fvdn2LdW+GkY6TcnSAfIKCiX1lcW16f5uVfoWJdJKMgnWKe3CCf4KIfYWNioaOlqqOe4h9foqFd31vbX6DgWJnd3N0bnphXm9ganRecGp6eXhscnBleV1tbHNtc1haXV9halpPV1dkY2ZxcX+HZV1paGdiZ3GNbmNoaGVpZ4B6d3VvjoVzgYGDfHWCiYV4hXx4hIZ6gIl3f4t7e3N5g2prX3BodH9rcW9tcWdva2V7Ym5/endwa3d3iX+jmaOooaebiIyKgY+dhpKadICplJGNhqCMlZOQgHN7doV3eH9yc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWBf3+gho+KkZyXoJOWd4l+gIyInJ2Kj4aSl5aFiJSYjpaMi42OjJ2KjpGEboqLj5GKnJahnJmWhpmJbIelhWiInoqSf4yEjIF4k5iRnZGQh4iUjX9+kJl8kY2QjpqSfYuBhHB2cGxub3F8h2pzg4+ZinF4gHWCiYN6Z3NvdoKbkH2JhXqVk3t4inVxi3yHjnuLh4WKj5yliXyEd4GKf3d3bGl+gH9ccXJxb293WV5vYG9qXm9qfHpwbW1qbXdgcG9rcW1ZWGBhYW1XUFNZZWZidW+EgmJda21kY2Zrkm1gZmZfZ2qBdXJyb4uAdH+CgHl2gIuAeYV+d4eGdoOFe4eMgHt3in9qcWJ8YoV8b3BsdWpobmx2d19xfnl7dHVzf4J+pZabrZ+nloWMg36XlYOOnXSKn5OShYqajJWOjHpyd3SCcHKFc3F1iGxubHRsh3aDfX9tblVRgauUh4J4gHZyg3mCoIKRgZKRl5uRmXeReoKMkqSak46IlJiShIWWmIuTi4mOj4edhJGLfXOLhYiPiJyZn5uXlYGVgGqIn4loiKGIk4WShIpxg5GXj5qNj4uKjo13e5ORe46LjZKXjXyJfYFsd2pvbGxte39ien6PloF3eoF4g419emh1bXWIl4yAiYZ8lZFye4ZxeI57i457iX6EjpGfn4Z9fXiBinx2b2dqf4B3XndvbWtwclVdbmFxYV9sbnlwZ3BmZ3R1aHFsYXdlXVVlYGBxUlBOW2VkXXhviHteXGhxYmJlZZFpX2hlW2dvfW9rcXOKfXZ9hYB1dn+MeXuGgHiHg3OGhX6MjIR8epV4Z3Fqg2CHfm9va3tgaW10f3RfdHx4hnhzc4V8eaGQmrGdpo6Cin+CmYl/ipx+ipiSjoSIl46OjoR3dHZzgHBvhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xwdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2InH+OgXh7jH+IjIqcnJyblpR6jnhpi5SKboqlhpSJl4OGY4yRmI2UiZaLjImLcHqViXyOiYuUkop6hn1/bXxlc3BrbXt6XIF5kI6Be35/gIaPe3ppdWt0jJCKg4eGfpeNbX+AcIKOgI6JfoR7g5GWm5uMfXd4go94cmxlbn2Baml0b2doc2xTXW9kcFpfbHJ3ZmtrY2d4c29wY193YGFVa19edU9OS2BmYlx4cIp0XFtldmBhZGSOY2BmYlhpc3Nta3F2i3x0eYaCdnd+i3N/hn96iX9xiYeBkYqIfX6ZdmVzbnxlh39ub2uAWmtueXlyYHZ6e412cnaKdnqfjJyvm6CQgoV4iJR+e4ich4SekI6FjJeEk46HgXV3cHlwboRvbW5+cmNkeHB8bnp8amhsYqSawdyu76JzbHWDdYShhJFulY+Un5OagJFwhYujl4mOlYqQnZWDgJSPhYiPgJKKipd+h3t2f4l4hoWOm5uXmY+Qdot4cImLjX+NpoaTi52Fhl6LlJeJjoiNioqEiWx8l4J9iIaKkpCGdoZ+fmx9ZHh1am96dFiIepGHhnp/f4CGjX96ZnRrgYuPi4SEgY2Yhm2Dd2+Jk4OShX+Ce4GRl5SbkXV0eIeMdHJwZXN3gGBzbW9haHRmUmBwZ2tVX250eWFzY2BpfXFybltjcmFjVm5aXHdNTUxjZmFddnOKbVtcZHheYGRmhF9jY15YaXJrbmtyd4t9c3eEgXh4fIlxg4R9fYh7dIuIiJWGjH9/mHNodXF5bIt7bnRwgFdweXZ5cWR2eYaMaHaAiXGAnYiZqJyikoR8cIyUd3iJnIOEn42OfJWMf5qIhHxzd3Bzam+Ba2lsfHReYHh2e3B0emdgZXzr2rXJw9yJc2x0gHaKmoiMaZePjpuTkYGIcIWIoI6Fi5WKjJeTfI2SiIKIj3qRi4aPgoB3eIOEcoeCk5uWlJiGjXaIgHKHhIuJnKSFlo6fhIlhg5WPhYiFiIyGgIdofZR/fYKFio6PgnKHf4Byd2h2cml0eG1ajH2SgoZ9gIOBhIuDdmJ1bYqCkYyDgICTkn5vg216iJGIlIV9gn6Bk5SRmIpvcnqMhXRrb2lwdn5dc2huXGl0X1FkcWhmU19wdnRgcGBdaIJxcmpXZ2ljaVdtV1t0TEpMZWZeYXJzhWlbXGV5Xl5kZ3pgZF9dWWtuZW5qdHeKfnNygX97dnqIdIWDfH+HdnaKhY+YgY2Ce5N2bHd2eXmTdW53en1YeYVxgG5neHaRgmR2hoVxipaGmqGboYqGc2+Si3F2jZp9iZmIiXuff4OZf4J5cXRub2RyfmhmbHd3W194enpxcX9pYWdhf9W2jpGmeG5xd3txkpCMhmqYjYiakIqFemiHi5mGgZKRhoaXjXuMjICAiY17kI1+iYV6dXuDfHGGgJWZjpOUgol2hIh4hYKNlZ+hiJeRoH+IYX+Th4OHg4iMf3+CZn2RgH5/g4yPkX9tg32DdWxtd3V0d3ZsY42Bjn+Ff3yEgIWJgHFgdHKGfZCOg32Akop6coVne4WMiI2FfIV/gZWQkpSFb3B5i390bG1paXd6YWdqaVhrdFlSaHJpYlBicnhsYmVeWmqDbnNiXGdfZW1fb1Rab05ITmZkXGZucoBrWltjc19cY2t2ZGVdXVpsbGJtanN2hoBxb398fXR4hniFg3yAiHZ4iYGSlXuJhnaJgW94eXuDkm9te4B2XoN/dIFtaHpzlHNnc4d8cpKShJqfm5+Gh3V1lH5tdZKWfYeQg4qNmXyMmnZ+dnFvbGphdHxnYml1elpgd3t5bXF+ZWRoaFedj19yc5e8xIR2cZSIj31xlouGm5KLh3JqiI+WgHuVjIGEmox8ioV8e4mLf5SIdYmGdnd+gXJ1hoGelIWUj4SEcoGKd4d+i5ufmoiVj52BiWZ9k4J+hIKIiXGBfWZ+jHx5f3+HjI99aYF+hHZncHl4c3d0bGuOhYqBioB5goGFhIFsX3N5e36Oi4Z8gpCBf3OCanqFiY2HhXmEfYKZjpGNfm5te4l9dnRuZmV7dGJbcGJXbnFTU21yaGFOZnR4ZmBeXVlvgG9zWWViXWpuYHBPWWtRRFNnYFpqbm18bllbXW1jWmJwdmNmXF1ga2ljbGpzdoGDcG1+fIB0dYN6g4J8gYV2foiBlpB4hIp0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGuTjYafmaCZhIhufYx2aXeXjn6BioKUl4l5j5VvenRxbGlkYHN6aF9lcXpaYXJ8eWdxeWBlZY+xsndLYlql2dCWcXuQio93fZOKhJiQi4Vua4WSkXp5koeBhJiKfIZ/eHeJioSWgG+LiHF1fntqeYWDpZCEk42Ef3CAhHiGe4idm5aNlZGVhYhwe5KCfIGCiINugHdogIR4cn+Ag4qIfGV+f4R2ZHFzgGl5cW91mY2Gg4t9d3mBhXqDa1xyf3OCiYeKfoeKe4lzgm9yhYiQhoZzhXqCmo2OhXlub36Ef3Z6ZGZoe29eWHZaWHBrTldxcmZgS2x3dGFeXFtadX1yb1dnXWZqcWBvTldoUj9YZl5ab2tnenFbWlhrZVpjcHleZ1xeZWxnZWtpcXd/iG9sf36AdW+Ce4CCf4J/doGFiJeJcYKNcXuGfHp5hJOMdWp5fmtvfnR/fW9ye3qTb26BfnhnkouDoZmckYKFZoaDb2d5lYh9foSCmImBfI6NaXhza2tmX2FveW1fYm94XGRrgnphcXZfZWXU6r2LMjo+i45/cXiFh42NdYKWjH6SjYx+bWyFjIx1fI9/hYGViHyCeG52h4SDl3duiIVsdXt1ZnmCg6eLgo+LhH5ugXZ5hnyIn5KNkZOUjouHf3uShnd+g4yCa39yaIB+eG18fIKLg3hieoWCcmRyaX5udXF1gpuLgH+FgHN2foFzgnBcbn91eYuEi3uIgX6JeXtybYmEkYWMc4N6gJeMjIB1bmt2gIB1c1tnZ3VuV1Z7UllvZExacnJlW0lweG9cW1tZXXR+dGhZYltnZW9kak1XZlE9XWVcXXVlYHVwWllVbmNZZHF5WmhdX2dtZ2lraXB3fY5taYKEfnlugHx9gX+CeXSBgY2ThHCBi253foB7e4iSiX9oen1qc3tyhXpzdn1+jHp4hH18a4yNhJueloyBgGyNfWtofo2Len5+g5OCfn2KiGt2cmdoYltiZ3NvX2Frc2BocIh5YnN0XmNkm6CPblw1Wq+1dGmAiHyShnWFlYVzjoqJdm9shYOHdXmJeIl8k4d5fnJndYl+fphvcYZ+aHZ5bmZ5h4Skh4CHjYp+b4B3goN/jpuIg5WSmYqLhYl8j4hwen2Ee2h+bGqAe3pqeneCiIFyYHeBfnJkcmd2gm11e4aVkYF8goFvd3p8dX9tWXCAd3WNg4d4iHaDiXt5dG+LgZGChnOAfn+UiYp7b25qbYGBdG1cZmRycFBaek1bbltPW3JvZFVLc3hpV1lZWmFwgHRgXV1hZ2RpaWZOWWhNQGBjW2B1YV11bFhXU3RhWmRvcldqXmJoamdtbGhwd3yTbGiEinx8cH5+e4GAgXp2f3+Ki4NxfIdvcXeDf3uJjI+Dan17bXd4dop2fHh/god/g359em2FjIiZo42Eg3t1i3hrbISHkHh+e4KRgIB+i4Nwc3FjZl5ZZl9vb19gZ3Bmam6IdGF0b1thZGp2e4C/nKakyLhxhIJyknx3hpKCc5CLh3Jyb4N7g3R0h3SId5SIeXlwY3eHeoCTaXKEdmd3dWNqfIKInYGAf46PfnOAdYd7gpORhHqXj5aQiIKJe4iIa3h5fnRnemhrf3lzaXp2gIN9aGB4iH1ra3RofIBpdoGMkZR+en9/cXx2fHR/YlZ4fnNzi4WCfYRxh4p4eXFxhIOOgH96f353j4aEd2pxaWyHgXFvXGZhcW1JZHVLXWxUU1lybmJRT3R4YVJYWF1hcIJzW2FcaWVlZGtkUFtwSURjYFtjcF5dd2hVV1Z2XVtlbmhWa15haWdlbm5ocHZ6k21piI14fXJ7fnmCgYF7dXyDiIaDcHeEcm13goJ+iYuTf3CAe3d5eoGMdIJ4foGBgoR5gHVvfoqLm56IfYV6d4V7Z3SFi5B5fn97iIaEdo+AZ3BuX2RcWGVZbXJhYGBwbGtoiG5hdGlZXmRugHep2qnHhoeycYh3b4x0e4WNf3qSiX90c3R+d4BwcX9thHSUhXh1a2B6gnmJj2ZxhHBndm5bbX2AkJN/gHmRk355fG6Kd4KTjYV1l4uSj4eFhXt/hGx0dn5sZ3ZkbXt2bWl3d39/fGFieIZ6aXV1Y357Z3WGjo2Ve3SBd3GAe31ugFpXdX9wdoWIf4B6bYmGdHpsdoGEhX98fnp9dIuBfnRodGVui4Nsc1loXnNkR21tS1pgV1ZVd21iUFJ0dlhQVlheYXGEb1xgY21lZF5vY1RcckdCZl9dZmddW3tiUVZcdFtbZ2thVmpfYG5lZmtwZ3B2eI50a46NdX52eH53gYSBe3N9g4iHg29ygHRxdX6FgomNint3f3iDe3yGh3eHfH2BfoSAe35ydXmMjaCMiXmJdXSDeF59hZeLeIaDc4WGhHeJe2JubVxiW1thVmlzY2BbZ25wZodxYXFmV11ja398ys6HuaFqbW2KbHGDcXyDiX56kIR5eHN5dXV7amx2Y4R1koJ2b2ZefYJ6i4plcoJranFjWG16hZuIgoFzl5R4f31vinKEi42Jc5iPkYmGi4N7eX1wcG98ZmhxYm14cWprcXh9fXpdZXqAeGp2eGaDd2d0h4yOlH1yiGpvfoF5b31dWXN/bnWBi3yCb3CKgHF3aXiAgoCCeH5zfHWHfXtzZ3NhbouBa3FXaV12W0dtakxWVV1TVXtrYU9UdXJQUVRXXmJ0hWldYGxqZmNab2FYYnBIQWdcYGVeXFZ7Xk5VZXBZW2poXVdoYF5yZWtncGdxc3eGeG6Vi3R/enh+eYOIf3Vyf4aFjoNwcHt4d3Z5hoaHjIZ6fH90i359hoSDh35+fn2Hf3x4dXh4kZOff4x8im11f3hkg4aVhXORim+FhYF6g3RkbmpZX1tcXVRncmRgWWRxcmeAcmJrZVdbYGp/d76ue6C2bmFzhWhze3F4gYR6fYt+d3dydm97dmVqb2GHdY6Ac2piXn94eYuEZnF/aGtrWlZvd4mjgYV/cZmTcoF6d4RvgoOTiXSWio6IhYmFfXh0cW5oeV9qbGBtdmpnamt5d3p2Wmd9fHlmc35thXRldYWNhpZ/cIxna3uEdW51Yl1xfWx1fYx7gmd2h35ucWl2f3l/gHN+bXt8gnt5cWZsYm6JfWxtVmlfdlVKaWpOUU5nTFh7aGFOVXVrTFFUVV9mdYNmXmBxaGdiV2pdXGtoSkRqWWFkVllVeVlNVm1qWV1rZFxZZWNedGVtZHBmcnB1gXhxmYZ2f353f3yFh311c4KIgJWCbnN5e3pzc4WHiYmDeIF9dY9+fISKjYOBhHt+i4N7dnt3d5qdmHqJgoZpdn17bIODkn9yjoFwhYJ/gn9wZ2xnWF1bXFtTZHBkXldicnVqdW9lZWJXXFxof3BvcoBziWRkeX1pc3VzcoGDd4CDeHZydW5renFiZ2tnhnSNg25mXV99cHuJf2lteWdqZFVXcm+NpnyEe3aWkXV9dH58b318kod4mn2Ih4OGg311b3FsZ3RcbGdebHRkZ2Vpem97cllogXd1aHCBeIJ2YneFi3yUgW+Ma217gnFndGZhbnpnc3iLfH5jd4R3amxydntxe3p0f2d/f4B5d29kZmJuhXtsalVoYW9SSmhqT0tOb0ddemZhTVV0ZEpPU1dhanZ+ZV1nc2lmYFZkV2JwXUxLalhjYVVUVXNWTFh1ZFlea2BcWmNlX3ZnbWJvaXRvcn50dJqCd3+Ad4B/hoR6fXWChH6XhW5ydHx6dXGEhY+BgHqLdXSQf3yBlY2AhYR9fYyGen2AdnujpYp5iIWEa3V8enWDgYt6boRzeYR9goN2b2ppZVZdW1paU2JtZFtYYXN7amhtaWBiV19baoBqa2+AZ2tgaHl4anJzc22DgHp/fHV0bXpoanlqX2VuaIF2kIRoZVhid2p+h3tvanBnZl1UWG9njqh3gXp8kI56dnGAcXR3epCBeZZ1hoOAhYh2anF1Z2duW2xjXW1yX2dhanhoe2xbboNzdGpwgX56d2F3hYV5kIZ0iHJveYByY3FpXXF4ZXJ0iXx5Y3SAcWhqenVybXl4dnlkhHx/eXdxZGRjbnx8ampUaGFlU0prZ09HUWpFYHdmYU1Tcl1KTVRaZWt2emVebXFpZF1WYVVubldLU2hXZl5YTVVsVEpceV9bXmtdXVpjZWB5aGxgb292bnB3dXqYfnd/gXmAgIeGenl6g36Bk4RxdHR/eXZ0hYiRfYB8kGtzlYF7gp+Gfod9gH6GgoCKe3aEq59/eoeHg2tygXl1gH6BdG6GbnyAc4qAanBuZGRYX1pZWlRhamdbWl91gmlebWxcYVdcXGyBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cmx5Z2l4Zl1lc2h6d5OBY2NUZXBogoV4eGdpamFXVllnY4+nbn53gIuOe3Fyf2l6cHuOfXiQcoR+f3+GbmR1cmRnZ1xqYVxvb1xnX210ZXpoXXSAb3Jrcnx+dXZidIWLfImIgYB4cnV/dWFwbVtydGNxc4V8dWVzgG1hbXtwa2p7eXZzZoZ2e3t2cWViZW1yfWlrU2deXFRLcWJQRlVgR2J2ZmFLVG9YSk1YWGdrdXpkZW5xZmRaV15Yd2VUSlxiV2hYWUhXZVBIYnhaXV9sWl5cYWNefmlqX250eG1wbnaDl3pygYB8f4mMhn11dYZ5h4x8dHV1gnl6eoKMjn1+hIlpc5aBeoqdfn6FeoF6f3yGiHNxj62Me3uGj31kcYd5c3x6dXJvhmx7fmyPemNwb2JlXWVWWVlXY2ZrX11dc4VoWHFuW15YWlxse2Nwd3VsYllsc3NndHVvbIN4fn94dm1udGRpdGVbZ3VmdnaSeV9dUmZma4OCdH5iZGpcVFddYmOPpGh4dIOGkXlucXxpem58hnx2inOBeXx4f2hkdmxgZl9eaV5cc2tZZV1vb2J6ZVx3fGtubnB4eXR1ZHODkn+IhIl7d29yfnNieGRccXFicXKCfXRncoBlXm53aWVoenx1bm+CdXR9dHJiX2ZubnxkaFNnWFhUTXZfUEpZV0hidGNhSVRtU0pNWldpbHF7Ym1sc2NiWlpbYXdcU0xjXVhpU1dHWWBNR2l1WF5gbFtbX2JiXIRpZ2FueHltb2p2gZB5bYN/gIGTiISBdnSIdIyGdHJ2dYJ3fH1+jJCAfpN+cHeWg3yZk3mAgHh6foB0iIN0cJmhenp/iZR3Y3WHeHN3dGt0b35reHxwkXNecG5gZ2JsVFpaV2hjbWZbXHGJZVNybltaWFhgbHZjaXVqaV5ZbXNwbHNzc2mEfH5+e3ZubmxkaXFjW2tyZHV2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJJ1bGx7b3Bxe319c4F3gHN6enpkZXVoXWJZYGdaXnZoV2JdcGhhd2FbfHZpanJveHRzdWhxgpWDh3+FdnNqcX1uZndYXWxuY3J0gXp0Z3B+W2BwcmJga3J+bW11f3NyeGtxYVxlbG16YGZSZVRXUVB1W1FPWFFIY3NhYEdWa1FJUFpVa2trfGZub3FiW1pYWWxxV1JQZldWaFNURlpcTkhxdFhfY2xiWGBgYV2LamNkbXl4bHBpdXmHe2uDfX+EmnyDhHl8h26Ph3Jvdnp9dIKCfIuPg4KXdHiClIWBn4l1gYCBdH+CcYeCdW+hlnN7houGemV3im5tem5meHB6a3N2c41rXnVuYWdla1JdW1VnYWxrWlxxjGRPb25dVlhVZ2p0aGJ0ZWRcWG10bW91dHhqhnx/e4d2j3NjZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1kX2NUWl9ZYpWVY25wg4WKdGtpfHBmdHh1fW16dXZwen92X2VyY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGl0cXRxdXZrbYSTgYl8hnFzZ3B+cXNvVFxna2ZydYF3dGNtdlZicmxbX3BnfmZtd35zdHNrbmFaZGpqd15lU2NUVVBUbFZQVlJQR2RyX2FGWGlPSVhUVm1oZHxpa3hrYlddVVt0ZFNSV2hRWGZUU0haWlBNd3ZaX2VraVlhYF5ejm5hZmt5dW5vaXZ2gH9sg4B9h5h7gIeBiX5rk4hyZ3SAe3WAg32Jj3+Lk3J8ipGFh5+He3+GjHSBhnN9gnZupItygY2LdndseoxgZHtwZnlzeGxtcXeDZ2R8bWNmZ2hTX15VZ19sbltebo1oTmltYFRWU25ndGtleGRkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcXl+Z1pWWGBseHx7cIRfY19nVlhfV2ObiGJrcIGHfXhsbHpuXHdzbXtqdnRvcHyAc1hpbV5YXFVhYldkcGNTXmJpYWJsWmF+bGZsdHZvbXd3bGmFjH+JfIltcmdxfW5zbmNbYWlpcHSCdHNeaW1TZXFlVWNvY3tkcnd8d2xwbWtgWWFmZ3RcZFVgVVJOV2RST1tOT0hkb1xiR1lpTUpfS1htZGB4aW5+ZGBVX1RddVxUU2BmTl1hVVNKXFlQWXR1XV9la2hYYmFbXo1xY2dqeHFzbmh2dHqEcoKDeoiOfnyJh415bpCKdWxzgnR/f4iFh5GElY95fYyPh5GbhYB8jIVzgIFzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2MjIyMjIyNjY2NjY2Njo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjIyNjY2NjY2Nj4+Ojo6NjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQVLM2tjY2NjasJ2goKCgpV4qLy8vMCxIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUyRtjq5+fn5+m2oKOkpKSqVhUcHBwcFzqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4aJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGk5SUlJSUlJCPj4+Pj4+IgoODgoKChYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZGSkYmHjoqQkpKTj42LipCJj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2LiouLi4yMjIyMjIyMjI2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkJCHiIWJioaIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQjYSJhoaHhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJGJgoeOiISFiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjI6IhoeGiISKkI+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNkI6MioqOio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgYCAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/f39+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fn5/fn9/f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fX9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fX9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fn9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWFhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHx7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p7fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk5Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5e3t7fX5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz49Ojo6PDo4OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZFSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnZ3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9P0A+PD5APz09PT8+PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJFQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD47Pjw/PTw6Pj0/QkJFQD9ATmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5NS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBQ0RCPz1BP0FERUVDV3WGiYp+WEdJSkxMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5vcHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSElHSEhJR0dCREZERENBVnSHiYeHhoiCV0lMTUxNTUxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMS0xMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSktNSktJSEZGR0ZFUGyEh4aGhoeHiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8/P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX9/fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS01MS01NSUZKVmyBhoWEhYaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREFDRkhJSEhIS01MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSUtMT05OUU5RXnKBhYOEhYWGh4iIiImJjI5mQkI+ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkE7OTk5PT0+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+f35/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY7PENAQkZIS0hMS09VZ3uEhIOCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NTU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg6Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5/fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo8REJERkZFZnqDhIKCg4KFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Nzk5NzY2NzY1Ojo6Ojo8ODk4OTk4Nzc6Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09QUVdrcnJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxEQFF/g4ODhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+PDo8Ozw7PDs5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29ydHV0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj49P0BEdoODhISFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQ0FAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBBQD8/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw8Ojs7PDs9PkFAPmKFg4SDhYSGiYmIh4aGhoeIiYqLi4uKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERkVBRkVGREZGREBCPz1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo9Ojw7Pj4+Pzs/PUA/Qz9KfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKh1dHTExNS05JSUtISUpKSUVDREZHRkRDRUZEQkhJTEdHR0ZIR0VLSkxJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9PD5AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3PD47PDo+Pz5APT8/QkJFP2iEgoWFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NT01MTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExtcHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ojs8Oj4/PT4+QEFEQ0lTfoOEhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTExMSklIRkpJREpIR0tKSEpHR0dLTU5MTEhISUpNUE5PTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW9xdnZ4ent4eHp6fHx+fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojs3PD06PD88PT5AQkRETW2Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIyLi4uLXlJSUE1OTUtKR0dDSEpHTEpGS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDtAQTs9PDg/PT0+QEVFPkNFQ0dLdYaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVGRktPTk9XVlFQT1FTUk5TVE9NU0xQU1VXUlNSUExKTU1NS05HR0pGRklKRERFRUJEQ2NxdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PEE/QUFFVUxCSUpHSkx5hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZU1lYUlpmUFVXWl1SVFdRUE5SUFBQUUtMS0dISkhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUFDRkRDREtWUEtQUE5QUHmGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4ZsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1XXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NSkxKSUlMTUtPTVNvdHZ4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hMSU1QS0lKT1NSUVVWVVZUdYWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl5eW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSklJRkJEQEE6T1FRV1hQUFBRUlNSVldXV1dsgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWlpYXGhiR09aaWddW1xdXVdSTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaWlJTUU9RUlFVUlVTVl51eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeVFFRUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x9fX1+f31+fX59fX5/f39/gIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVZSU1JSVGNkdoCDgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlBRTktSVVJNT1lRTU5RU1VVTVFTUlBPTUxIQ0lHUlNUWl1tcnZ2dXR0d3t6e3t7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0YGRdXltZVVFMSUxJYWySdFBRU05RUlBTW1JTUlFSVVVic3t8foCBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+QkJDQ0I/RFBDREBDPkJIR1ZASU5NR11pUUhGT0ZERUZIR0hCQ0hHSEtHREJBQ0BOUE1SZHR1dnVzdHZ6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFSUFVZU1VRUVRST1Zga2xzdnp7eHl1cm5zdHN5eH5+g4CDg4KBgoCCgYFrTEc+Pjo6PkA/Pz4+alBKYUVGSElFQj9ITU1HTVFVSkJFPz48PTw9PT89P0FDQ0A/PD1CPklNRlVvdXV2c3R2eHt8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSk9QTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yaW1scXV7en17eHp8fHh3eGRCQEBBPDpCQ0FBQ0FbXE57Tk9PTktMTU9PUExLTFdPSUdBQTw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dnd1dnd5fHx8fXx8fH1+fXx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9PXlxaSUdPUVFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfXl9lYF1ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RV1BNSkRGPjo5NjU4Njk3OTozNjU3OTU8Qj1mdHV3eHd5eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1NUU1BRVU9MUlNUV1hTVFhRTFhZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9NTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTk4OTc4ODQ3NTc4NTk5R25ydXl5ent7fX19fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTU1MSkZQUFVZU1RPSk5PVVNUXFZSVVNTT01MSUhIRj8/PTo3ODc2NTk5Njc1NjVXcXF0eHp6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhYWVlZUlVPSkdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBQT05OTVBOVFJQUkxJTEtPUVBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZGQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj40QD5qb2FSUlFAR1RRT1BQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz09PDk9RzY2NzZEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhETVNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTE5OTUlNTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRyc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QUBCPT5FSEZERkZJR0pKQEZBQUBGR0RJT0hRUmFcUVBST1NOT09MTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRT9CQz49Qkc/Qj9AZHJ1d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENBQEdJRE1PYmVQTU9NV0tMTktLTU1MTEtOTlNkTUpMUklJSUVCSUpMTU5KR0lHQkFCQD9FRkVIRExvcHZ6eXl7e3p7end0eHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0hLRT9CPTk5OTo/Qj88QUJBQURER0tGRElJR0dIQ0M/Qj8/QEA9Q0VETE1RVExKSU1URklJSkxJSktJSkxNT1BSUEtHQ0xHQ0NLSkxOT05JSklHQ0NDRElKTUxJWnNueHl4ent7eXx2cnB1cnR5eXZ4anFvamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEtDRkdIR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEVKTEpFSUlGR0dDRDtBQEI+QD9CRURJTU9HSEpHSEtESElLTUhKTEhJSkxKTV1SSUhETkdCRUxLTk5RTkxNSktGR0dKTU5STk1jbmp3dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZXBGS0NGRUZERUVGRUdDQ0A9PD06Ozo7QURBP0JDRUVJRkpKTEZJSUdGRkNCO0JDQz4/Q0NDREZMTkhKTkhESERJTE5NSElMR0ZGSUlMTktKSEVPSUNHTk1QTlBOT09NS0lISU9TUVJOU2dnZnJvc3h2e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1d3ZYVnV1a290cmtvdmxobWZfcEdKQ0VFREJCQUVAREI+Pz46Ozs9Oz0/REI/QUNGR0tGSklMSEdHR0ZFQz89REVCPkFDQkNFR0hJR01QSUZGRktOT0tGSElGRURFSUlIS0lGSFBLREpNTVFOT05PUE5KSklNUlVVUlBYZWFhbWdxcm9yeXpnZWhoY2lsZnFsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUZCQUBBRDxCQT5BPTo6PT87Pj9BQj9AQkVHS0ZKR0lHRkZGRURDQUFGRkNCQkJERUVHR0hGTFBMSU9KSkxLSUZIRUZFRENJSEhLSkdLUk1DT09OUU9PT05PT0tLS1BVV1ZWVFlgX11pYW5qbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV1dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNR0dFR0FBQENEPEFBQEM8ODo9Pjo/PUBCQEBAREZIRUhGRkhGRUVEQ0RCRElGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTk9QTUxOU1dWV1lWWF5aXWRgaGNqaWdrX2RlZmNoaGdrZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQUFCRUU8QENCRDw3Oj0+Oz47QUI+Pz9DRUZERkRER0VDRUNERkZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhFS0tMTE5PUlRPSVRVVFFUUFFNTlFOTVFXWlZaWVdaXlpYYWBgYF5oZWNgZGVnZ2poaGpnaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQUNHRTxARUJEPDg6Pj4+PDxCQj1APkFCRkNFQkJHQ0NERUZHR0dJRkdLSENJSEdJR0ZESEtJR0tITUtKS0xITEpNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVVlaWVxaWlxfX15gY15cYmRsY2BkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCREdFPUFHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRGRkhIRkhHSUtKRUpISEpIRkZMSEhISkdMTExMTElNS01OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZV5kYGZoYGVoamRzc2ZqaGZscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndwd0lKS0lLR0JFREU8QUZEREI7Pz9BQEBBREFAQj5BQ0hCRURGR0VJRUZFSUhGSUhKTEhISkpJS0pGSktISUpJR0tLTUxKSk1LTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYmBjZGViZGljZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dXNwc3d0dXV3dnV1dGVxc2twcWpydnB3SkxLS0xHQ0NBRTw/RUVFQz1BQUNCQkNFQkNEQUFFR0NHRkhGRUlGQ0dKR0dKRklMSElKTUpMS0dLSUhLS05RS1JRTFNNSk5NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYWNeYGZiYWNpbmhjaWhobXh2bWhpbm9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZzcXF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdFQUBEPj1ERUZDP0NBRURERkNCRUdDQ0lFQkhKSUdISkZES0pHSEpJSUtHSkpPS01LSUxISk1LWmZKZFxLbFJHTk5fblVsc1txcGJ3Y1JQYnZ1aHVjYXZhWG5xYmR2aW56ZlxsdWBsa1VgeHZpamhoZmdsbWptb2ptb3NycHJycXJzcnNzcnRybmx0b25wcXF1dXJxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PERFRkRDQ0NFRURGQkZGR0RESkRESkxLSUtMR0dOSUhKS0dLSklLSk5MTExMTElNTExbc2JkcF5sbFVMTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5uXHB2Z3FOS3J5dmthYWtlZWx4bWt2bG5vc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQT89QkVGQkVDRURFRURCSEhHREVLSEdLTU1JTExGSk5ISktKSUtKSkpLTU1OTU1NS05NTVtycG9ucHBsa01QUWxYTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBdYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRkVFQkFCPT8/RUdCR0RJRUVEQkZJSEhER0tKR01MTkpMTUdMTklNS0hKTUlKSkpKTk9OTk1MTk1MXGhkdV1scVdsTk9RbVVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZJTEtGTUtLUVFMSE1NSE5KSUhOR0pKSEhOT01OTEpNTUpadHBwb3FxbWxPUVJuWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqW150Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNFRUVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRktNTEZPSktXUktHS0pKTklJSkxJS0pJSUtNTU1MSUtLS1NrYlppXl9qY3JyWl9Za29gZWVVa19kW2FiUWBtaFxqXG5paWRab2VkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JJSEZJREVERkFAQUVEQ0dCSEpMR0ZER0tMSUVGSk9MSU9KTFtRSkZISEtNSUhKSktLSUhKR0xLS0tHSEpKTExMS0lLTE5UW11UUFVNUVBOT09VUlBQUU9PUUpKTlBRZHFpVFlWW1tcVVlbXVhdXFxjZmFhZmJjZl9eZmttaG10eHJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdJUUtMT0tMV01JRkVISUpISUtITEpJRkhISkhISEVGTEhJS05MSU9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRcYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRUpKSkZFSEhQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHREVKR0JJTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmRfWl1gY19ZX2JbYF5bVVlYWl9eZGJiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdXl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0pKRUZJSU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVBRUlEP0lLSE5bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYmFdXmNhYGJiYmNjZVpSWVZXXVteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZER0VCRUdIRkdISUZHSkdIRkhLSUtEREpKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRERAREBHSEE+SElGT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFRXV9iY2NjY2JcZGNiZGNlWFJXVVRdWVthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0lGR0dJR0dKRkZGSUxKTkVDSkpMTkpMSUtKSUlHQkhIUU1LS09NS0tJSEhFRD9FQkhIQUBGRUNUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVlphUlJfX2JiYGBiYmBjYmJkZGJYUFJSU1xUXF1eXl5fX2BkaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtKSUdESEtRT01MUExMS0tJSkRFQUVDSEZBQUZEQVZVRVxUXlNWX1hOVFVOWltNSktUYGFbX1hfXmJdT1hiXGBgX2JjYl1iYldfX1RRUFFSWVNeXFxdXl9gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVNjUUVXX0lHR0hERk1KUFBGSUlKS05MTEtNS0pKR0VJTlFRTk9PTU5NTkhMQkRBQ0NGREJBQ0RATEhCTExQT05MRk1GRkhJSEdMTE1PUElMT1BQU1BMUVRSVVpYV1lXWGRWT1NUUFFPT1FVVFxZWVteXmFhZWZjaGRsbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5NSEhZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tQVFNOUE9OT09PSEtGYEVEXkxEZmNDTFtIXltzbU9NVm1ZTENQX1RsV2dKXVdVXkRMUVVMTVNWUVJUWFZUWFVUXFRQZlpoaGVaVGtUWFdVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhIODg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVEpLR2BUR0pPSklPTVJRS01LTE9SVVJPUEpMTkdITVFbWU9QUE5PUFBKS1F/UUl8WVlyc1dQbUhxbm9hVlBxcXRPQmtzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl9WVVd/aXR1dV9hdl9ZYlxcZltfYWFhYl5gY2dtcGxgcHd0eIGBgoOEgn99foB2eHptdn50eH2AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMS09ITFJYV1FOT09NUVROT1FQS0xPR01QU1taVFFST1BQUUtJWnhdVHhkaFhRU1B2Z3RscGJuZmtSck9Md21qcnBzcnFycG9wgF1menV4cXF6cX5yfWt1fWFSaHxlc3Nvc3N8fXB+eG9/cl9gYGJiW2FhaGtua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUU9NTkpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUVRQUFFTTEhneGxjeHFtWkpMVHlwdW11Ym52UGRkSWV2cW13b4BqZnh4aVhyUml7bWlqenp9bHh6f3Bnblh1dWp2dXCAYXNofWlseHxvX19fY2JcXmRlZmlqZWdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN2em58fXl4cm5NSlJ0TkNCRVBRSUtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dPVVBPTlNKS3JvdXVxdXFjaGFWbkxxcF5HaHlXdlRLaHh9eGB5e3NuYV1tb2RTZ3J1bm15cHdsdnN0cWxtXHN9emtteXxsdW58bHF2dXheX19iXl1fZWVpZ2hmZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlFLTU5MTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUUlSbUhpd0tgZHZ1VVdsTm5se3Jhamd/dVRLV2tofWxtbHhfWnB6e19genNjcm94cWhkfGlye11US2xfdnVsanZ8e21+eWt8cF1eXmJbXmJkZWdmZmVjW2NjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsaG1tcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUE1MU1NST1NTWFJXVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTlBVTEtLUlNSUlJPVlVRUU9SUlhYUU5QVVRYWFhbW1VRUldbV1hXW09SVFdXWFFdWFZdVVNPWFJXV1hZWmBcZ3JfW1taXV1fY1pfY2NlZ2RkZGNaZGJnZmZtbm11ZmZnY2BmXl5nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTlJRUExWVlRQVFVYVVpWUltdVlVUV1VZWE9PTE5XVFBOVVNOUE5MUVBLSlJRS1FNSkpPUVRSUFFTUklJTU9QUVJRUVFUVVFYV1xXU1JRUVVVVlRaUU5SUldVU1lWVFlVU1FVU1VVWVlYXlpfYV1cW1pdXWBjXF1iY2RmZGVlYllgYWNhYmhoam5jYWReX2NdWmNcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFRTVhXVVRWWFdXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUE5RTkxTUE1OVVNOUU5NTlFTUFRQUlRUTkxOT1JUVFJSUVZWU1haW1lTVVJUWFdXWVtTT1NUV1VUWVVWWVVRUVdVVlhcWlxgXVdZX11eXVxdYGFeW2JiY2dmZWViWGBgYl1gaGVnZWFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhYVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRT1FYVFFRT01PU1VOV1FUVFVPTk5RVFVVVFRSVFdVWl1cWlZWUVJXWFZbXFZQU1VVVVZYU1dXVFJRWFZWW19bX2BfVl9dXmBcXGBgX19aYmNkaGdlZWJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU5XU01NUk9RUk9NUFNRVVpVVFBQTFBXVVFWUlRTWE1PUFJVWFVVVVNVWFdbXl1cW1ZST1VWVltbVlFTVlVWWFRTV1pTU1FZV1ddX1tgX2BWYlxgYV1gYl9cYF1jYWNnaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOUFdTTlFRUFJUUkxRVFNZW1dVT1JOU1hWU1JUUlJaT1FTU1ZbVVZWVFdaWF1eXFxeVlNOVFZWW1tVUVRUVldYUlNYW1NSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZWddXGVgYWBhY2RfYl9ZWl9bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dXGBcYFZcXWhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVpaWlNPU1FVVVVTTlVRUlpSVFVUWF1XWFhTWFxYXl1ZWl1UVU5WVldeWlhRVFVYWFhTVlhbU1JWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl5eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBaVVZXVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVNPV1FTV1NXVVZbXlhbWVVaXlhfXllcWVJXUllYWF9ZWVJUVVpZWVVXWVtVVFpdXV5hYmBlZF1eXV1lYWJmZF5fZGNgXGdlaGZkYmBlYV9hYWJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxXV1dWVlddWE9VXFleXV1UU1hTV1VTUlNXUVNWVFhYWF5eWF1bVV5fWF9fWFxWUVlVWVpaYVhbVFZXWlpaWFlZWldWXV9gX2RjYmVlXmJcYGZiZGZkX2BkYmFbZmNoZmRmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZUXFVXV1lXVlxgYWFjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlRSVlVRU1VXW1tdX19aX1xWX19aXV5ZXlZTWVhZWVxhWV1VVlpbWltaWllaWFlfX2BgZGNkZWVjZFpiZmNnZmVeYWJgY11iY2llZGhfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllWWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVVNWVFhdXV9gYF1hXVdgXlteXFteWFZYWFtaX19aXldYXFxdXV1bWlxXWl9hXmBlZGRmZmdjWWNmZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWVhaWFdbW1pbV1haVFpdXFtgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXF1dWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQV1ZXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXV5ZWFVXW1tgXlxfWVleXV5eYFxaWllbX2JfYmVkZWZnaGNaZWZnaWdjX2NeYGZlWmlpY2ZpY2ZfYmJjYWBgX11dWlhbWVlYWFpZV1pbWllXWVZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFhaYmVjYVJcWU9YVllbWVlXWlpgXmFiY2BhY19cYl1fXVtfXllZVFhdXV9fXl9bWl5eYGJiXFxXW11gYmJjZWRnZmZnZV1lZ2hpZmNhYlxjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGJgY2JiXVxbWldYaXFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJeXFNcX2BjZGRmZWdnZmZmYGZnaGhnZGRgW2ZnXmFoaGNpaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFhcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7fHx8fHx8e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x7e3t7e3x9fX19fHx8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiodzcXJycnJ0PigrKysqJWKSjIyNjY6Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMiXJvb29vb3IyFxsbGxsUXZaPj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f3+AeXd3d3d3d3h5eXl5eXt4bm9vcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8enp6enp6enVzc3Nzc3J5fX19fn59fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3V2d3p7eHt4d3Z2eHl7enl9eXl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7e3t7fH19fX19fXx7e3t7e3x8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3d8fH16e317eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3eX58fH18fXx4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d7fnx4e318fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7fHx8e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBf4CCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5d3h6enp4e3h4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGCgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgIGBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGCgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKiouHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SFgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImFhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqGhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qKi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGCg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKCg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhoSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgYOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCg4SDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH9/gYCAgoGBf4GBgICCgYKCgoGBgoKBgIKCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhIODgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/f39/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgIGBgICDgoKDgoGCgoODg4SCg4ODgoCAgIKCgoKCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhIWEgoKCg4OChIKBgoaFhIWEg4SEhIaFhISFgn99fX1+goSDg4ODg4ODg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIaGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIuIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDhIODg4SFg4KDhIWFhoWGhoWGh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhYWHhYF/f39/f39/foCAhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaHhoaFhIOEhYWGhIWFhoaHh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SDg4KDhYSFh4eFhIKAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiYiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoOFhISFhIGAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4SEhYWDg4KBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4OCg4WJiomHhYeFhIWFhISGhoOCgoKCgoOBfn1+fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeIiYeIhoiHh4mIhIOEg4WEhIWFh4iIhoWDgoKDhYeGh4aGg4KCg4SCg4SEgoGCgYGBg4OEg4SRkpGOj46Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aCgoSEg4KFhoiLioaFhoSChoaCgIODg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBgoOEhYWFg4OFhISEhIWEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42QjYmGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYOBgICBf359goODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICCgoKAgICAgYGBgYKBgYKEg4OFhIKChIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+f358fH+Dg4KDgoOBfX1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgYB/f4GCfn19f4CBf39+f4CAf4CAgIF/gIKAgIKCgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4ODhIWAgX98fX1+fX1+gIB+fX5+fH1+goODgoKBgX99fX5+gICAf359fX18e3t7enp5eoCAf35/fn5+fH5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foCAgH9/gH59f4GEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39/fn9/f359fn9/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KCgYOEhYOEgIGAgIGAgYCBgoKDgYGBfoCCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gYB/gX+AgICBgYKCgH6Afn9+fn9+gYCCgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4ODgoKCgYKBfn59fX1+foB9fX19fX19fXx7enp5eXl5gIKCgoSDgIKDgYCCgIGBgYOCgoOBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaFhIKCgYGCgoODg4ODgoOCgoKBgICAgYGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKAgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAgoN/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGEhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX9+f4F/gIKBhYWFhoaHh4aHh4iGh4eHhoeHh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoKCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf3x8fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImJiYeFhoWDg4KBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKDg4OCg4KChYaEhIWFhIaEg4SDgoKBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goGAgoKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4SFhYWFg4ODhIKBg4OCg4KCgYGAgH+Bf39+fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8gIGBfYaPgX59gn5/foCCfHx/f4GAgoB+fXuKgn2Af36BgICBgoGCgIGAgYB/i5OPjIuNjo2Ih4iGhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f3+AfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgYGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYuMjY2PioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p9gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf359foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNi42OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fn+AgH+AgH9/fXx8fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjIyLjo2LioaEhoSEhIODg4KDgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5/f318fn1+fX18e3x8fHp8en1+f4CEg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e317ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MioqMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fXx6en16foJ/gYOEgoGCgYWGhYWGhoeFgoSRjoyKiYqHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYqJiomFiJGNi4iIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gIGAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fH19fX58fXx9fH19fnx+fX19fXx7e3t8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkI2MiYiGhYSDgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjIqIiIWEhIOBgoKCgoOCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fX59fn99fX17fH1+fHx7fH16enl5enl7e35+gIGDh4SIjYyJiYaFhISDgoKCg4KCgoGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImMiYqHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBhIF+foCAfn6Afn1+foCAf4F+f4B/f3+Af31+f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iYmHh4WGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fYB/fX1/fX5+fX58e3x6fHt6gIWChISFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCDgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/foB/gH9+fXt6e3p8e3qCg4CCgoKCg4KDgoGBgICCgYCAgoGDgYGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYODgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgX9/gH+Bf4B/fHt8enx7fIGAf4F/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX57e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgICAgYCBgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f359gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fnl+f398fHx+fX6BgIGBgYCCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/f4GCgoGBg4KDg4WCf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf36AgX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSFhYODg4ODg4KBgoOCgYOCf4GAf39+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fn5+f399fn6BgoKCfn9+fX5+fn5/f4B/fYCBgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOBfHx6e3t7ent3dnh1cnN2cXd5cniFhYWFg4SEgoKDgoGBgoGAg4GAgH9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GAgH99gH9+fn9/fX19foCBgYF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/f4KAfIB/gH5/gYB/f32Af35/f399fXyAgICAgH9/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn59fXt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fX1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc3B4d3F7hYeFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYF9foB/fn+Bf4B/f4GAf4B/fn58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFh4SFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4F/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fwd3RzfIWGg4SCg4KBgoGCgoKBgoGBgYKBgICAgICAfn2Af4B/gYKCf4KCf4CBfn+BgX+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CAgYGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCf4CAgIB/f4CAf399foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXl7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGEg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1/gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57e317enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF2doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgH+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4B/f4CBgX+AgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhYODhIGBg4CCgoGBgICBgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgn9/gIKAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4ODgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgICAgYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19e399en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCgoaDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoGBgoKAgICBgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGCgoOCgYGDgoKEgYCBg4GBgoSDg4SEg4OEg4OCgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4OChIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgYKCgYODg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/ent7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCgoWFhYODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODhIODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF+enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OCg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fX99f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhIWEg4KCgH2Bgn99fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f398fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCg4OBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4OCgYSDgYODhIOEhISFhISEhYWFhYSDg4R/fYGEf319fHx8fH+Bfn5+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhYWFhIF/goR/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWKiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WBfYF1gXqDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/hHuFg4GEg4B/fn5+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4GDf4ODfYF9fn59foKDgXx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfX9+fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdYJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHh4iGh4SGhouKhYSGh4eFhIWFhYSChYWFhYaGhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KBgX5+f319e317fH19f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWGh4eIhoSGhYaGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIaGhYaEhoSDhISGhIOBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEg4KBfX9+e3x7fnt8fH1/fn18fn2BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYeGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaEhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYSGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB+fX6Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+gIiHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWEiIWGh4aHhoiGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGhIaGhYaFhYaGhYWDhYWChYeFg4KChYOEgX6AgHx7fX57fHt9fn17fH59fn58f359fX5+fX18f3x+fnx9gYB9fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIOEg4KEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WFhIOEhIWGhoaGhoaHhoaIhYaGhoWEgoOCg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeHh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFh4eHh4iGhoSGhYOCgoKCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWIioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWEhYWGhoaGh4WGhoeHh4eFhIaFg4GBgYCDhYKDfoGBgX+DgX9+fn9+fnx8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYKBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaHiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeGhYeDhIWEhoaGiIWFhIOFhYeFh4aHhYaGh4aGhoSDhIWCgIGAgIODg4J9gYGAfoOBfn9/gXx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhYWFhYWFg4OBg4GAgYGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhoeIiIaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhYWGg4ODhYGAgYCAhICDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx+fn57e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYaCgoOEf36AgICBf4OAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fH9+fXx8fX9+fHuIhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGEhYSEhoaHiIeFhYiGiYeFg4SEgoWDhIaChIWEhYaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGBg4N/fn+Af39/g397gH19f4J9gIF9foF+fX19fX97f3x7enl6enl6enx5enp7e3t9ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIKFgoWBgYB/f4CAfn+Agnx+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn99fX9+foCDfnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58f4N9fH58fIGAfoJ/fX+CfH9+fX19fHx7e3p6enp5e3p6enp6enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSGhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXV1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1NXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fY3N3d3d3d3d3d3d3d3d7b19jX2NfX19jX1tfX1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5s3hzc3Nzc3Nzc3Nzc3Nwkru4uLi4uLi4uLi4uLmwioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpZkyKSsrKysrKysrKysqJWGppKSjo6Ojo6Ojo6OllVNSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKabOC8wMDAwMDAwMDAwMCtlqqWlpaSkpKSkpKSkppdXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamroEU9Pj4+Pj4+Pj4+Pj45bq+pqampqampqampqaucYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Pzs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHKysrKysrKysnJycnJyczS0dHS0tLS0tLS0tLS0M3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7Oz9HOztDT0M7S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW2NfX19fX19jX1tfX19fW1tbW1tbW1tbW1tbX19bY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7O0cGn0dK5j77UnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Pz9Gdj8PClLCcsZa4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pz9O6r6q+pKCLkcOTfX6vsNLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz8/Tn7GbuJuHnbrU0s2ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/RwJyJm7CbkJ+g0tPAoKDQz9DQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P1KOigZ6qq6+RobnXr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0cSfgXuZlqKarZup2KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NWrr7zA0YWVpsWYotGen8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT87Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyYd/hZ+gn5ybm63Hn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhxtPT1ZyYw6erpJ7FtKSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNLR0teoh83NkpCn17mDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHSz8XU1Mu91dLRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo8PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tPU0tLT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTo8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5ODQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj87ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NzY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njc3ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc3Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpqbm5ubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUUlBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raGd1WmZyd3N4ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+6vcC5vbq6tL+4tbezr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYVxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3LxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVteXFlRRURDTUlBRD1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcPDu7mztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVxfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZV1bVEo8Pj9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5uLOysrSyt766s7WyvLq8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU5IQT89SENGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHExLu7trS0sLa6trSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BPkpCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCysi+wLi5trK0trO0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQUZNRjg2NjU6Njo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub21sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u/v7m0tLOxsa6wubm2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSD9IUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rq2vsrK6ure3tbW8tK+0q7a6uMDEwbu1vL24sq2zsK+srra2srS0r6qknpucnJ6oqJ+gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lopujnJWQjI+Pj5OQl5WWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxsK6vsqemr6OvrrXBurW3sre2srSrsrSuqquvsLKzraWekpiUj5mgn6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbCjpaeeoJyVk5CPkZCYkJaVmJefmJuZm6OZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0RAPTI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmjpK6lrKy0vLessrGvsa21r6+ztaqnrayjnJmUjpGWl5mZnKCjopudpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWm5eXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDg+QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yeo6iurayrq6+qr6mfl56lnp6lpqSgop+moKKuq6yttbK2pq+0q6mqtLGwsLitp6GcnZqUmJuakY6RlZGMj46UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa2xsbSpsa+imZydnqGZm5uamJmblJablpicpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVUxSTEE3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOenaCfo6Cir66sr7Gstqetsa2mprCuraywp6CfoqCXkZScoZyZl5KTn52ipJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O3rLG0o6CdpaCsoaGioKCamJaWn5ubmKShoJ6koaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQk1HPUpIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm46Tnpmona6ep56coZ2empmSmZ6coqKgoJ2in5+en6mrp6ypqrSrq62rpaWrqKqsqqWfnpmSkpSYmZaWloyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaGroqmosqmrqKeompmemqqmn5mnoJ+fp6ilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7CmoJ6dnZeYlpmem5ykn5+dpJ2anZykoqSjoqqvrKepo6ChrK6uqqumoJ6eoaOenp6bnZyUk5WUnp6YlIaemqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvri0u8XDvMK7t7Opsq2qs7Svs66qrqOdq6e2sayir6Wgo6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rya2t1cnBoV1tRRVRIRElPSD5FQTNFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6WdlZubn5qenJ6lpqedoKCrsa6npKSjoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK9x8bCt8PJyMLAxb65tLm6tbu3sLWyqrqyrru2vrq6qretq6q4urS8rq24o6WinqeloqOpppmbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfXpya2Rob3hqZVpbRkpMRERTTERCRDc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZWalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKfn5CWn5mSmpadm5mjoa+zqaGanZ2fn5qXmJeSjI+Wl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMjJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM09DT08zKwsXGxsrHzr/J0MvGxMbEwbvDwb6+vrW9s62/v8LDxsTHxK6+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQkA1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6Osnp+upqWxqsXGzM7Nv7DCqaWora2qoZ2jn5ydmqmTmaGQjqCTjZSSl5mksbGrpKCdoJuZl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1NXT08jMx83NydLMztPNxMfJysHFy8bIyMW+wrOzx8TLysrOxcq/vr+8wcfEzMzIyb/Dv62ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3pydXVnY2d2aWRWV1FETUZASVFCPUI8OjIzQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOfpKOfoKSsm5aplo2XjYyNl6awrqWdnp2hpaGem5WUlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU08/Sw9DT1tfV1tLLyc7Ry8bN0srS1dbZ1dfT1tjO0snO0czO0MzSz7/HxsrDzMzLzs/Fxse2v8m/0s3Lz8XJyL/DwsjOzM/Qz8zKx824t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx3c3ZvY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ojc2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKbqaaipquao7Cxqai10NTX2tLHxsu0tsLGsrapoqWmoaKrtaeasaGVlIyQpq2rnJWYoZ2boaKfnJ2blYp3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUz8/V1NTR0szRztPX1tPV0M/S09HJ09HI0NjX2NHX0tfZ1dbMzs/JzdHLzs+/xcLHxc7N0dDRyMvMwMrLxdPOy87IxMnGxsjMytPT0dXP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjQ0Oj01Mjc1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpoK+uqqqsnqauuKirt9jU1dnZ0c7QwLzMybfAr6erqaOksbazo7apqKihqqmhmJaYmpudoZ6anZ6UfnJlY2JfX2FgX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L083V1NLKz8zT1tLR1s3P1dXRxtHUytHU1dbO0tDY2NjXy8jNw8nOzMnLv8i/yMnNzc/L0M3Oy87Px8vP0MrOysLJxsnMysvR0szT0dDPz8q9yLmwrbu4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wbmthZG5wYVdcWklGRkRMV0U7QDwzMzw9ODY4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm56jp564trW1raWtrr60scDZ0tfa3NbPzcvD09DCwrKrra6sprOxuKuyzrmrn5yWlJebnp+fnZSWl5WJbF5eXmFkYmBgYGFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1crAysHFzMLIycLMw8XIysrOyszMz83Ty8XIz8zIx8rExsDFycvN0NHG0M7NzczPxcfAt7m9w8O9w7mys76xvMTEtaqYpaGZlpGVlZKLlI2bkZSUj4+UgomFeHBxa25oYGBxaFlYaFZNR0xJUFBCO0Q+OzY3Ojg5OjU2PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHw7nL1dbZ2tvYzMzPydbWxcS4sraqpK6submwttWhlY6NmJaQk5KRlpaWkIx8ZWJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS+xsm9wsbIzsTCx8DHzcfDy8nLz8fDw8/IxsHGx8O+wMfLy8zOwsrLyMfL0MTFx7vHw8jIws/Avby/sMHKx7q9qrGyp6WdopyYkJuQpJmXmZGVmImPgndudGRsYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbOxrMnNysjEvr26zc3G0NXV2drb2NDK0NDS1MrFur6+sKi3q766t8GukY6OlpCGg4SEgn6FhX90YFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7IxsLDwMPHysnIysjBxczGyMvNycTCy8nCwsvQxMvIv7nBu8XHvb/Gz8rDv8O7ycbIusfGxMrAvcHLxsXDvcW8vL/DxMvFxbzAycLFx9LFwMi/ysrGyMbQw8PGw6/Ey8fEyre/vLq0qaylpZifmKyjoaWao6CblHt2c3Rmalthbm1aW1hRRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDx83Pzs3V0NbZ2NnQzdTOz9DLxLjGwba1vLHAt7qwkYyTl4d7gIWGgHZ4dXJwX1pbXWBhYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrG2urKys7Kxwry8u7m4wMHBxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw768wc3Cxr6+tcC9w7q8xrvCubO8xcPCwra/tbW+v7rLw7y1usi6v73Lw8HFwsbIxsjG0MbCzMiyx8rDzs3BxcK/vbK3sLOnqKi5saWtsKutrJR5dndqZWhgaG9jVl5ZSkVKRkhLQUZCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Oz9LJ0cbW1dbYzszQyM3IysW+ysGytbq3u7awkY2Ki4V5gIaGgH6EfHR1ZFxcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i0t7SzsrO6tb2xt7C1r7K7wrzBxLy/u7Wyur7AuMe5tLu2wMK8t73GwMO8ta6ytrq+s8S3u7WruLy9wL2wurWvtrqyxby2r7u/tLa0xby+w8XAw8XGyMvGwMbGu8jLv8/Kx8PGwcO3w769trm+xr+stbq1t7aOeHR4Z2dlYmtuXlZeYEZLSEhKRkJDQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzc7Jy8nMysvG0c/T0c/Iy8bKxsTAvc+9s7m9ubi3nI6HiYl7eX6Ghnd4gn10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+5uLWwrKynnqKqp56rrLOtqaups662sLKprqassry6tsO5urqxqrW5u7TCurC/sb29u7W7x7nCt62qqLCxwLW4vK+wp7GztLu8q621pa62rrqxsKq5r627rru4u7+/vbnCv8fDxcG8xsHIy7jFx8W/x8PDusTGwrvFyczLs7nCvLqyiHJ2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PTlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbP0szExsHF0MjPwsTHwcbGxcXMxMvMwsTByMG6vLvKt7S8vba1q5GJkJB8eX6KhXp7hIF3bl5dXV1dX2BfX2RjYmNjYmBfXltbWlpdWlpZWl1lbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwo6afqq21trG9ua+4r6iuuLS0vLizvK+3ubWxu8Gxwa6lqKKssbKzp7yqq6irrK20tKaorqGkr6mypaeorqWot6ywsre5uruxvL2+vsS/tcHBx8i3v8DFt8TCv7u/xMO+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFpSU0tGRkU+P0A5Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe6xLC2sJuZlZyYqqmwsbO1va/G0dDNxMi7u8zDzMC8yrnAxsC8zLrDx8W6vcS+ure9xrm2ubuuspWDiY2Be36Afnh0f3xzd2ZfXVxcXl9gXl9jY2FiYGBfXl1cWlhaW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnqSbl5Gho6qjop+lpaelrKCdm6SmrLKvtrensKynqrSrtLmwtrSstrixsLq5sbekn6Ofp7Gnq6i5qqSmp6insq2gp6afm6SmrJ6fp6SfoLGtrayytLK0sLW8trvBwbK6vsPBsrm6wrPAvb+1uLu9vrzCx8TCw7+/xKCDd3BrYWVfa29gVVlfSE5oT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG7vrWgnpWeoaa6tquzs7uzxdDJzMPHubjJws7Busu5vci7t8i7t8TGs77FvLewucC7sbO3sKKEh4eCfXl2dG9ta2pqcWlfYF1cXF1fYF9hY2JgYGBgXVxbXFxYWVhYWFZYW11eZGNiZWdnZ2ptb4idqaCXlZqhlpuimJWNnqGippufn6Oloaeem6Kbn6qwrbG1oqmqqauspLW4rbevrLK0rrK1rrCqn52eo6KypKWpuK2hpqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqusrbCyuK+4ubuwtru7uquysrmyvbS2sbG1tL+2vcC9w8G6u72Xg3pya19lXmRkWFRYXklXXUtQR0lKRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZm6SmwLKvtqy0t8bQycnBx7y8xcXQwLzKu7vBu7bFuLXBwbPCxLytqrW6t6ixs6mLhoiAeXNucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1pbWVhYV1dXWFhYW15iZGRlZmZoaWtyjaidlJSUm5iboZaWkJyhoaidm52lpqGlnKCgmpitrq2usqCloq2rp6G1sLGxrKeusqe6s6a2oaKemqOiraKhqbWqoqOmnaWmo5aYnpeZmp2fmZednJybrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7KysrezrqmsrrK4sLq2ub2/t7KxlIV5dWVeZV5bWVZTWlVLW1FMSUVIS0lCPT9BQUBAOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vr2/s52lo5ilscK1tr2ttLjDzcnIwca4wsHI0LrDxsC2vL22w7q2v8G1u7+7qqaxu7Gosq+bfYWFgHlwcXRxaGZkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn56onJuaqqavsKubo6O3qqCfrqi2qaamrLCjt7Ckt6Cim5iYqqahm6y4r6KhpJyhn6CTlaGUlpabmJeWl5yUn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysa+wrq+mp6eyrrG0r7y0ubeuo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xLRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6ep6ejqrvAvcC5rrS4ws3Ix8TFvse6ys21xMXFsb/AucDBusDAubq9t6iosbumqaKliYF+eHJqbHJ0cGloZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbXFpYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSmp5+cn6Sfqq+mn6KjtqigoaKos6Glp6SvpbCtrLWeoJ2VlKmhoZSssbCeoqKdnpibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaWrpKWwp6Wjq6utpaiur66rqKqps6Wmq6+0sa68tbGvr6CSenZyZGFcWl1YTkxRR1JhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sresnqSnrbe7vMHFurG5tcXKy8HEx8fJuMjGtcXCya+6vMK8w8DBvby3uramp7K2nqKKmYiAd29kYmdpaGZoamdqbWBdXFtaWllaXF1cW1xeX1xaWVtZWVpbV1VYV1RUV1VTVFJVYGBfYGFfYGFjZGmBlJOJkY6UkpOclJWWo5mglpygpaGtpaSkoqOhm6qqpZmepbGpoKCdpKqdp6GerKypqK2toqGhlJejm5yQq6mwm5+inp6XmJOKnpKNkpOVj5iYkpuhopykoKGVoKGkppujq6WipKqjq66krrGppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZVUUZRT0haXE9SSVRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDc7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk1Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKyyrZ2np6+5ubPAyLq1wK/Gyc67wsvNybfLv7TAx8ywtr3Iu8LHxL2/t7q1pauwrp2ah46DfHVpamptaGpsbmtrbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl5fX2JkbY6PhJGGj5GPmZOUkpyaopyboKeoqqiqpqiko5ikrqSUmaWvqZ+bmJqgnq6Zm6qzn6Wmn6OjoZSTm5aVkqiprZqcoKGgmpSQjJmOi5CMkoyWlJCdoaCjnJuilZugoqCXoqijoqiroKuvpK23paOjoqytqairr7O4sr21s6uvmINycmhbWFlTVVJFWUxQXFlNVE5QTFBSSU5JQjw/P0E/PTY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmor62bqaist7asvMq7tr+szMfGucLP0Mm1xr66vsbLtbG9xb3DxsS9wbO5r6arr6uel4aBd3hvbmlubm5xZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4uQipKNl5GXmaKgm5+qqaatqqevoqeZn6yglZakqKedl4+OmZ2ulpenqpmfnZSloZ6SkJKSkpWnqqSZmZqdnZaNjIuUhoiNg5CLkpSQoJ6go5eVn5WaoKKek5ulpaeoqKCxsKawvKego6y0q62nsLSwubXAsa2xq5B9cHJiVlRVTlJJR1ZRU1JMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3Njc2MTMyMS0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurzDy9HMs7m6vsDEx7a0t72zu7zEvsKxtK6xrrGsnKKIa2hub3JvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3WJjoeQiZiJlJSXm5mdqJufqqWkqpynmKClm5KPnqKal5aEg5Gao4+TopyVlpWHopqak4uOio+Zo6eclZWXm5CSh5SOjIGLjYCQipKSkaGan6GVk5iYlaKlmYyZpKaopqGgtLKnsrehnaK3rKqtpLKyprW8taursaOIeHJtXU5QUUxPQ05OTlBLRk5OSkpOTVFJTUpBR0tISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDEqKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6SppaCppaSzqqKyw7W1srPHx7i7xMrNx7WvvL+4vMSzs662oq21xLq7r6qstK+voJeofV5gZ3NxdnFqbmlmaGhqX1hZWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVlhYWVhbXWFvc3ZxhYiCh4CRg46KlJGTnaCOmpyioaOYpJahm5WNh5iajHONgn2NlpaFkJmQk46Oe5mOnIyCin+JmJ+inpCTmJaEjoKTfn50iY56kIaSkJCdmpmakJWPnY6io46JmqChpKOborSvrK+sn5iluaalsKGwrpywu6qpr6qZgXZyYlZMUU9QTUNTTkxRTUNQUEhJTlNNSEpKREpMRUpLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3d7eio7SopaWoo6alpqams6eltMC4sLSwysa5usLPx7+1r73Dr7HHsq2nrJWkrr+4sbCfp62tq5aVonJXVl9oZ2loaW5jamhnYlxYWFhYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXipOQn5edlZSWlI6WiX+TiV87V297i5OJf4uRjI+FhnOKhJaBeYJ6hZOdlIOVjpCPgoZ9knhxb4WNfomAkI2Pl5mYk4qPiJyInpeHiJaemqGgl6evqK2pqJ+XrbSipq2YrKuYp7Siqa2jkn1xbV9aTlNRVkxEVEpQTUxGT09JRUxRTUtQSklNUEZJSD03NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygoKystMzg1NDc3OTw6Nzk7ODZBOXi3oKOuoaamqqCnqaeiqbCop7TBubG1sMnDubS/z8C6sbG4xKuuya6no56Gm6K6raeolqalpKGXj5ZpUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l7gnRQQkB/lZGRfYmUjISKjZuNlpWKkoiGlYZ5iH9gSlFueIqRhHyEjImEf39ufn+Ud3V2eISNmXBRjYiKhnt+eJR2Z3eFiH6KiJWKjZCSlouDiYeUhJqMgYSSm5aenJSko6eppaOem7CroaSkkKaqlqGqnKKmqIh0a2VdW0hRUVNMSVVNU0lMTFBJSEZLTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49Nzs8Njs7NDc4Ozc3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSoqLDQ4MzM5Nzk6OTk6Ojo6Pzl2tpyjp52foa6hp6ilp6ivrKq2vLa4trPCvLeousm5t6mqt7ittsCqopuTg4+Zsp+imo2glpmUkYuMZU1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/hoF7hYySgZKZi497ho9/dX94c251cHSNjYF5fYmqhXl6aHZ7jnBybXiBioySeHqAe4B2c3KSd2d1hISEhHqViYiKjIuAf4SKjH+Ug3uAj5iUm5WRn52onp+gnqCppZ+dmIynpJOgoJadnqR/cWdgXFxKVk9RR0tYUk9KTU1SSkpKTVBITFFMUlRNRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTQ3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDw3dq6Yo6GYnJ6zqa+ppayssLGqvbSyvLi2urWyoLe7s6udn62rrLWzpZ6WkpiGlKSWnYyDl4mPiYaGg2ZKSUpJR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWVhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYF2eH+Jj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgH1/dGZ2fIVsb2hzfImMh4BseXF9cG11j3FocYB9jnBDioSCg4V+d3d6i4V9i3p1fo6Sj5iKkpqbo5eZnZudnqKdlo2KpJuPnZeOlpiOdW1rZWFZV1hUUUpSVVRPUE5RVktOS05PSlFPSU9PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+elqCmr6yuq6epsK+xrLy4rLu+ubOtqJuxqK2ckJeep6ynpJudk4iWfo6VkpWAfIp6hYB/f4FlSkdIRkJAQ0RJTExNUVJQUVNVVFRVVldXV1hXWVlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4b3x5iI95fIuFb22MkXhzeGpqf4JylpGLgX2Wf0mSmG5od36BbGljbHmFkJKGa3NsfG5ye4ZobXB+c42Ig4V6fX57dm90dIWCeYF3cHyOjIqTg5aXmJqQk5aXmZeel4yDiZ+RipKMhpCWfWxobW5tV1VXVFFRWU9TVVVUWFVNTkhNSk1OS0NJTkdFQDo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepK2voq2qqLWvrqy0v6u8wr+mo5qVpZiejoWMlqKkm5qUl492kX6Fi5CPfHh+dH14dXd8Zk9FR0RAPD4+QUZHR0tLS01QU1JSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqckGZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouIdYGIhnRsmZF0c3tqa52OTHmEkomEjmcxdoZzbH59g3RmZXR+hISFgGZpbHVrcH98Z3Bwe26SjY57c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJWPl46AeYiXiIaJhn+Qh3VpaW5nY1dRWVdYWVtNUFVWWllOSUlFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImZGalqSorZ6ynqa6rquysMKyu8PHm5ePlJmLjoZ6hZGalo+SjpKJdIqEd4uPjH92d3V4dm94c2lVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfW1xg4GFgXmEhoZ5cqCUdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYiAaGZiaW5ybXCDdWlvWHVvjpqRdmx/enxtcW1wf3pzdW1idoR/hoCFkJGKi4qSi5GMi4+DdXiLj4B+goB9j3hwbm5qXlpbXVtZWGBfU05bW1lYTEhKRkpHP0NBQkc/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5WltKitsa7Bs7rBxpeQjJSQgYl9boKRk4qEi4iQiHaEhW+Yiox/eXt7cXt0fGtvXkpQRz5ANzQ1ODs7PD0+QEJFSExMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH2Fg3+MfnaimXl+hoCEmYWbnGGGqp+di4KQjXp2iX6JiI5zipePg3tcZHF0ent3imxnaWF4b4WPgnpugXdzhHpwc3l3a25pXXeHfYd8iIePgIuTl4ONho2GfXGEf4R8dXd7fYh0bXFyZGVeWlpdU1tmXlhRVVldVkdLS0VMRz9GQERDP0FBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHeJf5SMkZ2dn6aRoKqfsKmvwLG7xrqWj5GUiHqGdmuAjJKDfouFkI15hIJ1ooaNfn6CgHODgX1seWxTWExBRTMxMTI2NjY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl7cXyPjHt8iYZ+l4d2oZmIh4+SlKWNrKlIhq2vr4qAgJOKgouChJGoh4CYmIqcc2x8gYaHfY5oZ2d4fm6FhoGFcYSGR2uAd3F5dmhta193fYOIf4iFjHqVnpyKi4mRf3t1i3Z8d21vd359cXFwalpbW1pjYldnZVxVUFFYWlFETExHT0lDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYeRj5aYkpegnayhprivs720l42Si5iLfXRwf4qTf36Ng5SVfYZ/h6WHiYCDiIZ5iYuAdYV5X2NWTEM2MC4vMjIxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYmRgZqWgqChmJWbmqWtk5m7sae7x8OnioyhpY6TiYGQe3KDnp+RnH52hYWLj4eQaWhvg4B0jIaEi3GGgneHf3t2hX1udnVngZSPhomIiImIoqujlomOmIB7gol6em9na3h9d3xxaWNcWVlcaFxhZl9aT0xOWFNRSVBLRE5HQ0pEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O252cGd4g3uAjICBkI+LmpqknKGspquvsJeSkYShlIR4d4CNlH1/koaTln6KgZKbjoSBgoyLgoqOhICKgG1wal5DQTQtLS8vLy8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoZKjqaWjrJOotqKnwcKuyK94upSafIyhnpiEk4WCj6Gek5mShIqFj5iRlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhl4eTiY+Pl6W2qZuNlaKDh5OEfn9ramx9fn1/cV9bYl5ZZmpcbGtfWEtIT1NRTk1MRklRRERORkJDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcINwdYdxdpGGfpeWmpSfn5unoKqWk5ieaGakmn6Fk5J6gZKJkpJ9i4WZkpGDgYGLjomGkYeEiIV4eH9oTlI+Ly8uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6aimaGXopWcn6ieqaufqKypqrWXq7+rtsjJt8jRz76boHBpq6mfhJOShZygmpqZp5GRiJWimpp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2VnpyOk5aapKOntrCdkZmoiJeQjoGIbHNze3x5bmZeW19eYWdjX2dnXFJFS0tRT0lKTUZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDU0Njk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmM0FAaWJeUHF1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJiJiNeYKNi46NfIqGj5COgYOAiYyJhZOFgoaJgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUZIQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKyoqbWssbeysq27sbO+nLPErLvJy7jDv7elo7CyrK2qo4uWmIWlpqCimIKmmY2iqqikh4WTo6CgqqCkqY6csYuVo6e3u5yho7CTo52jnpGkoquwrbO1opWmqomaipOKlXp7foN7ZV5mWmNgXWJiXmZnX1tPREpIVE9GSExGS0dGRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NTQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBlIWIgpuDkpGMktrInZZzVpeIj4icj3yGjI+LinuIg4eRjoOFgYyGhYiShoKEiYaHh4dxbmFARTY0PDMvMTEwLSwrLTEvLTQ/REFOVlFSVFVVV1VNXFFHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Srs8W2rbTAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbCxm5mSmp+Jp6+qpJV3n6SXoauxs5iWqa2orrW7srqsr7Wisayytby4tK61oKioo6ibqbCts7q4uKicuKmNpY+Sk6CHeYGAcldfYlVkYGBhXl9mYFtVSkRFTFZRSUpKRUpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMXFpRY2RXenVxgZV9hIaTdoZ+gI17v7ujvIK0lJOOm4+EiI+Tiol6h4GMk42HhYGOgIGKj4aAhoiFioeRenluXVdARU48Njo0NkFCNzY0Ly82Q0hDUVxPUVVXVV1XT19VSUtKQUA/R0tGRkQ7PkA3RDc/QkpKRUdXVFBej6StpLK0w7a4wczKtrvEvbO0wbe4wrW/sLh0sbSmusWksMa5sbOytKiktraqsaCilpuikqWxraWtrKekmKCss7qiqLK5tbu+zL/Fxb29s8K3ure/uLq4uq2tsaaxqq6+sL28w8Osmbuola6PmJmriX6AeWhVYV9WaGNoZFZbY1lWVEpIR0xRR0RJSkFJRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlWWndqcH+PhIGOhW97cniIYrmhmaOJlZSWk5SUjpCXkoeHe4eBjpaKgYSBinp8i4iGfIqCgYuElX14enVmT1xkR0VMOlFkYFteU0Y/O0hQRFpjUVFZWVpnWlNgYU1TT0VBP0lKSEVGQUBDPUU2Qj9IR0tNU1pUXpSvuLW7ucnAu73Kzby8wby4try7t761urPGYXWypbGanqu+qqWoq6qkorK1oKunnpWWnpifrqWnp6WfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrEwL6+v7y8uLSwube3w7rGvsTJsJ66q6Ksj6Wpt4mAfG5dX15cVV9daGVTWGFWU1ZJRUZOS0E+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQEpNUFJMUV1obWxxj42GkHNscnJ0iNXAtZqgjZWZmZGOl5KWlo6GiH2Hg42Win6Cf4N5e4uEh3uLeYGKgpd/dH16a2VwdlldXFBlZWJgZWRdW1hYXE1kbVVSbW5fb19YZ2VVWVRLREJLSkhGSEhISEJJOURASEtUVFZdWlyTucC5vrjGwbu5ysu7trq2uLm0uLW1rra3mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUjpaYl6iepp+fmpmDo52spKqxrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr3BvcLAxcTGysDJz7SkvLG1sJysub2afXZpW11ZV1tfWGJiUVthVFJMQ0JGR0U8QEY/QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy4mKiooLS4wLEBNKy81NG2JSTBIiXQ/PkJEQENER0tPRFJcWmlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIuJfIGEc3uKg4V7inSBioeVf3R7eWxtdXxpc2VpbGhmamlpYGZpaW1abXSXraS9iIdnW29oXVpZVEhLT1BKS1BLVFFITEFKRktQX19iZ2pil7fHsLq0u762scXHtrC5sbG7rbOxqKu4rY22qJ6cp5pOmp6Mj6CWkaeYpZWKk5OIkYmPkZKdm6GYm5WWh56ZppqssKivp7Oz09TU1tHLz9PUztPPzMbDytC/ysnLydLIzc7D0NK4sMS9xLqmt7vEon9sYVpbW1ZeVlhkWU9cWE9RQ0JJRUNJPEFEPkJIP0BCODtEPkBJPTU2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkZmDaHJveXmDoaqeppeMm5uYi46VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj35xeXVscHh/cntueHNsaYBwbWNpbnB5aXd9fsu/w9+nbmN4bmRbYWBLUFJVTlleUF5dTlFOVFFVVFxubneDcpauuKy1qLC2q629wbKrtaaluaesr6GstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEi4OUlZeXlJuQnJiZmZ6eq6ykp6KsrM7S1dHNzNLT09DU0c7Iw9TRyM7S09PXzdLRxdLWxsHPyMjDqb+40Jx3bGNbYFtUXlFcWk9PU1BPST5BR0JDRj1BQj9GRT5APzo9PT08SkI0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd2x3cH1+gKCenqGMjZmTlIuMk4+WhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAb3dzbHN9fHd8c4J4cWuAcnJpcHJ6eXJ7vsuaf42yhHZyhXdpYWldRFpaW1dmZFhla1RYXV1gY15jeHt/i4GZqqSkoqChqaaqsbmrprSjoq6ipK6ip7GfiaablZORipKPiIKUiWuVoo2ZhIGGfpGDg5OXrIuVjpWajoWSkJ2Xp7CioKGlpKjIzc/HwsvQ09HU0s7TzcbW083U2NbW2NXX1crU2s3K2NbRy63Ew8uIcG1gXl1WUldSWk9KR0pKSkA7OjtFQkQ9Q0Q+SEM/Q0I7PDk8OkdDNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCioCdlZ6UhYuWiY+KiY6Ij4B4hJSZi42IiIuJfoN4c3x9hId3gHuHkZeBhG94cW11f3Z4fXSGfHlsh3Z1bn12hXV5e521jDxBi8alfo19amVXSUNlY2ZjaGpkb3lbX2Zoa25pboGEiZGMnp+gnpGXmaCjpKaypKWyoKKln6KpoaKxnIefkpKTkYuOi4eEj4R+nJyMjYKEhXqUf4KqlqOMkouYk4t9l4qakaqzmJucp5ymvcPFubbFzdHQ0tDL0svJ1M7R1drX19jU2djN2NvOydra0ta/zM20dXNsYltXUVNQWFVFRkpJRkY9Ojc6QEJDOkhFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzIqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXF0ho19l5Gei36HkoKJhoWKgoh9eIWXl4mPg4eGh3qEeXF7e4WGdXqGjo6deo1wfXBweoBye4FyhIeAbo56dXd9fYJ1f3yHibB0WarCt42SgXBuYz1eaHJxcXBud3eCZWlvcnZ4cnuMh4+TkpuWoJaIjJOcn5ufq6ChrJyimpqgpp+frJmMmo2Rk46FfYiIg4WLjqCZk4iDh35smXmEmYeIk4yOlYyGe5uIk46tqpSVl5+Ypq61vKitvcbLyMnLy8/JxNLK1NfY19jX1NvX09nb1s/b2tLWydXMk3V3ZmVYV05RUlxHQkVJST5CPj04Oj5APD5IPUBCQUJFQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZsdoCIcZGQm4B5gI5+goGChX+EfH2EmI6Hi36Gh4F3g3lue3uHgnR6kp6OoXaPdoN0dYF+dICEb4GQgm+ShXV8gYV6dod8ibjGpcPKuIKWnI94cGZOZWOCe4J3haGQi3l6d3uEgHyEdW2UlpWWkJiRg4mPl5qXl6admKCXn5OSl6OemquWkZGLjZODjIWJiYGGkJGenJmIhYuBhZd6iImfl5CJjoqLgnyhiZCLvKCYk5eanKimpa2ep7W+wL+4xsnNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bxoN2dmRmYV1SVVVUTUtETUQ7PTw8OTo8Pzk9QTc+P0A9QD49OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47OTo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1caXR6eWyJjZJ3dnqLfH6Af4B+hXt+gpGKhYZ6hYh8dn51bXx9h350f5KdkZ+DknyHfniPfnmLim+Dm4F0mYZ9goqFfH6Re5Cpj5DDoL2Mm6ScfoqEfYlzjIt/c6aanJiUhXuPkYmEaUdxoaSejIyRkoWIi5CSlY+dm5OUkZeNjJWfnZShlZOOjpCMf5CPjouEiZOWmZ+fiIyUkZ2Qgox/ppmIhY6DhoSApYaKi7iXnZGUlqGmoJ2dnaOutrq0q8DGytDIx83P09LS2NLV18DX2Nnb2Nra2dnX27Z2dXRnZmJUXVlST09IQ0xDPT0+OTk7Ojk5PD02QD4+PT05Ojo7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTzxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5PzxEUlNSWF9WWGZtbW1pgY6KcXN5int7gHx/fIh7fXyLh4N+dYSGenN6c22BfoV+d4aboZuelJKAjIh/mIeAnJJuiKmFe6CMfJGOg4mEnH6bkYqNo6KfkaSvoIuRi4aLgZOGV3Kti5+rm5CDmZyQj45bg6KRgo2fk5SMhoiMkpKMlJWVkIyPioiWm52PlZaSjJOUhoCLiZOOioqdl5ijooaTnZWgi4qJjp2Qg4iPgIOHhaWFi5CymJySlJehoJ6Zkpudp7G4rKS9wsfNyMbPzNDMztfP0dSu1tXY2tja2tfW2dqdbHlxY2NaWlZRVVdDQElEPz8+OjQ5Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnhsYn6Rg29ueIt4en97gX2HfHx3hoWAc3CFgnt1d3Z0hYOFfX+SpqKfpqKXip2QlJeLiqiXcoqyjYSokoSZlIWajKOWoJiTiZueopOpsKCRlZGOjoiWjG+Nt4SaxMiynKKmnJyYlpGxkGSkzceVjoaHiZCSjY2TlYqFioqGlpmbj5CUk4eVmISAj4uZiI6QqpeXpKOImZ6WmoiPh5eYioWPjYF/h4+liI2TqJmXk5aYoZifmZOcmqKytKWjvMG+x8bFycjJwsrTzM3UqNLR1tbW2NrU09rOf297ZGBbXFtNSVNZQkFHRDtCPjgzNzw8Ojg+NjQ6Ojw6NzI/OjkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBjn18bX6IeHp+e4KCg393doGDfG1ui397fXh4fISHin6LorOno6uzopenn6WklpWuooORuJWSs5qMoqGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJqXocCOo8m4q5yjpq2Ykpudsp2FhqiinJiFiYmOlYyLk4+IgYaHiZOYlYyLlJOHlJiGhJGQnHWRmbKVlqShh5yZkpCLkIqXm4mLlo6GfYyYnomQkJyampOYl5+ToJ2Unpugsa6ipLe+tMXHxL3Dw8DGzcrJ06bOzNPS0dbY09DYum92clleU15UTkhJTUVCQ0Q1Pjo3Nzo/PDw3PTQyNjY5Nzc0PjU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTVpcWUpmYDtIhIt6em6Fhnp8hHiBhoF+cHh8fn1vco16foJ8eIaLiYaEkqa7rKixvbClrbOzqKOisKyKmrWdo7illa2ll6mtuKeko5+aqZiqpK6wqpqZnJSVkZegmJq7u67KoWq2uKuwlJmfo6yTl76jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJOWjJCVjYuNlpiTnZm0lpWrnYqclJKOkZKMmJuKkp6Qi4mWn6GNlI2YmZ2Sm5ielKGglJydpa+ooaWzuKzCyMS2ur28xcfHwtGgxsnNzcXX1tHL059td2VZV1BcUE5FQz48Q0FCOEA4ODU/Rz09NjwzNTM0NTQ1NEI0OTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkSGJgYnBKQIuKfoBzhod9goh1g4qCf259fH1/cHeHd46Ch3yNj4yGjJmpwsCvvca7s7TAvbStq7O2jKiyra29q5u7paitubirpqaioqSjqa+ysaqdnKSZm5iXn6KmpZKkuq+pwLytrrK5paSofoiGnK29sIKLjIuQg46DkY96gYiQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaYj5KhkYmUm6SslJaPk5ydk6Cdm5ifoZSanqempKKjsLKmwcbDr7C6t8XEw7/NpsfEx8S91tDNxMqFcG9eWVdcWExKQUtBRkc/QUBDOzo0PkE9PTU9Nj4zNDMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTjc5R0Q/Q0ZcZUZgaWdaXVyTjIyJe4eMh4OMdYeRioFvfnuCf3F+gXuVepKUlJiQk5ans8bJv8LMwsO5x727r6u5u5izt7qywK6lwaSrr7y9qq6ro6Oep6uutbCqnKCrnKGclp+vtaeLo7q6tsG8rKmds6WkqJSFjqnEw6SCi4+HiISGlZSNeYONkY+RoYyMlJKOiZefmJOZlZimoK+cjKucjZaPkpGVlY6QlZKPoZSGl5+gsp6UmZOfoJiknpqfm6CUmJ6lpKampK+tpcDEw66ot7bJw762z7LEv8S8s9HKyMK0cXVpWVVZZ1BMSEJMS0xKQUE+REQ8NUFFOzszPThCMzMyMjYzQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVpNZVxmVGJrmY2WioyIk5CGiXmHlJCBcoB7jX94h4KCkHqNoZaomZqZur3HyMnB0snLws29wrOtvL6our+9u8O3rMGprLO8vqqwqqSlpKyus622taGfr5+lopijs72qm6i9waS2uK+slLKsrKyXh5qppqWRgoyTpZaKgXWKknmFjpKQnqCTj5OMj42Uo5mWnJWVo56qnpGlmoyPj4+Vloh8j5aTkqOalZ+hnLWlkJ6WpKOhpZ2dppidlZeapKOpp6KyrKi7wMOvpbO3zL+5r8Szu77BuKzCw8LAl2p2XlVUWVhKSkxJRkRESENDQURMOjRESTo7NDw4RS4xMjM1MkIyNlNITzxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmlIX1hiWmNjVp6PnI6Xjp6SiYp/iqCThHiFf5Z/f5CIipGAlqGZrqekmMK9x8PHxdPOzs3LvMK3sLq8tL3LvMPBtre8rbO/ur2ur6igqai2ra6psreanq2jp6Gdq7e4qqWwv8Syvbm0qKu2tK6ul5alrKifkY2SssWnlo58kpV8h5KZj6qZmJOTj5KVk6Sdk52ZlKGjopyYn5iLjI+PnohakJaXkpekmWWYo5+ypZWhlaurqaabnqaWmJaYlKCkqKWftqupubvDtKW0tcvAuKq2q7K7uK6ouLq9uIBoa1dUUlNNRUlSTUs/QUhFRUhISDk1RU07Pjg9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PkBCRkJwRWpJUmVhTEallJyXopeployRg4imk4iCh4KchIOVkJCUj5qinq++r6HGvMTEx8bPz87Syr+7trG6u7u+z7XDvbi5t7OxtbO4s6unnKusuaqpp6+wmKOvpaejpbXAsKystL/DusC6tKe6trm0r5alra6upIuTlKGNdMKafZeZhI6XmYyxlZualZKSmZmlo5Wgm5eaqZ2boKCZio2QlpxgSpacmpWapZZVl7Cgr5yfpJSuraqkmqClk5OYmI2coKeimrSoqrO7u7uqsbLHwLmmrKutsrKjobKytKRtamJZV01PSkRPT1BSO0dLSUdJQ0M+OktVP0E6PUVNMDc1MzQ6QjQ0TVdPO0pLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpaZoKKor5mRl4eLqJaOiJOFoIiEnZePnaGao6S1ybWpxbnCw8jKycjNzca/u7OuubnBwcy1x7rBubW6sK+vs7WnpJuqtLWqqaatrJqkrqWkqKy7v6istre/wb++ubOyxLK5vq2jr7WsuaaIm5emm3a/n4SZnY6TmpqMrpehnJyXlJugoaieqJ+amqqaoaeemJCNkZ2DbnaSopqVnaKdka6yo6qUqKqXqa2jop6kp5GRmZyHlJ2inpaxpqmruba9srKuvrm2oKOnqKWmnJutqamLYGJeXU5KS0ZHTUpWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc3P0I3NVVYTz9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh+ZV5IRauVm6Kfu6+ZlJ+Mk6ubkZKTiauNhqGejKOtlKOjtsa+tMC5wsLHycXCzsjCvrmyr7m1wcLKtcaywry1uqqora2wo6OYqrS7pqmmq6qdqa+no6qrvbuorb21uL7HvLe2uMKyvsG0qrW3q76lj6OYkqKgvJ+JmqCZl5+ej7efqZylopucoZqopLOgm52mnKiqnpiVj5Sbi5aJjKShlJ2inaC1r6Wkkq+rmaqqnJyjoqiQlJSfgo+enpyVqaShobO0urStqLWys56co6Wal5WYqqGedV1aXVtIR0VGTFFJTUVHR0JTTEpCRUdBVlNDSD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWZcRkNDnXBiR0Wnl6OfnsOtnJelmJqqnJaamo+qlpWnppWtrJiiq7bDw7y+tsHCwMfEv83Gu725srC5s7/DyLW/sLy3ubampKusraGhmaqqxKKkqaymnqyvq6Kpqb64p62/sri3x7a1ubjAs8DCuLWztK++o5ejl5SclK6fkKKjpaOjoJC9pKmeqKudnaGbpZ69oZmjn6KprKGdl42VnpOeh4+EjZOfpKCetaylm5WwppmvpZyZqJyejJiUnoOOoJqbkqWkmpersbWxqqWqrqybmKCgko+QlaielGVfV19bTUhHSk5MSEVESUE+UUlBPEdJSFxST0s9SE9VNEJGOT5IRzVDYVtLQk5SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTltUkY8S3hlYVZLopqjnJ7FrKGerJ+erqCSo5+WpKCmqayYtrGiqrO2xcS9v7XAwrvIwr/Kx7W4tbSxs7S3wcW2vrG4tbm0n6esqqydnp6lpMGln6qtoKSpra+hpqi9taaxvbm3tsSytLi6v7TEwbm5rrO1taOdpZWSlKGuoJminqmorKOawqypnqyum5uemaagvaGdpJirrKymopqNmp+SnomOV3+Wn6WhoLiqp5OYtKKesZ+ema6VnY2Yk5yBjp+XlY6ho5WQpa2yqqmioqWllZWdmIuPkZKknolfYlhiX0tHSkpORkVBR0s/PUpCOTlKSk5dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTZ6eoZmfxKilorSinbOnk6uloKOfrKmsnbuwqKy2scfFwcKyw8O9xsS9xMm8r7C2rbC0r7/EtLmxsLq0rJmosamqmp2loafCrZussZuqo66wqaWpvLant7u+r7fErbOzw8C0x7S7uKy0tq2qoqaWlZWkrKKfoJunqrCvr7uypqCpqZmZmJOio7igoaOSr7CspaefkqGelZ6PkI2VnpuinqezpqaMl7Kboq2ZnJqsj52SlZKZf5Ghlo+Nn6CTi6arr6SmopygnpGRmpOFi5GNm51/X2NZZmRJSExKU0JDQElIOztGPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MjUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSeo5+coMOppKqzoqS1qpazrKehpLKsrqm7sq2xtbTGwMTCtMDEvsnEtb/IwrSrtaiwuay/xLO3rq22uKWYqrKrqpifppetu7SbqLCarKCttLKoq7myqLq0ubO4wKq3ssS9tceov6+utrWpp6yhmJeSpqWiopiYpa64rrK1tqCfqKSalZWUpKC3oqWllq+ysqeqpqKempqblZeon6CYoZ6usqKmjJetmKSrlpidoo+ajJKWmIWVnpSMj5udk4qoqaqhp6GYnpWLjpmPgYWUiJOed2JnW2ppTE9OTlQ+Q0FOQzs6ST83N1JPXV9SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAxLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SW9oVUNXRox5ZkM7o6Odoaa/p6evsaGptqueurGso6u0trGwubewt7i4xL3Dx729xMLGwLjAxcC6qbakrLutwcK3t6qtsrqilK2xrbKWpKeRqrmqn6awnKugr7Szq6m2tq28rbSzubesuLHDu7+/psSrsbevqKurp56YmauhoqGRmKGxr7OssLmanKmgmpeTmKegtqmmo6KxsbSss6isn5ygoJuepZyil52js7Can5CTpJmfqJmToZ2TloiTlpKVlpyTiJCamJSOqaimn6Ocl5uShY6Zi32LlYSNmWlna2BsbVdQUVtVQUJFVEA8O0lBNzpYUGReUFdXRVlfXk1MUk5eS0o+WmNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLS0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaefnaKpvaKqsKyksriqpra0rKCttb2vs7i7ur63tsDCv8nEucTCwL+4xL3Bt6+1p6u3sry+v7SprrG2nparrqiul6aojqe7n6Wss56rorGws6yptrS1vq6xsrWssLSzwbvGt6y9sLG4rKyqo7KmnqWqoKSXkZqfs6qzq6uzmp2nnJqVjqGmpLSuqKGtrq6xqLStsqqknJ+opJ6VopmbqLWplpmSkp2ZnZ+dkKqclZaElJaKnZick4qNlpaalqalo5+dlpWXkn+PlIV7jZKCi5Vka3Fmb3FeRllnVkRCTVhEWjlIQjY+XFFoXE9ZXUdbXl1PTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVVcZ0s2jHpmTECkmqGlrbelrKqmr663qq+1u6emsbfFt7G2vcHDtbW6xL7MxrnDwLm+ucO4wLmytKupura6ub60qq2wtZeYp6yprJurq46rvp6srrKjq6CxrbOurrayubiqrq6xqLWvtby9yrOqt7WxtK+upqG0oJuoraCmlpabmrKiraCmr5ehpJqak46jpaizqqGms62qtqWvsrWvpJmdrKeamJ+amau3o5eTkI6XnKCXlpOqnpqRf5KXjJ2bmJWQipSSnpmkoqKgmJaSk5V6i4+Fe4yKgoqRam13bXV7YUZha1lJSFpaPXtKRkQ2QWJUaVtNXGFLXF1aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRfVF8vNShDX1FcLitCL0pHUFtHM2NZVEtEmZehsamyqqympK+utqm3tbqkrLS3ybu0u7q/v7Szt8PAzMi8w7y2vb6/t7+8sbytp7q5t7bCtqussbeUlqauq6ijsKmUr7ukrbGzp6ijsrSxsrG1sbi0qa+ssqe3r7e0xMa3qba2rLCtqaejtqCgp7GhpJWcmpWxnqecoKqOqaOem5aYpqaluKijsrWsqLKnrrG1rKWZoKyom5yenJSpuJyUjo6Kl5uil4+XpKCck4KQlI+cm5eWlYiWj5eap5ykoJGWkZCVdoSPh3uEgYOLimxvdnR7flxMZm1cSk5kXD9ie0dJOEdnV2ZcTF5iTVhZV1VXVGldT09IYF1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkdmMjcnR2JMViUtQi49RUxRPDNya0lDQ5GZpa+lrq+rqKWxs7Srt7K4oau1ucm5rcG7wrizsbXCws7FwMG9tL2/v7q+vLLDp6m5sLa2v7yuq7Kxm6Cnsa2mpq+lnbK1rauxsqypqLW7rLWzta20raqsqKypua6yscjAuaW6sKmsrKWorrGmpaOvpKmcnp2br5qjo6Ojka2fo6Cgoqump7mlrLW3pausqa2wtq6inqOpqpugm5uSpLSZjoqNh5ChoJSMlJyfkpCDjZKSnJqXlZSHl5KVmaabn56MkpGNkHZ9jYV8e3yGiIhwcnF9fH1cU2RvXk5ZZ1xGRJZbRztObVhiW0xgYk5WV1ZXVFhnXVFSTGNZW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLysxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEorOkg+M0JIUyw+kGs7R0iPnKqroqqxpKmls7WytbaysqGrrr3Muq3AusextK20wcPRxca+wLK+wMK7vre7xKast6yyt7zAr6uxrJ+jp62pqKSwo6qyqrCssK+wrquzvKe3sbKps6qrpaWjrbqtqrLDuratu6mpp6ypp7GlqqSjrqqoop+co62VpZ6YnpmsnaKnqaKtpqStrLiysqKqoqCsr7GsnqCnp6mZo5mZj6Cml4aEjoqLnqCOioyVmo6NhIWPlJ+clJeVhpaTk5ekm5ycipKQjYl/foeFfHZ+hYOFcnFwiHVrX1pgbmJRc3FcSzuEfEY/WHVYYFpOZFtOVlZVV1FcYV5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxO1xKMC5KZ0RGODtCMDVFS1gxQJVZPUxFlZitqKKrs5yqqrC3rbi2r6umq6u9ybywvbbCr7Grs8PDzs/Dvr+0wMLDur+zx8Oqrretsri+vrKtraqkp6qwqKeosaW0rquxr62ysbSstLykuLOtrK+oq5+jnrC3q6qtu7elt7akqaerq6qtoamnprGypKeloaGsl6qhlZugpp6loqukraOfp7G4rq6kpqObqquuqZ2ipaSkmJ+blo+YnJKBgpCJhJyfi4qOi5iNjomCi5eim5CQm4uTkpGTopmbmYqOi4t9hoGBg3pzf4KAfHJ1i6SHeGtfYG5mV2WHY04/Z5NMRWJ5V2JYUmVUTVZVVlRPXF1hVUtOaFZWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZWWi4wSmdBQTw8Qis6Sk9eNESGPUdGRJeTsKajq7GYq6qttqy2sqymrKqpvMDAt7iyu7Wlsq/DycvRv8C7ub++wbnBucDErLG1sbO6wL6ysa6sqquotqmmrq+qubCosrKvs623qre3p7S3q6ylqaqco56zs6mopLS1oLeuoKqoqqirp6CrrKm5taqqqamiqqCtnJOqoZ2gpaKmo6qfnae0r6mnq6OjmKWnp6qcoqSjoJmYoJGOj5iNfoeNh4SdnYaDiYmOjY6LgoWUopqNjZqQkZGPkp+XmJaMioN/dIaBf394dIJ+eXZ9gIedj29yZ2Zwd1xhc4hrT16ZVkhueVVkVlFjT01WVFVQT1hbYlVIT2lUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDyWjrGipquvmqymrbC0tbCsprCqqLq+u8CwrbmuobavyMfI0cC+vbu7wb26wsC+v66ysrK1vLvCsbGzqrOppLSopa2zs7mwo664srCyu6u6sKqutqyqn6qsn6Ogtq2poZ+ws6K1qp6op6mjqqGirK2ova+srq2iqKigrJmQsKGYoqCnp56om5mqsaqjoK6ioZSjo6OnmJqopZiXmJ6PioeUiH2NhoSEo5aEgYGLho2LkIODk5+WiJGckJORjZGclJePioaGd3SBf3x1eHl/eXNyeGZ/hqR2aV9kaoB0Z4iMfVNYb15KeHNTZFNRXk1NUlpmTkxWWWRYR1JoUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUA0kZCzoaWnraSnpK2ntbOyq6Wxp6q4vsC7r6e5qqavscnHyNHDvL++uL2+vMi6wbiwr7Sxuru4wLKyuqy4rKK0p6essre6s6iovbautr6wvaeurLWsrZypr6Ogpa2rqJyeq7OltKibqqepo6ido6moqb2stLCunaqkoK6cm7OjlqScpaWfpZybqaumn5yropyTnKKlnpiXqKmSmJqUkIqCj4V+j4OAiJ2PhX59i4eQjY+Df5Oak4WToYyVkYuRm5KVh4l+f3J7en58aHh8eXRvb3tmhHiEiWRhZ2FyhHptZ3hdXlQ/V3ttVGJQUVhLTE5ydV1IWltnWUVVZVBEPkpPRENBOUhHS1M/amJKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmJBSjdHU2BVKj05RFc9KpCVspqgoKqmpaGspbizs6apsaasuMG9ta+iuK2oqLDCycnMwba9wLS3v7rItcK1s7K1sr24ub21rbm1vq2gs6erq7C2uLWsn769qrPBtLyhr7O1qqyfrbCjnKapqqSem6Wxp7Cgn6upp6GpnKSooa28qK6xrqGro6Sunp+tppefm6GjnJ+cmqSro5ybpaWWl5Wgo5ebl6WsjJ6RkZGLgoqAgI6Ae5mUjIh7fYuGj42LiYSSmJCGlKOJk5KHkZqQk4GIfXlrfnZ5eGN8enBvb3F2Z39zaYRoZWdfbHONbGFpb2BvPVp5a1VeTlBRSklNVFpXTV1ebFdEV19PXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPikdNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTRTPWVfREw2S1ZkTyo7MU5XPSOUma2aoZiopaSgqKS4sK+kr7Cpq7jBubKtn7mvq6i0usjLyL+2wr6vtL23xLbDsq65srPAtLq9t6i5uL2qo7Soqaqxr7mxq5y8vaWwwbW2oq+2taemp7Czn56kpqiipZmfrKipnqCqrqagppijqKCxuZ+jsa+hrKGspJynpqmampufpJWdnZueqqeXnKGqk5mUmZ+TmZahqZGaiY6QhnyHfoKNfXygjI2IeIKLhImLi4WHk5qOiZWeiJGVgouWjZF8hXxzcH1xdHRgenhobW9vbWh9cWJ7bWllYl1lhX5fWnNqcUpJf2lYWk1QTEpIUFJRSU9cX25TRFhaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQiosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPi9XVTUol56nmp2XraGhoaWiuKuypbS0qai5xLWyrZ+3ra6tsLTGyMC2vsG5sLS8tr67vq+rvbC0v7C8w7mou7q3p6e1qKirsa20saicv7imrby3sp+xt7CopaevsZuhpKClpaCXm7CnoZ+jqK+hn6GTpKSit7ChprGrn6yjr5icqqSpn5eanqWTm52bnqermpyeppeWmJaejpOXoqiikImLj4Z6hH6EinqPlomNhniBh4OHi42FjZOYjY+WmYqPl36Gl4yPeYF6cHJ3b290X3l3ZGtramdngmxlcmtrZGhYYXN/XlpsdWlZRX1dW1hPT0tISFJVRzI6Xl5sUERXVVllTUhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEhCZltIVENUXWhFLjsxXlEsMpako5iWnaqepqGjobiqsKG7uKWsvcSyr66ita+tra+0xMS9s766t7Czubi6uLqurb+ztLmuv8G3q726tKWis6uoqrOsrrKkncO3pqm3t6ufsryqp6aor6uZo6ecpaaUmKGzppqepampnKGflKWfpLmppKetpp6loaiTn6mhoaGZm52hkpudl6GjrJycm6OWk5WWm46Tk6OnpJCIio6GeYR8hYZ9nI2JioZ4gIOHiIeRhZWTkoyRlZSNjpR7g5ePind/fGx1cm1sc2J5dGhmaWZjbYRmZ2hkZmhpXmViaWZaZXpiYFBzVFtbU0tJR0lPU0AhK2leakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3N2FMJzKfpKWTj6annJ+enqS2raiqurenrMPAtq+sorWup66vt8HAvbHBt7Cusra1ubi1rKq8tK+ysb3At668vLGkn7aspqa1qquvoaDFrKqnsbWsrLW6nqipq7GlmJ2qnqelkpmlrqOZnqSqoZuhnJignae2pq+prqGhnZ2hlaCmn6KgmZyanJOanpWmn66jmJiflpWOlZiMj5iap6CQh4qKiHiFd4KCgpyHioKJe36FiIaEkISWlY+PkJGQkY2Se4OVjoVzf31neXBra2xndXNrYWdjYnN/YWNlZmVpaWJlb1leWFxsY2FMZ1dbYFZJR0hLTVJYPjlgbGlHQlVTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsqLC9BKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BiRiU1naShko2uoZqZoJeltLKjsr63obHGu7mwsKO2rKuuqbm+vbutwLKvr662rrO5sqerubGvrrO2u7avub6spp61q6ChsqWrsJ+mxaGzprCzsLeutZ6trqyuopmdp6qlnpWbp6agmaWjqZyan5yVnZ6tsKa4p66ioZqanpieo5qlnZefmJyVmqGTqZetqZyVnp2UjZWajpWUmKenjYyKiY57gXSCgouYhYZ8iYiEhYqMiJKFk5ySkZCQkZePkH+BjY6Cb4J/Z3luaGtqZ3Fya1toY2Fyf2BkZ2pua2VpZWNsXGxsdXFhU2JoY2VaSUdMTU9ZUVBVYWWBVEBWUlpURkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy40PDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFIYkInNJSjnI+PsZ2clKGbqbOwn7nAtqC0wru9ubGmtrCprqW4uri4rLuwraurt6q1ua2ksrWxr6mxtraxs7a7p6mgtqmdn6qjqq6drMSZr6awsbe2rayesa2vqqKbnaSsqZuVnKeknpmqo6WVmqCdkpyjq6qouZ6npKCXmpqdoY9ro5aZnXGDl5ylgXaSrKmflpeikoqYmYCXip+OeIWSjYNtaX53hHFshoqGfYSKhm9dZGBnhJeGa4uQlJJ1eIuEf4OQf2aIgGh2aWZYXWl0bk5QamNmcYNmXWRmbmtoXVtdiZCFh2hPS0M4RVRnXkpIUFBVVktIUmFwdGVGW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTltLW2ZiPkcxTmE8Ky+OpJqIlrKbnZShnKquq6O9xa+pt8K4vrytp7axpqukuLSzs7C5rqqnrLSlsbWip7i2tainrbazrrSutKKpn7SrnqOlnaeom7C/lainsbS5ra6kqK2qq6ahn5yhqKebmKGlppycp6idk56gmZGfqKqjs6+joqOclpiYl6OIoY+SmoihiJWfon+lgKitn5SUnpSJhHJ4jI6DiKB1h41pl4lmfnN4oG+Hh4R+jHx/oaCfmX97h550iI52m4psh4KDbWhkZHttcmJUhm1jbWmYcVhpcG6GV11oWmtqWohwbHlyh2iHhFleRk0+Rl5NRVJWVlFQUldUZ15MWkxSUlBFRkc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOi8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05bTFtnXz1LMVReNy8ojaeYhJ2snZqanZ+rqqiqv8Ovsrq8t8G/qqS3saqsprS1rq+ztquppbGtpbazm6y1trSmp6izsa2yqK6eq6GzqaCkpZuipZ6xuJWmp6e3vqasp6mqq6emoqCZoaijmZmno6WZnKWqlpOjnJWUpKamobako6CkmJWTmJOciK6QmJWKqoyZo52GsYGlrp+Vm6GXeoLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7F5aGxYsa5vZWm8krxuaHptcY/YfVJrYrayfX9wlHWaoaqQVk5YYU9WTkZVXFhQUFOLW1dbUEBcRFBOQ0ZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01dZ1w+TDFaWzQxIY+nlIGoqp+YnZ6lrbKpscK9srXAtbi/wqumtK2tqaiwtaqwtrSoqKa1pai5rpyysraqpaSnsq+usaarnqeksqSioaCXnKKgsq+Wn6Shtbqjqqihra2kop2bmqOpoJicqaCfmJ6oqJGcp5uUnqKno6Gwo56fo5aWkpiSmYWva2qLjqp/aIWWh61mcZ+elZupl3GuoaR+d7p8a6CPdrFfarRbpYBlnJBgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZGUY21tp25chKBFaWeHlkV1nGB9ZnujpoFYX4uraH2PeHpqqDhKr1tYVG1jWktPWF9cVlY7TodQV1YvSVNTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMvLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlgzMRuSopWDraemn6Okq7K4rbS9vrC3xbK4u8OnqbCssKmqsa+ksbqwpaWvs6OquamdsrKwo6Whqq2wrK+mqJ+jorGco52ZlpmdnrCpmJyioLWzoauboa2sn56al6CjqZ2ZnqWgnZqhqKSQnaObl6GgrJ+lpqCaoKGWlZGWkZqGtZu1eYapmraZd4ezm7d/lJeYrJd/a4GmeoGFhpGUknerZ2qxW6x7joeUdIlwj4aAf4iQl3iDgoqXjIOgj4WwdnefcWtrbXyLT6VYSGNjmX5jaKVfeXF1UpKGXVCpbmNwe4WAYZ0vUqJuW1RrZ2BMS1xkWFxaQj6wd1dYQSNNaUZCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWFUNTAcl6CUibOmpqGuqaizrKq7tsKwvMOtubfCq62tr6+nr7Oqoq+8q6Kotq2krLWkpbKzqKOinaeqs6mwqKaeoKCwlqCalpaXm6CwpJybpKi1r6Goj6mnqpudlpigpqmbn52joJygo6WklpufmJqeo6ubpZqcmqKgl5OSk5OdhNWTmblxscJ/xod91pScu32cl6iSj52NpHuNhqKBpYJ5q3mPnVave4l+n2q5Wrl3hYR9poKUfJl6qnmOnZB7sW2OhHSQu4ZvlVCvp8WKUaB6Y2CqYnNyh2uWh15StbTIhX6IfGOkM0Kddl1RamhkUEBYZllkYUpHTGpKWlNPWWZaQ0M/RT8wPDw1OTw3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3SDphUDcyJZyjk5mxqKmls6qltKekvLfBsLrAsre1vbS2qLKxpLKzpqCvtqmbqLqupLCxobK0saGknp6oqbGptKmlnJ6erJeZmZiYlpijrp+cl6iusamjno6soqeWnZicoaeimKKhoqGboqOonJ+hnpWZm6ehnKaUm5ufoZiQkpWQnYiybmi1cqyIcI6nc7R1dLZ7nJmmjpCdjaN+j56jfrB1gpDS0nVcrnyFf6Rum6qmaoaFfa19mJmQe7Fzk52PebNllnSFnm6fZpRSyYtawlyfeWJfrV92c4ZhlohdWcqdb8CAdE1LtVNVxmRWUmpjZVhBT2pfbGlQVUZIOT1XUltWWUhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQU5UX2VQNUc9YU02Mi6jnpGlr62lqbqsprWlp7a7vLK7v7i3tby8tKa1taOysqOgrLClmKe7rqWysZ20uKqgpZ2hqqWyqKyqpZqdm6mflpWZmZOUpKuimJOnq7GmoZaSrJ+lkpShnKWnoJWbpqeim6Ogrpqhnp6Qlpyjn5yllJ2VmaOflpmWk5uFrHx4qHejj4uHqXCui4SohJqao4uTmouifZKXh66Ef4GzXHKyU699goKjfnHXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1edneHZ5eIal2vd5Wfj3dsNXnIrrNgRFVvXmdgRVBsX3BtVlVNLmVjaFJZUDtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQmBJOjc3oJ2UoLexmbPBraiyp6qyuri0ub65uLO3vramubWhta2goKmsoJWotqyosbKrrbSkm6mgoKiitaemqqSZnpWlopSUnZqSlqSonJSQp62wpaCUmKmfoo+RopqppqGVmqapnp2kn62doZ2gjpSfnJ+gmJiclpeioJSYkaeeh6l+f6Z5oY+QhKpwrY2Cp4aXoaKKmJeIo4GQhpSqen+LnXlwsVqog4KIoHh02H92h3SngY6bjZKkfJWQn4R7sl6cZKB9gpVuk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmRPSkOhXFtNdF1iZk1aYV9ydF9KVTVKmpFYSEU9SEZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8T2VkQSZVZls/MVRfYkw3RkhfQzE9N6Kdmpq+rZizwa6rraimtLC4sbW/ubqzsrm8qru2obKln6anp5+Tq7KpsKq2raqvoZiioKakpLqjo6yhl5uRo6CVlZ+blZmhoZGOjKmwsKadlpqnpp+NkqSYqKyolZipqJ+foKSuo6GeoY6VoZmfoJKcl5yWnqGWl4+snI+ubnK0dKmMd4umdLR6dbSClKakk52NiaSHjnW4bot7i6Jra7ZaoYZll5dooKKnbZRytHOTmX+zaoWSiK1qdbRhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZvXK9WPJx3ZVRvbi5bp09iUmtlYmxZYlxgcHxjU1lRPj9sbzJCQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQTilmpyeuqOcsb+uraurp7epuK+1wbW9srG7uKvCt6qsoZ2npKKdkqurqLajs6iuqqGXnaigpau4naOtnJaZkKWjlo6eoZyZnp+Rk5WrtrCmmZObrKmXjJSmmqWto5GXq7KkoJ6orLCZoaOQmaGXoJuWm5ehlJ2pnZSQq5mH1JSau3WxxIDEh37Wl5y4eYqSmY6Yioynh3mitnV9d3bCgpqyYYO6ecB8dbhitYGMh6l9loKsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eIGKbZqIcG2NpHS9XXd9W2F5vGpaVltpeV5pYGRmYm15b1hbWUNBQHE/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvVF5gSzU8TFstNkA5p5qforyjl7DDr62pqqyxqLmvt8Wxu7OvvLCuwbKtpqOfpKKcnJGqpaqypLWnraSflpqrmaetuJ2jrpmVoZCmoJOOnaSfmZ+akJaTr7mxq5WXo6enlJCWpZ2krZ+RoKirn5yfqaSynqKljqahlaGanJeVpJmQsKCSlaqfhZCZtoCSko24lniDk5u2d25sb3RveY+EjolynsC7vJp7gbKocIB0kbmDfIaGioeNe4qGjZd9pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnF3toxef3l9iWeDeWx5YouscHSFflhbp2lEZFlUZl9jXWNRZ2ZxbXVCTU9MRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppWywrOrqqisq6q7r7HGr7W0sLintbmuq6Sip5+gnZmUrKSuqqa2qKifnJahpJ6spb6noaqXlZyRopuSkKKoopOel5KYlLK1tqyYnqOkoouTkqacpqudlqmlppyboamnp6OpoZGsnpeinpeWmJ2ej7CplJynoo9rf2qcqXmJdH+bj3Z7Zod7vr/Aum+Sg3GUhV9yalpem4lhY4eOlWtgf5RjbZx2YpRrgJqVlGVeYGNxmolocox8hpRman5wdHh+fWJbeHSBaFBcboR8fIpqWGx5gXJJSm+FcE5yTURWXGZgTFpXZmNfT1ptdmpyUk9ERU08SEk8TD4yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1Q0ZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5cTyc/Mj6on6ihwaSZtLm2o6ymrqeotbKsyKywtK22pL6xs6ehpKqdo5yamqynrqSltaqkm5iVopynram+qKmllZSblqCak5mmqaiRn5CPmJywsr6sm6edp6KJk5Kpm6iknJysn6OanKOnraKfqqKarpuUpqCXlZ2fnZixpZmiqJmdkp+dpKabqKSbnZqcm5GXgmhufXJ3kZeUkISJtKqNhZiVj4qMmJaHlJWJg5OTkImNkZSZk5mXmp+hmpuUn5uNgnqkhWxpe5B9gHWJi4Jygnh5dnaKgHyJanOCdIN1ZHd9dmtveWxfYltvZ01YWWZqX1dZcHpvbWZTT0ZSOVBaTlJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Cxt6CpprOnpbC1qsmrrbKmtabAqLShnqWmnKWWlqCrp62jpLesoJmXlqCYraqmwZ+spJaSnJefmJSVop+eo6iTkJioqLLDr5mrnKqej5aWqZ6rnJ6hrZihm52ipa+moaSonqyYlqWdmZqhnp6dsKGdoqeWmZSalKGjl6SgmaGOl5WLi46QmK6PfJWbgpGBiamohYCYlouEjp+Ie4SRhoWakYeGipWOm5eOkJieo5aZkpCcjX+NZaGzroSJhHd7kIp+d3l6b2d5kYGBiWt1gXmIcmhzf3l1g4aBanRieGVfaGRjZGZqWGt7cWprXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLOgua++raqtsbKgqqayraKss7DFsKutpLOvvKS0nKCoo6GemZeopqmmpKaztZ6VlZ6amrCmrr6hrKKRkZ6ampSSlqKcl6mdhJ2pq6O0x7OfqaSqlpaYmqeeqZygpauUn5+dn6quqKWjq6Grmp6foZiknpyfnbCkmZ+plJmZnpOmm5mqn5yXZoSTfWV/j5uQY3mMbGhqepCjq2plmph+aIWKZWVpaHqNoo5raIyXkaJ3a2qLmaKfmHNsbnqEjIZ5WGVdhYFebIuKgndcZ3N3d5KAiIJveIJ4f3NteYRzdoiHjYJ6aIRYXWpzZF1ziGlrfHFtY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXV9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0ouNlpPNilFWS9ETzFZQjs/Lj2knrq9ua+rs7CrpaitrrCmrq6wvbGqqKWusLCfrZigpJ6impqnrJyso6aoqbOunpakkKOwpra5pa6jj4+aopqTkpugmZmmlnukq6KotMO3paGnr5+dlZ6jnqOdpKqokp+hnqCqr6mqo6qeppulnqegrJahnKWxpJedrJain5uUppmgrJmffr2EiXO0c4Wfhq1od7nEuHGSoaN6ppiZdKqBfMvAwLpxi6OHg559lpiInsC9gpadnY2cwcF8gXqRjJrCwH1qpbJvjYFvynp/m3iShI+Ad3mBgHlxe4CGcHeFi5J4bHWRYmVed2NfZYBiXnRobWRiWEtWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19hX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SVtMKiNDUC8jRlszUFkvVUFCOy84laK5w7Svr7+pqZSjr6mwr62msravqqanprGroKuYm6OgnJuqp6Kdq6KlqKWltKSeo5Omrq24tKevopKRmZ2mk5GgoZiboJ6Ipqukq62/v7Ghqa+plpKfnqKZo6Sqo5OgoZ6drK6oq6WjoaSfpKWcramRpJuprqqcnqudrqOXmKaXoqSYnX/OlHp7pYJ6lpebX62PXY6ogKGhfKeVm3Wrg4CvXmSMqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3R8loe4YYKtWaPNbpB2e9t7f5lxfoiTdn9le4h2dmx+h219hY+QfWuAjF9wam9mYF94ZFtxaGpkZmBSVFNXXkpPQzVBSEVEOD41O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dW1dPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztbOkwtIVBARjQuMazBwL+0tLC3mJ6Ro6qprbWsprKtrKykrKawqqGnnJqmmJyir5+hn6ino6ahn7Csm56Wpq6tsauorKCUkpufpZOQn6WXnaijnq2jqrCov8WzqKmxrpaTnpyil6Gqqp+VoZ6dnK2upqmom6Wlo6GqkqyzlqWiqqqepKenorKik5unnKGclpWRl6FyhYyYdoWoh3GxfJ1xrH2goIGlj554q4J+rX+dcq1/rIeGn3aYknt8l36qiKKMkYucfat6iJKPn396rVacxHuQcJPBfYGVbXVwjG1md2WGb2F3bnJuiImPjoNsj41jbXN1b2BmbWRfb2lqbmZjV1NcYFpSUkM5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv08bHsrOfnaOPo6Kira+3r6mxp6iqqK6rq6eipJ2ao5WfpqugoqagqKijn56wrZiblqinr62op6mel5WapKKSlKGtmp2no6+soqy1qbnMsa2mrquWlZydopmfrqydlqGZnp6psaeoqJuqp6OiqpqvsaKoq66mmqerq6uzpJOYpKeclpOFpGukdYp6qXV7snGCpYqYjHCIoJuHpF9hUquFgK6DnHWugqiGhp96mZeGe2aAo4qkmIaBo32pf4GUhq5ee6hVnaKSgXqjn4B8xLDFjHOvtLO5cmKpr8J1aIuLlo2Aa5eQbWt4eHdua2ZkZHFxZntpY1xWX2lYWFRMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAnJyErLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C0sLCpraOop6qrq6ikpqCbpZ+dpqempJ2smqKsoaOfr6Oem5OqpLWwr6Gpm5yWlaekkZuiqJ+gppywpaKosay2x7G1qayplZGdnaKZoKWznZqhlJyep6qqoq2aq6egoamisqyhqrOyopyrqbCwuKWUl6Wpmp2Tfaptn4SIdqt5fLBugqSLiZ+WlZ6WgdK4tLjJgYKyX2GUqYOliIegepiWmnmqyXSao5SoqZCSmox+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eDk2SOj5uRe2+Uj3xteXR8em1bZWpycWaAaV5hWGNtXF5ZSUxMSkVEQkE9QTxBP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwMa5ramyrq2lop2zuayroaabqKaqrKmmoKalmKujn6+snaahrZqfqaWdp7Wgo5iUqKu2s6ybppyglpCmrZKanKejoKqnrqGjp6mws8GxsqmtqJSJmJ2lm6Kkr6aXopWYnKWlqZmunKympZ2ro7asobG5sJ6csKi0tLWmlpmppZyhkIOeTneagoCfeoSjfIKkhIamn5yflIS4fHx6uYJ/zMbDtnebopGLn36Zl5eKdp+XiqSYpKh+r4Wbg56ErH2ZlGGlbKNwj4WQgX2WhHKsYKRzcYCaYbx9UlV1jZGhlXp8kI6HcnlyhH5vW2xud3JqgW5aY19obmJkXUxMUVNBSEdGSDo6Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuirLO1pp+hlaavrq6op56lpZqkp6GzrqKpp7OgmqmklKO1o6OVl6GptbmknKOdo5OQorKZnpumpaGir62cpKiitbHCsK2qraqRh5Gcp52jpJyll56YmJmlo6eYraGso6SXrqW7rKK3tq6enrazurO1qZqfsaOmoIiQ0rXDt3qHjoWRk4+ApniUoneMoZKFpYOLcquHhrRucmmZpJ2ViZ99l5mHh5BzroKlm6ONpoqTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicnJ+n2Jzsrhod46SpJd8iYqPiHV7eI2BbGh3aXhzbn90XGRkbW1maGBKWldYPEhGP1MzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq6/v7y7tZ6XqKSutqKimZWjqqetqaqZpaKfpqGgtaeiqaexpJSro4+kraSdkJqaqrS0pJ2lnKmSlJevoKCepqOcp5y1maCqo7Wqwq+pq6mijISPnKKhpqOVmpqcmJqYpqOll6mnq6Ckm6ymvKyVvbCtn6OxtLuttqmdq7Smqpp8qJF9fLB4i4CkpYicbbJvoYetfKKPg6iXmoGsiYathaCUqKCjl4WfgZmWgXuSfquBnZmWi6t3naCPiJOSf3mvXaOBfKanZJ6AfJd0a65dpWxyhZldYFuMoG2Uj6SXgZKKk4h3eYGWfmpsfmJ9dG1/eV9nZXBvaGdoQllfWj1KUzJTOEFBQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTgxNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiMoKLySm4SpxsO3wbSfmq2grrmmo46ao6Sgr66pn6Oena2Ynrmgoqugr6qarqGRqqmlloqbkK6xrKegqJutmJmPraKhnqWhmaScrZefqKW2qL6upKmjn4yAjpuboKaekpSZm5SZmaWjopinqqqhop6oqLykl8Otq6OirbS8rbCpo7Wxqq2ad69+kYuchYd9uq2JmGSwjGWWrn2hkISnl5yCrYuFsIanmqSiopGFoFxsa4KzYH+tfHuCgLJsZm6Zl4uIsVp9tFukg2vIomafgXu7WXa1WrJ9U6+BeqxYgKFtl42mmYiVjpKTeHeMm3xjc3xig3d0gHxhamZwbWZlZU9VY1xBVF09SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt767tMGzo5ytpqW3qaCLmaCfnbKxqJ6in521mKCzqKqrnrCtnqycla6ooo6Jm46vrKmno6iZrpOaj6maoZ2knpmjoqWYnqKosai7rqSonp2PfYublqGgmZCRmpyRmZeonp+Xp6yko6SipKm6nqDGp6apoay2t66wqaG+sK+vl4KqkqOvjpuAhqSXmJCAgLjDuoSPnZOFqJmdg6yLg6+KqJybpquRftW9wqpipL+9fX+jgoPXure1hJSSgp69voRqo4Fvq4RunX96srHHg2ursL2seXiivrt0gJWMpJqNmY6TmXd/j5l5Ynx5ZIxmeIF7YGtla2piUGJbU2lcQFRgQkwpPDo0Lx8fJB4lMiAcJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLHAurK9s6Kdrqems6adjJelv6m2r6ehv6amsZuesZy5qJ+tr6WnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6adp5uaoKiimJ2gq6ypuKyno5qXk3uImZKmm5OPkJiZjpeTqJielqinnqimoKKqup6pxaOhsKSstLassqyjvquxsZx1dqqlt4VliZ9wZ6yQio9ubnelkJuggnaxm5dxkY5yl6mkm5ivpHJsbW1mi3hvbYOZcYB6aXBpZ4mWlZdxaGmFhmdxhmRdimNpb1pdZ354pmBicpCScGZkgI2SjaCWlZeOk5p6hY2TdGSGd2eManh+eWRsY2ZsYktlV0prWTpQZERQJ0o5KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurqytKqpoq6fpLOqmZK9scPHvLSpnr+rrKOgp6uguqOkraytpo6WraqQjIWVl62fpqqin6SjoJGLpZKmmamZlqOpoJacpaWmrrmqrJmak5J7hJeOppeOkZCXlI2XlKaTnZanopmvpZ2iq7mfsMGopbSnrbGzrK+uqrynsbqYjKKppraciZaimIapm5CUnZKqtJqcpK2itJikop+io52ipaKWrKeMkpONh5OdnZWQmZOYkI6VhH+kmpeVjouTkoqQh4R+Z4yBdIN3dIeMcadtfZaTlJSBgY+Pjo2bkp6UlZOdgIWSi3Boj3ZviXd2fHlpbGVkb2RVYVhAaVpHYl9NWCtFPSsmITY0MC8fHCAlMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW3r66isKWtoKG3sZGOqsS8w7m2qaGknZulnbCopLennam1p6iRmKyji4iJj5ynlq2koZqonp6TlaSXqJqpmZSmoKOPmqeYoLS5p6qYmpCNfIGVjKGUi5WRlZCPkpekjp2Yp56atKOcpqu3qK/Cr6S4p7Cwsq6rrLa8o7K/mpOnpKa1opKdpp6NqZ+Nkp+irbGboqSzq7KapqKepaufn56dl62ek5qinJSQl6uZjZiYlpCWnpGHoJ6UlIWTjI+NlYyBf2aNiHWId3qJhHScaoiSlpWSiX2MlpGQlpGfkJqTnYGGloV4cZRyeYl/cXt+am5kX3BpYFxfWW1iUGBiT1g5RkZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJakqKOws6yuo6mnraCotaqQj5ujsrmtqquhopl6nKGwpKaxqJabuKajlJipnI6GiombopCvnqSWqKChkpeZnK6LqpaPqJinjJiojp24taOlmJuNiXmClIybk4qVkZOQjZGWoYucnKednbeif4OutaKwsHWkv6SzoXl7oq21vpd4r6ahioCqf2RcYnafjqSeg5Z+bZS1naSpsKylZqChlHR6m5hwgZmqmWx/pKmKZZylnJGXmJaLkpuQhJ2bkJSDk4eOjpKKhXhrkIh2h3F8hoGBYWmJjJWTjFt2lZFnZ46McnmhlpVkeJeFgHaXaIKJgm55f2pwZV92b2trZ1xlY2FhbVFZPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0dJS0xUVVVZXWBoZmdYUUk8REc8OVVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6qlqa6kp62lkpaqtK6wpZmppaqXc4ucr6Coq6eTlrmgoI+cpJ6RfoiImp6NrJqklaeino6Xkp6Fda6PiKWaqJGWo4ibubOnoJiYi4l1d5ONlpOKk5CQlIyPkp+NmZ6lmJuxlYCMm7WdtIySj72oon6no3ulsbqDjo+on4SMho+xqa+MiZaimnmAi6yGnZ6jqaupiZaHmXemnHuInIGYp4OBe52ze4qGoJiZlJiWgZCWloOZmmJ5iJGEjY+Si4RucZCIeoJxgYGGgId0h4WXk3iWaJN0oJpze5mCnJmEmH6RiIGCmGmMjIRqeHtxcGdleG5pbGpcZGlpZXFaXEdTTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWlmWVFIOURMPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKSfpq6uq6itoKmxp6eqpZmUrcW8r6CUpae0nY+DnKycp6KgjZC+npmNn5qhkX2Gj5iXiKydo5ahoZKNlImGgJGojoeinKOTlp2Gnrmxp52ako6FcHWQiZWQipSPjpuLjZCdkJWeo5Sdq4eftIm0mq6Lyoirr4q3hY2whLOxhamOqZmNnXyoj3J7d5yOppZolaR5tIyhoKiqk5nCgoCriZmhcp6Am6V9l4WVs4GhfaGTn4+YmICOlJyJmJKLfIWUho2Vk4qEbnSShoB7c4eBhH2FdYaDmIGPxWaAqYePomqdgZ6XgJmAiouDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZsV2RGXVFMMkU0Nk1gYzcmMzxFR0Q6NjM2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBJZFhdY2ZoZ2JiYmJjY19fYmFiY2NjZGlpY2JiYmVjYWZjYmJplZejoLCpqaimrKClubGqq6aalJ6ipKmhlKOptaKvf6CnnaWenYmUvZqTjaCSnZB5g5aVkYirmZybmqKFj4x2m5uOoJGInqOblpiXhqK4rKWZm4yMf2Jtj4uTkI2Pi4yXi46Qno2SnqCYoKd+oaeHrZ2glq6QoJ6dkYeCoI2tsYikjqybjJp+onaAmZRrgat1Tat4h42dk5yqqYKqq36EoXx7p2qegJNsZ5eGmLeJnn5uYGNYg5d/jXtkZ4tzmX15l2xcfJduYFNxhVxgbXqEYFllgn6FgZlxqKtrg6NucqVwn4KcZ2SebFpsiHplWV+CfmFXUG92ZW50cWpqb11pb2xraFdmTV1YRTlBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJLTUJKW11fV15fY3VgTUU6TU5NVGJcW2ZmaWliYmRiZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiXnqC5oaqkpqySora9q6+imZafoKWrq5+crbShp5Ggn6CnnJmOmbSZkIuejJWLdYGUkY2KppaWmJ+efpOFhayjh5yRipiomJmZkYelr6ailZmHiYBpboiIi46OiYqNkYuOkaCLkp2fmqGlf5OBj6OhlKB3nJaQp4OjqYCGrLCHpXqMfoSafaJwc5OHlXuejHlth5yLmpKcqpyPh519g6J0d6Znnn53pV6Ye32Tc6JumLe0unOTiIGAtqhkgca4fHGVtoxxgJujY3Ssq2F+ap2zfm5+iIOPg4yYcYCjbHOkc56CfqNenJmzlm97l56zdHJbnrKCaWJwdHVxaG9YamtycmVbZlxhTEQ9RDVRQVlwMjxSR19KUj08Mzk1Ojo2Qzw7QElQP1ROTlFARV9eW1lYYGB7ZElDOExXVVZjYVpmZmtrYmJlYWRjYGFiYGRjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4tq2toJqhm6KjpKyamrGsq5KXoJmhpJmalJ6sm4uJkXiLhXGAlo2Kj6GQk5Sdl32RiY6ooIaYj4qSopObmoyKqKekno+Wh4R+a3uHf32PjYOLkJCJjpOegZWbn5ugn4uJd5yYoo2gcqGMiamJnaiRmKqtgK6MfnqgmXmjk3iAc5eIjJx9lZ+Hm46anaiIo2ShfoqWkJuNbZ5om45vmpl7gIqnfXJodKqDnoNzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMX6d2d4qKgJ1omnWHk5KYjX+ebZmQaqaZXKh+d7tqfalajoRds2dcbnF4d2tpW3Bpd3hhXmRWYUJQRU83VkJSbTRKWlpeTlpEQDE1MTs7N0g/OkNIVT9ZU1hdPkRiXVZgUWFjfGlFQjlOW11YZGZYZmZubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplp2JqracqIljlZysu7KwrJ2lm5qnn52smZ2wp6qdl6Oaop+Zlpago5mGiY1piIBye5eHjJaWhJKUmI96ioSWpJyJlZCGi52RnJuIj6ihn5qLkIqAgGmBhnl/l4x7iI2Oh46VmX6SoZ6goZOYcmifiqCPjHCSjIKpiZqhpaqjqn6wraSiuJd2o7Oio3+IlHideqqZf6KPn52ZiZhyoX2HjbC1fWyakaF4fpm1o6OrqISZfJp8nJp/dKpaXW97l4x4nmJNf3t7hWR6mEJNn1mianN8jm+CioSZdpt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfX1uZV9rZ3V7YmNfUF1WXFRWQFlFUGZEUlZcYVheSUQ9Qjg/QTpIRThMRVhBV1JaVkVGYVxaYEtgbX1xRUM8VV5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWR2bF5lZ2ZsZGVsaGhraZSdgbGumoRTX6GntLqzs6maoouaqZubp5Kgq6Ogp4+enZ2amZWYoZ2Wh4eJd4WBbnmVhJCbi32Rk5aIcoCJkqGbcpKQgYiYlJ+ahI6om5mVioqKfINshIVxgqGMeISMiIeRl5N7kaKfnqOIroZ9tYSPnp17ppZ6qYKXnpGMo6B/p2h4bn6Zc6BzcXydhZhvk4KtfKOEp5+bg6RwXqlodqNkcKZhnNOPfHuZeHJzY6KGkH6icqOQdmuQs4tggpiKdKqyqLx/d4Nuf7+mqrRenG9/cpdwgnOicl6kZ3SmYGimbJrTmHqCm252eZdrm3l2l3JsqaVnX2R5cX+EbGhmY211d2ZfYVFaZVBRYUhWSVRfV1NbZGpbZFBFQ0tMSktBSkQ4UEBQTVhTWE9TUWBlZWlTZHh5d0lGRWNdZVpoaVNpaGpuY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGZobGiYm3+xrFRdS3+qsLK1sLOinJiEl6agoKKMpKefl6mJmZiYlJmTkqCXjYeFe3B9hGh8j4OTmoJ3kY6PinCAho+TkmyYlHyIkZKjlYONqZmTkoqEiXmDdoiAboGfhneAkoWHmKCVeZGhopmfibOhoraLeqynpK6lcKmAm5GGgZ6UfaSBopqGmHGehKKtromXi3+MpI2Vg6+jlXe1trbJonOUjIOfYJ6XqW15loegm3Whh3egfpCWi4FvTWajknGaiHOle3p1YoOCbX6gbHJkYJxzf3SXa3tqtLa0xqZzmH56nGqamqt0gZpsc3eXaZl5dJdxUER9s15qdWt4hmZrZmJzdHBtVVtSWGdPUmdJVUxYUlVcZ2tuVWdXTUpBSk1LR0pOQVFKUGRjam1ldXNzfnh7bnWJentVUU9tXmhca2lSamhpbGdtZ2NlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlop2JsKiFZUCUorKsr6+1oaKPf5anoaGji6SmnJumgpmXl46XkJCbko2Hg3lreYZlg4x/lp95dY+IjIJqhYWShIuFnY16jIqVpZKCl6iWi5GLgIl6gH2LeXCPoIV5gZSGiJWelH6So6ablZaDZ254nGyiZHxypXicmHBop4KZjn2le6GXg5Zyn3aAiZSVj7ltj4qiYn2Zo5eJbnNrq2t1oG5vpmCbaYuQaZaHm5V1ooF+mmCLho11b4hiaKFmnn9qm3VwZGeIgm9yoltfW2Shbl6IjHF8gHRyZKVueKJkZqdol3KLl22hb1KIj26gXmSnVItdVJhtbXJrcYFtcGhrd3Nqb1FWVVVlWVNsSVhPXEhYaGhyallrVlBSRVZcTVhTYVVoal53dXt8cH18coJ7f3N3joCEd15Rc2FnYnBnUGtoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupamwsaafin+WqZydo4uhoZqhoYCVmZSOmo+Ll5CNiXuGcYCIaIuKfJeac3SJfZB8ZYOHlYqJlZqCfIiGlqaPgKGqj4WQioGKfYCAjnNpj6WEfYWTjIeXn42GkKilnImmeJabfqWJloyymZ6RhK+Xn6V5mIl7qXWnkISabqWijJKEjIO8bXylr4KHhoeVl52ifqZ7cqiVoZZon35vrGOWipaTeKhtqqOBiXWIgnerkaaIa5KxbHezjKlsi4Zvb6CekpVif6uMqneBgI6nn3effYWklZ2gaJqHdatmnq2MtnN2voyjk1mDpo2rYXVydG97dXBian1uZ21TVFhUYGBca0xcUlxJXWxtdl9bcVhbX1pnc2Vtb3FjcXRgd3p+eXJ5g3KDfoF7e42BgoB3YnlkY25zZFJsZ2dvbXJpZmlhX15cYWpibGx7b1xcYmlibWl3bWdsbmKWpqudgYCepJaqqp6op62jmYiBlqmZnaKJmqScqJ2EjJqQhpyRhZKNjIx0hXqIg2+NhX2WknN0hnKRg25/i5KHhpSQfXuChZekjX+lpI2AjomElHWCh5NubIuogIKLk42Imp2Ii5KqoqCPgHSUl4h+gXmUr6R/gpxxj4Z5ko2GgHtyqI1yfX16l5abhI14e319iJSVk4t3kZmhooV7f4psjIZcenlzenFpb36TinGAdIKPlJNxhoSCZY1/X4GBjHh2c5R1cHpvb4lvhYZfd2l4jmaCg4aPqpx/dH2WaomIb351fIN1bWxmjHN4e5d3hFpqV3mPaW53cnFvd3hvXWuFbmlnVlleVlxkamNVYFVeUV9vd3lrandlampqdXxwcXRzYW91YnN7gXh1eYJ1f4B/gHmLhYJ+fG6AbWR5bl5XbmdodWt4amlpZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW6qaeLoaKbp6SZpJ2roqCDg5aqkJ2fiJmmmqiYg4Gci36WlIeOiomMcoJ8jnx+j4R6lo50coNwlYZ8fZKLhoaPhnl+gIaYo4x7pp+KhY+PhJWDho6Yd3GEqoWNkZyPh52choqaqJ+gqoOJjZWbf36Kl62okJOokXhxn5OEfJRwf6qHcX6VcWpvfIGfi3+Rjotobl2EjY2cnaCQc5eMiXJ1bIN2dIBZcm+HkYJ+f4xqXWlke4WEiIBgaXh7nHyEjYN2goeEaXqMiWxicXODd19zjYOKkaiWh2eNjoNud4uCb4OLd21kZWN5gnqVWltpZm12W3t5d3Ruc3KDZlxtiWtrYllYXFlYanFaXmBZXl1lcn16dG90Y2pqaXt8cnp2dGRtdGhse391en17eXl/gH9whomEe31zfnpyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMq7GhkKOhmp+fmJ6ZqKKhfYKWq4yfk4aaoZCklX97mIV8kpmJiIaGinJ8gIt2hYuChJWJcm+Ac5iGhH6Tg4OGioJ6gISKmp+PgaWfhneOl4iVi4ucl4SDeqyBkJeZk4mcm4aHoaqfoaKji4iTm52jmZaroqinoZOciZmQfnqQkIapf4CTkZKTnLGlmpSdj42xkpiEpo2Nlp2hipGdhImTi2x9jnd3ZoOGkYt9iZ6Fh4uPiIiBhYSRd3x6dZukioeLoIyHln+AjYOBd3F1hoR/eImIi5GnkYSHjoeDjJCLeoWJh41/dWqAg3x5mWlxaGBzinB9e3d2b3d0gV1eb4Znbl9eWVpcU2dwVWNbW2FsaHN7e3JucGNqaWh/e214fnBocHBsZoB7coKAd399f4R7bYOMhnx6eXx9eoN4TmR2anNucXtka2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5ajoZiVmZiUmKSgnXp+l6mNnYyFn5yKnZZ8eJSDe46ZiYaDhIZteIB/coCHfoiSg21rfnqXh4SDkH6AhoSHfIeDjZudkYapnoJyio+GkpKLnJF8jXupg42Rl5WOmpWGhZumn6KanYaDkpqZmZCZpqGmnp6Ql4KTjHh9iZCGp3x9j5CRhpipoJyTnI6NqY2SgJ6NipSboISPmICIj4RxeYZydWF/hJCHdoyZgYOPgoaFf4aElW96dnWUpIyNhpuGhpB1gYx+fnNzfImFe3mNj4WUqJCHhY+BgomJiHSDhoaJeW1qfH97bWhrbGZeeX9ofHx2dHZ0endcYHB9bnRgY1pbXlFmbFNkWl1hamh1eX5wbGxjampngH9rcn9ra3Rud26EeW6GgHaCgH2Fd3KDjYd+fHt8gHuCi2Bpe2t1aGqDZGpjYGlcY3Vnb2J1bWtUYnF5ZW95enJlam1ti4qfuJqhpJ+TkpaXi5qfnpx6d5ykkJuJhqSTipiZeHmMhXuJkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foWEh3yPgI+bm5CIppt/cIuLjJKGoKGKhYx8p5CHjpGWkpSRd4yjoKGdlpp/gZCamZONmqOipJuYkpyAkId7gYWQiaGBfo2Nj3yXpKCgkpmQkKWMj4GckoqUmZ1/k5N/iI+CdnWCcXdhfoGOh3OKln2IjHGMfoKFho9qeXJ6jpqTkYCYf4mMc4OJfX1yenyNhnx7k46El6aUjYaQfISFhoR0gIGFhXhkcHp+eHlwa2pmXn1zaHx1dXN8cn9qXmB0dnB3ZGNYXV5SamhUZVheYGdpdniBcWZrY2xnZX+Aam19Z21wan13hXpri4FygYF+gXV2go2Gf3x6gIF9f49qcoNudGliiGhsYl9xVnRvbG1geGhsV2pzdmN0enpxYmtveYmNn7OSpaadjpCYj4acoJqbe3Wjno2Xf4yhioialnd6hYd+g4l+iIKBf3B+enR1goV+iZB3Z2N9hpeKgoqNeH2AjYN5loCVl5WNlZ+afW+LgZGThaWbh4yJg6aVhJGKlZaRkHWRnaGhmJSXeX+OmJePl5qdpZ6alJWde5KIhXmHmI+ff4KKjoxzl6KdoJKYjo+hjIyDmJiElJebf5mOfYqOgnhyfm57ZIB8i4Zxh5OAkYJrh4OBgIqFZ3dwfYiUmo5+lHmNi32CiX58coB5i4Z6hZKLjJmjl4OEjHeHg4KBdXp/hoNzXnZ3fHN9dmZrY2B+amt2c3N1fXB7Y2Nhc251cm1hWV9dWmtkUmJXX2Boa3R5hnFiamNsZmh8gmtodGhsb2h/fIF5bI+FcYCDg390fIONgYB+eoKDfnyQbXWJdHRtZopsamJjdVaDaXBtYHlnbGFqdnFleHt5cF9xbIWFkJ2vmKepno6Nl4eFn5OVl3x2qJqJmHmWnIuMmZB4e4CLfXyDe4CCgXhzeHlzfYCDf4iKgGRefYuUh3+Fh3R9fop/fpiElpOWjKOgl35yh3uTkYqmj4yOipKgkYOQj5OXkIqAj5igmpKQkXSAjpKUip2dnqeZmI6Vl3WQkYtth5qRm3yIiZCJb5edmaKTlYqMnYuGgZOdgJSTloeZiXyLioJ7cXprdm18f4x/boWTg5R4b4KEfn6LgWZ0an2CmJiFgI51koqFeol/d3mBfoeBfYSPho2VpZF5hYJ0iIZ8f3FzfoWBa2B5dHlwfG5hbmJke2Jub3ZzeHdyc2F2YG9sdW5vXFpeXV1qXU9cV2JhaG1zeolrX2llamNod4dtZmxoaWxngHx6d26QiHOAg4R9dIGGiXqDfXqBhH18jnJ5i3h4bWyHa2hfaXJih2hxb2Z2Z21sYXpoanx7d3Bhd22KgZmaq6GkqZ6Ki5GGiZ6KlJZ8dqyXjJZ8npORlpSIdn57inx7gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkoZ/hIRyeoCGeo+Rh5GRm5Kkm5OBfYF8jYqSo4mNio2WmoyFkJeSlY2IiIySnZOPjI1uhJCPkYmemaKhmJeKl5Nwi5uGZ4ibkJV7ioWQinCWmpOhkZKIipiMgn+Sn36TkJOLmY98i4aIdHN1a3Fvdn2LdW+GkY6TcnSAfIKCiX1lcm56f5uVfoWKdZKMgnWKe3CCf4KHfYaNi4WOlqqOe4h9foqEd31ubX6DgWFmd3N0bnphXm9ganReb2p6eXlscnBleV1tbHNtc1haXV9halpPV1dkY2ZxcX+HZV1paGdiZ3GNbmNoaGVpZ4B6d3VvjoVzgYGDfHWCiYV4hXx4hIZ6gIl3f4t7enJ5g2prX3BodH9rcW9tcWdva2V7Ym5/endwa3d3iX+jmaOooaebiIyKgY+dhpKadH+ok5GNhqCMlZOQgHN8doV4eH9yc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWBf3+gho+KkZyXoJOWd4l+gIyInJ2Kj4aSl5aFiJSYjpaLio2OjJ2KjpGEbYmLj5GKnJahnJmWhpmJbIelhWeIn4uTgI2EjIF4k5iRnZGQiYmUjX9+kJl9ko6QjZqSfYuBhHB2cGxub3F8h2pzg4+YinF4gHWCiYN6Z3Rwd4KbkH2KhXuVk3t4inVyi3yHjnuLh4WKj5yliXyEd4GKf3d3bGl+gH9bcXJxb292WV5vYG9qXm9qfHpxbm1qbXdgcG9rcW1ZWGBhYW1XUFNZZWZidW+EgmJda21kY2Vrkm1gZmZfZ2qBdXJyb4uAdH+CgHl2gIuAeYV+d4eGdoOFe4eLf3t2in9qcWJ8YoV8b3BsdWpobmx3eF9xfnl7c3Vzf4J+pZabrZ+nl4WMg36WlYOOnXSJnpOShYqajJWOjHpyeHSCcHKFc3F1iGxubHRsh3aDfX9tblVRgauUh4J4gHZyg3mCoIKQgZKRl5uRmXeReoKMkqSak46IlJiShIWWmIuTi4mOj4edhJGLfXKLhYiPiJyZn5uXlYGVgGqIn4loiKKJlIWShIpxg5GXj5qNj4yLj413e5ORe4+MjZKXjHyJfYFsd2pva2xte39ien6Pl4F3eoF4g419emh1bXaJl4yAiYd8lZFye4ZxeI57i457iX+EjpGfn4Z9fXiBinx2b2dqf4B3XXZubWtwclVdbmFxYV9sbnlwaHBmZ3N1aHFsYXdlXVVlYGBxU1BOW2VkXXhviHteXGhxYmJlZZFpX2hlW2dvfW9rcXOKfXZ9hYB1dn+MeXuGgHiHg3OGhX6MjIR8eZV4Z3Fqg2CHfm9va3tgaW10gHRfdHx4hndzc4V8eaGQmrGcpo+Din+CmYl/ipx+ipiSjoSIl46OjoR3dHZzgHBvhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xwdIN1g5+CkXaUkJibkJl7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2InH+OgXh7jH+IjIqcnJyblpR6jnhpi5SKboqlhpSJmISGY4yRmI2UiZaLjImLcHqViXyPiYuTkop6hn1/bXxlc3BrbXt6XIF6kI+Be35/gIaPe3ppdWt0jJCKg4eGfpeMbX+AcIKOgI6JfoV7hJGWm5uMfXd4go94cmtlbn2Bamdzbmdoc2xTXW9kcFpfbHJ3ZmxrYmd4c3BwZF93YGFVa19edE9NS19mY1x4cIp0XFtldmBhZGSOY2BmYlhpc3Nta3F2i3x0eYaCdnd+i3N/hn96iX9xiYeBkIqIfH6ZdmVzbnxlh39ucGuAWmtueXpyYHZ6e412cnaKdnqfjJyvm6CRg4V4iJV+e4ichoSekI6FjJeEk46HgXV3cHlwboRvbW5+cmNkd3B8bnp8amhsYqSawdyu76JzbHWDdYShhJFulY+Un5SbgJFwhYujl4mOlYqQnZWDgJSPhYiPgJKKipd+h3t2f4l4hoWOm5uXmY+Qdot4cImLjX+NpoaTi56Ghl6LlJeJjoiNioqEiWx8l4J+ioeKkZCGdoZ+fmx9ZHh1am96dFiIe5KHhnp/f4CGjX96ZnRqgYuQi4SEgY2Yhm2Dd2+Jk4OShn+Ee4KSl5SakXV0eIeMdHJwZXN3gGBybG9haHRmUmBwZ2tVX250eWFyY2BpfnFybltjcmFjVm5aXHdMTEtjZmFddnOKbVtcZHheYGRmhF9jY15YaXJrbmtyd4t9c3eEgXh4fIlxg4R8fYh7dIuIh5WFjH9/mHNodXF5bIt7bnRwgFdweXZ5cWR2eYaMaHaAiXGAnYiZqJyjk4V9cYyTeHiJnIOEn4yOfJWMf5qIhHxzd3Bzam+Ba2lsfHReYHd2e3B0emdgZXzr2rXJw9yJc2x0gHaKmoiMaZePjpyVkoGIcIWIoI6Fi5WKjJeTfI2Sh4KIj3qRi4aPgoB3eIOEcoeCk5uWlJiGjXaIgHKHhIuJnKSFlo6ghIphg5WPhYiFiIyGgIdofZR/fYSFio6PgnKHf4Byd2h2cml0eG1ajX2Tg4Z9gIOBhIuDdmJ1bYqCkYyEgICTkn5vg216iJGIlIV9gn+Ck5SSmIlvcnqMhXRrb2lwdn9dcWduXGl0X1FkcWhmU19wdnRgcGBdaINxc2pXZ2ljaVdtV1t0TEpLZWZeYXJzhWlbXGV5Xl5kZ3pgZF9dWWtuZW5qdHeKfnNygX97dnqIc4WDfH+HdnaKhY+YgY2Ce5N2bHd2eXmTdW53en1YeYVxgG5neHaRgmR2hoVxipaGmqGboYqGc2+Si3F2jZp8iZmIiXuff4OZf4J5cXRub2RyfmhmbHZ2W194e3pxcX9pYWdhf9W2jpGmeG5xd3txkpCMhmqYjYiakIuFemiHi5mGgZKRhoaXjHuMjICAiY17kI1+iYV6dXuDfHGGgJWZjpOUgol2hIh4hYKNlZ+hiJeRoYCJYX+Uh4SHg4iMf3+CZn2RgH6BhIyPkH5tg32DdWxtd3V0d3ZsY46Cj4CFf3yEgIWJf3BgdHKGfZCOg31/kop6coVne4WMiI2FfIWAgZWQkZOFb3B5i350bG1paXd6YWdqaVhrdFlSaHJpYlBicnhsYmVeWmqEbnRiXGdfZW1fb1Rabk1HTmZkXGZucoBrWltjc19cY2t2ZGVdXVpsbGJtanN2hoBxb398fXR4hniFg3yAh3V4iYGSlXuJhnaJgW94eXuDkm9te4B2XoN/dIFsaHpzlHNnc4d8cpKShJqfm5+Gh3V1k35tdZKWfYeQg4qNmXyMmnZ+dnFvbGphdHxnYmlzeVpgd3t5bXF+ZWRoaFedj19yc5e8xIR2cZSIj31xlouGm5KLh3JqiI+WgHuVjIGEmot7ioZ8e4mLf5SIdYmGdnd+gXJ1hoGelIWUj4SEcoGKd4d+i5ufmoiVj56BiWZ+k4J/hYKIiXGBfWZ+jHx5gICIjI99aYF+hHZncHl4c3d0bGuOhouCioB5goGFhIFsX3N5e36Oi4d8gpCBf3OCanqFiY2HhXmFfoKZjpGNfm5te4l9dnRuZmV7dGJbcGJXbnFTU21yaGFOZnR4ZmBeXVlvgW9zWmViXWpuYHBPWWpRRFNmYFpqbm18bllbXW1jWmJwdmNmXF1ga2ljbGpzdoGDcG1+fH90dYN6g4J8gYV2foiBlpB4hIp0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGuTjYafmaCZhIhufYt1aXeXjn6BioKUl4l5j5VvenRxa2lkYHN6aGBlcHlaYHJ8eWdxeWFlZY+xsndLYlql2dCWcXuQio93fZOKhJiQi4Vua4WSknp5koeBhJiJe4Z/d3eJioSWgHCLiHF1fntqeYWDpZCEk42Ef3CAhHiGe4idm5aNlZKWhohxe5ODfYKCiIJtgHdogIR4coCBg4qIfGV+f4R2ZHFzgGl5cW91mY6Gg4t9d3mBhXqDa1xyf3OCiYeKfoeKe4lzgm9yhYiQhoZzhXuCmo2OhXlub36Ef3Z6ZGZoe29eWHZaWHBrTldxcmZgS2x3dGFeXFtadX5zcFhnXWZqcmBvTldnUj9YZl5ab2tnenFbWlhrZVljcHleZ1xeZWxnZWtpcXd/iG9sf36AdW+Ce3+Cf4J/doGEiZeJcYKNcXuGfHp5hJOMdWp5fmtvfnR/fG9ye3qTb26BfnhnkouDoZmckYKFZoaDb2d5lYh9foSCmImBfI6NaXhza2tmX2FveW1fYm94XGRrgnlhcXZfZWXU6r2LMjo+i45/cXiFh42NdYKWjH6SjYt+bWuEjIx1fI9/hYGUiHyCd252h4SDl3dviIVsdXt1ZnmCg6eLgo+LhH5ugXZ5hXyJn5KOkpOUjoyHf3uShnd+g4yCan9yaIB+eG58fYKLhHdieoWCcmRyaX5udXJ1gpyMgYCFgHR2foBzgm9cbn91eYuEi3yIgX6JeXtybYqFkYWMc4N6gJeMi4B1bmt2gIB1dFtnZ3VuV1Z7UllvZExacnJlW0lweG9cW1tZXXR+dGhZYltnZm9kak1XZlE9XWVcXXVlYHVwWllUbmNZZHB4WWhdX2dtZ2lraXB3fY5taYKEf3lugHx9gX+BenWCgI2ThHCBi253foB7e4iSiX9oen1qc3tyhXpzdn1+jHl4hH18a4yNhJueloyBgGyNfWtofo2Len1+g5OCfn2KiGt2cmdoYltiZ3NvX2Frc2BocIh5YnN0XmNkm6CPblw1Wq+1dGmAiHyRhnWFlYVzjoqJdm9shIKGdHmJeIl8kod5fnJndol+fphvcYd/aXZ5bmZ5h4Skh4CHjYp+b4B3goN/j5uJhJaTmYqMhYl8j4hwen2Ee2h+bGqAe3pqe3eCiIFyYHeBfnJkcmd2g251e4aWkoJ9goFvd3p8dX9tWXCAd3WNg4d4iHaDiXt5dG+LgpGChnOAfn+UiYp8b25pbYGBdG1cZmRycFBaek1bbltPW3JvZFVLc3hpV1lZWmFwgHRgXV1hZ2RpaWZOWWhNQGBjW2B1YV11bFhXU3RhWmRucVZqXmJoamdtbGhwd3yTbGiEin19cH5+e4GAgXp3f3+Ki4NxfIdvcXeDf3uJjI+Dan17bXd4dop2fHh/goZ/g359em2FjIiZo42Eg3t1i3hrbISHkHh9eoKRgIB+i4Nwc3FjZl5ZZl9vb19gZ3Bmam6IdGF0b1thZGp2e4C/nKakyLhxhIJyknt3hZKCc5CLh3Jyb4N7g3R0h3SId5OIeXlwY3eHeoCTaXKEdmd3dWNqfIKInYGAf46PfnOAdYd7gpSShXqYj5aQiIKJe4iIa3h5fnRnemhrf3l0aXp3gIN9aGB4iH1ra3RofIFqdoGMkZV/e35/cXx2fHR/YlZ4fnN0i4WDfYRxh4p4eXFxhYSOgH96f353j4aEd2pxaWyHgXFvXGZhcW1JZHVLXWxUU1lybmJRT3R4YVJYWF1hcIJzW2FcaWVlZGtkUFtwSURjYFtjcF5dd2hVV1Z2XVtlbWdVa15haWdlbm5ocHZ6k21piI15fXJ7fnmCgYF8dn2DiIaDcHeEcm13goJ+iYuTf3CAe3d4eoCMdIJ4foGBgoR5gHVvfoqLm56IfYV6d4V7Z3SFi5B5fn97iIaEdo+AZ3BuX2RcWGVZbXJhYGBwbGtoiG5hdGlZX2RugHep2qnHhoeycYh3b4x0eoWNf3mSiX90c3R9d39vcX9thXSThXh0a2B6gnmJj2ZyhHBndW5bbX2AkJN/gHiRk355fG6KeIOTjoZ2mIyTkIiGhnt/hGx0dn5sZ3ZkbXt2bWp3d39/fGFieIZ6aXV1Y358Z3WHj42WfHWBd3GAe31ugFpXdX9wdoWIf4F6bYmGdHpsdoGEhX98fnp9dIyCfnRodGVuioNsc1loXnNkR21tS1pgV1ZVd21iUFJ0dlhQVlheYXGEb1xgY21lZF5vY1RcckdCZl9dZmddW3tiUVZcdFtbZ2thVWpfYG5lZmtxaHB2eI50a46NdX92eH53gYSBe3R9g4iHg29ygHRxdX6FgomNint3f3iDe3yFh3eHfH2BfoSAe35ydXmMjaCMiXmJdXSDeF59hZeLeIaDc4WGhHeJe2JubVxiW1thVmlzY2BbZ25wZodxYXFmV11ja398ys6HuaFqbW2KbHGDcXuDiX56kIR5eHN4dXR7amx2Y4R1kYJ2b2ZffYJ6i4plcoJranFjWG16hZuIgoFzl5R4f31vinOFjI6JdJmQkomGi4N8eX1wcG98ZmhxYm14cWpscXh9fXpdZXqAeGp2eGaDd2d1iIyOlX1yiGpvfoF5b31dWXN/bnWBjHyCb3CKgHF3aXiBgoGCeH5zfHWHfXtzZ3NhbouBa3FXaV12W0dtakxWVV1TVXtrYU9UdXJQUVRXXmJ0hWldYGxqZmNab2FYYnBIQWdcYGVeXFZ7Xk5VZXBZW2poXVdoYF5yZWpocmhwc3eGeG6Vi3R/enh+eYOIf3Vyf4aFjoJwcHt4d3Z5hoaHjIZ6fH90i319hoSDh35+fn2Hf3x4dXh4kZOff4x8im11gHhkg4aVhXORim+FhYF6g3RkbmpZX1tcXVRncmRgWWRxcmeAcmJrZVdbYGp/eL6ue5+3bmFzhWhzenF4gYR6fYt+d3dydm97dmVqb2GHdY6Ac2piXn54eYuEZnF/aGtrWlZvd4mjgYV/cZmTcoF6d4Rvg4SUinWXio6JhYmFfXh0cW5oeF9qbGBtdmpnamx5d3p2Wmd9fHlmc35thXRldYaNhpaAcIxna3uEdW51Yl1xfWx1fYx8gmd2h35ucWl2f3l/gHR+bXt8gnt5cWZsYm6JfWxtVmlfdlVKaWpOUU5nTFh7aGFOVXVrTFFUVV9mdYNmXmBxaGdiV2pdXGtoSkRqWWFkVllVeVlNVm1qWV1rZFxZZWNedGVtZHFncnB1gXhxmYZ2f353f3yFh311c4KIgJWCbnN5e3pzc4WHiYmDeIF9dY9+fISKjYOBhHt+i4N7dnt3d5qdmHqJgoZpdnx7bIODkn9yjoFwhYJ/gn9wZ2xnWF1bXFtTZHBkXldicnVqdW9lZWNXXFtof3BvcoBziWRkeX1pc3VzcoGDd4CDeHZydW5renFhZ2tnhnONg21mXV99cHuJf2lteGdqZFVXcm+NpnyEe3aWkXR9dH58b359k4d4mn2Jh4OHg311cHFsZ3RcbGdebHRkZ2Vpem97cllogXd1aHCBeIJ2YneGi3yVgW+Ma217gnFndGZhbnpnc3iLfH9id4R3amxydXxye3t0f2iAf4B5d29kZmJthXtsalVoYW9SSmhqT0tOb0ddemZhTVV0ZEpPU1dhanZ+Zl1nc2lmYFZkV2JwXExLaldjYVVUVXNWTFh1ZFlea2BcWmNlX3ZnbWJwaXRvcn50dJmCd3+AeIB/hoR6fXWChH+XhW5ydHx6dXGEhY+BgHqLdXOQf3yBlY2AhYR9fYyGen2AdnujpYp5iIWEa3R7enWCgIt6boRzeYR9goN2b2ppZVZdW1paU2JuZFtYYXN7amhtaWBiWF9aaX9pa2+AZ2xgaHl4anJzc22DgHp/fHV0bXpoanlqX2VuaIF2j4RnZVhid2p+h3tvanBnZl1UWG9njqd3gXp8kI55dnGAcXV4e5GBepd2h4OAhYh2anJ1Z2duW2xjXW1yX2dhanhoe2xbboNzdGpwgX56eGF3hoV5kIV0iXJweoFzZHJpXXF4ZXJ0iXx5Y3SAcWdqeXVzbXl4dnllhHx/eXdxZGRjbXt8ampUZ2FlU0prZ09HUWpFYHdmYU1Tcl1KTVRaZWt3fGZebXFpZF1WYVVublZKU2dXZl5YTVVsVEpbeF5bXmtdXVpjZWB5aGxhb292bnB3dXqYfnd/gXmAgIeGenl6g36Bk4RxdHR/eXZ0hYiRfYB8kGtylYB7gp+Ffod9gH6GgoCKe3aEq55/eoeHg2tygXl1gH6AdG6GbnyAc4qAanBuZGRYX1pZWlRiamdbWl91gmlebWxcYVdcXGuBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cmx5Z2l4Zl1kc2h6d5KBY2NUZXBogoV4eGdpamFXVllnY46nb353gIuOe3Fyf2l7cXyOfXiQc4V+f3+GbmR1cmRnZ1xqYVxvb1xnX210ZXpoXXSAb3JrcXx+dXZidYaMe4iIgYB5c3WAdmJxbltydGNxc4V8dWVzgG1hbXtwa2p8enZzZ4d2e3p2cWViZG1yfWlrU2ddXFRLcWJQRlVgR2J2ZmFLU29YSk1YWGdrdXtlZW5xZmRaV15Yd2VUSlxiV2hYWUhXZVBIYXdaXV9sWl5cYWNefmlqYG90eG1wbnaDl3pygIB8f4mMhn11dYZ4h4x8dHV1gnl6eoKMjn1+hIlpc5aBeoqdfn6FeoF6f3yGiHNxj62Me3uGj31lcYd5c3x6dXJvhmx7fmyPemNwb2JlXWVWWVlXY2ZrX11dc4VoWHFuW15YWlxse2Jwd3VsYVlsc3NndHVvbIN4fn94dm1udGRpdGVbZ3VmdnaRel9dUmZma4OCdH5iZGpcVFddYmOPpWh4dIOGkXlucXxqem99h312inSCeXx4f2hkdmxgZl9eaV5cc2tZZV1vb2J6ZVx3fGtubnB4eXR1ZXOEk3+Ig4l8d3Bzf3RjeGVccXFicXKCfXRncoBlX253amVoen11b3CDdnR9dHJiX2ZtbnxkaFNnV1hTTXZfUEpZV0hidGNhSVRtU0pNWldpbHF8Y21sc2NiWlpbYXdcU0tjXVhpU1dHWWBNR2l0WF5gbFtbX2JiXIRpaGFueHltb2p2gZB5bYN+gIGTiISBdnSJdIyGdHJ2doJ4fX1+jJCAfpN+cHeVg3yYknmAgHh6foB0iIN0cJmhenp/iZR3Y3SGeHN3dGt0bn5reHxwkXNecG5gZ2JsVFpaV2hjbWZbXHGJZVNybltaWFdgbHZjaXVqaV5ZbXNwa3Nzc2mEfH5+e3ZubmxkaXFjW2pyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJJ1bGx7b3ByfH59c4J4gHN6enpkZXVnXWJZYGdaXnZoV2JdcGhhd2FbfHZpanJveHRzdWlxgpaEh3+Fd3RrcX5vZ3hYXWxuY3J0gXp0Z3B+XGBwcmJga3J/bW52f3NyeGtxYVxlbGx6YGZSZVNWUU91W1FPWFFIY3NhYEdWalBJUFpVa2trfGVub3FiW1pYWWxxV1JQZlZWaFNURlpcTkhxdFhfY2xiWGBgYV2LamNkbXp4bHBpdXmHe2uDfX+EmnyDhHl8h22Ph3Jvdnp8dIKCfIuPg4KXdHiBk4WBnol1gYCBdH+CcYeCdW+hlnN6houGemR2iW5tem5meHB6a3N2c41rXnVuYWdla1JdW1VnYWxrWlxxjGRPb25dVlhVZ2lzaGJ0ZWRcWG10bG91dHhqhnx/e4d2j3NjZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1kX2NUWl9ZYpWVY25wg4WKdGtpfHBndXh1fW17dXZwen92X2ZyY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGl0cXRxdXdrbYWUgol8hnJzZ3B+cnRwVFxna2ZydYF3dGNtdlZjcmxbX3BnfmZueH50dHNrbmFaZGlqd15lU2NUVVBTbFZQVlJQR2RyX2FGWGlOSVhUVm1oZHxpa3hrYlddVVt0ZFNSV2hRWGZUU0haWlBNd3ZaX2VraVlhYF5ejm5iZmt5dW5vaXZ2gH9sg4B9h5h7gIeBiX5rk4hyZ3SAe3WAg32Jj3+Lk3J8ipGFh5+Ge3+GjHOBhnN9gnZupItygI2LdndseYtgZHtwZnlzeGxtcXeDZ2R8bWNmZ2hTX15VZ19sbltebo1oTmltYFRWU29nc2tleGRkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcHh+Z1pWWGBseHx7cIRfY19nVlhfV2ObiGJrcIGHfXhsbHpuXXhzbnxrdnRvcHyAc1hqbl5YXFVhYldkcGNTXmJpYWJsWmF+bGZsdHZvbXd3bGmGjICKe4lucmZyfm50bmRbYWlpcHSBdHNeaW1TZXFlVmNvZHxkc3h9d2xwbWtgWWFmZ3RcZFVgVVJOV2RST1tOT0hkb1xiR1lpTUpfS1htZGB4aW5+ZGBVX1RddVxTUmBmTl1hVVNKXFlQWXR1XV9la2hYYmFbXo1xY2dqeHFzbmh2dHqEcoKDeoiOfnyJh415bpCKdWxzgnR/f4iFh5GElY95fYyOh5GbhIB8jIVzf4FzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2MjIyMjIyNjo6OjY6Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjI2Ojo6Ojo6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQVLM2tjY2NjdbT1EREREQ1hoZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUyRtjq5+fn5+1nLjU1NTU0TWFfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJiIiIiIiHjZCQkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhYWFhYWGk5SUlJSUlYqFhYWFhYWHiYiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpKSkYmHjoqQkpKTj46PjI6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2LiouLi4yLjY6Ojo6Ojo2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkJCHiYiIjYiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQjYSIhYaPiYyPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJGJg4aHiIyIjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjI6Ih4iGjIiPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNkI6NjIuNjI6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+AgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/f39+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoWGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p7fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5e3t7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz49Ojo6PDo4OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9P0A+PD5APz09PT8+PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJFQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD47Pjw/PTw6Pj0/QkJFQD9ATmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHt7fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBQ0RCPz5BP0FERURDV3WGiYp+WEdJSkxMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5vcHFydnZ5e3t7en19fn59fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSElHSEhJR0ZCREZERENBVXSHiYeHhoiCV0lMTUxNTUxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSktNSktISEZGR0ZFUGyEh4aGhoeHiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8/P0RGSERFR0lLSUlHSElHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS01MS01MSUZKVmyBhoWEhIaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSUtMT05OUU5RXnKBhYOEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkE7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+f35/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY7PENAQkZIS0hMS01UZ3uEhIOCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg6Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5/fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo8REJERkVKYniEhIKCg4KFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Nzk5NzY2NzY1Ojo7Ojo8ODk4OTk4Nzc6Ojo4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09QUVdrcnJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxEP12Eg4ODhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+PDo8Ozw7PDs5Ojw4Ojo7Ojk5OTw/PD1BQkRJSkxLSktMV29ydHV0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj49Pz9Ed4KDhISFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQkFBQj5AQ0FAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBBQD8/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojs8Ojo6PDs9PkA/PWGFgoSDhYSGiYmIh4aGhoeIiYqLi4qKiouKi14+REdJS0pKRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo9Ojw6PT0+Pjs+PD8+Qj9KfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKh1dHTExNS05JSUtISUpKSUVDREZHRkRDRUZEQkhJS0dIR0ZHR0VLSkxJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9PD5AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf39/gICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3Oz47PDo9Pz4/PD8+QkFEPmiEgoWFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NT01MTktIR0dHRUVDRkZGRkRFSEhGQ0E/QExtcHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ojs8Oj0/PD09P0BDQkhTfoOEhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTExMSkhIRkpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5PTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW9xdXZ4ent4eHp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojs3PD06PD88PD0/QkNDTG2Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIyLi4uLXlJSUE1OTUtKR0ZDSEpHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDg/PT0+QEVEPUJEQ0ZKdYaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVGRktPTk9XVlFQT1FTUk5TVE9NU0xQU1VXUlNSUExKTU1NS05HR0pGRklKRERFRUJEQ2NxdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PEE/QUFEVEtCSElGSUt4hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZU1lYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISkhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUFDRkRDREtWUEpPT05QUHmGhYeGhYaHiIiHiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1XXVpWRVFZW1xZX1RZZ1JVVlhUVFZTT09NS0xKSUlMTUtPTVNvdHZ4eXh3eXl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hMSU1QS0lKT1NRUFRWVVZUdYWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl5eW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSklJRkJEQEE6T1FRV1hQUFBRUlNSVldXV1dsgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWlpYXGhiR09aaWdcW1xdXVdSTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaWlJTUU9RUlFVUlVTVl51eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeVFFRUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtxeV5bVlVTUk9LRkNEQU1eg2xWUlNPT1FPUVZRU1JSVGNkdoCDgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVVJNT1lRTU5RU1VVTVFTUlBPTUxIQ0lHUlNUWl1tcnZ2dXR0d3t6ent7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0YGRdXltZVVFMSUxJYWySdFBRU01RUlBTW1JTUlFSVVVic3t8foCBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+QkJDQ0E/RFBDREBDPkJIR1ZASU5NR11pUUhGT0ZERUZIR0hCQ0hHSEtHREJBQ0BOUE1SZHR1dnVzdHZ5fHp7e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaGVlYlxYU1FQVVJzV2VbT09OTFFSUFVZU1VRUVRST1Zga2xzdnp7eHl1cm5zdHN5eH5+g4CDg4KBgoCCgYFrTEc+Pjo6PkA/Pj4+alBKYUVGSElFQj9ITU1HTVFVSkJFPz48PTw9PT89P0FDQ0A/PD1CPklNRlVvdXV2c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSk9QTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yaW1scXV7en17eHp8fHh3eGRCQEBBPDpCQ0FBQ0FbXE57Tk9PTktMTU9PUExLTFdOSEdBQTw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXd1dnd5fHx8fXx8fHx+fXx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9PXlxaSUdPUVFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfXl9lYF1ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RV1BNSkRGPjo5NjU4Nzk3OTozNjU3OTU8Qj1mdHV3eHd5eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1NUU1BRVU9MUlNUV1hTVFhRTFhZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9NTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25ydXl5ent7fX19fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTU1MSkZQUFVZU1RPSk5PVVNUXFZSVVNTT01MSUhIRj8+PTo3ODc2NTk5Njc1NjVXcXF0eHp6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhYWVlZUlVPSUdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBQT05OTVBOVFJQUkxJTEtPUlBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZGQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj0zQD5qb2FSUlFAR1RRT1BQUU5RT1BPTEpMTE9QTk1QUVFOUE9KTE1NS0dFRUNCOz09PDk9RzY2NzZEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQjhETVNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTE5OTUlNTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRyc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QUBCPT5FSEZERkZJR0pKQEZBQUBFR0RJT0hRUmFcUVBST1NOT09MTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRT9CQz49Qkc/Qj9AZHJ1d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PEJBQEdJRE1PYmVQTU9NV0tMTktLTU1MTEtOTlNkTUpMUklJSUVCSUpMTU5KR0lGQkJCQD9FRkVIRExvcHZ6eXl7e3p8end0eHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0hLRT9CPTk5OTo/Qj88QUJBQURER0tGRElJR0dIQ0M/Qj4/P0A+Q0VETE1RVExKSU1URklJSkxJSktJSkxNT1BSUEtHQ0tHQ0NLSkxOT05JSklHQ0NDRElKTUxJWnNueHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEpDRkdIR0pLSUpMREdCPD49Ojo6O0FCPz1CQkNDSEVKTEpFSUlGR0hDQztBQEI+QD9CRURJTU9HSEpHSEtESElLTUhKTEhJSkxKTV1SSElETkdCRUxLTk5RTkxNSktGR0dKTU5STk1jbmp3dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZXBGSkNGRUZERUVGRUdDQ0A9PD06Ozo7QURBP0JDRUVJRkpKTEZJSUdGRkRCOkFDQz4/Q0NDREdLTUhKTkhESERJTE5NSElMR0ZGSUlMTktJSEVPSUNHTk1QTlBOT09NS0lISU9TUVJOU2dnZnJvc3h2e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWZfcEdKQ0VFREJCQUVAREI+Pz47Ozs9Oz0/REI/QUNGR0pGSklMSEdHR0ZFQz89REVCPkFDQkNFR0hJR01QSUZGRktOT0tGSElGRUNESUlIS0lHSFBLREpNTVFOT05PUE5KSklNUlVVUlBYZWFhbWZwcm9yeXpnZWhoY2lsZnFsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFREZCQUBBRDxCQT5BPTo6PT87Pj9BQj9AQkVHSkZKR0lHRkZGRURDQUFFRkNCQkJERUVHR0hGTFBMSU9KSkxLSUZIRUZFQ0NISEhLSkdLUk1DT09OUU9PT05PT0tLS1BVV1ZWVFlgX11pYG1qbmhyc2JlZmZkaGhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNR0dFR0FBQENEPEFBQEM8ODo9Pjo/PUBCQEBAREZIRUhGRkhGRUVEQ0RCRElGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTU9QTUxOU1dWV1lWWF5aXWRgaGNqaWdrX2RlZmNoZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQUFCRUU8QENCRDw3Oj0+Oz47QUI+Pz9DRUZERkRER0VDRUNERkZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhFS0tMTE5PUlRPSFRVVFFUUFFNTlFOTVFXWlZaWVdaXlpYYWBgYF5oZWNgZGVnZ2poaGpnaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQUNHRTxARUJEPDg6Pj4+PDxCQz1APkFCRkNFQ0NHRENERUZHR0dJRkdLSENJSEdJR0ZESEtJR0tITUtKS0xIS0pNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVFlaWVxaWlxfX11gY15cYmRsY2BkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkZCREdFPUFHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRGRkhIRkhHSUtKRUpISEpIRkZMSEhISkdMTExMTElNSk1OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZV5kYGZoYGVoamRzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndwd0lKTElLR0JFREU8QUZEREI7Pz9BQEBBREFAQj5BQ0hCRURGR0VJRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tLTUxKSUxLTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYmBjZGViZGljZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dXNwc3d0dXV3dnV1dGVxc2twcWpydnB3SkxLS0xHQ0NBRTw/RUVFQz1BQUNCQkNFQUNEQUFFR0NHR0hGRUlGQ0dKR0dKRUlMSElKTUtNTEdLSUhLS05RS1JRTFNNSk1NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYWNeYGZiYWNpbmhjaWhobXh2bWhpbm9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZzcXF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdEQUBEPj1ERUZDP0NBRURERkNCRUdDQ0lFQkhKSUdISkZES0pHSEpISUtHSkpOS05MSUxISk1LWmZKZFxLbFJHTk1fblVsc1txcGJ3Y1JQYnZ1aHVjYXZhWG5xYmR2aW56ZlxsdWBsa1Vfd3ZpamhoZmdsbWptb2ptb3NycHJycXJzcnNzcnRybmx0b25wcXF1dXJxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PERFRkRDQ0NFRURGQkVGR0RESkRESkxLSUtMR0dOSkhKS0dLSklLSk5MTU1MTElNTExbc2JkcF5sbFVMTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5uXHB2Z3BOS3F5dmthYWtlZWx4bWt2bG5vc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQT89QkVGQkVDRURFRURDSEhHREVLSEdLTU1KTExGSk5ISktKSUtKSklLTU1OTU1NS05NTVtycG9ucHBsa01QUWxYTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBdYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRkVFQkFCPT8/RUdCR0RJRUVEQkZJSEhER0tKR01MTkpMTUdMTklNS0hKTUlKSkpKTk9OTk1MTk1MXGhkdV1scVdsTk9RbVVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZJTEtGTUtLUlJMSE1NSE5KSUhOR0pKSEhOT01OTEpOTUpadHBwb3FxbWxPUVJuWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqW150Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNFRUVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRktNTEZPSktXUktHS0pKTklJSkxJS0pJSUtMTU1MSUtLS1NrYllpXl9qY3JyWl9Zam9fZWVVa19kW2FiUWBtaFxqXG5paWRbb2VkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVEQ0dCSEpMR0ZER0tMSUVGSk9MSU9KTFtRSkZISEtNSUhKSktLSUhKR0tLS0tHSEtKTEtMSklLTE5UW11UUFVNUU9OT09VUlBQUU9PUUpKTlBRZHFpVFlWW1tcVVlbXVhdXFxjZmFhZmJjZl9eZmttaG10eHJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdJUEtMT0tMV01JRkVISUpISUtITEpJRkhISkhISEVGTEhISk5LSE9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQUNEQkRJRUdHRktKS0hFRUpKSkZER0hQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHRUVKR0JJTUlKVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmReWl1gY19ZX2JbYF5bVVlYWl9eZGNiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdXl6enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0pKRUVISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUZDREVCRkpEP0lLSU5bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYmFdXmNhYGJiYmNjZVpSWVZXXVteZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZER0VCRUdIRkdISUZHSkdIRkhLSUtEQ0tKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdJRUVAREFISUE+SElGT11hWltkXV9UUVJYXVxcXF9bS1dcTFJcWUlNXlFRXV9iY2NjY2JcZGNiZGNlWFJWVVRdWVthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0lGR0dJR0dKRkZGSUxKTkVDS0pMTkpMSUtKSUlHQkhIUU1LS09NS0tJSEhGRT9FQkhIQUBGRUNUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVlphUlJfX2JiYGBiYl9jYmJkZGJYUFJSU1xUXF1dXl5fX2BkaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtKSUdESEtRT01MUE1MS0tJSkRFQUVDSEZBQUZEQVZVRVxUXlNWX1hOVFVOWltNSktUYGFbX1hfXmJdT1hiXGBgX2JjYV1iYldfX1RRUFFSWVNeXFtdXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVNjUUVXX0lHR0hERk1KUFBGSUlKS05MTEtNS0pKR0VJTlFRTk9QTU5NTkhMQkRBQ0NGRENBQ0RATEhDTExQT05MRk1GRkhJSEdMTE1PUElMT1BQU1BMUVRSVVpYV1lXV2NWT1NUUFFPT1FVVFxZWVteXmFhZWZjaGRsbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5NSEhZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tQVFNOUFBOT09PSEtGYEVEXkxEZmNDTFtIXlxzbU9NVm1ZTENPX1RsV2dKXVdVXkRMUVVMTVNWUVJUWFZUWFRUXFRQZlpoaGVaVGtUWFdVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPUEpMTkdITVFbWU9QUE5PUFBKS1F/UUl8WVlyc1dQbUdxbm9hVlBxcXRPQmpzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl5VVVd/aXR1dV9hdl9ZYlxcZltfYWFhYl5gY2dtb2xgcHd0eIGBgoOEgn99foB2eHptdn50eH2AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMS09ITFJYV1FOT09NUVROT1FQS0xPR01QU1taVFFST1BQUEtJWnhdVHhkaFhSU1B2ZnRscGJuZmtSck5Md21qcnBzcnFycG9wgF1lenV4cXF6cX5yfWt1fWFSaHxlc3Nvc3N8fXB+eG9/cmBgYGJiW2FhaGxua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUU9NTkpOVl5ZVUxRU05ZWUxTUlJOTFBJUVJUWVdXUVRQUFFSS0hneGxjeHFtWkpMVHlwdW11Ym52UGRkSGV2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Boblh1dWp2dXCAYXNofWlseHxvX19fY2JcX2RlZ2pqZWdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN2em58fXl4cm5NSlJ0TkNCRVBRSEtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlNKS3JvdXVxdXFjaGFWbkxxcF5HaHlXdlRLaHh9d2B5e3NuYV1tb2RTZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW58bHF2dXheX19iX11fZWVpZ2hmZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlFLTU5MTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUUlSbUhpd0tgZHZ1VVdsTm5se3Jhamd/dVRLV2tnfGxtbHhfWnB6e19genNjcm94cWhkfGlye11US2tfdnVsanZ8e21+eWt8cF1eXmJbX2JkZWdmZmVjW2NjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsZ2xtcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUE1MU1NST1NSWFJXVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTU9VTEtLUlNSUlJPVlVRUU9SUlhYUE5QVVRXWFhbW1VRUldbV1hXW09SVFdXWFFdWFZcVVRPWFJXV1hZWmBcZ3JfW1taXV1fY1pfY2NlZ2RkZGNaZGJnZmZtbm11ZmZnY2BmXl5nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTlJRUExWVVRQVFVYVVpWUltdVlVUV1VZWE9PTE5XVFBOVVNOUE5MUVBLSVFRS1FNSkpPUVRSUFFTUklJTU9QUVJQUFBUVVJYV1xXU1JQUVVVVVNaUU5SUVdVU1lWVFhUU1FUU1VVWVlYXlpfYV1cWlpcXGBjXF5iYmRnZWVlYllgYWNhYmhoam5jYWReX2NdWmNcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFRTVhXVVRWWFdXWlZTXGBWV1ZZVVhUUVBLT1hTUE5VUE5RTkxTUE1OVVNOUU5NTlFTUFRQUlRUTkxOT1JUVFFRUVVXVVlaW1pTVVJUWFdWWVxTT1NUV1VUWVVWWFRSUVdVVlhcWlxgXVdZX11eXVxdYGFeW2JjY2hnZmViWGBgYl1gaGVnZWFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlNUT0tPVlRQT1RQUFFOTVJRT1FYVFFRT01PUlROV1FUVFVPTk5RVFVVUlJSVFhWWl1cWlZWUVJXWFVbW1ZQU1VVVVZYU1dXVFJRWFZWW19bX2BfVl9dXmBcXGBgX19aYmNlaWhlZWJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1ZcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU5XU01NUk9RUk9NUFNSVVpVVFBQTFBXVVFWUlNSWE1PUFJVWFVUVFNUWVhbXl1cW1ZST1VWVVtbVlFTVlRWWFRTWFpTUlFZV1ddX1tgX2BWYlxgYV1gYl9cYF1jYWNoaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOUFdTTlFRUFJUUkxRVFNZW1dVT1JOU1hWU1JUUlJaT1FTU1ZbVlZWU1ZaWF1eXFxeVlNOVFZWW1tVUVRUVVdYUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZWddXGVgYWBhY2RfYl9ZWl9bXFtYWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dXGBcYFVcXGhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVpaWlNPU1FVVVVTTlVRUlpSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WVldeWlhRVFRXWFhTVllcVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl5eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBaVVZXVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVNPV1FTWFNXVVZbXlhbWVVaXlhfXllcWVJXUllYWV9ZWVJUVVlZWVVXWVxVVFpdXV5hYmBlZF1eXV1lYWJmZF5fZGNgXGdlaGZkYmBlYV9hYWJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hTV1VUUlNXUVNWVFhYWF5eWF1bVV1fWF9fWFxWUVlUWVpaYVhbVFZXWlpaWFlZWldWXV9gX2RjYmVlXmJcYGZiZGZkX2BkYmFbZmNoZmRmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZUXFVXV1lXVlxgYWFjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlVSVlVRU1VXW1tcX19aX1xWX19ZXV5ZXlZTWVdZWVxhWV1VVlpbWltaWllaWFlfX2BgZGNkZWVjZFpiZmNnZmVeYWJgY11iY2llZGhfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllWWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVVNVVFhdXV9gYF1hXVdhXlteXFteWFZYV1taX19aXldYXFxcXV1bWlxXWl9hXmBkZGRmZmdjWWNmZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWVhaWFdbW1pbV1haVFpdXFtgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXV1dWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQV1VXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXF5ZWFVWW1tgXlxfWVleXV5eYFxaWllbX2JfYmVkZWZnaGNaZWZnaWdjX2NeYGZlWmlpY2ZpY2ZfYmJjYWBgX11dWlhbWVlYWFpZV1pbWllXWVZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFhaYmVjYVJcWU9YVllbWVlXWlpgXmFiY2BhY19cYl1fXVteXllZVFhdXF9fXl9bWl5eYGJiXFxXW11gYmJjZWRnZmZnZV1lZ2hpZmNhYlxjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGJgY2JiXVxbWldYaXFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl5fWlhWW15cXGFhX11bYGFiZmJeXFNcX2BjZGRmZWdnZmZmYGZnaGhnZGRgW2ZnXmFoaGNpaGZjYGJgY2JfX19dXVtaW1lYWFhWWldcW1pWVlVMWFhcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t8e3t7e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x7e3t7fHt8fHt7e3t7enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiodzcXJycnJxg4qJiYmJhrPW0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMiXJvb29vb26FjYyMjIyIv+nl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXl6eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8enp6enp5ent9fHx8fHuBhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eHZ2dnp7eHt4d3Z2eHl5enp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7e3t7e3t7e3t7e3p6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3d8fH16eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3eX58fX15e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d7fnx8fHp8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7fHx9enx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5d3h6ent5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgYGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKiouHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4OFgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLh42JiImFhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqGhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaFg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qKi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGCg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhoSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgYOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCg4SDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBf4GBgICCgYKCgoGBgoKBgIKCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB+fn9/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgoGCgoODg4SCg4ODgoCAgIKCgoKCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhIWFgoGCg4KChIKBgoaFg4WDg4SEhIaFhISFgn99fX1+goSDg4ODg4ODg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISFhYWFhIaGhYaGhYWFhYSFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIuIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDhIODg4SFg4KDhIWFhoWGhoWGh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhYWHhYF/f39/f39/foCAhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaHhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoODhISEhYSDgoKDg4SDg4KDhYSFh4eFhIKAf39/f3+Af39/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoSEhISFhIGAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4WDhYODg4KBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhIOGhYOCgoKCgoOBfn1+fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIhIOEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4SEgoGBgYGBg4OEg4SRkpGOj42Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aCgoSEg4KFhoiLioaEhoSChoaCgIWEg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42QjYmGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYOBgICBf359goODg4OCgoB9fX+AgIF/fX5+fXx9fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgYGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+f358fH+Dg4KDgoOBfX1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBfn19f4CBf39+f4CAf4CAgIF/gIKAgIKCgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4ODhIWAgX98fX1+fX1+gIB+fX59e31+goODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAf35/fn5+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gH19f4GEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e39/fn9/f359fn9/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KCgYOEhIOEgIGAgIGAgYCBgoKDgYCBf4CCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gYB/gX+AgICBgYKCgH6Afn9+fn9+gYCCgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4ODgoKCgYKBfn59fX1+foB9fX19fX19fXx7enp5eXl5gIKCgoSDgIGDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaFhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiIeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFhoaHh4aHh4iGh4eHhoeHh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBg4WFhoaEg4WFg4SEg4OEg4SEhIiSjouJiIiJh4eHhYaFhIWEgoKCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf3x8fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImJiYeFhoWDg4KBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKDhIOCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY2LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OFhYWFg4ODhIKBg4OCg4KCgYCAgH+Bfn9+fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fXuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjo2Ih4eFhYSEg4KCgYKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgYGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fX18fH2Af4CAfoB+foGUkYuMjY2PioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf359foCAgYB/f359fX19fnt7fX9/f4B9f36AjJGNi4yNjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fn+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX5/f31+gH5+foSSjIuLjo2LioaEhYSEg4ODg4KDgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CEg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goGCf3+Cgn+Aio+MioqMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fHx6en16foJ/gYOEgoGCgYWGhYWGhoeFgoSRjoyKiYqHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYqJiomFiJGNi4iIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fH19fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLiomMkI2MiYiGhYSDgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjIqIiIWEhIOBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fX59fn99fX17fH1+fHx7fH16enl5enl7e35+gIGDh4SIjYyJiYaFhISDgoKCg4KCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImMiYqHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBhIF+foCAfX6Afn1+foCAf4F+f4B/f3+Af31+f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iYmHh4WGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF9foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fYB/fX1/fX5+fX58e3x6fHt6gIWCg4SFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCDgX9/gH6AgX6AgYCAf35+fn5+fn9+foWFgIGAf4CDgX9+gYB/foB/gH9+fXt6e3p8e3qCg3+CgoKCg4KDgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgX9/gH+Bf4B/fHt7enx7fIGAf4F/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f359gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgX57e3x8fH19fX59en59fnl+f398fHx+fX6BgIGBgYCCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSFhYODg4ODg4KBgoOCgYOCf4GAf39+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fn5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCBgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXd5cniFhYWFg4SEgoKDgoGBgoGAg4GAgH9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgYF+f35+fn19fX9+f358foB/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/f4KAfIB/gH5/gYB/f32Af35/f359fXyAgICAgH5/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGDgoKDhYWCgn5+fHt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc3B4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYF9foB/fn+Bf4B/f4GAf4B/fn58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFh4SFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4F/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjHp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1/gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gYCAf4CAf4CBgX+AgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBg4OAf4KBhYODhIGBg4CCg4GBgICBgoOCgIKChYN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIGAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCgoKCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5eXx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4ODgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgICAgYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoGBg4GAgICBgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDg4SEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCgoWEhIODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z0fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OCg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fX99f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dXZ/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fICBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEf319fHx8fH+Bfn1+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhYSFhIF/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWLiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4CEg4B/fn5+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3x/c4KDf4ODfYF9fn59foKDgXx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHh4iGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaGhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoKBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYSGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fX9/fX6Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWEiIWGh4aHhoiGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGhIaGhYaFhIaGhYSDhYWChYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX5+fX18f3x+fnx9gYB9fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIOEg4KEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WFhIOEhIWGhoaGhoaHhYWHhYaGhoWEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4KCg4aBg36CgoOAg4N/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWDhYWGhoaGh4WHhoeGh4eFhIaFg4GDgoCDhYKDfoGBgX+DgX9+fn9+f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYeHiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeGhYeDhIWEhoaGh4WFhIOFhYeFh4aHhYaGhoWGhoSDhYWCgYKBgIODg4J9gYGAfoOBfn9/gXx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhYWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFhoWEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhYCAgYCAhICDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx+fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYaCgoOEf36AgICBf4OAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fH9+fXx8fX9+fHuIhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFg4SEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N/fn+Af39/g398gH19f4J9gIF+foF+fX19fX97f3x7enl6enl6enx5enp7e3t9ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIKFgoWBgYB/f4CAfn+Agnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhoWFh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn99fX9+foCDfnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+foGBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58f4N9fH58fIGAfoJ/fX+CfH9+fX19fHx7e3p6enp5e3p6enp6enp7fHl7fXt8f39/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSGhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSFhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ozg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXV1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1NXV1dXV1dXV1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fY3N3d3d3d3d3d3d3d3d7b19jX2NfX19jX1tfX19bT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5s3hzc3Nzc3Nzc3Nzc3Nwkru4uLi4uLi4uLi4uLe90tLS0tLS0tPT09LT09Pc4uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpZkyKSsrKysrKysrKysqJWGppKSjo6Ojo6Ojo6Ohq9LS0tLS0tLS0tLS0tLR3+rq6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKabOC8wMDAwMDAwMDAwMCtlqqWlpaSkpKSkpKSko6zS0tLS0tLS0tLS0tLS0d7q6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamroEU9Pj4+Pj4+Pj4+Pj45bq+pqampqampqampqaiw0tLS09LS0tLS0tLS0tHe6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHKysrKysrKysnJycnJyczS0dHS0tLS0tLS0tLS0tTU1NXV1dXV1dbV1tbW2NnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7Oz9HOz9PTz87Q1NLPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW2NfX19fX19jX1tfX19fW1tbW1tbW1tbW1tbX19bV1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7O0cGn0s+hlsvRxpOr0s7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Pz9Gdj8WqoKufzpmtmbPSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pz9O6r6uxn5WPobSVh52dzs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz8/Tn7Gep52fp5m0v8mWmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/RwJyJm7WkoIufw9KRmKDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxCQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P1KOigZvFmcXJlNiso7+d1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ozo5P0A9PD09QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0cSfgXuXn6KVlaG7zYiVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDs7OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NWrr7zA03mbsLOdpdDbopm11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT87Ozk9Pj09Ozs9PEBDQj8+PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyYd/haKCo5uinZyRqJieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhxtPT1ZyasqCpoKKeqaKpnNDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BQ0JAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNLR0teoiM+wjZGl1JqRjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8OT0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHSz8XU1cC91tTTuMjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo8PT86Ozk6PD1CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tPU0tLU1dPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo8Pjs6ODo7Pz8/QkJBPkE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY7PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5Ojw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT4/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw/Qj86ODc3Nj0/P0A9QEA/Pz09Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09LS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj08P0A/PDU2NzY8Pj8+PEBAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQT8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQ0BDQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo7PD47PT07Pjw6Ozg5Ojg5QUFCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCOzk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz07Pz06OTk6PDk7RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2O0RBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Njg1OEA+QDs8OTw7PD46Ojs5Ojs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg6ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NzY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3NzY2Njg3ODQ7Pzs+PTk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODc3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg2Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2NzU1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc2Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODYzNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzg2Mzc2Nzo2NjY1OT4/Ojw/Oz85Ozo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTw/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3ODc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc4OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU2NjY3ODg6PDs9Pjo7Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRURLUE48OTg4NjU1Mzk1NjY3Njg3OT46PT46PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NTQ3NzU2Nzk9Oj0+Oz08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTQ2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA0NzM3ODU3NjY6PT88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBODw7Njo1NjUzNDY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjY0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6eoKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eWlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ycnJycnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpeXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXkpSUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZyam5ubm5uZmJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb64trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpqbm5uam5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrOvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI+PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLh4iFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/Ojw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUUlBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4Ojo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZGNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxnYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBRQD87Ojg6ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOzMzHwcPHx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTL0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raGd1WmZyd3N4ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxcm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2JiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaHRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWR0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZWJhYmNjamJmY1pZWVxZUU5FPTs4Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+6vb+5vbq6tL+4tbezr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwcq/scK/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1WVVNZT1NLRTg/Njo6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G7u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tLUklMSEM5Pjg9OzY6Ozo2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4PTw3Ozs6Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYVxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3LxsLDy87CvLm+urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1u7a5xLi0vLa6vcG8u762v8G/vL+6wMvCx8jAv7y8wMXCx8vIwcPAwMnLwsC7u7C0vL3AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVpeXFlRRURDTUlBRD1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcPDu7mztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqaipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVtfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+ytLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZV1bVEo8Pj9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7KysrSyt766s7WyvLq8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU5IQT89SENGTUQ/Nzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6trSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7GmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLaqr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BPkpCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCyse+wLi5trK0trO0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQUZNRjg2NjU6NTo9ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFvru/v7m0tLOxsa6wubm2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSD9IUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rq2vsrK6ure3tbW8tK+0q7a6uMDEwbu2vL24sq2zsK+srre2srS0r6qknpycnJ6oqJ+gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqiqq56lo5ujnJWQjI+PkJOQlpWWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGsq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxsK6vsqemr6OvrrXBurW3sre2srSrsrSuqquvsLKzraWekpiUj5mgn6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbCjpaeeoJyVk5CPkZGYkJaVmJafmJuZm6OZl5SVmp2gnaeopaCjo6Gjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0RAPTI/NzQ5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmjpK6lrKy0vLessrGvsa21r6+ztaqnrayjnJmUjpGWl5mZnKCjopudpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKeonqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWmpeXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4emBiUlVfSElJS1NUSVJQTDg+QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yeo6iurayrq6+qr6mfl56lnp6lpqSgop+moKKuq6yttbK2pq+0q6mqtLGwsLitp6GcnZqUmJuakY6RlZGMj46UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa2xsbSpsa+imZydnqGYm5uamJmblJWalpicpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSkqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlXFNaWU1RSk5OVUxSTEE3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOenaCfo6Cir66sr7Gstqetsa2mprCuraywp6CfoqCXkZScoZyZmJKTn52ipJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O3rLG0o6CdpaCsoaGioKCamJaVn5ubmKShoJ6koaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbVpSYEhRVUhGVVZKQk1HPUpIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm46Tnpmona6ep56coZ2empmSmZ6coqKgoJ2in5+en6mrp6ypqrSrq62rpaWrqKqsqqWfnpmSkpSYmZaWloyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaGroqmosqmrqKeompmdmqqmn5mnoJ+fp6ilpJ6dqqKinpufqKClp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopicm6SfoJugnKOJhYR+dnFtaXdtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREFEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7CmoJ6dnZeYlpmem5ykn5+dpJ2anZykoqSjoqqvrKepo6ChrK6uqqumoJ6eoaOenp6bnZyUk5WUnp6YlIadmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvri0u8XDvMK7t7Opsq2qs7Wvs66qrqOdq6e2sayir6Wgo6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijoqGknqaZm6Kknp+bm5uch4WBe3Rxa2t1cnBoV1xRRVRIRElPSD5FQTNFSDk1Oz02Ozw/PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUM/QUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6WdlZubn5qenJ+lpqedoKCrsa6npKSjoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jBwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK9x8bCt8PJyMLAxb65tLm6tbq3sLWyqrqxrru2vru6qretq6q4urS8rq24oqWinqeloqOpppqbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6on56fop2YmZSYlIiEfXpya2Rpb3hqZVpbRkpMRERTTERCRDc6Pzs1NDk5Nzk9Pjw8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8Oj1BP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZWalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKfn5CWn5mSmpadm5mjoa+zqaGanZ2fn5qXmJeSjI+Wl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMjJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM09DT08zKwsXGxsrHzr/J0MvGxMbEwbvDwL6+vrW9s62+v8LDxsTHxK6+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQkA1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6Osnp+upqWxqsXGzM7Nv7DCqaWora2qoZ2jn5ydmqmTmaGQjqCTjZSSl5mksbGrpKCdoJuZl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1NXT08jMx83NydLMztPNxMfJysHFy8bIyMW+wrOzx8TLysrOxcq/vr+8wcfEzMzIyb/Dv62ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3pydXVnYmd2aWRWV1FETUZASVFCPUI8OjIzQDxEPDc5PEI9PD0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOfpKOfoKSsm5aplo2XjYyNl6awrqWdnp2hpaGem5WUlpSKfHdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHR19bW0tbN1NbX1NPR09TU0s/Rw9DT1tfV1tLLyc7Ry8bN0srS1dbZ1dfT1tjO0snO0czP0MzSz7/HxsrDzMzLzs/Fxse2v8m/0szLz8XJyL/DwsjOzM/Qz8zKx824t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx3c3ZvY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ojc2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKbqaaipquao7Cxqai10NTX2tLHxsu0tsLGsrapoqWmoaKrtaeasaGWlYyQpq2rnJWYoZ2boaKfnJ2blYp3aWNhX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUz8/V1NTR0czRztPX1tPV0M/S09HJ09HI0NjX2NHX0tfZ1dbMzs/JzdHLzs+/xcLHxc7N0NDRyMvMwMrLxdPOy87IxMnGxsjMytPT0dXP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjQ0Oj01Mjc1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+uqqqsnqauuKirt9jU1dnZ0c7QwLzMybfAr6erqaOksbazpLaqn52hqqmhmJaYmpudoZ6anZ6UfnJlY2JfX2FfX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L083V1NHKz8zT1tLR1s3Q1dXRxtHUytHU1dbO0tDY2NjXy8jNw8jOzMnLv8i/yMnNzc/K0M3Oy87Ox8rP0MrOysLJxsnMyszR0szT0dDPz8q9yLmwrbu4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wbmtiZW5wYVdcWklGRkRMV0U7QDwzNDw9ODY4NTU7PkA8OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PT0/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp564trW1raWtrr60scDZ0tfa3NbPzcvD09DCwrKrra6sprOxuKuxtqmjn5yWlJebnp+fnZSWl5WJbF5eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR08vM0NHTys7R1dLV1crAycHFzMLIycLMwsXIycrOyszMz83Ty8XHz8zHx8rExsDFycvN0NHGz87NzczPxcfAt7m9w8O9w7mys76xvMTEtaqYpaGZlpGVlZKLlI2akZSUj4+UgomFeHBxa25oYGBxaFhYaFZNR0xJUFBCO0Q+OzY3Ojg5OjU3PT1AOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3Nj88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHw7nL1dbZ2tvYzczPydbWxcS4sraqpK6tuLvBxcmhl46NmJaQk5KRlpaWkIx8ZWJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrRyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS+xsm8wsbIzsTCx8DGzcfDy8nLz8fDw8/IxsHGx8O+wMfLy8vOwsrLyMfLz8TFx7vHw8jIws/Avby/sMHKx7q9qrGyp6WdopyYkJuQpJmXmZGVmImPgndudGRsYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbOxrMnNysjEvr26zc3G0NXV2drb2NDK0NDS1MrFur6+sKi3qsXd1sexkY6OlpCGg4SEgn6FhX90YFteXl5gXmBjZGNfXV1eX2BgX1taXGBrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7IxsLDwMPHysnIysfBxczGyMvNycTCy8nCwsvQxMvIv7nBusXHvb/Gz8rDv8O6ycfIusfGxMrAvcHLxsXDvcW8vL/DxMvExLy/ycLFx9HFwMi/ysrGyMbQw8PGw6/Ey8fEyre/vLq0qaylpZifmKyjoaWao6CblHt2c3Rmalthbm1aW1hRRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDx83Pzs3V0NbZ2NnQzdTOz9DLxLjGwba1vK/Yw3V9koyTl4d7gIWGgHZ4dXJwX1pbXWBhYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrG2urKys7Kxwry8u7m4wMHBxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3urrFwr68wc3Cxr69tcC9w7q8xrvCubO8xcPCwra/tbW+v7rLw7y1usi6v73Lw8HFwsbIxsjG0MbCzMiyx8rDzs3BxcK/vbK3sLOnqKi5saWtsKutrJR5dndqZWhgaG9jVl5ZSkVKRkhLQUZCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Oz9LJ0cbW1dbYzszQyM3IysW+ysGytbq603BWjo6Ki4V5gIaGgH6EfHR1ZFxcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i0t7SzsrO6tb2xt7C1r7K7wrzBxLy/u7Wyur7AuMe4tLu1wMK8t73GwMO7tK6ytrq+s8S3u7WruLy9wL2wurWvtrqyxby2rru/tLa0xby+w8XAw8XGyMvGwMbGu8jLv8/Kx8PGwcO3w769trm+xr+stbq1t7aOeHR4Z2dlYmtuXlZeYEZLSEhKRkJDQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzc7Jy8nMysvG0c/T0c/Iy8bKxsTAvc+9s7m9vblYf5KGiYl7eX6Ghnd4gn10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbWhmam1ucnykx7+5uLWwrKynnqKqp56rrLOtqaups622sLKprqassry6tsO5urqxqrW5u7TCurC/sL28u7W7x7nCtq2qqLCxwLW4vK+wp7GztLu8q621pa62rrqxsKq5r627rru4u7+/vbnCv8fDxcG8xsHIy7jFx8W/x8PDusTGwrvFyczLs7nCvLqyiHJ2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzw+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbP0szExsHF0MjPwsTHwcbGxcXMxMvMwsTByMG6vLvKt7S8vbetd5OJj5B8eX6KhXp7hIF3bl5dXV1dX2BfX2RjYmNjYmBfXltbWlpdWlpaWl1kbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquprKqwo6afqq21trG9ua+4r6iuuLS0vLizvK63ubSxu8Gxwa6lqaKssbKzp7yqq6irrK20tKaorqGkrqmypaeorqWot6ywsre5uruxvL2+vsS/tcHBx8i3v8DFt8TCv7u/xMO+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFpSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe6xLC2sJuZlZyYqqmwsbO1va/G0dDNxMi7u8zDzMC8yrnAxsC8zLrDx8W6vcS+ure9xrm2ubuvspKEiY2Be36Afnh0f3xzd2ZfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnqSbl5Gho6qjop+lpaekrJ+dm6SmrLKvtrensKynqrSrtLmwtrSstrixr7q5sbekn6Ofp7Gnq6i5qqSmp6insq2gp6aem6SmrJ6fp6SfoLGtrayytLK0sLW8trvBwbK6vsPBsrm6wrPAvb+1uLu9vrzCx8TCw76/w6CDd3BrYWVfa29gVVlfSE5oT1RIRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc3ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG7vrWgnpWeoaa6tquzs7uzxdDJzMPHubjJws7Busu5vci7t8i7t8TGs77FvLewucC7sbO3sKOFh4eCfXl2dG9ta2pqcWlfYF1cXF1fYF9hY2JgYGBgXVxbXFxYWVhYWFZYW11eZGNiZWdnZ2ptb4idqaCXlZqhlpuimJWNnqGippufn6OloaeemqKbn6qwrbG1oqmqqauspLW4rbevrLK0rrK0rrCqn52eo6KypKWpuK2hpqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqusrbCyuK+4ubuwtru7uquysrmyvbS2sbG1tL+1vcC9w8G6ur2Xg3pya19lXmRkWFRYXklXXUtQR0lKRkE8Pz9AOz88MDQ1MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZm6SmwLKvtqy0t8bQycnBx7y8xcXQwLzKu7vBu7bFuLXBwbPCxLytqrW6t6ixs6mLhoiAeXNucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1pbWVhXV1dXWFhYW15iZGRlZmZoaWtyjaidlJSUm5iboZaWkJyhoaidm5ylpqGkm5+gmpitrq2usqCloq2rp6G1sLGxrKeusqe5s6a1oaKemqOiraKhqbWqoqOmnaWmo5aYnpeYmp2fmZednJybrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7KysrezramsrrG3sLq2ub2/trKxlIV5dWVeZV5bWVZTWlVLW1FMSUVIS0lCPT9BQUBAOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vr2/s52lo5ilscK1tr2ttLjDzcnIwca4wsHI0LrDxsC2vL22w7q2v8G1u7+7qqaxu7Gosq+bfYWFgHlwcXRxaGZkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn52onJqaqqavsKubo6O3qqCfrqi2qaamrLCjt7CjtqCim5iYqqahm6y4r6KhpJyhn6CTlaGUlpabmJeWl5yUn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysa+wrq6np6eyrrG0r7y0ubauo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xLRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6ep6ejqrvAvcC5rrS4ws3Ix8TFvse6ys21xMXFsb/AucDBusDAubq9t6iosbumqaKliYF+eHJqbHJ0cGloZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbXFpYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSlpp6cn6Sfqq+mn6KjtqigoaKos6Glp6SvpbCsq7SeoJ2VlKmhoZSssbCeoqKdnpibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaWrpKWwp6Wjq6utpaiur66rqKqqs6Wmq6+0sa68tbGvr6CSenZyZGFcWl1YTkxRR1JhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sresnqSnrbe7vMHFurG5tcXKy8HEx8fJuMjGtcXCya+6vMK8w8DBvby3uramp7K2nqKKmYeAd29kYmdpaGZoamdqbWBdXFtaWllaXF1cW1xeX1xaWVtZWVpbV1VYV1RUV1VTVFJVYGBfYGFfYGFjZGmBlJOJkY6UkpOclJWWo5mglpygpaGtpaOjoqOhm6qqpZmepbGpoKCdpKqdp6GerKypqK2soqGhlJejm5yQq6mwm5+inp6XmJOKnpKNkpOVj5iYkpuhopykoKGVoKGkppujq6WipKqjq66krrGppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZVUUZRT0haXE9SSVRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDc7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY6ODU5ODk4Ojs5QDl7tbSttLuysKyyrZ2np6+5ubPAyLq1wK/Gyc67wsvNybfLv7TAx8ywtr3Iu8LHxL2/t7q1pauwrp2ah46DfHVpamptaGpsbmtrbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl9fX2JkbY6PhJGGj5GPmZOUkpyaopyboKeoqqeqpaiko5ikrqSUmaWvqZ+bmJqgnq6Zm6qzn6WmnqKjoJSTm5aVkqiprZqcoKGgmpSQjJmOi5CMkoyWlJCdoaCjnJuilZugoqCXoqijoqiroKuvpK23paOjoqytqairr7O4sr21s6uvmINycmhbWFlTVVJFWUxQXFlNVE9QTFBSSU5JQjw/P0E/PTY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmor62bqaist7asvMq7tr+szMfGucLP0Mm1xr66vsbLtbG9xb3DxsS9wbO5r6arr6uel4aBd3hvbmlubm5xZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4uQipKNl5GXmaKgm5+qqaatqqavoqeZn6yglZakqKedl4+OmZ2ulpenqpmfnZOloJ2RkJKSkpWnqqSZmZqdnZaNjIuUhoiNg5CLkpSQoJ6go5eVn5WaoKKdk5ulpaeoqKCxsKawvKego6y0q62nsLSwubXAsa2xq5B9cHJiVlRVTlJJR1ZRU1JMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurzDy9HMs7m6vsDEx7a0t72zu7zEvsKxtK6xrrGsnKKIa2hub3JvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3WJjoeQiZiJlJSXm5mdqJufqqSkqpynmKClm5KPnqKal5aEg5Gao4+TopyVlZaHoZqak4uOio+Zo6eclZWXm5CSh5SOjIGLjYCQipKSkaGan6GVk5iYlaKlmIyZpKaopqGgtLKnsrehnaK3rKqtpLKyprW8tayrsaOIeHJtXU5QUUxPQ05OTlBLRk5OS0pOTVFJTUpBR0tISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6SppaCppaSzqqKyw7W1srPHx7i7xMrNx7WvvL+4vMSzs662oq21xLq7r6qstK+voJeofV5gZ3NxdnFqbmlmaGhqX1hZWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVlhYWVhbXWFvc3ZxhYiCh4CRg46KlJGTnaCOmpuioKOYpJahm5WNh5iajHONgn2NlpaFkJmQk42OepiOnIyCin+JmJ+inpCTmJaEjoKTfn50iY56kIaSkJCdmpmakJWPnY6io46JmqChpKOborSvrK+sn5iluaalsKGwrpywu6qpr6qZgXZyYlZMUU9QTUNTTkxRTUNQUEhJTlNNSEpKREpMRUpLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3d7eio7SopaWoo6alpqams6eltMC4sLSwysa5usLPx7+1r73Dr7HHsq2nrJWkrr+4sbCfp62tq5aVonJXVl9oZ2loaW5jamhnYlxYWFhYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXipOQnpeclZSWlI6WiX+TiV87V297i5OJf4uRjI+FhnKKhJaBeYJ6hZOdlIOVjpCPgoZ9knhxb4WNfomAkI2Pl5mYk4qPiJyInpeHh5aemqGgl6evqK2pqJ+XrbSipq2YrKuYp7Siqa2jkn1xbV9aTlNRVkxEVEpQTUxGT09KRkxRTUtQSklNUEZJSD03NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXi3oKOuoaamqqCnqaeiqbCop7TBubG1sMnDubS/z8C6sbG4xKuuya6no56Gm6K6raeolqalpKGXj5ZpUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l7gnRQQkB/lZGRfYmUjISKjZqMlpWKkoiGlYZ5iH9gSlFueIqRhHyEjImEf39ufn+Ud3V2eISNmXBRjYiKhnt+eJR2Z3eFiH6KiJWKjZCSlouDiYeUhJqMgYSSm5aenJSko6eppaOem7CroaSkkKaqlqGqnKKmqIh0a2VdW0hRUVNMSVVNU0lMTFBJSEZLT0xNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49Nzs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl2tpyjp52foa6hp6ilp6ivrKq2vLa4trPCvLeousm5t6mqt7ittsCqopuTg4+Zsp+imo2glpmUkIqMZE1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/hoF7hYySgZKZi497ho9/dX94c251cHSNjYF5fYmqhXl6aHZ7jnBybXiAioySeHqAe4B2c3KSd2d1hISEhHqViYiKjIuAf4SKjH+Ug3uAj5iUm5WRn52onp+gnqCppZ+dmIynpJOgoJadnqR/cWdgXFxKVk9RR0tYUk9KTE1SSkpKTVBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC4vMjAwLy0rKCgpLjEyNjIxOTg3OTg3NzY6PDw3dq6Yo6GYnJ6zqa+ppayssLGqvbSyvLi2urWyoLe7s6udn62rrLWzpZ6WkpiGlKSWnYyDl4mPiYWFgmRLSUpJR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYF2eH+Jj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgH1/dGZ2fIVsb2hzfImMh4BseXF9cG11j3FocYB9jnBDioSCg4V+d3d6i4V9i3p1fo6Sj5iKkpqbo5eZnZudnqKdlo2KpJuPnZeOlpiOdW1rZWFZV1hUUUpSVVRPUE5RVktOS05PSlFPSU9PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+elqCmr6yuq6epsK+xrLy4rLu+ubOtqJuxqK2ckJeep6ynpJudk4iWfo6VkpWAfIp6hYB+fn9iSkdIRkJAQ0RJTExNUVJQUVNVVFRVVldXV1hXWVlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4b3x5iI95fIuFb22MkXhzeGpqf4JylpGLgX2Wf0mSmG5od36BbGljbHmFkJKGa3NsfG5ye4ZobXB+c42Ig4V6fX57dm90dIWCeYF3cHyOjIqTg5aXmJqQk5aXmZeel4yDiZ+RipKMhpCWfWxobW5tV1VXVFFRWU9TVVRUWFVNTkhNSk1OS0NJTkdFQDo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepK2voq2qqLWvrqy0v6u8wr+mo5qVpZiejoWMlqKkm5qUl492kX6Fi5CPfHh+dH14dHd5ZE9FR0RAPD4+QUZHR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqckGZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouIdYGIhnRsmZF0c3tqa52OTHmEkomEjmcxdoZzbH59g3RmZXR+hISFgGZpbHVrcH98Z3Bwe26SjY57c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJWPl46AeYiXiIaJhn+Qh3VpaW5nY1dRWVdYWVtNUFVWWllOSUlFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNi0rNTc3NTQ3OGlPODs1bpKImZGalqSorZ6ynqa6rquysMKyu8PHm5ePlJmLjoZ6hZGalo+SjpKJdIqEd4uPjH92d3V4dm94cmhVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfW1xg4GFgXmEhoZ5cqCUdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYiAaGZiaW5ybXCDdWlvWHVvjpqRdmx/enxtcW1wf3pzdW1idoR/hoCFkJGKi4mRi5GMi4+DdXiLj4B+goB9j3hwbm5qXlpbXVtZWGBfU05bWllYTEhKRkpHP0NBQkc/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5WltKitsa7Bs7rBxpeQjJSQgYl9boKRk4qEi4iQiHaEhW+Yiox/eXt7cXt0fGtvX0pQRz5ANzQ1ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH2Fg3+MfnaimXl+hoCEmYWbnGGGqp+di4KQjXp2iX6JiI5zipePg3tcZHF0ent3imxnaWF4b4WPgnpugXdzhHpwc3l3a25pXXeHfYd8iIePgIuTl4ONho2GfXGEf4R8dXd7fYh0bXFyZGVeWlpdU1tmXlhRVVlcVkdLS0VMRz9GQERDP0FBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHeJf5SMkZ2dn6aRoKqfsKmvwLG7xrqWj5GUiHqGdmuAjJKDfouFkI15hIJ1ooaNfn6CgHODgX1remxTWExBRTMxMTI2NjY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIl7iXl7cXyPjHt8iYZ+l4d2oZmIh4+SlKWNrKlIhq2vr4qAgJOKgouChJGoh4CYmIqcc2x8gYaHfY5oZ2d4fm6FhoGFcYSGR2uAd3F5dmhta193fYOIf4iFjHqVnpyKi4mRf3t1i3Z8d21vd359cXFwalpbW1pjYldnZVxVUFFYWlFETExHT0lDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjc1Njc2ODtERkxNTUxDNysiJicrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYeRj5aYkpegnayhprivs720l42Si5iLfXRwf4qTf36Ng5SVfYZ/h6WHiYCDiIZ5iYuAdYV5X2NWTEM2MC4vMjIxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYmRgZqWgqChmJWbmqWtk5m7sae7x8OnioyhpY6TiYGQe3KDnp+RnH52hYWLj4eQaWhvg4B0jIaEi3GGgneHf3t2hX1udnVngZSPhomIiImIoqujlomOmIB7gol6em9na3h9d3xxaWNcWVlcaFxhZl9aT0xOWFNRSVBLRE5HQ0pEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O252cGd4g3uAjICBkI+LmpqknKGspquvsJeSkYShlIR4d4CNlH1/koaTln6KgZKbjoSBgoyLgoqOhICKgG1wal5DQTQtLS8vLy8wMjIzNDc3OTs9P0JESEpPUVJTUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoZKjqaWjrJOotqKnwcKuyK94upSafIyhnpiEk4WCj6Gek5mShIqFj5iQlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhl4eTiY+Pl6W2qZuNlaKDh5OEfn9ramx9fn1/cV9bYl5ZZmpcbGtfWEtIUFNRTk1MRklRRERORkJDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcINwdYdxdpGGfpeWmpSfn5unoKqWk5ieaGakmn6Fk5J6gZKJkpJ9i4WZkpGDgYGLjomGkYeEiIV4eH9oTlI+Ly8uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6aimaGXopWcn6ieqaufqKypqrWXq7+rtsjJt8jRz76boHBpq6mfhJOShZygmpqZp5GRiJWhmZp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2VnpyOk5aapKOntrCdkZmoiJeQjoGIbHNze3x5bmZeW19eYWdjX2dnXFJFS0tRT0lKTUZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDU0Njk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmM0FAaWJeUHF1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJiJiNeYKNi46NfIqGj5COgYOAiYyJhZOFgoaJgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUZIQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKyoqbWssbeysq27sbO+nLPErLvJy7jDv7elo7CyrK2qo4uWmIWlpqCimIKmmY2iqqekh4WTo6CgqqCkqY6csYuVo6e3u5yho7CTo52jnpGkoquwrbO1opWmqomaipOKlXp7foN7ZV5mWmNgXWJiXmZnX1tPRElIVE9GSExGS0dGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NTQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBlIWIgpuDkpGMktrInZZzVpeIj4icj3yGjI+LinuIg4eRjoOFgYyGhYiShoKEiYaHh4dxbmFARTY0PDMvMTEwLSwrLTEvLTQ/REFOVlFSU1VVV1VNXFFHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Srs8W2rbTAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbCxm5mSmp+Jp6+qpJV3n6SXoauxs5iWqa2orrW7srqsr7Wisayytby4tK61oKioo6ibqbCts7q4uKicuKmNpY+Sk6CHeYGAcldfYlVkYGBhXl9mYFtVSkRFTFZRSUpKRUpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMXFpRY2RXenVxgZV9hIaTdoZ+gI17v7ujvIK0lJOOm4+EiI+Tiol6h4GMk42HhYGOgIGKj4aAhoiFioeRenluXVdARU48Njo0NkFCNzY0Ly82Q0hDUVxPUVVYVVxXT19VSUtKQUA/R0tGRkQ7PkA3RDc/QkpKRUdXVFBej6StpLK0w7a4wczKtrvEvbO0wbe4wrW/sLh0sbSmusWksMa5sbOytKiktraqsaCilpuikqWxraWtrKekmKCss7qiqLK5tbu+zL/Fxb29s8K3ure/uLq4uq2tsaaxqq6+sL28w8Osmbuola6PmJmriX6AeWhVYV9WaGNoZFZbY1lWVEpHR0xSR0RJSkFJRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlWWndqcH+PhIGOhW97cniIYrmhmaOJlZSWk5SUjpCXkoeHe4eBjpaKgYSBinp8i4iGfIqCgYuElX14enVmT1xkR0VMOlFkYFteU0Y/O0hQRFpjUVFZWVpnWlNgYU1TT0VBP0lKSEVGQUBDPUU2Qj9IR0tNU1pUXpSvuLW7ucnAu73Kzby8wby4try7t761urPGYXWypbGanqu+qqWoq6qkorK1oKunnpWWnpifrqWnp6WfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrEwL6+v7y8uLSwube3w7rGvsTJsJ66q6Ksj6Wpt4mAfG5cXl5cVV9dZ2ZTWWFWUlZJRUZOS0E+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQEpNUFJMUV1obWxxj42GkHNscnJ0iNXAtZqgjZWZmZGOl5KWlo6GiH2Hg42Win6Cf4N5e4uEh3uLeYGKgpd/dH16bGVwdlldXFBlZWJgZWRdW1hYXE1kbVVSbW5fb19YZ2VVWVRLREJLS0hGSEhISEJJOURASEtUVFZdWlyTucC5vrjGwbu5ysu7trq2uLm0uLW1rra3mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUjpaYl6iepp+fmpmDo52spKqxrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr3BvcLAxcTGysDJz7SkvLG1sJysub2afXZpW1xZV1tfWGFiUVxhVFJMQ0JGR0U8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy4mKiooLS4wLEBNKy81NG2JSTBIiXQ/PkJEQENER0tPRFJcWmlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIuJfIGEc3uKg4V7inSBioeVf3R7eWxtdXxpc2VpbGhmamloYGZpaW1abXSXraS9iIdnW29oXVpZVEhLT1BKS1BLVFFITEFKRktQX19iZ2pil7fHsLq0u762scXHtrC5sbG7rbOxqKu4rY22qJ6cp5pOmp6Mj6CWkaeYpZWKk5OIkYmPkZKdm6GYm5WWh56ZppqssKivp7Oz09TU1tHLz9PUztPPzMbDytC/ysnLydLIzc7D0NK4sMS9xLqmt7vEon9rYVpaW1ZeVlljWVBdWE9SQ0JJRUNJO0FEPkJIP0BCODtEPkBJPTU2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkZmDaHJveXmDoaqeppeMm5uYi46VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj35xeXVscHh/cntueHNsaYBwbWNpbnB5aXd9fsu/w9+nbmN4bmRbYWBLUFJVTlleUF5dTlFOVFFVVFxubneDcpauuKy1qLC2q629wbKrtaaluaesr6GstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEi4OUlZeXlJuQnJiZmZ6eq6ykp6KsrM7S1dHNzNLT09DU0c7Iw9TRyM7S09PXzdLRxdLWxsHPyMjDqb+40Jx2a2JaX1tUXlFcWU9QVFBOST5BR0JDRj1BQj9GRT5APzo9PTw8SkI0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd2x3cH1+gKCenqGMjZmTlIuMk4+WhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAb3dzbHN9fHd8c4J4cWuAcnJpcHJ6eXJ7vsuaf42yhHZyhXdpYWldRFpaW1dmZFhla1RYXV1gY15jeHt/i4GZqqSkoqChqaaqsbmrprSjoq6ipK6ip7GfiaablZORipKPiIKUiWuVoo2ZhIGGfpGDg5OXrIuVjpWajoWSkJ2Xp7CioKGlpKjIzc/HwsvQ09HU0s7TzcbW083U2NbW2NXX1crU2s3K2NbRy63Ew8uIb2xfXFxWUldSWk9KR0lKSkA7OjtFQkQ9Q0Q+SEM/Q0I7PDk8OkdDNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCioCdlZ6UhYuWiY+KiY6Ij4B4hJSZi42IiIuJfoN4c3x9hId3gHuHkZeBhG94cW11f3Z4fXSGfHlsh3Z0bn12hXV5e521jDxBi8alfo19amVXSUNlY2ZjaGpkb3lbX2Zoa25pboGEiZGMnp+gnpGXmaCjpKaypKWyoKKln6KpoaKxnIefkpKTkYuPi4eEj4R+nJyMjYKEhXqUf4KqlqOMkouYk4t9l4qakaqzmJucp5ymvcPFubbFzdHQ0tDL0svJ1M7R1drX19jU2djN2NvOydra0ta/zM20dXNrYVpXUFNQWFVFR0pJRkU9Ojc6QEJDOkhFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzIqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXF0ho19l5Gei36HkoKJhoWKgoh9eIWXl4mPg4eGh3qEeXF7e4WGdXqGjo6deo1wfXBweoBye4FyhIeAbo56dXd9fYJ1f3yHibB0WarCt42SgXBuYz1eaHJwcXBud3eCZWlvcnZ4cnuMh4+TkpuWoJaIjJOcn5ufq6ChrJyimpqgpp+frJmMmo2Rk46FfYiHg4WLjqCZk4iDh35smXmEmYeIk4yOlYyGe5uIk46tqpSVl5+Ypq61vKitvcfLyMnLy8/JxNLK1NfY19jX1NvX09nb1s/b2tLWydXMk3V3ZWRYV05RUltHQ0ZJSD5CPj04Oj5APD5IPUBCQUFFQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZsdoCIcZGQm4B5gI5+goGChX+EfH2EmI6HjH+Gh4F3g3lue3uHgnR6kp6OoXaPdoN0dYF+dICEb4GQgm+ShXV8gYV6dod8ibjGpcPKuIKWnI94cGZOZWOCeoJ3haGQi3l6d3uEgHyEdW2UlpWWkJiRg4mPl5qXl6admKCXn5OSl6OemquWkZGLjZODjIWJiYGGj5GenJmIhYuBhZd6iImfl5CJjoqLgnyhiZCLvKCYk5eanKimpa2ep7W/v7+4xsnNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bxoN2dmRmYV1SVVRUTUtETUM7PTw8OTo8Pzk9QTc+P0A9Pz49OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47OTo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1caXR6eWyJjZJ3dnqLfH6Af4B+hXt+gpGKhYZ7hYh8dX51bXx9h350f5KdkZ+DknyHfniPfnmLim+Dm4F0mYZ9goqFfH6Re5Cpj5DDoL2Mm6ScfoqFfYlzjIt/c6aanJiUhXuPkYmEaUdxoaSejIyRkoWIi5CSlY+dm5OUkZeNjJWfnZShlZOOjpCMf5CPjouEiZKWmZ+fiIyUkZ2Qgox/ppmIhY6DhoSApYaKi7iXnZGUlqGmoJ2dnaOutrm0q8DGytDIx83P09LS2NLV18DX2Nnb2Nra2dnX27Z2dXRnZmJUXVlSTk5IQ0xDPT0+OTk7Ojk5PD02QD4/PT05Ojo7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTzxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5PzxEUlNSWF9WWGZtbW1pgY6KcXN5int7gHx/fIh7fXyLh4N+dYSGenN6c22BfoV+d4aboZuelJKAjIh/mIeAnJJuiKmFe6CMfJGOg4mEnH6bkYqNo6KfkaSvoIuRi4WLgZOGV3Kti5+rm5CDmZyQj45bg6KRgo2fk5SMhoiMkpKMlJWVkIyPioiWm52PlZaSjJOUhoCMiZKOioqdl5ijooaTnZWgi4qJjp2Qg4iPgIOHhaWFi5CymJySlJehoJ6Zkpudp7K4rKW9wsfNyMbPzNDMztfP0dSu1tXY2tja2tfW2dqdbHlxY2NaWlVRVVZDQElDPz8+OjQ4Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnhsYn6Rg29ueIt4en97gX2HfHx3hoWAc3CFgnt1d3Z0hYOFfX+SpqKfpqKXip2QlJeLiqiXcoqyjYSokoSZlIWajKOWoJiTiZueopOpsKCRlZGOjoiWjG+Nt4SaxMiynKKmnJyYlpGxkGSkzceVjoaHiZCSjY2TlYqFioqGlpmbj5CUk4eVmISAj4uZiI6Qq5eXpKOImZ6WmoiPh5eYioWPjYF/h4+liI2TqJmXk5aYoZifmZOcmqKytKWjvMG+x8bFycjJwsrTzM3UqNLR1tbW2NrU09rOf297ZGBbW1tNSFNZQkFHRDtCPjgzNzs8Ojk+NjQ6Ojw6NzI/OjkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBjn18bX6IeHp+e4KCg393doGDfG1vi397fXh4fISHin6LorOno6uzopenn6WklpWuooORuJWSs5qMoaGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJqXocCOo8m4q5yjpq2Ykpudsp2FhqiinJiFiYmOlYyLk4+IgYaHiZOYlYyLlJOHlJiGhJGQnHWRmbKVlqShh5yZkpCLkIqXm4mLlo6GfYyYnomQkJyampOYl5+ToJ2Unpugsa6io7e+tMXHxL3Dw8DGzcrJ06bOzNPS0dbY09DYum92clleU11UTkdJTURBQ0Q1Pjo3Nzo/PDw3PTQyNjY5Nzc0PjU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTVpcWUpmYDtIhIt6em6Fhnp8hHiBhoF+cHh8fn1vc416foJ8eIaLiYaEkqa7rKixvbClrbOzqKOisKyKmrWdo7illa2ll6mtuKeko5+aqZiqpK6wqpqZnZSWkZegmJq7u67KoWq2uKuwlJmfo6yTl76jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJOWjJCVjYuNlpiTnZm0lpWrnYqclJGOkZKMmJuKkp6Qi4mWn6GNlI2YmZ2Sm5ielKGglJydpa+ooaSzuKzCyMS2ur28xcfHwtGgxsnNzcXX1tHL059td2VZV1BbT05FQz48QkFCOEA4ODU/Rz08NTwzNTM0NTQ1NEI0OTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkSGJgYnBKQIuKfoBzhod9goh1g4qCf259fH1/cHeHd46Ch3yNj4yGjJmpwsCvvca7s7TAvbStq7O2jKiyrq2+q5u7paetubirpqaioqSjqa+ysaqdnKWZm5iXn6KmpZKkuq+pwLytrrK5paSofoiGnK29sIKLjIuQg46DkY96gYiQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaXj5GgkYmUm6SslJaPk5ydk6Cdm5ifoZSanqempKKjsLKmwcbDr7C6t8XEw7/NpsfEx8S91tDNxMqFcG9eWVdcWExKQUtBRkc/QUBDOzo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTjc5R0Q/Q0ZcZUZgaWdaXVyTjIyJe4eMh4OMdYeRioFvfnuCf3F+gXuVepKUlJiQk5ans8bJv8HMwsO5x727r6u5u5izt7qywa6lwKSrr7y9qq6ro6Oep6uutbCqnKCrnKGclp+vtaeLo7q6tsG8rKmds6WkqJSFjqnEw6SCi4+HiISGlZSNeYONkY+RoYyMlJKOiZefmJOZlZemoK+cjKucjZaPkZGVlY6RlZKPoJSGl5+gsp6UmZOfoJiknpqfm6CUmJ6lpKampK+tpcDEw66ot7bJw762z7LEv8S8s9HKyMK0cXVpWVVZZ1FMSEJMS0xKQUE+REQ8NUFFOzszPThCMzMyMjYyQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVpNZVxmVGJrmY2WioyIk5CGiXmHlJCBcoB7jX94h4KCkHqNoZaomZqZur3HyMnB0snLwsy9wrOtvL6ousC+u8S3rMGprLO8vqqwqqSlpKyus622taGfr5+lopijs72qm6i9waS2uK+slLKsrKyXh5qppqWRgoyTpZaKgXWKknmFjpKQnqCTj5OMj42Uo5mWnJWUo56qnpGlmoyPj4+Vloh8j5WTkqOalZ+inLWlkJ6WpKOhpZ2dppidlZeapKOpp6KyrKi7wMOvpbO3zL+5r8Szu77BuKzCw8LAl2p2XlVUWVhKSkxJRkRESENDQURMOjRESTo7NDw4RS4xMjI0MkIyNlNITzxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmlIX1hiWmNjVp6PnI6Xjp6SiYp/iqCThHiFf5Z/fpCIipGAlqGZrqekmMK9x8PHxdPOzs3LvMK3sLq8tL3LvMPCtre8rbO/ur2ur6igqai2ra6psreanq2jp6Gdq7e4qqWwv8Syvbm0qKu2tK6ul5alrKifkY2SssWnlo58kpV8h5KZj6qZmJOTj5KVk6Sdk52Zk6GjopyYn5iLjI+OnYhakJeXkpekmWWYop+zpZWhlaurqaabnqaWmJaYlKCkqKWftqupubvDtKW0tcvAuKq2q7K7uK6ouLq9uIBoa1dUUlNNRUlSTUs/QUhFRUlISDk1RU07Pjg9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PkBCRkJwRWpJUmVhTEallJyXopeployRg4imk4iCh4KchIOVkJCUj5qinq++r6HGvMTExsbOz87Syr+7trG6u7u+z7bEvbi5t7OxtbO4s6unnKusuaqpp6+wmKOvpaejpbXAsKystL/DusC6tKe6trm0r5alra+upIuTlKGNdMKafZeZhI6XmYyxlZualZKSmZmlo5Wgm5eaqZ2boKCZio2PlZxgSpacmpSapZZUlq+fr5yfpJSuraqkmqClk5OYmI2coKeimrSoqrO7u7uqsbLHwLmmrKutsrKjobKytKRtamJZV01PSkRPT1BSO0dLSUdJQ0M+OktVP0E6PUVNMDc1NDQ6QjQ0TVdPO0pLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpaZoKKor5mRl4eLqJaOiJOFoIeEnZePnaGao6S1ybWpxbnCw8jKycjNzca/u7OuubnBwcy1x7rBubW6sK+vs7WnpJuqtLSqqaatrJqkrqWkqKy7v6istre/wb++ubOyxLK5vq2jr7WsuaaIm5emm3a/n4SZnY6TmpqMrpehnJyXlJugoaieqJ+ZmqqaoaeemJCNkZ2DbnaSopqVnaKdka6yo6qUqKqXqa2jop6kp5GRmZyHlJ2inpaxpqmruba9srKuvrm2oKOnqKWmnJutqamLYGJeXU5KS0ZHTUpWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc2P0I3NVVYTz9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh+ZV5IRauVm6Kfu6+ZlKCMk6ubkZKTiauNhqGejKOtlKOjtsa+tMC5wsLHycXCzcjCvrmyr7m0wMLKtcaywry1uqqora2wo6OYqrS7pqmmq6qdqa+no6qrvbuorb21uL7HvLe2uMKyvsG1qrW3q76lj6OYkqKgvJ+JmqCZl5+ej7efqZylopucoZqopLOgm52mnKiqnpiVj5Sbi5aJjKShlJ2inaC0r6Wkkq+rmaqqnJyjoqiQlJSfgo+enpuVqaShobO0urStqLWys56co6Wal5WYqqGedV1aXVtIR0VGTFFJTUVHR0JTTEpCRUdBVlNDSD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKBZFQ0OS0xOWZcRkNDnXBiR0Wnl6OfnsOtnJelmJqqnJaamo+qlpWnppWtrJiiq7bDw7y+tsHCwMfEv83Gu725srC5s7/Cx7W/sLy3ubampKurraChmaqqxKKkqaymnqyvq6Kpqb64p62/sri3x7a1ubjAs8DCuLWztK++o5ejl5SclK6fkKKjpaOjoJC9pamdqaudnaGbpZ69oZmjn6KprKGdl42VnpOeh4+EjZOfpKCetaymnJWwppmvpZyZqJyejJiUnoOOoJmbkqWkmpersbWxqqWqrqybmKCgko+QlaielGVfV19bTUhHSk5MSEVESUE+UUlBPEdJSVxST0s9SE9VNEJGOT5IRzVDYVtLQk5SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTltUkY8S3hlYVZLopqjnJ7FrKGerJ+erqCSo5+WpKCmqayYtrGiqrO2xcS9v7XAwrvIwr7Kx7W4tbSxs7S3wcW2vrG4tbm0n6esqqydnp6lpMGln6qtoKSpra+hpqi9taaxvbm3tsSytLi6v7TEwbm5r7O1taOdpZWSlKGuoJminqmorKOawqypnqyum5uemaagvaGdpJirrKymopqNmp+SnomOV3+Wn6WhoLiqp5OYtKKesZ+ema6VnY2Yk5yBjp+XlY2ho5WQpa2yqqmioqWllZWdmIuPkZKknolfYlhiX0tHSkpORkVBR0s/PUpCOTlKS05eUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTZ6eoZmfxKilobSinbOnk6uloKOfrKmsnbuwqKy2scfFwcKyw8O9xsS8xMm8r7C2rbC0r77EtLmxsLq0rJmosamqmp2loafCrZussZuqo66wqaWpvLant7u+r7fErbOzw8C0x7S7uKy0tq2qoqaWlZWkrKKfoJunqrCvr7uxpqCpqZqZmJOio7igoaOSr7CspaefkqGelZ6PkI2Vnpuinqe0p6aMl7Kboq2ZnJqsj52SlZKZf5GglY6Nn6CTi6arr6SmopygnpGRmpOFi5GNm51/X2NZZmRJSExKU0JDQElIOztGPzk5T05WXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MjUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSeo5+coMOppKqzoqS1qpazrKehpLKsrqm7sq2xtbTGwMTCtMDEvsnEtb/IwbSrtaivuKy/w7O3rq22uKWYqrKrq5ifppetu7SbqLCarKCttLKoq7myqLq0ubO4wKq3ssS9tceov6+utrWpp6yhmJeSpqWiopiYpa64rrK1tqCfqaSalZaUpKC3oqWllq+ysqeqpqKempqblZeon6CYoZ6vsqKmjJetmKSrlpidoo+ajJKWmIWVnpOLkJudk4qoqaqhp6GYnpWLjpmPgYWUiJOed2JnW2ppTE9OTlQ+Q0FOQzo6ST83N1JPXV9SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAxLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SW9oVUNXRox5ZkM7o6Odoaa/p6evsaKptqueurGso6u0trGwubewt7i4xL3Dx729xMLGwLjAxsC5qbakrLutwMG3t6qtsrqilK2xrbKWpKeRqrmqn6awnKugr7Szq6m2tq28rbSzubesuLHDu7+/psSrsbevqKurp56YmauhoqGRmKGxr7OssLmam6mgmpeTmKegtqmmo6KxsbSss6isn5ygoJuepZyil52js6+bn5CTpJmfqJmToZ2TloiTlpKVlpySiJCamJSOqaimn6Ocl5uShY6Zi32LlYSNmWlna2BsbVdQUVtVQUJFVEA7O0lBNzpYUGReUFdXRVlfXk1MUk5eS0o+WWNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLS0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaefnaKpvaKqsKyksrmqpra0rKCttb2vs7i7ur63tsDCv8nEucTCwL+3w73At661p6u3sbu9vrSprrG2nparrqeul6aojqe7n6Wss56rorGws6yptrS1vq6xsrWssLSzwbvGt6y9sLG4rKyqo7KmnqWqoKSXkZqfs6qzq6uzmp2nnJqVjqGmpLSuqKGtrq6xqLStsqqknJ+opJ6VopmbqLWpl5mSkp2ZnZ+dkKqclZaElJaKnZibk4qNlpaalqalo5+dlpWXkn+PlIV7jZKCi5Vka3Fmb3FeRllnVkRCTVhEWjlIQjY+XVFoXE9ZXUdbXl1PTVJYZEpKQlxiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVVcZ0s2jHpmTECkmqGlrbelrKqmr663qq+1u6emsbfFt7G2vcHDtbW6xL7MxrnDwLm+ucO4wLiytKupura6ub60qa2wtZeYp6yprJurq46rvp6srrKjq6CxrrOurbWyubiqrq6xqLWvtbu8yrOqt7WxtK+upqG0oJuoraCmlpabmrKjraCmr5ehpJqak46jpaizqqGms62qtaWvsrWvpJmdrKeamJ+amau3o5eTkI6XnKCXlpOqnpqRf5KXjJ2bmJWQipSSnpmloqKgmJaSk5V6i4+Fe4yKgoqRam13bXV7YUZha1lJR1paPXtKRkQ2QWJUaVtNXGFLXF1aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRfVF8vNShDX1FcLitCL0pHUFtHM2NZVEtEmZehsamyqqympK+utqm3tbqkrLS3ybu0u7q/v7Szt8PAzMi8w7y2vb6/t768sbytp7q5t7XCtqqtsbeUlqauq6ijsKmUr7ukrbGzp6ijsrWxsbC1sbi0qa+ssqe3r7e0xMa3qba2rLCtqaejtqCgp7GhpJWcmpWxnqecoKqOqaOem5aYpqaluKijsrWsqLGnrrG1rKWZoKyom5yenJSpuJyUjo6Kl5uil4+XpKCck4KQlI+cm5eWlYiWkJiap5ykoJGWkZCVdoSPh3uEgYOLimxvdnR7flxMZm1cSk5jXD5ie0dJOEdnV2ZcTF5iTVhZV1VXVGldT09IYF1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkdmMjcnR2JMViUtQi49RUxRPDNya0lDQ5GZpa+lrq+rqKWxs7Srt7K4oau1ucm5rcG7wrizsbXCws7FwMG9tL2/vrq+vLLDp6m5sLW1v7yurLKxm6Cnsa2mpq+lnbK1rauxsqypqLW7rLSyta20raqsqKypuK2ysMjAuaW6sKmsrKWorrGmpaOvpKmcnp2bsJqjo6Ojka2fpKCgoqump7mlrLa2pausqa2wtq6inqOpqpugm5uSpLSZjoqNh5ChoJSMlJyfkpCDjZKSnJqXlZSHl5KVmaebn56MkpGNkHZ9jYV8e3yFiIhwcnF9fH1cU2RvXk5YZlxGRJZbRztObVhiW0xgYk5WV1ZXVFhnXVFSTGNZW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLysxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEorOkg+M0JIUyw+kGs7R0iPnKqroqqxpKmls7WytbaysqGrrr3Muq3AusextK20wcPRxca+wLK+wMK7vre7xKastquyt7vAr6uxrJ+jp62pqKSwo6qyqrCssK+wrquzvae2sLKps6qrpaWjrbqtqrLDuratu6mpp6ypp7GlqqSjrqqoop+co62VpZ6YnpmsnaKnqaKtpqStq7izsqKqoqCsr7GsnqCnp6mZo5mZj6Cml4aEjoqLnqCOioyVmo6NhIWPlJ+clJeVhpaUk5ekm5ycipKQjYl/foeFfHZ+hYOFcnFwiHVrX1pgbmJRcnBcSzuEfEY/WHVYYFpOZFtOVlZVV1FcYV5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxO1xKMC5KZ0RGODtCMDVFS1gxQJVZPUxFlZitqKKrs5yqqrC3rbi2r6umq6u9ybywvbbCr7Grs8PDzs/Dvr+0wMHDub+zx8Oqrratsri+vrKtraqkp6qwqKeosaW0rquxr66ysbSstLykt7OsrK+oq5+jnrC3q6qturelt7akqqerqqqtoamnprGypKeloaGsl6qhlZugpp6loqukraOfp7G4rq6kpqObqquuqZ2ipaSkmJ+blo+YnJKBgpCJhJyfi4qOi5iNjomCi5eim5CQm4yTkpGTo5mbmYqOi4t9hoGBg3pzf4J/fHJ1i6SHeGtfYG5mV2SGY04/Z5NMRWJ5V2JYUmVUTVZVVlRPXF1hVUtOaFZWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZWWi4wSmdBQTw8Qis6Sk9eNESGPUdGRJeTsKajq7GYq6qttqy2sqymrKqpvMDAt7iyu7Wlsq/DycvRv8C7ub++wbjBucDErLG0sbO6v72ysK6sqquotqmmrq+qubCosrKvs623qri4prS2q6ylqaqco56zs6mopLS0oLeuoKqoqqirp6CrrKm5taqqqamiqqCtm5KqoZ2gpaKmo6qfnae0r6mnq6OjmKWnp6qcoqSjoJmYoJGOj5iNfoeNh4SdnYaDiYmOjY6LgoWUopqNjZqRkpGPk5+XmJaMioN/dIaBf4B4dIJ+eHZ9gIedj29yZ2Zwd1xgcodqT16ZVkhueVVkVlFjT01WVFVQT1hbYlVIT2lUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDyWjrGipquvmqylrbC0tbCsprCqqLq+u8CwrbmuobavyMfI0cC+vbu7wb26wr++v62xsbG1vLvCsbGzqrOppLSopa2zs7mwo664srCzu6y6sKqutqyqn6qsn6Ogtq2poZ+ws6K1qp6op6mjqqGirK2ova+srq2iqKifrJmQsKGYoqGoqJ+onJmqsaqjoK6ioZSjo6OnmJqopZiXmJ6PioeUiH2NhoSEo5aEgYGKho6MkIODk5+WiJGckJORjZGclJePioaGd3SBf3x1eHl/eXJyeGZ/hqR2aV9kaYB0ZoiLfFNYb15KeHNTZFNRXk1NUlpmTk1WWWRYR1JoUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUA0kZCzoaWnraSnpK2ntbOyq6Wxp6q4vsC7r6e5qqavscnHyNHDvL++uL2+vMi6wLevr7Oxubu4wLKyuqy4rKK0p6issra5s6iovbaut76wvqetrLWsrZypr6Ogpa2rqJyeq7OltKiaq6epo6ido6moqb6rtLCunaqkoa+cm7OjlqScpaagpZybqaumn5yropyTnKKlnpiXqKmSmJqUkIqCj4V+j4OAiJ2PhX59i4eRjY+Df5Oak4WToYyUkYuRm5KVh4l+f3J7en58aHh8eXNub3tmhHiEiWRhZ2ByhHpsZnhdXlQ/V3ttVGJQUVhLTE5ydV1IWltnWUVVZVBEPkpPRENBOUhHS1M/amJKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmJBSjdHU2BVKj05RFc9KpCVspqgoKqmpaGrpbizs6apsaasuMG9ta+iuK2oqLDCycnMwba9wLS3v7rItcK0srK0sby4ub21rbm1vq2gs6erq7C2uLWsn769qrPBtLyhr7O1qqyfrbCjnKapqqSem6Wwp7Cgn6upp6GpnKSooa28qK6xrqGro6Svnp+tppefm6GknZ+cmqSro5ybpaWWl5Wgo5ebl6WsjJ6RkZGLgoqAgI6Ae5mUjIh7fYuGj42LiYSSmJCGlKOJk5KHkZqQk4GIfXlrfnZ5eGN8enBub3F2Z39zaYRoZWdebHONbGBpb2BvPVp5bFVeTlBRSklNVFpXTV1ebFdEV19PXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPikdNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTRTPWVfREw2S1ZkTyo7MU5XPSOUma2aoZiopaSgqKS4sK+kr7Cpq7jBubKtn7mvq6i0usjLyL+2wr6vtL23xLbCsa25sbPAtLq9t6i5uL2qo7Soqaqxrrmxq5y8vaWwwba3oq+2taemp7Czn56kpqiipZmfrKipnqCrrqagppijqKCxuZ+jsa+hrKGtpJynpqmampufpZadnZueqqeXnKGqk5mUmZ+TmZahqZGaiY6QhnyHfoKNfXygjI2IeIKLhImLi4WHk5qOiZWeiJGVgouWjZF8hXxzcH1xdHRgenhobW9vbWh9cWJ7bWllYlxkhH5eWXNqcUpJf2lYWk1QTEpIUFJRSU9dX25TRFhaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQiosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPi9XVTUol56nmp2XraGhoaWhuKuypbS0qai5xLWyrZ+3ra6tsLTGyMC2vsG5sLS8tr67vq+qvbC0v7C8w7mou7q3p6e1qaissa20saicv7imrr23sp+xt7CppaevsZuhpKClpaCXm7CnoZ6jqK+hn6GTpKSit7ChprGrn6yjr5icqqSpn5eanqWUm52bnqermpyeppeWmJaejpOXoqiikImLj4Z6hH6EinqPlomNhniBh4OHi42FjZOYjY+WmYqPl36Gl4yPeYF6cHJ3b290X3l3ZGpramdngmxlcmtrZGdXYXJ/XllrdWlZRX1eW1hPT0tISFJVRzI6X15tUERXVVllTUhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEhCZltIVENUXWhFLjsxXlEsMpako5iWnaqepqGjobiqsKG7uKWsvcSyr66ita+tra+0xMS9s766t7Czubi6uLqtrb+ztLiuv8G3q726tKWis6uoqrOsrrKkncO3pqq4t6yfsryqp6Wor6uZo6ecpaaUmKGzppmepampnKGflKWfpLmopKetpp6loamTn6mhoaGZm56hk5udl6GjrJycm6OWk5WWm46Tk6OnpJCIio6GeYR8hYZ9nI2JioZ4gIOHiIeRhZSTkoyRlZSNjpR7g5ePind/fGx1cm1sc2J5dGdmaWZjbYRmZ2hkZmdoXWRiaWVaZXpiYFBzVFtbU0tJR0lPU0AgKmpeakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3N2FMJzKfpKWTj6annJ+enqS2raiqurenrMPAtq+sorWup6+vt8HAvbHBt7Cusra1ubi1rKq8s6+ysb3At668vLGkn7aspqa1qquvoaDFrKqosrWsrbW6nqiqq7GlmJ2qnqelkpmlraOYnaSqoZuhnJegnae2pa+qraGhnp2ilaCmn6KgmZybnJOanpWmn66jmJiflpWOlZiMj5iap6CQh4qKiHiFd4KCgpyHioKIe36FiIaEkISWlY+PkJGQkY2Se4OVjoVzf31neXBsa2xndXNrYWdjYnN/YWNlZmVoaGFlblldWFxsY2FMZ1dbYFZJR0hLTVJYPjlgbGlIQlVTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLC9BKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BiRiU1naShko2uoZqZoJeltLKjsr63obHGvLmwsKO2rKuvqbm+vbutwLKvr662rrO5sqerubGvrrO2u7avub6spZ61q6CisqWrsJ+mxaGzprCzsLeutZ6sr6yuopmdp6qlnpWbp6agmaWjqZyan5uVnZ2tsKa5p66ioZqanpmfo5qlnZefmJuVmqGTqpetqZyVnp2UjZWajpWUmKenjYyKiY57gXSCgouYhYZ8iIiEhYqMiJKFlJySkZCQkZePkH+BjY6Cb4J/Z3luaGxqZ3Fya1toY2Fyf2BkZ2pua2VpZWNsXGxsdXBhU2JoY2VaSUdMTU9ZUVBVYWWBVEBWUlpURkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy40PDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFIYkInNJSjnI+PsZ2clKGbqbOwn7jAtqC0wru9ubGmtrCprqW4uri4rLuwraurt6q1ua2ksrWxr6mxtraxs7a7p6mgtqqeoKqjqq6drMSZr6awsbe2rayesa2vqqKbnaSsqZuVnKaknZqqo6WWmqCckpyjq6qpup6mpKCXmpqeoY9ro5aZnXGDl5ylgXaSrKmflpeikoqYmYCXip+OeIWSjYNtaX53hHFshoqGfYSKhm9dZGBnhJiGa4uQlJJ1eIuEf4OQf2aIgGh2aWZYXGl0bk5QamNmcYNmXWRmbmtoXVtdiZCFh2hOS0M4RVRnXkpIUFBVVktIUmFwdGVGW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTltLW2ZiPkcxTmE8Ky+OpJqIlrKbnZShnKqurKO9xa+pt8K4vrytp7expqukuLSzs7C5rqqnrLSlsbWip7i2tainrbazrrSutKKpn7SrnqOlnaeom7C/lainsbS5ra6kqK2rq6Whn5yhqKebmKGlppycp6idk56gmZCfqKqjtK+joqOclpiZl6OIoY+SmoihiJWfon+lgKitn5SUnpSJhHJ4jI6DiKB1h41pl4lmfnN4oG+Hh4R+jHx/oaCfmX98iJ50iI52m4psh4KDbWhkZHttcmJUhm1jbWmYcVhpcG6GV11oWmtqWohwbHlyh2iHhFleRk4+Rl5NRVJWVlFQUldUZ15MWkxSUlBFRkc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOi8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05bTFtnXz1LMVReNy8ojaeYhJ2snZqanZ+rqqiqvsOusrq8t8G/qqS4saqsprO1rq+ztquppbGtpbazm6y1trSmp6izsa2yqK6eq6GzqqClpZuipZ6xuJWmp6e3vqasp6mqrKeloZ+ZoaijmZmno6SYnKWqlpOjnJSTpKamobako5+jmJWUmJSciK6QmJWKqoyZo52GsYGlrp+Vm6GXeoLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7F5aGxYsa5vZWm8krxuaHptcY/YfVJrYrayfX9wlHWaoaqQVk5YYU9WTkZVXFhQUFOLW1dbUEBcRFBOQ0ZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01dZ1w+TDFaWzQxIY+nlIGoqp+YnZ6lrbKqsMK9srXAtbi/wqumtK6uqaiwtaqvtrSoqKa1pai5rpyysraqpaSnsq+usaarnqels6WioqCXnKKgsq+Wn6Shtbqjqqihra2kop2amqOpoJicqaCfl56oqJGcp5uUnqKno6Gwo56fo5aXk5iSmYWva2qLjqp/aIWWh61mcZ+elZupl3GuoaR+d7p8a6CPdrFfarRbpYBlnJBgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZGUY21tp25chKBFaWeHlkV1nGB9ZnujpoFYX4uraH2PeHpqqDhKr1tYVG1jWktPWF9cVlY7TodQV1YvSVNTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMvLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlgzMRuSopWDraemn6Olq7K4rbS9vrC3xbK4u8OnqbCssKmqsa+ksLqwpaWvs6OquamdsrKwo6Whqq2wrK+mqKCjorGcpJ6ZlpmdnrCpmJyioLWzoauboa2tn52Zl6GjqZ2ZnqWgnJmhp6SQnaOal6GgrJ+mpqCan6GWlZGXkZqGtZu1eYapmraZd4ezm7d/lJeYrJd/a4GmeoGFhpGUknerZ2qxW6x7joeUdIlwjoaAf4iQl3iDgoqXjIOgj4WwdnefcWtrbXyLT6VYSGNjmX5jaKVfeXF1UpKGXVCpbmNwe4WAYZ0vUqJuW1RrZ2BMS1xkWFxaQj6wd1dYQSNNaUZCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWFUNTAcl6CUibOmpqGuqaizrKq7tsKwvMOtubfCq62tr6+or7Oqoq+8q6Kotq2krLWkpbKzqKOinaeqs6mwqKafoKCwl6CblpaXm6CwpJybpKi1r6Goj6mnqpudlpihpqman52joJygo6WjlpuemJqeo6ucppqcmqKglpOSlJOdhNWTmblxscJ/xod91pScu32cl6iSjp2NpHuNhqKBpYJ5q3mPnVave4l+n2q5Wrl3hoR9poKUfJl6qnmOnZB7sW2OhHSQu4ZvlVCvp8WKUaB6Y2CqYnNyhmuWh15StbTIhX6IfGOkM0KddV1QamhkUEBYZllkYUpHTGpKWlNPWWZaQ0M/RT8wPDw1OTw3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3SDphUDcyJZyjk5mxqKmls6qltaikvLfBsLrAsre1vbS2qLKxpLKzp6CvtqmbqLqupLCxobK0saGknp6oqbGptKmmnJ6frJiZmZiYlpijrp+cl6itsamjno+soqeVnZecoaahmKKhoqGboqKonJ+gnpSZm6ehnKeVm5ufoJiQkpWQnYiybmi1cqyIcI+ncrR1dLZ7nJmmjpCdjaN+j56jfrB1gpDS0nVcrnyFf6Rum6qmaoaFfa19mJmQe7Fzk52PebNllnSFnm6fZpRSyYtawlyfeWJfrV92c4VhlohdWcqdb8CAdE1LtVNVxmRVUWpjZVhBT2pfbGlQVUZIOT1XUltWWUhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQU5UX2VQNUc9YU02Mi6jnpGlr62lqbutprWlp7a7vLK7v7i3tby8tKa1taOzsqOgrLClmKe7rqWysZ20uKqgpZ2hqqWyqKyqpZqdm6qflpaZmZOUpKuimJOmq7GmoZWSq5+lkpShnKWnoJWbpqeim6Ofrpqgnp6Qlpyjn52llJ2VmaKelZmWk5uFrHx4qHejj4uHqnCui4SohJqao4uTmouifZKXh66Ef4GzXHKyU699goKjfnHXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1ednaGZ5eIal2vd5Wfj3dsNXnIrrNfQ1RvXmdgRVBsX3BtVlVNLmVjaFJZUDtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQmBJOjc3oJ2UoLexmbPBraiyp6qyuri0ub65uLO3vramubWhtq6goKmsn5WotqyosbKrrbSkm6mgoKiitaemqqSanpalopSUnZqSlqSonJSQp62wpaCUmaifoo+RopqppqGVmqapnp2kn62doJ2gjZSfnJ+hmZiclpehoJSYkaeeh6l+f6Z5oY+QhKpwrY2Dp4aXoaOKmJeIo4GQhpSqen+LnXlwsVqog4KIoHh02H92h3SngY6bjZKkfJWQn4R7sl6cZKB9gpVuk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmRPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpFYSEU9R0VBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8T2VkQSZVZls/MVRfYkw3RkhfQzE9N6Kdmpq+rZizwa6rrKimtLC4sbW/ubqzsrm8qru2obKln6anp56Tq7KpsKq2raqvoZiioKakpLqjo6yhl5ySo6CWlZ+blZmhoZGOjKmwsKadlpqnpp+NkqSYqKuolZipqJ+foKSto6CeoY6VoZmgoJKcl5yVnaGVl4+snI+ubnK0dKmMd4umdLR6dbSClKekk52NiaSHjnW4bot7i6Jra7ZaoYZll5dooKKnbZRytHOTmX+zaoWSiK1qdbRhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZvXK9WPJx3ZVRvbi5bp09iUmtlYmxZYlxgcHxjU1lRPj9sbzJCQkA+TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQTilmpyeuqOcscCurqurp7epuK+1wbW9srG7uKzCt6qsoZ2npKKdkqurqLajs6iuqqGXnaigpau4naOunJaZkKajl46eoZyZnp+Rk5WrtrCmmJObrKmWjJOmmqWto5GXq7KkoJ6orLCYoaKQmaGXoJuWm5ehk5ypnZSQq5mH1JSau3WxxIDEh37Wl5y4eYqSmY6Yioynh3mitnV9d3bCgpqyYYO6ecB8dbhitYGMh6l9loKsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eIGKbZqIcG2NpHS9XXd9W2F5vGpaVltpeV5pYGRmYm15b1hbWUNBQHE/Q0crNEgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvVF5gSzU8TFstNkA5p5qforyjl7DDr62qqqyxqLmvt8Wxu7OvvLCuwbKtpqOfpKKcnJGrpaqypbWnraSflpqrmaetuJ2jrpmVoZCmoJOOnaOfmZ+akJaTr7mxq5WWo6emlJCWpZ2krZ+RoKirn5yfqaSynaKkjqahlaGZm5aVpJmQsKCSlaqfhZCZtoCSko24lniDk5u2d25sb3RveY+EjolynsC7vJp7gbKocIB0kbmDfIaGioeNe4uGjZd9pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnF3toxef3l9iGeDeWx5YouscHSFflhbp2lEZFlUZl9jXWNRZ2ZxbXVCTU9MRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppWywrOrqqisq6q7r7HGr7W0sLintbmuq6Sip5+gnZmUraWuqqe2qKifnJahpJ6spb6noaqXlZyRopuSkKKoopOel5KYlLK1tqyYnaOkoouTkqacpqudlqmlppyboamnp6KooJGsnpeinpeWmJ2ej7CplJynoo9rf2qcqXmJdH+bj3Z7Zoh7vb7Aum+Sg3GUhV9yalpem4lhY4ePlmxgf5RjbZx2YpVrgJqVlGVeYGNxmolocox8hpRman5wdHh+fWJbeHSBaFBcboR8fItqV2x6gXJJSm+FcE5yTURWXGZgTFpXZmNfT1ptdmpyUk9ERE08SEk8TD4yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1Q0ZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5cTyc/Mj6on6ihwaSZtLm2o6ymrqeotbKsyKywtK22pL6ys6ihpKqeo5yamqynrqSltaqkm5iVopynram+qKmllZSblqCak5mmqaiRn5CPmJywsr6smqadp6KJk5Kpm6iknJysn6OanKOnraKfqaGZrpuUpqCXlJ6fnZixpZmiqJmdkp+dpKabqKSbnZqcm5GXgmhufXJ3kZeUkISJtKqNhZiVj4qMmJeIlJWJg5OTkImNkpSZk5mXmp+hmpuUn5uNgnqkhWxpe5B9gHWJi4Jygnh5dnaKgHyJanOBdIN1ZHd9dmtveWxfYltvZ01YWWZqX1dZcHpvbWZTT0ZTOVBaTlJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Cxt6CqprOnpbC1qsmrrbKmtabAqbShn6WmnKWWlqGrp62jpLesoJmXlqCYraqmwZ+spJaSnJefmJSVo5+eo6iTkJioqLLDr5mqnKqej5aWqZ6rnJ6hrZihm52ipa+moaSnnqyYlqWdmZmhnp6dsKGdoqeWmZSalKGjl6SgmaGOl5WLi46QmK6PfJWbgpGBiamohYCYlouEjp+Ie4SRhoWakYeGipWPm5eOkJieo5aZkpCcjX+NZaGzroSJhHd7kIp+d3l6b2d5kYGBiWt1gXmIcmhzf3l1g4aBanRieGVfaGRjZGZqWGt7cWprXFNMUERfVUZAPj8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLOgua++raqtsbKgqqayraKss7DFsKutpLOvvKS0nKGoo6GempeopqmmpKaztZ6VlZ6amrCmrr6hrKKRkZ6ampSSlqKcl6mdhJ2pq6O0x7OfqaOqlpaYmqeeqZygpauUn5+dn6quqKSiq6Crmp6foZiknpyfnbCkmZ+plJmZnpOmm5mqn5yXZoSTfWV/j5uQY3mMbGhqepCjq2plmph+Z4WLZWVpaHqNoo5raIyYkaN4a2qLmaOfmHNsbnqEjIZ5WGVdhYFebIuKgndcZ3N3d5KAiIJvd4J4f3NteYRzdoiHjYJ6aIRYXWpzZF1ziGlrfHFtY11RTlZJZFhASTM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXV9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0ouNlpPNilFWS9ETzFZQjs/Lj2knrq9ua+rs7CrpaitrrCmrq6wvbGqqKWusLCgrZehpJ6impqnrJytpKaoqbOunpakkKOwpra5pa6jj4+aopqTkpugmZmmlnukq6KotMO3paGmr56dlZ6jnqOdpKqokp+hnqCqr6qpoqqeppulnqegq5ahnKWxpJedrJain5uUppmgrJmffr2EiXO0c4Wfhq1od7nEuHGSoaN6ppiZdKuCfcvAwLpxi6OHg559lpiInsC9gpadnY2cwcF8gXqRjJrCwH1qpbJvjYFvynp/m3iShI+AdnmBgHlxe4CGcHeFi5J4bHWRYmVed2NfZYBiXnRobWRiWEtVSVFZSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX2BhX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SVtMKiNDUC8jRlszUFkvVUFCOy84laK5w7Svr7+pqZSjsKmwr62msravqqanprGroKuYm6OgnJuqp6KdrKOlqKWltKSeo5Omrq24tKevopKRmZ2mk5GgoZiboJ6Ipqukq62/v7GgqK+plpGfnaKZo6Sqo5OgoZ6drK6oqqWjoaSfo6ScramRpJuprqqcnqudrqOXmKaXoqSYnX/OlHp7pYJ6lpebX62PXY6ogKGhfKeVm3Wrg4GvXmSMqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3R8loe4YYKtWaPNbpB2e9t7f5lxfoiTdn9le4h1dmx+h219hY+QfWuAjF9wam9mYF94ZFtxaGpkZmBSVFNXXkpPQzVBSEVEOD41O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcX19fXl1dX2BgX19dW1dPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMazBwL+0tLC3mJ6Ro6qprbWsprKtrKykrKawqqGnnJqmmJyir5+hn6ino6ahn7Csm56Wpq6tsauorKCUkpufpZOQn6WXnaijnq2jqrCov8Wyp6mxrZaSnpyil6Gqqp+VoZ6dnK2upqmom6WloqCqkqyzlqWiqqqepKenorKik5unnKGclpWRl6FyhoyYdoaoh3GxfJ1xrH2goIGlj554q4J+rX+dcq1/rIeGn3aYknt8l36qiKKMkYucfat6iJKPn396rVacxHuQcJPBfYGVbXVwjG1md2WGb2F4bnJuiImPjoNsj41jbXN1b2BmbWRfb2lqbmZjV1NcYFpSUkM5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv08bHsrOfnaOPo6Kira+3r6mxp6iqqK6rq6eipJ2ao5WfpqugoqagqKijn56wrZiblqinr62op6mel5WapKKSlKGtmp2no6+soqy1qbnMsaymrauWlJydopmfrqydlqGZnp6psaeoqJuqp6OhqpqvsaKoq66mmqerq6uzpJOYpKeclpOFpGukdYp6qXV7snGCpYqYjHCIoJuHpF9hUquFgK6DnHWugqiGhp96mZeGe2aAo4qkmIaBo32pf4GUhq5ee6hVnaKSgXujn4B8xLDFjHOvtLO5cmKpr8J1aIuLlo2Aa5eQbWt4eHdua2ZkZHFxZntpY1xWX2lYWFRMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAnJyErLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C0sLCpraOnp6qrq6ikpqCbpZ+dpqempJ2smqKsoaOfr6Oem5OqpLWwr6Gpm5yWlaekkZuiqJ+gppywpaKosay2x7G0qKuplZGdnaKZoKWznZqhlJyep6qqoq2aqqagoamisqyhqrOyopyrqbGwuKWUl6Wpmp2Tfaptn4SIdqt5fLBugqSLiZ+WlZ6WgdK4tLjJgYKyX2GUqYOliIegepiWmnmqyXSao5SoqZCSmox+momaxsZ3ZaGCpXOBn46Cfa9fb7VjsXVLo4Ztp0eDk2SOj5uRe2+Uj3xteXR8em1bZWpycWaAaV5hWGNtXF5ZSUxMSkVEQkE9QTxBP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwMa5ramyrq2mop2zuayroaWbqKaqrKmmoKalmKujn6+snaahrZqfqaWdp7Wgo5iUqKu2s6ycppyglpCmrZKanKejoKqnrqGjp6mws8Gxsqmsp5SJmJ2lm6Kkr6aXopWYnKWlqZmunKulpJ2ro7asobG5sJ6csKi0tLWmlpmppZyhkIOeTneagoCfeoSjfIKkhIamn5yflIS4fHx6uYJ/zMbDtnebopGLn36Zl5eKdp+XiqSYpKh+r4Wbg56ErH2ZlGGlbKNwj4WQgX2WhHKsYKRzcYCaYbx9UlV1jZGhlXp8kI6HcnlyhH5vW2xud3JqgW5aY19obmJkXUxMUVNBSEdGSDo6Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuirLO1pp+hlaWvrq6op56lpZqkp6GzrqKpp7OgmqmklKO1o6OVl6GptbmknKOdo5OQorKZnpumpaGir62cpKiitbHDsK2prKmRhpGcp52jpJyll56YmJmlo6eYraGroqSXrqW7rKK3tq6enra0urO1qJqgsaOmoIiQ0rXDt3qHjoWRk4+ApniUoneMoZKFpYOLcquHhrRucmmZpJ2ViZ99l5mHh5BzroKlm6ONpoqTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicnJ+n2Jzsrhod46SpJd8iYqPiHV7eI2BbGh3aXhzbn90XGRkbW1maGBKWldYPEhGP1MzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq6/v7y7tZ6XqKSutqKimZWjqqetqaqZpaKfpqCgtaaiqaexpJSro4+kraSdkJqaqrS0pJ2lnKmSlJevoKCepqOcp5y1maCqo7Wqwq+oqqihjISPnKKhpqOVmpqcmJqYpqOll6mnq6Cjm6ymvKyVvbCtn6Oxtbuttqmeq7Smqpp8qJF9fLB4i4CkpYicbbJvoYetfKKPg6iXmoGsiYathaCUqKCjl4WfgZmWgXuSfquBnZmWi6t3naCPiJOSf3mvXaOBfKanZJ6AfJd1aq5dpWxyhZldYFuMoG2Uj6SXgZKKk4h3eYGWfmlsfmJ9dG1/eV9nZXBvZ2doQllfWj1KUzJTOEFBQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTgxNTIuKixBVFZWVlVUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiMoKLySm4SpxsO3wbSfmq2grrmmo46ao6Sgr66pn6Oena2Ynrmgo6uhsKqarqGRqqmlloqakK2xrKegqJutmJmPraKhnqWhmaScrZefqKW2qL6upKmjn4yAjpuboKaekpSZm5SZmaWjopinq6qhop6op7ykl8Otq6OirbS8rbCpo7axq62ad69+kYuchYd8uq2JmGSwjGWWrn2hkISnl5yCrYuFsIanmqSiopGFoFxsa4KzYH+tfHuCgbJsZm6Zl4uIsVp9tFukg2vIomafgXy7WXa1WrJ9U6+BeqxYgKFtl42mmIiUjZKTeHeMm31jc3xig3d0gHxhamZvbWZlZU9VY1xBVF09SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXV1hXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt767tMGzo5ytpqW3qaCLmaCfnbKxqJ6in521mKCzqKqrnrCtnqycla6ooo6Jm46vrKmno6iarpOaj6maoZ2ln5mjoqWYnqKosai7rqSonp2PfYublqGgmZCRmpyRmZeonp+Xp62lo6SipKm6nqDGp6apoay2t66wqaG/sLCwmIKqkqOvjpuAhqSXmJCAgLjDuoSPnZOFqJmdg6yLg6+KqJybpquRftW9wqpipL+9fX+jgoPXure1hJSSgp69voRqo4Fvq4RunX96srHHg2ursb2seXiivrt0gJWMpJmNmI2TmXd/j5l5Ynx5ZIxmeIF7YGtlampiUGJbU2lcQFRgQkwpPDo0Lx8fJB4lMiAcJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLHAubK9s6Kdrqems6adjJelv6m2r6ehv6amsZuesZy5qJ+ur6WnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6adp5uaoKiimJ2gq6ypuKyno5qXk3uImZKmm5OPkJiZjpeTqJielqionqimoKKqup6pxaOhsKSstLassqyjv6uyspx1dqqlt4VliqBwZ6yQio9ubnelkJuggnaxm5dwkY5yl6mkm5ivpHJsbW1mi3hvbYOZcYF6aXBpZ4mWlZdxaGmFhmdxhmRdimNpb1pdZ354pmBicpCTcGZkgI2SjaCVlZeNkpp6hY2TdGSGd2eManh+eWRsY2ZsYkplV0prWTpQZERQJ0o5KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurmytKqpoq6fpLOqmZK9scPHvLSpnr+rrKOgp6uguqOkrqytpo6WraqQjIWVlq2fpqqin6SjoJGLpZKmmamZlqOpoJacpaWmrrmqrJmak5J7hJeOppeOkZCXlI2XlKaTnZanopmvpZ2iq7mfsMGopbSnrbGzrLCuqrynsbuYjKKppraciZejmIapm5CUnZKqtJqcpK2itJiko5+io56ipaKWrKeMkpONh5OdnZWQmZOYkI2VhH+kmpeVjouTkoqQh4R+Z4yBdIN3dIeMcadtfZaTlJSBgY+Pjo2bkZ2TlJOdgIWSi3Boj3ZviXd2fHlpbGVkb2NVYVhAaVpHYl9NWCtFPSsmITY0MC8fHCAlMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW3r66isKWtoKC2sZGOqsS8w7m2qaGknZulnbCopLennam1p6iRmKyji4iJj5ynlq2koZqonp+TlaSXqJqpmZSmoKOPmqeYoLS5p6qYmpCNfIGVjKGUi5WRlZCPkpekjp2YqJ6atKOcpqu3qK/Cr6S4p7Cwsq+rrLa9o7LAmpOnpKa1opKdp5+NqZ+Nkp+irbGboqSzq7OapqOepqygn56dl62ek5qinJSQl6uZjZiZl5CWnpGHoJ6UlIaTjI+NlYyBf2aNiHWId3qJhHScaoiSlpWSiX2MlpGQlpCekJmSnYGGloV4cZRyeYl/cXt+am9kX3BpYFxfWW1iUGBiT1g5RkZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJakqKOws6yuo6mnraCotaqQj5ujsrmtqquhopl6nKGwpKaxqZecuKajlJipnI6GiombopCvnqSWqKChkpeZnK6Lq5aPqJmnjJiojp24taOlmJuNiXmClIybk4qVkZOQjZGWoYucnaecnbeif4OutaKwsHWkv6SzoXl7oq21v5d4sKahioCqf2RcYnegjqSeg5Z+bZS1naSpsKylZqChlHR6m5hwgZmqmWx/pKmKZZylnJGXmJeLkpuQhJ2bkJSDk4eOjpKKhXhrkIh2h3F8hoGBYWmJjJWTjFt2lZFnZ46McXmhlZVkeJeFgHaXaIKJgm55f2twZV92b2trZ1xlY2FhbVFZPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0dJS0xUVVVZXWBoZmdYUUk8REc8OVVSW2BhYmBeX19gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6qlqa6jp62lkpWqtK6wpZmppaqXc4ucr6Coq6eUl7mgoI+cpJ6RfoiImp6NrJqklaeino6Xkp6Fda6PiKaaqJGWo4ibubOnoJiYi4l1d5ONlpOKk5CQlIyPk5+NmZ6lmJuxlYCMm7WdtIySj72oon6no3ulsbqDjo+on4SMho+xqa+MipaimnmAi6yGnZ6jqaupiZaHmnemnHuInIGYp4OBe52ze4qGoJiZlJiWgZCWloOZmmJ5iJGEjo+Si4RucZCIeoJxgYGGgId0iIWXk3iWaJN0oJpze5mCnJmEmH6RiIGCmGmMjIRqeHtxcGdleG5pbGpcZGlpZHFaXEdTS1FARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWlmWVFIOURMPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKSfpq6uq6itoKmxp6eqpZmTrMS8r6CUpae0nY+DnKycp6KgjZC+npmNn5qhkX2Gj5iXiKydo5ahoZKNlImGgJGojoeinKOTlp2Gnrmxp52ako6FcHWQiZWQipSPjpuLjpGekJWeo5Sdq4eftIm0mq6Lyoirr4q3hY2whLOyhqmOqZmNnXyoj3J7d5yOppZolaR5tIyhoKiqk5nCgoCriZmhcp6Am6V9l4WVs4GhfaGTn4+YmICOlJyJmJKLfIWUho2Vk4qEbnSShoB7c4eBhH2FdYaDmIGPxWaAqYePomqdgZ6XgJmAioyDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZqV2RFXFBMMkU0Nk1gYzcmMzxFR0Q6NjM2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBJZFhdY2ZoZ2JiYmJjY19fYmFiY2NjZGlpY2JiYmVjYWZjYmJplZejoLCpqaimrKClubGqq6aalJ6hpKmhlKOptaKvf6CnnaWenYmUvZqTjaCSnZB5g5aVkYirmZybmqKFj4x2m5uOoJGInqOblpiXhqK4rKWZm4yMf2Jtj4uTkI2Pi4yXi4+Rno2SnqCYoKd+oaeHrZ2glq6QoJ6dkYeCoY2tsoikjqybjJp+onaAmZRrgat1Tat4h42dk5yqqYKqq36EoXx7p2qegJNsZ5eGmLeJnn5uYGNYg5d/jXtkZ4tzmX15l2xcfJduYFNxhVxgbXqEYFllgn6FgZlxqKtrg6NucqVvn4KcZ2SebFpsiHplWV+CfmFXUG92ZW50cWpqb11pb2xqZ1dmTVxXRTlBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJLTUJKW11fV15fY3VgTUU6TU5NVGJcW2ZmaWliYmRiZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiXnqC5oaqkpqySora9q6+imZaeoKWrq5+crbShp5Ggn6CnnJmOmbSZkIuejJWLdYGUkY2KppaWmJ6ffpOFhayjh5yRipiomJmZkYelr6ailZmHiYBpboiIi46OiYqNkYuPkaGLkp2fmqGlf5OBj6OhlKB3nJaQp4OjqYCGrLCHpXqMfoSafaJwc5OHlXuejHlth5yMmpKcqpyPh519g6J0d6Znnn53pV6Ye32Tc6JumLe0unOTiIGAtqhkgca4fHGVtoxxgJujY3Ssq2F+ap2zfm5+iIOPg4yYcYCjbHKjcp6CfqNenJmzlm97l56zdHJbnrKCaWJwdHVxaG9YamtxcGRbZlxhS0Q9RDVRQVlwMjxSR19KUj08Mzk1Ojo2Qzw7QElQP1ROTlFARV9eW1lYYGB7ZElDOExXVVZjYVpmZmtrYmJlYWRjYGFiYGRjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4tq2toJqhm6KjpKyamrGsq5KXoJmhpZmalJ6sm4uJkXiLhXGAlo2Kj6GQk5Sdl32Rio6ooIaYj4qSopObmoyKqKekno+Wh4R+a3uHf32PjYOLkJCJjpOfgZWbn5ugn4uJd5yYoo2gcqGMiamJnaiRmKquga6MfnqgmXmjk3iAc5eIjJx9lZ+Hm46anaiIo2ShfoqWkJuNbZ5om45vmpl7gIqnfXJodKqDnoNzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMX6d2d4qKgJ1omnWHk5KYjX6ebZmQaqaZXKh+d7tqfalajoRds2dcbnF4d2tpW3Bpd3dhXmNWYUFQRU83VkJSbTRKWlpeTlpEQDE1MTs7N0g/OkNIVT9ZU1hdPkRiXVZgUWFjfGlFQjlOW11YZGZYZmZubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplp2JqracqIljlZysu7KwrJ2lm5qnn52smZ2wp6qdl6OaoqCZlpago5mGiY1piIBye5eHjJaWhJKUmI96i4SWpJyJlZCGi52RnJuIj6ihn5qLkIqAgGmBhnl/l4x7iI2Oh46VmX2SoZ6goZOYcmifiqCPjHCSjYOpiZqhpaqjqn6wraSiuJd2o7Oio3+IlHideqqZf6KPn52ZiZhyoX2HjbC1fWyakaF4fpm1o6OrqISZfJp8nJp/dKpaXW97l4x4nmJNf3t7hWR6mEJNn1mianN8jm+CioSZdpt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfX1uZV9rZ3V6YmJeT11WXFRWQFlFUGZEUlZcYVheSUQ9Qjg/QTpIRThMRVhBV1JaVkVGYVxaYEtgbX1xRUM8VV5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWR2bF5lZ2ZsZGVsaGhsaZSdgbGumoRTX6GntLqzs6maoouaqZubp5Kgq6Ogp4+enZ2amZWYoZ2Wh4eJd4WBbnmVhJCbi32Rk5aIcoGJkqGbcpKQgYiYlJ+ahI6om5mVioqKfINshIVxgqGMeISMiIaRmJR7kaKfnqOIroZ9tYSPnp17ppZ6qYKXnpGMo6B/p2h4bn6Zc6BzcXydhZhvk4KtfKSEp5+bg6RwXqlodqNkcKZhndOPfHuZeHJzY6KGkH6icqOQdmuQs4tggpiKdKqyqLx/d4Nuf7+mqrRenG9/cpdwgnOicl6kZ3SmYGimbJrTmHqCm252eZdrm3l2l3JsqaVnX2R5cX+EbGhmY211dmZeYFFaZVBRYUhWSVRfV1NbZGpbZVBFQ0tMSktBSkQ4UEBQTVhTWE9TUWBlZWlTZHh5d0lGRWNdZVpoaVNpaGpuY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGZobGiYm3+xrFRdS3+qsLK1sLOinJiEl6agoKKMpKeflqiJmZiZlJmTkqCXjoiFe3B9hGh8j4OTmoJ3kY6PinCAho+TkmyYlHyIkZKjlYONqZmTkoqEiXmDdoiAboGfhneAkYWHmKCVeZKho5mfibOhoraLeqynpK6lcKmAm5GGgZ6UfqWBo5qGmHGehKOtr4mXi3+MpI2Vg6+jlXe1trbJonOUjIOfYJ6XqW15loegm3Whh3igfpCWi4FvTWajknGaiHOle3p1YoOCbX6gbHJkYJxzf3SXa3tqtLa0xqZzmH15nGqamqt0gZpsc3eXaZl5dJdxUER9s15qdWt4hmZrZmJzdG9sVVtSWGdPUmdJVUxYUlVcZ2tuVWdXTUpBSk1LR0pOQVFKUGRjam1ldXNzfnh7bnWJentUUU5tXmhca2lSamhpbGdtZ2NlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlop2JsKiFZUCUorKsr6+1oaKPf5anoaGji6SmnJulgpmXl46XkJCbk46Ig3lreYZlg4x/lp95dY+IjIJqhYWShIuFnY16jIqVpZKCl6iWi5GLgIl6gH2LeXCPoIV5gZSGiJWelH6TpKablZaDZ254nGyiZHxypXicmHBop4KZjn2le6GXg5Zyn3aBiZSVj7ltj4qiYn2Zo5eJbnNrq2t1oG5vpmCbaYuQaZaHm5V1ooF+mmCLho11b4hiaKFmnn9qm3VwZGeIgm9yoltfW2Shbl6IjHF8gHRyZKVueKJjZqdnl3KLl22hb1KIj26gXmSnVItdVJhtbXJrcYFtcGhrd3NqblFWVVVlWVNsSVhPXEhYaGhyallrVlBSRVZcTVhTYVVoal53dXt8cH18coJ7f3N3joCDd15Rc2FnYnBnUGtoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupamwsaWfi3+WqZydo4uhoZqhooCVmZOOmo+Ll5COinuGcYCIaIuKfJeac3SJfZB8ZYOHlYqJlZqCfIiGlqaPgKGqj4WQioGKfYCAjnNpj6WEfYWSjIeXn42GkamlnYmmeJabfqWJloyymZ6RhK+Xn6V5mIp7qXWokISabqWijJKEjIO8bXylr4KHhoeVl52ifqZ8cqiVoZZon35vrGOWipaTeKhtqqOBiXWIgnerkaaIa5KxbHezjKlsi4Zvb6CekpVif6uMqneBgI6nn3effYWklZ2gaJqHdatmnq2MtnN2voyjk1mDpo2rYXVydG97dXBian1uZ2xSVFhUYGBca0xcUlxJXWxtdl9bcVhbX1pnc2Vtb3FjcXRgd3p+eXJ5g3KDfoF7e42BgoB2YnlkY25zZFJsZ2dvbXJpZmlhX15cYWpibGx7b1xcYmlibWl3bWdsbmKWpqudgYCepJaqqp6op62jmIiBlqmZnaKJmqScqJyEjJqPhpyRhZKNjIx0hXqIg2+NhX6Xk3N0hnKRg25/i5KHhpSQfXuChZekjX+lpI2AjomElHWCh5NubIuogIKLk42Im56Ii5KqoqCPgHSUl4h+gXiUr6R/gpxxj4Z5k46GgXtzqY1yfX16l5abhI14e319iJSVk4t3kZmhooV7f4psjIZcenlzenFpb36TinGAdIKPlJNxhoSCZY1/X4GBjHh2c5R1cHpvb4lvhYZfd2l4jmaCg4aPqpx/dH2WaYmIb351fIN1bWxmjHN4e5d3hFpqV3mPaW53cnFvd3hvXWuFbmhnVlleVlxkamNVYFVeUV9vd3lrandlampqdXxwcXRzYW91YnN7gXh1eYJ1f4B/gXmLhYJ9e22AbWR5bl5XbmdodWt4amlpZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW6qaeLoaKbp6SZpJ2roZ+Dg5aqkJ2fiJmmmqiYgoGci36WlIeOiomMcoJ8jnx+j4R7l450coNwlYZ8fZKLhoaPhnl+gIaYo4x7pp+KhY+PhJWDho6Yd3GEqoWNkZyPh56dhoqaqKCgq4OJjZWbf36Kl62okJOokXhxn5OFfZRwf6uHcX6VcWpvfIGfi3+Rjotobl2EjY2cnaCQc5eNiXJ1bIN2dIBZcm+HkYJ+f4xqXWlke4WEiIBgaXh7nHyEjYN2goeEaXqMiWxicXODd19zjYOKkaiWh2eNjoJsdoqCboOLd21kZWN6gnqVWltpZm12W3t5d3Ruc3KDZlxtiWtrYllYXFlYanFaXmBZXl1lcn16dG90Y2pqaXt8cnp2dGRtdGhse391en17eXl/gH9whomDe31zfnpyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMq7GhkKOhmp+fmJ6ZqKGgfYKWq4yfk4aaoZGklX97mIV8kpmJiIaGinJ8gIt2hYuChJaKcm+Ac5iGhH6Tg4OGioJ6gISKmp+PgaWfhneOl4iVi4ucl4SDeqyBkJeYk4mdnIaHoaqfoqKji4iTm52jmZaroqinoZOciZmRfnqQkIapf4CTkZKTnLGlmpSdj42xkpiEpo6Nlp2hipGdhImTi2x9jnd3ZoOGkYt9iZ6Fh4uPiIiBhYSRd3x7dZukioeLoIyHln+AjYOBd3F1hoR/eImIi5GnkYSHjoeCi4+KeoWJh41/dWqAg3x5mWlxaGBzinB9e3d2b3d0gV1eb4Znbl9eWVpcU2dwVWNbW2FsaHR7e3JucGNqaWh/e214fnBocHBsZoB7coKAd399f4R7bYOMhXx6eXx+eoN4TmR2anNucXtka2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5ejoZiVmZiUmKSgnHp+l6mNnYyFn5yKnZZ8eZWDe46ZiYaDhIZteIB/coCHfoiThG1rfnqXh4SDkH6AhoSHfIeDjZudkoapnoJyio+GkpKLnJF8jXupg42Rl5WOm5aFhZumn6KanYaDkpqZmZCZpqGmnp6Ql4KTjHh9iZCGp3x9j5CRhpiqoZyTnI6NqY2SgJ6NiZSboISPmICIj4RxeYZydWF/hJCHdoyZgYOPgoaFf4aElW56dnWUpIyNhpuGhpB1gYx+fnNzfImFe3mNj4WUqJCHhI+BgomIiHSChoaIeW1qfH97bWhrbGZeeX9ofHt2dHZ1e3dcYHB9bnRgY1pbXlFmbFNkWl1gamh0eX5wbGxjampngH9rcn9ra3Rud26EeW6GgHaCgH2Fd3KDjYd+e3t8gHuCi2Bpe2t1aGqDZGpjYGlcY3Vnb2J1bWxUYnF5ZW95enJlam1ti4qfuJqipJ+TkpaXi5qfnpx6d5ykkJuJhqSTipiZeXqNhXuKkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foWEh3yPgI+bm5CIppt/cIuLjJKGoKGKhYx8p5CHjpGWkpaSd4yjoKGdlpp/gZCamJONmqOipJuYkpyAkId7gYaRiaGBfo2Nj3yXpKCgkpmQj6WMj4GckoqUmZ1/k5N/iI+CdnWCcXdhfoGOhnOKln2IjHGMfoKFho9oeHJ6jpqTkYCYf4mMc4OJfX1yenyNhnx7k46El6aUjYaQe4SFhoRzf4CEhXhkcHp+eHlwa2pmXn5zaXx1dXN8c4BqXmB0dnB3ZGNYXV5SaWhTZFheX2dpdXiBcWZrY2xnZX+Aam19Z21wan13hXpri4FygYF+gXV2go2Gf3x6gIF9f49qcoNudGliiGhsYl9xVnRvbG1geGhsV2p0dmN0enpxYmtveYmNn7OSpaadjpCYj4acoJqbe3Wjno2Xf4yhioialnh8hod+hIp+iIKBf3B+enR1goV+iZB3Z2N9hpeKgoqNeH2AjYN5loCVl5WNlp+afW+LgZGThaWbh4yJg6aVhJGKlZeSkXaRnaGhmJSXeX+OmJeOlpqdpZ6alJWde5KIhXmHmI+ff4KKjoxzl6KeoJKYjo+hjIyDmJiElJeaf5mOfYqOgnhyfm57ZIB8i4Zxh5OAkYJrh4OBgIqFZnZwfYiUmo5+lHmNi32CiX58coB5i4Z6hZKLjJmjl4KEi3aHg4GAdHh/hoJzXnZ3fHN9dmZrZGB+amt3c3N1fXF8Y2Nhc251cm1hWV9dWmtjUmJXX19nanR5hXBiamNsZmh8gmtodGhsb2h/fIF5bI+FcYCDg390fIONgYB+eoKDfnyQbXWJdHRtZopsamJjdVaDaXBtYHlnbGFqdnBleHt5cF9xbIWFkJ2vmKepno6Nl4eFn5OVl3x2qJqJmHmWnIuMmZB4fIGLfX2Ee4CCgXhzeHlzfYCDf4iKgGRefYuUh3+Fh3R9fop/fpiElpOWjKOgl35yh3uTkYqmj4yOipKgkYOQj5OXkYqBj5igmpKQkXSAjpKUiZ2dnqeZmI6Vl3WQkYttiJqRm3yIiZCJb5edmqKSlYqMnYuGgZOdgJSTloiain2LioJ7cXprdm18f4x/boWTg5R4b4KEfn6LgWVzan2CmJiFgI51koqFeol/d3mBfoeBfYSPho2VpZF5hYJ0iIZ7fnFyfoSBa2B5dHlwfG5hbmJle2Jub3ZzeHdzdGF2YG9sdW5vXFpeXV1pXU9cV2JgZ2xyeohqX2llamNod4dtZmxoaWxngHx6d26QiHOAg4R9dIGGiXqDfXqBhH18jnJ5i3h4bWyHa2hfaXJih2hxb2V2Z21sYXpoanx7d3Bhd22KgZmaq6GlqZ6Ki5GGiZ6KlJZ8dqyXjJZ8npORlpSIdn57inx8gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkoZ/hIRyeoCGeo+Rh5GRm5Kkm5OBfYF8jYqSo4mNio2WmoyFkJeSlY2IiIySnZOPjI1uhJCPkYmemaKhmJeKl5Nwi5uGZ4mbkJV7ioWQinCWmpShkZGIipiMgn+Sn36TkJSNmpB8i4aIdHN1a3Fvdn2MdW+GkY6TcnSAfIKCiX1lcm56f5uVfoWKdZKMgnWKe3CCf4KHfYaNi4WOlqqOe4h9foqEdnxubH2CgGFmd3N0bnphXm9ga3RecGp7eXlscnBleV5ubHNtc1haXV9haVpPVldkYmdwcX+HZV1paGdiZ3GNbmNoaGVpZ4B6d3VvjoVzgYGDfHWCiYV4hXx4hIZ6gIl3f4t7enJ5g2prX3BodH9rcW5tcWdva2V7Ym5/endwa3d3iX+jmaOooaebiIyKgY+dhpKadH+ok5GNhqCMlZOQgHN8doV4eYByc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWBf3+gho+KkZyXoJOWd4l+gIyInJ2Kj4aSl5aFiJSYjpaLio2OjJ2KjpGEbYmLj5GKnJahnJmWhpmJbIelhWeIn4yTgI2EjIF4k5iSnZGQiImUjX9+kJl9ko6RjpuTfYuBhHB2cGxub3F8h2pzg4+YinF4gHWCiYN6Z3Rwd4KbkH2KhXuVk3t4inVyi3yHjnuLh4WKj5yliXyEdoGJfnd3bGh9f35bcXJxb292WV5vYHBqXm9qfHpxbm1qbXdgcG9rcW1ZWGBhYWxXUFJZZWVidW+EgWFda21kY2Vrkm1gZmZfZ2qBdXJyb4uAdH+CgHl2gIuAeYV+d4eGdoOFe4eLf3t2in9qcWJ8YoV8b3BsdWpobmx2d19xfnl7c3Vzf4J+pZabrZ+nl4WMg36WlYOOnXSJnpOShoqajJWOjHpyeHSCcHKFdHF1iGxubHRsh3aDfX9tblVRgauUh4J4gHZyg3mCoIKQgZOSmJuRmXeReoKMkqSak46IlJiShIWWmIuTi4mOj4edhJGLfXKLhYiPiJyZn5uXlYGVgGqIn4loiKKJlIWShIpxg5GXj5qNj4yLjo13e5ORe4+MjpOYjXyJfYFsd2pva2xte4Bien6Pl4F3eoF4g419emh1bXaJl4yAiYd8lZFye4ZxeI57i457iX+EjpGfn4Z9fHeBinx2b2dpfn92XXZubWtwclVdbmJyYV9tbnlwaHBmZ3N1aHBsYXdlXVVlYGBwU1BOW2VkXXhviHteXGhxYmJlZZFpX2hlW2dvfm9rcXOKfXZ9hYB1dn+MeXuGgHiHg3OGhX6MjIR8eZV4Z3Jqg2CHfm9va3tgaW10f3RfdHx4hndzc4V8eaGQmrGcpo+Din+CmYl/ipx+ipiSjoSIl46OjoR3dHdzgHBwhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xwdIN1g5+CkXaUkJibkJl7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2InH+OgXh7jH+IjIqcnJyblpR6jnhpi5SKboqlhpSJmISGY4yRmI2UiZaLjImLcHqVinyOiYuTkop6hn1/bXxlc3BrbXt6XIF6kI+Be35/gIaPe3ppdWt0jJCKg4eGfpeMbX+AcIKOgI6JfoV7hJGWm5yMfXd4go53cmtkbnyAaWdzbmdoc2xTXW9kcFpfbHF3Z2trYmd4c3BwZGB4YGFVa19edE9NSl9mYlx4cIl0XFtldWBhZGSOY2BmYlhpc3RubHF2i3x0eYaCdnd+i3N/hn96iX9xiYeBkIqIfH6ZdmVzbn1lh39ucGuAWWtueXpyYHZ6e412cnaKdnqfjJyvm6CRg4V4iJV+e4ichoSekI6FjJeEk46HgXV3cHlxb4RvbW5+cmNkd3B8bnp8amhsYqSawdyu76JzbHWDdYShhJFulY+Un5SbgJFwhYujl4mOlYqQnZWDgJSPhYiPgJKKipd+h3t2f4l4hoWOnJqXmY+Qdot4cImLjn+NpoaTi56Ghl6LlJeJjoiNioqEiWx8l4N+iYaKkZCGdoZ+fmx9ZHh1am96dFiIe5KHhnp/f4CGjX96ZnRqgYuQi4SEgY2Yhm2Dd2+Jk4OShn+Ee4KSl5SakXV0eIeLdHJwZHJ2f19ybG9haHRmUmBwZ2tVXm5zeWFyY2BpfnFybltjcmFjVm5aXHdMTEtjZmFddnKJbVtcZHheYGRmhF9jY15YaXJrbmtyd4t9c3eEgXh4fIlxg4R8fYh7dIuIh5WFjH9/mHNodXJ5bYt7bnRwgFdwenZ5cWR2eYaMaHaAiXGAnYiZqJyjk4V9cYyTeHiJnIOEn4yOfJaNgJqIhHxzd3Bzam+BbGptfHReYHd2e3B0emdgZXzr2rXJw9yJc2x0gHaKmoiMaZePjpyVkoGIcIWIoI6Fi5WKjJeTfI2Sh4KIj3qRi4aPgoB3eIOEcoeCk5uWk5iGjXaIgHKHhIyJnKSFlo6ghIphg5WPhYiFiIyGgIdofZSAfoOFio6PgnKHf4Byd2h2cml0eG1ajX2Tg4Z9gIOBhIuDdmJ1bYqCkYyEgICTkn5vg216iJGIlIV9gn+Ck5SSmIlucXmLhHRqb2lvdn5dcmhtXGl0X1FkcWhmU19xdnRgcGBdaINxc2pYZ2ljaVdtV1t0TEpLZWZeYXJzhWlbXGV5Xl5kZ3pgZF9dWWtuZW5qdHeKfnNygX97dnqIc4WDfH+HdnaKhY+YgY2Ce5N2bHd2eXiTdW53en1YeYVxgG5neHaRgmR2hoVxipaGmqGboYqGc2+Si3F2jZp8iZmIiXyff4SZf4J5cnRub2RyfmlmbHd3W194e3pxcX9pYWdhf9W2jpGmeG5xd3txkpCMhmqYjYiakIuFemiHi5mGgZKQhoaXjXuMjICAiY17kI1+iYV6dXuDfHGGgJWZjpKUgol2hIh4hoONlaChiJeRoYCJYX+Uh4SHg4iMf3+CZn2RgH+Ag4yPkH5tg32DdWxtd3V0d3ZrY46Cj4CFf3yEgIWJf3BgdHKGfZCOg31/kop6coVne4WMiI2FfIWAgZWQkZOFbm94i350bG1oaXd6YGdpaVhrdFlSaHJpYlBicnhtYmVeWmqEbnRiXGhgZW1fb1Rabk1HTmZkXGZucYBrWltjc19cY2t2ZGVdXVpsbGJsanN2hoBxb398fXR4hniFg3yAh3V4iYGSlXuJhnaJgW94eXuEk29te4B2XoN/dIFsaHpzlHNnc4d8cpKShJqfm5+Gh3V1k35tdZKWfYeQg4qNmnyMmnZ+dnFvbGphdHxnYml1eVpgd3t5bXF+ZWRoaFedj19yc5e8xIR2cZSIj31xlouGm5KLh3JqiI+WgHuVi4GEmox8ioV8e4mLf5SIdYmGdnd+gXJ1hoGelIWUj4SDcoGKd4Z+jJufmoiVj56BiWZ+k4J/hYKIiXGBfWZ+jHx5f4CIjI99aYF+hHZncHl4c3d0bGuOhouCioB5goGFhIFsX3N5e36Oi4d8gpCBf3OCanqFiY2HhXmFfoKZjpGNfm5teoh8dXNtZWV7c2FbcGJXbnFTU21yaGFOZ3V4ZmBeXVlvgW9zWmViXmpuYHBPWWpRRFNmYFpqbm18bllbXW1jWmJwdmNmXF1ga2ljbGpzdoGDcG1+fH90dYN6g4J8gYV2foiBlpB4hIp0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGuTjYafmaCZhIdufYt1aXeXjn6BioKUl4p5j5VvenRxbGpkYHN6aGBlcXpaYHJ8eWdxeWFlZY+xsndLYlql2dCWcXuQio93fZOKhJiQi4Vua4WSknp5koaBhJiKfIZ/d3eJioSWgHCLiHF1fntqeYWDpZCEk42Ef3CAhHiGe4iem5aNlZKWhYhwe5OCfYKCiIJtgHdogIV5coCBg4qIfGV+f4R2ZHFzgGl5cXB1mY6Gg4t9d3mBhXqDa1xyf3OCiYeKfoeKe4lzgm9yhYiQhoZzhXuCmo2OhXlubn2DfnV5Y2Voe25eWHZaV3BrTldxcmZgS2x3dGFeXFtadX5zcFhnXmdrcmBvTldnUj9YZl5ab2tneXFbWlhrZVljcHleZ1xeZWxnZmtpcXd/iG9sf36AdW+Ce3+Cf4J/doGEiZeJcYKNcXuGfHp5hJOMdWp5fmtvfnR/fG9ye3qTb26BfnhnkouDoZmckYKFZ4aDb2d5lYh9foSCmIqBfI6NaXhza2tmX2FveW1fYm94XGRrgnlhcXZfZWXU6r2LMjo+i45/cXiFh42NdYKWjH6SjYt+bWuEjIx1fI9/hYGUiHyCd252h4SDl3dviIVsdXt1ZnmCg6aLgo+LhH5ugXZ4hXyJn5KOkpOUjoyHf3uShnd+g4yCan9yaIB+eW58fIKLhHdieoWCcmRyaX5udnJ1gpyMgYCFgHR2foBzgm9cboB1eYuEi3yIgX6JeXtybYqFkYWMc4N6gJeMi4B1bWp2gH90c1tnZ3VuV1Z7UllvZExacnJlW0lxeG9cW1tZXXV+dGhZYltoZm9kak1XZVA9XWVcXXVlYHVvWllUbmNZY3F5WmhdYGdtZ2lraXB3fY5taYKEf3lugHx9gX+BenWCgI2ThHCBi253foB7e4iSiX9oen1qc3tyhXpzdn1+jHl4hH18a4yNhJueloyBgGyNfWtofo2Len1+g5OCfn2KiGt2cWdoYltiZ3NvX2Frc2BocIh5YnN0XmNkm6CPblw1Wq+1dGmAiHyRhnWFlYVzjoqJdm9shIKGdHmJeIl8kod5fnJndol+fphvcYd/aXZ5bmZ5h4SkhoCHjYp+b4B3goN/j5uJhJaTmYqMhYl8kIhwen2Ee2h+bGqAe3pqe3eCiIFyYHeBfnJkcmd2g251fIaWkoJ9goFvd3p8dX9tWXGBd3WNg4d4iHaEiXt5dG+LgpGChnOAfn+UiYp8b25pbYGBdG1bZWRxb1Baek1bbltPW3JvZFVLc3hpV1laWmFxgHRgXV1gZ2RpaWZOWWdNQGBjW2B1YF11bFhXU3RgWmRvcldqXmJoamdtbGhwd3yTbGiEin19cH5+e4GAgXp3f3+Ki4NxfIdvcXeDf3uJjI+DaX17bXd4dop2fHh/goZ/g359em2FjIiZo42Eg3t1i3hrbISHkHh9eoKRgIB+i4NwcnFjZl5ZZl9vb19gZ3Bmam6IdGF0b1thZGp2e4C/nKakyLhxhIJyknt3hZKCc5CLh3Jyb4N7g3R0h3SId5OIeXlwY3eHeoCTaXKEdmd3dWNqfIKHnYGAf46PfnOAdYd7gpSShXqYj5aQiIKJe4mJa3h5fnRnemhrf3l0aXp3gIN9aGB4iH1ra3RofIFqdoKMkZV/e35/cXx2fHR/YlZ4fnN0i4WDfYRxh4p4eXFxhYSOgH96f352j4aEd2pxaWyHgXFvXGZgcWxJZHVLXWxUU1lybmJRT3R4YVJYWF1hcIJzW2FcaWVlZGtkUFtwSUNjYFtjb11dd2hVV1Z2XVtlbmhWa15hamdlbm5ocHZ6k21piI15fXJ7fnmCgYF8dn2DiIaDcHeEcm13goJ+iYuTf3CAe3d4eoCMdIJ4foGBgoR5gHVvfoqLm56IfYV6d4V7aHSFi5B5fn97iIaEdo+AZ3BuX2RcWGVZbXJhYGBwbGtoiG5hdGlZX2RugHep2qnHhoeycYh3b4x0eoWNf3mSiX90c3R9d39vcX9thXSThXh0a2B6gnmJj2ZyhHBndW5bbX2AkJN/gHiRk355fG6KeIOTjoZ2mIyTkIiGhnx/hWx0dX5sZ3ZkbXt2bWp3d39/fGFieIZ6aXV1Y358aHWHj42WfHWBd3GAe31ugFpXdX9wdoWIf4F6bYmGdHpsdoKEhX98fnp9dIyCfnRodGVuioNsc1poXXNkR21tS1pgV1ZVd21iUFJ0dlhQVlheYXKEb1xgY21lZF5vY1RccUZCZV5dZWddW3tiUVZcdFtaZ2tgVmpfYG9mZmtxaHB2eI50a46Ndn92eH53gYSBe3R9g4iHg29ygHRxdX6FgomNinp2f3iDe3yFh3eHfH2BfoSAe35ydXmMjaCMiXmJdnSDeF59hZeLeIaDc4WGhHeJemJubVxiW1thVmlzY2BbZ25wZodxYXFmV11ja398ys6HuaFqbW2KbHGDcXuDiX56kIR5eHN4dXR7amx2Y4R1kYJ2b2ZffYJ6i4plcoJranFjWGx6hZuIgoFzl5R4f31vinOEjI6JdJmQkomGi4N7eX1xcG98ZmhxYm14cWpscXh9fXpdZXqAeGp2eGaDd2h1iYyOlX1yiGpvfoF5b31dWXN/bnWBjHyCb3CKgHF3aXiBgoGCeH5zfHWHfXtzZ3NhbouAa3FXaVx2W0dtakxWVV1TVXtrYU9UdXJQUVRXXmN0hWldYGxqZmNab2FYYm9HQWdcYGVdXFZ7Xk5VZXBZW2poXVdnYF5yZWpocmhwc3eGeG6Vi3R/enh+eYOIf3Vyf4aFjoJwcHt4d3Z5hoaHjIZ5e390i319hoSDh35+fn2Hf3x4dXh4kZOff4x8im11gHhkg4aVhXORim+FhYF6g3RkbmpZX1tcXVRncmRgWWRxcmeAcmJrZVdbYGp/eL6ue5+3bmFzhWhzenF4gYR6fYt+d3dydm97dmVqb2GHdY6Ac2piXn54eYuEZnF/aGtrWlZvd4iigIR/cZmTcoF6doRvg4SUinWXio6JhYmFfXh0cW5oeF9qbGBtdmpnamx5d3p2Wmd9fHlmc35thXVldYeNhpaAcIxna3uEdW51Yl1xfWx1fYx8gmd2h35ucWl2gHl/gHR+bXt8gnt5cWZsYm6JfWxsVWlfdlVKaWpOUU5nTFh7aGFOVXVrTFFUVV9ndoNmXmBxaGdiV2pdXGtnSkRqWWJjVllVeVlNVm1qWV1rZFxZZWNedGVtZHFncnB1gXhxmYZ2f353f3yFh311c4KIgJWCbnN5e3pzc4WHiYmDeIF9dY9+fISKjYOBhHt+i4N7dnt3d5qdmHqJgoZpdnx7bIODkn9yjoFwhYJ/gn9wZ2xnWF1bXFtTZHBkXldicnVqdW9lZWNXXFtof3BvcoBziWRkeX1pc3VzcoGDd4CDeHZydW1qenFhZ2tnhnONg21mXV99cHuJf2lteGdqZFVXcm+MpnyEe3aWkXR9dH58b359k4h4m32Jh4SHg311cHFsZ3RcbGdebHRkZ2Vpem97cllogXd1aHCBeIJ3YneGi3yVgW+Mam17gnFndGZhbnpoc3iLfH9jd4R3amxydXxye3t0f2iAf4B5d29kZmJthXtsalVoYW9SSmhqT0tOb0ddemZhTVV0ZEpPU1dha3d+Zl1nc2lmYFZkV2JwXEtLaldjYVVUVXNWTFh1ZFlea2BbWmNlX3ZnbWJwaXRvcn50dJmCd3+AeIB/hoR6fXWChH+XhW5ydHx6dXGEhY+BgHqLdXOQf3yBlY2AhYR9fYyGen2Ad3ujpYp5iIWEa3R7enWCgIt6boRzeYR9goN2b2ppZVZdW1paU2JuZFtYYXN7amhtaWBiWF9aaX9pa2+AZ2xgaHl4anJzc22DgHp/fHV0bXpoanlqX2VuaIF2j4RnZVhid2p+h3tvanBnZl1UWG9njad2gHp8kI56dnGAcXV4e5GBepd2h4OAhoh2anJ1Z2duW2xkXW1yX2dhanhoe2xbboNzdGpwgX56eGF3hoV5kYV0iXJweoFzZHJpXXF4ZXJ0iXx5Y3SAcWdqeXVzbXl4dnllhXx/eXdxZGRjbXt8ampUZ2FlU0prZ09HUWpFYHdmYU1Tcl1KTVVaZWx4fGZfbnFpZF1WYVVublZKU2dXZV1YTVVrVEpbeV9bX2tdXVpiZWB5aGxhb292bnB3dXqYfnd/gXmAgIeGenl6g36Bk4NxdHR+enZ0hYiRfYB8kGtylYB7gp+Ffod9gH6GgoCKe3eEq55/eoeHg2tygXl1gH6AdG6GbnyAc4qAanBuZGRYX1pZWlRiamdbWl91gmlebWxcYVdcXGuBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cmx5Z2l4Zl1kc2h6d5KBY2NUZXBogoV4eGdpamFXVllnY46nb353gIuOe3Fyf2l7cXyOfXiQc4V+gICGbmR1cmRnZ1xqYV1vb1xnX210ZXpoXXSAb3JrcXx+dXZidIaMe4mIgYF5c3WAdmJxbltydGNxc4V8dWVzgG1hbXtwa2p8enZ0Z4d2e3p2cWViZG1yfWlrU2ddXFRLcWJQRlVgR2J2ZmFLU29YSk1YWGhrdntlZW5xZmRaV15Yd2VUSlxiV2dXWUhXZFBIYnhaXV9sWl5cYWNefmlqYG90eG1wbnaDl3pygIB8f4mMhn11dYZ4h4x8c3V1gXl6eoKMjn1+hIlpc5aBeoqdfn6FeoF6f3yGiXNxj62Me3uGj31kcYd5c3x6dXJvhmx7fmyPemNwb2JlXWVWWVlXY2ZrX11dc4VoWHFuW15YWlxse2Jwd3VsYVlsc3NndHVvbIN4fn94dm1udGRodGVbZ3VmdnaRel9dUmZma4OCdH5iZGpcVFddYmOOpGl4c4OGkXlucXxqem99h312inSCeX15gGlkdmxgZl9eaV9ddGtZZV1vb2J6ZVx3fGtubnB4eXR1ZXOEk4CIg4l7d3Bzf3RjeGVccXFicXKCfXRncoBlX253amVoen11b3CDdnR9dHJiX2ZtbnxkaFNnV1hTTXZfUEpZV0hidGNhSVRtU0pNWldqbHJ8Y21tc2NiWlpbYXdcU0tjXVdoU1ZGWGBNR2l1WF5gbFtbX2JiXIRpaGFueHltb2p2gZB5bYN+gIGTiISBdnSJdIyGdHF2doF4fX1+jJCAfpN+cHeVg3yYknmAgHh6foB0iIR0cZmhenp/iZR3Y3WHeHN3dGt0bn5reHxwkXNecG5gZ2JsVFpaV2hjbWZbXHGJZVNybltaWFdgbHZjaXVqaV5ZbXNwa3Nzc2mEfH5+enZubmxkaXFjW2pyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJJ1bGx7b3ByfH59c4J4gXR7entkZXVnXWJZYGdbXnZoV2JdcGhhd2FbfHZpanJveHRzdWlxgpaEh3+Fd3RrcX5vZ3hYXWxuY3J0gXp0Z3B+XGBwcmJga3N/bW52f3NxeGtxYVxlbGx6YGZSZVNWUU91W1FPWFFIY3NhYEdWalBJUFpWa2trfWZub3FiW1pYWWxxV1JQZlZWaFNURVlbTkhydVhfY2xiWGBgYV2LamNkbXp4bHBpdXmHe2uDfX+EmnyDhHl8h22Ph3Judnp8dIKCfIuPg4KXdHiBk4WBnol1gYCBdH+CcYiDdnChlnN6houGemV3im5tem5meHB6a3N2c41rXnVuYWdla1JdW1VnYWxrWlxxjGRPb25dVlhVZ2lzaGJ0ZWRcWG10bG91dHhqhnx/e4d2j3NjZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1kX2NUWl9ZYpWVY21wg4WKdGtpfHBndXh1fW17dXZwe392X2ZyY1tdVmFjWGF1ZVVfYG1kYXFdXX5waGl0cXRxdXdrbYWUgol9h3JzZ3B/cnRwVFxna2ZydYF3dGNtdlZjcmxbX3BnfmZueH5zdHNrbmFaZGlqd15lU2NUVVBTbFZQVlJQR2RyX2FGWGlOSVhUV25pZX1pbHhrYlddVVt0ZFNSV2hRWGZUU0dZWU9NeHZbX2VraVlhYF5ejm5iZmt5dW5vaXZ2gH9sg4B9h5h7gIeBiX5rk4hyZnSAe3WAg32Jj3+Lk3J8ipGFh5+Ge3+GjHOBhnN+gnZupItygI2LdndseoxgZHtwZnlzeGxtcXeDZ2R8bWNmZ2hTX15VZ19sbltebo1oTmltYFRWU29nc2tleGRkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcHh+Z1pWWGBseHx7cIRfY19nVlhfV2ObiGJrcIGHfXhsbHpuXXhzbnxrdnRvcHyBc1hqbl5YXFVhYldkcGNTXmJpYWJsWmF+bGZsdHZvbXd3bGmGjYCKe4lucmZyfm50bmRbYWlpcHSBdHNeaW1TZXFlVmNvZHxkc3h9d2xwbWtgWWFmZ3RcZFVgVVJOV2RST1tOT0hkb1xiR1lpTUpfS1ltZGB5aW5+ZGBVX1RddVxTUmBmTlxgVVJJW1hQWXR1XV9la2hYYmFbXo1xY2dqeHFzbmh2dHuEcoKDeoiOfnyJh415bpCJdGtzgXR/f4iFh5GElY95fYyOh5GbhIB8jIVzf4FzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2MjIyMjIyNjo6OjY6Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjI2Ojo6Ojo2Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQVLM2tjY2NjdbT1ERERERTguLy8vLytIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUyRtjq5+fn5+1nLjU1NTU3JxwdHR0dGDqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhYWFhYWGk5SUlZWUlYqFhYWFhYWEg4ODgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpKTj46NjY6Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Li4uLi4yLjY6Ojo6Ojo6Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkJCHiIeHi4aJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQjYSIhoaOhYyPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJGJg4WGh4yJiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjI6JhoaGiIaJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNkI6Ni4qMiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+AgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/f39+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fn5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fX9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/f3+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fX9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fn9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWFhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHx7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent9fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e31+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk5Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ3eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs9PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fX5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn1+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAPTw9Oz49Ojo6PDo4OTg4Ojs9QD88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZFSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8+P0A9Pz8+PD5APz09PT89PT5DRD87PD0+QD09P0FDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD47Pjw/PTw6Pj0/QkJFQD8/TmFfSkBDRUlJSUlMTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5NS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHt7fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBQ0RCPz5BP0FERERDV3WGiYp+WEdISkxMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5vcHFydnZ5e3t7en19fn59fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSElHSEhJR0ZCREZERENBVXSHiYeHhoiCV0lMTUxNTUxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSktNSktISEZGR0ZFUGyEh4aGhoeHiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8/P0RGSERFR0lLSUlHSElHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS01MS01MSUZKVmyBhoWEhIaGhoeIhop1SUlGQj8/QD8/Pjw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1LR0lKTU1OTUpKS0tKTE1TbG9ydHNzd3l6e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/gH5RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSEtMT05OUU5RXnKBhYOEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkE7OTk5PT0+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+f35/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQkZIS0hMS05UZ3uEhIOCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDY3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg6Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QT1JUZXBxc3R0d3l7fHt8fX5/fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo8REJERkNDVniEhIKCg4KFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Nzk5NzY2NzY1Ojo7Ojo8ODk4OTk4Nzc6Ojo4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09QUVdrcnJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxHUmB8hIODhISEhomKioiHiIiJioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs8PTo+PDo8Ozw7PDw6Ojw4Ojo7Ozk5OTw/PD1BQkRJSk1LSktMV29ydHV0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj49Pk93gYKDhISFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQkFBQj5AQ0FAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBBQD8/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVCQUdKTk9MSUdLOjg6Ozk6Ojs8Ojo6PDs9PkA+Tn2Cg4SDhYSGiYmIh4aGhoeIiYqLi4qKiouKi14+REdJS0pKRkdHREZIR0VDQUBDRUNCQEJDQj9AREhFQ0VERUVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo9Ojw6PT0+Pjs+PD8+Qj9MfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKh1dHTExNS05JSUtISUpKSUZEREZHRkRDRUZEQkhJS0dIR0ZHR0VLSkxJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9PD5AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3Oz47PDo9Pz4/PD8+QkFEPmeDgoWFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLR0VHSEhJRUVIRkZFTExNSUpHR0hJSk5NT01MTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExtcHR1dnh5eXl8fHx9fX5+f39+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ojs8Oj0/PD09P0BDQkhTfoOEhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTExMSklIRkpKRUpIR0tKSEpHR0dLTE5MTEhISUpNUE5PTkxPS0lHSUpISURJSEhGRkdHSUdDQkFDVW9xdXZ4ent4eHp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojs3PD06PD88PD0/QkNDTG2Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIuLi4uLXlJSUE1OTUtKR0ZDSEpHTEpHS09MS0pKTE1MT1BOSElLTE9RUFBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAgH5/f1VFQ0VFR0dFRDs/QTs9PDg/PT0+QEVEPUJEQ0ZKdIaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVGRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNSUExLTU1NS05HR0pGRklKRERFRUJEQ2NxdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PEE/QUFEVEtCSElGSUt4hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISkhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUFDRkRDREtWUEpPT05QUXmGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1WXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NS0xKSUlMTUtPTVNvdHZ4eXh3eXp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hMSU1QS0lKT1NRUFRWVVdVdoWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl5eW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSklJRkJEQEE6T1FRV1hQUFBRUlNSVldXWFhtgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWlpYXGhiR09aaWddW1xdXVdTTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaWlJTUU9RUlFVUlVTVl91eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f31+fX59fX5/f39/gIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtxeV5bVlVTUk9LRkNEQU1eg2xWUlNPT1FPUVZRU1JSVGNkdoCDgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVVJNT1lRTU5RU1VVTVFTUlBOTExIQ0lHUlNUWl1tcnZ2dXR0d3t6ent7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0YGRdXltZVVFMSUxJYWySdFBRU01RUlBTW1JTUlFSVVVic3t8foCBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+QkJDQ0E/RFBDQ0BDPkJIR1ZASU5NR11pUUhGT0ZERUZIR0hCQ0hHSEpHREJBQ0BOUE1SZHR1dnVzdHZ5fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaGVlYlxYU1FQVVJzV2VbT09OTFFSUFVZU1VRUVRST1Zga2xzdnp7eHl0cm5zdHN5eH5+g4CDg4KBgoCCgYFrTEc+Pjo6PkA/Pj4+alBLYUVGSElFQj9ITU1HTVFVSkJFPz48PTw9PT89P0FDQj8/PD1CPklNRlVvdXV2dHR2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSk9QTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sbmpoYG5yaW1scXV7en17eHp8fHh3eGRCQEBBPDpCQ0FBQ0FbXE97Tk9PTktMTU9PUExLTFdOSEdBQTw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dnZ1dnd5fHx8fXx8fH1+fXx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9PXlxaSUdPUVFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfXl9lX11ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RV1BNSkRGPjo5NjU4Nzk3OTozNjU3OTU8Qj1mdHV3eHd6eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1NUU1BRVU9MUlNUV1hTVFhRTFhZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9NTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25ydXl5ent7fX19fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTU1MSkZQUFVZU1RPSk5PVVNUXFZSVVNTT01MSUhIRj8+PTo3ODc2NTk5Njc1NjVXcXF0eHp6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhXWVlZUlVPSUdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBQT05OTVBOVFJQUkxJTEtPUlBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1ZRU0ZGQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj0zQD5qb2FSUlFAR1RRT1BQUU5RT1BPTEpMTE9QTk1QUVFOUE9KTE1NS0dFRUNCOz09PDk9RzY2NzZEbnF1d3p7e3x8fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlVZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQjhETVNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTE5OTUlNTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRyc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QEBCPT5FSEZERkZJR0pKQEZBQUBFR0RJT0hRUmFcUVBST1NOT09MTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRT9CQz49Qkc/Qj9AZHJ1d3t6e3t8e3p6d3x3eX1+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PEJBQEdKRU1PYmVQTU9NV0tMTktLTU1MTEtOTlNkTUpMUklJSUVCSUpMTU5KR0lGQkJCQD9FRkVIRExvcHZ6eXl6e3p8end0eHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0hLRT9CPTk5OTo/Qj88QUJBQURER0tGRElJR0dIQ0M/Qj4/P0A+Q0VETE1RVExKSU1URklJSkxJSktJSkxNT1BRUEtHQ0tHQ0NLSkxOT05JSklHQ0NDRElKTUxJWnNueHl4enp7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEpDRkdIR0pLSUpMREdCPD49Ojo6O0FCPz1CQkNDSEVKTEpFSUlGR0hDQztBQEI+QD9CRERJTU9HSEpHSEtESElLTUhKTEhJSkxKTV1SSElETkdCRUxLTk5RTktNSktGR0dKTU5STk1jbmp3dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZXBGSkNGRUZERUVGRUdDQ0A9PD06Ozo7QURAP0JDRUVJRkpKTEZJSUdGRkRCOkFDQz4/Q0NDREdLTkhKTkhESEVJTE5NSElMR0ZGSUlMTktJSEVPSUNHTk1QTlBOTk9NS0lISU9TUVJOU2dnZnJvc3h2e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWZfcEdKQ0VFREJCQUVAREI+Pz47Ozs9Oz0/REI/QUNGR0tHSklMSEdHR0ZFQz89REVCPkFDQkNFR0hJR01QSUZGR0tOT0tGSElGRUNESUlIS0lHSFBLREpNTVFOT05PUE5KSklNUlVVUlBYZWFhbWZwcm9yeXpnZWhoY2lsZnFsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFREZCQUBBRDxCQT5BPTo6PT87Pj9BQj9AQkVHSkZJR0lHRkZGRENCQUFFRkNCQkJERUVHR0hGTFBMSU9KSkxLSUZIRUZFQ0NISEhLSkdLUk1DT09OUU9PT05PT0tLS1BVV1ZWVFlgX11pYG1pbmhyc2JlZmZkaGhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV1dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNR0dFR0FBQENEPEFBQEM8ODo9Pjo/PUBCQEBAREZIRUhGRkhGRUVEQ0VCRElGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTU9QTUxOU1dWV1lWWF5aXWRgaGNqaWdrX2RlZmNoZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQUFCRUU8QENCRDw3Oj0+Oz47QUI+Pz9DRUZERkRER0VDRUNERkZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhES0tMTE5PUlRPSFRVVFFUUFFNTlFOTVFXWlZaWVdaXlpYYWBgYF5oZWNgZGVnZ2poaGpnaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lDQUNHRTxARUJEPDg6Pj4+PDxCQj1APkFCRkNFQ0NHRENEREZHR0dJRkhKSENJSEdJR0ZESEtJRktITUtKS0tIS0pNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVFlaWVxaWlxfX11fY15cYmRsY2BkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCREdFPUFHRERAOTw+QD8+P0NCPEA+QUFHQ0VEQ0hERURGRkhIRkhHSUtKRUpISEpIRkZMSEhISkdMTExMTElNSk1OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZl1kYGZoYGVoamRzc2ZqaGZscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndwd0lKTElLR0JFREU8QUZEREI7Pz9BQEBAREFAQj5BQ0hCRURGR0VIRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tLTUxJSUxLTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYmBjZGVhZGljZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dXNwc3d0dXV3dnV1dGVxc2twcWpydnB3SkxLS0xHQ0NBRTw/RUVFQz1BQUNCQkNFQUNEQUFFR0NIRkhGRUlGQ0dKR0dKRklMSElKTUtNTEdLSUhLS05RS1JRTFNNSk1NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYWNeYGZjYWJnbmljaWhobXh2bWhpbm9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZzcXF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdEQUBEPj1ERUZDP0NBRURERkNCRUdDQ0lGQkhKSUdISkZES0pHSEpJSUtHSkpOS05MSUxISk1LWmZKZFxLbFJHTk1fblVsc1txcGJ3Y1JQYnZ1aHVjYXZhWG5xYmR2aW56ZlxsdWBsa1Zgd3VoamhoZmdsbWptb2ptb3NycHJycXJzcnNzcnRybmx0b25wcXF1dXJxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PERFRkRDQ0NFRURGQkVGR0RES0VFSkxLSUtMR0dOSUhKS0dLSklKSk5MTU1MTElNTExbc2JkcF5sbFVMTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5uXHB2Z3BOTHJ5dmthYWtlZWx4bWt2bG5vc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQT89QkVGQkZDRURFRURDSEhHRERLSEdLTU1KTExGSk9ISktKSUxKSklKTU1OTU1NS05NTVtycG9ucHBsa01PUG1YTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBdYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRUVFQkFCPT8/RUdCR0RIRUVEQkZJSEhFR0tKR01MTkpMTUdMTklNS0hKTUlKSUpKTk9OTk1MTk1MXGhkdV1scVdsTU9RblVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZJTEtGTUtLUlJMSE1NSU5KSUhOR0pKSElOT01OTEpNTUpadHBwb3FxbWxPUVJuWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqWl50Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNEREVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRkpNTEZPSkpXUktHS0pKTklJSkxJS0pJSUtMTU1MSUtLS1NrYllpXl9qY3JyWl9Zam9fZWVVa19kW2FiUWBtaFxqXG5paWRbb2VkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZKREVDRkFAQUVEQ0ZCSEpMR0ZER0tMSUVGSk9MSU9KTFtRSkZISEtNSUhKSktLSUhJR0tLS0tHSEtKTEtMSklLTE5UW11UUFVNUU9OT09VUlBQUU9PUUpKTlBRZHFpVFlWW1tcVVlaXVhdXFxjZmFhZmJjZl9eZmttaG10eHJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkBFQz9DR0RFR0NJS0xIRkRHS0xIREdJUEtMT0tMV01JRkVISUpISUtITEpJRkhISkhISEVGTEhISk5LSE9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRUpKSkZER0hQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHRUVKR0JJTUlKVF9ZYFhgYVtgVVhZVF1eWl9SWVxQXlxZTl9cXlNbXmReWl1gY19ZX2JbYF5bVVlYWl9eY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdXl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSERGS0pKRUVISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUZDREVCRkpEP0lLSE5bY1leXmFfUlRTV19fXF1ZXlFZXE1WX1dLUVlbUVtfYmFdXmNhYGJiYmNjZVpSWVZXXVpeZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZER0VCRUdIRkdISUZHSkdIRkhLSUtEQ0tKTU1MTEhKSkhKRz9HRk5LS0tNS0tLSUdJRUVAREFISUE+SElGT11hWltkXV9UUVJYXVxcXF9bS1dcTFJcWUlNXlFRXV9iY2NjY2JcZGNiZGNlWFJXVVRdWVthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNFS0lGR0dJR0dKRkZGSUxKTkVDS0pMTkpMSUtKSUlHQkhIUU1LS09NS0tJSEhGRT9FQkhIQUBGRUNUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVlphUlJfX2JiYGBiYl9jYmJkZGJYUFJSU1xUXF1dXl5fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdHREZNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtKSUdESEtRT01MUE1MS0tJSkRFQUVDSEZBQUZEQVZVRVxUXlNWX1hOVFVOWltNSktUYGFbX1hfXmJdT1liXGBgX2JjYV1iYldgX1RRUFFSWVNeXFtdXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVNjUUVXX0lHR0hERk1KUFBGSUlKS05MTEtNS0pKR0VJTlFRTk9QTU5NTklMQkRBQ0NGRENBQ0RATEhDTExQT05MRk1GRkhJSEdMTE1PUElMT1BQU1BMUVNSVVpYV1lXV2NWTlJUUFFQT1FVVFxZWVteXmFhZWZjaGRsbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTl5NSEhZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tQVFNOUFBOT09PSExGYEVEXkxEZmNDTFtIXlxzbU9NVm1ZTENPX1RsV2dKXVdVXkRNUVVMTVNWUVJUWFZUWFRUXFRPZVpoaGVaVWtUWFdVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhIODg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtQVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPUEpMTkdITVFbWU9QUE5QUVBKS1F/UUl8WVlyc1dQbUdxbm9hVlBxcXRPQmpzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl5VVVd/aXR1dV9hdl9ZYlxcZltfYWFhYl5gY2dtb2xgcHd0eIGBgoOEgn99foB2eHptdn50eH2AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMS09ITFJYV1FOT09MUVROT1FQS0xPR01QU1taVFFST1BQUEtJWnhdVHhkaFhSU1B2ZnRscGJuZmtSck5Md21qcnBzcnFycG9vgF1lenV4cXF6cX5yfWt1fWFSaHxlc3Nvc3N8fXB+eG9/cmBgYGJiW2FhaGxua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUU9NTkpOVl5ZVUxRU05ZWUxTUlJOTFBJUVJUWVdXUFRQUFFSS0hneGxjeHFtWkpMVHlwdW11Ym52UGRkSGV2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Boblh1dWp2dXCAYXNofWlseHxvX19fY2JcX2RlZ2pqZWhiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN2em58fXl4cm5NSlJ0TkNCRVBRSEtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlJKS3JvdXVxdXFjaGBVbktxcF5HaHlXdlRLaHh9d2B5e3NuYV1tb2RTZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW58bHF2dXheX19iX11fZWRpZ2hmZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlFLTU5MTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUUlSbUhpd0tgZHZ2VFZsTm5se3Jhamd/dVRLVmtnfGxtbHhfWnB6e19genNjcm94cWhkfGlye11US2tfdnVsanZ8e21+eWt8cF1eXmJbX2JkZWdmZmVjW2NjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsZ2xtcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUExMU1NST1NSWFJXVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTU9VTEtLUlNSUVJPVlVRUU9SUlhYUE1PVVRXWFhbW1VRUldbV1hXW09SVFdXWFFdWFZcVVRPWFJXV1hZWmBcZ3JfW1tbXV1fY1pfY2NlZ2RkZGNaZGJnZmZtbm11ZmZnY2BmXl1nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTlJRUExWVlRQVFVYVVpWUltdVlVUV1VZWE9PTE5XVFBOVVNOUE5MUVBLSVFRS1FNSkpPUVRRUFFTUkpITU9QUVJQUFBUVlJYV1xXU1JQUVVVVVNaUU5SUVdVU1lWVFhUU1FUU1VVWVlYXlpfYV1cW1pcXGBjXF1iY2RnZWVlYllgYWNhYmhoam5jYWReX2NdWmNcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFSTVhXVVRWWFdXWlZTXGBWV1ZZVVhUUVBLT1hTUE5VUE5RTkxTUE1OVVNOUU5NTlFTUFRQUlRUTktNT1JUVFFRUVVXVVlaW1pTVVJUWFdWWVxTT1NUV1VUWVVWWFRSUVdVVlhcWlxgXVdZX11eXVxdYGFeW2JiY2hnZmViWGBgYl1gaGVnZWFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlNUT0tPVlRQT1RQUFFOTVJRT1FYVFFRT01PUlROV1FTVFVPTk5RVFZVUlNSVFhWWl1cWlZWUVJXWFVbW1ZQU1VVVVZYU1dXVFJRWFZWW19bXmBfVl9dXmBdXGBfX19aYmNlaGhlZWJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1VRT1ZcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU5XU01NUk9RUk9NUFNRVVpVVFBQTFBXVVFWUlNSWE1PUFJVWFVUVFNUWVhbXl1cW1ZST1VWVVtbVlFTVlRWWFRTWFpTUlFZV1ddX1tgYGBWYlxgYV1gYl9cYF1jYWNoaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOUFdTTlFRUFJUUkxRVFNZW1dVT1JOU1hVU1FUUVJZT1FTU1ZbVVZWU1ZaWF1eXFxeVlNOVFZWW1tVUVRUVVdYUlNZXFRSUlxYWl1eXWJhYFdiW2NiXmFjX1xiYWJfZGdpZWddXGRgYWBhY2RfYl9ZWl9bXFtYWFlXV1paWmFdXVtdXFxaXWBXW1taUE9PT1lQVVVTUlhTVFBbXV5dXGBcYFVcXGhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVpaWlNPU1FVVVRSTlVRUlpSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WVldeWlhRVFRXWFhTVllcVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl5eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBaVVZXVlRUVF5eYF9eYl1gVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVJPV1FTV1NXVVZbXlhbWVVaXlhfXllcWVJXUllYWV9ZWVJUVVlZWVVXWVxVVFpdXV5hYmBlZF1eXV1lYWJmZF5fZGNgXGdlaGZkYmBlYV9hYWJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hTV1VUUlNXUVNWVFhYWF5eWF1bVV1fWF9fWFxWUVlUWVpaYVhbVFZYW1laWFlZWldWXV9gX2RjYmVlXmJcYGZiZGZkX2BkYmFbZmNoZmRmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWldUXFVXV1lXVlxgYWFjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlRSVlVRU1VXW1tcX19aX1xWX19ZXV5ZXlZTWVdZWVxiWV1VVlpcWltaWllaWFlfX2BgZGNkZWVjZFpiZmNnZmVeYWJgY11iY2llZGhfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllWWFdYXV9iYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVVNVVFhdXV9gYF1hXVdhXlteXFteWFZYV1taX19bXldYXFxcXV1bWlxXWl9hXmBlZGRmZmdjWWNmZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWVhaWFdbW1pbV1haVFpdXFtgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXV1dWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQV1VXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXF1ZWFVWW1tgXlxfWVleXV5eYFxaWllbX2JfYmVkZWZnaGNaZWZnaWdjX2NeYGZlWmlpY2ZpY2ZfYmJjYWBgX11dWlhbWVlYWFpZV1pbWllXWVZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tcX11gX11bYGRcXFhaYmVjYVJcWU9YVllbWVlXWlpgXmFiY2BhY19cYl1fXVteXVlZVFhdXF9fXl9bWl5eYGJiW1tXW11gYmJjZWRnZmZnZV1lZ2hpZmNhYlxjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGJgY2JiXVxbWldYanFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl5eWlhVW15cXGFhX11bYGFiZmJeW1NcX2BjZGRmZWdnZmZmYGZnaGhnZGRgW2ZnXmFoaGNpaGZjYGJgY2JfX19dXVtaW1lYWFhWWldcW1pWVlVMWFhcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiHiYeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x7e3t7fHt8fHt7e3t7e3p6e3t7fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiodzcXJycnJxg4qJiYmJioyNjY2Ojo6Jf39/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMiXJvb29vb26FjYyMjIyMjpCPj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl6eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8enp6enl5eXt9fHx8fHx8fX19fn59fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z2eHl6enp+eXl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3d8fH18en17eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3eX58fX15fXp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d7fn18fHp7end4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7fX18e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBf4CCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5d3h6enp6e3h4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGCgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgoGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgIGBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGCgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgoCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKiouHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SFgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImFhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR0d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiIqGhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qKi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGCg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBg4KCgYKBgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIGCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhYSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpGRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOCgIOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhYWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjYyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBgIGBgICCgYKCgoGBgoKBgIKCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgoGCgoODg4SCg4ODgoCAgIKCgoKCgoKDg4OCg4OEgoKCg4ODgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFhIOEhYODhIWEgoKCg4KChIKBgoaFg4WDg4SEhIaFhISFgn99fX1+goSDg4ODg4ODg4OEhISDgoSEhISDhISEg4SDg4WGhYWFhIWFhYWFhIaGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIuIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDhIODg4SFg4KDhIWFhoWGhoWGh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhYWHhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeHhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgYB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SDg4KEhYSFh4eFhIKAf39/f3+Af39/gH9/hYWGh4iIh4eHh4iIiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGh4WEg4SFhoaFhYWGhoaHh4WGh4aHhoeHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoSEhISFhIGAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIeHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4WDhYSDg4KBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiJiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhISFhIOCgoKCgoOBfn1+fn5+fn59fH59fX2Dh4mKioeHhYaHh4eHiIeIiYeIhoiHh4mIhIOEg4WEhIWFhoiHhoWDgoKEhYeGh4aGhIKCg4SCg4SFgoGCgYGBg4OEg4SRkpGOj42Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFhoiLioaFhoSChoWBhIWDg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBgoOEhYWFg4OFhISEhIWEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWGh4iHhoCBgYWDg4SFhIeIhYOBgICBf4GMhoODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgYGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+f358f4eDg4KDgoOBfX1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBf319f4CBf39+f4CAf4CAgIF/gIKAgIKCgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgX98fX1+fX1+gIB+fX59e31+gYODgoKBgX99fX5+gICAf359fX18e3t7enp5eoCAf35/fn5+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gH19f4GEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39/fn9/f359fn9/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWSko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAf39+gIGEg4KCgYOEhIOEgIGAgIGAgYCBgoKDgYCBf4CCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6eXl5fYB/gIGBgX9/gYB/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/f3+BgH5/f4B+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4ODgoKCgYKBfn59fX1+foB9fX19fX19fXx7enl5eXl5gIKCgoWDgIKDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoOCgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiIeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gIGAf39+fX9+f4F/gIKBhYWFhoaHh4aHh4iGh4eHhoeHh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICAgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf3x8fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYKAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImJiYeFhoWDg4KBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKDhIOCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goGAgoKAg4OEhISEhIKEg4SFgoSRkY2LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OFhYWFg4ODhIKBg4OCg4KCgYCAgH+Bfn5+fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjo2IiIeFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f3+AfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgYGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fX18fH2Af4CAfoB+foKUkYuMjY2PioWGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p9gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOHf318foCAgYB/f359fX19fnt7fX9/f4B9f36AjJGNi4yNjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fn+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX5/f31+gH5+foSSjIyLjoyLioaEhoSEg4ODg4KDgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CEg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MioqMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgH+AgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fHx6en16foJ/gYOEgoGCgYWGhYWGhoeFgoSRjoyKiYqHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fX9+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYqJiomFiJGNi4eIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fH19fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkI2MiIiGhYSDgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjIqIiIWEhIOBgoKCgoOCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoGAgIGDgoB/gX99foB+fH9/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5enl7e35+gIGDh4SIjYyJiYaFhISDgoKCgoKCgoGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChYWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5+fX5+gH99fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImMiYqHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBhIF+foCAfX6Afn1+foCAf4F+f4B/f3+Af31+f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iYmHh4WGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF9foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fYB/fX1+fX5+fX58e3x6fHt6gIWCg4SFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fX5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCDgX9/gH6AgX6AgX+Af35+fn5+fn9+foWFgIGAf4CDgX9+gYB/foB+gH9+fXt6e3p8e3qCg3+CgoKCg4KDgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgX9/gH+Bf4B/fHt7enx7fIGAf4F/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgX9/gYGAgoGBgYCAgYCAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f359gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgX57e3x8fH19fX59en59fnl+f398fHx+fX6BgIGBgYCCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSFhoOAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSFhYODg4ODg4KBgoOCgYOCf4GAf39+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fYB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCBgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXd5cniFhYWFg4SEgoKDgoGBgoGAg4GAgH9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgYF+f35+fn19fX9+f358foB/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAf31+fn+AfXx+fX+AgYB/f4KAfIB/gH5/gYB/f32Af35/f359fXyAgICAgH5/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGDgoKDhYWCgn59fXt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc3B4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYF9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/f359fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFh4SFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4F/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjHp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1/gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57e317enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgH+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gYCAf4CAf4CBgX+AgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhYODhIGBg4GCgoKBgICAgoOCgIKChYN/gYB+goOAgIGAgIB/gIB/gYGAgn9/gIGAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCgoKCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5eXx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19e399en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoKBgoGAgICAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDg4SEg4OEg4OCgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGCg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/ent7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCgoWEhIODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z0fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OCg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fX99f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dXZ/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKCgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhISDg4SFhISEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fICBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4CChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn1+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn18fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWLiYSEg4SFhYOHhoaEhISEhYSFhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXqDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4CEg4B/fX1+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3x/c4KDf4ODfYF9fn59foKDgXx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f35+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHh4iGh4SGhouJhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6DdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWGh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIaGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEg4KBfX9+e3x7fnt8fH1/fn18fn6BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYeGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoaFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYSGh4aGhYSGh4aEhISFg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5+fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWEiIWGh4aHhoiGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGhIaGhYaFhIaGhYSDhISDhYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeGhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIKEg4KEh4OEgYKEhIOBgICAe3t+fnx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx9fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aFh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WFhIOEhIWGhoaGhoaHhYWHhYaFhoWEgoSDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHhoiJh4WIh4aIh4aGh4eFh4aIiIeGhYeGh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4KCg4aBg36CgoOAg4N/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWDhYWGhoaGh4WHhoeGh4eFhIWFg4GDgoCDhYKDfoGBgX+DgX9/fn9+f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4SHhYaGiIaFh4SGh4mGhoiIh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WFhIOFhYeFh4aHhYaGhoWGhoSDhIWBgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhYWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhoeIiYaFiIeIh4aGh4WEhoWFhoWEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhIB/gYCAg4CDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx+fn58e3t9fn18iIaFhoaGhYWFhIWFhIOCgYCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYaCgoODf36AgICBf4OAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fH9+fXx8fX9+fHuIhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFg4SEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N/fn+Af39/g397gH19f4J9gIF9foF+fX59fX97f3x7enl6enl6enx5enp7e3t9ent7e3x9fn19gX19fHx9gH99fIaDhoaGhoaDhIKFgoWBgYB/f4CAfn+Agnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhoWFh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn99fX9+foCDfnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x8e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+foGBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4OEg4OAf4CBfn18fn58f4N9fH58fIGAfoJ/fX+CfH9/fX18fHx7e3p6enp5e3p6enp6enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSGhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSFhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag319gIF/fn99fHt8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ozg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dTV1NTU1NTU1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2tnZ2dnZ2dna2tra2tnZ2tvb29vb29va29zb29vb3Nvb29vb29vb29vb29va2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKiZKZmJiYmJiYmJiYmJiYl4yLioqKioqKioqKioqLhoGCgYGBgYGBgYGBgYGDi4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU1FibGtra2tra2tra2tra2lVU1NTU1NTU1NTU1NTVEtDQ0RDQ0RDQ0REQ0NDRlNTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dWZXBvb29vb29vb29vb29tWVdXV1dXV1dXV1dXV1hQR0hISEhISEhISEhIR0pXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiYW94d3d3d3d3d3d3d3d3dWNiYmJiYmJiYmJiYmJiXFNUVFRVVVVVVVVVVVRWYGJiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Oz87Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvNzs7Ozs7Ozs7Ozs7Ozs3MzMzMzMzMzMzMy8vLzMzLy8vLy8vMzMvLzMzMy83Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7OztHU1NPPztLUz87O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbX19fX19fW19fX19fW19fX19fX19fW1tbW1tbW19fX19fX19fX19fY2NfY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7OztGwgoOTzdKooNDP0aSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/Jm7q4m7C3nqOn1q+foanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Rw6KPf4nFnpqTncCemJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+eiqjTvpihnLSYnKKdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9G6pK2cobSZlq25hp6Wr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/RwKCek6mQm4GglnibhJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NKmsK6fgJ+oiJx5n6mFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRydfEnIK4r6acir2tppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxY2eoJ+Zp5eXnaWnlpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhycGhraGgwaKrpJvQn6uknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPVq42PqdjFkI2318KPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTBvtXS1MfD1tLVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR1NXS0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubm5ubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI+PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUUlBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZGNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxnYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXNjaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5tW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raGd1WmZyd3N4ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2JiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaHRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TFycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWR0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPDv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+6vcC5vbq6tL+4tbezr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYVxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3LxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVpeXFlRRURDTUlBRD1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcPDu7mztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBtaFxfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dndtcGBeZV1bVEo8Pj9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7KysrSyt766s7WyvLq8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU5IQT89SENGTUQ/Nzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6trSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXGZYXF1STk1BPkpCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCyse+wLi5trK0trO0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVpqVF1cT01IREZMQUZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u/v7m0tLOxsa6wubm2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSD9IUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rq2vsrK6ure3tbW8tK+0q7a6uMDEwbu1vL24sq2zsK+srra2srS0r6qknpycnJ6oqJ+gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lo5ujnJSQjI6PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxQaFRQTkdPTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxsK6vsqemr6OvrrXBurW3sre2srSrsrSuqquvsLKzraWekpiUj5mgn6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbCjpaeeoJyVk4+PkZCYkJaVmJefmJuZm6OZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0RAPTI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmjpK6lrKy0vLessrGvsa21r6+ztaqnrayjnJmUjpGWl5mZnKCjopudpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWmpeXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4emBiUlVfSElJS1NUSVJQTDg+QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yeo6iurayrq6+qr6mfl56lnp6lpqSgop+moKKuq6yttbK2pq+0q6mqtLGwsLitp6GcnZqUmJuakY6RlZGMj46UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa2xsbSpsa+imZydnqGYm5uamJmblJWalpicpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWU1RSk5OVUxSTEE3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOenaCfo6Cir66sr7Gstqetsa2mprCuraywp6CfoqCXkZScoZyZmJKTn52ipJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKerqLK1t7O3rLG0o6CdpZ+roaGioJ+amJaVn5ubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQk1HPUpIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm46Tnpmona6ep56coZ2empmSmZ6coqKgoJ2in5+en6mrp6ypqrSrq62rpaWrqKqsqqWfnpmSkpSYmZaWloyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaGroqmosamqqKenmpmdmqqmn5mnoJ+fp6ilpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXdtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7CmoJ6dnZeYlpmem5ykn5+dpJ2anZykoqSjoqqvrKepo6ChrK6uqqumoJ6eoaOenp6bnZyUk5WUnp6YlIadmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yup7GtscK2uMLGwMjKwMq/sLm5vbnCvbizu8XDvMK7t7Opsq2qs7Svs66prqOdq6e2sayir6Wgo6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rya2t1cnBnV1xRRVRIRElPSD5FQTNFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6WdlZubn5qenJ6lpqedoKCrsa6npKSjoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMy8zSx76/wMK9x8bCt8PJyMLAxb65tLm6tbq3sLWyqrqxrru2vru6qresqqq4urS7rq24o6WinqeloqOpppmbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfXpya2Rpb3hqZVpbRkpMRERTTERCRDc6Pzs1NDk5Nzg+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZWalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKfn5CWn5mSmpadm5mjoa+zqaGanZ2fn5qXmJeSjI+Wl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0dPM08/T08zKwsXGxsrHzr/I0MvGxMbEwLvDwL6+vrW9s62+v8LDxsTHw62+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQkA1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6Osnp+upqWxqsXGzM7Nv7DCqaWora2qoZ2jn5ydmqmTmaGQjqCTjZSSl5mksbGrpKCdoJuZl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1NXT08jMx83NydLMzdPNxMfJycDGy8bIyMW+wrOzx8TLysrOxcm/vb+8wcfEzMzIyb/Dv62ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3pydXVnYmd2aWRWV1FETUZASVFCPUI8OjIzQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOfpKOfoKSsm5aplo2XjYyNl6awrqWdnp2hpaGem5WUlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR0tTU0s/Rw9DT1tfV1tLLyc7Qy8bN0snS1dbZ1dfT1tjO0snO0czO0MvSz7/HxsnDy8vLzs/Fxse2v8m/0szLz8XJx7/DwsfOzNDQz8zKx824t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx3c3ZvY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ojc2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKbqaaipquao7Cxqai10NTX2tLHxsu0tsLGsrapoqWmoaKrtaeasaGWlYyQpq2rnJWYoZ2boaKfnJ2blYp3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czRztPX1tPV0M/S09HJ09HH0NjX2NHX0tfZ1dbMzs/JzNHLztC/xcHHxc3M0NDRyMvMwMrLxdPOy87IxMnGxsjLytPT0NXP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjQ0Oj01Mjc1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+uqqqsnqauuKirt9jU1dnZ0c7QwLzMybfAr6erqaOksbazo7aqn52hqqmhmJaYmpudoZ6anZ6UfnJlY2JfX2FfX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L083V1NHKz8zT1tLR1s3Q1dXRxdHUytDU1dbO0tDY2NjXy8jNw8jOzMrLv8m/x8jNzc/K0M3Oy87Ox8rP0MrOysLIxsnMysvR0szT0dDPz8q9yLmwrbu4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wbmtiZW5wYVdcWklGRkRMV0U7QDwzMzw9ODY4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp564trW1raWtrr60scDZ0tfa3NbPzcvD09DCwrKrra6sprOxuKuzt6mjn5yWlJebnp+fnZSWl5WJbF5eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Ty83Oxc7K0tLPxs7NzdTMztPNytfV0MzR08vLz9HTyc7R1dLV1crAycHFzMLIycLMwsXIycrOyszMz83Ty8XHz8zHx8rExsDFycvNz9DGz87NzczPxcfAt7m9wsO9w7mys76wu8PEtamYpaGZlpGVlZKLlI2akZSUj4+UgomFeHBxa21oYGBxaFhYaFZNR0xJUFBCO0Q+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHw7nL1dbZ2tvYzczPydbWxcS4sraqpK6submxssChl46NmJaQk5KRlpaWkIx8ZWJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnEycnGxr/Dxc7Ox8XHzcrRyMvOzcbR0s/OzNTKx8rNzsfHz9LL0M/FusS+xsm8wsbIzsTCx8DGzcfDy8nLz8fDw8/IxsHGx8O+wMfLy8vOwsrLyMfLz8TFx7vHwsjIws/Avby/sMHKx7q9qrCyp6WdopyYkJuQpJmXmZGVmImPgndudGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbOxrMnNysjEvr26zc3G0NXV2drb2NDK0NDS1MrFur6+sKi3q765ubOlko6OlpCGg4SEgn6FhX90YFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83Eur/Du7u6ub7IxsLDwMPHysnIysfBxcvGyMvNycTCysnBwsvQxMvIv7nBusXHvb/Gz8rDv8O6ycfIusfGxMrAvcHLxsXDvcW8vL/DxMvExLy/ycLFx9HFwMi/ysnGx8bQw8PGw6/Ey8fEyre/vLq0qaylpZifmKyjoaWao6CblHt2cnRmaVphbm1aW1hRRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDx83Pzs3V0NbZ2NnQzdTOz9DLxLjGwba1vLHAt7qtkYyTl4d7gIWGgHZ4dXJwX1pbXWBhYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwbC2urKytLKxwby7u7m4wMHBxb69ub2/ucTKxcbCvcbAt7vEyb/Cybu3urrFwr68wc3Cxr69tcC9w7q8xrvCubO8xcPCwra/tbW+v7rLw7y1usi6v73Lw8HFwsXIxcjF0MbCzMeyxsnDzs3BxcK/vbK3sLOnqKi5saWtsKutrJR5dndqZWhgaG9jVl5ZSkVKRkhLQUZCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Oz9LJ0cbW1dbYzszQyM3IysW+ysGytbq3u7awkY2Ki4V5gIaGgH6EfHR1ZFxcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wLitsLCnqq2sp7i0trSzsrO6tb2xt7C0rrK7wrzBxLy/urWyur7AuMe4tLu1wMK8t73GwMO7tK6ytrq+s8S3u7WruLy9wL2wurWvtrqyxby2rru/tLa0xby+w8W/w8TFx8vFwMbGu8fLv8/Jx8PGwcO3w769trm+xr+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJDQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzc7Jy8nMysvG0c/T0c/Iy8bKxsTAvc+9s7m9ubi3nI6HiYl7eX6Ghnd4gn10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+5uLWwq6ynnqKqp56rrLOtqaups622sLKorqassry6tsO5urmwq7W5u7TCurC/sL28u7W7x7nCtq2qqLCxwLW4vK+wp7GztLu8q621pa62rrqxsKq5r627rru4u7+/vbnCv8bCxcC8xsHIy7jFx8W/x8PDusTGwrvFyczLs7nCvLqyiHJ2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbP0szExsHF0MjPwsTHwcbGxcXMxMvMwsTByMG6vLvKt7S8vba1q5GJkJB8eX6KhXp7hIF3bl5dXV1dX2BfX2RjYmNjYmBfXVtbWlpdWlpaWl1kbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrraOnoquprKqwo6afqq21trG9ua+3r6iuuLS0vLizvK63ubSxu8Gxwa6lqaKssbKzp7yqq6irrK20tKaorqGkrqmypaeorqWot6ywsre5uruxvL2+vsS/tcHBx8i3v8DFt8TCv7u/xMO+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFpSU0tGRkU+P0A5Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe6xLC2sJuZlZyYqqmwsbO1va/G0dDNxMi7u8zDzMC8yrnAxsC8zLrDx8W6vcS+ure9xrm2ubuuspWDiY2Be36Afnh0f3xzd2ZfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnqSbl5Gho6qjop+lpaekrJ+dm6SmrLKvtrensKynqrSrtLmwtrSstrixr7q5sbekn6Ofp7Gnq6i5qqSmp6insq2gp6aem6SmrJ6fp6SfoLGtrayytLKzsLW8trvBwbK6vsPBsrm6wrPAvb+1uLu9vrzCx8TCw76/w6CDd3BrYWVfa29gVVlfSE5oT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG7vrWgnpSdoaa6tquzs7uzxdDJzMPHubjJws7Busu5vci7t8i7t8TGs77FvLewucC7sbO3sKKEh4eCfXl2dG9ta2pqcWlfYF1cXF1fYF9hY2JgYGBgXVtbW1xYWVhYWFZYW11eZGNiZWdnZ2ptb4idqaCXlZqhlpuimJWNnqGippufn6OloaeemqKbn6qwrbG1oqmqqauspLW4rbevrLK0rrK0rrCqn52eo6KypKWpuK2hpqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqusrbCyuK+4ubuwtru7uquysrmyvbS2sbG1tL+1vcC9w8G6ur2Xgnpya19lXmRkWFRYXklXXUtQR0lKRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bQycnBx7y8xcXQwLzKu7vBu7bFuLXBwbPCxLytqrW6t6ixs6mLhoiAeXNucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1pbWVhXV1dXWFhYW15iZGRlZmZoaWtyjaidlJSUm5iboZaWkJyhoaidm5ylpqGkm5+gmpitrq2usqCloq2rp6G1sLGxrKeusqe5s6a1oaKemqOiraKhqbWqoqOmnaWmo5aYnpeYmp2fmZednJybrKGrpqOkpq2rsrOqtLCyqrK5tK+pr7KysrezramsrrG3sLq2ub2/trKxlIR5dWVeZV5bWVZTWlVLW1FMSUVIS0lCPT9BQUBAOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vr2/s52lo5ilscK1tr2ttLjDzcnIwca4wsHI0LrDxsC2vL22w7q2v8G1u7+7qqaxu7Gosq+bfYWFgHlwcXRxaGZkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn52onJqaqqavsKubo6O3qqCfrqi2qaamrLCjt7CjtqCim5iYqqahm6y4r6KhpJyhn6CTlaGUlpabmJeWl5yUn6mdqaOhnaOqqrCtqLSrqqatsrClqq6ysa+wrq6np6eyrrG0r7y0ubauo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xLRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ejqrvAvcC5rrS4ws3Ix8TFvse6ys21xMXFsb/AucDBusDAubq9t6iosbumqaKliYF+eHJqbHJ0cGloZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbXFpYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSlpp6cn6Sfqq+mn6KjtqigoaKos6Glp6SvpbCsq7SeoJ2VlKmhoZSssbCeoqKdnpibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaSrpKWwp6Wjq6utpaiur66rqKqqs6Wmq6+0sa68tbGvr6CSenZyZGFcWl1YTkxRR1JhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sresnqSnrbe7vMHFurG5tcXKy8HEx8fJuMjGtcXCya+6vMK8w8DBvby3uramp7K2nqKKmYiAd29kYmdpaGZoamdqbWBdXFtaWllaXF1cW1xeX1xaWVtZWVpbV1VYV1RUV1VTVFJVYGBfYGFfYGFjZGmBlJOJkY6UkpOclJWWo5mglpygpaGtpaOjoqOhm6qqpZmepbGpoKCdpKqdp6GerKypqK2soqGhlJejm5yQq6mwm5+inp6XmJOKnpKNkpOVj5iYkpuhopykoKGVoKGjpZujq6WipKqjq66krbGppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZVUUZRT0haXE9SSVRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKyyrZ2np6+5ubPAyLq1wK/Gyc67wsvNybfLv7TAx8ywtr3Iu8LHxL2/t7q1pauwrp2ah46DfHVpamptaGpsbmtrbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl5fX2JkbY6PhJGGj5GOmZOUkpyaopyboKeoqqeqpaiko5ikrqSUmaWvqZ+bmJqgnq6Zm6qzn6WmnqKjoJSTm5aVkqiprZqcoKGgmpSQjJmOi5CMkoyWlJCdoaCjnJuilZugoqCXoqijoqiroKuvpK23paOjoqytqairr7O4sr21s6uvmINycmhbWFlTVVJFWUxQXFlNVE5QTFBSSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtqLO2rqmor62bqaist7asvMq7tr+szMfGucLP0Mm1xr66vsbLtbG9xb3DxsS9wbO5r6arr6uel4aBd3hvbmlubm5xZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4uQipKNl5GXmaKgm5+qqaatqqavoqeZn6yglZakqKedl4+OmZ2ulpenqpmfnZOloJ2RkJKSkpWnqqSZmZqdnZaNjIuUhoiNg5CLkpSQoJ6go5eVn5WaoKKdk5ulpaeoqKCxsKaxvKefo6y0q62nsLSwuLXAsa2xq5B9cHJiVlRVTlJJR1ZRU1JMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurzDy9HMs7m6vsDEx7a0t72zu7zEvsKxtK6xrrGsnKKIa2hub3JvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFpZWVlcXF1haoB6f3aJjoeQiZiJlJSXm5mdqJufqqSkqpynmKClm5KPnqKal5aEg5Gao4+TopyVlZaHoZqak4uOio+Zo6eclZWXm5CSh5SOjIGLjYCQipKSkaGan6GVk5iYlaKlmIyZpKaopqGgtLKnsrehnaK3rKqtpLKyprW8taursaOIeHJtXU5QUUxPQ05OTlBLRk5OS0pOTVFITUpBR0tISEM9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6SppaCppaSzqqKyw7W1srPHx7i7xMrNx7WvvL+4vMSzs662oq21xLq7r6qstK+voJeofV5gZ3NxdnFqbmlmaGhqX1hZWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVlhYWVhbXWFvc3ZwhIiCh4CRg46KlJGTnaCOmpuioKOYpJahm5WNh5iajHONgn2NlpaFkJmQk42OepiOnIyCin+JmJ+inpCTmJaEjoKTfn5ziY16kIaSkJCdmpmakJWPnY6io46JmqChpKOborSvrK+sn5iluaalsKGwrpywu6qpr6qZgXZyYlZMUU9QTUNTTkxRTUNQUEhJTlNNSEpKREpMRUtLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3d7eho7SopaWoo6alpqams6eltMC4sLSwysa5usLPx7+1r73Dr7HHsq2nrJWkrr+4sbCfp62tq5aVonJXVl9oZ2loaW5jamhnYlxYWFhYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXipOQnpeclZSWlI6WiX+TiV87V297i5OJf4uRjI+FhnKKhJaBeYJ6hZOdlIOVjpCPgoZ9knhxb4WMfYmAkI2Pl5mYk4qPiJyInpeHh5aemqGgl6evqK2pqJ6WrbSipq2YrKuYp7Ohqa2jkn1xbV9aTlNRVkxEVEpQTUxGT09JRUxRTUtPSklNUEZJSD03NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXi3oKOuoaamqqCnqaeiqbCop7TBubG1sMnDubS/z8C6sbG4xKuuya6no56Gm6K6raeolqalpKGXj5ZpUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l6gnRQQkB/lZGRfYmUjISKjZqMlpWKkoiGlYZ5iH9gSlFueIqRhHyEjImEf39ufn+Ud3V2eISNmXBRjYiKhnt+eJR2Z3eFh36JiJWKjZCSlouDiYeUhJqMgYSSm5aenJSko6eppaOem7GroaSkkKaqlqGpnKKmqIh0a2VdW0hRUVNMSVVNU0lMTFBJR0ZLTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49Nzs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl2tpyip52foa6hp6ilp6ivrKq2vLa4trPCvLeousm5t6mqt7ittsCqopuTg4+Zsp+imo2glpmUkYuMZU1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/hoF7hYySgZKZi497ho9/dX94c251cHSNjYF5fYmqhXl6aHZ7jnBybXiAioySeHqAe4B2cnKSd2d1hISEhHqViYiKjIuAf4OKjH+Tg3uAj5iUm5WRn52onp+gnqCppZ+dmIynpJOgn5WdnqR/cWdgXFxKVk9RR0tYUk9KTE1SSkpKTVBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC4vMjAwLy0rKCgpLjEyNjIxOTg3OTg3NzU6PDw3dq6Yo6GYnJ6zqa+ppayssLGqvbSyvLi2urWyoLe7s6udn62rrLWzpZ6WkpiGlKSWnYyDl4mPiYaGg2ZKSUpJR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWVhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYF2eH+Jj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgH1/dGZ2fIVsb2hzfImMh4BseXF9cG11j3FocYB9jnBDioSCg4V+d3d6i4V9i3p1fo6Sj5iKkpqbo5eZnZudnqKdlo2KpJuPnZeOlpiOdW1rZWFZV1hUUUpSVVRPUE5RVktOS05PSlFPSU5PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+elqCmr6yuq6epsK+xrLy4rLu+ubOtqJuxqK2ckJeep6ynpJudk4iWfo6VkpWAfIp6hYB/f4FlSkdIRkJAQ0RJTExNUVJQUVNVVFRVVldXV1hXWVlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4b3x5iI95fIuFb22MkXhzeGpqf4JylpGLgX2Wf0mSmG5od36CbGljbHmFkJKGa3NsfG5ye4ZobXB+c42Ig4V6fX57dm90c4WCeYF3cHyOjIqTg5aXmJqQk5aXmZeel4yDiZ+RipKMhpCWfWxobW5tV1VXVFFRWU9TVVRUWFVNTkhNSk1OS0NJTkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepK2voq2qqLWvrqy0v6u8wr+mo5qVpZiejoWMlqKkm5qUl492kX6Fi5CPfHh+dH14dXd8Zk9FR0RAPD4+QUZHR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqckGZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouIdYGIhnRsmZF0c3tqa52OTHmEkomEjmcxdoZzbH59g3RmZXR+hISFgGZpbHVrcH98Z3Bwe26SjY57c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJWPl46AeYiXiIaJhn+Qh3VpaW5nY1dRWVdYWVtNUFVWWllOSUlFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNi0rNTc3NTQ3OGlPODs1bpKImZGalqSorZ6ynqa6rquysMKyu8PHm5ePlJmLjoZ6hZGalo+SjpKJdIqEd4uPjH92d3V4dm94c2lVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfW1xg4GFgXmEhoZ5cqCUdHiAc3WUhzVxnaidjqGhhKKEdnCGfIZ7c4ytjYiAaGZiaW1xbW+DdWlvWHVvjpqRdmx/enxtcW1wf3pzdW1idoR/hoCFkJGKi4mRi5GMi4+DdXiLj4B+goB9j3hwbm5qXlpbXVtZWGBfU05bWllYTEhKRkpHP0NBQkc/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5WltKitsa7Bs7rBxpeQjJSQgYl9boKRk4qEi4iQiHaEhW+Yiox/eXt7cXt0fGtvXkpQRz5ANzQ1ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH2Fg3+MfnaimXl+hoCEmYWbnGGGqp+di4KQjXp2iX6Jh45zipePg3tcZHF0ent3imxnaWF5b4WPgnpugXdzhHpwc3l3a25pXXeHfYd8iIePgIuTl4ONho2GfXGEf4R8dXd7fYh0bXFyZGVeWlpdU1tmXlhRVVlcVkdLS0VMRz9GQERDP0FBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHeJf5SMkZ2dn6aRoKqfsKmvwLG7xrqWj5GUiHqGdmuAjJKDfouFkI15hIJ1ooaNfn6CgHODgX1seWxTWExBRTMxMTI2NjY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl7cXyPjHt8iYZ+l4d2oZmIh4+SlKWNrKlIhq2vr4qAgJOKgouChJGoh4CYmIqcc2x8gYaHfY5oZ2d4fm2FhoGFcYSGR2uAd3F5dmhta193fYOIf4iFjHqVnpyKi4mRf3t1i3Z8d21vd359cXFwalpbW1pjYldnZVxVUFFYWlFETExHT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYeRj5aYkpegnayhprivs720l42Si5iLfXRwf4qTf36Ng5SVfYZ/h6WHiYCDiIZ5iYuAdYV5X2NWTEM2MC4vMjIxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYmRgZqWgqChmJWbmqWtk5m7sae7x8OnioyhpY6TiYGQe3KDnp+RnH52hYWLj4eQaWhvg4B0jIaEi3GGgneHf3t2hX1udnVngZSPhomIh4mIoaujlomOmIB7gol6em9na3h9d3xxaWNcWVlcaFxhZl9aT0xOWFNRSVBLRE5HQ0pEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O252cGd4g3uAjICBkI+LmpqknKGspquvsJeSkYShlIR4d4CNlH1/koaTln6KgZKbjoSBgoyLgoqOhICKgG1wal5DQTQtLS8vLy8wMjIzNDc3OTs9P0JESEpPUVJTUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoZKjqaWjrJOotqKnwcKuyK94upSafIyhnpiEk4SCj6Gek5mShIqFj5iQlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhl4eTiY+Ql6W2qZuNlaKDh5OEfn9ramx9fn1/cV9bYl5ZZmpcbGtfWEtIUFNRTk1MRklRRERORkJDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcINwdYdxdpGGfpeWmpSfn5unoKqWk5ieaGakmn6Fk5J6gZKJkpJ9i4WZkpGDgYGLjomGkYeEiIV4eH9oTlI+Ly8uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6aimaGXopWcn6ieqaufqKypqrWXq7+rtsjJt8jRz76boHBpq6mehJORhZygmpqZp5GRiJWhmZp3en6UmJGhkpaXgZSee3aVkquziY2XoH2VnpyOk5aapKOntrCdkZmoiJeQjoGIbHNze3x5bmZeW19eYWdjX2dnXFJFS0tRT0lKTUZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDU0Njk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmM0FAaWJeUHF1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJiJiNeYKNi46NfIqGj5COgYOAiYyJhZOFgoaJgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUZIQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKyoqbWssbeysq27sbO+nLPErLvJy7jDv7elo7CyrK2qo4qWmIWlpqCimIKmmY2iqqekh4WTo6CgqqGkqY6csYuVo6e3u5yho7CTo52jnpGkoquwrrO1opWmqomaipKKlXp7foN7ZV5mWmNgXWJiXmZnX1tPRElIVE9GSExGS0dGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBlIWIgpuDkpGMktrInZZzVpeIj4icj3yGjI+LinuIg4eRjoOFgYyGhYiShoKEiYaHh4dxbmFARTY0PDMvMTEwLSwrLTEvLTQ/REFOVlFSU1VVV1VNXFFHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Srs8W2rbTAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbCxm5mSmp+Jp6+qpJV3n6SXoauxs5iWqa2orrW7srqsr7Wisayytby4ta61oKioo6ibqbCts7q4uKicuKmNpY+Sk6CGeYGAcldfYlVkYGBhXl9mYFtVSkRFTFZRSUpKRUpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMXFpRY2RXenVxgZV9hIaTdoZ+gI17v7ujvIK0lJOOm4+EiI+Tiol6h4GMk42HhYGOgIGKj4aAhoiFioeRenluXVdARU48Njo0NkFCNzY0Ly82Q0hDUVxPUVVYVVxXT19VSUtKQUA+R0tGRkQ7PkA3RDc/QkpKRUdXVFBej6StpLK0w7a4wczKtrvEvbO0wbe4wrW/sLh0sbSmusWksMa5sbOytKiktraqsaCilpuikqWxraWtrKekmKCss7qiqLK5tbu+zL/Fxb29s8K3uri/uLq4uq2tsaaxqq6+sL28wsOsmbuola6PmJiriX6AeWhVYV9WaGNoZFZbY1lWVEpHR0xSR0RJSkFJRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlWWndqcH+PhIGOhW97cniIYrmhmaOJlZSWk5SUjpCXkoeHe4eBjpaKgYSBinp8i4iGfIqCgYuElX14enVlT1xkR0VMOlFkYFteU0Y/O0hQRFpjUVFZWVpnWlNgYU1TT0VBP0lKSEVGQUBDPEQ2Qj9IR0tNU1pUXpSvuLW7ucnAu73Kzby8wby4try7t761urPGYXWypbGanqu+qqWoq6qkorK1oKunnpWWnpifrqWnp6Weo5Oip7CzqLGyvLbBvdPJydPGwsXMwsrDwb6+v7y8uLSwube3w7rGvsTJsJ66q6Ksj6Wpt4mAfG5cXl5cVV9dZ2ZTWWFWUlZJRUZOS0E+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSsvUD4oLjQ4gH08MkuIcTk+Q0tFQEpNUFJMUV1obWxxj42GkHNscnJ0iNXAtZqgjZWZmZGOl5KWlo6GiH2Hg42Win6Cf4N5e4uEh3uLeYGKgpd/dH16a2VwdlldXFBlZWJgZWRdW1hYXE1kbVVSbW5fb19YZ2VVWVRKREJLS0hGSEhISEJJOURASEtUVFZdWlyTucC5vrjGwbu5ysu7trq2uLm0uLW1rra3mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUjpaYl6iepp+fmpmDo52spKqwrLewvLjU0M7Wz8nM0szPzsrHwMDCyr3BvcLAxcTGysDJz7SkvLG1sJysub2afXZpW1xZV1tfWGFiUVxhVFJMQ0JGR0U8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy4mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENER0tPRFJcWmlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIuJfIGEc3uKg4V7inSBioeVf3R7eWxtdXxpc2VpbGhmamloYGZpaW1abXSXraS9iIdnW29oXVpZVEhLT1BKS1BMU1FITEFKRktQX19iZ2pil7fHsLq0u762scXHtrC5sbG7rbOxqKu4rY22qJ6cp5pOmp6Mj6CWkaeYpZWKk5OIkYmPkZKdm6GYm5SWh56Zppqsr6ivp7Oz1NTU1tHLz9PUztPPzMXCytC/ysnLydLIzc7D0NK4sMS9xLqmt7vEon9rYVpaW1ZeVlljWVBdWE9SQ0JJRUNJO0FEPkJIP0BCODtEPkBJPTU2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkZmDaHJveXmDoaqeppeMm5uYi46VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj35xeXVscHh/cntueHNsaYBwbWNpbnB5aXd9fsu/w9+nbmN4bmRbYWBKUFJVTlleUF1dTVFOVFFVVFxubneDcpauuKy1qLC2q629wbKrtaaluaesr6GstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEi4OUlZeXlJuQm5iZmZ6dq6ykp6KsrM7S1dHNy9LT09DU0c7Iw9TRyM7S09PXzdLRxdLWxsHPyMjDqb+40Jx2a2JaX1tUXlFcWU9QVFBOST5BR0JDRj1BQj9GRT5APzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd2x3cH1+gKCenqGMjZmTlIuMk4+WhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAb3dzbHN9fHd8c4J4cWuAcnJpcHJ6eXJ7vsuaf42yhHZyhXdpYWldQ1paW1dmZFhla1RYXV1gY15jeHt/i4GZqqSkoqChqaaqsbmrprSjoq6ipK6ip7GfiaablZORipKPiIKUiWuVoo2ZhIGGfpGDg5OXrIuVjpWajoWSkJ2Xp7CioKClpKjIzc/HwsvR09HU0s7TzcbW083U2NbW2NXX1crU2s3K2NbRy63Ew8uIb2xfXFxWUldSWk9KR0lKSkA7OjtFQkQ9Q0Q+SEM/Q0I7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCioCdlZ6UhYuWiY+KiY6Ij4B4hJSZi42IiIuJfoN4c3x9hId3gHuHkZeBhG94cW11f3Z4fXSGfHlsh3Z0bn12hXV5e521jDxBi8alfo19amVXSUNlY2ZjaGpkb3lbX2Zoa25pboGDiZGMnp+gnpGXmaCjpKaypKWyoKKln6KpoaKxnIefkpKTkYuPi4eEj4R+nJyMjYKEhXqUf4KqlqOMkouYk4t9l4qakaqzmJqcp5ymvcPFuLbFzdHQ0tDL0svJ1M7R1drX19jU2djN2NvOydra0ta/zM20dXNrYVpXUFNQWFVFR0pJRkU9Ojc6QEJDOkhFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzIqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0I+PDlRRUNKVGxub3BicXF0ho19l5Gei36HkoKJhoWKgoh9eIWXl4mPg4eGh3qEeXF7e4WGdXqGjo6deo1wfXBweoBye4FyhIeAbo56dXd9fYJ1f3yHibB0WarCt42SgXBuYz1eaHJwcXBud3eCZWlvcnZ4cnqLh4+TkpuWoJaIjJOcn5ufq6ChrJyimpqgpp+frJmMmo2Rk46FfYiHg4WLjqCZk4iDh35smXmEmYaIk4yOlYyGe5uIk46tqpSVl5+Ypq61vKitvcfLyMnLy8/JxNLK1NfY19jX1NvX09nb1s/b2tLWydXMk3V3ZWRYV05RUltHQ0ZJSD5CPj04Oj5APD5IPUBCQUFFQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxBPDo5RD9DR1JrX21kYmZsdoCIcZGQm4B5gI5+goGChX+EfH2EmI6HjH+Gh4F3g3lue3uHgnR6kp6OoXaPdoN0dYF+dICEb4GQgm+ShXV8gYV6dod8ibjGpcPKuIKWnI94cGVOZWOCeoJ3haGQi3l6d3uEgHyEdm2UlpWWkJiRg4mPl5qXl6admKCXn5OSl6OemquWkZGLjZODjIWJiYGGj5GenJmIhYuBhZd6iImfl4+JjoqLgnyhiZCKu6GYk5eanKimpa2ep7W/v7+4xsnNzsXNydHV1dTZ1dfb1NfZ2tvX29rZ2M7bxoN2dmRmYV1SVVRUTUtETUM7PTw8OTo8Pzk9QTc+P0A9Pz49OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47OTo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1caXR6eWyJjZJ3dnqLfH6Af4B+hXt+gpGKhYZ6hYh8dX51bXx9h350f5KdkZ+DknyHfniPfnmLim+Dm4F0mYZ9goqFfH6Re5Cpj5DDoL2Mm6ScfYmFfYlzjIt/c6aanJiUhXuPkYmEaUdxoaSejIyRkoWIi5CSlY+dm5OUkZeNjJWfnZShlZOOjpCMf5CPjouEiZKWmZ+fiIyUkZ2Qgox/ppmIhY6DhoSApIaKi7eXnZGUlqGmoJ2dnaOutrm0q8DGytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27Z2dXRnZmJUXVlSTk5IQ0xDPT0+OTk7Ojk5PD02QD4/PT05Ojo7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTzxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5PzxEUlNSWF9WWGZtbW1pgY6KcXN5int7gHx/fIh7fXyLh4J+dYOGenN6c22BfoV+d4aboZuelJKAjIh/mIeAnJJuiKmFe6CMfJGOg4mEnH6bkYqNo6KfkaSvoIuRi4WLgZOGV3Kti5+rm5CDmZyQj45bg6KRgo2fk5SMhoiMkpKMlJWVkIyPioiWm52PlZaSjJOUhoCLiZKOioqdl5ijooaTnZWgi4qJjpyQg4iPgIOHhaSEi5CymJySlJehoJ6Zkpudp7K4rKW9wsfNyMbPy8/MztfP0dSu1tXY2tja2tfW2dqdbHlxY2NaWlVRVVZDQElDPz8+OjQ4Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnhsYn6Rg29ueIt4en97gX2HfHx3hoWAc3CFgnt1d3Z0hYOFfX+SpqKfpqKXip2QlJeLiqiXcoqyjYSokoSZlIWajKOWoJiTiZueopOpsKCRlZGOjoiWjG+Nt4SaxMiynKKmnJyYlpGxkGSkzceVjoaHiZCSjY2TlYqFioqGlpmbj5CUk4eVmISAj4uZiI6Qq5eXpKOImZ6WmoiPh5eXioWPjYF/h4+liI2TqJqXk5aYoZifmZOcmqKytKWjvMG+x8bFyMjJwsrTzM3UqNLR1tbW2NrU09rOf297ZGBbW1tNSFNZQkFHRDtCPjgzNzs8Ojk+NjQ6Ojw6NzI/OjkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBjn18bX6IeHp+e4KCg393doCDfG1ui397fXh4fISHin6LorOno6uzopenn6WklpWuooORuJWSs5qMoaGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJqXocCOo8m4q5yjpq2Ykpudsp2FhqijnJiFiYmOlYyLk4+IgYaHiZOYlYyLlJOHlJiGhJGQnHWRmbKVlqShh5yZkpCLkIqXm4mLlo6GfYyYnomQkJuampOYl5+ToJ2Unpugsa6io7e+tMXHxL3Dw8DGzcrJ06bOzNPS0dbY09DYum92clleU11UTkdJTURBQ0Q1Pjo3Nzo/PDw3PTQyNjY5Nzc0PjU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTVpcWUpmYDtIhIt6em6Fhnp8hHiBhoF+cHh8fn1vc416foJ8eIaLiYaEkqa7rKixvbClrbOzqKOisKyKmrWdo7illa2ll6mtuKeko5+aqZiqpK6wqpqZnJSWkZegmJq7u67KoWq2uKuwlJmfo6yTl76jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJOWjJCVjYuNlpiTnZm0lpWrnYqclJGOkZKMmZuKkp6Qi4mWn6GMlI2XmZ2Sm5ielKGglJydpa6ooaSzuKzCyMS1ur28xcfHwtGgxsnNzcXX1tHL059td2VZV1BbT05FQz48QkFCOEA4ODU/Rz08NTwzNTM0NTQ1NEI0OTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkSGJgYnBKQIuKfoBzhod9goh1g4qCf259fH1/cHeHd46Ch3yNj4yGjJmpwsCvvca7s7TAvbStq7O2jKiyrq69q5u7paetubirpqaioqSjqa+ysaqdnKSZm5iXn6KmpZKkuq+pwLytrrK5paSofoiGnK29sIKLjIuQg46DkY96gYiQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaXj5GgkYmUm6SslJaPk5ydk6Cdm5ifoZSanqempKKjsLKmwcbDr7C6t8XEw7/NpsfEx8S91tDNxMqFcG9eWVdcWExKQUtARUc+QUBDOzo1PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTjc5R0Q/Q0ZcZUZgaWdaXVyTjIyJe4eMh4OMdYeRioFvfnuCf3F+gXuVepKUlJiQk5ans8bJv8HMwsO5x727r6u5u5izt7qywK6lwKSrr7y9qq6ro6Oep6uutbCqnKCrnKGclp+vtaeLo7q6tsG8rKmds6WkqJSFjarDw6SCi4+HiISGlZSNeYONkY+RoYyMlJKOiZefmJOZlZemoK+cjKucjZaPkZGVlY2RlZKPoJSGl5+gsp6UmZOfoJiknpqfm6CUmJ6lo6ampK+tpcDEw66ot7bJw762z7LEv8S8s9HKyMK0cXVpWVVZZ1FMSEJMS0tKQUI9Q0Q8NUFFOzszPThCMzMyMjYyQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVpNZVxmVGJrmY2WioyIk5CGiXmHlJCBcoB7jX94h4KCkHqNoZaomZqZur3HyMnB0snLwsy9wrOtvL6ousC9u8S3rMGprLO8vqqwqqSlpKyus622taGfr5+lopijs72qm6i9waS2uK+slLKsrKyXhpqppqWRgoyTpZaKgXWKknmFjpKQnqCTj5OMj42Uo5mWnJWUo56qnpGlmoyPj4+Vloh8j5WTkqOalZ+inLWlkJ6WpKOhpZ2dppidlZeapKOpp6KyrKi7wMOvpbO3zL+5r8Szu77BuKzCw8LAl2p2XlVUWVhKSkxJRkRESENDQURMOjRESTo7NDw4RS4xMjI0MkIyNlNITzxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmlIX1hiWmNjVp6PnI6Xjp6SiYp/iqCThHiFf5Z/fpCIipGAlqGZrqekmMK9x8PHxdPOzs3LvMK3sLq8tL3Lu8PCtre8rbO/ur2ur6igqai2ra6psreanq2jp6Gdq7e4qqWwv8Syvbm0qKu2tK6ul5alrKifkY2SssWnlo58kpV8h5KZj6qZmJOTj5KVk6Sdk52Zk6GjopyYn5iLjI+OnYhakJeXkpekmWWYop+zpZWhlaurqaabnqaWmJaYlKGjqKWetqupubvDtKW0tcvAuKq2q7K7uK6ouLq9uIBoa1dUUlNNRUlSTEs/QUhFRUhHRzk1Rk07Pjc9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PkBCRkJwRWpJUmVhTEallJyXopeployRg4imk4iCh4KchIOVkJCUj5qinq++r6HGvMTExsbOz87Syr67trG6u7u+z7XDvbi5t7OxtbO4s6unnKusuaqpp6+wmKOvpaejpbXAsKystL/DusC6tKe6trm0r5alra6upIuTlKGNdMKafZeZhI6XmYyxlZualZKSmZmlo5Wgm5eaqZ2boKCZio2PlZxgSpacmpSapZZUlq+fr5yfpJSuraqkmqClk5OYmI2cn6eimbSoqrO7u7uqsbLHwLmmrKutsrKjobKytKRtamJZV01PSkRPT1BSO0hLSUdJQ0M+OktVP0E6PUVNMDc1NDQ6QjQ0TVdPO0pLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpaZoKKor5mRl4eLqJaOiJOFoIeEnZePnaGao6S1ybWpxbnCw8jKyMjMzca/u7OuubnBwcy1x7rBubW6sK+vs7WnpJuqtLSqqaatrJqkrqWkqKy7v6istre/wb++ubOyxLK5vq2jr7WsuaaIm5emm3a/n4SZnY6TmpqMrpehnJyXlJugoaieqJ+ZmqqaoaeemJCNkZ2DbnaSopqVnaKdka6yo6qUqKqXqa2jop6kp5GRmZyHlJ2inpaxpqmruba9srKuvrm2oKOnqKWmnJutqamLYGJeXU5KS0ZHTUpWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc2P0I3NVVYTz9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh+ZV5IRauVm6Kfu6+ZlJ+Mk6ubkZKTiauNhqGejKOtlKOjtsa+tMC5wsLHycXCzcjBvrmyr7m0wMLJtcaywry1uqqora2wo6OYqrS7pqmmq6qdqa+no6qrvbuorb21uL7HvLe2uMKyvsG1qrW2q76lj6OYkqKgvJ+JmqCZl5+ej7efqZylopucoZqopLOgm52mnKiqnpiVj5Sbi5aJjKShlJ2inaC0r6Wkkq+rmaqqnJyjoqiQlJSfgo+enpuVqaShobO0urStqLWys56co6Wal5WYqqGedV1aXVtIR0VGTFBJTUVHR0JTTEpCRUdBV1NDSD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWZcRkNDnXBiR0Wnl6OfnsOtnJelmJmpnJaamo+qlpWnppWtrJiiq7bDw7y+tsHCwMfEv83Gu725srC5s7/Cx7W/sLy3ubampKurraChmaqqxKKkqaumnqyvq6Kpqb64p62/sri3x7a1ubjAssDCt7WztK+9o5ejl5SclK6fkKKjpaOjoJC9pamdqaucnKGbpZ69oZmjn6Kpq6Gdl42VnpOeh4+EjZOfpKCetaymnJWwppmvpZyZqJyejJiUnoOOoJmbkqWkmpersbWxqqWqrqybmKCgko+QlaielGVfV19bTUhHSU5MSEVESUE+UUlBPEdJSVxST0s9SE9VNEJGOT5IRzVDYVtLQk5SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTltUkY8S3hlYVZLopqjnJ7FrKGerJ+drqCSo5+WpKCmqayYtrGiqrO2xcS9v7XAwrvIwr7Kx7W4tbSxs7S3wcW2vrG4tbm0n6esqqydnp6lpMGln6mtoKSpra+hpqi9taaxvbm3tsSytLi6v7TEwbi5rrO1taOdpZWSlKGuoJminqmorKOawqypnqyum5uemaagvaGdpJirq6ymoZqNmp+SnomOV3+Wn6WhoLiqp5OYtKKesZ+ema6VnY2Yk5yBjp+XlY2ho5WQpa2yqqmioqWllZWdmIuPkZKknolfYlhiX0tHSkpORkVBR0s/PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTZ6eoZmfxKilobSinbOnk6uloKOfrKmsnbuwqKy2scfFwcKyw8O9xsS8xMm8r7C2rbC0r77EtLmxsLq0rJmosamqmp2loafBrZussZuqo66wqaWpvLant7u+r7fErbOzw8C0x7S7t6yztq2qoqaWlZWkrKKfoJunqrCvr7uxpqCpqJqZmJOio7igoaOSsK+spaafkqGelZ6PkI2Vnpuinqe0p6aMl7Kboq2ZnJqsj52SlZKZf5GglY6Nn6CTi6arr6SmopygnpGRmpOFi5GNm51/X2NZZmRJSExJU0FDQElIOztGPzk5T05WXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MjUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSeo5+coMOppKqzoqS1qpazrKehpLKsrqm7sq2xtbTGwMTCtMDEvsnEtb/IwbSrtaivuKy/w7O3rq22uKWYqrKrq5ifppetu7SbqLCarKCttLKoq7myqLq0ubO4wKq3ssS9tcaov6+ttrWpp6yhmJeSpqWiopiYpa64rrK1tqCfqaSalJaUpKC3oqWllq+xsqerpqKempqblZeon6CYoZ6vsqKmjJetmKSrlpidoo+ajJKWmIWVnpOLkJudk4qoqaqhp6GYnpWLjpmPgYWUiJOed2JnW2ppTE9NTlQ9QkFOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAxLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SW9oVUNXRox5ZkM7o6Odoaa/p6evsaKptaueurGso6u0trGwubewt7i4xL3Dx729xMLGwLjAxsC5qbakrLutwMG3t6qtsrqilK2xrbKWpKeRqrmqn6awnKugr7Szq6m2tq28rbSzubesuLHDu7+/psOrsLauqKurp56YmauhoqGRmKGxr7OssLmam6mfmpeTmKegtqmmo6KwsbSss6esn5ygoJuepZyil52js6+bn5CTpJmfqJmToZ2TloiTlpKVlpySiJCamJSOqaimn6Ocl5uShY6Zi32LlYSNmWlna2BsbVdQUVtVQUJFVEA7O0lBNzpYUGReUFdXRVlfXk1MUk5eS0o+WWNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLS0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaefnaKpvaKqsKyksrmqpra0rKCttb2vs7i7ur63tsDCv8nEucTCwL+3w73At661p6u3sbu9vrSprrG2nparrqeul6aojqe7n6Sss56rorGws6yptrS1vq6xsrWssLSzwbrFt6y9sLG3q6yqo7KmnqWqoKSXkZqfs6qzq6uzmp2nnJqVjqGmpLSuqKGtrq6xqLStsqqknJ+opJ6VopmbqLWpl5mSkp2ZnZ+dkKqclZaElJaKnZibk4qNlpaalqalo5+dlpWXkn+PlIV7jZKCi5Vka3Fmb3FeRllnVkRCTVhEWjlIQjY+XVFoXE5aXUdbXl1PTVJYZEpKQlxiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVVcZ0s2jHpmTECkmqGlrbelrKqmr663qq+1u6emsbfFt7G2vcHDtbW6xL7MxrnDwLm+ucO4wLiytKupura6ub60qa2wtZeYp6yprJurq46rvp6rrbKjq6CxrrOurbWyubiqrq6xqLWvtbu8yrOqt7WxtK+upqG0oJuoraCmlpabmrKjraCmr5ehpJqak46jpaezqqGms62qtaWvsrWvpJmdrKeamJ+amau3o5eTkI6XnKCXlpOqnpqRf5KXjJ2bmJWQipSSnpmkoqKgmJaSk5V6i4+Fe4yKgoqRam13bHV6YUZha1lJR1paPXtKRkQ2QWJUaVtNXGFLXF1aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRfVF8vNShDX1FcLitCL0pHUFtHM2NZVEtEmZehsamyqqympK+utqm3tbqkrLS3ybu0u7q/v7Szt8PAzMi8w7y2vb6/t768sbytp7q5t7XCtqqtsbeUlqauq6ijsKmUr7ukrbGzp6ijsrWxsbC1sbi0qa+ssqe3r7e0xMa3qba2rLCtqaejtqCgp7KhpJWcmpWxnqecoKqOqaOem5aYpqaluKijsrWsqLGnrrG1rKWZoKyom5yenJSpuJuUjo6Kl5uil4+XpKCck4KQlI+cm5eWlYiWj5eap5ykoJGWkZCVdoSPh3uEgYOLimxvdnR7flxMZm1cSk5jXD5ie0dJOEdnV2ZcTF5iTVhZV1VXVGldT09IYF1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkdmMjcnR2JMViUtQi49RUxRPDNya0lDQ5GZpa+lrq+rqKWxs7Srt7K4oau1ucm5rcG7wrizsbXCws7FwMG9tL2/vrq+vLLDp6m5sLW1v7yurLKxm6Cnsa2mpq+lnbK1raqxsaypqLW7rLSyta20raqsqKypuK2ysMjAuaW6sKmsrKWorrGmpaOvpKmcnp2br5qjo6Ojka2eo6CgoqumprmlrLa2pausqa2wtq6inqOpqpugm5uSo7OZjoqNh5ChoJSMlJyfkpCDjZKSnJqXlZSHl5KVmaebn56MkpGNkHZ9jYV8e3yFiIhwcnF9fH1cU2RvXk5YZlxGRJZbRztObVhiW0xgYk5WV1ZXVFhnXVFSTGNZW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLysxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEorOkg+M0JIUyw+kGs7R0iPnKqroqqxpKmls7WytbaysqGrrr3Muq3AusextK20wcPRxca+wLK+wMK7vre7xKastquyt7vAr6uxrJ+jp62pqKSwo6qyqrCrsK+wrquzvae2sLKps6qrpaWjrbqtqrLDuratu6mpp6ypp7GlqqWjrqqoop+co62VpZ6YnpmsnaKnqaKtpqStq7izsqKqoqCsr7GsnqCnp6mZo5mZj6Cml4aEjoqLnqCOioyVmo6NhIWPlJ+clJeVhpaUk5ekm5ycipKQjYl/foeFfHZ+hYOEcnFwiHVrX1pgbmJRcnBcSzuEfEY/WHVYYFpOZFtOVlZVV1FcYV5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxO1xKMC5KZ0RGODtCMDVFS1gxQJVZPUxFlZitqKKrs5yqqrC3rbi2r6umq6u9ybywvbbCr7Grs8PDzs/Dvr+0wMHDub+zx8Oqrratsri+vrKtraqkp6qwqKeosaW0rqqxrq6ysbSstLykt7OsrK+oq5+jnrC3q6qturelt7akqqerqqqtoamnp7KypKeloaGsl6qhlZugpp6loqukraKfp7G4rq6kpqObqquuqZ2ipaSkmJ+blo+YnJKBgpCJhJyfi4qOi5iNjomCi5eim5CQm4yTkpGTo5mbmYqOi4t9hoGBg3pzf4J/fHJ1i6SHeGtfYG5mV2SGY04/Z5NMRWJ5V2JYUmVUTVZVVlRPXF1hVUtOaFZVVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZWWi4wSmdBQTw8Qis6Sk9eNESGPUdGRJeTsKajq7GYq6qttqy2sqymrKqpvMDAt7iyu7Wlsq/DycvRv8C7ub++wbjBucDErLG0sbO6v72ysK6sqquotqmmrq+qubCosrKvsq23qri4prO2q6ylqaqco56zs6mopLS0oLeuoKqoqqirp6CrrKm6tqqqqamiqqCtm5KqoZ2gpaKmo6qfnae0r6mnq6OjmKWnp6qcoqSjoJmYoJGOj5iNfoeNh4SdnYaDiYmOjY6LgoWUopqNjZqRkpGPk5+XmJaMioN/dIaBf4B4dIJ+eHZ9gIedj29yZ2Zwd1xgcodqT16ZVkhteVRkVlFjT01WVFVQT1hbYlVIT2lUVlNHT1hVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDyWjrGipquvmqylrbC0tbCsprCqqLq+u8CwrbmuobavyMfI0cC+vbu7wb26wr++v62xsbG1vLvCsbGzqrOppLSopa2zs7mwo664srCzu6y6sKmttquqn6qsn6Ogtq2poZ+ws6K1qp6op6mjqqGira2ova+srq2iqKifrJmQsKGYoqGoqJ+om5mqsaqjoK6ioZSjo6OnmJqopZiXmJ6PioeUiH2NhoSEo5aEgYGKhY6LkIODk5+WiJGckJOQjZGclJePioaGd3SBf3x1eHl/eXJyeGZ/hqR2aV9kaYB0ZoiLfFNYb15KeHNTZFNRX01NUlpmTk1WWWRYR1JoUVE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUA0kZCzoaWmraSnpK2ntbOyq6Wxp6q4vsC7r6e5qqavscnHyNHDvL++uL2+vMi6wLevr7Oxubu4wLKyuqy4rKK0p6issra5s6iovbaut76wvqetrLWrrZypr6Ogpa2rqJyeq7OltKiaqqepo6ido6moqb6rtLCunaqkoa+cm7OjlqScpaagpZybqaumn5yropyTnKKlnpiXqKmSmJqUkIqCj4V+j4OAiJ2PhX59i4eQjY6Df5Oak4WToYyUkYuRm5KVh4l+f3J7en58aHh8eXNub3tmhHiEiWRhZ2ByhHpsZnhdXlQ/V3tsVGFQUVlLTE5ydV1IWltnWUVVZVBEPkpORENBOUhHS1M/amJKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmJBSjdHU2BVKj05RFc9KpCVspqgoKqmpaGrpbizs6apsaasuMG9ta+iuK2oqLDCycnMwba9wLS3v7rItcK0srK0sby4ub21rbm1vq2gs6erq7C2uLWsn7+9qrPBtLyhr7K1qqyfrbCjnKapqqSem6Wwp7Cgn6upp6GpnKWpoa28qK6xrqGro6Svnp+tppefmqGknZ+cmqSro5ybpaWWl5Wgo5ebl6WsjJ6RkZGLgoqAgI6Ae5mUjIh7fouFj42LiYSSmJCGlKOJk5KHkZqQk4GIfXlrfnZ5eGN8enBub3F2Z39zaYRoZWdebHONbGBpb2BvPVp4bFVdTlBSS0lNVFpXTV1ebFdEV19PXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPikdNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTRTPWVfREw2S1ZkTyo7MU5XPSOUma2aoJiopaSgqKS4sK+kr7Cpq7jBubKtn7mvq6i0usjLyL+2wr6vtL23xLbCsa25sbPAtLq9t6i5uL2qo7Soqaqxrrmxq5y8vaWwwba3oq+2taemp7Czn56kpqiipZmfrKipnqCqrqagppikqaCxuZ+jsa+hrKGtpJynpqmampufpZadnZueqqeXnKGqk5mUmZ+TmZahqZGaiY6QhnyHfoKNfXygjI2IeIKLhImLi4WHk5qOiZWeiJGVgouXjZF9hXxzcH1xdHRgenhobW9vbWh9cWJ7bWllYlxkhH5eWXNqcUpJfmlYWU1QTEpIUFJRSU9dX25TRFhaUmhOR0tFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQiosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPi9XVTUol56nmp2XrqGhoaWhuKuypbS0qai5xLWyrZ+3ra6tsLTGyMC2vsG5sLS8tr67vq+qvbC0v7C8w7mou7q3p6e1qaissa20saibv7emrr23sp+xt7CppaevsZuhpKClpaCXm7CnoZ6jqK+hn6GTpaWjt7ChprGrn6yjr5icqqSpn5eanqWUm52bnqermpyeppeWmJaejpOXoqiikImLj4Z6hH6EinqPlomNhniBh4OHi42FjZOYjY+WmYqPl36Gl4yPeYJ6cHJ3b290X3l3ZGpramdngmxlcmtrZGdXYXJ/XllrdWlZRX1eW1hPT0tISFJVRzI6X15tUERXVVllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEhCZltIVENUXWhFLjsxXlEsMpako5iWnauepqGjobiqsKG7uKWsvcSyr66ita+tra+0xMS9s766t7Czubi6uLqtrb+ztLiuv8G3q726tKWis6uoqrOsrrKjncO3pqq4t6yfsruqp6Wor6uZo6ecpaaUmKGzppmepKmpnKGflKagpLmopKetpp6loamTn6mhoaGZm56hk5udl6GjrJycm6OWk5WWm46Tk6OnpJCIio6GeYR8hYZ9nI2JioZ4gIOHiIeRhZWTkoyRlZSNjpR7g5ePind/fGx1cm1sc2J5dGdmaWZjbYRmZ2hkZmdoXWRiaWVaZXpiYFByVFtbUktKR0lPU0AgKmpeakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3N2FMJzKfpKWTj6annJ+enqS2raiqurenq8PAtq+sorWup6+vt8HAvbHAtrGusra1ubi1rKq8s6+ysL3At668vLCkn7aspqa1qquvoaHFrKmosrWsrLS5naiqq7GlmJ2qnqelkpmlraOYnaSqoZuhnJihnqe3pq+qraGhnp2ilaCmn6KgmZybnJSanpWmn66jmJiflpWOlZiMj5iap6CQh4qKiHiFd4KCgpyHioKIe36FiIaEkIOWlY+PkJGQkY2Se4OVjoVzf31neXBsa2xndXNrYWdjYnN/YWNlZmVoaGFlblldWFxsY2FMZ1daYFZJR0hLTVJYPjlgbGlIQlVTXFtISEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLC9BKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BiRiU1naShkoyuoZqZoJeltLKjsr63obHFu7mwsKO2rKuuqbm+vbutwLKur662rrO5sqerubCvrrS2u7avub6spp21q6ChsqWrsJ+mxaGzprCysbettJ2sr6yuopmdp6qlnpWbp6agmaWjqJyanpuVnZ2tsKa5p66ioZqanpmfo5qlnZefmJuWm6GTqpetqZyVnp2UjZWajpWUmKenjYyKiY57gXSCgouYhYZ8iIiEhYqMiJKFlJySkZCQkZePkH+BjY6Cb4J/Z3luaWtqZ3Fya1toY2Fxf2BkZ2pua2VpZWNsXGxsdXBhU2JoY2VaSUZMTU9ZUVBVYWWBVEBWUlpURkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFIYkInNJSjnI+PsZ2claGbqbOwn7jAtqC0wbu9ubGmtrCprqW4uri4rLuvrKurt6q1ua2ks7Wxr6mxtraxs7a7p6mgtqqen6qjqq6drMSZr6awsbe2rKuesK2vqqKbnaSsqZuVnKaknZqqo6SWmqCckpyjrKupup6mpKCXmpqeoY9ro5aZnXGDmJ2lgXaSrKmflpeikoqYmYCXip+OeIWSjYNtaX53hHFshoqGfYSKhm9dZGBnhJiGa4uQlJJ1eIuEf4OQf2aIgGh2aWZXXGl0bk5QamNlcYNmXWRmbmtoXVtdiZCFh2hOS0M4RVRnXkpIUFBVVktIUmFwdGVGW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTltLW2ZiPkcxTmE8Ky+OpJqIlrKbnZShnKqurKO9xa+pt8K4vrytp7expqukuLSzs7C5ramnrLSlsbWip7i2tainrbazrrSutKKpn7SrnqOlnaeom7C/lainsLW5ra2jqKyrq6Whn5yhqKebmKGlppycp6idk56fmZCfqKuktK+joqOclpiZl6OIoY+Sm4ihiJWfooClgKitn5SUnpSJhHJ4jI6DiKB1h41pl4lmfnN4oG+Hh4R+jHx/oaCfmX98h590iI52m4psh4KDbWhkZHttcmJUhm1jbWmYcVhpb26GV11oWmtqWohwbHlyh2iHhFleRk4+Rl5NRVJWVlFQUldUZ15MWkxSUlBFRkc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOi8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05bTFtnXz1LMVReNy8ojaeYhJ6snZqanZ+rqqiqvsOvsrm8t8G/qqS3saqsprO1rq+ztquppbGtpbazm6y1trWlpqmzsa2yqK6eqqGzqaCkpZuipZ6xuJWmp6e3vaaspqmprKeloZ+ZoaijmZmno6SYnKWqlpSinJSTpKanobako5+jmJWUmJSciK6QmJWKqoyZo52GsYGlrp+Vm6GXeoLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7F5aGxYsa5uZWm8krxuaHltcY/YfVJrYrayfX5wlHWaoaqQVk5XYU9WTkZVXFhQUFOLW1dbUEBcRFBOQ0ZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJBRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01dZ1w+TDFaWzQxIY+nlIGoqp+YnZ6lrbKqsMK9srXAtbe/wqumtK6tqaiwtaqvtrSoqKa1pai5rpyysraqpaSnsq+usaarnqelsqWioqCXnKKgsq+Wn6ShtbqjqaigrK2kop2amqOpoJicqaCfl56oqJGcp5uUnqKno6Gwo56fo5aXk5iSmYWva2qMjqp/aIWWh61mcZ+elZupl3GuoaR+d7p8a6CPdrFfarRbpYBlnJBgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZGUY21tp25chKBFaWeHlkV1nGB9ZnujpoFYX4uraH2PeHpqqDhKr1tYVGxjWktPWF9cVlY7TodQV1YvSVNTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMvLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlgzMRuSopWDraemn6Olq7K4rbS9vrC3xbK4usOnqbCssKmqsa+ksbqwpKWvs6OquamdsrKwo6Sgqq2wrK+mqJ+jorGcpJ6ZlpmdnrCpmJyioLWzoaqboa2tn52Zl6GjqZ2ZnqWgnJmhqKSPnKKal6GgrJ+mpqCan6GWlZGXkZqGtZu1eYepmraZd4ezm7d/lJeYrJd/a4GmeoGFhpGUknerZ2qxW6x7joeUdIlwjoaAf4iQl3iDgoqXjIOgj4WwdnefcWtrbXyLT6VYSGNjmX5jaKVfeXF1UpKGXVCpbmNweoWAYZ0vUqJuW1RrZ2BMS1xkWFxaQj6wd1dYQSNNaUZCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0UsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWFUNTAcl6CUibOmpqGuqaizrKq7t8KwvMOtubbCq6ytr6+or7Oqoq+8q6Kotq2krLWkpbKzqKOinaeqs6mwqKafoKCwl6CblpaXm6CwpJybpKi1r6Gojqmnqpudlpihpqman52joJygo6WjlpuemJqeo6ucppqcmqKgl5ORk5OdhNWTmblxscJ/xod91pScu32cl6iSj52NpHuNhqKBpYJ5q3mPnVave4l+n2q5Wrl3hoR9poKUfJl6qnmOnZB7sW2OhHSQu4ZvlVCvp8WKUaB6Y2CqYnNyhmuWh15StbTIhX6IfGOkM0KddV1QamhkUEBYZllkYUpHTGpKWlNPWWZaQ0M/RT8wPDw1OTw3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURCLjAwNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3SDphUDcyJZyjk5mxqKmls6qltaikvLjBsLrAsre0vbS2qLKxpLKzp6CvtqmbqLqupLCxobK0saGknp6oqbGptKmmnJ6frJiZmZiYlpijrp+cl6itsamjno+soqeVnZecoaahmKKhoqGboqKonJ+gnpWZm6ehnKeVm5qfoZiQkpWQnYiybmi1cqyIcI+ncrR1dLZ7nJmmjpCdjaN+j56jfrB1gpDS0nVcrnyFf6Rum6qmaoaFfa19mJmQe7Fzk52PebNllnSFnm6fZpRSyYtawlyfeWJfrV92c4VhlohdWcqdb8CAdE1LtVNVxmRVUWpjZVhBT2pfbGlQVUZIOT1XUltWWUhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQU5UX2VQNUc9YU02Mi6jnpGlr62lqbutprWlqLa7vLO7v7i3tby8tKa1taOzsqSgrLClmKe7rqWysZ20uKqgpZ2hqqWyqKyqpZqdm6qflpaZmZOUpKuimJOmq7GmoZWSq5+lkpShnKWnoJWbpqeim6Ofrpqgnp6Qlpyjn52llJ2VmaOelZmWk5uFrHx4qHejj4uHqnCui4WohJqao4uTmouifZKXh66Ef4GzXHKyU699goKjfnHXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1ednaGZ5eIal2vd5Wfj3dsNXnIrrNfQ1RvXmdgRVBsX3BtVlVNLmVjaFJZUDtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQmBJOjc3oJ2UoLexmbPBraiyp6qyure1ub65uLO3vrWmubWhtq2goKmsn5WotqyosbKrrbSkm6mgoKiitaemqqSanpaloZSUnZqSlqSonJSQp62wpaCUmaifoo+RopqppqGVmqapnp2kn62doJ2gjZSfnJ+hmZiclZaioJSYkaadhql+f6Z5oY+QhKpwrY2Dp4aXoaOKmJeIo4GQhpSqen+LnXlwsVqog4KIoHh02H92h3SngY6bjZKkfJWQn4R7sl6cZKB9gpVuk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmRPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpFYSEU9R0VBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8T2VkQSZVZls/MVRfYkw3RkhfQzE9N6Kdmpq+rZizwa6rrKintbG4sbW/ubqzsrm8qru2obKln6anp56Tq7KpsKq2raqvoZiioKakpLqjo6yhl5ySo6CWlZ+blZmhoZGOjKmwsKadlpqnpp+NkqSYqKuolZipqJ+foKSto6CeoY6VoZmgoJKcl5uVnqGWl4+rnI+ubnK0dKmMd4umdLR6dbSClKekk52NiaSHjnW4bot7i6Jra7ZaoYZll5dooKKnbZRytHOTmX+zaoWSiK1qdbRhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZvXK9WPJx3ZVRvbi5bp09iUmtlYmxZYlxgcHxjU1lRPj9sbzJCQkA+TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQTilmpyeuqOcscCurqurqLequK+1wbW9srG7uKzCt6qsoZynpKKdkqurqLajs6iuqqGXnaigpau4naOunJaZkKajl46eoZyZnp+Rk5WrtrCmmJObrKmWjJOmmqWto5GXq7KkoJ6orLCYoaKQmaGXoJuWm5ehk52pnZSQq5mH05Sau3WxxIDEh37Wl5y4eYqSmY6Yioynh3mitnV9d3bCgpqyYYO6ecB8dbhitYGMh6l9loKsqXF7f3W8iKegaZ1hpo6voX2MdIerfb5uc7x0soN1eIGKbZqIcG2NpHS9XXd9W2F5vGpaVltpeV5pYGRmYm14b1hbWUNBQHE/Q0crNEgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvVF5gSzU8TFwtNkA5p5qforyjl7DDr62qqq2xqLmvt8Wxu7OvvLCuwbKtpqOfpKKcnJGrpaqypbWnraSflpqrmaetuJ2jrpmVoZGmoJOOnaOfmZ+akJaTr7mxq5WWo6emlJCWpZ2krZ+RoKiroJyfqaSynaKkjqahlaGZm5aVpJmQsKCSlaqfhZCZtoCSko24lniDk5u2d25sb3RveY+EjolynsC7vJp7gbKocIF0kbmDfIaGi4aMe4qHjJd9pLu5vZx1ebOjdHWXdXSwdZieZoZpjbZ0cnF3toxef3l9iGeDeWx5YouscHSFflhbp2lEZFlUZl9jXWNRZ2ZxbXVCTU9MRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppWywrOrqqisq6q7r7HGr7W0sLiotbmuq6Sip5+gnZmUraWuqqe2qKifnJahpJ6spb6noaqXlZyRopuSkKKoopOel5KYlLK1tqyYnaOkoouTkqacpqudlqmlpp2boamnp6KooJGsnpeinpeWmJ2ej7CplJynoo9rf2qcqXmJdH+bj3Z7Zoh7vb7Aum+Sg3GUhV9yalpem4lhY4ePlmxgf5RjbZx2YpVsgJmVlGVeYGNxmolocox7hpRman5wdHh+fWJbeHSBaFBcboR8fIpqV2x6gXJJSm+FcE5yTURWXGZgTFpXZmNfT1ptdmpyUk9ERE08SEk8TD4yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1Q0ZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSXkknU19WNClQXkwoMz5cTyc/Mj6on6ihwaSZtLm2o6ymrqeotbKsyKywtK22pL6ys6ihpKqeo5yamqynrqSltaqkm5iVopynram+qKmllZSblqCak5mmqaiRn5CPmJywsr6smqadp6KJk5Kpm6iknJysoKOanKOnraKfqaGZrpuUpqCXlJ6fnZixpZmiqJmdkp+dpKabqKSbnZqcm5GXgmhufXJ3kZeUkISJtKqNhZiVj4qMmJeIlJWJg5OTkImNkpSZk5mXmp+hmpuUn5uNgXmkhWxpe5B9gHWJi4Jygnh5dnaKf3yJanOBdIN1ZHd9dmtveWxfYltvZ01YWWZqX1dZcHpvbWZTT0ZTOVBaTlJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Cxt6CqprOnprC1qsmrrbKmtabAqbShn6WmnKWWlaGrp62jpLesoJmXlqCYraqmwZ+spJaSnJefmJSVo5+eo6iTkJioqLLDr5mqnKqej5aWqZ6rnJ6hrZihm52ipa+moaSnnqyYlqWdmZmhnp6dsKGdoqeWmZSalKGjl6SfmaGOmJWLi46QmK6PfJWbgpGBiamohYCYlouEjp+Ie4SRhYWakYeGipWPm5eOkJieo5aZkpCcjX6NZaGzroSJhHd7kIp+d3l6b2d5kYCBiGp1gXmIcmhzf3l1g4aBanRieGVfaGRjZGZqWGt7cWprXFNMUERfVUZAPj8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLOgua++raqtsbKgqqayraOss7DFsKutpLOvvKS0nKGoo6GempeopqmmpKaztZ+VlZ6amrCmrr6hrKKRkZ6ampSSlqKcl6mdhJ2pq6O0x7OfqaOqlpaYmqeeqZygpayUn5+dn6quqKSiq6Crmp6foZiknpyfnbCkmZ+plJmZnpOmm5mqn5yXZoWTfWV/j5uQY3mMbGhqepCjq2plmph+Z4WLZWVpaHqNoo5raIyYkaJ3a2qLmaOfmHNrbXqEjIZ5WGVdhYFebIuKgndcZ3N3d5KAiIFud4J4f3NteYRzdoiHjYJ6aIRYXWpzZF1ziGlqfHFtY11RTlZJZFhASTM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXV9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0ouNlpPNilFWS9ETzFZQjs/Lj2knrq9ua+rs7CrpaitrrCnrq6wvbGqqKWusLCgrZehpJ6impqmrJytpKaoqbOunpakkKOwpra5pa6jj4+aopqTkpugmZmmlnukq6KotMO3paGmr56dlZ6jnqOdpKqpkp+hnqCqr6qpoqqeppulnqegq5ahnKWxpJedrJain5uUppmgrJmffr2EiXO0c4Wfhq1od7nEuHGSoaN6ppiZdKuCfcvAwLpxi6OHg559lpiInsC9gpadnY2cwcF7gXqRjJrCwH1qpbJvjYFvynp/m3iShI+AdnmBgHlxe4CGcHeFi5J4bHWRYmVed2NfZYBiXnRobWRiWEtVSVFZSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX2BhX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SVtMKiNDUC8jRlszUFkvVUFCOy84laK5w7Svr7+pqZSjsKqwr66msrWvqqanprGroKuYm6OgnJuqp6KdrKOlqKWltKSeo5Omrq24tKevopKRmZ2mk5GgoZiboJ6Ipqukq62/v7GgqK+plpGfnaKZo6Sqo5OhoZ6drK6oqqWjoaSfo6ScramRpJuprqqcnqudrqOXmKaXoqSYnn/OlHp7pYJ6lpebX62PXY6ogKGhfKeVm3Wrg4GvXmSMqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3R8loe4YYKtWaPNbpB2e9t7f5lxfoiTdn9le4h1dmx+h219hY+QfWuAjF9wam9mYF94ZFtxaGpkZmBSVFNXXkpPQzVBSEVEOD41O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcX19fXl1dX2BgX19dW1dPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNzpTTCssLUowJztbOkwtIVBARjQuMazBwL+0tLC3mJ6Ro6qprbWrprKtrKykrKawqqGnnJqmmJyir5+hn6ino6ahn7Csm56Wpq6tsauorKCUkpufpZOQn6WXnaijnq2jqrCov8Wyp6mxrZaSnpyil6Gqqp+VoZ6dnK2upqmom6WloqCqkqyzlqWiqqqepKenorKik5unnKGclpWRl6FyhoyYdoaoh3GxfJ1xrH2goIGlj554q4J+rX+dcq1/rIeGn3aYknt8l36qiKKMkYucfat6iJKPn396rVacxHuQcJLBfYGVbXVwjG1md2WGb2F4bnJuiImPjoNsj41jbXN1b2BmbWRfb2lqbmZjV1NcYFpSUkM4SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv08bHsrOfnaOPo6Kira+3r6mxp6iqqK6rq6eipJ2ao5WfpqugoqagqKijn56wrZiblqinr62op6mel5WapKKSlKGtm52no6+soqy1qbnMsaymrauWlJydopmfrqydlqGZnp6psaeoqJuqp6OhqpqvsaKoq66mmqerq6uzpJOYpKeclpOFpGukdYp6qXV7snGCpYqYjHCIoJuHpF9hUquFgK6DnHWugqiGhp96mZeGe2aAo4qkmIaBo32pf4GUhq5ee6hVnaKSgXujn4B8xLDFjHOvtLO5cmKpr8J0aIuLlo2Aa5eQbWt4eHdua2ZkZHFxZntpY1xWX2lYWFRMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAnJyErLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C0sLCpraOnp6qrq6ikpqCbpZ+dpqempJ2smqKsoaOfr6Oem5OqpLWwr6Gpm5yWlaekkZuiqJ+fppywpaKosay2x7G0qKuplZGdnaGZoKWznZqhlJyep6qqoq2aqqagoamisqyhqrOyopyrqbGwuKWUl6Wqmp2Tfaptn4OIdqt5fLBugqSLiZ+WlZ6WgdK4tLjJgYKyX2GUqYOliIegepiWmnmqyXSao5SoqZCSmox+momaxsZ3ZaGCpXOBn46Cfa9fb7VjsXVLo4Ztp0eDk2SOj5uRe2+Uj3xteXR8em1bZWpycWaAaV5hWGNtXF5ZSUxMSkVEQkE9QTxBP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwMa5ramyrq2mopyyuayroaWbqKaqrKmmoKalmKujn6+snaahrZqfqaWdp7Wgo5iUqKu2s6ycppyglpCmrZKanKejoKqnrqGjp6mws8Gxsqmsp5SJmJ2lm6Kkr6aXopWYnKWlqZmunKulpJ2ro7asobG5sJ6csKi0tLWmlpmqppyhkIOeTneagoCeeoSjfIKkhIamn5yflIS4fHx6uYJ/zMbDtnebopGLn36Zl5eKdp+XiqSYpKd+r4Wbg56ErH2ZlGGlbKNwj4WQgX2WhHKsYKRzcYCaYbx9UlV1jZGhlXp8kI6HcnlyhH5vW2xud3JqgW5aY19obmJkXUxMUVNBSEdGSDo6Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuirLO1pp+hlaWvrq6op56lpZqkp6GzrqKpp7OgmqmklKO1o6OVl6GptbmknKOdo5OQorKZnpumpaCir62cpKiitbHDsK2prKmRhpGcp52jpJyll56YmJmlo6eYraGroqSXrqW7rKK3tq6enra0urO1qJqgsaSmoIiQ0rXDt3mHjoWRk4+ApniUoneMoZKFpYOLcquHhrRucmmZpJ2ViZ99l5mHh5BzroKlm6ONpoqTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicnJ+oGJzsrhod46SpJd8iYqPiHV7eI2BbGh3aXhzbn90XGRkbW1maGBKWldYPEhGP1MzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gX11aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq6/v7y7tZ6XqKSutqKimZWjqqetqaqZpaKfpqCgtaaiqaexpJSro4+kraSdkJqaqrS0pJ2lnKmSlJevoKCepqOcp5y1maCqo7Wqwq+oqqihjISPnKKhpqOVmpqcmJqYpqOll6mnq6Cjm6ymvKyVvbCtn6Oxtbuttqmdq7Smq5p8qJF9fLB4i4CkpYicbbJvoYetfKKPg6iXmoGsiYathaCUqKCjl4WfgZmWgXuSfquBnZmWi6t3naCPiJOSf3mvXaOBfKanZJ6AfJd1aq5dpWxyhZldYFuMoG2Uj6SXgZKKk4h3eYGWfmlsfmJ9dG1/eV9nZXBvZ2doQllfWj1KUzJTOEFBQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTgxNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiMoKLySm4SpxsO3wbSfmq2grrmmo46ao6Sgr66pn6Oena2Ynrmgo6uhsKqarqGRqqmlloqakK2xrKegqJutmJmPraKhnaWhmaScrZefqKW2qL6upKmjn4t/jpuboKaekpSZm5SZmaWjopinq6qhop6op7ykl8Otq6OirbS8rbCpo7axq62ad69+kYuchod8uq2JmGSwjGWWrn2hkISnl5yCrYuFsIaomqSiopGFoFxsa4KzYH+tfHuCgbJsZm6Zl4uIsVp9tFukg2vIomafgXy7WXa1WrJ9U6+BeqxYgKFtl42mmIiUjZKTeHeMm3xjc3xig3d0gHxhaWZvbWZlZk9VY1xBVF09SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt767tMGzo5ytpqW3qaCLmaCfnbKxqJ6in521mKCzqKqrnrCtnqycla6ooo6Jm46vrKmno6iarpOaj6maoZ2ln5mjoqWYnqKosai7rqSonp2OfIualqGgmZCRmpyRmZeonp+Xp62lo6SipKm6nqDGp6apoay2t66wqaG/sLCwmIKqkqOvjpuAhqSXmJCAgLjDuoSPnZOFqJmdg6yLg6+KqZ2apquRftW9wqpipL+9fX+jgoPXure1hJSSgp69voRqo4Fvq4RunX96srHHg2ursb2seXiivrt0gJWMpJmNmI2TmXd/j5l5Ynx5ZIxmeIF7YGtlampiUGJbU2lcQFRgQkwpPDo0Lx8fJB4lMiAcJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLHAubK9s6Kdrqems6adjJelv6m2r6ehv6amsZuesZy5qJ+ur6WnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6adp5uaoKiimJ2gq6ypuKyno5qXknuHmZGmm5KPkJiZjpeTqJielqionqimoKKqup6pxaOhsKSstLWssqyjv6uyspx1dqqlt4ZliqBwZ6yQio9ubnelkJuggnaxm5dwkY5yl6qkm5mvpHJsbW1mi3hvbYOZcYB6aXBpZ4mWlZdxaGmFhmdxhmRdimNpb1pdZ354pmBicpCScGZkgI2SjaCVlZeNkpp6hY2TdGSGd2eManh+eWRsY2ZsYkpkV0lqWTpQZERQJ0o5KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurmytKqpoq6fpLOqmZK9scPHvLSpnr+rrKOgp6uguqOkrqytpo6WraqQjIWVlq2fpqqin6SjoJGLpZKmmamZlqOpoJacpaWmrrmqrJmak5J7hJeNppeNkZCXlI2XlKaTnZanopmvpZ2iq7mfsMGopbSnrbGzrLCuqrynsbuYjKKpprWciZejmIapm5CUnZKqtJqcpK2itJiko5+io56jpaKXrKeMkpONh5OdnZWQmZOYkI2VhH+kmpeVjouTkoqQh4R+Z4yBdIN3dIeMcadtfZaTlJSBgY+Pjo2bkZ2TlJOdgIWSi3Boj3ZviXd1fHlpa2Rkb2NVYVhAaVpHYl9NWCtFPSsmITY0MC8fHCAlMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW3r66isKWtoKC2sZGOqsS8w7m2qaGknZulnbCopLennam1p6iRmKyji4iJj5ynlq2koZqonp+TlaSXqJqpmZSmoKOPmqeYoLS5p6qYmpCMe4GUjKGUipWRlZCPkpekjp2YqJ6atKOcpqu3qK/Cr6S4p7Cwsq+rrLa9o7LAmpOnpKa1opKdp5+NqZ+Nkp+irbGboqSzq7OapqOepqygn56dmK2ek5qinJSQl6uZjZiZl5CWnpGHoJ6UlIaTjI+NlYyBf2aNiHWId3qJhHScaoiSlpWSiX2MlpGQlpCekJmSnYGGloV4cZRyeYl/cXt+am5kX3BpYFxfWW1iUGBiT1g5RkZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJakqKOws6yuo6mnraCotaqQj5ujsrmtqquhopl6nKGwpKaxqZecuKajlJipnI6GiombopCvnqSWqKChkpeZnK6Lq5aPqJmnjJiojp24taOlmJuNiHmCk4ybk4mVkZOQjZGWoYucnaecnbeif4OutaKwsHWkv6SzoHl7oq21v5d4sKahioCqf2RcYnegjqSeg5Z+bZS1naSpsKylZqChlHR6m5lwgZmqmWx/pKmKZZylnJGXmJeLkpuQhJ2bkJSDk4eOjpKKhXhrkIh2h3F8hoGBYWmJjJWTjFt2lZFnZ46McXmhlZVkeJeFgHaXaIKJgm55f2twZF92b2trZ1tlY2FhbVFZPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXWBoZmdYUUk8REc8OVVSW2BhYmBeX19gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6qlqa6jp62lkpWqtK6wpZmppaqXc4ucr6Coq6eUl7mgoI+cpJ6RfoiImp6NrJqklaeino6Xkp6Fda6PiKaaqJGWo4ibubOnoJiYi4l0dpKNlpOJk5CQlIyPk5+NmZ6lmJuxlYCMm7WdtIySj72oon6no3ulsbqDjo+on4SMho+xqa+MipaimnmAi6yGnZ6jqaupiZaHmnelnHuInIGYp4OBe52ze4qGoJiZlJiWgZCWloOZmmJ5iJGEjY+Si4RucZCIeoJxgYGGgId0iIWXk3iWaJN0oJpze5mCm5mEmH6RiIGCmGmMjIRqeHtxcGZleG5pbGpbZGlpZHFaXEdTS1FARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWlmWVFIOURMPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKSfpq6uq6itoKmxp6eqpZmTrMS8r6CUpae0nY+DnKucp6KgjZC+npmNn5qhkX2Gj5iXiKydo5ahoZKNlImGgJGojoeinKOTlp2Gnrmxp52ako6FcHWPiZWQipSPjpuLjpGekJWeo5Sdq4eftIm0mq6Lyoirr4q3hY2whLOyhqmOqZmNnXyoj3J7d5yOppZolaR5tIyhoKiqk5nCgoCriZmhcp6Am6V9l4WVs4GhfaGTn4+YmICOlJyJmJKLfIWUho2Vk4qEbnSShoB7c4eBhH2FdYaDmIGPxWaAqYePomqdgZ2XgJmAioyDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZqV2RFXFBMMkU0Nk1gYzcmMzxFR0Q6NjM2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBJZFhdY2ZoZ2JiYmJjY19fYmFiY2NjZGlpY2JiYmVjYWZjYmJplZejoLCpqaimrKClubGpq6aalJ6hpKmhlKOptaKvf6CmnaWenYmUvZqTjaCSnZB5g5aVkYirmZybmqKFj4x2m5uOoJGInqOblpiXhqK4rKWZm4yMfmJtj4uTkIyPi4yXi4+Rno2SnqCYoKd+oaeHrZ2glq6QoJ6dkYeCoY2tsoikjqybjJp+onaAmZRrgat1Tat4h42dk5yqqYKqq36EoXx7p2qegJNsZ5eGmLeJnn5uYGNYg5d/jXtkZ4tzmX15l2xcfJduYFNxhVxgbXqEYFllgn6FgZlxqKprg6NucqVvn4GbZ2SebFpsiHplWV+CfmFXUG92ZW50cWpqb11pb2xqZ1dmTVxXRThBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJLTUJKW11fV15eY3VgTUU6TU5NVGJcW2ZmaWliYmRiZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiXnqC5oaqkpqySora9q6+imZaeoKWrq5+crbShp5Ggn6CnnJmOmbSZkIuejJWLdYGUkY2KppaWmJ6ffpOFhayjh5yRipiomJmZkYelr6ailZmHiYBpboiIi46OiYqNkYuPkaGLkp2fmqGlf5OBj6OhlKB3nJaQp4OjqYCGrLCHpXqMfoSafaJwc5OHlXuejHlth5yLmpKcqpyPh519g6J0d6Znnn53pV6Ye32Tc6JumLe0unOTiIGAtqhkgca4fHGVtoxxgJujY3Ssq2F+ap2zfm5+iIOPg4yYcYCjbHKjcp6CfaNenJmzlW97l56zdHJbnrKCaWJwdHVxaG9YamtxcGRbZlxhS0M9RDVRQVlwMjxSR19KUj08Mzk1Ojo2Qzw7QElQP1ROTlFARV9eW1lXYGB7ZElDOExXVVZjYVpmZmtrYmJlYWRjYGFiYGNjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4ta2toJqhm6KjpKyamrGsq5KXoJmhpZmalJ6sm4uJkXiLhXGAlo2Kj6GQk5Sdl32Rio6ooIaYj4qSopObmoyKqKekno+Wh4R+a3uGf32PjYOLkJCJjpOfgZWbn5ugn4uJd5yYoo2gcqGMiamJnaiRmKquga6MfnqgmXmjk3iAc5eIjJx9lZ+Hm46anaiIo2ShfoqWkJuNbZ5om45vmpl7gIqnfXJodKqDnoNzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMX6d2d4qKgJ1omnWHk5KYjX6ebJiPaqaZXKh+d7tqfalajoRds2dcbnF4d2tpW3Bpd3dhXmNWYUFQRU43VkJSbTRKWlpeTlpEQDE1MTs7N0g/OkNIVT9ZU1hdPkRiXVZgUWFkfGlFQjlOW11YZGZYZmZubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZ2JqracqIljlZysu7KwrJ2lm5qnn52smZ2wp6qdl6Oaop+Zlpago5mGiY1piIBye5eHjJaWhJKUmI96i4SWpJyJlZCGi52RnJuIj6ihn5qLkIqAgGmBhnl/lox7iI2Oh46VmX2SoZ6goZOYcmifiqCPjHCSjYKpiZqhpaqiqn6wraSiuJd2o7Oio3+IlHideqqZf6KPn52ZiZhyoX2HjbC1fWyakaF4fpm1o6OrqISZfJp8nJp/dKpaXW97l4x4nmJNf3t7hWR6mEJNn1mianN8jm+CioSZdpt5h4mxs39+mpKmc32dbXB8lG+ZcmmjXZV2SGVjYHNwfX1uZV9rZ3V6YmJeT11WXFRWQFlFUGZEUlZcYVheSUQ9Qjg/QjpIRThMRVhBV1JaVkVGYVxaYEtgbX1xRUM8VV5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWN2bF5lZ2ZsZGVsaGhsaZSdgbGumoRUX6GntLqzs6maoouaqZubp5Kgq6Ogp4+enZ2amZWYoZ2Wh4eJd4WBbnmVhJCbi32Rk5aIcoGJkqGbcpKQgYiYlJ+ahI6om5mVioqKfINshIVxgqGMd4SMiIaRmJR7kaKfnqOIroZ9tYSPnp17ppZ6qYKXnpGMo6B/p2h4bn6Zc6BzcXydhZhvk4KtfKSEp5+bgqRwXqlodqNkcKZhnNOPfHuZeHJzY6KGkH6icqOQdmuQs4tggpiKdKqyqLx/d4Nuf7+mqrRenG9/cpdwgnOicl6kZ3SmYGimbJvTmHmBmm52eZdrm3l2l3JsqaVnX2R5cX+EbGhmY211dmZeYFFaZVBRYUhWSVRfV1NbZGpbZVBFQ0tMSktBSkQ4UEBQTVhTWE9TUWBlZWpTZHh5d0lGRWNdZVpoaVNpaGpuY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGZobGiYm3+xrFRdS3+qsLK1sLOinJiEl6agoKKMpKeflqiJmZiZlJmTkqCXjoiFe3B9hGh8j4OTmoJ3kY6PinCAho+TkmyYlHyIkZKjlYONqZmTkoqFiXmDdoiAboGfhneAkYWHmKGVeJKho5mfibOhoraLeqynpK6lcKmAm5GGgZ6UfqWBo5qGmHGehKKtr4mXi3+MpI2Vg6+jlXe1trbJonOUjIOfYZ2XqW15loegm3Whh3egfpCWi4FvTWajknGaiHOle3p1YoOCbX6gbHJkYJxzf3SXa3tqtLa0xqZzmH15nGqamatzgZpsc3eXaZl5dJdxUER9s15qdWt4hmZrZmJzdG9sVVtSWGdPUWdJVUxYUlVcZ2tuVWdXTUpBSU1KR0pOQVFKUGRjam1ldXNzfnh7bnSJentUUU5tXmhca2lSamhpbGdtZ2NlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlop2JsKiFZT+UorKsr6+1oaKPf5anoaGji6SmnJulgpmXl46XkJCbk46Ig3lreYZlg4x/lp95dY+IjIJqhYWShIuFnY16jIqVpZKCl6iWi5GLgIh6gH2LeXCQoIV5gZSGiJWelH6TpKablpaDZ254nGyiZHxypXicmHBop4KZjn2le6GXg5Zyn3aBiZSVj7ltj4qiYn2Zo5eJbnNrq2t1oG5vpmGbaYuQaZaHm5V1ooF+mmCLho11b4hiaKFmnn9qm3VwZGeIgm9yoltfW2Shbl6IjHF8gHRyZKVueKJjZqdnl3GLl22hb1KIj26gXmSnVItdVJhtbXJrcYFtcGhrd3NqblFWVVVlWVNsSVhOW0hXaGhyallrVlBSRVZcTVhTYVVoal53dXt8cH18coJ7f3N3jYCDd15Rc2FnYnBnUGtoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupamwsaWfi3+WqZydo4uhoZqhooCVmZOOmo+Ll5COinuGcYCIaIuKfJeac3SJfZB8ZYOHlYqJlZqCfIiGlqaPgKGqj4WQioGJfYCAjnNpj6WDfYWSjIeXno2HkamlnYmmeJabfqWJloyymZ6RhK+Xn6V5mIp7qXWokISabqWijJKEjIO8bXylr4KHhYeVl56ifqZ8cqiVoZZon35vrGOWipaTeKhtqqOBiXWIgnerkaaIa5KxbHezjKlsi4Zvb6CekpVif6uMqneBgI6nn3effYWklZ2gZ5mHdaxmnq2MtnN2voyjk1mDpo2rYXVydG97dXBian1uZ2xSVFhUYGBca0xbUVtJXWxtdl9bcVlbX1pnc2Rtb3FjcXRgd3p+eXJ5g3ODfoF7e4yBgoB2YnlkY25zZFJsZ2dvbXJpZmlhX15cYWpibGx7b1xcYmlibWl3bWdsbmKWpqudgYCepJaqqp6op62jmIiBlqmZnaKJmqScqJyEjJqPhpyRhZKNjIx0hXqIg2+NhX6Xk3N0hnKRg25/i5KHhpSQfXuChZekjX+lpI2AjomElHWCh5NubIuogIKLk42Im56Ii5KqoqCPgHSUl4h+gXiUr6R/gpxxj4Z5k46GgXtzqY1yfX16l5abhI14e319iJSVk4t3kZmhooV7f4psjIZcenlzenFpbn6TinGAdIKPlJNxhoSCZY1/X4GBjHh2c5R1cHpvb4lvhYZfd2l4jmaCg4aPqpx/dH2WaYmIb351e4J0bWxmjHN3e5d3hFpqV3mPaW53cnFvd3hvXWuFbmhnVlleVlxkamNVYFRdUV5vd3lrandkaWpqdXxwcXRzYW91YnN7gXh1eYJ1f4B/gXmLhYJ9e22AbWR5bl5XbmdodWt4amlpZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW6qaeLoaKbp6SZpJ2roZ+Dg5aqkJ2fiJmmmqiYgoGci36WlIeOiomMcoJ8jnx+j4R7l450coNwlYZ8fZKLhoaPhnl+gIaYo4x7pp+KhY+PhJWCho6Yd3GEqoWNkZyPh56dhoubp5+gq4OJjZWbf36Kl62okJOokXhxn5OFfZRwf6uHcX6VcWpvfIGfi3+Rjotobl2EjY2cnaCQc5eNiXJ1bIN2dIBZcm+HkYJ+f4xqXWlke4WEiIBgaXh7nHyEjYN2goeEaXqMiWxicXODd19zjYOKkaiWh2eNjoJsdoqCboKKd21kZWN5gnqVWltpZm12W3t5d3Ruc3KDZlxtiWtrYllYXFlYanFaXmBZXV1kcn16dG90YmpqaXt8cXp2dGRtdGhse391en17eXqAgH9vhomDe31zfnpyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMq7GhkKOhmp+fmJ6ZqKGgfYKWq4yfk4aaoZGklX97mIV8kpmJiIaGinJ8gIt2hYuChJaKcm+Ac5iGhH6Tg4OGioJ6gISKmp+PgaWfhneOl4iVioucl4SDeayBkJeYk4mdnIaHoaqeoqKji4iTm52jmZaroqinoZOciZmRfnqQkIapf4CTkZKTnLGlmpSdj42xkpiEpo2Nlp2hipGdhImTi2x9jnd3ZoKGkYt9iZ6Fh4uPiIiBhYSRd3x7dZukioeLoIyHln+AjYOBd3F1hoR/eImIi5GnkYSHjoeCi4+KeoOIhox/dWqAg3x5mWlxaGBzinB9e3d2b3d0gV1eb4Znbl9eWVpcU2dwVWNbW2BsZ3R7e3Jub2NqaWh/e214fnBocHBsZoB7coKAd399f4R7bYOMhXx6eXx+eoN4TmR2anNucXtka2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5eioZiVmZiUmKSgnHp+l6mNnYyFn5yKnZZ8eZWDe46ZiYaDhIZteIB/coCHfoiThG1rfnqXh4SDkH6AhoSHfIeDjJqckoapnYJyio+FkpGLnJF8jXqpg42Rl5WOm5aFhZumn6KanYaDkpqZmZCZpqGmnp6Ql4KTjXh9iZCGp3x9j5CRhpiqoZyTnI6NqY2SgJ6NiZWboISPmICIj4RxeYZydWF/hJCHdoyZgYOPgoaFf4aElW56dnWUpIyNhpuGhpB1gYx+fnNzfImFe3mNj4WUqJCHhI+BgomIiHSChYaIeW1qfH97bWhrbGZeeX9nfHt2dHZ1e3dcYHB9bnRgY1pbXlFmbFNkWl1gamh0eX5wbGxjampngH9rcn9ra3Rud26EeW6GgHaCgH2Fd3GCjYd+e3t8gHuCi2Bpe2t1aGqDZGpjYGlcY3Vnb2J1bWxUYnF5ZW95enJlam1ti4qfuJqhpJ+TkpaXi5qfnpx6d5ykkJuJhqSTipiZeXqNhXuKkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foWEh3yPgI6bm5CHppt/cIqKi5KGoKGKhYx8p5CHjpGWkpaSd4yjoKGdlpp/gZCamJONmqOipJuYkpyAkId7gYaRiaGBfo2Nj3yXpKCgkpmQj6WMj4GckoqVmZ1/k5N/iI+DdXWCcXdhfYGOhnOKln2IjHGMfoKFho9oeHJ6jpqTkYCYf4mMc4OJfX1yenyNhnx7k46El6aUjYaQe4SFhoRzf4CEhXdkcHp+eHlwa2pmXn5zaHx1dXN8c4BqXmB0dnB3ZGNYXV5SaWhTZFheYGdpdXiBcWZrY2xnZX+Aam19Z21wan13hXpri4FygYF+gXV2go2Gf3x6gIF9f49qcoNudGliiGhsYl9xVnRvbG1geGhsV2pzdmN0enpxYmtveYmNn7OSpaadjpCYj4acoJqbe3Wjno2Xf4yhioialnh8hod+hIp+iIKBf3B+enR1goV+iZB3Z2N9hpeKgoqNeH2AjYN5loCVl5WMlZ6afW+LgZCThaWbh4yJg6aVhJGKlZeSkXaRnaGhmJSXeX+OmJeOlpqdpZ6alJWde5KJhXmHmI+ff4KKjoxzl6KeoJKYjo+hjIyDmJiElJeaf5mOfYqOgndyfm57ZIB8i4Zxh5OAkYJrh4OBgIqFZnZwfYiUmo5+lHmNi32CiX58coB5i4Z6hZKLjJmjl4KEi3aHg4GAdHh/hoJzXnZ3fHN9dmZrZGB+aWp3c3N1fXF8Y2Nhc251cm1hWV9dWmtjUmJXX19nanR5hXBiamNsZmh8gmtodGhsb2h/fIF4bI+FcYCDg390fIOMgYB+eoKDfnyQbXWJdHRtZopsamFjdVaDaXBtYHlnbGFqdnBleHt5cF9xbIWFkJ2vmKepno6Nl4eFn5OVl3x2qJqJmHmWnIuMmZB4fIGLfX2Ee4CCgHhzeHlzfYCDf4iKgGRefYuUh3+Fh3R9fop/fpiElpOWjKOgl35xhnuTkYqmj4yOipKgkYOQj5OXkYqBj5igmpKQkXSAjpKUiZ2dnqeZmI6Vl3WQkYttiJqRm3yIiZCJb5edmqKSlYqMnYuGgZOdgJSUloiain2LioJ7cXprdm17f4x/boWTg5R4b4KEfn6LgWVzan2CmJiFgI51koqFeol/d3mBfoeBfYSPho2VpZF5hYJ0iIZ7fnFyfoSBa2B5dHlwfG5gbWJle2Jub3ZzeHdzdGF2YG9sdW5vXFpeXV1pXU9cV2JgZ2xyeohrX2lkamNod4dtZmxoaWxngHx6d26QiHOAg4R9dIGGiXqDfXqBhH18jnJ5i3h4bWyHa2hfaXFih2hxb2V2Z21sYXpoanx7d3Bhd22KgZmaq6GkqZ6Ki5GGiZ6KlJZ8dqyXjJZ8npORlpSIdn57inx8gHZ3f4BwdHN6b4V9gYCJfnxhXH6PkoZ/hIRyeoCGeo+Rh5GRm5GkmpOBfYB8jYqSo4mNio2WmoyFkJeSlY2IiIySnZOPjI1uhJCPkYmemaKhmJeKl5NwjJyGZ4mbkJV7ioWQinCWmpShkZGIipiMgn+Sn32TkZSNmpB8i4aIdHN1a3FvdX2LdW+GkY6TcnSAfIKCiX1lcm56f5uVfoWKdZKMgnWKe3CCf4KHfYaNi4WOlqqOe4h9foqEdnxubH2CgGFmd3N0bnphXm9ga3RecGp6eXlscnBleV5ubHNtc1haXV9haVpPVldkYmVwcX+HZV1paGdiZ3GNbmNoaGVpZ4B6d3VvjoVzgYGDfHWCiYV4hXx4hIZ6gIl3f4t7enJ5g2trX29odH9rcW5tcWdva2V7YW1/endwa3d3iX+jmaOooaabiIyKgY+dhpKadH+ok5GNhqCMlZOQgHN8doV4eYByc3qGbHJveW2Jdn+Ahm5xW1l+ko2IgIGBdnWBf3+gho+KkZuXoJKWd4l+gIyInJ2Kj4aSl5aFiJSYjpaLio2OjJ2KjpGEbYmLj5GKnJahnJmWhpmJbIemhWeIn4yTgI2EjIF4k5iSnZGQiImUjX9+kJl9ko6RjpuTfYuBhHB2cGxub3B8hmlzg4+YinF4gHWCiYN6Z3Rwd4KbkH2KhXuVk3t4inVyi3yHjnuLh4WKj5yliXyEdoGJfnd3bGh9f35bcXJxb292WV5vYHBqXm9qfHpxbm1qbXdgcG9rcW1ZWGBhYWxXUFJZZWVhdG+EgWFca21kY2Vrkm1gZmZfZ2qBdXJyb4uAdH+CgHl2gIuAeYV+d4eGdoOFe4eLf3t2in9qcWN8YoV8b3BsdWpobmx3d19xfnl7c3Vzf4J+pZWbrZ+nloWMg36WlYOOnXSJnpOShoqajJWOjHpyeHSCcHKFdHF1iGxvbHRsh3aDfX9tblVRgauUh4J4gHZyg3mCoIKQgZKSmJuRmHeQeoKMkqSak46IlJiShIWWmIuTi4mOj4edhJGLfXKLhYiPiJyZn5uXlYGVgGqIn4poiKKJlIWShIpxg5GXj5qNj4yLjo13e5ORe5CMjpOYjXyJfYFsd2pva2xte4Bien6Pl4F3eoF4g419emh1bXaJl4yAiYd8lZFye4ZxeI57i457iX+EjpGfn4Z9fHeBinx2b2dpfn92XXZubWtwclVdbmJyYV9tbnlwaHBmZ3N1aHBsYXdlXVVlYGBxU1BOW2VjXHdviHteXGhxYmJlZZFpX2hlW2dvfm9rcXOKfXZ9hYB1dn+MeXuGgHiHg3OGhX6MjIR8eZV4ZnJrg2CHfm9vantgaW10gHRec3x4hndzc4V8eKCQm7Gdpo6Cin+CmYl/ipx+ipiSjoSHl46OjoR3dHdzgHBwhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xwdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2InH+OgXh7jH+IjIqcnJyblpR6jnhpi5SKboqlhpSJmISGY4yRmI2UiZaLjImLcHqVinyPiYuTkop6h31/bXxlc29rbXt6XIF5kI+Be35/gIaPe3ppdWt0jJCKg4eGfpeMbX+AcIKOgI6JfoV7hJGWm5yMfXd4go53cmtkbnyAaWdzbmdoc2xTXW9kcFpfbHF3Z2trYmd4c3BwZGB4YGBVa19edE9NS19mYlt3cIl0XFtldWBhZGSOY2BmYlhpc3Rua3F2i3x0eYaCdnd+i3N/hn96iX9xiYeBkIqIfH6ZdmVzbnxlh35ub2t/WWtueXpyYHZ6e412cnaKdnmfjJyvm6CQgoV4iJV+e4ichoSekI6FjJeEk46HgXV3b3lxb4NvbW5+cmNkd3B8bnp8amhsYqSawdyu76JzbHWDdYShhJFulY+Un5OagJFwhYujl4mOlYqQnZaDgJSPhYiPgJKKipd/h3t2f4l4hoWOnJqXmY+Qdot4cImLjn+NpoeUi56Ghl6LlJeJjoiNioqEiWx8l4N+iYaKkZCGdod+fmx9ZHh1am95dFiIe5KHhnp/f4CGjX96Z3RqgYuQi4SEgY2Yhm2Dd2+Jk4OShn+Ee4KSl5SakXV0eIeLdHJwZHJ2f19ybG9haHRmUmBwZ2tVX25zeWFyY2BpfnFybltjcmFiVm5aXHdMTEtjZmBddXKJbVtcZHleYGRmhF9jY15YaXJrbmtyd4t9c3eEgXh4fIlxg4R8fYh7dIuIh5WFjH9/mHNodXJ5bYt6bnNwgFdwenZ5cWR2eYaMaHaAiXGAnYeZqJyikoR9cYyTeHiJnIOEn4yOfJaNgJqIhHxzdnBzam+BbGptfHReYHd2e3B0emdgZXzr2rXJw9yJc2x0gHaKmoiMaZePjpuTkYGIcIWIoI6Fi5WKjJeTe42Sh4KIkHqRi4aPgoB3eIOEcoeCkpuWk5iGjXaIgHKHhIyJnKSFlo6ghIphg5WPhYiFiIyGgIdofZSAfoOFio6PgnKHf4Byd2h2cml0eG1ajH2Tg4Z9gIOBhIuDd2J1bYqCkYyDgICTkn5vg216iJGIlIV9gn+Ck5SSmIlucXmLhHRqb2lvdn5dcmhtXGl0X1FkcWhmU19xdnRgcGBdaINxcmpXZ2ljaFdtV1t0TEpLZWZeYXFzhWlbXGV5Xl5kZ3pgZF9dWWtuZW5qc3eKfXNygX97dnqIc4WDfH+HdnaKhY+YgY2Ce5N2bHd2eXiTdG53en1YeYVxgG5neHaRgmR2hoVxipeGmqGboYqGc2+Si3F2jZp8iZmIiXyff4SZf4J5cnNub2RyfmlmbHd3W194e3pxcX9pYWdhf9W2jpGmeG5xd3txkpCMhmqYjYiakIqFemiHipmHgZKQhoaXjXyMjICAiY17kI19iYV6dXuDfHGGgJWZjpKUgol2hIh4hoONlaChiJiRoYCJYX+Uh4SHg4iMf3+CZn2RgH+Ag4yPkH5tg32DdWxtd3V0d3ZrY46Cj4CFf3yEgIWJf3BgdHKGfZCOg31/kop6coVne4WMiI2FfIWAgZWQkZOFbm94i350bG1oaXd6YGdpaVhrdFlSaHJpYlBicnhtYmVeWmqEbnRiXGhgZW1fb1Rabk1HTmZkW2ZtcYBrWltjc19cY2t2ZGVdXVpsbGJsanN2hn9xb398fXR4hniFg3yAh3V4iYGSlXuJhnaJgW94eXuEkm9teoB2XoN/dIFsaHpzlHNnc4d8cpKShJqfm5+Gh3V1k35tdZKWfYeQg4qNmnyMmnZ+dnFvbGphdHxnYml1eVpgd3t5bXF+ZWRoaFedj19yc5e8xIR2cZSIj31xlouGm5KLh3JqiI6WgHuVi4GEmot8ioV8e4mLf5SIdYmGdnd+gXJ1hoGdk4WUj4SDcoGKd4Z+jJufm4iVj56BiWZ+k4J/hYKIiXGBfWZ+jHx5f4CIjI99aYF+hHZncHl4c3d0bGuOhouCi4B5goGFhIFsX3N5e36Oi4Z8gpCBf3OCanqFiY2HhXmFfoKZjpGNfm5teoh8dXNtZWV7c2FbcGJXbnFTU21yaGFOZ3V4ZmBeXVlvgW9zWmViXmpuYHBPWWpRRFNmYFlqbW18bllbXW1jWmJwdmNmXF1ga2ljbGpzdoGDcW1+fH90dYN6g4J8gYV2foiBlpB4hIp0gYhyeHl+jZBvb3qAcWmBeHp+bWx7dZVraniEdGuTjYafmaCZhIdufYt1aXeXjn6BioKUl4p5j5VvenRxa2pkYHN6aF9lcXpaYHJ8eWdxeWFlZY+xsndLYlql2dCWcXuQio93fZOKhJiQi4Vua4WSknp5koaBhJiKfIZ/d3eJioSWgG+LiHF1fntqeYWDpJCEk42Ef3CAhHiGe4iem5eNlZKWhYhwe5OCfYKCiIJtgHZogIV5coCBg4qIfGV+f4V2ZHFzgGl5cXB1mY6Gg4t9d3mBhXqDa1xyf3OCiYeKfoeKe4lzgm9yhYiQhoZzhXuCmo2OhXlubn2DfnV5Y2Voe25eWHZaV3BrTldxcmZgS2x3dGFeXFtadX5zcFhnXWdqcmBvTldnUj9YZl5ab2pneXFaWlhrZVljcHleZ1xeZWxnZmtpcXd/h25sf36AdXCCe3+Cf4J/doGEiZeJcYKNcXuGfHp5g5OMdWp5fmtvfnR/fG9ye3qTb26BfnhnkouCoZmckYKFZ4aDb2d5lYh9foSCmIqBfI2NaXhza2tmX2FveW1fYm94XGRrgnlhcXZfZWXU6r2LMjo+i45/cXiFh42NdYKWjH6SjYt+bWuEjIx1fI9/hYGUiHyCd252h4SDl3duiIVsdXt1ZnmCg6aLgo+LhH5ugXZ4hXyJn5KPkpOUjoyHf3uShnd+g4yCan9xaIB+eW58fIKLhHdieoWCcmRyaX5udXJ1gpyMgYCFgHR2foBzgm9cboB1eYuEi3yIgX6JeXtybYqFkYWMc4N6gJeLi4B1bWp2gH90c1tnZ3VuV1Z7UllvZExacnJlW0lxeG9cW1tZXXV/dWlZYltoZm9kak1XZVA9XWVcXXVlYHRvWllUbmNZY3F5WmhdYGdtZ2lraXB3fY5saYKEf3lugHx8gX+BenWCgI2ThHCBi253foB7e4iSiX9oen1qc3tyhXpzdn1+jHl4hH18a4yNg5ueloyBgGyMfWtofo2Len1+g5SCfn2KiGt2cWdoYltiZ3JvYGFrc2BocIh5YnN0XmNkm6CPblw1Wq+1dGmAiHyRhnWFlYVzjoqJdm9shIKHdHmJeIl8kod5fnJndol+fphvcYd/aXZ5bmZ5h4SkhoCHjIp+b4B3goOAj5yJhJaTmYqMhYl8kIhwen2Ee2h+bGqAe3pqe3eCiIFyYHeBfnJkcmd2g251fIaWkoJ9goFvd3p8dX9tWXCAd3WNg4d4iHaDiXt5dG+LgpGChnOAfn+UiYp8b25pbYGBdG1bZWRxb1Baek1bbltPW3JvZFVLc3hpV1laWmFxgXVhXl1gZ2RpaWZOWWdNQGBjW2B1YF11bFdXU3RgWmRvcldqXmJoamdtbGhwd3ySa2iEin18b35+e4GAgXp3f3+Ki4NxfIdvcXeDf3uJjI+DaX17bXd4dop2fHh/goZ/g359em2EjIiZo42Eg3t1i3hrbISHkHh9eoKRgIB+i4NwcnFjZl5ZZl9wcF9gZ3Bmam6IdGF0b1thZGp2e4C/nKakyLhxhIJyknt3hZKCc5CLh3Jyb4N7g3N0hnSId5OIeXlwY3eHeoCTaXKEdmd3dWNqfIKHnYGAf46PfnOAdYd7gpWShXuYj5aQiIKJe4mJa3h5fnRnemhrf3l0aXp3gIN9aGB4iH1ra3RofIFpdoKMkZV/e35/cXx2fHR/YlZ4fnN0i4WCfYRxh4p4eXFxhYSOgH96f352j4aDd2pxaGyHgXFvXGZgcWxJZHVLXWxUU1lybmJRT3R4YVJYWF1hcIN0XGFcaWVlZGtkUFtwSUNjYFtjb11deGdUV1Z2XVtlbmhWa15hamdlbm5ocHZ6km1piIx5fXJ7fnmCgYF8dn2DiIaDcHeEcm13goJ+iYuTf3CAe3d4eoCMdIJ4foGBgoR5gHVvfoqLm56IfYV6d4V7Z3SFi5B5fn97iIaEdo+AZ3BuX2RcWGVZbXNhYGBwbGtoiG5hdGlZX2RugHep2qnHhoeycYh3b4x0eoWNf3mSiX90c3R9d39vcX9thXSThXh0a2B6gnmJj2ZyhHBndW5bbX2AkJN/gHiRk355fG6KeIOTjYZ3mIyTkIiGhXx/hWx0dn5sZ3ZkbXt2bWp3d39/fGFieIZ6aXV1Y358aHWHj42WfHWBd3GAe31ugFpXdX9wdoWIf4F5bYmGdHpsdoKEhX98fnp9dIyCfXRodGVuioNsc1poXXNkR21tS1pgV1ZVd21iUFJ0dlhQVlheYHKEb11gY21lZF5vY1RccUZCZV5dZWddW3piUVZcdFtaZ2tgVmpfYG9mZmtxaHB2eI50ao6NdX52eH13gYSBe3R9g4iHg29ygHRxdX6FgomNinp2f3iDe3yFh3eHfH2BfoSAe35ydXmMjaCMiXmJdnSCeF59hZeLeIaDc4WGhHeJemJubVxiW1thVmlzY2BbZ25wZodxYXFmV11ja398ys6HuaFqbW2KbHGDcXuDiX56kIR5eHN4dXR7amx2Y4R1kYJ2b2ZffYJ6jIplcoJranFjWGx6hZuIgoFylpR3f31vinOFjY6KdJmQkomGi4N7eX1wcG98ZmhxYW14cWpscXh9fXpdZXqAeGp2eGaDd2h0iIyOlX1yiGpvfoF5b31dWXN/bnSBi3yCb2+KgHF3aXiBgoGCeH5zfHWHfXtzZ3NhbouAa3FXaVx2W0dtakxWVV1TVXtrYU9UdXJQUVRXXmN1hmldYGxqZmNab2FYYm9HQWdcYGVdXFZ7XU5VZXBZW2poXVdnYF5yZWpocmdwc3eGeG6Vi3R/enh+eYOIf3Vyf4aFjoJwcHt4d3Z5hoWHjIZ5e390i319hoSDh35+fn2Hf3x4dXh4kZOff4x8im11f3hkg4aVhXORim+FhYF6g3RkbmpZX1tcXVRnc2VgWGNxcmeAcmJrZVdbYGp/eL6ue5+3bmFzhWhzenF4gYR6fYt+d3dydm97dmVqb2GHdY6Ac2piXn54eYuEZnF/aGtrWlZvd4iigIR/cZmTcoF6doRvg4SUinWXio6JhYmFfXh0cW5oeF9qbGBtdmpnamt5d3p2Wmd9fHlmc35thXVldYaNhpeAcIxna3uEdW51Yl1xfWx1fYx7gmd1h35ucWl2gHl/gHR+bXt8gnt4cWZsYW2JfWxsVWlfdlVKaWpOUU5nTFh7aGFOVXVrTFFUVV9ndoRnXmFxaGdiV2pdXGtnSkRqWWJjVllVeVlNVm1qWV1rZFxZZGJedGVtZHFncnB1gHdwmYZ2f353f3yFh311c4KIgJWCbnN5e3pzcoSHiYiDeIF9dY9+fISKjYOBhHt+i4N7dnt3d5qdmHqJgoZpdnx7bIODkn9yjoFwhYJ/gn9wZ2xnWF1bXFtTZHBkXldicnVqdW9lZWNXXFtof3BvcoBziWRkeX1pc3VzcoGDd4CDeHZydW1qenFhZ2tnhnONg21mXV99cHuJf2lteGdqZFVXcm+MpnyEe3aWkXR9dH58b359k4h4m32Jh4OHg311cHFsZ3RcbGdebHRkZ2Vpem97cllngXd1aHCBeIJ3YneGi3yVgm+Mam17gnFndGZhbnpoc3iKe35idoR3amxydXxye3t0f2iAf4B5d29kZmJthXtsalVoYW9SSmhqT0tOb0ddemZhTVV0ZEpPU1dha3d/Zl1ndGlmYFZkV2JwXEtLaldjYVVUVXNWTFh1ZFlea2BbWmNkX3ZnbWJwaXRvcn50dJmCd36AeIB/hoR6fXWChH+XhW5ydHx6dXGEhY+BgHqLdXOQf3yBlY2AhYR9fYyGen2Ad3ujpYp5iIWEa3R7enWCgIt6boRzeYR9goN2b2ppZVZdW1paU2JuZFtYYXN7amhtaWBiWF9aaX9pa2+AZ2xgaHl4anJzc22DgHp/fHV0bXpoanlqX2VuaIF2j4RnZVhid2p/h3tvanBnZl1UWG9njad2gHp8kI56dnGAcXV4e5KCepd2hoSAhoh2anJ1Z2duW2xjXW1yX2dhanhoe2xbboNydGpwgX56eGF3hoV5kIV0iXJweoFyY3JpXXF4ZXJ0iHx5Y3SAcWdqeXVzbXl5dnllhXx/eXdxZGRjbXt8ampUZ2FlU0lrZk9HUWpFYHdmYU1Tcl1KTVVZZWx4fGZfbnFqZV1WYVVublZKU2dXZV1YTVVrVEpbeV9bX2tdXVpiZV95aGxhb292bnB3dXqYfnZ/gXmAgIeGenl6g36Bk4NxdHR+enZ0hIiRfYB8kGtylYB7gp+Ffod9gH6GgoCKe3eEq55/eoeHg2tygXl1gH6AdG6GbnyAc4qAanBuZGRYX1pZWlRiamdbWl91gmlebWxcYVdcXGuBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cWx5Z2l4Zl1kc2h6d5KBY2NUZXBogoV4eGdpamFXVllnY46nb353gIuOe3Fyf2l7cXyOfXiQc4V+gICGbmR1cmRnZ1xqYV1vb1tnXm10ZXpoXXSAb3JrcXx+dXZidIaMe4mIgYF5c3WAdmJxbltydGNxc4V8dWVzgG1hbXtwa2p8enZ0Z4d2e3t2cWViZG1yfWlrU2ddXFRLcWJQRlVgR2J2ZmFLU29YSk1YWGhrdntlZW5xZ2RaV15Yd2VUSlxiV2dXWUhXZFBIYnhaXV9sWl5cYmNdfmlqYG90eG1wbnaDl3pygIB8f4mMhn11dYZ4h4x8c3V1gXl6eoGMjnx+hIlpc5aBeoqdfn6FeoF6f3yGiXNxj62Me3uGj31kcYd5c3x6dXJuhmx7fmyPemNwb2JlXWVWWVlXY2ZrX11cc4VoWHFuW15YWlxse2Jwd3VsYVlsc3NndHVvbIN4fn94dm1uc2RodGVbZ3VmdnaRel9dUmZna4OCdH5iZGpcVFddYmOOpGl4c4OGkXlucXxqem9+iH12inSCeX15gGlkdmxgZl9eaV9ddGtZZVxvb2J6ZVx3fGtubnB4eXR1ZXOEk4CIg4l7d3Bzf3RjeGVccXFicXKCfHRncoBlX253amVoen11b3CDdnR9c3JiX2ZtbnxkaFNnV1hTTXZeUElZV0hidGNhSVRtU0pNWldqbHJ8Y21tc2NiWlpbYXdcU0tjXVdoU1ZGWGBNR2l1WF5gbFtbX2FiXIRpaGFueHltb2p2gZB5bYJ+gIGTiISBdnSJdIyGdHF2doF4fX1+jJB/fpN+cHeVg3yYknmAgHh6foB0iIR0cZmhenp/iZR3Y3WHeHN3dGt0b35reHxwkXNecG5gZ2JsVFpaV2hjbWZcXHGJZVNybltaWFdgbHZjaXVqaV5ZbXNwa3Nzc2mEfH5+enZubWtkaXFjW2pyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJJ1bGx7b3ByfH19c4J4gXR7enpkZXVnXWJZYGdbXnZoV2JdcGhhd2FbfHZpanJveHRzdWlxgpaEh3+Fd3RrcX5vZ3hYXWxuY3JzgHpzZ3B+XGBwcmJga3N/bW52f3NxeGtwYVxlbGx6YGZSZVNWUU91WlFPWFFIY3NhYEdWalBJUFpWa2trfWZub3JiW1pYWWxxV1JQZlZWaFNURVlbTkhxdFhfY2xiWGBgYV2LamNkbXp4bHBpdXmHe2uDfX+EmnyDhHl8h22Ph3Judnp8dIKCfIuPgoKXdHiBk4WBnol1gYCBdH+CcYiDdnChlnN6houGemV3im5tem5meHB6a3N2c41rXnVuYWdla1JdW1VnYWxrWlxxjGRPb25dVlhVZ2lzaGJ0ZWRcWG10bG91dHhqhnx/e4d2j3JjZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1kX2NUWl9ZYpWVY21wg4WKdGtpfHBndXl1fW17dXZwe391X2ZyY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGl0cXRxdXdrbYWUgol9h3JzZ3B/cnRwVFxna2ZydIB2c2NtdlZjcmxbX3BnfmZueH5zdHNqbWFaZGlqd15lU2NUVVBTbFZQVlJQR2RyX2FGWGlOSVhUV25pZX1pbHhsYlddVVt0ZFNSV2hRWGZUU0dZWU9Nd3ZaX2VraVlhYF5djm5iZmt5dW5vaXZ2gH9sg4B9h5h7gIeBiX5rk4hyZnSAe3WAg32Jjn+Lk3J8ipGFh5+Ge3+GjHOBhnN+gnZupItygI2LdndseoxgZHtwZnlzeGxtcXeDZ2R8bWNmZ2hTX15VZ19sbltebo1oTmltYFRWU29nc2tleGRkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcHh+Z1pWWGBseHx7cIRfY19nVlhfV2ObiGJrcIGHfXhsbHpuXXhzbXxrdnRvcHyBc1hqbl5YXFVhYldkcGNTXmJpYWJsWmF+bGZsdHZvbXd3bGmGjYCKe4lucmZyfm50bmRbYWlpcHSBdHNeaW1TZXFlVmNvZHxkc3h9d2xwbWtgWWFmZ3RcZFVgVVJOV2RRT1tOT0hkb1xiR1lpTUpfS1ltZGB5aW5+ZWBVX1RddVxTUmBmTlxgVVJJW1hQWXR1XV9la2hYYmBbXo1xY2dqeHFzbmh2dHuEcoKDeoiOfnyJh415bpCJdGtzgXR/f4iFh5GElY95fYyOh5GbhIB8jIVzf4FzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2NjY2NjY6NjY2NjY2NjY2NjY2Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo2NjIyMjIyMjY2NjY2NjY2NjY6Ojo6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZjgL67u7u7vbNtZmdnZ2dnbW5ubm5ub2pmZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX1t+yMTExMTGu2deX19fX19lZ2dnZ2doY19fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYySkZGRkZGQiYiJiYmJiYmKioqKioqJiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZGSkYmHjoqQkpOOiI6OjZGIj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjIuLi4uLi4uNjY2Ojo6OjY2NjY2NjY2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkYqGjYeGiYWIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCRioSJhoWFhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPjYWEh4SGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuFiIaGiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNjIuOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2doaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fX5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz49Ojo6PDo4OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9P0A+PD5APz09PT89PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD47Pjw/PTw6Pj0/QkJFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHt7fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPztBQ0RCPz5BP0FERURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSElHSEhJR0ZCREZERENBVXSHiYeHhoiCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSktNSktISEZGR0ZFUGyEh4aGhoeHiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8/P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX5/fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS01MS01MSUZKVmyBhoWEhIaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l6e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSUtMT05OUU5RXnKBhYOEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkE7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+f35/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQkZIS0hMS05UZ3uEhIOCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg6Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5/fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo8REJERkZEVniEhIKCg4KFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Nzk5NzY2NzY1Ojo7Ojo8ODk4OTk4Nzc6Ojo4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUVdrcnJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxEP1B9hIODhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+PDo8Ozw7PDw6Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj49Pz9DdoSDhISFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQkFBQj5AQ0FAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBBQD8/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojs8Ojo6PDs9PkA/PWGFg4SDhYSGiYmIh4aGhoeIiYqLi4qKiouKi14+REdJS0pKRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo9Ojw6PT0+Pjs+PD8+Qj9KfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKh1dHTExNS05JSUtISUpKSUVDREZHRkRDRUZEQkhJS0dIR0ZHR0VLSkxJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9PD5AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3Oz47PDo9Pz4/PD8+QkFEPmiEgoWFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NT01MTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExtcHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ojs8Oj0/PD09P0BDQkhTfoOEhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTExMSklIRkpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5PTkxPS0lHSUpISURJSEhGRkdHSUZDQkFDVW9wdXd4ent4eHp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojs3PD06PD88PD0/QkNDTG2Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIyLi4uLXlJSUE1OTUtKR0ZDSEpHTEpHS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDg/PT0+QEVEPUJEQ0ZKdYaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVGRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNSUExKTU1NS05HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PEE/QUFEVEtCSElGSUt4hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISkhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUFDRkRDREtWUEpPT05QUHmGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1WXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NS0xKSUlMTUtPTVNvdHZ4eXh3eXp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hMSU1QS0lKT1NRUFRWVVZUdYWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl5eW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSklJRkJEQEE6T1FRV1hQUFBRUlNSVldXV1dsgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWlpYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaWlJTUU9RUlFVUlVTVl51eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNPT1FPUVZRU1JSVGNkdoCDgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVVJNT1lRTU5RU1VVTVFTUlBOTEtHQ0lHUlNUWl1tcnZ2dXR0d3t6ent7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0YGRdXltZVVFMSUxJYWySdFBRU01RUlBTW1JTUlFSVVVic3t8foCBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+QkJDQ0E/RFBDQ0BDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hCQ0hHSEpHQ0JBQ0BOUE1SZHR1dnVzdHZ5fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaGVlYlxYU1FQVVJzV2VbT09OTFFSUFVZU1VRUVRST1Zga2xzdnp7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo6PkA/Pj4+alBLYUVGSElFQj9ITE1HTVFVSkJFPz48PTw9PT89P0FDQj8+PD1CPklNRlVvdXV2c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSk9QTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sbmpoYG5yaW1scXV7en17eHp8fHh3eGRCQEBBPDpCQ0FBQ0FbXE97Tk9PTktMTU9PUExLTFdOSEdBQTw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXZ1dnd5fHx8fXx8fHx+fXx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9PXlxaSUdPUVFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfXl9lX11ecXdrXmBna3dvb2xqb21ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RV1BNSURGPjk5NjU4Nzk3OTozNjU3OTU8Qj1mdHV3eHd6eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1NUU1BRVU9MUlNUV1hTVFhRTFhZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9NTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25ydXl5ent7fX19fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTU1MSkZQUFVZU1RPSk5PVVNUXFZSVVNTT01MSUhIRj8+PTo3ODc2NTk5Njc1NjVXcXF0eHp6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhXWVlZUlVPSUdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBQT05OTVBOVFJQUkxJTEtPUlBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1ZRU0ZGQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj0zQD5qb2FSUlFAR1RRT1BQUU5RT1BPTEpMTE9QTk1QUVFOUE9KTE1NS0dFRUNCOz09PDk9RzY2NzZEbnF1d3p7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlVZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQjhETVNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTE5OTUlNTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRyc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QUBCPT5FSEZERkZJR0pKQEZBQUBFR0RJT0hRUmFcUVBST1NOT09MTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRT9CQz49Qkc/Qj9AZHJ1d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNOS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PEJBQEdKRU1PYmVQTU9NV0tMTktLTU1MTEtOTlNkTUpMUklJSUVCSUpMTU5KR0lGQkJCQD9FRkVIRExvcHZ6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0dLRT9CPTk5OTo/Qj88QUJBQURER0tGRElJR0dIQ0M/Qj4/P0A9Q0VETE1RVExKSU1URklJSkxJSktJSUxNT1BRUEtHQ0tHQ0NLSkxOT05JSklHQ0NDRElKTUxJWnNueHl4enp7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEpDRkdIR0pLSUpMREdCPD49Ojo6O0FCPz1CQkNDSEVKTEpFSUlGR0hDQztBQEI+QD9CRERJTU9HSEpHSEtESElLTUhKTEhJSkxKTV1SSElETkdCRUxLTk5RTktNSktGR0dKTU5STk1jbmp3dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZXBGSkNGRUZERUVGRUdDQ0A9PD06Ozo7QURAP0JDRUVJRkpKTEZJSUdGRkRCOkFDQz4/Q0NDREdLTUhKTkhESEVJTE5NSElMR0ZGSUlMTktJSEVPSUNHTk1QTlBOTk9NS0lISU9TUVJOU2dnZnJvc3h2e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWZfcEdKQ0VFREJCQUVAREI+Pz47Ozs9Oz0/REI/QUNGR0pGSklMSEdHR0ZFQz89REVCPkFDQkNFR0hJR01QSUZFRktOT0tGSElGRUNESUlIS0lHSFBLREpNTVFOT05PUE5KSklNUlVVUlBYZWFhbWZwcm9yeXpnZWhoY2lsZnFsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFREZCQUBBRDxCQT5BPTo6PT87Pj9BQj9AQkVHSkZKR0lHRkZGRENCQUFFRkNCQkJERUVHR0hGTFBMSE5JSkxLSUZIRUZFQ0NISEhLSkdLUk1DT09OUU9PT05PT0tLS1BVV1ZWVFlgX11pYG1pbmhyc2JlZmZkaGhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNR0dFR0FBQENEPEFBQEM8ODo9Pjo/PUBCQEBAREZIRUhGRkhGRUVEQ0VCRElGQ0dFQUVHRUZGR0VJTUtIUUxKS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTU9QTUxOU1dWV1lWWF5aXWRgaGNqaWdrX2RlZmNoZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQUFCRUU8QENCRDw3Oj0+Oz47QUI+Pz9DRUZERkRER0VDRUNERkZGSkVFSUdCR0hGR0ZFQ0ZKSkdNSkxLSEpLRklISkhFS0tMTE5PUlRPSFRVVFFUUFFNTlFOTVFXWlZaWVdaXlpYYWBgYF5oZWNgZGVnZ2poaGpnaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0hDQUNHRTxARUJEPDg6Pj4+PDxCQj1APkFCRkNFQ0NHQ0NEREZHR0dJRkdLSENJSEdJR0ZESEtJRktITUtKS0tIS0pNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVFlaWVxaWlxfX11fY15cYmRsY2BkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUpISkVCREdFPUFHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERURGRkdIRkhHSUtKRUpISEpIRkZMSEhISkdMS0xMTElNSk1OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZl1kYGZnYGVoamRzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndwd0lKS0lLR0JFREU8QUZEREI7Pz9BQEBAREFAQj5BQ0hCRURGR0VIRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tKTExJSUxLTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYmBjZGVhZGliZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dXNwc3d0dXV3dnV1dGVxc2twcWpydnB3SkxMS0xHQ0NBRTw/RUVEQz1BQUNCQkNFQUNEQUFFR0NHR0hGRUlGQ0dKR0dKRklMSElKTUtNTEdLSUhLS05RS1JQTFNNSk1NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYWNeYGZjYWJnbmhiaWhobXh2bWhpbm9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZzcXF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdEQUBEPj1ERUZDP0NBRURERkNCRUdDQkhGQkhKSUdISkZES0pHSEpISUtHSkpOS05MSUxISk1LWmZKZFtLbFJHTk1fblVsc1txcGJ3Y1JQYnZ1aHVjYXZhWG5xYmR2aW56ZlxsdWBsa1Zgd3VoamdoZmdsbWptb2ptb3NycHJycXJzcnNzcnRybmx0b25wcXF1dXJxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PERERkRDQ0JFRURGQkVGR0RESkVFSkxLSUtMR0dOSkhKS0dLSklKSk5MTU1MTElNTExbc2JkcF5sbFVMTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtpamdvcXRldG5uXHB2Z3BOTHJ5dmthYWtlZWx4bWt2bG5vc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQT89QkVGQkVDRURFRURDSEhHRERLSEdLTU1KTExGSk5ISktKSUxKSklKTU1OTU1NS05NTVtycG9ucHBrakxPUG1YTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBdYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRUVFQkFCPT8/RUdCR0RIRUVEQkZJSEhFR0tKR01MTkpMTUdMTklNS0hKTUlKSUpKTk9OTk1MTk1MXGhkdV1scVZrTU9RblVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZJTEtGTUtLUlJMSE1NSU5KSUhOR0pKSElOT01OTEpNTUpadHBwb3FxbGtPUVJuWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqWl50Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNEREVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRkpNTEZPSkpXUktHS0pKTklJSkxJS0pJSUtMTU1MSUtLS1NrYllpXl9qY3JyWl9Zam9fZWVVa19jW2FhUWBtaFxqXG5paWRbb2VkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZKREVDRkFAQUVEQ0ZCSEpMR0ZDRktMSUVGSk9MSU9KTFtRSkZISEtNSUhKSktLSUhJR0tLS0tHSEtKTEtMSklLTE5UW11UUFVNUU9OT09WUU9QUU5PUUpKTlBRZHFpVFlWW1tcVVlaXVhdXFxjZmFhZmJjZl9eZmttaG10eHJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkBFQz5DR0RFR0NJS0xHRkRHSkxIREdJUEtMT0tMV01JRkVISUpISUtITEpJRkhISkhISEVGTElISk5LSE9cV15PXFxgXk9YWVNcXGJeTVhaTVhhUktZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExMQUNEQURJRUdHRktKS0dFRUpKSkZER0hQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHRUVKR0JJTElKVF9ZYFhgYVtgVVhZVF1eWl9SWVxQXlxZTl9cXlNbXmReWl1gY19ZX2JbYF5bVVlYWl9eY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdXl6enl5eHh4d3J5dnhycXh2dHZhU0pKTUhEQ0JDRkdFR0dJSkpJSERGS0tLRUVISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUZDREVCRkpEP0lKSE5aYlleXmFfUlRTV19fXF1ZXlFZXE1WX1dLUVlbUVtfYmFdXmNhYGJiYmNjZVpSWVZXXVpeZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZER0VCRUdIRkdISUZHSkdIRkhLSUtEQ0tKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdJRUVAREFISUE+SElGT11gWltkXV9UUVJYXVxcXF9bS1dcTFJcWUlNXlFRXV9iY2NjY2JcZGNiZGNlWFJXVVRdWVthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNFS0lGR0dJR0dKRkZGSUxKTkVDS0pMTkpMSUtKSUlHQkhIUU1LS09NS0tJSEhGRT9FQkhIQUBGRUNTXVleWF9ZX1tdVVhYT1xcUUtKVl5YXltdVlphUlJfX2JiYGBiYl9jYmJkZGJYUFJSU1xUXF1dXl5fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdHREZNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtKSUdESEtRT01MUE1MS0tJSkRFQUVDSEZBQUZDQVVVRVxUXlNWX1hOVFVNWVpMSktUYGFbX1hfXmJdT1liXGBgX2JjYV1iYVdgX1RRUFFSWVNeXFtdXV5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVNjUUVXX0lHR0hERk1KUFBGSUhKS05MTEtNS0pKR0VKTlFRTk5QTU5NTklMQkRBQ0NGQ0JAQ0RATEhDTExQT05MRk1GRkhJR0ZMS01PUElMT1BQU1BMUVNSVVpYV1lXV2NWTlJUUFFQT1FVVFxZWVtdXGFhZWZjaGRsbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTl5NSEhZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tQU1NOUFBOT09PSExGYEVEXkxEZmJDTFpIXlxzbU9NVm1YS0NPX1RrVmdJXVdVXkRMUVVMTVNWUVJUWFZUWFRUXFRPZVpoaGVaVWtUWFdVW1xbYGBhYmJiYGdpZ25saHJ6fH1+gYSEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtQVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPUEpMTkdITVFbWU9QUE5QUVBKS1F/UUl8WVlyc1dQbUdxbm9hVlBxcXRPQmpzbnFzcFNvX1tuWF1WXFhVa2hVXVZjWWBZWl5VVVd/aXR1dV9hdl9YYlxcZltfYWFhYl5gY2dtb2xgcHd0eIGBgoOEgn99foB2eHptdn50eH2AfH6AgYKEfICDen+Bf353d01JRUhNTUJETExHSkxGUlZMS09ITFJYV1FOT09NUVROT1FQS0xPR01QU1taVFFST1BQUEtJWnhdVHhkaFhSU1B2ZnRscGJuZmtSck5Md21qcnBzcnFycG9vgF1lenV4cXF6cX5yfWt1fWFSaHxlc3Nvc3N8fW9+eG9/cmBgYGJiW2FhaGxua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTUtGYF1HQUVNTUhLS0hKUE9NTkpOVl5ZVUxRU05ZWUxTUlJOTFBJUVJUWVdXUVRQUFBSS0hneGxjeHFtWkpLVHlwdW11Ym52UGRkSGV2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Boblh1dWp2dXCAYXNofWlseHxvX19fY2JcX2RlZ2pqZWdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN2em58fXl4cm5NSVJ0TkNCRVBRSEtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlNKS3JvdXVxdXFjaGBWbktxcF5HaHlXdlRLaHh9d2B5e3NuYV1tb2RTZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW58bHF2dXheX19iX11fZWVpZ2hmZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlFLTU5MTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUklSbUhpd0tgZHZ2VFZsTm5se3Jhamd/dVRLV2tnfGxtbHhfWnB6e19genNjcm94cWhkfGlye11US2tfdnVsanZ8e21+eWt8cF1eXmJbX2JkZWdmZWVjW2NjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsZ2xtcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUExMU1NST1NSWFJXVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTU9VTEtLUlNSUVJPVlVRUU9SUlhYUE1PVVRXWFhbW1VRUldbV1hXW09SVFdXWFFdWFZcVVRPWFJXV1hZWmBcZ3JfW1taXV1fY1pfY2NlZ2RkZGNaZGJnZmZtbm11ZmZnY2BmXl1nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTlJRUExWVVRQVFVYVVpWUltdVlVUV1VZWE9PTE5XVFBOVVNOUE5MUVBLSVFRS1FNSkpPUVRRUFFTUkpITU9QUVJQUFBUVVJYV1xXU1JQUVVVVVNaUU5SUVdVU1lWVFhUU1FUU1VVWVlYXlpfYV1cWlpcXGBjXF5iYmRnZWVlYllgYWNhYmhoam5jYWReX2NdWmNcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFSTVhXVVRWWFdXWlZTXGBWV1ZZVVhUUVBLT1hTUE5VUE5RTkxTUE1OVVNOUU5NTlFTT1RQUlRUTktNT1JUVFFRUVVXVVlaW1lSVVJUWFdWWVxTT1NUV1VUWVVWWFRSUVdVVlhcWlxgXVdZX11eXVxdYGFeW2JjY2hnZmViWGBgYl1gaGVnZWFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlNUT0tPVlRQT1RQUFFOTVJRT1FYVFFRT01PUlRNV1FTVFVPTk5RVFZVUlJSVFhWWl1cWlZWUVJXWFVbW1ZQU1VVVVZYU1dXVFJRWFZWW19bX2BfVl9dXmBdXGBfX19aYmNlaWhlZWJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1VRT1ZcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1XU01NUk9RUk9NUFNSVVpVVFBQTFBXVVBWUlNSWE1PUFJVWFVUVFNUWVhbXl1cW1ZST1VWVVtaVlFTVlRWWFRTWFpTUlFZV1ddX1tgYGBWYlxgYV1gYl9cYF1jYWNoaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOUFdTTlFRUFJUUkxSVFNZW1dVT1JOU1hVU1FUUVFZT1FTU1ZbVlZWU1ZaWF1eXFxeVlNOVFZWW1tVUVRUVVdYUlNZXFRSUlxYWl1eXWJhYFdiW2NiXmFjX1xiYWJfZGdpZWddXGRgYWBhY2RfYl9ZWl9bXFtYWFlXV1paWmFdXVtdXFxaXWBXW1taUE9PT1lQVVVTUlhSVFBbXV5dXGBcYFVcXGhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1FWVVpaWlNPU1FVVVRSTlVRUlpSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WVldeWldRVFRXWFhTVllcVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl5eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBaVVZXVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVJPV1FTV1NXVVZbXlhbWVVaXlhfXllcWVJXUllYWV9ZWVJUVVlZWVVXWVxVVFpdXV5hYmBlZF1eXV1lYWJmZF5fZGNgXGdlaGZkYmBlYV9hYWJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUVxVVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hSVlVTUVJXUVNWVFhYWF5eWF1bVV1fWF9fWFxWUVhUWVpaYVhbVFZYW1laV1hZWldWXV5gX2RjYmVlXmJcYGZiZGZkX2BkYmFbZmNoZmRmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZUXFVXV1lXVlxgYWJjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlRSVVVRU1VXW1tcX19aX1xWX19ZXV5ZXVZSWFdZWVxiWV1VVlpcWltaWllaWFlfX2BgZGNkZWVjZFpiZmNnZmVeYWJgY11iY2llZGhfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllWWFdYXV9iYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVVVVNVVFhdXV9gYF1hXVdhXlteXFteWFVYV1taX19bXldYXFxcXV1bWlxXWl9hXmBkZGRmZmdjWWNmZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWVhaWFdbW1pbV1haVFpdXFtgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXV1dWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQV1VXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXF1ZWFVWW1tgXlxfWVleXV5eYFxaWllbX2JfYmVkZWZnaGNaZWZnaWdjX2NeYWZlWmlpY2ZpY2ZfYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVW11dXWBgYmF4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tcX11gX11bYGRcXFhaYmVjYVJcWU9YVllbWVlXWVpgXmFiY2BhY19cYl1fXVteXVlZVFhdXF9fXl9bWl5eYGJiW1tXW11gYmJjZWRnZmZnZV1lZ2hpZmNhYltjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1ZYUFhaXWFjZmZya39KWVddW1pfXVxeXFhdW15fYmNiYWFdYltiZGJgY2JiXVxbWldYanFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl5eWlhVW15cXGFhX11bYGFiZmJeW1NcX2BjZGRmZWdnZmZmYGZnaGhnZGRgW2VnXmFoaGNpaGZjYGJgY2JfX19dXVtaW1lYWFhWWldcW1pWVlVMWFhcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGiYeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5ent7enp7enp6enp6enp6e3t7e3p6enp6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl6enp7e3p6enp6enp6ent7ent6enp6enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PTz8TFxcXFxcfS1NTU09PTxL6+vr6+vsrT0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OXg1NTU1NTU1uPl5eXl5OXSy8zNzM3M2+bl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f3+AeXd3d3d3d3h5enp6enp4b29vcHBwcHJycnJycnJ3enl5enp6foODg4ODg4OCgoODg4KDhISEhISDg4KCgoKCgoKEhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3V2d3p7eHt4d3Z5fHp6enl9eXl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5enp6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnp8eX19e317eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en57fX19fnx4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d4eX19e31+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3h6enp8fHx8e357eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4enp5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qKi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGCg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhYSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBf4GBgICCgYKCgoGBgoKBgIKCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgoGCgoODg4SCg4ODgoCAgIKCgoOCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhIWEgoKCg4KChIKBgoaFg4WDg4SEhIaFhISFgn99fX1+goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISGhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDhIODg4SFg4KDhIWFhoWGhoWGh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhYWHhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SDg4KDhYSFh4eFhIKAf39/f3+Af39/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoSEhISFhIGAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4WDhYSDg4KBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIh4iHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhIOFhIOCgoKCgoOBfn1+fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIhIOEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4ODg4SRkpGOj42Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFhoiLioaEhoSChoaCgIODg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYOBgICBf359goODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgYGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+f358fH+Dg4KDgoOBfX1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBfn19f4CBf39+f4CAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgX98fX1+fX1+gIB+fX59e31+goODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAf35/fn5+fH5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gH19f4GEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39/fn9/f359fn9/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWSko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKDgYCBf4CCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gYB/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4ODgoKCgYKBfn59fX1+foB9fX19fX19fXx7enp5eXl5gIKCgoSDgIKDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiIeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFhoaHh4aHh4iGh4eHhoeHh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf3x8fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImJiYeFhoWDg4KBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKDhIOCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY2LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBg4OCg4KCgYCAgH+Bfn9+fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgYGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYuMjY2PioWGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOHf318foCAgYB/f359fX19fnt7fX9/f4B9f36AjJGNi4yNjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fn+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX5/f31+gH5+foSSjIuLjoyLioaEhoSEg4ODg4KDgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e317ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MioqMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgX+AgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeFgoSRjoyKiYqHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fX9+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt6fHl7fHt7fXt9fn5/gICDh4mJiYqJiomFiJGNi4eIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fH19fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLiomMkI2MiIiGhYSDgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjIqIiIWEhIOBgoKCgoOCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fX59fn99fX17fH1+fHx7fH16enl5enl7e35+gIGDh4SIjYyJiYaFhISDgoKCgoKCgoGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgYGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImMiYqHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBhIF+foCAfX6Afn1+foCAf4F+f4B/f3+Af31+f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iYmHh4WGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF9foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fYB/fX1+fX5+fX58e3x6fHt6gIWCg4SFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCDgX9/gH6AgX6AgYCAf35+fn5+fX9+foWFgIGAf4CDgX9+gYB/foB+gH9+fXt6e3p8e3qCg3+CgoKCg4KDgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgX9/gH+Bf4B/fHt7enx7fIGAf4F/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgH+AgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f359gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgX57e3x8fH19fX59en59fnl+f398fHx+fX6BgIGBgYCCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4ODg4KBgoOCgYOCf4GAf39+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCBgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXd5cniFhYWFg4SEgoKDgoGBgoGAg4GAgH9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgYF+f35+fn19fX9+f358foB/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/f4GAfIB/gH5/gYB/f32Af35/f359fXyAgICAgH5/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGDgoKDhYWCgn5+fHt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc3B4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYB9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFh4SFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4F/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGBgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjHp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYGBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1/gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gYCAf4CAf4CBgX+AgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhYODhIGBg4CCg4GBgICAgoOCgIKChYN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIGAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCgoKCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5eXx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAgoGGgoSDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoGBg4GAgICAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDg4SEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCgoWEhIODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z0fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OCg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fX99f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dXZ/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOBf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhISEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fICBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOCg4F/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn1+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgYGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn18fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWLiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4CEg4B/fX1+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3x/c4KDf4ODfYF9fX59foKDgXx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/fn1+gYCBfYB+fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHh4iGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaGhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaFhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoKBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYSGh4aGhYSGh4aEhISFg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fX9/fX6Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWEiIWGh4aHhoiGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGhIaGhYaFhIaGhYSDhISDhYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoOEhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIKEg4KEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WFhIOEhIWGhoaGhoaHhYWHhYaFhoWEgoSDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHhoiJh4WIh4aIh4aGh4eFh4aIiIeGhYeGh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4KCg4aBg36CgoOAg4N/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWDhYWGhoaGh4WHhoeGh4eFhIWFg4GDgoCDhYKDfoGBgX+DgX9/fn9+f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYeGiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeGhYeDhIWEhoaGh4WFhIOFhYeFh4aHhYaGhoWGhoSDhIWBgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhYWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFhoWEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhYB/gYCAhICDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx+fn58e3t9fn18h4aFhoaGhYWFhIWFhIOCgYCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYaCgoOEf36AgICBf4OAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fH9+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFg4SEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N/fn+Af39/g398gH19f4J9gIF+foF+fX19fX97f3x7enl6enl6enx5enp7e3t9ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIKFgoWBgYB/f4CAfn+Agnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSFh4WHhYWCg4KBg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn99fX9+foCDfnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+foGBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4OEg4OAf4CBfn18fn58f4N9fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enp6enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSGhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSFhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag359gIF/fn99fHt8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ojw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8ODo8Pjs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ozg5Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5Nzo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dTV1NTU1NTU1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2tnZ2dnZ2dna2tra2tnZ2tvb29vb29va29zb29vb3Nvb29vb29vb29vb29rT0tPT09PT1NTU1NTU1dbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKiZKZmJiYmJiYmJiYmJiYl4yLioqKioqKioqKioqLhoGCgYGBgYGBgYGBgX+P09LS0tLS0tPT09LT09Ld4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU1FibGtra2tra2tra2tra2lVU1NTU1NTU1NTU1NTVEtDQ0RDQ0RDQ0REQ0M/XdLT0tLS0tLS0tLS0tLQ4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dWZXBvb29vb29vb29vb29tWVdXV1dXV1dXV1dXV1hQR0hISEhISEhISEhIRGDR09LS0tLS0tLS0tLS0N/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiYW94d3d3d3d3d3d3d3d3dWNiYmJiYmJiYmJiYmJiXFNUVFRVVVVVVVVVVVFr0tPS0tLS0tLS0tLS0tLe6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvNzs7Ozs7Ozs7Ozs7Ozs3MzMzMzMzMzMzMy8vLzMzLy8vLy8vMzMvLzMzLzdTU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7OztHU1NPPztHSzs/S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbX19fX19fW19fX19fW19fX19fX19fW1tbW1tbW19fX19fX19fX19fY2NfW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7OztGwg4STztO4ns/RnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/Jm7u4na+3l5m5upW4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Rw6KPgInJnaOostGSfX6vsdLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+eiqfQ08KGmrXV082ensTQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9G6pKycntHWo5i01NPAoKDQ0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/RwKCek6W32KKZtdTVsKKp1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1Ojo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NKmr66bptmimbXU1aShudTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRydfEmKDZopq21M6en8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT87PDk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxY2eoJ2o2qOatdfDn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhycGhraGgv9iim7TZsqSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPVq42PqdXWsoTG1rmDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTBvdXS0tHE1dHRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEA+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR1NXS0tLT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg3ODQ7Pzw/PTk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PDo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU2NjY3ODg6PTs8Pjo8Ojo9PTk8PD08PT08Oz1ESERDQTw8PDw+PkA7ODw4MTU6QUZFV661tbW2t7i4ubi4uLi4t7i5urq4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg4OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NTY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1OTc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU3ODc5Nzs6Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaippqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk6Pjc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQj8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQERBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/QkBCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojs7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojs5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw+Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QEA9QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6PD07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDo3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzo6Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubm5ubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjo+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ2PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlY+LlJORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg1Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI+PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThBQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLh4iFhIiIiYSAgn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6PDo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1N0JGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCMf4eNjIuLh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNTZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6SjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUUlBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZGNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxnYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW19eWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjI0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtq6WppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ozs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzg6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVRhaGBmc29zaXRjaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5tW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8Oz5CREU+Pj1AQ0NDREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7WzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJiak5GZl56hlZiakpiUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQkA9QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxsDFx8vI1MvKyMa/u7u+xL7FyMbGw8TDuLTAt7S9wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLi7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZm5iXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N4ZmZdZFtSWElGPzs3ODg3NjE2OTc1NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oj07Oz4+REFBQ0JAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yc7JwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL24vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2JiYGBdWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzU7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaHRteGxdZFtVX1lMSEQ2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pz0/Qj9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8rIxszJzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWR0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPDv7++xMvIysvIvLvIx8nNyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw76+wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmYlpZWVxYUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ozo6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+6vcC5vbq6tL+4tbezr7u8t8C3vsK/wbu/wLy7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygp6GjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1VVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojw9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8DAt8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoaKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVkZm9pZWtnWFhOS0tKUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDk3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa8vMDEube3t7a6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLu6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJsX1tUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PT05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3wL/EvMLFxcfHysnGz8LBuK62tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6v8G/vba3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYVtiUEtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oz48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrq6Owub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5hYU1ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRDxBQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rbO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3LxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkJFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD1APkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi1vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVpeXFlRRURDTUlBRD1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjs/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcPDu7mztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqaipaqsr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBtaFxfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJiamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dndtcGBeZV1bVEo8Pj9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7KysrSyt766s7WyvLq8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cWxeYmBbXU5IQT89SENGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVk5ianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6trSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dvfG91cm1jXGZYXF1STk1BPkpCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NjpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCyse+wLi5trK0trO0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqmamp6aoaenpqepr7ayq7S2r6qwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdGlrXVtqVF1cT01IREZMQUZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub21sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u/v7mztLOxsa6wubm2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSD9IUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg7PT47PDw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqSeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rq2vsrK6ure3tbW8tK+0q7a6uMDEwbu1vL24sq2zsK+srre2srS1r6qknpucnJ6oqJ+gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lo5ujnJWQjI+PkJOQlpWWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxQaFRQTkdPTExDT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo9Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pzk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC5taelrKqotbKxsK6vsqemr6OvrrXBurW3sre2srSrsrSuqquvsLK0rqWekpiUj5mgn6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbCjpaeeoJyVk5CPkZCYkJaVmJefmJuZm6OZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJNSk1HO0RAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmjpK6lrKy0vLessrGvsa21r6+ztaqnrayjnJmUjpGWl5mZnaCjopudpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmVmpeXmKCenJyXm6Gbnpqjp6WfoaKio5yboaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4emBiUlVfSElJS1NUSVJQTDk+QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yeo6iurayrq6+qr6mfl56lnp6lpqSgop+moKKuq6yttbK2pq+0q6mqtLGwsLitp6GcnpqUmJuakY6RlpGMj46UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7qopqunq6uprKynoKCjsa2xsbSpsa+imZydnqGZm5uamJmblJWalpicpKGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlXFNaWU1RSk5PVExSTEE3PkI2ODw3Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaSfnJKcopufoaOenaCfo6Cir66sr7Gstqetsa2mprCuraywp6CfoqCXkZScoZyZmJKTn52hpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKerqLK1t7O3rLG0o6CdpaCsoaGioJ+amJaVn5ubmKShoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbVpSYEhRVUhGVVZKQk1HPUpIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm46Tnpmona6ep56coZ2empqSmJ6coqKgoJ2in5+en6mrp6ypqrSrq62rpaWqqKusqqWfnpmSkpSYmZaWloyIi4+VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaGroqmosqmqqKenmpmemammoJmnoJ+fp6ilpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7CmoJ6dnZeZlpmem5ykn5+dpJ2anZykoqSjoqqvrKepo6ChrK+uqqunoJ6foqOen56bnZyUlJWVnp6YlIadmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yup7GtscK2uMLGwMjKwMq/sLm5vbnCvbizu8XDvMK7t7Opsq2qs7Svs66prqOdq6e2sayir6Wgo6+xrbCkpK+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GknqaZm6Kknp+bm5uch4aBe3Rya2t1cnBoV1xRRVRIRElQSD5FQTRFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6WdlZubn5qenZ+lpqedoKCssa+npKSjoZ+mrKafl5yUkZmdmZWMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMy8zSx76/wMK9x8bCt8PJyMLAxb25s7m6tLu3sLWyqrqxrru2vrq6qresqqq4urS7rq24o6WinqeloqOpppmbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfnpya2Rpb3hqZVpbRkpMRERTTERCRDc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZWalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKfn5CWn5mSmpadm5mjoa+zqaGbnZ2fn5qXmJiTjY+Wl5OOjZCMgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMjJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM08/T08zKwsXGxsrHzr/I0MvGxcbEwLvCwL6+vrW9s62+v8LDxsTGw62+uLK4vMPBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQkA1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6Osnp+upqWxqsXGzM7Nv7DCqaWora2qoZ2jn5ydmqmTmaGQjqCTjZSSl5mksbGrpKCdoJyZl5WTlJeRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV19LXzcbHyczDxcrPytPX0dfS1dXT08jMx83NydLMzdPNxMfJycDFy8fIyMW+wrOzx8TLysrOxcm/vb+8wcbEzMzIyb/Dv62vsqieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3tydXZnYmh3aWRWV1FETUZASVFCPUI8OjIzQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5SjmJafnp2kr5ugsKuorLHJzdTXz8a7x6yttLisrqOfpKOfoKSsm5aplo2XjYyNl6awrqWdnp2hpaKem5aVlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU0s/Rw9DT1tfV1tLLyc7Qy8bN0srS1dbZ1dfT1tjO0snO0czO0MvSz7/HxsnCy8vLzs/Fxse2v8q/0szLz8XJx7/DwsjOzM/QzszKx824t7uon6arp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ojc2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKbqaaipqyapLCxqai10NTX2tLHxsu0tsLGsrapoqWmoaKrtaeasaGWlYyQpq2rnJWZoZ2boaKfnZ6blop4aWRhX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUz8/V1NTR0czRztPX1tPV0M/S09HJ09HI0NjX2NHX0tfZ1dbMzs/JzNHLztC/xcHGxc7M0NDRyMvMwMrLxdPOy87Hw8nGxsjLytTT0NTP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjQ0Oj01Mjc1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+uq6qrnaauuKirt9jU1dnZ0c7QwLzMybfAr6erqaOksbazo7aqn52hqqmhmJaYmpudoZ6anZ6UfnJmY2NfX2FgX2FgX2BgX2BmbXBwbmtvcnZ3m8zA0tXT2NjW2dHS0tfP087L083V1NHKz8zT1tLR1s3Q1dXRxtHUytHU1dbO0tDY2NjXy8jOw8jOy8rMv8m/x8jNzc/K0M3Oy87Px8rP0MrOysHIxsnMysvR0szT0dHPz8q9x7mwrbu4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wb2tiZW5wYVdcWklGRkRMV0U7QDwzMzw9ODY4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48PT46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp564trW1raWtrr61scDZ09fa3NbPzcvD09DCwrKrra6sprOyuauzt6mjn5yWlJecnp+fnpWWmJWKbF9fXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R1dnmkvsvV0dbU09jWzs7Ty83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvMz9HTys3R1dLV1crAycHFzMLIycLMwsXHysrOyszM0M3Ty8XHz8zHx8rExsDFycvNz9DGz87NzczPxcfAt7m9wsO9w7mys76wu8PEtqqYpaGZlpGVlZKLlI2akZSUj4+UgomFeHBya21oYGBxaFhYaFZNR0xJUFBCO0Q+OzY3Ojg5OjU2PT1BPDo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHw7nL1dbZ2tvYzM3PydbWxcS4sraqpK6tubmxssChl46NmJaQlJKRlpeWkYx9ZmJjYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnEycnGxr/Dxc7Ox8XHzcrRyMvOzcbR0s/OzNTKx8rNzsfGz9LL0M/FusS+xsm8wsbIzsTCx8DGzcfDy8nLz8fDw8/IxsHGx8O/wMfLy8vOwsrLyMfM0MTFx7rHw8jIws/Avby/sMHKx7q9qrGyp6WdopyYkJuQpJmXmZGVmImPgndudGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PDw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk7Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbOxrMnNysjEvr26zc3G0NXV2drb2NDK0NDS1MrFur6+sKm3q7+6ubOlko6OlpCGg4SEgn6FhYB0YFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83Eur/Du7u6ub7IxsLDwMPHysnIysfBxcvGyMvNycTBycnBwcvQxMvIv7nBusXHvb/FzsrDv8O6ycfIusfGxMrAvcHLxsXDvcW8vL/DxMvExLu/ycLFx9LFwci+ysnGx8bQw8PGw6/Ey8fEyre/vLq0qaylpZifmKyjoaWao6CblHt2cnRmaVphbm1aW1hRRExGQkdETENGUj81NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzL0NHMx8LDx83Pzs3V0NbZ2NnQzNTOz9DLxLjGwba1vLHAtrqskYyTl4d7gIWGgHZ4dXNxX1pbXWBhYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwbC2urKytLKxwby7u7m4wMHBxb69ub2/ucTKxcbCvcbAt7vEyb/Cybu3urrFwr68wc3Cxr69tcC9w7q8xrvCubO8xcPCwra/trW+v7rLwry1usi6v73Lw8HFwsXIxcjF0MbCzMeyxsnDzs3BxcK/vbK3sLOnqKi5saWtsKutrJR5dndqZWhgaG9jVl5ZSkVKRkhLQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ozw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Nz9LJ0cbW1dbYz8zQyM3IysW9ysGytbq3u7avkY2KjIV5gIaGgH6EfHR1ZFxcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wLitsLCnqq2sp7i0trSzsrO6tb2xt7C0rrK7wrzBxLy/urWyur7AuMe4s7u1wMK8t73GwMO7ta6ytrq+s8S3urWruLy9wL2wuravtrqyxby2rru/tLa0xby+wsW/w8TFx8vFwMbGu8fLwM/Jx8PGwcO3w76+trm+xr+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJDQURFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLemq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzc7Jy8nMysvG0c/T0c/HysbKxcTAvM+9s7m9ubi3m46HiYp7eX6Hhnd4gX10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbWhmam5ucnykx7+5uLWwq6ynnqKqp56rrLOtqaups622sLKorqassry6tsO5urmwq7W5u7TCua+/sL28u7W7x7nCtq2qqLCxwLW4vK+wp7GztLu8q621pa62rrqxsKq5r627rbu4u7+/vbnCv8bCxcC8xsHIy7jFx8W/x8PDusTGwrvFyczLs7nCvLqyiHJ2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTs5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo5Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbP0szExsLF0MjPw8THwcbGxcXMw8rMw8TBx8C6vLvKt7S7vbW1q5GJkJB8eX6Khnp7hIF4bl5dXV1dX2BfX2RjYmNjYmBfXltbWlpdWlpaWl1kbW9oZ2dpa25yga25sLWupqWnp5qgpKCanKWrraOnoquprKqwo6afqq21trG9ua+3r6iuuLS0u7ezvK63ubSxu8Gxwa6lqKKrsbKzp7yqq6irrK20tKaorqGkr6mypaeorqWot6ywsre5uruxvL2+vsS/tcHBx8i3v8DFt8TCwLu/xMO+xMjMyr++w8DAqYZyc3JqaV1hb2RXVlhQSFpSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe6xLC2sJuZlZyYqqmwsbO1va/G0dDNxMi7u8zDzMC9yrnAxcC8zLrDx8W6vcS+ure9xbi2uLuusZWDiY2Be36Af3h0f3xzd2ZfXV1cXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnqObl5Gho6qjop+lpaelrZ+dm6Slq7KvtrensKynqrSrtLmwtrSstrixr7q5sbekn6OfprGnq6e5qqSmp6insq2gp6aemqSmrJ6fp6SfoLGtrayxs7KzsLW8trvBwbK6vsPBsbm5wrPAvb+1uLu9vrzCxsTCw76/w6CDd3BrYWVfa29gVVlfSE5oT1RHRUpGPD1APTo7OzgyNTUzNjk6ODs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc3ODY2Njs6Ojs5Ozs8ODU5PDo+PkA7jci1tr24usG7vrWgnpSdoaa6tquzs7uzxdDJzMPHubjJws7Busu5vci7tse7t8TGs77FvLewub+7sLO2r6KEh4eCfXl2dHBta2pqcWlfYF1cXF1fYF9hY2JgYGBgXVxbXFxYWVhYWFZYW11eZGNiZWdnZ2ptb4idqaCXlZqhlpuimJWNnqGippufn6OloaeemqKbn6qwrLG1oqmqqauspLW4rbevrLK0rrO1rrGqn52eo6KypKWpuK2hpqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqusrbCyuK64ubuwtru7uquzsrmyvbS2sbG1tL+1vb+9wsG6ur2Xg3pya19lXmRkWFRYXklXXUtQR0lKRkE8Pz9AOz88MDQ1MzU6Ozk6ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bQycnBx7y8xcXQwbzKu7vBu7XFuLXBwbPCxLytqrW5t6exsqmLhoiAeXNucG5rY15iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1pbWVhYV1dXWFhYW15iZGRlZmZoaWtyjaidlJSUm5eboZaWkJyhoaidm5ylpqGkm5+gmpitra2vsqCloq2rp6G1sLGxrKeusqe5s6a2oaKemqOhraKhqbWqoqOmnaWmo5aYnpeYm52fmZednJybrKGrpqKjpa2rsrOqtLCyqrK5tK+pr7KysrezramsrrG3sLq1ub2+trOxlIR5dWVeZV5bWVZTWlVMXFFMSkVIS0lCPT9BQUBAOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vr2/s52lo5ilscK1tr2ttbjDzcnIwca4wsHI0LrDxsC2vL22w7q2v8G1u7+7qqaxurGnsa+afYWFgHlwcXRxaGVkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYWFZXYWRlY2RlZGRoanainJSUj5WXl5+XmZSYn56hnJahoaijn52onJuaqqausKubo6O3qqCfrqi2qaamrLCjt7CjtqCim5iYq6ahm6y4r6KhpJyhn6CTlaGUlpabmJeWl5yUn6mdqaOhnKOqqrCtqLSrqqatsrClqq6ysa+wrq+mp6eyrrG0r7uzubeto5SBeXVkXmFWWVdTUlRLTV5MUExHSExLRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ejqrvAvcC5rrS4ws3Ix8TFvse6ys21xMXEsb+/ucDBusDAubq9t6iosbumqKGkiYF+eHJqbHJ0cGloZWRnYlxcWllaXFxcXV5dXFtcXlxbXFpbXFpYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuSlJObmJyWlpugnJ+VoJ+mpaSlpp6cn6Sfqq+mn6KjtqigoaKos6Glp6SvpbCsq7SeoJ2VlKmhoZSssbCeoqOdnpibk4uhlJGTl5iSl5eYlp2mm6ahopmkpKSro6Wwp6Wjq6utpaiurq6rqKmps6Wmq6+0sa67tbCvrp+SeXZyZWFcWl1YTkxRR1JhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3PDg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sresnqSmrbe7vMHFurG5tsXKy8HEx8fJuMjGtcXCyK66vMK8wsDBvby3uramp7K1nqKKmIeAd29kYmdpaGZoamdqbWBdXFtaWllaXF1cW1xeX1xaWVtZWVlbV1VYV1RUV1VTVFJVYGBfYGFfYGFjZGmBlJOJkY6TkpOclJWWo5mglpygpaGtpaOjoqOhm6qqpZmepbGpoKCdpKqdp6GdrKypqK2toqGilJeimpyPq6mwm5+in56XmJOKnpKNkpKVj5iYk5uhopykoKGVoKGjpJqjq6WipKqjq66lrbGppqWmprWmqaits7W0ubqvqayei3Jwb2BbV1ZVUUZRT0haXE9SSlRLU0xFR0lDODs7PTw4NjY2Ojk7Ojo3Njk3Nzo7Oj08PTY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODY5ODk4Ojs5QDl7tbSttLuysKyyrZ2np6+5ubO/yLq2wK/Gyc68wsvNybfLwLTAx8ywtr3Hu8HHw72/t7q1pKqvrp2Zh46DfHVpamptaGpsbmtrbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eX19fX2JkbY6PhJGGj5GOmZOUkpyaopyboKeoqqeqpaikopikrqSUmaWvqZ+bmJqgnq6Zm6myn6Smn6OkoJSTm5aVkamprZqcoKGgmpSQjJmOi5CMkoyWlJCdoaCinJuilZugoqCXoaijoqiroKuvpK23paKjoqytqairr7O4sr21s6uvmINycmhbWVlTVVJFWUxRXFlNVE5QTFFSSU5JQjw/P0E/PTY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqinr62bqaist7asu8q7tr+szMfGucLP0Mm1xr66vsbMtbG9xLzCxcO9wbO5r6Wqr6uel4aBd3hvbmlubm5xZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4uQipKNl5GWmaKgm5+qqaatqqavoqeZn6yglJWkqKedl4+OmZ2ulpemqZienJOloZ6RkJKSkpWnqqSZmZqdnZaOjIuUhoiNg5CKkZSQoJ2go5eVn5WaoKGdkpulpaeoqKCxsKaxvKafo6y0q62nsLSwubW/sa2xq5B8cHJiVlRVTlJJR1ZRUlJMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6Ojg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qlorCrnaqnqbKwpLbGtLm6s8vGurzDy9HMs7m6vsDFx7a0t7yyurvEvsKxs62wrrCsnKKIa2htb3JvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQiZiJlJOYmpidqJufqqSkqpynmaClm5KPnqKal5aEg5Gao4+TopyVlZaHopqak4uOio+Zo6eclZWXm5CSh5SOjIGLjYCQipGSkaCZn6GVk5iYlKGkmIyZpKaopqGgtLKnsregnKK3rKqtpLKyprW8taursaOIeHJtXU5QUUxPQ05OTlBMRk5OS0pOTlFITUpBR0tISEM9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6OppaCppaSzqqKyw7W1srPHx7i7xMrNx7WvvL+4vMSzs662oqy1xLq7r6qstK+voJeofV5gZ3NxdnFqbmlmaGhqX1hZWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVlhYWVhbXWFvc3ZwhIiCh4CRg46KlJCTnaCOmpuioKOYpJahm5WMh5iajHONgn2MlpaFkJmQk42OepmPnIyCiX+JmJ+inpCTmJaEjoKTfn50iY56kIaSkJCcmpmZkJWPnY2ioo2JmqChpKOborSvrK+sn5iluaalsKGxrpywu6qpr6qZgXZyYlZMUU9QTUNTTkxRTUNQUEhITVNNSEpKREpMRUpKPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3d7eio7SopaWoo6alpqWms6eltMG4sLSwysa5usLPx7+1r73Dr7HHsq2nrJWjrb+4sbCgqK2sqpaVonJXVmBoZ2loaW5jamhnYlxYWFhYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVXWVtdaWxybH+FfHROWHKPgpeGjZyXipOQnpeclZSWlI6WiH+TiV87V297ipOJf4uRjI+FhnKKhJaBeYJ6hZOdlIOVjpCPgoZ9knhxb4WNfomAkI2Pl5mYk4qPiJyHnpeGh5aemqGgl6evqK2pqJ6WrbSipq2ZrKuYp7Ohqa2jknxxbV9aTlNRVkxEVEpQTU1GT09KRUxRTUtPSklNT0ZJSD03NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXi3oKKtoaamqaCnqKeiqbCop7TCubG1sMnDubS/z8C6sbG4xKuuya6nop2FmqK6raeolqalo6CXj5ZpUE5SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l6gnRQQkB/lZGRfYmUjISKjZqMlpWKkoiGlYV4iH9gSlFueIqRhHyEjImEfn9ufn+Ud3V2eISNmXBRjYiKhnt+eJR2Z3eFiH6KiJWKjZCRlouDiYeUhJqLgYSSm5aenJSko6eppaOem7GroaSkkaaqlqGpnKKmqIdza2VdW0hRUVNNSVVNU0lMTFBJR0ZKTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49Nzs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl2tpyipp2foa6hp6ilpqevrKq2vLa4trPCvLeou8m5t6mqt7ittsCqopuSgo+Zsp+imo2glpiUkYuMZU1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/hoF7hYySgJGZi497ho9/dX94c251cHSNjYF5fYmqhHl6aHZ7jnBybXiAioySeHqAe4B2cnKSeGd1hISEhHqViYiKjIqAf4OKjH+Tg3qAj5iUm5WRn52onp+fnaCppZ+dmI2opJOgn5WenqR/cWZgXFxKVk9RR0tYUk9KTU1TSkpKTFBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNjIxOTg3OTg3NzU6PDw3dq6Yo6GYnJ6zqa+ppayrsLGqvbSyvLi2u7WzoLi7s6udn62rrLWzpZ6WkZiGlKSWnYyDl4mPiYaGg2ZKSUpJR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWVhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYB2eH+Jj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgH1/dGZ2fIVsb2hzfImMh4BseXF9cG11j3JocYB9jnBDioSCg4R/d3d6ioR9i3p0fo6Sj5iKkpqbo5eZnZqdnqKdlo2LpZuPnZeOlpiOdW1rZWFZV1hUUUpTVlRPUE9RV0tOS09PSlFPSU9PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+elqCmsKyuq6epsK+xrLy4rLu+ubSuqZuxqK2ckJeep6ynpJudk4eWfY6VkpWAfIp6hYB/f4FlSkdIRkJAQ0RJTExNUVJQUVNVVFRVVldXV1hYWVlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt3b3x5iI95fIuFb22MkXhzeGpqf4JylpGLgX2Wf0mSmG5od36CbGljbHmFkJKGa3NsfG5ye4VpbXB+c42Ig4V6fX56dm90dIWBeYF3cHyOjIqTg5aXmJqQk5aXmZeel4yDiZ+SipKNhpCWfWxobW5tV1VXVFJRWU9TVVVUWVZNTkhOS05OS0NJTkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepK2voq2qqLWvrqy0v6u8wr+mo5qVpZifjoWMlqKkm5uUlo92kX2Ei5CPfHh+dH14dXd8Zk9FR0RAPD4+QUZHR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqckGZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+b21/eouIdYGIhnRsmZF0c3xqa52OTHmEkomEjmcxdoZzbH59g3RmZXR+hISFgGZpbHVrcH97Z3Bwe26SjY57c319cXBudW2Cfnd5dGp5iYKIiYOWk5KQi42RlJWPl46AeYiXiIaJhn+Qh3VpaW5nY1dRWVdYWVxOUFZXWllPSUlFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyosLCsrKSgrJyksLDIyNi0rNTc3NTQ3OGlPODs1bpKImZGalqSorZ6ynqa6rquysMKyu8PHm5ePlJmLjoZ6hZGalo+SjpKKc4mEd4uPjH92d3V4dm94c2lVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfWxxg4GFgXmDhoZ5cqCUdHiAc3WUhzVxnaidjqGhhKKEdnCGe4Z7c4ytjYiAaGZiaW1xbW+CdWlvWHVvjpqRdmx/e3xtcm5wf3pzdW1idoR/hoCFkJGKi4qSi5GMi4+DdnmLj4B+g4B9jnhwbm5qXlpbXVtZWGFgU09cW1lYTEhKRkpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5WltKitsK7Bs7rBxpeQjJSQgYl9boKRk4qEi4mQiHeEhW6Yiox/eXt7cXt0fGtvXkpQRz5ANzQ1ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvPpKDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sd4eHfH2Fgn+MfnaimXl+hoCEmYWbnGGGqp+di4KQjXp2iH6Jh45zipePg3tcZHF0ent3im1naWF5b4WPgnpugXdzhHpxc3l3a25pXXeHfYd8iIePgIuTl4ONho2HfXGFgIR8dXd7fId0bXFyZGVeWlpdU1tnXlhRVlldV0dLS0VMRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHeJf5SMkZ2dn6aRoKqfsKmvwLG7xbqWj5GUiHqGdmuAjJKDfouFkI15hIJ0ooWNf3+DgXODgX1seWxTWExBRTMxMTI2NzY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cnyPi3p8iIZ+l4d2oZmIh4+SlKWNrKlIhq2vr4qAgJOKgYuBhJGoh4CYmIqcc2x8gYaHfY5oZ2d4fm2FhoGFcYSFR2uAeHF5dmhta193fYOIf4iFjHqVnpyKi4mSgHt1i3Z8eG1vd359cXFwalpcW1pjY1dnZlxWUFFYWlFETExHT0lERkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYeRj5aYkpegnaygp7mvs720l42Si5iLfXRxf4qTf36Ng5SVfYd/hqWHiYCDiIZ5iYqAdYV5X2NWTEM2MC4vMjMxMzM2Njg6PT8/QkVHSEpMTlFUVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYmRgJqWgqChmJWbmqWtk5m7sae7yMSnioyhpI6TiYCQe3KDnp+RnH52hYWLj4eQaWhvg4B0jIaEi3GGgnaHgHt2hX1udnVngZSPhomJiImIoqujlomPmIB7gop7em9na3h9d3xxaWNcWVlcaV1hZ2BaT0xOWFNSSVFLRE5HQ0tEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O252cGd4g3uAjICBkY+LmpqknKGspquvsJeSkYShlIR4d4CNlH1/koaTln+LgZKbjoSBgoyMgoqOhYCKgG1wal5DQTQtLS8vLy8wMjIzNDc3OTs9P0JESEpPUVJTUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSEpLTEtOVmBjf2dnbXWdm4+ak5OLjo+aiJOPnYugoZKjqaWjrJOotqKnwcKuyK94upSafIyhnpmEkoSCj6Gek5mShIqFj5iQlmxwdYmLgZWMjY92j4RxbIWBipeSg4WIcomhl4eTio+Ql6W2qZuNlqKDh5OFfoBramt9fn1/cV9bYl5ZZmpcbGxfWEtIT1NRTk5MRklRRERORkJDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmhZcINwdYdxdpGGfpeWmpSfn5unoKqWk5ieaGakmn2Fk5J6gZKJkpJ9i4WZkpGDgIGLjomGkoiEiYV4eH9oTlI+Ly8uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUVNRTlBJRUU+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6aimaGXopWcn6ieqaufqKypqrWXq76rtsjJt8jRz76boHBpqqifhJORhZygmpqZp5GRiJWhmZp3en6UmJGhkpaXgZSee3aVkquziY2XoH2VnpyOk5aapKOntrCekZqoiJeQjoKJbHNze3x5bmZeW19fYWdjYGdnXVJFS0tRT0pKTUZGTUNITUZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDU0Njk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmM0FAaWJfUHF1YG59YXeOfXyUjo6Kn5KXnpWcqpieqkJEfYeJiJiNeYKNi46NfIqGkJGPgoOBiYyKhZOFgoaJgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlRVU05TTEVFQDw+PUZIQEFAODY2Mjw5O0ZIR0lKTk9RWW2GkHeVi6OnqrW9uKWurKyoqbWssbeysq27sbO+nLPDrLvJy7jDv7elo7CyrKyqo4qWmIWlpqCimIKmmY2iqqekh4WTo6CgqqGkqY6csIuVpKe4u5yho7CTo52jnpGkoqywrbO2o5Wmq4maipOLlXp7foN7ZV5mWmNgXWJjXmZnYFtPRElIVE9GSExGS0dGR0hBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NTQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaCk4WIgpyDkpGMktrInZZzVpeIj4icj3yGjI+LinuJg4eRj4OFgYyGhYiShoKEiYaHh4dxbmFARTY0PDMvMTEwLSwrLTEvLTQ/REFOVlFSU1VVV1VNXFFHR0Q8Pj5GSENEQTg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Srs8W2rbTAs7i+tr+1wba7u6S4xqm2yce2vrm0qKO0rbCwm5mSmp+Jp6+qpJV3n6SXoauxs5iWqa2orrW7srqsr7Wisayytby4ta61oKeoo6ibqbCus7q4uaicuKqNpY+SlKCGeoGAcldfYlVkYGBhX19mYFxVSkRFTFZSSUpLRUpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMXFpRY2RXenVxgZR9hIaTdoZ+gI17v7ujvIK0lJOOm4+EiI+Tiol6h4GMk42IhYKOgIGJj4Z/hoiFioeRenlvXVdARU48Njo0NkFCNzY0Ly83Q0hDUVxPUVVYVVxXT19VSUtKQUA+R0tGRkQ7PkA3RDc/QkpKRUdXVFBej6StpLK0w7a4wczKt7zEvbO0wbe4wrW/sLh0sbSmusWksMa5sbOytKiktraqsKCilpuikqWxraWtrKekmKCss7qiqbK5tbu+zL/Fxb29s8K4uri/uLu4uq2tsaaxqq6+sb28w8Otmbupla6PmJmriX6AeWhVYWBXaWNpZVZbZFpXVUpHR0xSSERJS0FJRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU3Ojo2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlWWndqcH+PhIGOhG97cniIYrmhmqOJlZSWk5SUjpCXkoeHfIeBjpaKgYSBinp8i4iGfIqCgYuElX14enVmUFxkR0VMOlFkYFteU0Y/O0hQRVtjUVFZWVpnWlNgYU1TT0VBP0lKSEVGQUBDPEQ2Qj9IR0tNVFpUXpSvuLW7ucnAu73Kzby9wby4try7t761urLGYXWypbGanqu+qqWoq6qkorO1oKunnpWWnpifrqWnp6Weo5Sip7Czp7KyvLbBvdPJydPGwsXMwsrDwb6+v7y8uLWwube3w7rGvsTJsZ66q6Ksj6apt4qAfG9dXl5cVWBdaGZTWWJXU1dJRUZPS0A+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBQUVJRSkE5LywsLCorKCgsLSsvUD4oLjQ4gH08MkuIcTk+Q0tFQEpNUFJMUV1obWxxkI2GkHNscnJziNXAtpqgjZWZmZGOl5KWlo6GiH2Hg42Win+DgIJ5e4uEh3uLeYGKgpd/dH16bGZwdlldXFBlZWJgZWRdW1hYXE5kbVVSbW5fb19YZ2VVWVRKREJLS0hGSEhISEJJOURASEtUVFZdWluTucC5vrjGwbu5ysu7trq2uLm0uLW1rre3mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUjpaYmKiepp+fmpmDo52spKqwrLewvLjU0M7Wz8nM0szPzsrHwMDCyr3BvcHBxcTGysDJz7SkvLG1sJysub2afXdpW11ZV1tfWGFiUVxhVFJMQ0JGSEY8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy4mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENER0tPRFJcWmlgcJeTkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iYeMkIyJfIGDc3uKg4V7inSBioeVf3R7eWxtdXxpc2VpbGhmamloYGZpaW1abnSXraS9iIdnW29oXVpZVEhLT1BKS1BMU1FITEFKRktQX19iZ2pimLjHsLq0u762scXHtrC5sbG7rbOyqKy4rY22qJ6cp5pOmp6Mj6CWkaeYpZWKk5OIkYmQkZKdm6GYm5WWh56Zppqsr6ivp7Oz1NTU1tHLz9PUztPPzMXCytC/ysnLydLIzc7D0NK4sMS9xLqmt7vFon5sYVpaW1ZeVllkWlBdWE9SQ0JIRkRKO0FEPkJIP0BCODtEPkBJPTU2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkZmCaHJweXmDoaqeppeMm5uYi46VkZqOfYmLho6Li4uQiHyFgnB/h4KGe4dyg5KMj35xeXVscXh/cntueHNsaYBwbWNpbnB5aXh9fsu/w9+nbmN4bmRbYWBLUFJVTlleUF1dTVFOVFFVVFxubneDcpeuuKy1qLC2q629wbKrtaaluaesr6KstKSPsa6bmJiMkZSRhI+bgY2nkpyJg4uEiomEi4SUlZeXlJuQnJiZmZ6dq6ykp6KsrM7S1dHNy9LT09DU0c7Iw9TRyM7S09PWzdLRxdLWxsHPyMjDqb+40Jx2a2JaX1tVXlFcWlBQVVFPST5BR0JDRj1BQj9GRT5APzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd2x3cH1+gKCenqGMjZmTlIuMk4+WhXmFkJGPjIqIkYd/g3tyfoCCh3qFdoWTkYmAb3dzbHN9fHd8c4J4cWuAcnJpcHJ6eXJ7vsubf42yhHZyhXdpYWldRFpaW1dmZFhla1RYXV1hY15jeHt/jIKZqqSkoqChqaaqsbmrprSjoq6ipK6jp7KgiaablZORipKPiIKUiWuVo42ZhIGGfpGDg5SXrYuVjpWajoWSkJ2Xp6+hoKClpKjIzc/HwsvR09HU0s7TzcbW083U2NbW2NXX1crV2s3K2NbRy63Ew8yHb2tgXVxWUldSW1BKSEpKS0A7OjtFQkQ9Q0Q+SEM/Q0I7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcYB2fmlzeXKCioCdlZ6UhYuWiY+KiY6Ij4B4hJSZi42JiIuJf4R5c3t9g4d3gHuHkZeBhG94cW52f3Z4fXSGfHlsh3Z1bn12hHV5fJ62jTxBi8alfo19amVXSUNlY2ZjaGpkb3lbX2ZobG5pboGDiZKMnp+gnpGXmaCjpKaypKWyoKKln6KpoqOynIefkpKTkYuPi4eEj4R+nJyMjYKEhXqUf4KqlqOMkouYk4t9l4qakaqzmJqcp5ymvcPFuLbFzdHQ0tDL0svJ1M7R1drX19jU2djN2NvOydra0ta/zM20dHNrYVpXUFNQWFVFR0tKRkY+Ojc6QEJDOkdFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NTQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzIqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0I+PDlRRUNKVGxub3BicXF0ho19l5Gei3+HkoOJhoWKgoh9eIWXl4mPg4eGh3uFeXF7e4SGdnuGjo6eeo1wfXBweoBye4FyhIeAbo56dXd9fYN1gH2HibB0WarCt42SgXBuYz1eaHJxcXBud3eCZmlvcnZ5cnqLh4+UkpuWoJaIjJOcn5ufq6ChrJyimpqgpp+grJqMmo2Rk46FfYiHg4WLjqCZlIiDh35smXqEmYeIk4yOlYyGe5uIk4+uq5OVl5+Ypq61vKitvcfLyMnLy8/JxNLK1NfY19jX1NvX09rb1tDa2tLWydXMk3V3ZmVYV05RUlxHQ0ZJST9CPj04Oj5APD5JPUBCQUFFQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxBPDo5RD5DR1JrX21kYmZsdoCIcZGQm4B5gI5+g4GChX+EfH2EmI6HjH+Gh4F3g3lve3uHgnR6kp6OoXaQdoN0dYF+dICEb4GQgm+ShXV9goV6d4d8ibjGpcPKuIKWnI94cGZOZWOCeoJ3haGRi3l5d3uEgHyEdm2UlpWWkJiRg4mPl5qXl6admKCXn5OTmKOem6yWkZGLjZODjIWJiYGGj5GenJqIhYyBhpd7iImfl4+JjouLgnygiJCKvKCYk5eanKimpa2ep7W/v7+4x8nNzsXNydHV1dTZ1dfb1NfZ2tvX29rZ2M7bxoN2dmRmYV1SVVVUTUtETkQ7PT09OTo8Pzk+QTc+P0A9Pz49OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47OTs3SVBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1caXR6eWyJjZJ3dnqKfH6Af4B+hnt+gpGKhYZ6hYh8dn51bn19h350f5KekaCDknyGfniPfnmLim+Dm4F0mYd+goqFfH6Re5Cpj5DDoL2Mm6ScfoqFfYlzjIuAc6aanJiUhXuPkYmEaUdwoaSejIyRkoWIi5GTlY+dm5OUkZeNjJafnZShlZOOjpGMfpCPjouEiZKWmZ+fiIyUkZ2Rg4x/ppmIhY6DhoSApIWKi7eXnZGUlqGmoJ2dnaOutrm0q8DGytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27d1dXRnZmJUXVlST05IRExDPj0/OTk7Ojo6PD42QT4/PT05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OkRXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5WWGZtbW1pgY6KcXN4int7gHx/fIh7fXyLh4J+dYOGenN6dG2BfoR+d4WboZuelJOAjIh/mIeAnJJuiKmFe6GMfZGOg4mFnX+bkYqNo6KfkaSvoIuRi4WLgZOGV3Kti5+rnJCDmZyQkI5bgqKRgo2fk5WMh4iMkpKMlJWVkIyPioiWnJ2PlpeSjJOUhoCMiZKOioqdl5ijo4aTnZWgi4qJjpyQg4mPgIOHhaSEi5CymJySlJehoJ6Zkpudp7K4rKW9wsfNyMbPy8/MztfP0dSu1tXY2tja2tfW2dqdbHlxY2NaWlVRVVdDQElEPz8/OjQ5Ojs3Ojw7NDw8Pz0+Nzs6OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7ODg7PEA7QlFLS1NZUFRjYnltYn6Rg29ueIt5en97gX2HfHx3hoWAc3CFgnt1d3Z0hYKEfX+SpqKfpqKXip2QlJeLiqiXcoqzjYSokoSZlIWajaOWoJiTiZueopOpsJ+RlZGOjoiWjG+Nt4SaxMiynaKmnZyYlpGykGSkzceVjoaHiZCSjY2TlYqFioqGlpqcj5GVk4eVmISAkIyZiI6Qq5eXpKOImZ6VmomPh5iXioWPjYF/h4+kiI2TqJqXk5aYoZifmZOcm6KytKWjvcG+x8bFyMjJwsrTzM3UqNLR1tbW2NrU09rOf297ZGBbW1tMSFRaQkJIRDxCPjgzNzw8Ojk+NjQ6Ojw6NzI/OjkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhTV1NSQmOCR3aBjn18bX6IeXt+e4KCg393d4CDfG1ui397fXh4fIWHin6KorOno6qzopenoKWklpWuooORuJWSs5qNoqGMpZywo6SdmZGnlqiZrK+kmJWWlZCLmJqXocCOo8m4q5yjpq6Ykpudsp2FhqiinJiFiYmOlYyLk4+IgYaHiZOYlYyMlJOHlJiGhJKQnHWRmbKWl6Whh5yZko+LkYqXm4mLl46GfoyYnomQkJuampOYl5+UoJ2Unpugsa6ipLi+tMXHxL3Dw8DGzcrJ06bOzdTS0NbY09DYum92clleU11VTkdJTkVBQ0U1Pzs3Nzo/PDw3PTQzNjY5Nzc0PjU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NDY3PTpKRkRHTlpcWUpmYDtJhIt6em6Fhnp9hHiBhoF+cHh9fn1vc416foJ8eYaLiYaEkqa7rKixva+lrbOzqaSisKyKmrWdo7mmla2llqqtuKeko6CaqZiqpK6wqpqZnJSWkZegmJq7u67KoWq3uKuwlZmeo6yTl76jXqqyg4qKjZSHkXyOjn2Dho6QlJWIiJOWjJCVjYuNl5iTnZm0l5WrnYqclJGOkZKMmZuLk56Qi4qWn6GMlI2XmZ2Sm5ielKGglJydpa6ooaS0uKvCyMS1ur28xcfHwtGhxsrNzcXX1tHL1J9td2VZV1FcUE5FQz89Q0JCOEA4ODU/Rz08NjwzNTM0NTQ1NEI0OTpCTTpCO0FIQzs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkSGJgYnBJQIuKfoFzhod9goh1g4qCf259fH1/cHeHd46Ch3yNj4yGjJmpwcCvvca7s7TAvbWtq7O2i6iyrq6+q5u7paitubmrp6aioqSjqq+ysaqenKSZm5iYn6OmpZKkuq+pwLytrrK5paSofoiHnK29sIKLjIuQg46DkY96gYiQjY2ciYiPl42MlZeUkZqXnaibsZqRrJyOmo+SjpSQkJaXj5GgkYmVm6OslJaPlJydkqCdm5ifoZSanqalpKKjsLKmwcbDr7C6t8XEw7/NpsfEx8S91tHNxcqFcG9eWVdcWUxKQktBRkg/QUBDOzo1PkE+PTU9Nz4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODo1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5CQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTjc5R0Q/Q0ZcZUZgaWdaXV2TjIyJe4eMh4OMdYeRioFvfnuCf3F+gXqVepKUlJiQk5ans8bJv8HMwsO5x727r6u6u5izt7qywK6lwKSrsLu9qq6ro6Oep6uutbCqnKCrnKGclp+wtaeMo7u7tsG8rKmds6WkqJSFjqrEw6SCi4+HiISGlZSNeoONkY+RoYyMlJKOiZefmJOZlZemoK+cjKucjZaPkZGVlY6RlZKPoJSHl5+hs56UmZOfoJeknpqfm6CUmJ6lo6ampK+tpcDEw66ot7bJw762z7LEv8S8s9HKyMK0cXVpWVVZZ1FMSENNS0xKQUI+REU8NUFFPDszPThCMzMyMjYzQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVpNZVxlVGJqmY2WioyIk5CGiXmHlJCBcoB7jX94h4KCkHmNoZaomZqZur3HyMnB0snKws29wrOtvL6ousC9u8S3rMGprLO8v6qwqqSlpKyus622taGgsJ+lopmjtL2qnKm9wqS2t6+slLKsrKyXh5qqpqWRgoyTpZaKgXWKknmFjpKQnqCTj5OLj42Uo5mXnJWUo56qnpGlmoyPj4+Vloh8j5WTkqOalaCinLWlkJ6WpKOhpZ2dpZidlZebpKOpp6KyrKi7wMOvpbO3zMC5r8Szu77Cua3Cw8LAl2l2XlVUWVhKSkxJRkRESURDQkRMOjRESTo7ND04Ri4xMjI0MkIyNlNITzxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmlIX1hhWmNjVp6PnY6Xjp6SiYp/iqCThHiFf5V/f5CIipGAlqGZrqekmMK9x8PHxdPOzs3LvMK4sLq8tL3Lu8PCtre8rbO/ub2ur6igqai2rq2psrebn62ip6Geq7e4qqWvv8WyvbqzqKu2tK6ul5alrKefkY2SssWnlo58kpV8h5KZj6qZmJOTj5KVk6Wdk52Zk6GjopyYn5iLjI+OnYhakJeXkpekmWWYop+ypZWhlaqrqaaanqaXmJaYlKCjqKWetqupubvDtKW0tsvAuKq2q7K7uK6ouLq9t39oa1dUUlNNRUpSTUs/QkhFRUlIRzk2Rk07Pjc+QUsuMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPjRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PkBCRkJwRWpJUmVhTEallJyXopeployRg4imk4iCh4KchIOVkJCUj5qinq++r6HGvMTExsbOzs7Syr+7trK7u7u+z7XEvrm5t7OxtbO4s6unnKusuaqop6+wmKSvpKekpbXAsaystL/DusC6tKi6trm0r5alra+upIuTlKGNdMKafZeahI6XmYyxlZualZKSmZmlo5WgmpaaqZ2boKCZio2PlZxgSpacmpSapZZUlq+fr5yeo5SuraqkmaClk5OYmI2bn6eimbSoqrO7u7uqsLLIwLmmrKutsrKjobKytKRta2NZV01PSkRPUFBSO0hLSUhKQ0Q+OktVP0E6PUVNMDc1NDQ6QjQ0TVdPO0pLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs1RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLqJaOiJOFoIeEnZePnaCao6S1ybWpxbnCxMjKycjMzce/u7OuubnBwcy1yLrCubW6sK+vs7Wmo5uqtLWqqaatrJqlrqWkqKy6v6istri/wsC+ubOzxbK5vq2kr7WsuaaIm5emm3a/n4SZno6TmpqMrpehnJuXlJqfoameqJ+ZmqqaoaeemJCNkZ2DbnaSopqVnaKdka6yo6uUp6mXqqyjop6kp5KRmZyHlJyinZaxpqmruba9srKuvrm3oKOnqKWmnJutqamLX2JeXU9KS0ZHTUpWTT1ORk9LTUJERDxRVj1BQUJETzE4PTc2P0I3NVVYTz9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh+ZV5IRauVm6Kfu6+ZlKCMk6ubkZKTiauNhqGejKOslKOktsa+tMC5wsLHycXCzcjCvrmyr7q1wcLKtcaywry1uqqora2woqOYqrS7pqmmq6qdqa+no6qrvbuorb21uL7HvLe2ucKyv8G1qra3rL6lj6OYkqKgvZ+JmqGZl5+ej7efqZymopucoZqopLOgm52mnKiqnpiVkJSbi5aJjKShlJ2inaC0r6Wlkq+qmaqpnJyioqiQlJSfgo+enpuVqaShobO0urStqLays56do6Wbl5SYqqGedVxaXVxIR0VGTFBJTkVHSENTTEpCRUdBV1NDSD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85REA1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWZcRkNDnXBiR0Wnl6SfnsOtnJelmJqqnJaamo+qlpWnppWtrJmiq7bEw7y+tsHCwMfEv8zFu725srC5s7/Cx7W/sLy3ubampKurraChmaqqxKKkqaumnqyvq6Kpqb63p62/srm3x7a1ubnAs8DDuLaztLC9o5ejl5SclK6gkKKjpaOjoJC9pamdqaucnKGbpZ69opmjn6KprKGdl46WnpOeh4+EjZOfpKCetaymnJWwppmupZyZqJyfjJiUnoOOoJmbkqWkmpirsbWxqqWqrqybmKCgko6QlaielGVfV19bTUhHSU5MSEZESUE+UUlBPEdJSVxST0s9SU9VNUJGOT5IRzVDYVtLQk5SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU1Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTltUUY8S3hlYVZLopqjnJ7FrKGfrJ+erqCSo5+WpKCmqayYtrGjqrO2xcS9v7XAwrvIwr7Jx7a4tbSxs7S3wcW2vrG4tbm0n6asqqydnp6lpMGln6mtoKSpra+ipqi8taaxvbm3tsSytLi7wLTFwrm5r7O1taOdpZWSlKGuoJminqmorKOawqypnqyum5uemaagvaGdpJirq6ymoZqNmp+SnomOV3+Wn6WhoLiqppOYtKKesJ+dma6VnY2Yk5yBjp+XlY2ho5aQpa2xq6mioqWllZWdmIuOkZKknoheYVhiX0tHSkpORkVBR0s/PUpCOTlKS05dUVFJPUxXXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FKTD9IPzVITFhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTW2tXcUdFNj11ZVxLTZ6eoZmfxKimobSinbOok6uloKOfrKmsnbuwqKy2scfFwcKyw8O9xsO8xMm8r7C2rbC1r77EtLmysLq0rJmosamqmp2loafBrZussZuqo66wqaSovLant7u+sLfErbOzw8C0yLS8uKy0tq2qoqaWlZWkrKKfoJunq7Cvr7uxpqCpqJqZmJOio7igoaOSsLCspaafk6KelZ6PkI2Vnpuinqe0p6aMl7Kboq2ZnJqsj52TlZKZf5GglY6Nn6CUi6Wrr6WmopygnpGSmpOFipGNm51+X2RZZmRJSExJU0FDQElIOztGPzk5T05WXlJTSj9QXl09SFBCTExJOU5jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MjUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1RdZXBAODtIlndlQTSeo5+coMOppKqzoqS1qpazrKehpLKsrqm7sq2xtbTGwMTCtMDEvsnEtb/HwbSrtaiwuay/w7O4r622uaWYqrKrq5ifppetu7SbqLCarKCttLKnq7myqLq0ubO5wKq3ssS+tseowK+ut7Wpp6yhmJeSpqWiopiZpa+4rrK1tqCfqaSalJaUpKC3oqWllrCysqerpqKfmpqblZeon6CYoZ6vsqKmjZatmKSqlpedoo+ajJKWmIWVnpOLkJudk4qoqKqipqGYnpWLjpmPgYWUiJOed2FnW2ppTE9NTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpVZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAxLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA0SW9nVUNXRox5ZkM7o6Odoaa/p6ivsaKqtaueurGso6u0trGwubewt7i4xb3Dx729xMLGwLjAxcC5qbakrLutwMG3t6qtsrqilK2xrbKWpKeRqrmqn6awnKugr7Szq6m1tq28rbSzubesuLHDu8DAp8Srsbevqaurp56YmauhoqGRmKGxr7OssLmam6mfmpeTmKegt6mmo6KxsbSss6itoJygoJuepZyil52js6+bn5CTpJmfp5mToZ2Tl4iTlpKVlpySiJCamJSOqKimn6Kcl5uShY6Zi32LlYSNmWhma2BsbVdQUVtVQUJFVEA7O0lBNzpYUGReUFdXRVlfXk5NUk5eS0o+WWNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REVCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLS0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaefnaKqvaKqsKyksrmqpra1rKGttb2vs7i7ur63t8DCv8nEucTDwL+3w7zAtq61p6u3sbu9vrSprrG2nparrqeul6aojqe7n6Sss56rorGws6yptbS1va6xsrWssLSzwbvGt6y9sLG4rK2qo7KmnqWqoKSXkJqfs6qzq6uzmp2nnJuWjqGmpbSuqKGtrq6xqLStsqqknJ+opJ6VopmbqLWpl5mRkZ2ZnZ+dj6qclZeElJaKnZibk4qNlpaalqalo6CdlpWXk3+PlIV7jZKCi5RkanFmb3FeRllnVkRDTVdEWjlIQjY+XVFoXE5aXUdbXl5PTlJYZEpKQlxiX1BMTU9YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0dERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KkMzWVVcZ0s2jHpmTECkmqGlrbelrKqmr663qq+2vKinsbfGt7G2vcHDtbW6xL7MxrnDwLm+ucO3wLiytKypura6ub60qa2wtZeYp6yprJurq46rvp2rrbGjq6CxrbOurbWyuLiqrq+xqLWvtbu8yrOqt7axtK+upqG0oJupraCmlpabmrKjrqGmr5ehpJqak46jpqizqqKns62rtqWvsbWvo5mdrKeal5+bmau3opeTkI6YnKGXlpOqnZqSf5GXjJ2bmJaQipSSnpmkoqKgmJaSk5V6i4+Fe4yKgoqRam13bHR7YUZha1lJR1paPXtKRkQ2QWJUaVtNXGJLXF1bUlNSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KCg5LiQ6SzUuIlVfVF8vNShDX1FcLipBL0pHUFtHM2NZVUtEmZehsqmyqqympK+utqq4trqlrLS3yru0u7q/v7Wzt8PAzMi8w7y1vb+/t768sbytp7q5t7XCtqqtsLeUlqeuq6mjsKmUr7qkrLGzp6ijsrSxsrC0sbezqa+ssqe3r7e0xMa3qba3rLGtqaejtqCgqLKhpZWcmpWynqicoKqOqaOem5aYpqaluKijsrWsqLKorrG1q6SZoKuom5yenJSpuJyUjo6Kl5uil4+XpJ+blIKQlY+cm5eWlYiWj5eap5ykoJGWkZCVdoSPh3uEgYOLimxvdnR7flxMZm1cS05jXD5ie0dJOEdnV2ZcTF5jTVlZV1VYVGldT09IYF1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkdlMjcnR2JMViUtQS49RUxRPDNya0lDQ5GZpa+lra+rqKWxs7SruLK4oay1ucm5rcG7wrizsbXCws7Fv8G9s7y/vrq+vLLDqKm5sLW1v7yuq7Kxm6Cnsa2mpq+lnbK1raqxsaypqLW7rbSytK2zraqsqKypuK2ysMjBuaW6samtraWorrGmpaSvpKmcnp2bsJqjo6Ojka2fpKCgoqump7qlrLa2pqusqa2wta6jnqOoqpugm5uSo7OZj4mNhpChn5SMlJuekZGDjZKSnJqXlZSHl5KVmaecoJ6Mk5GOkHd9joV8e3yFiIhwcnF9fHxcU2RvXk5YZlxGRJZbRztObVhiXE1gYk5WV1ZXVFhnXVFSTGNZW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLysxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEorOkc+M0JIUyw+kGs7R0iPnKqsoqqxpKmltLWytbaysqKsrr3Muq3AusextK20wcPRxca+wLK+wMK7vre7xKestqyyt7zAr6uxrJ+jp62pqaWwo6qyqrCrr66wrquzvKe2sLKpsqmrpaWjrbqtqrLDuratu6mpqKypp7GlqqWjr6qoop+co62VpZ6YnpmsnaKnqaKtpqSurLizsqKqo6Crr7CsnZ+mp6mZpJmZj5+mmIeEjomLnaCOioyVmo2NhIWPlJ+clJeVhpaUk5eknJ2ci5KRjol+foeFfHZ+hYOEcnFwh3RsX1phbmJRcnBcSzyFfEY/WHVYYVpOZFxOVlZVV1FcYV5TT05nWFZWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxO1xKMC5KZ0RGODxCLzRFS1gyQJVZPUxFlpitqaKrs5yqqrG3rbm3r6ymq6u9ybywvbbCr7Gss8PDzs/Dvr+zwMHDub+zx8Orr7etsri/vrGsraukp6qwqKipsaW0rqqxrq2xsbSstLykt7OsrK6oq6CjnrC3q6qturelt7akqqesq6qtoamnp7KypKemoaGsl6qhlZugpp6loqqkraOgp7G4rq6kpqObqqytqZyhpKOkmKCblo+XnJOCg4+IhZugi4qOi5eNjomCi5ejm5CQm4yTkpGTo5qbmoqPi4t8hoGBg3pzf4J/fHJ1i6SHeGtfYG1lV2SGY04/Z5NMRWJ5V2JZUmVVTlZVVlRPXF1hVUtOaFZVVklKSElPQkdJU1FZb0FOWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZWWi4wSmdBQTw8Qis6Sk9eNESHPUdGRJeTsKajq7GYq6qutqy3s6ymrKqpvMDAt7iyvLWmsrDDycvRv8C6uL++wbnBucDErLG0sbO6wL6ysK6sq6uotqqnrq+qubCosrGusq23qri4prS2q6ykqaqdpJ6zs6mopLS0oLeuoKqoqqirp6CrrKm6tqqrqqqiqqCtm5KqoZ2gpaKmo6qfnai1r6mmq6OkmaWop6mboqOjn5mZoJCNj5iNfoeMh4OdnYaDiYmNjI6LgoWVopqNjZqQkpGPk5+XmZaMi4N/dYeBf4B4dIJ+eHZ9gIedj29xZ2Zvd1xgcodqT16ZVkhueVVlV1FjUE1WVFVQT1haYlVIT2lUVlNHT1hVST5JSE9RUHhMTlc9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8xUGIwMj9mPU5YPkMsPkxUXzBKaTVPRDyXj7GipqyvmqymrbC0tbCsprCqqbq+u8CwrbmuobawycfI0cC+vLq7wb26wr++v62xsbG1vLvBsbGzqrOppLSppq6zs7mxo664srCzu6y7sKmttqyqnqqrn6Ogtq6poZ+ws6K2qp6op6qjqqGira2ova+srq2iqKigrJmQsKGYoqGnqJ+om5qrsaqjoK6ioZSipKOnmJqopZiXmJ6PioeUiH2NhoSEo5aEgYGKhY6LkIODk5+WiJGckJOQjZGclJePioaGeHSCf3x1eHl/eXJyeGZ/hqR2aV9kaYB0ZoiLfFJYcF9KeHNTZFRRX01NU1pmTkxWWWRYR1JoUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMEtnOjQ4Xz1hZD9GMUNQW1sqSEw5VUA0kpCzoaWnraSnpK2ntbOyq6Wxp6q4vsC7r6e5qqavscnHyNHDvL++uL2+vMi6wLevr7Oxubu4wLOyuqy4rKK0p6its7e6s6iovravt76wv6etrLWrrZypr6Ogpa2sqJyeq7OltKiaqqepo6ido6moqb6rtLCunaqkoa+cm7OjlqScpaagpZubqqymoJyropyTnKKmnZiXqKmSmJqUkIqCj4V+j4OAiJ2PhX59i4eQjY+Df5Oak4WToYyUkYuRm5KVh4l/gHJ7en58aXh8eXNub3tmhHeFimRhZ19yhHpsZnhdXlQ/V3tsVGFQUVlMTE5ydV1IWltnWUVVZU9DPkpORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmJBSjdHU2BVKj05Q1Y9KpCVspqgoaqmpaKrpbiztKaqsaasuMG9ta+iua2oqLDCysnMwba9wLS3v7rItMK0srG0sby4ub21rbi1vqyhs6errLG2uLWsn7+9qrPCtL2hr7K1qqyfrbCjnKapqqSem6Wxp7Cgn6upp6GpnKWpoa28qK6xrqGro6Svn5+tppifm6GknaCdm6Sro5ubpaWWl5Wgo5eblqWsjJ6RkZGLgoqAgI6Be5mUjIh7fouGj42LiYSSmJCGlKOJk5KHkZqRk4CJfXlsfnZ5eGN8enBub3F2Z39yaoRnZWddbHONbGBocGBvPVt4bFVdTlBSS0pNVFpXTVxebFdEV19PXk9ITURGOzdIRUtPPHJoS0s5QUU7Oz0+Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPikdNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTRTPWVfREw2S1ZkTyo7MU5XPSOUmq2aoJiopKSgqKS4sK+kr7Cpq7jBubKtn7mvq6i0usjLyL62wr6vtL23xLbCsa24sbPAtLu9t6i5t72qo7Soqauyr7qxq5y9vqawwba3oq62taemp7CzoJ6lpqiipZmfraiqnqCqrqagppikqaCxuZ+jsa+hrKGtpZynp6mampufpZadnZufq6eXnaGqk5qUmZ+UmZahqZGaiY6QhnyHfoKNfXygjI2IeIKLhImLi4WHk5qOiZWeiJGVgouXjpF9hXxzcH5ydHRgenhobW9vbWh9cWN7bWllYVxkhH5eWXNqcklIfmlYWU1QTEtIUFJRSU9cX25TRFhaUmdOR0tFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQiosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPS9XVDUol5+nmp2XrqGhoaWht6uyprS0qqi5xLSyraC3ra6tsLXGyMC2vsG5sLS8t767va+qvbC0v7C9w7mpu7q3p6e1qaissq20saicv7imrr24s5+xt7CppaevsZuhpKGlpaCXm6+moZ6jqK+hn6GTpaWjt7ChprGrn6yjr5icqqWpn5eanqaUm52bnqismp2fppeXmJaejpOXoqiikImLj4Z6hH6Ei3qPl4mNhniBh4OHi42FjZOYjY+WmYqPl36Gl42PeYF6cHJ3cHB0X3l3ZGpramdngmxlcmprZGdXYXJ/XllrdWlYRX1eW1hPT0tISFJVRzI5Xl5tUERXVVllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEhCZltIVENUXWhFLjoxXVEsMpeko5iWnauepqGjobiqsKG7uKWsvcSyr66itbCsra+1xMS9s766t7Czubi6uLqurb+ztLivv8G4q726tKWis6upq7StrrOknsS3p6q4t6yfsruqp6Wor6uZo6ecpKaUmKGypZmepKmpnKGflKagpLmopKetpp6loaiToKmhoaGZm56hk5ydl6GjrJycm6OWk5aWnI6Uk6OnpJCJio6GeYR8hYZ9nY2JioZ4gIOHiIiRhZSTkoyRlZSNjpR7g5eQi3d/fG11c21tdGJ5dGhmaWZjbYRmZ2hkZmdoXWRiaWVaZXpiYFByVFtbUktKSElPU0AgKmleakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU8/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3N2BMJzKfpKWTj6annJ+enqS2raiqurenrMPAtq+sorWup6+vt8HAvbHBt7Gusra1ubi1rKq8s6+ysb3At668vLCln7aspqe1qquvoaHFrKqosrWtrLS5naiqq7GlmJ2qn6elkpmlraKYnaSqoZuhnJihnqe3pq+qraGhnp2ilaGmn6KgmZyanZSbnpWmn66jmZiflpWPlZmMj5iap6CQh4qKiHiFd4KCgp2HioKIe3+FiIaFkISWlY+PkJGQkY2Se4OVj4Vzf35neXBsa2xndXNqYWZjYXN/YWRlZmRoaGFlblldWFxsY2FNZ1daYFZJSElLTVJYPjlgbGlIQlVTXFpJR0ZFQS48PzlBODlSR0A3OkIwMzc9NzY5Mzo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLC9BKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BhRSU1naWhko2uoZqZoJeltLKjsr63obHFu7mwsaO3q6uuqbm+vbutwLKur662r7O5sqerubCvrrS2u7avub6tpp61q6ChsqarsKCmxaGzprCysbettJ2sr6yuopmdqKumn5Wbp6agmaWjqZ2an5uVnZ2tsaa6qK6ioZqbnpmfpJqlnZefmJuWmqGUqpetqZyVnp2UjZWajpWUmKenjYyKiY57gXSCgouYhYZ8iIiEhYqMiJOFlJyTkpCQkZePkH+BjY6Db4J/Z3luaWxqZ3Fya1poY2Fxf2BkZ2pua2VpZWNsXGxsdXFiU2JpY2VaSUdMTU9ZUVBVYWWBVEBWUlpVRkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpMaltNW0tYZGNAQTFHYEEnNJSjnI+PsZ2claGbqbOwn7jAtqC0wbu9ubGmtrCprqW4uri4rbuwraurt6q1ua2ks7Wxr6mxtraxs7a7p6mgtqqen6ujqq6drMSZr6awsbe2rKuesK2vqqKbnaStqZuVnaeknZqqo6WWmqCckpyjrKupu56mpKCXmpqeoY9ro5aZnXGDmJ2lgHaSrKmflpeikoqYmYCXip+OeIWSjYJsaX53hHFshoqGfYSLhm9dZGFnhJiGbIuQlJJ1eYuEf4OQf2aIgWh2amZYXGl0bk1PaWJlcINmXWRmbmtoXVtciZCEiGhPS0Q4RlRnXkpIUVBVVktIUmFwdGVGW1FVUEZHRkM+MTs9Nj02PDRmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI4NliBbDE1T2tcTltLW2ZiPkcxTl87Ky6PpJuIlrGbnZShnKqurKO9xa+pt8K4vrytp7expqukuLSztLC5rqmnrLSmsbWip7i2tainrbazrrSutKKqn7SrnqOmnaepnLC/lainsLW5ra2jqKyrq6Whn5yhqKibmKKmppycp6idk56fmZCfqKuktbCjoqOclpiZmKOIoY+SmoehiJWfooClgKitn5SUnpSJhHJ4jY6DiKB1h4xplohmfnN4oG+Hh4R+jHx/oaCgmYB8h590iI52m4prh4KDbmllZHttcmJUhm1kbWmYcVhpb22GV11oWmtqWohwa3lyh2iHhFleRk4+Rl5NRlJWVlFQUldUZ15NWkxSUlBFRkc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOi8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW09bTFtnXz1LMVRdNy8ojqeYhJ6snZqanZ+rqqiqvsOvsrm8t8G/qqS3saqsprS1rq+zt6uppbKtpbazm6y1trWlpqmzsa2yqK+eqqGyqaClpZyipZ6xuJWmp6e3vaaspqmprKeloZ+Zoaikmpmno6SYnKWql5SinJSTpKanobelo5+jmJWUmJSdiK6QmJWKqoyZpJ2GsYGlrp+Vm6GXeoLUqICHlMCbxnh3saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuCbJexq7F5aWxYsa5vZmq8k7xuZ3ltcY/YflJrYrayfX5wlXWaoaqQVk5XYU9WTkdWXFhQUFOLXFdbUEFcRFBOQ0ZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJBRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01dZ1w+TDFZWjQxIY+nlIGoqp+YnZ6lrbKqsMK9srXAtbe/wqumtK6tqaiwtaqwtrSoqKa2pqi5rpyysraqpaSnsq+usaernqelsqWioqCYnKKhsq+Wn6ShtbqjqaigrK2kop2amqOpoJibqaCfl56oqJGdp5uUnqKno6Gwo56fo5aXk5iSmYWva2qMjqp/aIWWh61mcZ+elZupl3GuoaR/d7p8a6CPdrFfarRbpYBlnJBgZoF6Zn9peGuqZb5zZ6aMdrFqfLF4dZKUY21tp25chKBFaWeIlkV1nF99Znujp4JZX4uraHyMd3tqqDhKr1tYVGxjWktPWWBcVlY7TohQV1YwSVNTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMvLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk41XVczMRuSo5aDraemn6Olq7K4rbS9vrC3xbK4usOnqbCssKmqsa+ksbuxpaWvs6OquamdsrKwo6Sgqq2wrK+nqKCjo7GcpJ6Zl5men7CpmJyioLWzoaqboa2tn52al6GjqZ2ZnqWgnJmhp6SQnaKal6GgrJ+mpqCan6GWlZGXkZuGtZu1eYepmraZeIi0m7d/lJeYrJd/a4Gme4GFhpGUknerZ2qxW6x7joeUdIlwjoaBf4iRl3iDg4uXjIOgj4WwdnefcmtrbXyLT6VYSGRkmX5jaKZfeHF0UpKGXVCpbmNweoWAYZ0vU6JuW1RrZ2BMS11kWFxaQj6wd1dYQSNNaUVCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0UsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWBUNTAcl6CVibSmp6GtqaizrKq7t8KwvMOtubbCq62tr6+or7OqorC8q6Kotq2jrLWkpbKzqKOinairs6mwqKafoKCwl6Cbl5aXm6GxpZybpKi2r6Gojqmnqpudlpigpqmbn52koJygo6WjlpuemJqeo6ucppqcmqKgl5ORlJOdhNWTmblxscJ/xod91pScu32cl6iSj52NpHuNhqGApYJ5q3mPnVave4l+n2q5Wrl3h4R9poOUfJl7qXmOnZB7sW2OhHWQvIZvlVCvp8WKUaB6Y2CqYXNyhmuWh15StbTIhX6JfGOkNEOddV1QamhkUEBYZ1lkYUpITWpKWlNPWWZaQ0Q/RT8wPDw1OTw3NDw8OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLjAwNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3SDphUDcyJZyjk5myqKmls6qltaikvLjBsLrAsre0vbS2qLKxpLK0p6Cvtqmbqbuuo7GyobK0saGknp6oqrGptKmmnZ6frJiZmZiYl5mkrp+cl6itsamjno6roqeVnZiboaehmKKio6GboqKonJ6gnpWZm6ehnKeVm5qfoZiQkpWQnYiybmi1cqyIcI+ncrR2dLZ7nJqmjpCdjaN+j56jfbB1gpDS0nVcrnyFf6Rum6qma4eFfa19mJmQe7Fzk52PebNllnSFnm+fZpRSyYtawlyfeWJfrV92c4VhlohdWcqdb79+ck1LtVNVxmRVUWpjZVhBT2tfbGlQVUZIOT1XUltXWEhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQU5UX2VQNUc9YU02Mi6jnpGmsK2lqbutprWlp7a7vLO7v7i4tby8tKa1taOzsqOgrLClmKi7rqWysZy0uKqgpZ2hqqWyqKyqpZqdm6mflpaampOVpauimJOmq7GmoZWSrJ+lkpShnKWnoJWbpqeim6Ogrpqgnp2Qlpujn52mlJ2VmaOelZmWkpuFrHx4qHejj4uHqnCtjIWohJqbo4uTm4uifpGXh66Ef4GzXHKyU699goKjfnHXfXeFfo+eh5mad6+GipGciHe0YZplm4KClWySW7BXS5p1mHlmYK1ednaGZ5eIal2vdpWej3drNXnIrrNfQ1RvXmdgRVBsX3BtVlVNLmVjaFJZUTtBQ0BMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwNDc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQmBJOjc3oJ2UobexmbPBraiyp6qzure1ub+6uLO3vramuLWhtq6goKmsn5WptqupsrKrrbSkm6mgoKiitaemqqSZnpWloZSUnZqTl6WonJSQp62wpaCUmaifoo+RopqppaGVmqapnp2kn62coJ2fjZSenJ+hmZiclZaioJSYkaedh6l+f6Z5oY+QhKpwrY2Dp4aXoaOLmJeIo4GQhpSqen+LnXlwsVqog4KIoHh02H92h3Sogo+bjZKkfJaQn4R7sl6cZKB+gpVuk12rXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbWRPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpFYSEU9R0VBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MTAyMTU0KyowNS83LCYyMSgkJTY2NzE8T2VkQSZVZls/MVRfYkw3RkhfQzE9N6Kdmpq/rZizwq6rrKintbG4sbW/uruzsri8qru2obKln6aoqJ+TrLGpsKu3raqvoZiioKalpLqjo6yhl5ySo6CWlZ+blZqioZGOjKmwsKadlpqnpp+NkqSYp6uolpipqJ+goaSuo6CeoY6VoZmgoJKcl5uVnqGWlo+snI+ubnK0dKmMd4umdLR6dbSClKeklJ2NiaSHjnW4b4t7i6Jra7ZaoYZll5dooKKnbZRytHSTmX+zaoaSiK1qdbRhnWaib4eSa5hdrWBOoXyHkVJzo2x5f35umIZvXK9WPJx3ZVRvbi5bp09iUmtlYmxaYlxgcHxjU1lRPj9sbzJCQkA+TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQTilmpyeuqSbscCurqurqLequK+1wbW9srG7uKzCt6qsoZ2npKKdkqyrqLaktKiuqqGXnaigpau4naOtnJaZkKajl46eoZyZn5+RlJWrtrCmmJObrKmWjJSmmqWto5KYq7OkoJ6orLCYoaKQmaGXoJuWm5ehk52pnZSQq5mH1JSau3WxxIDEh37Wl5y4eYqSmY6Yioynh3mitnV9d3bBg5qyYYO6ecB8dbhitYGMh6l9lYKsqXF7f3W8iKegaZ1hpo+von6NdYerfb5uc7x0soN1eIGKbZqIcG2NpHS9XXd9W2F5vGpaVltpeV5pYWNmYm14b1hbWUNBQHE/Q0crNEgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvVF5gSzU8TFwtNj85p5qforyjl7DDr62qqq2xqLmvt8Wxu7OvvLCuwrKtpqOfpaKdnJGrpaqzpbWnraSglpqrmaetuZ2jrpiVoZGmoJOOnaOemZ+akJaTr7mxq5WWo6emlJCWpZ2krZ+RoaisoJyfqaSynaKkjqahlaGanJeVpJmQsKCSlaqehZCZtoCSko24lnmDk5u2d25sb3RveY+EjolynsC7vJp7gbKocIF0kbmDfIaGi4aNe4qHjJd9pLu5vZx1ebOjdHWXdXSwdZmeZodqjbZ0c3F3toxegHl9iGeDeWx6YouscHSFfldbp2lEZFlUZl9jXWNRZ2ZxbXVCTU9MRDtaTD5KMjswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz43MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppWywrOrqqitq6q7r7HGr7W0sLmotbmuq6Sip5+gnZmUraWuq6e2qKifnJahpJ6spb6noaqXlZyRopuSkKKoopSfl5KYlLK1tqyXnaOjoouSkqacpqudlqmlppyboaqmpqKooZGsnpeinpeWmJ2ekLCplJynoo9rf2qdqnqJdH+cj3Z7Zoh7vb7Aum+Sg3GUhV9yalpem4phZIePlmxgf5VjbZx2YpVsgJmVlGZeYGNxm4locox8hpRman5xdHh/fmNceHWBaFBcboR8fIpqV2x6gnJJSm+FcE5xTURWXGZgTFpXZmNfT1ttdWpxUk9ERE08SEg8TD8xLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1Q0ZVRUtPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSXkknU19WNClQXkwoMz5cTyc/Mj6on6miwaSas7m2o6ymr6aotrKsyKywtK22pL6ys6ehpKqdo5yamqynrqSltqqlm5iWopynram+qKmllZSblqCak5mmqaiSn5CPmJywsr6rmqadp6KJk5Gpm6mknJysoKOam6OnrKKfqaGZrpuUpqCXlJ2fnZixpZmiqJmdkp+dpKabqKSbnpucm5GXgmhvfnF3kZeUkISJtKqNhZiVj4qMmZeIlJWJg5OTkYmOkpSYlJmXmp+hmpuUn5uNgXqkhWtqfJF9gXWKi4Nygnh6dnaLf3yJanOBdIN1ZHd9dmtveGxfYltvZ01YWWZqX1dZb3lubWZTT0ZTOVBaTlJPJyo7S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tJJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Cxt6CqprOnpbC1qsmrrbKntqbBqLWhn6WmnKWWlaGsp62kpLesoJmXl6GYraqmwZ+spJaSnJefmJSVo56do6iTkJioqLLCr5mqnKqej5WWqZ6qnJ6hrZihm52ipa+moaOnnqyYlqWdmZqhnp6dsKGdoqeWmZSalaKkmKSgmaKPmJWLi46QmK6QfJWcgpGBiamohYCYl4uEj6CIe4SRhYWakYeGipWPm5eOkZieo5aZkpCcjX6NZaGzroWKhHd7kIt+eHl6cGd5kYGBiGt1gXmIcmhzf3l1g4aBanRieGVfaGRjZGZqWWt7cGpqXFNMUERfVUZAPj4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLKfua++rautsbKgqqayraOss7DFsKuupLOvvKW1nKGoo6GemZepp6qmpaaztp+VlZ6amrCmrr+hrKKRkZ6ampSSlqKdl6mdhJ2pq6O0x7OfqaOqlpWXmqeeqZygpayUn5+dn6quqKSiqqGrmp6foZiln5yfnbCkmZ+plJmZnpKmnJqqn5yYZoWTfWV/j5uQY3qNbWhqepCjq2plmph+Z4WLZWVpaHqNoo5raIyYkaJ3a2qLmaOfmHNsbnqEjIZ5WGVdhoJebIuLg3dcaHR3d5KAh4Fvd4J4f3NteYRzdoiHjYJ6aIRYXWpzZF1ziWlqfHJtY11RTlZKZFhASTM9Rjg/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXV9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0JJW0ouNlpPNilFWS9ETzFZQjs/Lj2knrq8ua+rsrCrpaitr7Gnrq6wvbGqqaWusLGgrZehpJ6impqmrJ2tpKaoqrOunpakkKOwpre5pa6jj4+aopqTkpugmZmmlnukq6KotMO3pKGmrp6dlJ6jn6SdpKqpkp+gnqCqr6mpoqmeppulnqegrJeinKWxpZidrJain5uTp5mhrJqgf72EiXO0c4Wfhq1od7nEuHGSoaN6ppmZdKuCfcvAwLpxi6OHg559lpiInsC9gpadnY2cwcF8gXqRjJrCwH1qpbJwjoJvynqAm3iSg46AdnmBgHlxe4CGcHiEipJ4bHWRYmVed2NfZYFiXXRobWRiWEtVSVFZSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX2BhX15eXl5fX19eXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SVtMKiNDUC8jRlszUFkvVUFCOy84laG5w7Svr7+pqZSjsKqwr66msrWvq6anprGroKuYm6OgnJuqp6OerKOlqaWltKSeo5Smrq24tKevopKRmZ2mk5GgopicoJ6Ipqukq62/v7CgqK6olpGfnaKZo6Sqo5OhoZ2drK6oqqWjoqSfo6ScramSpJuprqqcnqudrqOXmKeYo6SZnn/OlHp7pYJ6lpebX62PXY6ogKGhfKeVm3Wrg4GvXmSMqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3R8loe4YYKtWaPNbpF2e9t7f5lxfoiSdX9le4h2dmx+h219hI6QfWuAjF9wam9mYF94ZFtxaGpjZmBSVFNXXkpPQzRBSEVEOD41O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcX19fXl1dX2BgX15eW1dPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMazBwMC0tLC3mJ6RpKqprbWrprKsrKylrKawqqGnnJqmmJyir5+hn6ino6ahn7GsnJ6Vpq6tsauorKCUkpufpZOQn6WXnaiknq2jqrCov8Wyp6mxrZaSnpyil6Gqqp+VoZ6dnK2upqmom6WloqCqkqyzlqWiq6qepKino7KilJuonKGclpWRl6FyhoyYdoaoh3GwfJ1xrH2goIKlj554q4J+rX+dcq1/rIeGn3aYknt8l3+qiKKMkYycfat6iJOPn396rVacxHuQcJPBfYGVbXVwjG1md2WHbmF4bnJuh4mPjoJsjo1jbnN1b2BmbWRfb2lqbmZjWFNcYFpSUkM4SUhAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLiuv08bHsrOfnaOPo6Oirq+3r6mxp6iqqa6rrKeipJ2ao5WfpqugoqagqKijn56wrZiblqinr62op6mel5WapKKSlKGump2no66soqy1qbnMsaymrauWlJydopmfrqydlqGZnp6psaioqJuqpqOhqpqvsaKorK+mmqesq6uzpJOZpaeclpOFpGukdYp6qXV7snGCpYqYi3GIoJuHpF9hUquFgK6DnHWugqiGhp96mZeGe2aAo4qkmIaCo32pf4GUhq5ee6hVnaKSgnujn4B8xLDFjHOvtLO5cmKpr8J0aIuLlY2Aa5aPbWx4d3dua2ZlZHFxZnxpY11WX2lYWFRMTFBMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5hYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAnJyErLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwcnW1sChmauooa+in7G0sK+prKOnp6urq6mlpqCbpZ+dpqempJ2smqKsoaSgr6Oem5OqpLWwr6Gpm5yWlaekkZuiqJ+fppywpaKosay2x7G0qauplZGdnaGZoKWznZqhlJyep6qqoq2aqqagoamisqyhqrOyoZyrqrGxuaaUmKWpmp2Tfaptn4SIdqt5fLBugqSLiJ+WlZ6WgdK4tLjJgYKyX2CUqYOliIegepiWmnmqyXSao5SoqZCSmox+momaxsZ3ZaGCpXSCoI6Cfa9fb7VjsXVLo4dtp0eDk2SNj5yQem6UjnxueXR8em1bZmpycWeBaV5hWGNtXF5ZSUxMSkVEQkI9QTxBP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX2BeXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTRPVFEdHDs8RjItJKekwMe5ramyrq2lo5yzuayroaWbqKarrKmmoKalmKujn6+snaahrZqfqaWdp7ago5iUqKu2s6ycppyglpCmrZKanKejoKqmraCipqmws8Gxsqmsp5OJl52lm6Kkr6aXopWYnKWlqZmunKulpJ2ro7asobG5sJ6csKi1tbanlpmqppyhkIOeTneagoCfe4SjfIKkg4amn5yflIS4fH16uYOAzcbDtnibopKLn36Zl5eKdp+XiqSYpKh+r4Wcg56ErH2ZlGGlbKNxkIWQgX2WhHKsYKRzcYCaYbx9UlV1jZGhlHp7j42GcnlzhH5vW2xud3NqgW5aZF9obmJkXUtLUVNBR0dGSDo6Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSGLh5mprKSruauvoJyhrbO0pp+hlaWvrq6pp56lpZqkp6GzrqKpp7OgmqmklKO1o6OWl6Gptbmkm6Odo5OQorKZnpumpaCir6ybo6eitbHDsK2prKmRh5Ccp52jpJyll56YmJmlo6iYraGroqSXrqW7rKK3tq6enra0urO2qZqgsqOmoIiQ0rXDt3qHjoaRk4+ApneUoneMoZKFpYOMcquIhrRuc2qapJ2Wip99l5mHh5BzroKlm6ONpoqTnYiUkJptcLJcpXOTepxsmX97mX5uqWGicnN+n2Jzsrhod46So5Z7iYmOh3V7eI2BbGh3aHhzboB0XWRkbW1maGBKWVdXPEdGP1MzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJColknKNiq2/v7y7tZ6XqKSutqKimZWjqqiuqauZpaKfpqCgtaaiqaexpJSro4+kraSekZqaqrS0pJ2lnKmSlJevoKCepqOcp5yzmJ+po7Wqwq+oqqihjIOPnaKhpqOVmpqcmJqYpqOll6mnq6Cjm6ymvKyVvbCtn6Oytbutt6merLWmq5p8qJJ9fLB4i4CkpYicbbFvoIetfKKPg6iXmoKsioathqGVqKGjmIafgZmWgXuSfquBnZmWi6t3naCPiJOSf3qvXaOBfaanZZ6AfJd1aq5dpWxyhpldYFuMoG2Uj6OWgJGJkoh4eYGWfmlsfmJ9dG2AeWBnZXBvZ2doQlhfWj1KUzJTOEFBQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTgxNTIuKixBVFZWVlVUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiQpKbySmoSpxsO3wbSfm62grrmmo46ao6Sgr66pn6Oena2Ynrmgo6uhsKqarqGRqqmll4qakK6xraegqJutmJmPraKhnaWhmaWcrZefqKW2qL6upKmjn4t/jpuaoKaekpOZmpOamaWjopinq6qhop6oqLykl8Osq6OirbS7rbCpo7axrK6ad69/kIqchod8uq2JmGSwjGSWrn2hkISnl5yCrYyGsIeomqSio5KFoFxsa4KzYH+tfHuCgbJsZ26Zl4uHsVp9tVykg2vIomafgXy7WXa1WrJ9U6+BeqxYgKFtlo2lmIiUjZKTeXeMm3xjc3xig3d0gHxhaWZvbmZlZk9UYltBU109SCg+OT00ISEtJB8xLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl9fXFtYVVBOSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt767tMKzo5ytp6W3qaCLmaCfnbKxqJ6in521mKCzqKqrnrCtnqycla+po46Jm46vrKmno6iarpOaj6maoZ2ln5mkoqWYnqKosai7rqSonp2OfIublqGgmY+RmZuRmZeonp+Xp62lpKSipKi6n6DGp6apoay2t66wqaG/sLCwmIKqk6OujpuAhqSXmJCBgLjDuoSPnZSFqJmeg6yMhK+KqZ2apquSf9a9wqpipL+9fX+jgoPXu7i1hJSSgp69voRro4Jwq4VvnX96srHHg2ursb2seXiivrt0gJSMo5mNmI2TmXd/j5l5Ynx5ZIxmeIF7YGtlampiUGJbUmlcP1NgQkwpPDo0Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLLAurK+s6Kdr6ems6edjJelv6m2r6ehv6amsZuesZy5qJ+ur6WnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6adp5uaoKiimJ2grKypuK2no5qXknuHmZGnm5OOj5eYj5iTqZielqionqimoKKqup6pxaOhsKSstLWssqyjv6uzsp11dqqktoVliqBwZ6yQio9ubnelkJuhgnaynJhxkY5yl6qkm5mwpXJtbW1mi3hvbYOacYF6anFpZ4mWlZdyaWmFh2dxh2Rei2Npb1pdZ354pmBicpCScGZkgIyRjp+VlZeNkpp6hY2TdGSGd2eManh+eWRsY2VsYkpkV0lqWTlPY0RPJ0o5KyMcIBsiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXW1xgYGFdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurqys6upoq6fpLSqmZK9scPHvLSpnr+rrKOgp6uguqOkrqytpo6WraqQjIWVl62fpquin6SkoJKLpZKmmamalqOpoJWcpaWmrrmqq5mak5J7hJeNppeNkZCXlI6XlaaTnZanopmvpZ2hq7mfsMGopbSnrbGzrLCuqrynsruYjKOppbWciZejmIepm5CUnZKqtJqcpK6itZmlo6CjpJ6jpaKXrKeNk5ONh5OdnZWQmZOYkY+VhX+kmpeWjoyUk4qQiIV/aIyBdIN3dIeMcadtfZaTlJSBgY+Pjo6bkZ6TlJOdgIWTi3Boj3ZviXd1fHlpa2Vjb2NVYVg/aFpHYV5NVytFPSsmITY0MC4fHCAlMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXmBhYl1eVVFLRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW4rq+isKWuoKG3sZGOqsS8w7m2qaGknZulnbCopLennam1p6iRmKyjjIiKj5ynlq2koZqonp+TlqSXqJqpmZSmoKOPmqeYoLS5p6qYmpCNe4GVi6GUipWRlZCPkpekjp6Yp56atKOcpqu3qK/Cr6S4p7Cwsq+rrLa9o7LAmpOnpaa0opKdp5+OqaCNkp+irbGboqWzq7OapqOfp6ygn56dmK2ek5qinJSQl6uZjZmal5CXn5GHoJ6VlIaUjZCOlo2Cf2aOiHWId3qJhHScaoiSlpWSiX2MlpGSlpCekJmSnYGGl4V4cZRyeYl/cXt+am5kXnBpYFxfWGxiT19iTlg5RkZEPTI8PTcuKiUrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYWlhZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJakqKOwtKyvo6qnrqCotqqRj5ujsrmtqquhopl6nKGwpKaxqZecuKajlJipnI6Giomco5Cvn6SWqaChk5eZnK6Lq5aPqJmnjJiojp24taOll5uNiXmCk4ybk4qVkZOQjpGWoYucnaednbeif4OutaKwsHWkv6SzoHl7oq21v5d3r6ahioCqfmRcYnegj6Seg5Z+bZS1naWpsa2mZqCilXV7nJlwgZmqmW2ApKmKZZylnJGYmZeMk5yRhJ2bkJWElIiPj5OLhnlskYh2h3F8hoGBYWmJjJWTjFt2lZBmaI6McXmhlZVkeJeFgHaXaIKJgm55f2twZWB2b2traFtkY2FgbFBZPU1NTVJGPT9TQjkwLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0dJS0xUVVVZXV9nZ2dYUUo8REg8OVZSW2BhYmBeX19gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6qmqa6jp62lkpWqtK6wpZmppaqWdIucr6Coq6eUl7mgoI+cpJ6RfoiJm56OrJqklaiino6Xkp6Fda6PiKaaqJGWo4ibubOnn5iYi4l1d5KNl5OJk5CQk4yPkp+NmZ6lmJuxlYCMm7WdtIySj72non6no3ulsbqDjo+poISMhY+xqq+MipajmnmBi6yGnZ+jqauqiZaIm3elnHuInIGYp4SCe56ze4qGoJiZlZiXgpGXloSammJ5iJKFjpCTi4RucpGIeoJxgYGGgId0iIaXk3iWaJN0oJp0e5mCm5mEmH6RiIGCmGmMjIRqeHtxcGdleG1pbGpbY2loZHBaW0hTS1BARTUtWVNUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHU1hbWFthYWlmWVFIOUVMPD9iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKSgpq6uq6itoKmxpqeqpZmTrMS8r6CUpae0nZCDnaydp6KgjZC+npmNn5qhkX2GjpiXiKydo5ahoZKNlImGgJGojoahnKOTlp2Gnrmxp52ako6FcHWPiZWQipSPjpuLjpGdkJWeo5Sdq4eftIm0mq6Lyoirr4q3hY2whLOxhqmPqpqNnXyoj3J7d5yOppZolaR5tIyhoKiqlJrCg4GriZmhcp6Am6V+l4aWsoGhfaGTn4+YmICPlJuJmZKLfIWUh42WlIqFbnSThoB7c4eChH2FdYaDmIKPxWaAqYePomqdgZ2XgJmAioyDiJhvjZKEZ3d0e3ZnaXZwZ2hrXmJubGZqV2RGXFFMMkU0Nk1gYzcmMzxFR0Q6NjM2NTg7OD49PT5CTD9OSUpMQ1FaXVxXYl5qbFtRRT1LTUBJZFhdY2ZoZ2JiYmJjY19fYmFiY2NjZGlpY2JiYmVjYWZjYmJplZeioLCpqaimrKClubGpq6aalJ6hpKmhlKOptqKwf6CnnaWenYmUvZqTjaCSnZB5g5aWkYirmZybmqKFj4x2m5uOoJGHnaOblpiXhqK4rKWZm4yMfmJtj4uTkIyQjIyXi4+Rno2SnqCYoad+oaeHrZ2glq6QoJ6dkYeCoY2tsomkj6ycjJp+onaAmZRrgqt1Tat4h42dk5yqqYKqq3+Fonx7p2qegJNsZ5eGmLeJnn5uYGNYg5h/jXxkZ4xzmX15l2xdfZhvYVRyhl1gbXqEYFllgn6FgZlyqKprg6NucqVvn4GbZ2SebFpsiXtlWV+CfmFXUG92ZW90cWpqb11pb2xqZ1dmTVxXRThBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJLTUJKXF1fV15eY3VfTUQ6TU5NVGJcXGZmaWliYmRiZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiXnaG5oaqkpqySora8q6+imZaeoKWrq5+crbSiqJKgoKGnnJmOmLSZkIuejJWLdYGUko2KppaWmJ6ffpOFhayjh5yRipiol5makYelr6ailZmHiYBpboiIi46OiYuMkYuPkaGKkp2fmqGkf5OBj6OhlKB3nJaQp4OjqYCHrK+HpXqNf4SafaJwc5OHlXuejHlth5yLmpKdqpyPh51+hKJ0d6Znnn53pV+Ye32Tc6JumLe0unSTiIKAtqhkgca4fHGVtoxygZukZHSsq2F+ap2zfm5+iYSPg4yYcYCjbHKjcp6CfaNenJmzlXB8l56zdHJbnrKCaWJxdHVxaG9YamtxcGRbZ1xhS0M9RDVRQVlxMjxTR19KUj08Mzk1Ojo2Qzw7QElQP1ROTlFARF9eW1pXYGB7ZElDN0xXVVZjYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWkuZmrnJOgjqW4tq2uoJqhm6KjpKyamrGsq5OXoZmhpZqalJ6sm4uJkXiLhXGAlo2JkKGQk5Sdl32Rio6ooIaYjomRopObmoyLqKekno+Wh4R+a3uGf32PjYOLkJCJjpOfgZWbn5ygn4uJd5yYoo2gcqGMiamJnaiSmaquga6NfnqgmXmjk3iAc5eHjJx9lZ+Hm46anaiIo2ShfoyXkJuNbZ5om45vmpl7gIqnfXJodKuDnoNzqmeUml2bhXaEnWiqaoC5ZlypcIGcYZWMX6d2d4qLgJ1omnWHk5KYjX6ebJiPaqaZXKh+d7tqfalajoRds2dbbnJ4d2tpW3Bpd3dhXmRWYUFQRE42VkJSbTRKWlpeTlpEQDE1MTs7N0g/OkNIVT9ZU1hdPkRiXVZgUWFkfGlGQjlOW11YZWZYZmZubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplp2JqracqIljlZysu7KwrJ2lm5qnn52smZ2wp6uel6OaoqCZlpagpJmGiY1piIBye5eIi5aWhJKVmI96i4SWpJyJlY+Gip2SnJuIj6ihn5qLkIqAgGmBhnl/lox7iI2Oh46VmX2SoZ6foZOYcmifiqCPjHCSjYKpiZqhpauiqn+xrqSiuJd3o7Oio3+IlHideqqZf6KPn52ZiZhyoX6IjrC1fWyakaF4fpm1o6OrqISZfJt9nJt/dKpaXW97l4t4nmJNf3t7hmV6mEJNn1mianN9j2+CioSZdpt5h4mxs39+mpKmc32dbXB8lG+ZcmmjXZV2SGVjX3RxfH1uZV9rZ3V6YmNfUF1XXFNWQFlFUWdEUlZcYVheSUQ9Qjg/QTpIRThMRVhBV1JaVkVGYlxaYEtgbX1xRUM8Vl5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWN2bF5lZ2ZsZGVsaGlsaZSegbGumoRTX6GntLqzs6iaoouaqZubp5Kgq6OgqI+enp2amZWYoJ2Wh4eJd4WBbniVhZCbi32Rk5aIcoGJkqGbcpKQgIiYlJ+ahI6om5mVioqKfINshIVxgqGMeIWMiIeRmJR6kaOfnqOIroZ9tYSPnp17ppZ6qYKXn5GMo59/p2l4bn6ZdKBzcXydhZhvk4KtfKSEp5+bg6RwXqlodqNkcKZhnNOPfHuZeHJzY6KGkX6icqOQdmuQs4xgg5iKdKqyqLx/d4Rvf7+mqrRenG9/cpdwgnSjcl6kZ3SmYGimbJvTmHmBmm52eZdrm3l2l3JsqaVnX2V5cX+EbGhmY211dmZeYVFaZVBRYUhWSVRfV1NbZWpbZVBFQ0tMSktBSkQ4UEBRTlhTWE9TUWBlZWpTZHh5d0pHRWRdZVpoaVNpaGpuY2pmYGNfXF1dX2liYWhlfGReZGdka2RqbGZobWiYm3+wrFRdS36qr7G0sLOinJiEl6agoKKMpKefl6mKmZiZlJqTkqCYjoiFe3B9g2h9j4KTmoF3kY6PinCAho+TkmyYk3yIkZKjlYOOqZmTkoqFiXmDdoiAboGfhneAkYWHmKGWeJKho5mfibOhoraLeqynpK6lcamAm5GGgp+VfqWBo5uGmHGehKKtromXi3+MpI2Vg6+jlXe1trbJonSUjYOfYJ2XqW15loegm3Whh3egfpGXi4FvTWajk3KbiXSle3p1YoSDbn6hbXJkYJxzf3SYa3tqtLa0xqZzmH15nGqamatzgJpsc3eXaZl5dJhxUER9s15qdmt4h2ZrZmJzdG9sVVtSWWhPUWhJVUxYUlVcZ2tuVWdXTUpBSk1LSEpOQVFKUGVjam1ldXNzfnh7bnSJentVUU5tXmhca2lSamhpbGdtZmNlX1xcXF9pYmRoa3tfXWRnY2pmbm1laW1lop2JsKiFZUCUorKrr6+1oaKPf5anoaGji6SmnZymgpmXl46XkJCbk46Ig3lreYZlg4x/l595dY+IjIJqhYWShIuFnY16jIqVpZKCl6iWi5GLgIh6gH2LeXCPoIV5gZSGiJWelH6TpKablZaDZ254nGyiZHxypXicmHBop4Oajn2le6KXg5Zyn3aAiZSVj7lukIqiYn2Zo5eJbnNrq2t1oG5wp2GbaouQaZaHm5V1ooF+mmCLho11b4hiaKFmnn9qm3VxZWeJgm9zoltfW2Shbl6JjXF8gHRyZKVueKJjZqdnl3GLl22hb1KIj26gXmSnVItdVJhtbXJrcYFtcGhrd3NqblFWVVVlWFNsSVhOW0hXaGhzallrVlBSRVZcTVhSYVVoal53dXt8cH18coJ7f3N3jYCDd15Rc2FnYnBnUGtoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRtjKeupamwsaWfi3+WqZydo4uhoZqiooCVmZOOmpCLl5GOinuGcYCIaIuKfJeac3WJfZB8ZYOHlYqJlZqCfIiGlqaPgKGqj4WQioGJfYCAjnNpj6aDfYWSjIeXn42GkamlnYmmeJabfqWJloyymZ6RhK+Xn6V6mIl7qXWokISabqWijJKEjIO8bXylr4KHhYeVmJ6ifqZ8c6iVoZZpn39wrGOWipaTeKhtqqOBiXaJg3erkaaIa5KxbHezjalsi4Zvb6CekpVif6uMqniBgI6nn3effYWklp2gaJmHdaxmnq2MtnN2voykk1mDpo2rYXVydG97dXBian1uZ2xSVFhUYGBca0xcUVtJXWxtdl9bcVhbX1pnc2Vub3FjcXRgd3p+eXJ5g3ODfoF7e4yBgoB2YnlkY25zZFJsZ2dvbXJpZmlhX15cYWpibGx6b1xcYmlibWl3bWdsb2KWpqudgYCfpZaqqp6np62jmIiBlqmZnaKJmqScqJ2EjJqPhpyRhZKNjIx0hXqIg2+NhX6Xk3R1hnKRg25/i5KHhpSPfHuBhZekjX+lpI2AjomElHWCh5NubIuogIKLk42Im56Ii5KqoqCQgHSUl4h+gXmUr6R/gp1xj4Z5k46HgXtzqY1xfX16mJabhI14e319h5OVk4t3kpqhooR7f4ttjYZcenlze3Fpbn6TinKAdIKPlJNxhoSDZo1/X4KBjHh3dJV2cHpvcIluhYZfd2l4jmeCg4aPqpx/dH2WaYmIb311e4J0bGxmjHN4e5d3hFtrV3mPaW53cnFvd3hvXWuFbmlnVlleVlxlamNVYFRdUV5vd3lranZkaWpqdXxwcXRzYW90YnR7gXh1eYJ1f4B/gXmLhYJ+e26AbWR5bl5XbmdodWt4amlqZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW6qaeLoaObpqSZpJ2roZ+Dg5aqkZ2fiJmmmqiZg4Gci36WlIeOiomMcoJ8jnx+j4R7l450c4RwlYZ8fZKLhoaPhXh+gIaYo4x7pp+KhY+PhJWCho6Yd3GEqoWNkZyPh56dh4uap5+gq4OJjZWbf36Kl62okJOokXlxn5SFfZVwgKuHcX6VcWpvfIGfi3+RjYpnbV2EjY6dnqCQc5eNinN1bIN3dIFZcm+HkYJ+f4xqXWlke4WEiYBgaXl8nHyEjYR3goiFanqNiWxicXODd2B0jYOKkaiWh2eNjoJsdoqBboKKd21jZWN5g3qVWlxpZ252W3t5d3Rtc3KDZlxtimtrYllYXFlYa3FbXmBZXV1lcn16dG90Ympqant8cXp2dGRtdGhte351en17eXqAgH9vhomDe31zf3pzf2hUXHJpbHZwdWdsZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMq7KikKOhmp6emJ2ZqKGgfYKWq4yfk4aaopGllX97mIV8kpmJiIaGinJ9gIp2hIuChJaKcm+Ac5iGhH6Tg4OGioJ6gIOKmp+PgaWghniOl4iVioucl4SDeayBkJeYk4mdnIaHoaqeoqKki4eTm52jmparoqioopOdiZmRfnqRkIaqgH+TkZKTnLGlmpSejoywkZiEpo6Olp2hipGdhIqTi2x9j3d4ZoKGkYt9iZ6EiIyPiIiBhYSReHx7dZykioiMoIyHloCAjoOBd3F1hoWAeYmIi5GnkYSHjoeCi4+KeoOIhox/dGqBg3x5mWlyaGB0inF+e3d2b3Z0gV1eb4dnbl9eWVpcU2dxVWNbW2BsZ3R7e3Jub2Nqamh/e214fnBob29rZoB7coKAd399f4V7bYOMhXx6eXx9eoR4TmR2anNucXtlbGViYmBbc2ZwZnJxbVVdbHRtaHh6cGdpa2WNiJ67n5ejoZiVmZiUmKSgnHp+l6mNnYyFn5yLnpd9eJWDe46ZiYeDhIZteIB/coCHfoiThG1sfnqXh4SDkH6AhoSHfIeDjJqdkoapnYJyio+FkpGLnZF8jXupg42Rl5WOm5aFhZumn6KanoaDkpqZmZCZpqGmnp6Ql4KUjXl+ipCGp3x9j5CRhpiqoZySnI6NqY2RgJ6OipWcoISPmICIkIRweYdydWF/hJCId4yZgYSPgYaFf4aElW56dnWUpIyNh5yGho91gox+fnNzfIqFfHqOj4WUqJCHhI+BgomHh3OChYaIeW1qfX97bWhrbGdeeX9nfXt2dXZ1e3dcYHB9bnRgY1pbXVFmbFNkWl1gamh1eX5wbGxja2pngH9rcn9ra3Rud22EeW6GgHaCgH2Fd3GCjYd+e3t9gHuCi2Bpe2t1aGqDZWpjYGlcY3Vnb2J1bWxUYnF5ZW95enJlam1ti4qfuJqipJ+TkpaXi5qfnpx6d5ukkJuJhqSUi5iaeXqOhXyKkYOMgoKCbHt/eHKAhX2KkH1raH2Cl4mBiI58foWEh3yPgY+bm5CIppt/b4qKi5KGoKGKhYx8qJCHjpGWkpaSd4yjoKGdlpuAgZCamJONmqOipJuYkpx/kIh7goaQiaGBfo2Nj3yXpKCgkZmQj6WMj4GckoqUmZ1/k5N/iJCDdXWCcXdhfoGOiHOKln2JjHGNf4OGh49oeHJ6jpqTkYGZgImMc4OJfX5yenyNhnx7k46El6aUjIaQe4SFhYJzf4CEhXhkcHp/eHlwbGpmXn5zaHx1dnR8c4BqXmB0d3B3ZGNYXV5SaWhUZFheYGdpdXmBcWZqY2xnZX+Aam19Z21wan13hnpri4FygYF+gXV2go2Gf3x7gIF9f49qcoNudGliiGlsYl9xVnRvbG1geGhtV2pzdmN0enpxYmtveYmNn7OSpaadjpCYj4WcoZqbfHWjn42Xf4yhioiblnh8hod+hIp+iIKAf3B+e3R1goV+iZB3Z2N9hpeKgoqNeH2AjIN5loCVl5WNlZ6ZfW+LgZCThaWbh4yJg6aVhJKKlZeSkXaRnaGhmJSYen+PmJeOlpqdpZ6alJWde5KJhXqImI+ff4KLjoxzl6KeoJGXjo6hjIyDmJiElJeaf5mOfYqOgnhyfm57ZIF9i4dxh5SAkYJrh4OCgIuGZnZwfYiUmo5+lXmNi32CiX59coB5i4d7hpKLjJmkl4KEjHaHg4B/dHh/hoJzXnZ3fXN9dmZsZWF/aWp3c3R1fXF8Y2Rhc251cm1hWV9dWmtjUmJXX19nanR5hXBiamJrZmh8gmtodGhsbmh/fIJ5bI+FcYCDg390fIOMgYB+eoKDfnyQbXWJdHRtZopsamFjdVaDaXBuYHhnbGFqdnBmeHt5cV9xbIWFkJ2vmKepno6Nl4eFn5OVl3x3qJuKmHmWnIuMmZB5fIGMfX2De4CDgHhzeHlzfYCDf4iLgGRefYuVh3+FiHR9fol/fpiElpSWjKOgln5xhnuTkYqmj4yOipKgkYOQj5OXkYqBj5egmpKQknSAjpKUiZ2dnqeZmY6Vl3WRkoxtiJqRm3uIiZCJb5edmqKRlIqLnYuGgZOdgJSUloiain2LioJ7cXprdm18f4x/boWTg5V4cIKEfn+MgWVzan2CmJiFgI91koqFeol/d3iBfoeCfoWPh42VpZF5hYJ0iIZ7fnFyfoSBa2B5dHlwfG5hbmNle2Jub3ZzeHd0dGF3YG9sdW5wXVpeXV1pXU9cV2JgZ2xyeohrX2lkaWNod4dtZmxoaWxngHx6d26QiHOAg4V9dIGGiXqDfXqBhH18jnJ5i3h4bmyIa2hfaXFih2hxb2V2Z21sYXpoanx7eHBhd22LgZmaq6GlqZ6Li5GGiZ2LlJZ8dqyYjJZ8npORl5SJd357in18gHZ4f4BwdHN6b4V9gYCJfnxhXH6PkYeAhIRyen+Geo+Rh5GRm5KkmpOBfIF8jYqSpImNio2WmoyFkJeSlY2IiIySnZOPjI1uhJCPkYmemaKhmJiKl5NwjJyGaImbkJV7iYWQinCWmpShkJCIipiMgn+Sn32TkZSNmpB8i4aJdXN1a3FudX2LdW+GkY6ScnSAfIKCin5lcm56f5uVfoWKdZKMgnWKe3CCf4KIfoaOi4aOlquOe4h9foqEdnxubH6CgGFmd3N0bnpiXm9ha3RecGp6eXltdHFlel5ubHNtc1lZXV9gaVpPVldkYmVwcX+HZV1paGZiZ3GNbmNoaGVpaIF6d3VvjoVzgYKDfHaDiYV4hXx4hIZ6gIl3f4t7e3N5hGtrX29odH9rcW9tcWdva2V7YW1/eXdwbHd3iX+jmaOooaebiIuKgY6chpKadH+olJKNhqCMlpSRgXR8doV4eH9yc3qGbHJveG2JdoCAh25xW1l+ko2IgIGBdnWAf3+gho+KkpyXoJKWd4l+gIyInJ6Kj4aSl5aFiJOYjpaLio2OjJ2KjpGEbYmLj5GKnJahnJmWhpmJbIimhWiJn4yTgI2FjIF4k5iSnZCPiIiTjX9+kJl9ko6RjpuTfYuBhXB2cGxub3F8h2pzg4+Zi3J4gHWCiYR6Z3Rwd4KbkH2KhXuVk3t4inVyi3yHjnyMiIWKj5yliXyEdoGJfnd3bGh9f35bcXJxb293Wl5wYHBrXm9qfHpxbm1qbXdgcG9rcW5ZWGBgYGxXUFNZZWVhdG+EgmFda2xkYmZrkm5gZmZfZ2qBdXJyb4uAdH+DgXl2gYuAeYZ/eIeGdoOFe4eLf3x3i39qcWN8YoV8b3BsdGpobmx3d19xfnl7dHVzf4J+pZWbrZ+nl4WMg36WlYOOnXSJnpOShouajJaOjHpyeHSCcHKEdHF1iGxvbHRsh3aDfX9tblVRgauUh4J4gHZygnmBoIKQgZKSmJqRmHeQeoKMkqOak46IlJiShIWWmIuTi4mOj4idhJGLfXKLhYiPiJyan5uXloGVgGqJn4ppiaKJlIWShIpxg5GXj5qMjouLjo13e5ORe5CMjpOYjXyJfoJsd2pvbGxte4Bien6Ql4J3eoJ4g419emh1bXaIl4yAiYd8lZJyfIZyeI57jI58in+FjpGfoIZ9fHeBinx2b2dpfn92XXZubWtwclVdbmJyYV9tbnlwaHBmZ3R2aXFsYXdmXVVlYF9xU1BOW2VjXHdviHteXGhwYWJlZpFqX2dkW2dvfm9scXOKfXZ8hoF1dn+MeXyGgHiHg3OGhX6MjIR8epV4Z3Jrg2CHfm9va3tgaW10gHRec3x4hnh0c4V8eaGQmrGcpY+Din+CmYh/iZt+ipiSjoSImI6Pj4R3dHdzgHBwhXRwcYNvaml1bYJufXxtdXNSToLfyZLWk3xvdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2JnH+OgXh7jX+IjImcnJyblpR6jnhpi5SKboqlhpSJmISGY4yRmI2UiZaLjImLcHqVinyPiYuTkop6h31/bXxlc29rbXt6XIF6kJCBe35/gIaPe3ppdWt0jJCLg4eGfpeNbYCAcIKOgI6JfoV8hJGWm5yMfXd4go53cmtkbnyAaWdzbmdpc2xTXW5kcFlfbHF3Z2trYmd5dHBwZGB4YWBVa19edE9NS19mYlt3cIl0XFtkdWBiZWWOY2BmYlhpc3Nta3F2i3x0eYeCdnd+i3OAh396iX9yiYeBkIqIfX6ZdmVzbnxlh35ub2t/WWxueXpyYHZ6e412cnaJdnmfjJyvm6CQgoR4h5R+e4ibhoSekI6FjJeEk4+IgXV3cHlxb4NwbW5+cmNkd3B8bnp8amhsYqSawdyu76JzbHaDdYShhJFulY+Vn5OagJFwhYujl4mOlYqQnZaDgJSPhYiPgJKKipd/h3t2f4p4hoWNm5uXmZCQdot4cImLjn+NpoaTi56Ghl6LlJeJjoiNioqEiWx8l4N+iYaKkZCGdod+fmx9ZHh1am96dFiJe5KIhnp/f4CGjX96Z3RqgYqPi4SEgY2Yh22Dd3CJkoOShoCEfIGSl5SbkXV0eIeLdHJvZHJ2f19ybG9haHRmUmBwZ2tVX25zeWFyY2BpfnFzbltjc2JjVm5aXHdMTEtjZmBddXKJbVtcZHheYGRlhF9jY15YaXJrbmtyd4t9c3eEgXl4fIlxg4V9fYh7dIuJh5WGjX9+mHNndXF5bYt6bnNwgFdxenZ5cWR2eYaMaHaAiXGAnYiZqJyjkoR9cIuTd3iJm4OEn4yOfJaNf5qIhXxzd3Bzam+BbGptfHReYHd2e3B0emdgZXzr2rXJw9yJc2x0gXaKmoiMaZePj5uUkoGIcIWIoI2Fi5WKjJeTe42Sh4KIj3qRi4aPgoB3eIOEcoeCkpuWk5iHjHaIgHKHhIyJnKSFlo6ghIphg5WPhYiFiIyGgIdofZSAfoOFio6PgnKHf4Byd2h2cml1eG1ajX2Tg4Z9gIOBhIuDd2J1bYqCkYyDf4CUk39wg216iJGIlIZ9g3+Bk5SRmIlucXmLhHRqb2lvdX5dcmhtXGl0X1FkcWhmU19xdnRgcGBdaIRxc2pXZ2lkaVhtV1t0TEpLZWZeYXFzhWlbXGV4XV5kZ3pgZF9dWWtuZW5qc3eKfnNzgn97dnqIc4WEfH+HdnaKho+YgY2Ce5N2bHd2eXiTdG53enxYeYZxgG5neHaRgmR2hoVwipeGmqGbooqGc26RinJ2jZp8iZmIiXyff4Saf4J5cnNub2RyfmlmbHd3W194e3pxcX9pYWdhf9W2jpGmeG5xd3twkpCMhmqYjYiakIuFemiHi5mGgZKQhoaXjXyMjICAiY17kI1+iYV6dXuDfHGGgJWZjZKUgol2hIh4hoONlaChiJeRoYCJYX+Uh4SHg4iMf3+CZn2RgH+Ag4yPkH5tg32DdWxtd3V0eHZrY46Cj4GFf3yEgIWJf3BgdHKGfZCOg32Akop7coVne4WMiY6FfYaAgZWQkZSFbm94i350bG1oaHd5X2dpaVhrdFlSaHJpYlBicnhtYmVeWmqEbnRjXGhgZW1fb1Rabk1HTmZkW2ZtcYBrWlticl9cY2x2ZGVdXVpsbGJsanN2hn9xb398fXR4hniFg32Ah3V4iYGSlXyJhnaJgW94eXqEkm9teoB2XoN/dIFsaHpzlHNncod8cZKShJqfm6CHhnV1k35tdZKVfYeQg4qNmn2MmnZ+d3JvbGphdHxnYml1eVpgd3t5bXF+ZWRoaFedj19yc5e8xIR1cZSIj31xlouGm5KLh3JpiI6VgHuVi4GEmot8ioV8e4mLf5SIdYmGdnd+gXJ1hYGdlIWUj4SEcoGKd4Z+jJufmoiVj56BiWZ+k4J/hYKIiHGBfWZ+jHx5f4CIjI99aYF+hHZncHl4dHh0bGqPhouCi4B5goGFhIFsX3N5e36Oi4Z8g5CCf3ODanqFiY2IhnmFfoKZjpGNfm5teoh8dXNtZmV6c2FbcGJXbnFTU21yaGFOZ3V4ZmBeXVlvgW90WmZiXmtuYHBPWWpRRFNmYFlqbW18bllbXWxiWmJvdmRnXF1ga2lja2pzdoGDcW5/fIB0dYN6g4N9gYV2foiBlpB4hIp0gYhyeHl+jZBvb3qAcWmBeHp+bWx7dZVqaneEc2yTjYafmZ+ZhYdufYt1aXeWjX6BioKUl4p6kJZve3Rxa2pkYHN7aGBlcXpaYHJ8eWdxeWBlZY+xsndLYlql2dCWcXqQio93fZOKhJiQi4Vua4WRkXp5koaBhJiKfIZ/d3eJioSWgG+LiHF1fntqeYWDpJCDk42EgHCAhHiGe4iem5aNlZGWhYhwe5OCfYKCiIJtgXZogIV4coCBg4qIfGV+f4V2ZHFzgGl5cXB1mY6Gg4p9d3mBhXqDa1xyf3OCiYaKfoeKfIlzgm5yhoiRh4d0hnuCmo2OhXlubn2DfnV5Y2Vnem5dWHZaV3BrTldxcmZgS2x3dGFeXFtadX5zcFhnXmdqcmBvTldnUj9YZl5ab2pneXFbWlhqZVljcHhfZ1xeZWxnZmtpcXd/h29sf36AdXCCe4CCf4J/doGEiJeJcYKNcXuGfHp5hJSMdWp5fmtvfnR/fG9ye3qTb26BfnhnkouCoZmckYKFZoaCb2d5lIh9foSCmIqBfI6NaHhza2tmX2FveG1fYm94XGRrgnlhcXVfZWXU6r2LMjo+i45/cXmFh42NdYKWjH6SjYt+bWuEjIx1fY9/hYGUiHyCd252h4SDl3duiIVsdXt1ZnmCg6aLgo6LhH5ugXZ4hXyJn5KPkpOUjoyHf3uShnd+g4yCa39xaIB+eW58fIKLhHdieoWCcmRyaX5udXJ1gpyMgYCGgHR2f4F0gnBcboB1eYyEi3yIgX6JeXtybYqFkoWNdIN6gJiMi4B1bWp2gH90c1tnZ3VuV1Z8U1lvZExacnJlW0lxeG9cW1tZXXV/dWlaYltoZm9kak1XZVA9XWVcXXVlYHRvWllVbmNZZHF5WmhdYGdtZ2lraXB3fY5saYKEf3lugHx9gX+CenWCgY2ThHCBi254foB7e4iTiX9oen1qc3tyhnpzdn1+jHl4hH18a4uNg5uelouBgGyMfWpofo2Len1+g5SCfn2KiGt1cWdoYltiZ3JuX2Frc2BocIh5YnNzXmNkm6CPbl02Wq+1dGmAiHyRhnWFlYVzjoqJdm9shIKGdHmJeIl8kod5fnJndol+fphvcYd/aXZ5bmZ5h4Skh4CHjIp/b4B3goOAj5yJhJaTmYqMhYl8kIhwen2Ee2h+bGqAe3pqe3eCiIFyYHeBfnJkcmd2g251fIaWkoJ9g4FweHp8dYBtWXCAd3WNg4d4iHaEiXx5dG+LgpKCh3OAfn+UiYp8b25pbYGBdG1bZWRxb1Baek5bbltPW3JvZFVLc3hpV1laWmFxgXVhXl1gZ2RpaWZOWWdNQGBjW2B1YF11bFdXU3RgWmRvcldqXmJoa2dtbGlwd3ySa2iEin18b35+e4GAgXp3gH+Ki4NxfIdvcniDf3uJjI+DaX17bXd4dot2fHh/goZ/g359em2Ei4eYo4yEg3t1inhqbIOHkHh9eoKRgIB+i4NwcnBjZl5ZZ19wb19gZ3Bmam6JdGF0b1thZGp1eoC/nKakyLhxhIJyknt3hZKCc5CLh3Jyb4N7g3N0h3SId5OIeXlwY3eHeoCTaXKEd2d3dWNqfIKHnYGAf46PfnOAdYd7gpWShXuYj5aQiIKJe4mJa3h5fnRnemhrf3l0aXp3gIN9aGB4iH1ra3RofIFpdoKMkpV/fH+AcXx3fHSAY1Z4fnN0i4WCfYRyiIp5eXJxhYOPgIB6f353kIaEd2pxaGyHgXFvXGZgcWxJZHVLXWxUU1lybmJRT3R4YVJYWF1hcIJ0XWJcaWVlZGtkUFtwSUNjYFtjb11deGdUV1Z2XltmbmhWa15hamdlbm5pcHd6km1piIx5fXJ7fnmCgYF8dn2DiIaDcHeEcm53goJ+iIuTf3CAe3h5eoGMdIJ4f4GBgoR6gHVvfoqLm56HfYV5d4V6Z3SFi5B5fn97iIWEd5CAZ3BuX2RcWGVZbHJhYGBwbGtoiW5gc2hZXmNuf3ep2qnHhoeycYh3b4x0eoWNf3mSiX90c3R9d39wcX9thHSThXh0a2B6gnmJj2ZyhHBodW5bbX2AkJN/gHiRk355fG6KeIOTjYZ3mIyTkIiGhXx/hWx0dn5sZ3ZkbXt2bWp3d39/fGFieIZ6aXV1Y358aHWHj42WfXaBd3GAe31ugVpXdX9wdoWIf4B6bYqHdXlsdoKEhX99fnp9dIyCfnRodGVuioNsclloXXNkRm1tS1pgV1ZVd21iUFJ0dlhQVlheYHKEcF5hY21lZF5vY1RccUZCZV5dZWddW3piUVZcdFtbZ2tgVmpfYG9mZmtwaHB2eI50a46NdX92eH13gYSBe3R9g4iHg29ygHRxdX6FgYmNinp2f3iDe3yGh3eHfH2BfYSAe35ydXmLjaCMiHmIdnSCeF59hZeLeIaDdIWGhHiKe2JubFtiW1thVmlzYmBbZ25wZodyYXFlV1xia398ys6HuaFqbW2KbHGDcXuDiX56kIR5eHN4dXR7amx2Y4R1kYJ2b2ZffYJ6jIplcoJranFjWGx6hZuIgoFylpV3f31vinOFjY6KdJmQkomGi4N7eX1wcG98ZmdxYW14cWpscXh9fXpdZXqAeGp2eGaDd2h0iIyOln5ziWtvfoJ5b31eWXN/bnSBi3yCb3CKgHJ3aXiBgoGDeH9ze3WIfXtzZ3NhbouAa3BWaVx2W0dtak1WVV1TVXtrYU9UdXJQUVRXXmN1hmldYGxqZmNab2FYYm9HQWdcYGVeXFZ7XU5VZXBZW2poXVdnYF9yZmtncWdwc3eGeG6Vi3R/enh+eYOIf3Vyf4eFjoNwcHx4d3Z6hYWHjIZ5e390i319hoSDh39+fn2Gfnx5dXh3kZOffot8im11f3hjgoaVhnORim+FhYF7hHVjbmpZX1tcXVRnc2RgWGNxcmeAcmJrZFZaX2p/eL6ue5+3bmFzhWhzenF4gYV6fYt+d3dydm97dmVqb2GHdY6Ac2piXn55eYuEZnF/aGtrWlZvd4mjgYV/cJmTcoF6doRvg4SUinWXio6JhYmFfXh0cW5oeF9qbGBtdmpnamx5d3p2Wmd9fHlmc35thXVldYaOhpeAcY1oa3uEdW52Y11xfWx1fYx7gmd2iH5vcml3gHqAgXR+bXt8g3t4cWZsYW2JfWtsVWlfdlVKaWpOUk5nTFh7aGFOVXVrTFBUVV9ndoRnXmFxaGdiWGldXGtnSkRqWWJjVllVeVlNVm1qWV1rZFxZZGJedGZsZHFncnB1gXdxmYZ2f353f3yFh311c4KIgJWDbnN5e3p0c4SGiYmDeIF9dY9+fIWKjYOChHt+ioN7d3x3d5qcl3qIgoZpdnx7bIODkoByjoFxhoJ/g4BwZmxnWF1bXFtTZHBkXldicnVpdW9lZWJXW1tof3BvcoBziWRkeX1pc3VzcoGDd4CDeHZydW1qenFhZ2tnhnONg21mXV99cHuJf2lteGdqZFVXcm+MpnyEe3aWkXR9dH58b359k4h4m32Jh4OHg311cHFsZ3RcbGdebHRkZ2Zpem97cllngXd1aHCBeIJ3YneGi3yVgm+Na257g3JndGZhbnpoc3iLe35jd4R3a2xydXxye3t1f2h/gIB5d29kZmJthXtsalVoYW9SSmhqT0tOb0deemZhTVV0ZEpPU1dha3d/Zl1ndGlmYFdkV2JwXEtLaldjYVVUVXJWS1h1ZFpfa2BbWmNkX3ZnbWJwaXRvcn91dJmCd3+AeIB/hoR6fHWChH6XhW5ydHx6dXGEhY+BgHqLdnOQf3yBlY2AhYR9fYyGen6Ad3ujpYp5h4WDa3R7enWCgIt6boRzeYR9goN2b2ppZVZdW1paU2JuZFtYYXN7amhtaWBiWF5aaX9pa3CAZ2xgaHl4anJzc22DgHp/fHV0bXpnaXlqX2VuaIF2j4RnZVhid2p+h3tvanBnZl1UWG9njad2gHp8kI56dnGAcXV4fJOCepd2hoSAhoh2anJ1Z2duW2xkXW1yX2hhanloe2xbboNydGpwgX56eGF3hoV5kIV0iXJweoFzY3JqXXF4ZXJ0iHx5Y3SBcWdqeXVzbXl4dnllhHyAeXdxZGRjbXt8ampUZ2FlU0prZk9HUWpFYXhmYU1Tcl1KTlVZZWx4fGZfbnFqZV1WYVVublZKU2dXZV1YTVVrVElbeV9bX2pdXVpiZV95aGxhb292bnB4dXqYfnd/gXmAgIeGenh5g36Bk4NxdHR+enZ0hIiRfYF8kWtylYB7g5+Ffod9gH6GgoCKe3eEq55/eoeHgmpygHl1gH6BdG6Gbn2Ac4qAanBuZGRZX1pZWlRiamdbWl91gmlebWxcYVdbW2uBZXF0fWlpXGt2dWdzdnFshHt9fHh1cmx5Zml3Zl1kc2h6d5KBY2NUZXBogoV4eGdpamFXVllnY46nb353gIuOe3Fyf2l7cX2PfniQc4V+gICGbmR2cmRnZ1xqYV1vb1toX211ZXpoXXSAb3Jrcnx+dXZidYaMe4mIgYF5c3WAdmJxbltydGNxc4V8dWVzgG1hbXtwa2p8enZ0Z4d3e3p2cWViZG1yfWlqU2ddXFRLcWJQRlZgR2N2ZmFLU29YS01YWGhrdntlZW5xZ2RbV11Yd2VUSlxiV2dXWUhXZE9HYXhaXV9sWl5cYmNefmlqYG90eG1wb3aDmHpygIB8f4mMhn11dYV5h4x8c3V1gXl6eoGMjnx+hYlpc5aBeoqcfn6FeoF7f32GiXNxj62Le3uGj3xlcYd5c3x6dXJuhWx7fmyPemNwb2JlXmVWWVlXY2ZrX11cc4VoWHFuW15YWltremJwd3ZsYVlsc3NndHVvbIN4fn94dm1uc2RodGVbZ3VmdnaRel9dUmZna4OCdH5iZGpcVFddYmOOpGl4c4OGkXlucXxqem9/iX52inSCeX15gGlkdm1gZl9eaV9ddGtZZl1vb2J6ZVx3fGtub3B4eXR1ZXOEk4CIg4l7d3BzfnRjeGVccXFicXKCfHRnc4FlX253amVoen11b3CDdnR9c3JiX2ZtbnxkaFNmV1hTTXZeUElZV0hidGNhSVRtU0pOWldqbHJ8Y21tc2NiWlpbYXdcU0tjXVdoU1ZGWF9NRml1WF5gbFtbX2FiXYRpaGFueHltcGt2gZB5bYJ+gIGTiISBdnSIdIyGdHF2doF4fX1+jJB/fpR+cHeVg32ZknmAgHh6fX90iIR0cZmgenp+h5R3Y3SHeHJ3dGt0b35reHxwkXNecG9gZ2JsVFpaV2hjbWZcXHGJZVNybltZWFdfa3ZkaXVqaV1ZbXNwa3Nzc2mEfH5+enZubWtkaXBjW2pyZHR2jnNbVlNlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJJ1bGx7b3ByfX9+c4J4gXR7enpkZXVnXWJZYGdbXnZoV2JdcGlhd2FbfHZpanJveHRzdWlxgpaEh3+Fd3RrcX5vZ3hYXWxuY3JzgHp0Z3B+XGBwcmJga3N/bW52f3NxeGtwYVxlbGx6YGZSZVRXUU91WlFPWFFIY3NhYEdWalFJUVpWa2trfWZub3JiW1pYWWxxV1JQZlZWaFNURVlbTkhxdFhfY2xiWGBgYF2LamNkbXp4bHBpdXmHe2uDfYCEmnyDhHl8iG6Ph3Judnp8dIKCfIuPgoOYdHiBk4WBnol1gYCCdH+CcYiDdnChlnN5hYqGemR2im5uem5meHB5a3J2c41rXnVvYWdla1JdW1VnYWxrWlxxjGRPb25cVldUZmlzaGJ0ZWRcWG50bG91dHhqhnx/e4d2j3NjZGtuYFxubWNzeIdrWlRWY2R4fX1xhl1kX2NUWl9ZYpWVY21wg4WKdGtpfHBndXl2fm17dXZwe391X2ZzY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGl0cXRxdXdrbYWUgol9h3JzZ3B/cnRwVFxna2ZydIB2dGNtd1ZjcmxbX3BnfmZueH5zdHNqbWFaZGlqd15lU2NUVVBTbFZQVlNQR2RyX2FGWGlPSVhUV25pZX1qbHhsYlddVVt0ZFNSV2hRWGZUU0dZWU9Nd3ZaX2VraVlhYF1ejm5iZmt5dm5vaXZ2gH9sg4B9h5h7gIeAiX9rk4hyZnSAe3WAg32Jjn+Mk3J8ipGEh5+Ge3+GjXSBhnN+g3ZupItygIyKdnZseYtgZHtwZnlzeGxtcneDZ2R8bWNmZ2hTX15VZ19rb1tebo1oTmltYFVWU25mc2tleGVkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcXh+Z1pWWGBseHx7cIRfY15nVlhfV2ObiGJrcIGHfXhsbHpuXXh0bnxrdnRvcHyBc1hqbl9ZXFVhYldkcGJTX2JpYmJsWmF+bGZsdHZvbXd3bGmGjYCKe4lucmZyfm50bmRbYWlpcHSBdHNfaW1TZXFlVmNvZHxkc3h9d2xwbWtgWWFmZ3RcZFVgVVJOV2RRT1tOT0hkb1xiR1lpTUpfS1ltZGB5aW5+ZWBVX1RddVxTUmBmTlxgVVJJW1hQWXR1XV9la2hYYmBaXo1xY2dqeHFzbmh2dHuEcoKDeoiOfnyJiI15bpCJdGtzgXR/f4iFh5GElo95fYyPh5GbhIB8jYVzgIFzdHlzb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn5+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2NjY2NjY6NjY2NjY2NjY2NjY2Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo2NjIyMjIyMjY2NjY2NjY2NjY6Ojo6Oj4+Pjo6OjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZjgL67u7u7vbNtZmdnZ2dnbW5ubm5vckosMDAvLyxJhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX1t+yMTExMTGu2deX19fX19lZ2dnZ2hrPRodHRwcGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJiIiIiIiHjZCQkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYySkZGRkZGQiYiJiYmJiYqKioqKioqGg4ODgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpKSkYmHjoqQkpOPiI2Ojo6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjIuLi4uLi4uNjY2Ojo6OjY2NjY2NjY2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkYqGjomJjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCRioSLjYmQiYuPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPjYiMiI+HjY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGiYyIjYaPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNjYuNi46Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fX9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf3+Af4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWFhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2PkI6NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH19fn1/fn9/fn5+f35/fX5/f35+fn1/f3+AgICBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39/fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f3+Af39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fn5+fn1+f39+f39/f3+AgH+Af4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH9/gIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5PT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn9/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlJRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p7fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PT09OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAf4FsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTkxPUk5ZcHByd3h3d3R0dHd6fH59fn5+fn5+fn5+f3+AgYCAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwcHJ4eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4B/gICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz88ODk5Ozs6QDo7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ3eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GBgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODg6ODc6PDk3ODs7Pj07Ozo4OkBAQkI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozw/QEFCQD08OTw9PDk3OTo6OTg5Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTkpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gH+AgICAgX+AgX+BgYGAVkxOUFBOUlFQUFFRTjg9Pz08Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs8Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgIB/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUI/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQUA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz4+Ojo6PDo4OTg4Ojs9QD88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnZ3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQDtCQ0JDQD8/P0A9P0A+PD5APz09PT89PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhscHBwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAPz1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx8fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD47Pjw/PTw6Pj0/QkJFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5NS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQUVlb3BxcXR2dXh7fHt8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBQ0RCPz5BP0FERURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5vcHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4CBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZJSElHSEhJR0ZCREZERENBVXSHiYeHhoiCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMS0xMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fn1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0tLSktNSktISEZGR0ZFUGyEh4aGhoeHiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8/P0RGR0RFR0lLSUlHSElHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX9+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS01MS01MSUZKVmyBhoWEhIaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSEtMT05OUU5RXnKBhYSEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozw8PkE7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQkZIS0hMS05UZ3uEhIOCg4SGiYqLjIuKiYqLjIlUOjg2NTY3NjY2NDY3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3ODg6Ozc2ODg5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5/fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9REJERkZEVniEhIKCg4KGiYqKiYmKioqKi4mKioFINjc2NDY4ODc0NTc4NDY3Nzk5Nzc2NzY1Ojo7Ojo8ODk5OTk4Nzc6Ojo4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09QUVdrcXJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxEP1B9hIODhISEhomKioiHiIiJioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6Ojk7Ojo+PT0/Ozs8PTo+PDo8Ozw8PTw6Ojw4Ojo7Ojk5OTw/PD1BQkRJSUxLSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ozs8Ojg5OTg5OTk5Oj49Pz9DdoSDhIWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQkFBQj5AQ0FAPz0+PkA/Pz9AP0A9PT9CP0FBP0E/PUFBQD8/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVCQUdKTk9MSUdLOjg6Ozk6Ojw8Ojo6PDs9PkA/PWGFg4SEhYSGiYmIh4aGhoeIiYqLi4qKiouJi14+REdJS0pKRkdHREZIR0VDQUBDRUNDQEJDQj9AREhFQ0VERUVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzk9Ojw7Pj0+Pjs+PD8/Qz5KfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKh1dHTExNS05JSUtISUpKSUZEREZHRkRDRkdFQkhJS0dIR0ZHR0VLSkxJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgIB/f4CAf09BPj0/RExLQEJCQTk3Oz47PDo9Pz4/PD8+QkFFP2iEgoWFh4iIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLR0VHSEhJRUVJR0ZFTExNSUpHR0hJSk5NT01MTktIR0dHRUVDRkZGRkRFSEhGQ0E/QExtcHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ojs8Oj0/PD09P0BDQkhTfoOEhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTExMSUhIRkpKRUpIR0tKSUpISEdLTE5MTEhISUpNUE5PTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW9xdXd4ent4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojs3PD06PD88PT5AQkNDTG2Eg4SEhYWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLXlJSUE1OTUtKR0ZDSEtHTEpGS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSUpKTUtMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5e3p7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDg/PT0+QEVEPkJEQ0ZKdIaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLS0VGRktPTk9XVlFQT1JTUk1TVE9NU0xQU1VXUlNSUExKTU1NTE5HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZFR0dHR0hGPkBCPT89PEE/QUFEVEtCSElGSUt4hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSzs7UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBRUUtLS0dISkhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdGRkU/P0FARUFDRkRDREtWUEpQUE5QUHmGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXl1WXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NS0xKSUlMTUtPTVRwdHZ4eXh4enl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hMSU1QS0lKT1NSUVRWVVZUdYWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl5eW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYnRzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSklJRkJEQEE6T1FRV1hQUFBRUlNSVldXV1dsgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWlpYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3R3dnZ0d3h4e3t8fX19fn9+fn1+fX19f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaWlJTUU9RUlFVUlVTVl51eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQT0lOT1dWWFpaZHF0d3Z0dHZ4eXl7e3x9fX1+f319fX59fX5/f39/gIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNPT1FPUVZRU1JSVGNkdoCDgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVVJNT1lRTU5RU1VVTVFTUlBOTEtIQ0lHUlNUWV1tcnZ3dXR0d3t6ent7fXx9fX1+fX19fn1+f39/f4CAf319fn5+f3+AgH57dnN3fX5+ZHV9aXF0YGRdXVtZVVFMSExJYWySdFBRU01RUlBTW1JTUlFSVVVic3t8foCBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+QkJDQ0E/RFBDQ0BDPkJIR1ZASE5NR11pUUhHT0ZERUZIR0hCQ0hHSEpHREFBQ0BOUE1SZHR1dnV0dHZ5fHt7e3t9fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFJSUFVZU1VRUVRST1Zga2xzdnp7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo6PkA/Pj4+alBLYUVGSElFQj9HTE1HTVFVSkJFPz48PTw9PT89P0FDQj8+PD1CPklNRlVvdXV2c3R2eHt8e317fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSk9QTktMUVJRVFZVV1FRV1ZQWFtiXWFnbW1sbmpoYG5yaW1scXV7en17eHp8fHh3eGRCQEBBPDpCQ0FBQ0FbXE97Tk9PTktMTU9PUExLTFdOSUdBQTw5Nzc1OTk9Ozs7ODk4OT87Qkc+XHR1dnZ1dnd5fHx8fXx8fX1+fXx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9PXlxaSUdPUVFPTVBRTlFSVFZYU1JZVE5ZWltXWVxfXl9lX11ecXdrXmBna3dvb2xqb21ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RVlBNSURGPjk5NjU4Nzk3OTozNjU3OTU8Qj1mdHV3eHd6eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1NUU1BRVU9MUlNUV1hTVFhRTFhZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25ydXl5ent7fX19fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXU1tmSkxQUlJPTU1OTU1MSkZQUFVZU1RPSk5PVVNUXFZSVVNSTk1MSUhIRj8+PTo3ODc2NTk5Njc2NjVYcXF0eHp6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhXWVlZUlVPSUdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQFE9Y2BRU1FQTVBQT05OTVBOVFJQUkxJTEtPUlBRUlJUUVJPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1ZRU0ZGQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj40QD5qb2FSUlFAR1RRT1BQUU5RT1BPTEpMTFBQTk1QUVFOUU9KTE1NS0dFRUNCOz09PDk9RzY2NzZFbnF1d3p7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlVZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhETVNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTE9OTUlMS0lLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRyc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPz09QUBCPT1FSEZERkZJR0pKQEZBQUBGR0RJT0hRUmFcUVBST1NOT09MTE9NS01MTU9OW1ZLTVFPR0lIQ0lLTExLRkZGRT9CQz49Qkc/Qj9AZHJ1d3t6e3t8e3p6d3x4eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QUVKRUNIR0lHSUVCQj8+PEJAQEdKRU1PYmVQTU9NV0tMTktMTU1MTEtOTlNkTUpMUklJSUZCSktMTU5KR0lGQkJCQD9FRkVIRExvcHZ6eXl7e3p8endzeHV4fHx5em5xcW1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0hLRT9CPTk5Ojo/Qj88QUJBQURFR0tGRElJR0dIQ0M/Qj4/QEA9Q0VETE1RVExKSU1URklJSkxJSktJSUxNT1BRUEtHQ0tIQ0NLS0xOT05JSklHQ0NDRElKTUxJWnNueHl4enp7eXx2cnB1cnR5eXZ4anFva2xsbnR0bXN2e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtDRkdIR0pLSUpMREdCPD49Ojo6O0FCPz1CQkNDSEVKTEpFSUlGR0hDQztBQEI+QD9CRERJTU9HSEpHSEtESElLTUhKTEhJSkxKTV1SSElETkdCRUxMTk5QTktNSktGR0dKTU5STk1jbmp3dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ6dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RoZXBGSkNGRUZERUVGRUdDQ0A9PD06Ozo7QURAP0JDRUVJRkpKTEZJSUdGRkRCOkFDQz4/Q0NDRUdLTUhKTkhESEVJTE5NSElMR0ZGSUlMTktJSEVPSUNHTk1PTVBOTk9NS0lISU9TUVJOU2dnZnJvc3h2e3p8bGhqb2VrcG1zcWZtbGhpa2x0bW91dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWZfcEdKQ0VFREJCQUVAREI+Pz47Ozs+Oz0/REI/QUNGR0tHSklMSEdHR0ZFQz89REVCPkFDQkNFR0hJR01QSUVGR0tOT0tGSElGRUNESUpIS0lHSFBLREpOTFFOT05PUE9KSklNUlVVUlBYZWFhbWZwcm9yeXpnZWhoY2lsZnFsZmxtZ2lrbHNtcHd1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFREZCQUBBRDxCQT5BPTo6PT87Pj9BQj9AQkVHSkZKR0lHRkZGRENCQUFFRkNCQkJERUVHR0hGTFBMSE5KSkxLSUZIRUZFQ0NISUhLSkdLUk5DT09OUVBPT05PUEtLS1BVV1ZWVFlgX11pYG5pbmhyc2JlZmZkaGhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXNra3NNR0dFRkFCQERFPEFBQEM8ODo9PjpAPUBDQEBBREZJRUhGRkhGRUVEQ0VCRElGQ0dFQUVHRUZGR0VJTUtIUU1KS0hISUVGSEhFQ0lJSUtNS1BTTkRSU1JRU05QTU9QTUxOU1dWWFlWWF5aXWRgaWNqaWdrX2RlZmNoZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRUU8QENCRDw3Oj4+Oz47QUI+Pz9DRUdERkRER0VDRUNERkZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhFS0tMTE5PUlRPSFRVVFFUUFJNTlFPTVFXWlZaWVdaXlpYYWBhYF5oZWNgZGVnZ2poaGpnaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TkhIR0lEQkNIRT1ARUJEPTg6Pj49PDxCQj1APkFCRkNFQ0NHQ0NEREZHR0dJRkhKSENJSEdJR0ZESEtJR0tITUtKS0xIS0pNS0lOTE9OT1JVVk9MVlZUUVRSUkxPUVBPVFpaWVxaWlxfX11fY19cYmRsY2BkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVMSUpISkZCREdFPUFHRERAOjw+QD8+P0NCPEA+QUFHQ0VEQ0hERURGRkdIRkhHSUtKRUpISEpIRkZMSEhISkdMS0xMTElNSk1OTU9MUFBSVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZl1kYGZnYGVpamRzc2ZqaGZscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3NndHJrcXJrcndwd0pKS0lLR0JFREU8QUZEREI7Pz9BQEBBREFAQj5BQ0hCRURGR0VIRUZFSUhGSUhKTEhISkpJS0pGSktISUtKR0tLTExJSU1LTU5OT0xPUVJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFiYmBkZGViZGliZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dXNwc3d0dXV3dnV1dWZxc2twcWpydnB3SkxMS0xHQ0NBRTxARUVEQz1BQUNCQkNFQUNEQUFFR0NHR0hGRUlGQ0dKR0dKRklMSElKTUpNTEdLSUhMS05RS1JQTFJMSk1NTlBQUFVPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYWNfYWZjYWJobmhiaWhobXh2bWhpbm9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZzcXF1dnVzd3l3dXR1Y210a29wanF0cXdMTUxMTEdEQUBEPj5ERUZDP0NBRURERkNCRUdDQkhGQkhKSUdISkZES0pHSEpISUtHSkpOS05MSUxISk1KWmZKZFtKbFJHTk1fblVsc1txcGJ3Y1JQYnZ1aHVjYXZhWG5xYmR2aW16ZlxsdGBsa1Zgd3ZpamdoZmdsbWptb2ptb3NycHJycXJzcnNzcnRybmx0b25wcXF1dXJxc3R2dnV1eXd1dHRga3RrcHBrcXNyeUxOSktKRkI/QEI/PERERkRDQ0NFRURGQkVGR0RESkVFSkxLSUtMR0dOSUhKS0dLSklKSk5MTU1MTElNTUxbc2JkcF1sbFVMTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXHB2Z3BPTHJ5dmthYWtlZWx4bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eXZ0dGJtdWtwcGxycnJ7S0xJSEdFRD9BQT89QkVGQkVDRURFRURDSEhHRERLSEdLTU1KTExGSk9ISktKSUtKSklKTU1OTU1NS05NTltycG9ucHBrakxPUG1YTmlidHJwYW1vdlxZbFBbbW1acW1rcGx4eHRzaXBcYHNscWtVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRUVEQkFCPT8/RUdCR0RIRUVEQkZJSEhFR0tKR01MTkpMTUdMTklNS0hJTUlKSUpKTk9OTk1MTk1MXGhkdV1scVZrTU9RblVaa15rbHZhbGR0VGVjTmxZbFx0b2xqbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHJzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNRklFRURDQUI8QkBCRkNHRktHRUNDSEtISEZJTEtGTUtLUlJMSE1NSU5KSUdNR0pKSElOT01OTEpNTUpadHBwb3FxbGtPUVJuWXNrZ29vcXFvbXReblhhdF9ub3BvcXNvb3VzdHRqWl50Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNEREVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRkpNTEZPSkpXUktHTEtLTklJSkxJS0pJSUtMTU1MSUtLSlNrYllpXl9qY3JyWl9Zam9fZWVVa19jW2FhUWBtaFxqXG5pamRbb2VkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcnV0d3JISEZKREVDRkFAQUVEQ0ZCSEpMR0ZDRktMSUVGSk9MSU9KTFtRSkZISUxNSUhKSktLSUhJR0tLS0tHSEpJS0tMSklLTE5UW11UUFVNUU9OT09WUU9QUU5PUUpKTlBRZHFpVFlWW1tcVVlaXVhdXFxjZmFhZmJjZl9eZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0hDRUdGRkBFQz9DR0RGR0NJS0xHRkRHSkxIREdJUEtMT0tMV01JRkVISkpISUtITEpJR0hISkhISEVGS0hISk5LSE9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0UEJDRExNQUNDQkRJRUdHRktKS0hFRUpKSkZFSEhQSkxNSk1SSUhFQUhGSklLS0lMSklHRkpIRUZHRUVKRkJJTElKU19ZYFhgYVtgVVhaVF1eWl9SWVxQXlxZTl9cXlNbXmReWl1gY19ZX2JbYF5bVVlZWl9eY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdXl6enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQ0FDRkdFR0dJSkpJSURGS0tLRUZJSU5KTkxITE5HSEY+SEdMSUtLSktLSUdFSUZDREVCRkpEP0lLSE5aYlleXmFfUlRTV19fXF1ZXlFZXE1WX1dLUVlbUVtfYmFdXmNhYGJhYmNjZVpSWldXXVpdZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFlRSkZER0VCREhIRkdISUZHSkdIRkhLSUtEREpKTU1MTEhKSkhKR0BHRk5LS0tNS0tLSUdJRUVAREFISUE+SElGT11gWltkXV9UUVJYXVxcXF9bS1dcTFJcWUlNXlFRXV9iY2NjY2JcZGJhZGNmWFJXVVRcWFthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaGhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNFS0lGR0dJR0dKR0ZGSUxKTkVDSkpMTkpMSUtLSUlHQ0hIUU1LS09NS0tJSEhGRT9FQkhIQUBGRUNTXVleWF9YX1tdVVhYT11cUUtKVl5YXltdVlphUlJfX2JiYGBiYl9jYmFkZGFYUFJSU1xTXF1dXl5fX19kaWdsa25ucHt7fH57gIKDhIWFhYWFhYSEhYOEhYeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExKTExKSUdESEtRT01MUE1NS0xJSkRFQUVDSEZBQUZDQVVVRVxUXlNXYFhOVFVNWVpMSktUYGFbX1hfXmJdT1liXGBgX2JjYV1iYVdgX1VRUFFSWVNeXFtdXV5gYmZmZmxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVNjUUVXX0lHR0hERk1KUFBGSUlKS05MTEtNTEpKR0VKTlFRTk5QTU5NTklMQkVBQ0NGQ0JAQ0Q/TEdDTExQT09NRk1GRkhJR0ZMS01PUElMT1BQU1BMUVRTVVpYV1lXV2NWTlJUUFFQT1FWVFxZWVtdXGFhZWZkaGRsbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTl5NSEhZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tQU1NOUFBOT09PSUxGYUVEXkxEZmJDTFpHXlxzbU9NVm5ZS0NQX1RrVmdKXVhVXkRMUVVMTVNWUVJUWFZUWFRUXFRPZVpoaGVaVWtUWFdVW1xbYGBhYmJjYWdpZ25saHN6fH1+gYSEhIODg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUxQVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPUEpMTkdITVFbWU9QUE5QUVBKS1F/UUl8WVlyc1dQbUdxbm9hVlBxcXRPQmtzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWWBZWl5VVVd/aXR1dWBhdl9ZYlxcZltfYWFhYl9hY2dtb21gcHd0eIGBgoOEgn99foB2eHptdn50eH2AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMS09ITFJYV1FOT09NUVROT1FQTExPR01QU1taVFFST1BQUUxJWnhdVHhkaFhSU1B2ZnRscGJuZmtSck5Md21qcnBzcnFycG9vgF1lenV4cXF6cX5yfWt1fWFSaHxlc3Nwc3N8fXB+eG9/cmBgYGJiW2JhaGxua2JsZmdtd36BgIN+e3h3gHR2emlxfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQURNTUhLS0hLUE9NTkpOVl5ZVUxRU05ZWUxTU1NOTFBJUVJUWVdXUFRQUFBTTEhneGxjeHFtWkpLVHlwdW11Ym52UGRkSGV2cW13b4BqZnh4aVdyUWh6bWlqenp+bHh6f3Boblh1dWp2dXGBYXNofWlseHxvX19fY2JcX2NlZ2pqZWdiY2RsbXBwc3Rzc3N5cXJ4Ym10Z3J5e3NzdXl+gXN2em58fXl4cm5NSlJ0TkNCRVBRSEtMSkxRT09PTVBaYFpYS1NXUGFeUlZRWVNNUEpTVFZYV1dPVVBPTlJLTHJvdXVxdXFjaGBVbktxcF5HaHlXdlRLaHh9d2B5e3NuYV1tb2RTZ3J1bm15cHdrdXN0cWxtXHN+emtteXxsdW58a3F3dXheX19iX15gZWRpZ2hmZV5iYmlpaWprbm9rcW5tanBhY2Zjb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlFLTU5MTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUV1dZV09TT09OUklSbUhpd0tgZHZ2VFZsTm5se3Jhamd/dVRLV2tnfGxtbHhfWnB6e19genNjcm94cWdjfGlye11US2xfdnVsanZ8e25/eWx8cF1eXmJbX2NlZWdmZWVjW2NjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsZ2xtcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUExMU1NST1NSWFJXVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RS0hRTlBVTEtLUlNSUVJPVlVRUU9SUlhYUE1PVVRXWFhbW1VRUldbV1hXW09SVFdXWFFdWFZcVVRPWFJXV1hZWmBcaHNfXFtbXV1fY1pfZGRlZ2RkZGNaZGJnZmZtbm11ZmZnY2BmXl1nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTlJRUExWVlRQVFVYVVpVUlpdVVVUV1VZWE9PTE5XVFBOVVNOUE5MUVBLSVFRS1FNSkpPUVRRUFFTUkpITU9QUVJQUFBUVVJYV1xXU1NQUVVVVlNaUU5SUldUUlhVU1hUU1FVU1VVWVlYXlpfYV1cW1pcXGBjXF5iY2RnZWVlY1pgYWRhYmhoam5jYWReX2NdWmNcYm1hXmZmZ21zZGloa2tlZGNnaFFKS0tOT0xNVFFPVFFSTVhXVVRWWFdXWlZTXGBWV1ZZVVhUUVBLT1hTUE5VUE5RT0xTUE1PVVNOUU5NTlFTUFRQUVRUTktNT1JUVFFRUVVXVVlaW1lSVVJUWFdWWVxTT1NUV1RTWVRWWFRSUVdWVlhcWlxgXVdZX11eXVxdYWFeW2JjY2hnZmRjWGBgYl5gaGVnZWFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTFBVUFBUUU9RWllYV1laWlhYVl1qZFZYWVpXVlNUT0tPVlRQT1RQUFFPTVJRT1JYVFFRT01PUlRNV1FTVFVPTk5RVFZVUlJSVFhWWl1cWlZWUVJXWFVbW1ZQU1VVVVVYU1dYVFJRWFZWW19bXmBfVl9dXmBdXGBfX19aY2NlaGhlZWJZYmBiXl9mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1ZcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1XU01NUk9SU09NUFNSVVtVVFBQTFBXVVBWUVJSWE1PUFJVWFVUVFNUWVhbXl1cW1ZST1VXVVtaVlFTVlRVV1VTWFpTUlFaV1ddX1tgYGBWYlxgYV1gYl9cYF1jYWNoaWVnYVpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFpgXl9bXl5hYF9jXFlgWlFOT05WUVBVU1BVVVNQV1xcXFleXV9XXF5qcHd5gGNcW1ZWWVJOUFdTTlFRUFJUUkxSVFRZW1dVT1JOU1hVU1FSUFJaT1FTVFZbVlZWU1ZaWF1eXFxeVlNOVFZWW1tVUVRVVVdYUlNZW1NSUlxYWl5fXWJhYFdiW2NiXmFjX1xiYWJfZGdpZWdeXGRgYWBhY2RfYl9ZWl9bXFtYWFlXV1paWmFdXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dXGBcYFVcXGhqcn1zbGhcVVlXUU9TW1NSUVNSVVVVS1JXVlpaWlNPU1FVVVRSTVRQUlpSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WVldeWldRVFVXWFhTVllbVFJWXVldXmFeY2NfWWBbZWJfZGReXmNjYV5lZmllZ19eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SW1BaVVZXVlNUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVlRWWVdMUlpWXFtcUlBVU1dVVVJPVlBTWFNXVVZbXlhbWVVaXlhfXllcWVJXUllYWV9ZWVJUVVlZWVVXWVtVVFpdXV5hYmBlZF1eXV1lYWJmZF5fZGNgXGdlaGZlYmBlYV9hYWJiX2BeVlleWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUV1VV1lXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWV1ddWE9VXFleXV1UU1hSVlVTUVJXUVNWVFhYWF5eWF1bVV1fWF9fWFxWUVhUWlpaYVhbVFZXWllaV1hZWVdWXV5gX2RjYmZlXmJcYGZiZGZkX2BkYmFbZmNoZmRmYWZfX2JiYWFgX15WVV1aW1xbWVxZWV1bW1tYWFlbWlpaXV9dVFldVU5UWlZUXFVXV1lXVlxgYWJjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1VdW2BhXFVVWVBUVlRSVVVRVFVXW1tcX19aX1xWX19ZXV5ZXVZSWFdaWVxiWV1VVlpbWltaWlhaWFlfX2BgZGNkZWVjZFpiZmNnZmVeYWJgY11iY2llZGdgaF5iYmNhYWBeX1lUW1paW1tYXFhYXFtaW1dXWlhYXFtcYF1WXV1TT1ZaVlZaVllWWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dYWVpcXFxfW1pbYlZTV15dYWNcU1ZZUFZVVVVVVVNVVFhdXV9gYF1hXVdhXlteXFteWFVYV1taX19bXldYXFxcXV1bWlxXWl9hXmBkZGVmZmdjWWNmZWhnZF5jYF9lY11maWRlaWBnXmNiY2FhYF9fXFhZW1laWVlaWFdbW1pbV1haVFpdXFtgXFVeYk1SV1pXV1pZW1xYV1leYGJhZGFkYV1eWWFjYl9hYGFfXF1dWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQV1VXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXV1ZWFVWW1tgXl1fWVleXV5eYFxaWllbX2JfY2ZkZmdmaGNaZWZnaWdjX2NeYWZlWmlpY2ZqZGZfYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVXF1dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFhaYmVjYVJcWU9YVllbWVlXWVpgXmFiY2BhY19cYl1fXVteXVlZVFhdXF9fXl9bWl5eYGJiW1tXW11gYmJkZmRnZmZoZV1lZ2hpZmNhYltjZ2BcaWljaGpnZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1ZYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGJgY2JiXV1bWldYanFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl5eWlhVW15cXGFhX11bYGFiZmJeW1NcX2BjZGRmZWdmZmdmX2ZnaGhnZGRgW2VnXmFoaGNoaWdkYGJgY2JfX19dXVtaW1lYWFhWWlZcW1pWVlVMWFhcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiHiYeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5ent7enp7enp6enp6enp6e3t7e3p6e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl6enp7e3p6enp6enp6ent7ent6enp6e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4OCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PTz8TFxcXFxcfS1NTU09PTxL6+vr6+wqKKjIyMjI2Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OXg1NTU1NTU1uPl5eXl5OXSy8zNzM3Qqo2QkJCQkot/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXp6eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODg4OCgoODg4KDhISEhISDg4KCg4ODgoOAfHx9fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eHZ2dnp7eHt4d3Z4fHp5eXp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5ent7e3t8fHt8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnp9eXt7eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en56eXt4e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d4eXx6fHd8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3h6enp9fHp8eHx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgYCAgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt5eXp5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXl5eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3h5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgoGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKiouHh4eEg4KBgYGBgYGBgoGCgoGBgYCBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SFgoGBgYGBgYGCgYKCgYGBgIGCgYGBgoKCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGBgoKBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKCgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSDg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoOEgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgIGCgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoOCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGioyIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYGBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e319fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX+AgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqGhoOCgoKBgYGCgYKBgoGBgYGCg4KBgIGBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyIhoeJjIuLioaFg4KCgoGBgYKCg4KCgoGAgYGCgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qHiIqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f39/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4SDgoKHkpOQi4qKi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYGBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgYKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEhISFhYODgoGCg4GAgoOBg4WFhYWGhoeGhoaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhYWEhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgoODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6QjpCRj4uJh4KCgoKCgoGBgYGCgoKCgYGBgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4KDhIWEhIWFhIOChIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiIh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYKCgYCBg4KCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKCgYGBgYGBgYGAgICBgYCChIODgoOCgoKBgoODiIeHh4eFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiYeFhIOBgoSEg4GBgYKCg4KCg4SCg4SFhYSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpGRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4SEhIOCgYOCg4WFg4ODhIOEg4OFhIWEhISBgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhoWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGCgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBgIGBgICCgYKCgoGBgoKBgIGCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgYKDg4ODhIWEhYWEg4SFhYaFhYWEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+Ni4eEhIODgoGCg4OCgoODgYGCgoKCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHh4aGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSFhYKDgoOCgoODg4GAgICAgICBgICDgoKDgYGCgoODg4SCg4ODgoCAgIKCgoOCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhIWFgoGCg4KChIKBgoaFhISDg4SEhIaFhISFgn99fX1+goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISFhYWFhIWGhYaFhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIuIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICBgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDhIODg4SFg4KDhIWFhoWGhoWGh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWFhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhYWHhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaHh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoODhISEhYSDgoKDg4SDg4KEhYSFh4eFhIKAf39/f3+Af39/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4iGh4WEg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoSEhISFhIGAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKiYiIh4iIiIeHiIeHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODg4OEiYqHh4SEhYSDg4SDhYSDg4KBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChYiIiIeHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KDg4WJiomHhYeFhIWFhIOFhIOCgoKCgoOBfn1+fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIhIOEg4WEhIWFhoiHhoWDgoKEhYeGh4aGg4KCg4SCg4SEgoGBgYGBg4OEg4SRkpGOj42Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f4CAgH+FhoaFhoaGh4eIh4aBgoSEg4OFhoiLioaFhoSChoaCgIODg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhIWEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgISEhYSFhYWHh4eHhoCBgYWDg4WFhIeIhYOBgICBf359goODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICBg4KAgICAgYGBgYKBgYKEg4OFhIKChIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYODf35+f358fH+Dg4KDgoOBfn1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn+AgH59gH9/gICBf4CAgYB/f4GBf319f4CBf39+f4CAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgX98fX1+fX1+gIB+fX59fH1+goODgoKBgX99fX5+gICAf359fX18e3t7enp5eoCAf35/fn5+fH5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gH19f4GEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39/fn9/f359fn9/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/f39+gIB/foB/f35+fn9/fn5/fXx8fYWSko2Mi4qIiYiEhYSCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAf39+gIGEg4KBgYOEhIOEgIGBgIGAgYCBgoKDgYCBf4CCg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gYB/gX+AgICBgYKCgH6Afn9+fn5+gYGCgX9/f3+AgH9/gH+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKiIeKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4KDgoKCgYKBf359fX1+foB9fX19fX19fXx7enp5eXl5gIKCg4WDgIGDgYCCgIGBgYOCgoOBgYJ/gYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgYGBgYB/f39/gICAgH+AgYF/fn1+fn9/f36DhoeHiIKGhIWEhIWEhYaFhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8g4OEhYKBhIOCgoOFhoKDhIOBgoKDg4GDgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKAgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH9/f3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAgoN/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiIeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gIGAf39+fX9+f4F/gIKBhYWFhoaHh4aHh4iGh4eHhoaIh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foSLgH+AgISGkImFhIGCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4SEhIiSjouJiIiKh4iHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgYCAgH9/f39/gICAgICAgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf3x8fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjIqJioeFhoWDg4KBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKDhIOCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIB6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY2LjIyOiomJhoWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4SFhYWFg4ODhIKBg4OCg4KCgYCAgH+Bfn9+fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHyAf4KAgYB+fXuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjoyIh4iFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgYGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt7enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fX18fH2Af4CAfoB+foKTkYuMjI2PioWGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgICAgIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOHf318foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNi42OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGAgIGBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+jISBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjIyLjo2LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHt+fXx+foCAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHt8en1+f4CDg4J/fn98fXx9fH2Bg36Mfnx7e31+fX5+fXt7e317ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MioqMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fn9/fX5/f39+gH9/f39/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgX+AgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeGgoSQjoyKiYqGh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CCgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fX9+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYqJi4mFiJCNi4iIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIODgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fH19fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIi4uLiomMkI2MiYeGhYSDgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+f3+Af4CAgH9+f36AgX9/gICAgYCChIOBgICBgYCBf4CBgYF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SIiYqIiY2PjIqHiIWEhIOBgoKCgoOCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX15fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fX59fn99fX17fH1+fHx7fH16enl5enl7e35+gYGDh4SIjYyKiYWFhISDgoKCgoKCgoGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh+goCBgoKAgIGAgYGAgIGCgoKChoWEgYGBgYGDgX+AgoSBf36BgH1+gX59f3+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDf4iMiYqHhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBhIF+foCAfX6Afn1+foCAf4F+f4B/f3+Af31+f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iImHh4WGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h1d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foGBf3x+fn19fXt8fnx9fHx8e3x7fH2IhoaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF9foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fYB/fX1+fX5+fX58e3x6fHt6gIWCg4SFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoKBgoGBg4B/gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCDgX9/gH6AgX6AgYCAf35+fn5+fX9+foWFgIGAf4CDgX9+gYB/foB+gH9+fXt6e3p8e3qCg3+CgoKCg4KDgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3J5e3xwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/gH9/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgX9/gH+Bf4B/fHt7enx7fIGAf4F/f4GBgYKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f359gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+fn1/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fnl+f398fHx+fX6BgIGBgYCCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWEg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5+fX19gH+AgYGBf358foB+f3+Bgn+BgYKDh4WBgH9+foB/gIGAgICAgYKBgIB+gIJ/f4GCgoGBg4KDg4WCf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzd3ZzdIaEhIWDgoOEhIODgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH5/f4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf36AgX5/gIKCgIGEgoSFhoOAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4OCg4KBgoOCgYOCf4GAf39+f4B9fX18f4CAgH9/f398gH9/gYCBgIB/fYB/fn5+f399fn6BgoKCfn9+fX5+fn5/f4B/fYCBgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hn1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXh5cniFhYWFg4SEgoKDgoGBgoGAg4GAgH9+fn5+gH59fnx/gICAf4CBf3uAfoCAf4GAgH99gH9+fn9/fX19foCBgoF+f35+fn19fX9+f358foB/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgICAgH1+fn+AfXx+fX+AgYB/f4GAfIB/gH5/gYB/f32Af35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGDgoKEhYWCgn59fXt7fHx6d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc3B4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYB9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/f359fH5/f39/fX1/f31+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFh4SFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4B/gH+AgoCAgH59fnx/f4GBgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hH10fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KCf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af39/gH9/f3+Af4CAgICAf4CBgYGBgYKBgIB/f39+fX9+eoGSi3p8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYeDg4KDgoCBgIKCgYCBgYGBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCf4CAgIB/f4CAf399foB+fYCAf39/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaIfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fXx9fXx9fH5+fn9/fnx6fH17fX17eXp7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1/gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgYCAgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH18fHx3eHV4eHl7fHx9e3x8fHx9fn9/f39+fX1+gH+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGBg4OAf4KBhYODhIGBg4GCgoGBgICAgoOCgIKChYN/gIB+goOBgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCgoKCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5eXx9fHx8e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4ODgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoKBgoGAgYCAgIGCgYSAfoGDgn9+gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDg4SEg4OEg4OCgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBg4SAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t8enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCgoWEhIODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+BgoGAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6Af3+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z0fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OCg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fX99f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dXZ/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCg4F+gICCgoOCg4ODhIKBgoKDg4KDgYKBgYOBf4GEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhISEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fIGBgoKDg4aDhIOGhIGCiIeFhIODhISFgoSFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOCg4F/gYODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhISEhIWFhISEhYWFhYSDg4N/fYGEf319fHx8fH+Bfn1+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgYGDhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWKiYSEg4SFhYOHhoaEhISEhYSFhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXqDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4CEg4F/fn1+fX2Cg4F9e399foB+fXt8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SGhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goR1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4KDf4ODfYF9fX59foKDgXx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2enmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/fn1+gYCBfYB+fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH98f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIF/gH5+f4GAf3+Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4WGhouKhYSGh4eFhIWFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6DdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgYGAgYGAfX9/gX6Afn1+gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWEhoWHhoWGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHRwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYaGhoWEhYWFhYWGiYmHhYSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4aGhYWDhIaGhYaEhoSDhISGhISBhIOEhIWEhYSFhIaDhoeFhoSEhYeGhISFhYSFfXeFhISEg4KBfX9+e3x7fnt8fH1/fn18fn6AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeHhYWFhYaGh4iGhIaFhoaFhYOFhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoeIhoWIh4iFh4aGiIWFhoeFhoaFhIOFhYaFhYOEhISEhYSFhYSFhYSGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5+fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWEiIWGh4eHhoiGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGhIaGhYaFhIaGhYSDhYWChYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoOFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYeHhoeGh4aHhYiIh4eFhoaHhYeHhYGEhIWGhYWEhISDhIWFhoaGhYaEh4aGh4WFhoaFhIOEg4KEh4OEgYKEhIOBgICAe3t+fnx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aFh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WFhIOEhIWGhoaGhoaHhoaIhYaFhoWEgoOCg4OHgYOAgoODgoKCf4B7fX5+e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFh4eHh4iGhoSGhYODgoKCg4aBg36CgoOAg4N/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYWEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWDhYWGhoaGh4WHhoeHh4eFhIWFg4GCgYCDhYKDfoGBgX+DgX5/fn9+f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhYKBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4SHhYeGiIaFh4SGh4mGhoiIh4eGh4iGhIaGhoeGhYeDhIWEhoaGh4WFhIOFhYeFh4aHhYaGh4aGhoSDhIWBgIGBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhYWFhYWFg4OBg4GAgYGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFhoWEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhYWGg4ODhIB/gYCAhICDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx+fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoeFhYaCgoODf36AgICBf4OAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fX9+fHuIhYWGhoaGhIWEhYOFgoGAgICBgH6AgoJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhYaHiIeFhYiGiYeFg4SEgoWDhIaCg4WFhYaEh4aFhYWGg4SFhIWGhYaEg4WFhoOFhYGBg4N/fn+Af35/g397gH19f4J9gIF+foF+fX19fX97f3x7enl6enl6enx5enp6e3t8ent7e3x9fn19gX19fHx9gH99fIaDhoaGhoWDhIOFgoWBgYB/f4CAfn+AgXx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSFh4WHhYWCg4KBg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn99fX9+foCEfnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6e3x7e31+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+BfH1/f35+foGBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4aEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58f4N9fH58fIGAfoJ/fX+CfH9+fXx8fHx7e3p6enp5e3p6enp6enp7fHl7fXx8fn9/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSGhIODhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSFhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag359gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ojw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOTs8ODo8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg5Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5Nzo5Ozo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXU1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2tnZ2dnZ2dna2tra2tnZ2tvb29vb29va29zb3NvZ19fX19fX19fW1tbW1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKiZKZmJiYmJiYmJiYmJiYl4yLioqKioqKioqKioqIoL+8vb29vb29vb29vb60ioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU1FibGtra2tra2tra2tra2lVU1NTU1NTU1NTU1NTTnqvqqqqqqqqqqqqqqqsm1NSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz0/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dWZXBvb29vb29vb29vb29tWVdXV1dXV1dXV1dXV1N+sKyrq6urq6urq6urrp1YV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiYW94d3d3d3d3d3d3d3d3dWNiYmJiYmJiYmJiYmJehbKvr6+vr6+vr6+vr7GhYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Ozs7Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvNzs7Ozs7Ozs7Ozs7Ozs3MzMzMzMzMzMzMy8vLy8/T09LS0tLS0tLS0tPT0c3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7OztHU1NPO0NTSz87Q1NLPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbX19fX19fW19fX19fW19fX19fX19fW1tbW1tbV1dbV1tbW1tbW1tbX1tbY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7OztGwg4STz8mUqNLQxpOr0s7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/Jm7q4nayeq5uw0JmtmbPSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Rw6KPf4rClIecnsWThp2dzs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+eiqjQ1LvImJnGvcmWmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9G6pa2cntLRlJafztGRmKDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/RwKCfk6W8s5/Cm9qto7+d1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NKmr66bp9CLk57Hy4iVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRydfEmKHQ2qWZs9Dbopm11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxY2eoJ6gkqeZoK2QqJieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhycGhraGjpaakqKCvp6KpnNDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPVq42PqtackY661ZqRjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTBvtXT07nH1tPTuMjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEA+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR1NXS0tLV1NPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5ODQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NzY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg3ODQ7Pzw/PTk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk7PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urq4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg4OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU3ODc5Nzs6Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaippqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk6Pjc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQj8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw6Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQERBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/QkBCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojs7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojs5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw+Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QEA9QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6PD07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDo3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk6Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubm5ubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlY+LlJORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg1Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUtPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThBQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYSAgn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6PDo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX0xIUUlBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZGNbXFlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxnYmFaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yYGhfY1NRWFRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW19eWlxWXGhkb2NtaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJacnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbWFfZGBQT0FAPDs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzg6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFdWVNhaGBmc29zaXRjaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NDREQ6OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJiak5GZl56hlZiakpeUlJGUmpiTj5OdlpKLkX56fH90a2xuY29saHF3bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MrGxsDFx8vI1MvKyMa/u7u+xL7FyMbGw8TDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLi7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZm5iXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N4ZWZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oj07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIuLjI2SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7JwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL24vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlpZ11pb214d2JiYGBdWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmBndWdpaXRteGxdZFtVX1lMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pz0/Qj9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8rIxszJzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWR0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvIvLvIx8nNyMPIycnFxcPCwcLHx8jKx8zIx8jNxszPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0MKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmYlpZWVxYUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+6vb+5vbq6tL+4tbezr7u8t8C3vsK/wbu/wLy7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1VVVNZT1NLRTg/Njs7Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OTY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8DAt8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tKUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/t7yxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7a6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLu6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJsX1tUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb67xLe2uLa3wL/EvMLFxcfHysnGz8LBuK+1tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6v8G/vba3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYVtiUEtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAuK+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysW1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5hYU1ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rbO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3LxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkJFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD1APkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1urW5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVpeXFlRRURDTUlBRD1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcPDu7mztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d2x1enBtaFxfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenJ2dndtcGBeZV1bVEo8Pj9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7KysrSyt766s7WyvLq8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHFzd3R2cWxeYmBbXU5IQT89SENGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVk5ianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6trSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXIur2+trGnpJ6hqbGutbi2srCrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3Zve291cm1iXGZYXF1STk1BPkpCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCyse+wLi5trK0trO0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyxrrKppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2r6qwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlxdnNtdGlrXVtqVFxcT01IREZMQUZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw7PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u/v7mztLOxsa6wubm2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSD9IUUNNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+nn6iqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLfAwb68vLy5rq2vsrK6ure3tbW8tK+0q7a6uMDEwbu1vL24sq2zsK+srre2srS0r6qknpucnJ6oqJ+gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lopujnJSQjI6PkJOQlpWWmJ+enpqYppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeYN8dn95YnZsblxQaFRQTkdPTExDT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqSmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC5taelrKqotbKxsK6vsqemr6OvrrXBurW3sre2srSrsrSuqquvsLK0rqWekpiUj5mgn6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbCjpaeeoJyVk4+PkZCYkJaVmJefmJuZm6OZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfX2AdXV9bWt7ZGhVUWNNSUhHTlJNSk1HO0RAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmjpK6lrKy0vLessrGvsa21r6+ztaqnrayjnJmUjpGWl5mZnaCjopudpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6xqqWqqqCamJiYlZOWmpOVlZmVmpeXmKCenJyXm6Ganpqip6WfoaKio5yboaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDk+QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yeo6iurayrq6+qr6mfl56lnp6lpqSgop+moKKuq6yttbK2pq+0q6mqtLGwsLitp6GcnpqUmJqakY6SlpGMj46UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7qopqunq6uprKynoKCjsa2ysLSpsa+imZydnqGYm5uamJmblJWalpicpKGgmqOgmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWU1RSk5PVExSTEE3PkI2ODw3Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5SZkpKcmKGdqqKmoJ6noaSfnJKcopufoaOenaCfo6Cir66sr7Gstqetsa2mprCuraywp5+fo6CXkZScoZyamJKTn52hpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKerqLK1t7O3rLG0o6CdpZ+roaGioJ+amJWVn5ubmKShoJ2joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQk1HPUpIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj83NTg9Pj9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm46Tnpmona6ep56boZ2empqSmJ6coqKgoJ2in5+en6mrp6ypqrSrq62rpaWqqKusqqWgn5qSkpSYmZaWloyIi4+VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vLKytKGroqmosamqqKenmpidmammoJmnoJ+ep6elpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODY3PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7CmoJ6dnZeZlpmem5ykn5+dpJ2anZykoqSjoqqvrKepo6ChrK+uqqunoJ+foqOen56bnZuUlJWVnp6YlIadmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yup7GtscK2uMLGwMjKwMq/sLm5vbnCvbizu8XDvMK6trOpsq2qsrSvs66prqOdq6a1sayir6Wgoq+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GknqaZm6Kknp+bm5uch4WBe3Rya2t1cnBoV1tRRVRIRElQSD5FQTRFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKGcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6SdlZubnpqenJ+lpqedoKCssa+npKSjoZ+mrKefl5yVkpqdmZWMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMy8vSxr6/wMK9x8bCt8PJyMLAxb25s7m6tLu3sLWyqrqxrrq2vrq6qresqqq4urS7rq24o6ainqeloqOpppmbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfXpya2Rpb3hqZVpbRkpMRERTTERCRDc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZWalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKfn5CWn5mSmpadm5mjoa+zqaGbnZ2fn5qXmJiTjY+Wl5SPjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMjJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0dPM08/S08zKwsXGxsrHzr/I0MvGxMbEwLvCwL6+vrW9s62+v8LCxsTGw62+uLG4vMPBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQkA1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBPDs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6Osnp+upqWxqsXGzM7Nv7DCqaWora2qoZ2jn5ydmqmTmaGQjqCTjZSSl5mksbGrpKCdoJyZl5WTlJeSkI+Mh4SEiYeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrOytPX0dfS1NXT08jMxszNydLMzdPNxMbJycDFy8fIyMW+wrOzx8TLysrOxcm/vb68wcfEzMzIycDDv62vsqieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3tydXZnYmh3aWRWV1FETUZASVFCPUI8OjIzQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTs5Pjk6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5SjmJafnp2kr5ugsKuorLHJzdTXz8a7x6yttLisrqOfpKOeoKSsm5aplo2XjYyNl6awrqWdnp2hpaKem5aVlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU0s/Rw9DT1tfV1tLLyc7Qy8bN0cnR1dbZ1dfS1tjO0snO0czO0MvSz77GxsnCy8vLzs/Fxsa2v8m+0szLz8XJx77CwsfOzM/QzszKx824t7uon6arp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ojc2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKbqaaipqyapLCxqai10NTX2tLHxsu0tsLGsrapoqWmoaKrtaeasaGWlYyQpq2rnJWYoZ2boaKfnZ6blop4aWRhX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUz8/V1NTR0czRztPX1tPV0M/S09HJ09DH0NjX2NDX0tfZ1dXMzs/JzNHLzs+/xcHGxc7M0NDRyMvLv8nLxdPNy87Hw8nGxsjLytTT0NTP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjQ0Oj01Mjc1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzo9NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+uq6qrnaauuKirt9jU1dnZ0c7QwLzMybfAr6erqaOksbazo7aqn52hqqmhmJaYmpudoZ6ZnZ6UfnJmY2NfX2FgX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L083V1NHKz8zT1tLR1s3Q1dXRxdHUytDU1dXN0dDY19fXy8jOw8jOzMnMv8i+x8jNzc/K0M3Oy87Ox8rPz8rOysHIxsnMycvR0szT0dHPz8q9x7mwrbu4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wb2tiZW5wYVdcWklGRkRMV0U7QDwzMzw9ODY4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48PT46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp564trW1raWtrr61scDZ0tfa3NbPzcvD09DCwrKrra6sprOxuKuzt6mjn5yWlJebnp+fnpWWmJWKbF9fXmFkYmBgYGFgYGFeX19eXWJtcm9vc3R1dnmkvsvV0dbU09jWzs7Ty83Oxc7K0tLPxs7NzdTMztPNytfV0MzR08rL0NHTyc3R1dLV1crAycHFzMLHycLMwsXHysrOyszMz83Ty8XHz8zHx8rExsDFycvMz9DGz87NzczPxcfAt7m9wsO9w7mys76wu8PEtqqYpaGZlpGVlZKLlI2akZSUj4+UgomFeHBya21oYGBxaFhYaFZNR0xJUFBCO0Q+OzY3Ojg5OjU3PT1AOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozo7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHwrnL1dbZ2tvYzM3PydbWxcS4sraqo66tuLmxssChl46NmJaQlJKRlpeWkYx9ZmJjYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnEycnGxr/Dxc7Ox8XHzcrRyMvOzcbR0s/OzNTKx8rNzsfGz9LL0M/FusS+xsm8wsbIzsTCx8DGzcfDy8nKz8fDw8/IxsHGx8O/wMbLy8vOwsrLyMfM0MTFx7rHw8jIws/Avby/sMHKx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndudGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PDw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbOxrMnNysjEvr26zc3G0NXV2drb2NDK0NDS1MrFur6+sKi3qr65ubOlko6OlpCGg4SEgn6FhYB0YFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83Eur/Du7u6ub7IxsLDwMPHysnIysfBxcvGyMvNycTBycnBwcvQxMvIv7nBusXHvb/FzsrCv8O6ycfIusfFxMq/vcHLxsXDvsW8vL/CxMvExLu/ycLFx9LFwci+ysnGx8bQw8PGw6/Ey8fDyre/vLq0qaylpZifmKyjoKWao6CblHt2cnRmaVphbm1aW1hRRExGQkdETENGUj81NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzL0NLMx8LDx83Pzs3V0NbZ2NnQzNTOz9DLxLjGwba1vLHAtrqskYyTl4d7gIWGgHZ4dXNxX1pbXWBhYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwbC2urKytLKxwby7u7m4wMHBxb69ub2/ucTKxcXCvcbAt7vEyb/Cybu3urrFw768wc3Cxr69tcC9w7q8xrrCubO7xcPCwra/trW+v7rLwry1usi6v73Lw8HFwsXIxcjF0MbCzMeyxsnDzs3AxcK/vbK3sLOnqKi5saWtsKutrJR5dndqZWhgaG9jVl5ZSkVKRkhLQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Nz9LJ0cbW1dbYz8zQyM3IysW9ysGytbq3uravkY2KjIV5gIaGgH6EfHR1ZFxcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wLitsLCnqq2sp7i0trSzsrO6tb2xt7C0rrK7wrvBxLy/urWyur7AuMe4s7u1wMK8t73GwMO7tK+ytrq+s8S2urWsuLy9wL2wubautrqyxby2rru/tLa0xby+wsW/w8TFx8vFwMbGu8fLwM/Jx8PGwcO3w76+trm+xr+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJDQURFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLemq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzc7Jy8nLysvG0c/T0c/HysbKxcTAvM+9s7m9ubi3m46HiYp7eX6Ghnd4gX10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+5uLWwq6ynnqKqp56rrLOtqaups622sLKorqessru6tsK5urmwq7W5u7TCua+/sL28u7W7x7nCtq2qqLCxwLW4vK+wp7GztLu8q621pa62rrqxsKq5r627rbu4u7+/vbnCv8bCxcC8xsHHy7jFx8W/x8PDusTGwrvFyczLs7nCvLqyiHJ2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTs5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbP0szExsLF0MjPw8THwcbGxcXMw8rMw8TBx8C6u7vKt7S7vbW1q5GJkJB8eX6KhXp7hIF4bl5dXV1dX2BfX2RjYmNjYmBfXltbWlpdWlpaWl1kbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrraOnoquprKqwo6afqq20trG9ua+3r6iuuLS0u7ezvK63ubSxu8Gxwa6kqKKrsbKzp7yqq6irrK20s6WoraCkr6mypaeorqWntqywsre5uruxvL2+vsS/tcHAx8i3v8DEt8TCwLu/xMO+xMjMyr++w8DAqYZyc3JqaV1hb2RXVlhQSFpSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/G0dDNxMi7u8zDzMC9yrnAxcC8zLrDxsW6vMS9uba8xbi2uLuusZWDiY2Be36Af3h0f3xzd2ZfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnqObl5Gho6qjop+kpKekrJ+dm6Slq7KvtrensKynqrSrtLmwtrSstrixr7q5sLekn6OfprGnq6e5qqSmp6insq2gp6aemqSmrJ6fp6SfoLCsrKyxs7KzsLW8trvBwbK6vsPBsbm5wrPAvb+1uLu9vrzCxsTCw76/w6CDd3BsYWVfa29gVVlfSE5oT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG7vrWgnpSdoaa6tquzs7uzxdDJzMPHubjJws7Busu5vci7tse7t8PGs77Fu7avuL+7sLO2r6KEh4eCfXl2dHBta2pqcWlfYF1cXF1fYF9hY2JgYGBgXVxbXFxYWVhYWFZYW11eZGNiZWdnZ2ptb4idqaCXlZqhlpuimJWNnqGippuen6OloKeemqKbn6qwrLG1oqmqqauspLW4rbavrLK0rrK1rrCqn52eo6KypKWpuK2hpqafqKyrmZ+fnZmdn6WamaOcm52vqKunqqusrbCyuK64ubqwtru7uquzsrmyvbS2sbG1tL+1vb+9wsG6ur2Xg3pya19lXmRkWFRYXklXXUtQR0lKRkE8Pz9AOz88MDQ1MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bQycnBx7y8xcXQwbzKu7vBu7XFuLXBwbPCw7usqbS5t6exsqmLhoiAeXNucG5rY15iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1pbWVhYV1dXWFhYW15iZGRlZmZoaWtyjaidlJSUm5eboZaWkJyhoaidm5ylpaCkm5+gmpitra2vsqCloq2rpqG1sLGxrKeusqe5sqa2oKKemqOhraKhqbWqoqOmnaWmo5aYnZeYm52fmZednJybrKGrpqKjpa2rsrOqtLCyqrK4s66pr7KysrezramsrrG3sLq1ub2+trOxlIR5dWVeZV5bWVZTWlVMXFFMSkVIS0lCPT9BQUBAOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vr2/s52lo5ilscK1tr2ttbjDzcnIwca4wsHI0LrDxsC2vL22w7q2v8G1u7+6qqawurGnsa+afYWFgHlwcXRxaGVkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYWFZXYWRlY2RlZGRoanainJSUj5WXl5+XmZSYn52hm5agoaijn52onJuaqqausKubo6O2qaCfrqi1qaamrLCjtq+jtqCim5iYq6ahm6y4r6Kho5yhn6CTlaGUlpabmJeWl5yVn6idqaOhnKOqqrCtp7OrqqassrClqq6ysa+wrq+mp6eyrrG0r7uzubeto5SBeXVkXmFWWVdTUlRLTV5MUExHSExLRTxAPjxCPDs3NTUzMzk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tbnCsb64vK6dp6ejqrvAvcC5rrS4ws3Ix8TFvse6ys21xMXEsb+/ucDBur+/ubm8t6emsLumqKGkiYF+eHJqbHJ0cGloZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbXFpYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuSlJObmJyWlpugnJ+VoJ+lpKOlpp6cn6Sfqq+mn6KktaegoaKns6Glp6SupLCsq7SeoJ2UlKmhoZSssbCeoqOdnpibk4uhlJGTl5iSl5eYlp2mm6ahopmkpKSrpKSwpqWiqquspaiurq6rqKmps6Wmq66zsa67tbCvrp+SeXZyZWFcWl1YTkxRR1JhTVZQT0pNT0VCRD85PTY5Ojc1NDU5OTs5ODg3PDg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sresnqSmrbe7vMHFurG5tsXKy8HEx8fJuMjGtcXCyK66vMK8wsDBvby3uralp7G1naKKmIiAd29kYmdpaGZoamdqbWBdXFtaWllaXF1cW1xeX1xaWVtZWVlbV1VYV1RUV1VTVFNVYGBfYGFfYGFjZGmBlJOJkY6TkpOclJWWpJmglpyfpKGspaOjoqOhm6qqpZmepbCpn5+cpKqdp6Gdq6upqK2toqGhlJeimpyPqqiwm5+in56XmJOKnpKNkpKVj5iYk5ugopykoKGVoKGjpJuiqqSipKqiq62lrbGppqWmprWmqqits7W0ubqvqayei3Jwb2BbV1ZVUkZRT0haXE9SSlRLU0xFR0lDODs7PTw4NjY2Ojk7Ojo3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY6ODU5ODk4Ojs5QDl7tbSttLuysKyyrZ2np6+5ubO/yLq2wK/Gyc68wsvNybfLwLTAx8ywtbzHu8HHw72+trq1pKqvrp2Zh46DfHVpamptaGpsbmtrbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eX19fX2JkbY6PhJGGj5GOmZOUkpyaopyboKeoqqeqpaikopikrqSUmaWvqZ+bmJqgnq6Zm6myn6Smn6OjoJSTm5aVkaiprJqcoKGgmpSQjJmOi5CMkoyWlJCdoaCinJuilZugoqCXoaiioqiroKuvpK23paKjoqytqairr7O4sr21s6uvmINycmhbWFlTVVJFWUxRXFlNVE5QTFFSSU5JQjw/P0E/PTY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQwLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqinr62bqaist7asu8q7tr+szMfGucLP0Mm1xr66vsbLtLC9xLzCxMO8wLK5r6Wqr6uel4aBd3hvbmlubm5xZ2hpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTk9RWVpaWl1cXF5fYGR+jYGLf4uQipKNl5GWmaKgm5+qqqatqqavoqeZn6yglJWkqKedl4+OmZ2ulpemqZienJOloJ2RkJKSkpWnqqSZmZmdnZaOjIuThoiNg5CKkZSQoJ2go5eVn5WaoKGdkpulpaeoqKCxsKaxvKafo6y1q62nsLSwubW/sa2xq5B8cHJiVlRVTlJJR1ZQU1JMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6Ojg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qlorCrnaqnqbKwpLbGtLm6s8vGurzDy9HMtLm6vsDEx7W0tryyurvDvsGws62wrrCrm6KIa2htb3JvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQiZiJlJOYmpidqJufqqSkq5ymmKClm5KPnqKal5aEg5Gao4+TopyVlZaHoZqak4uOio+Zo6eclZWXm5CSh5SOjICLjYCQipGSkaCZn6GVk5iYlKGkmIyZpKanpqCftLKnsregnKK3rKqtpLKyprW8taursaOIeHJtXU5QUUxPRE5OTlBMRk5OS0pOTlFITUpBR0tISEM9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDEqKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6OppaCppaSzqqKyw7W1srPHx7i7xMrNx7WvvL+4vMSzsq62oqy1w7q6rqqrtK+vn5enfV5gZ3NxdnFqbmlmaGhqX1hZWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVlhYWVhbXWFvc3ZwhIiCh4CRg46KlJCTnaGOmpuioKKXpJahm5WMh5iajHONgn2MlpaFkJmQk42OepmOm4uCiX+JmJ+inpCTmJaEjoGTfn5ziY56kIaSkJCcmpmZkJWPnY2ioo2JmqCho6OborSvrK+sn5iluKalsKGxrpywu6qpr6qZgXZyYlZMUU9QTUNTTkxRTUNQUEhJTlNNSEpKREpMRUpKPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0ODg5Ojo2NTo4N0E3d7eio7SopaWoo6alpqWms6eltMG4sLSwysa5usLPx7+0r73Dr7HHsq2nrJWjrb+3sK+fp6ysqpaUonJXVmBoZ2loaW5jamhnYlxYWFhYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybH+FfHROWHKPgpeGjZyXipOQnpeclZSVk46WiH+TiV87V297ipOJf4uRjI+FhnKKhJaBeIJ6hZOdlIOVjpGPgoZ8knhxb4WNfomAkI2Pl5mYk4qPiJyHnpeGh5aemqCgl6evqK2pqJ6WrbSipq2ZrKuYp7Ohqa2jknxxbV9aTlNRVkxEVEpQTU1GT09KRUxRTUtPSklNT0ZJSD03NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg0NDg3OTw6Nzk7ODZBOXi3oKKtoaamqaCnqKeiqbCop7TCubG1sMnDubS/z8C6sbG4xKuuya6nop2FmqK6raanlaWko6CWjpZpUE1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk5LSEZITlFRTVBSVFZYWmBtb2l6gnRQQkB/lZGRfYmUjISKjZqMlpWKkoeFlYV4iH9gSlFueIqRhHyEjImEfn9ufn+Td3V2eISNmXBRjYiKh3t+eJR2Z3eFiH6KiJWKjZCRlouDiYeUhJqLgYSSm5aenJSko6eppaOem7GroaSkkaaqlqGpnKKmqIdza2VdW0hRUVNNSVVNU0lMTFBJR0ZLTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49Nzs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl2tpyipp2foa6hp6ilpqevrKq2vLa4trPCvLeou8m5t6mqt7ittsCqopuSgo+ZsZ+hmYyflpiUkYqMZU1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/hoB7hYySgJGZi497ho9/dX94c251cHSNjYF5fYmqhHl6aHZ7jnBybXiAioySeHqAe4B2cnGSeGd1hIOEhHqViYiKjIqAf4OKjH+Tg3qAj5iUm5WRn52onp+fnaCppZ+dmI2opJOgn5WenqR/cWZgXFxKVk9RR0tYUk9KTU1TSkpKTVBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC4vMjAwLy0rKCgpLjEyNjIxOTg3OTg3NzY6PDw3dq6Yo6GYnJ60qa+ppayrsLGqvbSyvLi2u7WzoLi7s6udn62rrLWzpZ6WkZiGk6SWnIyCloiPiYaGg2ZKSUpJR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWVhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYB2eH+Jj3yEmJKBcoaPe3Z6b2t+rXxzkIp/e4aSgH1/dGZ2fIVsb2dzfImMh4BseXF9cG11j3JocYB9jnBDioSCg4R/d3d6ioR9i3p0fo6Sj5iKkpubo5eZnZqdnqKdlo2LpZuPnZeOlpiOdW1rZWFZV1hUUUpTVlRPUE9RV0tOS09PSlFPSU9PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+elqCmsKyuq6epsK+xrLy4rLu+ubSuqZuxqK2ckJeep6ynpJudk4eWfY6VkZSAe4p6hIB+foBlSkdIRkJAQ0RJTExNUVJQUVNVVFRVVldXV1hXWVlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt3b3x5iI95fIuFb22MkXhzeGpqf4JylpGLgX2Wf0mSmG5od36CbGljbHmFkJKGa3NsfG5ye4VpbXB+c4yIg4V6fX56dm90dIWBeYF3cHyOjIqTg5aXmJqQk5aXmZeel4yDiZ+SipKNhpCWfWxobW5tV1VXVFJRWU9TVVVUWVZNTkhOS05OS0NJTkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepK2woq2qqLWvrqy0v6u8wr+mo5qVpZifjoWMlqKkm5uUlo92kX2Ei5CPfHh+dH13dHd8Zk9FR0RAPD4+QUZHR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqckGZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+b21/eouIdYGIhnRsmZFzc3xqa52OTHmEkomEjmcxdoZzbH59g3RmZXR+hISFgGZpbHVrcH97Z3Bwe26SjY57c319cXBudW2Cfnd5dGp5iYKIiYOWk5KQi42RlJWPl46AeYiXiIaJhn+Qh3VpaW5nY1dRWVdYWVxOUFZXWllPSUlFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyosLCsrKSgrJyksLDIyNi0rNTc3NTQ3OGlPODs1bpKImZGalqSorp6ynqa6rquysMKyu8PHm5ePlJmLjoZ6hZGalo+SjpKKc4mEd4uPjH92d3V4dm94c2lVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfWxxg4GFgXmDhoZ5cZ+Uc3iAc3WUhzVxnaidjqGhhKKEdnCGe4Z7c4ytjYiAaGZiaW1xbW+CdWlvWHVvjZqRdmx/e3xtcm5wf3pzdW1idoR/hoCGkZGKi4qSi5GMi4+DdnmLj4B+g4B9jnhwbm5qXlpbXVtZWGFgU09cW1lYTEhKRkpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5WltKitsK7Bs7rBxpeQjJSQgYl9boKRk4qEi4mQiHeEhW6Xiox/eXt7cXt0fGtvXkpQRz5ANzQ1ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvPpKDqa5fSExNTlBMN0NNUlNESoZ2gHx8dn5sd4eHfH2Fgn+MfnWhmXl+hoCEmYWbnGGGqp+di4KQjXp2iH6Jh45zipePg3tcZHF0ent3im1naWF5boWPgnpugXdzhHpxc3l3a25pXXeHfYd8iIiPgIuTl4ONho2HfXGFgIR8dXd7fId0bXFyZGVeWlpdU1tnXlhRVlldV0dLS0VMRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MTA0NjQ2NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHeJf5SMkZ2dn6aRoKqfsKmvwLG7xbqWj5GUiHqGdmuAjJKDfouFkI15hIJ0ooWNf3+DgHODgX1seWxTWExBRTMxMTI2NzY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cnyPi3p8iIZ+l4d3oZmIho+SlKWNrKlIhq2vr4qAgJOKgYuBhJGoh4CYmIqcc2x8gYaHfY5oZ2d4fm2FhoGFcYSFR2uAeHF5dmhta193fYOIf4iFjHqVnpyKi4mSf3t1i3Z8eG1vd359cXFwalpcW1pjY1dnZl1WUFFYWlFETExHT0lERkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYeRj5aYkpegnaygp7mvs720l42Si5iLfXRxf4qTf36Ng5SVfYd/hqWHiYCDiIZ5iIqAdYV5X2NWTEM2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlXBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYiQgJqWgqCgl5WbmqWtk5m7sae7yMOnioyhpI6TiYCQe3KDnp+RnH52hYWLj4eQaWhvg4B0jIaEi3GHgnaHgHt2hX1udnVngZSPhomJiImIoqujlomPmIB7gop7em9na3l+d3twaWNcWVlcaV1hZ2BbUE1OWVNSSVFLRE5HQ0tEQkBEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O252cGd4g3uAjICBkY+LmpqknKGspquvsJeSkYShlIR4d4CNlH1/koaTln+LgZKbjoSAgoyLgomOhYCKgG1wal5DQTQtLS8vLy8wMjIzNDc3OTs9P0JESEpPUVJTUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01RSUlLTEtOVmBjf2dnbXWdm4+ak5OLjo+aiJOPnYugoZKjqaSjrJOotqKnwcKux694upSafIyhnpmEkoSCj6Gek5mShIqFj5iQlWxvdYmLgZWMjY93kIRxbIWBipeSg4WIcomhl4eTio+Ql6W2qZuNlqKDh5OFfoBramt9fn1/cV9bYl5ZZmpcbGxfWUxIUFNRTk5NR0lRRERORkFDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmhZcINwdYdxdpGGfpeWmpSfn5unoKqWk5ieaGakmn6FlJJ6gJGJkpJ9i4WZkpGDgIGLjomGkoiEiYV4eH9oTlI+Ly8uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUVNRTlBJRUU+Ozw6Q0Y/Pjw3NTI8QFI1SEhITExNTlJeb4p8c4F9oJ2bp6aimaGXopWcn6ieqaufqKypqrWXq76rtsjJt8jRz76boHBpqqifhJORhZygmpqZp5GRiJWhmZp3en6UmJGhkpeXgZSee3aVkquziY2XoH2VnpyOk5aapKOntrCekZqoiJeQjoKJbHNzfHx5bmZeW19fYWdjYGdnXVJFS0tRT0pKTUdHTUNITUZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDU0Njk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmM0FAaWJfUHF1YG59YXeOfXyUjo6Kn5KXnpWcqpieqkJEfYeJiJmOeYKNi46NfIqGkJGPgoOBiYyKhZOFgoaJgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlRVU05TTEVFQDw+PUZIQEFAODY2Mjw5PEZIR0lKTk9RWW2GkHeVi6OnqrW9uKWurKyoqbSssLeysq27sbO+nLPDrLvJy7jDv7elo7CyrKyqo4qWmIWlpqCimIKmmY2iqqekh4WTo6CgqqGkqY6csIuVpKe4u5yho7CTo52jnpGkoqywrbO1o5Wmq4maipOLlXp7foN7ZV5mWmNgXWJjXmZnYFtQREpIVE9GSExHS0hGR0hBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NTQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaCk4WIgpyDkpGMktrInZZzVpeIj4icj32GjI+LinuJg4eRjoOFgYyGhYiShoKEiYaHh4dxbmFARTY0PDMvMTEwLSwrLTEvLTQ/REFOVlFSU1VVV1VNXFFHR0Q8Pj5GSENEQDg7PDVDOz1GS0pHSFJPUFeBk6CErqOzqrLBx8Srs8W2rbPAs7i+tr+1wba7u6S4xqm2yce2vrm0qKO0rbCwm5mSmp+Jp6+qpJV3n6SXoauxspiWqa2orrW7srqsr7Wisayytby4ta61oKeoo6ibqbCus7q3uaicuKqNpY+SlKCGeoGAclhfYlVkYGBhX19mYFxVSkRFTFZSSUpLRUtIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY1OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMXFpRY2RXenVxgZR9hIaTdoZ+gI17v7ujvIK0lJOOm4+EiI+Tiol6h4GMk42IhYKOgIGJj4Z/hoiFioeRenlvXVdARU48Njo0NkFCNzY0Ly83Q0hDUVxPUVVYVVxXT19VSUtKQUA+R0tGRkQ7PkA3RDc/QkpLRUZXVFBej6StpLK0w7a4wczKt7zEvbO0wri4wrW/sLh0sbSmusWksMa5sbOytKiktraqsKCilpuikqWxraWtrKekmKCss7mhqLG5tbu+zL/Fxb28s8K4uri/uLu4uq2tsaaxqq6+sb28wsKtmbupla6PmJmriX6AeWhVYV9WaGNpZVZbZFpXVUpIR01SSERJS0FJRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojo2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlWWndqcH+PhIGOhG97cniIYrmhmqOJlZSWk5STjY+XkoeHe4eBjZWKgYSBinp8i4iGfIqCgYuElX14enVmUFxkR0VMOlFkYFteU0Y/O0hQRVtjUVFZWVpnWlNgYU1TT0VBP0lKSEVGQUBDPEQ2Qj9IR0pMVFpUXpSvuLW7ucnAu73Kzby9wby4try8t761urLGYHWypbGanqu+qqWoq6qkorO1oKunnpWWnpifrqWnp6Weo5Sip7Czp7KyvLbBvdPJydPGwsXMwsrDwb6+v7y9uLWwube3w7rGvsTJsZ66q6Ksj6apt4qAfG9cXl5cVWBdaGZTWWJXU1dKRkZOS0E+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBQUVJRSkE5LywsLCorKCgsLSsvUD4oLjQ4gH08MkuIcTk+Q0tFQEpNUFJMUV1obWxxkI2GkHNscnJziNXAtpqgjZWZmZGPl5KWlo6GiH2Hg4yWin+CgIJ5e4uEh3uLeYGKgpd/dH16bGZwdlldXFBlZWJgZWRdW1hYXE5kbVVSbW5fb19YZ2VVWVRKREJLS0hGSEhISEJJOURASEtUVFZdWluTucC5vrjGwbu5ysu7t7q2uLm0uLW1rre3mWR1qZ6tcF6irZ2YoaKbpJ6rpZSfn5CUjpaYmKiepp+fmpmDo52spKqwrLewvLjU0M7Wz8nL0czPzsrHwMDCyr7BvcHBxcTGysDJz7SkvLG1sJysub2afXdpW1xZV1tfWGFiUVxhVFJMREJGSEY8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy4mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENER0tPRFJcWmlgcJeTkZRubG90dYezrKGhn4uZnJmNjZaRm5KFiop/iYaMkIyJfIGDc3uKg4V7inSBioeVf3R7eWxtdXxpc2VpbGhmamloYGZpaW1abnSXraS9iIdnW29oXVpZVEhLT1BKS1BMU1FITEFKRktQX19iZ2pimLjHsLq0u762scXHtrC5sbG7rbOyqKy4rY22qJ6cp5pOm56Nj6CWkaeYpZWKk5OIkYmQkZKdm6GYm5WWh56Zppqsr6ivp7Oz1NTU1tHLz9PUztPPzMXCytC/ysnLydLIzc7D0NK4sMS9xLqmt7vFon5sYVlaW1ZeVllkWlBdWE9SQ0NJRkRKO0FEPkJIP0BCODtEPkBJPTU2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkZmCaHJweXmDoaqeppeMm5uYi46VkZqOfYmLho6KiouQiHyFgnB/h4KGe4dyg5KLj35xeXVscXh/cntueHNsaYBwbWNpbnB5aXh9fsu/w9+nbmN4bmRbYWBLUFJVTlleUF1dTVFOVFFVVFxubneDcpeuuKy1qLC2q629wbKrtaaluaesr6KstKSPsa6bmJiMkZSShY+bgY2nkpyJg4uEiomEi4SUlZeXlJuQnJiZmZ6dq6ykp6KsrM7S1dHNy9LT09DU0c7Iw9TRyM7S09PWzdLRxdLWxsHPyMjDqb+40Jx2a2JaX1tVXlFcWlBQVVFPST5BR0JDRj1BQj9GRT5APzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd2x3cH1+gKCenqGMjZmTlIuMk4+WhXmFkJGPjIqIkYd/g3tyfoCCh3qFdoWTkYmAb3dzbHN8fHd8c4J4cWuAcnJpcHJ6eXJ7vsubf42yhHZyhXdpYWldRFpaW1dmZFhla1RYXV1hY15jeHt/jIKZqqSkoqChqaaqsrqrprSjoq6ipK6jp7KgiaablZORipKPiYKUiWuVo42ZhIGGfpGDg5SXrYuVjpWajoWSkJ2Xp6+hoKClpKjIzc/HwsvQ09HU0s7TzcbW083U2NbW2NXX1crV2s3K2NbRy63Ew8yHb2tfXVxWUldSW1BKSEpKS0A7OjxFQ0U9Q0Q+SEM/Q0I7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcYB2fmlzeXKCioCdlZ6UhYuWiY+KiY6Ij4B4hJSZi42JiIuJf4R5c3t9g4d3gHuHkZeBhG94cW51gHZ4fXSGfHlsh3Z1bn12hHV5fJ62jTxBi8alfo19amVXSUNlY2ZjaGpkb3lbX2Zoa25pboGDiZKMnp+gnpGXmaCjpKezpaSyoKKln6KpoqOynIefkpKTkYuPi4eEj4R+nJyMjYKEhXqUf4KqlqOMkouYk4t9l4qakaqzmJqcp5ymvcPFuLbFzdHQ0tDL0svJ1M7R1drX19jU2djN2NvOydra0ta/zM20dHNqYVlWUFNQWFVFR0tKRkY+Ojc6QEJDOkdFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzIqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0I+PDlRRUNKVGxub3BicXF0ho19l5Gei3+HkoOJhoWKgoh9eIWXl4mPg4iGh3uFeXF7e4SFdXqFjo2eeo1wfXBweoBye4FyhIeAbo56dXd9fYN1gH2HibB0WarCt42SgXBuYz1eaHJxcXBud3eCZmlvcnV5cnqLh4+UkpuWoJaIjJOcn5ufq6ChrJyimpqgpp+grJqMmo2Rk46FfYiIg4WLjqCZlIiDh35smXqEmYeIk4yOlYyGe5uIk4+uq5OVl56Ypq61vKitvcbLyMnLy8/Jw9LK1NfY19jX1NvX09nb1s/b2tLWydXMknR3ZWRYV05RUlxHQ0ZJST9CPj04Oj5AOz5JPUBCQUJFQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNUxHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxBPDo5RD5DR1JrX21kYmZsdoCIcZGQm4B5gI5+g4GChX+EfH2EmI6HjH+Gh4F3g3lve3uHgnR6kp6OoXaQdoN0dYF+dICEb4GQgm+ShXV9goV6d4d8ibjGpcPKuIKWnI94cGZOZWOCeoJ3haGRi3l5d3uEgHyEdm2UlpWWkJiRg4mPl5qXl6admKCXn5OTmKOem6yWkZCLjpODjIWJiYKGkJGenJqIhYyBhph7iImfl4+JjouLgnygiJCKvKCYk5eZnKimpa2ep7W/v7+4x8nNzsTNytHV1dTZ1dfb1NfZ2tvX29rZ2M7bxoJ1dWNlYV1SVVVUTUtETkQ7PT08OTo8Pzk+QTY+P0A9Pz49OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47OTs3SVBcWlJVWEw5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1caXR6eWyJjZJ3dnqKfH6Af4B+hnt+gpGKhYZ6hYh8dn51bX19h350f5KekaCDknyGfniPfnmLim+Dm4F0mYd+goqFfH6Re5Cpj5DDoL2NnKScfoqFfYlzjIuAc6aanJiUhXuPkYmEaUdwoaSejIyRkoWIi5GTlY+dm5OUkZeNjJafnZShlZKOjpGMfpCPjouEiZKWmZ+fiIyUkZ2Qg4x/ppmIhY6DhoSApIWKi7eXnZGUlaGmoJ2dnaOutrm0q8DGytDHx8zP09LS2NLV18DX2Nnb2Nra2dnX3LZ0dHNmZmJUXVlST05IRExDPj0+OTk7Ojo6PD02QT4/PT05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OkRXTzxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5WWGZtbW1pgY6KcXN4int7gHx/fIh7fXyLh4J+dYOGenN6dG2BfoV+d4aboZuelJOAjIh/mIeAnJJuiKmFe6GMfZGOg4mFnX+bkYqNo6KfkaSvoIuRi4WLgZOGV3Kti5+rnJCDmZyQkI5bgqKRgo2fk5WMh4iMkpKMlJWVkIyPioiWnJ2PlpeSjJOUhoCMiZKOi4qdl5ijo4aTnZWgioqIjpyQg4mPgIOHhaSEi5CymJySlJehoJ6Zkpudp7K4rKW9wsfNx8bPy8/MztbQ0dSt1tXY2tja2tfW2dmca3hwY2NZWVVRVVdDQElEPz8/OjQ4Ojs3Ojw7NDw8Pz0+Nzs6OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7ODg7PEA7QlFLS1NZUFRjYnltYn6Rg29ueIt5en97gX2HfHx3hoWAc3CFgnt1d3Z0hIKFfX+SpqKfpqKXip2QlJeLiqiXcoqzjYSokoSZlIWajaOWoJiTiZueopOpsJ+RlZGOjoiWjG+Nt4SaxMiynaKmnZyYlpGykGSkzceVjoaHiZCSjY2TlYqFioqGlpqcj5GVk4eVmISAkIyZiY6Qq5eXpKOImZ6VmomPh5eXioWPjYF/h4+kiI2TqJqXk5aYoZiemZOcm6KytKWjvcG+x8XFyMjJwsrSzc3UqNLR1tbW2NrU09rOf256ZF9bWltMSFRaQkJIRDtCPjgzNzw8Ojk+NjQ6Ojw6NzI/OjkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhTV1NSQmOCR3aBjn18bX6IeXt+e4KCg393d4CDfG1ui397fXh4fISHin6LorOno6qzopenoKWklpWuooORuJWSs5qNoqGMpZywo6SdmZGnlqmarK+kmJWWlZCLmJqXocCOo8m4q5yjpq6Ykpudsp2FhqiinJiFiYmOlYyLk4+IgYaHiZOYlYyMlJOHlJiGhJKQnHWSmbOWl6Whh5yZko+KkYqXm4mLl46GfoyYnomQkJuampOYl5+ToJ2Unpugsa6ipLi+tMXHxL3Dw8DGzcrJ0qbOzdTS0NbY09DYuW51cVldUl1VTkdJTkVBQ0U1Pjs3Nzo/PDw3PTQzNjY5Nzc0PjU7NTxLPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NDY3PTpKRkRHTlpcWUpmYDtJhIt6em6Fhnp9hHiBhoF+cHh9fn1vc416foJ8eIaLiYaEkqa7rKixva+lrbOzqaSisKyKmrWdo7mmla2llqqtuKeko6CaqZiqpK6wqpqZnJSWkZegmJq7u67KoWq3uKuwlZmeo6yTl76jXqqyg4qKjZSHkXyOjn2Dho6QlJWIiJOWjJCVjYuNl5mTnZm0l5WrnYqclJGNkJKMmZuLk56Qi4qWn6GMlI2XmZ2Sm5ielKGglJydpa6ooaS0uKzCyMW1ur28xcfIwtGgxsrNzcXX1tHL1J5sdmRZV1BbUE5FQz89Q0JCOEA4ODU/Rz08NjwzNTM0NTQ1NEI0OTpCTDpCO0FIQzs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkSGJgYnBJQIuKfoFzhod9goh1g4qCf259fX1/cHeHd46Ch3yNj4yGjJmqwsCvvca7s7TAvbWtq7O2jKiyrq29q5u7paitubmrp6aioqSjqq+ysaqenKSZm5iYn6OmpZKjuq+pv7ytrrK5paWofoiHnK29sIOMjIuQg46DkY96gYiQjY6ciIiPl42LlZeUkZqWnaiasZqRrJyOmo+SjpSQkJaXj5KgkomVm6OslJaPlJydkqCdm5ifoJOanqalpKKjsLKmwcbDsLC7t8XDw7/NpsfEx8S91tHNxcqFb29eWVdcWUxKQktBRkg/QUBDOzo1PkE+PjU8Nz0zMzMyNDFBMTdAQk0+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODo1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5CQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTjc5R0Q/Q0ZcZUZgaWdaXV2TjIyJe4eMh4OMdYeRioFvfnuCf3F+gXqVepKUlJiQk5ans8bJv8HMwsO5x727r6u6u5izt7qywK6mwKSrsLu9qq6ro6Oep6uutbCpm6CqnKGclp+wtaeMo7u6tsG8rKmdtKWlqZSFjqrEw6SCi4+HiISGlZSNeoONkY+RoYyMlJKOiZefmJOZlZemoK+cjKucjZaPkZGVlY6RlZKQoZSHl5+hs56UmZOfoJeknpqfm5+UmJ6lo6ampK+tpcDEw66ot7bJw722z7LEv8S8s9HKyMK0cHVpWVVZZ1BLSENNS0xKQUI+REU8NUFFPDszPTlCMzMyMjYzQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVpNZVxlVGJqmY2WiouIk5CGiXmHlJCBcoB7jX94h4KCkHmNoZaomZqZur3HyMnB0snKws29wrOtvL6nusC9u8S3rMGprLO8v6qwqqSlpKyus622taCgr5+lopmjtL2pnKm9wqO2t6+slLKsrK2Xh5qqpqWRgoyTpZaKgXWKknmFjpKQnZ+Tj5SLj42Uo5mXnJSUo56qnpGlmoyPj4+Vloh8j5aTk6OblaCinLWlkJ6WpKOhpZ2dpZidlZebpKOpp6KyrKi7wMSvpbO3zL+5r8Szu77Cua3Cw8LAl2h1XlZUWFhJSkxJRkRESURDQkRMOjRESTo7ND04RS4xMjI0MkIyNlNITzxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmlIX1hhWmNjVp6PnY6Xjp6SiYp/iqCThHiFf5V/f5CIipGAlqGZraekmMK9x8PHxdPOzs3LvMK4sLq8tL3Lu8PCtra8rbO/ub2ur6igqai2rq2psreanq2ip6Geq7e4qqWvv8WxvbqzqKu3tK+vl5alrKigkY6TssWnlo58kpV8h5KZj6mYl5OTj5KVk6Wdk52Zk6GjopyYn5iLjI+OnYhakJeXkpekmWWYop+ypZWhlaqrqaaanqaXmJaYlKCjqKWetqupubvDtKW0tsvAuKq2q7K7uK6ouLq9t39naldUUlNNRUpSTUs/QkhFRUlIRzk2Rk07Pjc+QUouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPjRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PkBCRkJwRWpJUmVhTEallJyXopeployRg4imk4iCh4KchIOVkJCUj5qinq++r6HGvMTExsbOzs7Syr+7trK7u7u+z7XEvrm5t7OxtbO4s6unnKusuaqop6+vmKSvpKekpbXAsKystL/DucC6tKi6t7m0sJalra+upIuTlaGNdMKafZeahI6XmYywlZqalZKSmZmlo5WgmpaaqZ2boKCZio2PlZxgSpacm5WapZZUlq+fr5yeo5SuraqkmaClk5OYmI2bn6eimbSoqrO7u7ursLLIv7imrKutsrKjobKytKRtamJZV01PSkRPUFBSO0hLSUhKQ0Q+OktVP0E6PUVNMDc1NDQ6QjQ0TVdPO0pLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs1RUE6QT8+SEA1K0M1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLqJaOiJOFoIeEnZePnaCbo6S0ybWpxbnCxMjKycjMzce/u7OuubnBwcy1yLrCubW6sK+vs7Wmo5uqtLWqqaatrJqlrqWkqKy6v6istre/wsC+ubOzxbO6vq2kr7WsuaaIm5imm3a/n4SZno6TmpqMrpehnJuXlJqfoKieqJ+ZmqqaoaeemJCNkZ2DbnaSopqVnaKdka6yo6uUp6mXqqyjop6kp5KRmZyHlJyinZaxpqmruba9srKuvrm2oKOnqKWmnJutqamLX2JeXU9KS0ZHTUpWTT1ORk9LTUJERDxRVj1BQUJETzE4PTc2P0I3NVVYTz9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh+ZV5IRauVm6Gfu6+ZlKCMk6uckZKTiauNhqGejKOslKOktsa+tMC5wsLHycXCzcjCvrmyr7q1wcLJtcaywry1uqqora2woqOYqrS7pqmmq6qdqa+no6qrvbuorL21uL7HvLe2ucKzv8G1qra3rL6lj6OYkqKgvZ+JmqGZl5+ej7efqZylopucoZqopLOgm52mnKiqnpiVkJSbi5aJjKShlJ2inaC0r6Wlkq+qmaqpnJyioqiQlJSfgo+enpuVqaShobO0urStqLaysp6do6Wbl5SYqqGedVxZXVxIR0VGTFBJTkVHSENTTEpCRUdBV1NDSD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85REA1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvKDsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWZcRkNDnXBiR0Wnl6OfnsOtnJelmJqqnJebmo+qlpWnppWtrJmiq7bEw7y+tsHCwMfDv8zFu725srC5s7/Cx7W/sLy3ubalpKurraChmaqqxKKkqaulnqyvq6Kpqb63p62/srm3x7a1ubnAs8DDuLaztLC9o5ejl5SclK6fkKKjpaOjoJC9pamdqaucnKGbpZ69opmjn6KprKGdl46WnpOeh4+EjZOfpKCetaymnJWwppmupZyZqJyfjJiUnoOOoJmbkqWkmpirsbWxqqWqraycmKCgko6QlaielGVfV19cTUhHSU5MSEZESUI+UUlBPEdJSVxST0s9SU9VNUJGOT5HRzVDYVpLQk5SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU1Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTltUUY8S3hlYVZLopqjnJ7FrKGfrJ+erqCTo5+WpaCmqayYtrGjqrO2xcS9v7XAwrvIwb7Jx7a4tbSxs7S3wcW2vrG4tbi0n6asqqydnp6lpMGln6mtn6Sqra+ipqi8taaxvbm3tsSytLi7wLTFwrm5r7O1taOdpZWSlKGun5minqmorKOawqypnqyum5uemaWgvaGdpJirq6ymoZqNmp+SnomOV3+Wn6WhoLiqppOYtKKesJ+dma2VnY6Yk5yBjp+XlY2ho5aQpa2xq6mhoqWklZWdmIqOkZKknoheYVhiX0tISkpORkVBR0s/PktCOjlKS05dUVFJPUxXXDlGST1ETUg4SGJbS0NMUFNZWVZXT1peSUE9V1FKTD9IPzVITFhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTW2tXcUdFNj11ZVxLTZ6eoZmfxKimobSinbOolKuloKSframsnbuwqKy2scfFwcKyw8O9xsO8xMm8r7C2rbC0r77DtLmysLq0rJmosamqmp2loafBrZussJuqo66xqaSovLant7u+sLfErbOzw8C0yLS8uKy0tq2qoqaWlZWjrKGfoJunq7Cvr7uxpqCpqJqZmJOio7igoaOSsLCspaafk6KelZ6PkI2Vnpuinqe0p6aMl7Kboq2ZnJqrj52SlZKZf5GglY6Nn6CUi6Wrr6WmoZygnZGRmpOFipGNm51+X2RZZmVJSExJU0FDQElIOztHPzk5T05WXlJTSj9QXl09SFBCTExJOU5jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MjUtLzRAMSsmVnRTZU8/MTA0YltNMjM+MDx2XV4/W1RdZXBAODtIlndlQTSeo5+boMOppKqzoqS1qpazraeipLKsrqm7sq2xtbTGwMTCtMDEvcnEtb/HwbSrtaivuKy/w7O4r622uaWYqrKrq5ifppetu7SbqLCaraCttLKnq7myqLq0ubO5wKq3ssS+tseowK+ut7Wpp6yhmJeSpqWiopiZpa+4rrK1tqCfqaSalJaUpKC3oqWllrCysqerpqKfmpqblZeon6CYoZ6vsqKmjZatmKSqlpecoo+ajJKWmIWVnpOLkJudk4qoqKqipqCZnZWLjpmPgYWUiJOed2FnW2ppTE9NTlQ9Q0FOQzs6SUA3N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAxLS8uPDYtI0JxZ3NrMjMvMVtiWjIzODA2cFtiSDA0SW9nVUNXRox5ZkM7o6OdoabAp6ivsaKqtaueurGspKu0trGwubewt7i4xb3Dx729xMLFv7jAxcC5qbakrLutwMG3t6qtsbqhk62xrbKWpKeRqrmqn6axnKugr7Szq6m1tq28rbSzubesuLHDu8DAp8Srsbevqaurp56YmauhoqGRmKGxr7OssLmam6mfmpeTmKegtqmmo6KxsbSss6itoJygoJuepZyil52js6+bn5CTpJmfp5mToZ2Tl4iTlpKVlpySiJCamJSOqKimn6KbmJuShY2Zin2LlYSNmWhma2BsbVdQUVtVQUJFVEA8O0lBODpYUGReUFdXRVlfXk5NUk5eS0o+WWNeT0hQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REVCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLS0uLDE9KicrPVxwPT4xLjBkWmM/MTY0N2dZYEYoPzhsfWdbVjuJe2NDPqefnaKqvaKqsKyksrmqpra1rKGttb2vs7i7u763tsDCv8nEucTDv7+3w7zAtq61pqu3sbu9vrSprrG2nparrqeul6aojqe7n6Sss56sorGws6yptbS1va6xsrWssLSzwbvGt6y9sLG4rK2qo7KmnqWqoKSXkJqfs6qzq6uzmp2nnJuWjqGmpLSuqKGtrq6xqLSts6qknJ+opJ6VopmbqLWpl5mRkZ2ZnZ+dj6mclZeElJaKnZibk4qNlpaalqalo6CclpWWkn+PlIV6jpKCi5RkanFmb3FeRllnVkRDTVdEWzlIQzY+XVFoXE5aXUdbXl5PTlJYZEpKQlxiX1FMTU9YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0dERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX15fVDE1MD1gVl44KkMzWVVcZ0s2jHpmTECkmqGlrbekrKqmr663qq+2vKinsbfGt7G2vcHDtbW6xL7MxrnDwLm+ucO3wLixs6upura6ub60qa2wtZeYp6yprJurq46rvp2rrbGjq6CxrbOurbWyuLiqrq+xqLWvtbu8yrOqt7axtK+upqG0oJupraCmlpabmrKjrqGmr5ehpJqak46jpqizqqKns62rtqWvsravo5mdrKeal5+bmau3opeTkI6YnKCXlpKpnZqSf5GXjJybmJaQipSSnpmkoaKgmJaSkpV6i4+FeoyKgoqRam13bHR7YUZha1lJR1paPXtKRkQ2QWJUaVtNXGJLXF1bUlNSYmBMS0VfYF9RTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KCg5LiQ6SzUuIlVfVF8vNShDX1FcLipBL0pHUFtHM2NZVUtEmZehsqmyqq2mpK+utqq4trqlrLS3yru0u7q/v7Wzt8PAzMi8w7y2vb+/t767sLutprm5trXCtqqtsLeUlqeuq6mjsKmUr7qkrLGzp6ijsrSxsrC0sbezqa+ssqe3r7e0xMa3qba3rLGtqaejtqCgqLKhpZWcmpWynqicoKqOqaOem5aYpqaluKijsrWsqLKorrK2q6SZoKuom5yenJSpuJyUjo6Kl5uhl4+WpJ+blIKQlI+cmpeWlYiWj5eap5ykn5GXkZCVdoOPh3uEgYOLimxvdnR7flxMZm1bS05jXD5ie0dJOEdnV2ZcTF5jTVlZV1VYVGldT09IYFxeUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkdlMjcnR2JMViUsQS49RUxRPDNya0lDQ5GZpa+lrq+rqKWxs7SruLK4oay1ucm5rsG7w7izsbXCws7FwMG9tL2/vrq+vLLDp6i4sLW1v7yuq7Kxm6Cnsa2mpq+lnbK1raqxsaypqLW7rbSytK2zraqsqKypuK2ysMjBuaW6samtraWorrGmpaSvpKmcnp2bsJqjo6Ojka2fpKCgoqump7qlrLa2pqusqa2xtq6jnqOoqpugm5uSo7OZj4mNhpChn5SMk5uekZGDjJKSnJmXlZSHl5KVmaeboJ6Mk5GOkHd9jYV8e3yGiIhwcnF9fHxcU2RvXU5YZVxGRJZbRztObVhiXE1gYk5WV1ZXVFhnXVFSTGNZWlRLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLysxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEoqOkc+M0JIUyw+kGs7R0iPnKqso6qxpKmltLWytbaysqKsrr3Muq7AusextK20wsPRxca+wLK+wMK7vre7xKartquytrzAr6uxrJ+jp62pqaWwo6qyqq+ssK+wrqy0vae2sLKpsqmrpaWjrbqtqrLDuratu6mpqKypp7GlqqWjr6qoop+co62VpZ6YnpmsnaKnqaKtpqSurLizsqKqo6Crr7Gsnp+mp6mZpJmZj5+mmIeEjomLnaCOiouUmo2NhIWPlJ6clJeVhpaUk5eknJ2bi5KQjol+foeFfHZ+hYOEcnFwh3RsX1pgbWFRcnBcSzyFfEY/WHRYYVpOZFxOVlZVV1FcYV5TT05nWFZWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxO1xKMC5KZ0VGNjtCLzRFS1gyQJVZPUxFlpitqaKrs5yqqrG3rbm3r6ymq6u9ybywvbbCr7Grs8PDzs/Dv7+0wMHDub+zx8Oqrratsri/vrGsraukp6qwqKipsaW0rqqxrq6ysbSutb2kt7OsrK6oq6CjnrC3q6qturelt7akqqesq6qtoamnp7KypKemoaGsl6qhlZugpp6loqqkraOgp7G4rq6kpqObqqytqp2ipKOkmKCblo+XnJOCg4+IhZugi4mNipeNjomCi5eimpCQm4yTkpGTo5qbmomPi4t8hoCBg3pzf4J/fHJ1i6SHeGtfYGxlV2SGY04/Z5NMRWJ5V2NZUmVVTlZVVlRPXF1hVUtNaFZVVklKSElPQkdJU1FZb0FOWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZWWS4wSmdBQTs7Qis6Sk9eNESHPUdGRJeTsKajq7GYq6qutqy3s6ymrKqpvMDAt7iyvLWmsrDDycvRwMC7ub++wbnBucDDrLG0sbO6wL6ysK6sq6uotqqnrq+qubCosrKvs623q7m4prS3q6ykqaqdpJ6zs6mopLS0oLeuoKqoqqirp6CrrKm5tqqqqqqiqqCtnJKqoZ2gpaKmo6qfnai1r6mmq6OkmaWop6qcoqOjn5mZoJCNj5iNfoeMh4OdnYaDiImNjI6LgoWVoZmNjZqQkpGPk5+XmZaMi4N/dYeBf394dIJ+eHZ9gIedj29xZ2Zvd1xfcohqT16ZVkhueVVlV1FjUE1WVFVQT1haYlVIT2lUVVNHT1hVST5JSE9RUHhMTlc9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8xUGEwMj9mPU5YP0MsPkxUXzBKaTVPRDyXj7GipqyvmqymrbC0tbCsprCqqbq+u7+wrbmuoravycfI0cC+vbu7wb26w7++v62xsbG1vLvBsbCzqrOppLSppa6zs7mxo664srGzu6u7sKqutquqnqqrn6Ogtq6poZ+wsqG2qp6op6qjqqGira2ovrCsrq2iqKigrJmQsKGYoqCnqJ+om5qrsaqjoK6ioZSipKOnmJqopZiXmJ6PioeUiH2NhoSEo5aEgYGKhY2LkIODk5+Wh5GdkJOQjZGclJePioaGeHWCf3x1eHl/eXJxd2Z+hqR2aV9jaYB0ZoiMfFJYcF9LeHNTZFRRX01NU1pmTkxWWWRYR1JoUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMEtnOjQ4Xz1hZD9GMUNQW1sqSEw5VUA0kpCzoaWnraSnpK2ntbOyq6Wwp6q3vcC7r6e5qqausMnHyNHDvL++uL2+vMi6wLevr7Oxurq3wLKyuqy4rKK0p6its7e6s6iovravt76wv6etrLWrrZypr6OfpK2sqJyeqrKktKibq6epo6ido6moqb6stLCunaqkoK6cm7OilaSbpKagpZubqqymoJyropyTnKKmnZiXqKmSmJqUkIqCj4V+j4OAiJ2PhX59i4aQjY+Df5OakoWTooyUkYuRm5KVh4l/gHJ7en58aXh8eXNubnpmg3eFimRhZl9xg3lsZnhdXlQ/V3ttVGJQUVlMTE5ydV1IWltnWUVVZU9DPkpORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHaUkyNFg9ZmJBSjdHU2BVKj05Q1Y9KpCVspqgoaqmpaKrpbiztKaqsaast8G9ta+iuaynp7DCysnMwba9wLS3v7rItMK0srG0sb23ub21rbi1vqyhs6errLG2uLWsn7+9qrPBtLyhr7O1qqyfrbCjnKWpqqSenKSwpbCgn6upp6GpnKWpoa28qK6xrqGro6Sunp+tppefm6GknaCdm6Sro5ubpaWWl5Wgo5eblqWsjJ6RkZGLgoqAgI6Be5mUjIh7fouFjo2LiYSSl5CGlKOKk5KHkZqRk4CJfXlsfnZ5eGN8enBubnB1Zn9yaoRoZGZda3KMbGBocGBvPVt5bFVeTlBSS0pNVFpXTVxebFdEV19PXk9ITURGOzdIRUtPPHJoS0s5QUU7Oz0+Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPikdNDkmJy4zNC4wKy80Jiw6JDQxQWdZMTRTPWVfREw2S1ZkTyo7MU5XPSOUmq2aoJiopKSgqKS4sK+kr6+pq7jBubKtn7mvq6i0usjLyL62wr6vtL23xLbCsa24sbLAtLu9t6i5t72qo7Soqauyr7qxq5y9vqawwba3oq+2taemp7Czn56lpqiippmfrKipnqGqrqagppikqaCxuZ+ksa+hrKGspJynp6iZmpufpZadnZufq6eXnaGqk5qUmZ+UmZahqZGaiY6QhnyHfoKNfXygjI2IeIKLhImLi4WHk5qOiZWfiZGVgouXjpF9hXxzcH5ydHRgenhobW5ubWd9cWN7bWlkYFtkhH5eWXNqcklJf2lYWk1QTEtIUFJRSU9cX25TRFhaUmdOR0tFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQiosNDtOTkA7NzMtListNyoqPCU1MzxlYzI0TT9lXUZPPVFaZ0gqPS9XVDUol5+nmp2XrqGhoaWht6uyprS0qai5w7SyraC4ra6tsLXGyMC2vsG5sLS8t767va+qvbC0v7G9w7mpu7q3p6e1qaissq60saicv7imrr24s6Cxt7CopaevsZuhpKClpaCXnK+moZ6jqK+hn6GUpaWiuLChprGrn6yjr5icqqWonpeanqWUm52bnqismp2fppeXmJaejpOXoqiikImLj4Z6hH6Ei3qPl4mNhniBhoOHi42FjZOYjY6WmYqPl36Gl42PeYF6cHJ3cHB0X3l3ZGtramdmgmxlcmprZGdXYHJ/XllrdWlYRX5eWlhPT0tISFJVRzI5Xl5tUERXVVllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEhCZltIVENUXWhFLjoxXVEsMpeko5iWnauepqGjobiqsKG7uKWsvcOyr66itbCsra+1xcS9s766t7Czubi6uLqurb+ztbivv8G4q726tKWis6upq7StrrOknsO2p6q4t6ygs7yqp6Wor6uZoqecpKaUmKGypZmepKmpnKGflKagpLmopKetpp6loaiToKmhoaCZm56hk5ydl6GjrJycm6OWk5aWnI6Uk6OnpJCJio6GeYR8hYZ9nY2JioZ4gISHh4iRhZSTkoyQlZSNjpR7g5eQi3d/fG11c21tdGJ4dGhmaWZjbYNmZ2hkZmdoXWRhaGVaZXpiYFBzVFtbU0tKSElPU0AgKmleakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU8/ListNy0xMTk1LCYuNS04MDU3NmBzQjNDRGhbS1dHVWBoQjM3N2BMJzKfpKWTj6annJ+enqS2raiqurenrMPAtq+soraup6+vt8DAvLHBt7Gusra1ubi1rKq8s6+ysb2/t668vLCln7aspqe1qquvoaHFrKqosrWsrbS6naepq7Gll52qn6elkpmlraKYnaSqoZuhnJihnqe3pbCrraGhnp2hlaGmn6KgmZyanJSbnpWmn66jmZiflpWPlZmMj5iap6CQh4qKiHiFd4KCgp2HioKIe3+FiIWFkISWlY+PkJGQkY2Se4OVj4Vzf35neXBsa2xndXNrYWZjYXN+YWRlZmRoaGJlblldWFxsY2FMZ1daYFZJR0lLTVJYPjlgbGlIQlVTXFpJR0ZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLC9BKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BhRSU1naWhkoyvoZqZoJeltLKjsr63obHFu7mwsaO3q6uuqbm9vLutwLKur662r7O5sqerubCvrrS2u7avub6tpp61q6ChsqarsKCmxaGzprCysbettJ2rrqyuopmdqKumn5Wbp6agmaWjqZ2an5uVnZ2tsaW6qK6ioZqbnpmfpJqlnZefmJyWmqGUqpetqpyVnp2UjZWajpWUmKenjYyKiY57gXSCgouYhYZ8iIiEhYqMiJKFlJyTkpCQkZePkH+BjY6Db4J/Z3luaWxqZ3Fya1poY2Fxf2BkZ2ptamRoZWNsXGxsdXFiU2JpY2VaSUdMTU9ZUVBVYWWBVEBWUlpURkdGRUAvPD03PzY8RU1hODo/MjQ5QDM3ODE4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpMaltNW0tYZGNAQTFHYEEnNJSjnY+Psp2claGbqbOwn7jAtqC0wbu9ubGmtrCprqW4ube3rbuwraurt6q1ua2ks7Wxr6mxtraxs7a7p6mgtqqen6ujqq6drMSZr6ewsri1rKuesK2vqqKbnaStqZuVnaeknZqqo6WWmqCckpyjrKupu56mpKCXmpqdoY9ro5aZnXGDmJ2lgHaSrKmel5iik4qYmYCXip+OeIWSjYJsaX53hHFshoqGfYSLhm9dZGFnhJiGbIuQlJJ1eIuEf4OQf2aIgWh2amZYXGl0bk1PaWJlcINlXWRmbmpnXFtciZCEiGhPS0Q4RlRnXkpIUVBVVktIUmFwdGVGW1FVUEVHRkM+MTs9Nj02PDRmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI4NliBbDE1T2tcTltLW2ZiPkcxTl87Ky6PpJuIlrKbnZShnKqurKO9xa+pt8K4vrytp7expqukuLSys7G5rqmnrLSmsbWip7i2tainrbazrrSutKKqn7SrnqOmnaepnLC/laiosbW5ra2kqKyqq6Whn5yhqKibmKKmppycp6idk56fmZCfqKuktbCjoqOclpiZl6OIoY+SmoehiJWfooClgKitn5WUnpSJhHJ4jY6DiKB1h4xplohmfnN4oG+Hh4R+jHx/oaCgmYB8h590iI52m4prh4KDbmllZHttcmJUhm1kbWmYcVhpb22GVl1oWmtpWYdwa3lyh2iHhFleRk4+Rl5NRlNWVlFQUldUZ15NWkxSUlBFRkc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOi8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW09bTFtnXz1LMVRdNy8ojqeYhJ6tnZqZnZ+rqqiqvsOusrm8t8G/qqS3saqsprO1r6+zt6uppbKtpba0m6y1trWlpqmzsq2yqK+eqqGyqaCkpZyipZ6xuJWmqKi3vqatpqmprKeloZ+Zoaikmpmno6SYnKWql5SinJSTpKanobelo5+jmJWTmJSdiK6QmJWKqoyZpJ2GsYGlr6CVm6GXeoLUqICHlMCbxnh3saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7F5aWxYsa5vZmq8k7xuZ3ltcY7YfVJqYrayfH5wlXWaoaqQVk5XYU9WTUZWXFhQUFOLXFdbUEFcRFBOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJBRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01dZ1w+TDFZWjQxIY+nlIGoqp+YnZ6lrbKqsMK9srXAtbe/wqumtK6tqaivtKqwtrSoqKa2pqi5r5yysraqpaSnsq+usaernqelsqWioqCYnKKhsq+Wn6ShtbqjqqigrK2koZ2bmqOpoJibqaCfl56oqJGdp5uUnqKno6Gwo56fo5aWk5iSmYWva2qMjqp/aIWWh61mcqCflpupl3GuoaR/d7p8a6CPdrFfarRbpYBlnJBgZoF6Zn9peGuqZb5zZ6aMdrFqfLF4dZKUY21tp25chKBFaWeIlkV1nF99ZnujpoFYXoqrZ3yMd3tqqDhKr1tYVGxjWktPWWBcVlY7TohQV1YwSVNTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMvLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk41XVczMRuSo5aDraeln6Olq7K4rbS9vrC3xbK4usOnqbCssKmqsa+ksbuxpaWvs6Oquamds7Oxo6Sgqq2wrK+nqKCjo7GcpJ6ZlpmdnrCpmJyjoLWzoauaoaysn52al6CjqZ2ZnqWgnJmhp6SQnaKbl6GgrJ+mpqCan6GVlJGXkZuGtZu1eYepmraZeIe0m7d/lZiYrJd/a4Gme4GFhpGUknerZ2qxW6x7joeUdIlwjoaBf4iRl3iDg4uXjIOgj4WwdnefcmtrbXyLT6VYSGRkmX5jaKZfeHF0UpKGXU+pbWJveoWAYZ0vU6JuW1RrZ2BMS11kWFxaQj6wd1dYQSNNaUVCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0UsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdLOWBUNTAcl6CVibSnp6GtqaizrKq7t8KwvMKtubbCq62tr6+or7OqorC8q6Kotq2jrLWkpbO0qKOinaiqsqiwqKafoKCwl6CblpaXm6GxpZybpam2r6GojqmnqZudlpigpqmbn52koJygo6WjlpuemJqeo6ucppqcmqKglpORk5OdhNWTmblxscJ/xod91pScu32cl6iSj52NpHuNhqGApYJ5q3mPnVave4l+n2q5Wrl3h4R9poOUfJl7qXmOnZB7sW2OhHWQvIZvlVCvp8WKUaB6Y2CqYXNyhmuWh15StbTIhX6JfGOkNEOddV1RaWhkUEBYZ1ljYUpITWpKWlNPWWZaQ0Q/RT8wPDw1OTs3NDw8OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLjAwNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3SDphUDcyJZyjk5myqKmls6qltaikvLjBsLrAsre0vbS2p7KxpLK0p6Cvtqmbqbuuo7GyobK0saGknp6oqbCptKmmnZ6frJiZmZiYlpijrqCcl6musamjno6soqeVnZeboaehmKKio6GboqKonJ6gnpWZm6ehnKeUm5qfoZiQkpWQnYiybmi1cqyIcI+ncrR2dLZ7nJqmjpCdjaN+j56jfbB1gpDS0nVcrnyFf6Rum6qma4eFfa19mJmQe7Fzk52PebNllnSFnm6fZpRSyYtawlyfeWJfrV92c4RhlohdWcqdb79+ck1LtVNVxmRVUWpjZVhBT2tfbGhQVUZIOT1XUltXWEhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk1UX2VQNUc9YU02Mi6jnpGmsK2lqbutprSlp7a7vLO7vri4tby8tKa1taOzsqOgrLClmKi7rqWysZy0uKqgpZ2hqqWyqKyqpZqdm6mflpaZmZOUpauimJSnq7GmoZWSrJ+lkpShnKWnoJWbpqeim6Ogrpqgnp2Qlpujn5yllJ2VmaOelZmWkpuFrHx4qHejj4uHqnCtjIWohJqbo4uTm4uifpGXh66Ef4GzXHKyU699goKjfnHXfXeFfo+eh5mad6+GipGciHe0YZplm4GBlWySW7BXS5p1mHlmYa1ednaFZpeIal2vdpWej3drNXnIrrNgRFVvXWdgRVBsX3BtVlVNLmVjaFJZUTtBQ0BMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwNDc2Nz1Qa2U+JlZnXEA8VV9jTjZHQmBJOjc3oJ2UobexmbPBraiyp6qzure1ub66uLO3vramuLWhtq6goKmsn5WptqupsrKrrbSkm6mgoKiitaemqqSZnpWloZSUnZqSlqWonJSRqK2wpaCUmaieoo+RopqppaGVmqapnp2kn62coJ2fjZSenJ+hmZiblZaioJSYkaedh6l+f6Z5oY+QhKpwrY2Dp4aXoaOLmJeIo4GQhpSqen+LnXlwsVqog4KIoHh02H92h3Sogo+bjZKkfJaQn4R7sl6cZKB9gpVuk12rXFuTf5F/aGeqY3J6gGqYhnFdq1qJoI9rbWRPSkOhXFtNdF1iZk1aYV9ydGBKVTVKmpFYSEU9R0VBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MTAyMTU0KyowNS83LCYyMSgkJTY2NzE8T2VkQSZVZls/MFRfYkw3RkhfQzE9N6Kdmpq/rZizwq6rrKintbG4sbW+uruzsrm8qru2obKln6aoqJ+TrLGpsKu3raqvoZiioKalpLmjo6yhl5ySo6CWlZ+blZmioZGOjKqwsKadlpqnpp+MkqSYp6uolpipqJ+goaSuo6CeoY6VoZmgoJKcl5uVnqGWlo+snI+ubnK0dKmMd4umdLR6dbSClKeklJ2NiaSHjnW4b4t7i6Jra7ZaoYZll5dooKKnbZRytHSTmX+zaoaSiK1qdbRhnWaib4aSa5hdrWBOoXyHkVJzo2x5fn1umIZvXK9WPJx3ZVRvbi5bp09jUmtlYmxaYlxgcXxjU1lRPj9sbzJCQkA+TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi5VXmJMNUZNXjgxQTilmpyeuqSbscCuraurqLequK+1wLW9srG7uKzCt6qsoZ2npKKdkqyrqLaktKiuqqGXnaigpau4naOtnJaZkKajl46eoZyZn6CRlJWstrCmmJObrKmWjJSmmaWto5KXq7OkoJ6orLCYoaKQmaGXoJuWm5eglJ2pnZSQq5mH1JSau3WxxIDEh37Wl5y4eYqSmY6Yioynh3mitnV9d3bBg5qyYYO6ecB8dbhitYGMh6l9lYKsqXF7f3W8iKegaZ1hpo6von6NdYerfb5uc7x0soN1eICJbZqIcG2NpHS9XXd9W2F5vGpaVlxqel5pYWNmYm55b1hbWUNBQHE/Q0crNEgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvU11gSzU8TFstNj85p5qforyjl7DDr62pq62xqLmvt8Sxu7OvvLCuwrKtpqOfpaKdnJGrpaqzpbWnraSglpqrmaesuJ2jrpiVoZGmoJOOnaOemZ+akJaTsLmxq5WWo6enlJCWpZ2krZ+RoaisoJyfqaSynaKkjqahlaGZm5aVo5mQsKCSlaqehZCZtoCSko24lnmDk5u2d25sb3RveY+EjolynsC7vJp7gbKocIF0kbmDfIaGi4aNe4qHjJd9pLu5vZx1ebOjdHWXdXSwdZmeZodqjbZ0c3F3totegHl8iGeDeWx6YouscHSFfldbp2lEZFpUZl9jXWJQZ2ZxbnVCTU9MRDtaTD5KMjswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppWywrOsqqitq6q7r7DGr7W0sLintbmuq6Sip5+gnZmUraWuq6e2qKifnJahpJ6spL2noaqXlZyRopuSkKKoopSfl5KYlLK1tqyXnaOjoouSkqabpauclqmlppyboaqmpqKooZGsnpeinpeWl52ej7CplJynoo9rf2qdqnqJdH+cj3Z7Zoh7vb7Aum+Sg3GUhV9yalpem4phY4ePlmxgf5VjbZx2YpVsgJmVlGZeYGNxm4locox8hpRman5xdHh/fmNceHWBaFBcboR8fIpqWGx6gnFISm+FcE5xTURWXGZhTFtXZmNeT1ttdWtyUk9ERE08SEg8TD8xLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1Q0ZURUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSXkknU19WNClQXkwoMz5cTyc/Mj6on6miwaSas7m2o6ymr6aotrKsyKywtK22pL6ys6ehpKqdo5yamqynrqSltqqlm5iWopynram+qKmllZSblqCak5mmqaiSn5CPmJywsr6rmqadp6KJk5Gpm6iknJysoKOam6OnrKKfqaGZrpuUpqCWlJ2fnZexpZmiqJmdkp+dpaabqKSbnpucm5KXgmhvfnF3kZeUkISJtKqNhZiVj4qMmZeIlJWJg5OTkYmOkpSYlJmXmp+hmpuUn5uNgXqkhWtqfJF9gXWKi4Nygnd5dnaLf3yJanOBdIR0Y3Z9dmtveGxfYltvZ01YWWZqX1dZb3pvbmZTT0ZSOVBaTlJPJyo7S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDUkdLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tJJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Cxt6CqprOnpbC1qsirrbOntqbBqLWhn6WmnKWWlaGsp62kpLesoJmXlqGYraqlwZ+spJaSnJefmJSVo56do6iTkJioqLLCr5mqnKqej5WWqZ6qnJ6hrZmhm52ipa+moaOnnqyYlqWdmZqhnp6dsKGdoqeWmZSZlKKkmKSgmaKPmJWMi46QmK6QfJWcgpGBiamohYCYl4uEj6CIe4SRhYWakYeGipWPm5eOkZieo5aZkpCcjX6NZaGzroWKhHd7kIt+eHl6b2Z5kYGBiGt1gXmJcWhzf3l1g4aAanNid2VfaGVjZGZqWWt7cWpqXFJLUERfVUZAPj4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLKfua++rautsbKgqqayraOss7DFsKuupLOvvKW1nKGoo6GemZepp6qmpaaztp+VlZ6amrCmrr6hrKKRkZ6ampSSlqGbl6mdhJ2pq6O0x7OfqaOqlpWXmqeeqJygpKyUn5+dn6quqKSiqqGrmp6foJiln5yenbCkmZ+plJqZnpKmnJqqn5yYZoWUfWV/j5uQY3qNbWhqepCjq2plmph+Z4WLZWVpaHqNoo5raIyYkaJ3a2qLmaOfmHNsbXqEjIZ5WGVdhoJebIuLg3dcaHR3d5KAh4FveIJ4gHJteIRzdoiHjoN6aIRYXWp0ZF1ziGhqfHFtY11RTVdKZFhASTM9Rjg/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXV9eWlRPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0JJW0ouNlpPNilFWS9ETzFZQjs/Lj2knrq8ua+rsrCrpaitr7Gnrq6wvbGqqaWusLGgrZehpJ6impqmrJ2tpKaoqrSunpakkKOwpre5pa6jj4+aopqTkpugmJimlnukq6KotMO3pKGmrp6dlJ6jn6OdpKqpk5+gnqCqr6mpoqmeppulnqegrJehm6WxpZidrJajn5uTp5mgrJqff72EinS0c4Wfhq1od7nEuHGSoaN6ppmZdKuCfcvAwLpxi6OHg559lpiInsC9gpadnY2cwcF8gXqRjJrCwH1qpbJwjoJvynqAm3iSg46Ad3mBgHlwe3+GcHiEipJ4bHWRYWVeeGRfZYFiXXRobWRiWExVSVFZSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX2BhX15eXl5fX19eXFNNUEdVTkE/Pz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SVtMKiNDUC8jRlszUFkvVUFCOy84laG5w7Svr7+pqZSjsKqwr66msrWvqqenprGroKuYm6OgnJuqp6OerKOlqaWltKSeo5Smrqy4tKevopKRmZ2mk5GgoZeboJ6Ipqukq62/v7CgqK6olpGfnaKZoqSqpJShoZ2drK6oqqWioqSfo6ScramSpJqorqqcnqudrqOXmKeYo6SZnn/OlHp7pYJ6lpebX62PXY6ogKGhfKeVm3Wrg4GvXmSMqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3R8loe4YYKtWaPNbpF2e9t7f5lxfoiSdn9le4h1dmt9h219hI6QfmuAjF5wanBnYF94ZFtxaGpjZWBSVFNXXkpPQzRBSEVEOD41O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcX19fXl1dX2BgX15eW1dPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMazBwMC0tLC3mJ6RpKqprbWrprKsrKylraawqqGnnJqmmJyir5+hn6ino6ahn7GsnJ+Vpq6tsauorKCUkpufpZOQn6WXnaiknq2jqrCov8Wyp6mxrZaSnpyil6Gqqp+VoZ6dnK2upqmnm6aloqCqkqyzlqWiq6qepKino7Kik5upnKKclpWRl6FyhoyYdoaoh3GwfJ1xrH2goIKlj554q4J+rX+dcq1/rIeGn3aYknt8l3+qiKKMkYycfat6iJOPn396rVacxHuQcJPBfYGVbXVwjG1md2WHbmF4bnJuh4mPjoJsjo1jbnN1b2BmbWRfb2lqbmZjWFNcYFpSUkM4SUhAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPSg+MSkzVkBGIRxHO0MxLiuv08bHsrOgnaOPo6Oirq+3r6mxp6iqqa6rrKeipJ2ao5WfpqugoqagqKijn56wrJiblqinr62op6mel5WapKKSlKGump2no66soqy1qbnMsaymrauWlJydopmfrqydlqGZnp6psaeoqJqqpqOhqpqusaKoq6+mmqesq6uzpJOZpaeclpOFpGukdYp6qXV7snGCpYqYi3GIoJuHpF9hUquFgK6DnHWugqiGhp96mZeGe2aAo4qkmIaCo32pf4GUhq5ee6hVnaKSgnujn4B8xLDFjHOvtLO5cmKpr8J0aIuLlY2Aa5aPbWx4d3dua2ZlZHFxZnxpY11WX2lYWFRMTFBMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5hYWBfXl1cXVtTSUI2Nzk6NjY0LCYkIiAnJyErLSIkLiEzLSZARFdILEcrNjYqMVBLTCMgQTlENCwnwcnW1sCgmauooa+in7G0sK+prKOnp6urq6mlpqCbpZ+dpqempJ2smqKsoaSgr6Oem5OqpLWwr6Gpm5yWlaekkZuiqJ+fppywpaKosay2x7G0qauplZGdnaGZoKWznZqhlJyep6qqoqyZqqagoamhsq2hqbKyoZyrqrGwuKaUmKaqmp2Tfaptn4SIdqt5fLBugqSLiJ+WlZ6WgdK4tLjJgYKyX2CUqYOliIegepiWmnmqyXSao5SoqZCSmox+momaxsZ3ZaGCpXSCoI6Cfa9fb7VjsXVLo4dtp0eDk2SNj5yQem6UjnxueXR8em1bZmpycWeBaV5hV2NtXF5ZSUxMSkVEQkI9QTxBP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX2BeXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMS89LTRPVFEdHDs8RjIsJKekwMe5ramyrq2lo5yzuayroaWbqKarrKmmoKalmKujn6+snaahrZqfqaWdp7WgpJiUqKu2s6ycppyglpCmrZKanKejoKqmraCjp6mws8Gxsqmsp5OJl52lm6Kkr6aXopWYnKWlqZmtnKulpJ2ro7aroLG4sJ6csKi1tbanlpmqppyhkIOeTneagoCfe4SjfIKkg4amn5yflIS4fH16uYOAzcbDtnibopKLn36Zl5eKdp+XiqSYpKh+r4Wcg56DrH2ZlGGlbKNxkIWQgX2WhHKsYKRzcYCaYbx9UlV1jZGhlHp7j42GcnlzhX9wW2xud3NqgW5aZF5nbmJkXUtLUVNBR0dGSDo6Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtTHBs2P0csLSCLh5mpq6SruauvoJyhrbO0pp+hlaWvrq6pp56lpZqkp6GzrqKpp7OgmqmklKO1o6OWl6Gptbmkm6Odo5OQorKZnpumpaCir6ycpKiitbHDsK2prKmRh5Ccp52jpJyll56YmJmlo6iYrKGroqSXrqS6rKG2tq6enra0urO2qZqgsqSmoIiQ0rXDt3qHjoaRk4+ApneUoneMoZKFpYOMcquIhrRuc2qapJ2Wip99l5mHh5BzroKlm6ONpoqTnYiUkJptcLJcpXOTepxsmX97mX5uqWGicnN+n2Jzsrhod46So5Z7iYmOh3V7eI6CbGh3aHhzboB0XWRjbW1maGBKWVdXPEdGP1MzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlVRT1FbVSUhMkFIIyolknKNiq2/v7y7tZ6XqKSutqKimZWjqqiuqauZpaKfpqCgtaaiqaexpJSro4+kraSekZqaqrS0pJ2lnKmSlJevoKCepqOcp5yzmaCqo7Wqwq+oqqihjIOPnaKhpqOVmpqcmJqYpqOll6mmq6Cjm6ymvKyUvbCtn6Oxtbutt6meq7Wnq5p8qJJ9fLB4i4CkpYicbbFvoIetfKKPg6iXmoKsioathqGVqKGjmIafgZmWgXuSfquBnZmWi6t3naCPiJOSf3qvXaOBfaanZZ6AfJd1aq5dpWxyhpldYFuMoG2Uj6OWgJGJkoh4eYGXf2psfmJ9dG2AeWBoZW9vaGdoQlhfWj1KUzJTOEFBQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWldTUE9OSTgxNTIuKixBVFZWVlVUVVVVVVRUVVRTU1ZXV1hWVVVRSEZJSiMoKLySmoSpxsO3wbSfm62grrmmo46ao6Sgr66pn6Oena2Ynrmgo6uhsKqarqGRqqmll4qakK2xraegqJutmJmPraKhnaWhmaScrZefqKW2qL6upKmjn4t/jpuaoKaekpSZmpOamaSjopinqqqgop6np7ykl8Ksq6OirbS7rbCpo7ayrK6ad69/kIqchYd8uq2JmGSwjGSWrn2hkISnl5yCrYyFsIeomqSio5KFoFxsa4KzYH+tfHuCgbJsZ26Zl4uHsVp9tVykg2vIomafgXu7WXa1WrJ9U6+BeqxYgKFtlo2lmIeUjZGSeXeMnH1jc3xig3d0gHxhamZvbmZlZk9UYltBU109SCg+OT00ISEsJB8xLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gX2BhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXV1hXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt767tMKzo5ytp6W3qaCLmaCfnbKxqJ6in521mKCzqKqrnrCtnqycla+po46Jm46urKmno6iarpOaj6maoZ2kn5mjoqWYnqKosai7rqSonp2OfIublqGgmZCSmpuRmZeonp+Xp6yko6Sio6i6np/Gp6apoay2t66xqqG/sbCwmIKqk6OujpuAhqSXmJCAgLjDuoSPnZSFqJmeg6yMhK+KqZ2bpquSf9W9wqpipL+9fX+jgoPXu7i1hJSSgp69voRro4Jwq4RvnYB6srHHg2ursb2seXiivrt0gJSMo5mMmI2SmXd/j5l5Ynx5ZIxmeIF7YGtlampiUGJbUmlcP1NgQkwpPDo0Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLLAurK+s6Kdrqels6edjJelv6m2r6ehv6amsZuesZy5qJ+ur6WnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6adppuaoKiimJ2grKypuK2no5qXknuHmZGnm5OPkJeYj5iTqZielqinnqimoKGqup2oxaOhsKSstLWssqyjv6uzsp11dqqktoVliZ9wZ6yQio9ubnelkJuhgnaynJhxkY5yl6ukm5mvpXJtbW1mi3hvbYOacYF6anFpZ4mWlZdyaWmFh2dxh2Rei2NqcFpdZ354pmBicpCScGZkgIyRjp+UlJaNkpp6hI2TdGSGd2eManh+eWRsY2VsYkpkV0lqWTlPY0RPJ0o5KyMcIBsiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXW1xgYGFdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurqys6upoq6fo7OqmJK9scPHvLSpnr+rrKOgp6uguqOkrqytpo6WraqQjIWVlq2fpquin6SkoJKLpZKmmamalqKpoJWcpaWmrrmqq5mak5J7hJeNppeNkZCXlI6XlaaTnZamoZmupZyhq7iesMGopbSnrbGzrLCuqrynsryYjKOppbWciZaimIepm4+UnZKqtJqcpK6itZmlpKCjpJ+kpqKWrKeNk5ONh5OdnZWQmZOYkY+VhX+kmpeWjoyUk4qQiIV/aIyBdYN3dYeMcadtfZaTlJSBgY+Pjo6bkJ2Sk5Kdf4WTjHBoj3ZviXd1fHlpa2Vjb2NVYVg/aFpHYl9OVytFPSsmITY0MC4fHCAlMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVFZZXmBhYl1eVVBLRUM+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW4rq+isKWuoKC3sZCOqsS8w7m2qaGknZulnbCopLennam1p6iRmKyjjIiKj5ynlq2koZqonp+TlqSXqJqomZOloKOPmqeYoLS5p6qYmpCNe4GVi6GUipWRlZCPkpekjp2Yp56as6Kcpaq2p67Br6S4p7Cwsq+srba+pLPBmpOnpaa0opKdpp6OqaCMkp+irbGboqWzq7OapqOfp6ygoJ6emK2ek5qinJSQl6uZjZmal5CXn5GHoJ2VlIaUjZCOlo2Cf2aOiHaId3qIhHScaoiSlpWSiX2MlpGSlpCdjpiSnYGFl4Z6cZRyeYl/cXt+am5kXnBpYFxfWGxiT19jT1g5RkZEPTI8PTcuKiUrKSYdJjQxNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYWlhZVVQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJakqKOwtKyvo6qnrqCntaqRj5ujsrmtqquhopl6nKGwpKaxqZecuKajlJipnI6GiomcopCvn6SWqaChk5eZnK6LqpaOp5injJiojp24taOll5uNiXmCk4ybk4qVkZOQjpGWoYucnaacnbaifoOutKKwr3Wkv6SzoHl7o621wJh4sKahioCqfmRcYnafj6Seg5Z+bZS1naWpsa2mZqCilXV7nJlxgZmqmW2ApKmKZZylnJGYmZeMk5yRhZ2bkJWElIiPj5OLhnlskYh2iHJ8hoGBYWmJjJWTjFt2lZBmaI6LcXiflZRkd5eGgXeXaIKJgm55f2twZWB2b2traFtkY2FhbVFZPU1NTVJGPT9TQjkwLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXV9nZ2dXUUk8REg8OVZSW2BhYmBeX19gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6qmqa6jp62lkpWqtK6wpZmppaqWc4ucr6Coq6eUl7mgoI+cpJ6RfoiJmp6NrJqklaiino6Xkp6Fda6PiKWZqJGWo4iauLOnn5iYi4l0d5KNl5OJk5CQk4yPkp+MmZ6kmJuwlICMm7WdtIySj72non6no3ulsruEjpCpoISMhY+xqq+MiZajmnmAi6yGnZ+jqauqiZaIm3elnHuInIGYp4SCe56ze4qGoJiZlZiXgZGXloSammJ5iJKFjpCTi4RucpGIeoJygYGGgId0iIaXk3iWaJN0oJp0e5mBm5iEmH6QiYGCl2mMjIRqeHtxcGdleG1pbGpbY2loZHFaW0hTS1BARTUtWVNUNikhMDk9Pjc0MzU2ODs6PT4+P0RJQElFSktHU1hbWFthYWlmWVFIOUVMPD9iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKSgpq6uq6itoKmxpqeqpZmTrMS8r6CUpaeznI+Dnaydp6KgjZC+npmNn5qhkX2GjpiXiKydo5ahoZKNlImGgJGojoahnKOTlp2FnrixqJ2ako+FcHWQiZWQipOPjpuLjpGdkJWeopSdqoaftIm0mq6Lyoirr4q3hY2whLOzh6mPqpqNnXuoj3J7d5yOppZolaR5tIyhoKiqlJrCgoGriZmhcp6Am6V+l4aWsoGhfaGTn4+YmICPlJuJmZKLfYaUh42WlIqFbnSThoB7c4eChH2FdYaDmIKPxWaAqYePommdgZ2WgJmAiouDiJhvjZKEZ3d0fHdnaXZwZ2hrXmJubGZqV2RGXFFMMkU0Nk1gYzcmMzxFR0Q6NjM2NTg7OD49PT5CTD9OSUpMQ1FaXVxXYl5qbFtRRT1LTUBKZFhdY2ZoZ2JiYmJjY19fYmFiY2NjZGlpY2JiYmVjYWZjYmJplZeioLCpqaimrKClubGpq6aalJ6hpKmhlKOotaGvf6CnnaWenYmUvZqTjaCSnZB5g5aWkYirmZybmqKFj4x3m5yOoJGHnaOblpiXhaG4raWZm4yMfmJtj4uTj4yPjIyXi4+Rno2Snp+XoKZ9oaeHrZ2glq6QoJ6dkYeCoY2us4mkj6ycjJp9onWAmZRrgqt1Tat4h42dk5yqqYKqq3+Fonx7p2qegJNsZ5eGmLeJnn5uYGNYg5h/jXxkZ4xzmX56mGxdfZhvYVRyh11gbXqEYFllgn6FgZlyqKprg6NucqVvn4GaZ2SebFpsiXtlWV+CfmFXUHB2ZW90cWpqb11pb2xqZ1dmTVxXRThBNEZDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJLTUJKXF1fV15eY3VfTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiXnaG5oaqkpqySora8qq6imZaeoKWrq5+crbShp5GgoKGnnJmOmLSZkIuejJWLdYGUkY2KppaWmJ6ffpOFhqykh5yRipiol5makYekr6ailZmHiYBpboiIi46NiYqNkYuPkaGKkpyemqGjf5OBj6OhlKB3nJaQp4OjqYCHrLGIpXqNf4SafKJwcpOHlXuejHlth5uLmpKdqpyPh51+hKJ0d6Znnn53pV+Ye32Tc6JumLe0unSTiIKAtqhkgcW5fHGVtoxygZukZHWsq2F+ap2zfm5+iYSPg4yYcYCja3Kjcp6BfKNenJmzlXB8l56zdHJbnrKDamJxdHVxaG9YamtxcGRbZ1xhS0M9RDZRQVlxMjxTR19KUj08Mzk1Ojk2Qzw7QElQP1ROTlFARV9eW1lXYGB7ZElDN0xXVVZjYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWkuZmrnJOgjqW4taytoJqhm6KjpKyamrGsq5OYoZmhpZqalJ6sm4uJkXiLhXGAlYyJkKGQk5Sdl32Rio6ooIeYjomRopObmoyKqKekno+Wh4R+anqGfn2PjYOKj5CJjpOfgZScnpufnouJd5yYoo2gcqGMiamJnaiSmauugq6NfnqgmXmjk3iAc5eHjJx9lJ6Gm46anaiIo2ShfoyXkJuNbZ5om45vmpl7gIqnfXJodKuDnoNzqmeUml2bhXeFnmiqaoC5ZlypcIGcYZWMX6d2d4qLgJ1omnWHk5KYjX2ebJiPaqaZXKh+d7tqfalajoRds2dbbnJ4d2tpW3Bpd3dhXmRWYUFQRE43VUJRbTRKWlpeTlpEQDE1MTw7N0g/OkNIVT9ZU1hdPkRiXVZgUWFkfGlGQjlOW11ZZWZYZmZubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplp2JqracqIljlZysu7Gvq52lm5qnn52smZ2wp6uel6OaoqCZlpagpJmGiY1piIByepaIi5aWhJKUmI96i4SWpJyJlY+Gip2SnJuIj6iin5qLkIqAgGmAhXl/lot6iI2Oh46VmX2SoZ2foZKXcmifiqCPjHCSjYKpiZqhpaqjq3+wrqSiuJd2o7Oio3+IlHideqmYf6KPn52ZiZhyoH2IjrC1fWyakaF4fpm1o6OrqISZfJt9nJt/dKpaXW97l4x5nmNNf3t7hmV6mEJNn1mianN9j2+CioSZdpt5h4mxs399mZKmc32dbXB8lG+ZcmmjXZV2SGVjX3RxfH1uZV9rZ3V6YmNfUF1XXFNWQFlFUGdEUlZcYVheSUQ9Qjg/QjpJRTdMRVhBV1JbVkVGYlxaYEtgbX1xRUM8Vl5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWN2bF5lZ2ZsZGVsaGlsaZSegbCumoRTX6GntLqysqiaoouaqZubp5Kgq6OgqI+enp2amZWYoJ2Wh4eJd4WBbniUhI+bi32Rk5aIcoGJkqGbcpKQgIiYlJ+ahI6onJqVioqKfINshIVxgqGLd4SMiIeRmJR6kaKfnaKHrYZ9tYSPnp17ppZ6qYKXn5GMpKGAp2l4bn6Zc6BzcXydhZhvk4Kse6OEp5+bg6RwX6lodqNkcKZhnNOPfHuZeHJzY6KGkX6icqOQdmuQs4xgg5iLdauzqLx/d4Rvf7+mqrRenG9/cpdwgnSjcl6kZ3SmYGima5rTmHmBmm52eZdrm3l2l3JsqaVnX2V5cX+EbGhmY211dmZfYVFaZVBRYUhWSVRfV1NbZWpbZVBFQ0tMSUtCS0U4UEBRTlhTWE9TUWBlZGlTZHh5d0pHRWRdZVpoaVNpaGpuY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGdobWiYm3+wrFRdS36qr7G0sLKinJiEl6agoKKMpKefl6mKmZiZlJqTkqCYjoeFe3B9g2h8j4KTmoF3kY6PinCAho+TkWuYk3yIkZKjlYKNqJmTkoqFiXmDdoiAboGfhnd/kYWGl6CVeJGgopmfiLOhoraLeqynpK6lcamAm5GGgp+VfqWBo5uGmHGehKKtr4qXi3+MpI2Vg6+jlXe1trbKonSUjYOfYJ2XqW15loegm3Whh3egfpGXi4FvTWajk3GbiXSle3p1YoSDbn6gbXJkYJxzf3SYa3tqtLa0xqZzmH15nGqamatzgJpsc3eXaZl5dJhxUER9s15pdmt4hmZrZmJzdG9sVVtSWWhPUWdJVUxYUlVcZ2tuVWdXTUpBSU1LSEpOQVFKUGVjam1ldXNzf3l7bnSJentVUU5tXmhba2lSamhpbGdtZmNlX1xcXF9pYmRoa3tfXWRnY2pmbmxlaW1lop2Ir6eFZUCUorKrr6+1oaKPf5anoaGji6SmnZymgpmXl46XkJCbk46Ig3lreYZlg4x/l6B5dY+IjIJqhYWShIuFnY16jIqVpZKCl6iWjJGLgIh6gH2LeXCPoIV5gJSGiJWelH6SpKablZaEZm54nGyiZHxypXicmHBop4Oajn2le6KXg5Zyn3aBiZSWj7lukIqiYn2ao5eJbnRrq2t1oG5wp2GbaouQaZaHm5V1ooF+mmCLho11b4hiaKFmnn9qm3VxZWeJgm9zoltfW2Shbl6JjXF8gHRyZKVueKJjZqdnl3GKl22hb1KIj26gXmSnVItdVJhtbXNrcYFtcGhrd3NqblFWVVVlWFJsSVhPW0hXaGhzallrVlBSRVZcTFhSYVVoal53dXt8cH18coN7f3N3jYCDd15Rc2FnYnBnUGtoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52mmaZ7ZXRtjKeupamwsaWfi3+VqZydo4uhoZqiooCVmZOOmpCLl5GOinuGcYCIaIqKfJebc3WJfZB8ZYOHlYqJlZqCfIiGlqaQgKGqj4SQioGJfYCAjnNpj6aDfYWSjIeXn42GkailnIimeJWbfqWJloyymZ6RhK+Xn6V6mIl7qXWokYSabqWijJKEjIO8bXylr4KHhYeVmJ6jfqZ8c6iVoZZpn39wrGOWipaTeKhtqqOBiXaJg3erkaaIa5KxbHezjalsi4Zvb6CekpVif6uMqniBgI6nn3effYWklp2gZ5mGdKtmnq2MtnN2voykk1mDpo2rYXZydG97dXBian5uZ2xSVFhUYGBcakxcUVtIXWxtdl9bcVhbX1pnc2Vub3FjcXRgd3p+eXJ5g3OEfoF7e4yBgoB2YnlkY25zZFJsZ2dvbXJpZmlhX15cYWpibGx6b1xcYmlibWl3bWdsb2KWpqqdgYCfpZaqqp6np62jmIiBlqmZnaKJmqScqJ2EjJqPhpyRhZKNjIx0hXqIg2+MhH6Xk3R1hnKRg25/i5KGhZSPfHuBhZekjX+kpI2AjYmElHWCh5NubIuogIKKk42Im52IipKpop+Pf3STl4h+gXmUr6R/gp1xj4Z5k46GgXtzqY1xfX16l5abhY54e319hpOVk4t3kpqho4V8f4ttjYZcenlze3Fpbn6TinKAdIKPlJNxhoSDZo1/X4KBjHh3dJV2cHpvcIluhYZfd2l4jmeCg4aPqpx/dH2WaYmIb311e4J0bGxmjHN4e5d3hFtrV3mPaW53cnJvd3hvXGuFbmlmVlleVlxlamNVYFRdUF5vd3lranZkaWpqdXtwcXRzYW90YnR7gXh1eoJ1f4B/gXmLhYJ+e26AbWR5bl5XbmhodWt4amlqZFxgWmNpZWxxdW5aW2JrZGxreW1obG9gjpS5qaeLoaObpqSZpJ2roZ+Dg5apkZ2fiJmmmqiZg4Gci36WlIeOiomNcoJ8jnx+joR7l450c4RwlYZ8fZKLhoaPhXh+gIaYo4x7pp+KhI+PhJWCho6Yd3GEqoWNkZuOh52dhoqapp+gq4OIjZSbf36Kl62okJOokXlxn5SFfJVwgKyHcX6VcWpwfYGfi3+RjYpnbV2EjI6dnqGRdJeOinN1bIN3dIFZcm+HkYJ+f4xqXWlke4WEiYBgaXl8nHyEjYR3goiFanqNiWxicXODd2B0jYOKkaiWh2eNjoJsdoqBbYKKdm1jZWN5g3qVWlxpZ252W3t5d3Vuc3KDZltsiWtrYllYXFlYa3FbXl9ZXVxlcn16dG90YmpqaXt7cXp2dGRtdGhte351en17eXqAgH9vhomDe31zf3pzf2hUXHJpbHZvdWdsZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMq7GikKOhmp6emJ2ZqKGgfYKWq4yfk4aaopGllX97mIV8kpmJiIeHinF9gIp2hIuBhJaKcm+Ac5iHhH6Tg4OGioJ6gIOKmp+PgaWfhneOl4iVioucl4SDeayBkJeYk4mdnIWHoKmeoaKji4eSm52jmparoqioopOdiZmRfnqRkIaqf3+TkZKTnbKmmpSejoywkZiEp46Olp2ii5KdhYqTi2x9j3d4ZoKGkYt9iZ6EiIyPiIiBhYSReHx7dZykioiMoIyHloCAjoOBd3F1hoWAeYqIi5GnkYSHjoeCi4+KeYOIhYx/dGqBg3x5mWlyaGFzinF+e3d3cHd0gV1dboZobl9eWVpcU2dxVWNbWmBrZ3R7e3Jub2Nqamh+e2x4fnBob29rZoB7coKAd399f4R7bYOMhXx6eXx9eoR5T2R3a3NucHplbGViYmBbc2ZwZnJxbVVdbHRtaHh6cGdpa2WNiJ67n5ejoZiVmZiUmKSgnHp+l6mNnYyFn5yLnpd9eJWDe46ZiYaDhIZteIB/coCHfoiThG1rfnqXh4SDkH6AhoSHfIeCjJqdkoapnYJyio+FkpGLnZF8jXupg42RlpSNm5WFhZqln6KanoaDkpqZmZCZpqCmnp6Ql4KUjXl+ipCGp3x9j5CRhpiqoZ2TnY6NqIyRgJ+OipWcoYSQmYCIj4RweYdydWF/hJCId4yZgYSPgYaFf4aElW56dnWUpIyOh5yGhpB2go1+fnRzfIqFfHqOj4WUqJCHhI+BgomIiHOChYWIeW1qfX97bWhrbGdeeX9nfXt2dXZ1e3dcX3B9bXRgY1pbXlBmbFNkWl1gamh0eX5wbGxja2pngH9rcn9ra3Rud22EeW6GgHaCgH2FdnGCjYd+e3t9gHuCi2BpfGt1aGmDZWpjYGlcY3Vnb2J1bWxUYnF5ZW95enJlam1ti4qfuJqipJ+TkpaXi5qfnpx6d5ukkJuJhqSUi5iaeXqNhnyKkoOMgoKCbXt+d3KAhX2KkH1raH2Bl4mBiI58foWEh3yPgY+bm5CIppt/cIuKi5KGoKGKhYx8qJCHjpGVkZSRd4yjoKGdlpuAgZCamJONmqKipJuYkpx/kIh7goaRiaOBfo2Nj3yYpKCgkpqQj6WLj4GckoqUmZ2AlJR/iI+CdXWCcXdhfoGOiHOKln2JjHGNf4OGh49oeHJ6jpqUkYGZgIqNdISKfn9ze3yNhnx7k46El6aUjIaQe4SFhoNzfoCEhXhkcHp/d3lwbGpmXn1zaHx1dnR8c4BqXmB0d3B3ZGNYXV5SaWdUZFheYGdpdXiBcGZrY2xnZX+Bam19Z21wanx3hnpri4FygYF+gXV2go2Gf3x7gIF9f49qcoRudGliiGlsYl9xVnRvbG1geGhtV2pzdmN0enpxYmtveYmNn7OSpaadjpCYj4WcoZqbfHWino2Xf4yhioiblnh8hoh+hIp+iIKBf3B/enN1goV+iZB3Z2N9hpeKgoqNeH2AjIN5loCVl5WNlZ6ZfW+LgZCThaWbh4yJg6aUhJGJlJWRkHWRnaGhmJSYen+PmJeOlpqdpZ6alJWde5KJhXqImY+gf4KLjoxzmKOeoJKYjo6gi4uDmJiElJebgJqPfYmOgndyfm57ZIB9i4dxh5SAkYJrh4OCgIuGZnZwfYiUmo5/lXmOi36CiX59c4F5i4d7hpKLjJmkl4OEi3aHg4GAc3h/hoJzXnZ3fXJ9dmZsZWB/aWp3c3R1fXF8Y2Rhc291cm1hWV9dWmpjUmJXX19nanR4hnBiamJrZmh8gmtodGhsb2h/fIF5bI+FcYCDg390fIOMgYB+eoKDfnyQbXWJdHRtZopsamJjdVaDaXBuYHhnbGFqdnBmeHt5cV9xbIWFkJ2vmKepno6Nl4eFn5OVl3x2p5uKmHmXnIuMmZB5fIGMfX2De4CCgHhzeHlzfYCDf4iLgGRefYuVh3+FiHR9fol/fpiElpSWjKOgln5xhnuTkYqmj4yOipKgkIKPjpOWkIqAj5egmpKQknOAjpKUiZ2dnqeZmY6Vl3WRkoxtiJqSnHyIiZCJb5idmqKSlYqLnYuGgZOdgJSUl4ibin2KioJ7cXprdm18f4x/boWTg5V4cIKEfn+MgWVzan2CmJiGgY91kouGe4l/d3qCf4iCfoWPh42VpZF5hYJ0iIZ7fnFyfoSAa2B5dHlwe25hbmNle2Jub3ZzeHd0dGF3YG9sdW5wXVpeXV1pXU9cV2JgZ2xyeohqX2lkaWNod4dtZmxoaWxngHx6d26PiHOAg4V9dIGGiXqDfXqBhH18jnJ5i3l4bmyHa2hfaXJih2hxb2V2Z21sYXpoanx7eHBhd22LgZmZq6GlqZ6Li5GGiZ2LlJZ8dqyYjJZ8n5ORl5SJd357inx8gHZ4f4Bvc3N6b4V8gICJfnxgW36PkYeAhIRyen+Geo+Rh5GRm5KkmpOBfIF8jYqSpImNio2WmoyEj5eRlI2IiIySnZOQjI1uhJCPkYmemaKhmJiKl5NwjJyGaIqbkZZ7iYWQinCWmpShkZGIipiMgn+Sn32TkZSNmpB8i4aIdXN1a3FudX2LdW+GkY6ScnSAfIKCin5nc256f5uVfoaKdpKNg3WKe3GDgIOJfoaOi4aOlquOe4h8foqEdnxubH2CgGFmd3N0bnphXm9ha3RecGp6eXltdHFlel5ubHNtc1lZXV9gaVpPVldkYmVwcH6HZV1paGZiZ3CNbmNoaGVoZ4B6d3RvjoVzgYKDfHaDiYV4hXx4hIZ6gIl3f4t8e3N5g2pqX3BodH9rcW9tcWdva2V7YW1/eXdwbHd3iX+jmKOooaebiIuKgY6chpKadH+olJGNh6GNlpSRgXR8doV4eH9yc3qFbHFveGyJdn+Ahm5xW1l+ko2IgIGBdnWAf3+gho+KkpyXoJKWd4l+gIyInJ2Kj4aSl5aFiJOYjpaLio2OjJ2KjpGDbYmLj5GKnJahnJmWhpmJbIimhWiJoIyTgI2FjIF4lJiSnZGQiIiTjX9+kJl9ko6Rj5uTfYuBhXB2cGxub3B8hmpzg4+Zi3J4gHWCiYN6aHVwd4KbkH2KhnuWk3x4inZyjH2Ij3yMiIWKj5yliXyEdoGKfnd3a2h+f35bcXJxb293Wl5wYXBrXm9qfHpxbm1qbXdgcG9rcW5ZWGBgYGxXUFJZZWVhdG+EgWFda2xkYmZrkm5gZmZfZmqBdXFyb4uAdH+DgXl2gYuAeYZ/eIeGdoOFe4aLgHt3i39qcGN8YoV8b3BsdGpobmx3d19xfnl7dHVzf4J+pZWbrZ+nl4WMg36WlYOOnXSJnpOShYubjJaOjHpyeHSCcHKEdHF1iGxubHRsh3aCfX9tblVRgauUh4J4gHZygnmCoIKQgZKSmJqRmHeQeoKMkqOak46IlJiSg4WVmIqSi4mOj4idhJGLfXKKhYiPiJyZnpuXloGVgGmJn4ppiaOKlIaShIpxg5GYj5qNj4uLjo13e5ORe5CMjpOXjn2JfoJsd2pvbGxte4Bien6Ql4J3e4J4g419eml2bXaIl4yAiYh9lZJze4ZyeY98jI98in+FjpGfoId9fHeBinx2b2dpfn92XXZubWtwclVdbmJyYV9tbnlwaHBmZ3R2aXFsYXdmXVVlYF9xU1BNW2VjXHdviHteXGhwYWJlZpFqX2dkW2dvfW9scXOJfXZ8hoF1dn+MeXyGgHiHg3OGhX6MjIR8epV4Z3Fqg2CHfm9va3tgaW10gHRec3x4hnh0c4V8eaGQmrGcpY+Din+CmYh/iZt+iZiSjoSImI6Pj4R3dHdzgHBvhHRwcYNvaml1bYJufHxtdHNSToLfyZLWk3xvdIN1g5+CkXaUkJibj5h7k3KFj52hk5OQiZKak4V9lZWHjI2Hko2JnH+OgXh7jX+IjImcnJyblpR7jndpjJSKboumh5WKmISGY4yRmI6UiZaLjImLcHqVinyOiYuUkot7h32AbXxlc29rbXt6W4F6kJCBe35/gIaPe3ppdWt0jJCLg4eGfpeNbYCAcIKOgI6JfoV8hJGWm5yMfXd4go53cWtkbnyAaWdzbmdpc2xTXm9lcFlfbHF3Z2trYmd5dHBwZGB4YWBVa19ddE9NS19lYlt3cIlzXFtkdWBiZWWOY2BmYlhpc3Nta3F2i3xzeYaCdnd+i3OAh396iX9yiYeBkImJfX6ZdmVzbnxlh35ub2t/WWxueXpyYHZ6e412cnaJdnmfjJyvm6CQgoR4h5R+e4ibhoSdkI6FjJeEk4+IgXV3cHlxb4RwbW1+cmNkd3B8bXl8amhsY6Sawdyu76JzbHaDdYShhJBulY+Vn5OagJFwhYqhlomOlYqQnJWCgJSPhYiPgJKKipd/h3t2f4p4hoWNm5uXmZCQd4x3cIqLjoCNp4eUi56Ghl6LlJeKjoiNioqEiWx8l4N+iYaLk5CHd4d/f2x9ZHh1am96dFiJe5KIhnt/f4CGjX96Z3RqgYqPi4SEgY2Yh22Dd3CJkoOShoCEfIGSl5SbkXV0eIeLdHJwZHJ2f19ybG9haHRmUmBxZ2tVX25zeWFyY2BpfnFzbltjc2FjVm5aW3ZMTEtiZWBddXKJbVtcZHheYGRlhF9jY15YaXJrbmtyd4t9c3aEgXh4fIlxg4V9fYh7dIuIh5WFjH9/mHNodXF5bYt6bnNwgFdxenZ5cWR2eYaMaHaAiXGAnYiZqJyjkoR9cIuTd3iJm4OEn42OfJaNf5qIhXxzd3Bzam+BbGpsfHReYHd2e3B0emdgZXzr2rXJw9yJc2x0gXaJmYiMaJePj5uUkoGIcIWIn42Fi5WKjJeTe4ySh4KIj3qRi4aPgoB3eIOEcoeCkpuWk5iHjXaIf3GIhYyKnaWGl46ghIphhJWPhoiFiIyGgIdofZSAfoOFi4+Pg3KIgIByd2h2cml1d2xajX2Tg4Z+gYSBhIuDd2J1bYqCkYyDf4CUk39wg216iJGIlIZ9g3+Bk5SRmIpucXmLhXRqb2lvdX5dcmhtXGl0X1JkcWlmU19xdnRgcGBdaIRxc2pXZ2lkaVdtV1tzS0lLZGVdYXFyhWlbXGV4XV5kZ3pgZF9dWWtuZW5qc3eKfnNzgX57dnqIc4WEfH+HdnaJhY+YgYyCfJR2bHd2eXiTdG53enxYeYZxgG5neHaRgmR2hoVwipeGmqGbooqGc26RinJ2jZp9ipmIiXyff4Saf4J5cnNub2RyfmlmbHd3W194enpxcX9pYWdhf9W2jpGmeG5xd3twkpCMhWmYjYiakIuFemiHi5mGgZKQhoaXjXuMjICAiY17kI1+iYV6dXuDfHGGgJWZjZKUgol2hYh5hoOOlqCiiZiSoYCJYX+Uh4SHg4iMf3+CZn2RgH+Ag46QkX9uhH6EdWxtd3V0eHZrY46Cj4GGf32FgIWJf3BgdHKGfZCOg32Akop7coVne4WMiY6FfYaAgZWQkZSFbm94i350bG1oaXh6YGdpaVhrdVlSaXJpYlFicnhtYmVeWmqEbnRiXGhgZW1eblRabU1HTmVjW2ZtcH9rWVticl9cY2x2ZGVdXVpsbGJsanN2hn9xb398fXR4hniFg32Ah3V4iYCSlXyJhneJgW94eXqEkm9teoB2XoN/dIFsaHpzlHNncod8cZKShJqfm6CHhnV1k35tdZKVfYePhIqNmn2MmnZ+d3JvbGphdHxnYml1eVpgd3t5bXB+ZWRoaFedj19yc5e8xIR1cZSIj31xlouGm5KLh3JpiI6VgHuVi4GEmot7ioZ8eomLf5SIdYmGdnd+gXJ1hYGdlIWUj4SEc4GKd4d/jJygnImWj56BiWZ9k4J/hYKIiHGBfWZ+jHx5f4CJjZB+aoF+hXZmcHl4dHh0bGqPhouCi4F5g4GFhIFsX3N5e36Oi4Z8g5CCf3ODanqFiY2IhnmFfoKZjpGNfm5teoh8dXNtZmV7dGJbcGJXbnFTU25zaGFOZ3V4ZmBeXVlvgW90WmZiXmtuYHBQWWpRRFJmYFlqbWx7bllbXWxiWmJvdmRnXF1ga2lja2pzdoGCcG5+fIB0dYN6g4N9gYV2fYiBlpB4hIt1gYhyeHl+jZBvb3qAcWmBeHp+bWx7dZVraneEc2yTjYafmZ+ZhYdufYt1aXeWjX6AiYOVl4p6kJZve3Rxa2pkYHN6aF9lcXpaYXJ8eWdweWFlZI+xsndLYlql2dCWcXqQio93fJOKhJiQi4Vua4WRkXp5koaBhJiJe4Z/d3eJioSWgG+LiHF1fntqeYWDpZCDk42EgHCAhXiGfImfnJiOlpKWhYhwe5OCfYKCiIJtgXZogIV5coCBhYuIfWZ+f4V2ZHFzgGl5cHB1mY6Gg4t9d3mBhHqDa1xyf3OCiYaKfoeKfIlzgm5yhoiRh4d0hnuCmo2OhXlubn2DfnV5Y2Zoe29eWHZaV3BsTldxc2dgS2x3dGFeXFtadX5zcFhnXmdqcWBvTldnUT5YZV1ZbmpneXBaWlhqZVljcHhfZ1xeZWxnZmtpcXd/h25sf36AdXCCe4CCf4J/doGEiJeJcYKNcXuGfHp5hJSMdWp5fmtvfnR/fG9ye3qTb2+BfnhnkouCoZmckYKFZoaCb2d5lIh9foSCmImBfI6NaHhza2tmX2BveG1fYm94XGRrgnpgcXVfZWXU6r2LMjo+i45/cXmFh42MdYKWjH6SjYt+bWuEjIx1fY9/hIGUiHuCd211hoSDl3duiIVsdXt1ZnmBg6aLgo+LhH5ugXZ5hn2JoJOPk5SVjoyHf3uShnh/g4yCa39xaIB+eW58fIOLhHhieoWCcmVyaX9udXJ1gpyMgYCGgHR2f4F0gnBbboB1eYyEi3yIgX6JeXtybYqFkoWNdIN6gJiMi4B1bmp2gH90c1tnZ3VuV1Z8U1lvZEtacnJlW0lxeG9cW1tZXXV/dGlaYltoZm9jak1XZVA9XWVcXHVlYHRvWlhUbmNZZHF5WmhdYGdtZ2lraXB3fY5saYKEf3lugHx9goCCenWCgI2ThHCAi254foB7e4iTin9oen1qc3tyhnpzdn1+jHl4hH18a4uNg5uelouBgGyMfWpofo2Len1+g5SCfn2KiGt1cWdoYltiZnJuX2Frc2BocIh5YnNzXmNkm6CPbl02Wq+1dGmAiHyRhnWFlYVzjoqJdm9rhIKHdHmJeIh8kod5fnJmdYh+fphvcYd/aXZ5bmZ5h4SkhoCHjIp/b4B4goSAkJyKhZeTmoqMhYl8kIhxe32Ee2h+bGqAe3pqe3eDiIFzYHiCf3Jlc2d2g251fIaWkoJ9g4FweHp8dYBtWHCAd3WNg4d4iHaEiXx5dG+LgpKCh3OAfn+UiYp8b25pbYGBdG1bZWRxb1Baek5bb1tOW3JvZFVLc3hpV1laWmFxgXVhXl1gZ2RpaWZOWWdNQGBjW2B1YF11bFdXU3RgWmRvcldqXWJoa2dtbGhwd3ySa2iEin18b35+fIKAgXp3gH+Ki4NxfIdvcniDf3uJjI+Dan17bXZ4dop2fHh/goZ/g359em2Ei4eYo4yEg3t1inhqbIOHkHh9eoKRgIB+i4NwcnBjZl5ZZl9wb19gZ29mam6JdGF0b1thZGp1eoC/nKakyLhxhYJyknt3hZKCc5CLh3Jyb4N6g3N0h3SHd5OHeHlwYnaHeoCTaXKEd2d3dWNqfIKHnYGAf46PfnOBdYd8g5aThnuZkJeQiIKJe4mJa3h5fnRnemhrf3lzaXp3gYR+aGB4iX5sa3RofIFpdoKMkpV/fH+AcXx3fHSAYlZ4fnN0i4WCfYRyiIp5eXJxhYOPgIB6f353j4aEd2pxaGyHgXFvXGZgcWxJZHVLXW1VU1lzbmJRT3R4YVJYWF1hcINzXGJcaWVlZGtkUVtwSUNjYFtjb11deGdUVlV2XltlbmhWa11gamdlbm5ocHd6km1piIx5fXJ7fnmCgYF8dn2DiIaDb3eEcm53goJ+iIuTf3CAfHd4eoGMdIJ4f4GBgoR6gHVvfoqLm56HfYV5d4V6Z3SFi5B5fn97iIWEd5CAZ3BuX2RcWGRZbHJhYGBwbGtoiW5gc2hZXmNuf3ep2qnHhoeycYh3b4x0eoWNf3mSiX90c3N9dn9vcX9thHOThXh0a2B5gnmJj2ZyhHBodW5bbX1/kJJ/gHiRk355fG+KeISUjod3mY2TkIiGhXyAhW10dX5sZnZkbXt2bmt3d4CAfWFjeYd6aXZ2Y358aHWHj42WfXaBd3GAe31ugVpXdX9wdoWIf4B6bYqHdXlsdoKEhX99fnp9dIyCfnRodGVuioNsclloXXNkRm1tS1phV1ZVeG1iUFJ0dlhQVlheYHKEb11hY21lZF5vY1RccUZCZV5dZWddW3piUVVbdFtaZ2tgVmpeYG9mZmtxaHB2eI50a46NdX92eH53gYSBe3R9g4iHg29ygHRxdX6FgYmNi3t3gHiCe3yFh3eHfH2BfYSAe35ydXmLjaCMiHmIdnSCeF59hZeLeIWDdIWGhHiKe2JubFtiW1tgVmlzYmBbZ25vZodyYXFlV1xia398ys6HuaFqbW2Ja3GDcXuDiX56kIR5eHN4dHR7amx1YoN1kYF2bmZffYJ6jIplcoJranFjWGx6hJuIgYFylpV3f31wi3OFjY+KdJqQkomGi4N7eX5xcG98ZGdwYW14cWttcXh+fnpdZnuBeGp2eWaDd2h0iIyOln5ziWtvfoJ5b31eWXSAbXSBi3yCb3CKgHJ3aXiBgoGDeH9ze3WIfXtzZ3JhbouAa3BWaVx2W0dtak1WVV1TVXtrYU9UdXJQUVRXXmN1hWldYGxqZmNab2FYYm9HQWdcYGVeXFZ7XU5VZG9ZWmpoXVdnYF9yZmpocmdwc3eGeG6Vi3R/end+eoOIf3Vyf4eFjoJwcHx4dnZ6hYWHjIZ6e390in19hoSDh39+fn2Gfnx5dXh3kZOffot8im11f3hjgoaVhnORim+FhYF7hHVjbmpZX1pcXVRnc2RgWGRxcmeAcmJrZFZaX2p/eL6ue5+2bWFzhGdzenF4gYV6fYt+d3dydW97dmVqbmCGdY6Ac2lhXn55eYuEZnF/aGtrWlZvd4migIR/cJmTcoF6d4VwhYWVi3aYi46JhYmFfXl0cm9oeF9pbGBtdmtoa2t5eHt3W2d+fXlmc35thXVldYaOhpeAcY1oa3uEdW52Y11yfmx1fYx7gmd2iH5vcml3gHqAgXR+bXt8g3t4cWZsYW2JfWtsVWlfdlVKaWpOUk5nTFh8aGFOVXVrTFBUVV9ndoNnXmFxaGdiWGldXGtnSkRqWWJjVllVeVlNVm1pWV1rZFxZZGJedGZsZHFncnB1gXdwmYZ2f353f32Fh311c4KIgJSCbnN5e3p0c4SGiYmDeYF+dY5+fISKjYOChHt+ioN7d3x3d5qcl3qIgoZpdnx7bIODkn9yjoFxhoJ/g4BwZmxmV11bXFpTZHBkXldicnVpdW9lZWJXW1tof3BvcoBziWRkeXxoc3VzcoGDd4CCeHZydW1qenFhZ2tmhnONg21mXV99cHuJf2lteGdqZFVXcm+MpXyEe3aWkXR9dH59cH9+lIh5m36Jh4OHg311cHFsZ3Rba2debHRkaGZpem98clpogXd1aXGBeIJ3YneGi3yVgnCNa257g3JndGZhb3tnc3iKfH5jd4R3a2xydnxyfHt1f2h/gIB5d29kZmJthXtsalVoYW9SSmhpT0tOb0deemZhTVV0ZEpPU1dha3d/Zl1ndGlmYFdkV2JwXEtLaldjYVVUVXJWS1h1ZFlea2BbWmNkX3ZmbWJwaXRvcn91dJmCd3+Ad39/hoR6fXWChH6XhW1ydHx6dXGEhY+BgHqLdnOQf3yBlY2AhYR9fYyGen6Bd3ujpYp5h4WDa3R7enWCgIt5boRzeYR9goN2b2poZVZdW1pZU2JuZFtYYXN7amhsaWBiWF5aaX9pa3CAZ2xgZ3l3aXJzc2yDgHl+e3V0bXpnaXlqX2VuaIB2j4RmZVhid2p/h3tvanBnZl1UWG9njad2gHp8kI56dnGAcXV4fJODe5d2hoSAhoh2anJ1Z2duW2xkXW1yX2hhanlofG1bboNzdWtwgX56eGF3hoV5kYZ0iXJxeoFzY3JqXXB4ZXJ0iHx5Y3SBcWdqenVzbXp5dnllhHyAeXdxZGRjbXt8ampUZ2FlU0prZk9HUWpFYXhmYU1Tcl1KTlVZZWx4e2ZfbnFqZF1WYVVublZKU2dXZV1YTVVrVElbeF5bX2tdXVpiZV95aGxhb292bnB4dXqYfnd/gXmAgIeGenl6g36Bk4NxdHR/end0hIiRfYF8kWtylYB7gp+Ffod9gH6GgoCJe3eEq55/eoeHgmpygHl1gH6AdG6Gbn2Ac4qAam9tZGRZX1pZWVRiamdbWl91gmlebWxcYVdbW2uBZXF0fWlpXGp2dGZzdnFrg3p9fHh1cmx5Zml3Zl1kcmd5d5KAYmJUZXBogoV4eGdpamFXVllnYo6nb353gIuOe3Fyf2l7cX2Pf3mRc4V+gICGbmR2cmRnZ1xqYV1vb1toX211ZXtoXnWBb3Jrcnx+dXZidYaMe4mIgoF5c3aAdmJxbltydGNxcoV8dWVzgG1hbXtxa2p8e3ZzZ4d3e3p2cWViZG1yfWlqU2ddXFRLcWFQRlZgR2N2ZmFLU29YS01YWGhrdntlZW5xZ2RaWF1Yd2VUSlxiV2dXWUhXZE9HYXhaXV9sW15cYWNefmlqYG90eG1wb3aDmHpygIB8f4mMhn12doZ4h4x8c3V1gnl7eoKMjnx+hYlpc5aBeoqcfn6FeoF7f32GiXNxj62Le3uGj3xlcYd5c3x6dXJuhWx7fmyPemNwb2JlXWVWWVlWY2ZrX11cc4VoWHBuWl5YWltremJwd3ZsYVlscnJmdHVva4N3fn94dm1uc2RodGVbZ3RldXaReV5cUmZna4OCdH5iZGpcVFddYWKOpGl4c4OGkXlucXxqem9/iX53i3SCeX15gGlkdm1gZl9eaV9ddGtZZl1vb2N6ZVx4fWxvb3B4eXR1ZXOEk4CHhIp8eHBzfnRjeGVccXFicXKBfHRnc4FlX253amVoe311b3CDdnR9c3JiX2ZtbnxkaFNmV1hTTXZeUElZV0hidGNhSVNsU0pOWldqbHJ8ZG1tc2NhWlpbYXdcU0tjXVdoU1ZGWF9NRml1WF5gbFtbXmFiXYRpaGFueHltcGt2gJB5bYJ+gIGTiISBdnSJdIyGdHF2dYJ4fX1+jJB/fpR+cHeVg32ZknmAgHh6fX90iIR0cJmgenp+h5R3Y3SHeHJ3dGt0b35reHxwkXNecG9gZ2JsVFpaV2hjbWZcXHGJZVNxbltaWFdfa3ZkaXVqaV5ZbHJva3NzcmiEfH5/e3ZubWtkaXBjW2tyZHR2jnNaVlRlYXKAf3KCXWJjXVNZYFtjkJ9lcXGFhJJ1bGx7b3ByfX9+c4J4gXR7enpkZXVnXWJZYGdbXnZoV2JdcGlheGFcfHZqa3JveHRzdWlxgpaEh4CFd3Rrcn5vZ3hYXWxuY3JzgHp0Z3B+XGBxc2Nha3OAbW52f3NyeGtwYVxlbGx6YGZSZVRXUU91WlBPWFFIY3NhYEZValFKUVpWa2trfWZub3JiW1pYWWxxV1JQZlZWaFNURVlbTkhxdFhfY2xiWGBgYF2LamNkbXp4bHBpdXmHe2uDfYCEmnyDhHl8iG6Ph3Judnp9dIKCfIuPgoOYdHiBk4WBnol1gYCCdH+CcYiDdnChlnN5hYqGemR2im5uem5meHB5a3J2c41rXnRuYWdla1JdW1VnYWxrWlxxjGRPb21cVldUZmlzaGJ0ZWRcWG10bG91dHhqhXx/e4d2j3NjZGtuYFxtbWNzeIdrWVRWY2R4fX1xhl1kX2NUWl9YYpWVY21wg4WKdGtpfHBndXl2fm17dXZwe391X2ZzY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGl0cXRxdXdrbYWUgol9h3JzaHB/cXRwVFxna2ZxdIB2c2Ntd1Zjc2xcYHBof2dueH5zc3NqbWFaZGlqd15lU2NUVVBTbFZQVlNQR2RyX2BFV2lPSVhUV25pZX1pbHhsYlddVVt0ZFNSV2hRWGZUU0dZWU9Nd3VaX2VraVlhYF1ejm5iZmt5dm5vaXV2gH9sg4B9h5h7gIeAiX9rk4hyZnSAe3WAg32Jj3+Mk3J8ipGEh5+Ge3+GjXSBhnN+gnZupItygIyKdnZseYtgZHtwZnlzeGxtcneDZ2R7bGJmZ2hTX15VZ19rb1tebo1oTWlsYFVWU25mc2tleGVkXFhvc2txendya4d6f3acenlrYWVsbV5gbmplcXh+Z1lWWGBseHx7cIRfY15nVlhfV2ObiGJrcIGHfXhsbHpuXXhzbn1rdnRvcHyBc1hqbl9ZXFVhYldkcGJTX2JpYmJsWmF+bGZsdHZvbXd3bGmGjYCKfIlucmdxfm50bmRbYWlpb3SAdHJfaW1TZXJlVmRwZHxlc3h9d2twbWtgWWFmZ3RcZFVgVVJOV2RRTltOT0hkb1xiRllpTUpfS1ltZGB5aW5+ZWBVX1RddVxTUmBmTlxgVVJJW1hQWXR1XV9la2hYYmBaXo1xY2dqeHFzbmh2c3uDcoKDeoiOfnyJh415bpCJdGtzgXR/f4iFh5KElo95fYyPh5GbhIB8jYVzgIFzdHhzb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn5+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2NjY2NjY6NjY2NjY2NjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo2NjIyMjIyMjY2NjY2NjY2NjY2NjY2Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZjgL67u7u7vbNtZmdnZ2dlkKGgoKCgo4BjZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX1t+yMTExMTGu2deX19fX12QpaOkpKSnfFxfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYySkZGRkZGQiYiJiYmJiY6PkJCPj4+LiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpOPiI2Mjo+Ij5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjIuLi4uLi4uNjY2Ojo6OjYyMjIyMjIyNjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkYqHjouHjYeKkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCRioSMi4aPhoyPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPjYeNhoyJiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuFh4eGiIaJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNiouMiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pjo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fX9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/f39+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoWGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2PkI6NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH19fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39/fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f3+Af39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fn5+fn1+f39+f39/f3+AgH+Af4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/fn5/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9+fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2JjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gYB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlJQUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p7fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PT09OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU5NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUtPUk5ZcHByd3h3d3R0dHd6fH59fn5+fn5+fn5+f3+AgYCAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9PTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRVFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FBQUBCQT87Pjw+Pz88ODk4Ozs6QDo7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODg6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXNxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozw/QEFCQD08OTw9PDk3OTo6OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gH+AgICAgX+BgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs8Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9CQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAPTw9Oz49Ojo6PDo4OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZFSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnZ3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9Pz8+PD5APz09PT89PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhscHBwcXR1dnl8fH18fH9+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUNEQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx8fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD47Pjw/PTw6Pj0/QkJEQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0RFR0ZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQUVlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBQ0RCPz1BP0FERURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4CBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZJSElHSEhJR0ZCREZERENBVXSHiYeHhoiCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fn1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+AgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0tLSktNSktISEZGR0ZFUGyEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8/P0RGR0RFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX9+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS01MS01MSUZKVWyBhoWEhIaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSEtMT05OUU5RXnKBhYSEhYWGh4eIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozw8PkE7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQkZIS0hMS05UZ3uEhIOCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3ODg6Ozc2ODg5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5/fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhEQkA1Nzg4PTo8REJERkZEVniEhIKCg4OFiYqKiYmKioqKi4mKioFINjc2NDY4ODc0NTc4NDY3Nzk5Nzc2NzY1Ojo7Ojo8ODk5OTk4Nzc6Ojo4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09QUVdrcXJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQT88OjU3OTg5NzpBOTxEP1B9hIODhISEhomKioiHiIiIioqMiomJjXo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6Ojk7Ojo+PT0/Ozs7PTo+PDo8Ozw8PTs6Ojw4Ojo7Ojk5OTw/PD1BQkRJSkxLSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ozs8Ojg5OTg5OTk5Oj49Pz9DdoSDhIWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQkFBQj5AQ0FAPz0+PkA/Pz9AP0A9PT9CP0FBP0E/PUFBQD8/QTw+PDs6Ozo5Oz89Ojs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg5Ozk6Ojw8Ojo6PDs9PkA/PWGFg4SEhYWGiYmIh4aGhoeIiYqLi4qKiouJi14+REdJS0pKRkdHREZIR0VDQEBDRUNDQUJDQj9AREhFQ0VERUVBRkVGREZGREBCPj1APj0/QD4+Pj8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzk9Ojw7Pj0+Pjs+PD8/Qz5KfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKh1dHTExNS05JSUtISUpKSUVDREZHRkRDRkdFQkhJS0dIR0ZHR0VLSkxJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgIB/f4CAf09BPj0/RExLQEJCQTk3Oz47PDo9Pz4/PD8+QkFFP2iEgoWFh4eIiImIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLRkRHSEhJRUVJR0ZFTExNSUpHR0hJSk5NT01MTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExtcHR1dnh5eXl8fHx9fX5+f39+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ojs8Oj0/PD09P0BDQkhTfoOEhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTExMSUhIRkpJREpIR0tKSUpISEdLTE5MTEhISUpNUE5PTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW9xdXd4eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojs3PD06PD88PT1AQkNETG2Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIyLi4uLXlJSUE1OTUtKR0ZDSEpHTEpHS09MS0tKTE1MT1BOSElLTE9RUVBRT09KSUpKTUtMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5e3p7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAgH5/f1VFQ0VFR0dFRDs/QTs9PDg/PT0+QEVEPkNEQ0ZKdYaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLS0VGRktPTk9XVlFQT1JTUk1TVE9NU0xQU1VXUlNSUExKTU1NTE5HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PEE/QUFEVEtCSElGSUx5hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSzs6UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBRUUtLS0dISkhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdGRkU/P0FARUFDRkRDREtWUEpQUE5PUHmGhYeGhYaHiIiIiIiIiIiIiIiIiYiUnIyKiox9YYqLi4dsW2RVOlhYWFNRPkBWVVlcZGBWWWJyXl1WXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NS0xKSUlMTUtPTVRwdHZ4eXh3eXl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hMSU1QS0lKT1NSUVRWVVZUdYWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSVlZUWlp1g1lVfZBhXFhdXldJVl5eW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYnRzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSklJRkJEQEE6T1FRV1hQUFBRUlNSVldXV1dsgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWlpYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3R3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaWlJTUU9RUlFVUlVTVl51eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWllXV1d6a1haXFxeU1BQT0lOT1dWWFpaZXF0d3Z0dHZ4eXl7e3x9fX1+f31+fX59fX5/f39/gIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNPT1FPUVZRU1JSVGNkdoCDgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVVJNT1lSTk9RU1VVTVFTUlBOTEtIQ0lHUlNUWV1tcnZ3dXR0d3t6ent7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f3+AgH57dnN3fX5+ZHV9aXF0YGRdXVtZVVFMSExJYWySdFBRU01RUlBTW1JTUlFSVVVic3t8foCBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+QkJDQ0E/RFBDQ0BDPkJIR1ZASE5NR11pUUhGT0ZFRkZIR0hCQ0hHSEpHREFBQ0BOUE1SZHR1dnV0dHZ5fHt6e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFSUFVZU1VRUVRST1Zga2xzdnp7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo6PkA/Pj4+alBLYUVGSElFQj9HTE1HTVFVSkJFPz89PTw9PT89P0FDQj8+PD1CPklNRlVvdXV2c3R2eHt8enx7fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSk9QTktMUVJRVFZVV1FRV1ZQWFtiXWFnbW1sbmpoYG5yaW1scXV7en17eHp8fHh3eGRCQEBBPDpCQ0FBQ0FbXE97Tk9PTktMTU9PUExLTFdOSUdBQTw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXZ1dnd5fHx8fXx8fXx+fXx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9PXlxaSUdPUVFPTVBRTlFSVFZYU1JZVE5ZWltXWVxfXl9lX11ecXdrXmBna3dvb2xqb21ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RVlBNSURGPjk5NjU4Njk3OTozNjU3OTU8Qj1mdHV3eHd6eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1NUU1BRVU9MUlNUV1hTVFhRTFhZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEVDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25ydXl5ent7fX19fXx7fX19fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXU1tmSkxQUlJPTU1OTU1MSkVQUFVZU1RPSk5PVVNTXFZSVVNSTk1MSUhIRj8/PTo3ODc2NTk5Njc2NjVYcXF0eHp6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhXWVlZUlVPSUdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQFE9Y2BRU1FQTVBQT05NTFBOVFJQUkxJTEtPUlBRUlJUUVJPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1ZRU0ZGQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj40QD5qb2FSUlFAR1RQT1BPUU5RT1BPTEpMTE9QTk1QUVFOUU9KTE1NS0dFRUNCOz09PDk9RzY2NzZFbnF1d3p7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlVZWVZRUVFPQD47PT9AQkFDP0JFREFAR0hHSEZGSEpNTERHQ09SQzhFTVNdZ1NRU0FHVU9PUVBQTU1OTEpMS0xOT09RTE9OTUlMS0lLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRyc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPzw9QUBCPT1FSEZERkZJR0pKQEZBQUBGR0RJT0hRUmFcUVBST1NPT09MTU9NS01MTU9OW1ZLTVFPR0lIQ0lLTExLRkZGRT9CRD49Qkc/Qj9AZHJ1d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QUVKRUNIR0lHSUVCQj8+PEJBQEdKRU1PYmVQTU9NVktMTktMTU1MTEtOTlNkTUpMUklJSUZCSktMTU5KR0lGQkJCQD9FRkVIRExvcHZ6eXl6e3p8endzeHR4fHx5em5xcW1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0hLRT9CPTk5Ojo/Qj88QUJBQURFR0tGRElJR0dIQ0M/Qj4/QEE9Q0VETE1RVExKSU1URklJSkxJSktJSUxNT1BSUEtHQ0tIQ0NLSkxOT05JSklHRENDRElKTUxJWnNueHl4enp7eXx2cnB1cnR5eXZ4anFva2xsbnR0bXN2e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtDRkdIR0pLSUpMREdCPD49Ojo6O0FCPz1CQkNDSEVKTEpFSUlGR0hDQztBQEI+QD9CRERJTU9HSEpHSEtESElLTUhKTEhJSkxKTV1SSElETkdCRUxLTk5QTktNSktGR0dKTU5STk1jbmp3dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ6dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RoZXBGSkNGRUZERUVGRUdDQ0A9PD06Ozo7QURAP0JDRUVJRkpKTEZJSUdGRkRCOkFDQz4/Q0NDRUdLTUhKTkhESEVJTE5NSElMR0ZGSUlMTktJSEVPSUNHTk1PTVBOTk9NS0lISU9TUVJOU2dnZnJvc3h2e3p8bGhqb2VrcG1zcWdubGhpa2x0bW91dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWZfcEdKQ0VFREJCQUVAREI+Pz47Ozs+Oz0/Q0I/QUNGR0pHSklMSEdHR0ZFQz89REVCPkFDQkNFR0hJR01QSUVGR0tOT0tGSElGRUNESUlIS0lHSFBLREpOTFBOT05PUE9KSklNUlVVUk9YZWFhbWZwcm9yeXpnZWhoY2lsZnFsZmxtZ2lrbHNtcHd1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUZCQUBBRDxCQT5BPTo6PT87Pj9BQj9AQkVHSkZKR0lHRkZGRENCQUFFRkNCQkJERUVHR0hGTFBMSE5KSkxLSUZIRUZFQ0NISEhLSkdLUk5DT09OUVBPT05PUEtLS1BVV1ZVVFlgX11pYW5pbmhyc2JlZmZkaGhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXNra3NNR0dFR0FCQERFPEFBQEM8ODo9PjpAPUBDQEBBREZJRUhGRkhGRUVEQ0VCRElGQ0dFQUVHRUZGR0VJTUtIUU1KS0hISUVGSEhFQ0lJSUtNS1BTTkRSU1JRU05QTU9QTUxOU1dWWFlXWV5bXWRgaWNqaWdrX2RlZmNoZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRUU8QENCRDw3Oj4+Oz47QEI+Pz9DRUdERkRER0VDRUNERkZGSkVFSUdCR0hGR0ZFQ0ZKSkdNSkxLSEpLRklISkhFS0tMTE5PUlRPSFRVVFFUUFJNTlJPTVFXWlZaWVdbXlpYYWBgYF5oZWNgZGVnZ2poaGpnaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQkNIRT1ARUJEPTg6Pj49PDxCQj1APkFCRkNFQ0NHQ0NEREZHR0dJRkhLSENJSEdJR0ZESEtJR0pITUtKS0xIS0pNS0lOTE9OT1JVVk9MVlZUUVRSUkxPUVBPVFpaWVxaWl1gX11fY19cYmRsY2BkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVMSUpISkZCREdFPUFHRERAOjw+QD8+P0NCPEA+QUFGQ0VEREdERURGRkhIRkhHSUtKRUpISEtIRUZMSEhISkdMS0xMTElNSk1OTU9MUFBSVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBfYWBiZl1kYGZoYGVpamRzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3NndHJrcXJrcndwd0pKS0lLR0JFREU8QUZEREI7Pz9BQEBBREFAQj5BQ0hCRURGR0VIREZFSUhGSUhKTUhISkpJTEpFSktISUpKR0tKTExJSU1LTU5OT0xPUVJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYmBkZGViZGliZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dXNwc3d0dXV3dnV1dWZxc2twcWpydnB3SkxMS0xHQ0NBRTxARUVEQz1BQUNCQkNFQUNEQUFFR0NHR0hGRUlFQ0dJR0dKRklMSElKTUtNTEZLSUhLS05RS1JQTFJMSk1NTlBQUFVPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYWNfYWZjYWJobmhiaWhobXh2bWhpbm9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZzcXF1dnVzd3l3dXR1Y210a29wanF0cXdMTUtMTEdEQUBEPj5ERUZDP0NBRURERkNCRUdDQkhGQkhJSUdISkZES0pHSEpISUtHSkpOS05MSUxIS0xKWmZKZFtKbFJHTk1fblVsc1txcGJ3Y1JQYnZ1aHVjYXZhWG5xYmR2aW16ZlxsdGBsa1Zgd3ZpamdoZmdsbWptb2ptb3NycHJycXJzcnNzcnRybmx0b25wcXF1dXJxc3R2dnV1eXd1dHRga3RrcHBrcXNyeUxOSkpKRkI/QEM/PERERkRDQ0NFRURGQkVGR0RESkVFSUtLSUtMR0dOSkhKS0dLSklKSk5MTU1MTElNTUxbc2Jkb11sbFVMTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXHB2Z3BPTHJ5dmthYWtlZWx4bWt2bG5vc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eXZ0dGJtdWtwcGxycnJ7S0xJSEdFRD9BQT89QkVGQkVDRURFRURCSEhHRERLSEdLTU1KTExGSk5ISktKSUtKSklKTU1OTU1NS05NTVtycG9ucHBrakxPUG1YTmlidHJwYW1vdlxZbFBbbW1acW1rcGx4eHRzaXBdYHNscWtVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRUVEQkFCPT8/RUdCR0RIRUVEQkZJSEhFR0tKR01MTkpMTUdMTklNS0hJTUlKSUpKTk9OTk1MTk1MXGhkdV1scVZrTU9RblVaa15rbHZhbGR0VGVjTmxZbFx0b2xqbHhqd3Vob11gc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHJzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNRklFRURDQUI8QkBCRkNHRktHRUNDSEpISEZJTEtGTUtLUlJMSE1NSU5KSUdNR0pKSElOT01OTEpNTUpadHBwb3FxbGpPUVJuWXNrZ29vcXFvbXReblhhdF9ub3BvcXNvb3VzdHRqW150Y3d4cmpuemhhYWNmYWJqbXR1cHN0dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW11cG5zc3Z0SUtISkNEREVAQD1DQ0FGQ0hJTUhGQ0ZKTElHRkpNTEZPSkpXUktHS0pKTklISUtJS0pJSUtMTU1MSUtLSlNrYllpXl5pYnJyWl9Zam9fZWVVa19jW2FhUWBtaFxqXG5pamRbb2VkcFxaXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZKREVDRkFAQUVEQ0ZCSEpMR0ZDRktMSUVGSk9MSU9KTFtRSkZISEtNSUhKSUtLSUhJR0tLS0tHSEpJS0tMSklKTE1TW11UUFVNUU9OT09WUU9QUU5PUUpKTlBRZHFpVFlWW1tcVVlbXVhdXFxjZmFhZmJjZl9eZmttaG10eHJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0hDRUdGRkBFQz9DR0RGR0NJS0xHRkRHSkxIREdJUEtMT0tMV01JRkVHSUpISUpITEpJR0hISkhISEVFS0hISk5LSE9cVl1PXVxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0UEJDRExNQUNDQkRJRUdHRktKS0dFRUpKSkZFSEhQSkxNSk1SSUhFQUhGSklLS0lMSklHRkpIRUZHRUVKRkJJTElKVF9ZX1hgYVtgVVhaVF1eWl9SWVxQXlxZTl9cXlNbXmReWl1gY19ZX2JbYF5bVVlZWl9eY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdXl6enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQ0FDRkdFR0dJSkpJSURGS0tLRUZJSU5KTkxITE5HSEY+SEdMSUtLSktLSUdFSUZEREVCRkpEP0lLSE5aYlleXmFfUlRTV19fXF1ZXlFZXE1WX1dLUVlbUVtfYmFdXmNhYGJhYmNjZVpSWldXXVpdZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFlRSkZDR0VCREhIRkdISUZHSkdIRkhLSUtEREpKTU1MTEhKSkhJR0BHRk5KS0tNS0tLSUdJRUVAREFISUE+SElGT11gWltkXV9UUVJYXVxcXF9bS1dcTFJcWUlNXlFRXV9iY2NjY2JcZGJhZGNmWFJXVVRcWFthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaGhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNFS0lGR0dJR0dKRkZGSUxKTkVDSkpMTkpMSUtLSUlHQ0hIUU1LS09NS0tJSEhGRUBFQkhIQUBGRUNTXVleWF9YX1tdVVhYUF1cUUtKVl5YXltdVlphUlJfX2JiYGBiYl9jYmFkZGFYUFJSU1xTXF1dXl5fX19kaWdsa25ucHt7fH57gIKDhIWFhYWFhYSEhYOEhYeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExKTExKSUdESEtRT01MUE1NS0xJSkRFQUVDSEZBQUZDQVVVRVxUXlNWYFhOVFVNWVpMSktUYGFbX1hfXmJdT1liXGBgXmJjYV1iYVdgX1VRUFFSWVNeXFtdXV5gYmZmZmxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVNjUUVXX0lHR0hERk1KUFBGSUlKS05MTEtNTEpKR0VKTlFRTk5QTU5MTklMQkVBQ0NGQ0JAQ0Q/TEdDTExPT09NRk1GRkhJR0ZMS01PUElMT1BQU1BMUVRTVVlYV1lXV2NWTlJUUFFQT1FWVFxZWVtdXGFhZWZkaGRsbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTl5NSEhZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tQU1NOUFBOT09PSUxGYUVEXkxEZmJDTFpHXlxzbU9MVm5ZS0NPX1RrVmdJXVdVXkRMUVVMTVNWUVNUWFZUWFRUXFRPZVpoaGVaVWtUWFdVW1xbYGBhYmJjYWdpZ25saHJ6fX1+gYOEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUxQVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPUEpMTkdJTVFbWU9QUE5QUVBKS1F/UUl8WVlyc1dQbUdxbm9hVlFxcXRPQmpzbnFzcFNvX1tuWF1WXFhVa2hVXVZjWWBZWl5VVVd/aXR1dWBhdl9ZYlxcZltfYWFhYl9hY2dtb21gcHd0eIGBgoODgn99foB2eHptdn50eH2AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMS09ITFJYV1FOT09NUVROT1FQTExPSE5QU1taVFFST1BQUUxJWnhdVHhkaFhSU1B2ZnRscGJuZmtSck5Md21qcnBzcnFycG9vgF1lenV4cXF6cX5yfWt1fWFSaHxlc3Nwc3N8fXB+eG9/cmBgYGJiW2JhaGxua2JsZmdtd36BgIN+e3h3gHR2emlxfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQURNTUhLS0hLUE9NTkpOVl5ZVUxRU05ZWUxTU1NOTFBJUlJUWVdXUVRQUFBSTEhneGxjeHFtWkpLVHlwdW11Ym52UGRkSGV2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Boblh1dWp2dXGBYXNofWlseHxvX19fY2JcX2RlZ2pqZWdiY2RsbHBwc3Rzc3N5cXJ4Ym10Z3J5e3NzdXl+gXN2em58fXl4cm5NSlJ0TkNCRVBRSEtMSkxRT09PTVBZYFpYS1RXUGFeUlZRWVNNUEpTVFZYV1dQVVBPTlJKTHJvdXVxdXFjaGBWbktxcF5HaHlXdlRLaHh9d2B5e3NtYF1tb2RTZ3J1bm15cHdrdXN0cWxtXHN+emtteXxsdW58a3F3dXheX19iX15gZWRpZ2hmZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlFKTU5MTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUV1dZV09TT09OUUlSbUhpd0tgZHZ2VFZsTm5se3Jhamd/dVRLVmtnfGxtbHdeWnB6e19genNjcm94cWdjfGlye11US2xfdnVsanZ8e25/eWx8cF1eXmJbX2NlZWdmZWVjW2NjaWtrcnNyd2dtaWhkZ2BhbGFnc3JrZ2xtcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUExMU1NST1NSWFJXVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RS0hRTlBVTEtLUlNSUVJPVlVRUU9SUlhYUE1PVVRXWFhaWlRRUldbV1dXW09SVFdXWFFdWFZcVVRPWFJXWFhZWmBcaHNfXFtZXF1fY1pfZGRlZ2RkY2JaZGJnZmZtbm11ZmZnY2BmXl1nYGRsZ2Vna2hwemhnZ2t1amhoaWxQSUtLTE1LSlRSTlJRUExWVVRQVFVYVVpWUltdVlVUV1VZWE9PTE5XVFBOVVNOUE5MUVBLSVFRS1FNSkpPUVRRUFFTUkpITU9QUVFQUFBTVVJYV1xXUlJQUVVVVlNaUU5SUldUU1hVU1hUU1FVVFVWWVlYXlpfYV1cW1pcXGBjXF5iY2RnZWVlY1pgYWRhYmhoam5jYWReX2NdWmNcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFSTVhXVVRWWFdXWlZTXGBWV1ZZVVhUUVBLT1hTUE5VUE1RT0xTUE1PVVNOUU5NTlFTUFRQUVRUTktNT1JUVFFRUVVWU1haW1lSVVJUWFdWWVxTT1NUV1RTWVRWWFRSUVdWVlhcWlxgXVZZX11eXVxdYWFeW2JjY2hnZmRjWGBgYl5gaGVnZWFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTFBVUFBUUU9RWllYV1lbWlhZVl1qZFZYWVpXVlNUT0tPVlRQT1RQUFFPTVJRT1JYVFFRT01PUlRNV1FTVFVPTU5RVFZVUlJSVFdVWl1cWlZWUVJXWFVbW1ZQU1VVVFVYU1dYVFJRWFZWW19bX2BfVl9dXmBdXGBfX19aY2NlaGhlZWJZYmBiXl9mZGNgYl1cXFxcWVpbWFtiXF5dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1ZcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1XU01NUk9SUk9MUFNSVVtVVFBQTE9XVVBWUlNSWE1PUFJVWFVUVFJUWFhbXl1cW1ZST1VXVVtaVlFTVlRVV1VTWFpTUlFaV1ddX1tgYGBWYlxgYV1gYl9cYF1jYWNoaWVnYVpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFpgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVVNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOUFdTTlFRUFJUUkxSVFRZW1dVT1JOUldVUlJUUVJZT1FTVFZbVlZWU1ZaWF1eXFxeVlNOVFZWW1tVUVRVVVdYUlNZW1NSUlxYWl5fXWJhYFdiW2NiXmFjXlxiYWJfZGdpZWdeXGRgYWBhY2RfYl9aWl5bXFtYWFlXV1paWmFdXVtdXFxaXWBXW1taUE9PT1lQVVVTUlhSVFBbXV5dXGBcYFVcXGhqcn1zbGhcVVlXUU9TW1NSUVNSVVVVS1JXVlpaWlNPU1FVVVRSTlZRUlpSVFVUWF1XWFhTV1xYXl1ZWl1VVU5WVldeWldRVFVXWFhTVllbVFJWXVldXmFeY2NfWWBbZWJfZGReXmNjYV5lZmllZ19eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SW1BaVVZXVlRUVF5eYF9eYlxgVV1eYmt5dW1+bFtVWlZRUVRcVFRUVVRWWVdMUlpWXFtcUlBVU1dVVVJPV1FTV1NXVVZbXlhbWVVaXlhfXllcWVJXUllZWV9ZWVJUVVlZWVVXWVtVVFpdXV5hYmBlZF1eXV1lYWJmZF5eZGNgXGdlaGZlYmBlYV9hYWJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUV1VV1lXV1VYX2BhYWBjXWBVXV5iZWV2gntpWVlaVFZUVlxYV1dWV1ddWE9VXFleXV1UU1hSVlVTUVNXUVNWVFhYWF5eWF1bVl1fWF9fWFxWUVhUWlpaYVhbVFZXWllaV1hZWVdWXV9gX2RjYmZlXmJcYGZiZGZkX2BkYmFbZmNoZmRmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWlpaXV9dVFldVU5UWlZUXFVXV1lXVlxgYWJjYWNfX1ZbYGRhX3p1cGlaXFpWWFZYW1pZW1lYWWBWT1VdW2BhXFRVWVBUVlRSVVVRU1VXW1tcX19aX1xWX19ZXV5ZXVZSWFdaWVxhWV1VVlpbWltaWlhaWFlfX2BgZGNkZWVjZFpiZmNnZmVeYWJgY11iY2llZGdgaF5iYmNhYWBeX1lUW1paW1tYXFhYXFtaW1dXWlhYXFtcYF1WXV1TT1ZaVlZaVllWWFdYXmBiYWRhZGFeWVlhZGJga2ZoX11dW1dYWVpcXFxfW1pbYlZTV15dYWNcU1ZZUFZVVVVVVVNVVFhdXV9gYF1hXVdhXlteXFteWFVYV1taX19aXldYXFxcXV1bWlxXWl9hXmBkZGVmZmdjWWNmZWhnZF5jYF9lY11maWRlaWBnXmNiY2FhYF9fXFhZWllaWVhaWFdbW1pbV1haVFpdXFtgXFVeYk1SV1pXV1pZW1xYV1leYGJhZWFkYV1eWWFjYl9hYGFfXF1dWFhcW11dX19cWl1jWFlYXWBjZF9SWFlQV1VXV1dWVldWXV1eYWJhX2JeWWFdXV5ZXV1ZWFVWW1tgXlxfWVleXV5eYFxaWllbX2JfY2ZkZmdmaGNaZWZnaWdjX2NeYWZlWmlpY2ZpY2ZfYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWVZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYWFxcX11gX11bYGRcXFhaYmVjYVJcWU9YVlhZWFlXWVpgXmFiY2BhY19cYl1fXVteXVlZVFhdXF9fXl9bWl5eYGJiW1tXW11gYmJkZmRnZmZoZV1lZ2hpZmNhYltjZ2BcaWljaGlmZWBiYmNhX2BfXV1cWVxZWFdYWVlXXFtaV1ZYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGJgY2JiXV1bWldYanFgXGBfXVxhY19eWVljZWRhVF9aUVlXW1xbW1lbW2NgY2NjYGJkYWBjXmBcXl5eWVhVW15cXGFhX11bYGFiZmJeW1NcX2BjZGRmZWdmZmdmX2ZnaGhnZGRgW2VnXmFoaGNpaGZjYGJhY2JfX19dXVtaW1lYWFhWWlZcW1pWVlZNWFhcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5ent7enp7enp6enp6enp7fHx8fHt8e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl6enp7e3p6enp6enp6ent9fX19fH18enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PTz8TFxcXFxcfS1NTU09PYWiUrKysqIovb0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OXg1NTU1NTU1uPl5eXl5etUExsbGxsQj+/l5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXp6eXp3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODg4OCgoODg4KDhISEhISDhHdzc3Nzc3J8hYSEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z5fHp6eXl9eXl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXl5eXl5eXl5eXl5eXl5fH19fX19fXt6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnp9enp7eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en56eX14fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d4eX15fHp7end4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3h6enp8fHx9e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt5enp5e3h4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh5eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3h5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKiouHh4eEg4KBgYGBgYGBgoGCgoGBgYCBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4OFgoGBgYGBgYGCgYKCgYGBgIGCgYGBgoKCgoKAgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLh42JiImFhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYGBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGBgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKCgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgIGCgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e319fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIyLiIqGhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyIhoeJjIuLioaFg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/fn5+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qHiIqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpKQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoKCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoOEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGCg4GAgoOBgoWFhYWGhoeGhoaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISBgoKCgYGCgoGBf4CBg4GAgIB/gIKCgoODgoKBg4ODhIODgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCRj4uJh4KCgoKCgoGBgYGCgoKCgYGBgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4KDhIWEhIWFhIOChIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiIh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIKAgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKCgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHh4eFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKCg4KCg4SCg4SFhYSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4SDhYOBgYOCg4WFg4ODhIOEg4OFhIWEhISBgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKBgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBgIGBgICCgYKCgoGCgoKBgIKCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgYKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaGhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4GBgYGDgICBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgYGCgoODg4SCg4ODgoCAgIKCgoOCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhISDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhIWEgoKCg4KChIKBgoaFg4SDg4SEhIaFhISFgn99fX1+goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIuIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4KCgoGAgYCAgICAgICAf4CAgICFhYaFhYaHh4aFhYWEhIWFhISEhISDhIODg4SFg4KDhIWFhoWGhoWGh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhYWHhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoODhISEhYSDgoKDg4SDg4KDhYSFh4iFg4KAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4iGhoWEg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/gICBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoSEhISFhIGAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODg4OEiYqHh4SFhYSDg4WDhYSDg4KBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aGhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KDg4WJiomHhYeFhIWFhIOFhIOCgoKCgoOBfn1+fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYeIhoiHh4mIhIOEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4SEgoGBgYGBg4OEg4SRkpGOj42Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFhoiLioaFhoSChoaCgIODg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoODhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4WFhIeIhYOBgICBf359goODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICBg4KAgICAgYGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn58fH+Dg4KDgoOBfX1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBfn19f4CBf39+f4CAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgX98fX1+fX1+gIB+fX5+e31+goODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAf35/fn5+fH5/fn+Af35/f4B/gYB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gH19f4GEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e39/fn9/f359fn9/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/f39+gIB/foB/f35+fn9/fn5/fXx8fYWSko2Mi4qIiYiEhYSCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAf39+gIGEg4KBgYOEhIOEgIGBgIGAgYCBgoKDgYCBfoCCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gYB/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/gH+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/gH+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4ODgoKCgYKBfn59fX1+foB9fX19fX19fXx7enp5eXl5gIKCgoSDgIGDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f3+AgICAgICAgYF/fn1+fn9/f36DhoeHiIKGhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4GDgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH9/f3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAgoN/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gIGAf39+fX9+f4F/gIKBhYWFhoaHh4aHh4iGh4eHhoeHh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4iHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgICAgH9/f39/gICAgICAgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf3x8fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIKBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjIqJioeFhoWDg4KBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKDhIOCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIB6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY2LjIyOiomJhoWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBg4OCg4KCgYCAgH+Bfn9+fn18fHx8fHx8fHx8fHx8fH19fHx+foqCe3p7enh6e3p8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fXuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjo2Ih4iGhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt7enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fH18fH2Af4CAfoB+foGUkYuMjI2PioaGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOHf318foCAgYB/f359fX19fXp8fX9/f4B9f36AjJGNjI2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGAgIGBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goSGhoV/f4WBfn+AgH+Afn5/fn+AgH+AgH9/fXx8fH1+fXx9fX19fX18fnx9fHt9fHx6e3p7fX1/hoSCgICBfX59fn99i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fH5/f31+gH5+foSSjIyLjo2LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHt+fXx+foCAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fH2Bg36Mfnx7e31+fX5+fXt7e317ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+LioqMi4qIhISFg4SDg4OCgoKCgoKCgoGBgYCCgoGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fn9/fX5+f39+gH9/f39/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgX+AgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeGgoSQjYuKiYqGh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f4CCgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fX9+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYqJi4mFiJCMioiIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIODgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fH19fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeHi4uLiomMkI2MiYeGhYSDgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+f3+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgYF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+EgoSIiYqIiY2PjIqHiIWEhIOBgoKCgoOCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX15fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fX59fn99fX17fH1+fHx7fH16enl5enl7e35+gIGDh4SIjYyJiYWFhISDgoKCgoKCgoGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh+goCBgoKAgIGAgYGAgIGCgoKChoWEgYGBgYGDgX+AgoSBf36BgH1+gX59f3+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDf4iMiYmHhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBhIF+foCAfX6AfX1+foCAfoF+f4B/f3+Af31+f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iImHh4WGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt7enx8e3Z7dHd/fnZye35+e3h1d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foGBf3x+fn19fXt8fnx9fHx8e3x7fH2IhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF9foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fYB/fX1+fX5+fX58e3x6fHt6gIWCg4SFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoKBgoGBg4B/gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCDgX9/gH6AgX6AgYCAf35+fn5+fX9+foWFgIGAf4CDgX9+gYB/foB+gH9+fXt6e3p8e3qCg3+CgoKCg4KDgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3J5e3xwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/gH9/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgX9/gH+Bf4B/fHt7enx7fIGAf4F/f4GBgYKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoWEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f319gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fXl+f398fHx+fX6BgIGBgYCCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhYGEhIWEg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5+fX19gH+AgYGBf358foB+f3+Bgn+BgYKDh4WBgH9+foB/gIGAgICAgYKBgIB+gIJ/f4GCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgYKDgYKCgYCBgXyAf36AfX59fn+AgIB/fn9+fH5/f4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4OCg4KBgoOCgYOCf4GAf39+f4B+fX18f4CAgH9/gH98gH9/gYCBgIB/fIB/fn5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCBgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hn1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXd5cniFhYWFg4SEgoKDgoGBgoGAg4GAgH9+fn5+gH59fnx/gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgoF+f35+fn19fX9+f358foB/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgICAgH1+fn+AfXx+fX+AgYB/f4GAfIB/gH5/gYB/f32Af35/f359fXyAgICAgH5/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGDgoKDhYWCgn59fXt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc3B4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYB9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/fn9+fH5/f39/fX1/f31+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t4enp3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFh4SFg4SCgYOCgoKBgYKBgoCBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4B/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hH10fH16enp6fHl5enqGhXd5fHx8fHx9e3x8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgIGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af39/gH9/f3+Af4CAgICAf4CAgYGBgYKBgIB/f39+fX9+eoGRi3p8fXx7fXl7enp4eYGBeHl7fHx9fHx7fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYeDg4KDgoCBgIKCgYCBgYGBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAfn99foB+fYCAf39/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaIfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fXx9fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgYGBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1/gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gYCAf4CAf4CBgX+AgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGBgoOAf4KBhYODhIGBg4GCgoKBgH+AgoOCgIKChYN/gIB+goOAgIGAgIB/gIB/gYGAgoB/gIGAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCgoKCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5eXx9fXx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4ODgYKEgISDgoKAf4KChIGBgoKEgn+AgH+Bg4KBgYGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoKBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoGBg4GAgICAgIGCgYSAfoGDgX5/gIOCgIF+gIKDgoCBgYGCgoOCgYGDgoKEgYCBg4GBgoSDg4SEg4OEg4OBgoGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4OChIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBfn+BhISBg3+CgoGDgoKCgYODg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCgoWEhIODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4F/gIKEg4OCgYKCgYOCgoODhIODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6Af3+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0fnZ1fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OCg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGDgX+Bg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fX99f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnZ/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOBfoGEhIODgoR/gYSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhISEg4GCgH2Bgn99fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fICBgoKDg4aDhIOGhIGCiIeFhIODhISFgoSFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOCg4F/gYSDg4OCg3+BhYODg4OEg4OEg4CChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEf319fHx8fH+Bfn1+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgYGDhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWLiYSEg4SFhYOHhoaEhISEhYSEhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/hHuFg4CEg4B/fn1+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goR1c3GDhnRwdXJzdIN2e311gX+Cg4CCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4GDf4ODfYF9fX59foKDgXx/gX1+gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWEgoWGhIWFg4KDhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2enmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/fn1+gYCBfYB+fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIiIWDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf3+Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFg4WFhYSChYWFhYaGhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWEhoWHhoWGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHRwb3prc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIaGhYaEhoSDhISGhISBhIOEhIWEhYSFhIaDhoeFhoSEhYeGhISFhYSFfXeFg4SEg4KBfX9+e3x7fnt8fH1/fn18fn6BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoeIhoWIh4iFh4aGiIWFhoaFhoaFg4KFhYaFhYOEhISEhYSFhYSFhYSGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5/fH19fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWEiIWGh4aHhoiGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGhIaGhYaFhIaGhYSDhYWChYeFg4KChYOEgX6AgHx7fX17fHt9fn18fH59fn58f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoOEhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYeHhoeGh4aHhYiIh4eFhoaHhYeHhYGEhIWGhYWEhISDhIWFhoaGhYaEh4aGh4WFhoaFhIOEg4KEh4OEgYKEhIOBgICAe3t+fXt8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WFhIOEhIWGhoaGhoaHhYWHhYaFhoWEgoOCg4OHgYOAgoODgoKCf4B7fH5+fHx8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHhoiJh4WIh4aIh4aGh4eFh4aIiIeGhYeGh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFh4eGhoeGhoSGhYODgoKCg4aBg36CgoOAg4N/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYWEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWIioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWDhYWGhoaGh4WHhoeGh4eFhIWFg4GCgYCDhYKDfoGBgX+DgX5/fn99f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYeGiIaFh4SGh4iGhoiIh4eGh4iGhIaGhoeGhYeDhIWEhoaGh4WFhIOFhYeFh4aHhYaGhoWGhoSDhIWBgIGBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhYWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhoeIiYaFiIeJh4aGh4WEhoWFhoWFh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhYWGg4ODhYB/gYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXl6eXp9fXl6ent8e3x7e3p7fX18fXx+fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDhIWHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHh4iIhYWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoeFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fX9+fHuIhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHh4eFhYiGiYeGhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WFhoOFhYGBg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fX19fX97f3x7enl6enl6enx5enp7e3t9ent7e3x9fn19gH19fHx9gH99fIaDhoaGhoWDhIKFgoWBgYB/f4CAfn+Agnx+f39+gICCgoKDhIOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSFh4WHhYWCg4KBg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn99fX9+foCEfnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6e3x8fH5+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+foGBgoODgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4aEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58f4N9fH58fIGAfoJ/fX+CfH9+fXx8fHx7e3p5enp5e3p6enp6enp7fHl7fXx8f39/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSGhIODhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYWFhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnt9gX+Ag359gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5hYWMgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouYWFjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMTEwMmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouYWFjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZjZGEwYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvCkBAIC0wLDAgKzEsNDY5IEBACis1IDMyIDAKKzUgMzIgMAorMzM3IDEgMAorMzIyIDEgMjEzMzMKKzI3OSAxIDQyNjY2CisyODAgMSA2NDAwMAorMjgzIDEgODUzMzMKKzMxNyAxIDEwNjY2NgorMzE4IDEgMTI4MDAwCiszMjEgMSAxNDkzMzMKKzMxMyAxIDE3MDY2NgorMzEyIDEgMTkyMDAwCiszMTcgMSAyMTMzMzMKKzMzMCAxIDIzNDY2NgorMzUwIDEgMjU2MDAwCiszNTUgMSAyNzczMzMKKzMzMyAxIDI5ODY2NgorMzI1IDEgMzIwMDAwCiszNzYgMSAzNDEzMzMKKzMzNSAxIDM2MjY2NgorMzUxIDEgMzg0MDAwCiszNTAgMSA0MDUzMzMKKzMzOSAxIDQyNjY2NgorMzI5IDEgNDQ4MDAwCiszNTAgMSA0NjkzMzMKKzMzMCAxIDQ5MDY2NgorMzU5IDEgNTEyMDAwCiszMTYgMSA1MzMzMzMKKzM0NSAxIDU1NDY2NgorMzU3IDEgNTc2MDAwCiszMjUgMSA1OTczMzMKKzMzNiAxIDYxODY2NgorMzM5IDEgNjQwMDAwCiszMTIgMSA2NjEzMzMKKzM1MCAxIDY4MjY2NgorMzM4IDEgNzA0MDAwCiszNTMgMSA3MjUzMzMKKzM0MCAxIDc0NjY2NgorMzMyIDEgNzY4MDAwCiszNDAgMSA3ODkzMzMKKzMzOSAxIDgxMDY2NgorMzMzIDEgODMyMDAwCiszMzMgMSA4NTMzMzMKKzM0NSAxIDg3NDY2NgorMzQwIDEgODk2MDAwCiszNDMgMSA5MTczMzMKKzMzNSAxIDkzODY2NgorMzM5IDEgOTYwMDAwCiszNDIgMSA5ODEzMzMKKzM0OCAxIDEwMDI2NjYKKzM1MCAxIDEwMjQwMDAKKzM1MSAxIDEwNDUzMzMKKzM0MiAxIDEwNjY2NjYKKzM2NiAxIDEwODgwMDAKKzM0MCAxIDExMDkzMzMKKzM1NCAxIDExMzA2NjYKKzM0MCAxIDExNTIwMDAKKzMzNCAxIDExNzMzMzMKKzMzOCAxIDExOTQ2NjYKKzM0MCAxIDEyMTYwMDAKKzM1MSAxIDEyMzczMzMKKzM0NiAxIDEyNTg2NjYKKzMzMSAxIDEyODAwMDAKKzMyMSAxIDEzMDEzMzMKKzM0MyAxIDEzMjI2NjYKKzM0MiAxIDEzNDQwMDAKKzM0NSAxIDEzNjUzMzMKKzMyNiAxIDEzODY2NjYKKzM0MiAxIDE0MDgwMDAKKzM1NiAxIDE0MjkzMzMKKzM1MSAxIDE0NTA2NjYKKzM0MyAxIDE0NzIwMDAKKzM0NyAxIDE0OTMzMzMKKzM0OSAxIDE1MTQ2NjYKKzM1MCAxIDE1MzYwMDAKKzMzMCAxIDE1NTczMzMKKzM0MSAxIDE1Nzg2NjYKKzM0MCAxIDE2MDAwMDAKKzMzMCAxIDE2MjEzMzMKKzM0MCAxIDE2NDI2NjYKKzMzNSAxIDE2NjQwMDAKKzM0NCAxIDE2ODUzMzMKKzM1OSAxIDE3MDY2NjYKKzMzNyAxIDE3MjgwMDAKKzM0NiAxIDE3NDkzMzMKKzMzMCAxIDE3NzA2NjYKKzM1MSAxIDE3OTIwMDAKKzM1NSAxIDE4MTMzMzMKKzM1MiAxIDE4MzQ2NjYKKzMyNSAxIDE4NTYwMDAKKzM0MiAxIDE4NzczMzMKKzMyNyAxIDE4OTg2NjYKKzM0OSAxIDE5MjAwMDAKKzMyNiAxIDE5NDEzMzMKKzMzNyAxIDE5NjI2NjYKKzM3OCAxIDE5ODQwMDAKKzMyMSAxIDIwMDUzMzMKKzMxOSAxIDIwMjY2NjYKKzM0NiAxIDIwNDgwMDAKKzM1MiAxIDIwNjkzMzMKKzM0OSAxIDIwOTA2NjYKKzMzMSAxIDIxMTIwMDAKKzMzMCAxIDIxMzMzMzMKKzMyOSAxIDIxNTQ2NjYKKzMzMyAxIDIxNzYwMDAKKzM2NyAxIDIxOTczMzMKKzM2MiAxIDIyMTg2NjYKKzMzNyAxIDIyNDAwMDAKKzMzNyAxIDIyNjEzMzMKKzM2MCAxIDIyODI2NjYKKzMzMyAxIDIzMDQwMDAKKzMxNyAxIDIzMjUzMzMKKzM0NCAxIDIzNDY2NjYKKzMzNSAxIDIzNjgwMDAKKzMzNyAxIDIzODkzMzMKKzM0OSAxIDI0MTA2NjYKKzMzNiAxIDI0MzIwMDAKKzM0OCAxIDI0NTMzMzMKKzM0OSAxIDI0NzQ2NjYKKzM0MiAxIDI0OTYwMDAKKzM1OSAxIDI1MTczMzMKKzM0MCAxIDI1Mzg2NjYKKzM0MCAxIDI1NjAwMDAKKzM0OCAxIDI1ODEzMzMKKzMzNCAxIDI2MDI2NjYKKzMyOCAxIDI2MjQwMDAKKzM0MSAxIDI2NDUzMzMKKzMzOSAxIDI2NjY2NjYKKzMzNyAxIDI2ODgwMDAKKzM1MCAxIDI3MDkzMzMKKzMyNiAxIDI3MzA2NjYKKzM2MCAxIDI3NTIwMDAKKzM0NCAxIDI3NzMzMzMKKzM0MCAxIDI3OTQ2NjYKKzM0MyAxIDI4MTYwMDAKKzM2MSAxIDI4MzczMzMKKzMyOSAxIDI4NTg2NjYKKzM0NSAxIDI4ODAwMDAKKzM0NSAxIDI5MDEzMzMKKzMzMCAxIDI5MjI2NjYKKzM0MiAxIDI5NDQwMDAKKzM0NCAxIDI5NjUzMzMKKzMzMCAxIDI5ODY2NjYKKzMyOSAxIDMwMDgwMDAKKzMzNSAxIDMwMjkzMzMKKzM2NiAxIDMwNTA2NjYKKzMyOCAxIDMwNzIwMDAKKzM0OSAxIDMwOTMzMzMKKzMzOSAxIDMxMTQ2NjYKKzM0MCAxIDMxMzYwMDAKKzMzNSAxIDMxNTczMzMKKzMyNyAxIDMxNzg2NjYKKzM0OCAxIDMyMDAwMDAKKzMzOSAxIDMyMjEzMzMKKzMzNCAxIDMyNDI2NjYKKzM1MCAxIDMyNjQwMDAKKzMyNSAxIDMyODUzMzMKKzM2MSAxIDMzMDY2NjYKKzMzOCAxIDMzMjgwMDAKKzM1MCAxIDMzNDkzMzMKKzM1MyAxIDMzNzA2NjYKKzMyNyAxIDMzOTIwMDAKKzM0NiAxIDM0MTMzMzMKKzM0OCAxIDM0MzQ2NjYKKzMzOSAxIDM0NTYwMDAKKzM0MiAxIDM0NzczMzMKKzMzNCAxIDM0OTg2NjYKKzM1MCAxIDM1MjAwMDAKKzM1NCAxIDM1NDEzMzMKKzM2MyAxIDM1NjI2NjYKKzMyMiAxIDM1ODQwMDAKKzMzNyAxIDM2MDUzMzMKKzM1NSAxIDM2MjY2NjYKKzMyOSAxIDM2NDgwMDAKKzMyNCAxIDM2NjkzMzMKKzMzOCAxIDM2OTA2NjYKKzM1NiAxIDM3MTIwMDAKKzMzMCAxIDM3MzMzMzMKKzMyMSAxIDM3NTQ2NjYKKzMzNyAxIDM3NzYwMDAKKzM0NSAxIDM3OTczMzMKKzMzNSAxIDM4MTg2NjYKKzM0OCAxIDM4NDAwMDAKKzM0MiAxIDM4NjEzMzMKKzM0OCAxIDM4ODI2NjYKKzMzNSAxIDM5MDQwMDAKKzM0NCAxIDM5MjUzMzMKKzM1NyAxIDM5NDY2NjYKKzM2OCAxIDM5NjgwMDAKKzMyNCAxIDM5ODkzMzMKKzM0MyAxIDQwMTA2NjYKKzM0MSAxIDQwMzIwMDAKKzMyOSAxIDQwNTMzMzMKKzM1NiAxIDQwNzQ2NjYKKzMxNyAxIDQwOTYwMDAKKzM1MSAxIDQxMTczMzMKKzM0MCAxIDQxMzg2NjYKKzM0MCAxIDQxNjAwMDAKKzMzMiAxIDQxODEzMzMKKzM1NSAxIDQyMDI2NjYKKzM1NyAxIDQyMjQwMDAKKzMyNyAxIDQyNDUzMzMKKzMzOCAxIDQyNjY2NjYKKzMyMyAxIDQyODgwMDAKKzM0NiAxIDQzMDkzMzMKKzM1MiAxIDQzMzA2NjYKKzM0NyAxIDQzNTIwMDAKKzM0MyAxIDQzNzMzMzMKKzMxMSAxIDQzOTQ2NjYKKzMzOCAxIDQ0MTYwMDAKKzM2NSAxIDQ0MzczMzMKKzM0OSAxIDQ0NTg2NjYKKzMyNyAxIDQ0ODAwMDAKKzM1NSAxIDQ1MDEzMzMKKzMxOSAxIDQ1MjI2NjYKKzM0OSAxIDQ1NDQwMDAKKzM1MSAxIDQ1NjUzMzMKKzMzNyAxIDQ1ODY2NjYKKzM0MCAxIDQ2MDgwMDAKKzM0OSAxIDQ2MjkzMzMKKzMxNiAxIDQ2NTA2NjYKKzM0NCAxIDQ2NzIwMDAKKzMzNCAxIDQ2OTMzMzMKKzM0NCAxIDQ3MTQ2NjYKKzM0NyAxIDQ3MzYwMDAKKzM0OCAxIDQ3NTczMzMKKzMzNCAxIDQ3Nzg2NjYKKzMzOCAxIDQ4MDAwMDAKKzMzMSAxIDQ4MjEzMzMKKzM0NCAxIDQ4NDI2NjYKKzM0MiAxIDQ4NjQwMDAKKzMzNiAxIDQ4ODUzMzMKKzMyNiAxIDQ5MDY2NjYKKzM2NCAxIDQ5MjgwMDAKKzM1MCAxIDQ5NDkzMzMKKzM1MCAxIDQ5NzA2NjYKKzM2MyAxIDQ5OTIwMDAKKzM1OCAxIDUwMTMzMzMKKzMwNSAxIDUwMzQ2NjYKKzM0NCAxIDUwNTYwMDAKKzM0NiAxIDUwNzczMzMKKzM0MiAxIDUwOTg2NjYKKzMzMCAxIDUxMjAwMDAKKzMxOCAxIDUxNDEzMzMKKzM2MSAxIDUxNjI2NjYKKzM1NCAxIDUxODQwMDAKKzMxMyAxIDUyMDUzMzMKKzMzMCAxIDUyMjY2NjYKKzM1MCAxIDUyNDgwMDAKKzM0NyAxIDUyNjkzMzMKKzM0NiAxIDUyOTA2NjYKKzM1NyAxIDUzMTIwMDAKKzMyNSAxIDUzMzMzMzMKKzMzNSAxIDUzNTQ2NjYKKzMzMSAxIDUzNzYwMDAKKzM2NiAxIDUzOTczMzMKKzMyOSAxIDU0MTg2NjYKKzM0OSAxIDU0NDAwMDAKKzM3MSAxIDU0NjEzMzMKKzMyNiAxIDU0ODI2NjYKKzMzMyAxIDU1MDQwMDAKKzMxOSAxIDU1MjUzMzMKKzMyNyAxIDU1NDY2NjYKKzM1MyAxIDU1NjgwMDAKKzM1NiAxIDU1ODkzMzMKKzM0OCAxIDU2MTA2NjYKKzMzOCAxIDU2MzIwMDAKKzMzMSAxIDU2NTMzMzMKKzM0MSAxIDU2NzQ2NjYKKzM2MiAxIDU2OTYwMDAKKzMyNiAxIDU3MTczMzMKKzM1OSAxIDU3Mzg2NjYKKzMxNSAxIDU3NjAwMDAKKzM3NiAxIDU3ODEzMzMKKzM0MyAxIDU4MDI2NjYKKzM1NCAxIDU4MjQwMDAKKzM1MyAxIDU4NDUzMzMKKzM0NCAxIDU4NjY2NjYKKzMzNCAxIDU4ODgwMDAKKzM0NSAxIDU5MDkzMzMKKzM1NSAxIDU5MzA2NjYKKzMyMiAxIDU5NTIwMDAKKzMzNCAxIDU5NzMzMzMKKzM1MyAxIDU5OTQ2NjYKKzMzOCAxIDYwMTYwMDAKKzM1MSAxIDYwMzczMzMKKzMzNCAxIDYwNTg2NjYKKzMzOSAxIDYwODAwMDAKKzM0NSAxIDYxMDEzMzMKKzM0NyAxIDYxMjI2NjYKKzM1NSAxIDYxNDQwMDAKKzMxMiAxIDYxNjUzMzMKKzM1MiAxIDYxODY2NjYKKzM1NCAxIDYyMDgwMDAKKzMxOCAxIDYyMjkzMzMKKzM0NCAxIDYyNTA2NjYKKzM2MyAxIDYyNzIwMDAKKzMyMSAxIDYyOTMzMzMKKzMzOSAxIDYzMTQ2NjYKKzM1NiAxIDYzMzYwMDAKKzMzNCAxIDYzNTczMzMKKzM1NCAxIDYzNzg2NjYKKzMyNSAxIDY0MDAwMDAKKzMyMSAxIDY0MjEzMzMKKzM0MSAxIDY0NDI2NjYKKzMzNyAxIDY0NjQwMDAKKzM1MSAxIDY0ODUzMzMKKzM0MyAxIDY1MDY2NjYKKzM0MSAxIDY1MjgwMDAKKzM0NCAxIDY1NDkzMzMKKzM0MSAxIDY1NzA2NjYKKzM2NCAxIDY1OTIwMDAKKzMxOSAxIDY2MTMzMzMKKzM0OCAxIDY2MzQ2NjYKKzMzMiAxIDY2NTYwMDAKKzMzMyAxIDY2NzczMzMKKzM0MyAxIDY2OTg2NjYKKzM0OCAxIDY3MjAwMDAKKzM0NyAxIDY3NDEzMzMKKzM1MCAxIDY3NjI2NjYKKzM0MiAxIDY3ODQwMDAKKzM0MSAxIDY4MDUzMzMKKzMyNiAxIDY4MjY2NjYKKzM1MSAxIDY4NDgwMDAKKzMyOSAxIDY4NjkzMzMKKzMyMyAxIDY4OTA2NjYKKzM1MCAxIDY5MTIwMDAKKzM2MSAxIDY5MzMzMzMKKzMyNiAxIDY5NTQ2NjYKKzM0NSAxIDY5NzYwMDAKKzM0NSAxIDY5OTczMzMKKzMxMSAxIDcwMTg2NjYKKzM0OSAxIDcwNDAwMDAKKzM1OCAxIDcwNjEzMzMKKzM1MiAxIDcwODI2NjYKKzM0NyAxIDcxMDQwMDAKKzM2NCAxIDcxMjUzMzMKKzMyOCAxIDcxNDY2NjYKKzMxOCAxIDcxNjgwMDAKKzM1MSAxIDcxODkzMzMKKzM0MCAxIDcyMTA2NjYKKzM0MSAxIDcyMzIwMDAKKzM1NSAxIDcyNTMzMzMKKzMzNiAxIDcyNzQ2NjYKKzM1MiAxIDcyOTYwMDAKKzM0MSAxIDczMTczMzMKKzMzNCAxIDczMzg2NjYKKzM0OCAxIDczNjAwMDAKKzM0MiAxIDczODEzMzMKKzMzNSAxIDc0MDI2NjYKKzM0MiAxIDc0MjQwMDAKKzM1OSAxIDc0NDUzMzMKKzM0OSAxIDc0NjY2NjYKKzMyOSAxIDc0ODgwMDAKKzM1NiAxIDc1MDkzMzMKKzI5MiAxIDc1MzA2NjYKKzMxNiAxIDc1NTIwMDAKKzMxOCAxIDc1NzMzMzMKKzMyMCAxIDc1OTQ2NjYKKzM0MiAxIDc2MTYwMDAKKzI4NSAxIDc2MzczMzMKKzMyNiAxIDc2NTg2NjYKKzM1MiAxIDc2ODAwMDAKKzM5MiAxIDc3MDEzMzMKKzM2NCAxIDc3MjI2NjYKKzM4NCAxIDc3NDQwMDAKKzMzNCAxIDc3NjUzMzMKKzMxNyAxIDc3ODY2NjYKKzMyNiAxIDc4MDgwMDAKKzM3MyAxIDc4MjkzMzMKKzM1NCAxIDc4NTA2NjYKKzMyOSAxIDc4NzIwMDAKKzM0NyAxIDc4OTMzMzMKKzM1MyAxIDc5MTQ2NjYKKzMzOCAxIDc5MzYwMDAKKzMxNyAxIDc5NTczMzMKKzM1NCAxIDc5Nzg2NjYKKzM0NSAxIDgwMDAwMDAKKzM1MCAxIDgwMjEzMzMKKzM1MSAxIDgwNDI2NjYKKzMzMiAxIDgwNjQwMDAKKzM1OCAxIDgwODUzMzMKKzMxNSAxIDgxMDY2NjYKKzMzNiAxIDgxMjgwMDAKKzM1OCAxIDgxNDkzMzMKKzM0MyAxIDgxNzA2NjYKKzMxOSAxIDgxOTIwMDAKKzM3MCAxIDgyMTMzMzMKKzM0NCAxIDgyMzQ2NjYKKzM2MSAxIDgyNTYwMDAKKzM0MyAxIDgyNzczMzMKKzMzNyAxIDgyOTg2NjYKKzM1NCAxIDgzMjAwMDAKKzMzMiAxIDgzNDEzMzMKKzM0OCAxIDgzNjI2NjYKKzMyOCAxIDgzODQwMDAKKzM0NSAxIDg0MDUzMzMKKzM0MCAxIDg0MjY2NjYKKzM0NiAxIDg0NDgwMDAKKzM0MSAxIDg0NjkzMzMKKzM0NCAxIDg0OTA2NjYKKzM0MiAxIDg1MTIwMDAKKzM0MSAxIDg1MzMzMzMKKzM0NSAxIDg1NTQ2NjYKKzMzNyAxIDg1NzYwMDAKKzMzNSAxIDg1OTczMzMKKzMzNSAxIDg2MTg2NjYKKzM0MCAxIDg2NDAwMDAKKzM0NSAxIDg2NjEzMzMKKzM0MSAxIDg2ODI2NjYKKzM0MiAxIDg3MDQwMDAKKzMzOCAxIDg3MjUzMzMKKzM0MyAxIDg3NDY2NjYKKzMzNiAxIDg3NjgwMDAKKzMzOCAxIDg3ODkzMzMKKzM1MyAxIDg4MTA2NjYKKzMzOSAxIDg4MzIwMDAKKzMyOSAxIDg4NTMzMzMKKzM0OSAxIDg4NzQ2NjYKKzMyMyAxIDg4OTYwMDAKKzM1MSAxIDg5MTczMzMKKzM1OSAxIDg5Mzg2NjYKKzM1NyAxIDg5NjAwMDAKKzM0MSAxIDg5ODEzMzMKKzMzMyAxIDkwMDI2NjYKKzMzNSAxIDkwMjQwMDAKKzMyOCAxIDkwNDUzMzMKKzM0NyAxIDkwNjY2NjYKKzM0MyAxIDkwODgwMDAKKzM2OSAxIDkxMDkzMzMKKzMzMSAxIDkxMzA2NjYKKzM0NCAxIDkxNTIwMDAKKzMzMCAxIDkxNzMzMzMKKzM0NiAxIDkxOTQ2NjYKKzMzNyAxIDkyMTYwMDAKKzM0MSAxIDkyMzczMzMKKzMzOCAxIDkyNTg2NjYKKzMyOSAxIDkyODAwMDAKKzM2MCAxIDkzMDEzMzMKKzMzNiAxIDkzMjI2NjYKKzM0MSAxIDkzNDQwMDAKKzM0MSAxIDkzNjUzMzMKKzM0NSAxIDkzODY2NjYKKzM1MSAxIDk0MDgwMDAKKzM0OSAxIDk0MjkzMzMKKzMzNiAxIDk0NTA2NjYKKzMyNiAxIDk0NzIwMDAKKzM0OSAxIDk0OTMzMzMKKzM0MyAxIDk1MTQ2NjYKKzM1NyAxIDk1MzYwMDAKKzM0MiAxIDk1NTczMzMKKzMyNSAxIDk1Nzg2NjYKKzM0NiAxIDk2MDAwMDAKKzMyNiAxIDk2MjEzMzMKKzQwMiAxIDk2NDI2NjYKKzMzMSAxIDk2NjQwMDAKKzMzOSAxIDk2ODUzMzMKKzM3MSAxIDk3MDY2NjYKKzMxNCAxIDk3MjgwMDAKKzMxMCAxIDk3NDkzMzMKKzM2NCAxIDk3NzA2NjYKKzMzOCAxIDk3OTIwMDAKKzMzOSAxIDk4MTMzMzMKKzMzNyAxIDk4MzQ2NjYKKzM1NSAxIDk4NTYwMDAKKzM1MSAxIDk4NzczMzMKKzMzMiAxIDk4OTg2NjYKKzMxNiAxIDk5MjAwMDAKKzQ3NCAxIDk5NDEzMzMKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoel9tdWx0aV9mcmFtZS5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6X211bHRpX2ZyYW1lLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgyYWYyMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoel9tdWx0aV9mcmFtZS5pbmZvCkBAIC0wLDAgKzEsNDQzIEBACis1IDMyIDAKKzUgMzIgMAorMzM3IDEgMAorMzIyIDEgMjEzMzMKKzI3OSAxIDQyNjY2Cis1NjMgMSA2NDAwMAorNjM1IDEgMTA2NjY2Cis2MzQgMSAxNDkzMzMKKzYyOSAxIDE5MjAwMAorNjgwIDEgMjM0NjY2Cis2ODggMSAyNzczMzMKKzEwMzYgMSAzMjAwMDAKKzEwNDAgMSAzODQwMDAKKzEwMDkgMSA0NDgwMDAKKzEwMjAgMSA1MTIwMDAKKzEzNTcgMSA1NzYwMDAKKzEzNTMgMSA2NjEzMzMKKzEzNTEgMSA3NDY2NjYKKzEzNTEgMSA4MzIwMDAKKzM0MyAxIDkxNzMzMworMzM1IDEgOTM4NjY2CiszMzkgMSA5NjAwMDAKKzM0MiAxIDk4MTMzMworMzQ4IDEgMTAwMjY2NgorMzUwIDEgMTAyNDAwMAorMzUxIDEgMTA0NTMzMworMzQyIDEgMTA2NjY2NgorMzY2IDEgMTA4ODAwMAorMzQwIDEgMTEwOTMzMworMzU0IDEgMTEzMDY2NgorMzQwIDEgMTE1MjAwMAorMzM0IDEgMTE3MzMzMworMzM4IDEgMTE5NDY2NgorMzQwIDEgMTIxNjAwMAorMzUxIDEgMTIzNzMzMworMzQ2IDEgMTI1ODY2NgorMzMxIDEgMTI4MDAwMAorMzIxIDEgMTMwMTMzMworMzQzIDEgMTMyMjY2NgorMzQyIDEgMTM0NDAwMAorMzQ1IDEgMTM2NTMzMworMzI2IDEgMTM4NjY2NgorMzQyIDEgMTQwODAwMAorMzU2IDEgMTQyOTMzMworMzUxIDEgMTQ1MDY2NgorMzQzIDEgMTQ3MjAwMAorMzQ3IDEgMTQ5MzMzMworMzQ5IDEgMTUxNDY2NgorMzUwIDEgMTUzNjAwMAorMzMwIDEgMTU1NzMzMworMzQxIDEgMTU3ODY2NgorMzQwIDEgMTYwMDAwMAorMzMwIDEgMTYyMTMzMworMzQwIDEgMTY0MjY2NgorMzM1IDEgMTY2NDAwMAorMzQ0IDEgMTY4NTMzMworMzU5IDEgMTcwNjY2NgorMzM3IDEgMTcyODAwMAorMzQ2IDEgMTc0OTMzMworMzMwIDEgMTc3MDY2NgorMzUxIDEgMTc5MjAwMAorMzU1IDEgMTgxMzMzMworMzUyIDEgMTgzNDY2NgorMzI1IDEgMTg1NjAwMAorMzQyIDEgMTg3NzMzMworMzI3IDEgMTg5ODY2NgorMzQ5IDEgMTkyMDAwMAorMzI2IDEgMTk0MTMzMworMzM3IDEgMTk2MjY2NgorMzc4IDEgMTk4NDAwMAorMzIxIDEgMjAwNTMzMworMzE5IDEgMjAyNjY2NgorMzQ2IDEgMjA0ODAwMAorMzUyIDEgMjA2OTMzMworMzQ5IDEgMjA5MDY2NgorMzMxIDEgMjExMjAwMAorMzMwIDEgMjEzMzMzMworMzI5IDEgMjE1NDY2NgorMzMzIDEgMjE3NjAwMAorMzY3IDEgMjE5NzMzMworMzYyIDEgMjIxODY2NgorMzM3IDEgMjI0MDAwMAorMzM3IDEgMjI2MTMzMworMzYwIDEgMjI4MjY2NgorMzMzIDEgMjMwNDAwMAorMzE3IDEgMjMyNTMzMworMzQ0IDEgMjM0NjY2NgorMzM1IDEgMjM2ODAwMAorMzM3IDEgMjM4OTMzMworMzQ5IDEgMjQxMDY2NgorMzM2IDEgMjQzMjAwMAorMzQ4IDEgMjQ1MzMzMworMzQ5IDEgMjQ3NDY2NgorMzQyIDEgMjQ5NjAwMAorMzU5IDEgMjUxNzMzMworMzQwIDEgMjUzODY2NgorMzQwIDEgMjU2MDAwMAorMzQ4IDEgMjU4MTMzMworMzM0IDEgMjYwMjY2NgorMzI4IDEgMjYyNDAwMAorMzQxIDEgMjY0NTMzMworMzM5IDEgMjY2NjY2NgorMzM3IDEgMjY4ODAwMAorMzUwIDEgMjcwOTMzMworMzI2IDEgMjczMDY2NgorMzYwIDEgMjc1MjAwMAorMzQ0IDEgMjc3MzMzMworMzQwIDEgMjc5NDY2NgorMzQzIDEgMjgxNjAwMAorMzYxIDEgMjgzNzMzMworMzI5IDEgMjg1ODY2NgorMzQ1IDEgMjg4MDAwMAorMzQ1IDEgMjkwMTMzMworMzMwIDEgMjkyMjY2NgorMzQyIDEgMjk0NDAwMAorMzQ0IDEgMjk2NTMzMworMzMwIDEgMjk4NjY2NgorMzI5IDEgMzAwODAwMAorMzM1IDEgMzAyOTMzMworMzY2IDEgMzA1MDY2NgorMzI4IDEgMzA3MjAwMAorMzQ5IDEgMzA5MzMzMworMzM5IDEgMzExNDY2NgorMzQwIDEgMzEzNjAwMAorMzM1IDEgMzE1NzMzMworMzI3IDEgMzE3ODY2NgorMzQ4IDEgMzIwMDAwMAorMzM5IDEgMzIyMTMzMworMzM0IDEgMzI0MjY2NgorMzUwIDEgMzI2NDAwMAorMzI1IDEgMzI4NTMzMworMzYxIDEgMzMwNjY2NgorMzM4IDEgMzMyODAwMAorMzUwIDEgMzM0OTMzMworMzUzIDEgMzM3MDY2NgorMzI3IDEgMzM5MjAwMAorMzQ2IDEgMzQxMzMzMworMzQ4IDEgMzQzNDY2NgorMzM5IDEgMzQ1NjAwMAorMzQyIDEgMzQ3NzMzMworMzM0IDEgMzQ5ODY2NgorMzUwIDEgMzUyMDAwMAorMzU0IDEgMzU0MTMzMworMzYzIDEgMzU2MjY2NgorMzIyIDEgMzU4NDAwMAorMzM3IDEgMzYwNTMzMworMzU1IDEgMzYyNjY2NgorMzI5IDEgMzY0ODAwMAorMzI0IDEgMzY2OTMzMworMzM4IDEgMzY5MDY2NgorMzU2IDEgMzcxMjAwMAorMzMwIDEgMzczMzMzMworMzIxIDEgMzc1NDY2NgorMzM3IDEgMzc3NjAwMAorMzQ1IDEgMzc5NzMzMworMzM1IDEgMzgxODY2NgorMzQ4IDEgMzg0MDAwMAorMzQyIDEgMzg2MTMzMworMzQ4IDEgMzg4MjY2NgorMzM1IDEgMzkwNDAwMAorMzQ0IDEgMzkyNTMzMworMzU3IDEgMzk0NjY2NgorMzY4IDEgMzk2ODAwMAorMzI0IDEgMzk4OTMzMworMzQzIDEgNDAxMDY2NgorMzQxIDEgNDAzMjAwMAorMzI5IDEgNDA1MzMzMworMzU2IDEgNDA3NDY2NgorMzE3IDEgNDA5NjAwMAorMzUxIDEgNDExNzMzMworMzQwIDEgNDEzODY2NgorMzQwIDEgNDE2MDAwMAorMzMyIDEgNDE4MTMzMworMzU1IDEgNDIwMjY2NgorMzU3IDEgNDIyNDAwMAorMzI3IDEgNDI0NTMzMworMzM4IDEgNDI2NjY2NgorMzIzIDEgNDI4ODAwMAorMzQ2IDEgNDMwOTMzMworMzUyIDEgNDMzMDY2NgorMzQ3IDEgNDM1MjAwMAorMzQzIDEgNDM3MzMzMworMzExIDEgNDM5NDY2NgorMzM4IDEgNDQxNjAwMAorMzY1IDEgNDQzNzMzMworMzQ5IDEgNDQ1ODY2NgorMzI3IDEgNDQ4MDAwMAorMzU1IDEgNDUwMTMzMworMzE5IDEgNDUyMjY2NgorMzQ5IDEgNDU0NDAwMAorMzUxIDEgNDU2NTMzMworMzM3IDEgNDU4NjY2NgorMzQwIDEgNDYwODAwMAorMzQ5IDEgNDYyOTMzMworMzE2IDEgNDY1MDY2NgorMzQ0IDEgNDY3MjAwMAorMzM0IDEgNDY5MzMzMworMzQ0IDEgNDcxNDY2NgorMzQ3IDEgNDczNjAwMAorMzQ4IDEgNDc1NzMzMworMzM0IDEgNDc3ODY2NgorMzM4IDEgNDgwMDAwMAorMzMxIDEgNDgyMTMzMworMzQ0IDEgNDg0MjY2NgorMzQyIDEgNDg2NDAwMAorMzM2IDEgNDg4NTMzMworMzI2IDEgNDkwNjY2NgorMzY0IDEgNDkyODAwMAorMzUwIDEgNDk0OTMzMworMzUwIDEgNDk3MDY2NgorMzYzIDEgNDk5MjAwMAorMzU4IDEgNTAxMzMzMworMzA1IDEgNTAzNDY2NgorMzQ0IDEgNTA1NjAwMAorMzQ2IDEgNTA3NzMzMworMzQyIDEgNTA5ODY2NgorMzMwIDEgNTEyMDAwMAorMzE4IDEgNTE0MTMzMworMzYxIDEgNTE2MjY2NgorMzU0IDEgNTE4NDAwMAorMzEzIDEgNTIwNTMzMworMzMwIDEgNTIyNjY2NgorMzUwIDEgNTI0ODAwMAorMzQ3IDEgNTI2OTMzMworMzQ2IDEgNTI5MDY2NgorMzU3IDEgNTMxMjAwMAorMzI1IDEgNTMzMzMzMworMzM1IDEgNTM1NDY2NgorMzMxIDEgNTM3NjAwMAorMzY2IDEgNTM5NzMzMworMzI5IDEgNTQxODY2NgorMzQ5IDEgNTQ0MDAwMAorMzcxIDEgNTQ2MTMzMworMzI2IDEgNTQ4MjY2NgorMzMzIDEgNTUwNDAwMAorMzE5IDEgNTUyNTMzMworMzI3IDEgNTU0NjY2NgorMzUzIDEgNTU2ODAwMAorMzU2IDEgNTU4OTMzMworMzQ4IDEgNTYxMDY2NgorMzM4IDEgNTYzMjAwMAorMzMxIDEgNTY1MzMzMworMzQxIDEgNTY3NDY2NgorMzYyIDEgNTY5NjAwMAorMzI2IDEgNTcxNzMzMworMzU5IDEgNTczODY2NgorMzE1IDEgNTc2MDAwMAorMzc2IDEgNTc4MTMzMworMzQzIDEgNTgwMjY2NgorMzU0IDEgNTgyNDAwMAorMzUzIDEgNTg0NTMzMworMzQ0IDEgNTg2NjY2NgorMzM0IDEgNTg4ODAwMAorMzQ1IDEgNTkwOTMzMworMzU1IDEgNTkzMDY2NgorMzIyIDEgNTk1MjAwMAorMzM0IDEgNTk3MzMzMworMzUzIDEgNTk5NDY2NgorMzM4IDEgNjAxNjAwMAorMzUxIDEgNjAzNzMzMworMzM0IDEgNjA1ODY2NgorMzM5IDEgNjA4MDAwMAorMzQ1IDEgNjEwMTMzMworMzQ3IDEgNjEyMjY2NgorMzU1IDEgNjE0NDAwMAorMzEyIDEgNjE2NTMzMworMzUyIDEgNjE4NjY2NgorMzU0IDEgNjIwODAwMAorMzE4IDEgNjIyOTMzMworMzQ0IDEgNjI1MDY2NgorMzYzIDEgNjI3MjAwMAorMzIxIDEgNjI5MzMzMworMzM5IDEgNjMxNDY2NgorMzU2IDEgNjMzNjAwMAorMzM0IDEgNjM1NzMzMworMzU0IDEgNjM3ODY2NgorMzI1IDEgNjQwMDAwMAorMzIxIDEgNjQyMTMzMworMzQxIDEgNjQ0MjY2NgorMzM3IDEgNjQ2NDAwMAorMzUxIDEgNjQ4NTMzMworMzQzIDEgNjUwNjY2NgorMzQxIDEgNjUyODAwMAorMzQ0IDEgNjU0OTMzMworMzQxIDEgNjU3MDY2NgorMzY0IDEgNjU5MjAwMAorMzE5IDEgNjYxMzMzMworMzQ4IDEgNjYzNDY2NgorMzMyIDEgNjY1NjAwMAorMzMzIDEgNjY3NzMzMworMzQzIDEgNjY5ODY2NgorMzQ4IDEgNjcyMDAwMAorMzQ3IDEgNjc0MTMzMworMzUwIDEgNjc2MjY2NgorMzQyIDEgNjc4NDAwMAorMzQxIDEgNjgwNTMzMworMzI2IDEgNjgyNjY2NgorMzUxIDEgNjg0ODAwMAorMzI5IDEgNjg2OTMzMworMzIzIDEgNjg5MDY2NgorMzUwIDEgNjkxMjAwMAorMzYxIDEgNjkzMzMzMworMzI2IDEgNjk1NDY2NgorMzQ1IDEgNjk3NjAwMAorMzQ1IDEgNjk5NzMzMworMzExIDEgNzAxODY2NgorMzQ5IDEgNzA0MDAwMAorMzU4IDEgNzA2MTMzMworMzUyIDEgNzA4MjY2NgorMzQ3IDEgNzEwNDAwMAorMzY0IDEgNzEyNTMzMworMzI4IDEgNzE0NjY2NgorMzE4IDEgNzE2ODAwMAorMzUxIDEgNzE4OTMzMworMzQwIDEgNzIxMDY2NgorMzQxIDEgNzIzMjAwMAorMzU1IDEgNzI1MzMzMworMzM2IDEgNzI3NDY2NgorMzUyIDEgNzI5NjAwMAorMzQxIDEgNzMxNzMzMworMzM0IDEgNzMzODY2NgorMzQ4IDEgNzM2MDAwMAorMzQyIDEgNzM4MTMzMworMzM1IDEgNzQwMjY2NgorMzQyIDEgNzQyNDAwMAorMzU5IDEgNzQ0NTMzMworMzQ5IDEgNzQ2NjY2NgorMzI5IDEgNzQ4ODAwMAorMzU2IDEgNzUwOTMzMworMjkyIDEgNzUzMDY2NgorMzE2IDEgNzU1MjAwMAorMzE4IDEgNzU3MzMzMworMzIwIDEgNzU5NDY2NgorMzQyIDEgNzYxNjAwMAorMjg1IDEgNzYzNzMzMworMzI2IDEgNzY1ODY2NgorMzUyIDEgNzY4MDAwMAorMzkyIDEgNzcwMTMzMworMzY0IDEgNzcyMjY2NgorMzg0IDEgNzc0NDAwMAorMzM0IDEgNzc2NTMzMworMzE3IDEgNzc4NjY2NgorMzI2IDEgNzgwODAwMAorMzczIDEgNzgyOTMzMworMzU0IDEgNzg1MDY2NgorMzI5IDEgNzg3MjAwMAorMzQ3IDEgNzg5MzMzMworMzUzIDEgNzkxNDY2NgorMzM4IDEgNzkzNjAwMAorMzE3IDEgNzk1NzMzMworMzU0IDEgNzk3ODY2NgorMzQ1IDEgODAwMDAwMAorMzUwIDEgODAyMTMzMworMzUxIDEgODA0MjY2NgorMzMyIDEgODA2NDAwMAorMzU4IDEgODA4NTMzMworMzE1IDEgODEwNjY2NgorMzM2IDEgODEyODAwMAorMzU4IDEgODE0OTMzMworMzQzIDEgODE3MDY2NgorMzE5IDEgODE5MjAwMAorMzcwIDEgODIxMzMzMworMzQ0IDEgODIzNDY2NgorMzYxIDEgODI1NjAwMAorMzQzIDEgODI3NzMzMworMzM3IDEgODI5ODY2NgorMzU0IDEgODMyMDAwMAorMzMyIDEgODM0MTMzMworMzQ4IDEgODM2MjY2NgorMzI4IDEgODM4NDAwMAorMzQ1IDEgODQwNTMzMworMzQwIDEgODQyNjY2NgorMzQ2IDEgODQ0ODAwMAorMzQxIDEgODQ2OTMzMworMzQ0IDEgODQ5MDY2NgorMzQyIDEgODUxMjAwMAorMzQxIDEgODUzMzMzMworMzQ1IDEgODU1NDY2NgorMzM3IDEgODU3NjAwMAorMzM1IDEgODU5NzMzMworMzM1IDEgODYxODY2NgorMzQwIDEgODY0MDAwMAorMzQ1IDEgODY2MTMzMworMzQxIDEgODY4MjY2NgorMzQyIDEgODcwNDAwMAorMzM4IDEgODcyNTMzMworMzQzIDEgODc0NjY2NgorMzM2IDEgODc2ODAwMAorMzM4IDEgODc4OTMzMworMzUzIDEgODgxMDY2NgorMzM5IDEgODgzMjAwMAorMzI5IDEgODg1MzMzMworMzQ5IDEgODg3NDY2NgorMzIzIDEgODg5NjAwMAorMzUxIDEgODkxNzMzMworMzU5IDEgODkzODY2NgorMzU3IDEgODk2MDAwMAorMzQxIDEgODk4MTMzMworMzMzIDEgOTAwMjY2NgorMzM1IDEgOTAyNDAwMAorMzI4IDEgOTA0NTMzMworMzQ3IDEgOTA2NjY2NgorMzQzIDEgOTA4ODAwMAorMzY5IDEgOTEwOTMzMworMzMxIDEgOTEzMDY2NgorMzQ0IDEgOTE1MjAwMAorMzMwIDEgOTE3MzMzMworMzQ2IDEgOTE5NDY2NgorMzM3IDEgOTIxNjAwMAorMzQxIDEgOTIzNzMzMworMzM4IDEgOTI1ODY2NgorMzI5IDEgOTI4MDAwMAorMzYwIDEgOTMwMTMzMworMzM2IDEgOTMyMjY2NgorMzQxIDEgOTM0NDAwMAorMzQxIDEgOTM2NTMzMworMzQ1IDEgOTM4NjY2NgorMzUxIDEgOTQwODAwMAorMzQ5IDEgOTQyOTMzMworMzM2IDEgOTQ1MDY2NgorMzI2IDEgOTQ3MjAwMAorMzQ5IDEgOTQ5MzMzMworMzQzIDEgOTUxNDY2NgorMzU3IDEgOTUzNjAwMAorMzQyIDEgOTU1NzMzMworMzI1IDEgOTU3ODY2NgorMzQ2IDEgOTYwMDAwMAorMzI2IDEgOTYyMTMzMworNDAyIDEgOTY0MjY2NgorMzMxIDEgOTY2NDAwMAorMzM5IDEgOTY4NTMzMworMzcxIDEgOTcwNjY2NgorMzE0IDEgOTcyODAwMAorMzEwIDEgOTc0OTMzMworMzY0IDEgOTc3MDY2NgorMzM4IDEgOTc5MjAwMAorMzM5IDEgOTgxMzMzMworMzM3IDEgOTgzNDY2NgorMzU1IDEgOTg1NjAwMAorMzUxIDEgOTg3NzMzMworMzMyIDEgOTg5ODY2NgorMzE2IDEgOTkyMDAwMAorNDc0IDEgOTk0MTMzMwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5hbXJ3YiBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHouYW1yd2IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ4MjU5MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHouYW1yd2IKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YTYxZDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmluZm8KQEAgLTAsMCArMSw0OTQgQEAKKzQxIDEgMAorNDEgMSAyMDAwMAorNDEgMSA0MDAwMAorNDEgMSA2MDAwMAorNDEgMSA4MDAwMAorNDEgMSAxMDAwMDAKKzQxIDEgMTIwMDAwCis0MSAxIDE0MDAwMAorNDEgMSAxNjAwMDAKKzQxIDEgMTgwMDAwCis0MSAxIDIwMDAwMAorNDEgMSAyMjAwMDAKKzQxIDEgMjQwMDAwCis0MSAxIDI2MDAwMAorNDEgMSAyODAwMDAKKzQxIDEgMzAwMDAwCis0MSAxIDMyMDAwMAorNDEgMSAzNDAwMDAKKzQxIDEgMzYwMDAwCis0MSAxIDM4MDAwMAorNDEgMSA0MDAwMDAKKzQxIDEgNDIwMDAwCis0MSAxIDQ0MDAwMAorNDEgMSA0NjAwMDAKKzQxIDEgNDgwMDAwCis0MSAxIDUwMDAwMAorNDEgMSA1MjAwMDAKKzQxIDEgNTQwMDAwCis0MSAxIDU2MDAwMAorNDEgMSA1ODAwMDAKKzQxIDEgNjAwMDAwCis0MSAxIDYyMDAwMAorNDEgMSA2NDAwMDAKKzQxIDEgNjYwMDAwCis0MSAxIDY4MDAwMAorNDEgMSA3MDAwMDAKKzQxIDEgNzIwMDAwCis0MSAxIDc0MDAwMAorNDEgMSA3NjAwMDAKKzQxIDEgNzgwMDAwCis0MSAxIDgwMDAwMAorNDEgMSA4MjAwMDAKKzQxIDEgODQwMDAwCis0MSAxIDg2MDAwMAorNDEgMSA4ODAwMDAKKzQxIDEgOTAwMDAwCis0MSAxIDkyMDAwMAorNDEgMSA5NDAwMDAKKzQxIDEgOTYwMDAwCis0MSAxIDk4MDAwMAorNDEgMSAxMDAwMDAwCis0MSAxIDEwMjAwMDAKKzQxIDEgMTA0MDAwMAorNDEgMSAxMDYwMDAwCis0MSAxIDEwODAwMDAKKzQxIDEgMTEwMDAwMAorNDEgMSAxMTIwMDAwCis0MSAxIDExNDAwMDAKKzQxIDEgMTE2MDAwMAorNDEgMSAxMTgwMDAwCis0MSAxIDEyMDAwMDAKKzQxIDEgMTIyMDAwMAorNDEgMSAxMjQwMDAwCis0MSAxIDEyNjAwMDAKKzQxIDEgMTI4MDAwMAorNDEgMSAxMzAwMDAwCis0MSAxIDEzMjAwMDAKKzQxIDEgMTM0MDAwMAorNDEgMSAxMzYwMDAwCis0MSAxIDEzODAwMDAKKzQxIDEgMTQwMDAwMAorNDEgMSAxNDIwMDAwCis0MSAxIDE0NDAwMDAKKzQxIDEgMTQ2MDAwMAorNDEgMSAxNDgwMDAwCis0MSAxIDE1MDAwMDAKKzQxIDEgMTUyMDAwMAorNDEgMSAxNTQwMDAwCis0MSAxIDE1NjAwMDAKKzQxIDEgMTU4MDAwMAorNDEgMSAxNjAwMDAwCis0MSAxIDE2MjAwMDAKKzQxIDEgMTY0MDAwMAorNDEgMSAxNjYwMDAwCis0MSAxIDE2ODAwMDAKKzQxIDEgMTcwMDAwMAorNDEgMSAxNzIwMDAwCis0MSAxIDE3NDAwMDAKKzQxIDEgMTc2MDAwMAorNDEgMSAxNzgwMDAwCis0MSAxIDE4MDAwMDAKKzQxIDEgMTgyMDAwMAorNDEgMSAxODQwMDAwCis0MSAxIDE4NjAwMDAKKzQxIDEgMTg4MDAwMAorNDEgMSAxOTAwMDAwCis0MSAxIDE5MjAwMDAKKzQxIDEgMTk0MDAwMAorNDEgMSAxOTYwMDAwCis0MSAxIDE5ODAwMDAKKzQxIDEgMjAwMDAwMAorNDEgMSAyMDIwMDAwCis0MSAxIDIwNDAwMDAKKzQxIDEgMjA2MDAwMAorNDEgMSAyMDgwMDAwCis0MSAxIDIxMDAwMDAKKzQxIDEgMjEyMDAwMAorNDEgMSAyMTQwMDAwCis0MSAxIDIxNjAwMDAKKzQxIDEgMjE4MDAwMAorNDEgMSAyMjAwMDAwCis0MSAxIDIyMjAwMDAKKzQxIDEgMjI0MDAwMAorNDEgMSAyMjYwMDAwCis0MSAxIDIyODAwMDAKKzQxIDEgMjMwMDAwMAorNDEgMSAyMzIwMDAwCis0MSAxIDIzNDAwMDAKKzQxIDEgMjM2MDAwMAorNDEgMSAyMzgwMDAwCis0MSAxIDI0MDAwMDAKKzQxIDEgMjQyMDAwMAorNDEgMSAyNDQwMDAwCis0MSAxIDI0NjAwMDAKKzQxIDEgMjQ4MDAwMAorNDEgMSAyNTAwMDAwCis0MSAxIDI1MjAwMDAKKzQxIDEgMjU0MDAwMAorNDEgMSAyNTYwMDAwCis0MSAxIDI1ODAwMDAKKzQxIDEgMjYwMDAwMAorNDEgMSAyNjIwMDAwCis0MSAxIDI2NDAwMDAKKzQxIDEgMjY2MDAwMAorNDEgMSAyNjgwMDAwCis0MSAxIDI3MDAwMDAKKzQxIDEgMjcyMDAwMAorNDEgMSAyNzQwMDAwCis0MSAxIDI3NjAwMDAKKzQxIDEgMjc4MDAwMAorNDEgMSAyODAwMDAwCis0MSAxIDI4MjAwMDAKKzQxIDEgMjg0MDAwMAorNDEgMSAyODYwMDAwCis0MSAxIDI4ODAwMDAKKzQxIDEgMjkwMDAwMAorNDEgMSAyOTIwMDAwCis0MSAxIDI5NDAwMDAKKzQxIDEgMjk2MDAwMAorNDEgMSAyOTgwMDAwCis0MSAxIDMwMDAwMDAKKzQxIDEgMzAyMDAwMAorNDEgMSAzMDQwMDAwCis0MSAxIDMwNjAwMDAKKzQxIDEgMzA4MDAwMAorNDEgMSAzMTAwMDAwCis0MSAxIDMxMjAwMDAKKzQxIDEgMzE0MDAwMAorNDEgMSAzMTYwMDAwCis0MSAxIDMxODAwMDAKKzQxIDEgMzIwMDAwMAorNDEgMSAzMjIwMDAwCis0MSAxIDMyNDAwMDAKKzQxIDEgMzI2MDAwMAorNDEgMSAzMjgwMDAwCis0MSAxIDMzMDAwMDAKKzQxIDEgMzMyMDAwMAorNDEgMSAzMzQwMDAwCis0MSAxIDMzNjAwMDAKKzQxIDEgMzM4MDAwMAorNDEgMSAzNDAwMDAwCis0MSAxIDM0MjAwMDAKKzQxIDEgMzQ0MDAwMAorNDEgMSAzNDYwMDAwCis0MSAxIDM0ODAwMDAKKzQxIDEgMzUwMDAwMAorNDEgMSAzNTIwMDAwCis0MSAxIDM1NDAwMDAKKzQxIDEgMzU2MDAwMAorNDEgMSAzNTgwMDAwCis0MSAxIDM2MDAwMDAKKzQxIDEgMzYyMDAwMAorNDEgMSAzNjQwMDAwCis0MSAxIDM2NjAwMDAKKzQxIDEgMzY4MDAwMAorNDEgMSAzNzAwMDAwCis0MSAxIDM3MjAwMDAKKzQxIDEgMzc0MDAwMAorNDEgMSAzNzYwMDAwCis0MSAxIDM3ODAwMDAKKzQxIDEgMzgwMDAwMAorNDEgMSAzODIwMDAwCis0MSAxIDM4NDAwMDAKKzQxIDEgMzg2MDAwMAorNDEgMSAzODgwMDAwCis0MSAxIDM5MDAwMDAKKzQxIDEgMzkyMDAwMAorNDEgMSAzOTQwMDAwCis0MSAxIDM5NjAwMDAKKzQxIDEgMzk4MDAwMAorNDEgMSA0MDAwMDAwCis0MSAxIDQwMjAwMDAKKzQxIDEgNDA0MDAwMAorNDEgMSA0MDYwMDAwCis0MSAxIDQwODAwMDAKKzQxIDEgNDEwMDAwMAorNDEgMSA0MTIwMDAwCis0MSAxIDQxNDAwMDAKKzQxIDEgNDE2MDAwMAorNDEgMSA0MTgwMDAwCis0MSAxIDQyMDAwMDAKKzQxIDEgNDIyMDAwMAorNDEgMSA0MjQwMDAwCis0MSAxIDQyNjAwMDAKKzQxIDEgNDI4MDAwMAorNDEgMSA0MzAwMDAwCis0MSAxIDQzMjAwMDAKKzQxIDEgNDM0MDAwMAorNDEgMSA0MzYwMDAwCis0MSAxIDQzODAwMDAKKzQxIDEgNDQwMDAwMAorNDEgMSA0NDIwMDAwCis0MSAxIDQ0NDAwMDAKKzQxIDEgNDQ2MDAwMAorNDEgMSA0NDgwMDAwCis0MSAxIDQ1MDAwMDAKKzQxIDEgNDUyMDAwMAorNDEgMSA0NTQwMDAwCis0MSAxIDQ1NjAwMDAKKzQxIDEgNDU4MDAwMAorNDEgMSA0NjAwMDAwCis0MSAxIDQ2MjAwMDAKKzQxIDEgNDY0MDAwMAorNDEgMSA0NjYwMDAwCis0MSAxIDQ2ODAwMDAKKzQxIDEgNDcwMDAwMAorNDEgMSA0NzIwMDAwCis0MSAxIDQ3NDAwMDAKKzQxIDEgNDc2MDAwMAorNDEgMSA0NzgwMDAwCis0MSAxIDQ4MDAwMDAKKzQxIDEgNDgyMDAwMAorNDEgMSA0ODQwMDAwCis0MSAxIDQ4NjAwMDAKKzQxIDEgNDg4MDAwMAorNDEgMSA0OTAwMDAwCis0MSAxIDQ5MjAwMDAKKzQxIDEgNDk0MDAwMAorNDEgMSA0OTYwMDAwCis0MSAxIDQ5ODAwMDAKKzQxIDEgNTAwMDAwMAorNDEgMSA1MDIwMDAwCis0MSAxIDUwNDAwMDAKKzQxIDEgNTA2MDAwMAorNDEgMSA1MDgwMDAwCis0MSAxIDUxMDAwMDAKKzQxIDEgNTEyMDAwMAorNDEgMSA1MTQwMDAwCis0MSAxIDUxNjAwMDAKKzQxIDEgNTE4MDAwMAorNDEgMSA1MjAwMDAwCis0MSAxIDUyMjAwMDAKKzQxIDEgNTI0MDAwMAorNDEgMSA1MjYwMDAwCis0MSAxIDUyODAwMDAKKzQxIDEgNTMwMDAwMAorNDEgMSA1MzIwMDAwCis0MSAxIDUzNDAwMDAKKzQxIDEgNTM2MDAwMAorNDEgMSA1MzgwMDAwCis0MSAxIDU0MDAwMDAKKzQxIDEgNTQyMDAwMAorNDEgMSA1NDQwMDAwCis0MSAxIDU0NjAwMDAKKzQxIDEgNTQ4MDAwMAorNDEgMSA1NTAwMDAwCis0MSAxIDU1MjAwMDAKKzQxIDEgNTU0MDAwMAorNDEgMSA1NTYwMDAwCis0MSAxIDU1ODAwMDAKKzQxIDEgNTYwMDAwMAorNDEgMSA1NjIwMDAwCis0MSAxIDU2NDAwMDAKKzQxIDEgNTY2MDAwMAorNDEgMSA1NjgwMDAwCis0MSAxIDU3MDAwMDAKKzQxIDEgNTcyMDAwMAorNDEgMSA1NzQwMDAwCis0MSAxIDU3NjAwMDAKKzQxIDEgNTc4MDAwMAorNDEgMSA1ODAwMDAwCis0MSAxIDU4MjAwMDAKKzQxIDEgNTg0MDAwMAorNDEgMSA1ODYwMDAwCis0MSAxIDU4ODAwMDAKKzQxIDEgNTkwMDAwMAorNDEgMSA1OTIwMDAwCis0MSAxIDU5NDAwMDAKKzQxIDEgNTk2MDAwMAorNDEgMSA1OTgwMDAwCis0MSAxIDYwMDAwMDAKKzQxIDEgNjAyMDAwMAorNDEgMSA2MDQwMDAwCis0MSAxIDYwNjAwMDAKKzQxIDEgNjA4MDAwMAorNDEgMSA2MTAwMDAwCis0MSAxIDYxMjAwMDAKKzQxIDEgNjE0MDAwMAorNDEgMSA2MTYwMDAwCis0MSAxIDYxODAwMDAKKzQxIDEgNjIwMDAwMAorNDEgMSA2MjIwMDAwCis0MSAxIDYyNDAwMDAKKzQxIDEgNjI2MDAwMAorNDEgMSA2MjgwMDAwCis0MSAxIDYzMDAwMDAKKzQxIDEgNjMyMDAwMAorNDEgMSA2MzQwMDAwCis0MSAxIDYzNjAwMDAKKzQxIDEgNjM4MDAwMAorNDEgMSA2NDAwMDAwCis0MSAxIDY0MjAwMDAKKzQxIDEgNjQ0MDAwMAorNDEgMSA2NDYwMDAwCis0MSAxIDY0ODAwMDAKKzQxIDEgNjUwMDAwMAorNDEgMSA2NTIwMDAwCis0MSAxIDY1NDAwMDAKKzQxIDEgNjU2MDAwMAorNDEgMSA2NTgwMDAwCis0MSAxIDY2MDAwMDAKKzQxIDEgNjYyMDAwMAorNDEgMSA2NjQwMDAwCis0MSAxIDY2NjAwMDAKKzQxIDEgNjY4MDAwMAorNDEgMSA2NzAwMDAwCis0MSAxIDY3MjAwMDAKKzQxIDEgNjc0MDAwMAorNDEgMSA2NzYwMDAwCis0MSAxIDY3ODAwMDAKKzQxIDEgNjgwMDAwMAorNDEgMSA2ODIwMDAwCis0MSAxIDY4NDAwMDAKKzQxIDEgNjg2MDAwMAorNDEgMSA2ODgwMDAwCis0MSAxIDY5MDAwMDAKKzQxIDEgNjkyMDAwMAorNDEgMSA2OTQwMDAwCis0MSAxIDY5NjAwMDAKKzQxIDEgNjk4MDAwMAorNDEgMSA3MDAwMDAwCis0MSAxIDcwMjAwMDAKKzQxIDEgNzA0MDAwMAorNDEgMSA3MDYwMDAwCis0MSAxIDcwODAwMDAKKzQxIDEgNzEwMDAwMAorNDEgMSA3MTIwMDAwCis0MSAxIDcxNDAwMDAKKzQxIDEgNzE2MDAwMAorNDEgMSA3MTgwMDAwCis0MSAxIDcyMDAwMDAKKzQxIDEgNzIyMDAwMAorNDEgMSA3MjQwMDAwCis0MSAxIDcyNjAwMDAKKzQxIDEgNzI4MDAwMAorNDEgMSA3MzAwMDAwCis0MSAxIDczMjAwMDAKKzQxIDEgNzM0MDAwMAorNDEgMSA3MzYwMDAwCis0MSAxIDczODAwMDAKKzQxIDEgNzQwMDAwMAorNDEgMSA3NDIwMDAwCis0MSAxIDc0NDAwMDAKKzQxIDEgNzQ2MDAwMAorNDEgMSA3NDgwMDAwCis0MSAxIDc1MDAwMDAKKzQxIDEgNzUyMDAwMAorNDEgMSA3NTQwMDAwCis0MSAxIDc1NjAwMDAKKzQxIDEgNzU4MDAwMAorNDEgMSA3NjAwMDAwCis0MSAxIDc2MjAwMDAKKzQxIDEgNzY0MDAwMAorNDEgMSA3NjYwMDAwCis0MSAxIDc2ODAwMDAKKzQxIDEgNzcwMDAwMAorNDEgMSA3NzIwMDAwCis0MSAxIDc3NDAwMDAKKzQxIDEgNzc2MDAwMAorNDEgMSA3NzgwMDAwCis0MSAxIDc4MDAwMDAKKzQxIDEgNzgyMDAwMAorNDEgMSA3ODQwMDAwCis0MSAxIDc4NjAwMDAKKzQxIDEgNzg4MDAwMAorNDEgMSA3OTAwMDAwCis0MSAxIDc5MjAwMDAKKzQxIDEgNzk0MDAwMAorNDEgMSA3OTYwMDAwCis0MSAxIDc5ODAwMDAKKzQxIDEgODAwMDAwMAorNDEgMSA4MDIwMDAwCis0MSAxIDgwNDAwMDAKKzQxIDEgODA2MDAwMAorNDEgMSA4MDgwMDAwCis0MSAxIDgxMDAwMDAKKzQxIDEgODEyMDAwMAorNDEgMSA4MTQwMDAwCis0MSAxIDgxNjAwMDAKKzQxIDEgODE4MDAwMAorNDEgMSA4MjAwMDAwCis0MSAxIDgyMjAwMDAKKzQxIDEgODI0MDAwMAorNDEgMSA4MjYwMDAwCis0MSAxIDgyODAwMDAKKzQxIDEgODMwMDAwMAorNDEgMSA4MzIwMDAwCis0MSAxIDgzNDAwMDAKKzQxIDEgODM2MDAwMAorNDEgMSA4MzgwMDAwCis0MSAxIDg0MDAwMDAKKzQxIDEgODQyMDAwMAorNDEgMSA4NDQwMDAwCis0MSAxIDg0NjAwMDAKKzQxIDEgODQ4MDAwMAorNDEgMSA4NTAwMDAwCis0MSAxIDg1MjAwMDAKKzQxIDEgODU0MDAwMAorNDEgMSA4NTYwMDAwCis0MSAxIDg1ODAwMDAKKzQxIDEgODYwMDAwMAorNDEgMSA4NjIwMDAwCis0MSAxIDg2NDAwMDAKKzQxIDEgODY2MDAwMAorNDEgMSA4NjgwMDAwCis0MSAxIDg3MDAwMDAKKzQxIDEgODcyMDAwMAorNDEgMSA4NzQwMDAwCis0MSAxIDg3NjAwMDAKKzQxIDEgODc4MDAwMAorNDEgMSA4ODAwMDAwCis0MSAxIDg4MjAwMDAKKzQxIDEgODg0MDAwMAorNDEgMSA4ODYwMDAwCis0MSAxIDg4ODAwMDAKKzQxIDEgODkwMDAwMAorNDEgMSA4OTIwMDAwCis0MSAxIDg5NDAwMDAKKzQxIDEgODk2MDAwMAorNDEgMSA4OTgwMDAwCis0MSAxIDkwMDAwMDAKKzQxIDEgOTAyMDAwMAorNDEgMSA5MDQwMDAwCis0MSAxIDkwNjAwMDAKKzQxIDEgOTA4MDAwMAorNDEgMSA5MTAwMDAwCis0MSAxIDkxMjAwMDAKKzQxIDEgOTE0MDAwMAorNDEgMSA5MTYwMDAwCis0MSAxIDkxODAwMDAKKzQxIDEgOTIwMDAwMAorNDEgMSA5MjIwMDAwCis0MSAxIDkyNDAwMDAKKzQxIDEgOTI2MDAwMAorNDEgMSA5MjgwMDAwCis0MSAxIDkzMDAwMDAKKzQxIDEgOTMyMDAwMAorNDEgMSA5MzQwMDAwCis0MSAxIDkzNjAwMDAKKzQxIDEgOTM4MDAwMAorNDEgMSA5NDAwMDAwCis0MSAxIDk0MjAwMDAKKzQxIDEgOTQ0MDAwMAorNDEgMSA5NDYwMDAwCis0MSAxIDk0ODAwMDAKKzQxIDEgOTUwMDAwMAorNDEgMSA5NTIwMDAwCis0MSAxIDk1NDAwMDAKKzQxIDEgOTU2MDAwMAorNDEgMSA5NTgwMDAwCis0MSAxIDk2MDAwMDAKKzQxIDEgOTYyMDAwMAorNDEgMSA5NjQwMDAwCis0MSAxIDk2NjAwMDAKKzQxIDEgOTY4MDAwMAorNDEgMSA5NzAwMDAwCis0MSAxIDk3MjAwMDAKKzQxIDEgOTc0MDAwMAorNDEgMSA5NzYwMDAwCis0MSAxIDk3ODAwMDAKKzQxIDEgOTgwMDAwMAorNDEgMSA5ODIwMDAwCis0MSAxIDk4NDAwMDAKKzQxIDEgOTg2MDAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoel9tdWx0aV9mcmFtZS5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoel9tdWx0aV9mcmFtZS5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MjAwMDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6X211bHRpX2ZyYW1lLmluZm8KQEAgLTAsMCArMSw0NjAgQEAKKzQxIDEgMAorNDEgMSAyMDAwMAorODIgMSA0MDAwMAorODIgMSA4MDAwMAorODIgMSAxMjAwMDAKKzgyIDEgMTYwMDAwCis4MiAxIDIwMDAwMAorODIgMSAyNDAwMDAKKzgyIDEgMjgwMDAwCis4MiAxIDMyMDAwMAorODIgMSAzNjAwMDAKKzEyMyAxIDQwMDAwMAorMTIzIDEgNDYwMDAwCisxMjMgMSA1MjAwMDAKKzEyMyAxIDU4MDAwMAorMTIzIDEgNjQwMDAwCisxNjQgMSA3MDAwMDAKKzE2NCAxIDc4MDAwMAorMTY0IDEgODYwMDAwCisxNjQgMSA5NDAwMDAKKzE2NCAxIDEwMjAwMDAKKzQxIDEgMTEwMDAwMAorNDEgMSAxMTIwMDAwCis0MSAxIDExNDAwMDAKKzQxIDEgMTE2MDAwMAorNDEgMSAxMTgwMDAwCis0MSAxIDEyMDAwMDAKKzQxIDEgMTIyMDAwMAorNDEgMSAxMjQwMDAwCis0MSAxIDEyNjAwMDAKKzQxIDEgMTI4MDAwMAorNDEgMSAxMzAwMDAwCis0MSAxIDEzMjAwMDAKKzQxIDEgMTM0MDAwMAorNDEgMSAxMzYwMDAwCis0MSAxIDEzODAwMDAKKzQxIDEgMTQwMDAwMAorNDEgMSAxNDIwMDAwCis0MSAxIDE0NDAwMDAKKzQxIDEgMTQ2MDAwMAorNDEgMSAxNDgwMDAwCis0MSAxIDE1MDAwMDAKKzQxIDEgMTUyMDAwMAorNDEgMSAxNTQwMDAwCis0MSAxIDE1NjAwMDAKKzQxIDEgMTU4MDAwMAorNDEgMSAxNjAwMDAwCis0MSAxIDE2MjAwMDAKKzQxIDEgMTY0MDAwMAorNDEgMSAxNjYwMDAwCis0MSAxIDE2ODAwMDAKKzQxIDEgMTcwMDAwMAorNDEgMSAxNzIwMDAwCis0MSAxIDE3NDAwMDAKKzQxIDEgMTc2MDAwMAorNDEgMSAxNzgwMDAwCis0MSAxIDE4MDAwMDAKKzQxIDEgMTgyMDAwMAorNDEgMSAxODQwMDAwCis0MSAxIDE4NjAwMDAKKzQxIDEgMTg4MDAwMAorNDEgMSAxOTAwMDAwCis0MSAxIDE5MjAwMDAKKzQxIDEgMTk0MDAwMAorNDEgMSAxOTYwMDAwCis0MSAxIDE5ODAwMDAKKzQxIDEgMjAwMDAwMAorNDEgMSAyMDIwMDAwCis0MSAxIDIwNDAwMDAKKzQxIDEgMjA2MDAwMAorNDEgMSAyMDgwMDAwCis0MSAxIDIxMDAwMDAKKzQxIDEgMjEyMDAwMAorNDEgMSAyMTQwMDAwCis0MSAxIDIxNjAwMDAKKzQxIDEgMjE4MDAwMAorNDEgMSAyMjAwMDAwCis0MSAxIDIyMjAwMDAKKzQxIDEgMjI0MDAwMAorNDEgMSAyMjYwMDAwCis0MSAxIDIyODAwMDAKKzQxIDEgMjMwMDAwMAorNDEgMSAyMzIwMDAwCis0MSAxIDIzNDAwMDAKKzQxIDEgMjM2MDAwMAorNDEgMSAyMzgwMDAwCis0MSAxIDI0MDAwMDAKKzQxIDEgMjQyMDAwMAorNDEgMSAyNDQwMDAwCis0MSAxIDI0NjAwMDAKKzQxIDEgMjQ4MDAwMAorNDEgMSAyNTAwMDAwCis0MSAxIDI1MjAwMDAKKzQxIDEgMjU0MDAwMAorNDEgMSAyNTYwMDAwCis0MSAxIDI1ODAwMDAKKzQxIDEgMjYwMDAwMAorNDEgMSAyNjIwMDAwCis0MSAxIDI2NDAwMDAKKzQxIDEgMjY2MDAwMAorNDEgMSAyNjgwMDAwCis0MSAxIDI3MDAwMDAKKzQxIDEgMjcyMDAwMAorNDEgMSAyNzQwMDAwCis0MSAxIDI3NjAwMDAKKzQxIDEgMjc4MDAwMAorNDEgMSAyODAwMDAwCis0MSAxIDI4MjAwMDAKKzQxIDEgMjg0MDAwMAorNDEgMSAyODYwMDAwCis0MSAxIDI4ODAwMDAKKzQxIDEgMjkwMDAwMAorNDEgMSAyOTIwMDAwCis0MSAxIDI5NDAwMDAKKzQxIDEgMjk2MDAwMAorNDEgMSAyOTgwMDAwCis0MSAxIDMwMDAwMDAKKzQxIDEgMzAyMDAwMAorNDEgMSAzMDQwMDAwCis0MSAxIDMwNjAwMDAKKzQxIDEgMzA4MDAwMAorNDEgMSAzMTAwMDAwCis0MSAxIDMxMjAwMDAKKzQxIDEgMzE0MDAwMAorNDEgMSAzMTYwMDAwCis0MSAxIDMxODAwMDAKKzQxIDEgMzIwMDAwMAorNDEgMSAzMjIwMDAwCis0MSAxIDMyNDAwMDAKKzQxIDEgMzI2MDAwMAorNDEgMSAzMjgwMDAwCis0MSAxIDMzMDAwMDAKKzQxIDEgMzMyMDAwMAorNDEgMSAzMzQwMDAwCis0MSAxIDMzNjAwMDAKKzQxIDEgMzM4MDAwMAorNDEgMSAzNDAwMDAwCis0MSAxIDM0MjAwMDAKKzQxIDEgMzQ0MDAwMAorNDEgMSAzNDYwMDAwCis0MSAxIDM0ODAwMDAKKzQxIDEgMzUwMDAwMAorNDEgMSAzNTIwMDAwCis0MSAxIDM1NDAwMDAKKzQxIDEgMzU2MDAwMAorNDEgMSAzNTgwMDAwCis0MSAxIDM2MDAwMDAKKzQxIDEgMzYyMDAwMAorNDEgMSAzNjQwMDAwCis0MSAxIDM2NjAwMDAKKzQxIDEgMzY4MDAwMAorNDEgMSAzNzAwMDAwCis0MSAxIDM3MjAwMDAKKzQxIDEgMzc0MDAwMAorNDEgMSAzNzYwMDAwCis0MSAxIDM3ODAwMDAKKzQxIDEgMzgwMDAwMAorNDEgMSAzODIwMDAwCis0MSAxIDM4NDAwMDAKKzQxIDEgMzg2MDAwMAorNDEgMSAzODgwMDAwCis0MSAxIDM5MDAwMDAKKzQxIDEgMzkyMDAwMAorNDEgMSAzOTQwMDAwCis0MSAxIDM5NjAwMDAKKzQxIDEgMzk4MDAwMAorNDEgMSA0MDAwMDAwCis0MSAxIDQwMjAwMDAKKzQxIDEgNDA0MDAwMAorNDEgMSA0MDYwMDAwCis0MSAxIDQwODAwMDAKKzQxIDEgNDEwMDAwMAorNDEgMSA0MTIwMDAwCis0MSAxIDQxNDAwMDAKKzQxIDEgNDE2MDAwMAorNDEgMSA0MTgwMDAwCis0MSAxIDQyMDAwMDAKKzQxIDEgNDIyMDAwMAorNDEgMSA0MjQwMDAwCis0MSAxIDQyNjAwMDAKKzQxIDEgNDI4MDAwMAorNDEgMSA0MzAwMDAwCis0MSAxIDQzMjAwMDAKKzQxIDEgNDM0MDAwMAorNDEgMSA0MzYwMDAwCis0MSAxIDQzODAwMDAKKzQxIDEgNDQwMDAwMAorNDEgMSA0NDIwMDAwCis0MSAxIDQ0NDAwMDAKKzQxIDEgNDQ2MDAwMAorNDEgMSA0NDgwMDAwCis0MSAxIDQ1MDAwMDAKKzQxIDEgNDUyMDAwMAorNDEgMSA0NTQwMDAwCis0MSAxIDQ1NjAwMDAKKzQxIDEgNDU4MDAwMAorNDEgMSA0NjAwMDAwCis0MSAxIDQ2MjAwMDAKKzQxIDEgNDY0MDAwMAorNDEgMSA0NjYwMDAwCis0MSAxIDQ2ODAwMDAKKzQxIDEgNDcwMDAwMAorNDEgMSA0NzIwMDAwCis0MSAxIDQ3NDAwMDAKKzQxIDEgNDc2MDAwMAorNDEgMSA0NzgwMDAwCis0MSAxIDQ4MDAwMDAKKzQxIDEgNDgyMDAwMAorNDEgMSA0ODQwMDAwCis0MSAxIDQ4NjAwMDAKKzQxIDEgNDg4MDAwMAorNDEgMSA0OTAwMDAwCis0MSAxIDQ5MjAwMDAKKzQxIDEgNDk0MDAwMAorNDEgMSA0OTYwMDAwCis0MSAxIDQ5ODAwMDAKKzQxIDEgNTAwMDAwMAorNDEgMSA1MDIwMDAwCis0MSAxIDUwNDAwMDAKKzQxIDEgNTA2MDAwMAorNDEgMSA1MDgwMDAwCis0MSAxIDUxMDAwMDAKKzQxIDEgNTEyMDAwMAorNDEgMSA1MTQwMDAwCis0MSAxIDUxNjAwMDAKKzQxIDEgNTE4MDAwMAorNDEgMSA1MjAwMDAwCis0MSAxIDUyMjAwMDAKKzQxIDEgNTI0MDAwMAorNDEgMSA1MjYwMDAwCis0MSAxIDUyODAwMDAKKzQxIDEgNTMwMDAwMAorNDEgMSA1MzIwMDAwCis0MSAxIDUzNDAwMDAKKzQxIDEgNTM2MDAwMAorNDEgMSA1MzgwMDAwCis0MSAxIDU0MDAwMDAKKzQxIDEgNTQyMDAwMAorNDEgMSA1NDQwMDAwCis0MSAxIDU0NjAwMDAKKzQxIDEgNTQ4MDAwMAorNDEgMSA1NTAwMDAwCis0MSAxIDU1MjAwMDAKKzQxIDEgNTU0MDAwMAorNDEgMSA1NTYwMDAwCis0MSAxIDU1ODAwMDAKKzQxIDEgNTYwMDAwMAorNDEgMSA1NjIwMDAwCis0MSAxIDU2NDAwMDAKKzQxIDEgNTY2MDAwMAorNDEgMSA1NjgwMDAwCis0MSAxIDU3MDAwMDAKKzQxIDEgNTcyMDAwMAorNDEgMSA1NzQwMDAwCis0MSAxIDU3NjAwMDAKKzQxIDEgNTc4MDAwMAorNDEgMSA1ODAwMDAwCis0MSAxIDU4MjAwMDAKKzQxIDEgNTg0MDAwMAorNDEgMSA1ODYwMDAwCis0MSAxIDU4ODAwMDAKKzQxIDEgNTkwMDAwMAorNDEgMSA1OTIwMDAwCis0MSAxIDU5NDAwMDAKKzQxIDEgNTk2MDAwMAorNDEgMSA1OTgwMDAwCis0MSAxIDYwMDAwMDAKKzQxIDEgNjAyMDAwMAorNDEgMSA2MDQwMDAwCis0MSAxIDYwNjAwMDAKKzQxIDEgNjA4MDAwMAorNDEgMSA2MTAwMDAwCis0MSAxIDYxMjAwMDAKKzQxIDEgNjE0MDAwMAorNDEgMSA2MTYwMDAwCis0MSAxIDYxODAwMDAKKzQxIDEgNjIwMDAwMAorNDEgMSA2MjIwMDAwCis0MSAxIDYyNDAwMDAKKzQxIDEgNjI2MDAwMAorNDEgMSA2MjgwMDAwCis0MSAxIDYzMDAwMDAKKzQxIDEgNjMyMDAwMAorNDEgMSA2MzQwMDAwCis0MSAxIDYzNjAwMDAKKzQxIDEgNjM4MDAwMAorNDEgMSA2NDAwMDAwCis0MSAxIDY0MjAwMDAKKzQxIDEgNjQ0MDAwMAorNDEgMSA2NDYwMDAwCis0MSAxIDY0ODAwMDAKKzQxIDEgNjUwMDAwMAorNDEgMSA2NTIwMDAwCis0MSAxIDY1NDAwMDAKKzQxIDEgNjU2MDAwMAorNDEgMSA2NTgwMDAwCis0MSAxIDY2MDAwMDAKKzQxIDEgNjYyMDAwMAorNDEgMSA2NjQwMDAwCis0MSAxIDY2NjAwMDAKKzQxIDEgNjY4MDAwMAorNDEgMSA2NzAwMDAwCis0MSAxIDY3MjAwMDAKKzQxIDEgNjc0MDAwMAorNDEgMSA2NzYwMDAwCis0MSAxIDY3ODAwMDAKKzQxIDEgNjgwMDAwMAorNDEgMSA2ODIwMDAwCis0MSAxIDY4NDAwMDAKKzQxIDEgNjg2MDAwMAorNDEgMSA2ODgwMDAwCis0MSAxIDY5MDAwMDAKKzQxIDEgNjkyMDAwMAorNDEgMSA2OTQwMDAwCis0MSAxIDY5NjAwMDAKKzQxIDEgNjk4MDAwMAorNDEgMSA3MDAwMDAwCis0MSAxIDcwMjAwMDAKKzQxIDEgNzA0MDAwMAorNDEgMSA3MDYwMDAwCis0MSAxIDcwODAwMDAKKzQxIDEgNzEwMDAwMAorNDEgMSA3MTIwMDAwCis0MSAxIDcxNDAwMDAKKzQxIDEgNzE2MDAwMAorNDEgMSA3MTgwMDAwCis0MSAxIDcyMDAwMDAKKzQxIDEgNzIyMDAwMAorNDEgMSA3MjQwMDAwCis0MSAxIDcyNjAwMDAKKzQxIDEgNzI4MDAwMAorNDEgMSA3MzAwMDAwCis0MSAxIDczMjAwMDAKKzQxIDEgNzM0MDAwMAorNDEgMSA3MzYwMDAwCis0MSAxIDczODAwMDAKKzQxIDEgNzQwMDAwMAorNDEgMSA3NDIwMDAwCis0MSAxIDc0NDAwMDAKKzQxIDEgNzQ2MDAwMAorNDEgMSA3NDgwMDAwCis0MSAxIDc1MDAwMDAKKzQxIDEgNzUyMDAwMAorNDEgMSA3NTQwMDAwCis0MSAxIDc1NjAwMDAKKzQxIDEgNzU4MDAwMAorNDEgMSA3NjAwMDAwCis0MSAxIDc2MjAwMDAKKzQxIDEgNzY0MDAwMAorNDEgMSA3NjYwMDAwCis0MSAxIDc2ODAwMDAKKzQxIDEgNzcwMDAwMAorNDEgMSA3NzIwMDAwCis0MSAxIDc3NDAwMDAKKzQxIDEgNzc2MDAwMAorNDEgMSA3NzgwMDAwCis0MSAxIDc4MDAwMDAKKzQxIDEgNzgyMDAwMAorNDEgMSA3ODQwMDAwCis0MSAxIDc4NjAwMDAKKzQxIDEgNzg4MDAwMAorNDEgMSA3OTAwMDAwCis0MSAxIDc5MjAwMDAKKzQxIDEgNzk0MDAwMAorNDEgMSA3OTYwMDAwCis0MSAxIDc5ODAwMDAKKzQxIDEgODAwMDAwMAorNDEgMSA4MDIwMDAwCis0MSAxIDgwNDAwMDAKKzQxIDEgODA2MDAwMAorNDEgMSA4MDgwMDAwCis0MSAxIDgxMDAwMDAKKzQxIDEgODEyMDAwMAorNDEgMSA4MTQwMDAwCis0MSAxIDgxNjAwMDAKKzQxIDEgODE4MDAwMAorNDEgMSA4MjAwMDAwCis0MSAxIDgyMjAwMDAKKzQxIDEgODI0MDAwMAorNDEgMSA4MjYwMDAwCis0MSAxIDgyODAwMDAKKzQxIDEgODMwMDAwMAorNDEgMSA4MzIwMDAwCis0MSAxIDgzNDAwMDAKKzQxIDEgODM2MDAwMAorNDEgMSA4MzgwMDAwCis0MSAxIDg0MDAwMDAKKzQxIDEgODQyMDAwMAorNDEgMSA4NDQwMDAwCis0MSAxIDg0NjAwMDAKKzQxIDEgODQ4MDAwMAorNDEgMSA4NTAwMDAwCis0MSAxIDg1MjAwMDAKKzQxIDEgODU0MDAwMAorNDEgMSA4NTYwMDAwCis0MSAxIDg1ODAwMDAKKzQxIDEgODYwMDAwMAorNDEgMSA4NjIwMDAwCis0MSAxIDg2NDAwMDAKKzQxIDEgODY2MDAwMAorNDEgMSA4NjgwMDAwCis0MSAxIDg3MDAwMDAKKzQxIDEgODcyMDAwMAorNDEgMSA4NzQwMDAwCis0MSAxIDg3NjAwMDAKKzQxIDEgODc4MDAwMAorNDEgMSA4ODAwMDAwCis0MSAxIDg4MjAwMDAKKzQxIDEgODg0MDAwMAorNDEgMSA4ODYwMDAwCis0MSAxIDg4ODAwMDAKKzQxIDEgODkwMDAwMAorNDEgMSA4OTIwMDAwCis0MSAxIDg5NDAwMDAKKzQxIDEgODk2MDAwMAorNDEgMSA4OTgwMDAwCis0MSAxIDkwMDAwMDAKKzQxIDEgOTAyMDAwMAorNDEgMSA5MDQwMDAwCis0MSAxIDkwNjAwMDAKKzQxIDEgOTA4MDAwMAorNDEgMSA5MTAwMDAwCis0MSAxIDkxMjAwMDAKKzQxIDEgOTE0MDAwMAorNDEgMSA5MTYwMDAwCis0MSAxIDkxODAwMDAKKzQxIDEgOTIwMDAwMAorNDEgMSA5MjIwMDAwCis0MSAxIDkyNDAwMDAKKzQxIDEgOTI2MDAwMAorNDEgMSA5MjgwMDAwCis0MSAxIDkzMDAwMDAKKzQxIDEgOTMyMDAwMAorNDEgMSA5MzQwMDAwCis0MSAxIDkzNjAwMDAKKzQxIDEgOTM4MDAwMAorNDEgMSA5NDAwMDAwCis0MSAxIDk0MjAwMDAKKzQxIDEgOTQ0MDAwMAorNDEgMSA5NDYwMDAwCis0MSAxIDk0ODAwMDAKKzQxIDEgOTUwMDAwMAorNDEgMSA5NTIwMDAwCis0MSAxIDk1NDAwMDAKKzQxIDEgOTU2MDAwMAorNDEgMSA5NTgwMDAwCis0MSAxIDk2MDAwMDAKKzQxIDEgOTYyMDAwMAorNDEgMSA5NjQwMDAwCis0MSAxIDk2NjAwMDAKKzQxIDEgOTY4MDAwMAorNDEgMSA5NzAwMDAwCis0MSAxIDk3MjAwMDAKKzQxIDEgOTc0MDAwMAorNDEgMSA5NzYwMDAwCis0MSAxIDk3ODAwMDAKKzQxIDEgOTgwMDAwMAorNDEgMSA5ODIwMDAwCis0MSAxIDk4NDAwMDAKKzQxIDEgOTg2MDAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2F2MV8xNzZfMTQ0LmF2MSBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hdjFfMTc2XzE0NC5hdjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ2N2FmOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hdjFfMTc2XzE0NC5hdjEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2F2MV8xNzZfMTQ0LmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYXYxXzE3Nl8xNDQuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzUxMTY4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2F2MV8xNzZfMTQ0LmluZm8KQEAgLTAsMCArMSwzMDAgQEAKKzYwMjcgMSAwCis2ODc5IDAgMzMwMDAKKzUgMCA2NjAwMAorNTMyIDAgMTAwMDAwCis1IDAgMTMzMDAwCisyNDU4IDAgMTY2MDAwCis1IDAgMjAwMDAwCis0NzUgMCAyMzMwMDAKKzUgMCAyNjYwMDAKKzEyNjIgMCAzMDAwMDAKKzUgMCAzMzMwMDAKKzU1NCAwIDM2NjAwMAorMjcgMCA0MDAwMDAKKzY5NzEgMCA0MzMwMDAKKzUgMCA0NjYwMDAKKzYwMSAwIDUwMDAwMAorNSAwIDUzMzAwMAorMzI3NiAwIDU2NjAwMAorNSAwIDYwMDAwMAorNjU4IDAgNjMzMDAwCis1IDAgNjY2MDAwCisxNjgwIDAgNzAwMDAwCis1IDAgNzMzMDAwCis2MTAgMCA3NjYwMDAKKzI0IDAgODAwMDAwCis2NzI4IDAgODMzMDAwCis1IDAgODY2MDAwCis3NjQgMCA5MDAwMDAKKzUgMCA5MzMwMDAKKzI2NTYgMCA5NjYwMDAKKzUgMCAxMDAwMDAwCis0NjIgMCAxMDMzMDAwCis1IDAgMTA2NjAwMAorMTQ1OSAwIDExMDAwMDAKKzUgMCAxMTMzMDAwCis2MDggMCAxMTY2MDAwCisyNCAwIDEyMDAwMDAKKzcwMzggMCAxMjMzMDAwCis1IDAgMTI2NjAwMAorNzIxIDAgMTMwMDAwMAorNSAwIDEzMzMwMDAKKzMxMDIgMCAxMzY2MDAwCis1IDAgMTQwMDAwMAorNzUyIDAgMTQzMzAwMAorNSAwIDE0NjYwMDAKKzE4MTUgMCAxNTAwMDAwCis1IDAgMTUzMzAwMAorNzU1IDAgMTU2NjAwMAorMjUgMCAxNjAwMDAwCis3NjU3IDAgMTYzMzAwMAorNSAwIDE2NjYwMDAKKzg1MiAwIDE3MDAwMDAKKzUgMCAxNzMzMDAwCiszNTM3IDAgMTc2NjAwMAorNSAwIDE4MDAwMDAKKzY3MyAwIDE4MzMwMDAKKzUgMCAxODY2MDAwCisxNzc0IDAgMTkwMDAwMAorNSAwIDE5MzMwMDAKKzU1NCAwIDE5NjYwMDAKKzI0IDAgMjAwMDAwMAorODAyOCAwIDIwMzMwMDAKKzUgMCAyMDY2MDAwCis3MTUgMCAyMTAwMDAwCis1IDAgMjEzMzAwMAorMzM5NSAwIDIxNjYwMDAKKzUgMCAyMjAwMDAwCis3MzYgMCAyMjMzMDAwCis1IDAgMjI2NjAwMAorMTc1OSAwIDIzMDAwMDAKKzUgMCAyMzMzMDAwCis2MDUgMCAyMzY2MDAwCisyMyAwIDI0MDAwMDAKKzc2NTEgMCAyNDMzMDAwCis1IDAgMjQ2NjAwMAorNjE5IDAgMjUwMDAwMAorNSAwIDI1MzMwMDAKKzI3ODggMCAyNTY2MDAwCis1IDAgMjYwMDAwMAorNTU2IDAgMjYzMzAwMAorNSAwIDI2NjYwMDAKKzEzMzUgMCAyNzAwMDAwCis1IDAgMjczMzAwMAorNTIxIDAgMjc2NjAwMAorMjQgMCAyODAwMDAwCisyMjc0IDAgMjgzMzAwMAorNjc2IDAgMjg2NjAwMAorMjUgMCAyOTAwMDAwCis2MjI0IDAgMjkzMzAwMAorNTc5OCAwIDI5NjYwMDAKKzUgMCAzMDAwMDAwCis0NDggMCAzMDMzMDAwCis1IDAgMzA2NjAwMAorMTk1MCAwIDMxMDAwMDAKKzUgMCAzMTMzMDAwCiszODYgMCAzMTY2MDAwCis1IDAgMzIwMDAwMAorMTIxOCAwIDMyMzMwMDAKKzUgMCAzMjY2MDAwCisxMzE2IDAgMzMwMDAwMAorNSAwIDMzMzMwMDAKKzU4MCAwIDMzNjYwMDAKKzI2IDAgMzQwMDAwMAorNjY3MyAwIDM0MzMwMDAKKzUgMCAzNDY2MDAwCis0NzMgMCAzNTAwMDAwCis1IDAgMzUzMzAwMAorMjQ2NyAwIDM1NjYwMDAKKzUgMCAzNjAwMDAwCis0MjkgMCAzNjMzMDAwCis1IDAgMzY2NjAwMAorMTQyMCAwIDM3MDAwMDAKKzUgMCAzNzMzMDAwCis1ODMgMCAzNzY2MDAwCisyOSAwIDM4MDAwMDAKKzg0OTIgMCAzODMzMDAwCis1IDAgMzg2NjAwMAorNzIwIDAgMzkwMDAwMAorNSAwIDM5MzMwMDAKKzM2MzUgMCAzOTY2MDAwCis1IDAgNDAwMDAwMAorNjIxIDAgNDAzMzAwMAorNSAwIDQwNjYwMDAKKzE5NjkgMCA0MTAwMDAwCis1IDAgNDEzMzAwMAorNDkgMCA0MTY2MDAwCisyNSAwIDQyMDAwMDAKKzc0MTYgMCA0MjMzMDAwCis1IDAgNDI2NjAwMAorOTQ3IDAgNDMwMDAwMAorNSAwIDQzMzMwMDAKKzM3MTMgMCA0MzY2MDAwCis1IDAgNDQwMDAwMAorNzE0IDAgNDQzMzAwMAorNSAwIDQ0NjYwMDAKKzIwMDMgMCA0NTAwMDAwCis1IDAgNDUzMzAwMAorNzUwIDAgNDU2NjAwMAorMjUgMCA0NjAwMDAwCis4NDcwIDAgNDYzMzAwMAorNSAwIDQ2NjYwMDAKKzczNyAwIDQ3MDAwMDAKKzUgMCA0NzMzMDAwCis0MDk0IDAgNDc2NjAwMAorNSAwIDQ4MDAwMDAKKzEwMTkgMCA0ODMzMDAwCis1IDAgNDg2NjAwMAorMjE2MCAwIDQ5MDAwMDAKKzUgMCA0OTMzMDAwCis4MjggMCA0OTY2MDAwCisyNCAwIDUwMDAwMDAKKzkyODIgMCA1MDMzMDAwCis1IDAgNTA2NjAwMAorNjU1IDAgNTEwMDAwMAorNSAwIDUxMzMwMDAKKzM0OTEgMCA1MTY2MDAwCis1IDAgNTIwMDAwMAorNjUxIDAgNTIzMzAwMAorNSAwIDUyNjYwMDAKKzE5MDYgMCA1MzAwMDAwCis1IDAgNTMzMzAwMAorNjYyIDAgNTM2NjAwMAorMjQgMCA1NDAwMDAwCis5NzI0IDAgNTQzMzAwMAorNSAwIDU0NjYwMDAKKzYxNyAwIDU1MDAwMDAKKzUgMCA1NTMzMDAwCiszMTQ1IDAgNTU2NjAwMAorNSAwIDU2MDAwMDAKKzU3OCAwIDU2MzMwMDAKKzUgMCA1NjY2MDAwCisxNTkyIDAgNTcwMDAwMAorNSAwIDU3MzMwMDAKKzU2OSAwIDU3NjYwMDAKKzI1IDAgNTgwMDAwMAorMTAwMTUgMCA1ODMzMDAwCis1IDAgNTg2NjAwMAorNjA5IDAgNTkwMDAwMAorNSAwIDU5MzMwMDAKKzM2MTggMCA1OTY2MDAwCis1IDAgNjAwMDAwMAorNzM0IDAgNjAzMzAwMAorNSAwIDYwNjYwMDAKKzE3NDggMCA2MTAwMDAwCis1IDAgNjEzMzAwMAorNTUwIDAgNjE2NjAwMAorMjQgMCA2MjAwMDAwCis4ODA2IDAgNjIzMzAwMAorNSAwIDYyNjYwMDAKKzQ5OCAwIDYzMDAwMDAKKzUgMCA2MzMzMDAwCisyOTEzIDAgNjM2NjAwMAorNSAwIDY0MDAwMDAKKzU5NyAwIDY0MzMwMDAKKzUgMCA2NDY2MDAwCisxMjM1IDAgNjUwMDAwMAorNSAwIDY1MzMwMDAKKzM2MiAwIDY1NjYwMDAKKzI0IDAgNjYwMDAwMAorNjU5MiAwIDY2MzMwMDAKKzUgMCA2NjY2MDAwCis0NjggMCA2NzAwMDAwCis1IDAgNjczMzAwMAorMTkyMCAwIDY3NjYwMDAKKzUgMCA2ODAwMDAwCis0MTkgMCA2ODMzMDAwCis1IDAgNjg2NjAwMAorODQzIDAgNjkwMDAwMAorNSAwIDY5MzMwMDAKKzIzNyAwIDY5NjYwMDAKKzI0IDAgNzAwMDAwMAorMjY4NyAwIDcwMzMwMDAKKzUgMCA3MDY2MDAwCiszOTkgMCA3MTAwMDAwCis1IDAgNzEzMzAwMAorMjAwIDAgNzE2NjAwMAorMTQzIDAgNzIwMDAwMAorMjUgMCA3MjMzMDAwCisxMjYwMyAwIDcyNjYwMDAKKzExMzkgMCA3MzAwMDAwCis1IDAgNzMzMzAwMAorNTYgMCA3MzY2MDAwCis1IDAgNzQwMDAwMAorMjczIDAgNzQzMzAwMAorNSAwIDc0NjYwMDAKKzQ4IDAgNzUwMDAwMAorNSAwIDc1MzMwMDAKKzEwMiAwIDc1NjYwMDAKKzUgMCA3NjAwMDAwCiszOSAwIDc2MzMwMDAKKzI0IDAgNzY2NjAwMAorMzYzNSAwIDc3MDAwMDAKKzUgMCA3NzMzMDAwCis0NiAwIDc3NjYwMDAKKzUgMCA3ODAwMDAwCis2NDcgMCA3ODMzMDAwCis1IDAgNzg2NjAwMAorNjEgMCA3OTAwMDAwCis1IDAgNzkzMzAwMAorODI0IDAgNzk2NjAwMAorNSAwIDgwMDAwMDAKKzY5MSAwIDgwMzMwMDAKKzI3IDAgODA2NjAwMAorNDU3MyAwIDgxMDAwMDAKKzUgMCA4MTMzMDAwCis0NzMgMCA4MTY2MDAwCis1IDAgODIwMDAwMAorMTYzNyAwIDgyMzMwMDAKKzUgMCA4MjY2MDAwCis0NTEgMCA4MzAwMDAwCis1IDAgODMzMzAwMAorOTY5IDAgODM2NjAwMAorNSAwIDg0MDAwMDAKKzIzNCAwIDg0MzMwMDAKKzI0IDAgODQ2NjAwMAorMzM2MSAwIDg1MDAwMDAKKzUgMCA4NTMzMDAwCisxNjggMCA4NTY2MDAwCis1IDAgODYwMDAwMAorNjYyIDAgODYzMzAwMAorNSAwIDg2NjYwMDAKKzEyOSAwIDg3MDAwMDAKKzUgMCA4NzMzMDAwCis0NDMgMCA4NzY2MDAwCis1IDAgODgwMDAwMAorMTgzIDAgODgzMzAwMAorMjMgMCA4ODY2MDAwCisyNzY5IDAgODkwMDAwMAorNSAwIDg5MzMwMDAKKzE4MiAwIDg5NjYwMDAKKzUgMCA5MDAwMDAwCis4OTAgMCA5MDMzMDAwCis1IDAgOTA2NjAwMAorMTcxIDAgOTEwMDAwMAorNSAwIDkxMzMwMDAKKzU5OSAwIDkxNjYwMDAKKzUgMCA5MjAwMDAwCisyMzYgMCA5MjMzMDAwCisyMyAwIDkyNjYwMDAKKzIzMTYgMCA5MzAwMDAwCis1IDAgOTMzMzAwMAorMzMzIDAgOTM2NjAwMAorNSAwIDk0MDAwMDAKKzc1OSAwIDk0MzMwMDAKKzUgMCA5NDY2MDAwCisyMTAgMCA5NTAwMDAwCis1IDAgOTUzMzAwMAorMzI0IDAgOTU2NjAwMAorNSAwIDk2MDAwMDAKKzk4IDAgOTYzMzAwMAorMjMgMCA5NjY2MDAwCisxMTA3IDAgOTcwMDAwMAorNSAwIDk3MzMwMDAKKzQyIDAgOTc2NjAwMAorNSAwIDk4MDAwMDAKKzE0NSAwIDk4MzMwMDAKKzUgMCA5ODY2MDAwCisxMDkgMCA5OTAwMDAwCis4OSAwIDk5MzMwMDAKKzI0IDAgOTk2NjAwMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hdjFfNjQwXzM2MC5hdjEgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYXYxXzY0MF8zNjAuYXYxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOWJhY2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYXYxXzY0MF8zNjAuYXYxCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hdjFfNjQwXzM2MC5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2F2MV82NDBfMzYwLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNhNzgzMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hdjFfNjQwXzM2MC5pbmZvCkBAIC0wLDAgKzEsMTY3IEBACisxMjU3MSAxIDAKKzk4ODEgMCAzMzAwMAorNSAwIDY2MDAwCis1NDQgMCAxMDAwMDAKKzUgMCAxMzMwMDAKKzI2NDIgMCAxNjYwMDAKKzUgMCAyMDAwMDAKKzUzMSAwIDIzMzAwMAorNSAwIDI2NjAwMAorMTM1OSAwIDMwMDAwMAorNSAwIDMzMzAwMAorNTUxIDAgMzY2MDAwCisyOCAwIDQwMDAwMAorMTA3OTEgMCA0MzMwMDAKKzUgMCA0NjYwMDAKKzY1NSAwIDUwMDAwMAorNSAwIDUzMzAwMAorMzc2OSAwIDU2NjAwMAorNSAwIDYwMDAwMAorNzExIDAgNjMzMDAwCis1IDAgNjY2MDAwCisyMDA0IDAgNzAwMDAwCis1IDAgNzMzMDAwCis2NTcgMCA3NjYwMDAKKzI2IDAgODAwMDAwCis4OTY5IDAgODMzMDAwCis1IDAgODY2MDAwCis2MzAgMCA5MDAwMDAKKzUgMCA5MzMwMDAKKzI3ODcgMCA5NjYwMDAKKzUgMCAxMDAwMDAwCis0MDQgMCAxMDMzMDAwCis1IDAgMTA2NjAwMAorMTUxOCAwIDExMDAwMDAKKzUgMCAxMTMzMDAwCis0OTMgMCAxMTY2MDAwCisyNiAwIDEyMDAwMDAKKzk5MDAgMCAxMjMzMDAwCis1IDAgMTI2NjAwMAorNjIwIDAgMTMwMDAwMAorNSAwIDEzMzMwMDAKKzMwNzIgMCAxMzY2MDAwCis1IDAgMTQwMDAwMAorNjY4IDAgMTQzMzAwMAorNSAwIDE0NjYwMDAKKzE4MjEgMCAxNTAwMDAwCis1IDAgMTUzMzAwMAorNjgyIDAgMTU2NjAwMAorMjYgMCAxNjAwMDAwCis5NTYwIDAgMTYzMzAwMAorNSAwIDE2NjYwMDAKKzY2NyAwIDE3MDAwMDAKKzUgMCAxNzMzMDAwCiszMjQ5IDAgMTc2NjAwMAorNSAwIDE4MDAwMDAKKzU4OSAwIDE4MzMwMDAKKzUgMCAxODY2MDAwCisxODE2IDAgMTkwMDAwMAorNSAwIDE5MzMwMDAKKzU0OCAwIDE5NjYwMDAKKzI2IDAgMjAwMDAwMAorOTkxNiAwIDIwMzMwMDAKKzUgMCAyMDY2MDAwCis2MjggMCAyMTAwMDAwCis1IDAgMjEzMzAwMAorMzAzNCAwIDIxNjYwMDAKKzUgMCAyMjAwMDAwCis1OTAgMCAyMjMzMDAwCis1IDAgMjI2NjAwMAorMTU4MSAwIDIzMDAwMDAKKzUgMCAyMzMzMDAwCis1MjQgMCAyMzY2MDAwCisyNiAwIDI0MDAwMDAKKzgxODIgMCAyNDMzMDAwCis1IDAgMjQ2NjAwMAorNTUyIDAgMjUwMDAwMAorNSAwIDI1MzMwMDAKKzI0MTIgMCAyNTY2MDAwCis1IDAgMjYwMDAwMAorNDg5IDAgMjYzMzAwMAorNSAwIDI2NjYwMDAKKzEyMjcgMCAyNzAwMDAwCis1IDAgMjczMzAwMAorNDMyIDAgMjc2NjAwMAorMjYgMCAyODAwMDAwCisyMDE3IDAgMjgzMzAwMAorNTE2IDAgMjg2NjAwMAorMjYgMCAyOTAwMDAwCisxNjYxOSAwIDI5MzMwMDAKKzY3MTAgMCAyOTY2MDAwCis1IDAgMzAwMDAwMAorNDI1IDAgMzAzMzAwMAorNSAwIDMwNjYwMDAKKzE5NjQgMCAzMTAwMDAwCis1IDAgMzEzMzAwMAorMzg2IDAgMzE2NjAwMAorNSAwIDMyMDAwMDAKKzExMjkgMCAzMjMzMDAwCis1IDAgMzI2NjAwMAorMTE1NiAwIDMzMDAwMDAKKzUgMCAzMzMzMDAwCis0ODYgMCAzMzY2MDAwCisyOCAwIDM0MDAwMDAKKzEwMzA0IDAgMzQzMzAwMAorNSAwIDM0NjYwMDAKKzQxMiAwIDM1MDAwMDAKKzUgMCAzNTMzMDAwCisyNjA4IDAgMzU2NjAwMAorNSAwIDM2MDAwMDAKKzM5NyAwIDM2MzMwMDAKKzUgMCAzNjY2MDAwCisxNTE0IDAgMzcwMDAwMAorNSAwIDM3MzMwMDAKKzUzMyAwIDM3NjYwMDAKKzI2IDAgMzgwMDAwMAorMTE2OTggMCAzODMzMDAwCis1IDAgMzg2NjAwMAorNTQyIDAgMzkwMDAwMAorNSAwIDM5MzMwMDAKKzMzMzQgMCAzOTY2MDAwCis1IDAgNDAwMDAwMAorNTQ3IDAgNDAzMzAwMAorNSAwIDQwNjYwMDAKKzE4MDkgMCA0MTAwMDAwCis1IDAgNDEzMzAwMAorNTUgMCA0MTY2MDAwCisyNiAwIDQyMDAwMDAKKzk0OTYgMCA0MjMzMDAwCis1IDAgNDI2NjAwMAorNjU4IDAgNDMwMDAwMAorNSAwIDQzMzMwMDAKKzMyMzIgMCA0MzY2MDAwCis1IDAgNDQwMDAwMAorNjAwIDAgNDQzMzAwMAorNSAwIDQ0NjYwMDAKKzE3NjYgMCA0NTAwMDAwCis1IDAgNDUzMzAwMAorNTUwIDAgNDU2NjAwMAorMjUgMCA0NjAwMDAwCis5OTUxIDAgNDYzMzAwMAorNSAwIDQ2NjYwMDAKKzYyNCAwIDQ3MDAwMDAKKzUgMCA0NzMzMDAwCiszNjE3IDAgNDc2NjAwMAorNSAwIDQ4MDAwMDAKKzY0NCAwIDQ4MzMwMDAKKzUgMCA0ODY2MDAwCisxODQxIDAgNDkwMDAwMAorNSAwIDQ5MzMwMDAKKzY0OSAwIDQ5NjYwMDAKKzI1IDAgNTAwMDAwMAorOTkwMSAwIDUwMzMwMDAKKzUgMCA1MDY2MDAwCis1MTUgMCA1MTAwMDAwCis1IDAgNTEzMzAwMAorMjgxNCAwIDUxNjYwMDAKKzUgMCA1MjAwMDAwCis1MTEgMCA1MjMzMDAwCis1IDAgNTI2NjAwMAorMTUyMSAwIDUzMDAwMDAKKzUgMCA1MzMzMDAwCis1MDkgMCA1MzY2MDAwCisyNiAwIDU0MDAwMDAKKzEwNTc5IDAgNTQzMzAwMAorNSAwIDU0NjYwMDAKKzU3NSAwIDU1MDAwMDAKKzUgMCA1NTMzMDAwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2F2Y18xNzZ4MTQ0XzMwMGticHNfNjBmcHMuaDI2NCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmgyNjQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGExZTc1ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmgyNjQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2F2Y18xNzZ4MTQ0XzMwMGticHNfNjBmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ1NjMwOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmluZm8KQEAgLTAsMCArMSw2MiBAQAorMjggMzIgMAorMTAgMzIgMAorNDc4MCAxIDMzMzMzCis5NjAgMCAxMDAwMDAKKzQ4MCAwIDY2NjY2CisyNDYgMCA1MDAwMAorMjY0IDAgODMzMzMKKzExNjAgMCAxNjY2NjYKKzQwNCAwIDEzMzMzMworMjM3IDAgMTE2NjY2CisxOTMgMCAxNTAwMDAKKzkzNiAwIDIzMzMzMworMzg0IDAgMjAwMDAwCisxOTkgMCAxODMzMzMKKzI3NSAwIDIxNjY2NgorMTA4NiAwIDMwMDAwMAorNTIwIDAgMjY2NjY2CiszMDEgMCAyNTAwMDAKKzI3MCAwIDI4MzMzMworMTIzMiAwIDM2NjY2NgorNTU5IDAgMzMzMzMzCisyODcgMCAzMTY2NjYKKzI3NCAwIDM1MDAwMAorMTA4NCAwIDQzMzMzMworNDg1IDAgNDAwMDAwCiszMDcgMCAzODMzMzMKKzI4NCAwIDQxNjY2NgorMTA1MiAwIDUwMDAwMAorNTA0IDAgNDY2NjY2CisyOTggMCA0NTAwMDAKKzMyNyAwIDQ4MzMzMworMTE4OSAwIDU2NjY2NgorMzU4IDAgNTMzMzMzCisxNzIgMCA1MTY2NjYKKzE4NSAwIDU1MDAwMAorMTExNSAwIDYzMzMzMworNDYzIDAgNjAwMDAwCisyMTggMCA1ODMzMzMKKzI1NSAwIDYxNjY2NgorMTE1NSAwIDcwMDAwMAorNjIyIDAgNjY2NjY2CiszNTYgMCA2NTAwMDAKKzM0MSAwIDY4MzMzMworMTI0MCAwIDc2NjY2NgorNjEwIDAgNzMzMzMzCiszNDEgMCA3MTY2NjYKKzM4MCAwIDc1MDAwMAorMTMyNiAwIDgzMzMzMworNjIwIDAgODAwMDAwCiszOTYgMCA3ODMzMzMKKzM1MyAwIDgxNjY2NgorMTE5NiAwIDkwMDAwMAorNjIzIDAgODY2NjY2CiszNzUgMCA4NTAwMDAKKzM2MiAwIDg4MzMzMworMTE5MiAwIDk2NjY2NgorNjU0IDAgOTMzMzMzCiszNTkgMCA5MTY2NjYKKzM1MiAwIDk1MDAwMAorODI4IDAgMTAxNjY2NgorNDM2IDAgOTgzMzMzCis0MDEgMCAxMDAwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYXZjXzY0MHgzNjBfNzY4a2Jwc18zMGZwcy5oMjY0IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2F2Y182NDB4MzYwXzc2OGticHNfMzBmcHMuaDI2NApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDhjNjhmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2F2Y182NDB4MzYwXzc2OGticHNfMzBmcHMuaDI2NApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYXZjXzY0MHgzNjBfNzY4a2Jwc18zMGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2F2Y182NDB4MzYwXzc2OGticHNfMzBmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWYzYjliCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2F2Y182NDB4MzYwXzc2OGticHNfMzBmcHMuaW5mbwpAQCAtMCwwICsxLDI0MiBAQAorMjkgMzIgMAorOSAzMiAwCiszODQ2OSAxIDY2NjY2CiszMjcwIDAgMjAwMDAwCis0NDMgMCAxMzMzMzMKKzI0NiAwIDEwMDAwMAorMjE0IDAgMTY2NjY2CisyMjgwIDAgMzAwMDAwCiszNjggMCAyMzMzMzMKKzIzOCAwIDI2NjY2NgorNjg4IDAgNDMzMzMzCisyODcgMCAzNjY2NjYKKzIzNCAwIDMzMzMzMworMTcyIDAgNDAwMDAwCisxMzYzIDAgNTY2NjY2CisyNzMgMCA1MDAwMDAKKzE2NiAwIDQ2NjY2NgorMTgyIDAgNTMzMzMzCiszNzMxIDAgNzAwMDAwCiszNDkgMCA2MzMzMzMKKzIxNiAwIDYwMDAwMAorMjI5IDAgNjY2NjY2Cis2MDYxIDAgODMzMzMzCis0MDggMCA3NjY2NjYKKzI3MSAwIDczMzMzMworMjQxIDAgODAwMDAwCis3MDA0IDAgOTY2NjY2Cis0NDIgMCA5MDAwMDAKKzI2MSAwIDg2NjY2NgorMjI5IDAgOTMzMzMzCis3MzU0IDAgMTEwMDAwMAorNDA0IDAgMTAzMzMzMworMjY0IDAgMTAwMDAwMAorMTk4IDAgMTA2NjY2NgorNDU0MiAwIDEyMzMzMzMKKzI4NiAwIDExNjY2NjYKKzIwNSAwIDExMzMzMzMKKzEzMSAwIDEyMDAwMDAKKzMzMjkgMCAxMzMzMzMzCisyMTYgMCAxMjY2NjY2CisxMzYgMCAxMzAwMDAwCisyMzUzIDAgMTM2NjY2NgorOTg2IDAgMTQwMDAwMAorODA4IDAgMTQzMzMzMworMzE4IDAgMTQ2NjY2NgorNjIgMCAxNTAwMDAwCis1NTY0OSAxIDE1MzMzMzMKKzE2MDYgMCAxNTY2NjY2CisyOTM1IDAgMTYwMDAwMAorMzU2NCAwIDE2MzMzMzMKKzMzMjQgMCAxNjY2NjY2Cis0NTQzIDAgMTcwMDAwMAorMTc0MCAwIDE3MzMzMzMKKzI3MzcgMCAxNzY2NjY2CisyNzYyIDAgMTgwMDAwMAorMzE4NSAwIDE4MzMzMzMKKzMyMzggMCAxODY2NjY2CiszMzk1IDAgMTkwMDAwMAorMzQyMSAwIDE5MzMzMzMKKzM0ODIgMCAxOTY2NjY2CiszMzcwIDAgMjAwMDAwMAorMzY1NiAwIDIwMzMzMzMKKzM1MDkgMCAyMDY2NjY2CiszNjg0IDAgMjEwMDAwMAorMzczMiAwIDIxMzMzMzMKKzMzNjYgMCAyMTY2NjY2CiszMzc0IDAgMjIwMDAwMAorMzIwMiAwIDIyMzMzMzMKKzM0NDkgMCAyMjY2NjY2CiszMzYwIDAgMjMwMDAwMAorMzM3MiAwIDIzMzMzMzMKKzM0NjAgMCAyMzY2NjY2CiszNTExIDAgMjQwMDAwMAorMzQ3MSAwIDI0MzMzMzMKKzMzMzAgMCAyNDY2NjY2CiszMzc3IDAgMjUwMDAwMAorMzc0NCAwIDI1MzMzMzMKKzM2NjcgMCAyNTY2NjY2CiszODY3IDAgMjYwMDAwMAorMzc3NiAwIDI2MzMzMzMKKzMzMjkgMCAyNjY2NjY2CiszODc2IDAgMjcwMDAwMAorMzM4NSAwIDI3MzMzMzMKKzM1NjYgMCAyNzY2NjY2CiszMzAxIDAgMjgwMDAwMAorMzU3MCAwIDI4MzMzMzMKKzMxMzIgMCAyODY2NjY2CiszNDg3IDAgMjkwMDAwMAorMzI3MCAwIDI5MzMzMzMKKzM0NzIgMCAyOTY2NjY2CiszNDg3IDAgMzAwMDAwMAorMzUwMyAwIDMwMzMzMzMKKzM0NDMgMCAzMDY2NjY2CiszNTI4IDAgMzEwMDAwMAorMzI1OCAwIDMxMzMzMzMKKzM3MDcgMCAzMTY2NjY2CiszMTIwIDAgMzIwMDAwMAorMzM0NyAwIDMyMzMzMzMKKzMzNzIgMCAzMjY2NjY2CiszMTYxIDAgMzMwMDAwMAorMzM5MyAwIDMzMzMzMzMKKzMzOTkgMCAzMzY2NjY2CisyOTA1IDAgMzQwMDAwMAorMzU0MyAwIDM0MzMzMzMKKzMxMDMgMCAzNDY2NjY2CiszMDk5IDAgMzUwMDAwMAorMzQ1NyAwIDM1MzMzMzMKKzMxOTEgMCAzNTY2NjY2CiszMjkwIDAgMzYwMDAwMAorMzMxMiAwIDM2MzMzMzMKKzI5NTUgMCAzNjY2NjY2CiszMzQxIDAgMzcwMDAwMAorMzEwMiAwIDM3MzMzMzMKKzMxODYgMCAzNzY2NjY2CiszMTgwIDAgMzgwMDAwMAorMjgzOSAwIDM4MzMzMzMKKzMwODkgMCAzODY2NjY2CiszMTEwIDAgMzkwMDAwMAorMzE2NSAwIDM5MzMzMzMKKzI2ODQgMCAzOTY2NjY2CiszMDgyIDAgNDAwMDAwMAorMjY5NCAwIDQwMzMzMzMKKzMwNTEgMCA0MDY2NjY2CiszMDAyIDAgNDEwMDAwMAorMjkyOSAwIDQxMzMzMzMKKzI2NzYgMCA0MTY2NjY2CisyNDExIDAgNDIwMDAwMAorMjg3NCAwIDQyMzMzMzMKKzI1NzIgMCA0MjY2NjY2CisyNDIwIDAgNDMwMDAwMAorMjUwMCAwIDQzMzMzMzMKKzIxMzcgMCA0MzY2NjY2CisyMzQ0IDAgNDQwMDAwMAorMjAyOCAwIDQ0MzMzMzMKKzE3NTQgMCA0NDY2NjY2CisxNjI3IDAgNDUwMDAwMAorMTM3NSAwIDQ1MzMzMzMKKzEwNjkgMCA0NTY2NjY2Cis4MDEgMCA0NjAwMDAwCisyMTY4OSAxIDQ2MzMzMzMKKzI2MSAwIDQ3MzMzMzMKKzc2IDAgNDY2NjY2NgorNDUgMCA0NzAwMDAwCiszMzQgMCA0ODAwMDAwCis2MSAwIDQ3NjY2NjYKKzE1NzcgMCA0OTMzMzMzCisyODAgMCA0ODY2NjY2Cis3MiAwIDQ4MzMzMzMKKzQ3OSAwIDQ5MDAwMDAKKzIxODEgMCA1MDY2NjY2Cis5MTkgMCA1MDAwMDAwCiszNDkgMCA0OTY2NjY2Cis1MzQgMCA1MDMzMzMzCis0ODYwIDAgNTE2NjY2NgorNzU5IDAgNTEwMDAwMAorNjc3IDAgNTEzMzMzMworMzEwMSAwIDUzMDAwMDAKKzQ5OCAwIDUyMzMzMzMKKzMyNyAwIDUyMDAwMDAKKzIxMyAwIDUyNjY2NjYKKzE2NDAgMCA1NDMzMzMzCisyNTkgMCA1MzY2NjY2CisxNjIgMCA1MzMzMzMzCisxNDggMCA1NDAwMDAwCisyMTMwIDAgNTU2NjY2NgorMzk3IDAgNTUwMDAwMAorMTkxIDAgNTQ2NjY2NgorMTgwIDAgNTUzMzMzMworMTc1NyAwIDU3MDAwMDAKKzMzOCAwIDU2MzMzMzMKKzE5NCAwIDU2MDAwMDAKKzE0MSAwIDU2NjY2NjYKKzExMDMgMCA1ODMzMzMzCisyODkgMCA1NzY2NjY2CisxNDkgMCA1NzMzMzMzCisxNDggMCA1ODAwMDAwCiszOTE0IDAgNTk2NjY2NgorMTAyNSAwIDU5MDAwMDAKKzcxNCAwIDU4NjY2NjYKKzQyOCAwIDU5MzMzMzMKKzQ2MDQgMCA2MTAwMDAwCisxNDU2IDAgNjAzMzMzMworNjk5IDAgNjAwMDAwMAorODkyIDAgNjA2NjY2NgorNDUzNSAwIDYyMzMzMzMKKzEzMDEgMCA2MTY2NjY2Cis3MDggMCA2MTMzMzMzCis1OTIgMCA2MjAwMDAwCisyMTc1IDAgNjMzMzMzMworNjAzIDAgNjI2NjY2NgorNDExIDAgNjMwMDAwMAorMTgxMyAwIDYzNjY2NjYKKzUwNTUgMCA2NDY2NjY2CisxNTM4IDAgNjQwMDAwMAorMjIwMSAwIDY0MzMzMzMKKzYyNDkgMCA2NTMzMzMzCisxNDIwIDAgNjUwMDAwMAorMjI1NCAwIDY1NjY2NjYKKzI0NDEgMCA2NjMzMzMzCisyOTMgMCA2NjAwMDAwCisyMDYyIDAgNjcwMDAwMAorMjEzIDAgNjY2NjY2NgorMjQ1NSAwIDY4MDAwMDAKKzM0NCAwIDY3MzMzMzMKKzIwNCAwIDY3NjY2NjYKKzM5MjAgMCA2OTMzMzMzCis3NTEgMCA2ODY2NjY2CiszNzYgMCA2ODMzMzMzCiszMzcgMCA2OTAwMDAwCisyODgyIDAgNzA2NjY2NgorNDU3IDAgNzAwMDAwMAorMjIyIDAgNjk2NjY2NgorMTg0IDAgNzAzMzMzMworMjczNCAwIDcyMDAwMDAKKzQ3MiAwIDcxMzMzMzMKKzE4NSAwIDcxMDAwMDAKKzI1MCAwIDcxNjY2NjYKKzI3MzUgMCA3MzMzMzMzCiszMDEgMCA3MjY2NjY2CiszMDcgMCA3MjMzMzMzCisxMDkgMCA3MzAwMDAwCisxODUyIDAgNzQ2NjY2NgorMzIyIDAgNzQwMDAwMAorMTUzIDAgNzM2NjY2NgorMTk1IDAgNzQzMzMzMworMTUwNiAwIDc2MDAwMDAKKzM1MCAwIDc1MzMzMzMKKzE3MCAwIDc1MDAwMDAKKzE0NSAwIDc1NjY2NjYKKzIxMjMgMCA3NzMzMzMzCis0MzAgMCA3NjY2NjY2CiszNjQgMCA3NjMzMzMzCisxOTAgMCA3NzAwMDAwCisxMjk2IDAgNzgwMDAwMAorMTk2IDAgNzc2NjY2NgorODU4IDAgNzgzMzMzMworMzg2NSAwIDc5MzMzMzMKKzY5MyAwIDc4NjY2NjYKKzE2MDYgMCA3OTAwMDAwCis0ODg0IDAgNzk2NjY2NgorMjgyMSAwIDgwMzMzMzMKKzIyMTEgMCA4MDAwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfZmxhY19zdGVyZW9fNjgwa2Jwc180ODAwMGh6LmZsYWMgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfZmxhY19zdGVyZW9fNjgwa2Jwc180ODAwMGh6LmZsYWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI5NGQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouZmxhYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfZmxhY19zdGVyZW9fNjgwa2Jwc180ODAwMGh6LmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfZmxhY19zdGVyZW9fNjgwa2Jwc180ODAwMGh6LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM1NTI5NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouaW5mbwpAQCAtMCwwICsxLDQxNSBAQAorNDIgMzIgMAorMTM4NiAxIDAKKzI0MDEgMSAyNDAwMAorMjMyMSAxIDQ4MDAwCisyMzY3IDEgNzIwMDAKKzIzNzAgMSA5NjAwMAorMjMzNCAxIDEyMDAwMAorMjM5NiAxIDE0NDAwMAorMjM3NSAxIDE2ODAwMAorMjQzMSAxIDE5MjAwMAorMjQyOCAxIDIxNjAwMAorMjMzNCAxIDI0MDAwMAorMjI2MSAxIDI2NDAwMAorMjEyNCAxIDI4ODAwMAorMjE1MiAxIDMxMjAwMAorMjI5NSAxIDMzNjAwMAorMjE4MyAxIDM2MDAwMAorMjM5MyAxIDM4NDAwMAorMjQwMCAxIDQwODAwMAorMjI0NiAxIDQzMjAwMAorMjI4OSAxIDQ1NjAwMAorMjQwMCAxIDQ4MDAwMAorMjMzNSAxIDUwNDAwMAorMjI5NCAxIDUyODAwMAorMjI2MCAxIDU1MjAwMAorMjIwNiAxIDU3NjAwMAorMjE4NSAxIDYwMDAwMAorMjE1NSAxIDYyNDAwMAorMjExOCAxIDY0ODAwMAorMjA5NCAxIDY3MjAwMAorMjA1MCAxIDY5NjAwMAorMjA1OSAxIDcyMDAwMAorMjAzMCAxIDc0NDAwMAorMjAyMiAxIDc2ODAwMAorMjA3OCAxIDc5MjAwMAorMjA4MiAxIDgxNjAwMAorMjA5NCAxIDg0MDAwMAorMjExMSAxIDg2NDAwMAorMjA0MyAxIDg4ODAwMAorMjAyMyAxIDkxMjAwMAorMjAyNCAxIDkzNjAwMAorMjA1NiAxIDk2MDAwMAorMjEwOCAxIDk4NDAwMAorMjEzOCAxIDEwMDgwMDAKKzIxNDAgMSAxMDMyMDAwCisyMTExIDEgMTA1NjAwMAorMjExMCAxIDEwODAwMDAKKzIxMzcgMSAxMTA0MDAwCisyMTU3IDEgMTEyODAwMAorMjE3NCAxIDExNTIwMDAKKzIyMDAgMSAxMTc2MDAwCisyMjAzIDEgMTIwMDAwMAorMjIzNyAxIDEyMjQwMDAKKzIyNjEgMSAxMjQ4MDAwCisyMjE1IDEgMTI3MjAwMAorMjEzMyAxIDEyOTYwMDAKKzIwOTEgMSAxMzIwMDAwCisyMDg4IDEgMTM0NDAwMAorMjEyMiAxIDEzNjgwMDAKKzIxMzkgMSAxMzkyMDAwCisyMTQ2IDEgMTQxNjAwMAorMjIzMSAxIDE0NDAwMDAKKzIyODIgMSAxNDY0MDAwCisyMjczIDEgMTQ4ODAwMAorMjMwNCAxIDE1MTIwMDAKKzIyOTIgMSAxNTM2MDAwCisyMjU1IDEgMTU2MDAwMAorMjE4MSAxIDE1ODQwMDAKKzIwODEgMSAxNjA4MDAwCisyMDEyIDEgMTYzMjAwMAorMjAxMSAxIDE2NTYwMDAKKzIwNjYgMSAxNjgwMDAwCisyMDY5IDEgMTcwNDAwMAorMjEyMCAxIDE3MjgwMDAKKzIxNDEgMSAxNzUyMDAwCisyMTQ4IDEgMTc3NjAwMAorMjE4MSAxIDE4MDAwMDAKKzIxNzYgMSAxODI0MDAwCisyMjQwIDEgMTg0ODAwMAorMjI5NyAxIDE4NzIwMDAKKzIzMjUgMSAxODk2MDAwCisyMzM2IDEgMTkyMDAwMAorMjMyOSAxIDE5NDQwMDAKKzIyOTkgMSAxOTY4MDAwCisyMzIyIDEgMTk5MjAwMAorMjM0NyAxIDIwMTYwMDAKKzIyODcgMSAyMDQwMDAwCisyMjg2IDEgMjA2NDAwMAorMjI2OSAxIDIwODgwMDAKKzIzMjAgMSAyMTEyMDAwCisyMzA1IDEgMjEzNjAwMAorMjM4NCAxIDIxNjAwMDAKKzI0MjkgMSAyMTg0MDAwCisyMzcwIDEgMjIwODAwMAorMjM2NSAxIDIyMzIwMDAKKzIzNjEgMSAyMjU2MDAwCisyMzcwIDEgMjI4MDAwMAorMjM5MyAxIDIzMDQwMDAKKzIzNDIgMSAyMzI4MDAwCisyMzI1IDEgMjM1MjAwMAorMjMzNCAxIDIzNzYwMDAKKzIzMTYgMSAyNDAwMDAwCisyMzE3IDEgMjQyNDAwMAorMjMwNSAxIDI0NDgwMDAKKzIzNjAgMSAyNDcyMDAwCisyMzMxIDEgMjQ5NjAwMAorMjMzMiAxIDI1MjAwMDAKKzIzNjEgMSAyNTQ0MDAwCisyNDE3IDEgMjU2ODAwMAorMjQzOCAxIDI1OTIwMDAKKzI0MDMgMSAyNjE2MDAwCisyMzg2IDEgMjY0MDAwMAorMjM4MiAxIDI2NjQwMDAKKzIzNTAgMSAyNjg4MDAwCisyMzU1IDEgMjcxMjAwMAorMjM4MyAxIDI3MzYwMDAKKzIzODQgMSAyNzYwMDAwCisyMzgzIDEgMjc4NDAwMAorMjM3MyAxIDI4MDgwMDAKKzIzNzQgMSAyODMyMDAwCisyMzQ3IDEgMjg1NjAwMAorMjM1MyAxIDI4ODAwMDAKKzIzODEgMSAyOTA0MDAwCisyNDAxIDEgMjkyODAwMAorMjQwMSAxIDI5NTIwMDAKKzIzODUgMSAyOTc2MDAwCisyMzgyIDEgMzAwMDAwMAorMjMyOCAxIDMwMjQwMDAKKzIzMDMgMSAzMDQ4MDAwCisyMjcyIDEgMzA3MjAwMAorMjI3MCAxIDMwOTYwMDAKKzIzMTIgMSAzMTIwMDAwCisyMjczIDEgMzE0NDAwMAorMjMzMCAxIDMxNjgwMDAKKzIzMzkgMSAzMTkyMDAwCisyMjk2IDEgMzIxNjAwMAorMjMxNyAxIDMyNDAwMDAKKzI0NDAgMSAzMjY0MDAwCisyMzUzIDEgMzI4ODAwMAorMjM0NiAxIDMzMTIwMDAKKzIzMDMgMSAzMzM2MDAwCisyMzA4IDEgMzM2MDAwMAorMjI4NyAxIDMzODQwMDAKKzIzMTYgMSAzNDA4MDAwCisyMzY3IDEgMzQzMjAwMAorMjMzNSAxIDM0NTYwMDAKKzIzNTAgMSAzNDgwMDAwCisyMzk1IDEgMzUwNDAwMAorMjQwOCAxIDM1MjgwMDAKKzI0MTMgMSAzNTUyMDAwCisyNDE1IDEgMzU3NjAwMAorMjQ2OCAxIDM2MDAwMDAKKzI0MzcgMSAzNjI0MDAwCisyMzcyIDEgMzY0ODAwMAorMjM3MSAxIDM2NzIwMDAKKzIzNDEgMSAzNjk2MDAwCisyMzI4IDEgMzcyMDAwMAorMjI3MyAxIDM3NDQwMDAKKzIyNDQgMSAzNzY4MDAwCisyMjMzIDEgMzc5MjAwMAorMjIyOSAxIDM4MTYwMDAKKzIyNTIgMSAzODQwMDAwCisyMjM2IDEgMzg2NDAwMAorMjIxNyAxIDM4ODgwMDAKKzIxNzkgMSAzOTEyMDAwCisyMjUxIDEgMzkzNjAwMAorMjE5MiAxIDM5NjAwMDAKKzIxOTkgMSAzOTg0MDAwCisyMjEyIDEgNDAwODAwMAorMjE5MCAxIDQwMzIwMDAKKzIxMDIgMSA0MDU2MDAwCisyMTIwIDEgNDA4MDAwMAorMjE2NyAxIDQxMDQwMDAKKzIwMjQgMSA0MTI4MDAwCisyMDEwIDEgNDE1MjAwMAorMjA2NyAxIDQxNzYwMDAKKzIwMzUgMSA0MjAwMDAwCisyMDUxIDEgNDIyNDAwMAorMjAxMiAxIDQyNDgwMDAKKzIwNjYgMSA0MjcyMDAwCisyMDI1IDEgNDI5NjAwMAorMTk4NyAxIDQzMjAwMDAKKzE5NzIgMSA0MzQ0MDAwCisxOTY2IDEgNDM2ODAwMAorMTk5OSAxIDQzOTIwMDAKKzE5ODcgMSA0NDE2MDAwCisxOTIyIDEgNDQ0MDAwMAorMjAyMCAxIDQ0NjQwMDAKKzIwNzIgMSA0NDg4MDAwCisyMDIxIDEgNDUxMjAwMAorMjAxNyAxIDQ1MzYwMDAKKzIwOTkgMSA0NTYwMDAwCisyMDY0IDEgNDU4NDAwMAorMjEwOSAxIDQ2MDgwMDAKKzIwOTMgMSA0NjMyMDAwCisyMDkwIDEgNDY1NjAwMAorMjE0OCAxIDQ2ODAwMDAKKzIxODQgMSA0NzA0MDAwCisyMTc5IDEgNDcyODAwMAorMjE1MiAxIDQ3NTIwMDAKKzIxNDMgMSA0Nzc2MDAwCisyMTU5IDEgNDgwMDAwMAorMjEyMyAxIDQ4MjQwMDAKKzIxMjkgMSA0ODQ4MDAwCisyMTQ3IDEgNDg3MjAwMAorMjE5MiAxIDQ4OTYwMDAKKzIwNTEgMSA0OTIwMDAwCisyMTE2IDEgNDk0NDAwMAorMjEyNCAxIDQ5NjgwMDAKKzIwODggMSA0OTkyMDAwCisyMDczIDEgNTAxNjAwMAorMjE0NiAxIDUwNDAwMDAKKzIxMzMgMSA1MDY0MDAwCisyMDczIDEgNTA4ODAwMAorMjA1OSAxIDUxMTIwMDAKKzIwNDQgMSA1MTM2MDAwCisyMDEyIDEgNTE2MDAwMAorMjAzNCAxIDUxODQwMDAKKzIwNTMgMSA1MjA4MDAwCisyMDEzIDEgNTIzMjAwMAorMTk4MSAxIDUyNTYwMDAKKzIwOTQgMSA1MjgwMDAwCisyMDc2IDEgNTMwNDAwMAorMTk2OCAxIDUzMjgwMDAKKzIwMjggMSA1MzUyMDAwCisyMDMxIDEgNTM3NjAwMAorMjAyMCAxIDU0MDAwMDAKKzIwMTkgMSA1NDI0MDAwCisyMDMwIDEgNTQ0ODAwMAorMjAxNSAxIDU0NzIwMDAKKzE5NjIgMSA1NDk2MDAwCisyMDcwIDEgNTUyMDAwMAorMjA4NyAxIDU1NDQwMDAKKzE5NjQgMSA1NTY4MDAwCisyMDY5IDEgNTU5MjAwMAorMjAzNCAxIDU2MTYwMDAKKzE5OTQgMSA1NjQwMDAwCisxOTg1IDEgNTY2NDAwMAorMjAzMCAxIDU2ODgwMDAKKzIwNjYgMSA1NzEyMDAwCisxOTU0IDEgNTczNjAwMAorMTczMyAxIDU3NjAwMDAKKzE2NDkgMSA1Nzg0MDAwCisxNjUyIDEgNTgwODAwMAorMTYzMSAxIDU4MzIwMDAKKzE2NTYgMSA1ODU2MDAwCisxNjcyIDEgNTg4MDAwMAorMTY2NyAxIDU5MDQwMDAKKzE2OTYgMSA1OTI4MDAwCisxNjcyIDEgNTk1MjAwMAorMTcwMSAxIDU5NzYwMDAKKzE2NTEgMSA2MDAwMDAwCisxNjc0IDEgNjAyNDAwMAorMTY5NSAxIDYwNDgwMDAKKzE3MDIgMSA2MDcyMDAwCisxNzA3IDEgNjA5NjAwMAorMTY5NCAxIDYxMjAwMDAKKzE3MjcgMSA2MTQ0MDAwCisxNzMwIDEgNjE2ODAwMAorMTcwOCAxIDYxOTIwMDAKKzE3MDQgMSA2MjE2MDAwCisxNzM1IDEgNjI0MDAwMAorMTc1OCAxIDYyNjQwMDAKKzE3NTMgMSA2Mjg4MDAwCisxNzQ4IDEgNjMxMjAwMAorMTc2MyAxIDYzMzYwMDAKKzE3MzcgMSA2MzYwMDAwCisxNzgzIDEgNjM4NDAwMAorMTgzOSAxIDY0MDgwMDAKKzE4NjEgMSA2NDMyMDAwCisxODMyIDEgNjQ1NjAwMAorMTk0NyAxIDY0ODAwMDAKKzE5MzkgMSA2NTA0MDAwCisxOTI2IDEgNjUyODAwMAorMTg5NiAxIDY1NTIwMDAKKzE5MDkgMSA2NTc2MDAwCisxODY5IDEgNjYwMDAwMAorMTkwMCAxIDY2MjQwMDAKKzE4OTYgMSA2NjQ4MDAwCisxODgzIDEgNjY3MjAwMAorMTkwMyAxIDY2OTYwMDAKKzE4OTUgMSA2NzIwMDAwCisxODY1IDEgNjc0NDAwMAorMTg3OCAxIDY3NjgwMDAKKzE4ODEgMSA2NzkyMDAwCisxODYxIDEgNjgxNjAwMAorMTc5MSAxIDY4NDAwMDAKKzE3ODcgMSA2ODY0MDAwCisxNzk4IDEgNjg4ODAwMAorMTgxMSAxIDY5MTIwMDAKKzE4MjQgMSA2OTM2MDAwCisxODk1IDEgNjk2MDAwMAorMjA3OSAxIDY5ODQwMDAKKzIwMzQgMSA3MDA4MDAwCisyMDM4IDEgNzAzMjAwMAorMjAxOCAxIDcwNTYwMDAKKzIwMzAgMSA3MDgwMDAwCisyMDY3IDEgNzEwNDAwMAorMTk4MiAxIDcxMjgwMDAKKzE5MTEgMSA3MTUyMDAwCisxOTA0IDEgNzE3NjAwMAorMTg3NCAxIDcyMDAwMDAKKzE4NzYgMSA3MjI0MDAwCisxOTQ0IDEgNzI0ODAwMAorMTk3NyAxIDcyNzIwMDAKKzE5NzcgMSA3Mjk2MDAwCisxOTc5IDEgNzMyMDAwMAorMjAxMiAxIDczNDQwMDAKKzE5NjEgMSA3MzY4MDAwCisxNzczIDEgNzM5MjAwMAorMTc4MCAxIDc0MTYwMDAKKzE4MDEgMSA3NDQwMDAwCisxODkyIDEgNzQ2NDAwMAorMTg2OSAxIDc0ODgwMDAKKzE5MzYgMSA3NTEyMDAwCisyMTU0IDEgNzUzNjAwMAorMjIyNiAxIDc1NjAwMDAKKzIxNTkgMSA3NTg0MDAwCisyMjUzIDEgNzYwODAwMAorMjI4NiAxIDc2MzIwMDAKKzIyMTQgMSA3NjU2MDAwCisyMTExIDEgNzY4MDAwMAorMjAyNyAxIDc3MDQwMDAKKzE5OTQgMSA3NzI4MDAwCisxODgyIDEgNzc1MjAwMAorMTg4NyAxIDc3NzYwMDAKKzE5OTMgMSA3ODAwMDAwCisxOTYyIDEgNzgyNDAwMAorMTk4MiAxIDc4NDgwMDAKKzE5NjYgMSA3ODcyMDAwCisxOTYyIDEgNzg5NjAwMAorMTkyOCAxIDc5MjAwMDAKKzE4NzggMSA3OTQ0MDAwCisxODU3IDEgNzk2ODAwMAorMTg4NSAxIDc5OTIwMDAKKzE5MTkgMSA4MDE2MDAwCisxOTA0IDEgODA0MDAwMAorMTkwOSAxIDgwNjQwMDAKKzE5MDkgMSA4MDg4MDAwCisxOTMzIDEgODExMjAwMAorMTgyNCAxIDgxMzYwMDAKKzE3NTYgMSA4MTYwMDAwCisxNzMzIDEgODE4NDAwMAorMTcwNSAxIDgyMDgwMDAKKzE3NTUgMSA4MjMyMDAwCisxNzU2IDEgODI1NjAwMAorMTcyNSAxIDgyODAwMDAKKzE3NjEgMSA4MzA0MDAwCisxNzM2IDEgODMyODAwMAorMTcwNiAxIDgzNTIwMDAKKzE2NjIgMSA4Mzc2MDAwCisxNjA0IDEgODQwMDAwMAorMTYxMyAxIDg0MjQwMDAKKzE2OTIgMSA4NDQ4MDAwCisxNzM2IDEgODQ3MjAwMAorMTc3OSAxIDg0OTYwMDAKKzE3NjggMSA4NTIwMDAwCisxNzU4IDEgODU0NDAwMAorMTcwOCAxIDg1NjgwMDAKKzE2NDIgMSA4NTkyMDAwCisxNjQ1IDEgODYxNjAwMAorMTU4MSAxIDg2NDAwMDAKKzE2NTEgMSA4NjY0MDAwCisxNzMxIDEgODY4ODAwMAorMTc0MyAxIDg3MTIwMDAKKzE3MTcgMSA4NzM2MDAwCisxNzE1IDEgODc2MDAwMAorMTY0NiAxIDg3ODQwMDAKKzE1NTEgMSA4ODA4MDAwCisxNTYzIDEgODgzMjAwMAorMTY0OSAxIDg4NTYwMDAKKzE3NDIgMSA4ODgwMDAwCisxNzI0IDEgODkwNDAwMAorMTY3NiAxIDg5MjgwMDAKKzE2NjQgMSA4OTUyMDAwCisxNTg3IDEgODk3NjAwMAorMTQ5NyAxIDkwMDAwMDAKKzE1MDMgMSA5MDI0MDAwCisxNjQ0IDEgOTA0ODAwMAorMTY1OCAxIDkwNzIwMDAKKzE2ODAgMSA5MDk2MDAwCisxNjExIDEgOTEyMDAwMAorMTY5NCAxIDkxNDQwMDAKKzE2NjggMSA5MTY4MDAwCisxNjc3IDEgOTE5MjAwMAorMTYwNCAxIDkyMTYwMDAKKzE1NjcgMSA5MjQwMDAwCisxNjM5IDEgOTI2NDAwMAorMTU1MiAxIDkyODgwMDAKKzE0ODYgMSA5MzEyMDAwCisxNDk0IDEgOTMzNjAwMAorMTQ4MCAxIDkzNjAwMDAKKzE1MDkgMSA5Mzg0MDAwCisxNDU3IDEgOTQwODAwMAorMTQyMyAxIDk0MzIwMDAKKzE0NTkgMSA5NDU2MDAwCisxNDQ0IDEgOTQ4MDAwMAorMTQyNCAxIDk1MDQwMDAKKzE0MTMgMSA5NTI4MDAwCisxNDk4IDEgOTU1MjAwMAorMTQ1NSAxIDk1NzYwMDAKKzEzOTMgMSA5NjAwMDAwCisxNjM4IDEgOTYyNDAwMAorMTkxOSAxIDk2NDgwMDAKKzE5NzkgMSA5NjcyMDAwCisxODk0IDEgOTY5NjAwMAorMjAwMiAxIDk3MjAwMDAKKzIwNjIgMSA5NzQ0MDAwCisyMDk4IDEgOTc2ODAwMAorMTkxOSAxIDk3OTIwMDAKKzE3MzggMSA5ODE2MDAwCisxODkwIDEgOTg0MDAwMAorMTk3MSAxIDk4NjQwMDAKKzI0MjkgMSA5ODg4MDAwCisxODYxIDEgOTkxMjAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2c3MTFhbGF3XzFjaF84a2h6LmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfZzcxMWFsYXdfMWNoXzhraHouaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmU1NDgwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2c3MTFhbGF3XzFjaF84a2h6LmluZm8KQEAgLTAsMCArMSwxMCBAQAorODE5MiAxIDAKKzgxOTIgMSAxMDI0MDAwCis4MTkyIDEgMjA0ODAwMAorODE5MiAxIDMwNzIwMDAKKzgxOTIgMSA0MDk2MDAwCis4MTkyIDEgNTEyMDAwMAorODE5MiAxIDYxNDQwMDAKKzgxOTIgMSA3MTY4MDAwCis4MTkyIDEgODE5MjAwMAorNTQ2MiAxIDkyMTYwMDAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfZzcxMWFsYXdfMWNoXzhraHoucmF3IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2c3MTFhbGF3XzFjaF84a2h6LnJhdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmM0YTExCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2c3MTFhbGF3XzFjaF84a2h6LnJhdwpAQCAtMCwwICsxIEBACitrb2dPx8XY1Up2Q3VzWNPVSXZKfn1LdVldwcjE9PT0ythJcnRCUlTz+cfaxtZUxfns7OP/1U9lYn3Z/u3p6+HBW3NnZ0T05eDg4OXGXkxMS39lWlFJ2ffx81B2eG5tcFXk7eT+3GBoFxRmdvno7+bnw3VnbX90ZXdYW99fWNjE1M/P2MFY0NZ5ZX9ncVLb+OX/4fhUR2VzRnxPwvXJ0FnfWXXC5u+V5shKaxARa3f465CX58d3YmltTPnk5uzk2EN6fHlicMPl4+fh6Phbdnh4SkL0//X+9F1xZ2F1X9374OPlwsZWZXxVwVRPcElwYGRx0PTB9+TYTEJGS3JldnR5c2dmfXNP1EJxUtzcRnHczU5OTXF3WsL75+X79NlzaWHY++Po6u39W2ViZtzk6ZeV6O/4WXhkeHxK9+fk6JTq4thzeGdmZnnE/NlQTGRme0/azPbx0UBxYG96QM7l/8vaX31ibEPw5ef53UZmaW1iZFvN5OVWRkhyfHxkdlzYx19F29ZJcGF+0Pb64+fwUnx/YG9w8e2U7fj0RGRua2Td5JeWlevu/dVwcENE2PbxzcnE9vHdW8fDU397UtPczM9U3FNX1FDVzsnI1XZGRVb3+M1dcUtyY2dV5O3nxtRIYGtuY353w/vJU0FDd3hjZmR4fntmZ2d8TGRmfNP1xdX299BNf2dnZ0bn6ZeRkZfhQn1M3O2Xk5yTle3UeHx19OX18fzSxdvA8VN1XHFmZ3tYxEFzS3dbV01eWHN2cmF9Rc3g+PH/U3J9YGVyT+Xp4Of2XHRqEGpk2eHm+sx2Zm9qYEPR8/BTTnN6f3hjZ2B92d/B5+TnyHh6fED85OXi/9hVc39I1uTu6Ori5uH42F5RxPb3wsbx8vPY0MzOz8NEeWdmc0TZ8v7m7ufHX1rfV012fU/TWETcychXeGJrbUzf/uXATmRpFxMVc9bb3U12Tn9kY3p1R1DO/fz58FB2fmVAzOTh5P/7wtXTdVDw98/G9OD/0F15Y2Rwze3t7+HwXGRhRcr65vnQRFpeVMbglOrk9Vp1cmR8V8T64+uX4PzwUHthY0jM8PnES3Nja2kVYnfW0lde1Hxua2oVa2FBzcPfXVNkbG59xff/+spBdX5yclj85/XIw/3n/eTk8ddERcfVz+Ht4MpGQkRJ1tbGwtvd3VNV091cdUpCXF9dVV5AUNj4+szLzER9Z0jl7ZWW6u/k8fr/8eXn5uT+4e7g+9t+axViWsn67O7wZxYdEBdrZ3N5ZG8UERIRb2FxV9TRRnxhFRdpZVLA9//890lkZXBE3cHL13d0SFzGwffn+PDH3dtXdnxmZVXy5fv75+VRSktT9uCVl+/DQHN5ctTllJTs4+Tk4+b3wNXw5OHol5Xv+8L2wNrExVNYcVLD3NxacX17Y2Jsek5Kc3lvFWtgcV9VQXtpaxcUY0hAfWZkX9rIzdRXUXJB19/NyM9efk7G0dr28f3+8/daQ9Hw5uX09fnCTnZc11fF+OHg4uVHZm1iReXrkZCRlfzIxkHT5O3o4uDs91BTU8z3UVDEz9rFwt9naGJlfHZFcXhjbmtvbXxGRndkfHVmaGR6c3BLUEt/R1NBdGFkTcLbxMHIRnx0XPLtleDMWVZT39/Dy83C2Mv4+8DK0n1tYUjZzufs7eDOTXxxckpaxMfL5OHk5eTx0vXj7+iUl+79X0tfz/fY2MLaU9jFUUlFd2VkZHh4fX9hb2NkfnN6e0p9bhMSam14UPb+8txHSklexfHl8NL0zVFaREbW9eXnzdDbSGRsaXteXNv65fNEeXJibn1bVcDe9OPm5/tX18fE7ZSXnZPp+sPI5uXn6eT5/dfBzdTe887cd3pFXkhSTndBfXBBc3h+bGoVanxAd1xPenh6dFxzZmVmfktI9/vDUUFPWNb2+PL1x1tDdmdJ2fb588fQRnXR1kBS3FTXVMf28FB5Z3ZxTfb9/ufg7eHeQHBzTlfL5eT6/cvxwczl/MT++v7KzdZU193z+eb6ytNaeGVwXt9V1ttYS1J2f01XV8nTWEdKQX5gYGJiWPDl+cbTUGVhdnHR/8nCz3FjZmRmZWV/c0rSVXJsamhnTf3hydXXdk13bGZQVcDzxtrA/u/r4/rA2vP64+P5+OH64uzn4OPIzfDRTF3F+OX08cj+89Hfw07Xydj3W2Z5cmB+fGdmS17a0k5KSEBzfHx/amF3cXRIfNrZZExxZnBYX/73U3F5fnp3zfz/7f1QZGhpc1nJ5v3FxcrI/t53d9BUVfD788fRRllKcEPz8/bMRUlc0vPg5eXm4/3Lzlh1xczD//D84+D3X3l5dc/tlJTnRnJ8ZUxRRM/429jef2Zlf0tCd3N8dUJ0Qn1gckl8WVlC9NZ+c2BqZUFU0FpCTUbdVl7NWHVWRndbc3xAT0LWTHLYyfH4zkBbUs7+//rWRNjUxePh75Tg8s5cxufk4/7WQFna/+fs4/Lz1WVgenpF2Pf45PfFzt/GVXVwRtn65PdAfnZwdtfeVvbMUEtlZnBISXJ5dnVMfGFtaxMRFGpgZXh9f2NtbWNkU//n5clIeHl+1/H1zObg+/7z/ebg7erv5/nm4frw/eXj6O+VlO3j4MnSxcXw5eTl+sBCcnZweXh9SVzeyvJTZ2dydFHe3/b499FQd3NfysJDc2Vnenp7cGVlfXtkemV8c2BsY2dsaGF7YWBiahVsYX59Z3PS/uDm9trFx/Pk5f3n6e7g4eHj6Orq6unj7Ojv5vn+5efh4u7j+f/ETX18ZWVycUREfWFhfnx/SUTc9fv6z3xsYXp+d0dXzfTN2ll+c0xHQ0TRUEVGTnZ8f3XezdrYW3Nkb25taRRoYGFiaRUWFhVpYWdkcF/VUERLTdH94uns7eqRlpGQk52dnJyfkpCQlujg5+fg4+H7yXVnZ3BJ387d1tRSRnxjYGR+c3VP1MP29sFQfXNX3tXcUUVU097K30BOc395eWRkZmZhY2Jiel9cREV8Z2ZgZnxgbGJubmkVa25sZ3xzcEJTw9zf3l7Rz/D55PP94ef65OTs7uuWk5CXlO7o6OqUlZaRl5Xk29TaxMP0y/Px//ncdH1wXM3z8fn9zMxUVk1zSV9MdUt8enpkZ21pb2xnZGBsFRERFW5jZmR6ZmxpFRRpfkxTVkVY0d3VWEBHVPLk5ffGxs/EwvL98PLz9cnY0dz3y/b8/Pz/5uHl9s7I9Pzm4+Pj6eqV7/754e3m5eX65eDu7+fz8ufm5Of98/XPwlV9bWgVFWhtb2oVamgVEBYVaW5qahYWFG98THZCU1TXX3N7ZH1Z199SXNFWUFlxcE3c+ef2x/X8+uTh5/j+++zo4/7E3NFT0NTY8eXn/ld0R1rJ5uDt5vj69NNHRtv38+Xh5f/z/Pn08fD77Ozo4v7yy8rAXnR6Z3p5f3BnYXx7cHNkfmdsaRQXEx0QF2ttb2JhbW1ib2Jhd9few0F0RXFa30Re08bl5/3w9PP29/zZUMr+4eL78vLw/ubg5/7k+Pvn8fT88frv7Ozu6JXt80R6XMPw7eTOyNFXx1TR/OTj4uPh9cvFWFhxZHxxcEx1YWoUbmd0cmNgbhcVFxdrbXh5ZWFpbGZjYWZpbX59RkB9fWRkZHt8clbz5ODl21fYzv/k5P7P8PP2/NnF8/rpleP/8fXL9ffK8OHi4+n7z/77+/30y8nxysP3z9r95eXn/fb65O3o4/FfUVVb0VNxcXJ5dHR+fHdGd2FqERcXFmoXEhMRFG9jYWFmZGJjZmJxwcDI2FHR0VDW1ExKUc78+/deTkpwXMXKz8312VZZRtT95uzj/Pnn5+Lm+efm4u3p6ODm5vvxzMfD/Pvm+vfCQlrR9P71/vr55v3WW1La3tFeSWdgYmx4Z2Z5fUd1Z2FjYGFhYGFmZXl+SH5kc0pdXk5wZXZIc3F3cHtne0l3c3dJVNZOf2RJ38Tz99dbUt7/5/709fzywsj3++Lh5uT8/vzk6JeV4ePg5+T68vqVlZeWlOjk5ubn5cn19MLHd2BifH98dGdtFBcUaGFra2NkcWZ4eHVEeWRpbmJkdVjFdXNxYXxlfnZfydreQ35jYE/X9t1Y1HZFdnt8cFBRys1CcX1aXcfNy+X54ebk4Pri4+Pt5+bk5+Lp7ODt5+Dm+Ob9+fr65cBTX/Xj7+zh/lV/eXxfRkFUX0luERIXZ31DQnBweGRhZH56fHBBdGRnZVNEdU98cHl4fEZSTdLB9MdMcXnWyfTMWlt/ZGFlRktaXN3BWnB618rK/cXPVElU0/r58Pn45c/D3v/j4+/n4eHx98nm7ePi4Ozk9Nv07euV4+TyV9ZW39vW01LSWHhtaG1gZWFkdX94ZHZAdnxkcHRkbWlie3V5Z3tjY2Z8RVHD1F9Ycn97XvDl+VFBcGFmf1XT0URA1kpyenTM9fP1ws7Z2sD/5ebj5+Hk5P724ePu7uDh5efk7e7m5vv48cZdQfP5//jZ1kBbW1L3wMTHUHd9ZGthc0zDUHV/e3lz3dVER3NnYGBpZ0F0TXFia2tpbnJDSVh1cnN2eHXO9/L2UEhJQn1IQXNd3tzS1XNldE714+bl8sNQ2vHH9P3x/f/OUPLm4uri+Prm5+Lr4u3s+vHK9sH44f/kyXZ+fnl3yPf0/dNHTHBgYXd23cFAQnZkYn50c9XRWV1ccWR8enZEemRnYWJiZ2N5Q0t0cHtjdFLR91BBdnhnZkJKTEB9f3t6Y3lfwODn/ffx/P3v7u3s+v3MzNTd+eTt4O3r65Xs6+vi7+Pg+/PFUsz2+/7aWnJ9ZXNTVsTRVE1+YWl6TMDz9cZFTX1yQUBNQkhIcXF7fkBT1UNMcHJkbGNgYGBkenNwZGVH0cTRRnJgY2J4SHBzRFhMSnV1w+Tj6eP/w8NV1vD6+fn9wtNCeUDJ9Prs6+3t4eft4efj6O7j4vL0+v782k1hZntkQtNQRNzL2sRIdtvS0tXaQnxKf0FU1NnA901xfmB9c0dU1kJhZG9vYGFlZUZDdX1iZUvVwcLEdE12dFpweGRxSXhlYnt1QtvB/cTA98n7+/jk5efxwFxH39r4+Ofk+uf74+/v4u/r6ebyx8rD8c5fcWxnZ390Xt3a9/331F7T/efk8fndR3h4dEdddVFaeWxuaWNyW0NQdnpkZHt+W3FH0Nd0eWdlQtZLQFpzd3RdS1N1Q9xSdmV9cV7w9cTER0xN3dPl7PrlydRMT1DC4+zk5/VTRsn/++3k7+/ky8Hx/eLp5f1XcmV/SHHNyPXOVktw1d724/v22XxgYEldw/TJzFxyZHVPXsba1U9nY2FxdUHS0VRwYxVqaWVW0F52Zm1gStLAyc3fSmZrZkrR/PPz2X1sb3DG+u/s7PzTQlPSxODr6uDx11rF/OCVlZaW7vzazfXn4OT2W2ViZnZFw/XOxkp+fkzX9ODg81Z9ZGd32ff0TXhib2lve0bw+9t3YGsUbnNa29fRXnhiFWB32/jIXHF8c3zZ/u3i/vTa2EdcxfT7919we2RgTfXz8MnN3tPR2vH74+LwWHZAQF/2/ubl8/z8997J4eDn33J5e39wy+bn8trG3VTcxP79+PNBcnhxS9nwy95KTk11S3fF8cnce2ZtbGJlQ0dCS3R8ZmF7S0xwQH1nY2RLVtjH2lJCQ1zW08XY09xPf2V5S974/MNRWVBdU/fg7OLj5cNGTcfy4ebh5vL19/P44e3g/sjXTHt9cdv9ycPeyPTJ9vjk8MXNxEN6cXRFWWV4e3l/fkNG0cFdQnNlYnp/ct1GcmVnf2RxRNjxRHRBdmdkTVP29NfWQ1/c+eb85/DYWnlnZ3d3V8NBdnxPXNX38u3mw91fQELSzvDl8szW1sTy5Pvk5/DM09JU28/z4eXDQFzA8P764+P82VledUPcy/3AW3hhZHfe8Ofn8UVjaWlicnFBSXtuFGx4QtDT0kR5Z3p0fUxS09JOeGNlWt3x98PLxVt1QULR211RTHBneNfK5u3t4/ze1vXy/uLt7+bPWE7c9OHu4Of+w15CR0bbwsLZQH5mcNH+4eX49VVMTtTUzcnT13NmYGVE2v/zyNZOd3x1RllQdHB6bWlve0fBVUdHQllf28LaxtzbRXl6eVrf/OTk/sPVREZf0cZWR3JgbG961fvm5fPfRXVI0c31z/HAdXt4RtPz5+fn/PHl+eXm4Ob78s/G2sDy5/rHVdVHRdHJ5fr03NF0ZGV/Wczx9/fad3FMc0hBQ31lbBYXam9y1UB3SHJ4cH1dzt5UVlh5ZXdN0PHM0dJ1eF/cwvzk8tFbeH53cNf//s/CyMrl5OTt7OX199dIUlHS/fn19/LA9Pn85eT+zdBFcUBId9z210p0cnRV2/Lh5dxRQHpgZ3PS9sbL9ttd0NFc19R0fWBqamlub3BKfHdJXsb0/Ofn8crOwMbQ1dfC2EFHQnRax8Pe3l9LfmVleHhlTtFWRUZcx9rcy/r4zdVSTXB8cFTw8cr55Prl5+3t5vnw8vn9983C981cTVhX38X19cjcQdfC2VJc0tJQRljH39LB989RTnlkYW1tb2xvenFnenNKVtvc3sFSdUZGSHh/SURfdE9SR1vd2lfSUHNLUFTb2tv3/fbJ/uXm4eHt4uf3xPbRdndIUtldRMTCwf76+vnJ9fTxz97fXU5wc3J3Q0hX2N3O9N1Y3dZYU1DQ31fAxNRd1s7B0kBKcXlkY2R/ZXBMR0N1TNzTQVzT39vDzsLVWElxcHNE19LGxd1U10twQEFIdEhPd0Dfxs3H9P3+5/rw09jAT3ZxXd7e0NXMyvD///r8/fb/5/D18P3EXl9Q1tBFVVfX0kBAdFTE19je2lXYwlfP2NjF3d9NcXh+eGJhZHp7en5ke3JwR0Vd1tzcXcXbXVNPcXh/fnBTW9fSz8pXWkJXzc7I9/P98/bB8OX45+T58cvA1NZU1trbzNXVVV5RXkFb3MLG2tDDylJHTndNSE93cnVARlLE3MzNwf768vbKw9vRUtjw8sDdVUh6YWd6d3V0Qk12d09IS19S0tJX0VNU3s3D1lJZXVp3fX9FQkxHSEBMQkVfUltQR0FcUNLC8/bz8s7C3FPVw/D3w1RUw87EzPz65OH48Pzw/OT69dvdU052cUNTW1nQUF3T0NPeyc7N2ltOU9bQ2FdYV1h3cHlkeHB9fn18eHx8emR6c1pAd0pV3NLKyszZXUJDQUZfUFNFTUxc2dnSwPPw9MrG9/vh4+f6+/7CV1tEX9ffU053QFBV38XJ8fPxzN7Y3dPdx/XJxVZBc3ZJcHRLWkZDUdzYxPT+/Mvd2sv98szbVVN0cXJ9dENaTXZ9f3xzS0dGVdzQUnd2WdbE287w3050TEBNQV9Td3FwfXlkendSVtjNzcr38MzFzMPDxNdU28PbxMTZ11NbxMXQz/z58/j7/vjn4Obm/cZXcXRNR0DR01HRXlhcVtza9vDC39zEy8Fe289bdUNxZ2FjZ2RneHlzdnR1dHVOcHxLd3xC09r18vXUQnVAX19WxsHE0V51c3FCUdrL9fP88f388vrl/PL9zdlVVFVYQU52dF/S2N3f3VJEU93exvH98/LI2FRbWVtQVNLT29BDdXdP183/4ef5/PL2ytzYw8PYU0h/Z2BnZXh8c3BDSnZBSkpDW19X3cnzy95dQHR+fExTU9RfQFlxcnB+e3TRzvfBwcPExM3AyfDy/d1PR0tY3NrJ8PPJwNzXW1xUx8zJ/fz48/H48vTA1lFV2N/Y3VXUUUFAX1DGyfXE0NJXxPXN09vPzF5xf2VgbGBkZXtzd3Jyf3xDRlBV2cvAV9XSV8XSUkdMUdFXWtfeXUV0Rl/S8/7//Mnd9cfRw8jz+P3Nx1FYX0BfUNDdX0NYQ3dEQF3C28bPxl5fUNHI0FTWwcXX3NzW0cfWXtRU2fTx8PDByv7y/fHw8MrEQmRkfHl8TF5dT3N5cH12QUFYXtdVQEx3dFzRUVpOdUdBTEBEWVfTU01CUVJB0tpX0cLx8svC983H2t7T2N/QxsP2wEHXXVHd0sfY2NTA1lPWUcH28vbN1NHEVMPfVMTY3NDVXtnEyfTDzs3P2txR1dxIQndzcntlZX1lfWVjYGB5d0lH19HeydjLw9jx/8zURXVTWltRUF9dXElKcUpd1s7M9vnl//j79PLwwtxWW1BdSFDZ3dVDdHB0UNhV3d1Rx8bS1tTWzM1ZTnd1Ud/S2vbl5cja0F3T2cL28PH+8M3LzdnE0kBOTnZweX53dHR0fX58dEd1fHZMQltGRlPYwffDQXR/fUpNR1fEwdFeQ0JE0NnQ2M3F0tDdycja8Pjz9vTB0FBd2vfJxlJWy8TZ0kVZ1tfb3Nb3/8LH1E1BWVXZ38HwzNzfSHJDdVrYy/j+2d7H2cjL2sbQUlVxZX9nZ31nYWRnf0pzdnxlQ9DcwM325fLL89NHX0tA09HGy1NCTHRAUlTYwMrzxdn3yv3k8cPz8PH0WnZIdVrT0VxYVtVfR1h1QFh3SdjL8vnfU152d0Zc1/Xz9cXawMbKx93F/fr58lZfUFDYyMnSwtFKS0p2dVhMd3lzT0h3fX55fX11Q0FRUFpQVEXR3UBAWcD/9tBBcXl3dV7Hxfb82lDX3ff//vv45+Hlz8TVUtDQwsJQXlZ3cVFXVdZbSUTB8vDExdpUR0BU2NrK/N1U31lW11lN2vT0995VXFpZ0svJ019GeGRzfXRKcnBKfHt/eWV/dnNLTF9d38PT28/1z99dXcDCyffdQENLc0BX2s7L9dvc28PO8PL74+b45fbV01BHW1hfUUZ9c3RDWVtBSU5W29DPy9bH0lJHT17AztPK9Mfb28PJ8+fm8/DOW0BMR1lT1NdNe3JyfndZVlnVxN93cXR6e39yfnxxT0h2QURIQFZWUtLK/fX2ytlVWUROX1DBx1XQ2dVf3vfz++Hn/PTG3sfOy/T0yPXfRkhYQUtXVEFNU9LQ3d3a1V9RUUNNVNxWVcfZ3s3KyfT02NBTdEp1RdTFxMrywFx0SHV2R1dRU19MS3ptYWRlf3d3SnRDX19V38THycPMysTP0F5ZTXZK0d/AzcvBU1bYwNjy5fr8yv/L1NDDwNr2ysnQ0V9PWlzV1MzA1FhGXEt2SVpDQdLB2V1V1lNXxPTOzP3k8vT0219IRVJUxvLL0dVNcnxNRUPVxNF0d09+YWFyfXhIVVlzcnJ2dElPSF3R0dRXV1pMR9VQRNvzyMXBxtvcwc7P9eXh5f/8/snE9vH2+uX2997U1VbQ1VXWwdFEdXl4ZXxaR1/O8vTEV9LH1dPEwcL29vDHQ0x3cEp3TdLa1VJZ1dVYU19MV8fd3F92cmVjZXpxRURHT3FydFpdTkHL98v02FJVQ0FVWlbZ2N/W3MLM9cvYwPHy5Pr0zPXEzcrD8PjwxN/b1FtQWHB0V8TGUEx3eWZ9d3XS9/fB0tHU2cjbV8P65P3w8cZdRNdeRNXfx1VSx8XRUnd9c0VXUFpAdH1lYWNmfHdJcnxDdXZLdnNOzfb12N9ZdHN0SErX9/bR2f/x9MfF0tn3wfbw8/L988jY3/jh+vLw5uX/w1BFQcXS1Vl1dnttYmFlRcP39PTz9cLd1FfD+PPPzvXfXXN9fH5cVURG1crC3lNBcHdaR1pCd0lDeW1uYn9wfU5QV1tYR0NB0vfz/v3M3V13fnJayfTPzvXw9M5QR1be8fXx+/r6/c9XW1rC8fT98OXl/sNRXkXUW1nXXnVzZGNneF3X2fL299nTXVtY2vn09v3y99pfd092R9dS393Mzd5ZSHZwRkhDWXFwc3tnZGR3RndCR0p8f3lxdFrJw/P4xkV2cnt7edH3x/Xx/fHK3lBQVfX2+ODn5+Xx3tZUyvjl4Ob7+fn31VDfysXY0kFxemFgZGRJVlfE28HPyMjHwcn+//bHVN9HcmRgZnBNRNLfy8jG1ElBRlTR0tVCSXtnbWlhdE1GX3VKd0p0dd3K+P3y8c/fUkl+f3xaUNvA0Mjz9FZa1d3K9uTg4eDn9FxNTVXB9vn9/fzK2lTS9/3N2MVETnZlZmR8QlZdUUVd29jS3fT+8MLBzt/Iy1FNdUtBU1XCyvT321J0SV1dV1FRREllbm5tZ3deX1BBdnB9e31fxMHa39nQUUdITk5f19RSV9VSVtBbTEVZUdjw5u3v7+HwwsnO9vvh4OHk/8TVxsba2VFSRHRzeXp9dUpFWUxDX1HY2cL++/DI2dBVWV5XTnV2c0ZEVsTNxMnUSUROcU5KW11JcmVgZ3p5RFRR0ldYUnZ319BV2tBdX0FYW0pbVVnW3tTe0dPP10dRWF7BzfLj7ezj+PDD0M3x8+Xk/vZXUthTUdNcW1BFQEh2Q0ROQUR1dEJUzPX85P/y8cza3VdWVklMSndFX9XG9srE0tVQdnFEUdzWU0pnY2FmYH51dXRITUh3SkFcWVpfQEhGXllUxlNc1VlaWVfW1tNWWUhMVM7l4Ovu4eb7x8nz+OPt7e3n98fcV1hF3d/R31BGR0xwX1JJQ3ZyR13UzMjB29jMxdjN1F5TTnl2cUpVUd/32VtEdnJ3dVfR2FJ/emVjYXJyS0VHXdVQU9ZRU97dVdfd0dfY3NdXUkBfXEVR09dTUEx1RNPF/+Hh4uX5ysXL8ubk4OP69dLTTV9ZREVa3ldVXdbdXFZTRHx5dHRe2szJw8TT3sDO8vHJwVZHTF1UUsXD2ENyfnl/fERS3snCRX93cnl/dEN9cU90dnJ3WkRBWHV9TEh/T9ZWXltQXl/V2sDE31NcSEDWVv3u7uLn5Pjl+vvi7Ozj5vnMwt1SUl5NQ9RVV1RWxM7TU19PdkJIc17fVE9MT0tUxdvT0dlFSHRB1F7A99pcSkp5cHRxXsXAQ3Fwf3hlf3dCWkBFQdLc1sHfxVBFX1pZdU1TV0BwSkBF0N/ExNvRQ0Zd0s/84+Hk5Pz1x/fx/Prk+szOx9rRVNFW38XSX0Dd39XZ3NxRTHN/d0Nb3dve0dHfyfbK8crMVEN2cNzD3MXEy1RDcHBTRFPQ30RyfGV5eWV+dkt2cXB3WkZCQljVU0Zyc1pJcHdOcHp2SllQ3/bE3UdFR9z75Obg7Ozh5uTh4O/t5eX/9dzYxd/SwsjGzMPdwvTBxNXQ0HFlZXF1cnNwcHdNWtfDwPTEWl9CfHNS29dT1lZMSnd1UtbV0UxKdmFlcXRxdkBIdHdHXNPP2Mbf2dNDTU5AR0BQSXZ2dltQxcHSUEBOf3bUwP/55+Pj4+Ht4+Lj5/rA3VhBWXVe0NTW383R3vXz8/XLxdNcTE13dnVzcH9xdljb9Pj/98XZ1U9NWl7VUVNXV1tJQtDSXl5Gd31/c3ZwdXJ5cXR2cUDc0kRQVE1HQU51cXFwfXNzcnND18/N0N9YQEdGV8Dy8v/n4u3t7+7r7+Hj/NjIy9rU091X3c339PX++vv0wNJBXUVzfnN+YWdgZXZL0s33w9/ER09Kd0pOWENS0tDb0VPfxNVBW3N+Sn5zcH9nZHFySF/cz/TL0sTcVsHWVlR1fnh/ZX5JVsbBzNdeTX53RkHSzsz2+Pvl4u/v7O/g5P/Az8DT2NVKStDXVM79+Pjm+fb309TQRUNOZW1nYG9+R8H2///J8t9W0tbf2t11XNdKQFXf0NnZRF5KfnNwc3JlY2Z9YWFNVlTEytXV0VNEXl1OdmRgZ2BgfFlTVsJRWkdIT1PG9uX75eDj4+Pp6uiV6+Dn5P/28vXF31jd3FTF8OTk4+fz9MdRdEhMZWFva2hpY39T0dv329vUW1xc11FSSHF1fHFMU9zT99tARXZzdUt8e35hZWZmcEPU2/P0w/XA0tRQQHFNZWJkZ3xCV1zayVLQVk7QzM71+PDJ5efm4unu6ZXg+uTKxcnEV8XdS0NHTtb/5+bi4f79xVpQR3l/f2xoYGZ6Rl1SxsjAxsTUyfHdxM1SdExDRtLAxcHeT3B2eHhzZWF6Z25sY2F2V1THyMfXVFBFRUtzdnhvbmZmeUxe1sDa1MbZwP/4/fzn+Pjj4uuXlpSV7ufk+//7+/TAz9ZNR1jW/Pr+5fjN2FRFVlNPeWFjaWlubXpzcUJVXkfZ3czzwFNV10J1Q1DFz8LSUXZlfnl5QkB+eHlgYmV+WMfJyM7EW0VQUtjN1XB/eWFhZmV0R17Q2tXdzM795fj19vn8+efi6ZXr5uT+z/Xx8f/w31NXWnFEw/34+Pnyy9tX1sfJ9V19f2ViYmZld19U09jb0Mj///XIxtTZUVvX0NrGR3dycmVkZXh8eGdjYmJuZENe3NVTWUROdUPU2lRJfXpkbmNgZ0tbRVPG2NXO/fz7+Ofh4+Dt65WWlu7t4+f//f729PfNxNrU0ff8+OfyzMDTW0JZ1lRFfGZvaWtqbGZF0EPZwNlXxvTFy9rfUUNPd0zV2NtDSURPfH5yfHJyZWFhen5wUMXP0tLXWF5f2vXOxVl9ZGFtYHtN0NhXV9zaw8Dy+f/n+PXL8fv47eju4+fk8M7Yz8rbzNBF09rI9ubj5+X13VFS1VbY10RyYmNvb2dK2cH131LPw97N/v/MxEd0dHBQ38/HVVh8cGViZHN8YmJpFGJjZEXf09PTc3xNR9j39Vd2eGxvbWFP39Ff3El0yPXx5u3i4frLz/7m6JaUlOvnyvP5yvnh/9FbRkXI/uTu7uLn2HV1REVUzdV/bWoUFWxkUsFTW3BlSsH38v7/zExlZ2V8V8Hw2lRYZmZlfXRHXXlsFRRif9Pz/vj9zHZ+QsX8/PDQdmRvbGNy0drFQXd6Z1rP4eLh4vnFR1zK5uqV6uL6y0xSzvnm/vdQc3xI2P/rlevv5MlMcVXA8PTaTGRibmF7VfD3x0JLdEnZ9+fn9NJ3emRkdN318slBdn9gZHFAXHluFhAUbmFC9//2XHdOfX3d9/HHU31jY2BmSMLa1HFhfExexPjt4uf2x/H65OKWlZXo+fLy8v3g7+XJWnxIzfPy6JTq7czQ28bTzfDTQXJtFWlmZ0PSQ05kYX1DVNLy8dhEZWZ/XkbcwlbQSXplc0BR00R4YWoVbHJG1f3z89x/cVBWxfLx0FBzYWB5RNHKUkJxY2d0VsH45fb21UfU9/rn6e/m5PfBzPb/4+3HWktzSFP/4evr5ufzzszy/P3620J9e2djddXP8UFLdHBwQ8vx5PBQQHZxftfN0cBddHJ/eX1QWlZwbWsWFRVjdEzT1UN1S09e9cLGy9V9bGd4e1Lcx9J3ZWdyTsf0/+H+yVDN/Pnv7ujq6PjK+f/h4uLs+N53SdHF++Lp4uXM2PfJ+uT098V3bGtiYH1EU0N8ZmtsZnPCzPHCQn9ldnHW98TbUUxnYX9xwdxATX5jFGhjf8TAxNvXR0Df0vrmzfbTSWFmcnTNw9XQXXxvZXfd5fzk/MZWUcv35u/s4/rwUFfO9+Lg4eXbRHND0PLs7+P4/vDL+ubv7uH0SHNhYn1H2N9AfGVgbGVI2/H3zFhNSnJYxc/2xnF/f2JnSlnTXklnb2gVbHpxdHd4eH97SNXSyfXDQXdxZHhBUlZXQnlkZnlY2frn5fn++PPl4u/v7uD9+vHA8vjh4+znzsBW0ffk5Obh//vy/eLs7+L7yE5xZWNkcX16emxqaGlnd1re39JeTE5JV8/MV19Ff312cVfHz8VYfGxiYGF0R0t1QHBzU9PL//7331FIS0p8RV9NdH1hbXpyQsny8vT28fX5+ubi5vL2zdfYxdzw+fryyMXQz8L0+fzy/vD3+Obj7ent+vDFWU9xf3R3cnpmYGZ7cUNV3dzZV0dYV9XdwdRXVVtGT0xPWlxJf2Fvbm1iYXx9f3Zyc0JW19bF21FAcXJyfnJ1dnN8f3lzSFPY9vn///Pk5uDt4uzg4OH58/P88/P9z8fPyvTx/fz6+vv5+OXk4+/g5/nLwVxPd3N5ZGdvb29obWNlenh3SUtBUlHd0VNU19TWV15QRXV9dn1le3t7e2V/SEJITkVY1t7b0t/aWVhPdnVIdHx0dntyfXFdVMT18s/B8P/n4ebk5ub++/zx/sva1dVXWdrexvP08frg5Prh5u3s7eHm5sraU0xaQ35+cX5kent9SnRbX1VfSlld19jZw83O0V9cRF5AcmdhZm1gY2F+eXh5dnN4c0JBXEdBVlJMdE90QU99d3J9emdzSV3byfT/+fvn4u/r6O7p4+X58/Dw8NpSV1fe2cDx/Pn9+/Lz/P3n4+zm+eT13VdHSn95Y2xpaGJjZn90QHZ3S0pZRl7R31XZ9N3SUFvc0VJKf39mZmR6fXFHRkF2Q9VT29nNx19bS3FDTV5BSHF8fHhzfVjY2trRVNTB/OTj5uPv4ub4+PXLwNVRU0hLSV3Y9f765uf6+Pv65uHg7eD48PT39/fKWXR9ZGNgZX9yTl5dUF5S2fXxzd/SXEJOdHNydnB/fXN7YWBmYGFgZ2BmYWBkcEx3Xc3YXl9CdXN2c31kenx6fnTYxvb8/fHz/Ofs6O/p6ODh+ubn+vH1wNXWVdLX28728/D0/vj5+uPg5eHn5fnxy81fcXB+YWdnYWZ+dndBQkFGRllFWNDW01JeWkhMT0lKSX5kfHh6c3FwdEt0dXBzd3VHWNXa297F3dpfdHJyfmR5cnd0V97J9c7L8f7k/v/l/v78/MvAwMHU2cze1N7YxdxY2MfO9ffP8f/74+nu4ODk+vz9w1dIdnF9c0teTltV0ERYTUVX3FNT0tbUV1NCd393cXBkZ2ZgZHpkYGZgZnplZH1ycEpSUFFTXUVPTHZwfXx2Tk9Vx8TP//n19ffx+efh4+zs4uLj4fjw9MBUX1NcVNvLz/Xy/PH98Pf++Prn5vjw/fzwydjXTXNycXV3SXB9c3V2c3RNcUzQVlTWUERHdH9kZX9+fnl4c3t6c31zd3FzS09IWtdRWVBFT0RCSkhKSU13S1JTU9TUVcPC3sP39c38+uTm5uTn/vbI9cDS3EZMRkRH1tzH9v32/fn5+/rk5+f+/PP89vbKxcfcUN/M0NHUU0RFSktIdnRaVtzJwN/R13VzfmZsYm1pYGRlZHllf3B/f3dwcHJ5d3BycUVCdndDdEtbXdDZ2VxW0NPFy8/J9fng5uDs7OPh5uT98/fIxtvYx8TdUFTF2vXw8/j75fr99vD29cPIzNjaxNpWUFPVUV50Q152dnRMdEtOS09HU9zF1VdGQ0pwfmRmZmR7fmR6fHJ2Tk1fVF1FUV1PRkZBWUR2dnBydF3DxN/TV1LTVlZXVdnI/v3+/+X+/fDxytrHxNBMWFbWXEROXdzA8uXg5uT65/j09PfD9P/4/PD39/bx88PYXVLU3FBHRtHWW1NfXkdRVldfQXF3dnlkYWBtY2NiY2Vnen59d093cEtJfXtyc3V3cXNxcFhd2d/FzdffxN7Q2Mby++X+5OHm5ebn+Pz3/vnywsHC29VfS0Nb1PXy/vnm5Pvk/M7B39Pf3tDdxc72zMnN3UFPRUxKdHNJRUx2SlxCWVtWWE1MQ098fn9+Z2FhZmZ9c1rVRFDZ2EBDQUpwd3dKd3J1XlDQ3t3RXFbW0FtGXMTTzvXIycj9++fx8vb2zsjPzsTQUlZZdlpEVN3I8vrn5OTk887w/fPy987K9fj65/3y8szExFlMWUFT0NZxTF5GXttVRkJPTUl2Zmd7ZGdnbG9pYmRxdnNDSXd1dmd7enllf2VmeEtG1cXV01DVUMfVUdzJ8f799P75+Ofu4eXn4eTl/8jOy8XW0kF1Qd7K8Pzl5PnO9ffQ0sDM2M30zMryzf3/3NXVXkxNTXV0R0NQWHFKXVhU3VNEQUdzSHZlenN6ZHllZ2R5eUVTXlNGd3Z0cHR3c3BOcXZDQUPX31FUXVte1l1X09/S9PHK/Pj9/OT6+PzK2svP2djdWkxAQ0XUUtz2+fz+/8L19/fx/PX0/fz8+vP2/vn4/f3Dx9jb0NpWQV9bQVfEVNDS3lhadXx6Z2FhYW9vYmdneHtwSktwSnBmZHp6Zntlen58fEZDSEfdVkTQ3NJWVND39fXz5ufg7O7u7+zm4vv2yvbb09zcX11cWcrFwsj0U1LT3Nbc097zxsb189rL8ffPzsTf9NPX1lNAUVlGQlxOU8lU29FBcnVIc3x/ZnhyZH9yfnlJRFLVXXBKQnF3dnJ8cHBzcXV5SF9T1FxERl3R1tLXVs/OwfT98Pbl5ubm//fw9NvTVkVNQVtBXl3czfX28cVZWNPH3MLI8Pz8+eTl8PD4+f35+/v/8vfIxNvAydBQ39jf2NrWUnBnZHhhbGBmZmFnZ395ZH50cHxze3p+ZGdzfH5zcXp/SU9CW15R0VHS39ndzff++Pr/5+3l5eHm5ODh5+f6wMHN0FZRWUJV28LMxVlRUE12T3NwWNfDyszU9ffC39jXzvb9+f/O1PTJzMvEQVTZ397aRUJecXJzZG9gYX5yfXh3S3VGXnF8TktfRHRlcHZJXdRwckBH09RZXcdS1t5Sdlzd2/fx9/L68Pzy9dHM9/f3wlFeRkvX0FxLUNTJ8s7c39VUVV9Mc01czfP/9Pz9/P3z9PD6+Obh5Pzl+vr++/bQ1tzR1ddeW0B0ZWVia2hjZ2Rlenl9f3xzZWZnfmR4eGd6cn90X3VycE91U8bPyMjc2cDd2/X//eHj5uHn8v7l/fDyy9PQVFNU0NDE0lHW29vC98PF00x3TnJ9SEFb3vXDyMHFzvH18vDCzfHx8f/w9/78w8fRU1/f0dZdd3hlY2NkenhwSXZPW0BNWUBJSXBnZX55cUFMQVFaWEZbT1Df2MbHVFzWVdHb9cLz/fLz8vTAy83Y3ddIcX13SFJZWldcWdnN28j3zNDUT3FORkHdw8TL8fP0+eTn4efl5Pv8+OXl+uDh5fv9zMPA19LURnlkYmlpbGNmZGV7ZHh8cXJzcXJ6ZGFgYGZ+d0RMSUlCS1nWwsDLysbR3NnHyPbl5+bk5uT65eXz9MLURUN0cVhX1dzZUlLV09zb29BURXZyfHhyTUdbVlZZXNPO//7+/v/y8fL+/Pzk4ePm5P/398nLwlVMfWdgYGRke3l5f3BycUFZWkNBSXN8e2VleHJ0TEJCTU5cVN3OwMDH3NRX2cHO9v34/vz2y/b1xt9TTnR+e312cUJHRFJUUlbbxcTd3VNFS3dKWFHc3N/Aws7L+eTn5ufn4eX65Obg5uHj7ODn+v/KzdZBcmRibmxiYWZkYGRlent9d3Vwfnl4Z2JnZmdlfn5zdUlQxNrM8PXL9/TBzMj85fv45+Dh5+fn+/HDwFVGdEhOdHd3cXZ1SVnQ08TP0lFaRXV8cExERUReR1pR0PTx8fbx8/Ly+OXn4efl5Ofh4eTk5fPaVU9+emRmZXtlZHp+e3N1SUBAd3J8fn9+e3N0cnB3dUhE1MH19/bw8cvM9fb08fH38/P9+vzI9MzWRHF5e2Vle394Z2R7eHlDV9Hb09TXQEpbR0BV2cTMzcv28/P85eT65ef55ePs7+/h5+bl+Pv58vfKzFZ1fGVkZGZkZGBmZ2d7cXZ3dn96ZWRhZX99dkt3fHR1dVPb2Mvx9PH3yPf/8vLy8/Ll5eTh5vrz8d5YX0VLQ0x3dHZyfHNzdkdfQUl1dndzeH99cnFAQEBZU9LAzc728fT18vj75Obn5OXl4OH65ODk/PXH2FdPdHZ+ZGV/eWVyQkRfWkJJfXp9f359d0BESElfUlFRxvb39Pz+8/7++PrwzPTIzM/08fb0y9NCdXByf3t7fmRnZ2FhZXp/dnN9cn1ycHJ1TEVEQ0VUUFTAyPL8+Pv4/uXn5ubh4+3j5uPg4eDm+vTTXVBAcHJ0d35lZ2dlZHt0d35yd3J6f31zdHFwdHdwTl5S1Pb//P7++OHk+uDg5uTk+vn+5ebg5fH39dBbXU91TEp1S3h5cH55cndzemdmYGZneHd3enl3eWRne3Z1cUdYRFDezMrO9vn+/Pnl5OHh7eP/8/fZ1UVb3N9UU1BYW0tIWlle1VFWR0NQVV1bQENEdUhAW9fL8/zy9vD89/P65uPk5ebl/vvy981VU9dPfXZ3dUhxf356Z2V7en5NWHV+e3t+cnl3RXRxRUF3dkxT19RQ1sTVU8XJ9vT3w8TI9v7n+fz4/M9TTX94dk9ZXXdLWURKSV1SW0VCTkNLQ1bSXFxWSXJyfE3W3sv45Prn5/764O3v7OLg7O7j7eL5/PLD2NReVMHF09RHcH9lZ3p8cnJ0fGR6ZmNlZWV+fntkemR7f3h7f358cEtHVffI98rawcrawcHF28fN3dZaQV5VXl1bXFNR3cbw9M3a31xSXVHV3NjBylVAS0BHU1Taz/L8+OT5+/rm5fr5+uXh5uDm/Mrf13RLQFHT2NPD2tVGTFpxfXxzfXJ/c3RJfUlRTkpyfXdNSEVSWXZLT3xxdEFR2N/fz8ZRxNhFW0dEX0Bzd0x2ckx2enplf0pYRlfHV0JUUEXVUFbHw9zGxVZfV1lV0dTD8Pj74eLh5+Dk5OX9+Ofk/+Tn/fb1xsjPwPH9//Dz88jM21JdTXN3S0p3RFpaWE9wfXpnen9wd0F2c3J4ZX95ZXJySUVTXtZRX0BBSXBLS0FZUV3Q1FJNRHV2REdX29JW01RcRlRHR1Nd08PQVtRSXkXcV9HY3vDn+v/+//D08MzJyvb75/3K9ffNwMraxcTazfHZ1sDAUl5SXlfW08PyzMz29tvZ0dHUUVDfz1NBUlNEUl5CTk5D0NlYSEBIfnllZmBhZn9weHhwc398fnx3TkDS0lhCWURNTXVwcUtMVddWVt/Q3d/WUtfcx/b29PX3z8/MwNrL9PH+/vL8+Prn5vr9/Pfz/fHK9dnZxttQUdzTw8PBxsjDwNzWQl5RX9RTWlbWQl9WWUtbR1/S39vP2UNAQUF+f3l/cXdzd3BkeXB8ZXBzWlFTXNZQRVNZQnNKSk1JWkbWUHRMXEVGUVzR19HQ3lpJTVtHS01ARFDRVczAxPXxxNrByPfw8/L59M7N8fHx/P7x+fvk4eX5//r4//HM2crMzc3b3sPLx9jMxN/1wsDfU1hSWUp0Qnx7fnp8fWVmZGRnZXJkeXF0S3d4e3B0cHZKfkBeXF1ES0VfRkRbRUlUXdzE0lHQXV5dVVFAVFzByszB9MHJy8vRUNbV9M7a28vAys/B0NbSxfLx9/P/9/TOzNrB0tr2w8H09cnx8ff0983z+vD298ba2tZSRVlF0t9bQUR1SEB1d3VwfkpwfnNxf3Z3cUpNS3RZXllYXkBbWkBNSnBxTXd3c318dnZ3fX5zdU9IRkFdWF9TUFhGU9Hexc3L9sv18/zw8Pnl5uPh+v738f/wzvfz8fn/8PD+/OXl8cv398L1zsv0ytjG21ZV3tNW0lxYU0FPV9FYR0xyfH9leX96eXdweX58f3ZJdE1eQkFdQEpEQU5eXkVXXHVCUkdDXl5aUFBR0ldHXVRCdHRxcElKTkRPdEFfRV3U2sbP2sHD29/B9c/JyvbO8P3k4efm4uLh5uXl/vv9/vPIz8rKw8DDy9rB3cDE0sXD2dXX0tdYUl/a2VZXXkBKdHR2cEJOWU99fXJzfHN8fn59e3xkZ3l6fn1yf3h5cnFNTkFEQUZDWkRDQFhd3VlFXFnR397R1FDU3NnQ1t3bx93b3tjA9v76+vrl+/r45OX7++Hh5+T4+f7+8Pr/9Pf98c/bUF5RUkBTQ3ZKUVBWUlpEXkVAVl9CRlNATEt0SFtBTUVMdkJWVtZVVFRVREx2fXp3XFpOdEp3SnJzcH14SkJOcXxwcn15e2V6Z3FGWklHRkdZXNbawcf8+vrw8PP39fHx8fz2+Of+8f38++Tk5eX78/n48Mn28vbK9d/S3tbO8Mv18ffKzcHQUVJd19VbR0FHS3Z9ZGRkenFxfXZ2dn96emR4cVjWUFlfWkZLSEFNWtfE29ZXVF9fT05IdnN3SnB/eXxycH5xdHZLUd3dVdXZwcLa9vbPw/b08fHy5ODm5eLh5P77/Pzz/Pj72l7UT3RH19XYxcfPw1PRxFTUw/b2yfD2/PNRVtvT3srOz8zA3PfFd3N9eXJEXkR3SnNMf2R8cHh9SnN0fXByXHF9d0B1d3Zzc31xc0R5ZXh+ZXFKT3VPRk9cQlxWXU1c3dnQzfD8+vP9+/r9/ufg4eno4uL78vv98eXl5eX6/P3/9srG2NDa2tfRxlRQXnZJWEVY29zdxN5U0F9LSUR1SlVBSHVKcEZCTVfVQFrTUFRTRHVPc312cmR/S31NR0VCWkpwSnBlfXJlf3h+fndycEdxc0NbR9bd01TcVN3O3dDByc3+/P338vX3/ML0++f55+X48PbO8PfewvP58Pj5/PT0w/f2y/Xy//zk+Pvz9d7NwtDU2NFR0UF1c313TnB+eHB8f092cnh4e3x/eXlycnRGTkh0dXdHXExFX3VGQXF9e2RmZWRmZnp7SkRPSnR1dFBQWlDS0/P89/T39ML4/vz/+/zg4ufm5vry5v/98M7b98na11NOddPV1t3a3vHN093EWlHBxcnew8L298LAz1lQydDV10RD1UVxTHdnc3d2W3VIQkZadkVKeU9PQ0h9dUJeVlvUQXZNSUpyZmdkZ2RkeGBgYGd+eXxJQltaX1RKSEDUxt7D9vL/5eHh5ebg7ezg4OHm4ebl/87MxPX08fH3z8PB2N9eU1FUXFBURVhW2sjNwPXxycTD3kZLSXdOdnl8SXJ0XEBOS0t1RUp2fXJkf05xfndwdV1JRdVSdllEdHJ9enJ7Y2xtYmxzSHRxcHh3dHV3RnR3VtPYxtvZ9/f8++Hl5+/o7uD6+OT7+P7l8/rn5Pv1VtXSVN3W1FnU1t7cV0DTw8jy/PHB8/3l/vTe2NVX2t9cWtLSyvbSQlhNXdddSnRHR19fcHtxckDVXHB2QU5Od2VhYm5gZ2VgZmVmZ2Rpa2pqbWZgYH13dXdGT0Be0vbn+PDk4efm7eHm4O7ql5Xqlerp6e/n//H//eXPxMHTTVjcVVbXwcHxxsHGx1XfxVBaU9rI/fT19/Xaz8HTR0VeWVBAXlZZQVbWU1lYRFxTWF1YQU1Md3d0d3RGWVhSRExNS3lnYGFmYWNtYW1ob2NjZHh3WlXW3tnS0NNW18PAzvzg4+iVlerq7uzi5+Tm+/3l/c3I8sr0xdzDyML3887C2MxdW8/f0vjz+u3i5uzt5P7y/Mrwxs/0XnBFSXdLc0lbXUfTVHd7emxuaWlgYWZ4Qk91d0Z1dXB9dnN5ZXJ5ZmBlZH9+ZUh1dkPXUF5VUkNaRFHH2Nr95Pnl4uLg7ODt7ePm4eD7/fH38f71/Pv99/DK10ZAcXl7enF2dUXHz8PP9sPOzMLy/v/x+fn0ycrN8/f0+P/K2szfWkF3ZXpmY2ZmZnp8ZWVxcmV4eX12dn56eXh5c3BycH55c3xle3pnZmZibGBkeH5wQdjawfD9/fLw9PD8/+Tg4+zr6+ro7OPs7efm5/78//XWV0VY0dFFV9Zd3dvTVtLd3sHeV9nH11fe0sPD3MXKysbJ29jT1UdPfX18cHBwTUl0Qlt0dn9/e3N+e3t5fnB3cnB+fmV3eWR9cmV5eGFhYWBgcnp6dEN1Vt5X1VRARsZeWt3e3f7+8eft4O+U7uiU6OHv4fL8+vHz/Mj5+PTOztRX3UV3X1xIU1VFUcDY9/jy/OHl/+b+zfLz2cPAXFnXd3BNfGd6ZGdzfGBnem1hZWNmeWV5S3Z5dU5zWl5+dkR0cHR4ZXxmYHx2f0pJdUpDc3xKcX5IW0De2N3C/ff08ff1+fn3/vv7/fr99/XJ2ff2x8zIz9vKx9bRUU1ZVVFX3t3c/vjw5efy+vrx9vP12vb2yPbL3MvI3M3xw9HfWHB0fGZ+cXFwe2JtZm1vZ2JrbWJjZ2VgYHl/eXF+eE1EUd3a3NbTVFbZUENVwsPD39naxcHL/cjFxsrIztvbxPH28f/39fL4/fD199He1dFTSnl3T3Z2dExwQU5GR0NK1cP28vL//OT4+f/w/OPi4u3u7OLs4efzV1fA19TX2t3VXnR1Sn5/fH9/eHpkenxkfnlhfnl/fnZ2f3lwf3xlYXZNQUHd28X18cPz/f35//3w+/nw8v3M8cr3/PLw9vn2x9jRX1FITltdXFTK9Mz0w97bVNLe0F5f0VRX3lRbXdHQ1t/W3vb3xs7IyPTx/fv7++Xh5Pvk+fPy+vvwzMHFwNBRVEZ2d0RbW0VaRl9bdnN2d0pMTUxCQVHH3NDXUFlTUEF0SENLQERYWkJPRl5YXNXR3drX1FFR1VFUVFTHwM/w9szQ09TRV1pc3NdU0tLJz8jK9vz/5ODm5/n88fTwyMDC2M31z/Py8sjSUVZdUEFbX1PcVNnazdrdxsjbzMPBxFNe1cPG0kJPWl1DTUdHT1pRR0FEQlhUTUtY1dPMx9vb2tXU3tRSV3Fnf3pkZGRlcHJ8SkZ5eXByfH19cUVGSk1URlXB39/P9PH+/cHP9tXSw8zPzvX98vfO/uX18fLw/PL09crMxcPFwf3xy8LB9c7EXEFbdn1Ld0dPS1HXXlLZ9PXF0lLZVF9TQHVFVdjZ31PW2FBZUllKTnRzZ2dhemRjfEd1SUxLXlpFZGR8d050ZXp8fXx7eGVxd0XFwlFUU9VcREFa2c7w+OXl5uf6+PbYwfX19MzYx9vf01VU1FHUxf3+98nAzMfcXERNRNbYXVLX1NjXUk9BQV9dR3dyXdxQcXxwRUFGVs30/P/2yl50dUl1Wtbfw/TN2ddOcHx4ZmRlYGBhZ35lb21nZmdzdEhaT0hAdGdhZ2d4SnBO29vG999Y01VFU8bQwfbK/frxyf31zfvk/uHi5uPi/c7I3tzL2FX28/f98NRdUEx3RHRyW1dU19Z1f35nZXd8S9FRQXRyfntkZH11S1/E9fHN0drRUlDWUUJHXN/11lLUXtdX0FfezMbAwEJ1cWdgY21tZH52UFRLXtVKT0NyfHFyc1BZdlFbdUFDSFzY3svl99vKx9PcXVXK9vPl4Pj54ef65PfP8PDL+OT9+vz3wsdT3s/H1cncQUx1fHJ+ZUp0TF/SX9Td3lZTd3l/Z2R+cH9KT05NWndMU0dF0NLX3FdeRUN8T0l/Q93Y9fz+//P21NVbdUVfUlnQ1tbFUF5XUFbM9/3zzPXCXUdNUlNe0trL9cPKwFTY3FBSUdfF9MPc8fDEy8rZ2tBW9PHIzvrxx/fIwMHY0snx9P/g8Mn0VE10ZXpCRk3Uwlld31h1Q3Nbw9BbUUR/fnNkZ3hkTNLFxPLIWVtAcXN2fELd19LOzdbB9cPx9/X64eXk+/jz8PDF39PSx/b0/+Xl5eX9yd/Z3MbVxfTA9t/Q0lJwQkFIQHR1Rl5IRVFTc0Za18HP9PH8zsHVU0XW0cLN8/jm4OTl8PfB9/XLwMHb3lxPdHJ5eHdL1FPHyvHM39RadmVzdnR2SUfSVNHWXkRHV9DeXdbJ8M/fwMFQV9HY/fbl7+vt4OH59PT19vv55O3s5vj11F3eVFfBUFf198nL33B+cX1BVVzC+8RAS3xibWdjZXN9UvPZ2cTZ38zYVcnIVMLywvT131jf3ML7+v3j5/T+8VVaW3x5f3thSkl0XUJN1FdKWtdRX/Dc0M7TTkp3fV3HwvDk9v3m/c/CVUbe9cXK5fL65fD09Mbd9ffJ8vnK//LBUlFYQ9PC2sfWSEZBd3l9eX1ISXFbVF7ZwNxMRXVzd3Z/c395fXFkZ3BydltUW9vM2cH33F1XSnBOT3ZW0N//4fHM99FGXFZLW1BE1llkZ2RmZHZ0dtzH3/by01NcXEXVVlH39cn99sbM1l1QydlVzczDwldbW0HU1vXb199bX9VXUFxTUUFQUFDV0vXF2sBRRnF8dHB2SnBKf0pNf3B3dEtNQkt2THNLfWFiaWpqa2hieXB+RUlxcHFPQ0ZQ0dLVWsfSxcfHwPP5+Pz///z79cvY29bUW1hRUkJaUVxYdVrU3VXb01ZRVlFX3dbVVlJYXkFMR1FRWnR5fHh7ZXdDRFXEwsfURFPQ0Fbe0NjMyszKysHOw97SxFFVxN9McnhlenplenN5fEpCS3dzf0tOfXl6YWNjY29ubW1me3lzTU/Uz8vb3Mzfz8jJzfbx/Obm+/j7/uHm+vPwzsXYwNbXx9FRQ3V8cHNH19dOT1tER05OfUdBSVnVT1lcV9lSQFtQQ1jQVHdE0ltc19xX0838yMPd1d/EUNXEV9HZwt7aV1bR2URZWXZ0dEp9T3N2RUFzWVJCWt3TQFx3fXZ3ZXJ7YWF4eX9ATUHY9Nv29srN9vX0/fH55vr2+/vx8vr28P719fHI3dFfRFlEdVpVWNXTQUhSQkJW0d3bzc3121ZQ2t/RxMHZwMXRzM7B29RNREZ1S1JeWtFSV8bdTF9fRlpTWcDxxfT//PH48sjwzdbGz9HR0Ux0REpPV9vH8f3Yzs1EcExye3t4fnVKckhNcEjT01f28ffk/vDPyNDEzPP0+OT+5PTx/fbRwfbK28fNxPTI8cnF297OwdDTUVPcx9rS3d7R2tddVFHQ0MD0ytBS19pSWdPc0t7Kz8ja0t3dVt3F09vFxNNQRk5DX13O9/z65+bm5/XE3l9b1tPd0N/f09FQVNbSw/DJ09NdTXN2ZHh+eHVETUtRwMj58vP0+8b0x8nd8cvO9vHw8vjb9MrE3c/F2sHP9f3fVtr6R87w2Pz311pRfHx0Rl5QXtPD0F7W3VdVx8LYxMLP2dDAy9/Tz/Hz8Pzw9cDe0tteTUVeVNVcdVzcXcPw9//n4Of98fTP39n2xE1exdLe3NPfx9vazlNITHZ0UVh1c0xMRdR0f3B1TUVFU1NbXvXy2VPd3cfw8vn9ysjKx19SXF/C8PbO9cPI8sDW0FDWwNZNS31nck53c3d0Q1xdUNJQQFRXXtXY18TKz8v2ytnCwcD12NPFUEhPR3Z2WVpZWUp2SEFC1trTzMZU0N/W1VTRxcrI9vzKwcXT01R1c3J1SHBxdEp3f3F0dV9V2NZXX3N0TnRBdE7RxNrD9dhFXlhb2VJ1fExaQkhJWN7Q1NtGSkZe3VFZdHhxdE11cnN1W1THzsPa2sTMyNFcV9v38fz8//P9/P79ytjD9cHTcHtnfHhnZ2Zmf3J8dnhgZ3x/c2VgY2V6enJ9fHJycF1VWdbB2Pb001TazdnLzcP8+fjl/87Yx9TAwEB1Rlddx/XAz8JT3MFdU1ZLT01+ZGBlZHx0eUFHQFHMV3FwZGFlYhVpam9hcH9wdXJ/TUZI2dvcx/XF3sj3yvzl5u7s4OLp4Ofm+ufl8dLQxtLM99leSX1kc35hZGFvbWJibWFnYHh5eU9PZXx8ZHl0emVkYGFmfH3V3lLe31/XyNfW30VPV9Ne0M7Yyfnl7Ovt7+rs4O/s4frx2dvJyMjyyNvDUVnB00xEfHp4Z2NibBVqY2xgeWdtbGNtZ2RkeGZnfE9R3ffO2/TJwv7y9/Pz9vz8/P/45frj7Ozo7+Ty8cTF9M3eV0tDQFBX0M5QRV9LTnZ/cmFiY2NnYmBlYWd2SFhXRHdDTHJ0cnJ/ZmZhfkhwXNxZ0Nnb8vrh5+fm4+zj4uLt4+yVl+rr4OXn5fj//cva39da1FpcXXBlenxkfnJlYGJiYWFnenFCSdrw8PfE1NPe1VbQxlNT1NX1/fnk+f7++fr++87VRUBQUNFARtbV3PDx/v/Pw8fYVNRdRUxDXt3My/PJ0FJTVtXT0FxHdnZHTXd4f39wQ1Pa3llb0FRc3MfG2Mjy+u3s4uLk/vrl++Tk/fLwzPD4+vz/+v78+Pj/9t3SX0tISUx9enBzW9rM8c3A2M30wcvdWlN2S0FDQ3BbUF/dxPDyxs/H11hGT35kZXpxWtbP29dU18DYwsRG11NT3N/MVd7NxvL+5ODk5f78ysj8yNvAxs/29vLxwFZeWVheWXZwcHJAU9LV19zf9/z+5+Xl/PTBUd9QQF3c2/X55+Hh+v3588PRRXZ3cnt9QV1Y1dJUxvf98/z7/PLeVNVLdkNHWlLV39nO0E5bUlxaRU9zeGVlf2Rkf3hzdV1SX83cVd9NR0xLQFD0y/X//uPi+ufn5P/09tZT1FHJ9/Dzw8vPxt9e2VxyTXFzcXx2ZU/QUcfE9fzCyPb1wMX1Uk5QRVjUUVZMR1bQzN7Pz97Kxk13cX1hYX95dExX2VXczcLFxsrTX9LQ2cLw/c/bx8TLwMXEX0ReRF5eQXx8TEp3dEJDf3ZCXFZBR31leHJ2dk1FSEPX3sr99sjBzvTOxdhRQHJKUN3FxvXPw/Xz8c7dX3J5ckpZT0NGdkbR3sjb28HT2NPV3l9HdHtxQ0BISF5NQVTZwF9OS35+cHd8ZntmYH5yR0B0WktFVVTf09rQXNXTz8rJ8cnB9vvn+/fCU1vW28BU19JF1sbYxdfTUkFER013d3xmZnt5en5NdUlQ3MPAwlVDc3N9ZHh5eHpzUtZRwMfU09PVSUFYTUp3dUl2Q9ZHTFje2cD2yN3TU1BW09hNTk1YUlnc1kFcXV5MQNRBd3F8ZGdnZWVlf3NxT1BMeHl/Z2VzcnJ3W1bb8Ofg5fn6/Mnz/PTw8//K9fbJ8fH1zNzJ8PHGx8xTUtzUSHB2fX9HXVLXWVRQdUfQUlRFT3l5fWdlfUh0d19WVllNdWdgZ2ZmZnl6ZUjW2dr1zFNZWVHSyvD0wMPx9cj1/dpS0NrM8fPz9Pb2w8xVXn1keHp0Q0VZdEh3c0BQwddNS319T1NQV9TFzPzk88rY3NNBUMPEVlHYx/z68/3Mx8DQx/L688LG0NjL9P31xNfQ2/Pl/Pb28MLJwlRcdn55f0lNRUJ2d3FKTEl2ZmJgbWJkZX94e3l03szQXHV1cHFTWt/F3cjz5uT55/z++vjn4e/i5v7/+Pvz9PfJ1N3Gw8jPxFXX2cheSEN2fX5IdHFdXltWXNzc9/LBRXNDQ0zcxdBXUN/Sx8bc19fe2VVc0l1JW1Xay/P/9/39//vn4uD79vXL9vv+y9nYzsn29/Tb0VZTX3R9eGZgbWJnZHZ4eHpnT1bB1EdIcEfVxfPz9vH1/uXm+v3w9/D7/P389fTax8r39sbIxtb18fzwz/TRUN3K8tza2dTMyvj99fLI2svwz19Odn9zQlBcRltZdkHa2VJKW3RwdUxcSE1KcEhQwNjR21TQ9f/9w8vKzsz3/PPw8f/45OPt5vrl/szS0NzH09PSxvXOwNvHxtzZzthVQnJ9cUxDQE13TUVF3NXVVUBQUdHUUNjW2NRfw19EXExFQlbbXNBFQ19ayvVXwcTGz/bn/Ofm//vz5P9Q3sHF3ND+zMD1xPfSx8x3dnFkYG15Z2Jhb2JtZV59ZXB9f39WVnJFX1zVVv/01sbGz8b74P/75f/Lzuf6xVbXxN30+/L+//LKy+f42FtR11Ta8PHK9vXfXvXw2VNOd2RmcXV2cHhkYH5KfmFiZmFnfX1kZmR7en9KR1hPdnx7dVXb2tpQUlfI8/D3zcPD9/Ty5eDm8f39+uTO3ltC1lDS2MHHS09bWlBeWXNgZmFld0pec3hyekpaT3BgfXR4dEFff2VweHdaU1Z5fnV9Q93K3kxQVlH05OT3zv3y+ODu6ebg5/344OD3x8rH28v6+M7YWkhwSlx9Z2wVamphZGJjbmoVbHlhYmFgYWRM0FxEdHN8StnbUFBMcU/V//D19dZaXvH+y/PCUFTF+v7+/fbOyPrk8PbHXVbC8vvl/vFRSFbD2VRffWFlf3F0cHxmbGNnY2ZhaGpoYWV5cHl5Z39CQVlHTndO0sD35ef7z/X+5eXm4eX45OHi4u3i5f7z8fPwz1dZ1NXRyM/B1lteTHd0d3F6ZXt/d3FPS3B2Z2ZnZnlkZXllcXRDR0BBQUhIQnVKcnZ4fUJT0NBYT03R0drL8uH68uXm7OLg4f775eTl+/r+/Pz45Pr/9dFNdnRwf3Jyfn94ZXFKSHZgb21tbm1hZ2ZneH53S3d3enxYTVxeXVRB3fT85fPx3MT88+Tn4OL75ODs7u3j8sHz/f/68P798ufg4ef+wUlKSnZxf3J+ckhHWElQRGZmYWFiaGNhYWR+SHVZRn98cnR0c0N1cUTQ9sjK8Nbdw8X3zvjj5uDi6O/j7fr+//X10s30w/D95Of75cNFTUpLeH9zfnFeXEBNX0B3fGV7YWNmYGd0QEh2WUlySEpEQEZZSURW9Pz34Of0yMPzzPHl+eHtlZfqlerp4ubh//n69PLk7ezn5+Txz9JGcXh5Z2FnfUBLW1VHdHhmbGxhbG1he0h0RlpGQUlCcEhRS0NS3fTB8PHMzN3cSUvc1tzw/ufg7urv7u3m8t/188/z/+Tn7JTs4fv/xEbT0UZaX9RJRthVXFtccWNnZGBsY2dtYX53cXhzfmBld01NW97R0eTv4+bm4fL0++Xn4+jq7pSQkJeUlObx/PX1ys3HVMb4+vHGwVlkZ3xkZHB6ZHxJXkJJR3dkZ3pnZ31wf3t1XnN1TXhkYX5xfkp1cUlQ9cjI99VFdU5WUfT+++HjlJSVlpXu4uTn+eTh8fz65+Dm4fv030FEQUxZcHp/cHV+dndkYG9uaW9hYGF4e314cUJ9ZmZkZHbUUVrc9vz+5+Hl98zFUkXN+f3l7e/s6JSV6eD+wtD2/8jK8/j++uzi/MRWWnBYVEt0cE53fnZKfmVnYxUVYmJvbW1jYWRxZG9paRUXbmdnfktU3Mzl9sXRXkF3XvTI9vvj6emXl+no7+T98f38zsn19/Xy4fDCx1tKc0NeRl5KTUZ3UVp+eGFtbmlmYGFlZ3h6eXtjbWhuaBVge3tyd1bC9fjE0ldzSHZPy87z+Ofp6JGW6pXi5+f+5/r2w9DP38bxwdladUhwSk5ITnxxSn10fmFiFRUUFGJmZH52RkJCSXB5Z2ZjY3tOTHNHx8r19M/cUk9OdUrX1lf3+OTm4+3g5fn2ysfE99Pdw97M8f75wtnZ2tfWxlVfWk5McXZ0ZGdgbhUUbGBhfHlzQnJ9emJtaGppZHZ3QdTJ/OXk5f78ydjfxvLx/OXn4O3t7e3h5/zx8M7Iz8XfV9LD2MFUWUVIXNDWxtrWRkpTSXFwf3JnZnplcHRCW03fU319e3pia29vYX98S3FHVUdfWk1yZn50SdTO8/Lk7+zt6Oro5+fh5eT6/Pfa9PLw+Pn8xN/Kycj9ytRGSk5xfHN6Y2JjYWdM0VlYWVRSQ3dweGdgZmZ4dHRKRNnH19TcS3F8eHJ0UNzdwf3n+vrs5vjk5fjk5/j28P344eHu7uDj4Obg4uP58MhVX15eQWRjYWJgZn1wcHB+eH58Zm9raRVqaWd5ZHxB1cfB2FBKV0Z3QNfAx8P85+fh4+Hl+vrw8Of798Xexsf08/3z/Pj6+uDj5P39/MPYwNjRWU9MSVlUVNjF3VRCXltlZmZjYm9gZ3pIfXpzWNdBfXZNSkhbVlTYx/X9+OHi4uvr7Ozh7eDm4fv65OHi5eTj5Obg7e3m5f/330VFcHh4YGdlZXt5XFBNXnVMT3p/YWltbGJhZXFleHJ2UUN2S3ZOS05dVc3Y1cb0+Pr64ubg7ePs4+Ph//7/5OLn4uH64OXk4uLm9s/dUtJcWUx+d3FKXVbD1kBbdENBcnltbG1uZH5ydX12S0Pb3V9MdnV2Q1PbxdDdXtPl5frl++Tk7uni7uH3z/b65efh5ebi7+7p6OfyzlPc1VFZfH9kYXp8Q3R4f2d6f3l5YmoVF2ppb2xubG1geUpTWUhASFlQ3/TYx9lR3c345vrn4eXm4+Lg+vTazfXw+v/z/fnk+ODg/PfMxtdSydpFTHV3cE3VV15U2NZG3NZwZGBiYm1hYG9vbWFgcEV8ZX5zfGd/d3J2dEpyQ8L3yv/k5+Xh7+Lj7eLk5+Lj4ebk5Pv44eXx88jQXFdXS3ZyeGZiY2NjZH55eXlyZ2BjY2Bib2xpYmZiZ3txdH1wTHV0dEt2dF9LSEdaR0XY/f34//DO2M7NwvD9ydvD9MDK8vP3y/b8/Pn7ztXZxlFWVFFwenBPVdvJ1HJ0d3h+ZHpiamtobWB7d2R6SHVHX9HUT1pT1cz0/sxQxN/M/+bj//T2zvzg7OTI8snExs3I3lfVU1Hcy8dKd3x5dURNcHhkZ39Ezs5WRnFkZUtFcH56YGF6QlxDSX9+fUDfXFxIZHhz3PTdxUV1Qd/78v7kz8DM/+Pn5vzXRlz1yMXx0UBf2P788vVEdHZU2U9ecGZmfdfBzMBLemRJ1kFUV3RmZU9Z0c1feGVK0t/391ZxS9Px+Of80EhV8fTx5fvaxPD+5unv5cLK/vz74efYRNzfw//4xn5hfnB0fnpnYmZlfV/SUnptYWV2TXV6YGZgZFrB9VN5cVvdyvLNW1PZ2/3k5PRTQVjS9Prm8dPUx+Xj4+TyztTXx/TzwNNdXcjy+fzB2FpewfDwV1hRSV7Mw83VdX58TF/TWHV0YWZKWVdYSWRtckFOQHd0f39RyfDF2dhB0f3n4eTk9sf74unu4ufIwPb45Pz+zlDd8Pz2y8BPdFtUxdZYR3Fz3/H03NxxenNBxsL1wFhPQtTIxM9FeHh+SEJOcGd6dlvb1Ntcd1lSwc7FxUFJQFzx8vv63sX1/Obh4uTy9cf28/fCWVtW18nO9ttd0tj38MrZTXNyeH12Xl90dXFH29r0211YcExNV1Jxd3VCVMTBxVfX08P1/Pra09Rd3PX4+vXC2cT28f/12sFfRFbR3F5aTV7ayfbJx8FQU8Pa0E9/fWV/TFLG0tZXRMLx9PTfUnV9dExFQ3ZxcU/S2sTM9cLWyP/9/vfSW0/Q3MH02sdFWcvM9MPEU3ZTRUBWSXZwfk5QXNDQXnZE1FLeyl1zfXNJ0crHzEZHxdvL8fTcSEpKd1hbXU1fxMX29//31sfB8/n0/NVL19T25+fkw9jdyPjI/cNMSnl2T0VQe3B1cddBTkd+cHBBUUxGe2NnYH1EUVRKfXJD9P3/9VBFcUDb2MjXTk1P18bNzN7Z1dvz8PLCX0ZF3sr99N5TQkPG/vjwwV93QlbFx9JPdHdN3cTWXER1d17F3F9wZGdkck9ASXVyf0fC8cLVU0hxdk9Bd3xne3DA//H2wsPb8OHt4fRXTVLNy/fIxMBcVPT6+vfZUUdf0cPOWHB7endNREF2TENZwsHZWnlkYHdEU1Fxcn1/X8HOyNNQdnNwf3J4ZmBsZE1f11PRXElFTVlTd35/d8DLxtjR31PF/uTi5vfDRdFcRFBFWnZM1djGy9vc19DG08TQdX55d0pGXV5YTln3/uX78c1FQ3Z9SnVwfHJLQEXE3tJXXFFITUBMdXBBUtv39czc3vT18//0xVldX1HA9PTTRUdBXcXe10FGRUdWUER9ZXtkfk1c2sXSys//4fnM1l9bcERXXkJwS0bVzMza9NrXT0bdR3B7eXB22vfA9NZeQVv1wFDVRUV1RvRcQkZ3cnlHXXRR0V5NUPnzyMDcV07Y/dXN8s3P/Ozi5eXy2EBP3lBcxddKdMrKVd3G10VezszZ0VZeWvLn9fb59NfX8vfNwdrddVjZ1FRFS2Vtf316f31Nck3D3NZYS3Z9VNJX1tjP0sDh5+Xm5fPc09lUU1hBTHNY3kdBWEd1SVRcWdFQWlvb9d/dx8TYzfb3xcr03dv39Pbw8dJETHZDfXp9fkvWx8bQ30R/dU1RW01SXFDA/OX3/fzFw8Lxx1PZWUhcXNjTxc3VzfTyydTER0jW2vLKzvTczN/0/sr59sTx8fvxzfVSW0RCSH50fGFwQNP3w/fFXltMXUNf1nVZ2srl+Pr8wcfT3NFaXUxLR3dJcXRAdnJycV9aUkd1RUxZxPXz9sn3yfT39c7a9/TK+fv329VVQXZNRV5BdXVyRt7DxtXXUVDZ38HF1MvI/uHg4ub78sLK8sDZQHR0dERNUVh3fm1heXl2cnZ/ZHNxU9zWx9TY8vT++Pj68/nl5Ob49tVW0VPR10RwZnlwd0BMTHNkcEpewdnAVlTczvnk5uTy9vT29/H82NDU1Mrz/Nl3fnlxdmd5cn18YXtF2FN9fHZEVlHEysVQS1rM/v/FV0VJXtfY9dbVXVHL//PeXUhORFXN9MPdV1bB8v798cDQUsTO2sFbd39/QFNV2dFZSEhbU9RRTkNQxPb3zNhXWkZXV9LFwt9e2PHN9cVad35wfn5IcXl7e3ZeUEBbdXNPQVnf3lZf0vHy5efm5PL3//P95ctUWddX1NjSTHx9d3BzdHV6YX5+ck9YX3FxdV7ZzfHLyPHz4Ozs4/jxxt3A2MPTSXV1SFVQQXR6f354ZWR5ZGV9cFLb8cjZ31LByfT79szH2s/2/PPa00ZGUtdRWEJ0dnxwcXd0SHdLRE5cXVPe38Xw+fr2zvf09PbM8/31yUND3NNTWEFZdH18enB1TkB3QFhFT0bU0dzcUF1YUlxYXVBX3l1QTkHU11VaWdVRR190SUp1W0hMWVhXX1HSVMDA3NHS2dvQ19vPwMTewPf5+cna2t/UVdD3/fDz8fT2yMnY1tNSVtdc1lVYQHVOUk1GSn53fH58fHl+Z2FjZ3JOW0FeWkFdx/X28fDx///y+Pz8+/X08fT1xN3cQnZmYGFtZ2FvZnVcWV3G8MPM8Pz7/fj6/OTg4+bh7+D79ffO1UV/Z2NubmsVaGxnZGZ/f392ZUxDcVNZUdNT9Pzz//Hk4Pvj6eznx9hPfH95ZmB4cVnT28nH3MTK8fH2zlN0d0hGR0zW1FjH9Pvn+MpJZHt/cn14c3lzWtD3z9BXTNX09/v+9sxTXUTVxtvcUlfayfv58d13fX59fXt4fH1MRdTK/fj2/eX7/fDwzdVV3VJCVN5RU93x8dpWWXpgZ3pmZ35ycWV/WlTQ1NpQ3vbM9vXFwNDC9cbx8d7a2PTw9ffWS31/QHZ4dH1lZXJGUcz98PXz5fz4+/3w3MTK3vP+9c3TxcDH0ExyfWVjY2JkZGFleHdB3PD3xfX18eTh4uD55+T/+eft4OTn5ufk8ffCW3FnYmtrbm5vYXF1RVJJSklbXljT0kF3fHJPcl/R3fby+PnIyMnVW1pDQkpfXExHUdfa011EdXFaVtPE0t7VWV5Q3cj08+Xt6+Lg4fD+8vH/y8n339v2/Pv+9MtQWdVQ3UV2dXpkdn13TXZOS0zGxF9Nf2RmYWVnZXdOR01D09bF39Pays7z5eXn5fLxyfPn4eT+8ufk+vLaV3BhY2hvYGB6Z2V2dVvdx/TI8vrm7e/s4+T65frk4eT9+uX/8tdfd2FtbhUUFGpubmZlYXt8dF3U0t7U39vFyvT08cfM2t7DzvTx9d1acUxHfHhkeUtY9fbBzNXb2tLk5+Xs4OTk/OT5wsvP2tlY28rf/cFGVEXd2HZIfXtxfUZedEh8ZnB3XMzT09dX3FDQ9MfM9MXHx/fk+vPcTUNyenx7fnd2S0RNXU93dHREWVfAxMrI39rG8vv+5eX8//Hl4fv313RwcHF3SHR2fHB8e3Rwfnhke3xwTVhMdHZzT09ERUJWU1Hdz//6/cTVR0BPRlxEWdRU2fT/4ePg4uPt4uDn9tLQR0pBS3BxZGR7eXx9REdxfXdwcHxkcn55WUXQxM329Pb65eXl5+b7yvX3wN1eXU5ySU1LSEpNR35wdH1ISXNlY2R4e3RN0VdE1M738Pjk5PbK8srHyPX1V1fF18TNzcFPQ1JxfndKZWgVY2ZkenRac3bR3sL3/+X49+Tg5uLh5vzC8crN8Pb310jf0d/dTFpJeXZxenl+ZmJgdEB+fnRZcX1HUU5F3FZMSVLAU17Y21RA0fzM29zRRUJF39zc9/n29vHz8/f588z38vz+ys769s71989SQFRDQFDR1U59dn1neWFgY2VbQHRDdk52TsDx8fH19/785fn09snL+drEw1HTcmRlfHFnb2gVaGJjZmVlcHF2VNnE3cDOzvnm4Ofk+uX8zOHo6uj63lZ3Wk5ydUpGTXRGXkVId11AS8XH3tzRWllMRN/C98XK8s/F3Ex8dXtzfX1FQNfx9snO8vry9vHD0kZAXEtCXkx2f2FnbWNyfXp6aW1ibmF6fklf9f30+Obl5+fol5eQk5Tp4+bn++zo5v/15OHzwdZ6Y2JtbhQWbmhqaWtjZ2VxfWV+en10Rc3A1llT9Pnw+Pzn7Ovu4vvB2VNDTEXey/bCQHR2dEVRV1NRXUt3XlxTV9fZzvL6/P3//PFQW1hG0NZNdXRMV9j38fH33sTPxMrJws3YVdJdTktMdGRmfkhZTn5nbRVsZ3l9cUXW0fL4+uHj6+ns6paX6uns4fj65Pj6y91RSUZXdXJ+YGlraWhoYmZ5eXp+RF9U09jTVd3AxtDT219cRcT2wPT/8PH///f0zvX0y9v3/v7x+f30y/D1xsDF3V9ATU9BW3Vyc3RwdHddxcfKXUxHck5NcnZydVdWwNlc0tNT2dLD9MHNxdfG2Mf19/nOX9XezvPdQHNmYGNiYW1ibWljZXBMQtbQXcP38+Hn4e7i7O/t6O7p7ubm4OT5VHZ+bmkUFxQXF2lqFW5vZnh+c1ld0vf+4efj5vL65OHv4ebg5uzi//jJ0NBGdXZ4dE1Id312T0xZXNHbVnVOcHZxZmBsbmJvZn513NFzc3BCUExW0VrF/eTp7Ono4+Tn4uni4PjJzdZG1kJNSmdhYmF0eG1vaGttYnx+fk1wdNfS++T//PXJ8/Dn4eXu4+Xk5ezn9PXRVMLKxNZwemFvbG5jemFnY2NhYGd+YWVyfEpxRMzc3tBRy/775ubl4uLm+//48NnfSnpydF/QQNBdQsPJ9vHUydVJVNzN8VDawlDYy/rt5OH8xdfSX9x0c0xGU1BU99HQwdvM8/zt5/H729BXd01IenpgbXpnfmdpbhRrY29hY2lhY2B3Q1TWWcb25uqUl5bql5Xu7u3t4vHw5OHj4fn5V1hfXltyfUN8ZWFgentmZmNmYWZ4cUlfRVhCXd7E9srZxsn8//zl+uf+ytzZx/fP3tnc3VVHSXVPSktNW1tST3B+fXFAdUhF18fH311ZU1JHXEZbUlHT2sL98/r6++fl/P/x/P329N5d1UZGcXNxfHt0fX55Y2dgb2dhcFJRzczb9vD/4OiUlemUlJXr4Ozkwv3/w9NPUkt3dnd2eHh4ZGlubGhvY2dkYWdlZmdlTEJxSVtRWUVXWXRUzvT2+u6V7ebh4+3slO/k++bt7ebg5PTYxvTaRUVwZmNtZGRgZXp+cnp+fXTG9dHWXNvdX8TLwPb35fv0/PrJ0FjN/Pfx+fbaT0NcdV7C0nVmcFpwfX1wZGJgeWBvZn97ZH1S0MLy+uDh4+rv6ZSU6uDk5frw8f3Pw97KXE9wc2RrFxRqam9kYWxtZHBIVf/k+/z85Pr64OH65eT4ytHP9cVVRkdVW1NUd311QUZHV8ReQn5yRVjb88VSR3Fxc3xzeGVibHp5Q1BDcXBAXNPa8PL7+f7n+ufg5OTn++T5/uXKwlZLTXdJUkVze2R+fHt0dX1ga29iY3FBREt+Tl9R3N7a21LV2sfK+/r/8Ofs7eDj7e3m+vzK9cjBX3Z8fHphY21saxRqa2xnfnhmZHx1TV7azFRSUc/+4ejj5fj75P/Jy8dQRkpBWkTUQndHRdnHV9rdRXR5cV5Q3VRbUFrQyd/IwdDTR3ZBV/T0xfb09/j45+bl+fj9/fj6ylTURHd3cnpgaWhqFhYXFRQXa2huZHFDdHReVFHT8eDh4Ovp7O/p6+L65/r1wcn68Nn19djBy/PCWkVeTHFP0FVxdkx/fnNEdXJzcX9kZ3ZKdXdGTkTV9vLM28vC38r98/P65vz19Pnw3lNXUkp0VFZId0xOc31GQHR1TldedVBYQk5HUVhYw/fGWU5U3dbGzsfAy/L8/fPz2tRS0NJfVMLa3MZEdHNzd3hnYGB6ZmRNTk9QzMLK+OLs5fvn4efk7O/78frn5/jn+dB2dk9zZXtwemBkfHp6ZXByZmF/e2R4c3N+eXZ3dUBU0VxNWVFAXd7H3Mz65efg7+/h7ent/vb98dnXzszawM/LWn11SHtkfHZ6YHp3S3RN3FHT9+fk8cjMwd7Y9/rl8/v2wMTazsLRVF5AQdPJ89tTSnZwdkl0S39jaGljYXJJRXFkfnZBUNLL1U5KWcL08P/l+fvm7e3s7OHz0d3188rI9NdLd3dDXdNVVEd3SU1fR0bQxd/C/+bh5/XQSEpaWFRcQ0lNR1fH8fDLws3AwPfNwtVCUfX2/fLN3XVwSHRkYWlrEBMWFGJ6c05ORsX1/v7z+vjn7O6UkZSU6eDv6JWV4uH0XVJ8fE11dXxmd3J/c2V8e2N4cEpaTEZHd1lX0cnD9VB9SlBT0NVV1UrXysjw/OHi8Pz75ebz9MhXQFpV0VFEW3BtbGZhYWF5eX1lZXl8d0NSy9zH/fzl5OTl+v/55OT73lfaSH14ck9yfXVbVlPC9N1BXN1bc3RQ0UBd3fb99/rk8c/05PfW2cjfW9/GxtJWxvTw9vT31XBLRFxFQFJQQHd2cHB5ZHtkZmBsZGBjZX5JTHXZ21XVyvDCWEdSSUJaVtld2ubg5+Xi4vbL9sj12PX5/fT4/OTl8OT/1tzVVk9nYGJpbmlsYGd4dn96ZHl2X8b28vrz9fPy/ffx5fDD9vbK8vL29NHXQEp1YXh8bxVrYmRlc0hwc3VY1d/Z9fTLVUfW1dbM9/76//zD08LL9c/AzffAwPf09MTeVFTUR1bcTHxlfXd9T1ZeUF1CVdNW98/eWHFEWnRex/P7/cn1zsPP9M1dTHByTEhS1EpaREvUXNPx91RFemFmbXtzf3FmYXB7eVjR2FhHUtdXxv/+9cD38vv4++Pkws7I+Obh7OL8wtZHTHB0V0N/Z2NhZXJYXNHQXF5R3NvB0kF2cUjc98P0/NHVX1fw9v/m8VZd3ff3yv37w1t0S0pzRkZ9YG5tYWFlfHZ6bGBnc1tQRE9/ZUpa9Ofm7+L4/vv+/+bl/shdTk1W1cH28sZbTF1W38fSVnVTyd/z8PP7U3Tfw/Tm5PfPSVPRWcn8+MNYcnllek5QW0B1d0pB3P/yzlJ5e3pnQklhbWoUbWB9x9hRVkxx1VzC/8zJ1NjH9P3g4+Hn5Pn6+v7k8dVOTUzdzv/h91tbQ1DC8+T8xlZXU1TYzP7LV0l+ZXp+cnh9ZmZlZ3xa3MfXTl1TUvT88vJV08LI+uHu6eb3x15JV9hSRnxgZGRmfllU3ld0THt32N/SWHVbQF31+f33UXdweVn29M7cQ9HDyfng4uHn211DWsvMzcnS0cff3PD+wd1zeHpyUl1FQn5lcHXT++bn/93Vx/Tt4PnyyNRbRU3DylXRcWZkZnxlZ2dtbmtvYH1Dd3FhbHtO18bH88zc1cHI+eLg+8jaXdPJ9/X+8/7/+OTj7OP5yt9SXMzC21x0eGR318HO0VtxYW1lQFJBTElKUNXE2Mz0+/HD2ML9y8TD2FlV39JX2dnYQWdsY3BOTkdAcXxyf3bZxMBec31/Wl93QVFWU9Da0/z5/chAT0bAz8Hy89pfV/T94u7j8VlzfV3V2NhGdE5H38D2+8pdUtVR9fLAyMVwT9nf3PHwyt55Z352RV1aRUhzTVFS3M7RQHF/eHRWWkhMdF/0xNHa3kN5YWNlcEJeTV1Yd0HT3fTm5v3ZWdXH9/zy+v325eH65uD7xFxCTNPQVFpYRE9a0cXJ+vbcTnNmZnNf1lTbUEBAWN7+xFJDcXt5RVxWXl1RzeXv6OvnxkJ3c3bZ2FdDTn5keHJL0VZwe2ZjaWV0TnxxTk1QV8///cRd1cPR9/v+xdJVVNjc+eT2VUdxfHxGxNjC5efk5OTs6OL5ydfVWlrG3kdXUF/axPb533JhaG9jY3NGSUFSRlba/ODlydZJdnBkf3Z7ZXJ5S0pGxUZjb25oY3pY1El1XkbR8eXplfrP29FWV87w8fHh4+bh4O3j9dNUUFRd1FTUWlbF8uXt6+/0dX5nbmptYGBtYXl1QdP38V13QVtLcFTf3FXTyPvn75Xr5Nd0dnN4REBwe2dkc3130txedXtlcH5LX15Y0/Xk5Pjj4PLVSXdwfnZCd3VCdVbL8+/q4fRQSUFLW8HLzPTx+ebn7u7kzVJZTH9lenxwf3dU98nx5PfTXHd/c3dOVN5QWFzHzf/t5MRecHhmY2FnZGFlStPQzuX5U3x5fGVnZHJJf3Tdwvzg65X611h2fn9mfVp1WfHk7ZSRl+Ph4Obx01t2dXN30/Hz5+HkyUd9fWBvbGJ/cmd13N7y5ODk8FTcWE1JRcFCSETI8P7l+MDVTnF9ZWRlcXZJXs/I9OXn/PTVdWVsYWdnfEBD29za9P7y30l+dXBkf09b0N735u7qlJTo4cdUXn92UdDM11tX9+Xt4fT0XnV/Znl0WFfV2M7l5uLg8MdRTGVvaWBtZnpgZVzE9/n85/3fTGBjcWF3UklKwfzw//PzxNVwZGBgYGd5eHJSys3z8/n/+tjQ08Lx3vLw/fvn++fg4eXg9Xdyck9PR0DRxff2wM3229ldentjYmdNX11TzcPX8Pz19lJgY21uY39IWNz1//jg7eLt7fFYR312dHl8SFHQ19PEWUx1ZWtubmRyfH1wWFbbzfP8//LefE1VU9/Z2Mv98Obn+fr69Fp+dVREU0Z1wfn95+Lu4+flzlNESHB8dnBdyd7UwvTR39tVRHdlY2hpbGFzd1jP98b3/PTQS0p0dXN3SHB8fEhTXlTOUXJlZWVMQEVXdFpd1M718+H9wF5OUcTBU8TGwcj54+iV6uD2VU1JR9FIVNFTXVfazvLzwkt8e2ZmbGtiYW16ddnK8P7I9dxRQV9YX19VVlPf9fH099jJ10dxfXZwck51TVBCQVvZ1lRAdnRySkxaRU9T3cXYyeHm+cB0fXtgYHhaV8H2//3m6+/t4/XMwF5aSUp0QV3cwvzv4eXm8lVFd35PTmV5e3FDRsTE3MNVS15bcXV0fHdxRsVW3tNf0E503vReTkl5cUNf3tv1x1XA03RzdHpyQXt/Tdfz/PfP0M/8ysz+9/Dy1UZUyOTn5+3h5/7M2vP0397G0Ex2SEVTXkdWTnNx1VxOdUxe3tjQ2FJGd3FnZmdPQklbXEdVVt/4/OTz/8hUV1BAd1nRVlrayP748FxSfGJjYXJ4eH9hYXl8Rcv49vH23dr18/b45f36/vb47+j6wVB+cVle18DGX0dJWdD95M3FU3t+UNDC9/fF1vTJ2cr+99ZceGtiY21lZGBhc3Z2Qf/819JZX8bP3vz10UBCQEpW9fHUV0dPd3JkfUp0c3VPd0FQx93S28rz5OXj6O3n5Pzw5eHs5M/Fxt/bVd/323VLSnBLQt3ZVHVdVl9aRdvTSnVYRlLexsXXcXdP1/T1/89OcX1heEBR0tNDTFVZx8LzzVzV1URM0txGcGZmdEBT2/L5w11DRk/e9vXBTnBG3sb85Obk+vnz9f3n/v3Oz8HI3vT68vXHzMfT3vj101tNXllE2/v0ydVAd3x8RFpKS3B3d3ZNXV/WVVNKdEBdVlxAfn5ySl/O9c7AWXdKUs/wwtxBQV5d2Pz78/HM3FZX2sbbxtnK8/D8+fjw9s3X0sfIwdLSVlNC3f3n5/nl9E90d0p2fnNkZ3hyTlPcVM7MVFZYXVNb3FFBQVdQV8P08s3USXRE2dNUU0p2Q0Jb3ND1xF5OdElbdnFdRFzcxMLHXMfUS3dxc3x0UtXUUkTcwf398vvI2M/E3lVa1kx/1MLQz9rDytPU31VUXU53T0tA2F1SVdv0z9veV1DM2NLf2NvbV1dZR1FOcXdOcXx8cUpA1MzYxd/ZydddXkVDf39zeXROWF5U1dT1UHR3fHhkZ398SETGyvHw9eHl5ODk+ffEw99dXVXX0FTS/fLdR3lnZm1lc3t/TkpY1VTI8ff3//z79fT0wfT8/efk8/v3xtJaZ2ZjYGRhYX58ckJbxvXFX1hOd3hkfHh5Wkdc39b1w8nY9fz+3XF0fHt9dUlUVczL8sjb0dVVXcfKzM3CUtPW11XSzM3b3NrU29deX1nVysLA2dzWV9LV11xRVNrXW1/Y2dL2+fDZQUNMYWd7cUNRTk9FdUp/cnh8dEpxfXl4e3l0SVjN+P/z8fPe0dDH8OXk8N/N/PL2xMbf00xLU9dGS1RcV8Py+v3QXUdEQXVLQFbUxlVR1V7G9//k+vRddGFheGdgYXp1TVrEx1FRWE9V2fT2W3VAQ1pF08bC2FRWdHNzT3dLX1tAc35P287OwsvB9/PH9fXQxcLO+ebj4fvNUkpMSk5b1cLWRkR1SlDX3cbAXk51fX18fnBOTF9U0cTdVFFfXdnZ019EUlhCVvX0/ffMxltIQ0db1s/z/MjKyMvN2d3XWEtLf2RneHB2dEfB+efg5vLNRHFMW0pF299QXNP3/frh4ubJVF3XW05JQXRxWdNQSXV8en5EUdNZd0x2c3N20/Lw8PzP1dHP8cz54+Lg+/D++v7J3NFQQHB3S3FyfGRhQt7T0lt0c3xyeXF3TFPDz9vM+uX54+/u7uPl9sHDVNTJxc1QQ3F0SXR4ZnlwdlfEVdFTxtvZ8PLzytBBR1xV3/T55+Tl+Pvn4ObTXUN9fmdjYmNnZHJQ9fb+5cjAyfP03MTLwd/Z287x8/3/9vD29NNxcH5nYmxncXN8cnFzeErYx878/fPI1tn0/f7w/vPP9M3GUM78+//5/8zEVVFfQl9LdUB8ZHp+fHZbz8jK+/v6+Mne0t7OzNvZ09vx2F7X2svCz9hbWsTAWklxTllX10JKd3ZxfHh5dFRZd0NHWVf34ePg+/fS2MDb28T38vz78+Xm5Pn3zMLG39JNdklMRlzZy//l/VdV3UZ2cUlxcXJyfn9GXdTPyPfyyNbcyvXaRlLZV9/bXHZORkBSRVzMyMVNcXl/fXRHTkBIcXN7fV3C/Pv74efw+/rl5uX1wt1QWk5MeX1PU1lE1NbRXUJMWN/94ef59tvdVMPz5f/N111ESUB0c3d0Ql9EWNTQdmdhZXl3WlJYVFF8dlzdxsr/99FRR0xS38LE09fX3c/eR1dfWFfWUnZ/dnZ+dFPEy/rn//fPWk9YU83K9dlCdEBJXt7N9crzwsf/+M7dVldaQFxLf3pkbW5sZmRwdHd1c2Vlf0hV3c7fW19d3cnw+Ofl4PvNwVfURX1wcH1wdnx4ZGd6dVrW28NWTEN0QtL95Pj5+fXE2/bl+sfVRklJfnpmYGRkeXZLQVZCTV1awvD9+/DxwEBwdn90Tk1NdV1FdnF0SdVWVtfXwMbfydJRwcT0yMXaXk1GdV/Y0cnDWFlYcXBldcTRx95EcX1wcXZFRV7UVtfVR0RaUdvcxvbI1kR3c3txT3dBRHV+eEBHTEXeWF7e0FBC3fbx4eH65/v98cnFU0VSQHdEVkBKcHJxWcvN0fDO01xyeHhJSHVf0VdVUVfYxvTzzvT68s7dUl9f1NVE2N5GR3d6ZXBf0kdKcGBjbWxne3l7cFdWUcrLwvng6+nplO7h5vbNzsTZxPHCXtXRdk5FR0VHR0Vye39lcE/Vxvb88/Dy8PT//vv+8fbeW0FPTVlZRl5dQEl2fWRkck1NQNFQSkp2eHxzf3ZGSn1wS3Vf8+Tn4e3s4+f+8vbIzMPG2Nnb1lRX18fByfD2UHB3dEDUV9POyfH8/Pz8/fr4+Pz7+sjV19VT31PQ8MxXR3xnZ2R9fXx1SnZzfH1wc3ZKW1hWx8HCxvXk4Obv6O7i/sPdVFxOdHR+dEBMQEBQ9PX1+fz999JWWEDX2PX+/ffKwN/O8v/08v3y8s3f0NBXV1VRX9jSWXBnfnV3Wt9cV150dElycE90fnpycHVNVMnl5u3s7u7h+8ndW1JTX1hbTnd/eHdARltHcUJASktKd0VR2vb+4+7v4ebg4Prk5v73wdfQUkFS0k7WfEtQZnRPTkbd1tHGz9VGd3hlfX13TnZDdkPcxP/i7+/g5OTzzF1ycHx7fHZDR0hF1dHL9cjCXtZWWtZGQdBR1dbX0NrGzNHZ+fL4+//+21xFTNfd0NVGdnxkZX16QNRaX0FaUEx0fGR9cn1O18n3zfb65uzi4uLh/MRdTnFzcXN/fX1ydEJWVt3Z1tHRV093QUZHVsPK9PL/+fXO9c/y+fHwyNhTQ3RyfX13fH9/cXF8StXQ0VFc3VdAc3h7fnlzfX1xdl3Q2cz84O7plOri8tLSxt7c10taQ3Zxd0hRV9fUQd1cTXZ+dUZN3Mz3+v395f3/5/nl9vTy3Ul+ckpKSnV8f3hhZ396fFnQVU1YWHFlYGZ/eXNzfEdDTlbVxvjm4Obk4P/TT3F2R1dRRF5VRFfGxML6+vHDwtpfdnJPRFRV1dPM2t3FwdTH4ezh4ODz2F5S1cH1xtTVUnB5fHJ/T0d3fnB8YGxoahVjZmR4dk5NXtbM/eLp7uzj8MrZ01dV2lxOT11MRkxNS9XOwNrf1ExPeWVKxPT/8vb29ffz8v7j5Pj55cnXWH14f3d/f399f3xzd1jT0FRYR0t4eWRnZmVnZXlyTXB9TkBV8Pjl5+Xzz9nW38jIxs/b0FRd0djQ0UdKSEp0eGRjY2ZkcUHE38PI9vb84e/o7O3n5fnKwNrd3FRfWE9GSX5kZ310cH1+fXFnaGpoY3h5R0ZL1dDH8+bt7eLu6eD8wszSQUdTQEh1QEp8fkpEWV9GQk1GfX5yfXNH08TZ18Le0cPy8/bx9/D88MfQ0tnY9/DPWV1VSHdKQXdwQUZLcnhgaBVrbXp2cH5BUkpa9+bm7O7t4eTk/8zdwvHz9dNd2tBWX15IcU10fWR6ZGBhfkfAzcLIy/j/5eHm5ODi5vr8+vRVRUxKQ0p0eHhnZ3hyfmd2dENJdXB8f3l9TVVQUlfX3ff45f/h7eDj4Ob/9/H99fLyzM7b0djB0kd2Ud1Y1dZNdXNxQlvMwNbY3s/KyfLz8+Tl//r+8PnKw1ZFUXV4eH57cnlkZWV5ZmZkYmhvZmV6ckNCWdTx5+Dv6O7q6u3p7Ofl+vP9wtxUS0ZBdHZyc3dxdXVYVlJFV93GwdLP9vf+5OXl+ufh5OTm4Ob6+/PNyVR1dHpkfn5xfX5xdkhNdn54ZWFiZnpmeX9mfETU19T35//64uLt7O7u4e3g8vPL0szG3FJydH9gZXpleHl6enbQQ3HT1sD/5Ozs6JaVlZaV6e7k/M/IxWVjY25vYGNib21mY3hOdnB2fXJ7fHx6dEhG3fXz/fP65fj6/P/l+vPw8ffSQk90fUpbRVhaWUFGU1BCQU5OQ1rWXlld0d/L9/P5++Tj7umVleru7ebyw19wfXByd39nY2JsaGpsYWNibWNjZGVmek1V2vjt6ZWX6u7p6+7h5+TyyslccHl/eWdgYmxtZ3lyT1VZXtbWU17e19fY9P/+5+f4+uT75eTh4+Pm8V1EcmNiYmBlcHB2TkxIcXBxf3lkZWdjZGRgZnFDWNXXzPjk5uzr6uqV6unt4uXCXVHdWUhlYmJsaGtpYWdneHp5dHd8cELb8ufs7pWQkZaWlJTp7+37yFV5bWsVahVqahZqbmhmcnVCTUBKSERFWFhf2/Tz5+Xy+cvGw/X9++bm//zKXUtzdERZ1t9EXdNUUFBWVN/VWVlMcHxnY2d8d0hHQcDx8uTi6peU6+/s5vPFREtPdX5mbRUXEB0SExEWFxYVbm5oa2Z2xfzk6JeUkZfqlZWV6pTo7OfeSnd6Ym1oF2tqamxsZnBHU93W3s71y8D+5eTj7e/v4eb++efn4ef21lxyYmsUFW9gZ2dyfX92cH1/fXFNRERBSHhgY2Nmfnp+dE5Q1NnM+uPv6ejrlJXp7eHn8MjWQHBlbWhrbmFmZGdlZHtiYH5ewfHh7ZWXl5eVlZSUlevs5PnZdGdibWoVFBcRFhYWFhcVaWJhZUzR3cfO+OXk4Ofk5/v98vX1/OX5w1pOcHpkZ398cnR9d0JEQXRKVvT39PfK8cdSSEpDTdfGxvHy//rg7e/u4+Lt6e7g+M/N00t+Z2xoFRcREBEUaG9sY2BgZ31UwPLl4e/v7uLg4eTj7Ozt4f7wy11LeGdkZmBiYmhpbGJnfUxJ1Mjx5O3t4eDv7Ozi4+Lj5ubm++f/zdlYdntkZmZkcnllc0tyfmFiYGdwSV9YR0p2cn1wSllfVczH3sDK+efg5uLo6+jr6eL929hPf2dhYmtob21jenxyTU9wQdXSyuXg7e6VlJWUlJWV6pXu5v7IX0l8Zm9tbxQVFRYSHRAWFG9hcFHN5eLq6+ro6Oju7+/n//nxxNHXSXZ2dnZ3dE9NW9VQUlHVUNDK9cbw+vr998/WRE91R9PTwcrLwcL45P728Pn+5eHm+8jAUnZ3fmZjbxVraGsUaGxuaW9kck5RzPX0/efm4eDg7Ojo6env7efk89tIfXFlYWJjbWtraWliYGVG2fPg6e7u65Xr7u7qlOjp7O3g+vj3w1hzfHx+f3B9ZmV8e3phYGBgYXt5dHZ2WllETEBHXd/Z38fd283N0dbQVMTw8uTn//X2/MXW2tHR2dddRlnV1lZFTlLXV9/P8vLK+Ofj7O7rlZSRkZbq7+LkzVpLeWFsaBcWEBITEh0TFhRuYXBU2/X85+Dn5+bm5uTl//P3z9vSdHh7eX1+Tkp2dEhTX3R0W9PfwfL55OTh5/LS2sHf3M3z9Mj0/OT6+eHj4OTn4Ob58/7y009LdXZlZWZiaBRqFBYRFG9sbXpOXVHc8eX7+Obt4uuWlO7k5uTBXnB2dmFsbm5vFW5hYWBmd0NS9eTm5efi7+Pg4+/p4uHi7+Lh5/LeUkVdSUpIcX9mZXpkZmNnfmVnenRxeXBBSXVxQN9dWkNMSXRHVllaWlbVQEXWycjb9c/Jw9faxNNVU1l3SVtOfWV4cHB5c3FFSE3R0MHO/uzr6paRlpWVl+vh+vDAU3tmbWkUFBUXEBARF2hoY2V4f1/3/Pz8+uT6+vrn5P7l/dBCcXB0c35/ZWBtZHN+fUhYVVfY8/r+/uX68PX85eH4y8dQdXXUx93Qxc3Axcv++fH29MDWUVhSXXRxfHtjYGRvFRUUFGpoY359eXp/cEzT9uHt4uzs5/vm5vXc09VRR3Z1dnlmYWRnen52R3RLUlNVwf3k+P7+/vn9/+bn++Tm+Pf/8/T2ys3HRXZ1dX1nenh5enpzSXJmY2FibGd6dkJBW0BPTlvdx1fQ0NtQU83K3tVXXkJB0tDBxtvY1VNR28RFd3R3cHTS8P3A2tjd3fb74O7vlZaUlerq4vPLxN1dRV9WSGZpFBVqbG9gYWxvYmFmcEVNS0ddVNPK8vzz9MHWRUZDdXZkZGRnZH5CSX95dkRWwf7j7ub998DByMr/+fL39Pb1zcNXWF/Qxs7y+ufi4fvl8vrj4Ob7/vLC3d3cXXJsFRQQExYXam9ubWNmcUTA/fvj7O7p6+jj89F0c35zQ0BMd3pjbWJkfHR0SE91Rcb75/j75+Ps7ZWUlpXv7Of//f38/dnUREtIT15adH1nZHFJV8X2ysRFd0tOdnFKd3BzdnbU01hAcX9xdkXW2FB1dXFzdFzP/Pfx//Lz/eTk8dFKcHFyf3ZaQ0x0dkxfVcX9+f3/4e3rlJeV7+f6+fn65OX3ztZCd09AQUt4ZmdjbGBmYmxgYXh2W83l5eXk++Xl+fz99tFMS3l7f35le3pnZXZXzfHx8vbD9fL5+fz48vT1wfPn+8j1w9zQ3sH/5v/3z8fE9/765P/M98ja9fHYW0pkYGBgbWBtbmhqamx4S1zd2cH8/Pnj4cjD3lpGSk9W0kJ0S01LSF/Rx9Z1QFVWxM7BVd7Fw/Tz8uDs5/v45Obh5+fk+PX3zMn/8sZEWF5TVtXC+/7KxcddSUJ0ZWBtbmFsbmFlZGFlcUXX0cTy9MPe0lfH8fL298TRw9/byNdHTnZ3dnVDUVJDWlBfWMbz/v/+5eHs65eRlO/g5/ry9/H+99VEWENKQVxZTn17fHl4eGRtaWlvYGR8S11cRFNXUdD08NtTQE9KfXRAcGFjZ3x2S0bSzsXE8vn++ebn/PfFyM3S39xEdnRNU8fO9//+9M3w//vm7O/i7ePv7eDm+8NSWllMcXxkemEUFhVqFWhsbW1nc9/Nzvjn+PH28svc1NbcRnl6fXpkZ2RnZ2d9REBEXllMXtLbyvnn4uPk5ebj4eLs4uf4+ef5wsDD1UhPX1NQX1Lb111ex8za29dYcmdnZWFsbmxqFxVpY3h2QlxaRFDWW1ZWWU1IRtrBUE1ETWVkf3dxd3dDR3FwWl5CW11dWFjc/ubn5OPi5fvm4Obm4eDk8872wtLVU0B1R9TY1kRISGVjYH9xeXBAQXF5fndxdVlWRkJE0NVMdndLf2FkcHx8fHVMdkFX0NzezM1fUtDL9drH3lhLd0BSXMX/5/rk4O/j5Obg5/3+5uPn/fTO1kx0X1hNSXVwZ2BgYGFgY2diaWJlSEdfx8vCzfT/8cvLwF5KTkF3ZGBgbxQUb2dkeXF1dHdL3Mnw5+Dt4Obi4uDm5+fk8fXLw83TV19bVlTazsnK98vP8fjn5/7z8NlHRkVCdXF8YWxram9ubGZ/SkxWycjH3djB0Ffexd3UWU1xfXllfnl+cXZ+fn1wcE5Q38DbwMj08OXi6JWV6Ono7+jr7ODm4efzyNxcT3pnenlwdUt1c3xlfnN1XFRFQ05KQ3V1S0hPdHVKc39yf2FiYWV7e3p5eGR6dl5X38PE21JMVtvJ9vzl/vz2ws3DxcLCzPPk4uDl/vL5+PL65+bm5Pj9/fzy9/b099pSX0dJcX1+emVhY2NtYmRJRFzbw8TAwsXeV19GRU1JcWVgbWtraG9jZ35zdXF2Q9PI/Prk5uzu7O/v7ePm+/n+/Pjn+/H39PH28P3wx9DU2PX2/Pn3zt3W0lJeWkJNdHx8fmV7f3tmZHJCU9DSU053cHZOQFtRUHVwcHN9f3t4ZGFhZnhwcHdOT0XX9PP45uLu6euUl5Xq6+7i5uTl//Lz8MrfVVdXVdXZ8czHy/b5+/HMx83I3FxaQF3RU0R3cUpNQEJJdXdwfXt6fHFyZWZmZ2V/dUBPc35yS3V0W1fW3sTJ9v76/PHJxvX44e3v6e7v4uPi6ZSV6OLm4eDg5fPD2lVATVnR1kdzfXx4ZXhydHR3T1hXx/TC0EVJcnpmZmZkZWRkYGNibG9ub21gZHl2QkVbU1HH9fng6erqlZWV6ujo6O7v7+/j5OTk5Pvzys7C9v/55+fm5fvg4OHl88BSdXR2fHlmbWgXFxcVbmxjZmdgb2NmeX99cnB3dEFCR05/emFhendaUdXBzcL85eDi4+Pk5OPplZSXlOjs4+Dj4+b7/v329/D00FJaTU9LTkFGQnFlZ2Npam5hYGZkZWVleHh+eHp6ZGVlZGR6f3J3Ql5W3N7W2cDOxsj++Pn4//3/+f7/+ufn5uT+8fD/+Pn6+//L2tveU0JwfHBwd3RKcXF+ZGVkeHFKSndzeWV/d3RyfHJ/c31xRkJCW1lZWUdS1VFWVt1R1c/LzdJcWlDTx/H//f/78v/88/7/+Pzz8Pf///fC2V9aU1lbT3JnZ2R7f3ZMQE1KTlpDSV3TxNNZWVlCdEtHQHVHRFpdUlbR0tLbwM709MbMzMLI9/f398bQ1tRFcH14enxyeHx8enx3RF1ZWNDQUtPA2NRf1NBW09LAwdFFRU1IR9bFxs3H9M3J//j5+Pv/9cTCwsDAyMPeXV3ZycZWX1NScn98ZWZtbWJtZ35KRXRydUdISl7Z1lZTVlJPQkl1QEt1dXZDRdfZ3N3I8fHl4eDn4eDj5/rm5+T78vLOwfX3+fHCwNxedktbTnB3cHJkY2NibWhubmhsYGZ7ZGFnZmZkc0hJT0tJc35zSEBbXllbWt3A8fn8/uTg5uHs4uPj4ef4/Pn98PTY1URX2vH6+fD29/b38PPA00VAdHhlYW1pamoUFGpobW9obmxub2Jhe3t6fnd0T1hdVdPby8n25ODp65Xq6O7o6O7s4Ofn5fnl5Pry/f3x9PP6+vj2zthWQURETUhyf3thYWdnZGNhYWxvbWFnYWBhZ2NsY2dkYWJmYWNld1pcRNDa3MX94+3t7+jr7+zp6Ozh4eHn5OTl5P/398DS1dzA2Nvf1dVFX9rQRHVJT09T3NvAUk9GQ3RwTEl9emdleGR4SnJmenVzcNHB9fDCy/f09Pby8/D28f788vj68vT19MLw5fj7+ffI9MDf2ttQWkZbWUBbWk1yfX9/cHRNT0xLfXN8fnFCU1NZ1tnA9v3l//Py/P/85ebn/vbCzddHXlNHdEtXXE1d1tpWW11eXV/N88reVlTVREFdXVh1Q1FCTdXXUElxdnJ/dVJTRExLX1JOW9LHzc/2+Prh7uqV6e/v4uLv7u3n//DxwtLGzsdWV8XTUNbe005/eWdjY2ZnZ2BsYmNvbmNjYGB6dHdJV8fD0VHc0lHfy/f3xtTbx9/GyMjK9uTm5eHj4OHm5OX9/uXm5/r75eT78ffK09RU2dNEUldQW0l1cmdne35lZHp4emFgZmZjY2Z5Z2R9dEl3cXZweHRU9v3w/vv+/eTg4uHi6e7i7JWV7+Pt7+D65Ofh5fn+99rbz8nF0tzRWXVITkx9emVkYm9sY2BsbG1jbGxtYm9ubGBmYXpzcnB0WlZZ1Mn///rj4uTk5uHi4+Di4uHk5+H7/P775+X7+vnx9/PO3dreUUVNTXV1dEpHQ0lPQVFfS0hJdnx8fmNtZmFhZ2dkZ2Rkckl2TVDR2NPXw8vN9P7l9/T88PD9/P74+fzk5+Tn5Ofm5Pj/9sHS1Ul7c3N8fnh6ZWVkZXRJc3B8fn99cnFzf3NGd3JEX1HV2cH19drL/vfMyM7MwcDax99bXdZEUNvT39ncxM3b3czD0VNeX1NYWEJLdXdxdndF0VdU3djYwldFUlhKdUh2Sk90d3Z9c0pxfHTQ3dr38/rk5fnk5OXk5Pr75f33xsHA9cfB8fTZ29rH1F1FSXR7ZGRkY2NibGJvaW1hYWZ7fnN0Skxxc3N0SXx4f2V6d3F3RFLXyP3y5+/s7+/r6+7u7O3g5fv498rw8crE2c/PwNnCxNHeVER9Z2FgY2Jpb25rbm1hZHl6eX12Sl9fQ09EUkZxT3d+ZGZ5fHF0RNHOyvb6+vnn4uPg7e7o7ePi4OH4/fzz/vr5+P/w/P32yMv3VUZBd39nYWNvaWhoaWlsbGxtY2JjY25rbGNuYmFlemR/TlhBQFncyvT94eDn5uLi5+Ts7OHg4+Pl+OX48/Dx8PXN9Mr3wtrXWUdLTUNOQkh2dUpN0NvT3lVaTEZcX1JDdHJ6YG9vbW1tbWBgY2V9cHROQ1xUzfP5+vnk+vn65OHj4eb4+/r45uDm+vj48vXx98zfVF1NTXd9cHZzcXFJSExZS317fnJ6ZGV4ZGVnYmNjY2RzcnZZ0c33//r6//37+vbI9vHPwsDB3NzR2cjM2trXW1xX2t1cTUZBd3ZMVl9dWkNAV9PN/fny8Pbz//L8zVhaV1p0TVtaXF1Mf3VDXMDz8PH8/Pb0+//3zs70wdnc08TE1VlOdU5U11BSREFHWlPWTndyf01Lf3VId3V3TkF0S1tNR09OR0BGR3V8ent2TEZZVt3awvzk4+/u7u3v7+no7+zs4fjy8PL0xt3dVFdU1VNaSkpxe2Rnf2VgZ2Rgb25iYGd4dEZT1FfT2VfX3FFdRVffW0ZRX0FOW1xQ3sXx5eXk5uDt4u7p7O3t6e/g4eDk88/KyM/I9Pz88PT1y8zS3Vp0cXt8fmZkZGNpaWxvYm5jZHtgbmJtbGJ6Z2ZleHFIcXRCUVXC8fH45eDj7+7q6urq6pXu4ubh4OTk+v3bVsbGx8TDxt1XUFBbTk1HSHB9cE5SR0deRk1eUl1RUd1QTHR3dHF4fHlkYGNnfnZ1Xd7F2Pfz//z75frm4uzs4uHh/f3x8ffC9c/38PXI9czb2snJ28HCzczQU1ZeWVtQREFOTFtBcHBHS315e3p4e3NzfHh5f3l/T1tT19r28v32+OT7+uX6/vzl5ubn5OX21kJEX1VdV19PdXt8cnVPdHR1c3dI1cHCx9FSXFHbyMPw8/vl/PLy8PfN3lZdU17U39rc39LaxszI9/bO/fP2//fNx1VFTkdT1FdFTEtDRFxTW0txemVkZ3pySnF5Z2RkckpGWVBKfXl0QFpEX9ReU13VxMvI2d3X19/Ew/X85Pjy/Pnn5uLp7uzt5fz1/fbG3tTc1k1yemVnYGZjY24UFBcRFxVpbGN5fnl5ZXBMWllF1tFU2tnK/PP2ztvb0MDM8vj1wd7CyPTy++fg5+Hh4ejo6ezn/vXJ9vLm5/nw2Fx3d09DdHlnYWkUFRUVFxcVFWpoaWJtaWsUFxdqaWxjZnJ2eX50RFle2vTz/Pjg4+Tk4e3u6JeRlpeVlOrv7e/h/v358/vl/P7PU01AREJEQ3lkY25paGhsYmxqaWxhZWdlZ2dgYmdleUtaVkB2cHZJRcXw88j3//Dl5+Tm5ebn5uXk7e7t4OTk+vH65/rx9/v6/P398MrB11hxZXh9eWZmYGBvb2BibG9iYGBhZntkbWdlZ2F6XNBFTkRRU1H18cRfU1HczfLh4+bn4+Lm5eDt7+X2//LIyMvJ1EFFUt3U3fb00UdAdGdgZHt6Y2F8e3x9cHF6e3ZdW03H9sNRU1TZ08n98/HM/eX48vv69NzQ3sz28OTh5fD19NJYXNrDXEBQXktCRFhLS1ZR3d7C/PPdUkV1emNtY2Jvb2Ntb25sbhVrbGFmZ0/W0dTF9PPz++Dj4+Dt6enu6ent5/7w8fTx+Pv029NecXp7f3pmZXl6ZXN0cH1wdEhNRN71xEdMdGRibmhvbm5jc3F2XlBBQdfB9vHx4enh5Ozp7ezqlZXq65WXlJSX6+H+9c3bVVTR01JAQ3F4ZGd/fGVncFl3S0F0fXxJW3R6fnV9Z2dnbhcTExATEBYVbmR5d0tIR8Tz9PHm7OLg7u7s6eqQkJCQkJKQkJKR6+L69NNJTlpIeX5+e2VmeHFwc3x/eXlwR3Z/ck7SQnB9d3d3cX54YWJibWJhY2FmfVZWWkVRyf385+Dj7OrqlerolZeRkJOQkZGWl+jn8cLUdn55ZXpmZXByeX90QUNXwNlfWMXaTXphZmBibWxvbmtvbW9pYmBgYXp2c3JMxcrNxc3PyfHk5u3p7+vq6+jo7+zrlOvt5OXg5c7URHJ5e3l7f354fn1le3J+c0JQXHV+d09Lcn5kZnpOWVbF3t/axNjMxdbTzPH0zcPx+fj/+/3w8eTj7e7u7e3k5eb89Pvm+f339fDx0UR0fnp7ZGd7cHRxdH57ZWRhe2RmfmZtY2ZpFWxgY352QFDYzPL+/eTk+Pj88/fA9/vn4ebn5uHi4O7r7e7v4PjxysH0wtRcREJFWdRTdHB4Ym9obmNne2V8e2R7fHt7fXJ9eXx0QXBwVtFaVNz0+ODulZXp7+/t5uT9/Pvk4unv4uzv4+Ph5vvx9MjGV1heVlhATXVDQ11QRXR5ZWFpFWpoa25iY2xubWhvYWBuFRVobGRxTVHbz/b45u3v7O3v4+fn5OT65+Hg4+Lv6pXv6JXt58He3dVV19hX39FQVVfXWXZ7Zmdmb21gbW1iZmVmYXh/ZnNBXHNgZ2ZhYXJB2vTx+uTl5P7/+/z8/+Xk5+Li7uno6Onr4umXlOL4/t1adU9Z09vewcLIxF1ERXFkbW5raW5qFWoVFGprFGtheWBoaGlraGxgZGVI3c3z//799s/Kw8TL+Ofm4ezv6Oro7OqRlu/4+vHEWE1OdUhNXNzbxVBQ1112f2VkZGNgZXp6cXZ6ZnNZ0n9sZ29pFG5lf3h0VsD09PX++P/y/v/98Pnk+eTt6Orp7JeXlOPH21pxfnxxSXFwd0FbU1Ba1FRDcHFJdn95Z2JvYGFmaWllZmNqFhYWFhZpZmZ7T1TC//v+8vDy9fTN9v318fvk4e3i7ePs6ezo587BUHR5c3Zzd3FNWE5DWdNSdHl4ZGBjYGV5eHVLfGFmdHR2eWBua2hvYGR/SV5Vz/Pn4ePv7ubz/eTn5uDs4uLi7uztleju4fTI0lhfQkRPcmV5d1pbREVKZWBnZ2Fjb29vaW9vY2FgZ2ZsahQUFBcVa2hrbHpwXNHx///h4+Hk4ePp7+bj7Ozu7uvj7eHg7P/5/PTAVtHWSEpKQVFHS0pFQ3VzcXtgYGd6ZWR4cnZ6eXN/eGdlZGBubWRken5xd3VZ9P3m7uiV6uiV6pWXlpeU6+7p7+/v6eLm+v722cv3zMDUUdNRVlXVUU58Z2ZjYGdgYmgVFRUVaW9uYm9iYm1tbWBmZmFnc3ZF2c/M8ebh4OLs7eqU6uvt4eDv4OHg+/vk4O/u7OPj4f7x8vH28vbIycVSXVlOdnhkZ2RnZX5kZWV+entkZmR5ZWBnYWNkeX1KTNTO+eHplOvp6+uVlJWUlJfp7+3h4eLs4OTl/vPz8uTh+Pb29Pf19v3xwkR1dnt6cnllY21vaWJjZX95ZWZgbG9pb2JrFGljZnNS0sX0/OTi6OqUlpTr6Ojs4uDg5fHy5+T++OTk88jG3M728vvl88n39MzK3lFHf2V5ZHl2T09yemBlfUpDTEpyeHpkY2B6f3BwWsf24OmUl5Xp6eqVlZWV7u3h+8zK//H2zdHdwPTy/PbOwdZX1trb2dFbQ3V8e397Z2JoFBVubGNsbWJtYmBkfnd2eXxycEpE1c/19Mjw5+DolZeXle/j5P7z8/TE3trHzPP45f/+yvf98//88/TYW051TndzfXt9fXh5e39+ZGNqaGxgZGV8fmV7fn9xd05GX970++Hs6Onv4uHj6JSUlerv5fDH38Lb39rQz/L74eHg5PRSSkpZ1NbTX3NnYWJiY29ubWxub2ZjbW9qFxATEWliZnJ0e2FmfHFMR9f38uft6pWVleL9wNDE8/j68vTMxdLby/D85eTn4+Lg5fLBU3xhZH11S11RR3JkZGdmYGBmYmxkeHlkY21oFhEXFWxleXd1dE3d/Obg7O/ql5CSkJfr4fZSRlTQyfHy/vvy/fjm5Pn99MzN//7OUkl7aRcXa29gZ3t5ZW5oaWsVFxcVFRVvYmxuahcTEhZrY2VzX8r89vvj4+Dg4OPm5+H78cZQdXxyXtv45uyUl5To7uH4ytxTX0Fc3Ed3fXpgaW9kckdMSV1Dd3J7ZGNtb2xtZ3dLeGdmbWxtZXTV9PHn7+/p6O7s5vvz8vvk4OH+8cza1FXb9ufj4+zt5OT330Z5YG4Vam5mZ2JjbG8VFG9menpydHJkZ2diaG5vbmB/Q9VbT090dHNC3c/9+uHj4ef4/cnb2NPfxPng4Of4/+fl9v7h7e/s4OX1VEVwZ2xoaWhuZHF9eXt4cH9+SEd1cXV1dHJzdX1lZH9IWc/l4eDk+fv/9/Hl5P7k5+bg5OTk/vjl5ufl7Ojp7Ofk5/zPwPL1yc/XUFt2emIVFxEXFhRvbWBub2JjYGBme2FkeXhwc3Z1dnZ0X9rJ5OPv7+Pm+PXcUFZbQ9DB9v7k4eH65+Pv6emVlZXp7eb9yNlU0FTR397d1tNScXhlYWFiYmd4fXllYW1jZmR5dndOXdbfzcDX0MP2+eDplJTp4uD6//n98Pb39vrk5eDt7OLs7+/p6e7v5PD00Ex2emFiYGNhZXt9dnN5Z2NsbG1vbWJpbGBjYWV/cUxT3/fx/P7+//398vH18f388MPy8Mnz+fjn4ebj4+3v6ens4+Ph5+Tk+vjOxdvVWktBTXd+cUlFX050SnRyfHlyfHN6e2Vlc3F2QlXB8v3h4OHg5+fk+f7wz8zI+frz9Pf98fP64O/v7urp7+7t4uX/9sHE397dWnZ4emdhZ2ZhZmd+d2VnZmZhYGBjYWdkfHFwcnBAUNPAwPTz9/nl8/b1wdNQ1lNc0Mrz/fD2/f7k4+3t7+/v6ezh5Pz1V0dfXkFdUNHfU0dOdnZKfX1OW0REdXNzfHp7cXZzdElE1t/Cyc7L9PH3ycvx/f788/32y9rQ38DNyvP38f7l+Pn8+f3O9PT129TWXXd7Z2Zjb21nZ2R7eWRvaGhsbGJhZmdmZX5lemZhZ2R5TN/H2MH0xVxYR1nU18r2ysn38MjDxcfEx8rl5Pr5+/7AVlxX0VFUxcfUVlVQR3F/f2V6cEJMcHxzfWdgZnh8eXtye2V9cH1lZXJ0dEbL8M3JyPfO0d7MzczNyMPbzsj29vfy/P308v/w9sDH3FBOT09JSnxyfH98fHp6e3thYm9tYW1iYGJvbmxmY2RleXhnZ2d7fnJ1SHdxcURTU9DWUVlHRVfVwPT///D+5+Hh5Ob7ysbW0tTR28fH29jX0cr3z9deXdRSfWVxRk5zZHh0TEhwemdkemZhZHZQRHVJ2vPO2M3P9PDNw97EzcXWQUFWUtnO+eDh+vzk5/j+9t3DwvfH3MLZ0FhBQnVwS0xAX3R/ZWRgYmdnYWdmZGZhZGRnZWdkZ3hFVNdSWlhTWHZ0WFxETlhcUFXWxsb18ff0/+Hi4Obm5+fy8Pn6+uXk+/3y8vz32d/UWENd0t7e0FxGXkhNSnRDSXZwSERbUUdBVFJVwPTz9vbD3MPD0FNd0d3SXVHN9fP7+vj45eTh7eLm5/z28snN3tLAVFBbQUJ2dUl1dXZxS0FZdElNcHJ7ZX9lZ3l/f39yS0t1T01CT1lR08VX2dJZX1NT1lBd3tjBxsnx8fvk5ebk5+Dg4+3u7eDm5Pv7/PDyy97c3dvbwMv1wcL28cvC31NeT3R3QFZaWFxDR1PRx8z39MnJw8DB1FdQWER3cUhaxcn2/PHz8PPy/f3x8vfz+/Hw/vPI0Nfe1V1cXERYVFNc1NNYSEtKdHF1fX97ZmdhYGBjZnp5eH53SlzT0tFcWkNxSU1LS05aXV7Q9/Pl4Ozs75WUl5GWlpaXl5SV6u/t4P/L3ldX38fMz8/29/X2yt7SU1leS3Rzc3F5ZmNiYmxjZmR5enZ1cnNyf3t/c3RH0M/I9/Hz/P775uHn+Pr65uDi7+H6+P7z9vPz/Pj9/P3O2tFfRkp9e2Z4f35/e2ZjbW9paG1gZWdlfnl9d0pzfmV7c0pwS090dVjR1t/L/ubs7uqVlZeQkJGXl5eUlOvp4/nLztvR1NLR2tvcyfXMwcxXWElLcHhlYGJvFRYWFxYWFWtsb21nYWBkZGdkZXFaV8H28fH18fn+8vfz8vP/++X65Ob4//H28v745ebl5fvy88nGxl1Mdnl7emVlZm9rFRUVamhtZHt+fH99fHlzfHl4f395ent+c3x+c09GXcL74Obj7+rr7urp7eLh5P/AxdxZcnF1fHtwQltCQ15QXFhSWU53dHF5ZmBmbhcRFhQXFWN6cHx+eXl9d09BX1JW0sfO9/fM39LYzvTx8/L9ytvf29/Y09fW2PTy9vf5/cBd19raUV5V29VeQnNyc3N7YGBnentnend1WF1cVtDBwtzUXFtZT3dxc398cHB4fXdOR9b2/fH++vrk+v/D29d0f2VkY25sbGBnZH52dElWzvfw/vr58cPWRnNlYWxuaGBnYmJmf3dOREVfUsjl4+3m5Pjx9vbI09HcVF7Tz8bTwNpV3djF9//++vz7//zzzszaxdrE9fXEwcLUU15dXUJBQ3N4fXhyfXdaQV5VwPfO0t7fVFNYWkNxdHZ3ZGd7Znh9SFtHVsL29vP/88rLwcXfUk5Od3x4fH1xdHZxcUPa9/7m5Pn7+//89N5UREdKf3p+f3BIS3V1cU7D8vL/5eDi4OPg5fP1y8Lf297X3NnE2trBzfD/5+3o6urr6Ozh4Of88PHNxd1fUkJJQkFFXkROR1laWEZCdXFNT0BaWFhIdHx9dn1nZ3p5fn94eXJ/cnZ2d17V3/H/+ubl+eX9ysjy9dzWXUl9fHplf3FFxPHw5Ozu6evo7uD6/PTN0FxJf2V7fX1xd0tGTFb18OXm4OLv7+Ps4uPm+v/2zcLE19fS0tXawPX95OTm5uHh4uzj+vDN2dReU0JxfmFmeX95ZGRkYWd7ZmdkZmFmZXt+cXd2Qkp0QklNT09RW9bUW93c2dvQVlTZyfzk+v/+8f388v7z9MLa11NNdnlnZGR7f3ZCRN3A/Of7++Tl5OXl8NNQTXZ/f3NxdkLS2s308Ofj4+6V6u/s7e3s4+fw3lRYREhbXkVfQlPHxsf1/f35//3339NSdXB6YG9rahQXFxVubWNmemdgZnp0QkFXXE9IXFBbUFBVXU9OXlDXwtjaz8Px8vb55fv65efn4+bl5P7y/PDN29BST3d9emd4emBjZX1K1MDO9P/4+ODi7e/h5P3L2FBPQkt3cXB2TkVdVNr0/Ofj7uno6+no7Of8zlJKZWBnYWBtbGxtb29me0BXUN7e0tJcRU54Z2BsbG9sb2JgY2BhYWd4fHF0R1xY0MDc0dHEyM7Lz93XUkTV9fH39M7B2sPAzvzk///9//bBwcL18ffOwtzUUljW0FlCSUlFXFJGW1TWzPfx8/f2+fn9+PfYVVRCd1lQSERVXNPY2djaxd3fwffKyNvS1E92fGFiY29pbm5rFRQXaGNhe0faz/D58fX0wdVQVl9wYWZjZnphZ2dmZHtNUsDB2fb18vvM9PHAx9nGxlBdT05JSEJXUNXdwvbz8PTw8vjg5uTh+fLw9v3xz9rfwcXWXFt0fHtlen97enNN3Pf38Pfn4Pnk4P7K30RIcWVhY29uaG5jZmFkZX5EUU9E0NDAyMTWWXVwcH1kZWRjbWJtZmVleHxyUvf9+fv45eX+8MrfV15SWU5zcmVge3Fzd0FTXFnRwsTexMD08/bKzMfS3M/F3dPQ1Mb/5eHm5uHn4uno6Onj5eXl8d5RRU1JSFhYR9TX1NvfUEVPdHZNR1BdTnZxT9RAcHpnZGZmYWNsaBVqbWNiZnxB2fX/5efh5f/h5vD13FladHx4Z2RkZnlMRVbSx/bl5uPv7u/j4u/j+srRRnBkYWBhY2BncE9EU1Ha8fvk4+/p7OHj4+b69vf98srDysbc39bWyfHw9fH4//zk6JaR6uzu6e37911JREl6bGoUFWhvb2gUamN5cXJzdE1FVll1dHVMSnF9eHxzfXB7ZX9xS3VF1vf/+ufk5+Dg4OPh+PfBwddAdHx8cX1xQVNWX9PO8f/z/eXm4Ob6/cDb1FlYQVhZSVxSU9LN8PP45ODu6+7p6eDk8vXFVVJNc3dMQUZY0sDx/uXh4uLg4uDm5P/3z9FbeGZnYWgVFBYXFxEQF2tpbWFjfk1aVMb2ys3A2txc1UZ1TX5ne3t4f3NMR1vTyvHk5uHs7uzj7uzm+vLxwt9Rc3JxeXtkZ35IQE1Uwf//5e3s7+no7u3g4Ofy9sRSXkNOXkFMRlBeW9DG/f/65OT45+Dg4fvyy95RW0txcnhkYWZkZGR5fUpDQlzRWU5SVFNOc3F6e3lmYmxmZ2FlfHNxcXVOQU5DUtVR0/39xsLMxNPBw1VVUVxAS1rRx8XayPDk+Ofh5OTl5fPJw9rY3VVSWVnV11Tc2NvLzPfk5eXh4eT75OX7+/nwysPcUVhMdXRKT1v08vLy//3w5eDn/v3EX0NLfGZtbhUXFxERFWpqbm9oaWxkc0zD9vb8+Pj+//P1w9BFQnx7Z2FhYGF5cnFKTFLQ2vb1wsnDxtjSyvLOx8bQVEdEX3Rxcn92Xk1H3ML0++Hg6JeU6Ojp4+b6/9NUXUtKRl9PdndMdUfT3sfx8/37+ufh4+Lj5vvI0VZYTHB5YG1sbWV/fnxye3p7fnBzf2Rsb25oaG9tb2JkZ3l3dXZ2dn95cU9JQFTQ3czw8/X++/P2xd/R39FMSnZyc1pX1tnb39nFz9lUX3V2SkZc2cDD9fHz9/L5+fj7/P3//fz45ubm4eHk5OT+9NhCcnxxdndLTk1e0dzT3svA9fDz8cjcVdBaT3VOSntnY2xvb29rFWhobm1gZHFS08PI9fTx+ffF1E1xe2dnY2FgY2d7cURXV1RZUtTd9fD2yPX39/34+Pr69MnLwtlcQkhweWdncVBRwPf1/OXm4eDs4ufl+vvy+Pv998TVUdVUXkNJdXVTwcby5+fh4+Ph7e3j+vTNXHZ5Z2dnZ2BibGxtZ3h8cnNkY2Zkf3hlfnB3SlVeT1NQW1tW1HV6ZHNbxsVfQklTyv7l9dxdUN3WVHV5c0RSUk1/ZXVU1lVTUFzR3tnH1lXawv3n4ezv7Ozt4ODm5Pj1zcv18vv/987N2dRXUtbZ0sDbwsDEzMjNy/TFzPD09vH2zMD0x8DxzcXa2VFFdGVhbWlqFRQWFhQVa2liZ0vDyMj19fT02vX83VJcSFtbdXV1W1xCTF1UU9LeyPPz8/f39s3E9v729/Tc09VAcXJ0S354cnxyQVHY9PX3/Pjm4O3rlOrr6+iUlOnm//XBV9XeUV5V0NnNycveyMrJ9/Ln4+Hk+Pb32kVZUkJPdnNxfmVlYW1ibGhsZX1wQ0dwRlNF0sdXT0lxeH54ZWdmZGdlS9HXV9zEwNvP9M/29/D7+crRV0F2dnFIR9HY19DS2trc1MXPzMjK9v37+vj898rBwfP6/v/z8PPz9MjC1lxc28bA9/3//+Tk5+Hh+v77//fKyffwzdJR1NRFQltEdHllZ3t2fGFib2lub21gZmRkeHRDU97b2d1WUdv1yNtRXURfUElNW1tMdnFydkxc11FTU1LSxdjbw8dU1N/L8ff2xNNcdEhKSE52dELcz/fx9v/65+Dv6ujp7+zi5vzO01FLdnN/cnd2S1pNR11V3sLy5+Hh4eHs7uHk+v7x9MrEUEp5YWBgb25ub2xtbW1iZ2BiY2RxS0N2cHVzcEpOSnR3SkZHXV1ORVFRVtfB28XBwvfN3lFcR0pBQUlyc0dFXFlIdHF3TE9Z3tNSR1TJ/fD8//v7/P/64ePh5P/88cPeV9XXWVtU2cH38PHy9fb12MDEVFZFRFxcQUVBSE9E0MXd3tJRR3RBSkt0fH56ZGBgbWFgYWR7dnVHXlFU2VdU31VXW0t3dn9lZHp9ZGZ4cHVf3NLb0NTNws3w9s3E1N/E2FHXWX1ycndATHRIdkxaVdDW39j08eTm5eXn4Of65OT49MfG1lde1NnU3d/W1ldR0tbc9PP18OTj4+Dm5P7KyszWXUpzemxoFRQWFhcUFRVsYWdyTkNeU8T08fb39fT239BXUNVBS3Z1TU9MWF9WVsfx9MbT01FHdnJxcXZxdUxARkFf09RXV1DYyvTz+fbLx9PBzNvAyPT/+vz8+/rl8PP5ys3A2d/bwcXG39bW0MXEw/by//n6/f7l5fjy+Pzxw1VZWF1GWEpxdnV3dn5gZmdmZGdgZmZjY2NgZ2VkfXFKVs7y8PPxyPfy/fLy/fbx9M3d0t1WRkNSXVHHyfX29/fIy8Da1tJaf3FyfnZzcHZ3dULb8PP28fj65OPt6ZWV6ePl8PDz9dBcUEdGQEhPSFrW19LN9v3l5eXn+vD/+ffw9sj38PfH11JcdXx/eXpgYm1sbWJgZHh8ckhGXt3Yxsj09sfXUFRWUUNwe2FtZmV8SktE1MXFyfT2/f365+bj5vj0wt9fRkFLdXR1S1pX1MD1/P3y8fX19crbVtRXUt3ezPfNxsH3yvX38v71yPf9/fDPw9jX2/TJyMFU3d3axNJXV93R3tLU0VdRUVtxZmJiYmNgZntnZGZ6c3NPfX9CTFzW11JdXF/XzPfY3NDdwM/2zNfBUXVW0FZPdnZ7e3lzd05NTF3cxNDRwc/K8Mz19vXB9PzFVFZ1S13G29LI8fj64+nu4vj/+/z3xdJNfmFubWRnZn5P38/L8f/+5ODj7+zg4OH4xtdbdUl0cHthbRUXFGhpb2dkZ3hydHVJdnlzfU9V3ddfUlZVXNnL3tZcQV5aVVVcWkp0cFvc0trG2MH0yPbyyMTXREJPdHF4YWJhZ2d9dUdd09nTxc7z/+Tj4+Lp6O7s4//B3VFFSFpeRUJcXlHB9vLyysj0zt1TX1l2eHt7e3NDT05Z3cb08/LJxNLdX3V0fGRjYmBva2hrbGlrYmR8SlPcyvfy5Ofk+v3EVFdMfHFPSHRARkJSVNbSxsnOwcD1yt7QRUlcR0NT0lVXx8PBycnf3szfV1nW10ZEUNnYxszK8f7z9v39/fz5+fv4/PXI9/XbV9HXUl/R2Nr3/fn+5+Dh4ODk883fXk59Y2oXERMQFhRrbmFkcl3ezPT98/X08PPKxcXXUVdDQ0VMeXp5cnFIUtbN8/L29PLxyvXB1F1bdXJMQnFwcXVNU8Tz/vnxxc79991Q19HUVd/K9/H/5OHg4Obh5/DA2czHXUhyd0tye35M1VdU3NDb8fD44O/u4OXk+/j//PDG2F9Y1Vl1SnF+f3xwcHh6ZGFkZ2xrFWprbGZ9dVbB9P/74u/v7+3m5f/02tNST3V/ZmBgYWR5S11ZXdfYx/T+/v/99MvDwdFHSXJyfH1+e3dwdtPz+ubi7O/t4u3n+/nz9MDEV9TF2tvYVFPQ28fLwsTEVFTW28/N2tVQUdHMyMrAx8nI9M7YUFdQQkBDdEpze2R4cnJ9fXdKT0Bb197Ozsv33l5PdHB9f3p7eX9JXdPT0cf3+uHi7ef7/drWU0t8Z2BgZ3t/d0lDdEhXxvT08PP28vP+/P/xxMXZ11NfXdXF3t7ayPn9/uT7+f/wzsbA21BBTUpCWFxUVdTfy//5+/ry8/TC21pLfmZjYm1sY2NsaW5jZXJxdFbCwcPz/Pjk5fr+//P1ysLOxdfRX1hdR1lNcHFwfnh/ZWVkfn12Q0Fb1NLbyvz65uDl/MnA2ll0cHJ4ZGR5c3F1RVPVyf7h4+Lv7Obm5PD1w1dbXH9mYGNkfn1wcUHRz/f84ODt4+Hh8vrxyfTc1Ed2fkp0ZWBsYXp7eGRjbW1jYWdkYWZ6cXV9dkpCVvT/8/374eDk8sT18vn1WFhd3VdzcFpddXxydkl3fXZ1QkN0dEpIc3JOWFld3drY08Dx+ufk+PP1zsb3/PTNx9VRXVFYSUJDdUJU28XewszY2dVeUFhOQVlYW11fWUVeU17Tyc7MwMDb01ZRR0p2eWVnYWZnZWVlfnl5dlpd08XaxdzC8PfOwtpWW0F2Skh2fGV8Sl5U3d7ZycvN9Pz98f32zfb3yt1XR3Z3dElIcU9LfHBxdk1MTVpR18f2++T65+T4+f79ycvIzsvT39hSSXB3dXJzSU9OWVjQzfb//fLy9ffKxsHDVnd1dnN5Z2ZhYGZhY2B4fXBAX9De0NHYx8D28vv4/vr89/TLwN1EW0ZNQU1JS0tNdH9+cnx4eHdaVNHU09rC8/n5+vrm5/vl5fzLzMLDwM/b11NYRVpfWFbU1lTTzMbS1dHc3Mn1zcDA39PdV0RPSkhBXtXdzvTPx9vG2sTK9/bKysFRXFtfRU51c3J+f3t+f2VmYGB6fnJ3QNbbwM7y/v///Prk5uT998HfVNXX11FHTUFGQE11d3Nyc3RNXN7e3FZFRltX19VfU9fX09TX3tzZwPf/++Xk5OT4+/j5+/r/9vXOzNnXUERNdHF0cnJ1dnNzdkhe19rLzMv09vXD29FSTE9ZUlNUUkB3fH1wcUp1cnx+fHJ9c3dOTUZUxsz2/PL0wMXBzc3N2tjc39BeV1dTRk5Z19dX111GS05R2MP09/f09PH1wdBXWnd0QkVEXF1aTktAQUfV2dvGz/fx8PL9//Ly+ubh5ub+ztLVXFpZRU10cEtaX1FRUl5EVt/T3dnRWE9BX1xQV1FQWUdOcXlmYGJsbWFnZXxJTUbSy/3k4+Lg5+T6//31xtZfQkxbXV5cT35/c3F2dUxNQUVQVNHf39PS2sTNzMDNxtbX3sbHxcfBz8HGwd/Z31ZdWVtW3cTOytnV0t7awsnD2VdfREBFQUhJRlndyPHz/ffP9fD3zsLMxNHX1FFeRU9yfHh6enp4fnthYGZnenJJWF9cWFffw8nCx9rA9Pby+f/0wPXx9vTOwtFTWEdLdHF4fHB0RllQ1NRVXFfQ19be9Pf19cjH399VUV1cV1fcwMLM0tbEy/H95fr48/T0zMLQR3R9f3xwSUBGTk5EXNRWV9DWV1lYR1heWlbZzczO9crD0lFeQEpzf3tlZGd6fnBMRllX0dvI/Pv78MzD2NLfwcHE3tbUV1FTWkt2cX19cUpGX1/Szc/AzsLG2djG39fR0dVW09/d3MXGxdvb297c39ze0tVUUV9b1NxX1trY2MTHxdZfWFpGVtbSw8fHz/fJwsDXXURAR01aU1lHWF1YW1xfXkZCSnF9e3h7en58cn1xT1tcUt/excnCzs3GzcDBzPf39/H28//+//LJ0l1ZUV1CQ0t1dUpFRkZcW1nU0trAy/XLzcnI0F5HQkZBTUNHRkRER1pZXVBQ0MXO9/Dz9vTJwdjQ1tHX29vQ3NfX2N7d39nR3dbX0NHd09LV1t3VUklxcXx/eGVnZmV+fnhzSHdIX1TX3MPOy/b0ysj09cj19vz9/PLx9vD32dBWQUFHTEl3SEFMdUxARkBMTVpS0NvbxMbDwd7d3dDV1d/c397awcPDzM3CwN7T01RRW0BaRUdESXVEUNba9/L8/vrk+v32xUZyf3pke3h5fnNJRl/W19zDwsHNzNrWXUl2c3N2dU5BUNTd2N7fxs7Pyc7Ext/VVNVW1dHX09lRX0JLTE1HQVxSU9Te2NdRUUxMQVtf0cHI9PT0ysL29vXx/Pj99cbY1tPUW15cW1dW3cbAy/D3wdrcUFhNdXZxdHByd0NBUtVQX0VGX1HW2ML18/T08cnMzMXd0ldZT0hATEpBQk5bV9TT2MzLyvf321NBdn56ZWdne3xzdFLf2MLIxsbKzdrF2NJU1FdWUlTW0sfPzvH//fPz//788vfF1lJAT0BGRFtdUFdZX1JaRV5BWFfXVFfX1UZNX0ZCWFPQzfP6+uXl+PP99szPwdBTTXF/cnd1TERZXFZUVFZdVtdcW1tAdHJ4emV7eXJ2SUFf3tvX1tfU3djDy/D+/fHw8M7d1lZETE1CSEpMT1rX3drCz8jNwM7Aws3E29vT1FRRXkZMRVNdVdje3dNUQEp0c3BydEtF2MXGyMjPwsn09PP+/vn65eTk5f/3wdrdV0RCdXR0cU9DRkd1d3J6ZGRkYWZmZ2V+c3x+cXRD1PT+5efn5fn588DdU0FBW15d0d3HzPTx9vb3w9/X3NBU11RWUFJSR0l1c3Nyf3N3dHZxdHd0S0hCWdXbx8vy8vT09sjaw/fz/OXk5eHj4ebn+/LJ29BWXFlERl5ZXlFfQ3VwdnVxdEl3SklIS093cHJ6fnB1VlVV0FFdUFxFWFHR28bIycL0ytrf2tdWXUFBQFLfxfTy/P31w9dEd3lnYGFhZ31xdnZ1SkpCXNPN8vj4+uX/98/ZVNfdx8LM9c70/f3+/vzLx99RUlBcQU9S0d3F31dbQUFOQlPd2MDK8PbP2150fnp9dkBZR1BRUlheVlHX19bQ1t5VWF1SWF1eQE91d3Z3Ql/Xxc7DxMXf0NBQW0dMSUpNWlxAdn1nZGVlfUpb0cfI8vHNwsj09fX0ycnOwM7x+/r6+//w9ffK9fTLzsPG00ROd3N8cnd2dUZfVNLZ0lZGTElAXFfR2cHF09/R1N/Zw8DPysPM9PL9/uX58dtfT3xnY2B7fXN1Qk9LSUBBQERBQklKSnF9f2dib21menN1WNnO9/L65frk5eX6///2yPH++uHi4eTzz99WWUdGXNDV19FSWk1zc3d3cXJ2QkdAXFVdX1hFVtLG9PH9/fXO9fTKy8LBwd9SUtfZxsLx8vbN011NcH9+cnVPTFpYWl1SUl5HQE9KQ0RHWUF0cXJ5ZHp7eH5zSE9AUdfe9/Py/////vnl5uHh4fr/9NdETXR0TVjX093Y39/Bw9rZ3lNBTU9ER0xPdUxMTkNbWF7dx9jEyPTIw/XC0lVQRUVd0c308fLw8/HJwNlX0cLG2dnd1VFbUVRdQHdyfXl5fXJ8fH9ycXJ8fmVleXlxWFTQ2cD29/TK9Pfw/OTj7eDm5fz33V5DdHd1S0NGQUZFRF/R2sXQV1RdXVxEQEBPSExPTU5OQ1zWxPTy5fr/+Pvz99rR3VbR29jE2NHV1VpBWkRfVtbYxsTPwd3a3lhJcXN9f312dnFISk5MSk5EQkhGU9Tf2sPFxc3G2Nje287y+fn4+vj+/cne1110fHZKdElMQUJMWl5GTkhITFlYW1lERUh0SE5MQ09b18TK/f78+fzy/vfKysnNzdvEwtra29DUX0ZBdXVAWVLe2N/Bw8bVQENKd3F0dnB0SUxNTEFISVpFX9308/Px8/HKy99SV9bS2cPJyMj18fXNwd3WXEReUldTXUFPR1lYQU91Sk1EQE9GQ0h0Tl9eRk9LS0JS0dvAxMTG9fXE3NrNxdPHyPfxyMTF3lRETUNMTljXxc3DzcnA1VNVVNRfR0N3dn18cnNzfHF0d01R39Pa9PXx/ffMwM/18fD8/fL5+//y8vHN2dBU0NDeVltFS3R9eWVnenlwcn1yfXF2dEdR0VRQUNHHzMrPy83P9MHT1tfQ3N7f3sXD9cPHwd/WX0dDT0xAXkVaV9DUQ3VKT0RfQUpCTUtCRUdMd3F3cUtaV9vCwcn95fn3yvDx8P/7+fj//f7998vD2NBR1dza3tVfU9VcTUp2cH1zdHB/cH1ycHVJQ19cXl3bzc/29sr39c3TUl9RXVTVWV/Q3NDQ3tjW1dRRXVdQXl1ZRVbR0kVOQERDQUJKTk90SktNd3l+fHl9T1pV3dLE9fXLxMHw8vD75+fn5+X48vDJ2N/RUlbe3FVSUddWX1xaR1tBTkZeRUVcUFhNQ0BMSEBc1NnFxsr1zcTf1ldU19LT1dfSxsLH397Y0FZcVddTX1hbXVBdXEN2fXhlZWRlcXRKTkxCT3V0dHVbV9bAzMz19cjIwMXIycnIyvH+/P398PH0zMPQVdbWUVZTUNzS1F1FR0B0S0Vf1sbF2N7WUVpBRU9GVt3FxsPDzsPExMb1ys3PzMLGw9hUX1TWVNRSRkNHQUBGXlHW0dVTW0Jwe399cnRNSHJ9fGVkZWdkfExb1MHPy/XIycnw/fLw8fL9/Pzxysr29/X1wt/T2d3R38fE3VBGS3FyfXxLXdba2N3W0VFaQE9NR1fE2NrH2sfY2sPK8fPw9vz5/v7zys739MDdVEx9eXJ+fHNxcXx9f3xzcHNxRdHQ1ldcTUl0c31/eHx1R1bT3MDa1tvC9/D1z8/Dzs7NzPTL9fTAwN9U0tLWxcr0yd9fQXFycUtAU9Pc011SUF9TQXRLW1Tfz/b3zMfF09HYx8HM9fX0/fzxy8rw8vz99d5UVl9ZUdVZT3RxfmV/fX9zd0RfRk91dnJzf3tlZmR+fXRAU1VTUdfW2/f08P78+ufn5/r4/vfMxtZEU11DW1XY0FhfRHZ3dXZD1dLY3dnZ1dHF1l5aQURW0djDwvTN28bF38Xc08P08Pzy8/DNwM/Gxt5WUlNeWNXRVk5xcXxycXZOQFDU0dfRU0BBTEt3cXN7enl5ck9DS09KQ1he0drN8/z55eTk+v309c3ZxdfX0lDX01RWRHdOTHF3WtbaxMTPzsLJ2tLXQUlBRlxX1dzSVNHXVNFUXVTb9fL/+vr//fbIysrDxsXe3tvY1kVOdH1/f3xycndCTEFYQUxNdnNzcXJ4e310SFlV0NrY3Nvf2sDP8fnz//v88vb1y8HZ0dRSUFJGQUpPRklLdnFxd0ZW3dfawsHPyfTKwNFDRl5V38TD3Nbf3NddV1JT2Mvy/OXl8vb19vbxyFRXVFBeRkx2fXx8f3h9dkpCRkVeXFZfQkJNTkhxeH5wdUpLWlPV1VXX3sTD8PPy/vv4/vD09vf1ztJR1tjQWUBYX1pcWk9CSHVDQVNUV9Pe1t719MRUWV9d0NpVX9VTX1NeWVlaXdbXyv/8/fDw8/Hx8vbZ0t/e3llbW09Idn99cX95cnBNQEZeQUxDT3dzfXt4fXBwZXFFQFjVxMHO9/34/OXl+/v98/z5883Mz8La3NZHWFZSVFJaQU92cHd1W11YXVzTzcDd1NbU0dHZ31TR2d/FzdjdxdPX28n1yML09cz29snOzcDbVV5ZdHB3eHl3c3xzc0pJRFdSQF5FSUROdnF9cHN7eHx+ckhG1cHFwMrL8/L+/vPK9PXK8vbO9vf29cPA3lZXVF5V01JfXkVZXtHTXFtTUdbGycbHxs7QU9NUXERbUF5QXV5bXtHbyvbx8fb8//Ly8PH19cXR0lZaSXZ3cXN9c3NzdnZIcX98eHh6eXx+f3JxeX5zc3RPU9zY9/b08Pnl+Pr6/PH38fTKys7BwcPY1FBUW0xFXFNdXEdMRkdCQV9YWdHGzvHw/P3x9cfc19RXVNFU1NVTX1PZ2tvB9c/HyMfGzMbD0tnYVERZXHV0dnZNdUtPTFhBd3dKc39zc3RKdkJ1dHd+eH9xd0RSVMTZz/P9///y8fXBwcTYwszN9vT38cLZ3tNRUlpc11NSUF9ZQkpISUBR0NnK9/X39c7HUVhfUVFSXV1dWV3dwvb3yvH98/3x9vb39ff99sjYV1FaS3NydnN9cEp1cX15e3tlenh7f3l6eXd9eX9yd0xf3dzN9PT/5Ofn+//w9cDJycHJyPfw8vP03tNUWlpcRlfUW1hDdU5KcHRFU9nAyf338fDMwNpUV93R1tlX0dBf0cXM9cPEzsnLyszN9sj08MnA3lJcR3V2dHZxd3F0SE51cnxxcXB2d3B2dHBzfXxyfnl8cUleUFzdyvD+5eXwyMzAwsvw8f34+fn/8vDBXkRTW0VcX1JFQVpCSHV3QVDWwcvO8PPPwsHc09RfW1tRVEdaV9LbwfTNwMf198jw8PDy/fzx8/bP0llFRl9Hd3B9cnByfHt6ZGV+fnllfn96emVwdnx9fXZPV1NSxMz8+uTn+P799crx8vL58vDy9PH10Ft0dnR3d3d0d3V3SkJLW1Xdz/f9++T7+P3098zY3VZRVFtbUFPczcbBxtPd2sfA2trA29Lc3NvfUFJcQF5UX0RGRF9WWFpBSUpKT0t2d3Z+e3h6cnF8e2V/c3B2SVzXxff28fP2w8/1z/X9/Pzz8/3w98PXWUdOSUhOR1pHRkJaXVXe9ff08v758/Dwzd7b0EdPSH1ydnVY0sDPwcvKz/Xy8Pf28fzxy/TC3dvdUFTWV9ZZTUxNQnd/fXJ/c3B/fnpkZWZneHl8dHN5fXN0S0ZUzfzl+/j6/vbw9vfw/f/99vfLwdjTXk1DTHdyc3dLTkl3dUBY1cbJ8PD8+P38+f3wzNnXW3Rxc3BMRdzLzvTOx87LyPXKwc/H3d7S0dZZX1RSVtPUU19FUVRTVkdPR0xLSkhzf3hke35ycXh6Z2BkeX13W9DP9PHy8vPw9PT28P398ffMz/bG19zUV9dYR0xMQUt0TUdb1MXN9/Xz8vT0ys/39VZHTEp0fXJ3TVzWxcD39ffz9v3//f/9zsLF3MXcVtXT3Nrd0dRdWk9JT0h2SEhwc358f2RkZXh5fH96ZGZkZGVwT1zfwPX39vL8/f/5/fj7+fz2/fTAwtxUVNZdQUlCXkxCW0NDWVPT2szIyPTx9vTy9sLFXl9QREZAX1bU18fPzffLyPD39ffB3tFE1dBYXdZd0dhX01ZU01pb09Rc1VlFX3VKcHp/eGR+emdlZGZnZmF6en9Kd1zf3vfx8fvk+uX58fL39ffLzMjAxcPZ39xT0NVf2d7S2tzW3sHAwMbBzsXExNRURU9EQk5EWFlQXlPYw/Tw//n6+/7y9M7H29NSXFZR1dXX09bQV19cWk1MQkpLcXBwfmV6eHp7Z2ZkZ3p7ZXxzcHFxd1hd1PXz8/r65OXy8/H18PbMysvHxt/V0V1XVEdH0dDU2NLGysXPzMz3yPTx9MDa29jeUERWVlZYdVpWUdbay/3yy87E3NRFU9dWRl3b3tJX0NjYw9/cyMbTVNfc1l1BSXB5eGRnZmFjbGFkZmdkZXl7ZXpwSEdUyPzl5OX5/vz09ff38vH18/LKz9vcxsXSVNjG0tPC9vXKytrOwtbVVdZXR1vU115FWkBCTU9LW9jezfnk5fj/9vfI3trGwNjR38fH0FFRVldV0NRXUUZBXFlZREp/eHlnZ2dhY21hZ2R+eXx+fHB0Tlnc2Mzw/f7+//DKz87Mw87L2trF2cdRV9DV01DS39rCzPH9+f7w/Mvewsfe2t7TxM3Q2lVIREBKd0BR08fG9Mr19NjSUlnR2NrHzsL2wFLfVlHV1VfFzt3FxlXFxtBST31keHphYWBjY2FjY2ZmZGFhenZNRdTfz/38//7+zM/39ffO9vTz99/Dxd7J01fdzMXE99rM+//x8fXS1VFeQ0paQFxXUMPVUNZ1SkncW9f33vD78/7OwttWVtbP0MfxzsfR1lpDWEpHVNBW19VQ3tBXV3RPcnJnZ2RvYWZiZmBmZGVkZnRxT9VU2fT+8/D8ycv298PCw8PIxdLURdFeQNTTz8DMwtjK8Pj5+v73/PfM3lBdX9NcV8XfwlVPXlNeW9HS2fb18/HPycDRUlfY2tvL9MXe21dcRVtDXsXRUVLPwFLG31dQWnB5c2ZtYmJgY21tbGJsbGJmeXx0XfXx9fP18fTDzf/+zvf7//H09d1f0NFdxvPLxPX2yMr7/cr6/M7O/lRK1kp9Ul9G0txKV9R/UsFH2v3L/fvK8PDQyPRWx/Hexs7LzVxc0Up10k1N2tRBWsTeX17bXXbQSGd5eG5ofmZpZ2RtZmZtfkp7Wchfy/vdzPPW2vbM8v7Y9/nGzcTW1kFf2FfG5cDd8cnN9uf7z/Dh8djlw3RX03J2xlN3WkV+cV9bxsldyfrTyPtS1vNTVvDb8fvXzfJZU95cX0NV8t9X/l9M8NpEWMHadXdNZGJkbWliYWJuYGcVbXlmckRd1sXwwFTCw0XB98zw+Ofz8eXGVfxRccLNx8vz/dzW+8ta5eTU8ePDW83MdnbcR3TawH1z1ER+1v3WUef4W/PkXEX5z3XO5sHP5cZNw95xSt9OQ8zdXtPaU1vXV3dQzUN2WXJsZX9paXB5FWd1aWhOdWxB9lhb5cxx3/lJdOf+X/vuz87gx0zI9XPV5cPf5P/b+ubF9OPwyefnzfTwR0PG131U9HB+UXVlVtJ2VeTdXv/AdVnKSVn+ydbk4MXN/dZMx9Z32PBdRPbaT9v1TkDNQXbCxWZ3U2NudH5rZHYVFHxtFH1cYHL8003y9nNS5FNN4+ZV5+jWUeHDecn/ddbv9V/j4NTn7tLO7vDV5+RB3vhDc/TYe97+e2TyXWfN5UhX7vR8+fxmTeVEfeD5SOXgdFbgUWTwwXrC/n53/kxh/N9sUfZhcfN6YM1/FEpIF2RdFBZaYhFBUWtJ5n1z4Nxm8OV60e7FWen5e/DjeUvhQnrg+3P561bKlPNS6+Nb4OhEz+5AceRQZvP0bUrwZXzlWHrk5XbO5n12/E1n9PN2yuNXW+D0Sf72e9HmTHHn12Tw92BE83p+8kJh9cVifV1ubUdmF2VmEGB3am/eTGHDymXQ5U915/FG4ONC8+JeRubWZPDzcczmU83p/lfh5lP77NTN7vVE5PR7y/x/SPFxZ8raZ1f5TUbn3n70w2VZ9kxS4P5Z8ubV3uHbTP/9T8HkTUb+X3hQUmd2w0p/y9B5X19iZF9iaHNkFWFzaGl2fmZQ039Y9Fhb9spf+uRTxeTTTPHAfcX/dEbnxkjn4lHK7cDR4/rT5ezAwuHES/PwcET1dH7GUHvR9HVf/ld8wdp/WfNCW+DxWPnnXNrk1F3l8kzO5E9L8l1nTVhhdsF3fc3Rf1rSZHpTZmt8fhVgcBVrfXpjQd56dfJcdP75WvDhV9f/xXTe3nhE/lx3/vlI8eBT2+3/UOfswfXu/lz45UTS51J9w8t8ScZKc8rFed/7cnP+VHrM+nXR5sRC5eVy3+dU1uL2dfzkd1vwdmfcVmdG8HFw/lFgX8ZkZlhkFGRIaxR4Yxd7WGxlyF9lzf9Bz+7CRuT4fNL+fXryw3H05UTQ7P9K8+3aze74X+HvVcbsx0Dl+n9b/HR+99ZgX/t9cPxUc/X3f1v/VEz++kHB41R3881x8uLf3eH/TMX7c3jyUWJb8Wd781htRctlYtFzFnhRFBdNYxBkRG5g9lBnwuR3QO7wdPrgWln6U2Pb+X9K4cZ45ONNx+n2W+3sW/aV9EPi4UD16NZ++PFlWPp3Y8z3YHXk1H/x/3pP4NF7/uF2QOPYZM76f9bsx0nj7UlR4ll6z8Vjc/9xYcrLZ3X8dGxGShVtRm8QZH8Ra0Z6aVzIZHX62nb74UbF78Vy88phdv5cffnnRcDp9dfs7FfK7/bf4+bdyO3z1Of+S1bzdX7YR2ZYz3FC5fV1yP99dfnVcvP7Wtjn2HLHw3ZY/8Re5eVSwvjVc9NCYHfTcnnBX2RVzHx/02VpfHwUFWRqEXp2YnDBS3/OyHTY5sFM/edH1v9JYdfcZ0b5VUjk5tD76Pbf7uHE45XwyePyxuzt1MDn13PaUGJyV31x8vFA9f12dPPQfc38S1Pm9kL29X1F/9RB5OVW9ubWU//cZ0DKc3P1UXtb2XlbznNjdH8UFWEUFmFgaXNRZH3GQ3/a91/F59BC+P99TvRxesnGfdDg29Lj4dv67vf06ebE5ODX0OP9Vf72cETMfWx3cGJJ90FF5v902/5eQfLad8f9WdHk1nfJ9HTW+N1R5f1Dx/tVTfdXZdTBe3ndSmZZ0WV9V3prZGYQFX9vaEpIZkb2Q3X890vZ/kZY+t583cl9SvVUc8T1WfXiwt7t5Mztlfvklf5R+OfHyeHGQf7BekfWZ2JQV3tZ9l9S/cx39ORDd89RfPT1eVr4XmX28nTD5sFX5fF19fpKTPzActfFZn7Kdm1cRG9nS2gWZ2wRYXAUYtB8Z/XOdN7l1XXzzUvBwn1H+99wwfxB1uPxVuDg1/jq+fGV7Mzn4EDf7cdy/PNM0fd3ftFKZVXCdkXk9F764NfF4NV9+P130+dVdefyf9rhQFjtzHjx9nxf80dy99RkXFJhe814b15CaXlKaxV1ZBFgRm9i2VBw8/tZx+dWdfPWf1DQenTxTWfGwE/c51VF5fFf4en9+pbjVuPiXNrm30/6/1jJ+Ut09U1kUNJlUfvUVOf5TtjydEzy0HH29k7d5NZ28/FFwf1YRPPHc9/zTVDIQXffQ2RERWNmQnhofn4UYnNqF31/aXLNQnXzzE735VjS599xyMt13c1KXuXCW/v6Ttznw1bj49nn6cfd4v931/JPWfzZSfTCfV3MRn7S1E398tzz5lNE+8db+eVf2+LLQv78d13+1H3E0ntOVnJ+3VJkRdJ6cN11ZF10YUpEYWJMeG99e2hkRWZn99x/0vN0R/vMTvbwc0LISmVfRH9UykTV8NtA9/zQ8+P28Onh9O/s3MrgzVD7/17a59RC+dp8U810QvbUSd/YdlH5x0bl4dXL4cBS5/VK9PpGTvdfelbdZHbEe2fMU3tH2XZx1XxndnFuYHdjaH56a2dHZWbHQmJR8HRa4fdY5u1H0OFCevTMc8bkRlb82Uf980DN5d7E4ufa/+TezeHNS/HzStX62FPz3Xva+nVO/9B8xclN9OfawO/hwOTkVFT7zXXK8X9yxX9iRXRse0ZmZd9DZt73eEPwQGVTSWJ3RGFhRmVvT1Bnf9hyZ93Yc8ThxNHm+VjHxHpK9XV88fR7UftZQeTAefTi3MPp5fXs5sPm49XT5vVF8/tHXPFJcvVQYV7cZ3zHTXPz5Vn2lfPU4PpL9eLRUfvXfVTYZHPWZm1ESWNN2GVE9kl391FgS1lhZkZhFXBxFGREY2dQemH11HvC48jA6OfW+vBx1uVNTvnWf8zxdlH7W331yXfN4NnD7vPL7OVO9+ZD1uHBcfb1edn7dXPy0WXE8HTW4MPF6u3I5eNT3eDJS/PNenXEZ2PUexR+dmpn1GVkz91zwv9yTvBKZdpYb3JSb2ZXemdWQ2BAw3JG819R4vlD/+V6Rfx9evfUYlP8fFv7UHzJzHH04t3xlOb8lejK5O3C9u3JX/vIZFz9fHz0c23b3mZN+EFF4PDE7ORa/eZBzu1XQubWZ87DYnLWbmzffG7d1mZX8Xtw8XJj2k9pT1kVYkZoa114alLfY1z4dU3i/F/v71zz7E5x+tB+yMF6Uc58SPVxZcZRf87/W/fpzsHs+1Tn/tPg5lf7+nbS5kx359B68vBl2eRF3u/3zuj/Xfv3cMz9SdDzc3vWcW91cmpldmt5zHp6/FF78MV/yvB6X/JkettmbVVxaV3TbF7JY037d1rvylLi2n/9VmzTxGBc/2RC5Hdy/Fp95fRI4uBT4eja+uhXxunXR+zIdPjFZ/f2ZtvxYUT8ZXHgQXDs/Vzu4kH+4XnW4kbS71p9+Xdv2XYVXVhrXshjRP5kcv5+ZvdKadRbFHPUFGPebG3Lf237Um3l92TmlVrkl09W7X155Fp++1xh+d9t9MBv1P9nxOlI0JXGUuvzcO38YOTgcPzsc1fqXE/q9Hzk2nvk5Xnk607/lV/N6HJx4EFw4l9h8VsUW0AWd04RftpueuV5ZORwbeVGaPTea1v1anbzYnLyZHr/fGP8TWD69Xjh4n3x5GFO8GFz5Hpg+khh4N5m+/h79u9D+ZXQ/Zbxx+vLcOPAeOP/ZPz4ZPfnZcfgZHXnemTiUHvp/HHt4HL24GXA73BR7Ut5+XRty0hr2UFqQdhjSsZ7cdFiYVFnZl9+bF5Jb0raenTOcHfxWHHwzlrk597h5HT0/GVQ8XNC9HB09nR393R9y8V2yvxe9eba2frfUvfXWffL0PHK3fn5zv3828n0x8POxNj48sr4/NvN0XVbxXdbxXVEw0B/R3NmdXZ4dnJ8TlN0ddZJdEFydk10d0B1fFhAQdNcQtDQTF7dTlDF1dv88dHJ0X1bQ3NEX3VA3tFX3Vzc9szE9PHDyv339/DAz/HKzcnDz8zd0dLFw8TZwMLaz8/X3sXZwvT1zPD+xNDHxd/NxVPaxlbW10xKR1hAQXR9c3NlYWdne357fHZyc3J7f31/c0VYQl3azdnZ9cz38vb08/7I39vRRUVXQ0xRU1tQX05CW13X3dfS2NjVVlZaUtnO9PL8/P32yv3z+/D1zsnwz/L88PP9+f//8MLOxFldV1pfRUNKWlBNd09wck9NRk10dnF5ZXpnfHd0S0dV1UVPSElJdVnQU15X3tXc1FLezMfTx8/WXkJ0SEZJT0dHRVxR1NPV28H39PHMz/bFUdDUXdbO9Pb55fLy9d7S29vFxdJX2dlQztvb9f398P/By8ZX29j09NbDUdffQ9lXTNRXVlJfQ3h+ZmxraWNhenh4XklzTH15f3NCXtld0sLN8djx//fkzfX008JEWlZaXVZXX0xYWl1FR1/cxlRX20RNWXd9cEpb38v3/v764fXz/vLn8fn29PnG9P7L9/L4//HL3dvRTUFfxlLX03hc0UpyR19OUtdJWkRxeGZnYWJleHxMSVlDSnRHd3VU19ff9MtSwcPU08rE3cDNRkFDcnZyQ0dJW0FAW13TXtDE/fTBzMHfUVlWTkZRXlTI8PT2+PTN9fDw8/zx9Pf12MfT2sHN2PT9x9jHVFza9cXI8Npd2sNSVsXG3cfcXEx1fWZtb29saWBhZGV7e2Fkfnh/WN/Qzvnwz/3/8f34/v748s7bVURDRERCXkdFQUdGdVheXcHTRNdbd3ZAcX53RnXZy8H0//z45uTh6eHj7eHk5/vx98HJ8fXAx9tXUkNaUVhU0FBFWllzdltBSdfa1FjXQnl3c2ZlZWV5cnFIc2d/cmV5dELVwvX38PP888HN9M7DxVRRU1tOdnNydUB8Q0ZZWdHZ0c778dLD1l/RXUVJdlTI1FHGw83BxtXM/v35+Pvm/P/z9NlWw93dxtPU3cXRVs7xx97O2srRQNBR1crd0c7fWUh0eGBgbG5ibWdmYGJiYGhtYGx9X9zz++Tk7eLl5eb4+vLZxsvB2VhwSnR2c3RwZXBJSl9Q08bRVktGQk1IZ2VCTF5R08339sj+5eTn4uHt6OHj7frN8/DQ2lZYX1/UWUZf1lRHWtxHdkVxcFhSVNvMxNvWX1laZWF8ZGR2cmB6fGJjZ2V6fk1T2vLm5P/45PD0+PZHVt1eTUBGfn95e3FzQtFCTtTJxvf79tv1yNFcS3d0cFpCQt7B29/G9/bl5OHh5+Dk5Of78PbOw0dAV1pd01jXwMTU3cTU11RFXF9P0sLByP/C1s10YGFnYmlkZGN4Y2JgaGBpYnJ9V9L44efu7O/g5P/LyPXe391T1ExPSXh9dnpxSkhKV8/b9PDewtBxd318eEpzcdle2fT18PXg5fmU5OqU/pbk5pVFlGfHwWL3Y/VmX0vRR9hDX0Z4wGHGZfNbwPje5NHNRXxKZGV7ZH1kfX19ZXpmYH5kck1Xxcjl/PPizP32dP530M1l+G7BdnrXY8Zn23THUf3M4fL+4dj6ffdgSXFkQWRES0bYWdjO9+Xy4eTm5+zh4OL45crFXkBUdErXc8/SWudy9lFD+m/mctj0VOZb5Nf3fFhjdGh8em1latMWc21pZWhwYHzfc/L88+Ph7ebh//z1yMHbVUVbQE94c3pOeHZZcd5ezvxczeVlydJp/2xg9RbwZn/pau7VzJFDnfDp7uSQ/Ojh7OX61P1IUHd9SGHZfPVKX0taW0xYTNhHydjb3/Hw1tZGTkNgdUAXUH9p9hd/Wxf6F3DJF+tj/+Znk3Tr1cXgevBxxXZS3MRkxmTXT3r/ZOZB4M3l88HnR/t5UkVgx2p9fWzIZUzYd/7D2ezd5u/Wlvb5lMjs517j2X7vb/bLY5FgyvhslWNd5BWXeNjjapVi9MJq7BdGchHxH3F8EPAfzW1nzBT8Yc7EU+fY4//i+OTh0+da9cFOztLSXXNIT2dScHfEcfTXdPVYSPNswF0V4RZeRBHgaFX4b5FA5Zdynt/skXGeTuqXZZ5g4coXlBD8SG3pEeF6fPZq/mbS0V/zS/Hf+Fzy1NbJZs1vSH9uwRRLfmj0F9F1auAU+V9ml2aU29nrfOFwzlRN9kX9RvR0wnNx2WXzcPT0ced95c9742zIcWrhE9Z+FeYQ53VD4nDq0eTl++PC7fjo8O7+9uR05HPG3kLie/jEeOBo8lhs7mrjXWGVa+l0SOFr+mNKe2tyFH9oZmF/YXtNe1ll9klW/VTqweDjUe1Y0eZn+/R+62fL9272YHNXZkvIdnbzf9zSec5OZMx5efVvxlZt7H/F4n2U8MSRQZTuTp7S75VBlkbU+UZTy01E+nrSxW7Xf2/0Yn/mb/33Zpd/0pRo48NglBbQzx3iE37HHuARdMAT7GlZ/W+XfObhfpdp4MdtlhXsx2eWbfjFYfpkcf969Mtm7mTc+mrvb1vzFulpTMMX4hXf2m2UaOL8eJxilO1QnkyU61aVxc/sT+bmeJR7wfgX6Gp49xDraU7gF+hpV+YWl2rz/heWEvVkFvIbyGpnwRbmbsnGeJRl6v/fkmaRWcLubpFm5fZ47hX+d3D2F/pjdfNo7GrC1GvhFedxdORl4mXA1nf0Zv5E/fRM60ri4VSS0ejrWpZU+eRE5tXOU89ed9MV2mdvwhHAfmLtYvT6ZuxeWe9SzuJT0PJtU0UT1W8V2BZyURHcQnvhccftdffkZOfIe+t3X+xj+Ntg53p14HrQ8Hnm9GHtQ3/ibVLnYvv4buJ0augUeOYT5MpolmBck2zo73ef9MOcWf6Wc+rsYJbXZZUUXOQf4XoX6xbF+BCUdGKWa/PnF5N0fpcQ+EMd4R18RxP5alpdZuFk48rJlHaW3EaWbe7JZJBt2+cX72Bs7xHLWGmUa/T2ae9px9Rv52L5X3XubOVxcuMU4EFa6W/s8EnoXeXu1e/n0uPN9Pjf8dPAS1rSbl5iZ0IRx2BwyWnsWXXqSOTnTerL1eBC11F6fWRlaXJnFFBrSkxo5mTN/H2XfdfjZPrQceZZRf/UQ/dCdM1zWfdQVf3+Q/70cfxDZPBYYvZYYPV0ZMp6Zst/evJLQudA9uLf4ez75O3k+e3k9+79derFZfp7YVFobMNvYflmc+149u5g7P1t6lNn42985RF3RBbZa27zFUfIbeJUXZBe+JZy5OVl6VJ973FR+W3SzRbQSGv8Y3TsavHgbu1NfuJq3v5o+UZy42P09GbmZFL7YedT2OB06fzz7FSV3MjuSezTXO162chtw2JtVhFAcmPwYfD00eLU7v7T6U7m333jZk1Ua1VsakUQfn9q9GPU/WTj187gd+fTwfhw5lTPynbgdkb8ZdjXc+XUSuHAWvvUXfR9R9plc9R9QVBkV0tkXXxAcXP5X1jh9/Ti8eTq3+WV1OHpXu3ndfLJfUNWZmdCYmRUYnn7XnHi/3Xn8XL/3mT/0GDCWm5wcxR8fxRFUWPA5k/87lTz4lNU7E9D4k125k52+HN58HRjykNn9Ft7+dty+8d6xMphWPxn3/15z/hmRPlkZed+d+t91pRAzJZF05Zzypdm+O1p/Mpu/3Zu9mFo8G1n/WvC/Gfq8sOXWODte+DdS+dk3NdsWGxjZhVLbnnTY/BOSu9/8v177l5P4nbZ+XDO5UzS4UhX4nHf5n3b+09c4FBl5XFjymd7z3hb237UcmLBYGP4e1zkRvj33ePa5eZd6OXblfX+4VX/3dXJdPRze/BiREJs9WZf5XjmwXLicXT6fFb5SkPIYWfcFWNRaXbbcEX/yULn/Xz6+EzJ8VzX3c1aWfV0XPF3XUfQRGDxT2Hg3nzl0mXc0WRC/09L7cV25slgz8lv2eBl2O5xRpVWfJXSZZfdZerYZO7IYefYYedUZvFaYNBYYNPbcPjOVuTBwsNH/NdH4VxzwnpkfmJnY312YVpUZ9b2fET/UETlwHD4yn7l5Hv96HTb6llT60B67VZm7M9p5NoX9FYXzcNu8vpsw/VtWVFhUM5x3PZO/c5M5l/b7U365lLt8dHuw17j20DlQ3H5cnjGZXrDdHP0RHPIUXPJ0Xbz1dX9fttdbNtkZ9lmQcZkVPl9Ufh/xeV8x/553vhIx/pAxOdX2vpe0v9wXNVy/XBw82Fd0WPSR2fNyUjn/nbkyXr20H7wxHnGwHbJzXDBz3Xy8EH539HmdfzlSuTDRPNWRPZbf8B1dvZ31fN+2PBwU/RZXfjdXv7Vf9dfY3LdZmTJc2HcR2Vc3UpAz9FLw8tXycny9dfl91z5+9nN5VZQ9kh313RjSkZvcVBhQfBEUv7ST9XbS3HL1n3eyl5x3vR9X/5XU/743Pns9cLn/kz34WVF4XR99NBlX9NmSdhmecN/Zs1Ze/XyTNn40l/HXEhNWkR2W89aePTYbs//YET/QHPk8nTy/Uv05XNY50Fx+Md1wMV9dVhweXN2eXl31UVX49BHlfF///hzSfpIe+XeZsrEbV35YVHtc9TryNbtz3b69mP35mDQ7WVO4nlx4WR45n5n5nBj5UZz5kRC4VFx8Ndkx91nxVZt9NRq0dBrUcxjwft//Oh11pVIce5feOL9feDnZf3gbU3kZmH1f2jVTmz0ymP752f85WLU52Za52dS4WZO5GZ99n1a49z1kfrBlMpC7Uxk+Ep65lJn+N5v2sJuWslodfRucuNyZe3LZePnePvKZPjOZv3zYc3/Y13xaU78bkeVcVPpXFj+cUn0ennkT37jVHvj1m3lxG/32GlXx2Hc9XH75Hfm7mbG72ZA7mV24Xdk/UFuUVFqROR7zetC9+pwVux7ZeNEZezQZeNDZufRYuXMYvvcYfrcZufwZ/jmYdPlZkD/e0z2YXL5e2H/eGjIcGbmynHp537t/mT5yGb6+Xzh5Gb25GHf/2ZR9W5H9mlz8Xlw9lh2/Ud6/lll5fZl9Od53PphWPVsRfhw3un1xOr/WuDfZvbYY/b/Y0X0YE73Ylvwbkb4Y33mf3/iW07rQXTpQmfs8GTk82f5+2PI+mp15Gl743B87dB+49Ri+1Rqz/xgVOVhWuNlde5wZO7QYuXCbf35Z/jgZPHsZ0Tocn/tdmXiS2HgdRT00RVQ8mBW4nPE60pC7k1n4Mpm+vxsyv5vw+Bh1u9Id+LYeuXPZufwYPvkb1fgZH3meWTlS2fkX27xxRTR5Wxc7Hzf6XJc7kB44/xn5edj8Odg2OFiT+J6Z+F2b/9RbfzJbPXlb1btYUnuf3LuW0jvXWb7xGnN52DQ7HTX6VBf7F164c9t9/ppd/lsZf9gZOFwYOLBYOf6ZP7mfv3tZNvsYXfsdnPg1HLj22flwGjL8RVF5WxJ52Rw535k41Zt5/Nu9+Rs2eNiU+xhTeh5Ye1dYe3IZu/0bOb7FfTgblbvZlzoZXHpY2LtZWrmRWnmzW7l/2747WL26mRE72R47WVk6EFh7spj4+Rg5+9j/O5vwO5pd+1jZ+B5ZuJNYOLfaOXwFcb7at/maVHiaU6VfXOW2XKVzWHv9G7g/Gr95Wnf5W5K4GBw7GVm7HFo5F5v4MNi4/9h4eZjxOFnT+Fkcuxzeu90beLRY+H9Z+X7bM38FE36a2Tjen7ufHuVXHCX9Hvt+mHy+G3K5mPY7WVelU5K70d4501t90pq2lMXUsBoXeVi3et/ROh2fO9Wce3We+DBY/LwYffjfNbjdHX4f2f4TWPl9WH95GTG5WNF5G16+GZ54Xdg51li581n4Od75vFj5NNp4E9s7XZ37nrT6mHh7mPr8m3uYWfpFdrmEexaYpFgUJQU4/cVlm156xPCwBHrZGSUa+fsbpfQYZRgdettwe1s1fRu3vlhz/pmVf5ncPV/cvxZceT3SPP6cFPmXH713WdZ83dz8VRnRsl+cfvyc13kRWDf/WZi/slsRe/VYeGUQHeU7md17lBq0OtGbf3sfWPl7X144OdhYvr+YWL2wWpt9sBoZufkZXPv4n9+4eFwfODvdGDH50Blzu3TZljlUm1w/MBhfvj6dH725URl3OdQYHn02WZ49v59Z9L+WnrD4vRwR//0fHvf8EV9U/DEdlHl5NFa/OTSf17OUXJ1zslOd9L1VEDF+/DVV8731U9QxEV/cFlfcXfE991e2/fAQ03T2dFd1cdQd0rT3FlJUsRYc0nTxF5Gzf3a0M/xydHXzchWREVWUXV3WlVYd3dGWXRa19FURV9QWHR1WF1QQFHZ0d7C8/7x9v3wx97a0tLW1dzQ3NVV39rHxMHHxVdY1tVedXVCdHN9SltEWFDf09bGwdnf28jIwN7b015d0FRfU9dQWFxXVdVVVF9H19xWUdPa3lFUUVBeXlpAQ0xBXkFZXlfS295VVNRSR09CQVNQXFHU1tLDzM7Nwc3H2NvE3NXS1lJV3dRTVN/Dzsr098/IyMzYVFFCdHR1SU1YWFNSVNDUVFRTWFNUUdReWVNbWFxU09dSUtRV1Nvb0tPdxsfawcDG3sXE1lJX01NAX1xES0pCQnZOX0Z0SUdDdXV1RkFBWFlcV9Hfwcvy//788PfOw8PO3Vzcxd1V3djGzMzLzMLHxNnR1V9MdnF2fHRNWEZJWVVRU1De39/Az8bd3tNWUV3V09bf3dNX1tndU1ldWERQUlTX19DUU1Ld0VZfX11YW1BTU15TUFxER0dJTVlJSkVSWEZEUNHV0Mf1y8v08Mnf2dxSRV/V0NDb2t3FyvDLzPbz88r28czWXVxCdHREREpLQURbU1BaXFJUX11RXkNAQlpdV97b293d3trEVtfd19Df29jDw8TZ0NxQV9VXUl5eUdVaTlpEQHBycXx4fXB2cE5bR01HX0BY3d/D8frl+Pj88/TO3FNfVsfCx8P19vf0z8rKxtrF39Lc1VpJd3NwSUx0dXRPXF1E1M3D2MXEwNPVVVNcV93b29vZ0NXf1FpYUlNeWVzX1VHU1VxTU1NcX1RXUVTXVF1VV9BdQkl3cXFwdkhCTFtaQkZaRFhTxPTM9Pz0x9jH0l5HVNLdzfT28//5+fLz+fD39vH1xNncX3dxSndzfXN3dnZATUZR1dXQV1FfRkZbWVXQ28bZ0NvG1FJU3dnfzcrB38PC3dfQ1FhMWFpCQ15QR09HVkVIRHV8eHt/f3lzQ0NCWlFQW17d2Nr25eX+/fLwzNzY0NfazMjNyvL+9Mry9MXFzMJXW1XXTHVCT0p0TnRwS0F1S1jT2cHJ9/Te1NbR11TTxsDVV9PXXVpYW0VU0tdU1NdQXl1UVEVc1VlPQVTUUlbW39HS3tZeWkRze313cXZGR0t1W1NHRVHX0sf19c3B2tfUVd3O8fD2/fz45OT68Pbz/crNwNrVW1tdWEVfQ3Bzd0x2dnZ1dUhR0VTV1UZFXFXb3tPc0Nbfw8ZaVldd3c/N9cXR2lBYVlLd1VpAdU9OQEdIRl9XXVpSRnVxfH1zSnVCQkFAT1DQ0dPUxPb19PH+8dFS2MDZy//PzvH58PTx//bGzvDB0VdfRHZwTlJfTUBbWXRJW19BRVfU19/J3lfTyMXfzc/aVtDEXk9eVkB0R9fRV1DdVkNCQldXV9zcV1TYT0XTVcRYXc3HVFDWWnd9dUF0cndZRHp2XEFESl3F3crMzFp21lfe/uT28/7l//D74Pzw5eT+9/PbXlRIX1hxT0Nxc310cXNzX0Nye0xVQEpSV3dS9M5Q0/T+zlhVV1NSwcvW8crA5XhK/cNwS/bMwsZweV5GdXBPR9NZddJfcnJZR0t6W9tfW3F2UVff1Udd28LZ3vTK1dHb8PzTwv71yeTl+/zx8MHb9/RdStdU13VJ3V9PXlDRTU9YXFtDXdFWXV5VVkLU2lZexclR11PV1HRG0VFDwlFAW1LbVndcxVRf2PXdWlxUVUhHW1ZR1FZQUURc3Etx11hGTXFMQ3ZyX1l12sXVU1XX1lHC28r++OTk+uHt4Obm5v3w8/PN08bP0EVX00hwTkJ3cU1ZT3VCTlNAdXVydXZzS0zV0tLT29/d11/d1tbZzPHYxMbdxVZRRUBYWNRcW1lRREVMSklyc3V9c09DS3R3dUZGTEV1QEZYVFNTWFPSXVJX39RT2sn0//7/+fvn4+Hk5fj59fTI39/XVtFfVN1TXU5Y0trAVlxe09tcWkBdR2VyT01KTVFcdnVcUElAXd3FwvXK1tTTxNBYXlTQWl5XwNDFwMnDWFVET0lAX0BHQlpJdkp0fX1zSk5xdkxIWlhJdXVGTnJB1t3V9+bn++fs5ubh4+Pj//j39NDV9tHU0tHaSXtZ0V5T3NBaRtddTEx3Q3xnZHFzc0lZQkf0xlldytr1+OPk/vbA9Mzb0MfeT0h/ckHOVVHW0MPYfndRdXN0Vk5yd3tzcEbVTFdEd1dcR1BB1HRQWXx3dHXR+/v54ePl+cb65v/x2/TJ11NfUVZGTMzQQkd2wlFFxc3SxtnaRHdfRE1HXUBCdnJATXx0d159cFlf9/nC/tLN9NxWc9J1dvHQ+9j5xUrwy/3P9MvAWvTaXVhM1091dmV4Q2ZKRnZddlJPfVhxSnhkcnRXw8vy5uf45+b9/vvl/fP3+P39XE1QW9lMd3l/RnZSW0RWRdVBQVhwekJDc1V3RVhATE1WVltZUljB/ufk/OD49PDd0/XS2MnFz8LfUdZUU99Z01FCRnNHQnFIdEx1d050dUtFUltC1kNNV19fXkxITkJdwPb2/vzn5/n+5frk//z2+ufH019W38fS319S1V/T0NnQ29JUWEVYcH5+fnl8SXBzTEpGSEhLdnBE2MfI9PHxx8T1xMDQ0fT0wMXeycjRVMTxUNFXUlRMXkhBcnt5fHl8ZXx0dn11RU10cEZPdHRLcUpD1MbEyv/88+Xn4+Tk4Pv45OTw88HDy8DcxcVcU1RQ1V5K1EBcRl5UXXRJcXBEQUVFXkBSUddZSljT0dLZ9f/wyMjHVN/R1FNd1sXZ1l3U3lFXUVN1TltdT3NPSnF2SnR1S3FzS0tf1F5SWUVaWF9CdHZ2TVDQx/XI/Pj38uTg+uXk5fzx9vHF3dvBzNHW2VFbW19Q1dFT1NjUVlJfSHVJTU5OWkNJRkZIdXFNT0pBVNXc2sbExszB0tLE29LczczBx/T1wMXG01NYR0B1d3R3fXB3cHxkZHx7eXdPdHd2dU5ycHZ2dEhX0sT25eTn4ezp6ezs7OPg4eH/8vf2zsDZ1FdTRU5ISEBBTUdSREdGT3R1TkVaTFtaWUFBWlNFWdDV1FDYwcTfzPTMVdHQRE1e0VJZV9jb09fa3lhJTHV8c3JzcXR2TUlNd3RBR1hdUFJZREZNTnRKdEpCQVjSx8bx+uT75OHn+Pz7+/30/Pz2xPT031bQ2FdaXNdSWlDc0lZX11NcWFNfUk93QUBOS0BFR0JbWVlZUlHW39vMzMTdVVHVUlbT2dLczPXMxdrF109JTHV8e31wfH53dH14cEh3cEtJd3NwcXZ2cHRIQU1c2/T8+eHt7ezu4uHm4OXk5fj4zvPa1t5NWFBIX0txUkRAdVtXQkhHU1dYUldQWkxZX0NCUdVQUlXS2t/Zz8Xbx9jQXEdYR0FHW1bUUtPY39/W1V9ATkNDSnZ2dUlPSVhZWkdOWFhJT0NPcnxwc3xlfXFzdETe8P3l5uHm5+Ph5Prk5Pr65+X/9cn3wdTQ11dfWFDR1llW11BETFlTRUBBTE51dk1GdUlbXlxZUN/Z0NrNwMfR19RcXVbU1tXR3tnU3cPd1lRVUkxJREV1cnJPd3FDXVhLSk5DdH1wcXJ/fnNxc3x8SltY3fL7+/rm4Obm4eDm++Xl5Pj//PTB0tHQ1VBU1F1ZU1NaTU9EQEpDX19DSkVdQU9SU0VBSV1WVtbFxsbZ3cXeUV9YW1taUNHX1tPS3dLT0tVRUVNSXV9fWEJ0dUBbUVfV11tMQEVCdnJzfXh7fnlkZHx1RFHD9vP/++Tn5+Tn5/v55Ofm+v748vX0ycLB2NnY0NZUWVpAdEtDSE1KcXR0TEZNQkVaQEJLQ1dQ08Xaw9vfxN/W1dfQ1NXXxcff2NzQ1ldUXEBeVlJFTU53cn10dU5HX1lETHdKdXFxe3t5en9+f3VNX97az/bw8uXl5uDg4+X/+uDm5fvl/8709MLG2MDF0tdfR0FPTHR1TU9MSkxHWFtSU1hGREFCQkdZ1d/T0dLW1FFQU11cREReUdfewcffUlfTUFhbUN7T1FVWWU5MRF1aRVRcWEZARXV3c395eH96ZGV/d01f1djayff+5eTn5+T45efh4eDm4ebk+P3x8PPx8/HB11BeTHV1S3RyfHNzcXN3dUBId1pZQXVBVtRRVdDQ09HfztjF39HWVNvFxMPCxNZQ0VxFQ0RT1V9DT0hwf313SHB1T0dKd3VCdH18fXN+fXdNT0RR39/cxPfy8/nl5fr4/uTn5+Tn5OX8/f3LyfXw9s/C2tRcWEZKdnZKTUpJQV1aQEdXUk1FU1ddU9feUFBW0FRSXlfUWkVfVVdU3M/Pz8TA01tHRVxSV1TUV15FWUREQktOTUNfXkp1dnZ8eHl9f2V7dE1IT1/RUtHF9vP19/388/365+Hh4eLg4Obk+Pb3/PLLy8bfV0RMSnNwc3ZxcHZLSnZCSUNKTF5cR19fXllcUFTWXF1X3dFU19nd19jMyPXP2d5cRkNSRE1HR0VPQEBNdHRKTU5EUlxLcXZ2cXNxdUl2S15XX1bW3dPQ2Mr0zMvw/PHw+OX7+uTm5vr7+fPJyvfKwcHMxVVaR0dMdE9BQXRJQUVMTlpWXEhE3NxFXlTUWEVfV011T1pYSUdX1tbTxvT1z9jZW0hHUF5AR1PVWlpfUEJ0QFFERl9SS3J2dElyfnF2cXZMU1pFWNPfVlHZytzQzPH29vL65+fm4+3m/vj68vT08PbKz83DVFheWUZCTFpOdnNLQUpKW1NMQtXdWUFF1NRYX1RdQEBS1V9aUNLR1d7z/c3d3lVBT01DS3d0XV9AQ1laTUFd31JCSUJ0c3BIcGRldnVKSUNWVlPTztre2cDOzc/w8vX08OXk5eTh+Pz////x9fDyycbDzd1SWVRdX0VAQEpzdEZDSHVBWVFT1dFWWVfWUkRfUEdYX1xQU1lTV9faz8jA31TUU0Z0T0ZDT1hWW1lZU1ddU93QXUxAQkl0cHx4eXlxd3ZxQF1U1N/HxdPRxMPBxcjMz/X55eX6+vr5//zz9/fx//H0y8ja0FbV09ReR1xEQ0BEQ0h0TUFaREZFWVxZXFJVU0daU1JQXlhaWlbX2NrA2cTF2lRfWURDTkZTVFJTUVXW3NHVXFlGREZPdHNwfXJ9d3ZzdktCXtDDxtnJy87Nyc/H08f19/D45fv7/uX7+f3x9/bOw/fI3FZV1lFHUtFQTFpZW09KQENNT0ZaVFpFWF5bWV1YXFxcUVhBREZfRF3Q3tHd2thURVFURXVGUltHR0XU1FZU0dxcXtdWSnd1S3l6fEp3cENHXF9XxMnF2c33wNzYwdxW0s/x9v365PL8+uT48PP88c7K9/Te1tzQWVHR291RUdLTQ0lAWndyQ9VSQkBRWU5G1dZFTUNDdXB3QURDR9PE397AzlVcVtBSR1bRUUNd0dBdXdXXUlNQ3FlxfHJyemV8dH1/cENBWlzby8Ta9PbI3NDbUljT8PL8+uHj5uTm5vnz9fLzycH3wlNFX1RER1HRXkdYUkZPTURIdUxc1VhHR9VXX1ze3VFeWFhLdU5ZWFlQ2cPM2sHE0VJaVlNYUdRaR1xXU1NYUNFWUVbVRnN5cnx6fEpHT3dDU15R3dvT29/ExtRQWVtbU9j39PLk5ubk5Ofk/cr08fX0zc/bVF1XVFbXwcfVUVFRRURCT3VPWlNaTk1FXFlHW9VST3dJdHJxT0VCXtDGx97Z2NZcXlfV2cXFxNTR0tReR1HT1VNdX09zf3h+e2VwTkxOQlNURFnT0Nbfx97R1dPVVt/By/nl5ePi4Obk5/n08/z3x8HG2FRaXFxZXVPX0F5aUVxAQkFGQUFbWE5IQkBERFvR1lNYWVtPdk9eWVvdwt3V0dxWWERfUdbcxMfZ1tVUXkFCU1ZYQV5FSnZwcHN2dERQU11U0VRDXdPQ11PQ31dd0ddW0ML38/764eHk+/r58fXy/cjCwMfSVd7E2NzSxcXf1FdXW01AW1hCSVhJfXNLT3dOQkdaWlhZQEpxdFpf1NzY2dVR19RSVtnFxcn39sPT0NBTWl/XWUhBQUpzcnN8fHN0QltQVldWXlpaUlBc1N7XXtTa2NnM9//5+ufn5/j88/zw8fb2yNnX09FR1d3R1dfT39ZWVF1GTEZXXUBPQEx3R0VEQEPX3t/d0VBfQ0tCRkZcVFReTEJBTk5FXdHc2cbHxd9WUFNZW1xTQ3R1Qk1OQk9NRFNUUFfc0VZSWVtW11RQWVJHWNbd0t7J8vj7+uX58vb38//+8vfPx8bax8faxMHOw9LY31ZYXFpKdU9bS3NxcXxzcHZKT0RRV9VXR0FMSE5bUNfW0t1XUNLT1t7YzfTPzMvA3lZQUVlbTUp0dnJ2d3d2dE9IR0dHUVJYU1BX1dvZVV1S19bT2Mj39PD45fr/8vbL9c/28/bK9cLF3t/T3tvZxcTa3tvdUUBHR0ZMSE9AdHdATUJZVlNRXlJSXlJJSndKSUNFWERGQUBNQFDU19zN9ffMwNjf1FfVV0ZJTk5CdU5DXltbWl9fXVNSX0dd19BaXVBYTU5HWF3U2szK9//4+PH09fTK9Pf28fb98/H09/b2zs7L98jG0NDVRE1OQnZ8cHR8fnZDR0dBR0JOQE9IcUpCTU1AWFNfX1LU3VTfxsLbwcvx9MbZ2dRGQUBCdXV1cXxwcUpLdEhBWkVbRFNWVtXa01dc1NFaXNrLysj19srw/fz0y/TI2trAz8LHz8PJwcTPz9vezPLwx9zS2ldaR0ZOSE1ETEVd1NDU0VVYTUpxcXN2dXV0cXBPW3V0RdDUV1TCz8HL98nGxcXeXV9cU1lWWF1YTFpSWkxDX1BDTFLRXVpY1VxMS0BIcUZQ393Tx87HyvX29/f28fTDzc/0yM/0/v3x8PLw9ff88MLH3tlfQ09LdHFwcHRLSUFSWVtNR3R8eXNyc3Z1dXBORV1bVMH09cjK8ffOycv0xtnd1l5NTlhcWklAW0J1d3V3dU1GTEZZU1NTVVRZQUFGWkRX38LNzcH08MjP9vL98PHwzdre29bd2cHB28TAzc719ffIwMDC3FZDQkdATURfU1BT0dNUWUV3cXNwcHx9cn54dkp1SF7T2sXNw8zJzcDMys7D2dzXUllVUVBX19dRVl9HTVhYR1pcUlxYXF1HdXZ0dnZ0RF1SUd3FzM3J9/Dy/P77+fXMz8jbxvX0ycv39/X2/fD29PbO21ZHSHV0SnRITU1dUFhPRkFKfX1xc3l5c3Z+fndAQkzXzff19/P/8M/098rG2N/fX0RbXkVMRVVRW1hBdHdNQURIWNXUXFbUUU92TkNHTFnRxN/Ty/DMz/f9/fbw//Hb2treUFbYwsffxM7Jzc/y+Pf28vHFXkFYQnZJXFBX09zbUF1dRHRxcHZ8ZXt4ZWR7fHR3T9fOx9/E8fHYxvHxwsHDz9xT1NDU0d3EwdxVUV1ERU9YW0NZUFhOTkx1fHlzdHB0Q1RUUtDMzsn2//v7/vz588vAy8nCwcrxy8j18/b0/fr+8crO0UV1d0pwcHRaWF9YXERPSkh1cHxydHJ+fnJ5eXJNXlDWyff0y/Tw9/XK9vTN3tDQV1hdVVdUUVFSW0lCdnZxd0hERV1TRkd3dXRLcU1MQV9U3Nzd2/X28v3++f/28fTPwMTBxd7dxcLDxcPI9/Xx8v788c/eV0ZHTkBFXVXU3NFdW0dDTHZxc3N4ZGZhZ2d6cnRJQ17X0NbTxNjCw8739fTN29nGxsTAz8LA3cTfUlxBSHR1S1tfWkt0dHRydkt0dUtBRFpDUtTRxsjw+OX6///98fb198vKys/098j38vL98/P8/fXFUV9FSHd0TE1JS0FDSktMS0p0cXdOcXp6ZXh5fXVHXNbZxcfAzcLAxcfAy8rN2NrR1NvF29vb2FVfWUdCdHFzcHVJWkVCQkFcUkdbVlxEWFBSX1Dd3t7by/P98fXz9s3AwMfY3cXE2sXPz8719/38/f/w9M7c3N9QRF3VU1pFUFFeU19aRkp3cX5mYWFmZGR/Sk1AX1XVVdTT39DbyPT29fTw9MPI9MrKyc3E09Dc1ER0dnByf3J2dnBwd09KdkxYS3F1Q1hBRlXBzfX8+/j//f/y8PDy/PbOy/D09vLw98n08fXH3sXdU0dFW09zcUp1d0paWU5MXVJcWk11cnh6eH1xd0dWVVTZwNvR1NLc2djBwMbAzs7NxdrH39TV0tBUV1ZZSHROSnZxdENGR0FeU1xBR1xHSU1SUllW2sDDwsv09c/Gwcj0w8zOwsHJ9/b29/Py/PLw9/H0yMDa09HRXFhaXFBeXlNZR0FGTktweHtmYWBkeH98cUJHW1pfXVxV2cXA9fH8+/7y8/LwyfXLz8bAzsbdV0F1dnNyf3F2c3JxSnVIdXV2dnd1TUdS1d/O9Pfw8/L09vTw/PLx9/L//P/88/H19MnKycXGw8DdVFRQR0RHREVERUFAR1tAQ0BJcXZxfHx9cXZ1QkZEUFNQU9VV1dPX0N3D9Pb19MnBxsPH2Njd1tPT1VdcRExOTnVJTk5IdUtCQE11T0xKS0xcUVXWwsjMxs70zsHNy/b39fb9/PHy8vH0yvHx9fX39srMydrQ1tJXU1RQU11FT050c3x+fntlZWV7enhydndxTkJaRUFW2dLYzPTOyfLy/PL88PLwyMvz9MPbxdNaRlxYdnZ2Sn18cn14eH54f395c0pzdF/Fx9vI8vf08PL98PL/+/39/vrl+fHw/cjJy8vax8/P3NDQ0ddQXlxVXltGWkh3dEJ3eX5zfWV4fHBzd3d1TEFDXFdfR9TN3tDey8Pay/L0zvfw9cnIzc3H2FBX01VeVFdEQkVNcXJwcX99cnNycnB0SnRMX9HUVNvx9c/08Pb28PLx9vLy+fr+9vn58vby/PTGyMrd1sHH1FdQ1FlYQXR2SXZ8cn9lZHtkZGV8fX9zSnR3TVpdRVDFzMPAwPfz8Mry//Hx8Pz29PTJ3NJRX15cW09CQEJ0dHB+eXZ9eH5yfmV+dnZKWVDV0cbP9vL88P/6+fP9/vHw//r98vn4/fLz9vf0z97Y2dRR1VNYW1xASkpJSUlYQEpxdnJ5eX94fHB9c05BSElFWERW2cTT0trHz/f09fDz8PX8/vTBzMRTVtdQWVpFQE1bQEt0S3FzdnRxcnJ+enl0d3VZ1lJUxMr3yvH9/v3z8/789Mr8/vz/5eXy8P3wz87A3NfWWUdZXk1PRk90T1xCSEBGd3J2cXt7c3N+cE91SE1MSkRV1dDM9MLH9/TO9/3+/fPw8Pb0wNLf015FU1tDTk9KSkxGSUlNd3B1SHB8fn94fXdIR9HZ19v09/Xx//z2/fj//Pnz9/L5/v/6+vL08PTDwcTVU1FeQ01bQndIXkFDUlBERE12fn9/ZWV4e2R8cXFzd3dKQVDT3cHOy/Tz8PH++/z9+fry8PHB1dPZUFDXXUFNQkxLQENwcHRyeXB3e2Flcnhld09OX9Dcx/b09/H8/PL45Pj8+Pv4+uTn5OXl/ff3ydnb11lfXk53QkZLdkJaTExbRUx1dnN9c397fn15eXRBdnFBW0ZQzMrNy/H09fDw8fHz8fbz/fTCxdFZVtZRRV5eQ09FXEdNSHR2dXJ9cXF7enxzfXNORV/U2cfI9/bx//zz8vj68vL48vf85fv++/zKwMzH0N7WXF9fR0BeVERJX1dHTV9ad3B0cH95emdleHt+S0J3SllXXNLPzsLJ9vT19/f28v3z8v72x8HHV1/W3F1b1NVYWlxBTkh2fXNxeXp8c2RneX5lfktGQlfDw8r8+/765Pr75Of4/Pr7/fvn5P/y9sHR0FNGRVlBRVdXW1peQ0tEXEJOR0J2dnRwf3t7e3x2cXZFUkRf2svHxsv2zvX3ycPCxsD28/fL9M/dVddfRllXUl3U1lhNQ093dEh2dnV2fXJxeXtydnBwQ15Q3Mz08f/6+fvk5P77+/HO9/H08P7998vA1lNTREZcVNfSxN9dXlFWWFfXREhDSXN/fmVmZHplfndwcUdUUNXByMfF9PbOz83Z0dvCw/Xy9sj3ytBV29xQ1Njf1NZQT3V2cHN2dHJ8cHJ6en55ZX12c3Rf1dfC8P3+5eTn4OPn5eT49Pf+/PT3/PbC2NZAT0FMTlxVXVDRUEJCX0ZLRF5Od091fXxyfHl8cXBLWVlY18fCwvHz9fXwytzS1l1c1NLfw8jAxsfXW1DWUF7U2dBQUVFaQUZLdUJCdXRId39xSXFySEJJRFXQ0sb09/b65+Xk5f/29Mja2sjLw/T8ztHS0F9aUdfU09nexMPcVdfdUEFFUk1ycnN6ZHh4e3xwcHRER0NR2d/H8fP09fTFVNHZ1VHZzc/K9snYx9pXVcfSXNXYUEBdWXdwSHR8dktyf3Nwf310cX1IWUxO1cfZwvz65ODt5ufg5Pz9/fTJ9PbNxMVVQU1ASUpFXUFA1d/R0tZdVtPVWFzVRnRIT3Z2Tk91SkBGRFJUUtTPysn098Pf29xaRFFZR1Tb0tDE3lZQ19dd1dFWVdzQUlBVWElFU0x1RFpJTkNKdU9PcXZMS3Va1dfb9vn45ebk5eX68c/1y8zMztvQ0VBAQF9FQVjX1NDMzsTEwNvT3dFYQFpGdHd3fHlycn59dEx3SllQ1cTNwc3OzcXH2tBQ1t/T28zNwMfHxt7Y2FRR19FV1VZbREZETHVOSnRKSXVKdXR3d3V0d0hCRlHbyPH+5ebh4ODk5fvz9vT1z8TF1l1HQUl2SnV0QVfX1tHe2NPf39VRUFJYX19ATk5PcXFCR0BGW11U0djFx8bGxMXZ0FNfXF1fVtPd0tBUVNHXUVlTUdXXVdHW1VFW1VBQU1BXUltbRUNOSnFwdnZxdUFFUNjM9/zl5OX6+/7x9/T1y8LG29LWU0VYWkNAUdPcxMHCz8/MxN3R1FNbXF5AdHd3c319cHB2dkpYUlxX3drF2dzd09fU1tTc2MTPz87Cz8PF3tDRV9fdV1HVVl9eRUdDQERCTkZMd3d0cXBwcHN8dVtd18zK9/zk5ubm4eT4/vD08fTG3tzUWEdGSnN3Tk1aU1VW1tLc2djbVlJUXF5XUEFNRUNISUVHQF1WVdLY39DbxdZT1tFHRltbR1zS19bc09TX1lZT1VRW1d/e19na0VfR31Fd1VVQX1pOS3VzfHx8fnZEXFLXxs3I8f7//fz/9vT3ysj1z9rax9JXUFFeQVzX1tzaxsHY2cXa3tRZWlJGSExKcXx9cXBxTkBHXlbT2NzY2tDVVdfQ11BR1VRU3cPIxcTDxN3T0tFXUFNXV1VVXVJeQEFGQUJMQ0h0Skl0cHFwcUla1dvOyvXy+Pn55OT+/PLzyszLwN/Q0FdbW0FJSEpMQVZWU9fS3NfS2NBTXlJQUllbWk9LT01FWVLU39jawsPBxtrc1tRQXlhBTnVPRkVcV1VWU9HQ1VTVV1DV2drZxMPF0dVV19dXVlJZR0hITnRwc3ZLSUdU0tPYwcn09vDx9PX0ysPZ3tjc1NDS09fW111cVtXcxMLGxMnMxdjd1FJTUkZCQnVzcHd0TkdFWlPX1NbY2dVU19VTUFVQWVlBR1DX1NXexd7azMXU3N1fVtnY1tHe0VNSUFhYXENKSEtxc0pLcXZERVrS29LG9/H38/7y8P3y9ffxx9za3lZeVVVFRFxCS1pFTV7d0VHdx9ZX0tNeVtBQWltbTE1RVVPWxcXGyMPewM7bV1FXQUxaQXRJTUh1TUZGXdHQVNTdUV1WU13Sz8PbwsvBxcXfVdDeU0BHRkJMQUBLTl5cXFBV1tjAxNjFws3FwMDYwMbd1NbQ0NLd2NZXVFVRUlTcwM3NyMv1z9/c119ZWUJ3d0tOTUBbWlzVVFTVVdDU1VddX1XRUVFQU1HU1FHV2MPHxcLb3dRdWkdT1dXQ0t7d2MRUWFtFTXR3dndOQkxCXlHU0tnc2c31y83J9PT39cjLyc/Z0NNUV9HTVl5TXEdDSXVDXFxf18XDxsDA2d3f01VWU1tY19nV1MTA2dDc3t7YVV5eWUFPR0VCTkNEQ05DWllR1VBX0NFeWlxcVtnGwc31y8n29cTa2VFDQ1pDQkRbT01YRFpRVl1X2d1R1NrTVdDd0sXD3NDaxN/ayc7T1t1VUlldV9Pb3sTP9M/GztrVV1FYQ0FCTkNfWEBQV0RGXFdX11VcXlZXW1/WU13U0FZd3Nre2MXc197RR0FcWUZR2dnfxcfS3d5UXF5AcXNOTUpIX15bV1Zd18fY08bMxMXKyMbAw8Xbxt/W09rSVt3YV1hbTXF3TklOUdBX3sjOxsr3xt/Z0FJU09RR0trT0cXZUFTc1V1RUUdNRU91QkZ0dEJPS0VWUVTW1lRWVF9c19zW3czOyfXxysP1z9PX0FpIRERISEVbTk9ATUNQV15d1VVcUt7d1NvB39PBw8bNw9jbwMfWV1BbRVJRVN7a29jHz8DAzdrVU1dZRFxbQEdRX01ZUVlbV1dfV9RTWFFTW17UUUZf1FRW3dvd3sXdU1BWWFtRVVfT2dzcxdvR1tNXRkdeRE9NRkFFWEdaX15dVdzc0d3ExcTNzMPAxN7Q39nT0dLX1NLTUF5ZR01CX1lbVNDR0MTMxsXa2NbT2NPX0NTV1tzT1dfdVV5WVl5EWltZX1lbQE1NdUlHQUBbVtXU1dbX1NzS09jZ0t3Gw8PPycPZxNlWUVFHSEJaTEhDREJMWV5aXV9EWdLZ3sDK2FHcxtPW2tnX0t7c38XfUlfZ3NHc3FVX3d/Sxc3cU9PZUVDXUVtFWlpfVFJBUdxVUtTVWFpSVFBV0F9AXFJGW1VSWlbZ09Te2FfSzN9V3dxRXNDfVlXY1FvU011FXkFLTFlBSFhfT1vXVl9V0NbeyPXJ9/bF1MbB1lTXUVtR01VX09VHU9hUWlfQX13f2dXcwtZT2sVXVcXcUtXb31XZxdfSx9RZV9VFW9DXR0VVRXRARkpMREBHVN3VV9vH3dvM31fd01xT3t5Q0szS0c/DUF1cQ0JFWkt1XF1ORFdEQl7VVNDL98DD9cfdwdheWVRQXtTdVVTHwtzYxtnR0dddUd7cV9XSVNXd1l1d1lFe1t1X18bG0dLe11BRVltX2VFGWlNFQl5SQUJRU1tW1lDUwsze3MfeUFBQRlnX1FJUxMfY2tvVWF5ETkJATERcWU1HUVJd0drAyvP2zc71w9vf1VtFX0dBXlBSUdna1NzD3FJQ11BQ0dZT1MTcVNLT1t/c3dDZzsHfxNvX1NbVXF1QU1ZRXUZaX09MRUdERUVDRl1V19HZ2dDc3NZXV1RW1d/f3M/IxtjExNRRXE1ITk1MTUBMTENHXlzSwcPPzcnNwMLH3dfUUlhaRkVW1dXf3tjH3NFUUtTW1NVQ1t3Q0NzQ0d/R3d3V0Nvf1tTR1lddU1JT19ZVVFZXV1xfXVhfUVtaWEVaXNXR1dPZ0VfVV11WVVdR1dzY3sXY2dnd1VlaRUNCRFpAQEVFR1tS1MfOzMDOycPDwdrc0dReQURER1hSUFBV1tRQVlRQ0NnR0dja39nHwNrbxNHV3d/S0t3UV1TUVltW1VFV11ZZX11bWlJTWVhSRENbR0RfUlRX1N3W0cXe0dPc0NTc29jYwNnW0tFYRVhbRkRZRk9AQE9DUldX38Xf08XAxcXMxNPc01BeU1NZX1JdXFZVXFbQ3dfR2d3Q2cXe29rT1tDS1NTf3dbT0VBTUF1bU9HW1dDTU1BUUF1cUF1bUlNEQ0RBQFhTU1BU0dTQxNvT39zX0N3d3dBVUl5TUFleUF1T1VFfW0VbQ1tU1dbc39Dd2MXHx8Xc0NzVW1lfRURbWFlZXVBTU9TW1tzY2drDwMHH2t3T393X3NrT1tPWVlBXVFdX1FBcU15fUlZRXVZRUlxdWUBCTUhCXVFQ0d/excbDwcHE2dnaxNzQ111ZWFNSWl5eRVpeXkVaWERbXFJT1dRWV9TS2cbCwcfb39bUVFNeWlldUVdXVNXW0N3bxd7Y29LQ3Nrf3NnS0NLS0NDWVFdQXF9RVVdSXVFXVdfW1dXR3dbRVV5EQ0xPRl5cUVdWVdzHx8fDxNjY39PUVV1FRlpFWF5fX1xU19VVVFxbUVdSVtPQVNHc0t7Dw9jZ3NFXXV9GRkVbWkVTUVNRVFXW2Njcx8Tf28HG2tvF29/f39PbwdLUVVRcWF5bQENYRVvVVVfQ29xU19BQRkFNdUZTU9TS3t3Eyc7FwsvE2MbZ0NZUXkJARkxPWFtBUlVdWV5eR0VcR0JW11xR0NLewc3Nx8fY3d/cVlHQ1VxcVlRX1NNRXddXXtXSV1TT01XU2NNU38Xd3MHfV1ZUVl1WVV5YV1BcVd3c2cPC297Z11lbWkxJQUVf1dfU3MHA3tvDxNLZ2dbVUUVNTkxJT1/UUlHd1FPU1lJdVFFaXNLVXdPd193Bx8TE29NU1FReXFRfRFxWXllR1VNW39dU39JU0dzX1tvH2NnAwNrBx9DV1lRbWlFdQVlRRERX1VbdwdvfxttRXlFFTVxXU1XZ3NbewMfZwsne3MTRXlJTR0lCQU9AXEVHVlVeXdBRW19RWFpRVF9R3NDSzvTOw83B3NDQUFLQ11heVFlDWlJYXtHcV9TXWkZWVlPV39jd2Mba3sbH19HZ11ZUVFlFU1FEXtHU0MLPx8PH3NVSXFpbVNVcX1ZTUdfY28XPwtPX01hGXVxERVxdWFhaRlpXUVlS0ddfXVdcWFJRU1ffxcD39MbEx9nVU1BQXVFcQUNCTEJEUlHX2MTUWFJcXFbX0d7Hx9nZxMbExsHd1t3Z0VJfWUVbXkVF197T0tva3tzdV1xdUVBSUFhFUNPQ0s31zsLD3FBV1F1fU1JFW1tPdExFQkBcU15WVVlGXVFbXNfWVMf3ycPLyMTF29RSVdNdWlJbTEVWWFjU3VZS11xMWFRZWNPZ0dTd1VfEycXayMPT2NhQW1bVW0XVVF/extHU28Lf3drVWFTRW0RTXUZT0NHez/XS1drdUdHSXVhV1UVAQUp3QVhNRdTVX15cRUZTVVhS3tPRxM/a28vM0tLe1V/VVVpbVVdHWVFfX1VUWlvUUVpcVllZ09JRV9PW18fKz831zt3T0lZTVFRdUNzTUFTUVtfGxdLT3FRaXFBYX9ZRRVDQ0tzEx9HXx9vV0NNWVlddQUZfR0pMXlpe1VBFRF1TX1LWVVfe01TW39rHxdnQ19LRXVJXU1JVUVBWVlBZWFJTUNdQWl1VVFdUVFZV3d/TxMnD2sXZ11XR0VFW0NBV19VeXlXT1NDa3tbQ0VNQ0NBQUdbW0dPc0t3F2tPQ0tdQVVVEQ0VHRkVHTENdWU1GWFpGXlNS19nT19bR1dbDwNzHz9vW3trR0tvWXlfYVFpdW01HU11BWl1EWlBQW1LQVFbdx8XEzs/c2MLE3tnH2sXD3NTS0ldR19RQ1ddcRVlSWF1WX1lX0tVW097S3sXTV9Lb1lfQVFxR1FNZVNReWlhaQERcRUNf11FdV15BW1dWU9De3NPe1lbd2NZW0d3R3NjQVlXWVFFWUF5dVV1bV9VRVdbX0NrF0dfc3VfQ2dbU2MXd0NDUUdTfVVfZ3VbU3dZX0NlUU9Le1t3Z1tfexdJX1tdfUFRZRVhEQ0dYWV9WUEFCRUVEWVhYUFdVU1DWUFpW1tTdxNvc3d7d38PbVdDa39HS3NRdXl9HQVtaQ0dYWVLV1FbX3tncxMXe28bE28TGxd7f39HW0NbV0dPT0tFXX1ZXW0VQVlJTVlVV0tPR3d3T1dTQ1VFXVdRWUVJSV1BfX1FWX11WU1NfWFhZW1pYXllERFpcUlFQUNTW093T28Tb2trFwcfb39LUVFNHRVpbXVLV1tTd2Nnc3dPe29jd3NnY0FFUVFDV1FfV3N7d3NjS1tLS1ldUV9fS1lfX3t7X0Njd1dRVX15XV11TUlpbX0ZPQURFWFfUXVHXXUFEXlpYUlJYUtPUUNfUUlTc3d3aw9rfxsfcxc7F1NfRU1tHTXVIRERf1NDV09xUVN7ExcbMw8TAxtdTVFRdVtbWVdzE39Dc3dHc3FZcVFReW1BQUlfR0NPe3tVQUFxS1N3T1tPQVl9FQUFcUlzV3ddWUFlDQUVaRVpbWllcWEdeUF1SVNVUVdLR19zExcTNw8XGxtJQXFxYWF1dXdbS1dXUU1DR3tvY2MfZ0FRfXFdWU9Tc3NLc29vfxMHc2sTT3NjXXFLX0NbR3t/Ywd1XVFJaWVJXX1lRX05KS3VMWlpZU9VRW0RFQVhSXFNVVFBRV1Jd1NzXV93d19bWVlHX2d7axtvbwdtVX1JbQkFfXFlU11JfV1XU0tje3sbB3NPUV9Tf39Df2t7W1tzS0dnZ0tLd1lRQXUFFVNVW0N7fxcHZ0N3c1VDU1lbV1lNbW1lZXFBdXFbVWUNAQE1BXl5eUlFaR15YWFfW1VXQ3dZWVlBQ19PT2cfBwcHG2NDT0VNZXl9YXV9EWFFTX1fWVNTQV15eXVNU3N/f3sfb0N3ExtrHwMHGzMPd0NFX1Nzc0N/F2dzFxN/T01FfXVNdW0VATUFYW1tZWVpZXkRNRFlaWlPXV1XXVlDU0dHS3tzc2NvRUlxSXFJU1dPe3tdX0dFWVNVTW19cWkZYWV1V0FRR1tPW1NVWUNXS3djDzcfa2t7d2tvR1NLY2dne1F1SU1NX0dDS2dzX0MXG297S0NDQ1ldX11RW1NRQWVxfQUBBR1hSXVlcVFRbW11fWVNWUlXQ3NPR0VBf1dDV1N/e0t3S0dHf3FRX0ddVVFBZWllTXF5SXlhfWUBDXlJR1t/F2sLB3tvF29jb2Nzd38Tb397f3d/d1t3F2t3S393Q2d/X0dzXUlJdXF1V1F1dXEVAQEFJSEVTXdfY01TUV15T09NQUNbR0N7Z0VVXVlBW09RV0VVfXlJQUVZRU1fT1lBXUVxdVtVXXV1ZRUVbWFPc39Pay8vAwMbb2MPa1tPRVV9TVV9ZVdBWVN/S19LS19Xf2dbcx9rZ2tjR0d/Y3dLf1lFQXkxJR0ZDRFdUV9BUXkZGQURSXUZGUlBYXdRVUlZUVdDE29fS2dbX29jVV9LS1t7Y0dfc1F5TUVlOTk9xdkFZXtHH2sXMzd/fwMXX3drRVFVQW1lWV1bd2tPfwsHc3MXZ3d7Z1tHF3dTS0FNS1tFXVNZSREdHT0JSU13Wx9rW3dxQWF9HTEFETUxZWUBY1NVdUNVX1dDTVVTQ0VXT01RU0t3W3Mba0t/cVlZWWk9CRkNAX9fR3s3OwsDF0tPS1VxdVF1GQERCRlNX19/a2NnGwdvYwsDb28bBx8PG29jE39HS3NVRVVNbR0VaQEReXlLW115FR01KdXV2dkpIdU1bWFDT3t/f28Tf39re3cXE3d3Z2d/bx9jZxN9UVdZTW0ZPdHZ1Tk9HVdLdwcLY3dzdVFfVUVxWUVtfVVdX0sXExcfDxMXCwsfBwNnZx8Tf3NvSUdTWU1fS1VBWUV9FWV5FWNXUVdDXXEZDTHdzd3ZwdU9LQ1JSXNXc0FXS3FXU2N/cxMDb2sPD39jDxNPd3FTV0VFaW19DS0ZFQV/c29nExtzQ0FFHWVFZR15SWV3X09HFz8HFzcPFx8rMx8zLwsHIwdPbxVVQ1tDV19zWUFVVWUZYWkZbV1BfU1NBSU93cnZ1cXFPQUNZVFdR0NzW0NjY39jF2dvMysnDw8Xd2cXS1dHWVlFWXkdGQ0tLR15R0t3W1tzf1lFcWEZaXF9S1NbX097Ex8n1wsHPyMnKyMHDzszGxdjS1VdWUNXR0tLW11dRVlNYRFteX11dXFFRXkBPSXR1d3Z1SExEX11cUNVWU1dUVdDd3d/Ew8jOx9rc09PW1tbS09bUVlNQU1lEW1pFVtTV0Nnf0NVVUlleRUBFX1FX0N/c2MDNwcHOzMLOyczO98jHx8XQ0N3RVdfT1tHb3tbR39RfUl1aRkZBQkVfQUlDQXV0T0p2dUlOQ1xcWlDUXlhU0NfQ2NvEyPXMwM/N3NjE3NPc39XV3dRSUFREQllbQlhWUlbf2VdT1V1GRFlFWtXVVtLE2dPaz9rFyvXJ9/HKzvbO3NzY1F9R1VBV3NHX2MXQVNHVWkRYQU5GW0BBX0RITUZLd0NHSkJZWkVSUEZGXlhGU9dRVNjH3sXIz8fBzMTawtrW3dnVV9vG3dPdV0VaWkJaV1BT1t7Q1dVWW1pZQUdSVlxX2dzX09vY3MbBx870y8/IzN7Zxt/X0tNTU9bW0dvG2N/e0V1bRE9LQEZMQkRDSElJdHVAQHVPWkdGXl5HRFlaWlbQ19PGxtnBy87Mzs7CzvXB3dLTVVTd3dHW119HWlpCR1BdW1HWVlJXXUdZUl5bVlRSVN/Q1t3e2tjBzMn19/XPzMzE2tvd1dXVUl9dUVbQ0tfW0FRZW0RBQFpYWkRZWk1MTUNDRFlFRlteX1lZQEZEQ0NFXF1W09jZxcbDzcHGwcHa0tDWVFXR2d/f2d/UUF1QUFHV1dDR1tVVVlJQVl1ZWFxZWlHUVVfQ3N/f3NvHzMHBws7AxMPMxN7S1lNeXV1R1tLQ3N3XUFxGTUdEQ01FRE1MQEBARkBDTU1PSUBEQU9BXkRaUddX1tvZ2cbMwszPzMLMwtrT0NRTVtLe0dHc01BQV9VX1VfV11VSUlVdWVBVXV5WV15cVNdU1NjFxMbNwMj0z8PKzN3fxttV0d7WXVBRXFxUVFRXU1tHXlpDRFJbQFhSRkBZXFtYUV9GQ0JMQUBMTkdZR1pU11fTxcDYwc3DxsTH2dve11XUVlPV29/S2dtVU1TWVVTQ0NHU0NTQ01RQVVZbW1fVXVHS0tfd29jf2djExsfDws7Y3cXB2dLe2tZcVtRUU1FQUVxYR1pEQ0xEW0FaUlFeUFVVX1leREh0dXVKdUhGWVpaUtPW1N7AxdjGwMbFxsHCxNnT0tBU1dzb3tnHxdfV1tdcU9TR1dXU1NPR11TVXlpcVlJdUNbRV9Df3NPex83AwszJwNzSxcDf28bE09VXV1xbWkVBSUpPQ0lOTUdFXlPVVl3X01RfXF9YTU9NQ09MQVlbQV/W09Tc2sHe3djF39/YxcXS0t7cV1fTxNvc2sXR1dVV1FTT2MXb2drA2NbW1lJFXVdWXFHU1VJQVNTU1dTQ2Nnf2MTe0d/D29zfxdrS19HQV1JSUlpMTEZNdU5fVFFU3sXXVdbVWkNGRUJ1dUBCdHVPREFbV9bV0NjF2NDdxsbbxMPMxtvFwNjR38TF09De29RSUNRVUdXH2dDYwN5SU9VVRERTVVxeVtZUUNDExdPSx8LS1sXB3N7Bw9jYwcLa09PS0VNbWURIdEtLd3NLW1tZVdjb3tJVV1FeW1pYTUlDQHV3TVtbWVXW0NPZ3N3f3Nza3tHT2sfT1t7H0tLc3tTR1NzTVlbT293QwvTA2cTBVlhR0FNAWdVRREZf1FNc0cfc1NLH1lpW2tvV2M/G3cXPwd3awcfSUVJTXkxJQk9KSkZcXdTbwNtVU1lfRUJOQUJ3cXV0cnBGWUBG1d7VU9Ha3t3B9cjY387J0NbDyN7R28bW1djF1VLX3dFW0drF3t/XVF9bXl9eWV9eWkFBR1zX3N/bzMDc19/e1tPIy8fb9fXb0cfO39TS31NBR1NAcXdDQnd1WFBbU9zSWkJeUUZCUldHSEhOSHRMW1tbUNTVV1TU193EwsTHwsfd0NvH3trC2VfV2t5XUdLSVlbazcTew87cUNHb1FlQ0FdaWFNHdExTUVhT3d5TX1TT1NbByMLazfTN2dja2sTa3N3f01VQU19GRllcWURc1lZZWFJZQE9ERnV0QnR4f0tOdkpSUEFEVNdSXdjOx9/P8PXHxM/N3d7Mw9PRxNhVVdLQVVXU1tbT0NVUXVxX1NfU11FcXVtHW1JQWV/W0NfTxN/X2MvJw8vw9czK9czb38HFUV/U0VtORF5AS17XX0JeV1lJRlJdWV5SXFlERkZPSkNaREBEX15bXlJdUdHf3NjZ39jF3lRV2trX0drfVVfQ01Bd08bb1tLDxtVV2tvR08ba1FDT01lHXFBSWVtfWkFCRFhFXNLGx8bI9PT09c7CwsLHx8fb09Lc1V1W0dVTVtDXXkVfWEFDWF1AS09Bd3xzSnV0T1tEQVteX15fV9zbxMLJysrKysvMyMvPwMHY3NHQ1V1X1VBS1VVTXllaREVQ19fX1dLRUllRV1BS1dVSX1ZRWFhR1tLDyPXK9fTLyMjLycDY2NzTVlJcQUJEUl5eVNFQX11QXF9QUF9eXVxcR0NDRlpeU1BcW1lHQkNZUlbU0t/c2dzS09LR3NrGxMXE2dFVVVXQ11XU393X0N7SV9HY2tLYw8TWVlZSXl9WUllEWkdMdEpCT0BT3NvGzsvDw8/LysrLzMDH29HX1tVWVNfW09DRV1FdXVLVUkVaXkRIS3V2cHdLTk9EW1pGTE1EWVnQ2MXFzcjAxcz0zsn09/XLzcbS1NZV1FdTXVFcWkVeXl9SV1dV3dzS1dVcXVFUXVNUUFpGWkZBWFdV38HK9PTKxsPOy83IyMHd01FFRF5ETUdbWV9WUF1fVldRVF1fUVReR0BDTkJBQENYVl5aRVpGRV9TXdfd2d3R1NXYxdvbw8LAxsHY0tjY09fQ0dbU1FBX0N/e2drZ2sDD3tbU1FBQUl9fWUFKd3Zxd05DR1Lc28TGwMPMyMjK9Pb1w8XdVFdUUF5dVdfR0dbU1FZTV1FZRFxeQEpJdXZzcHF3dUtOQkBHX1NWVNPa297bxcfAzsrJysr1zsjB29ra09TR0NVQUV1YWF1SV1BU0d/f19Hc3VFV3dNU1NRSQE1GQkBDW1LX0N7HzcfAyMjCzcrJx97fVl1YRU9CW0RaXVRdUtXWUFfU0NfUVVNdXltBQEh1SkJLd09YRE9bXVxaUVVVVtHZxMbax83M28TDw9nYxdjR2MHb0tbRV1VU1VTc2NjawsbS0t3XXVBQX0ZBT0lOSndIQE1GU9PR38L0yMv28fXI9crP2Njd0FBZWVFYRFJXUlhQUV9bUlJZWltGQENCQ0h1d3dxdHRIQ1tbU1RX1tPT0MTGwMP0y8LO9cvDzcLD2d3e2dbR1tRQX19eXF5Q1t7T2MDC38XA2tLX11BYRFlaQU1GRkFGXlHV0dvIysrL9MzF29rS0dVXXFheR0dHWEVeU1ZR1dHf3dHT0NFUV1JTWkdGTXdxdHV0d05CQExFWVtEXNTR0dzAw8bEycvMxs/OwcTMy8Db2cfZ3NHW11VU0dLc3tjGxNnQ39zWXVtATUp1T09LdUNEWkdS0dzZz/Dy8fbx9M3Hw8HcVlTRVlhcUVNZWVdQXlpTV1NaWFNdWkRaRUFJTEt3cXRLTE9MRF5YR19WVl1V2MfawvX1zcL19MzEw83B38XG2dTU39NTX1TXUFLd2tzR28bY0t/F3lZYXllASE1AQ0xBRVtZUtbS2cfI9/TJw8zA3dTT0ldSUVRQXlfR11XU0tBVVNzf0VZV1FJEXlFbTExBT3FxS0txcUlATEpPRkZBWFTQ3NjDycjOzsnPzczLz8/OzsLF2Nva3VTU0tJU1dvG2NPY2tNQVNFRREBaRU51SU91dENYRERR39/ezPHwysr3yMXS29rc0NPf09dU09/WVNXR1FFXV1NfXlJcWEZFRE5ISEl1cXdLSHd0RFlET1tTX15Xxs3Nz/fxzs3IycHbw83Bxdva0NfQ09RdUFdQXVPR39zQ0t7Q11XR01BcXFNYQUJBRUNNR1lTUlTc29vB9cvCxdjY1tHS1tRU11RQUlTd0dbQ3tvR0N3f11ZVV1FfXVNZRUJJT0lKdHR2dUt0dHRIT0hAXtfd28PPysPBw8zLwsPI98vBzMLC2t7Y3NzX1dHQ3d3f0NHSV1JQVVdYWFJXWExDQ0NKdU9CRkRQ0sXGwMrLysvDx9vB293f28fRVNXX1lBR1NDRUVZXVF1aWFlbQUNHRVpPT01DQElOTk9NTk1DRUVGW1PT3d3FyffPwM/Iz9rHwsPY0tjZ2dDR09fRVFJSUdZU1NHc3tXV1NzSVdDf2tBQUFNdQU1GW1hEX1TS3dDbxMTe0dPS3dTV093c1VZdXVdSUdXZ2dfQ2drRUNXUVltFX1xcRFteW0FLSEp1cXF0dU9OSUJAWltS1tnCwcDP9fTK9fT29MPDzcnB2cfG29RV0t3RV9bQ09dRUF1SXFtcUFRQW1pFW05JQ0ZFQVpQ09zdwMv1zcfBw8Lb2MbAwdLT0dRWWVHV1VZW19TVVl1eRVpGQ0BEW0ZGWFxbTUJDQE93SkNaQk9FWVxYUN/GwMDLysrL9ff1yszExdnb3tPQ09/UVdfT3VdTVdzQUNXT0FBT0NDWUVNWUlxaWFhYRUBaXVfW0NLYx8TZ3N7F3NLYxMfT19bXVlhT0dLUVNPe39fV11RdWlhfWVleU19eXV9bQEBNd3Z1TEp0SEZZRERR397W3cL1ysrw8vbKycvCxd7Y297Z3tnZxcXT1VXd31dTUNRQW15RVFlGWF5BS0NZWkNDX1BTUNfc3sTF29rGzcDAwMPMxtre3tJTVtTXUV5TVVRYRV1QXEBDWVlZRVlfWFpaXkVBTE5OSkhMQkFYU15ZVtvA3d/N9MrO9PD3z8HAxtzV1d/T11XT397c0dVV1tRXVtfT11BU0dJUXV1dWk9CWl5aRFLU1V1cVdHWVdbZxcbBwMfExsXf0dPXUl5RVVdQ1dbVXlhT1VdbWVZWUllfUFJeWFtGRk50dHRKdUtNW1pBWlzW39LfxM7Px8z28/TOyvfO2NzF2NPX3NvY39Ld09ZUVNXX0FVSU1fUUFhaXFlKdUdfREBfVFRcUtHe3dDdxMHGxcfCzMbaxdne111eU1dTUlBQV15ARl5eQVhV0FdfUNRVWUdaWkZOSk1GQklDQ0JDQUFEU1RU1tjCwMTDyPfJzM/Lztjf2sPF093Z2N3X0t/d19Hex9rS3d3R1VFSXFxeQ0lCW0ZDWl5XX1tX0tNWUNDa39LGzs/DwcLG2tzVUVTVVlBW1VReRFtfXFldVtZUXFJWVlhAR1tHSXRITU50S0BGQEJBWVFQV9LbxsDNy8r0y8nOycnG2sTNwd3T2djT1NTS2N3R39vb1FdUVVNbWF1SREFFRFpEQVpcU15fUNXRVdTQ2MXZxcLPw9nZ29rQVNfR11JSUVRRW1hZXV1ZUFXR1VNU1FVTX1lFQUlLSE5NTk9ARURPTUVcWF7V2MLCwMn09czNzMPE3NvGxtrY29jY3NDR39jQ1t/FxdPV1NZWWEVYXFpARlldWVhSVFdYW1JQUF5dVdDT0t7Hwdrf2dvb39LT0NdTXFLV1VJdV9RXUlXd3dRW1NVUUl5eRUBIS0xMSUpOQEVaQERbX15bXdDF2tjA9fTPzMjLwtvFwcHa39rE2t7f29nf1lXW093UV1TVV1hHWl5FQkdcV11c19FUX19SU1JYXFXd0tbex8Pa3N7Z2dPU1tDXXV9TVFFfUlfW11fU3NvQV9bQ1FlFWVhBTk1GRUdCQUdAQ0NGRV5bRF7V3NHR3sDPxsfNyM/Ex8PMxtvGzcLExMDG29PR0N3c0dbc3NZdWkRbRUBDW1BTXFDUVFlEWV9ET0dSVFFS1tnY3dLZ2Nje3d3d3NFV1NDT0dfW0tZWVNPSVVNX09VYQVhZWkFHWFlbRkdHRkFBWlleXl5TV9XX1NzEwsPDz/XKwMbCy8za28HG3t7E291VVdbXVVFX0NdRXFxfXl5YXFFX1V1TVNVRXVBWVlhbXVBcW1HT3NBV0d3QV1fR09HV19PS3dbV19TR19fR0NZW1NHWU1pcUlBZXlZXUkRER0FDQ0ZER0ZGRUVbXlzV3NvFx8PDwMXHy/TIws7IyMLbwcPF3NLZ09bVV9ZVUF1cXFxfWF5RVlxZXF9dX1pdV1BZRFldXF5R3Nvc0N7Y0tfU0tjf0dDZ3NBUVtTU1VZXV1JTWV1WUVNYX1NQXFxU1lFFRFleW0daX15FQkVZWVlS1t/F29rBxsTe2cfPzMXFwMbY0tnF29/U0N3WVVfU1VRTUdVUVFbV1tFVUlHUVVNeXVJcQE1GREVGWNXXVFNR0dfV193Hxd3d3t/TVFTR0tPT0dDRVVxdUFNRU1BUVFFQV9RVX0ReXkRPQ0dASXVJQ0RaX1Xc2tnZx8HAxMDOy8vNws3NwN7bwcfZ09/Z0FFS1dVTX1JQXV1bX1JQV11U1VdTXl5aREFCR15TU1PU3dBXV9Lc09PYxMTF3d/f0NVX0dHX1FXVUFlHRV9ZXl1RVNDXVtfQ09VXV1VRRUFGQE1OTkZYRVpR1tbX19/Z29vZx8bHxcXHx8XZ28HGwdvZ2t7QVNXR1FRX19DQV1fT09ZV1NRWXkRHTUNMSUFaW1heU1ZXUVBV0t7f2MPD2t7Z2sTd0Nnf3d3R19RRWVlcXFxYUlZRUVJU1tfQVFZWXEdOT0lJSE9BRVtHXFRV0dTZxcbAxc3PzMHHw8DDwMHE2NvS09PWVVJR1VRWUFZUVFZS1dDR1NfTVV1FWkVGRkBbXFNSUlVU1dXX3N7f0tnE29jQ0dDW19TW09BUUVdWXVlfXFxSU1HU1NbU097Z2dbS1lBZR1pEQUJPQEFBTUdeXlhZVd/e3tzb29vY3cTBxsfHwsbG2d7Z09FV1tbV1ldV3dbQ3NDd2NbX0lZTRkNBTU1ITkJBRkNZU1JQVNDZ2tnawMTa3tnb2N7R3NnT1lTX1ldTXFNSUV1dV1TUVlfWVVVRVVxcXEdETUFDSUZGQ0BHX11SUdPe3NvFxMPHxcfDzczG28Xf2dHQVdVVXlxWU1RSUdfWVdXf093S1tLVVlJcXV5EQ0ZERVhYUFBSVlbU097f0tnZ29LW3tPR1Nbc19VR1dVXVlxUVVVXVN/T39Ld2dPR1NVUUFNYW15aQUxMS0lITkRHRFlfVNDd09/b2NjYwcPBwM3OwMbF39jc3dFW0VXX1dHc0t/Q09/T0FfUVl9bR0RATkhIQklCQVhSUlRX0d7Y29zHxsbH28HH3NDQ3t/Q1NXSUVJdUdVcVlbV0FXW1dZV1VVdUV9fXlhdWF5AR0RBR0ZdV1dWUdbd3dPexsXa39nG2Mfa2sTf3tfR1FBRU9VXV9HX3N/Z0tLZ3tPU19FUVV1SXERBT0ZCQltFUFJWVFTT0NDT0Nzf0tHS3NDRVd3Q1NRX1NFUVFfcUNDE0sFX3t3R2NVXX1BcXFlGWVlEQkhCQk5NR11bX19V1NbQ18bawMXexMDMwMfMwcTY3NnQ11HV0NHc09/c3tzS293UUlxEUVNZW0FASXVISEBGRV1WVtXR3d/f097AxcTF2MXa2dPexdnQVNTVV1ZS19dVVFfW1ldWV9RWXFpFXkdbWlhcW0dNQURcXlnW0NbV1N7c09DZxd7f3dvE2t7Z2NzT11TXVlBQU9bX09bT393e097Z09ZWVldRU1BWXFhHQ0VERFtdVFdUVlfXVVVRVdfV11TR09PT19ze0NTU0NdUVdPY3NLS2MbY09Dc0FZQX1JcXFhbWUBDS0hBT0xBWVBcWVlQ1VdX1NnZ3dnYwMDBwMLNxdje2t7X0tDd2N7f0t/Z3tPW3NZTWUVeWkdERUVATUxGRkZeXVFWUVdX1tDS0d3b39jc28HEx8XAwMTZ1tPVUVdW1tdWUFbVVlJSUVZcXlheUlxZW1hYWkRbXVJQUFbXVFZRV9DW1tLZ293c3Nja39/e2N/Q11XXVldXVNDX1tHQ0tDT0d/Z0NZU0dZWUFDVU11fX1NYWVhbX1pZXl1SXl1eUFFR1NXS3tzc2MHH2N3c3tDW09rE2NvY2dLX0NTT0VRXU1FbREZCQU5MTk1GQ0NAWlhfXF1VUVTV0d/e2djHwcHNwczOwcLHwcHY39zf0tDWVNBVV1dSV1NdWFtbQUZDRVpFW1tdWVpaWl1YXFBX0dHS0tzb3tjexMDFxsXBx9re09JUVlBT1VFSU1BRU1BSVFFSUVlSXVhZRV9fXlhcVl9fXVBXUFRV1NRU0dTR3dHR0NDX1tbW09TX19HS0NLQ3N/d0NfQ09Dd3NjY3t3S01RUUFBRXVJeXlpHQUxAQkxCQlteXl5dVFRUV9fc3d7ZxcDGxsbAwcfGx8bE2tjd2NzQ0NDQVVdfXVJFQUJNTklOdUt1S0hNRURZWVxXV9XX3djZ2trGzMLAwczDwMHax8TE29PT11VWUVVUVlPV1VFTXlJSWEdBWFhbREZFREdGRV9eXFHR0tLc0tra29vZxMfb2dnFxdjc393R1lZQU1JQU1ZUVlZX1VZSU1BWUFNZWFBSWVpeXFhYWllZXVRX1NDW19fT19PX19zQ09bQ0d7V1NDT09fW0N3Q0NDY397awMTEw9jZ39xRXlNdXkREWkZCTE9CTEBHW1JQUVPVVdfU19/T3t7Yw8HHxcXHxtrYxcbb2d/d1tzZw8nFUN1fWVROQE1MQU53TkxbSHVMQUFSX17WUtNU2NxTxsDG2sbf3N3SwtDQ2sLc3NDf39dWVthW0N1T1d5XWVVQW0dDX9RFQF1YQlhAVd5RVsHBxcHazczc3sfazdvBzczZxtvSxdRRxNJRVFhWXlxf39ZSw9RXUVPRWl9eX0pWWnBccVt0RtZQVVxRXtzWVt1b1dhUVFHZV9VRVFVVVdjR1trfV9rFU9jHy9nE9crfxfTeVdXS19VcXUlBQ3REckJbXndBVkNHUtR308BF0cPbwApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9nNzExbXVsYXdfMWNoXzhraHouaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9nNzExbXVsYXdfMWNoXzhraHouaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDBiOWNkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2c3MTFtdWxhd18xY2hfOGtoei5pbmZvCkBAIC0wLDAgKzEsMTAgQEAKKzgxOTIgMSAwCis4MTkyIDEgMTAyNDAwMAorODE5MiAxIDIwNDgwMDAKKzgxOTIgMSAzMDcyMDAwCis4MTkyIDEgNDA5NjAwMAorODE5MiAxIDUxMjAwMDAKKzgxOTIgMSA2MTQ0MDAwCis4MTkyIDEgNzE2ODAwMAorODE5MiAxIDgxOTIwMDAKKzU0NjIgMSA5MjE2MDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfZzcxMW11bGF3XzFjaF84a2h6LnJhdyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9nNzExbXVsYXdfMWNoXzhraHoucmF3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzOGYxY2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfZzcxMW11bGF3XzFjaF84a2h6LnJhdwpAQCAtMCwwICsxIEBACis/Q0te5ebq/VxYYFpUavL+XVhbUFNcW2tv49zl2dra3OpdVFpgcHzVz+Xo5Ph758/ExMfR/l5NRlPr0MXBwMnjaVVLS2bazcjIyM3kbF5eXFFNaHZd69nX1XRYT0JFVn3MxczQ7khAPD1KWM/Aw8rL4VtLRVFaTVlpaextaunl+97e6eNq9fdPTVFLV3Dpz83Ryc99ZU1VZFJe4Nvd9Gvsa1vgysK+ytxcPzk6P1nPwLm8y+VZRkFFX8/MysTM6mFNUU9GVuHNx8vJwM5oV05PW2Da0dvQ2m9XS0lbbO/OyMfN4ON3TVJ94nxeVl1WSExX89nj2MzqX2BjXFRNWFpPVUtKU1Ve/WBXcO7uZFfu311dX1dZaODOy83O2upVQUnqzsfAv8XTaE1GSu7MwLy+wMPPa09MT1Jc2cvMwLy/xupVTkpKSk/m0up0X0xKTl7n39jX92JXSENNYt3N0dznbFNGRGHWzcvP72NKQUVGTGjfzM13Y11UUlJMV23q5Gxm6fhdVklQ9NjOx8vWcFFRSENW1sW9xc/aZkxCP0zuzLy7vr/C0/5WVWBm6djW393m2NfuaeXhc1FOcPLu3t597nJ5/HT+3d3d/1hkZ3jZz99vV1xUR0t+zMTL5PtdSD9CR1BZ4c7dcWNgWE9HSUxPUE5KS0pSX0xKUvLb5/7Y2fRfUUtLS2TLwby6urzJYFNe7sW8uLW4vsX8T1Jb2szb1tLw5+ni13JbbldKS05q5mJVXFlpel9salVYVElSZ9/Iz9fRcVNSSE1UXs3ByMvYbVo/OT9M6snKzt9XSkM/SGH31dVxXlVNUU9HS0hT6+3jy8zL3E9NUWHSzM3G0ep9VFFd+czCwL7GysnP6Wx15tjZ4OPX09Xq9N/e3uFmT0tKVWbq1NDKwcvlbGjte19YU17yamXu3d16T0Y/RV/t0M3hXkxBPDg+Vfjp7l9YXlFMR01aZXXe09LP1XNYUE1i38zJzNHO4P7zW3XW2N7k2cjR829PR0xW38XFw8nWbkxJZ9zOys/zZWdsfeTIvb7L22hbVExSeuXOxr+8x9LVdU5JR13f1c/mXFVHQEA9Rln48Hls+1JCPz4+P0li3+HtbnFMREJT59nRztxjWlBUVGrSy9vd4dLL0szM1/tmZ+X+3snFyNxkYGZd9/jj4Ojv7nF+8e9uW1tgbm1vfmxidOnPzt/c32ZTSl3Nxb67vsPL187R18zLyszQycLIzulQQD1GaN3OxMLWSzs2OTw/S1VPTEM9OjY6Q0lXev32ZFJJPjxBTXDi2dHS2V1MTVZm7+Lc+llaXG3j49nLztbl7ul5WFJKTX3Uzc7Oy811XFxy2Mi+vMPgYlVQU/zNvb3Ex8zMx8rZ4f7WzMnAvL7DzuDY4ujm53JqVnDh7u5oV1NOR0ZETl5bVU9DPkBIV2x+Yk5BPzw9R11hU0pMbefc3/16d1Rj+uzf3d5sUF7k9+jY19PQ1dloYfbVys3a28/gXlhu+nrnzsnIxs1lSUVGZs2/urm6vtLc42PzzMXAxsjE2XRyc9/YdXTl3ujm4O1LQEZMUldnV09HQkBDRVJkZFlMUltKQExOVVVcdFxRZXFiWklMX+Dp5uPcZFJZbtTFvsjfa3dx7ezh3N/g6tzPzuHc8FNFSF3r3cvExcjeX1JWVFxo5uXczMjMzczX8NvHw8C9vMLTbVxt3tnp6eDoc+rmdl1nWU1MTE9PUlFJQ0dMUFVOTltTQjg3P0VPdNjQ1O5lW11s59fN1vDa33VoZWP42s3L3/PpXUxEQU5sbenOzdVmT1NGQVJpfeLs2sfJy856+uXmxL28trjBzuHcys3LwczP0/nj3/vs1d3uWU5ma11wXlljU1ZjVU9QQz8+PlJiWW5eTk9OWm5VSk1KUFxd2c7gdmNeavjYz9Tb5GlhWEtd69jP1eX0ZFv3+WJw7nz7e+XY1nVPS1dXX9jT0MvIxcnrYlZVXXvczczN09zX49/N0ubQzdDb3/h7+u/Vz8rO3PJoT01WbO1+9+lpXHBXUV95et3xaWRbY1BISEZGatbNz+TxdE1JWFf20d3g3ldHSkxKTU1RVFzxflNEP0BLX9PJ3f/7V19ZREp0fuLV5Oji0MO/x87i6NXNx8fPz8nOxsTLyMfd39b2X2/nz83a1tzQ1fft4V753enYaUlPVEhQUktKXGzo8F5cXWFVUlJQP0lZV1pcUufqTF9XSlVqbNDYc1dPUE1Z39LRxdN0TEBBVWvdytLm59zd0OxZWPN8ftbO1eX2ZGtcVmHV1djeZ11u8NXIzc3Kx9Pc3Wpa59/h0dbSx8jZbE9PW97Fvb3LZFRSTV92Zt7P6ersUUpNUVxgWVVSW2BaYFNIVF1Sa2pg2vhQVUg/TWN89GhgX2PueGzfalt4ZFloVVFiXmD4X1Tq3dfP3mJpcN7Q0M74Zun858bJwr3I091t5MvMx9D3Ymvo0cvEx9TU/01ITU5n6dnPzNnn3e3kfVtVZOrNzNhiUFhWWPrseNffdFxNSlZdXVRPWFtfUUhFPzg6PT9ITU9TUUdFRUdMcdDLzd1dT09Q+tfb38rIztDV08rIxb7Dy8/Kyc7W083HwMO+vcXHyN3w5ubWzczNzuJgVFhWT09TXW7s29RxS0tUWnbs7djP2fZzWVVt2+BhVU1LTU5OVk1NU05LTk1SVUhERktEQElOSUhGPj5ESVBTS1Xw0MjJ2Ojn5dTMzdPLwcLIycnHwL6+v8HHxMDDys/QzcvJxsLHz9HlX1NSTU1UV2VmUklJUFFRXWbu287N3lJESU1QWWR739rf52tQVV9lYWb1c2ZjXlhSUVvs3+jpaVVMQ0JFQT1ASElGQT47Oz5ASUtMVm3/c2ZcX/fTxsHExb+6u7q4uLa2tbW0t7m5u8DHy8vIx8nO3VtLS1Zd7N7v+PtwZFJHSExQVVte++HY2ON0U1V67P7td2d88uzb7WJeVVFPT0xMSkpJR0ZGTm1tZmdSS0pISlJIREZCQkE+P0FES1JVVmBy4e7s7Gz33tXPzNXTycvOzMzEwr+7uLm8vcLAwL+9vru6vL7M6fzn5uHZ3NXX0c/uWlNWbt/V18/T3998eF9VXW1fWlxSTk1MS0VBQ0RLTEhEPjo5PkJHSkxOSkRBPj1BUF9yd2dq9+/+amJle9TMzdjk5N7m4NTT1tTV293q9e7Z3NjS0tLRysnN2N7d2dLKx8fGwb++wtDPycXKzc3NzcjBw8vV08vKzMvT1dve4H1TRUA+PkBFQz8+P0A+OTo+QUI/Pjs7PUNSXldgcnv6bVVOTFNr+u1wbvZ4dWtXVl/uz8vY5NvSzszJy8/QzsTAx9Dm7vdz9Pvq183L0HtaZWjdysjFys/O2vNlZOnZ1c3JzdHV0tDZ19bOxMPAxtDU3NzibFpNS05PUVVLSFJOVlVMUEtEQT08ODY5PD9FQ0ZJRUVGQ0ZJWfvs4GNaZldo7WZs8uTNy9PW2tXY2dLrdNzQycbO1NTW0MrIy9DMz87L1trS187DxMTCwL7F1WZObuHWxczd3fV65Hv20szHxsfJ29znaWpXTFJXVl9bST89QktaVEdIQjw+PDxARU9PTUlBREpHSUpBRVBSZGJTU0xMTE5SVHjVzMjN6Xrq3tHMzNDe1tXY0uvm1c7BvsfR19vc29nc1snGx8HO3tDOztPa3N3X3OHZ3ufTzc3L09jOzMXAx9dtd35p9nJWV1RPWlpQUVlkWEk/Ojw8Oz88Nzg6PUNHSUlKTEZHSkZX4+Ld6nf293T4/F5cdt7RztlsXVtWbufc3t/a6nhrZPzTysTH0s/Ly8bK0MvKxsXBwMjKys7X3+Xh0s7KzdngYGj22tDb0M7PytP3aHHo7PVsXUpIRUROSkpPU2VbS0lHSElJSElKTU9QXFBMVVtvbF5WTFhcVFdZVU5LTl1ZVVldfPdeUUxd7ObV2flpcOzRy9Da29LU4N3ZzsbJyszS0NLMwLy+ycfIy8zO086+vry7vcDMysnLzd3a2uDlWUhGUlFSWktFPDw9QEk/P0dMV0pPT1tmT0xBQkZMW2nmW1VXSVJNUFhs3ejsYVBHSF752O9q/FhmWE5SVnR13N9gV1NobuTf3M3PycnMx83Gx8fFy8rMysbAxMjFy8jKz8rTz87OzeJybNvHw8TJ0H1RUFJtZGJ7bV1COjc8S1JgYFZWTkxJTFBOUlZjWkxLTXJlW15RVk9PUmNwX/Hj2uVfV0/43drfaGlRTElNZFxnbu/jaFZO+tvc0+befF198s7P1s/Pzd7h69HHx8PLycnX2d3KxcfGyMTM2unZxcC+x8zUevl47en58nDwak5FQEVITUlMW1FPTFhiV1JMVlpMRUFGTlpPS05HR0pSZ3fh+21qVFFObNbNz3djVUlJUX7x9WZi+FtUTlrf29Tb4N3r6OLRzcrHy8nMzNDYycfCwsjIzcvMxcLKys7O1uRuYtXP0c/q+GJpaXDZ4uXldVlTTEBJVV/hdFpRTk9V7/1lZFRLSEhBS2NaX1ZGQD9BQlRhXWpbVFVYT1ve2dTYdF1dYFNdYlVv7O7x/VVNWV7bx8rN1OF06Nfl2tPX09Hdc9TKxr/Gz87Ky8a/xsXEztfb2OPPydHM3VhQUE9Z3dna0/NlX1ZISVlX7+JhYFhMRlBaVf71a25uV0xSTlhlTkxLSUZGSkdPYVxaVk5HWnD22XNjWE9LSmBbX2JTUU5OR1Bt4sjK09nX0tLDwsXEzdLe3/3vz8vFyMW/v77Ev7/Gw8fIztTmcd/YztDoaFRTTVRyeeb1fV9QSUFNX+LV2+NnX1NUY2JfYF1dV1dOUGJy/WFfVlRMREdISEhMTlVWTE1l9eX1ZFRIRkZPXVZVZmpfW1tb4czHwcfR4eB9+NbOz8/T4PNgT2Hd2s7Ev8XFycvFycvHwMLHxtTaztDS6F9JSk5MYPJ0Zu3c5+ZcWOnw8P7oYFJbUWN9/Ovi2V9XUEhTVGV7+WBJTENDSElNTWRhW1JGTVz+4uDmWl9YWmhWT0xXXU9NRk5bYOnj0+Xh2d3Ozs7MzcvX4m5k7OjPz8vMzsrOxsPDxsO/wcrU5dzg195tV0RLSlFabO/n2dPZ/Wzy08rM18/vZU9PWmVvW3VnT0RCQUdUaWF0WE1MTE5QaFZl9PpaT0tNYPhcYmhVWVluXHFbYO5wV01TV2zW2+blZV9f7/HMxM7N3ftfXnTgx8TMy9txY93RzsXMw8PM3OPX08bBzdN7VExRXVff3dveeFxW/uzXx87Y61JISF1v4drd325UTFtebOPn/15LR0lXWmPx9ntWRz4/QU149GxXSkVIXPDi3d/sXEpASlv20tXU6lJEQ1bkzcPExNLyYHHw5si/v8jX+mjn0si+vru7wtLn39vLyMzXaU1FSlhn4dre5FtQUF/62sjI1XdTTEtZ69naX09GQ0FDTmTWzulZSD89QlVn6fr3bE9GPkhZ6c/dblZSVVLr0MXG0Nrn6mVu5tnO2W1WTkxIX9rV1t3f7PL36NfOx8bWalhiYmzY0MrN1dLS2evdycjL7VRPTlFW3MrL1Ofk73zu5tDTz9RjVE9XXOrW3OxcXl9bXFnn193uTkpFREZNYWVgXFlSSkhOXF5VYlNLR0tceerl6HFgYG748+fp8u5eUU1PXOvP0uB2a3Ruc9nIxMbHzeFjX+TUycrJytTb2NXPycXI0N35X05TV+nT3eHs3Nrd2M/M1ubf5mFNVllnak1PTlBRUGFk9eNvYFVNRk1RVO9kU01LUUxXZurXZlpjWEtLX3LX2vr5YW3uz8rSy9bqaE9LS1lZe+FjWFJebv7Z1MXK4O9tYmDw3tbN1N/4+OXUzM7Ly9bf8fB86N7Vyc3hYm7i1tDNx8fS62tsW2Hu3NLiaE9JTFjr1srL12dHQUFGVFdiXU5CPURPYPTx8WZPS05aU19w8vBeT0dNaO7X2eHc5mlbY2D26W52X1ZLT/rbysXFx9Hr+NvU0MbFw8real7t2sjCyMvQ4WxgZWTp4ODrYlBKVffQyc3P235fXfz9393x+VVKSE1m59HV3fheWVJbZGtzWlZNRUFDTmTjfWVlYGtt6eDo5O7pZ09OUGfs0svM0OH/ZmRt9uR4ZVRIRENN/c7KzNXsZ1td9d/b3tfhW05OZPLVy8vL0tfNz83KyMrO1N7k6OHUy87kfv5lZ/fdzc3a7vVaTE1Ra9/X2dnoWVdfVVxiYVNNRDs8P0NU/mJYXVRPVlNv3ut9eWlPTVlf9Nff9/BbT23u4NLL1PZpT1BZVvrR0N7g3dzNzMzFw83b2fldcXbw08/b2dTh2s/SzczQ3/RmV2FdWe7Y+lxZVFp+6NTJze13Yk1IS1Xw2OTc2Olv9fVu+/xaU0g/P0FCQ1ZcUlldbOTa0svL19ze4uT1/vvg6mNlYFpo5eHs621cUE1NT09NXvd4Z2Ru5efu3M7P3/5wX1ZSVnzW19zPzM7Ny8XFys/W1M/T2d/g2d9uX2l67efb29zuYvvg63Fu8PB0Y2rl7fDj2N51Xk9MSUVFQ0RDTldLTlVceenu7OJwW2RkXU9RXWZtWl5wZWnu6HrwdFVcc3zp6OnZ09jd0M3KycnExsvZ5tj2WFhdcOtvZubg49DOzs/d29nX3uztb15WVVRYYVx66u/e2u9q7/hqc3Pz7Hnh5vxu997j8GJcV09LR0xRTVVfZWFaX+7yY23x7enh3uD9al1XVlVm+fDk5+97+lxWYmJcWl1eWWLt5N/l2tLQy83V8eniXlhXbuvs9P7e29bQ0c3S09jRy9Xb1tPlbG1z+PNnfnn58GJiWnvm+err6H7p4Hre6urm7+1fV09QT0ZJTE5OTVBMTlRWZWdv9+7ubufpb3NeVk9RUFZzaPnw3tx5aGB6397d2NXT1dfi1s3Oy8zP19zi/Pl99+jp3/3+fmx1a2Jo7eDj6PXg3HBlXllfXF5ZVFtiY3Dm7d/f49DN1Njb4On1cOrW1OLufV1OSUtNWVtaYF9XWV5cXG1x8fB59nJ769/g+HFrb2hZU1BnYF9lXWFeYGdtcWhzZWNudPHg1djV1N7g7XL+4dbZ4Xx94d7m39LNy8nP1tLW0szO2+jucl5YVmFyaWr0dW7y9PPs3d7f6Ghec/jz6npqempZVk9LT1ZTUFNST1JSTUxNVWhiWFx+7vDc29/rb2BhY2Rtc3FnX15u6uvx4tXW2tvk2c7Jx8vOztDgemhlbPrscV5ZYnR97efd19XX3+zq7/Hv5dvd53ljVVddVlpcZ2Rgdu3q5trQ0tzv59zT1N/pfXJaVlRTWmFnX1hTUVJVXGRkfu70cFlYavjm6d7W7V5aX2JfY21yWVZWU09MTllweerf39zZ1t/n3+Hh5vp76ODp5ubr+XFp5uf03tLP1c/O0M/LyMrK0+N6V1pfZWL28XX2a2ptd+7n2Nbg7e3l3ONs6N5pW2FXS0lHS0xLT09VWFpbWlteVlJcWVJg8ujb1Nv8YFthbWx54+Pm9WtbVVdgd+jc2tXS19PR1M7N0tTT3+t9e35qY15YWm3w6u/t73Bmcu7s5NfT1dTd6ntoa2h1ffHx6PRgW1le+t/RycvP0tTY3O7q4OHqcV1RS0hLTE9RVVZgW1hjXFxhaWx5793V3OtuYlpQUl9ycvxtYWtXVFZQTlr33tnj4uHl5t/h3dbU0+9eZVxq7ujd1tXd4u77aW175d/d09LP1dfO1Nnh+XV+6u3p7378dmNibHTk3dvm9fF75tvf8uje32xXUE1IREhMTU5VWVRUUVJhZHV+6tzief7weufwcGVfdvZ6aPnsb2dZZG3w1NDR0d3u2+X24d3Vz9Pf5XdpbWJsdPPubWFpYVlmYm7g6OTe42xtdfXd9Hz44uf77e739eX5a/x869rX1tXi29DU0tfW1tzmYExMUk9SX2xvXlVPVVNYYmNqbPp+Yl9ZWm72dmheWmVjX2Jma3vzc19gd3Bj8Oh69eDX1Nzg2N/l5+vy6u3z4+HY4mP6b3bu8OXq6vvi+XP4deLY1Njf/fflfOHtfOXq7fT/a+rm3drh3d/e6O52/u5dYFhVU05NTVNNU01HSEhPWF1l+fbs3enc4enX0d/8Z1tyaGl2dWxvbl1bV1xv+N7e2M/N0c/O2tPW4O53aXNuXXTr7/5hWlZadOp97u915eTx+Pv4399rXlladu3w6NjNzd3o82/x6+DY1tbQ1d/c3+vl8WJeXVhWT1BYWlpaU1BSWmVaUlhfYGhkZHHq4tjgY1pRU1xfZXnm4/VrYGBm9Ov06d/n8PPv3d3n1s/U2Nrj9XNv59nd5HB33Obr8Gdr+fro7vfZ0eDl/F9ja37r7eLW3+7sXVRhW2fq3M/Q6uzl693c6OT1cX1XTVFLS1NLSUtLUVxVWFFNYfTu4t/YzdTc1fJlbFxi8vfk3HFgX1picHzp4tzV5+vZ29PM1+DV1tfaZ1hcW2jy9m5qeP9tZWpbYmpZXerc1M/scmxYWGNu+tvV2+bo4eTc5e7n087P1HdtdHTq3N3x4PdbXFxYW2peWU9VXl1ZU1BPU1NbYWN3dGhze2f372Jha+LR2PVjV09ZW2zl59jS6HT579jR0M7Py8nN3ub9cfP04OB0bHhZV3Z6fvhoXWbi1NXl5+h7ZWJ86ujb0u997Wt5+mtf59ra2ex+bmdr8Nzd8mxkT0xVU1pcVFZcUk5RT01QWFVcX2xv7eHz6d7b3u1vb+Hg3dnvYmFcVWJ66N7c2+ju6eDe1tTOx8rPzdj98nVlaWptdWRTVVpga2liXV546fXe3Pjl8HBlXmvi3vLc2uTp6eHd1cvK1dbdaWJfZWty/PpfTlRUUFhqd2v95e1ZVlpNTlFUUFJXXl1YY2VdYnh4cPDb09vY2+t+amZebHTj5X306v5s7NnVzsnK0trk7OXd3NrZ3dvtZF1qYlx5fGJfcvD17u7o/m13dmFfe+15fuXr7N/c3dra6vRyWltaZvzn5tzU4W5aXVtYZHp2cW1fXE1FSUxNUVlZXFphbW1+7ebl3eHf3Obe9WxrX1hc9+3h39zjcXfq4urUzc7S29Dc+/Xh4ujY3N319m1eaG7//N/i/GpjblxYXWhhYvDi629++XJ65dre39PM1Nra6W1dZnF75NTc9v9fVFJfZ2H+5vZaWV5QSUlUU05cfmtVVFRYWl1eXW/39fx7eWhfZf5zZejV3efj5Oju497e283JzdHS0N3l2NbYzc3Y2ez7/njz/3344/ZmW09PTVJoZWze1NrmefHk/vHm4+DY19bkYV9ZVltZX/Do/nBq/v5qc21ee+Xu7m1YVE1HTU5XZ2ZlXldUWmhvXmPc2dza6XB+YGJ+aHjr6e347uDf29zq4dfTzM7a39vm39vh1s/W5u3p/Gh1alZaeubjdF5ZT0pTWFvx2dnj8PX8693peuHOzNPW1+NvZvpsZv7t5X5w5eb1cFlTVWd6dWdiWlNNSUdKUlldVFFhW1hcWFVd39jb6u1qWlVaXVz52dj169HX2uXn8evZ49jW1dTT1d3p7c/JzdTWys3R4XNnY+fx/WtbWE5FRkhNZ+HZ2drV2+Dv/Hnhz9Xe3tvtblVTUlBufmZk/9vg7HJiVVloZGhgWV1hT0RCRlFWU150eWlpZWFj8NjV0NPe729ZUFRo3dre3dvV2t1zZXfr19vXzs3O0956aWjg19rT1s3N0OB1a2f9aWv7bFtVTEdLT27569PY2evybmlq6M/a2NPU2ehtWV5YZPtx7e/f3+xrXVhWZF1ga1ZWVU5LTExZZFlgZVtSUE9XWWjd4NTP5GdYVE5OT/fZ5dvX09fb7HR0ftvXzsjLy83X6/h828/NyMrOz8/Z/nPs2+fp8GJXTklITExdeHrm6OLe3N3l493Q0djle+1lU0xISlVfZvDt3N3k/F1jZHz28f5gXU5KRUFJWl9kbVtbWVxaW+/cz9PU197tcF1QUVJnc+nh9d3V2ndo/+/c18zIycjL2m5fX37i2M/T0tLc53zw2dPf6edlXVhNSkxSYHdudmdv6erw79rQ1uDj3u3d3HZfW1xjcn7g29rZ6XBaXW5veXd1Zl1NQkJFSllsbXRjWFZTTlNt5ePo7ev0dWRdXl5t+vxxe/1xePNpX2drd+rWysTDw8nW4N3d2M7JyMnM0eb95OTn6nZwZVpVT05TW1tna19hbHXq6+DQztbc6/V+a2x6XltYVWNmeOXf5d38XWVdV15baG9dVE1IS05PZXx18HlqcFhZ+/R+6PRvbWNpaVxpfmv36/zs9/Pe+WV3amzj39PHxcTHz9bh89/W1c3M0Nh6cOpxd/JtaXRnYV1YYWZeY2VbWmB93trSzNHU19/o73p4eF1fW1hnbP7j19vm8f10WFdmde73c1tLR0lKSFBbW1pdX1xYW2Jta2htYl1kbGt75HNu/mtoa3v4+PF4a11ffN7NyL/CycrO5d3Vz8fFxcXL2eXueWln7+z27HRjZV9WbXBdYVhUZW/7393j6erf5+nf/WxyXk9YV1x+du3Z6mlmWFRZW3r26nBRTk1HSFRTXGdlb/90cfl1cuvvfvrv9fnq7vp6cWFtbmd28vtydF9aZvLn0cnJxs3P3Ofc1MrMyMfO2/DyX21qZmdn7Hp9b/nubnhyZlFPWlpr6N/d4ebz7OLe1Nfd4nhlXm97cObh6mFUUE9RUmZw7N3gZ1FZU09RWmFTV15aWFRZaGVjaVtTXl1RXvh5bGlza2395+Lm7XFuXGL4edPBwsbLzM/Mzs7GxMTHyc/f4O9wcGtfYfx9en145d3yc21eWGBdVWztfF5fXlx75+jz9etmXVlj/Gvi2eduW1tPVllXbOfiYVZWUU9NUVlgZ2JnYvDu+OPt53RmbWdrW19zemJWXGJm9e3l5un2YGRu8N7Sx8nMzNLa5dnX0s7Mzt/e5ej2fPZ57OfwbWHv7f/r7u11X1VRWWBp7+ns9vbs3djb19zffWFYVu7g7efm3HthVlZyZnP07GZUUk1PT0xQWFxXV1ZZZ2RgYGr/cmRUVWddVVleVk1YW2t07djm72VnZO7OzMrIxMTJyszJyMPFzc3Q2+7q5+zw4N3j3uHv4Nrj5v/181dNTVZaU1VVVlhfaPrh4trmaG1gUlVx6fpy+HdfXFlbcPf99l9cWElMV1pWV2JdWlllbvLe6uTt6/JhX15iZWJzXVhYWGh15+PwdGJeUVj94dHPy8fHx8nFx8bGy87i72lja1tr8/z47d/27NvV1dvc5/JuX19ZWFtVVlFXWGrp2s/R2efq/V5faGv9dnN5e2ldYPTwbGxjWVNRVVhWW1RPV1pYV2Lu8GZ0fV9kY15bV1dWU1VVVFVg+t7f8+1qYmVjeeHU1NHLxsXFw8K/wsnH0unc3Oj98e967t/Z2tvQzs7a4fBib2ZVUFVQSUtITVdc8d/Z4OzmZV5cWFxeaWBw8PXp9nLt5v1jaFVQW1BVVlFLTFdUXW3u3tnc8ebueOP5eHtbUE9RTVBdeOPj3/tsX1BZZGPx3d/Yz87NxsPDxMPIzNHi3uHy6v1cW/X6fN7Tz8/Kz9jZ8v31Z2BdTUVLR0NQZeLY0dHd1Ox48Pjs6O9bbvlcYn7t8+rqZmxcUFVWVVRNR0pTSUlfd3vm3P7+9nFma29eWExIS0hIUmpyeeB2aGVdXnPk2M3OzcjHx8fBv8C+v8jLzNHY09rn7Wrv7nzn1szMx8vU2uV2Wl1fTUlDQEBBR1Fx9ujZ6en9aW5u+ndwXVdbUldecu7x2eliZ1hVW1xSTlBJTEpKVmH76dXa4dvi8fx1YldfTUZMS1Fgem3o3XDzeV703t7bz9XdzcvKxsHBwb7Izszc593meefvXGBlXvfRy8rGydDT52h1ZVBRUURASEpOZG9w5N3i5Ob93dbu5t9wWl9hZPDi5+PsXlZYT09VTUlOS0JER0lYe3vk3eX6e3RnZlxVWE9DQkpKT19s+OLo/OTq4dHP0tLLz8/Hxr+8u72+wsvMztHOztri3vdfZWr40s7Qzc7f6n1meHFeT0lHQUBCRU5VV2B9bGXq79/V4nN9+2BbYXPm3uDwdlhNUE9PYGJQT09IRk1QauTd3d7maWd0cOrf/lZRT0lJSk1aZWzz6P7v397Tzc/b2M/Rz8vGwb6/yszQ3tvX19HW7HN6Z1dm4dPPzs/U3Ol5+OTd225TUU1GRkpNWW198urp893R0dvd5Pzqd2n79OjkZVlTVE1MTU9STktHRkZCTGFs7f5xa2ZeW2H953xdU01MQkdIS1xpZ3Hk6v7e09LOz8vIx8jFwL67u8LFx8vR09DY2tnf5uj799jSz8rU3uLxaWBr+XtmUUpDQT8/REpn9GHr4ut75Nrm3Ojtd2FeWF/+6ulhXWVeUlBTUlRUTUlJTVBWdOfe8fD6amxt6Nve5mtTTElFSE5f9Op6eu7o4OHUz9HLz9rc187PxcDCx8vM1t3q3tvp3/Nm8+jd2MrHy83b73Zx/njq+WZURkZDQ0tc6uLa7HDe4Ozf0NHf5mVaWlZ07d7kfmlSVkxGTFVRRUZBPUZHTGft8vLyVVJfZerZ23pYT0RDRUle7Pdt7l1a3dvXysXGyc7c3tDKwLu8vb/L3NXP3M/J0fVpZGbd0MzCwsbL6ltaZmZ83/5RRT89PkRMcONzaVZNXOPZ1NDR319NS01SeePW53xqSkpNU1llb09EPj1GUPLV0M/T31hQYOfS0tb0WExDREdU9+fnY1lOS2feycbJxs/mZW3cyr++v8bN3F9w3c/K0Nl0VVJd6tG/vr/DzN1fVn3i1troX0xFQklOftbY5GBcWl3r2cvL2fBZTkxMWu/b1N1iV1FITFdibk9COzk9Qklg2dHYblleU1Lv2dflc1NHR0hKXeDn/FdJUl9r5c/FxsvY5dfOzMa7vb7Az9TU1NPIw83daFJd39XUwL2+xd7z6eTx39byY1REPkFKS2DwYV5MSVNgfPDU1+lmTUpRa2Pt4Hn0XU1NVWJ28mZPST8+RFRk/tPU1e5RV3R459TX9XRVSUhPZvXccGBXRktaeePPzdjY/mX92c3LwcPKzNnj39jRx8TlZ1xVXXHQyb+/ysvV3t/U0tLN6WBTTktHW//e12NcWlZWYNzXzNZ1YlhXUPnf9+JvWlNRT1N0aHdWRD87Pj5HWl/x/mBbXF5r2+Dk3P9SREtPTnHu5fBZTUtUXuTa0cnQ3XXf0s/DwsC/wM/cz9HJxsbEz+tZXffnzsbBxs3f6tndzsza2edZRD9GSFNmcWFSSj9ESlXg39fgYFFNWFf42Obodl9LSVBW4+5iX1BHPUBGUebh5uj5ZWLt8M7K39jyXUlKVFrf4f71b1FDTVnvzdLM0uR4dtzYysPEx87WdHrd2cbIyM3pZlVh9dTEwsfO0NbczsrDwsnaXVVJRlNl6e1iUk1IRE1d6dbZ32pfW1Rq5t7Y5FdRUUZLW2vybF1LQ0A+RE5XWllPT1FOXf/w3dvhYllWTE9jcHd6YE9MSk9q687Lzc/Qz9TNxsPDwsjTztbi1M/Jx8TL3uJ59tnMzMrJ0c7U08bEw8bO3V5XTUdMV1NOTUQ/QEFLWGjr7fBsXl5ded7ee21nUVNXV3rl3udqUkRGSElaZFxbYVZVcfLc0dDY7XZdXFxSZmxfWVNJRU1TYN3U09rY19vPzcrFytTY3/nq5+7Wz87U3ef03uDaz9LU0NbYz8rHxcHFztXna15XUVpZU01KSEpOV2F+7+7qeWVqef/u4/x6fWljXl9eaG5dUElDQkVGSVJSUVhUVWB4+vjn6XViV1NUUFRbWFVSUU9VXHLq18/R0dXMysjFxsTIyMjP1dXS1dXT3uXe3NrX0tHNzs7Pz83Mx8PIy8/c4m5eWVVPTEtDQ0JARUdNTk9ZXVxicHbv9nF9+vz5emt0Z1tTWFNNTk5OTk1RXWBcXmZq+Ovp8ezoa2peWFpdWlJaV05UU1dve+Xb1N7j1tHLycrMycrQztHW0Nzo/v16a+js5NXa187IzM7JysXExcnKytvocl5oYFBQV1BMTk5TW1ppbX5tXGpv+urr4d/e9WxtZmxhVEtJSkVIR0lQT09PWFRPVWBibmVjeXBeWl5aY15TWVNTTktVXW/p3drR0M7LxsO/wMLBx83P1NbW1uhweXrs6+LX0s/SztTV0tPLx8TKz8zb73pkW1FPR0RBQEZHSlFaYlhZXFxqZGv37H7r2e7xdWnu9XBcUVFKSkxOUldkY2NYYf5y6evf5W1pXFdgX2tjXVdSUk9VU2rq5+j1ffzj0szHysfDxsrPz9vc4f52cl1cXW7p29DNysvNz87OysnIxcjP1drY2dnba1lTS0dHTVFUXWxvdGxw6tvX3+3wbmBeWlRUWFZRU1VOSUhKSElIS0hKSUhMVl9Yb9/qa21gW1VYVVNMTlJNUFrp5NjS09fV0svEwMPBwMjJzsrLztfb4v75fvD66d7Y1dXZ0M/PzcfIzcnLzc/X3N9tV1ZQSUpLSUpQWFhjYGJkZGtmavT48nBsaF1fXl1cXVBMUU9OVVdWWlxaWlVVWVtlav/o6evn7+hsWlRUUExPVFlae+zd293c19DM0NHN0NDS0tzh4uL969/s/Ovq5+5q6eXe29ne19HOx8HCyMjMzdLT4XpdV1ZTVVxrXmh+9WVpX2d67XFy8Pn8eXFgWVFZVlZMS0pITE1LSEpISk5NTFNUVltwdXZzb2deXlhWU1JYXl5+5ebe0c/b2tjX0MvJx8TExsXHyc/W2uJ8bXJtfenc3tvT0tfT1dnQz87Lys7W09LW3er6X1VUV1tZXVZTVVtYVFpfV1/zd3v4dGVlWlFMTVFQUE9PVE5OVVNVWVdUXF5daPp2a3RmXmZgXFxbXV9ZXHFycfz8fuDg7ODZ2t/SzczKyszL0Njc2+Lw7mReZGZl9+7l2NPY08/Pzs3My8vQ0tXS19jc5uXude3e9Pb7cWZnW1xdV1poee3d4u32+ltVUEpERkVBSExNTE9NUFZRUVlWVVRPWVZUV2ZgWFlhWlxpbvTr62558/Ln3N7d28/IysjExMfJyczT1dnd5Ojp5ebvdXvn6NvW1M/Ozc7T19bY2+Hd3+nn5eh5dHP+dmxaYWxYWFpfWlxeXF5kcu7n/ntkYFxWUExKSkxOUExOUlRYXl9tfG9ndm9eZGNja2ZYWFZUWm/h5ezxenHzeHh6fuvc0NPQ0c3Q09bX3Ojk5fVfanj4bmZeb+7i083IyszOy87a2tnh2tHP0tXZ2djX1eDqbnH87nNlZPf3aXNtbGV3eHtsYlZZWE9LSUhFRkdGR01LTlBTWV5ZVlxdU05UVVtZV1VWVmlv6u3n3/vt5uz06eTUzs3QzMnKzcrLz9LZ0M/U4OPg6P5tXGFp+9vU0M/JzM7M0d7j7fPs7PXv593X3t3f72NeZl9bWlVdZ19XXG1gaml4al9fYF5SUFFQS0lJSkpTVWj9ZnTr6mFhY1xWWVlcWVRbbHPz7O/1bnj582lkbuby3dvd3d3TzsvX1NjY3t3e3ub1cHhrWGhmfe/d1M3LzMzL1d7W09XU2d7c28/Oy9PU1N/m5mtfamJy9fdXX2xkbOl9Y2BeX11YSUtOTEtKRENBRkxWWFVhXVlbWEtOTk9NUU1KT1xj/+f+8XT/dOX/d+7d19DT2dDPz8vCyc3LyczN0d3d3Of48GJbY+zb1tLNzM/d29n18OHe6t/a39zU39PR7v3+bF9fX1taZWBzaldcb2p97nNmYmVVXVhNTlVOTE9NS0xPUGZybHJkWFhaVlpZVVVeV1hhY2H77XV7b2lr+G958ezw2tfb0s/T0szNz9Hb59ze6+rvZ19hYWf8ce7Yz9LQ0eDa2dnX0tva09LSztXY0M/P09Ph5erp9Oh5Y21pY3rme/Tw7GloW1JOSklJSUNDRktLT05VXFxWXFZKTE5OSk5NTlBSUWRhXWXueWbz7vF5fPPZ29rUysvIxMLCw8TKxs7Y3Njp8e7ubG9uatzn4N3acXDx7vfu8+zU5OTb1ejc19ne3ebs2vL6+HJidWtkYG5dct176fZiVFtdVVJRSk9UTFFUUE9dZnH+b1ZcYFdZWFRSVlZVVltPXW1y/G1mY2/39/H7eN7e49rT1dfNysrK0djW2unxeGZfYmlia2/u39vY1+dravPl7uDd1tLSz8zN1tbOz9PQzs7R1Nnd5uni3fV07Ort6uj4cFZLTE9JREhKSklLS1FPTFBaVlFUTk5QTEtVUlBVV01RXV5gaWx39Xfx7evv39nQz83Ry8XNzMnKzMjJy8vO4uPf83l2a2B+6eDf52t3dF9YXlVWavvh29/829jg7en53tjTz9He/drd39zmY3zr7evoZ2BsV1RVTENISVBUUk9ZXFtkbFdSXlxsZlpNVlhdb/1WVGJk8vtrbuVw9+xwWG3v6dnX2dTO1tLU2/bf2djY4HZsZFz69G5cdPzd1N3u7f57fW1eVV9t39XR2tLT0tPV2dbOz8rJzNLNzc7Qztjz9+72/fpraWJaTU1GQEBHS0xNTk9TUVJVTUpLUExPTktOVFFZbVtUVl5bc+Te3d3t6+Lv6drR0sjGysnL1NDN09bU3PL0fHJ89PPm8Xb36ejg2eHn819YXVRTXWNp7Nvh3ePn3tfb1Nbg39fX19HW2dDS4OX3cW3t9vdvWU9NR0dMTU9WXVheaWJfa2JdXVZLTFBPV2NfY3VoamRoXnPt6uTkfW75fvbp2+DV09TV1Nrh3N/q7vtdV1NZXHBqZ3lua+rf6d3Z3vT7XldeZGPv4ebc19Xaz8vLycvNzM7Sz83NzcjJzM7T3+Hi+/D7ZFBMRkFBREZKTE1OTE9SV1RVV1RNTEhISEpQWWVfXV1gXGv34OLc2+T17uvk3djNy8rMyszOzc3V2eD8Z2FaV2p6/u7rcHD+8e7p6fR8ZlhUUU9UX2Rpd3lrbfHd0dDQ0NHU19TQ0dLMycfKzNHZ2d3c4H1fU0tISExMTk9PUVZTV2NrZ2BjXVVSTk1NT1RaX2BgX15tfe7d4uHk7v166+Le2NPP0NHY3Njb5OxyXlpQTlNYV2BlZnB8cHjp5+bv7nNnXFhcanbu7uzi4N3cz8zLysvLyc3NzMrIysnHxMjLzdHc3/diVExFQkRGSUpLSExNTk5TWVtWUE9PS0ZLSktNUFBVW1115ujf1trc2dnj393Szc7PysfJy8vLztfh4n5kWl1eWllZV1hbXWv08ube8HdoZ1tSVl5lZmZsZWh19NrX19jX1NTUzs3LycvNzMvJyczMzdTofl5QTkxKTU5NS05QTlVbXWFiWVRSUFFQTlVZVFZZW11m/OPb2djV19zf29ja19fZ1dXTzdLd2t/4ZldPTk1NTlFPS0xOT09gevbo8/v6YlxpZGJ+6ubf39zY1dXSzMzNzcvPzcfEw8PJy8rNz87P1Nnc33hbUk1MTEpMTEhKS0tOV1hZWFFNTUxJTVFTWFxZUlpaW3Lp6tzX2tfY3dnR1NTU1dTNzczJys7V1+xpbWdcYV9ZWlhUUlRVWGRtYl1bWFlVT1FTVFdiYmJrc/Di397Y19rb1M/OzMrLzM3NyMnNzMjM0tvl6npeWlhQTE1RT01UYGVtZ2BdU05TUVBTWWJmXV1scHZ249jZ2tLQ1dDQz87W39rc397a19jZ3PFgW1ZUUU5OUExLS0lJTU5RWFVTVFNUVlRbX2dmYWd7dX3i3NPSz87P0M3LysrJx8XHysfIycjJzdrxb3NiVlRZWVBNS0tMTE5ZWVBUWVROUVNVWVdWWVlWXWtw/NjR0tDQz8nLzsjIyszMzs/QzcrIzdfZ2/Robl5bX1xbXE9PVlBPVFlVTktKSEpLT1lZTU9ZT0tLTldbV2VqZnTs3tze2M/Q0c/NzMnJxcfR1djq/Wdp7ux7cXRqaVxdaGps/3V3ZWFzfW9oYWBmW11haPrc1NLU2NbS2dXOysfMzcrN0M7T2d9+cfpeU1hZWl1WUVBOS0xOTlBfalpQTk5QVE9ZZ1lWZ2JZWF9y+vt1+OX/cufd2NrZ4ebd2NDLz9LP0t5zX1FPWF5rb1lca2ZcXW5xaGZgXmFcYHnwbW54XVRUUl/47NzOzM7Ly9DOyMXDxMbIxMLHxMbP0tTh6v1sfOPn8vtkVlFNS01SU1NaUUxOSkdNTUxQUE5MTUxOUU9OUVBSVlxkftnd2dvo4tvn4uPn6eXf7/hoY2x+bG9pbnF37+TW2t/o7W5wb3X+7urj235iXGFlcn3o3tTSz8zPzs7Kzc7Pzc3JysjK0dzs+VpcYXXx6vHg5/1kX2dXU1JVU1RRVVpdU112XltUU1lfXWdwa1hcXlJXWmN36u3t3uR25epmaWRmbWJVWV9YVF5YTU5NUVxpZHnkeWB9dGf/c3nk4e3k53dse2t+9fvg1s/OycbJy8jMzM3Tz8vM0czL09jb493e4dfT0dbV1d3f6XBvX1VZXFxZZWhoaV5WU05LTlFWWWNYVVRPTVFPTVRUXWdya/d1bWJjXVZcXGJrdm7z+3BfZltYZmR66fB48nttZHtlZHFv8uHzd/xwbGbuefbq69bLztHQ0NbZ1d/d29jOytPc29nf4tzo5+bo39fq+eLhcWxxbHv48uHU39/Y2Onq9vb8d3Xt3nNicHJmcGtgXV5h9OtqXWJdUE9NSUhJSlFWT09WVVFSUFJZXmLw8Gpga2ZfX1tWV1xfffp4eOzz7+35cfru5djX2tvY3t7e4ujc2tbQ0NTSz87Lys3T0tnV09bc2+rr5Ol0d+7z4OHi493h4u73YGx3bfxyZ3j4YGx4a1xpZG3w7ene62FiY2JQUU9RV1lVWVZMT1ZSTVZVZ3Zxbvh0Z3JrYFVcXF9daGT4dVpfbmdkdW72+/f17GhdX2llXF9hZXX3fd/i5tvX5ujj3dnW1NTP2t3f19bX0tDXz87Myc3P0c7P0dff6tzf39/o7OHc5enf5u3b4OLtcWpwa1xaYFJOUE5RU01KS0xLTVRMT1dZXFlPTlZaVldcUGJsbW9mXGdtZGZpZl19b+7m8HXzbmxvfndifW7j29/j2uPd3Nz2dPf/2t3o6dzi3N7j9ffw5tTX2dXR2dre3+jj8ejY4ePa293W19na2d/VztbY2eTn6PlwZ2tn8e1pY2ZbXWJbWFtWUFxWUFVXUVhYV1xfXFpqbGpqbGFoZ2JfW1ZXX1lZVVNSWFhZU1BVW15dZGNvam1ydWpjcfXs59/c2Nzb1dLW1c/NysfJztDZ19HW3tnV18/R1dbQ0s3N19zZ2eDb3tza3Ork6Xh+6/J48G5qcWNeevZpZV9UUlFNT1FOT1lWT1BSUVhdWV9rYGNvYVxmY15sbGZ7bltgcGVha2xndHR38Xtlb31gWVpXVl1cXWZeWmNtZm/86OTe5+Ph6e3j297d29jd1dPMycvKxsbJys3N0M7T0NXd3tzc4eLh3Ofj7uHm8Ofh6/368PlpcGzo63h7bGJcWlpYVmBea15TU1RVUlVSUFBTTlJMS09OUFNUUU9PVFdfXWNmY2RhZ2ZhYmlv7mtnbWv27ev3/HT77evz9+/p5O/p7Oni2NDOzs3Nzs3PzM3OzsnJy8zO0NDQ1c7R2tnS197oc2x1cGJyYVhbdnV5cGhmbGdheGxgZHJiXlxaXGljX2dfWGB4ePl9fXx9Zl9YU05YbmheWlxZXFRVVlNPXGBeV1JWVFJPTk1OS1dkZ11kZGVrbvfo4+XSzs7W1tXZ29bX1tLXz8vQ19LSzszMzc3O1c/P1t3Y1Njb2+3w7Pjd1tza19nc3+PzdnBu+/9pZGJlXFdTTExMTldWU1hYWFFOTkxPV2r4dGtsaGRcXWNfZ/nm6Ph5fW1sXl5cWFVZW1ZRT1JUVlBXWVhcd+/vff3r4uDo2Nje4dja19fTzMjKzcbJzNDO0tLV0s/O6Gz7Xlpl+/3q5+Te4XL15nz84djY3dbY0tV1eOny7Nze3t/h7tnnWVVTT1RmbGZZXFVfUUtSVk9TW1VaU1ZUbldTWWJbWVhVVVNXVWZPTU9QTVdcXlteZF5uYG55b19u7+v039bSztXTzs3T0MvIycHAxsbO1M7T1s3Nzc3O0tPR19zk6vTo6Pr25Ht0bFhdaWdq6e7v5ut79G1cXWVbXH1jXFtcVmNgX3n+YmjydXtyZlpeVVNYVExQXFNfZWdgaFxWXFZNUlRNUU9QUFlUVmVXVWFpZffv8XzufO/e7vTj3d/Q0tPZ1NvZ0uDazsvPy83P1tjd1tns4NTP1s/P0tna4dnY3NvU0dLMz87V2+vf4PT86vd29mNbVVNZXVZQT1ZSUV5YVE9PTlJRT09UVFpkXl1aW1llbV5nbVpkY1ZTTkxKTUxJSk5OXGZeW1pbWnV0aHTw8dXS2NrZ2uDP0NLRztLIxsvKys7UytHT1t7p2d3o+nNdW/L++O7o7Nff8+/mZ3bj593s4ODY2eDi3mt13fT9+mZh/mdXX1lLVVhYaVtdYGRoWGdbT15eYV1TW2Brd2n8YlhfXVxUSUtMS0xMT0hISEtQT1JdYGlobHtbXWL85Ozh2NTQzcnJzcnIxMTIyMnKycrM0d7f5tvZ19fZ3uHi6u1scnZ8bnV7Z2p36N3f4tvX3ebh62NcXVleWE9SXVRabWFeXFxbZ1xYU1RMUV5XUFlWW29dZ/1wWGtlWlRTTVNOR0RFRURUXVpXVk9ZWltZZFpZePHq5Onr2dnSzsnNy8PAwsjNz8zOztDN1c3Ly87bef3xfO/4+2v7+OzueWLy4dzU0tfi1dPN0Nrr6f976O1uaPHw3NjwYGlfbvpvXFpkZW1tVk5XVGL/bVZYYl1eWU1JRkJIS01ISk1KS0xBPz8/RUpISFNZWllkXmFr8dfKz9bMycrKxcnKyMK/vL6/vr7AwcPL0dbR083e5ePzX2rtfnn74+LX5OPk5X7t53Rocujd09rb2dvn3uPyZWdra3RibHhrYnj5cWtqZm5yaW9qY19fWVlZWVpka2pwZl9fXE9LSElKSUdFSUVAQ0dHTE9ZaH747Ovw8/F4+uHi3tLIx8C+vr+/wsTGy8zKztPN09/c1Nza5+7h3eDY1d7g6t9vad7t8c/VzsXGysTFzNDU0tvW5N7abFZmXVlcVV1pb2XyfFlOTkRCQUFISUpPYF5bWWRbW1ZSWFVPTVNPSkhNTFFQTV1bWGH7dWx9cWFoZnbl6ejTzM/NxsbIxMfFxcfKycjO0tbZ19Db0s7T2dXb+WRiV09OTVdYWmfk3uHe2OHd3+DU0NHX0M/Z3dzf1dnaz9Hb6N7taGJZTU1KR0pKSk1STU1XU0xPT1NYWFBNUE9PVVZUVlBQVFJNTk5LSkpGREhMT1BWY+rn49bS09TW2tbS0czIx8TAv7/AxMfExcvKy9DS0dv4eWdp9vZnevlv7+nyePDv7OPseuvl+3vs8eDh7ufc2+Td6erz/mReU1NSVVZWX11aYGlaWFFRTlVQTk5PUFZZVFZQUE1ZT0xSVE1PT0lJSUhIVE5OWmBbeOx7/ntiZORsaO/r79DQ1svFyMO8wsC9wMnDydTSzdfV0tzPz9ne3vt672dZbG5ccn1nduLq2c/T0sjN0crQ39PV6+HibWv5WVZfUUpOTEtVUkhLTUVJTEdKT01PXFdPW15VaGtQWGZaVlpPTVJKSFJYUVtdW1xhVVJcV1BdaWLs6u/g09na19naz8/Z0M7O087T2dvd69nX5d/d3unc5fn3dl9rfnV57O/t0M/VzMvUzc3X2NXb6NjX3djc7tzc7d/X4PbtaVVaUkpQV1dVTkZFSkVDS0Y/RUZHS01ISE9RT1dQT19mdu7n7ffzfHjrc2F+4OHh7evn5+Pc09zm5Nvc3unp5tfY19HY29TP09bb2fXs/vZyW09ZXlhYWl9WYl5kZWBc/uHY1NTQ0szPz9HW0sfGxsXCxMbEycvUenvi+v356O7+bFpbXFBRUlFRT05MTlJMUE9JUE9RUFdYUU9WUFJNSVhfY2Pv6efb1uHV0tLP0dPWzs/W1NPf19vZ0tTW2M/X5er3bXZdXWlvbnvc2t/Z4evpfPDs9Gxt9X157Htpb/b19+337NjY5N3c3NrX087OzszJzM7Mz9XUzc7W3+Pn4vV3fGRYWWZoaWdoY21pWFVXWVtfX15gY3Xk7vP7dGpydWNaXWFcYmZqaGBeZGxqbv337+j6+3Z2/nV8fHzl4t7W2N/08f33eWhu7vt78fHd3t3b2NLRzMjKy9DS1trW3eLg6d/b3tXU093wdndvdGNpbXLue+ro3+fv5N3p3+Hi5nNr/uHj8GBeZ29hX2VlXmh2ZGNlYGp8X1xq//Le5ejo6P786/twe1dLUU5MTExNVlRSXGRQT1ZUUlNTV2dkW198Y37j7e3e2tfQ0uPe2P7w4N/e3tvS1Nne0M3b19TW0tTa29vf5+Dn4tPX3ODj2t7mbmNoV1NcWWVeXHb6bHDr2tvn8XHqe21yYltnfurq7XL46nRrcGtcXlpVS0tJTkxHUmRbXV9ca2hnTExRWV5aTE1SU1FOT01XWWbn4Hd7c/5uZmNo697Wz83NysvNz9jq49vb2t/q5ent8n57/Hb959PQ2d3i3+XubmZfZfnqbnD6/Or6cF5jY2xvZFlUb+10V1JWZ2NjeN/a0tHY3GxaW11baPjt4Nrf6vleVVJPSkxNSEhJS1BNQ0RLSktVWl1oXl1iWktJS0tPW1Zd6Onk2O1q8n5mc+P049jc087X3dPb387M0MnGysfG097d7O7c6n7Y1dnT1fxvdF9ZZlpUaXp7+vhbUFBLTVlRXPV1Y1pUUE5MTFNbXGzm2tff9uj3cHT4dWBkbu3b+HH9bPt79Hrs3+Ph4mBbVktIR0VFTFBXdX1cbP9cXmFUUVdUVXRrWHVpW2NgXG7p69zN2ejb5fPub37b19XNyM/QycrOzNne1tbcz8zTzdHZ4OVy7N7l/d3uY19bUlRQTVxaX23xbPvv7HdyWU9RS0xQVlFcXl1fZ1hfc2Rn9fD67XpsZ2FSXl1RYe/q2tLQ0NXY/f5pW2dtcGr0+Pjnc2x5c3ff2dPV39vgb2VfcHJr8ejc2+Hb4Xzq7nNwdvrm2uHu19bm3Nzq5/N52tbc3s7X5dnd4uPq8N3X2tHI1t3afF9aTU5gZF/84Gtv7WpbYVVp4PRpdWZRUFVMS09MXvDn5tTda2hiV1VYUmDv+/De3/fi2+DX2dvNyc3Mzs/V1tbn7fPx5dja0M3NzczT3e3r7eT+59ri2O308HBWYGNcYllbY2xcZnVyVWNo+uPe2dfS3eP/c2f39+Df1c/KyMzN1tnj2dvc4uPp7G5eWlRPT1lc/HLk29ff7fxoWE1UWFpXXWXwfPf4bGZle/Tsb/jd1t7t4eJ1effq09fNw7/EyMnP2trb2M7PzMXEys/b/G7rfHvjc3rb2d3c7VZQV1NjfW7gzuViXFJGRUtHTFVScNXq6+br7d/qft3de+DU4Nrb7Grt7uDOzdPHy9nQ131naFJPUU5JXF1ab2Bf/HlbaPp3bdbu9N3yXlxZU2/l4NbM2NPK097gfWTs2+fczdTOzdba2uTv29jd09Db0dTicHZqYfPg6OX4XWRjWE9TT1NdXVdpe2zr4u1fZ1tVWFdRVVFPU1dMS1ZUWGh7aOnf6+PZ7m97W1VdXlh58+3Rydff2fVjbXdcaXRm+GtMS0xKTFhaWO3k7NjU8XFubmf/eHfZ293T2OTf+W903et+39/g4HtpaWP8+dvp+uxpbf96dG1xd2Nzc3T/8dvn6OF3ZFdSWlZYW1ZcUVxfUVZZWlxfYFxYX1VcUklGQT8/P0BGT1ZQZl1XVldeYWR09vD9aOXw5uXl4tXPztLR0dLO2tzq6ff7aWp2cGBodm1qW2j7737p8nd2eHd77vj9eXBpbGNeZXZ2aFpPUk9OTVlhZn7m4OX7ZXH09Hfr9Onf29/b2+Pe4evw5nd+5exeVE9NTk5NTVVPUlxgXFhVUFxeU09NSUdHR0JCRUVKTk9VX1783tzp7t/s3t3d39jW0srKzs/O0MnKztTW3efq4vj75fZ1YVtSVlVk+/peXmllZV5dU2RjXWv/Xmpte+twYml0YGn1fVlm8Glu+u158t/R3eHu/e3mdP3mefbr4Ozoenj262Zra1haWVtTXlVYZ2NVa3BgaO/yYm5ZU1dZTVNOSUlPT1FiX2Lq2unY2Nzf2Nra09fQys3Yzs7X1M7Y1dDb29fd7/ZsZmpmW2h+av7zY11wYGB59u/o39/b6Xh06Oz15ePq4uf13t3j6P1fZmRbXHBsaPdxeuPvXm1tZGhxa+HX59rR0tfP1N3V3/fk3vb29l9ZZlxeeujl19Pq3d9mVl9UTk5PUFtcVF1fVlzz83rY19nM0Nbe3fTm39Xaz8zQzNrX09f149jb6OXf5trd193n6ezd4vPzd3Lu5ejw7+v26PpvfXXz9OLa3PRw+uhwa/Ht8Ozb3tzo8O7vd+/n8enm5vJ0ZF5hbW/e2dLOy8rKy9vm621p+PLv8+3s8vV1fPnw4NXd8vNuX1VYTE5QT1pmX1x24t3P1NXZzuPa5d3v19ze2NfW1M/p2tvm797m6OPe2tPteOjOZd7W6tLZ+2d1UlJaZGx0bPHh9Gz373l+5eDq5uDe6/Pi3O3x3tfV1tLW2+Hs8elsX2drfP5uW23ubuHW2dHLyMvT19re7evY5l9s5vDs7vLs5Ono3nJdX1hadWpbVV9eZ/1aUVZbX2dncnFpa9vT6nLv7+TW1M/T3N3b5G1xbm3g1tje2+Hc0+H483T44fdfXFNLVF5YVVlZYW5vdPB0YXx6a/3q++bc3tzY3Ovg4+La6vLmdF1eZVdYamdra1tYXWNg+Ojy3uN79ez3/nz259zd19Lc4+fz83xaVFRbXVZXWlxYUVdaW2x+6vd7bVVaXlpjWl725ujh2+pnbGpp63FbUl5nYFxdaez1/OlkXGRs7nZrWk9XWl9bU1VbaXzl3uHo6OXf3fVte+nZ19LS0dXT0dDT2+rh2uLyVk5LUk9LS0lKUVRSWE9IS1FQVU1IR01OTlRTUlRUVm9+a/jj6tfa8Xvn3+rc3+DSz8/N0d7p5fzi4WJaZHpv5dvh3uBy7uNvcXlcXl9QTEhNTFJaT2JlYnbee1ZVTElNRj5BP0NJVlFWW1RQX2Nd6+nu5Nvn7N3Z3NLNysLEyMbByMvKzsvN1/D05PDf2etsXVNMVVBJTEhDRUZFRUlLSE9PUF5eTVJSTE9aTk1MSElKUlP+63Ds7G373fv57WdeevNs9N7q3c/NxMDFw7/EyMPEyc7X6ujd3dzU3Onhd2vj819lUk1PSkdGRD4/R0RIT0tFREdFS0xMT0pLUl5179ne6drd4NDU2dXV19LS0tHOzM7HxMTAw8zU1+bn2t/selxhYnR69N50Z21cXldRVElGR0dLRkdNSUtXXWl6ZllhX1RaVFRRSkpJUF1Wbe1q9Ovp083Jy8vKx8THxsbEx8S9vL6/yM3Lzc/R09zo7fpo/Whub1VNTVJMUFRNSEZGSUlLTlZgXejV1tnm/PHs/3f15HJy/P7b08/Mz9DQz87Qzt7/Z2J1c/ZhY/n/7tbX0NHe4eXpffxvZ15hbO/f3NXd9HFzef7y9G1lWFhlX1lPUVFWYHHo7Gto9Htu7uXk6tzUzsXExsbM0M7NzszL09TW3tbPztLRztDRz8/R2O/wbVxdXV9TTlZVaOjf19/h6t/a49zvaHJYXGNhYVZodG3v5tXU5N7l+2pkXlBMTU1XaPje6ft7+eLp4OZk+3Jz7u3ffuvf5NTQzMjMzdDS3NzS3enh5N7X19PX4nlra2pra1dWVlRicfH+++7s2dLQy83N0trjde1zYW7u6dvPy8jJztLQ1eH2ZlhYVE5TY29q/fB85NnT1dLO0tTrff1cWGFlaHD/7eve9F5ocG5oZ15VT01NUUxMUU9VWm9wbd/ufu1fZV9cYXPa3NvR0MfGzsvLzNHa2Phy/Hbd2dXV4Nze5Oxs6m5UX1dVV1JYTV70duTm29Lg3Njb4ufbcV5zZ2r8dnhfZXfz3+ze3uzb5F9ZV1NJSVFPWl56637u3+Dn5NvybfDz6+DW097p5ebc4ubmbWZsZmxsY1JSX1xZWmBhUFhgbXdiZVNNT1RYWF9nXGD569zT2Nzj3tne5+p3YlRcde/n5Nve4NvV197vbVRPVFxrXmFkV2P2693p6ePy6vH+7G1lWk5XYWJdXWxfY3vr4m1eXFBQVVlSSk5KSFBUZWJaaFxnfn3t8uj0bv7y3tzd193j2M7Lztjgcmn36eJ9+/Bn+eTp5/rxcWJmZV9YWVJKSk5PTlBfW1107eDi4H5hVVVTTE9QT05Ucfh24uT78/H/XWNqX1tZW11YYfhkX2ns6uLY3e7ycXR38upfXl9pcWru+WNub2xfYftiWFdSTEtLTU1NUVVXXnNfT09RS01VVFRZaXjp1svIzc/N0t3U0trW1dHc29jd19fb3+7d1tbj5d5xcO77XVZYU1Blb3D7a3t0W2T0cHtmXlBPU0tNU11aWG13eGtfW0tIS0pKSk9OTVz56+fb3nJra3bw3Nba4eHX293b0+dw8+je19XV2tjY4d99bFNMT01aYWdrWl1ZVGJ04/lfXFNTXnF1evzm39LM1dzq7vNideHmeHbq5dLN1dLf5eL15dTO1eDk8+rc2tPb5vv16dXN0tjY1uDd4HxuWFBPUV1fZ2BYWFdcX11XSkZIRUZMTVFOTk9a7N/zbltbVldyaO3m7tzVyszQy9LQzs/LycPGytDRz87U2tnd/e/k4d3e5X76691sXWFYU1BcWlZvbGl4be3t2dPjZ1VhYV/u5vN6dO3w5ePt+vns631t8G9daH7o3NTR2dPS0c7LxsjO2Nvc2M7Q3Ovp3d3Y2drp93lybVpTT0pIRUZKTFhPT01LXnnj/GRdVmX959XV19fb0M3KztPW2dbO0tPS2tro5NvY2OTd5Pjb19LW3tr3dO/c1O3o6v3f28/T29Td6NzW3mxdWFFVYHVuZGlrWGPo63BbaVpWW19uXF9bVl114ur26Xv029HT4Nzc3t7Z0tXW19HPzMfEys3N0N/x9O7k8vPw5Nve4unk5O7r3up9YFNTV19hYl9YX2dn7v79fmJ0dvb8c+r46fxs4W1lbV5nYHjpbvNnYWxo3Np64+bk3tjL0srK0M7UzNF16+Ln7vTQ3+Lb5djw5d9ZV1ZMSEVPS0ZJQ0ZFTWxTTVZTUFF5d1RnbW79eNHa+OTk3uTOyNHOzdHc3svO53j55u7aztTQ0dTb3MvP6ml3+nzo1tfb2Nvsa9vW63FeWUxKV1tXVk9MSFBcUElGSklLU1NLSkxOTlFcZWleWFJOW37p5+h1cHrd1dbZ3+Dg2drUzcjK19PSzsze62lg+HTw6uPlXF5oZ3Vsa1VISklNWVxrVE9UTVxoXlZIU1pPWmNsUU1WT1lncnhPUFtTYe/c6190eHXazMvZ3tPUz8jCwcnIy9LPyMfZ5dzl6dzOz97qaF1WW21TSkQ+Pj5JTEZHQj8+Q09JRklISUxf9G5mWlVSW+vpc3RfV17+0dbb2/hnbNfQ3NXgdXvmztDQ09je3M7M1tjlbnfg1M7N0NZ3XHjh631sU0lNUVdaVlJKREdLR0pJQD9ASU1PVk9PS1FgY2tlXlld8OLZzcvO3tvQzc3Kyc3PzMnFxsXGzdDU19XV3nlq/P733d7j92lsX1laWFdOTU5RWFdeXFZYS0pLSk9MTU9NV1phZWJjYl1dYFtbVFhPU2By8/RqXl/39ufc1MnN1M3KxMbIydDOzczMzs7Q0tHPzM7R2/VfV1pWUVRUUFFOTVdcXVhIQ0VFQkVJS0pLT1BZXFhZTlJqX25sb3tj7tnSzdXX7eXS1czLyMbOzMjEwsXH1OLV09DO1tDT1MvIycvQ411bXFhXUVNQVF1kal1zZkpJSUlGQEdISUxQXFtrZFFSVFpaVWFbV2b12Nzc1vfv4ebZ3c/HysjFwMPHxc3Q0dvb8d/a4dbTzMvOzeFnX1xcT1FUUFdrbmJfbWJZUk1OSEZKSEpaYVxYa11UXVxlYmRqXWZ52tLZyMva3OHU39fNz8nFvry/vr/BxsrJ0c/O2tTMxcTLy8zX3vBjV09PS0lLU2FcaX5kWk5KRERJQ0VJTl1aZGdkY11gVl12XGFw7trj1tff3+7tXVzt+O3W0MrIwr/CwsXK1O3b1d7V0czLxL3Eyc7Q5mTz9WRnbf1dZOl+bmhuV0dLTEhER0pFSVBZV05UUEhMWF9faez39czDx8rKydTZzs3Lx8C/wr24uby9vcrX0tvb3N/le+TOztfk42tMS1JMTFZOTFJda2BdZVlMS05LS1NWUU5bbFVbX09MSVBXUFtbV110293c2f9nW114d9rQzsnHvb2+u77CxszLz8zJ19LOy8fKyc7a7WNlY19rVk5QVltQWFhMSENBQUNJSElPTlNOV2BTSkpMS1j8dmfu2NLQy8nN2d/ncGffz9PNxcPEwL2+wcjQ4PPY0d3c1c/QzcTG0uZ5aFZqfVxaVV1ZUFhcUE1LRz4+RkZDRUVHSUxXS0NAQT47QktLUFx77t/N1+b2bGJZbNrd2M7HwcG8vMHAw8zS19PS3d3b2NrUydbg5WlbVWFsY2tbX2RZdmdQT0lFQkFKSElNS09OT05HRUBCQD5ITk5UWHjg28/m8HpVXVde3N7Vz8vBwLq7v77Gy8vQy87Y4fTe7ePW4+toW11WXF5dXlJXXFNZUElGPj49PUZKTFBYZGBgXVZQS0pHR05eXlVl5Nzb2t7ucF5dW1v693rYz8zKx8XIzc/Y3OXm2fHu4Ovf19DP4Ovq6Pn5435saF1fV1daTEtIQj49REhJUU9VYFRTTUZFQD9BTFhZY/vd0s3MzdDS3ert49TW0s3Lx8XFxcXJy9LX1t7d3uftefDg6eN9a2ZdbvT45Oj4ZFxyXVdWUVRKSU5NVlpgaF/tclNSTk1GP0NDSVFSXFdlfmVtaF9USlBaXf3e1dTMw8TFwL/Ay8vJzczO0tno2tTWz9DS5e3c3d3T2/1kXF5XUVVOR0ZHSUtf9Wtqa3twYVlWT0tISUpPWlpcZuvk+vzuXFdST1Nade7v4tPLzs7Eys/Mzc7My8/Y1tPOycnCwsjHyMrIxsfP1t1+bGtsYkxHSUZISlNWVlZQT1BSSkNAQT4/QUtPTFJj/uXi6nRbe2NYYvvi5OHRy8vJx8nNzc7W1svO2efr4+Xa1dPV0s/OzsjHzNLS0uDq4ur1a15fXWt9e+rm7ntgbGlNSkpHRkNIS05cUk5VavpiU1dfW11peHvp5dvTzsnGxr+/xMTJxcjKyc7OzMnGzczHzMrIxcXKzdHZ7WZnVk9PSEtNTU5PbnVfbFtfXk5RSUBFREZITVdNT1RYdWFYXFheXF5vft/q/eTaz87NxsrIxcfEx8fJ0dDRzMbLxsnOyM3MxsbK2N7vcfBua19QWVdbb3nh+WJpWmBjU09FREVCTFBUW1JXXGHo721fWFtXYXHo5/XvbPHNzc7NzszMwsHGwsnZ3tfOzcvJzMrGw8LBwMvU3nLu/ndrUlFMSU5SYFpPUEtNUVBPRj8+PD5BQkRCREVIT1txa11iXWtz7Nrq5et279/Pys7Lyc3Kx8bIzdro39vWztDV08/Mz8jI0tje4/tx3ehnX1tZVV/+eWx86vdk7vlWTEhGRkVJSENDRUlIVmdSTVBVUktRWVRYWlxUYeDZ3NHMy83Jw8bHxcbMy8bHycrMzM7Pyc3X1d30bXp7XFhUT0pGR0dHTFBPUE9US0hHR0hGQ0RBRkpGS05XWlNWX1taWlxYWm1cXWVnZWbq0tLP0dbe6t7f4NbT3enh2uLb1NXZ3NjR0s/O3f/q5Hd5e3ZVTlZefend/VRaWU9QTE5FPj9ARUhOWUxOXVpkbfX7Xmhy/d/a0N905u3f0crH0drY3tLIxMzd1N3l49/d7Hr+cXbu3OVbWFJPW2ZfVk9MS1Fm3t54ZFdMTVxnVlBNSElOYG5gXVFQU2Ltbm5dTE9V7trv52ZbY+zO1NDM3uLe0MfLytL5ZG3b3ebX9mJt6tDS1NtmWlh9615sVkpKU/rj3+JcTkxd92J8e1pKTV5r999sT01b8O3Z2XhXXPHXzsvS9F1919rXzc7o5dbQysHDzeDb0NLOycvpZu7t4NHP5FBJUFZaUE1LRkpNUm3xcE5FSU1YX1tNSEpITGji23FQV2nu29TfaXHr6dPMzNpxY2rx2s7K1/P85c3Hx8zU3fz65NnV4vFub93Uz9Lj6mhs49bVeml2XWzf4N/9WlBSX2zzaltaSUpba3pqXUxFU2NeYllaUVB23dbn6+pj9tPLyczM2OXOxcHCxsvc4djPzNLQ3nXv1tLY3OJeWmh85/lqZVdV7dfa7u1XTlVj5ODb4mpeYPzd5d5nT09QXWBdVktNWGnp++huWWtw493m5mNdYm7W087O7Obb0srJxszU2+XY1dnga2l4+t3e2Olv8OrZ1dzqX1RUT1NYbG1aW1dl6efa6G9qVl5fenBXWVtgfebi5nv68+Db0c3o8/xv7tvPztvg6+bY19Ha6ONtZnf27WxoX2vo3djd5eNzc+Hn815RU01QX3Dk8fl6ZuDX2trtcFtTWV9nYFhXV17w6OXf2uD43NHT0NnwaF707ePa6OVma9zf2uDmclhyZ2J5XVhWUF5zbvT0bFhm/HDs3G9VU1Vd9tzl3mNk5+jc19nuXFtcWWppb19t5ufY2dHZ+eXj1c/a0v1c+fzYy8vM4enu3c/d0+BfXE9YXmZ0TlVbV/tjXmVQVlVjd15jTkdLSFNmd3xbU1Ng2tPR23RnV2Lp6tz6Xl9e+uTf3+zq/ejV1tTgbWRn7NzT2utzYGHk0M/W4mxZYHfn5PBeWVlf7+b5bmZbWWzn7m1WTEtMVF5iXVtUUWXg1+D+cl1XWF5jWVJLTlbi0dfY4ODo1snEydp5X3Df3Nnc5eFufNnOztnqdmVt9+HeaVZOTVlfZmNYX2Fr4OPraE9MSFlmcnZXVFNRbePe3fJzWFRWUVRPSkhETF9t+nL2bl1mX2tyWVBRWeLc5On27HLn0MzGytnhZ/ZuZnRnaFhe/erj3Onu+vPj8ub0WlBPWVxjb2xpXmvZ0M3O199mYFhTXFtWUlNcYWbm7PB5bXVdX2JfWlZjcOnZ29/t7Nrb1dHa52tubXfi2tryZmVjb+fs+mNkZmV4dWZTTU5MUF9u6Ofw3N7Ryc/f+G1pVmZ6bGBWXGT+3t/o2uj5XmPuZVZOT1ZY59nh2vdsY2nb4nX+Z2dbY9puYGRZVE9kb1p29mxfc8/V3eHueV7q0/7f1N/e0sTGzc3U6mJe63Nu5/pcWtzbfu/k+mds3t/q9XhsaNTL2tjP2vv61Nnf4+fvW2rr/XxnXE1FUVNOUVNfVF/h7vhqXFhSe/B6+Ore8OLJy83KzdXu8et9cmljX1Vq7GVjaWVbXXxua/d0aGnp2u3u5ebq39jZ59za7+nZ2tjW1/BmXlhhU05TUFz45eT07GZRWl92aV9wbXTi0s3Z09Ln4ODX5XLralxubury59/+39nU3fzmZV346NTb3tru3+3a0NzP2ObX187X39twaWVgXVBaUklVYvPZ4Nnna2hfb2Bt+Ftr59zNz87S4uXy7vdob19cZVldV1piWFRUV2xncGRbZ19q5tvV2N3Z3drZ297o2drcz87Z6P1+Y1hfZ2xjW1tUY+zh5P77dXXq7ePn/Nzc0MjIxcrO1ODb1OLrYlpaWmVfdmlZUEVJT09YVFdQTFRXcu735f3q1NrQz8/O1c/MzMrP2P1493L1+mVWSk9WWWFfX1VMVlxs4uvhd3vu3s/MyszU19nY2dfS6fT9/dvV0utZUE9XWEtPVFJSSU5m6nJTUlhleHXl3Od1XGje0NHme2ddbPvp2/n+b3bc0NXsb1xeZn3f2uHvenjj1NDT1uL0cObd6ONpWVFRYnJ96/ZrXV1pcv12XWF05tjZ3+p6aGR5efDn4O1r6tff2+dnWVBWUFBdV09OTlhsc2JpW1VeY2vs7Hht8NfUzcvJzNTZ0dXTzdx7a/l7/OrwX1JTWVZVWltOSVBQVF5pbVdXWmvr39fc3dfUyMTEx8/X5O7i6uDxXVtbXX50Y1pOUVBPTUxPS01SVnHo193r7XDj3drO2N/l6N7Y0tTo82RkcPp2amBaWFJVV1haXVlcZl1ub3Lr7efVz87Y3dja2tje1dPb3WFh7vNxamNrWlNSTVZaXmFZYmpnXmP89u7uc29qcW5qbnN77G90XmP8+X5oa/91ZGxaXVtaaV1eamp6bXfwe+Li7vfw6+n0+une4ebs4tnPz93o5+39fvTZ09bU19rX3d3p+fJwd/tt+X5pYltecF9kXFBZUlBSUk9QS0lHS1ReaWJraGJv5dvY19bX0dHUz9LSztva19na5u/uYFdKSElFS0lDSlpua27k1uDe1tLO087O0szIx8rJw8jO29nd/mdRS0dCQj8+QERLTEpRUVFYTV5hV3FqdfNy2tHU0dfMyM7HwcPL5epeUlFPSUhPV2vx6d3l7uXc1tbY3nNZWVxkZF74/Grl2s7Lz9xdTE5RVFNPVU9VaPPZ3vR7X/3a2M7Q2N9zb2b+5OnucHro3c7P1+9ZU1BTU05PUlNeZ/3b0s/X083O09bW3/5973BgfOx1cu7X1+d4ak5IS05KS1BUVk1RaHvz/Ohz7Njf2Nvm4vTg2+TX1+zo6trV29n5XFNRYVhPWlNNTVRjd97T1tvVzdLPztPW7uXc7NXQ29/z5+Hl819UU01HR0ZMTElNT1lj7tbZ59vb18vJxsjPy8zRz8vFyMzLysvM19ngaVdLRkA/QkJDSVdbZ3BdW11obGry8GNZUlReU2z179fUz8/d3d39aGhhYFxsbl5ldvro8W5lW1dnefPm8ev+a2x0793a1c3Fv8bIydXQ1NfR3N3Z7OnY0s7Q2tx0a/9z72dYW01MWFNZX1heXF/j5m1fUUxKSU1LTVleZV9h8/fm7PPo3N3Vzc3LzdTX3dXLyczQ1MvMztToelZJR0BDSEhOS01YW2nv5drc1M3KxcPEx8vNzc7MyczTzs3R1PptWElFQj49PT9CQklNSU5RWm788Oz87enn29ra1+Xf6Ovg3drX2+5oV19lUk9MT1xq2tjj3/3p6PDMy83EyMzM0szP4Nze6Otp6Nvs0+NjfWfv6VhdU05XU2RsWVxRSlZZbt/z8vt67nPz2uXf2ufk5dnMztXuX2BTTVJOUFlYXGVfb15ZWVpmanrh5tzd7efk1M7Qzc3S0dfNyc7Z+VlWVldZXVpYUlZSTllWUE9MTlJWX2pfWVhVXl5lZmB3cnXv3tHO0+X/ZGFeZG5ma/x769rRycfIxsfFxsjL2PH0ZVxiXFZXTExOT1FSZWRXU1lWVlJMVFBPa2f05t/Y2djOzc3Ny8rO3NvZ4u9rbl1UXV9cXFxfZVBWWlNdXVVNR0xPTllf9ntm/N3Y1s/MzNjb1Nvk3dvbe3nm++Xf3+NeYXBXUFlcTUA+RkpMTlpoVFj37ODZ0c3P2czIysbJytHg19zf1tjY+l3t9u3uX2hdT1hWTk9QSkZHWmJQUFpqV1Nld15m7nhfXXHicWzq6Hxi9dLe6e32Z2Bn7e7u2c/Y2NfV1dnP1N/Z1NHQ3N3O2N3b2d5xYnxhYnP3/V1TWFNLT0lIRk1pYVpgWF1YXuHX19fb2dDSzc/Z2N3cz+jm4HXxVExNUldLQ0A+QEZHSk1NVldYfevl7+Ld3c/KyMvMzc3S38nAv8DO7HhZaF1UWltkX1pkbGdcWW5iXOfk7O73Z2tfZe3g2ebc1N7n7l9SW05VU1NnYvrX193d1M3U2Nfh8GNiblxgbF9YUUlLRUdUU05NQUVGQklOUF1t29Paz8rNy8vAvLy5uL3Bx8rLzsTAytHazMnV4vhOR0ZFQjw7QkA/QT9HS01WU01QTVNZZ9/i+Wpy2s/Wz9HKxMDBxs7j63JhX2fs3NjgYlpYWmd2enN1b1xZbG1yevvr3dTO0tPR0dd1aGlk9flfWlpfe+rZ19fZ6+be5tzd4N/qffBvXlxeWkxKUF1rXVBLRT5ES09TV2f59tPPzsnHv8HEv7u8vsHEyc/OzM/O3O91XWR6W1RQSEE/QUBARkpPT01QZm198unyfe/i5PXx6WxuZ+bY4trR1dfR0dna3tva3OnZ0NDXz9Pa3Nbb5OLm721iX15jaVtUVVpWWllv5+Xbb19kVF5fVFhTW3p34upu8fJz6/Dh2uPf5/nk6uXa2c/dbf/s3tXvYlRKSEdGSUVGRUFHTVZfYPn0b+HZ1MnLycLGxMPFwMLBwsrKx8zQfFhQQkE9PD08PEE/PkJDSk9QVWpv8NnQycvGytTOzMnDycrIysTG0c/d9fRkW1hPWl9dWVNYXl9qbfXpeFtdVldXSkhEQkZDSlBb7vZVVVZgdV949mjn08zBxMHAx8zLxsHGyM/d3/hk+GBfW0tJRklaT0VDQD9ERlJQUF9WWvvxzszR0tvd1NXKyM3Cx83MzcTL2tv3fODb5vlWTklDREJHTklKR0dJSEtQSUxUUltXZt/u7PR23NDOysrNxsbKztHP1uvtXE1UWmzzYfRvYOHd2Nf83f5dfO7f13To4HPp3M7FzMnS5/rwbe5aVV5kcXR82fXz4uje1dLFy9fO6fN6WV9dTk5IRU1LUEtBQj0/R0NJR0FJR0hZYX35auTYyr+9vLu/vL7CwsXExtfVzMnHydDPemltbGhUU2BSTUlITk5JSkdKSUpOV11sZ2pgbuzl2Nvq5N3S0NLNzsvQ3O7r5dne6+vu731kXVteXFxfaWlxXlZQU1diW11n++Xl7G9qcXBlbmNpcXby6ODT1c3OzsvN0dHX0tPX2uxv/WRkV1VXUk5aUlBPR0tIQ0tJVnB239/p2NbRyMC9vsC9vb6/yMTM4NPR4fFecFxZWFlYT09PTEFCREBDR0tMSUtNSktNX2BXXWh2a2d7a1p73trYzsK+xcrJx8XEvcPMzsrFxcrIzNrq49roZ2dVSkdETExITU5QVE5QU1rk2/b5bujubObc4tjYzc7a0s3d9Grf0tnXz9foXmFuW2zg8FtKVmhWU1NWTEZIUEhDSlBOTFNw9eDUzcjJx7/Dwb29v8jMzc7W19Pe4ezcbl5WVUw/PD0/P0NMSURFTFZcfdHMztLSzM3NyMnNzMzP3Pbe2+Z+Y2R9aXF7WVJbY2RleuVsYFBTZmrp1edwZVdXVVJUTk1GRE5PYXRhV1ZhbvHo1tTOz9DLzcvIzMzLzszP0M3c4HlcX1ldcGdVTkxQUk5aW1NIP0NGR1djZVxQXW127uvo6XH/6OTbzs7R1svExMjHxcXKztHc29zjbVhSUk1JR0VEPz0/P0RLUE5KTFJbX2zo331wdt7QycDHzc7OzNHd3OV0Y1tjZ2b7YFllZ+vleufuZ1lPV2xz731pdGj03ezd4vTyZVhietra59ja2c/Py8rNz8/T087O2337ZllZVE1IQUA/Ozs8Pj08P0BCTFdgWlpse3fx18jJyL/BxMPBv8bOy87b4t3O1uva2+rj3NXgaGdsX1de9H5XWF9RUFVlWlRVV1FMS1dbWllkXmb+2NTe6dzg7dvT1dTOydLb2c/W7HF7cFtae3ddWV5eVVNkYlpbXnlsW3NqYF5kdmpp4dnka1197/nk3uXi3NTS09XV6P1x9PBtfODo7uRmWlVVWU9LSEhNSkxfXl503+Dcz8XEzc7LycvLxMPO183Ky87Kz/VXWF5VTU5WTkdMUk5OTVZUSklRTkxPVVVQT1hZW2J89m5fa3dhb+zk7t/OzcvIw8PJxcHF0NjS1+v63t/n4t7caFNbXU5MUlhOSE5ZXFpf7nby2MvM193e4+zq2c3N1c7Y4ebo3eD2fGxiY/Hd1ehyXFhWWF1aXFFGQEFHSVRdZldMUFdjc/Hc/15ca+DZ1tDNz87KxcXDxMnV9u/b1Nzc2vtcWVlhb/F+fGRZXV9sZWT05+3g0crJy9v1XVxoan1uYV1fZHnl19bc4N/i4tnf4P5gddvY09Tf71tWXFpMSUE/ODg7PUZNVF5eZOfb0NDVzs/LxMK9ur29wcjDwL6+xsnZb3BSUl9bW1JKWFNRVU1STkdOVlxoX2RlWWt69t3h2nRTXHNx9f99/Vv53N3W0cnG1tLOzcrV2t16Ymh993ZlaVZFRElJSUlPT1NNTE9SWWFw3O7l09LNzMzMzdHPzMzO7HroXFJPVF5UUlppeHPg2u9jbe9oVVp09mJu7tjT2M7M197azNn5693tae3k5PB35NrW2NnZ/lZcZW5nYnF0YllYVlZQTE5MSkhDTEhHTFBdX1vr6X3+29bgamVwXWBod+tu6MrIy83Gxtjc2Nzb6tvP09rP0szN1szR+e3/eF5LSEZBQkFESEtOV1FOTFBYbePY087U29XT09nXzdbg19jb1NTY2fb7YlxbSU5SQz4/RkxNVV1WVVtp/+3r29rcfmX3/vnf2dDO0dLh8eDc297i39ni4dna2eXsfHz9ZXjuX1FNU1lSXndsdG9gfvF42d7saldmaFps5dXO093b3eHe2t9uX1ZUX11w/VxoZlz9bfLX2XxmTklKRE5VUVZKSVZOT2r26mpkcPp649HQ2+LZ1M7PzsfM4N7dz8rJxMbS4PlkX1Zae2FRS0dJTVRqbvb1bmx27unj8GNYV13u2eHa0vb+bXrW2NHK13dv79nZ3NPO4WlaXFxVY2RTSEFFSElMUldOREhLVGl0ZV5QTVtn2svKw8XP0M7Q0crN0NxuXV95/uPY1ONoX2937eTxeVty3e3V1dXOc1rt4NrKzNneXXH2a93Sz+FpVE9NTV50aWJbWFti7dHU3nFPTk5LYF1JRT89REhT5Op2eV9W/m3g0d7d++rl2tPIx8nLzM/OztDM1/1eX1/v3tHJ2WlpYHTg1czS43h6cX3q39Dcel1QTU1QVE9TSkpNS1Jo7uX6Xm9xcdrS1NR98eDdzsnCwcrZ5GxdeepwZFFITEtKUGt87HlaX05Z6ezwaltpYm/bz9PYdVlWT2rY2t7tYfbg3c/IxsjL6W9gZ9zf393x9uXt7tbQ4+9VT01UcG9nYFBNVlryzsrL0e/+5drFyM/U3f1pZ1/g3H71V0pMSlJNS0tFQj9DSFNhWVZJRE5d++Tl1d/t/uLdz8XIzt3obvHd2drQ1dDRz8zHxMfP3O1wbt/g6W5aT0xZ+uLe92lXSUVNYXBiX11bdP3m6t/Zztfg6uDS3OXh6mp+7PF56+vqY0tER1ZeXmViV1JUUVjq5uFsVVNRaG1ZYnZ5cvTo8dLP091hXmPi3uLU1OhtetrTxsLH12tVUm/+6upkWV5l7eHXztxvcP1229Ti3OdWXuvt7tbW2+xPS1BYZm5oZl1VX3Zx7t71YVZRT1p5aF1eWmza5fXo7GFPSUdNVmBsX29pWWLy79rKytPqa/7k2dLUztPYzcnOysjO5m5gX/L0fGhqZl5o9+fdztjuXlVKSlVt+HzpdGJhaezQ5XBhV05PZ254a293383DwMDL5GBZVVjr6ntgXlBMT1Rc9XlWTkpHQU1ZXlJWXV9zed7Q0+Zv/eH32c7Q5/B9fOrtz8vYfmRXUlJk5ungzcvMzMzEwMbP3fv/aGfj7GR6dW3o5tjP7VNJQENHR1VjXWJxY3no0sjN3fddWFZMUVhOTVRPXFxk52RHQ0JAR05p+11bbGP1183Bvs7e6fZ4ed7W19fJx8rJyMXH2/J7dH1v+3z8aHjn083Fv8PaW1BLQj9FR0hFSU9bY/PY1m9ZY2hcVn3s7n3x3M7Lw76/zPpZWFVPZmFWTktMVVNZ8e5sW05NVlBcbGxq8tvMzM/HyNT+XVlWUFhgWVtgW3jc1cO/ydp0XWJcaePc3trXz8rLwsLM33BrXlFNTlJVUVl82d3XzNnzbllRVFlefex0aW7l39HFzOZsVU9KR0lLTElNW/H03c3PclJPUk1LTFNdUFrv4NHIv77N+mpYUFBKU2hba9fMxb26u8fJyMrX8WlYW1VZ8dfVy8nM3WVTUkhDREZRVEtb7uvTzMjM1nvtaV9dZ+NgXWbc1dDNz+L+XVdTTUxMV1hdbN7d2s3L0tr9W01ESUtLUmFh6e7o2tDU7V1QW1VMUV5o9OzZysK/vb3AyeV8bFFYd/Pf+Wh62c3FydnabFtRSk9aaXn+6t3NysbI1uV2X01DQEhFSk5ITW7m2NDRy9PtXkhHV0lZcF1b49LW0dXV5v9WTEhHSEtPTlRx3N/V1c/Rzurz8uDX7NTW087LzsvIyczI21lUVF5eZWL159nX4t/Y6OpvTU5HRUtfbG5x3+D61tLb2HFIR0VCR1Fcau7b0c/IxcbFxddqZVJYWk9SXXfz+fLma19bTT9BQkxUUlNWanjp39XS0dTrUl99cuzr6tzT1srLz83N2mhQW3xmcWRb48/Ty8XCx8vN3nFlXVZSWFZu3ez84Nr27el9ZllNR0BBRElVWWre2OPZ0tn1XFxaW1VZXVZSUl1xa3zedlRNTU1fYmd6Wmhv/d3b1cnT4Wxedubic+bk4tzPx8C+v8jYfV9dZPZdfPZzb3vn3tTV4FxSTkpKREBFSUVOW+rb1tDc2+12Y2xqbWx+eXPt29fa2erd+WVXU1hWVF5bX3VgY2nr+X1iWFlUXF9oZl5y7ufq3cnKz+JZU05HSE9ne+PY0dPKv8PFx9vf4WtoXVtaYm7t4NLDyc3K1H1nWVBeXk1PTlZgZObm7uF+XGxpVltZUllXZOd37PJs9F5a69psXl1QV2Ft6+jb5X3i8lpVWk5UY05RX/rV0tne9N7S29/Q2dbU/2R73czLy8XJy9De6NXa7ezk9F9XXWZzbGV3XlVX/m5eWl9s6+n16nBkWVdLSUteYF1pbmR+ee3P0szV0d18e3RiWWv3eGjo3dDO1W5wUkZHSVNPT1FJSU9SZtzP19bY7+ja1djPzdPO0NjPw8DO43VQV2ts+uLkbWVda/PTzN/nck5QdPTg2dnn+Nrd69zQ2fhtT0BGR0VNTEhJVVhYY9HS+vFrbeTe7NLb9WFgYlx429f8e2VeWVRMU1xZVFteWWNz5e/w6dvVzM3HwMXLzNLWzcjEzN7n5O3pfu3Z6VpcW1VcYO/rfFtveGxoZ+nyW1tqZHDs5Of6V1le+tnb0d5eVlNJT2J18fFhX31r5eDV327+/mVf8O5kVkpKWmJy6NTP4W5gY17s2NviXVZk7OTSzMrMzc/V29LL0NLd3uPd69rN1Nvl3uXy68/b8Whfa2tm6M7Z3f5iWFJRZmhcXFVZWVhfb2z4fXFbWmJveW1hUFBUXGze293ia1lccN7W4O5jY2tv6tLO1dff7nl66OPp5Ovb1NXSz8/W19/78eXd4/HweHNg7tPLy8/N2l5aWVtXUFVMS09UXnLufd7efHdqb3Np7XVjY3p1euHa1N/8XVpm6/J9c1tYYWBp7vTa5mxeWV1oWFdvZm7t5uDlbuX8XFlXVVJacP79cGbu4tPT1M7d6t7m631n+F9R/OD13ujh3PP87X58b15ZXlxh6m9xfena3unse3Tf6fDt6ujoenpqZXZeV1heV1JRVlti+9/p5+3q3fpvbGdgUVFVT1pdamx8/vzbdVlZUU9MS1BSXWXk3NfW28nNzMjMz9nl4e1vb37683zw09TvZE9LSUVNVU5RXVxp/n3d19nZ0dLO29ra49rS08vM1c7Z5PBoS0pHSExISVBSVGBp5NvnbGpeWU9MUk9QZ2Vu7fjb4d3q29LQ71daUk5TWl17ft7c1N3o9v9+b+Tc39/gcPP3+n3x3t/p7ej76ftrbWv+2+Di6+73efH/+m51fOj5aWzq6vHYz9XqY2FfSUtOV2F2XV5nW1xRVE9SWlxXU1BPTk9aXWrfz9DV19Xr9vXk1s3M1u3f0tTY5uTt8l9cc/pkXHxueeHUzdP0bmRlY1tcYnj85H13/mzk2dHMztpvWklJT0tISU5bX2jm5XV1al5969rYaVtiYGdn8uTg6nx4WlVVXllcbWliVVBe6d3e4Nzj2dXl29rz5+De0MrHyc7fcFteXF5p/uD4ZGZbXHP57+TibF5aU1NSUFZeX2189+bufXZtb+vq8m1mcGlgedva09nf42ldYWVp+d7V0t3c3dzf6+/6alxcUUxKT1ZYWmXi0MvIytTfZldeaVtn6e10bfLZ087Jxsrde2/7aV5dY1pXa/J1XVtSTVBmdvJrWV5YVVVY8dTW1tLe/fbe1t/Px8bIztXQzdDd7vZ0YlZZXFdUUkxJYOzx8GhaVVFUT1dZX3Lh3ujfzs3Qx8PCwsfN2OPhff3d5t90YFdaXVpPSk9WWHrmfvZy5Onr1tTV3PRjZW197NrPy8zNz87LyMrxb2FTUEtHRkZLTFR029jQzd3i3dXa7uXc4u3r6d7X1dPR19bX2vJXVlBLRURLV1VSVFdVT1zq5d3S09Xd+eva09DW0NXe2t/kdd7SztHQ0N/mfnZtYG1cW2JSTE5QUlhp3tzbzs7Ozt3s8eze3+jr8ejX6mz66Nzg3uppaObiZ11WXmt6+mBcWFhXUk5PWnxrWWFkannZycfIztnw6uLo6ebY1NHO1c3KzM/Z3+Dj7fFfWF1fZG7r3NHN03t972RYV11XV1RTUFFkb/ve3dnU3Pju3NvoZHDreuzpblheZGFwZm7f3edfV09RU1plXmJcV1VOU2/g0s7OycvWzs7Nys3b4O9zaF5fT1Necmtl+/f2bmBfau3TycrP2OnufODUzdHf+W9mXWJaVVlaYG1laf31WEtJTU9ZaHBpfHVSWG7v5NzR2fZ2ZV5w7eDm8/r6797rZXltanr5cFhRWFdQWnLm3M7L0dneZ15pc9/b2+pgWmJdbOvf29zU4OXRz97ueHloYm5cUE1MRUJESkxWWllbVU1MUV1+797taW1v793Wz8vNx87f43r8Z1NWVlNWWFJPTEtOW2j46eB4X2FaYPDTzM/Pz9rm6djNzeX9ZF1dUE5KSExMT1hcYnlgX25n4NbTztXX4WJWWFFaXl9fW25nWFdZXf53d/n64eTt3fB24uba3efobF9kW23q9t3hamtqV1ZNW+b25exlV1JWV1dnZ2z7ePv+ZWVod+nt5Njd+WZZVU5XXlljZltQT2JkX2fsamvs9HRg79fXycnNy87T193ncmdwYllmeGFbVlRXa9zf9dbe821UT09dXVts9Xt9dnnq49rU3trO097ucG1t+/1l6uxkZVlOTVZt8GVcVkhHRURLTk9OVnl3d9zc4M/Iv8HBvcHJytjf3ubq5tfga/32WF5nZWdlZWdUTlFNVl795NjR1dbU1trQ0M7Q19jsaWNeX2trY2xvYl1YU0xMVF9fYfV1XFxYT1FVUVdkXFJVXFtt1czLycXDx8vQ1Njd3uHj6uro+Ht7+uXi3dbYc1ZZWmL8evPe3dfS0tLS087Pz9LOztz++v5z7XLz1t96ZVJLS0xTU1JaW1hVUlNWVVhcaGp55ePg49vMyMrDwMLG0OHvfG5eWllQWmJfYWJ02tvbz9LT2fB4amL76tvQ09nc4u3e1NHa1NPU1N/t8/R6en52berxa1ZLUFtZaO1uemxaWl1UVl5aUE5UVVtffN3NysXDwsLJzt3vaXBxbGpoXllRT1liZGlkV2BiXFxbWWd36NjQx8LDycrIyM7MytDZ4/rzcGNw8V74Ulx1SlpeXmTv+Pfk3v5jWU5NU1NZXlhhWGDu5dHGw8PIzMzV3m9UVlJOUlhhZF1n//fc29zgbPd4aPlkY/N2/vn79ejk3vfrz9TPztHQ6W1nX/rv9f9kV1JMTVNOYvxnbWNodF5aUkxTVFNd+t3Z39jOysTGxsbJ0uZvXldVV1VRUlNUWWB4eO/r+Pb2el5ZY2RkeeHc2dTRz9rd297Uz9bW3elyYVpUU1NZUlFRV1ZSW//093Vu73liVU9OUE9UU1NXWG/069/RyMLBvb/G1PDw5Ovu+1xoYFhXWF12evv7Y+9uX1hQW2Rf7t/ZztPTzdPRy8/N2NrU7l1QVFxbW1tSUU5JS1FNUmv0fl9qaldNSEpRT1VVUmVhXnf/48/KyMrMyNHyXldYZXl3Zmt+Znnj5eDOzdfh4OhtWFReZnx+//Pf6O/n4/zlycTJyMjV6mxx/uPb5P3/cFVQUlRRXmVZUFZSSERAPz5HSkxPWF5fbPjf08XBwsTH1tzr8nl9521eXm9fZF9fXP3e4uft/F9eT01c5trR1NfX29nV1NDHzM/Pzd36alJPUVlRUVFTUVJVWWry83xpZVxPT0xLSk1LTU9UX1ZTXmJ91s/Ny83V3ur47N3d497o9Xxv9urz9WVcXVtaT0xHR0lMV2Pm7eHd2NjSycPAxMXLzc/b4ejv7n1tal5jXVBMS1NaVlNQUldLQD9ARk5PZGRc/vXl1MrFxcbCwcjS4N7wY2VyYV1bYVtSUFtmam1kYF9kU1BUUlVk8+Xr++Ds9uHU1NjX2dbS1uT18Ovp2dbea25+XVlcY1lWY2RcVE9IQD4/RU5YVlBicVxn2crKxMLFyMzM0d7u4NfV2/Fu6PR5bWxdV19aU0tOTEhJUGXi3+Dd3M/RzMnKzMjGys7Rztp+Z19bYVxaT05LS05UUEtYWmBdW1ZSUU9TX351cHv679nOzdHJxcjHyMrR2dfT2tTU397p9eri8GVXdu9q/flfW1RXYGne4vjq697c3dTV1czN0c7Q1s/c4HhndVtPT1BOVE9MTUxPSkpMRkBDSk1OU2Fga/vXy8jDwMK/v8TBxMvNztXT4O18XGNjWlhUVVlXW1tqeXBneu/k4vDe2NnQzM3NzsvJzMzKyMrNztXf3XtaWk5MUFBXU1BXWF1fWFBPTUlGSk5JUFFJUmX8+vzZy9HNxsbExMLCycXI1NXc8N/j7nBUWVFITU5NT09OTlj1YVfy9+LRzMTEwLu+vru+wcLM0t7d501HR0JDSEdGQ0VKR05dWFZYU1ROUlFOWl1k79rV09XNzM/O0tHNzdXW19nwYF5aU1xoZmpoa2NjcnRgY15eYWj5bGpv9u3c2NXPzszHwsC+vr/CxcrU4W1WU1ZUWVFKR0ZEQD9ESUdGRUdHTE1KTl996M/Fwb68vsLBwMLJyszU3N1uVk9RUEtIRkRFS09UXn1rbPf4c2vs+/vq2tHQy8vOzszOzczJxsfK129mVEdGRkhNVlZYXl9dV1ZXUU9MTUtHTExISlZhav7638/MysS/vr6+v8HFxs3gb3Xva11NRkVEQEBASUtLT05PWVlSVmDp1MvEwr65uru7vb3Bw8XO3H5PRT8+Pz4/Pzs+QUBKVFtgX2JcXWZnamps6drVy83Uz9zk4dvTzsrK0dLbblxVWmZr9+xlb/J8dHV5fez9a2peVlJLR0tSWV1lY+LX1MzGv7y9v8PEytXnZlxeW1BKRT48OTY3ODo7PDs+QkJAP0pY59LMwLy9ury/vr6+v73AxMrrXFlORkVAPD8+PkRESlZlce/4697b3OLQzczHxcPDycrQz8vLycvY+G1URUA9PkNIS0tUU1FYVlNRU1dfZmZjXU9IR0dKUE5QWl50/OrfzsfDwcC/vb3BxcnL1tz5YlZNRUA/QklKTEtNTE5GSFBs49fJxb68vLy+vr29vr/EzM/rWktGRT8+PTw6Ozs7Ozw+QUZJTV/27uXez83MyMvMy87T1Nvb0s3P4WheVk5MS1BSVFpTWGBmY1pceNrZ2dnb1+RwXVxhX/rk5NfU0M7HxcPCx8bFwcLIz97f8VxQSkRAPjs6OTo9QENER0hIS1N74dTNycPDwsbIycvHxMTFydDW3G9cT0tMSkdGRkBBREZLU19d/d3XzMTFycjDw8TGx8bHysrKzsvQ3+tqWE5MSkpMVE9NVVxUUElGSEtWXW1pZVxYVFNWW2ttft7l6+Lcz8vIysbAv8C/wMbT6epeUUtJRj9AQ0VHTlJTX15WY/7x3M3IxcG+vb69vb6+v77CydDcbF1SSkNFQz0+PTs3Njk7PUNJVnbfzca+v7/AwMDCw8PL0c/X5fX5XVhYWFhZWV5faf91cHb+dPTc2+TWzc7S2N75ZV5bZPLy49zc4+DPzNDY1s/QzcnKzt3icFhZUEpHQz4/QD89QERCQUNMVF1239va0srKycjIxMDAwMHDxcvM1eldU1ZNSUZHRT8/QUFGSE1k69XIwcLCv76/wsK/vcDBxMXIzs/Z4WpVUlFQUVZTSk1STk1JSEhHSU5PWlhYaGtlX2Jlbuzr7eXv6d/f9vfzfObW1MzL0drY0uf36Pb26vpuZGv9+HhnXnH6euze1NPcz8vHxMLAvr26uru+w8bM32hcT0lDQDw7OTc4NzY4Oz1CSVZ76NvRy8jLy8rKyszN0dXZ3unwWk9OT1NQXVxXWl1zbFpaaPPt4tTPzMzJy9Tw6OPt7t/V2t3Z0szNz8nHyMzLyMrP1dDU815cW1hNTUpGQD0/PTs6PUJERU5ebnXt1s3Oz8rFxr+7vcLMyszjbFZYWElEQkJDPkJISUhKWWFw28zKzcvGw8fIx8PBxsnGw8bJy9TrcGdvXVtcV1FKTU5MSkdLUExLTllXT1ZjXVpXYu1vaGFfXVlld2tnZ3f/YWb33d3o297d4fvo5fN+cmpZXWleU01PVlVPVVdmXV/19OPd0MTAvru6u76+vMDIzdbhcU5JRUA9PT48OTk6PEBAR01OUWzZ0tLSzszNzs7LzNDN0vRgV1ZZVVBRTUhFTFVQUl1qfnvq1M7Q0MzO1tvSzcnO3OR0W1r85O7059/h59zQ0NbY2uL3dmpwb1pXUk5HSExDPj49PT9AR1BTT05RVl/x2MnFxsTEy87Kytvt8v92ZFhbWE9KSUxLTlBYZFpccHJ+49PMz9DQ0M/T0crLzszKz9nR1NrY3N/kZ1hbWlNLTU9PTk5VXVRKR0lGREtOWGBjaWJeXmju5Xr09Ol0cd/c7P56bGBj8PPj4+jp/XJ26eVnWFpZVlrw1tPh5+rv79fOyMLDvru9vr++xdXc5u9vZ214XUlBPT4/RENISURDRklKVmdfXGVvffPb1NLU2uP5ZmRhWlhMTExLTFBgXVFPV2Z449DHwsrS2OLj3dzRz9TZ2tjb3+F6am31493UzsvGyc7N1M3HyMrO0NPg7+/ub1REPj05ODo8P0NCRUdKVmbi087HxMLBwMDH1fZaVVBUYWJfWU1HRUZMUlpaXF5aZ+TOys/Oy8fExb68u77DxMvR09LS0+v8ZlxcXmxnWlNLTFZdeefY3OZnWVxeWFdcWVZVWFj88mpiVlFXWGf36nRbW1dVWm7e0tnX0dPV08zM1/VcVldUUVhoYV9aWF9tfefT0NPQycW/vby+w8vNz8/OzM3Z3vhgWV5iY1xPSktHREhKRkRISU9Yad/Nzc3Mzs3Nz9LT1/ZfXE9OUVBMTk5LTVh639fW1Njh29TQz9LP1Nnb49XLzt3b4e3z7OPRytHZ3uTm2dDOzNHe2d3o2tfqaFxMSEhHRUhFQkA+P0ROXG7v6+PR0s/Hyd3h7GhkXF538GBaXF9cXG335flbYn555d3ifuzn4drV1MjEy87PzMrJy8vLz9vZ393R1ORmamxyeP3gztDc5+VvXWBZTUhEQkhEQklNS0lNV2b79uXU2uHs8Hrl1tTY2eX24e3o3ftlXlhZWFthd3FhaHRtauTV0NHQzcnEv7y6vMPIy87U2dfQ2P9mamFcY21rXVNOUk9PT0tFQEBDSExSXG9tZXF6dvPa1elzYV5cUlpiVklGS1JYXGPw3ufm1M/Qz8rL0tjn3d/x7O5mWFlfcuXe2dHQ2t/W0c7Kw8PGxcbDxcjKzuFxaGtfV1JMTUk9Oz4/PkBERUVLVOzf3s/Lz9fY1Nzu/fjuY09OU05MS0xLS0tTZmJlbGtebPDp3M/LxsfMzcrHycbExsvOz8vQ4OLh/V1ebXN0bXDp+m9s5d7o6ftpU0tLTUlEQkQ/PD5BR09YYG5oZXT3aHh4a19dZOfidF9mX01MUVlXWVlhZVdWaGxgaW5vaWru0MrLzMfGzc7KyMrKycjM1d7Y4PD+cWFbZfvq+GZdXU1HSFFXT1ViYldPUFlXW2t5Y2Bm9P1fWFlcUUlMVlJSUltfWGN79O7r399tcPTc2+jk7GpcWWJxbubQy87MyMPHzMnIy9LQysfL09re919abWpfXVpWS0dISElIR0pGQUZNXGVt5Nzg39rR19zc4mxbXWNZTEhIQz09Q0pMT1dbWllc7d3Wy8jFyMrGxsjKy8rL19vc4d/xemxpeXvo3d3c2dze18/Ly9DV1etlZGdgW1dRSUQ/PkNCQ0pRW1553dzl7urj9Hvs5+/8al9XU09NUFBQV1hQUFNWVV5z7eLp4tza1s3GwL6+wMHAwsC/xMjKycvU3O5uXk5KTk9WW1xbVVJNUFRbbnxnYF1cYVtbXF1eWltbVVFUUUlGSU1OTk5PT0xOWGt67eHm6HFfeOnd2NLN0NLY4N/h5+Dg39XMxsjN0NTQz9TNy8rKy8/T09LU2dja2ehwbWRdV1NQTk1JR0dFRkxdZm7p4eXi4OfseWxkZl9dV01IRD8/QENHS1BVW1dYYfHd0s7MycTCxMPDxcfKzs/Q0s7LztfZ2tfX1tLW5PT86tvY0s/Z3u/38HBsZ2BfWlJSUE1OUU5KTFRgcfPxcV1ZVlhdYml2c1tWVlVTUU5PTElJSk5WVlleXmf72tXPysbCwb+9vL6+v8LGyszN0NTV1tvsfnt5ff/r19/k3NjQztff5N/c7W5oYm/2cWZZVltfYWBdW1lWUk5OUldUTUpKSk1RW2JeVFBUXFtZaHr37Obd2NDO0dfd5NvPycXDwcLDxsfGwb2+wMbKycjIzdXg6H1iX2v2+WVUU1JPTU9TWlpZXmp65Nrg9GddVE1KSkpLTUxMSEZGRENCQ0VITFBYYGdpcnbl28/Iwb+/vr6+v8DAwMLDw8PHzMzMzM7V3N7g2NHPy8vKzc7IyMnN1eJwW1pYUk9JRUA8PDw+QkRHSktIQ0dKUFFTVFZZWmNgZF1RTklJTllod//j3+DSzcjGx8fMzMfBvr28vcDEx8jHx8rO0NPX2dba83BnX15cXmNkYFdNS0dBP0JJSEpMTU1NT09QT05OTE1NTExNUVRZYGt47ez46uLe5N3Qz8/P0dPRz9DRzsvLyszQ1tbQztDOztHc6Onrc2BWUlZWWVpcV1dQTE1MT1dbXFlVT01RWVpUUlNRVVJXZGBgaWtramVw/nZ3ee92/t7c3/BuaHXx5NfR09HO1NDS1dDQz9HV1tnR0dng621ocmppXlRLS0xOUVhfYl9cXmhhXW/y5vJqa2tgWlxlYVtlZmdvcHj18fDp4t7a2uPf3+Dc2dnY2eT1+P1mVlJPTlJTT1JSTlJZZW5qavPzcfLh6v1s/fV58fDh4/ZnZ19dZffn5N/l2t/d0c/Qz87R2+bg4OLi3eHsbm/q3eN4bHJwVFFRTUpFRUZFS1BbZ1pTW2VdXGzr93hxeHBeYF1bYlxbW1hhZ/rr7u7d19fNycjLycjHy83Ky8zO1NTd49vZz9fg4e5sWFxoXlZZVlRMR0dGRUBCQkBESEpOTElLSkpMVVxdXlxdVVBVXWFpbGtoaO/h18/R0MzIysnExsfHycvP0s/S1trq/mZ56NfOz9bY2NjZ1tTi82diWk9NSUVBPz49PT9ARUNAQkRCQ0ZJTk5NUFlaXmpvfvLo3N3XzMjBv76+wMLAwMLEyMvLzM/NzM7U09LX2tXOzc/Y3ep5Y2ZmX11TUU5JSUpLTEdJSURDRElLSUhJS0dER0tMSUZJSUdNWWhtZvTo7ufSx8XFw8DAw8TBwMTJycnLzMzNzNHZ2eHw/u3i6unt/f5nbej0ZltdXl5y7unicF5kYVpWX11TTktNT0xPXFRKTltUVvbj29bg3NnZ2tjT1dbY1tDS1M/O1Nna2uDWzc/Oz9nd2uHs6Ol0aGRpa2JoZ19UUlFRVlpfXl9cU1VSUFZgcnJr+Ovh2NPN0NXU0tHSzcrL0Njg3/pkbHNlWlx7bl9u9+h4aW9rb23f1dzseHv9ZWNvb2pbYHZgX/75dV1WWFNQWnBxZl5cbXBeafDl397Yz87Jwr6+wcPDxsbDwsXL0dbX4PDj3uV4e+fxc/ns8l5RT0tHR0pLSkhERkdCQkdHSEhNWlldeuXh9XXu8Xbt3NnY5P3p5e3k3d3b2MzKzMnHyMnKzM3S0M3Ky87OzczO19nc8f176vFmcHl1aV1bVEtLTlBNTE5PTklISkpHR0pPS0xTWl1ZV1hWT1p92NPW0M7Q08zIxsnGwcLGxL6+w8fFwsjOzMvJzc/Q2efp3t3n8e72a1tdXl9TTk1MRkNER0hEREVHQ0RFRkNCREhKSU5VVFZaaHlq/N3R0c7HxszMysnGx8jGxsnMy8nO0tDOy83Ozs/X2dTe7+jsd2ZfX1pbWVxlYV1eY3VtXF1dWFJSUEdFSkhJS0tLS0xMU11YX3X36vH54dzf2tDN2NrS1tbT0tDPz9HMy8zLzMvKzM/Q2OPw/l1OVVVSUE9OTU1MTVpdVVZRUFFTVFdVUVVkWVRmbXb+6+Pa2ujc0Nnf3d7e4+Ho5e1pbvhlc+nz7evu5t/p7t7g9nJrbXJqamBcW1hXWFln9nt77+rq4HpncGpbWl1YXF5aWVhTVVtXUlr17+fZ1c3Mzc/MzM3LzM7OzdPZ5OPi2+Tj1trr6efl/G9nXVpOS0xMR0dGREZDQUVISUpOUFVaW19XVVRaXVJOUU1OWVdZZnD73dPTy8PDw8K/v8LCxMXHzc7P2dvW19zm697e4evg5vbrfWZTS0lIR0ZBQ0I/QkVJTE9NT1NYXG1tYF5mcWRXXllQTEpPUVdZZvfe3NjOzs/LxsfIxcLAxcfGx8nP09LV0M7Pz9DW0tPY3dzZfWNjWVFLSUdDQUBAQUFERERFR0ZHR0I/REdBRkhNTUxRXWpjYmvu3NrTycjLysbGy8zExMjIx8fNz83P1dbX1tvf2tzZ4Oj5a2VcX2FeYF1YW1tf9Onx7H5nXmRubHBhWlROSENDRUVFRUhIR01TVlpeYW1839XPzc/MztDNzMnHycrPzs7PysjKzs/P1NrX2d/sfW5fX1lTVldVVlddXV5rXFNOUFRNTE1OTE1LRkdHR0xVVFhr9t/Z0c7O0dPOztfc2Nfe4OLj7u316tzf6Oj5aW576O9uX2RjWVhfeGxuaGBiefPf08/T1tjV0dTS32lnemhaX2lobm5fUVthbeLV1dfS0tjaztHZ3t7a4+vu8uXm/mpeW158+3VwZmNlZ3L5XVlTUV9cUVpcWVtYXmNaXGlfZV5eZWFkZFpSTk5YX2Rree/n4NLMx8PCwsTDw8DAw8TEyc/U1tPa5O/ue3l8/nJnXFtXTkxLUU1ISkxIQ0JFSEtPWmRy+3ry63r67XVvZ3rtaGR1bWNeaW1z7OfXzc3MysjFxsLAxMXEwcPIycjM1N7c3d7d2tLR1trb3N/w72dZV05SUEpMTEdBQURDRkJHTE5IQkZFREZNS0pNTlddV1pgdX7g19fPzcjHw8K+v7+/vr7CxsrJyMvMztPoeOPj5ebg4+97c3VpXl9lXVZTVl5wZWVsZF9scG92du90XlpZWldPUk9MSEdLUFhbb+zn6tnV0dHOzc7KxsTExsnJ09PX19ng297Z1tvd2t/o6N3d6ePg39/0c3hsa2l0ZmJdX2hjVlZlXFNPTk5PTlVVUk9PUU9RXmhy+efY1NPYz8zOzs3O0NLNysrLzM3Y92BmbX5ve21eW05SU1teWlpbVVld/ePg5fZxbnfp3OHW1c7N0tTT1tnf7HdvcWv87Ofu7fHn497d2dje09XY0dnf5X1nXmVz/HtnX1xgZW1yaVxXTU1MS05UW1dPS0xMVFxja3VcU09ZYWhlbfxrc2/+5tzc6u/7+u3m4dvSzM/T0s/LysbAwsTFzdLb09jk7Pvu919UTk1LSEpHR0I9PTw6PD5BREdPUE9PTVZeaGtn9/Z85+vb0tTY3unp8+Lf1M7a4+zg3drUzsvIy8nJyMDAwcTL0Nvd2NTKy8/W6m1ZWV5hWU9LSUE9Pj4+PDw9Pj9AQUZFQUA9PDw/QURHSlRYT1BaZWtr6NrV0s/Ix8zMycXCwLy6u7y+vb7DxcPJ0NPP1c7N0tDecV9hZWBmYU9MR0JBQEBERUQ/QURJTUtMS0tIRktNT1xod2JYVlhdZubW1d3Z0dbNy8zKzcrLys3MxcHFyMzMztbOy87X2c7O0tLT1dzj+WpXTU9TT0pKSEdDQ0hGRENGSEhJSU5MRUtMS0lObfNnXmV2cnbb1+ZtcXbt39TJx8rLx8bJzMjFw83Y0dPd3Nzd/WNncO/979ja92RiWktITE5NR0lSTlJTVldOTlhuaV/l2OF3cX3r8t3T1Nff083P087O2u7069/Y1szJzNbb2vFqbujhbmJzbFxgZWpcXHl27uzg0tXvcGdbTkdFR0ZCQ0dFQkJEQj5ARElKS1749vzn2tXVzsjHx8jFwcDCwcHFy9DW19rXz87a6fJsV01OUE1KTU9NTVVaVlNWWl1fZezb5mVfWUxGQkBDQkJHVFdYbHNjY/ri2NfXycDJzMTBxcS/vr6/wL68vb28v8nQ29/pfnv38nBhYVdPTEtRUk1LVmtZXGNaU1JdaVpOUFpTS0tLQjw4ODk4OTs+QkxPWVxcZebV2tfKxMbIwsLEwb+5ubm5ube5ube6wMbO2vJdXmhcT1BQTk1KT1ZWVVJRT09WZVhRVF3xYFZTWVlYV1BOSUZGRUZJRklKU3l5aGd33dPSy8jHxL6/vr/Avry6ubi4ubq7vMDL1+D8WFBPTU1KTVZUT1FaY2F74ettaufnX05JSkhGRURDQkBDRUJBRkhISU5XVVRe59vf59/e3dfMysXBw7+/wMDAw8S/vb/FzM3IzN78ZlRPTk9OUVBOUFNNTlNQVWB1bltQWV5cU1BMSk5danjn7O3o5une5/fy39fa3+HXz8/RztPW1svHxcLCxcXMzcrR2s7Kz9PZ2tbW9mVaUE5OTEtOVlpXWlBOTUxJTkxKUEpFR0pBPkRHR1BYYXPq3tTQ08zMz8/S1dji2c7LycrLycnGyMK/xcLDyM/W3OPa4P1uZWBna/tzWlZPRkNAQkdLTk1STkxOUk5OU1RTT1JaY1ZWefdnfO3az8jBvr7BwsPFyszT0s7MxsHDxsPDx8fJyc7X2t3jempseGlhX1tgYG91ZlpPTUlBPj9AP0JGR0RCRUBDSUhCPj5ARExXX3bo3tjOysXDxMXDx8vLzMvOy8nIx8bDv77DwL7Fy+Lr7v5++up77fV1fnr6a1hOSktJQkVIRUVGSk1KSU9RSlVjbVVIS0pJSVRj6NrWzsvNzNDRztLS0M3My8bGwsHAwMC/xsG8vcbP0O9oW15q8unr4+Dd5m9mZ1dMRUJAQUI/Pj8+PT8/PT9JT0hAQEE/QERITE1d7t/V0dDT2N7c4eXcz8vKycTDwL/AxL+6u8PPztfmaV9eW1xfbu7p5nNz+29YUU1MTEdITU1OV1hOSlVq8VFES0NBPUJNUU9ad+La2tvQz9HU0NDT1c/Mz8zFwL/Bw7y8vcfl6WhXUFJXXVdVWWNpcnNo/HxhVlddWFBPS0ZDSElKQUFNSkc/Ozs7OztBSkpOXnzg0c7Q09bU29rf2NLb187MycXGxcfDwcPAy93jdFpQVVhVWVdfal5ga/NwWlBPTEhHSE1PT1tcUklKWlpYT0hCP0BDR0xRXWx+3tTLycfDwsrV08zLysjExsbGwsTFvsDCydnd8GltYGZeVE1PWWdoZWdbTUhLSklHQ0NDQUNDR0hIS0pEPz09PTw+QEA/RE5WbvfX0dHJx8nMycbBw8rHxMTCwsDHxcnIw9HP0trhePX3XVtcYnVlXFxnYFtVV05ISEtNTUxOVFdNUFVQTktNTEhCRUxMTlBXWVtr2tPKwsC+v8C+v768u7y9v8LBw8LDwcbKztDY69zZ3+H8d/J3eH3/dV5SS0pHSEtIRkA+Pj4+QUNCRkNGRkVFREhKSklLVVdn697e1snJyMbExb+9v8DEycjDyMnIzs7MyMPCxMfHydDX1NfY1Njd3edwb2teWE5MS0xLTVBMTU1QTk5MSkxQTUhLSUdMT1NcX/zez8nBvb/Av7++vb69vbzBw8TJycbEyMvN0NTV1MzJz9jY2tnb2NPW4GZbWE5OU1BNR0VDQUZHTFFPTUpIRENBQ0Y/PUFHSlVw8Ofa0szGwL+9u72/wMDExsjIzdfUy8zQzszM1dzk7d7Y1M7N1d3Z2d/c63ZlUE1PTE9YXl5UTkhNU1thX1xUTk1MR0hOUVZWaOXYyMG9vL7Bwb++vr6+wsXJzt7c0dfX3/Xv4trT0tjd4/l5+Ojp6/ZpYVtSTlFOS0ZAPT5CREdEREZFRkhMUFhYT1JUVltl/d7b2tzWy8fAvry8vsLHzNDV1dnl7Ojl3tXPzdHQ29nT1dDS1drqaV1bXllVU05TU09PTlFQTEc/QERHTE1RUE1OUFFXWV5jbezZzsjEwMHDxsnHwL29vr/Dzdbl7eDo7Oj03tTOycnIzNpwXFtr/PnybFVLSEZGR0NCRURCQ0pHRUM/PDk4OkFGSlRaTklKUVdfZfvZ1MvFv76+vsbT4fTl1c/O1Nre5/Dp3NbSzczLx8bIzdTjclJJTFNbXG92ZVRMTEtKSEhJRkRMT09MR0VAOzo8PkRNT1lbWl/v0srIxMO+vLi3uby/yNhwZHv13dfU0M7U08/KzM/S2t/f0dDdcF1OQTw8P0NIS05PTUJAQT8+PDw+Pj5DRkRCPzw4NztAR01VbNzS2M7Hx8fIyMfKy8nO1+R1W1JUa+nPysS9vL3AwsnP3O5zbGNu7mRZU05IQUNMVGRfXW9hWVROTEdFQ0RFS1lcTktKRURFTVr+2tfLw8PBwMLEys7V1M7MyMnQ19/n/X3p2MvHx8TFzMzZ7WNPSEI+P0JJS0ZHREM+PUNKTU1UWlRMS0tGQEJDQkhRYf1pXl5ZWlRg797TzsnHycvO093o6vPt5c/Ix8vO0cvM2NDJxcPEyM3bfGdWS0RAQUBCTFdTT05PVlFQXWVbV1tbWlRVW1NNTFFda97NycjLz87R2NfNzNDMy8rIzMzM0M/NysvNw8DBxMvMy9Le4tTb3d77c2lXTkY+PDo8Oz1DRUhCQ0ZHSEhKTklMT09WVVhbWFhabejdzMfDw8fKz9vudXlpYPPj2NDMycnNy8fCwcG+vr7BxcrT3et89H337ezv+PFwV09NSUlGRkpPU09NSEVHSkxPWFldb/fs3+L59OHXz8jBvb3BxsjN0c/T1tjY2M3MzcjFxMbEw8PBwcLDzNba819YTklGSEdJTU5SWFVPS0dEREVDRUZBREhHSU1RV19x7dnX0tDQ0dPT1Nfb19PS1uDU1t3Vz87LycrHx8XDwcHEx8fJy8zMzc/d5+j/Z1xjX1lQV11nbV1aXFpUUk9UUlVOTkxNVVdYYH7j1NLJyMnIy8vM0NDV3t7d0M7U2tnT19XNyMPCwr/Aw8LFxs3R2OLl7ezvaFhPTktJSkpJSktQWU1KSkpJSEhHSUtMUldWVFZidPHh4trV2c/N1djb4/J093Nt89zV09bY09DMx8XFw8PDwcTJzNLbemVtbGNudPbtcmReWFdbU1NeaGZmW1VUUk5OV1hVWl1m9+3g3d7c2tfZ3dzX09DS1dPY3Oj17OHf3NXY19DNztDSz9Pd2tnb6fv5b1lOS0lHQ0VLS0xOT0xDQEBEREZJSktKTVBNTUpJS0xPX+3l6uPa525qZWv8+tzY293Z1t3h5+Xl5dzNy87PztDieW569nZ95+X9eH1zZVdRUE1NVmBfVlJVU0tISk9ST05UTk1TVlJNTFRZWmPc1t/d3Nnd9+ze397f3eHp3d3Y2NnU0tPa09HW2OLl7nVdXl5dXFJUUlFRUU5OTk5JRkNFSUVGSEZDQkRKR0xNT09LS0tOUFRbXVhXV2ZycvT5dmtlZ3n/4trR0dbQy8nJzMrO3OT38fz16eXl6er79tzZ3vlrbvtwU01XZF5VTE9ZX11WTUtMTUpJTFh1Zltd6NXe6t/e2tbf4evm3+f5Y2N4cevez8jJztLMy87Q1+7h4Nnl7uDr9GljYFtWXF5hbVpRTUxIRktKSUtKTEpJTExLTUtMS09nfflxaGlyalhaaW5mXmludH744+Tb19nZ0cnGyMrKy8vU1tDOzc3MztPU1NLZ6+z8amBv8Ovs9G5kbF1fW1phXVhWXWVodWVjfHB+4trV2Njh7uHh9HJv9u/wb3Xf29XOzs/PzczJxcbKytLX1N3f7PDie3NpYmBYW11bW1dXXGJrWl1fVVROTVFNS09RUVFUXFxaXl9gXmt28ed66/FrbXJz93Rv7Onj5N3X187MzMrMy8jIx8XCxMjKzM7O0dbU3Ozu7+no4tzb4+DX19zg7XFsXllZYnhoam5hZXP25d/Z2t3d4eLi/Ht0amZZV11o593Y0tfV1tTU09PX1NnVztfW0NXd9Pvs/W9ubmZpe3Fu/PFqXVxcWldbUlFOSktJR0hHSk5PT1BZW27y8PVuZ2FXXV9cXF5ob2z02dXNyMTEw729vLq7u7u8vL29v8PFyNHc7Hl67eTf3t7Y2dvY3OvwcWtrXFpVVVdPSkdGRkRHSkxPTldbVFVUUU5RVVpl9N7d2dfV0tDOysnLz87NysjGw8nOz9DU2NXV0s/T0tPe6PZtZFtTTkpPUVBRTkpHRUNBQEVITUtNUE9TWFxVUE1OVVxWXF5ZW2n29+3c0MrEwr++vry5ubq8vLy9vb/Bx8/c3un2/PD26Oju3dvf4996al1cVk9NSEZDPjs7PDs7Pj9EQ0VLSUhMS0tMTFdne+PX19fb18/Q1NnV1NTRzs3OzMrP0dfY1NDOzcrNzc7T1d3j5G5fWFBOTk1NSkM/Pj4+PkBFTE5QUlFTUk9UUk9PUVFPTk5QVFJQVV5kbuDOyMnHw76/wb7BxcbJzNHi5u5rVFZbUk5WYGhgYWt1bmlwa15ZWldPSkhKQjw6Oz08PkdNVlJQT09TWV5jbXB58OTd2dnf7PDq3trW1dTT3Ont6ezq8vn46drU2NnP0+Fv+ujodmx+6f1rYFVUVVROSEhLTk5LTllbaW5uefTj4O79bmlqXlhXVVFRVlZPU1leZffY09fQzs7MztHg6flaUU1MR0JEREhLS1BYWl143tnV0M3Q1+H3ZFVNSURCQEdLRkVKUVleZmdtcd3Nx8XKzM/X2Njd8vXue2vy3uTy4eh+7urm2dHQztLO0dLV3t7o5ujm29vl4+D8c2xub2BiYVVPU09UU1loY2t94tne8OztfXJqaGBXWlhZTEtOSk9TXWlleeDY2NTR1dvc4+fscF5eWVJPUlNXWlhXV2Do2NDKzM/OztHS2ux8ZmVbUE5QUVZdXFtbV17h09TRzcjGyMfIzdXb3ODt6Oz77uvm5+jj39bQy8XAv7+/wMTJyMvR1tff5+9tcGBdYGNma2VdZWtoaWNgW1dfXmJoamldWlJTWFNLS05PUFFPT1RRVFhYWWz/7dfRzsrNz83T3N3U2+74b11TUk1NUVdn5tfVzMTCwb/AwsjO0drf9G5dUU1OU1NWWVxkX3jb1s3KyMbDw8fExsfKztHY3+Dm+vrw8P/o4drTzMzKysnJxsTHztbf6v1rcmBXUElKT1FQTExMSUtOSktMSklKTU5QV1lYYFxaYF1fXl51afj8ae/t6+n1eXzr3dLMztHQ19PS1NDV2uDo+nFfWE9LTExOUFhgZu/i0svOzszNzM3N1vJ1X1hRUVRXWGDw6N/a1svHx8K+v8PExcXDx8vW7H1qZlxpbGdtYHLl4+Xb09PQ0NPZ7PJwW1ZOSEI/Pj08PD5CRUdKTUtISk5ZYGN6bl5dbXRpc3R+b15ebHT54Oro3uHX1NjPzc7NzcvLx8rNzNDU0tbf6PRwXllTTUtPTUhHTVNc/OLd2tHPz8jGxcPJzNPc6XReYFxZV1VYXmdue+fZ0svHwsHAv8HAxMvS3nBcTUhLSUhFRERFQ0NKTmF6c+zs8PFuZ15PS0hERENEQ0ZIR0hJSUtPUVdaZW5q8+Ht9ffm3d3c3u/7cGX929fZ2t7j6OHi3tLM0dHT0dfi4+Db19ne4O77cGr49GtgXV1mbnBkaHz43tnX1dnYz9DSz9npfntgWWt1XWV9bvLq6+ro5+/t49nc3enx+15XUklGR0NBQkI/Pjw8QEdJTmXn3tbP19rZ4/91eG1VSUpHSk1JS0tKS05fcOLj69jb1M7f2tfi5Ork5HRvXl5dXWB5dP3v4NjU1drW1M/IyszJz9TW2NPX3ujs4uf5bWlaUk5NTVFOTVVf7tnY1tnLx9DMyNDc7GZdVk1JR0NCQEJHSklMTVBmdl5m9fPi3eb3a1tWVlNMTUxHRUZFSk1NT1JUcNnTz87Ozc3Q1tztemxxa15VU01ITlZVWWNybmv34OXs5uHa1djc3uXw7t7m7/H0/OPRzcnKysnLxsHAwMDHzczN1+t2Z19dXWlqZfz7/Ontc2deWlhfZXRvXldWXv1hVk5LS0pKSUdEQD4/REdGSlJj6tvRzcvJzdDJytbb7mpoWlJPS0xMSk9fZnfw5dfNysfDwsPHxsPHztz2ZFZMSUhJR0hLVl5lcnbo187Mx8PBxMnHxsrO2NnT1Nvg2+Pu7Pf53dfW29fP0dLLwLu6vsTCwcXO2G9dZV1ORD49PkBDQ0A9P0dPV1RVWV9meGpbWltfXFdST1JVU1VOTVFXXFtn+NnRzsvMy8jIx8fJz9nj4/liWlJSV1NXY3J3bfLe1tHV083KyMrO0+Lp+2tpY2pqXW5wcvDf1tXPzMfCv8LBwcjM09vnfXBfVVlfYmRq8OLX0M3JxsbIxsjKzNHY3vZpT0pLSUA+PTs8PDo5PD9BRUlHUF9ofOPX29/i6O5u/mRbX1BLTk5PUVRfZWnx29fMysnEwsPGwsTKzdTX4O11VVNXT05MS1BdYl9849HQzcXEw8HAwsXIyMvU2OZwbGFebGNfZHRsaPPk09HOzMzPy8jIyc7U3Ox3aVxXVE9MSUpMTExPU1thYG72a15xfHNdVVdNTk9KRkRKS0lNUVVXV1tdY11gcf1289PT5ODf5vPj4X5+dm5hXGj35efo3dbMz8vJzMzNzdTd4ejq731wa2v++n3u6unc39nMzc3JyMzOy83OztDW2+DudmpfW1pbXmna1NPU0dLVzcfL0NPmbGFcUkpEQj48PDo6Pj8/QkNAQURMVV/g19jSz8/Q0dXb4fRnYFJOS0lJSEhPVFdcX3D06Njb4N3g5Orw3NTd5OT1e2VmbVlXVFBXa19l7uDazsnIwLy9wMDBx8rN0fF7blxcZG1eWFlfWmXz7OXW1dPOzcvJx8bHys7d9XhqX1ZPR0VERU1RUFJUTk5OUFZVUUxEQ0JAQENEQ0ZLS09ZW1hYWFFPV15dYn3079/W1dvQztTY5+337fZfW1hUVWd79+vp7evn3ut7bVtYXGRu6+Lh29fV2NTPz87O0tPR09LPycrKycnMzMvQ2ulgU1JWWFlcXl9r9e7y7Nzh29bV1t3tfvRnXlteXE5LR0RDQ0M/PkBAQkVITFdw8uHd29rXz9nn/F9XTktLR0lIR0pOV2Z6enxrcfzu2tXY3dvZ2dPPz87O2t3c4OtuYF1WUEtLV3N14tnb0s3KycjExsvNzs7Uz87T2OX+d/18bGFdW1tx4+TTy8vJx8fJxcXHztrfblhPS0tLS0hGRERFS05SVFVLR0pMUU9NUFZZXH5sXnF1aWl3/FpNTFVo5OdtYF1y3NDN2+5vdO/4fFtPVWZwcF9RTVt8+H1xdW717Ovl+H7o4NPLycTDxMTFyMjKzM/a39zb087R2N7f6vx6cPfr8OHp4OLl3t3f3Nrn39ba19fX3+La5eLX3+bo63dnWk1JRUE/Pj07Oz0+QEFGS1zg3d3a29ra59vS73FuXWlpW1tbaG5gX258cfDr3dXU1dnZ2N/m2NDY2dru8v9hV1RaXFBPVFJUYnXq2tvZ0s/KyMW/vb+/v8C9vcHK0dvje/3sdmt+8+rf3dzr3dvd2dPLx8nMz9jZ6GdrcGBeWFRXUE1MSUVGREBETVNWYWVWY3Fn8OV5Xl1XT1BPTUpKTEtNXPX6ee3l4une2t7Y2dbOz9v2e2NXV1dcZfXq+/Tw6Oju/Obe393c2NPOzs/S2Nzj49XO0NDV1tXV2t3g921u6ePi2dPR0czMy8jJztDO0dnc3dnW3/F3/PtmYGhlWk9MS05YUklGQ0FCQ0VISkxMT1phcezp6+55denb3Ol3b2ZsdF1faGlfV1dUWF9u+Xdxc3Dw5unp4OV8/O3c19jY5vNuWl1bXF1YWmDu3tnX2NHNysjDv8DBw8TGytHe8nZcWFVRVFlYXGdfZW997ODUy8nJycnDwsnMztDX2tzldVxPSUhIQ0JCQ0RFRUVGS0hGR0xXXGBYVltUVlteXFpZW2Nlb25eZ3V3ePvj6Obj4Njf7HduZFtjY11UVWRnbmtdWlZZX15r7PJxZX3d09bS0M7O0tHNycfJzNHS1+Hrev76amh86+PZ1tfU29jb6uLmfXhnZm5uY2djXV5m8+fu7PB2ZFpiXFxaUlBOTEhIRUhISUxOWFtkbHZ763l77H56aFxZWFFNTE1TTEpPVltt7vHp8/3f4N/V2N/m/O3m6nb6a1NUVFlhX1ldWF9ofvT47era18zKzc3LyMvOzMzP2uXj+Hps/Or87+34+Hl18Pju2tXb1szHx8jKzNDb2973b1xVTURAPj07Ozw9Pj5ESUtUXmFsceba19jZ29rY7fV5dP5jXFhbX15fam15eeTX2eTz83dkWFRXV1hXW19hZGNt8vt5enTp29rVz9jc5fPj3+ni3drRztLSzs7N1tXP3N/i6u3p4ubk7Pf59Ofl4NjT0M/O09DNzc/Tz9LX4X5ram5kaVxXWFtZWFBISktKTEtISklHR0dIS01MU1dceN7U1tXX3dnU09TU09jX2t/v8O94ZGBwb3Xl3dvY2dnc3OLo+PFnUVdUUFhVVlhZW2Dp1tTY18/OzMfFwb6+wcfN1dbV2/Rtc2RkYl1eXWj4+fHf19LNzc3LzdbRz9jW193Y1tnl+XBuW1JRT05IRkVERUZITE9SVF1kbO/q493a2OX6c3x4d2BWTklFSk1RXFxm/Obn3drX0tPNy8rHyc/a4OxtZGJcW1paXGh6/eLa0dPU19vb29vpd/t6cO/s3tnf4+LZ3NrY1NDb3dnT09be4On66drd3eN97+/o5vB6eu/17PD89nt2d2lXSkZGRkZISk5LTEpNVVVeU1FgX273+nBubm3639nq7vTv4d7Y3/vjdlt383heV1hOTk9VWF5fX2/t5vX2497c1t7b2Nvj2dLnfXhbXG7j6fDd18/Nx8HCxs/RztLY5/BfUEhCRUxLSlBe7d7c19DQzMjHw8TIyMjP4/ppW11aVk5JRT48PUBBQ0tMS09UWltdV09VUl5+7vttcHl+buvc6/huY2xofn1uZ1xaVmnu8ejj6uPa3djU3eb6ZWBeWldPSUZJS0tSW2Rv8+vy593V0MzHx8bBwMLEx9Hj73VnXWhsZ2Bta3bj2NTU29za3u9ybWtYT05OTlVhXl5r7uPa1dTd5vDvbVtZUkxHRkhDP0BAREA/RkxRXHLt29nUzMvMztPmfXlfUldeXFpiZGBxfPjw5N3e4uLb3Ov0Z11uZWBy8H165eHj3d3t7N7temv4+mRmdOvq5N/c19DV2NLT0tHQz87P0tvd2drpevb6cG336ujZ09DQy8jJyMjM1d/ta15TRz88Ojg5Oz0/QklMVG/s3trT1dva1tXc5+f7dXlhYWdeT05PVFddcfjf1dPX2tTX3Nvj/G9pW1ReYFdWVltfc+bV0M/X597T2e50+/X8fu3c2dfRzMnIyMrJy9bh6t/lb11UWVxUTlBe/nl87vPp19bPyMPByM3Mzs/R0tbk6m1q/2taXFZQUFJWVU9OTElMS0Q/Pj8/REpSW3fj2tHOxsPDw8XJzdHa6PNwXltRSkhISUxQXG9rb/rq5drQ0NHT2tzh4/VlXVRUUlNQTllWWPLVzcrGxMPFxsXLzs/V2uLme/3n6OjqfHP06OXc4Obme3v46N7f6P10dvbf3dzi5d3d2t3pdHl0YGJhWltVTkxPU1RTU1lbXmJp+ezd3tzZ7GxeWVZTUU5OT1Fdb/Hy9eTYzsnGxcvO0+j3clxSS0hIS05RWV1hWl165Nra1tXY1NTQ0tHX5efr+XJtb/7n7Ovo3c/T0MzO0NHW3uTi6XRjX1xgam58fv3t3NHPzs7T1drg6GhcUEpHRkVER0dEQUFHTVRXWnng4+DV0s/Mzc7Q0dXb3ODd5/v3bWpuZGtfVldWUE9RTU1MUFNXYWNp/PHp29LOysjN0t3i6GtaVVRPTExPVVdaZ3P+3dDJx8bDxMrKzNba4XtpblFKSEdMUFNWV2P13tnSyMjFx8nJ1M3X3drt/GVYUFxaTUhESU1OT0xHRUVHSUtMSUpOV1pTWFxgeNrR1dPOycjM1OXb1M/bampu73pVVWdvW1JUWF1ZU1hbYGBaWlxdVVReamtu7+jp8eHXzsrMz9Tb3uTZ0trf5f93bnVqXWBhW2B86ebs4N/q6/5rdGpeY2tpaW9ta2dscmzx3d7f4uLp8nh3ZVtYUE1LSUpLTU1NUE9PWGhv8efo5+7g1tne4Oh5aWNYXF1YUk1SXGx97+vr3dzf2tLS1tPX39jZ3O56ZVhZWl1dV15cUlZXWF9eX2d2+uXYzszOy8zPz9DT3dzd3dzx7epwXVZZWlNVXV5ea2rz39jR0tTU29jb5OPhd1lbWFRPS0pJSEpJR0hPU1ZibfPr9fXq5eHY1M7P0M7R2drc4e9maWRfY19dXFxfWlFQVFJPT1hnfPb88ujg1c/Pzs7Ky87NzNLc3uDh4t7o+3NqZ2dsanj9+H3y3uPw/vbu7d3b3+Hi7fLveWZeXF1ja/3v3dre5enj6Obc2djc2+N2bmltZl5aVVRQUU5QUUxKSEhOUFRZYffp4t7U0NHR0s3MyszT2ePtfP36+XZlX2NkYl9bWVVTVVpfbuzs7nhnZGh6+f1tcvr78vz66+7r4tnRzszMzMzPzs/Pzs7R2Nve3+v6dWZfWldZVFRbWFVVWFxs+ejc39za2Nvh6fVwX15rcHN7cWJZUlNWV1tbVFJQUlRTVVheX2R85N/Y0tTZ4ebi39/f6Oru7fVseXpzZF5r+vp7+m5kXF526uDa2dja2dfb4/N6Z1laYGdmbm5nXlxhY2X/6+nk3tnX1tTT0dTUzsrJysrQ3vD9bmdrZ19aVlxnbHZ2cGxleezy7ur2al5jbG50eXZ0a2ReV09KR0ZERUlLTVJdX2Pw3NPMx8bIy8zO0NPa4/htYF9obmxuXlBRVVdXW19fY2d0fPbs7fPw6OXf3uLf5Pf56+Tk5uXj3uPk4+zq7Xlva2l47+be3Ov98ezn4N3g6nptZWFmY11dZGvv3NfV09ne29bZ3eDf5vb7+3dsZ15UUk9OTk1PUE5JR0pLTVRdam1taXrt4N3g5eji2tjU0NHZ4dvX2Nrd4PZzamVcWldPUVZaZGtz/Pt+bXr0+fns2tnb293l7e1+dm9tenvu4eDe8Pjm3NbTzc3P1dra3+D0ZVpSUVJVXWFjXV5mbvx4evT4eWpqZWpraHjr397e29zg8HdsYlxVUU5NTEtNUFZfZGp69ejd0s7O1t7h6vDs4+Pm7Pf9enZyaFxYVlNTV1tkbW3w397i3uDk6+rk7Pv39f548+3v7ufk5+jp6evt7e3s8P57d2xo/e559+fq6ebl5/htamhkefjw4OXl3tnd4OL6bmZiZV9oc2tlam9qaW5ta2RgW1dTTk9OTlBSVFNWXmlucO3s5t3g3t/k3+Li39nZ2dfY1dHQ0dTd8W9rd25gYFxbW1xmZGNuaWv88Ojh3Nvc393d9GtlYGRjX2FlZGZmZGhrb3R19efd2dbV19nd4+n1+fb56en07vn66uvv7ev27/j79ffu8vD99+/+cF1WV1JRTk1LSk1QUE9VXVlcbX377uDe3Nja293a293a2NLT0tPX2NbZ6/N5Y2NkX11ZXWNfW15hZGJfX2hw9enp5uTg4+zu7/T//e3u7ezn4+Hh39/g4uzx83x2aWJoZmVmXVtmdPjn2dTR0M3MztLY52RUUE1MTk9PUFVdY234+u7h4OPf3uj4bl1YVVVYW15idPzu6uzs5N7e3d3m5O3+fP94//f68et2bGBcX19kY21xcv3s6vp2dl9fY2lt9+Pc2tra3ODY2NvW0s/T2+Pp+PL7aWxuaXl47uTi3NbZ4ufudGpfW1hWWVZUWWFicf50bGdkbXf46uDb1dra193f3+fv8HtrXlxiXlxjYF1pe/zz6d/c3NnZ6XNiWFBNTUtLTlJUWnDt6uDd4+Pc3+jn6fB9/Xl4cHz48eXe3tfR09XV0NDS1Nnn+HFhXmFjZmhvc3lrbXFoZ2xjaXr5fXr6/mRfbGRganP139XOzc3Nz9XT2N/e4/RyX1ZRU1lbXmZqbnl9fHdvePpuaWliWVRPTU1OUFRYXWJt7On69/n97+nh3NbQ0tfW1t7v93hlX19gXFxeXmj77+fg3t3f4t3i4N/m6Ony/H13bGRfZ3Jvfunr7/J7YltaVVZUWlxn6ubk3dze4N3a2tXQ0M/OzczMzdHZ4+jve2VgW1paV15hZGRbWVROS0xMSUpKS01QVVJQV1ph/NnQzcvLzc/P1eHvcmJjaWtu9+/l39rX2NjZ4e377vR8+nx4c3BxZV1bVVVUUVRZWVhXWllaXFxgav7p5dzU1Nra2Nzn4dnU0s3MzcnHycrLztTd6PR4bWplZGxrbHZtYVpWWFpXWl1ZXF1dXF5ZVVNOUFZbd35+9XVvdG5nanf36ePd3eDa2+jt5/p4b2NjYnDt5trU0tPb4PplWU9LSElJS1NXWFhbXFxgbvHf1M/Pzc3R2N7qe/nv5eDf293a09PQ0NLc5e12cHRuY15w9e/n7HppY2NeYHPv6uLb1tje6WxaUE1SWGJqZXR2cGpreHf6+fj0+ex+aW9wam9sYl5bWVhZYG36597g5efs9PRzaWVeXVxfaG1iWFNLTE1NU1to9+Xd1Nff4N3Z29va3d3e4t7Xzs7NztHW29nb29rc3uHk8mZeWVRSVFlXW2RsfPHr8HhkX11ibnn16uPn8e33++3r4eHe2+Hf2tTT0M3Q1+hsXlJLR0hOU1VbYF5cXWJiYmZiYF1cXFdTUUtGQ0VKTlVbauve2dTOzc3Mzc3N0NHY3NfQzsnGyczV3u15a2VkbvT/+/VwaF9VVVlZV1RXYGVibn1ubWpnd/Dj2tfT09ve29rc3ODj4+1xcPnr4+DX1Njf8W9fVlFQVFteXmhpZ29wcGtlYl5cYGZlamJaV1RPTE5OT1BUXV5id/ns2dXU0dHR0M/NysnJyc7R2fpmX1paX2r78u7q7e3i4Ojq7HFiX15mZF9eW19fXmFoamzv5erl3drd4dvg8X50Z2dv9t/a19TV1Nfd4ut69eDk6+vv/XZpdn1uYllUU09PU1RSUlFUV1RSUE1NT09XaX3z6+LY2Nrc2tnW0szGxcjKzdLZ72xhWllbXGFkYmRnZm336Ob0eXxvb25mYmFeXF9eX15eYW745trUzc7Rz87U2ej273j16erm6vb+/2hjaGZtd/fq5Obe4u/n7GpdV1RTUVNYWFdcXF5fXF5lYF1kcfzt6OHm59/j6urr6N7Uz8/Pzs/Q093s+W9aUlhcWl1fY2BfaGxkXl1dX2tqaGtmZ11aXV5fYF5p++Xb09DSz9LT0Njb3N3f3+jm4Ojo6PT7bGNjW1thanHs6e3j4eP9YmBcWVdaWFZaXV9fX2NdXWhmbe7a1dXX1dfc3O1wevjx6+Dd3d3b19vf4+/4bmZscHpybmNeZWtqY15bW19mYl5kYVxaXm1rZF5cXGBw9ujh5ubk29vm7ujf5/Lk3dnX3OXn63xlX2FfXmr659/h393h/3J+ffxtZWFZWFNSVFVVUldaWV927PHo2tvX09ne4t7b19bS09TPztHU1Nff6/V99PPseGhnXFpTT01LTU9WVFJUU1dYWmV393x0dfXl39ze3N/e2uPx+fr17uzt7Obh2+Dl4+z4bGRgXl9ia2doevP9YVtbXmVtY1tgX1xgZ2VfWVdZV1xoe+ng493Szc/Z29bX1tHOz8/R09DT2dzh6vN2/+7o7P5scf1uX1tYVlNVWlZRVlNUVltdYG1ta27p397Y19zZ29/ycG12b33/a2317fTz6+r5//x1b3pzbG9qZnn28WdeYWZhYmBbXl5aXFxfWVBQUk9TXmh97vHm2tvc5uPV1NbOy8vLy83P1Nbd6u32cXjs7n5xdft4bW5oZWljXmNsZ2dudGlfYWJfXWJu/Ovn5Nva3+bt+Hl9+vDy//nw5ODk7ezq9XhufvtybWpob3RvbmFYU09NTUxNV1pbXl9gXltaWlppevfi3t/b293d4ubd3d3d3NfQ0tPT1tfa3+H0fvf4d3hxde7w/G5nZWJaXGdt+OTn6uz4dWhiZ15kee/n5OHh3eDm5eTa3N/e3+Dk4ep8bXv4ffxwZGFlY2JjbHf39v1yaWBWTlFTVFlfXFRSUk1MTUtMUl9p/OPe3Nvd3d3W09TW19TT0tLX29zY2dvb4O3y6u717eXm7nNkXFdUU1Fcb/jn6u/493ZoYl5fZXrl6ujl5+Xq6ODc19XW2NLP0NDV297Z2uHufF5TT1RQUlVXV1JTUVFVVlVXZvb093tuX11aVVNRT1JbZXjy7uLo+ejg2dbb3t7h3t3f39rc2tri4e188PH35tza3e1tYldUV1xicvLt8m9xdG1xY1pcaXzt3tjZ3+Xm8vbq5ePe29va09HX3NvW1NLT2+t9d21rdv5rXlpXUE1RU1FVWWZsZF5bV1RUUU5NSkxQU1pic35ydvr46dnZ1tDSzsvLy87P0Nje4/hmcm9haH3p9WpsZlhZW1hg/vDq7+vr//Xn+GxoY2V49urh4Nrf6ePn7Ofu8+Ha1tHU1dbf4t7k5Ot3cHFrav31eF5WV1JUV1heYnX79vr3cmJiXlxZV1VOTk9PU15hXF5cYWps9uff1dHPzczMztPa29/r5/v58HT683x3ZlleX1dZaPjn5uXe3uDd6PD6Yl1jZG16/u7wffX6e/Z8b3vo29TRzs3R09jd3Nzh5Obs6+nq92ddWlNRUVJUVFlgX2NpY19fWFRVV1RPTlNZXWt99Ojq7ujt6OHe18/U0c7S1Njb3OPr9/1wdXFjY1xeY11cWFdXWWN57/no4OPe3drc4fdhZGx+7eXh7fft7vpve3Bx6dzU0s3N1Njb2NjX3Hx7fXRrY19YU1JSUU9TWFxgZGdsbndtYGBfXl1WT1BWW1tcZ3P+/X777Obh1tTU0M7P0NbZ19na3vF2+er0amFqbWduaF5gXFphYnJ9e/Ls+evb2uV7a2xv9eh+bf5zbXJsamtob/j63NHR09bV1dfX1Njr8O3r7GtpaV5cWFFTV1FPVFZfYmNrYl9gXllVU05PU1ZWTVdnYmn+5uPe2dPP0s3Nzs7S1dLP1d/f3uDn7vlkanlwfHBoY15YVVlaaW9qb27z3+Lv/fn89vfr7Hz26+3n3+nv5vL56d3b3eDa29/X2N3e3+LofWxrWlVZT09ZVFJVVVxdZnpwYWxnXWVeWFdTVlVOT1JQVFxk/uPn4dvc1dPQ0NXb2tvc1Nje2NnY2+Hi7Hd5fGx+8nBtbGdrbPfybWlxd/nj3eTl497zcfN8bWZpdWx0bmxpbPbp3NjX19jS0dTU1tfb2+f28XhoXVhZV1RSVVVVWFhdV1BRT09OT1FQUVRXT1BVVVpec+7p2dja1c/Nz87O0tfZ19rc297j4+Hp+3R8aV9nbnJvbmVfZGRgY2xqa/Xk3dfW0tPX2+Xu+f16fPZ8/f5zbHHq5+nj297l3eXk3+Ph8OvqfWZrbltaWFhfWlxeX2pjWFhbVVFVVVpcWGBbWllQT1FXWWZxfObr3tXT0dHU19vj4uXq4N7f2NrY1+Dr7PJ3cGht+nNwc21rYFxcXWJ29evc2dvZ297ldmlsdndwb25ua27v4NjZ3NfT1dPX2NfZ29nT193qenVoXFVUWFVTVlxaV1NPTk5NTk9OUVBNT1lTT1FUWV9t7u7f2tnRzMvLztHV2+Ld3ePd3dnW1NTa6/F8aGduZHn9aWphW15bVlpncuvi3dPZ19be4uh8eu/2+Ot79vNt9+bf2+Hl3t3c297f2Nza1t3h7HBuZVtYWlhXWVZaXF5bVFFXV1ZYWVVYWlZVUlJUUE9SV11sc27u29bQzc3W3d/h4NzW1tPPz8/R1NXja2ZzaWdtbXBmYmhgXVtZY3T349zd1tXe4OLt8vxsaWl3e2RoevHp49rf4uTb2dzW1tbU09LX1dje8GtmZG1lWFZTVFZUUk5OTE1QUFBNUFFNTk1WWFJTU1heenFx5t/SzszLz9DT2tvW1NTQ1NbU2dfb9GlaWFpZWVlaWVtZXGBcaX7v3tjTzszOz9Pa2d7p73d1fGlodXPu3+Tj5PHv5+Xi5+fi6fDu7untc3BtYmt8bWZkZm14aWhiXVxbXlxYWVhQTk9OVFdSTk1RVVVYXW7559nY1tXY4N7b3tvT0tLU1dPW2eH7amVeXV1dZWhlZGBnb33s29na09DP1dbW3+zp9WReXVJUWFpq8OHe49zb3tvU1tnY19LW3Nrg7+nvdHz4evhrX19fYFlRUlRRVVZRUE1MTUpLT09SWlVQU1VZXGN839LNzs/O0NjW2NnW0tHT2Nnc4+rxbF9hXllUVVlcXl1ZW2Jq/uTd1tbSz9PSz9LW3+r7aVpXVVZfZ+7c3drd5d3c3dvc4t7l7+zw9fhrbXxwefH9cm1ndn1yeGVeZV9cW1xVUU9MTlBUV09OS0hMUFJZaPTe2tfU1NXW2trY1tPT19jf3tjk+e79efppZV9fY1xaX2Vo/Off2dvV1Nra3N7Z23dlX1xaU1NZX2745+LZ29nV19PR09HT3uDn7efteP7z7uju9/1vaF5dXlxYXV1WVVBSUUxMTU5PUlFOTEpMTE1WXm7s4tvY2NTS09HP08/O0NLX09ri4O58ffhuY11gbF9gaWFhanHy6N/c3NrX2NrU2ODnbG10ZmNibHj7+uTe39nc3dbY29ni7PZm/fVqb/hu9up68Xl78Wdo8vxu/2tnbVtcVk5RT0xQTktNTElLSklNTVFbWW3t7NnW187Mzc3Q19TZ29nc3t3h5+Hr7O5y8/9t6+zw5+746+Ph4uTj3ebm5fx8Z15mYF5mamt1bHLp4drW0c/OztDT2t3l6fJxbnh2//768vn1emxuaF9fYFxcV1ZWUE1NT05OS0pMS05OTVJVVldWWGpv+9vV1c7NzMzU1dfb1tff29zl5O3/9W96fGVl9vT76fHj3Obe39/Y3drX2uLn6Onsc2Z4d3lqW2h3dvjo3NPU3N7l7fxnc/l4ZG/p7PB79enq4O3u3eTze/ru+G9jXVZPT0xLSklHRElMSktMTU9OTU5WXWV73dLNzM3P0NLa29nY1Nfb1dTb3unu5Ofxferk8PPg2Nvb3Oje4Pj/ffh5ZGj8+2xmZ2JgX15caers38/Mzc/R2Nnc7Ojk4ur27eTl9HV2eHp+9Px5dmRjbmtqZVtRT09LS0tJR0VJS0xQT1JQUlZaXmru6t/W09DQ0dbc3t3f4N7c6Ofn6uV2evX/8XTw7ejg3tfTz9DW0tzr4OXr6Ozz5t/0531dZmFbWWJ28uXk2tvb2urxcGv16ufk3uDY4nDteHf9/nrn3e/n5H7m5PRxXlNMT01JSUhHR0lHR0pKTElJTVhfZ/zt3tPR0dDQ3t7Z29ne2NrV2e3h5+zd83nv3+fm2ejfztHX1tvw/3dsYFtoYm55c+D+dPhbW13uaPnZ69XO1dDe4Ol5efne9OXX3uX3+Ghhalxle/N4+f5z7PV7elpeVFRLS0xDSUpGSkhKTE1MSlpXXv5869rQ1dbS3dzY2eHg4OHd5/D8ZvVrYvvx3uLf4Orc1c/PzdDZ0tnf63VvbPNteeft4H1ebHJsafbw69jb1dfe3eL3cHrq5+nc2efs6XttZ2lhbOf2d3De4nDk7Xp1Z1ZPVEpFRkZIR0VFREZEREZKT1JabtvW2tXb1trh39HQ3tnO0dba2u9t9PZu5NXc5trY3dvO0tvO0t7e0Hxb+VtTcGxj8O1beftRceNl59Pc087c1db03dp45dfr5N7c325u91xb8V9f6PxjaObsbGzpbljzXUtPT0JAUEpBS0xFSkpFUFxOat1t3M7v39X36Nje1NDq2c/k3+b3+WNt6nrkzeLv193f2MvO3tbJ1+rN4Fp68VRY5HFZaGZQV2xp5N1v3c7z3c5w99VyeNbo187639RrcetubWF+1O150G1f1uhmauPoW1lfTEZMRUFGSUZCSEs+RU9KVGVv9+fV4n3g4Wfj2N7Wz8vV183kfdJ2V+Df5dzV0+35ztxnzMz818fhaN/fWFjuZFro4lNV/WVQ+NP4dsvPaNXMbmbP3lveyuLezeRf4exXXOxeYd/vbPPnc2n7eVl032BYalRETVFBQVZPPktbQUBeWkRi2Glozd9X7c9dWsvQbM7C3t7I5V/d21X9zeHtzNHpzcrm2sfW3cvL39rWZWHj+lJ82lZQdltNefBYfszvbNHiW2vcXWvQ3fnMyOff0vlf5fhZ6tZuZtjoXujbXmLfY1fg50pYcUdCWlA/TFg+PVJFPVJuSFPS8l/U11VwzHJfx8p+y8D4d8nhUN3RW/jD2m3HyP3LwvDewtb+y8xj689hVNrqTuvQTkzUb0vfzVx7wtpSz9JKX81mU8jPXczIWnfIdkzW407g0FBZ0F9J0uxEdthJV9VOSN9RPVxdPExvPTtnRjpidj9dylNVyO1K1s1O9sLna8HPTtbHUFzJYE7IzlTPv3ncvdVwv8dpyMBm3sJhV8t0StXaRVzWTVLNak7MzVjeylNY0V9L2tVY3Md7acjaXdDYTvbKX1fL+kzV2Uhl1U5Q1GBJ2+dGU29CRWVKPE1KOUhZP0PsX0nh203zzV5by9dkyMdg1cZsY8r4TNXVV9/Kcd/B0HrJynHOxPzfwttmzNpO3NJRXNdXS9zoS3vPX2TL7FDa4E1r2F9wyNBr1Mn+68npX9HTXuPMX2TQbU50cEtY4VtR3PRPbG1FTG1GQFVMPklVQEFYUEp08lFq2Wpp19xtzsxy58zxX9fiU+fRWmPL5F3LxnXcxOL2x87yzcTi4MnmXNXWVmXbWlDkdE712Vpt0HpS4uhRatVgaMjWas/LbujM/W/N1F7ezF5c1G9LX2pJWONZU9/1UWjxTE5ySj9RUD5IVj4/U01GY+xNW9RuWtDPaNbJevrQ51rr7E9l0G5Z0M9d18hy6cXRc8vD4tvC0G7PzWXwy3BT4dxSXeRbVdzmT+zOVFXQfE3fzlv2yuZgzc1U7ct8+cbYW9LMWWjVWEvteEtk1VdW0HZIbeRMSmlMPUxcPz1PRzxOaURM3G1N39Fj3sLgY8zOUvDQU07T4VfZzWb0xNFb1cXn38LPbcnDfuTE5GLNzlFp0lpQ2fhIbc5TVdJ7VdvZUGjRfF/QzmPjxnxZ1d9X1Mbt78nRX+bOVU/Ud0Zp10tO1WpFZtxNRfVVO053PTxfRjlMZkJI2HRL4MxZYsLWWs3IZ2vOckfpz1FcyORPzMdf5cHXaMXEadi+2mDGyWLbwPhQz9dNac5ZRt/ZSFvL/FHX0U1eyPVO0MlYYsfqTN7OUffE5F3HxV11xmtO3udGVdFWSdzcS1rSWkRjXD5FZEM5TFE6P2ROQW7dTFrO6FfOyWTnw+dU1dxJWNBuU8/LZuHB2/vExHrcw9jtx8rv3cXV/MvQXHjVW1DqZUpq3ldgzdtb3dFTWs//VNXOaOrL6VTl4Fhp0eZszM1w4M/+VfNgSFnzVE/ibUx+31JR8U1BUlI8Pkw+Ok5YRlbjXFHe3VnqyuNf08tk+NFdSfvuS2TPfV3MyvTOwNjswsnmx77W3cbU5MTF/OLL+1XndEZTe1JW1Ndi29NYWtX1U9/SXHLK2GDY21Nm0fxjzM132Mr5ctHtS2HbVVXbdU5o61Bp3lVHWlE9Pkk9O0lIQVV1TFPkYVHo2W3ny/Ngz9FTXdpXTd3kU/TI6PDGyejNwtnawcrmzMj79MfTftDYVmXfU0RZVkZd2WNmytFa6dBsY9ToWeXTa/XM+Vnd2lr4z+92zdNh5c5+X9l7TfzjTlDvXEpr9k1Te04/TEo4PlBDQFxcSmPYYVvR2Vzq0GRqzexS7t1TXNt9VeXbatvG4OzFzN/Fvs7MvtB3z8vl3cnkY9DjTWX4S0Z1ek5r2G1w099Z2sxgWd51UtnbT2fPa03Y1FrhyuN6zddb285cX9HhVPrmSlDcWEVuZkNLXEA7S0Q6SFY9RvRSS9reWuzM/1vV31zj4FNlzu1W49Jj+MfXeMjI+c++z9a+xN/LyGLtxeVU0tVf9dhZUPVcTX7gWGfM2mzNyPnmyP5Tz9JZ88t+W8vUUefJYWrF30/X2FJt1WVU2fxMbXFJTt9PQ2xgQVBcPz5aTDpIZENG63VW1c5q5ct4W9X4UXT0TVrXX0vk4V7uy35nzddsycHTzrvHeMfGbejK7V7O0Wrdz1xa219LdPBMd877fMvPXurUWl/U9FfY2F3uzPhY1ddn49JqZtXlVe3VX3PdY1ntYUxmZkdKYE9AUFA9RlU/PFNRQVTfYFrU317ZzWrxy+xX3dxb799ba83gaM7OXu7L4HfHx+rLweXvxtBZ+9NeatLrXdrgU2/fZFDx/V/S0+7VynFmzuVpz81t6cbcYNDSWG/Q/FLm8U5ed1RQ73BMZ/BOVu9bTG9aSVxmSUZeT0NTTkBMZ0pL2O5R8NVaZc7fXtjVVWDdW01tZlB722X/1uli2NLz1cfY1sHI2sPE7tzI33XO0Wzoy/xgz+hRcd9aYNj7Xe3pWHbP5GPNyf7cyeJwy9tb2s5kXthtTXjvTFjmTkveck5k6lhX/lFLV1ZBSFlHQFBOP0tlTUrlYEZ21VpoydlqysVl9MlgTdrfVePMZHjS62XT1WLfzezmxsvo0czs38nfXNfVW/3O6nHV707ozlte0fVS591f2svn4cPJ4czMfXvO31vc11FT51FGZ1lETmRKTe1hSuzZT2HWYkxyXUZZZklJY01DXnNLUepUS+7qVebJ5vbKz2rl5k5b21tS19pOds5rY8viT9rG7uHBzdvEyeHKx//xyttn1c5kbtddVNt1SWzuS1LlX1XVzWvYvtX8yM5c28b3ds77U3zqTFX3SkVmXUdf6kxl2F1Z2XdIXGtJSmRJPlZXPUxmR0t0Tknb/E7gx93iwMv4ztZX+c1fXs/5Ud/XV3bOaVPb3VnfyOvgwtXcxM1e2cph+cnjV9jbT+rOW1XU9k3m1ln3yODmv8Xdzcdz78jdXNXfTlrmS0f8Tj1QWD9L+01M3u5V4NFUXtZbTedqQ1RwQ0p7TUt3YUhh4VRk1W11xs9g0c1OZ9JTTtn8RnHSUmjOdFLd3lfaxu7XvcrRvsDczMXg2MXdbc7dTG7TUVLaVEXp7Epfz2NnyNblw8xo08pj3sV5YMr4S97hRlP3QkTtUkLv+Ep7105W11RH515BXmo+RmRAP29PP3DsR27PW1/G0m3Dw27VxF5XzvRQ3eNOd91RXdtXTeR3Ud3RaNnB3ePEznvL0PHIynrOzljwyl9Zy/RN1NZN68xm7MPZ3sDRbs7ZVt/TXfXVVU74VkNbVD9NV0BP305N0ndO1udQ29ZObdRMTuhKRX1XQW/zRGzdR1/OWWjD23DG6FHTeUTx5Uhu0UxgzFhU0mhSzdpdxsdzycDozsB65MD5ZcTdWc/nS9nYSunXSWbRTVfIY1bD023CxmLQyU/4xWTww2hTz1lD61c+bmo/bN1HZdBMVNBQSthcQfxoPVX8PUfrREXcUUXOcUXN2UzKvmjMvF54xVNPzGhQzm5Jz+1F2uJD/NBL5sFc9L7kcL/VVsXSSMzIVdLEVXu/bl6/2VLM6E7MzU/Mv17QvmzfwFRXyGNWxm1J1mg9aWI7WV46UOhCTs1QTMxWRc1kQNrsP2nbP1jVRlTUTE7RUkfRX0jO207JxVPXzEle1klVzE1IzVxJyOtKzs9O2MNg0L7007vX5MDcVcfhTsfRTNLPTNnLTeXITFvLTkzGdE7B0lfFyFTYyE3iw1Z3xVxPz1pF3F1A62I/Y+pHXONOV/dGSXZLSm1QRGtdQ1vnTVreVVnXalfW3mjMy+zJzFna0k1011Vg2lZa2FlZ2VpT3OdY3NJr2sro687tcdn6a9nc89fc78/P3dPS6d3a5eHe5urP1NvP0unf9Vtp5llo51tm4WJRZVVKW1dPWFRRXnFaW/hdWmNTWF9aWWJbUmlhY/JtYPT1X2zvXnTm/enS1/bd9lNpYFVmbFti7PV77m7u2N7l2tbh3NPZ2dbi3tfb393g3t/u9fHn4eXq4uDo3t757Ofr4Nrb3tbQ5vTl5+3f53Lo5Hf5+19bZWpiY1pTVFVNSUpLTlBOUlhUVVROUVNRVWZpYG/o3+vr29/Z1Nja1dDc7en2Zmd6YV93cmlzbF1gaW/67/vw6er9eHdoceve2tTS0tPY3NPVztba3t3W3tTS1tXSz9HQ1uDe5mtveWhtZ2BcZ3NfWV5WVF5fZF9aWFdPTU1LUllaXGR+/WdeXF1dW2r0cWx67P3t/HDr3+Xy5d74a2BZXWNdXmRlZ252+/P+6ePZ2tff3tfndfX8b/fe2tjPzdTT2+zx6enn5/B76+p13unp29PT1dHj3OR66era2vngd/rsYOt5X/16eHFtYU9QSkRAQUdJTU5PbF1VX1NPUVVgbOtu8ODf1+nX0dnM39rZ8+BlaHlnbnh6bF9qaG9nZW3u43x56WVfa1lTVltp7dzY0NDNydvV0NPL1s/Y2s/k2tDc2dTP0dfc7uj1X2Jt5HD68k9u9lxUZW1dcPldaGZXT0pLSUZNT1JfXWtgW1plWVt9+vrt2txx4+D98tzm7+HfZGNhVFhUYWVdaWNhaG7ybPXm09rj3uPsd2t5XWN1a3zd1trXz9rf29bW1dLX2dna6eTy6OPf6trT5erlfW7o2+fd1udv6OFwd+fk7+XubV9bU0pFQ0NEQUhJTE1OTklMUE9Qau313s/W3tPR19PO0NDP1N7pfmVhZmZgbGVnYmVjW2psbuPxZfppWVhiV1BZZFvq3OLZ0dLPyczJwcnHxcnMy87X2eLd19ri5el6cGFodmp99HNnaGtVWGljXfvn/Wr6YE9ZVUpNTU1PVFddVUtRVE1PWWD94NvZ1tXS1eLf2t3h5nx2cmhdWFVUW2FSYWRra/Xr997O1/Dg+G31b2ddWHzc/Hbk4d/j5P7e0NPPz87K0tHV2ut34e/v5PP97uf1eN7X5eve6Nz2YfN2/tzv9t7sa11aT0hIQ0JGRUtKSEZGSEBFSERTbO7VzszMxcbNzcrOzdTq5Nzj62lWW1pYVVlWTVZdXG108+T2d1xkYF9dS01gX2x28t/Z2N3QzczLxsnFwMnHxM7f1Nb06HhpbW38a2Rt+HtkaO5lWGdXVmpwfenf5un5bWpnTUlSTExXVEhOUkZHS01OUF9y6NTKzNHPzNbaz9hleO5sX2FkUFFQTldUYPVgXvzd5NnO2Onb3fdtXFlaVmhgYOzi6ezk2djNzMnJy8jMzMrO1tfe4GRiemhv8mr54uX97+b7+Xxnbmxe8eDj3dHg+N9aSElLRkFMTEdPR0ZIQEhBRVRTevDPycvCxMPIzNHc3dvs7O5z/F5eXU9TWE5XW11cet7p2tbs4PVXWVJST1tVV+tr69rb1tvIzc+9zL+90LvMyr5nvUvl40XZR9tKbFz2ZephbWRP4knjTdVp4s/ry/bfZlFcTE1OS1NMU1JTTU5KSFBMVF9559zN0tXG39LYWtBZ9N9Nz0LjWE36R+RL6VrkdtPfydTQyerOU9lIXVdMY0xmXGPqaure2c3UyczKysTJyMbPzdznbGJ7Wlz6VN7xZ8tU2HdgzkPKVOrafcppzPrZUmpHWkBSTkRNP/I7VURBTUBWSFLtVdTS1cfJxcrJ0NLb3ePpfmdpYl5PVU5eT1drV+xs3dJu381N3fBB0ENI2zvWSlDBP8L+37phttXBwsy40sDIxM3N/NNddFlTXUnrUttbbFxoaF9pX+ll3erp7dfW+PlkXmFIW2E8dFBB2DxQaTzOPFbdPL9H0cpLuFq//ubITtZX51hw7uZM5Ev5Xk7RS8ljyN/N1ePLZc5PcWZI5T9TUkTdTV/pWdDh68TvysP3u9fPvdzEy2zH61DDQ9jcR7pH289EvkdvzD28T+nHP75G2uA/xDxjVDrXNFdSOdY030VL3j3SSd7lcsvqx9HGz8zJ88to2+Ne3fDxblVdXktwVlnmV9r5WttqXNVE4m89yTtsZjrIQH3OQ7phzbxUs+3EulezXb68TbNIyds8vTnSXUXBOslNUtc/0Erw9mzVXNftz27U/fndSt9DXVFC4z1cUEDaPPdbP8g9z2xKvEm96Ou/UclW3ntf2GfTZNpa4FVX603VVdnaV8pTzd5Ox0TdVz/JOPdQPso5y1thxla+9svNzsfgxc/A1sLQ2MxazFXk7GDGTs/mT8hA02lEwj/Hb0m+P8FaXclAzkdbTj9UPVBASklRSU5fTmtN111303y/4sjHd8Vq98lLztpQv0vc2ULXSFV5SlzdWFjVUO3xT95eTN9PT9tC5HhFxFHnxlO91ua6Y73CXbPwwr5ju2P8z2Ny3F9mzk7w50L5UUPaRlHKQ9PZSrxR8L1Ax+FIvTvz3jXFOFDlMsg6WuE3xEFq00O8UsrJULxByOVFuz7E5Uu7Rc/nSc5MV9FO2txKwkztzj/DQ2nUO8FBX+A8xj7s6EW9QMbST7VGvcVzs1+9v3e+597EXsrKT71O4887wD9P2Tm/QV7IPMBBeso7vD7U0Dy7N9tMO9Mw3T5K4jvKQt3kT71Nv9Hst0q6a+DCQrpKzdhPwj7QWFbYPM5HWtVAxD/g/T/JPstXWsxNxk3i91jZStBm09pfv1vGyXu398DAaLt9z8xlyv3dct5sWfE+6EtD4DrhUEbFRtrOSsRsa8Nw3sZy9dRFcWc4/UM+6jpUdzruYE7JV+TFW9nMTMvcTr9ZbcRHz+lIy01byE701k/K2knFYFHGRXDLRs7PQsZaP8A9T8o4zNxAu0huuETAw1i02uG1a9C7Vb/ESLv6Tb49bsw0yU08vzvnzjm9Wka7P9XLPLhaULw5z2E2yTZSZTjPP2hvSshMx9zdvVi77mS7RcLdTLhF6cs8w0hEwzrcaUG9P9rYQcNB5fxDy0bQbVvCRM1XVMc9yGJnwUPE1l3Abs3C/cPL8Mff2s/t1/LiXGjxQmxGS2A65EhV3UHEalu/XczKX7/c/8hg+3dNU0xNQVRLPXU/W19Aykzf0lO8U/vHTM71V8prZ9H7YNlgWt9Va9l0fdPQYdDaVtJgTNZqRthqSNpaS9xOStxRTdRcYMth2MbtycTOzMXMz8XM2cLTW77nTc5OSHZAROFDSc9KVcVP2MJIxNNEv3JLx0NSzTpZZjvrP0LUPmXcRcZ8b7lsz7tUzMxMwXBTw1Z2z0Xw3zvzXT/SR1rEP9fIQsRfUMY+7NBAz2RUx0fa2krKTHHOScty6sdawdLUxHy+7d3CXcTybcVO691F4UZFeDpiVEfWSdba9cb8wtDzwV7K7FPGSl97P35EP2c5UFE/2kb800zH+t7HWcvy489Wynve3FjIWGTSTer5Vc39XMniaM77b9pTZOhNVftSY3RMelxMb1JiV1XPbWrJ2NrG1sy+7M2+/cnBbMXLW9TdU2F4SktgRkx7Rk/ObFfG0VvL11TR7EzR9EfgaEJWVT1SUT1ndkfiyl7SwnzVxnJ7xF5hxl9Yyl5Yz1VP1lpH22FL2mlOz+lUzuRO5txJatFL7dNP3s9KZs9MTctQWb9T+L1i37tn8btV27xKz8VB0dxC0VdC2ElA1kVL0j/g0ku/1OC8asjFTsjvXMtL7vpEakRHSj5cQk/xR9ZeXMNQ1NNOwmxexVjrz1bezV/xyV16xlftylPozl5tyHNNzVdH3EtO3k9o6FD8U0bjSEfPTm7MZM/Z78fnzcpvwM3pvtrQyX7R7/7dWtpVTtZGZmBE20ptzU/K41PGV1rOUnnPXGHdSUvuPkd3QVjoVmfQ3WDL01LNz17d1277799oattabtdZb2X0ZkjXXknI7FLN8E3t9Uxg0V5cxedYyt1I3t1D68hN6cJXZL55Ur7xTbzvTb7qS8LdScvqSct8StdnSPVqSPLpVs/deMzj4OBl0vplyW5V4E5MUEZLR1NYSWh8S/jYUmXRdGbN4lXP21DNzE7TwFrpv2tzv2JOxXhKxN5BzOg82ng83+FC081E4dtFa3VJc95X7thd095eymzpxV/NynDF1/bC4WzH6WLNYVbPVE/kTU7gWVXaZlTddlXd91jV/v/TUOluROlMS+tKYuRMfdBSdc9R581S5NBP7M9c5c1i5st7585s8dFWbv1U01ZW1Ulv90fwZUvf3V3L0FjM3U3Y9FDW5k/k4Vfd31bj3lvU1mPQ7PXKW9HNXMzgZtV4ZdhoUeJbWNhY/dVQ6tZWcdprb87ua9D+UftsR1TvSkzdVEntZU1u71xh3vVc4dx63d3U2/rN2W3PzuvfzXl02F1Z+VpHXGRDV3RJY9ZlcdDwXv/pXFfc+FPs3GtX7NpTbdB6c9DP7s/E2+DL0F/ZyU1nyVpT2vRNbfJKXepKT+FRSt9rTtvUX+vO8W3kbl1faGVYaN5oT9rqQt7RSGXRYlXM1FrU01zazVRpy2JXz+Vb4udSW2lWUFVYT09Z/2d6x/VlvtdQ0c5VXc1dTs3sStzmRW/PSXXFVfy/3PnF3lfN2EfZykj0xU1exk9XyUtPylBLylZHzWRVymVgyXdX1ftM5e5L53dF2vw/9vM/d99H485Q0sBb+L5dV8JtTsXTU8jLTdLIRV/MSknbUUD+XkTa20fOy0vSzUb7y0poy0twyUpezEpT2FNox+3bus3jvdxgxV9Lz1tOynBLz+xD6OBCaN1AW9lCVMdUTcXcTcfLT87bTM/dStPVSd/RR2/XQV7SQmW+V3LBbWnQV13aTk/MXlDHfE7G+EXM5kPZ6kF75Uju21fOzFnKwkrkw0piwk1YyVlM02NBd3Y+ZsxO379g2b5WecROTcdmTcT0TcdhSsv1Rs3fRs7tSc3tSsvWS8/KSfHNSmLRTl/YSVPPTknRTkDcVkrK21fBy1DF0EzP3ErOz1LJzErYzEnt0Up320Jl2EFV109W12pY02VO0GtNzdhM2ctP7s5JattEZ89W7MHb5r/RaMjsStjpR9jQR2faSF3ZRmnWQmTPR1PKUVHGaF6/YlrBYEvE1kzM1UvPzkfczj5bzEFOx1VSxfVQx/xGzn0/3tJIe81JaMdNWsJWTML0Rs3gRdPPSs/ITNbESmbAVFHFWE3GXEnIWz3a9z501Eh4xlXmv1tgwl9LyNxKztJE3NBD4chJ+cNdWcbqTs3eSsvVSM7LQ3vHTFPKT0zNXErMbUHX5z33zUNuxFHtwVRuwmFPxtJLzMtH1ctI6slGXsZOS8lYQ9F2RdLdRNvNQ3jFSV3BUVTBaVzDb0rO5kHfy0jzxFr6wXNsxG9Oyd5E2c5BWc9ETdFITMlWSMbjSMvOTNDKUNPFTOjDSVnEWFXI/FTH6UvN4UDc1z5nzURdy0xWy1BMx3hFytVC2cxE68dGcsRJX8BPScVvScXcSsPaRMrOPtrIQnjDSm7ATVfBR0bFTT/KZkHK30LN0ULOxUbYv0xmw0xPxU1MwGNJwttHx8xIy8NH0sJD4cJBWcVGS8hPSsZfSMXtQM3WPuTOPu3KQXbGQV6+U1W76lS+30nD2kLI0j/TzEHtzUJcyEhWxE1Kw1dAzGxDx+FGx9FIycpH5slLXslMVMRVTsNaRcX2R8nTS83ORN/SPV/NP0zGTlDCUk69bla82k7FzknUzkXcykfqxU1rvl5cw2VPy19F2Vw/6HE8ceJAb81G779RZcBYUsN4V8X4TsjjR9TWSdnHUvnHWlvOUUvPX0fN20nTzEvkzUdnzEVNz0pPyFlIy2pGyt9LyMtOytdHzPJByF5ExVhZwk3xv0nIwke/1EXCSUvBPufKOsRoRrpIdb09xtk9u0VPvzjg4Tq/TEy9P8rEQrz0Sb1IW79E4sVE/dlC7M9J3s1KftBLVttQVNJrV8zZXdXOVnHKbVDb7ktq1VlV13xLZN1QV87UVW/MZ0js00pG0N1EZ8P/Scm9Ylm9wktbwnU/9L9kRdPEU0fNxVNOyMtJRs7QSUbY4j9F2OJASsvMTVXDxlFQyclVUsfDWkjly2FN3sXySmnNcUVW0uJJUM/OWlDYzWZN7stzSE/a60pP2NBTS/DQaE7hxtpWZdDaUU7t1mdTctbmWHbNzPZo0szxUWzedlRb3t1eWfDbe2Lnztb/ed7Z/V505mdRVmtsV1nl2O9s6NniYF/y6/dv/eR0WVvy7WtdcOZpVV3y5mtj39Po9N7X3ff63914Zmd3dltZaH5qWVlka1po+vZ8Z210alpbam50YXbr9ezg1dDX2NPW5ezo8PD5/e717v5+7efl5uPk53tq+P5sW1tgWlVTXGlmanXs8vfj4+vs6N3d4uvp8mxu83xtcvt1am56fv1+fG1l++54d/Po63d7d3Rra2hiYV9ja2JrbHvw6ex9ffxwZV5gYnJ1bnX8+PHh393f49/k6unm7v3w+HF+7/xze+3g3tza2d7d3d/qfHVgWlpbXV9qaXJwfPT9e3tyaXJ9d/1sanJpam588vpwcPx9++no8PPv5OXo4uLk7Ofl+HB68XJibW5mXFxgYFhebWRaXWVhW1tbZGNjaWpuevXt49zU0dDS1tne4eDd723u5u9+7urk39/c3uDl5uv2/21fWFdYUllfamNda352cXXs7e3h3uTu6/J4dm7+8/js7/J6+OvucmtuamZzcHz6+fT7cnDu9XhtbW9qaXRxcWtydG5lZWRdX2tdXGdwamNmc/f+8+Xb3NzZ1t3t6u5xZm3/9PTp6O7n3Nbc39fV1dzY19/4bm5gWllmZltcY2ZpcXVobXB9bW91bGFhYGhveuzo6e7v6+jmd/vv+/Pt6Onh4ebq9O50ev15cGxsdf5oXWdmYVZUV1JPU1VYVl5pZV9lbWJp7+3h187Nz8/S1dre7nJteOXg5eHb19na3tzb4+jn7fDu/mhdWVVWXV9aW1pebm5m+9/h6ufm4vL+fnJueu/o6enr9P3t/GhqcHJsam76/nb9/m1xcnNubXx6dXz6e29+efRvYF1ZV1dWWFxgX2lnYGRoZmpx5tre2tLa5erl8GxkfPHv39nY1dHPz9PVz9bZ2Nfa5uvubFlXXFlVU1VZWFhiX2R3//70endtZGRoan706eTr9Onk+3F87uvt39vj7OHg7vv0/GpeamhgYGx0ZV5leGddZlpRT05RUU9VYWFgaHZ1aWzu6ujYzc3Q09TV3u7q8/ro393f29PQ2dzU2ubn3+B6aX37X1tgXltZXlpWXGNbXGrx6uPd2drs+/j3+nzy5OL+evL6bmhqaGd98Pl8+/p0bG97fGdu/2peYnz8cHj37fbx6/dsaGZVTlNYV1dkZVxbaHNlZ3b68eTb29/j6Pr8fe7e19bY0tLPzMzO1tjV09vf4uf/aGhuamZtYVVVWV9YWFhbWl129n3//2Rnbn7p7PLt9Pnt4eRoeHlu7t7f2uf153VpeHDu/2diW15eYmVcZG16b2dwY1tXUlNVXFtgYGJiXnX09fP85tjb2tfQ1vZx6uLr3NHe3tfP1trX0Njj3tbi9XptZldWXXFtX2Jpa1pdaW1jZ3n9+uzd63rz3Oft397oePXla15seGJaZfn2e3TveGFgYHl5eu7teXvqXmbxfuVqb9/ke3X4aFlTW2NaVFlqZk5YbWJlXG7m79vf32hX+Xrs0MzY1dDN0dXOyNLWzczQ2dXobH1dbGpXXmFXVVNaV1VVbGFTTl99Ylxwe1hw2d508tnQ3mp+enNw49z519zhzU9c0uFWXNjf4ONWT2tkWlZeZfJqW/BtVFNrZVxOaeltaFdYd3vt/mRv6eDr7Nrb//bp1tLy4NDb3czNztLX1eLp2dpvXPl8+ltd721ebHX3X15qbmlhbvd4b2x+eGD96Hhr5t11+XP+/Fpk93Zh4HZiaXDpeFlu53tt6dvvaG58fV1kaXh2/Hd0dmZu7lxX+WljX1ZeYVhUbGtb5+b+cn36+Hbg6dvQz8zMzsnFyMrJytLW1dXf8uTe82Z7811WXmBZV19qXlpgXnNiWltUW1hVXF7/8PDx6O3v+m3v+Pnq39fp5uTu5nd3Z2JqavtuaWp3ZmdfXF1UVVpTVV5hXFlZW2NkX2ZbYmRqe3NyanLwb3B67f1x6N3a0dDRz87Lx8nMzc/P2trd7e35d/Ztfe5yb15q8OfheW5r8+luaGJvZE1UXl9cX3duWFtudF1hb+/n4Nvb+Pzy5vVqbH31aGx64fPn4t3han5lXl1ibWJlYGhdWFxaU1NVXF1XWF5dZ2pdWltjXlNi+e//2crLzsvEysrJx8fH0c/Z2vT+2PX78ffoXU5r9mty7vNnZPpuX15ZYVJLTFZUVV1rYGXa5Gtv2+jaz8fM0Nji2t/p9OTsXlxRVGPefnX59eHqUFl2W1Vad15UWU5VVmT/XnlmWXtuZXNj/Fp0alJZWlv2zs7QycfMz+TOytHW6drd+nNtd3hkXt/0YGVY4HZn59/x5OvoZlltZl9kb2JgWFRiX1JZWWxTVmts2dDg0PDf2u55VfBbV9f1zurP51zW3NPe2tziaNrnbmpf+15bWE1PYEpbY1hvWHBeU2pXXE5MVFp64NzUysvPysrT0M7N09XZz9PTbV91aOtfWVBRZFhwaGV4Z/1jY2pWTmBhVX5ZZ2piX193d2lrcGrj0MvM0sfP2tbu8tvw6d3n3uDtdvh8cu1q8nZgZFVkYFZcWl9bWF5aW1xncGhg+GFfeW1tbF9dXWBv4tjY0NLLy8/Qzc7M0dLYzsvl8Wx47OXw7Wxw/23y9Ov16fB7amdpVlBQUE9SXVZVX1tkXV1cWFZm6eXd2tfX5ebb5uLz9tra4ubs3d31fObXdPZ7cH1ea11jVE5PUk9STVJZWFNbZl9aVmReWlpcV1xh/ePm3NHS1c3Lx8vMyM7PzMzW1OPg3OLu5+ducXx0/mxc+2FuZGx9blpdV1ZmYmdna2JwdftqXGny9vDq29HW3dzle+31+3Nu+Ofr+W787HV6dnFbXWhvXlVeW1dYW1pbXFdVXFxt/Wxwa2Zoam1gWlhYX3T15dvd0s/Z1MzIzs3MzdLX2Nfn7+nj3/X46nZpaG10/vdx/Or8d3FtXVtdX15eaGFdZGRdW1dfXlxjfP7u5+Tm5N/j8PDm6fDu39/j5dra4ufk8nJqZWJbWVpZUlZZVlJMS1FOT1leWVlYW15UVVhXWlx68ObYzczLycTBwcTExMfIycnR1NnY3uHr/XlxZl5dXWJjX2VxZmRkXlpbXmZoX2loa2NjZ3Jna/P//HTq4ubt3trffvb0Zl9s93Bqeenp8/vn7GpdX1tSVFRVV1pYX11fWFpjZWpvdXBqZmRfXlpcWlxgY2rw5eTXzszOzMnLztLOztPZ0tLY5dra7Xf06nlnbftxZ3Tu8Xd6+3NtaXJtcF5ZY2JdXGJmZWBpa2trcXb47enf3+bvfXb+cHfy6vDu3tvf5+jn+l5dX1tSTlNWUlBZWlNPVV1ZVlxdWVVWV1hYVlpdY19u6drSz8nFxcTCxsnKx83Mzc/P3tXo+OtfanNdbVxXcGZiWmh7YF1kcntpcXp1Z19rbWFgdv90cH7w6O3q3ubp5OrzbmVpZWNkaXn7cPHq7O34/21iXmFgW1hYW11eXWpraGVeamldXmFeVFJWVVJNU1dVWmbs1tPNysnKy8fJzM3MzM7Oy83R293Z4/v1+XptanX2+Wt5+nRmX2pyZ2JjX15aWF9jW11pa25rdO3r9ejf4eX1+vtub3j99/327Ov97+Hv+Xx+cV5dZmZbVFReWVdhbmpcXF5hWlNWV1RRUFRXVVFRXGlq7tTOzs3KyMrKycjKzs3NzM7R0drj8Pb0/nR8/W9rc3NoX15lYlxhbG1hW2dvY15xcmdjXW94ePjm4+Tr7+fsdm1paWhodfX6+PLw7/Dy8f12dnFwbm1tamBaW2Jpd3r/+WlfYmdgWFRVU09OUE9MTFJbZnXh2NXRzszLyszLy87PzMvKztDP1Nva3eDj6erq9fh7amhiWlxhXF9cV1paX2RfYGdoYmBcYXpz8ubn4ens5u34/fvz+/365uXs6e71+Ht7bWFseHBnX15ZVFNaW15lbGpmX1lbW1dXTk5QTlFQUVtfbezo3tjW1M3NysjIx83RzsjKzc7N0N3a2uDj6uHm8PptZWJeX1pbX15fW19lamlwcmpkZmNgYGVq/uzx9vD3/HVzcm5uZmZsd/ns4+XtcHvzdGpodOzz/X53a15fZm9oZntuamRiZ1tZVVFPT1FOTE1QWV9t/ern3dnQzczLy8zOzcvJycjKycrMz9PX1tXX1dfj+XRsX1tbXFpUUlVVV1VZW2JdWWdrY1tjePx1fvTz8vft3ern7ff4fOjm5uHg5vl19m5nYWVy/WxhXl1WUVNYXVZbXmVbWVtgWlNSU1VQU1lfXmZ27e3u5tnT1c/Nzc7P0MzKy8zLzM3S09Pc3dvW2N7g6PxtamRcV1hcX1xdY25nYmR6cV9mc3lvcvrsc3N49HxxbHr7aGdtfXp87t7e3ubh8mllZ25wen38emxnamZlYFxdX2FtbFxbV1hST09TUU1OWl9dXm33cPbn2NXb2dPS1dPOy8nJycbIyMrMz9fZ0tPc3OTtemZfW1VWVVdWVlhcXFhgXWFcX2xuZG1tbGttdX33bm977/d8+uvv+unf3dve6+xuY2FwZl9lZWZeYWJfWllcX15lcG5cV1hYVlVWWl1YXGt6bHn57/Lz6tza3tzW0tfWz83OzszKys7Oz9Xd3Nnb4+Pf531oZWReWl5jY1pdY2ZfXmh3bl1l7u5nbH39amdtel9aXmhqXWR6+Pnz49rb3urqaVxkc2xiZXH+Z2htc2BaYnVmY21wXFRYWl1TUFdYV1hfcmhnavLseHbr3O713tfY2NTOy8vKx8TK0M/N1Nra1tjc3t/he2psamRgX2heWFVcY1xbaHJeYP7va2Nn+/tpbXtuYWJw/m1odPD2/uvV0t/v7H5iXl9hXFhab21iYWtoX2Ju7XBgXWBZVVZcVkxNWFtcXWF4d3Pz3ujr6+He397W1Nva1c3MzczJz9LR0NHX29bU3ePg3+9wanxvbWdhYVtVWmNhXFtja3Zz/fZ4a3v3cGZtc2VqbW50cWtyefro3t3i7H38cmRaXmRgXmp4aWprcXpvce/zbl9iYF1ZVlJPT09XWVhXYm57/ezl5/P25uHj5t3f3tvPzc3Nzs7P0dLV2NnX0dfa3N3o9Hj+8/xsZW5mYGFmYV1aX2NnZmNna25qbnB+cmRocnB0bGpoaHj66ufi6+bn531ta2VhXWRze3Bzd3737ff+bmtjZmNeWVVWUlRTWVhVWFxgbPTh5Ord3N7f3d7k8eTb2dbPzc7O0M3Oz9LX2djd4dnd7Xd9+HZlcPZ0X2hqaV5cYmFfXmRne2dnamtoam9qbm5tdmpjZmRtZW/z7Pfv6Op7ZnZ8Z1pkcGllZWf8/Hh79+5ubPp3W1lbXE9NUlxZVmBlbm175t3m6t/Z4e7q4+538N7X19POzNTSzczO1tXS197b2drs+O71a3b36e92dvDzYF1iZ1lUYf5wYGJ2al5j/fdnX2FgW1ZZY2VhZfPl7ezh3n1uefRwZXf2dmFu9fNubv75cXJ07mtWUlRTTk1RWlNQVmFjZ27p3OXn2tjd7vXpcWry1tTSzsnHysvKys/V29TV3ePZ4HFnbXtmZXf3bGVqcGNeX2VcWl9u/WpkZf95bW7s73drampcWl1ramtz6+He6OPm93Fod3FpdftnZG57cXFpc/V4dnf+ZFVPVFJOUlxlXllhcmx37+nx6e3m5Px0amlpcunZ2tTMysrLzMvM09va19va397pfW95fHj64+X+dXZ1ZmZgXlteZ3NoXl9nbmplaf5wXlldWlRXXmZgbPPk5evq6vhubHn96+bn5vz28P1sZXby/nJvbV5VUU9QTk1WXl9dYHN8ZWvz8/jt5ev1/vP+d+3i3M/NzcfGyMrMy8/a1dLZ5ePk6Xtobm5rb3L682todW5hYGJkY2NpaV1dYGJmZWn393JpamleWF5sa2nv4O/+9e54aWZsdfju5eXr+P99bGNgcXhqYmxnXFhWVlVYWmZ0cm9993xhb/H0+nLz7Xpv9/t49ODY1dDNycnMzs7P19vU093g4uXwfezl6e7w5+ft+3l6aV9iaWpgXWpdU1VcXlleYGVnaGlrYVtXWmht/O7p6v52+vxxeOvn593Z2OHy9PRxaG35a11jY1tVVFVSUVVaYGh1eHt4bGdocHVt/ez5bPvn6urf2dDPzcrLy8/S1dLW19jY3Or68fZ2/e/2/vrx7Ph4fW9jX2R7b2FeYl9YZWdlYmD56+3u9XRtYVxgZGRufHtsX2BjXl1nb/fu6+Pl5+14dHNqaG1xYVpbYF9eYF5fZnN7dXru9nhwa2l4+Xxza3Blafjv8Ozd1M/Ozs3P1NjZ1dHQ09ne5eTo5eXn5ePd4fDq7XhqbmdcW15pXFVXV1FVVlhcXmZ1e/56ZWNfXV1pdfr38O96c/Hx9+zq39re39zh7Hd1d2toX1taWFRYWVlYWl5dZWVldXBqcXR7/ujrfW9w+/jx6d3Z2tbPzc7R1Njc297Y1dfc2+Dm7O3z7Ojr5+bn7OjvdmJlZWRfXV5hWllhX2BqeXN3bHBxbHBdXFlbXWBmaWZkY2JfYnT8+u3f29nf4urs/Hn9emRdXV5gW15hbGlpaG1tb3JwbWVv+vVob3VpX15kam796N/c2dDPz9fa29rc2tnY19jT1dfa2djX3d7c2N3k8/P+Zl9eYFhSVlpSUFdhZWVjZGBeYl5cV1xgX19hanJtbXD8733t5ODo49zX2uTr6/xkY2JgW1tbV1JWV1tcWV1jaGdpZnJ4ef7o8ntu/Pdobujc293b2NvW0tLa3Nnd6Ofi3uDl3uHd4+be3uns39PW5O7w6HloZWReXV9mX2Zv+/P89n1qX1xXV1VYW1taV1ZeaVtZZ/T8envg3uPc2d3j5+fsbm1ucmt5am9qX2hwaF5hbXRhX3D1bmhq/W5fXGJcV2R07e/x5d7l3NvY2dnY19nh397a3N7a0NPX1tTV29nS1uDl7OptYV5cWldWVlpcXWJwa2lfZVpST1VUVFhbW1ZdZm9pfOPa29zb1tnd3dza5Ovv92xfXmluZ11haWBbWVtZW19kX2Rrc3FyfX1rY2NkaGZ67eDf3+Pa1t3e19TT1dfW3+jr6Pjv6uPi6ebh397b29nc4uLg7XhhYGViX2ZtcnRy9/J9a2dZV1VVVlJTVFBPV1tbXGvx6Off4d7d3+Lf297h6+36cGt9dnV6+vl1eWxlX2ppZWdtcG5qbm9lW1haWFhaZm9wd+/n3t/d2dbU0tDOz9rf3t3p5Nra3dzZ2dvY09XY2dfe6XhlXVtaXFpdX19udGpeZGNbU1NXVVBPVVhQUFliYF7539jb2dXR1t7a2dvj6uztbWVpbGZfZ352aWliWllfYmZdaf37bXn8dV5XXmFkX2v35u3x3Nbf3tnT09jW0Nfo6OfrdXjq4OXt5d7d397Uz9nY1NbnbGJqYFhdbXN78+3pdG5vZlpXVldSTU5PTUxOUllZXvve5ezl19bq5NbX4OPg3u5y+/T89e/m4+1+dW9lZl5qaWFrdGpeXl9bUk9VWlZaYXx7cfTf3d3Y0c7O0NLP1dzh3N3g49zX3N3b1djZ087Q19ve9mdbWVxWVlpoaW1qbWZeXF1aVlJUWlRQUFRPUFRfbHP53dna3NrW2dvb2Nrf7PTzempvfnt8dXdwaV1gWFhXWV1lZ25xZGVZW1pcV19eYm177u7v6dvY1NPQ0NHY19re4ubj5+zv5+Dh5+Hd2dvX1NDS197se2RlXmJnbn777fZuaWVgX1hXVVVPTEpJS0tOVFpdYWz69ffy5eng4N3Z29rf6evj5Obi3uDh7ubscW5jXVpbXGhsaFxaWlpUWFxaW1xjZmhhcf315N3Wz83O0dHT19fb2Nzb3N7a2d3Z1NTT1dTS09rndmxnXVlaX19dXGNgXFxfXFxaV1leV05NTU9PU1tlbvjr5+Xi3+Dh5uXi3Nzf6uj1/enn6eno6n5sa2VgWlZUVltdaGdgYGNtcGVpd25lanNxbXXu7Ozp3NXT19vV2N/i4uXq7ubm6Ofe3t7b2dLS09HW2t7u7e11Zm/+cmdndHZscW1oY1xZV1BKSUlJS0xRXF9ibX3+fvzx7fTo3drY29rW2uHd2tvc3d/m8vTt/WVaWFZUUFRYWFZWWV5cWF9qXFdbYWljZH7j39vSzs/R09HU1tbU0tje3Nba2NPW2d3a19vl6+fvcmVnaF5UV1xbWVtoa15eb3BuaF9bVE9NT1NXWWV4fX3r4un3/PDu6+ri4uPh3d3f5+fl7fv/8PN7enhrXVpdXFhXWmFjZWJsc21iZG5kXV9wcGt46OLg4Nza297k4t3a4d/e4OPd2dfY2dXU0tTW2dba3eLo8vX3bmpobnVsbHFrZGNkXVxWT05KSUhMT1FSV2BlaGdtb2596ubi29bSztDU1NTW3dvc3uPi3eTve2NbWFRUUVdYVVRXXFtdWltYWFlaX2Vw/ezd2tnV1dTa19rW0tTX2dTQ0tHS1dfb2t3b3efk4eHvfH1zZWZlZmdmZ2NiZWliYWFdV1hXUlJTV1hbYGRmdHJ0cv9+//L69e/h2tja2t3j5OHl6urv+PPx/nltZl5dXVtdXl5dW1xgYl9bXl5bXF5udX334Nzf5N7a3uPf3NjZ29jT0dfT1Nba29fX29vZ2Nve3ejz+PB7cntzcW5nXl1aVVJQUE5NTU1OTk9UWFlXXmBoZ2N56/Dq39re3dTT0tTS1tTW3dzV2uDp5/FoY21pWFhYW1NSVFNPT1BPUVFPVVxVWm3m5end1Nja1tPS1tTRztPT0M7Nz9fW093d3Nzo5d7e7vXz9/p0a21+bGhkaF1ZWmBZT1BVU01PUlZVWVlbX2NhbnttZfzf7PTs3OHo3NTa3tnW2t3d39/k6nR68n5rfHlmYGdfV1RWV1FTVFVUVFZaXFpfbfb8fOnX297a1tjY1tTW19TUz83Q2M/P1NjT0trk3dzv9+Ll/Ht1/WpqY1pYXVhSVFFMTE5MTE1SU1FVW1lZX2hvZ3Tn3+Hh4tnV1tzU0dfX1tLY2trd7vB2bWxuaV5gYmBaWlVQT1hTT1BUUE1QWFdba3X99uTe2NTS1tHOz9XT0NfW0M7T1M/P09TV2Nna3uzq6/t1/nJpaW5iXFtdXV1qYVtXV1RPT1BPUlZTVV5jXF1mamZ56+bz8ejl3tnZ29bV1dvS0Nrj3+Zyd/tza2hnYV9pYlxaXFdVWFpWVFRQTk9aWVtr+HB75tvZ3NfT0NPV1dDS2tvS0NLRzc3U1tPW3t7i7vr4a2VrbF9eZF5aXm5gXWJkWVRYV05OVFVQVl5bXV9eW2Z9/vTf2eDl2dne2dPQ09XW1tja4vDt8WtncWhgXl5cW15kXV1fWVZbXVZRUFFPU1ldZfXr+una2drX0dLY08/R0s/V2dTP0NHOzdTa1trh4+b+c3ZsYF9pYFldbGNhcXRmZl9YUFFRTU1PTkxSVldVWFlcY3Tz7+Ld3NrV1tfQztLSz87U1tbj/vHrdXX7b2JfYF5cYmFWVlpUT1ZZTklNVE5NWV5ebfPu5dfa2dfS0tTPzM/Sz87PzszLzM3N09nZ3evp+mtsbF1ZYGRcWGBoX19pZ19bWFVTVVFOUFNPT1piWFdjaWR039zf3Nfa29bV19fU19jU09rg5vVrePd3Z2tsYV5nbmRfXVpYW1RSV1dOTlJVUlVeZ2386+Td2djX0dHU1M/O1NPP1NnSzc7QztLb4d/l9Oz4bm1sZWJsfWZdbXplX2xoWVZaVlFPTktNT05QXGBZXGp6bvHe3eDd2Nrb2dnY1NPU09DY5OPle2347m9o/P5paG5jXl1YUlVXUE1SVUxLT1BNUFxkYHvh4dvSztDOzM3Oy8vP0s3O087LzNHU2OP19XNkZ2tjZ3p7aWhsYVxlbmBeZWBYWFpVUU5OTlJYV1hncGZt59zl5NzY3dvY3eDg4+LY1dnc2t7vfvptZGt5cG/892lfYV5YWl1YWFtYU1RXT05UWFZWYGx07t/a19DOz87MzNDOztfd2dfa1dDT2dzh93JzZWNte/nw5u1va3Z4anr7Zl1hXVVQUE1KTE5NUFlWV2V7dP/j3eXm2tje3t/r9ung4dvU2N3Z3PR96e11/ert+/h0XlpYVlVXWlRSVlROTlBPTVJYVVps/vng1tPQzMzLyMfLzczP2dnQ0trZ0tjg6fliXmJfXW1+b3P1dWBgbWRcZmxeWV5bU1JUUk9SV1Zcamtq+eXg4NfV29vW2+7x+W9u/fDt4d3h5OX7aXX5dGz86/N0dXZoYmRcWmBgW1pcWVFWXVdUXWBdZn318ePa2djOy83MzdHX2t3o593c4drS3vbw821odvn88uvs5uHufvrvc2NncF9UVFVOTE9PTlJWVVpmZGF26+zl19Xa29rnfPXr/nfr397b2N3q5Oh6fuXwbf/qdGJva1lWXVpSWFxUUVVWUVNaV1Nda15d/uXr4NLOzMjFysrIzNLT09nd2tjf5eZ9Yl9iXVxmb2Ni/+338PdvePH9am7/Y1pcXlhYXl5bW2JkZnB8cPve3N3a2eHt6O1oZnZrZXzo8PPm7Hh1+ftu/vV4fe31cHV+al1ncl9bZWhdXmFcW15eV1dfXFto/frp2M/PzcrMzc3O197b3N/f3un09XRiYm1nY2n6/PTf3ubm4uny7vZqYmhkWllZUk9TVFBSWl9ZW2tz/uXf49/e3+bl6PV1+Ozy6d/f4uXl5Ozp6nt2+fd+/nhoZmNlX1tdXFpcXVtcW1lZWVtaWV1gZHbo3dfQzcrJyMjMzc7V2Nrb3ubn+W5lY11YW1taYnr6+fXs6vLs7f92dHFqbG1iXV5eV1dgZWJjaW989urn5eTk5ufr83JsbW9tePLv8PN7ffb6d2txd/75fvf4/XZ4/XR0c3R7cGlpZ2FeW1dWV1hXW2NndOnf2dLNzM3OztDW2dnb3ODj6fD3cmdpaGBhdvPt5uPg3t7f5e/3/HJpbmxhWVlZVVNTVlZYWFxqcG557+fn6+3v8vr79/zu6ube3t7g3uHn7PP3efrvenb+eGxrZ2RhYmZgXmNfWVlaV1ZWVlRSW2lu+d/c2dLMysrKyczO0NbZ19rk6+38amRkXFVZXl9oc354+PHt6+rpeHB8bWx6dGNfZmFdXWZlYm53fvDq7fTo5/dy+fZlZGlpZW7w+fjt8fv7+Xhy/Xx4/u3s+evo9nr27Xdv/n5zbWdeXFtVUlJSUFhlbnD65N/d1tDQ09LR19rZ3N3b3ufo5fB7c3VsY277+O3o4+Lq6+fo7PxraHBkXV5bV1JTV1VXXmJlbHnx6e7q6PT9ffrz+nR2/3t97+Hd5ubh5u7z8Pd6dHJ7e35+b3BrYWNkY2BfYFxaW11aVldVV11o/une29rUz8/PzMzQ0tTV3N7c4uz19XtpaWNdXVxfY3l4c/vw7fvw6fRza3B0cGtpaF5cXl9ma3D87ero4OHi5Ojt+f10bGliXVpeY2dueX53c/b0/n3/enP96+jq5uHn9f1++vt7d3BrZV1cXlpVVVhcXWV88PHq4t3a19bX2tva3ODq7Onu+/Tw8/v3+m9ueP7u5uDk5t3f5+nv/HBzcGNgYFtUVllaXmVnaHL6/fjq6v17+v9zdH50a2tjZXT6/P3r5+zo3+f87u9teOvq+Pfs9nNwdGpqbmFcXVxXVVtcV1hlZ2fw6fDk2dbZ1dDU1tPU29nX5O7o7Hhsfn1nZm5gXGdnX2zv9Xfv5fd58PJsd/V0aGlpX191fnH55ufk3eHs4t7pe3d6Y19oY1pdX11bX2Rkb/f0fPzvdm95cm/w3uDo4Nzi5+fsfvPsc2JlZGBfYmJcXmtubXR9+Orh5enn4N/n4uLp4uTu/ffz8/Du6vd6fH51cHvu4t/f3dzb3u3u+m1ramBZWVxeX2FpaG7+fH3/fvX8/ntvbX72dXV1cnX8/Xb+6uHl5+Dp7/1vZ2Vx/v3z8Ozv6uV9amhnX1pZWFleYF9ga3b88Ovt69/b3N/d2trZ29zc3d7r9fF7evbxeGtybmVhXVthbW5t++fh4+Li6u/s8X15cmlp+uv+/ebi6vXu7Ozpfmxsa2NeZWdgXmFmYF5hZ2t2/XN78/VsaG5ud+vk49/b3N3Y2+bn63ZhYWhhYGZpXl9pZmd1eW966+92/OfyffPv8Ofh7vTo5e3o3d7z9+5+cGtvefLo7Obe2t7k3uj/eXdqYWNgXWFtamJ0e2Zkbnp6+n1tbHh6aW34cW/983lu7ujs6ufu+uz3ZWNua2R36+vt5+Tx7+x9bmxiV1VdX1xdbWxpendu+eXq8uTe5ufc3eTi4Obp4+z58ejwd+7qemlpX1dZXl1ed/V77N3e5NzZ5O3r9HB78f128Ojz9+frdXzt/W92d2VfZ15bYGNZWmBeXGd5d3z4+H15fW1t+e7379/e3drX3OHb3vP79GhdZmZdXGZpXV5iX2F0emxv/n5ucezv/Onj7fHi4ePf4Ono4uX4enRpZ3B1e+zo6erl3uLi3+f+cXlrZm5oYmV2bV9rdmtpenptevxyanZzaWv9dmNt/X147unv7Ofvc3R4aml1fnrx6+7u5+n3+PN7ZGRsZl5fZGNnamVnbWxufu7u9u/m5+bf3+Hi5uzz7evx9vD5/fHydGxrZF9gbWtpfPX29Obf5Obn6vny6vP69fv/+O7y/vrvfWx3eGxmZ2hqbGppYl9fW11kY2Jod/38//j5++7w8err8O/j4eHe3eHr5ut4dXdlXWBoX11gZmBfa2xobm1ma/Hr7OLc6nXu5PH46Ov78Ozt7eftcHrr7fbt7n577+3w59/ucvLrd3P5d2lmaGhtfHBjde5+cPv9aWhwfHN+821ibnFkaX5waHjr8/zs6nvx3+x+7+52bvPseH7q/Gn98m5nbGNcXmtiXGltXmn5d2198/js3drd2dfn/eTj+Hz6dml383568v5kcup7aHv0bG/t6/3u4Pdy6Od7fefucP/p7X7r5/vw5ftre/1nafT7ZWd9ZlliZFteZWJlfe//e+nk7+ne7Xrv8m5z6+x18N/w997hdW9uYWBnaFxbbm9eZnpmYGz+ffTc2eLh2uXv4+pra3xzbPzvfn3l4O7q5Ov29/tvduzuev/xfP7v+G9v+Hdr+O96+uTk9fDr+XN2d2l663dkaHFnYGtwY2B2c2l5+HX84N7s7uXrdXV0ZGv5/XB95uTq6On+aWtlXmBiX2Zua19ld3Bu9+fi29XY393b4Ont/WlnbWVibHRwdevo++7h7XB0+XV09flz/ObtfPDy+ezt7/Pq3uPt5un5+/f9bm51cXd3b2RobV5eZmVlZ2dhZG9++/fq6/Tu7vl7eXx5/e3t7d7d5Orm5vt2bV9dXV9fX2JfX2BlbG3w4+He393f4uDl7/r8cGpnZGd3/v7t7Onl7vV7cPv4+/11+e/z9O309u317+/+9Ont+Pv3+HpvcnBz+fh9fHd6em5tbmptdWlnaWdobv72/vPr9nr+em93fXp2/+7q7Ofp6+vv/2pnZmFgZmhiYmdnZWlw/eXe3+Le3eHh4+jt9vxsY2VmZWpwc3R++Px0d3x09er39+ro7evk4ejp5vX+7+zw8O77enz9eGh5/XZ++3drbW9pZ3Bya2lwZmFoZWVscHt7/O/49ubr9/Hu9f3t6Orq4uv48PdqZmppY2ZrZF5hYl5gcHt67eft8efi5+fe5vLu8nRrcnJrbXBvbnh9bnj07vr26+/16+fs6ejy+PTw/P3t7/fy93Rzc29pcvb3/vTzc3R9c29udW9pcHJmYWZiYWpycXN99vv05uny7O769e/v7/N+cWxzc2tsc29x/nZtaWdoYWl9/vnu7fTv6ufk5Oft8+7+aWttZ2Zpamtrb3Nxcv34+e7q6+fh4uPl6O7z7O/57ujx+fH3eHV6fHl5/HVucWxscHl2b3h2cG5va2JgX11gbnZ09u3r5+Ph4+Pm6+vo5e30+m9qanJwaGxsZmhrbGdoamZpbnFy//t4evvw6+Tg4+Xp7ff9e3FsaGtvd3l7fP748+/p5+vq6PD17ejt7uvw9PDw8/T4e3lzbW11fnlwb3Z6fvr4/v717/n3fmtmYV9eZGxudnt5fu7l5OTg5urp7fL7fW9nZGdnamxsbW18+f59fG5pdnlwefH0e/bu8Ozh4erq7fV6b21jZGdoaGdxd3F2e3736uru5OXt6ePk6Onm6e3t7fLp4/D7fnxtamxpYmFpZ2j+fnv06O18+fR0Y2JfW2Rycvzw7O7m3d7m4Nzm6uTr8/l8bGBiZF5eamljcH1va2tsZGZuZWB5+m529fDs49/f5eXp7u3ueHX1/25ueHx6/PN2b/p6bP/xe3zy8n796fJ97efv7uPse3d8eG95fmxqeXNtfe/u6+Hg6ezq+2toaF5dY2dt//n77uLh7Ong5vDr6/f/dmdfXl9dXm38cHfv/XL893Bve3ZobvD/b/Pu+u/j5ebm6fN8/H1rbn1tZm15bGt3/nJ47ft97fB79u76+enl6evh4ejj5fX++XxpaHVuY2p2ZmZ7/nnv4+nt4+l1bHVmX217cX7r7vns4uXr4N3s7ub1bHByZF1gY15ibmZld35sb/R2aW11aWd1e2127vTw3drd4d/j7vT1dXD0+2pre2thaHBqa/Xuev36Z2N5eXH+7Oru6uTo7OPl+vbr+nl8fWtmcnZmbPf99ODe5OHl7f5wbmhofP9ubHlzdvrp6Obe4PL682lkb25mZ21uampoZGh5d2tw9vttb3puaXB2cnvt5+LZ2uTm5ev+c3N0b3VuYmFgX2BmcHf76uX9anBubXn79+vl5erq5uTm5OPv+e7r93Bta2ZpbGdn++zy8Ono6+7vem1vd3RwdWpndPH08N/b3uDh7nR+/G9tcXFnaWleWl9nYGJucWx4fmtkb3Vpbfn4fOXZ3eHc3ebn6P1wfvFvaHBoX2d3amn973lw+21faXxravLr9vvv/Xrm3efo3eHx6up0aXj9aWb9fG3s5Pb96ODs7uj+aXz2aGZyb2Rz9Pbs3tvx/ujvdvbwb2p9/WZhY1xZY2pfZ/z9bWxuZ2Ryfmlw7PL25t7n6dzf8PDs/m3+fmdpfnpla3ZtbX57aGn8dWhteGtr8fB3efL5+eXc3t/a3u/y8HlzfHxuc+7zdHz7ePnk5vDz7XxobXVpbfh1ZnPz8e3m5ff65en+8/J4eHtuY2RtZFxfbGhr/3RnZm9ybHD4fXrs8Xz47ejl5uv1+vD2b3B6cXF+d3R4d3RranByc/p0aG9+fXl9fHd+7+3z5t3g6Ofr+n319nZ58/V++f1sbH7y/PTo7Pjz9nF09fRzdfn49vLt8O/m6PL08Pt0fX1mYWdlZGZlX2Fva19jamdjbHJw+uvz+vf2/fjh4u7l3uj37Oj38On4bHrqfGhvaF9lc29jaG9maHR1aXDzfHfu5efl3t7u6uDm6+rk6Ofh7vzx8Xp1+fxz/vltZ2twam94bWp78P938+vw7Ofze/Dp+Xr1e252+3NrffxsaGpoYWZuZ2Ft+nVue2xjaXt4cvXr7vLs+Hju6vh49u717unzeH75fHZ5dGxvfm9pe/53fvj59ejn9vru73rz6/j86ufv9PT7df3tfnnr73j97/h78+t9cvDr+O/r9/rs5/B7+Pptc31rZmplYWRqa215c2NgZ2dmampqc3t+cnT4dGh4+Pzv5uju7+zv7eDpffXo7fbw7fxvbG1lYmlnYWVpa3D++3j57Ovu5efs6OPm6OXk5+zt7fX49Pj+9fPx8PV6bXh5aWd1eHByeX5+8PH27+/z/vz1/nd7fvt5dXBwenNsbXd4bW55c3NtampraWhqbGpmZWhucHV1dP348u/y6Obp6Ofn4+Xp7fH8fXFlZ2dpb3D9+P3v6uvt7/Hs6eru7uvq9XZ8e3T/+3v97uzv7urw9/Dw+Xp7evvw93n76+z69erv/vx9bWx5eW9ycGhpbWReYmZmanr8b3X6b2NlbGhqcHFpcPL9dfv8cHzu7+/n4ejs5OTt597n/Pn2cmllX1tdZmZs/PX/8u59e+zl5uTf4ebi5PlzfHtuePf5fu7l7fTu7vfu7nlte3xsaHRzcXv19PLs6/91c25w/O7y+PP0eW1mY2JucG3+7/t3c2tgYmdoZ2hpaGpuamRsdW5wfP98fvD2++7m5ubf4efj5PB1bW1paW9ub/jw/f78cXP37Onq6uXq9HttbXp3cvvu7fDu6Ons5uPu6Obx7ur6bnD68/j27O3q4+97fHBoa3F7bWp3bV5bXFtfaGhrc/53aGZnY2pwbnJ+fXN2enBv/O76ee7v+fn3eHX66uzo5Ojp4+l9bXBpYGNtbmp8+nBte3788Ors7OPj7vL8ef3s7fTt6Ov59+3x9evr8PDv+Ht1b2NnfP549ezt5+Pr8+/u/XT893j++XJoaWtqbnRubnn+a2BhYl9ibGxscHZoZWxqanr3/n3z7/l4eXN0+fLy6+Xi4uPk6fTy9nNrbG1qbm1maXZxbXr4e/vzeWtsb3N77uzt7OXp8+/m4+jl4uPk3+Hv8/V5/O7u9e3n6+7n5uzy83Zsb3JvaWdiX2NpaWhra2hrbGZfZmtnaHH7en37d3T99fbw7O7u6un2cG5xbnF8/vLr7Pp69vV4e/5yaW1uaGRpa29+9X12+PP3/f14c/7w7+rg3+Xo5+vv6On1/fDq6+vs/W9wcnJ79/Tw6+378+fk6ezw9fX093p6+315/fx1a25sY2JjZGlwb2pufH1paW5ta3F4cH3z7vH293Rt//P//Ozs8O/w9vXt7X159fl+fHVqaGpxbmxwbGpta2Jga3B3+e3n6ODj7Onn6erp6u3v7ebp7evt7+3v9+/n6O/w7O/z6u369u76cHFvbW99+29vbmdiYmJdXWdxb/vq8nv7e2xy8vJ1c/n19Ozr9X56d3N58vx99n5tbHF0dnl2c3ry+XV6d25vef55b29rZ2dpanPu7fPo3Nzh4uPp6eHo+PP1fW1zfm1rffV4fO3w+fHw+/7t6/ju5ejr5+r39+zq7/Ds+HZ0bF9dZGRhZnp8e/N9a2RkY2Zwb2RkcXNqb/t+cHh8fvPl6fvx6/f56er/evDw+ezp9vvu+2xydmteXl5XWGNrbPXl5+fe3+3t4uf67uf3fH5zaWt4e3jv6PLt4OLu7efr7+vr9/bm7/vw83Fw+PV6fPlwZmVkXmBxcm/35ej37u50aW1lX2NmX15qa2Jq/f5udf16//Xyfnz0933y8nt98O737uTn8O3ueXh3aF5gZGBibfn369/e4OLn8PPw/m5ufG5jYWZgZHJ7+uzn6urk4+jp4OLp6OPj5eHj6erm7ffx7v12fXNoZGdnYmZrbHD3+WxnZV9bW1tYWFtdW19panTy7O3t6ebt7efr7+fl7u/r6+3o5err5u17fvlyaWReWlhbXl5lffDu4+Dp7+7vfHr+dW54d2hsfnp68efm5+Th5ufg4OXj4urr5eXt7enwd/z3c3vw/nV3dmxna2xnav78fvX6bWRhX1hVWVhWWl5cYXBxbf7u9H7w7n786uzt5eLo6OHh7erh5fLv7nz+9nZnaW1hXGNnY23u6erl5O7z9XVlanZrZGxwa2/58fXn3uPn3+Hn5Nzf5d7c4OPd4/Ho5311+PP/+u33dX5+a2NpaGNpeXRtc3JjXV5YVFdbV1deY2FrfHt29O739Orq7Orn6ujf293g4efv6+bx/vb4eHZ3a2VkYFxcZWx28O739+7t93ZtamRobWxw/Pj58+vm5d3b4OPe3d3b3ePh3d/k5+rw/Xt4dP/28PH5+np3eXJpZmhsbG9vbnV3bGJeXVpaWVhbXV9mbW9udf94cnl8fvTv7u3l4d3e5eju8fL5+Pfx8/n9eHF0c2pmaWhnePz/9evt8/59cGtrZ2JmbXZ69O3u6uLf4+Pe3uDe3d/d2dzl5Ob19O73ffvz+Pbp7Pj37fttcW5oZGNjYGdtYl1hY1taXlxYW11dYW5uaHT8bGp99fr06enm3dve4d7f7erl7vLu7f797vxxdHtmYGtpYGp5cHjt63lz/m9kZWtmaP3+ePDl6vHo3ujn29vd2dfc3dje7u7p+2x2/3N+7fb66uf1fPb+aGVqYl1jaGJjbWVdX2NcWWFkW2BraGdxdGRkbGpkcvt2fOrl6+fd3uXj3+bo4Oj47uv+e+nk7/PveWdoaGBnenRz9+v1/f54aGdrYmRweG166+768unq7uTi5d3a3N7c3+vr5O368fJzcfj49+nk6u3r9m9pZl5cYWNfYGZhXV1dWVpiYlteaGRkbGxlZmtnaHf1+/Lj5Orj3N7f3d7g3dvj7/Hzfnzv7/f4+2xlaGhgZHNvaHb5eHB5b2VrcGxpeHtwe+30+e/r5+ri393b2dre3t7m6Ojv/v/+cG1vdnfz8Pn49HtraWZiYmhqaGZraF9fX2FgZWtnZGhrbGprYWRmYGFmbm548+rq5+Th3+Pk4uLo8PP3fX716+zs6+38c291c3f+//X29/1+eHBzeG9ram1raHf8fnvz7uzs7enk3+Pj4N7i5eHf5ezx93Frb292+PD07e/6c25jX2RmYV9nZl9fYmFhZGJhX19eXWJlYl5jbGZodft6+enq6+Te4N/e3+De4Ojx9Pxyd/Ds9vft83R0e/56/3v++X5wcX5ua3R9bmx5emxuffl8++nm5uPf4t3a3uHc3+/t4+h99+z4b3R2bm58fHx6cWlla2dhZnBpYmpwZGJrbmlpdW1kYGBfY2JeXmVrZGh7+nrx5+Lq49/g5OXl6ujs+n77eHH+6e3w6ul+cXz4fnv08/f89fz08nx0fXhpaXr+bnfx8Pvv6ert6+rm4+Th4N7q7+fj6vDr5/duePx7cnZ1dm5qZWhmYV9maWNocHZsdH5+bGtsZl1aW1tcW11ka2hncfL4/Ovh5+rj4uTn4+Pg5uvy8PN9/u3p6+vl5vv/+Ppucvv2//77/PP2+n3+bGhteHBudPj2e/Tt7fPs5d/i4N/d4u3x5+Lt6ePm8/16em5oZ2diXVxeYV1eX2VnbHH+eW/68Xttbm1qX15fYV5eY2ppY2358v3t5+Ps7+rn7Ozq5ufx8Ozte3ry5unu6Ob2//5+/Xzy6ufp6+ji6vn5+XBnbnt5bnb8/nB0ffz7//z06evs6ubs9u3h6e7t5+jw+vfzenBwcGdfX2RfW15tfXV77Of7fvf+aGFkZ2BbW2JgWlteZmNpe/j+9Orm6vTv5OPo5eHf5Onn4ur37ebn8fTs6fxwdPt+df3l6vXq4uxwcf19ZmZzfm5sefd9dfTl5/Lw5eDw+Ofj7uzi4Orp4+Dn8/Lx93Jpa2ZdWlxcWFVcaGlrfenp7PF+e3draWhqX11hYltZX2hoan348/Pr7u/t7u3o7PXy6OXy+Ozl8fHt7Pz2++3zeHfy6e704Nni6+bjeGp29XNiav12ZmRt/HFu9eTu/fHk+Wh45+n/6d7j7+fe4+/o4+XxdXFxbF9dYF5bXGNub/3p4ul9cmttZmBdY2BZVltaVFZka2Jk/+v+cvfn7O/j293q7N7d9Pjg3Oz26OT3/urm/XD67vd49ujn6+37fW1pbG1sa2xsaGNjZW757u3p3+Lt+uzr+fHc3OXo29rp9uXe7Pzw7HFjZXJiV1lgYFlaaXNoce7waGBsdWRgcXplXV1eXVpeaWlpdP3/eXv7+e/m4OXk4OXv8+nl7Ojg6nv96Ox7d/DxeHno3+br4N7udPfp/Gt09XpoanJkWl9zdWlx7+xybH3x/fji3ODn39rf6+rn6Obn7u/t8n51cW1kZGtta2Zu+HhqanBrYl5mZFtaYFpPUVxdWFtwdGNme/lwb+rd5eze1trl5t7f7+ze4PP15up9fvD1fn79+Pfy9P57b256/fn9+nVubmllaHB0am349Pry5e376tzd4dzW29/c297p7OPndWz89WheZmxhXGz5bGBse2tdZHBva2xwbmtmZGReW2FnZmJmbWxpbHFudvXt7err7Onm63x+5+j69ejtfXrz8XRv8uTp9/Dg5P9+6Oj28+Tn/HTy8mtkbXRxa2ltaGJgZmpmbfHj5ePc2tra297g4ODl5eXp8vDt/W949v9yePX7a2dtamNgaW5iXF5iWVJVW1taXmlmY2lsbWxteu7p5uDd3Nzc3Nze3dze4uPq7vb1/m95/3Nw/n5zbGpoZmdz+vr6/fD2cGp3enRw/v5wbXh2amp29/Dh3dvb29rc3d3c3eHp6e3yeHBtY2BlcGxse/ZzbW90bW10c21rb21uZGFhY2hscXVuaWtkYGBrcHj78O3u6+3x8fD37ujk5efl6/V+fX70+X387e/69evwe/fp6PDp4Ob4eXlwbG14cGtmZ2ReWlxgXmJx7unk3tzg4d7c3Nvc3+Hk6ff79/53ffr58vX3eXdvb3D/cGZobGZdXFpYVllcXl5laWhkX19mamv06efn393i59/a3d3a2dvc3+Tw/Pl+/Xpzb3ZuaGZsa21xe3t+7+7w/v5ub3Z7b3F8dGhjaGNjanl+7eLc2trc4+He3N/d3ePv83VnZmtmX2Vpa214dW9td3p2e29tdn1sZWJhXmBjYmFqeWtoZ2hkZ21xb/vv6+72/P7q5ujo4eDi5OPq8Onp8fn09/j7+3N69O3r6+jq5+Hh7Pj7/HVzcG1ta2NbWVhWWV1hZXDu6ebk4uHf3d3c2tjb4ebvfHl8dWxvffn29/f8/HdyeXZrZm5rYVxdW1hVVldZWlxdYGJlbXJ4e/Lo6Ozp5+Xi3tvd3Nvb3d3i6ejo8fz39P5zdm5qam9xeXR79u3s+vbu73Z+7/F8/PxwYl9kYGJhaHD59Ozl3+Xi3d3g39vd5OzteG9qZ15gaWZobn1ucP/5c3n89Pr9fnJvbGhjYl1bXGBcWV5qZV5pb21od319efbr5eTo5d/f6ebh4evp5ur16uPo8fj3en18/n3t6unn4OTw8O/5b3NzbGRjXl1eXFlcYl9kcvL37eDa3dzY19rd29ve6eru9XNra3ZqZXB6cWp1dm1pcXBraGlkYmFgYV1bWVlXWlpdYWhpcXt5+PHy9Obk4uHa3ODe29zg3+Dh6+/s6/n1+Px0bWxsbmxz+ezy6uLg7Ofi5/D5+3NqZmtnY19kY2NkbHb+9end3Nzc2t/n6ejw9v55bmprZWVlamdscnd2/vft7/Xx9fZ8e3ByaGVkX1lXWltZWF1gYl9namlmbv339+7i4ePm3dzf5N7e4+bf3OHp6+Xr7vb5+3189fDu7Ork5uv07e74b2hiX1xbXl5cW2FlaGVw9u3r3tbU19jX2t/l4OPud333eGptd3Nra3lzbGhyeXJoanJuaGZoZ2JdXlxZV1lcXl5fZmtpZWx4d29+6uXo4Nrb3+Db2t/m4d/j7ebj6/387fFybXz7dHHv6O726OTq8O3n7HlqbGpiXV9iYV9jZ2lrcfnw6+Xd2drd4N/i7/zy8Hpxdn10bHr2+X788fR9fO7t9nl++3FmbHVpXl5jXldXXFxXV11iXlxeY2Nianv07urh3d3e3t3e39/c3t7e3uDn6uno73388PB9/unk6vLq6PN0e/V1ZmJoZ15aXV5bWmBqZmZ27O3r3tfW29zZ3Ofx6eju9PLs8ft88e34fP72/HZ6eXJtbHBuamNnZl1cXF1bV1hcXVhaZmtlXmhybGt65N/f3tnX3t/d3ePp4d/j5+no8/r08vxvdXt0b3L17e308Oz0+3728nRtbXFqYmBiZ2FfZWtycHzt6enj29zg5+nq+fbw+P17+3xzcHvu9/j06+j38+/t+nh+endtb3FrZ2BdXl1cWlpYWlxaWlpdXl1ibPnv6eHe3OHj4d/c4ODc2dzj3+Dg6Ozq7u76/ffz7+7t9PfwenB0fntqaXF6aV9hYWFcW15gY2V08Ofj4tvc3Nzh5enj6O/t6eX1ff/693R2/PP2dXh6e29oamppY2FlZ2heXl9gYl1eXV5fXV9hZ2dkaXPy7+7m3dne4d7d3ufl4ODq8Orq6/P28/r3e3Bxd/h8+/Xt7P7+/O3wfvTt6PR1dHFvY19jaWplbXzx7vTp5uXr9/Hw7/z/8+/u/ndvb3lwd/3r6vrz6+f3df/7d2hnbW5uZWlsaWNcXVxbV1dZW15eXWBhaGlw+erg4uLe29rc29rY2uDh393j6+Xk6f1+8e/2efjz8/p2dW9wbWludHxzaWdnaF5dYGRmY2h18+7v4dzb3+Ti4ODp6eTh4/Dz9ft4a3b9/nd3+v39eG5sZ2hkYWJmaWRkam1pX2BhYl5ZXGBoYF5na25qdO3k4uLc3Nzc29nb3N/m5+rp7PL08e37ffvx7npyfu30dP/y9HRy9fP5dnN4cW5oaWlpZ2Job3n49fDq5Obr7evn7vDp5uXy+vj6eWpz9/H8fPHr7Pr/+ntvZ2ptamtscW1rb21pYmJfWVhbXlxaXWRqZmZ27ez47uDb29vV1Nfc3dzg5+zp6ezq7Ovr5+fy/37v7Xtzdf11aWx1fWtkamxiXGFrZ2FhbHRzdfrt7OXn6ejk3+Li4eHf5Ojs7PByeP35d2xyfnxpZ290bmJha2trZ2ttamhoa2djX15eXF1fYGJqc2xreOni7+3f2tve2tbZ3uPi5O3//u3x+X3z7Ozt9/5++Pt5d/vx+nV99vB9bm5vZ15gaGxnZnD8/W9ufvb5fvnr5uPj4uXl5Oft9fP6cGx2fnp1/vf/bGpx/ntpa3h4cGttdXBsaWlkZF5aWlpcW1xfaGhjaG757fDt5t7e5d/Y1dre3Nne6u3n6vL67ujp7fDv8/h7fP779H5xcnr8dGpobWpbW2VtZWFtfXxucPbs7vXv5uPk5uXg3+Po5+vs+m9scXpzcXN0eWxiZGxsYmp+9Xlsc/t9a2VoaGRdXF9jYF1gYWBhYmNlcn17+Org4ubh3dnd397c3urt6ODm8u/r6u/58e3v+vbs5ejx7+/1/XZwbW1sYF1gaWRhaGx6bWl58fJ3dPPo7fDk3t7h4+Dk5+7+d3v9eXN4/31sZmltbmtud/l8bXB4eWlhZWllXVpdX15aXGFkYmBjanZ0e/Dp5OLf3Nza3N3e3d3k5+bf4+/y6+ny/fvx6u/27ejp+3p8fnJpam9wZmNmZmhlY2huc2xtc/32fvzz6ufr5+De4evr6ef1fPn1+3BwdXx1aWlrb29rdX72/XN8/X1xbWtnY11cXV5fXl5hZmZeX2duamz+6uDg4t3a29/f3uDm7unk5Ofq6erp7vT37er19+zn5/H+/fh5aWdqbWhiZGtva2pwfHpqaXF0dGxufvTx8evl4+ft6+jp7fDy8/pybXD//nBveft6cH7v7vx4/f59cWxsZmJdXF9fXVxeYWdnYmVpbWxpb/Tn6Orh29re393c4Ojn4+Po7ejm6Ozt6evt93758u/7eXz+e2lkaGtnYGVueW9u+vd8bW1xc3BpbX7v8fjs5eHn7uzr6/H8+PX7b21ye3dtcHn4+nn97uj0evj0+2tna2ljXl9kZmRgY2RiYWFjZmtoZmz/7vX16+Le4+Tf3N7l5eDe5Onj3+Dm5uLk6fL39O/u9ffu7fluZ2VpZmJhaHVzbnT9e2tmam1mXmVwfHdx+evq7/Dq6urr7+/u7vV+/PXz9vr38Ph3e/PxfnF78/1qY2prZ2NlamtpZGRlZGNjaGprbGxyev36++7l4OHg3tvc4eTg3N/n6eLk6+vm6O9+fvj5fnd69fp1bW1ta2xpbnZ6/29ze/52b3R5d2lpb3NuaXXz7fR99+/0enr28/b++fPw7/j++v32+fv39fh4/Pf5cmdtcHRqbHh5cWZmZWJgYWNlZGRkZ2dpbG797ujm5eDh4ufk3Nrd4N7d3ODp4uHn7vDr8/f/evh9dG9tbW5samx2d21rbm1vbWdvenVqZmpvbmt37unu9Ozp8Pn88Ors9vTr7vR8eP39/3h6enBya294dnJqbXNzbm58+XdnZmtsaGVnbWxnYGdqa2tw9+zn6eji5Obs6+Xe3+fn4uTq8Ovn6O378+/3fXr9/3xzdv19fHn++PZ+cHb8fXJrb3BtYl9kZmdkav77fXN29vr++u/l5+/v7OzzfHv38PPz9/T1fm5vdXJ2cXV8e3d0efx+bWZsbGZeYWRiXVtdYWZnbH3t6Orr5ePi5eLd3Nzf4N/f4uzp4uXr8u3r9Hdw/v9xbXB0b29obXF1em99/nlxbGxoZmNgZWtzcXP87/R6evDu8fLq5uXn7u3t9P169/f5/H79c2tlZ2xrbG51fPT7ePrz8f56e351Z2NkYl9eXmRpZmd1+fj5+u3r6ejr5ePk5+bk5ebr6ePk4+nr6Oz1fP72/Hx6+fT1envx8vl++/15a2ZlX2BeXWJoaGlscXh6dnR+8Ozt6uHh5+zr6Obv9Ovs7+/1+/11a2ttbW5qcHl3d3B8+Pv1e3h4bmVeXl1dXF5jZ2llbnx+9/vr5+Ti59/e3uPl4eLg4uLm6unw8/H4fnB2/n14dHd8fHhw/vT1/PryfW9naGdjZGJpbnFwcH58/v367ezt8Ovm6er09vP3+f348vV8dXp4b2ttbm5wcXb7+/f88uzq6/fw93RqZGhmY2BeYmJiX2RsbGprfu3r7O7p6Onq7+Xi5OXk4OTk6uzr8vZ++fn/+Hl97/f07vTv6vj78HhxZGBjX19cXmBiZGFrc3Bze/Xr5+vo4ubo7Ovo6ez27uvx93z6+HpybnFwdm9veXv8eXn4fn52fm1ubmVmX2NhXWRkYGJlbW5wdfPr7ujn5uDl5uXg397j6Oft6/b1fv5+bG54cnxwdfv5fv3t8+/w9/D9eHBub2xmYGRmZ2pqc3RxeHj78+zs8Ovr6fD47PP3/fju+f53//15d218fn55fO3y7fDv6vP1+/58dXJqaWxoY19fXF1dXWZlZmtsffTv8e3p6erq4+Dj4t/e4uPm7enu7vZ39n75/vbu8Oz08u3y9Xr9eW1pZWZiXl1dYF1gY2pwcXx59uzq6e3l4+Tl6ePk7vT16+30+/7wdnBudf5ud3j99H34/vh+/n5udm1sbGpvamxiZWZjZWRvenp3d/nu7/Hs5Ofn7Ovk6eXn6Obt7Pr1/HN1cv95evb57uzr8PHr7PH8+fZ9fW9wbmViXmRgYGlndXB3fHzy9fPx9O7t8Pbw7vT2fu/0/fx5/Pd9fHruc/Pm8ON67O/16v56bXVubmtka2tmYFxgYF1fZW9pbW1+/Pj0+eTo4ufs5uLf4uXe4+bp7uv0+3X99Pbu8uzu7O7x6O/7cG5mdnFraWNiXVtdXWFjZ294ef/27+3s8uzi5+bn6ufo6/Ls5ur1e/z+eXhw+fp9fXr4+Hp4e/x3bmhna2VpZ2luaWVfY2ZubGv38/n+/Ozt8vTr5+vs7unm6Ozr6e3y+nz6eXV0cvf78/jy7O/s8+zr8fh5eXp2c3V4bmllYWZlZmhufHl9d3n5fn51ffr++3z38vLy+e3s9Pz79fp8fvLq7fHw6uPp8/Xt9Hl0bHBubmppamJhXF1iXl9ia3Nta2t1/np5/Ovr7uvq4uHj4uDf5urs6Oz58PTv6uzt8Ozr7PL47vlya2ZrZ2VmZ2dhX19kZGRrb3Z4dnp69/Tw9u7p7Oru6OPm5efi4ubr9/H+dnl4+Pt4dHf/eHFxdXlubGpscW5raWpqaGZob3B0dHf7fHl1efT4+fHq6O7u7uro7O3s6u3z+n76eXp7e/T6+Pb18fPy9u3r9fh79vd3dHP+cm9tbHFpa2ppbWhra29wbG9rdHV3/P3w7O3u6uPl6u7t7PT38+jm6ujq6/D69fzz93t6c3ZpZmNgY15eXl9kYGFiZ2psbm9+dXv99u3s6+rl4uPf49/e4uDk4+Pq7e7s8PT5e/R9e3pwenJvamlpYmRhZ2hnaGlua2hoZ29qbnV59vbw8O7p6+rs5uHm5Ofj5ejs8fB9d3Nz/nZxcnN1cXVwe3dxdmpwb2prZ2xtbGpud2xsb3R7c3t+/fx99vz27/X19PX59/f48vz6+/bw8/Hz7u3v9fvz8fXu7urq7O/w83x8c3R3b3BsbGdlY19iYF9gYGhrbGtvfHt8evvt7+zq5uLk5OTi4+Xk5eTm6Orv6u709PT1fXptb3BnY2BfXl1eW1xbXF1fZ2Zra256ev767urr6Ojk3+Di4t/h4uPo5ebm6fPz+X54dn58eHP//ndxbHBwamVjampoZmRnZWVjZ2xsbnX38PDu8Ofo6Onr5eXp6+vn5+nu7e/2+Hd0c3B0cnh7eXl7/XdxcXV4dXJranRwa2hsbmlqaGtrb3t6/PP5+fny+fL7+u718vj09ez++/Ty8/r48+709PTq7ezn4uXm4Orr7O12bHJvbGZmaGRgXl5gX2FlaXB1d3L+fvr7++3y7Ovq4ePk5ubl5Ojp5+Tp6+3v+O7r4d3ndO9sa31eYl9eYl5ZXl9oXFtfY2NwbGz3cfJ76e5y5OLk6OTs7u/w4PT06ODu7vXt7fp4eOp49O9x/ut7a350aWVhbfxnYW9qYGpifux3eOPj5+Po39/t7OXo3+nj39/r4+nw5v125vB3fGp4a25t7flw4f16dnP1aG1sbVx5Z1ZuV2haY/hzfm12bO33d+9p/up9fHbre/92fX1+fur3+Ojteejncerl3Orm29zt5trsfv7w+/9tb11iYVpmVGBpbFljd2FkcP1Z8+Jm9uHo4gpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9nc21fMWNoXzhraHpfMTNrYnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfZ3NtXzFjaF84a2h6XzEza2Jwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZmJlMzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfZ3NtXzFjaF84a2h6XzEza2Jwcy5pbmZvCkBAIC0wLDAgKzEsMTcgQEAKKzk3NSAxIDAKKzk3NSAxIDYwMDAwMAorOTc1IDEgMTIwMDAwMAorOTc1IDEgMTgwMDAwMAorOTc1IDEgMjQwMDAwMAorOTc1IDEgMzAwMDAwMAorOTc1IDEgMzYwMDAwMAorOTc1IDEgNDIwMDAwMAorOTc1IDEgNDgwMDAwMAorOTc1IDEgNTQwMDAwMAorOTc1IDEgNjAwMDAwMAorOTc1IDEgNjYwMDAwMAorOTc1IDEgNzIwMDAwMAorOTc1IDEgNzgwMDAwMAorOTc1IDEgODQwMDAwMAorOTc1IDEgOTAwMDAwMAorNTIwIDEgOTYwMDAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2dzbV8xY2hfOGtoel8xM2ticHMucmF3IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2dzbV8xY2hfOGtoel8xM2ticHMucmF3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmOTAzYTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfZ3NtXzFjaF84a2h6XzEza2Jwcy5yYXcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmgyNjMgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaDI2MwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTI1ODFmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmgyNjMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWJmY2I2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmluZm8KQEAgLTAsMCArMSwxMjIgQEAKKzI2MzYyIDEgMAorMTIwMjMgMCA4MzMzMworMTA2NDcgMCAxNjY2NjYKKzEwMjY5IDAgMjUwMDAwCisxMTA3NiAwIDMzMzMzMworMTExMDQgMCA0MTY2NjYKKzU5MDkgMCA1MDAwMDAKKzQyOTEgMCA1ODMzMzMKKzUxNDkgMCA2NjY2NjYKKzUzNTMgMCA3NTAwMDAKKzUxODUgMCA4MzMzMzMKKzI3MzYgMCA5MTY2NjYKKzIxNTc1IDEgMTAwMDAwMAorMjE5NiAwIDEwODMzMzMKKzQzNDAgMCAxMTY2NjY2CiszMTA5IDAgMTI1MDAwMAorNDQxMCAwIDEzMzMzMzMKKzE3MzEgMCAxNDE2NjY2Cis0NTU3IDAgMTUwMDAwMAorMzM3NiAwIDE1ODMzMzMKKzEzNTIgMCAxNjY2NjY2CisyODQ0IDAgMTc1MDAwMAorMTc4NyAwIDE4MzMzMzMKKzEwODggMCAxOTE2NjY2CiszNjg0MyAxIDIwMDAwMDAKKzI1MjAgMCAyMDgzMzMzCiszNzQ5IDAgMjE2NjY2NgorMzc4NCAwIDIyNTAwMDAKKzM0MDIgMCAyMzMzMzMzCiszNzk1IDAgMjQxNjY2NgorMjM0NSAwIDI1MDAwMDAKKzMxNDIgMCAyNTgzMzMzCisyOTQ4IDAgMjY2NjY2NgorMjAxOCAwIDI3NTAwMDAKKzUxMzMgMCAyODMzMzMzCisyMjc2IDAgMjkxNjY2NgorMjM0NjggMSAzMDAwMDAwCisxNTIyIDAgMzA4MzMzMworMjI5OSAwIDMxNjY2NjYKKzMyNzMgMCAzMjUwMDAwCisyNjMwIDAgMzMzMzMzMworMjkxNSAwIDM0MTY2NjYKKzMwMzIgMCAzNTAwMDAwCisxODkwIDAgMzU4MzMzMworMzcxOCAwIDM2NjY2NjYKKzE5OTAgMCAzNzUwMDAwCiszMTM5IDAgMzgzMzMzMworMTgwNiAwIDM5MTY2NjYKKzIzMjA4IDEgNDAwMDAwMAorMTQxOSAwIDQwODMzMzMKKzIyNjMgMCA0MTY2NjY2CiszMTMxIDAgNDI1MDAwMAorMjY0NSAwIDQzMzMzMzMKKzE4ODAgMCA0NDE2NjY2CisyMjM5IDAgNDUwMDAwMAorMzYzNyAwIDQ1ODMzMzMKKzE5NDEgMCA0NjY2NjY2CisxNTc3IDAgNDc1MDAwMAorMzc3NyAwIDQ4MzMzMzMKKzE4MTYgMCA0OTE2NjY2CisxOTYwMSAxIDUwMDAwMDAKKzExMDQgMCA1MDgzMzMzCisyODA4IDAgNTE2NjY2NgorMjQxMSAwIDUyNTAwMDAKKzIxNTkgMCA1MzMzMzMzCisyNDExIDAgNTQxNjY2NgorMjQwOCAwIDU1MDAwMDAKKzIzODggMCA1NTgzMzMzCisyNDE4IDAgNTY2NjY2NgorMTQ4MSAwIDU3NTAwMDAKKzE5MjYgMCA1ODMzMzMzCis5MDIyIDEgNTkxNjY2NgorMjkyIDAgNjAwMDAwMAorNzAxIDAgNjA4MzMzMworNzQ3IDAgNjE2NjY2NgorMjA1OSAwIDYyNTAwMDAKKzE2OTMgMCA2MzMzMzMzCisyMDc4IDAgNjQxNjY2NgorMjk3NSAwIDY1MDAwMDAKKzEzMTcgMCA2NTgzMzMzCisxNzQyIDAgNjY2NjY2NgorMTAxOSAwIDY3NTAwMDAKKzEwNTMgMCA2ODMzMzMzCisxNDE4MyAxIDY5MTY2NjYKKzE0NjcgMCA3MDAwMDAwCis5OTQgMCA3MDgzMzMzCisxNzA5IDAgNzE2NjY2NgorODM4IDAgNzI1MDAwMAorMTMyOCAwIDczMzMzMzMKKzIyOTIgMCA3NDE2NjY2CisxODI5IDAgNzUwMDAwMAorMTcyOCAwIDc1ODMzMzMKKzI0MzYgMCA3NjY2NjY2CisxODUyIDAgNzc1MDAwMAorMjE5MCAwIDc4MzMzMzMKKzE1MTY3IDEgNzkxNjY2NgorMTE4OCAwIDgwMDAwMDAKKzIwNzAgMCA4MDgzMzMzCiszMzE2IDAgODE2NjY2NgorMjYzNiAwIDgyNTAwMDAKKzk1MCAwIDgzMzMzMzMKKzEyNjAgMCA4NDE2NjY2Cis5MDYgMCA4NTAwMDAwCisxMjk0IDAgODU4MzMzMworMTI5OCAwIDg2NjY2NjYKKzE4OTcgMCA4NzUwMDAwCisxMzQ4IDAgODgzMzMzMworMTMxOTQgMSA4OTE2NjY2CisxMDQyIDAgOTAwMDAwMAorMTI1OCAwIDkwODMzMzMKKzE0NTcgMCA5MTY2NjY2Cis5OTAgMCA5MjUwMDAwCis5MDAgMCA5MzMzMzMzCis5NjMgMCA5NDE2NjY2CiszNDQ4IDAgOTUwMDAwMAorNzc0IDAgOTU4MzMzMworMTA3NSAwIDk2NjY2NjYKKzc1MCAwIDk3NTAwMDAKKzEwNTQgMCA5ODMzMzMzCisxMzEzOSAxIDk5MTY2NjYKKzMxMDQgMCAxMDAwMDAwMAorMzM2NiAwIDEwMDgzMzMzCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaGV2YyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5oZXZjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MjIzNmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaGV2YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MzU3Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaW5mbwpAQCAtMCwwICsxLDYxIEBACisxNjk1IDMyIDAKKzE5MzggMSAzMzMzMworNDcxIDAgODMzMzMKKzE1MyAwIDY2NjY2Cis5OSAwIDUwMDAwCis2NTcgMCAxNTAwMDAKKzI2MCAwIDExNjY2NgorMTE1IDAgMTAwMDAwCis5OSAwIDEzMzMzMworNjIyIDAgMjE2NjY2CisyMTEgMCAxODMzMzMKKzc5IDAgMTY2NjY2Cis5NSAwIDIwMDAwMAorNTk3IDAgMjgzMzMzCisyODggMCAyNTAwMDAKKzE0NSAwIDIzMzMzMworMTQ3IDAgMjY2NjY2Cis2NzYgMCAzNTAwMDAKKzI4NCAwIDMxNjY2NgorMTQ0IDAgMzAwMDAwCisxMzEgMCAzMzMzMzMKKzY1OCAwIDQxNjY2NgorMjcwIDAgMzgzMzMzCisxMDEgMCAzNjY2NjYKKzE1MSAwIDQwMDAwMAorNTI5IDAgNDgzMzMzCisyNTcgMCA0NTAwMDAKKzk4IDAgNDMzMzMzCisxNjAgMCA0NjY2NjYKKzY2NCAwIDU2NjY2NgorMTg2IDAgNTMzMzMzCisxNDcgMCA1MDAwMDAKKzY3IDAgNTE2NjY2Cis3OCAwIDU1MDAwMAorNTc1IDAgNjMzMzMzCisyMzAgMCA2MDAwMDAKKzEzNCAwIDU4MzMzMworMTE0IDAgNjE2NjY2Cis2MjkgMCA3MDAwMDAKKzIyNCAwIDY2NjY2NgorMTM4IDAgNjUwMDAwCisxMjkgMCA2ODMzMzMKKzY0NSAwIDc1MDAwMAorMjY0IDAgNzMzMzMzCisxNDUgMCA3MTY2NjYKKzcwNSAwIDgxNjY2NgorMzY1IDAgNzgzMzMzCisxNTYgMCA3NjY2NjYKKzE2MCAwIDgwMDAwMAorNzI1IDAgODgzMzMzCiszMzAgMCA4NTAwMDAKKzEzOCAwIDgzMzMzMworMTYyIDAgODY2NjY2Cis2MzggMCA5NTAwMDAKKzMzNyAwIDkxNjY2NgorMTcwIDAgOTAwMDAwCisxMzMgMCA5MzMzMzMKKzQzMiAwIDEwMTY2NjYKKzI4NyAwIDk4MzMzMworMTMwIDAgOTY2NjY2CisxMzYgMCAxMDAwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfaGV2Y182NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmhldmMgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfaGV2Y182NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmhldmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUxZjdjZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9oZXZjXzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaGV2YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfaGV2Y182NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfaGV2Y182NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk5NDkxYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9oZXZjXzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaW5mbwpAQCAtMCwwICsxLDMwMiBAQAorMTA3NSAzMiAwCisxMDc1IDMyIDAKKzY4NjEzIDEgNjY2ODcKKzE5MDI1IDAgMTk5Njg3CisyNDA1IDAgMTMzNjg3Cis3NzcgMCA5OTY4NworNjgxIDAgMTY2Njg3CisyMDI1NCAwIDMzMzY4NworMjkyNyAwIDI2NjY4NworNzY2IDAgMjMzNjg3Cis2NTggMCAyOTk2ODcKKzIwNzg2IDAgNDY2Njg3Cis0MjE0IDAgMzk5Njg3Cis2MDkgMCAzNjY2ODcKKzY2MSAwIDQzMzY4NworMjA4MzggMCA1OTk2ODcKKzQyMDkgMCA1MzM2ODcKKzUwNiAwIDQ5OTY4NworNTg2IDAgNTY2Njg3CisyMDQxNSAwIDczMzY4NworNDIwNyAwIDY2NjY4NworNDI3IDAgNjMzNjg3Cis1MTQgMCA2OTk2ODcKKzI0NDU3IDAgODk5Njg3CisxOTA0IDAgODMzNjg3Cis5MjEgMCA3NjY2ODcKKzk5MiAwIDc5OTY4NworNTQzIDAgODY2Njg3CisyNDM0MiAwIDEwNjY2ODcKKzE4MjIgMCA5OTk2ODcKKzg0MCAwIDkzMzY4NworODkyIDAgOTY2Njg3Cis3MTUgMCAxMDMzNjg3CisyMjg5MyAwIDEyMzM2ODcKKzE2MTggMCAxMTY2Njg3Cis4ODEgMCAxMDk5Njg3Cis4OTAgMCAxMTMzNjg3Cis3OTQgMCAxMTk5Njg3CisyNDI5MiAwIDEzOTk2ODcKKzE2NzMgMCAxMzMzNjg3Cis3NTUgMCAxMjY2Njg3Cis4MTAgMCAxMjk5Njg3Cis1ODggMCAxMzY2Njg3CisxOTgyOCAwIDE1MzM2ODcKKzE1MzggMCAxNDY2Njg3Cis4OTQgMCAxNDMzNjg3Cis5MzMgMCAxNDk5Njg3CisxOTg1MyAwIDE2NjY2ODcKKzIwMTEgMCAxNTk5Njg3Cis5ODEgMCAxNTY2Njg3Cis5MDAgMCAxNjMzNjg3CisyMjg2OSAwIDE4MzM2ODcKKzE1NjIgMCAxNzY2Njg3Cis4NDIgMCAxNjk5Njg3Cis3NjUgMCAxNzMzNjg3Cis2NjUgMCAxNzk5Njg3CisyMjM0NiAwIDE5NjY2ODcKKzIyNDUgMCAxODk5Njg3Cis1MTYgMCAxODY2Njg3Cis2MDQgMCAxOTMzNjg3CisyNDMzMyAwIDIwOTk2ODcKKzE3NjUgMCAyMDMzNjg3CiszMTggMCAxOTk5Njg3CiszMjAgMCAyMDY2Njg3CisxODU3NyAwIDIxOTk2ODcKKzExMjMgMCAyMTY2Njg3CiszMzcgMCAyMTMzNjg3CisxNzUwOSAwIDIyOTk2ODcKKzg2OSAwIDIyNjY2ODcKKzkwMSAwIDIyMzM2ODcKKzIzMzY2IDAgMjQzMzY4NworMTIxNyAwIDIzNjY2ODcKKzM4MCAwIDIzMzM2ODcKKzM0NyAwIDIzOTk2ODcKKzE5NTQyIDAgMjUzMzY4NworMTg4NyAwIDI0OTk2ODcKKzQ2NyAwIDI0NjY2ODcKKzE4OTM5IDAgMjY2NjY4NworMjg2MyAwIDI1OTk2ODcKKzMxNyAwIDI1NjY2ODcKKzI3MiAwIDI2MzM2ODcKKzE5MzUzIDAgMjc5OTY4NworMjA5MiAwIDI3MzM2ODcKKzIwMyAwIDI2OTk2ODcKKzMxMCAwIDI3NjY2ODcKKzE4ODAwIDAgMjkzMzY4NworMjAzOCAwIDI4NjY2ODcKKzI0MiAwIDI4MzM2ODcKKzE5OSAwIDI4OTk2ODcKKzE3NDUyIDAgMzA5OTY4NworMTA2MCAwIDMwMzM2ODcKKzMwMSAwIDI5NjY2ODcKKzQ1MiAwIDI5OTk2ODcKKzI1NiAwIDMwNjY2ODcKKzIxMzUyIDAgMzE5OTY4NworNDA5IDAgMzE2NjY4NworMTczIDAgMzEzMzY4NworMTkxNDIgMCAzMjk5Njg3Cis2NDIgMCAzMjY2Njg3Cis0NjggMCAzMjMzNjg3CisxOTA2NiAwIDM0MzM2ODcKKzYzNSAwIDMzNjY2ODcKKzE5NyAwIDMzMzM2ODcKKzE5MCAwIDMzOTk2ODcKKzE4ODEzIDAgMzU2NjY4NworOTY5IDAgMzQ5OTY4NworMTY1IDAgMzQ2NjY4NworMjAzIDAgMzUzMzY4NworMTczNjIgMCAzNzMzNjg3CisyNDYgMCAzNjY2Njg3CisyMzYgMCAzNTk5Njg3CisxNzQgMCAzNjMzNjg3CisxNjQgMCAzNjk5Njg3CisxNzA4MSAwIDM4OTk2ODcKKzM1MyAwIDM4MzM2ODcKKzIyMiAwIDM3NjY2ODcKKzE4MSAwIDM3OTk2ODcKKzE0OCAwIDM4NjY2ODcKKzEwODM1IDAgMzk5OTY4NworMTg1IDAgMzk2NjY4NworMTM5IDAgMzkzMzY4NworNzUxMCAwIDQxMzM2ODcKKzE0OSAwIDQwNjY2ODcKKzEyOSAwIDQwMzM2ODcKKzEzMiAwIDQwOTk2ODcKKzEwNjMgMCA0MTY2Njg3Cis4MDUgMCA0MjY2Njg3CisxNTcgMCA0MjMzNjg3CiszOTQgMCA0MTk5Njg3Cis5MDg0MCAwIDQzOTk2ODcKKzYxNTkgMCA0MzMzNjg3CisxNzUyIDAgNDI5OTY4NworOTg1IDAgNDM2NjY4NworMzEzMzggMCA0NTMzNjg3CiszMzkwIDAgNDQ2NjY4NworNzcyIDAgNDQzMzY4NworNzgxIDAgNDQ5OTY4NworMzEwODQgMCA0NjY2Njg3CiszNDk4IDAgNDU5OTY4NworODE4IDAgNDU2NjY4NworODgxIDAgNDYzMzY4NworMzA0MTYgMCA0Nzk5Njg3CiszMjY1IDAgNDczMzY4NworODE1IDAgNDY5OTY4NworNzkwIDAgNDc2NjY4NworMzEwNTMgMCA0OTMzNjg3CiszMTA2IDAgNDg2NjY4NworNzA4IDAgNDgzMzY4NworNzEzIDAgNDg5OTY4NworMzAyMzAgMCA1MDY2Njg3CiszMjE0IDAgNDk5OTY4NworNjM5IDAgNDk2NjY4NworNzY4IDAgNTAzMzY4NworMjk2NTcgMCA1MTk5Njg3CiszMDEzIDAgNTEzMzY4NworNjIyIDAgNTA5OTY4NworNzIwIDAgNTE2NjY4NworMjkzNDQgMCA1MzMzNjg3CiszMTk2IDAgNTI2NjY4NworNzEzIDAgNTIzMzY4NworNzc1IDAgNTI5OTY4NworMzA0MjAgMCA1NDY2Njg3CiszMzc0IDAgNTM5OTY4NworODAzIDAgNTM2NjY4NworNzE3IDAgNTQzMzY4NworMjk5NjAgMCA1NTk5Njg3CiszMjgzIDAgNTUzMzY4NworNzkzIDAgNTQ5OTY4NworNzkwIDAgNTU2NjY4NworMzEwMTEgMCA1NzMzNjg3CiszMzk3IDAgNTY2NjY4NworODA5IDAgNTYzMzY4NworODMxIDAgNTY5OTY4NworMzExOTQgMCA1ODY2Njg3CiszNDAxIDAgNTc5OTY4NworODA3IDAgNTc2NjY4NworODI3IDAgNTgzMzY4NworMzAzMjYgMCA1OTk5Njg3CiszMTg2IDAgNTkzMzY4NworODE4IDAgNTg5OTY4NworODYzIDAgNTk2NjY4NworMzE1NTkgMCA2MTMzNjg3CiszMzY0IDAgNjA2NjY4NworODQwIDAgNjAzMzY4NworOTE5IDAgNjA5OTY4NworMzIwMTMgMCA2MjY2Njg3CiszNDk1IDAgNjE5OTY4NworODcxIDAgNjE2NjY4NworODAzIDAgNjIzMzY4NworMzAyOTQgMCA2Mzk5Njg3CiszMTUzIDAgNjMzMzY4NworNzE2IDAgNjI5OTY4NworODEyIDAgNjM2NjY4NworMjk5NTIgMCA2NTMzNjg3CiszMjk5IDAgNjQ2NjY4NworODAxIDAgNjQzMzY4NworNzQ5IDAgNjQ5OTY4NworMzA1OTggMCA2NjY2Njg3CiszNTM2IDAgNjU5OTY4NworODg3IDAgNjU2NjY4NworODUwIDAgNjYzMzY4NworMTcyNDYgMCA2Njk5Njg3CiszMTExMCAwIDY4MzM2ODcKKzMxOTggMCA2NzY2Njg3Cis4MDkgMCA2NzMzNjg3Cis4MzYgMCA2Nzk5Njg3CisyOTc4NCAwIDY5NjY2ODcKKzMxNTUgMCA2ODk5Njg3Cis4NTkgMCA2ODY2Njg3Cis5NTggMCA2OTMzNjg3CiszMDY2NiAwIDcwOTk2ODcKKzMzNzEgMCA3MDMzNjg3Cis4ODYgMCA2OTk5Njg3Cis4NjEgMCA3MDY2Njg3CiszMDQxNiAwIDcyMzM2ODcKKzMzNTAgMCA3MTY2Njg3Cis5MTcgMCA3MTMzNjg3Cis5ODcgMCA3MTk5Njg3CisyOTUwOSAwIDczNjY2ODcKKzM1NzQgMCA3Mjk5Njg3Cis5NzIgMCA3MjY2Njg3Cis4ODUgMCA3MzMzNjg3CiszMDg3MiAwIDc0OTk2ODcKKzMzOTkgMCA3NDMzNjg3Cis4OTggMCA3Mzk5Njg3CisxMDI3IDAgNzQ2NjY4NworMzExNTUgMCA3NjMzNjg3CiszNDU0IDAgNzU2NjY4NworOTY1IDAgNzUzMzY4NworODQxIDAgNzU5OTY4NworMjg0ODcgMCA3NzY2Njg3CiszNjE2IDAgNzY5OTY4NworOTIxIDAgNzY2NjY4NworOTkxIDAgNzczMzY4NworMjMyMDggMCA3ODk5Njg3CiszNTUxIDAgNzgzMzY4NworOTE4IDAgNzc5OTY4NworODk0IDAgNzg2NjY4NworMTY5ODIgMCA4MDMzNjg3CiszNDU4IDAgNzk2NjY4NworODQ0IDAgNzkzMzY4NworOTQzIDAgNzk5OTY4NworMzAzOTYgMCA4MTk5Njg3Cis0OTYzIDAgODEzMzY4NworMTQxNiAwIDgwNjY2ODcKKzE2MzkgMCA4MDk5Njg3Cis1MjQgMCA4MTY2Njg3CisxMzY4IDAgODI5OTY4NworNTY1IDAgODI2NjY4NworMzkyIDAgODIzMzY4NworNDEzMTcgMSA4Mzk5Njg3CisxODUgMCA4MzY2Njg3Cis0NzcgMCA4MzMzNjg3Cis1MzQyIDAgODUzMzY4NworMTI3NSAwIDg0NjY2ODcKKzEyMSAwIDg0MzM2ODcKKzk4MiAwIDg0OTk2ODcKKzY0NjUgMCA4Njk5Njg3CisyNjA2IDAgODYzMzY4NworMTE2MyAwIDg1NjY2ODcKKzk0MyAwIDg1OTk2ODcKKzExODYgMCA4NjY2Njg3CisxMTU5MyAwIDg4MzM2ODcKKzMxMjIgMCA4NzY2Njg3CisxMjc4IDAgODczMzY4NworMTU5MyAwIDg3OTk2ODcKKzkwOTkgMCA4OTk5Njg3Cis5NzggMCA4OTMzNjg3Cis3NDggMCA4ODY2Njg3Cis4MzUgMCA4ODk5Njg3CiszNjQgMCA4OTY2Njg3Cis0Nzk5IDAgOTA5OTY4NworMzY1IDAgOTA2NjY4NworMjE1IDAgOTAzMzY4NworNDM2NyAwIDkxOTk2ODcKKzMwMiAwIDkxNjY2ODcKKzQ4MCAwIDkxMzM2ODcKKzYxODAgMCA5MzMzNjg3Cis3NzEgMCA5MjY2Njg3CisyNDYgMCA5MjMzNjg3CisyODEgMCA5Mjk5Njg3Cis0NjM2IDAgOTM5OTY4NworMjExIDAgOTM2NjY4NworNDAzNyAwIDk0OTk2ODcKKzM4MiAwIDk0NjY2ODcKKzQ4NiAwIDk0MzM2ODcKKzM5NzUgMCA5NTk5Njg3CiszMTIgMCA5NTY2Njg3Cis0NzQgMCA5NTMzNjg3Cis2ODgwIDAgOTczMzY4NworMTExNiAwIDk2NjY2ODcKKzIwNiAwIDk2MzM2ODcKKzY5OCAwIDk2OTk2ODcKKzYyNTQgMCA5ODk5Njg3CisyNTgxIDAgOTgzMzY4NworMTMwMyAwIDk3NjY2ODcKKzk4NSAwIDk3OTk2ODcKKzk2NyAwIDk4NjY2ODcKKzY0ODYgMCAxMDAzMzY4NworMzU1NSAwIDk5NjY2ODcKKzE0MzAgMCA5OTMzNjg3CisxNjA1IDAgOTk5OTY4NwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6LmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHouaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWZiZmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6LmluZm8KQEAgLTAsMCArMSw0MTQgQEAKKzU3NiAxIDAKKzU3NiAxIDI0MDAwCis1NzYgMSA0ODAwMAorNTc2IDEgNzIwMDAKKzU3NiAxIDk2MDAwCis1NzYgMSAxMjAwMDAKKzU3NiAxIDE0NDAwMAorNTc2IDEgMTY4MDAwCis1NzYgMSAxOTIwMDAKKzU3NiAxIDIxNjAwMAorNTc2IDEgMjQwMDAwCis1NzYgMSAyNjQwMDAKKzU3NiAxIDI4ODAwMAorNTc2IDEgMzEyMDAwCis1NzYgMSAzMzYwMDAKKzU3NiAxIDM2MDAwMAorNTc2IDEgMzg0MDAwCis1NzYgMSA0MDgwMDAKKzU3NiAxIDQzMjAwMAorNTc2IDEgNDU2MDAwCis1NzYgMSA0ODAwMDAKKzU3NiAxIDUwNDAwMAorNTc2IDEgNTI4MDAwCis1NzYgMSA1NTIwMDAKKzU3NiAxIDU3NjAwMAorNTc2IDEgNjAwMDAwCis1NzYgMSA2MjQwMDAKKzU3NiAxIDY0ODAwMAorNTc2IDEgNjcyMDAwCis1NzYgMSA2OTYwMDAKKzU3NiAxIDcyMDAwMAorNTc2IDEgNzQ0MDAwCis1NzYgMSA3NjgwMDAKKzU3NiAxIDc5MjAwMAorNTc2IDEgODE2MDAwCis1NzYgMSA4NDAwMDAKKzU3NiAxIDg2NDAwMAorNTc2IDEgODg4MDAwCis1NzYgMSA5MTIwMDAKKzU3NiAxIDkzNjAwMAorNTc2IDEgOTYwMDAwCis1NzYgMSA5ODQwMDAKKzU3NiAxIDEwMDgwMDAKKzU3NiAxIDEwMzIwMDAKKzU3NiAxIDEwNTYwMDAKKzU3NiAxIDEwODAwMDAKKzU3NiAxIDExMDQwMDAKKzU3NiAxIDExMjgwMDAKKzU3NiAxIDExNTIwMDAKKzU3NiAxIDExNzYwMDAKKzU3NiAxIDEyMDAwMDAKKzU3NiAxIDEyMjQwMDAKKzU3NiAxIDEyNDgwMDAKKzU3NiAxIDEyNzIwMDAKKzU3NiAxIDEyOTYwMDAKKzU3NiAxIDEzMjAwMDAKKzU3NiAxIDEzNDQwMDAKKzU3NiAxIDEzNjgwMDAKKzU3NiAxIDEzOTIwMDAKKzU3NiAxIDE0MTYwMDAKKzU3NiAxIDE0NDAwMDAKKzU3NiAxIDE0NjQwMDAKKzU3NiAxIDE0ODgwMDAKKzU3NiAxIDE1MTIwMDAKKzU3NiAxIDE1MzYwMDAKKzU3NiAxIDE1NjAwMDAKKzU3NiAxIDE1ODQwMDAKKzU3NiAxIDE2MDgwMDAKKzU3NiAxIDE2MzIwMDAKKzU3NiAxIDE2NTYwMDAKKzU3NiAxIDE2ODAwMDAKKzU3NiAxIDE3MDQwMDAKKzU3NiAxIDE3MjgwMDAKKzU3NiAxIDE3NTIwMDAKKzU3NiAxIDE3NzYwMDAKKzU3NiAxIDE4MDAwMDAKKzU3NiAxIDE4MjQwMDAKKzU3NiAxIDE4NDgwMDAKKzU3NiAxIDE4NzIwMDAKKzU3NiAxIDE4OTYwMDAKKzU3NiAxIDE5MjAwMDAKKzU3NiAxIDE5NDQwMDAKKzU3NiAxIDE5NjgwMDAKKzU3NiAxIDE5OTIwMDAKKzU3NiAxIDIwMTYwMDAKKzU3NiAxIDIwNDAwMDAKKzU3NiAxIDIwNjQwMDAKKzU3NiAxIDIwODgwMDAKKzU3NiAxIDIxMTIwMDAKKzU3NiAxIDIxMzYwMDAKKzU3NiAxIDIxNjAwMDAKKzU3NiAxIDIxODQwMDAKKzU3NiAxIDIyMDgwMDAKKzU3NiAxIDIyMzIwMDAKKzU3NiAxIDIyNTYwMDAKKzU3NiAxIDIyODAwMDAKKzU3NiAxIDIzMDQwMDAKKzU3NiAxIDIzMjgwMDAKKzU3NiAxIDIzNTIwMDAKKzU3NiAxIDIzNzYwMDAKKzU3NiAxIDI0MDAwMDAKKzU3NiAxIDI0MjQwMDAKKzU3NiAxIDI0NDgwMDAKKzU3NiAxIDI0NzIwMDAKKzU3NiAxIDI0OTYwMDAKKzU3NiAxIDI1MjAwMDAKKzU3NiAxIDI1NDQwMDAKKzU3NiAxIDI1NjgwMDAKKzU3NiAxIDI1OTIwMDAKKzU3NiAxIDI2MTYwMDAKKzU3NiAxIDI2NDAwMDAKKzU3NiAxIDI2NjQwMDAKKzU3NiAxIDI2ODgwMDAKKzU3NiAxIDI3MTIwMDAKKzU3NiAxIDI3MzYwMDAKKzU3NiAxIDI3NjAwMDAKKzU3NiAxIDI3ODQwMDAKKzU3NiAxIDI4MDgwMDAKKzU3NiAxIDI4MzIwMDAKKzU3NiAxIDI4NTYwMDAKKzU3NiAxIDI4ODAwMDAKKzU3NiAxIDI5MDQwMDAKKzU3NiAxIDI5MjgwMDAKKzU3NiAxIDI5NTIwMDAKKzU3NiAxIDI5NzYwMDAKKzU3NiAxIDMwMDAwMDAKKzU3NiAxIDMwMjQwMDAKKzU3NiAxIDMwNDgwMDAKKzU3NiAxIDMwNzIwMDAKKzU3NiAxIDMwOTYwMDAKKzU3NiAxIDMxMjAwMDAKKzU3NiAxIDMxNDQwMDAKKzU3NiAxIDMxNjgwMDAKKzU3NiAxIDMxOTIwMDAKKzU3NiAxIDMyMTYwMDAKKzU3NiAxIDMyNDAwMDAKKzU3NiAxIDMyNjQwMDAKKzU3NiAxIDMyODgwMDAKKzU3NiAxIDMzMTIwMDAKKzU3NiAxIDMzMzYwMDAKKzU3NiAxIDMzNjAwMDAKKzU3NiAxIDMzODQwMDAKKzU3NiAxIDM0MDgwMDAKKzU3NiAxIDM0MzIwMDAKKzU3NiAxIDM0NTYwMDAKKzU3NiAxIDM0ODAwMDAKKzU3NiAxIDM1MDQwMDAKKzU3NiAxIDM1MjgwMDAKKzU3NiAxIDM1NTIwMDAKKzU3NiAxIDM1NzYwMDAKKzU3NiAxIDM2MDAwMDAKKzU3NiAxIDM2MjQwMDAKKzU3NiAxIDM2NDgwMDAKKzU3NiAxIDM2NzIwMDAKKzU3NiAxIDM2OTYwMDAKKzU3NiAxIDM3MjAwMDAKKzU3NiAxIDM3NDQwMDAKKzU3NiAxIDM3NjgwMDAKKzU3NiAxIDM3OTIwMDAKKzU3NiAxIDM4MTYwMDAKKzU3NiAxIDM4NDAwMDAKKzU3NiAxIDM4NjQwMDAKKzU3NiAxIDM4ODgwMDAKKzU3NiAxIDM5MTIwMDAKKzU3NiAxIDM5MzYwMDAKKzU3NiAxIDM5NjAwMDAKKzU3NiAxIDM5ODQwMDAKKzU3NiAxIDQwMDgwMDAKKzU3NiAxIDQwMzIwMDAKKzU3NiAxIDQwNTYwMDAKKzU3NiAxIDQwODAwMDAKKzU3NiAxIDQxMDQwMDAKKzU3NiAxIDQxMjgwMDAKKzU3NiAxIDQxNTIwMDAKKzU3NiAxIDQxNzYwMDAKKzU3NiAxIDQyMDAwMDAKKzU3NiAxIDQyMjQwMDAKKzU3NiAxIDQyNDgwMDAKKzU3NiAxIDQyNzIwMDAKKzU3NiAxIDQyOTYwMDAKKzU3NiAxIDQzMjAwMDAKKzU3NiAxIDQzNDQwMDAKKzU3NiAxIDQzNjgwMDAKKzU3NiAxIDQzOTIwMDAKKzU3NiAxIDQ0MTYwMDAKKzU3NiAxIDQ0NDAwMDAKKzU3NiAxIDQ0NjQwMDAKKzU3NiAxIDQ0ODgwMDAKKzU3NiAxIDQ1MTIwMDAKKzU3NiAxIDQ1MzYwMDAKKzU3NiAxIDQ1NjAwMDAKKzU3NiAxIDQ1ODQwMDAKKzU3NiAxIDQ2MDgwMDAKKzU3NiAxIDQ2MzIwMDAKKzU3NiAxIDQ2NTYwMDAKKzU3NiAxIDQ2ODAwMDAKKzU3NiAxIDQ3MDQwMDAKKzU3NiAxIDQ3MjgwMDAKKzU3NiAxIDQ3NTIwMDAKKzU3NiAxIDQ3NzYwMDAKKzU3NiAxIDQ4MDAwMDAKKzU3NiAxIDQ4MjQwMDAKKzU3NiAxIDQ4NDgwMDAKKzU3NiAxIDQ4NzIwMDAKKzU3NiAxIDQ4OTYwMDAKKzU3NiAxIDQ5MjAwMDAKKzU3NiAxIDQ5NDQwMDAKKzU3NiAxIDQ5NjgwMDAKKzU3NiAxIDQ5OTIwMDAKKzU3NiAxIDUwMTYwMDAKKzU3NiAxIDUwNDAwMDAKKzU3NiAxIDUwNjQwMDAKKzU3NiAxIDUwODgwMDAKKzU3NiAxIDUxMTIwMDAKKzU3NiAxIDUxMzYwMDAKKzU3NiAxIDUxNjAwMDAKKzU3NiAxIDUxODQwMDAKKzU3NiAxIDUyMDgwMDAKKzU3NiAxIDUyMzIwMDAKKzU3NiAxIDUyNTYwMDAKKzU3NiAxIDUyODAwMDAKKzU3NiAxIDUzMDQwMDAKKzU3NiAxIDUzMjgwMDAKKzU3NiAxIDUzNTIwMDAKKzU3NiAxIDUzNzYwMDAKKzU3NiAxIDU0MDAwMDAKKzU3NiAxIDU0MjQwMDAKKzU3NiAxIDU0NDgwMDAKKzU3NiAxIDU0NzIwMDAKKzU3NiAxIDU0OTYwMDAKKzU3NiAxIDU1MjAwMDAKKzU3NiAxIDU1NDQwMDAKKzU3NiAxIDU1NjgwMDAKKzU3NiAxIDU1OTIwMDAKKzU3NiAxIDU2MTYwMDAKKzU3NiAxIDU2NDAwMDAKKzU3NiAxIDU2NjQwMDAKKzU3NiAxIDU2ODgwMDAKKzU3NiAxIDU3MTIwMDAKKzU3NiAxIDU3MzYwMDAKKzU3NiAxIDU3NjAwMDAKKzU3NiAxIDU3ODQwMDAKKzU3NiAxIDU4MDgwMDAKKzU3NiAxIDU4MzIwMDAKKzU3NiAxIDU4NTYwMDAKKzU3NiAxIDU4ODAwMDAKKzU3NiAxIDU5MDQwMDAKKzU3NiAxIDU5MjgwMDAKKzU3NiAxIDU5NTIwMDAKKzU3NiAxIDU5NzYwMDAKKzU3NiAxIDYwMDAwMDAKKzU3NiAxIDYwMjQwMDAKKzU3NiAxIDYwNDgwMDAKKzU3NiAxIDYwNzIwMDAKKzU3NiAxIDYwOTYwMDAKKzU3NiAxIDYxMjAwMDAKKzU3NiAxIDYxNDQwMDAKKzU3NiAxIDYxNjgwMDAKKzU3NiAxIDYxOTIwMDAKKzU3NiAxIDYyMTYwMDAKKzU3NiAxIDYyNDAwMDAKKzU3NiAxIDYyNjQwMDAKKzU3NiAxIDYyODgwMDAKKzU3NiAxIDYzMTIwMDAKKzU3NiAxIDYzMzYwMDAKKzU3NiAxIDYzNjAwMDAKKzU3NiAxIDYzODQwMDAKKzU3NiAxIDY0MDgwMDAKKzU3NiAxIDY0MzIwMDAKKzU3NiAxIDY0NTYwMDAKKzU3NiAxIDY0ODAwMDAKKzU3NiAxIDY1MDQwMDAKKzU3NiAxIDY1MjgwMDAKKzU3NiAxIDY1NTIwMDAKKzU3NiAxIDY1NzYwMDAKKzU3NiAxIDY2MDAwMDAKKzU3NiAxIDY2MjQwMDAKKzU3NiAxIDY2NDgwMDAKKzU3NiAxIDY2NzIwMDAKKzU3NiAxIDY2OTYwMDAKKzU3NiAxIDY3MjAwMDAKKzU3NiAxIDY3NDQwMDAKKzU3NiAxIDY3NjgwMDAKKzU3NiAxIDY3OTIwMDAKKzU3NiAxIDY4MTYwMDAKKzU3NiAxIDY4NDAwMDAKKzU3NiAxIDY4NjQwMDAKKzU3NiAxIDY4ODgwMDAKKzU3NiAxIDY5MTIwMDAKKzU3NiAxIDY5MzYwMDAKKzU3NiAxIDY5NjAwMDAKKzU3NiAxIDY5ODQwMDAKKzU3NiAxIDcwMDgwMDAKKzU3NiAxIDcwMzIwMDAKKzU3NiAxIDcwNTYwMDAKKzU3NiAxIDcwODAwMDAKKzU3NiAxIDcxMDQwMDAKKzU3NiAxIDcxMjgwMDAKKzU3NiAxIDcxNTIwMDAKKzU3NiAxIDcxNzYwMDAKKzU3NiAxIDcyMDAwMDAKKzU3NiAxIDcyMjQwMDAKKzU3NiAxIDcyNDgwMDAKKzU3NiAxIDcyNzIwMDAKKzU3NiAxIDcyOTYwMDAKKzU3NiAxIDczMjAwMDAKKzU3NiAxIDczNDQwMDAKKzU3NiAxIDczNjgwMDAKKzU3NiAxIDczOTIwMDAKKzU3NiAxIDc0MTYwMDAKKzU3NiAxIDc0NDAwMDAKKzU3NiAxIDc0NjQwMDAKKzU3NiAxIDc0ODgwMDAKKzU3NiAxIDc1MTIwMDAKKzU3NiAxIDc1MzYwMDAKKzU3NiAxIDc1NjAwMDAKKzU3NiAxIDc1ODQwMDAKKzU3NiAxIDc2MDgwMDAKKzU3NiAxIDc2MzIwMDAKKzU3NiAxIDc2NTYwMDAKKzU3NiAxIDc2ODAwMDAKKzU3NiAxIDc3MDQwMDAKKzU3NiAxIDc3MjgwMDAKKzU3NiAxIDc3NTIwMDAKKzU3NiAxIDc3NzYwMDAKKzU3NiAxIDc4MDAwMDAKKzU3NiAxIDc4MjQwMDAKKzU3NiAxIDc4NDgwMDAKKzU3NiAxIDc4NzIwMDAKKzU3NiAxIDc4OTYwMDAKKzU3NiAxIDc5MjAwMDAKKzU3NiAxIDc5NDQwMDAKKzU3NiAxIDc5NjgwMDAKKzU3NiAxIDc5OTIwMDAKKzU3NiAxIDgwMTYwMDAKKzU3NiAxIDgwNDAwMDAKKzU3NiAxIDgwNjQwMDAKKzU3NiAxIDgwODgwMDAKKzU3NiAxIDgxMTIwMDAKKzU3NiAxIDgxMzYwMDAKKzU3NiAxIDgxNjAwMDAKKzU3NiAxIDgxODQwMDAKKzU3NiAxIDgyMDgwMDAKKzU3NiAxIDgyMzIwMDAKKzU3NiAxIDgyNTYwMDAKKzU3NiAxIDgyODAwMDAKKzU3NiAxIDgzMDQwMDAKKzU3NiAxIDgzMjgwMDAKKzU3NiAxIDgzNTIwMDAKKzU3NiAxIDgzNzYwMDAKKzU3NiAxIDg0MDAwMDAKKzU3NiAxIDg0MjQwMDAKKzU3NiAxIDg0NDgwMDAKKzU3NiAxIDg0NzIwMDAKKzU3NiAxIDg0OTYwMDAKKzU3NiAxIDg1MjAwMDAKKzU3NiAxIDg1NDQwMDAKKzU3NiAxIDg1NjgwMDAKKzU3NiAxIDg1OTIwMDAKKzU3NiAxIDg2MTYwMDAKKzU3NiAxIDg2NDAwMDAKKzU3NiAxIDg2NjQwMDAKKzU3NiAxIDg2ODgwMDAKKzU3NiAxIDg3MTIwMDAKKzU3NiAxIDg3MzYwMDAKKzU3NiAxIDg3NjAwMDAKKzU3NiAxIDg3ODQwMDAKKzU3NiAxIDg4MDgwMDAKKzU3NiAxIDg4MzIwMDAKKzU3NiAxIDg4NTYwMDAKKzU3NiAxIDg4ODAwMDAKKzU3NiAxIDg5MDQwMDAKKzU3NiAxIDg5MjgwMDAKKzU3NiAxIDg5NTIwMDAKKzU3NiAxIDg5NzYwMDAKKzU3NiAxIDkwMDAwMDAKKzU3NiAxIDkwMjQwMDAKKzU3NiAxIDkwNDgwMDAKKzU3NiAxIDkwNzIwMDAKKzU3NiAxIDkwOTYwMDAKKzU3NiAxIDkxMjAwMDAKKzU3NiAxIDkxNDQwMDAKKzU3NiAxIDkxNjgwMDAKKzU3NiAxIDkxOTIwMDAKKzU3NiAxIDkyMTYwMDAKKzU3NiAxIDkyNDAwMDAKKzU3NiAxIDkyNjQwMDAKKzU3NiAxIDkyODgwMDAKKzU3NiAxIDkzMTIwMDAKKzU3NiAxIDkzMzYwMDAKKzU3NiAxIDkzNjAwMDAKKzU3NiAxIDkzODQwMDAKKzU3NiAxIDk0MDgwMDAKKzU3NiAxIDk0MzIwMDAKKzU3NiAxIDk0NTYwMDAKKzU3NiAxIDk0ODAwMDAKKzU3NiAxIDk1MDQwMDAKKzU3NiAxIDk1MjgwMDAKKzU3NiAxIDk1NTIwMDAKKzU3NiAxIDk1NzYwMDAKKzU3NiAxIDk2MDAwMDAKKzU3NiAxIDk2MjQwMDAKKzU3NiAxIDk2NDgwMDAKKzU3NiAxIDk2NzIwMDAKKzU3NiAxIDk2OTYwMDAKKzU3NiAxIDk3MjAwMDAKKzU3NiAxIDk3NDQwMDAKKzU3NiAxIDk3NjgwMDAKKzU3NiAxIDk3OTIwMDAKKzU3NiAxIDk4MTYwMDAKKzU3NiAxIDk4NDAwMDAKKzU3NiAxIDk4NjQwMDAKKzU3NiAxIDk4ODgwMDAKKzU3NiAxIDk5MTIwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoei5tcDMgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHoubXAzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4M2E0NDEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6Lm1wMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHpfbXVsdGlfZnJhbWUuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoel9tdWx0aV9mcmFtZS5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NWM3NWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHpfbXVsdGlfZnJhbWUuaW5mbwpAQCAtMCwwICsxLDM4NSBAQAorNTc2IDEgMAorNTc2IDEgMjQwMDAKKzExNTIgMSA0ODAwMAorMTE1MiAxIDk2MDAwCisxMTUyIDEgMTQ0MDAwCisxMTUyIDEgMTkyMDAwCisxNzI4IDEgMjQwMDAwCisxNzI4IDEgMzEyMDAwCisxNzI4IDEgMzg0MDAwCisxNzI4IDEgNDU2MDAwCisxNzI4IDEgNTI4MDAwCisyMzA0IDEgNjAwMDAwCisyMzA0IDEgNjk2MDAwCisyMzA0IDEgNzkyMDAwCisyMzA0IDEgODg4MDAwCisyMzA0IDEgOTg0MDAwCis1NzYgMSAxMDgwMDAwCis1NzYgMSAxMTA0MDAwCis1NzYgMSAxMTI4MDAwCis1NzYgMSAxMTUyMDAwCis1NzYgMSAxMTc2MDAwCis1NzYgMSAxMjAwMDAwCis1NzYgMSAxMjI0MDAwCis1NzYgMSAxMjQ4MDAwCis1NzYgMSAxMjcyMDAwCis1NzYgMSAxMjk2MDAwCis1NzYgMSAxMzIwMDAwCis1NzYgMSAxMzQ0MDAwCis1NzYgMSAxMzY4MDAwCis1NzYgMSAxMzkyMDAwCis1NzYgMSAxNDE2MDAwCis1NzYgMSAxNDQwMDAwCis1NzYgMSAxNDY0MDAwCis1NzYgMSAxNDg4MDAwCis1NzYgMSAxNTEyMDAwCis1NzYgMSAxNTM2MDAwCis1NzYgMSAxNTYwMDAwCis1NzYgMSAxNTg0MDAwCis1NzYgMSAxNjA4MDAwCis1NzYgMSAxNjMyMDAwCis1NzYgMSAxNjU2MDAwCis1NzYgMSAxNjgwMDAwCis1NzYgMSAxNzA0MDAwCis1NzYgMSAxNzI4MDAwCis1NzYgMSAxNzUyMDAwCis1NzYgMSAxNzc2MDAwCis1NzYgMSAxODAwMDAwCis1NzYgMSAxODI0MDAwCis1NzYgMSAxODQ4MDAwCis1NzYgMSAxODcyMDAwCis1NzYgMSAxODk2MDAwCis1NzYgMSAxOTIwMDAwCis1NzYgMSAxOTQ0MDAwCis1NzYgMSAxOTY4MDAwCis1NzYgMSAxOTkyMDAwCis1NzYgMSAyMDE2MDAwCis1NzYgMSAyMDQwMDAwCis1NzYgMSAyMDY0MDAwCis1NzYgMSAyMDg4MDAwCis1NzYgMSAyMTEyMDAwCis1NzYgMSAyMTM2MDAwCis1NzYgMSAyMTYwMDAwCis1NzYgMSAyMTg0MDAwCis1NzYgMSAyMjA4MDAwCis1NzYgMSAyMjMyMDAwCis1NzYgMSAyMjU2MDAwCis1NzYgMSAyMjgwMDAwCis1NzYgMSAyMzA0MDAwCis1NzYgMSAyMzI4MDAwCis1NzYgMSAyMzUyMDAwCis1NzYgMSAyMzc2MDAwCis1NzYgMSAyNDAwMDAwCis1NzYgMSAyNDI0MDAwCis1NzYgMSAyNDQ4MDAwCis1NzYgMSAyNDcyMDAwCis1NzYgMSAyNDk2MDAwCis1NzYgMSAyNTIwMDAwCis1NzYgMSAyNTQ0MDAwCis1NzYgMSAyNTY4MDAwCis1NzYgMSAyNTkyMDAwCis1NzYgMSAyNjE2MDAwCis1NzYgMSAyNjQwMDAwCis1NzYgMSAyNjY0MDAwCis1NzYgMSAyNjg4MDAwCis1NzYgMSAyNzEyMDAwCis1NzYgMSAyNzM2MDAwCis1NzYgMSAyNzYwMDAwCis1NzYgMSAyNzg0MDAwCis1NzYgMSAyODA4MDAwCis1NzYgMSAyODMyMDAwCis1NzYgMSAyODU2MDAwCis1NzYgMSAyODgwMDAwCis1NzYgMSAyOTA0MDAwCis1NzYgMSAyOTI4MDAwCis1NzYgMSAyOTUyMDAwCis1NzYgMSAyOTc2MDAwCis1NzYgMSAzMDAwMDAwCis1NzYgMSAzMDI0MDAwCis1NzYgMSAzMDQ4MDAwCis1NzYgMSAzMDcyMDAwCis1NzYgMSAzMDk2MDAwCis1NzYgMSAzMTIwMDAwCis1NzYgMSAzMTQ0MDAwCis1NzYgMSAzMTY4MDAwCis1NzYgMSAzMTkyMDAwCis1NzYgMSAzMjE2MDAwCis1NzYgMSAzMjQwMDAwCis1NzYgMSAzMjY0MDAwCis1NzYgMSAzMjg4MDAwCis1NzYgMSAzMzEyMDAwCis1NzYgMSAzMzM2MDAwCis1NzYgMSAzMzYwMDAwCis1NzYgMSAzMzg0MDAwCis1NzYgMSAzNDA4MDAwCis1NzYgMSAzNDMyMDAwCis1NzYgMSAzNDU2MDAwCis1NzYgMSAzNDgwMDAwCis1NzYgMSAzNTA0MDAwCis1NzYgMSAzNTI4MDAwCis1NzYgMSAzNTUyMDAwCis1NzYgMSAzNTc2MDAwCis1NzYgMSAzNjAwMDAwCis1NzYgMSAzNjI0MDAwCis1NzYgMSAzNjQ4MDAwCis1NzYgMSAzNjcyMDAwCis1NzYgMSAzNjk2MDAwCis1NzYgMSAzNzIwMDAwCis1NzYgMSAzNzQ0MDAwCis1NzYgMSAzNzY4MDAwCis1NzYgMSAzNzkyMDAwCis1NzYgMSAzODE2MDAwCis1NzYgMSAzODQwMDAwCis1NzYgMSAzODY0MDAwCis1NzYgMSAzODg4MDAwCis1NzYgMSAzOTEyMDAwCis1NzYgMSAzOTM2MDAwCis1NzYgMSAzOTYwMDAwCis1NzYgMSAzOTg0MDAwCis1NzYgMSA0MDA4MDAwCis1NzYgMSA0MDMyMDAwCis1NzYgMSA0MDU2MDAwCis1NzYgMSA0MDgwMDAwCis1NzYgMSA0MTA0MDAwCis1NzYgMSA0MTI4MDAwCis1NzYgMSA0MTUyMDAwCis1NzYgMSA0MTc2MDAwCis1NzYgMSA0MjAwMDAwCis1NzYgMSA0MjI0MDAwCis1NzYgMSA0MjQ4MDAwCis1NzYgMSA0MjcyMDAwCis1NzYgMSA0Mjk2MDAwCis1NzYgMSA0MzIwMDAwCis1NzYgMSA0MzQ0MDAwCis1NzYgMSA0MzY4MDAwCis1NzYgMSA0MzkyMDAwCis1NzYgMSA0NDE2MDAwCis1NzYgMSA0NDQwMDAwCis1NzYgMSA0NDY0MDAwCis1NzYgMSA0NDg4MDAwCis1NzYgMSA0NTEyMDAwCis1NzYgMSA0NTM2MDAwCis1NzYgMSA0NTYwMDAwCis1NzYgMSA0NTg0MDAwCis1NzYgMSA0NjA4MDAwCis1NzYgMSA0NjMyMDAwCis1NzYgMSA0NjU2MDAwCis1NzYgMSA0NjgwMDAwCis1NzYgMSA0NzA0MDAwCis1NzYgMSA0NzI4MDAwCis1NzYgMSA0NzUyMDAwCis1NzYgMSA0Nzc2MDAwCis1NzYgMSA0ODAwMDAwCis1NzYgMSA0ODI0MDAwCis1NzYgMSA0ODQ4MDAwCis1NzYgMSA0ODcyMDAwCis1NzYgMSA0ODk2MDAwCis1NzYgMSA0OTIwMDAwCis1NzYgMSA0OTQ0MDAwCis1NzYgMSA0OTY4MDAwCis1NzYgMSA0OTkyMDAwCis1NzYgMSA1MDE2MDAwCis1NzYgMSA1MDQwMDAwCis1NzYgMSA1MDY0MDAwCis1NzYgMSA1MDg4MDAwCis1NzYgMSA1MTEyMDAwCis1NzYgMSA1MTM2MDAwCis1NzYgMSA1MTYwMDAwCis1NzYgMSA1MTg0MDAwCis1NzYgMSA1MjA4MDAwCis1NzYgMSA1MjMyMDAwCis1NzYgMSA1MjU2MDAwCis1NzYgMSA1MjgwMDAwCis1NzYgMSA1MzA0MDAwCis1NzYgMSA1MzI4MDAwCis1NzYgMSA1MzUyMDAwCis1NzYgMSA1Mzc2MDAwCis1NzYgMSA1NDAwMDAwCis1NzYgMSA1NDI0MDAwCis1NzYgMSA1NDQ4MDAwCis1NzYgMSA1NDcyMDAwCis1NzYgMSA1NDk2MDAwCis1NzYgMSA1NTIwMDAwCis1NzYgMSA1NTQ0MDAwCis1NzYgMSA1NTY4MDAwCis1NzYgMSA1NTkyMDAwCis1NzYgMSA1NjE2MDAwCis1NzYgMSA1NjQwMDAwCis1NzYgMSA1NjY0MDAwCis1NzYgMSA1Njg4MDAwCis1NzYgMSA1NzEyMDAwCis1NzYgMSA1NzM2MDAwCis1NzYgMSA1NzYwMDAwCis1NzYgMSA1Nzg0MDAwCis1NzYgMSA1ODA4MDAwCis1NzYgMSA1ODMyMDAwCis1NzYgMSA1ODU2MDAwCis1NzYgMSA1ODgwMDAwCis1NzYgMSA1OTA0MDAwCis1NzYgMSA1OTI4MDAwCis1NzYgMSA1OTUyMDAwCis1NzYgMSA1OTc2MDAwCis1NzYgMSA2MDAwMDAwCis1NzYgMSA2MDI0MDAwCis1NzYgMSA2MDQ4MDAwCis1NzYgMSA2MDcyMDAwCis1NzYgMSA2MDk2MDAwCis1NzYgMSA2MTIwMDAwCis1NzYgMSA2MTQ0MDAwCis1NzYgMSA2MTY4MDAwCis1NzYgMSA2MTkyMDAwCis1NzYgMSA2MjE2MDAwCis1NzYgMSA2MjQwMDAwCis1NzYgMSA2MjY0MDAwCis1NzYgMSA2Mjg4MDAwCis1NzYgMSA2MzEyMDAwCis1NzYgMSA2MzM2MDAwCis1NzYgMSA2MzYwMDAwCis1NzYgMSA2Mzg0MDAwCis1NzYgMSA2NDA4MDAwCis1NzYgMSA2NDMyMDAwCis1NzYgMSA2NDU2MDAwCis1NzYgMSA2NDgwMDAwCis1NzYgMSA2NTA0MDAwCis1NzYgMSA2NTI4MDAwCis1NzYgMSA2NTUyMDAwCis1NzYgMSA2NTc2MDAwCis1NzYgMSA2NjAwMDAwCis1NzYgMSA2NjI0MDAwCis1NzYgMSA2NjQ4MDAwCis1NzYgMSA2NjcyMDAwCis1NzYgMSA2Njk2MDAwCis1NzYgMSA2NzIwMDAwCis1NzYgMSA2NzQ0MDAwCis1NzYgMSA2NzY4MDAwCis1NzYgMSA2NzkyMDAwCis1NzYgMSA2ODE2MDAwCis1NzYgMSA2ODQwMDAwCis1NzYgMSA2ODY0MDAwCis1NzYgMSA2ODg4MDAwCis1NzYgMSA2OTEyMDAwCis1NzYgMSA2OTM2MDAwCis1NzYgMSA2OTYwMDAwCis1NzYgMSA2OTg0MDAwCis1NzYgMSA3MDA4MDAwCis1NzYgMSA3MDMyMDAwCis1NzYgMSA3MDU2MDAwCis1NzYgMSA3MDgwMDAwCis1NzYgMSA3MTA0MDAwCis1NzYgMSA3MTI4MDAwCis1NzYgMSA3MTUyMDAwCis1NzYgMSA3MTc2MDAwCis1NzYgMSA3MjAwMDAwCis1NzYgMSA3MjI0MDAwCis1NzYgMSA3MjQ4MDAwCis1NzYgMSA3MjcyMDAwCis1NzYgMSA3Mjk2MDAwCis1NzYgMSA3MzIwMDAwCis1NzYgMSA3MzQ0MDAwCis1NzYgMSA3MzY4MDAwCis1NzYgMSA3MzkyMDAwCis1NzYgMSA3NDE2MDAwCis1NzYgMSA3NDQwMDAwCis1NzYgMSA3NDY0MDAwCis1NzYgMSA3NDg4MDAwCis1NzYgMSA3NTEyMDAwCis1NzYgMSA3NTM2MDAwCis1NzYgMSA3NTYwMDAwCis1NzYgMSA3NTg0MDAwCis1NzYgMSA3NjA4MDAwCis1NzYgMSA3NjMyMDAwCis1NzYgMSA3NjU2MDAwCis1NzYgMSA3NjgwMDAwCis1NzYgMSA3NzA0MDAwCis1NzYgMSA3NzI4MDAwCis1NzYgMSA3NzUyMDAwCis1NzYgMSA3Nzc2MDAwCis1NzYgMSA3ODAwMDAwCis1NzYgMSA3ODI0MDAwCis1NzYgMSA3ODQ4MDAwCis1NzYgMSA3ODcyMDAwCis1NzYgMSA3ODk2MDAwCis1NzYgMSA3OTIwMDAwCis1NzYgMSA3OTQ0MDAwCis1NzYgMSA3OTY4MDAwCis1NzYgMSA3OTkyMDAwCis1NzYgMSA4MDE2MDAwCis1NzYgMSA4MDQwMDAwCis1NzYgMSA4MDY0MDAwCis1NzYgMSA4MDg4MDAwCis1NzYgMSA4MTEyMDAwCis1NzYgMSA4MTM2MDAwCis1NzYgMSA4MTYwMDAwCis1NzYgMSA4MTg0MDAwCis1NzYgMSA4MjA4MDAwCis1NzYgMSA4MjMyMDAwCis1NzYgMSA4MjU2MDAwCis1NzYgMSA4MjgwMDAwCis1NzYgMSA4MzA0MDAwCis1NzYgMSA4MzI4MDAwCis1NzYgMSA4MzUyMDAwCis1NzYgMSA4Mzc2MDAwCis1NzYgMSA4NDAwMDAwCis1NzYgMSA4NDI0MDAwCis1NzYgMSA4NDQ4MDAwCis1NzYgMSA4NDcyMDAwCis1NzYgMSA4NDk2MDAwCis1NzYgMSA4NTIwMDAwCis1NzYgMSA4NTQ0MDAwCis1NzYgMSA4NTY4MDAwCis1NzYgMSA4NTkyMDAwCis1NzYgMSA4NjE2MDAwCis1NzYgMSA4NjQwMDAwCis1NzYgMSA4NjY0MDAwCis1NzYgMSA4Njg4MDAwCis1NzYgMSA4NzEyMDAwCis1NzYgMSA4NzM2MDAwCis1NzYgMSA4NzYwMDAwCis1NzYgMSA4Nzg0MDAwCis1NzYgMSA4ODA4MDAwCis1NzYgMSA4ODMyMDAwCis1NzYgMSA4ODU2MDAwCis1NzYgMSA4ODgwMDAwCis1NzYgMSA4OTA0MDAwCis1NzYgMSA4OTI4MDAwCis1NzYgMSA4OTUyMDAwCis1NzYgMSA4OTc2MDAwCis1NzYgMSA5MDAwMDAwCis1NzYgMSA5MDI0MDAwCis1NzYgMSA5MDQ4MDAwCis1NzYgMSA5MDcyMDAwCis1NzYgMSA5MDk2MDAwCis1NzYgMSA5MTIwMDAwCis1NzYgMSA5MTQ0MDAwCis1NzYgMSA5MTY4MDAwCis1NzYgMSA5MTkyMDAwCis1NzYgMSA5MjE2MDAwCis1NzYgMSA5MjQwMDAwCis1NzYgMSA5MjY0MDAwCis1NzYgMSA5Mjg4MDAwCis1NzYgMSA5MzEyMDAwCis1NzYgMSA5MzM2MDAwCis1NzYgMSA5MzYwMDAwCis1NzYgMSA5Mzg0MDAwCis1NzYgMSA5NDA4MDAwCis1NzYgMSA5NDMyMDAwCis1NzYgMSA5NDU2MDAwCis1NzYgMSA5NDgwMDAwCis1NzYgMSA5NTA0MDAwCis1NzYgMSA5NTI4MDAwCis1NzYgMSA5NTUyMDAwCis1NzYgMSA5NTc2MDAwCis1NzYgMSA5NjAwMDAwCis1NzYgMSA5NjI0MDAwCis1NzYgMSA5NjQ4MDAwCis1NzYgMSA5NjcyMDAwCis1NzYgMSA5Njk2MDAwCis1NzYgMSA5NzIwMDAwCis1NzYgMSA5NzQ0MDAwCis1NzYgMSA5NzY4MDAwCis1NzYgMSA5NzkyMDAwCis1NzYgMSA5ODE2MDAwCis1NzYgMSA5ODQwMDAwCis1NzYgMSA5ODY0MDAwCis1NzYgMSA5ODg4MDAwCis1NzYgMSA5OTEyMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfbXBlZzJfMTc2eDE0NF8xMDVrYnBzXzI1ZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfbXBlZzJfMTc2eDE0NF8xMDVrYnBzXzI1ZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU0MDY0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9tcGVnMl8xNzZ4MTQ0XzEwNWticHNfMjVmcHMuaW5mbwpAQCAtMCwwICsxLDI0OSBAQAorNjQ1OCAxIDQwMDAwCis0MDQwIDAgODAwMDAKKzMyNTUgMCAxMjAwMDAKKzMwMjYgMCAxNjAwMDAKKzMyOTMgMCAyMDAwMDAKKzMwODkgMCAyNDAwMDAKKzMzMDUgMCAyODAwMDAKKzE3OTQgMCAzMjAwMDAKKzE4NDggMCAzNjAwMDAKKzEyODggMCA0MDAwMDAKKzE1MTEgMCA0NDAwMDAKKzE1MjcgMCA0ODAwMDAKKzYxNDYgMSA1MjAwMDAKKzEyNDMgMCA1NjAwMDAKKzEwOTkgMCA2MDAwMDAKKzEzNTQgMCA2NDAwMDAKKzEzNjYgMCA2ODAwMDAKKzEwNDIgMCA3MjAwMDAKKzE2MDAgMCA3NjAwMDAKKzg3NSAwIDgwMDAwMAorMTcyOCAwIDg0MDAwMAorMTI1NCAwIDg4MDAwMAorOTk0IDAgOTIwMDAwCisxNTkxIDAgOTYwMDAwCis2MjY1IDEgMTAwMDAwMAorMTAxOCAwIDEwNDAwMDAKKzgyNSAwIDEwODAwMDAKKzg2OSAwIDExMjAwMDAKKzkyMSAwIDExNjAwMDAKKzk3NSAwIDEyMDAwMDAKKzkyNCAwIDEyNDAwMDAKKzgzNCAwIDEyODAwMDAKKzEwNjYgMCAxMzIwMDAwCis3OTMgMCAxMzYwMDAwCis4ODkgMCAxNDAwMDAwCisyMDUwIDAgMTQ0MDAwMAorNjI3NiAxIDE0ODAwMDAKKzg4MSAwIDE1MjAwMDAKKzI2MCAwIDE1NjAwMDAKKzczMCAwIDE2MDAwMDAKKzQzMSAwIDE2NDAwMDAKKzM1MSAwIDE2ODAwMDAKKzMyMSAwIDE3MjAwMDAKKzM4MDIgMCAxNzYwMDAwCisxNDYgMCAxODAwMDAwCis2NDYyIDAgMTg0MDAwMAorMzI0NiAwIDE4ODAwMDAKKzUzMyAwIDE5MjAwMDAKKzYyMzEgMSAxOTYwMDAwCisxMzc4IDAgMjAwMDAwMAorNzE5IDAgMjA0MDAwMAorODE4IDAgMjA4MDAwMAorODU2IDAgMjEyMDAwMAorOTM3IDAgMjE2MDAwMAorNjExIDAgMjIwMDAwMAorMzAzMSAwIDIyNDAwMDAKKzEwNDEgMCAyMjgwMDAwCis2MDQgMCAyMzIwMDAwCis3MTQgMCAyMzYwMDAwCisxMjgzIDAgMjQwMDAwMAorNzU2NSAxIDI0NDAwMDAKKzYwMiAwIDI0ODAwMDAKKzUzMCAwIDI1MjAwMDAKKzI1NzkgMCAyNTYwMDAwCisxMTUgMCAyNjAwMDAwCisxMDU4IDAgMjY0MDAwMAorNjg5IDAgMjY4MDAwMAorMTExOSAwIDI3MjAwMDAKKzY5OCAwIDI3NjAwMDAKKzEwMDYgMCAyODAwMDAwCis1NDUgMCAyODQwMDAwCisxNjE3IDAgMjg4MDAwMAorOTEyMyAxIDI5MjAwMDAKKzUyNyAwIDI5NjAwMDAKKzE1NzYgMCAzMDAwMDAwCis0NjUgMCAzMDQwMDAwCis3NDEgMCAzMDgwMDAwCis1MjEgMCAzMTIwMDAwCisxMzIyIDAgMzE2MDAwMAorNzc1IDAgMzIwMDAwMAorODYzIDAgMzI0MDAwMAorOTEwIDAgMzI4MDAwMAorOTE1IDAgMzMyMDAwMAorOTI2IDAgMzM2MDAwMAorNzU1NiAxIDM0MDAwMDAKKzc0MSAwIDM0NDAwMDAKKzUyNyAwIDM0ODAwMDAKKzI1MTYgMCAzNTIwMDAwCis0NTkgMCAzNTYwMDAwCis0MDQgMCAzNjAwMDAwCis1MDkgMCAzNjQwMDAwCisxMjI3IDAgMzY4MDAwMAorMTU2MSAwIDM3MjAwMDAKKzQ5MCAwIDM3NjAwMDAKKzcxMiAwIDM4MDAwMDAKKzgwMyAwIDM4NDAwMDAKKzc1MjQgMSAzODgwMDAwCis3MzAgMCAzOTIwMDAwCis0NjEgMCAzOTYwMDAwCisyNTI2IDAgNDAwMDAwMAorNDUzIDAgNDA0MDAwMAorNjMyIDAgNDA4MDAwMAorNzgzIDAgNDEyMDAwMAorODQzIDAgNDE2MDAwMAorOTE4IDAgNDIwMDAwMAorOTYxIDAgNDI0MDAwMAorOTQ4IDAgNDI4MDAwMAorOTU5IDAgNDMyMDAwMAorNzU5OCAxIDQzNjAwMDAKKzY3OCAwIDQ0MDAwMDAKKzU2OSAwIDQ0NDAwMDAKKzg5MyAwIDQ0ODAwMDAKKzYyNCAwIDQ1MjAwMDAKKzc1NSAwIDQ1NjAwMDAKKzIyMzQgMCA0NjAwMDAwCis1NTYgMCA0NjQwMDAwCis5NDQgMCA0NjgwMDAwCis3MzkgMCA0NzIwMDAwCis4NjIgMCA0NzYwMDAwCis5MzggMCA0ODAwMDAwCis3NTc0IDEgNDg0MDAwMAorNjk5IDAgNDg4MDAwMAorNzAxIDAgNDkyMDAwMAorNTMwIDAgNDk2MDAwMAorNjg5IDAgNTAwMDAwMAorNzc4IDAgNTA0MDAwMAorODU2IDAgNTA4MDAwMAorOTMwIDAgNTEyMDAwMAorOTc1IDAgNTE2MDAwMAorMTAyMSAwIDUyMDAwMDAKKzEwNzQgMCA1MjQwMDAwCis5NzggMCA1MjgwMDAwCis4MDIxIDEgNTMyMDAwMAorNzA0IDAgNTM2MDAwMAorNjEwIDAgNTQwMDAwMAorNjk3IDAgNTQ0MDAwMAorNzExIDAgNTQ4MDAwMAorODIwIDAgNTUyMDAwMAorODQzIDAgNTU2MDAwMAorMjUxIDAgNTYwMDAwMAorMzM2NyAwIDU2NDAwMDAKKzUwNyAwIDU2ODAwMDAKKzMxNjggMSA1NzIwMDAwCis3NzkgMCA1NzYwMDAwCiszMTYgMCA1ODAwMDAwCis2MzUgMCA1ODQwMDAwCisyMDQgMCA1ODgwMDAwCis5NzggMCA1OTIwMDAwCisxMjcgMCA1OTYwMDAwCis1ODkgMCA2MDAwMDAwCis2MDQgMCA2MDQwMDAwCis2NjYgMCA2MDgwMDAwCis1ODIgMCA2MTIwMDAwCis3MjkgMCA2MTYwMDAwCis0MTUyIDEgNjIwMDAwMAorODU4IDAgNjI0MDAwMAorNzM5IDAgNjI4MDAwMAorODg1IDAgNjMyMDAwMAorNzQ5IDAgNjM2MDAwMAorOTUwIDAgNjQwMDAwMAorNTkzIDAgNjQ0MDAwMAorNzcxIDAgNjQ4MDAwMAorNjc4IDAgNjUyMDAwMAorNTI5IDAgNjU2MDAwMAorODM1IDAgNjYwMDAwMAorMzkxIDAgNjY0MDAwMAorNDY5MiAxIDY2ODAwMDAKKzQ3MyAwIDY3MjAwMDAKKzcyNCAwIDY3NjAwMDAKKzM4MSAwIDY4MDAwMDAKKzkwOSAwIDY4NDAwMDAKKzM5NCAwIDY4ODAwMDAKKzY1OSAwIDY5MjAwMDAKKzM2NyAwIDY5NjAwMDAKKzY1OCAwIDcwMDAwMDAKKzUyMyAwIDcwNDAwMDAKKzU1NCAwIDcwODAwMDAKKzU1MyAwIDcxMjAwMDAKKzYwODAgMSA3MTYwMDAwCis0OTYgMCA3MjAwMDAwCis3NjMgMCA3MjQwMDAwCis5MzkgMCA3MjgwMDAwCis3MTUgMCA3MzIwMDAwCis2NzIgMCA3MzYwMDAwCis2MTQgMCA3NDAwMDAwCis4MTEgMCA3NDQwMDAwCis5MTYgMCA3NDgwMDAwCisxMTUzIDAgNzUyMDAwMAorOTQwIDAgNzU2MDAwMAorMzIyIDAgNzYwMDAwMAorNjYxMyAxIDc2NDAwMDAKKzg1MSAwIDc2ODAwMDAKKzEwMDcgMCA3NzIwMDAwCis1MjAgMCA3NzYwMDAwCis0NTYgMCA3ODAwMDAwCis2MzkgMCA3ODQwMDAwCis3NTggMCA3ODgwMDAwCis4NzkgMCA3OTIwMDAwCisxMTUyIDAgNzk2MDAwMAorMTA2MSAwIDgwMDAwMDAKKzk0NiAwIDgwNDAwMDAKKzg1OSAwIDgwODAwMDAKKzM2MTAgMSA4MTIwMDAwCis4NzEgMCA4MTYwMDAwCis3NDYgMCA4MjAwMDAwCiszNjcgMCA4MjQwMDAwCiszOTcgMCA4MjgwMDAwCis5MzAgMCA4MzIwMDAwCiszMzcgMCA4MzYwMDAwCis0MTggMCA4NDAwMDAwCis3NDAgMCA4NDQwMDAwCis2MzcgMCA4NDgwMDAwCis2NjYgMCA4NTIwMDAwCis2MjcgMCA4NTYwMDAwCis0MzM4IDEgODYwMDAwMAorNzQ1IDAgODY0MDAwMAorNzgzIDAgODY4MDAwMAorNDY1IDAgODcyMDAwMAorNDYwIDAgODc2MDAwMAorNDU1IDAgODgwMDAwMAorNTA2IDAgODg0MDAwMAorNDkyIDAgODg4MDAwMAorNDg1IDAgODkyMDAwMAorNTE3IDAgODk2MDAwMAorNTM0IDAgOTAwMDAwMAorMzk1IDAgOTA0MDAwMAorNTYyNiAxIDkwODAwMDAKKzExNjkgMCA5MTIwMDAwCis1NjQgMCA5MTYwMDAwCisyNjEgMCA5MjAwMDAwCiszMjcgMCA5MjQwMDAwCiszMDMgMCA5MjgwMDAwCisxMTQ1IDAgOTMyMDAwMAorMjU3IDAgOTM2MDAwMAorNDk4IDAgOTQwMDAwMAorNDY1IDAgOTQ0MDAwMAorNDE0IDAgOTQ4MDAwMAorNTUzIDAgOTUyMDAwMAorNTYxNyAxIDk1NjAwMDAKKzEwNTIgMCA5NjAwMDAwCis1OTIgMCA5NjQwMDAwCiszMjMgMCA5NjgwMDAwCis0OTcgMCA5NzIwMDAwCis0NjcgMCA5NzYwMDAwCis3MDUgMCA5ODAwMDAwCisxMDg2IDAgOTg0MDAwMAorMTI1MyAwIDk4ODAwMDAKKzEyNTIgMCA5OTIwMDAwCis3NzYgMCA5OTYwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfbXBlZzJfMTc2eDE0NF8xMDVrYnBzXzI1ZnBzLm0ydiBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9tcGVnMl8xNzZ4MTQ0XzEwNWticHNfMjVmcHMubTJ2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZjkwYzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfbXBlZzJfMTc2eDE0NF8xMDVrYnBzXzI1ZnBzLm0ydgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfbXBlZzJfMzUyeDI4OF8xbWJwc182MGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX21wZWcyXzM1MngyODhfMW1icHNfNjBmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTdjYWY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX21wZWcyXzM1MngyODhfMW1icHNfNjBmcHMuaW5mbwpAQCAtMCwwICsxLDYwIEBACisxNjY4MCAxIDE2NjY2CisxNzAxNyAwIDMzMzMzCisxMDUzNCAwIDUwMDAwCisxMDI4OSAwIDY2NjY2CiszNjk4IDAgODMzMzMKKzI3NzYgMCAxMDAwMDAKKzE5MzYgMCAxMTY2NjYKKzE0OTMgMCAxMzMzMzMKKzEyMTcgMCAxNTAwMDAKKzk5MyAwIDE2NjY2NgorODA1IDAgMTgzMzMzCis4NTcgMCAyMDAwMDAKKzUwODIgMSAyMTY2NjYKKzgxMiAwIDIzMzMzMworNzE4IDAgMjUwMDAwCis3NDYgMCAyNjY2NjYKKzc2MiAwIDI4MzMzMworODY1IDAgMzAwMDAwCis3ODIgMCAzMTY2NjYKKzgzMyAwIDMzMzMzMworNzUwIDAgMzUwMDAwCis4MTkgMCAzNjY2NjYKKzgyNiAwIDM4MzMzMworODQ2IDAgNDAwMDAwCis0NTIyIDEgNDE2NjY2Cis2NzggMCA0MzMzMzMKKzcxOCAwIDQ1MDAwMAorODAzIDAgNDY2NjY2Cis3NjkgMCA0ODMzMzMKKzc2MiAwIDUwMDAwMAorNTg3IDAgNTE2NjY2Cis2MzUgMCA1MzMzMzMKKzY1OCAwIDU1MDAwMAorNzE0IDAgNTY2NjY2Cis2NzcgMCA1ODMzMzMKKzY5OSAwIDYwMDAwMAorNDYxNiAxIDYxNjY2NgorODAwIDAgNjMzMzMzCis4MzEgMCA2NTAwMDAKKzkyOCAwIDY2NjY2NgorODY5IDAgNjgzMzMzCis5MzEgMCA3MDAwMDAKKzkzMCAwIDcxNjY2NgorOTc0IDAgNzMzMzMzCis5NzggMCA3NTAwMDAKKzkzMiAwIDc2NjY2NgorOTE4IDAgNzgzMzMzCis5NzggMCA4MDAwMDAKKzQ2NTUgMSA4MTY2NjYKKzg5NyAwIDgzMzMzMworODk2IDAgODUwMDAwCis4ODMgMCA4NjY2NjYKKzk0OSAwIDg4MzMzMworOTY1IDAgOTAwMDAwCis5NTEgMCA5MTY2NjYKKzkwMSAwIDkzMzMzMworOTY1IDAgOTUwMDAwCis5NTUgMCA5NjY2NjYKKzk0OCAwIDk4MzMzMworOTY4IDAgMTAwMDAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX21wZWcyXzM1MngyODhfMW1icHNfNjBmcHMubTJ2IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX21wZWcyXzM1MngyODhfMW1icHNfNjBmcHMubTJ2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNjdjMmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfbXBlZzJfMzUyeDI4OF8xbWJwc182MGZwcy5tMnYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX21wZWc0XzM1MngyODhfNTEya2Jwc18zMGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX21wZWc0XzM1MngyODhfNTEya2Jwc18zMGZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YmE5YjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLmluZm8KQEAgLTAsMCArMSwyNDEgQEAKKzQ3IDMyIDAKKzIxMTE1IDEgMAorMTY0NTYgMCAzMzMzMworMTE4ODAgMCA2NjY2NgorMTIxNTUgMCAxMDAwMDAKKzExNDAyIDAgMTMzMzMzCis1MzQ1IDAgMTY2NjY2CisyOTg2IDAgMjAwMDAwCisxOTI0IDAgMjMzMzMzCisyMjc1IDAgMjY2NjY2CisyNzkzIDAgMzAwMDAwCisyNzU2IDAgMzMzMzMzCisyOTMzIDAgMzY2NjY2CisyMTEwMCAxIDQwMDAwMAorMTMwMiAwIDQzMzMzMworMjIwNiAwIDQ2NjY2NgorMTU5OSAwIDUwMDAwMAorMjU1OCAwIDUzMzMzMworMjc4NCAwIDU2NjY2NgorMjQ1OCAwIDYwMDAwMAorMjQ4MCAwIDYzMzMzMworMTQ0NiAwIDY2NjY2NgorMzEwOSAwIDcwMDAwMAorOTQ0IDAgNzMzMzMzCiszMTM0IDAgNzY2NjY2CisyMTM0MiAxIDgwMDAwMAorNjUyIDAgODMzMzMzCisxNzA4IDAgODY2NjY2CisyMjAyIDAgOTAwMDAwCisxNjk1IDAgOTMzMzMzCisxNjYxIDAgOTY2NjY2CisxNjUyIDAgMTAwMDAwMAorMTY3OSAwIDEwMzMzMzMKKzE2OTAgMCAxMDY2NjY2CisxODI0IDAgMTEwMDAwMAorMTgwMyAwIDExMzMzMzMKKzE1OTggMCAxMTY2NjY2CisyMTU0MCAxIDEyMDAwMDAKKzIwNSAwIDEyMzMzMzMKKzExMjQgMCAxMjY2NjY2CisxMDY5IDAgMTMwMDAwMAorODM4IDAgMTMzMzMzMworNzY1IDAgMTM2NjY2NgorNDI2NSAwIDE0MDAwMDAKKzk0IDAgMTQzMzMzMworMjA0NjMgMCAxNDY2NjY2CisxMDI4IDAgMTUwMDAwMAorMTQ3NSAwIDE1MzMzMzMKKzM2MzAgMCAxNTY2NjY2CisyODM3MyAxIDE2MDAwMDAKKzcyNSAwIDE2MzMzMzMKKzExMTkgMCAxNjY2NjY2CisxNDI3IDAgMTcwMDAwMAorMTY3OSAwIDE3MzMzMzMKKzE4NjYgMCAxNzY2NjY2CisxMTk3IDAgMTgwMDAwMAorMTU3MiAwIDE4MzMzMzMKKzE2NTEgMCAxODY2NjY2CisxNjc4IDAgMTkwMDAwMAorMTY4OCAwIDE5MzMzMzMKKzE2NTkgMCAxOTY2NjY2CisxOTkwMCAxIDIwMDAwMDAKKzU4NCAwIDIwMzMzMzMKKzE0NzUgMCAyMDY2NjY2CisxNjc4IDAgMjEwMDAwMAorMTAxMCAwIDIxMzMzMzMKKzE0MzUgMCAyMTY2NjY2CisxNjEyIDAgMjIwMDAwMAorMTYwMiAwIDIyMzMzMzMKKzE3MDkgMCAyMjY2NjY2CisxNzM3IDAgMjMwMDAwMAorMTgzNSAwIDIzMzMzMzMKKzkyNiAwIDIzNjY2NjYKKzIwMDkwIDEgMjQwMDAwMAorNjMxIDAgMjQzMzMzMworMTU3NiAwIDI0NjY2NjYKKzk0MSAwIDI1MDAwMDAKKzIzNDkgMCAyNTMzMzMzCisxMTEyIDAgMjU2NjY2NgorMTU2NiAwIDI2MDAwMDAKKzE3NzMgMCAyNjMzMzMzCis5NzkgMCAyNjY2NjY2CisyMjQ2IDAgMjcwMDAwMAorOTA0IDAgMjczMzMzMworMTM0MiAwIDI3NjY2NjYKKzIwMTQ3IDEgMjgwMDAwMAorNjMwIDAgMjgzMzMzMworOTgyIDAgMjg2NjY2NgorMjA4OSAwIDI5MDAwMDAKKzEwMjEgMCAyOTMzMzMzCisxNTA2IDAgMjk2NjY2NgorMTY0MiAwIDMwMDAwMDAKKzk2OCAwIDMwMzMzMzMKKzEyNjIgMCAzMDY2NjY2CisyMjcwIDAgMzEwMDAwMAorODY0IDAgMzEzMzMzMworMTI1MiAwIDMxNjY2NjYKKzIwMTQ1IDEgMzIwMDAwMAorNTk1IDAgMzIzMzMzMworOTE4IDAgMzI2NjY2NgorMTE2NyAwIDMzMDAwMDAKKzEzNDcgMCAzMzMzMzMzCisxNTk3IDAgMzM2NjY2NgorMTYzNiAwIDM0MDAwMDAKKzk0NCAwIDM0MzMzMzMKKzEyOTUgMCAzNDY2NjY2CisxMzk3IDAgMzUwMDAwMAorMTQxMyAwIDM1MzMzMzMKKzE0MzIgMCAzNTY2NjY2CisyMDE4MCAxIDM2MDAwMDAKKzUyNSAwIDM2MzMzMzMKKzEwNjggMCAzNjY2NjY2CisxMjMwIDAgMzcwMDAwMAorMTQyOCAwIDM3MzMzMzMKKzkxNiAwIDM3NjY2NjYKKzE5NDggMCAzODAwMDAwCis5NjYgMCAzODMzMzMzCisxMzQyIDAgMzg2NjY2NgorMTMzOCAwIDM5MDAwMDAKKzEzNzkgMCAzOTMzMzMzCisxMjk2IDAgMzk2NjY2NgorMTczNzggMSA0MDAwMDAwCis1ODMgMCA0MDMzMzMzCis5MzYgMCA0MDY2NjY2CisxNzQ1IDAgNDEwMDAwMAorOTg3IDAgNDEzMzMzMworMTM5MyAwIDQxNjY2NjYKKzE0OTUgMCA0MjAwMDAwCis4NjkgMCA0MjMzMzMzCisxOTM4IDAgNDI2NjY2NgorODI4IDAgNDMwMDAwMAorMTg1MSAwIDQzMzMzMzMKKzgzNCAwIDQzNjY2NjYKKzE3MjgwIDEgNDQwMDAwMAorNTgwIDAgNDQzMzMzMworODY5IDAgNDQ2NjY2NgorMTYwNSAwIDQ1MDAwMDAKKzg0MyAwIDQ1MzMzMzMKKzYxNDcgMSA0NTY2NjY2CisyMjAgMCA0NjAwMDAwCisxMTA2IDAgNDYzMzMzMworMzk1IDAgNDY2NjY2NgorMzA0IDAgNDcwMDAwMAorMTk0NiAwIDQ3MzMzMzMKKzE1NCAwIDQ3NjY2NjYKKzQ4MiAwIDQ4MDAwMDAKKzk0OSAwIDQ4MzMzMzMKKzEwODggMCA0ODY2NjY2Cis5NzQgMCA0OTAwMDAwCis4NzYgMCA0OTMzMzMzCis5MTY0IDEgNDk2NjY2NgorMTAxOSAwIDUwMDAwMDAKKzk4MyAwIDUwMzMzMzMKKzEzNzUgMCA1MDY2NjY2CisxMDQxIDAgNTEwMDAwMAorNzg5IDAgNTEzMzMzMworMTAzNyAwIDUxNjY2NjYKKzgxMiAwIDUyMDAwMDAKKzczMiAwIDUyMzMzMzMKKzk3MiAwIDUyNjY2NjYKKzcwOCAwIDUzMDAwMDAKKzYyMyAwIDUzMzMzMzMKKzEwNjY3IDEgNTM2NjY2NgorNDYzIDAgNTQwMDAwMAorOTExIDAgNTQzMzMzMworODYxIDAgNTQ2NjY2NgorNTA3IDAgNTUwMDAwMAorMTAxNSAwIDU1MzMzMzMKKzUwMSAwIDU1NjY2NjYKKzkzNCAwIDU2MDAwMDAKKzgxMiAwIDU2MzMzMzMKKzg1NSAwIDU2NjY2NjYKKzgwNCAwIDU3MDAwMDAKKzc4MyAwIDU3MzMzMzMKKzEwNjEwIDEgNTc2NjY2NgorOTUwIDAgNTgwMDAwMAorMTI5MiAwIDU4MzMzMzMKKzEwMDIgMCA1ODY2NjY2Cis3MjggMCA1OTAwMDAwCis5NjAgMCA1OTMzMzMzCisxMjMwIDAgNTk2NjY2NgorMTMxNSAwIDYwMDAwMDAKKzEyNDggMCA2MDMzMzMzCis5OTUgMCA2MDY2NjY2CisxNDAxIDAgNjEwMDAwMAorOTA1IDAgNjEzMzMzMworOTMyNiAxIDYxNjY2NjYKKzcyNiAwIDYyMDAwMDAKKzY2NyAwIDYyMzMzMzMKKzgzMyAwIDYyNjY2NjYKKzEwMDcgMCA2MzAwMDAwCisxMTcyIDAgNjMzMzMzMworMTkxMCAwIDYzNjY2NjYKKzE5NTQgMCA2NDAwMDAwCisxNDk4IDAgNjQzMzMzMworMTE4OCAwIDY0NjY2NjYKKzc4NCAwIDY1MDAwMDAKKzEwMDUgMCA2NTMzMzMzCisxMDAzMCAxIDY1NjY2NjYKKzQ1MiAwIDY2MDAwMDAKKzc2MyAwIDY2MzMzMzMKKzYzOSAwIDY2NjY2NjYKKzY3MSAwIDY3MDAwMDAKKzg2NyAwIDY3MzMzMzMKKzk2MyAwIDY3NjY2NjYKKzk4MiAwIDY4MDAwMDAKKzk5NSAwIDY4MzMzMzMKKzk4MiAwIDY4NjY2NjYKKzc0NyAwIDY5MDAwMDAKKzU3NCAwIDY5MzMzMzMKKzEyMzUzIDEgNjk2NjY2NgorNDc0IDAgNzAwMDAwMAorOTY5IDAgNzAzMzMzMworNjMzIDAgNzA2NjY2NgorNzIzIDAgNzEwMDAwMAorMTIyMSAwIDcxMzMzMzMKKzY3NCAwIDcxNjY2NjYKKzc3NiAwIDcyMDAwMDAKKzU3MiAwIDcyMzMzMzMKKzkxMiAwIDcyNjY2NjYKKzU2NCAwIDczMDAwMDAKKzU5NCAwIDczMzMzMzMKKzE2NjYxIDEgNzM2NjY2NgorNTE4IDAgNzQwMDAwMAorNjU2IDAgNzQzMzMzMworNjI1IDAgNzQ2NjY2NgorNTgzIDAgNzUwMDAwMAorNTg0IDAgNzUzMzMzMworMTAyNyAwIDc1NjY2NjYKKzgxMiAwIDc2MDAwMDAKKzcyOSAwIDc2MzMzMzMKKzc2NiAwIDc2NjY2NjYKKzkwMSAwIDc3MDAwMDAKKzk2MCAwIDc3MzMzMzMKKzEyMzM2IDEgNzc2NjY2NgorOTQ0IDAgNzgwMDAwMAorMTM5OCAwIDc4MzMzMzMKKzE2MjUgMCA3ODY2NjY2CisyMTAzIDAgNzkwMDAwMAorMTYzMCAwIDc5MzMzMzMKKzEyMjggMCA3OTY2NjY2CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLm00diBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMubTR2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZWFkMDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLm00dgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNlZDEyYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbwpAQCAtMCwwICsxLDQ5OSBAQAorMTkgMzIgMAorOCAzMiAwCis4IDMyIDAKKzUyOSAxIDAKKzMyOSAxIDEzNTAwCiszNDkgMSAzMzUwMAorMzM2IDEgNTM1MDAKKzM4MyAxIDczNTAwCiszNTkgMSA5MzUwMAorMzQ0IDEgMTEzNTAwCiszNDMgMSAxMzM1MDAKKzMzMiAxIDE1MzUwMAorMzIwIDEgMTczNTAwCiszMTkgMSAxOTM1MDAKKzMyMyAxIDIxMzUwMAorMzIwIDEgMjMzNTAwCiszMjggMSAyNTM1MDAKKzM0MCAxIDI3MzUwMAorMzE4IDEgMjkzNTAwCiszMTkgMSAzMTM1MDAKKzMzNSAxIDMzMzUwMAorNTExIDEgMzUzNTAwCiszOTUgMSAzNzM1MDAKKzMyNyAxIDM5MzUwMAorNDc5IDEgNDEzNTAwCiszMzIgMSA0MzM1MDAKKzMyMCAxIDQ1MzUwMAorMzIxIDEgNDczNTAwCiszMTAgMSA0OTM1MDAKKzMxMCAxIDUxMzUwMAorMzEwIDEgNTMzNTAwCiszMjYgMSA1NTM1MDAKKzMzMCAxIDU3MzUwMAorMzE4IDEgNTkzNTAwCiszMDkgMSA2MTM1MDAKKzMwNCAxIDYzMzUwMAorMjk4IDEgNjUzNTAwCisyOTQgMSA2NzM1MDAKKzMwMCAxIDY5MzUwMAorMzE0IDEgNzEzNTAwCiszMDQgMSA3MzM1MDAKKzMwNyAxIDc1MzUwMAorMzIxIDEgNzczNTAwCiszMzMgMSA3OTM1MDAKKzMzNSAxIDgxMzUwMAorMzA2IDEgODMzNTAwCiszMTUgMSA4NTM1MDAKKzMyMCAxIDg3MzUwMAorMzE1IDEgODkzNTAwCiszMDggMSA5MTM1MDAKKzMyMCAxIDkzMzUwMAorMzExIDEgOTUzNTAwCiszMTEgMSA5NzM1MDAKKzMxMyAxIDk5MzUwMAorMzE0IDEgMTAxMzUwMAorMzA4IDEgMTAzMzUwMAorMzA3IDEgMTA1MzUwMAorMzE3IDEgMTA3MzUwMAorMzI4IDEgMTA5MzUwMAorMzE3IDEgMTExMzUwMAorMzEyIDEgMTEzMzUwMAorMzA4IDEgMTE1MzUwMAorMzE1IDEgMTE3MzUwMAorMzIwIDEgMTE5MzUwMAorMzIyIDEgMTIxMzUwMAorMzIzIDEgMTIzMzUwMAorMzIyIDEgMTI1MzUwMAorMzIyIDEgMTI3MzUwMAorMzAxIDEgMTI5MzUwMAorMzAzIDEgMTMxMzUwMAorMzA4IDEgMTMzMzUwMAorMjk5IDEgMTM1MzUwMAorMjk3IDEgMTM3MzUwMAorMjkzIDEgMTM5MzUwMAorMjk1IDEgMTQxMzUwMAorMjk3IDEgMTQzMzUwMAorMzAwIDEgMTQ1MzUwMAorMjk0IDEgMTQ3MzUwMAorMjk5IDEgMTQ5MzUwMAorMjk2IDEgMTUxMzUwMAorMzAzIDEgMTUzMzUwMAorMzEzIDEgMTU1MzUwMAorMzA2IDEgMTU3MzUwMAorMzAzIDEgMTU5MzUwMAorMzExIDEgMTYxMzUwMAorMzA3IDEgMTYzMzUwMAorMzEwIDEgMTY1MzUwMAorMzM5IDEgMTY3MzUwMAorMzI1IDEgMTY5MzUwMAorMzIwIDEgMTcxMzUwMAorMzE1IDEgMTczMzUwMAorMzE2IDEgMTc1MzUwMAorMzM4IDEgMTc3MzUwMAorMzI1IDEgMTc5MzUwMAorMzI1IDEgMTgxMzUwMAorMzI4IDEgMTgzMzUwMAorMzA0IDEgMTg1MzUwMAorMjk3IDEgMTg3MzUwMAorMzIyIDEgMTg5MzUwMAorMzExIDEgMTkxMzUwMAorMzA3IDEgMTkzMzUwMAorMzAwIDEgMTk1MzUwMAorMzAxIDEgMTk3MzUwMAorMzA5IDEgMTk5MzUwMAorMzAwIDEgMjAxMzUwMAorMzA2IDEgMjAzMzUwMAorMzA1IDEgMjA1MzUwMAorMjk4IDEgMjA3MzUwMAorMjkxIDEgMjA5MzUwMAorMzAxIDEgMjExMzUwMAorMzAwIDEgMjEzMzUwMAorNDM5IDEgMjE1MzUwMAorMjkyIDEgMjE3MzUwMAorMzA4IDEgMjE5MzUwMAorMzA1IDEgMjIxMzUwMAorMjk4IDEgMjIzMzUwMAorMjk3IDEgMjI1MzUwMAorMjkzIDEgMjI3MzUwMAorNDA4IDEgMjI5MzUwMAorMjk4IDEgMjMxMzUwMAorNDUyIDEgMjMzMzUwMAorMjk3IDEgMjM1MzUwMAorMzAzIDEgMjM3MzUwMAorMzAwIDEgMjM5MzUwMAorMzEwIDEgMjQxMzUwMAorMjk5IDEgMjQzMzUwMAorMzA2IDEgMjQ1MzUwMAorMzE2IDEgMjQ3MzUwMAorMzA4IDEgMjQ5MzUwMAorMzEzIDEgMjUxMzUwMAorMzA5IDEgMjUzMzUwMAorMzEwIDEgMjU1MzUwMAorMzE1IDEgMjU3MzUwMAorMzA5IDEgMjU5MzUwMAorMzE3IDEgMjYxMzUwMAorMzExIDEgMjYzMzUwMAorMzI4IDEgMjY1MzUwMAorMzMzIDEgMjY3MzUwMAorMzI2IDEgMjY5MzUwMAorMzIzIDEgMjcxMzUwMAorMzE2IDEgMjczMzUwMAorMzI1IDEgMjc1MzUwMAorMzE2IDEgMjc3MzUwMAorMzE5IDEgMjc5MzUwMAorMzI2IDEgMjgxMzUwMAorMzIwIDEgMjgzMzUwMAorMzI4IDEgMjg1MzUwMAorMzEyIDEgMjg3MzUwMAorMzE0IDEgMjg5MzUwMAorMzA5IDEgMjkxMzUwMAorMzA2IDEgMjkzMzUwMAorMjk1IDEgMjk1MzUwMAorMzA0IDEgMjk3MzUwMAorMzI2IDEgMjk5MzUwMAorMjkxIDEgMzAxMzUwMAorMjk5IDEgMzAzMzUwMAorMjkzIDEgMzA1MzUwMAorMjg4IDEgMzA3MzUwMAorMjk0IDEgMzA5MzUwMAorMjkyIDEgMzExMzUwMAorMjkyIDEgMzEzMzUwMAorMjg4IDEgMzE1MzUwMAorMzA4IDEgMzE3MzUwMAorMzA0IDEgMzE5MzUwMAorMjkyIDEgMzIxMzUwMAorMzgyIDEgMzIzMzUwMAorMzgxIDEgMzI1MzUwMAorMjk5IDEgMzI3MzUwMAorMzE2IDEgMzI5MzUwMAorMzA4IDEgMzMxMzUwMAorMzAxIDEgMzMzMzUwMAorMjk3IDEgMzM1MzUwMAorMjk5IDEgMzM3MzUwMAorMjk0IDEgMzM5MzUwMAorMjk1IDEgMzQxMzUwMAorMzE3IDEgMzQzMzUwMAorMjk3IDEgMzQ1MzUwMAorMzA5IDEgMzQ3MzUwMAorMzEzIDEgMzQ5MzUwMAorMzIwIDEgMzUxMzUwMAorMzI5IDEgMzUzMzUwMAorMzMwIDEgMzU1MzUwMAorMzI0IDEgMzU3MzUwMAorMzI0IDEgMzU5MzUwMAorMzA5IDEgMzYxMzUwMAorMzA0IDEgMzYzMzUwMAorMzEzIDEgMzY1MzUwMAorMzEyIDEgMzY3MzUwMAorMjk5IDEgMzY5MzUwMAorMjk1IDEgMzcxMzUwMAorMzAxIDEgMzczMzUwMAorMjk1IDEgMzc1MzUwMAorMjk3IDEgMzc3MzUwMAorMzAyIDEgMzc5MzUwMAorMjk4IDEgMzgxMzUwMAorMjk5IDEgMzgzMzUwMAorMjk2IDEgMzg1MzUwMAorMjkyIDEgMzg3MzUwMAorMzA3IDEgMzg5MzUwMAorMzAzIDEgMzkxMzUwMAorMzEzIDEgMzkzMzUwMAorMzE4IDEgMzk1MzUwMAorMzEzIDEgMzk3MzUwMAorMzUzIDEgMzk5MzUwMAorMzcxIDEgNDAxMzUwMAorMjkyIDEgNDAzMzUwMAorMzAwIDEgNDA1MzUwMAorMzgxIDEgNDA3MzUwMAorMjk0IDEgNDA5MzUwMAorMzAxIDEgNDExMzUwMAorMzA1IDEgNDEzMzUwMAorMjk5IDEgNDE1MzUwMAorMzA1IDEgNDE3MzUwMAorMzIyIDEgNDE5MzUwMAorMzE1IDEgNDIxMzUwMAorMzI2IDEgNDIzMzUwMAorMzM4IDEgNDI1MzUwMAorMzIwIDEgNDI3MzUwMAorMzE5IDEgNDI5MzUwMAorMzI3IDEgNDMxMzUwMAorMzMwIDEgNDMzMzUwMAorMzEwIDEgNDM1MzUwMAorMzAzIDEgNDM3MzUwMAorMjk5IDEgNDM5MzUwMAorMjkzIDEgNDQxMzUwMAorMjkzIDEgNDQzMzUwMAorMjk0IDEgNDQ1MzUwMAorMjk1IDEgNDQ3MzUwMAorMjk1IDEgNDQ5MzUwMAorMzIzIDEgNDUxMzUwMAorMzA5IDEgNDUzMzUwMAorMzA5IDEgNDU1MzUwMAorMzAxIDEgNDU3MzUwMAorNDczIDEgNDU5MzUwMAorMjkxIDEgNDYxMzUwMAorMjk3IDEgNDYzMzUwMAorMjk0IDEgNDY1MzUwMAorMjkzIDEgNDY3MzUwMAorMzA0IDEgNDY5MzUwMAorMjkyIDEgNDcxMzUwMAorMzAyIDEgNDczMzUwMAorMjk2IDEgNDc1MzUwMAorMjk4IDEgNDc3MzUwMAorMzAxIDEgNDc5MzUwMAorMzA3IDEgNDgxMzUwMAorMjg1IDEgNDgzMzUwMAorMjk0IDEgNDg1MzUwMAorMzA0IDEgNDg3MzUwMAorMjk0IDEgNDg5MzUwMAorMjk1IDEgNDkxMzUwMAorMzI1IDEgNDkzMzUwMAorMzE5IDEgNDk1MzUwMAorMzIzIDEgNDk3MzUwMAorMzEzIDEgNDk5MzUwMAorMzAzIDEgNTAxMzUwMAorMjk2IDEgNTAzMzUwMAorMjk1IDEgNTA1MzUwMAorMjkwIDEgNTA3MzUwMAorMjk3IDEgNTA5MzUwMAorMjk2IDEgNTExMzUwMAorMjk2IDEgNTEzMzUwMAorMjkyIDEgNTE1MzUwMAorMjk1IDEgNTE3MzUwMAorMjg3IDEgNTE5MzUwMAorMjk0IDEgNTIxMzUwMAorMjkwIDEgNTIzMzUwMAorMjk3IDEgNTI1MzUwMAorMjk3IDEgNTI3MzUwMAorMjk3IDEgNTI5MzUwMAorMjkyIDEgNTMxMzUwMAorMjk3IDEgNTMzMzUwMAorMjkwIDEgNTM1MzUwMAorMjkzIDEgNTM3MzUwMAorMjkzIDEgNTM5MzUwMAorMjkxIDEgNTQxMzUwMAorMjkyIDEgNTQzMzUwMAorMjkwIDEgNTQ1MzUwMAorMjkxIDEgNTQ3MzUwMAorMjk2IDEgNTQ5MzUwMAorMjk1IDEgNTUxMzUwMAorMzI3IDEgNTUzMzUwMAorMjkzIDEgNTU1MzUwMAorMjkxIDEgNTU3MzUwMAorMjkxIDEgNTU5MzUwMAorMzExIDEgNTYxMzUwMAorMjkxIDEgNTYzMzUwMAorMjk0IDEgNTY1MzUwMAorMjk2IDEgNTY3MzUwMAorMjk1IDEgNTY5MzUwMAorMjg5IDEgNTcxMzUwMAorMjk1IDEgNTczMzUwMAorMjk1IDEgNTc1MzUwMAorMjk3IDEgNTc3MzUwMAorMjkyIDEgNTc5MzUwMAorMjk3IDEgNTgxMzUwMAorMjkyIDEgNTgzMzUwMAorMjk1IDEgNTg1MzUwMAorMjk2IDEgNTg3MzUwMAorMjk1IDEgNTg5MzUwMAorMzAzIDEgNTkxMzUwMAorMzA0IDEgNTkzMzUwMAorMzAxIDEgNTk1MzUwMAorMzA3IDEgNTk3MzUwMAorMzA0IDEgNTk5MzUwMAorMzEwIDEgNjAxMzUwMAorMzEwIDEgNjAzMzUwMAorMzA1IDEgNjA1MzUwMAorMzAxIDEgNjA3MzUwMAorMzAyIDEgNjA5MzUwMAorMzA1IDEgNjExMzUwMAorMjk4IDEgNjEzMzUwMAorMzAwIDEgNjE1MzUwMAorMzAwIDEgNjE3MzUwMAorMjkyIDEgNjE5MzUwMAorMjk3IDEgNjIxMzUwMAorMzAxIDEgNjIzMzUwMAorMjk3IDEgNjI1MzUwMAorMjk3IDEgNjI3MzUwMAorMjk4IDEgNjI5MzUwMAorMjk3IDEgNjMxMzUwMAorMzAwIDEgNjMzMzUwMAorMjkzIDEgNjM1MzUwMAorMjkzIDEgNjM3MzUwMAorMjk3IDEgNjM5MzUwMAorMjk0IDEgNjQxMzUwMAorMzA3IDEgNjQzMzUwMAorMzAyIDEgNjQ1MzUwMAorMzA3IDEgNjQ3MzUwMAorMzIwIDEgNjQ5MzUwMAorMzMwIDEgNjUxMzUwMAorMzMzIDEgNjUzMzUwMAorMzM3IDEgNjU1MzUwMAorMzMxIDEgNjU3MzUwMAorMzIzIDEgNjU5MzUwMAorMzEyIDEgNjYxMzUwMAorMzI2IDEgNjYzMzUwMAorMzI4IDEgNjY1MzUwMAorMzMyIDEgNjY3MzUwMAorMzMzIDEgNjY5MzUwMAorMzQwIDEgNjcxMzUwMAorMzM2IDEgNjczMzUwMAorMzI0IDEgNjc1MzUwMAorMzEyIDEgNjc3MzUwMAorMzAxIDEgNjc5MzUwMAorMjg5IDEgNjgxMzUwMAorMzAyIDEgNjgzMzUwMAorMjk2IDEgNjg1MzUwMAorMjk5IDEgNjg3MzUwMAorMjg5IDEgNjg5MzUwMAorMjk1IDEgNjkxMzUwMAorMjk5IDEgNjkzMzUwMAorMzc0IDEgNjk1MzUwMAorMzkxIDEgNjk3MzUwMAorMzY1IDEgNjk5MzUwMAorMzQwIDEgNzAxMzUwMAorMzMwIDEgNzAzMzUwMAorMzM3IDEgNzA1MzUwMAorMzI4IDEgNzA3MzUwMAorMzI5IDEgNzA5MzUwMAorMzE5IDEgNzExMzUwMAorMzEyIDEgNzEzMzUwMAorMzA4IDEgNzE1MzUwMAorMzA0IDEgNzE3MzUwMAorMzEyIDEgNzE5MzUwMAorMzExIDEgNzIxMzUwMAorMzE2IDEgNzIzMzUwMAorMjk5IDEgNzI1MzUwMAorMzMwIDEgNzI3MzUwMAorMzMwIDEgNzI5MzUwMAorMzMwIDEgNzMxMzUwMAorMzQyIDEgNzMzMzUwMAorNDM5IDEgNzM1MzUwMAorMzIyIDEgNzM3MzUwMAorMjk4IDEgNzM5MzUwMAorMjkzIDEgNzQxMzUwMAorMzEwIDEgNzQzMzUwMAorMzAzIDEgNzQ1MzUwMAorMzE3IDEgNzQ3MzUwMAorNDUzIDEgNzQ5MzUwMAorMzc3IDEgNzUxMzUwMAorMzc0IDEgNzUzMzUwMAorMjkyIDEgNzU1MzUwMAorMjk1IDEgNzU3MzUwMAorMjc0IDEgNzU5MzUwMAorMjkyIDEgNzYxMzUwMAorMjkxIDEgNzYzMzUwMAorMzY3IDEgNzY1MzUwMAorMjk1IDEgNzY3MzUwMAorMjk4IDEgNzY5MzUwMAorMjk3IDEgNzcxMzUwMAorMzAxIDEgNzczMzUwMAorMjkyIDEgNzc1MzUwMAorMzQ0IDEgNzc3MzUwMAorMjk2IDEgNzc5MzUwMAorMjk3IDEgNzgxMzUwMAorMzA2IDEgNzgzMzUwMAorMzA4IDEgNzg1MzUwMAorMzA1IDEgNzg3MzUwMAorMzEzIDEgNzg5MzUwMAorMzA2IDEgNzkxMzUwMAorMzIyIDEgNzkzMzUwMAorMzEzIDEgNzk1MzUwMAorMzA1IDEgNzk3MzUwMAorMzA0IDEgNzk5MzUwMAorMzEzIDEgODAxMzUwMAorMzI0IDEgODAzMzUwMAorMzEyIDEgODA1MzUwMAorMzE4IDEgODA3MzUwMAorMzExIDEgODA5MzUwMAorMzAyIDEgODExMzUwMAorMzA1IDEgODEzMzUwMAorMzEyIDEgODE1MzUwMAorMzEzIDEgODE3MzUwMAorMzEyIDEgODE5MzUwMAorMzM1IDEgODIxMzUwMAorMzMzIDEgODIzMzUwMAorMzQ2IDEgODI1MzUwMAorMzM5IDEgODI3MzUwMAorMzM3IDEgODI5MzUwMAorMzQxIDEgODMxMzUwMAorMzM1IDEgODMzMzUwMAorMzI1IDEgODM1MzUwMAorMzI0IDEgODM3MzUwMAorMzE3IDEgODM5MzUwMAorMzE1IDEgODQxMzUwMAorMzAzIDEgODQzMzUwMAorMzE3IDEgODQ1MzUwMAorNDUyIDEgODQ3MzUwMAorMzI0IDEgODQ5MzUwMAorMzIxIDEgODUxMzUwMAorMzM1IDEgODUzMzUwMAorMzI3IDEgODU1MzUwMAorMzE1IDEgODU3MzUwMAorMzIxIDEgODU5MzUwMAorMzE5IDEgODYxMzUwMAorMzA4IDEgODYzMzUwMAorMzE0IDEgODY1MzUwMAorMzIyIDEgODY3MzUwMAorMzI4IDEgODY5MzUwMAorMzIwIDEgODcxMzUwMAorMzI0IDEgODczMzUwMAorMzMxIDEgODc1MzUwMAorMzMwIDEgODc3MzUwMAorMzI4IDEgODc5MzUwMAorMzE4IDEgODgxMzUwMAorMzE0IDEgODgzMzUwMAorMzE4IDEgODg1MzUwMAorMzE4IDEgODg3MzUwMAorMzI1IDEgODg5MzUwMAorMzM4IDEgODkxMzUwMAorMzQxIDEgODkzMzUwMAorMzMzIDEgODk1MzUwMAorMzMwIDEgODk3MzUwMAorMzM4IDEgODk5MzUwMAorMzMzIDEgOTAxMzUwMAorMzMwIDEgOTAzMzUwMAorMzQ0IDEgOTA1MzUwMAorNDc5IDEgOTA3MzUwMAorNDczIDEgOTA5MzUwMAorMzMzIDEgOTExMzUwMAorMzM3IDEgOTEzMzUwMAorNDk1IDEgOTE1MzUwMAorMzUzIDEgOTE3MzUwMAorMzUyIDEgOTE5MzUwMAorMzQ0IDEgOTIxMzUwMAorMzM2IDEgOTIzMzUwMAorMzI0IDEgOTI1MzUwMAorMzIxIDEgOTI3MzUwMAorMzUwIDEgOTI5MzUwMAorMzQ3IDEgOTMxMzUwMAorMzQzIDEgOTMzMzUwMAorMzQ1IDEgOTM1MzUwMAorMzM3IDEgOTM3MzUwMAorMzM1IDEgOTM5MzUwMAorMzMzIDEgOTQxMzUwMAorMzM2IDEgOTQzMzUwMAorMzM0IDEgOTQ1MzUwMAorMzMzIDEgOTQ3MzUwMAorMzMxIDEgOTQ5MzUwMAorMzI5IDEgOTUxMzUwMAorMzE5IDEgOTUzMzUwMAorMzIxIDEgOTU1MzUwMAorMzE2IDEgOTU3MzUwMAorMzIyIDEgOTU5MzUwMAorNDQ4IDEgOTYxMzUwMAorMzEyIDEgOTYzMzUwMAorMzA2IDEgOTY1MzUwMAorMzAxIDEgOTY3MzUwMAorMzAzIDEgOTY5MzUwMAorMjk2IDEgOTcxMzUwMAorMzAwIDEgOTczMzUwMAorMjk1IDEgOTc1MzUwMAorMzAwIDEgOTc3MzUwMAorMjk3IDEgOTc5MzUwMAorMzAwIDEgOTgxMzUwMAorMjk3IDEgOTgzMzUwMAorNTEyIDEgOTg1MzUwMAorMjkyIDEgOTg3MzUwMAorNDY4IDEgOTg5MzUwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5vcHVzIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5vcHVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNmI4NzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6Lm9wdXMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3Jhd18xY2hfMTZraHpfczE2bGUucmF3IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3Jhd18xY2hfMTZraHpfczE2bGUucmF3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMmY0MWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3Jhd18xY2hfOGtoel9zMTZsZS5yYXcgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfcmF3XzFjaF84a2h6X3MxNmxlLnJhdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTQ5ZWIyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3Jhd18xY2hfOGtoel9zMTZsZS5yYXcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3Jhd18xY2hfOGtoel9zMzJsZS5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3Jhd18xY2hfOGtoel9zMzJsZS5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZTI0Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfcmF3XzFjaF84a2h6X3MzMmxlLmluZm8KQEAgLTAsMCArMSwxMCBAQAorMTYzODQgMSAwCisxNjM4NCAxIDEwMjQwMDAKKzE2Mzg0IDEgMjA0ODAwMAorMTYzODQgMSAzMDcyMDAwCisxNjM4NCAxIDQwOTYwMDAKKzE2Mzg0IDEgNTEyMDAwMAorMTYzODQgMSA2MTQ0MDAwCisxNjM4NCAxIDcxNjgwMDAKKzE2Mzg0IDEgODE5MjAwMAorMTA5MjQgMSA5MjE2MDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfcmF3XzFjaF84a2h6X3MzMmxlLnJhdyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9yYXdfMWNoXzhraHpfczMybGUucmF3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkOTFiNDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfcmF3XzFjaF84a2h6X3MzMmxlLnJhdwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfcmF3XzJjaF80OGtoel9zMTZsZS5yYXcgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfcmF3XzJjaF80OGtoel9zMTZsZS5yYXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk4YjJlYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9yYXdfMmNoXzQ4a2h6X3MxNmxlLnJhdwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfdm9yYmlzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YTZkMzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfdm9yYmlzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbwpAQCAtMCwwICsxLDUyMCBAQAorMzAgMzIgMAorNDE0MCAzMiAwCiszMyAzMiAwCis1MiAxIDAKKzU4IDEgMjY2NgorNjEgMSA1MzMzCis1NiAxIDgwMDAKKzU5IDEgMTA2NjYKKzYzIDEgMTMzMzMKKzY2IDEgMTYwMDAKKzcxIDEgMTg2NjYKKzc2IDEgMjEzMzMKKzM3NCAxIDI0MDAwCiszNjYgMSAzNjAwMAorMzc4IDEgNTczMzMKKzM5MyAxIDc4NjY2CiszOTMgMSAxMDAwMDAKKzM4NiAxIDEyMTMzMworMzc1IDEgMTQyNjY2CiszODggMSAxNjQwMDAKKzM3OCAxIDE4NTMzMworMzc5IDEgMjA2NjY2CiszNzQgMSAyMjgwMDAKKzM1NiAxIDI0OTMzMworMzU4IDEgMjcwNjY2CiszMzIgMSAyOTIwMDAKKzMzNSAxIDMxMzMzMworMzYzIDEgMzM0NjY2CiszNDEgMSAzNTYwMDAKKzM2MCAxIDM3NzMzMworMzQxIDEgMzk4NjY2CiszMzUgMSA0MjAwMDAKKzM1NyAxIDQ0MTMzMworMzU1IDEgNDYyNjY2CiszNjMgMSA0ODQwMDAKKzM4MiAxIDUwNTMzMworMzcxIDEgNTI2NjY2CiszNTcgMSA1NDgwMDAKKzM1MyAxIDU2OTMzMworMzUwIDEgNTkwNjY2CiszMjcgMSA2MTIwMDAKKzMxNSAxIDYzMzMzMworMzA3IDEgNjU0NjY2CiszMDMgMSA2NzYwMDAKKzI5NSAxIDY5NzMzMworMzEyIDEgNzE4NjY2CiszMTYgMSA3NDAwMDAKKzMxNSAxIDc2MTMzMworMzE4IDEgNzgyNjY2CiszMzAgMSA4MDQwMDAKKzMxOCAxIDgyNTMzMworMzE1IDEgODQ2NjY2CiszMjIgMSA4NjgwMDAKKzMxNSAxIDg4OTMzMworMzEwIDEgOTEwNjY2CiszMTUgMSA5MzIwMDAKKzMxNCAxIDk1MzMzMworMzAyIDEgOTc0NjY2CiszMTMgMSA5OTYwMDAKKzMyMiAxIDEwMTczMzMKKzMyMyAxIDEwMzg2NjYKKzMxOSAxIDEwNjAwMDAKKzMyNSAxIDEwODEzMzMKKzMyOCAxIDExMDI2NjYKKzMzMCAxIDExMjQwMDAKKzMzMyAxIDExNDUzMzMKKzMzMCAxIDExNjY2NjYKKzM0NCAxIDExODgwMDAKKzMzMSAxIDEyMDkzMzMKKzM0MiAxIDEyMzA2NjYKKzMzOSAxIDEyNTIwMDAKKzMxNCAxIDEyNzMzMzMKKzI4NSAxIDEyOTQ2NjYKKzI5NSAxIDEzMTYwMDAKKzMwMiAxIDEzMzczMzMKKzMwNSAxIDEzNTg2NjYKKzMwOSAxIDEzODAwMDAKKzMyNyAxIDE0MDEzMzMKKzMwNCAxIDE0MjI2NjYKKzMzNiAxIDE0NDQwMDAKKzM1MCAxIDE0NjUzMzMKKzM0NiAxIDE0ODY2NjYKKzM1MiAxIDE1MDgwMDAKKzM0MSAxIDE1MjkzMzMKKzM0MyAxIDE1NTA2NjYKKzM1MSAxIDE1NzIwMDAKKzMxOSAxIDE1OTMzMzMKKzMyOCAxIDE2MTQ2NjYKKzMyOCAxIDE2MzYwMDAKKzMyNCAxIDE2NTczMzMKKzMzOCAxIDE2Nzg2NjYKKzMxNyAxIDE3MDAwMDAKKzMyOCAxIDE3MjEzMzMKKzMzNSAxIDE3NDI2NjYKKzM0MSAxIDE3NjQwMDAKKzMzNSAxIDE3ODUzMzMKKzM0OCAxIDE4MDY2NjYKKzM2MiAxIDE4MjgwMDAKKzM2MSAxIDE4NDkzMzMKKzM0NCAxIDE4NzA2NjYKKzM0MCAxIDE4OTIwMDAKKzMzMyAxIDE5MTMzMzMKKzMyOSAxIDE5MzQ2NjYKKzMyOCAxIDE5NTYwMDAKKzMyMyAxIDE5NzczMzMKKzMxMCAxIDE5OTg2NjYKKzMxOCAxIDIwMjAwMDAKKzMxMiAxIDIwNDEzMzMKKzI5NSAxIDIwNjI2NjYKKzMyOSAxIDIwODQwMDAKKzMxOCAxIDIxMDUzMzMKKzMxMSAxIDIxMjY2NjYKKzMxNyAxIDIxNDgwMDAKKzYyIDEgMjE2OTMzMworNzUgMSAyMTgxMzMzCis3MyAxIDIxODQwMDAKKzMzMiAxIDIxODY2NjYKKzMyNyAxIDIxOTg2NjYKKzMzMiAxIDIyMjAwMDAKKzMyNSAxIDIyNDEzMzMKKzMyOSAxIDIyNjI2NjYKKzMzMCAxIDIyODQwMDAKKzYxIDEgMjMwNTMzMworNjEgMSAyMzE3MzMzCis3MCAxIDIzMjAwMDAKKzcwIDEgMjMyMjY2NgorMzE5IDEgMjMyNTMzMworMzAzIDEgMjMzNzMzMworMjkyIDEgMjM1ODY2NgorMzEzIDEgMjM4MDAwMAorMzE4IDEgMjQwMTMzMworMzQ2IDEgMjQyMjY2NgorMzI4IDEgMjQ0NDAwMAorMzE2IDEgMjQ2NTMzMworMzQxIDEgMjQ4NjY2NgorMzI4IDEgMjUwODAwMAorMzM4IDEgMjUyOTMzMworMzQxIDEgMjU1MDY2NgorMzM3IDEgMjU3MjAwMAorMzQ3IDEgMjU5MzMzMworMzg0IDEgMjYxNDY2NgorMzU4IDEgMjYzNjAwMAorMzYzIDEgMjY1NzMzMworMzYzIDEgMjY3ODY2NgorMzU4IDEgMjcwMDAwMAorMzM5IDEgMjcyMTMzMworMzY5IDEgMjc0MjY2NgorMzQzIDEgMjc2NDAwMAorMzQ4IDEgMjc4NTMzMworMzYzIDEgMjgwNjY2NgorMzUwIDEgMjgyODAwMAorMzU4IDEgMjg0OTMzMworMzUyIDEgMjg3MDY2NgorMzM4IDEgMjg5MjAwMAorMzM1IDEgMjkxMzMzMworMzQyIDEgMjkzNDY2NgorMzM4IDEgMjk1NjAwMAorMzQwIDEgMjk3NzMzMworMjkyIDEgMjk5ODY2NgorMjc5IDEgMzAyMDAwMAorMjk5IDEgMzA0MTMzMworMzAzIDEgMzA2MjY2NgorMjk4IDEgMzA4NDAwMAorMjk3IDEgMzEwNTMzMworMjgwIDEgMzEyNjY2NgorMjk3IDEgMzE0ODAwMAorMjkwIDEgMzE2OTMzMworMzA2IDEgMzE5MDY2NgorMzAxIDEgMzIxMjAwMAorMzA2IDEgMzIzMzMzMworMjg5IDEgMzI1NDY2NgorMzExIDEgMzI3NjAwMAorMzE3IDEgMzI5NzMzMworMzQ0IDEgMzMxODY2NgorMzA4IDEgMzM0MDAwMAorMzA0IDEgMzM2MTMzMworMzA0IDEgMzM4MjY2NgorMzEyIDEgMzQwNDAwMAorMzA1IDEgMzQyNTMzMworMjk5IDEgMzQ0NjY2NgorMzAxIDEgMzQ2ODAwMAorMzE4IDEgMzQ4OTMzMworMzEzIDEgMzUxMDY2NgorMzMwIDEgMzUzMjAwMAorMzI1IDEgMzU1MzMzMworMzI1IDEgMzU3NDY2NgorMzIxIDEgMzU5NjAwMAorMzQ5IDEgMzYxNzMzMworMjg4IDEgMzYzODY2NgorMzAwIDEgMzY2MDAwMAorMzEyIDEgMzY4MTMzMworMzAyIDEgMzcwMjY2NgorMjc4IDEgMzcyNDAwMAorMjg0IDEgMzc0NTMzMworMjg2IDEgMzc2NjY2NgorMjc0IDEgMzc4ODAwMAorMjk1IDEgMzgwOTMzMworMjgxIDEgMzgzMDY2NgorMjg4IDEgMzg1MjAwMAorMjc4IDEgMzg3MzMzMworMzA2IDEgMzg5NDY2NgorNjIgMSAzOTE2MDAwCis1OSAxIDM5MjgwMDAKKzYxIDEgMzkzMDY2NgorNTUgMSAzOTMzMzMzCis3MCAxIDM5MzYwMDAKKzcyIDEgMzkzODY2NgorMzI0IDEgMzk0MTMzMworMzA5IDEgMzk1MzMzMworMzAxIDEgMzk3NDY2NgorMzAxIDEgMzk5NjAwMAorMjkxIDEgNDAxNzMzMworMjg5IDEgNDAzODY2NgorMzA2IDEgNDA2MDAwMAorMzA1IDEgNDA4MTMzMworMjg2IDEgNDEwMjY2NgorMjk0IDEgNDEyNDAwMAorMjkwIDEgNDE0NTMzMworMjk3IDEgNDE2NjY2NgorMzA4IDEgNDE4ODAwMAorMjk2IDEgNDIwOTMzMworMjkyIDEgNDIzMDY2NgorMjg3IDEgNDI1MjAwMAorMjkxIDEgNDI3MzMzMworMjk4IDEgNDI5NDY2NgorMjk1IDEgNDMxNjAwMAorMjk0IDEgNDMzNzMzMworMjk1IDEgNDM1ODY2NgorMjc1IDEgNDM4MDAwMAorMjgwIDEgNDQwMTMzMworMjg4IDEgNDQyMjY2NgorMjg1IDEgNDQ0NDAwMAorMjc0IDEgNDQ2NTMzMworMjk4IDEgNDQ4NjY2NgorMzAxIDEgNDUwODAwMAorMzAwIDEgNDUyOTMzMworMzA1IDEgNDU1MDY2NgorMjk3IDEgNDU3MjAwMAorNTkgMSA0NTkzMzMzCis1NiAxIDQ2MDUzMzMKKzU3IDEgNDYwODAwMAorNTUgMSA0NjEwNjY2Cis1OCAxIDQ2MTMzMzMKKzU3IDEgNDYxNjAwMAorNTggMSA0NjE4NjY2Cis2OCAxIDQ2MjEzMzMKKzY3IDEgNDYyNDAwMAorNzEgMSA0NjI2NjY2CisyODkgMSA0NjI5MzMzCisyODIgMSA0NjQxMzMzCisyNzMgMSA0NjYyNjY2CisyNzkgMSA0Njg0MDAwCisyODYgMSA0NzA1MzMzCisyODIgMSA0NzI2NjY2CisyODQgMSA0NzQ4MDAwCisyNzggMSA0NzY5MzMzCisyODEgMSA0NzkwNjY2CisyODAgMSA0ODEyMDAwCisyNjMgMSA0ODMzMzMzCisyNjAgMSA0ODU0NjY2CisyNzEgMSA0ODc2MDAwCisyNzMgMSA0ODk3MzMzCisyODIgMSA0OTE4NjY2CisyNzkgMSA0OTQwMDAwCisyOTcgMSA0OTYxMzMzCisyOTEgMSA0OTgyNjY2CiszMDkgMSA1MDA0MDAwCisyODMgMSA1MDI1MzMzCisyOTIgMSA1MDQ2NjY2CiszMDQgMSA1MDY4MDAwCisyOTYgMSA1MDg5MzMzCisyOTMgMSA1MTEwNjY2CisyODIgMSA1MTMyMDAwCisyNzMgMSA1MTUzMzMzCisyODQgMSA1MTc0NjY2CisyODEgMSA1MTk2MDAwCisyNjUgMSA1MjE3MzMzCisyNzIgMSA1MjM4NjY2CisyNzcgMSA1MjYwMDAwCisyODAgMSA1MjgxMzMzCisyNzYgMSA1MzAyNjY2CisyNzMgMSA1MzI0MDAwCisyNzggMSA1MzQ1MzMzCisyODAgMSA1MzY2NjY2CisyODAgMSA1Mzg4MDAwCisyNjggMSA1NDA5MzMzCisyODIgMSA1NDMwNjY2CisyNzcgMSA1NDUyMDAwCisyNzQgMSA1NDczMzMzCisyNzUgMSA1NDk0NjY2CisyNzAgMSA1NTE2MDAwCisyODIgMSA1NTM3MzMzCisyNzkgMSA1NTU4NjY2CisyNjAgMSA1NTgwMDAwCisyNzIgMSA1NjAxMzMzCisyNzUgMSA1NjIyNjY2CisyNzMgMSA1NjQ0MDAwCisyNzYgMSA1NjY1MzMzCisyODggMSA1Njg2NjY2CisyOTQgMSA1NzA4MDAwCisyNzEgMSA1NzI5MzMzCisyNzcgMSA1NzUwNjY2CisyODggMSA1NzcyMDAwCisyNzYgMSA1NzkzMzMzCisyODIgMSA1ODE0NjY2CisyNzYgMSA1ODM2MDAwCisyNzUgMSA1ODU3MzMzCisyNjggMSA1ODc4NjY2CisyNzAgMSA1OTAwMDAwCisyNjYgMSA1OTIxMzMzCisyNjggMSA1OTQyNjY2CisyODIgMSA1OTY0MDAwCisyNzkgMSA1OTg1MzMzCisyNzkgMSA2MDA2NjY2CisyODcgMSA2MDI4MDAwCisyODYgMSA2MDQ5MzMzCisyODAgMSA2MDcwNjY2CisyOTAgMSA2MDkyMDAwCisyNjYgMSA2MTEzMzMzCisyOTIgMSA2MTM0NjY2CisyNjQgMSA2MTU2MDAwCisyNzEgMSA2MTc3MzMzCisyNzcgMSA2MTk4NjY2CisyOTIgMSA2MjIwMDAwCisyOTggMSA2MjQxMzMzCisyODQgMSA2MjYyNjY2CisyODcgMSA2Mjg0MDAwCisyNzUgMSA2MzA1MzMzCisyOTEgMSA2MzI2NjY2CisyODcgMSA2MzQ4MDAwCisyODMgMSA2MzY5MzMzCisyODQgMSA2MzkwNjY2CisyNzEgMSA2NDEyMDAwCisyODIgMSA2NDMzMzMzCisyNzcgMSA2NDU0NjY2CisyODIgMSA2NDc2MDAwCisyODUgMSA2NDk3MzMzCisyODAgMSA2NTE4NjY2CisyNzEgMSA2NTQwMDAwCisyODkgMSA2NTYxMzMzCisyODcgMSA2NTgyNjY2CisyOTQgMSA2NjA0MDAwCisyNzcgMSA2NjI1MzMzCisyODEgMSA2NjQ2NjY2CisyNzQgMSA2NjY4MDAwCisyNzEgMSA2Njg5MzMzCisyNzkgMSA2NzEwNjY2CisyODggMSA2NzMyMDAwCisyODAgMSA2NzUzMzMzCisyODQgMSA2Nzc0NjY2CisyNzggMSA2Nzk2MDAwCisyNzYgMSA2ODE3MzMzCisyNzUgMSA2ODM4NjY2CisyNjMgMSA2ODYwMDAwCisyNjYgMSA2ODgxMzMzCisyNDcgMSA2OTAyNjY2CisyNjkgMSA2OTI0MDAwCisyNjMgMSA2OTQ1MzMzCisyODMgMSA2OTY2NjY2CisyODAgMSA2OTg4MDAwCisyODEgMSA3MDA5MzMzCisyOTkgMSA3MDMwNjY2CisyODUgMSA3MDUyMDAwCisyODggMSA3MDczMzMzCisyOTkgMSA3MDk0NjY2CisyODggMSA3MTE2MDAwCisyNzkgMSA3MTM3MzMzCisyNzYgMSA3MTU4NjY2CisyNzcgMSA3MTgwMDAwCisyODIgMSA3MjAxMzMzCisyODUgMSA3MjIyNjY2CisyOTUgMSA3MjQ0MDAwCisyOTQgMSA3MjY1MzMzCiszMDQgMSA3Mjg2NjY2CisyODIgMSA3MzA4MDAwCisyOTkgMSA3MzI5MzMzCisyODMgMSA3MzUwNjY2CisyODIgMSA3MzcyMDAwCisyODcgMSA3MzkzMzMzCiszMDYgMSA3NDE0NjY2CiszMDQgMSA3NDM2MDAwCisyODkgMSA3NDU3MzMzCisyOTkgMSA3NDc4NjY2CisyODEgMSA3NTAwMDAwCisyODEgMSA3NTIxMzMzCis2NiAxIDc1NDI2NjYKKzYzIDEgNzU1NDY2NgorMjg5IDEgNzU1NzMzMworMjcwIDEgNzU2OTMzMworMjU3IDEgNzU5MDY2NgorMjQ2IDEgNzYxMjAwMAorMjY0IDEgNzYzMzMzMworMjgwIDEgNzY1NDY2NgorMjczIDEgNzY3NjAwMAorMjg1IDEgNzY5NzMzMworMjY3IDEgNzcxODY2NgorMjc1IDEgNzc0MDAwMAorMjc4IDEgNzc2MTMzMworMjkzIDEgNzc4MjY2NgorMjgxIDEgNzgwNDAwMAorMjk3IDEgNzgyNTMzMworMjk0IDEgNzg0NjY2NgorMjg2IDEgNzg2ODAwMAorMjkwIDEgNzg4OTMzMworMjkwIDEgNzkxMDY2NgorMjg5IDEgNzkzMjAwMAorMjg2IDEgNzk1MzMzMworMjgyIDEgNzk3NDY2NgorMzA2IDEgNzk5NjAwMAorMjg3IDEgODAxNzMzMworMzEyIDEgODAzODY2NgorMzEyIDEgODA2MDAwMAorMzA3IDEgODA4MTMzMworMjkzIDEgODEwMjY2NgorMjg5IDEgODEyNDAwMAorMjg1IDEgODE0NTMzMworMjkwIDEgODE2NjY2NgorMjg1IDEgODE4ODAwMAorMzExIDEgODIwOTMzMworMzA3IDEgODIzMDY2NgorMzE0IDEgODI1MjAwMAorMzE4IDEgODI3MzMzMworMzE5IDEgODI5NDY2NgorMzE1IDEgODMxNjAwMAorMzAwIDEgODMzNzMzMworMjk1IDEgODM1ODY2NgorMjkxIDEgODM4MDAwMAorMjgyIDEgODQwMTMzMworMjk1IDEgODQyMjY2NgorMjk2IDEgODQ0NDAwMAorMjg4IDEgODQ2NTMzMworMzA0IDEgODQ4NjY2NgorMjk5IDEgODUwODAwMAorMjk4IDEgODUyOTMzMworMzA1IDEgODU1MDY2NgorMjk1IDEgODU3MjAwMAorMjk2IDEgODU5MzMzMworMjk1IDEgODYxNDY2NgorMjg3IDEgODYzNjAwMAorMjkyIDEgODY1NzMzMworMzA4IDEgODY3ODY2NgorMjg3IDEgODcwMDAwMAorMzA3IDEgODcyMTMzMworMjk1IDEgODc0MjY2NgorMjkyIDEgODc2NDAwMAorMjkyIDEgODc4NTMzMworMjc5IDEgODgwNjY2NgorMjg5IDEgODgyODAwMAorMzAzIDEgODg0OTMzMworMzA3IDEgODg3MDY2NgorMzEwIDEgODg5MjAwMAorMzAwIDEgODkxMzMzMworMjk5IDEgODkzNDY2NgorMjk5IDEgODk1NjAwMAorMjg4IDEgODk3NzMzMworMjkwIDEgODk5ODY2NgorMjkxIDEgOTAyMDAwMAorMzA0IDEgOTA0MTMzMworMjk5IDEgOTA2MjY2NgorMzA0IDEgOTA4NDAwMAorMjkwIDEgOTEwNTMzMworMzA5IDEgOTEyNjY2NgorMzAxIDEgOTE0ODAwMAorMjk2IDEgOTE2OTMzMworMjg4IDEgOTE5MDY2NgorMzA1IDEgOTIxMjAwMAorMzE3IDEgOTIzMzMzMworMjkyIDEgOTI1NDY2NgorMzAwIDEgOTI3NjAwMAorMzAxIDEgOTI5NzMzMworMjk1IDEgOTMxODY2NgorMjgyIDEgOTM0MDAwMAorMjk2IDEgOTM2MTMzMworMjk1IDEgOTM4MjY2NgorMjg3IDEgOTQwNDAwMAorMjkyIDEgOTQyNTMzMworMzAxIDEgOTQ0NjY2NgorMzExIDEgOTQ2ODAwMAorMzAxIDEgOTQ4OTMzMworMzA3IDEgOTUxMDY2NgorMzAwIDEgOTUzMjAwMAorMzA5IDEgOTU1MzMzMworMjk4IDEgOTU3NDY2NgorMzA0IDEgOTU5NjAwMAorNjAgMSA5NjE3MzMzCis1OSAxIDk2MjkzMzMKKzY0IDEgOTYzMjAwMAorNjQgMSA5NjM0NjY2Cis3NyAxIDk2MzczMzMKKzcyIDEgOTY0MDAwMAorMzA2IDEgOTY0MjY2NgorMjk3IDEgOTY1NDY2NgorMjk0IDEgOTY3NjAwMAorMjk1IDEgOTY5NzMzMworMzA4IDEgOTcxODY2NgorMzAzIDEgOTc0MDAwMAorMzA4IDEgOTc2MTMzMworMjg5IDEgOTc4MjY2NgorMzAwIDEgOTgwNDAwMAorMzA0IDEgOTgyNTMzMworMzA4IDEgOTg0NjY2NgorNjQgMSA5ODY4MDAwCis2MyAxIDk4ODAwMDAKKzY0IDEgOTg4MjY2NgorNjQgMSA5ODg1MzMzCis2MCAxIDk4ODgwMDAKKzc0IDEgOTg5MDY2NgorNjkgMSA5ODkzMzMzCis2OCAxIDk4OTYwMDAKKzYxIDEgOTg5ODY2NgorNzEgMSA5OTAxMzMzCis3NiAxIDk5MDQwMDAKKzczIDEgOTkwNjY2NgorNzAgMSA5OTA5MzMzCis3MiAxIDk5MTIwMDAKKzYwIDEgOTkxNDY2NgorNjkgMSA5OTE3MzMzCis4MiAxIDk5MjAwMDAKKzI3OCAxIDk5MjI2NjYKKzMwIDEgOTkzNDY2NgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LnZvcmJpcyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei52b3JiaXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA0YzVmOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei52b3JiaXMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAxZWE0NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLmluZm8KQEAgLTAsMCArMSw2MCBAQAorMTAyNzEgMSAwCisxMDYgMCAxNzAwMAorMTM0IDAgMzMwMDAKKzE0OSAwIDUwMDAwCisxNTIgMCA2NzAwMAorMTU5IDAgODMwMDAKKzExNCAwIDEwMDAwMAorNzIzIDAgMTE3MDAwCisxNzUgMCAxMzMwMDAKKzE4NiAwIDE1MDAwMAorMjAxIDAgMTY3MDAwCisyNzAgMCAxODMwMDAKKzM4MyAwIDIwMDAwMAorMjU1IDAgMjE3MDAwCisyODYgMCAyMzMwMDAKKzI3MyAwIDI1MDAwMAorMTIyNCAwIDI2NzAwMAorMjIwIDAgMjgzMDAwCisyMzEgMCAzMDAwMDAKKzE5MiAwIDMxNzAwMAorMTgyIDAgMzMzMDAwCisyODkgMCAzNTAwMDAKKzIwNCAwIDM2NzAwMAorMjM3IDAgMzgzMDAwCisxODcgMCA0MDAwMDAKKzg5OCAwIDQxNzAwMAorMjMxIDAgNDMzMDAwCisyNjYgMCA0NTAwMDAKKzI3OCAwIDQ2NzAwMAorMjA1IDAgNDgzMDAwCisyNTUgMCA1MDAwMDAKKzE2OSAwIDUxNzAwMAorMjMzIDAgNTMzMDAwCisxMDExIDAgNTUwMDAwCisyMDIgMCA1NjcwMDAKKzI1MSAwIDU4MzAwMAorMjIzIDAgNjAwMDAwCisyODMgMCA2MTcwMDAKKzM2MiAwIDYzMzAwMAorMjE3IDAgNjUwMDAwCisyNDUgMCA2NjcwMDAKKzk2MCAwIDY4MzAwMAorMjMzIDAgNzAwMDAwCisyODYgMCA3MTcwMDAKKzI3MiAwIDczMzAwMAorMjU0IDAgNzUwMDAwCiszMzEgMCA3NjcwMDAKKzIxOCAwIDc4MzAwMAorMjYxIDAgODAwMDAwCis5ODEgMCA4MTcwMDAKKzIyNiAwIDgzMzAwMAorMjI2IDAgODUwMDAwCisyNzkgMCA4NjcwMDAKKzIyNSAwIDg4MzAwMAorMjk1IDAgOTAwMDAwCisxNzUgMCA5MTcwMDAKKzI0OSAwIDkzMzAwMAorOTk2IDAgOTUwMDAwCisxNjkgMCA5NjcwMDAKKzIyNCAwIDk4MzAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMudnA4IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMudnA4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYmE1NmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy52cDgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3ZwOF82NDB4MzYwXzJtYnBzXzMwZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzAwYzc3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3ZwOF82NDB4MzYwXzJtYnBzXzMwZnBzLmluZm8KQEAgLTAsMCArMSwzMDAgQEAKKzg2OTgwIDEgMAorNjc0MSAwIDMzMDAwCis5NDMzIDAgNjcwMDAKKzkzNjMgMCAxMDAwMDAKKzg2NzEgMCAxMzMwMDAKKzkwMDMgMCAxNjcwMDAKKzc3NTEgMCAyMDAwMDAKKzEzMjA3IDAgMjMzMDAwCis4NTQyIDAgMjY3MDAwCis5MzQ0IDAgMzAwMDAwCis4MDY5IDAgMzMzMDAwCis4NTg4IDAgMzY3MDAwCisxMjA4NyAwIDQwMDAwMAorNzMxNSAwIDQzMzAwMAorOTY1NCAwIDQ2NzAwMAorMTMxMDAgMCA1MDAwMDAKKzc4MzIgMCA1MzMwMDAKKzEwMDYwIDAgNTY3MDAwCis4NTQwIDAgNjAwMDAwCis4NjY3IDAgNjMzMDAwCis4NTMyIDAgNjY3MDAwCis2MDE4IDAgNzAwMDAwCis4NTIwIDAgNzMzMDAwCisxNTM1MCAwIDc2NzAwMAorNjExMCAwIDgwMDAwMAorNzg3NiAwIDgzMzAwMAorNjEzMyAwIDg2NzAwMAorOTQ3NiAwIDkwMDAwMAorMTEwMDIgMCA5MzMwMDAKKzc0ODQgMCA5NjcwMDAKKzg3NjAgMCAxMDAwMDAwCisxNjUxNSAwIDEwMzMwMDAKKzc0ODIgMCAxMDY3MDAwCis2OTgzIDAgMTEwMDAwMAorNzU2MSAwIDExMzMwMDAKKzgyNjMgMCAxMTY3MDAwCisxMDY4MiAwIDEyMDAwMDAKKzgxMDggMCAxMjMzMDAwCis3OTI0IDAgMTI2NzAwMAorODY5MyAwIDEzMDAwMDAKKzE0MTkwIDAgMTMzMzAwMAorNzM5MyAwIDEzNjcwMDAKKzY4NjQgMCAxNDAwMDAwCis5NDMxIDAgMTQzMzAwMAorNzY3NCAwIDE0NjcwMDAKKzg0NTggMCAxNTAwMDAwCis1ODk5IDAgMTUzMzAwMAorODI1OSAwIDE1NjcwMDAKKzc5NjMgMCAxNjAwMDAwCisxNDc3OSAwIDE2MzMwMDAKKzY4NzcgMCAxNjY3MDAwCis3MjY4IDAgMTcwMDAwMAorODUyNiAwIDE3MzMwMDAKKzg0NjcgMCAxNzY3MDAwCisxMTIwMCAwIDE4MDAwMDAKKzcyNjEgMCAxODMzMDAwCis4MjgwIDAgMTg2NzAwMAorNjcxOCAwIDE5MDAwMDAKKzE3NzQyIDAgMTkzMzAwMAorNTIwNiAwIDE5NjcwMDAKKzU3MDAgMCAyMDAwMDAwCis1ODcyIDAgMjAzMzAwMAorNzkxNSAwIDIwNjcwMDAKKzg0OTMgMCAyMTAwMDAwCis2NTQ1IDAgMjEzMzAwMAorOTA3MiAwIDIxNjcwMDAKKzEzMjAwIDAgMjIwMDAwMAorOTYzMiAwIDIyMzMwMDAKKzEwMDE2IDAgMjI2NzAwMAorNzgyNCAwIDIzMDAwMDAKKzEwNjI4IDAgMjMzMzAwMAorMTA0MDEgMCAyMzY3MDAwCisxMDg5MiAwIDI0MDAwMDAKKzkwMjMgMCAyNDMzMDAwCisxMDczNCAwIDI0NjcwMDAKKzE1MDQ1IDAgMjUwMDAwMAorNzk0MCAwIDI1MzMwMDAKKzk2NTcgMCAyNTY3MDAwCis4NzQzIDAgMjYwMDAwMAorODA3NCAwIDI2MzMwMDAKKzk0NDUgMCAyNjY3MDAwCis2NDk0IDAgMjcwMDAwMAorODYwMSAwIDI3MzMwMDAKKzEzNDc4IDAgMjc2NzAwMAorNjk0MiAwIDI4MDAwMDAKKzgwMDIgMCAyODMzMDAwCis3OTQwIDAgMjg2NzAwMAorODMyMCAwIDI5MDAwMDAKKzEyMjE1IDAgMjkzMzAwMAorNjY2OCAwIDI5NjcwMDAKKzExMzg0IDAgMzAwMDAwMAorODM3OCAwIDMwMzMwMDAKKzEyOTA4IDAgMzA2NzAwMAorODQyMCAwIDMxMDAwMDAKKzc1MDIgMCAzMTMzMDAwCis4NDgyIDAgMzE2NzAwMAorMTA5NjggMCAzMjAwMDAwCisxMjMzOCAwIDMyMzMwMDAKKzg2NTcgMCAzMjY3MDAwCisxMDQ2OCAwIDMzMDAwMDAKKzEzODc4IDAgMzMzMzAwMAorOTM3NCAwIDMzNjcwMDAKKzk4NTcgMCAzNDAwMDAwCisxMDM4MSAwIDM0MzMwMDAKKzk5ODQgMCAzNDY3MDAwCis5OTU2IDAgMzUwMDAwMAorODkwNSAwIDM1MzMwMDAKKzg2NzIgMCAzNTY3MDAwCis4MTIyIDAgMzYwMDAwMAorOTY3NyAwIDM2MzMwMDAKKzk4MTIgMCAzNjY3MDAwCis5NjIyIDAgMzcwMDAwMAorOTAyMyAwIDM3MzMwMDAKKzcxNDcgMCAzNzY3MDAwCis5MTQ2IDAgMzgwMDAwMAorNzQ4OCAwIDM4MzMwMDAKKzEwODEyIDAgMzg2NzAwMAorODM0MCAwIDM5MDAwMDAKKzEzMjgwIDAgMzkzMzAwMAorNTE2NyAwIDM5NjcwMDAKKzY5OTEgMCA0MDAwMDAwCis2NTQzIDAgNDAzMzAwMAorNTk1MiAwIDQwNjcwMDAKKzUxNjQgMCA0MTAwMDAwCis0MDExIDAgNDEzMzAwMAorMzc5NCAwIDQxNjcwMDAKKzEyOTU5IDAgNDIwMDAwMAorNzEwMjAgMSA0MjMzMDAwCis1MzUxIDAgNDI2NzAwMAorNjI4MyAwIDQzMDAwMDAKKzUwODAgMCA0MzMzMDAwCis2NzA3IDAgNDM2NzAwMAorNTg1NyAwIDQ0MDAwMDAKKzUyMjEgMCA0NDMzMDAwCisxMDk3MiAwIDQ0NjcwMDAKKzcwMjMgMCA0NTAwMDAwCis2OTA3IDAgNDUzMzAwMAorNzg1MSAwIDQ1NjcwMDAKKzQ4NDMgMCA0NjAwMDAwCis2MDg1IDAgNDYzMzAwMAorNDg2OCAwIDQ2NjcwMDAKKzUwOTMgMCA0NzAwMDAwCisxMjgwNyAwIDQ3MzMwMDAKKzYzMzAgMCA0NzY3MDAwCis0MjA5IDAgNDgwMDAwMAorNDU5NiAwIDQ4MzMwMDAKKzYzMTYgMCA0ODY3MDAwCis0OTU0IDAgNDkwMDAwMAorNTUzMyAwIDQ5MzMwMDAKKzc3NDkgMCA0OTY3MDAwCisxMjQ4NiAwIDUwMDAwMDAKKzU0NjggMCA1MDMzMDAwCis0MzUzIDAgNTA2NzAwMAorNTc4NiAwIDUxMDAwMDAKKzU1NTEgMCA1MTMzMDAwCis2NzExIDAgNTE2NzAwMAorNTY4OCAwIDUyMDAwMDAKKzYyNTggMCA1MjMzMDAwCisxMjk3NSAwIDUyNjcwMDAKKzQ4NzMgMCA1MzAwMDAwCis0NTUyIDAgNTMzMzAwMAorNDg0NCAwIDUzNjcwMDAKKzQ3NzQgMCA1NDAwMDAwCis1MDI1IDAgNTQzMzAwMAorNTIwNCAwIDU0NjcwMDAKKzQ4MTQgMCA1NTAwMDAwCisxNDgzNSAwIDU1MzMwMDAKKzUzNDMgMCA1NTY3MDAwCis0ODA4IDAgNTYwMDAwMAorNTA3MSAwIDU2MzMwMDAKKzYzMjQgMCA1NjY3MDAwCis1MjQzIDAgNTcwMDAwMAorNDk5NSAwIDU3MzMwMDAKKzUxMzQgMCA1NzY3MDAwCisxMTA1NCAwIDU4MDAwMDAKKzQ4MDcgMCA1ODMzMDAwCis1MTE4IDAgNTg2NzAwMAorNjQyNCAwIDU5MDAwMDAKKzQ5ODQgMCA1OTMzMDAwCis3MTg3IDAgNTk2NzAwMAorNTUwNSAwIDYwMDAwMDAKKzY5NDEgMCA2MDMzMDAwCisxMTUxNyAwIDYwNjcwMDAKKzU2NDYgMCA2MTAwMDAwCis2ODMyIDAgNjEzMzAwMAorNTI5NCAwIDYxNjcwMDAKKzYyMDAgMCA2MjAwMDAwCis2MzI4IDAgNjIzMzAwMAorNDM0OCAwIDYyNjcwMDAKKzQ2MDcgMCA2MzAwMDAwCisxMjk1OCAwIDYzMzMwMDAKKzQzMDggMCA2MzY3MDAwCis2MDg0IDAgNjQwMDAwMAorNDQ5NCAwIDY0MzMwMDAKKzUzMzggMCA2NDY3MDAwCis1NzQyIDAgNjUwMDAwMAorNTQ3MiAwIDY1MzMwMDAKKzg0NTkgMCA2NTY3MDAwCisxMzA3NSAwIDY2MDAwMDAKKzg5ODYgMCA2NjMzMDAwCis5NTgzIDAgNjY2NzAwMAorODc5MiAwIDY3MDAwMDAKKzkwMDQgMCA2NzMzMDAwCis5NjMyIDAgNjc2NzAwMAorOTM5MyAwIDY4MDAwMDAKKzkyNTkgMCA2ODMzMDAwCisxMTkyNyAwIDY4NjcwMDAKKzEwMzIzIDAgNjkwMDAwMAorMTUyNDggMCA2OTMzMDAwCisxMTI0NCAwIDY5NjcwMDAKKzE1NTU4IDAgNzAwMDAwMAorNjE5NyAwIDcwMzMwMDAKKzgwNDQgMCA3MDY3MDAwCisxMTQzMiAwIDcxMDAwMDAKKzg3MzcgMCA3MTMzMDAwCisxMzg4NSAwIDcxNjcwMDAKKzExMTU4IDAgNzIwMDAwMAorMTUxNTIgMCA3MjMzMDAwCis3MDI1IDAgNzI2NzAwMAorODAyNSAwIDczMDAwMDAKKzEzMzYyIDAgNzMzMzAwMAorODA5MCAwIDczNjcwMDAKKzEzNjM3IDAgNzQwMDAwMAorNjE0OCAwIDc0MzMwMDAKKzkyNzAgMCA3NDY3MDAwCis4NjMzIDAgNzUwMDAwMAorMTA2NzMgMCA3NTMzMDAwCisxNDIwOCAwIDc1NjcwMDAKKzgwODQgMCA3NjAwMDAwCisxMzc4MyAwIDc2MzMwMDAKKzEwNjYwIDAgNzY2NzAwMAorNzQ2NiAwIDc3MDAwMDAKKzE0NDMzIDAgNzczMzAwMAorMTA5MzQgMCA3NzY3MDAwCis3MjM5IDAgNzgwMDAwMAorMTI1NDggMCA3ODMzMDAwCis2NTY0IDAgNzg2NzAwMAorMTA3NjEgMCA3OTAwMDAwCisxMDk5MiAwIDc5MzMwMDAKKzEyOTI0IDAgNzk2NzAwMAorMTIzNDggMCA4MDAwMDAwCis2NzcwIDAgODAzMzAwMAorMTQyODggMCA4MDY3MDAwCisyOTM0NSAxIDgxMDAwMDAKKzE4MjIgMCA4MTMzMDAwCisxMDg3IDAgODE2NzAwMAorMTEwOSAwIDgyMDAwMDAKKzIwMDcgMCA4MjMzMDAwCisxNzk4IDAgODI2NzAwMAorMTYzNSAwIDgzMDAwMDAKKzE5NjA3IDAgODMzMzAwMAorOTE5IDAgODM2NzAwMAorMjM1NyAwIDg0MDAwMDAKKzM1NzggMCA4NDMzMDAwCis0NDk3IDAgODQ2NzAwMAorNDMxNCAwIDg1MDAwMDAKKzM4NTEgMCA4NTMzMDAwCiszODIyIDAgODU2NzAwMAorNDI1MiAwIDg2MDAwMDAKKzQ3NzUgMCA4NjMzMDAwCisxMjIwMyAwIDg2NjcwMDAKKzUwNzggMCA4NzAwMDAwCis1ODc2IDAgODczMzAwMAorNjEyNCAwIDg3NjcwMDAKKzQ0OTAgMCA4ODAwMDAwCiszNTM4IDAgODgzMzAwMAorMzQ1MCAwIDg4NjcwMDAKKzM2MTEgMCA4OTAwMDAwCisyODQ3IDAgODkzMzAwMAorMjYwNSAwIDg5NjcwMDAKKzEyMjQzIDAgOTAwMDAwMAorMTk0NiAwIDkwMzMwMDAKKzE4NDcgMCA5MDY3MDAwCisyMDM1IDAgOTEwMDAwMAorMjU3MiAwIDkxMzMwMDAKKzIzMjYgMCA5MTY3MDAwCisyNjQ1IDAgOTIwMDAwMAorMjkzOCAwIDkyMzMwMDAKKzI0OTUgMCA5MjY3MDAwCisyNjA5IDAgOTMwMDAwMAorOTc0NCAwIDkzMzMwMDAKKzE3OTYgMCA5MzY3MDAwCisxOTg1IDAgOTQwMDAwMAorMTc1OSAwIDk0MzMwMDAKKzIyNTkgMCA5NDY3MDAwCisyMjMzIDAgOTUwMDAwMAorMjA0NCAwIDk1MzMwMDAKKzI1MDIgMCA5NTY3MDAwCisyMzA3IDAgOTYwMDAwMAorMjczOSAwIDk2MzMwMDAKKzExNzA3IDAgOTY2NzAwMAorNTE2OCAwIDk3MDAwMDAKKzQ0ODMgMCA5NzMzMDAwCiszMDQ0IDAgOTc2NzAwMAorNDI0MSAwIDk4MDAwMDAKKzQzOTIgMCA5ODMzMDAwCis0OTM0IDAgOTg2NzAwMAorNTkzNCAwIDk5MDAwMDAKKzU2NDcgMCA5OTMzMDAwCis1MzI2IDAgOTk2NzAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3ZwOF82NDB4MzYwXzJtYnBzXzMwZnBzLnZwOCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl92cDhfNjQweDM2MF8ybWJwc18zMGZwcy52cDgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVjNDYwYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl92cDhfNjQweDM2MF8ybWJwc18zMGZwcy52cDgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3ZwOV8xNzZ4MTQ0XzI4NWticHNfNjBmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ExYTAzYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLmluZm8KQEAgLTAsMCArMSw2MCBAQAorNjkzOSAxIDAKKzY4MTggMCAxNzAwMAorMzEwIDAgMzMwMDAKKzI3MyAwIDUwMDAwCisyNjcgMCA2NzAwMAorMjM5IDAgODMwMDAKKzIzMiAwIDEwMDAwMAorMjIyIDAgMTE3MDAwCisxODYgMCAxMzMwMDAKKzE5NCAwIDE1MDAwMAorMTg5IDAgMTY3MDAwCisxOCAwIDE4MzAwMAorMjAxNCAwIDIwMDAwMAorMjk3IDAgMjE3MDAwCisyODcgMCAyMzMwMDAKKzIzNyAwIDI1MDAwMAorMjYzIDAgMjY3MDAwCisyMzggMCAyODMwMDAKKzI1NyAwIDMwMDAwMAorMjI5IDAgMzE3MDAwCisxODcgMCAzMzMwMDAKKzE5MSAwIDM1MDAwMAorMTggMCAzNjcwMDAKKzIyMDMgMCAzODMwMDAKKzI2NSAwIDQwMDAwMAorMjI0IDAgNDE3MDAwCisyNTQgMCA0MzMwMDAKKzI1MiAwIDQ1MDAwMAorMjczIDAgNDY3MDAwCisyMDggMCA0ODMwMDAKKzE1NCAwIDUwMDAwMAorMTgyIDAgNTE3MDAwCisxMzggMCA1MzMwMDAKKzE4IDAgNTUwMDAwCisyNTAyIDAgNTY3MDAwCisyODYgMCA1ODMwMDAKKzMwNCAwIDYwMDAwMAorMzQxIDAgNjE3MDAwCisyNTkgMCA2MzMwMDAKKzI3NSAwIDY1MDAwMAorMjIyIDAgNjY3MDAwCisyNTQgMCA2ODMwMDAKKzI1MyAwIDcwMDAwMAorMjI1IDAgNzE3MDAwCisxOCAwIDczMzAwMAorMjUwMSAwIDc1MDAwMAorMjgyIDAgNzY3MDAwCisyOTggMCA3ODMwMDAKKzI1MiAwIDgwMDAwMAorMjQyIDAgODE3MDAwCisyNTAgMCA4MzMwMDAKKzI2MCAwIDg1MDAwMAorMjE4IDAgODY3MDAwCisyMTMgMCA4ODMwMDAKKzE0NCAwIDkwMDAwMAorMTggMCA5MTcwMDAKKzIzMyAwIDkzMzAwMAorMjU0IDAgOTUwMDAwCisyMjkgMCA5NjcwMDAKKzIzOSAwIDk4MzAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3ZwOV8xNzZ4MTQ0XzI4NWticHNfNjBmcHMudnA5IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3ZwOV8xNzZ4MTQ0XzI4NWticHNfNjBmcHMudnA5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MzNjOGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy52cDkKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmU5Njc5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmluZm8KQEAgLTAsMCArMSwzMDAgQEAKKzU0OTE4IDEgMAorNDYyODAgMCAzMzAwMAorMjAwNiAwIDY3MDAwCisyODQxIDAgMTAwMDAwCiszMDQ0IDAgMTMzMDAwCiszNDI5IDAgMTY3MDAwCiszMTk2IDAgMjAwMDAwCisyOTI2IDAgMjMzMDAwCisyODIxIDAgMjY3MDAwCisxMTUwIDAgMzAwMDAwCiszNiAwIDMzMzAwMAorMzgwODQgMCAzNjcwMDAKKzM2ODkgMCA0MDAwMDAKKzM0NzMgMCA0MzMwMDAKKzMwMTEgMCA0NjcwMDAKKzMwOTAgMCA1MDAwMDAKKzI1MTYgMCA1MzMwMDAKKzI3NzEgMCA1NjcwMDAKKzMyNTAgMCA2MDAwMDAKKzExNTkgMCA2MzMwMDAKKzM0IDAgNjY3MDAwCiszOTY5MCAwIDcwMDAwMAorMzYxNSAwIDczMzAwMAorMjQ5NCAwIDc2NzAwMAorMjg5MyAwIDgwMDAwMAorMzMyOSAwIDgzMzAwMAorMjkzOSAwIDg2NzAwMAorMjM1MiAwIDkwMDAwMAorMjczMiAwIDkzMzAwMAorMTc0NiAwIDk2NzAwMAorMzMgMCAxMDAwMDAwCis0MTUwMSAwIDEwMzMwMDAKKzI5OTcgMCAxMDY3MDAwCisyNjY2IDAgMTEwMDAwMAorMzU4MiAwIDExMzMwMDAKKzI2MTYgMCAxMTY3MDAwCisyOTIzIDAgMTIwMDAwMAorMjY5NiAwIDEyMzMwMDAKKzE2MjggMCAxMjY3MDAwCisxODg3IDAgMTMwMDAwMAorMzMgMCAxMzMzMDAwCis0Mjg3NiAwIDEzNjcwMDAKKzI1ODggMCAxNDAwMDAwCiszMzE2IDAgMTQzMzAwMAorMjI4NyAwIDE0NjcwMDAKKzMzNzUgMCAxNTAwMDAwCisyMTA4IDAgMTUzMzAwMAorMjk2MSAwIDE1NjcwMDAKKzE3MzAgMCAxNjAwMDAwCisxODAwIDAgMTYzMzAwMAorMzQgMCAxNjY3MDAwCis0Mzc5NyAwIDE3MDAwMDAKKzI0ODQgMCAxNzMzMDAwCisyNTU2IDAgMTc2NzAwMAorMjY3MSAwIDE4MDAwMDAKKzIzMzggMCAxODMzMDAwCiszMTMzIDAgMTg2NzAwMAorMjAwMiAwIDE5MDAwMDAKKzE3OTQgMCAxOTMzMDAwCisxMjc5IDAgMTk2NzAwMAorMzIgMCAyMDAwMDAwCis0MjY0MiAwIDIwMzMwMDAKKzI2ODYgMCAyMDY3MDAwCisyMjAyIDAgMjEwMDAwMAorMjE0NSAwIDIxMzMwMDAKKzI1NjYgMCAyMTY3MDAwCisyMTkwIDAgMjIwMDAwMAorMTU4MCAwIDIyMzMwMDAKKzE3MTEgMCAyMjY3MDAwCis2NDggMCAyMzAwMDAwCiszMiAwIDIzMzMwMDAKKzQwNDA5IDAgMjM2NzAwMAorMjYyOCAwIDI0MDAwMDAKKzE5NzMgMCAyNDMzMDAwCisyMzYwIDAgMjQ2NzAwMAorMzA0MyAwIDI1MDAwMDAKKzE3MzAgMCAyNTMzMDAwCisxNDU2IDAgMjU2NzAwMAorMjMxMiAwIDI2MDAwMDAKKzM2OSAwIDI2MzMwMDAKKzMyIDAgMjY2NzAwMAorNDEzOTEgMCAyNzAwMDAwCisyOTY3IDAgMjczMzAwMAorMjQ1NCAwIDI3NjcwMDAKKzE4MjUgMCAyODAwMDAwCisxODUzIDAgMjgzMzAwMAorMTc0NiAwIDI4NjcwMDAKKzIzNDcgMCAyOTAwMDAwCisxMzYyIDAgMjkzMzAwMAorNDQxIDAgMjk2NzAwMAorMzQgMCAzMDAwMDAwCis0MjUwMyAwIDMwMzMwMDAKKzE4NzcgMCAzMDY3MDAwCisxNjkwIDAgMzEwMDAwMAorMTM2NyAwIDMxMzMwMDAKKzE1MjAgMCAzMTY3MDAwCisxMjQwIDAgMzIwMDAwMAorMTA5NCAwIDMyMzMwMDAKKzczOSAwIDMyNjcwMDAKKzM5MiAwIDMzMDAwMDAKKzMzIDAgMzMzMzAwMAorMzUxMDQgMCAzMzY3MDAwCisxNDYzIDAgMzQwMDAwMAorMjAyOSAwIDM0MzMwMDAKKzE2MjYgMCAzNDY3MDAwCisxOTU2IDAgMzUwMDAwMAorNzk5IDAgMzUzMzAwMAorNTU2IDAgMzU2NzAwMAorNTg0IDAgMzYwMDAwMAorMTkxIDAgMzYzMzAwMAorMzYgMCAzNjY3MDAwCiszNzY1MiAwIDM3MDAwMDAKKzg2MiAwIDM3MzMwMDAKKzUyNCAwIDM3NjcwMDAKKzY0MSAwIDM4MDAwMDAKKzU4NCAwIDM4MzMwMDAKKzM2MCAwIDM4NjcwMDAKKzM2NSAwIDM5MDAwMDAKKzM2MSAwIDM5MzMwMDAKKzE1NCAwIDM5NjcwMDAKKzM2IDAgNDAwMDAwMAorMTI1NzQwIDAgNDAzMzAwMAorMzMyIDAgNDA2NzAwMAorMzgxIDAgNDEwMDAwMAorNDIwIDAgNDEzMzAwMAorNDY0IDAgNDE2NzAwMAorMjg4IDAgNDIwMDAwMAorMjY2MCAwIDQyMzMwMDAKKzEyNzU2NCAxIDQyNjcwMDAKKzMwNjk2IDAgNDMwMDAwMAorMzQyMyAwIDQzMzMwMDAKKzMzMTAgMCA0MzY3MDAwCiszNTEzIDAgNDQwMDAwMAorMzczNSAwIDQ0MzMwMDAKKzMzNTggMCA0NDY3MDAwCiszMTA4IDAgNDUwMDAwMAorMjgwMCAwIDQ1MzMwMDAKKzE3NTEgMCA0NTY3MDAwCis0MSAwIDQ2MDAwMDAKKzM5ODYyIDAgNDYzMzAwMAorMzczOSAwIDQ2NjcwMDAKKzM3NTUgMCA0NzAwMDAwCiszNDA4IDAgNDczMzAwMAorMzc4MyAwIDQ3NjcwMDAKKzM0MjMgMCA0ODAwMDAwCisyODAxIDAgNDgzMzAwMAorMjU0OSAwIDQ4NjcwMDAKKzE0NjEgMCA0OTAwMDAwCis0MCAwIDQ5MzMwMDAKKzQxNjY3IDAgNDk2NzAwMAorMzYyMyAwIDUwMDAwMDAKKzMzNTYgMCA1MDMzMDAwCiszNDI0IDAgNTA2NzAwMAorMzU0OCAwIDUxMDAwMDAKKzMxMTkgMCA1MTMzMDAwCisyOTA1IDAgNTE2NzAwMAorMjc3MiAwIDUyMDAwMDAKKzE2MjMgMCA1MjMzMDAwCis0MyAwIDUyNjcwMDAKKzQ2NzgzIDAgNTMwMDAwMAorMzQ2MiAwIDUzMzMwMDAKKzM0NzAgMCA1MzY3MDAwCiszNjc3IDAgNTQwMDAwMAorMzY4NCAwIDU0MzMwMDAKKzMyNjYgMCA1NDY3MDAwCiszMTI3IDAgNTUwMDAwMAorMjgwOSAwIDU1MzMwMDAKKzE3NTAgMCA1NTY3MDAwCis0MCAwIDU2MDAwMDAKKzQ2MjE1IDAgNTYzMzAwMAorMzU5OSAwIDU2NjcwMDAKKzM1NTggMCA1NzAwMDAwCiszNTQ0IDAgNTczMzAwMAorMzYzMiAwIDU3NjcwMDAKKzM1NDggMCA1ODAwMDAwCisyOTY4IDAgNTgzMzAwMAorMjcxNSAwIDU4NjcwMDAKKzE3MjkgMCA1OTAwMDAwCis0MSAwIDU5MzMwMDAKKzQ1OTU4IDAgNTk2NzAwMAorMzc3NiAwIDYwMDAwMDAKKzM1MjUgMCA2MDMzMDAwCiszNjQ0IDAgNjA2NzAwMAorMzc4NiAwIDYxMDAwMDAKKzMyMjIgMCA2MTMzMDAwCisyOTIzIDAgNjE2NzAwMAorMjc1MiAwIDYyMDAwMDAKKzE1OTIgMCA2MjMzMDAwCis0MSAwIDYyNjcwMDAKKzQ2MDMxIDAgNjMwMDAwMAorMzUyMCAwIDYzMzMwMDAKKzMzODAgMCA2MzY3MDAwCiszMzcxIDAgNjQwMDAwMAorMzQyNyAwIDY0MzMwMDAKKzMxMzUgMCA2NDY3MDAwCisyOTg4IDAgNjUwMDAwMAorMjczMCAwIDY1MzMwMDAKKzE2NzEgMCA2NTY3MDAwCis0MSAwIDY2MDAwMDAKKzQ1ODQ2IDAgNjYzMzAwMAorMzUzNSAwIDY2NjcwMDAKKzM1MDcgMCA2NzAwMDAwCiszNDI5IDAgNjczMzAwMAorMzQ5MSAwIDY3NjcwMDAKKzMzMjUgMCA2ODAwMDAwCisyOTc5IDAgNjgzMzAwMAorMjgwMCAwIDY4NjcwMDAKKzE2MTAgMCA2OTAwMDAwCis0MCAwIDY5MzMwMDAKKzQ1OTU4IDAgNjk2NzAwMAorMzc2MiAwIDcwMDAwMDAKKzMyNTQgMCA3MDMzMDAwCiszNDA4IDAgNzA2NzAwMAorMzg2MCAwIDcxMDAwMDAKKzMxOTggMCA3MTMzMDAwCisyOTY2IDAgNzE2NzAwMAorMjg4MiAwIDcyMDAwMDAKKzE3NjMgMCA3MjMzMDAwCis0MiAwIDcyNjcwMDAKKzQ2MTMwIDAgNzMwMDAwMAorMzU5MyAwIDczMzMwMDAKKzM1MjMgMCA3MzY3MDAwCiszOTM5IDAgNzQwMDAwMAorMzk4MCAwIDc0MzMwMDAKKzM0NzAgMCA3NDY3MDAwCiszMTkxIDAgNzUwMDAwMAorMjk2OSAwIDc1MzMwMDAKKzE3NDAgMCA3NTY3MDAwCis0MSAwIDc2MDAwMDAKKzQ2MzAwIDAgNzYzMzAwMAorMzczOSAwIDc2NjcwMDAKKzM3ODEgMCA3NzAwMDAwCiszOTY0IDAgNzczMzAwMAorNDAyMyAwIDc3NjcwMDAKKzM0ODAgMCA3ODAwMDAwCiszMDY1IDAgNzgzMzAwMAorMjkzNCAwIDc4NjcwMDAKKzE4MDUgMCA3OTAwMDAwCis0MiAwIDc5MzMwMDAKKzM4MTY2IDAgNzk2NzAwMAorNDA2MiAwIDgwMDAwMDAKKzM4NDQgMCA4MDMzMDAwCis0NTQ3IDAgODA2NzAwMAorOTM0IDAgODEwMDAwMAorMzY1IDAgODEzMzAwMAorMTgxIDAgODE2NzAwMAorNDYzIDAgODIwMDAwMAorNDE5IDAgODIzMzAwMAorMzggMCA4MjY3MDAwCis5NzAyIDAgODMwMDAwMAorMzQ0IDAgODMzMzAwMAorMjc2IDAgODM2NzAwMAorMTM1MCAwIDg0MDAwMDAKKzE3MDMgMCA4NDMzMDAwCisxODQzIDAgODQ2NzAwMAorMTIyOCAwIDg1MDAwMDAKKzM1NTgwIDEgODUzMzAwMAorMjc0NTggMCA4NTY3MDAwCisyMTQ0IDAgODYwMDAwMAorMjQ4MiAwIDg2MzMwMDAKKzIwMDQgMCA4NjY3MDAwCisyODIyIDAgODcwMDAwMAorMjU3MCAwIDg3MzMwMDAKKzE3MjYgMCA4NzY3MDAwCisxMjQ4IDAgODgwMDAwMAorODQ0IDAgODgzMzAwMAorMzUgMCA4ODY3MDAwCisxNDIwNyAwIDg5MDAwMDAKKzEwMzcgMCA4OTMzMDAwCis3NDkgMCA4OTY3MDAwCis4MjkgMCA5MDAwMDAwCis5MTUgMCA5MDMzMDAwCis2ODUgMCA5MDY3MDAwCis3NjcgMCA5MTAwMDAwCis3OTggMCA5MTMzMDAwCiszNDIgMCA5MTY3MDAwCiszMSAwIDkyMDAwMDAKKzEyNTkwIDAgOTIzMzAwMAorOTIzIDAgOTI2NzAwMAorODE5IDAgOTMwMDAwMAorNzc2IDAgOTMzMzAwMAorODYzIDAgOTM2NzAwMAorNzI5IDAgOTQwMDAwMAorNDcxIDAgOTQzMzAwMAorNjM4IDAgOTQ2NzAwMAorMjc2IDAgOTUwMDAwMAorMzggMCA5NTMzMDAwCisxNzI3MiAwIDk1NjcwMDAKKzg1NiAwIDk2MDAwMDAKKzExNTggMCA5NjMzMDAwCisyMTcyIDAgOTY2NzAwMAorMjc1MSAwIDk3MDAwMDAKKzIxNDIgMCA5NzMzMDAwCisxMjY3IDAgOTc2NzAwMAorMTk2NSAwIDk4MDAwMDAKKzE1MTAgMCA5ODMzMDAwCiszNCAwIDk4NjcwMDAKKzI2OTIgMCA5OTAwMDAwCisyNzc4IDAgOTkzMzAwMAorMjU4NSAwIDk5NjcwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl92cDlfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy52cDkgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMudnA5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZTIwMDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMudnA5CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL3NpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouYW1ybmIgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9zaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmFtcm5iCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYWYyZTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9zaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmFtcm5iCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL3NpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL3NpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzZlODEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvc2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5pbmZvCkBAIC0wLDAgKzEsODMzIEBACiszMiAxIDAKKzMyIDEgMjAwMDAKKzMyIDEgNDAwMDAKKzMyIDEgNjAwMDAKKzMyIDEgODAwMDAKKzMyIDEgMTAwMDAwCiszMiAxIDEyMDAwMAorMzIgMSAxNDAwMDAKKzMyIDEgMTYwMDAwCiszMiAxIDE4MDAwMAorMzIgMSAyMDAwMDAKKzMyIDEgMjIwMDAwCiszMiAxIDI0MDAwMAorMzIgMSAyNjAwMDAKKzMyIDEgMjgwMDAwCiszMiAxIDMwMDAwMAorMzIgMSAzMjAwMDAKKzMyIDEgMzQwMDAwCiszMiAxIDM2MDAwMAorMzIgMSAzODAwMDAKKzMyIDEgNDAwMDAwCiszMiAxIDQyMDAwMAorMzIgMSA0NDAwMDAKKzMyIDEgNDYwMDAwCiszMiAxIDQ4MDAwMAorMzIgMSA1MDAwMDAKKzMyIDEgNTIwMDAwCiszMiAxIDU0MDAwMAorMzIgMSA1NjAwMDAKKzMyIDEgNTgwMDAwCiszMiAxIDYwMDAwMAorMzIgMSA2MjAwMDAKKzMyIDEgNjQwMDAwCiszMiAxIDY2MDAwMAorMzIgMSA2ODAwMDAKKzMyIDEgNzAwMDAwCiszMiAxIDcyMDAwMAorMzIgMSA3NDAwMDAKKzMyIDEgNzYwMDAwCiszMiAxIDc4MDAwMAorMzIgMSA4MDAwMDAKKzMyIDEgODIwMDAwCiszMiAxIDg0MDAwMAorMzIgMSA4NjAwMDAKKzMyIDEgODgwMDAwCiszMiAxIDkwMDAwMAorMzIgMSA5MjAwMDAKKzMyIDEgOTQwMDAwCiszMiAxIDk2MDAwMAorMzIgMSA5ODAwMDAKKzMyIDEgMTAwMDAwMAorMzIgMSAxMDIwMDAwCiszMiAxIDEwNDAwMDAKKzMyIDEgMTA2MDAwMAorMzIgMSAxMDgwMDAwCiszMiAxIDExMDAwMDAKKzMyIDEgMTEyMDAwMAorMzIgMSAxMTQwMDAwCiszMiAxIDExNjAwMDAKKzMyIDEgMTE4MDAwMAorMzIgMSAxMjAwMDAwCiszMiAxIDEyMjAwMDAKKzMyIDEgMTI0MDAwMAorMzIgMSAxMjYwMDAwCiszMiAxIDEyODAwMDAKKzMyIDEgMTMwMDAwMAorMzIgMSAxMzIwMDAwCiszMiAxIDEzNDAwMDAKKzMyIDEgMTM2MDAwMAorMzIgMSAxMzgwMDAwCiszMiAxIDE0MDAwMDAKKzMyIDEgMTQyMDAwMAorMzIgMSAxNDQwMDAwCiszMiAxIDE0NjAwMDAKKzMyIDEgMTQ4MDAwMAorMzIgMSAxNTAwMDAwCiszMiAxIDE1MjAwMDAKKzMyIDEgMTU0MDAwMAorMzIgMSAxNTYwMDAwCiszMiAxIDE1ODAwMDAKKzMyIDEgMTYwMDAwMAorMzIgMSAxNjIwMDAwCiszMiAxIDE2NDAwMDAKKzMyIDEgMTY2MDAwMAorMzIgMSAxNjgwMDAwCiszMiAxIDE3MDAwMDAKKzMyIDEgMTcyMDAwMAorMzIgMSAxNzQwMDAwCiszMiAxIDE3NjAwMDAKKzMyIDEgMTc4MDAwMAorMzIgMSAxODAwMDAwCiszMiAxIDE4MjAwMDAKKzMyIDEgMTg0MDAwMAorMzIgMSAxODYwMDAwCiszMiAxIDE4ODAwMDAKKzMyIDEgMTkwMDAwMAorMzIgMSAxOTIwMDAwCiszMiAxIDE5NDAwMDAKKzMyIDEgMTk2MDAwMAorMzIgMSAxOTgwMDAwCiszMiAxIDIwMDAwMDAKKzMyIDEgMjAyMDAwMAorMzIgMSAyMDQwMDAwCiszMiAxIDIwNjAwMDAKKzMyIDEgMjA4MDAwMAorMzIgMSAyMTAwMDAwCiszMiAxIDIxMjAwMDAKKzMyIDEgMjE0MDAwMAorMzIgMSAyMTYwMDAwCiszMiAxIDIxODAwMDAKKzMyIDEgMjIwMDAwMAorMzIgMSAyMjIwMDAwCiszMiAxIDIyNDAwMDAKKzMyIDEgMjI2MDAwMAorMzIgMSAyMjgwMDAwCiszMiAxIDIzMDAwMDAKKzMyIDEgMjMyMDAwMAorMzIgMSAyMzQwMDAwCiszMiAxIDIzNjAwMDAKKzMyIDEgMjM4MDAwMAorMzIgMSAyNDAwMDAwCiszMiAxIDI0MjAwMDAKKzMyIDEgMjQ0MDAwMAorMzIgMSAyNDYwMDAwCiszMiAxIDI0ODAwMDAKKzMyIDEgMjUwMDAwMAorMzIgMSAyNTIwMDAwCiszMiAxIDI1NDAwMDAKKzMyIDEgMjU2MDAwMAorMzIgMSAyNTgwMDAwCiszMiAxIDI2MDAwMDAKKzMyIDEgMjYyMDAwMAorMzIgMSAyNjQwMDAwCiszMiAxIDI2NjAwMDAKKzMyIDEgMjY4MDAwMAorMzIgMSAyNzAwMDAwCiszMiAxIDI3MjAwMDAKKzMyIDEgMjc0MDAwMAorMzIgMSAyNzYwMDAwCiszMiAxIDI3ODAwMDAKKzMyIDEgMjgwMDAwMAorMzIgMSAyODIwMDAwCiszMiAxIDI4NDAwMDAKKzMyIDEgMjg2MDAwMAorMzIgMSAyODgwMDAwCiszMiAxIDI5MDAwMDAKKzMyIDEgMjkyMDAwMAorMzIgMSAyOTQwMDAwCiszMiAxIDI5NjAwMDAKKzMyIDEgMjk4MDAwMAorMzIgMSAzMDAwMDAwCiszMiAxIDMwMjAwMDAKKzMyIDEgMzA0MDAwMAorMzIgMSAzMDYwMDAwCiszMiAxIDMwODAwMDAKKzMyIDEgMzEwMDAwMAorMzIgMSAzMTIwMDAwCiszMiAxIDMxNDAwMDAKKzMyIDEgMzE2MDAwMAorMzIgMSAzMTgwMDAwCiszMiAxIDMyMDAwMDAKKzMyIDEgMzIyMDAwMAorMzIgMSAzMjQwMDAwCiszMiAxIDMyNjAwMDAKKzMyIDEgMzI4MDAwMAorMzIgMSAzMzAwMDAwCiszMiAxIDMzMjAwMDAKKzMyIDEgMzM0MDAwMAorMzIgMSAzMzYwMDAwCiszMiAxIDMzODAwMDAKKzMyIDEgMzQwMDAwMAorMzIgMSAzNDIwMDAwCiszMiAxIDM0NDAwMDAKKzMyIDEgMzQ2MDAwMAorMzIgMSAzNDgwMDAwCiszMiAxIDM1MDAwMDAKKzMyIDEgMzUyMDAwMAorMzIgMSAzNTQwMDAwCiszMiAxIDM1NjAwMDAKKzMyIDEgMzU4MDAwMAorMzIgMSAzNjAwMDAwCiszMiAxIDM2MjAwMDAKKzMyIDEgMzY0MDAwMAorMzIgMSAzNjYwMDAwCiszMiAxIDM2ODAwMDAKKzMyIDEgMzcwMDAwMAorMzIgMSAzNzIwMDAwCiszMiAxIDM3NDAwMDAKKzMyIDEgMzc2MDAwMAorMzIgMSAzNzgwMDAwCiszMiAxIDM4MDAwMDAKKzMyIDEgMzgyMDAwMAorMzIgMSAzODQwMDAwCiszMiAxIDM4NjAwMDAKKzMyIDEgMzg4MDAwMAorMzIgMSAzOTAwMDAwCiszMiAxIDM5MjAwMDAKKzMyIDEgMzk0MDAwMAorMzIgMSAzOTYwMDAwCiszMiAxIDM5ODAwMDAKKzMyIDEgNDAwMDAwMAorMzIgMSA0MDIwMDAwCiszMiAxIDQwNDAwMDAKKzMyIDEgNDA2MDAwMAorMzIgMSA0MDgwMDAwCiszMiAxIDQxMDAwMDAKKzMyIDEgNDEyMDAwMAorMzIgMSA0MTQwMDAwCiszMiAxIDQxNjAwMDAKKzMyIDEgNDE4MDAwMAorMzIgMSA0MjAwMDAwCiszMiAxIDQyMjAwMDAKKzMyIDEgNDI0MDAwMAorMzIgMSA0MjYwMDAwCiszMiAxIDQyODAwMDAKKzMyIDEgNDMwMDAwMAorMzIgMSA0MzIwMDAwCiszMiAxIDQzNDAwMDAKKzMyIDEgNDM2MDAwMAorMzIgMSA0MzgwMDAwCiszMiAxIDQ0MDAwMDAKKzMyIDEgNDQyMDAwMAorMzIgMSA0NDQwMDAwCiszMiAxIDQ0NjAwMDAKKzMyIDEgNDQ4MDAwMAorMzIgMSA0NTAwMDAwCiszMiAxIDQ1MjAwMDAKKzMyIDEgNDU0MDAwMAorMzIgMSA0NTYwMDAwCiszMiAxIDQ1ODAwMDAKKzMyIDEgNDYwMDAwMAorMzIgMSA0NjIwMDAwCiszMiAxIDQ2NDAwMDAKKzMyIDEgNDY2MDAwMAorMzIgMSA0NjgwMDAwCiszMiAxIDQ3MDAwMDAKKzMyIDEgNDcyMDAwMAorMzIgMSA0NzQwMDAwCiszMiAxIDQ3NjAwMDAKKzMyIDEgNDc4MDAwMAorMzIgMSA0ODAwMDAwCiszMiAxIDQ4MjAwMDAKKzMyIDEgNDg0MDAwMAorMzIgMSA0ODYwMDAwCiszMiAxIDQ4ODAwMDAKKzMyIDEgNDkwMDAwMAorMzIgMSA0OTIwMDAwCiszMiAxIDQ5NDAwMDAKKzMyIDEgNDk2MDAwMAorMzIgMSA0OTgwMDAwCiszMiAxIDUwMDAwMDAKKzMyIDEgNTAyMDAwMAorMzIgMSA1MDQwMDAwCiszMiAxIDUwNjAwMDAKKzMyIDEgNTA4MDAwMAorMzIgMSA1MTAwMDAwCiszMiAxIDUxMjAwMDAKKzMyIDEgNTE0MDAwMAorMzIgMSA1MTYwMDAwCiszMiAxIDUxODAwMDAKKzMyIDEgNTIwMDAwMAorMzIgMSA1MjIwMDAwCiszMiAxIDUyNDAwMDAKKzMyIDEgNTI2MDAwMAorMzIgMSA1MjgwMDAwCiszMiAxIDUzMDAwMDAKKzMyIDEgNTMyMDAwMAorMzIgMSA1MzQwMDAwCiszMiAxIDUzNjAwMDAKKzMyIDEgNTM4MDAwMAorMzIgMSA1NDAwMDAwCiszMiAxIDU0MjAwMDAKKzMyIDEgNTQ0MDAwMAorMzIgMSA1NDYwMDAwCiszMiAxIDU0ODAwMDAKKzMyIDEgNTUwMDAwMAorMzIgMSA1NTIwMDAwCiszMiAxIDU1NDAwMDAKKzMyIDEgNTU2MDAwMAorMzIgMSA1NTgwMDAwCiszMiAxIDU2MDAwMDAKKzMyIDEgNTYyMDAwMAorMzIgMSA1NjQwMDAwCiszMiAxIDU2NjAwMDAKKzMyIDEgNTY4MDAwMAorMzIgMSA1NzAwMDAwCiszMiAxIDU3MjAwMDAKKzMyIDEgNTc0MDAwMAorMzIgMSA1NzYwMDAwCiszMiAxIDU3ODAwMDAKKzMyIDEgNTgwMDAwMAorMzIgMSA1ODIwMDAwCiszMiAxIDU4NDAwMDAKKzMyIDEgNTg2MDAwMAorMzIgMSA1ODgwMDAwCiszMiAxIDU5MDAwMDAKKzMyIDEgNTkyMDAwMAorMzIgMSA1OTQwMDAwCiszMiAxIDU5NjAwMDAKKzMyIDEgNTk4MDAwMAorMzIgMSA2MDAwMDAwCiszMiAxIDYwMjAwMDAKKzMyIDEgNjA0MDAwMAorMzIgMSA2MDYwMDAwCiszMiAxIDYwODAwMDAKKzMyIDEgNjEwMDAwMAorMzIgMSA2MTIwMDAwCiszMiAxIDYxNDAwMDAKKzMyIDEgNjE2MDAwMAorMzIgMSA2MTgwMDAwCiszMiAxIDYyMDAwMDAKKzMyIDEgNjIyMDAwMAorMzIgMSA2MjQwMDAwCiszMiAxIDYyNjAwMDAKKzMyIDEgNjI4MDAwMAorMzIgMSA2MzAwMDAwCiszMiAxIDYzMjAwMDAKKzMyIDEgNjM0MDAwMAorMzIgMSA2MzYwMDAwCiszMiAxIDYzODAwMDAKKzMyIDEgNjQwMDAwMAorMzIgMSA2NDIwMDAwCiszMiAxIDY0NDAwMDAKKzMyIDEgNjQ2MDAwMAorMzIgMSA2NDgwMDAwCiszMiAxIDY1MDAwMDAKKzMyIDEgNjUyMDAwMAorMzIgMSA2NTQwMDAwCiszMiAxIDY1NjAwMDAKKzMyIDEgNjU4MDAwMAorMzIgMSA2NjAwMDAwCiszMiAxIDY2MjAwMDAKKzMyIDEgNjY0MDAwMAorMzIgMSA2NjYwMDAwCiszMiAxIDY2ODAwMDAKKzMyIDEgNjcwMDAwMAorMzIgMSA2NzIwMDAwCiszMiAxIDY3NDAwMDAKKzMyIDEgNjc2MDAwMAorMzIgMSA2NzgwMDAwCiszMiAxIDY4MDAwMDAKKzMyIDEgNjgyMDAwMAorMzIgMSA2ODQwMDAwCiszMiAxIDY4NjAwMDAKKzMyIDEgNjg4MDAwMAorMzIgMSA2OTAwMDAwCiszMiAxIDY5MjAwMDAKKzMyIDEgNjk0MDAwMAorMzIgMSA2OTYwMDAwCiszMiAxIDY5ODAwMDAKKzMyIDEgNzAwMDAwMAorMzIgMSA3MDIwMDAwCiszMiAxIDcwNDAwMDAKKzMyIDEgNzA2MDAwMAorMzIgMSA3MDgwMDAwCiszMiAxIDcxMDAwMDAKKzMyIDEgNzEyMDAwMAorMzIgMSA3MTQwMDAwCiszMiAxIDcxNjAwMDAKKzMyIDEgNzE4MDAwMAorMzIgMSA3MjAwMDAwCiszMiAxIDcyMjAwMDAKKzMyIDEgNzI0MDAwMAorMzIgMSA3MjYwMDAwCiszMiAxIDcyODAwMDAKKzMyIDEgNzMwMDAwMAorMzIgMSA3MzIwMDAwCiszMiAxIDczNDAwMDAKKzMyIDEgNzM2MDAwMAorMzIgMSA3MzgwMDAwCiszMiAxIDc0MDAwMDAKKzMyIDEgNzQyMDAwMAorMzIgMSA3NDQwMDAwCiszMiAxIDc0NjAwMDAKKzMyIDEgNzQ4MDAwMAorMzIgMSA3NTAwMDAwCiszMiAxIDc1MjAwMDAKKzMyIDEgNzU0MDAwMAorMzIgMSA3NTYwMDAwCiszMiAxIDc1ODAwMDAKKzMyIDEgNzYwMDAwMAorMzIgMSA3NjIwMDAwCiszMiAxIDc2NDAwMDAKKzMyIDEgNzY2MDAwMAorMzIgMSA3NjgwMDAwCiszMiAxIDc3MDAwMDAKKzMyIDEgNzcyMDAwMAorMzIgMSA3NzQwMDAwCiszMiAxIDc3NjAwMDAKKzMyIDEgNzc4MDAwMAorMzIgMSA3ODAwMDAwCiszMiAxIDc4MjAwMDAKKzMyIDEgNzg0MDAwMAorMzIgMSA3ODYwMDAwCiszMiAxIDc4ODAwMDAKKzMyIDEgNzkwMDAwMAorMzIgMSA3OTIwMDAwCiszMiAxIDc5NDAwMDAKKzMyIDEgNzk2MDAwMAorMzIgMSA3OTgwMDAwCiszMiAxIDgwMDAwMDAKKzMyIDEgODAyMDAwMAorMzIgMSA4MDQwMDAwCiszMiAxIDgwNjAwMDAKKzMyIDEgODA4MDAwMAorMzIgMSA4MTAwMDAwCiszMiAxIDgxMjAwMDAKKzMyIDEgODE0MDAwMAorMzIgMSA4MTYwMDAwCiszMiAxIDgxODAwMDAKKzMyIDEgODIwMDAwMAorMzIgMSA4MjIwMDAwCiszMiAxIDgyNDAwMDAKKzMyIDEgODI2MDAwMAorMzIgMSA4MjgwMDAwCiszMiAxIDgzMDAwMDAKKzMyIDEgODMyMDAwMAorMzIgMSA4MzQwMDAwCiszMiAxIDgzNjAwMDAKKzMyIDEgODM4MDAwMAorMzIgMSA4NDAwMDAwCiszMiAxIDg0MjAwMDAKKzMyIDEgODQ0MDAwMAorMzIgMSA4NDYwMDAwCiszMiAxIDg0ODAwMDAKKzMyIDEgODUwMDAwMAorMzIgMSA4NTIwMDAwCiszMiAxIDg1NDAwMDAKKzMyIDEgODU2MDAwMAorMzIgMSA4NTgwMDAwCiszMiAxIDg2MDAwMDAKKzMyIDEgODYyMDAwMAorMzIgMSA4NjQwMDAwCiszMiAxIDg2NjAwMDAKKzMyIDEgODY4MDAwMAorMzIgMSA4NzAwMDAwCiszMiAxIDg3MjAwMDAKKzMyIDEgODc0MDAwMAorMzIgMSA4NzYwMDAwCiszMiAxIDg3ODAwMDAKKzMyIDEgODgwMDAwMAorMzIgMSA4ODIwMDAwCiszMiAxIDg4NDAwMDAKKzMyIDEgODg2MDAwMAorMzIgMSA4ODgwMDAwCiszMiAxIDg5MDAwMDAKKzMyIDEgODkyMDAwMAorMzIgMSA4OTQwMDAwCiszMiAxIDg5NjAwMDAKKzMyIDEgODk4MDAwMAorMzIgMSA5MDAwMDAwCiszMiAxIDkwMjAwMDAKKzMyIDEgOTA0MDAwMAorMzIgMSA5MDYwMDAwCiszMiAxIDkwODAwMDAKKzMyIDEgOTEwMDAwMAorMzIgMSA5MTIwMDAwCiszMiAxIDkxNDAwMDAKKzMyIDEgOTE2MDAwMAorMzIgMSA5MTgwMDAwCiszMiAxIDkyMDAwMDAKKzMyIDEgOTIyMDAwMAorMzIgMSA5MjQwMDAwCiszMiAxIDkyNjAwMDAKKzMyIDEgOTI4MDAwMAorMzIgMSA5MzAwMDAwCiszMiAxIDkzMjAwMDAKKzMyIDEgOTM0MDAwMAorMzIgMSA5MzYwMDAwCiszMiAxIDkzODAwMDAKKzMyIDEgOTQwMDAwMAorMzIgMSA5NDIwMDAwCiszMiAxIDk0NDAwMDAKKzMyIDEgOTQ2MDAwMAorMzIgMSA5NDgwMDAwCiszMiAxIDk1MDAwMDAKKzMyIDEgOTUyMDAwMAorMzIgMSA5NTQwMDAwCiszMiAxIDk1NjAwMDAKKzMyIDEgOTU4MDAwMAorMzIgMSA5NjAwMDAwCiszMiAxIDk2MjAwMDAKKzMyIDEgOTY0MDAwMAorMzIgMSA5NjYwMDAwCiszMiAxIDk2ODAwMDAKKzMyIDEgOTcwMDAwMAorMzIgMSA5NzIwMDAwCiszMiAxIDk3NDAwMDAKKzMyIDEgOTc2MDAwMAorMzIgMSA5NzgwMDAwCiszMiAxIDk4MDAwMDAKKzMyIDEgOTgyMDAwMAorMzIgMSA5ODQwMDAwCiszMiAxIDk4NjAwMDAKKzMyIDEgOTg4MDAwMAorMzIgMSA5OTAwMDAwCiszMiAxIDk5MjAwMDAKKzMyIDEgOTk0MDAwMAorMzIgMSA5OTYwMDAwCiszMiAxIDk5ODAwMDAKKzMyIDEgMTAwMDAwMDAKKzMyIDEgMTAwMjAwMDAKKzMyIDEgMTAwNDAwMDAKKzMyIDEgMTAwNjAwMDAKKzMyIDEgMTAwODAwMDAKKzMyIDEgMTAxMDAwMDAKKzMyIDEgMTAxMjAwMDAKKzMyIDEgMTAxNDAwMDAKKzMyIDEgMTAxNjAwMDAKKzMyIDEgMTAxODAwMDAKKzMyIDEgMTAyMDAwMDAKKzMyIDEgMTAyMjAwMDAKKzMyIDEgMTAyNDAwMDAKKzMyIDEgMTAyNjAwMDAKKzMyIDEgMTAyODAwMDAKKzMyIDEgMTAzMDAwMDAKKzMyIDEgMTAzMjAwMDAKKzMyIDEgMTAzNDAwMDAKKzMyIDEgMTAzNjAwMDAKKzMyIDEgMTAzODAwMDAKKzMyIDEgMTA0MDAwMDAKKzMyIDEgMTA0MjAwMDAKKzMyIDEgMTA0NDAwMDAKKzMyIDEgMTA0NjAwMDAKKzMyIDEgMTA0ODAwMDAKKzMyIDEgMTA1MDAwMDAKKzMyIDEgMTA1MjAwMDAKKzMyIDEgMTA1NDAwMDAKKzMyIDEgMTA1NjAwMDAKKzMyIDEgMTA1ODAwMDAKKzMyIDEgMTA2MDAwMDAKKzMyIDEgMTA2MjAwMDAKKzMyIDEgMTA2NDAwMDAKKzMyIDEgMTA2NjAwMDAKKzMyIDEgMTA2ODAwMDAKKzMyIDEgMTA3MDAwMDAKKzMyIDEgMTA3MjAwMDAKKzMyIDEgMTA3NDAwMDAKKzMyIDEgMTA3NjAwMDAKKzMyIDEgMTA3ODAwMDAKKzMyIDEgMTA4MDAwMDAKKzMyIDEgMTA4MjAwMDAKKzMyIDEgMTA4NDAwMDAKKzMyIDEgMTA4NjAwMDAKKzMyIDEgMTA4ODAwMDAKKzMyIDEgMTA5MDAwMDAKKzMyIDEgMTA5MjAwMDAKKzMyIDEgMTA5NDAwMDAKKzMyIDEgMTA5NjAwMDAKKzMyIDEgMTA5ODAwMDAKKzMyIDEgMTEwMDAwMDAKKzMyIDEgMTEwMjAwMDAKKzMyIDEgMTEwNDAwMDAKKzMyIDEgMTEwNjAwMDAKKzMyIDEgMTEwODAwMDAKKzMyIDEgMTExMDAwMDAKKzMyIDEgMTExMjAwMDAKKzMyIDEgMTExNDAwMDAKKzMyIDEgMTExNjAwMDAKKzMyIDEgMTExODAwMDAKKzMyIDEgMTEyMDAwMDAKKzMyIDEgMTEyMjAwMDAKKzMyIDEgMTEyNDAwMDAKKzMyIDEgMTEyNjAwMDAKKzMyIDEgMTEyODAwMDAKKzMyIDEgMTEzMDAwMDAKKzMyIDEgMTEzMjAwMDAKKzMyIDEgMTEzNDAwMDAKKzMyIDEgMTEzNjAwMDAKKzMyIDEgMTEzODAwMDAKKzMyIDEgMTE0MDAwMDAKKzMyIDEgMTE0MjAwMDAKKzMyIDEgMTE0NDAwMDAKKzMyIDEgMTE0NjAwMDAKKzMyIDEgMTE0ODAwMDAKKzMyIDEgMTE1MDAwMDAKKzMyIDEgMTE1MjAwMDAKKzMyIDEgMTE1NDAwMDAKKzMyIDEgMTE1NjAwMDAKKzMyIDEgMTE1ODAwMDAKKzMyIDEgMTE2MDAwMDAKKzMyIDEgMTE2MjAwMDAKKzMyIDEgMTE2NDAwMDAKKzMyIDEgMTE2NjAwMDAKKzMyIDEgMTE2ODAwMDAKKzMyIDEgMTE3MDAwMDAKKzMyIDEgMTE3MjAwMDAKKzMyIDEgMTE3NDAwMDAKKzMyIDEgMTE3NjAwMDAKKzMyIDEgMTE3ODAwMDAKKzMyIDEgMTE4MDAwMDAKKzMyIDEgMTE4MjAwMDAKKzMyIDEgMTE4NDAwMDAKKzMyIDEgMTE4NjAwMDAKKzMyIDEgMTE4ODAwMDAKKzMyIDEgMTE5MDAwMDAKKzMyIDEgMTE5MjAwMDAKKzMyIDEgMTE5NDAwMDAKKzMyIDEgMTE5NjAwMDAKKzMyIDEgMTE5ODAwMDAKKzMyIDEgMTIwMDAwMDAKKzMyIDEgMTIwMjAwMDAKKzMyIDEgMTIwNDAwMDAKKzMyIDEgMTIwNjAwMDAKKzMyIDEgMTIwODAwMDAKKzMyIDEgMTIxMDAwMDAKKzMyIDEgMTIxMjAwMDAKKzMyIDEgMTIxNDAwMDAKKzMyIDEgMTIxNjAwMDAKKzMyIDEgMTIxODAwMDAKKzMyIDEgMTIyMDAwMDAKKzMyIDEgMTIyMjAwMDAKKzMyIDEgMTIyNDAwMDAKKzMyIDEgMTIyNjAwMDAKKzMyIDEgMTIyODAwMDAKKzMyIDEgMTIzMDAwMDAKKzMyIDEgMTIzMjAwMDAKKzMyIDEgMTIzNDAwMDAKKzMyIDEgMTIzNjAwMDAKKzMyIDEgMTIzODAwMDAKKzMyIDEgMTI0MDAwMDAKKzMyIDEgMTI0MjAwMDAKKzMyIDEgMTI0NDAwMDAKKzMyIDEgMTI0NjAwMDAKKzMyIDEgMTI0ODAwMDAKKzMyIDEgMTI1MDAwMDAKKzMyIDEgMTI1MjAwMDAKKzMyIDEgMTI1NDAwMDAKKzMyIDEgMTI1NjAwMDAKKzMyIDEgMTI1ODAwMDAKKzMyIDEgMTI2MDAwMDAKKzMyIDEgMTI2MjAwMDAKKzMyIDEgMTI2NDAwMDAKKzMyIDEgMTI2NjAwMDAKKzMyIDEgMTI2ODAwMDAKKzMyIDEgMTI3MDAwMDAKKzMyIDEgMTI3MjAwMDAKKzMyIDEgMTI3NDAwMDAKKzMyIDEgMTI3NjAwMDAKKzMyIDEgMTI3ODAwMDAKKzMyIDEgMTI4MDAwMDAKKzMyIDEgMTI4MjAwMDAKKzMyIDEgMTI4NDAwMDAKKzMyIDEgMTI4NjAwMDAKKzMyIDEgMTI4ODAwMDAKKzMyIDEgMTI5MDAwMDAKKzMyIDEgMTI5MjAwMDAKKzMyIDEgMTI5NDAwMDAKKzMyIDEgMTI5NjAwMDAKKzMyIDEgMTI5ODAwMDAKKzMyIDEgMTMwMDAwMDAKKzMyIDEgMTMwMjAwMDAKKzMyIDEgMTMwNDAwMDAKKzMyIDEgMTMwNjAwMDAKKzMyIDEgMTMwODAwMDAKKzMyIDEgMTMxMDAwMDAKKzMyIDEgMTMxMjAwMDAKKzMyIDEgMTMxNDAwMDAKKzMyIDEgMTMxNjAwMDAKKzMyIDEgMTMxODAwMDAKKzMyIDEgMTMyMDAwMDAKKzMyIDEgMTMyMjAwMDAKKzMyIDEgMTMyNDAwMDAKKzMyIDEgMTMyNjAwMDAKKzMyIDEgMTMyODAwMDAKKzMyIDEgMTMzMDAwMDAKKzMyIDEgMTMzMjAwMDAKKzMyIDEgMTMzNDAwMDAKKzMyIDEgMTMzNjAwMDAKKzMyIDEgMTMzODAwMDAKKzMyIDEgMTM0MDAwMDAKKzMyIDEgMTM0MjAwMDAKKzMyIDEgMTM0NDAwMDAKKzMyIDEgMTM0NjAwMDAKKzMyIDEgMTM0ODAwMDAKKzMyIDEgMTM1MDAwMDAKKzMyIDEgMTM1MjAwMDAKKzMyIDEgMTM1NDAwMDAKKzMyIDEgMTM1NjAwMDAKKzMyIDEgMTM1ODAwMDAKKzMyIDEgMTM2MDAwMDAKKzMyIDEgMTM2MjAwMDAKKzMyIDEgMTM2NDAwMDAKKzMyIDEgMTM2NjAwMDAKKzMyIDEgMTM2ODAwMDAKKzMyIDEgMTM3MDAwMDAKKzMyIDEgMTM3MjAwMDAKKzMyIDEgMTM3NDAwMDAKKzMyIDEgMTM3NjAwMDAKKzMyIDEgMTM3ODAwMDAKKzMyIDEgMTM4MDAwMDAKKzMyIDEgMTM4MjAwMDAKKzMyIDEgMTM4NDAwMDAKKzMyIDEgMTM4NjAwMDAKKzMyIDEgMTM4ODAwMDAKKzMyIDEgMTM5MDAwMDAKKzMyIDEgMTM5MjAwMDAKKzMyIDEgMTM5NDAwMDAKKzMyIDEgMTM5NjAwMDAKKzMyIDEgMTM5ODAwMDAKKzMyIDEgMTQwMDAwMDAKKzMyIDEgMTQwMjAwMDAKKzMyIDEgMTQwNDAwMDAKKzMyIDEgMTQwNjAwMDAKKzMyIDEgMTQwODAwMDAKKzMyIDEgMTQxMDAwMDAKKzMyIDEgMTQxMjAwMDAKKzMyIDEgMTQxNDAwMDAKKzMyIDEgMTQxNjAwMDAKKzMyIDEgMTQxODAwMDAKKzMyIDEgMTQyMDAwMDAKKzMyIDEgMTQyMjAwMDAKKzMyIDEgMTQyNDAwMDAKKzMyIDEgMTQyNjAwMDAKKzMyIDEgMTQyODAwMDAKKzMyIDEgMTQzMDAwMDAKKzMyIDEgMTQzMjAwMDAKKzMyIDEgMTQzNDAwMDAKKzMyIDEgMTQzNjAwMDAKKzMyIDEgMTQzODAwMDAKKzMyIDEgMTQ0MDAwMDAKKzMyIDEgMTQ0MjAwMDAKKzMyIDEgMTQ0NDAwMDAKKzMyIDEgMTQ0NjAwMDAKKzMyIDEgMTQ0ODAwMDAKKzMyIDEgMTQ1MDAwMDAKKzMyIDEgMTQ1MjAwMDAKKzMyIDEgMTQ1NDAwMDAKKzMyIDEgMTQ1NjAwMDAKKzMyIDEgMTQ1ODAwMDAKKzMyIDEgMTQ2MDAwMDAKKzMyIDEgMTQ2MjAwMDAKKzMyIDEgMTQ2NDAwMDAKKzMyIDEgMTQ2NjAwMDAKKzMyIDEgMTQ2ODAwMDAKKzMyIDEgMTQ3MDAwMDAKKzMyIDEgMTQ3MjAwMDAKKzMyIDEgMTQ3NDAwMDAKKzMyIDEgMTQ3NjAwMDAKKzMyIDEgMTQ3ODAwMDAKKzMyIDEgMTQ4MDAwMDAKKzMyIDEgMTQ4MjAwMDAKKzMyIDEgMTQ4NDAwMDAKKzMyIDEgMTQ4NjAwMDAKKzMyIDEgMTQ4ODAwMDAKKzMyIDEgMTQ5MDAwMDAKKzMyIDEgMTQ5MjAwMDAKKzMyIDEgMTQ5NDAwMDAKKzMyIDEgMTQ5NjAwMDAKKzMyIDEgMTQ5ODAwMDAKKzMyIDEgMTUwMDAwMDAKKzMyIDEgMTUwMjAwMDAKKzMyIDEgMTUwNDAwMDAKKzMyIDEgMTUwNjAwMDAKKzMyIDEgMTUwODAwMDAKKzMyIDEgMTUxMDAwMDAKKzMyIDEgMTUxMjAwMDAKKzMyIDEgMTUxNDAwMDAKKzMyIDEgMTUxNjAwMDAKKzMyIDEgMTUxODAwMDAKKzMyIDEgMTUyMDAwMDAKKzMyIDEgMTUyMjAwMDAKKzMyIDEgMTUyNDAwMDAKKzMyIDEgMTUyNjAwMDAKKzMyIDEgMTUyODAwMDAKKzMyIDEgMTUzMDAwMDAKKzMyIDEgMTUzMjAwMDAKKzMyIDEgMTUzNDAwMDAKKzMyIDEgMTUzNjAwMDAKKzMyIDEgMTUzODAwMDAKKzMyIDEgMTU0MDAwMDAKKzMyIDEgMTU0MjAwMDAKKzMyIDEgMTU0NDAwMDAKKzMyIDEgMTU0NjAwMDAKKzMyIDEgMTU0ODAwMDAKKzMyIDEgMTU1MDAwMDAKKzMyIDEgMTU1MjAwMDAKKzMyIDEgMTU1NDAwMDAKKzMyIDEgMTU1NjAwMDAKKzMyIDEgMTU1ODAwMDAKKzMyIDEgMTU2MDAwMDAKKzMyIDEgMTU2MjAwMDAKKzMyIDEgMTU2NDAwMDAKKzMyIDEgMTU2NjAwMDAKKzMyIDEgMTU2ODAwMDAKKzMyIDEgMTU3MDAwMDAKKzMyIDEgMTU3MjAwMDAKKzMyIDEgMTU3NDAwMDAKKzMyIDEgMTU3NjAwMDAKKzMyIDEgMTU3ODAwMDAKKzMyIDEgMTU4MDAwMDAKKzMyIDEgMTU4MjAwMDAKKzMyIDEgMTU4NDAwMDAKKzMyIDEgMTU4NjAwMDAKKzMyIDEgMTU4ODAwMDAKKzMyIDEgMTU5MDAwMDAKKzMyIDEgMTU5MjAwMDAKKzMyIDEgMTU5NDAwMDAKKzMyIDEgMTU5NjAwMDAKKzMyIDEgMTU5ODAwMDAKKzMyIDEgMTYwMDAwMDAKKzMyIDEgMTYwMjAwMDAKKzMyIDEgMTYwNDAwMDAKKzMyIDEgMTYwNjAwMDAKKzMyIDEgMTYwODAwMDAKKzMyIDEgMTYxMDAwMDAKKzMyIDEgMTYxMjAwMDAKKzMyIDEgMTYxNDAwMDAKKzMyIDEgMTYxNjAwMDAKKzMyIDEgMTYxODAwMDAKKzMyIDEgMTYyMDAwMDAKKzMyIDEgMTYyMjAwMDAKKzMyIDEgMTYyNDAwMDAKKzMyIDEgMTYyNjAwMDAKKzMyIDEgMTYyODAwMDAKKzMyIDEgMTYzMDAwMDAKKzMyIDEgMTYzMjAwMDAKKzMyIDEgMTYzNDAwMDAKKzMyIDEgMTYzNjAwMDAKKzMyIDEgMTYzODAwMDAKKzMyIDEgMTY0MDAwMDAKKzMyIDEgMTY0MjAwMDAKKzMyIDEgMTY0NDAwMDAKKzMyIDEgMTY0NjAwMDAKKzMyIDEgMTY0ODAwMDAKKzMyIDEgMTY1MDAwMDAKKzMyIDEgMTY1MjAwMDAKKzMyIDEgMTY1NDAwMDAKKzMyIDEgMTY1NjAwMDAKKzMyIDEgMTY1ODAwMDAKKzMyIDEgMTY2MDAwMDAKKzMyIDEgMTY2MjAwMDAKKzMyIDEgMTY2NDAwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL3NpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHpfbXVsdGlfZnJhbWUuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL3NpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHpfbXVsdGlfZnJhbWUuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTc2ZWFmNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL3NpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHpfbXVsdGlfZnJhbWUuaW5mbwpAQCAtMCwwICsxLDgwNyBAQAorMzIgMSAwCiszMiAxIDIwMDAwCis2NCAxIDQwMDAwCis2NCAxIDgwMDAwCis2NCAxIDEyMDAwMAorOTYgMSAxNjAwMDAKKzk2IDEgMjIwMDAwCis5NiAxIDI4MDAwMAorOTYgMSAzNDAwMDAKKzEyOCAxIDQwMDAwMAorMTI4IDEgNDgwMDAwCisxMjggMSA1NjAwMDAKKzEyOCAxIDY0MDAwMAorMTI4IDEgNzIwMDAwCiszMiAxIDgwMDAwMAorMzIgMSA4MjAwMDAKKzMyIDEgODQwMDAwCiszMiAxIDg2MDAwMAorMzIgMSA4ODAwMDAKKzMyIDEgOTAwMDAwCiszMiAxIDkyMDAwMAorMzIgMSA5NDAwMDAKKzMyIDEgOTYwMDAwCiszMiAxIDk4MDAwMAorMzIgMSAxMDAwMDAwCiszMiAxIDEwMjAwMDAKKzMyIDEgMTA0MDAwMAorMzIgMSAxMDYwMDAwCiszMiAxIDEwODAwMDAKKzMyIDEgMTEwMDAwMAorMzIgMSAxMTIwMDAwCiszMiAxIDExNDAwMDAKKzMyIDEgMTE2MDAwMAorMzIgMSAxMTgwMDAwCiszMiAxIDEyMDAwMDAKKzMyIDEgMTIyMDAwMAorMzIgMSAxMjQwMDAwCiszMiAxIDEyNjAwMDAKKzMyIDEgMTI4MDAwMAorMzIgMSAxMzAwMDAwCiszMiAxIDEzMjAwMDAKKzMyIDEgMTM0MDAwMAorMzIgMSAxMzYwMDAwCiszMiAxIDEzODAwMDAKKzMyIDEgMTQwMDAwMAorMzIgMSAxNDIwMDAwCiszMiAxIDE0NDAwMDAKKzMyIDEgMTQ2MDAwMAorMzIgMSAxNDgwMDAwCiszMiAxIDE1MDAwMDAKKzMyIDEgMTUyMDAwMAorMzIgMSAxNTQwMDAwCiszMiAxIDE1NjAwMDAKKzMyIDEgMTU4MDAwMAorMzIgMSAxNjAwMDAwCiszMiAxIDE2MjAwMDAKKzMyIDEgMTY0MDAwMAorMzIgMSAxNjYwMDAwCiszMiAxIDE2ODAwMDAKKzMyIDEgMTcwMDAwMAorMzIgMSAxNzIwMDAwCiszMiAxIDE3NDAwMDAKKzMyIDEgMTc2MDAwMAorMzIgMSAxNzgwMDAwCiszMiAxIDE4MDAwMDAKKzMyIDEgMTgyMDAwMAorMzIgMSAxODQwMDAwCiszMiAxIDE4NjAwMDAKKzMyIDEgMTg4MDAwMAorMzIgMSAxOTAwMDAwCiszMiAxIDE5MjAwMDAKKzMyIDEgMTk0MDAwMAorMzIgMSAxOTYwMDAwCiszMiAxIDE5ODAwMDAKKzMyIDEgMjAwMDAwMAorMzIgMSAyMDIwMDAwCiszMiAxIDIwNDAwMDAKKzMyIDEgMjA2MDAwMAorMzIgMSAyMDgwMDAwCiszMiAxIDIxMDAwMDAKKzMyIDEgMjEyMDAwMAorMzIgMSAyMTQwMDAwCiszMiAxIDIxNjAwMDAKKzMyIDEgMjE4MDAwMAorMzIgMSAyMjAwMDAwCiszMiAxIDIyMjAwMDAKKzMyIDEgMjI0MDAwMAorMzIgMSAyMjYwMDAwCiszMiAxIDIyODAwMDAKKzMyIDEgMjMwMDAwMAorMzIgMSAyMzIwMDAwCiszMiAxIDIzNDAwMDAKKzMyIDEgMjM2MDAwMAorMzIgMSAyMzgwMDAwCiszMiAxIDI0MDAwMDAKKzMyIDEgMjQyMDAwMAorMzIgMSAyNDQwMDAwCiszMiAxIDI0NjAwMDAKKzMyIDEgMjQ4MDAwMAorMzIgMSAyNTAwMDAwCiszMiAxIDI1MjAwMDAKKzMyIDEgMjU0MDAwMAorMzIgMSAyNTYwMDAwCiszMiAxIDI1ODAwMDAKKzMyIDEgMjYwMDAwMAorMzIgMSAyNjIwMDAwCiszMiAxIDI2NDAwMDAKKzMyIDEgMjY2MDAwMAorMzIgMSAyNjgwMDAwCiszMiAxIDI3MDAwMDAKKzMyIDEgMjcyMDAwMAorMzIgMSAyNzQwMDAwCiszMiAxIDI3NjAwMDAKKzMyIDEgMjc4MDAwMAorMzIgMSAyODAwMDAwCiszMiAxIDI4MjAwMDAKKzMyIDEgMjg0MDAwMAorMzIgMSAyODYwMDAwCiszMiAxIDI4ODAwMDAKKzMyIDEgMjkwMDAwMAorMzIgMSAyOTIwMDAwCiszMiAxIDI5NDAwMDAKKzMyIDEgMjk2MDAwMAorMzIgMSAyOTgwMDAwCiszMiAxIDMwMDAwMDAKKzMyIDEgMzAyMDAwMAorMzIgMSAzMDQwMDAwCiszMiAxIDMwNjAwMDAKKzMyIDEgMzA4MDAwMAorMzIgMSAzMTAwMDAwCiszMiAxIDMxMjAwMDAKKzMyIDEgMzE0MDAwMAorMzIgMSAzMTYwMDAwCiszMiAxIDMxODAwMDAKKzMyIDEgMzIwMDAwMAorMzIgMSAzMjIwMDAwCiszMiAxIDMyNDAwMDAKKzMyIDEgMzI2MDAwMAorMzIgMSAzMjgwMDAwCiszMiAxIDMzMDAwMDAKKzMyIDEgMzMyMDAwMAorMzIgMSAzMzQwMDAwCiszMiAxIDMzNjAwMDAKKzMyIDEgMzM4MDAwMAorMzIgMSAzNDAwMDAwCiszMiAxIDM0MjAwMDAKKzMyIDEgMzQ0MDAwMAorMzIgMSAzNDYwMDAwCiszMiAxIDM0ODAwMDAKKzMyIDEgMzUwMDAwMAorMzIgMSAzNTIwMDAwCiszMiAxIDM1NDAwMDAKKzMyIDEgMzU2MDAwMAorMzIgMSAzNTgwMDAwCiszMiAxIDM2MDAwMDAKKzMyIDEgMzYyMDAwMAorMzIgMSAzNjQwMDAwCiszMiAxIDM2NjAwMDAKKzMyIDEgMzY4MDAwMAorMzIgMSAzNzAwMDAwCiszMiAxIDM3MjAwMDAKKzMyIDEgMzc0MDAwMAorMzIgMSAzNzYwMDAwCiszMiAxIDM3ODAwMDAKKzMyIDEgMzgwMDAwMAorMzIgMSAzODIwMDAwCiszMiAxIDM4NDAwMDAKKzMyIDEgMzg2MDAwMAorMzIgMSAzODgwMDAwCiszMiAxIDM5MDAwMDAKKzMyIDEgMzkyMDAwMAorMzIgMSAzOTQwMDAwCiszMiAxIDM5NjAwMDAKKzMyIDEgMzk4MDAwMAorMzIgMSA0MDAwMDAwCiszMiAxIDQwMjAwMDAKKzMyIDEgNDA0MDAwMAorMzIgMSA0MDYwMDAwCiszMiAxIDQwODAwMDAKKzMyIDEgNDEwMDAwMAorMzIgMSA0MTIwMDAwCiszMiAxIDQxNDAwMDAKKzMyIDEgNDE2MDAwMAorMzIgMSA0MTgwMDAwCiszMiAxIDQyMDAwMDAKKzMyIDEgNDIyMDAwMAorMzIgMSA0MjQwMDAwCiszMiAxIDQyNjAwMDAKKzMyIDEgNDI4MDAwMAorMzIgMSA0MzAwMDAwCiszMiAxIDQzMjAwMDAKKzMyIDEgNDM0MDAwMAorMzIgMSA0MzYwMDAwCiszMiAxIDQzODAwMDAKKzMyIDEgNDQwMDAwMAorMzIgMSA0NDIwMDAwCiszMiAxIDQ0NDAwMDAKKzMyIDEgNDQ2MDAwMAorMzIgMSA0NDgwMDAwCiszMiAxIDQ1MDAwMDAKKzMyIDEgNDUyMDAwMAorMzIgMSA0NTQwMDAwCiszMiAxIDQ1NjAwMDAKKzMyIDEgNDU4MDAwMAorMzIgMSA0NjAwMDAwCiszMiAxIDQ2MjAwMDAKKzMyIDEgNDY0MDAwMAorMzIgMSA0NjYwMDAwCiszMiAxIDQ2ODAwMDAKKzMyIDEgNDcwMDAwMAorMzIgMSA0NzIwMDAwCiszMiAxIDQ3NDAwMDAKKzMyIDEgNDc2MDAwMAorMzIgMSA0NzgwMDAwCiszMiAxIDQ4MDAwMDAKKzMyIDEgNDgyMDAwMAorMzIgMSA0ODQwMDAwCiszMiAxIDQ4NjAwMDAKKzMyIDEgNDg4MDAwMAorMzIgMSA0OTAwMDAwCiszMiAxIDQ5MjAwMDAKKzMyIDEgNDk0MDAwMAorMzIgMSA0OTYwMDAwCiszMiAxIDQ5ODAwMDAKKzMyIDEgNTAwMDAwMAorMzIgMSA1MDIwMDAwCiszMiAxIDUwNDAwMDAKKzMyIDEgNTA2MDAwMAorMzIgMSA1MDgwMDAwCiszMiAxIDUxMDAwMDAKKzMyIDEgNTEyMDAwMAorMzIgMSA1MTQwMDAwCiszMiAxIDUxNjAwMDAKKzMyIDEgNTE4MDAwMAorMzIgMSA1MjAwMDAwCiszMiAxIDUyMjAwMDAKKzMyIDEgNTI0MDAwMAorMzIgMSA1MjYwMDAwCiszMiAxIDUyODAwMDAKKzMyIDEgNTMwMDAwMAorMzIgMSA1MzIwMDAwCiszMiAxIDUzNDAwMDAKKzMyIDEgNTM2MDAwMAorMzIgMSA1MzgwMDAwCiszMiAxIDU0MDAwMDAKKzMyIDEgNTQyMDAwMAorMzIgMSA1NDQwMDAwCiszMiAxIDU0NjAwMDAKKzMyIDEgNTQ4MDAwMAorMzIgMSA1NTAwMDAwCiszMiAxIDU1MjAwMDAKKzMyIDEgNTU0MDAwMAorMzIgMSA1NTYwMDAwCiszMiAxIDU1ODAwMDAKKzMyIDEgNTYwMDAwMAorMzIgMSA1NjIwMDAwCiszMiAxIDU2NDAwMDAKKzMyIDEgNTY2MDAwMAorMzIgMSA1NjgwMDAwCiszMiAxIDU3MDAwMDAKKzMyIDEgNTcyMDAwMAorMzIgMSA1NzQwMDAwCiszMiAxIDU3NjAwMDAKKzMyIDEgNTc4MDAwMAorMzIgMSA1ODAwMDAwCiszMiAxIDU4MjAwMDAKKzMyIDEgNTg0MDAwMAorMzIgMSA1ODYwMDAwCiszMiAxIDU4ODAwMDAKKzMyIDEgNTkwMDAwMAorMzIgMSA1OTIwMDAwCiszMiAxIDU5NDAwMDAKKzMyIDEgNTk2MDAwMAorMzIgMSA1OTgwMDAwCiszMiAxIDYwMDAwMDAKKzMyIDEgNjAyMDAwMAorMzIgMSA2MDQwMDAwCiszMiAxIDYwNjAwMDAKKzMyIDEgNjA4MDAwMAorMzIgMSA2MTAwMDAwCiszMiAxIDYxMjAwMDAKKzMyIDEgNjE0MDAwMAorMzIgMSA2MTYwMDAwCiszMiAxIDYxODAwMDAKKzMyIDEgNjIwMDAwMAorMzIgMSA2MjIwMDAwCiszMiAxIDYyNDAwMDAKKzMyIDEgNjI2MDAwMAorMzIgMSA2MjgwMDAwCiszMiAxIDYzMDAwMDAKKzMyIDEgNjMyMDAwMAorMzIgMSA2MzQwMDAwCiszMiAxIDYzNjAwMDAKKzMyIDEgNjM4MDAwMAorMzIgMSA2NDAwMDAwCiszMiAxIDY0MjAwMDAKKzMyIDEgNjQ0MDAwMAorMzIgMSA2NDYwMDAwCiszMiAxIDY0ODAwMDAKKzMyIDEgNjUwMDAwMAorMzIgMSA2NTIwMDAwCiszMiAxIDY1NDAwMDAKKzMyIDEgNjU2MDAwMAorMzIgMSA2NTgwMDAwCiszMiAxIDY2MDAwMDAKKzMyIDEgNjYyMDAwMAorMzIgMSA2NjQwMDAwCiszMiAxIDY2NjAwMDAKKzMyIDEgNjY4MDAwMAorMzIgMSA2NzAwMDAwCiszMiAxIDY3MjAwMDAKKzMyIDEgNjc0MDAwMAorMzIgMSA2NzYwMDAwCiszMiAxIDY3ODAwMDAKKzMyIDEgNjgwMDAwMAorMzIgMSA2ODIwMDAwCiszMiAxIDY4NDAwMDAKKzMyIDEgNjg2MDAwMAorMzIgMSA2ODgwMDAwCiszMiAxIDY5MDAwMDAKKzMyIDEgNjkyMDAwMAorMzIgMSA2OTQwMDAwCiszMiAxIDY5NjAwMDAKKzMyIDEgNjk4MDAwMAorMzIgMSA3MDAwMDAwCiszMiAxIDcwMjAwMDAKKzMyIDEgNzA0MDAwMAorMzIgMSA3MDYwMDAwCiszMiAxIDcwODAwMDAKKzMyIDEgNzEwMDAwMAorMzIgMSA3MTIwMDAwCiszMiAxIDcxNDAwMDAKKzMyIDEgNzE2MDAwMAorMzIgMSA3MTgwMDAwCiszMiAxIDcyMDAwMDAKKzMyIDEgNzIyMDAwMAorMzIgMSA3MjQwMDAwCiszMiAxIDcyNjAwMDAKKzMyIDEgNzI4MDAwMAorMzIgMSA3MzAwMDAwCiszMiAxIDczMjAwMDAKKzMyIDEgNzM0MDAwMAorMzIgMSA3MzYwMDAwCiszMiAxIDczODAwMDAKKzMyIDEgNzQwMDAwMAorMzIgMSA3NDIwMDAwCiszMiAxIDc0NDAwMDAKKzMyIDEgNzQ2MDAwMAorMzIgMSA3NDgwMDAwCiszMiAxIDc1MDAwMDAKKzMyIDEgNzUyMDAwMAorMzIgMSA3NTQwMDAwCiszMiAxIDc1NjAwMDAKKzMyIDEgNzU4MDAwMAorMzIgMSA3NjAwMDAwCiszMiAxIDc2MjAwMDAKKzMyIDEgNzY0MDAwMAorMzIgMSA3NjYwMDAwCiszMiAxIDc2ODAwMDAKKzMyIDEgNzcwMDAwMAorMzIgMSA3NzIwMDAwCiszMiAxIDc3NDAwMDAKKzMyIDEgNzc2MDAwMAorMzIgMSA3NzgwMDAwCiszMiAxIDc4MDAwMDAKKzMyIDEgNzgyMDAwMAorMzIgMSA3ODQwMDAwCiszMiAxIDc4NjAwMDAKKzMyIDEgNzg4MDAwMAorMzIgMSA3OTAwMDAwCiszMiAxIDc5MjAwMDAKKzMyIDEgNzk0MDAwMAorMzIgMSA3OTYwMDAwCiszMiAxIDc5ODAwMDAKKzMyIDEgODAwMDAwMAorMzIgMSA4MDIwMDAwCiszMiAxIDgwNDAwMDAKKzMyIDEgODA2MDAwMAorMzIgMSA4MDgwMDAwCiszMiAxIDgxMDAwMDAKKzMyIDEgODEyMDAwMAorMzIgMSA4MTQwMDAwCiszMiAxIDgxNjAwMDAKKzMyIDEgODE4MDAwMAorMzIgMSA4MjAwMDAwCiszMiAxIDgyMjAwMDAKKzMyIDEgODI0MDAwMAorMzIgMSA4MjYwMDAwCiszMiAxIDgyODAwMDAKKzMyIDEgODMwMDAwMAorMzIgMSA4MzIwMDAwCiszMiAxIDgzNDAwMDAKKzMyIDEgODM2MDAwMAorMzIgMSA4MzgwMDAwCiszMiAxIDg0MDAwMDAKKzMyIDEgODQyMDAwMAorMzIgMSA4NDQwMDAwCiszMiAxIDg0NjAwMDAKKzMyIDEgODQ4MDAwMAorMzIgMSA4NTAwMDAwCiszMiAxIDg1MjAwMDAKKzMyIDEgODU0MDAwMAorMzIgMSA4NTYwMDAwCiszMiAxIDg1ODAwMDAKKzMyIDEgODYwMDAwMAorMzIgMSA4NjIwMDAwCiszMiAxIDg2NDAwMDAKKzMyIDEgODY2MDAwMAorMzIgMSA4NjgwMDAwCiszMiAxIDg3MDAwMDAKKzMyIDEgODcyMDAwMAorMzIgMSA4NzQwMDAwCiszMiAxIDg3NjAwMDAKKzMyIDEgODc4MDAwMAorMzIgMSA4ODAwMDAwCiszMiAxIDg4MjAwMDAKKzMyIDEgODg0MDAwMAorMzIgMSA4ODYwMDAwCiszMiAxIDg4ODAwMDAKKzMyIDEgODkwMDAwMAorMzIgMSA4OTIwMDAwCiszMiAxIDg5NDAwMDAKKzMyIDEgODk2MDAwMAorMzIgMSA4OTgwMDAwCiszMiAxIDkwMDAwMDAKKzMyIDEgOTAyMDAwMAorMzIgMSA5MDQwMDAwCiszMiAxIDkwNjAwMDAKKzMyIDEgOTA4MDAwMAorMzIgMSA5MTAwMDAwCiszMiAxIDkxMjAwMDAKKzMyIDEgOTE0MDAwMAorMzIgMSA5MTYwMDAwCiszMiAxIDkxODAwMDAKKzMyIDEgOTIwMDAwMAorMzIgMSA5MjIwMDAwCiszMiAxIDkyNDAwMDAKKzMyIDEgOTI2MDAwMAorMzIgMSA5MjgwMDAwCiszMiAxIDkzMDAwMDAKKzMyIDEgOTMyMDAwMAorMzIgMSA5MzQwMDAwCiszMiAxIDkzNjAwMDAKKzMyIDEgOTM4MDAwMAorMzIgMSA5NDAwMDAwCiszMiAxIDk0MjAwMDAKKzMyIDEgOTQ0MDAwMAorMzIgMSA5NDYwMDAwCiszMiAxIDk0ODAwMDAKKzMyIDEgOTUwMDAwMAorMzIgMSA5NTIwMDAwCiszMiAxIDk1NDAwMDAKKzMyIDEgOTU2MDAwMAorMzIgMSA5NTgwMDAwCiszMiAxIDk2MDAwMDAKKzMyIDEgOTYyMDAwMAorMzIgMSA5NjQwMDAwCiszMiAxIDk2NjAwMDAKKzMyIDEgOTY4MDAwMAorMzIgMSA5NzAwMDAwCiszMiAxIDk3MjAwMDAKKzMyIDEgOTc0MDAwMAorMzIgMSA5NzYwMDAwCiszMiAxIDk3ODAwMDAKKzMyIDEgOTgwMDAwMAorMzIgMSA5ODIwMDAwCiszMiAxIDk4NDAwMDAKKzMyIDEgOTg2MDAwMAorMzIgMSA5ODgwMDAwCiszMiAxIDk5MDAwMDAKKzMyIDEgOTkyMDAwMAorMzIgMSA5OTQwMDAwCiszMiAxIDk5NjAwMDAKKzMyIDEgOTk4MDAwMAorMzIgMSAxMDAwMDAwMAorMzIgMSAxMDAyMDAwMAorMzIgMSAxMDA0MDAwMAorMzIgMSAxMDA2MDAwMAorMzIgMSAxMDA4MDAwMAorMzIgMSAxMDEwMDAwMAorMzIgMSAxMDEyMDAwMAorMzIgMSAxMDE0MDAwMAorMzIgMSAxMDE2MDAwMAorMzIgMSAxMDE4MDAwMAorMzIgMSAxMDIwMDAwMAorMzIgMSAxMDIyMDAwMAorMzIgMSAxMDI0MDAwMAorMzIgMSAxMDI2MDAwMAorMzIgMSAxMDI4MDAwMAorMzIgMSAxMDMwMDAwMAorMzIgMSAxMDMyMDAwMAorMzIgMSAxMDM0MDAwMAorMzIgMSAxMDM2MDAwMAorMzIgMSAxMDM4MDAwMAorMzIgMSAxMDQwMDAwMAorMzIgMSAxMDQyMDAwMAorMzIgMSAxMDQ0MDAwMAorMzIgMSAxMDQ2MDAwMAorMzIgMSAxMDQ4MDAwMAorMzIgMSAxMDUwMDAwMAorMzIgMSAxMDUyMDAwMAorMzIgMSAxMDU0MDAwMAorMzIgMSAxMDU2MDAwMAorMzIgMSAxMDU4MDAwMAorMzIgMSAxMDYwMDAwMAorMzIgMSAxMDYyMDAwMAorMzIgMSAxMDY0MDAwMAorMzIgMSAxMDY2MDAwMAorMzIgMSAxMDY4MDAwMAorMzIgMSAxMDcwMDAwMAorMzIgMSAxMDcyMDAwMAorMzIgMSAxMDc0MDAwMAorMzIgMSAxMDc2MDAwMAorMzIgMSAxMDc4MDAwMAorMzIgMSAxMDgwMDAwMAorMzIgMSAxMDgyMDAwMAorMzIgMSAxMDg0MDAwMAorMzIgMSAxMDg2MDAwMAorMzIgMSAxMDg4MDAwMAorMzIgMSAxMDkwMDAwMAorMzIgMSAxMDkyMDAwMAorMzIgMSAxMDk0MDAwMAorMzIgMSAxMDk2MDAwMAorMzIgMSAxMDk4MDAwMAorMzIgMSAxMTAwMDAwMAorMzIgMSAxMTAyMDAwMAorMzIgMSAxMTA0MDAwMAorMzIgMSAxMTA2MDAwMAorMzIgMSAxMTA4MDAwMAorMzIgMSAxMTEwMDAwMAorMzIgMSAxMTEyMDAwMAorMzIgMSAxMTE0MDAwMAorMzIgMSAxMTE2MDAwMAorMzIgMSAxMTE4MDAwMAorMzIgMSAxMTIwMDAwMAorMzIgMSAxMTIyMDAwMAorMzIgMSAxMTI0MDAwMAorMzIgMSAxMTI2MDAwMAorMzIgMSAxMTI4MDAwMAorMzIgMSAxMTMwMDAwMAorMzIgMSAxMTMyMDAwMAorMzIgMSAxMTM0MDAwMAorMzIgMSAxMTM2MDAwMAorMzIgMSAxMTM4MDAwMAorMzIgMSAxMTQwMDAwMAorMzIgMSAxMTQyMDAwMAorMzIgMSAxMTQ0MDAwMAorMzIgMSAxMTQ2MDAwMAorMzIgMSAxMTQ4MDAwMAorMzIgMSAxMTUwMDAwMAorMzIgMSAxMTUyMDAwMAorMzIgMSAxMTU0MDAwMAorMzIgMSAxMTU2MDAwMAorMzIgMSAxMTU4MDAwMAorMzIgMSAxMTYwMDAwMAorMzIgMSAxMTYyMDAwMAorMzIgMSAxMTY0MDAwMAorMzIgMSAxMTY2MDAwMAorMzIgMSAxMTY4MDAwMAorMzIgMSAxMTcwMDAwMAorMzIgMSAxMTcyMDAwMAorMzIgMSAxMTc0MDAwMAorMzIgMSAxMTc2MDAwMAorMzIgMSAxMTc4MDAwMAorMzIgMSAxMTgwMDAwMAorMzIgMSAxMTgyMDAwMAorMzIgMSAxMTg0MDAwMAorMzIgMSAxMTg2MDAwMAorMzIgMSAxMTg4MDAwMAorMzIgMSAxMTkwMDAwMAorMzIgMSAxMTkyMDAwMAorMzIgMSAxMTk0MDAwMAorMzIgMSAxMTk2MDAwMAorMzIgMSAxMTk4MDAwMAorMzIgMSAxMjAwMDAwMAorMzIgMSAxMjAyMDAwMAorMzIgMSAxMjA0MDAwMAorMzIgMSAxMjA2MDAwMAorMzIgMSAxMjA4MDAwMAorMzIgMSAxMjEwMDAwMAorMzIgMSAxMjEyMDAwMAorMzIgMSAxMjE0MDAwMAorMzIgMSAxMjE2MDAwMAorMzIgMSAxMjE4MDAwMAorMzIgMSAxMjIwMDAwMAorMzIgMSAxMjIyMDAwMAorMzIgMSAxMjI0MDAwMAorMzIgMSAxMjI2MDAwMAorMzIgMSAxMjI4MDAwMAorMzIgMSAxMjMwMDAwMAorMzIgMSAxMjMyMDAwMAorMzIgMSAxMjM0MDAwMAorMzIgMSAxMjM2MDAwMAorMzIgMSAxMjM4MDAwMAorMzIgMSAxMjQwMDAwMAorMzIgMSAxMjQyMDAwMAorMzIgMSAxMjQ0MDAwMAorMzIgMSAxMjQ2MDAwMAorMzIgMSAxMjQ4MDAwMAorMzIgMSAxMjUwMDAwMAorMzIgMSAxMjUyMDAwMAorMzIgMSAxMjU0MDAwMAorMzIgMSAxMjU2MDAwMAorMzIgMSAxMjU4MDAwMAorMzIgMSAxMjYwMDAwMAorMzIgMSAxMjYyMDAwMAorMzIgMSAxMjY0MDAwMAorMzIgMSAxMjY2MDAwMAorMzIgMSAxMjY4MDAwMAorMzIgMSAxMjcwMDAwMAorMzIgMSAxMjcyMDAwMAorMzIgMSAxMjc0MDAwMAorMzIgMSAxMjc2MDAwMAorMzIgMSAxMjc4MDAwMAorMzIgMSAxMjgwMDAwMAorMzIgMSAxMjgyMDAwMAorMzIgMSAxMjg0MDAwMAorMzIgMSAxMjg2MDAwMAorMzIgMSAxMjg4MDAwMAorMzIgMSAxMjkwMDAwMAorMzIgMSAxMjkyMDAwMAorMzIgMSAxMjk0MDAwMAorMzIgMSAxMjk2MDAwMAorMzIgMSAxMjk4MDAwMAorMzIgMSAxMzAwMDAwMAorMzIgMSAxMzAyMDAwMAorMzIgMSAxMzA0MDAwMAorMzIgMSAxMzA2MDAwMAorMzIgMSAxMzA4MDAwMAorMzIgMSAxMzEwMDAwMAorMzIgMSAxMzEyMDAwMAorMzIgMSAxMzE0MDAwMAorMzIgMSAxMzE2MDAwMAorMzIgMSAxMzE4MDAwMAorMzIgMSAxMzIwMDAwMAorMzIgMSAxMzIyMDAwMAorMzIgMSAxMzI0MDAwMAorMzIgMSAxMzI2MDAwMAorMzIgMSAxMzI4MDAwMAorMzIgMSAxMzMwMDAwMAorMzIgMSAxMzMyMDAwMAorMzIgMSAxMzM0MDAwMAorMzIgMSAxMzM2MDAwMAorMzIgMSAxMzM4MDAwMAorMzIgMSAxMzQwMDAwMAorMzIgMSAxMzQyMDAwMAorMzIgMSAxMzQ0MDAwMAorMzIgMSAxMzQ2MDAwMAorMzIgMSAxMzQ4MDAwMAorMzIgMSAxMzUwMDAwMAorMzIgMSAxMzUyMDAwMAorMzIgMSAxMzU0MDAwMAorMzIgMSAxMzU2MDAwMAorMzIgMSAxMzU4MDAwMAorMzIgMSAxMzYwMDAwMAorMzIgMSAxMzYyMDAwMAorMzIgMSAxMzY0MDAwMAorMzIgMSAxMzY2MDAwMAorMzIgMSAxMzY4MDAwMAorMzIgMSAxMzcwMDAwMAorMzIgMSAxMzcyMDAwMAorMzIgMSAxMzc0MDAwMAorMzIgMSAxMzc2MDAwMAorMzIgMSAxMzc4MDAwMAorMzIgMSAxMzgwMDAwMAorMzIgMSAxMzgyMDAwMAorMzIgMSAxMzg0MDAwMAorMzIgMSAxMzg2MDAwMAorMzIgMSAxMzg4MDAwMAorMzIgMSAxMzkwMDAwMAorMzIgMSAxMzkyMDAwMAorMzIgMSAxMzk0MDAwMAorMzIgMSAxMzk2MDAwMAorMzIgMSAxMzk4MDAwMAorMzIgMSAxNDAwMDAwMAorMzIgMSAxNDAyMDAwMAorMzIgMSAxNDA0MDAwMAorMzIgMSAxNDA2MDAwMAorMzIgMSAxNDA4MDAwMAorMzIgMSAxNDEwMDAwMAorMzIgMSAxNDEyMDAwMAorMzIgMSAxNDE0MDAwMAorMzIgMSAxNDE2MDAwMAorMzIgMSAxNDE4MDAwMAorMzIgMSAxNDIwMDAwMAorMzIgMSAxNDIyMDAwMAorMzIgMSAxNDI0MDAwMAorMzIgMSAxNDI2MDAwMAorMzIgMSAxNDI4MDAwMAorMzIgMSAxNDMwMDAwMAorMzIgMSAxNDMyMDAwMAorMzIgMSAxNDM0MDAwMAorMzIgMSAxNDM2MDAwMAorMzIgMSAxNDM4MDAwMAorMzIgMSAxNDQwMDAwMAorMzIgMSAxNDQyMDAwMAorMzIgMSAxNDQ0MDAwMAorMzIgMSAxNDQ2MDAwMAorMzIgMSAxNDQ4MDAwMAorMzIgMSAxNDUwMDAwMAorMzIgMSAxNDUyMDAwMAorMzIgMSAxNDU0MDAwMAorMzIgMSAxNDU2MDAwMAorMzIgMSAxNDU4MDAwMAorMzIgMSAxNDYwMDAwMAorMzIgMSAxNDYyMDAwMAorMzIgMSAxNDY0MDAwMAorMzIgMSAxNDY2MDAwMAorMzIgMSAxNDY4MDAwMAorMzIgMSAxNDcwMDAwMAorMzIgMSAxNDcyMDAwMAorMzIgMSAxNDc0MDAwMAorMzIgMSAxNDc2MDAwMAorMzIgMSAxNDc4MDAwMAorMzIgMSAxNDgwMDAwMAorMzIgMSAxNDgyMDAwMAorMzIgMSAxNDg0MDAwMAorMzIgMSAxNDg2MDAwMAorMzIgMSAxNDg4MDAwMAorMzIgMSAxNDkwMDAwMAorMzIgMSAxNDkyMDAwMAorMzIgMSAxNDk0MDAwMAorMzIgMSAxNDk2MDAwMAorMzIgMSAxNDk4MDAwMAorMzIgMSAxNTAwMDAwMAorMzIgMSAxNTAyMDAwMAorMzIgMSAxNTA0MDAwMAorMzIgMSAxNTA2MDAwMAorMzIgMSAxNTA4MDAwMAorMzIgMSAxNTEwMDAwMAorMzIgMSAxNTEyMDAwMAorMzIgMSAxNTE0MDAwMAorMzIgMSAxNTE2MDAwMAorMzIgMSAxNTE4MDAwMAorMzIgMSAxNTIwMDAwMAorMzIgMSAxNTIyMDAwMAorMzIgMSAxNTI0MDAwMAorMzIgMSAxNTI2MDAwMAorMzIgMSAxNTI4MDAwMAorMzIgMSAxNTMwMDAwMAorMzIgMSAxNTMyMDAwMAorMzIgMSAxNTM0MDAwMAorMzIgMSAxNTM2MDAwMAorMzIgMSAxNTM4MDAwMAorMzIgMSAxNTQwMDAwMAorMzIgMSAxNTQyMDAwMAorMzIgMSAxNTQ0MDAwMAorMzIgMSAxNTQ2MDAwMAorMzIgMSAxNTQ4MDAwMAorMzIgMSAxNTUwMDAwMAorMzIgMSAxNTUyMDAwMAorMzIgMSAxNTU0MDAwMAorMzIgMSAxNTU2MDAwMAorMzIgMSAxNTU4MDAwMAorMzIgMSAxNTYwMDAwMAorMzIgMSAxNTYyMDAwMAorMzIgMSAxNTY0MDAwMAorMzIgMSAxNTY2MDAwMAorMzIgMSAxNTY4MDAwMAorMzIgMSAxNTcwMDAwMAorMzIgMSAxNTcyMDAwMAorMzIgMSAxNTc0MDAwMAorMzIgMSAxNTc2MDAwMAorMzIgMSAxNTc4MDAwMAorMzIgMSAxNTgwMDAwMAorMzIgMSAxNTgyMDAwMAorMzIgMSAxNTg0MDAwMAorMzIgMSAxNTg2MDAwMAorMzIgMSAxNTg4MDAwMAorMzIgMSAxNTkwMDAwMAorMzIgMSAxNTkyMDAwMAorMzIgMSAxNTk0MDAwMAorMzIgMSAxNTk2MDAwMAorMzIgMSAxNTk4MDAwMAorMzIgMSAxNjAwMDAwMAorMzIgMSAxNjAyMDAwMAorMzIgMSAxNjA0MDAwMAorMzIgMSAxNjA2MDAwMAorMzIgMSAxNjA4MDAwMAorMzIgMSAxNjEwMDAwMAorMzIgMSAxNjEyMDAwMAorMzIgMSAxNjE0MDAwMAorMzIgMSAxNjE2MDAwMAorMzIgMSAxNjE4MDAwMAorMzIgMSAxNjIwMDAwMAorMzIgMSAxNjIyMDAwMAorMzIgMSAxNjI0MDAwMAorMzIgMSAxNjI2MDAwMAorMzIgMSAxNjI4MDAwMAorMzIgMSAxNjMwMDAwMAorMzIgMSAxNjMyMDAwMAorMzIgMSAxNjM0MDAwMAorMzIgMSAxNjM2MDAwMAorMzIgMSAxNjM4MDAwMAorMzIgMSAxNjQwMDAwMAorMzIgMSAxNjQyMDAwMAorMzIgMSAxNjQ0MDAwMAorMzIgMSAxNjQ2MDAwMAorMzIgMSAxNjQ4MDAwMAorMzIgMSAxNjUwMDAwMAorMzIgMSAxNjUyMDAwMAorMzIgMSAxNjU0MDAwMAorMzIgMSAxNjU2MDAwMAorMzIgMSAxNjU4MDAwMAorMzIgMSAxNjYwMDAwMAorMzIgMSAxNjYyMDAwMAorMzIgMSAxNjY0MDAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy92aWRlby9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy92aWRlby9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNTdlZTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3ZpZGVvL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNIaWRsQzJWMV8wVGFyZ2V0VmlkZW9EZWNUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNNZWRpYUMyVjFfMERlZmF1bHRzIl0sCisgICAgc3JjczogWyJWdHNIaWRsQzJWMV8wVGFyZ2V0VmlkZW9EZWNUZXN0LmNwcCJdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiVnRzSGlkbEMyVjFfMFRhcmdldFZpZGVvRW5jVGVzdCIsCisgICAgZGVmYXVsdHM6IFsiVnRzTWVkaWFDMlYxXzBEZWZhdWx0cyJdLAorICAgIHNyY3M6IFsiVnRzSGlkbEMyVjFfMFRhcmdldFZpZGVvRW5jVGVzdC5jcHAiXSwKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy92aWRlby9WdHNIaWRsQzJWMV8wVGFyZ2V0VmlkZW9EZWNUZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvdmlkZW8vVnRzSGlkbEMyVjFfMFRhcmdldFZpZGVvRGVjVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNiYjdhNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvdmlkZW8vVnRzSGlkbEMyVjFfMFRhcmdldFZpZGVvRGVjVGVzdC5jcHAKQEAgLTAsMCArMSw4NzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImNvZGVjMl9oaWRsX2hhbF92aWRlb19kZWNfdGVzdCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGZzdHJlYW0+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKyNpbmNsdWRlIDxDMkFsbG9jYXRvcklvbi5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJCdWZmZXJQcml2Lmg+CisKK3VzaW5nIGFuZHJvaWQ6OkMyQWxsb2NhdG9ySW9uOworCisjaW5jbHVkZSA8VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlLmg+CisjaW5jbHVkZSAibWVkaWFfYzJfdmlkZW9faGlkbF90ZXN0X2NvbW1vbi5oIgorI2luY2x1ZGUgIm1lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uaCIKKworc3RydWN0IEZyYW1lSW5mbyB7CisgICAgaW50IGJ5dGVzQ291bnQ7CisgICAgdWludDMyX3QgZmxhZ3M7CisgICAgaW50NjRfdCB0aW1lc3RhbXA7Cit9OworCitjbGFzcyBMaW5lYXJCdWZmZXIgOiBwdWJsaWMgQzJCdWZmZXIgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IExpbmVhckJ1ZmZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4mIGJsb2NrKQorICAgICAgICA6IEMyQnVmZmVyKAorICAgICAgICAgICAgICB7YmxvY2stPnNoYXJlKGJsb2NrLT5vZmZzZXQoKSwgYmxvY2stPnNpemUoKSwgOjpDMkZlbmNlKCkpfSkge30KK307CisKK3N0YXRpYyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQqIGdFbnYgPSBudWxscHRyOworCituYW1lc3BhY2UgeworCitjbGFzcyBDb2RlYzJWaWRlb0RlY0hpZGxUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIHsKKyAgIHByaXZhdGU6CisgICAgdHlwZWRlZiA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZSBTdXBlcjsKKworICAgcHVibGljOgorICAgIDo6c3RkOjpzdHJpbmcgZ2V0VGVzdENhc2VJbmZvKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gOjpzdGQ6OnN0cmluZygpICsKKyAgICAgICAgICAgICAgICAiQ29tcG9uZW50OiAiICsgZ0Vudi0+Z2V0Q29tcG9uZW50KCkuY19zdHIoKSArICIgfCAiICsKKyAgICAgICAgICAgICAgICAiSW5zdGFuY2U6ICIgKyBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkgKyAiIHwgIiArCisgICAgICAgICAgICAgICAgIlJlczogIiArIGdFbnYtPmdldFJlcygpLmNfc3RyKCk7CisgICAgfQorCisgICAgLy8gZ29vZ2xlLmNvZGVjMiBWaWRlbyB0ZXN0IHNldHVwCisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBTdXBlcjo6U2V0VXAoKTsKKyAgICAgICAgbURpc2FibGVUZXN0ID0gZmFsc2U7CisgICAgICAgIEFMT0dWKCJDb2RlYzJWaWRlb0RlY0hpZGxUZXN0IFNldFVwIik7CisgICAgICAgIG1DbGllbnQgPSBhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKAorICAgICAgICAgICAgZ0Vudi0+Z2V0SW5zdGFuY2UoKS5jX3N0cigpKTsKKyAgICAgICAgQVNTRVJUX05FKG1DbGllbnQsIG51bGxwdHIpOworICAgICAgICBtTGlzdGVuZXIucmVzZXQobmV3IENvZGVjTGlzdGVuZXIoCisgICAgICAgICAgICBbdGhpc10oc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlV29ya0RvbmUod29ya0l0ZW1zKTsKKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgQVNTRVJUX05FKG1MaXN0ZW5lciwgbnVsbHB0cik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0lOUFVUX0JVRkZFUlM7ICsraSkgeworICAgICAgICAgICAgbVdvcmtRdWV1ZS5lbXBsYWNlX2JhY2sobmV3IEMyV29yayk7CisgICAgICAgIH0KKyAgICAgICAgbUNsaWVudC0+Y3JlYXRlQ29tcG9uZW50KGdFbnYtPmdldENvbXBvbmVudCgpLmNfc3RyKCksIG1MaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ29tcG9uZW50KTsKKyAgICAgICAgQVNTRVJUX05FKG1Db21wb25lbnQsIG51bGxwdHIpOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBzdG9yZSA9CisgICAgICAgICAgICBhbmRyb2lkOjpHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisgICAgICAgIENIRUNLX0VRKHN0b3JlLT5mZXRjaEFsbG9jYXRvcihDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtTGluZWFyQWxsb2NhdG9yKSwKKyAgICAgICAgICAgICAgICAgQzJfT0spOworICAgICAgICBtTGluZWFyUG9vbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2w+KG1MaW5lYXJBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJsb2NrUG9vbElkKyspOworICAgICAgICBBU1NFUlRfTkUobUxpbmVhclBvb2wsIG51bGxwdHIpOworCisgICAgICAgIG1Db21wTmFtZSA9IHVua25vd25fY29tcDsKKyAgICAgICAgc3RydWN0IFN0cmluZ1RvTmFtZSB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBOYW1lOworICAgICAgICAgICAgc3RhbmRhcmRDb21wIENvbXBOYW1lOworICAgICAgICB9OworCisgICAgICAgIGNvbnN0IFN0cmluZ1RvTmFtZSBrU3RyaW5nVG9OYW1lW10gPSB7CisgICAgICAgICAgICB7ImgyNjMiLCBoMjYzfSwgeyJhdmMiLCBhdmN9LCB7Im1wZWcyIiwgbXBlZzJ9LCB7Im1wZWc0IiwgbXBlZzR9LAorICAgICAgICAgICAgeyJoZXZjIiwgaGV2Y30sIHsidnA4IiwgdnA4fSwgeyJ2cDkiLCB2cDl9LCB7ImF2MSIsIGF2MX0sCisgICAgICAgIH07CisKKyAgICAgICAgY29uc3Qgc2l6ZV90IGtOdW1TdHJpbmdUb05hbWUgPQorICAgICAgICAgICAgc2l6ZW9mKGtTdHJpbmdUb05hbWUpIC8gc2l6ZW9mKGtTdHJpbmdUb05hbWVbMF0pOworCisgICAgICAgIHN0ZDo6c3RyaW5nIHN1YnN0cmluZzsKKyAgICAgICAgc3RkOjpzdHJpbmcgY29tcDsKKyAgICAgICAgc3Vic3RyaW5nID0gc3RkOjpzdHJpbmcoZ0Vudi0+Z2V0Q29tcG9uZW50KCkpOworICAgICAgICAvKiBUT0RPOiBiZXR0ZXIgYXBwcm9hY2ggdG8gZmluZCB0aGUgY29tcG9uZW50ICovCisgICAgICAgIC8qICJjMi5hbmRyb2lkLiIgPT4gMTF0aCBwb3NpdGlvbiAqLworICAgICAgICBzaXplX3QgcG9zID0gMTE7CisgICAgICAgIHNpemVfdCBsZW4gPSBzdWJzdHJpbmcuZmluZCgiLmRlY29kZXIiLCBwb3MpOworICAgICAgICBjb21wID0gc3Vic3RyaW5nLnN1YnN0cihwb3MsIGxlbiAtIHBvcyk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtU3RyaW5nVG9OYW1lOyArK2kpIHsKKyAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChjb21wLmNfc3RyKCksIGtTdHJpbmdUb05hbWVbaV0uTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBtQ29tcE5hbWUgPSBrU3RyaW5nVG9OYW1lW2ldLkNvbXBOYW1lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Fb3MgPSBmYWxzZTsKKyAgICAgICAgbUZyYW1lc1JlY2VpdmVkID0gMDsKKyAgICAgICAgbVRpbWVzdGFtcFVzID0gMHU7CisgICAgICAgIG1UaW1lc3RhbXBEZXZUZXN0ID0gZmFsc2U7CisgICAgICAgIGlmIChtQ29tcE5hbWUgPT0gdW5rbm93bl9jb21wKSBtRGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICBpZiAobURpc2FibGVUZXN0KSBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IERpc2FibGVkIFxuIjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtQ29tcG9uZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGlmICg6OnRlc3Rpbmc6OlRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSByZXR1cm47CisgICAgICAgICAgICBtQ29tcG9uZW50LT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQ29tcG9uZW50ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBTdXBlcjo6VGVhckRvd24oKTsKKyAgICB9CisKKyAgICAvLyBjYWxsYmFjayBmdW5jdGlvbiB0byBwcm9jZXNzIG9uV29ya0RvbmUgcmVjZWl2ZWQgYnkgTGlzdGVuZXIKKyAgICB2b2lkIGhhbmRsZVdvcmtEb25lKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgeworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogd29ya0l0ZW1zKSB7CisgICAgICAgICAgICBpZiAoIXdvcmstPndvcmtsZXRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBGb3IgZGVjb2RlciBjb21wb25lbnRzIGN1cnJlbnQgdGltZXN0YW1wIGFsd2F5cyBleGNlZWRzCisgICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgdGltZXN0YW1wCisgICAgICAgICAgICAgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgICAgICAgICAgICAgIGJvb2wgY29kZWNDb25maWcgPSAoKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwKTsKKyAgICAgICAgICAgICAgICBpZiAoIWNvZGVjQ29uZmlnICYmCisgICAgICAgICAgICAgICAgICAgICF3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIEVYUEVDVF9HRSgKKyAgICAgICAgICAgICAgICAgICAgICAgICh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wVXMpOworICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wVXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCk7CisKKyAgICAgICAgICAgICAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1UaW1lc3RhbXBEZXZUZXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRzSGl0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBpdCA9IG1UaW1lc3RhbXBVc2xpc3QuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpdCAhPSBtVGltZXN0YW1wVXNsaXN0LmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCppdCA9PSBtVGltZXN0YW1wVXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFVzbGlzdC5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzSGl0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0Kys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHNIaXQgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVRpbWVzdGFtcFVzbGlzdC5lbXB0eSgpID09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYUEVDVF9FUSh0c0hpdCwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJUaW1lU3RhbXAgbm90IHJlY29nbml6ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIElORk8gICBdIFJlY2VpdmVkIG5vbi16ZXJvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXQgLyBUaW1lU3RhbXAgbm90IHJlY29nbml6ZWQgXG4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBib29sIG1Dc2Q7CisgICAgICAgICAgICAgICAgd29ya0RvbmUobUNvbXBvbmVudCwgd29yaywgbUZsdXNoZWRJbmRpY2VzLCBtUXVldWVMb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUVvcywgbUNzZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzUmVjZWl2ZWQpOworICAgICAgICAgICAgICAgICh2b2lkKW1Dc2Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbnVtIHN0YW5kYXJkQ29tcCB7CisgICAgICAgIGgyNjMsCisgICAgICAgIGF2YywKKyAgICAgICAgbXBlZzIsCisgICAgICAgIG1wZWc0LAorICAgICAgICBoZXZjLAorICAgICAgICB2cDgsCisgICAgICAgIHZwOSwKKyAgICAgICAgYXYxLAorICAgICAgICB1bmtub3duX2NvbXAsCisgICAgfTsKKworICAgIGJvb2wgbUVvczsKKyAgICBib29sIG1EaXNhYmxlVGVzdDsKKyAgICBib29sIG1UaW1lc3RhbXBEZXZUZXN0OworICAgIHVpbnQ2NF90IG1UaW1lc3RhbXBVczsKKyAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+IG1UaW1lc3RhbXBVc2xpc3Q7CisgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiBtRmx1c2hlZEluZGljZXM7CisgICAgc3RhbmRhcmRDb21wIG1Db21wTmFtZTsKKyAgICB1aW50MzJfdCBtRnJhbWVzUmVjZWl2ZWQ7CisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbUJsb2NrUG9vbElkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gbUxpbmVhclBvb2w7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtTGluZWFyQWxsb2NhdG9yOworCisgICAgc3RkOjptdXRleCBtUXVldWVMb2NrOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1RdWV1ZUNvbmRpdGlvbjsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IG1Xb3JrUXVldWU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBtQ29tcG9uZW50OworCisgICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgICB9Cit9OworCit2b2lkIHZhbGlkYXRlQ29tcG9uZW50KAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICBDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcE5hbWUsIGJvb2wmIGRpc2FibGVUZXN0KSB7CisgICAgLy8gVmFsaWRhdGUgaXRzIGEgQzIgQ29tcG9uZW50CisgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImMyIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0UoIk5vdCBhIGMyIGNvbXBvbmVudCIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZSBpdHMgbm90IGFuIGVuY29kZXIgYW5kIHRoZSBjb21wb25lbnQgdG8gYmUgdGVzdGVkIGlzIHZpZGVvCisgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImVuY29kZXIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgRGVjb2RlciwgZ2l2ZW4gRW5jb2RlciIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBxdWVyaWVkOworICAgIGMyX3N0YXR1c190IGMyZXJyID0KKyAgICAgICAgY29tcG9uZW50LT5xdWVyeSh7fSwge0MyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0OjpQQVJBTV9UWVBFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgaWYgKGMyZXJyICE9IEMyX09LICYmIHF1ZXJpZWQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgQUxPR0UoIlF1ZXJ5IG1lZGlhIHR5cGUgZmFpbGVkID0+ICVkIiwgYzJlcnIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGlucHV0RG9tYWluID0KKyAgICAgICAgICAgICgoQzJTdHJlYW1NZWRpYVR5cGVTZXR0aW5nOjppbnB1dCopcXVlcmllZFswXS5nZXQoKSktPm0udmFsdWU7CisgICAgICAgIGlmIChpbnB1dERvbWFpbi5maW5kKCJ2aWRlby8iKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgQUxPR0UoIkV4cGVjdGVkIFZpZGVvIENvbXBvbmVudCIpOworICAgICAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVmFsaWRhdGVzIGNvbXBvbmVudCBuYW1lCisgICAgaWYgKGNvbXBOYW1lID09IENvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnVua25vd25fY29tcCkgeworICAgICAgICBBTE9HRSgiQ29tcG9uZW50IEluVmFsaWQiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJDb21wb25lbnQgVmFsaWQiKTsKK30KKworLy8gbnVtYmVyIG9mIGVsZW1lbnRhcnkgc3RyZWFtcyBwZXIgY29tcG9uZW50CisjZGVmaW5lIFNUUkVBTV9DT1VOVCAyCisvLyBMb29rVXBUYWJsZSBvZiBjbGlwcyBhbmQgbWV0YWRhdGEgZm9yIGNvbXBvbmVudCB0ZXN0aW5nCit2b2lkIEdldFVSTEZvckNvbXBvbmVudChDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcCwgY2hhciogbVVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGluZm8sIHNpemVfdCBzdHJlYW1JbmRleCA9IDEpIHsKKyAgICBzdHJ1Y3QgQ29tcFRvVVJMIHsKKyAgICAgICAgQ29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXA7CisgICAgICAgIGNvbnN0IGNoYXIgbVVSTFtTVFJFQU1fQ09VTlRdWzUxMl07CisgICAgICAgIGNvbnN0IGNoYXIgaW5mb1tTVFJFQU1fQ09VTlRdWzUxMl07CisgICAgfTsKKyAgICBBU1NFUlRfVFJVRShzdHJlYW1JbmRleCA8IFNUUkVBTV9DT1VOVCk7CisKKyAgICBzdGF0aWMgY29uc3QgQ29tcFRvVVJMIGtDb21wVG9VUkxbXSA9IHsKKyAgICAgICAge0NvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6YXZjLAorICAgICAgICAgeyJiYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5oMjY0IiwKKyAgICAgICAgICAiYmJiX2F2Y182NDB4MzYwXzc2OGticHNfMzBmcHMuaDI2NCJ9LAorICAgICAgICAgeyJiYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5pbmZvIiwKKyAgICAgICAgICAiYmJiX2F2Y182NDB4MzYwXzc2OGticHNfMzBmcHMuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6aGV2YywKKyAgICAgICAgIHsiYmJiX2hldmNfMTc2eDE0NF8xNzZrYnBzXzYwZnBzLmhldmMiLAorICAgICAgICAgICJiYmJfaGV2Y182NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmhldmMifSwKKyAgICAgICAgIHsiYmJiX2hldmNfMTc2eDE0NF8xNzZrYnBzXzYwZnBzLmluZm8iLAorICAgICAgICAgICJiYmJfaGV2Y182NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6Om1wZWcyLAorICAgICAgICAgeyJiYmJfbXBlZzJfMTc2eDE0NF8xMDVrYnBzXzI1ZnBzLm0ydiIsCisgICAgICAgICAgImJiYl9tcGVnMl8zNTJ4Mjg4XzFtYnBzXzYwZnBzLm0ydiJ9LAorICAgICAgICAgeyJiYmJfbXBlZzJfMTc2eDE0NF8xMDVrYnBzXzI1ZnBzLmluZm8iLAorICAgICAgICAgICJiYmJfbXBlZzJfMzUyeDI4OF8xbWJwc182MGZwcy5pbmZvIn19LAorICAgICAgICB7Q29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpoMjYzLAorICAgICAgICAgeyIiLCAiYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmgyNjMifSwKKyAgICAgICAgIHsiIiwgImJiYl9oMjYzXzM1MngyODhfMzAwa2Jwc18xMmZwcy5pbmZvIn19LAorICAgICAgICB7Q29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjptcGVnNCwKKyAgICAgICAgIHsiIiwgImJiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMubTR2In0sCisgICAgICAgICB7IiIsICJiYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OnZwOCwKKyAgICAgICAgIHsiYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMudnA4IiwKKyAgICAgICAgICAiYmJiX3ZwOF82NDB4MzYwXzJtYnBzXzMwZnBzLnZwOCJ9LAorICAgICAgICAgeyJiYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy5pbmZvIiwKKyAgICAgICAgICAiYmJiX3ZwOF82NDB4MzYwXzJtYnBzXzMwZnBzLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OnZwOSwKKyAgICAgICAgIHsiYmJiX3ZwOV8xNzZ4MTQ0XzI4NWticHNfNjBmcHMudnA5IiwKKyAgICAgICAgICAiYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzLnZwOSJ9LAorICAgICAgICAgeyJiYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy5pbmZvIiwKKyAgICAgICAgICAiYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmF2MSwKKyAgICAgICAgIHsiYmJiX2F2MV82NDBfMzYwLmF2MSIsCisgICAgICAgICAgImJiYl9hdjFfMTc2XzE0NC5hdjEifSwKKyAgICAgICAgIHsiYmJiX2F2MV82NDBfMzYwLmluZm8iLAorICAgICAgICAgICJiYmJfYXYxXzE3Nl8xNDQuaW5mbyJ9fSwKKyAgICB9OworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2Yoa0NvbXBUb1VSTCkgLyBzaXplb2Yoa0NvbXBUb1VSTFswXSk7ICsraSkgeworICAgICAgICBpZiAoa0NvbXBUb1VSTFtpXS5jb21wID09IGNvbXApIHsKKyAgICAgICAgICAgIHN0cmNhdChtVVJMLCBrQ29tcFRvVVJMW2ldLm1VUkxbc3RyZWFtSW5kZXhdKTsKKyAgICAgICAgICAgIHN0cmNhdChpbmZvLCBrQ29tcFRvVVJMW2ldLmluZm9bc3RyZWFtSW5kZXhdKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBkZWNvZGVORnJhbWVzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Om11dGV4ICZxdWV1ZUxvY2ssIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlJiBxdWV1ZUNvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiYgZmx1c2hlZEluZGljZXMsCisgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgbGluZWFyUG9vbCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omlmc3RyZWFtJiBlbGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4qIEluZm8sCisgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwgaW50IHJhbmdlLCBib29sIHNpZ25hbEVPUyA9IHRydWUpIHsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgaW50IGZyYW1lSUQgPSBvZmZzZXQ7CisgICAgaW50IG1heFJldHJ5ID0gMDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoZnJhbWVJRCA9PSAoaW50KUluZm8tPnNpemUoKSB8fCBmcmFtZUlEID09IChvZmZzZXQgKyByYW5nZSkpIGJyZWFrOworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgIC8vIFByZXBhcmUgQzJXb3JrCisgICAgICAgIHdoaWxlICghd29yayAmJiAobWF4UmV0cnkgPCBNQVhfUkVUUlkpKSB7CisgICAgICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgICAgICBpZiAoIXdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgd29yay5zd2FwKHdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgICAgICB3b3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIFRJTUVfT1VUKTsKKyAgICAgICAgICAgICAgICBtYXhSZXRyeSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghd29yayAmJiAobWF4UmV0cnkgPj0gTUFYX1JFVFJZKSkgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJXYWl0IGZvciBnZW5lcmF0aW5nIEMyV29yayBleGNlZWRlZCB0aW1lb3V0IjsKKyAgICAgICAgfQorICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCA9ICgqSW5mbylbZnJhbWVJRF0udGltZXN0YW1wOworICAgICAgICBpZiAoKCpJbmZvKVtmcmFtZUlEXS5mbGFncykgZmxhZ3MgPSAoMSA8PCAoKCpJbmZvKVtmcmFtZUlEXS5mbGFncyAtIDEpKTsKKyAgICAgICAgaWYgKHNpZ25hbEVPUyAmJiAoKGZyYW1lSUQgPT0gKGludClJbmZvLT5zaXplKCkgLSAxKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAoZnJhbWVJRCA9PSAob2Zmc2V0ICsgcmFuZ2UgLSAxKSkpKQorICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKworICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IGZyYW1lSUQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgICAgIGZsdXNoZWRJbmRpY2VzLmVtcGxhY2VfYmFjayhmcmFtZUlEKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBzaXplID0gKCpJbmZvKVtmcmFtZUlEXS5ieXRlc0NvdW50OworICAgICAgICBjaGFyKiBkYXRhID0gKGNoYXIqKW1hbGxvYyhzaXplKTsKKyAgICAgICAgQVNTRVJUX05FKGRhdGEsIG51bGxwdHIpOworCisgICAgICAgIGVsZVN0cmVhbS5yZWFkKGRhdGEsIHNpemUpOworICAgICAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmdjb3VudCgpLCBzaXplKTsKKworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIGlmIChzaXplKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgICAgICAgICBBU1NFUlRfRVEoQzJfT0ssCisgICAgICAgICAgICAgICAgICAgIGxpbmVhclBvb2wtPmZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX0sCisgICAgICAgICAgICAgICAgICAgICAgICAmYmxvY2spKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGJsb2NrKTsKKworICAgICAgICAgICAgLy8gV3JpdGUgVmlldworICAgICAgICAgICAgQzJXcml0ZVZpZXcgdmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkMyTGluZWFyQmxvY2s6Om1hcCgpIGZhaWxlZCA6ICVkIiwgdmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFTU0VSVF9FUSgoc2l6ZV90KXNpemUsIHZpZXcuY2FwYWNpdHkoKSk7CisgICAgICAgICAgICBBU1NFUlRfRVEoMHUsIHZpZXcub2Zmc2V0KCkpOworICAgICAgICAgICAgQVNTRVJUX0VRKChzaXplX3Qpc2l6ZSwgdmlldy5zaXplKCkpOworCisgICAgICAgICAgICBtZW1jcHkodmlldy5iYXNlKCksIGRhdGEsIHNpemUpOworCisgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmVtcGxhY2VfYmFjayhuZXcgTGluZWFyQnVmZmVyKGJsb2NrKSk7CisgICAgICAgICAgICBmcmVlKGRhdGEpOworICAgICAgICB9CisgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICAgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisKKyAgICAgICAgLy8gRE8gVEhFIERFQ09ESU5HCisgICAgICAgIEFTU0VSVF9FUShjb21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKyAgICAgICAgQUxPR1YoIkZyYW1lICMlZCBzaXplID0gJWQgcXVldWVkIiwgZnJhbWVJRCwgc2l6ZSk7CisgICAgICAgIGZyYW1lSUQrKzsKKyAgICAgICAgbWF4UmV0cnkgPSAwOworICAgIH0KK30KKworVEVTVF9GKENvZGVjMlZpZGVvRGVjSGlkbFRlc3QsIHZhbGlkYXRlQ29tcE5hbWUpIHsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQUxPR1YoIkNoZWNrcyBpZiB0aGUgZ2l2ZW4gY29tcG9uZW50IGlzIGEgdmFsaWQgdmlkZW8gY29tcG9uZW50Iik7CisgICAgdmFsaWRhdGVDb21wb25lbnQobUNvbXBvbmVudCwgbUNvbXBOYW1lLCBtRGlzYWJsZVRlc3QpOworICAgIEFTU0VSVF9FUShtRGlzYWJsZVRlc3QsIGZhbHNlKTsKK30KKworY2xhc3MgQ29kZWMyVmlkZW9EZWNEZWNvZGVUZXN0IDogcHVibGljIENvZGVjMlZpZGVvRGVjSGlkbFRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8aW50MzJfdD4geworfTsKKworLy8gQml0c3RyZWFtIFRlc3QKK1RFU1RfUChDb2RlYzJWaWRlb0RlY0RlY29kZVRlc3QsIERlY29kZVRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiRGVjb2RlcyBpbnB1dCBmaWxlIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgdWludDMyX3Qgc3RyZWFtSW5kZXggPSBHZXRQYXJhbSgpOworICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW0sIGVsZUluZm87CisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIHN0cmNweShpbmZvLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvLCBzdHJlYW1JbmRleCk7CisKKyAgICBlbGVJbmZvLm9wZW4oaW5mbyk7CisgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKSA8PCBtVVJMIDw8ICIgLSBmaWxlIG5vdCBmb3VuZCI7CisgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4gSW5mbzsKKyAgICBpbnQgYnl0ZXNDb3VudCA9IDA7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IDA7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCEoZWxlSW5mbyA+PiBieXRlc0NvdW50KSkgYnJlYWs7CisgICAgICAgIGVsZUluZm8gPj4gZmxhZ3M7CisgICAgICAgIGVsZUluZm8gPj4gdGltZXN0YW1wOworICAgICAgICBib29sIGNvZGVjQ29uZmlnID0gZmxhZ3MgPworICAgICAgICAgICAgKCgxIDw8IChmbGFncyAtIDEpKSAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMCA6IDA7CisgICAgICAgIGlmIChtVGltZXN0YW1wRGV2VGVzdCAmJiAhY29kZWNDb25maWcpCisgICAgICAgICAgICBtVGltZXN0YW1wVXNsaXN0LnB1c2hfYmFjayh0aW1lc3RhbXApOworICAgICAgICBJbmZvLnB1c2hfYmFjayh7Ynl0ZXNDb3VudCwgZmxhZ3MsIHRpbWVzdGFtcH0pOworICAgIH0KKyAgICBlbGVJbmZvLmNsb3NlKCk7CisKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIC8vIFJlc2V0IHRvdGFsIG5vIG9mIGZyYW1lcyByZWNlaXZlZAorICAgIG1GcmFtZXNSZWNlaXZlZCA9IDA7CisgICAgbVRpbWVzdGFtcFVzID0gMDsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZGVjb2RlTkZyYW1lcygKKyAgICAgICAgbUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRmx1c2hlZEluZGljZXMsCisgICAgICAgIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sICZJbmZvLCAwLCAoaW50KUluZm8uc2l6ZSgpKSk7CisKKyAgICAvLyBibG9ja2luZyBjYWxsIHRvIGVuc3VyZXMgYXBwbGljYXRpb24gdG8gV2FpdCB0aWxsIGFsbCB0aGUgaW5wdXRzIGFyZQorICAgIC8vIGNvbnN1bWVkCisgICAgaWYgKCFtRW9zKSB7CisgICAgICAgIEFMT0dWKCJXYWl0aW5nIGZvciBpbnB1dCBjb25zdW1wdGlvbiIpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisgICAgfQorCisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgaWYgKG1GcmFtZXNSZWNlaXZlZCAhPSBJbmZvLnNpemUoKSkgeworICAgICAgICBBTE9HRSgiSW5wdXQgYnVmZmVyIGNvdW50IGFuZCBPdXRwdXQgYnVmZmVyIGNvdW50IG1pc21hdGNoIik7CisgICAgICAgIEFMT0dWKCJmcmFtZXNSZWNlaXZlZCA6ICVkIGlucHV0RnJhbWVzIDogJXp1IiwgbUZyYW1lc1JlY2VpdmVkLAorICAgICAgICAgICAgICBJbmZvLnNpemUoKSk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisKKyAgICBpZiAobVRpbWVzdGFtcERldlRlc3QpIEVYUEVDVF9FUShtVGltZXN0YW1wVXNsaXN0LmVtcHR5KCksIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU3RyZWFtSW5kZXhlcywgQ29kZWMyVmlkZW9EZWNEZWNvZGVUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoMCwgMSkpOworCisvLyBBZGFwdGl2ZSBUZXN0CitURVNUX0YoQ29kZWMyVmlkZW9EZWNIaWRsVGVzdCwgQWRhcHRpdmVEZWNvZGVUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIkFkYXB0aXZlIERlY29kZSBUZXN0Iik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIGlmICghKG1Db21wTmFtZSA9PSBhdmMgfHwgbUNvbXBOYW1lID09IGhldmMgfHwgbUNvbXBOYW1lID09IHZwOCB8fAorICAgICAgICAgIG1Db21wTmFtZSA9PSB2cDkgfHwgbUNvbXBOYW1lID09IG1wZWcyKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICBtVGltZXN0YW1wRGV2VGVzdCA9IHRydWU7CisgICAgdWludDMyX3QgdGltZXN0YW1wT2Zmc2V0ID0gMDsKKyAgICB1aW50MzJfdCBvZmZzZXQgPSAwOworICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFNUUkVBTV9DT1VOVCAqIDI7IGkrKykgeworICAgICAgICBjaGFyIG1VUkxbNTEyXSwgaW5mb1s1MTJdOworICAgICAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbSwgZWxlSW5mbzsKKworICAgICAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgICAgIHN0cmNweShpbmZvLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICAgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbywgaSAlIFNUUkVBTV9DT1VOVCk7CisKKyAgICAgICAgZWxlSW5mby5vcGVuKGluZm8pOworICAgICAgICBBU1NFUlRfRVEoZWxlSW5mby5pc19vcGVuKCksIHRydWUpIDw8IG1VUkwgPDwgIiAtIGZpbGUgbm90IGZvdW5kIjsKKyAgICAgICAgaW50IGJ5dGVzQ291bnQgPSAwOworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IDA7CisgICAgICAgIHVpbnQzMl90IHRpbWVzdGFtcE1heCA9IDA7CisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBpZiAoIShlbGVJbmZvID4+IGJ5dGVzQ291bnQpKSBicmVhazsKKyAgICAgICAgICAgIGVsZUluZm8gPj4gZmxhZ3M7CisgICAgICAgICAgICBlbGVJbmZvID4+IHRpbWVzdGFtcDsKKyAgICAgICAgICAgIHRpbWVzdGFtcCArPSB0aW1lc3RhbXBPZmZzZXQ7CisgICAgICAgICAgICBJbmZvLnB1c2hfYmFjayh7Ynl0ZXNDb3VudCwgZmxhZ3MsIHRpbWVzdGFtcH0pOworICAgICAgICAgICAgYm9vbCBjb2RlY0NvbmZpZyA9IGZsYWdzID8KKyAgICAgICAgICAgICAgICAoKDEgPDwgKGZsYWdzIC0gMSkpICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwIDogMDsKKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgICAgICAgICAgaWYgKG1UaW1lc3RhbXBEZXZUZXN0ICYmICFjb2RlY0NvbmZpZykKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFVzbGlzdC5wdXNoX2JhY2sodGltZXN0YW1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aW1lc3RhbXBNYXggPCB0aW1lc3RhbXApIHRpbWVzdGFtcE1heCA9IHRpbWVzdGFtcDsKKyAgICAgICAgfQorICAgICAgICB0aW1lc3RhbXBPZmZzZXQgPSB0aW1lc3RhbXBNYXg7CisgICAgICAgIGVsZUluZm8uY2xvc2UoKTsKKworICAgICAgICAvLyBSZXNldCBUb3RhbCBmcmFtZXMgYmVmb3JlIHNlY29uZCBkZWNvZGUgbG9vcAorICAgICAgICAvLyBtRnJhbWVzUmVjZWl2ZWQgPSAwOworICAgICAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICBkZWNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCAoaW50KShJbmZvLnNpemUoKSAtIG9mZnNldCksIGZhbHNlKSk7CisKKyAgICAgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgICAgIG9mZnNldCA9IChpbnQpSW5mby5zaXplKCk7CisgICAgfQorCisgICAgLy8gU2VuZCBFT1MKKyAgICAvLyBUT0RPIEFkZCBmdW5jdGlvbiB0byBzZW5kIEVPUyB3b3JrIGl0ZW0KKyAgICBpbnQgbWF4UmV0cnkgPSAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgd2hpbGUgKCF3b3JrICYmIChtYXhSZXRyeSA8IE1BWF9SRVRSWSkpIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgaWYgKCFtV29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHdvcmsuc3dhcChtV29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgbVdvcmtRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgICAgICBtYXhSZXRyeSsrOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gMDsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSAwOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKworICAgIC8vIGJsb2NraW5nIGNhbGwgdG8gZW5zdXJlcyBhcHBsaWNhdGlvbiB0byBXYWl0IHRpbGwgYWxsIHRoZSBpbnB1dHMgYXJlCisgICAgLy8gY29uc3VtZWQKKyAgICBBTE9HVigiV2FpdGluZyBmb3IgaW5wdXQgY29uc3VtcHRpb24iKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKworICAgIGlmIChtRnJhbWVzUmVjZWl2ZWQgIT0gKChJbmZvLnNpemUoKSkgKyAxKSkgeworICAgICAgICBBTE9HRSgiSW5wdXQgYnVmZmVyIGNvdW50IGFuZCBPdXRwdXQgYnVmZmVyIGNvdW50IG1pc21hdGNoIik7CisgICAgICAgIEFMT0dWKCJmcmFtZXNSZWNlaXZlZCA6ICVkIGlucHV0RnJhbWVzIDogJXp1IiwgbUZyYW1lc1JlY2VpdmVkLAorICAgICAgICAgICAgICBJbmZvLnNpemUoKSArIDEpOworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorCisgICAgaWYgKG1UaW1lc3RhbXBEZXZUZXN0KSBFWFBFQ1RfRVEobVRpbWVzdGFtcFVzbGlzdC5lbXB0eSgpLCB0cnVlKTsKK30KKworLy8gdGh1bWJuYWlsIHRlc3QKK1RFU1RfRihDb2RlYzJWaWRlb0RlY0hpZGxUZXN0LCBUaHVtYm5haWxUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3QgUmVxdWVzdCBmb3IgdGh1bWJuYWlsIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgY2hhciBtVVJMWzUxMl0sIGluZm9bNTEyXTsKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbSwgZWxlSW5mbzsKKworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBzdHJjcHkoaW5mbywgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbyk7CisKKyAgICBlbGVJbmZvLm9wZW4oaW5mbyk7CisgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBhbmRyb2lkOjpWZWN0b3I8RnJhbWVJbmZvPiBJbmZvOworICAgIGludCBieXRlc0NvdW50ID0gMDsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgdWludDMyX3QgdGltZXN0YW1wID0gMDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoIShlbGVJbmZvID4+IGJ5dGVzQ291bnQpKSBicmVhazsKKyAgICAgICAgZWxlSW5mbyA+PiBmbGFnczsKKyAgICAgICAgZWxlSW5mbyA+PiB0aW1lc3RhbXA7CisgICAgICAgIEluZm8ucHVzaF9iYWNrKHtieXRlc0NvdW50LCBmbGFncywgdGltZXN0YW1wfSk7CisgICAgfQorICAgIGVsZUluZm8uY2xvc2UoKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTUFYX0lURVJBVElPTlM7IGkrKykgeworICAgICAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworCisgICAgICAgIC8vIHJlcXVlc3QgRU9TIGZvciB0aHVtYm5haWwKKyAgICAgICAgLy8gc2lnbmFsIEVPUyBmbGFnIHdpdGggbGFzdCBmcmFtZQorICAgICAgICBzaXplX3QgaiA9IC0xOworICAgICAgICBkbyB7CisgICAgICAgICAgICBqKys7CisgICAgICAgICAgICBmbGFncyA9IDA7CisgICAgICAgICAgICBpZiAoSW5mb1tqXS5mbGFncykgZmxhZ3MgPSAxdSA8PCAoSW5mb1tqXS5mbGFncyAtIDEpOworCisgICAgICAgIH0gd2hpbGUgKCEoZmxhZ3MgJiBTWU5DX0ZSQU1FKSk7CisgICAgICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZGVjb2RlTkZyYW1lcygKKyAgICAgICAgICAgIG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIDAsIGogKyAxKSk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKyAgICAgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgICAgIEVYUEVDVF9HRShtRnJhbWVzUmVjZWl2ZWQsIDFVKTsKKyAgICAgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgICAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5yZWxlYXNlKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMlZpZGVvRGVjSGlkbFRlc3QsIEVPU1Rlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdCBlbXB0eSBpbnB1dCBidWZmZXIgd2l0aCBFT1MgZmxhZyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgIC8vIFByZXBhcmUgQzJXb3JrCisgICAgeworICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBpZiAoIW1Xb3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgd29yay5zd2FwKG1Xb3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICBtV29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJtV29ya1F1ZXVlIEVtcHR5IGF0IHRoZSBzdGFydCBvZiB0ZXN0IjsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisKKyAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gMDsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSAwOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKworICAgIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgaWYgKG1Xb3JrUXVldWUuc2l6ZSgpICE9IE1BWF9JTlBVVF9CVUZGRVJTKSB7CisgICAgICAgICAgICBtUXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobVdvcmtRdWV1ZS5zaXplKCksIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMlZpZGVvRGVjSGlkbFRlc3QsIEZsdXNoVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0cyBGbHVzaCBjYWxscyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBjaGFyIG1VUkxbNTEyXSwgaW5mb1s1MTJdOworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtLCBlbGVJbmZvOworCisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIHN0cmNweShpbmZvLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvKTsKKworICAgIGVsZUluZm8ub3BlbihpbmZvKTsKKyAgICBBU1NFUlRfRVEoZWxlSW5mby5pc19vcGVuKCksIHRydWUpOworICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgaW50IGJ5dGVzQ291bnQgPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIGJyZWFrOworICAgICAgICBlbGVJbmZvID4+IGZsYWdzOworICAgICAgICBlbGVJbmZvID4+IHRpbWVzdGFtcDsKKyAgICAgICAgSW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICB9CisgICAgZWxlSW5mby5jbG9zZSgpOworCisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgIC8vIERlY29kZSAxMjggZnJhbWVzIGFuZCBmbHVzaC4gaGVyZSAxMjggaXMgY2hvc2VuIHRvIGVuc3VyZSB0aGVyZSBpcyBhIGtleQorICAgIC8vIGZyYW1lIGFmdGVyIHRoaXMgc28gdGhhdCB0aGUgYmVsb3cgc2VjdGlvbiBjYW4gYmUgY292ZXJlZCBmb3IgYWxsCisgICAgLy8gY29tcG9uZW50cworICAgIHVpbnQzMl90IG51bUZyYW1lc0ZsdXNoZWQgPSAxMjg7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZGVjb2RlTkZyYW1lcygKKyAgICAgICAgbUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRmx1c2hlZEluZGljZXMsCisgICAgICAgIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sICZJbmZvLCAwLCBudW1GcmFtZXNGbHVzaGVkLCBmYWxzZSkpOworICAgIC8vIGZsdXNoCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBmbHVzaGVkV29yazsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdClNQVhfSU5QVVRfQlVGRkVSUyAtIGZsdXNoZWRXb3JrLnNpemUoKSkpOworCisgICAgeworICAgICAgICAvLyBVcGRhdGUgbUZsdXNoZWRJbmRpY2VzIGJhc2VkIG9uIHRoZSBpbmRleCByZWNlaXZlZCBmcm9tIGZsdXNoKCkKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgICAgICAgICBhdXRvIGZyYW1lSW5kZXhJdCA9CisgICAgICAgICAgICAgICAgc3RkOjpmaW5kKG1GbHVzaGVkSW5kaWNlcy5iZWdpbigpLCBtRmx1c2hlZEluZGljZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vIFNlZWsgdG8gbmV4dCBrZXkgZnJhbWUgYW5kIHN0YXJ0IGRlY29kaW5nIHRpbGwgdGhlIGVuZAorICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOworICAgIGludCBpbmRleCA9IG51bUZyYW1lc0ZsdXNoZWQ7CisgICAgYm9vbCBrZXlGcmFtZSA9IGZhbHNlOworICAgIGZsYWdzID0gMDsKKyAgICB3aGlsZSAoaW5kZXggPCAoaW50KUluZm8uc2l6ZSgpKSB7CisgICAgICAgIGlmIChJbmZvW2luZGV4XS5mbGFncykgZmxhZ3MgPSAxdSA8PCAoSW5mb1tpbmRleF0uZmxhZ3MgLSAxKTsKKyAgICAgICAgaWYgKChmbGFncyAmIFNZTkNfRlJBTUUpID09IFNZTkNfRlJBTUUpIHsKKyAgICAgICAgICAgIGtleUZyYW1lID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZsYWdzID0gMDsKKyAgICAgICAgZWxlU3RyZWFtLmlnbm9yZShJbmZvW2luZGV4XS5ieXRlc0NvdW50KTsKKyAgICAgICAgaW5kZXgrKzsKKyAgICB9CisgICAgaWYgKGtleUZyYW1lKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgZGVjb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KUluZm8uc2l6ZSgpIC0gaW5kZXgpKTsKKyAgICB9CisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgZXJyID0gbUNvbXBvbmVudC0+Zmx1c2goQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmZsdXNoZWRXb3JrKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMgLSBmbHVzaGVkV29yay5zaXplKCkpKTsKKyAgICB7CisgICAgICAgIC8vIFVwZGF0ZSBtRmx1c2hlZEluZGljZXMgYmFzZWQgb24gdGhlIGluZGV4IHJlY2VpdmVkIGZyb20gZmx1c2goKQorICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogZmx1c2hlZFdvcmspIHsKKyAgICAgICAgICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD46Oml0ZXJhdG9yIGZyYW1lSW5kZXhJdCA9IHN0ZDo6ZmluZCgKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLCBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRmx1c2hlZEluZGljZXMuZW1wdHkoKSwgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyVmlkZW9EZWNIaWRsVGVzdCwgRGVjb2RlVGVzdEVtcHR5QnVmZmVyc0luc2VydGVkKSB7CisgICAgZGVzY3JpcHRpb24oIkRlY29kZSB3aXRoIG11bHRpcGxlIGVtcHR5IGlucHV0IGZyYW1lcyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW0sIGVsZUluZm87CisKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgc3RyY3B5KGluZm8sIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwsIGluZm8pOworCisgICAgZWxlSW5mby5vcGVuKGluZm8pOworICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSkgPDwgbVVSTCA8PCAiIC0gZmlsZSBub3QgZm91bmQiOworICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgaW50IGJ5dGVzQ291bnQgPSAwOworICAgIHVpbnQzMl90IGZyYW1lSWQgPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgIGJvb2wgY29kZWNDb25maWcgPSBmYWxzZTsKKyAgICAvLyBUaGlzIHRlc3QgaW50cm9kdWNlcyBlbXB0eSBDU0QgYWZ0ZXIgZXZlcnkgMjB0aCBmcmFtZQorICAgIC8vIGFuZCBlbXB0eSBpbnB1dCBmcmFtZXMgYXQgYW4gaW50ZXJ2YWwgb2YgNSBmcmFtZXMuCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCEoZnJhbWVJZCAlIDUpKSB7CisgICAgICAgICAgICBpZiAoIShmcmFtZUlkICUgMjApKSBmbGFncyA9IDMyOworICAgICAgICAgICAgZWxzZSBmbGFncyA9IDA7CisgICAgICAgICAgICBieXRlc0NvdW50ID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIGJyZWFrOworICAgICAgICAgICAgZWxlSW5mbyA+PiBmbGFnczsKKyAgICAgICAgICAgIGVsZUluZm8gPj4gdGltZXN0YW1wOworICAgICAgICAgICAgY29kZWNDb25maWcgPSBmbGFncyA/CisgICAgICAgICAgICAgICAgKCgxIDw8IChmbGFncyAtIDEpKSAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMCA6IDA7CisgICAgICAgIH0KKyAgICAgICAgSW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICAgICAgZnJhbWVJZCsrOworICAgIH0KKyAgICBlbGVJbmZvLmNsb3NlKCk7CisKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkZWNvZGVORnJhbWVzKAorICAgICAgICBtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIG1GbHVzaGVkSW5kaWNlcywKKyAgICAgICAgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIDAsIChpbnQpSW5mby5zaXplKCkpKTsKKworICAgIC8vIGJsb2NraW5nIGNhbGwgdG8gZW5zdXJlcyBhcHBsaWNhdGlvbiB0byBXYWl0IHRpbGwgYWxsIHRoZSBpbnB1dHMgYXJlCisgICAgLy8gY29uc3VtZWQKKyAgICBpZiAoIW1Fb3MpIHsKKyAgICAgICAgQUxPR1YoIldhaXRpbmcgZm9yIGlucHV0IGNvbnN1bXB0aW9uIik7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKyAgICB9CisKKyAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICBpZiAobUZyYW1lc1JlY2VpdmVkICE9IEluZm8uc2l6ZSgpKSB7CisgICAgICAgIEFMT0dFKCJJbnB1dCBidWZmZXIgY291bnQgYW5kIE91dHB1dCBidWZmZXIgY291bnQgbWlzbWF0Y2giKTsKKyAgICAgICAgQUxPR1YoImZyYW1lc1JlY2VpdmVkIDogJWQgaW5wdXRGcmFtZXMgOiAlenUiLCBtRnJhbWVzUmVjZWl2ZWQsCisgICAgICAgICAgICAgIEluZm8uc2l6ZSgpKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgIH0KK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCisvLyBUT0RPIDogVmlkZW8gc3BlY2lmaWMgY29uZmlndXJhdGlvbiBUZXN0CitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGdFbnYtPmluaXQoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIExPRyhJTkZPKSA8PCAiQzIgVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvdmlkZW8vVnRzSGlkbEMyVjFfMFRhcmdldFZpZGVvRW5jVGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3ZpZGVvL1Z0c0hpZGxDMlYxXzBUYXJnZXRWaWRlb0VuY1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ODVjODcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3ZpZGVvL1Z0c0hpZGxDMlYxXzBUYXJnZXRWaWRlb0VuY1Rlc3QuY3BwCkBAIC0wLDAgKzEsNjIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJjb2RlYzJfaGlkbF9oYWxfdmlkZW9fZW5jX3Rlc3QiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQnVmZmVyUHJpdi5oPgorCit1c2luZyBhbmRyb2lkOjpDMkFsbG9jYXRvcklvbjsKKworI2luY2x1ZGUgPFZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZS5oPgorI2luY2x1ZGUgIm1lZGlhX2MyX3ZpZGVvX2hpZGxfdGVzdF9jb21tb24uaCIKKyNpbmNsdWRlICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgiCisKK2NsYXNzIEdyYXBoaWNCdWZmZXIgOiBwdWJsaWMgQzJCdWZmZXIgeworcHVibGljOgorICBleHBsaWNpdCBHcmFwaGljQnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrKQorICAgICAgOiBDMkJ1ZmZlcih7YmxvY2stPnNoYXJlKEMyUmVjdChibG9jay0+d2lkdGgoKSwgYmxvY2stPmhlaWdodCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OkMyRmVuY2UoKSl9KSB7fQorfTsKKworc3RhdGljIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCogZ0VudiA9IG51bGxwdHI7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIENvZGVjMlZpZGVvRW5jSGlkbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgeworICAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIFN1cGVyOworCisgICBwdWJsaWM6CisgICAgOjpzdGQ6OnN0cmluZyBnZXRUZXN0Q2FzZUluZm8oKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiA6OnN0ZDo6c3RyaW5nKCkgKworICAgICAgICAgICAgICAgICJDb21wb25lbnQ6ICIgKyBnRW52LT5nZXRDb21wb25lbnQoKS5jX3N0cigpICsgIiB8ICIgKworICAgICAgICAgICAgICAgICJJbnN0YW5jZTogIiArIGdFbnYtPmdldEluc3RhbmNlKCkuY19zdHIoKSArICIgfCAiICsKKyAgICAgICAgICAgICAgICAiUmVzOiAiICsgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKTsKKyAgICB9CisKKyAgICAvLyBnb29nbGUuY29kZWMyIFZpZGVvIHRlc3Qgc2V0dXAKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIFN1cGVyOjpTZXRVcCgpOworICAgICAgICBtRGlzYWJsZVRlc3QgPSBmYWxzZTsKKyAgICAgICAgQUxPR1YoIkNvZGVjMlZpZGVvRW5jSGlkbFRlc3QgU2V0VXAiKTsKKyAgICAgICAgbUNsaWVudCA9IGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkpOworICAgICAgICBBU1NFUlRfTkUobUNsaWVudCwgbnVsbHB0cik7CisgICAgICAgIG1MaXN0ZW5lci5yZXNldChuZXcgQ29kZWNMaXN0ZW5lcigKKyAgICAgICAgICAgIFt0aGlzXShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVXb3JrRG9uZSh3b3JrSXRlbXMpOworICAgICAgICAgICAgfSkpOworICAgICAgICBBU1NFUlRfTkUobUxpc3RlbmVyLCBudWxscHRyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfSU5QVVRfQlVGRkVSUzsgKytpKSB7CisgICAgICAgICAgICBtV29ya1F1ZXVlLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrKTsKKyAgICAgICAgfQorICAgICAgICBtQ2xpZW50LT5jcmVhdGVDb21wb25lbnQoZ0Vudi0+Z2V0Q29tcG9uZW50KCkuY19zdHIoKSwgbUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1Db21wb25lbnQpOworICAgICAgICBBU1NFUlRfTkUobUNvbXBvbmVudCwgbnVsbHB0cik7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IHN0b3JlID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OkdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKyAgICAgICAgQ0hFQ0tfRVEoc3RvcmUtPmZldGNoQWxsb2NhdG9yKEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfR1JBUEhJQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtR3JhcGhpY0FsbG9jYXRvciksCisgICAgICAgICAgICAgICAgIEMyX09LKTsKKyAgICAgICAgbUdyYXBoaWNQb29sID0gc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4obUdyYXBoaWNBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CbG9ja1Bvb2xJZCsrKTsKKyAgICAgICAgQVNTRVJUX05FKG1HcmFwaGljUG9vbCwgbnVsbHB0cik7CisKKyAgICAgICAgbUNvbXBOYW1lID0gdW5rbm93bl9jb21wOworICAgICAgICBzdHJ1Y3QgU3RyaW5nVG9OYW1lIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIE5hbWU7CisgICAgICAgICAgICBzdGFuZGFyZENvbXAgQ29tcE5hbWU7CisgICAgICAgIH07CisKKyAgICAgICAgY29uc3QgU3RyaW5nVG9OYW1lIGtTdHJpbmdUb05hbWVbXSA9IHsKKyAgICAgICAgICAgIHsiaDI2MyIsIGgyNjN9LCB7ImF2YyIsIGF2Y30sIHsibXBlZzQiLCBtcGVnNH0sCisgICAgICAgICAgICB7ImhldmMiLCBoZXZjfSwgeyJ2cDgiLCB2cDh9LCB7InZwOSIsIHZwOX0sCisgICAgICAgIH07CisKKyAgICAgICAgY29uc3Qgc2l6ZV90IGtOdW1TdHJpbmdUb05hbWUgPQorICAgICAgICAgICAgc2l6ZW9mKGtTdHJpbmdUb05hbWUpIC8gc2l6ZW9mKGtTdHJpbmdUb05hbWVbMF0pOworCisgICAgICAgIHN0ZDo6c3RyaW5nIHN1YnN0cmluZzsKKyAgICAgICAgc3RkOjpzdHJpbmcgY29tcDsKKyAgICAgICAgc3Vic3RyaW5nID0gc3RkOjpzdHJpbmcoZ0Vudi0+Z2V0Q29tcG9uZW50KCkpOworICAgICAgICAvKiBUT0RPOiBiZXR0ZXIgYXBwcm9hY2ggdG8gZmluZCB0aGUgY29tcG9uZW50ICovCisgICAgICAgIC8qICJjMi5hbmRyb2lkLiIgPT4gMTF0aCBwb3NpdGlvbiAqLworICAgICAgICBzaXplX3QgcG9zID0gMTE7CisgICAgICAgIHNpemVfdCBsZW4gPSBzdWJzdHJpbmcuZmluZCgiLmVuY29kZXIiLCBwb3MpOworICAgICAgICBjb21wID0gc3Vic3RyaW5nLnN1YnN0cihwb3MsIGxlbiAtIHBvcyk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtU3RyaW5nVG9OYW1lOyArK2kpIHsKKyAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChjb21wLmNfc3RyKCksIGtTdHJpbmdUb05hbWVbaV0uTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBtQ29tcE5hbWUgPSBrU3RyaW5nVG9OYW1lW2ldLkNvbXBOYW1lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Fb3MgPSBmYWxzZTsKKyAgICAgICAgbUNzZCA9IGZhbHNlOworICAgICAgICBtQ29uZmlnID0gZmFsc2U7CisgICAgICAgIG1GcmFtZXNSZWNlaXZlZCA9IDA7CisgICAgICAgIG1GYWlsZWRXb3JrUmVjZWl2ZWQgPSAwOworICAgICAgICBpZiAobUNvbXBOYW1lID09IHVua25vd25fY29tcCkgbURpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1EaXNhYmxlVGVzdCkgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBEaXNhYmxlZCBcbiI7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAobUNvbXBvbmVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpZiAoOjp0ZXN0aW5nOjpUZXN0OjpIYXNGYXRhbEZhaWx1cmUoKSkgcmV0dXJuOworICAgICAgICAgICAgbUNvbXBvbmVudC0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUNvbXBvbmVudCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgU3VwZXI6OlRlYXJEb3duKCk7CisgICAgfQorCisgICAgdm9pZCBzZXR1cENvbmZpZ1BhcmFtKGludDMyX3QgbldpZHRoLCBpbnQzMl90IG5IZWlnaHQpOworCisgICAgLy8gY2FsbGJhY2sgZnVuY3Rpb24gdG8gcHJvY2VzcyBvbldvcmtEb25lIHJlY2VpdmVkIGJ5IExpc3RlbmVyCisgICAgdm9pZCBoYW5kbGVXb3JrRG9uZShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IHdvcmtJdGVtcykgeworICAgICAgICAgICAgaWYgKCF3b3JrLT53b3JrbGV0cy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKHdvcmstPnJlc3VsdCAhPSBDMl9PSykgbUZhaWxlZFdvcmtSZWNlaXZlZCsrOworICAgICAgICAgICAgICAgIHdvcmtEb25lKG1Db21wb25lbnQsIHdvcmssIG1GbHVzaGVkSW5kaWNlcywgbVF1ZXVlTG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIG1Fb3MsIG1Dc2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1JlY2VpdmVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGVudW0gc3RhbmRhcmRDb21wIHsKKyAgICAgICAgaDI2MywKKyAgICAgICAgYXZjLAorICAgICAgICBtcGVnNCwKKyAgICAgICAgaGV2YywKKyAgICAgICAgdnA4LAorICAgICAgICB2cDksCisgICAgICAgIHVua25vd25fY29tcCwKKyAgICB9OworCisgICAgYm9vbCBtRW9zOworICAgIGJvb2wgbUNzZDsKKyAgICBib29sIG1EaXNhYmxlVGVzdDsKKyAgICBib29sIG1Db25maWc7CisgICAgc3RhbmRhcmRDb21wIG1Db21wTmFtZTsKKyAgICB1aW50MzJfdCBtRnJhbWVzUmVjZWl2ZWQ7CisgICAgdWludDMyX3QgbUZhaWxlZFdvcmtSZWNlaXZlZDsKKworICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4gbUZsdXNoZWRJbmRpY2VzOworCisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbUJsb2NrUG9vbElkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gbUdyYXBoaWNQb29sOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUdyYXBoaWNBbGxvY2F0b3I7CisKKyAgICBzdGQ6Om11dGV4IG1RdWV1ZUxvY2s7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbVF1ZXVlQ29uZGl0aW9uOworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gbVdvcmtRdWV1ZTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ+IG1DbGllbnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6TGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IG1Db21wb25lbnQ7CisKKyAgIHByb3RlY3RlZDoKKyAgICBzdGF0aWMgdm9pZCBkZXNjcmlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgUmVjb3JkUHJvcGVydHkoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworICAgIH0KK307CisKK3ZvaWQgdmFsaWRhdGVDb21wb25lbnQoCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgIENvZGVjMlZpZGVvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wTmFtZSwgYm9vbCYgZGlzYWJsZVRlc3QpIHsKKyAgICAvLyBWYWxpZGF0ZSBpdHMgYSBDMiBDb21wb25lbnQKKyAgICBpZiAoY29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiYzIiKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBBTE9HRSgiTm90IGEgYzIgY29tcG9uZW50Iik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFZhbGlkYXRlIGl0cyBub3QgYW4gZW5jb2RlciBhbmQgdGhlIGNvbXBvbmVudCB0byBiZSB0ZXN0ZWQgaXMgdmlkZW8KKyAgICBpZiAoY29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiZGVjb2RlciIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBFbmNvZGVyLCBnaXZlbiBEZWNvZGVyIik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgYzJfc3RhdHVzX3QgYzJlcnIgPQorICAgICAgICBjb21wb25lbnQtPnF1ZXJ5KHt9LCB7QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ6OlBBUkFNX1RZUEV9LAorICAgICAgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssICZxdWVyaWVkKTsKKyAgICBpZiAoYzJlcnIgIT0gQzJfT0sgJiYgcXVlcmllZC5zaXplKCkgPT0gMCkgeworICAgICAgICBBTE9HRSgiUXVlcnkgbWVkaWEgdHlwZSBmYWlsZWQgPT4gJWQiLCBjMmVycik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgaW5wdXREb21haW4gPQorICAgICAgICAgICAgKChDMlN0cmVhbU1lZGlhVHlwZVNldHRpbmc6OmlucHV0KilxdWVyaWVkWzBdLmdldCgpKS0+bS52YWx1ZTsKKyAgICAgICAgaWYgKGlucHV0RG9tYWluLmZpbmQoInZpZGVvLyIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgVmlkZW8gQ29tcG9uZW50Iik7CisgICAgICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZXMgY29tcG9uZW50IG5hbWUKKyAgICBpZiAoY29tcE5hbWUgPT0gQ29kZWMyVmlkZW9FbmNIaWRsVGVzdDo6dW5rbm93bl9jb21wKSB7CisgICAgICAgIEFMT0dFKCJDb21wb25lbnQgSW5WYWxpZCIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1YoIkNvbXBvbmVudCBWYWxpZCIpOworfQorCisvLyBTZXQgRGVmYXVsdCBjb25maWcgcGFyYW0uCit2b2lkIENvZGVjMlZpZGVvRW5jSGlkbFRlc3Q6OnNldHVwQ29uZmlnUGFyYW0oaW50MzJfdCBuV2lkdGgsIGludDMyX3QgbkhlaWdodCkgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICBDMlZpZGVvU2l6ZVN0cmVhbVR1bmluZzo6aW5wdXQgaW5wdXRTaXplKDB1LCBuV2lkdGgsIG5IZWlnaHQpOworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBjb25maWdQYXJhbXsmaW5wdXRTaXplfTsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICBtQ29tcG9uZW50LT5jb25maWcoY29uZmlnUGFyYW0sIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgaWYgKGZhaWx1cmVzLnNpemUoKSA9PSAwdSApIG1Db25maWcgPSB0cnVlOworICAgIEFTU0VSVF9FUShzdGF0dXMsIEMyX09LKTsKK30KKworLy8gTG9va1VwVGFibGUgb2YgY2xpcHMgZm9yIGNvbXBvbmVudCB0ZXN0aW5nCit2b2lkIEdldFVSTEZvckNvbXBvbmVudChjaGFyKiBVUkwpIHsKKyAgICBzdHJjYXQoVVJMLCAiYmJiXzM1MngyODhfNDIwcF8zMGZwc18zMmZyYW1lcy55dXYiKTsKK30KKwordm9pZCBlbmNvZGVORnJhbWVzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Om11dGV4ICZxdWV1ZUxvY2ssIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlJiBxdWV1ZUNvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiYgZmx1c2hlZEluZGljZXMsCisgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgZ3JhcGhpY1Bvb2wsCisgICAgICAgICAgICAgICAgICAgc3RkOjppZnN0cmVhbSYgZWxlU3RyZWFtLCB1aW50MzJfdCBmcmFtZUlELAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5GcmFtZXMsIHVpbnQzMl90IG5XaWR0aCwgaW50MzJfdCBuSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgIGJvb2wgZmx1c2hlZCA9IGZhbHNlLGJvb2wgc2lnbmFsRU9TID0gdHJ1ZSkgeworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKworICAgIHVpbnQzMl90IG1heFJldHJ5ID0gMDsKKyAgICBpbnQgYnl0ZXNDb3VudCA9IG5XaWR0aCAqIG5IZWlnaHQgKiAzID4+IDE7CisgICAgaW50MzJfdCB0aW1lc3RhbXBJbmNyID0gRU5DT0RFUl9USU1FU1RBTVBfSU5DUkVNRU5UOworICAgIHVpbnQ2NF90IHRpbWVzdGFtcCA9IDA7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKG5GcmFtZXMgPT0gMCkgYnJlYWs7CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICAgICAgLy8gUHJlcGFyZSBDMldvcmsKKyAgICAgICAgd2hpbGUgKCF3b3JrICYmIChtYXhSZXRyeSA8IE1BWF9SRVRSWSkpIHsKKyAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgICAgIGlmICghd29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICB3b3JrLnN3YXAod29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgICAgIHdvcmtRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICAgICAgICAgIG1heFJldHJ5Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF3b3JrICYmIChtYXhSZXRyeSA+PSBNQVhfUkVUUlkpKSB7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIldhaXQgZm9yIGdlbmVyYXRpbmcgQzJXb3JrIGV4Y2VlZGVkIHRpbWVvdXQiOworICAgICAgICB9CisgICAgICAgIGlmIChzaWduYWxFT1MgJiYgKG5GcmFtZXMgPT0gMSkpCisgICAgICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBpZiAoZmx1c2hlZCkgeworICAgICAgICAgICAgZmxhZ3MgfD0gU1lOQ19GUkFNRTsKKyAgICAgICAgICAgIGZsdXNoZWQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gZnJhbWVJRDsKKyAgICAgICAgeworICAgICAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICAgICAgZmx1c2hlZEluZGljZXMuZW1wbGFjZV9iYWNrKGZyYW1lSUQpOworICAgICAgICB9CisgICAgICAgIGNoYXIqIGRhdGEgPSAoY2hhciopbWFsbG9jKGJ5dGVzQ291bnQpOworICAgICAgICBBU1NFUlRfTkUoZGF0YSwgbnVsbHB0cik7CisgICAgICAgIG1lbXNldChkYXRhLCAwLCBieXRlc0NvdW50KTsKKyAgICAgICAgaWYgKGVsZVN0cmVhbS5pc19vcGVuKCkpIHsKKyAgICAgICAgICAgIGVsZVN0cmVhbS5yZWFkKGRhdGEsIGJ5dGVzQ291bnQpOworICAgICAgICAgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5nY291bnQoKSwgYnl0ZXNDb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jazsKKyAgICAgICAgQVNTRVJUX0VRKAorICAgICAgICAgICAgQzJfT0ssCisgICAgICAgICAgICBncmFwaGljUG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICAgICAgbldpZHRoLCBuSGVpZ2h0LCBIQUxfUElYRUxfRk9STUFUX1lWMTIsCisgICAgICAgICAgICAgICAge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9LCAmYmxvY2spKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoYmxvY2spOworICAgICAgICAvLyBHcmFwaGljIFZpZXcKKyAgICAgICAgQzJHcmFwaGljVmlldyB2aWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkMyR3JhcGhpY0Jsb2NrOjptYXAoKSBmYWlsZWQgOiAlZCIsIHZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQ4X3QqIHBZID0gdmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgICAgICB1aW50OF90KiBwVSA9IHZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICAgICAgdWludDhfdCogcFYgPSB2aWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisKKyAgICAgICAgbWVtY3B5KHBZLCBkYXRhLCBuV2lkdGggKiBuSGVpZ2h0KTsKKyAgICAgICAgbWVtY3B5KHBVLCBkYXRhICsgbldpZHRoICogbkhlaWdodCwgKG5XaWR0aCAqIG5IZWlnaHQgPj4gMikpOworICAgICAgICBtZW1jcHkocFYsIGRhdGEgKyAobldpZHRoICogbkhlaWdodCAqIDUgPj4gMiksIG5XaWR0aCAqIG5IZWlnaHQgPj4gMik7CisKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmVtcGxhY2VfYmFjayhuZXcgR3JhcGhpY0J1ZmZlcihibG9jaykpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisgICAgICAgIGZyZWUoZGF0YSk7CisKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICAgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisKKyAgICAgICAgLy8gRE8gVEhFIEVOQ09ESU5HCisgICAgICAgIEFTU0VSVF9FUShjb21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKyAgICAgICAgQUxPR1YoIkZyYW1lICMlZCBzaXplID0gJWQgcXVldWVkIiwgZnJhbWVJRCwgYnl0ZXNDb3VudCk7CisgICAgICAgIG5GcmFtZXMtLTsKKyAgICAgICAgdGltZXN0YW1wICs9IHRpbWVzdGFtcEluY3I7CisgICAgICAgIGZyYW1lSUQrKzsKKyAgICAgICAgbWF4UmV0cnkgPSAwOworICAgIH0KK30KKworVEVTVF9GKENvZGVjMlZpZGVvRW5jSGlkbFRlc3QsIHZhbGlkYXRlQ29tcE5hbWUpIHsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQUxPR1YoIkNoZWNrcyBpZiB0aGUgZ2l2ZW4gY29tcG9uZW50IGlzIGEgdmFsaWQgdmlkZW8gY29tcG9uZW50Iik7CisgICAgdmFsaWRhdGVDb21wb25lbnQobUNvbXBvbmVudCwgbUNvbXBOYW1lLCBtRGlzYWJsZVRlc3QpOworICAgIEFTU0VSVF9FUShtRGlzYWJsZVRlc3QsIGZhbHNlKTsKK30KKworVEVTVF9GKENvZGVjMlZpZGVvRW5jSGlkbFRlc3QsIEVuY29kZVRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiRW5jb2RlcyBpbnB1dCBmaWxlIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgY2hhciBtVVJMWzUxMl07CisgICAgaW50MzJfdCBuV2lkdGggPSBFTkNfREVGQVVMVF9GUkFNRV9XSURUSDsKKyAgICBpbnQzMl90IG5IZWlnaHQgPSBFTkNfREVGQVVMVF9GUkFNRV9IRUlHSFQ7CisKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1VUkwpOworCisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW07CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSkgPDwgbVVSTCA8PCAiIGZpbGUgbm90IGZvdW5kIjsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisKKyAgICBzZXR1cENvbmZpZ1BhcmFtKG5XaWR0aCwgbkhlaWdodCk7CisgICAgaWYgKCFtQ29uZmlnKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtR3JhcGhpY1Bvb2wsIGVsZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAwLCBFTkNfTlVNX0ZSQU1FUywgbldpZHRoLCBuSGVpZ2h0KSk7CisKKyAgICAvLyBibG9ja2luZyBjYWxsIHRvIGVuc3VyZXMgYXBwbGljYXRpb24gdG8gV2FpdCB0aWxsIGFsbCB0aGUgaW5wdXRzIGFyZQorICAgIC8vIGNvbnN1bWVkCisgICAgQUxPR0QoIldhaXRpbmcgZm9yIGlucHV0IGNvbnN1bXB0aW9uIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisKKyAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICBpZiAobUZyYW1lc1JlY2VpdmVkICE9IEVOQ19OVU1fRlJBTUVTKSB7CisgICAgICAgIEFMT0dFKCJJbnB1dCBidWZmZXIgY291bnQgYW5kIE91dHB1dCBidWZmZXIgY291bnQgbWlzbWF0Y2giKTsKKyAgICAgICAgQUxPR0UoImZyYW1lc1JlY2VpdmVkIDogJWQgaW5wdXRGcmFtZXMgOiAlZCIsIG1GcmFtZXNSZWNlaXZlZCwKKyAgICAgICAgICAgICAgRU5DX05VTV9GUkFNRVMpOworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorCisgICAgaWYgKCFtQ3NkICYmIChtQ29tcE5hbWUgIT0gdnA4ICYmIG1Db21wTmFtZSAhPSB2cDkpKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAiQ1NEIEJ1ZmZlciBub3QgcmVjZWl2ZWQiOworICAgIH0KKworICAgIGlmIChtQ3NkICYmIChtQ29tcE5hbWUgPT0gdnA4IHx8IG1Db21wTmFtZSA9PSB2cDkpKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAiQ1NEIEJ1ZmZlciBub3QgZXhwZWN0ZWQiOworICAgIH0KKworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMlZpZGVvRW5jSGlkbFRlc3QsIEVPU1Rlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdCBlbXB0eSBpbnB1dCBidWZmZXIgd2l0aCBFT1MgZmxhZyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworCisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgeworICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBpZiAoIW1Xb3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgd29yay5zd2FwKG1Xb3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICBtV29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIm1Xb3JrUXVldWUgRW1wdHkgaXMgbm90IGV4cGVjdGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgdGVzdCIpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gMDsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSAwOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKyAgICB1aW50MzJfdCBxdWV1ZVNpemU7CisgICAgeworICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBxdWV1ZVNpemUgPSBtV29ya1F1ZXVlLnNpemUoKTsKKyAgICAgICAgaWYgKHF1ZXVlU2l6ZSA8IE1BWF9JTlBVVF9CVUZGRVJTKSB7CisgICAgICAgICAgICBtUXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK1RFU1RfRihDb2RlYzJWaWRlb0VuY0hpZGxUZXN0LCBGbHVzaFRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdCBSZXF1ZXN0IGZvciBmbHVzaCIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworCisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIGNoYXIgbVVSTFs1MTJdOworICAgIGludDMyX3QgbldpZHRoID0gRU5DX0RFRkFVTFRfRlJBTUVfV0lEVEg7CisgICAgaW50MzJfdCBuSGVpZ2h0ID0gRU5DX0RFRkFVTFRfRlJBTUVfSEVJR0hUOworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobVVSTCk7CisgICAgc2V0dXBDb25maWdQYXJhbShuV2lkdGgsIG5IZWlnaHQpOworCisgICAgLy8gU2V0dGluZyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKyAgICBtRmx1c2hlZEluZGljZXMuY2xlYXIoKTsKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbTsKKyAgICB1aW50MzJfdCBudW1GcmFtZXNGbHVzaGVkID0gMTA7CisgICAgdWludDMyX3QgbnVtRnJhbWVzID0gRU5DX05VTV9GUkFNRVM7CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICBlbmNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1HcmFwaGljUG9vbCwgZWxlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgIDAsIG51bUZyYW1lc0ZsdXNoZWQsIG5XaWR0aCwgbkhlaWdodCkpOworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gZmx1c2hlZFdvcms7CisgICAgYzJfc3RhdHVzX3QgZXJyID0KKyAgICAgICAgbUNvbXBvbmVudC0+Zmx1c2goQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmZsdXNoZWRXb3JrKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgKHNpemVfdClNQVhfSU5QVVRfQlVGRkVSUyAtIGZsdXNoZWRXb3JrLnNpemUoKSkpOworICAgIHVpbnQ2NF90IGZyYW1lSW5kZXg7CisgICAgeworICAgICAgICAvL1VwZGF0ZSBtRmx1c2hlZEluZGljZXMgYmFzZWQgb24gdGhlIGluZGV4IHJlY2VpdmVkIGZyb20gZmx1c2goKQorICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogZmx1c2hlZFdvcmspIHsKKyAgICAgICAgICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICAgICAgICAgIGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD46Oml0ZXJhdG9yIGZyYW1lSW5kZXhJdCA9IHN0ZDo6ZmluZCgKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLCBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICBlbmNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1HcmFwaGljUG9vbCwgZWxlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lc0ZsdXNoZWQsIG51bUZyYW1lcyAtIG51bUZyYW1lc0ZsdXNoZWQsCisgICAgICAgICAgICAgICAgICAgICAgbldpZHRoLCBuSGVpZ2h0LCB0cnVlKSk7CisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgZXJyID0gbUNvbXBvbmVudC0+Zmx1c2goQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmZsdXNoZWRXb3JrKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgKHNpemVfdClNQVhfSU5QVVRfQlVGRkVSUyAtIGZsdXNoZWRXb3JrLnNpemUoKSkpOworICAgIHsKKyAgICAgICAgLy9VcGRhdGUgbUZsdXNoZWRJbmRpY2VzIGJhc2VkIG9uIHRoZSBpbmRleCByZWNlaXZlZCBmcm9tIGZsdXNoKCkKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgICAgICAgICBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBmcmFtZUluZGV4SXQgPSBzdGQ6OmZpbmQoCisgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLmJlZ2luKCksIG1GbHVzaGVkSW5kaWNlcy5lbmQoKSwgZnJhbWVJbmRleCk7CisgICAgICAgICAgICBpZiAoIW1GbHVzaGVkSW5kaWNlcy5lbXB0eSgpICYmCisgICAgICAgICAgICAgICAgKGZyYW1lSW5kZXhJdCAhPSBtRmx1c2hlZEluZGljZXMuZW5kKCkpKSB7CisgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLmVyYXNlKGZyYW1lSW5kZXhJdCk7CisgICAgICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbVdvcmtRdWV1ZS5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfRVEobUZsdXNoZWRJbmRpY2VzLmVtcHR5KCksIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMlZpZGVvRW5jSGlkbFRlc3QsIEludmFsaWRCdWZmZXJUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3RzIGZlZWRpbmcgbGFyZ2VyL3NtYWxsZXIgaW5wdXQgYnVmZmVyIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbTsKKyAgICBpbnQzMl90IG5XaWR0aCA9IEVOQ19ERUZBVUxUX0ZSQU1FX1dJRFRIIC8gMjsKKyAgICBpbnQzMl90IG5IZWlnaHQgPSBFTkNfREVGQVVMVF9GUkFNRV9IRUlHSFQgLyAyOworICAgIHNldHVwQ29uZmlnUGFyYW0obldpZHRoLCBuSGVpZ2h0KTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICBlbmNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1HcmFwaGljUG9vbCwgZWxlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIG5XaWR0aCwgbkhlaWdodCwgZmFsc2UsIGZhbHNlKSk7CisKKyAgICAvLyBGZWVkIGxhcmdlciBpbnB1dCBidWZmZXIuCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUdyYXBoaWNQb29sLCBlbGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgMSwgMSwgbldpZHRoKjIsIG5IZWlnaHQqMiwgZmFsc2UsIGZhbHNlKSk7CisKKyAgICAvLyBGZWVkIHNtYWxsZXIgaW5wdXQgYnVmZmVyLgorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICBlbmNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1HcmFwaGljUG9vbCwgZWxlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgIDIsIDEsIG5XaWR0aC8yLCBuSGVpZ2h0LzIsIGZhbHNlLCB0cnVlKSk7CisKKyAgICAvLyBibG9ja2luZyBjYWxsIHRvIGVuc3VyZXMgYXBwbGljYXRpb24gdG8gV2FpdCB0aWxsIGFsbCB0aGUgaW5wdXRzIGFyZQorICAgIC8vIGNvbnN1bWVkCisgICAgQUxPR0QoIldhaXRpbmcgZm9yIGlucHV0IGNvbnN1bXB0aW9uIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisKKyAgICBpZiAobUZyYW1lc1JlY2VpdmVkICE9IDMpIHsKKyAgICAgICAgQUxPR0UoIklucHV0IGJ1ZmZlciBjb3VudCBhbmQgT3V0cHV0IGJ1ZmZlciBjb3VudCBtaXNtYXRjaCIpOworICAgICAgICBBTE9HRSgiZnJhbWVzUmVjZWl2ZWQgOiAlZCBpbnB1dEZyYW1lcyA6IDMiLCBtRnJhbWVzUmVjZWl2ZWQpOworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorCisgICAgaWYgKG1GYWlsZWRXb3JrUmVjZWl2ZWQgPT0gMCkgeworICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgZmFpbGVkIGZyYW1lIGNvdW50IG1pc21hdGNoIik7CisgICAgICAgIEFMT0dFKCJmYWlsZWRGcmFtZXNSZWNlaXZlZCA6ICVkIiwgbUZhaWxlZFdvcmtSZWNlaXZlZCk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK2NsYXNzIENvZGVjMlZpZGVvRW5jUmVzb2x1dGlvblRlc3QgOiBwdWJsaWMgQ29kZWMyVmlkZW9FbmNIaWRsVGVzdCwKKyAgICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90PiA+IHsKK307CisKK1RFU1RfUChDb2RlYzJWaWRlb0VuY1Jlc29sdXRpb25UZXN0LCBSZXNvbHV0aW9uVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0cyBlbmNvZGluZyBhdCBkaWZmZXJlbnQgcmVzb2x1dGlvbnMiKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbTsKKyAgICBpbnQzMl90IG5XaWR0aCA9IEdldFBhcmFtKCkuZmlyc3Q7CisgICAgaW50MzJfdCBuSGVpZ2h0ID0gR2V0UGFyYW0oKS5zZWNvbmQ7CisgICAgQUxPR0QoIlRyeWluZyBlbmNvZGUgZm9yIHdpZHRoICVkIGhlaWdodCAlZCIsIG5XaWR0aCwgbkhlaWdodCk7CisgICAgbUNvbmZpZyA9IGZhbHNlOworICAgIG1Fb3MgPSBmYWxzZTsKKyAgICBzZXR1cENvbmZpZ1BhcmFtKG5XaWR0aCwgbkhlaWdodCk7CisgICAgaWYgKCFtQ29uZmlnKSByZXR1cm47CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICBlbmNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1HcmFwaGljUG9vbCwgZWxlU3RyZWFtLCAwLAorICAgICAgICAgICAgICAgICAgICAgIE1BWF9JTlBVVF9CVUZGRVJTLCBuV2lkdGgsIG5IZWlnaHQpKTsKKworICAgIEFMT0dEKCJXYWl0aW5nIGZvciBpbnB1dCBjb25zdW1wdGlvbiIpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSkpOworCisgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+cmVzZXQoKSwgQzJfT0spOworfQorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoTm9uU3RkU2l6ZXMsIENvZGVjMlZpZGVvRW5jUmVzb2x1dGlvblRlc3QsIDo6dGVzdGluZzo6VmFsdWVzKAorICAgIHN0ZDo6bWFrZV9wYWlyKDUyLCAxOCksCisgICAgc3RkOjptYWtlX3BhaXIoMzY1LCAzNjUpLAorICAgIHN0ZDo6bWFrZV9wYWlyKDQ4NCwgMzYyKSwKKyAgICBzdGQ6Om1ha2VfcGFpcigyNDQsIDQ4OCkpKTsKKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGdFbnYtPmluaXQoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIExPRyhJTkZPKSA8PCAiQzIgVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvdmlkZW8vbWVkaWFfYzJfdmlkZW9faGlkbF90ZXN0X2NvbW1vbi5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy92aWRlby9tZWRpYV9jMl92aWRlb19oaWRsX3Rlc3RfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ0NTU1NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvdmlkZW8vbWVkaWFfYzJfdmlkZW9faGlkbF90ZXN0X2NvbW1vbi5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0MyX1ZJREVPX0hJRExfVEVTVF9DT01NT05fSAorI2RlZmluZSBNRURJQV9DMl9WSURFT19ISURMX1RFU1RfQ09NTU9OX0gKKworI2RlZmluZSBFTkNPREVSX1RJTUVTVEFNUF9JTkNSRU1FTlQgNDAwMDAKKyNkZWZpbmUgRU5DX05VTV9GUkFNRVMgMzIKKyNkZWZpbmUgRU5DX0RFRkFVTFRfRlJBTUVfV0lEVEggMzUyCisjZGVmaW5lIEVOQ19ERUZBVUxUX0ZSQU1FX0hFSUdIVCAyODgKKyNkZWZpbmUgTUFYX0lURVJBVElPTlMgMTI4CisKKy8qCisgKiBDb21tb24gdmlkZW8gdXRpbHMKKyAqLworCisKKyNlbmRpZiAgLy8gTUVESUFfQzJfVklERU9fSElETF9URVNUX0NPTU1PTl9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYTQ5OGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvQW5kcm9pZC5icApAQCAtMCwwICsxLDM4IEBACitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGliY29kZWMyX2NsaWVudCIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJjbGllbnQuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl9oaWRsQDEuMCIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnF1ZXVlX2hlbHBlciIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJjb2RlYzJfaGlkbEAxLjAiLAorICAgICAgICAibGliY29kZWMyIiwKKyAgICBdLAorCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9jbGllbnQuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2NsaWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYzZTUzNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9jbGllbnQuY3BwCkBAIC0wLDAgKzEsMTM5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyQ2xpZW50IgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorCisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8Z3VpL2J1ZmZlcnF1ZXVlLzEuMC9IMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI3VuZGVmIExPRworCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50SW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudExpc3RlbmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudFN0b3JlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbmZpZ3VyYWJsZS5oPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyQnVmZmVyUHJpdi5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6dXRpbHM7Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA7Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOworCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKKy8vIGMyX3N0YXR1c190IHZhbHVlIHRoYXQgY29ycmVzcG9uZHMgdG8gaHdiaW5kZXIgdHJhbnNhY3Rpb24gZmFpbHVyZS4KK2NvbnN0ZXhwciBjMl9zdGF0dXNfdCBDMl9UUkFOU0FDVElPTl9GQUlMRUQgPSBDMl9DT1JSVVBURUQ7CisKKy8vIExpc3Qgb2Yga25vd24gSUNvbXBvbmVudFN0b3JlIHNlcnZpY2VzIGluIHRoZSBkZWNyZWFzaW5nIG9yZGVyIG9mIHByZWZlcmVuY2UuCitjb25zdGV4cHIgY29uc3QgY2hhcioga0NsaWVudE5hbWVzW10gPSB7CisgICAgICAgICJkZWZhdWx0IiwKKyAgICAgICAgInNvZnR3YXJlIiwKKyAgICB9OworCisvLyBOdW1iZXIgb2Yga25vd24gSUNvbXBvbmVudFN0b3JlIHNlcnZpY2VzLgorY29uc3RleHByIHNpemVfdCBrTnVtQ2xpZW50cyA9IHN0ZDo6ZXh0ZW50PGRlY2x0eXBlKGtDbGllbnROYW1lcyk+Ojp2YWx1ZTsKKwordHlwZWRlZiBzdGQ6OmFycmF5PHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+LCBrTnVtQ2xpZW50cz4gQ2xpZW50TGlzdDsKKworLy8gQ29udmVuaWVuY2UgbWV0aG9kcyB0byBvYnRhaW4ga25vd24gY2xpZW50cy4KK3N0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IGdldENsaWVudChzaXplX3QgaW5kZXgpIHsKKyAgICB1aW50MzJfdCBzZXJ2aWNlTWFzayA9IDo6YW5kcm9pZDo6YmFzZTo6R2V0VWludFByb3BlcnR5KAorICAgICAgICAgICAgImRlYnVnLm1lZGlhLmNvZGVjMiIsIHVpbnQzMl90KDApKTsKKyAgICByZXR1cm4gQ29kZWMyQ2xpZW50OjpDcmVhdGVGcm9tU2VydmljZSgKKyAgICAgICAgICAgIGtDbGllbnROYW1lc1tpbmRleF0sCisgICAgICAgICAgICAoc2VydmljZU1hc2sgJiAoMSA8PCBpbmRleCkpICE9IDApOworfQorCitDbGllbnRMaXN0IGdldENsaWVudExpc3QoKSB7CisgICAgQ2xpZW50TGlzdCBsaXN0OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7ICsraSkgeworICAgICAgICBsaXN0W2ldID0gZ2V0Q2xpZW50KGkpOworICAgIH0KKyAgICByZXR1cm4gbGlzdDsKK30KKworfSAvLyB1bm5hbWVkCisKKy8vIENvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudAorCitjb25zdCBDMlN0cmluZyYgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50OjpnZXROYW1lKCkgY29uc3QgeworICAgIHJldHVybiBtTmFtZTsKK30KKworQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50OjpCYXNlKiBDb2RlYzJDb25maWd1cmFibGVDbGllbnQ6OmJhc2UoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEJhc2UqPihtQmFzZS5nZXQoKSk7Cit9CisKK0NvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudDo6Q29kZWMyQ29uZmlndXJhYmxlQ2xpZW50KAorICAgICAgICBjb25zdCBzcDxDb2RlYzJDb25maWd1cmFibGVDbGllbnQ6OkJhc2U+JiBiYXNlKSA6IG1CYXNlKGJhc2UpIHsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBiYXNlLT5nZXROYW1lKAorICAgICAgICAgICAgW3RoaXNdKGNvbnN0IGhpZGxfc3RyaW5nJiBuYW1lKSB7CisgICAgICAgICAgICAgICAgbU5hbWUgPSBuYW1lLmNfc3RyKCk7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiQ2Fubm90IG9idGFpbiBuYW1lIGZyb20gSUNvbmZpZ3VyYWJsZS4iKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudDo6cXVlcnkoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmc3RhY2tQYXJhbXMsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgaGVhcFBhcmFtcykgY29uc3QgeworICAgIGhpZGxfdmVjPFBhcmFtSW5kZXg+IGluZGljZXMoCisgICAgICAgICAgICBzdGFja1BhcmFtcy5zaXplKCkgKyBoZWFwUGFyYW1JbmRpY2VzLnNpemUoKSk7CisgICAgc2l6ZV90IG51bUluZGljZXMgPSAwOworICAgIGZvciAoQzJQYXJhbSogY29uc3QmIHN0YWNrUGFyYW0gOiBzdGFja1BhcmFtcykgeworICAgICAgICBpZiAoIXN0YWNrUGFyYW0pIHsKKyAgICAgICAgICAgIEFMT0dXKCJxdWVyeSAtLSBudWxsIHN0YWNrIHBhcmFtIGVuY291bnRlcmVkLiIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaW5kaWNlc1tudW1JbmRpY2VzKytdID0gc3RhdGljX2Nhc3Q8UGFyYW1JbmRleD4oc3RhY2tQYXJhbS0+aW5kZXgoKSk7CisgICAgfQorICAgIHNpemVfdCBudW1TdGFja0luZGljZXMgPSBudW1JbmRpY2VzOworICAgIGZvciAoY29uc3QgQzJQYXJhbTo6SW5kZXgmIGluZGV4IDogaGVhcFBhcmFtSW5kaWNlcykgeworICAgICAgICBpbmRpY2VzW251bUluZGljZXMrK10gPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtSW5kZXg+KHN0YXRpY19jYXN0PHVpbnQzMl90PihpbmRleCkpOworICAgIH0KKyAgICBpbmRpY2VzLnJlc2l6ZShudW1JbmRpY2VzKTsKKyAgICBpZiAoaGVhcFBhcmFtcykgeworICAgICAgICBoZWFwUGFyYW1zLT5yZXNlcnZlKGhlYXBQYXJhbXMtPnNpemUoKSArIG51bUluZGljZXMpOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gYmFzZSgpLT5xdWVyeSgKKyAgICAgICAgICAgIGluZGljZXMsCisgICAgICAgICAgICBtYXlCbG9jayA9PSBDMl9NQVlfQkxPQ0ssCisgICAgICAgICAgICBbJnN0YXR1cywgJm51bVN0YWNrSW5kaWNlcywgJnN0YWNrUGFyYW1zLCBoZWFwUGFyYW1zXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsIGNvbnN0IFBhcmFtcyYgcCkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LICYmIHN0YXR1cyAhPSBDMl9CQURfSU5ERVgpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoInF1ZXJ5IC0tIGNhbGwgZmFpbGVkLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGNvZGUgPSAlZCIsIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtUG9pbnRlcnM7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgcGFyc2VTdGF0dXMgPSBwYXJzZVBhcmFtc0Jsb2IoJnBhcmFtUG9pbnRlcnMsIHApOworICAgICAgICAgICAgICAgIGlmIChwYXJzZVN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgicXVlcnkgLS0gZXJyb3Igd2hpbGUgcGFyc2luZyBwYXJhbXMuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgY29kZSA9ICVkIiwgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gcGFyc2VTdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2l6ZV90IGkgPSAwOworICAgICAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IHBhcmFtUG9pbnRlcnMuYmVnaW4oKTsgaXQgIT0gcGFyYW1Qb2ludGVycy5lbmQoKTsgKSB7CisgICAgICAgICAgICAgICAgICAgIEMyUGFyYW0qIHBhcmFtUG9pbnRlciA9ICppdDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG51bVN0YWNrSW5kaWNlcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tbnVtU3RhY2tJbmRpY2VzOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJhbVBvaW50ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygicXVlcnkgLS0gbnVsbCBzdGFjayBwYXJhbS4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IGkgPCBzdGFja1BhcmFtcy5zaXplKCkgJiYgIXN0YWNrUGFyYW1zW2ldOyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+PSBzdGFja1BhcmFtcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgicXVlcnkgLS0gdW5leHBlY3RlZCBlcnJvci4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrUGFyYW1zW2ldLT5pbmRleCgpICE9IHBhcmFtUG9pbnRlci0+aW5kZXgoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJxdWVyeSAtLSBwYXJhbSBza2lwcGVkLiBpbmRleCA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oc3RhY2tQYXJhbXNbaV0tPmluZGV4KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja1BhcmFtc1tpKytdLT5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YWNrUGFyYW1zW2krK10tPnVwZGF0ZUZyb20oKnBhcmFtUG9pbnRlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygicXVlcnkgLS0gcGFyYW0gdXBkYXRlIGZhaWxlZC4gaW5kZXggPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHBhcmFtUG9pbnRlci0+aW5kZXgoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJhbVBvaW50ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygicXVlcnkgLS0gbnVsbCBoZWFwIHBhcmFtLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhlYXBQYXJhbXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygicXVlcnkgLS0gdW5leHBlY3RlZCBleHRyYSBzdGFjayBwYXJhbS4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcFBhcmFtcy0+ZW1wbGFjZV9iYWNrKEMyUGFyYW06OkNvcHkoKnBhcmFtUG9pbnRlcikpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoInF1ZXJ5IC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iKTsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50Ojpjb25maWcoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLAorICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSB7CisgICAgUGFyYW1zIGhpZGxQYXJhbXM7CisgICAgU3RhdHVzIGhpZGxTdGF0dXMgPSBjcmVhdGVQYXJhbXNCbG9iKCZoaWRsUGFyYW1zLCBwYXJhbXMpOworICAgIGlmIChoaWRsU3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgQUxPR0UoImNvbmZpZyAtLSBiYWQgaW5wdXQuIik7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBiYXNlKCktPmNvbmZpZygKKyAgICAgICAgICAgIGhpZGxQYXJhbXMsCisgICAgICAgICAgICBtYXlCbG9jayA9PSBDMl9NQVlfQkxPQ0ssCisgICAgICAgICAgICBbJnN0YXR1cywgJnBhcmFtcywgZmFpbHVyZXNdKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8U2V0dGluZ1Jlc3VsdD4gZiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyYW1zJiBvKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoImNvbmZpZyAtLSBjYWxsIGZhaWxlZC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBjb2RlID0gJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzaXplX3QgaSA9IGZhaWx1cmVzLT5zaXplKCk7CisgICAgICAgICAgICAgICAgZmFpbHVyZXMtPnJlc2l6ZShpICsgZi5zaXplKCkpOworICAgICAgICAgICAgICAgIGZvciAoY29uc3QgU2V0dGluZ1Jlc3VsdCYgc2YgOiBmKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IG9iamNweSgmKCpmYWlsdXJlcylbaSsrXSwgc2YpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiY29uZmlnIC0tIGludmFsaWQgcmV0dXJuZWQgU2V0dGluZ1Jlc3VsdC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgY29kZSA9ICVkIiwgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB1cGRhdGVQYXJhbXNGcm9tQmxvYihwYXJhbXMsIG8pOworICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoImNvbmZpZyAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIik7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudDo6cXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+KiBjb25zdCBwYXJhbXMpIGNvbnN0IHsKKyAgICAvLyBUT0RPOiBDYWNoZSBhbmQgcXVlcnkgcHJvcGVybHkhCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IGJhc2UoKS0+cXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWluKCksCisgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCksCisgICAgICAgICAgICBbJnN0YXR1cywgcGFyYW1zXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPFBhcmFtRGVzY3JpcHRvcj4mIHApIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgicXVlcnlTdXBwb3J0ZWRQYXJhbXMgLS0gY2FsbCBmYWlsZWQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgY29kZSA9ICVkIiwgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzaXplX3QgaSA9IHBhcmFtcy0+c2l6ZSgpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+cmVzaXplKGkgKyBwLnNpemUoKSk7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBQYXJhbURlc2NyaXB0b3ImIHNwIDogcCkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBvYmpjcHkoJigqcGFyYW1zKVtpKytdLCBzcCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJxdWVyeVN1cHBvcnRlZFBhcmFtcyAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHJldHVybmVkIFBhcmFtRGVzY3JpcHRvci4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgY29kZSA9ICVkIiwgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJxdWVyeVN1cHBvcnRlZFBhcmFtcyAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIik7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudDo6cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4mIGZpZWxkcywKKyAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3QgeworICAgIGhpZGxfdmVjPEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+IGluRmllbGRzKGZpZWxkcy5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmllbGRzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFN0YXR1cyBoaWRsU3RhdHVzID0gb2JqY3B5KCZpbkZpZWxkc1tpXSwgZmllbGRzW2ldKTsKKyAgICAgICAgaWYgKGhpZGxTdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgQUxPR0UoInF1ZXJ5U3VwcG9ydGVkVmFsdWVzIC0tIGJhZCBpbnB1dCIpOworICAgICAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBiYXNlKCktPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgaW5GaWVsZHMsCisgICAgICAgICAgICBtYXlCbG9jayA9PSBDMl9NQVlfQkxPQ0ssCisgICAgICAgICAgICBbJnN0YXR1cywgJmluRmllbGRzLCAmZmllbGRzXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnlSZXN1bHQ+JiByKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoInF1ZXJ5U3VwcG9ydGVkVmFsdWVzIC0tIGNhbGwgZmFpbGVkLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGNvZGUgPSAlZCIsIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHIuc2l6ZSgpICE9IGZpZWxkcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoInF1ZXJ5U3VwcG9ydGVkVmFsdWVzIC0tIGlucHV0IGFuZCBvdXRwdXQgbGlzdHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYXZlIGRpZmZlcmVudCBzaXplcy4iKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmllbGRzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IG9iamNweSgmZmllbGRzW2ldLCBpbkZpZWxkc1tpXSwgcltpXSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJxdWVyeVN1cHBvcnRlZFZhbHVlcyAtLSBpbnZhbGlkIHJldHVybmVkIHZhbHVlLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBjb2RlID0gJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoInF1ZXJ5U3VwcG9ydGVkVmFsdWVzIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iKTsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLy8gQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OkhpZGxMaXN0ZW5lcgorc3RydWN0IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpIaWRsTGlzdGVuZXIgOiBwdWJsaWMgSUNvbXBvbmVudExpc3RlbmVyIHsKKyAgICBzdGQ6OndlYWtfcHRyPENvbXBvbmVudD4gY29tcG9uZW50OworICAgIHN0ZDo6d2Vha19wdHI8TGlzdGVuZXI+IGJhc2U7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvbldvcmtEb25lKGNvbnN0IFdvcmtCdW5kbGUmIHdvcmtCdW5kbGUpIG92ZXJyaWRlIHsKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiB3b3JrSXRlbXM7CisgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IG9iamNweSgmd29ya0l0ZW1zLCB3b3JrQnVuZGxlKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0koIm9uV29ya0RvbmUgLS0gcmVjZWl2ZWQgY29ycnVwdGVkIFdvcmtCdW5kbGUuICIKKyAgICAgICAgICAgICAgICAgICAgInN0YXR1cyA9ICVkLiIsIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisgICAgICAgIC8vIHJlbGVhc2UgaW5wdXQgYnVmZmVycyBwb3RlbnRpYWxseSBoZWxkIGJ5IHRoZSBjb21wb25lbnQgZnJvbSBxdWV1ZQorICAgICAgICBzaXplX3QgbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzID0gMDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBzdHJvbmdDb21wb25lbnQgPSBjb21wb25lbnQubG9jaygpOworICAgICAgICBpZiAoc3Ryb25nQ29tcG9uZW50KSB7CisgICAgICAgICAgICBudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnMgPSBzdHJvbmdDb21wb25lbnQtPmhhbmRsZU9uV29ya0RvbmUod29ya0l0ZW1zKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6TGlzdGVuZXI+IGxpc3RlbmVyID0gYmFzZS5sb2NrKCkpIHsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vbldvcmtEb25lKGNvbXBvbmVudCwgd29ya0l0ZW1zLCBudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0QoIm9uV29ya0RvbmUgLS0gbGlzdGVuZXIgZGllZC4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uVHJpcHBlZCgKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPFNldHRpbmdSZXN1bHQ+JiBzZXR0aW5nUmVzdWx0cykgb3ZlcnJpZGUgeworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gYzJTZXR0aW5nUmVzdWx0cygKKyAgICAgICAgICAgICAgICBzZXR0aW5nUmVzdWx0cy5zaXplKCkpOworICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2V0dGluZ1Jlc3VsdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+IGMyU2V0dGluZ1Jlc3VsdDsKKyAgICAgICAgICAgIHN0YXR1cyA9IG9iamNweSgmYzJTZXR0aW5nUmVzdWx0LCBzZXR0aW5nUmVzdWx0c1tpXSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0koIm9uVHJpcHBlZCAtLSByZWNlaXZlZCBjb3JydXB0ZWQgU2V0dGluZ1Jlc3VsdC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgInN0YXR1cyA9ICVkLiIsIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGMyU2V0dGluZ1Jlc3VsdHNbaV0gPSBzdGQ6Om1vdmUoYzJTZXR0aW5nUmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6TGlzdGVuZXI+IGxpc3RlbmVyID0gYmFzZS5sb2NrKCkpIHsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vblRyaXBwZWQoY29tcG9uZW50LCBjMlNldHRpbmdSZXN1bHRzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dEKCJvblRyaXBwZWQgLS0gbGlzdGVuZXIgZGllZC4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uRXJyb3IoU3RhdHVzIHMsIHVpbnQzMl90IGVycm9yQ29kZSkgb3ZlcnJpZGUgeworICAgICAgICBBTE9HRCgib25FcnJvciAtLSBzdGF0dXMgPSAlZCwgZXJyb3JDb2RlID0gJXUuIiwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHMpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkPihlcnJvckNvZGUpKTsKKyAgICAgICAgaWYgKHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4gbGlzdGVuZXIgPSBiYXNlLmxvY2soKSkgeworICAgICAgICAgICAgbGlzdGVuZXItPm9uRXJyb3IoY29tcG9uZW50LCBzID09IFN0YXR1czo6T0sgPworICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgOiBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0QoIm9uRXJyb3IgLS0gbGlzdGVuZXIgZGllZC4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uRnJhbWVzUmVuZGVyZWQoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxSZW5kZXJlZEZyYW1lPiYgcmVuZGVyZWRGcmFtZXMpIG92ZXJyaWRlIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiBsaXN0ZW5lciA9IGJhc2UubG9jaygpOworICAgICAgICBzdGQ6OnZlY3RvcjxDb2RlYzJDbGllbnQ6Okxpc3RlbmVyOjpSZW5kZXJlZEZyYW1lPiByZnM7CisgICAgICAgIHJmcy5yZXNlcnZlKHJlbmRlcmVkRnJhbWVzLnNpemUoKSk7CisgICAgICAgIGZvciAoY29uc3QgUmVuZGVyZWRGcmFtZSYgcmYgOiByZW5kZXJlZEZyYW1lcykgeworICAgICAgICAgICAgaWYgKHJmLnNsb3RJZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgICAgIHJmcy5lbXBsYWNlX2JhY2socmYuYnVmZmVyUXVldWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZi5zbG90SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmYudGltZXN0YW1wTnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBzdHJvbmdDb21wb25lbnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmxvY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoc3Ryb25nQ29tcG9uZW50KSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXggPSByZi5idWZmZXJRdWV1ZUlkOworICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVySW5kZXggPSBzdGF0aWNfY2FzdDxzaXplX3Q+KH5yZi5zbG90SWQpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiUmVjZWl2ZWQgZGVhdGggbm90aWZpY2F0aW9uIG9mIGlucHV0IGJ1ZmZlcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJhbWVJbmRleCA9ICVsbHUsIGJ1ZmZlckluZGV4ID0gJXp1LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZyB1bnNpZ25lZD4oZnJhbWVJbmRleCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9uZ0NvbXBvbmVudC0+ZnJlZUlucHV0QnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUluZGV4LCBidWZmZXJJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5vbklucHV0QnVmZmVyRG9uZShidWZmZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghcmZzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGlmIChsaXN0ZW5lcikgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5vbkZyYW1lc1JlbmRlcmVkKHJmcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dEKCJvbkZyYW1lc1JlbmRlcmVkIC0tIGxpc3RlbmVyIGRpZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9Cit9OworCisvLyBDb2RlYzJDbGllbnQKK0NvZGVjMkNsaWVudDo6QmFzZSogQ29kZWMyQ2xpZW50OjpiYXNlKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxCYXNlKj4obUJhc2UuZ2V0KCkpOworfQorCitDb2RlYzJDbGllbnQ6OkNvZGVjMkNsaWVudChjb25zdCBzcDxDb2RlYzJDbGllbnQ6OkJhc2U+JiBiYXNlLCBzdGQ6OnN0cmluZyBpbnN0YW5jZU5hbWUpIDoKKyAgICBDb2RlYzJDb25maWd1cmFibGVDbGllbnQoYmFzZSksIG1MaXN0ZWQoZmFsc2UpLCBtSW5zdGFuY2VOYW1lKGluc3RhbmNlTmFtZSkgeworICAgIFJldHVybjxzcDxJQ2xpZW50TWFuYWdlcj4+IHRyYW5zUmVzdWx0ID0gYmFzZS0+Z2V0UG9vbENsaWVudE1hbmFnZXIoKTsKKyAgICBpZiAoIXRyYW5zUmVzdWx0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiZ2V0UG9vbENsaWVudE1hbmFnZXIgLS0gZmFpbGVkIHRyYW5zYWN0aW9uLiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Ib3N0UG9vbE1hbmFnZXIgPSBzdGF0aWNfY2FzdDxzcDxJQ2xpZW50TWFuYWdlcj4+KHRyYW5zUmVzdWx0KTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Y3JlYXRlQ29tcG9uZW50KAorICAgICAgICBjb25zdCBDMlN0cmluZyYgbmFtZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiogY29uc3QgY29tcG9uZW50KSB7CisKKyAgICAvLyBUT0RPOiBBZGQgc3VwcG9ydCBmb3IgQnVmZmVycG9vbAorCisKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgc3A8Q29tcG9uZW50OjpIaWRsTGlzdGVuZXI+IGhpZGxMaXN0ZW5lciA9IG5ldyBDb21wb25lbnQ6OkhpZGxMaXN0ZW5lcigpOworICAgIGhpZGxMaXN0ZW5lci0+YmFzZSA9IGxpc3RlbmVyOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IGJhc2UoKS0+Y3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgIGhpZGxMaXN0ZW5lciwKKyAgICAgICAgICAgIENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCksCisgICAgICAgICAgICBbJnN0YXR1cywgY29tcG9uZW50LCBoaWRsTGlzdGVuZXJdKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudD4mIGMpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpjb21wb25lbnQgPSBzdGQ6Om1ha2Vfc2hhcmVkPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PihjKTsKKyAgICAgICAgICAgICAgICBoaWRsTGlzdGVuZXItPmNvbXBvbmVudCA9ICpjb21wb25lbnQ7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiY3JlYXRlQ29tcG9uZW50IC0tIGZhaWxlZCB0cmFuc2FjdGlvbi4iKTsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgaWYgKCEqY29tcG9uZW50KSB7CisgICAgICAgIEFMT0dFKCJjcmVhdGVDb21wb25lbnQgLS0gbnVsbCBjb21wb25lbnQuIik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgc3RhdHVzID0gKCpjb21wb25lbnQpLT5zZXREZWF0aExpc3RlbmVyKCpjb21wb25lbnQsIGxpc3RlbmVyKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJjcmVhdGVDb21wb25lbnQgLS0gc2V0RGVhdGhMaXN0ZW5lciByZXR1cm5lZCBlcnJvcjogJWQuIiwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOworICAgIH0KKworICAgICgqY29tcG9uZW50KS0+bUJ1ZmZlclBvb2xTZW5kZXIuc2V0UmVjZWl2ZXIobUhvc3RQb29sTWFuYWdlcik7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgIGNvbnN0IEMyU3RyaW5nJiBuYW1lLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UpIHsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gYmFzZSgpLT5jcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgWyZzdGF0dXMsIGludGVyZmFjZV0oCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50SW50ZXJmYWNlPiYgaSkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVJbnRlcmZhY2UgLS0gY2FsbCBmYWlsZWQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgY29kZSA9ICVkIiwgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjptYWtlX3NoYXJlZDxDb2RlYzJDbGllbnQ6OkludGVyZmFjZT4oaSk7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiY3JlYXRlSW50ZXJmYWNlIC0tIGZhaWxlZCB0cmFuc2FjdGlvbi4iKTsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpjcmVhdGVJbnB1dFN1cmZhY2UoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZT4qIGNvbnN0IGlucHV0U3VyZmFjZSkgeworICAgIFJldHVybjxzcDxJSW5wdXRTdXJmYWNlPj4gdHJhbnNSZXN1bHQgPSBiYXNlKCktPmNyZWF0ZUlucHV0U3VyZmFjZSgpOworICAgIGlmICghdHJhbnNSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJjcmVhdGVJbnB1dFN1cmZhY2UgLS0gZmFpbGVkIHRyYW5zYWN0aW9uLiIpOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBzcDxJSW5wdXRTdXJmYWNlPiByZXN1bHQgPSBzdGF0aWNfY2FzdDxzcDxJSW5wdXRTdXJmYWNlPj4odHJhbnNSZXN1bHQpOworICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgICppbnB1dFN1cmZhY2UgPSBudWxscHRyOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgICppbnB1dFN1cmZhY2UgPSBzdGQ6Om1ha2Vfc2hhcmVkPElucHV0U3VyZmFjZT4ocmVzdWx0KTsKKyAgICBpZiAoISppbnB1dFN1cmZhY2UpIHsKKyAgICAgICAgQUxPR0UoImNyZWF0ZUlucHV0U3VyZmFjZSAtLSB1bmtub3duIGVycm9yLiIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+JiBDb2RlYzJDbGllbnQ6Omxpc3RDb21wb25lbnRzKCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgaWYgKG1MaXN0ZWQpIHsKKyAgICAgICAgcmV0dXJuIG1UcmFpdHNMaXN0OworICAgIH0KKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBiYXNlKCktPmxpc3RDb21wb25lbnRzKAorICAgICAgICAgICAgW3RoaXNdKGNvbnN0IGhpZGxfdmVjPElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzPiYgdCkgeworICAgICAgICAgICAgICAgIG1UcmFpdHNMaXN0LnJlc2l6ZSh0LnNpemUoKSk7CisgICAgICAgICAgICAgICAgbUFsaWFzZXNCdWZmZXIucmVzaXplKHQuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHQuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gb2JqY3B5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtVHJhaXRzTGlzdFtpXSwgJm1BbGlhc2VzQnVmZmVyW2ldLCB0W2ldKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImxpc3RDb21wb25lbnRzIC0tIGNvcnJ1cHRlZCBvdXRwdXQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgibGlzdENvbXBvbmVudHMgLS0gZmFpbGVkIHRyYW5zYWN0aW9uLiIpOworICAgIH0KKyAgICBtTGlzdGVkID0gdHJ1ZTsKKyAgICByZXR1cm4gbVRyYWl0c0xpc3Q7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Y29weUJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiYgc3JjLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+JiBkc3QpIHsKKyAgICAvLyBUT0RPOiBJbXBsZW1lbnQ/CisgICAgKHZvaWQpc3JjOworICAgICh2b2lkKWRzdDsKKyAgICBBTE9HRSgiY29weUJ1ZmZlciBub3QgaW1wbGVtZW50ZWQiKTsKKyAgICByZXR1cm4gQzJfT01JVFRFRDsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+CisgICAgICAgIENvZGVjMkNsaWVudDo6Z2V0UGFyYW1SZWZsZWN0b3IoKSB7CisgICAgLy8gVE9ETzogdGhpcyBpcyBub3QgbWVhbnQgdG8gYmUgZXhwb3NlZCBhcyBDMlBhcmFtUmVmbGVjdG9yIG9uIHRoZSBjbGllbnQgc2lkZTsgaW5zdGVhZCwgaXQKKyAgICAvLyBzaG91bGQgcmVmbGVjdCB0aGUgSEFMIEFQSS4KKyAgICBzdHJ1Y3QgU2ltcGxlUGFyYW1SZWZsZWN0b3IgOiBwdWJsaWMgQzJQYXJhbVJlZmxlY3RvciB7CisgICAgICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzY3JpYmUoQzJQYXJhbTo6Q29yZUluZGV4IGNvcmVJbmRleCkgY29uc3QgeworICAgICAgICAgICAgaGlkbF92ZWM8UGFyYW1JbmRleD4gaW5kaWNlcygxKTsKKyAgICAgICAgICAgIGluZGljZXNbMF0gPSBzdGF0aWNfY2FzdDxQYXJhbUluZGV4Pihjb3JlSW5kZXguY29yZUluZGV4KCkpOworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzY3JpcHRvcjsKKyAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5nZXRTdHJ1Y3REZXNjcmlwdG9ycygKKyAgICAgICAgICAgICAgICAgICAgaW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgWyZkZXNjcmlwdG9yXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxTdHJ1Y3REZXNjcmlwdG9yPiYgc2QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0U3RydWN0RGVzY3JpcHRvcnMgLS0gY2FsbCBmYWlsZWQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBjb2RlID0gJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Quc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiZ2V0U3RydWN0RGVzY3JpcHRvcnMgLS0gcmV0dXJuZWQgdmVjdG9yIG9mIHNpemUgJXp1LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZC5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBvYmpjcHkoJmRlc2NyaXB0b3IsIHNkWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiZ2V0U3RydWN0RGVzY3JpcHRvcnMgLS0gZmFpbGVkIHRvIGNvbnZlcnQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBjb2RlID0gJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7CisgICAgICAgIH0KKworICAgICAgICBTaW1wbGVQYXJhbVJlZmxlY3RvcihzcDxCYXNlPiBiYXNlKQorICAgICAgICAgICAgOiBtQmFzZShiYXNlKSB7IH0KKworICAgICAgICBzcDxCYXNlPiBtQmFzZTsKKyAgICB9OworCisgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlUGFyYW1SZWZsZWN0b3I+KGJhc2UoKSk7Cit9OworCitzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKAorICAgICAgICBjb25zdCBjaGFyKiBpbnN0YW5jZU5hbWUsIGJvb2wgd2FpdEZvclNlcnZpY2UpIHsKKyAgICBpZiAoIWluc3RhbmNlTmFtZSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc3A8QmFzZT4gYmFzZVN0b3JlID0gd2FpdEZvclNlcnZpY2UgPworICAgICAgICAgICAgQmFzZTo6Z2V0U2VydmljZShpbnN0YW5jZU5hbWUpIDoKKyAgICAgICAgICAgIEJhc2U6OnRyeUdldFNlcnZpY2UoaW5zdGFuY2VOYW1lKTsKKyAgICBpZiAoIWJhc2VTdG9yZSkgeworICAgICAgICBpZiAod2FpdEZvclNlcnZpY2UpIHsKKyAgICAgICAgICAgIEFMT0dXKCJDb2RlYzIuMCBzZXJ2aWNlIFwiJXNcIiBpbmFjY2Vzc2libGUuICIKKyAgICAgICAgICAgICAgICAgICJDaGVjayB0aGUgZGV2aWNlIG1hbmlmZXN0LiIsCisgICAgICAgICAgICAgICAgICBpbnN0YW5jZU5hbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0QoIkNvZGVjMi4wIHNlcnZpY2UgXCIlc1wiIHVuYXZhaWxhYmxlIHJpZ2h0IG5vdy4gIgorICAgICAgICAgICAgICAgICAgIlRyeSBhZ2FpbiBsYXRlci4iLAorICAgICAgICAgICAgICAgICAgaW5zdGFuY2VOYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8Q29kZWMyQ2xpZW50PihiYXNlU3RvcmUsIGluc3RhbmNlTmFtZSk7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Rm9yQWxsU3RvcmVzKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAma2V5LAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+Jik+IHByZWRpY2F0ZSkgeworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IEMyX05PX0lOSVQ7ICAvLyBubyBJQ29tcG9uZW50U3RvcmVzIHByZXNlbnQKKworICAgIC8vIENhY2hlIHRoZSBtYXBwaW5nIGtleSAtPiBpbmRleCBvZiBDb2RlYzJDbGllbnQgaW4gZ2V0Q2xpZW50KCkuCisgICAgc3RhdGljIHN0ZDo6bXV0ZXgga2V5MkluZGV4TXV0ZXg7CisgICAgc3RhdGljIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzaXplX3Q+IGtleTJJbmRleDsKKworICAgIC8vIEJ5IGRlZmF1bHQgdHJ5IGFsbCBzdG9yZXMuIEhvd2V2ZXIsIHRyeSB0aGUgbGFzdCBrbm93biBjbGllbnQgZmlyc3QuIElmIHRoZSBsYXN0IGtub3duCisgICAgLy8gY2xpZW50IGZhaWxzLCByZXRyeSBvbmNlLiBXZSBkbyB0aGlzIGJ5IHB1c2hpbmcgdGhlIGxhc3Qga25vd24gY2xpZW50IGluIGZyb250IG9mIHRoZQorICAgIC8vIGxpc3Qgb2YgYWxsIGNsaWVudHMuCisgICAgc3RkOjpkZXF1ZTxzaXplX3Q+IGluZGljZXM7CisgICAgZm9yIChzaXplX3QgaW5kZXggPSBrTnVtQ2xpZW50czsgaW5kZXggPiAwOyApIHsKKyAgICAgICAgaW5kaWNlcy5wdXNoX2Zyb250KC0taW5kZXgpOworICAgIH0KKworICAgIGJvb2wgd2FzTWFwcGVkID0gZmFsc2U7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKGtleTJJbmRleE11dGV4KTsKKyAgICBhdXRvIGl0ID0ga2V5MkluZGV4LmZpbmQoa2V5KTsKKyAgICBpZiAoaXQgIT0ga2V5MkluZGV4LmVuZCgpKSB7CisgICAgICAgIGluZGljZXMucHVzaF9mcm9udChpdC0+c2Vjb25kKTsKKyAgICAgICAgd2FzTWFwcGVkID0gdHJ1ZTsKKyAgICB9CisgICAgbG9jay51bmxvY2soKTsKKworICAgIGZvciAoc2l6ZV90IGluZGV4IDogaW5kaWNlcykgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBjbGllbnQgPSBnZXRDbGllbnQoaW5kZXgpOworICAgICAgICBpZiAoY2xpZW50KSB7CisgICAgICAgICAgICBzdGF0dXMgPSBwcmVkaWNhdGUoY2xpZW50KTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgICAgICAgICBrZXkySW5kZXhba2V5XSA9IGluZGV4OyAvLyB1cGRhdGUgbGFzdCBrbm93biBjbGllbnQgaW5kZXgKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh3YXNNYXBwZWQpIHsKKyAgICAgICAgICAgIEFMT0dJKCJDb3VsZCBub3QgZmluZCAnJXMnIGluIGxhc3QgaW5zdGFuY2UuIFJldHJ5aW5nLi4uIiwga2V5LmNfc3RyKCkpOworICAgICAgICAgICAgd2FzTWFwcGVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsgIC8vIHJldHVybiB0aGUgbGFzdCBzdGF0dXMgZnJvbSBhIHZhbGlkIGNsaWVudAorfQorCitzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+CisgICAgICAgIENvZGVjMkNsaWVudDo6Q3JlYXRlQ29tcG9uZW50QnlOYW1lKAorICAgICAgICBjb25zdCBjaGFyKiBjb21wb25lbnROYW1lLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4qIG93bmVyKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudD4gY29tcG9uZW50OworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IEZvckFsbFN0b3JlcygKKyAgICAgICAgICAgIGNvbXBvbmVudE5hbWUsCisgICAgICAgICAgICBbb3duZXIsICZjb21wb25lbnQsIGNvbXBvbmVudE5hbWUsICZsaXN0ZW5lcl0oCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+ICZjbGllbnQpIC0+IGMyX3N0YXR1c190IHsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBjbGllbnQtPmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnROYW1lLCBsaXN0ZW5lciwgJmNvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBpZiAob3duZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpvd25lciA9IGNsaWVudDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9IEMyX05PVF9GT1VORCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiSUNvbXBvbmVudFN0b3JlKCVzKTo6Y3JlYXRlQ29tcG9uZW50KCclcycpIHJldHVybmVkICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmdldEluc3RhbmNlTmFtZSgpLmNfc3RyKCksIGNvbXBvbmVudE5hbWUsIGFzU3RyaW5nKHN0YXR1cykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBBTE9HSSgiQ291bGQgbm90IGNyZWF0ZSBjb21wb25lbnQgJyVzJyAoJXMpIiwgY29tcG9uZW50TmFtZSwgYXNTdHJpbmcoc3RhdHVzKSk7CisgICAgfQorICAgIHJldHVybiBjb21wb25lbnQ7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkludGVyZmFjZT4KKyAgICAgICAgQ29kZWMyQ2xpZW50OjpDcmVhdGVJbnRlcmZhY2VCeU5hbWUoCisgICAgICAgIGNvbnN0IGNoYXIqIGludGVyZmFjZU5hbWUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+KiBvd25lcikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRlcmZhY2U+IGludGVyZmFjZTsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBGb3JBbGxTdG9yZXMoCisgICAgICAgICAgICBpbnRlcmZhY2VOYW1lLAorICAgICAgICAgICAgW293bmVyLCAmaW50ZXJmYWNlLCBpbnRlcmZhY2VOYW1lXSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gJmNsaWVudCkgLT4gYzJfc3RhdHVzX3QgeworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IGNsaWVudC0+Y3JlYXRlSW50ZXJmYWNlKGludGVyZmFjZU5hbWUsICZpbnRlcmZhY2UpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqb3duZXIgPSBjbGllbnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBDMl9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIklDb21wb25lbnRTdG9yZSglcyk6OmNyZWF0ZUludGVyZmFjZSgnJXMnKSByZXR1cm5lZCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5nZXRJbnN0YW5jZU5hbWUoKS5jX3N0cigpLCBpbnRlcmZhY2VOYW1lLCBhc1N0cmluZyhzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0pOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0koIkNvdWxkIG5vdCBjcmVhdGUgaW50ZXJmYWNlICclcycgKCVzKSIsIGludGVyZmFjZU5hbWUsIGFzU3RyaW5nKHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gaW50ZXJmYWNlOworfQorCitzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U+IENvZGVjMkNsaWVudDo6Q3JlYXRlSW5wdXRTdXJmYWNlKCkgeworICAgIHVpbnQzMl90IHNlcnZpY2VNYXNrID0gOjphbmRyb2lkOjpiYXNlOjpHZXRVaW50UHJvcGVydHkoCisgICAgICAgICAgICAiZGVidWcuc3RhZ2VmcmlnaHQuYzJpbnB1dHN1cmZhY2UiLCB1aW50MzJfdCgwKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtQ2xpZW50czsgKytpKSB7CisgICAgICAgIGlmICgoMSA8PCBpKSAmIHNlcnZpY2VNYXNrKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBjbGllbnQgPSBnZXRDbGllbnQoaSk7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U+IGlucHV0U3VyZmFjZTsKKyAgICAgICAgICAgIGlmIChjbGllbnQgJiYKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5jcmVhdGVJbnB1dFN1cmZhY2UoJmlucHV0U3VyZmFjZSkgPT0gQzJfT0sgJiYKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRTdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0U3VyZmFjZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVygiQ291bGQgbm90IGNyZWF0ZSBhbiBpbnB1dCBzdXJmYWNlIGZyb20gYW55IENvZGVjMi4wIHNlcnZpY2VzLiIpOworICAgIHJldHVybiBudWxscHRyOworfQorCitjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbXBvbmVudDo6VHJhaXRzPiYgQ29kZWMyQ2xpZW50OjpMaXN0Q29tcG9uZW50cygpIHsKKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4gdHJhaXRzTGlzdCA9IFtdKCl7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+IGxpc3Q7CisgICAgICAgIHNpemVfdCBsaXN0U2l6ZSA9IDA7CisgICAgICAgIENsaWVudExpc3QgY2xpZW50TGlzdCA9IGdldENsaWVudExpc3QoKTsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiYgY2xpZW50IDogY2xpZW50TGlzdCkgeworICAgICAgICAgICAgaWYgKCFjbGllbnQpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpc3RTaXplICs9IGNsaWVudC0+bGlzdENvbXBvbmVudHMoKS5zaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgbGlzdC5yZXNlcnZlKGxpc3RTaXplKTsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiYgY2xpZW50IDogY2xpZW50TGlzdCkgeworICAgICAgICAgICAgaWYgKCFjbGllbnQpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpc3QuaW5zZXJ0KAorICAgICAgICAgICAgICAgICAgICBsaXN0LmVuZCgpLAorICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmxpc3RDb21wb25lbnRzKCkuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5saXN0Q29tcG9uZW50cygpLmVuZCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGlzdDsKKyAgICB9KCk7CisKKyAgICByZXR1cm4gdHJhaXRzTGlzdDsKK30KKworLy8gQ29kZWMyQ2xpZW50OjpMaXN0ZW5lcgorCitDb2RlYzJDbGllbnQ6Okxpc3RlbmVyOjp+TGlzdGVuZXIoKSB7Cit9CisKKy8vIENvZGVjMkNsaWVudDo6Q29tcG9uZW50CisKK0NvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpCYXNlKiBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6YmFzZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QmFzZSo+KG1CYXNlLmdldCgpKTsKK30KKworQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OkNvbXBvbmVudChjb25zdCBzcDxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6QmFzZT4mIGJhc2UpIDoKKyAgICBDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZShiYXNlKSwKKyAgICBtQnVmZmVyUG9vbFNlbmRlcihudWxscHRyKSB7Cit9CisKK0NvZGVjMkNsaWVudDo6Q29tcG9uZW50Ojp+Q29tcG9uZW50KCkgeworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6Y3JlYXRlQmxvY2tQb29sKAorICAgICAgICBDMkFsbG9jYXRvcjo6aWRfdCBpZCwKKyAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QqIGJsb2NrUG9vbElkLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb25maWd1cmFibGU+KiBjb25maWd1cmFibGUpIHsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gYmFzZSgpLT5jcmVhdGVCbG9ja1Bvb2woCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaWQpLAorICAgICAgICAgICAgWyZzdGF0dXMsIGJsb2NrUG9vbElkLCBjb25maWd1cmFibGVdKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywKKyAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgcElkLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQ29uZmlndXJhYmxlPiYgYykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKTsKKyAgICAgICAgICAgICAgICBjb25maWd1cmFibGUtPnJlc2V0KCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiY3JlYXRlQmxvY2tQb29sIC0tIGNhbGwgZmFpbGVkLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGNvZGUgPSAlZCIsIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKmJsb2NrUG9vbElkID0gc3RhdGljX2Nhc3Q8QzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3Q+KHBJZCk7CisgICAgICAgICAgICAgICAgKmNvbmZpZ3VyYWJsZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q29kZWMyQ2xpZW50OjpDb25maWd1cmFibGU+KGMpOworICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoImNyZWF0ZUJsb2NrUG9vbCAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIik7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpkZXN0cm95QmxvY2tQb29sKAorICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBsb2NhbElkKSB7CisgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNSZXN1bHQgPSBiYXNlKCktPmRlc3Ryb3lCbG9ja1Bvb2woCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50NjRfdD4obG9jYWxJZCkpOworICAgIGlmICghdHJhbnNSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJkZXN0cm95QmxvY2tQb29sIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iKTsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zUmVzdWx0KSk7Cit9CisKK3NpemVfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6aGFuZGxlT25Xb3JrRG9uZSgKKyAgICAgICAgY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmd29ya0l0ZW1zKSB7CisgICAgLy8gSW5wdXQgYnVmZmVycycgbGlmZXRpbWUgbWFuYWdlbWVudAorICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBpbnB1dERvbmU7CisgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayA6IHdvcmtJdGVtcykgeworICAgICAgICBpZiAod29yaykgeworICAgICAgICAgICAgaWYgKHdvcmstPndvcmtsZXRzLmVtcHR5KCkKKyAgICAgICAgICAgICAgICAgICAgfHwgIXdvcmstPndvcmtsZXRzLmJhY2soKQorICAgICAgICAgICAgICAgICAgICB8fCAod29yay0+d29ya2xldHMuYmFjaygpLT5vdXRwdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19JTkNPTVBMRVRFKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gaW5wdXQgaXMgY29tcGxldGUKKyAgICAgICAgICAgICAgICBpbnB1dERvbmUuZW1wbGFjZV9iYWNrKHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHNpemVfdCBudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnMgPSAwOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUlucHV0QnVmZmVyc011dGV4KTsKKyAgICAgICAgZm9yICh1aW50NjRfdCBpbnB1dEluZGV4IDogaW5wdXREb25lKSB7CisgICAgICAgICAgICBhdXRvIGl0ID0gbUlucHV0QnVmZmVycy5maW5kKGlucHV0SW5kZXgpOworICAgICAgICAgICAgaWYgKGl0ID09IG1JbnB1dEJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigib25Xb3JrRG9uZSAtLSByZXR1cm5lZCBjb25zdW1lZC91bmtub3duICIKKyAgICAgICAgICAgICAgICAgICAgICAiaW5wdXQgZnJhbWU6IGluZGV4ICVsbHUiLAorICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylpbnB1dEluZGV4KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIm9uV29ya0RvbmUgLS0gcHJvY2Vzc2VkIGlucHV0IGZyYW1lOiAiCisgICAgICAgICAgICAgICAgICAgICAgImluZGV4ICVsbHUgKGNvbnRhaW5pbmcgJXp1IGJ1ZmZlcnMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpaW5wdXRJbmRleCwgaXQtPnNlY29uZC5zaXplKCkpOworICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlckNvdW50LmVyYXNlKGlucHV0SW5kZXgpOworICAgICAgICAgICAgICAgICsrbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gT3V0cHV0IGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrcycgbGlmZXRpbWUgbWFuYWdlbWVudAorICAgIG1PdXRwdXRCdWZmZXJRdWV1ZU11dGV4LmxvY2soKTsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBpZ2JwID0gbU91dHB1dElnYnA7CisgICAgdWludDY0X3QgYnFJZCA9IG1PdXRwdXRCcUlkOworICAgIHVpbnQzMl90IGdlbmVyYXRpb24gPSBtT3V0cHV0R2VuZXJhdGlvbjsKKyAgICBtT3V0cHV0QnVmZmVyUXVldWVNdXRleC51bmxvY2soKTsKKworICAgIGlmIChpZ2JwKSB7CisgICAgICAgIGhvbGRCdWZmZXJRdWV1ZUJsb2Nrcyh3b3JrSXRlbXMsIGlnYnAsIGJxSWQsIGdlbmVyYXRpb24pOworICAgIH0KKyAgICByZXR1cm4gbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpmcmVlSW5wdXRCdWZmZXIoCisgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsCisgICAgICAgIHNpemVfdCBidWZmZXJJbmRleCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnB1dEJ1ZmZlcnNNdXRleCk7CisgICAgYXV0byBpdCA9IG1JbnB1dEJ1ZmZlcnMuZmluZChmcmFtZUluZGV4KTsKKyAgICBpZiAoaXQgPT0gbUlucHV0QnVmZmVycy5lbmQoKSkgeworICAgICAgICBBTE9HSSgiZnJlZUlucHV0QnVmZmVyIC0tIFVucmVjb2duaXplZCBpbnB1dCBmcmFtZSBpbmRleCAlbGx1LiIsCisgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZyB1bnNpZ25lZD4oZnJhbWVJbmRleCkpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKGJ1ZmZlckluZGV4ID49IGl0LT5zZWNvbmQuc2l6ZSgpKSB7CisgICAgICAgIEFMT0dJKCJmcmVlSW5wdXRCdWZmZXIgLS0gSW5wdXQgYnVmZmVyIG5vLiAlenUgaXMgaW52YWxpZCBpbiAiCisgICAgICAgICAgICAgICJpbnB1dCBmcmFtZSBpbmRleCAlbGx1LiIsCisgICAgICAgICAgICAgIGJ1ZmZlckluZGV4LCBzdGF0aWNfY2FzdDxsb25nIGxvbmcgdW5zaWduZWQ+KGZyYW1lSW5kZXgpKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGJ1ZmZlciA9IGl0LT5zZWNvbmRbYnVmZmVySW5kZXhdOworICAgIGlmICghYnVmZmVyKSB7CisgICAgICAgIEFMT0dJKCJmcmVlSW5wdXRCdWZmZXIgLS0gSW5wdXQgYnVmZmVyIG5vLiAlenUgaW4gIgorICAgICAgICAgICAgICAiaW5wdXQgZnJhbWUgaW5kZXggJWxsdSBoYXMgYWxyZWFkeSBiZWVuIGZyZWVkLiIsCisgICAgICAgICAgICAgIGJ1ZmZlckluZGV4LCBzdGF0aWNfY2FzdDxsb25nIGxvbmcgdW5zaWduZWQ+KGZyYW1lSW5kZXgpKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGl0LT5zZWNvbmRbYnVmZmVySW5kZXhdID0gbnVsbHB0cjsKKyAgICBpZiAoLS1tSW5wdXRCdWZmZXJDb3VudFtmcmFtZUluZGV4XSA9PSAwKSB7CisgICAgICAgIG1JbnB1dEJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICBtSW5wdXRCdWZmZXJDb3VudC5lcmFzZShmcmFtZUluZGV4KTsKKyAgICB9CisgICAgcmV0dXJuIGJ1ZmZlcjsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OnF1ZXVlKAorICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBpdGVtcykgeworICAgIC8vIHJlbWVtYmVyIGlucHV0IGJ1ZmZlcnMgcXVldWVkIHRvIGhvbGQgcmVmZXJlbmNlIHRvIHRoZW0KKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnB1dEJ1ZmZlcnNNdXRleCk7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmsgOiAqaXRlbXMpIHsKKyAgICAgICAgICAgIGlmICghd29yaykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHdvcmstPmlucHV0LmJ1ZmZlcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDY0X3QgaW5wdXRJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgICAgICAgICAgYXV0byByZXMgPSBtSW5wdXRCdWZmZXJzLmVtcGxhY2UoaW5wdXRJbmRleCwgd29yay0+aW5wdXQuYnVmZmVycyk7CisgICAgICAgICAgICBpZiAoIXJlcy5zZWNvbmQpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBhcHBlbmQ/IC0gZm9yIG5vdyB3ZSBhcmUgcmVwbGFjaW5nCisgICAgICAgICAgICAgICAgcmVzLmZpcnN0LT5zZWNvbmQgPSB3b3JrLT5pbnB1dC5idWZmZXJzOworICAgICAgICAgICAgICAgIEFMT0dJKCJxdWV1ZSAtLSBkdXBsaWNhdGUgaW5wdXQgZnJhbWU6IGluZGV4ICVsbHUuICIKKyAgICAgICAgICAgICAgICAgICAgICAiRGlzY2FyZGluZyB0aGUgb2xkIGlucHV0IGZyYW1lLi4uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpaW5wdXRJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtSW5wdXRCdWZmZXJDb3VudFtpbnB1dEluZGV4XSA9IHdvcmstPmlucHV0LmJ1ZmZlcnMuc2l6ZSgpOworICAgICAgICAgICAgQUxPR1YoInF1ZXVlIC0tIHF1ZXVlaW5nIGlucHV0IGZyYW1lOiAiCisgICAgICAgICAgICAgICAgICAiaW5kZXggJWxsdSAoY29udGFpbmluZyAlenUgYnVmZmVycykiLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWlucHV0SW5kZXgsIHdvcmstPmlucHV0LmJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFdvcmtCdW5kbGUgd29ya0J1bmRsZTsKKyAgICBTdGF0dXMgaGlkbFN0YXR1cyA9IG9iamNweSgmd29ya0J1bmRsZSwgKml0ZW1zLCAmbUJ1ZmZlclBvb2xTZW5kZXIpOworICAgIGlmIChoaWRsU3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgQUxPR0UoInF1ZXVlIC0tIGJhZCBpbnB1dC4iKTsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNTdGF0dXMgPSBiYXNlKCktPnF1ZXVlKHdvcmtCdW5kbGUpOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJxdWV1ZSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIik7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3RhdGljX2Nhc3Q8U3RhdHVzPih0cmFuc1N0YXR1cykpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoInF1ZXVlIC0tIGNhbGwgZmFpbGVkLiAiCisgICAgICAgICAgICAgICAgIkVycm9yIGNvZGUgPSAlZCIsIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpmbHVzaCgKKyAgICAgICAgQzJDb21wb25lbnQ6OmZsdXNoX21vZGVfdCBtb2RlLAorICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBmbHVzaGVkV29yaykgeworICAgICh2b2lkKW1vZGU7IC8vIEZsdXNoIG1vZGUgaXNuJ3Qgc3VwcG9ydGVkIGluIEhJREwgeWV0LgorICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBiYXNlKCktPmZsdXNoKAorICAgICAgICAgICAgWyZzdGF0dXMsIGZsdXNoZWRXb3JrXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsIGNvbnN0IFdvcmtCdW5kbGUmIHdiKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImZsdXNoIC0tIGNhbGwgZmFpbGVkLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGNvZGUgPSAlZCIsIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhdHVzID0gb2JqY3B5KGZsdXNoZWRXb3JrLCB3Yik7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiZmx1c2ggLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiIpOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKworICAgIC8vIEluZGljZXMgb2YgZmx1c2hlZCB3b3JrIGl0ZW1zLgorICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBmbHVzaGVkSW5kaWNlczsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrIDogKmZsdXNoZWRXb3JrKSB7CisgICAgICAgIGlmICh3b3JrKSB7CisgICAgICAgICAgICBpZiAod29yay0+d29ya2xldHMuZW1wdHkoKQorICAgICAgICAgICAgICAgICAgICB8fCAhd29yay0+d29ya2xldHMuYmFjaygpCisgICAgICAgICAgICAgICAgICAgIHx8ICh3b3JrLT53b3JrbGV0cy5iYWNrKCktPm91dHB1dC5mbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19JTkNPTVBMRVRFKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gaW5wdXQgaXMgY29tcGxldGUKKyAgICAgICAgICAgICAgICBmbHVzaGVkSW5kaWNlcy5lbXBsYWNlX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJbnB1dCBidWZmZXJzJyBsaWZldGltZSBtYW5hZ2VtZW50CisgICAgZm9yICh1aW50NjRfdCBmbHVzaGVkSW5kZXggOiBmbHVzaGVkSW5kaWNlcykgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW5wdXRCdWZmZXJzTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUlucHV0QnVmZmVycy5maW5kKGZsdXNoZWRJbmRleCk7CisgICAgICAgIGlmIChpdCA9PSBtSW5wdXRCdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HVigiZmx1c2ggLS0gcmV0dXJuZWQgY29uc3VtZWQvdW5rbm93biBpbnB1dCBmcmFtZTogIgorICAgICAgICAgICAgICAgICAgImluZGV4ICVsbHUiLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWZsdXNoZWRJbmRleCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigiZmx1c2ggLS0gcmV0dXJuZWQgdW5wcm9jZXNzZWQgaW5wdXQgZnJhbWU6ICIKKyAgICAgICAgICAgICAgICAgICJpbmRleCAlbGx1IChjb250YWluaW5nICV6dSBidWZmZXJzKSIsCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZmx1c2hlZEluZGV4LCBtSW5wdXRCdWZmZXJDb3VudFtmbHVzaGVkSW5kZXhdKTsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgbUlucHV0QnVmZmVyQ291bnQuZXJhc2UoZmx1c2hlZEluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE91dHB1dCBidWZmZXJxdWV1ZS1iYXNlZCBibG9ja3MnIGxpZmV0aW1lIG1hbmFnZW1lbnQKKyAgICBtT3V0cHV0QnVmZmVyUXVldWVNdXRleC5sb2NrKCk7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gaWdicCA9IG1PdXRwdXRJZ2JwOworICAgIHVpbnQ2NF90IGJxSWQgPSBtT3V0cHV0QnFJZDsKKyAgICB1aW50MzJfdCBnZW5lcmF0aW9uID0gbU91dHB1dEdlbmVyYXRpb247CisgICAgbU91dHB1dEJ1ZmZlclF1ZXVlTXV0ZXgudW5sb2NrKCk7CisKKyAgICBpZiAoaWdicCkgeworICAgICAgICBob2xkQnVmZmVyUXVldWVCbG9ja3MoKmZsdXNoZWRXb3JrLCBpZ2JwLCBicUlkLCBnZW5lcmF0aW9uKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6ZHJhaW4oQzJDb21wb25lbnQ6OmRyYWluX21vZGVfdCBtb2RlKSB7CisgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNTdGF0dXMgPSBiYXNlKCktPmRyYWluKAorICAgICAgICAgICAgbW9kZSA9PSBDMkNvbXBvbmVudDo6RFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TKTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiZHJhaW4gLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiIpOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJkcmFpbiAtLSBjYWxsIGZhaWxlZC4gIgorICAgICAgICAgICAgICAgICJFcnJvciBjb2RlID0gJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6c3RhcnQoKSB7CisgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNTdGF0dXMgPSBiYXNlKCktPnN0YXJ0KCk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoInN0YXJ0IC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iKTsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zU3RhdHVzKSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgic3RhcnQgLS0gY2FsbCBmYWlsZWQuICIKKyAgICAgICAgICAgICAgICAiRXJyb3IgY29kZSA9ICVkIiwgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OnN0b3AoKSB7CisgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNTdGF0dXMgPSBiYXNlKCktPnN0b3AoKTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgic3RvcCAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIik7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3RhdGljX2Nhc3Q8U3RhdHVzPih0cmFuc1N0YXR1cykpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoInN0b3AgLS0gY2FsbCBmYWlsZWQuICIKKyAgICAgICAgICAgICAgICAiRXJyb3IgY29kZSA9ICVkIiwgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICB9CisgICAgbUlucHV0QnVmZmVyc011dGV4LmxvY2soKTsKKyAgICBtSW5wdXRCdWZmZXJzLmNsZWFyKCk7CisgICAgbUlucHV0QnVmZmVyQ291bnQuY2xlYXIoKTsKKyAgICBtSW5wdXRCdWZmZXJzTXV0ZXgudW5sb2NrKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OnJlc2V0KCkgeworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gYmFzZSgpLT5yZXNldCgpOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJyZXNldCAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIik7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3RhdGljX2Nhc3Q8U3RhdHVzPih0cmFuc1N0YXR1cykpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoInJlc2V0IC0tIGNhbGwgZmFpbGVkLiAiCisgICAgICAgICAgICAgICAgIkVycm9yIGNvZGUgPSAlZCIsIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgfQorICAgIG1JbnB1dEJ1ZmZlcnNNdXRleC5sb2NrKCk7CisgICAgbUlucHV0QnVmZmVycy5jbGVhcigpOworICAgIG1JbnB1dEJ1ZmZlckNvdW50LmNsZWFyKCk7CisgICAgbUlucHV0QnVmZmVyc011dGV4LnVubG9jaygpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpyZWxlYXNlKCkgeworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gYmFzZSgpLT5yZWxlYXNlKCk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoInJlbGVhc2UgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiIpOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJyZWxlYXNlIC0tIGNhbGwgZmFpbGVkLiAiCisgICAgICAgICAgICAgICAgIkVycm9yIGNvZGUgPSAlZCIsIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgfQorICAgIG1JbnB1dEJ1ZmZlcnNNdXRleC5sb2NrKCk7CisgICAgbUlucHV0QnVmZmVycy5jbGVhcigpOworICAgIG1JbnB1dEJ1ZmZlckNvdW50LmNsZWFyKCk7CisgICAgbUlucHV0QnVmZmVyc011dGV4LnVubG9jaygpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpzZXRPdXRwdXRTdXJmYWNlKAorICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBibG9ja1Bvb2xJZCwKKyAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHN1cmZhY2UsCisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24pIHsKKyAgICBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBpZ2JwID0gc3VyZmFjZS0+Z2V0SGFsSW50ZXJmYWNlKCk7CisgICAgaWYgKCFpZ2JwKSB7CisgICAgICAgIGlnYnAgPSBuZXcgVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4oc3VyZmFjZSk7CisgICAgfQorCisgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNTdGF0dXMgPSBiYXNlKCktPnNldE91dHB1dFN1cmZhY2UoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50NjRfdD4oYmxvY2tQb29sSWQpLCBpZ2JwKTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgic2V0T3V0cHV0U3VyZmFjZSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIik7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3RhdGljX2Nhc3Q8U3RhdHVzPih0cmFuc1N0YXR1cykpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoInNldE91dHB1dFN1cmZhY2UgLS0gY2FsbCBmYWlsZWQuICIKKyAgICAgICAgICAgICAgICAiRXJyb3IgY29kZSA9ICVkIiwgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtT3V0cHV0QnVmZmVyUXVldWVNdXRleCk7CisgICAgICAgIGlmIChtT3V0cHV0SWdicCAhPSBzdXJmYWNlKSB7CisgICAgICAgICAgICBtT3V0cHV0SWdicCA9IHN1cmZhY2U7CisgICAgICAgICAgICBpZiAoIXN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICBtT3V0cHV0QnFJZCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN1cmZhY2UtPmdldFVuaXF1ZUlkKCZtT3V0cHV0QnFJZCkgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgic2V0T3V0cHV0U3VyZmFjZSAtLSBjYW5ub3Qgb2J0YWluIGJ1ZmZlcnF1ZXVlIGlkLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1PdXRwdXRHZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OnF1ZXVlVG9PdXRwdXRTdXJmYWNlKAorICAgICAgICBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICAgICAgY29uc3QgUXVldWVCdWZmZXJJbnB1dCYgaW5wdXQsCisgICAgICAgIFF1ZXVlQnVmZmVyT3V0cHV0KiBvdXRwdXQpIHsKKyAgICB1aW50MzJfdCBnZW5lcmF0aW9uOworICAgIHVpbnQ2NF90IGJxSWQ7CisgICAgaW50MzJfdCBicVNsb3Q7CisgICAgaWYgKCFnZXRCdWZmZXJRdWV1ZUFzc2lnbm1lbnQoYmxvY2ssICZnZW5lcmF0aW9uLCAmYnFJZCwgJmJxU2xvdCkgfHwKKyAgICAgICAgICAgIGJxSWQgPT0gMCkgeworICAgICAgICAvLyBCbG9jayBub3QgZnJvbSBidWZmZXJxdWV1ZSAtLSBpdCBtdXN0IGJlIGF0dGFjaGVkIGJlZm9yZSBxdWV1aW5nLgorCisgICAgICAgIG1PdXRwdXRCdWZmZXJRdWV1ZU11dGV4LmxvY2soKTsKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gb3V0cHV0SWdicCA9IG1PdXRwdXRJZ2JwOworICAgICAgICB1aW50MzJfdCBvdXRwdXRHZW5lcmF0aW9uID0gbU91dHB1dEdlbmVyYXRpb247CisgICAgICAgIG1PdXRwdXRCdWZmZXJRdWV1ZU11dGV4LnVubG9jaygpOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9ICFhdHRhY2hUb0J1ZmZlclF1ZXVlKGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRJZ2JwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRHZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnFTbG90KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgQUxPR1coInF1ZXVlVG9PdXRwdXRTdXJmYWNlIC0tIGF0dGFjaGluZyBmYWlsZWQuIik7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXMgPSBvdXRwdXRJZ2JwLT5xdWV1ZUJ1ZmZlcihzdGF0aWNfY2FzdDxpbnQ+KGJxU2xvdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCBvdXRwdXQpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgicXVldWVUb091dHB1dFN1cmZhY2UgLS0gcXVldWVCdWZmZXIoKSBmYWlsZWQgIgorICAgICAgICAgICAgICAgICAgICAib24gbm9uLWJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrLiAiCisgICAgICAgICAgICAgICAgICAgICJFcnJvciBjb2RlID0gJWQuIiwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIG1PdXRwdXRCdWZmZXJRdWV1ZU11dGV4LmxvY2soKTsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBvdXRwdXRJZ2JwID0gbU91dHB1dElnYnA7CisgICAgdWludDY0X3Qgb3V0cHV0QnFJZCA9IG1PdXRwdXRCcUlkOworICAgIHVpbnQzMl90IG91dHB1dEdlbmVyYXRpb24gPSBtT3V0cHV0R2VuZXJhdGlvbjsKKyAgICBtT3V0cHV0QnVmZmVyUXVldWVNdXRleC51bmxvY2soKTsKKworICAgIGlmICghb3V0cHV0SWdicCkgeworICAgICAgICBBTE9HVigicXVldWVUb091dHB1dFN1cmZhY2UgLS0gb3V0cHV0IHN1cmZhY2UgaXMgbnVsbC4iKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgaWYgKGJxSWQgIT0gb3V0cHV0QnFJZCkgeworICAgICAgICBBTE9HVigicXVldWVUb091dHB1dFN1cmZhY2UgLS0gYnVmZmVycXVldWUgaWRzIG1pc21hdGNoLiIpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgaWYgKGdlbmVyYXRpb24gIT0gb3V0cHV0R2VuZXJhdGlvbikgeworICAgICAgICBBTE9HVigicXVldWVUb091dHB1dFN1cmZhY2UgLS0gZ2VuZXJhdGlvbiBudW1iZXJzIG1pc21hdGNoLiIpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3V0cHV0SWdicC0+cXVldWVCdWZmZXIoc3RhdGljX2Nhc3Q8aW50PihicVNsb3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCBvdXRwdXQpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0QoInF1ZXVlVG9PdXRwdXRTdXJmYWNlIC0tIHF1ZXVlQnVmZmVyKCkgZmFpbGVkICIKKyAgICAgICAgICAgICAgICAib24gYnVmZmVycXVldWUtYmFzZWQgYmxvY2suICIKKyAgICAgICAgICAgICAgICAiRXJyb3IgY29kZSA9ICVkLiIsCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgaWYgKCF5aWVsZEJ1ZmZlclF1ZXVlQmxvY2soYmxvY2spKSB7CisgICAgICAgIEFMT0dEKCJxdWV1ZVRvT3V0cHV0U3VyZmFjZSAtLSBjYW5ub3QgeWllbGQgYnVmZmVycXVldWUtYmFzZWQgYmxvY2sgIgorICAgICAgICAgICAgICAgICJ0byB0aGUgYnVmZmVycXVldWUuIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50Ojpjb25uZWN0VG9PbXhJbnB1dFN1cmZhY2UoCisgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBwcm9kdWNlciwKKyAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UpIHsKKyAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1N0YXR1cyA9IGJhc2UoKS0+Y29ubmVjdFRvT214SW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgcHJvZHVjZXIsIHNvdXJjZSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoImNvbm5lY3RUb09teElucHV0U3VyZmFjZSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIik7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3RhdGljX2Nhc3Q8U3RhdHVzPih0cmFuc1N0YXR1cykpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImNvbm5lY3RUb09teElucHV0U3VyZmFjZSAtLSBjYWxsIGZhaWxlZC4gIgorICAgICAgICAgICAgICAgICJFcnJvciBjb2RlID0gJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6ZGlzY29ubmVjdEZyb21JbnB1dFN1cmZhY2UoKSB7CisgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNTdGF0dXMgPSBiYXNlKCktPmRpc2Nvbm5lY3RGcm9tSW5wdXRTdXJmYWNlKCk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoImRpc2Nvbm5lY3RUb0lucHV0U3VyZmFjZSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIik7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3RhdGljX2Nhc3Q8U3RhdHVzPih0cmFuc1N0YXR1cykpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImRpc2Nvbm5lY3RGcm9tSW5wdXRTdXJmYWNlIC0tIGNhbGwgZmFpbGVkLiAiCisgICAgICAgICAgICAgICAgIkVycm9yIGNvZGUgPSAlZCIsIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpzZXREZWF0aExpc3RlbmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+JiBsaXN0ZW5lcikgeworCisgICAgc3RydWN0IEhpZGxEZWF0aFJlY2lwaWVudCA6IHB1YmxpYyBoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQgeworICAgICAgICBzdGQ6OndlYWtfcHRyPENvbXBvbmVudD4gY29tcG9uZW50OworICAgICAgICBzdGQ6OndlYWtfcHRyPExpc3RlbmVyPiBiYXNlOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXJ2aWNlRGllZCgKKyAgICAgICAgICAgICAgICB1aW50NjRfdCAvKiBjb29raWUgKi8sCisgICAgICAgICAgICAgICAgY29uc3Qgd3A8OjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIC8qIHdobyAqLworICAgICAgICAgICAgICAgICkgb3ZlcnJpZGUgeworICAgICAgICAgICAgaWYgKHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IGJhc2UubG9jaygpKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXItPm9uRGVhdGgoY29tcG9uZW50KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coIm9uRGVhdGggLS0gbGlzdGVuZXIgZGllZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBzcDxIaWRsRGVhdGhSZWNpcGllbnQ+IGRlYXRoUmVjaXBpZW50ID0gbmV3IEhpZGxEZWF0aFJlY2lwaWVudCgpOworICAgIGRlYXRoUmVjaXBpZW50LT5iYXNlID0gbGlzdGVuZXI7CisgICAgZGVhdGhSZWNpcGllbnQtPmNvbXBvbmVudCA9IGNvbXBvbmVudDsKKworICAgIGNvbXBvbmVudC0+bURlYXRoUmVjaXBpZW50ID0gZGVhdGhSZWNpcGllbnQ7CisgICAgUmV0dXJuPGJvb2w+IHRyYW5zUmVzdWx0ID0gY29tcG9uZW50LT5iYXNlKCktPmxpbmtUb0RlYXRoKAorICAgICAgICAgICAgY29tcG9uZW50LT5tRGVhdGhSZWNpcGllbnQsIDApOworICAgIGlmICghdHJhbnNSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJzZXREZWF0aExpc3RlbmVyIC0tIGZhaWxlZCB0cmFuc2FjdGlvbjogbGlua1RvRGVhdGguIik7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIGlmICghc3RhdGljX2Nhc3Q8Ym9vbD4odHJhbnNSZXN1bHQpKSB7CisgICAgICAgIEFMT0dFKCJzZXREZWF0aExpc3RlbmVyIC0tIGxpbmtUb0RlYXRoIGNhbGwgZmFpbGVkLiIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKy8vIENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlCisKK0NvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlOjpCYXNlKiBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZTo6YmFzZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QmFzZSo+KG1CYXNlLmdldCgpKTsKK30KKworQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U6OklucHV0U3VyZmFjZShjb25zdCBzcDxJSW5wdXRTdXJmYWNlPiYgYmFzZSkgOgorICAgIG1CYXNlKGJhc2UpLAorICAgIG1HcmFwaGljQnVmZmVyUHJvZHVjZXIobmV3CisgICAgICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OnV0aWxzOjoKKyAgICAgICAgICAgIEgyQkdyYXBoaWNCdWZmZXJQcm9kdWNlcihiYXNlKSkgeworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZTo6Y29ubmVjdFRvQ29tcG9uZW50KAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb25uZWN0aW9uPiogY29ubmVjdGlvbikgeworICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBiYXNlKCktPmNvbm5lY3RUb0NvbXBvbmVudCgKKyAgICAgICAgY29tcG9uZW50LT5iYXNlKCksCisgICAgICAgIFsmc3RhdHVzLCBjb25uZWN0aW9uXSgKKyAgICAgICAgICAgICAgICBTdGF0dXMgcywKKyAgICAgICAgICAgICAgICBjb25zdCBzcDxJSW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4mIGMpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiY29ubmVjdFRvQ29tcG9uZW50IC0tIGNhbGwgZmFpbGVkLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgY29kZSA9ICVkIiwgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqY29ubmVjdGlvbiA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q29ubmVjdGlvbj4oYyk7CisgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJjb25uZWN0IC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iKTsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29uZmlndXJhYmxlPgorICAgICAgICBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZTo6Z2V0Q29uZmlndXJhYmxlKCkgY29uc3QgeworICAgIFJldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gdHJhbnNSZXN1bHQgPSBiYXNlKCktPmdldENvbmZpZ3VyYWJsZSgpOworICAgIGlmICghdHJhbnNSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIEFMT0dXKCJnZXRDb25maWd1cmFibGUgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKCFzdGF0aWNfY2FzdDxzcDxJQ29uZmlndXJhYmxlPj4odHJhbnNSZXN1bHQpKSB7CisgICAgICAgIEFMT0dXKCJnZXRDb25maWd1cmFibGUgLS0gbnVsbCBwb2ludGVyLiIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8Q29uZmlndXJhYmxlPih0cmFuc1Jlc3VsdCk7Cit9CisKK2NvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JgorICAgICAgICBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZTo6Z2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkgY29uc3QgeworICAgIHJldHVybiBtR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworfQorCitjb25zdCBzcDxJSW5wdXRTdXJmYWNlPiYgQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U6OmdldEhhbEludGVyZmFjZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUJhc2U7Cit9CisKKy8vIENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlQ29ubmVjdGlvbgorCitDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZUNvbm5lY3Rpb246OkJhc2UqCisgICAgICAgIENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlQ29ubmVjdGlvbjo6YmFzZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QmFzZSo+KG1CYXNlLmdldCgpKTsKK30KKworQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uKAorICAgICAgICBjb25zdCBzcDxDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZUNvbm5lY3Rpb246OkJhc2U+JiBiYXNlKSA6CisgICAgbUJhc2UoYmFzZSkgeworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZUNvbm5lY3Rpb246OmRpc2Nvbm5lY3QoKSB7CisgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNSZXN1bHQgPSBiYXNlKCktPmRpc2Nvbm5lY3QoKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNSZXN1bHQpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2luY2x1ZGUvY29kZWMyL2hpZGwvY2xpZW50LmggYi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvaW5jbHVkZS9jb2RlYzIvaGlkbC9jbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDhiZjBjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2luY2x1ZGUvY29kZWMyL2hpZGwvY2xpZW50LmgKQEAgLTAsMCArMSw0ODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX0NMSUVOVF9IXworI2RlZmluZSBDT0RFQzJfSElETF9DTElFTlRfSF8KKworI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8QzIuaD4KKworI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisKKy8qKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIG1pbmltYWwgaW50ZXJmYWNlcyBmb3IgdGhlIGZyYW1ld29yayB0byBhY2Nlc3MgQ29kZWMyLjAuCisgKgorICogQ29kZWMyQ2xpZW50IGlzIHRoZSBtYWluIGNsYXNzIHRoYXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBpbm5lciBjbGFzc2VzOgorICogLSBMaXN0ZW5lcgorICogLSBDb25maWd1cmFibGUKKyAqIC0gSW50ZXJmYWNlCisgKiAtIENvbXBvbmVudAorICoKKyAqIENsYXNzZXMgaW4gQ29kZWMyQ2xpZW50LCBpbnRlcmZhY2VzIGluIENvZGVjMi4wLCBhbmQgIEhJREwgaW50ZXJmYWNlcyBhcmUKKyAqIHJlbGF0ZWQgYXMgZm9sbG93czoKKyAqIC0gQ29kZWMyQ2xpZW50IDw9PT4gQzJDb21wb25lbnRTdG9yZSA8PT0+IElDb21wb25lbnRTdG9yZQorICogLSBDb2RlYzJDbGllbnQ6Okxpc3RlbmVyIDw9PT4gQzJDb21wb25lbnQ6Okxpc3RlbmVyIDw9PT4gSUNvbXBvbmVudExpc3RlbmVyCisgKiAtIENvZGVjMkNsaWVudDo6Q29uZmlndXJhYmxlIDw9PT4gW05vIGVxdWl2YWxlbnRdIDw9PT4gSUNvbmZpZ3VyYWJsZQorICogLSBDb2RlYzJDbGllbnQ6OkludGVyZmFjZSA8PT0+IEMyQ29tcG9uZW50SW50ZXJmYWNlIDw9PT4gSUNvbXBvbmVudEludGVyZmFjZQorICogLSBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudCA8PT0+IEMyQ29tcG9uZW50IDw9PT4gSUNvbXBvbmVudAorICoKKyAqIFRoZSBlbnRyeSBwb2ludCBpcyBDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKCksIHdoaWNoIGNyZWF0ZXMgYQorICogQ29kZWMyQ2xpZW50IG9iamVjdC4gRnJvbSBDb2RlYzJDbGllbnQsIEludGVyZmFjZSBhbmQgQ29tcG9uZW50IG9iamVjdHMgY2FuCisgKiBiZSBjcmVhdGVkIGJ5IGNhbGxpbmcgY3JlYXRlQ29tcG9uZW50KCkgYW5kIGNyZWF0ZUludGVyZmFjZSgpLgorICoKKyAqIGNyZWF0ZUNvbXBvbmVudCgpIHRha2VzIGEgTGlzdGVuZXIgb2JqZWN0LCB3aGljaCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHRoZQorICogdXNlci4KKyAqCisgKiBBdCB0aGUgcHJlc2VudCwgY3JlYXRlQmxvY2tQb29sKCkgaXMgdGhlIG9ubHkgbWV0aG9kIHRoYXQgeWllbGRzIGEKKyAqIENvbmZpZ3VyYWJsZSBvYmplY3QuIE5vdGUsIGhvd2V2ZXIsIHRoYXQgSW50ZXJmYWNlLCBDb21wb25lbnQgYW5kCisgKiBDb2RlYzJDbGllbnQgYXJlIGFsbCBzdWJjbGFzc2VzIG9mIENvbmZpZ3VyYWJsZS4KKyAqLworCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIENvZGVjMi4wIEhJREwgaW50ZXJmYWNlcworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworc3RydWN0IElDb25maWd1cmFibGU7CitzdHJ1Y3QgSUNvbXBvbmVudEludGVyZmFjZTsKK3N0cnVjdCBJQ29tcG9uZW50Oworc3RydWN0IElDb21wb25lbnRTdG9yZTsKK3N0cnVjdCBJSW5wdXRTdXJmYWNlOworc3RydWN0IElJbnB1dFN1cmZhY2VDb25uZWN0aW9uOworfSAvLyBuYW1lc3BhY2UgVjFfMAorfSAvLyBuYW1lc3BhY2UgYzIKK30gLy8gbmFtZXNwYWNlIG1lZGlhCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK3N0cnVjdCBJQ2xpZW50TWFuYWdlcjsKK30gLy8gbmFtZXNwYWNlIFYyXzAKK30gLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gLy8gbmFtZXNwYWNlIG1lZGlhCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucyBvZiBvdGhlciBjbGFzc2VzCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGdyYXBoaWNzIHsKK25hbWVzcGFjZSBidWZmZXJxdWV1ZSB7CituYW1lc3BhY2UgVjFfMCB7CitzdHJ1Y3QgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK30gLy8gbmFtZXNwYWNlIFYxXzAKK30gLy8gbmFtZXNwYWNlIGJ1ZmZlcnF1ZXVlCit9IC8vIG5hbWVzcGFjZSBncmFwaGljcworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBvbXggeworbmFtZXNwYWNlIFYxXzAgeworc3RydWN0IElHcmFwaGljQnVmZmVyU291cmNlOworfSAvLyBuYW1lc3BhY2UgVjFfMAorfSAvLyBuYW1lc3BhY2Ugb214Cit9IC8vIG5hbWVzcGFjZSBtZWRpYQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBUaGlzIGNsYXNzIGlzIHN1cHBvc2VkIHRvIGJlIGNhbGxlZCBDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZSwgYnV0IGZvcndhcmQKKy8vIGRlY2xhcmF0aW9uIG9mIGFuIGlubmVyIGNsYXNzIGlzIG5vdCBwb3NzaWJsZS4KK3N0cnVjdCBDb2RlYzJDb25maWd1cmFibGVDbGllbnQgeworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb25maWd1cmFibGUgQmFzZTsKKworICAgIGNvbnN0IEMyU3RyaW5nJiBnZXROYW1lKCkgY29uc3Q7CisKKyAgICBjMl9zdGF0dXNfdCBxdWVyeSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiYgc3RhY2tQYXJhbXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgaGVhcFBhcmFtcykgY29uc3Q7CisKKyAgICBjMl9zdGF0dXNfdCBjb25maWcoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKTsKKworICAgIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4qIGNvbnN0IHBhcmFtcworICAgICAgICAgICAgKSBjb25zdDsKKworICAgIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiYgZmllbGRzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3Q7CisKKyAgICAvLyBiYXNlIGNhbm5vdCBiZSBudWxsLgorICAgIENvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudChjb25zdCBzcDxCYXNlPiYgYmFzZSk7CisKK3Byb3RlY3RlZDoKKyAgICBDMlN0cmluZyBtTmFtZTsKKyAgICBzcDxCYXNlPiBtQmFzZTsKKworICAgIEJhc2UqIGJhc2UoKSBjb25zdDsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQ29kZWMyQ2xpZW50OworfTsKKworc3RydWN0IENvZGVjMkNsaWVudCA6IHB1YmxpYyBDb2RlYzJDb25maWd1cmFibGVDbGllbnQgeworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb21wb25lbnRTdG9yZSBCYXNlOworCisgICAgc3RydWN0IExpc3RlbmVyOworCisgICAgdHlwZWRlZiBDb2RlYzJDb25maWd1cmFibGVDbGllbnQgQ29uZmlndXJhYmxlOworCisgICAgdHlwZWRlZiBDb25maWd1cmFibGUgSW50ZXJmYWNlOyAvLyBUaGVzZSB0d28gdHlwZXMgbWF5IGRpdmVyZ2UgaW4gdGhlIGZ1dHVyZS4KKworICAgIHN0cnVjdCBDb21wb25lbnQ7CisKKyAgICBzdHJ1Y3QgSW5wdXRTdXJmYWNlOworCisgICAgc3RydWN0IElucHV0U3VyZmFjZUNvbm5lY3Rpb247CisKKyAgICB0eXBlZGVmIENvZGVjMkNsaWVudCBTdG9yZTsKKworICAgIHN0ZDo6c3RyaW5nIGdldEluc3RhbmNlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1JbnN0YW5jZU5hbWU7IH0KKworICAgIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGNvbnN0IEMyU3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiogY29uc3QgY29tcG9uZW50KTsKKworICAgIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IEMyU3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSk7CisKKyAgICBjMl9zdGF0dXNfdCBjcmVhdGVJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlPiogY29uc3QgaW5wdXRTdXJmYWNlKTsKKworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+JiBsaXN0Q29tcG9uZW50cygpIGNvbnN0OworCisgICAgYzJfc3RhdHVzX3QgY29weUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIHNyYywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIGRzdCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gZ2V0UGFyYW1SZWZsZWN0b3IoKTsKKworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBDcmVhdGVGcm9tU2VydmljZSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGluc3RhbmNlTmFtZSwKKyAgICAgICAgICAgIGJvb2wgd2FpdEZvclNlcnZpY2UgPSB0cnVlKTsKKworICAgIC8vIFRyeSB0byBjcmVhdGUgYSBjb21wb25lbnQgd2l0aCBhIGdpdmVuIG5hbWUgZnJvbSBhbGwga25vd24KKyAgICAvLyBJQ29tcG9uZW50U3RvcmUgc2VydmljZXMuCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnQ+IENyZWF0ZUNvbXBvbmVudEJ5TmFtZSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbXBvbmVudE5hbWUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+KiBvd25lciA9IG51bGxwdHIpOworCisgICAgLy8gVHJ5IHRvIGNyZWF0ZSBhIGNvbXBvbmVudCBpbnRlcmZhY2Ugd2l0aCBhIGdpdmVuIG5hbWUgZnJvbSBhbGwga25vd24KKyAgICAvLyBJQ29tcG9uZW50U3RvcmUgc2VydmljZXMuCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJbnRlcmZhY2U+IENyZWF0ZUludGVyZmFjZUJ5TmFtZSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGludGVyZmFjZU5hbWUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50Piogb3duZXIgPSBudWxscHRyKTsKKworICAgIC8vIExpc3QgdHJhaXRzIGZyb20gYWxsIGtub3duIElDb21wb25lbnRTdG9yZSBzZXJ2aWNlcy4KKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4mIExpc3RDb21wb25lbnRzKCk7CisKKyAgICAvLyBDcmVhdGUgYW4gaW5wdXQgc3VyZmFjZS4KKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZT4gQ3JlYXRlSW5wdXRTdXJmYWNlKCk7CisKKyAgICAvLyBiYXNlIGNhbm5vdCBiZSBudWxsLgorICAgIENvZGVjMkNsaWVudChjb25zdCBzcDxCYXNlPiYgYmFzZSwgc3RkOjpzdHJpbmcgaW5zdGFuY2VOYW1lKTsKKworcHJvdGVjdGVkOgorICAgIEJhc2UqIGJhc2UoKSBjb25zdDsKKworICAgIC8vIEZpbmRzIHRoZSBmaXJzdCBzdG9yZSB3aGVyZSB0aGUgcHJlZGljYXRlIHJldHVybnMgT0ssIGFuZCByZXR1cm5zIHRoZSBsYXN0CisgICAgLy8gcHJlZGljYXRlIHJlc3VsdC4gVXNlcyBrZXkgdG8gcmVtZW1iZXIgdGhlIGxhc3Qgc3RvcmUgZm91bmQsIGFuZCBpZiBjYWNoZWQsCisgICAgLy8gaXQgdHJpZXMgdGhhdCBzdG9yZSBiZWZvcmUgdHJ5aW5nIGFsbCBzdG9yZXMgKG9uZSByZXRyeSkuCisgICAgc3RhdGljIGMyX3N0YXR1c190IEZvckFsbFN0b3JlcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+Jik+IHByZWRpY2F0ZSk7CisKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIG11dGFibGUgYm9vbCBtTGlzdGVkOworICAgIHN0ZDo6c3RyaW5nIG1JbnN0YW5jZU5hbWU7CisgICAgbXV0YWJsZSBzdGQ6OnZlY3RvcjxDMkNvbXBvbmVudDo6VHJhaXRzPiBtVHJhaXRzTGlzdDsKKyAgICBtdXRhYmxlIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+PgorICAgICAgICAgICAgbUFsaWFzZXNCdWZmZXI7CisKKyAgICBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUNsaWVudE1hbmFnZXI+CisgICAgICAgICAgICBtSG9zdFBvb2xNYW5hZ2VyOworfTsKKworc3RydWN0IENvZGVjMkNsaWVudDo6TGlzdGVuZXIgeworCisgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgY29tcG9uZW50IHByb2R1Y2VzIHNvbWUgb3V0cHV0LgorICAgIC8vCisgICAgLy8gbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzIGlzIHRoZSBudW1iZXIgb2YgaW5wdXQgYnVmZmVycyBjb250YWluZWQgaW4KKyAgICAvLyB3b3JrSXRlbXMgdGhhdCBoYXZlIGp1c3QgYmVjb21lIHVudXNlZC4gTm90ZSB0aGF0IHdvcmtJdGVtcyBtYXkgY29udGFpbgorICAgIC8vIG1vcmUgaW5wdXQgYnVmZmVycyB0aGFuIG51bURpc2NhcmRlZElucHV0QnVmZmVycyBiZWNhdXNlIGJ1ZmZlcnMgdGhhdAorICAgIC8vIGhhdmUgYmVlbiBwcmV2aW91c2x5IHJlcG9ydGVkIGJ5IG9uSW5wdXRCdWZmZXJEb25lKCkgYXJlIG5vdCBjb3VudGVkCisgICAgLy8gdG93YXJkcyBudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnMsIGJ1dCBtYXkgc3RpbGwgc2hvdyB1cCBpbiB3b3JrSXRlbXMuCisgICAgdmlydHVhbCB2b2lkIG9uV29ya0RvbmUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPENvbXBvbmVudD4mIGNvbXAsCisgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMsCisgICAgICAgICAgICBzaXplX3QgbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzKSA9IDA7CisKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBjb21wb25lbnQgZ29lcyBpbnRvIGEgdHJpcHBlZCBzdGF0ZS4KKyAgICB2aXJ0dWFsIHZvaWQgb25UcmlwcGVkKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxDb21wb25lbnQ+JiBjb21wLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+JiBzZXR0aW5nUmVzdWx0cworICAgICAgICAgICAgKSA9IDA7CisKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBjb21wb25lbnQgZW5jb3VudGVycyBhbiBlcnJvci4KKyAgICB2aXJ0dWFsIHZvaWQgb25FcnJvcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8Q29tcG9uZW50PiYgY29tcCwKKyAgICAgICAgICAgIHVpbnQzMl90IGVycm9yQ29kZSkgPSAwOworCisgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgcHJvY2VzcyB0aGF0IGhvc3RzIHRoZSBjb21wb25lbnQgc2h1dHMgZG93bgorICAgIC8vIHVuZXhwZWN0ZWRseS4KKyAgICB2aXJ0dWFsIHZvaWQgb25EZWF0aCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8Q29tcG9uZW50PiYgY29tcCkgPSAwOworCisgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiBhbiBpbnB1dCBidWZmZXIgaXMgbm8gbG9uZ2VyIGluIHVzZSBieSB0aGUgY29kZWMuCisgICAgLy8gSW5wdXQgYnVmZmVycyB0aGF0IGhhdmUgYmVlbiByZXR1cm5lZCBieSBvbldvcmtEb25lKCkgb3IgZmx1c2goKSB3aWxsIG5vdAorICAgIC8vIHRyaWdnZXIgYSBjYWxsIHRvIHRoaXMgZnVuY3Rpb24uCisgICAgdmlydHVhbCB2b2lkIG9uSW5wdXRCdWZmZXJEb25lKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiYgYnVmZmVyKSA9IDA7CisKKyAgICAvLyBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciB0cmFuc3BvcnRpbmcgb25GcmFtZXNSZW5kZXJlZCgpIGV2ZW50IHRvIHRoZQorICAgIC8vIGNsaWVudCBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgb3V0cHV0IGJ1ZmZlcnMgYXJlIG9idGFpbmVkIGZyb20gYQorICAgIC8vIGJ1ZmZlcnF1ZXVlLgorICAgIHN0cnVjdCBSZW5kZXJlZEZyYW1lIHsKKyAgICAgICAgLy8gVGhlIGlkIG9mIHRoZSBidWZmZXJxdWV1ZS4KKyAgICAgICAgdWludDY0X3QgYnVmZmVyUXVldWVJZDsKKyAgICAgICAgLy8gVGhlIHNsb3Qgb2YgdGhlIGJ1ZmZlciBpbnNpZGUgdGhlIGJ1ZmZlcnF1ZXVlLgorICAgICAgICBpbnQzMl90IHNsb3RJZDsKKyAgICAgICAgLy8gVGhlIHRpbWVzdGFtcC4KKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBOczsKKworICAgICAgICBSZW5kZXJlZEZyYW1lKHVpbnQ2NF90IGJ1ZmZlclF1ZXVlSWQsIGludDMyX3Qgc2xvdElkLAorICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wTnMpCisgICAgICAgICAgICAgIDogYnVmZmVyUXVldWVJZChidWZmZXJRdWV1ZUlkKSwKKyAgICAgICAgICAgICAgICBzbG90SWQoc2xvdElkKSwKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBOcyh0aW1lc3RhbXBOcykge30KKyAgICAgICAgUmVuZGVyZWRGcmFtZShjb25zdCBSZW5kZXJlZEZyYW1lJikgPSBkZWZhdWx0OworICAgIH07CisKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBjb21wb25lbnQgYmVjb21lcyBhd2FyZSBvZiBmcmFtZXMgYmVpbmcgcmVuZGVyZWQuCisgICAgdmlydHVhbCB2b2lkIG9uRnJhbWVzUmVuZGVyZWQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxSZW5kZXJlZEZyYW1lPiYgcmVuZGVyZWRGcmFtZXMpID0gMDsKKworICAgIHZpcnR1YWwgfkxpc3RlbmVyKCk7CisKK307CisKK3N0cnVjdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudCA6IHB1YmxpYyBDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZSB7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUNvbXBvbmVudCBCYXNlOworCisgICAgYzJfc3RhdHVzX3QgY3JlYXRlQmxvY2tQb29sKAorICAgICAgICAgICAgQzJBbGxvY2F0b3I6OmlkX3QgaWQsCisgICAgICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCogYmxvY2tQb29sSWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29uZmlndXJhYmxlPiogY29uZmlndXJhYmxlKTsKKworICAgIGMyX3N0YXR1c190IGRlc3Ryb3lCbG9ja1Bvb2woCisgICAgICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBsb2NhbElkKTsKKworICAgIGMyX3N0YXR1c190IHF1ZXVlKAorICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgaXRlbXMpOworCisgICAgYzJfc3RhdHVzX3QgZmx1c2goCisgICAgICAgICAgICBDMkNvbXBvbmVudDo6Zmx1c2hfbW9kZV90IG1vZGUsCisgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBmbHVzaGVkV29yayk7CisKKyAgICBjMl9zdGF0dXNfdCBkcmFpbihDMkNvbXBvbmVudDo6ZHJhaW5fbW9kZV90IG1vZGUpOworCisgICAgYzJfc3RhdHVzX3Qgc3RhcnQoKTsKKworICAgIGMyX3N0YXR1c190IHN0b3AoKTsKKworICAgIGMyX3N0YXR1c190IHJlc2V0KCk7CisKKyAgICBjMl9zdGF0dXNfdCByZWxlYXNlKCk7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIElHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisgICAgdHlwZWRlZiBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjoKKyAgICAgICAgICAgIFF1ZXVlQnVmZmVySW5wdXQgUXVldWVCdWZmZXJJbnB1dDsKKyAgICB0eXBlZGVmIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OgorICAgICAgICAgICAgUXVldWVCdWZmZXJPdXRwdXQgUXVldWVCdWZmZXJPdXRwdXQ7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjoKKyAgICAgICAgICAgIElHcmFwaGljQnVmZmVyU291cmNlIEhHcmFwaGljQnVmZmVyU291cmNlOworCisgICAgLy8gU2V0IHRoZSBvdXRwdXQgc3VyZmFjZSB0byBiZSB1c2VkIHdpdGggYSBibG9ja3Bvb2wgcHJldmlvdXNseSBjcmVhdGVkIGJ5CisgICAgLy8gY3JlYXRlQmxvY2tQb29sKCkuCisgICAgYzJfc3RhdHVzX3Qgc2V0T3V0cHV0U3VyZmFjZSgKKyAgICAgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGJsb2NrUG9vbElkLAorICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHN1cmZhY2UsCisgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uKTsKKworICAgIC8vIEV4dHJhY3QgYSBzbG90IG51bWJlciBmcm9tIG9mIHRoZSBibG9jaywgdGhlbiBjYWxsCisgICAgLy8gSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6cXVldWVCdWZmZXIoKS4KKyAgICAvLworICAgIC8vIElmIHRoZSBvdXRwdXQgc3VyZmFjZSBoYXMgbm90IGJlZW4gc2V0LCBOT19JTklUIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgLy8KKyAgICAvLyBJZiB0aGUgYmxvY2sgZG9lcyBub3QgY29tZSBmcm9tIGEgYnVmZmVycXVldWUtYmFzZWQgYmxvY2twb29sLAorICAgIC8vIGF0dGFjaEJ1ZmZlcigpIHdpbGwgYmUgY2FsbGVkLCBmb2xsb3dlZCBieSBxdWV1ZUJ1ZmZlcigpLgorICAgIC8vCisgICAgLy8gSWYgdGhlIGJsb2NrIGhhcyBhIGJxSWQgdGhhdCBkb2VzIG5vdCBtYXRjaCB0aGUgaWQgb2YgdGhlIG91dHB1dCBzdXJmYWNlLAorICAgIC8vIERFQURfT0JKRUNUIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgLy8KKyAgICAvLyBJZiB0aGUgY2FsbCB0byBxdWV1ZUJ1ZmZlcigpIGlzIHN1Y2Nlc3NmdWwgYnV0IHRoZSBibG9jayBjYW5ub3QgYmUKKyAgICAvLyBhc3NvY2lhdGVkIHRvIHRoZSBvdXRwdXQgc3VyZmFjZSBmb3IgYXV0b21hdGljIGNhbmNlbGxhdGlvbiB1cG9uCisgICAgLy8gZGVzdHJ1Y3Rpb24sIFVOS05PV05fRVJST1Igd2lsbCBiZSByZXR1cm5lZC4KKyAgICAvLworICAgIC8vIE90aGVyd2lzZSwgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHF1ZXVlQnVmZmVyKCkgd2lsbCBiZSByZXR1cm5lZC4KKyAgICBzdGF0dXNfdCBxdWV1ZVRvT3V0cHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrLAorICAgICAgICAgICAgY29uc3QgUXVldWVCdWZmZXJJbnB1dCYgaW5wdXQsCisgICAgICAgICAgICBRdWV1ZUJ1ZmZlck91dHB1dCogb3V0cHV0KTsKKworICAgIGMyX3N0YXR1c190IGNvbm5lY3RUb09teElucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBwcm9kdWNlciwKKyAgICAgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlKTsKKworICAgIGMyX3N0YXR1c190IGRpc2Nvbm5lY3RGcm9tSW5wdXRTdXJmYWNlKCk7CisKKyAgICAvLyBiYXNlIGNhbm5vdCBiZSBudWxsLgorICAgIENvbXBvbmVudChjb25zdCBzcDxCYXNlPiYgYmFzZSk7CisKKyAgICB+Q29tcG9uZW50KCk7CisKK3Byb3RlY3RlZDoKKyAgICBCYXNlKiBiYXNlKCkgY29uc3Q7CisKKyAgICAvLyBNdXRleCBmb3IgbUlucHV0QnVmZmVycyBhbmQgbUlucHV0QnVmZmVyQ291bnQuCisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1JbnB1dEJ1ZmZlcnNNdXRleDsKKworICAgIC8vIE1hcDogZnJhbWVJbmRleCAtPiB2ZWN0b3Igb2YgYnVmZmVySW5kaWNlcworICAgIC8vCisgICAgLy8gbUlucHV0QnVmZmVyc1tmcmFtZUluZGV4XVtidWZmZXJJbmRleF0gbWF5IGJlIG51bGwgaWYgdGhlIGJ1ZmZlciBpbiB0aGF0CisgICAgLy8gc2xvdCBoYXMgYmVlbiBmcmVlZC4KKyAgICBtdXRhYmxlIHN0ZDo6bWFwPHVpbnQ2NF90LCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+Pj4KKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlcnM7CisKKyAgICAvLyBNYXA6IGZyYW1lSW5kZXggLT4gbnVtYmVyIG9mIGJ1ZmZlckluZGljZXMgdGhhdCBoYXZlIG5vdCBiZWVuIGZyZWVkCisgICAgLy8KKyAgICAvLyBtSW5wdXRCdWZmZXJDb3VudFtmcmFtZUluZGV4XSBrZWVwcyB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIG5vbi1udWxsCisgICAgLy8gZWxlbWVudHMgaW4gbUlucHV0QnVmZmVyc1tmcmFtZUluZGV4XS4gV2hlbiBtSW5wdXRCdWZmZXJDb3VudFtmcmFtZUluZGV4XQorICAgIC8vIGRlY3JlYXNlcyB0byAwLCBmcmFtZUluZGV4IGNhbiBiZSByZW1vdmVkIGZyb20gYm90aCBtSW5wdXRCdWZmZXJzIGFuZAorICAgIC8vIG1JbnB1dEJ1ZmZlckNvdW50LgorICAgIG11dGFibGUgc3RkOjptYXA8dWludDY0X3QsIHNpemVfdD4gbUlucHV0QnVmZmVyQ291bnQ7CisKKyAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OnV0aWxzOjpEZWZhdWx0QnVmZmVyUG9vbFNlbmRlcgorICAgICAgICAgICAgbUJ1ZmZlclBvb2xTZW5kZXI7CisKKyAgICBzdGQ6Om11dGV4IG1PdXRwdXRCdWZmZXJRdWV1ZU11dGV4OworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1PdXRwdXRJZ2JwOworICAgIHVpbnQ2NF90IG1PdXRwdXRCcUlkOworICAgIHVpbnQzMl90IG1PdXRwdXRHZW5lcmF0aW9uOworCisgICAgc3RhdGljIGMyX3N0YXR1c190IHNldERlYXRoTGlzdGVuZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiYgbGlzdGVuZXIpOworICAgIHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfZGVhdGhfcmVjaXBpZW50PiBtRGVhdGhSZWNpcGllbnQ7CisKKyAgICBmcmllbmQgc3RydWN0IENvZGVjMkNsaWVudDsKKworICAgIHN0cnVjdCBIaWRsTGlzdGVuZXI7CisgICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgaW5wdXQgYnVmZmVycyB0aGF0IHNob3VsZCBiZSBkaXNjYXJkZWQuCisgICAgc2l6ZV90IGhhbmRsZU9uV29ya0RvbmUoY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmd29ya0l0ZW1zKTsKKyAgICAvLyBSZW1vdmUgYW4gaW5wdXQgYnVmZmVyIGZyb20gbUlucHV0QnVmZmVycyBhbmQgcmV0dXJuIGl0LgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gZnJlZUlucHV0QnVmZmVyKHVpbnQ2NF90IGZyYW1lSW5kZXgsIHNpemVfdCBidWZmZXJJbmRleCk7CisKK307CisKK3N0cnVjdCBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZSB7CitwdWJsaWM6CisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklJbnB1dFN1cmZhY2UgQmFzZTsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJSW5wdXRTdXJmYWNlQ29ubmVjdGlvbgorICAgICAgICAgICAgQ29ubmVjdGlvbkJhc2U7CisKKyAgICB0eXBlZGVmIENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlQ29ubmVjdGlvbiBDb25uZWN0aW9uOworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXIgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKworICAgIGMyX3N0YXR1c190IGNvbm5lY3RUb0NvbXBvbmVudCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29ubmVjdGlvbj4qIGNvbm5lY3Rpb24pOworCisgICAgc3RkOjpzaGFyZWRfcHRyPENvbmZpZ3VyYWJsZT4gZ2V0Q29uZmlndXJhYmxlKCkgY29uc3Q7CisKKyAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgZ2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkgY29uc3Q7CisKKyAgICAvLyBSZXR1cm4gdGhlIHVuZGVybHlpbmcgSUlucHV0U3VyZmFjZS4KKyAgICBjb25zdCBzcDxCYXNlPiYgZ2V0SGFsSW50ZXJmYWNlKCkgY29uc3Q7CisKKyAgICAvLyBiYXNlIGNhbm5vdCBiZSBudWxsLgorICAgIElucHV0U3VyZmFjZShjb25zdCBzcDxCYXNlPiYgYmFzZSk7CisKK3Byb3RlY3RlZDoKKyAgICBCYXNlKiBiYXNlKCkgY29uc3Q7CisgICAgc3A8QmFzZT4gbUJhc2U7CisKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworCisgICAgZnJpZW5kIHN0cnVjdCBDb2RlYzJDbGllbnQ7CisgICAgZnJpZW5kIHN0cnVjdCBDb21wb25lbnQ7Cit9OworCitzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uIHsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJSW5wdXRTdXJmYWNlQ29ubmVjdGlvbiBCYXNlOworCisgICAgYzJfc3RhdHVzX3QgZGlzY29ubmVjdCgpOworCisgICAgLy8gYmFzZSBjYW5ub3QgYmUgbnVsbC4KKyAgICBJbnB1dFN1cmZhY2VDb25uZWN0aW9uKGNvbnN0IHNwPEJhc2U+JiBiYXNlKTsKKworcHJvdGVjdGVkOgorICAgIEJhc2UqIGJhc2UoKSBjb25zdDsKKyAgICBzcDxCYXNlPiBtQmFzZTsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPREVDMl9ISURMX0NMSUVOVF9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTY1MjVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5icApAQCAtMCwwICsxLDM5IEBACitjY19iaW5hcnkgeworICAgIG5hbWU6ICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMC1zZXJ2aWNlIiwKKyAgICBkZWZhdWx0czogWyJoaWRsX2RlZmF1bHRzIl0sCisgICAgc29jX3NwZWNpZmljOiB0cnVlLAorICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogImh3IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJ2ZW5kb3IuY3BwIiwKKyAgICBdLAorCisgICAgaW5pdF9yYzogWyJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMC1zZXJ2aWNlLnJjIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKKyAgICAgICAgImxpYmF2c2VydmljZXNfbWluaWphaWxfdmVuZG9yIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjb2RlYzJfaGlkbEAxLjAiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCisgICAgICAgICJsaWJod2JpbmRlciIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlciIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGFyY2g6IHsKKyAgICAgICAgYXJtOiB7CisgICAgICAgICAgICByZXF1aXJlZDogWyJjb2RlYzIudmVuZG9yLmJhc2UucG9saWN5Il0sCisgICAgICAgIH0sCisgICAgICAgIHg4NjogeworICAgICAgICAgICAgcmVxdWlyZWQ6IFsiY29kZWMyLnZlbmRvci5iYXNlLnBvbGljeSJdLAorICAgICAgICB9LAorICAgIH0sCisKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9BbmRyb2lkLm1rIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWIyOGU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDI0IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKKyMgdmVuZG9yIHNlcnZpY2Ugc2VjY29tcCBwb2xpY3kKK2lmZXEgKCQoVEFSR0VUX0FSQ0gpLCQoZmlsdGVyICQoVEFSR0VUX0FSQ0gpLCB4ODYgeDg2XzY0IGFybSBhcm02NCkpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBjb2RlYzIudmVuZG9yLmJhc2UucG9saWN5CitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9WRU5ET1IpL2V0Yy9zZWNjb21wX3BvbGljeQorTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBjcmFzaF9kdW1wLnBvbGljeQoraWZkZWYgVEFSR0VUXzJORF9BUkNICisgICAgaWZuZXEgKCQoVEFSR0VUX1RSQU5TTEFURV8yTkRfQVJDSCksdHJ1ZSkKKyAgICAgICAgTE9DQUxfU1JDX0ZJTEVTIDo9IHNlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS0kKFRBUkdFVF8yTkRfQVJDSCkucG9saWN5CisgICAgZWxzZQorICAgICAgICBMT0NBTF9TUkNfRklMRVMgOj0gc2VjY29tcF9wb2xpY3kvY29kZWMyLnZlbmRvci5iYXNlLSQoVEFSR0VUX0FSQ0gpLnBvbGljeQorICAgIGVuZGlmCitlbHNlCisgICAgTE9DQUxfU1JDX0ZJTEVTIDo9IHNlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS0kKFRBUkdFVF9BUkNIKS5wb2xpY3kKK2VuZGlmCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCitlbmRpZgorCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCAkKExPQ0FMX1BBVEgpKQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMC1zZXJ2aWNlLnJjIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAtc2VydmljZS5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODA2YmQxZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL2FuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wLXNlcnZpY2UucmMKQEAgLTAsMCArMSw3IEBACitzZXJ2aWNlIGFuZHJvaWQtaGFyZHdhcmUtbWVkaWEtYzItaGFsLTEtMCAvdmVuZG9yL2Jpbi9ody9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMC1zZXJ2aWNlCisgICAgY2xhc3MgaGFsCisgICAgdXNlciBtZWRpYWNvZGVjCisgICAgZ3JvdXAgY2FtZXJhIG1lZGlhZHJtIGRybXJwYworICAgIGlvcHJpbyBydCA0CisgICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIuc29mdHdhcmUuYmFzZS1hcm0ucG9saWN5IGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnNvZnR3YXJlLmJhc2UtYXJtLnBvbGljeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTg3MWQxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnNvZnR3YXJlLmJhc2UtYXJtLnBvbGljeQpAQCAtMCwwICsxLDczIEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIE9yZ2FuaXplZCBieSBmcmVxdWVuY3kgb2Ygc3lzdGVtY2FsbCAtIGluIGRlc2NlbmRpbmcgb3JkZXIgZm9yCisjIGJlc3QgcGVyZm9ybWFuY2UuCitmdXRleDogMQoraW9jdGw6IDEKK3dyaXRlOiAxCitwcmN0bDogMQorY2xvY2tfZ2V0dGltZTogMQorZ2V0cHJpb3JpdHk6IDEKK3JlYWQ6IDEKK2Nsb3NlOiAxCit3cml0ZXY6IDEKK2R1cDogMQorcHBvbGw6IDEKK21tYXAyOiAxCitnZXRyYW5kb206IDEKKworIyBtcmVtYXA6IEVuc3VyZSB8ZmxhZ3N8IGFyZSAoTVJFTUFQX01BWU1PVkUgfCBNUkVNQVBfRklYRUQpIFRPRE86IE9uY2UgbWluaWphaWwKKyMgcGFyc2VyIHN1cHBvcnQgZm9yICc8JyBpcyBpbiB0aGlzIG5lZWRzIHRvIGJlIG1vZGlmaWVkIHRvIGFsc28gcHJldmVudAorIyB8b2xkX2FkZHJlc3N8IGFuZCB8bmV3X2FkZHJlc3N8IGZyb20gdG91Y2hpbmcgdGhlIGV4Y2VwdGlvbiB2ZWN0b3IgcGFnZSwgd2hpY2gKKyMgb24gQVJNIGlzIHN0YXRpY2FsbHkgbG9hZGVkIGF0IDB4ZmZmZiAwMDAwLiBTZWUKKyMgaHR0cDovL2luZm9jZW50ZXIuYXJtLmNvbS9oZWxwL2luZGV4LmpzcD90b3BpYz0vY29tLmFybS5kb2MuZGRpMDIxMWgvQmFiZmVlZ2EuaHRtbAorIyBmb3IgbW9yZSBkZXRhaWxzLgorbXJlbWFwOiBhcmczID09IDMKK211bm1hcDogMQorbXByb3RlY3Q6IDEKK21hZHZpc2U6IDEKK29wZW5hdDogMQorc2lnYWx0c3RhY2s6IDEKK2Nsb25lOiAxCitzZXRwcmlvcml0eTogMQorZ2V0dWlkMzI6IDEKK2ZzdGF0NjQ6IDEKK2ZzdGF0ZnM2NDogMQorcHJlYWQ2NDogMQorZmFjY2Vzc2F0OiAxCityZWFkbGlua2F0OiAxCitleGl0OiAxCitydF9zaWdwcm9jbWFzazogMQorc2V0X3RpZF9hZGRyZXNzOiAxCityZXN0YXJ0X3N5c2NhbGw6IDEKK2V4aXRfZ3JvdXA6IDEKK3J0X3NpZ3JldHVybjogMQorcGlwZTI6IDEKK2dldHRpbWVvZmRheTogMQorc2NoZWRfeWllbGQ6IDEKK25hbm9zbGVlcDogMQorbHNlZWs6IDEKK19sbHNlZWs6IDEKK3NjaGVkX2dldF9wcmlvcml0eV9tYXg6IDEKK3NjaGVkX2dldF9wcmlvcml0eV9taW46IDEKK3N0YXRmczY0OiAxCitzY2hlZF9zZXRzY2hlZHVsZXI6IDEKK2ZzdGF0YXQ2NDogMQordWdldHJsaW1pdDogMQorZ2V0ZGVudHM2NDogMQorZ2V0cmFuZG9tOiAxCisKK0BpbmNsdWRlIC9zeXN0ZW0vZXRjL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAuYXJtLnBvbGljeQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIuc29mdHdhcmUuYmFzZS14ODYucG9saWN5IGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnNvZnR3YXJlLmJhc2UteDg2LnBvbGljeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGM3NjI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnNvZnR3YXJlLmJhc2UteDg2LnBvbGljeQpAQCAtMCwwICsxLDU3IEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCityZWFkOiAxCittcHJvdGVjdDogMQorcHJjdGw6IDEKK29wZW5hdDogMQorZ2V0dWlkMzI6IDEKK3dyaXRldjogMQoraW9jdGw6IDEKK2Nsb3NlOiAxCittbWFwMjogMQorZnN0YXQ2NDogMQorbWFkdmlzZTogMQorZnN0YXRhdDY0OiAxCitmdXRleDogMQorbXVubWFwOiAxCitmYWNjZXNzYXQ6IDEKK19sbHNlZWs6IDEKK2xzZWVrOiAxCitjbG9uZTogMQorc2lnYWx0c3RhY2s6IDEKK3NldHByaW9yaXR5OiAxCityZXN0YXJ0X3N5c2NhbGw6IDEKK2V4aXQ6IDEKK2V4aXRfZ3JvdXA6IDEKK3J0X3NpZ3JldHVybjogMQordWdldHJsaW1pdDogMQorcmVhZGxpbmthdDogMQorX2xsc2VlazogMQorZnN0YXRmczY0OiAxCitwcmVhZDY0OiAxCittcmVtYXA6IDEKK2R1cDogMQorc2V0X3RpZF9hZGRyZXNzOiAxCit3cml0ZTogMQorbmFub3NsZWVwOiAxCisKKyMgUmVxdWlyZWQgYnkgQWRkcmVzc1Nhbml0aXplcgorZ2V0dGlkOiAxCitzY2hlZF95aWVsZDogMQorZ2V0cGlkOiAxCitnZXR0aWQ6IDEKKworQGluY2x1ZGUgL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC54ODYucG9saWN5CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS1hcm0ucG9saWN5IGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnZlbmRvci5iYXNlLWFybS5wb2xpY3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU4NzFkMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS1hcm0ucG9saWN5CkBAIC0wLDAgKzEsNzMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgT3JnYW5pemVkIGJ5IGZyZXF1ZW5jeSBvZiBzeXN0ZW1jYWxsIC0gaW4gZGVzY2VuZGluZyBvcmRlciBmb3IKKyMgYmVzdCBwZXJmb3JtYW5jZS4KK2Z1dGV4OiAxCitpb2N0bDogMQord3JpdGU6IDEKK3ByY3RsOiAxCitjbG9ja19nZXR0aW1lOiAxCitnZXRwcmlvcml0eTogMQorcmVhZDogMQorY2xvc2U6IDEKK3dyaXRldjogMQorZHVwOiAxCitwcG9sbDogMQorbW1hcDI6IDEKK2dldHJhbmRvbTogMQorCisjIG1yZW1hcDogRW5zdXJlIHxmbGFnc3wgYXJlIChNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCkgVE9ETzogT25jZSBtaW5pamFpbAorIyBwYXJzZXIgc3VwcG9ydCBmb3IgJzwnIGlzIGluIHRoaXMgbmVlZHMgdG8gYmUgbW9kaWZpZWQgdG8gYWxzbyBwcmV2ZW50CisjIHxvbGRfYWRkcmVzc3wgYW5kIHxuZXdfYWRkcmVzc3wgZnJvbSB0b3VjaGluZyB0aGUgZXhjZXB0aW9uIHZlY3RvciBwYWdlLCB3aGljaAorIyBvbiBBUk0gaXMgc3RhdGljYWxseSBsb2FkZWQgYXQgMHhmZmZmIDAwMDAuIFNlZQorIyBodHRwOi8vaW5mb2NlbnRlci5hcm0uY29tL2hlbHAvaW5kZXguanNwP3RvcGljPS9jb20uYXJtLmRvYy5kZGkwMjExaC9CYWJmZWVnYS5odG1sCisjIGZvciBtb3JlIGRldGFpbHMuCittcmVtYXA6IGFyZzMgPT0gMworbXVubWFwOiAxCittcHJvdGVjdDogMQorbWFkdmlzZTogMQorb3BlbmF0OiAxCitzaWdhbHRzdGFjazogMQorY2xvbmU6IDEKK3NldHByaW9yaXR5OiAxCitnZXR1aWQzMjogMQorZnN0YXQ2NDogMQorZnN0YXRmczY0OiAxCitwcmVhZDY0OiAxCitmYWNjZXNzYXQ6IDEKK3JlYWRsaW5rYXQ6IDEKK2V4aXQ6IDEKK3J0X3NpZ3Byb2NtYXNrOiAxCitzZXRfdGlkX2FkZHJlc3M6IDEKK3Jlc3RhcnRfc3lzY2FsbDogMQorZXhpdF9ncm91cDogMQorcnRfc2lncmV0dXJuOiAxCitwaXBlMjogMQorZ2V0dGltZW9mZGF5OiAxCitzY2hlZF95aWVsZDogMQorbmFub3NsZWVwOiAxCitsc2VlazogMQorX2xsc2VlazogMQorc2NoZWRfZ2V0X3ByaW9yaXR5X21heDogMQorc2NoZWRfZ2V0X3ByaW9yaXR5X21pbjogMQorc3RhdGZzNjQ6IDEKK3NjaGVkX3NldHNjaGVkdWxlcjogMQorZnN0YXRhdDY0OiAxCit1Z2V0cmxpbWl0OiAxCitnZXRkZW50czY0OiAxCitnZXRyYW5kb206IDEKKworQGluY2x1ZGUgL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC5hcm0ucG9saWN5CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS14ODYucG9saWN5IGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnZlbmRvci5iYXNlLXg4Ni5wb2xpY3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBjNzYyNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS14ODYucG9saWN5CkBAIC0wLDAgKzEsNTcgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3JlYWQ6IDEKK21wcm90ZWN0OiAxCitwcmN0bDogMQorb3BlbmF0OiAxCitnZXR1aWQzMjogMQord3JpdGV2OiAxCitpb2N0bDogMQorY2xvc2U6IDEKK21tYXAyOiAxCitmc3RhdDY0OiAxCittYWR2aXNlOiAxCitmc3RhdGF0NjQ6IDEKK2Z1dGV4OiAxCittdW5tYXA6IDEKK2ZhY2Nlc3NhdDogMQorX2xsc2VlazogMQorbHNlZWs6IDEKK2Nsb25lOiAxCitzaWdhbHRzdGFjazogMQorc2V0cHJpb3JpdHk6IDEKK3Jlc3RhcnRfc3lzY2FsbDogMQorZXhpdDogMQorZXhpdF9ncm91cDogMQorcnRfc2lncmV0dXJuOiAxCit1Z2V0cmxpbWl0OiAxCityZWFkbGlua2F0OiAxCitfbGxzZWVrOiAxCitmc3RhdGZzNjQ6IDEKK3ByZWFkNjQ6IDEKK21yZW1hcDogMQorZHVwOiAxCitzZXRfdGlkX2FkZHJlc3M6IDEKK3dyaXRlOiAxCituYW5vc2xlZXA6IDEKKworIyBSZXF1aXJlZCBieSBBZGRyZXNzU2FuaXRpemVyCitnZXR0aWQ6IDEKK3NjaGVkX3lpZWxkOiAxCitnZXRwaWQ6IDEKK2dldHRpZDogMQorCitAaW5jbHVkZSAvc3lzdGVtL2V0Yy9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLng4Ni5wb2xpY3kKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvdmVuZG9yLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3ZlbmRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYyZjk4ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3ZlbmRvci5jcHAKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAtc2VydmljZSIKKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8bWluaWphaWwuaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisKKy8vIE9teFN0b3JlIGlzIGFkZGVkIGZvciB2aXNpYmlsaXR5IGJ5IGR1bXBzdGF0ZS4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmg+CisKKy8vIFRoaXMgaXMgY3JlYXRlZCBieSBtb2R1bGUgImNvZGVjMi52ZW5kb3IuYmFzZS5wb2xpY3kiLiBUaGlzIGNhbiBiZSBtb2RpZmllZC4KK3N0YXRpYyBjb25zdGV4cHIgY2hhciBrQmFzZVNlY2NvbXBQb2xpY3lQYXRoW10gPQorICAgICAgICAiL3ZlbmRvci9ldGMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnZlbmRvci5iYXNlLnBvbGljeSI7CisKKy8vIEFkZGl0aW9uYWwgZGV2aWNlLXNwZWNpZmljIHNlY2NvbXAgcGVybWlzc2lvbnMgY2FuIGJlIGFkZGVkIGluIHRoaXMgZmlsZS4KK3N0YXRpYyBjb25zdGV4cHIgY2hhciBrRXh0U2VjY29tcFBvbGljeVBhdGhbXSA9CisgICAgICAgICIvdmVuZG9yL2V0Yy9zZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmV4dC5wb2xpY3kiOworCitjbGFzcyBEdW1teUMyU3RvcmUgOiBwdWJsaWMgQzJDb21wb25lbnRTdG9yZSB7CitwdWJsaWM6CisgICAgRHVtbXlDMlN0b3JlKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCB+RHVtbXlDMlN0b3JlKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gImRlZmF1bHQiOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgQzJTdHJpbmcgLypuYW1lKi8sCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCAvKmNvbXBvbmVudCovKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBDMl9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBDMlN0cmluZyAvKiBuYW1lICovLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgLyogaW50ZXJmYWNlICovKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBDMl9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4+CisgICAgICAgICAgICBsaXN0Q29tcG9uZW50cygpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIHt9OworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29weUJ1ZmZlcigKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+IC8qIHNyYyAqLywKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+IC8qIGRzdCAqLykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5X3NtKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4mIC8qIHN0YWNrUGFyYW1zICovLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4mIC8qIGhlYXBQYXJhbUluZGljZXMgKi8sCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IC8qIGhlYXBQYXJhbXMgKi8pIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWdfc20oCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4mIC8qIHBhcmFtcyAqLywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgLyogZmFpbHVyZXMgKi8pIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gZ2V0UGFyYW1SZWZsZWN0b3IoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiogY29uc3QgLyogcGFyYW1zICovKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXNfc20oCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+JiAvKiBmaWVsZHMgKi8pIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorfTsKKworaW50IG1haW4oaW50IC8qIGFyZ2MgKi8sIGNoYXIqKiAvKiBhcmd2ICovKSB7CisgICAgQUxPR0QoImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wLXNlcnZpY2Ugc3RhcnRpbmcuLi4iKTsKKworICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKKyAgICBhbmRyb2lkOjpTZXRVcE1pbmlqYWlsKGtCYXNlU2VjY29tcFBvbGljeVBhdGgsIGtFeHRTZWNjb21wUG9saWN5UGF0aCk7CisKKyAgICAvLyB2bmRiaW5kZXIgaXMgbmVlZGVkIGJ5IEJ1ZmZlclF1ZXVlLgorICAgIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTo6aW5pdFdpdGhEcml2ZXIoIi9kZXYvdm5kYmluZGVyIik7CisgICAgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOworCisgICAgLy8gRXh0cmEgdGhyZWFkcyBtYXkgYmUgbmVlZGVkIHRvIGhhbmRsZSBhIHN0YWNrZWQgSVBDIHNlcXVlbmNlIHRoYXQKKyAgICAvLyBjb250YWlucyBhbHRlcm5hdGluZyBiaW5kZXIgYW5kIGh3YmluZGVyIGNhbGxzLiAoU2VlIGIvMzUyODM0ODAuKQorICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpjb25maWd1cmVScGNUaHJlYWRwb29sKDgsIHRydWUgLyogY2FsbGVyV2lsbEpvaW4gKi8pOworCisgICAgLy8gQ3JlYXRlIElDb21wb25lbnRTdG9yZSBzZXJ2aWNlLgorICAgIHsKKyAgICAgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDsKKyAgICAgICAgYW5kcm9pZDo6c3A8SUNvbXBvbmVudFN0b3JlPiBzdG9yZTsKKworICAgICAgICAvLyBWZW5kb3IncyBUT0RPOiBSZXBsYWNlIHRoaXMgd2l0aAorICAgICAgICAvLyBzdG9yZSA9IG5ldyB1dGlsczo6Q29tcG9uZW50U3RvcmUoCisgICAgICAgIC8vICAgICAgICAgLyogaW1wbGVtZW50YXRpb24gb2YgQzJDb21wb25lbnRTdG9yZSAqLyk7CisgICAgICAgIEFMT0dEKCJJbnN0YW50aWF0aW5nIENvZGVjMidzIGR1bW15IElDb21wb25lbnRTdG9yZSBzZXJ2aWNlLi4uIik7CisgICAgICAgIHN0b3JlID0gbmV3IHV0aWxzOjpDb21wb25lbnRTdG9yZSgKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPER1bW15QzJTdG9yZT4oKSk7CisKKyAgICAgICAgaWYgKHN0b3JlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgY3JlYXRlIENvZGVjMidzIElDb21wb25lbnRTdG9yZSBzZXJ2aWNlLiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHN0b3JlLT5yZWdpc3RlckFzU2VydmljZSgiZGVmYXVsdCIpICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCByZWdpc3RlciBDb2RlYzIncyAiCisgICAgICAgICAgICAgICAgICAgICAgICAiSUNvbXBvbmVudFN0b3JlIHNlcnZpY2UuIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dJKCJDb2RlYzIncyBJQ29tcG9uZW50U3RvcmUgc2VydmljZSBjcmVhdGVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gUmVnaXN0ZXIgSU9teFN0b3JlIHNlcnZpY2UuCisgICAgeworICAgICAgICB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDsKKyAgICAgICAgYW5kcm9pZDo6c3A8SU9teFN0b3JlPiBvbXhTdG9yZSA9IG5ldyBpbXBsZW1lbnRhdGlvbjo6T214U3RvcmUoKTsKKyAgICAgICAgaWYgKG9teFN0b3JlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgY3JlYXRlIElPbXhTdG9yZSBIQUwgc2VydmljZS4iKTsKKyAgICAgICAgfSBlbHNlIGlmIChvbXhTdG9yZS0+cmVnaXN0ZXJBc1NlcnZpY2UoKSAhPSBhbmRyb2lkOjpPSykgeworICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCByZWdpc3RlciBJT214U3RvcmUgSEFMIHNlcnZpY2UuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhbmRyb2lkOjpoYXJkd2FyZTo6am9pblJwY1RocmVhZHBvb2woKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg3MGQzOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTggQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGlic2ZwbHVnaW5fY2NvZGVjIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkMyT01YTm9kZS5jcHAiLAorICAgICAgICAiQ0NvZGVjLmNwcCIsCisgICAgICAgICJDQ29kZWNCdWZmZXJDaGFubmVsLmNwcCIsCisgICAgICAgICJDQ29kZWNDb25maWcuY3BwIiwKKyAgICAgICAgIkNvZGVjMkJ1ZmZlci5jcHAiLAorICAgICAgICAiQ29kZWMySW5mb0J1aWxkZXIuY3BwIiwKKyAgICAgICAgIlJlZmxlY3RlZFBhcmFtVXBkYXRlci5jcHAiLAorICAgICAgICAiU2tpcEN1dEJ1ZmZlci5jcHAiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliY29kZWMyX2ludGVybmFsIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzLm5hdGl2ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJjb2RlYzJfY2xpZW50IiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGliaGlkbGFsbG9jYXRvcnV0aWxzIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAorICAgICAgICAibGlic2ZwbHVnaW5fY2NvZGVjX3V0aWxzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnF1ZXVlX2hlbHBlciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9jb2RlY2Jhc2UiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXhfdXRpbHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0MyT01YTm9kZS5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDlmZDdhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0MyT01YTm9kZS5jcHAKQEAgLTAsMCArMSwzMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZkZWYgX19MUDY0X18KKyNkZWZpbmUgT01YX0FORFJPSURfQ09NUElMRV9BU18zMkJJVF9PTl82NEJJVF9QTEFURk9STVMKKyNlbmRpZgorCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyT01YTm9kZSIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisKKyNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8T01YX0luZGV4Lmg+CisjaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHVpL0ZlbmNlLmg+CisjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgorCisjaW5jbHVkZSAiQzJPTVhOb2RlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgQnVmZmVyMkQgOiBwdWJsaWMgQzJCdWZmZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEJ1ZmZlcjJEKEMyQ29uc3RHcmFwaGljQmxvY2sgYmxvY2spIDogQzJCdWZmZXIoeyBibG9jayB9KSB7fQorfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK0MyT01YTm9kZTo6QzJPTVhOb2RlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXApCisgICAgOiBtQ29tcChjb21wKSwgbUZyYW1lSW5kZXgoMCksIG1XaWR0aCgwKSwgbUhlaWdodCgwKSwKKyAgICAgIG1BZGp1c3RUaW1lc3RhbXBHYXBVcygwKSwgbUZpcnN0SW5wdXRGcmFtZSh0cnVlKSB7CisgICAgLy8gVE9ETzogcmVhZCBmcm9tIGludGYoKQorICAgIGlmICghc3RybmNtcChjb21wLT5nZXROYW1lKCkuY19zdHIoKSwgImMyLmFuZHJvaWQuIiwgMTEpKSB7CisgICAgICAgIG1Vc2FnZSA9IEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTjsKKyAgICB9IGVsc2UgeworICAgICAgICBtVXNhZ2UgPSBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVI7CisgICAgfQorfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmZyZWVOb2RlKCkgeworICAgIG1Db21wLnJlc2V0KCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnNlbmRDb21tYW5kKE9NWF9DT01NQU5EVFlQRSBjbWQsIE9NWF9TMzIgcGFyYW0pIHsKKyAgICBpZiAoY21kID09IE9NWF9Db21tYW5kU3RhdGVTZXQgJiYgcGFyYW0gPT0gT01YX1N0YXRlTG9hZGVkKSB7CisgICAgICAgIC8vIFJlc2V0IGZpcnN0IGlucHV0IGZyYW1lIHNvIGlmIEMyT01YTm9kZSBpcyByZWN5Y2xlZCwgdGhlIHRpbWVzdGFtcCBkb2VzIG5vdCBiZWNvbWUKKyAgICAgICAgLy8gbmVnYXRpdmUuIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBIVyBjb2RlY3MgdGhhdCBkbyBub3QgaGFuZGxlIHRpbWVzdGFtcCByb2xsb3Zlci4KKyAgICAgICAgbUZpcnN0SW5wdXRGcmFtZSA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpnZXRQYXJhbWV0ZXIoT01YX0lOREVYVFlQRSBpbmRleCwgdm9pZCAqcGFyYW1zLCBzaXplX3Qgc2l6ZSkgeworICAgIHN0YXR1c190IGVyciA9IEVSUk9SX1VOU1VQUE9SVEVEOworICAgIHN3aXRjaCAoKHVpbnQzMl90KWluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1Db25zdW1lclVzYWdlQml0czogeworICAgICAgICAgICAgT01YX1UzMiAqdXNhZ2UgPSAoT01YX1UzMiAqKXBhcmFtczsKKyAgICAgICAgICAgICp1c2FnZSA9IG1Vc2FnZTsKKyAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uOiB7CisgICAgICAgICAgICBpZiAoc2l6ZSA8IHNpemVvZihPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpwRGVmID0gKE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKilwYXJhbXM7CisgICAgICAgICAgICAvLyBUT0RPOiByZWFkIHRoZXNlIGZyb20gaW50ZigpCisgICAgICAgICAgICBwRGVmLT5uQnVmZmVyQ291bnRBY3R1YWwgPSAxNjsKKyAgICAgICAgICAgIHBEZWYtPmVEb21haW4gPSBPTVhfUG9ydERvbWFpblZpZGVvOworICAgICAgICAgICAgcERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOworICAgICAgICAgICAgcERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1IZWlnaHQ7CisgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpzZXRQYXJhbWV0ZXIoT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3Qgdm9pZCAqcGFyYW1zLCBzaXplX3Qgc2l6ZSkgeworICAgIC8vIGhhbmRsZSBtYXgvZml4ZWQgZnJhbWUgZHVyYXRpb24gY29udHJvbAorICAgIGlmIChpbmRleCA9PSAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbU1heEZyYW1lRHVyYXRpb25Gb3JCaXRyYXRlQ29udHJvbAorICAgICAgICAgICAgJiYgcGFyYW1zICE9IE5VTEwKKyAgICAgICAgICAgICYmIHNpemUgPT0gc2l6ZW9mKE9NWF9QQVJBTV9VMzJUWVBFKSkgeworICAgICAgICAvLyBUaGUgaW5jb21pbmcgbnVtYmVyIGlzIGFuIGludDMyX3QgY29udGFpbmVkIGluIE9NWF9VMzIuCisgICAgICAgIG1BZGp1c3RUaW1lc3RhbXBHYXBVcyA9IChpbnQzMl90KSgoT01YX1BBUkFNX1UzMlRZUEUqKXBhcmFtcyktPm5VMzI7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmdldENvbmZpZyhPTVhfSU5ERVhUWVBFIGluZGV4LCB2b2lkICpjb25maWcsIHNpemVfdCBzaXplKSB7CisgICAgKHZvaWQpaW5kZXg7CisgICAgKHZvaWQpY29uZmlnOworICAgICh2b2lkKXNpemU7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnNldENvbmZpZyhPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCB2b2lkICpjb25maWcsIHNpemVfdCBzaXplKSB7CisgICAgKHZvaWQpaW5kZXg7CisgICAgKHZvaWQpY29uZmlnOworICAgICh2b2lkKXNpemU7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnNldFBvcnRNb2RlKE9NWF9VMzIgcG9ydEluZGV4LCBJT01YOjpQb3J0TW9kZSBtb2RlKSB7CisgICAgKHZvaWQpcG9ydEluZGV4OworICAgICh2b2lkKW1vZGU7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrKAorICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLAorICAgICAgICBPTVhfVTMyIG1heEZyYW1lV2lkdGgsIE9NWF9VMzIgbWF4RnJhbWVIZWlnaHQpIHsKKyAgICAodm9pZClwb3J0SW5kZXg7CisgICAgKHZvaWQpZW5hYmxlOworICAgICh2b2lkKW1heEZyYW1lV2lkdGg7CisgICAgKHZvaWQpbWF4RnJhbWVIZWlnaHQ7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSgKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIHR1bm5lbGVkLAorICAgICAgICBPTVhfVTMyIGF1ZGlvSHdTeW5jLCBuYXRpdmVfaGFuZGxlX3QgKipzaWRlYmFuZEhhbmRsZSkgeworICAgICh2b2lkKXBvcnRJbmRleDsKKyAgICAodm9pZCl0dW5uZWxlZDsKKyAgICAodm9pZClhdWRpb0h3U3luYzsKKyAgICAqc2lkZWJhbmRIYW5kbGUgPSBudWxscHRyOworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpnZXRHcmFwaGljQnVmZmVyVXNhZ2UoT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9VMzIqIHVzYWdlKSB7CisgICAgKHZvaWQpcG9ydEluZGV4OworICAgICp1c2FnZSA9IDA7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnNldElucHV0U3VyZmFjZShjb25zdCBzcDxJT01YQnVmZmVyU291cmNlPiAmYnVmZmVyU291cmNlKSB7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gR2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpLT5mZXRjaEFsbG9jYXRvcigKKyAgICAgICAgICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6R1JBTExPQywKKyAgICAgICAgICAgICZtQWxsb2NhdG9yKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtQnVmZmVyU291cmNlID0gYnVmZmVyU291cmNlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjphbGxvY2F0ZVNlY3VyZUJ1ZmZlcigKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIHNpemVfdCBzaXplLCBidWZmZXJfaWQgKmJ1ZmZlciwKKyAgICAgICAgdm9pZCAqKmJ1ZmZlckRhdGEsIHNwPE5hdGl2ZUhhbmRsZT4gKm5hdGl2ZUhhbmRsZSkgeworICAgICh2b2lkKXBvcnRJbmRleDsKKyAgICAodm9pZClzaXplOworICAgICh2b2lkKW5hdGl2ZUhhbmRsZTsKKyAgICAqYnVmZmVyID0gMDsKKyAgICAqYnVmZmVyRGF0YSA9IG51bGxwdHI7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnVzZUJ1ZmZlcigKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIGNvbnN0IE9NWEJ1ZmZlciAmb214QnVmLCBidWZmZXJfaWQgKmJ1ZmZlcikgeworICAgICh2b2lkKXBvcnRJbmRleDsKKyAgICAodm9pZClvbXhCdWY7CisgICAgKmJ1ZmZlciA9IDA7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmZyZWVCdWZmZXIoT01YX1UzMiBwb3J0SW5kZXgsIGJ1ZmZlcl9pZCBidWZmZXIpIHsKKyAgICAodm9pZClwb3J0SW5kZXg7CisgICAgKHZvaWQpYnVmZmVyOworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpmaWxsQnVmZmVyKAorICAgICAgICBidWZmZXJfaWQgYnVmZmVyLCBjb25zdCBPTVhCdWZmZXIgJm9teEJ1ZiwgaW50IGZlbmNlRmQpIHsKKyAgICAodm9pZClidWZmZXI7CisgICAgKHZvaWQpb214QnVmOworICAgICh2b2lkKWZlbmNlRmQ7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmVtcHR5QnVmZmVyKAorICAgICAgICBidWZmZXJfaWQgYnVmZmVyLCBjb25zdCBPTVhCdWZmZXIgJm9teEJ1ZiwKKyAgICAgICAgT01YX1UzMiBmbGFncywgT01YX1RJQ0tTIHRpbWVzdGFtcCwgaW50IGZlbmNlRmQpIHsKKyAgICAvLyBUT0RPOiBiZXR0ZXIgZmVuY2UgaGFuZGxpbmcKKyAgICBpZiAoZmVuY2VGZCA+PSAwKSB7CisgICAgICAgIHNwPEZlbmNlPiBmZW5jZSA9IG5ldyBGZW5jZShmZW5jZUZkKTsKKyAgICAgICAgZmVuY2UtPndhaXRGb3JldmVyKExPR19UQUcpOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXAgPSBtQ29tcC5sb2NrKCk7CisgICAgaWYgKCFjb21wKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHVpbnQzMl90IGMyRmxhZ3MgPSAoZmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpCisgICAgICAgICAgICA/IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0gOiAwOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2s7CisKKyAgICBDMkhhbmRsZSAqaGFuZGxlID0gbnVsbHB0cjsKKyAgICBpZiAob214QnVmLm1CdWZmZXJUeXBlID09IE9NWEJ1ZmZlcjo6a0J1ZmZlclR5cGVBTldCdWZmZXIKKyAgICAgICAgICAgICYmIG9teEJ1Zi5tR3JhcGhpY0J1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgaGFuZGxlID0gV3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoCisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9uZShvbXhCdWYubUdyYXBoaWNCdWZmZXItPmhhbmRsZSksCisgICAgICAgICAgICAgICAgb214QnVmLm1HcmFwaGljQnVmZmVyLT53aWR0aCwKKyAgICAgICAgICAgICAgICBvbXhCdWYubUdyYXBoaWNCdWZmZXItPmhlaWdodCwKKyAgICAgICAgICAgICAgICBvbXhCdWYubUdyYXBoaWNCdWZmZXItPmZvcm1hdCwKKyAgICAgICAgICAgICAgICBvbXhCdWYubUdyYXBoaWNCdWZmZXItPnVzYWdlLAorICAgICAgICAgICAgICAgIG9teEJ1Zi5tR3JhcGhpY0J1ZmZlci0+c3RyaWRlKTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUFsbG9jYXRvci0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihoYW5kbGUsICZhbGxvYyk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soYWxsb2MpOworICAgIH0gZWxzZSBpZiAoIShmbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrKG5ldyBDMldvcmspOworICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWMyRmxhZ3M7CisgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisKKyAgICAvLyBXT1JLQVJPVU5EOiBhZGp1c3QgdGltZXN0YW1wIGJhc2VkIG9uIGdhcFVzCisgICAgeworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWwgPSB0aW1lc3RhbXA7IC8vIHNhdmUgaW5wdXQgdGltZXN0YW1wCisgICAgICAgIGlmIChtRmlyc3RJbnB1dEZyYW1lKSB7CisgICAgICAgICAgICAvLyBncmFiIHRpbWVzdGFtcHMgb24gZmlyc3QgZnJhbWUKKyAgICAgICAgICAgIG1QcmV2SW5wdXRUaW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgICAgICBtUHJldkNvZGVjVGltZXN0YW1wID0gdGltZXN0YW1wOworICAgICAgICAgICAgbUZpcnN0SW5wdXRGcmFtZSA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKG1BZGp1c3RUaW1lc3RhbXBHYXBVcyA+IDApIHsKKyAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0KKyAgICAgICAgICAgICAgICBtUHJldkNvZGVjVGltZXN0YW1wCisgICAgICAgICAgICAgICAgICAgICAgICArIGMyX21pbigodGltZXN0YW1wIC0gbVByZXZJbnB1dFRpbWVzdGFtcCkucGVlaygpLCBtQWRqdXN0VGltZXN0YW1wR2FwVXMpOworICAgICAgICB9IGVsc2UgaWYgKG1BZGp1c3RUaW1lc3RhbXBHYXBVcyA8IDApIHsKKyAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gbVByZXZDb2RlY1RpbWVzdGFtcCAtIG1BZGp1c3RUaW1lc3RhbXBHYXBVczsKKyAgICAgICAgfQorICAgICAgICBtUHJldklucHV0VGltZXN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC5jdXN0b21PcmRpbmFsOworICAgICAgICBtUHJldkNvZGVjVGltZXN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXA7CisgICAgICAgIEFMT0dWKCJhZGp1c3RpbmcgJWxsZCB0byAlbGxkIChnYXA9JWxsZCkiLAorICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWwucGVla2xsKCksCisgICAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWtsbCgpLAorICAgICAgICAgICAgICAobG9uZyBsb25nKW1BZGp1c3RUaW1lc3RhbXBHYXBVcyk7CisgICAgfQorCisgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gbUZyYW1lSW5kZXgrKzsKKyAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgaWYgKGJsb2NrKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYzJCdWZmZXIoCisgICAgICAgICAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgICAgICAgICBuZXcgQnVmZmVyMkQoYmxvY2stPnNoYXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJSZWN0KGJsb2NrLT53aWR0aCgpLCBibG9jay0+aGVpZ2h0KCkpLCA6OkMyRmVuY2UoKSkpLAorICAgICAgICAgICAgICAgIFtidWZmZXIsIHNvdXJjZSA9IGdldFNvdXJjZSgpXShDMkJ1ZmZlciAqcHRyKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwdHI7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgICAgICh2b2lkKXNvdXJjZS0+b25JbnB1dEJ1ZmZlckVtcHRpZWQoYnVmZmVyLCAtMSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGMyQnVmZmVyKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKworICAgIGMyX3N0YXR1c190IGVyciA9IGNvbXAtPnF1ZXVlKCZpdGVtcyk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6Z2V0RXh0ZW5zaW9uSW5kZXgoCisgICAgICAgIGNvbnN0IGNoYXIgKnBhcmFtZXRlck5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KSB7CisgICAgKHZvaWQpcGFyYW1ldGVyTmFtZTsKKyAgICAqaW5kZXggPSBPTVhfSW5kZXhNYXg7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmRpc3BhdGNoTWVzc2FnZShjb25zdCBvbXhfbWVzc2FnZSYgbXNnKSB7CisgICAgaWYgKG1zZy50eXBlICE9IG9teF9tZXNzYWdlOjpFVkVOVCkgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorICAgIGlmIChtc2cudS5ldmVudF9kYXRhLmV2ZW50ICE9IE9NWF9FdmVudERhdGFTcGFjZUNoYW5nZWQpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKyAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UgPSAoYW5kcm9pZF9kYXRhc3BhY2UpbXNnLnUuZXZlbnRfZGF0YS5kYXRhMTsKKyAgICB1aW50MzJfdCBwaXhlbEZvcm1hdCA9IG1zZy51LmV2ZW50X2RhdGEuZGF0YTM7CisKKyAgICAvLyBUT0RPOiBzZXQgZGF0YXNwYWNlIG9uIGNvbXBvbmVudCB0byBzZWUgaWYgaXQgaW1wYWN0cyBjb2xvciBhc3BlY3RzCisgICAgQUxPR0QoImRhdGFzcGFjZSBjaGFuZ2VkIHRvICUjeCBwaXhlbCBmb3JtYXQ6ICUjeCIsIGRhdGFTcGFjZSwgcGl4ZWxGb3JtYXQpOworICAgIHJldHVybiBPSzsKK30KKworc3A8SU9NWEJ1ZmZlclNvdXJjZT4gQzJPTVhOb2RlOjpnZXRTb3VyY2UoKSB7CisgICAgcmV0dXJuIG1CdWZmZXJTb3VyY2U7Cit9CisKK3ZvaWQgQzJPTVhOb2RlOjpzZXRGcmFtZVNpemUodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgeworICAgIG1XaWR0aCA9IHdpZHRoOworICAgIG1IZWlnaHQgPSBoZWlnaHQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhODE1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DMk9NWE5vZGUuaApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJfT01YX05PREVfSF8KKyNkZWZpbmUgQzJfT01YX05PREVfSF8KKworI2luY2x1ZGUgPGF0b21pYz4KKworI2luY2x1ZGUgPGFuZHJvaWQvSU9NWEJ1ZmZlclNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KKyNpbmNsdWRlIDxtZWRpYS9PTVhCdWZmZXIuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIElPbXhOb2RlIGltcGxlbWVudGF0aW9uIGFyb3VuZCBjb2RlYyAyLjAgY29tcG9uZW50LCBvbmx5IHRvIGJlIHVzZWQgaW4KKyAqIElHcmFwaGljQnVmZmVyU291cmNlOjpjb25maWd1cmUuIE9ubHkgc3Vic2V0IG9mIElPbXhOb2RlIEFQSSBpcyBpbXBsZW1lbnRlZAorICogYW5kIG90aGVycyBhcmUgbGVmdCBhcyBzdHViLiBBcyBhIHJlc3VsdCwgb25lIGNhbm5vdCBleHBlY3QgdGhpcyBJT214Tm9kZQorICogdG8gd29yayBpbiBhbnkgb3RoZXIgdXNhZ2UgdGhhbiBJR3JhcGhpY0J1ZmZlclNvdXJjZS4KKyAqLworc3RydWN0IEMyT01YTm9kZSA6IHB1YmxpYyBCbk9NWE5vZGUgeworICAgIGV4cGxpY2l0IEMyT01YTm9kZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wKTsKKyAgICB+QzJPTVhOb2RlKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgLy8gSU9NWE5vZGUKKyAgICBzdGF0dXNfdCBmcmVlTm9kZSgpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNlbmRDb21tYW5kKE9NWF9DT01NQU5EVFlQRSBjbWQsIE9NWF9TMzIgcGFyYW0pIG92ZXJyaWRlOworICAgIHN0YXR1c190IGdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGdldENvbmZpZygKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldENvbmZpZygKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldFBvcnRNb2RlKE9NWF9VMzIgcG9ydF9pbmRleCwgSU9NWDo6UG9ydE1vZGUgbW9kZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgcHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2soCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLAorICAgICAgICAgICAgT01YX1UzMiBtYXhGcmFtZVdpZHRoLCBPTVhfVTMyIG1heEZyYW1lSGVpZ2h0KSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBjb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgdHVubmVsZWQsCisgICAgICAgICAgICBPTVhfVTMyIGF1ZGlvSHdTeW5jLCBuYXRpdmVfaGFuZGxlX3QgKipzaWRlYmFuZEhhbmRsZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZ2V0R3JhcGhpY0J1ZmZlclVzYWdlKAorICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfVTMyKiB1c2FnZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgc2V0SW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU9NWEJ1ZmZlclNvdXJjZT4gJmJ1ZmZlclNvdXJjZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgYWxsb2NhdGVTZWN1cmVCdWZmZXIoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXgsIHNpemVfdCBzaXplLCBidWZmZXJfaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgIHZvaWQgKipidWZmZXJfZGF0YSwgc3A8TmF0aXZlSGFuZGxlPiAqbmF0aXZlX2hhbmRsZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgdXNlQnVmZmVyKAorICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4LCBjb25zdCBPTVhCdWZmZXIgJm9teEJ1ZiwgYnVmZmVyX2lkICpidWZmZXIpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGZyZWVCdWZmZXIoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXgsIGJ1ZmZlcl9pZCBidWZmZXIpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGZpbGxCdWZmZXIoCisgICAgICAgICAgICBidWZmZXJfaWQgYnVmZmVyLCBjb25zdCBPTVhCdWZmZXIgJm9teEJ1ZiwgaW50IGZlbmNlRmQpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGVtcHR5QnVmZmVyKAorICAgICAgICAgICAgYnVmZmVyX2lkIGJ1ZmZlciwgY29uc3QgT01YQnVmZmVyICZvbXhCdWYsCisgICAgICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wLCBpbnQgZmVuY2VGZCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZ2V0RXh0ZW5zaW9uSW5kZXgoCisgICAgICAgICAgICBjb25zdCBjaGFyICpwYXJhbWV0ZXJfbmFtZSwKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgKmluZGV4KSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBkaXNwYXRjaE1lc3NhZ2UoY29uc3Qgb214X21lc3NhZ2UgJm1zZykgb3ZlcnJpZGU7CisKKyAgICBzcDxJT01YQnVmZmVyU291cmNlPiBnZXRTb3VyY2UoKTsKKyAgICB2b2lkIHNldEZyYW1lU2l6ZSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OndlYWtfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBtQ29tcDsKKyAgICBzcDxJT01YQnVmZmVyU291cmNlPiBtQnVmZmVyU291cmNlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKyAgICBzdGQ6OmF0b21pY191aW50NjRfdCBtRnJhbWVJbmRleDsKKyAgICB1aW50MzJfdCBtV2lkdGg7CisgICAgdWludDMyX3QgbUhlaWdodDsKKyAgICB1aW50NjRfdCBtVXNhZ2U7CisKKyAgICAvLyBXT1JLQVJPVU5EOiB0aW1lc3RhbXAgYWRqdXN0bWVudAorCisgICAgLy8gaWYgPjA6IHRoaXMgaXMgdGhlIG1heCB0aW1lc3RhbXAgZ2FwLCBpZiA8MDogdGhpcyBpcyAtMSB0aW1lcyB0aGUgZml4ZWQgdGltZXN0YW1wIGdhcAorICAgIC8vIGlmIDA6IG5vIHRpbWVzdGFtcCBhZGp1c3RtZW50IGlzIG1hZGUKKyAgICAvLyBub3RlIHRoYXQgQzJPTVhOb2RlIGNhbiBiZSByZWN5Y2xlZCBiZXR3ZWVuIGVuY29kaW5nIHNlc3Npb25zLgorICAgIGludDMyX3QgbUFkanVzdFRpbWVzdGFtcEdhcFVzOworICAgIGJvb2wgbUZpcnN0SW5wdXRGcmFtZTsgLy8gdHJ1ZSBmb3IgZmlyc3QgaW5wdXQKKyAgICBjMl9jbnRyNjRfdCBtUHJldklucHV0VGltZXN0YW1wOyAvLyBpbnB1dCB0aW1lc3RhbXAgZm9yIHByZXZpb3VzIGZyYW1lCisgICAgYzJfY250cjY0X3QgbVByZXZDb2RlY1RpbWVzdGFtcDsgLy8gYWRqdXN0ZWQgKGNvZGVjKSB0aW1lc3RhbXAgZm9yIHByZXZpb3VzIGZyYW1lCit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEMyX09NWF9OT0RFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MmQ2ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmNwcApAQCAtMCwwICsxLDE3MzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNDb2RlYyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQYXJhbUludGVybmFsLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvSUdyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL0lPTVhCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSUdyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teC5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDxndWkvYnVmZmVycXVldWUvMS4wL0gyQkdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPG1lZGlhL29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9JbmRleEV4dC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0J1ZmZlclByb2R1Y2VyV3JhcHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9QZXJzaXN0ZW50U3VyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMk9NWE5vZGUuaCIKKyNpbmNsdWRlICJDQ29kZWMuaCIKKyNpbmNsdWRlICJDQ29kZWNCdWZmZXJDaGFubmVsLmgiCisjaW5jbHVkZSAiSW5wdXRTdXJmYWNlV3JhcHBlci5oIgorCitleHRlcm4gIkMiIGFuZHJvaWQ6OlBlcnNpc3RlbnRTdXJmYWNlICpDcmVhdGVJbnB1dFN1cmZhY2UoKTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OnV0aWxzOjpIMkJHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7Cit1c2luZyBCR3JhcGhpY0J1ZmZlclNvdXJjZSA9IDo6YW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJTb3VyY2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklJbnB1dFN1cmZhY2U7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIENDb2RlY1dhdGNoZG9nIDogcHVibGljIEFIYW5kbGVyIHsKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0V2F0Y2gsCisgICAgfTsKKyAgICBjb25zdGV4cHIgc3RhdGljIGludDY0X3Qga1dhdGNoSW50ZXJ2YWxVcyA9IDMzMDAwMDA7ICAvLyAzLjMgc2VjcworCitwdWJsaWM6CisgICAgc3RhdGljIHNwPENDb2RlY1dhdGNoZG9nPiBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgc3RhdGljIHNwPENDb2RlY1dhdGNoZG9nPiBpbnN0YW5jZShuZXcgQ0NvZGVjV2F0Y2hkb2cpOworICAgICAgICBzdGF0aWMgc3RkOjpvbmNlX2ZsYWcgZmxhZzsKKyAgICAgICAgLy8gQ2FsbCBJbml0KCkgb25seSBvbmNlLgorICAgICAgICBzdGQ6OmNhbGxfb25jZShmbGFnLCBJbml0LCBpbnN0YW5jZSk7CisgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICB9CisKKyAgICB+Q0NvZGVjV2F0Y2hkb2coKSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIHdhdGNoKHNwPENDb2RlYz4gY29kZWMpIHsKKyAgICAgICAgYm9vbCBzaG91bGRQb3N0ID0gZmFsc2U7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8c3RkOjpzZXQ8d3A8Q0NvZGVjPj4+OjpMb2NrZWQgY29kZWNzKG1Db2RlY3NUb1dhdGNoKTsKKyAgICAgICAgICAgIC8vIElmIGEgd2F0Y2ggbWVzc2FnZSBpcyBpbiBmbGlnaHQsIHBpZ2d5LWJhY2sgdGhpcyBpbnN0YW5jZSBhcyB3ZWxsLgorICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBwb3N0IGEgbmV3IHdhdGNoIG1lc3NhZ2UuCisgICAgICAgICAgICBzaG91bGRQb3N0ID0gY29kZWNzLT5lbXB0eSgpOworICAgICAgICAgICAgY29kZWNzLT5lbXBsYWNlKGNvZGVjKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2hvdWxkUG9zdCkgeworICAgICAgICAgICAgQUxPR1YoInBvc3Rpbmcgd2F0Y2ggbWVzc2FnZSIpOworICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFdhdGNoLCB0aGlzKSktPnBvc3Qoa1dhdGNoSW50ZXJ2YWxVcyk7CisgICAgICAgIH0KKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgICAgIGNhc2Uga1doYXRXYXRjaDogeworICAgICAgICAgICAgICAgIE11dGV4ZWQ8c3RkOjpzZXQ8d3A8Q0NvZGVjPj4+OjpMb2NrZWQgY29kZWNzKG1Db2RlY3NUb1dhdGNoKTsKKyAgICAgICAgICAgICAgICBBTE9HVigid2F0Y2ggZm9yICV6dSBjb2RlY3MiLCBjb2RlY3MtPnNpemUoKSk7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gY29kZWNzLT5iZWdpbigpOyBpdCAhPSBjb2RlY3MtPmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgICAgIHNwPENDb2RlYz4gY29kZWMgPSBpdC0+cHJvbW90ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZWMgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29kZWMtPmluaXRpYXRlUmVsZWFzZUlmU3R1Y2soKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29kZWNzLT5jbGVhcigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgVFJFU1BBU1MoIkNDb2RlY1dhdGNoZG9nOiB1bnJlY29nbml6ZWQgbWVzc2FnZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIENDb2RlY1dhdGNoZG9nKCkgOiBtTG9vcGVyKG5ldyBBTG9vcGVyKSB7fQorCisgICAgc3RhdGljIHZvaWQgSW5pdChjb25zdCBzcDxDQ29kZWNXYXRjaGRvZz4gJnRoaXopIHsKKyAgICAgICAgQUxPR1YoIkluaXQiKTsKKyAgICAgICAgdGhpei0+bUxvb3Blci0+c2V0TmFtZSgiQ0NvZGVjV2F0Y2hkb2ciKTsKKyAgICAgICAgdGhpei0+bUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXopOworICAgICAgICB0aGl6LT5tTG9vcGVyLT5zdGFydCgpOworICAgIH0KKworICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CisKKyAgICBNdXRleGVkPHN0ZDo6c2V0PHdwPENDb2RlYz4+PiBtQ29kZWNzVG9XYXRjaDsKK307CisKK2NsYXNzIEMySW5wdXRTdXJmYWNlV3JhcHBlciA6IHB1YmxpYyBJbnB1dFN1cmZhY2VXcmFwcGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBDMklucHV0U3VyZmFjZVdyYXBwZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U+ICZzdXJmYWNlKSA6CisgICAgICAgIG1TdXJmYWNlKHN1cmZhY2UpIHsKKyAgICB9CisKKyAgICB+QzJJbnB1dFN1cmZhY2VXcmFwcGVyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgc3RhdHVzX3QgY29ubmVjdChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRvU3RhdHVzVChtU3VyZmFjZS0+Y29ubmVjdFRvQ29tcG9uZW50KGNvbXAsICZtQ29ubmVjdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgQzJfT1BFUkFUSU9OX0lucHV0U3VyZmFjZV9jb25uZWN0VG9Db21wb25lbnQpOworICAgIH0KKworICAgIHZvaWQgZGlzY29ubmVjdCgpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1Db25uZWN0aW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1Db25uZWN0aW9uLT5kaXNjb25uZWN0KCk7CisgICAgICAgICAgICBtQ29ubmVjdGlvbiA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGFydCgpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gSW5wdXRTdXJmYWNlIGRvZXMgbm90IGRpc3Rpbmd1aXNoIHN0YXJ0ZWQgc3RhdGUKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0YXR1c190IHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSBvdmVycmlkZSB7CisgICAgICAgIEMySW5wdXRTdXJmYWNlRW9zVHVuaW5nIGVvcyh0cnVlKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtU3VyZmFjZS0+Z2V0Q29uZmlndXJhYmxlKCktPmNvbmZpZyh7JmVvc30sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0YXR1c190IGNvbmZpZ3VyZShDb25maWcgJmNvbmZpZyBfX3VudXNlZCkgeworICAgICAgICAvLyBUT0RPCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlPiBtU3VyZmFjZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uPiBtQ29ubmVjdGlvbjsKK307CisKK2NsYXNzIEdyYXBoaWNCdWZmZXJTb3VyY2VXcmFwcGVyIDogcHVibGljIElucHV0U3VyZmFjZVdyYXBwZXIgeworcHVibGljOgorLy8gICAgZXhwbGljaXQgR3JhcGhpY0J1ZmZlclNvdXJjZVdyYXBwZXIoY29uc3Qgc3A8QkdyYXBoaWNCdWZmZXJTb3VyY2U+ICZzb3VyY2UpIDogbVNvdXJjZShzb3VyY2UpIHt9CisgICAgR3JhcGhpY0J1ZmZlclNvdXJjZVdyYXBwZXIoCisgICAgICAgICAgICBjb25zdCBzcDxCR3JhcGhpY0J1ZmZlclNvdXJjZT4gJnNvdXJjZSwKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0KQorICAgICAgICA6IG1Tb3VyY2Uoc291cmNlKSwgbVdpZHRoKHdpZHRoKSwgbUhlaWdodChoZWlnaHQpIHsKKyAgICAgICAgbURhdGFTcGFjZSA9IEhBTF9EQVRBU1BBQ0VfQlQ3MDk7CisgICAgfQorICAgIH5HcmFwaGljQnVmZmVyU291cmNlV3JhcHBlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHN0YXR1c190IGNvbm5lY3QoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcCkgb3ZlcnJpZGUgeworICAgICAgICBtTm9kZSA9IG5ldyBDMk9NWE5vZGUoY29tcCk7CisgICAgICAgIG1Ob2RlLT5zZXRGcmFtZVNpemUobVdpZHRoLCBtSGVpZ2h0KTsKKworICAgICAgICAvLyBOT1RFOiB3ZSBkbyBub3QgdXNlL3Bhc3MgdGhyb3VnaCBjb2xvciBhc3BlY3RzIGZyb20gR3JhcGhpY0J1ZmZlclNvdXJjZSBhcyB3ZQorICAgICAgICAvLyBjb21tdW5pY2F0ZSB0aGF0IGRpcmVjdGx5IHRvIHRoZSBjb21wb25lbnQuCisgICAgICAgIG1Tb3VyY2UtPmNvbmZpZ3VyZShtTm9kZSwgbURhdGFTcGFjZSk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICB2b2lkIGRpc2Nvbm5lY3QoKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtTm9kZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3A8SU9NWEJ1ZmZlclNvdXJjZT4gc291cmNlID0gbU5vZGUtPmdldFNvdXJjZSgpOworICAgICAgICBpZiAoc291cmNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dEKCJHQlNXcmFwcGVyOjpkaXNjb25uZWN0OiBub2RlIGlzIG5vdCBjb25maWd1cmVkIHdpdGggT01YQnVmZmVyU291cmNlLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNvdXJjZS0+b25PbXhJZGxlKCk7CisgICAgICAgIHNvdXJjZS0+b25PbXhMb2FkZWQoKTsKKyAgICAgICAgbU5vZGUuY2xlYXIoKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBHZXRTdGF0dXMoY29uc3QgYmluZGVyOjpTdGF0dXMgJnN0YXR1cykgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICAgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICBlcnIgPSBzdGF0dXMuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCk7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgZXJyID0gc3RhdHVzLnRyYW5zYWN0aW9uRXJyb3IoKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGJpbmRlciBzdGF0dXMgZmFpbGVkLCBidXQgdGhlcmUgaXMgbm8gc2VydmllIG9yIHRyYW5zYWN0aW9uIGVycm9yCisgICAgICAgICAgICAgICAgICAgIGVyciA9IFVOS05PV05fRVJST1I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhcnQoKSBvdmVycmlkZSB7CisgICAgICAgIHNwPElPTVhCdWZmZXJTb3VyY2U+IHNvdXJjZSA9IG1Ob2RlLT5nZXRTb3VyY2UoKTsKKyAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorICAgICAgICBjb25zdGV4cHIgc2l6ZV90IGtOdW1TbG90cyA9IDE2OworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1TbG90czsgKytpKSB7CisgICAgICAgICAgICBzb3VyY2UtPm9uSW5wdXRCdWZmZXJBZGRlZChpKTsKKyAgICAgICAgfQorCisgICAgICAgIHNvdXJjZS0+b25PbXhFeGVjdXRpbmcoKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0YXR1c190IHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBHZXRTdGF0dXMobVNvdXJjZS0+c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBjb25maWd1cmUoQ29uZmlnICZjb25maWcpIHsKKyAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3RhdHVzOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKworICAgICAgICAvLyBoYW5kbGUgZWFjaCBjb25maWd1cmF0aW9uIGdyYW51YWxseSwgaW4gY2FzZSB3ZSBuZWVkIHRvIGhhbmRsZSBwYXJ0IG9mIHRoZSBjb25maWd1cmF0aW9uCisgICAgICAgIC8vIGVsc2V3aGVyZQorCisgICAgICAgIC8vIFRSSUNLWTogd2UgZG8gbm90IHVuc2V0IGZyYW1lIGRlbGF5IHJlcGVhdGluZworICAgICAgICBpZiAoY29uZmlnLm1NaW5GcHMgPiAwICYmIGNvbmZpZy5tTWluRnBzICE9IG1Db25maWcubU1pbkZwcykgeworICAgICAgICAgICAgaW50NjRfdCB1cyA9IDFlNiAvIGNvbmZpZy5tTWluRnBzICsgMC41OworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gR2V0U3RhdHVzKG1Tb3VyY2UtPnNldFJlcGVhdFByZXZpb3VzRnJhbWVEZWxheVVzKHVzKSk7CisgICAgICAgICAgICBzdGF0dXMgPDwgIiBtaW5GcHM9IiA8PCBjb25maWcubU1pbkZwcyA8PCAiID0+IHJlcGVhdERlbGF5VXM9IiA8PCB1czsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIiAoPT4gIiA8PCBhc1N0cmluZyhyZXMpIDw8ICIpIjsKKyAgICAgICAgICAgICAgICBlcnIgPSByZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29uZmlnLm1NaW5GcHMgPSBjb25maWcubU1pbkZwczsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHB0cyBnYXAKKyAgICAgICAgaWYgKGNvbmZpZy5tTWluQWRqdXN0ZWRGcHMgPiAwIHx8IGNvbmZpZy5tRml4ZWRBZGp1c3RlZEZwcyA+IDApIHsKKyAgICAgICAgICAgIGlmIChtTm9kZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgT01YX1BBUkFNX1UzMlRZUEUgcHRyR2FwUGFyYW0gPSB7fTsKKyAgICAgICAgICAgICAgICBwdHJHYXBQYXJhbS5uU2l6ZSA9IHNpemVvZihPTVhfUEFSQU1fVTMyVFlQRSk7CisgICAgICAgICAgICAgICAgcHRyR2FwUGFyYW0ublUzMiA9IChjb25maWcubU1pbkFkanVzdGVkRnBzID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgID8gYzJfbWluKElOVDMyX01BWCArIDAuLCAxZTYgLyBjb25maWcubU1pbkFkanVzdGVkRnBzICsgMC41KQorICAgICAgICAgICAgICAgICAgICAgICAgOiBjMl9tYXgoMC4gLSBJTlQzMl9NQVgsIC0xZTYgLyBjb25maWcubUZpeGVkQWRqdXN0ZWRGcHMgLSAwLjUpOworICAgICAgICAgICAgICAgICh2b2lkKW1Ob2RlLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbU1heEZyYW1lRHVyYXRpb25Gb3JCaXRyYXRlQ29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwdHJHYXBQYXJhbSwgc2l6ZW9mKHB0ckdhcFBhcmFtKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBtYXggZnBzCisgICAgICAgIC8vIFRSSUNLWTogd2UgZG8gbm90IHVuc2V0IG1heCBmcHMgdG8gMCB1bmxlc3MgdXNpbmcgZml4ZWQgZnBzCisgICAgICAgIGlmICgoY29uZmlnLm1NYXhGcHMgPiAwIHx8IChjb25maWcubUZpeGVkQWRqdXN0ZWRGcHMgPiAwICYmIGNvbmZpZy5tTWF4RnBzID09IDApKQorICAgICAgICAgICAgICAgICYmIGNvbmZpZy5tTWF4RnBzICE9IG1Db25maWcubU1heEZwcykgeworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gR2V0U3RhdHVzKG1Tb3VyY2UtPnNldE1heEZwcyhjb25maWcubU1heEZwcykpOworICAgICAgICAgICAgc3RhdHVzIDw8ICIgbWF4RnBzPSIgPDwgY29uZmlnLm1NYXhGcHM7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzIDw8ICIgKD0+ICIgPDwgYXNTdHJpbmcocmVzKSA8PCAiKSI7CisgICAgICAgICAgICAgICAgZXJyID0gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbmZpZy5tTWF4RnBzID0gY29uZmlnLm1NYXhGcHM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29uZmlnLm1UaW1lT2Zmc2V0VXMgIT0gbUNvbmZpZy5tVGltZU9mZnNldFVzKSB7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBHZXRTdGF0dXMobVNvdXJjZS0+c2V0VGltZU9mZnNldFVzKGNvbmZpZy5tVGltZU9mZnNldFVzKSk7CisgICAgICAgICAgICBzdGF0dXMgPDwgIiB0aW1lT2Zmc2V0ICIgPDwgY29uZmlnLm1UaW1lT2Zmc2V0VXMgPDwgInVzIjsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIiAoPT4gIiA8PCBhc1N0cmluZyhyZXMpIDw8ICIpIjsKKyAgICAgICAgICAgICAgICBlcnIgPSByZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29uZmlnLm1UaW1lT2Zmc2V0VXMgPSBjb25maWcubVRpbWVPZmZzZXRVczsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb25maWcubUNhcHR1cmVGcHMgIT0gbUNvbmZpZy5tQ2FwdHVyZUZwcyB8fCBjb25maWcubUNvZGVkRnBzICE9IG1Db25maWcubUNvZGVkRnBzKSB7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPQorICAgICAgICAgICAgICAgIEdldFN0YXR1cyhtU291cmNlLT5zZXRUaW1lTGFwc2VDb25maWcoY29uZmlnLm1Db2RlZEZwcywgY29uZmlnLm1DYXB0dXJlRnBzKSk7CisgICAgICAgICAgICBzdGF0dXMgPDwgIiB0aW1lTGFwc2UgIiA8PCBjb25maWcubUNhcHR1cmVGcHMgPDwgImZwcyBhcyAiIDw8IGNvbmZpZy5tQ29kZWRGcHMgPDwgImZwcyI7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzIDw8ICIgKD0+ICIgPDwgYXNTdHJpbmcocmVzKSA8PCAiKSI7CisgICAgICAgICAgICAgICAgZXJyID0gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbmZpZy5tQ2FwdHVyZUZwcyA9IGNvbmZpZy5tQ2FwdHVyZUZwczsKKyAgICAgICAgICAgIG1Db25maWcubUNvZGVkRnBzID0gY29uZmlnLm1Db2RlZEZwczsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb25maWcubVN0YXJ0QXRVcyAhPSBtQ29uZmlnLm1TdGFydEF0VXMKKyAgICAgICAgICAgICAgICB8fCAoY29uZmlnLm1TdG9wcGVkICE9IG1Db25maWcubVN0b3BwZWQgJiYgIWNvbmZpZy5tU3RvcHBlZCkpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IEdldFN0YXR1cyhtU291cmNlLT5zZXRTdGFydFRpbWVVcyhjb25maWcubVN0YXJ0QXRVcykpOworICAgICAgICAgICAgc3RhdHVzIDw8ICIgc3RhcnQgYXQgIiA8PCBjb25maWcubVN0YXJ0QXRVcyA8PCAidXMiOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiICg9PiAiIDw8IGFzU3RyaW5nKHJlcykgPDwgIikiOworICAgICAgICAgICAgICAgIGVyciA9IHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db25maWcubVN0YXJ0QXRVcyA9IGNvbmZpZy5tU3RhcnRBdFVzOworICAgICAgICAgICAgbUNvbmZpZy5tU3RvcHBlZCA9IGNvbmZpZy5tU3RvcHBlZDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHN1c3BlbmQtcmVzdW1lCisgICAgICAgIGlmIChjb25maWcubVN1c3BlbmRlZCAhPSBtQ29uZmlnLm1TdXNwZW5kZWQpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IEdldFN0YXR1cyhtU291cmNlLT5zZXRTdXNwZW5kKGNvbmZpZy5tU3VzcGVuZGVkLCBjb25maWcubVN1c3BlbmRBdFVzKSk7CisgICAgICAgICAgICBzdGF0dXMgPDwgIiAiIDw8IChjb25maWcubVN1c3BlbmRlZCA/ICJzdXNwZW5kIiA6ICJyZXN1bWUiKQorICAgICAgICAgICAgICAgICAgICA8PCAiIGF0ICIgPDwgY29uZmlnLm1TdXNwZW5kQXRVcyA8PCAidXMiOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiICg9PiAiIDw8IGFzU3RyaW5nKHJlcykgPDwgIikiOworICAgICAgICAgICAgICAgIGVyciA9IHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db25maWcubVN1c3BlbmRlZCA9IGNvbmZpZy5tU3VzcGVuZGVkOworICAgICAgICAgICAgbUNvbmZpZy5tU3VzcGVuZEF0VXMgPSBjb25maWcubVN1c3BlbmRBdFVzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbmZpZy5tU3RvcHBlZCAhPSBtQ29uZmlnLm1TdG9wcGVkICYmIGNvbmZpZy5tU3RvcHBlZCkgeworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gR2V0U3RhdHVzKG1Tb3VyY2UtPnNldFN0b3BUaW1lVXMoY29uZmlnLm1TdG9wQXRVcykpOworICAgICAgICAgICAgc3RhdHVzIDw8ICIgc3RvcCBhdCAiIDw8IGNvbmZpZy5tU3RvcEF0VXMgPDwgInVzIjsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIiAoPT4gIiA8PCBhc1N0cmluZyhyZXMpIDw8ICIpIjsKKyAgICAgICAgICAgICAgICBlcnIgPSByZXM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiIGRlbGF5VXMiOworICAgICAgICAgICAgICAgIHJlcyA9IEdldFN0YXR1cyhtU291cmNlLT5nZXRTdG9wVGltZU9mZnNldFVzKCZjb25maWcubUlucHV0RGVsYXlVcykpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzIDw8ICIgKD0+ICIgPDwgYXNTdHJpbmcocmVzKSA8PCAiKSI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzIDw8ICI9IiA8PCBjb25maWcubUlucHV0RGVsYXlVcyA8PCAidXMiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ29uZmlnLm1JbnB1dERlbGF5VXMgPSBjb25maWcubUlucHV0RGVsYXlVczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db25maWcubVN0b3BBdFVzID0gY29uZmlnLm1TdG9wQXRVczsKKyAgICAgICAgICAgIG1Db25maWcubVN0b3BwZWQgPSBjb25maWcubVN0b3BwZWQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBjb2xvciBhc3BlY3RzIChhbmRyb2lkLl9jb2xvci1hc3BlY3RzKQorCisgICAgICAgIC8vIGNvbnN1bWVyIHVzYWdlCisgICAgICAgIEFMT0dEKCJJU0NvbmZpZyVzIiwgc3RhdHVzLnN0cigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzcDxCR3JhcGhpY0J1ZmZlclNvdXJjZT4gbVNvdXJjZTsKKyAgICBzcDxDMk9NWE5vZGU+IG1Ob2RlOworICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIENvbmZpZyBtQ29uZmlnOworfTsKKworY2xhc3MgQ29kZWMyQ2xpZW50SW50ZXJmYWNlV3JhcHBlciA6IHB1YmxpYyBDMkNvbXBvbmVudFN0b3JlIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworCitwdWJsaWM6CisgICAgQ29kZWMyQ2xpZW50SW50ZXJmYWNlV3JhcHBlcihzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBjbGllbnQpCisgICAgICAgIDogbUNsaWVudChjbGllbnQpIHsgfQorCisgICAgdmlydHVhbCB+Q29kZWMyQ2xpZW50SW50ZXJmYWNlV3JhcHBlcigpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnX3NtKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSAqPiAmcGFyYW1zLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+ICpjb25zdCBmYWlsdXJlcykgeworICAgICAgICByZXR1cm4gbUNsaWVudC0+Y29uZmlnKHBhcmFtcywgQzJfTUFZX0JMT0NLLCBmYWlsdXJlcyk7CisgICAgfTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29weUJ1ZmZlcigKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+LAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4pIHsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBDMlN0cmluZywgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiAqY29uc3QgY29tcG9uZW50KSB7CisgICAgICAgIGNvbXBvbmVudC0+cmVzZXQoKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBDMlN0cmluZywgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAqY29uc3QgaW50ZXJmYWNlKSB7CisgICAgICAgIGludGVyZmFjZS0+cmVzZXQoKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeV9zbSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0gKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uc3QgaGVhcFBhcmFtcykgY29uc3QgeworICAgICAgICByZXR1cm4gbUNsaWVudC0+cXVlcnkoc3RhY2tQYXJhbXMsIGhlYXBQYXJhbUluZGljZXMsIEMyX01BWV9CTE9DSywgaGVhcFBhcmFtcyk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtc19uYigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICpjb25zdCBwYXJhbXMpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DbGllbnQtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKHBhcmFtcyk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlc19zbSgKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcykgY29uc3QgeworICAgICAgICByZXR1cm4gbUNsaWVudC0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoZmllbGRzLCBDMl9NQVlfQkxPQ0spOworICAgIH0KKworICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DbGllbnQtPmdldE5hbWUoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBnZXRQYXJhbVJlZmxlY3RvcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DbGllbnQtPmdldFBhcmFtUmVmbGVjdG9yKCk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4+IGxpc3RDb21wb25lbnRzKCkgeworICAgICAgICByZXR1cm4gc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+PigpOworICAgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBDQ29kZWM6OkNsaWVudExpc3RlbmVyCisKK3N0cnVjdCBDQ29kZWM6OkNsaWVudExpc3RlbmVyIDogcHVibGljIENvZGVjMkNsaWVudDo6TGlzdGVuZXIgeworCisgICAgZXhwbGljaXQgQ2xpZW50TGlzdGVuZXIoY29uc3Qgd3A8Q0NvZGVjPiAmY29kZWMpIDogbUNvZGVjKGNvZGVjKSB7fQorCisgICAgdmlydHVhbCB2b2lkIG9uV29ya0RvbmUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zLAorICAgICAgICAgICAgc2l6ZV90IG51bURpc2NhcmRlZElucHV0QnVmZmVycykgb3ZlcnJpZGUgeworICAgICAgICAodm9pZCljb21wb25lbnQ7CisgICAgICAgIHNwPENDb2RlYz4gY29kZWMobUNvZGVjLnByb21vdGUoKSk7CisgICAgICAgIGlmICghY29kZWMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjb2RlYy0+b25Xb3JrRG9uZSh3b3JrSXRlbXMsIG51bURpc2NhcmRlZElucHV0QnVmZmVycyk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uVHJpcHBlZCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4mIHNldHRpbmdSZXN1bHQKKyAgICAgICAgICAgICkgb3ZlcnJpZGUgeworICAgICAgICAvLyBUT0RPCisgICAgICAgICh2b2lkKWNvbXBvbmVudDsKKyAgICAgICAgKHZvaWQpc2V0dGluZ1Jlc3VsdDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25FcnJvcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICB1aW50MzJfdCBlcnJvckNvZGUpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVE9ETworICAgICAgICAodm9pZCljb21wb25lbnQ7CisgICAgICAgICh2b2lkKWVycm9yQ29kZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25EZWF0aCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQpIG92ZXJyaWRlIHsKKyAgICAgICAgeyAvLyBMb2cgdGhlIGRlYXRoIG9mIHRoZSBjb21wb25lbnQuCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXAgPSBjb21wb25lbnQubG9jaygpOworICAgICAgICAgICAgaWYgKCFjb21wKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNvZGVjMiBjb21wb25lbnQgZGllZC4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNvZGVjMiBjb21wb25lbnQgXCIlc1wiIGRpZWQuIiwgY29tcC0+Z2V0TmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVwb3J0IHRvIE1lZGlhQ29kZWMuCisgICAgICAgIHNwPENDb2RlYz4gY29kZWMobUNvZGVjLnByb21vdGUoKSk7CisgICAgICAgIGlmICghY29kZWMgfHwgIWNvZGVjLT5tQ2FsbGJhY2spIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjb2RlYy0+bUNhbGxiYWNrLT5vbkVycm9yKERFQURfT0JKRUNULCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRnJhbWVzUmVuZGVyZWQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxSZW5kZXJlZEZyYW1lPiYgcmVuZGVyZWRGcmFtZXMpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVE9ETworICAgICAgICAodm9pZClyZW5kZXJlZEZyYW1lczsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25JbnB1dEJ1ZmZlckRvbmUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+JiBidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8Q0NvZGVjPiBjb2RlYyhtQ29kZWMucHJvbW90ZSgpKTsKKyAgICAgICAgaWYgKGNvZGVjKSB7CisgICAgICAgICAgICBjb2RlYy0+b25JbnB1dEJ1ZmZlckRvbmUoYnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICB3cDxDQ29kZWM+IG1Db2RlYzsKK307CisKKy8vIENDb2RlY0NhbGxiYWNrSW1wbAorCitjbGFzcyBDQ29kZWNDYWxsYmFja0ltcGwgOiBwdWJsaWMgQ0NvZGVjQ2FsbGJhY2sgeworcHVibGljOgorICAgIGV4cGxpY2l0IENDb2RlY0NhbGxiYWNrSW1wbChDQ29kZWMgKmNvZGVjKSA6IG1Db2RlYyhjb2RlYykge30KKyAgICB+Q0NvZGVjQ2FsbGJhY2tJbXBsKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdm9pZCBvbkVycm9yKHN0YXR1c190IGVyciwgZW51bSBBY3Rpb25Db2RlIGFjdGlvbkNvZGUpIG92ZXJyaWRlIHsKKyAgICAgICAgbUNvZGVjLT5tQ2FsbGJhY2stPm9uRXJyb3IoZXJyLCBhY3Rpb25Db2RlKTsKKyAgICB9CisKKyAgICB2b2lkIG9uT3V0cHV0RnJhbWVzUmVuZGVyZWQoaW50NjRfdCBtZWRpYVRpbWVVcywgbnNlY3NfdCByZW5kZXJUaW1lTnMpIG92ZXJyaWRlIHsKKyAgICAgICAgbUNvZGVjLT5tQ2FsbGJhY2stPm9uT3V0cHV0RnJhbWVzUmVuZGVyZWQoCisgICAgICAgICAgICAgICAge1JlbmRlcmVkRnJhbWVJbmZvKG1lZGlhVGltZVVzLCByZW5kZXJUaW1lTnMpfSk7CisgICAgfQorCisgICAgdm9pZCBvbldvcmtRdWV1ZWQoYm9vbCBlb3MpIG92ZXJyaWRlIHsKKyAgICAgICAgbUNvZGVjLT5vbldvcmtRdWV1ZWQoZW9zKTsKKyAgICB9CisKKyAgICB2b2lkIG9uT3V0cHV0QnVmZmVyc0NoYW5nZWQoKSBvdmVycmlkZSB7CisgICAgICAgIG1Db2RlYy0+bUNhbGxiYWNrLT5vbk91dHB1dEJ1ZmZlcnNDaGFuZ2VkKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIENDb2RlYyAqbUNvZGVjOworfTsKKworLy8gQ0NvZGVjCisKK0NDb2RlYzo6Q0NvZGVjKCkKKyAgICA6IG1DaGFubmVsKG5ldyBDQ29kZWNCdWZmZXJDaGFubmVsKHN0ZDo6bWFrZV9zaGFyZWQ8Q0NvZGVjQ2FsbGJhY2tJbXBsPih0aGlzKSkpLAorICAgICAgbVF1ZXVlZFdvcmtDb3VudCgwKSB7Cit9CisKK0NDb2RlYzo6fkNDb2RlYygpIHsKK30KKworc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlckNoYW5uZWxCYXNlPiBDQ29kZWM6OmdldEJ1ZmZlckNoYW5uZWwoKSB7CisgICAgcmV0dXJuIG1DaGFubmVsOworfQorCitzdGF0dXNfdCBDQ29kZWM6OnRyeUFuZFJlcG9ydE9uRXJyb3Ioc3RkOjpmdW5jdGlvbjxzdGF0dXNfdCgpPiBqb2IpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBqb2IoKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihlcnIsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKwordm9pZCBDQ29kZWM6OmluaXRpYXRlQWxsb2NhdGVDb21wb25lbnQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBhdXRvIHNldEFsbG9jYXRpbmcgPSBbdGhpc10geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgIT0gUkVMRUFTRUQpIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+c2V0KEFMTE9DQVRJTkcpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfTsKKyAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihzZXRBbGxvY2F0aW5nKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8UmVmQmFzZT4gY29kZWNJbmZvOworICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgiY29kZWNJbmZvIiwgJmNvZGVjSW5mbykpOworICAgIC8vIEZvciBDb2RlYyAyLjAgY29tcG9uZW50cywgY29tcG9uZW50TmFtZSA9PSBjb2RlY0luZm8tPmdldENvZGVjTmFtZSgpLgorCisgICAgc3A8QU1lc3NhZ2U+IGFsbG9jTXNnKG5ldyBBTWVzc2FnZShrV2hhdEFsbG9jYXRlLCB0aGlzKSk7CisgICAgYWxsb2NNc2ctPnNldE9iamVjdCgiY29kZWNJbmZvIiwgY29kZWNJbmZvKTsKKyAgICBhbGxvY01zZy0+cG9zdCgpOworfQorCit2b2lkIENDb2RlYzo6YWxsb2NhdGUoY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+ICZjb2RlY0luZm8pIHsKKyAgICBpZiAoY29kZWNJbmZvID09IG51bGxwdHIpIHsKKyAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HRCgiYWxsb2NhdGUoJXMpIiwgY29kZWNJbmZvLT5nZXRDb2RlY05hbWUoKSk7CisgICAgbUNsaWVudExpc3RlbmVyLnJlc2V0KG5ldyBDbGllbnRMaXN0ZW5lcih0aGlzKSk7CisKKyAgICBBU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBjb2RlY0luZm8tPmdldENvZGVjTmFtZSgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IGNsaWVudDsKKworICAgIC8vIHNldCB1cCBwcmVmZXJyZWQgY29tcG9uZW50IHN0b3JlIHRvIGFjY2VzcyB2ZW5kb3Igc3RvcmUgcGFyYW1ldGVycworICAgIGNsaWVudCA9IENvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoImRlZmF1bHQiLCBmYWxzZSk7CisgICAgaWYgKGNsaWVudCkgeworICAgICAgICBBTE9HSSgic2V0dGluZyB1cCAnJXMnIGFzIGRlZmF1bHQgKHZlbmRvcikgc3RvcmUiLCBjbGllbnQtPmdldEluc3RhbmNlTmFtZSgpLmNfc3RyKCkpOworICAgICAgICBTZXRQcmVmZXJyZWRDb2RlYzJDb21wb25lbnRTdG9yZSgKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPENvZGVjMkNsaWVudEludGVyZmFjZVdyYXBwZXI+KGNsaWVudCkpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcCA9CisgICAgICAgICAgICBDb2RlYzJDbGllbnQ6OkNyZWF0ZUNvbXBvbmVudEJ5TmFtZSgKKyAgICAgICAgICAgIGNvbXBvbmVudE5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgIG1DbGllbnRMaXN0ZW5lciwKKyAgICAgICAgICAgICZjbGllbnQpOworICAgIGlmICghY29tcCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIENyZWF0ZSBjb21wb25lbnQ6ICVzIiwgY29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBzdGF0ZS0+c2V0KFJFTEVBU0VEKTsKKyAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgIHN0YXRlLmxvY2soKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HSSgiQ3JlYXRlZCBjb21wb25lbnQgWyVzXSIsIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgbUNoYW5uZWwtPnNldENvbXBvbmVudChjb21wKTsKKyAgICBhdXRvIHNldEFsbG9jYXRlZCA9IFt0aGlzLCBjb21wLCBjbGllbnRdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IEFMTE9DQVRJTkcpIHsKKyAgICAgICAgICAgIHN0YXRlLT5zZXQoUkVMRUFTRUQpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChBTExPQ0FURUQpOworICAgICAgICBzdGF0ZS0+Y29tcCA9IGNvbXA7CisgICAgICAgIG1DbGllbnQgPSBjbGllbnQ7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKHNldEFsbG9jYXRlZCkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGluaXRpYWxpemUgY29uZmlnIGhlcmUgaW4gY2FzZSBzZXRQYXJhbWV0ZXJzIGlzIGNhbGxlZCBwcmlvciB0byBjb25maWd1cmUKKyAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisgICAgc3RhdHVzX3QgZXJyID0gY29uZmlnLT5pbml0aWFsaXplKG1DbGllbnQsIGNvbXApOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR1coIkZhaWxlZCB0byBpbml0aWFsaXplIGNvbmZpZ3VyYXRpb24gc3VwcG9ydCIpOworICAgICAgICAvLyBUT0RPOiByZXBvcnQgZXJyb3Igb25jZSB3ZSBjb21wbGV0ZSBpbXBsZW1lbnRhdGlvbi4KKyAgICB9CisgICAgY29uZmlnLT5xdWVyeUNvbmZpZ3VyYXRpb24oY29tcCk7CisKKyAgICBtQ2FsbGJhY2stPm9uQ29tcG9uZW50QWxsb2NhdGVkKGNvbXBvbmVudE5hbWUuY19zdHIoKSk7Cit9CisKK3ZvaWQgQ0NvZGVjOjppbml0aWF0ZUNvbmZpZ3VyZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworICAgIGF1dG8gY2hlY2tBbGxvY2F0ZWQgPSBbdGhpc10geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIHJldHVybiAoc3RhdGUtPmdldCgpICE9IEFMTE9DQVRFRCkgPyBVTktOT1dOX0VSUk9SIDogT0s7CisgICAgfTsKKyAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihjaGVja0FsbG9jYXRlZCkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBtc2cobmV3IEFNZXNzYWdlKGtXaGF0Q29uZmlndXJlLCB0aGlzKSk7CisgICAgbXNnLT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBmb3JtYXQpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIENDb2RlYzo6Y29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wOworICAgIGF1dG8gY2hlY2tBbGxvY2F0ZWQgPSBbdGhpcywgJmNvbXBdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IEFMTE9DQVRFRCkgeworICAgICAgICAgICAgc3RhdGUtPnNldChSRUxFQVNFRCk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjb21wID0gc3RhdGUtPmNvbXA7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKGNoZWNrQWxsb2NhdGVkKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBkb0NvbmZpZyA9IFttc2csIGNvbXAsIHRoaXNdKCkgLT4gc3RhdHVzX3QgeworICAgICAgICBBU3RyaW5nIG1pbWU7CisgICAgICAgIGlmICghbXNnLT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBlbmNvZGVyOworICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJlbmNvZGVyIiwgJmVuY29kZXIpKSB7CisgICAgICAgICAgICBlbmNvZGVyID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiByZWFkIGZyb20gaW50ZigpCisgICAgICAgIGlmICgoIWVuY29kZXIpICE9IChjb21wLT5nZXROYW1lKCkuZmluZCgiZW5jb2RlciIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IHN0b3JlTWV0YTsKKyAgICAgICAgaWYgKGVuY29kZXIKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRJbnQzMigiYW5kcm9pZC5faW5wdXQtbWV0YWRhdGEtYnVmZmVyLXR5cGUiLCAmc3RvcmVNZXRhKQorICAgICAgICAgICAgICAgICYmIHN0b3JlTWV0YSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlSW52YWxpZCkgeworICAgICAgICAgICAgaWYgKHN0b3JlTWV0YSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIk9ubHkgQU5XIGJ1ZmZlcnMgYXJlIHN1cHBvcnRlZCBmb3IgbGVnYWN5IG1ldGFkYXRhIG1vZGUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNoYW5uZWwtPnNldE1ldGFNb2RlKENDb2RlY0J1ZmZlckNoYW5uZWw6Ok1PREVfQU5XKTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZE9iamVjdCgibmF0aXZlLXdpbmRvdyIsICZvYmopKSB7CisgICAgICAgICAgICBzdXJmYWNlID0gc3RhdGljX2Nhc3Q8U3VyZmFjZSAqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgc2V0U3VyZmFjZShzdXJmYWNlKTsKKyAgICAgICAgfQorCisgICAgICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICAgICAgY29uZmlnLT5tVXNpbmdTdXJmYWNlID0gc3VyZmFjZSAhPSBudWxscHRyOworCisgICAgICAgIC8qCisgICAgICAgICAqIEhhbmRsZSBpbnB1dCBzdXJmYWNlIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICovCisgICAgICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgKENvbmZpZzo6SVNfVklERU8gfCBDb25maWc6OklTX0lNQUdFKSkKKyAgICAgICAgICAgICAgICAmJiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19FTkNPREVSKSkgeworICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWcucmVzZXQobmV3IElucHV0U3VyZmFjZVdyYXBwZXI6OkNvbmZpZ3t9KTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bU1pbkZwcyA9IDA7CisgICAgICAgICAgICAgICAgaW50NjRfdCB2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50NjQoInJlcGVhdC1wcmV2aW91cy1mcmFtZS1hZnRlciIsICZ2YWx1ZSkgJiYgdmFsdWUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tTWluRnBzID0gMWU2IC8gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICh2b2lkKW1zZy0+ZmluZEZsb2F0KCJtYXgtZnBzLXRvLWVuY29kZXIiLCAmY29uZmlnLT5tSVNDb25maWctPm1NYXhGcHMpOworICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tTWluQWRqdXN0ZWRGcHMgPSAwOworICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tRml4ZWRBZGp1c3RlZEZwcyA9IDA7CisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDY0KCJtYXgtcHRzLWdhcC10by1lbmNvZGVyIiwgJnZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCAwICYmIHZhbHVlID49IElOVDMyX01JTikgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1GaXhlZEFkanVzdGVkRnBzID0gLTFlNiAvIHZhbHVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID4gMCAmJiB2YWx1ZSA8PSBJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tTWluQWRqdXN0ZWRGcHMgPSAxZTYgLyB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kRG91YmxlKCJ0aW1lLWxhcHNlLWZwcyIsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1DYXB0dXJlRnBzID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKW1zZy0+ZmluZEFzRmxvYXQoS0VZX0ZSQU1FX1JBVEUsICZjb25maWctPm1JU0NvbmZpZy0+bUNvZGVkRnBzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bVN1c3BlbmRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tU3VzcGVuZEF0VXMgPSAtMTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiY3JlYXRlLWlucHV0LWJ1ZmZlcnMtc3VzcGVuZGVkIiwgJnZhbHVlKSAmJiB2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bVN1c3BlbmRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSGFuZGxlIGRlc2lyZWQgY29sb3IgZm9ybWF0LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChjb25maWctPm1Eb21haW4gJiAoQ29uZmlnOjpJU19WSURFTyB8IENvbmZpZzo6SVNfSU1BR0UpKSkgeworICAgICAgICAgICAgaW50MzJfdCBmb3JtYXQgPSAtMTsKKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoS0VZX0NPTE9SX0ZPUk1BVCwgJmZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIEFsc28gaGFuZGxlIGRlZmF1bHQgY29sb3IgZm9ybWF0IChlbmNvZGVycyByZXF1aXJlIGNvbG9yIGZvcm1hdCwgc28gdGhpcyBpcyBvbmx5CisgICAgICAgICAgICAgICAgICogbmVlZGVkIGZvciBkZWNvZGVycy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoIShjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0VOQ09ERVIpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IChzdXJmYWNlID09IG51bGxwdHIpID8gQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyIDogQ09MT1JfRm9ybWF0U3VyZmFjZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXQgPj0gMCkgeworICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImFuZHJvaWQuX2NvbG9yLWZvcm1hdCIsIGZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGNvbmZpZ1VwZGF0ZTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gY29uZmlnLT5nZXRDb25maWdVcGRhdGVGcm9tU2RrUGFyYW1zKAorICAgICAgICAgICAgICAgIGNvbXAsIG1zZywgQ29uZmlnOjpJU19DT05GSUcsIEMyX0RPTlRfQkxPQ0ssICZjb25maWdVcGRhdGUpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiZmFpbGVkIHRvIGNvbnZlcnQgY29uZmlndXJhdGlvbiB0byBjMiBwYXJhbXMiKTsKKyAgICAgICAgfQorICAgICAgICBlcnIgPSBjb25maWctPnNldFBhcmFtZXRlcnMoY29tcCwgY29uZmlnVXBkYXRlLCBDMl9ET05UX0JMT0NLKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR1coImZhaWxlZCB0byBjb25maWd1cmUgYzIgcGFyYW1zIik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbXM7CisgICAgICAgIEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0IHVzYWdlKDB1LCAwdSk7CisgICAgICAgIEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0IG1heElucHV0U2l6ZSgwdSwgMHUpOworCisgICAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxDMlBhcmFtOjpJbmRleD4gaW5kaWNlcyB7CisgICAgICAgIH07CisgICAgICAgIGMyX3N0YXR1c190IGMyZXJyID0gY29tcC0+cXVlcnkoCisgICAgICAgICAgICAgICAgeyAmdXNhZ2UsICZtYXhJbnB1dFNpemUgfSwKKyAgICAgICAgICAgICAgICBpbmRpY2VzLAorICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAgICAgJnBhcmFtcyk7CisgICAgICAgIGlmIChjMmVyciAhPSBDMl9PSyAmJiBjMmVyciAhPSBDMl9CQURfSU5ERVgpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcXVlcnkgY29tcG9uZW50IGludGVyZmFjZTogJWQiLCBjMmVycik7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFyYW1zLnNpemUoKSAhPSBpbmRpY2VzLnNpemUoKSkgeworICAgICAgICAgICAgQUxPR0UoIkNvbXBvbmVudCByZXR1cm5zIHdyb25nIG51bWJlciBvZiBwYXJhbXM6IGV4cGVjdGVkICV6dSBhY3R1YWwgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgaW5kaWNlcy5zaXplKCksIHBhcmFtcy5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVzYWdlICYmICh1c2FnZS52YWx1ZSAmIEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEKSkgeworICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPnNldEludDMyKCJ1c2luZy1zdy1yZWFkLW9mdGVuIiwgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBOT1RFOiB3ZSBkb24ndCBibGluZGx5IHVzZSBjbGllbnQgc3BlY2lmaWVkIGlucHV0IHNpemUgaWYgc3BlY2lmaWVkIGFzIGNsaWVudHMKKyAgICAgICAgLy8gYXQgdGltZXMgc3BlY2lmeSB0b28gc21hbGwgc2l6ZS4gSW5zdGVhZCwgbWltaWMgdGhlIGJlaGF2aW9yIGZyb20gT01YLCB3aGVyZSB0aGUKKyAgICAgICAgLy8gY2xpZW50IHNwZWNpZmllZCBzaXplIGlzIG9ubHkgdXNlZCB0byBhc2sgZm9yIGJpZ2dlciBidWZmZXJzIHRoYW4gY29tcG9uZW50IHN1Z2dlc3RlZAorICAgICAgICAvLyBzaXplLgorICAgICAgICBpbnQzMl90IGNsaWVudElucHV0U2l6ZSA9IDA7CisgICAgICAgIGJvb2wgY2xpZW50U3BlY2lmaWVkSW5wdXRTaXplID0KKyAgICAgICAgICAgIG1zZy0+ZmluZEludDMyKEtFWV9NQVhfSU5QVVRfU0laRSwgJmNsaWVudElucHV0U2l6ZSkgJiYgY2xpZW50SW5wdXRTaXplID4gMDsKKyAgICAgICAgLy8gVEVNUDogZW5mb3JjZSBtaW5pbXVtIGJ1ZmZlciBzaXplIG9mIDFNQiBmb3IgdmlkZW8gZGVjb2RlcnMKKyAgICAgICAgLy8gYW5kIDE2SyAvIDRLIGZvciBhdWRpbyBlbmNvZGVycy9kZWNvZGVycworICAgICAgICBpZiAobWF4SW5wdXRTaXplLnZhbHVlID09IDApIHsKKyAgICAgICAgICAgIGlmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0FVRElPKSB7CisgICAgICAgICAgICAgICAgbWF4SW5wdXRTaXplLnZhbHVlID0gZW5jb2RlciA/IDE2Mzg0IDogNDA5NjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWVuY29kZXIpIHsKKyAgICAgICAgICAgICAgICBtYXhJbnB1dFNpemUudmFsdWUgPSAxMDQ4NTc2dTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHZlcmlmeSB0aGF0IENTRCBmaXRzIGludG8gdGhpcyBzaXplIChpZiBkZWZpbmVkKQorICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfREVDT0RFUikgJiYgbWF4SW5wdXRTaXplLnZhbHVlID4gMCkgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gY3NkOworICAgICAgICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBtc2ctPmZpbmRCdWZmZXIoU3RyaW5nUHJpbnRmKCJjc2QtJXp1IiwgaXgpLmNfc3RyKCksICZjc2QpOyArK2l4KSB7CisgICAgICAgICAgICAgICAgaWYgKGNzZCAmJiBjc2QtPnNpemUoKSA+IG1heElucHV0U2l6ZS52YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBtYXhJbnB1dFNpemUudmFsdWUgPSBjc2QtPnNpemUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiBkbyB0aGlzIGJhc2VkIG9uIGNvbXBvbmVudCByZXF1aXJpbmcgbGluZWFyIGFsbG9jYXRvciBmb3IgaW5wdXQKKyAgICAgICAgaWYgKChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0RFQ09ERVIpIHx8IChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0FVRElPKSkgeworICAgICAgICAgICAgaWYgKGNsaWVudFNwZWNpZmllZElucHV0U2l6ZSkgeworICAgICAgICAgICAgICAgIC8vIFdhcm4gdGhhdCB3ZSdyZSBvdmVycmlkaW5nIGNsaWVudCdzIG1heCBpbnB1dCBzaXplIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgICAgICAgICBpZiAoKHVpbnQzMl90KWNsaWVudElucHV0U2l6ZSA8IG1heElucHV0U2l6ZS52YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiY2xpZW50IHJlcXVlc3RlZCBtYXggaW5wdXQgc2l6ZSAlZCwgd2hpY2ggaXMgc21hbGxlciB0aGFuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIndoYXQgY29tcG9uZW50IHJlY29tbWVuZGVkICgldSk7IG92ZXJyaWRpbmcgd2l0aCBjb21wb25lbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAicmVjb21tZW5kYXRpb24uIiwgY2xpZW50SW5wdXRTaXplLCBtYXhJbnB1dFNpemUudmFsdWUpOworICAgICAgICAgICAgICAgICAgICBBTE9HVygiVGhpcyBiZWhhdmlvciBpcyBzdWJqZWN0IHRvIGNoYW5nZS4gSXQgaXMgcmVjb21tZW5kZWQgdGhhdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhcHAgZGV2ZWxvcGVycyBkb3VibGUgY2hlY2sgd2hldGhlciB0aGUgcmVxdWVzdGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heCBpbnB1dCBzaXplIGlzIGluIHJlYXNvbmFibGUgcmFuZ2UuIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4SW5wdXRTaXplLnZhbHVlID0gY2xpZW50SW5wdXRTaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFBhc3MgbWF4IGlucHV0IHNpemUgb24gaW5wdXQgZm9ybWF0IHRvIHRoZSBidWZmZXIgY2hhbm5lbCAoaWYgc3VwcGxpZWQgYnkgdGhlCisgICAgICAgICAgICAvLyBjb21wb25lbnQgb3IgYnkgYSBkZWZhdWx0KQorICAgICAgICAgICAgaWYgKG1heElucHV0U2l6ZS52YWx1ZSkgeworICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5zZXRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9NQVhfSU5QVVRfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KShjMl9taW4obWF4SW5wdXRTaXplLnZhbHVlLCB1aW50MzJfdChJTlQzMl9NQVgpKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKChjb25maWctPm1Eb21haW4gJiAoQ29uZmlnOjpJU19WSURFTyB8IENvbmZpZzo6SVNfSU1BR0UpKSkgeworICAgICAgICAgICAgLy8gcHJvcGFnYXRlIEhEUiBzdGF0aWMgaW5mbyB0byBvdXRwdXQgZm9ybWF0IGZvciBib3RoIGVuY29kZXJzIGFuZCBkZWNvZGVycworICAgICAgICAgICAgLy8gaWYgY29tcG9uZW50IHN1cHBvcnRzIHRoaXMgaW5mbywgd2Ugd2lsbCB1cGRhdGUgZnJvbSBjb21wb25lbnQsIGJ1dCBvbmx5IHRoZSByYXcgcG9ydCwKKyAgICAgICAgICAgIC8vIHNvIGRvbid0IHByb3BhZ2F0ZSBpZiBjb21wb25lbnQgYWxyZWFkeSBmaWxsZWQgaXQgaW4uCisgICAgICAgICAgICBzcDxBQnVmZmVyPiBoZHJJbmZvOworICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcihLRVlfSERSX1NUQVRJQ19JTkZPLCAmaGRySW5mbykKKyAgICAgICAgICAgICAgICAgICAgJiYgIWNvbmZpZy0+bU91dHB1dEZvcm1hdC0+ZmluZEJ1ZmZlcihLRVlfSERSX1NUQVRJQ19JTkZPLCAmaGRySW5mbykpIHsKKyAgICAgICAgICAgICAgICBjb25maWctPm1PdXRwdXRGb3JtYXQtPnNldEJ1ZmZlcihLRVlfSERSX1NUQVRJQ19JTkZPLCBoZHJJbmZvKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2V0IGRlc2lyZWQgY29sb3IgZm9ybWF0IGZyb20gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIKKyAgICAgICAgICAgIGludDMyX3QgZm9ybWF0OworICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJhbmRyb2lkLl9jb2xvci1mb3JtYXQiLCAmZm9ybWF0KSkgeworICAgICAgICAgICAgICAgIGlmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0VOQ09ERVIpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPnNldEludDMyKEtFWV9DT0xPUl9GT1JNQVQsIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfQ09MT1JfRk9STUFULCBmb3JtYXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHByb3BhZ2F0ZSBlbmNvZGVyIGRlbGF5IGFuZCBwYWRkaW5nIHRvIG91dHB1dCBmb3JtYXQKKyAgICAgICAgaWYgKChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0RFQ09ERVIpICYmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0FVRElPKSkgeworICAgICAgICAgICAgaW50IGRlbGF5ID0gMDsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZW5jb2Rlci1kZWxheSIsICZkZWxheSkpIHsKKyAgICAgICAgICAgICAgICBjb25maWctPm1PdXRwdXRGb3JtYXQtPnNldEludDMyKCJlbmNvZGVyLWRlbGF5IiwgZGVsYXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHBhZGRpbmcgPSAwOworICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJlbmNvZGVyLXBhZGRpbmciLCAmcGFkZGluZykpIHsKKyAgICAgICAgICAgICAgICBjb25maWctPm1PdXRwdXRGb3JtYXQtPnNldEludDMyKCJlbmNvZGVyLXBhZGRpbmciLCBwYWRkaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHNldCBjaGFubmVsLW1hc2sKKyAgICAgICAgaWYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfQVVESU8pIHsKKyAgICAgICAgICAgIGludDMyX3QgbWFzazsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMihLRVlfQ0hBTk5FTF9NQVNLLCAmbWFzaykpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19FTkNPREVSKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfQ0hBTk5FTF9NQVNLLCBtYXNrKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjb25maWctPm1PdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9DSEFOTkVMX01BU0ssIG1hc2spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEFMT0dEKCJzZXR1cCBmb3JtYXRzIGlucHV0OiAlcyBhbmQgb3V0cHV0OiAlcyIsCisgICAgICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICBjb25maWctPm1PdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKGRvQ29uZmlnKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworCisgICAgbUNhbGxiYWNrLT5vbkNvbXBvbmVudENvbmZpZ3VyZWQoY29uZmlnLT5tSW5wdXRGb3JtYXQsIGNvbmZpZy0+bU91dHB1dEZvcm1hdCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjppbml0aWF0ZUNyZWF0ZUlucHV0U3VyZmFjZSgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBbdGhpc10geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgIT0gQUxMT0NBVEVEKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPOiByZWFkIGl0IGZyb20gaW50ZigpIHByb3Blcmx5LgorICAgICAgICBpZiAoc3RhdGUtPmNvbXAtPmdldE5hbWUoKS5maW5kKCJlbmNvZGVyIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0s7CisgICAgfSgpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgbUNhbGxiYWNrLT5vbklucHV0U3VyZmFjZUNyZWF0aW9uRmFpbGVkKGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0Q3JlYXRlSW5wdXRTdXJmYWNlLCB0aGlzKSktPnBvc3QoKTsKK30KKwordm9pZCBDQ29kZWM6OmNyZWF0ZUlucHV0U3VyZmFjZSgpIHsKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gYnVmZmVyUHJvZHVjZXI7CisKKyAgICBzcDxBTWVzc2FnZT4gaW5wdXRGb3JtYXQ7CisgICAgc3A8QU1lc3NhZ2U+IG91dHB1dEZvcm1hdDsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICAgICAgaW5wdXRGb3JtYXQgPSBjb25maWctPm1JbnB1dEZvcm1hdDsKKyAgICAgICAgb3V0cHV0Rm9ybWF0ID0gY29uZmlnLT5tT3V0cHV0Rm9ybWF0OworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxQZXJzaXN0ZW50U3VyZmFjZT4gcGVyc2lzdGVudFN1cmZhY2UoQ3JlYXRlSW5wdXRTdXJmYWNlKCkpOworCisgICAgaWYgKHBlcnNpc3RlbnRTdXJmYWNlLT5nZXRIaWRsVGFyZ2V0KCkpIHsKKyAgICAgICAgc3A8SUlucHV0U3VyZmFjZT4gaW5wdXRTdXJmYWNlID0gSUlucHV0U3VyZmFjZTo6Y2FzdEZyb20oCisgICAgICAgICAgICAgICAgcGVyc2lzdGVudFN1cmZhY2UtPmdldEhpZGxUYXJnZXQoKSk7CisgICAgICAgIGlmICghaW5wdXRTdXJmYWNlKSB7CisgICAgICAgICAgICBBTE9HRSgiQ29ycnVwdGVkIGlucHV0IHN1cmZhY2UiKTsKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25JbnB1dFN1cmZhY2VDcmVhdGlvbkZhaWxlZChVTktOT1dOX0VSUk9SKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBlcnIgPSBzZXR1cElucHV0U3VyZmFjZShzdGQ6Om1ha2Vfc2hhcmVkPEMySW5wdXRTdXJmYWNlV3JhcHBlcj4oCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZT4oaW5wdXRTdXJmYWNlKSkpOworICAgICAgICBidWZmZXJQcm9kdWNlciA9IG5ldyBIMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIoaW5wdXRTdXJmYWNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQzMl90IHdpZHRoID0gMDsKKyAgICAgICAgKHZvaWQpb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKTsKKyAgICAgICAgaW50MzJfdCBoZWlnaHQgPSAwOworICAgICAgICAodm9pZClvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCk7CisgICAgICAgIGVyciA9IHNldHVwSW5wdXRTdXJmYWNlKHN0ZDo6bWFrZV9zaGFyZWQ8R3JhcGhpY0J1ZmZlclNvdXJjZVdyYXBwZXI+KAorICAgICAgICAgICAgICAgIHBlcnNpc3RlbnRTdXJmYWNlLT5nZXRCdWZmZXJTb3VyY2UoKSwgd2lkdGgsIGhlaWdodCkpOworICAgICAgICBidWZmZXJQcm9kdWNlciA9IHBlcnNpc3RlbnRTdXJmYWNlLT5nZXRCdWZmZXJQcm9kdWNlcigpOworICAgIH0KKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgdXAgaW5wdXQgc3VyZmFjZTogJWQiLCBlcnIpOworICAgICAgICBtQ2FsbGJhY2stPm9uSW5wdXRTdXJmYWNlQ3JlYXRpb25GYWlsZWQoZXJyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1DYWxsYmFjay0+b25JbnB1dFN1cmZhY2VDcmVhdGVkKAorICAgICAgICAgICAgaW5wdXRGb3JtYXQsCisgICAgICAgICAgICBvdXRwdXRGb3JtYXQsCisgICAgICAgICAgICBuZXcgQnVmZmVyUHJvZHVjZXJXcmFwcGVyKGJ1ZmZlclByb2R1Y2VyKSk7Cit9CisKK3N0YXR1c190IENDb2RlYzo6c2V0dXBJbnB1dFN1cmZhY2UoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZVdyYXBwZXI+ICZzdXJmYWNlKSB7CisgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworICAgIGNvbmZpZy0+bVVzaW5nU3VyZmFjZSA9IHRydWU7CisKKyAgICAvLyB3ZSBhcmUgbm93IHVzaW5nIHN1cmZhY2UgLSBhcHBseSBkZWZhdWx0IGNvbG9yIGFzcGVjdHMgdG8gaW5wdXQgZm9ybWF0IC0gYXMgd2VsbCBhcworICAgIC8vIGdldCBkYXRhc3BhY2UKKyAgICBib29sIGlucHV0Rm9ybWF0Q2hhbmdlZCA9IGNvbmZpZy0+dXBkYXRlRm9ybWF0cyhjb25maWctPklTX0lOUFVUKTsKKyAgICBBTE9HRCgiaW5wdXQgZm9ybWF0ICVzIHRvICVzIiwKKyAgICAgICAgICAgIGlucHV0Rm9ybWF0Q2hhbmdlZCA/ICJjaGFuZ2VkIiA6ICJ1bmNoYW5nZWQiLAorICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisKKyAgICAvLyBjb25maWd1cmUgZGF0YXNwYWNlCisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoaW50MzJfdCkgPT0gc2l6ZW9mKGFuZHJvaWRfZGF0YXNwYWNlKSwgImRhdGFzcGFjZSBzaXplIG1pc21hdGNoIik7CisgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlID0gSEFMX0RBVEFTUEFDRV9VTktOT1dOOworICAgICh2b2lkKWNvbmZpZy0+bUlucHV0Rm9ybWF0LT5maW5kSW50MzIoImFuZHJvaWQuX2RhdGFzcGFjZSIsIChpbnQzMl90KikmZGF0YVNwYWNlKTsKKyAgICBzdXJmYWNlLT5zZXREYXRhU3BhY2UoZGF0YVNwYWNlKTsKKworICAgIHN0YXR1c190IGVyciA9IG1DaGFubmVsLT5zZXRJbnB1dFN1cmZhY2Uoc3VyZmFjZSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAvLyB1bmRvIGlucHV0IGZvcm1hdCB1cGRhdGUKKyAgICAgICAgY29uZmlnLT5tVXNpbmdTdXJmYWNlID0gZmFsc2U7CisgICAgICAgICh2b2lkKWNvbmZpZy0+dXBkYXRlRm9ybWF0cyhjb25maWctPklTX0lOUFVUKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgY29uZmlnLT5tSW5wdXRTdXJmYWNlID0gc3VyZmFjZTsKKworICAgIGlmIChjb25maWctPm1JU0NvbmZpZykgeworICAgICAgICBzdXJmYWNlLT5jb25maWd1cmUoKmNvbmZpZy0+bUlTQ29uZmlnKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRCgiSVNDb25maWc6IG5vIGNvbmZpZ3VyYXRpb24iKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3VyZmFjZS0+c3RhcnQoKTsKK30KKwordm9pZCBDQ29kZWM6OmluaXRpYXRlU2V0SW5wdXRTdXJmYWNlKGNvbnN0IHNwPFBlcnNpc3RlbnRTdXJmYWNlPiAmc3VyZmFjZSkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRJbnB1dFN1cmZhY2UsIHRoaXMpOworICAgIG1zZy0+c2V0T2JqZWN0KCJzdXJmYWNlIiwgc3VyZmFjZSk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpzZXRJbnB1dFN1cmZhY2UoY29uc3Qgc3A8UGVyc2lzdGVudFN1cmZhY2U+ICZzdXJmYWNlKSB7CisgICAgc3A8QU1lc3NhZ2U+IGlucHV0Rm9ybWF0OworICAgIHNwPEFNZXNzYWdlPiBvdXRwdXRGb3JtYXQ7CisgICAgeworICAgICAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisgICAgICAgIGlucHV0Rm9ybWF0ID0gY29uZmlnLT5tSW5wdXRGb3JtYXQ7CisgICAgICAgIG91dHB1dEZvcm1hdCA9IGNvbmZpZy0+bU91dHB1dEZvcm1hdDsKKyAgICB9CisgICAgYXV0byBoaWRsVGFyZ2V0ID0gc3VyZmFjZS0+Z2V0SGlkbFRhcmdldCgpOworICAgIGlmIChoaWRsVGFyZ2V0KSB7CisgICAgICAgIHNwPElJbnB1dFN1cmZhY2U+IGlucHV0U3VyZmFjZSA9CisgICAgICAgICAgICAgICAgSUlucHV0U3VyZmFjZTo6Y2FzdEZyb20oaGlkbFRhcmdldCk7CisgICAgICAgIGlmICghaW5wdXRTdXJmYWNlKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBpbnB1dCBzdXJmYWNlOiBDb3JydXB0ZWQgc3VyZmFjZS4iKTsKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25JbnB1dFN1cmZhY2VEZWNsaW5lZChVTktOT1dOX0VSUk9SKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cElucHV0U3VyZmFjZShzdGQ6Om1ha2Vfc2hhcmVkPEMySW5wdXRTdXJmYWNlV3JhcHBlcj4oCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZT4oaW5wdXRTdXJmYWNlKSkpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCB1cCBpbnB1dCBzdXJmYWNlOiAlZCIsIGVycik7CisgICAgICAgICAgICBtQ2FsbGJhY2stPm9uSW5wdXRTdXJmYWNlRGVjbGluZWQoZXJyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGludDMyX3Qgd2lkdGggPSAwOworICAgICAgICAodm9pZClvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpOworICAgICAgICBpbnQzMl90IGhlaWdodCA9IDA7CisgICAgICAgICh2b2lkKW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0dXBJbnB1dFN1cmZhY2Uoc3RkOjptYWtlX3NoYXJlZDxHcmFwaGljQnVmZmVyU291cmNlV3JhcHBlcj4oCisgICAgICAgICAgICAgICAgc3VyZmFjZS0+Z2V0QnVmZmVyU291cmNlKCksIHdpZHRoLCBoZWlnaHQpKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgdXAgaW5wdXQgc3VyZmFjZTogJWQiLCBlcnIpOworICAgICAgICAgICAgbUNhbGxiYWNrLT5vbklucHV0U3VyZmFjZURlY2xpbmVkKGVycik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgbUNhbGxiYWNrLT5vbklucHV0U3VyZmFjZUFjY2VwdGVkKGlucHV0Rm9ybWF0LCBvdXRwdXRGb3JtYXQpOworfQorCit2b2lkIENDb2RlYzo6aW5pdGlhdGVTdGFydCgpIHsKKyAgICBhdXRvIHNldFN0YXJ0aW5nID0gW3RoaXNdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IEFMTE9DQVRFRCkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChTVEFSVElORyk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKHNldFN0YXJ0aW5nKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCB0aGlzKSktPnBvc3QoKTsKK30KKwordm9pZCBDQ29kZWM6OnN0YXJ0KCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcDsKKyAgICBhdXRvIGNoZWNrU3RhcnRpbmcgPSBbdGhpcywgJmNvbXBdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IFNUQVJUSU5HKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjb21wID0gc3RhdGUtPmNvbXA7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKGNoZWNrU3RhcnRpbmcpICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBjb21wLT5zdGFydCgpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKHRvU3RhdHVzVChlcnIsIEMyX09QRVJBVElPTl9Db21wb25lbnRfc3RhcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPEFNZXNzYWdlPiBpbnB1dEZvcm1hdDsKKyAgICBzcDxBTWVzc2FnZT4gb3V0cHV0Rm9ybWF0OworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworICAgICAgICBpbnB1dEZvcm1hdCA9IGNvbmZpZy0+bUlucHV0Rm9ybWF0OworICAgICAgICBvdXRwdXRGb3JtYXQgPSBjb25maWctPm1PdXRwdXRGb3JtYXQ7CisgICAgfQorICAgIHN0YXR1c190IGVycjIgPSBtQ2hhbm5lbC0+c3RhcnQoaW5wdXRGb3JtYXQsIG91dHB1dEZvcm1hdCk7CisgICAgaWYgKGVycjIgIT0gT0spIHsKKyAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKGVycjIsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF1dG8gc2V0UnVubmluZyA9IFt0aGlzXSB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSAhPSBTVEFSVElORykgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChSVU5OSU5HKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH07CisgICAgaWYgKHRyeUFuZFJlcG9ydE9uRXJyb3Ioc2V0UnVubmluZykgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQ2FsbGJhY2stPm9uU3RhcnRDb21wbGV0ZWQoKTsKKworICAgICh2b2lkKW1DaGFubmVsLT5yZXF1ZXN0SW5pdGlhbElucHV0QnVmZmVycygpOworfQorCit2b2lkIENDb2RlYzo6aW5pdGlhdGVTaHV0ZG93bihib29sIGtlZXBDb21wb25lbnRBbGxvY2F0ZWQpIHsKKyAgICBpZiAoa2VlcENvbXBvbmVudEFsbG9jYXRlZCkgeworICAgICAgICBpbml0aWF0ZVN0b3AoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbml0aWF0ZVJlbGVhc2UoKTsKKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjOjppbml0aWF0ZVN0b3AoKSB7CisgICAgeworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgPT0gQUxMT0NBVEVECisgICAgICAgICAgICAgICAgfHwgc3RhdGUtPmdldCgpICA9PSBSRUxFQVNFRAorICAgICAgICAgICAgICAgIHx8IHN0YXRlLT5nZXQoKSA9PSBTVE9QUElORworICAgICAgICAgICAgICAgIHx8IHN0YXRlLT5nZXQoKSA9PSBSRUxFQVNJTkcpIHsKKyAgICAgICAgICAgIC8vIFdlJ3JlIGFscmVhZHkgc3RvcHBlZCwgcmVsZWFzZWQsIG9yIGRvaW5nIGl0IHJpZ2h0IG5vdy4KKyAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgbUNhbGxiYWNrLT5vblN0b3BDb21wbGV0ZWQoKTsKKyAgICAgICAgICAgIHN0YXRlLmxvY2soKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+c2V0KFNUT1BQSU5HKTsKKyAgICB9CisKKyAgICBtQ2hhbm5lbC0+c3RvcCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCB0aGlzKSktPnBvc3QoKTsKK30KKwordm9pZCBDQ29kZWM6OnN0b3AoKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpID09IFJFTEVBU0lORykgeworICAgICAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgICAgICAvLyBXZSdyZSBhbHJlYWR5IHN0b3BwZWQgb3IgcmVsZWFzZSBpcyBpbiBwcm9ncmVzcy4KKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25TdG9wQ29tcGxldGVkKCk7CisgICAgICAgICAgICBzdGF0ZS5sb2NrKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUtPmdldCgpICE9IFNUT1BQSU5HKSB7CisgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgICAgICBzdGF0ZS5sb2NrKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY29tcCA9IHN0YXRlLT5jb21wOworICAgIH0KKyAgICBzdGF0dXNfdCBlcnIgPSBjb21wLT5zdG9wKCk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAvLyBUT0RPOiBjb252ZXJ0IGVyciBpbnRvIHN0YXR1c190CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgfQorCisgICAgeworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgPT0gU1RPUFBJTkcpIHsKKyAgICAgICAgICAgIHN0YXRlLT5zZXQoQUxMT0NBVEVEKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtQ2FsbGJhY2stPm9uU3RvcENvbXBsZXRlZCgpOworfQorCit2b2lkIENDb2RlYzo6aW5pdGlhdGVSZWxlYXNlKGJvb2wgc2VuZENhbGxiYWNrIC8qID0gdHJ1ZSAqLykgeworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpID09IFJFTEVBU0VEIHx8IHN0YXRlLT5nZXQoKSA9PSBSRUxFQVNJTkcpIHsKKyAgICAgICAgICAgIC8vIFdlJ3JlIGFscmVhZHkgcmVsZWFzZWQgb3IgZG9pbmcgaXQgcmlnaHQgbm93LgorICAgICAgICAgICAgaWYgKHNlbmRDYWxsYmFjaykgeworICAgICAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgICAgIG1DYWxsYmFjay0+b25SZWxlYXNlQ29tcGxldGVkKCk7CisgICAgICAgICAgICAgICAgc3RhdGUubG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgPT0gQUxMT0NBVElORykgeworICAgICAgICAgICAgc3RhdGUtPnNldChSRUxFQVNJTkcpOworICAgICAgICAgICAgLy8gV2l0aCB0aGUgYWx0ZXJlZCBzdGF0ZSBhbGxvY2F0ZSgpIHdvdWxkIGZhaWwgYW5kIGNsZWFuIHVwLgorICAgICAgICAgICAgaWYgKHNlbmRDYWxsYmFjaykgeworICAgICAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgICAgIG1DYWxsYmFjay0+b25SZWxlYXNlQ29tcGxldGVkKCk7CisgICAgICAgICAgICAgICAgc3RhdGUubG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5zZXQoUkVMRUFTSU5HKTsKKyAgICB9CisKKyAgICBtQ2hhbm5lbC0+c3RvcCgpOworICAgIC8vIHRoaXogaG9sZHMgc3Ryb25nIHJlZiB0byB0aGlzIHdoaWxlIHRoZSB0aHJlYWQgaXMgcnVubmluZy4KKyAgICBzcDxDQ29kZWM+IHRoaXoodGhpcyk7CisgICAgc3RkOjp0aHJlYWQoW3RoaXosIHNlbmRDYWxsYmFja10geyB0aGl6LT5yZWxlYXNlKHNlbmRDYWxsYmFjayk7IH0pLmRldGFjaCgpOworfQorCit2b2lkIENDb2RlYzo6cmVsZWFzZShib29sIHNlbmRDYWxsYmFjaykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcDsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSA9PSBSRUxFQVNFRCkgeworICAgICAgICAgICAgaWYgKHNlbmRDYWxsYmFjaykgeworICAgICAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgICAgIG1DYWxsYmFjay0+b25SZWxlYXNlQ29tcGxldGVkKCk7CisgICAgICAgICAgICAgICAgc3RhdGUubG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNvbXAgPSBzdGF0ZS0+Y29tcDsKKyAgICB9CisgICAgY29tcC0+cmVsZWFzZSgpOworCisgICAgeworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIHN0YXRlLT5zZXQoUkVMRUFTRUQpOworICAgICAgICBzdGF0ZS0+Y29tcC5yZXNldCgpOworICAgIH0KKyAgICBpZiAoc2VuZENhbGxiYWNrKSB7CisgICAgICAgIG1DYWxsYmFjay0+b25SZWxlYXNlQ29tcGxldGVkKCk7CisgICAgfQorfQorCitzdGF0dXNfdCBDQ29kZWM6OnNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKKyAgICByZXR1cm4gbUNoYW5uZWwtPnNldFN1cmZhY2Uoc3VyZmFjZSk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpzaWduYWxGbHVzaCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBbdGhpc10geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgPT0gRkxVU0hFRCkgeworICAgICAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOworICAgICAgICB9CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgIT0gUlVOTklORykgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChGTFVTSElORyk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9KCk7CisgICAgc3dpdGNoIChlcnIpIHsKKyAgICAgICAgY2FzZSBBTFJFQURZX0VYSVNUUzoKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25GbHVzaENvbXBsZXRlZCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBjYXNlIE9LOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBtQ2FsbGJhY2stPm9uRXJyb3IoZXJyLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUNoYW5uZWwtPnN0b3AoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0Rmx1c2gsIHRoaXMpKS0+cG9zdCgpOworfQorCit2b2lkIENDb2RlYzo6Zmx1c2goKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wOworICAgIGF1dG8gY2hlY2tGbHVzaGluZyA9IFt0aGlzLCAmY29tcF0geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgIT0gRkxVU0hJTkcpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNvbXAgPSBzdGF0ZS0+Y29tcDsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH07CisgICAgaWYgKHRyeUFuZFJlcG9ydE9uRXJyb3IoY2hlY2tGbHVzaGluZykgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gZmx1c2hlZFdvcms7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gY29tcC0+Zmx1c2goQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmZsdXNoZWRXb3JrKTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+Pj46OkxvY2tlZCBxdWV1ZShtV29ya0RvbmVRdWV1ZSk7CisgICAgICAgIGZsdXNoZWRXb3JrLnNwbGljZShmbHVzaGVkV29yay5lbmQoKSwgKnF1ZXVlKTsKKyAgICB9CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAvLyBUT0RPOiBjb252ZXJ0IGVyciBpbnRvIHN0YXR1c190CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgfQorCisgICAgbUNoYW5uZWwtPmZsdXNoKGZsdXNoZWRXb3JrKTsKKyAgICBzdWJRdWV1ZWRXb3JrQ291bnQoZmx1c2hlZFdvcmsuc2l6ZSgpKTsKKworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBzdGF0ZS0+c2V0KEZMVVNIRUQpOworICAgIH0KKyAgICBtQ2FsbGJhY2stPm9uRmx1c2hDb21wbGV0ZWQoKTsKK30KKwordm9pZCBDQ29kZWM6OnNpZ25hbFJlc3VtZSgpIHsKKyAgICBhdXRvIHNldFJlc3VtaW5nID0gW3RoaXNdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IEZMVVNIRUQpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5zZXQoUkVTVU1JTkcpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfTsKKyAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihzZXRSZXN1bWluZykgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgICh2b2lkKW1DaGFubmVsLT5zdGFydChudWxscHRyLCBudWxscHRyKTsKKworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IFJFU1VNSU5HKSB7CisgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgICAgICBzdGF0ZS5sb2NrKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChSVU5OSU5HKTsKKyAgICB9CisKKyAgICAodm9pZCltQ2hhbm5lbC0+cmVxdWVzdEluaXRpYWxJbnB1dEJ1ZmZlcnMoKTsKK30KKwordm9pZCBDQ29kZWM6OnNpZ25hbFNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZwYXJhbXMpIHsKKyAgICBzZXRQYXJhbWV0ZXJzKHBhcmFtcyk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wOworICAgIGF1dG8gY2hlY2tTdGF0ZSA9IFt0aGlzLCAmY29tcF0geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgPT0gUkVMRUFTRUQpIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBjb21wID0gc3RhdGUtPmNvbXA7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKGNoZWNrU3RhdGUpICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGUgaW5wdXQgc3VyZmFjZSBwYXJhbWV0ZXJzCisgICAgICovCisgICAgaWYgKChjb25maWctPm1Eb21haW4gJiAoQ29uZmlnOjpJU19WSURFTyB8IENvbmZpZzo6SVNfSU1BR0UpKQorICAgICAgICAgICAgJiYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikgJiYgY29uZmlnLT5tSW5wdXRTdXJmYWNlICYmIGNvbmZpZy0+bUlTQ29uZmlnKSB7CisgICAgICAgICh2b2lkKXBhcmFtcy0+ZmluZEludDY0KCJ0aW1lLW9mZnNldC11cyIsICZjb25maWctPm1JU0NvbmZpZy0+bVRpbWVPZmZzZXRVcyk7CisKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEludDY0KCJza2lwLWZyYW1lcy1iZWZvcmUiLCAmY29uZmlnLT5tSVNDb25maWctPm1TdGFydEF0VXMpKSB7CisgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bVN0b3BwZWQgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXJhbXMtPmZpbmRJbnQ2NCgic3RvcC10aW1lLXVzIiwgJmNvbmZpZy0+bUlTQ29uZmlnLT5tU3RvcEF0VXMpKSB7CisgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bVN0b3BwZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKCJkcm9wLWlucHV0LWZyYW1lcyIsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tU3VzcGVuZGVkID0gdmFsdWU7CisgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bVN1c3BlbmRBdFVzID0gLTE7CisgICAgICAgICAgICAodm9pZClwYXJhbXMtPmZpbmRJbnQ2NCgiZHJvcC1zdGFydC10aW1lLXVzIiwgJmNvbmZpZy0+bUlTQ29uZmlnLT5tU3VzcGVuZEF0VXMpOworICAgICAgICB9CisKKyAgICAgICAgKHZvaWQpY29uZmlnLT5tSW5wdXRTdXJmYWNlLT5jb25maWd1cmUoKmNvbmZpZy0+bUlTQ29uZmlnKTsKKyAgICAgICAgaWYgKGNvbmZpZy0+bUlTQ29uZmlnLT5tU3RvcHBlZCkgeworICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPnNldEludDY0KAorICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5fc3RvcC10aW1lLW9mZnNldC11cyIsIGNvbmZpZy0+bUlTQ29uZmlnLT5tSW5wdXREZWxheVVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gY29uZmlnVXBkYXRlOworICAgICh2b2lkKWNvbmZpZy0+Z2V0Q29uZmlnVXBkYXRlRnJvbVNka1BhcmFtcygKKyAgICAgICAgICAgIGNvbXAsIHBhcmFtcywgQ29uZmlnOjpJU19QQVJBTSwgQzJfTUFZX0JMT0NLLCAmY29uZmlnVXBkYXRlKTsKKyAgICAvLyBQcmVmZXIgdG8gcGFzcyBwYXJhbWV0ZXJzIHRvIHRoZSBidWZmZXIgY2hhbm5lbCwgc28gdGhleSBjYW4gYmUgc3luY2hyb25pemVkIHdpdGggdGhlIGZyYW1lcy4KKyAgICAvLyBQYXJhbWV0ZXIgc3luY2hyb25pemF0aW9uIGlzIG5vdCBkZWZpbmVkIHdoZW4gdXNpbmcgaW5wdXQgc3VyZmFjZS4gRm9yIG5vdywgcm91dGUKKyAgICAvLyB0aGVzZSBkaXJlY3RseSB0byB0aGUgY29tcG9uZW50LgorICAgIGlmIChjb25maWctPm1JbnB1dFN1cmZhY2UgPT0gbnVsbHB0cgorICAgICAgICAgICAgJiYgKHByb3BlcnR5X2dldF9ib29sKCJkZWJ1Zy5zdGFnZWZyaWdodC5jY29kZWNfZGVsYXllZF9wYXJhbXMiLCBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgfHwgY29tcC0+Z2V0TmFtZSgpLmZpbmQoImMyLmFuZHJvaWQuIikgPT0gMCkpIHsKKyAgICAgICAgbUNoYW5uZWwtPnNldFBhcmFtZXRlcnMoY29uZmlnVXBkYXRlKTsKKyAgICB9IGVsc2UgeworICAgICAgICAodm9pZCljb25maWctPnNldFBhcmFtZXRlcnMoY29tcCwgY29uZmlnVXBkYXRlLCBDMl9NQVlfQkxPQ0spOworICAgIH0KK30KKwordm9pZCBDQ29kZWM6OnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSB7CisgICAgbUNhbGxiYWNrLT5vblNpZ25hbGVkSW5wdXRFT1MobUNoYW5uZWwtPnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpzaWduYWxSZXF1ZXN0SURSRnJhbWUoKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpID09IFJFTEVBU0VEKSB7CisgICAgICAgICAgICBBTE9HRCgibm8gSURSIHJlcXVlc3Qgc2VudCBzaW5jZSBjb21wb25lbnQgaXMgcmVsZWFzZWQiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjb21wID0gc3RhdGUtPmNvbXA7CisgICAgfQorICAgIEFMT0dWKCJyZXF1ZXN0IElEUiIpOworICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHBhcmFtczsKKyAgICBwYXJhbXMucHVzaF9iYWNrKAorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4oMHUsIHRydWUpKTsKKyAgICBjb25maWctPnNldFBhcmFtZXRlcnMoY29tcCwgcGFyYW1zLCBDMl9NQVlfQkxPQ0spOworfQorCit2b2lkIENDb2RlYzo6b25Xb3JrRG9uZShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZ3b3JrSXRlbXMsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzKSB7CisgICAgaWYgKCF3b3JrSXRlbXMuZW1wdHkoKSkgeworICAgICAgICB7CisgICAgICAgICAgICBNdXRleGVkPHN0ZDo6bGlzdDxzaXplX3Q+Pjo6TG9ja2VkIG51bURpc2NhcmRlZElucHV0QnVmZmVyc1F1ZXVlKAorICAgICAgICAgICAgICAgICAgICBtTnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzUXVldWUpOworICAgICAgICAgICAgbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzUXVldWUtPmluc2VydCgKKyAgICAgICAgICAgICAgICAgICAgbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzUXVldWUtPmVuZCgpLAorICAgICAgICAgICAgICAgICAgICB3b3JrSXRlbXMuc2l6ZSgpIC0gMSwgMCk7CisgICAgICAgICAgICBudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnNRdWV1ZS0+ZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgICAgICAgICBudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnMpOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8c3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+Pj46OkxvY2tlZCBxdWV1ZShtV29ya0RvbmVRdWV1ZSk7CisgICAgICAgICAgICBxdWV1ZS0+c3BsaWNlKHF1ZXVlLT5lbmQoKSwgd29ya0l0ZW1zKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0V29ya0RvbmUsIHRoaXMpKS0+cG9zdCgpOworfQorCit2b2lkIENDb2RlYzo6b25JbnB1dEJ1ZmZlckRvbmUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiYgYnVmZmVyKSB7CisgICAgbUNoYW5uZWwtPm9uSW5wdXRCdWZmZXJEb25lKGJ1ZmZlcik7Cit9CisKK3ZvaWQgQ0NvZGVjOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIFRpbWVQb2ludCBub3cgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKKyAgICBDQ29kZWNXYXRjaGRvZzo6Z2V0SW5zdGFuY2UoKS0+d2F0Y2godGhpcyk7CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0QWxsb2NhdGU6IHsKKyAgICAgICAgICAgIC8vIEMyQ29tcG9uZW50U3RvcmU6OmNyZWF0ZUNvbXBvbmVudCgpIHNob3VsZCByZXR1cm4gd2l0aGluIDEwMG1zLgorICAgICAgICAgICAgc2V0RGVhZGxpbmUobm93LCAxNTBtcywgImFsbG9jYXRlIik7CisgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoImNvZGVjSW5mbyIsICZvYmopKTsKKyAgICAgICAgICAgIGFsbG9jYXRlKChNZWRpYUNvZGVjSW5mbyAqKW9iai5nZXQoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0Q29uZmlndXJlOiB7CisgICAgICAgICAgICAvLyBDMkNvbXBvbmVudDo6Y29tbWl0X3NtKCkgc2hvdWxkIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAgICAgICAgc2V0RGVhZGxpbmUobm93LCAyNTBtcywgImNvbmZpZ3VyZSIpOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoImZvcm1hdCIsICZmb3JtYXQpKTsKKyAgICAgICAgICAgIGNvbmZpZ3VyZShmb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFN0YXJ0OiB7CisgICAgICAgICAgICAvLyBDMkNvbXBvbmVudDo6c3RhcnQoKSBzaG91bGQgcmV0dXJuIHdpdGhpbiA1MDBtcy4KKyAgICAgICAgICAgIHNldERlYWRsaW5lKG5vdywgNTUwbXMsICJzdGFydCIpOworICAgICAgICAgICAgbVF1ZXVlZFdvcmtDb3VudCA9IDA7CisgICAgICAgICAgICBzdGFydCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFN0b3A6IHsKKyAgICAgICAgICAgIC8vIEMyQ29tcG9uZW50OjpzdG9wKCkgc2hvdWxkIHJldHVybiB3aXRoaW4gNTAwbXMuCisgICAgICAgICAgICBzZXREZWFkbGluZShub3csIDU1MG1zLCAic3RvcCIpOworICAgICAgICAgICAgc3RvcCgpOworCisgICAgICAgICAgICBtUXVldWVkV29ya0NvdW50ID0gMDsKKyAgICAgICAgICAgIE11dGV4ZWQ8TmFtZWRUaW1lUG9pbnQ+OjpMb2NrZWQgZGVhZGxpbmUobVF1ZXVlRGVhZGxpbmUpOworICAgICAgICAgICAgZGVhZGxpbmUtPnNldChUaW1lUG9pbnQ6Om1heCgpLCAibm9uZSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdEZsdXNoOiB7CisgICAgICAgICAgICAvLyBDMkNvbXBvbmVudDo6Zmx1c2hfc20oKSBzaG91bGQgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICAgICAgICBzZXREZWFkbGluZShub3csIDUwbXMsICJmbHVzaCIpOworICAgICAgICAgICAgZmx1c2goKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRDcmVhdGVJbnB1dFN1cmZhY2U6IHsKKyAgICAgICAgICAgIC8vIFN1cmZhY2Ugb3BlcmF0aW9ucyBtYXkgYmUgYnJpZWZseSBibG9ja2luZy4KKyAgICAgICAgICAgIHNldERlYWRsaW5lKG5vdywgMTAwbXMsICJjcmVhdGVJbnB1dFN1cmZhY2UiKTsKKyAgICAgICAgICAgIGNyZWF0ZUlucHV0U3VyZmFjZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFNldElucHV0U3VyZmFjZTogeworICAgICAgICAgICAgLy8gU3VyZmFjZSBvcGVyYXRpb25zIG1heSBiZSBicmllZmx5IGJsb2NraW5nLgorICAgICAgICAgICAgc2V0RGVhZGxpbmUobm93LCAxMDBtcywgInNldElucHV0U3VyZmFjZSIpOworICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJzdXJmYWNlIiwgJm9iaikpOworICAgICAgICAgICAgc3A8UGVyc2lzdGVudFN1cmZhY2U+IHN1cmZhY2Uoc3RhdGljX2Nhc3Q8UGVyc2lzdGVudFN1cmZhY2UgKj4ob2JqLmdldCgpKSk7CisgICAgICAgICAgICBzZXRJbnB1dFN1cmZhY2Uoc3VyZmFjZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0V29ya0RvbmU6IHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgICAgICBzaXplX3QgbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzOworICAgICAgICAgICAgYm9vbCBzaG91bGRQb3N0ID0gZmFsc2U7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTXV0ZXhlZDxzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+Pjo6TG9ja2VkIHF1ZXVlKG1Xb3JrRG9uZVF1ZXVlKTsKKyAgICAgICAgICAgICAgICBpZiAocXVldWUtPmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdvcmsuc3dhcChxdWV1ZS0+ZnJvbnQoKSk7CisgICAgICAgICAgICAgICAgcXVldWUtPnBvcF9mcm9udCgpOworICAgICAgICAgICAgICAgIHNob3VsZFBvc3QgPSAhcXVldWUtPmVtcHR5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTXV0ZXhlZDxzdGQ6Omxpc3Q8c2l6ZV90Pj46OkxvY2tlZCBudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnNRdWV1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnNRdWV1ZSk7CisgICAgICAgICAgICAgICAgaWYgKG51bURpc2NhcmRlZElucHV0QnVmZmVyc1F1ZXVlLT5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG51bURpc2NhcmRlZElucHV0QnVmZmVycyA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzID0gbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzUXVldWUtPmZyb250KCk7CisgICAgICAgICAgICAgICAgICAgIG51bURpc2NhcmRlZElucHV0QnVmZmVyc1F1ZXVlLT5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2hvdWxkUG9zdCkgeworICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRXb3JrRG9uZSwgdGhpcykpLT5wb3N0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh3b3JrLT53b3JrbGV0cy5lbXB0eSgpCisgICAgICAgICAgICAgICAgICAgIHx8ICEod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfSU5DT01QTEVURSkpIHsKKyAgICAgICAgICAgICAgICBzdWJRdWV1ZWRXb3JrQ291bnQoMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBoYW5kbGUgY29uZmlndXJhdGlvbiBjaGFuZ2VzIGluIHdvcmsgZG9uZQorICAgICAgICAgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworICAgICAgICAgICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICBDb25maWc6OldhdGNoZXI8QzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dD4gaW5pdERhdGEgPQorICAgICAgICAgICAgICAgIGNvbmZpZy0+d2F0Y2g8QzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dD4oKTsKKyAgICAgICAgICAgIGlmICghd29yay0+d29ya2xldHMuZW1wdHkoKQorICAgICAgICAgICAgICAgICAgICAmJiAod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBDMkZyYW1lRGF0YTo6RkxBR19ESVNDQVJEX0ZSQU1FKSA9PSAwKSB7CisKKyAgICAgICAgICAgICAgICAvLyBjb3B5IGJ1ZmZlciBpbmZvIHRvIGNvbmZpZworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gdXBkYXRlcyA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZSh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlKTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBzdHJlYW0gPSAwOworICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmIDogd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPiAmaW5mbyA6IGJ1Zi0+aW5mbygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIGFsbCBpbmZvIGludG8gb3V0cHV0LXN0cmVhbSAjMCBkb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZXMuZW1wbGFjZV9iYWNrKEMyUGFyYW06OkNvcHlBc1N0cmVhbSgqaW5mbywgdHJ1ZSAvKiBvdXRwdXQgKi8sIHN0cmVhbSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayAmYmxvY2sgOiBidWYtPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFMT0dWKCJnb3Qgb3V0cHV0IGJ1ZmZlciB3aXRoIGNyb3AgJXUsJXUrJXUsJXUgYW5kIHNpemUgJXUsJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICBibG9jay5jcm9wKCkubGVmdCwgYmxvY2suY3JvcCgpLnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgYmxvY2suY3JvcCgpLndpZHRoLCBibG9jay5jcm9wKCkuaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICBibG9jay53aWR0aCgpLCBibG9jay5oZWlnaHQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVzLmVtcGxhY2VfYmFjayhuZXcgQzJTdHJlYW1Dcm9wUmVjdEluZm86Om91dHB1dChzdHJlYW0sIGJsb2NrLmNyb3AoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlcy5lbXBsYWNlX2JhY2sobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgYmxvY2sud2lkdGgoKSwgYmxvY2suaGVpZ2h0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBmb3Igbm93IG9ubHkgZG8gdGhlIGZpcnN0IGJsb2NrCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKytzdHJlYW07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IGNvbmZpZy0+dXBkYXRlQ29uZmlndXJhdGlvbih1cGRhdGVzLCBjb25maWctPm1PdXRwdXREb21haW4pOworCisgICAgICAgICAgICAgICAgLy8gY29weSBzdGFuZGFyZCBpbmZvcyB0byBncmFwaGljIGJ1ZmZlcnMgaWYgbm90IGFscmVhZHkgcHJlc2VudCAob3RoZXJ3aXNlLCB3ZQorICAgICAgICAgICAgICAgIC8vIG1heSBvdmVyd3JpdGUgdGhlIGFjdHVhbCBpbnRlcm1lZGlhdGUgdmFsdWUgd2l0aCBhIGZpbmFsIHZhbHVlKQorICAgICAgICAgICAgICAgIHN0cmVhbSA9IDA7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBzdGRHZnhJbmZvcyA9IHsKKyAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1Sb3RhdGlvbkluZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtRGF0YVNwYWNlSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbUhkclN0YXRpY0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtUGl4ZWxBc3BlY3RSYXRpb0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1TdXJmYWNlU2NhbGluZ0luZm86Om91dHB1dDo6UEFSQU1fVFlQRQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWYgOiB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycykgeworICAgICAgICAgICAgICAgICAgICBpZiAoYnVmLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChDMlBhcmFtOjpJbmRleCBpeCA6IHN0ZEdmeEluZm9zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFidWYtPmhhc0luZm8oaXgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gKnBhcmFtID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Z2V0Q29uZmlnUGFyYW1ldGVyVmFsdWUoaXgud2l0aFN0cmVhbShzdHJlYW0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gaW5mbyhDMlBhcmFtOjpDb3B5KCpwYXJhbSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLT5zZXRJbmZvKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMkluZm8+KGluZm8pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICArK3N0cmVhbTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2hhbm5lbC0+b25Xb3JrRG9uZSgKKyAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHdvcmspLCBjaGFuZ2VkID8gY29uZmlnLT5tT3V0cHV0Rm9ybWF0IDogbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgaW5pdERhdGEuaGFzQ2hhbmdlZCgpID8gaW5pdERhdGEudXBkYXRlKCkuZ2V0KCkgOiBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICBudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFdhdGNoOiB7CisgICAgICAgICAgICAvLyB3YXRjaCBtZXNzYWdlIGFscmVhZHkgcG9zdGVkOyBuby1vcC4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIEFMT0dFKCJ1bnJlY29nbml6ZWQgbWVzc2FnZSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgc2V0RGVhZGxpbmUoVGltZVBvaW50OjptYXgoKSwgMG1zLCAibm9uZSIpOworfQorCit2b2lkIENDb2RlYzo6c2V0RGVhZGxpbmUoCisgICAgICAgIGNvbnN0IFRpbWVQb2ludCAmbm93LAorICAgICAgICBjb25zdCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzICZ0aW1lb3V0LAorICAgICAgICBjb25zdCBjaGFyICpuYW1lKSB7CisgICAgaW50MzJfdCBtdWx0ID0gc3RkOjptYXgoMSwgcHJvcGVydHlfZ2V0X2ludDMyKCJkZWJ1Zy5zdGFnZWZyaWdodC5jY29kZWNfdGltZW91dF9tdWx0IiwgMSkpOworICAgIE11dGV4ZWQ8TmFtZWRUaW1lUG9pbnQ+OjpMb2NrZWQgZGVhZGxpbmUobURlYWRsaW5lKTsKKyAgICBkZWFkbGluZS0+c2V0KG5vdyArICh0aW1lb3V0ICogbXVsdCksIG5hbWUpOworfQorCit2b2lkIENDb2RlYzo6aW5pdGlhdGVSZWxlYXNlSWZTdHVjaygpIHsKKyAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIGJvb2wgcGVuZGluZ0RlYWRsaW5lID0gZmFsc2U7CisgICAgZm9yIChNdXRleGVkPE5hbWVkVGltZVBvaW50PiAqZGVhZGxpbmVQdHIgOiB7ICZtRGVhZGxpbmUsICZtUXVldWVEZWFkbGluZSwgJm1Fb3NEZWFkbGluZSB9KSB7CisgICAgICAgIE11dGV4ZWQ8TmFtZWRUaW1lUG9pbnQ+OjpMb2NrZWQgZGVhZGxpbmUoKmRlYWRsaW5lUHRyKTsKKyAgICAgICAgaWYgKGRlYWRsaW5lLT5nZXQoKSA8IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpKSB7CisgICAgICAgICAgICBuYW1lID0gZGVhZGxpbmUtPmdldE5hbWUoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChkZWFkbGluZS0+Z2V0KCkgIT0gVGltZVBvaW50OjptYXgoKSkgeworICAgICAgICAgICAgcGVuZGluZ0RlYWRsaW5lID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobmFtZS5lbXB0eSgpKSB7CisgICAgICAgIC8vIFdlJ3JlIG5vdCBzdHVjay4KKyAgICAgICAgaWYgKHBlbmRpbmdEZWFkbGluZSkgeworICAgICAgICAgICAgLy8gSWYgd2UgYXJlIG5vdCBzdHVjayB5ZXQgYnV0IHN0aWxsIGhhcyBkZWFkbGluZSBjb21pbmcgdXAsCisgICAgICAgICAgICAvLyBwb3N0IHdhdGNoIG1lc3NhZ2UgdG8gY2hlY2sgYmFjayBsYXRlci4KKyAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRXYXRjaCwgdGhpcykpLT5wb3N0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dXKCJwcmV2aW91cyBjYWxsIHRvICVzIGV4Y2VlZGVkIHRpbWVvdXQiLCBuYW1lLmNfc3RyKCkpOworICAgIGluaXRpYXRlUmVsZWFzZShmYWxzZSk7CisgICAgbUNhbGxiYWNrLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKK30KKwordm9pZCBDQ29kZWM6Om9uV29ya1F1ZXVlZChib29sIGVvcykgeworICAgIEFMT0dWKCJxdWV1ZWQgd29yayBjb3VudCArMSBmcm9tICVkIiwgbVF1ZXVlZFdvcmtDb3VudC5sb2FkKCkpOworICAgIGludDMyX3QgY291bnQgPSArK21RdWV1ZWRXb3JrQ291bnQ7CisgICAgaWYgKGVvcykgeworICAgICAgICBDQ29kZWNXYXRjaGRvZzo6Z2V0SW5zdGFuY2UoKS0+d2F0Y2godGhpcyk7CisgICAgICAgIE11dGV4ZWQ8TmFtZWRUaW1lUG9pbnQ+OjpMb2NrZWQgZGVhZGxpbmUobUVvc0RlYWRsaW5lKTsKKyAgICAgICAgZGVhZGxpbmUtPnNldChzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKSArIDNzLCAiZW9zIik7CisgICAgfQorICAgIC8vIFRPRE86IHF1ZXJ5IGFuZCB1c2UgaW5wdXQvcGlwZWxpbmUvb3V0cHV0IGRlbGF5IGNvbWJpbmVkCisgICAgaWYgKGNvdW50ID49IDQpIHsKKyAgICAgICAgQ0NvZGVjV2F0Y2hkb2c6OmdldEluc3RhbmNlKCktPndhdGNoKHRoaXMpOworICAgICAgICBNdXRleGVkPE5hbWVkVGltZVBvaW50Pjo6TG9ja2VkIGRlYWRsaW5lKG1RdWV1ZURlYWRsaW5lKTsKKyAgICAgICAgZGVhZGxpbmUtPnNldChzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKSArIDNzLCAicXVldWUiKTsKKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjOjpzdWJRdWV1ZWRXb3JrQ291bnQodWludDMyX3QgY291bnQpIHsKKyAgICBBTE9HVigicXVldWVkIHdvcmsgY291bnQgLSV1IGZyb20gJWQiLCBjb3VudCwgbVF1ZXVlZFdvcmtDb3VudC5sb2FkKCkpOworICAgIGludDMyX3QgY3VycmVudENvdW50ID0gKG1RdWV1ZWRXb3JrQ291bnQgLT0gY291bnQpOworICAgIGlmIChjdXJyZW50Q291bnQgPT0gMCkgeworICAgICAgICBNdXRleGVkPE5hbWVkVGltZVBvaW50Pjo6TG9ja2VkIGRlYWRsaW5lKG1Fb3NEZWFkbGluZSk7CisgICAgICAgIGRlYWRsaW5lLT5zZXQoVGltZVBvaW50OjptYXgoKSwgIm5vbmUiKTsKKyAgICB9CisgICAgTXV0ZXhlZDxOYW1lZFRpbWVQb2ludD46OkxvY2tlZCBkZWFkbGluZShtUXVldWVEZWFkbGluZSk7CisgICAgZGVhZGxpbmUtPnNldChUaW1lUG9pbnQ6Om1heCgpLCAibm9uZSIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIGFuZHJvaWQ6OkNvZGVjQmFzZSAqQ3JlYXRlQ29kZWMoKSB7CisgICAgcmV0dXJuIG5ldyBhbmRyb2lkOjpDQ29kZWM7Cit9CisKK2V4dGVybiAiQyIgYW5kcm9pZDo6UGVyc2lzdGVudFN1cmZhY2UgKkNyZWF0ZUlucHV0U3VyZmFjZSgpIHsKKyAgICAvLyBBdHRlbXB0IHRvIGNyZWF0ZSBhIENvZGVjMidzIGlucHV0IHN1cmZhY2UuCisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlPiBpbnB1dFN1cmZhY2UgPQorICAgICAgICAgICAgYW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDcmVhdGVJbnB1dFN1cmZhY2UoKTsKKyAgICBpZiAoaW5wdXRTdXJmYWNlKSB7CisgICAgICAgIHJldHVybiBuZXcgYW5kcm9pZDo6UGVyc2lzdGVudFN1cmZhY2UoCisgICAgICAgICAgICAgICAgaW5wdXRTdXJmYWNlLT5nZXRHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhbmRyb2lkOjpzcDxhbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4+KAorICAgICAgICAgICAgICAgIGlucHV0U3VyZmFjZS0+Z2V0SGFsSW50ZXJmYWNlKCkpKTsKKyAgICB9CisKKyAgICAvLyBGYWxsIGJhY2sgdG8gT01YLgorICAgIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDsKKyAgICB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA6OnV0aWxzOworICAgIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjp1dGlsczsKKyAgICB0eXBlZGVmIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjpTdGF0dXMgT214U3RhdHVzOworICAgIGFuZHJvaWQ6OnNwPElPbXg+IG9teCA9IElPbXg6OmdldFNlcnZpY2UoKTsKKyAgICB0eXBlZGVmIGFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworICAgIHR5cGVkZWYgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJTb3VyY2UgSEdyYXBoaWNCdWZmZXJTb3VyY2U7CisgICAgT214U3RhdHVzIHM7CisgICAgYW5kcm9pZDo6c3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2JwOworICAgIGFuZHJvaWQ6OnNwPEhHcmFwaGljQnVmZmVyU291cmNlPiBnYnM7CisgICAgYW5kcm9pZDo6UmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gb214LT5jcmVhdGVJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBbJnMsICZnYnAsICZnYnNdKAorICAgICAgICAgICAgICAgICAgICBPbXhTdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgcHJvZHVjZXIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPEhHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlKSB7CisgICAgICAgICAgICAgICAgcyA9IHN0YXR1czsKKyAgICAgICAgICAgICAgICBnYnAgPSBwcm9kdWNlcjsKKyAgICAgICAgICAgICAgICBnYnMgPSBzb3VyY2U7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAodHJhbnNTdGF0dXMuaXNPaygpICYmIHMgPT0gT214U3RhdHVzOjpPSykgeworICAgICAgICByZXR1cm4gbmV3IGFuZHJvaWQ6OlBlcnNpc3RlbnRTdXJmYWNlKAorICAgICAgICAgICAgICAgIG5ldyBIMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIoZ2JwKSwKKyAgICAgICAgICAgICAgICBzcDw6OmFuZHJvaWQ6OklHcmFwaGljQnVmZmVyU291cmNlPigKKyAgICAgICAgICAgICAgICAgICAgbmV3IExXR3JhcGhpY0J1ZmZlclNvdXJjZShnYnMpKSk7CisgICAgfQorCisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWMuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGIwMDllCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlYy5oCkBAIC0wLDAgKzEsMTg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDX0NPREVDX0hfCisjZGVmaW5lIENfQ09ERUNfSF8KKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfd2luZG93Lmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvTWV0YWRhdGFCdWZmZXJUeXBlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NdXRleGVkLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRnJhbWVSZW5kZXJUcmFja2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU2tpcEN1dEJ1ZmZlci5oPgorI2luY2x1ZGUgPHV0aWxzL05hdGl2ZUhhbmRsZS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KKyNpbmNsdWRlIDxuYXRpdmViYXNlL25hdGl2ZWJhc2UuaD4KKworI2luY2x1ZGUgIkNDb2RlY0NvbmZpZy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIENDb2RlY0J1ZmZlckNoYW5uZWw7CitjbGFzcyBJbnB1dFN1cmZhY2VXcmFwcGVyOworc3RydWN0IE1lZGlhQ29kZWNJbmZvOworCitjbGFzcyBDQ29kZWMgOiBwdWJsaWMgQ29kZWNCYXNlIHsKK3B1YmxpYzoKKyAgICBDQ29kZWMoKTsKKworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlckNoYW5uZWxCYXNlPiBnZXRCdWZmZXJDaGFubmVsKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlQWxsb2NhdGVDb21wb25lbnQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZUNvbmZpZ3VyZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlQ3JlYXRlSW5wdXRTdXJmYWNlKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlU2V0SW5wdXRTdXJmYWNlKGNvbnN0IHNwPFBlcnNpc3RlbnRTdXJmYWNlPiAmc3VyZmFjZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlU3RhcnQoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTaHV0ZG93bihib29sIGtlZXBDb21wb25lbnRBbGxvY2F0ZWQgPSBmYWxzZSkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCB2b2lkIHNpZ25hbEZsdXNoKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbFJlc3VtZSgpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCB2b2lkIHNpZ25hbFNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZwYXJhbXMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbFJlcXVlc3RJRFJGcmFtZSgpIG92ZXJyaWRlOworCisgICAgdm9pZCBpbml0aWF0ZVJlbGVhc2VJZlN0dWNrKCk7CisgICAgdm9pZCBvbldvcmtEb25lKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJndvcmtJdGVtcywKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bURpc2NhcmRlZElucHV0QnVmZmVycyk7CisgICAgdm9pZCBvbklucHV0QnVmZmVyRG9uZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+JiBidWZmZXIpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+Q0NvZGVjKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHR5cGVkZWYgc3RkOjpjaHJvbm86OnRpbWVfcG9pbnQ8c3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jaz4gVGltZVBvaW50OworCisgICAgc3RhdHVzX3QgdHJ5QW5kUmVwb3J0T25FcnJvcihzdGQ6OmZ1bmN0aW9uPHN0YXR1c190KCk+IGpvYik7CisKKyAgICB2b2lkIGluaXRpYXRlU3RvcCgpOworICAgIHZvaWQgaW5pdGlhdGVSZWxlYXNlKGJvb2wgc2VuZENhbGxiYWNrID0gdHJ1ZSk7CisKKyAgICB2b2lkIGFsbG9jYXRlKGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiAmY29kZWNJbmZvKTsKKyAgICB2b2lkIGNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBzdGFydCgpOworICAgIHZvaWQgc3RvcCgpOworICAgIHZvaWQgZmx1c2goKTsKKyAgICB2b2lkIHJlbGVhc2UoYm9vbCBzZW5kQ2FsbGJhY2spOworCisgICAgdm9pZCBjcmVhdGVJbnB1dFN1cmZhY2UoKTsKKyAgICB2b2lkIHNldElucHV0U3VyZmFjZShjb25zdCBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gJnN1cmZhY2UpOworICAgIHN0YXR1c190IHNldHVwSW5wdXRTdXJmYWNlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2VXcmFwcGVyPiAmc3VyZmFjZSk7CisgICAgdm9pZCBzZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zKTsKKworICAgIHZvaWQgc2V0RGVhZGxpbmUoCisgICAgICAgICAgICBjb25zdCBUaW1lUG9pbnQgJm5vdywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgJnRpbWVvdXQsCisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKKworICAgIHZvaWQgb25Xb3JrUXVldWVkKGJvb2wgZW9zKTsKKyAgICB2b2lkIHN1YlF1ZXVlZFdvcmtDb3VudCh1aW50MzJfdCBjb3VudCk7CisKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRBbGxvY2F0ZSwKKyAgICAgICAga1doYXRDb25maWd1cmUsCisgICAgICAgIGtXaGF0U3RhcnQsCisgICAgICAgIGtXaGF0Rmx1c2gsCisgICAgICAgIGtXaGF0U3RvcCwKKyAgICAgICAga1doYXRSZWxlYXNlLAorICAgICAgICBrV2hhdENyZWF0ZUlucHV0U3VyZmFjZSwKKyAgICAgICAga1doYXRTZXRJbnB1dFN1cmZhY2UsCisgICAgICAgIGtXaGF0U2V0UGFyYW1ldGVycywKKworICAgICAgICBrV2hhdFdvcmtEb25lLAorICAgICAgICBrV2hhdFdhdGNoLAorICAgIH07CisKKyAgICBlbnVtIHsKKyAgICAgICAgUkVMRUFTRUQsCisgICAgICAgIEFMTE9DQVRFRCwKKyAgICAgICAgRkxVU0hFRCwKKyAgICAgICAgUlVOTklORywKKworICAgICAgICBBTExPQ0FUSU5HLCAgLy8gUkVMRUFTRUQgLT4gQUxMT0NBVEVECisgICAgICAgIFNUQVJUSU5HLCAgICAvLyBBTExPQ0FURUQgLT4gUlVOTklORworICAgICAgICBTVE9QUElORywgICAgLy8gUlVOTklORyAtPiBBTExPQ0FURUQKKyAgICAgICAgRkxVU0hJTkcsICAgIC8vIFJVTk5JTkcgLT4gRkxVU0hFRAorICAgICAgICBSRVNVTUlORywgICAgLy8gRkxVU0hFRCAtPiBSVU5OSU5HCisgICAgICAgIFJFTEVBU0lORywgICAvLyB7QU5ZIEVYQ0VQVCBSRUxFQVNFRH0gLT4gUkVMRUFTRUQKKyAgICB9OworCisgICAgc3RydWN0IFN0YXRlIHsKKyAgICAgICAgaW5saW5lIFN0YXRlKCkgOiBtU3RhdGUoUkVMRUFTRUQpIHt9CisgICAgICAgIGlubGluZSBpbnQgZ2V0KCkgY29uc3QgeyByZXR1cm4gbVN0YXRlOyB9CisgICAgICAgIGlubGluZSB2b2lkIHNldChpbnQgbmV3U3RhdGUpIHsgbVN0YXRlID0gbmV3U3RhdGU7IH0KKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXA7CisgICAgcHJpdmF0ZToKKyAgICAgICAgaW50IG1TdGF0ZTsKKyAgICB9OworCisgICAgc3RydWN0IE5hbWVkVGltZVBvaW50IHsKKyAgICAgICAgTmFtZWRUaW1lUG9pbnQoKSA6IG1UaW1lUG9pbnQoVGltZVBvaW50OjptYXgoKSksIG1OYW1lKCIiKSB7fQorCisgICAgICAgIGlubGluZSB2b2lkIHNldCgKKyAgICAgICAgICAgICAgICBjb25zdCBUaW1lUG9pbnQgJnRpbWVQb2ludCwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKSB7CisgICAgICAgICAgICBtVGltZVBvaW50ID0gdGltZVBvaW50OworICAgICAgICAgICAgbU5hbWUgPSBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgaW5saW5lIFRpbWVQb2ludCBnZXQoKSBjb25zdCB7IHJldHVybiBtVGltZVBvaW50OyB9CisgICAgICAgIGlubGluZSBjb25zdCBjaGFyICpnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KKyAgICBwcml2YXRlOgorICAgICAgICBUaW1lUG9pbnQgbVRpbWVQb2ludDsKKyAgICAgICAgY29uc3QgY2hhciAqbU5hbWU7CisgICAgfTsKKworICAgIE11dGV4ZWQ8U3RhdGU+IG1TdGF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q0NvZGVjQnVmZmVyQ2hhbm5lbD4gbUNoYW5uZWw7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBtQ2xpZW50TGlzdGVuZXI7CisgICAgc3RydWN0IENsaWVudExpc3RlbmVyOworCisgICAgTXV0ZXhlZDxOYW1lZFRpbWVQb2ludD4gbURlYWRsaW5lOworICAgIHN0ZDo6YXRvbWljX2ludDMyX3QgbVF1ZXVlZFdvcmtDb3VudDsKKyAgICBNdXRleGVkPE5hbWVkVGltZVBvaW50PiBtUXVldWVEZWFkbGluZTsKKyAgICBNdXRleGVkPE5hbWVkVGltZVBvaW50PiBtRW9zRGVhZGxpbmU7CisgICAgdHlwZWRlZiBDQ29kZWNDb25maWcgQ29uZmlnOworICAgIE11dGV4ZWQ8Q29uZmlnPiBtQ29uZmlnOworICAgIE11dGV4ZWQ8c3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+Pj4gbVdvcmtEb25lUXVldWU7CisgICAgTXV0ZXhlZDxzdGQ6Omxpc3Q8c2l6ZV90Pj4gbU51bURpc2NhcmRlZElucHV0QnVmZmVyc1F1ZXVlOworCisgICAgZnJpZW5kIGNsYXNzIENDb2RlY0NhbGxiYWNrSW1wbDsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENDb2RlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENfQ09ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWE5N2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuY3BwCkBAIC0wLDAgKzEsMjgyMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDQ29kZWNCdWZmZXJDaGFubmVsIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bnVtZXJpYz4KKworI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8QzJCbG9ja0ludGVybmFsLmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy9uYXRpdmUvMS4wL0lEZXNjcmFtYmxlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Db3JlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9va3VwLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CisjaW5jbHVkZSA8c3lzdGVtL3dpbmRvdy5oPgorCisjaW5jbHVkZSAiQ0NvZGVjQnVmZmVyQ2hhbm5lbC5oIgorI2luY2x1ZGUgIkNvZGVjMkJ1ZmZlci5oIgorI2luY2x1ZGUgIlNraXBDdXRCdWZmZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyBuYW1lc3BhY2UgaGFyZHdhcmU6OmNhczo6VjFfMDsKK3VzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA7CisKK3VzaW5nIENhc1N0YXR1cyA9IGhhcmR3YXJlOjpjYXM6OlYxXzA6OlN0YXR1czsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciByZXByZXNlbnRhdGlvbiBvZiBidWZmZXJzIGF0IG9uZSBwb3J0LgorICovCitjbGFzcyBDQ29kZWNCdWZmZXJDaGFubmVsOjpCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBCdWZmZXJzKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiQnVmZmVycyIpCisgICAgICAgIDogbUNvbXBvbmVudE5hbWUoY29tcG9uZW50TmFtZSksCisgICAgICAgICAgbUNoYW5uZWxOYW1lKHN0ZDo6c3RyaW5nKGNvbXBvbmVudE5hbWUpICsgIjoiICsgbmFtZSksCisgICAgICAgICAgbU5hbWUobUNoYW5uZWxOYW1lLmNfc3RyKCkpIHsKKyAgICB9CisgICAgdmlydHVhbCB+QnVmZmVycygpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIFNldCBmb3JtYXQgZm9yIE1lZGlhQ29kZWMtZmFjaW5nIGJ1ZmZlcnMuCisgICAgICovCisgICAgdm9pZCBzZXRGb3JtYXQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKKyAgICAgICAgQ0hFQ0soZm9ybWF0ICE9IG51bGxwdHIpOworICAgICAgICBtRm9ybWF0ID0gZm9ybWF0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGNvcHkgb2YgY3VycmVudCBmb3JtYXQuCisgICAgICovCisgICAgc3A8QU1lc3NhZ2U+IGR1cEZvcm1hdCgpIHsKKyAgICAgICAgcmV0dXJuIG1Gb3JtYXQgIT0gbnVsbHB0ciA/IG1Gb3JtYXQtPmR1cCgpIDogbnVsbHB0cjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGJ1ZmZlcnMgYXJlIG9wZXJhdGluZyB1bmRlciBhcnJheSBtb2RlLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBpc0FycmF5TW9kZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAvKioKKyAgICAgKiBGaWxscyB0aGUgdmVjdG9yIHdpdGggTWVkaWFDb2RlY0J1ZmZlcidzIGlmIGluIGFycmF5IG1vZGU7IG90aGVyd2lzZSwKKyAgICAgKiBuby1vcC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgZ2V0QXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqKSBjb25zdCB7fQorCitwcm90ZWN0ZWQ6CisgICAgc3RkOjpzdHJpbmcgbUNvbXBvbmVudE5hbWU7IC8vLzwgbmFtZSBvZiBjb21wb25lbnQgZm9yIGRlYnVnZ2luZworICAgIHN0ZDo6c3RyaW5nIG1DaGFubmVsTmFtZTsgLy8vPCBuYW1lIG9mIGNoYW5uZWwgZm9yIGRlYnVnZ2luZworICAgIGNvbnN0IGNoYXIgKm1OYW1lOyAvLy88IEMtc3RyaW5nIHZlcnNpb24gb2YgY2hhbm5lbCBuYW1lCisgICAgLy8gRm9ybWF0IHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIE1lZGlhQ29kZWMtZmFjaW5nIGJ1ZmZlcnMuCisgICAgc3A8QU1lc3NhZ2U+IG1Gb3JtYXQ7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQnVmZmVycyk7Cit9OworCitjbGFzcyBDQ29kZWNCdWZmZXJDaGFubmVsOjpJbnB1dEJ1ZmZlcnMgOiBwdWJsaWMgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6QnVmZmVycyB7CitwdWJsaWM6CisgICAgSW5wdXRCdWZmZXJzKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiSW5wdXRbXSIpCisgICAgICAgIDogQnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSB7IH0KKyAgICB2aXJ0dWFsIH5JbnB1dEJ1ZmZlcnMoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBibG9jayBwb29sIHRvIG9idGFpbiBpbnB1dCBtZW1vcnkgYmxvY2tzLgorICAgICAqLworICAgIHZvaWQgc2V0UG9vbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7IG1Qb29sID0gcG9vbDsgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgbmV3IE1lZGlhQ29kZWNCdWZmZXIgZm9yIGlucHV0IGFuZCBpdHMgY29ycmVzcG9uZGluZyBpbmRleC4KKyAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIG5vIG5ldyBidWZmZXIgY2FuIGJlIG9idGFpbmVkIGF0IHRoZSBtb21lbnQuCisgICAgICovCisgICAgdmlydHVhbCBib29sIHJlcXVlc3ROZXdCdWZmZXIoc2l6ZV90ICppbmRleCwgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmJ1ZmZlcikgPSAwOworCisgICAgLyoqCisgICAgICogUmVsZWFzZSB0aGUgYnVmZmVyIG9idGFpbmVkIGZyb20gcmVxdWVzdE5ld0J1ZmZlcigpIGFuZCBnZXQgdGhlCisgICAgICogYXNzb2NpYXRlZCBDMkJ1ZmZlciBvYmplY3QgYmFjay4gUmV0dXJucyB0cnVlIGlmIHRoZSBidWZmZXIgd2FzIG9uIGZpbGUKKyAgICAgKiBhbmQgcmVsZWFzZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCByZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgdGhlIGJ1ZmZlciB0aGF0IGlzIG5vIGxvbmdlciB1c2VkIGJ5IHRoZSBjb2RlYyBwcm9jZXNzLiBSZXR1cm4KKyAgICAgKiB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBidWZmZXIgd2FzIG9uIGZpbGUgYW5kIHJlbGVhc2VkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgZXhwaXJlQ29tcG9uZW50QnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYzJidWZmZXIpID0gMDsKKworICAgIC8qKgorICAgICAqIEZsdXNoIGludGVybmFsIHN0YXRlLiBBZnRlciB0aGlzIGNhbGwsIG5vIGluZGV4IG9yIGJ1ZmZlciBwcmV2aW91c2x5CisgICAgICogcmV0dXJuZWQgZnJvbSByZXF1ZXN0TmV3QnVmZmVyKCkgaXMgdmFsaWQuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIGZsdXNoKCkgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFycmF5LWJhY2tlZCB2ZXJzaW9uIG9mIGlucHV0IGJ1ZmZlcnMuIFRoZSByZXR1cm5lZCBvYmplY3QKKyAgICAgKiBzaGFsbCByZXRhaW4gdGhlIGludGVybmFsIHN0YXRlIHNvIHRoYXQgaXQgd2lsbCBob25vciBpbmRleCBhbmQKKyAgICAgKiBidWZmZXIgZnJvbSBwcmV2aW91cyBjYWxscyBvZiByZXF1ZXN0TmV3QnVmZmVyKCkuCisgICAgICovCisgICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPiB0b0FycmF5TW9kZShzaXplX3Qgc2l6ZSkgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgLy8gUG9vbCB0byBvYnRhaW4gYmxvY2tzIGZvciBpbnB1dCBidWZmZXJzLgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gbVBvb2w7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSW5wdXRCdWZmZXJzKTsKK307CisKK2NsYXNzIENDb2RlY0J1ZmZlckNoYW5uZWw6Ok91dHB1dEJ1ZmZlcnMgOiBwdWJsaWMgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6QnVmZmVycyB7CitwdWJsaWM6CisgICAgT3V0cHV0QnVmZmVycyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIk91dHB1dCIpCisgICAgICAgIDogQnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSB7IH0KKyAgICB2aXJ0dWFsIH5PdXRwdXRCdWZmZXJzKCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgb3V0cHV0IEMyQnVmZmVyIGZyb20gdGhlIGNvbXBvbmVudCBhbmQgb2J0YWluIGNvcnJlc3BvbmRpbmcKKyAgICAgKiBpbmRleCBhbmQgTWVkaWFDb2RlY0J1ZmZlciBvYmplY3QuIFJldHVybnMgZmFsc2UgaWYgcmVnaXN0cmF0aW9uCisgICAgICogZmFpbHMuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlckJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIHNpemVfdCAqaW5kZXgsCisgICAgICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqY2xpZW50QnVmZmVyKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBjb2RlYyBzcGVjaWZpYyBkYXRhIGFzIGEgYnVmZmVyIHRvIGJlIGNvbnNpc3RlbnQgd2l0aAorICAgICAqIE1lZGlhQ29kZWMgYmVoYXZpb3IuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlckNzZCgKKyAgICAgICAgICAgIGNvbnN0IEMyU3RyZWFtQ3NkSW5mbzo6b3V0cHV0ICogLyogY3NkICovLAorICAgICAgICAgICAgc2l6ZV90ICogLyogaW5kZXggKi8sCisgICAgICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqIC8qIGNsaWVudEJ1ZmZlciAqLykgPSAwOworCisgICAgLyoqCisgICAgICogUmVsZWFzZSB0aGUgYnVmZmVyIG9idGFpbmVkIGZyb20gcmVnaXN0ZXJCdWZmZXIoKSBhbmQgZ2V0IHRoZQorICAgICAqIGFzc29jaWF0ZWQgQzJCdWZmZXIgb2JqZWN0IGJhY2suIFJldHVybnMgdHJ1ZSBpZiB0aGUgYnVmZmVyIHdhcyBvbiBmaWxlCisgICAgICogYW5kIHJlbGVhc2VkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgcmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKmMyYnVmZmVyKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBGbHVzaCBpbnRlcm5hbCBzdGF0ZS4gQWZ0ZXIgdGhpcyBjYWxsLCBubyBpbmRleCBvciBidWZmZXIgcHJldmlvdXNseQorICAgICAqIHJldHVybmVkIGZyb20gcmVnaXN0ZXJCdWZmZXIoKSBpcyB2YWxpZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgZmx1c2goY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmZmx1c2hlZFdvcmspID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhcnJheS1iYWNrZWQgdmVyc2lvbiBvZiBvdXRwdXQgYnVmZmVycy4gVGhlIHJldHVybmVkIG9iamVjdAorICAgICAqIHNoYWxsIHJldGFpbiB0aGUgaW50ZXJuYWwgc3RhdGUgc28gdGhhdCBpdCB3aWxsIGhvbm9yIGluZGV4IGFuZAorICAgICAqIGJ1ZmZlciBmcm9tIHByZXZpb3VzIGNhbGxzIG9mIHJlZ2lzdGVyQnVmZmVyKCkuCisgICAgICovCisgICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8T3V0cHV0QnVmZmVycz4gdG9BcnJheU1vZGUoc2l6ZV90IHNpemUpID0gMDsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgU2tpcEN1dEJ1ZmZlciBvYmplY3QuCisgICAgICovCisgICAgdm9pZCBpbml0U2tpcEN1dEJ1ZmZlcigKKyAgICAgICAgICAgIGludDMyX3QgZGVsYXksIGludDMyX3QgcGFkZGluZywgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IGNoYW5uZWxDb3VudCkgeworICAgICAgICBDSEVDSyhtU2tpcEN1dEJ1ZmZlciA9PSBudWxscHRyKTsKKyAgICAgICAgbURlbGF5ID0gZGVsYXk7CisgICAgICAgIG1QYWRkaW5nID0gcGFkZGluZzsKKyAgICAgICAgbVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOworICAgICAgICBzZXRTa2lwQ3V0QnVmZmVyKGRlbGF5LCBwYWRkaW5nLCBjaGFubmVsQ291bnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZGF0ZSB0aGUgU2tpcEN1dEJ1ZmZlciBvYmplY3QuIE5vLW9wIGlmIGl0J3MgbmV2ZXIgaW5pdGlhbGl6ZWQuCisgICAgICovCisgICAgdm9pZCB1cGRhdGVTa2lwQ3V0QnVmZmVyKGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBjaGFubmVsQ291bnQpIHsKKyAgICAgICAgaWYgKG1Ta2lwQ3V0QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnQzMl90IGRlbGF5ID0gbURlbGF5OworICAgICAgICBpbnQzMl90IHBhZGRpbmcgPSBtUGFkZGluZzsKKyAgICAgICAgaWYgKHNhbXBsZVJhdGUgIT0gbVNhbXBsZVJhdGUpIHsKKyAgICAgICAgICAgIGRlbGF5ID0gKChpbnQ2NF90KWRlbGF5ICogc2FtcGxlUmF0ZSkgLyBtU2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIHBhZGRpbmcgPSAoKGludDY0X3QpcGFkZGluZyAqIHNhbXBsZVJhdGUpIC8gbVNhbXBsZVJhdGU7CisgICAgICAgIH0KKyAgICAgICAgc2V0U2tpcEN1dEJ1ZmZlcihkZWxheSwgcGFkZGluZywgY2hhbm5lbENvdW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdWJtaXQgYnVmZmVyIHRvIFNraXBDdXRCdWZmZXIgb2JqZWN0LCBpZiBpbml0aWFsaXplZC4KKyAgICAgKi8KKyAgICB2b2lkIHN1Ym1pdChjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgICAgIGlmIChtU2tpcEN1dEJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtU2tpcEN1dEJ1ZmZlci0+c3VibWl0KGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2ZlciBTa2lwQ3V0QnVmZmVyIG9iamVjdCB0byB0aGUgb3RoZXIgQnVmZmVycyBvYmplY3QuCisgICAgICovCisgICAgdm9pZCB0cmFuc2ZlclNraXBDdXRCdWZmZXIoY29uc3Qgc3A8U2tpcEN1dEJ1ZmZlcj4gJnNjYikgeworICAgICAgICBtU2tpcEN1dEJ1ZmZlciA9IHNjYjsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBzcDxTa2lwQ3V0QnVmZmVyPiBtU2tpcEN1dEJ1ZmZlcjsKKworcHJpdmF0ZToKKyAgICBpbnQzMl90IG1EZWxheTsKKyAgICBpbnQzMl90IG1QYWRkaW5nOworICAgIGludDMyX3QgbVNhbXBsZVJhdGU7CisKKyAgICB2b2lkIHNldFNraXBDdXRCdWZmZXIoaW50MzJfdCBza2lwLCBpbnQzMl90IGN1dCwgaW50MzJfdCBjaGFubmVsQ291bnQpIHsKKyAgICAgICAgaWYgKG1Ta2lwQ3V0QnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNpemVfdCBwcmV2U2l6ZSA9IG1Ta2lwQ3V0QnVmZmVyLT5zaXplKCk7CisgICAgICAgICAgICBpZiAocHJldlNpemUgIT0gMHUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBSZXBsYWNpbmcgU2tpcEN1dEJ1ZmZlciBob2xkaW5nICV6dSBieXRlcyIsIG1OYW1lLCBwcmV2U2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVNraXBDdXRCdWZmZXIgPSBuZXcgU2tpcEN1dEJ1ZmZlcihza2lwLCBjdXQsIGNoYW5uZWxDb3VudCk7CisgICAgfQorCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoT3V0cHV0QnVmZmVycyk7Cit9OworCituYW1lc3BhY2UgeworCisvLyBUT0RPOiBnZXQgdGhpcyBpbmZvIGZyb20gY29tcG9uZW50Citjb25zdCBzdGF0aWMgc2l6ZV90IGtNaW5JbnB1dEJ1ZmZlckFycmF5U2l6ZSA9IDQ7Citjb25zdCBzdGF0aWMgc2l6ZV90IGtNYXhQaXBlbGluZUNhcGFjaXR5ID0gMTg7Citjb25zdCBzdGF0aWMgc2l6ZV90IGtDaGFubmVsT3V0cHV0RGVsYXkgPSAwOworY29uc3Qgc3RhdGljIHNpemVfdCBrTWluT3V0cHV0QnVmZmVyQXJyYXlTaXplID0ga01heFBpcGVsaW5lQ2FwYWNpdHkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NoYW5uZWxPdXRwdXREZWxheTsKK2NvbnN0IHN0YXRpYyBzaXplX3Qga0xpbmVhckJ1ZmZlclNpemUgPSAxMDQ4NTc2OworLy8gVGhpcyBjYW4gZml0IDRLIFJHQkEgZnJhbWUsIGFuZCBtb3N0IGxpa2VseSBjbGllbnQgd29uJ3QgbmVlZCBtb3JlIHRoYW4gdGhpcy4KK2NvbnN0IHN0YXRpYyBzaXplX3Qga01heExpbmVhckJ1ZmZlclNpemUgPSAzODQwICogMjE2MCAqIDQ7CisKKy8qKgorICogU2ltcGxlIGxvY2FsIGJ1ZmZlciBwb29sIGJhY2tlZCBieSBzdGQ6OnZlY3Rvci4KKyAqLworY2xhc3MgTG9jYWxCdWZmZXJQb29sIDogcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8TG9jYWxCdWZmZXJQb29sPiB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IExvY2FsQnVmZmVyUG9vbCBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gcG9vbENhcGFjaXR5ICBtYXggdG90YWwgc2l6ZSBvZiBidWZmZXJzIG1hbmFnZWQgYnkgdGhpcyBwb29sLgorICAgICAqCisgICAgICogXHJldHVybiAgYSBuZXdseSBjcmVhdGVkIHBvb2wgb2JqZWN0LgorICAgICAqLworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8TG9jYWxCdWZmZXJQb29sPiBDcmVhdGUoc2l6ZV90IHBvb2xDYXBhY2l0eSkgeworICAgICAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPExvY2FsQnVmZmVyUG9vbD4obmV3IExvY2FsQnVmZmVyUG9vbChwb29sQ2FwYWNpdHkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gQUJ1ZmZlciBvYmplY3Qgd2hvc2Ugc2l6ZSBpcyBhdCBsZWFzdCB8Y2FwYWNpdHl8LgorICAgICAqCisgICAgICogXHBhcmFtICAgY2FwYWNpdHkgIHJlcXVlc3RlZCBjYXBhY2l0eQorICAgICAqIFxyZXR1cm4gIG51bGxwdHIgaWYgdGhlIHBvb2wgY2FwYWNpdHkgaXMgcmVhY2hlZAorICAgICAqICAgICAgICAgIGFuIEFCdWZmZXIgb2JqZWN0IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBzcDxBQnVmZmVyPiBuZXdCdWZmZXIoc2l6ZV90IGNhcGFjaXR5KSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBzdGQ6OmZpbmRfaWYoCisgICAgICAgICAgICAgICAgbVBvb2wuYmVnaW4oKSwgbVBvb2wuZW5kKCksCisgICAgICAgICAgICAgICAgW2NhcGFjaXR5XShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmdmVjKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2ZWMuY2FwYWNpdHkoKSA+PSBjYXBhY2l0eTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKGl0ICE9IG1Qb29sLmVuZCgpKSB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgVmVjdG9yQnVmZmVyKHN0ZDo6bW92ZSgqaXQpLCBzaGFyZWRfZnJvbV90aGlzKCkpOworICAgICAgICAgICAgbVBvb2wuZXJhc2UoaXQpOworICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICAgICAgfQorICAgICAgICBpZiAobVVzZWRTaXplICsgY2FwYWNpdHkgPiBtUG9vbENhcGFjaXR5KSB7CisgICAgICAgICAgICB3aGlsZSAoIW1Qb29sLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBtVXNlZFNpemUgLT0gbVBvb2wuYmFjaygpLmNhcGFjaXR5KCk7CisgICAgICAgICAgICAgICAgbVBvb2wucG9wX2JhY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtVXNlZFNpemUgKyBjYXBhY2l0eSA+IG1Qb29sQ2FwYWNpdHkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgibVVzZWRTaXplID0gJXp1LCBjYXBhY2l0eSA9ICV6dSwgbVBvb2xDYXBhY2l0eSA9ICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICBtVXNlZFNpemUsIGNhcGFjaXR5LCBtUG9vbENhcGFjaXR5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWMoY2FwYWNpdHkpOworICAgICAgICBtVXNlZFNpemUgKz0gdmVjLmNhcGFjaXR5KCk7CisgICAgICAgIHJldHVybiBuZXcgVmVjdG9yQnVmZmVyKHN0ZDo6bW92ZSh2ZWMpLCBzaGFyZWRfZnJvbV90aGlzKCkpOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBBQnVmZmVyIGJhY2tlZCBieSBzdGQ6OnZlY3Rvci4KKyAgICAgKi8KKyAgICBjbGFzcyBWZWN0b3JCdWZmZXIgOiBwdWJsaWMgOjphbmRyb2lkOjpBQnVmZmVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3QgYSBWZWN0b3JCdWZmZXIgYnkgdGFraW5nIHRoZSBvd25lcnNoaXAgb2Ygc3VwcGxpZWQgdmVjdG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gdmVjICAgYmFja2luZyB2ZWN0b3Igb2YgdGhlIGJ1ZmZlci4gdGhpcyBvYmplY3QgdGFrZXMKKyAgICAgICAgICogICAgICAgICAgICAgIG93bmVyc2hpcCBhdCBjb25zdHJ1Y3Rpb24uCisgICAgICAgICAqIFxwYXJhbSBwb29sICBhIExvY2FsQnVmZmVyUG9vbCBvYmplY3QgdG8gcmV0dXJuIHRoZSB2ZWN0b3IgYXQKKyAgICAgICAgICogICAgICAgICAgICAgIGRlc3RydWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgVmVjdG9yQnVmZmVyKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICYmdmVjLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TG9jYWxCdWZmZXJQb29sPiAmcG9vbCkKKyAgICAgICAgICAgIDogQUJ1ZmZlcih2ZWMuZGF0YSgpLCB2ZWMuY2FwYWNpdHkoKSksCisgICAgICAgICAgICAgIG1WZWMoc3RkOjptb3ZlKHZlYykpLAorICAgICAgICAgICAgICBtUG9vbChwb29sKSB7CisgICAgICAgIH0KKworICAgICAgICB+VmVjdG9yQnVmZmVyKCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPExvY2FsQnVmZmVyUG9vbD4gcG9vbCA9IG1Qb29sLmxvY2soKTsKKyAgICAgICAgICAgIGlmIChwb29sKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgcG9vbCBpcyBhbGl2ZSwgcmV0dXJuIHRoZSB2ZWN0b3IgYmFjayB0byB0aGUgcG9vbCBzbyB0aGF0CisgICAgICAgICAgICAgICAgLy8gaXQgY2FuIGJlIHJlY3ljbGVkLgorICAgICAgICAgICAgICAgIHBvb2wtPnJldHVyblZlY3RvcihzdGQ6Om1vdmUobVZlYykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtVmVjOworICAgICAgICBzdGQ6OndlYWtfcHRyPExvY2FsQnVmZmVyUG9vbD4gbVBvb2w7CisgICAgfTsKKworICAgIE11dGV4IG1NdXRleDsKKyAgICBzaXplX3QgbVBvb2xDYXBhY2l0eTsKKyAgICBzaXplX3QgbVVzZWRTaXplOworICAgIHN0ZDo6bGlzdDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gbVBvb2w7CisKKyAgICAvKioKKyAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgY29uc3RydWN0aW5nIG5vbi1tYW5hZ2VkIExvY2FsQnVmZmVyUG9vbC4KKyAgICAgKi8KKyAgICBleHBsaWNpdCBMb2NhbEJ1ZmZlclBvb2woc2l6ZV90IHBvb2xDYXBhY2l0eSkKKyAgICAgICAgOiBtUG9vbENhcGFjaXR5KHBvb2xDYXBhY2l0eSksIG1Vc2VkU2l6ZSgwKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGFrZSBiYWNrIHRoZSBvd25lcnNoaXAgb2YgdmVjIGZyb20gdGhlIGRlc3RydWN0ZWQgVmVjdG9yQnVmZmVyIGFuZCBwdXQKKyAgICAgKiBpdCBpbiBmcm9udCBvZiB0aGUgcG9vbC4KKyAgICAgKi8KKyAgICB2b2lkIHJldHVyblZlY3RvcihzdGQ6OnZlY3Rvcjx1aW50OF90PiAmJnZlYykgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOworICAgICAgICBtUG9vbC5wdXNoX2Zyb250KHN0ZDo6bW92ZSh2ZWMpKTsKKyAgICB9CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhMb2NhbEJ1ZmZlclBvb2wpOworfTsKKworc3A8R3JhcGhpY0Jsb2NrQnVmZmVyPiBBbGxvY2F0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICB1aW50MzJfdCBwaXhlbEZvcm1hdCwKKyAgICAgICAgY29uc3QgQzJNZW1vcnlVc2FnZSAmdXNhZ2UsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMb2NhbEJ1ZmZlclBvb2w+ICZsb2NhbEJ1ZmZlclBvb2wpIHsKKyAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgaWYgKCFmb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpIHx8ICFmb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpIHsKKyAgICAgICAgQUxPR0QoImZvcm1hdCBsYWNrcyB3aWR0aCBvciBoZWlnaHQiKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jazsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHBpeGVsRm9ybWF0LCB1c2FnZSwgJmJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJmZXRjaCBncmFwaGljIGJsb2NrIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gR3JhcGhpY0Jsb2NrQnVmZmVyOjpBbGxvY2F0ZSgKKyAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgIGJsb2NrLAorICAgICAgICAgICAgW2xvY2FsQnVmZmVyUG9vbF0oc2l6ZV90IGNhcGFjaXR5KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsQnVmZmVyUG9vbC0+bmV3QnVmZmVyKGNhcGFjaXR5KTsKKyAgICAgICAgICAgIH0pOworfQorCitjbGFzcyBCdWZmZXJzQXJyYXlJbXBsOworCisvKioKKyAqIEZsZXhpYmxlIGJ1ZmZlciBzbG90cyBpbXBsZW1lbnRhdGlvbi4KKyAqLworY2xhc3MgRmxleEJ1ZmZlcnNJbXBsIHsKK3B1YmxpYzoKKyAgICBGbGV4QnVmZmVyc0ltcGwoY29uc3QgY2hhciAqbmFtZSkKKyAgICAgICAgOiBtSW1wbE5hbWUoc3RkOjpzdHJpbmcobmFtZSkgKyAiLkltcGwiKSwKKyAgICAgICAgICBtTmFtZShtSW1wbE5hbWUuY19zdHIoKSkgeyB9CisKKyAgICAvKioKKyAgICAgKiBBc3NpZ24gYW4gZW1wdHkgc2xvdCBmb3IgYSBidWZmZXIgYW5kIHJldHVybiB0aGUgaW5kZXguIElmIHRoZXJlJ3Mgbm8KKyAgICAgKiBlbXB0eSBzbG90LCBqdXN0IGFkZCBvbmUgYXQgdGhlIGVuZCBhbmQgcmV0dXJuIGl0LgorICAgICAqCisgICAgICogXHBhcmFtIGJ1ZmZlcltpbl0gIGEgbmV3IGJ1ZmZlciB0byBhc3NpZ24gYSBzbG90LgorICAgICAqIFxyZXR1cm4gICAgICAgICAgICBpbmRleCBvZiB0aGUgYXNzaWduZWQgc2xvdC4KKyAgICAgKi8KKyAgICBzaXplX3QgYXNzaWduU2xvdChjb25zdCBzcDxDb2RlYzJCdWZmZXI+ICZidWZmZXIpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKG1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlciA9PSBudWxscHRyCisgICAgICAgICAgICAgICAgICAgICYmIG1CdWZmZXJzW2ldLmNvbXBCdWZmZXIuZXhwaXJlZCgpKSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0uY2xpZW50QnVmZmVyID0gYnVmZmVyOworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1CdWZmZXJzLnB1c2hfYmFjayh7IGJ1ZmZlciwgc3RkOjp3ZWFrX3B0cjxDMkJ1ZmZlcj4oKSB9KTsKKyAgICAgICAgcmV0dXJuIG1CdWZmZXJzLnNpemUoKSAtIDE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVsZWFzZSB0aGUgc2xvdCBmcm9tIHRoZSBjbGllbnQsIGFuZCBnZXQgdGhlIEMyQnVmZmVyIG9iamVjdCBiYWNrIGZyb20KKyAgICAgKiB0aGUgcHJldmlvdXNseSBhc3NpZ25lZCBidWZmZXIuIE5vdGUgdGhhdCB0aGUgc2xvdCBpcyBub3QgY29tcGxldGVseSBmcmVlCisgICAgICogdW50aWwgdGhlIHJldHVybmVkIEMyQnVmZmVyIG9iamVjdCBpcyBmcmVlZC4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGJ1ZmZlcltpbl0gICAgICAgIHRoZSBidWZmZXIgcHJldmlvdXNseSBhc3NpZ25lZCBhIHNsb3QuCisgICAgICogXHBhcmFtICAgYzJidWZmZXJbaW4sb3V0XSAgcG9pbnRlciB0byBDMkJ1ZmZlciB0byBiZSBwb3B1bGF0ZWQuIElnbm9yZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBudWxsLgorICAgICAqIFxyZXR1cm4gIHRydWUgIGlmIHRoZSBidWZmZXIgaXMgc3VjY2Vzc2Z1bGx5IHJlbGVhc2VkIGZyb20gYSBzbG90CisgICAgICogICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgYm9vbCByZWxlYXNlU2xvdChjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlcikgeworICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IGNsaWVudEJ1ZmZlcjsKKyAgICAgICAgc2l6ZV90IGluZGV4ID0gbUJ1ZmZlcnMuc2l6ZSgpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1CdWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAobUJ1ZmZlcnNbaV0uY2xpZW50QnVmZmVyID09IGJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGNsaWVudEJ1ZmZlciA9IG1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc1tpXS5jbGllbnRCdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBpbmRleCA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNsaWVudEJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HVigiWyVzXSAlczogTm8gbWF0Y2hpbmcgYnVmZmVyIGZvdW5kIiwgbU5hbWUsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IHJlc3VsdCA9IGNsaWVudEJ1ZmZlci0+YXNDMkJ1ZmZlcigpOworICAgICAgICBtQnVmZmVyc1tpbmRleF0uY29tcEJ1ZmZlciA9IHJlc3VsdDsKKyAgICAgICAgaWYgKGMyYnVmZmVyKSB7CisgICAgICAgICAgICAqYzJidWZmZXIgPSByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCBleHBpcmVDb21wb25lbnRCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYzJidWZmZXIpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjb21wQnVmZmVyID0KKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0uY29tcEJ1ZmZlci5sb2NrKCk7CisgICAgICAgICAgICBpZiAoIWNvbXBCdWZmZXIgfHwgY29tcEJ1ZmZlciAhPSBjMmJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJ1ZmZlcnNbaV0uY2xpZW50QnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1CdWZmZXJzW2ldLmNvbXBCdWZmZXIucmVzZXQoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJbJXNdIGNvZGVjIHJlbGVhc2VkIGFuIHVua25vd24gYnVmZmVyIiwgbU5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCBmbHVzaCgpIHsKKyAgICAgICAgQUxPR1YoIlslc10gYnVmZmVycyBhcmUgZmx1c2hlZCAlenUiLCBtTmFtZSwgbUJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICAgICAgbUJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEJ1ZmZlcnNBcnJheUltcGw7CisKKyAgICBzdGQ6OnN0cmluZyBtSW1wbE5hbWU7IC8vLzwgbmFtZSBmb3IgZGVidWdnaW5nCisgICAgY29uc3QgY2hhciAqbU5hbWU7IC8vLzwgQy1zdHJpbmcgdmVyc2lvbiBvZiBuYW1lCisKKyAgICBzdHJ1Y3QgRW50cnkgeworICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IGNsaWVudEJ1ZmZlcjsKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxDMkJ1ZmZlcj4gY29tcEJ1ZmZlcjsKKyAgICB9OworICAgIHN0ZDo6dmVjdG9yPEVudHJ5PiBtQnVmZmVyczsKK307CisKKy8qKgorICogU3RhdGljIGJ1ZmZlciBzbG90cyBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBhIGZpeGVkLXNpemUgYXJyYXkuCisgKi8KK2NsYXNzIEJ1ZmZlcnNBcnJheUltcGwgeworcHVibGljOgorICAgIEJ1ZmZlcnNBcnJheUltcGwoKQorICAgICAgICA6IG1JbXBsTmFtZSgiQnVmZmVyc0FycmF5SW1wbCIpLAorICAgICAgICAgIG1OYW1lKG1JbXBsTmFtZS5jX3N0cigpKSB7IH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgYnVmZmVyIGFycmF5IGZyb20gdGhlIG9yaWdpbmFsIHxpbXBsfC4gVGhlIGJ1ZmZlcnMga25vd24gYnkKKyAgICAgKiB0aGUgY2xpZW50IGlzIHByZXNlcnZlZCwgYW5kIHRoZSBlbXB0eSBzbG90cyBhcmUgcG9wdWxhdGVkIHNvIHRoYXQgdGhlCisgICAgICogYXJyYXkgc2l6ZSBpcyBhdCBsZWFzdCB8bWluU2l6ZXwuCisgICAgICoKKyAgICAgKiBccGFyYW0gaW1wbFtpbl0gICAgICBGbGV4QnVmZmVyc0ltcGwgb2JqZWN0IHVzZWQgc28gZmFyLgorICAgICAqIFxwYXJhbSBtaW5TaXplW2luXSAgIG1pbmltdW0gc2l6ZSBvZiB0aGUgYnVmZmVyIGFycmF5LgorICAgICAqIFxwYXJhbSBhbGxvY2F0ZVtpbl0gIGZ1bmN0aW9uIHRvIGFsbG9jYXRlIGEgY2xpZW50IGJ1ZmZlciBmb3IgYW4gZW1wdHkgc2xvdC4KKyAgICAgKi8KKyAgICB2b2lkIGluaXRpYWxpemUoCisgICAgICAgICAgICBjb25zdCBGbGV4QnVmZmVyc0ltcGwgJmltcGwsCisgICAgICAgICAgICBzaXplX3QgbWluU2l6ZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3A8Q29kZWMyQnVmZmVyPigpPiBhbGxvY2F0ZSkgeworICAgICAgICBtSW1wbE5hbWUgPSBpbXBsLm1JbXBsTmFtZSArICJbTl0iOworICAgICAgICBtTmFtZSA9IG1JbXBsTmFtZS5jX3N0cigpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGltcGwubUJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gY2xpZW50QnVmZmVyID0gaW1wbC5tQnVmZmVyc1tpXS5jbGllbnRCdWZmZXI7CisgICAgICAgICAgICBib29sIG93bmVkQnlDbGllbnQgPSAoY2xpZW50QnVmZmVyICE9IG51bGxwdHIpOworICAgICAgICAgICAgaWYgKCFvd25lZEJ5Q2xpZW50KSB7CisgICAgICAgICAgICAgICAgY2xpZW50QnVmZmVyID0gYWxsb2NhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CdWZmZXJzLnB1c2hfYmFjayh7IGNsaWVudEJ1ZmZlciwgaW1wbC5tQnVmZmVyc1tpXS5jb21wQnVmZmVyLCBvd25lZEJ5Q2xpZW50IH0pOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJbJXNdIGNvbnZlcnRlZCAlenUgYnVmZmVycyB0byBhcnJheSBtb2RlIG9mICV6dSIsIG1OYW1lLCBtQnVmZmVycy5zaXplKCksIG1pblNpemUpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gaW1wbC5tQnVmZmVycy5zaXplKCk7IGkgPCBtaW5TaXplOyArK2kpIHsKKyAgICAgICAgICAgIG1CdWZmZXJzLnB1c2hfYmFjayh7IGFsbG9jYXRlKCksIHN0ZDo6d2Vha19wdHI8QzJCdWZmZXI+KCksIGZhbHNlIH0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR3JhYiBhIGJ1ZmZlciBmcm9tIHRoZSB1bmRlcmx5aW5nIGFycmF5IHdoaWNoIG1hdGNoZXMgdGhlIGNyaXRlcmlhLgorICAgICAqCisgICAgICogXHBhcmFtIGluZGV4W291dF0gICAgaW5kZXggb2YgdGhlIHNsb3QuCisgICAgICogXHBhcmFtIGJ1ZmZlcltvdXRdICAgdGhlIG1hdGNoaW5nIGJ1ZmZlci4KKyAgICAgKiBccGFyYW0gbWF0Y2hbaW5dICAgICBhIGZ1bmN0aW9uIHRvIHRlc3Qgd2hldGhlciB0aGUgYnVmZmVyIG1hdGNoZXMgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgY3JpdGVyaWEgb3Igbm90LgorICAgICAqIFxyZXR1cm4gT0sgICAgICAgICAgIGlmIHN1Y2Nlc3NmdWwsCisgICAgICogICAgICAgICBXT1VMRF9CTE9DSyAgaWYgc2xvdHMgYXJlIGJlaW5nIHVzZWQsCisgICAgICogICAgICAgICBOT19NRU1PUlkgICAgaWYgbm8gc2xvdCBtYXRjaGVzIHRoZSBjcml0ZXJpYSwgZXZlbiB0aG91Z2ggaXQncworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZQorICAgICAqLworICAgIHN0YXR1c190IGdyYWJCdWZmZXIoCisgICAgICAgICAgICBzaXplX3QgKmluZGV4LAorICAgICAgICAgICAgc3A8Q29kZWMyQnVmZmVyPiAqYnVmZmVyLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IHNwPENvZGVjMkJ1ZmZlcj4gJik+IG1hdGNoID0KKyAgICAgICAgICAgICAgICBbXShjb25zdCBzcDxDb2RlYzJCdWZmZXI+ICYpIHsgcmV0dXJuIHRydWU7IH0pIHsKKyAgICAgICAgLy8gYWxsQnVmZmVyc0RvbnRNYXRjaCByZW1haW5zIHRydWUgaWYgYWxsIGJ1ZmZlcnMgYXJlIGF2YWlsYWJsZSBidXQKKyAgICAgICAgLy8gbWF0Y2goKSByZXR1cm5zIGZhbHNlIGZvciBldmVyeSBidWZmZXIuCisgICAgICAgIGJvb2wgYWxsQnVmZmVyc0RvbnRNYXRjaCA9IHRydWU7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGlmICghbUJ1ZmZlcnNbaV0ub3duZWRCeUNsaWVudCAmJiBtQnVmZmVyc1tpXS5jb21wQnVmZmVyLmV4cGlyZWQoKSkgeworICAgICAgICAgICAgICAgIGlmIChtYXRjaChtQnVmZmVyc1tpXS5jbGllbnRCdWZmZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJzW2ldLm93bmVkQnlDbGllbnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gbUJ1ZmZlcnNbaV0uY2xpZW50QnVmZmVyOworICAgICAgICAgICAgICAgICAgICAoKmJ1ZmZlciktPm1ldGEoKS0+Y2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgKCpidWZmZXIpLT5zZXRSYW5nZSgwLCAoKmJ1ZmZlciktPmNhcGFjaXR5KCkpOworICAgICAgICAgICAgICAgICAgICAqaW5kZXggPSBpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhbGxCdWZmZXJzRG9udE1hdGNoID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFsbEJ1ZmZlcnNEb250TWF0Y2ggPyBOT19NRU1PUlkgOiBXT1VMRF9CTE9DSzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGJ1ZmZlciBmcm9tIHRoZSBjbGllbnQsIGFuZCBnZXQgdGhlIEMyQnVmZmVyIG9iamVjdCBiYWNrIGZyb20KKyAgICAgKiB0aGUgYnVmZmVyLiBOb3RlIHRoYXQgdGhlIHNsb3QgaXMgbm90IGNvbXBsZXRlbHkgZnJlZSB1bnRpbCB0aGUgcmV0dXJuZWQKKyAgICAgKiBDMkJ1ZmZlciBvYmplY3QgaXMgZnJlZWQuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBidWZmZXJbaW5dICAgICAgICB0aGUgYnVmZmVyIHByZXZpb3VzbHkgZ3JhYmJlZC4KKyAgICAgKiBccGFyYW0gICBjMmJ1ZmZlcltpbixvdXRdICBwb2ludGVyIHRvIEMyQnVmZmVyIHRvIGJlIHBvcHVsYXRlZC4gSWdub3JlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG51bGwuCisgICAgICogXHJldHVybiAgdHJ1ZSAgaWYgdGhlIGJ1ZmZlciBpcyBzdWNjZXNzZnVsbHkgcmV0dXJuZWQKKyAgICAgKiAgICAgICAgICBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBib29sIHJldHVybkJ1ZmZlcihjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlcikgeworICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IGNsaWVudEJ1ZmZlcjsKKyAgICAgICAgc2l6ZV90IGluZGV4ID0gbUJ1ZmZlcnMuc2l6ZSgpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1CdWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAobUJ1ZmZlcnNbaV0uY2xpZW50QnVmZmVyID09IGJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGlmICghbUJ1ZmZlcnNbaV0ub3duZWRCeUNsaWVudCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBDbGllbnQgcmV0dXJuZWQgYSBidWZmZXIgaXQgZG9lcyBub3Qgb3duIGFjY29yZGluZyB0byBvdXIgcmVjb3JkOiAlenUiLCBtTmFtZSwgaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNsaWVudEJ1ZmZlciA9IG1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc1tpXS5vd25lZEJ5Q2xpZW50ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjbGllbnRCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR1YoIlslc10gJXM6IE5vIG1hdGNoaW5nIGJ1ZmZlciBmb3VuZCIsIG1OYW1lLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIlslc10gJXM6IG1hdGNoaW5nIGJ1ZmZlciBmb3VuZCAoaW5kZXg9JXp1KSIsIG1OYW1lLCBfX2Z1bmNfXywgaW5kZXgpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IHJlc3VsdCA9IGNsaWVudEJ1ZmZlci0+YXNDMkJ1ZmZlcigpOworICAgICAgICBtQnVmZmVyc1tpbmRleF0uY29tcEJ1ZmZlciA9IHJlc3VsdDsKKyAgICAgICAgaWYgKGMyYnVmZmVyKSB7CisgICAgICAgICAgICAqYzJidWZmZXIgPSByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCBleHBpcmVDb21wb25lbnRCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYzJidWZmZXIpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjb21wQnVmZmVyID0KKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0uY29tcEJ1ZmZlci5sb2NrKCk7CisgICAgICAgICAgICBpZiAoIWNvbXBCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjMmJ1ZmZlciA9PSBjb21wQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgaWYgKG1CdWZmZXJzW2ldLm93bmVkQnlDbGllbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gY29kZWMgcmVsZWFzZWQgYSBidWZmZXIgb3duZWQgYnkgY2xpZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIihpbmRleCAlenUpIiwgbU5hbWUsIGkpOworICAgICAgICAgICAgICAgICAgICBtQnVmZmVyc1tpXS5vd25lZEJ5Q2xpZW50ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1CdWZmZXJzW2ldLmNvbXBCdWZmZXIucmVzZXQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVigiWyVzXSBjb2RlYyByZWxlYXNlZCBhbiB1bmtub3duIGJ1ZmZlciAoYXJyYXkgbW9kZSkiLCBtTmFtZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQb3B1bGF0ZSB8YXJyYXl8IHdpdGggdGhlIHVuZGVybHlpbmcgYnVmZmVyIGFycmF5LgorICAgICAqCisgICAgICogXHBhcmFtIGFycmF5W291dF0gIGFuIGFycmF5IHRvIGJlIGZpbGxlZCB3aXRoIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlciBhcnJheS4KKyAgICAgKi8KKyAgICB2b2lkIGdldEFycmF5KFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmFycmF5KSBjb25zdCB7CisgICAgICAgIGFycmF5LT5jbGVhcigpOworICAgICAgICBmb3IgKGNvbnN0IEVudHJ5ICZlbnRyeSA6IG1CdWZmZXJzKSB7CisgICAgICAgICAgICBhcnJheS0+cHVzaChlbnRyeS5jbGllbnRCdWZmZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGNsaWVudCBhYmFuZG9uZWQgYWxsIGtub3duIGJ1ZmZlcnMsIHNvIHJlY2xhaW0gdGhlIG93bmVyc2hpcC4KKyAgICAgKi8KKyAgICB2b2lkIGZsdXNoKCkgeworICAgICAgICBmb3IgKEVudHJ5ICZlbnRyeSA6IG1CdWZmZXJzKSB7CisgICAgICAgICAgICBlbnRyeS5vd25lZEJ5Q2xpZW50ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHJlYWxsb2Moc3RkOjpmdW5jdGlvbjxzcDxDb2RlYzJCdWZmZXI+KCk+IGFsbG9jKSB7CisgICAgICAgIHNpemVfdCBzaXplID0gbUJ1ZmZlcnMuc2l6ZSgpOworICAgICAgICBtQnVmZmVycy5jbGVhcigpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICAgICAgbUJ1ZmZlcnMucHVzaF9iYWNrKHsgYWxsb2MoKSwgc3RkOjp3ZWFrX3B0cjxDMkJ1ZmZlcj4oKSwgZmFsc2UgfSk7CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzdHJpbmcgbUltcGxOYW1lOyAvLy88IG5hbWUgZm9yIGRlYnVnZ2luZworICAgIGNvbnN0IGNoYXIgKm1OYW1lOyAvLy88IEMtc3RyaW5nIHZlcnNpb24gb2YgbmFtZQorCisgICAgc3RydWN0IEVudHJ5IHsKKyAgICAgICAgY29uc3Qgc3A8Q29kZWMyQnVmZmVyPiBjbGllbnRCdWZmZXI7CisgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJCdWZmZXI+IGNvbXBCdWZmZXI7CisgICAgICAgIGJvb2wgb3duZWRCeUNsaWVudDsKKyAgICB9OworICAgIHN0ZDo6dmVjdG9yPEVudHJ5PiBtQnVmZmVyczsKK307CisKK2NsYXNzIElucHV0QnVmZmVyc0FycmF5IDogcHVibGljIENDb2RlY0J1ZmZlckNoYW5uZWw6OklucHV0QnVmZmVycyB7CitwdWJsaWM6CisgICAgSW5wdXRCdWZmZXJzQXJyYXkoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICJJbnB1dFtOXSIpCisgICAgICAgIDogSW5wdXRCdWZmZXJzKGNvbXBvbmVudE5hbWUsIG5hbWUpIHsgfQorICAgIH5JbnB1dEJ1ZmZlcnNBcnJheSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZvaWQgaW5pdGlhbGl6ZSgKKyAgICAgICAgICAgIGNvbnN0IEZsZXhCdWZmZXJzSW1wbCAmaW1wbCwKKyAgICAgICAgICAgIHNpemVfdCBtaW5TaXplLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxDb2RlYzJCdWZmZXI+KCk+IGFsbG9jYXRlKSB7CisgICAgICAgIG1JbXBsLmluaXRpYWxpemUoaW1wbCwgbWluU2l6ZSwgYWxsb2NhdGUpOworICAgIH0KKworICAgIGJvb2wgaXNBcnJheU1vZGUoKSBjb25zdCBmaW5hbCB7IHJldHVybiB0cnVlOyB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0NvZGVjQnVmZmVyQ2hhbm5lbDo6SW5wdXRCdWZmZXJzPiB0b0FycmF5TW9kZSgKKyAgICAgICAgICAgIHNpemVfdCkgZmluYWwgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICB2b2lkIGdldEFycmF5KFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmFycmF5KSBjb25zdCBmaW5hbCB7CisgICAgICAgIG1JbXBsLmdldEFycmF5KGFycmF5KTsKKyAgICB9CisKKyAgICBib29sIHJlcXVlc3ROZXdCdWZmZXIoc2l6ZV90ICppbmRleCwgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IGMyQnVmZmVyOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtSW1wbC5ncmFiQnVmZmVyKGluZGV4LCAmYzJCdWZmZXIpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICBjMkJ1ZmZlci0+c2V0Rm9ybWF0KG1Gb3JtYXQpOworICAgICAgICAgICAgKmJ1ZmZlciA9IGMyQnVmZmVyOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgcmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKmMyYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC5yZXR1cm5CdWZmZXIoYnVmZmVyLCBjMmJ1ZmZlcik7CisgICAgfQorCisgICAgYm9vbCBleHBpcmVDb21wb25lbnRCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwuZXhwaXJlQ29tcG9uZW50QnVmZmVyKGMyYnVmZmVyKTsKKyAgICB9CisKKyAgICB2b2lkIGZsdXNoKCkgb3ZlcnJpZGUgeworICAgICAgICBtSW1wbC5mbHVzaCgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBCdWZmZXJzQXJyYXlJbXBsIG1JbXBsOworfTsKKworY2xhc3MgTGluZWFySW5wdXRCdWZmZXJzIDogcHVibGljIENDb2RlY0J1ZmZlckNoYW5uZWw6OklucHV0QnVmZmVycyB7CitwdWJsaWM6CisgICAgTGluZWFySW5wdXRCdWZmZXJzKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiMUQtSW5wdXQiKQorICAgICAgICA6IElucHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSwKKyAgICAgICAgICBtSW1wbChtTmFtZSkgeyB9CisKKyAgICBib29sIHJlcXVlc3ROZXdCdWZmZXIoc2l6ZV90ICppbmRleCwgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICBpbnQzMl90IGNhcGFjaXR5ID0ga0xpbmVhckJ1ZmZlclNpemU7CisgICAgICAgICh2b2lkKW1Gb3JtYXQtPmZpbmRJbnQzMihLRVlfTUFYX0lOUFVUX1NJWkUsICZjYXBhY2l0eSk7CisgICAgICAgIGlmICgoc2l6ZV90KWNhcGFjaXR5ID4ga01heExpbmVhckJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgIEFMT0dEKCJjbGllbnQgcmVxdWVzdGVkICVkLCBjYXBwZWQgdG8gJXp1IiwgY2FwYWNpdHksIGtNYXhMaW5lYXJCdWZmZXJTaXplKTsKKyAgICAgICAgICAgIGNhcGFjaXR5ID0ga01heExpbmVhckJ1ZmZlclNpemU7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETzogcHJvcGVyIG1heCBpbnB1dCBzaXplCisgICAgICAgIC8vIFRPRE86IHJlYWQgdXNhZ2UgZnJvbSBpbnRmCisgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gbmV3QnVmZmVyID0gYWxsb2MoKHNpemVfdCljYXBhY2l0eSk7CisgICAgICAgIGlmIChuZXdCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgICppbmRleCA9IG1JbXBsLmFzc2lnblNsb3QobmV3QnVmZmVyKTsKKyAgICAgICAgKmJ1ZmZlciA9IG5ld0J1ZmZlcjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCByZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLnJlbGVhc2VTbG90KGJ1ZmZlciwgYzJidWZmZXIpOworICAgIH0KKworICAgIGJvb2wgZXhwaXJlQ29tcG9uZW50QnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYzJidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLmV4cGlyZUNvbXBvbmVudEJ1ZmZlcihjMmJ1ZmZlcik7CisgICAgfQorCisgICAgdm9pZCBmbHVzaCgpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVGhpcyBpcyBuby1vcCBieSBkZWZhdWx0IHVubGVzcyB3ZSdyZSBpbiBhcnJheSBtb2RlIHdoZXJlIHdlIG5lZWQgdG8ga2VlcAorICAgICAgICAvLyB0cmFjayBvZiB0aGUgZmx1c2hlZCB3b3JrLgorICAgICAgICBtSW1wbC5mbHVzaCgpOworICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNCdWZmZXJDaGFubmVsOjpJbnB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKAorICAgICAgICAgICAgc2l6ZV90IHNpemUpIGZpbmFsIHsKKyAgICAgICAgaW50MzJfdCBjYXBhY2l0eSA9IGtMaW5lYXJCdWZmZXJTaXplOworICAgICAgICAodm9pZCltRm9ybWF0LT5maW5kSW50MzIoS0VZX01BWF9JTlBVVF9TSVpFLCAmY2FwYWNpdHkpOworICAgICAgICBpZiAoKHNpemVfdCljYXBhY2l0eSA+IGtNYXhMaW5lYXJCdWZmZXJTaXplKSB7CisgICAgICAgICAgICBBTE9HRCgiY2xpZW50IHJlcXVlc3RlZCAlZCwgY2FwcGVkIHRvICV6dSIsIGNhcGFjaXR5LCBrTWF4TGluZWFyQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBjYXBhY2l0eSA9IGtNYXhMaW5lYXJCdWZmZXJTaXplOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IHByb3BlciBtYXggaW5wdXQgc2l6ZQorICAgICAgICAvLyBUT0RPOiByZWFkIHVzYWdlIGZyb20gaW50ZgorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzQXJyYXk+IGFycmF5KAorICAgICAgICAgICAgICAgIG5ldyBJbnB1dEJ1ZmZlcnNBcnJheShtQ29tcG9uZW50TmFtZS5jX3N0cigpLCAiMUQtSW5wdXRbTl0iKSk7CisgICAgICAgIGFycmF5LT5zZXRQb29sKG1Qb29sKTsKKyAgICAgICAgYXJyYXktPnNldEZvcm1hdChtRm9ybWF0KTsKKyAgICAgICAgYXJyYXktPmluaXRpYWxpemUoCisgICAgICAgICAgICAgICAgbUltcGwsCisgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICBbdGhpcywgY2FwYWNpdHldICgpIC0+IHNwPENvZGVjMkJ1ZmZlcj4geyByZXR1cm4gYWxsb2MoY2FwYWNpdHkpOyB9KTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bW92ZShhcnJheSk7CisgICAgfQorCisgICAgdmlydHVhbCBzcDxDb2RlYzJCdWZmZXI+IGFsbG9jKHNpemVfdCBzaXplKSBjb25zdCB7CisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworCisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1Qb29sLT5mZXRjaExpbmVhckJsb2NrKHNpemUsIHVzYWdlLCAmYmxvY2spOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBMaW5lYXJCbG9ja0J1ZmZlcjo6QWxsb2NhdGUobUZvcm1hdCwgYmxvY2spOworICAgIH0KKworcHJpdmF0ZToKKyAgICBGbGV4QnVmZmVyc0ltcGwgbUltcGw7Cit9OworCitjbGFzcyBFbmNyeXB0ZWRMaW5lYXJJbnB1dEJ1ZmZlcnMgOiBwdWJsaWMgTGluZWFySW5wdXRCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBFbmNyeXB0ZWRMaW5lYXJJbnB1dEJ1ZmZlcnMoCisgICAgICAgICAgICBib29sIHNlY3VyZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lbW9yeURlYWxlcj4gJmRlYWxlciwKKyAgICAgICAgICAgIGNvbnN0IHNwPElDcnlwdG8+ICZjcnlwdG8sCisgICAgICAgICAgICBpbnQzMl90IGhlYXBTZXFOdW0sCisgICAgICAgICAgICBzaXplX3QgY2FwYWNpdHksCisgICAgICAgICAgICBjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIkVuY3J5cHRlZElucHV0IikKKyAgICAgICAgOiBMaW5lYXJJbnB1dEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSksCisgICAgICAgICAgbVVzYWdlKHswLCAwfSksCisgICAgICAgICAgbURlYWxlcihkZWFsZXIpLAorICAgICAgICAgIG1DcnlwdG8oY3J5cHRvKSwKKyAgICAgICAgICBtSGVhcFNlcU51bShoZWFwU2VxTnVtKSB7CisgICAgICAgIGlmIChzZWN1cmUpIHsKKyAgICAgICAgICAgIG1Vc2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6UkVBRF9QUk9URUNURUQsIDAgfTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Vc2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01pbklucHV0QnVmZmVyQXJyYXlTaXplOyArK2kpIHsKKyAgICAgICAgICAgIHNwPElNZW1vcnk+IG1lbW9yeSA9IG1EZWFsZXItPmFsbG9jYXRlKGNhcGFjaXR5KTsKKyAgICAgICAgICAgIGlmIChtZW1vcnkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZnJvbSBkZWFsZXI6IG9ubHkgJXp1IHNsb3RzIGFsbG9jYXRlZCIsIG1OYW1lLCBpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1NZW1vcnlWZWN0b3IucHVzaF9iYWNrKHtzdGQ6OndlYWtfcHRyPEMyTGluZWFyQmxvY2s+KCksIG1lbW9yeX0pOworICAgICAgICB9CisgICAgfQorCisgICAgfkVuY3J5cHRlZExpbmVhcklucHV0QnVmZmVycygpIG92ZXJyaWRlIHsKKyAgICB9CisKKyAgICBzcDxDb2RlYzJCdWZmZXI+IGFsbG9jKHNpemVfdCBzaXplKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHNwPElNZW1vcnk+IG1lbW9yeTsKKyAgICAgICAgZm9yIChjb25zdCBFbnRyeSAmZW50cnkgOiBtTWVtb3J5VmVjdG9yKSB7CisgICAgICAgICAgICBpZiAoZW50cnkuYmxvY2suZXhwaXJlZCgpKSB7CisgICAgICAgICAgICAgICAgbWVtb3J5ID0gZW50cnkubWVtb3J5OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtZW1vcnkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1Qb29sLT5mZXRjaExpbmVhckJsb2NrKHNpemUsIG1Vc2FnZSwgJmJsb2NrKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IEVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyKG1Gb3JtYXQsIGJsb2NrLCBtZW1vcnksIG1IZWFwU2VxTnVtKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQzJNZW1vcnlVc2FnZSBtVXNhZ2U7CisgICAgc3A8TWVtb3J5RGVhbGVyPiBtRGVhbGVyOworICAgIHNwPElDcnlwdG8+IG1DcnlwdG87CisgICAgaW50MzJfdCBtSGVhcFNlcU51bTsKKyAgICBzdHJ1Y3QgRW50cnkgeworICAgICAgICBzdGQ6OndlYWtfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgICAgICBzcDxJTWVtb3J5PiBtZW1vcnk7CisgICAgfTsKKyAgICBzdGQ6OnZlY3RvcjxFbnRyeT4gbU1lbW9yeVZlY3RvcjsKK307CisKK2NsYXNzIEdyYXBoaWNNZXRhZGF0YUlucHV0QnVmZmVycyA6IHB1YmxpYyBDQ29kZWNCdWZmZXJDaGFubmVsOjpJbnB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIEdyYXBoaWNNZXRhZGF0YUlucHV0QnVmZmVycyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIjJELU1ldGFJbnB1dCIpCisgICAgICAgIDogSW5wdXRCdWZmZXJzKGNvbXBvbmVudE5hbWUsIG5hbWUpLAorICAgICAgICAgIG1JbXBsKG1OYW1lKSwKKyAgICAgICAgICBtU3RvcmUoR2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpKSB7IH0KKyAgICB+R3JhcGhpY01ldGFkYXRhSW5wdXRCdWZmZXJzKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgYm9vbCByZXF1ZXN0TmV3QnVmZmVyKHNpemVfdCAqaW5kZXgsIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBhbGxvYzsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbVN0b3JlLT5mZXRjaEFsbG9jYXRvcihtUG9vbC0+Z2V0QWxsb2NhdG9ySWQoKSwgJmFsbG9jKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHNwPEdyYXBoaWNNZXRhZGF0YUJ1ZmZlcj4gbmV3QnVmZmVyID0gbmV3IEdyYXBoaWNNZXRhZGF0YUJ1ZmZlcihtRm9ybWF0LCBhbGxvYyk7CisgICAgICAgIGlmIChuZXdCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgICppbmRleCA9IG1JbXBsLmFzc2lnblNsb3QobmV3QnVmZmVyKTsKKyAgICAgICAgKmJ1ZmZlciA9IG5ld0J1ZmZlcjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCByZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLnJlbGVhc2VTbG90KGJ1ZmZlciwgYzJidWZmZXIpOworICAgIH0KKworICAgIGJvb2wgZXhwaXJlQ29tcG9uZW50QnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYzJidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLmV4cGlyZUNvbXBvbmVudEJ1ZmZlcihjMmJ1ZmZlcik7CisgICAgfQorCisgICAgdm9pZCBmbHVzaCgpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVGhpcyBpcyBuby1vcCBieSBkZWZhdWx0IHVubGVzcyB3ZSdyZSBpbiBhcnJheSBtb2RlIHdoZXJlIHdlIG5lZWQgdG8ga2VlcAorICAgICAgICAvLyB0cmFjayBvZiB0aGUgZmx1c2hlZCB3b3JrLgorICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNCdWZmZXJDaGFubmVsOjpJbnB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKAorICAgICAgICAgICAgc2l6ZV90IHNpemUpIGZpbmFsIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBhbGxvYzsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbVN0b3JlLT5mZXRjaEFsbG9jYXRvcihtUG9vbC0+Z2V0QWxsb2NhdG9ySWQoKSwgJmFsbG9jKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVyc0FycmF5PiBhcnJheSgKKyAgICAgICAgICAgICAgICBuZXcgSW5wdXRCdWZmZXJzQXJyYXkobUNvbXBvbmVudE5hbWUuY19zdHIoKSwgIjJELU1ldGFJbnB1dFtOXSIpKTsKKyAgICAgICAgYXJyYXktPnNldFBvb2wobVBvb2wpOworICAgICAgICBhcnJheS0+c2V0Rm9ybWF0KG1Gb3JtYXQpOworICAgICAgICBhcnJheS0+aW5pdGlhbGl6ZSgKKyAgICAgICAgICAgICAgICBtSW1wbCwKKyAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgIFtmb3JtYXQgPSBtRm9ybWF0LCBhbGxvY10oKSAtPiBzcDxDb2RlYzJCdWZmZXI+IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBHcmFwaGljTWV0YWRhdGFCdWZmZXIoZm9ybWF0LCBhbGxvYyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoYXJyYXkpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBGbGV4QnVmZmVyc0ltcGwgbUltcGw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IG1TdG9yZTsKK307CisKK2NsYXNzIEdyYXBoaWNJbnB1dEJ1ZmZlcnMgOiBwdWJsaWMgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6SW5wdXRCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBHcmFwaGljSW5wdXRCdWZmZXJzKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiMkQtQkItSW5wdXQiKQorICAgICAgICA6IElucHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSwKKyAgICAgICAgICBtSW1wbChtTmFtZSksCisgICAgICAgICAgbUxvY2FsQnVmZmVyUG9vbChMb2NhbEJ1ZmZlclBvb2w6OkNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgIGtNYXhMaW5lYXJCdWZmZXJTaXplICoga01pbklucHV0QnVmZmVyQXJyYXlTaXplKSkgeyB9CisgICAgfkdyYXBoaWNJbnB1dEJ1ZmZlcnMoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBib29sIHJlcXVlc3ROZXdCdWZmZXIoc2l6ZV90ICppbmRleCwgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICAvLyBUT0RPOiBwcm9wZXIgbWF4IGlucHV0IHNpemUKKyAgICAgICAgLy8gVE9ETzogcmVhZCB1c2FnZSBmcm9tIGludGYKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICBzcDxHcmFwaGljQmxvY2tCdWZmZXI+IG5ld0J1ZmZlciA9IEFsbG9jYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgICAgICBtUG9vbCwgbUZvcm1hdCwgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyLCB1c2FnZSwgbUxvY2FsQnVmZmVyUG9vbCk7CisgICAgICAgIGlmIChuZXdCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgICppbmRleCA9IG1JbXBsLmFzc2lnblNsb3QobmV3QnVmZmVyKTsKKyAgICAgICAgKmJ1ZmZlciA9IG5ld0J1ZmZlcjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCByZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLnJlbGVhc2VTbG90KGJ1ZmZlciwgYzJidWZmZXIpOworICAgIH0KKworICAgIGJvb2wgZXhwaXJlQ29tcG9uZW50QnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYzJidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLmV4cGlyZUNvbXBvbmVudEJ1ZmZlcihjMmJ1ZmZlcik7CisgICAgfQorICAgIHZvaWQgZmx1c2goKSBvdmVycmlkZSB7CisgICAgICAgIC8vIFRoaXMgaXMgbm8tb3AgYnkgZGVmYXVsdCB1bmxlc3Mgd2UncmUgaW4gYXJyYXkgbW9kZSB3aGVyZSB3ZSBuZWVkIHRvIGtlZXAKKyAgICAgICAgLy8gdHJhY2sgb2YgdGhlIGZsdXNoZWQgd29yay4KKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0NvZGVjQnVmZmVyQ2hhbm5lbDo6SW5wdXRCdWZmZXJzPiB0b0FycmF5TW9kZSgKKyAgICAgICAgICAgIHNpemVfdCBzaXplKSBmaW5hbCB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnNBcnJheT4gYXJyYXkoCisgICAgICAgICAgICAgICAgbmV3IElucHV0QnVmZmVyc0FycmF5KG1Db21wb25lbnROYW1lLmNfc3RyKCksICIyRC1CQi1JbnB1dFtOXSIpKTsKKyAgICAgICAgYXJyYXktPnNldFBvb2wobVBvb2wpOworICAgICAgICBhcnJheS0+c2V0Rm9ybWF0KG1Gb3JtYXQpOworICAgICAgICBhcnJheS0+aW5pdGlhbGl6ZSgKKyAgICAgICAgICAgICAgICBtSW1wbCwKKyAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgIFtwb29sID0gbVBvb2wsIGZvcm1hdCA9IG1Gb3JtYXQsIGxicCA9IG1Mb2NhbEJ1ZmZlclBvb2xdKCkgLT4gc3A8Q29kZWMyQnVmZmVyPiB7CisgICAgICAgICAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFsbG9jYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sLCBmb3JtYXQsIEhBTF9QSVhFTF9GT1JNQVRfWVYxMiwgdXNhZ2UsIGxicCk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoYXJyYXkpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBGbGV4QnVmZmVyc0ltcGwgbUltcGw7CisgICAgc3RkOjpzaGFyZWRfcHRyPExvY2FsQnVmZmVyUG9vbD4gbUxvY2FsQnVmZmVyUG9vbDsKK307CisKK2NsYXNzIER1bW15SW5wdXRCdWZmZXJzIDogcHVibGljIENDb2RlY0J1ZmZlckNoYW5uZWw6OklucHV0QnVmZmVycyB7CitwdWJsaWM6CisgICAgRHVtbXlJbnB1dEJ1ZmZlcnMoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICIyRC1JbnB1dCIpCisgICAgICAgIDogSW5wdXRCdWZmZXJzKGNvbXBvbmVudE5hbWUsIG5hbWUpIHsgfQorCisgICAgYm9vbCByZXF1ZXN0TmV3QnVmZmVyKHNpemVfdCAqLCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIHJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmLCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICopIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgZXhwaXJlQ29tcG9uZW50QnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJikgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHZvaWQgZmx1c2goKSBvdmVycmlkZSB7CisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPENDb2RlY0J1ZmZlckNoYW5uZWw6OklucHV0QnVmZmVycz4gdG9BcnJheU1vZGUoCisgICAgICAgICAgICBzaXplX3QpIGZpbmFsIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgYm9vbCBpc0FycmF5TW9kZSgpIGNvbnN0IGZpbmFsIHsgcmV0dXJuIHRydWU7IH0KKworICAgIHZvaWQgZ2V0QXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpIGNvbnN0IGZpbmFsIHsKKyAgICAgICAgYXJyYXktPmNsZWFyKCk7CisgICAgfQorfTsKKworY2xhc3MgT3V0cHV0QnVmZmVyc0FycmF5IDogcHVibGljIENDb2RlY0J1ZmZlckNoYW5uZWw6Ok91dHB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIE91dHB1dEJ1ZmZlcnNBcnJheShjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIk91dHB1dFtOXSIpCisgICAgICAgIDogT3V0cHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSB7IH0KKyAgICB+T3V0cHV0QnVmZmVyc0FycmF5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdm9pZCBpbml0aWFsaXplKAorICAgICAgICAgICAgY29uc3QgRmxleEJ1ZmZlcnNJbXBsICZpbXBsLAorICAgICAgICAgICAgc2l6ZV90IG1pblNpemUsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjMkJ1ZmZlcj4oKT4gYWxsb2NhdGUpIHsKKyAgICAgICAgbUltcGwuaW5pdGlhbGl6ZShpbXBsLCBtaW5TaXplLCBhbGxvY2F0ZSk7CisgICAgfQorCisgICAgYm9vbCBpc0FycmF5TW9kZSgpIGNvbnN0IGZpbmFsIHsgcmV0dXJuIHRydWU7IH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNCdWZmZXJDaGFubmVsOjpPdXRwdXRCdWZmZXJzPiB0b0FycmF5TW9kZSgKKyAgICAgICAgICAgIHNpemVfdCkgZmluYWwgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZWdpc3RlckJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIHNpemVfdCAqaW5kZXgsCisgICAgICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqY2xpZW50QnVmZmVyKSBmaW5hbCB7CisgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gYzJCdWZmZXI7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1JbXBsLmdyYWJCdWZmZXIoCisgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgJmMyQnVmZmVyLAorICAgICAgICAgICAgICAgIFtidWZmZXJdKGNvbnN0IHNwPENvZGVjMkJ1ZmZlcj4gJmNsaWVudEJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xpZW50QnVmZmVyLT5jYW5Db3B5KGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmIChlcnIgPT0gV09VTERfQkxPQ0spIHsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIGJ1ZmZlcnMgdGVtcG9yYXJpbHkgbm90IGF2YWlsYWJsZSIsIG1OYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRCgiWyVzXSBncmFiQnVmZmVyIGZhaWxlZDogJWQiLCBtTmFtZSwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgYzJCdWZmZXItPnNldEZvcm1hdChtRm9ybWF0KTsKKyAgICAgICAgaWYgKCFjMkJ1ZmZlci0+Y29weShidWZmZXIpKSB7CisgICAgICAgICAgICBBTE9HRCgiWyVzXSBjb3B5IGJ1ZmZlciBmYWlsZWQiLCBtTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CisgICAgICAgIH0KKyAgICAgICAgc3VibWl0KGMyQnVmZmVyKTsKKyAgICAgICAgKmNsaWVudEJ1ZmZlciA9IGMyQnVmZmVyOworICAgICAgICBBTE9HVigiWyVzXSBncmFiYmVkIGJ1ZmZlciAlenUiLCBtTmFtZSwgKmluZGV4KTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0YXR1c190IHJlZ2lzdGVyQ3NkKAorICAgICAgICAgICAgY29uc3QgQzJTdHJlYW1Dc2RJbmZvOjpvdXRwdXQgKmNzZCwKKyAgICAgICAgICAgIHNpemVfdCAqaW5kZXgsCisgICAgICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqY2xpZW50QnVmZmVyKSBmaW5hbCB7CisgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gYzJCdWZmZXI7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1JbXBsLmdyYWJCdWZmZXIoCisgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgJmMyQnVmZmVyLAorICAgICAgICAgICAgICAgIFtjc2RdKGNvbnN0IHNwPENvZGVjMkJ1ZmZlcj4gJmNsaWVudEJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xpZW50QnVmZmVyLT5iYXNlKCkgIT0gbnVsbHB0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGNsaWVudEJ1ZmZlci0+Y2FwYWNpdHkoKSA+PSBjc2QtPmZsZXhDb3VudCgpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIG1lbWNweShjMkJ1ZmZlci0+YmFzZSgpLCBjc2QtPm0udmFsdWUsIGNzZC0+ZmxleENvdW50KCkpOworICAgICAgICBjMkJ1ZmZlci0+c2V0UmFuZ2UoMCwgY3NkLT5mbGV4Q291bnQoKSk7CisgICAgICAgIGMyQnVmZmVyLT5zZXRGb3JtYXQobUZvcm1hdCk7CisgICAgICAgICpjbGllbnRCdWZmZXIgPSBjMkJ1ZmZlcjsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGJvb2wgcmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKmMyYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC5yZXR1cm5CdWZmZXIoYnVmZmVyLCBjMmJ1ZmZlcik7CisgICAgfQorCisgICAgdm9pZCBmbHVzaChjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZmbHVzaGVkV29yaykgb3ZlcnJpZGUgeworICAgICAgICAodm9pZClmbHVzaGVkV29yazsKKyAgICAgICAgbUltcGwuZmx1c2goKTsKKyAgICAgICAgaWYgKG1Ta2lwQ3V0QnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1Ta2lwQ3V0QnVmZmVyLT5jbGVhcigpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBnZXRBcnJheShWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICphcnJheSkgY29uc3QgZmluYWwgeworICAgICAgICBtSW1wbC5nZXRBcnJheShhcnJheSk7CisgICAgfQorCisgICAgdm9pZCByZWFsbG9jKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmMyYnVmZmVyKSB7CisgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3A8Q29kZWMyQnVmZmVyPigpPiBhbGxvYzsKKyAgICAgICAgc3dpdGNoIChjMmJ1ZmZlci0+ZGF0YSgpLnR5cGUoKSkgeworICAgICAgICAgICAgY2FzZSBDMkJ1ZmZlckRhdGE6OkxJTkVBUjogeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUgPSBrTGluZWFyQnVmZmVyU2l6ZTsKKyAgICAgICAgICAgICAgICBjb25zdCBDMkNvbnN0TGluZWFyQmxvY2sgJmJsb2NrID0gYzJidWZmZXItPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpOworICAgICAgICAgICAgICAgIGlmIChibG9jay5zaXplKCkgPCBrTWF4TGluZWFyQnVmZmVyU2l6ZSAvIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGJsb2NrLnNpemUoKSAqIDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGtNYXhMaW5lYXJCdWZmZXJTaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhbGxvYyA9IFtmb3JtYXQgPSBtRm9ybWF0LCBzaXplXSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTG9jYWxMaW5lYXJCdWZmZXIoZm9ybWF0LCBuZXcgQUJ1ZmZlcihzaXplKSk7CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVE9ETzogYWRkIHN1cHBvcnQKKyAgICAgICAgICAgIGNhc2UgQzJCdWZmZXJEYXRhOjpHUkFQSElDOiAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOworCisgICAgICAgICAgICBjYXNlIEMyQnVmZmVyRGF0YTo6SU5WQUxJRDogICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKKyAgICAgICAgICAgIGNhc2UgQzJCdWZmZXJEYXRhOjpMSU5FQVJfQ0hVTktTOiAgIEZBTExUSFJPVUdIX0lOVEVOREVEOworICAgICAgICAgICAgY2FzZSBDMkJ1ZmZlckRhdGE6OkdSQVBISUNfQ0hVTktTOiAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dEKCJVbnN1cHBvcnRlZCB0eXBlOiAlZCIsIChpbnQpYzJidWZmZXItPmRhdGEoKS50eXBlKCkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtSW1wbC5yZWFsbG9jKGFsbG9jKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQnVmZmVyc0FycmF5SW1wbCBtSW1wbDsKK307CisKK2NsYXNzIEZsZXhPdXRwdXRCdWZmZXJzIDogcHVibGljIENDb2RlY0J1ZmZlckNoYW5uZWw6Ok91dHB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIEZsZXhPdXRwdXRCdWZmZXJzKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiT3V0cHV0W10iKQorICAgICAgICA6IE91dHB1dEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSksCisgICAgICAgICAgbUltcGwobU5hbWUpIHsgfQorCisgICAgc3RhdHVzX3QgcmVnaXN0ZXJCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzaXplX3QgKmluZGV4LAorICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmNsaWVudEJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IG5ld0J1ZmZlciA9IHdyYXAoYnVmZmVyKTsKKyAgICAgICAgbmV3QnVmZmVyLT5zZXRGb3JtYXQobUZvcm1hdCk7CisgICAgICAgICppbmRleCA9IG1JbXBsLmFzc2lnblNsb3QobmV3QnVmZmVyKTsKKyAgICAgICAgKmNsaWVudEJ1ZmZlciA9IG5ld0J1ZmZlcjsKKyAgICAgICAgQUxPR1YoIlslc10gcmVnaXN0ZXJlZCBidWZmZXIgJXp1IiwgbU5hbWUsICppbmRleCk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZWdpc3RlckNzZCgKKyAgICAgICAgICAgIGNvbnN0IEMyU3RyZWFtQ3NkSW5mbzo6b3V0cHV0ICpjc2QsCisgICAgICAgICAgICBzaXplX3QgKmluZGV4LAorICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmNsaWVudEJ1ZmZlcikgZmluYWwgeworICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IG5ld0J1ZmZlciA9IG5ldyBMb2NhbExpbmVhckJ1ZmZlcigKKyAgICAgICAgICAgICAgICBtRm9ybWF0LCBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoY3NkLT5tLnZhbHVlLCBjc2QtPmZsZXhDb3VudCgpKSk7CisgICAgICAgICppbmRleCA9IG1JbXBsLmFzc2lnblNsb3QobmV3QnVmZmVyKTsKKyAgICAgICAgKmNsaWVudEJ1ZmZlciA9IG5ld0J1ZmZlcjsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGJvb2wgcmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKmMyYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC5yZWxlYXNlU2xvdChidWZmZXIsIGMyYnVmZmVyKTsKKyAgICB9CisKKyAgICB2b2lkIGZsdXNoKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmZmx1c2hlZFdvcmspIG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpIGZsdXNoZWRXb3JrOworICAgICAgICAvLyBUaGlzIGlzIG5vLW9wIGJ5IGRlZmF1bHQgdW5sZXNzIHdlJ3JlIGluIGFycmF5IG1vZGUgd2hlcmUgd2UgbmVlZCB0byBrZWVwCisgICAgICAgIC8vIHRyYWNrIG9mIHRoZSBmbHVzaGVkIHdvcmsuCisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPENDb2RlY0J1ZmZlckNoYW5uZWw6Ok91dHB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKAorICAgICAgICAgICAgc2l6ZV90IHNpemUpIG92ZXJyaWRlIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnNBcnJheT4gYXJyYXkobmV3IE91dHB1dEJ1ZmZlcnNBcnJheShtQ29tcG9uZW50TmFtZS5jX3N0cigpKSk7CisgICAgICAgIGFycmF5LT5zZXRGb3JtYXQobUZvcm1hdCk7CisgICAgICAgIGFycmF5LT50cmFuc2ZlclNraXBDdXRCdWZmZXIobVNraXBDdXRCdWZmZXIpOworICAgICAgICBhcnJheS0+aW5pdGlhbGl6ZSgKKyAgICAgICAgICAgICAgICBtSW1wbCwKKyAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgIFt0aGlzXSgpIHsgcmV0dXJuIGFsbG9jYXRlQXJyYXlCdWZmZXIoKTsgfSk7CisgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoYXJyYXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBhcHByb3ByaWF0ZSBDb2RlYzJCdWZmZXIgb2JqZWN0IGZvciB0aGUgdHlwZSBvZiBidWZmZXJzLgorICAgICAqCisgICAgICogXHBhcmFtIGJ1ZmZlciAgQzJCdWZmZXIgb2JqZWN0IHRvIHdyYXAuCisgICAgICoKKyAgICAgKiBccmV0dXJuICBhcHByb3ByaWF0ZSBDb2RlYzJCdWZmZXIgb2JqZWN0IHRvIHdyYXAgfGJ1ZmZlcnwuCisgICAgICovCisgICAgdmlydHVhbCBzcDxDb2RlYzJCdWZmZXI+IHdyYXAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gYXBwcm9wcmlhdGUgQ29kZWMyQnVmZmVyIG9iamVjdCBmb3IgdGhlIHR5cGUgb2YgYnVmZmVycywgdG8gYmUKKyAgICAgKiB1c2VkIGFzIGFuIGVtcHR5IGFycmF5IGJ1ZmZlci4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gIGFwcHJvcHJpYXRlIENvZGVjMkJ1ZmZlciBvYmplY3Qgd2hpY2ggY2FuIGNvcHkoKSBmcm9tIEMyQnVmZmVycy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHNwPENvZGVjMkJ1ZmZlcj4gYWxsb2NhdGVBcnJheUJ1ZmZlcigpID0gMDsKKworcHJpdmF0ZToKKyAgICBGbGV4QnVmZmVyc0ltcGwgbUltcGw7Cit9OworCitjbGFzcyBMaW5lYXJPdXRwdXRCdWZmZXJzIDogcHVibGljIEZsZXhPdXRwdXRCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBMaW5lYXJPdXRwdXRCdWZmZXJzKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiMUQtT3V0cHV0IikKKyAgICAgICAgOiBGbGV4T3V0cHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSB7IH0KKworICAgIHZvaWQgZmx1c2goCisgICAgICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZmbHVzaGVkV29yaykgb3ZlcnJpZGUgeworICAgICAgICBpZiAobVNraXBDdXRCdWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbVNraXBDdXRCdWZmZXItPmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgRmxleE91dHB1dEJ1ZmZlcnM6OmZsdXNoKGZsdXNoZWRXb3JrKTsKKyAgICB9CisKKyAgICBzcDxDb2RlYzJCdWZmZXI+IHdyYXAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR1YoIlslc10gdXNpbmcgYSBkdW1teSBidWZmZXIiLCBtTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IExvY2FsTGluZWFyQnVmZmVyKG1Gb3JtYXQsIG5ldyBBQnVmZmVyKDApKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmZmVyLT5kYXRhKCkudHlwZSgpICE9IEMyQnVmZmVyRGF0YTo6TElORUFSKSB7CisgICAgICAgICAgICBBTE9HVigiWyVzXSBub24tbGluZWFyIGJ1ZmZlciAlZCIsIG1OYW1lLCBidWZmZXItPmRhdGEoKS50eXBlKCkpOworICAgICAgICAgICAgLy8gV2UgZXhwZWN0IGxpbmVhciBvdXRwdXQgYnVmZmVycyBmcm9tIHRoZSBjb21wb25lbnQuCisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmZmVyLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuc2l6ZSgpICE9IDF1KSB7CisgICAgICAgICAgICBBTE9HVigiWyVzXSBubyBsaW5lYXIgYnVmZmVycyIsIG1OYW1lKTsKKyAgICAgICAgICAgIC8vIFdlIGV4cGVjdCBvbmUgYW5kIG9ubHkgb25lIGxpbmVhciBibG9jayBmcm9tIHRoZSBjb21wb25lbnQuCisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IGNsaWVudEJ1ZmZlciA9IENvbnN0TGluZWFyQmxvY2tCdWZmZXI6OkFsbG9jYXRlKG1Gb3JtYXQsIGJ1ZmZlcik7CisgICAgICAgIHN1Ym1pdChjbGllbnRCdWZmZXIpOworICAgICAgICByZXR1cm4gY2xpZW50QnVmZmVyOworICAgIH0KKworICAgIHNwPENvZGVjMkJ1ZmZlcj4gYWxsb2NhdGVBcnJheUJ1ZmZlcigpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVE9ETzogcHJvcGVyIG1heCBvdXRwdXQgc2l6ZQorICAgICAgICByZXR1cm4gbmV3IExvY2FsTGluZWFyQnVmZmVyKG1Gb3JtYXQsIG5ldyBBQnVmZmVyKGtMaW5lYXJCdWZmZXJTaXplKSk7CisgICAgfQorfTsKKworY2xhc3MgR3JhcGhpY091dHB1dEJ1ZmZlcnMgOiBwdWJsaWMgRmxleE91dHB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIEdyYXBoaWNPdXRwdXRCdWZmZXJzKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiMkQtT3V0cHV0IikKKyAgICAgICAgOiBGbGV4T3V0cHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSB7IH0KKworICAgIHNwPENvZGVjMkJ1ZmZlcj4gd3JhcChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEdW1teUNvbnRhaW5lckJ1ZmZlcihtRm9ybWF0LCBidWZmZXIpOworICAgIH0KKworICAgIHNwPENvZGVjMkJ1ZmZlcj4gYWxsb2NhdGVBcnJheUJ1ZmZlcigpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEdW1teUNvbnRhaW5lckJ1ZmZlcihtRm9ybWF0KTsKKyAgICB9Cit9OworCitjbGFzcyBSYXdHcmFwaGljT3V0cHV0QnVmZmVycyA6IHB1YmxpYyBGbGV4T3V0cHV0QnVmZmVycyB7CitwdWJsaWM6CisgICAgUmF3R3JhcGhpY091dHB1dEJ1ZmZlcnMoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICIyRC1CQi1PdXRwdXQiKQorICAgICAgICA6IEZsZXhPdXRwdXRCdWZmZXJzKGNvbXBvbmVudE5hbWUsIG5hbWUpLAorICAgICAgICAgIG1Mb2NhbEJ1ZmZlclBvb2woTG9jYWxCdWZmZXJQb29sOjpDcmVhdGUoCisgICAgICAgICAgICAgICAgICBrTWF4TGluZWFyQnVmZmVyU2l6ZSAqIGtNaW5PdXRwdXRCdWZmZXJBcnJheVNpemUpKSB7IH0KKyAgICB+UmF3R3JhcGhpY091dHB1dEJ1ZmZlcnMoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBzcDxDb2RlYzJCdWZmZXI+IHdyYXAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgc3A8Q29kZWMyQnVmZmVyPiBjMmJ1ZmZlciA9IENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpBbGxvY2F0ZUVtcHR5KAorICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBbbGJwID0gbUxvY2FsQnVmZmVyUG9vbF0oc2l6ZV90IGNhcGFjaXR5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGJwLT5uZXdCdWZmZXIoY2FwYWNpdHkpOworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGMyYnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKKyAgICAgICAgICAgIHJldHVybiBjMmJ1ZmZlcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGUoCisgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgW2xicCA9IG1Mb2NhbEJ1ZmZlclBvb2xdKHNpemVfdCBjYXBhY2l0eSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxicC0+bmV3QnVmZmVyKGNhcGFjaXR5KTsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcDxDb2RlYzJCdWZmZXI+IGFsbG9jYXRlQXJyYXlCdWZmZXIoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGVFbXB0eSgKKyAgICAgICAgICAgICAgICBtRm9ybWF0LAorICAgICAgICAgICAgICAgIFtsYnAgPSBtTG9jYWxCdWZmZXJQb29sXShzaXplX3QgY2FwYWNpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxicC0+bmV3QnVmZmVyKGNhcGFjaXR5KTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPExvY2FsQnVmZmVyUG9vbD4gbUxvY2FsQnVmZmVyUG9vbDsKK307CisKK30gIC8vIG5hbWVzcGFjZQorCitDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZUd1YXJkOjpRdWV1ZUd1YXJkKAorICAgICAgICBDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZVN5bmMgJnN5bmMpIDogbVN5bmMoc3luYykgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1TeW5jLm1HdWFyZExvY2spOworICAgIC8vIEF0IHRoaXMgcG9pbnQgaXQncyBndWFyYW50ZWVkIHRoYXQgbVN5bmMgaXMgbm90IHVuZGVyIHN0YXRlIHRyYW5zaXRpb24sCisgICAgLy8gYXMgd2UgYXJlIGhvbGRpbmcgaXRzIG11dGV4LgorCisgICAgTXV0ZXhlZDxDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZVN5bmM6OkNvdW50ZXI+OjpMb2NrZWQgY291bnQobVN5bmMubUNvdW50KTsKKyAgICBpZiAoY291bnQtPnZhbHVlID09IC0xKSB7CisgICAgICAgIG1SdW5uaW5nID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKytjb3VudC0+dmFsdWU7CisgICAgICAgIG1SdW5uaW5nID0gdHJ1ZTsKKyAgICB9Cit9CisKK0NDb2RlY0J1ZmZlckNoYW5uZWw6OlF1ZXVlR3VhcmQ6On5RdWV1ZUd1YXJkKCkgeworICAgIGlmIChtUnVubmluZykgeworICAgICAgICAvLyBXZSBhcmUgbm90IGhvbGRpbmcgbUd1YXJkTG9jayBhdCB0aGlzIHBvaW50IHNvIHRoYXQgUXVldWVTeW5jOjpzdG9wKCkgY2FuCisgICAgICAgIC8vIGtlZXAgaG9sZGluZyB0aGUgbG9jayB1bnRpbCBtQ291bnQgcmVhY2hlcyB6ZXJvLgorICAgICAgICBNdXRleGVkPENDb2RlY0J1ZmZlckNoYW5uZWw6OlF1ZXVlU3luYzo6Q291bnRlcj46OkxvY2tlZCBjb3VudChtU3luYy5tQ291bnQpOworICAgICAgICAtLWNvdW50LT52YWx1ZTsKKyAgICAgICAgY291bnQtPmNvbmQuYnJvYWRjYXN0KCk7CisgICAgfQorfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OlF1ZXVlU3luYzo6c3RhcnQoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUd1YXJkTG9jayk7CisgICAgLy8gSWYgc3RvcHBlZCwgaXQgZ29lcyB0byBydW5uaW5nIHN0YXRlOyBvdGhlcndpc2Ugbm8tb3AuCisgICAgTXV0ZXhlZDxDb3VudGVyPjo6TG9ja2VkIGNvdW50KG1Db3VudCk7CisgICAgaWYgKGNvdW50LT52YWx1ZSA9PSAtMSkgeworICAgICAgICBjb3VudC0+dmFsdWUgPSAwOworICAgIH0KK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZVN5bmM6OnN0b3AoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUd1YXJkTG9jayk7CisgICAgTXV0ZXhlZDxDb3VudGVyPjo6TG9ja2VkIGNvdW50KG1Db3VudCk7CisgICAgaWYgKGNvdW50LT52YWx1ZSA9PSAtMSkgeworICAgICAgICAvLyBuby1vcAorICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIEhvbGRpbmcgbUd1YXJkTG9jayBoZXJlIGJsb2NrcyBjcmVhdGlvbiBvZiBhZGRpdGlvbmFsIFF1ZXVlR3VhcmQgb2JqZWN0cywgc28KKyAgICAvLyBtQ291bnQgY2FuIG9ubHkgZGVjcmVtZW50LiBJbiBvdGhlciB3b3JkcywgdGhyZWFkcyB0aGF0IGFjcXVpcmVkIHRoZSBsb2NrCisgICAgLy8gYXJlIGFsbG93ZWQgdG8gZmluaXNoIGV4ZWN1dGlvbiBidXQgYWRkaXRpb25hbCB0aHJlYWRzIHRyeWluZyB0byBhY3F1aXJlCisgICAgLy8gdGhlIGxvY2sgYXQgdGhpcyBwb2ludCB3aWxsIGJsb2NrLCBhbmQgdGhlbiBnZXQgUXVldWVHdWFyZCBhdCBTVE9QUEVECisgICAgLy8gc3RhdGUuCisgICAgd2hpbGUgKGNvdW50LT52YWx1ZSAhPSAwKSB7CisgICAgICAgIGNvdW50LndhaXRGb3JDb25kaXRpb24oY291bnQtPmNvbmQpOworICAgIH0KKyAgICBjb3VudC0+dmFsdWUgPSAtMTsKK30KKworLy8gQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UGlwZWxpbmVDYXBhY2l0eQorCitDQ29kZWNCdWZmZXJDaGFubmVsOjpQaXBlbGluZUNhcGFjaXR5OjpQaXBlbGluZUNhcGFjaXR5KCkKKyAgICAgIDogaW5wdXQoMCksIGNvbXBvbmVudCgwKSwKKyAgICAgICAgbU5hbWUoIjxVTktOT1dOIENPTVBPTkVOVD4iKSB7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UGlwZWxpbmVDYXBhY2l0eTo6aW5pdGlhbGl6ZSgKKyAgICAgICAgaW50IG5ld0lucHV0LAorICAgICAgICBpbnQgbmV3Q29tcG9uZW50LAorICAgICAgICBjb25zdCBjaGFyKiBuZXdOYW1lLAorICAgICAgICBjb25zdCBjaGFyKiBjYWxsZXJUYWcpIHsKKyAgICBpbnB1dC5zdG9yZShuZXdJbnB1dCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgY29tcG9uZW50LnN0b3JlKG5ld0NvbXBvbmVudCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgbU5hbWUgPSBuZXdOYW1lOworICAgIEFMT0dWKCJbJXNdICVzIC0tIFBpcGVsaW5lQ2FwYWNpdHk6OmluaXRpYWxpemUoKTogIgorICAgICAgICAgICJwaXBlbGluZSBhdmFpbGFiaWxpdHkgaW5pdGlhbGl6ZWQgPT0+ICIKKyAgICAgICAgICAiaW5wdXQgPSAlZCwgY29tcG9uZW50ID0gJWQiLAorICAgICAgICAgICAgbU5hbWUsIGNhbGxlclRhZyA/IGNhbGxlclRhZyA6ICIqIiwKKyAgICAgICAgICAgIG5ld0lucHV0LCBuZXdDb21wb25lbnQpOworfQorCitib29sIENDb2RlY0J1ZmZlckNoYW5uZWw6OlBpcGVsaW5lQ2FwYWNpdHk6OmFsbG9jYXRlKGNvbnN0IGNoYXIqIGNhbGxlclRhZykgeworICAgIGludCBwcmV2SW5wdXQgPSBpbnB1dC5mZXRjaF9zdWIoMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgaW50IHByZXZDb21wb25lbnQgPSBjb21wb25lbnQuZmV0Y2hfc3ViKDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgIGlmIChwcmV2SW5wdXQgPiAwICYmIHByZXZDb21wb25lbnQgPiAwKSB7CisgICAgICAgIEFMT0dWKCJbJXNdICVzIC0tIFBpcGVsaW5lQ2FwYWNpdHk6OmFsbG9jYXRlKCkgcmV0dXJucyB0cnVlOiAiCisgICAgICAgICAgICAgICJwaXBlbGluZSBhdmFpbGFiaWxpdHkgLTEgYWxsID09PiAiCisgICAgICAgICAgICAgICJpbnB1dCA9ICVkLCBjb21wb25lbnQgPSAlZCIsCisgICAgICAgICAgICAgICAgbU5hbWUsIGNhbGxlclRhZyA/IGNhbGxlclRhZyA6ICIqIiwKKyAgICAgICAgICAgICAgICBwcmV2SW5wdXQgLSAxLAorICAgICAgICAgICAgICAgIHByZXZDb21wb25lbnQgLSAxKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlucHV0LmZldGNoX2FkZCgxLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICBjb21wb25lbnQuZmV0Y2hfYWRkKDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgIEFMT0dWKCJbJXNdICVzIC0tIFBpcGVsaW5lQ2FwYWNpdHk6OmFsbG9jYXRlKCkgcmV0dXJucyBmYWxzZTogIgorICAgICAgICAgICJwaXBlbGluZSBhdmFpbGFiaWxpdHkgdW5jaGFuZ2VkID09PiAiCisgICAgICAgICAgImlucHV0ID0gJWQsIGNvbXBvbmVudCA9ICVkIiwKKyAgICAgICAgICAgIG1OYW1lLCBjYWxsZXJUYWcgPyBjYWxsZXJUYWcgOiAiKiIsCisgICAgICAgICAgICBwcmV2SW5wdXQsCisgICAgICAgICAgICBwcmV2Q29tcG9uZW50KTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UGlwZWxpbmVDYXBhY2l0eTo6ZnJlZShjb25zdCBjaGFyKiBjYWxsZXJUYWcpIHsKKyAgICBpbnQgcHJldklucHV0ID0gaW5wdXQuZmV0Y2hfYWRkKDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgIGludCBwcmV2Q29tcG9uZW50ID0gY29tcG9uZW50LmZldGNoX2FkZCgxLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICBBTE9HVigiWyVzXSAlcyAtLSBQaXBlbGluZUNhcGFjaXR5OjpmcmVlKCk6ICIKKyAgICAgICAgICAicGlwZWxpbmUgYXZhaWxhYmlsaXR5ICsxIGFsbCA9PT4gIgorICAgICAgICAgICJpbnB1dCA9ICVkLCBjb21wb25lbnQgPSAlZCIsCisgICAgICAgICAgICBtTmFtZSwgY2FsbGVyVGFnID8gY2FsbGVyVGFnIDogIioiLAorICAgICAgICAgICAgcHJldklucHV0ICsgMSwKKyAgICAgICAgICAgIHByZXZDb21wb25lbnQgKyAxKTsKK30KKworaW50IENDb2RlY0J1ZmZlckNoYW5uZWw6OlBpcGVsaW5lQ2FwYWNpdHk6OmZyZWVJbnB1dFNsb3RzKAorICAgICAgICBzaXplX3QgbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzLAorICAgICAgICBjb25zdCBjaGFyKiBjYWxsZXJUYWcpIHsKKyAgICBpbnQgcHJldklucHV0ID0gaW5wdXQuZmV0Y2hfYWRkKG51bURpc2NhcmRlZElucHV0QnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgIEFMT0dWKCJbJXNdICVzIC0tIFBpcGVsaW5lQ2FwYWNpdHk6OmZyZWVJbnB1dFNsb3RzKCV6dSk6ICIKKyAgICAgICAgICAicGlwZWxpbmUgYXZhaWxhYmlsaXR5ICslenUgaW5wdXQgPT0+ICIKKyAgICAgICAgICAiaW5wdXQgPSAlZCwgY29tcG9uZW50ID0gJWQiLAorICAgICAgICAgICAgbU5hbWUsIGNhbGxlclRhZyA/IGNhbGxlclRhZyA6ICIqIiwKKyAgICAgICAgICAgIG51bURpc2NhcmRlZElucHV0QnVmZmVycywKKyAgICAgICAgICAgIG51bURpc2NhcmRlZElucHV0QnVmZmVycywKKyAgICAgICAgICAgIHByZXZJbnB1dCArIHN0YXRpY19jYXN0PGludD4obnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzKSwKKyAgICAgICAgICAgIGNvbXBvbmVudC5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpKTsKKyAgICByZXR1cm4gcHJldklucHV0ICsgc3RhdGljX2Nhc3Q8aW50PihudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnMpOworfQorCitpbnQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UGlwZWxpbmVDYXBhY2l0eTo6ZnJlZUNvbXBvbmVudFNsb3QoCisgICAgICAgIGNvbnN0IGNoYXIqIGNhbGxlclRhZykgeworICAgIGludCBwcmV2Q29tcG9uZW50ID0gY29tcG9uZW50LmZldGNoX2FkZCgxLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICBBTE9HVigiWyVzXSAlcyAtLSBQaXBlbGluZUNhcGFjaXR5OjpmcmVlQ29tcG9uZW50U2xvdCgpOiAiCisgICAgICAgICAgInBpcGVsaW5lIGF2YWlsYWJpbGl0eSArMSBjb21wb25lbnQgPT0+ICIKKyAgICAgICAgICAiaW5wdXQgPSAlZCwgY29tcG9uZW50ID0gJWQiLAorICAgICAgICAgICAgbU5hbWUsIGNhbGxlclRhZyA/IGNhbGxlclRhZyA6ICIqIiwKKyAgICAgICAgICAgIGlucHV0LmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCksCisgICAgICAgICAgICBwcmV2Q29tcG9uZW50ICsgMSk7CisgICAgcmV0dXJuIHByZXZDb21wb25lbnQgKyAxOworfQorCisvLyBDQ29kZWNCdWZmZXJDaGFubmVsOjpSZW9yZGVyU3Rhc2gKKworQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpSZW9yZGVyU3Rhc2goKSB7CisgICAgY2xlYXIoKTsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpSZW9yZGVyU3Rhc2g6OmNsZWFyKCkgeworICAgIG1QZW5kaW5nLmNsZWFyKCk7CisgICAgbVN0YXNoLmNsZWFyKCk7CisgICAgbURlcHRoID0gMDsKKyAgICBtS2V5ID0gQzJDb25maWc6Ok9SRElOQUw7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpzZXREZXB0aCh1aW50MzJfdCBkZXB0aCkgeworICAgIG1QZW5kaW5nLnNwbGljZShtUGVuZGluZy5lbmQoKSwgbVN0YXNoKTsKKyAgICBtRGVwdGggPSBkZXB0aDsKK30KK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpzZXRLZXkoQzJDb25maWc6Om9yZGluYWxfa2V5X3Qga2V5KSB7CisgICAgbVBlbmRpbmcuc3BsaWNlKG1QZW5kaW5nLmVuZCgpLCBtU3Rhc2gpOworICAgIG1LZXkgPSBrZXk7Cit9CisKK2Jvb2wgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpwb3AoRW50cnkgKmVudHJ5KSB7CisgICAgaWYgKG1QZW5kaW5nLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBlbnRyeS0+YnVmZmVyICAgICA9IG1QZW5kaW5nLmZyb250KCkuYnVmZmVyOworICAgIGVudHJ5LT50aW1lc3RhbXAgID0gbVBlbmRpbmcuZnJvbnQoKS50aW1lc3RhbXA7CisgICAgZW50cnktPmZsYWdzICAgICAgPSBtUGVuZGluZy5mcm9udCgpLmZsYWdzOworICAgIGVudHJ5LT5vcmRpbmFsICAgID0gbVBlbmRpbmcuZnJvbnQoKS5vcmRpbmFsOworICAgIG1QZW5kaW5nLnBvcF9mcm9udCgpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6ZW1wbGFjZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCwKKyAgICAgICAgaW50MzJfdCBmbGFncywKKyAgICAgICAgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCAmb3JkaW5hbCkgeworICAgIGZvciAoYXV0byBpdCA9IG1TdGFzaC5iZWdpbigpOyBpdCAhPSBtU3Rhc2guZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKGxlc3Mob3JkaW5hbCwgaXQtPm9yZGluYWwpKSB7CisgICAgICAgICAgICBtU3Rhc2guZW1wbGFjZShpdCwgYnVmZmVyLCB0aW1lc3RhbXAsIGZsYWdzLCBvcmRpbmFsKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBtU3Rhc2guZW1wbGFjZV9iYWNrKGJ1ZmZlciwgdGltZXN0YW1wLCBmbGFncywgb3JkaW5hbCk7CisgICAgd2hpbGUgKCFtU3Rhc2guZW1wdHkoKSAmJiBtU3Rhc2guc2l6ZSgpID4gbURlcHRoKSB7CisgICAgICAgIG1QZW5kaW5nLnB1c2hfYmFjayhtU3Rhc2guZnJvbnQoKSk7CisgICAgICAgIG1TdGFzaC5wb3BfZnJvbnQoKTsKKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpkZWZlcigKKyAgICAgICAgY29uc3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpFbnRyeSAmZW50cnkpIHsKKyAgICBtUGVuZGluZy5wdXNoX2Zyb250KGVudHJ5KTsKK30KKworYm9vbCBDQ29kZWNCdWZmZXJDaGFubmVsOjpSZW9yZGVyU3Rhc2g6Omhhc1BlbmRpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuICFtUGVuZGluZy5lbXB0eSgpOworfQorCitib29sIENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6bGVzcygKKyAgICAgICAgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCAmbzEsIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgJm8yKSB7CisgICAgc3dpdGNoIChtS2V5KSB7CisgICAgICAgIGNhc2UgQzJDb25maWc6Ok9SRElOQUw6ICAgcmV0dXJuIG8xLmZyYW1lSW5kZXggPCBvMi5mcmFtZUluZGV4OworICAgICAgICBjYXNlIEMyQ29uZmlnOjpUSU1FU1RBTVA6IHJldHVybiBvMS50aW1lc3RhbXAgPCBvMi50aW1lc3RhbXA7CisgICAgICAgIGNhc2UgQzJDb25maWc6OkNVU1RPTTogICAgcmV0dXJuIG8xLmN1c3RvbU9yZGluYWwgPCBvMi5jdXN0b21PcmRpbmFsOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0QoIlVucmVjb2duaXplZCBrZXk7IGRlZmF1bHQgdG8gdGltZXN0YW1wIik7CisgICAgICAgICAgICByZXR1cm4gbzEuZnJhbWVJbmRleCA8IG8yLmZyYW1lSW5kZXg7CisgICAgfQorfQorCisvLyBDQ29kZWNCdWZmZXJDaGFubmVsCisKK0NDb2RlY0J1ZmZlckNoYW5uZWw6OkNDb2RlY0J1ZmZlckNoYW5uZWwoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDQ29kZWNDYWxsYmFjaz4gJmNhbGxiYWNrKQorICAgIDogbUhlYXBTZXFOdW0oLTEpLAorICAgICAgbUNDb2RlY0NhbGxiYWNrKGNhbGxiYWNrKSwKKyAgICAgIG1GcmFtZUluZGV4KDB1KSwKKyAgICAgIG1GaXJzdFZhbGlkRnJhbWVJbmRleCgwdSksCisgICAgICBtTWV0YU1vZGUoTU9ERV9OT05FKSwKKyAgICAgIG1BdmFpbGFibGVQaXBlbGluZUNhcGFjaXR5KCksCisgICAgICBtSW5wdXRNZXRFb3MoZmFsc2UpIHsKKyAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobUlucHV0QnVmZmVycyk7CisgICAgYnVmZmVycy0+cmVzZXQobmV3IER1bW15SW5wdXRCdWZmZXJzKCIiKSk7Cit9CisKK0NDb2RlY0J1ZmZlckNoYW5uZWw6On5DQ29kZWNCdWZmZXJDaGFubmVsKCkgeworICAgIGlmIChtQ3J5cHRvICE9IG51bGxwdHIgJiYgbURlYWxlciAhPSBudWxscHRyICYmIG1IZWFwU2VxTnVtID49IDApIHsKKyAgICAgICAgbUNyeXB0by0+dW5zZXRIZWFwKG1IZWFwU2VxTnVtKTsKKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6c2V0Q29tcG9uZW50KAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wb25lbnQpIHsKKyAgICBtQ29tcG9uZW50ID0gY29tcG9uZW50OworICAgIG1Db21wb25lbnROYW1lID0gY29tcG9uZW50LT5nZXROYW1lKCkgKyBTdHJpbmdQcmludGYoIiMlZCIsIGludCh1aW50cHRyX3QoY29tcG9uZW50LmdldCgpKSAlIDk5NykpOworICAgIG1OYW1lID0gbUNvbXBvbmVudE5hbWUuY19zdHIoKTsKK30KKworc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6c2V0SW5wdXRTdXJmYWNlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlV3JhcHBlcj4gJnN1cmZhY2UpIHsKKyAgICBBTE9HVigiWyVzXSBzZXRJbnB1dFN1cmZhY2UiLCBtTmFtZSk7CisgICAgbUlucHV0U3VyZmFjZSA9IHN1cmZhY2U7CisgICAgcmV0dXJuIG1JbnB1dFN1cmZhY2UtPmNvbm5lY3QobUNvbXBvbmVudCk7Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSB7CisgICAgaWYgKG1JbnB1dFN1cmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHJldHVybiBtSW5wdXRTdXJmYWNlLT5zaWduYWxFbmRPZklucHV0U3RyZWFtKCk7Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnF1ZXVlSW5wdXRCdWZmZXJJbnRlcm5hbChjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgaW50NjRfdCB0aW1lVXM7CisgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworCisgICAgaWYgKG1JbnB1dE1ldEVvcykgeworICAgICAgICBBTE9HRCgiWyVzXSBidWZmZXJzIGFmdGVyIEVPUyBpZ25vcmVkICglbGxkIHVzKSIsIG1OYW1lLCAobG9uZyBsb25nKXRpbWVVcyk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpbnQzMl90IHRtcCA9IDA7CisgICAgYm9vbCBlb3MgPSBmYWxzZTsKKyAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiZW9zIiwgJnRtcCkgJiYgdG1wKSB7CisgICAgICAgIGVvcyA9IHRydWU7CisgICAgICAgIG1JbnB1dE1ldEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJbJXNdIGlucHV0IEVPUyIsIG1OYW1lKTsKKyAgICB9CisgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImNzZCIsICZ0bXApICYmIHRtcCkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUc7CisgICAgfQorICAgIEFMT0dWKCJbJXNdIHF1ZXVlSW5wdXRCdWZmZXI6IGJ1ZmZlci0+c2l6ZSgpID0gJXp1IiwgbU5hbWUsIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrKG5ldyBDMldvcmspOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gdGltZVVzOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IG1GcmFtZUluZGV4Kys7CisgICAgLy8gV09SS0FST1VORDogdW50aWwgY29kZWNzIHN1cHBvcnQgaGFuZGxpbmcgd29yayBhZnRlciBFT1MgYW5kIG1heCBvdXRwdXQgc2l6aW5nLCB1c2UgdGltZXN0YW1wCisgICAgLy8gbWFuaXB1bGF0aW9uIHRvIGFjaGlldmUgaW1hZ2UgZW5jb2RpbmcgdmlhIHZpZGVvIGNvZGVjLCBhbmQgdG8gY29uc3RyYWluIGVuY29kZWQgb3V0cHV0LgorICAgIC8vIEtlZXAgY2xpZW50IHRpbWVzdGFtcCBpbiBjdXN0b21PcmRpbmFsCisgICAgd29yay0+aW5wdXQub3JkaW5hbC5jdXN0b21PcmRpbmFsID0gdGltZVVzOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKworICAgIGlmIChidWZmZXItPnNpemUoKSA+IDB1KSB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtSW5wdXRCdWZmZXJzKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjMmJ1ZmZlcjsKKyAgICAgICAgaWYgKCEoKmJ1ZmZlcnMpLT5yZWxlYXNlQnVmZmVyKGJ1ZmZlciwgJmMyYnVmZmVyKSkgeworICAgICAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisgICAgICAgIH0KKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5wdXNoX2JhY2soYzJidWZmZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1BdmFpbGFibGVQaXBlbGluZUNhcGFjaXR5LmZyZWVJbnB1dFNsb3RzKDEsICJxdWV1ZUlucHV0QnVmZmVySW50ZXJuYWwiKTsKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgfQorICAgIH0KKyAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAvLyBUT0RPOiBmaWxsIGluZm8ncworCisgICAgd29yay0+aW5wdXQuY29uZmlnVXBkYXRlID0gc3RkOjptb3ZlKG1QYXJhbXNUb0JlU2V0KTsKKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUNvbXBvbmVudC0+cXVldWUoJml0ZW1zKTsKKworICAgIGlmIChlcnIgPT0gQzJfT0sgJiYgZW9zICYmIGJ1ZmZlci0+c2l6ZSgpID4gMHUpIHsKKyAgICAgICAgbUNDb2RlY0NhbGxiYWNrLT5vbldvcmtRdWV1ZWQoZmFsc2UpOworICAgICAgICB3b3JrLnJlc2V0KG5ldyBDMldvcmspOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IHRpbWVVczsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gbUZyYW1lSW5kZXgrKzsKKyAgICAgICAgLy8gV09SS0FST1VORDoga2VlcCBjbGllbnQgdGltZXN0YW1wIGluIGN1c3RvbU9yZGluYWwKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5jdXN0b21PcmRpbmFsID0gdGltZVVzOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPmlucHV0LmZsYWdzID0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKworICAgICAgICBpdGVtcy5jbGVhcigpOworICAgICAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+cXVldWUoJml0ZW1zKTsKKyAgICB9CisgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICBtQ0NvZGVjQ2FsbGJhY2stPm9uV29ya1F1ZXVlZChlb3MpOworICAgIH0KKworICAgIGZlZWRJbnB1dEJ1ZmZlcklmQXZhaWxhYmxlSW50ZXJuYWwoKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpzZXRQYXJhbWV0ZXJzKHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gJnBhcmFtcykgeworICAgIFF1ZXVlR3VhcmQgZ3VhcmQobVN5bmMpOworICAgIGlmICghZ3VhcmQuaXNSdW5uaW5nKCkpIHsKKyAgICAgICAgQUxPR0QoIlslc10gc2V0UGFyYW1ldGVycyBpcyBvbmx5IHN1cHBvcnRlZCBpbiB0aGUgcnVubmluZyBzdGF0ZS4iLCBtTmFtZSk7CisgICAgICAgIHJldHVybiAtRU5PU1lTOworICAgIH0KKyAgICBtUGFyYW1zVG9CZVNldC5pbnNlcnQobVBhcmFtc1RvQmVTZXQuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9tb3ZlX2l0ZXJhdG9yKHBhcmFtcy5iZWdpbigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX21vdmVfaXRlcmF0b3IocGFyYW1zLmVuZCgpKSk7CisgICAgcGFyYW1zLmNsZWFyKCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpxdWV1ZUlucHV0QnVmZmVyKGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBRdWV1ZUd1YXJkIGd1YXJkKG1TeW5jKTsKKyAgICBpZiAoIWd1YXJkLmlzUnVubmluZygpKSB7CisgICAgICAgIEFMT0dEKCJbJXNdIE5vIG1vcmUgYnVmZmVycyBzaG91bGQgYmUgcXVldWVkIGF0IGN1cnJlbnQgc3RhdGUuIiwgbU5hbWUpOworICAgICAgICByZXR1cm4gLUVOT1NZUzsKKyAgICB9CisgICAgcmV0dXJuIHF1ZXVlSW5wdXRCdWZmZXJJbnRlcm5hbChidWZmZXIpOworfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpxdWV1ZVNlY3VyZUlucHV0QnVmZmVyKAorICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLCBib29sIHNlY3VyZSwgY29uc3QgdWludDhfdCAqa2V5LAorICAgICAgICBjb25zdCB1aW50OF90ICppdiwgQ3J5cHRvUGx1Z2luOjpNb2RlIG1vZGUsIENyeXB0b1BsdWdpbjo6UGF0dGVybiBwYXR0ZXJuLAorICAgICAgICBjb25zdCBDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSAqc3ViU2FtcGxlcywgc2l6ZV90IG51bVN1YlNhbXBsZXMsCisgICAgICAgIEFTdHJpbmcgKmVycm9yRGV0YWlsTXNnKSB7CisgICAgUXVldWVHdWFyZCBndWFyZChtU3luYyk7CisgICAgaWYgKCFndWFyZC5pc1J1bm5pbmcoKSkgeworICAgICAgICBBTE9HRCgiWyVzXSBObyBtb3JlIGJ1ZmZlcnMgc2hvdWxkIGJlIHF1ZXVlZCBhdCBjdXJyZW50IHN0YXRlLiIsIG1OYW1lKTsKKyAgICAgICAgcmV0dXJuIC1FTk9TWVM7CisgICAgfQorCisgICAgaWYgKCFoYXNDcnlwdG9PckRlc2NyYW1ibGVyKCkpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9TWVM7CisgICAgfQorICAgIHNwPEVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyPiBlbmNyeXB0ZWRCdWZmZXIoKEVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyICopYnVmZmVyLmdldCgpKTsKKworICAgIHNzaXplX3QgcmVzdWx0ID0gLTE7CisgICAgc3NpemVfdCBjb2RlY0RhdGFPZmZzZXQgPSAwOworICAgIGlmIChtQ3J5cHRvICE9IG51bGxwdHIpIHsKKyAgICAgICAgSUNyeXB0bzo6RGVzdGluYXRpb25CdWZmZXIgZGVzdGluYXRpb247CisgICAgICAgIGlmIChzZWN1cmUpIHsKKyAgICAgICAgICAgIGRlc3RpbmF0aW9uLm1UeXBlID0gSUNyeXB0bzo6a0Rlc3RpbmF0aW9uVHlwZU5hdGl2ZUhhbmRsZTsKKyAgICAgICAgICAgIGRlc3RpbmF0aW9uLm1IYW5kbGUgPSBlbmNyeXB0ZWRCdWZmZXItPmhhbmRsZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVzdGluYXRpb24ubVR5cGUgPSBJQ3J5cHRvOjprRGVzdGluYXRpb25UeXBlU2hhcmVkTWVtb3J5OworICAgICAgICAgICAgZGVzdGluYXRpb24ubVNoYXJlZE1lbW9yeSA9IG1EZWNyeXB0RGVzdGluYXRpb247CisgICAgICAgIH0KKyAgICAgICAgSUNyeXB0bzo6U291cmNlQnVmZmVyIHNvdXJjZTsKKyAgICAgICAgZW5jcnlwdGVkQnVmZmVyLT5maWxsU291cmNlQnVmZmVyKCZzb3VyY2UpOworICAgICAgICByZXN1bHQgPSBtQ3J5cHRvLT5kZWNyeXB0KAorICAgICAgICAgICAgICAgIGtleSwgaXYsIG1vZGUsIHBhdHRlcm4sIHNvdXJjZSwgYnVmZmVyLT5vZmZzZXQoKSwKKyAgICAgICAgICAgICAgICBzdWJTYW1wbGVzLCBudW1TdWJTYW1wbGVzLCBkZXN0aW5hdGlvbiwgZXJyb3JEZXRhaWxNc2cpOworICAgICAgICBpZiAocmVzdWx0IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVzdGluYXRpb24ubVR5cGUgPT0gSUNyeXB0bzo6a0Rlc3RpbmF0aW9uVHlwZVNoYXJlZE1lbW9yeSkgeworICAgICAgICAgICAgZW5jcnlwdGVkQnVmZmVyLT5jb3B5RGVjcnlwdGVkQ29udGVudChtRGVjcnlwdERlc3RpbmF0aW9uLCByZXN1bHQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gSGVyZSB3ZSBjYXN0IENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlIHRvIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDo6U3ViU2FtcGxlCisgICAgICAgIC8vIGRpcmVjdGx5LCB0aGUgc3RydWN0dXJlIGRlZmluaXRpb25zIHNob3VsZCBtYXRjaCBhcyBjaGVja2VkIGluIERlc2NyYW1ibGVySW1wbC5jcHAuCisgICAgICAgIGhpZGxfdmVjPFN1YlNhbXBsZT4gaGlkbFN1YlNhbXBsZXM7CisgICAgICAgIGhpZGxTdWJTYW1wbGVzLnNldFRvRXh0ZXJuYWwoKFN1YlNhbXBsZSAqKXN1YlNhbXBsZXMsIG51bVN1YlNhbXBsZXMsIGZhbHNlIC8qb3duKi8pOworCisgICAgICAgIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDo6U2hhcmVkQnVmZmVyIHNyY0J1ZmZlcjsKKyAgICAgICAgZW5jcnlwdGVkQnVmZmVyLT5maWxsU291cmNlQnVmZmVyKCZzcmNCdWZmZXIpOworCisgICAgICAgIERlc3RpbmF0aW9uQnVmZmVyIGRzdEJ1ZmZlcjsKKyAgICAgICAgaWYgKHNlY3VyZSkgeworICAgICAgICAgICAgZHN0QnVmZmVyLnR5cGUgPSBCdWZmZXJUeXBlOjpOQVRJVkVfSEFORExFOworICAgICAgICAgICAgZHN0QnVmZmVyLnNlY3VyZU1lbW9yeSA9IGhpZGxfaGFuZGxlKGVuY3J5cHRlZEJ1ZmZlci0+aGFuZGxlKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZHN0QnVmZmVyLnR5cGUgPSBCdWZmZXJUeXBlOjpTSEFSRURfTUVNT1JZOworICAgICAgICAgICAgZHN0QnVmZmVyLm5vbnNlY3VyZU1lbW9yeSA9IHNyY0J1ZmZlcjsKKyAgICAgICAgfQorCisgICAgICAgIENhc1N0YXR1cyBzdGF0dXMgPSBDYXNTdGF0dXM6Ok9LOworICAgICAgICBoaWRsX3N0cmluZyBkZXRhaWxlZEVycm9yOworICAgICAgICBTY3JhbWJsaW5nQ29udHJvbCBzY3RybCA9IFNjcmFtYmxpbmdDb250cm9sOjpVTlNDUkFNQkxFRDsKKworICAgICAgICBpZiAoa2V5ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNjdHJsID0gKFNjcmFtYmxpbmdDb250cm9sKWtleVswXTsKKyAgICAgICAgICAgIC8vIEFkanVzdCBmb3IgdGhlIFBFUyBvZmZzZXQKKyAgICAgICAgICAgIGNvZGVjRGF0YU9mZnNldCA9IGtleVsyXSB8IChrZXlbM10gPDwgOCk7CisgICAgICAgIH0KKworICAgICAgICBhdXRvIHJldHVyblZvaWQgPSBtRGVzY3JhbWJsZXItPmRlc2NyYW1ibGUoCisgICAgICAgICAgICAgICAgc2N0cmwsCisgICAgICAgICAgICAgICAgaGlkbFN1YlNhbXBsZXMsCisgICAgICAgICAgICAgICAgc3JjQnVmZmVyLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZyZXN1bHQsICZkZXRhaWxlZEVycm9yXSAoCisgICAgICAgICAgICAgICAgICAgICAgICBDYXNTdGF0dXMgX3N0YXR1cywgdWludDMyX3QgX2J5dGVzV3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBfZGV0YWlsZWRFcnJvcikgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBfc3RhdHVzOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAoc3NpemVfdClfYnl0ZXNXcml0dGVuOworICAgICAgICAgICAgICAgICAgICBkZXRhaWxlZEVycm9yID0gX2RldGFpbGVkRXJyb3I7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgaWYgKCFyZXR1cm5Wb2lkLmlzT2soKSB8fCBzdGF0dXMgIT0gQ2FzU3RhdHVzOjpPSyB8fCByZXN1bHQgPCAwKSB7CisgICAgICAgICAgICBBTE9HSSgiWyVzXSBkZXNjcmFtYmxlIGZhaWxlZCwgdHJhbnM9JXMsIHN0YXR1cz0lZCwgcmVzdWx0PSV6ZCIsCisgICAgICAgICAgICAgICAgICAgIG1OYW1lLCByZXR1cm5Wb2lkLmRlc2NyaXB0aW9uKCkuY19zdHIoKSwgc3RhdHVzLCByZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzdWx0IDwgY29kZWNEYXRhT2Zmc2V0KSB7CisgICAgICAgICAgICBBTE9HRCgiaW52YWxpZCBjb2RlYyBkYXRhIG9mZnNldDogJXpkLCByZXN1bHQgJXpkIiwgY29kZWNEYXRhT2Zmc2V0LCByZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJbJXNdIGRlc2NyYW1ibGUgc3VjY2VlZGVkLCAlemQgYnl0ZXMiLCBtTmFtZSwgcmVzdWx0KTsKKworICAgICAgICBpZiAoZHN0QnVmZmVyLnR5cGUgPT0gQnVmZmVyVHlwZTo6U0hBUkVEX01FTU9SWSkgeworICAgICAgICAgICAgZW5jcnlwdGVkQnVmZmVyLT5jb3B5RGVjcnlwdGVkQ29udGVudEZyb21NZW1vcnkocmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJ1ZmZlci0+c2V0UmFuZ2UoY29kZWNEYXRhT2Zmc2V0LCByZXN1bHQgLSBjb2RlY0RhdGFPZmZzZXQpOworICAgIHJldHVybiBxdWV1ZUlucHV0QnVmZmVySW50ZXJuYWwoYnVmZmVyKTsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZSgpIHsKKyAgICBRdWV1ZUd1YXJkIGd1YXJkKG1TeW5jKTsKKyAgICBpZiAoIWd1YXJkLmlzUnVubmluZygpKSB7CisgICAgICAgIEFMT0dWKCJbJXNdIFdlJ3JlIG5vdCBydW5uaW5nIC0tLSBubyBpbnB1dCBidWZmZXIgcmVwb3J0ZWQiLCBtTmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGVJbnRlcm5hbCgpOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OmZlZWRJbnB1dEJ1ZmZlcklmQXZhaWxhYmxlSW50ZXJuYWwoKSB7CisgICAgd2hpbGUgKCFtSW5wdXRNZXRFb3MgJiYKKyAgICAgICAgICAgIW1SZW9yZGVyU3Rhc2gubG9jaygpLT5oYXNQZW5kaW5nKCkgJiYKKyAgICAgICAgICAgbUF2YWlsYWJsZVBpcGVsaW5lQ2FwYWNpdHkuYWxsb2NhdGUoImZlZWRJbnB1dEJ1ZmZlcklmQXZhaWxhYmxlIikpIHsKKyAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gaW5CdWZmZXI7CisgICAgICAgIHNpemVfdCBpbmRleDsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1JbnB1dEJ1ZmZlcnMpOworICAgICAgICAgICAgaWYgKCEoKmJ1ZmZlcnMpLT5yZXF1ZXN0TmV3QnVmZmVyKCZpbmRleCwgJmluQnVmZmVyKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIG5vIG5ldyBidWZmZXIgYXZhaWxhYmxlIiwgbU5hbWUpOworICAgICAgICAgICAgICAgIG1BdmFpbGFibGVQaXBlbGluZUNhcGFjaXR5LmZyZWUoImZlZWRJbnB1dEJ1ZmZlcklmQXZhaWxhYmxlIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIlslc10gbmV3IGlucHV0IGluZGV4ID0gJXp1IFslcF0iLCBtTmFtZSwgaW5kZXgsIGluQnVmZmVyLmdldCgpKTsKKyAgICAgICAgbUNhbGxiYWNrLT5vbklucHV0QnVmZmVyQXZhaWxhYmxlKGluZGV4LCBpbkJ1ZmZlcik7CisgICAgfQorfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpyZW5kZXJPdXRwdXRCdWZmZXIoCisgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsIGludDY0X3QgdGltZXN0YW1wTnMpIHsKKyAgICBBTE9HVigiWyVzXSByZW5kZXJPdXRwdXRCdWZmZXI6ICVwIiwgbU5hbWUsIGJ1ZmZlci5nZXQoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjMkJ1ZmZlcjsKKyAgICBib29sIHJlbGVhc2VkID0gZmFsc2U7CisgICAgeworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1PdXRwdXRCdWZmZXJzKTsKKyAgICAgICAgaWYgKCpidWZmZXJzKSB7CisgICAgICAgICAgICByZWxlYXNlZCA9ICgqYnVmZmVycyktPnJlbGVhc2VCdWZmZXIoYnVmZmVyLCAmYzJCdWZmZXIpOworICAgICAgICB9CisgICAgfQorICAgIC8vIE5PVEU6IHNvbWUgYXBwcyB0cnkgdG8gcmVsZWFzZU91dHB1dEJ1ZmZlcigpIHdpdGggdGltZXN0YW1wIGFuZC9vciByZW5kZXIKKyAgICAvLyAgICAgICBzZXQgdG8gdHJ1ZS4KKyAgICBzZW5kT3V0cHV0QnVmZmVycygpOworICAgIC8vIGlucHV0IGJ1ZmZlciBmZWVkaW5nIG1heSBoYXZlIGJlZW4gZ2F0ZWQgYnkgcGVuZGluZyBvdXRwdXQgYnVmZmVycworICAgIGZlZWRJbnB1dEJ1ZmZlcklmQXZhaWxhYmxlKCk7CisgICAgaWYgKCFjMkJ1ZmZlcikgeworICAgICAgICBpZiAocmVsZWFzZWQpIHsKKyAgICAgICAgICAgIEFMT0dEKCJbJXNdIFRoZSBhcHAgaXMgY2FsbGluZyByZWxlYXNlT3V0cHV0QnVmZmVyKCkgd2l0aCAiCisgICAgICAgICAgICAgICAgICAidGltZXN0YW1wIG9yIHJlbmRlcj10cnVlIHdpdGggbm9uLXZpZGVvIGJ1ZmZlcnMuIEFwcHMgc2hvdWxkICIKKyAgICAgICAgICAgICAgICAgICJjYWxsIHJlbGVhc2VPdXRwdXRCdWZmZXIoKSB3aXRoIHJlbmRlcj1mYWxzZSBmb3IgdGhvc2UuIiwKKyAgICAgICAgICAgICAgICAgIG1OYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisjaWYgMAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+PiBpbmZvUGFyYW1zID0gYzJCdWZmZXItPmluZm8oKTsKKyAgICBBTE9HVigiWyVzXSBxdWV1aW5nIGdmeCBidWZmZXIgd2l0aCAlenUgaW5mb3MiLCBtTmFtZSwgaW5mb1BhcmFtcy5zaXplKCkpOworICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4gJmluZm8gOiBpbmZvUGFyYW1zKSB7CisgICAgICAgIEFTdHJpbmcgcmVzOworICAgICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4ICsgMyA8IGluZm8tPnNpemUoKTsgaXggKz0gNCkgeworICAgICAgICAgICAgaWYgKGl4KSByZXMuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgcmVzLmFwcGVuZCgqKChpbnQzMl90KilpbmZvLmdldCgpICsgKGl4IC8gNCkpKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiICBbJXNdIiwgcmVzLmNfc3RyKCkpOworICAgIH0KKyNlbmRpZgorICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlN0cmVhbVJvdGF0aW9uSW5mbzo6b3V0cHV0PiByb3RhdGlvbiA9CisgICAgICAgIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxjb25zdCBDMlN0cmVhbVJvdGF0aW9uSW5mbzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICBjMkJ1ZmZlci0+Z2V0SW5mbyhDMlN0cmVhbVJvdGF0aW9uSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKSk7CisgICAgYm9vbCBmbGlwID0gcm90YXRpb24gJiYgKHJvdGF0aW9uLT5mbGlwICYgMSk7CisgICAgdWludDMyX3QgcXVhcnRlcnMgPSAoKHJvdGF0aW9uID8gcm90YXRpb24tPnZhbHVlIDogMCkgLyA5MCkgJiAzOworICAgIHVpbnQzMl90IHRyYW5zZm9ybSA9IDA7CisgICAgc3dpdGNoIChxdWFydGVycykgeworICAgICAgICBjYXNlIDA6IC8vIG5vIHJvdGF0aW9uCisgICAgICAgICAgICB0cmFuc2Zvcm0gPSBmbGlwID8gSEFMX1RSQU5TRk9STV9GTElQX0ggOiAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTogLy8gOTAgZGVncmVlcyBjb3VudGVyLWNsb2Nrd2lzZQorICAgICAgICAgICAgdHJhbnNmb3JtID0gZmxpcCA/IChIQUxfVFJBTlNGT1JNX0ZMSVBfViB8IEhBTF9UUkFOU0ZPUk1fUk9UXzkwKQorICAgICAgICAgICAgICAgICAgICA6IEhBTF9UUkFOU0ZPUk1fUk9UXzI3MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6IC8vIDE4MCBkZWdyZWVzCisgICAgICAgICAgICB0cmFuc2Zvcm0gPSBmbGlwID8gSEFMX1RSQU5TRk9STV9GTElQX1YgOiBIQUxfVFJBTlNGT1JNX1JPVF8xODA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOiAvLyA5MCBkZWdyZWVzIGNsb2Nrd2lzZQorICAgICAgICAgICAgdHJhbnNmb3JtID0gZmxpcCA/IChIQUxfVFJBTlNGT1JNX0ZMSVBfSCB8IEhBTF9UUkFOU0ZPUk1fUk9UXzkwKQorICAgICAgICAgICAgICAgICAgICA6IEhBTF9UUkFOU0ZPUk1fUk9UXzkwOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyU3RyZWFtU3VyZmFjZVNjYWxpbmdJbmZvOjpvdXRwdXQ+IHN1cmZhY2VTY2FsaW5nID0KKyAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PGNvbnN0IEMyU3RyZWFtU3VyZmFjZVNjYWxpbmdJbmZvOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgIGMyQnVmZmVyLT5nZXRJbmZvKEMyU3RyZWFtU3VyZmFjZVNjYWxpbmdJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUpKTsKKyAgICB1aW50MzJfdCB2aWRlb1NjYWxpbmdNb2RlID0gTkFUSVZFX1dJTkRPV19TQ0FMSU5HX01PREVfU0NBTEVfVE9fV0lORE9XOworICAgIGlmIChzdXJmYWNlU2NhbGluZykgeworICAgICAgICB2aWRlb1NjYWxpbmdNb2RlID0gc3VyZmFjZVNjYWxpbmctPnZhbHVlOworICAgIH0KKworICAgIC8vIFVzZSBkYXRhc3BhY2UgZnJvbSBmb3JtYXQgYXMgaXQgaGFzIHRoZSBkZWZhdWx0IGFzcGVjdHMgYWxyZWFkeSBhcHBsaWVkCisgICAgYW5kcm9pZF9kYXRhc3BhY2VfdCBkYXRhU3BhY2UgPSBIQUxfREFUQVNQQUNFX1VOS05PV047IC8vIHRoaXMgaXMgMAorICAgICh2b2lkKWJ1ZmZlci0+Zm9ybWF0KCktPmZpbmRJbnQzMigiYW5kcm9pZC5fZGF0YXNwYWNlIiwgKGludDMyX3QgKikmZGF0YVNwYWNlKTsKKworICAgIC8vIEhEUiBzdGF0aWMgaW5mbworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlN0cmVhbUhkclN0YXRpY0luZm86Om91dHB1dD4gaGRyU3RhdGljSW5mbyA9CisgICAgICAgIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxjb25zdCBDMlN0cmVhbUhkclN0YXRpY0luZm86Om91dHB1dD4oCisgICAgICAgICAgICAgICAgYzJCdWZmZXItPmdldEluZm8oQzJTdHJlYW1IZHJTdGF0aWNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUpKTsKKworICAgIC8vIEhEUjEwIHBsdXMgaW5mbworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlN0cmVhbUhkcjEwUGx1c0luZm86Om91dHB1dD4gaGRyMTBQbHVzSW5mbyA9CisgICAgICAgIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxjb25zdCBDMlN0cmVhbUhkcjEwUGx1c0luZm86Om91dHB1dD4oCisgICAgICAgICAgICAgICAgYzJCdWZmZXItPmdldEluZm8oQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUpKTsKKworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxPdXRwdXRTdXJmYWNlPjo6TG9ja2VkIG91dHB1dChtT3V0cHV0U3VyZmFjZSk7CisgICAgICAgIGlmIChvdXRwdXQtPnN1cmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0koIlslc10gY2Fubm90IHJlbmRlciBidWZmZXIgd2l0aG91dCBzdXJmYWNlIiwgbU5hbWUpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gYmxvY2tzID0gYzJCdWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCk7CisgICAgaWYgKGJsb2Nrcy5zaXplKCkgIT0gMXUpIHsKKyAgICAgICAgQUxPR0QoIlslc10gZXhwZWN0ZWQgMSBncmFwaGljIGJsb2NrLCBidXQgZ290ICV6dSIsIG1OYW1lLCBibG9ja3Muc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2sgJmJsb2NrID0gYmxvY2tzLmZyb250KCk7CisKKyAgICAvLyBUT0RPOiByZXZpc2l0IHRoaXMgYWZ0ZXIgQzJGZW5jZSBpbXBsZW1lbnRhdGlvbi4KKyAgICBhbmRyb2lkOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0IHFiaSgKKyAgICAgICAgICAgIHRpbWVzdGFtcE5zLAorICAgICAgICAgICAgZmFsc2UsIC8vIGRyb3BwYWJsZQorICAgICAgICAgICAgZGF0YVNwYWNlLAorICAgICAgICAgICAgUmVjdChibG9ja3MuZnJvbnQoKS5jcm9wKCkubGVmdCwKKyAgICAgICAgICAgICAgICAgYmxvY2tzLmZyb250KCkuY3JvcCgpLnRvcCwKKyAgICAgICAgICAgICAgICAgYmxvY2tzLmZyb250KCkuY3JvcCgpLnJpZ2h0KCksCisgICAgICAgICAgICAgICAgIGJsb2Nrcy5mcm9udCgpLmNyb3AoKS5ib3R0b20oKSksCisgICAgICAgICAgICB2aWRlb1NjYWxpbmdNb2RlLAorICAgICAgICAgICAgdHJhbnNmb3JtLAorICAgICAgICAgICAgRmVuY2U6Ok5PX0ZFTkNFLCAwKTsKKyAgICBpZiAoaGRyU3RhdGljSW5mbyB8fCBoZHIxMFBsdXNJbmZvKSB7CisgICAgICAgIEhkck1ldGFkYXRhIGhkcjsKKyAgICAgICAgaWYgKGhkclN0YXRpY0luZm8pIHsKKyAgICAgICAgICAgIHN0cnVjdCBhbmRyb2lkX3NtcHRlMjA4Nl9tZXRhZGF0YSBzbXB0ZTIwODZfbWV0YSA9IHsKKyAgICAgICAgICAgICAgICAuZGlzcGxheVByaW1hcnlSZWQgPSB7CisgICAgICAgICAgICAgICAgICAgIGhkclN0YXRpY0luZm8tPm1hc3RlcmluZy5yZWQueCwgaGRyU3RhdGljSW5mby0+bWFzdGVyaW5nLnJlZC55CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAuZGlzcGxheVByaW1hcnlHcmVlbiA9IHsKKyAgICAgICAgICAgICAgICAgICAgaGRyU3RhdGljSW5mby0+bWFzdGVyaW5nLmdyZWVuLngsIGhkclN0YXRpY0luZm8tPm1hc3RlcmluZy5ncmVlbi55CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAuZGlzcGxheVByaW1hcnlCbHVlID0geworICAgICAgICAgICAgICAgICAgICBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcuYmx1ZS54LCBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcuYmx1ZS55CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAud2hpdGVQb2ludCA9IHsKKyAgICAgICAgICAgICAgICAgICAgaGRyU3RhdGljSW5mby0+bWFzdGVyaW5nLndoaXRlLngsIGhkclN0YXRpY0luZm8tPm1hc3RlcmluZy53aGl0ZS55CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAubWF4THVtaW5hbmNlID0gaGRyU3RhdGljSW5mby0+bWFzdGVyaW5nLm1heEx1bWluYW5jZSwKKyAgICAgICAgICAgICAgICAubWluTHVtaW5hbmNlID0gaGRyU3RhdGljSW5mby0+bWFzdGVyaW5nLm1pbkx1bWluYW5jZSwKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHN0cnVjdCBhbmRyb2lkX2N0YTg2MV8zX21ldGFkYXRhIGN0YTg2MV9tZXRhID0geworICAgICAgICAgICAgICAgIC5tYXhDb250ZW50TGlnaHRMZXZlbCA9IGhkclN0YXRpY0luZm8tPm1heENsbCwKKyAgICAgICAgICAgICAgICAubWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbCA9IGhkclN0YXRpY0luZm8tPm1heEZhbGwsCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBoZHIudmFsaWRUeXBlcyA9IEhkck1ldGFkYXRhOjpTTVBURTIwODYgfCBIZHJNZXRhZGF0YTo6Q1RBODYxXzM7CisgICAgICAgICAgICBoZHIuc21wdGUyMDg2ID0gc21wdGUyMDg2X21ldGE7CisgICAgICAgICAgICBoZHIuY3RhODYxMyA9IGN0YTg2MV9tZXRhOworICAgICAgICB9CisgICAgICAgIGlmIChoZHIxMFBsdXNJbmZvKSB7CisgICAgICAgICAgICBoZHIudmFsaWRUeXBlcyB8PSBIZHJNZXRhZGF0YTo6SERSMTBQTFVTOworICAgICAgICAgICAgaGRyLmhkcjEwcGx1cy5hc3NpZ24oCisgICAgICAgICAgICAgICAgICAgIGhkcjEwUGx1c0luZm8tPm0udmFsdWUsCisgICAgICAgICAgICAgICAgICAgIGhkcjEwUGx1c0luZm8tPm0udmFsdWUgKyBoZHIxMFBsdXNJbmZvLT5mbGV4Q291bnQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcWJpLnNldEhkck1ldGFkYXRhKGhkcik7CisgICAgfQorICAgIC8vIHdlIGRvbid0IGhhdmUgZGlydHkgcmVnaW9ucworICAgIHFiaS5zZXRTdXJmYWNlRGFtYWdlKFJlZ2lvbjo6SU5WQUxJRF9SRUdJT04pOworICAgIGFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IHFibzsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBtQ29tcG9uZW50LT5xdWV1ZVRvT3V0cHV0U3VyZmFjZShibG9jaywgcWJpLCAmcWJvKTsKKyAgICBpZiAocmVzdWx0ICE9IE9LKSB7CisgICAgICAgIEFMT0dJKCJbJXNdIHF1ZXVlQnVmZmVyIGZhaWxlZDogJWQiLCBtTmFtZSwgcmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgQUxPR1YoIlslc10gcXVldWUgYnVmZmVyIHN1Y2Nlc3NmdWwiLCBtTmFtZSk7CisKKyAgICBpbnQ2NF90IG1lZGlhVGltZVVzID0gMDsKKyAgICAodm9pZClidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpOworICAgIG1DQ29kZWNDYWxsYmFjay0+b25PdXRwdXRGcmFtZXNSZW5kZXJlZChtZWRpYVRpbWVVcywgdGltZXN0YW1wTnMpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpkaXNjYXJkQnVmZmVyKGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBBTE9HVigiWyVzXSBkaXNjYXJkQnVmZmVyOiAlcCIsIG1OYW1lLCBidWZmZXIuZ2V0KCkpOworICAgIGJvb2wgcmVsZWFzZWQgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtSW5wdXRCdWZmZXJzKTsKKyAgICAgICAgaWYgKCpidWZmZXJzICYmICgqYnVmZmVycyktPnJlbGVhc2VCdWZmZXIoYnVmZmVyLCBudWxscHRyKSkgeworICAgICAgICAgICAgYnVmZmVycy51bmxvY2soKTsKKyAgICAgICAgICAgIHJlbGVhc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIG1BdmFpbGFibGVQaXBlbGluZUNhcGFjaXR5LmZyZWVJbnB1dFNsb3RzKDEsICJkaXNjYXJkQnVmZmVyIik7CisgICAgICAgIH0KKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1PdXRwdXRCdWZmZXJzKTsKKyAgICAgICAgaWYgKCpidWZmZXJzICYmICgqYnVmZmVycyktPnJlbGVhc2VCdWZmZXIoYnVmZmVyLCBudWxscHRyKSkgeworICAgICAgICAgICAgYnVmZmVycy51bmxvY2soKTsKKyAgICAgICAgICAgIHJlbGVhc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocmVsZWFzZWQpIHsKKyAgICAgICAgc2VuZE91dHB1dEJ1ZmZlcnMoKTsKKyAgICAgICAgZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRCgiWyVzXSBNZWRpYUNvZGVjIGRpc2NhcmRlZCBhbiB1bmtub3duIGJ1ZmZlciIsIG1OYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OmdldElucHV0QnVmZmVyQXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpIHsKKyAgICBhcnJheS0+Y2xlYXIoKTsKKyAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobUlucHV0QnVmZmVycyk7CisKKyAgICBpZiAoISgqYnVmZmVycyktPmlzQXJyYXlNb2RlKCkpIHsKKyAgICAgICAgKmJ1ZmZlcnMgPSAoKmJ1ZmZlcnMpLT50b0FycmF5TW9kZShrTWluSW5wdXRCdWZmZXJBcnJheVNpemUpOworICAgIH0KKworICAgICgqYnVmZmVycyktPmdldEFycmF5KGFycmF5KTsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpnZXRPdXRwdXRCdWZmZXJBcnJheShWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICphcnJheSkgeworICAgIGFycmF5LT5jbGVhcigpOworICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobU91dHB1dEJ1ZmZlcnMpOworCisgICAgaWYgKCEoKmJ1ZmZlcnMpLT5pc0FycmF5TW9kZSgpKSB7CisgICAgICAgICpidWZmZXJzID0gKCpidWZmZXJzKS0+dG9BcnJheU1vZGUoa01pbk91dHB1dEJ1ZmZlckFycmF5U2l6ZSk7CisgICAgfQorCisgICAgKCpidWZmZXJzKS0+Z2V0QXJyYXkoYXJyYXkpOworfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpzdGFydCgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZpbnB1dEZvcm1hdCwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQpIHsKKyAgICBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCBpU3RyZWFtRm9ybWF0KDB1KTsKKyAgICBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQgb1N0cmVhbUZvcm1hdCgwdSk7CisgICAgQzJQb3J0UmVvcmRlckJ1ZmZlckRlcHRoVHVuaW5nOjpvdXRwdXQgcmVvcmRlckRlcHRoOworICAgIEMyUG9ydFJlb3JkZXJLZXlTZXR0aW5nOjpvdXRwdXQgcmVvcmRlcktleTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQ29tcG9uZW50LT5xdWVyeSgKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAmaVN0cmVhbUZvcm1hdCwKKyAgICAgICAgICAgICAgICAmb1N0cmVhbUZvcm1hdCwKKyAgICAgICAgICAgICAgICAmcmVvcmRlckRlcHRoLAorICAgICAgICAgICAgICAgICZyZW9yZGVyS2V5LAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHt9LAorICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywKKyAgICAgICAgICAgIG51bGxwdHIpOworICAgIGlmIChlcnIgPT0gQzJfQkFEX0lOREVYKSB7CisgICAgICAgIGlmICghaVN0cmVhbUZvcm1hdCB8fCAhb1N0cmVhbUZvcm1hdCkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8UmVvcmRlclN0YXNoPjo6TG9ja2VkIHJlb3JkZXIobVJlb3JkZXJTdGFzaCk7CisgICAgICAgIHJlb3JkZXItPmNsZWFyKCk7CisgICAgICAgIGlmIChyZW9yZGVyRGVwdGgpIHsKKyAgICAgICAgICAgIHJlb3JkZXItPnNldERlcHRoKHJlb3JkZXJEZXB0aC52YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlb3JkZXJLZXkpIHsKKyAgICAgICAgICAgIHJlb3JkZXItPnNldEtleShyZW9yZGVyS2V5LnZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBUT0RPOiBnZXQgdGhpcyBmcm9tIGlucHV0IGZvcm1hdAorICAgIGJvb2wgc2VjdXJlID0gbUNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoIi5zZWN1cmUiKSAhPSBzdGQ6OnN0cmluZzo6bnBvczsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBhbGxvY2F0b3JTdG9yZSA9IEdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKyAgICBpbnQgcG9vbE1hc2sgPSBwcm9wZXJ0eV9nZXRfaW50MzIoCisgICAgICAgICAgICAiZGVidWcuc3RhZ2VmcmlnaHQuYzItcG9vbG1hc2siLAorICAgICAgICAgICAgMSA8PCBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OklPTiB8CisgICAgICAgICAgICAxIDw8IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QlVGRkVSUVVFVUUpOworCisgICAgaWYgKGlucHV0Rm9ybWF0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgYm9vbCBncmFwaGljID0gKGlTdHJlYW1Gb3JtYXQudmFsdWUgPT0gQzJGb3JtYXRWaWRlbyk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcG9vbDsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhlZDxCbG9ja1Bvb2xzPjo6TG9ja2VkIHBvb2xzKG1CbG9ja1Bvb2xzKTsKKworICAgICAgICAgICAgLy8gc2V0IGRlZmF1bHQgYWxsb2NhdG9yIElELgorICAgICAgICAgICAgcG9vbHMtPmlucHV0QWxsb2NhdG9ySWQgPSAoZ3JhcGhpYykgPyBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkdSQUxMT0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpJT047CisKKyAgICAgICAgICAgIC8vIHF1ZXJ5IEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0IGZyb20gY29tcG9uZW50LiBJZiBhbiBhbGxvY2F0b3IgSUQgaXMgb2J0YWluZWQKKyAgICAgICAgICAgIC8vIGZyb20gY29tcG9uZW50LCBjcmVhdGUgdGhlIGlucHV0IGJsb2NrIHBvb2wgd2l0aCBnaXZlbiBJRC4gT3RoZXJ3aXNlLCB1c2UgZGVmYXVsdCBJRHMuCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHBhcmFtczsKKyAgICAgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5KHsgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zKTsKKyAgICAgICAgICAgIGlmICgoZXJyICE9IEMyX09LICYmIGVyciAhPSBDMl9CQURfSU5ERVgpIHx8IHBhcmFtcy5zaXplKCkgIT0gMSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIFF1ZXJ5IGlucHV0IGFsbG9jYXRvcnMgcmV0dXJuZWQgJXp1IHBhcmFtcyA9PiAlcyAoJXUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBwYXJhbXMuc2l6ZSgpLCBhc1N0cmluZyhlcnIpLCBlcnIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gQzJfT0sgJiYgcGFyYW1zLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQgKmlucHV0QWxsb2NhdG9ycyA9CisgICAgICAgICAgICAgICAgICAgIEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0OjpGcm9tKHBhcmFtc1swXS5nZXQoKSk7CisgICAgICAgICAgICAgICAgaWYgKGlucHV0QWxsb2NhdG9ycyAmJiBpbnB1dEFsbG9jYXRvcnMtPmZsZXhDb3VudCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jYXRvcjsKKyAgICAgICAgICAgICAgICAgICAgLy8gdmVyaWZ5IGFsbG9jYXRvciBJRHMgYW5kIHJlc29sdmUgZGVmYXVsdCBhbGxvY2F0b3IKKyAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKGlucHV0QWxsb2NhdG9ycy0+bS52YWx1ZXNbMF0sICZhbGxvY2F0b3IpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb2NhdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb29scy0+aW5wdXRBbGxvY2F0b3JJZCA9IGFsbG9jYXRvci0+Z2V0SWQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIGNvbXBvbmVudCByZXF1ZXN0ZWQgaW52YWxpZCBpbnB1dCBhbGxvY2F0b3IgSUQgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgaW5wdXRBbGxvY2F0b3JzLT5tLnZhbHVlc1swXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE86IHVzZSBDMkNvbXBvbmVudCB3cmFwcGVyIHRvIGFzc29jaWF0ZSB0aGlzIHBvb2wgd2l0aCBvdXJzZWx2ZXMKKyAgICAgICAgICAgIGlmICgocG9vbE1hc2sgPj4gcG9vbHMtPmlucHV0QWxsb2NhdG9ySWQpICYgMSkgeworICAgICAgICAgICAgICAgIGVyciA9IENyZWF0ZUNvZGVjMkJsb2NrUG9vbChwb29scy0+aW5wdXRBbGxvY2F0b3JJZCwgbnVsbHB0ciwgJnBvb2wpOworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIENyZWF0ZWQgaW5wdXQgYmxvY2sgcG9vbCB3aXRoIGFsbG9jYXRvcklEICV1ID0+IHBvb2xJRCAlbGx1IC0gJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcG9vbHMtPmlucHV0QWxsb2NhdG9ySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKShwb29sID8gcG9vbC0+Z2V0TG9jYWxJZCgpIDogMTExMDAwMTExKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKGVyciksIGVycik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVyciA9IEMyX05PVF9GT1VORDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBpbnB1dFBvb2xJZCA9CisgICAgICAgICAgICAgICAgICAgIGdyYXBoaWMgPyBDMkJsb2NrUG9vbDo6QkFTSUNfR1JBUEhJQyA6IEMyQmxvY2tQb29sOjpCQVNJQ19MSU5FQVI7CisgICAgICAgICAgICAgICAgZXJyID0gR2V0Q29kZWMyQmxvY2tQb29sKGlucHV0UG9vbElkLCBudWxscHRyLCAmcG9vbCk7CisgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gVXNpbmcgYmFzaWMgaW5wdXQgYmxvY2sgcG9vbCB3aXRoIHBvb2xJRCAlbGx1ID0+IGdvdCAlbGx1IC0gJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgKHVuc2lnbmVkIGxvbmcgbG9uZylpbnB1dFBvb2xJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpKHBvb2wgPyBwb29sLT5nZXRMb2NhbElkKCkgOiAxMTEwMDAxMTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcoZXJyKSwgZXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9vbHMtPmlucHV0UG9vbCA9IHBvb2w7CisgICAgICAgIH0KKworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobUlucHV0QnVmZmVycyk7CisgICAgICAgIGlmIChncmFwaGljKSB7CisgICAgICAgICAgICBpZiAobUlucHV0U3VyZmFjZSkgeworICAgICAgICAgICAgICAgIGJ1ZmZlcnMtPnJlc2V0KG5ldyBEdW1teUlucHV0QnVmZmVycyhtTmFtZSkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtTWV0YU1vZGUgPT0gTU9ERV9BTlcpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJzLT5yZXNldChuZXcgR3JhcGhpY01ldGFkYXRhSW5wdXRCdWZmZXJzKG1OYW1lKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ1ZmZlcnMtPnJlc2V0KG5ldyBHcmFwaGljSW5wdXRCdWZmZXJzKG1OYW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaGFzQ3J5cHRvT3JEZXNjcmFtYmxlcigpKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBjYXBhY2l0eSA9IGtMaW5lYXJCdWZmZXJTaXplOworICAgICAgICAgICAgICAgICh2b2lkKWlucHV0Rm9ybWF0LT5maW5kSW50MzIoS0VZX01BWF9JTlBVVF9TSVpFLCAmY2FwYWNpdHkpOworICAgICAgICAgICAgICAgIGlmICgoc2l6ZV90KWNhcGFjaXR5ID4ga01heExpbmVhckJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoImNsaWVudCByZXF1ZXN0ZWQgJWQsIGNhcHBlZCB0byAlenUiLCBjYXBhY2l0eSwga01heExpbmVhckJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eSA9IGtNYXhMaW5lYXJCdWZmZXJTaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobURlYWxlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIG1EZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduKGNhcGFjaXR5LCBNZW1vcnlEZWFsZXI6OmdldEFsbG9jYXRpb25BbGlnbm1lbnQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoa01pbklucHV0QnVmZmVyQXJyYXlTaXplICsgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuY3J5cHRlZExpbmVhcklucHV0QnVmZmVycyIpOworICAgICAgICAgICAgICAgICAgICBtRGVjcnlwdERlc3RpbmF0aW9uID0gbURlYWxlci0+YWxsb2NhdGUoKHNpemVfdCljYXBhY2l0eSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtQ3J5cHRvICE9IG51bGxwdHIgJiYgbUhlYXBTZXFOdW0gPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1IZWFwU2VxTnVtID0gbUNyeXB0by0+c2V0SGVhcChtRGVhbGVyLT5nZXRNZW1vcnlIZWFwKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1IZWFwU2VxTnVtID0gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1ZmZlcnMtPnJlc2V0KG5ldyBFbmNyeXB0ZWRMaW5lYXJJbnB1dEJ1ZmZlcnMoCisgICAgICAgICAgICAgICAgICAgICAgICBzZWN1cmUsIG1EZWFsZXIsIG1DcnlwdG8sIG1IZWFwU2VxTnVtLCAoc2l6ZV90KWNhcGFjaXR5LCBtTmFtZSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWZmZXJzLT5yZXNldChuZXcgTGluZWFySW5wdXRCdWZmZXJzKG1OYW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKCpidWZmZXJzKS0+c2V0Rm9ybWF0KGlucHV0Rm9ybWF0KTsKKworICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICAoKmJ1ZmZlcnMpLT5zZXRQb29sKHBvb2wpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvdXRwdXRGb3JtYXQgIT0gbnVsbHB0cikgeworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBvdXRwdXRTdXJmYWNlOworICAgICAgICB1aW50MzJfdCBvdXRwdXRHZW5lcmF0aW9uOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleGVkPE91dHB1dFN1cmZhY2U+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXRTdXJmYWNlKTsKKyAgICAgICAgICAgIG91dHB1dFN1cmZhY2UgPSBvdXRwdXQtPnN1cmZhY2UgPworICAgICAgICAgICAgICAgICAgICBvdXRwdXQtPnN1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSA6IG51bGxwdHI7CisgICAgICAgICAgICBvdXRwdXRHZW5lcmF0aW9uID0gb3V0cHV0LT5nZW5lcmF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBncmFwaGljID0gKG9TdHJlYW1Gb3JtYXQudmFsdWUgPT0gQzJGb3JtYXRWaWRlbyk7CisgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG91dHB1dFBvb2xJZF87CisKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhlZDxCbG9ja1Bvb2xzPjo6TG9ja2VkIHBvb2xzKG1CbG9ja1Bvb2xzKTsKKworICAgICAgICAgICAgLy8gc2V0IGRlZmF1bHQgYWxsb2NhdG9yIElELgorICAgICAgICAgICAgcG9vbHMtPm91dHB1dEFsbG9jYXRvcklkID0gKGdyYXBoaWMpID8gQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpHUkFMTE9DCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OklPTjsKKworICAgICAgICAgICAgLy8gcXVlcnkgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6b3V0cHV0IGZyb20gY29tcG9uZW50LCBvciB1c2UgZGVmYXVsdCBhbGxvY2F0b3IgaWYKKyAgICAgICAgICAgIC8vIHVuc3VjY2Vzc2Z1bC4KKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOworICAgICAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+cXVlcnkoeyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zKTsKKyAgICAgICAgICAgIGlmICgoZXJyICE9IEMyX09LICYmIGVyciAhPSBDMl9CQURfSU5ERVgpIHx8IHBhcmFtcy5zaXplKCkgIT0gMSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIFF1ZXJ5IG91dHB1dCBhbGxvY2F0b3JzIHJldHVybmVkICV6dSBwYXJhbXMgPT4gJXMgKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcGFyYW1zLnNpemUoKSwgYXNTdHJpbmcoZXJyKSwgZXJyKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IEMyX09LICYmIHBhcmFtcy5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgICAgIEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6Om91dHB1dCAqb3V0cHV0QWxsb2NhdG9ycyA9CisgICAgICAgICAgICAgICAgICAgIEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6Om91dHB1dDo6RnJvbShwYXJhbXNbMF0uZ2V0KCkpOworICAgICAgICAgICAgICAgIGlmIChvdXRwdXRBbGxvY2F0b3JzICYmIG91dHB1dEFsbG9jYXRvcnMtPmZsZXhDb3VudCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jYXRvcjsKKyAgICAgICAgICAgICAgICAgICAgLy8gdmVyaWZ5IGFsbG9jYXRvciBJRHMgYW5kIHJlc29sdmUgZGVmYXVsdCBhbGxvY2F0b3IKKyAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKG91dHB1dEFsbG9jYXRvcnMtPm0udmFsdWVzWzBdLCAmYWxsb2NhdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFsbG9jYXRvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9vbHMtPm91dHB1dEFsbG9jYXRvcklkID0gYWxsb2NhdG9yLT5nZXRJZCgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gY29tcG9uZW50IHJlcXVlc3RlZCBpbnZhbGlkIG91dHB1dCBhbGxvY2F0b3IgSUQgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgb3V0cHV0QWxsb2NhdG9ycy0+bS52YWx1ZXNbMF0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB1c2UgYnVmZmVycXVldWUgaWYgb3V0cHV0dGluZyB0byBhIHN1cmZhY2UuCisgICAgICAgICAgICAvLyBxdWVyeSBDMlBvcnRTdXJmYWNlQWxsb2NhdG9yVHVuaW5nOjpvdXRwdXQgZnJvbSBjb21wb25lbnQsIG9yIHVzZSBkZWZhdWx0IGFsbG9jYXRvcgorICAgICAgICAgICAgLy8gaWYgdW5zdWNjZXNzZnVsLgorICAgICAgICAgICAgaWYgKG91dHB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5xdWVyeSh7IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBDMlBvcnRTdXJmYWNlQWxsb2NhdG9yVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMpOworICAgICAgICAgICAgICAgIGlmICgoZXJyICE9IEMyX09LICYmIGVyciAhPSBDMl9CQURfSU5ERVgpIHx8IHBhcmFtcy5zaXplKCkgIT0gMSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBRdWVyeSBvdXRwdXQgc3VyZmFjZSBhbGxvY2F0b3IgcmV0dXJuZWQgJXp1IHBhcmFtcyA9PiAlcyAoJXUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcGFyYW1zLnNpemUoKSwgYXNTdHJpbmcoZXJyKSwgZXJyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBDMl9PSyAmJiBwYXJhbXMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgQzJQb3J0U3VyZmFjZUFsbG9jYXRvclR1bmluZzo6b3V0cHV0ICpzdXJmYWNlQWxsb2NhdG9yID0KKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUG9ydFN1cmZhY2VBbGxvY2F0b3JUdW5pbmc6Om91dHB1dDo6RnJvbShwYXJhbXNbMF0uZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3VyZmFjZUFsbG9jYXRvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBhbGxvY2F0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB2ZXJpZnkgYWxsb2NhdG9yIElEcyBhbmQgcmVzb2x2ZSBkZWZhdWx0IGFsbG9jYXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKHN1cmZhY2VBbGxvY2F0b3ItPnZhbHVlLCAmYWxsb2NhdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbGxvY2F0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29scy0+b3V0cHV0QWxsb2NhdG9ySWQgPSBhbGxvY2F0b3ItPmdldElkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIGNvbXBvbmVudCByZXF1ZXN0ZWQgaW52YWxpZCBzdXJmYWNlIG91dHB1dCBhbGxvY2F0b3IgSUQgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIHN1cmZhY2VBbGxvY2F0b3ItPnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBvb2xzLT5vdXRwdXRBbGxvY2F0b3JJZCA9PSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkdSQUxMT0MKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGVyciAhPSBDMl9PSworICAgICAgICAgICAgICAgICAgICAgICAgJiYgKChwb29sTWFzayA+PiBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJVRkZFUlFVRVVFKSAmIDEpKSB7CisgICAgICAgICAgICAgICAgICAgIHBvb2xzLT5vdXRwdXRBbGxvY2F0b3JJZCA9IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QlVGRkVSUVVFVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKHBvb2xNYXNrID4+IHBvb2xzLT5vdXRwdXRBbGxvY2F0b3JJZCkgJiAxKSB7CisgICAgICAgICAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+Y3JlYXRlQmxvY2tQb29sKAorICAgICAgICAgICAgICAgICAgICAgICAgcG9vbHMtPm91dHB1dEFsbG9jYXRvcklkLCAmcG9vbHMtPm91dHB1dFBvb2xJZCwgJnBvb2xzLT5vdXRwdXRQb29sSW50Zik7CisgICAgICAgICAgICAgICAgQUxPR0koIlslc10gQ3JlYXRlZCBvdXRwdXQgYmxvY2sgcG9vbCB3aXRoIGFsbG9jYXRvcklEICV1ID0+IHBvb2xJRCAlbGx1IC0gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIHBvb2xzLT5vdXRwdXRBbGxvY2F0b3JJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcG9vbHMtPm91dHB1dFBvb2xJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKGVycikpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBDMl9OT1RfRk9VTkQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgLy8gdXNlIGJhc2ljIHBvb2wgaW5zdGVhZAorICAgICAgICAgICAgICAgIHBvb2xzLT5vdXRwdXRQb29sSWQgPQorICAgICAgICAgICAgICAgICAgICBncmFwaGljID8gQzJCbG9ja1Bvb2w6OkJBU0lDX0dSQVBISUMgOiBDMkJsb2NrUG9vbDo6QkFTSUNfTElORUFSOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDb25maWd1cmUgb3V0cHV0IGJsb2NrIHBvb2wgSUQgYXMgcGFyYW1ldGVyIEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dCB0bworICAgICAgICAgICAgLy8gY29tcG9uZW50LgorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dD4gcG9vbElkc1R1bmluZyA9CisgICAgICAgICAgICAgICAgICAgIEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dDo6QWxsb2NVbmlxdWUoeyBwb29scy0+b3V0cHV0UG9vbElkIH0pOworCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5jb25maWcoeyBwb29sSWRzVHVuaW5nLmdldCgpIH0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgIEFMT0dEKCJbJXNdIENvbmZpZ3VyZWQgb3V0cHV0IGJsb2NrIHBvb2wgaWRzICVsbHUgPT4gJXMiLAorICAgICAgICAgICAgICAgICAgICBtTmFtZSwgKHVuc2lnbmVkIGxvbmcgbG9uZylwb29sSWRzVHVuaW5nLT5tLnZhbHVlc1swXSwgYXNTdHJpbmcoZXJyKSk7CisgICAgICAgICAgICBvdXRwdXRQb29sSWRfID0gcG9vbHMtPm91dHB1dFBvb2xJZDsKKyAgICAgICAgfQorCisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobU91dHB1dEJ1ZmZlcnMpOworCisgICAgICAgIGlmIChncmFwaGljKSB7CisgICAgICAgICAgICBpZiAob3V0cHV0U3VyZmFjZSkgeworICAgICAgICAgICAgICAgIGJ1ZmZlcnMtPnJlc2V0KG5ldyBHcmFwaGljT3V0cHV0QnVmZmVycyhtTmFtZSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWZmZXJzLT5yZXNldChuZXcgUmF3R3JhcGhpY091dHB1dEJ1ZmZlcnMobU5hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1ZmZlcnMtPnJlc2V0KG5ldyBMaW5lYXJPdXRwdXRCdWZmZXJzKG1OYW1lKSk7CisgICAgICAgIH0KKyAgICAgICAgKCpidWZmZXJzKS0+c2V0Rm9ybWF0KG91dHB1dEZvcm1hdC0+ZHVwKCkpOworCisKKyAgICAgICAgLy8gVHJ5IHRvIHNldCBvdXRwdXQgc3VyZmFjZSB0byBjcmVhdGVkIGJsb2NrIHBvb2wgaWYgZ2l2ZW4uCisgICAgICAgIGlmIChvdXRwdXRTdXJmYWNlKSB7CisgICAgICAgICAgICBtQ29tcG9uZW50LT5zZXRPdXRwdXRTdXJmYWNlKAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRQb29sSWRfLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRHZW5lcmF0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvU3RyZWFtRm9ybWF0LnZhbHVlID09IEMyQnVmZmVyRGF0YTo6TElORUFSCisgICAgICAgICAgICAgICAgJiYgbUNvbXBvbmVudE5hbWUuZmluZCgiYzIucXRpLiIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICAvLyBXT1JLQVJPVU5EOiBpZiB3ZSdyZSB1c2luZyBlYXJseSBDU0Qgd29ya2Fyb3VuZCB3ZSBjb252ZXJ0IHRvCisgICAgICAgICAgICAvLyAgICAgICAgICAgICBhcnJheSBtb2RlLCB0byBhcHBlYXNlIGFwcHMgYXNzdW1pbmcgdGhlIG91dHB1dAorICAgICAgICAgICAgLy8gICAgICAgICAgICAgYnVmZmVycyB0byBiZSBvZiB0aGUgc2FtZSBzaXplLgorICAgICAgICAgICAgKCpidWZmZXJzKSA9ICgqYnVmZmVycyktPnRvQXJyYXlNb2RlKGtNaW5PdXRwdXRCdWZmZXJBcnJheVNpemUpOworCisgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIGlmIChvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMihLRVlfQ0hBTk5FTF9DT1VOVCwgJmNoYW5uZWxDb3VudCkKKyAgICAgICAgICAgICAgICAgICAgJiYgb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoS0VZX1NBTVBMRV9SQVRFLCAmc2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGRlbGF5ID0gMDsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHBhZGRpbmcgPSAwOzsKKyAgICAgICAgICAgICAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJlbmNvZGVyLWRlbGF5IiwgJmRlbGF5KSkgeworICAgICAgICAgICAgICAgICAgICBkZWxheSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImVuY29kZXItcGFkZGluZyIsICZwYWRkaW5nKSkgeworICAgICAgICAgICAgICAgICAgICBwYWRkaW5nID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGRlbGF5IHx8IHBhZGRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB3cml0ZSBhY2Nlc3MgdG8gdGhlIGJ1ZmZlcnMsIGFuZCB3ZSdyZSBhbHJlYWR5IGluCisgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5IG1vZGUuCisgICAgICAgICAgICAgICAgICAgICgqYnVmZmVycyktPmluaXRTa2lwQ3V0QnVmZmVyKGRlbGF5LCBwYWRkaW5nLCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFNldCB1cCBwaXBlbGluZSBjb250cm9sLiBUaGlzIGhhcyB0byBiZSBkb25lIGFmdGVyIG1JbnB1dEJ1ZmZlcnMgYW5kCisgICAgLy8gbU91dHB1dEJ1ZmZlcnMgYXJlIGluaXRpYWxpemVkIHRvIG1ha2Ugc3VyZSB0aGF0IGxpbmdlcmluZyBjYWxsYmFja3MKKyAgICAvLyBhYm91dCBidWZmZXJzIGZyb20gdGhlIHByZXZpb3VzIGdlbmVyYXRpb24gZG8gbm90IGludGVyZmVyZSB3aXRoIHRoZQorICAgIC8vIG5ld2x5IGluaXRpYWxpemVkIHBpcGVsaW5lIGNhcGFjaXR5LgorCisgICAgLy8gUXVlcnkgZGVsYXlzCisgICAgQzJQb3J0UmVxdWVzdGVkRGVsYXlUdW5pbmc6OmlucHV0IGlucHV0RGVsYXk7CisgICAgQzJQb3J0UmVxdWVzdGVkRGVsYXlUdW5pbmc6Om91dHB1dCBvdXRwdXREZWxheTsKKyAgICBDMlJlcXVlc3RlZFBpcGVsaW5lRGVsYXlUdW5pbmcgcGlwZWxpbmVEZWxheTsKKyNpZiAwCisgICAgZXJyID0gbUNvbXBvbmVudC0+cXVlcnkoCisgICAgICAgICAgICB7ICZpbnB1dERlbGF5LCAmcGlwZWxpbmVEZWxheSwgJm91dHB1dERlbGF5IH0sCisgICAgICAgICAgICB7fSwKKyAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICBudWxscHRyKTsKKyAgICBtQXZhaWxhYmxlUGlwZWxpbmVDYXBhY2l0eS5pbml0aWFsaXplKAorICAgICAgICAgICAgaW5wdXREZWxheSwKKyAgICAgICAgICAgIGlucHV0RGVsYXkgKyBwaXBlbGluZURlbGF5LAorICAgICAgICAgICAgaW5wdXREZWxheSArIHBpcGVsaW5lRGVsYXkgKyBvdXRwdXREZWxheSwKKyAgICAgICAgICAgIG1OYW1lKTsKKyNlbHNlCisgICAgbUF2YWlsYWJsZVBpcGVsaW5lQ2FwYWNpdHkuaW5pdGlhbGl6ZSgKKyAgICAgICAgICAgIGtNaW5JbnB1dEJ1ZmZlckFycmF5U2l6ZSwKKyAgICAgICAgICAgIGtNYXhQaXBlbGluZUNhcGFjaXR5LAorICAgICAgICAgICAgbU5hbWUpOworI2VuZGlmCisKKyAgICBtSW5wdXRNZXRFb3MgPSBmYWxzZTsKKyAgICBtU3luYy5zdGFydCgpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6cmVxdWVzdEluaXRpYWxJbnB1dEJ1ZmZlcnMoKSB7CisgICAgaWYgKG1JbnB1dFN1cmZhY2UpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIEMyU3RyZWFtRm9ybWF0Q29uZmlnOjpvdXRwdXQgb1N0cmVhbUZvcm1hdCgwdSk7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUNvbXBvbmVudC0+cXVlcnkoeyAmb1N0cmVhbUZvcm1hdCB9LCB7fSwgQzJfRE9OVF9CTE9DSywgbnVsbHB0cik7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+IHRvQmVRdWV1ZWQ7CisgICAgLy8gVE9ETzogdXNlIHByb3BlciBidWZmZXIgZGVwdGggaW5zdGVhZCBvZiB0aGlzIHJhbmRvbSB2YWx1ZQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01pbklucHV0QnVmZmVyQXJyYXlTaXplOyArK2kpIHsKKyAgICAgICAgc2l6ZV90IGluZGV4OworICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWZmZXI7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtSW5wdXRCdWZmZXJzKTsKKyAgICAgICAgICAgIGlmICghKCpidWZmZXJzKS0+cmVxdWVzdE5ld0J1ZmZlcigmaW5kZXgsICZidWZmZXIpKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiWyVzXSBzdGFydDogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBhdCBhbGwiLCBtTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gc3RhcnQ6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnksIG9ubHkgJXp1IGJ1ZmZlcnMgYWxsb2NhdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8c3RkOjpsaXN0PHNwPEFCdWZmZXI+Pj46OkxvY2tlZCBjb25maWdzKG1GbHVzaGVkQ29uZmlncyk7CisgICAgICAgICAgICBBTE9HVigiWyVzXSBpbnB1dCBidWZmZXIgJXp1IGF2YWlsYWJsZSIsIG1OYW1lLCBpbmRleCk7CisgICAgICAgICAgICBib29sIHBvc3QgPSB0cnVlOworICAgICAgICAgICAgaWYgKCFjb25maWdzLT5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gY29uZmlnID0gY29uZmlncy0+ZnJvbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVyLT5jYXBhY2l0eSgpID49IGNvbmZpZy0+c2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShidWZmZXItPmJhc2UoKSwgY29uZmlnLT5kYXRhKCksIGNvbmZpZy0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCBjb25maWctPnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOworICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImNzZCIsIDEpOworICAgICAgICAgICAgICAgICAgICBwb3N0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gYnVmZmVyIGNhcGFjaXR5IHRvbyBzbWFsbCBmb3IgdGhlIGNvbmZpZyAoJXp1IDwgJXp1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIGJ1ZmZlci0+Y2FwYWNpdHkoKSwgY29uZmlnLT5zaXplKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAob1N0cmVhbUZvcm1hdC52YWx1ZSA9PSBDMkJ1ZmZlckRhdGE6OkxJTkVBUiAmJiBpID09IDAKKyAgICAgICAgICAgICAgICAgICAgJiYgbUNvbXBvbmVudE5hbWUuZmluZCgiYzIucXRpLiIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICAgICAgLy8gV09SS0FST1VORDogU29tZSBhcHBzIGV4cGVjdCBDU0QgYXZhaWxhYmxlIHdpdGhvdXQgcXVldWVpbmcKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBhbnkgaW5wdXQuIFF1ZXVlIGFuIGVtcHR5IGJ1ZmZlciB0byBnZXQgdGhlIENTRC4KKyAgICAgICAgICAgICAgICBidWZmZXItPnNldFJhbmdlKDAsIDApOworICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5jbGVhcigpOworICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7CisgICAgICAgICAgICAgICAgcG9zdCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1BdmFpbGFibGVQaXBlbGluZUNhcGFjaXR5LmFsbG9jYXRlKCJyZXF1ZXN0SW5pdGlhbElucHV0QnVmZmVycyIpKSB7CisgICAgICAgICAgICAgICAgaWYgKHBvc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLT5vbklucHV0QnVmZmVyQXZhaWxhYmxlKGluZGV4LCBidWZmZXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRvQmVRdWV1ZWQuZW1wbGFjZV9iYWNrKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBwaXBlbGluZSBpcyBmdWxsIHdoaWxlIHJlcXVlc3RpbmcgJXp1LXRoIGlucHV0IGJ1ZmZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyIDogdG9CZVF1ZXVlZCkgeworICAgICAgICBpZiAocXVldWVJbnB1dEJ1ZmZlckludGVybmFsKGJ1ZmZlcikgIT0gT0spIHsKKyAgICAgICAgICAgIG1BdmFpbGFibGVQaXBlbGluZUNhcGFjaXR5LmZyZWVDb21wb25lbnRTbG90KCJyZXF1ZXN0SW5pdGlhbElucHV0QnVmZmVycyIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpzdG9wKCkgeworICAgIG1TeW5jLnN0b3AoKTsKKyAgICBtRmlyc3RWYWxpZEZyYW1lSW5kZXggPSBtRnJhbWVJbmRleC5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgIGlmIChtSW5wdXRTdXJmYWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUlucHV0U3VyZmFjZS0+ZGlzY29ubmVjdCgpOworICAgICAgICBtSW5wdXRTdXJmYWNlLnJlc2V0KCk7CisgICAgfQorfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OmZsdXNoKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJmZsdXNoZWRXb3JrKSB7CisgICAgQUxPR1YoIlslc10gZmx1c2giLCBtTmFtZSk7CisgICAgeworICAgICAgICBNdXRleGVkPHN0ZDo6bGlzdDxzcDxBQnVmZmVyPj4+OjpMb2NrZWQgY29uZmlncyhtRmx1c2hlZENvbmZpZ3MpOworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrIDogZmx1c2hlZFdvcmspIHsKKyAgICAgICAgICAgIGlmICghKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKQorICAgICAgICAgICAgICAgICAgICB8fCB3b3JrLT5pbnB1dC5idWZmZXJzLmZyb250KCktPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gbm8gbGluZWFyIGNvZGVjIGNvbmZpZyBkYXRhIGZvdW5kIiwgbU5hbWUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQzJSZWFkVmlldyB2aWV3ID0KKyAgICAgICAgICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5mcm9udCgpLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBmYWlsZWQgdG8gbWFwIGZsdXNoZWQgY29kZWMgY29uZmlnIGRhdGE6ICVkIiwgbU5hbWUsIHZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25maWdzLT5wdXNoX2JhY2soQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KHZpZXcuZGF0YSgpLCB2aWV3LmNhcGFjaXR5KCkpKTsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIHN0YXNoZWQgZmx1c2hlZCBjb2RlYyBjb25maWcgZGF0YSAoc2l6ZT0ldSkiLCBtTmFtZSwgdmlldy5jYXBhY2l0eSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtSW5wdXRCdWZmZXJzKTsKKyAgICAgICAgKCpidWZmZXJzKS0+Zmx1c2goKTsKKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1PdXRwdXRCdWZmZXJzKTsKKyAgICAgICAgKCpidWZmZXJzKS0+Zmx1c2goZmx1c2hlZFdvcmspOworICAgIH0KK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpvbldvcmtEb25lKAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrLCBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCwKKyAgICAgICAgY29uc3QgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dCAqaW5pdERhdGEsCisgICAgICAgIHNpemVfdCBudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnMpIHsKKyAgICBpZiAoaGFuZGxlV29yayhzdGQ6Om1vdmUod29yayksIG91dHB1dEZvcm1hdCwgaW5pdERhdGEpKSB7CisgICAgICAgIG1BdmFpbGFibGVQaXBlbGluZUNhcGFjaXR5LmZyZWVJbnB1dFNsb3RzKG51bURpc2NhcmRlZElucHV0QnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9uV29ya0RvbmUiKTsKKyAgICAgICAgZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGUoKTsKKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6b25JbnB1dEJ1ZmZlckRvbmUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIGJ1ZmZlcikgeworICAgIGJvb2wgbmV3SW5wdXRTbG90QXZhaWxhYmxlOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1JbnB1dEJ1ZmZlcnMpOworICAgICAgICBuZXdJbnB1dFNsb3RBdmFpbGFibGUgPSAoKmJ1ZmZlcnMpLT5leHBpcmVDb21wb25lbnRCdWZmZXIoYnVmZmVyKTsKKyAgICAgICAgaWYgKG5ld0lucHV0U2xvdEF2YWlsYWJsZSkgeworICAgICAgICAgICAgbUF2YWlsYWJsZVBpcGVsaW5lQ2FwYWNpdHkuZnJlZUlucHV0U2xvdHMoMSwgIm9uSW5wdXRCdWZmZXJEb25lIik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG5ld0lucHV0U2xvdEF2YWlsYWJsZSkgeworICAgICAgICBmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZSgpOworICAgIH0KK30KKworYm9vbCBDQ29kZWNCdWZmZXJDaGFubmVsOjpoYW5kbGVXb3JrKAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrLAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCwKKyAgICAgICAgY29uc3QgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dCAqaW5pdERhdGEpIHsKKyAgICBpZiAoKHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCAtIG1GaXJzdFZhbGlkRnJhbWVJbmRleC5sb2FkKCkpLnBlZWsoKSA8IDApIHsKKyAgICAgICAgLy8gRGlzY2FyZCBmcmFtZXMgZnJvbSBwcmV2aW91cyBnZW5lcmF0aW9uLgorICAgICAgICBBTE9HRCgiWyVzXSBEaXNjYXJkIGZyYW1lcyBmcm9tIHByZXZpb3VzIGdlbmVyYXRpb24uIiwgbU5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHdvcmstPndvcmtsZXRzLnNpemUoKSAhPSAxdQorICAgICAgICAgICAgfHwgIXdvcmstPndvcmtsZXRzLmZyb250KCkKKyAgICAgICAgICAgIHx8ICEod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfSU5DT01QTEVURSkpIHsKKyAgICAgICAgbUF2YWlsYWJsZVBpcGVsaW5lQ2FwYWNpdHkuZnJlZUNvbXBvbmVudFNsb3QoImhhbmRsZVdvcmsiKTsKKyAgICB9CisKKyAgICBpZiAod29yay0+cmVzdWx0ID09IEMyX05PVF9GT1VORCkgeworICAgICAgICBBTE9HRCgiWyVzXSBmbHVzaGVkIHdvcms7IGlnbm9yZWQuIiwgbU5hbWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAod29yay0+cmVzdWx0ICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJbJXNdIHdvcmsgZmFpbGVkIHRvIGNvbXBsZXRlOiAlZCIsIG1OYW1lLCB3b3JrLT5yZXN1bHQpOworICAgICAgICBtQ0NvZGVjQ2FsbGJhY2stPm9uRXJyb3Iod29yay0+cmVzdWx0LCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBOT1RFOiBNZWRpYUNvZGVjIHVzYWdlIHN1cHBvc2VkbHkgaGF2ZSBvbmx5IG9uZSB3b3JrbGV0CisgICAgaWYgKHdvcmstPndvcmtsZXRzLnNpemUoKSAhPSAxdSkgeworICAgICAgICBBTE9HSSgiWyVzXSBvbldvcmtEb25lOiBpbmNvcnJlY3QgbnVtYmVyIG9mIHdvcmtsZXRzOiAlenUiLAorICAgICAgICAgICAgICAgIG1OYW1lLCB3b3JrLT53b3JrbGV0cy5zaXplKCkpOworICAgICAgICBtQ0NvZGVjQ2FsbGJhY2stPm9uRXJyb3IoVU5LTk9XTl9FUlJPUiwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29ya2xldD4gJndvcmtsZXQgPSB3b3JrLT53b3JrbGV0cy5mcm9udCgpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXI7CisgICAgLy8gTk9URTogTWVkaWFDb2RlYyB1c2FnZSBzdXBwb3NlZGx5IGhhdmUgb25seSBvbmUgb3V0cHV0IHN0cmVhbS4KKyAgICBpZiAod29ya2xldC0+b3V0cHV0LmJ1ZmZlcnMuc2l6ZSgpID4gMXUpIHsKKyAgICAgICAgQUxPR0koIlslc10gb25Xb3JrRG9uZTogaW5jb3JyZWN0IG51bWJlciBvZiBvdXRwdXQgYnVmZmVyczogJXp1IiwKKyAgICAgICAgICAgICAgICBtTmFtZSwgd29ya2xldC0+b3V0cHV0LmJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICAgICAgbUNDb2RlY0NhbGxiYWNrLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAod29ya2xldC0+b3V0cHV0LmJ1ZmZlcnMuc2l6ZSgpID09IDF1KSB7CisgICAgICAgIGJ1ZmZlciA9IHdvcmtsZXQtPm91dHB1dC5idWZmZXJzWzBdOworICAgICAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICAgICAgQUxPR0QoIlslc10gb25Xb3JrRG9uZTogbnVsbHB0ciBmb3VuZCBpbiBidWZmZXJzOyBpZ25vcmVkLiIsIG1OYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHdoaWxlICghd29ya2xldC0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5lbXB0eSgpKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBwYXJhbTsKKyAgICAgICAgd29ya2xldC0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5iYWNrKCkuc3dhcChwYXJhbSk7CisgICAgICAgIHdvcmtsZXQtPm91dHB1dC5jb25maWdVcGRhdGUucG9wX2JhY2soKTsKKyAgICAgICAgc3dpdGNoIChwYXJhbS0+Y29yZUluZGV4KCkuY29yZUluZGV4KCkpIHsKKyAgICAgICAgICAgIGNhc2UgQzJQb3J0UmVvcmRlckJ1ZmZlckRlcHRoVHVuaW5nOjpDT1JFX0lOREVYOiB7CisgICAgICAgICAgICAgICAgQzJQb3J0UmVvcmRlckJ1ZmZlckRlcHRoVHVuaW5nOjpvdXRwdXQgcmVvcmRlckRlcHRoOworICAgICAgICAgICAgICAgIGlmIChyZW9yZGVyRGVwdGgudXBkYXRlRnJvbSgqcGFyYW0pKSB7CisgICAgICAgICAgICAgICAgICAgIG1SZW9yZGVyU3Rhc2gubG9jaygpLT5zZXREZXB0aChyZW9yZGVyRGVwdGgudmFsdWUpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiB1cGRhdGVkIHJlb3JkZXIgZGVwdGggdG8gJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcmVvcmRlckRlcHRoLnZhbHVlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBvbldvcmtEb25lOiBmYWlsZWQgdG8gcmVhZCByZW9yZGVyIGRlcHRoIiwgbU5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQzJQb3J0UmVvcmRlcktleVNldHRpbmc6OkNPUkVfSU5ERVg6IHsKKyAgICAgICAgICAgICAgICBDMlBvcnRSZW9yZGVyS2V5U2V0dGluZzo6b3V0cHV0IHJlb3JkZXJLZXk7CisgICAgICAgICAgICAgICAgaWYgKHJlb3JkZXJLZXkudXBkYXRlRnJvbSgqcGFyYW0pKSB7CisgICAgICAgICAgICAgICAgICAgIG1SZW9yZGVyU3Rhc2gubG9jaygpLT5zZXRLZXkocmVvcmRlcktleS52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IHVwZGF0ZWQgcmVvcmRlciBrZXkgdG8gJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcmVvcmRlcktleS52YWx1ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gb25Xb3JrRG9uZTogZmFpbGVkIHRvIHJlYWQgcmVvcmRlciBrZXkiLCBtTmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiB1bnJlY29nbml6ZWQgY29uZmlnIHVwZGF0ZSAoJTA4WCkiLAorICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBwYXJhbS0+aW5kZXgoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3V0cHV0Rm9ybWF0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8T3V0cHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtT3V0cHV0QnVmZmVycyk7CisgICAgICAgIEFMT0dEKCJbJXNdIG9uV29ya0RvbmU6IG91dHB1dCBmb3JtYXQgY2hhbmdlZCB0byAlcyIsCisgICAgICAgICAgICAgICAgbU5hbWUsIG91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgKCpidWZmZXJzKS0+c2V0Rm9ybWF0KG91dHB1dEZvcm1hdCk7CisKKyAgICAgICAgQVN0cmluZyBtZWRpYVR5cGU7CisgICAgICAgIGlmIChvdXRwdXRGb3JtYXQtPmZpbmRTdHJpbmcoS0VZX01JTUUsICZtZWRpYVR5cGUpCisgICAgICAgICAgICAgICAgJiYgbWVkaWFUeXBlID09IE1JTUVUWVBFX0FVRElPX1JBVykgeworICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsQ291bnQ7CisgICAgICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGU7CisgICAgICAgICAgICBpZiAob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoS0VZX0NIQU5ORUxfQ09VTlQsICZjaGFubmVsQ291bnQpCisgICAgICAgICAgICAgICAgICAgICYmIG91dHB1dEZvcm1hdC0+ZmluZEludDMyKEtFWV9TQU1QTEVfUkFURSwgJnNhbXBsZVJhdGUpKSB7CisgICAgICAgICAgICAgICAgKCpidWZmZXJzKS0+dXBkYXRlU2tpcEN1dEJ1ZmZlcihzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmtsZXQtPm91dHB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgZmxhZ3MgfD0gTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TOworICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiBvdXRwdXQgRU9TIiwgbU5hbWUpOworICAgIH0KKworICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IG91dEJ1ZmZlcjsKKyAgICBzaXplX3QgaW5kZXg7CisKKyAgICAvLyBXT1JLQVJPVU5EOiBhZGp1c3Qgb3V0cHV0IHRpbWVzdGFtcCBiYXNlZCBvbiBjbGllbnQgaW5wdXQgdGltZXN0YW1wIGFuZCBjb2RlYworICAgIC8vIGlucHV0IHRpbWVzdGFtcC4gQ29kZWMgb3V0cHV0IHRpbWVzdGFtcCAoaW4gdGhlIHRpbWVzdGFtcCBmaWVsZCkgc2hhbGwgY29ycmVzcG9uZCB0bworICAgIC8vIHRoZSBjb2RlYyBpbnB1dCB0aW1lc3RhbXAsIGJ1dCBjbGllbnQgb3V0cHV0IHRpbWVzdGFtcCBzaG91bGQgKHJlcG9ydGVkIGluIHRpbWVVcykKKyAgICAvLyBzaGFsbCBjb3JyZXNwb25kIHRvIHRoZSBjbGllbnQgaW5wdXQgdGltZXNhbXAgKGluIGN1c3RvbU9yZGluYWwpLiBCeSB1c2luZyB0aGUKKyAgICAvLyBkZWx0YSBiZXR3ZWVuIHRoZSB0d28sIHRoaXMgYWxsb3dzIGZvciBzb21lIHRpbWVzdGFtcCBkZXZpYXRpb24gLSBlLmcuIGlmIG9uZSBpbnB1dAorICAgIC8vIHByb2R1Y2VzIG11bHRpcGxlIG91dHB1dC4KKyAgICBjMl9jbnRyNjRfdCB0aW1lc3RhbXAgPQorICAgICAgICB3b3JrbGV0LT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgKyB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWwKKyAgICAgICAgICAgICAgICAtIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wOworICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IGlucHV0ICVsbGQsIGNvZGVjICVsbGQgPT4gb3V0cHV0ICVsbGQgPT4gJWxsZCIsCisgICAgICAgICAgbU5hbWUsCisgICAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5jdXN0b21PcmRpbmFsLnBlZWtsbCgpLAorICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWtsbCgpLAorICAgICAgICAgIHdvcmtsZXQtPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrbGwoKSwKKyAgICAgICAgICB0aW1lc3RhbXAucGVla2xsKCkpOworCisgICAgaWYgKGluaXREYXRhICE9IG51bGxwdHIpIHsKKyAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8T3V0cHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtT3V0cHV0QnVmZmVycyk7CisgICAgICAgIGlmICgoKmJ1ZmZlcnMpLT5yZWdpc3RlckNzZChpbml0RGF0YSwgJmluZGV4LCAmb3V0QnVmZmVyKSA9PSBPSykgeworICAgICAgICAgICAgb3V0QnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lc3RhbXAucGVlaygpKTsKKyAgICAgICAgICAgIG91dEJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiZmxhZ3MiLCBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19DT0RFQ0NPTkZJRyk7CisgICAgICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiBjc2QgaW5kZXggPSAlenUgWyVwXSIsIG1OYW1lLCBpbmRleCwgb3V0QnVmZmVyLmdldCgpKTsKKworICAgICAgICAgICAgYnVmZmVycy51bmxvY2soKTsKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25PdXRwdXRCdWZmZXJBdmFpbGFibGUoaW5kZXgsIG91dEJ1ZmZlcik7CisgICAgICAgICAgICBidWZmZXJzLmxvY2soKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dEKCJbJXNdIG9uV29ya0RvbmU6IHVuYWJsZSB0byByZWdpc3RlciBjc2QiLCBtTmFtZSk7CisgICAgICAgICAgICBidWZmZXJzLnVubG9jaygpOworICAgICAgICAgICAgbUNDb2RlY0NhbGxiYWNrLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgICAgIGJ1ZmZlcnMubG9jaygpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFidWZmZXIgJiYgIWZsYWdzKSB7CisgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IE5vdCByZXBvcnRpbmcgb3V0cHV0IGJ1ZmZlciAoJWxsZCkiLAorICAgICAgICAgICAgICBtTmFtZSwgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1bGwoKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPiAmaW5mbyA6IGJ1ZmZlci0+aW5mbygpKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBwcm9wZXJseSB0cmFuc2xhdGUgdGhlc2UgdG8gbWV0YWRhdGEKKyAgICAgICAgICAgIHN3aXRjaCAoaW5mby0+Y29yZUluZGV4KCkuY29yZUluZGV4KCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEMyU3RyZWFtUGljdHVyZVR5cGVNYXNrSW5mbzo6Q09SRV9JTkRFWDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoQzJTdHJlYW1QaWN0dXJlVHlwZU1hc2tJbmZvICopaW5mby5nZXQoKSktPnZhbHVlICYgQzJQaWN0dXJlVHlwZUtleUZyYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19TWU5DRlJBTUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8UmVvcmRlclN0YXNoPjo6TG9ja2VkIHJlb3JkZXIobVJlb3JkZXJTdGFzaCk7CisgICAgICAgIHJlb3JkZXItPmVtcGxhY2UoYnVmZmVyLCB0aW1lc3RhbXAucGVlaygpLCBmbGFncywgd29ya2xldC0+b3V0cHV0Lm9yZGluYWwpOworICAgICAgICBpZiAoZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1MpIHsKKyAgICAgICAgICAgIC8vIEZsdXNoIHJlb3JkZXIgc3Rhc2gKKyAgICAgICAgICAgIHJlb3JkZXItPnNldERlcHRoKDApOworICAgICAgICB9CisgICAgfQorICAgIHNlbmRPdXRwdXRCdWZmZXJzKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6c2VuZE91dHB1dEJ1ZmZlcnMoKSB7CisgICAgUmVvcmRlclN0YXNoOjpFbnRyeSBlbnRyeTsKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBvdXRCdWZmZXI7CisgICAgc2l6ZV90IGluZGV4OworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhlZDxSZW9yZGVyU3Rhc2g+OjpMb2NrZWQgcmVvcmRlcihtUmVvcmRlclN0YXNoKTsKKyAgICAgICAgICAgIGlmICghcmVvcmRlci0+aGFzUGVuZGluZygpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXJlb3JkZXItPnBvcCgmZW50cnkpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8T3V0cHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtT3V0cHV0QnVmZmVycyk7CisgICAgICAgIHN0YXR1c190IGVyciA9ICgqYnVmZmVycyktPnJlZ2lzdGVyQnVmZmVyKGVudHJ5LmJ1ZmZlciwgJmluZGV4LCAmb3V0QnVmZmVyKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgaWYgKGVyciAhPSBXT1VMRF9CTE9DSykgeworICAgICAgICAgICAgICAgIE91dHB1dEJ1ZmZlcnNBcnJheSAqYXJyYXkgPSAoT3V0cHV0QnVmZmVyc0FycmF5ICopYnVmZmVycy0+Z2V0KCk7CisgICAgICAgICAgICAgICAgYXJyYXktPnJlYWxsb2MoZW50cnkuYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBtQ0NvZGVjQ2FsbGJhY2stPm9uT3V0cHV0QnVmZmVyc0NoYW5nZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZmZlcnMudW5sb2NrKCk7CisgICAgICAgICAgICBBTE9HVigiWyVzXSBzZW5kT3V0cHV0QnVmZmVyczogdW5hYmxlIHRvIHJlZ2lzdGVyIG91dHB1dCBidWZmZXIiLCBtTmFtZSk7CisgICAgICAgICAgICBtUmVvcmRlclN0YXNoLmxvY2soKS0+ZGVmZXIoZW50cnkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGJ1ZmZlcnMudW5sb2NrKCk7CisKKyAgICAgICAgb3V0QnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCBlbnRyeS50aW1lc3RhbXApOworICAgICAgICBvdXRCdWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImZsYWdzIiwgZW50cnkuZmxhZ3MpOworICAgICAgICBBTE9HVigiWyVzXSBzZW5kT3V0cHV0QnVmZmVyczogb3V0IGJ1ZmZlciBpbmRleCA9ICV6dSBbJXBdID0+ICVwICsgJXp1IiwKKyAgICAgICAgICAgICAgICBtTmFtZSwgaW5kZXgsIG91dEJ1ZmZlci5nZXQoKSwgb3V0QnVmZmVyLT5kYXRhKCksIG91dEJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgbUNhbGxiYWNrLT5vbk91dHB1dEJ1ZmZlckF2YWlsYWJsZShpbmRleCwgb3V0QnVmZmVyKTsKKyAgICB9Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJm5ld1N1cmZhY2UpIHsKKyAgICBzdGF0aWMgc3RkOjphdG9taWNfdWludDMyX3Qgc3VyZmFjZUdlbmVyYXRpb257MH07CisgICAgdWludDMyX3QgZ2VuZXJhdGlvbiA9IChnZXRwaWQoKSA8PCAxMCkgfAorICAgICAgICAgICAgKChzdXJmYWNlR2VuZXJhdGlvbi5mZXRjaF9hZGQoMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCkgKyAxKQorICAgICAgICAgICAgICAgICYgKCgxIDw8IDEwKSAtIDEpKTsKKworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHByb2R1Y2VyOworICAgIGlmIChuZXdTdXJmYWNlKSB7CisgICAgICAgIG5ld1N1cmZhY2UtPnNldFNjYWxpbmdNb2RlKE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX1NDQUxFX1RPX1dJTkRPVyk7CisgICAgICAgIG5ld1N1cmZhY2UtPnNldE1heERlcXVldWVkQnVmZmVyQ291bnQoa01pbk91dHB1dEJ1ZmZlckFycmF5U2l6ZSk7CisgICAgICAgIHByb2R1Y2VyID0gbmV3U3VyZmFjZS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpOworICAgICAgICBwcm9kdWNlci0+c2V0R2VuZXJhdGlvbk51bWJlcihnZW5lcmF0aW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiWyVzXSBzZXR0aW5nIG91dHB1dCBzdXJmYWNlIHRvIG51bGwiLCBtTmFtZSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb25maWd1cmFibGU+IG91dHB1dFBvb2xJbnRmOworICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG91dHB1dFBvb2xJZDsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8QmxvY2tQb29scz46OkxvY2tlZCBwb29scyhtQmxvY2tQb29scyk7CisgICAgICAgIG91dHB1dFBvb2xJZCA9IHBvb2xzLT5vdXRwdXRQb29sSWQ7CisgICAgICAgIG91dHB1dFBvb2xJbnRmID0gcG9vbHMtPm91dHB1dFBvb2xJbnRmOworICAgIH0KKworICAgIGlmIChvdXRwdXRQb29sSW50ZikgeworICAgICAgICBpZiAobUNvbXBvbmVudC0+c2V0T3V0cHV0U3VyZmFjZSgKKyAgICAgICAgICAgICAgICBvdXRwdXRQb29sSWQsCisgICAgICAgICAgICAgICAgcHJvZHVjZXIsCisgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbikgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dJKCJbJXNdIHNldFN1cmZhY2U6IGNvbXBvbmVudCBzZXRPdXRwdXRTdXJmYWNlIGZhaWxlZCIsIG1OYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxPdXRwdXRTdXJmYWNlPjo6TG9ja2VkIG91dHB1dChtT3V0cHV0U3VyZmFjZSk7CisgICAgICAgIG91dHB1dC0+c3VyZmFjZSA9IG5ld1N1cmZhY2U7CisgICAgICAgIG91dHB1dC0+Z2VuZXJhdGlvbiA9IGdlbmVyYXRpb247CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OnNldE1ldGFNb2RlKE1ldGFNb2RlIG1vZGUpIHsKKyAgICBtTWV0YU1vZGUgPSBtb2RlOworfQorCitzdGF0dXNfdCB0b1N0YXR1c1QoYzJfc3RhdHVzX3QgYzJzLCBjMl9vcGVyYXRpb25fdCBjMm9wKSB7CisgICAgLy8gQzJfT0sgaXMgYWx3YXlzIHRyYW5zbGF0ZWQgdG8gT0suCisgICAgaWYgKGMycyA9PSBDMl9PSykgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgLy8gT3BlcmF0aW9uLWRlcGVuZGVudCB0cmFuc2xhdGlvbgorICAgIC8vIFRPRE86IEFkZCBhcyBuZWNlc3NhcnkKKyAgICBzd2l0Y2ggKGMyb3ApIHsKKyAgICBjYXNlIEMyX09QRVJBVElPTl9Db21wb25lbnRfc3RhcnQ6CisgICAgICAgIHN3aXRjaCAoYzJzKSB7CisgICAgICAgIGNhc2UgQzJfTk9fTUVNT1JZOgorICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gQmFja3VwIG9wZXJhdGlvbi1hZ25vc3RpYyB0cmFuc2xhdGlvbgorICAgIHN3aXRjaCAoYzJzKSB7CisgICAgY2FzZSBDMl9CQURfSU5ERVg6CisgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgY2FzZSBDMl9CQURfVkFMVUU6CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgY2FzZSBDMl9CTE9DS0lORzoKKyAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOworICAgIGNhc2UgQzJfRFVQTElDQVRFOgorICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7CisgICAgY2FzZSBDMl9OT19JTklUOgorICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICBjYXNlIEMyX05PX01FTU9SWToKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICBjYXNlIEMyX05PVF9GT1VORDoKKyAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgIGNhc2UgQzJfVElNRURfT1VUOgorICAgICAgICByZXR1cm4gVElNRURfT1VUOworICAgIGNhc2UgQzJfQkFEX1NUQVRFOgorICAgIGNhc2UgQzJfQ0FOQ0VMRUQ6CisgICAgY2FzZSBDMl9DQU5OT1RfRE86CisgICAgY2FzZSBDMl9DT1JSVVBURUQ6CisgICAgY2FzZSBDMl9PTUlUVEVEOgorICAgIGNhc2UgQzJfUkVGVVNFRDoKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIC1zdGF0aWNfY2FzdDxzdGF0dXNfdD4oYzJzKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzFiYWFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuaApAQCAtMCwwICsxLDQxNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0NPREVDX0JVRkZFUl9DSEFOTkVMX0hfCisKKyNkZWZpbmUgQ0NPREVDX0JVRkZFUl9DSEFOTkVMX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDb2RlYzJNYXBwZXIuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9jb2RlYzIvMS4wL0lucHV0U3VyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTXV0ZXhlZC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKworI2luY2x1ZGUgIklucHV0U3VyZmFjZVdyYXBwZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDQ29kZWNDYWxsYmFjayB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+Q0NvZGVjQ2FsbGJhY2soKSA9IGRlZmF1bHQ7CisgICAgdmlydHVhbCB2b2lkIG9uRXJyb3Ioc3RhdHVzX3QgZXJyLCBlbnVtIEFjdGlvbkNvZGUgYWN0aW9uQ29kZSkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBvbk91dHB1dEZyYW1lc1JlbmRlcmVkKGludDY0X3QgbWVkaWFUaW1lVXMsIG5zZWNzX3QgcmVuZGVyVGltZU5zKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIG9uV29ya1F1ZXVlZChib29sIGVvcykgPSAwOworICAgIHZpcnR1YWwgdm9pZCBvbk91dHB1dEJ1ZmZlcnNDaGFuZ2VkKCkgPSAwOworfTsKKworLyoqCisgKiBCdWZmZXJDaGFubmVsQmFzZSBpbXBsZW1lbnRhdGlvbiBmb3IgQ0NvZGVjLgorICovCitjbGFzcyBDQ29kZWNCdWZmZXJDaGFubmVsCisgICAgOiBwdWJsaWMgQnVmZmVyQ2hhbm5lbEJhc2UsIHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPENDb2RlY0J1ZmZlckNoYW5uZWw+IHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBDQ29kZWNCdWZmZXJDaGFubmVsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDQ29kZWNDYWxsYmFjaz4gJmNhbGxiYWNrKTsKKyAgICB2aXJ0dWFsIH5DQ29kZWNCdWZmZXJDaGFubmVsKCk7CisKKyAgICAvLyBCdWZmZXJDaGFubmVsQmFzZSBpbnRlcmZhY2UKKyAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXVlSW5wdXRCdWZmZXIoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBxdWV1ZVNlY3VyZUlucHV0QnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIGJvb2wgc2VjdXJlLAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqa2V5LAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaXYsCisgICAgICAgICAgICBDcnlwdG9QbHVnaW46Ok1vZGUgbW9kZSwKKyAgICAgICAgICAgIENyeXB0b1BsdWdpbjo6UGF0dGVybiBwYXR0ZXJuLAorICAgICAgICAgICAgY29uc3QgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUgKnN1YlNhbXBsZXMsCisgICAgICAgICAgICBzaXplX3QgbnVtU3ViU2FtcGxlcywKKyAgICAgICAgICAgIEFTdHJpbmcgKmVycm9yRGV0YWlsTXNnKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbmRlck91dHB1dEJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsIGludDY0X3QgdGltZXN0YW1wTnMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZGlzY2FyZEJ1ZmZlcihjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0SW5wdXRCdWZmZXJBcnJheShWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICphcnJheSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIGdldE91dHB1dEJ1ZmZlckFycmF5KFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmFycmF5KSBvdmVycmlkZTsKKworICAgIC8vIE1ldGhvZHMgYmVsb3cgYXJlIGludGVyZmFjZSBmb3IgQ0NvZGVjIHRvIHVzZS4KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29tcG9uZW50IG9iamVjdCBmb3IgYnVmZmVyIHByb2Nlc3NpbmcuCisgICAgICovCisgICAgdm9pZCBzZXRDb21wb25lbnQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50KTsKKworICAgIC8qKgorICAgICAqIFNldCBvdXRwdXQgZ3JhcGhpYyBzdXJmYWNlIGZvciByZW5kZXJpbmcuCisgICAgICovCisgICAgc3RhdHVzX3Qgc2V0U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgR3JhcGhpY0J1ZmZlclNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCB0aGUgY29tcG9uZW50IGV4dHJhY3RzIGlucHV0CisgICAgICogYnVmZmVycy4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZXRJbnB1dFN1cmZhY2UoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZVdyYXBwZXI+ICZzdXJmYWNlKTsKKworICAgIC8qKgorICAgICAqIFNpZ25hbCBFT1MgdG8gaW5wdXQgc3VyZmFjZS4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzaWduYWxFbmRPZklucHV0U3RyZWFtKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gJnBhcmFtcyk7CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBxdWV1ZWluZyBidWZmZXJzIHRvIHRoZSBjb21wb25lbnQuIFRoaXMgb2JqZWN0IHNob3VsZCBuZXZlciBxdWV1ZQorICAgICAqIGJ1ZmZlcnMgYmVmb3JlIHRoaXMgY2FsbCBoYXMgY29tcGxldGVkLgorICAgICAqLworICAgIHN0YXR1c190IHN0YXJ0KGNvbnN0IHNwPEFNZXNzYWdlPiAmaW5wdXRGb3JtYXQsIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0KTsKKworICAgIC8qKgorICAgICAqIFJlcXVlc3QgaW5pdGlhbCBpbnB1dCBidWZmZXJzIHRvIGJlIGZpbGxlZCBieSBjbGllbnQuCisgICAgICovCisgICAgc3RhdHVzX3QgcmVxdWVzdEluaXRpYWxJbnB1dEJ1ZmZlcnMoKTsKKworICAgIC8qKgorICAgICAqIFN0b3AgcXVldWVpbmcgYnVmZmVycyB0byB0aGUgY29tcG9uZW50LiBUaGlzIG9iamVjdCBzaG91bGQgbmV2ZXIgcXVldWUKKyAgICAgKiBidWZmZXJzIGFmdGVyIHRoaXMgY2FsbCwgdW50aWwgc3RhcnQoKSBpcyBjYWxsZWQuCisgICAgICovCisgICAgdm9pZCBzdG9wKCk7CisKKyAgICB2b2lkIGZsdXNoKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJmZsdXNoZWRXb3JrKTsKKworICAgIC8qKgorICAgICAqIE5vdGlmeSBpbnB1dCBjbGllbnQgYWJvdXQgd29yayBkb25lLgorICAgICAqCisgICAgICogQHBhcmFtIHdvcmtJdGVtcyAgIGZpbmlzaGVkIHdvcmsgaXRlbS4KKyAgICAgKiBAcGFyYW0gb3V0cHV0Rm9ybWF0IG5ldyBvdXRwdXQgZm9ybWF0IGlmIGl0IGhhcyBjaGFuZ2VkLCBvdGhlcndpc2UgbnVsbHB0cgorICAgICAqIEBwYXJhbSBpbml0RGF0YSAgICBuZXcgaW5pdCBkYXRhIChDU0QpIGlmIGl0IGhhcyBjaGFuZ2VkLCBvdGhlcndpc2UgbnVsbHB0cgorICAgICAqIEBwYXJhbSBudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnMgdGhlIG51bWJlciBvZiBpbnB1dCBidWZmZXJzIHRoYXQgYXJlCisgICAgICogICAgICAgICAgICAgICAgICAgIHJldHVybmVkIGZvciB0aGUgZmlyc3QgdGltZSAobm90IHByZXZpb3VzbHkgcmV0dXJuZWQgYnkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgb25JbnB1dEJ1ZmZlckRvbmUoKSkuCisgICAgICovCisgICAgdm9pZCBvbldvcmtEb25lKAorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yaywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQsCisgICAgICAgICAgICBjb25zdCBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0ICppbml0RGF0YSwKKyAgICAgICAgICAgIHNpemVfdCBudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnMpOworCisgICAgLyoqCisgICAgICogTWFrZSBhbiBpbnB1dCBidWZmZXIgYXZhaWxhYmxlIGZvciB0aGUgY2xpZW50IGFzIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQKKyAgICAgKiBieSB0aGUgY29kZWMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmZmVyIFRoZSBidWZmZXIgdGhhdCBiZWNvbWVzIHVudXNlZC4KKyAgICAgKi8KKyAgICB2b2lkIG9uSW5wdXRCdWZmZXJEb25lKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIGJ1ZmZlcik7CisKKyAgICBlbnVtIE1ldGFNb2RlIHsKKyAgICAgICAgTU9ERV9OT05FLAorICAgICAgICBNT0RFX0FOVywKKyAgICB9OworCisgICAgdm9pZCBzZXRNZXRhTW9kZShNZXRhTW9kZSBtb2RlKTsKKworICAgIC8vIEludGVybmFsIGNsYXNzZXMKKyAgICBjbGFzcyBCdWZmZXJzOworICAgIGNsYXNzIElucHV0QnVmZmVyczsKKyAgICBjbGFzcyBPdXRwdXRCdWZmZXJzOworCitwcml2YXRlOgorICAgIGNsYXNzIFF1ZXVlR3VhcmQ7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWFsIG11dGV4LWxpa2Ugb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgorICAgICAqCisgICAgICogLSBBdCBTVE9QUEVEIHN0YXRlIChpbml0aWFsLCBvciBhZnRlciBzdG9wKCkpCisgICAgICogICAtIFF1ZXVlR3VhcmQgb2JqZWN0IGdldHMgY3JlYXRlZCBhdCBTVE9QUEVEIHN0YXRlLCBhbmQgdGhlIGNsaWVudCBpcworICAgICAqICAgICBzdXBwb3NlZCB0byByZXR1cm4gaW1tZWRpYXRlbHkuCisgICAgICogLSBBdCBSVU5OSU5HIHN0YXRlIChhZnRlciBzdGFydCgpKQorICAgICAqICAgLSBFYWNoIFF1ZXVlR3VhcmQgb2JqZWN0CisgICAgICovCisgICAgY2xhc3MgUXVldWVTeW5jIHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8qKgorICAgICAgICAgKiBBdCBjb25zdHJ1Y3Rpb24gdGhlIHN5bmMgb2JqZWN0IGlzIGluIFNUT1BQRUQgc3RhdGUuCisgICAgICAgICAqLworICAgICAgICBpbmxpbmUgUXVldWVTeW5jKCkge30KKyAgICAgICAgflF1ZXVlU3luYygpID0gZGVmYXVsdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVHJhbnNpdGlvbiB0byBSVU5OSU5HIHN0YXRlIHdoZW4gc3RvcHBlZC4gTm8tb3AgaWYgYWxyZWFkeSBpbiBSVU5OSU5HCisgICAgICAgICAqIHN0YXRlLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBzdGFydCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBdCBSVU5OSU5HIHN0YXRlLCB3YWl0IHVudGlsIGFsbCBRdWV1ZUd1YXJkIG9iamVjdCBjcmVhdGVkIGR1cmluZworICAgICAgICAgKiBSVU5OSU5HIHN0YXRlIGFyZSBkZXN0cm95ZWQsIGFuZCB0aGVuIHRyYW5zaXRpb24gdG8gU1RPUFBFRCBzdGF0ZS4KKyAgICAgICAgICogTm8tb3AgaWYgYWxyZWFkeSBpbiBTVE9QUEVEIHN0YXRlLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBzdG9wKCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBNdXRleCBtR3VhcmRMb2NrOworCisgICAgICAgIHN0cnVjdCBDb3VudGVyIHsKKyAgICAgICAgICAgIGlubGluZSBDb3VudGVyKCkgOiB2YWx1ZSgtMSkge30KKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBDb25kaXRpb24gY29uZDsKKyAgICAgICAgfTsKKyAgICAgICAgTXV0ZXhlZDxDb3VudGVyPiBtQ291bnQ7CisKKyAgICAgICAgZnJpZW5kIGNsYXNzIENDb2RlY0J1ZmZlckNoYW5uZWw6OlF1ZXVlR3VhcmQ7CisgICAgfTsKKworICAgIGNsYXNzIFF1ZXVlR3VhcmQgeworICAgIHB1YmxpYzoKKyAgICAgICAgUXVldWVHdWFyZChRdWV1ZVN5bmMgJnN5bmMpOworICAgICAgICB+UXVldWVHdWFyZCgpOworICAgICAgICBpbmxpbmUgYm9vbCBpc1J1bm5pbmcoKSB7IHJldHVybiBtUnVubmluZzsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgUXVldWVTeW5jICZtU3luYzsKKyAgICAgICAgYm9vbCBtUnVubmluZzsKKyAgICB9OworCisgICAgdm9pZCBmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZSgpOworICAgIHZvaWQgZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGVJbnRlcm5hbCgpOworICAgIHN0YXR1c190IHF1ZXVlSW5wdXRCdWZmZXJJbnRlcm5hbChjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKTsKKyAgICBib29sIGhhbmRsZVdvcmsoCisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrLCBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQgKmluaXREYXRhKTsKKyAgICB2b2lkIHNlbmRPdXRwdXRCdWZmZXJzKCk7CisKKyAgICBRdWV1ZVN5bmMgbVN5bmM7CisgICAgc3A8TWVtb3J5RGVhbGVyPiBtRGVhbGVyOworICAgIHNwPElNZW1vcnk+IG1EZWNyeXB0RGVzdGluYXRpb247CisgICAgaW50MzJfdCBtSGVhcFNlcU51bTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gbUNvbXBvbmVudDsKKyAgICBzdGQ6OnN0cmluZyBtQ29tcG9uZW50TmFtZTsgLy8vPCBjb21wb25lbnQgbmFtZSBmb3IgZGVidWdnaW5nCisgICAgY29uc3QgY2hhciAqbU5hbWU7IC8vLzwgQy1zdHJpbmcgdmVyc2lvbiBvZiBjb21wb25lbnQgbmFtZQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDQ29kZWNDYWxsYmFjaz4gbUNDb2RlY0NhbGxiYWNrOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gbUlucHV0QWxsb2NhdG9yOworICAgIFF1ZXVlU3luYyBtUXVldWVTeW5jOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gbVBhcmFtc1RvQmVTZXQ7CisKKyAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnM+PiBtSW5wdXRCdWZmZXJzOworICAgIE11dGV4ZWQ8c3RkOjpsaXN0PHNwPEFCdWZmZXI+Pj4gbUZsdXNoZWRDb25maWdzOworICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnM+PiBtT3V0cHV0QnVmZmVyczsKKworICAgIHN0ZDo6YXRvbWljX3VpbnQ2NF90IG1GcmFtZUluZGV4OworICAgIHN0ZDo6YXRvbWljX3VpbnQ2NF90IG1GaXJzdFZhbGlkRnJhbWVJbmRleDsKKworICAgIHNwPE1lbW9yeURlYWxlcj4gbWFrZU1lbW9yeURlYWxlcihzaXplX3QgaGVhcFNpemUpOworCisgICAgc3RydWN0IE91dHB1dFN1cmZhY2UgeworICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlOworICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uOworICAgIH07CisgICAgTXV0ZXhlZDxPdXRwdXRTdXJmYWNlPiBtT3V0cHV0U3VyZmFjZTsKKworICAgIHN0cnVjdCBCbG9ja1Bvb2xzIHsKKyAgICAgICAgQzJBbGxvY2F0b3I6OmlkX3QgaW5wdXRBbGxvY2F0b3JJZDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBpbnB1dFBvb2w7CisgICAgICAgIEMyQWxsb2NhdG9yOjppZF90IG91dHB1dEFsbG9jYXRvcklkOworICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBvdXRwdXRQb29sSWQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZT4gb3V0cHV0UG9vbEludGY7CisgICAgfTsKKyAgICBNdXRleGVkPEJsb2NrUG9vbHM+IG1CbG9ja1Bvb2xzOworCisgICAgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZVdyYXBwZXI+IG1JbnB1dFN1cmZhY2U7CisKKyAgICBNZXRhTW9kZSBtTWV0YU1vZGU7CisKKyAgICAvLyBQaXBlbGluZUNhcGFjaXR5IGlzIHVzZWQgaW4gdGhlIGlucHV0IGJ1ZmZlciBnYXRpbmcgbG9naWMuCisgICAgLy8KKyAgICAvLyBUaGVyZSBhcmUgdGhyZWUgY3JpdGVyaWEgdGhhdCBuZWVkIHRvIGJlIG1ldCBiZWZvcmUKKyAgICAvLyBvbklucHV0QnVmZmVyQXZhaWxhYmxlKCkgaXMgY2FsbGVkOgorICAgIC8vIDEuIFRoZSBudW1iZXIgb2YgaW5wdXQgYnVmZmVycyB0aGF0IGhhdmUgYmVlbiByZWNlaXZlZCBieQorICAgIC8vICAgIENDb2RlY0J1ZmZlckNoYW5uZWwgYnV0IG5vdCByZXR1cm5lZCB2aWEgb25Xb3JrRG9uZSgpIG9yCisgICAgLy8gICAgb25JbnB1dEJ1ZmZlckRvbmUoKSBkb2VzIG5vdCBleGNlZWQgYSBjZXJ0YWluIGxpbWl0LiAoTGV0IHVzIGNhbGwgdGhpcworICAgIC8vICAgIG51bWJlciB0aGUgImlucHV0IiBjYXBhY2l0eS4pCisgICAgLy8gMi4gVGhlIG51bWJlciBvZiB3b3JrIGl0ZW1zIHRoYXQgaGF2ZSBiZWVuIHJlY2VpdmVkIGJ5CisgICAgLy8gICAgQ0NvZGVjQnVmZmVyQ2hhbm5lbCB3aG9zZSBvdXRwdXRzIGhhdmUgbm90IGJlZW4gcmV0dXJuZWQgZnJvbSB0aGUKKyAgICAvLyAgICBjb21wb25lbnQgKGJ5IGNhbGxpbmcgb25Xb3JrRG9uZSgpKSBkb2VzIG5vdCBleGNlZWQgYSBjZXJ0YWluIGxpbWl0LgorICAgIC8vICAgIChMZXQgdXMgY2FsbCB0aGlzIHRoZSAiY29tcG9uZW50IiBjYXBhY2l0eS4pCisgICAgLy8KKyAgICAvLyBUaGVzZSB0aHJlZSBjcml0ZXJpYSBndWFyYW50ZWUgdGhhdCBhIG5ldyBpbnB1dCBidWZmZXIgdGhhdCBhcnJpdmVzIGZyb20KKyAgICAvLyB0aGUgaW52b2NhdGlvbiBvZiBvbklucHV0QnVmZmVyQXZhaWxhYmxlKCkgd2lsbCBub3QKKyAgICAvLyAxLiBvdmVybG9hZCBDQ29kZWNCdWZmZXJDaGFubmVsJ3MgaW5wdXQgYnVmZmVyczsKKyAgICAvLyAyLiBvdmVybG9hZCB0aGUgY29tcG9uZW50OyBvcgorICAgIC8vCisgICAgc3RydWN0IFBpcGVsaW5lQ2FwYWNpdHkgeworICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBpbnB1dCBjYXBhY2l0eS4KKyAgICAgICAgc3RkOjphdG9taWNfaW50IGlucHV0OworICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBjb21wb25lbnQgY2FwYWNpdHkuCisgICAgICAgIHN0ZDo6YXRvbWljX2ludCBjb21wb25lbnQ7CisKKyAgICAgICAgUGlwZWxpbmVDYXBhY2l0eSgpOworICAgICAgICAvLyBTZXQgdGhlIHZhbHVlcyBvZiAjaW5wdXQgYW5kICNjb21wb25lbnQuCisgICAgICAgIHZvaWQgaW5pdGlhbGl6ZShpbnQgbmV3SW5wdXQsIGludCBuZXdDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuZXdOYW1lID0gIjxVTktOT1dOIENPTVBPTkVOVD4iLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY2FsbGVyVGFnID0gbnVsbHB0cik7CisKKyAgICAgICAgLy8gUmV0dXJuIHRydWUgYW5kIGRlY3JlYXNlICNpbnB1dCBhbmQgI2NvbXBvbmVudCBieSBvbmUgaWYKKyAgICAgICAgLy8gdGhleSBhcmUgYWxsIGdyZWF0ZXIgdGhhbiB6ZXJvOyByZXR1cm4gZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICAvLworICAgICAgICAvLyBjYWxsZXJUYWcgaXMgdXNlZCBmb3IgbG9nZ2luZyBvbmx5LgorICAgICAgICAvLworICAgICAgICAvLyBhbGxvY2F0ZSgpIGlzIGNhbGxlZCBieSBDQ29kZWNCdWZmZXJDaGFubmVsIHRvIGNoZWNrIHdoZXRoZXIgaXQgY2FuCisgICAgICAgIC8vIHJlY2VpdmUgYW5vdGhlciBpbnB1dCBidWZmZXIuIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgdHJ1ZSwKKyAgICAgICAgLy8gb25JbnB1dEJ1ZmZlckF2YWlsYWJsZSgpIGFuZCBvbk91dHB1dEJ1ZmZlckF2YWlsYWJsZSgpIGNhbiBiZSBjYWxsZWQKKyAgICAgICAgLy8gYWZ0ZXJ3YXJkcy4KKyAgICAgICAgYm9vbCBhbGxvY2F0ZShjb25zdCBjaGFyKiBjYWxsZXJUYWcgPSBudWxscHRyKTsKKworICAgICAgICAvLyBJbmNyZWFzZSAjaW5wdXQgYW5kICNjb21wb25lbnQgYnkgb25lLgorICAgICAgICAvLworICAgICAgICAvLyBjYWxsZXJUYWcgaXMgdXNlZCBmb3IgbG9nZ2luZyBvbmx5LgorICAgICAgICAvLworICAgICAgICAvLyBmcmVlKCkgaXMgY2FsbGVkIGJ5IENDb2RlY0J1ZmZlckNoYW5uZWwgYWZ0ZXIgYWxsb2NhdGUoKSByZXR1cm5zIHRydWUKKyAgICAgICAgLy8gYnV0IG9uSW5wdXRCdWZmZXJBdmFpbGFibGUoKSBjYW5ub3QgYmUgY2FsbGVkIGZvciBhbnkgcmVhc29ucy4gSXQKKyAgICAgICAgLy8gZXNzZW50aWFsbHkgdW5kb2VzIGFuIGFsbG9jYXRlKCkgY2FsbC4KKyAgICAgICAgdm9pZCBmcmVlKGNvbnN0IGNoYXIqIGNhbGxlclRhZyA9IG51bGxwdHIpOworCisgICAgICAgIC8vIEluY3JlYXNlICNpbnB1dCBieSBAcCBudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnMuCisgICAgICAgIC8vCisgICAgICAgIC8vIGNhbGxlclRhZyBpcyB1c2VkIGZvciBsb2dnaW5nIG9ubHkuCisgICAgICAgIC8vCisgICAgICAgIC8vIGZyZWVJbnB1dFNsb3RzKCkgaXMgY2FsbGVkIGJ5IENDb2RlY0J1ZmZlckNoYW5uZWwgd2hlbiBvbldvcmtEb25lKCkKKyAgICAgICAgLy8gb3Igb25JbnB1dEJ1ZmZlckRvbmUoKSBpcyBjYWxsZWQuIEBwIG51bURpc2NhcmRlZElucHV0QnVmZmVycyBpcworICAgICAgICAvLyBwcm92aWRlZCBpbiBvbldvcmtEb25lKCksIGFuZCBpcyAxIGluIG9uSW5wdXRCdWZmZXJEb25lKCkuCisgICAgICAgIGludCBmcmVlSW5wdXRTbG90cyhzaXplX3QgbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY2FsbGVyVGFnID0gbnVsbHB0cik7CisKKyAgICAgICAgLy8gSW5jcmVhc2UgI2NvbXBvbmVudCBieSBvbmUgYW5kIHJldHVybiB0aGUgdXBkYXRlZCB2YWx1ZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gY2FsbGVyVGFnIGlzIHVzZWQgZm9yIGxvZ2dpbmcgb25seS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gZnJlZUNvbXBvbmVudFNsb3QoKSBpcyBjYWxsZWQgYnkgQ0NvZGVjQnVmZmVyQ2hhbm5lbCB3aGVuCisgICAgICAgIC8vIG9uV29ya0RvbmUoKSBpcyBjYWxsZWQuCisgICAgICAgIGludCBmcmVlQ29tcG9uZW50U2xvdChjb25zdCBjaGFyKiBjYWxsZXJUYWcgPSBudWxscHRyKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIC8vIENvbXBvbmVudCBuYW1lLiBVc2VkIGZvciBsb2dnaW5nLgorICAgICAgICBjb25zdCBjaGFyKiBtTmFtZTsKKyAgICB9OworICAgIFBpcGVsaW5lQ2FwYWNpdHkgbUF2YWlsYWJsZVBpcGVsaW5lQ2FwYWNpdHk7CisKKyAgICBjbGFzcyBSZW9yZGVyU3Rhc2ggeworICAgIHB1YmxpYzoKKyAgICAgICAgc3RydWN0IEVudHJ5IHsKKyAgICAgICAgICAgIGlubGluZSBFbnRyeSgpIDogYnVmZmVyKG51bGxwdHIpLCB0aW1lc3RhbXAoMCksIGZsYWdzKDApLCBvcmRpbmFsKHswLCAwLCAwfSkge30KKyAgICAgICAgICAgIGlubGluZSBFbnRyeSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYiwKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0LAorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGYsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgJm8pCisgICAgICAgICAgICAgICAgOiBidWZmZXIoYiksIHRpbWVzdGFtcCh0KSwgZmxhZ3MoZiksIG9yZGluYWwobykge30KKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyOworICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXA7CisgICAgICAgICAgICBpbnQzMl90IGZsYWdzOworICAgICAgICAgICAgQzJXb3JrT3JkaW5hbFN0cnVjdCBvcmRpbmFsOworICAgICAgICB9OworCisgICAgICAgIFJlb3JkZXJTdGFzaCgpOworCisgICAgICAgIHZvaWQgY2xlYXIoKTsKKyAgICAgICAgdm9pZCBzZXREZXB0aCh1aW50MzJfdCBkZXB0aCk7CisgICAgICAgIHZvaWQgc2V0S2V5KEMyQ29uZmlnOjpvcmRpbmFsX2tleV90IGtleSk7CisgICAgICAgIGJvb2wgcG9wKEVudHJ5ICplbnRyeSk7CisgICAgICAgIHZvaWQgZW1wbGFjZSgKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgaW50MzJfdCBmbGFncywKKyAgICAgICAgICAgICAgICBjb25zdCBDMldvcmtPcmRpbmFsU3RydWN0ICZvcmRpbmFsKTsKKyAgICAgICAgdm9pZCBkZWZlcihjb25zdCBFbnRyeSAmZW50cnkpOworICAgICAgICBib29sIGhhc1BlbmRpbmcoKSBjb25zdDsKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6bGlzdDxFbnRyeT4gbVBlbmRpbmc7CisgICAgICAgIHN0ZDo6bGlzdDxFbnRyeT4gbVN0YXNoOworICAgICAgICB1aW50MzJfdCBtRGVwdGg7CisgICAgICAgIEMyQ29uZmlnOjpvcmRpbmFsX2tleV90IG1LZXk7CisKKyAgICAgICAgYm9vbCBsZXNzKGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgJm8xLCBjb25zdCBDMldvcmtPcmRpbmFsU3RydWN0ICZvMik7CisgICAgfTsKKyAgICBNdXRleGVkPFJlb3JkZXJTdGFzaD4gbVJlb3JkZXJTdGFzaDsKKworICAgIHN0ZDo6YXRvbWljX2Jvb2wgbUlucHV0TWV0RW9zOworCisgICAgaW5saW5lIGJvb2wgaGFzQ3J5cHRvT3JEZXNjcmFtYmxlcigpIHsKKyAgICAgICAgcmV0dXJuIG1DcnlwdG8gIT0gbnVsbHB0ciB8fCBtRGVzY3JhbWJsZXIgIT0gbnVsbHB0cjsKKyAgICB9Cit9OworCisvLyBDb252ZXJzaW9uIG9mIGEgYzJfc3RhdHVzX3QgdmFsdWUgdG8gYSBzdGF0dXNfdCB2YWx1ZSBtYXkgZGVwZW5kIG9uIHRoZQorLy8gb3BlcmF0aW9uIHRoYXQgcmV0dXJucyB0aGUgYzJfc3RhdHVzX3QgdmFsdWUuCitlbnVtIGMyX29wZXJhdGlvbl90IHsKKyAgICBDMl9PUEVSQVRJT05fTk9ORSwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X2Nvbm5lY3RUb09teElucHV0U3VyZmFjZSwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X2NyZWF0ZUJsb2NrUG9vbCwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X2Rlc3Ryb3lCbG9ja1Bvb2wsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9kaXNjb25uZWN0RnJvbUlucHV0U3VyZmFjZSwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X2RyYWluLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfZmx1c2gsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9xdWV1ZSwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X3JlbGVhc2UsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9yZXNldCwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X3NldE91dHB1dFN1cmZhY2UsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9zdGFydCwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X3N0b3AsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudFN0b3JlX2NvcHlCdWZmZXIsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudFN0b3JlX2NyZWF0ZUNvbXBvbmVudCwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50U3RvcmVfY3JlYXRlSW5wdXRTdXJmYWNlLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRTdG9yZV9jcmVhdGVJbnRlcmZhY2UsCisgICAgQzJfT1BFUkFUSU9OX0NvbmZpZ3VyYWJsZV9jb25maWcsCisgICAgQzJfT1BFUkFUSU9OX0NvbmZpZ3VyYWJsZV9xdWVyeSwKKyAgICBDMl9PUEVSQVRJT05fQ29uZmlndXJhYmxlX3F1ZXJ5U3VwcG9ydGVkUGFyYW1zLAorICAgIEMyX09QRVJBVElPTl9Db25maWd1cmFibGVfcXVlcnlTdXBwb3J0ZWRWYWx1ZXMsCisgICAgQzJfT1BFUkFUSU9OX0lucHV0U3VyZmFjZV9jb25uZWN0VG9Db21wb25lbnQsCisgICAgQzJfT1BFUkFUSU9OX0lucHV0U3VyZmFjZUNvbm5lY3Rpb25fZGlzY29ubmVjdCwKK307CisKK3N0YXR1c190IHRvU3RhdHVzVChjMl9zdGF0dXNfdCBjMnMsIGMyX29wZXJhdGlvbl90IGMyb3AgPSBDMl9PUEVSQVRJT05fTk9ORSk7CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ0NPREVDX0JVRkZFUl9DSEFOTkVMX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQ29uZmlnLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMDJlNzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQ29uZmlnLmNwcApAQCAtMCwwICsxLDE2MTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNDb2RlY0NvbmZpZyIKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CisKKyNpbmNsdWRlICJDQ29kZWNDb25maWcuaCIKKyNpbmNsdWRlICJDb2RlYzJNYXBwZXIuaCIKKworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfUkVGX0xFVkVMIDY0ICAvKiA2NCotMC4yNWRCID0gLTE2IGRCIGJlbG93IGZ1bGwgc2NhbGUgZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQ1VUICAgMTI3IC8qIG1heGltdW0gY29tcHJlc3Npb24gb2YgZHluYW1pYyByYW5nZSBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19CT09TVCAxMjcgLyogbWF4aW11bSBjb21wcmVzc2lvbiBvZiBkeW5hbWljIHJhbmdlIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0hFQVZZIDEgICAvKiBzd2l0Y2ggZm9yIGhlYXZ5IGNvbXByZXNzaW9uIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0VGRkVDVCAzICAvKiBNUEVHLUQgRFJDIGVmZmVjdCB0eXBlOyAzID0+IExpbWl0ZWQgcGxheWJhY2sgcmFuZ2UgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0VOQ19MRVZFTCAoLTEpIC8qIGVuY29kZXIgdGFyZ2V0IGxldmVsOyAtMSA9PiB0aGUgdmFsdWUgaXMgdW5rbm93biwgb3RoZXJ3aXNlIGRCIHN0ZXAgdmFsdWUgKGUuZy4gNjQgZm9yIC0xNiBkQikgKi8KKy8vIG5hbWVzIG9mIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBEUkMgc2V0dGluZ3MKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfUkVGX0xFVkVMICAiYWFjX2RyY19yZWZlcmVuY2VfbGV2ZWwiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0NVVCAgICAgICAgImFhY19kcmNfY3V0IgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9CT09TVCAgICAgICJhYWNfZHJjX2Jvb3N0IgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9IRUFWWSAgICAgICJhYWNfZHJjX2hlYXZ5IgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9FTkNfTEVWRUwgICJhYWNfZHJjX2VuY190YXJnZXRfbGV2ZWwiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0VGRkVDVCAgICAgInJvLmFhY19kcmNfZWZmZWN0X3R5cGUiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gQ0NvZGVjQ29uZmlnCisKK25hbWVzcGFjZSB7CisKKy8qKgorICogbWFwcGluZyBiZXR3ZWVuIFNESyBhbmQgQ29kZWMgMi4wIGNvbmZpZ3VyYXRpb25zLgorICovCitzdHJ1Y3QgQ29uZmlnTWFwcGVyIHsKKyAgICAvKioKKyAgICAgKiBWYWx1ZSBtYXBwZXIgKEMyVmFsdWUgPT4gQzJWYWx1ZSkKKyAgICAgKi8KKyAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248QzJWYWx1ZShDMlZhbHVlKT4gTWFwcGVyOworCisgICAgLy8vIHNob3J0aGFuZAorICAgIHR5cGVkZWYgQ0NvZGVjQ29uZmlnOjpEb21haW4gRG9tYWluOworCisgICAgQ29uZmlnTWFwcGVyKHN0ZDo6c3RyaW5nIG1lZGlhS2V5LCBDMlN0cmluZyBjMnN0cnVjdCwgQzJTdHJpbmcgYzJmaWVsZCkKKyAgICAgICAgOiBtRG9tYWluKERvbWFpbjo6QUxMKSwgbU1lZGlhS2V5KG1lZGlhS2V5KSwgbVN0cnVjdChjMnN0cnVjdCksIG1GaWVsZChjMmZpZWxkKSB7IH0KKworICAgIC8vLyBMaW1pdHMgdGhpcyBwYXJhbWV0ZXIgdG8gdGhlIGdpdmVuIGRvbWFpbgorICAgIENvbmZpZ01hcHBlciAmbGltaXRUbyh1aW50MzJfdCBkb21haW4pIHsKKyAgICAgICAgQzJfQ0hFQ0soZG9tYWluICYgRG9tYWluOjpHVUFSRF9CSVQpOworICAgICAgICBtRG9tYWluID0gRG9tYWluKG1Eb21haW4gJiBkb21haW4pOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLy8vIEFkZHMgU0RLID0+IENvZGVjIDIuMCBtYXBwZXIgKHNob3VsZCBub3QgYmUgaW4gdGhlIFNESyBmb3JtYXQpCisgICAgQ29uZmlnTWFwcGVyICZ3aXRoTWFwcGVyKE1hcHBlciBtYXBwZXIpIHsKKyAgICAgICAgQzJfQ0hFQ0soIW1NYXBwZXIpOworICAgICAgICBDMl9DSEVDSyghbVJldmVyc2UpOworICAgICAgICBtTWFwcGVyID0gbWFwcGVyOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLy8vIEFkZHMgU0RLIDw9PiBDb2RlYyAyLjAgdmFsdWUgbWFwcGVycworICAgIENvbmZpZ01hcHBlciAmd2l0aE1hcHBlcnMoTWFwcGVyIG1hcHBlciwgTWFwcGVyIHJldmVyc2UpIHsKKyAgICAgICAgQzJfQ0hFQ0soIW1NYXBwZXIpOworICAgICAgICBDMl9DSEVDSyghbVJldmVyc2UpOworICAgICAgICBtTWFwcGVyID0gbWFwcGVyOworICAgICAgICBtUmV2ZXJzZSA9IHJldmVyc2U7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLy8gQWRkcyBTREsgPD0+IENvZGVjIDIuMCB2YWx1ZSBtYXBwZXJzIGJhc2VkIG9uIEMyTWFwcGVyCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQzJUeXBlLCB0eXBlbmFtZSBTZGtUeXBlPWludDMyX3Q+CisgICAgQ29uZmlnTWFwcGVyICZ3aXRoQzJNYXBwZXJzKCkgeworICAgICAgICBDMl9DSEVDSyghbU1hcHBlcik7CisgICAgICAgIEMyX0NIRUNLKCFtUmV2ZXJzZSk7CisgICAgICAgIG1NYXBwZXIgPSBbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgU2RrVHlwZSBzZGtWYWx1ZTsKKyAgICAgICAgICAgIEMyVHlwZSBjMlZhbHVlOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZzZGtWYWx1ZSkgJiYgQzJNYXBwZXI6Om1hcChzZGtWYWx1ZSwgJmMyVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGMyVmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9OworICAgICAgICBtUmV2ZXJzZSA9IFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBTZGtUeXBlIHNka1ZhbHVlOworICAgICAgICAgICAgQzJUeXBlIGMyVmFsdWU7CisgICAgICAgICAgICB1c2luZyBDMlZhbHVlVHlwZT10eXBlbmFtZSBfYzJfcmVkdWNlX2VudW1fdG9fdW5kZXJseWluZ190eXBlPEMyVHlwZT46OnR5cGU7CisgICAgICAgICAgICBpZiAodi5nZXQoKEMyVmFsdWVUeXBlKikmYzJWYWx1ZSkgJiYgQzJNYXBwZXI6Om1hcChjMlZhbHVlLCAmc2RrVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNka1ZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8vLyBNYXBzIGZyb20gU0RLIHZhbHVlcyBpbiBhbiBBTWVzc2FnZSB0byBhIHN1aXRhYmxlIEMyVmFsdWUuCisgICAgQzJWYWx1ZSBtYXBGcm9tTWVzc2FnZShjb25zdCBBTWVzc2FnZTo6SXRlbURhdGEgJml0ZW0pIGNvbnN0IHsKKyAgICAgICAgQzJWYWx1ZSB2YWx1ZTsKKyAgICAgICAgaW50MzJfdCBpbnQzMlZhbHVlOworICAgICAgICBpbnQ2NF90IGludDY0VmFsdWU7CisgICAgICAgIGZsb2F0IGZsb2F0VmFsdWU7CisgICAgICAgIGRvdWJsZSBkb3VibGVWYWx1ZTsKKyAgICAgICAgaWYgKGl0ZW0uZmluZCgmaW50MzJWYWx1ZSkpIHsKKyAgICAgICAgICAgIHZhbHVlID0gaW50MzJWYWx1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChpdGVtLmZpbmQoJmludDY0VmFsdWUpKSB7CisgICAgICAgICAgICB2YWx1ZSA9IGludDY0VmFsdWU7CisgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5maW5kKCZmbG9hdFZhbHVlKSkgeworICAgICAgICAgICAgdmFsdWUgPSBmbG9hdFZhbHVlOworICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uZmluZCgmZG91YmxlVmFsdWUpKSB7CisgICAgICAgICAgICB2YWx1ZSA9IChmbG9hdClkb3VibGVWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUudHlwZSgpICE9IEMyVmFsdWU6Ok5PX0lOSVQgJiYgbU1hcHBlcikgeworICAgICAgICAgICAgdmFsdWUgPSBtTWFwcGVyKHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgLy8vIE1hcHMgZnJvbSBhIEMyVmFsdWUgdG8gYW4gU0RLIHZhbHVlIGluIGFuIEFNZXNzYWdlLgorICAgIEFNZXNzYWdlOjpJdGVtRGF0YSBtYXBUb01lc3NhZ2UoQzJWYWx1ZSB2YWx1ZSkgY29uc3QgeworICAgICAgICBBTWVzc2FnZTo6SXRlbURhdGEgaXRlbTsKKyAgICAgICAgaW50MzJfdCBpbnQzMlZhbHVlOworICAgICAgICB1aW50MzJfdCB1aW50MzJWYWx1ZTsKKyAgICAgICAgaW50NjRfdCBpbnQ2NFZhbHVlOworICAgICAgICB1aW50NjRfdCB1aW50NjRWYWx1ZTsKKyAgICAgICAgZmxvYXQgZmxvYXRWYWx1ZTsKKyAgICAgICAgaWYgKHZhbHVlLnR5cGUoKSAhPSBDMlZhbHVlOjpOT19JTklUICYmIG1SZXZlcnNlKSB7CisgICAgICAgICAgICB2YWx1ZSA9IG1SZXZlcnNlKHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUuZ2V0KCZpbnQzMlZhbHVlKSkgeworICAgICAgICAgICAgaXRlbS5zZXQoaW50MzJWYWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuZ2V0KCZ1aW50MzJWYWx1ZSkgJiYgdWludDMyVmFsdWUgPD0gdWludDMyX3QoSU5UMzJfTUFYKSkgeworICAgICAgICAgICAgLy8gU0RLIGRvZXMgbm90IHN1cHBvcnQgdW5zaWduZWQgdmFsdWVzCisgICAgICAgICAgICBpdGVtLnNldCgoaW50MzJfdCl1aW50MzJWYWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuZ2V0KCZpbnQ2NFZhbHVlKSkgeworICAgICAgICAgICAgaXRlbS5zZXQoaW50NjRWYWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuZ2V0KCZ1aW50NjRWYWx1ZSkgJiYgdWludDY0VmFsdWUgPD0gdWludDY0X3QoSU5UNjRfTUFYKSkgeworICAgICAgICAgICAgLy8gU0RLIGRvZXMgbm90IHN1cHBvcnQgdW5zaWduZWQgdmFsdWVzCisgICAgICAgICAgICBpdGVtLnNldCgoaW50NjRfdCl1aW50NjRWYWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuZ2V0KCZmbG9hdFZhbHVlKSkgeworICAgICAgICAgICAgaXRlbS5zZXQoZmxvYXRWYWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgfQorCisgICAgRG9tYWluIGRvbWFpbigpIGNvbnN0IHsgcmV0dXJuIG1Eb21haW47IH0KKyAgICBzdGQ6OnN0cmluZyBtZWRpYUtleSgpIGNvbnN0IHsgcmV0dXJuIG1NZWRpYUtleTsgfQorICAgIHN0ZDo6c3RyaW5nIHBhdGgoKSBjb25zdCB7IHJldHVybiBtRmllbGQuc2l6ZSgpID8gbVN0cnVjdCArICcuJyArIG1GaWVsZCA6IG1TdHJ1Y3Q7IH0KKyAgICBNYXBwZXIgbWFwcGVyKCkgY29uc3QgeyByZXR1cm4gbU1hcHBlcjsgfQorICAgIE1hcHBlciByZXZlcnNlKCkgY29uc3QgeyByZXR1cm4gbVJldmVyc2U7IH0KKworcHJpdmF0ZToKKyAgICBEb21haW4gbURvbWFpbjsgICAgICAgICAvLy88IHBhcmFtZXRlciBkb21haW4gKG1hc2spIGNvbnRhaW5pbmcgcG9ydCwga2luZCBhbmQgY29uZmlnIGRvbWFpbnMKKyAgICBzdGQ6OnN0cmluZyBtTWVkaWFLZXk7ICAvLy88IFNESyBrZXkKKyAgICBDMlN0cmluZyBtU3RydWN0OyAgICAgICAvLy88IENvZGVjIDIuMCBzdHJ1Y3QgbmFtZQorICAgIEMyU3RyaW5nIG1GaWVsZDsgICAgICAgIC8vLzwgQ29kZWMgMi4wIGZpZWxkIG5hbWUKKyAgICBNYXBwZXIgbU1hcHBlcjsgICAgICAgICAvLy88IG9wdGlvbmFsIFNESyA9PiBDb2RlYyAyLjAgdmFsdWUgbWFwcGVyCisgICAgTWFwcGVyIG1SZXZlcnNlOyAgICAgICAgLy8vPCBvcHRpb25hbCBDb2RlYyAyLjAgPT4gU0RLIHZhbHVlIG1hcHBlcgorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFBPUlQsIHR5cGVuYW1lIFNUUkVBTT4KK0FTdHJpbmcgUXVlcnlNZWRpYVR5cGVJbXBsKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wb25lbnQpIHsKKyAgICBBU3RyaW5nIG1lZGlhVHlwZTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgYzJfc3RhdHVzX3QgYzJlcnIgPSBjb21wb25lbnQtPnF1ZXJ5KAorICAgICAgICAgICAge30sIHsgUE9SVDo6UEFSQU1fVFlQRSwgU1RSRUFNOjpQQVJBTV9UWVBFIH0sIEMyX0RPTlRfQkxPQ0ssICZxdWVyaWVkKTsKKyAgICBpZiAoYzJlcnIgIT0gQzJfT0sgJiYgcXVlcmllZC5zaXplKCkgPT0gMCkgeworICAgICAgICBBTE9HRCgiUXVlcnkgbWVkaWEgdHlwZSBmYWlsZWQgPT4gJXMiLCBhc1N0cmluZyhjMmVycikpOworICAgIH0gZWxzZSB7CisgICAgICAgIFBPUlQgKnBvcnRNZWRpYVR5cGUgPQorICAgICAgICAgICAgUE9SVDo6RnJvbShxdWVyaWVkWzBdLmdldCgpKTsKKyAgICAgICAgaWYgKHBvcnRNZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIG1lZGlhVHlwZSA9IEFTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIHBvcnRNZWRpYVR5cGUtPm0udmFsdWUsCisgICAgICAgICAgICAgICAgICAgIHN0cm5sZW4ocG9ydE1lZGlhVHlwZS0+bS52YWx1ZSwgcG9ydE1lZGlhVHlwZS0+ZmxleENvdW50KCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNUUkVBTSAqc3RyZWFtTWVkaWFUeXBlID0gU1RSRUFNOjpGcm9tKHF1ZXJpZWRbMF0uZ2V0KCkpOworICAgICAgICAgICAgaWYgKHN0cmVhbU1lZGlhVHlwZSkgeworICAgICAgICAgICAgICAgIG1lZGlhVHlwZSA9IEFTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1NZWRpYVR5cGUtPm0udmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJubGVuKHN0cmVhbU1lZGlhVHlwZS0+bS52YWx1ZSwgc3RyZWFtTWVkaWFUeXBlLT5mbGV4Q291bnQoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dEKCJyZWFkIG1lZGlhIHR5cGU6ICVzIiwgbWVkaWFUeXBlLmNfc3RyKCkpOworICAgIH0KKyAgICByZXR1cm4gbWVkaWFUeXBlOworfQorCitBU3RyaW5nIFF1ZXJ5TWVkaWFUeXBlKAorICAgICAgICBib29sIGlucHV0LCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wb25lbnQpIHsKKyAgICB0eXBlZGVmIEMyUG9ydE1lZGlhVHlwZVNldHRpbmcgUDsKKyAgICB0eXBlZGVmIEMyU3RyZWFtTWVkaWFUeXBlU2V0dGluZyBTOworICAgIGlmIChpbnB1dCkgeworICAgICAgICByZXR1cm4gUXVlcnlNZWRpYVR5cGVJbXBsPFA6OmlucHV0LCBTOjppbnB1dD4oY29tcG9uZW50KTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gUXVlcnlNZWRpYVR5cGVJbXBsPFA6Om91dHB1dCwgUzo6b3V0cHV0Pihjb21wb25lbnQpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8qKgorICogU2V0IG9mIHN0YW5kYXJkIHBhcmFtZXRlcnMgdXNlZCBieSBDQ29kZWMgdGhhdCBhcmUgZXhwb3NlZCB0byBNZWRpYUNvZGVjLgorICovCitzdHJ1Y3QgU3RhbmRhcmRQYXJhbXMgeworICAgIHR5cGVkZWYgQ0NvZGVjQ29uZmlnOjpEb21haW4gRG9tYWluOworCisgICAgLy8gc3RhbmRhcmQgKE1lZGlhQ29kZWMpIHBhcmFtcyBhcmUga2V5ZWQgYnkgbWVkaWEgZm9ybWF0IGtleQorICAgIHR5cGVkZWYgc3RkOjpzdHJpbmcgU2RrS2V5OworCisgICAgLy8vIHVzZWQgdG8gcmV0dXJuIHJlZmVyZW5jZSB0byBubyBjb25maWcgbWFwcGVycyBpbiBnZXRDb25maWdNYXBwZXJzRm9yU2RrS2V5CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPENvbmZpZ01hcHBlcj4gTk9fTUFQUEVSUzsKKworICAgIC8vLyBSZXR1cm5zIENvZGVjIDIuMCBlcXVpdmFsZW50IHBhcmFtZXRlcnMgZm9yIGFuIFNESyBmb3JtYXQga2V5LgorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENvbmZpZ01hcHBlcj4gJmdldENvbmZpZ01hcHBlcnNGb3JTZGtLZXkoc3RkOjpzdHJpbmcga2V5KSBjb25zdCB7CisgICAgICAgIGF1dG8gaXQgPSBtQ29uZmlnTWFwcGVycy5maW5kKGtleSk7CisgICAgICAgIGlmIChpdCA9PSBtQ29uZmlnTWFwcGVycy5lbmQoKSkgeworICAgICAgICAgICAgQUxPR0QoIm5vIGMyIGVxdWl2YWxlbnRzIGZvciAlcyIsIGtleS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19NQVBQRVJTOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJmb3VuZCAlenUgZXFzIGZvciAlcyIsIGl0LT5zZWNvbmQuc2l6ZSgpLCBrZXkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBTREsgPD0+IENvZGVjIDIuMCBwYXJhbWV0ZXIgbWFwcGluZy4gTXVsdGlwbGUgQ29kZWMgMi4wIHBhcmFtZXRlcnMgbWF5IG1hcCB0byBhCisgICAgICogc2luZ2xlIFNESyBrZXksIGluIHdoaWNoIGNhc2UgdGhleSBzaGFsbCBiZSBvcmRlcmVkIGZyb20gbGVhc3QgYXV0aG9yaXRhdGl2ZSB0byBtb3N0CisgICAgICogYXV0aG9yaXRhdGl2ZS4gV2hlbiBjb25zdHJ1Y3RpbmcgU0RLIGZvcm1hdHMsIHRoZSBsYXN0IG1hcHBlZCBDb2RlYyAyLjAgcGFyYW1ldGVyIHRoYXQKKyAgICAgKiBpcyBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBvbmVudCB3aWxsIGRldGVybWluZSB0aGUgZXhwb3NlZCB2YWx1ZS4gKFRPRE86IHBlcmhhcHMgcmVzdHJpY3QgdGhpcworICAgICAqIGJ5IGRvbWFpbi4pCisgICAgICovCisgICAgdm9pZCBhZGQoY29uc3QgQ29uZmlnTWFwcGVyICZjbSkgeworICAgICAgICBhdXRvIGl0ID0gbUNvbmZpZ01hcHBlcnMuZmluZChjbS5tZWRpYUtleSgpKTsKKyAgICAgICAgQUxPR1YoIiVjJWMlYyVjICVjJWMlYyAlMDR4ICU5cyAlcyA9PiAlcyIsCisgICAgICAgICAgICAgICgoY20uZG9tYWluKCkgJiBEb21haW46OklTX0lOUFVUKSA/ICdJJyA6ICcgJyksCisgICAgICAgICAgICAgICgoY20uZG9tYWluKCkgJiBEb21haW46OklTX09VVFBVVCkgPyAnTycgOiAnICcpLAorICAgICAgICAgICAgICAoKGNtLmRvbWFpbigpICYgRG9tYWluOjpJU19DT0RFRCkgPyAnQycgOiAnICcpLAorICAgICAgICAgICAgICAoKGNtLmRvbWFpbigpICYgRG9tYWluOjpJU19SQVcpID8gJ1InIDogJyAnKSwKKyAgICAgICAgICAgICAgKChjbS5kb21haW4oKSAmIERvbWFpbjo6SVNfQ09ORklHKSA/ICdjJyA6ICcgJyksCisgICAgICAgICAgICAgICgoY20uZG9tYWluKCkgJiBEb21haW46OklTX1BBUkFNKSA/ICdwJyA6ICcgJyksCisgICAgICAgICAgICAgICgoY20uZG9tYWluKCkgJiBEb21haW46OklTX1JFQUQpID8gJ3InIDogJyAnKSwKKyAgICAgICAgICAgICAgY20uZG9tYWluKCksCisgICAgICAgICAgICAgIGl0ID09IG1Db25maWdNYXBwZXJzLmVuZCgpID8gImFkZGluZyIgOiAiZXh0ZW5kaW5nIiwKKyAgICAgICAgICAgICAgY20ubWVkaWFLZXkoKS5jX3N0cigpLCBjbS5wYXRoKCkuY19zdHIoKSk7CisgICAgICAgIGlmIChpdCA9PSBtQ29uZmlnTWFwcGVycy5lbmQoKSkgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q29uZmlnTWFwcGVyPiBlcXMgPSB7IGNtIH07CisgICAgICAgICAgICBtQ29uZmlnTWFwcGVycy5lbXBsYWNlKGNtLm1lZGlhS2V5KCksIGVxcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpdC0+c2Vjb25kLnB1c2hfYmFjayhjbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFsbCBwYXRocyBmb3IgYSBzcGVjaWZpYyBkb21haW4uCisgICAgICoKKyAgICAgKiBccGFyYW0gYW55IG1heGltdW0gZG9tYWluIG1hc2suIFJldHVybmVkIHBhcmFtZXRlcnMgbXVzdCBtYXRjaCBhdCBsZWFzdCBvbmUgb2YgdGhlIGRvbWFpbnMKKyAgICAgKiAgICAgICAgICAgIGluIHRoZSBtYXNrLgorICAgICAqIFxwYXJhbSBhbGwgbWluaW11bSBkb21haW4gbWFzay4gUmV0dXJuZWQgcGFyYW1ldGVycyBtdXN0IG1hdGNoIGFsbCBvZiB0aGUgZG9tYWlucyBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgIG1hc2suIFRoaXMgaXMgcmVzdHJpY3RlZCB0byB0aGUgYml0cyBvZiB0aGUgbWF4aW11bSBtYXNrLgorICAgICAqLworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBnZXRQYXRoc0ZvckRvbWFpbigKKyAgICAgICAgICAgIERvbWFpbiBhbnksIERvbWFpbiBhbGwgPSBEb21haW46OkFMTCkgY29uc3QgeworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcmVzOworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8Q29uZmlnTWFwcGVyPj4gJmVsIDogbUNvbmZpZ01hcHBlcnMpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgQ29uZmlnTWFwcGVyICZjbSA6IGVsLnNlY29uZCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJmaWx0ZXJpbmcgJXMgJXggJXggJXggJXgiLCBjbS5wYXRoKCkuY19zdHIoKSwgY20uZG9tYWluKCksIGFueSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChjbS5kb21haW4oKSAmIGFueSksIChjbS5kb21haW4oKSAmIGFueSAmIGFsbCkpOworICAgICAgICAgICAgICAgIGlmICgoY20uZG9tYWluKCkgJiBhbnkpICYmICgoY20uZG9tYWluKCkgJiBhbnkgJiBhbGwpID09IChhbnkgJiBhbGwpKSkgeworICAgICAgICAgICAgICAgICAgICByZXMucHVzaF9iYWNrKGNtLnBhdGgoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBTREsgPD0+IENvZGVjIDIuMCBtYXBwaW5ncy4KKyAgICAgKgorICAgICAqIFRPRE86IHJlcGxhY2UgdGhlc2Ugd2l0aCBiZXR0ZXIgbWV0aG9kcyBhcyB0aGlzIGV4cG9zZXMgdGhlIGlubmVyIHN0cnVjdHVyZS4KKyAgICAgKi8KKyAgICBjb25zdCBzdGQ6Om1hcDxTZGtLZXksIHN0ZDo6dmVjdG9yPENvbmZpZ01hcHBlcj4+IGdldEtleXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ29uZmlnTWFwcGVyczsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjptYXA8U2RrS2V5LCBzdGQ6OnZlY3RvcjxDb25maWdNYXBwZXI+PiBtQ29uZmlnTWFwcGVyczsKK307CisKK2NvbnN0IHN0ZDo6dmVjdG9yPENvbmZpZ01hcHBlcj4gU3RhbmRhcmRQYXJhbXM6Ok5PX01BUFBFUlM7CisKKworQ0NvZGVjQ29uZmlnOjpDQ29kZWNDb25maWcoKQorICAgIDogbUlucHV0Rm9ybWF0KG5ldyBBTWVzc2FnZSksCisgICAgICBtT3V0cHV0Rm9ybWF0KG5ldyBBTWVzc2FnZSksCisgICAgICBtVXNpbmdTdXJmYWNlKGZhbHNlKSB7IH0KKwordm9pZCBDQ29kZWNDb25maWc6OmluaXRpYWxpemVTdGFuZGFyZFBhcmFtcygpIHsKKyAgICB0eXBlZGVmIERvbWFpbiBEOworICAgIG1TdGFuZGFyZFBhcmFtcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8U3RhbmRhcmRQYXJhbXM+KCk7CisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IENvbmZpZ01hcHBlciAmKT4gYWRkID0KKyAgICAgICAgW3BhcmFtcyA9IG1TdGFuZGFyZFBhcmFtc10oY29uc3QgQ29uZmlnTWFwcGVyICZjbSkgeworICAgICAgICAgICAgcGFyYW1zLT5hZGQoY20pOworICAgIH07CisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IENvbmZpZ01hcHBlciAmKT4gZGVwcmVjYXRlZCA9IGFkZDsKKworICAgIC8vIGFsbG93IGludDMyIG9yIGZsb2F0IFNESyB2YWx1ZXMgYW5kIHJlcHJlc2VudCB0aGVtIGFzIGZsb2F0CisgICAgQ29uZmlnTWFwcGVyOjpNYXBwZXIgbWFrZUZsb2F0ID0gW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgLy8gY29udmVydCBmcm9tIGkzMiB0byBmbG9hdAorICAgICAgICBpbnQzMl90IGkzMlZhbHVlOworICAgICAgICBmbG9hdCBmcFZhbHVlOworICAgICAgICBpZiAodi5nZXQoJmkzMlZhbHVlKSkgeworICAgICAgICAgICAgcmV0dXJuIChmbG9hdClpMzJWYWx1ZTsKKyAgICAgICAgfSBlbHNlIGlmICh2LmdldCgmZnBWYWx1ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmcFZhbHVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgfTsKKworICAgIENvbmZpZ01hcHBlcjo6TWFwcGVyIG5lZ2F0ZSA9IFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgIGlmICh2LmdldCgmdmFsdWUpKSB7CisgICAgICAgICAgICByZXR1cm4gLXZhbHVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgfTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX01JTUUsICAgICBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFLCAgICAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpJTlBVVCAmIEQ6OlJFQUQpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9NSU1FLCAgICAgQzJfUEFSQU1LRVlfT1VUUFVUX01FRElBX1RZUEUsICAgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6T1VUUFVUICYgRDo6UkVBRCkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQklUX1JBVEUsIEMyX1BBUkFNS0VZX0JJVFJBVEUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIgJiBEOjpPVVRQVVQpKTsKKyAgICAvLyB3ZSBhbHNvIG5lZWQgdG8gcHV0IHRoZSBiaXRyYXRlIGluIHRoZSBtYXggYml0cmF0ZSBmaWVsZAorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX01BWF9CSVRfUkFURSwgQzJfUEFSQU1LRVlfQklUUkFURSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIEQ6OlJFQUQgJiBEOjpPVVRQVVQpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKFBBUkFNRVRFUl9LRVlfVklERU9fQklUUkFURSwgQzJfUEFSQU1LRVlfQklUUkFURSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIEQ6OlZJREVPICYgRDo6UEFSQU0pKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9CSVRSQVRFX01PREUsIEMyX1BBUkFNS0VZX0JJVFJBVEVfTU9ERSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIEQ6OkNPREVEKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpiaXRyYXRlX21vZGVfdCBtb2RlOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkgJiYgQzJNYXBwZXI6Om1hcCh2YWx1ZSwgJm1vZGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1vZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9KSk7CisgICAgLy8gcmVtb3ZlIHdoZW4gY29kZWNzIHN3aXRjaCB0byBQQVJBTUtFWSBhbmQgbmV3IG1vZGVzCisgICAgZGVwcmVjYXRlZChDb25maWdNYXBwZXIoS0VZX0JJVFJBVEVfTU9ERSwgImNvZGVkLmJpdHJhdGUtbW9kZSIsICJ2YWx1ZSIpCisgICAgICAgICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfRlJBTUVfUkFURSwgQzJfUEFSQU1LRVlfRlJBTUVfUkFURSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8pCisgICAgICAgIC53aXRoTWFwcGVycyhtYWtlRmxvYXQsIFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICAvLyByZWFkIGJhY2sgYWx3YXlzIGFzIGludAorICAgICAgICAgICAgZmxvYXQgdmFsdWU7CisgICAgICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoaW50MzJfdCl2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0pKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX01BWF9JTlBVVF9TSVpFLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OklOUFVUKSk7CisgICAgLy8gcmVtb3ZlIHdoZW4gY29kZWNzIHN3aXRjaCB0byBQQVJBTUtFWQorICAgIGRlcHJlY2F0ZWQoQ29uZmlnTWFwcGVyKEtFWV9NQVhfSU5QVVRfU0laRSwgImNvZGVkLm1heC1mcmFtZS1zaXplIiwgInZhbHVlIikKKyAgICAgICAgICAgICAgIC5saW1pdFRvKEQ6OklOUFVUKSk7CisKKyAgICAvLyBSb3RhdGlvbgorICAgIC8vIE5vdGU6IFNESyByb3RhdGlvbiBpcyBjbG9jay13aXNlLCB3aGlsZSBDMiByb3RhdGlvbiBpcyBjb3VudGVyLWNsb2NrLXdpc2UKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9ST1RBVElPTiwgQzJfUEFSQU1LRVlfVlVJX1JPVEFUSU9OLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyAmIEQ6OkNPREVEKQorICAgICAgICAud2l0aE1hcHBlcnMobmVnYXRlLCBuZWdhdGUpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9ST1RBVElPTiwgQzJfUEFSQU1LRVlfUk9UQVRJT04sICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6UkFXKQorICAgICAgICAud2l0aE1hcHBlcnMobmVnYXRlLCBuZWdhdGUpKTsKKworICAgIC8vIGFuZHJvaWQgJ3ZpZGVvLXNjYWxpbmcnCisgICAgYWRkKENvbmZpZ01hcHBlcigiYW5kcm9pZC5fdmlkZW8tc2NhbGluZyIsIEMyX1BBUkFNS0VZX1NVUkZBQ0VfU0NBTElOR19NT0RFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyAmIEQ6OkRFQ09ERVIgJiBEOjpSQVcpKTsKKworICAgIC8vIENvbG9yIEFzcGVjdHMKKyAgICAvLworICAgIC8vIGNvbmZpZ3VyZSBkZWZhdWx0IGZvciBkZWNvZGVycworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NPTE9SX1JBTkdFLCAgICAgICBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMsICAgInJhbmdlIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpDT0RFRCAmIChEOjpDT05GSUcgfCBEOjpQQVJBTSkpCisgICAgICAgIC53aXRoQzJNYXBwZXJzPEMyQ29sb3I6OnJhbmdlX3Q+KCkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NPTE9SX1RSQU5TRkVSLCAgICBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMsICAgInRyYW5zZmVyIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpDT0RFRCAmIChEOjpDT05GSUcgfCBEOjpQQVJBTSkpCisgICAgICAgIC53aXRoQzJNYXBwZXJzPEMyQ29sb3I6OnRyYW5zZmVyX3Q+KCkpOworICAgIGFkZChDb25maWdNYXBwZXIoImNvbG9yLXByaW1hcmllcyIsICAgICBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMsICAgInByaW1hcmllcyIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6Q09ERUQgJiAoRDo6Q09ORklHIHwgRDo6UEFSQU0pKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY29sb3ItbWF0cml4IiwgICAgICAgIEMyX1BBUkFNS0VZX0RFRkFVTFRfQ09MT1JfQVNQRUNUUywgICAibWF0cml4IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpDT0RFRCAmIChEOjpDT05GSUcgfCBEOjpQQVJBTSkpKTsKKworICAgIC8vIHJlYWQgYmFjayBmaW5hbCBmb3IgZGVjb2RlciBvdXRwdXQgKGFsc28sIGNvbmZpZ3VyZSBmaW5hbCBhc3BlY3RzIGFzIHdlbGwuIFRoaXMgc2hvdWxkIGJlCisgICAgLy8gb3ZlcndyaXR0ZW4gYmFzZWQgb24gY29kZWQvZGVmYXVsdCB2YWx1ZXMgaWYgY29tcG9uZW50IHN1cHBvcnRzIGNvbG9yIGFzcGVjdHMsIGJ1dCBpcyB1c2VkCisgICAgLy8gYXMgZmluYWwgdmFsdWVzIGlmIGNvbXBvbmVudCBkb2VzIG5vdCBzdXBwb3J0IGFzcGVjdHMgYXQgYWxsKQorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NPTE9SX1JBTkdFLCAgICAgICBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTLCAgICJyYW5nZSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6UkFXKQorICAgICAgICAud2l0aEMyTWFwcGVyczxDMkNvbG9yOjpyYW5nZV90PigpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DT0xPUl9UUkFOU0ZFUiwgICAgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUywgICAidHJhbnNmZXIiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpERUNPREVSICAmIEQ6OlJBVykKKyAgICAgICAgLndpdGhDMk1hcHBlcnM8QzJDb2xvcjo6dHJhbnNmZXJfdD4oKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY29sb3ItcHJpbWFyaWVzIiwgICAgIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICAgInByaW1hcmllcyIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY29sb3ItbWF0cml4IiwgICAgICAgIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICAgIm1hdHJpeCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6UkFXKSk7CisKKyAgICAvLyBjb25maWd1cmUgc291cmNlIGFzcGVjdHMgZm9yIGVuY29kZXJzIGFuZCByZWFkIHRoZW0gYmFjayBvbiB0aGUgY29kZWQoISkgcG9ydC4KKyAgICAvLyBUaGlzIGlzIHRvIGVuc3VyZSBtdXhpbmcgdGhlIGRlc2lyZWQgYXNwZWN0cyBpbnRvIHRoZSBjb250YWluZXIuCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ09MT1JfUkFOR0UsICAgICAgIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICAgInJhbmdlIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6RU5DT0RFUiAgJiBEOjpDT0RFRCkKKyAgICAgICAgLndpdGhDMk1hcHBlcnM8QzJDb2xvcjo6cmFuZ2VfdD4oKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ09MT1JfVFJBTlNGRVIsICAgIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICAgInRyYW5zZmVyIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6RU5DT0RFUiAgJiBEOjpDT0RFRCkKKyAgICAgICAgLndpdGhDMk1hcHBlcnM8QzJDb2xvcjo6dHJhbnNmZXJfdD4oKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY29sb3ItcHJpbWFyaWVzIiwgICAgIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICAgInByaW1hcmllcyIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkVOQ09ERVIgICYgRDo6Q09ERUQpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjb2xvci1tYXRyaXgiLCAgICAgICAgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUywgICAibWF0cml4IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6RU5DT0RFUiAgJiBEOjpDT0RFRCkpOworCisgICAgLy8gcmVhZCBiYWNrIGNvZGVkIGFzcGVjdHMgZm9yIGVuY29kZXJzIChvbiB0aGUgcmF3IHBvcnQpLCBidXQgYWxzbyBjb25maWd1cmUKKyAgICAvLyBkZXNpcmVkIGFzcGVjdHMgaGVyZS4KKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DT0xPUl9SQU5HRSwgICAgICAgQzJfUEFSQU1LRVlfVlVJX0NPTE9SX0FTUEVDVFMsICAgInJhbmdlIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6RU5DT0RFUiAgJiBEOjpSQVcpCisgICAgICAgIC53aXRoQzJNYXBwZXJzPEMyQ29sb3I6OnJhbmdlX3Q+KCkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NPTE9SX1RSQU5TRkVSLCAgICBDMl9QQVJBTUtFWV9WVUlfQ09MT1JfQVNQRUNUUywgICAidHJhbnNmZXIiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpFTkNPREVSICAmIEQ6OlJBVykKKyAgICAgICAgLndpdGhDMk1hcHBlcnM8QzJDb2xvcjo6dHJhbnNmZXJfdD4oKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY29sb3ItcHJpbWFyaWVzIiwgICAgIEMyX1BBUkFNS0VZX1ZVSV9DT0xPUl9BU1BFQ1RTLCAgICJwcmltYXJpZXMiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpFTkNPREVSICAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoImNvbG9yLW1hdHJpeCIsICAgICAgICBDMl9QQVJBTUtFWV9WVUlfQ09MT1JfQVNQRUNUUywgICAibWF0cml4IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6RU5DT0RFUiAgJiBEOjpSQVcpKTsKKworICAgIC8vIERhdGFzcGFjZQorICAgIGFkZChDb25maWdNYXBwZXIoImFuZHJvaWQuX2RhdGFzcGFjZSIsIEMyX1BBUkFNS0VZX0RBVEFfU1BBQ0UsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworCisgICAgLy8gSERSCisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2LnJlZC54IiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLnJlZC54IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2LnJlZC55IiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLnJlZC55IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2LmdyZWVuLngiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcuZ3JlZW4ueCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoInNtcHRlMjA4Ni5ncmVlbi55IiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLmdyZWVuLnkiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJzbXB0ZTIwODYuYmx1ZS54IiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLmJsdWUueCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoInNtcHRlMjA4Ni5ibHVlLnkiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcuYmx1ZS55IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2LndoaXRlLngiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcud2hpdGUueCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoInNtcHRlMjA4Ni53aGl0ZS55IiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLndoaXRlLnkiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJzbXB0ZTIwODYubWF4LWx1bWluYW5jZSIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1hc3RlcmluZy5tYXgtbHVtaW5hbmNlIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2Lm1pbi1sdW1pbmFuY2UiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcubWluLWx1bWluYW5jZSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoImN0YTg2MS5tYXgtY2xsIiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWF4LWNsbCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoImN0YTg2MS5tYXgtZmFsbCIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1heC1mYWxsIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKHN0ZDo6c3RyaW5nKEtFWV9GRUFUVVJFXykgKyBGRUFUVVJFX1NlY3VyZVBsYXliYWNrLAorICAgICAgICAgICAgICAgICAgICAgQzJfUEFSQU1LRVlfU0VDVVJFX01PREUsICJ2YWx1ZSIpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoInByZXBlbmQtc3BzLXBwcy10by1pZHItZnJhbWVzIiwKKyAgICAgICAgICAgICAgICAgICAgIEMyX1BBUkFNS0VZX1BSRVBFTkRfSEVBREVSX01PREUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIgJiBEOjpWSURFTykKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSAmJiB2YWx1ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKEMyQ29uZmlnOjpQUkVQRU5EX0hFQURFUl9UT19BTExfU1lOQyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKEMyQ29uZmlnOjpQUkVQRU5EX0hFQURFUl9UT19OT05FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSkpOworICAgIC8vIHJlbW92ZSB3aGVuIGNvZGVjcyBzd2l0Y2ggdG8gUEFSQU1LRVkKKyAgICBkZXByZWNhdGVkKENvbmZpZ01hcHBlcigicHJlcGVuZC1zcHMtcHBzLXRvLWlkci1mcmFtZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2RpbmcuYWRkLWNzZC10by1zeW5jLWZyYW1lcyIsICJ2YWx1ZSIpCisgICAgICAgICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6VklERU8pKTsKKyAgICAvLyBjb252ZXJ0IHRvIHRpbWVzdGFtcCBiYXNlCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfSV9GUkFNRV9JTlRFUlZBTCwgQzJfUEFSQU1LRVlfU1lOQ19GUkFNRV9JTlRFUlZBTCwgInZhbHVlIikKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIC8vIGNvbnZlcnQgZnJvbSBpMzIgdG8gZmxvYXQKKyAgICAgICAgICAgIGludDMyX3QgaTMyVmFsdWU7CisgICAgICAgICAgICBmbG9hdCBmcFZhbHVlOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZpMzJWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW50NjRfdCgxMDAwMDAwKSAqIGkzMlZhbHVlOworICAgICAgICAgICAgfSBlbHNlIGlmICh2LmdldCgmZnBWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW50NjRfdChjMl9taW4oMTAwMDAwMCAqIGZwVmFsdWUgKyAwLjUsIChkb3VibGUpSU5UNjRfTUFYKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9KSk7CisgICAgLy8gcmVtb3ZlIHdoZW4gY29kZWNzIHN3aXRjaCB0byBwcm9wZXIgY29kaW5nLmdvcCAoYWRkIHN1cHBvcnQgZm9yIGNhbGN1bGF0aW5nIGdvcCkKKyAgICBkZXByZWNhdGVkKENvbmZpZ01hcHBlcigiaS1mcmFtZS1wZXJpb2QiLCAiY29kaW5nLmdvcCIsICJpbnRyYS1wZXJpb2QiKQorICAgICAgICAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIEQ6OlZJREVPKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfSU5UUkFfUkVGUkVTSF9QRVJJT0QsIEMyX1BBUkFNS0VZX0lOVFJBX1JFRlJFU0gsICJwZXJpb2QiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyAmIEQ6OkVOQ09ERVIpCisgICAgICAgIC53aXRoTWFwcGVycyhtYWtlRmxvYXQsIFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICAvLyByZWFkIGJhY2sgYWx3YXlzIGFzIGludAorICAgICAgICAgICAgZmxvYXQgdmFsdWU7CisgICAgICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoaW50MzJfdCl2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0pKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9RVUFMSVRZLCBDMl9QQVJBTUtFWV9RVUFMSVRZLCAidmFsdWUiKSk7CisgICAgZGVwcmVjYXRlZChDb25maWdNYXBwZXIoUEFSQU1FVEVSX0tFWV9SRVFVRVNUX1NZTkNfRlJBTUUsCisgICAgICAgICAgICAgICAgICAgICAiY29kaW5nLnJlcXVlc3Qtc3luYyIsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlBBUkFNICYgRDo6RU5DT0RFUikKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSkgLT4gQzJWYWx1ZSB7IHJldHVybiB1aW50MzJfdCgxKTsgfSkpOworICAgIGFkZChDb25maWdNYXBwZXIoUEFSQU1FVEVSX0tFWV9SRVFVRVNUX1NZTkNfRlJBTUUsCisgICAgICAgICAgICAgICAgICAgICBDMl9QQVJBTUtFWV9SRVFVRVNUX1NZTkNfRlJBTUUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlBBUkFNICYgRDo6RU5DT0RFUikKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSkgLT4gQzJWYWx1ZSB7IHJldHVybiB1aW50MzJfdCgxKTsgfSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfT1BFUkFUSU5HX1JBVEUsICAgQzJfUEFSQU1LRVlfT1BFUkFUSU5HX1JBVEUsICAgICAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpQQVJBTSB8IEQ6OkNPTkZJRykgLy8gd3JpdGUtb25seQorICAgICAgICAud2l0aE1hcHBlcihtYWtlRmxvYXQpKTsKKyAgICAvLyBDMiBwcmlvcml0aWVzIGFyZSBpbnZlcnRlZAorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1BSSU9SSVRZLCAgICAgICAgIEMyX1BBUkFNS0VZX1BSSU9SSVRZLCAgICAgICAgICAgInZhbHVlIikKKyAgICAgICAgLndpdGhNYXBwZXJzKG5lZ2F0ZSwgbmVnYXRlKSk7CisgICAgLy8gcmVtb3ZlIHdoZW4gY29kZWNzIHN3aXRjaCB0byBQQVJBTUtFWQorICAgIGRlcHJlY2F0ZWQoQ29uZmlnTWFwcGVyKEtFWV9PUEVSQVRJTkdfUkFURSwgICAiY3RybC5vcGVyYXRpbmctcmF0ZSIsICAgICAidmFsdWUiKQorICAgICAgICAgICAgICAgLndpdGhNYXBwZXIobWFrZUZsb2F0KSk7CisgICAgZGVwcmVjYXRlZChDb25maWdNYXBwZXIoS0VZX1BSSU9SSVRZLCAgICAgICAgICJjdHJsLnByaW9yaXR5IiwgICAgICAgICAgICJ2YWx1ZSIpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1dJRFRILCAgICAgICAgIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSwgICAgICAgIndpZHRoIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gfCBEOjpJTUFHRSkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0hFSUdIVCwgICAgICAgIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSwgICAgICAgImhlaWdodCIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPIHwgRDo6SU1BR0UpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoImNyb3AtbGVmdCIsICAgICAgIEMyX1BBUkFNS0VZX0NST1BfUkVDVCwgICAgICAgImxlZnQiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyB8IEQ6OklNQUdFKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY3JvcC10b3AiLCAgICAgICAgQzJfUEFSQU1LRVlfQ1JPUF9SRUNULCAgICAgICAidG9wIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gfCBEOjpJTUFHRSkpOworICAgIGFkZChDb25maWdNYXBwZXIoImNyb3Atd2lkdGgiLCAgICAgIEMyX1BBUkFNS0VZX0NST1BfUkVDVCwgICAgICAgIndpZHRoIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gfCBEOjpJTUFHRSkpOworICAgIGFkZChDb25maWdNYXBwZXIoImNyb3AtaGVpZ2h0IiwgICAgIEMyX1BBUkFNS0VZX0NST1BfUkVDVCwgICAgICAgImhlaWdodCIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPIHwgRDo6SU1BR0UpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX01BWF9XSURUSCwgICAgIEMyX1BBUkFNS0VZX01BWF9QSUNUVVJFX1NJWkUsICAgICJ3aWR0aCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX01BWF9IRUlHSFQsICAgIEMyX1BBUkFNS0VZX01BWF9QSUNUVVJFX1NJWkUsICAgICJoZWlnaHQiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoImNzZC0wIiwgICAgICAgICAgIEMyX1BBUkFNS0VZX0lOSVRfREFUQSwgICAgICAgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6T1VUUFVUICYgRDo6UkVBRCkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfSERSMTBfUExVU19JTkZPLCBDMl9QQVJBTUtFWV9JTlBVVF9IRFIxMF9QTFVTX0lORk8sICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6UEFSQU0gJiBEOjpJTlBVVCkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfSERSMTBfUExVU19JTkZPLCBDMl9QQVJBTUtFWV9PVVRQVVRfSERSMTBfUExVU19JTkZPLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyAmIEQ6Ok9VVFBVVCkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihDMl9QQVJBTUtFWV9URU1QT1JBTF9MQVlFUklORywgQzJfUEFSQU1LRVlfVEVNUE9SQUxfTEFZRVJJTkcsICIiKQorICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6VklERU8gJiBEOjpPVVRQVVQpKTsKKworICAgIC8vIFBpeGVsIEZvcm1hdCAodXNlIGxvY2FsIGtleSBmb3IgYWN0dWFsIHBpeGVsIGZvcm1hdCBhcyB3ZSBkb24ndCBkaXN0aW5ndWlzaCBiZXR3ZWVuCisgICAgLy8gU0RLIGxheW91dHMgZm9yIGZsZXhpYmxlIGZvcm1hdCBhbmQgd2UgbmVlZCB0aGUgYWN0dWFsIFNESyBjb2xvciBmb3JtYXQgaW4gdGhlIG1lZGlhIGZvcm1hdCkKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJhbmRyb2lkLl9jb2xvci1mb3JtYXQiLCAgQzJfUEFSQU1LRVlfUElYRUxfRk9STUFULCAidmFsdWUiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpCisgICAgICAgIC53aXRoTWFwcGVycyhbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgmdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICh2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFN1cmZhY2U6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHVpbnQzMl90KUhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodWludDMyX3QpSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4OworICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1aW50MzJfdClIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IHNvbWUgc29ydCBvZiBwYXNzdGhyb3VnaAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSwgW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENPTE9SX0Zvcm1hdFN1cmZhY2U7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4ODoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgc29tZSBzb3J0IG9mIHBhc3N0aHJvdWdoCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9KSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DSEFOTkVMX0NPVU5ULCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5ULCAgICAgICAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTykpOyAvLyByZWFkIGJhY2sgdG8gYm90aCBmb3JtYXRzCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ0hBTk5FTF9DT1VOVCwgQzJfUEFSQU1LRVlfQ09ERURfQ0hBTk5FTF9DT1VOVCwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpDT0RFRCkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfU0FNUExFX1JBVEUsICAgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUsICAgICAgICAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTykpOyAvLyByZWFkIGJhY2sgdG8gYm90aCBwb3J0IGZvcm1hdHMKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9TQU1QTEVfUkFURSwgICBDMl9QQVJBTUtFWV9DT0RFRF9TQU1QTEVfUkFURSwgICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6Q09ERUQpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1BDTV9FTkNPRElORywgIEMyX1BBUkFNS0VZX1BDTV9FTkNPRElORywgICAgICAgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8pCisgICAgICAgIC53aXRoTWFwcGVycyhbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdCB0bzsKKyAgICAgICAgICAgIGlmICh2LmdldCgmdmFsdWUpICYmIEMyTWFwcGVyOjptYXAodmFsdWUsICZ0bykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG87CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9LCBbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgQzJDb25maWc6OnBjbV9lbmNvZGluZ190IHZhbHVlOworICAgICAgICAgICAgaW50MzJfdCB0bzsKKyAgICAgICAgICAgIHVzaW5nIEMyVmFsdWVUeXBlPXR5cGVuYW1lIF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGU8ZGVjbHR5cGUodmFsdWUpPjo6dHlwZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgoQzJWYWx1ZVR5cGUqKSZ2YWx1ZSkgJiYgQzJNYXBwZXI6Om1hcCh2YWx1ZSwgJnRvKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0bzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0pKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0lTX0FEVFMsIEMyX1BBUkFNS0VZX0FBQ19QQUNLQUdJTkcsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6Q09ERUQpCisgICAgICAgIC53aXRoTWFwcGVycyhbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgmdmFsdWUpICYmIHZhbHVlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyQ29uZmlnOjpBQUNfUEFDS0FHSU5HX0FEVFM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9LCBbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgdWludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSAmJiB2YWx1ZSA9PSBDMkNvbmZpZzo6QUFDX1BBQ0tBR0lOR19BRFRTKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChpbnQzMl90KTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9KSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJNYXBwZXI6OlByb2ZpbGVMZXZlbE1hcHBlcj4gbWFwcGVyID0KKyAgICAgICAgQzJNYXBwZXI6OkdldFByb2ZpbGVMZXZlbE1hcHBlcihtQ29kaW5nTWVkaWFUeXBlKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1BST0ZJTEUsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwsICJwcm9maWxlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6Q09ERUQpCisgICAgICAgIC53aXRoTWFwcGVycyhbbWFwcGVyXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgQzJDb25maWc6OnByb2ZpbGVfdCBjMiA9IFBST0ZJTEVfVU5VU0VEOworICAgICAgICAgICAgaW50MzJfdCBzZGs7CisgICAgICAgICAgICBpZiAobWFwcGVyICYmIHYuZ2V0KCZzZGspICYmIG1hcHBlci0+bWFwUHJvZmlsZShzZGssICZjMikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gUFJPRklMRV9VTlVTRUQ7CisgICAgICAgIH0sIFttYXBwZXJdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBDMkNvbmZpZzo6cHJvZmlsZV90IGMyOworICAgICAgICAgICAgaW50MzJfdCBzZGs7CisgICAgICAgICAgICB1c2luZyBDMlZhbHVlVHlwZT10eXBlbmFtZSBfYzJfcmVkdWNlX2VudW1fdG9fdW5kZXJseWluZ190eXBlPGRlY2x0eXBlKGMyKT46OnR5cGU7CisgICAgICAgICAgICBpZiAobWFwcGVyICYmIHYuZ2V0KChDMlZhbHVlVHlwZSopJmMyKSAmJiBtYXBwZXItPm1hcFByb2ZpbGUoYzIsICZzZGspKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNkazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0pKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0xFVkVMLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMLCAibGV2ZWwiKQorICAgICAgICAubGltaXRUbyhEOjpDT0RFRCkKKyAgICAgICAgLndpdGhNYXBwZXJzKFttYXBwZXJdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBDMkNvbmZpZzo6bGV2ZWxfdCBjMiA9IExFVkVMX1VOVVNFRDsKKyAgICAgICAgICAgIGludDMyX3Qgc2RrOworICAgICAgICAgICAgaWYgKG1hcHBlciAmJiB2LmdldCgmc2RrKSAmJiBtYXBwZXItPm1hcExldmVsKHNkaywgJmMyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBjMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBMRVZFTF9VTlVTRUQ7CisgICAgICAgIH0sIFttYXBwZXJdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBDMkNvbmZpZzo6bGV2ZWxfdCBjMjsKKyAgICAgICAgICAgIGludDMyX3Qgc2RrOworICAgICAgICAgICAgdXNpbmcgQzJWYWx1ZVR5cGU9dHlwZW5hbWUgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZTxkZWNsdHlwZShjMik+Ojp0eXBlOworICAgICAgICAgICAgaWYgKG1hcHBlciAmJiB2LmdldCgoQzJWYWx1ZVR5cGUqKSZjMikgJiYgbWFwcGVyLT5tYXBMZXZlbChjMiwgJnNkaykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2RrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSkpOworCisgICAgLy8gY29udmVydCB0byBkQkZTIGFuZCBhZGQgZGVmYXVsdAorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0FBQ19EUkNfVEFSR0VUX1JFRkVSRU5DRV9MRVZFTCwgQzJfUEFSQU1LRVlfRFJDX1RBUkdFVF9SRUZFUkVOQ0VfTEVWRUwsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6REVDT0RFUikKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAoIXYuZ2V0KCZ2YWx1ZSkgfHwgdmFsdWUgPCAwKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBwcm9wZXJ0eV9nZXRfaW50MzIoUFJPUF9EUkNfT1ZFUlJJREVfUkVGX0xFVkVMLCBEUkNfREVGQVVMVF9NT0JJTEVfUkVGX0xFVkVMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmbG9hdCgtMC4yNSAqIGMyX21pbih2YWx1ZSwgMTI3KSk7CisgICAgICAgIH0pKTsKKworICAgIC8vIGNvbnZlcnQgdG8gMC0xICglKSBhbmQgYWRkIGRlZmF1bHQKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9BQUNfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUiwgQzJfUEFSQU1LRVlfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUiwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpERUNPREVSKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICghdi5nZXQoJnZhbHVlKSB8fCB2YWx1ZSA8IDApIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHByb3BlcnR5X2dldF9pbnQzMihQUk9QX0RSQ19PVkVSUklERV9DVVQsIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQ1VUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmbG9hdChjMl9taW4odmFsdWUsIDEyNykgLyAxMjcuKTsKKyAgICAgICAgfSkpOworCisgICAgLy8gY29udmVydCB0byAwLTEgKCUpIGFuZCBhZGQgZGVmYXVsdAorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0FBQ19EUkNfQk9PU1RfRkFDVE9SLCBDMl9QQVJBTUtFWV9EUkNfQk9PU1RfRkFDVE9SLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkRFQ09ERVIpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKCF2LmdldCgmdmFsdWUpIHx8IHZhbHVlIDwgMCkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gcHJvcGVydHlfZ2V0X2ludDMyKFBST1BfRFJDX09WRVJSSURFX0JPT1NULCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0JPT1NUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmbG9hdChjMl9taW4odmFsdWUsIDEyNykgLyAxMjcuKTsKKyAgICAgICAgfSkpOworCisgICAgLy8gY29udmVydCB0byBjb21wcmVzc2lvbiB0eXBlIGFuZCBhZGQgZGVmYXVsdAorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0FBQ19EUkNfSEVBVllfQ09NUFJFU1NJT04sIEMyX1BBUkFNS0VZX0RSQ19DT01QUkVTU0lPTl9NT0RFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkRFQ09ERVIpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKCF2LmdldCgmdmFsdWUpIHx8IHZhbHVlIDwgMCkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gcHJvcGVydHlfZ2V0X2ludDMyKFBST1BfRFJDX09WRVJSSURFX0hFQVZZLCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0hFQVZZKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PSAxID8gQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9IRUFWWSA6IEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fTElHSFQ7CisgICAgICAgIH0pKTsKKworICAgIC8vIGNvbnZlcnQgdG8gZEJGUyBhbmQgYWRkIGRlZmF1bHQKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9BQUNfRU5DT0RFRF9UQVJHRVRfTEVWRUwsIEMyX1BBUkFNS0VZX0RSQ19FTkNPREVEX1RBUkdFVF9MRVZFTCwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpERUNPREVSKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICghdi5nZXQoJnZhbHVlKSB8fCB2YWx1ZSA8IDApIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHByb3BlcnR5X2dldF9pbnQzMihQUk9QX0RSQ19PVkVSUklERV9FTkNfTEVWRUwsIERSQ19ERUZBVUxUX01PQklMRV9FTkNfTEVWRUwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZsb2F0KC0wLjI1ICogYzJfbWluKHZhbHVlLCAxMjcpKTsKKyAgICAgICAgfSkpOworCisgICAgLy8gY29udmVydCB0byBlZmZlY3QgdHlwZSAodGhlc2UgbWFwIHRvIFNESyB2YWx1ZXMpIGFuZCBhZGQgZGVmYXVsdAorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0FBQ19EUkNfRUZGRUNUX1RZUEUsIEMyX1BBUkFNS0VZX0RSQ19FRkZFQ1RfVFlQRSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpERUNPREVSKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICghdi5nZXQoJnZhbHVlKSB8fCB2YWx1ZSA8IC0xIHx8IHZhbHVlID4gOCkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gcHJvcGVydHlfZ2V0X2ludDMyKFBST1BfRFJDX09WRVJSSURFX0VGRkVDVCwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19FRkZFQ1QpOworICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB2YWx1ZSBpcyB3aXRoaW4gcmFuZ2UKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCAtMSB8fCB2YWx1ZSA+IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0VGRkVDVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0pKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0FBQ19NQVhfT1VUUFVUX0NIQU5ORUxfQ09VTlQsIEMyX1BBUkFNS0VZX01BWF9DSEFOTkVMX0NPVU5ULCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTykpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX1NCUl9NT0RFLCBDMl9QQVJBTUtFWV9BQUNfU0JSX01PREUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6RU5DT0RFUiAmIEQ6OkNPTkZJRykKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAoIXYuZ2V0KCZ2YWx1ZSkgfHwgdmFsdWUgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyQ29uZmlnOjpBQUNfU0JSX0FVVE87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gQzJDb25maWc6OkFBQ19TQlJfT0ZGOworICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIEMyQ29uZmlnOjpBQUNfU0JSX1NJTkdMRV9SQVRFOworICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIEMyQ29uZmlnOjpBQUNfU0JSX0RVQUxfUkFURTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gQzJDb25maWc6OkFBQ19TQlJfQVVUTyArIDE7IC8vIGludmFsaWQgdmFsdWUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfUVVBTElUWSwgQzJfUEFSQU1LRVlfUVVBTElUWSwgInZhbHVlIikpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0ZMQUNfQ09NUFJFU1NJT05fTEVWRUwsIEMyX1BBUkFNS0VZX0NPTVBMRVhJVFksICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6RU5DT0RFUikpOworICAgIGFkZChDb25maWdNYXBwZXIoImNvbXBsZXhpdHkiLCBDMl9QQVJBTUtFWV9DT01QTEVYSVRZLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9HUklEX0NPTFVNTlMsIEMyX1BBUkFNS0VZX1RJTEVfTEFZT1VULCAiY29sdW1ucyIpCisgICAgICAgIC5saW1pdFRvKEQ6OklNQUdFKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfR1JJRF9ST1dTLCBDMl9QQVJBTUtFWV9USUxFX0xBWU9VVCwgInJvd3MiKQorICAgICAgICAubGltaXRUbyhEOjpJTUFHRSkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1RJTEVfV0lEVEgsIEMyX1BBUkFNS0VZX1RJTEVfTEFZT1VULCAidGlsZS53aWR0aCIpCisgICAgICAgIC5saW1pdFRvKEQ6OklNQUdFKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfVElMRV9IRUlHSFQsIEMyX1BBUkFNS0VZX1RJTEVfTEFZT1VULCAidGlsZS5oZWlnaHQiKQorICAgICAgICAubGltaXRUbyhEOjpJTUFHRSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTEFURU5DWSwgQzJfUEFSQU1LRVlfUElQRUxJTkVfREVMQVlfUkVRVUVTVCwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gJiBEOjpFTkNPREVSKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEMyX1BBUkFNS0VZX0lOUFVUX1RJTUVfU1RSRVRDSCwgQzJfUEFSQU1LRVlfSU5QVVRfVElNRV9TVFJFVENILCAidmFsdWUiKSk7CisKKyAgICAvKiBzdGlsbCB0byBkbworICAgIGNvbnN0ZXhwciBjaGFyIEtFWV9QVVNIX0JMQU5LX0JVRkZFUlNfT05fU1RPUFtdID0gInB1c2gtYmxhbmstYnVmZmVycy1vbi1zaHV0ZG93biI7CisKKyAgICAgICBub3QgeWV0IHVzZWQgYnkgTWVkaWFDb2RlYywgYnV0IGRlZmluZWQgYXMgTWVkaWFGb3JtYXQKKyAgICBLRVlfQVVESU9fU0VTU0lPTl9JRCAvLyB3ZSB1c2UgImF1ZGlvLWh3LXN5bmMiCisgICAgS0VZX09VVFBVVF9SRU9SREVSX0RFUFRICisgICAgKi8KK30KKworc3RhdHVzX3QgQ0NvZGVjQ29uZmlnOjppbml0aWFsaXplKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiAmY2xpZW50LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wb25lbnQpIHsKKyAgICBDMkNvbXBvbmVudERvbWFpblNldHRpbmcgZG9tYWluKEMyQ29tcG9uZW50OjpET01BSU5fT1RIRVIpOworICAgIEMyQ29tcG9uZW50S2luZFNldHRpbmcga2luZChDMkNvbXBvbmVudDo6S0lORF9PVEhFUik7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgYzJfc3RhdHVzX3QgYzJlcnIgPSBjb21wb25lbnQtPnF1ZXJ5KHsgJmRvbWFpbiwgJmtpbmQgfSwge30sIEMyX0RPTlRfQkxPQ0ssICZxdWVyaWVkKTsKKyAgICBpZiAoYzJlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoIlF1ZXJ5IGRvbWFpbiAmIGtpbmQgZmFpbGVkID0+ICVzIiwgYXNTdHJpbmcoYzJlcnIpKTsKKyAgICAgICAgLy8gVEVNUDogZGV0ZXJtaW5lIGtpbmQgZnJvbSBjb21wb25lbnQgbmFtZQorICAgICAgICBpZiAoa2luZC52YWx1ZSA9PSBDMkNvbXBvbmVudDo6S0lORF9PVEhFUikgeworICAgICAgICAgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImVuY29kZXIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgICAgIGtpbmQudmFsdWUgPSBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSOworICAgICAgICAgICAgfSBlbHNlIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJkZWNvZGVyIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgICAgICBraW5kLnZhbHVlID0gQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFRFTVA6IGRldGVybWluZSBkb21haW4gZnJvbSBtZWRpYSB0eXBlIChwb3J0IChwcmVmZXJyZWQpIG9yIHN0cmVhbSAjMCkKKyAgICAgICAgaWYgKGRvbWFpbi52YWx1ZSA9PSBDMkNvbXBvbmVudDo6RE9NQUlOX09USEVSKSB7CisgICAgICAgICAgICBBU3RyaW5nIG1lZGlhVHlwZSA9IFF1ZXJ5TWVkaWFUeXBlKHRydWUgLyogaW5wdXQgKi8sIGNvbXBvbmVudCk7CisgICAgICAgICAgICBpZiAobWVkaWFUeXBlLnN0YXJ0c1dpdGgoImF1ZGlvLyIpKSB7CisgICAgICAgICAgICAgICAgZG9tYWluLnZhbHVlID0gQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlLnN0YXJ0c1dpdGgoInZpZGVvLyIpKSB7CisgICAgICAgICAgICAgICAgZG9tYWluLnZhbHVlID0gQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlLnN0YXJ0c1dpdGgoImltYWdlLyIpKSB7CisgICAgICAgICAgICAgICAgZG9tYWluLnZhbHVlID0gQzJDb21wb25lbnQ6OkRPTUFJTl9JTUFHRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG1Eb21haW4gPSAoZG9tYWluLnZhbHVlID09IEMyQ29tcG9uZW50OjpET01BSU5fVklERU8gPyBEb21haW46OklTX1ZJREVPIDoKKyAgICAgICAgICAgICAgIGRvbWFpbi52YWx1ZSA9PSBDMkNvbXBvbmVudDo6RE9NQUlOX0lNQUdFID8gRG9tYWluOjpJU19JTUFHRSA6CisgICAgICAgICAgICAgICBkb21haW4udmFsdWUgPT0gQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTyA/IERvbWFpbjo6SVNfQVVESU8gOiBEb21haW46Ok9USEVSX0RPTUFJTikKKyAgICAgICAgICAgIHwgKGtpbmQudmFsdWUgPT0gQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUiA/IERvbWFpbjo6SVNfREVDT0RFUiA6CisgICAgICAgICAgICAgICBraW5kLnZhbHVlID09IEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVIgPyBEb21haW46OklTX0VOQ09ERVIgOiBEb21haW46Ok9USEVSX0tJTkQpOworCisgICAgbUlucHV0RG9tYWluID0gRG9tYWluKCgobURvbWFpbiAmIElTX0RFQ09ERVIpID8gSVNfQ09ERUQgOiBJU19SQVcpIHwgSVNfSU5QVVQpOworICAgIG1PdXRwdXREb21haW4gPSBEb21haW4oKChtRG9tYWluICYgSVNfRU5DT0RFUikgPyBJU19DT0RFRCA6IElTX1JBVykgfCBJU19PVVRQVVQpOworCisgICAgQUxPR1YoImRvbWFpbiBpcyAlI3ggKCV1ICV1KSIsIG1Eb21haW4sIGRvbWFpbi52YWx1ZSwga2luZC52YWx1ZSk7CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gcGFyYW1JbmRpY2VzOworICAgIHN3aXRjaCAoa2luZC52YWx1ZSkgeworICAgIGNhc2UgQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUjoKKyAgICAgICAgbUNvZGluZ01lZGlhVHlwZSA9IFF1ZXJ5TWVkaWFUeXBlKHRydWUgLyogaW5wdXQgKi8sIGNvbXBvbmVudCkuY19zdHIoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSOgorICAgICAgICBtQ29kaW5nTWVkaWFUeXBlID0gUXVlcnlNZWRpYVR5cGUoZmFsc2UgLyogaW5wdXQgKi8sIGNvbXBvbmVudCkuY19zdHIoKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgbUNvZGluZ01lZGlhVHlwZSA9ICIiOworICAgIH0KKworICAgIGMyZXJyID0gY29tcG9uZW50LT5xdWVyeVN1cHBvcnRlZFBhcmFtcygmbVBhcmFtRGVzY3MpOworICAgIGlmIChjMmVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgiUXVlcnkgc3VwcG9ydGVkIHBhcmFtcyBmYWlsZWQgYWZ0ZXIgcmV0dXJuaW5nICV6dSB2YWx1ZXMgPT4gJXMiLAorICAgICAgICAgICAgICAgIG1QYXJhbURlc2NzLnNpemUoKSwgYXNTdHJpbmcoYzJlcnIpKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiAmZGVzYyA6IG1QYXJhbURlc2NzKSB7CisgICAgICAgIG1TdXBwb3J0ZWRJbmRpY2VzLmVtcGxhY2UoZGVzYy0+aW5kZXgoKSk7CisgICAgfQorCisgICAgbVJlZmxlY3RvciA9IGNsaWVudC0+Z2V0UGFyYW1SZWZsZWN0b3IoKTsKKyAgICBpZiAobVJlZmxlY3RvciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IHBhcmFtIHJlZmxlY3RvciIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAvLyBlbnVtZXJhdGUgYWxsIGZpZWxkcworICAgIG1QYXJhbVVwZGF0ZXIgPSBzdGQ6Om1ha2Vfc2hhcmVkPFJlZmxlY3RlZFBhcmFtVXBkYXRlcj4oKTsKKyAgICBtUGFyYW1VcGRhdGVyLT5jbGVhcigpOworICAgIG1QYXJhbVVwZGF0ZXItPnN1cHBvcnRXaG9sZVBhcmFtKAorICAgICAgICAgICAgQzJfUEFSQU1LRVlfVEVNUE9SQUxfTEFZRVJJTkcsIEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6Q09SRV9JTkRFWCk7CisgICAgbVBhcmFtVXBkYXRlci0+YWRkUGFyYW1EZXNjKG1SZWZsZWN0b3IsIG1QYXJhbURlc2NzKTsKKworICAgIC8vIFRFTVA6IGFkZCBzb21lIHN0YW5kYXJkIGZpZWxkcyBldmVuIGlmIG5vdCByZWZsZWN0ZWQKKyAgICBpZiAoa2luZC52YWx1ZSA9PSBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSKSB7CisgICAgICAgIG1QYXJhbVVwZGF0ZXItPmFkZFN0YW5kYXJkUGFyYW08QzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dD4oQzJfUEFSQU1LRVlfSU5JVF9EQVRBKTsKKyAgICB9CisgICAgaWYgKGRvbWFpbi52YWx1ZSA9PSBDMkNvbXBvbmVudDo6RE9NQUlOX0lNQUdFIHx8IGRvbWFpbi52YWx1ZSA9PSBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPKSB7CisgICAgICAgIGlmIChraW5kLnZhbHVlICE9IEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVIpIHsKKyAgICAgICAgICAgIGFkZExvY2FsUGFyYW08QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4oQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKTsKKyAgICAgICAgICAgIGFkZExvY2FsUGFyYW08QzJTdHJlYW1Dcm9wUmVjdEluZm86Om91dHB1dD4oQzJfUEFSQU1LRVlfQ1JPUF9SRUNUKTsKKyAgICAgICAgICAgIGFkZExvY2FsUGFyYW0oCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbVBpeGVsQXNwZWN0UmF0aW9JbmZvOjpvdXRwdXQoMHUsIDF1LCAxdSksCisgICAgICAgICAgICAgICAgICAgIEMyX1BBUkFNS0VZX1BJWEVMX0FTUEVDVF9SQVRJTyk7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtKG5ldyBDMlN0cmVhbVJvdGF0aW9uSW5mbzo6b3V0cHV0KDB1LCAwKSwgQzJfUEFSQU1LRVlfUk9UQVRJT04pOworICAgICAgICAgICAgYWRkTG9jYWxQYXJhbShuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQoMHUpLCBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTKTsKKyAgICAgICAgICAgIGFkZExvY2FsUGFyYW08QzJTdHJlYW1EYXRhU3BhY2VJbmZvOjpvdXRwdXQ+KEMyX1BBUkFNS0VZX0RBVEFfU1BBQ0UpOworICAgICAgICAgICAgYWRkTG9jYWxQYXJhbTxDMlN0cmVhbUhkclN0YXRpY0luZm86Om91dHB1dD4oQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPKTsKKyAgICAgICAgICAgIGFkZExvY2FsUGFyYW0obmV3IEMyU3RyZWFtU3VyZmFjZVNjYWxpbmdJbmZvOjpvdXRwdXQoMHUsIFZJREVPX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19GSVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9QQVJBTUtFWV9TVVJGQUNFX1NDQUxJTkdfTU9ERSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtKG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0KDB1KSwgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbml0aWFsaXplU3RhbmRhcmRQYXJhbXMoKTsKKworICAgIC8vIHN1YnNjcmliZSB0byBhbGwgc3VwcG9ydGVkIHN0YW5kYXJkIChleHBvc2VkKSBwYXJhbXMKKyAgICAvLyBUT0RPOiBsaW1pdCB0aGlzIHRvIHBhcmFtcyB0aGF0IGFyZSBhY3R1YWxseSBpbiB0aGUgZG9tYWluCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGZvcm1hdEtleXMgPSBtU3RhbmRhcmRQYXJhbXMtPmdldFBhdGhzRm9yRG9tYWluKERvbWFpbigxIDw8IDMwKSk7CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXM7CisgICAgbVBhcmFtVXBkYXRlci0+Z2V0UGFyYW1JbmRpY2VzRm9yS2V5cyhmb3JtYXRLZXlzLCAmaW5kaWNlcyk7CisgICAgbVN1YnNjcmliZWRJbmRpY2VzLmluc2VydChpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCkpOworCisgICAgLy8gYWxzbyBzdWJzY3JpYmUgdG8gc29tZSBub24tU0RLIHN0YW5kYXJkIHBhcmFtZXRlcnMKKyAgICAvLyBmb3IgbnVtYmVyIG9mIGlucHV0L291dHB1dCBidWZmZXJzCisgICAgbVN1YnNjcmliZWRJbmRpY2VzLmVtcGxhY2UoQzJQb3J0U3VnZ2VzdGVkQnVmZmVyQ291bnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKyAgICBtU3Vic2NyaWJlZEluZGljZXMuZW1wbGFjZShDMlBvcnRTdWdnZXN0ZWRCdWZmZXJDb3VudFR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKyAgICBtU3Vic2NyaWJlZEluZGljZXMuZW1wbGFjZShDMkFjdHVhbFBpcGVsaW5lRGVsYXlUdW5pbmc6OlBBUkFNX1RZUEUpOworICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5lbXBsYWNlKEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSk7CisgICAgbVN1YnNjcmliZWRJbmRpY2VzLmVtcGxhY2UoQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisgICAgLy8gZm9yIG91dHB1dCBidWZmZXIgYXJyYXkgYWxsb2NhdGlvbgorICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5lbXBsYWNlKEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86Om91dHB1dDo6UEFSQU1fVFlQRSk7CisgICAgLy8gaW5pdCBkYXRhIChDU0QpCisgICAgbVN1YnNjcmliZWRJbmRpY2VzLmVtcGxhY2UoQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dDo6UEFSQU1fVFlQRSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENDb2RlY0NvbmZpZzo6c3Vic2NyaWJlVG9Db25maWdVcGRhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZpbmRpY2VzLAorICAgICAgICBjMl9ibG9ja2luZ190IGJsb2NraW5nKSB7CisgICAgbVN1YnNjcmliZWRJbmRpY2VzLmluc2VydChpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCkpOworICAgIC8vIFRPRE86IGVuYWJsZSB0aGlzIHdoZW4gY29tcG9uZW50cyBubyBsb25nZXIgY3Jhc2ggb24gdGhpcyBjb25maWcKKyAgICBpZiAobVN1YnNjcmliZWRJbmRpY2VzLnNpemUoKSAhPSBtU3Vic2NyaWJlZEluZGljZXNTaXplICYmIGZhbHNlKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBpbmRpY2VzOworICAgICAgICBmb3IgKEMyUGFyYW06OkluZGV4IGl4IDogbVN1YnNjcmliZWRJbmRpY2VzKSB7CisgICAgICAgICAgICBpbmRpY2VzLnB1c2hfYmFjayhpeCk7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3Vic2NyaWJlZFBhcmFtSW5kaWNlc1R1bmluZz4gc3Vic2NyaWJlVHVuaW5nID0KKyAgICAgICAgICAgIEMyU3Vic2NyaWJlZFBhcmFtSW5kaWNlc1R1bmluZzo6QWxsb2NVbmlxdWUoaW5kaWNlcyk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiByZXN1bHRzOworICAgICAgICBjMl9zdGF0dXNfdCBjMkVyciA9IGNvbXBvbmVudC0+Y29uZmlnKHsgc3Vic2NyaWJlVHVuaW5nLmdldCgpIH0sIGJsb2NraW5nLCAmcmVzdWx0cyk7CisgICAgICAgIGlmIChjMkVyciAhPSBDMl9PSyAmJiBjMkVyciAhPSBDMl9CQURfSU5ERVgpIHsKKyAgICAgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gc3Vic2NyaWJlIHRvIHBhcmFtZXRlcnMgPT4gJXMiLCBhc1N0cmluZyhjMkVycikpOworICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiU3Vic2NyaWJlZCB0byAlenUgcGFyYW1zIiwgbVN1YnNjcmliZWRJbmRpY2VzLnNpemUoKSk7CisgICAgICAgIG1TdWJzY3JpYmVkSW5kaWNlc1NpemUgPSBtU3Vic2NyaWJlZEluZGljZXMuc2l6ZSgpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENDb2RlY0NvbmZpZzo6cXVlcnlDb25maWd1cmF0aW9uKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wb25lbnQpIHsKKyAgICAvLyBxdWVyeSBhbGwgc3Vic2NyaWJlZCBwYXJhbWV0ZXJzCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXMobVN1YnNjcmliZWRJbmRpY2VzLmJlZ2luKCksIG1TdWJzY3JpYmVkSW5kaWNlcy5lbmQoKSk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBxdWVyaWVkOworICAgIGMyX3N0YXR1c190IGMyRXJyID0gY29tcG9uZW50LT5xdWVyeSh7fSwgaW5kaWNlcywgQzJfTUFZX0JMT0NLLCAmcXVlcmllZCk7CisgICAgaWYgKGMyRXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dJKCJxdWVyeSBmYWlsZWQgYWZ0ZXIgcmV0dXJuaW5nICV6dSB2YWx1ZXMgKCVzKSIsIHF1ZXJpZWQuc2l6ZSgpLCBhc1N0cmluZyhjMkVycikpOworICAgICAgICAvLyBUT0RPOiBlcnJvcgorICAgIH0KKworICAgIHVwZGF0ZUNvbmZpZ3VyYXRpb24ocXVlcmllZCwgQUxMKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgQ0NvZGVjQ29uZmlnOjp1cGRhdGVDb25maWd1cmF0aW9uKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICZjb25maWdVcGRhdGUsIERvbWFpbiBkb21haW4pIHsKKyAgICBBTE9HVigidXBkYXRpbmcgY29uZmlndXJhdGlvbiB3aXRoICV6dSBwYXJhbXMiLCBjb25maWdVcGRhdGUuc2l6ZSgpKTsKKyAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKyAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiAmcCA6IGNvbmZpZ1VwZGF0ZSkgeworICAgICAgICBpZiAocCAmJiAqcCkgeworICAgICAgICAgICAgYXV0byBpbnNlcnRpb24gPSBtQ3VycmVudENvbmZpZy5lbXBsYWNlKHAtPmluZGV4KCksIG51bGxwdHIpOworICAgICAgICAgICAgaWYgKGluc2VydGlvbi5zZWNvbmQgfHwgKmluc2VydGlvbi5maXJzdC0+c2Vjb25kICE9ICpwKSB7CisgICAgICAgICAgICAgICAgaWYgKG1TdXBwb3J0ZWRJbmRpY2VzLmNvdW50KHAtPmluZGV4KCkpIHx8IG1Mb2NhbFBhcmFtcy5jb3VudChwLT5pbmRleCgpKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHRyYWNrIGNoYW5nZXMgaW4gc3VwcG9ydGVkIChyZWZsZWN0ZWQgb3IgbG9jYWwpIGluZGljZXMKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImFuIHVubGlzdGVkIGNvbmZpZyB3YXMgJXM6ICUjeCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0aW9uLnNlY29uZCA/ICJhZGRlZCIgOiAidXBkYXRlZCIsIHAtPmluZGV4KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluc2VydGlvbi5maXJzdC0+c2Vjb25kID0gc3RkOjptb3ZlKHApOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoInVwZGF0ZWQgY29uZmlndXJhdGlvbiBoYXMgJXp1IHBhcmFtcyAoJXMpIiwgbUN1cnJlbnRDb25maWcuc2l6ZSgpLAorICAgICAgICAgICAgY2hhbmdlZCA/ICJDSEFOR0VEIiA6ICJubyBjaGFuZ2UiKTsKKyAgICBpZiAoY2hhbmdlZCkgeworICAgICAgICByZXR1cm4gdXBkYXRlRm9ybWF0cyhkb21haW4pOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ0NvZGVjQ29uZmlnOjp1cGRhdGVGb3JtYXRzKERvbWFpbiBkb21haW4pIHsKKyAgICAvLyBnZXQgYWRkcmVzc2VzIG9mIHBhcmFtcyBpbiB0aGUgY3VycmVudCBjb25maWcKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gcGFyYW1Qb2ludGVyczsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0IDogbUN1cnJlbnRDb25maWcpIHsKKyAgICAgICAgcGFyYW1Qb2ludGVycy5wdXNoX2JhY2soaXQuc2Vjb25kLmdldCgpKTsKKyAgICB9CisKKyAgICBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3QgcmVmbGVjdGVkID0gbVBhcmFtVXBkYXRlci0+Z2V0UGFyYW1zKHBhcmFtUG9pbnRlcnMpOworICAgIEFMT0dEKCJjMiBjb25maWcgaXMgJXMiLCByZWZsZWN0ZWQuZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKworICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICAgIGlmIChkb21haW4gJiBtSW5wdXREb21haW4pIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG9sZEZvcm1hdCA9IG1JbnB1dEZvcm1hdDsKKyAgICAgICAgbUlucHV0Rm9ybWF0ID0gbUlucHV0Rm9ybWF0LT5kdXAoKTsgLy8gdHJpZ2dlciBmb3JtYXQgY2hhbmdlZAorICAgICAgICBtSW5wdXRGb3JtYXQtPmV4dGVuZChnZXRTZGtGb3JtYXRGb3JEb21haW4ocmVmbGVjdGVkLCBtSW5wdXREb21haW4pKTsKKyAgICAgICAgaWYgKG1JbnB1dEZvcm1hdC0+Y291bnRFbnRyaWVzKCkgIT0gb2xkRm9ybWF0LT5jb3VudEVudHJpZXMoKQorICAgICAgICAgICAgICAgIHx8IG1JbnB1dEZvcm1hdC0+Y2hhbmdlc0Zyb20ob2xkRm9ybWF0KS0+Y291bnRFbnRyaWVzKCkgPiAwKSB7CisgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1JbnB1dEZvcm1hdCA9IG9sZEZvcm1hdDsgLy8gbm8gY2hhbmdlCisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGRvbWFpbiAmIG1PdXRwdXREb21haW4pIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG9sZEZvcm1hdCA9IG1PdXRwdXRGb3JtYXQ7CisgICAgICAgIG1PdXRwdXRGb3JtYXQgPSBtT3V0cHV0Rm9ybWF0LT5kdXAoKTsgLy8gdHJpZ2dlciBvdXRwdXQgZm9ybWF0IGNoYW5nZWQKKyAgICAgICAgbU91dHB1dEZvcm1hdC0+ZXh0ZW5kKGdldFNka0Zvcm1hdEZvckRvbWFpbihyZWZsZWN0ZWQsIG1PdXRwdXREb21haW4pKTsKKyAgICAgICAgaWYgKG1PdXRwdXRGb3JtYXQtPmNvdW50RW50cmllcygpICE9IG9sZEZvcm1hdC0+Y291bnRFbnRyaWVzKCkKKyAgICAgICAgICAgICAgICB8fCBtT3V0cHV0Rm9ybWF0LT5jaGFuZ2VzRnJvbShvbGRGb3JtYXQpLT5jb3VudEVudHJpZXMoKSA+IDApIHsKKyAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU91dHB1dEZvcm1hdCA9IG9sZEZvcm1hdDsgLy8gbm8gY2hhbmdlCisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1ZfSUYoY2hhbmdlZCwgImZvcm1hdChzKSBjaGFuZ2VkIik7CisgICAgcmV0dXJuIGNoYW5nZWQ7Cit9CisKK3NwPEFNZXNzYWdlPiBDQ29kZWNDb25maWc6OmdldFNka0Zvcm1hdEZvckRvbWFpbigKKyAgICAgICAgY29uc3QgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0ICZyZWZsZWN0ZWQsIERvbWFpbiBwb3J0RG9tYWluKSBjb25zdCB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZTsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8Q29uZmlnTWFwcGVyPj4gJmVsIDogbVN0YW5kYXJkUGFyYW1zLT5nZXRLZXlzKCkpIHsKKyAgICAgICAgZm9yIChjb25zdCBDb25maWdNYXBwZXIgJmNtIDogZWwuc2Vjb25kKSB7CisgICAgICAgICAgICBpZiAoKGNtLmRvbWFpbigpICYgcG9ydERvbWFpbikgPT0gMCAvLyBpbnB1dC1vdXRwdXQtY29kZWQtcmF3CisgICAgICAgICAgICAgICAgfHwgKGNtLmRvbWFpbigpICYgbURvbWFpbikgIT0gbURvbWFpbiAvLyBjb21wb25lbnQgZG9tYWluICsga2luZCAodGhlc2UgbXVzdCBtYXRjaCkKKyAgICAgICAgICAgICAgICB8fCAoY20uZG9tYWluKCkgJiBJU19SRUFEKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdXRvIGl0ID0gcmVmbGVjdGVkLmZpbmQoY20ucGF0aCgpKTsKKyAgICAgICAgICAgIGlmIChpdCA9PSByZWZsZWN0ZWQuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEMyVmFsdWUgYzJWYWx1ZTsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZlZhbHVlOworICAgICAgICAgICAgQVN0cmluZyBzdHJWYWx1ZTsKKyAgICAgICAgICAgIEFNZXNzYWdlOjpJdGVtRGF0YSBpdGVtOworICAgICAgICAgICAgaWYgKGl0LT5zZWNvbmQuZmluZCgmYzJWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBpdGVtID0gY20ubWFwVG9NZXNzYWdlKGMyVmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpdC0+c2Vjb25kLmZpbmQoJmJ1ZlZhbHVlKSkgeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0KGJ1ZlZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXQtPnNlY29uZC5maW5kKCZzdHJWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBpdGVtLnNldChzdHJWYWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dEKCJ1bmV4cGVjdGVkIHVudHlwZWQgcXVlcnkgdmFsdWUgZm9yIGtleTogJXMiLCBjbS5wYXRoKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtc2ctPnNldEl0ZW0oZWwuZmlyc3QuY19zdHIoKSwgaXRlbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7IC8vIGNvbnZlcnQgZnJvbSBDb2RlYyAyLjAgcmVjdCB0byBNZWRpYUZvcm1hdCByZWN0IGFuZCBhZGQgY3JvcCByZWN0IGlmIG5vdCBwcmVzZW50CisgICAgICAgIGludDMyX3QgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0OworICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImNyb3AtbGVmdCIsICZsZWZ0KSAmJiBtc2ctPmZpbmRJbnQzMigiY3JvcC13aWR0aCIsICZ3aWR0aCkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRJbnQzMigiY3JvcC10b3AiLCAmdG9wKSAmJiBtc2ctPmZpbmRJbnQzMigiY3JvcC1oZWlnaHQiLCAmaGVpZ2h0KQorICAgICAgICAgICAgICAgICYmIGxlZnQgPj0gMCAmJiB3aWR0aCA+PTAgJiYgd2lkdGggPD0gSU5UMzJfTUFYIC0gbGVmdAorICAgICAgICAgICAgICAgICYmIHRvcCA+PSAwICYmIGhlaWdodCA+PTAgJiYgaGVpZ2h0IDw9IElOVDMyX01BWCAtIHRvcCkgeworICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJjcm9wLWxlZnQiKSk7CisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImNyb3AtdG9wIikpOworICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJjcm9wLXdpZHRoIikpOworICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJjcm9wLWhlaWdodCIpKTsKKyAgICAgICAgICAgIG1zZy0+c2V0UmVjdCgiY3JvcCIsIGxlZnQsIHRvcCwgbGVmdCArIHdpZHRoIC0gMSwgdG9wICsgaGVpZ2h0IC0gMSk7CisgICAgICAgIH0gZWxzZSBpZiAobXNnLT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSAmJiBtc2ctPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UmVjdCgiY3JvcCIsIDAsIDAsIHdpZHRoIC0gMSwgaGVpZ2h0IC0gMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7IC8vIGNvbnZlcnQgdGVtcG9yYWwgbGF5ZXJpbmcgdG8gc2NoZW1hCisgICAgICAgIHNwPEFCdWZmZXI+IHRtcDsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcihDMl9QQVJBTUtFWV9URU1QT1JBTF9MQVlFUklORywgJnRtcCkgJiYgdG1wICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZyAqbGF5ZXJpbmcgPQorICAgICAgICAgICAgICAgIEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6RnJvbShDMlBhcmFtOjpGcm9tKHRtcC0+ZGF0YSgpLCB0bXAtPnNpemUoKSkpOworICAgICAgICAgICAgaWYgKGxheWVyaW5nICYmIGxheWVyaW5nLT5tLmxheWVyQ291bnQgPiAwCisgICAgICAgICAgICAgICAgICAgICYmIGxheWVyaW5nLT5tLmJMYXllckNvdW50IDwgbGF5ZXJpbmctPm0ubGF5ZXJDb3VudCkgeworICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgaXMgd2VicnRjIGNvbXBhdGlibGUKKyAgICAgICAgICAgICAgICBBU3RyaW5nIG1pbWU7CisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZFN0cmluZyhLRVlfTUlNRSwgJm1pbWUpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBtaW1lLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fVlA4KSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJpbmctPm0uYkxheWVyQ291bnQgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKGxheWVyaW5nLT5tLmxheWVyQ291bnQgPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobGF5ZXJpbmctPm0ubGF5ZXJDb3VudCA9PSAyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbGF5ZXJpbmctPmZsZXhDb3VudCgpID49IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+bS5iaXRyYXRlUmF0aW9zWzBdID09IC42ZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGxheWVyaW5nLT5tLmxheWVyQ291bnQgPT0gMworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxheWVyaW5nLT5mbGV4Q291bnQoKSA+PSAyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbGF5ZXJpbmctPm0uYml0cmF0ZVJhdGlvc1swXSA9PSAuNGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+bS5iaXRyYXRlUmF0aW9zWzFdID09IC42ZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGxheWVyaW5nLT5tLmxheWVyQ291bnQgPT0gNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxheWVyaW5nLT5mbGV4Q291bnQoKSA+PSAzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbGF5ZXJpbmctPm0uYml0cmF0ZVJhdGlvc1swXSA9PSAuMjVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbGF5ZXJpbmctPm0uYml0cmF0ZVJhdGlvc1sxXSA9PSAuNGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+bS5iaXRyYXRlUmF0aW9zWzJdID09IC42ZikpKSB7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0U3RyaW5nKEtFWV9URU1QT1JBTF9MQVlFUklORywgQVN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2VicnRjLnZwOC4ldS1sYXllciIsIGxheWVyaW5nLT5tLmxheWVyQ291bnQpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxheWVyaW5nLT5tLmJMYXllckNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0U3RyaW5nKEtFWV9URU1QT1JBTF9MQVlFUklORywgQVN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5nZW5lcmljLiV1KyV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcmluZy0+bS5sYXllckNvdW50IC0gbGF5ZXJpbmctPm0uYkxheWVyQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJpbmctPm0uYkxheWVyQ291bnQpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxheWVyaW5nLT5tLmJMYXllckNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0U3RyaW5nKEtFWV9URU1QT1JBTF9MQVlFUklORywgQVN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5nZW5lcmljLiV1IiwgbGF5ZXJpbmctPm0ubGF5ZXJDb3VudCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZShDMl9QQVJBTUtFWV9URU1QT1JBTF9MQVlFUklORykpOworICAgICAgICB9CisgICAgfQorCisgICAgeyAvLyBjb252ZXJ0IGNvbG9yIGluZm8KKyAgICAgICAgQzJDb2xvcjo6cHJpbWFyaWVzX3QgcHJpbWFyaWVzOworICAgICAgICBDMkNvbG9yOjptYXRyaXhfdCBtYXRyaXg7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiY29sb3ItcHJpbWFyaWVzIiwgKGludDMyX3QqKSZwcmltYXJpZXMpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kSW50MzIoImNvbG9yLW1hdHJpeCIsIChpbnQzMl90KikmbWF0cml4KSkgeworICAgICAgICAgICAgaW50MzJfdCBzdGFuZGFyZDsKKworICAgICAgICAgICAgaWYgKEMyTWFwcGVyOjptYXAocHJpbWFyaWVzLCBtYXRyaXgsICZzdGFuZGFyZCkpIHsKKyAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKEtFWV9DT0xPUl9TVEFOREFSRCwgc3RhbmRhcmQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImNvbG9yLXByaW1hcmllcyIpKTsKKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgiY29sb3ItbWF0cml4IikpOworICAgICAgICB9CisKKworICAgICAgICAvLyBjYWxjdWxhdGUgZGF0YXNwYWNlIGZvciByYXcgZ3JhcGhpYyBidWZmZXJzIGlmIG5vdCBzcGVjaWZpZWQgYnkgY29tcG9uZW50LCBvciBpZgorICAgICAgICAvLyB1c2luZyBzdXJmYWNlIHdpdGggdW5zcGVjaWZpZWQgYXNwZWN0cyAoYXMgdGhvc2UgbXVzdCBiZSBkZWZhdWx0ZWQgd2hpY2ggbWF5IGNoYW5nZQorICAgICAgICAvLyB0aGUgZGF0YXNwYWNlKQorICAgICAgICBpZiAoKHBvcnREb21haW4gJiBJU19SQVcpICYmIChtRG9tYWluICYgKElTX0lNQUdFIHwgSVNfVklERU8pKSkgeworICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YXNwYWNlOworICAgICAgICAgICAgQ29sb3JBc3BlY3RzIGFzcGVjdHMgPSB7CisgICAgICAgICAgICAgICAgQ29sb3JBc3BlY3RzOjpSYW5nZVVuc3BlY2lmaWVkLCBDb2xvckFzcGVjdHM6OlByaW1hcmllc1Vuc3BlY2lmaWVkLAorICAgICAgICAgICAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJVbnNwZWNpZmllZCwgQ29sb3JBc3BlY3RzOjpNYXRyaXhVbnNwZWNpZmllZAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIENvbG9yVXRpbHM6OmdldENvbG9yQXNwZWN0c0Zyb21Gb3JtYXQobXNnLCBhc3BlY3RzKTsKKyAgICAgICAgICAgIENvbG9yQXNwZWN0cyBvcmlnQXNwZWN0cyA9IGFzcGVjdHM7CisgICAgICAgICAgICBpZiAobVVzaW5nU3VyZmFjZSkgeworICAgICAgICAgICAgICAgIC8vIGdldCBpbWFnZSBzaXplIChkZWZhdWx0IHRvIEhEKQorICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGggPSAxMjgwOworICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0ID0gNzIwOworICAgICAgICAgICAgICAgIGludDMyX3QgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tOworICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRSZWN0KCJjcm9wIiwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgd2lkdGggPSByaWdodCAtIGxlZnQgKyAxOworICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSBib3R0b20gLSB0b3AgKyAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKW1zZy0+ZmluZEludDMyKEtFWV9XSURUSCwgJndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpbXNnLT5maW5kSW50MzIoS0VZX0hFSUdIVCwgJmhlaWdodCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbG9yVXRpbHM6OnNldERlZmF1bHRDb2RlY0NvbG9yQXNwZWN0c0lmTmVlZGVkKGFzcGVjdHMsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgICAgIENvbG9yVXRpbHM6OnNldENvbG9yQXNwZWN0c0ludG9Gb3JtYXQoYXNwZWN0cywgbXNnKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYW5kcm9pZC5fZGF0YXNwYWNlIiwgKGludDMyX3QqKSZkYXRhc3BhY2UpCisgICAgICAgICAgICAgICAgICAgIHx8IGFzcGVjdHMubVJhbmdlICE9IG9yaWdBc3BlY3RzLm1SYW5nZQorICAgICAgICAgICAgICAgICAgICB8fCBhc3BlY3RzLm1QcmltYXJpZXMgIT0gb3JpZ0FzcGVjdHMubVByaW1hcmllcworICAgICAgICAgICAgICAgICAgICB8fCBhc3BlY3RzLm1UcmFuc2ZlciAhPSBvcmlnQXNwZWN0cy5tVHJhbnNmZXIKKyAgICAgICAgICAgICAgICAgICAgfHwgYXNwZWN0cy5tTWF0cml4Q29lZmZzICE9IG9yaWdBc3BlY3RzLm1NYXRyaXhDb2VmZnMpIHsKKyAgICAgICAgICAgICAgICBkYXRhc3BhY2UgPSBDb2xvclV0aWxzOjpnZXREYXRhU3BhY2VGb3JDb2xvckFzcGVjdHMoYXNwZWN0cywgdHJ1ZSAvKiBtYXlFeHBhbmQgKi8pOworICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImFuZHJvaWQuX2RhdGFzcGFjZSIsIGRhdGFzcGFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBIRFIgc3RhdGljIGluZm8KKworICAgICAgICBDMkhkclN0YXRpY01ldGFkYXRhU3RydWN0IGhkcjsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEZsb2F0KCJzbXB0ZTIwODYucmVkLngiLCAmaGRyLm1hc3RlcmluZy5yZWQueCkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgic21wdGUyMDg2LnJlZC55IiwgJmhkci5tYXN0ZXJpbmcucmVkLnkpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni5ncmVlbi54IiwgJmhkci5tYXN0ZXJpbmcuZ3JlZW4ueCkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgic21wdGUyMDg2LmdyZWVuLnkiLCAmaGRyLm1hc3RlcmluZy5ncmVlbi55KQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJzbXB0ZTIwODYuYmx1ZS54IiwgJmhkci5tYXN0ZXJpbmcuYmx1ZS54KQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJzbXB0ZTIwODYuYmx1ZS55IiwgJmhkci5tYXN0ZXJpbmcuYmx1ZS55KQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJzbXB0ZTIwODYud2hpdGUueCIsICZoZHIubWFzdGVyaW5nLndoaXRlLngpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni53aGl0ZS55IiwgJmhkci5tYXN0ZXJpbmcud2hpdGUueSkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgic21wdGUyMDg2Lm1heC1sdW1pbmFuY2UiLCAmaGRyLm1hc3RlcmluZy5tYXhMdW1pbmFuY2UpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni5taW4tbHVtaW5hbmNlIiwgJmhkci5tYXN0ZXJpbmcubWluTHVtaW5hbmNlKQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJjdGE4NjEubWF4LWNsbCIsICZoZHIubWF4Q2xsKQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJjdGE4NjEubWF4LWZhbGwiLCAmaGRyLm1heEZhbGwpKSB7CisgICAgICAgICAgICBpZiAoaGRyLm1hc3RlcmluZy5yZWQueCA+PSAwICAgICAgICAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcucmVkLnggPD0gMQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLnJlZC55ID49IDAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLnJlZC55IDw9IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5ncmVlbi54ID49IDAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5ncmVlbi54IDw9IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5ncmVlbi55ID49IDAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5ncmVlbi55IDw9IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5ibHVlLnggPj0gMCAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5ibHVlLnggPD0gMQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLmJsdWUueSA+PSAwICAgICAgICAmJiBoZHIubWFzdGVyaW5nLmJsdWUueSA8PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcud2hpdGUueCA+PSAwICAgICAgICYmIGhkci5tYXN0ZXJpbmcud2hpdGUueCA8PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcud2hpdGUueSA+PSAwICAgICAgICYmIGhkci5tYXN0ZXJpbmcud2hpdGUueSA8PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcubWF4THVtaW5hbmNlID49IDAgICYmIGhkci5tYXN0ZXJpbmcubWF4THVtaW5hbmNlIDw9IDY1NTM1CisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcubWluTHVtaW5hbmNlID49IDAgICYmIGhkci5tYXN0ZXJpbmcubWluTHVtaW5hbmNlIDw9IDYuNTUzNQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWF4Q2xsID49IDAgICAgICAgICAgICAgICAgICAmJiBoZHIubWF4Q2xsIDw9IDY1NTM1CisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXhGYWxsID49IDAgICAgICAgICAgICAgICAgICYmIGhkci5tYXhGYWxsIDw9IDY1NTM1KSB7CisgICAgICAgICAgICAgICAgSERSU3RhdGljSW5mbyBtZXRhOworICAgICAgICAgICAgICAgIG1ldGEubUlEID0gbWV0YS5rVHlwZTE7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubVIueCA9IGhkci5tYXN0ZXJpbmcucmVkLnggLyAwLjAwMDAyICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1SLnkgPSBoZHIubWFzdGVyaW5nLnJlZC55IC8gMC4wMDAwMiArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tRy54ID0gaGRyLm1hc3RlcmluZy5ncmVlbi54IC8gMC4wMDAwMiArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tRy55ID0gaGRyLm1hc3RlcmluZy5ncmVlbi55IC8gMC4wMDAwMiArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tQi54ID0gaGRyLm1hc3RlcmluZy5ibHVlLnggLyAwLjAwMDAyICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1CLnkgPSBoZHIubWFzdGVyaW5nLmJsdWUueSAvIDAuMDAwMDIgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubVcueCA9IGhkci5tYXN0ZXJpbmcud2hpdGUueCAvIDAuMDAwMDIgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubVcueSA9IGhkci5tYXN0ZXJpbmcud2hpdGUueSAvIDAuMDAwMDIgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubU1heERpc3BsYXlMdW1pbmFuY2UgPSBoZHIubWFzdGVyaW5nLm1heEx1bWluYW5jZSArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tTWluRGlzcGxheUx1bWluYW5jZSA9IGhkci5tYXN0ZXJpbmcubWluTHVtaW5hbmNlIC8gMC4wMDAxICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1NYXhDb250ZW50TGlnaHRMZXZlbCA9IGhkci5tYXhDbGwgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubU1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWwgPSBoZHIubWF4RmFsbCArIDAuNTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni5yZWQueCIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni5yZWQueSIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni5ncmVlbi54IikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LmdyZWVuLnkiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYuYmx1ZS54IikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LmJsdWUueSIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni53aGl0ZS54IikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LndoaXRlLnkiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYubWF4LWx1bWluYW5jZSIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni5taW4tbHVtaW5hbmNlIikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgiY3RhODYxLm1heC1jbGwiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJjdGE4NjEubWF4LWZhbGwiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5zZXRCdWZmZXIoS0VZX0hEUl9TVEFUSUNfSU5GTywgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KCZtZXRhLCBzaXplb2YobWV0YSkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImZvdW5kIGludmFsaWQgSERSIHN0YXRpYyBtZXRhZGF0YSAlcyIsIG1zZy0+ZGVidWdTdHJpbmcoOCkuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigiY29udmVydGVkIHRvIFNESyB2YWx1ZXMgYXMgJXMiLCBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisgICAgcmV0dXJuIG1zZzsKK30KKworLy8vIGNvbnZlcnRzIGFuIEFNZXNzYWdlIHZhbHVlIHRvIGEgUGFyYW1VcGRhdGVyIHZhbHVlCitzdGF0aWMgdm9pZCBjb252ZXJ0KGNvbnN0IEFNZXNzYWdlOjpJdGVtRGF0YSAmZnJvbSwgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpWYWx1ZSAqdG8pIHsKKyAgICBpbnQzMl90IGludDMyVmFsdWU7CisgICAgaW50NjRfdCBpbnQ2NFZhbHVlOworICAgIHNwPEFCdWZmZXI+IGJ1ZlZhbHVlOworICAgIEFTdHJpbmcgc3RyVmFsdWU7CisgICAgZmxvYXQgZmxvYXRWYWx1ZTsKKyAgICBkb3VibGUgZG91YmxlVmFsdWU7CisKKyAgICBpZiAoZnJvbS5maW5kKCZpbnQzMlZhbHVlKSkgeworICAgICAgICB0by0+c2V0KGludDMyVmFsdWUpOworICAgIH0gZWxzZSBpZiAoZnJvbS5maW5kKCZpbnQ2NFZhbHVlKSkgeworICAgICAgICB0by0+c2V0KGludDY0VmFsdWUpOworICAgIH0gZWxzZSBpZiAoZnJvbS5maW5kKCZidWZWYWx1ZSkpIHsKKyAgICAgICAgdG8tPnNldChidWZWYWx1ZSk7CisgICAgfSBlbHNlIGlmIChmcm9tLmZpbmQoJnN0clZhbHVlKSkgeworICAgICAgICB0by0+c2V0KHN0clZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGZyb20uZmluZCgmZmxvYXRWYWx1ZSkpIHsKKyAgICAgICAgdG8tPnNldChDMlZhbHVlKGZsb2F0VmFsdWUpKTsKKyAgICB9IGVsc2UgaWYgKGZyb20uZmluZCgmZG91YmxlVmFsdWUpKSB7CisgICAgICAgIC8vIGNvbnZlcnQgZG91YmxlIHRvIGZsb2F0CisgICAgICAgIHRvLT5zZXQoQzJWYWx1ZSgoZmxvYXQpZG91YmxlVmFsdWUpKTsKKyAgICB9CisgICAgLy8gaWdub3JlIGFsbCBvdGhlciBBTWVzc2FnZSB0eXBlcworfQorCisvLy8gcmVsYXhlcyBDb2RlYyAyLjAgc3BlY2lmaWMgdmFsdWUgdHlwZXMgdG8gU0RLIHR5cGVzIChtYWlubHkgcmVtb3ZlcyBzaWduZWRuZXNzIGFuZCBjb3VudGVybmVzcworLy8vIGZyb20gMzIvNjQtYml0IHZhbHVlcy4pCitzdGF0aWMgdm9pZCByZWxheFZhbHVlcyhSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OlZhbHVlICZpdGVtKSB7CisgICAgQzJWYWx1ZSBjMlZhbHVlOworICAgIGludDMyX3QgaW50MzJWYWx1ZTsKKyAgICBpbnQ2NF90IGludDY0VmFsdWU7CisgICAgKHZvaWQpaXRlbS5maW5kKCZjMlZhbHVlKTsKKyAgICBpZiAoYzJWYWx1ZS5nZXQoJmludDMyVmFsdWUpIHx8IGMyVmFsdWUuZ2V0KCh1aW50MzJfdCopJmludDMyVmFsdWUpCisgICAgICAgICAgICB8fCBjMlZhbHVlLmdldCgoYzJfY250cjMyX3QqKSZpbnQzMlZhbHVlKSkgeworICAgICAgICBpdGVtLnNldChpbnQzMlZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGMyVmFsdWUuZ2V0KCZpbnQ2NFZhbHVlKQorICAgICAgICAgICAgfHwgYzJWYWx1ZS5nZXQoKHVpbnQ2NF90KikmaW50NjRWYWx1ZSkKKyAgICAgICAgICAgIHx8IGMyVmFsdWUuZ2V0KChjMl9jbnRyNjRfdCopJmludDY0VmFsdWUpKSB7CisgICAgICAgIGl0ZW0uc2V0KGludDY0VmFsdWUpOworICAgIH0KK30KKworUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0IENDb2RlY0NvbmZpZzo6Z2V0UmVmbGVjdGVkRm9ybWF0KAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtc18sIERvbWFpbiBjb25maWdEb21haW4pIGNvbnN0IHsKKyAgICAvLyBjcmVhdGUgYSBtb2RpZmlhYmxlIGNvcHkgb2YgcGFyYW1zCisgICAgc3A8QU1lc3NhZ2U+IHBhcmFtcyA9IHBhcmFtc18tPmR1cCgpOworICAgIEFMT0dWKCJmaWx0ZXJpbmcgd2l0aCBjb25maWcgZG9tYWluICV4IiwgY29uZmlnRG9tYWluKTsKKworICAgIC8vIGNvbnZlcnQgc29tZSBtYWNybyBwYXJhbWV0ZXJzIHRvIENvZGVjIDIuMCBzcGVjaWZpYyBleHByZXNzaW9ucworCisgICAgeyAvLyBtYWtlIGktZnJhbWUtaW50ZXJ2YWwgZnJhbWUgYmFzZWQKKyAgICAgICAgZmxvYXQgaUZyYW1lSW50ZXJ2YWw7CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRBc0Zsb2F0KEtFWV9JX0ZSQU1FX0lOVEVSVkFMLCAmaUZyYW1lSW50ZXJ2YWwpKSB7CisgICAgICAgICAgICBmbG9hdCBmcmFtZVJhdGU7CisgICAgICAgICAgICBpZiAocGFyYW1zLT5maW5kQXNGbG9hdChLRVlfRlJBTUVfUkFURSwgJmZyYW1lUmF0ZSkpIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEludDMyKCJpLWZyYW1lLXBlcmlvZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAoZnJhbWVSYXRlIDw9IDAgfHwgaUZyYW1lSW50ZXJ2YWwgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAtMSAvKiBubyBzeW5jIGZyYW1lcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoaW50MzJfdCljMl9taW4oaUZyYW1lSW50ZXJ2YWwgKiBmcmFtZVJhdGUgKyAwLjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpSU5UMzJfTUFYKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobURvbWFpbiA9PSAoSVNfVklERU8gfCBJU19FTkNPREVSKSkgeworICAgICAgICAvLyBjb252ZXJ0IGNhcHR1cmUtcmF0ZSBpbnRvIGlucHV0LXRpbWUtc3RyZXRjaAorICAgICAgICBmbG9hdCBmcmFtZVJhdGUsIGNhcHR1cmVSYXRlOworICAgICAgICBpZiAocGFyYW1zLT5maW5kQXNGbG9hdChLRVlfRlJBTUVfUkFURSwgJmZyYW1lUmF0ZSkpIHsKKyAgICAgICAgICAgIGlmICghcGFyYW1zLT5maW5kQXNGbG9hdCgidGltZS1sYXBzZS1mcHMiLCAmY2FwdHVyZVJhdGUpCisgICAgICAgICAgICAgICAgICAgICYmICFwYXJhbXMtPmZpbmRBc0Zsb2F0KEtFWV9DQVBUVVJFX1JBVEUsICZjYXB0dXJlUmF0ZSkpIHsKKyAgICAgICAgICAgICAgICBjYXB0dXJlUmF0ZSA9IGZyYW1lUmF0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjYXB0dXJlUmF0ZSA+IDAgJiYgZnJhbWVSYXRlID4gMCkgeworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoQzJfUEFSQU1LRVlfSU5QVVRfVElNRV9TVFJFVENILCBjYXB0dXJlUmF0ZSAvIGZyYW1lUmF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7ICAgLy8gcmVmbGVjdCB0ZW1wb3JhbCBsYXllcmluZyBpbnRvIGEgYmluYXJ5IGJsb2IKKyAgICAgICAgQVN0cmluZyBzY2hlbWE7CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRTdHJpbmcoS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCAmc2NoZW1hKSkgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bUxheWVycyA9IDA7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtQkxheWVycyA9IDA7CisgICAgICAgICAgICBpbnQgdGFnczsKKyAgICAgICAgICAgIGNoYXIgZHVtbXk7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ+IGxheWVyaW5nOworICAgICAgICAgICAgaWYgKHNzY2FuZihzY2hlbWEuY19zdHIoKSwgIndlYnJ0Yy52cDguJXUtbGF5ZXIlYyIsICZudW1MYXllcnMsICZkdW1teSkgPT0gMQorICAgICAgICAgICAgICAgICYmIG51bUxheWVycyA+IDApIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG51bUxheWVycykgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBsYXllcmluZyA9IEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6b3V0cHV0OjpBbGxvY1VuaXF1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge30sIDB1LCAxdSwgMHUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyaW5nID0gQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC42ZiB9LCAwdSwgMnUsIDB1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBsYXllcmluZyA9IEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6b3V0cHV0OjpBbGxvY1VuaXF1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuNGYsIC42ZiB9LCAwdSwgM3UsIDB1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJpbmcgPSBDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dDo6QWxsb2NVbmlxdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLjI1ZiwgLjRmLCAuNmYgfSwgMHUsIDR1LCAwdSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKCh0YWdzID0gc3NjYW5mKHNjaGVtYS5jX3N0cigpLCAiYW5kcm9pZC5nZW5lcmljLiV1JWMldSVjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZudW1MYXllcnMsICZkdW1teSwgJm51bUJMYXllcnMsICZkdW1teSkpCisgICAgICAgICAgICAgICAgJiYgKHRhZ3MgPT0gMSB8fCAodGFncyA9PSAzICYmIGR1bW15ID09ICcrJykpCisgICAgICAgICAgICAgICAgJiYgbnVtTGF5ZXJzID4gMCAmJiBudW1MYXllcnMgPCBVSU5UMzJfTUFYIC0gbnVtQkxheWVycykgeworICAgICAgICAgICAgICAgIGxheWVyaW5nID0gQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKAorICAgICAgICAgICAgICAgICAgICAgICAge30sIDB1LCBudW1MYXllcnMgKyBudW1CTGF5ZXJzLCBudW1CTGF5ZXJzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIklnbm9yaW5nIHVuc3VwcG9ydGVkIHRzLXNjaGVtYSBbJXNdIiwgc2NoZW1hLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxheWVyaW5nKSB7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRCdWZmZXIoQzJfUEFSQU1LRVlfVEVNUE9SQUxfTEFZRVJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KGxheWVyaW5nLmdldCgpLCBsYXllcmluZy0+c2l6ZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7IC8vIGNvbnZlcnQgZnJvbSBNZWRpYUZvcm1hdCByZWN0IHRvIENvZGVjIDIuMCByZWN0CisgICAgICAgIGludDMyX3Qgb2Zmc2V0OworICAgICAgICBpbnQzMl90IGVuZDsKKyAgICAgICAgQU1lc3NhZ2U6Okl0ZW1EYXRhIGl0ZW07CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMigiY3JvcC1sZWZ0IiwgJm9mZnNldCkgJiYgcGFyYW1zLT5maW5kSW50MzIoImNyb3AtcmlnaHQiLCAmZW5kKQorICAgICAgICAgICAgICAgICYmIG9mZnNldCA+PSAwICYmIGVuZCA+PSBvZmZzZXQgLSAxKSB7CisgICAgICAgICAgICBzaXplX3QgaXggPSBwYXJhbXMtPmZpbmRFbnRyeUJ5TmFtZSgiY3JvcC1yaWdodCIpOworICAgICAgICAgICAgcGFyYW1zLT5zZXRFbnRyeU5hbWVBdChpeCwgImNyb3Atd2lkdGgiKTsKKyAgICAgICAgICAgIGl0ZW0uc2V0KGVuZCAtIG9mZnNldCArIDEpOworICAgICAgICAgICAgcGFyYW1zLT5zZXRFbnRyeUF0KGl4LCBpdGVtKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoImNyb3AtdG9wIiwgJm9mZnNldCkgJiYgcGFyYW1zLT5maW5kSW50MzIoImNyb3AtYm90dG9tIiwgJmVuZCkKKyAgICAgICAgICAgICAgICAmJiBvZmZzZXQgPj0gMCAmJiBlbmQgPj0gb2Zmc2V0IC0gMSkgeworICAgICAgICAgICAgc2l6ZV90IGl4ID0gcGFyYW1zLT5maW5kRW50cnlCeU5hbWUoImNyb3AtYm90dG9tIik7CisgICAgICAgICAgICBwYXJhbXMtPnNldEVudHJ5TmFtZUF0KGl4LCAiY3JvcC1oZWlnaHQiKTsKKyAgICAgICAgICAgIGl0ZW0uc2V0KGVuZCAtIG9mZnNldCArIDEpOworICAgICAgICAgICAgcGFyYW1zLT5zZXRFbnRyeUF0KGl4LCBpdGVtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHsgLy8gY29udmVydCBjb2xvciBpbmZvCisgICAgICAgIGludDMyX3Qgc3RhbmRhcmQ7CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMihLRVlfQ09MT1JfU1RBTkRBUkQsICZzdGFuZGFyZCkpIHsKKyAgICAgICAgICAgIEMyQ29sb3I6OnByaW1hcmllc190IHByaW1hcmllczsKKyAgICAgICAgICAgIEMyQ29sb3I6Om1hdHJpeF90IG1hdHJpeDsKKworICAgICAgICAgICAgaWYgKEMyTWFwcGVyOjptYXAoc3RhbmRhcmQsICZwcmltYXJpZXMsICZtYXRyaXgpKSB7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRJbnQzMigiY29sb3ItcHJpbWFyaWVzIiwgcHJpbWFyaWVzKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEludDMyKCJjb2xvci1tYXRyaXgiLCBtYXRyaXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3A8QUJ1ZmZlcj4gaGRyTWV0YTsKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEJ1ZmZlcihLRVlfSERSX1NUQVRJQ19JTkZPLCAmaGRyTWV0YSkKKyAgICAgICAgICAgICAgICAmJiBoZHJNZXRhLT5zaXplKCkgPT0gc2l6ZW9mKEhEUlN0YXRpY0luZm8pKSB7CisgICAgICAgICAgICBIRFJTdGF0aWNJbmZvICptZXRhID0gKEhEUlN0YXRpY0luZm8qKWhkck1ldGEtPmRhdGEoKTsKKyAgICAgICAgICAgIGlmIChtZXRhLT5tSUQgPT0gbWV0YS0+a1R5cGUxKSB7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgic21wdGUyMDg2LnJlZC54IiwgbWV0YS0+c1R5cGUxLm1SLnggKiAwLjAwMDAyKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYucmVkLnkiLCBtZXRhLT5zVHlwZTEubVIueSAqIDAuMDAwMDIpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni5ncmVlbi54IiwgbWV0YS0+c1R5cGUxLm1HLnggKiAwLjAwMDAyKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYuZ3JlZW4ueSIsIG1ldGEtPnNUeXBlMS5tRy55ICogMC4wMDAwMik7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgic21wdGUyMDg2LmJsdWUueCIsIG1ldGEtPnNUeXBlMS5tQi54ICogMC4wMDAwMik7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgic21wdGUyMDg2LmJsdWUueSIsIG1ldGEtPnNUeXBlMS5tQi55ICogMC4wMDAwMik7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgic21wdGUyMDg2LndoaXRlLngiLCBtZXRhLT5zVHlwZTEubVcueCAqIDAuMDAwMDIpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni53aGl0ZS55IiwgbWV0YS0+c1R5cGUxLm1XLnkgKiAwLjAwMDAyKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYubWF4LWx1bWluYW5jZSIsIG1ldGEtPnNUeXBlMS5tTWF4RGlzcGxheUx1bWluYW5jZSk7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgic21wdGUyMDg2Lm1pbi1sdW1pbmFuY2UiLCBtZXRhLT5zVHlwZTEubU1pbkRpc3BsYXlMdW1pbmFuY2UgKiAwLjAwMDEpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoImN0YTg2MS5tYXgtY2xsIiwgbWV0YS0+c1R5cGUxLm1NYXhDb250ZW50TGlnaHRMZXZlbCk7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgiY3RhODYxLm1heC1mYWxsIiwgbWV0YS0+c1R5cGUxLm1NYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHRoaXMgaXMgdG8gdmVyaWZ5IHRoYXQgd2Ugc2V0IHByb3BlciBzaWduZWRuZXNzIGZvciBzdGFuZGFyZCBwYXJhbWV0ZXJzCisgICAgYm9vbCBiZVZlcnlTdHJpY3QgPSBwcm9wZXJ0eV9nZXRfYm9vbCgiZGVidWcuc3RhZ2VmcmlnaHQuY2NvZGVjX3N0cmljdF90eXBlIiwgZmFsc2UpOworICAgIC8vIHRoaXMgaXMgdG8gYWxsb3cgdmVuZG9ycyB0byB1c2UgdGhlIHdyb25nIHNpZ25lZG5lc3MgZm9yIHN0YW5kYXJkIHBhcmFtZXRlcnMKKyAgICBib29sIGJlVmVyeUxheCA9IHByb3BlcnR5X2dldF9ib29sKCJkZWJ1Zy5zdGFnZWZyaWdodC5jY29kZWNfbGF4X3R5cGUiLCBmYWxzZSk7CisKKyAgICBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3QgZmlsdGVyZWQ7CisgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IHBhcmFtcy0+Y291bnRFbnRyaWVzKCk7ICsraXgpIHsKKyAgICAgICAgQU1lc3NhZ2U6OlR5cGUgdHlwZTsKKyAgICAgICAgQVN0cmluZyBuYW1lID0gcGFyYW1zLT5nZXRFbnRyeU5hbWVBdChpeCwgJnR5cGUpOworICAgICAgICBBTWVzc2FnZTo6SXRlbURhdGEgbXNnSXRlbSA9IHBhcmFtcy0+Z2V0RW50cnlBdChpeCk7CisgICAgICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6VmFsdWUgaXRlbTsKKyAgICAgICAgY29udmVydChtc2dJdGVtLCAmaXRlbSk7IC8vIGNvbnZlcnQgaXRlbSB0byBwYXJhbSB1cGRhdGVyIGl0ZW0KKworICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCJ2ZW5kb3IuIikpIHsKKyAgICAgICAgICAgIC8vIHZlbmRvciBwYXJhbXMgcGFzcyB0aHJvdWdoIGFzIGlzCisgICAgICAgICAgICBmaWx0ZXJlZC5lbXBsYWNlKG5hbWUuY19zdHIoKSwgaXRlbSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBzdGFuZGFyZCBwYXJhbWV0ZXJzIG1heSBnZXQgbW9kaWZpZWQsIGZpbHRlcmVkIG9yIGR1cGxpY2F0ZWQKKyAgICAgICAgZm9yIChjb25zdCBDb25maWdNYXBwZXIgJmNtIDogbVN0YW5kYXJkUGFyYW1zLT5nZXRDb25maWdNYXBwZXJzRm9yU2RrS2V5KG5hbWUuY19zdHIoKSkpIHsKKyAgICAgICAgICAgIC8vIG5vdGU6IHdlIGlnbm9yZSBwb3J0IGRvbWFpbiBmb3IgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgaWYgKChjbS5kb21haW4oKSAmIGNvbmZpZ0RvbWFpbikKKyAgICAgICAgICAgICAgICAgICAgLy8gY29tcG9uZW50IGRvbWFpbiArIGtpbmQgKHRoZXNlIG11c3QgbWF0Y2gpCisgICAgICAgICAgICAgICAgICAgICYmIChjbS5kb21haW4oKSAmIG1Eb21haW4pID09IG1Eb21haW4pIHsKKyAgICAgICAgICAgICAgICAvLyBtYXAgYXJpdGhtZXRpYyB2YWx1ZXMsIHBhc3MgdGhyb3VnaCBzdHJpbmcgb3IgYnVmZmVyCisgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlQnVmZmVyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZVN0cmluZzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZUludDMyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZUludDY0OgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZUZsb2F0OgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZURvdWJsZToKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBub3cgb25seSBtYXAgc2V0dGluZ3Mgd2l0aCBtYXBwZXJzIGFzIHdlIGFyZSBub3QgY3JlYXRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpZ25lZCA8PT4gdW5zaWduZWQgbWFwcGVycworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogYmUgcHJlY2lzZSBhYm91dCBzaWduZWQgdW5zaWduZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiZVZlcnlTdHJpY3QgfHwgY20ubWFwcGVyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnNldChjbS5tYXBGcm9tTWVzc2FnZShwYXJhbXMtPmdldEVudHJ5QXQoaXgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxzbyBhbGxvdyB0byByZWxheCB0eXBlIHN0cmljdG5lc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmVWZXJ5TGF4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF4VmFsdWVzKGl0ZW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbHRlcmVkLmVtcGxhY2UoY20ucGF0aCgpLCBpdGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiZmlsdGVyZWQgJXMgdG8gJXMiLCBwYXJhbXMtPmRlYnVnU3RyaW5nKDQpLmNfc3RyKCksCisgICAgICAgICAgICBmaWx0ZXJlZC5kZWJ1Z1N0cmluZyg0KS5jX3N0cigpKTsKKyAgICByZXR1cm4gZmlsdGVyZWQ7Cit9CisKK3N0YXR1c190IENDb2RlY0NvbmZpZzo6Z2V0Q29uZmlnVXBkYXRlRnJvbVNka1BhcmFtcygKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmc2RrUGFyYW1zLCBEb21haW4gY29uZmlnRG9tYWluLAorICAgICAgICBjMl9ibG9ja2luZ190IGJsb2NraW5nLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICpjb25maWdVcGRhdGUpIGNvbnN0IHsKKyAgICBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3QgcGFyYW1zID0gZ2V0UmVmbGVjdGVkRm9ybWF0KHNka1BhcmFtcywgY29uZmlnRG9tYWluKTsKKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBpbmRpY2VzOworICAgIG1QYXJhbVVwZGF0ZXItPmdldFBhcmFtSW5kaWNlc0Zyb21NZXNzYWdlKHBhcmFtcywgJmluZGljZXMpOworICAgIGlmIChpbmRpY2VzLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0QoIm5vIHJlY29nbml6ZWQgcGFyYW1zIGluOiAlcyIsIHBhcmFtcy5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgY29uZmlnVXBkYXRlLT5jbGVhcigpOworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBzdXBwb3J0ZWRJbmRpY2VzOworICAgIGZvciAoQzJQYXJhbTo6SW5kZXggaXggOiBpbmRpY2VzKSB7CisgICAgICAgIGlmIChtU3VwcG9ydGVkSW5kaWNlcy5jb3VudChpeCkpIHsKKyAgICAgICAgICAgIHN1cHBvcnRlZEluZGljZXMucHVzaF9iYWNrKGl4KTsKKyAgICAgICAgfSBlbHNlIGlmIChtTG9jYWxQYXJhbXMuY291bnQoaXgpKSB7CisgICAgICAgICAgICAvLyBxdWVyeSBsb2NhbCBwYXJhbWV0ZXIgaGVyZQorICAgICAgICAgICAgYXV0byBpdCA9IG1DdXJyZW50Q29uZmlnLmZpbmQoaXgpOworICAgICAgICAgICAgaWYgKGl0ICE9IG1DdXJyZW50Q29uZmlnLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgY29uZmlnVXBkYXRlLT5lbXBsYWNlX2JhY2soQzJQYXJhbTo6Q29weSgqaXQtPnNlY29uZCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgZXJyID0gY29tcG9uZW50LT5xdWVyeSh7IH0sIHN1cHBvcnRlZEluZGljZXMsIGJsb2NraW5nLCBjb25maWdVcGRhdGUpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoInF1ZXJ5IGZhaWxlZCBhZnRlciByZXR1cm5pbmcgJXp1IHBhcmFtcyA9PiAlcyIsIGNvbmZpZ1VwZGF0ZS0+c2l6ZSgpLCBhc1N0cmluZyhlcnIpKTsKKyAgICB9CisKKyAgICBpZiAoY29uZmlnVXBkYXRlLT5zaXplKCkpIHsKKyAgICAgICAgbVBhcmFtVXBkYXRlci0+dXBkYXRlUGFyYW1zRnJvbU1lc3NhZ2UocGFyYW1zLCBjb25maWdVcGRhdGUpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENDb2RlY0NvbmZpZzo6c2V0UGFyYW1ldGVycygKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gJmNvbmZpZ1VwZGF0ZSwKKyAgICAgICAgYzJfYmxvY2tpbmdfdCBibG9ja2luZykgeworICAgIHN0YXR1c190IHJlc3VsdCA9IE9LOworICAgIGlmIChjb25maWdVcGRhdGUuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXM7CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSAqPiBwYXJhbVZlY3RvcjsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiAmcGFyYW0gOiBjb25maWdVcGRhdGUpIHsKKyAgICAgICAgaWYgKG1TdXBwb3J0ZWRJbmRpY2VzLmNvdW50KHBhcmFtLT5pbmRleCgpKSkgeworICAgICAgICAgICAgLy8gY29tcG9uZW50IHBhcmFtZXRlcgorICAgICAgICAgICAgcGFyYW1WZWN0b3IucHVzaF9iYWNrKHBhcmFtLmdldCgpKTsKKyAgICAgICAgICAgIGluZGljZXMucHVzaF9iYWNrKHBhcmFtLT5pbmRleCgpKTsKKyAgICAgICAgfSBlbHNlIGlmIChtTG9jYWxQYXJhbXMuY291bnQocGFyYW0tPmluZGV4KCkpKSB7CisgICAgICAgICAgICAvLyBoYW5kbGUgbG9jYWwgcGFyYW1ldGVyIGhlcmUKKyAgICAgICAgICAgIExvY2FsUGFyYW1WYWxpZGF0b3IgdmFsaWRhdG9yID0gbUxvY2FsUGFyYW1zLmZpbmQocGFyYW0tPmluZGV4KCkpLT5zZWNvbmQ7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBjb3B5ID0gQzJQYXJhbTo6Q29weSgqcGFyYW0pOworICAgICAgICAgICAgaWYgKHZhbGlkYXRvcikgeworICAgICAgICAgICAgICAgIGVyciA9IHZhbGlkYXRvcihjb3B5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HVigidXBkYXRlZCBsb2NhbCBwYXJhbWV0ZXIgdmFsdWUgZm9yICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJhbVVwZGF0ZXItPmdldFBhcmFtTmFtZShwYXJhbS0+aW5kZXgoKSkuY19zdHIoKSk7CisKKyAgICAgICAgICAgICAgICBtQ3VycmVudENvbmZpZ1twYXJhbS0+aW5kZXgoKV0gPSBzdGQ6Om1vdmUoY29weSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dEKCJmYWlsZWQgdG8gc2V0IHBhcmFtZXRlciB2YWx1ZSBmb3IgJXMgPT4gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmFtVXBkYXRlci0+Z2V0UGFyYW1OYW1lKHBhcmFtLT5pbmRleCgpKS5jX3N0cigpLCBhc1N0cmluZyhlcnIpKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gdXBkYXRlIHN1YnNjcmliZWQgcGFyYW0gaW5kaWNlcworICAgIHN1YnNjcmliZVRvQ29uZmlnVXBkYXRlKGNvbXBvbmVudCwgaW5kaWNlcywgYmxvY2tpbmcpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgIGMyX3N0YXR1c190IGVyciA9IGNvbXBvbmVudC0+Y29uZmlnKHBhcmFtVmVjdG9yLCBibG9ja2luZywgJmZhaWx1cmVzKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJjb25maWcgZmFpbGVkID0+ICVzIiwgYXNTdHJpbmcoZXJyKSk7CisgICAgICAgIC8vIFRoaXMgaXMgbm9uLWZhdGFsLgorICAgIH0KKyAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+ICZmYWlsdXJlIDogZmFpbHVyZXMpIHsKKyAgICAgICAgc3dpdGNoIChmYWlsdXJlLT5mYWlsdXJlKSB7CisgICAgICAgICAgICBjYXNlIEMyU2V0dGluZ1Jlc3VsdDo6QkFEX1ZBTFVFOgorICAgICAgICAgICAgICAgIEFMT0dEKCJCYWQgcGFyYW1ldGVyIHZhbHVlIik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HVigiZmFpbHVyZSA9ICVkIiwgaW50KGZhaWx1cmUtPmZhaWx1cmUpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJlLXF1ZXJ5IHBhcmFtZXRlciB2YWx1ZXMgaW4gY2FzZSBjb25maWcgY291bGQgbm90IHVwZGF0ZSB0aGVtIGFuZCB1cGRhdGUgdGhlIGN1cnJlbnQKKyAgICAvLyBjb25maWd1cmF0aW9uLgorICAgIGNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICAgIGVyciA9IGNvbXBvbmVudC0+cXVlcnkoe30sIGluZGljZXMsIGJsb2NraW5nLCAmY29uZmlnVXBkYXRlKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJxdWVyeSBmYWlsZWQgYWZ0ZXIgcmV0dXJuaW5nICV6dSBwYXJhbXMgPT4gJXMiLCBjb25maWdVcGRhdGUuc2l6ZSgpLCBhc1N0cmluZyhlcnIpKTsKKyAgICB9CisgICAgKHZvaWQpdXBkYXRlQ29uZmlndXJhdGlvbihjb25maWdVcGRhdGUsIEFMTCk7CisKKyAgICAvLyBUT0RPOiBlcnJvciB2YWx1ZQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2NvbnN0IEMyUGFyYW0gKkNDb2RlY0NvbmZpZzo6Z2V0Q29uZmlnUGFyYW1ldGVyVmFsdWUoQzJQYXJhbTo6SW5kZXggaW5kZXgpIGNvbnN0IHsKKyAgICBhdXRvIGl0ID0gbUN1cnJlbnRDb25maWcuZmluZChpbmRleCk7CisgICAgaWYgKGl0ID09IG1DdXJyZW50Q29uZmlnLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBpdC0+c2Vjb25kLmdldCgpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmFmZTNmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5oCkBAIC0wLDAgKzEsMzQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDX0NPREVDX0NPTkZJR19IXworI2RlZmluZSBDX0NPREVDX0NPTkZJR19IXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgIklucHV0U3VyZmFjZVdyYXBwZXIuaCIKKyNpbmNsdWRlICJSZWZsZWN0ZWRQYXJhbVVwZGF0ZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQU1lc3NhZ2U7CitzdHJ1Y3QgU3RhbmRhcmRQYXJhbXM7CisKKy8qKgorICogU3RydWN0IG1hbmFnaW5nIHRoZSBjb2RlYyBjb25maWd1cmF0aW9uIGZvciBDQ29kZWMuCisgKi8KK3N0cnVjdCBDQ29kZWNDb25maWcgeworCisgICAgLyoqCisgICAgICogRG9tYWluIGNvbnNpc3RzIG9mIGEgYml0bWFzayBkaXZpZGVkIGludG8gZmllbGRzLCBhbmQgc3BlY2lmaWVycyB3b3JrIGJ5IGV4Y2x1ZGluZyBvdGhlcgorICAgICAqIHZhbHVlcyBpbiB0aG9zZSBkb21haW5zLgorICAgICAqCisgICAgICogQ29tcG9uZW50IGRvbWFpbnMgYXJlIGNvbXBvc2VkIGJ5IG9yLWluZyB0aGUgaW5kaXZpZHVhbCBJU18gY29uc3RhbnRzLCBlLmcuCisgICAgICogSVNfREVDT0RFUiB8IElTX0FVRElPLgorICAgICAqCisgICAgICogQ29uZmlnIHNwZWNpZmllcnMgYXJlIGNvbXBvc2VkIGJ5IG9yLWluZyB0aGUgaW5kaXZpZHVhbCBtYXNrIGNvbnN0YW50cywgYW5kCisgICAgICogYW5kLWluZyB0aGVzZSBncm91cHM6IGUuZy4gKERFQ09ERVIgfCBFTkNPREVSKSAmIEFVRElPLgorICAgICAqCisgICAgICogVGhlIG5hbWluZyBvZiB0aGVzZSBjb25zdGFudHMgd2FzIHRvIGxpbWl0IHRoZSBsZW5ndGggb2YgbWFzayBuYW1lcyBhcyB0aGVzZSBhcmUgdXNlZCBtb3JlCisgICAgICogY29tbW9ubHkgYXMgbWFza3MuCisgICAgICovCisgICAgZW51bSBEb21haW4gOiB1aW50MzJfdCB7CisgICAgICAgIC8vIGNvbXBvbmVudCBkb21haW4gKGRvbWFpbiAmIGtpbmQpCisgICAgICAgIEdVQVJEX0JJVCAgID0gKDEgPDwgMSksICAgLy8vPCB0aGlzIGlzIHRvIHByZXZlbnQgYWdhaW5zdCBhY2NpZGVudGFsICYmIG9yIHx8IHVzYWdlCisgICAgICAgIElTX0FVRElPICAgID0gKDEgPDwgMiksICAgLy8vPCBmb3IgYXVkaW8gY29kZWNzCisgICAgICAgIElTX1ZJREVPICAgID0gKDEgPDwgMyksICAgLy8vPCBmb3IgdmlkZW8gY29kZWNzCisgICAgICAgIElTX0lNQUdFICAgID0gKDEgPDwgNCksICAgLy8vPCBmb3IgaW1hZ2UgY29kZWNzCisgICAgICAgIE9USEVSX0RPTUFJTiA9ICgxIDw8IDUpLCAgLy8vPCBmb3Igb3RoZXIgZG9tYWlucworCisgICAgICAgIElTX0VOQ09ERVIgID0gKDEgPDwgNiksICAgLy8vPCBmb3IgZW5jb2RlcnMKKyAgICAgICAgSVNfREVDT0RFUiAgPSAoMSA8PCA3KSwgICAvLy88IGZvciBkZWNvZGVycworICAgICAgICBPVEhFUl9LSU5EICA9ICgxIDw8IDgpLCAgIC8vLzwgZm9yIG90aGVyIGRvbWFpbnMKKworICAgICAgICAvLyBjb25maWcgZG9tYWluCisgICAgICAgIElTX1BBUkFNICAgID0gKDEgPDwgOSksICAgLy8vPCBmb3Igc2V0UGFyYW1ldGVyCisgICAgICAgIElTX0NPTkZJRyAgID0gKDEgPDwgMTApLCAgLy8vPCBmb3IgY29uZmlndXJlCisgICAgICAgIElTX1JFQUQgICAgID0gKDEgPDwgMTEpLCAgLy8vPCBmb3IgZ2V0Rm9ybWF0CisKKyAgICAgICAgLy8gcG9ydCBkb21haW4KKyAgICAgICAgSVNfSU5QVVQgICAgPSAoMSA8PCAxMiksICAvLy88IGZvciBpbnB1dCBwb3J0IChnZXRGb3JtYXQpCisgICAgICAgIElTX09VVFBVVCAgID0gKDEgPDwgMTMpLCAgLy8vPCBmb3Igb3V0cHV0IHBvcnQgKGdldEZvcm1hdCkKKyAgICAgICAgSVNfUkFXICAgICAgPSAoMSA8PCAxNCksICAvLy88IGZvciByYXcgcG9ydCAoaW5wdXQtZW5jb2Rlciwgb3V0cHV0LWRlY29kZXIpCisgICAgICAgIElTX0NPREVEICAgID0gKDEgPDwgMTUpLCAgLy8vPCBmb3IgY29kZWQgcG9ydCAoaW5wdXQtZGVjb2Rlciwgb3V0cHV0LWVuY29kZXIpCisKKyAgICAgICAgQUxMICAgICA9IH4wVSwKKyAgICAgICAgTk9ORSAgICA9IDAsCisKKyAgICAgICAgQVVESU8gICA9IH4oSVNfSU1BR0UgfCBJU19WSURFTyB8IE9USEVSX0RPTUFJTiksCisgICAgICAgIFZJREVPICAgPSB+KElTX0FVRElPIHwgSVNfSU1BR0UgfCBPVEhFUl9ET01BSU4pLAorICAgICAgICBJTUFHRSAgID0gfihJU19BVURJTyB8IElTX1ZJREVPIHwgT1RIRVJfRE9NQUlOKSwKKworICAgICAgICBERUNPREVSID0gfihJU19FTkNPREVSIHwgT1RIRVJfS0lORCksCisgICAgICAgIEVOQ09ERVIgPSB+KElTX0RFQ09ERVIgfCBPVEhFUl9LSU5EKSwKKworICAgICAgICBQQVJBTSAgID0gfihJU19DT05GSUcgfCBJU19SRUFEKSwKKyAgICAgICAgQ09ORklHICA9IH4oSVNfUEFSQU0gIHwgSVNfUkVBRCksCisgICAgICAgIFJFQUQgICAgPSB+KElTX0NPTkZJRyB8IElTX1BBUkFNKSwKKworICAgICAgICBJTlBVVCAgID0gfihJU19PVVRQVVQgfCBJU19SQVcgICAgfCBJU19DT0RFRCksCisgICAgICAgIE9VVFBVVCAgPSB+KElTX0lOUFVUICB8IElTX1JBVyAgICB8IElTX0NPREVEKSwKKyAgICAgICAgUkFXICAgICA9IH4oSVNfSU5QVVQgIHwgSVNfT1VUUFVUIHwgSVNfQ09ERUQpLAorICAgICAgICBDT0RFRCAgID0gfihJU19JTlBVVCAgfCBJU19SQVcgICAgfCBJU19PVVRQVVQpLAorICAgIH07CisKKyAgICAvLyB0aGluZ3MgcmVxdWlyZWQgdG8gbWFuYWdlIGZvcm1hdHMKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiBtUGFyYW1EZXNjczsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gbVJlZmxlY3RvcjsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI+IG1QYXJhbVVwZGF0ZXI7CisKKyAgICBEb21haW4gbURvbWFpbjsgLy8gY29tcG9uZW50IGRvbWFpbgorICAgIERvbWFpbiBtSW5wdXREb21haW47IC8vIGlucHV0IHBvcnQgZG9tYWluCisgICAgRG9tYWluIG1PdXRwdXREb21haW47IC8vIG91dHB1dCBwb3J0IGRvbWFpbgorICAgIHN0ZDo6c3RyaW5nIG1Db2RpbmdNZWRpYVR5cGU7ICAvLyBtZWRpYSB0eXBlIG9mIHRoZSBjb2RlZCBzdHJlYW0KKworICAgIC8vIHN0YW5kYXJkIE1lZGlhQ29kZWMgdG8gQ29kZWMgMi4wIHBhcmFtcyBtYXBwaW5nCisgICAgc3RkOjpzaGFyZWRfcHRyPFN0YW5kYXJkUGFyYW1zPiBtU3RhbmRhcmRQYXJhbXM7CisKKyAgICBzdGQ6OnNldDxDMlBhcmFtOjpJbmRleD4gbVN1cHBvcnRlZEluZGljZXM7IC8vLzwgaW5kaWNlcyBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBvbmVudAorICAgIHN0ZDo6c2V0PEMyUGFyYW06OkluZGV4PiBtU3Vic2NyaWJlZEluZGljZXM7IC8vLzwgaW5kaWNlcyB0byBzdWJzY3JpYmUgdG8KKyAgICBzaXplX3QgbVN1YnNjcmliZWRJbmRpY2VzU2l6ZTsgLy8vPCBjb3VudCBvZiBjdXJyZW50bHkgc3Vic2NyaWJlZCBpbmRpY2VzCisKKyAgICBzcDxBTWVzc2FnZT4gbUlucHV0Rm9ybWF0OworICAgIHNwPEFNZXNzYWdlPiBtT3V0cHV0Rm9ybWF0OworCisgICAgYm9vbCBtVXNpbmdTdXJmYWNlOyAvLy88IHVzaW5nIGlucHV0IG9yIG91dHB1dCBzdXJmYWNlCisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlV3JhcHBlcj4gbUlucHV0U3VyZmFjZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRTdXJmYWNlV3JhcHBlcjo6Q29uZmlnPiBtSVNDb25maWc7CisKKyAgICAvLy8gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4gVXBkYXRlZCBhZnRlciBjb25maWd1cmUoKSBhbmQgYmFzZWQgb24gY29uZmlnVXBkYXRlIGluCisgICAgLy8vIG9uV29ya0RvbmUKKyAgICBzdGQ6Om1hcDxDMlBhcmFtOjpJbmRleCwgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBtQ3VycmVudENvbmZpZzsKKworICAgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdChzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4mKT4gTG9jYWxQYXJhbVZhbGlkYXRvcjsKKworICAgIC8vLyBQYXJhbWV0ZXIgaW5kaWNlcyB0cmFja2VkIGluIGN1cnJlbnQgY29uZmlnIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBvbmVudC4KKyAgICAvLy8gdGhlc2UgYXJlIHByb3ZpZGVkIHNvIHRoYXQgb3B0aW9uYWwgcGFyYW1ldGVycyBjYW4gcmVtYWluIGluIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisgICAgLy8vIGFzIHN1Y2gsIHRoZXNlIHBhcmFtZXRlcnMgaGF2ZSBubyBkZXBlbmRlbmNpZXMuIFRPRE86IHVzZSBDMkludGVyZmFjZUhlbHBlciBmb3IgdGhpcy4KKyAgICAvLy8gRm9yIG5vdyBzdXBwb3J0IGEgdmFsaWRhdGlvbiBmdW5jdGlvbi4KKyAgICBzdGQ6Om1hcDxDMlBhcmFtOjpJbmRleCwgTG9jYWxQYXJhbVZhbGlkYXRvcj4gbUxvY2FsUGFyYW1zOworCisgICAgQ0NvZGVjQ29uZmlnKCk7CisKKyAgICAvLy8gaW5pdGlhbGl6ZXMgdGhlIG1lbWJlcnMgcmVxdWlyZWQgdG8gbWFuYWdlIHRoZSBmb3JtYXQ6IGRlc2NyaXB0b3JzLCByZWZsZWN0b3IsCisgICAgLy8vIHJlZmxlY3RlZCBwYXJhbSBoZWxwZXIsIGRvbWFpbiwgc3RhbmRhcmQgcGFyYW1zLCBhbmQgc3Vic2NyaWJlcyB0byBzdGFuZGFyZAorICAgIC8vLyBpbmRpY2VzLgorICAgIHN0YXR1c190IGluaXRpYWxpemUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiAmY2xpZW50LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50KTsKKworCisgICAgLyoqCisgICAgICogQWRkcyBhIGxvY2FsbHkgbWFpbnRhaW5lZCBwYXJhbWV0ZXIuIFRoaXMgaXMgdXNlZCBmb3Igb3V0cHV0IGNvbmZpZ3VyYXRpb24gdGhhdCBjYW4gYmUKKyAgICAgKiBhcHBlbmRlZCB0byB0aGUgb3V0cHV0IGJ1ZmZlcnMgaW4gY2FzZSBpdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjb21wb25lbnQuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBib29sIGFkZExvY2FsUGFyYW0oCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwKKyAgICAgICAgICAgIEMyUGFyYW1EZXNjcmlwdG9yOjphdHRyaWJfdCBhdHRyaWIgPSBDMlBhcmFtRGVzY3JpcHRvcjo6SVNfUkVBRF9PTkxZLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdChzdGQ6OnVuaXF1ZV9wdHI8VD4mKT4gdmFsaWRhdG9yXyA9CisgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdChzdGQ6OnVuaXF1ZV9wdHI8VD4mKT4oKSkgeworICAgICAgICBDMlBhcmFtOjpJbmRleCBpbmRleCA9IFQ6OlBBUkFNX1RZUEU7CisgICAgICAgIGlmIChtU3VwcG9ydGVkSW5kaWNlcy5jb3VudChpbmRleCkgfHwgbUxvY2FsUGFyYW1zLmNvdW50KGluZGV4KSkgeworICAgICAgICAgICAgaWYgKG1TdXBwb3J0ZWRJbmRpY2VzLmNvdW50KGluZGV4KSkgeworICAgICAgICAgICAgICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5lbXBsYWNlKGluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dEKCJpZ25vcmluZyBsb2NhbCBwYXJhbSAlcyAoJSN4KSBhcyBpdCBpcyBhbHJlYWR5ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLCAodWludDMyX3QpaW5kZXgsIG1TdXBwb3J0ZWRJbmRpY2VzLmNvdW50KGluZGV4KSA/ICJzdXBwb3J0ZWQiIDogImxvY2FsIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGFscmVhZHkgc3VwcG9ydGVkIGJ5IHRoZSBjb21wb25lbnQgb3IgYWxyZWFkeSBhZGRlZAorICAgICAgICB9CisKKyAgICAgICAgLy8gd3JhcCB0eXBlZCB2YWxpZGF0b3IgaW50byB1bnR5cGVkIHZhbGlkYXRvcgorICAgICAgICBMb2NhbFBhcmFtVmFsaWRhdG9yIHZhbGlkYXRvcjsKKyAgICAgICAgaWYgKHZhbGlkYXRvcl8pIHsKKyAgICAgICAgICAgIHZhbGlkYXRvciA9IFt2YWxpZGF0b3JfXShzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4mIHApeworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IHJlcyA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gdHlwZWQoc3RhdGljX2Nhc3Q8VCo+KHAucmVsZWFzZSgpKSk7CisgICAgICAgICAgICAgICAgLy8gaWYgcGFyYW1ldGVyIGlzIGNvcnJlY3RseSB0eXBlZAorICAgICAgICAgICAgICAgIGlmIChUOjpGcm9tKHR5cGVkLmdldCgpKSkgeworICAgICAgICAgICAgICAgICAgICByZXMgPSB2YWxpZGF0b3JfKHR5cGVkKTsKKyAgICAgICAgICAgICAgICAgICAgcC5yZXNldCh0eXBlZC5yZWxlYXNlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIG1Mb2NhbFBhcmFtcy5lbXBsYWNlKGluZGV4LCB2YWxpZGF0b3IpOworICAgICAgICBtUGFyYW1VcGRhdGVyLT5hZGRTdGFuZGFyZFBhcmFtPFQ+KG5hbWUsIGF0dHJpYik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBsb2NhbGx5IG1haW50YWluZWQgcGFyYW1ldGVyIHdpdGggYSBkZWZhdWx0IHZhbHVlLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgYm9vbCBhZGRMb2NhbFBhcmFtKAorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFQ+IGRlZmF1bHRfLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsCisgICAgICAgICAgICBDMlBhcmFtRGVzY3JpcHRvcjo6YXR0cmliX3QgYXR0cmliID0gQzJQYXJhbURlc2NyaXB0b3I6OklTX1JFQURfT05MWSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248YzJfc3RhdHVzX3Qoc3RkOjp1bmlxdWVfcHRyPFQ+Jik+IHZhbGlkYXRvcl8gPQorICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248YzJfc3RhdHVzX3Qoc3RkOjp1bmlxdWVfcHRyPFQ+Jik+KCkpIHsKKyAgICAgICAgaWYgKGFkZExvY2FsUGFyYW08VD4obmFtZSwgYXR0cmliLCB2YWxpZGF0b3JfKSkgeworICAgICAgICAgICAgaWYgKHZhbGlkYXRvcl8pIHsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSB2YWxpZGF0b3JfKGRlZmF1bHRfKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJkZWZhdWx0IHZhbHVlIGZvciAlcyBpcyBpbnZhbGlkID0+ICVzIiwgbmFtZS5jX3N0cigpLCBhc1N0cmluZyhlcnIpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DdXJyZW50Q29uZmlnW1Q6OlBBUkFNX1RZUEVdID0gc3RkOjptb3ZlKGRlZmF1bHRfKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGJvb2wgYWRkTG9jYWxQYXJhbSgKKyAgICAgICAgICAgIFQgKmRlZmF1bHRfLCBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwKKyAgICAgICAgICAgIEMyUGFyYW1EZXNjcmlwdG9yOjphdHRyaWJfdCBhdHRyaWIgPSBDMlBhcmFtRGVzY3JpcHRvcjo6SVNfUkVBRF9PTkxZLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdChzdGQ6OnVuaXF1ZV9wdHI8VD4mKT4gdmFsaWRhdG9yXyA9CisgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdChzdGQ6OnVuaXF1ZV9wdHI8VD4mKT4oKSkgeworICAgICAgICByZXR1cm4gYWRkTG9jYWxQYXJhbShzdGQ6OnVuaXF1ZV9wdHI8VD4oZGVmYXVsdF8pLCBuYW1lLCBhdHRyaWIsIHZhbGlkYXRvcl8pOworICAgIH0KKworICAgIC8vLyBBcHBsaWVzIGNvbmZpZ3VyYXRpb24gdXBkYXRlcywgYW5kIHVwZGF0ZXMgZm9ybWF0IGluIHRoZSBzcGVjaWZpYyBkb21haW4uCisgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiBmb3JtYXRzIHdlcmUgdXBkYXRlZAorICAgIC8vLyBccGFyYW0gZG9tYWluIGlucHV0L291dHB1dCBiaXRtYXNrCisgICAgYm9vbCB1cGRhdGVDb25maWd1cmF0aW9uKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAmY29uZmlnVXBkYXRlLCBEb21haW4gZG9tYWluKTsKKworICAgIC8vLyBVcGRhdGVzIGZvcm1hdHMgaW4gdGhlIHNwZWNpZmljIGRvbWFpbi4gUmV0dXJucyB0cnVlIGlmIGFueSBvZiB0aGUgZm9ybWF0cyBoYXZlIGNoYW5nZWQuCisgICAgLy8vIFxwYXJhbSBkb21haW4gaW5wdXQvb3V0cHV0IGJpdG1hc2sKKyAgICBib29sIHVwZGF0ZUZvcm1hdHMoRG9tYWluIGRvbWFpbik7CisKKyAgICAvKioKKyAgICAgKiBBcHBsaWVzIFNESyBjb25maWd1cmF0aW9ucyBpbiBhIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZG9tYWluLgorICAgICAqIFVwZGF0ZXMgcmVsZXZhbnQgaW5wdXQvb3V0cHV0IGZvcm1hdHMgYW5kIHN1YnNjcmliZXMgdG8gcGFyYW1ldGVycyBzcGVjaWZpZWQgaW4gdGhlCisgICAgICogY29uZmlndXJhdGlvbi4KKyAgICAgKiBccGFyYW0gZG9tYWluIGNvbmZpZy9zZXRQYXJhbSBiaXRtYXNrCisgICAgICogXHBhcmFtIGJsb2NraW5nIGJsb2NraW5nIG1vZGUgdG8gdXNlIHdpdGggdGhlIGNvbXBvbmVudAorICAgICAqLworICAgIHN0YXR1c190IGdldENvbmZpZ1VwZGF0ZUZyb21TZGtQYXJhbXMoCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmc2RrUGFyYW1zLCBEb21haW4gZG9tYWluLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBibG9ja2luZywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gKmNvbmZpZ1VwZGF0ZSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBBcHBsaWVzIGEgY29uZmlndXJhdGlvbiB1cGRhdGUgdG8gdGhlIGNvbXBvbmVudC4KKyAgICAgKiBVcGRhdGVzIHJlbGV2YW50IGlucHV0L291dHB1dCBmb3JtYXRzIGFuZCBzdWJzY3JpYmVzIHRvIHBhcmFtZXRlcnMgc3BlY2lmaWVkIGluIHRoZQorICAgICAqIGNvbmZpZ3VyYXRpb24uCisgICAgICogXHBhcmFtIGJsb2NraW5nIGJsb2NraW5nIG1vZGUgdG8gdXNlIHdpdGggdGhlIGNvbXBvbmVudAorICAgICAqLworICAgIHN0YXR1c190IHNldFBhcmFtZXRlcnMoCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gJmNvbmZpZ1VwZGF0ZSwKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgYmxvY2tpbmcpOworCisgICAgLy8vIFF1ZXJpZXMgc3Vic2NyaWJlZCBpbmRpY2VzICh3aGljaCBjb250YWlucyBhbGwgU0RLLWV4cG9zZWQgdmFsdWVzKSBhbmQgdXBkYXRlcworICAgIC8vLyBpbnB1dC9vdXRwdXQgZm9ybWF0cy4KKyAgICBzdGF0dXNfdCBxdWVyeUNvbmZpZ3VyYXRpb24oCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wb25lbnQpOworCisgICAgLy8vIFF1ZXJpZXMgYSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciB2YWx1ZS4gUmV0dXJucyBudWxscHRyIGlmIHRoZSBwYXJhbWV0ZXIgaXMgbm90CisgICAgLy8vIHBhcnQgb2YgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbgorICAgIGNvbnN0IEMyUGFyYW0gKmdldENvbmZpZ1BhcmFtZXRlclZhbHVlKEMyUGFyYW06OkluZGV4IGluZGV4KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIE9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGFjY2VzcyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYW5kIGlmIHRoZXkgY2hhbmdlLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IFdhdGNoZXIgeworICAgICAgICB+V2F0Y2hlcigpID0gZGVmYXVsdDsKKworICAgICAgICAvLy8gcmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZSBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gaGFzIGNoYW5nZWQKKyAgICAgICAgYm9vbCBoYXNDaGFuZ2VkKCkgY29uc3QgeworICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAqdmFsdWUgPSBtUGFyZW50LT5nZXRDb25maWdQYXJhbWV0ZXJWYWx1ZShtSW5kZXgpOworICAgICAgICAgICAgaWYgKHZhbHVlICYmIG1WYWx1ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiAqdmFsdWUgIT0gKm1WYWx1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlICE9IG1WYWx1ZS5nZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyB1cGRhdGVzIHRoZSBjdXJyZW50IHZhbHVlIGFuZCByZXR1cm5zIGl0CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUPiB1cGRhdGUoKSB7CisgICAgICAgICAgICBjb25zdCBDMlBhcmFtICp2YWx1ZSA9IG1QYXJlbnQtPmdldENvbmZpZ1BhcmFtZXRlclZhbHVlKG1JbmRleCk7CisgICAgICAgICAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgICAgICAgICBtVmFsdWUgPSBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVD4oVDo6RnJvbShDMlBhcmFtOjpDb3B5KCp2YWx1ZSkucmVsZWFzZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbVZhbHVlOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBXYXRjaGVyKEMyUGFyYW06OkluZGV4IGluZGV4LCBjb25zdCBDQ29kZWNDb25maWcgKnBhcmVudCkKKyAgICAgICAgICAgIDogbVBhcmVudChwYXJlbnQpLCBtSW5kZXgoaW5kZXgpIHsKKyAgICAgICAgICAgIHVwZGF0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBDQ29kZWNDb25maWc7CisKKyAgICAgICAgY29uc3QgQ0NvZGVjQ29uZmlnICptUGFyZW50OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVD4gbVZhbHVlOworICAgICAgICBDMlBhcmFtOjpJbmRleCBtSW5kZXg7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB3YXRjaGVyIG9iamVjdCBmb3IgYSBwYXJhbWV0ZXIuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBXYXRjaGVyPFQ+IHdhdGNoKEMyUGFyYW06OkluZGV4IGluZGV4ID0gVDo6UEFSQU1fVFlQRSkgY29uc3QgeworICAgICAgICBpZiAoaW5kZXgudHlwZSgpICE9IFQ6OlBBUkFNX1RZUEUpIHsKKyAgICAgICAgICAgIF9fYnVpbHRpbl90cmFwKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFdhdGNoZXI8VD4oaW5kZXgsIHRoaXMpOworICAgIH0KKworcHJpdmF0ZToKKworICAgIC8vLyBpbml0aWFsaXplcyB0aGUgc3RhbmRhcmQgTWVkaWFDb2RlYyB0byBDb2RlYyAyLjAgcGFyYW1zIG1hcHBpbmcKKyAgICB2b2lkIGluaXRpYWxpemVTdGFuZGFyZFBhcmFtcygpOworCisgICAgLy8vIEFkZHMgaW5kaWNlcyB0byB0aGUgc3Vic2NyaWJlZCBpbmRpY2VzLCBhbmQgdXBkYXRlZCBzdWJzY3JpcHRpb24gdG8gY29tcG9uZW50CisgICAgLy8vIFxwYXJhbSBibG9ja2luZyBibG9ja2luZyBtb2RlIHRvIHVzZSB3aXRoIHRoZSBjb21wb25lbnQKKyAgICBzdGF0dXNfdCBzdWJzY3JpYmVUb0NvbmZpZ1VwZGF0ZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgYmxvY2tpbmcgPSBDMl9ET05UX0JMT0NLKTsKKworICAgIC8vLyBHZXRzIFNESyBmb3JtYXQgZnJvbSBjb2RlYyAyLjAgcmVmbGVjdGVkIGNvbmZpZ3VyYXRpb24KKyAgICAvLy8gXHBhcmFtIGRvbWFpbiBpbnB1dC9vdXRwdXQgYml0bWFzaworICAgIHNwPEFNZXNzYWdlPiBnZXRTZGtGb3JtYXRGb3JEb21haW4oCisgICAgICAgICAgICBjb25zdCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3QgJnJlZmxlY3RlZCwgRG9tYWluIGRvbWFpbikgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyBhIHNldCBvZiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgaW4gYW4gQU1lc3NhZ2UgdG8gYSBsaXN0IG9mIHBhdGgtYmFzZWQgQ29kZWMKKyAgICAgKiAyLjAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogXHBhcmFtIGRvbWFpbiBjb25maWcvc2V0UGFyYW0gYml0bWFzaworICAgICAqLworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCBnZXRSZWZsZWN0ZWRGb3JtYXQoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmNvbmZpZywgRG9tYWluIGRvbWFpbikgY29uc3Q7Cit9OworCitERUZJTkVfRU5VTV9PUEVSQVRPUlMoQ0NvZGVjQ29uZmlnOjpEb21haW4pCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ19DT0RFQ19IXworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMyQnVmZmVyLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJCdWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMTNhZTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMyQnVmZmVyLmNwcApAQCAtMCwwICsxLDgxMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2RlYzJCdWZmZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxoaWRsbWVtb3J5L0ZyYW1ld29ya1V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bmF0aXZlYmFzZS9uYXRpdmViYXNlLmg+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisKKyNpbmNsdWRlICJDb2RlYzJCdWZmZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBDb2RlYzJCdWZmZXIKKworYm9vbCBDb2RlYzJCdWZmZXI6OmNhbkNvcHlMaW5lYXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdCB7CisgICAgaWYgKGNvbnN0X2Nhc3Q8Q29kZWMyQnVmZmVyICo+KHRoaXMpLT5iYXNlKCkgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghYnVmZmVyKSB7CisgICAgICAgIC8vIE5vdGhpbmcgdG8gY29weSwgc28gd2UgY2FuIGNvcHkgYnkgZG9pbmcgbm90aGluZy4KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChidWZmZXItPmRhdGEoKS50eXBlKCkgIT0gQzJCdWZmZXJEYXRhOjpMSU5FQVIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoYnVmZmVyLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuc2l6ZSgpID09IDB1KSB7CisgICAgICAgIC8vIE5vdGhpbmcgdG8gY29weSwgc28gd2UgY2FuIGNvcHkgYnkgZG9pbmcgbm90aGluZy4KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChidWZmZXItPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5zaXplKCkgPiAxdSkgeworICAgICAgICAvLyBXZSBkb24ndCBrbm93IGhvdyB0byBjb3B5IG1vcmUgdGhhbiBvbmUgYmxvY2tzLgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChidWZmZXItPmRhdGEoKS5saW5lYXJCbG9ja3MoKVswXS5zaXplKCkgPiBjYXBhY2l0eSgpKSB7CisgICAgICAgIC8vIEl0IHdvbid0IGZpdC4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb2RlYzJCdWZmZXI6OmNvcHlMaW5lYXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgLy8gV2UgYXNzdW1lIHRoYXQgYWxsIGNhbkNvcHlMaW5lYXIoKSBjaGVja3MgcGFzc2VkLgorICAgIGlmICghYnVmZmVyIHx8IGJ1ZmZlci0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLnNpemUoKSA9PSAwdQorICAgICAgICAgICAgfHwgYnVmZmVyLT5kYXRhKCkubGluZWFyQmxvY2tzKClbMF0uc2l6ZSgpID09IDB1KSB7CisgICAgICAgIHNldFJhbmdlKDAsIDApOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgQzJSZWFkVmlldyB2aWV3ID0gYnVmZmVyLT5kYXRhKCkubGluZWFyQmxvY2tzKClbMF0ubWFwKCkuZ2V0KCk7CisgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgiRXJyb3Igd2hpbGUgbWFwcGluZzogJWQiLCB2aWV3LmVycm9yKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICh2aWV3LmNhcGFjaXR5KCkgPiBjYXBhY2l0eSgpKSB7CisgICAgICAgIEFMT0dEKCJDMkNvbnN0TGluZWFyQmxvY2sgbGllZCAtLS0gaXQgYWN0dWFsbHkgZG9lc24ndCBmaXQ6IHZpZXcoJXUpID4gdGhpcyglenUpIiwKKyAgICAgICAgICAgICAgICB2aWV3LmNhcGFjaXR5KCksIGNhcGFjaXR5KCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1lbWNweShiYXNlKCksIHZpZXcuZGF0YSgpLCB2aWV3LmNhcGFjaXR5KCkpOworICAgIHNldFJhbmdlKDAsIHZpZXcuY2FwYWNpdHkoKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ29kZWMyQnVmZmVyOjpzZXRJbWFnZURhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmltYWdlRGF0YSkgeworICAgIG1ldGEoKS0+c2V0QnVmZmVyKCJpbWFnZS1kYXRhIiwgaW1hZ2VEYXRhKTsKKyAgICBmb3JtYXQoKS0+c2V0QnVmZmVyKCJpbWFnZS1kYXRhIiwgaW1hZ2VEYXRhKTsKKyAgICBNZWRpYUltYWdlMiAqaW1nID0gKE1lZGlhSW1hZ2UyKilpbWFnZURhdGEtPmRhdGEoKTsKKyAgICBpZiAoaW1nLT5tTnVtUGxhbmVzID4gMCAmJiBpbWctPm1UeXBlICE9IGltZy0+TUVESUFfSU1BR0VfVFlQRV9VTktOT1dOKSB7CisgICAgICAgIGludDMyX3Qgc3RyaWRlID0gaW1nLT5tUGxhbmVbMF0ubVJvd0luYzsKKyAgICAgICAgZm9ybWF0KCktPnNldEludDMyKEtFWV9TVFJJREUsIHN0cmlkZSk7CisgICAgICAgIGlmIChpbWctPm1OdW1QbGFuZXMgPiAxICYmIHN0cmlkZSA+IDApIHsKKyAgICAgICAgICAgIGludDMyX3QgdnN0cmlkZSA9IChpbWctPm1QbGFuZVsxXS5tT2Zmc2V0IC0gaW1nLT5tUGxhbmVbMF0ubU9mZnNldCkgLyBzdHJpZGU7CisgICAgICAgICAgICBmb3JtYXQoKS0+c2V0SW50MzIoS0VZX1NMSUNFX0hFSUdIVCwgdnN0cmlkZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIExvY2FsTGluZWFyQnVmZmVyCisKK2Jvb2wgTG9jYWxMaW5lYXJCdWZmZXI6OmNhbkNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdCB7CisgICAgcmV0dXJuIGNhbkNvcHlMaW5lYXIoYnVmZmVyKTsKK30KKworYm9vbCBMb2NhbExpbmVhckJ1ZmZlcjo6Y29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIHsKKyAgICByZXR1cm4gY29weUxpbmVhcihidWZmZXIpOworfQorCisvLyBEdW1teUNvbnRhaW5lckJ1ZmZlcgorCitzdGF0aWMgdWludDhfdCBzRHVtbXlCeXRlWzFdID0geyAwIH07CisKK0R1bW15Q29udGFpbmVyQnVmZmVyOjpEdW1teUNvbnRhaW5lckJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikKKyAgICA6IENvZGVjMkJ1ZmZlcihmb3JtYXQsIG5ldyBBQnVmZmVyKHNEdW1teUJ5dGUsIDEpKSwKKyAgICAgIG1CdWZmZXJSZWYoYnVmZmVyKSB7CisgICAgc2V0UmFuZ2UoMCwgYnVmZmVyID8gMSA6IDApOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IER1bW15Q29udGFpbmVyQnVmZmVyOjphc0MyQnVmZmVyKCkgeworICAgIHJldHVybiBzdGQ6Om1vdmUobUJ1ZmZlclJlZik7Cit9CisKK2Jvb2wgRHVtbXlDb250YWluZXJCdWZmZXI6OmNhbkNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmKSBjb25zdCB7CisgICAgcmV0dXJuICFtQnVmZmVyUmVmOworfQorCitib29sIER1bW15Q29udGFpbmVyQnVmZmVyOjpjb3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIG1CdWZmZXJSZWYgPSBidWZmZXI7CisgICAgc2V0UmFuZ2UoMCwgbUJ1ZmZlclJlZiA/IDEgOiAwKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gTGluZWFyQmxvY2tCdWZmZXIKKworLy8gc3RhdGljCitzcDxMaW5lYXJCbG9ja0J1ZmZlcj4gTGluZWFyQmxvY2tCdWZmZXI6OkFsbG9jYXRlKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jaykgeworICAgIEMyV3JpdGVWaWV3IHdyaXRlVmlldyhibG9jay0+bWFwKCkuZ2V0KCkpOworICAgIGlmICh3cml0ZVZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBMaW5lYXJCbG9ja0J1ZmZlcihmb3JtYXQsIHN0ZDo6bW92ZSh3cml0ZVZpZXcpLCBibG9jayk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gTGluZWFyQmxvY2tCdWZmZXI6OmFzQzJCdWZmZXIoKSB7CisgICAgcmV0dXJuIEMyQnVmZmVyOjpDcmVhdGVMaW5lYXJCdWZmZXIobUJsb2NrLT5zaGFyZShvZmZzZXQoKSwgc2l6ZSgpLCBDMkZlbmNlKCkpKTsKK30KKworYm9vbCBMaW5lYXJCbG9ja0J1ZmZlcjo6Y2FuQ29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FuQ29weUxpbmVhcihidWZmZXIpOworfQorCitib29sIExpbmVhckJsb2NrQnVmZmVyOjpjb3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIHJldHVybiBjb3B5TGluZWFyKGJ1ZmZlcik7Cit9CisKK0xpbmVhckJsb2NrQnVmZmVyOjpMaW5lYXJCbG9ja0J1ZmZlcigKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgIEMyV3JpdGVWaWV3JiYgd3JpdGVWaWV3LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrKQorICAgIDogQ29kZWMyQnVmZmVyKGZvcm1hdCwgbmV3IEFCdWZmZXIod3JpdGVWaWV3LmRhdGEoKSwgd3JpdGVWaWV3LnNpemUoKSkpLAorICAgICAgbVdyaXRlVmlldyh3cml0ZVZpZXcpLAorICAgICAgbUJsb2NrKGJsb2NrKSB7Cit9CisKKy8vIENvbnN0TGluZWFyQmxvY2tCdWZmZXIKKworLy8gc3RhdGljCitzcDxDb25zdExpbmVhckJsb2NrQnVmZmVyPiBDb25zdExpbmVhckJsb2NrQnVmZmVyOjpBbGxvY2F0ZSgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIGlmICghYnVmZmVyCisgICAgICAgICAgICB8fCBidWZmZXItPmRhdGEoKS50eXBlKCkgIT0gQzJCdWZmZXJEYXRhOjpMSU5FQVIKKyAgICAgICAgICAgIHx8IGJ1ZmZlci0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLnNpemUoKSAhPSAxdSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgQzJSZWFkVmlldyByZWFkVmlldyhidWZmZXItPmRhdGEoKS5saW5lYXJCbG9ja3MoKVswXS5tYXAoKS5nZXQoKSk7CisgICAgaWYgKHJlYWRWaWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBuZXcgQ29uc3RMaW5lYXJCbG9ja0J1ZmZlcihmb3JtYXQsIHN0ZDo6bW92ZShyZWFkVmlldyksIGJ1ZmZlcik7Cit9CisKK0NvbnN0TGluZWFyQmxvY2tCdWZmZXI6OkNvbnN0TGluZWFyQmxvY2tCdWZmZXIoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICBDMlJlYWRWaWV3JiYgcmVhZFZpZXcsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikKKyAgICA6IENvZGVjMkJ1ZmZlcihmb3JtYXQsIG5ldyBBQnVmZmVyKAorICAgICAgICAgICAgLy8gTk9URTogQUJ1ZmZlciBvbmx5IHRha2VzIG5vbi1jb25zdCBwb2ludGVyIGJ1dCB0aGlzIGRhdGEgaXMKKyAgICAgICAgICAgIC8vICAgICAgIHN1cHBvc2VkIHRvIGJlIHJlYWQtb25seS4KKyAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dWludDhfdCAqPihyZWFkVmlldy5kYXRhKCkpLCByZWFkVmlldy5jYXBhY2l0eSgpKSksCisgICAgICBtUmVhZFZpZXcocmVhZFZpZXcpLAorICAgICAgbUJ1ZmZlclJlZihidWZmZXIpIHsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBDb25zdExpbmVhckJsb2NrQnVmZmVyOjphc0MyQnVmZmVyKCkgeworICAgIHJldHVybiBzdGQ6Om1vdmUobUJ1ZmZlclJlZik7Cit9CisKKy8vIEdyYXBoaWNWaWV3Mk1lZGlhSW1hZ2VDb252ZXJ0ZXIKKworbmFtZXNwYWNlIHsKKworY2xhc3MgR3JhcGhpY1ZpZXcyTWVkaWFJbWFnZUNvbnZlcnRlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIEMyR3JhcGhpY1ZpZXcgPD0+IE1lZGlhSW1hZ2UgY29udmVydGVyCisgICAgICoKKyAgICAgKiBccGFyYW0gdmlldyBDMkdyYXBoaWNWaWV3IG9iamVjdAorICAgICAqIFxwYXJhbSBjb2xvckZvcm1hdCBkZXNpcmVkIFNESyBjb2xvciBmb3JtYXQgZm9yIHRoZSBNZWRpYUltYWdlIChpZiB0aGlzIGlzIGEgZmxleGlibGUgZm9ybWF0LAorICAgICAqICAgICAgICBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gc2ltcGx5IHJlcHJlc2VudCB0aGUgZ3JhcGhpYyB2aWV3IGFzIGEgZmxleGlibGUgU0RLIGZvcm1hdAorICAgICAqICAgICAgICB3aXRob3V0IGEgbWVtY3B5KQorICAgICAqLworICAgIEdyYXBoaWNWaWV3Mk1lZGlhSW1hZ2VDb252ZXJ0ZXIoCisgICAgICAgICAgICBjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3LCBpbnQzMl90IGNvbG9yRm9ybWF0KQorICAgICAgICA6IG1Jbml0Q2hlY2soTk9fSU5JVCksCisgICAgICAgICAgbVZpZXcodmlldyksCisgICAgICAgICAgbVdpZHRoKHZpZXcud2lkdGgoKSksCisgICAgICAgICAgbUhlaWdodCh2aWV3LmhlaWdodCgpKSwKKyAgICAgICAgICBtQ29sb3JGb3JtYXQoY29sb3JGb3JtYXQpLAorICAgICAgICAgIG1BbGxvY2F0ZWREZXB0aCgwKSwKKyAgICAgICAgICBtQmFja0J1ZmZlclNpemUoMCksCisgICAgICAgICAgbU1lZGlhSW1hZ2UobmV3IEFCdWZmZXIoc2l6ZW9mKE1lZGlhSW1hZ2UyKSkpIHsKKyAgICAgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0QoIkNvbnZlcnRlcjogdmlldy5lcnJvcigpID0gJWQiLCB2aWV3LmVycm9yKCkpOworICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBNZWRpYUltYWdlMiAqbWVkaWFJbWFnZSA9IChNZWRpYUltYWdlMiAqKW1NZWRpYUltYWdlLT5iYXNlKCk7CisgICAgICAgIGNvbnN0IEMyUGxhbmFyTGF5b3V0ICZsYXlvdXQgPSB2aWV3LmxheW91dCgpOworICAgICAgICBpZiAobGF5b3V0Lm51bVBsYW5lcyA9PSAwKSB7CisgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiAwIHBsYW5lcyIpOworICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtQWxsb2NhdGVkRGVwdGggPSBsYXlvdXQucGxhbmVzWzBdLmFsbG9jYXRlZERlcHRoOworICAgICAgICB1aW50MzJfdCBiaXREZXB0aCA9IGxheW91dC5wbGFuZXNbMF0uYml0RGVwdGg7CisKKyAgICAgICAgLy8gYWxpZ24gd2lkdGggYW5kIGhlaWdodCB0byBzdXBwb3J0IHN1YnNhbXBsaW5nIGNsZWFubHkKKyAgICAgICAgdWludDMyX3QgbVN0cmlkZSA9IGFsaWduKG1XaWR0aCwgMikgKiBkaXZVcChsYXlvdXQucGxhbmVzWzBdLmFsbG9jYXRlZERlcHRoLCA4dSk7CisgICAgICAgIHVpbnQzMl90IG1WU3RyaWRlID0gYWxpZ24obUhlaWdodCwgMik7CisKKyAgICAgICAgc3dpdGNoIChsYXlvdXQudHlwZSkgeworICAgICAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVY6CisgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVR5cGUgPSBNZWRpYUltYWdlMjo6TUVESUFfSU1BR0VfVFlQRV9ZVVY7CisgICAgICAgICAgICAgICAgaWYgKGxheW91dC5udW1QbGFuZXMgIT0gMykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiAlZCBwbGFuZXMgZm9yIFlVViBsYXlvdXQiLCBsYXlvdXQubnVtUGxhbmVzKTsKKyAgICAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobGF5b3V0LnBsYW5lc1swXS5jaGFubmVsICE9IEMyUGxhbmVJbmZvOjpDSEFOTkVMX1kKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxheW91dC5wbGFuZXNbMV0uY2hhbm5lbCAhPSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DQgorICAgICAgICAgICAgICAgICAgICAgICAgfHwgbGF5b3V0LnBsYW5lc1syXS5jaGFubmVsICE9IEMyUGxhbmVJbmZvOjpDSEFOTkVMX0NSCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBsYXlvdXQucGxhbmVzWzBdLmNvbFNhbXBsaW5nICE9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxheW91dC5wbGFuZXNbMF0ucm93U2FtcGxpbmcgIT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgbGF5b3V0LnBsYW5lc1sxXS5jb2xTYW1wbGluZyAhPSAyCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBsYXlvdXQucGxhbmVzWzFdLnJvd1NhbXBsaW5nICE9IDIKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxheW91dC5wbGFuZXNbMl0uY29sU2FtcGxpbmcgIT0gMgorICAgICAgICAgICAgICAgICAgICAgICAgfHwgbGF5b3V0LnBsYW5lc1syXS5yb3dTYW1wbGluZyAhPSAyKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXI6IG5vdCBZVVY0MjAgZm9yIFlVViBsYXlvdXQiKTsKKyAgICAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1Db2xvckZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOgorICAgICAgICAgICAgICAgICAgICB7ICAvLyB0cnkgdG8gbWFwIGRpcmVjdGx5LiBjaGVjayBpZiB0aGUgcGxhbmVzIGFyZSBuZWFyIG9uZSBhbm90aGVyCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICptaW5QdHIgPSBtVmlldy5kYXRhKClbMF07CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICptYXhQdHIgPSBtVmlldy5kYXRhKClbMF07CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBsYW5lU2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbGF5b3V0Lm51bVBsYW5lczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQbGFuZUluZm8gJnBsYW5lID0gbGF5b3V0LnBsYW5lc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IG1pbk9mZnNldCA9IHBsYW5lLm1pbk9mZnNldChtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgbWF4T2Zmc2V0ID0gcGxhbmUubWF4T2Zmc2V0KG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pblB0ciA+IG1WaWV3LmRhdGEoKVtpXSArIG1pbk9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5QdHIgPSBtVmlldy5kYXRhKClbaV0gKyBtaW5PZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXhQdHIgPCBtVmlldy5kYXRhKClbaV0gKyBtYXhPZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UHRyID0gbVZpZXcuZGF0YSgpW2ldICsgbWF4T2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZVNpemUgKz0gc3RkOjphYnMocGxhbmUucm93SW5jKSAqIGFsaWduKG1IZWlnaHQsIDY0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBwbGFuZS5yb3dTYW1wbGluZyAvIHBsYW5lLmNvbFNhbXBsaW5nICogZGl2VXAobUFsbG9jYXRlZERlcHRoLCA4dSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobWF4UHRyIC0gbWluUHRyICsgMSkgPD0gcGxhbmVTaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IHRoaXMgaXMgcmlza3kgYXMgcmVhZGluZy93cml0aW5nIGRhdGEgb3V0IG9mIGJvdW5kIHJlc3VsdHMgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgYW4gdW5kZWZpbmVkIGJlaGF2aW9yLCBidXQgZ3JhbGxvYyBkb2VzIGFzc3VtZSBhIGNvbnRpZ3VvdXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgbWFwcGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBsYXlvdXQubnVtUGxhbmVzOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQbGFuZUluZm8gJnBsYW5lID0gbGF5b3V0LnBsYW5lc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW2ldLm1PZmZzZXQgPSBtVmlldy5kYXRhKClbaV0gLSBtaW5QdHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVtpXS5tQ29sSW5jID0gcGxhbmUuY29sSW5jOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbaV0ubVJvd0luYyA9IHBsYW5lLnJvd0luYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW2ldLm1Ib3JpelN1YnNhbXBsaW5nID0gcGxhbmUuY29sU2FtcGxpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVtpXS5tVmVydFN1YnNhbXBsaW5nID0gcGxhbmUucm93U2FtcGxpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XcmFwcGVkID0gbmV3IEFCdWZmZXIoY29uc3RfY2FzdDx1aW50OF90ICo+KG1pblB0ciksIG1heFB0ciAtIG1pblB0ciArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubU9mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubUNvbEluYyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubVJvd0luYyA9IG1TdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubUhvcml6U3Vic2FtcGxpbmcgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1WZXJ0U3Vic2FtcGxpbmcgPSAxOworCisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubU9mZnNldCA9IG1TdHJpZGUgKiBtVlN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tQ29sSW5jID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tUm93SW5jID0gbVN0cmlkZSAvIDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubUhvcml6U3Vic2FtcGxpbmcgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1WZXJ0U3Vic2FtcGxpbmcgPSAyOworCisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubU9mZnNldCA9IG1TdHJpZGUgKiBtVlN0cmlkZSAqIDUgLyA0OworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1Db2xJbmMgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1Sb3dJbmMgPSBtU3RyaWRlIC8gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tSG9yaXpTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubVZlcnRTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5ZXS5tT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5ZXS5tQ29sSW5jID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5ZXS5tUm93SW5jID0gbVN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5ZXS5tSG9yaXpTdWJzYW1wbGluZyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubVZlcnRTdWJzYW1wbGluZyA9IDE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tT2Zmc2V0ID0gbVN0cmlkZSAqIG1WU3RyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1Db2xJbmMgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1Sb3dJbmMgPSBtU3RyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1Ib3JpelN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tVmVydFN1YnNhbXBsaW5nID0gMjsKKworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1PZmZzZXQgPSBtU3RyaWRlICogbVZTdHJpZGUgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1Db2xJbmMgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1Sb3dJbmMgPSBtU3RyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1Ib3JpelN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tVmVydFN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiBpbmNvbXBhY3RpYmxlIGNvbG9yIGZvcm1hdCAoJWQpIGZvciBZVVYgbGF5b3V0IiwgbUNvbG9yRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVZBOgorICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1UeXBlID0gTWVkaWFJbWFnZTI6Ok1FRElBX0lNQUdFX1RZUEVfWVVWQTsKKyAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBoYXZlIGFuIFNESyBZVVZBIGZvcm1hdAorICAgICAgICAgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXI6IGluY29tcGFjdGlibGUgY29sb3IgZm9ybWF0ICglZCkgZm9yIFlVVkEgbGF5b3V0IiwgbUNvbG9yRm9ybWF0KTsKKyAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCOgorICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1UeXBlID0gTWVkaWFJbWFnZTI6Ok1FRElBX0lNQUdFX1RZUEVfUkdCOworICAgICAgICAgICAgICAgIHN3aXRjaCAobUNvbG9yRm9ybWF0KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gbWVkaWEgaW1hZ2UKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRSR0JGbGV4aWJsZToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQyNGJpdEJHUjg4ODoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQyNGJpdFJHQjg4ODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkNvbnZlcnRlcjogaW5jb21wYWN0aWJsZSBjb2xvciBmb3JtYXQgKCVkKSBmb3IgUkdCIGxheW91dCIsIG1Db2xvckZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobGF5b3V0Lm51bVBsYW5lcyAhPSAzKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXI6ICVkIHBsYW5lcyBmb3IgUkdCIGxheW91dCIsIGxheW91dC5udW1QbGFuZXMpOworICAgICAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9SR0JBOgorICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1UeXBlID0gTWVkaWFJbWFnZTI6Ok1FRElBX0lNQUdFX1RZUEVfUkdCQTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1Db2xvckZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIG1lZGlhIGltYWdlCisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0UkdCQUZsZXhpYmxlOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDMyYml0QUJHUjg4ODg6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MzJiaXRBUkdCODg4ODoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4OgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiSW5jb21wYWN0aWJsZSBjb2xvciBmb3JtYXQgKCVkKSBmb3IgUkdCQSBsYXlvdXQiLCBtQ29sb3JGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxheW91dC5udW1QbGFuZXMgIT0gNCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiAlZCBwbGFuZXMgZm9yIFJHQkEgbGF5b3V0IiwgbGF5b3V0Lm51bVBsYW5lcyk7CisgICAgICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1UeXBlID0gTWVkaWFJbWFnZTI6Ok1FRElBX0lNQUdFX1RZUEVfVU5LTk9XTjsKKyAgICAgICAgICAgICAgICBBTE9HRCgiVW5rbm93biBsYXlvdXQiKTsKKyAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtZWRpYUltYWdlLT5tTnVtUGxhbmVzID0gbGF5b3V0Lm51bVBsYW5lczsKKyAgICAgICAgbWVkaWFJbWFnZS0+bVdpZHRoID0gbVdpZHRoOworICAgICAgICBtZWRpYUltYWdlLT5tSGVpZ2h0ID0gbUhlaWdodDsKKyAgICAgICAgbWVkaWFJbWFnZS0+bUJpdERlcHRoID0gYml0RGVwdGg7CisgICAgICAgIG1lZGlhSW1hZ2UtPm1CaXREZXB0aEFsbG9jYXRlZCA9IG1BbGxvY2F0ZWREZXB0aDsKKworICAgICAgICB1aW50MzJfdCBidWZmZXJTaXplID0gMDsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGxheW91dC5udW1QbGFuZXM7ICsraSkgeworICAgICAgICAgICAgY29uc3QgQzJQbGFuZUluZm8gJnBsYW5lID0gbGF5b3V0LnBsYW5lc1tpXTsKKyAgICAgICAgICAgIGlmIChwbGFuZS5hbGxvY2F0ZWREZXB0aCA8IHBsYW5lLmJpdERlcHRoCisgICAgICAgICAgICAgICAgICAgIHx8IHBsYW5lLnJpZ2h0U2hpZnQgIT0gcGxhbmUuYWxsb2NhdGVkRGVwdGggLSBwbGFuZS5iaXREZXB0aCkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJyaWdodFNoaWZ0IHZhbHVlIG9mICV1IHVuc3VwcG9ydGVkIiwgcGxhbmUucmlnaHRTaGlmdCk7CisgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGxhbmUuYWxsb2NhdGVkRGVwdGggPiA4ICYmIHBsYW5lLmVuZGlhbm5lc3MgIT0gQzJQbGFuZUluZm86Ok5BVElWRSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJlbmRpYW5uZXNzIHZhbHVlIG9mICV1IHVuc3VwcG9ydGVkIiwgcGxhbmUuZW5kaWFubmVzcyk7CisgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGxhbmUuYWxsb2NhdGVkRGVwdGggIT0gbUFsbG9jYXRlZERlcHRoIHx8IHBsYW5lLmJpdERlcHRoICE9IGJpdERlcHRoKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImRpZmZlcmVudCBhbGxvY2F0ZWREZXB0aC9iaXREZXB0aCBwZXIgcGxhbmUgdW5zdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZmZlclNpemUgKz0gbVN0cmlkZSAqIG1WU3RyaWRlCisgICAgICAgICAgICAgICAgICAgIC8gcGxhbmUucm93U2FtcGxpbmcgLyBwbGFuZS5jb2xTYW1wbGluZzsKKyAgICAgICAgfQorCisgICAgICAgIG1CYWNrQnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemU7CisgICAgICAgIG1Jbml0Q2hlY2sgPSBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdCB7IHJldHVybiBtSW5pdENoZWNrOyB9CisKKyAgICB1aW50MzJfdCBiYWNrQnVmZmVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1CYWNrQnVmZmVyU2l6ZTsgfQorCisgICAgLyoqCisgICAgICogV3JhcCBDMkdyYXBoaWNWaWV3IHVzaW5nIGEgTWVkaWFJbWFnZTIuIE5vdGUgdGhhdCBpZiBub3Qgd3JhcHBlZCwgdGhlIGNvbnRlbnQgaXMgbm90IG1hcHBlZAorICAgICAqIGluIHRoaXMgZnVuY3Rpb24gLS0tIHRoZSBjYWxsZXIgc2hvdWxkIHVzZSBDb3B5R3JhcGhpY1ZpZXcyTWVkaWFJbWFnZSgpIGZ1bmN0aW9uIHRvIGNvcHkgdGhlCisgICAgICogZGF0YSBpbnRvIGEgYmFja2luZyBidWZmZXIgZXhwbGljaXRseS4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gbWVkaWEgYnVmZmVyLiBUaGlzIGlzIG51bGwgaWYgd3JhcHBpbmcgZmFpbGVkLgorICAgICAqLworICAgIHNwPEFCdWZmZXI+IHdyYXAoKSBjb25zdCB7CisgICAgICAgIGlmIChtQmFja0J1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbVdyYXBwZWQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgYm9vbCBzZXRCYWNrQnVmZmVyKGNvbnN0IHNwPEFCdWZmZXI+ICZiYWNrQnVmZmVyKSB7CisgICAgICAgIGlmIChiYWNrQnVmZmVyLT5jYXBhY2l0eSgpIDwgbUJhY2tCdWZmZXJTaXplKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgYmFja0J1ZmZlci0+c2V0UmFuZ2UoMCwgbUJhY2tCdWZmZXJTaXplKTsKKyAgICAgICAgbUJhY2tCdWZmZXIgPSBiYWNrQnVmZmVyOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3B5IEMyR3JhcGhpY1ZpZXcgdG8gTWVkaWFJbWFnZTIuCisgICAgICovCisgICAgc3RhdHVzX3QgY29weVRvTWVkaWFJbWFnZSgpIHsKKyAgICAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBJbWFnZUNvcHkobUJhY2tCdWZmZXItPmJhc2UoKSwgZ2V0TWVkaWFJbWFnZSgpLCBtVmlldyk7CisgICAgfQorCisgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmltYWdlRGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1NZWRpYUltYWdlOyB9CisKK3ByaXZhdGU6CisgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKKworICAgIGNvbnN0IEMyR3JhcGhpY1ZpZXcgbVZpZXc7CisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7CisgICAgaW50MzJfdCBtQ29sb3JGb3JtYXQ7ICAvLy88IFNESyBjb2xvciBmb3JtYXQgZm9yIE1lZGlhSW1hZ2UKKyAgICBzcDxBQnVmZmVyPiBtV3JhcHBlZDsgIC8vLzwgd3JhcHBlZCBidWZmZXIgKGlmIHdlIGNhbiBtYXAgQzJCdWZmZXIgdG8gYW4gQUJ1ZmZlcikKKyAgICB1aW50MzJfdCBtQWxsb2NhdGVkRGVwdGg7CisgICAgdWludDMyX3QgbUJhY2tCdWZmZXJTaXplOworICAgIHNwPEFCdWZmZXI+IG1NZWRpYUltYWdlOworICAgIHN0ZDo6ZnVuY3Rpb248c3A8QUJ1ZmZlcj4oc2l6ZV90KT4gbUFsbG9jOworCisgICAgc3A8QUJ1ZmZlcj4gbUJhY2tCdWZmZXI7ICAgIC8vLzwgYmFja2luZyBidWZmZXIgaWYgd2UgaGF2ZSB0byBjb3B5IEMyQnVmZmVyIDw9PiBBQnVmZmVyCisKKyAgICBNZWRpYUltYWdlMiAqZ2V0TWVkaWFJbWFnZSgpIHsKKyAgICAgICAgcmV0dXJuIChNZWRpYUltYWdlMiAqKW1NZWRpYUltYWdlLT5iYXNlKCk7CisgICAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIEdyYXBoaWNCbG9ja0J1ZmZlcgorCisvLyBzdGF0aWMKK3NwPEdyYXBoaWNCbG9ja0J1ZmZlcj4gR3JhcGhpY0Jsb2NrQnVmZmVyOjpBbGxvY2F0ZSgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPEFCdWZmZXI+KHNpemVfdCk+IGFsbG9jKSB7CisgICAgQzJHcmFwaGljVmlldyB2aWV3KGJsb2NrLT5tYXAoKS5nZXQoKSk7CisgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgiQzJHcmFwaGljQmxvY2s6Om1hcCBmYWlsZWQ6ICVkIiwgdmlldy5lcnJvcigpKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgaW50MzJfdCBjb2xvckZvcm1hdCA9IENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOworICAgICh2b2lkKWZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmY29sb3JGb3JtYXQpOworCisgICAgR3JhcGhpY1ZpZXcyTWVkaWFJbWFnZUNvbnZlcnRlciBjb252ZXJ0ZXIodmlldywgY29sb3JGb3JtYXQpOworICAgIGlmIChjb252ZXJ0ZXIuaW5pdENoZWNrKCkgIT0gT0spIHsKKyAgICAgICAgQUxPR0QoIkNvbnZlcnRlciBpbml0IGZhaWxlZDogJWQiLCBjb252ZXJ0ZXIuaW5pdENoZWNrKCkpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgYm9vbCB3cmFwcGVkID0gdHJ1ZTsKKyAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBjb252ZXJ0ZXIud3JhcCgpOworICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICBidWZmZXIgPSBhbGxvYyhjb252ZXJ0ZXIuYmFja0J1ZmZlclNpemUoKSk7CisgICAgICAgIGlmICghY29udmVydGVyLnNldEJhY2tCdWZmZXIoYnVmZmVyKSkgeworICAgICAgICAgICAgQUxPR0QoIkNvbnZlcnRlciBmYWlsZWQgdG8gc2V0IGJhY2sgYnVmZmVyIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICB3cmFwcGVkID0gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBuZXcgR3JhcGhpY0Jsb2NrQnVmZmVyKAorICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgYnVmZmVyLAorICAgICAgICAgICAgc3RkOjptb3ZlKHZpZXcpLAorICAgICAgICAgICAgYmxvY2ssCisgICAgICAgICAgICBjb252ZXJ0ZXIuaW1hZ2VEYXRhKCksCisgICAgICAgICAgICB3cmFwcGVkKTsKK30KKworR3JhcGhpY0Jsb2NrQnVmZmVyOjpHcmFwaGljQmxvY2tCdWZmZXIoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICBDMkdyYXBoaWNWaWV3ICYmdmlldywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2ssCisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZpbWFnZURhdGEsCisgICAgICAgIGJvb2wgd3JhcHBlZCkKKyAgICA6IENvZGVjMkJ1ZmZlcihmb3JtYXQsIGJ1ZmZlciksCisgICAgICBtVmlldyh2aWV3KSwKKyAgICAgIG1CbG9jayhibG9jayksCisgICAgICBtSW1hZ2VEYXRhKGltYWdlRGF0YSksCisgICAgICBtV3JhcHBlZCh3cmFwcGVkKSB7CisgICAgc2V0SW1hZ2VEYXRhKGltYWdlRGF0YSk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gR3JhcGhpY0Jsb2NrQnVmZmVyOjphc0MyQnVmZmVyKCkgeworICAgIHVpbnQzMl90IHdpZHRoID0gbVZpZXcud2lkdGgoKTsKKyAgICB1aW50MzJfdCBoZWlnaHQgPSBtVmlldy5oZWlnaHQoKTsKKyAgICBpZiAoIW1XcmFwcGVkKSB7CisgICAgICAgICh2b2lkKUltYWdlQ29weShtVmlldywgYmFzZSgpLCBpbWFnZURhdGEoKSk7CisgICAgfQorICAgIHJldHVybiBDMkJ1ZmZlcjo6Q3JlYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgIG1CbG9jay0+c2hhcmUoQzJSZWN0KHdpZHRoLCBoZWlnaHQpLCBDMkZlbmNlKCkpKTsKK30KKworLy8gR3JhcGhpY01ldGFkYXRhQnVmZmVyCitHcmFwaGljTWV0YWRhdGFCdWZmZXI6OkdyYXBoaWNNZXRhZGF0YUJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jKQorICAgIDogQ29kZWMyQnVmZmVyKGZvcm1hdCwgbmV3IEFCdWZmZXIoc2l6ZW9mKFZpZGVvTmF0aXZlTWV0YWRhdGEpKSksCisgICAgICBtQWxsb2MoYWxsb2MpIHsKKyAgICAoKFZpZGVvTmF0aXZlTWV0YWRhdGEgKiliYXNlKCkpLT5wQnVmZmVyID0gbnVsbHB0cjsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBHcmFwaGljTWV0YWRhdGFCdWZmZXI6OmFzQzJCdWZmZXIoKSB7CisjaWZuZGVmIF9fTFA2NF9fCisgICAgVmlkZW9OYXRpdmVNZXRhZGF0YSAqbWV0YSA9IChWaWRlb05hdGl2ZU1ldGFkYXRhICopYmFzZSgpOworICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIgKmJ1ZmZlciA9IChBTmF0aXZlV2luZG93QnVmZmVyICopbWV0YS0+cEJ1ZmZlcjsKKyAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoIlZpZGVvTmF0aXZlTWV0YWRhdGEgY29udGFpbnMgbnVsbCBidWZmZXIiKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgQUxPR1YoIlZpZGVvTmF0aXZlTWV0YWRhdGE6ICVkeCVkIiwgYnVmZmVyLT53aWR0aCwgYnVmZmVyLT5oZWlnaHQpOworICAgIEMySGFuZGxlICpoYW5kbGUgPSBXcmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZSgKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvbmUoYnVmZmVyLT5oYW5kbGUpLAorICAgICAgICAgICAgYnVmZmVyLT53aWR0aCwKKyAgICAgICAgICAgIGJ1ZmZlci0+aGVpZ2h0LAorICAgICAgICAgICAgYnVmZmVyLT5mb3JtYXQsCisgICAgICAgICAgICBidWZmZXItPnVzYWdlLAorICAgICAgICAgICAgYnVmZmVyLT5zdHJpZGUpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQWxsb2MtPnByaW9yR3JhcGhpY0FsbG9jYXRpb24oaGFuZGxlLCAmYWxsb2MpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoIkZhaWxlZCB0byB3cmFwIFZpZGVvTmF0aXZlTWV0YWRhdGEgaW50byBDMkdyYXBoaWNBbGxvY2F0aW9uIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soYWxsb2MpOworCisgICAgbWV0YS0+cEJ1ZmZlciA9IDA7CisgICAgLy8gVE9ETzogZmVuY2UKKyAgICByZXR1cm4gQzJCdWZmZXI6OkNyZWF0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICBibG9jay0+c2hhcmUoQzJSZWN0KGJ1ZmZlci0+d2lkdGgsIGJ1ZmZlci0+aGVpZ2h0KSwgQzJGZW5jZSgpKSk7CisjZWxzZQorICAgIEFMT0dFKCJHcmFwaGljTWV0YWRhdGFCdWZmZXIgZG9lcyBub3Qgd29yayBvbiA2NC1iaXQgYXJjaCIpOworICAgIHJldHVybiBudWxscHRyOworI2VuZGlmCit9CisKKy8vIENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyCisKKy8vIHN0YXRpYworc3A8Q29uc3RHcmFwaGljQmxvY2tCdWZmZXI+IENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpBbGxvY2F0ZSgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxBQnVmZmVyPihzaXplX3QpPiBhbGxvYykgeworICAgIGlmICghYnVmZmVyCisgICAgICAgICAgICB8fCBidWZmZXItPmRhdGEoKS50eXBlKCkgIT0gQzJCdWZmZXJEYXRhOjpHUkFQSElDCisgICAgICAgICAgICB8fCBidWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuc2l6ZSgpICE9IDF1KSB7CisgICAgICAgIEFMT0dEKCJDMkJ1ZmZlciBwcmVjb25kIGZhaWwiKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMkdyYXBoaWNWaWV3PiB2aWV3KHN0ZDo6bWFrZV91bmlxdWU8Y29uc3QgQzJHcmFwaGljVmlldz4oCisgICAgICAgICAgICBidWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKClbMF0ubWFwKCkuZ2V0KCkpKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJHcmFwaGljVmlldz4gaG9sZGVyOworCisgICAgaW50MzJfdCBjb2xvckZvcm1hdCA9IENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOworICAgICh2b2lkKWZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmY29sb3JGb3JtYXQpOworCisgICAgR3JhcGhpY1ZpZXcyTWVkaWFJbWFnZUNvbnZlcnRlciBjb252ZXJ0ZXIoKnZpZXcsIGNvbG9yRm9ybWF0KTsKKyAgICBpZiAoY29udmVydGVyLmluaXRDaGVjaygpICE9IE9LKSB7CisgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXIgaW5pdCBmYWlsZWQ6ICVkIiwgY29udmVydGVyLmluaXRDaGVjaygpKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGJvb2wgd3JhcHBlZCA9IHRydWU7CisgICAgc3A8QUJ1ZmZlcj4gYUJ1ZmZlciA9IGNvbnZlcnRlci53cmFwKCk7CisgICAgaWYgKGFCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICBhQnVmZmVyID0gYWxsb2MoY29udmVydGVyLmJhY2tCdWZmZXJTaXplKCkpOworICAgICAgICBpZiAoIWNvbnZlcnRlci5zZXRCYWNrQnVmZmVyKGFCdWZmZXIpKSB7CisgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyIGZhaWxlZCB0byBzZXQgYmFjayBidWZmZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHdyYXBwZWQgPSBmYWxzZTsKKyAgICAgICAgY29udmVydGVyLmNvcHlUb01lZGlhSW1hZ2UoKTsKKyAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0aGUgdmlldy4KKyAgICAgICAgaG9sZGVyID0gc3RkOjptb3ZlKHZpZXcpOworICAgIH0KKyAgICByZXR1cm4gbmV3IENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyKAorICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgYUJ1ZmZlciwKKyAgICAgICAgICAgIHN0ZDo6bW92ZSh2aWV3KSwKKyAgICAgICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgIGNvbnZlcnRlci5pbWFnZURhdGEoKSwKKyAgICAgICAgICAgIHdyYXBwZWQpOworfQorCisvLyBzdGF0aWMKK3NwPENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyPiBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGVFbXB0eSgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3A8QUJ1ZmZlcj4oc2l6ZV90KT4gYWxsb2MpIHsKKyAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgaWYgKCFmb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpCisgICAgICAgICAgICB8fCAhZm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKSB7CisgICAgICAgIEFMT0dEKCJmb3JtYXQgaGFkIG5vIHdpZHRoIC8gaGVpZ2h0Iik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBzcDxBQnVmZmVyPiBhQnVmZmVyKGFsbG9jKHdpZHRoICogaGVpZ2h0ICogNCkpOworICAgIHJldHVybiBuZXcgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIoCisgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICBhQnVmZmVyLAorICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgZmFsc2UpOworfQorCitDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6Q29uc3RHcmFwaGljQmxvY2tCdWZmZXIoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYUJ1ZmZlciwKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyR3JhcGhpY1ZpZXc+ICYmdmlldywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmaW1hZ2VEYXRhLAorICAgICAgICBib29sIHdyYXBwZWQpCisgICAgOiBDb2RlYzJCdWZmZXIoZm9ybWF0LCBhQnVmZmVyKSwKKyAgICAgIG1WaWV3KHN0ZDo6bW92ZSh2aWV3KSksCisgICAgICBtQnVmZmVyUmVmKGJ1ZmZlciksCisgICAgICBtV3JhcHBlZCh3cmFwcGVkKSB7CisgICAgaWYgKGltYWdlRGF0YSAhPSBudWxscHRyKSB7CisgICAgICAgIHNldEltYWdlRGF0YShpbWFnZURhdGEpOworICAgIH0KK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6YXNDMkJ1ZmZlcigpIHsKKyAgICBtVmlldy5yZXNldCgpOworICAgIHJldHVybiBzdGQ6Om1vdmUobUJ1ZmZlclJlZik7Cit9CisKK2Jvb2wgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNhbkNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdCB7CisgICAgaWYgKG1XcmFwcGVkIHx8IG1CdWZmZXJSZWYpIHsKKyAgICAgICAgQUxPR0QoIkNvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpjYW5Db3B5OiAlc3dyYXBwZWQgOyBidWZmZXIgcmVmICVzIiwKKyAgICAgICAgICAgICAgICBtV3JhcHBlZCA/ICIiIDogIm5vdCAiLCBtQnVmZmVyUmVmID8gImV4aXN0cyIgOiAiZG9lc24ndCBleGlzdCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghYnVmZmVyKSB7CisgICAgICAgIC8vIE5vdGhpbmcgdG8gY29weSwgc28gd2UgY2FuIGNvcHkgYnkgZG9pbmcgbm90aGluZy4KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChidWZmZXItPmRhdGEoKS50eXBlKCkgIT0gQzJCdWZmZXJEYXRhOjpHUkFQSElDKSB7CisgICAgICAgIEFMT0dEKCJDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6Y2FuQ29weTogYnVmZmVyIHByZWNvbmRpdGlvbiB1bnNhdGlzZmllZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChidWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChidWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuc2l6ZSgpICE9IDF1KSB7CisgICAgICAgIEFMT0dEKCJDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6Y2FuQ29weTogdG9vIG1hbnkgYmxvY2tzIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7CisgICAgLy8gRklYTUU6IGZvcm1hdCgpIGlzIG5vdCBjb25zdCwgYnV0IHdlIGNhbm5vdCBjaGFuZ2UgaXQsIHNvIGRvIGEgY29uc3QgY2FzdCBoZXJlCisgICAgY29uc3RfY2FzdDxDb25zdEdyYXBoaWNCbG9ja0J1ZmZlciAqPih0aGlzKS0+Zm9ybWF0KCktPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0KTsKKworICAgIEdyYXBoaWNWaWV3Mk1lZGlhSW1hZ2VDb252ZXJ0ZXIgY29udmVydGVyKAorICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpWzBdLm1hcCgpLmdldCgpLCBjb2xvckZvcm1hdCk7CisgICAgaWYgKGNvbnZlcnRlci5pbml0Q2hlY2soKSAhPSBPSykgeworICAgICAgICBBTE9HRCgiQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNhbkNvcHk6IGNvbnZlcnRlciBpbml0IGZhaWxlZDogJWQiLCBjb252ZXJ0ZXIuaW5pdENoZWNrKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChjb252ZXJ0ZXIuYmFja0J1ZmZlclNpemUoKSA+IGNhcGFjaXR5KCkpIHsKKyAgICAgICAgQUxPR0QoIkNvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpjYW5Db3B5OiBpbnN1ZmZpY2llbnQgY2FwYWNpdHk6IHJlcSAldSBoYXMgJXp1IiwKKyAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuYmFja0J1ZmZlclNpemUoKSwgY2FwYWNpdHkoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgaWYgKCFidWZmZXIgfHwgYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHNldFJhbmdlKDAsIDApOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaW50MzJfdCBjb2xvckZvcm1hdCA9IENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOworICAgIGZvcm1hdCgpLT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdCk7CisKKyAgICBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyIGNvbnZlcnRlcigKKyAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKVswXS5tYXAoKS5nZXQoKSwgY29sb3JGb3JtYXQpOworICAgIGlmIChjb252ZXJ0ZXIuaW5pdENoZWNrKCkgIT0gT0spIHsKKyAgICAgICAgQUxPR0QoIkNvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpjb3B5OiBjb252ZXJ0ZXIgaW5pdCBmYWlsZWQ6ICVkIiwgY29udmVydGVyLmluaXRDaGVjaygpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzcDxBQnVmZmVyPiBhQnVmZmVyID0gbmV3IEFCdWZmZXIoYmFzZSgpLCBjYXBhY2l0eSgpKTsKKyAgICBpZiAoIWNvbnZlcnRlci5zZXRCYWNrQnVmZmVyKGFCdWZmZXIpKSB7CisgICAgICAgIEFMT0dEKCJDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6Y29weTogc2V0IGJhY2sgYnVmZmVyIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNvbnZlcnRlci5jb3B5VG9NZWRpYUltYWdlKCk7CisgICAgc2V0SW1hZ2VEYXRhKGNvbnZlcnRlci5pbWFnZURhdGEoKSk7CisgICAgbUJ1ZmZlclJlZiA9IGJ1ZmZlcjsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXIKKworRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXI6OkVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jaywKKyAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4gJm1lbW9yeSwKKyAgICAgICAgaW50MzJfdCBoZWFwU2VxTnVtKQorICAgIDogQ29kZWMyQnVmZmVyKGZvcm1hdCwgbmV3IEFCdWZmZXIobWVtb3J5LT5wb2ludGVyKCksIG1lbW9yeS0+c2l6ZSgpKSksCisgICAgICBtQmxvY2soYmxvY2spLAorICAgICAgbU1lbW9yeShtZW1vcnkpLAorICAgICAgbUhlYXBTZXFOdW0oaGVhcFNlcU51bSkgeworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IEVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyOjphc0MyQnVmZmVyKCkgeworICAgIHJldHVybiBDMkJ1ZmZlcjo6Q3JlYXRlTGluZWFyQnVmZmVyKG1CbG9jay0+c2hhcmUob2Zmc2V0KCksIHNpemUoKSwgQzJGZW5jZSgpKSk7Cit9CisKK3ZvaWQgRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXI6OmZpbGxTb3VyY2VCdWZmZXIoCisgICAgICAgIElDcnlwdG86OlNvdXJjZUJ1ZmZlciAqc291cmNlKSB7CisgICAgc291cmNlLT5tU2hhcmVkTWVtb3J5ID0gbU1lbW9yeTsKKyAgICBzb3VyY2UtPm1IZWFwU2VxTnVtID0gbUhlYXBTZXFOdW07Cit9CisKK3ZvaWQgRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXI6OmZpbGxTb3VyY2VCdWZmZXIoCisgICAgICAgIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDo6U2hhcmVkQnVmZmVyICpzb3VyY2UpIHsKKyAgICBzc2l6ZV90IG9mZnNldDsKKyAgICBzaXplX3Qgc2l6ZTsKKworICAgIG1IaWRsTWVtb3J5ID0gaGFyZHdhcmU6OmZyb21IZWFwKG1NZW1vcnktPmdldE1lbW9yeSgmb2Zmc2V0LCAmc2l6ZSkpOworICAgIHNvdXJjZS0+aGVhcEJhc2UgPSAqbUhpZGxNZW1vcnk7CisgICAgc291cmNlLT5vZmZzZXQgPSBvZmZzZXQ7CisgICAgc291cmNlLT5zaXplID0gc2l6ZTsKK30KKworYm9vbCBFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcjo6Y29weURlY3J5cHRlZENvbnRlbnQoCisgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+ICZkZWNyeXB0ZWQsIHNpemVfdCBsZW5ndGgpIHsKKyAgICBDMldyaXRlVmlldyB2aWV3ID0gbUJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHZpZXcuc2l6ZSgpIDwgbGVuZ3RoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbWVtY3B5KHZpZXcuZGF0YSgpLCBkZWNyeXB0ZWQtPnBvaW50ZXIoKSwgbGVuZ3RoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcjo6Y29weURlY3J5cHRlZENvbnRlbnRGcm9tTWVtb3J5KHNpemVfdCBsZW5ndGgpIHsKKyAgICByZXR1cm4gY29weURlY3J5cHRlZENvbnRlbnQobU1lbW9yeSwgbGVuZ3RoKTsKK30KKworbmF0aXZlX2hhbmRsZV90ICpFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcjo6aGFuZGxlKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQmxvY2stPmhhbmRsZSgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJCdWZmZXIuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODE5NzVmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5oCkBAIC0wLDAgKzEsNDAzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfQlVGRkVSX0hfCisKKyNkZWZpbmUgQ09ERUMyX0JVRkZFUl9IXworCisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzL25hdGl2ZS8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIENvcGllcyBhIGdyYXBoaWMgdmlldyBpbnRvIGEgbWVkaWEgaW1hZ2UuCisgKgorICogXHBhcmFtIGltZ0Jhc2UgYmFzZSBvZiBNZWRpYUltYWdlCisgKiBccGFyYW0gaW1nIE1lZGlhSW1hZ2UgZGF0YQorICogXHBhcmFtIHZpZXcgZ3JhcGhpYyB2aWV3CisgKgorICogXHJldHVybiBPSyBvbiBzdWNjZXNzCisgKi8KK3N0YXR1c190IEltYWdlQ29weSh1aW50OF90ICppbWdCYXNlLCBjb25zdCBNZWRpYUltYWdlMiAqaW1nLCBjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KTsKKworLyoqCisgKiBDb3BpZXMgYSBtZWRpYSBpbWFnZSBpbnRvIGEgZ3JhcGhpYyB2aWV3LgorICoKKyAqIFxwYXJhbSB2aWV3IGdyYXBoaWMgdmlldworICogXHBhcmFtIGltZ0Jhc2UgYmFzZSBvZiBNZWRpYUltYWdlCisgKiBccGFyYW0gaW1nIE1lZGlhSW1hZ2UgZGF0YQorICoKKyAqIFxyZXR1cm4gT0sgb24gc3VjY2VzcworICovCitzdGF0dXNfdCBJbWFnZUNvcHkoQzJHcmFwaGljVmlldyAmdmlldywgY29uc3QgdWludDhfdCAqaW1nQmFzZSwgY29uc3QgTWVkaWFJbWFnZTIgKmltZyk7CisKK2NsYXNzIENvZGVjMkJ1ZmZlciA6IHB1YmxpYyBNZWRpYUNvZGVjQnVmZmVyIHsKK3B1YmxpYzoKKyAgICB1c2luZyBNZWRpYUNvZGVjQnVmZmVyOjpNZWRpYUNvZGVjQnVmZmVyOworICAgIH5Db2RlYzJCdWZmZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBccmV0dXJuICBDMkJ1ZmZlciBvYmplY3QgcmVwcmVzZW50cyB0aGlzIGJ1ZmZlci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYXNDMkJ1ZmZlcigpID0gMDsKKworICAgIC8qKgorICAgICAqIFRlc3QgaWYgd2UgY2FuIGNvcHkgdGhlIGNvbnRlbnQgb2YgfGJ1ZmZlcnwgaW50byB0aGlzIG9iamVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGJ1ZmZlciAgQzJCdWZmZXIgb2JqZWN0IHRvIGNvcHkuCisgICAgICogXHJldHVybiAgdHJ1ZSAgICBpZiB0aGUgY29udGVudCBvZiBidWZmZXIgY2FuIGJlIGNvcGllZCBvdmVyIHRvIHRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgZmFsc2UgICBvdGhlcndpc2UuCisgICAgICovCisgICAgdmlydHVhbCBib29sIGNhbkNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdCB7CisgICAgICAgICh2b2lkKWJ1ZmZlcjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcHkgdGhlIGNvbnRlbnQgb2YgfGJ1ZmZlcnwgaW50byB0aGlzIG9iamVjdC4gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0CisgICAgICogY2FuQ29weSgpIGNoZWNrIGFscmVhZHkgcGFzc2VkLgorICAgICAqCisgICAgICogXHBhcmFtICAgYnVmZmVyICBDMkJ1ZmZlciBvYmplY3QgdG8gY29weS4KKyAgICAgKiBccmV0dXJuICB0cnVlICAgIGlmIHN1Y2Nlc3NmdWwKKyAgICAgKiAgICAgICAgICBmYWxzZSAgIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgY29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIHsKKyAgICAgICAgKHZvaWQpYnVmZmVyOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgLyoqCisgICAgICogY2FuQ29weSgpIGltcGxlbWVudGF0aW9uIGZvciBsaW5lYXIgYnVmZmVycy4KKyAgICAgKi8KKyAgICBib29sIGNhbkNvcHlMaW5lYXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIGNvcHkoKSBpbXBsZW1lbnRhdGlvbiBmb3IgbGluZWFyIGJ1ZmZlcnMuCisgICAgICovCisgICAgYm9vbCBjb3B5TGluZWFyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcik7CisKKyAgICAvKioKKyAgICAgKiBzZXRzIE1lZGlhSW1hZ2UgZGF0YSBmb3IgZmxleGlibGUgZ3JhcGhpYyBidWZmZXJzCisgICAgICovCisgICAgdm9pZCBzZXRJbWFnZURhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmltYWdlRGF0YSk7Cit9OworCisvKioKKyAqIE1lZGlhQ29kZWNCdWZmZXIgaW1wbGVtZW50YXRpb24gb24gdG9wIG9mIGxvY2FsIGxpbmVhciBidWZmZXIuIFRoaXMgY2Fubm90CisgKiBjcm9zcyBwcm9jZXNzIGJvdW5kYXJ5IHNvIGFzQzJCdWZmZXIoKSByZXR1cm5zIG9ubHkgbnVsbHB0ci4KKyAqLworY2xhc3MgTG9jYWxMaW5lYXJCdWZmZXIgOiBwdWJsaWMgQ29kZWMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICB1c2luZyBDb2RlYzJCdWZmZXI6OkNvZGVjMkJ1ZmZlcjsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYXNDMkJ1ZmZlcigpIG92ZXJyaWRlIHsgcmV0dXJuIG51bGxwdHI7IH0KKyAgICBib29sIGNhbkNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sIGNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBvdmVycmlkZTsKK307CisKKy8qKgorICogTWVkaWFDb2RlY0J1ZmZlciBpbXBsZW1lbnRhdGlvbiB0byBiZSB1c2VkIG9ubHkgYXMgYSBkdW1teSB3cmFwcGVyIGFyb3VuZCBhCisgKiBDMkJ1ZmZlciBvYmplY3QuCisgKi8KK2NsYXNzIER1bW15Q29udGFpbmVyQnVmZmVyIDogcHVibGljIENvZGVjMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgRHVtbXlDb250YWluZXJCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciA9IG51bGxwdHIpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBhc0MyQnVmZmVyKCkgb3ZlcnJpZGU7CisgICAgYm9vbCBjYW5Db3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgY29uc3Qgb3ZlcnJpZGU7CisgICAgYm9vbCBjb3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBtQnVmZmVyUmVmOworfTsKKworLyoqCisgKiBNZWRpYUNvZGVjQnVmZmVyIGltcGxlbWVudGF0aW9uIHdyYXBzIGFyb3VuZCBDMkxpbmVhckJsb2NrLgorICovCitjbGFzcyBMaW5lYXJCbG9ja0J1ZmZlciA6IHB1YmxpYyBDb2RlYzJCdWZmZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIEFsbG9jYXRlIGEgbmV3IExpbmVhckJ1ZmZlckJsb2NrIHdyYXBwaW5nIGFyb3VuZCBDMkxpbmVhckJsb2NrIG9iamVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGZvcm1hdCAgbWFuZGF0b3J5IGJ1ZmZlciBmb3JtYXQgZm9yIE1lZGlhQ29kZWNCdWZmZXIKKyAgICAgKiBccGFyYW0gICBibG9jayAgIEMyTGluZWFyQmxvY2sgb2JqZWN0IHRvIHdyYXAgYXJvdW5kLgorICAgICAqIFxyZXR1cm4gICAgICAgICAgTGluZWFyQmxvY2tCdWZmZXIgb2JqZWN0IHdpdGggd3JpdGFibGUgbWFwcGluZy4KKyAgICAgKiAgICAgICAgICAgICAgICAgIG51bGxwdHIgaWYgdW5zdWNjZXNzZnVsLgorICAgICAqLworICAgIHN0YXRpYyBzcDxMaW5lYXJCbG9ja0J1ZmZlcj4gQWxsb2NhdGUoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jayk7CisKKyAgICB2aXJ0dWFsIH5MaW5lYXJCbG9ja0J1ZmZlcigpID0gZGVmYXVsdDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYXNDMkJ1ZmZlcigpIG92ZXJyaWRlOworICAgIGJvb2wgY2FuQ29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIGNvbnN0IG92ZXJyaWRlOworICAgIGJvb2wgY29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIExpbmVhckJsb2NrQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBDMldyaXRlVmlldyAmJndyaXRlVmlldywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2spOworICAgIExpbmVhckJsb2NrQnVmZmVyKCkgPSBkZWxldGU7CisKKyAgICBDMldyaXRlVmlldyBtV3JpdGVWaWV3OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBtQmxvY2s7Cit9OworCisvKioKKyAqIE1lZGlhQ29kZWNCdWZmZXIgaW1wbGVtZW50YXRpb24gd3JhcHMgYXJvdW5kIEMyQ29uc3RMaW5lYXJCbG9jay4KKyAqLworY2xhc3MgQ29uc3RMaW5lYXJCbG9ja0J1ZmZlciA6IHB1YmxpYyBDb2RlYzJCdWZmZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIEFsbG9jYXRlIGEgbmV3IENvbnN0TGluZWFyQmxvY2tCdWZmZXIgd3JhcHBpbmcgYXJvdW5kIEMyQnVmZmVyIG9iamVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGZvcm1hdCAgbWFuZGF0b3J5IGJ1ZmZlciBmb3JtYXQgZm9yIE1lZGlhQ29kZWNCdWZmZXIKKyAgICAgKiBccGFyYW0gICBidWZmZXIgIGxpbmVhciBDMkJ1ZmZlciBvYmplY3QgdG8gd3JhcCBhcm91bmQuCisgICAgICogXHJldHVybiAgICAgICAgICBDb25zdExpbmVhckJsb2NrQnVmZmVyIG9iamVjdCB3aXRoIHJlYWRhYmxlIG1hcHBpbmcuCisgICAgICogICAgICAgICAgICAgICAgICBudWxscHRyIGlmIHVuc3VjY2Vzc2Z1bC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3A8Q29uc3RMaW5lYXJCbG9ja0J1ZmZlcj4gQWxsb2NhdGUoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKTsKKworICAgIHZpcnR1YWwgfkNvbnN0TGluZWFyQmxvY2tCdWZmZXIoKSA9IGRlZmF1bHQ7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGFzQzJCdWZmZXIoKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBDb25zdExpbmVhckJsb2NrQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBDMlJlYWRWaWV3ICYmcmVhZFZpZXcsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpOworICAgIENvbnN0TGluZWFyQmxvY2tCdWZmZXIoKSA9IGRlbGV0ZTsKKworICAgIEMyUmVhZFZpZXcgbVJlYWRWaWV3OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gbUJ1ZmZlclJlZjsKK307CisKKy8qKgorICogTWVkaWFDb2RlY0J1ZmZlciBpbXBsZW1lbnRhdGlvbiB3cmFwcyBhcm91bmQgQzJHcmFwaGljQmxvY2suCisgKgorICogVGhpcyBvYmplY3QgZXhwb3NlcyB0aGUgdW5kZXJseWluZyBiaXRzIHZpYSBhY2Nlc3NvciBBUElzIGFuZCAiaW1hZ2UtZGF0YSIKKyAqIG1ldGFkYXRhLCBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYXQgYWxsb2NhdGlvbiB0aW1lLgorICovCitjbGFzcyBHcmFwaGljQmxvY2tCdWZmZXIgOiBwdWJsaWMgQ29kZWMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBhIG5ldyBHcmFwaGljQmxvY2tCdWZmZXIgd3JhcHBpbmcgYXJvdW5kIEMyR3JhcGhpY0Jsb2NrIG9iamVjdC4KKyAgICAgKiBJZiB8YmxvY2t8IGlzIG5vdCBpbiBnb29kIGNvbG9yIGZvcm1hdHMsIGl0IGFsbG9jYXRlcyBZVjEyIGxvY2FsIGJ1ZmZlcgorICAgICAqIGFuZCBjb3BpZXMgdGhlIGNvbnRlbnQgb3ZlciBhdCBhc0MyQnVmZmVyKCkuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBmb3JtYXQgIG1hbmRhdG9yeSBidWZmZXIgZm9ybWF0IGZvciBNZWRpYUNvZGVjQnVmZmVyCisgICAgICogXHBhcmFtICAgYmxvY2sgICBDMkdyYXBoaWNCbG9jayBvYmplY3QgdG8gd3JhcCBhcm91bmQuCisgICAgICogXHBhcmFtICAgYWxsb2MgICBhIGZ1bmN0aW9uIHRvIGFsbG9jYXRlIGJhY2tpbmcgQUJ1ZmZlciBpZiBuZWVkZWQuCisgICAgICogXHJldHVybiAgICAgICAgICBHcmFwaGljQmxvY2tCdWZmZXIgb2JqZWN0IHdpdGggd3JpdGFibGUgbWFwcGluZy4KKyAgICAgKiAgICAgICAgICAgICAgICAgIG51bGxwdHIgaWYgdW5zdWNjZXNzZnVsLgorICAgICAqLworICAgIHN0YXRpYyBzcDxHcmFwaGljQmxvY2tCdWZmZXI+IEFsbG9jYXRlKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jaywKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3A8QUJ1ZmZlcj4oc2l6ZV90KT4gYWxsb2MpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBhc0MyQnVmZmVyKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIH5HcmFwaGljQmxvY2tCdWZmZXIoKSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgR3JhcGhpY0Jsb2NrQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgQzJHcmFwaGljVmlldyAmJnZpZXcsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jaywKKyAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZpbWFnZURhdGEsCisgICAgICAgICAgICBib29sIHdyYXBwZWQpOworICAgIEdyYXBoaWNCbG9ja0J1ZmZlcigpID0gZGVsZXRlOworCisgICAgaW5saW5lIE1lZGlhSW1hZ2UyICppbWFnZURhdGEoKSB7IHJldHVybiAoTWVkaWFJbWFnZTIgKiltSW1hZ2VEYXRhLT5kYXRhKCk7IH0KKworICAgIEMyR3JhcGhpY1ZpZXcgbVZpZXc7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBtQmxvY2s7CisgICAgc3A8QUJ1ZmZlcj4gbUltYWdlRGF0YTsKKyAgICBjb25zdCBib29sIG1XcmFwcGVkOworfTsKKworLyoqCisgKiBNZWRpYUNvZGVjQnVmZmVyIGltcGxlbWVudGF0aW9uIHdyYXBzIGFyb3VuZCBWaWRlb05hdGl2ZU1ldGFkYXRhLgorICovCitjbGFzcyBHcmFwaGljTWV0YWRhdGFCdWZmZXIgOiBwdWJsaWMgQ29kZWMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgR3JhcGhpY01ldGFkYXRhQnVmZmVyIHdpdGggbG9jYWwgbGluZWFyIGJ1ZmZlciBmb3IKKyAgICAgKiBWaWRlb05hdGl2ZU1ldGFkYXRhLgorICAgICAqCisgICAgICogXHBhcmFtICAgZm9ybWF0ICAgICAgbWFuZGF0b3J5IGJ1ZmZlciBmb3JtYXQgZm9yIE1lZGlhQ29kZWNCdWZmZXIKKyAgICAgKi8KKyAgICBHcmFwaGljTWV0YWRhdGFCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2MpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBhc0MyQnVmZmVyKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIH5HcmFwaGljTWV0YWRhdGFCdWZmZXIoKSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgR3JhcGhpY01ldGFkYXRhQnVmZmVyKCkgPSBkZWxldGU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1BbGxvYzsKK307CisKKy8qKgorICogTWVkaWFDb2RlY0J1ZmZlciBpbXBsZW1lbnRhdGlvbiB3cmFwcyBhcm91bmQgZ3JhcGhpYyBDMkJ1ZmZlciBvYmplY3QuCisgKgorICogVGhpcyBvYmplY3QgZXhwb3NlcyB0aGUgdW5kZXJseWluZyBiaXRzIHZpYSBhY2Nlc3NvciBBUElzIGFuZCAiaW1hZ2UtZGF0YSIKKyAqIG1ldGFkYXRhLCBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYXQgYWxsb2NhdGlvbiB0aW1lLgorICovCitjbGFzcyBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlciA6IHB1YmxpYyBDb2RlYzJCdWZmZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIEFsbG9jYXRlIGEgbmV3IENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyIHdyYXBwaW5nIGFyb3VuZCBDMkJ1ZmZlciBvYmplY3QuCisgICAgICogSWYgfGJ1ZmZlcnwgaXMgbm90IGluIGdvb2QgY29sb3IgZm9ybWF0cywgaXQgYWxsb2NhdGVzIFlWMTIgbG9jYWwgYnVmZmVyCisgICAgICogYW5kIGNvcGllcyB0aGUgY29udGVudCBvZiB8YnVmZmVyfCBvdmVyIHRvIGV4cG9zZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGZvcm1hdCAgbWFuZGF0b3J5IGJ1ZmZlciBmb3JtYXQgZm9yIE1lZGlhQ29kZWNCdWZmZXIKKyAgICAgKiBccGFyYW0gICBidWZmZXIgIGdyYXBoaWMgQzJCdWZmZXIgb2JqZWN0IHRvIHdyYXAgYXJvdW5kLgorICAgICAqIFxwYXJhbSAgIGFsbG9jICAgYSBmdW5jdGlvbiB0byBhbGxvY2F0ZSBiYWNraW5nIEFCdWZmZXIgaWYgbmVlZGVkLgorICAgICAqIFxyZXR1cm4gICAgICAgICAgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIgb2JqZWN0IHdpdGggcmVhZGFibGUgbWFwcGluZy4KKyAgICAgKiAgICAgICAgICAgICAgICAgIG51bGxwdHIgaWYgdW5zdWNjZXNzZnVsLgorICAgICAqLworICAgIHN0YXRpYyBzcDxDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcj4gQWxsb2NhdGUoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3A8QUJ1ZmZlcj4oc2l6ZV90KT4gYWxsb2MpOworCisgICAgLyoqCisgICAgICogQWxsb2NhdGUgYSBuZXcgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIgd2hpY2ggYWxsb2NhdGVzIFlWMTIgbG9jYWwgYnVmZmVyCisgICAgICogYW5kIGNvcGllcyB0aGUgY29udGVudCBvZiB8YnVmZmVyfCBvdmVyIHRvIGV4cG9zZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGZvcm1hdCAgbWFuZGF0b3J5IGJ1ZmZlciBmb3JtYXQgZm9yIE1lZGlhQ29kZWNCdWZmZXIKKyAgICAgKiBccGFyYW0gICBhbGxvYyAgIGEgZnVuY3Rpb24gdG8gYWxsb2NhdGUgYmFja2luZyBBQnVmZmVyIGlmIG5lZWRlZC4KKyAgICAgKiBccmV0dXJuICAgICAgICAgIENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyIG9iamVjdCB3aXRoIG5vIHdyYXBwaW5nIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3A8Q29uc3RHcmFwaGljQmxvY2tCdWZmZXI+IEFsbG9jYXRlRW1wdHkoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3A8QUJ1ZmZlcj4oc2l6ZV90KT4gYWxsb2MpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBhc0MyQnVmZmVyKCkgb3ZlcnJpZGU7CisgICAgYm9vbCBjYW5Db3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgY29uc3Qgb3ZlcnJpZGU7CisgICAgYm9vbCBjb3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIH5Db25zdEdyYXBoaWNCbG9ja0J1ZmZlcigpID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmFCdWZmZXIsCisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJHcmFwaGljVmlldz4gJiZ2aWV3LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmltYWdlRGF0YSwKKyAgICAgICAgICAgIGJvb2wgd3JhcHBlZCk7CisgICAgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIoKSA9IGRlbGV0ZTsKKworICAgIHNwPEFCdWZmZXI+IG1JbWFnZURhdGE7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IG1WaWV3OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gbUJ1ZmZlclJlZjsKKyAgICBjb25zdCBib29sIG1XcmFwcGVkOworfTsKKworLyoqCisgKiBNZWRpYUNvZGVjQnVmZmVyIGltcGxlbWVudGF0aW9uIHdyYXBzIGFyb3VuZCBDMkxpbmVhckJsb2NrIGZvciBjb21wb25lbnQKKyAqIGFuZCBJTWVtb3J5IGZvciBjbGllbnQuIFVuZGVybHlpbmcgQzJMaW5lYXJCbG9jayB3b24ndCBiZSBtYXBwZWQgZm9yIHNlY3VyZQorICogdXNlY2FzZXMuLgorICovCitjbGFzcyBFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlciA6IHB1YmxpYyBDb2RlYzJCdWZmZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBFbmNyeXB0ZWRMaW5lYXJCdWZmZXJCbG9jayB3cmFwcGluZyBhcm91bmQgQzJMaW5lYXJCbG9jaworICAgICAqIG9iamVjdCBhbmQgd3JpdGFibGUgSU1lbW9yeSByZWdpb24uCisgICAgICoKKyAgICAgKiBccGFyYW0gICBmb3JtYXQgICAgICBtYW5kYXRvcnkgYnVmZmVyIGZvcm1hdCBmb3IgTWVkaWFDb2RlY0J1ZmZlcgorICAgICAqIFxwYXJhbSAgIGJsb2NrICAgICAgIEMyTGluZWFyQmxvY2sgb2JqZWN0IHRvIHdyYXAgYXJvdW5kLgorICAgICAqIFxwYXJhbSAgIG1lbW9yeSAgICAgIElNZW1vcnkgb2JqZWN0IHRvIHN0b3JlIGVuY3J5cHRlZCBjb250ZW50LgorICAgICAqIFxwYXJhbSAgIGhlYXBTZXFOdW0gIEhlYXAgc2VxdWVuY2UgbnVtYmVyIGZyb20gSUNyeXB0bzsgLTEgaWYgTi9BCisgICAgICovCisgICAgRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2ssCisgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiAmbWVtb3J5LAorICAgICAgICAgICAgaW50MzJfdCBoZWFwU2VxTnVtID0gLTEpOworICAgIEVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyKCkgPSBkZWxldGU7CisKKyAgICB2aXJ0dWFsIH5FbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcigpID0gZGVmYXVsdDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYXNDMkJ1ZmZlcigpIG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogRmlsbCB0aGUgc291cmNlIGJ1ZmZlciBzdHJ1Y3R1cmUgd2l0aCBhcHByb3ByaWF0ZSB2YWx1ZSBiYXNlZCBvbgorICAgICAqIGludGVybmFsIElNZW1vcnkgb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtIHNvdXJjZSAgc291cmNlIGJ1ZmZlciBzdHJ1Y3R1cmUgdG8gZmlsbC4KKyAgICAgKi8KKyAgICB2b2lkIGZpbGxTb3VyY2VCdWZmZXIoSUNyeXB0bzo6U291cmNlQnVmZmVyICpzb3VyY2UpOworICAgIHZvaWQgZmlsbFNvdXJjZUJ1ZmZlcigKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDo6U2hhcmVkQnVmZmVyICpzb3VyY2UpOworCisgICAgLyoqCisgICAgICogQ29weSB0aGUgY29udGVudCBvZiB8ZGVjcnlwdGVkfCBpbnRvIEMyTGluZWFyQmxvY2sgaW5zaWRlLiBUaGlzIHNoYWxsCisgICAgICogb25seSBiZSBjYWxsZWQgaW4gbm9uLXNlY3VyZSB1c2VjYXNlcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGRlY3J5cHRlZCAgIGRlY3J5cHRlZCBjb250ZW50IHRvIGNvcHkgZnJvbS4KKyAgICAgKiBccGFyYW0gICBsZW5ndGggICAgICBsZW5ndGggb2YgdGhlIGNvbnRlbnQKKyAgICAgKiBccmV0dXJuICB0cnVlICAgICAgICBpZiBzdWNjZXNzZnVsCisgICAgICogICAgICAgICAgZmFsc2UgICAgICAgb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2wgY29weURlY3J5cHRlZENvbnRlbnQoY29uc3Qgc3A8SU1lbW9yeT4gJmRlY3J5cHRlZCwgc2l6ZV90IGxlbmd0aCk7CisKKyAgICAvKioKKyAgICAgKiBDb3B5IHRoZSBjb250ZW50IG9mIGludGVybmFsIElNZW1vcnkgb2JqZWN0IGludG8gQzJMaW5lYXJCbG9jayBpbnNpZGUuCisgICAgICogVGhpcyBzaGFsbCBvbmx5IGJlIGNhbGxlZCBpbiBub24tc2VjdXJlIHVzZWNhc2VzLgorICAgICAqCisgICAgICogXHBhcmFtICAgbGVuZ3RoICAgICAgbGVuZ3RoIG9mIHRoZSBjb250ZW50CisgICAgICogXHJldHVybiAgdHJ1ZSAgICAgICAgaWYgc3VjY2Vzc2Z1bAorICAgICAqICAgICAgICAgIGZhbHNlICAgICAgIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sIGNvcHlEZWNyeXB0ZWRDb250ZW50RnJvbU1lbW9yeShzaXplX3QgbGVuZ3RoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBuYXRpdmUgaGFuZGxlIG9mIHNlY3VyZSBidWZmZXIgdW5kZXJzdG9vZCBieSBJQ3J5cHRvLgorICAgICAqCisgICAgICogXHJldHVybiBzZWN1cmUgYnVmZmVyIGhhbmRsZQorICAgICAqLworICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKCkgY29uc3Q7CisKK3ByaXZhdGU6CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gbUJsb2NrOworICAgIHNwPElNZW1vcnk+IG1NZW1vcnk7CisgICAgc3A8aGFyZHdhcmU6OkhpZGxNZW1vcnk+IG1IaWRsTWVtb3J5OworICAgIGludDMyX3QgbUhlYXBTZXFOdW07Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPREVDMl9CVUZGRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJJbmZvQnVpbGRlci5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMySW5mb0J1aWxkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMGNjZDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMySW5mb0J1aWxkZXIuY3BwCkBAIC0wLDAgKzEsNTk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2RlYzJJbmZvQnVpbGRlciIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8Q29kZWMyTWFwcGVyLmg+CisKKyNpbmNsdWRlIDxPTVhfQXVkaW8uaD4KKyNpbmNsdWRlIDxPTVhfQXVkaW9FeHQuaD4KKyNpbmNsdWRlIDxPTVhfSW5kZXhFeHQuaD4KKyNpbmNsdWRlIDxPTVhfVHlwZXMuaD4KKyNpbmNsdWRlIDxPTVhfVmlkZW8uaD4KKyNpbmNsdWRlIDxPTVhfVmlkZW9FeHQuaD4KKyNpbmNsdWRlIDxPTVhfQXNTdHJpbmcuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXhPYnNlcnZlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Tm9kZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC90eXBlcy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPG1lZGlhL29teC8xLjAvV09teE5vZGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaD4KKworI2luY2x1ZGUgIkNvZGVjMkluZm9CdWlsZGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgVHJhaXRzID0gQzJDb21wb25lbnQ6OlRyYWl0czsKKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCitib29sIGhhc1ByZWZpeChjb25zdCBzdGQ6OnN0cmluZyYgcywgY29uc3QgY2hhciogcHJlZml4KSB7CisgICAgc2l6ZV90IHByZWZpeExlbiA9IHN0cmxlbihwcmVmaXgpOworICAgIHJldHVybiBzLmNvbXBhcmUoMCwgcHJlZml4TGVuLCBwcmVmaXgpID09IDA7Cit9CisKK2Jvb2wgaGFzU3VmZml4KGNvbnN0IHN0ZDo6c3RyaW5nJiBzLCBjb25zdCBjaGFyKiBzdWZmaXgpIHsKKyAgICBzaXplX3Qgc3VmZml4TGVuID0gc3RybGVuKHN1ZmZpeCk7CisgICAgcmV0dXJuIHN1ZmZpeExlbiA+IHMuc2l6ZSgpID8gZmFsc2UgOgorICAgICAgICAgICAgcy5jb21wYXJlKHMuc2l6ZSgpIC0gc3VmZml4TGVuLCBzdWZmaXhMZW4sIHN1ZmZpeCkgPT0gMDsKK30KKworLy8gQ29uc3RhbnRzIGZyb20gQUNvZGVjCitjb25zdGV4cHIgT01YX1UzMiBrUG9ydEluZGV4SW5wdXQgPSAwOworY29uc3RleHByIE9NWF9VMzIga1BvcnRJbmRleE91dHB1dCA9IDE7Citjb25zdGV4cHIgT01YX1UzMiBrTWF4SW5kaWNlc1RvQ2hlY2sgPSAzMjsKKworc3RhdHVzX3QgcXVlcnlPbXhDYXBhYmlsaXRpZXMoCisgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIG1pbWUsIGJvb2wgaXNFbmNvZGVyLAorICAgICAgICBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyKiBjYXBzKSB7CisKKyAgICBjb25zdCBjaGFyICpyb2xlID0gR2V0Q29tcG9uZW50Um9sZShpc0VuY29kZXIsIG1pbWUpOworICAgIGlmIChyb2xlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDsKKyAgICB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CisgICAgdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKKyAgICB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKKyAgICB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjp1dGlsczo6TFdPbXhOb2RlOworCisgICAgc3A8SU9teD4gb214ID0gSU9teDo6Z2V0U2VydmljZSgpOworICAgIGlmICghb214KSB7CisgICAgICAgIEFMT0dXKCJDb3VsZCBub3Qgb2J0YWluIElPbXggc2VydmljZS4iKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgc3RydWN0IE9ic2VydmVyIDogSU9teE9ic2VydmVyIHsKKyAgICAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25NZXNzYWdlcyhjb25zdCBoaWRsX3ZlYzxNZXNzYWdlPiYpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgc3A8T2JzZXJ2ZXI+IG9ic2VydmVyID0gbmV3IE9ic2VydmVyKCk7CisgICAgU3RhdHVzIHN0YXR1czsKKyAgICBzcDxJT214Tm9kZT4gdE9teE5vZGU7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gb214LT5hbGxvY2F0ZU5vZGUoCisgICAgICAgICAgICBuYW1lLCBvYnNlcnZlciwKKyAgICAgICAgICAgIFsmc3RhdHVzLCAmdE9teE5vZGVdKFN0YXR1cyBzLCBjb25zdCBzcDxJT214Tm9kZT4mIG4pIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgIHRPbXhOb2RlID0gbjsKKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dXKCJJT214OjphbGxvY2F0ZU5vZGUgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgIEFMT0dXKCJJT214OjphbGxvY2F0ZU5vZGUgLS0gZXJyb3IgcmV0dXJuZWQ6ICVkLiIsCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgc3A8TFdPbXhOb2RlPiBvbXhOb2RlID0gbmV3IExXT214Tm9kZSh0T214Tm9kZSk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBTZXRDb21wb25lbnRSb2xlKG9teE5vZGUsIHJvbGUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgb214Tm9kZS0+ZnJlZU5vZGUoKTsKKyAgICAgICAgQUxPR1coIkZhaWxlZCB0byBTZXRDb21wb25lbnRSb2xlOiBjb21wb25lbnQgPSAlcywgcm9sZSA9ICVzLiIsCisgICAgICAgICAgICAgICAgbmFtZSwgcm9sZSk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYm9vbCBpc1ZpZGVvID0gaGFzUHJlZml4KG1pbWUsICJ2aWRlby8iKSA9PSAwOworICAgIGJvb2wgaXNJbWFnZSA9IGhhc1ByZWZpeChtaW1lLCAiaW1hZ2UvIikgPT0gMDsKKworICAgIGlmIChpc1ZpZGVvIHx8IGlzSW1hZ2UpIHsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgcGFyYW07CisgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtKTsKKyAgICAgICAgcGFyYW0ublBvcnRJbmRleCA9IGlzRW5jb2RlciA/IGtQb3J0SW5kZXhPdXRwdXQgOiBrUG9ydEluZGV4SW5wdXQ7CisKKyAgICAgICAgZm9yIChPTVhfVTMyIGluZGV4ID0gMDsgaW5kZXggPD0ga01heEluZGljZXNUb0NoZWNrOyArK2luZGV4KSB7CisgICAgICAgICAgICBwYXJhbS5uUHJvZmlsZUluZGV4ID0gaW5kZXg7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBvbXhOb2RlLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgIE9NWF9JbmRleFBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxRdWVyeVN1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgJnBhcmFtLCBzaXplb2YocGFyYW0pKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChwYXJhbS5lUHJvZmlsZSwgcGFyYW0uZUxldmVsKTsKKworICAgICAgICAgICAgLy8gQVZDIGNvbXBvbmVudHMgbWF5IG5vdCBsaXN0IHRoZSBjb25zdHJhaW5lZCBwcm9maWxlcyBleHBsaWNpdGx5LCBidXQKKyAgICAgICAgICAgIC8vIGRlY29kZXJzIHRoYXQgc3VwcG9ydCBhIHByb2ZpbGUgYWxzbyBzdXBwb3J0IGl0cyBjb25zdHJhaW5lZCB2ZXJzaW9uLgorICAgICAgICAgICAgLy8gRW5jb2RlcnMgbXVzdCBleHBsaWNpdGx5IHN1cHBvcnQgY29uc3RyYWluZWQgcHJvZmlsZXMuCisgICAgICAgICAgICBpZiAoIWlzRW5jb2RlciAmJiBzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChwYXJhbS5lUHJvZmlsZSA9PSBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gpIHsKKyAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKE9NWF9WSURFT19BVkNQcm9maWxlQ29uc3RyYWluZWRIaWdoLCBwYXJhbS5lTGV2ZWwpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW0uZVByb2ZpbGUgPT0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSkgeworICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoT01YX1ZJREVPX0FWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lLCBwYXJhbS5lTGV2ZWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGluZGV4ID09IGtNYXhJbmRpY2VzVG9DaGVjaykgeworICAgICAgICAgICAgICAgIEFMT0dXKCJbJXNdIHN0b3BwaW5nIGNoZWNraW5nIHByb2ZpbGVzIGFmdGVyICV1OiAleC8leCIsCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLmVQcm9maWxlLCBwYXJhbS5lTGV2ZWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQ29sb3IgZm9ybWF0IHF1ZXJ5CisgICAgICAgIC8vIHJldHVybiBjb2xvcnMgaW4gdGhlIG9yZGVyIHJlcG9ydGVkIGJ5IHRoZSBPTVggY29tcG9uZW50CisgICAgICAgIC8vIHByZWZpeCAiZmxleGlibGUiIHN0YW5kYXJkIG9uZXMgd2l0aCB0aGUgZmxleGlibGUgZXF1aXZhbGVudAorICAgICAgICBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgcG9ydEZvcm1hdDsKKyAgICAgICAgSW5pdE9NWFBhcmFtcygmcG9ydEZvcm1hdCk7CisgICAgICAgIHBvcnRGb3JtYXQublBvcnRJbmRleCA9IGlzRW5jb2RlciA/IGtQb3J0SW5kZXhJbnB1dCA6IGtQb3J0SW5kZXhPdXRwdXQ7CisgICAgICAgIGZvciAoT01YX1UzMiBpbmRleCA9IDA7IGluZGV4IDw9IGtNYXhJbmRpY2VzVG9DaGVjazsgKytpbmRleCkgeworICAgICAgICAgICAgcG9ydEZvcm1hdC5uSW5kZXggPSBpbmRleDsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG9teE5vZGUtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgT01YX0luZGV4UGFyYW1WaWRlb1BvcnRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICZwb3J0Rm9ybWF0LCBzaXplb2YocG9ydEZvcm1hdCkpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBPTVhfVTMyIGZsZXhpYmxlRXF1aXZhbGVudDsKKyAgICAgICAgICAgIGlmIChJc0ZsZXhpYmxlQ29sb3JGb3JtYXQoCisgICAgICAgICAgICAgICAgICAgIG9teE5vZGUsIHBvcnRGb3JtYXQuZUNvbG9yRm9ybWF0LCBmYWxzZSAvKiB1c2luZ05hdGl2ZVdpbmRvdyAqLywKKyAgICAgICAgICAgICAgICAgICAgJmZsZXhpYmxlRXF1aXZhbGVudCkpIHsKKyAgICAgICAgICAgICAgICBjYXBzLT5hZGRDb2xvckZvcm1hdChmbGV4aWJsZUVxdWl2YWxlbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQocG9ydEZvcm1hdC5lQ29sb3JGb3JtYXQpOworCisgICAgICAgICAgICBpZiAoaW5kZXggPT0ga01heEluZGljZXNUb0NoZWNrKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIlslc10gc3RvcHBpbmcgY2hlY2tpbmcgZm9ybWF0cyBhZnRlciAldTogJXMoJXgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcocG9ydEZvcm1hdC5lQ29sb3JGb3JtYXQpLCBwb3J0Rm9ybWF0LmVDb2xvckZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSA9PSAwKSB7CisgICAgICAgIC8vIE1vcmUgYXVkaW8gY29kZWNzIGlmIHRoZXkgaGF2ZSBwcm9maWxlcy4KKyAgICAgICAgT01YX0FVRElPX1BBUkFNX0FORFJPSURfUFJPRklMRVRZUEUgcGFyYW07CisgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtKTsKKyAgICAgICAgcGFyYW0ublBvcnRJbmRleCA9IGlzRW5jb2RlciA/IGtQb3J0SW5kZXhPdXRwdXQgOiBrUG9ydEluZGV4SW5wdXQ7CisgICAgICAgIGZvciAoT01YX1UzMiBpbmRleCA9IDA7IGluZGV4IDw9IGtNYXhJbmRpY2VzVG9DaGVjazsgKytpbmRleCkgeworICAgICAgICAgICAgcGFyYW0ublByb2ZpbGVJbmRleCA9IGluZGV4OworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gb214Tm9kZS0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUF1ZGlvUHJvZmlsZVF1ZXJ5U3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICAgICAmcGFyYW0sIHNpemVvZihwYXJhbSkpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRm9yIGF1ZGlvLCBsZXZlbCBpcyBpZ25vcmVkLgorICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKHBhcmFtLmVQcm9maWxlLCAwIC8qIGxldmVsICovKTsKKworICAgICAgICAgICAgaWYgKGluZGV4ID09IGtNYXhJbmRpY2VzVG9DaGVjaykgeworICAgICAgICAgICAgICAgIEFMT0dXKCJbJXNdIHN0b3BwaW5nIGNoZWNraW5nIHByb2ZpbGVzIGFmdGVyICV1OiAleCIsCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLmVQcm9maWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE5PVEU6IFdpdGhvdXQgQW5kcm9pZCBleHRlbnNpb25zLCBPTVggZG9lcyBub3QgcHJvdmlkZSBhIHdheSB0byBxdWVyeQorICAgICAgICAvLyBBQUMgcHJvZmlsZSBzdXBwb3J0CisgICAgICAgIGlmIChwYXJhbS5uUHJvZmlsZUluZGV4ID09IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJjb21wb25lbnQgJXMgZG9lc24ndCBzdXBwb3J0IHByb2ZpbGUgcXVlcnkuIiwgbmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaXNWaWRlbyAmJiAhaXNFbmNvZGVyKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqc2lkZWJhbmRIYW5kbGUgPSBudWxscHRyOworICAgICAgICBpZiAob214Tm9kZS0+Y29uZmlndXJlVmlkZW9UdW5uZWxNb2RlKAorICAgICAgICAgICAgICAgIGtQb3J0SW5kZXhPdXRwdXQsIE9NWF9UUlVFLCAwLCAmc2lkZWJhbmRIYW5kbGUpID09IE9LKSB7CisgICAgICAgICAgICAvLyB0dW5uZWxlZCBwbGF5YmFjayBpbmNsdWRlcyBhZGFwdGl2ZSBwbGF5YmFjaworICAgICAgICAgICAgY2Fwcy0+YWRkRmxhZ3MoTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6a0ZsYWdTdXBwb3J0c0FkYXB0aXZlUGxheWJhY2sKKyAgICAgICAgICAgICAgICAgICAgfCBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjprRmxhZ1N1cHBvcnRzVHVubmVsZWRQbGF5YmFjayk7CisgICAgICAgIH0gZWxzZSBpZiAob214Tm9kZS0+c2V0UG9ydE1vZGUoCisgICAgICAgICAgICAgICAga1BvcnRJbmRleE91dHB1dCwgSU9NWDo6a1BvcnRNb2RlRHluYW1pY0FOV0J1ZmZlcikgPT0gT0sgfHwKKyAgICAgICAgICAgICAgICBvbXhOb2RlLT5wcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFjaygKKyAgICAgICAgICAgICAgICBrUG9ydEluZGV4T3V0cHV0LCBPTVhfVFJVRSwKKyAgICAgICAgICAgICAgICAxMjgwIC8qIHdpZHRoICovLCA3MjAgLyogaGVpZ2h0ICovKSA9PSBPSykgeworICAgICAgICAgICAgY2Fwcy0+YWRkRmxhZ3MoTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6a0ZsYWdTdXBwb3J0c0FkYXB0aXZlUGxheWJhY2spOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGlzVmlkZW8gJiYgaXNFbmNvZGVyKSB7CisgICAgICAgIE9NWF9WSURFT19DT05GSUdfQU5EUk9JRF9JTlRSQVJFRlJFU0hUWVBFIHBhcmFtczsKKyAgICAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW1zKTsKKyAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OworICAgICAgICAvLyBUT0RPOiBzaG91bGQgd2UgdmVyaWZ5IGlmIGZhbGxiYWNrIGlzIHN1cHBvcnRlZD8KKyAgICAgICAgaWYgKG9teE5vZGUtPmdldENvbmZpZygKKyAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhDb25maWdBbmRyb2lkSW50cmFSZWZyZXNoLAorICAgICAgICAgICAgICAgICZwYXJhbXMsIHNpemVvZihwYXJhbXMpKSA9PSBPSykgeworICAgICAgICAgICAgY2Fwcy0+YWRkRmxhZ3MoTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6a0ZsYWdTdXBwb3J0c0ludHJhUmVmcmVzaCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvbXhOb2RlLT5mcmVlTm9kZSgpOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBidWlsZE9teEluZm8oY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXImIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgIE1lZGlhQ29kZWNMaXN0V3JpdGVyKiB3cml0ZXIpIHsKKyAgICB1aW50MzJfdCBvbXhSYW5rID0gOjphbmRyb2lkOjpiYXNlOjpHZXRVaW50UHJvcGVydHkoCisgICAgICAgICAgICAiZGVidWcuc3RhZ2VmcmlnaHQub214X2RlZmF1bHRfcmFuayIsIHVpbnQzMl90KDB4MTAwKSk7CisgICAgZm9yIChjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Q29kZWMmIGNvZGVjIDogcGFyc2VyLmdldENvZGVjTWFwKCkpIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUgPSBjb2RlYy5maXJzdDsKKyAgICAgICAgaWYgKCFoYXNQcmVmaXgoY29kZWMuZmlyc3QsICJPTVguIikpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGNvbnN0IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpDb2RlY1Byb3BlcnRpZXMgJnByb3BlcnRpZXMgPSBjb2RlYy5zZWNvbmQ7CisgICAgICAgIGJvb2wgZW5jb2RlciA9IHByb3BlcnRpZXMuaXNFbmNvZGVyOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+IGluZm8gPQorICAgICAgICAgICAgICAgIHdyaXRlci0+YWRkTWVkaWFDb2RlY0luZm8oKTsKKyAgICAgICAgaW5mby0+c2V0TmFtZShuYW1lLmNfc3RyKCkpOworICAgICAgICBpbmZvLT5zZXRPd25lcigiZGVmYXVsdCIpOworICAgICAgICBpbmZvLT5zZXRFbmNvZGVyKGVuY29kZXIpOworICAgICAgICBpbmZvLT5zZXRSYW5rKG9teFJhbmspOworICAgICAgICBmb3IgKGNvbnN0IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpUeXBlJiB0eXBlIDogcHJvcGVydGllcy50eXBlTWFwKSB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbWltZSA9IHR5cGUuZmlyc3Q7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcj4gY2FwcyA9CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmFkZE1pbWUobWltZS5jX3N0cigpKTsKKyAgICAgICAgICAgIGNvbnN0IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpBdHRyaWJ1dGVNYXAgJmF0dHJNYXAgPSB0eXBlLnNlY29uZDsKKyAgICAgICAgICAgIGZvciAoY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkF0dHJpYnV0ZSYgYXR0ciA6IGF0dHJNYXApIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAma2V5ID0gYXR0ci5maXJzdDsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmdmFsdWUgPSBhdHRyLnNlY29uZDsKKyAgICAgICAgICAgICAgICBpZiAoaGFzUHJlZml4KGtleSwgImZlYXR1cmUtIikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICFoYXNQcmVmaXgoa2V5LCAiZmVhdHVyZS1iaXRyYXRlLW1vZGVzIikpIHsKKyAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkRGV0YWlsKGtleS5jX3N0cigpLCBoYXNQcmVmaXgodmFsdWUsICIxIikgPyAxIDogMCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkRGV0YWlsKGtleS5jX3N0cigpLCB2YWx1ZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBxdWVyeU9teENhcGFiaWxpdGllcygKKyAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICBtaW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgIGVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgIGNhcHMuZ2V0KCkpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcXVlcnkgY2FwYWJpbGl0aWVzIGZvciAlcyAobWltZTogJXMpLiBFcnJvcjogJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgbWltZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihlcnIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCitzdGF0dXNfdCBDb2RlYzJJbmZvQnVpbGRlcjo6YnVpbGRNZWRpYUNvZGVjTGlzdChNZWRpYUNvZGVjTGlzdFdyaXRlciogd3JpdGVyKSB7CisgICAgLy8gVE9ETzogUmVtb3ZlIHJ1bi10aW1lIGNvbmZpZ3VyYXRpb25zIG9uY2UgYWxsIGNvZGVjcyBhcmUgd29ya2luZworICAgIC8vIHByb3Blcmx5LiAoQXNzdW1lICJmdWxsIiBiZWhhdmlvciBldmVudHVhbGx5LikKKyAgICAvLworICAgIC8vIGRlYnVnLnN0YWdlZnJpZ2h0LmNjb2RlYyBzdXBwb3J0cyA1IHZhbHVlcy4KKyAgICAvLyAgIDAgLSBPbmx5IE9NWCBjb21wb25lbnRzIGFyZSBhdmFpbGFibGUuCisgICAgLy8gICAxIC0gQXVkaW8gZGVjb2RlcnMgYW5kIGVuY29kZXJzIHdpdGggcHJlZml4ICJjMi5hbmRyb2lkLiIgYXJlIGF2YWlsYWJsZQorICAgIC8vICAgICAgIGFuZCByYW5rZWQgZmlyc3QuCisgICAgLy8gICAgICAgQWxsIG90aGVyIGNvbXBvbmVudHMgd2l0aCBwcmVmaXggImMyLmFuZHJvaWQuIiBhcmUgYXZhaWxhYmxlIHdpdGgKKyAgICAvLyAgICAgICB0aGVpciBub3JtYWwgcmFua3MuCisgICAgLy8gICAgICAgQ29tcG9uZW50cyB3aXRoIHByZWZpeCAiYzIudmRhLiIgYXJlIGF2YWlsYWJsZSB3aXRoIHRoZWlyIG5vcm1hbAorICAgIC8vICAgICAgIHJhbmtzLgorICAgIC8vICAgICAgIEFsbCBvdGhlciBjb21wb25lbnRzIHdpdGggc3VmZml4ICIuYXZjLmRlY29kZXIiIG9yICIuYXZjLmVuY29kZXIiCisgICAgLy8gICAgICAgYXJlIGF2YWlsYWJsZSBidXQgcmFua2VkIGxhc3QuCisgICAgLy8gICAyIC0gQ29tcG9uZW50cyB3aXRoIHByZWZpeCAiYzIuYW5kcm9pZC4iIGFyZSBhdmFpbGFibGUgYW5kIHJhbmtlZAorICAgIC8vICAgICAgIGZpcnN0LgorICAgIC8vICAgICAgIENvbXBvbmVudHMgd2l0aCBwcmVmaXggImMyLnZkYS4iIGFyZSBhdmFpbGFibGUgd2l0aCB0aGVpciBub3JtYWwKKyAgICAvLyAgICAgICByYW5rcy4KKyAgICAvLyAgICAgICBBbGwgb3RoZXIgY29tcG9uZW50cyB3aXRoIHN1ZmZpeCAiLmF2Yy5kZWNvZGVyIiBvciAiLmF2Yy5lbmNvZGVyIgorICAgIC8vICAgICAgIGFyZSBhdmFpbGFibGUgYnV0IHJhbmtlZCBsYXN0LgorICAgIC8vICAgMyAtIENvbXBvbmVudHMgd2l0aCBwcmVmaXggImMyLmFuZHJvaWQuIiBhcmUgYXZhaWxhYmxlIGFuZCByYW5rZWQKKyAgICAvLyAgICAgICBmaXJzdC4KKyAgICAvLyAgICAgICBBbGwgb3RoZXIgY29tcG9uZW50cyBhcmUgYXZhaWxhYmxlIHdpdGggdGhlaXIgbm9ybWFsIHJhbmtzLgorICAgIC8vICAgNCAtIEFsbCBjb21wb25lbnRzIGFyZSBhdmFpbGFibGUgd2l0aCB0aGVpciBub3JtYWwgcmFua3MuCisgICAgLy8KKyAgICAvLyBUaGUgZGVmYXVsdCB2YWx1ZSAoYm9vdCB0aW1lKSBpcyAxLgorICAgIC8vCisgICAgLy8gTm90ZTogQ3VycmVudGx5LCBPTVggY29tcG9uZW50cyBoYXZlIGRlZmF1bHQgcmFuayAweDEwMCwgd2hpbGUgYWxsCisgICAgLy8gQ29kZWMyLjAgc29mdHdhcmUgY29tcG9uZW50cyBoYXZlIGRlZmF1bHQgcmFuayAweDIwMC4KKyAgICBpbnQgb3B0aW9uID0gOjphbmRyb2lkOjpiYXNlOjpHZXRJbnRQcm9wZXJ0eSgiZGVidWcuc3RhZ2VmcmlnaHQuY2NvZGVjIiwgMSk7CisKKyAgICAvLyBPYnRhaW4gQ29kZWMyQ2xpZW50CisgICAgc3RkOjp2ZWN0b3I8VHJhaXRzPiB0cmFpdHMgPSBDb2RlYzJDbGllbnQ6Okxpc3RDb21wb25lbnRzKCk7CisKKyAgICBNZWRpYUNvZGVjc1htbFBhcnNlciBwYXJzZXIoCisgICAgICAgICAgICBNZWRpYUNvZGVjc1htbFBhcnNlcjo6ZGVmYXVsdFNlYXJjaERpcnMsCisgICAgICAgICAgICBvcHRpb24gPT0gMCA/ICJtZWRpYV9jb2RlY3MueG1sIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICJtZWRpYV9jb2RlY3NfYzIueG1sIiwKKyAgICAgICAgICAgIG9wdGlvbiA9PSAwID8gIm1lZGlhX2NvZGVjc19wZXJmb3JtYW5jZS54bWwiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lZGlhX2NvZGVjc19wZXJmb3JtYW5jZV9jMi54bWwiKTsKKyAgICBpZiAocGFyc2VyLmdldFBhcnNpbmdTdGF0dXMoKSAhPSBPSykgeworICAgICAgICBBTE9HRCgiWE1MIHBhcnNlciBubyBnb29kIik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBib29sIHN1cmZhY2VUZXN0KENvZGVjMkNsaWVudDo6Q3JlYXRlSW5wdXRTdXJmYWNlKCkpOworICAgIGlmIChvcHRpb24gPT0gMCB8fCAhc3VyZmFjZVRlc3QpIHsKKyAgICAgICAgYnVpbGRPbXhJbmZvKHBhcnNlciwgd3JpdGVyKTsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IFRyYWl0cyYgdHJhaXQgOiB0cmFpdHMpIHsKKyAgICAgICAgQzJDb21wb25lbnQ6OnJhbmtfdCByYW5rID0gdHJhaXQucmFuazsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnRlcmZhY2U+IGludGYgPQorICAgICAgICAgICAgQ29kZWMyQ2xpZW50OjpDcmVhdGVJbnRlcmZhY2VCeU5hbWUodHJhaXQubmFtZS5jX3N0cigpKTsKKyAgICAgICAgaWYgKCFpbnRmIHx8IHBhcnNlci5nZXRDb2RlY01hcCgpLmNvdW50KGludGYtPmdldE5hbWUoKSkgPT0gMCkgeworICAgICAgICAgICAgQUxPR0QoIiVzIG5vdCBmb3VuZCBpbiB4bWwiLCB0cmFpdC5uYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzdHJpbmcgY2Fub25OYW1lID0gaW50Zi0+Z2V0TmFtZSgpOworCisgICAgICAgIC8vIFRPRE86IFJlbW92ZSB0aGlzIGJsb2NrIG9uY2UgYWxsIGNvZGVjcyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0LgorICAgICAgICBzd2l0Y2ggKG9wdGlvbikgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgaWYgKGhhc1ByZWZpeChjYW5vbk5hbWUsICJjMi52ZGEuIikpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoYXNQcmVmaXgoY2Fub25OYW1lLCAiYzIuYW5kcm9pZC4iKSkgeworICAgICAgICAgICAgICAgIGlmICh0cmFpdC5kb21haW4gPT0gQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTykgeworICAgICAgICAgICAgICAgICAgICByYW5rID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhhc1N1ZmZpeChjYW5vbk5hbWUsICIuYXZjLmRlY29kZXIiKSB8fAorICAgICAgICAgICAgICAgICAgICBoYXNTdWZmaXgoY2Fub25OYW1lLCAiLmF2Yy5lbmNvZGVyIikpIHsKKyAgICAgICAgICAgICAgICByYW5rID0gc3RkOjpudW1lcmljX2xpbWl0czxkZWNsdHlwZShyYW5rKT46Om1heCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGlmIChoYXNQcmVmaXgoY2Fub25OYW1lLCAiYzIudmRhLiIpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGFzUHJlZml4KGNhbm9uTmFtZSwgImMyLmFuZHJvaWQuIikpIHsKKyAgICAgICAgICAgICAgICByYW5rID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoYXNTdWZmaXgoY2Fub25OYW1lLCAiLmF2Yy5kZWNvZGVyIikgfHwKKyAgICAgICAgICAgICAgICAgICAgaGFzU3VmZml4KGNhbm9uTmFtZSwgIi5hdmMuZW5jb2RlciIpKSB7CisgICAgICAgICAgICAgICAgcmFuayA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZGVjbHR5cGUocmFuayk+OjptYXgoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBpZiAoaGFzUHJlZml4KGNhbm9uTmFtZSwgImMyLmFuZHJvaWQuIikpIHsKKyAgICAgICAgICAgICAgICByYW5rID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvV3JpdGVyPiBjb2RlY0luZm8gPSB3cml0ZXItPmFkZE1lZGlhQ29kZWNJbmZvKCk7CisgICAgICAgIGNvZGVjSW5mby0+c2V0TmFtZSh0cmFpdC5uYW1lLmNfc3RyKCkpOworICAgICAgICBjb2RlY0luZm8tPnNldE93bmVyKCJjb2RlYzIiKTsKKyAgICAgICAgYm9vbCBlbmNvZGVyID0gdHJhaXQua2luZCA9PSBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSOworICAgICAgICBjb2RlY0luZm8tPnNldEVuY29kZXIoZW5jb2Rlcik7CisgICAgICAgIGNvZGVjSW5mby0+c2V0UmFuayhyYW5rKTsKKyAgICAgICAgY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkNvZGVjUHJvcGVydGllcyAmY29kZWMgPQorICAgICAgICAgICAgcGFyc2VyLmdldENvZGVjTWFwKCkuYXQoY2Fub25OYW1lKTsKKworICAgICAgICBmb3IgKGF1dG8gdHlwZUl0ID0gY29kZWMudHlwZU1hcC5iZWdpbigpOyB0eXBlSXQgIT0gY29kZWMudHlwZU1hcC5lbmQoKTsgKyt0eXBlSXQpIHsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZtZWRpYVR5cGUgPSB0eXBlSXQtPmZpcnN0OworICAgICAgICAgICAgY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkF0dHJpYnV0ZU1hcCAmYXR0ck1hcCA9IHR5cGVJdC0+c2Vjb25kOworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+IGNhcHMgPQorICAgICAgICAgICAgICAgIGNvZGVjSW5mby0+YWRkTWltZShtZWRpYVR5cGUuY19zdHIoKSk7CisgICAgICAgICAgICBmb3IgKGF1dG8gYXR0ckl0ID0gYXR0ck1hcC5iZWdpbigpOyBhdHRySXQgIT0gYXR0ck1hcC5lbmQoKTsgKythdHRySXQpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBrZXksIHZhbHVlOworICAgICAgICAgICAgICAgIHN0ZDo6dGllKGtleSwgdmFsdWUpID0gKmF0dHJJdDsKKyAgICAgICAgICAgICAgICBpZiAoa2V5LmZpbmQoImZlYXR1cmUtIikgPT0gMCAmJiBrZXkuZmluZCgiZmVhdHVyZS1iaXRyYXRlLW1vZGVzIikgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGREZXRhaWwoa2V5LmNfc3RyKCksIHN0ZDo6c3RvaSh2YWx1ZSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZERldGFpbChrZXkuY19zdHIoKSwgdmFsdWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIGdvdFByb2ZpbGVMZXZlbHMgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChpbnRmKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTWFwcGVyOjpQcm9maWxlTGV2ZWxNYXBwZXI+IG1hcHBlciA9CisgICAgICAgICAgICAgICAgICAgIEMyTWFwcGVyOjpHZXRQcm9maWxlTGV2ZWxNYXBwZXIodHJhaXQubWVkaWFUeXBlKTsKKyAgICAgICAgICAgICAgICAvLyBpZiB3ZSBkb24ndCBrbm93IHRoZSBtZWRpYSB0eXBlLCBwYXNzIHRocm91Z2ggYWxsIHZhbHVlcyB1bm1hcHBlZAorCisgICAgICAgICAgICAgICAgLy8gVE9ETzogd2UgY2Fubm90IGZpbmQgbGV2ZWxzIHRoYXQgYXJlIGxvY2FsICdtYXhpbWEnIHdpdGhvdXQga25vd2luZyB0aGUgY29kaW5nCisgICAgICAgICAgICAgICAgLy8gZS5nLiBILjI2MyBsZXZlbCA0NSBhbmQgbGV2ZWwgMzAgY291bGQgYmUgdHdvIHZhbHVlcyBmb3IgaGlnaGVzdCBsZXZlbCBhcworICAgICAgICAgICAgICAgIC8vIHRoZXkgZG9uJ3QgaW5jbHVkZSBvbmUgYW5vdGhlci4gRm9yIG5vdyB3ZSB1c2UgdGhlIGxhc3Qgc3VwcG9ydGVkIHZhbHVlLgorICAgICAgICAgICAgICAgIEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbyBwbChlbmNvZGVyIC8qIG91dHB1dCAqLywgMHUpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gcHJvZmlsZVF1ZXJ5ID0geworICAgICAgICAgICAgICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlBvc3NpYmxlKEMyUGFyYW1GaWVsZCgmcGwsICZwbC5wcm9maWxlKSkKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gaW50Zi0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXMocHJvZmlsZVF1ZXJ5LCBDMl9ET05UX0JMT0NLKTsKKyAgICAgICAgICAgICAgICBBTE9HVigicXVlcnkgc3VwcG9ydGVkIHByb2ZpbGVzIC0+ICVzIHwgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcoZXJyKSwgYXNTdHJpbmcocHJvZmlsZVF1ZXJ5WzBdLnN0YXR1cykpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0sgJiYgcHJvZmlsZVF1ZXJ5WzBdLnN0YXR1cyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZVF1ZXJ5WzBdLnZhbHVlcy50eXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlZBTFVFUykgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChDMlZhbHVlOjpQcmltaXRpdmUgcHJvZmlsZSA6IHByb2ZpbGVRdWVyeVswXS52YWx1ZXMudmFsdWVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGwucHJvZmlsZSA9IChDMkNvbmZpZzo6cHJvZmlsZV90KXByb2ZpbGUucmVmPHVpbnQzMl90PigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBpbnRmLT5jb25maWcoeyZwbH0sIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInNldCBwcm9maWxlIHRvICV1IC0+ICVzIiwgcGwucHJvZmlsZSwgYXNTdHJpbmcoZXJyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiBsZXZlbFF1ZXJ5ID0geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OkN1cnJlbnQoQzJQYXJhbUZpZWxkKCZwbCwgJnBsLmxldmVsKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGludGYtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzKGxldmVsUXVlcnksIEMyX0RPTlRfQkxPQ0spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJxdWVyeSBzdXBwb3J0ZWQgbGV2ZWxzIC0+ICVzIHwgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcoZXJyKSwgYXNTdHJpbmcobGV2ZWxRdWVyeVswXS5zdGF0dXMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LICYmIGxldmVsUXVlcnlbMF0uc3RhdHVzID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZXZlbFF1ZXJ5WzBdLnZhbHVlcy50eXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlZBTFVFUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxldmVsUXVlcnlbMF0udmFsdWVzLnZhbHVlcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlZhbHVlOjpQcmltaXRpdmUgbGV2ZWwgPSBsZXZlbFF1ZXJ5WzBdLnZhbHVlcy52YWx1ZXMuYmFjaygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGwubGV2ZWwgPSAoQzJDb25maWc6OmxldmVsX3QpbGV2ZWwucmVmPHVpbnQzMl90PigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInN1cHBvcnRpbmcgbGV2ZWw6ICV1IiwgcGwubGV2ZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZGtQcm9maWxlLCBzZGtMZXZlbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXBwZXIgJiYgbWFwcGVyLT5tYXBQcm9maWxlKHBsLnByb2ZpbGUsICZzZGtQcm9maWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtYXBwZXItPm1hcExldmVsKHBsLmxldmVsLCAmc2RrTGV2ZWwpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KXNka1Byb2ZpbGUsICh1aW50MzJfdClzZGtMZXZlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290UHJvZmlsZUxldmVscyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtYXBwZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwocGwucHJvZmlsZSwgcGwubGV2ZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdFByb2ZpbGVMZXZlbHMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgSC4yNjMgYWxzbyBhZHZlcnRpc2UgdGhlIHNlY29uZCBoaWdoZXN0IGxldmVsIGlmIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29kZWMgc3VwcG9ydHMgbGV2ZWwgNDUsIGFzIGxldmVsIDQ1IG9ubHkgY292ZXJzIGxldmVsIDEwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBtb3ZlIHRoaXMgdG8gc29tZSBmb3JtIG9mIGEgc2V0dGluZyBzbyBpdCBkb2VzIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGF2ZSB0byBiZSBoZXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX0gyNjMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6bGV2ZWxfdCBuZXh0TGV2ZWwgPSBDMkNvbmZpZzo6TEVWRUxfVU5VU0VEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoQzJWYWx1ZTo6UHJpbWl0aXZlIHYgOiBsZXZlbFF1ZXJ5WzBdLnZhbHVlcy52YWx1ZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OmxldmVsX3QgbGV2ZWwgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEMyQ29uZmlnOjpsZXZlbF90KXYucmVmPHVpbnQzMl90PigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPCBDMkNvbmZpZzo6TEVWRUxfSDI2M180NQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxldmVsID4gbmV4dExldmVsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0TGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dExldmVsICE9IEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG5leHRMZXZlbCAhPSBwbC5sZXZlbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbWFwcGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtYXBwZXItPm1hcFByb2ZpbGUocGwucHJvZmlsZSwgJnNka1Byb2ZpbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtYXBwZXItPm1hcExldmVsKG5leHRMZXZlbCwgJnNka0xldmVsKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KXNka1Byb2ZpbGUsICh1aW50MzJfdClzZGtMZXZlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWdvdFByb2ZpbGVMZXZlbHMpIHsKKyAgICAgICAgICAgICAgICBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX1ZQOSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKFZQOVByb2ZpbGUwLCAgICBWUDlMZXZlbDQxKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChWUDlQcm9maWxlMCwgICAgVlA5TGV2ZWw1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChWUDlQcm9maWxlMiwgICAgVlA5TGV2ZWw1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChWUDlQcm9maWxlMkhEUiwgVlA5TGV2ZWw1KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX0FWMSAmJiAhZW5jb2RlcikgeworICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoQVYxUHJvZmlsZTAsICAgICAgQVYxTGV2ZWwyKTsKKyAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKEFWMVByb2ZpbGUwLCAgICAgIEFWMUxldmVsMjEpOworICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoQVYxUHJvZmlsZTEsICAgICAgQVYxTGV2ZWwyMik7CisgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChBVjFQcm9maWxlMSwgICAgICBBVjFMZXZlbDMpOworICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoQVYxUHJvZmlsZTIsICAgICAgQVYxTGV2ZWwzMSk7CisgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChBVjFQcm9maWxlMiwgICAgICBBVjFMZXZlbDMyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19IRVZDICYmICFlbmNvZGVyKSB7CisgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChIRVZDUHJvZmlsZU1haW4sICAgICAgSEVWQ01haW5UaWVyTGV2ZWw1MSk7CisgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChIRVZDUHJvZmlsZU1haW5TdGlsbCwgSEVWQ01haW5UaWVyTGV2ZWw1MSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fVlA4KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoVlA4UHJvZmlsZU1haW4sIFZQOExldmVsX1ZlcnNpb24wKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChWUDhQcm9maWxlTWFpbiwgVlA4TGV2ZWxfVmVyc2lvbjApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fQVZDKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoQVZDUHJvZmlsZUJhc2VsaW5lLCAgICAgICAgICAgIEFWQ0xldmVsNDEpOworLy8gICAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKEFWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lLCBBVkNMZXZlbDQxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChBVkNQcm9maWxlTWFpbiwgICAgICAgICAgICAgICAgQVZDTGV2ZWw0MSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoQVZDUHJvZmlsZUJhc2VsaW5lLCAgICAgICAgICAgIEFWQ0xldmVsNTIpOworICAgICAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKEFWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lLCBBVkNMZXZlbDUyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChBVkNQcm9maWxlTWFpbiwgICAgICAgICAgICAgICAgQVZDTGV2ZWw1Mik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoQVZDUHJvZmlsZUNvbnN0cmFpbmVkSGlnaCwgICAgIEFWQ0xldmVsNTIpOworICAgICAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKEFWQ1Byb2ZpbGVIaWdoLCAgICAgICAgICAgICAgICBBVkNMZXZlbDUyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX01QRUc0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoTVBFRzRQcm9maWxlU2ltcGxlLCAgTVBFRzRMZXZlbDIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKE1QRUc0UHJvZmlsZVNpbXBsZSwgIE1QRUc0TGV2ZWwzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX0gyNjMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChIMjYzUHJvZmlsZUJhc2VsaW5lLCBIMjYzTGV2ZWw0NSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoSDI2M1Byb2ZpbGVCYXNlbGluZSwgSDI2M0xldmVsMzApOworICAgICAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKEgyNjNQcm9maWxlQmFzZWxpbmUsIEgyNjNMZXZlbDQ1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChIMjYzUHJvZmlsZUlTV1YyLCAgICBIMjYzTGV2ZWwzMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoSDI2M1Byb2ZpbGVJU1dWMiwgICAgSDI2M0xldmVsNDUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fTVBFRzIgJiYgIWVuY29kZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKE1QRUcyUHJvZmlsZVNpbXBsZSwgTVBFRzJMZXZlbEhMKTsKKyAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKE1QRUcyUHJvZmlsZU1haW4sICAgTVBFRzJMZXZlbEhMKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE86IGdldCB0aGlzIGZyb20gaW50ZigpIGFzIHdlbGwsIGJ1dCBob3cgZG8gd2UgbWFwIHRoZW0gdG8KKyAgICAgICAgICAgIC8vIE1lZGlhQ29kZWMgY29sb3IgZm9ybWF0cz8KKyAgICAgICAgICAgIGlmIChtZWRpYVR5cGUuZmluZCgidmlkZW8iKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgICAgIC8vIHZlbmRvciB2aWRlbyBjb2RlY3MgcHJlZmVyIG9wYXF1ZSBmb3JtYXQKKyAgICAgICAgICAgICAgICBpZiAodHJhaXQubmFtZS5maW5kKCJhbmRyb2lkIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoQ09MT1JfRm9ybWF0U3VyZmFjZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlKTsKKyAgICAgICAgICAgICAgICBjYXBzLT5hZGRDb2xvckZvcm1hdChDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpOworICAgICAgICAgICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIpOworICAgICAgICAgICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFBsYW5hcik7CisgICAgICAgICAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcik7CisgICAgICAgICAgICAgICAgLy8gZnJhbWV3b3JrIHZpZGVvIGVuY29kZXJzIG11c3Qgc3VwcG9ydCBzdXJmYWNlIGZvcm1hdCwgdGhvdWdoIGl0IGlzIHVuY2xlYXIKKyAgICAgICAgICAgICAgICAvLyB0aGF0IHRoZXkgd2lsbCBiZSBhYmxlIHRvIG1hcCBpdCBpZiBpdCBpcyBvcGFxdWUKKyAgICAgICAgICAgICAgICBpZiAoZW5jb2RlciAmJiB0cmFpdC5uYW1lLmZpbmQoImFuZHJvaWQiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRDb2xvckZvcm1hdChDT0xPUl9Gb3JtYXRTdXJmYWNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIGFuZHJvaWQ6Ok1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2UgKkNyZWF0ZUJ1aWxkZXIoKSB7CisgICAgcmV0dXJuIG5ldyBhbmRyb2lkOjpDb2RlYzJJbmZvQnVpbGRlcjsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkluZm9CdWlsZGVyLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMySW5mb0J1aWxkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGMxODllCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkluZm9CdWlsZGVyLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0lORk9fQlVJTERFUl9IXworI2RlZmluZSBDT0RFQzJfSU5GT19CVUlMREVSX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIENvZGVjMkluZm9CdWlsZGVyIDogcHVibGljIE1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2UgeworcHVibGljOgorICAgIENvZGVjMkluZm9CdWlsZGVyKCkgPSBkZWZhdWx0OworICAgIH5Db2RlYzJJbmZvQnVpbGRlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKyAgICBzdGF0dXNfdCBidWlsZE1lZGlhQ29kZWNMaXN0KE1lZGlhQ29kZWNMaXN0V3JpdGVyKiB3cml0ZXIpIG92ZXJyaWRlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDT0RFQzJfSU5GT19CVUlMREVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vSW5wdXRTdXJmYWNlV3JhcHBlci5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0lucHV0U3VyZmFjZVdyYXBwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWM0ZWVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0lucHV0U3VyZmFjZVdyYXBwZXIuaApAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5QVVRfU1VSRkFDRV9XUkFQUEVSX0hfCisjZGVmaW5lIElOUFVUX1NVUkZBQ0VfV1JBUFBFUl9IXworCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBXcmFwcGVyIGludGVyZmFjZSBhcm91bmQgSW5wdXRTdXJmYWNlLgorICovCitjbGFzcyBJbnB1dFN1cmZhY2VXcmFwcGVyIHsKK3B1YmxpYzoKKyAgICBJbnB1dFN1cmZhY2VXcmFwcGVyKCkKKyAgICAgICAgOiBtRGF0YVNwYWNlKEhBTF9EQVRBU1BBQ0VfVU5LTk9XTikgeworICAgIH0KKworICAgIHZpcnR1YWwgfklucHV0U3VyZmFjZVdyYXBwZXIoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBDb25uZWN0IHRoZSBzdXJmYWNlIHdpdGggfGNvbXB8LiBBIHN1cmZhY2UgY2FuCisgICAgICogY29ubmVjdCB0byBhdCBtb3N0IG9uZSBjb21wb25lbnQgYXQgYSB0aW1lLgorICAgICAqCisgICAgICogXHJldHVybiBPSyAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gfGNvbXB8CisgICAgICogXHJldHVybiBBTFJFQURZX0VYSVNUUyAgIGFscmVhZHkgY29ubmVjdGVkIHRvIGFub3RoZXIgY29tcG9uZW50LgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXApID0gMDsKKworICAgIC8qKgorICAgICAqIERpc2Nvbm5lY3QgdGhlIHN1cmZhY2UgZnJvbSB0aGUgY29tcG9uZW50IGlmIGFueS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpID0gMDsKKworICAgIC8qKgorICAgICAqIFN0YXJ0IHB1c2hpbmcgYnVmZmVycyB0byB0aGUgc3VyZmFjZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgPSAwOworCisgICAgLyoqCisgICAgICogUmVmOiBHcmFwaGljQnVmZmVyU291cmNlOjpzaWduYWxFbmRPZklucHV0U3RyZWFtLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpID0gMDsKKworICAgIC8vLyBJbnB1dCBTdXJmYWNlIGNvbmZpZ3VyYXRpb24KKyAgICBzdHJ1Y3QgQ29uZmlnIHsKKyAgICAgICAgLy8gSU4gUEFSQU1TIChHQlMpCisgICAgICAgIGZsb2F0IG1NaW5GcHM7IC8vIG1pbmltdW0gZnBzIChyZXBlYXQgZnJhbWUgdG8gYWNoaWV2ZSB0aGlzKQorICAgICAgICBmbG9hdCBtTWF4RnBzOyAvLyBtYXggZnBzICh2aWEgZnJhbWUgZHJvcCkKKyAgICAgICAgZmxvYXQgbUNhcHR1cmVGcHM7IC8vIGNhcHR1cmUgZnBzCisgICAgICAgIGZsb2F0IG1Db2RlZEZwczsgICAvLyBjb2RlZCBmcHMKKyAgICAgICAgYm9vbCBtU3VzcGVuZGVkOyAvLyBzdXNwZW5kZWQKKyAgICAgICAgaW50NjRfdCBtVGltZU9mZnNldFVzOyAvLyB0aW1lIG9mZnNldCAoaW5wdXQgPT4gY29kZWMpCisgICAgICAgIGludDY0X3QgbVN1c3BlbmRBdFVzOyAvLyBzdXNwZW5kL3Jlc3VtZSB0aW1lCisgICAgICAgIGludDY0X3QgbVN0YXJ0QXRVczsgLy8gc3RhcnQgdGltZQorICAgICAgICBib29sIG1TdG9wcGVkOyAvLyBzdG9wcGVkCisgICAgICAgIGludDY0X3QgbVN0b3BBdFVzOyAvLyBzdG9wIHRpbWUKKworICAgICAgICAvLyBPVVQgUEFSQU1TIChHQlMpCisgICAgICAgIGludDY0X3QgbUlucHV0RGVsYXlVczsgLy8gZGVsYXkgYmV0d2VlbiBlbmNvZGVyIGlucHV0IGFuZCBzdXJmYWNlIGlucHV0CisKKyAgICAgICAgLy8gSU4gUEFSQU1TIChDT0RFQyBXUkFQUEVSKQorICAgICAgICBmbG9hdCBtRml4ZWRBZGp1c3RlZEZwczsgLy8gZml4ZWQgZnBzIHZpYSBQVFMgbWFuaXB1bGF0aW9uCisgICAgICAgIGZsb2F0IG1NaW5BZGp1c3RlZEZwczsgLy8gbWluaW11bSBmcHMgdmlhIFBUUyBtYW5pcHVsYXRpb24KKyAgICB9OworCisgICAgLyoqCisgICAgICogQ29uZmlndXJlcyBpbnB1dCBzdXJmYWNlLgorICAgICAqCisgICAgICogXHBhcmFtIGNvbmZpZyBjb25maWd1cmF0aW9uLiBUaGlzIGNhbiBiZSB1cGRhdGVkIGR1cmluZyB0aGlzIGNhbGwgdG8gcHJvdmlkZSBvdXRwdXQKKyAgICAgKiAgICAgICAgICAgICAgIHBhcmFtZXRlcnMsIGJ1dCBub3QgdG8gcHJvdmlkZSBjb25maWd1cmVkIHBhcmFtZXRlcnMgKHRvIGF2b2lkIGNvbnRpbnVhbGx5CisgICAgICogICAgICAgICAgICAgICByZWNvbmZpZ3VyaW5nKQorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlKENvbmZpZyAmY29uZmlnKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmVzIGRlc2lyZWQgZGF0YSBzcGFjZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBkYXRhU3BhY2UgZGVzaXJlZCBkYXRhIHNwYWNlCisgICAgICovCisgICAgaW5saW5lIHZvaWQgc2V0RGF0YVNwYWNlKGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSkgeworICAgICAgICBtRGF0YVNwYWNlID0gZGF0YVNwYWNlOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIGFuZHJvaWRfZGF0YXNwYWNlIG1EYXRhU3BhY2U7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIElOUFVUX1NVUkZBQ0VfV1JBUFBFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1JlZmxlY3RlZFBhcmFtVXBkYXRlci5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUmVmbGVjdGVkUGFyYW1VcGRhdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODBkNGE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1JlZmxlY3RlZFBhcmFtVXBkYXRlci5jcHAKQEAgLTAsMCArMSw1NzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlJlZmxlY3RlZFBhcmFtVXBkYXRlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGFyYW1JbnRlcm5hbC5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKworI2luY2x1ZGUgIlJlZmxlY3RlZFBhcmFtVXBkYXRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0ZDo6c3RyaW5nIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdDo6ZGVidWdTdHJpbmcoc2l6ZV90IGluZGVudF8pIGNvbnN0IHsKKyAgICBzdGQ6OnN0cmluZyBpbmRlbnQoaW5kZW50XywgJyAnKTsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzOworICAgIHMgPDwgIkRpY3QgeyIgPDwgc3RkOjplbmRsOworCisgICAgZm9yIChjb25zdCBhdXRvICZpdCA6ICp0aGlzKSB7CisgICAgICAgIHMgPDwgaW5kZW50IDw8ICIgICI7CisKKyAgICAgICAgQzJWYWx1ZSBjMlZhbHVlOworICAgICAgICBpbnQzMl90IGludDMyVmFsdWU7CisgICAgICAgIHVpbnQzMl90IHVpbnQzMlZhbHVlOworICAgICAgICBpbnQ2NF90IGludDY0VmFsdWU7CisgICAgICAgIHVpbnQ2NF90IHVpbnQ2NFZhbHVlOworICAgICAgICBmbG9hdCBmbG9hdFZhbHVlOworICAgICAgICBzcDxBQnVmZmVyPiBidWZWYWx1ZTsKKyAgICAgICAgQVN0cmluZyBzdHJWYWx1ZTsKKyAgICAgICAgaWYgKGl0LnNlY29uZC5maW5kKCZjMlZhbHVlKSkgeworICAgICAgICAgICAgc3dpdGNoIChjMlZhbHVlLnR5cGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgQzJWYWx1ZTo6SU5UMzI6CisgICAgICAgICAgICAgICAgICAgICh2b2lkKWMyVmFsdWUuZ2V0KCZpbnQzMlZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcyA8PCAiYzI6OmkzMiAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiIDw8IGludDMyVmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJWYWx1ZTo6VUlOVDMyOgorICAgICAgICAgICAgICAgICAgICAodm9pZCljMlZhbHVlLmdldCgmdWludDMyVmFsdWUpOworICAgICAgICAgICAgICAgICAgICBzIDw8ICJjMjo6dTMyICIgPDwgaXQuZmlyc3QgPDwgIiA9ICIgPDwgdWludDMyVmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJWYWx1ZTo6Q05UUjMyOgorICAgICAgICAgICAgICAgICAgICAvLyBkdW1wIGNvdW50ZXIgdmFsdWUgYXMgdW5zaWduZWQKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpYzJWYWx1ZS5nZXQoKGMyX2NudHIzMl90KikmdWludDMyVmFsdWUpOworICAgICAgICAgICAgICAgICAgICBzIDw8ICJjMjo6YzMyICIgPDwgaXQuZmlyc3QgPDwgIiA9ICIgPDwgdWludDMyVmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJWYWx1ZTo6SU5UNjQ6CisgICAgICAgICAgICAgICAgICAgICh2b2lkKWMyVmFsdWUuZ2V0KCZpbnQ2NFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcyA8PCAiYzI6Omk2NCAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiIDw8IGludDY0VmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJWYWx1ZTo6VUlOVDY0OgorICAgICAgICAgICAgICAgICAgICAodm9pZCljMlZhbHVlLmdldCgmdWludDY0VmFsdWUpOworICAgICAgICAgICAgICAgICAgICBzIDw8ICJjMjo6dTY0ICIgPDwgaXQuZmlyc3QgPDwgIiA9ICIgPDwgdWludDY0VmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJWYWx1ZTo6Q05UUjY0OgorICAgICAgICAgICAgICAgICAgICAvLyBkdW1wIGNvdW50ZXIgdmFsdWUgYXMgdW5zaWduZWQKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpYzJWYWx1ZS5nZXQoKGMyX2NudHI2NF90KikmdWludDY0VmFsdWUpOworICAgICAgICAgICAgICAgICAgICBzIDw8ICJjMjo6YzY0ICIgPDwgaXQuZmlyc3QgPDwgIiA9ICIgPDwgdWludDY0VmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJWYWx1ZTo6RkxPQVQ6CisgICAgICAgICAgICAgICAgICAgICh2b2lkKWMyVmFsdWUuZ2V0KCZmbG9hdFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcyA8PCAiYzI6OmZsb2F0ICIgPDwgaXQuZmlyc3QgPDwgIiA9ICIgPDwgZmxvYXRWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgLy8gZHVtcCB1bnN1cHBvcnRlZCB2YWx1ZXMgZm9yIGRlYnVnZ2luZywgdGhlc2Ugc2hvdWxkIG5vdCBiZSB1c2VkCisgICAgICAgICAgICAgICAgICAgIHMgPDwgImMyOjp1bnN1cHBvcnRlZCAiIDw8IGl0LmZpcnN0OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGl0LnNlY29uZC5maW5kKCZpbnQzMlZhbHVlKSkgeworICAgICAgICAgICAgcyA8PCAiaW50MzJfdCAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiIDw8IGludDMyVmFsdWU7CisgICAgICAgIH0gZWxzZSBpZiAoaXQuc2Vjb25kLmZpbmQoJmludDY0VmFsdWUpKSB7CisgICAgICAgICAgICBzIDw8ICJpbnQ2NF90ICIgPDwgaXQuZmlyc3QgPDwgIiA9ICIgPDwgaW50NjRWYWx1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChpdC5zZWNvbmQuZmluZCgmc3RyVmFsdWUpKSB7CisgICAgICAgICAgICBzIDw8ICJzdHJpbmcgIiA8PCBpdC5maXJzdCA8PCAiID0gXCIiIDw8IHN0clZhbHVlLmNfc3RyKCkgPDwgIlwiIjsKKyAgICAgICAgfSBlbHNlIGlmIChpdC5zZWNvbmQuZmluZCgmYnVmVmFsdWUpKSB7CisgICAgICAgICAgICBzIDw8ICJCdWZmZXIgIiA8PCBpdC5maXJzdCA8PCAiID0gIjsKKyAgICAgICAgICAgIGlmIChidWZWYWx1ZSAhPSBudWxscHRyICYmIGJ1ZlZhbHVlLT5kYXRhKCkgIT0gbnVsbHB0ciAmJiBidWZWYWx1ZS0+c2l6ZSgpIDw9IDY0KSB7CisgICAgICAgICAgICAgICAgcyA8PCAieyIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIEFTdHJpbmcgdG1wOworICAgICAgICAgICAgICAgIGhleGR1bXAoYnVmVmFsdWUtPmRhdGEoKSwgYnVmVmFsdWUtPnNpemUoKSwgaW5kZW50XyArIDQsICZ0bXApOworICAgICAgICAgICAgICAgIHMgPDwgdG1wLmNfc3RyKCkgPDwgaW5kZW50IDw8ICIgIH0iOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzIDw8ICh2b2lkKilidWZWYWx1ZS5nZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGR1bXAgdW5zdXBwb3J0ZWQgdmFsdWVzIGZvciBkZWJ1Z2dpbmcsIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4KKyAgICAgICAgICAgIHMgPDwgInVuc3VwcG9ydGVkICIgPDwgaXQuZmlyc3Q7CisgICAgICAgIH0KKyAgICAgICAgcyA8PCBzdGQ6OmVuZGw7CisgICAgfQorICAgIHMgPDwgaW5kZW50IDw8ICJ9IjsKKworICAgIHJldHVybiBzLnN0cigpOworfQorCit2b2lkIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6YWRkUGFyYW1EZXNjKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvciwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gJnBhcmFtRGVzY3MpIHsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gJmRlc2MgOiBwYXJhbURlc2NzKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IHN0cnVjdERlc2MgPSByZWZsZWN0b3ItPmRlc2NyaWJlKAorICAgICAgICAgICAgICAgIGRlc2MtPmluZGV4KCkuY29yZUluZGV4KCkpOworICAgICAgICBpZiAoc3RydWN0RGVzYyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRCgiQ291bGQgbm90IGRlc2NyaWJlICVzIiwgZGVzYy0+bmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgYWRkUGFyYW1EZXNjKGRlc2MsICpzdHJ1Y3REZXNjLCByZWZsZWN0b3IsIHRydWUgLyogbWFya1ZlbmRvciAqLyk7CisgICAgfQorCisgICAgLy8gVEVNUDogYWxzbyBhZGQgdmVuZG9yIHBhcmFtZXRlcnMgYXMgbm9uLXZlbmRvcgorICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiAmZGVzYyA6IHBhcmFtRGVzY3MpIHsKKyAgICAgICAgaWYgKCFkZXNjLT5pbmRleCgpLmlzVmVuZG9yKCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IHN0cnVjdERlc2MgPSByZWZsZWN0b3ItPmRlc2NyaWJlKAorICAgICAgICAgICAgICAgIGRlc2MtPmluZGV4KCkuY29yZUluZGV4KCkpOworICAgICAgICBpZiAoc3RydWN0RGVzYykgeworICAgICAgICAgICAgYWRkUGFyYW1EZXNjKGRlc2MsICpzdHJ1Y3REZXNjLCByZWZsZWN0b3IsIGZhbHNlIC8qIG1hcmtWZW5kb3IgKi8pOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6YWRkUGFyYW1TdHJ1Y3REZXNjKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+IGRlc2MsCisgICAgICAgIEMyU3RyaW5nIHBhdGgsCisgICAgICAgIHNpemVfdCBvZmZzZXQsCisgICAgICAgIGNvbnN0IEMyU3RydWN0RGVzY3JpcHRvciAmc3RydWN0RGVzYywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpIHsKKyAgICBmb3IgKGF1dG8gaXQgPSBzdHJ1Y3REZXNjLmJlZ2luKCk7IGl0ICE9IHN0cnVjdERlc2MuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgQzJTdHJpbmcgZmllbGROYW1lID0gcGF0aCArICIuIiArIGl0LT5uYW1lKCk7CisgICAgICAgIGlmIChpdC0+dHlwZSgpICYgQzJGaWVsZERlc2NyaXB0b3I6OlNUUlVDVF9GTEFHKSB7CisgICAgICAgICAgICBpZiAocmVmbGVjdG9yID09IG51bGxwdHIgfHwgaXQtPmV4dGVudCgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiaWdub3JlZCBzdHJ1Y3QgZmllbGQgJXMiLCBmaWVsZE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBzdHJ1Y3REZXNjXyA9IHJlZmxlY3Rvci0+ZGVzY3JpYmUoCisgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleChpdC0+dHlwZSgpKS5jb3JlSW5kZXgoKSk7CisgICAgICAgICAgICBpZiAoc3RydWN0RGVzY18gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dEKCJDb3VsZCBub3QgZGVzY3JpYmUgc3RydWN0dXJlIG9mICVzIiwgZmllbGROYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkUGFyYW1TdHJ1Y3REZXNjKGRlc2MsIGZpZWxkTmFtZSwgb2Zmc2V0ICsgX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldCgqaXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdHJ1Y3REZXNjXywgcmVmbGVjdG9yKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gdmVyaWZ5IGV4dGVudCBhbmQgdHlwZQorICAgICAgICBzd2l0Y2ggKGl0LT50eXBlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDMyOgorICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDMyOgorICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6Q05UUjMyOgorICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UNjQ6CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UNjQ6CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpDTlRSNjQ6CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpGTE9BVDoKKyAgICAgICAgICAgICAgICBpZiAoaXQtPmV4dGVudCgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoImV4dGVudCgpICE9IDEgZm9yIHNpbmdsZSB2YWx1ZSB0eXBlOiAlcyIsIGZpZWxkTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSSU5HOgorICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6QkxPQjoKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRCgiVW5yZWNvZ25pemVkIHR5cGU6ICVzIiwgZmllbGROYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoIiVzIHJlZ2lzdGVyZWQiLCBmaWVsZE5hbWUuY19zdHIoKSk7CisgICAgICAgIC8vIFRPRE86IGdldCB0aGUgcHJvcGVyIHNpemUgYnkgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGZpZWxkcy4KKyAgICAgICAgLy8gb25seSBpbnNlcnQgZmllbGRzIHRoZSB2ZXJ5IGZpcnN0IHRpbWUKKyAgICAgICAgbU1hcC5lbXBsYWNlKGZpZWxkTmFtZSwgRmllbGREZXNjIHsKKyAgICAgICAgICAgIGRlc2MsCisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEMyRmllbGREZXNjcmlwdG9yPigKKyAgICAgICAgICAgICAgICAgICAgaXQtPnR5cGUoKSwgaXQtPmV4dGVudCgpLCBpdC0+bmFtZSgpLAorICAgICAgICAgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KCppdCksCisgICAgICAgICAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRTaXplKCppdCkpLAorICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICB9KTsKKyAgICB9Cit9CisKK3ZvaWQgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjphZGRQYXJhbURlc2MoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gZGVzYywgY29uc3QgQzJTdHJ1Y3REZXNjcmlwdG9yICZzdHJ1Y3REZXNjLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvciwgYm9vbCBtYXJrVmVuZG9yKSB7CisgICAgQzJTdHJpbmcgcGFyYW1OYW1lID0gZGVzYy0+bmFtZSgpOworCisgICAgLy8gcHJlZml4IHZlbmRvciBwYXJhbWV0ZXJzCisgICAgaWYgKGRlc2MtPmluZGV4KCkuaXNWZW5kb3IoKSAmJiBtYXJrVmVuZG9yKSB7CisgICAgICAgIHBhcmFtTmFtZSA9ICJ2ZW5kb3IuIiArIHBhcmFtTmFtZTsKKyAgICB9CisgICAgbVBhcmFtTmFtZXMuZW1wbGFjZShkZXNjLT5pbmRleCgpLCBwYXJhbU5hbWUpOworCisgICAgLy8gYWxzbyBhbGxvdyBzZXR0aW5nIHdob2xlIHBhcmFtZXRlcnMgaW4gYSBiaW5hcnkgZmFzaGlvbiB2aWEgQnl0ZUJ1ZmZlcgorICAgIC8vIHRoaXMgaXMgb3B0LWluIGZvciBub3cKKyAgICBhdXRvIGl0ID0gbVdob2xlUGFyYW1zLmZpbmQocGFyYW1OYW1lKTsKKyAgICBpZiAoaXQgIT0gbVdob2xlUGFyYW1zLmVuZCgpICYmIGl0LT5zZWNvbmQuY29yZUluZGV4KCkgPT0gZGVzYy0+aW5kZXgoKS5jb3JlSW5kZXgoKSkgeworICAgICAgICBtTWFwLmVtcGxhY2UocGFyYW1OYW1lLCBGaWVsZERlc2N7IGRlc2MsIG51bGxwdHIsIDAgLyogb2Zmc2V0ICovIH0pOworICAgICAgICAvLyBkb24ndCBhZGQgZmllbGRzIG9mIHdob2xlIHBhcmFtZXRlcnMuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhZGRQYXJhbVN0cnVjdERlc2MoZGVzYywgcGFyYW1OYW1lLCAwIC8qIG9mZnNldCAqLywgc3RydWN0RGVzYywgcmVmbGVjdG9yKTsKK30KKwordm9pZCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OnN1cHBvcnRXaG9sZVBhcmFtKHN0ZDo6c3RyaW5nIG5hbWUsIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCkgeworICAgIG1XaG9sZVBhcmFtcy5lbXBsYWNlKG5hbWUsIGluZGV4KTsKK30KKworc3RkOjpzdHJpbmcgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpnZXRQYXJhbU5hbWUoQzJQYXJhbTo6SW5kZXggaW5kZXgpIGNvbnN0IHsKKyAgICBhdXRvIGl0ID0gbVBhcmFtTmFtZXMuZmluZChpbmRleCk7CisgICAgaWYgKGl0ICE9IG1QYXJhbU5hbWVzLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHJldDsKKyAgICByZXQgPDwgIjx1bmtub3duICIgPDwgaW5kZXggPDwgIj4iOworICAgIHJldHVybiByZXQuc3RyKCk7Cit9CisKK3ZvaWQgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpnZXRQYXJhbUluZGljZXNGcm9tTWVzc2FnZSgKKyAgICAgICAgY29uc3QgRGljdCAmcGFyYW1zLAorICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gKnZlYyAvKiBub25udWxsICovKSBjb25zdCB7CisgICAgQ0hFQ0sodmVjICE9IG51bGxwdHIpOworICAgIHZlYy0+Y2xlYXIoKTsKKyAgICBzdGQ6OnNldDxDMlBhcmFtOjpJbmRleD4gaW5kaWNlczsKKyAgICBwYXJzZU1lc3NhZ2VBbmREb1dvcmsoCisgICAgICAgICAgICBwYXJhbXMsCisgICAgICAgICAgICBbJmluZGljZXNdKGNvbnN0IHN0ZDo6c3RyaW5nICYsIGNvbnN0IEZpZWxkRGVzYyAmZGVzYywgY29uc3Qgdm9pZCAqLCBzaXplX3QpIHsKKyAgICAgICAgICAgICAgICBpbmRpY2VzLmluc2VydChkZXNjLnBhcmFtRGVzYy0+aW5kZXgoKSk7CisgICAgICAgICAgICB9KTsKKyAgICBmb3IgKGNvbnN0IEMyUGFyYW06OkluZGV4ICZpbmRleCA6IGluZGljZXMpIHsKKyAgICAgICAgdmVjLT5wdXNoX2JhY2soaW5kZXgpOworICAgIH0KK30KKwordm9pZCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OmdldFBhcmFtSW5kaWNlc0ZvcktleXMoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAma2V5cywKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICp2ZWMgLyogbm9ubnVsbCAqLykgY29uc3QgeworICAgIENIRUNLKHZlYyAhPSBudWxscHRyKTsKKyAgICB2ZWMtPmNsZWFyKCk7CisgICAgc3RkOjpzZXQ8QzJQYXJhbTo6SW5kZXg+IGluZGljZXM7CisKKyAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4ga2V5TWFwKGtleXMuYmVnaW4oKSwga2V5cy5lbmQoKSk7CisKKyAgICBBTE9HVigiaW4gZ2V0UGFyYW1JbmRpY2VzRm9yS2V5cyB3aXRoICV6dSBrZXlzIGFuZCBtYXAgb2YgJXp1IGVudHJpZXMiLAorICAgICAgICAgICAga2V5TWFwLnNpemUoKSwgbU1hcC5zaXplKCkpOworICAgIGZvciAoY29uc3Qgc3RkOjpwYWlyPGNvbnN0IHN0ZDo6c3RyaW5nLCBGaWVsZERlc2M+ICZrdiA6IG1NYXApIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUgPSBrdi5maXJzdDsKKyAgICAgICAgY29uc3QgRmllbGREZXNjICZkZXNjID0ga3Yuc2Vjb25kOworICAgICAgICBBTE9HVigiY291bnQgb2YgJXMgaXMgJXp1IiwgbmFtZS5jX3N0cigpLCBrZXlNYXAuY291bnQobmFtZSkpOworICAgICAgICBpZiAoa2V5TWFwLmNvdW50KG5hbWUpID4gMCkgeworICAgICAgICAgICAgaW5kaWNlcy5pbnNlcnQoZGVzYy5wYXJhbURlc2MtPmluZGV4KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChjb25zdCBDMlBhcmFtOjpJbmRleCAmaW5kZXggOiBpbmRpY2VzKSB7CisgICAgICAgIHZlYy0+cHVzaF9iYWNrKGluZGV4KTsKKyAgICB9Cit9CisKK3ZvaWQgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjp1cGRhdGVQYXJhbXNGcm9tTWVzc2FnZSgKKyAgICAgICAgY29uc3QgRGljdCAmcGFyYW1zLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICp2ZWMgLyogbm9ubnVsbCAqLykgY29uc3QgeworICAgIENIRUNLKHZlYyAhPSBudWxscHRyKTsKKworICAgIHN0ZDo6bWFwPEMyUGFyYW06OkluZGV4LCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4qPiBwYXJhbXNNYXA7CisgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnBhcmFtIDogKnZlYykgeworICAgICAgICBpZiAocGFyYW0gJiYgKnBhcmFtKSB7CisgICAgICAgICAgICBwYXJhbXNNYXBbcGFyYW0tPmluZGV4KCldID0gJnBhcmFtOworICAgICAgICB9CisgICAgfQorCisgICAgcGFyc2VNZXNzYWdlQW5kRG9Xb3JrKAorICAgICAgICAgICAgcGFyYW1zLAorICAgICAgICAgICAgWyZwYXJhbXNNYXBdKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBjb25zdCBGaWVsZERlc2MgJmRlc2MsIGNvbnN0IHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gKnBhcmFtID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBhdXRvIHBhcmFtSXQgPSBwYXJhbXNNYXAuZmluZChkZXNjLnBhcmFtRGVzYy0+aW5kZXgoKSk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtSXQgPT0gcGFyYW1zTWFwLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCIlcyBmb3VuZCwgYnV0IHBhcmFtICMlZCBpc24ndCBwcmVzZW50IHRvIHVwZGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLCAoaW50MzJfdClkZXNjLnBhcmFtRGVzYy0+aW5kZXgoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGFyYW0gPSBwYXJhbUl0LT5zZWNvbmQ7CisKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgX0MyUGFyYW0gOiBwdWJsaWMgQzJQYXJhbSB7CisgICAgICAgICAgICAgICAgICAgIHVzaW5nIEMyUGFyYW06OkMyUGFyYW07CisgICAgICAgICAgICAgICAgICAgIF9DMlBhcmFtKHVpbnQzMl90IHNpemUsIHVpbnQzMl90IGluZGV4KSA6IEMyUGFyYW0oc2l6ZSwgaW5kZXgpIHsgfQorICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICAvLyB3ZSB3aWxsIGhhbmRsZSB3aG9sZSBwYXJhbSB1cGRhdGVzIGFzIHBhcnQgb2YgYSBmbGV4aWJsZSBwYXJhbSB1cGRhdGUgdXNpbmcKKyAgICAgICAgICAgICAgICAvLyBhIHplcm8gb2Zmc2V0LgorICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgICAgICAgICAgICAgIHNpemVfdCBtaW5PZmZzZXQgPSAwOworCisgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBkZXNjcmlwdG9yIGhhcyBhIGZpZWxkLCB1c2UgdGhlIG9mZnNldCBhbmQgc2l6ZSBhbmQgZW5zdXJlIHRoYXQgb2Zmc2V0CisgICAgICAgICAgICAgICAgLy8gaXMgbm90IHBhcnQgb2YgdGhlIGhlYWRlcgorICAgICAgICAgICAgICAgIGlmIChkZXNjLmZpZWxkRGVzYykgeworICAgICAgICAgICAgICAgICAgICBtaW5PZmZzZXQgPSBzaXplb2YoQzJQYXJhbSk7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZihDMlBhcmFtKSArIGRlc2Mub2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KCpkZXNjLmZpZWxkRGVzYyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gcmVhbGxvY2F0ZSBvciB0cmltIGZsZXhpYmxlIHBhcmFtIChvciB3aG9sZSBwYXJhbSkgYXMgbmVjZXNzYXJ5CisgICAgICAgICAgICAgICAgaWYgKCFkZXNjLmZpZWxkRGVzYyAvKiB3aG9sZSBwYXJhbSAqLyB8fCBkZXNjLmZpZWxkRGVzYy0+ZXh0ZW50KCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyByZWFsbG9jYXRlIHBhcmFtIGlmIG1vcmUgc3BhY2UgaXMgbmVlZGVkCisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbS0+Z2V0KCktPnNpemUoKSA8IG9mZnNldCArIHNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplID4gSU5UMzJfTUFYIC0gb2Zmc2V0IHx8IG9mZnNldCA8IG1pbk9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpemUgdG9vIGxvbmcgb3Igb2Zmc2V0IHRvbyBlYXJseSAtIGFiYW5kb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtICpuZXdQYXJhbSA9IChDMlBhcmFtICopOjpvcGVyYXRvciBuZXcob2Zmc2V0ICsgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgKG5ld1BhcmFtKSBfQzJQYXJhbShvZmZzZXQgKyBzaXplLCBwYXJhbS0+Z2V0KCktPmluZGV4KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+IHNpemVvZihDMlBhcmFtKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShuZXdQYXJhbSArIDEsIHBhcmFtLT5nZXQoKSArIDEsIG9mZnNldCAtIHNpemVvZihDMlBhcmFtKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS0+cmVzZXQobmV3UGFyYW0pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtLT5nZXQoKS0+c2l6ZSgpID4gb2Zmc2V0ICsgc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJpbSBwYXJhbWV0ZXIgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OlRyaW1QYXJhbShwYXJhbS0+Z2V0KCksIG9mZnNldCArIHNpemUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZXNjLmZpZWxkRGVzYy0+dHlwZSgpID09IEMyRmllbGREZXNjcmlwdG9yOjpCTE9CKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHplcm8gZmlsbCBibG9icyBpZiB1cGRhdGluZyB3aXRoIHNtYWxsZXIgYmxvYgorICAgICAgICAgICAgICAgICAgICBpZiAoZGVzYy5maWVsZERlc2MtPmV4dGVudCgpID4gc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh1aW50OF90ICopKHBhcmFtLT5nZXQoKSkgKyBvZmZzZXQgKyBzaXplLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MuZmllbGREZXNjLT5leHRlbnQoKSAtIHNpemUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbWVtY3B5KCh1aW50OF90ICopKHBhcmFtLT5nZXQoKSkgKyBvZmZzZXQsIHB0ciwgc2l6ZSk7CisgICAgICAgICAgICB9KTsKK30KKwordm9pZCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OnBhcnNlTWVzc2FnZUFuZERvV29yaygKKyAgICAgICAgY29uc3QgRGljdCAmcGFyYW1zLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjpzdHJpbmcgJiwgY29uc3QgRmllbGREZXNjICYsIGNvbnN0IHZvaWQgKiwgc2l6ZV90KT4gd29yaykgY29uc3QgeworICAgIGZvciAoY29uc3Qgc3RkOjpwYWlyPGNvbnN0IHN0ZDo6c3RyaW5nLCBGaWVsZERlc2M+ICZrdiA6IG1NYXApIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUgPSBrdi5maXJzdDsKKyAgICAgICAgY29uc3QgRmllbGREZXNjICZkZXNjID0ga3Yuc2Vjb25kOworICAgICAgICBhdXRvIHBhcmFtID0gcGFyYW1zLmZpbmQobmFtZSk7CisgICAgICAgIGlmIChwYXJhbSA9PSBwYXJhbXMuZW5kKCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gaGFuZGxlIHdob2xlIHBhcmFtZXRlcnMKKyAgICAgICAgaWYgKCFkZXNjLmZpZWxkRGVzYykgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gdG1wOworICAgICAgICAgICAgaWYgKHBhcmFtLT5zZWNvbmQuZmluZCgmdG1wKSAmJiB0bXAgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEMyUGFyYW0gKnRtcEFzUGFyYW0gPSBDMlBhcmFtOjpGcm9tKHRtcC0+ZGF0YSgpLCB0bXAtPnNpemUoKSk7CisgICAgICAgICAgICAgICAgaWYgKHRtcEFzUGFyYW0gJiYgdG1wQXNQYXJhbS0+dHlwZSgpLnR5cGUoKSA9PSBkZXNjLnBhcmFtRGVzYy0+aW5kZXgoKS50eXBlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgd29yayhuYW1lLCBkZXNjLCB0bXAtPmRhdGEoKSwgdG1wLT5zaXplKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJQYXJhbSBibG9iIGRvZXMgbm90IG1hdGNoIHBhcmFtIGZvciAnJXMnICglcCwgJXggdnMgJXgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksIHRtcEFzUGFyYW0sIHRtcEFzUGFyYW0gPyB0bXBBc1BhcmFtLT50eXBlKCkudHlwZSgpIDogMHhERUFEdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLnBhcmFtRGVzYy0+aW5kZXgoKS50eXBlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBpbnQzMlZhbHVlOworICAgICAgICBpbnQ2NF90IGludDY0VmFsdWU7CisgICAgICAgIEMyVmFsdWUgYzJWYWx1ZTsKKworICAgICAgICBDMkZpZWxkRGVzY3JpcHRvcjo6dHlwZV90IGZpZWxkVHlwZSA9IGRlc2MuZmllbGREZXNjLT50eXBlKCk7CisgICAgICAgIHNpemVfdCBmaWVsZEV4dGVudCA9IGRlc2MuZmllbGREZXNjLT5leHRlbnQoKTsKKyAgICAgICAgc3dpdGNoIChmaWVsZFR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDMyOgorICAgICAgICAgICAgICAgIGlmICgocGFyYW0tPnNlY29uZC5maW5kKCZjMlZhbHVlKSAmJiBjMlZhbHVlLmdldCgmaW50MzJWYWx1ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBwYXJhbS0+c2Vjb25kLmZpbmQoJmludDMyVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmsobmFtZSwgZGVzYywgJmludDMyVmFsdWUsIHNpemVvZihpbnQzMlZhbHVlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDMyOgorICAgICAgICAgICAgICAgIGlmICgocGFyYW0tPnNlY29uZC5maW5kKCZjMlZhbHVlKSAmJiBjMlZhbHVlLmdldCgodWludDMyX3QqKSZpbnQzMlZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBhcmFtLT5zZWNvbmQuZmluZCgmaW50MzJWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgd29yayhuYW1lLCBkZXNjLCAmaW50MzJWYWx1ZSwgc2l6ZW9mKGludDMyVmFsdWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpDTlRSMzI6CisgICAgICAgICAgICAgICAgaWYgKChwYXJhbS0+c2Vjb25kLmZpbmQoJmMyVmFsdWUpICYmIGMyVmFsdWUuZ2V0KChjMl9jbnRyMzJfdCopJmludDMyVmFsdWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgcGFyYW0tPnNlY29uZC5maW5kKCZpbnQzMlZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICB3b3JrKG5hbWUsIGRlc2MsICZpbnQzMlZhbHVlLCBzaXplb2YoaW50MzJWYWx1ZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDY0OgorICAgICAgICAgICAgICAgIGlmICgocGFyYW0tPnNlY29uZC5maW5kKCZjMlZhbHVlKSAmJiBjMlZhbHVlLmdldCgmaW50NjRWYWx1ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBwYXJhbS0+c2Vjb25kLmZpbmQoJmludDY0VmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmsobmFtZSwgZGVzYywgJmludDY0VmFsdWUsIHNpemVvZihpbnQ2NFZhbHVlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDY0OgorICAgICAgICAgICAgICAgIGlmICgocGFyYW0tPnNlY29uZC5maW5kKCZjMlZhbHVlKSAmJiBjMlZhbHVlLmdldCgodWludDY0X3QqKSZpbnQ2NFZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBhcmFtLT5zZWNvbmQuZmluZCgmaW50NjRWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgd29yayhuYW1lLCBkZXNjLCAmaW50NjRWYWx1ZSwgc2l6ZW9mKGludDY0VmFsdWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpDTlRSNjQ6CisgICAgICAgICAgICAgICAgaWYgKChwYXJhbS0+c2Vjb25kLmZpbmQoJmMyVmFsdWUpICYmIGMyVmFsdWUuZ2V0KChjMl9jbnRyNjRfdCopJmludDY0VmFsdWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgcGFyYW0tPnNlY29uZC5maW5kKCZpbnQ2NFZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICB3b3JrKG5hbWUsIGRlc2MsICZpbnQ2NFZhbHVlLCBzaXplb2YoaW50NjRWYWx1ZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkZMT0FUOiB7CisgICAgICAgICAgICAgICAgZmxvYXQgdG1wOworICAgICAgICAgICAgICAgIGlmIChwYXJhbS0+c2Vjb25kLmZpbmQoJmMyVmFsdWUpICYmIGMyVmFsdWUuZ2V0KCZ0bXApKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmsobmFtZSwgZGVzYywgJnRtcCwgc2l6ZW9mKHRtcCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlNUUklORzogeworICAgICAgICAgICAgICAgIEFTdHJpbmcgdG1wOworICAgICAgICAgICAgICAgIGlmICghcGFyYW0tPnNlY29uZC5maW5kKCZ0bXApKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZmllbGRFeHRlbnQgPiAwICYmIHRtcC5zaXplKCkgPj0gZmllbGRFeHRlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgQVN0cmluZyB0cnVuY2F0ZWQodG1wLCAwLCBmaWVsZEV4dGVudCAtIDEpOworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiU3RyaW5nIHZhbHVlIHRvbyBsb25nIHRvIGZpdDogb3JpZ2luYWwgXCIlc1wiIHRydW5jYXRlZCB0byBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcC5jX3N0cigpLCB0cnVuY2F0ZWQuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IHRydW5jYXRlZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd29yayhuYW1lLCBkZXNjLCB0bXAuY19zdHIoKSwgdG1wLnNpemUoKSArIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpCTE9COiB7CisgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gdG1wOworICAgICAgICAgICAgICAgIGlmICghcGFyYW0tPnNlY29uZC5maW5kKCZ0bXApIHx8IHRtcCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChmaWVsZEV4dGVudCA+IDAgJiYgdG1wLT5zaXplKCkgPiBmaWVsZEV4dGVudCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiQmxvYiB2YWx1ZSB0b28gbG9uZyB0byBmaXQuIFRydW5jYXRpbmcuIik7CisgICAgICAgICAgICAgICAgICAgIHRtcC0+c2V0UmFuZ2UodG1wLT5vZmZzZXQoKSwgZmllbGRFeHRlbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3b3JrKG5hbWUsIGRlc2MsIHRtcC0+ZGF0YSgpLCB0bXAtPnNpemUoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0QoIlVuc3VwcG9ydGVkIGRhdGEgdHlwZSBmb3IgJXMiLCBuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3QKK1JlZmxlY3RlZFBhcmFtVXBkYXRlcjo6Z2V0UGFyYW1zKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gJnBhcmFtc18pIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gcGFyYW1zOworICAgIHBhcmFtcy5yZXNpemUocGFyYW1zXy5zaXplKCkpOworICAgIHN0ZDo6dHJhbnNmb3JtKHBhcmFtc18uYmVnaW4oKSwgcGFyYW1zXy5lbmQoKSwgcGFyYW1zLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgW10oY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+JiBwKSAtPiBDMlBhcmFtKiB7IHJldHVybiBwLmdldCgpOyB9KTsKKyAgICByZXR1cm4gZ2V0UGFyYW1zKHBhcmFtcyk7Cit9CisKK1JlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdAorUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpnZXRQYXJhbXMoY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMpIGNvbnN0IHsKKyAgICBEaWN0IHJldDsKKworICAgIC8vIGNvbnZlcnQgdmVjdG9yIHRvIG1hcAorICAgIHN0ZDo6bWFwPEMyUGFyYW06OkluZGV4LCBDMlBhcmFtICo+IHBhcmFtc01hcDsKKyAgICBmb3IgKEMyUGFyYW0gKnBhcmFtIDogcGFyYW1zKSB7CisgICAgICAgIGlmIChwYXJhbSAhPSBudWxscHRyICYmICpwYXJhbSkgeworICAgICAgICAgICAgcGFyYW1zTWFwW3BhcmFtLT5pbmRleCgpXSA9IHBhcmFtOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChjb25zdCBzdGQ6OnBhaXI8Y29uc3Qgc3RkOjpzdHJpbmcsIEZpZWxkRGVzYz4gJmt2IDogbU1hcCkgeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSA9IGt2LmZpcnN0OworICAgICAgICBjb25zdCBGaWVsZERlc2MgJmRlc2MgPSBrdi5zZWNvbmQ7CisgICAgICAgIGlmIChwYXJhbXNNYXAuY291bnQoZGVzYy5wYXJhbURlc2MtPmluZGV4KCkpID09IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEMyUGFyYW0gKnBhcmFtID0gcGFyYW1zTWFwW2Rlc2MucGFyYW1EZXNjLT5pbmRleCgpXTsKKyAgICAgICAgVmFsdWUgdmFsdWU7CisKKyAgICAgICAgLy8gaGFuZGxlIHdob2xlIHBhcmFtcyBmaXJzdAorICAgICAgICBpZiAoIWRlc2MuZmllbGREZXNjKSB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWYgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkocGFyYW0sIHBhcmFtLT5zaXplKCkpOworICAgICAgICAgICAgdmFsdWUuc2V0KGJ1Zik7CisgICAgICAgICAgICByZXQuZW1wbGFjZShuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBvZmZzZXQgPSBzaXplb2YoQzJQYXJhbSkgKyBkZXNjLm9mZnNldAorICAgICAgICAgICAgICAgICsgX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldCgqZGVzYy5maWVsZERlc2MpOworICAgICAgICB1aW50OF90ICpkYXRhID0gKHVpbnQ4X3QgKilwYXJhbSArIG9mZnNldDsKKyAgICAgICAgQzJGaWVsZERlc2NyaXB0b3I6OnR5cGVfdCBmaWVsZFR5cGUgPSBkZXNjLmZpZWxkRGVzYy0+dHlwZSgpOworICAgICAgICBzd2l0Y2ggKGZpZWxkVHlwZSkgeworICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSSU5HOiB7CisgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCA9IGRlc2MuZmllbGREZXNjLT5leHRlbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gcGFyYW0tPnNpemUoKSAtIG9mZnNldDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocGFyYW0tPnNpemUoKSA8IGxlbmd0aCB8fCBwYXJhbS0+c2l6ZSgpIC0gbGVuZ3RoIDwgb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJwYXJhbSB0b28gc21hbGwgZm9yIHN0cmluZzogbGVuZ3RoICV6dSBzaXplICV6dSBvZmZzZXQgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsIHBhcmFtLT5zaXplKCksIG9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YWx1ZS5zZXQoQVN0cmluZygoY2hhciAqKWRhdGEsIHN0cm5sZW4oKGNoYXIgKilkYXRhLCBsZW5ndGgpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkJMT0I6IHsKKyAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoID0gZGVzYy5maWVsZERlc2MtPmV4dGVudCgpOworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBwYXJhbS0+c2l6ZSgpIC0gb2Zmc2V0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwYXJhbS0+c2l6ZSgpIDwgbGVuZ3RoIHx8IHBhcmFtLT5zaXplKCkgLSBsZW5ndGggPCBvZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoInBhcmFtIHRvbyBzbWFsbCBmb3IgYmxvYjogbGVuZ3RoICV6dSBzaXplICV6dSBvZmZzZXQgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsIHBhcmFtLT5zaXplKCksIG9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZiA9IEFCdWZmZXI6OkNyZWF0ZUFzQ29weShkYXRhLCBsZW5ndGgpOworICAgICAgICAgICAgICAgIHZhbHVlLnNldChidWYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgc2l6ZV90IHZhbHVlU2l6ZSA9IEMyVmFsdWU6OlNpemVGb3IoKEMyVmFsdWU6OnR5cGVfdClmaWVsZFR5cGUpOworICAgICAgICAgICAgICAgIGlmIChwYXJhbS0+c2l6ZSgpIDwgdmFsdWVTaXplIHx8IHBhcmFtLT5zaXplKCkgLSB2YWx1ZVNpemUgPCBvZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoInBhcmFtIHRvbyBzbWFsbCBmb3IgYzJ2YWx1ZTogc2l6ZSAlenUgb2Zmc2V0ICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0tPnNpemUoKSwgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQzJWYWx1ZSBjMlZhbHVlOworICAgICAgICAgICAgICAgIHN3aXRjaCAoZmllbGRUeXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDMyOiAgYzJWYWx1ZSA9ICooKGludDMyX3QgKilkYXRhKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQzMjogYzJWYWx1ZSA9ICooKHVpbnQzMl90ICopZGF0YSk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpDTlRSMzI6IGMyVmFsdWUgPSAqKChjMl9jbnRyMzJfdCAqKWRhdGEpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UNjQ6ICBjMlZhbHVlID0gKigoaW50NjRfdCAqKWRhdGEpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDY0OiBjMlZhbHVlID0gKigodWludDY0X3QgKilkYXRhKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkNOVFI2NDogYzJWYWx1ZSA9ICooKGMyX2NudHI2NF90ICopZGF0YSk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpGTE9BVDogIGMyVmFsdWUgPSAqKChmbG9hdCAqKWRhdGEpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJVbnN1cHBvcnRlZCBkYXRhIHR5cGUgZm9yICVzIiwgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YWx1ZS5zZXQoYzJWYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0LmVtcGxhY2UobmFtZSwgdmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6Y2xlYXIoKSB7CisgICAgbU1hcC5jbGVhcigpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1JlZmxlY3RlZFBhcmFtVXBkYXRlci5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1JlZmxlY3RlZFBhcmFtVXBkYXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MzZiYTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUmVmbGVjdGVkUGFyYW1VcGRhdGVyLmgKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFJFRkxFQ1RFRF9QQVJBTV9CVUlMREVSX0hfCisjZGVmaW5lIFJFRkxFQ1RFRF9QQVJBTV9CVUlMREVSX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8QzIuaD4KKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB0byBxdWVyeSBhbmQgdXBkYXRlIENvZGVjIDIuMCBjb25maWd1cmF0aW9uIHZhbHVlcy4gVXNlIGN1c3RvbSBkaWN0aW9uYXJ5IGFzCisgKiBBTWVzc2FnZSBjYW5ub3QgcmVwcmVzZW50IGFsbCB0eXBlcyBvZiBDb2RlYyAyLjAgcGFyYW1ldGVycyBhbmQgQzJWYWx1ZSBjYW5ub3QgcmVwcmVzZW50CisgKiBhbGwgdHlwZXMgb2YgU0RLIHZhbHVlcy4gV2Ugd2FudCB0byBiZSBwcmVjaXNlIHdoZW4gc2V0dGluZyBzdGFuZGFyZCBwYXJhbWV0ZXJzICh1c2UgQzJWYWx1ZQorICogZm9yIGFyaXRobWV0aWMgdmFsdWVzKSwgYnV0IGFsc28gc3VwcG9ydCBpbnQzMiBhbmQgaW50NjQgZm9yIFNESyB2YWx1ZXMgc3BlY2lmaWNhbGx5IGZvcgorICogdmVuZG9yIHBhcmFtZXRlcnMgKGFzIFNESyBBUEkgZG9lcyBub3QgYWxsb3cgc3BlY2lmeWluZyBwcm9wZXIgdHlwZS4pIFdoZW4gcXVlcnlpbmcgZmllbGRzLAorICogd2UgY2FuIHVzZSBDMlZhbHVlcyBhcyB0aGV5IGFyZSBkZWZpbmVkLgorICoKKyAqICAgICAgSXRlbSA9PiBDb2RlYyAyLjAgdmFsdWUgbWFwcGluZ3M6CisgKiAgICAgQ1ZhbHVlOjp0eXBlID0+IHR5cGUKKyAqICAgICBpbnQzMiA9PiBpbnQzMiwgY3RyMzIgb3IgdWludDMyCisgKiAgICAgaW50NjQgPT4gaW50NjQsIGN0cjY0IG9yIHVpbnQ2NAorICogICAgIEFTdHJpbmcgPT4gc3RyaW5nCisgKiAgICAgQUJ1ZmZlciA9PiBibG9iCisgKiAgICAgJ1JlY3QnID0+IEMyUmVjdFN0cnVjdCAobm90IGV4cG9zZWQgaW4gU0RLIGFzIGEgcmVjdGFuZ2xlKQorICovCitjbGFzcyBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXIgeworcHVibGljOgorICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlcigpID0gZGVmYXVsdDsKKyAgICB+UmVmbGVjdGVkUGFyYW1VcGRhdGVyKCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogRWxlbWVudCBmb3IgdmFsdWVzCisgICAgICovCisgICAgc3RydWN0IFZhbHVlIDogcHVibGljIEFEYXRhPEMyVmFsdWUsIGludDMyX3QsIGludDY0X3QsIEFTdHJpbmcsIHNwPEFCdWZmZXI+Pjo6QmFzaWMgeworICAgICAgICAvLyBhbGxvdyBjb25zdHJ1Y3Rpb24gZnJvbSBiYXNlIHR5cGVzCisgICAgICAgIFZhbHVlKCkgPSBkZWZhdWx0OworICAgICAgICBleHBsaWNpdCBWYWx1ZShDMlZhbHVlIGkpICAgICAgICAgICAgeyBzZXQoaSk7IH0KKyAgICAgICAgZXhwbGljaXQgVmFsdWUoaW50MzJfdCBpKSAgICAgICAgICAgIHsgc2V0KGkpOyB9CisgICAgICAgIGV4cGxpY2l0IFZhbHVlKGludDY0X3QgaSkgICAgICAgICAgICB7IHNldChpKTsgfQorICAgICAgICBleHBsaWNpdCBWYWx1ZShjb25zdCBBU3RyaW5nICZpKSAgICAgeyBzZXQoaSk7IH0KKyAgICAgICAgZXhwbGljaXQgVmFsdWUoY29uc3Qgc3A8QUJ1ZmZlcj4gJmkpIHsgc2V0KGkpOyB9CisgICAgfTsKKworICAgIHN0cnVjdCBEaWN0IDogcHVibGljIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBWYWx1ZT4geworICAgICAgICBEaWN0KCkgPSBkZWZhdWx0OworICAgICAgICBzdGQ6OnN0cmluZyBkZWJ1Z1N0cmluZyhzaXplX3QgaW5kZW50ID0gMCkgY29uc3Q7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEVudW1lcmF0ZXMgYWxsIGZpZWxkcyBvZiB0aGUgcGFyYW1ldGVyIGRlc2NyaXB0b3JzIHN1cHBsaWVkLCBzbyB0aGF0IHRoaXMgb3BiamVjdCBjYW4gbGF0ZXIKKyAgICAgKiBxdWVyeSBhbmQgdXBkYXRlIHRoZXNlLgorICAgICAqCisgICAgICogRm9yIG5vdyBvbmx5IGZpcnN0LWxldmVsIGZpZWxkcyBhcmUgc3VwcG9ydGVkLiBBbHNvLCBhcnJheSBmaWVsZHMgYXJlIG5vdCBzdXBwb3J0ZWQuCisgICAgICoKKyAgICAgKiBccGFyYW0gcmVmbGVjdG9yICAgQzJQYXJhbVJlZmxlY3RvciBvYmplY3QgZm9yIEMyUGFyYW0gcmVmbGVjdGlvbi4KKyAgICAgKiBccGFyYW0gcGFyYW1EZXNjcyAgdmVjdG9yIG9mIEMyUGFyYW1EZXNjcmlwdG9yIG9iamVjdHMgdGhhdCB0aGlzIG9iamVjdAorICAgICAqICAgICAgICAgICAgICAgICAgICB3b3VsZCByZWNvZ25pemUgd2hlbiBidWlsZGluZyBwYXJhbXMuCisgICAgICovCisgICAgdm9pZCBhZGRQYXJhbURlc2MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvciwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICZwYXJhbURlc2NzKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgZmllbGRzIG9mIGEgc3RhbmRhcmQgcGFyYW1ldGVyICh0aGF0IG1heSBub3QgYmUgc3VwcG9ydGVkIGJ5IHRoZSBwYXJhbWV0ZXIgcmVmbGVjdG9yCisgICAgICogb3IgbWF5IG5vdCBiZSBsaXN0ZWQgYXMgYSBzdXBwb3J0ZWQgdmFsdWUgYnkgdGhlIGNvbXBvbmVudCkuIElmIHRoZSBwYXJhbWV0ZXIgbmFtZSBpcworICAgICAqIHVzZWQgZm9yIGFub3RoZXIgcGFyYW1ldGVyLCB0aGlzIG9wZXJhdGlvbiBpcyBhIG5vLW9wLiAoVGVjaG5pY2FsbHksIHRoaXMgaXMgYnkgZmllbGRzKS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBUIHN0YW5kYXJkIHBhcmFtZXRlciB0eXBlCisgICAgICogXHBhcmFtIG5hbWUgcGFyYW1ldGVyIG5hbWUKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHZvaWQgYWRkU3RhbmRhcmRQYXJhbShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgQzJQYXJhbURlc2NyaXB0b3I6OmF0dHJpYl90IGF0dHJpYiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW1EZXNjcmlwdG9yOjpJU19SRUFEX09OTFkpIHsKKyAgICAgICAgYWRkUGFyYW1EZXNjKHN0ZDo6bWFrZV9zaGFyZWQ8QzJQYXJhbURlc2NyaXB0b3I+KAorICAgICAgICAgICAgICAgIEMyUGFyYW06OkluZGV4KFQ6OlBBUkFNX1RZUEUpLCBhdHRyaWIsIG5hbWUuY19zdHIoKSksCisgICAgICAgICAgICAgICAgQzJTdHJ1Y3REZXNjcmlwdG9yKChUKiludWxscHRyKSwgbnVsbHB0ciAvKiBkZXNjcmlwdG9yICovKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGZpZWxkcyBvZiBhIHN0cnVjdHVyZSAob3IgYSBwYXJhbWVhdGVyKSBkZXNjcmliZWQgYnkgdGhlIHN0cnVjdCBkZXNjcmlwdG9yLiBJZgorICAgICAqIHJlZmxlY3RvciBpcyBwcm92aWRlZCwgZmllbGRzIG9mIHN1Yi1zdHJ1Y3R1cmVzIGFyZSBhbHNvIGFkZGVkLiBPdGhlcndpc2UsIG9ubHkgdG9wLWxldmVsCisgICAgICogZnVuZGFtZW50YWwgdHlwZWQgZmllbGRzIChhcml0aG1ldGljLCBzdHJpbmcgYW5kIGJsb2IpIGFyZSBhZGRlZC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwYXJhbURlc2MgcGFyYW1ldGVyIGRlc2NyaXB0b3IKKyAgICAgKiBccGFyYW0gZmllbGREZXNjIGZpZWxkIGRlc2NyaXB0b3IKKyAgICAgKiBccGFyYW0gcGF0aCBwYXRoL25hbWUgb2YgdGhlIHN0cnVjdHVyZSAoZmllbGQgb3IgcGFyZW50IHBhcmFtZXRlcikKKyAgICAgKiBccGFyYW0gb2Zmc2V0IG9mZnNldCBvZiB0aGUgc3RydWN0dXJlIGluIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiBccGFyYW0gcmVmbGVjdG9yICBDMlBhcmFtUmVmbGVjdG9yIG9iamVjdCBmb3IgQzJQYXJhbSByZWZsZWN0aW9uIChtYXkgYmUgbnVsbCkKKyAgICAgKi8KKyAgICB2b2lkIGFkZFBhcmFtU3RydWN0RGVzYygKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gcGFyYW1EZXNjLCBDMlN0cmluZyBwYXRoLCBzaXplX3Qgb2Zmc2V0LAorICAgICAgICAgICAgY29uc3QgQzJTdHJ1Y3REZXNjcmlwdG9yICZzdHJ1Y3REZXNjLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpOworCisgICAgLyoqCisgICAgICogQWRkcyBmaWVsZHMgb2YgYSBwYXJhbWV0ZXIgZGVzY3JpYmVkIGJ5IHRoZSBzdHJ1Y3QgZGVzY3JpcHRvci4gSWYgcmVmbGVjdG9yIGlzIHByb3ZpZGVkLAorICAgICAqIGZpZWxkcyBvZiBzdWItc3RydWN0dXJlcyBhcmUgYWxzbyBhZGRlZC4gT3RoZXJ3aXNlLCBvbmx5IHRvcC1sZXZlbCBmdW5kYW1lbnRhbCB0eXBlZCBmaWVsZHMKKyAgICAgKiAoYXJpdGhtZXRpYywgc3RyaW5nIGFuZCBibG9iKSBhcmUgYWRkZWQuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW1EZXNjIHBhcmFtZXRlciBkZXNjcmlwdG9yCisgICAgICogXHBhcmFtIGZpZWxkRGVzYyBmaWVsZCBkZXNjcmlwdG9yCisgICAgICogXHBhcmFtIHJlZmxlY3RvciAgQzJQYXJhbVJlZmxlY3RvciBvYmplY3QgZm9yIEMyUGFyYW0gcmVmbGVjdGlvbiAobWF5IGJlIG51bGwpCisgICAgICogXHBhcmFtIG1hcmtWZW5kb3IgVEVNUCBpZiB0cnVlLCBwcmVmaXggdmVuZG9yIHBhcmFtZXRlciBuYW1lcyB3aXRoICJ2ZW5kb3IuIgorICAgICAqLworICAgIHZvaWQgYWRkUGFyYW1EZXNjKAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiBwYXJhbURlc2MsIGNvbnN0IEMyU3RydWN0RGVzY3JpcHRvciAmc3RydWN0RGVzYywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yLAorICAgICAgICAgICAgYm9vbCBtYXJrVmVuZG9yID0gdHJ1ZSk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgc3VwcG9ydCBmb3Igc2V0dGluZyBhIHBhcmFtZXRlciBhcyBhIGJpbmFyeSBibG9iLgorICAgICAqCisgICAgICogXHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyCisgICAgICogXHBhcmFtIGNvcmVJbmRleCBwYXJhbWV0ZXIgKGNvcmUpIGluZGV4CisgICAgICovCisgICAgdm9pZCBzdXBwb3J0V2hvbGVQYXJhbShzdGQ6OnN0cmluZyBuYW1lLCBDMlBhcmFtOjpDb3JlSW5kZXggY29yZUluZGV4KTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBmb3IgYW4gaW5kZXguCisgICAgICovCisgICAgc3RkOjpzdHJpbmcgZ2V0UGFyYW1OYW1lKEMyUGFyYW06OkluZGV4IGluZGV4KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEdldCBsaXN0IG9mIHBhcmFtIGluZGljZXMgZnJvbSBmaWVsZCBuYW1lcyBhbmQgdmFsdWVzIGluIEFNZXNzYWdlIG9iamVjdC4KKyAgICAgKgorICAgICAqIFRPRE86IFRoaXMgc2hvdWxkIGJlIGluIHRoZSBvcmRlciB0aGF0IHRoZXkgYXJlIGxpc3RlZCBieSB0aGUgY29tcG9uZW50LgorICAgICAqCisgICAgICogXHBhcmFtIHBhcmFtc1tpbl0gIERpY3Qgb2JqZWN0IHdpdGggZmllbGQgbmFtZSB0byB2YWx1ZSBwYWlycy4KKyAgICAgKiBccGFyYW0gdmVjW291dF0gICAgdmVjdG9yIHRvIHN0b3JlIHRoZSBpbmRpY2VzIGZyb20gfHBhcmFtc3wuCisgICAgICovCisgICAgdm9pZCBnZXRQYXJhbUluZGljZXNGcm9tTWVzc2FnZSgKKyAgICAgICAgICAgIGNvbnN0IERpY3QgJnBhcmFtcywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAqdmVjIC8qIG5vbm51bGwgKi8pIGNvbnN0OworCisgICAgLyoqCisgICAgICogR2V0IGxpc3Qgb2YgcGFyYW0gaW5kaWNlcyBmcm9tIGZpZWxkIG5hbWVzIChvbmx5KSBpbiBBTWVzc2FnZSBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW1zW2luXSAgVmVjdG9yIG9iamVjdCB3aXRoIGZpZWxkIG5hbWVzLgorICAgICAqIFxwYXJhbSB2ZWNbb3V0XSAgICB2ZWN0b3IgdG8gc3RvcmUgdGhlIGluZGljZXMgZnJvbSB8cGFyYW1zfC4KKyAgICAgKi8KKyAgICB2b2lkIGdldFBhcmFtSW5kaWNlc0ZvcktleXMoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmtleXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gKnZlYyAvKiBub25udWxsICovKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFVwZGF0ZSBDMlBhcmFtIG9iamVjdHMgZnJvbSBmaWVsZCBuYW1lIGFuZCB2YWx1ZSBpbiBBTWVzc2FnZSBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW1zW2luXSAgICBEaWN0IG9iamVjdCB3aXRoIGZpZWxkIG5hbWUgdG8gdmFsdWUgcGFpcnMuCisgICAgICogXHBhcmFtIHZlY1tpbixvdXRdICAgdmVjdG9yIG9mIHRoZSBDMlBhcmFtIG9iamVjdHMgdG8gYmUgdXBkYXRlZC4KKyAgICAgKi8KKyAgICB2b2lkIHVwZGF0ZVBhcmFtc0Zyb21NZXNzYWdlKAorICAgICAgICAgICAgY29uc3QgRGljdCAmcGFyYW1zLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqdmVjIC8qIG5vbm51bGwgKi8pIGNvbnN0OworCisgICAgLyoqCisgICAgICogR2V0IGZpZWxkcyBmcm9tIEMyUGFyYW0gb2JqZWN0cyBpbiBBTWVzc2FnZSBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW1zW2luXSAgICB2ZWN0b3Igb2YgdGhlIEMyUGFyYW0gb2JqZWN0cyB0byBiZSBxdWVyaWVkCisgICAgICogXHJldHVybiBhIERpY3Qgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGtub3duIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBEaWN0IGdldFBhcmFtcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zIC8qIG5vbm51bGwgKi8pIGNvbnN0OworCisgICAgRGljdCBnZXRQYXJhbXMoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICZwYXJhbXMgLyogbm9ubnVsbCAqLykgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBDbGVhciBwYXJhbSBkZXNjcmlwdG9ycyBpbiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyKCk7CisKK3ByaXZhdGU6CisgICAgc3RydWN0IEZpZWxkRGVzYyB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gcGFyYW1EZXNjOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkRGVzYzsKKyAgICAgICAgc2l6ZV90IG9mZnNldDsKKyAgICB9OworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBGaWVsZERlc2M+IG1NYXA7CisgICAgc3RkOjptYXA8QzJQYXJhbTo6SW5kZXgsIHN0ZDo6c3RyaW5nPiBtUGFyYW1OYW1lczsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgQzJQYXJhbTo6Q29yZUluZGV4PiBtV2hvbGVQYXJhbXM7CisKKyAgICB2b2lkIHBhcnNlTWVzc2FnZUFuZERvV29yaygKKyAgICAgICAgICAgIGNvbnN0IERpY3QgJnBhcmFtcywKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnN0cmluZyAmLCBjb25zdCBGaWVsZERlc2MgJiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpPiB3b3JrKSBjb25zdDsKKworICAgIEMyX0RPX05PVF9DT1BZKFJlZmxlY3RlZFBhcmFtVXBkYXRlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFJFRkxFQ1RFRF9QQVJBTV9CVUlMREVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vU2tpcEN1dEJ1ZmZlci5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vU2tpcEN1dEJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc2MjQ0MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Ta2lwQ3V0QnVmZmVyLmNwcApAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU2tpcEN1dEJ1ZmZlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Ta2lwQ3V0QnVmZmVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworU2tpcEN1dEJ1ZmZlcjo6U2tpcEN1dEJ1ZmZlcihzaXplX3Qgc2tpcCwgc2l6ZV90IGN1dCwgc2l6ZV90IG51bTE2Qml0Q2hhbm5lbHMpIHsKKworICAgIG1Xcml0ZUhlYWQgPSAwOworICAgIG1SZWFkSGVhZCA9IDA7CisgICAgbUNhcGFjaXR5ID0gMDsKKyAgICBtQ3V0QnVmZmVyID0gbnVsbHB0cjsKKworICAgIGlmIChudW0xNkJpdENoYW5uZWxzID09IDAgfHwgbnVtMTZCaXRDaGFubmVscyA+IElOVDMyX01BWCAvIDIpIHsKKyAgICAgICAgQUxPR1coIiMgY2hhbm5lbHMgb3V0IG9mIHJhbmdlOiAlenUsIHVzaW5nIHBhc3N0aHJvdWdoIGluc3RlYWQiLCBudW0xNkJpdENoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzaXplX3QgZnJhbWVTaXplID0gbnVtMTZCaXRDaGFubmVscyAqIDI7CisgICAgaWYgKHNraXAgPiBJTlQzMl9NQVggLyBmcmFtZVNpemUgfHwgY3V0ID4gSU5UMzJfTUFYIC8gZnJhbWVTaXplCisgICAgICAgICAgICB8fCBjdXQgKiBmcmFtZVNpemUgPiBJTlQzMl9NQVggLSA0MDk2KSB7CisgICAgICAgIEFMT0dXKCJvdXQgb2YgcmFuZ2Ugc2tpcC9jdXQ6ICV6dS8lenUsIHVzaW5nIHBhc3N0aHJvdWdoIGluc3RlYWQiLAorICAgICAgICAgICAgICAgIHNraXAsIGN1dCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2tpcCAqPSBmcmFtZVNpemU7CisgICAgY3V0ICo9IGZyYW1lU2l6ZTsKKworICAgIG1Gcm9udFBhZGRpbmcgPSBtU2tpcCA9IHNraXA7CisgICAgbUJhY2tQYWRkaW5nID0gY3V0OworICAgIG1DYXBhY2l0eSA9IGN1dCArIDQwOTY7CisgICAgbUN1dEJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSBjaGFyW21DYXBhY2l0eV07CisgICAgQUxPR1YoInNraXBjdXRidWZmZXIgJXp1ICV6dSAlZCIsIHNraXAsIGN1dCwgbUNhcGFjaXR5KTsKK30KKworU2tpcEN1dEJ1ZmZlcjo6flNraXBDdXRCdWZmZXIoKSB7CisgICAgZGVsZXRlW10gbUN1dEJ1ZmZlcjsKK30KKwordm9pZCBTa2lwQ3V0QnVmZmVyOjpzdWJtaXQoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgeworICAgIGlmIChtQ3V0QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgLy8gcGFzc3Rocm91Z2ggbW9kZQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MzJfdCBvZmZzZXQgPSBidWZmZXItPnJhbmdlX29mZnNldCgpOworICAgIGludDMyX3QgYnVmbGVuID0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKworICAgIC8vIGRyb3AgdGhlIGluaXRpYWwgZGF0YSBmcm9tIHRoZSBidWZmZXIgaWYgbmVlZGVkCisgICAgaWYgKG1Gcm9udFBhZGRpbmcgPiAwKSB7CisgICAgICAgIC8vIHN0aWxsIGRhdGEgbGVmdCB0byBkcm9wCisgICAgICAgIGludDMyX3QgdG9fZHJvcCA9IChidWZsZW4gPCBtRnJvbnRQYWRkaW5nKSA/IGJ1ZmxlbiA6IG1Gcm9udFBhZGRpbmc7CisgICAgICAgIG9mZnNldCArPSB0b19kcm9wOworICAgICAgICBidWZsZW4gLT0gdG9fZHJvcDsKKyAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2Uob2Zmc2V0LCBidWZsZW4pOworICAgICAgICBtRnJvbnRQYWRkaW5nIC09IHRvX2Ryb3A7CisgICAgfQorCisKKyAgICAvLyBhcHBlbmQgZGF0YSB0byBjdXRidWZmZXIKKyAgICBjaGFyICpzcmMgPSAoKGNoYXIqKSBidWZmZXItPmRhdGEoKSkgKyBvZmZzZXQ7CisgICAgd3JpdGUoc3JjLCBidWZsZW4pOworCisKKyAgICAvLyB0aGUgbWVkaWFidWZmZXIgaXMgbm93IGVtcHR5LiBGaWxsIGl0IGZyb20gY3V0YnVmZmVyLCBhbHdheXMgbGVhdmluZworICAgIC8vIGF0IGxlYXN0IG1CYWNrUGFkZGluZyBieXRlcyBpbiB0aGUgY3V0YnVmZmVyCisgICAgY2hhciAqZHN0ID0gKGNoYXIqKSBidWZmZXItPmRhdGEoKTsKKyAgICBzaXplX3QgY29waWVkID0gcmVhZChkc3QsIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBidWZmZXItPnNldF9yYW5nZSgwLCBjb3BpZWQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgU2tpcEN1dEJ1ZmZlcjo6c3VibWl0SW50ZXJuYWwoY29uc3Qgc3A8VD4mIGJ1ZmZlcikgeworICAgIGlmIChtQ3V0QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgLy8gcGFzc3Rocm91Z2ggbW9kZQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MzJfdCBvZmZzZXQgPSBidWZmZXItPm9mZnNldCgpOworICAgIGludDMyX3QgYnVmbGVuID0gYnVmZmVyLT5zaXplKCk7CisKKyAgICAvLyBkcm9wIHRoZSBpbml0aWFsIGRhdGEgZnJvbSB0aGUgYnVmZmVyIGlmIG5lZWRlZAorICAgIGlmIChtRnJvbnRQYWRkaW5nID4gMCkgeworICAgICAgICAvLyBzdGlsbCBkYXRhIGxlZnQgdG8gZHJvcAorICAgICAgICBpbnQzMl90IHRvX2Ryb3AgPSAoYnVmbGVuIDwgbUZyb250UGFkZGluZykgPyBidWZsZW4gOiBtRnJvbnRQYWRkaW5nOworICAgICAgICBvZmZzZXQgKz0gdG9fZHJvcDsKKyAgICAgICAgYnVmbGVuIC09IHRvX2Ryb3A7CisgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2Uob2Zmc2V0LCBidWZsZW4pOworICAgICAgICBtRnJvbnRQYWRkaW5nIC09IHRvX2Ryb3A7CisgICAgfQorCisKKyAgICAvLyBhcHBlbmQgZGF0YSB0byBjdXRidWZmZXIKKyAgICBjaGFyICpzcmMgPSAoY2hhciopIGJ1ZmZlci0+ZGF0YSgpOworICAgIHdyaXRlKHNyYywgYnVmbGVuKTsKKworCisgICAgLy8gdGhlIG1lZGlhYnVmZmVyIGlzIG5vdyBlbXB0eS4gRmlsbCBpdCBmcm9tIGN1dGJ1ZmZlciwgYWx3YXlzIGxlYXZpbmcKKyAgICAvLyBhdCBsZWFzdCBtQmFja1BhZGRpbmcgYnl0ZXMgaW4gdGhlIGN1dGJ1ZmZlcgorICAgIGNoYXIgKmRzdCA9IChjaGFyKikgYnVmZmVyLT5iYXNlKCk7CisgICAgc2l6ZV90IGNvcGllZCA9IHJlYWQoZHN0LCBidWZmZXItPmNhcGFjaXR5KCkpOworICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgY29waWVkKTsKK30KKwordm9pZCBTa2lwQ3V0QnVmZmVyOjpzdWJtaXQoY29uc3Qgc3A8QUJ1ZmZlcj4mIGJ1ZmZlcikgeworICAgIHN1Ym1pdEludGVybmFsKGJ1ZmZlcik7Cit9CisKK3ZvaWQgU2tpcEN1dEJ1ZmZlcjo6c3VibWl0KGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+JiBidWZmZXIpIHsKKyAgICBzdWJtaXRJbnRlcm5hbChidWZmZXIpOworfQorCit2b2lkIFNraXBDdXRCdWZmZXI6OmNsZWFyKCkgeworICAgIG1Xcml0ZUhlYWQgPSBtUmVhZEhlYWQgPSAwOworICAgIG1Gcm9udFBhZGRpbmcgPSBtU2tpcDsKK30KKwordm9pZCBTa2lwQ3V0QnVmZmVyOjp3cml0ZShjb25zdCBjaGFyICpzcmMsIHNpemVfdCBudW0pIHsKKyAgICBpbnQzMl90IHNpemV1c2VkID0gKG1Xcml0ZUhlYWQgLSBtUmVhZEhlYWQpOworICAgIGlmIChzaXpldXNlZCA8IDApIHNpemV1c2VkICs9IG1DYXBhY2l0eTsKKworICAgIC8vIEV2ZXJ5dGhpbmcgbXVzdCBmaXQuIE1ha2Ugc3VyZSB0aGUgYnVmZmVyIGlzIGEgbGl0dGxlIGxhcmdlciB0aGFuIG5lZWRlZCwKKyAgICAvLyBzbyB0aGVyZSBpcyBubyBhbWJpZ3VpdHkgYXMgdG8gd2hldGhlciBtV3JpdGVIZWFkID09IG1SZWFkSGVhZCBtZWFucyBidWZmZXIKKyAgICAvLyBmdWxsIG9yIGVtcHR5CisgICAgc2l6ZV90IGF2YWlsYWJsZSA9IG1DYXBhY2l0eSAtIHNpemV1c2VkIC0gMzI7CisgICAgaWYgKGF2YWlsYWJsZSA8IG51bSkgeworICAgICAgICBpbnQzMl90IG5ld2NhcGFjaXR5ID0gbUNhcGFjaXR5ICsgKG51bSAtIGF2YWlsYWJsZSk7CisgICAgICAgIGNoYXIgKiBuZXdidWZmZXIgPSBuZXcgY2hhcltuZXdjYXBhY2l0eV07CisgICAgICAgIG1lbWNweShuZXdidWZmZXIsIG1DdXRCdWZmZXIsIG1DYXBhY2l0eSk7CisgICAgICAgIGRlbGV0ZSBbXSBtQ3V0QnVmZmVyOworICAgICAgICBtQ2FwYWNpdHkgPSBuZXdjYXBhY2l0eTsKKyAgICAgICAgbUN1dEJ1ZmZlciA9IG5ld2J1ZmZlcjsKKyAgICAgICAgQUxPR1YoInJlYWxsb2NhdGVkIGJ1ZmZlciBhdCBzaXplICVkIiwgbmV3Y2FwYWNpdHkpOworICAgIH0KKworICAgIHNpemVfdCBjb3B5Zmlyc3QgPSAobUNhcGFjaXR5IC0gbVdyaXRlSGVhZCk7CisgICAgaWYgKGNvcHlmaXJzdCA+IG51bSkgY29weWZpcnN0ID0gbnVtOworICAgIGlmIChjb3B5Zmlyc3QpIHsKKyAgICAgICAgbWVtY3B5KG1DdXRCdWZmZXIgKyBtV3JpdGVIZWFkLCBzcmMsIGNvcHlmaXJzdCk7CisgICAgICAgIG51bSAtPSBjb3B5Zmlyc3Q7CisgICAgICAgIHNyYyArPSBjb3B5Zmlyc3Q7CisgICAgICAgIG1Xcml0ZUhlYWQgKz0gY29weWZpcnN0OworICAgICAgICBDSEVDS19MRShtV3JpdGVIZWFkLCBtQ2FwYWNpdHkpOworICAgICAgICBpZiAobVdyaXRlSGVhZCA9PSBtQ2FwYWNpdHkpIG1Xcml0ZUhlYWQgPSAwOworICAgICAgICBpZiAobnVtKSB7CisgICAgICAgICAgICBtZW1jcHkobUN1dEJ1ZmZlciwgc3JjLCBudW0pOworICAgICAgICAgICAgbVdyaXRlSGVhZCArPSBudW07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NpemVfdCBTa2lwQ3V0QnVmZmVyOjpyZWFkKGNoYXIgKmRzdCwgc2l6ZV90IG51bSkgeworICAgIGludDMyX3QgYXZhaWxhYmxlID0gKG1Xcml0ZUhlYWQgLSBtUmVhZEhlYWQpOworICAgIGlmIChhdmFpbGFibGUgPCAwKSBhdmFpbGFibGUgKz0gbUNhcGFjaXR5OworCisgICAgYXZhaWxhYmxlIC09IG1CYWNrUGFkZGluZzsKKyAgICBpZiAoYXZhaWxhYmxlIDw9MCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGF2YWlsYWJsZSA8IGludDMyX3QobnVtKSkgeworICAgICAgICBudW0gPSBhdmFpbGFibGU7CisgICAgfQorCisgICAgc2l6ZV90IGNvcHlmaXJzdCA9IChtQ2FwYWNpdHkgLSBtUmVhZEhlYWQpOworICAgIGlmIChjb3B5Zmlyc3QgPiBudW0pIGNvcHlmaXJzdCA9IG51bTsKKyAgICBpZiAoY29weWZpcnN0KSB7CisgICAgICAgIG1lbWNweShkc3QsIG1DdXRCdWZmZXIgKyBtUmVhZEhlYWQsIGNvcHlmaXJzdCk7CisgICAgICAgIG51bSAtPSBjb3B5Zmlyc3Q7CisgICAgICAgIGRzdCArPSBjb3B5Zmlyc3Q7CisgICAgICAgIG1SZWFkSGVhZCArPSBjb3B5Zmlyc3Q7CisgICAgICAgIENIRUNLX0xFKG1SZWFkSGVhZCwgbUNhcGFjaXR5KTsKKyAgICAgICAgaWYgKG1SZWFkSGVhZCA9PSBtQ2FwYWNpdHkpIG1SZWFkSGVhZCA9IDA7CisgICAgICAgIGlmIChudW0pIHsKKyAgICAgICAgICAgIG1lbWNweShkc3QsIG1DdXRCdWZmZXIsIG51bSk7CisgICAgICAgICAgICBtUmVhZEhlYWQgKz0gbnVtOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhdmFpbGFibGU7Cit9CisKK3NpemVfdCBTa2lwQ3V0QnVmZmVyOjpzaXplKCkgeworICAgIGludDMyX3QgYXZhaWxhYmxlID0gKG1Xcml0ZUhlYWQgLSBtUmVhZEhlYWQpOworICAgIGlmIChhdmFpbGFibGUgPCAwKSBhdmFpbGFibGUgKz0gbUNhcGFjaXR5OworICAgIHJldHVybiBhdmFpbGFibGU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vU2tpcEN1dEJ1ZmZlci5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1NraXBDdXRCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmI1NjkwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1NraXBDdXRCdWZmZXIuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTS0lQX0NVVF9CVUZGRVJfSF8KKworI2RlZmluZSBTS0lQX0NVVF9CVUZGRVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogdXRpbGl0eSBjbGFzcyB0byBjdXQgdGhlIHN0YXJ0IGFuZCBlbmQgb2ZmIGEgc3RyZWFtIG9mIGRhdGEgaW4gTWVkaWFCdWZmZXJzCisgKgorICovCitjbGFzcyBTa2lwQ3V0QnVmZmVyOiBwdWJsaWMgUmVmQmFzZSB7CisgcHVibGljOgorICAgIC8vICdza2lwJyBpcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0byBza2lwIGZyb20gdGhlIGJlZ2lubmluZworICAgIC8vICdjdXQnIGlzIHRoZSBudW1iZXIgb2YgZnJhbWVzIHRvIGN1dCBmcm9tIHRoZSBlbmQKKyAgICAvLyAnbnVtMTZCaXRDaGFubmVscycgaXMgdGhlIG51bWJlciBvZiBjaGFubmVscywgd2hpY2ggYXJlIGFzc3VtZWQgdG8gYmUgMTYgYml0IHdpZGUgZWFjaAorICAgIFNraXBDdXRCdWZmZXIoc2l6ZV90IHNraXAsIHNpemVfdCBjdXQsIHNpemVfdCBudW0xNkNoYW5uZWxzKTsKKworICAgIC8vIFN1Ym1pdCBvbmUgTWVkaWFCdWZmZXIgZm9yIHNraXBwaW5nIGFuZCBjdXR0aW5nLiBUaGlzIG1heSBjb25zdW1lIGFsbCBvcgorICAgIC8vIHNvbWUgb2YgdGhlIGRhdGEgaW4gdGhlIGJ1ZmZlciwgb3IgaXQgbWF5IGFkZCBkYXRhIHRvIGl0LgorICAgIC8vIEFmdGVyIHRoaXMsIHRoZSBjYWxsZXIgc2hvdWxkIGNvbnRpbnVlIHByb2Nlc3NpbmcgdGhlIGJ1ZmZlciBhcyB1c3VhbC4KKyAgICB2b2lkIHN1Ym1pdChNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKKyAgICB2b2lkIHN1Ym1pdChjb25zdCBzcDxBQnVmZmVyPiYgYnVmZmVyKTsgICAgLy8gc2FtZSBhcyBhYm92ZSwgYnV0IHdpdGggYW4gQUJ1ZmZlcgorICAgIHZvaWQgc3VibWl0KGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+JiBidWZmZXIpOyAgICAvLyBzYW1lIGFzIGFib3ZlLCBidXQgd2l0aCBhbiBBQnVmZmVyCisgICAgdm9pZCBjbGVhcigpOworICAgIHNpemVfdCBzaXplKCk7IC8vIGhvdyBtYW55IGJ5dGVzIGFyZSBjdXJyZW50bHkgc3RvcmVkIGluIHRoZSBidWZmZXIKKworIHByb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5Ta2lwQ3V0QnVmZmVyKCk7CisKKyBwcml2YXRlOgorICAgIHZvaWQgd3JpdGUoY29uc3QgY2hhciAqc3JjLCBzaXplX3QgbnVtKTsKKyAgICBzaXplX3QgcmVhZChjaGFyICpkc3QsIHNpemVfdCBudW0pOworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIHZvaWQgc3VibWl0SW50ZXJuYWwoY29uc3Qgc3A8VD4mIGJ1ZmZlcik7CisgICAgaW50MzJfdCBtU2tpcDsKKyAgICBpbnQzMl90IG1Gcm9udFBhZGRpbmc7CisgICAgaW50MzJfdCBtQmFja1BhZGRpbmc7CisgICAgaW50MzJfdCBtV3JpdGVIZWFkOworICAgIGludDMyX3QgbVJlYWRIZWFkOworICAgIGludDMyX3QgbUNhcGFjaXR5OworICAgIGNoYXIqIG1DdXRCdWZmZXI7CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2tpcEN1dEJ1ZmZlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE9NWF9DT0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTdmNTVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1MiBAQAorY2NfdGVzdCB7CisgICAgbmFtZTogImNjb2RlY191bml0X3Rlc3QiLAorCisgICAgc3JjczogWworICAgICAgICAiUmVmbGVjdGVkUGFyYW1VcGRhdGVyX3Rlc3QuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2NvZGVjMi9zZnBsdWdpbiIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGlic2ZwbHVnaW5fY2NvZGVjIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJtY19zYW5pdHlfdGVzdCIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJNZWRpYUNvZGVjX3Nhbml0eV90ZXN0LmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4iLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlYyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL01lZGlhQ29kZWNfc2FuaXR5X3Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL01lZGlhQ29kZWNfc2FuaXR5X3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMzY4N2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvTWVkaWFDb2RlY19zYW5pdHlfdGVzdC5jcHAKQEAgLTAsMCArMSw0NTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1lZGlhQ29kZWNTYW5pdHlUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CitwdWJsaWM6CisgICAgTWVkaWFDb2RlY1Nhbml0eVRlc3QoKQorICAgICAgICA6IGxvb3BlcihuZXcgQUxvb3BlciksCisgICAgICAgICAgY2ZnKG5ldyBBTWVzc2FnZSksCisgICAgICAgICAgaWZtdChuZXcgQU1lc3NhZ2UpLAorICAgICAgICAgIG9mbXQobmV3IEFNZXNzYWdlKSB7CisgICAgICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKKyAgICAgICAgbG9vcGVyLT5zdGFydCgpOworICAgIH0KKworICAgIH5NZWRpYUNvZGVjU2FuaXR5VGVzdCgpIHsKKyAgICAgICAgaWYgKGNvZGVjICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNvZGVjLT5yZWxlYXNlKCk7CisgICAgICAgIH0KKyAgICAgICAgbG9vcGVyLT5zdG9wKCk7CisgICAgfQorCisgICAgc3A8QUxvb3Blcj4gbG9vcGVyOworICAgIHNwPE1lZGlhQ29kZWM+IGNvZGVjOworICAgIHNwPEFNZXNzYWdlPiBjZmc7CisgICAgc3A8QU1lc3NhZ2U+IGlmbXQ7CisgICAgc3A8QU1lc3NhZ2U+IG9mbXQ7Cit9OworCitjb25zdCBzdGF0aWMgc2l6ZV90IGtMaW5lYXJCdWZmZXJTaXplID0gMTA0ODU3NjsKKworLy8gZGF0YSBmb3IgYSBjb2RlYyBpbnB1dCBmcmFtZQorc3RydWN0IEZyYW1lRGF0YSB7CisgICAgY29uc3QgdWludDhfdCAqZGF0YTsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICB0ZW1wbGF0ZTxzaXplX3QgTj4KKyAgICBjb25zdGV4cHIgRnJhbWVEYXRhKGNvbnN0IHVpbnQ4X3QoJmRhdGFfKVtOXSkgOiBkYXRhKGRhdGFfKSwgc2l6ZShOKSB7IH0KK307CisKKy8vIG9uZSB5ZWxsb3cgZnJhbWUgb2YgMjQweDE4MCAoYWxiZWl0IDQ6NDo0KQorY29uc3QgdWludDhfdCBhdmNTdHJlYW1fQTFbXSA9IHsgLy8gSURSIGZyYW1lCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2NywgMHg2NCwgMHgwMCwgMHgwZCwgMHhhYywgMHhkOSwgMHg0MSwgMHg0MSwgMHhmYSwgMHgxMCwgMHgwMCwgMHgwMCwKKyAgICAweDAzLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAzLCAweDAzLCAweDIwLCAweGYxLCAweDQyLCAweDk5LCAweDYwLAorCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2OCwgMHhlYiwgMHhlMywgMHhjYiwgMHgyMiwgMHhjMCwKKworICAgIDB4MDAsIDB4MDAsIDB4MDEsIDB4NjUsIDB4ODgsIDB4ODQsIDB4MDAsIDB4MmIsIDB4ZmYsIDB4ZmUsIDB4ZDgsIDB4ZTcsIDB4ZjMsIDB4MmMsIDB4YTUsIDB4NjAsCisgICAgMHhjYSwgMHhiYiwgMHhmMSwgMHg1YywgMHg0NCwgMHg3YywgMHg5YSwgMHhhNSwgMHhjMywgMHhhYiwgMHgyZiwgMHg3NywgMHgwYSwgMHg5NCwgMHgwZCwgMHgxOSwKKyAgICAweDQzLCAweDNiLCAweDRmLCAweDI1LCAweGVhLCAweDY2LCAweDAwLCAweDAxLCAweDI0LCAweGNkLCAweDM1LCAweDVmLCAweGMyLCAweDM0LCAweDg5LCAweGQxLAorICAgIDB4YTUsIDB4NjAsIDB4MDksIDB4OTgsIDB4MDAsIDB4MDEsIDB4MWIsIDB4MGUsIDB4Y2IsIDB4MGQsIDB4MDQsIDB4ODYsIDB4OTQsIDB4ZTIsIDB4MzIsIDB4M2MsCisgICAgMHhkZCwgMHgwZiwKK307CisKK0ZyYW1lRGF0YSBhdmNTdHJlYW1fQVtdIF9fdW51c2VkID0geyBhdmNTdHJlYW1fQTEgfTsKKworLy8gQVZDIHN0cmVhbSBvZiAyIHllbGxvdyBmcmFtZXMgKDI0MHgxODApCitjb25zdCB1aW50OF90IGF2Y1N0cmVhbV9CMVtdID0geyAvLyBJRFIgZnJhbWUKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDY3LCAweDY0LCAweDAwLCAweDBjLCAweGFjLCAweGQ5LCAweDQxLCAweDQxLCAweGZhLCAweDEwLCAweDAwLCAweDAwLAorICAgIDB4MDMsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDIsIDB4ODAsIDB4ZjEsIDB4NDIsIDB4OTksIDB4NjAsCisKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDY4LCAweGViLCAweGUzLCAweGNiLCAweDIyLCAweGMwLAorCisgICAgMHgwMCwgMHgwMCwgMHgwMSwgMHg2NSwgMHg4OCwgMHg4NCwgMHgwMCwgMHgzMywgMHhmZiwgMHhmZSwgMHhkZiwgMHgzMiwgMHhmOCwgMHgxNCwgMHhkNiwgMHgyNSwKKyAgICAweGQwLCAweDc0LCAweDQyLCAweDUwLCAweDg0LCAweDZmLCAweGY0LCAweGMyLCAweDVjLCAweDc2LCAweDM3LCAweDE3LCAweDcyLCAweGFjLCAweDUyLCAweGZjLAorICAgIDB4ZDYsIDB4MWYsIDB4ZDIsIDB4ZDAsIDB4NjAsIDB4YjIsIDB4MjAsIDB4MDAsIDB4MTAsIDB4M2QsIDB4MmEsIDB4YzAsIDB4ZTQsIDB4MjcsIDB4Y2IsIDB4Y2UsCisgICAgMHhlYSwgMHgyNSwgMHgwMCwgMHg4MSwgMHgwMCwgMHgwMCwgMHgwZiwgMHg0MCwgMHhiYywgMHg4MSwgMHgxNSwgMHhjMSwgMHg2NSwgMHgyMCwgMHg4MCwgMHg4MSwKKyAgICAweDdhLCAweDU3LCAweDUxLAorfTsKKworY29uc3QgdWludDhfdCBhdmNTdHJlYW1fQjJbXSA9IHsgLy8gUCBmcmFtZQorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4NDEsIDB4OWEsIDB4MjEsIDB4NmMsIDB4NDIsIDB4YmYsIDB4ZmUsIDB4MzgsIDB4NDAsIDB4MDAsIDB4MGQsIDB4NDgsCit9OworCitGcmFtZURhdGEgYXZjU3RyZWFtX0JbXSA9IHsgYXZjU3RyZWFtX0IxLCBhdmNTdHJlYW1fQjIgfTsKKworY2xhc3MgTWVkaWFDb2RlY0lucHV0QnVmZmVyU2l6ZVRlc3QgOiBwdWJsaWMgTWVkaWFDb2RlY1Nhbml0eVRlc3QsCisgICAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxpbnQzMl90PiB7Cit9OworCitURVNUX1AoTWVkaWFDb2RlY0lucHV0QnVmZmVyU2l6ZVRlc3QsIFRlc3RBdmNEZWNvZGVyKSB7CisgICAgY29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUobG9vcGVyLCAiYzIuYW5kcm9pZC5hdmMuZGVjb2RlciIpOworICAgIGNmZy0+c2V0SW50MzIoIndpZHRoIiwgMzIwKTsKKyAgICBjZmctPnNldEludDMyKCJoZWlnaHQiLCAyNDApOworICAgIGNmZy0+c2V0U3RyaW5nKCJtaW1lIiwgTUlNRVRZUEVfVklERU9fQVZDKTsKKworICAgIGNvbnN0IGludDMyX3QgSW5wdXRTaXplID0gR2V0UGFyYW0oKTsKKyAgICBpZiAoSW5wdXRTaXplID49IDApIHsKKyAgICAgICAgY2ZnLT5zZXRJbnQzMigibWF4LWlucHV0LXNpemUiLCBJbnB1dFNpemUpOworICAgIH0KKworICAgIEVYUEVDVF9FUShjb2RlYy0+Y29uZmlndXJlKGNmZywgbnVsbHB0ciwgbnVsbHB0ciwgMCksIE9LKTsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldElucHV0Rm9ybWF0KCZpZm10KSwgT0spOworICAgIGludDMyX3QgbWF4SW5wdXRTaXplOworICAgIEFTU0VSVF9UUlVFKGlmbXQtPmZpbmRJbnQzMigibWF4LWlucHV0LXNpemUiLCAmbWF4SW5wdXRTaXplKSk7CisgICAgaWYgKElucHV0U2l6ZSA+IDApIHsKKyAgICAgICAgRVhQRUNUX0VRKG1heElucHV0U2l6ZSwgSW5wdXRTaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBFWFBFQ1RfR0UobWF4SW5wdXRTaXplLCAxIDw8IDIwKTsgLy8gMSBNQgorICAgIH0KKyAgICBFWFBFQ1RfRVEoY29kZWMtPnN0YXJ0KCksICBPSyk7CisgICAgc2l6ZV90IGl4OworICAgIEVYUEVDVF9FUShjb2RlYy0+ZGVxdWV1ZUlucHV0QnVmZmVyKCZpeCwgMTAwMDAwMCksIE9LKTsKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWY7CisgICAgRVhQRUNUX0VRKGNvZGVjLT5nZXRJbnB1dEJ1ZmZlcihpeCwgJmJ1ZiksICBPSyk7CisgICAgRVhQRUNUX0dFKGJ1Zi0+c2l6ZSgpLCAoc2l6ZV90KW1heElucHV0U2l6ZSk7CisgICAgRVhQRUNUX0xFKGJ1Zi0+c2l6ZSgpLCAoc2l6ZV90KW1heElucHV0U2l6ZSArIDQwOTZ1KTsKK30KKworVEVTVF9QKE1lZGlhQ29kZWNJbnB1dEJ1ZmZlclNpemVUZXN0LCBUZXN0VmlkZW9EZWNvZGVyKSB7CisgICAgY29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUobG9vcGVyLCAiYzIuYW5kcm9pZC52cDguZGVjb2RlciIpOworICAgIGNmZy0+c2V0SW50MzIoIndpZHRoIiwgMzIwKTsKKyAgICBjZmctPnNldEludDMyKCJoZWlnaHQiLCAyNDApOworICAgIGNmZy0+c2V0U3RyaW5nKCJtaW1lIiwgTUlNRVRZUEVfVklERU9fVlA4KTsKKworICAgIGNvbnN0IGludDMyX3QgSW5wdXRTaXplID0gR2V0UGFyYW0oKTsKKyAgICBpZiAoSW5wdXRTaXplID49IDApIHsKKyAgICAgICAgY2ZnLT5zZXRJbnQzMigibWF4LWlucHV0LXNpemUiLCBJbnB1dFNpemUpOworICAgIH0KKworICAgIEVYUEVDVF9FUShjb2RlYy0+Y29uZmlndXJlKGNmZywgbnVsbHB0ciwgbnVsbHB0ciwgMCksIE9LKTsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldElucHV0Rm9ybWF0KCZpZm10KSwgT0spOworICAgIGludDMyX3QgbWF4SW5wdXRTaXplOworICAgIEFTU0VSVF9UUlVFKGlmbXQtPmZpbmRJbnQzMigibWF4LWlucHV0LXNpemUiLCAmbWF4SW5wdXRTaXplKSk7CisgICAgaWYgKElucHV0U2l6ZSA+IDApIHsKKyAgICAgICAgRVhQRUNUX0VRKG1heElucHV0U2l6ZSwgSW5wdXRTaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBFWFBFQ1RfR0UobWF4SW5wdXRTaXplLCAxIDw8IDIwKTsgLy8gMSBNQgorICAgIH0KKyAgICBFWFBFQ1RfRVEoY29kZWMtPnN0YXJ0KCksICBPSyk7CisgICAgc2l6ZV90IGl4OworICAgIEVYUEVDVF9FUShjb2RlYy0+ZGVxdWV1ZUlucHV0QnVmZmVyKCZpeCwgMTAwMDAwMCksIE9LKTsKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWY7CisgICAgRVhQRUNUX0VRKGNvZGVjLT5nZXRJbnB1dEJ1ZmZlcihpeCwgJmJ1ZiksICBPSyk7CisgICAgRVhQRUNUX0dFKGJ1Zi0+c2l6ZSgpLCAoc2l6ZV90KW1heElucHV0U2l6ZSk7CisgICAgRVhQRUNUX0xFKGJ1Zi0+c2l6ZSgpLCAoc2l6ZV90KW1heElucHV0U2l6ZSArIDQwOTZ1KTsKK30KKworVEVTVF9QKE1lZGlhQ29kZWNJbnB1dEJ1ZmZlclNpemVUZXN0LCBUZXN0QXVkaW9EZWNvZGVyKSB7CisgICAgY29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUobG9vcGVyLCAiYzIuYW5kcm9pZC5hYWMuZGVjb2RlciIpOworICAgIGNmZy0+c2V0SW50MzIoInNhbXBsZS1yYXRlIiwgNDQxMDApOworICAgIGNmZy0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCAyKTsKKyAgICBjZmctPnNldFN0cmluZygibWltZSIsIE1JTUVUWVBFX0FVRElPX0FBQyk7CisKKyAgICBjb25zdCBpbnQzMl90IElucHV0U2l6ZSA9IEdldFBhcmFtKCk7CisgICAgaWYgKElucHV0U2l6ZSA+PSAwKSB7CisgICAgICAgIGNmZy0+c2V0SW50MzIoIm1heC1pbnB1dC1zaXplIiwgSW5wdXRTaXplKTsKKyAgICB9CisKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmNvbmZpZ3VyZShjZmcsIG51bGxwdHIsIG51bGxwdHIsIDApLCBPSyk7CisgICAgRVhQRUNUX0VRKGNvZGVjLT5nZXRJbnB1dEZvcm1hdCgmaWZtdCksIE9LKTsKKyAgICBpbnQzMl90IG1heElucHV0U2l6ZTsKKyAgICBpZiAoSW5wdXRTaXplID4gMCkgeworICAgICAgICBBU1NFUlRfVFJVRShpZm10LT5maW5kSW50MzIoIm1heC1pbnB1dC1zaXplIiwgJm1heElucHV0U2l6ZSkpOworICAgICAgICBFWFBFQ1RfRVEobWF4SW5wdXRTaXplLCBJbnB1dFNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpZm10LT5maW5kSW50MzIoIm1heC1pbnB1dC1zaXplIiwgJm1heElucHV0U2l6ZSkpIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUShtYXhJbnB1dFNpemUsIDEgPDwgMTkpOyAvLyA1MTIgS0IKKyAgICAgICAgfQorICAgICAgICBtYXhJbnB1dFNpemUgPSBrTGluZWFyQnVmZmVyU2l6ZTsgLy8gaW5wdXQgc2l6ZSBpcyBzZXQgYnkgY2hhbm5lbAorICAgIH0KKworICAgIEVYUEVDVF9FUShjb2RlYy0+c3RhcnQoKSwgIE9LKTsKKyAgICBzaXplX3QgaXg7CisgICAgRVhQRUNUX0VRKGNvZGVjLT5kZXF1ZXVlSW5wdXRCdWZmZXIoJml4LCAxMDAwMDAwKSwgT0spOworICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGJ1ZjsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldElucHV0QnVmZmVyKGl4LCAmYnVmKSwgIE9LKTsKKyAgICBFWFBFQ1RfR0UoYnVmLT5zaXplKCksIChzaXplX3QpbWF4SW5wdXRTaXplKTsKKyAgICBFWFBFQ1RfTEUoYnVmLT5zaXplKCksIChzaXplX3QpbWF4SW5wdXRTaXplICsgNDA5NnUpOworfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChJbnB1dFNpemVzLCBNZWRpYUNvZGVjSW5wdXRCdWZmZXJTaXplVGVzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoLTEsIDEyMzQsIDEyMzQ1Njc4KSk7CisKK1RFU1RfRihNZWRpYUNvZGVjU2FuaXR5VGVzdCwgVGVzdEF2Y0RlY29kZXJIZHJTdGF0aWNJbmZvKSB7CisgICAgY29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUobG9vcGVyLCAiYzIuYW5kcm9pZC5hdmMuZGVjb2RlciIpOworICAgIGNmZy0+c2V0SW50MzIoIndpZHRoIiwgMzIwKTsKKyAgICBjZmctPnNldEludDMyKCJoZWlnaHQiLCAyNDApOworICAgIGNmZy0+c2V0U3RyaW5nKCJtaW1lIiwgTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICBIRFJTdGF0aWNJbmZvIGluZm8gPSB7IC5tSUQgPSBIRFJTdGF0aWNJbmZvOjprVHlwZTEsIC5zVHlwZTEgPSB7CisgICAgICAgIC5tUiA9IHsgLnggPSAzNTQwMCwgLnkgPSAxNDYwMCB9LCAubUcgPSB7IC54ID0gODUwMCwgIC55ID0gMzk4NTAgfSwKKyAgICAgICAgLm1CID0geyAueCA9IDY1NTAsICAueSA9ICAyMzAwIH0sIC5tVyA9IHsgLnggPSAxNTYzNSwgLnkgPSAxNjQ1MCB9LAorICAgICAgICAubU1heERpc3BsYXlMdW1pbmFuY2UgPSAxMDAwLCAubU1pbkRpc3BsYXlMdW1pbmFuY2UgPSAxMDAwLAorICAgICAgICAubU1heENvbnRlbnRMaWdodExldmVsID0gMTAwMCwgLm1NYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsID0gMTIwIH0KKyAgICB9OworICAgIGNmZy0+c2V0QnVmZmVyKCJoZHItc3RhdGljLWluZm8iLCBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoJmluZm8sIHNpemVvZihpbmZvKSkpOworCisgICAgRVhQRUNUX0VRKGNvZGVjLT5jb25maWd1cmUoY2ZnLCBudWxscHRyLCBudWxscHRyLCAwKSwgT0spOworICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0T3V0cHV0Rm9ybWF0KCZvZm10KSwgT0spOworICAgIHNwPEFCdWZmZXI+IG9pbmZvOworICAgIEFTU0VSVF9UUlVFKG9mbXQtPmZpbmRCdWZmZXIoImhkci1zdGF0aWMtaW5mbyIsICZvaW5mbykpOworICAgIEFTU0VSVF9FUShvaW5mby0+c2l6ZSgpLCBzaXplb2YoaW5mbykpOworICAgIEVYUEVDVF9FUShtZW1jbXAob2luZm8tPmRhdGEoKSwgJmluZm8sIHNpemVvZihpbmZvKSksICAwKTsKKworICAgIEVYUEVDVF9FUShjb2RlYy0+c3RhcnQoKSwgIE9LKTsKKyAgICAvLyBhc3N1bWUgd2UgY2FuIHN1Ym1pdCBhbGwgaW5wdXQgYmVmb3JlIGRlcXVldWluZyBvdXRwdXQKKyAgICBzaXplX3QgZnJhbWVJeCA9IDA7CisgICAgc2l6ZV90IGl4OworICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGJ1ZjsKKyAgICBmb3IgKGNvbnN0IEZyYW1lRGF0YSAmZnJhbWUgOiBhdmNTdHJlYW1fQikgeworICAgICAgICBFWFBFQ1RfRVEoY29kZWMtPmRlcXVldWVJbnB1dEJ1ZmZlcigmaXgsIDEwMDAwMDApLCBPSyk7CisgICAgICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0SW5wdXRCdWZmZXIoaXgsICZidWYpLCAgT0spOworICAgICAgICBBU1NFUlRfR0UoYnVmLT5jYXBhY2l0eSgpLCBmcmFtZS5zaXplKTsKKyAgICAgICAgbWVtY3B5KGJ1Zi0+YmFzZSgpLCBmcmFtZS5kYXRhLCBmcmFtZS5zaXplKTsKKyAgICAgICAgRVhQRUNUX0VRKGJ1Zi0+c2V0UmFuZ2UoMCwgZnJhbWUuc2l6ZSksIE9LKTsKKyAgICAgICAgYm9vbCBlb3MgPSArK2ZyYW1lSXggPT0gTkVMRU0oYXZjU3RyZWFtX0IpOworICAgICAgICBFWFBFQ1RfRVEoY29kZWMtPnF1ZXVlSW5wdXRCdWZmZXIoaXgsIDAsIGZyYW1lLnNpemUsIGZyYW1lSXggKiAzMzMzMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVvcyA/IEJVRkZFUl9GTEFHX0VORF9PRl9TVFJFQU0gOiAwKSwgIE9LKTsKKyAgICB9CisKKyAgICBzaXplX3Qgb2Zmc2V0LCBzaXplOworICAgIGludDY0X3QgdHM7CisgICAgdWludDMyX3QgZmxhZ3M7CisgICAgYm9vbCBtSW5mb0Zvcm1hdENoYW5nZWRPayA9IHRydWU7CisgICAgYm9vbCBtSW5mb0J1ZmZlcnNDaGFuZ2VkT2sgPSB0cnVlOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IGNvZGVjLT5kZXF1ZXVlT3V0cHV0QnVmZmVyKCZpeCwgJm9mZnNldCwgJnNpemUsICZ0cywgJmZsYWdzLCAxMDAwMDAwKTsKKyAgICAgICAgaWYgKGVyciA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEICYmIG1JbmZvRm9ybWF0Q2hhbmdlZE9rKSB7CisgICAgICAgICAgICBtSW5mb0Zvcm1hdENoYW5nZWRPayA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBJTkZPX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQgJiYgbUluZm9CdWZmZXJzQ2hhbmdlZE9rKSB7CisgICAgICAgICAgICBtSW5mb0J1ZmZlcnNDaGFuZ2VkT2sgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFTU0VSVF9FUShlcnIsIE9LKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0T3V0cHV0QnVmZmVyKGl4LCAmYnVmKSwgT0spOworICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0T3V0cHV0Rm9ybWF0KGl4LCAmb2ZtdCksIE9LKTsKKyAgICBBU1NFUlRfVFJVRShvZm10LT5maW5kQnVmZmVyKCJoZHItc3RhdGljLWluZm8iLCAmb2luZm8pKTsKKyAgICBBU1NFUlRfRVEob2luZm8tPnNpemUoKSwgc2l6ZW9mKGluZm8pKTsKKyAgICBFWFBFQ1RfRVEobWVtY21wKG9pbmZvLT5kYXRhKCksICZpbmZvLCBzaXplb2YoaW5mbykpLCAgMCk7Cit9CisKK1RFU1RfRihNZWRpYUNvZGVjU2FuaXR5VGVzdCwgVGVzdFZpZGVvRGVjb2RlckhkclN0YXRpY0luZm8pIHsKKyAgICBjb2RlYyA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5Q29tcG9uZW50TmFtZShsb29wZXIsICJjMi5hbmRyb2lkLm1wZWc0LmRlY29kZXIiKTsKKyAgICBjZmctPnNldEludDMyKCJ3aWR0aCIsIDMyMCk7CisgICAgY2ZnLT5zZXRJbnQzMigiaGVpZ2h0IiwgMjQwKTsKKyAgICBjZmctPnNldFN0cmluZygibWltZSIsIE1JTUVUWVBFX1ZJREVPX01QRUc0KTsKKyAgICBIRFJTdGF0aWNJbmZvIGluZm8gPSB7IC5tSUQgPSBIRFJTdGF0aWNJbmZvOjprVHlwZTEsIC5zVHlwZTEgPSB7CisgICAgICAgIC5tUiA9IHsgLnggPSAzNTQwMCwgLnkgPSAxNDYwMCB9LCAubUcgPSB7IC54ID0gODUwMCwgIC55ID0gMzk4NTAgfSwKKyAgICAgICAgLm1CID0geyAueCA9IDY1NTAsICAueSA9ICAyMzAwIH0sIC5tVyA9IHsgLnggPSAxNTYzNSwgLnkgPSAxNjQ1MCB9LAorICAgICAgICAubU1heERpc3BsYXlMdW1pbmFuY2UgPSAxMDAwLCAubU1pbkRpc3BsYXlMdW1pbmFuY2UgPSAxMDAwLAorICAgICAgICAubU1heENvbnRlbnRMaWdodExldmVsID0gMTAwMCwgLm1NYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsID0gMTIwIH0KKyAgICB9OworICAgIGNmZy0+c2V0QnVmZmVyKCJoZHItc3RhdGljLWluZm8iLCBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoJmluZm8sIHNpemVvZihpbmZvKSkpOworCisgICAgRVhQRUNUX0VRKGNvZGVjLT5jb25maWd1cmUoY2ZnLCBudWxscHRyLCBudWxscHRyLCAwKSwgT0spOworICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0T3V0cHV0Rm9ybWF0KCZvZm10KSwgT0spOworICAgIHNwPEFCdWZmZXI+IG9pbmZvOworICAgIEFTU0VSVF9UUlVFKG9mbXQtPmZpbmRCdWZmZXIoImhkci1zdGF0aWMtaW5mbyIsICZvaW5mbykpOworICAgIEFTU0VSVF9FUShvaW5mby0+c2l6ZSgpLCBzaXplb2YoaW5mbykpOworICAgIEVYUEVDVF9FUShtZW1jbXAob2luZm8tPmRhdGEoKSwgJmluZm8sIHNpemVvZihpbmZvKSksICAwKTsKK30KKworY2xhc3MgTWVkaWFDb2RlY0J5dGVCdWZmZXJUZXN0IDogcHVibGljIE1lZGlhQ29kZWNTYW5pdHlUZXN0LAorICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8aW50MzJfdD4geworfTsKKworVEVTVF9QKE1lZGlhQ29kZWNCeXRlQnVmZmVyVGVzdCwgVGVzdFZpZGVvRGVjb2RlcjQyMFBsYW5hcikgeworICAgIGNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKGxvb3BlciwgImMyLmFuZHJvaWQuYXZjLmRlY29kZXIiKTsKKy8vICAgIGNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKGxvb3BlciwgIk9NWC5nb29nbGUuaDI2NC5kZWNvZGVyIik7CisgICAgY2ZnLT5zZXRJbnQzMigid2lkdGgiLCAzMjApOworICAgIGNmZy0+c2V0SW50MzIoImhlaWdodCIsIDI0MCk7CisgICAgY2ZnLT5zZXRTdHJpbmcoIm1pbWUiLCBNSU1FVFlQRV9WSURFT19BVkMpOworICAgIGNvbnN0IGludDMyX3QgQ29sb3IgPSBHZXRQYXJhbSgpOworICAgIGlmIChDb2xvciA+PSAwKSB7CisgICAgICAgIGNmZy0+c2V0SW50MzIoImNvbG9yLWZvcm1hdCIsIENvbG9yKTsKKyAgICB9CisgICAgaW50MzJfdCB4Y29sb3IgPSBDb2xvciA9PSAtMSA/IENPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciA6IENvbG9yOworCisgICAgRVhQRUNUX0VRKGNvZGVjLT5jb25maWd1cmUoY2ZnLCBudWxscHRyLCBudWxscHRyLCAwKSwgT0spOworICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0T3V0cHV0Rm9ybWF0KCZvZm10KSwgT0spOworICAgIGludDMyX3Qgb2NvbG9yID0gLTE7CisgICAgRVhQRUNUX1RSVUUob2ZtdC0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmb2NvbG9yKSk7CisgICAgRVhQRUNUX0VRKG9jb2xvciwgeGNvbG9yKTsKKworICAgIEVYUEVDVF9FUShjb2RlYy0+c3RhcnQoKSwgIE9LKTsKKyAgICAvLyBhc3N1bWUgd2UgY2FuIHN1Ym1pdCBhbGwgaW5wdXQgYmVmb3JlIGRlcXVldWluZyBvdXRwdXQKKyAgICBzaXplX3QgZnJhbWVJeCA9IDA7CisgICAgc2l6ZV90IGl4OworICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGJ1ZjsKKyAgICBmb3IgKGNvbnN0IEZyYW1lRGF0YSAmZnJhbWUgOiBhdmNTdHJlYW1fQSkgeworICAgICAgICBFWFBFQ1RfRVEoY29kZWMtPmRlcXVldWVJbnB1dEJ1ZmZlcigmaXgsIDEwMDAwMDApLCBPSyk7CisgICAgICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0SW5wdXRCdWZmZXIoaXgsICZidWYpLCAgT0spOworICAgICAgICBBU1NFUlRfR0UoYnVmLT5jYXBhY2l0eSgpLCBmcmFtZS5zaXplKTsKKyAgICAgICAgbWVtY3B5KGJ1Zi0+YmFzZSgpLCBmcmFtZS5kYXRhLCBmcmFtZS5zaXplKTsKKyAgICAgICAgRVhQRUNUX0VRKGJ1Zi0+c2V0UmFuZ2UoMCwgZnJhbWUuc2l6ZSksIE9LKTsKKyAgICAgICAgYm9vbCBlb3MgPSArK2ZyYW1lSXggPT0gTkVMRU0oYXZjU3RyZWFtX0EpOworICAgICAgICBFWFBFQ1RfRVEoY29kZWMtPnF1ZXVlSW5wdXRCdWZmZXIoaXgsIDAsIGZyYW1lLnNpemUsIGZyYW1lSXggKiAzMzMzMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVvcyA/IEJVRkZFUl9GTEFHX0VORF9PRl9TVFJFQU0gOiAwKSwgIE9LKTsKKyAgICB9CisKKyAgICBzaXplX3Qgb2Zmc2V0LCBzaXplOworICAgIGludDY0X3QgdHM7CisgICAgdWludDMyX3QgZmxhZ3M7CisgICAgYm9vbCBtSW5mb0Zvcm1hdENoYW5nZWRPayA9IHRydWU7CisgICAgYm9vbCBtSW5mb0J1ZmZlcnNDaGFuZ2VkT2sgPSB0cnVlOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IGNvZGVjLT5kZXF1ZXVlT3V0cHV0QnVmZmVyKCZpeCwgJm9mZnNldCwgJnNpemUsICZ0cywgJmZsYWdzLCAxMDAwMDAwKTsKKyAgICAgICAgaWYgKGVyciA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEICYmIG1JbmZvRm9ybWF0Q2hhbmdlZE9rKSB7CisgICAgICAgICAgICBtSW5mb0Zvcm1hdENoYW5nZWRPayA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBJTkZPX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQgJiYgbUluZm9CdWZmZXJzQ2hhbmdlZE9rKSB7CisgICAgICAgICAgICBtSW5mb0J1ZmZlcnNDaGFuZ2VkT2sgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFTU0VSVF9FUShlcnIsIE9LKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0T3V0cHV0QnVmZmVyKGl4LCAmYnVmKSwgT0spOworICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0T3V0cHV0Rm9ybWF0KGl4LCAmb2ZtdCksIE9LKTsKKyAgICBBU1NFUlRfVFJVRShvZm10LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZvY29sb3IpKTsKKyAgICBFWFBFQ1RfRVEob2NvbG9yLCB4Y29sb3IpIDw8IG9mbXQtPmRlYnVnU3RyaW5nKDgpLmNfc3RyKCkgPDwgYnVmLT5tZXRhKCktPmRlYnVnU3RyaW5nKDgpLmNfc3RyKCk7CisgICAgLy8gZXhwZWN0IGFuIGltYWdlLWRhdGEgaW4gYm90aCBmb3JtYXQgYW5kIG1ldGEKKyAgICBzcDxBQnVmZmVyPiBpbWdCdWYsIGltZ0J1ZjI7CisgICAgQVNTRVJUX1RSVUUob2ZtdC0+ZmluZEJ1ZmZlcigiaW1hZ2UtZGF0YSIsICZpbWdCdWYpKTsKKyAgICBBU1NFUlRfVFJVRShidWYtPm1ldGEoKS0+ZmluZEJ1ZmZlcigiaW1hZ2UtZGF0YSIsICZpbWdCdWYyKSk7CisgICAgRVhQRUNUX0VRKGltZ0J1Zi0+c2l6ZSgpLCBzaXplb2YoTWVkaWFJbWFnZTIpKTsKKyAgICBBU1NFUlRfRVEoaW1nQnVmLT5zaXplKCksIGltZ0J1ZjItPnNpemUoKSk7CisgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChpbWdCdWYtPmRhdGEoKSwgaW1nQnVmMi0+ZGF0YSgpLCBpbWdCdWYtPnNpemUoKSkpOworICAgIE1lZGlhSW1hZ2UyICppbWcgPSAoTWVkaWFJbWFnZTIqKWltZ0J1Zi0+ZGF0YSgpOworICAgIEVYUEVDVF9FUShpbWctPm1UeXBlLCBpbWctPk1FRElBX0lNQUdFX1RZUEVfWVVWKTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tTnVtUGxhbmVzLCAzdSk7CisgICAgRVhQRUNUX0VRKGltZy0+bVdpZHRoLCAzMjB1KTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tSGVpZ2h0LCAyNDB1KTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tQml0RGVwdGgsIDh1KTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tQml0RGVwdGhBbGxvY2F0ZWQsIDh1KTsKKworICAgIC8vIHJlYWQgc3RyaWRlcyBmcm9tIGZvcm1hdAorICAgIGludDMyX3Qgc3RyaWRlLCB2c3RyaWRlOworICAgIG9mbXQtPmZpbmRJbnQzMigic3RyaWRlIiwgJnN0cmlkZSkgICAgICAgICAgfHwgb2ZtdC0+ZmluZEludDMyKCJ3aWR0aCIsICZzdHJpZGUpOworICAgIG9mbXQtPmZpbmRJbnQzMigic2xpY2UtaGVpZ2h0IiwgJnZzdHJpZGUpICAgfHwgb2ZtdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmdnN0cmlkZSk7CisKKyAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5ZXS5tSG9yaXpTdWJzYW1wbGluZywgMXUpOworICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlldLm1WZXJ0U3Vic2FtcGxpbmcsIDF1KTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5VXS5tSG9yaXpTdWJzYW1wbGluZywgMnUpOworICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlVdLm1WZXJ0U3Vic2FtcGxpbmcsIDJ1KTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5WXS5tSG9yaXpTdWJzYW1wbGluZywgMnUpOworICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlZdLm1WZXJ0U3Vic2FtcGxpbmcsIDJ1KTsKKworICAgIHN3aXRjaCAoeGNvbG9yKSB7CisgICAgICAgIC8vIGRlZmluZWQgZm9ybWF0cworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRQbGFuYXI6CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5ZXS5tT2Zmc2V0LCAwdSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5ZXS5tQ29sSW5jLCAxKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlldLm1Sb3dJbmMsIHN0cmlkZSk7CisKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlVdLm1PZmZzZXQsICh1aW50MzJfdCkoc3RyaWRlICogdnN0cmlkZSkpOworICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+VV0ubUNvbEluYywgMSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5VXS5tUm93SW5jLCBzdHJpZGUgLyAyKTsKKworICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+Vl0ubU9mZnNldCwgKHVpbnQzMl90KShzdHJpZGUgKiB2c3RyaWRlICogNSAvIDQpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlZdLm1Db2xJbmMsIDEpOworICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+Vl0ubVJvd0luYywgc3RyaWRlIC8gMik7CisKKyAgICAgICAgICAgIEVYUEVDVF9HRShzaXplLCAoc2l6ZV90KShzdHJpZGUgKiB2c3RyaWRlICogNSAvIDQgKyBzdHJpZGUgLyAyICogMTE5ICsgMTYwKSk7CisgICAgICAgICAgICBFWFBFQ1RfTEUoc2l6ZSwgKHNpemVfdCkoc3RyaWRlICogdnN0cmlkZSAqIDMgLyAyKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjoKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlldLm1PZmZzZXQsIDB1KTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlldLm1Db2xJbmMsIDEpOworICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+WV0ubVJvd0luYywgc3RyaWRlKTsKKworICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+VV0ubU9mZnNldCwgKHVpbnQzMl90KShzdHJpZGUgKiB2c3RyaWRlKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5VXS5tQ29sSW5jLCAyKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlVdLm1Sb3dJbmMsIHN0cmlkZSk7CisKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlZdLm1PZmZzZXQsICh1aW50MzJfdCkoc3RyaWRlICogdnN0cmlkZSArIDEpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlZdLm1Db2xJbmMsIDIpOworICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+Vl0ubVJvd0luYywgc3RyaWRlKTsKKworICAgICAgICAgICAgRVhQRUNUX0dFKHNpemUsIChzaXplX3QpKHN0cmlkZSAqIHZzdHJpZGUgKyBzdHJpZGUgKiAxMTkgKyAzMjApKTsKKyAgICAgICAgICAgIEVYUEVDVF9MRShzaXplLCAoc2l6ZV90KShzdHJpZGUgKiB2c3RyaWRlICogMyAvIDIpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU6CisgICAgICAgICAgICAvLyBhbnl0aGluZyBnb2VzLCBidXQgc3RyaWRlIHNob3VsZCBtYXRjaCBZIHBsYW5lCisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5ZXS5tUm93SW5jLCBzdHJpZGUpOworCisgICAgICAgICAgICBFWFBFQ1RfR0Uoc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1heCh7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nLT5tUGxhbmVbaW1nLT5ZXS5tT2Zmc2V0ICsgMjM5ICogaW1nLT5tUGxhbmVbaW1nLT5ZXS5tUm93SW5jCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDMxOSAqIGltZy0+bVBsYW5lW2ltZy0+WV0ubUNvbEluYyArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nLT5tUGxhbmVbaW1nLT5VXS5tT2Zmc2V0ICsgMTE5ICogaW1nLT5tUGxhbmVbaW1nLT5VXS5tUm93SW5jCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDE1OSAqIGltZy0+bVBsYW5lW2ltZy0+VV0ubUNvbEluYyArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nLT5tUGxhbmVbaW1nLT5WXS5tT2Zmc2V0ICsgMTE5ICogaW1nLT5tUGxhbmVbaW1nLT5WXS5tUm93SW5jCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDE1OSAqIGltZy0+bVBsYW5lW2ltZy0+Vl0ubUNvbEluYyArIDEgfSkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIHZhbGlkYXRlIGFsbCBwaXhlbHMKKyNpZiAwCisgICAgZnByaW50ZihzdGRlcnIsICJNZWRpYUltYWdlIHsgRigldXgldSkgQCV1KyVkKyVkIEAldSslZCslZCBAJXUrJWQrJWQgfVxuIiwKKyAgICAgICAgICAgIGltZy0+bVdpZHRoLCBpbWctPm1IZWlnaHQsCisgICAgICAgICAgICBpbWctPm1QbGFuZVswXS5tT2Zmc2V0LCBpbWctPm1QbGFuZVswXS5tQ29sSW5jLCBpbWctPm1QbGFuZVswXS5tUm93SW5jLAorICAgICAgICAgICAgaW1nLT5tUGxhbmVbMV0ubU9mZnNldCwgaW1nLT5tUGxhbmVbMV0ubUNvbEluYywgaW1nLT5tUGxhbmVbMV0ubVJvd0luYywKKyAgICAgICAgICAgIGltZy0+bVBsYW5lWzJdLm1PZmZzZXQsIGltZy0+bVBsYW5lWzJdLm1Db2xJbmMsIGltZy0+bVBsYW5lWzJdLm1Sb3dJbmMpOworI2VuZGlmCisgICAgZm9yIChpeCA9IDA7IGl4IDwgMzsgKytpeCkgeworICAgICAgICBjb25zdCBzdGF0aWMgdWludDhfdCBleHBlY3RlZFtdID0geyAyMTAsIDE2LCAxNDYgfTsKKyAgICAgICAgZm9yICh1aW50MzJfdCB5ID0gMDsgeSA8IGltZy0+bUhlaWdodCAvIGltZy0+bVBsYW5lW2l4XS5tVmVydFN1YnNhbXBsaW5nIDsgKyt5KSB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgaW1nLT5tV2lkdGggLyBpbWctPm1QbGFuZVtpeF0ubUhvcml6U3Vic2FtcGxpbmc7ICsreCkgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgdmFsID0gYnVmLT5kYXRhKClbaW1nLT5tUGxhbmVbaXhdLm1PZmZzZXQgKyBpbWctPm1QbGFuZVtpeF0ubUNvbEluYyAqIHgKKyAgICAgICAgICAgICAgICAgICAgICAgICsgaW1nLT5tUGxhbmVbaXhdLm1Sb3dJbmMgKiB5XTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEodmFsLCBleHBlY3RlZFtpeF0pIDw8ICJpbmNvcnJlY3QgdmFsdWUgZm9yIHBsYW5lICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGl4IDw8ICIgYXQgeD0iIDw8IHggPDwgIiwgeT0iIDw8IHk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKElucHV0U2l6ZXMsIE1lZGlhQ29kZWNCeXRlQnVmZmVyVGVzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgIC0xLAorICAgICAgICBDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIsCisgICAgICAgIENPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIsCisgICAgICAgIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFBsYW5hciwKKyAgICAgICAgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hciwKKyAgICAgICAgQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGUpKTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL1JlZmxlY3RlZFBhcmFtVXBkYXRlcl90ZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9SZWZsZWN0ZWRQYXJhbVVwZGF0ZXJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkYjBlMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9SZWZsZWN0ZWRQYXJhbVVwZGF0ZXJfdGVzdC5jcHAKQEAgLTAsMCArMSwzNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fCisKKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8QzJQYXJhbURlZi5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8UmVmbGVjdGVkUGFyYW1VcGRhdGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworZW51bSB7CisgICAga1BhcmFtSW5kZXhUZXN0U3RhcnQgPSAweDEwMDAsCisgICAga1BhcmFtSW5kZXhJbnQsCisgICAga1BhcmFtSW5kZXhTdHJpbmcsCisgICAga1BhcmFtSW5kZXhDb21wb3NpdGUsCisgICAga1BhcmFtSW5kZXhGbGV4U3RyaW5nLAorCisgICAga1BhcmFtSW5kZXhMb25nID0gQzJQYXJhbTo6VFlQRV9JTkRFWF9WRU5ET1JfU1RBUlQsCit9OworCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMkludDMyVmFsdWUsIGtQYXJhbUluZGV4SW50PiBDMkludEluZm87Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMkludDY0VmFsdWUsIGtQYXJhbUluZGV4TG9uZz4gQzJMb25nSW5mbzsKKworc3RydWN0IEMyRml4ZWRTaXplU3RyaW5nU3RydWN0IHsKKyAgICBjaGFyIHZhbHVlWzEyXTsKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQkFTRV9DMlNUUlVDVChGaXhlZFNpemVTdHJpbmcpCisgICAgQzJGSUVMRCh2YWx1ZSwgInZhbHVlIikKK307Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMkZpeGVkU2l6ZVN0cmluZ1N0cnVjdCwga1BhcmFtSW5kZXhTdHJpbmc+IEMyU3RyaW5nSW5mbzsKKworc3RydWN0IEMyQ29tcG9zaXRlU3RydWN0IHsKKyAgICBpbnQzMl90IGkzMjsKKyAgICB1aW50NjRfdCB1NjQ7CisgICAgY2hhciBzdHJbMTJdOworICAgIHVpbnQ4X3QgYmxvYls4XTsKKyAgICB1aW50OF90IGZsZXhCbG9iW107CisKKyAgICBDMkNvbXBvc2l0ZVN0cnVjdCgpID0gZGVmYXVsdDsKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQkFTRV9GTEVYX0MyU1RSVUNUKENvbXBvc2l0ZSwgZmxleEJsb2IpCisgICAgQzJGSUVMRChpMzIsICJpMzIiKQorICAgIEMyRklFTEQodTY0LCAidTY0IikKKyAgICBDMkZJRUxEKHN0ciwgInN0ciIpCisgICAgQzJGSUVMRChibG9iLCAiYmxvYiIpCisgICAgQzJGSUVMRChmbGV4QmxvYiwgImZsZXgtYmxvYiIpCit9Oworc3RhdGljX2Fzc2VydChDMkNvbXBvc2l0ZVN0cnVjdDo6RkxFWF9TSVpFID09IDEsICIiKTsKK3N0YXRpY19hc3NlcnQoX0MyRmxleEhlbHBlcjxDMkNvbXBvc2l0ZVN0cnVjdD46OkZMRVhfU0laRSA9PSAxLCAiIik7Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMkNvbXBvc2l0ZVN0cnVjdCwga1BhcmFtSW5kZXhDb21wb3NpdGU+IEMyQ29tcG9zaXRlSW5mbzsKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJTdHJpbmdWYWx1ZSwga1BhcmFtSW5kZXhGbGV4U3RyaW5nPiBDMkZsZXhTdHJpbmdJbmZvOworCisjZGVmaW5lIFNVUFBPUlRFRF9UWVBFUyAgIFwKKyAgICBDMkludEluZm8sICAgICAgICAgICAgXAorICAgIEMyTG9uZ0luZm8sICAgICAgICAgICBcCisgICAgQzJTdHJpbmdJbmZvLCAgICAgICAgIFwKKyAgICBDMkNvbXBvc2l0ZUluZm8sICAgICAgXAorICAgIEMyRmxleFN0cmluZ0luZm8KKwordGVtcGxhdGU8dHlwZW5hbWUuLi4gVFlQRVM+IHN0cnVjdCBkZXNjcmliZV9pbXBsOwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gVFlQRVM+IHN0cnVjdCBkZXNjcmliZV9pbXBsPFQsIFRZUEVTLi4uPiB7CisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaWJlKEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCkgeworICAgICAgICBpZiAoaW5kZXggPT0gVDo6Q09SRV9JTkRFWCkgeworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8QzJTdHJ1Y3REZXNjcmlwdG9yPihUOjpDT1JFX0lOREVYLCBUOjpGaWVsZExpc3QoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZGVzY3JpYmVfaW1wbDxUWVBFUy4uLj46OmRlc2NyaWJlKGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IGRlc2NyaWJlX2ltcGw8PiB7CisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaWJlKEMyUGFyYW06OkNvcmVJbmRleCkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjb25zdCBjaGFyICpHZXROYW1lKCkgICAgICAgIHsgcmV0dXJuIG51bGxwdHI7IH0KK3RlbXBsYXRlPD4gY29uc3QgY2hhciAqR2V0TmFtZTxDMkludEluZm8+KCkgICAgICAgeyByZXR1cm4gImludCI7IH0KK3RlbXBsYXRlPD4gY29uc3QgY2hhciAqR2V0TmFtZTxDMkxvbmdJbmZvPigpICAgICAgeyByZXR1cm4gImxvbmciOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0IGNoYXIgKkdldE5hbWU8QzJTdHJpbmdJbmZvPigpICAgIHsgcmV0dXJuICJzdHJpbmciOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0IGNoYXIgKkdldE5hbWU8QzJDb21wb3NpdGVJbmZvPigpIHsgcmV0dXJuICJjb21wb3NpdGUiOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0IGNoYXIgKkdldE5hbWU8QzJGbGV4U3RyaW5nSW5mbz4oKSB7IHJldHVybiAiZmxleC1zdHJpbmciOyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lLi4uIFRZUEVTPiBzdHJ1Y3QgZmlsbF9kZXNjcmlwdG9yc19pbXBsOwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gVFlQRVM+IHN0cnVjdCBmaWxsX2Rlc2NyaXB0b3JzX2ltcGw8VCwgVFlQRVMuLi4+IHsKKyAgICBzdGF0aWMgdm9pZCBmaWxsKHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICp2ZWMpIHsKKyAgICAgICAgZmlsbF9kZXNjcmlwdG9yc19pbXBsPFRZUEVTLi4uPjo6ZmlsbCh2ZWMpOworICAgICAgICB2ZWMtPnB1c2hfYmFjayhzdGQ6Om1ha2Vfc2hhcmVkPEMyUGFyYW1EZXNjcmlwdG9yPigKKyAgICAgICAgICAgICAgICBUOjpQQVJBTV9UWVBFLCBDMlBhcmFtRGVzY3JpcHRvcjo6SVNfUEVSU0lTVEVOVCwgR2V0TmFtZTxUPigpKSk7CisgICAgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgZmlsbF9kZXNjcmlwdG9yc19pbXBsPD4geworICAgIHN0YXRpYyB2b2lkIGZpbGwoc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKikge30KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IFQgKkNhc3RQYXJhbShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnBhcmFtKSB7CisgICAgcmV0dXJuIChUICopcGFyYW0uZ2V0KCk7Cit9CisKK2NsYXNzIFBhcmFtUmVmbGVjdG9yIDogcHVibGljIEMyUGFyYW1SZWZsZWN0b3IgeworcHVibGljOgorICAgIFBhcmFtUmVmbGVjdG9yKCkgPSBkZWZhdWx0OworICAgIH5QYXJhbVJlZmxlY3RvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaWJlKEMyUGFyYW06OkNvcmVJbmRleCBwYXJhbUluZGV4KSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBkZXNjcmliZV9pbXBsPFNVUFBPUlRFRF9UWVBFUz46OmRlc2NyaWJlKHBhcmFtSW5kZXgpOworICAgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZQorCitjbGFzcyBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CitwdWJsaWM6CisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyVGVzdCgpIDogbVJlZmxlY3RvcihuZXcgUGFyYW1SZWZsZWN0b3IpIHsKKyAgICAgICAgZmlsbF9kZXNjcmlwdG9yc19pbXBsPFNVUFBPUlRFRF9UWVBFUz46OmZpbGwoJm1EZXNjcmlwdG9ycyk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IG1SZWZsZWN0b3I7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gbURlc2NyaXB0b3JzOworfTsKKworVEVTVF9GKFJlZmxlY3RlZFBhcmFtVXBkYXRlclRlc3QsIFNpbmdsZVZhbHVlVGVzdCkgeworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlciB1cGRhdGVyOworCisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0IG1zZzsKKyAgICBtc2cuZW1wbGFjZSgiaW50LnZhbHVlIiwgaW50MzJfdCgxMikpOworICAgIG1zZy5lbXBsYWNlKCJ2ZW5kb3IubG9uZy52YWx1ZSIsIGludDY0X3QoMzQpKTsKKworICAgIHVwZGF0ZXIuYWRkUGFyYW1EZXNjKG1SZWZsZWN0b3IsIG1EZXNjcmlwdG9ycyk7CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlczsKKyAgICB1cGRhdGVyLmdldFBhcmFtSW5kaWNlc0Zyb21NZXNzYWdlKG1zZywgJmluZGljZXMpOworICAgIEVYUEVDVF9FUSgxLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJJbnRJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDEsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMkxvbmdJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDAsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMlN0cmluZ0luZm86OlBBUkFNX1RZUEU7IH0pKTsKKyAgICBFWFBFQ1RfRVEoMCwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMyQ29tcG9zaXRlSW5mbzo6UEFSQU1fVFlQRTsgfSkpOworICAgIEVYUEVDVF9FUSgwLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJGbGV4U3RyaW5nSW5mbzo6UEFSQU1fVFlQRTsgfSkpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbXM7CisgICAgcGFyYW1zLmVtcGxhY2VfYmFjayhuZXcgQzJJbnRJbmZvKTsKKyAgICBwYXJhbXMuZW1wbGFjZV9iYWNrKG5ldyBDMkxvbmdJbmZvKTsKKyAgICBFWFBFQ1RfRVEoMCwgQ2FzdFBhcmFtPEMySW50SW5mbz4ocGFyYW1zWzBdKS0+dmFsdWUpOworICAgIEVYUEVDVF9FUSgwLCBDYXN0UGFyYW08QzJMb25nSW5mbz4ocGFyYW1zWzFdKS0+dmFsdWUpOworCisgICAgdXBkYXRlci51cGRhdGVQYXJhbXNGcm9tTWVzc2FnZShtc2csICZwYXJhbXMpOworICAgIEVYUEVDVF9FUSgxMiwgQ2FzdFBhcmFtPEMySW50SW5mbz4ocGFyYW1zWzBdKS0+dmFsdWUpOworICAgIEVYUEVDVF9FUSgzNCwgQ2FzdFBhcmFtPEMyTG9uZ0luZm8+KHBhcmFtc1sxXSktPnZhbHVlKTsKKworICAgIEMyVmFsdWUgYzJWYWx1ZTsKKyAgICBpbnQzMl90IGludDMyVmFsdWUgPSAwOworICAgIGludDY0X3QgaW50NjRWYWx1ZSA9IDA7CisgICAgbXNnID0gdXBkYXRlci5nZXRQYXJhbXMocGFyYW1zKTsKKyAgICBBU1NFUlRfRVEoMXUsIG1zZy5jb3VudCgiaW50LnZhbHVlIikpOworICAgIEVYUEVDVF9FUSh0cnVlLCBtc2dbImludC52YWx1ZSJdLmZpbmQoJmMyVmFsdWUpKTsKKyAgICBFWFBFQ1RfRVEodHJ1ZSwgYzJWYWx1ZS5nZXQoJmludDMyVmFsdWUpKTsKKyAgICBFWFBFQ1RfRVEoMTIsIGludDMyVmFsdWUpOworCisgICAgQVNTRVJUX0VRKDF1LCBtc2cuY291bnQoInZlbmRvci5sb25nLnZhbHVlIikpOworICAgIEVYUEVDVF9FUSh0cnVlLCBtc2dbInZlbmRvci5sb25nLnZhbHVlIl0uZmluZCgmYzJWYWx1ZSkpOworICAgIEVYUEVDVF9FUSh0cnVlLCBjMlZhbHVlLmdldCgmaW50NjRWYWx1ZSkpOworICAgIEVYUEVDVF9FUSgzNCwgaW50NjRWYWx1ZSk7Cit9CisKK1RFU1RfRihSZWZsZWN0ZWRQYXJhbVVwZGF0ZXJUZXN0LCBTdHJpbmdUZXN0KSB7CisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyIHVwZGF0ZXI7CisKKyAgICBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3QgbXNnOworICAgIG1zZy5lbXBsYWNlKCJzdHJpbmcudmFsdWUiLCBBU3RyaW5nKCI1NiIpKTsKKyAgICBtc2cuZW1wbGFjZSgiZmxleC1zdHJpbmcudmFsdWUiLCBBU3RyaW5nKCJTb21lIHN0cmluZyIpKTsKKyAgICB1cGRhdGVyLmFkZFBhcmFtRGVzYyhtUmVmbGVjdG9yLCBtRGVzY3JpcHRvcnMpOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXM7CisgICAgdXBkYXRlci5nZXRQYXJhbUluZGljZXNGcm9tTWVzc2FnZShtc2csICZpbmRpY2VzKTsKKyAgICBFWFBFQ1RfRVEoMCwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMySW50SW5mbzo6UEFSQU1fVFlQRTsgfSkpOworICAgIEVYUEVDVF9FUSgwLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJMb25nSW5mbzo6UEFSQU1fVFlQRTsgfSkpOworICAgIEVYUEVDVF9FUSgxLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJTdHJpbmdJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDAsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMkNvbXBvc2l0ZUluZm86OlBBUkFNX1RZUEU7IH0pKTsKKyAgICBFWFBFQ1RfRVEoMSwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMyRmxleFN0cmluZ0luZm86OlBBUkFNX1RZUEU7IH0pKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOworICAgIHBhcmFtcy5lbXBsYWNlX2JhY2sobmV3IEMyU3RyaW5nSW5mbyk7CisgICAgRVhQRUNUX0VRKDAsIENhc3RQYXJhbTxDMlN0cmluZ0luZm8+KHBhcmFtc1swXSktPnZhbHVlWzBdKTsKKyAgICBwYXJhbXMuZW1wbGFjZV9iYWNrKEMyRmxleFN0cmluZ0luZm86OkFsbG9jVW5pcXVlKDApKTsKKyAgICBFWFBFQ1RfRVEoMHUsIENhc3RQYXJhbTxDMkZsZXhTdHJpbmdJbmZvPihwYXJhbXNbMV0pLT5mbGV4Q291bnQoKSk7CisgICAgY2hhciAqZmxleFN0cmluZ0RhdGEgPSAmQ2FzdFBhcmFtPEMyRmxleFN0cmluZ0luZm8+KHBhcmFtc1sxXSktPm0udmFsdWVbMF07CisKKyAgICB1cGRhdGVyLnVwZGF0ZVBhcmFtc0Zyb21NZXNzYWdlKG1zZywgJnBhcmFtcyk7CisgICAgRVhQRUNUX1NUUkVRKCI1NiIsIENhc3RQYXJhbTxDMlN0cmluZ0luZm8+KHBhcmFtc1swXSktPnZhbHVlKTsKKyAgICBFWFBFQ1RfRVEoMTJ1LCBDYXN0UGFyYW08QzJGbGV4U3RyaW5nSW5mbz4ocGFyYW1zWzBdKS0+ZmxleENvdW50KCkpOworICAgIEVYUEVDVF9TVFJFUSgiU29tZSBzdHJpbmciLCBDYXN0UGFyYW08QzJGbGV4U3RyaW5nSW5mbz4ocGFyYW1zWzFdKS0+bS52YWx1ZSk7CisgICAgRVhQRUNUX05FKGZsZXhTdHJpbmdEYXRhLCAmQ2FzdFBhcmFtPEMyRmxleFN0cmluZ0luZm8+KHBhcmFtc1sxXSktPm0udmFsdWVbMF0pOworICAgIGZsZXhTdHJpbmdEYXRhID0gJkNhc3RQYXJhbTxDMkZsZXhTdHJpbmdJbmZvPihwYXJhbXNbMV0pLT5tLnZhbHVlWzBdOworCisgICAgLy8gdmVyaWZ5IHRydW5jYXRpb24gYW5kIGluLXBsYWNlIHVwZGF0ZQorICAgIG1zZ1sic3RyaW5nLnZhbHVlIl0gPSBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OlZhbHVlKEFTdHJpbmcoIjEyMzQ1Njc4OTBBQkNERSIpKTsKKyAgICBtc2dbImZsZXgtc3RyaW5nLnZhbHVlIl0gPSBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OlZhbHVlKEFTdHJpbmcoImFiYyIpKTsKKyAgICB1cGRhdGVyLnVwZGF0ZVBhcmFtc0Zyb21NZXNzYWdlKG1zZywgJnBhcmFtcyk7CisgICAgRVhQRUNUX1NUUkVRKCIxMjM0NTY3ODkwQSIsIENhc3RQYXJhbTxDMlN0cmluZ0luZm8+KHBhcmFtc1swXSktPnZhbHVlKTsKKyAgICBFWFBFQ1RfRVEoNHUsIENhc3RQYXJhbTxDMkZsZXhTdHJpbmdJbmZvPihwYXJhbXNbMV0pLT5mbGV4Q291bnQoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJhYmMiLCBDYXN0UGFyYW08QzJGbGV4U3RyaW5nSW5mbz4ocGFyYW1zWzFdKS0+bS52YWx1ZSk7CisgICAgRVhQRUNUX0VRKGZsZXhTdHJpbmdEYXRhLCAmQ2FzdFBhcmFtPEMyRmxleFN0cmluZ0luZm8+KHBhcmFtc1sxXSktPm0udmFsdWVbMF0pOworCisgICAgQVN0cmluZyBzdHJWYWx1ZTsKKyAgICBtc2cgPSB1cGRhdGVyLmdldFBhcmFtcyhwYXJhbXMpOworICAgIEFTU0VSVF9FUSgxdSwgbXNnLmNvdW50KCJzdHJpbmcudmFsdWUiKSk7CisgICAgRVhQRUNUX0VRKHRydWUsIG1zZ1sic3RyaW5nLnZhbHVlIl0uZmluZCgmc3RyVmFsdWUpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIjEyMzQ1Njc4OTBBIiwgc3RyVmFsdWUuY19zdHIoKSk7CisKKyAgICBBU1NFUlRfRVEoMXUsIG1zZy5jb3VudCgiZmxleC1zdHJpbmcudmFsdWUiKSk7CisgICAgRVhQRUNUX0VRKHRydWUsIG1zZ1siZmxleC1zdHJpbmcudmFsdWUiXS5maW5kKCZzdHJWYWx1ZSkpOworICAgIEVYUEVDVF9TVFJFUSgiYWJjIiwgc3RyVmFsdWUuY19zdHIoKSk7Cit9CisKK1RFU1RfRihSZWZsZWN0ZWRQYXJhbVVwZGF0ZXJUZXN0LCBDb21wb3NpdGVUZXN0KSB7CisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyIHVwZGF0ZXI7CisKKyAgICBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3QgbXNnOworICAgIG1zZy5lbXBsYWNlKCJjb21wb3NpdGUuaTMyIiwgaW50MzJfdCg3OCkpOworICAgIG1zZy5lbXBsYWNlKCJjb21wb3NpdGUudTY0IiwgaW50NjRfdCg5MTApKTsKKyAgICBtc2cuZW1wbGFjZSgiY29tcG9zaXRlLnN0ciIsIEFTdHJpbmcoIjExMTIiKSk7CisgICAgbXNnLmVtcGxhY2UoImNvbXBvc2l0ZS5ibG9iIiwgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KCJidWZmZXIwOCIsIDgpKTsKKyAgICBtc2cuZW1wbGFjZSgiY29tcG9zaXRlLmZsZXgtYmxvYiIsIEFCdWZmZXI6OkNyZWF0ZUFzQ29weSgiZmxleC1idWZmZXItMTQiLCAxNCkpOworCisgICAgdXBkYXRlci5hZGRQYXJhbURlc2MobVJlZmxlY3RvciwgbURlc2NyaXB0b3JzKTsKKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBpbmRpY2VzOworICAgIHVwZGF0ZXIuZ2V0UGFyYW1JbmRpY2VzRnJvbU1lc3NhZ2UobXNnLCAmaW5kaWNlcyk7CisgICAgRVhQRUNUX0VRKDAsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMkludEluZm86OlBBUkFNX1RZUEU7IH0pKTsKKyAgICBFWFBFQ1RfRVEoMCwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMyTG9uZ0luZm86OlBBUkFNX1RZUEU7IH0pKTsKKyAgICBFWFBFQ1RfRVEoMCwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMyU3RyaW5nSW5mbzo6UEFSQU1fVFlQRTsgfSkpOworICAgIEVYUEVDVF9FUSgxLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJDb21wb3NpdGVJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHBhcmFtczsKKyAgICBwYXJhbXMuZW1wbGFjZV9iYWNrKEMyQ29tcG9zaXRlSW5mbzo6QWxsb2NVbmlxdWUoMCkpOworICAgIEVYUEVDVF9FUSgwLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmkzMik7CisgICAgRVhQRUNUX0VRKDB1LCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLnU2NCk7CisgICAgRVhQRUNUX0VRKDAsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uc3RyWzBdKTsKKyAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKCJcMFwwXDBcMFwwXDBcMFwwIiwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5ibG9iLCA4KSk7CisgICAgRVhQRUNUX0VRKDB1LCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5mbGV4Q291bnQoKSk7CisgICAgdWludDhfdCAqZmxleEJsb2JEYXRhID0gJkNhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uZmxleEJsb2JbMF07CisKKyAgICB1cGRhdGVyLnVwZGF0ZVBhcmFtc0Zyb21NZXNzYWdlKG1zZywgJnBhcmFtcyk7CisgICAgRVhQRUNUX0VRKDc4LCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmkzMik7CisgICAgRVhQRUNUX0VRKDkxMHUsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0udTY0KTsKKyAgICBFWFBFQ1RfU1RSRVEoIjExMTIiLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLnN0cik7CisgICAgRVhQRUNUX0VRKDAsIG1lbWNtcCgiYnVmZmVyMDgiLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmJsb2IsIDgpKTsKKyAgICBBU3RyaW5nIGhleDsKKyAgICBoZXhkdW1wKENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uYmxvYiwgOCwgMCwgJmhleCk7CisgICAgcHJpbnRmKCIlc1xuIiwgaGV4LmNfc3RyKCkpOworICAgIEFTU0VSVF9FUSgxNHUsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPmZsZXhDb3VudCgpKTsKKyAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKCJmbGV4LWJ1ZmZlci0xNCIsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uZmxleEJsb2IsIDE0KSk7CisgICAgRVhQRUNUX05FKGZsZXhCbG9iRGF0YSwgJkNhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uZmxleEJsb2JbMF0pOworICAgIGZsZXhCbG9iRGF0YSA9ICZDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmZsZXhCbG9iWzBdOworCisgICAgLy8gdGVzdCBzZXR0aW5nIGFuZCB6ZXJvIGV4dGVuZGluZyBzaG9ydGVyIGJsb2IgdGhhbiBhbGxvd2VkCisgICAgbXNnLmNsZWFyKCk7CisgICAgbXNnLmVtcGxhY2UoImNvbXBvc2l0ZS5ibG9iIiwgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KCJidWYwNSIsIDUpKTsKKyAgICB1cGRhdGVyLnVwZGF0ZVBhcmFtc0Zyb21NZXNzYWdlKG1zZywgJnBhcmFtcyk7CisgICAgRVhQRUNUX0VRKDAsIG1lbWNtcCgiYnVmMDVcMFwwXDAiLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmJsb2IsIDgpKTsKKyAgICBBU1NFUlRfRVEoMTR1LCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5mbGV4Q291bnQoKSk7CisgICAgRVhQRUNUX0VRKDAsIG1lbWNtcCgiZmxleC1idWZmZXItMTQiLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmZsZXhCbG9iLCAxNCkpOworICAgIEVYUEVDVF9FUShmbGV4QmxvYkRhdGEsICZDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmZsZXhCbG9iWzBdKTsKKworICAgIC8vIHRlc3Qgc2V0dGluZyBhbmQgdHJpbW1pbmcgbGFyZ2VyIGJsb2IgdGhhbiBhbGxvd2VkCisgICAgbXNnLmNsZWFyKCk7CisgICAgbXNnLmVtcGxhY2UoImNvbXBvc2l0ZS5ibG9iIiwgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KCJSZWFsbHlMb25nQnVmZmVyIiwgMTYpKTsKKyAgICB1cGRhdGVyLnVwZGF0ZVBhcmFtc0Zyb21NZXNzYWdlKG1zZywgJnBhcmFtcyk7CisgICAgRVhQRUNUX0VRKDAsIG1lbWNtcCgiUmVhbGx5TG8iLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmJsb2IsIDgpKTsKKyAgICBBU1NFUlRfRVEoMTR1LCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5mbGV4Q291bnQoKSk7CisgICAgRVhQRUNUX0VRKDAsIG1lbWNtcCgiZmxleC1idWZmZXItMTQiLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmZsZXhCbG9iLCAxNCkpOworICAgIEVYUEVDVF9FUShmbGV4QmxvYkRhdGEsICZDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmZsZXhCbG9iWzBdKTsKKworICAgIC8vIHRlc3QgdHJpbW1pbmcgZmxleCBibG9iIGluLXBsYWNlCisgICAgbXNnLmNsZWFyKCk7CisgICAgbXNnLmVtcGxhY2UoImNvbXBvc2l0ZS5mbGV4LWJsb2IiLCBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoImJ1ZjA1IiwgNSkpOworICAgIHVwZGF0ZXIudXBkYXRlUGFyYW1zRnJvbU1lc3NhZ2UobXNnLCAmcGFyYW1zKTsKKyAgICBBU1NFUlRfRVEoNXUsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPmZsZXhDb3VudCgpKTsKKyAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKCJidWYwNSIsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uZmxleEJsb2IsIDUpKTsKKyAgICBFWFBFQ1RfRVEoZmxleEJsb2JEYXRhLCAmQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5mbGV4QmxvYlswXSk7Cit9CisKK1RFU1RfRihSZWZsZWN0ZWRQYXJhbVVwZGF0ZXJUZXN0LCBDb21wb3NpdGVQYXJ0aWFsVGVzdCkgeworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlciB1cGRhdGVyOworCisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0IG1zZzsKKyAgICBtc2cuZW1wbGFjZSgiY29tcG9zaXRlLmkzMiIsIEMyVmFsdWUoMTMxNCkpOworICAgIG1zZy5lbXBsYWNlKCJjb21wb3NpdGUuc3RyIiwgQVN0cmluZygiMTUxNiIpKTsKKworICAgIHVwZGF0ZXIuYWRkUGFyYW1EZXNjKG1SZWZsZWN0b3IsIG1EZXNjcmlwdG9ycyk7CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlczsKKyAgICB1cGRhdGVyLmdldFBhcmFtSW5kaWNlc0Zyb21NZXNzYWdlKG1zZywgJmluZGljZXMpOworICAgIEVYUEVDVF9FUSgwLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJJbnRJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDAsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMkxvbmdJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDAsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMlN0cmluZ0luZm86OlBBUkFNX1RZUEU7IH0pKTsKKyAgICBFWFBFQ1RfRVEoMSwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMyQ29tcG9zaXRlSW5mbzo6UEFSQU1fVFlQRTsgfSkpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbXM7CisgICAgcGFyYW1zLmVtcGxhY2VfYmFjayhDMkNvbXBvc2l0ZUluZm86OkFsbG9jVW5pcXVlKDEydSkpOworICAgIEVYUEVDVF9FUSgwLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmkzMik7CisgICAgRVhQRUNUX0VRKDB1LCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLnU2NCk7CisgICAgRVhQRUNUX0VRKDAsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uc3RyWzBdKTsKKworICAgIHVwZGF0ZXIudXBkYXRlUGFyYW1zRnJvbU1lc3NhZ2UobXNnLCAmcGFyYW1zKTsKKyAgICBFWFBFQ1RfRVEoMTMxNCwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5pMzIpOworICAgIEVYUEVDVF9FUSgwdSwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS51NjQpOworICAgIEVYUEVDVF9TVFJFUSgiMTUxNiIsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uc3RyKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjZjM2U5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzNiBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJzZnBsdWdpbl9jY29kZWNfdXRpbHMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDb2RlYzJCdWZmZXJVdGlscy5jcHAiLAorICAgICAgICAiQ29kZWMyTWFwcGVyLmNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgIi4iLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkJ1ZmZlclV0aWxzLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRkMjJhMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5jcHAKQEAgLTAsMCArMSw0MTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyQnVmZmVyVXRpbHMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG11dGV4PgorCisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorCisjaW5jbHVkZSAiQ29kZWMyQnVmZmVyVXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCisvKioKKyAqIEEgZmxpcHBhYmxlLCBvcHRpbWl6YWJsZSBtZW1jcHkuIENvbnN0cnVjdHMgc3VjaCBhcyAoZnJvbSA/IHNyYyA6IGRzdCkgZG8gbm90IHdvcmsgYXMgdGhlIHJlc3VsdHMgYXJlCisgKiBhbHdheXMgY29uc3QuCisgKi8KK3RlbXBsYXRlPGJvb2wgVG9BLCBzaXplX3QgUz4KK3N0cnVjdCBNZW1Db3BpZXIgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+CisgICAgaW5saW5lIHN0YXRpYyB2b2lkIGNvcHkoQSAqYSwgY29uc3QgQiAqYiwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgX19idWlsdGluX21lbWNweShhLCBiLCBzaXplKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTxzaXplX3QgUz4KK3N0cnVjdCBNZW1Db3BpZXI8ZmFsc2UsIFM+IHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPgorICAgIGlubGluZSBzdGF0aWMgdm9pZCBjb3B5KGNvbnN0IEEgKmEsIEIgKmIsIHNpemVfdCBzaXplKSB7CisgICAgICAgIE1lbUNvcGllcjx0cnVlLCBTPjo6Y29weShiLCBhLCBzaXplKTsKKyAgICB9Cit9OworCisvKioKKyAqIENvcGllcyBiZXR3ZWVuIGEgTWVkaWFJbWFnZSBhbmQgYSBncmFwaGljIHZpZXcuCisgKgorICogXHBhcmFtIFRvTWVkaWFJbWFnZSB3aGV0aGVyIHRvIGNvcHkgdG8gKG9yIGZyb20pIHRoZSBNZWRpYUltYWdlCisgKiBccGFyYW0gdmlldyBncmFwaGljIHZpZXcgKGNvdWxkIGJlIENvbnN0R3JhcGhpY1ZpZXcgb3IgR3JhcGhpY1ZpZXcgZGVwZW5kaW5nIG9uIGRpcmVjdGlvbikKKyAqIFxwYXJhbSBpbWcgTWVkaWFJbWFnZSBkYXRhCisgKiBccGFyYW0gaW1nQmFzZSBiYXNlIG9mIE1lZGlhSW1hZ2UgKGNvdWxkIGJlIGNvbnN0IHVpbnQ4X3QqIG9yIHVpbnQ4X3QqIGRlcGVuZGluZyBvbiBkaXJlY3Rpb24pCisgKi8KK3RlbXBsYXRlPGJvb2wgVG9NZWRpYUltYWdlLCB0eXBlbmFtZSBWaWV3LCB0eXBlbmFtZSBJbWFnZVBpeGVsPgorc3RhdGljIHN0YXR1c190IF9JbWFnZUNvcHkoVmlldyAmdmlldywgY29uc3QgTWVkaWFJbWFnZTIgKmltZywgSW1hZ2VQaXhlbCAqaW1nQmFzZSkgeworICAgIC8vIFRPRE86IG1vcmUgZWZmaWNpZW50IGNvcHlpbmcgLS0tIGUuZy4gb25lIHJvdyBhdCBhIHRpbWUsIGNvcHlpbmcKKyAgICAvLyAgICAgICBpbnRlcmxlYXZlZCBwbGFuZXMgdG9nZXRoZXIsIGV0Yy4KKyAgICBjb25zdCBDMlBsYW5hckxheW91dCAmbGF5b3V0ID0gdmlldy5sYXlvdXQoKTsKKyAgICBjb25zdCBzaXplX3QgYnBwID0gZGl2VXAoaW1nLT5tQml0RGVwdGhBbGxvY2F0ZWQsIDh1KTsKKyAgICBpZiAodmlldy53aWR0aCgpICE9IGltZy0+bVdpZHRoCisgICAgICAgICAgICB8fCB2aWV3LmhlaWdodCgpICE9IGltZy0+bUhlaWdodCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbGF5b3V0Lm51bVBsYW5lczsgKytpKSB7CisgICAgICAgIHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8VG9NZWRpYUltYWdlLCB1aW50OF90LCBjb25zdCB1aW50OF90Pjo6dHlwZSAqaW1nUm93ID0KKyAgICAgICAgICAgIGltZ0Jhc2UgKyBpbWctPm1QbGFuZVtpXS5tT2Zmc2V0OworICAgICAgICB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPFRvTWVkaWFJbWFnZSwgY29uc3QgdWludDhfdCwgdWludDhfdD46OnR5cGUgKnZpZXdSb3cgPQorICAgICAgICAgICAgdmlld1JvdyA9IHZpZXcuZGF0YSgpW2ldOworICAgICAgICBjb25zdCBDMlBsYW5lSW5mbyAmcGxhbmUgPSBsYXlvdXQucGxhbmVzW2ldOworICAgICAgICBpZiAocGxhbmUuY29sU2FtcGxpbmcgIT0gaW1nLT5tUGxhbmVbaV0ubUhvcml6U3Vic2FtcGxpbmcKKyAgICAgICAgICAgICAgICB8fCBwbGFuZS5yb3dTYW1wbGluZyAhPSBpbWctPm1QbGFuZVtpXS5tVmVydFN1YnNhbXBsaW5nCisgICAgICAgICAgICAgICAgfHwgcGxhbmUuYWxsb2NhdGVkRGVwdGggIT0gaW1nLT5tQml0RGVwdGhBbGxvY2F0ZWQKKyAgICAgICAgICAgICAgICB8fCBwbGFuZS5hbGxvY2F0ZWREZXB0aCA8IHBsYW5lLmJpdERlcHRoCisgICAgICAgICAgICAgICAgLy8gTWVkaWFJbWFnZSBvbmx5IHN1cHBvcnRzIE1TQiB2YWx1ZXMKKyAgICAgICAgICAgICAgICB8fCBwbGFuZS5yaWdodFNoaWZ0ICE9IHBsYW5lLmFsbG9jYXRlZERlcHRoIC0gcGxhbmUuYml0RGVwdGgKKyAgICAgICAgICAgICAgICB8fCAoYnBwID4gMSAmJiBwbGFuZS5lbmRpYW5uZXNzICE9IHBsYW5lLk5BVElWRSkpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICB1aW50MzJfdCBwbGFuZVcgPSBpbWctPm1XaWR0aCAvIHBsYW5lLmNvbFNhbXBsaW5nOworICAgICAgICB1aW50MzJfdCBwbGFuZUggPSBpbWctPm1IZWlnaHQgLyBwbGFuZS5yb3dTYW1wbGluZzsKKworICAgICAgICBib29sIGNhbkNvcHlCeVJvdyA9IChwbGFuZS5jb2xJbmMgPT0gMSkgJiYgKGltZy0+bVBsYW5lW2ldLm1Db2xJbmMgPT0gMSk7CisgICAgICAgIGJvb2wgY2FuQ29weUJ5UGxhbmUgPSBjYW5Db3B5QnlSb3cgJiYgKHBsYW5lLnJvd0luYyA9PSBpbWctPm1QbGFuZVtpXS5tUm93SW5jKTsKKyAgICAgICAgaWYgKGNhbkNvcHlCeVBsYW5lKSB7CisgICAgICAgICAgICBNZW1Db3BpZXI8VG9NZWRpYUltYWdlLCAwPjo6Y29weShpbWdSb3csIHZpZXdSb3csIHBsYW5lLnJvd0luYyAqIHBsYW5lSCk7CisgICAgICAgIH0gZWxzZSBpZiAoY2FuQ29weUJ5Um93KSB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHJvdyA9IDA7IHJvdyA8IHBsYW5lSDsgKytyb3cpIHsKKyAgICAgICAgICAgICAgICBNZW1Db3BpZXI8VG9NZWRpYUltYWdlLCAwPjo6Y29weSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGltZ1Jvdywgdmlld1Jvdywgc3RkOjptaW4ocGxhbmUucm93SW5jLCBpbWctPm1QbGFuZVtpXS5tUm93SW5jKSk7CisgICAgICAgICAgICAgICAgaW1nUm93ICs9IGltZy0+bVBsYW5lW2ldLm1Sb3dJbmM7CisgICAgICAgICAgICAgICAgdmlld1JvdyArPSBwbGFuZS5yb3dJbmM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHJvdyA9IDA7IHJvdyA8IHBsYW5lSDsgKytyb3cpIHsKKyAgICAgICAgICAgICAgICBkZWNsdHlwZShpbWdSb3cpIGltZ1B0ciA9IGltZ1JvdzsKKyAgICAgICAgICAgICAgICBkZWNsdHlwZSh2aWV3Um93KSB2aWV3UHRyID0gdmlld1JvdzsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGNvbCA9IDA7IGNvbCA8IHBsYW5lVzsgKytjb2wpIHsKKyAgICAgICAgICAgICAgICAgICAgTWVtQ29waWVyPFRvTWVkaWFJbWFnZSwgMD46OmNvcHkoaW1nUHRyLCB2aWV3UHRyLCBicHApOworICAgICAgICAgICAgICAgICAgICBpbWdQdHIgKz0gaW1nLT5tUGxhbmVbaV0ubUNvbEluYzsKKyAgICAgICAgICAgICAgICAgICAgdmlld1B0ciArPSBwbGFuZS5jb2xJbmM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGltZ1JvdyArPSBpbWctPm1QbGFuZVtpXS5tUm93SW5jOworICAgICAgICAgICAgICAgIHZpZXdSb3cgKz0gcGxhbmUucm93SW5jOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK3N0YXR1c190IEltYWdlQ29weSh1aW50OF90ICppbWdCYXNlLCBjb25zdCBNZWRpYUltYWdlMiAqaW1nLCBjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KSB7CisgICAgcmV0dXJuIF9JbWFnZUNvcHk8dHJ1ZT4odmlldywgaW1nLCBpbWdCYXNlKTsKK30KKworc3RhdHVzX3QgSW1hZ2VDb3B5KEMyR3JhcGhpY1ZpZXcgJnZpZXcsIGNvbnN0IHVpbnQ4X3QgKmltZ0Jhc2UsIGNvbnN0IE1lZGlhSW1hZ2UyICppbWcpIHsKKyAgICByZXR1cm4gX0ltYWdlQ29weTxmYWxzZT4odmlldywgaW1nLCBpbWdCYXNlKTsKK30KKworYm9vbCBJc1lVVjQyMChjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KSB7CisgICAgY29uc3QgQzJQbGFuYXJMYXlvdXQgJmxheW91dCA9IHZpZXcubGF5b3V0KCk7CisgICAgcmV0dXJuIChsYXlvdXQubnVtUGxhbmVzID09IDMKKyAgICAgICAgICAgICYmIGxheW91dC50eXBlID09IEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfWV0uY2hhbm5lbCA9PSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9ZCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9ZXS5hbGxvY2F0ZWREZXB0aCA9PSA4CisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9ZXS5iaXREZXB0aCA9PSA4CisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9ZXS5yaWdodFNoaWZ0ID09IDAKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ldLmNvbFNhbXBsaW5nID09IDEKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ldLnJvd1NhbXBsaW5nID09IDEKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLmNoYW5uZWwgPT0gQzJQbGFuZUluZm86OkNIQU5ORUxfQ0IKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLmFsbG9jYXRlZERlcHRoID09IDgKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLmJpdERlcHRoID09IDgKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLnJpZ2h0U2hpZnQgPT0gMAorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uY29sU2FtcGxpbmcgPT0gMgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0ucm93U2FtcGxpbmcgPT0gMgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0uY2hhbm5lbCA9PSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DUgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0uYWxsb2NhdGVkRGVwdGggPT0gOAorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0uYml0RGVwdGggPT0gOAorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0ucmlnaHRTaGlmdCA9PSAwCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5jb2xTYW1wbGluZyA9PSAyCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5yb3dTYW1wbGluZyA9PSAyKTsKK30KKworTWVkaWFJbWFnZTIgQ3JlYXRlWVVWNDIwUGxhbmFyTWVkaWFJbWFnZTIoCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IHN0cmlkZSwgdWludDMyX3QgdnN0cmlkZSkgeworICAgIHJldHVybiBNZWRpYUltYWdlMiB7CisgICAgICAgIC5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1lVViwKKyAgICAgICAgLm1OdW1QbGFuZXMgPSAzLAorICAgICAgICAubVdpZHRoID0gd2lkdGgsCisgICAgICAgIC5tSGVpZ2h0ID0gaGVpZ2h0LAorICAgICAgICAubUJpdERlcHRoID0gOCwKKyAgICAgICAgLm1CaXREZXB0aEFsbG9jYXRlZCA9IDgsCisgICAgICAgIC5tUGxhbmUgPSB7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLm1PZmZzZXQgPSAwLAorICAgICAgICAgICAgICAgIC5tQ29sSW5jID0gMSwKKyAgICAgICAgICAgICAgICAubVJvd0luYyA9IChpbnQzMl90KXN0cmlkZSwKKyAgICAgICAgICAgICAgICAubUhvcml6U3Vic2FtcGxpbmcgPSAxLAorICAgICAgICAgICAgICAgIC5tVmVydFN1YnNhbXBsaW5nID0gMSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLm1PZmZzZXQgPSBzdHJpZGUgKiB2c3RyaWRlLAorICAgICAgICAgICAgICAgIC5tQ29sSW5jID0gMSwKKyAgICAgICAgICAgICAgICAubVJvd0luYyA9IChpbnQzMl90KXN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgLm1Ib3JpelN1YnNhbXBsaW5nID0gMiwKKyAgICAgICAgICAgICAgICAubVZlcnRTdWJzYW1wbGluZyA9IDIsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC5tT2Zmc2V0ID0gc3RyaWRlICogdnN0cmlkZSAqIDUgLyA0LAorICAgICAgICAgICAgICAgIC5tQ29sSW5jID0gMSwKKyAgICAgICAgICAgICAgICAubVJvd0luYyA9IChpbnQzMl90KXN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgLm1Ib3JpelN1YnNhbXBsaW5nID0gMiwKKyAgICAgICAgICAgICAgICAubVZlcnRTdWJzYW1wbGluZyA9IDIsCisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgfTsKK30KKworTWVkaWFJbWFnZTIgQ3JlYXRlWVVWNDIwU2VtaVBsYW5hck1lZGlhSW1hZ2UyKAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBzdHJpZGUsIHVpbnQzMl90IHZzdHJpZGUpIHsKKyAgICByZXR1cm4gTWVkaWFJbWFnZTIgeworICAgICAgICAubVR5cGUgPSBNZWRpYUltYWdlMjo6TUVESUFfSU1BR0VfVFlQRV9ZVVYsCisgICAgICAgIC5tTnVtUGxhbmVzID0gMywKKyAgICAgICAgLm1XaWR0aCA9IHdpZHRoLAorICAgICAgICAubUhlaWdodCA9IGhlaWdodCwKKyAgICAgICAgLm1CaXREZXB0aCA9IDgsCisgICAgICAgIC5tQml0RGVwdGhBbGxvY2F0ZWQgPSA4LAorICAgICAgICAubVBsYW5lID0geworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC5tT2Zmc2V0ID0gMCwKKyAgICAgICAgICAgICAgICAubUNvbEluYyA9IDEsCisgICAgICAgICAgICAgICAgLm1Sb3dJbmMgPSAoaW50MzJfdClzdHJpZGUsCisgICAgICAgICAgICAgICAgLm1Ib3JpelN1YnNhbXBsaW5nID0gMSwKKyAgICAgICAgICAgICAgICAubVZlcnRTdWJzYW1wbGluZyA9IDEsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC5tT2Zmc2V0ID0gc3RyaWRlICogdnN0cmlkZSwKKyAgICAgICAgICAgICAgICAubUNvbEluYyA9IDIsCisgICAgICAgICAgICAgICAgLm1Sb3dJbmMgPSAoaW50MzJfdClzdHJpZGUsCisgICAgICAgICAgICAgICAgLm1Ib3JpelN1YnNhbXBsaW5nID0gMiwKKyAgICAgICAgICAgICAgICAubVZlcnRTdWJzYW1wbGluZyA9IDIsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC5tT2Zmc2V0ID0gc3RyaWRlICogdnN0cmlkZSArIDEsCisgICAgICAgICAgICAgICAgLm1Db2xJbmMgPSAyLAorICAgICAgICAgICAgICAgIC5tUm93SW5jID0gKGludDMyX3Qpc3RyaWRlLAorICAgICAgICAgICAgICAgIC5tSG9yaXpTdWJzYW1wbGluZyA9IDIsCisgICAgICAgICAgICAgICAgLm1WZXJ0U3Vic2FtcGxpbmcgPSAyLAorICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgIH07Cit9CisKK3N0YXR1c190IENvbnZlcnRSR0JUb1BsYW5hcllVVigKKyAgICAgICAgdWludDhfdCAqZHN0WSwgc2l6ZV90IGRzdFN0cmlkZSwgc2l6ZV90IGRzdFZTdHJpZGUsIHNpemVfdCBidWZmZXJTaXplLAorICAgICAgICBjb25zdCBDMkdyYXBoaWNWaWV3ICZzcmMpIHsKKyAgICBDSEVDSyhkc3RZICE9IG51bGxwdHIpOworICAgIENIRUNLKChzcmMud2lkdGgoKSAmIDEpID09IDApOworICAgIENIRUNLKChzcmMuaGVpZ2h0KCkgJiAxKSA9PSAwKTsKKworICAgIGlmIChkc3RTdHJpZGUgKiBkc3RWU3RyaWRlICogMyAvIDIgPiBidWZmZXJTaXplKSB7CisgICAgICAgIEFMT0dEKCJjb252ZXJzaW9uIGJ1ZmZlciBpcyB0b28gc21hbGwgZm9yIGNvbnZlcnRpbmcgZnJvbSBSR0IgdG8gWVVWIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgdWludDhfdCAqZHN0VSA9IGRzdFkgKyBkc3RTdHJpZGUgKiBkc3RWU3RyaWRlOworICAgIHVpbnQ4X3QgKmRzdFYgPSBkc3RVICsgKGRzdFN0cmlkZSA+PiAxKSAqIChkc3RWU3RyaWRlID4+IDEpOworCisgICAgY29uc3QgQzJQbGFuYXJMYXlvdXQgJmxheW91dCA9IHNyYy5sYXlvdXQoKTsKKyAgICBjb25zdCB1aW50OF90ICpwUmVkICAgPSBzcmMuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9SXTsKKyAgICBjb25zdCB1aW50OF90ICpwR3JlZW4gPSBzcmMuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9HXTsKKyAgICBjb25zdCB1aW50OF90ICpwQmx1ZSAgPSBzcmMuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9CXTsKKworI2RlZmluZSBDTElQMyh4LHkseikgKCgoeikgPCAoeCkpID8gKHgpIDogKCgoeikgPiAoeSkpID8gKHkpIDogKHopKSkKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IHNyYy5oZWlnaHQoKTsgKyt5KSB7CisgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgc3JjLndpZHRoKCk7ICsreCkgeworICAgICAgICAgICAgdWludDhfdCByZWQgPSAqcFJlZDsKKyAgICAgICAgICAgIHVpbnQ4X3QgZ3JlZW4gPSAqcEdyZWVuOworICAgICAgICAgICAgdWludDhfdCBibHVlID0gKnBCbHVlOworCisgICAgICAgICAgICAvLyB1c2luZyBJVFUtUiBCVC42MDEgY29udmVyc2lvbiBtYXRyaXgKKyAgICAgICAgICAgIHVuc2lnbmVkIGx1bWEgPQorICAgICAgICAgICAgICAgIENMSVAzKDAsICgoKHJlZCAqIDY2ICsgZ3JlZW4gKiAxMjkgKyBibHVlICogMjUpID4+IDgpICsgMTYpLCAyNTUpOworCisgICAgICAgICAgICBkc3RZW3hdID0gbHVtYTsKKworICAgICAgICAgICAgaWYgKCh4ICYgMSkgPT0gMCAmJiAoeSAmIDEpID09IDApIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBVID0KKyAgICAgICAgICAgICAgICAgICAgQ0xJUDMoMCwgKCgoLXJlZCAqIDM4IC0gZ3JlZW4gKiA3NCArIGJsdWUgKiAxMTIpID4+IDgpICsgMTI4KSwgMjU1KTsKKworICAgICAgICAgICAgICAgIHVuc2lnbmVkIFYgPQorICAgICAgICAgICAgICAgICAgICBDTElQMygwLCAoKChyZWQgKiAxMTIgLSBncmVlbiAqIDk0IC0gYmx1ZSAqIDE4KSA+PiA4KSArIDEyOCksIDI1NSk7CisKKyAgICAgICAgICAgICAgICBkc3RVW3ggPj4gMV0gPSBVOworICAgICAgICAgICAgICAgIGRzdFZbeCA+PiAxXSA9IFY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwUmVkICAgKz0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfUl0uY29sSW5jOworICAgICAgICAgICAgcEdyZWVuICs9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0ddLmNvbEluYzsKKyAgICAgICAgICAgIHBCbHVlICArPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9CXS5jb2xJbmM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHkgJiAxKSA9PSAwKSB7CisgICAgICAgICAgICBkc3RVICs9IGRzdFN0cmlkZSA+PiAxOworICAgICAgICAgICAgZHN0ViArPSBkc3RTdHJpZGUgPj4gMTsKKyAgICAgICAgfQorCisgICAgICAgIHBSZWQgICAtPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9SXS5jb2xJbmMgKiBzcmMud2lkdGgoKTsKKyAgICAgICAgcEdyZWVuIC09IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0ddLmNvbEluYyAqIHNyYy53aWR0aCgpOworICAgICAgICBwQmx1ZSAgLT0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfQl0uY29sSW5jICogc3JjLndpZHRoKCk7CisgICAgICAgIHBSZWQgICArPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9SXS5yb3dJbmM7CisgICAgICAgIHBHcmVlbiArPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9HXS5yb3dJbmM7CisgICAgICAgIHBCbHVlICArPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9CXS5yb3dJbmM7CisKKyAgICAgICAgZHN0WSArPSBkc3RTdHJpZGU7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworbmFtZXNwYWNlIHsKKworLyoqCisgKiBBIGJsb2NrIG9mIHJhdyBhbGxvY2F0ZWQgbWVtb3J5LgorICovCitzdHJ1Y3QgTWVtb3J5QmxvY2tQb29sQmxvY2sgeworICAgIE1lbW9yeUJsb2NrUG9vbEJsb2NrKHNpemVfdCBzaXplKQorICAgICAgICA6IG1EYXRhKG5ldyB1aW50OF90W3NpemVdKSwgbVNpemUobURhdGEgPyBzaXplIDogMCkgeyB9CisKKyAgICB+TWVtb3J5QmxvY2tQb29sQmxvY2soKSB7CisgICAgICAgIGRlbGV0ZVtdIG1EYXRhOworICAgIH0KKworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRGF0YTsKKyAgICB9CisKKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TaXplOworICAgIH0KKworICAgIEMyX0RPX05PVF9DT1BZKE1lbW9yeUJsb2NrUG9vbEJsb2NrKTsKKworcHJpdmF0ZToKKyAgICB1aW50OF90ICptRGF0YTsKKyAgICBzaXplX3QgbVNpemU7Cit9OworCisvKioKKyAqIEEgc2ltcGxlIHJhdyBtZW1vcnkgYmxvY2sgcG9vbCBpbXBsZW1lbnRhdGlvbi4KKyAqLworc3RydWN0IE1lbW9yeUJsb2NrUG9vbEltcGwgeworICAgIHZvaWQgcmVsZWFzZShzdGQ6Omxpc3Q8TWVtb3J5QmxvY2tQb29sQmxvY2s+Ojpjb25zdF9pdGVyYXRvciBibG9jaykgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICAvLyByZXR1cm4gYmxvY2sgdG8gZnJlZSBibG9ja3MgaWYgaXQgaXMgdGhlIGN1cnJlbnQgc2l6ZTsgb3RoZXJ3aXNlLCBkaXNjYXJkCisgICAgICAgIGlmIChibG9jay0+c2l6ZSgpID09IG1DdXJyZW50U2l6ZSkgeworICAgICAgICAgICAgbUZyZWVCbG9ja3Muc3BsaWNlKG1GcmVlQmxvY2tzLmJlZ2luKCksIG1CbG9ja3NJblVzZSwgYmxvY2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUJsb2Nrc0luVXNlLmVyYXNlKGJsb2NrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6bGlzdDxNZW1vcnlCbG9ja1Bvb2xCbG9jaz46OmNvbnN0X2l0ZXJhdG9yIGZldGNoKHNpemVfdCBzaXplKSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIG1GcmVlQmxvY2tzLnJlbW92ZV9pZihbc2l6ZV0oY29uc3QgTWVtb3J5QmxvY2tQb29sQmxvY2sgJmJsb2NrKSAtPiBib29sIHsKKyAgICAgICAgICAgIHJldHVybiBibG9jay5zaXplKCkgIT0gc2l6ZTsKKyAgICAgICAgfSk7CisgICAgICAgIG1DdXJyZW50U2l6ZSA9IHNpemU7CisgICAgICAgIGlmIChtRnJlZUJsb2Nrcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBtQmxvY2tzSW5Vc2UuZW1wbGFjZV9mcm9udChzaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1CbG9ja3NJblVzZS5zcGxpY2UobUJsb2Nrc0luVXNlLmJlZ2luKCksIG1GcmVlQmxvY2tzLCBtRnJlZUJsb2Nrcy5iZWdpbigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUJsb2Nrc0luVXNlLmJlZ2luKCk7CisgICAgfQorCisgICAgTWVtb3J5QmxvY2tQb29sSW1wbCgpID0gZGVmYXVsdDsKKworICAgIEMyX0RPX05PVF9DT1BZKE1lbW9yeUJsb2NrUG9vbEltcGwpOworCitwcml2YXRlOgorICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIHN0ZDo6bGlzdDxNZW1vcnlCbG9ja1Bvb2xCbG9jaz4gbUZyZWVCbG9ja3M7CisgICAgc3RkOjpsaXN0PE1lbW9yeUJsb2NrUG9vbEJsb2NrPiBtQmxvY2tzSW5Vc2U7CisgICAgc2l6ZV90IG1DdXJyZW50U2l6ZTsKK307CisKK30gLy8gbmFtZXNwYWNlCisKK3N0cnVjdCBNZW1vcnlCbG9ja1Bvb2w6OkltcGwgOiBNZW1vcnlCbG9ja1Bvb2xJbXBsIHsKK307CisKK3N0cnVjdCBNZW1vcnlCbG9jazo6SW1wbCB7CisgICAgSW1wbChzdGQ6Omxpc3Q8TWVtb3J5QmxvY2tQb29sQmxvY2s+Ojpjb25zdF9pdGVyYXRvciBibG9jaywKKyAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxNZW1vcnlCbG9ja1Bvb2xJbXBsPiBwb29sKQorICAgICAgICA6IG1CbG9jayhibG9jayksIG1Qb29sKHBvb2wpIHsKKyAgICB9CisKKyAgICB+SW1wbCgpIHsKKyAgICAgICAgbVBvb2wtPnJlbGVhc2UobUJsb2NrKTsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICpkYXRhKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUJsb2NrLT5kYXRhKCk7CisgICAgfQorCisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQmxvY2stPnNpemUoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpsaXN0PE1lbW9yeUJsb2NrUG9vbEJsb2NrPjo6Y29uc3RfaXRlcmF0b3IgbUJsb2NrOworICAgIHN0ZDo6c2hhcmVkX3B0cjxNZW1vcnlCbG9ja1Bvb2xJbXBsPiBtUG9vbDsKK307CisKK01lbW9yeUJsb2NrIE1lbW9yeUJsb2NrUG9vbDo6ZmV0Y2goc2l6ZV90IHNpemUpIHsKKyAgICBzdGQ6Omxpc3Q8TWVtb3J5QmxvY2tQb29sQmxvY2s+Ojpjb25zdF9pdGVyYXRvciBwb29sQmxvY2sgPSBtSW1wbC0+ZmV0Y2goc2l6ZSk7CisgICAgcmV0dXJuIE1lbW9yeUJsb2NrKHN0ZDo6bWFrZV9zaGFyZWQ8TWVtb3J5QmxvY2s6OkltcGw+KAorICAgICAgICAgICAgcG9vbEJsb2NrLCBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8TWVtb3J5QmxvY2tQb29sSW1wbD4obUltcGwpKSk7Cit9CisKK01lbW9yeUJsb2NrUG9vbDo6TWVtb3J5QmxvY2tQb29sKCkKKyAgICA6IG1JbXBsKHN0ZDo6bWFrZV9zaGFyZWQ8TWVtb3J5QmxvY2tQb29sOjpJbXBsPigpKSB7Cit9CisKK01lbW9yeUJsb2NrOjpNZW1vcnlCbG9jayhzdGQ6OnNoYXJlZF9wdHI8TWVtb3J5QmxvY2s6OkltcGw+IGltcGwpCisgICAgOiBtSW1wbChpbXBsKSB7Cit9CisKK01lbW9yeUJsb2NrOjpNZW1vcnlCbG9jaygpID0gZGVmYXVsdDsKKworTWVtb3J5QmxvY2s6On5NZW1vcnlCbG9jaygpID0gZGVmYXVsdDsKKworY29uc3QgdWludDhfdCogTWVtb3J5QmxvY2s6OmRhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsID8gbUltcGwtPmRhdGEoKSA6IG51bGxwdHI7Cit9CisKK3NpemVfdCBNZW1vcnlCbG9jazo6c2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwgPyBtSW1wbC0+c2l6ZSgpIDogMDsKK30KKworTWVtb3J5QmxvY2sgTWVtb3J5QmxvY2s6OkFsbG9jYXRlKHNpemVfdCBzaXplKSB7CisgICAgcmV0dXJuIE1lbW9yeUJsb2NrUG9vbCgpLmZldGNoKHNpemUpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkJ1ZmZlclV0aWxzLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyQnVmZmVyVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWY2Nzc2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkJ1ZmZlclV0aWxzLmgKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9CVUZGRVJfVVRJTFNfSF8KKyNkZWZpbmUgQ09ERUMyX0JVRkZFUl9VVElMU19IXworCisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMlBhcmFtRGVmLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogQ29udmVydHMgYW4gUkdCIHZpZXcgdG8gcGxhbmFyIFlVViA0MjAgbWVkaWEgaW1hZ2UuCisgKgorICogXHBhcmFtIGRzdFkgICAgICAgcG9pbnRlciB0byBtZWRpYSBpbWFnZSBidWZmZXIKKyAqIFxwYXJhbSBkc3RTdHJpZGUgIHN0cmlkZSBpbiBieXRlcworICogXHBhcmFtIGRzdFZTdHJpZGUgdmVydGljYWwgc3RyaWRlIGluIHBpeGVscworICogXHBhcmFtIGJ1ZmZlclNpemUgbWVkaWEgaW1hZ2UgYnVmZmVyIHNpemUKKyAqIFxwYXJhbSBzcmMgc291cmNlIGltYWdlCisgKgorICogXHJldHZhbCBOT19NRU1PUlkgbWVkaWEgaW1hZ2UgaXMgdG9vIHNtYWxsCisgKiBccmV0dmFsIE9LIG9uIHN1Y2Nlc3MKKyAqLworc3RhdHVzX3QgQ29udmVydFJHQlRvUGxhbmFyWVVWKAorICAgICAgICB1aW50OF90ICpkc3RZLCBzaXplX3QgZHN0U3RyaWRlLCBzaXplX3QgZHN0VlN0cmlkZSwgc2l6ZV90IGJ1ZmZlclNpemUsCisgICAgICAgIGNvbnN0IEMyR3JhcGhpY1ZpZXcgJnNyYyk7CisKKy8qKgorICogUmV0dXJucyBhIHBsYW5hciBZVVYgNDIwIDgtYml0IG1lZGlhIGltYWdlIGRlc2NyaXB0b3IuCisgKgorICogXHBhcmFtIHdpZHRoIHdpZHRoIG9mIGltYWdlIGluIHBpeGVscworICogXHBhcmFtIGhlaWdodCBoZWlnaHQgb2YgaW1hZ2UgaW4gcGl4ZWxzCisgKiBccGFyYW0gc3RyaWRlIHN0cmlkZSBvZiBpbWFnZSBpbiBwaXhlbHMKKyAqIFxwYXJhbSB2c3RyaWRlIHZlcnRpY2FsIHN0cmlkZSBvZiBpbWFnZSBpbiBwaXhlbHMKKyAqLworTWVkaWFJbWFnZTIgQ3JlYXRlWVVWNDIwUGxhbmFyTWVkaWFJbWFnZTIoCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IHN0cmlkZSwgdWludDMyX3QgdnN0cmlkZSk7CisKKy8qKgorICogUmV0dXJucyBhIHNlbWlwbGFuYXIgWVVWIDQyMCA4LWJpdCBtZWRpYSBpbWFnZSBkZXNjcmlwdG9yLgorICoKKyAqIFxwYXJhbSB3aWR0aCB3aWR0aCBvZiBpbWFnZSBpbiBwaXhlbHMKKyAqIFxwYXJhbSBoZWlnaHQgaGVpZ2h0IG9mIGltYWdlIGluIHBpeGVscworICogXHBhcmFtIHN0cmlkZSBzdHJpZGUgb2YgaW1hZ2UgaW4gcGl4ZWxzCisgKiBccGFyYW0gdnN0cmlkZSB2ZXJ0aWNhbCBzdHJpZGUgb2YgaW1hZ2UgaW4gcGl4ZWxzCisgKi8KK01lZGlhSW1hZ2UyIENyZWF0ZVlVVjQyMFNlbWlQbGFuYXJNZWRpYUltYWdlMigKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3Qgc3RyaWRlLCB1aW50MzJfdCB2c3RyaWRlKTsKKworLyoqCisgKiBDb3BpZXMgYSBncmFwaGljIHZpZXcgaW50byBhIG1lZGlhIGltYWdlLgorICoKKyAqIFxwYXJhbSBpbWdCYXNlIGJhc2Ugb2YgTWVkaWFJbWFnZQorICogXHBhcmFtIGltZyBNZWRpYUltYWdlIGRhdGEKKyAqIFxwYXJhbSB2aWV3IGdyYXBoaWMgdmlldworICoKKyAqIFxyZXR1cm4gT0sgb24gc3VjY2VzcworICovCitzdGF0dXNfdCBJbWFnZUNvcHkodWludDhfdCAqaW1nQmFzZSwgY29uc3QgTWVkaWFJbWFnZTIgKmltZywgY29uc3QgQzJHcmFwaGljVmlldyAmdmlldyk7CisKKy8qKgorICogQ29waWVzIGEgbWVkaWEgaW1hZ2UgaW50byBhIGdyYXBoaWMgdmlldy4KKyAqCisgKiBccGFyYW0gdmlldyBncmFwaGljIHZpZXcKKyAqIFxwYXJhbSBpbWdCYXNlIGJhc2Ugb2YgTWVkaWFJbWFnZQorICogXHBhcmFtIGltZyBNZWRpYUltYWdlIGRhdGEKKyAqCisgKiBccmV0dXJuIE9LIG9uIHN1Y2Nlc3MKKyAqLworc3RhdHVzX3QgSW1hZ2VDb3B5KEMyR3JhcGhpY1ZpZXcgJnZpZXcsIGNvbnN0IHVpbnQ4X3QgKmltZ0Jhc2UsIGNvbnN0IE1lZGlhSW1hZ2UyICppbWcpOworCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZmYgYSB2aWV3IGhhcyBhIFlVViA0MjAgODg4IGxheW91dC4KKyAqLworYm9vbCBJc1lVVjQyMChjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KTsKKworLyoqCisgKiBBIHJhdyBtZW1vcnkgYmxvY2sgdG8gdXNlIGZvciBpbnRlcm5hbCBidWZmZXJzLgorICoKKyAqIFRPRE86IHJlcGxhY2UgdGhpcyB3aXRoIEMyTGluZWFyQmxvY2tzIGZyb20gYSBwcml2YXRlIEMyQmxvY2tQb29sCisgKi8KK3N0cnVjdCBNZW1vcnlCbG9jayA6IHB1YmxpYyBDMk1lbW9yeUJsb2NrPHVpbnQ4X3Q+IHsKKyAgICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIGRhdGEoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHNpemVfdCBzaXplKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBpbmxpbmUgdWludDhfdCAqZGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8Y29uc3QgTWVtb3J5QmxvY2sqPih0aGlzKS0+ZGF0YSgpKTsKKyAgICB9CisKKyAgICAvLyBhbGxvY2F0ZXMgYW4gdW5tYW5hZ2VkIGJsb2NrIChub3QgaW4gYSBwb29sKQorICAgIHN0YXRpYyBNZW1vcnlCbG9jayBBbGxvY2F0ZShzaXplX3QpOworCisgICAgLy8gbWVtb3J5IGJsb2NrIHdpdGggbm8gYWN0dWFsIG1lbW9yeSAoc2l6ZSBpcyAwLCBkYXRhIGlzIG51bGwpCisgICAgTWVtb3J5QmxvY2soKTsKKworICAgIHN0cnVjdCBJbXBsOworICAgIE1lbW9yeUJsb2NrKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsKTsKKyAgICB2aXJ0dWFsIH5NZW1vcnlCbG9jaygpOworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKK307CisKKy8qKgorICogQSByYXcgbWVtb3J5IG1pbmktcG9vbC4KKyAqLworc3RydWN0IE1lbW9yeUJsb2NrUG9vbCB7CisgICAgLyoqCisgICAgICogRmV0Y2hlcyBhIGJsb2NrIHdpdGggYSBnaXZlbiBzaXplLgorICAgICAqCisgICAgICogXHBhcmFtIHNpemUgc2l6ZSBpbiBieXRlcworICAgICAqLworICAgIE1lbW9yeUJsb2NrIGZldGNoKHNpemVfdCBzaXplKTsKKworICAgIE1lbW9yeUJsb2NrUG9vbCgpOworICAgIH5NZW1vcnlCbG9ja1Bvb2woKSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RydWN0IEltcGw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPREVDMl9CVUZGRVJfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJNYXBwZXIuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMk1hcHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFiMzNlMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJNYXBwZXIuY3BwCkBAIC0wLDAgKzEsODUwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyTWFwcGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb2t1cC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4gIC8vIGZvciBJTlQzMl9NQVgKKworI2luY2x1ZGUgIkNvZGVjMk1hcHBlci5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworbmFtZXNwYWNlIHsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzQWFjUHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEMsICAgICAgICAgQUFDT2JqZWN0TEMgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19NQUlOLCAgICAgICBBQUNPYmplY3RNYWluIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfU1NSLCAgICAgICAgQUFDT2JqZWN0U1NSIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTFRQLCAgICAgICAgQUFDT2JqZWN0TFRQIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEUsICAgICAgICAgQUFDT2JqZWN0SEUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19TQ0FMQUJMRSwgICBBQUNPYmplY3RTY2FsYWJsZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQUFDX0VSX0xDLCAgICAgIEFBQ09iamVjdEVSTEMgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FUl9TQ0FMQUJMRSwgQUFDT2JqZWN0RVJTY2FsYWJsZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xELCAgICAgICAgIEFBQ09iamVjdExEIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEVfUFMsICAgICAgQUFDT2JqZWN0SEVfUFMgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FTEQsICAgICAgICBBQUNPYmplY3RFTEQgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19YSEUsICAgICAgICBBQUNPYmplY3RYSEUgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OmxldmVsX3QsIGludDMyX3Q+IHNBdmNMZXZlbHMgPSB7CisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzEsICAgIEFWQ0xldmVsMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ18xQiwgICBBVkNMZXZlbDFiIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzFfMSwgIEFWQ0xldmVsMTEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfMV8yLCAgQVZDTGV2ZWwxMiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ18xXzMsICBBVkNMZXZlbDEzIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzIsICAgIEFWQ0xldmVsMiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ18yXzEsICBBVkNMZXZlbDIxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzJfMiwgIEFWQ0xldmVsMjIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfMywgICAgQVZDTGV2ZWwzIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzNfMSwgIEFWQ0xldmVsMzEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfM18yLCAgQVZDTGV2ZWwzMiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ180LCAgICBBVkNMZXZlbDQgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfNF8xLCAgQVZDTGV2ZWw0MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ180XzIsICBBVkNMZXZlbDQyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzUsICAgIEFWQ0xldmVsNSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ181XzEsICBBVkNMZXZlbDUxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzVfMiwgIEFWQ0xldmVsNTIgfSwKKworfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzQXZjUHJvZmlsZXMgPSB7CisgICAgLy8gdHJlYXQgcmVzdHJpY3RlZCBwcm9maWxlcyBhcyBmdWxsIHByb2ZpbGUgaWYgdGhlcmUgaXMgbm8gZXF1aXZhbGVudCAtIHdoaWNoIHdvcmtzIGZvcgorICAgIC8vIGRlY29kZXJzLCBidXQgbm90IGZvciBlbmNvZGVycworICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0JBU0VMSU5FLCAgICAgICAgICAgICAgIEFWQ1Byb2ZpbGVCYXNlbGluZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0JBU0VMSU5FLCAgIEFWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfTUFJTiwgICAgICAgICAgICAgICAgICAgQVZDUHJvZmlsZU1haW4gfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19FWFRFTkRFRCwgICAgICAgICAgICAgICBBVkNQcm9maWxlRXh0ZW5kZWQgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdILCAgICAgICAgICAgICAgICAgICBBVkNQcm9maWxlSGlnaCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX1BST0dSRVNTSVZFX0hJR0gsICAgICAgIEFWQ1Byb2ZpbGVIaWdoIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQ09OU1RSQUlORURfSElHSCwgICAgICAgQVZDUHJvZmlsZUNvbnN0cmFpbmVkSGlnaCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfMTAsICAgICAgICAgICAgICAgIEFWQ1Byb2ZpbGVIaWdoMTAgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19QUk9HUkVTU0lWRV9ISUdIXzEwLCAgICBBVkNQcm9maWxlSGlnaDEwIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSF80MjIsICAgICAgICAgICAgICAgQVZDUHJvZmlsZUhpZ2g0MjIgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzQ0NF9QUkVESUNUSVZFLCAgICBBVkNQcm9maWxlSGlnaDQ0NCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfMTBfSU5UUkEsICAgICAgICAgIEFWQ1Byb2ZpbGVIaWdoMTAgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzQyMl9JTlRSQSwgICAgICAgICBBVkNQcm9maWxlSGlnaDQyMiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfNDQ0X0lOVFJBLCAgICAgICAgIEFWQ1Byb2ZpbGVIaWdoNDQ0IH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQ0FWTENfNDQ0X0lOVFJBLCAgICAgICAgQVZDUHJvZmlsZUhpZ2g0NDQgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OmJpdHJhdGVfbW9kZV90LCBpbnQzMl90PiBzQml0cmF0ZU1vZGVzID0geworICAgIHsgQzJDb25maWc6OkJJVFJBVEVfQ09OU1QsICAgICAgQklUUkFURV9NT0RFX0NCUiB9LAorICAgIHsgQzJDb25maWc6OkJJVFJBVEVfVkFSSUFCTEUsICAgQklUUkFURV9NT0RFX1ZCUiB9LAorICAgIHsgQzJDb25maWc6OkJJVFJBVEVfSUdOT1JFLCAgICAgQklUUkFURV9NT0RFX0NRIH0sCit9OworCitBTG9va3VwPEMyQ29sb3I6Om1hdHJpeF90LCBDb2xvckFzcGVjdHM6Ok1hdHJpeENvZWZmcz4gc0NvbG9yTWF0cmljZXNTZiA9IHsKKyAgICB7IEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgIENvbG9yQXNwZWN0czo6TWF0cml4VW5zcGVjaWZpZWQgfSwKKyAgICB7IEMyQ29sb3I6Ok1BVFJJWF9CVDcwOSwgICAgICAgICAgIENvbG9yQXNwZWN0czo6TWF0cml4QlQ3MDlfNSB9LAorICAgIHsgQzJDb2xvcjo6TUFUUklYX0ZDQzQ3XzczXzY4MiwgICAgQ29sb3JBc3BlY3RzOjpNYXRyaXhCVDQ3MF82TSB9LAorICAgIHsgQzJDb2xvcjo6TUFUUklYX0JUNjAxLCAgICAgICAgICAgQ29sb3JBc3BlY3RzOjpNYXRyaXhCVDYwMV82IH0sCisgICAgeyBDMkNvbG9yOjpNQVRSSVhfU01QVEUyNDBNLCAgICAgICBDb2xvckFzcGVjdHM6Ok1hdHJpeFNNUFRFMjQwTSB9LAorICAgIHsgQzJDb2xvcjo6TUFUUklYX0JUMjAyMCwgICAgICAgICAgQ29sb3JBc3BlY3RzOjpNYXRyaXhCVDIwMjAgfSwKKyAgICB7IEMyQ29sb3I6Ok1BVFJJWF9CVDIwMjBfQ09OU1RBTlQsIENvbG9yQXNwZWN0czo6TWF0cml4QlQyMDIwQ29uc3RhbnQgfSwKKyAgICB7IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUiwgICAgICAgICAgIENvbG9yQXNwZWN0czo6TWF0cml4T3RoZXIgfSwKK307CisKK0FMb29rdXA8QzJDb2xvcjo6cHJpbWFyaWVzX3QsIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzPiBzQ29sb3JQcmltYXJpZXNTZiA9IHsKKyAgICB7IEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzVW5zcGVjaWZpZWQgfSwKKyAgICB7IEMyQ29sb3I6OlBSSU1BUklFU19CVDcwOSwgICAgICAgIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzQlQ3MDlfNSB9LAorICAgIHsgQzJDb2xvcjo6UFJJTUFSSUVTX0JUNDcwX00sICAgICAgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNCVDQ3MF82TSB9LAorICAgIHsgQzJDb2xvcjo6UFJJTUFSSUVTX0JUNjAxXzYyNSwgICAgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNCVDYwMV82XzYyNSB9LAorICAgIHsgQzJDb2xvcjo6UFJJTUFSSUVTX0JUNjAxXzUyNSwgICAgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNCVDYwMV82XzUyNSB9LAorICAgIHsgQzJDb2xvcjo6UFJJTUFSSUVTX0dFTkVSSUNfRklMTSwgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNHZW5lcmljRmlsbSB9LAorICAgIHsgQzJDb2xvcjo6UFJJTUFSSUVTX0JUMjAyMCwgICAgICAgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNCVDIwMjAgfSwKKy8vICAgIHsgQzJDb2xvcjo6UFJJTUFSSUVTX1JQNDMxLCAgICAgICAgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXMuLi4gfSwKKy8vICAgIHsgQzJDb2xvcjo6UFJJTUFSSUVTX0VHNDMyLCAgICAgICAgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXMuLi4gfSwKKy8vICAgIHsgQzJDb2xvcjo6UFJJTUFSSUVTX0VCVTMyMTMsICAgICAgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXMuLi4gfSwKKyAgICB7IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiwgICAgICAgIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzT3RoZXIgfSwKK307CisKK0FMb29rdXA8QzJDb2xvcjo6cmFuZ2VfdCwgaW50MzJfdD4gc0NvbG9yUmFuZ2VzID0geworICAgIHsgQzJDb2xvcjo6UkFOR0VfRlVMTCwgICAgQ09MT1JfUkFOR0VfRlVMTCB9LAorICAgIHsgQzJDb2xvcjo6UkFOR0VfTElNSVRFRCwgQ09MT1JfUkFOR0VfTElNSVRFRCB9LAorfTsKKworQUxvb2t1cDxDMkNvbG9yOjpyYW5nZV90LCBDb2xvckFzcGVjdHM6OlJhbmdlPiBzQ29sb3JSYW5nZXNTZiA9IHsKKyAgICB7IEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDb2xvckFzcGVjdHM6OlJhbmdlVW5zcGVjaWZpZWQgfSwKKyAgICB7IEMyQ29sb3I6OlJBTkdFX0ZVTEwsICAgICAgICBDb2xvckFzcGVjdHM6OlJhbmdlRnVsbCB9LAorICAgIHsgQzJDb2xvcjo6UkFOR0VfTElNSVRFRCwgICAgIENvbG9yQXNwZWN0czo6UmFuZ2VMaW1pdGVkIH0sCisgICAgeyBDMkNvbG9yOjpSQU5HRV9PVEhFUiwgICAgICAgQ29sb3JBc3BlY3RzOjpSYW5nZU90aGVyIH0sCit9OworCitBTG9va3VwPEMyQ29sb3I6OnRyYW5zZmVyX3QsIGludDMyX3Q+IHNDb2xvclRyYW5zZmVycyA9IHsKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX0xJTkVBUiwgQ09MT1JfVFJBTlNGRVJfTElORUFSIH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl8xNzBNLCAgIENPTE9SX1RSQU5TRkVSX1NEUl9WSURFTyB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfU1QyMDg0LCBDT0xPUl9UUkFOU0ZFUl9TVDIwODQgfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX0hMRywgICAgQ09MT1JfVFJBTlNGRVJfSExHIH0sCit9OworCitBTG9va3VwPEMyQ29sb3I6OnRyYW5zZmVyX3QsIENvbG9yQXNwZWN0czo6VHJhbnNmZXI+IHNDb2xvclRyYW5zZmVyc1NmID0geworICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIENvbG9yQXNwZWN0czo6VHJhbnNmZXJVbnNwZWNpZmllZCB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfTElORUFSLCAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJMaW5lYXIgfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX1NSR0IsICAgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyU1JHQiB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfMTcwTSwgICAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJTTVBURTE3ME0gfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX0dBTU1BMjIsICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyR2FtbWEyMiB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfR0FNTUEyOCwgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJHYW1tYTI4IH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9TVDIwODQsICAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlclNUMjA4NCB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfSExHLCAgICAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJITEcgfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSXzI0ME0sICAgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyU01QVEUyNDBNIH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9YVllDQywgICAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2Zlclh2WUNDIH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9CVDEzNjEsICAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlckJUMTM2MSB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfU1Q0MjgsICAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJTVDQyOCB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIsICAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJPdGhlciB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdD4gc0RvbGJ5VmlzaW9uTGV2ZWxzID0geworICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX01BSU5fSERfMjQsICBEb2xieVZpc2lvbkxldmVsSGQyNCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX01BSU5fSERfMzAsICBEb2xieVZpc2lvbkxldmVsSGQzMCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX01BSU5fRkhEXzI0LCBEb2xieVZpc2lvbkxldmVsRmhkMjQgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9NQUlOX0ZIRF8zMCwgRG9sYnlWaXNpb25MZXZlbEZoZDMwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfTUFJTl9GSERfNjAsIERvbGJ5VmlzaW9uTGV2ZWxGaGQ2MCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX01BSU5fVUhEXzI0LCBEb2xieVZpc2lvbkxldmVsVWhkMjQgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9NQUlOX1VIRF8zMCwgRG9sYnlWaXNpb25MZXZlbFVoZDMwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfTUFJTl9VSERfNDgsIERvbGJ5VmlzaW9uTGV2ZWxVaGQ0OCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX01BSU5fVUhEXzYwLCBEb2xieVZpc2lvbkxldmVsVWhkNjAgfSwKKworICAgIC8vIGhpZ2ggdGllcnMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkIG9uIGFuZHJvaWQsIGZvciBub3cgbWFwIHRoZW0gdG8gbWFpbiB0aWVyCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfSElHSF9IRF8yNCwgIERvbGJ5VmlzaW9uTGV2ZWxIZDI0IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfSElHSF9IRF8zMCwgIERvbGJ5VmlzaW9uTGV2ZWxIZDMwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfSElHSF9GSERfMjQsIERvbGJ5VmlzaW9uTGV2ZWxGaGQyNCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX0hJR0hfRkhEXzMwLCBEb2xieVZpc2lvbkxldmVsRmhkMzAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9ISUdIX0ZIRF82MCwgRG9sYnlWaXNpb25MZXZlbEZoZDYwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfSElHSF9VSERfMjQsIERvbGJ5VmlzaW9uTGV2ZWxVaGQyNCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX0hJR0hfVUhEXzMwLCBEb2xieVZpc2lvbkxldmVsVWhkMzAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9ISUdIX1VIRF80OCwgRG9sYnlWaXNpb25MZXZlbFVoZDQ4IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfSElHSF9VSERfNjAsIERvbGJ5VmlzaW9uTGV2ZWxVaGQ2MCB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzRG9sYnlWaXNpb25Qcm9maWxlcyA9IHsKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0RWX0FWX1BFUiwgRG9sYnlWaXNpb25Qcm9maWxlRHZhdlBlciB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfRFZfQVZfUEVOLCBEb2xieVZpc2lvblByb2ZpbGVEdmF2UGVuIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9EVl9IRV9ERVIsIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEZXIgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0RWX0hFX0RFTiwgRG9sYnlWaXNpb25Qcm9maWxlRHZoZURlbiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfRFZfSEVfMDQsIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEdHIgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0RWX0hFXzA1LCBEb2xieVZpc2lvblByb2ZpbGVEdmhlU3RuIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9EVl9IRV9EVEgsIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEdGggfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0RWX0hFXzA3LCBEb2xieVZpc2lvblByb2ZpbGVEdmhlRHRiIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9EVl9IRV8wOCwgRG9sYnlWaXNpb25Qcm9maWxlRHZoZVN0IH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9EVl9BVl8wOSwgRG9sYnlWaXNpb25Qcm9maWxlRHZhdlNlIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpsZXZlbF90LCBpbnQzMl90PiBzSDI2M0xldmVscyA9IHsKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IMjYzXzEwLCBIMjYzTGV2ZWwxMCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0gyNjNfMjAsIEgyNjNMZXZlbDIwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSDI2M18zMCwgSDI2M0xldmVsMzAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IMjYzXzQwLCBIMjYzTGV2ZWw0MCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0gyNjNfNDUsIEgyNjNMZXZlbDQ1IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSDI2M181MCwgSDI2M0xldmVsNTAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IMjYzXzYwLCBIMjYzTGV2ZWw2MCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0gyNjNfNzAsIEgyNjNMZXZlbDcwIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3Q+IHNIMjYzUHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0JBU0VMSU5FLCAgICAgICAgICBIMjYzUHJvZmlsZUJhc2VsaW5lIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0gzMjAsICAgICAgICAgICAgICBIMjYzUHJvZmlsZUgzMjBDb2RpbmcgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfVjFCQywgICAgICAgICAgICAgIEgyNjNQcm9maWxlQmFja3dhcmRDb21wYXRpYmxlIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0lTV1YyLCAgICAgICAgICAgICBIMjYzUHJvZmlsZUlTV1YyIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0lTV1YzLCAgICAgICAgICAgICBIMjYzUHJvZmlsZUlTV1YzIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0hJR0hfQ09NUFJFU1NJT04sICBIMjYzUHJvZmlsZUhpZ2hDb21wcmVzc2lvbiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSDI2M19JTlRFUk5FVCwgICAgICAgICAgSDI2M1Byb2ZpbGVJbnRlcm5ldCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSDI2M19JTlRFUkxBQ0UsICAgICAgICAgSDI2M1Byb2ZpbGVJbnRlcmxhY2UgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSElHSF9MQVRFTkNZLCAgICAgIEgyNjNQcm9maWxlSGlnaExhdGVuY3kgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OmxldmVsX3QsIGludDMyX3Q+IHNIZXZjTGV2ZWxzID0geworICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8xLCAgICAgIEhFVkNNYWluVGllckxldmVsMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8yLCAgICAgIEhFVkNNYWluVGllckxldmVsMiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8yXzEsICAgIEhFVkNNYWluVGllckxldmVsMjEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMywgICAgICBIRVZDTWFpblRpZXJMZXZlbDMgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fM18xLCAgICBIRVZDTWFpblRpZXJMZXZlbDMxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzQsICAgICAgSEVWQ01haW5UaWVyTGV2ZWw0IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzRfMSwgICAgSEVWQ01haW5UaWVyTGV2ZWw0MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl81LCAgICAgIEhFVkNNYWluVGllckxldmVsNSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl81XzEsICAgIEhFVkNNYWluVGllckxldmVsNTEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNV8yLCAgICBIRVZDTWFpblRpZXJMZXZlbDUyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzYsICAgICAgSEVWQ01haW5UaWVyTGV2ZWw2IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzZfMSwgICAgSEVWQ01haW5UaWVyTGV2ZWw2MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl82XzIsICAgIEhFVkNNYWluVGllckxldmVsNjIgfSwKKworICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF80LCAgICAgIEhFVkNIaWdoVGllckxldmVsNCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF80XzEsICAgIEhFVkNIaWdoVGllckxldmVsNDEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNSwgICAgICBIRVZDSGlnaFRpZXJMZXZlbDUgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNV8xLCAgICBIRVZDSGlnaFRpZXJMZXZlbDUxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzVfMiwgICAgSEVWQ0hpZ2hUaWVyTGV2ZWw1MiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF82LCAgICAgIEhFVkNIaWdoVGllckxldmVsNiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF82XzEsICAgIEhFVkNIaWdoVGllckxldmVsNjEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNl8yLCAgICBIRVZDSGlnaFRpZXJMZXZlbDYyIH0sCisKKyAgICAvLyBtYXAgaGlnaCB0aWVyIGxldmVscyBiZWxvdyA0IHRvIG1haW4gdGllcgorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8xLCAgICAgIEhFVkNIaWdoVGllckxldmVsMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8yLCAgICAgIEhFVkNIaWdoVGllckxldmVsMiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8yXzEsICAgIEhFVkNIaWdoVGllckxldmVsMjEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMywgICAgICBIRVZDSGlnaFRpZXJMZXZlbDMgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fM18xLCAgICBIRVZDSGlnaFRpZXJMZXZlbDMxIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3Q+IHNIZXZjUHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU4sIEhFVkNQcm9maWxlTWFpbiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzEwLCBIRVZDUHJvZmlsZU1haW4xMCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOX1NUSUxMLCBIRVZDUHJvZmlsZU1haW5TdGlsbCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOX0lOVFJBLCBIRVZDUHJvZmlsZU1haW4gfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl8xMF9JTlRSQSwgSEVWQ1Byb2ZpbGVNYWluMTAgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OmxldmVsX3QsIGludDMyX3Q+IHNNcGVnMkxldmVscyA9IHsKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDJWX0xPVywgICAgICAgICBNUEVHMkxldmVsTEwgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDJWX01BSU4sICAgICAgICBNUEVHMkxldmVsTUwgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDJWX0hJR0hfMTQ0MCwgICBNUEVHMkxldmVsSDE0IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdILCAgICAgICAgTVBFRzJMZXZlbEhMIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdIUCwgICAgICAgTVBFRzJMZXZlbEhQIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3Q+IHNNcGVnMlByb2ZpbGVzID0geworICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9TSU1QTEUsICAgICAgICAgICAgICAgIE1QRUcyUHJvZmlsZVNpbXBsZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9NQUlOLCAgICAgICAgICAgICAgICAgIE1QRUcyUHJvZmlsZU1haW4gfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfU05SX1NDQUxBQkxFLCAgICAgICAgICBNUEVHMlByb2ZpbGVTTlIgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfU1BBVElBTExZX1NDQUxBQkxFLCAgICBNUEVHMlByb2ZpbGVTcGF0aWFsIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX0hJR0gsICAgICAgICAgICAgICAgICAgTVBFRzJQcm9maWxlSGlnaCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVAyVl80MjIsICAgICAgICAgICAgICAgICAgIE1QRUcyUHJvZmlsZTQyMiB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdD4gc01wZWc0TGV2ZWxzID0geworICAgIHsgQzJDb25maWc6OkxFVkVMX01QNFZfMCwgICBNUEVHNExldmVsMCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX01QNFZfMEIsICBNUEVHNExldmVsMGIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDRWXzEsICAgTVBFRzRMZXZlbDEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDRWXzIsICAgTVBFRzRMZXZlbDIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDRWXzMsICAgTVBFRzRMZXZlbDMgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDRWXzNCLCAgTVBFRzRMZXZlbDNiIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVA0Vl80LCAgIE1QRUc0TGV2ZWw0IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVA0Vl80QSwgIE1QRUc0TGV2ZWw0YSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX01QNFZfNSwgICBNUEVHNExldmVsNSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX01QNFZfNiwgICBNUEVHNExldmVsNiB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzTXBlZzRQcm9maWxlcyA9IHsKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfU0lNUExFLCAgICAgICAgICAgIE1QRUc0UHJvZmlsZVNpbXBsZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9TSU1QTEVfU0NBTEFCTEUsICAgTVBFRzRQcm9maWxlU2ltcGxlU2NhbGFibGUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQ09SRSwgICAgICAgICAgICAgIE1QRUc0UHJvZmlsZUNvcmUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfTUFJTiwgICAgICAgICAgICAgIE1QRUc0UHJvZmlsZU1haW4gfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfTkJJVCwgICAgICAgICAgICAgIE1QRUc0UHJvZmlsZU5iaXQgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQVJUUywgICAgICAgICAgICAgIE1QRUc0UHJvZmlsZUFkdmFuY2VkUmVhbFRpbWUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQ09SRV9TQ0FMQUJMRSwgICAgIE1QRUc0UHJvZmlsZUNvcmVTY2FsYWJsZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9BQ0UsICAgICAgICAgICAgICAgTVBFRzRQcm9maWxlQWR2YW5jZWRDb2RpbmcgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQURWQU5DRURfQ09SRSwgICAgIE1QRUc0UHJvZmlsZUFkdmFuY2VkQ29yZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9BRFZBTkNFRF9TSU1QTEUsICAgTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OnBjbV9lbmNvZGluZ190LCBpbnQzMl90PiBzUGNtRW5jb2RpbmdzID0geworICAgIHsgQzJDb25maWc6OlBDTV84LCBrQXVkaW9FbmNvZGluZ1BjbThiaXQgfSwKKyAgICB7IEMyQ29uZmlnOjpQQ01fMTYsIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQgfSwKKyAgICB7IEMyQ29uZmlnOjpQQ01fRkxPQVQsIGtBdWRpb0VuY29kaW5nUGNtRmxvYXQgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OmxldmVsX3QsIGludDMyX3Q+IHNWcDlMZXZlbHMgPSB7CisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzEsICAgIFZQOUxldmVsMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV8xXzEsICBWUDlMZXZlbDExIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzIsICAgIFZQOUxldmVsMiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV8yXzEsICBWUDlMZXZlbDIxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzMsICAgIFZQOUxldmVsMyB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV8zXzEsICBWUDlMZXZlbDMxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzQsICAgIFZQOUxldmVsNCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV80XzEsICBWUDlMZXZlbDQxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzUsICAgIFZQOUxldmVsNSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV81XzEsICBWUDlMZXZlbDUxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzVfMiwgIFZQOUxldmVsNTIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9WUDlfNiwgICAgVlA5TGV2ZWw2IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzZfMSwgIFZQOUxldmVsNjEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9WUDlfNl8yLCAgVlA5TGV2ZWw2MiB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzVnA5UHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMCwgVlA5UHJvZmlsZTAgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8xLCBWUDlQcm9maWxlMSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfVlA5XzIsIFZQOVByb2ZpbGUyIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMywgVlA5UHJvZmlsZTMgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OmxldmVsX3QsIGludDMyX3Q+IHNBdjFMZXZlbHMgPSB7CisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzIsICAgIEFWMUxldmVsMiAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfMl8xLCAgQVYxTGV2ZWwyMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV8yXzIsICBBVjFMZXZlbDIyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzJfMywgIEFWMUxldmVsMjMgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfMywgICAgQVYxTGV2ZWwzICB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV8zXzEsICBBVjFMZXZlbDMxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzNfMiwgIEFWMUxldmVsMzIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfM18zLCAgQVYxTGV2ZWwzMyB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV80LCAgICBBVjFMZXZlbDQgIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzRfMSwgIEFWMUxldmVsNDEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfNF8yLCAgQVYxTGV2ZWw0MiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV80XzMsICBBVjFMZXZlbDQzIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzUsICAgIEFWMUxldmVsNSAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfNV8xLCAgQVYxTGV2ZWw1MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV81XzIsICBBVjFMZXZlbDUyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzVfMywgIEFWMUxldmVsNTMgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfNiwgICAgQVYxTGV2ZWw2ICB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV82XzEsICBBVjFMZXZlbDYxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzZfMiwgIEFWMUxldmVsNjIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfNl8zLCAgQVYxTGV2ZWw2MyB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV83LCAgICBBVjFMZXZlbDcgIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzdfMSwgIEFWMUxldmVsNzEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfN18yLCAgQVYxTGV2ZWw3MiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV83XzMsICBBVjFMZXZlbDczIH0sCit9OworCisKK0FMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc0F2MVByb2ZpbGVzID0geworICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVYxXzAsIEFWMVByb2ZpbGUwIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMSwgQVYxUHJvZmlsZTEgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWMV8yLCBBVjFQcm9maWxlMiB9LAorfTsKKworCisvKioKKyAqIEEgaGVscGVyIHRoYXQgcGFzc2VzIHRocm91Z2ggdmVuZG9yIGV4dGVuc2lvbiBwcm9maWxlIGFuZCBsZXZlbCB2YWx1ZXMuCisgKi8KK3N0cnVjdCBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIgOiBDMk1hcHBlcjo6UHJvZmlsZUxldmVsTWFwcGVyIHsKKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpsZXZlbF90IGZyb20sIGludDMyX3QgKnRvKSA9IDA7CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpsZXZlbF90ICp0bykgPSAwOworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OnByb2ZpbGVfdCBmcm9tLCBpbnQzMl90ICp0bykgPSAwOworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6cHJvZmlsZV90ICp0bykgPSAwOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KKyAgICBib29sIHBhc3NUaHJvdWdoTWFwKFQgZnJvbSwgVSAqdG8pIHsKKyAgICAgICAgLy8gYWxsb3cgKGFuZCBwYXNzIHRocm91Z2gpIHZlbmRvciBleHRlbnNpb25zCisgICAgICAgIGlmIChmcm9tID49IChUKUMyX1BST0ZJTEVfTEVWRUxfVkVORE9SX1NUQVJUICYmIGZyb20gPCAoVClJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgICp0byA9IChVKWZyb207CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2ltcGxlTWFwKGZyb20sIHRvKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgbWFwTGV2ZWwoQzJDb25maWc6OmxldmVsX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHBhc3NUaHJvdWdoTWFwKGZyb20sIHRvKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgbWFwTGV2ZWwoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6bGV2ZWxfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHBhc3NUaHJvdWdoTWFwKGZyb20sIHRvKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgbWFwUHJvZmlsZShDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBwYXNzVGhyb3VnaE1hcChmcm9tLCB0byk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIG1hcFByb2ZpbGUoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6cHJvZmlsZV90ICp0bykgeworICAgICAgICByZXR1cm4gcGFzc1Rocm91Z2hNYXAoZnJvbSwgdG8pOworICAgIH0KK307CisKKy8vIEFBQyBvbmx5IHVzZXMgcHJvZmlsZXMsIG1hcCBhbGwgbGV2ZWxzIHRvIHVudXNlZCBvciAwCitzdHJ1Y3QgQWFjUHJvZmlsZUxldmVsTWFwcGVyIDogUHJvZmlsZUxldmVsTWFwcGVySGVscGVyIHsKKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpsZXZlbF90LCBpbnQzMl90ICp0bykgeworICAgICAgICAqdG8gPSAwOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90LCBDMkNvbmZpZzo6bGV2ZWxfdCAqdG8pIHsKKyAgICAgICAgKnRvID0gQzJDb25maWc6OkxFVkVMX1VOVVNFRDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OnByb2ZpbGVfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gc0FhY1Byb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6cHJvZmlsZV90ICp0bykgeworICAgICAgICByZXR1cm4gc0FhY1Byb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorfTsKKworc3RydWN0IEF2Y1Byb2ZpbGVMZXZlbE1hcHBlciA6IFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlciB7CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6bGV2ZWxfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gc0F2Y0xldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OmxldmVsX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzQXZjTGV2ZWxzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OnByb2ZpbGVfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gc0F2Y1Byb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6cHJvZmlsZV90ICp0bykgeworICAgICAgICByZXR1cm4gc0F2Y1Byb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorfTsKKworc3RydWN0IERvbGJ5VmlzaW9uUHJvZmlsZUxldmVsTWFwcGVyIDogUHJvZmlsZUxldmVsTWFwcGVySGVscGVyIHsKKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpsZXZlbF90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzRG9sYnlWaXNpb25MZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpsZXZlbF90ICp0bykgeworICAgICAgICByZXR1cm4gc0RvbGJ5VmlzaW9uTGV2ZWxzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OnByb2ZpbGVfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gc0RvbGJ5VmlzaW9uUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwcm9maWxlX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzRG9sYnlWaXNpb25Qcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KK307CisKK3N0cnVjdCBIMjYzUHJvZmlsZUxldmVsTWFwcGVyIDogUHJvZmlsZUxldmVsTWFwcGVySGVscGVyIHsKKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpsZXZlbF90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzSDI2M0xldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OmxldmVsX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzSDI2M0xldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpwcm9maWxlX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNIMjYzUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwcm9maWxlX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzSDI2M1Byb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorfTsKKworc3RydWN0IEhldmNQcm9maWxlTGV2ZWxNYXBwZXIgOiBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIgeworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OmxldmVsX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNIZXZjTGV2ZWxzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6bGV2ZWxfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNIZXZjTGV2ZWxzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OnByb2ZpbGVfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gc0hldmNQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNIZXZjUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgTXBlZzJQcm9maWxlTGV2ZWxNYXBwZXIgOiBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIgeworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OmxldmVsX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNNcGVnMkxldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OmxldmVsX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzTXBlZzJMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzTXBlZzJQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNNcGVnMlByb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorfTsKKworc3RydWN0IE1wZWc0UHJvZmlsZUxldmVsTWFwcGVyIDogUHJvZmlsZUxldmVsTWFwcGVySGVscGVyIHsKKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpsZXZlbF90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzTXBlZzRMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpsZXZlbF90ICp0bykgeworICAgICAgICByZXR1cm4gc01wZWc0TGV2ZWxzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OnByb2ZpbGVfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gc01wZWc0UHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwcm9maWxlX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzTXBlZzRQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KK307CisKKy8vIFZQOCBoYXMgbm8gcHJvZmlsZXMgYW5kIGxldmVscyBpbiBDb2RlYyAyLjAsIGJ1dCB3ZSB1c2UgbWFpbiBwcm9maWxlIGFuZCBsZXZlbCAwIGluIE1lZGlhQ29kZWMKKy8vIG1hcCBhbGwgcHJvZmlsZXMgYW5kIGxldmVscyB0byB0aGF0Lgorc3RydWN0IFZwOFByb2ZpbGVMZXZlbE1hcHBlciA6IFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlciB7CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgKnRvID0gVlA4TGV2ZWxfVmVyc2lvbjA7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QsIEMyQ29uZmlnOjpsZXZlbF90ICp0bykgeworICAgICAgICAqdG8gPSBDMkNvbmZpZzo6TEVWRUxfVU5VU0VEOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90ICp0bykgeworICAgICAgICAqdG8gPSBWUDhQcm9maWxlTWFpbjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgKnRvID0gQzJDb25maWc6OlBST0ZJTEVfVU5VU0VEOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9OworCitzdHJ1Y3QgVnA5UHJvZmlsZUxldmVsTWFwcGVyIDogUHJvZmlsZUxldmVsTWFwcGVySGVscGVyIHsKKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpsZXZlbF90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzVnA5TGV2ZWxzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6bGV2ZWxfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNWcDlMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzVnA5UHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwcm9maWxlX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzVnA5UHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9Cit9OworCit9IC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK3N0ZDo6c2hhcmVkX3B0cjxDMk1hcHBlcjo6UHJvZmlsZUxldmVsTWFwcGVyPgorQzJNYXBwZXI6OkdldFByb2ZpbGVMZXZlbE1hcHBlcihzdGQ6OnN0cmluZyBtZWRpYVR5cGUpIHsKKyAgICBzdGQ6OnRyYW5zZm9ybShtZWRpYVR5cGUuYmVnaW4oKSwgbWVkaWFUeXBlLmJlZ2luKCksIG1lZGlhVHlwZS5lbmQoKSwgOjp0b2xvd2VyKTsKKyAgICBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX0FVRElPX0FBQykgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxBYWNQcm9maWxlTGV2ZWxNYXBwZXI+KCk7CisgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fQVZDKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEF2Y1Byb2ZpbGVMZXZlbE1hcHBlcj4oKTsKKyAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04pIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8RG9sYnlWaXNpb25Qcm9maWxlTGV2ZWxNYXBwZXI+KCk7CisgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fSDI2MykgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxIMjYzUHJvZmlsZUxldmVsTWFwcGVyPigpOworICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX0hFVkMpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8SGV2Y1Byb2ZpbGVMZXZlbE1hcHBlcj4oKTsKKyAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19NUEVHMikgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxNcGVnMlByb2ZpbGVMZXZlbE1hcHBlcj4oKTsKKyAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19NUEVHNCkgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxNcGVnNFByb2ZpbGVMZXZlbE1hcHBlcj4oKTsKKyAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19WUDgpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8VnA4UHJvZmlsZUxldmVsTWFwcGVyPigpOworICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX1ZQOSkgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxWcDlQcm9maWxlTGV2ZWxNYXBwZXI+KCk7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDMkNvbmZpZzo6Yml0cmF0ZV9tb2RlX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICByZXR1cm4gc0JpdHJhdGVNb2Rlcy5tYXAoZnJvbSwgdG8pOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpiaXRyYXRlX21vZGVfdCAqdG8pIHsKKyAgICByZXR1cm4gc0JpdHJhdGVNb2Rlcy5tYXAoZnJvbSwgdG8pOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICByZXR1cm4gc1BjbUVuY29kaW5ncy5tYXAoZnJvbSwgdG8pOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdCAqdG8pIHsKKyAgICByZXR1cm4gc1BjbUVuY29kaW5ncy5tYXAoZnJvbSwgdG8pOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDMkNvbG9yOjpyYW5nZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgYm9vbCByZXMgPSB0cnVlOworICAgIC8vIG1hcCBTREsgZGVmaW5lZCB2YWx1ZXMgZGlyZWN0bHkuIEZvciBvdGhlciB2YWx1ZXMsIHVzZSB3cmFwcGluZyBmcm9tIENvbG9yVXRpbHMuCisgICAgaWYgKCFzQ29sb3JSYW5nZXMubWFwKGZyb20sIHRvKSkgeworICAgICAgICBDb2xvckFzcGVjdHM6OlJhbmdlIHNmUmFuZ2U7CisKKyAgICAgICAgLy8gbWFwIGtub3duIGNvbnN0YW50cyBhbmQga2VlcCB2ZW5kb3IgZXh0ZW5zaW9ucy4gYWxsIG90aGVyIHZhbHVlcyBhcmUgbWFwcGVkIHRvICdPdGhlcicKKyAgICAgICAgaWYgKCFzQ29sb3JSYW5nZXNTZi5tYXAoZnJvbSwgJnNmUmFuZ2UpKSB7CisgICAgICAgICAgICAvLyB1c2Ugc3RhdGljIGNhc3QgYW5kIGVuc3VyZSBpdCBpcyBpbiB0aGUgZXh0ZW5zaW9uIHJhbmdlCisgICAgICAgICAgICBpZiAoZnJvbSA8IEMyQ29sb3I6OlJBTkdFX1ZFTkRPUl9TVEFSVCB8fCBmcm9tID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBzZlJhbmdlID0gQ29sb3JBc3BlY3RzOjpSYW5nZU90aGVyOworICAgICAgICAgICAgICAgIHJlcyA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgKnRvID0gQ29sb3JVdGlsczo6d3JhcENvbG9yQXNwZWN0c0ludG9Db2xvclJhbmdlKHNmUmFuZ2UpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChpbnQzMl90IGZyb20sIEMyQ29sb3I6OnJhbmdlX3QgKnRvKSB7CisgICAgLy8gbWFwIFNESyBkZWZpbmVkIHZhbHVlcyBkaXJlY3RseS4gRm9yIG90aGVyIHZhbHVlcywgdXNlIHdyYXBwaW5nIGZyb20gQ29sb3JVdGlscy4KKyAgICBpZiAoIXNDb2xvclJhbmdlcy5tYXAoZnJvbSwgdG8pKSB7CisgICAgICAgIENvbG9yQXNwZWN0czo6UmFuZ2Ugc2ZSYW5nZTsKKyAgICAgICAgKHZvaWQpQ29sb3JVdGlsczo6dW53cmFwQ29sb3JBc3BlY3RzRnJvbUNvbG9yUmFuZ2UoZnJvbSwgJnNmUmFuZ2UpOworCisgICAgICAgIC8vIG1hcCBrbm93biBjb25zdGFudHMgYW5kIGtlZXAgdmVuZG9yIGV4dGVuc2lvbnMuIGFsbCBvdGhlciB2YWx1ZXMgYXJlIG1hcHBlZCB0byAnT3RoZXInCisgICAgICAgIGlmICghc0NvbG9yUmFuZ2VzU2YubWFwKHNmUmFuZ2UsIHRvKSkgeworICAgICAgICAgICAgLy8gdXNlIHN0YXRpYyBjYXN0IGFuZCBlbnN1cmUgaXQgaXMgaW4gdGhlIGV4dGVuc2lvbiByYW5nZQorICAgICAgICAgICAgKnRvID0gKEMyQ29sb3I6OnJhbmdlX3Qpc2ZSYW5nZTsKKyAgICAgICAgICAgIGlmICgqdG8gPCBDMkNvbG9yOjpSQU5HRV9WRU5ET1JfU1RBUlQgfHwgKnRvID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICAqdG8gPSBDMkNvbG9yOjpSQU5HRV9PVEhFUjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoQzJDb2xvcjo6cmFuZ2VfdCBmcm9tLCBDb2xvckFzcGVjdHM6OlJhbmdlICp0bykgeworICAgIHJldHVybiBzQ29sb3JSYW5nZXNTZi5tYXAoZnJvbSwgdG8pOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDb2xvckFzcGVjdHM6OlJhbmdlIGZyb20sIEMyQ29sb3I6OnJhbmdlX3QgKnRvKSB7CisgICAgcmV0dXJuIHNDb2xvclJhbmdlc1NmLm1hcChmcm9tLCB0byk7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKEMyQ29sb3I6OnByaW1hcmllc190IHByaW1hcmllcywgQzJDb2xvcjo6bWF0cml4X3QgbWF0cml4LCBpbnQzMl90ICpzdGFuZGFyZCkgeworICAgIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzIHNmUHJpbWFyaWVzOworICAgIENvbG9yQXNwZWN0czo6TWF0cml4Q29lZmZzIHNmTWF0cml4OworICAgIGJvb2wgcmVzID0gdHJ1ZTsKKworICAgIC8vIG1hcCBrbm93biBjb25zdGFudHMgYW5kIGtlZXAgdmVuZG9yIGV4dGVuc2lvbnMuIGFsbCBvdGhlciB2YWx1ZXMgYXJlIG1hcHBlZCB0byAnT3RoZXInCisgICAgaWYgKCFzQ29sb3JQcmltYXJpZXNTZi5tYXAocHJpbWFyaWVzLCAmc2ZQcmltYXJpZXMpKSB7CisgICAgICAgIC8vIGVuc3VyZSBpdCBpcyBpbiB0aGUgZXh0ZW5zaW9uIHJhbmdlIGFuZCB1c2Ugc3RhdGljIGNhc3QKKyAgICAgICAgaWYgKHByaW1hcmllcyA8IEMyQ29sb3I6OlBSSU1BUklFU19WRU5ET1JfU1RBUlQgfHwgcHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICAvLyB1bmRlZmluZWQgbm9uLWV4dGVuc2lvbiB2YWx1ZXMgbWFwIHRvICdPdGhlcicKKyAgICAgICAgICAgIHNmUHJpbWFyaWVzID0gQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNPdGhlcjsKKyAgICAgICAgICAgIHJlcyA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2ZQcmltYXJpZXMgPSAoQ29sb3JBc3BlY3RzOjpQcmltYXJpZXMpcHJpbWFyaWVzOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFzQ29sb3JNYXRyaWNlc1NmLm1hcChtYXRyaXgsICZzZk1hdHJpeCkpIHsKKyAgICAgICAgLy8gdXNlIHN0YXRpYyBjYXN0IGFuZCBlbnN1cmUgaXQgaXMgaW4gdGhlIGV4dGVuc2lvbiByYW5nZQorICAgICAgICBpZiAobWF0cml4IDwgQzJDb2xvcjo6TUFUUklYX1ZFTkRPUl9TVEFSVCB8fCBtYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgIC8vIHVuZGVmaW5lZCBub24tZXh0ZW5zaW9uIHZhbHVlcyBtYXAgdG8gJ090aGVyJworICAgICAgICAgICAgc2ZNYXRyaXggPSBDb2xvckFzcGVjdHM6Ok1hdHJpeE90aGVyOworICAgICAgICAgICAgcmVzID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZk1hdHJpeCA9IChDb2xvckFzcGVjdHM6Ok1hdHJpeENvZWZmcyltYXRyaXg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqc3RhbmRhcmQgPSBDb2xvclV0aWxzOjp3cmFwQ29sb3JBc3BlY3RzSW50b0NvbG9yU3RhbmRhcmQoc2ZQcmltYXJpZXMsIHNmTWF0cml4KTsKKworICAgIHJldHVybiByZXM7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKGludDMyX3Qgc3RhbmRhcmQsIEMyQ29sb3I6OnByaW1hcmllc190ICpwcmltYXJpZXMsIEMyQ29sb3I6Om1hdHJpeF90ICptYXRyaXgpIHsKKyAgICAvLyBmaXJzdCBtYXAgdG8gc3RhZ2VmcmlnaHQgZm91bmRhdGlvbiBhc3BlY3RzID0+IHRoZXNlIGFjdHVhbGx5IG1hcCBuZWFybHkgMToxIHRvCisgICAgLy8gQ29kZWMgMi4wIGFzcGVjdHMKKyAgICBDb2xvckFzcGVjdHM6OlByaW1hcmllcyBzZlByaW1hcmllczsKKyAgICBDb2xvckFzcGVjdHM6Ok1hdHJpeENvZWZmcyBzZk1hdHJpeDsKKyAgICBib29sIHJlcyA9IHRydWU7CisgICAgKHZvaWQpQ29sb3JVdGlsczo6dW53cmFwQ29sb3JBc3BlY3RzRnJvbUNvbG9yU3RhbmRhcmQoc3RhbmRhcmQsICZzZlByaW1hcmllcywgJnNmTWF0cml4KTsKKworICAgIC8vIG1hcCBrbm93biBjb25zdGFudHMgYW5kIGtlZXAgdmVuZG9yIGV4dGVuc2lvbnMuIGFsbCBvdGhlciB2YWx1ZXMgYXJlIG1hcHBlZCB0byAnT3RoZXInCisgICAgaWYgKCFzQ29sb3JQcmltYXJpZXNTZi5tYXAoc2ZQcmltYXJpZXMsIHByaW1hcmllcykpIHsKKyAgICAgICAgLy8gdXNlIHN0YXRpYyBjYXN0IGFuZCBlbnN1cmUgaXQgaXMgaW4gdGhlIGV4dGVuc2lvbiByYW5nZQorICAgICAgICAqcHJpbWFyaWVzID0gKEMyQ29sb3I6OnByaW1hcmllc190KXNmUHJpbWFyaWVzOworICAgICAgICBpZiAoKnByaW1hcmllcyA8IEMyQ29sb3I6OlBSSU1BUklFU19WRU5ET1JfU1RBUlQgfHwgKnByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgICAgICAgKnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUjsKKyAgICAgICAgICAgIHJlcyA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFzQ29sb3JNYXRyaWNlc1NmLm1hcChzZk1hdHJpeCwgbWF0cml4KSkgeworICAgICAgICAvLyB1c2Ugc3RhdGljIGNhc3QgYW5kIGVuc3VyZSBpdCBpcyBpbiB0aGUgZXh0ZW5zaW9uIHJhbmdlCisgICAgICAgICptYXRyaXggPSAoQzJDb2xvcjo6bWF0cml4X3Qpc2ZNYXRyaXg7CisgICAgICAgIGlmICgqbWF0cml4IDwgQzJDb2xvcjo6TUFUUklYX1ZFTkRPUl9TVEFSVCB8fCAqbWF0cml4ID4gQzJDb2xvcjo6TUFUUklYX09USEVSKSB7CisgICAgICAgICAgICAqbWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX09USEVSOworICAgICAgICAgICAgcmVzID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDMkNvbG9yOjpwcmltYXJpZXNfdCBmcm9tLCBDb2xvckFzcGVjdHM6OlByaW1hcmllcyAqdG8pIHsKKyAgICByZXR1cm4gc0NvbG9yUHJpbWFyaWVzU2YubWFwKGZyb20sIHRvKTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoQ29sb3JBc3BlY3RzOjpQcmltYXJpZXMgZnJvbSwgQzJDb2xvcjo6cHJpbWFyaWVzX3QgKnRvKSB7CisgICAgcmV0dXJuIHNDb2xvclByaW1hcmllc1NmLm1hcChmcm9tLCB0byk7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKEMyQ29sb3I6Om1hdHJpeF90IGZyb20sIENvbG9yQXNwZWN0czo6TWF0cml4Q29lZmZzICp0bykgeworICAgIHJldHVybiBzQ29sb3JNYXRyaWNlc1NmLm1hcChmcm9tLCB0byk7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKENvbG9yQXNwZWN0czo6TWF0cml4Q29lZmZzIGZyb20sIEMyQ29sb3I6Om1hdHJpeF90ICp0bykgeworICAgIHJldHVybiBzQ29sb3JNYXRyaWNlc1NmLm1hcChmcm9tLCB0byk7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKEMyQ29sb3I6OnRyYW5zZmVyX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICBib29sIHJlcyA9IHRydWU7CisgICAgLy8gbWFwIFNESyBkZWZpbmVkIHZhbHVlcyBkaXJlY3RseS4gRm9yIG90aGVyIHZhbHVlcywgdXNlIHdyYXBwaW5nIGZyb20gQ29sb3JVdGlscy4KKyAgICBpZiAoIXNDb2xvclRyYW5zZmVycy5tYXAoZnJvbSwgdG8pKSB7CisgICAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXIgc2ZUcmFuc2ZlcjsKKworICAgICAgICAvLyBtYXAga25vd24gY29uc3RhbnRzIGFuZCBrZWVwIHZlbmRvciBleHRlbnNpb25zLiBhbGwgb3RoZXIgdmFsdWVzIGFyZSBtYXBwZWQgdG8gJ090aGVyJworICAgICAgICBpZiAoIXNDb2xvclRyYW5zZmVyc1NmLm1hcChmcm9tLCAmc2ZUcmFuc2ZlcikpIHsKKyAgICAgICAgICAgIC8vIHVzZSBzdGF0aWMgY2FzdCBhbmQgZW5zdXJlIGl0IGlzIGluIHRoZSBleHRlbnNpb24gcmFuZ2UKKyAgICAgICAgICAgIGlmIChmcm9tIDwgQzJDb2xvcjo6VFJBTlNGRVJfVkVORE9SX1NUQVJUIHx8IGZyb20gPiBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUikgeworICAgICAgICAgICAgICAgIHNmVHJhbnNmZXIgPSBDb2xvckFzcGVjdHM6OlRyYW5zZmVyT3RoZXI7CisgICAgICAgICAgICAgICAgcmVzID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAqdG8gPSBDb2xvclV0aWxzOjp3cmFwQ29sb3JBc3BlY3RzSW50b0NvbG9yVHJhbnNmZXIoc2ZUcmFuc2Zlcik7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKGludDMyX3QgZnJvbSwgQzJDb2xvcjo6dHJhbnNmZXJfdCAqdG8pIHsKKyAgICAvLyBtYXAgU0RLIGRlZmluZWQgdmFsdWVzIGRpcmVjdGx5LiBGb3Igb3RoZXIgdmFsdWVzLCB1c2Ugd3JhcHBpbmcgZnJvbSBDb2xvclV0aWxzLgorICAgIGlmICghc0NvbG9yVHJhbnNmZXJzLm1hcChmcm9tLCB0bykpIHsKKyAgICAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlciBzZlRyYW5zZmVyOworICAgICAgICAodm9pZClDb2xvclV0aWxzOjp1bndyYXBDb2xvckFzcGVjdHNGcm9tQ29sb3JUcmFuc2Zlcihmcm9tLCAmc2ZUcmFuc2Zlcik7CisKKyAgICAgICAgLy8gbWFwIGtub3duIGNvbnN0YW50cyBhbmQga2VlcCB2ZW5kb3IgZXh0ZW5zaW9ucy4gYWxsIG90aGVyIHZhbHVlcyBhcmUgbWFwcGVkIHRvICdPdGhlcicKKyAgICAgICAgaWYgKCFzQ29sb3JUcmFuc2ZlcnNTZi5tYXAoc2ZUcmFuc2ZlciwgdG8pKSB7CisgICAgICAgICAgICAvLyB1c2Ugc3RhdGljIGNhc3QgYW5kIGVuc3VyZSBpdCBpcyBpbiB0aGUgZXh0ZW5zaW9uIHJhbmdlCisgICAgICAgICAgICAqdG8gPSAoQzJDb2xvcjo6dHJhbnNmZXJfdClzZlRyYW5zZmVyOworICAgICAgICAgICAgaWYgKCp0byA8IEMyQ29sb3I6OlRSQU5TRkVSX1ZFTkRPUl9TVEFSVCB8fCAqdG8gPiBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUikgeworICAgICAgICAgICAgICAgICp0byA9IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcCgKKyAgICAgICAgQzJDb2xvcjo6cmFuZ2VfdCByYW5nZSwgQzJDb2xvcjo6cHJpbWFyaWVzX3QgcHJpbWFyaWVzLAorICAgICAgICBDMkNvbG9yOjptYXRyaXhfdCBtYXRyaXgsIEMyQ29sb3I6OnRyYW5zZmVyX3QgdHJhbnNmZXIsIHVpbnQzMl90ICpkYXRhU3BhY2UpIHsKKyNpZiAwCisgICAgLy8gcHVyZSByZWltcGxlbWVudGF0aW9uCisgICAgKmRhdGFTcGFjZSA9IEhBTF9EQVRBU1BBQ0VfVU5LTk9XTjsgLy8gdGhpcyBpcyAwCisKKyAgICBzd2l0Y2ggKHJhbmdlKSB7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6UkFOR0VfRlVMTDogICAgKmRhdGFTcGFjZSB8PSBIQUxfREFUQVNQQUNFX1JBTkdFX0ZVTEw7ICAgIGJyZWFrOworICAgICAgICBjYXNlIEMyQ29sb3I6OlJBTkdFX0xJTUlURUQ6ICpkYXRhU3BhY2UgfD0gSEFMX0RBVEFTUEFDRV9SQU5HRV9MSU1JVEVEOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgfQorCisgICAgc3dpdGNoICh0cmFuc2ZlcikgeworICAgICAgICBjYXNlIEMyQ29sb3I6OlRSQU5TRkVSX0xJTkVBUjogICpkYXRhU3BhY2UgfD0gSEFMX0RBVEFTUEFDRV9UUkFOU0ZFUl9MSU5FQVI7ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpUUkFOU0ZFUl9TUkdCOiAgICAqZGF0YVNwYWNlIHw9IEhBTF9EQVRBU1BBQ0VfVFJBTlNGRVJfU1JHQjsgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6VFJBTlNGRVJfMTcwTTogICAgKmRhdGFTcGFjZSB8PSBIQUxfREFUQVNQQUNFX1RSQU5TRkVSX1NNUFRFXzE3ME07IGJyZWFrOworICAgICAgICBjYXNlIEMyQ29sb3I6OlRSQU5TRkVSX0dBTU1BMjI6ICpkYXRhU3BhY2UgfD0gSEFMX0RBVEFTUEFDRV9UUkFOU0ZFUl9HQU1NQTJfMjsgICBicmVhazsKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpUUkFOU0ZFUl9HQU1NQTI4OiAqZGF0YVNwYWNlIHw9IEhBTF9EQVRBU1BBQ0VfVFJBTlNGRVJfR0FNTUEyXzg7ICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6VFJBTlNGRVJfU1QyMDg0OiAgKmRhdGFTcGFjZSB8PSBIQUxfREFUQVNQQUNFX1RSQU5TRkVSX1NUMjA4NDsgICAgIGJyZWFrOworICAgICAgICBjYXNlIEMyQ29sb3I6OlRSQU5TRkVSX0hMRzogICAgICpkYXRhU3BhY2UgfD0gSEFMX0RBVEFTUEFDRV9UUkFOU0ZFUl9ITEc7ICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgfQorCisgICAgc3dpdGNoIChwcmltYXJpZXMpIHsKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpQUklNQVJJRVNfQlQ2MDFfNTI1OgorICAgICAgICAgICAgKmRhdGFTcGFjZSB8PSAobWF0cml4ID09IEMyQ29sb3I6Ok1BVFJJWF9TTVBURTI0ME0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtYXRyaXggPT0gQzJDb2xvcjo6TUFUUklYX0JUNzA5KQorICAgICAgICAgICAgICAgICAgICA/IEhBTF9EQVRBU1BBQ0VfU1RBTkRBUkRfQlQ2MDFfNTI1X1VOQURKVVNURUQKKyAgICAgICAgICAgICAgICAgICAgOiBIQUxfREFUQVNQQUNFX1NUQU5EQVJEX0JUNjAxXzUyNTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEMyQ29sb3I6OlBSSU1BUklFU19CVDYwMV82MjU6CisgICAgICAgICAgICAqZGF0YVNwYWNlIHw9IChtYXRyaXggPT0gQzJDb2xvcjo6TUFUUklYX1NNUFRFMjQwTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfQlQ3MDkpCisgICAgICAgICAgICAgICAgICAgID8gSEFMX0RBVEFTUEFDRV9TVEFOREFSRF9CVDYwMV82MjVfVU5BREpVU1RFRAorICAgICAgICAgICAgICAgICAgICA6IEhBTF9EQVRBU1BBQ0VfU1RBTkRBUkRfQlQ2MDFfNjI1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6UFJJTUFSSUVTX0JUMjAyMDoKKyAgICAgICAgICAgICpkYXRhU3BhY2UgfD0gKG1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfQlQyMDIwQ09OU1RBTlQKKyAgICAgICAgICAgICAgICAgICAgPyBIQUxfREFUQVNQQUNFX1NUQU5EQVJEX0JUMjAyMF9DT05TVEFOVF9MVU1JTkFOQ0UKKyAgICAgICAgICAgICAgICAgICAgOiBIQUxfREFUQVNQQUNFX1NUQU5EQVJEX0JUMjAyMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpQUklNQVJJRVNfQlQ0NzBfTToKKyAgICAgICAgICAgICpkYXRhU3BhY2UgfD0gSEFMX0RBVEFTUEFDRV9TVEFOREFSRF9CVDQ3ME07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpQUklNQVJJRVNfQlQ3MDk6CisgICAgICAgICAgICAqZGF0YVNwYWNlIHw9IEhBTF9EQVRBU1BBQ0VfU1RBTkRBUkRfQlQ3MDk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgfQorI2Vsc2UKKyAgICAvLyBmb3Igbm93IHVzZSBsZWdhY3kgaW1wbGVtZW50YXRpb24KKyAgICBDb2xvckFzcGVjdHMgYXNwZWN0czsKKyAgICBpZiAoIXNDb2xvclJhbmdlc1NmLm1hcChyYW5nZSwgJmFzcGVjdHMubVJhbmdlKSkgeworICAgICAgICBhc3BlY3RzLm1SYW5nZSA9IENvbG9yQXNwZWN0czo6UmFuZ2VVbnNwZWNpZmllZDsKKyAgICB9CisgICAgaWYgKCFzQ29sb3JQcmltYXJpZXNTZi5tYXAocHJpbWFyaWVzLCAmYXNwZWN0cy5tUHJpbWFyaWVzKSkgeworICAgICAgICBhc3BlY3RzLm1QcmltYXJpZXMgPSBDb2xvckFzcGVjdHM6OlByaW1hcmllc1Vuc3BlY2lmaWVkOworICAgIH0KKyAgICBpZiAoIXNDb2xvck1hdHJpY2VzU2YubWFwKG1hdHJpeCwgJmFzcGVjdHMubU1hdHJpeENvZWZmcykpIHsKKyAgICAgICAgYXNwZWN0cy5tTWF0cml4Q29lZmZzID0gQ29sb3JBc3BlY3RzOjpNYXRyaXhVbnNwZWNpZmllZDsKKyAgICB9CisgICAgaWYgKCFzQ29sb3JUcmFuc2ZlcnNTZi5tYXAodHJhbnNmZXIsICZhc3BlY3RzLm1UcmFuc2ZlcikpIHsKKyAgICAgICAgYXNwZWN0cy5tVHJhbnNmZXIgPSBDb2xvckFzcGVjdHM6OlRyYW5zZmVyVW5zcGVjaWZpZWQ7CisgICAgfQorICAgICpkYXRhU3BhY2UgPSBDb2xvclV0aWxzOjpnZXREYXRhU3BhY2VGb3JDb2xvckFzcGVjdHMoYXNwZWN0cywgdHJ1ZSAvKiBtYXlFeHBhbmQgKi8pOworI2VuZGlmCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKEMyQ29sb3I6OnRyYW5zZmVyX3QgZnJvbSwgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlciAqdG8pIHsKKyAgICByZXR1cm4gc0NvbG9yVHJhbnNmZXJzU2YubWFwKGZyb20sIHRvKTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoQ29sb3JBc3BlY3RzOjpUcmFuc2ZlciBmcm9tLCBDMkNvbG9yOjp0cmFuc2Zlcl90ICp0bykgeworICAgIHJldHVybiBzQ29sb3JUcmFuc2ZlcnNTZi5tYXAoZnJvbSwgdG8pOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMk1hcHBlci5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMk1hcHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZWI5MmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyTWFwcGVyLmgKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQ09ERUMyX01BUFBFUl9IXworI2RlZmluZSBBTkRST0lEX0NPREVDMl9NQVBQRVJfSF8KKworI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisgICAgLyoqCisgICAgICogVXRpbGl0eSBjbGFzcyB0byBtYXAgQ29kZWMgMi4wIHZhbHVlcyB0byBhbmRyb2lkIHZhbHVlcy4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgQzJNYXBwZXIgeworICAgICAgICBzdHJ1Y3QgUHJvZmlsZUxldmVsTWFwcGVyIHsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXBQcm9maWxlKEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3QqKSA9IDA7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWFwUHJvZmlsZShpbnQzMl90LCBDMkNvbmZpZzo6cHJvZmlsZV90KikgPSAwOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hcExldmVsKEMyQ29uZmlnOjpsZXZlbF90LCBpbnQzMl90KikgPSAwOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hcExldmVsKGludDMyX3QsIEMyQ29uZmlnOjpsZXZlbF90KikgPSAwOworICAgICAgICAgICAgdmlydHVhbCB+UHJvZmlsZUxldmVsTWFwcGVyKCkgPSBkZWZhdWx0OworICAgICAgICB9OworCisgICAgICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8UHJvZmlsZUxldmVsTWFwcGVyPgorICAgICAgICBHZXRQcm9maWxlTGV2ZWxNYXBwZXIoc3RkOjpzdHJpbmcgbWVkaWFUeXBlKTsKKworICAgICAgICAvLyBjb252ZXJ0IGJldHdlZW4gYml0cmF0ZXMKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKEMyQ29uZmlnOjpiaXRyYXRlX21vZGVfdCwgaW50MzJfdCopOworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoaW50MzJfdCwgQzJDb25maWc6OmJpdHJhdGVfbW9kZV90Kik7CisKKyAgICAgICAgLy8gY29udmVydCBiZXR3ZWVuIHBjbSBlbmNvZGluZ3MKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdCwgaW50MzJfdCopOworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoaW50MzJfdCwgQzJDb25maWc6OnBjbV9lbmNvZGluZ190Kik7CisKKyAgICAgICAgLy8gY29udmVydCBiZXR3ZWVuIHBpY3R1cmUgdHlwZXMKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdCwgaW50MzJfdCopOworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoaW50MzJfdCwgQzJDb25maWc6OnBpY3R1cmVfdHlwZV90Kik7CisKKyAgICAgICAgLy8gY29udmVydCBiZXR3ZWVuIGNvbG9yIGFzcGVjdHMKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKEMyQ29sb3I6OnJhbmdlX3QsIGludDMyX3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKGludDMyX3QsIEMyQ29sb3I6OnJhbmdlX3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKEMyQ29sb3I6OnByaW1hcmllc190LCBDMkNvbG9yOjptYXRyaXhfdCwgaW50MzJfdCopOworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoaW50MzJfdCwgQzJDb2xvcjo6cHJpbWFyaWVzX3QqLCBDMkNvbG9yOjptYXRyaXhfdCopOworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoQzJDb2xvcjo6dHJhbnNmZXJfdCwgaW50MzJfdCopOworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoaW50MzJfdCwgQzJDb2xvcjo6dHJhbnNmZXJfdCopOworCisgICAgICAgIHN0YXRpYyBib29sIG1hcCgKKyAgICAgICAgICAgICAgICBDMkNvbG9yOjpyYW5nZV90LCBDMkNvbG9yOjpwcmltYXJpZXNfdCwgQzJDb2xvcjo6bWF0cml4X3QsIEMyQ29sb3I6OnRyYW5zZmVyX3QsCisgICAgICAgICAgICAgICAgdWludDMyX3QgKmRhdGFTcGFjZSk7CisKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKEMyQ29sb3I6OnJhbmdlX3QsIENvbG9yQXNwZWN0czo6UmFuZ2UqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKENvbG9yQXNwZWN0czo6UmFuZ2UsIEMyQ29sb3I6OnJhbmdlX3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKEMyQ29sb3I6OnByaW1hcmllc190LCBDb2xvckFzcGVjdHM6OlByaW1hcmllcyopOworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoQ29sb3JBc3BlY3RzOjpQcmltYXJpZXMsIEMyQ29sb3I6OnByaW1hcmllc190Kik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbG9yOjptYXRyaXhfdCwgQ29sb3JBc3BlY3RzOjpNYXRyaXhDb2VmZnMqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKENvbG9yQXNwZWN0czo6TWF0cml4Q29lZmZzLCBDMkNvbG9yOjptYXRyaXhfdCopOworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoQzJDb2xvcjo6dHJhbnNmZXJfdCwgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlciopOworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoQ29sb3JBc3BlY3RzOjpUcmFuc2ZlciwgQzJDb2xvcjo6dHJhbnNmZXJfdCopOworICAgIH07Cit9CisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DT0RFQzJfTUFQUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi90ZXN0cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZTZlMjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDc5IEBACitjY190ZXN0IHsKKyAgICBuYW1lOiAiY29kZWMyX2NvcmVfcGFyYW1fdGVzdCIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDMlBhcmFtX3Rlc3QuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliY29kZWMyX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICAvLyBwYXJhbSB0ZXN0cyBtdXN0IG5vdCBkZXBlbmQgb24gYW55IGNvZGVjMiBsaWJyYXJpZXMgYXMgYWxsIHBhcmFtcyBzaG91bGQgYmUgdGVtcGxhdGVkCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiY29kZWMyX3ZuZGtfdGVzdCIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDMl90ZXN0LmNwcCIsCisgICAgICAgICJDMlNhbXBsZUNvbXBvbmVudF90ZXN0LmNwcCIsCisgICAgICAgICJDMlV0aWxUZXN0LmNwcCIsCisgICAgICAgICJ2bmRrL0MyQnVmZmVyVGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiY29kZWMyX3ZuZGtfaW50ZXJmYWNlX3Rlc3QiLAorCisgICAgc3JjczogWworICAgICAgICAiQzJDb21wb25lbnRJbnRlcmZhY2VfdGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdGVzdHMvQzJDb21wb25lbnRJbnRlcmZhY2VfdGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQzJDb21wb25lbnRJbnRlcmZhY2VfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkwNzk2NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMkNvbXBvbmVudEludGVyZmFjZV90ZXN0LmNwcApAQCAtMCwwICsxLDcwNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJDMkNvbXBvbmVudEludGVyZmFjZV90ZXN0IgorCisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorCisjaWYgIWRlZmluZWQoVU5VU0VEKQorI2RlZmluZSBVTlVTRUQoZXhwcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAodm9pZCkoZXhwcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZW5kaWYgLy8hZGVmaW5lZChVTlVTRUQpCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordGVtcGxhdGUgPGNsYXNzIFQ+IHN0ZDo6dW5pcXVlX3B0cjxUPiBhbGxvY191bmlxdWVfY3N0cihjb25zdCBjaGFyICpjc3RyKSB7CisgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihjc3RyKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gcHRyID0gVDo6QWxsb2NVbmlxdWUobGVuKTsKKyAgICBtZW1jcHkocHRyLT5tLnZhbHVlLCBjc3RyLCBsZW4pOworICAgIHJldHVybiBwdHI7Cit9CisKK2NsYXNzIEMyQ29tcEludGZUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Citwcm90ZWN0ZWQ6CisgICAgQzJDb21wSW50ZlRlc3QoKSB7fQorICAgIH5DMkNvbXBJbnRmVGVzdCgpIG92ZXJyaWRlIHt9CisKKyAgICB2b2lkIHNldENvbXBvbmVudChzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYpIHsKKyAgICAgICAgbUludGYgPSBpbnRmOworICAgIH0KKworICAgIHZvaWQgcmVzZXRSZXN1bHRzKCkgeworICAgICAgICBtSW50ZiA9IG51bGxwdHI7CisgICAgICAgIG1QYXJhbVJlc3VsdHMuY2xlYXIoKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCB0ZXN0VW5zdXBwb3J0ZWRQYXJhbSgpOworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgdGVzdFN1cHBvcnRlZFBhcmFtKCk7CisKKyAgICAvLyB0ZXN0UmVhZE9ubHlQYXJhbSgpIGFuZCB0ZXN0V3JpdGFibGVQYXJhbSgpIGFyZSB0aGUgbWFpbiBmdW5jdGlvbnMgZm9yIHRlc3RpbmcgYSBwYXJhbWV0ZXIuCisgICAgLy8gQSBjYWxsZXIgc2hvdWxkIGZpbmQgb3V0IGlmIGEgdGVzdGVkIHBhcmFtZXRlciBpcyByZWFkLW9ubHkgb3Igd3JpdGFibGUgYmVmb3JlIGNhbGxpbmcgdGhlbQorICAgIC8vIGFuZCBpdCBtdXN0IGNhbGwgb25lIG9mIHRoZSBjb3JyZXNwb25kZWQgdGhlbS4KKworICAgIC8vIElmIGEgcGFyYW1ldGVyIGlzIHJlYWQtb25seSB0aGlzIGlzIGNhbGxlZC4KKyAgICAvLyBUZXN0IHJlYWQtb25seSBwYXJhbWV0ZXIgfHByZVBhcmFtfC4gVGhlIHRlc3QgZXhwZWN0cyBmYWlsdXJlIHdoaWxlIGNvbmZpZygpIHdpdGggfG5ld1BhcmFtfCwKKyAgICAvLyBhbmQgbWFrZSBzdXJlIHxwcmVQYXJhbXwgc3RheSB1bmNoYW5nZWQuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgdm9pZCB0ZXN0UmVhZE9ubHlQYXJhbShjb25zdCBUICZwcmVQYXJhbSwgY29uc3QgVCAmbmV3UGFyYW0pOworCisgICAgLy8gSWYgYSBwYXJhbWV0ZXIgaXMgd3JpdGFibGUgdGhpcyBpcyBjYWxsZWQuCisgICAgLy8gVGVzdCBvbmUgZmlsZWQgfHdyaXRhYmxlRmllbGR8IGZvciBnaXZlbiB3cml0YWJsZSBwYXJhbWV0ZXIgfHBhcmFtfC4KKyAgICAvLyB8dmFsaWRWYWx1ZXN8IGNvbnRhaW5zIGFsbCB2YWx1ZXMgb2J0YWluZWQgZnJvbSBxdWVyeVN1cHBvcnRlZFZhbHVlcygpIGZvciB8d3JpdGFibGVGaWVsZHwuCisgICAgLy8gVGhlIHRlc3QgY2hlY2tzIHZhbGlkaXR5IGZvciBjb25maWcoKSB3aXRoIGVhY2ggdmFsdWUsIGFuZCBtYWtlIHN1cmUgdmFsdWVzIGFyZSBjb25maWctZWQKKyAgICAvLyBieSBxdWVyeSgpIHRoZW0gb3V0LiB8aW52YWxpZFZhbHVlc3wgY29udGFpbnMgc29tZSB2YWx1ZXMgd2hpY2ggYXJlIG5vdCBpbiB8dmFsaWRWYWx1ZXN8LgorICAgIC8vIFRoZSB0ZXN0IGV4cGVjdHMgQzJfQkFEX1ZBTFVFIHdoaWxlIGNvbmZpZygpIHdpdGggdGhlc2UgdmFsdWVzLAorICAgIC8vIGFuZCB8cGFyYW18IHNob3VsZCBzdGF5IHVuY2hhbmdlZC4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVFBhcmFtLCB0eXBlbmFtZSBUUmVhbEZpZWxkLCB0eXBlbmFtZSBURmllbGQ+CisgICAgdm9pZCB0ZXN0V3JpdGFibGVQYXJhbShUUGFyYW0gKmNvbnN0IHBhcmFtLCBUUmVhbEZpZWxkICpjb25zdCB3cml0YWJsZUZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VEZpZWxkPiAmdmFsaWRWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxURmllbGQ+ICZpbnZhbGlkVmFsdWVzKTsKKworICAgIC8vIFRlc3QgYWxsIHRoZSBkZWZpbmVkIHBhcmFtZXRlcnMgaW4gQzJQYXJhbS5oLgorICAgIHZvaWQgdGVzdE1haW4oc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmNvbXBvbmVudE5hbWUpOworCisgICAgLy8gQ2hlY2sgcGVybWlzc2lvbiBvZiBwYXJhbWV0ZXIgdHlwZSB8VHwgZm9yIHRlc3RpbmcgaW50ZXJmYWNlLgorICAgIC8vIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmaXJzdCBvZiB0aGUgdGVzdGluZyBwZXIgcGFyYW1ldGVyIHR5cGUsCisgICAgLy8gdGhlcmVmb3JlIGRpZmZlcmVudCB0ZXN0aW5nIHByb2Nlc3MgaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIHBlcm1pc3Npb24gdHlwZS4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICB2b2lkIGNoZWNrUGFyYW1QZXJtaXNzaW9uKAorICAgICAgICAgICAgaW50ICpjb25zdCB3cml0YWJsZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICZzdXBwb3J0ZWRQYXJhbXMpOworCitwcml2YXRlOgorICAgIGVudW0gUGFyYW1QZXJtaXNzaW9uIDogaW50IHsKKyAgICAgICAgV1JJVEFCTEUsCisgICAgICAgIFJFQURPTkxZLAorICAgICAgICBVTlNVUFBPUlRFRCwKKyAgICB9OworCisgICAgc3RydWN0IHBhcmFtVGVzdEluZm8geworICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgICBpbnQgcmVzdWx0OworICAgICAgICBwYXJhbVRlc3RJbmZvKGNvbnN0IGNoYXIgKm5hbWVfLCBpbnQgcmVzdWx0XykKKyAgICAgICAgICAgIDogbmFtZShuYW1lXyksIHJlc3VsdChyZXN1bHRfKSB7fQorICAgIH07CisKKyAgICAvLyBxdWVyeU9uU3RhY2soKSBhbmQgcXVlcnlvbkhlYXAoKSBib3RoIGNhbGwgYW4gaW50ZXJmYWNlJ3MgcXVlcnlfdmIoKSBhbmQKKyAgICAvLyBjaGVjayBpZiBhIGNvbXBvbmVudCBoYXMgYSBwYXJhbWV0ZXIgd2hvc2UgdHlwZSBpcyB8VHwuCisgICAgLy8gSWYgYSBjb21wb25lbnQgaGFzLCB0aGUgdmFsdWUgc2hvdWxkIGJlIGNvcGllZCBpbnRvIGFuIGFyZ3VtZW50LCB0aGF0IGlzCisgICAgLy8gfHB8IGluIHF1ZXJ5T25TdGFjaygpIGFuZCB8aGVhcFBhcmFtc3wgaW4gcXVlcnlPbkhlYXAoKS4KKyAgICAvLyBUaGUgcmV0dXJuIHZhbHVlIGlzIGMyX3N0YXR1c190IChlLmcuIEMyX09LKS4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gYzJfc3RhdHVzX3QgcXVlcnlPblN0YWNrKFQgKmNvbnN0IHApOworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgYzJfc3RhdHVzX3QgcXVlcnlPbkhlYXAoY29uc3QgVCAmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICpjb25zdCBoZWFwUGFyYW1zKTsKKworICAgIC8vIEdldCBhIHZhbHVlIHdob3NlIHR5cGUgaXMgfFR8IGluIGEgY29tcG9uZW50LiBUaGUgdmFsdWUgaXMgY29waWVkIHRvIHxwYXJhbXwuCisgICAgLy8gVGhpcyBzaG91bGQgYmUgY2FsbGVkIG9ubHkgaWYgYSBjb21wb25lbnQgaGFzIHRoZSBwYXJhbWV0ZXIuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgZ2V0VmFsdWUoVCAqY29uc3QgcGFyYW0pOworCisgICAgLy8gQ2hlY2sgaWYgdGhlIHBhcmFtZXRlcidzIHZhbHVlIGluIGNvbXBvbmVudCBpcyBlcXVhbCB0byB8ZXhwZWN0ZWR8IGFuZAorICAgIC8vIHF1ZXJ5T25TdGFjaygpIGFuZCBxdWVyeU9uSGVhcCgpIGFyZSBzdWNjZWVkZWQuIFdoZW4gdGhpcyBmdW5jdGlvbiBjYWxsZWQsCisgICAgLy8gaXQgc2hvdWxkIGJlIGd1YXJhbnRlZWQgYSBjb21wb25lbnQgaGFzIHRoZSBwYXJhbWV0ZXIuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgcXVlcnlQYXJhbUFzRXhwZWN0ZWQoY29uc3QgVCAmZXhwZWN0ZWQpOworCisgICAgLy8gVGVzdCBpZiBxdWVyeSBmdW5jdGlvbnMgd29ya3MgY29ycmVjdGx5IGZvciBzdXBwb3J0ZWQgcGFyYW1ldGVycy4KKyAgICAvLyAiU3VwcG9ydCIgbWVhbnMgaGVyZSBhIGNvbXBvbmVudCBoYXMgdGhlIHBhcmFtZXRlci4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBxdWVyeVN1cHBvcnRlZFBhcmFtKCk7CisKKyAgICAvLyBUZXN0IHF1ZXJ5IGZ1bmN0aW9ucyB3b3JrcyBjb3JyZWN0bHkgZm9yIHVuc3VwcG9ydGVkIHBhcmFtZXRlcnMuCisgICAgLy8gIlVuc3VwcG9ydCIgbWVhbnMgaGVyZSBhIGNvbXBvbmVudCBkb2Vzbid0IGhhdmUgdGhlIHBhcmFtZXRlci4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBxdWVyeVVuc3VwcG9ydGVkUGFyYW0oKTsKKworICAgIC8vIEV4ZWN1dGUgYW4gaW50ZXJmYWNlJ3MgY29uZmlnX3ZiKCkuIHxUfCBpcyBhIHNpbmdsZSBwYXJhbWV0ZXIgdHlwZSwgbm90IHN0ZDo6dmVjdG9yLgorICAgIC8vIGNvbmZpZygpIGNyZWF0ZXMgc3RkOjp2ZWN0b3I8QzJQYXJhbSAqPiB7cH0gYW5kIHBhc3NlcyBpdCB0byBjb25maWdfdmIoKS4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICBjMl9zdGF0dXNfdAorICAgIGNvbmZpZyhUICpjb25zdCBwLAorICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gKmNvbnN0IGZhaWx1cmVzKTsKKworICAgIC8vIFRlc3QgaWYgY29uZmlnIHdvcmtzIGNvcnJlY3RseSBmb3IgcmVhZC1vbmx5IHBhcmFtZXRlcnMuCisgICAgLy8gQmVjYXVzZSB0aGUgZmFpbHVyZSBvZiBjb25maWcoKSBpcyBhc3N1bWVkLCB8bmV3UGFyYW18IGRvZXNuJ3QgbWF0dGVyLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIGNvbmZpZ1JlYWRPbmx5UGFyYW0oY29uc3QgVCAmbmV3UGFyYW0pOworCisgICAgLy8gVGVzdCBpZiBjb25maWcgd29ya3MgY29ycmVjdGx5IGZvciB3cml0YWJsZSBwYXJhbWV0ZXJzLgorICAgIC8vIFRoaXMgY2hhbmdlcyB0aGUgcGFyYW1ldGVyJ3MgdmFsdWUgdG8gfG5ld1BhcmFtfC4KKyAgICAvLyB8c3RDb25maWd8IGlzIGEgcmV0dXJuIHZhbHVlIG9mIGNvbmZpZygpLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIGNvbmZpZ1dyaXRhYmxlUGFyYW1WYWxpZFZhbHVlKGNvbnN0IFQgJm5ld1BhcmFtLCBjMl9zdGF0dXNfdCAqc3RDb25maWcpOworCisgICAgLy8gVGVzdCBpZiBjb25maWcgd29ya3MgY29ycmVjdGx5IGluIHRoZSBjYXNlIGFuIGludmFsaWQgdmFsdWUgfG5ld1BhcmFtfCBpcyB0cmllZCB0byB3cml0ZQorICAgIC8vIHRvIGFuIHdyaXRhYmxlIHBhcmFtZXRlci4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBjb25maWdXcml0YWJsZVBhcmFtSW52YWxpZFZhbHVlKGNvbnN0IFQgJm5ld1BhcmFtKTsKKworICAgIC8vIENyZWF0ZSB2YWx1ZXMgZm9yIHRlc3RpbmcgZnJvbSB8dmFsaWRWYWx1ZUluZm9zfC4gVGhlIHZhbHVlcyBhcmUgcmV0dXJuZWQgYXMgYXJndW1lbnRzLgorICAgIC8vIHx2YWxpZFZhbHVlc3wgOiB2YWxpZCB2YWx1ZXMsIHdoaWNoIGNhbiBiZSB3cml0dGVuIGZvciB0aGUgcGFyYW1ldGVyLgorICAgIC8vIHxJbnZhbGlkVmFsdWVzfCA6IGludmFsaWQgdmFsdWVzLCB3aGljaCBjYW5ub3QgYmUgd3JpdHRlbiBmb3IgdGhlIHBhcmFtZXRlci4KKyAgICAvLyAgICAgICAgICAgICAgICAgICBjb25maWcoKSBzaG91bGQgYmUgZmFpbGVkIGlmIHRoZXNlIHZhbHVlcyBhcmUgdXNlZCBhcyBuZXcgdmFsdWVzLgorICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGZvciB3cml0YWJsZSBhbmQgc3VwcG9ydGVkIHBhcmFtZXRlcnMuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFRGaWVsZD4KKyAgICB2b2lkIGdldFRlc3RWYWx1ZXMoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsaWRWYWx1ZUluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxURmllbGQ+ICpjb25zdCB2YWxpZFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VEZpZWxkPiAqY29uc3QgaW52YWxpZFZhbHVlcyk7CisKKyAgICAvLyBPdXRwdXQgdGhlIHN1bW1hcnkgb2YgdGVzdCByZXN1bHRzLiBDYXRlZ29yaXplcyBwYXJhbWV0ZXJzIHdpdGggdGhlaXIgY29uZmlndXJhdGlvbi4KKyAgICB2b2lkIG91dHB1dFJlc3VsdHMoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBtSW50ZjsKKyAgICBzdGQ6OnZlY3RvcjxwYXJhbVRlc3RJbmZvPiBtUGFyYW1SZXN1bHRzOworICAgIHN0ZDo6c3RyaW5nIG1DdXJyZW50UGFyYW1OYW1lOworfTsKKworLy8gZmFjdG9yeSBmdW5jdGlvbgorLy8gVE9ETyhoaXJvaCk6IEFkZCBmYWN0b3J5IGZ1bmN0aW9ucyBmb3Igb3RoZXIgdHlwZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RkOjp1bmlxdWVfcHRyPFQ+IG1ha2VQYXJhbSgpIHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxUPigpOworfQorCit0ZW1wbGF0ZSA8PiBzdGQ6OnVuaXF1ZV9wdHI8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+IG1ha2VQYXJhbSgpIHsKKyAgICAvLyBUT0RPKGhpcm9oKTogU2V0IG1vcmUgcHJlY2lzZSBsZW5ndGguCisgICAgcmV0dXJuIEMyUG9ydE1pbWVDb25maWc6OmlucHV0OjpBbGxvY1VuaXF1ZSgxMDApOworfQorCisjZGVmaW5lIFRSQUNFRF9GQUlMVVJFKGZ1bmMpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBTQ09QRURfVFJBQ0UobUN1cnJlbnRQYXJhbU5hbWUpOyAgICAgICAgICAgICBcCisgICAgICAgIGZ1bmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKDo6dGVzdGluZzo6VGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkpIHsgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlIChmYWxzZSkKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGMyX3N0YXR1c190IEMyQ29tcEludGZUZXN0OjpxdWVyeU9uU3RhY2soVCAqY29uc3QgcCkgeworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBzdGFja1BhcmFtc3twfTsKKyAgICByZXR1cm4gbUludGYtPnF1ZXJ5X3ZiKHN0YWNrUGFyYW1zLCB7fSwgQzJfRE9OVF9CTE9DSywgbnVsbHB0cik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYzJfc3RhdHVzX3QgQzJDb21wSW50ZlRlc3Q6OnF1ZXJ5T25IZWFwKAorICAgICAgICBjb25zdCBUICZwLCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICpjb25zdCBoZWFwUGFyYW1zKSB7CisgICAgdWludDMyX3QgaW5kZXggPSBwLmluZGV4KCkgJiB+MHgwM0ZFMDAwMDsKKyAgICBpZiAocC5mb3JTdHJlYW0oKSkgeworICAgICAgICBpbmRleCB8PSAoKHAuc3RyZWFtKCkgPDwgMTcpICYgMHgwMUZFMDAwMCkgfCAweDAyMDAwMDAwOworICAgIH0KKyAgICByZXR1cm4gbUludGYtPnF1ZXJ5X3ZiKHt9LCB7aW5kZXh9LCBDMl9ET05UX0JMT0NLLCBoZWFwUGFyYW1zKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgQzJDb21wSW50ZlRlc3Q6OmdldFZhbHVlKFQgKmNvbnN0IHBhcmFtKSB7CisgICAgLy8gV2hlbiBnZXRWYWx1ZSgpIGlzIGNhbGxlZCwgYSBjb21wb25lbnQgaGFzIHRvIGhhdmUgdGhlIHBhcmFtZXRlci4KKyAgICBBU1NFUlRfRVEoQzJfT0ssIHF1ZXJ5T25TdGFjayhwYXJhbSkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgQzJDb21wSW50ZlRlc3Q6OnF1ZXJ5UGFyYW1Bc0V4cGVjdGVkKGNvbnN0IFQgJmV4cGVjdGVkKSB7CisgICAgLy8gVE9ETyhoaXJvaCk6IERvbid0IGNyZWF0ZSBwYXJhbSBvbiBzdGFjayBhbmQgY2FsbCBxdWVyeU9uU3RhY2sgZm9yIGZsZXggcGFyYW1zLgorICAgIC8vIE5vdGUgdGhhdCBhbGwgdGhlIGN1cnJlbnQgc3VwcG9ydGVkIHBhcmFtZXRlcnMgYXJlIG5vbi1mbGV4IHBhcmFtcy4KKyAgICBUIHN0YWNrOworICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiBwSGVhcCA9IG1ha2VQYXJhbTxUPigpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gaGVhcFBhcmFtczsKKworICAgIEFTU0VSVF9FUShDMl9PSywgcXVlcnlPblN0YWNrKCZzdGFjaykpOworCisgICAgLy8gfHN0YWNrfCBpcyBhIHBhcmFtZXRlciB2YWx1ZS4gVGhlIHBhcmFtZXRlciBzaXplIHNob3VsZG4ndCBiZSAwLgorICAgIEVYUEVDVF9ORSgwdSwgc3RhY2suc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoc3RhY2ssIGV4cGVjdGVkKTsKKworICAgIEFTU0VSVF9FUShDMl9PSywgcXVlcnlPbkhlYXAoKnBIZWFwLCAmaGVhcFBhcmFtcykpOworCisgICAgLy8gfCpoZWFwUGFyYW1zWzBdfCBpcyBhIHBhcmFtZXRlciB2YWx1ZS4gVGhlIHNpemUgb2YgfGhlYXBQYXJhbXN8IGhhcyB0byBiZSBvbmUuCisgICAgQVNTRVJUX0VRKDF1LCBoZWFwUGFyYW1zLnNpemUoKSk7CisgICAgRVhQRUNUX1RSVUUoaGVhcFBhcmFtc1swXSk7CisgICAgRVhQRUNUX0VRKCpoZWFwUGFyYW1zWzBdLCBleHBlY3RlZCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIEMyQ29tcEludGZUZXN0OjpxdWVyeVN1cHBvcnRlZFBhcmFtKCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiBwYXJhbSA9IG1ha2VQYXJhbTxUPigpOworICAgIC8vIFRoZSBjdXJyZW50IHBhcmFtZXRlcidzIHZhbHVlIGlzIGFjcXVpcmVkIGJ5IGdldFZhbHVlKCksIHdoaWNoIHNob3VsZCBiZSBzdWNjZWVkZWQuCisgICAgZ2V0VmFsdWUocGFyYW0uZ2V0KCkpOworICAgIHF1ZXJ5UGFyYW1Bc0V4cGVjdGVkKCpwYXJhbSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIEMyQ29tcEludGZUZXN0OjpxdWVyeVVuc3VwcG9ydGVkUGFyYW0oKSB7CisgICAgLy8gVE9ETyhoaXJvaCk6IERvbid0IGNyZWF0ZSBwYXJhbSBvbiBzdGFjayBhbmQgY2FsbCBxdWVyeU9uU3RhY2sgZm9yIGZsZXggcGFyYW1zLgorICAgIC8vIE5vdGUgdGhhdCBhbGwgdGhlIGN1cnJlbnQgc3VwcG9ydGVkIHBhcmFtZXRlcnMgYXJlIG5vbi1mbGV4IHBhcmFtcy4KKyAgICBUIHN0YWNrOworICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiBwSGVhcCA9IG1ha2VQYXJhbTxUPigpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gaGVhcFBhcmFtczsKKyAgICAvLyBJZiBhIGNvbXBvbmVudCBkb2Vzbid0IGhhdmUgdGhlIHBhcmFtZXRlciwgcXVlcnlPblN0YWNrKCkgYW5kIHF1ZXJ5T25IZWFwKCkKKyAgICAvLyBzaG91bGQgcmV0dXJuIEMyX0JBRF9JTkRFWC4KKyAgICBBU1NFUlRfRVEoQzJfQkFEX0lOREVYLCBxdWVyeU9uU3RhY2soJnN0YWNrKSk7CisgICAgRVhQRUNUX0ZBTFNFKHN0YWNrKTsKKyAgICBBU1NFUlRfRVEoQzJfQkFEX0lOREVYLCBxdWVyeU9uSGVhcCgqcEhlYXAsICZoZWFwUGFyYW1zKSk7CisgICAgRVhQRUNUX0VRKDB1LCBoZWFwUGFyYW1zLnNpemUoKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYzJfc3RhdHVzX3QgQzJDb21wSW50ZlRlc3Q6OmNvbmZpZygKKyAgICAgICAgVCAqY29uc3QgcCwgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+ICpjb25zdCBmYWlsdXJlcykgeworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBwYXJhbXN7cH07CisgICAgcmV0dXJuIG1JbnRmLT5jb25maWdfdmIocGFyYW1zLCBDMl9ET05UX0JMT0NLLCBmYWlsdXJlcyk7Cit9CisKKy8vIENyZWF0ZSBhIG5ldyBwYXJhbWV0ZXIgY29waWVkIGZyb20gfHB8LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0ZDo6dW5pcXVlX3B0cjxUPiBtYWtlUGFyYW1Gcm9tKGNvbnN0IFQgJnApIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gcmV0UCA9IG1ha2VQYXJhbTxUPigpOworICAgIEVYUEVDVF9UUlVFKHJldFAtPnVwZGF0ZUZyb20ocCkpOworICAgIEVYUEVDVF9UUlVFKG1lbWNtcChyZXRQLmdldCgpLCAmcCwgc2l6ZW9mKFQpKSA9PSAwKTsKKyAgICByZXR1cm4gcmV0UDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIEMyQ29tcEludGZUZXN0Ojpjb25maWdSZWFkT25seVBhcmFtKGNvbnN0IFQgJm5ld1BhcmFtKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPFQ+IHAgPSBtYWtlUGFyYW1Gcm9tKG5ld1BhcmFtKTsKKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBwYXJhbXN7cC5nZXQoKX07CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworCisgICAgLy8gY29uZmlnX3ZiIHNob3VsZCBiZSBmYWlsZWQgYmVjYXVzZSBhIHBhcmFtZXRlciBpcyByZWFkLW9ubHkuCisgICAgQVNTRVJUX0VRKEMyX0JBRF9WQUxVRSwgbUludGYtPmNvbmZpZ192YihwYXJhbXMsIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcykpOworICAgIEFTU0VSVF9FUSgxdSwgZmFpbHVyZXMuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoQzJTZXR0aW5nUmVzdWx0OjpSRUFEX09OTFksIGZhaWx1cmVzWzBdLT5mYWlsdXJlKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIEMyQ29tcEludGZUZXN0Ojpjb25maWdXcml0YWJsZVBhcmFtVmFsaWRWYWx1ZShjb25zdCBUICZuZXdQYXJhbSwgYzJfc3RhdHVzX3QgKmNvbmZpZ1Jlc3VsdCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiBwID0gbWFrZVBhcmFtRnJvbShuZXdQYXJhbSk7CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gcGFyYW1ze3AuZ2V0KCl9OworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAvLyBJbiBtb3N0IGNhc2VzLCBjb25maWdfdmIgcmV0dXJuIEMyX09LIGFuZCB0aGUgcGFyYW1ldGVyJ3MgdmFsdWUgc2hvdWxkIGJlIGNoYW5nZWQKKyAgICAvLyB0byB8bmV3UGFyYW18LCB3aGljaCBpcyBjb25maXJtZWQgaW4gYSBjYWxsZXIgb2YgY29uZmlnV3JpdGFibGVQYXJhbVZhbHVlVmFsdWUoKS4KKyAgICAvLyBIb3dldmVyLCB0aGlzIGNhbiByZXR1cm4gfn5+fiBhbmQgdGhlIHBhcmFtZXRlcidzIHZhbHVlcyBpcyBub3QgY2hhbmdlZCwKKyAgICAvLyBiZWNhdXNlIHRoZXJlIG1heSBiZSBkZXBlbmRlbnQgbGltaXRhdGlvbnMgYmV0d2VlbiBmaWVsZHMgb3IgYmV0d2VlbiBwYXJhbWV0ZXJzLgorICAgIC8vIFRPRE8oaGlyb2gpOiBJIGhhdmUgdG8gZmlsbCB0aGUgcmV0dXJuIHZhbHVlLiBDb21tZW50cyBpbiBDMkNvbXBvbmVudC5oIGRvZXNuJ3QgbWVudGlvbgorICAgIC8vIGFib3V0IHRoZSByZXR1cm4gdmFsdWUgd2hlbiBjb25mbGljdCBoYXBwZW5zLiBJIHNldCBDMl9CQURfVkFMVUUgdG8gaXQgdGVtcG9yYXJpbHkgbm93LgorICAgIGMyX3N0YXR1c190IHN0Q29uZmlnID0gbUludGYtPmNvbmZpZ192YihwYXJhbXMsIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgaWYgKHN0Q29uZmlnID09IEMyX09LKSB7CisgICAgICAgIEVYUEVDVF9FUSgwdSwgZmFpbHVyZXMuc2l6ZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfRVEoQzJfQkFEX1ZBTFVFLCBzdENvbmZpZyk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgZmFpbHVyZXMuc2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyU2V0dGluZ1Jlc3VsdDo6Q09ORkxJQ1QsIGZhaWx1cmVzWzBdLT5mYWlsdXJlKTsKKyAgICB9CisgICAgKmNvbmZpZ1Jlc3VsdCA9IHN0Q29uZmlnOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgQzJDb21wSW50ZlRlc3Q6OmNvbmZpZ1dyaXRhYmxlUGFyYW1JbnZhbGlkVmFsdWUoY29uc3QgVCAmbmV3UGFyYW0pIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gcCA9IG1ha2VQYXJhbUZyb20obmV3UGFyYW0pOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtc3twLmdldCgpfTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgLy8gQWx0aG91Z2ggYSBwYXJhbWV0ZXIgaXMgd3JpdGFibGUsIGNvbmZpZ192YiBzaG91bGQgYmUgZmFpbGVkLAorICAgIC8vIGJlY2F1c2UgYSBuZXcgdmFsdWUgaXMgaW52YWxpZC4KKyAgICBBU1NFUlRfRVEoQzJfQkFEX1ZBTFVFLCBtSW50Zi0+Y29uZmlnX3ZiKHBhcmFtcywgQzJfRE9OVF9CTE9DSywgJmZhaWx1cmVzKSk7CisgICAgQVNTRVJUX0VRKDF1LCBmYWlsdXJlcy5zaXplKCkpOworICAgIEVYUEVDVF9FUShDMlNldHRpbmdSZXN1bHQ6OkJBRF9WQUxVRSwgZmFpbHVyZXNbMF0tPmZhaWx1cmUpOworfQorCisvLyBUaGVyZSBpcyBvbmx5IHVzZWQgZW51bSB0eXBlIGZvciB0aGUgZmllbGQgdHlwZSwgdGhhdCBpcyBDMkRvbWFpbktpbmQuCisvLyBJZiBhbm90aGVyIGZpZWxkIHR5cGUgaXMgYWRkZWQsIGl0IGlzIG5lY2Vzc2FyeSB0byBhZGQgZnVuY3Rpb24gZm9yIHRoYXQuCit0ZW1wbGF0ZSA8Pgordm9pZCBDMkNvbXBJbnRmVGVzdDo6Z2V0VGVzdFZhbHVlcygKKyAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsaWRWYWx1ZUluZm9zLAorICAgICAgICBzdGQ6OnZlY3RvcjxDMkRvbWFpbktpbmQ+ICpjb25zdCB2YWxpZFZhbHVlcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJEb21haW5LaW5kPiAqY29uc3QgaW52YWxpZFZhbHVlcykgeworICAgIFVOVVNFRCh2YWxpZFZhbHVlSW5mb3MpOworICAgIHZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soQzJEb21haW5WaWRlbyk7CisgICAgdmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhDMkRvbWFpbkF1ZGlvKTsKKyAgICB2YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKEMyRG9tYWluT3RoZXIpOworCisgICAgLy8gVGhlcmUgaXMgbm8gaW52YWxpZCB2YWx1ZS4KKyAgICBVTlVTRUQoaW52YWxpZFZhbHVlcyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBURmllbGQ+Cit2b2lkIEMyQ29tcEludGZUZXN0OjpnZXRUZXN0VmFsdWVzKAorICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWxpZFZhbHVlSW5mb3MsCisgICAgICAgIHN0ZDo6dmVjdG9yPFRGaWVsZD4gKmNvbnN0IHZhbGlkVmFsdWVzLAorICAgICAgICBzdGQ6OnZlY3RvcjxURmllbGQ+ICpjb25zdCBpbnZhbGlkVmFsdWVzKSB7CisgICAgdXNpbmcgVFN0b3JhZ2UgPSB0eXBlbmFtZSBfYzJfcmVkdWNlX2VudW1fdG9fdW5kZXJseWluZ190eXBlPFRGaWVsZD46OnR5cGU7CisKKyAgICAvLyBUaGUgc3VwcG9ydGVkIHZhbHVlcyBhcmUgcmVwcmVzZW50ZWQgYnkgQzJWYWx1ZXMuIEMyVmFsdWU6OlByaW1pdGl2ZSBuZWVkcyB0bworICAgIC8vIGJlIHRyYW5zZm9ybWVkIHRvIGEgcHJpbWl0aXZlIHZhbHVlLiBUaGlzIGZ1bmN0aW9uIGlzIG9uZSB0byBkbyB0aGF0LgorICAgIGF1dG8gcHJpbTJWYWx1ZSA9IFtdKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcHJpbSkgLT4gVEZpZWxkIHsKKyAgICAgICAgcmV0dXJuIChURmllbGQpcHJpbS5yZWY8VFN0b3JhZ2U+KCk7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPFRTdG9yYWdlLCBpbnQzMl90Pjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VFN0b3JhZ2UsIHVpbnQzMl90Pjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VFN0b3JhZ2UsIGludDY0X3Q+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxUU3RvcmFnZSwgdWludDY0X3Q+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxUU3RvcmFnZSwgZmxvYXQ+Ojp2YWx1ZSwgIkludmFsaWQgVEZpZWxkIHR5cGUuIik7CisgICAgfTsKKworICAgIC8vIFRoZSBzaXplIG9mIHZhbGlkVmFsdWVJbmZvcyBpcyBvbmUuCisgICAgY29uc3QgYXV0byAmYzJGU1YgPSB2YWxpZFZhbHVlSW5mb3M7CisKKyAgICBzd2l0Y2ggKGMyRlNWLnR5cGUpIHsKKyAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnR5cGVfdDo6RU1QVFk6IHsKKyAgICAgICAgaW52YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKFRGaWVsZCgwKSk7CisgICAgICAgIC8vIFRPRE8oaGlyb2gpIDogU2hvdWxkIG90aGVyIGludmFsaWQgdmFsdWVzIGJlIHRlc3RlZD8KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6dHlwZV90OjpSQU5HRTogeworICAgICAgICBjb25zdCBhdXRvICZyYW5nZSA9IGMyRlNWLnJhbmdlOworICAgICAgICBhdXRvIHJtaW4gPSBwcmltMlZhbHVlKHJhbmdlLm1pbik7CisgICAgICAgIGF1dG8gcm1heCA9IHByaW0yVmFsdWUocmFuZ2UubWF4KTsKKyAgICAgICAgYXV0byByc3RlcCA9IHByaW0yVmFsdWUocmFuZ2Uuc3RlcCk7CisKKyAgICAgICAgQVNTRVJUX0xFKHJtaW4sIHJtYXgpOworCisgICAgICAgIGlmIChyc3RlcCAhPSAwKSB7CisgICAgICAgICAgICAvLyBJbmNyZWFzZSBsaW5lYXIKKyAgICAgICAgICAgIGZvciAoYXV0byB2ID0gcm1pbjsgdiA8PSBybWF4OyB2ID0gVEZpZWxkKHYgKyByc3RlcCkpIHsKKyAgICAgICAgICAgICAgICB2YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKHYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJtaW4gPiBzdGQ6Om51bWVyaWNfbGltaXRzPFRGaWVsZD46Om1pbigpKSB7CisgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKFRGaWVsZChybWluIC0gMSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJtYXggPCBzdGQ6Om51bWVyaWNfbGltaXRzPFRGaWVsZD46Om1heCgpKSB7CisgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKFRGaWVsZChybWF4ICsgMSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IE4gPSB2YWxpZFZhbHVlcy0+c2l6ZSgpOworICAgICAgICAgICAgaWYgKE4gPj0gMikgeworICAgICAgICAgICAgICAgIGlmIChzdGQ6OmlzX3NhbWU8VEZpZWxkLCBmbG9hdD46OnZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQoKHZhbGlkVmFsdWVzLT5hdCgwKSArIHZhbGlkVmFsdWVzLT5hdCgxKSkgLyAyKSk7CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQoKHZhbGlkVmFsdWVzLT5hdChOIC0gMikgKyB2YWxpZFZhbHVlcy0+YXQoTiAtIDEpKSAvIDIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAocnN0ZXAgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKHZhbGlkVmFsdWVzLT5hdCgwKSArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQodmFsaWRWYWx1ZXMtPmF0KE4gLSAxKSAtIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRoZXJlIHNob3VsZCBiZSB0d28gY2FzZXMsIGV4Y2VwdCBsaW5lYXIgY2FzZS4KKyAgICAgICAgICAgIC8vIDEuIGludGVnZXIgZ2VvbWV0cmljIGNhc2UKKyAgICAgICAgICAgIC8vIDIuIGZsb2F0IGdlb21ldHJpYyBjYXNlCisKKyAgICAgICAgICAgIGF1dG8gbnVtID0gcHJpbTJWYWx1ZShyYW5nZS5udW0pOworICAgICAgICAgICAgYXV0byBkZW5vbSA9IHByaW0yVmFsdWUocmFuZ2UuZGVub20pOworCisgICAgICAgICAgICAvLyBJZiBib3RoIHJhbmdlLm51bSBhbmQgcmFuZ2UuZGVub20gYXJlIDEgYW5kIHN0ZXAgaXMgMCwgd2Ugc2hvdWxkIHVzZQorICAgICAgICAgICAgLy8gVkFMVUVTLCBzaG91bGRuJ3Qgd2U/CisgICAgICAgICAgICBBU1NFUlRfRkFMU0UobnVtID09IDEgJiYgZGVub20gPT0gMSk7CisKKyAgICAgICAgICAgIC8vIChudW0gLyBkZW5vbSkgaXMgbm90IGxlc3MgdGhhbiAxLgorICAgICAgICAgICAgQVNTRVJUX0ZBTFNFKGRlbm9tID09IDApOworICAgICAgICAgICAgQVNTRVJUX0xFKGRlbm9tLCBudW0pOworICAgICAgICAgICAgZm9yIChhdXRvIHYgPSBybWluOyB2IDw9IHJtYXg7IHYgPSBURmllbGQodiAqIG51bSAvIGRlbm9tKSkgeworICAgICAgICAgICAgICAgIHZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2sodik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChybWluID4gc3RkOjpudW1lcmljX2xpbWl0czxURmllbGQ+OjptaW4oKSkgeworICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQocm1pbiAtIDEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChybWF4IDwgc3RkOjpudW1lcmljX2xpbWl0czxURmllbGQ+OjptYXgoKSkgeworICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQocm1heCArIDEpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IE4gPSB2YWxpZFZhbHVlcy0+c2l6ZSgpOworICAgICAgICAgICAgaWYgKE4gPj0gMikgeworICAgICAgICAgICAgICAgIGlmIChzdGQ6OmlzX3NhbWU8VEZpZWxkLCBmbG9hdD46OnZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQoKHZhbGlkVmFsdWVzLT5hdCgwKSArIHZhbGlkVmFsdWVzLT5hdCgxKSkgLyAyKSk7CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQoKHZhbGlkVmFsdWVzLT5hdChOIC0gMikgKyB2YWxpZFZhbHVlcy0+YXQoTiAtIDEpKSAvIDIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRWYWx1ZXMtPmF0KDEpIC0gdmFsaWRWYWx1ZXMtPmF0KDApID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKFRGaWVsZCh2YWxpZFZhbHVlcy0+YXQoMCkgKyAxKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkVmFsdWVzLT5hdChOIC0gMSkgLSB2YWxpZFZhbHVlcy0+YXQoTiAtIDIpID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKFRGaWVsZCh2YWxpZFZhbHVlcy0+YXQoTiAtIDEpIC0gMSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnR5cGVfdDo6VkFMVUVTOiB7CisgICAgICAgIGZvciAoY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZwcmltIDogYzJGU1YudmFsdWVzKSB7CisgICAgICAgICAgICB2YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKHByaW0yVmFsdWUocHJpbSkpOworICAgICAgICB9CisgICAgICAgIGF1dG8gbWludiA9ICpzdGQ6Om1pbl9lbGVtZW50KHZhbGlkVmFsdWVzLT5iZWdpbigpLCB2YWxpZFZhbHVlcy0+ZW5kKCkpOworICAgICAgICBhdXRvIG1heHYgPSAqc3RkOjptYXhfZWxlbWVudCh2YWxpZFZhbHVlcy0+YmVnaW4oKSwgdmFsaWRWYWx1ZXMtPmVuZCgpKTsKKyAgICAgICAgaWYgKG1pbnYgLSAxID4gc3RkOjpudW1lcmljX2xpbWl0czxURmllbGQ+OjptaW4oKSkgeworICAgICAgICAgICAgaW52YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKFRGaWVsZChtaW52IC0gMSkpOworICAgICAgICB9CisgICAgICAgIGlmIChtYXh2ICsgMSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8VEZpZWxkPjo6bWF4KCkpIHsKKyAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQobWF4diArIDEpKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjp0eXBlX3Q6OkZMQUdTOiB7CisgICAgICAgIC8vIFRPRE8oaGlyb2gpIDogSW1wbGVtZW50IHRoZSBjYXNlIHRoYXQgcGFyYW0udHlwZSBpcyBGTEFHUy4KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIEMyQ29tcEludGZUZXN0Ojp0ZXN0UmVhZE9ubHlQYXJhbShjb25zdCBUICZwcmVQYXJhbSwgY29uc3QgVCAmbmV3UGFyYW0pIHsKKyAgICBUUkFDRURfRkFJTFVSRShjb25maWdSZWFkT25seVBhcmFtKG5ld1BhcmFtKSk7CisgICAgLy8gUGFyYW1ldGVyIHZhbHVlIG11c3Qgbm90IGJlIGNoYW5nZWQKKyAgICBUUkFDRURfRkFJTFVSRShxdWVyeVBhcmFtQXNFeHBlY3RlZChwcmVQYXJhbSkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVFBhcmFtLCB0eXBlbmFtZSBUUmVhbEZpZWxkLCB0eXBlbmFtZSBURmllbGQ+Cit2b2lkIEMyQ29tcEludGZUZXN0Ojp0ZXN0V3JpdGFibGVQYXJhbSgKKyAgICAgICAgVFBhcmFtICpjb25zdCBwYXJhbSwgVFJlYWxGaWVsZCAqY29uc3Qgd3JpdGFibGVGaWVsZCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VEZpZWxkPiAmdmFsaWRWYWx1ZXMsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFRGaWVsZD4gJmludmFsaWRWYWx1ZXMpIHsKKyAgICBjMl9zdGF0dXNfdCBzdENvbmZpZzsKKworICAgIC8vIEdldCB0aGUgcGFyYW1ldGVyJ3MgdmFsdWUgaW4gdGhlIGJlZ2lubmluZyBpbiBvcmRlciB0byByZXNldCB0aGUgdmFsdWUgYXQgdGhlIGVuZC4KKyAgICBUUkFDRURfRkFJTFVSRShnZXRWYWx1ZShwYXJhbSkpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxUUGFyYW0+IGRlZmF1bHRQYXJhbSA9IG1ha2VQYXJhbUZyb20oKnBhcmFtKTsKKworICAgIC8vIFRlc3QgdmFsaWQgdmFsdWVzCisgICAgZm9yIChjb25zdCBhdXRvICZ2YWwgOiB2YWxpZFZhbHVlcykgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8VFBhcmFtPiBwcmVQYXJhbSA9IG1ha2VQYXJhbUZyb20oKnBhcmFtKTsKKworICAgICAgICAvLyBQYXJhbSBpcyB0cnkgdG8gYmUgY2hhbmdlZAorICAgICAgICAqd3JpdGFibGVGaWVsZCA9IHZhbDsKKyAgICAgICAgVFJBQ0VEX0ZBSUxVUkUoY29uZmlnV3JpdGFibGVQYXJhbVZhbGlkVmFsdWUoKnBhcmFtLCAmc3RDb25maWcpKTsKKyAgICAgICAgaWYgKHN0Q29uZmlnID09IEMyX09LKSB7CisgICAgICAgICAgICBUUkFDRURfRkFJTFVSRShxdWVyeVBhcmFtQXNFeHBlY3RlZCgqcGFyYW0pKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFBhcmFtIGlzIHVuY2hhbmdlZCBiZWNhdXNlIGEgZmllbGQgdmFsdWUgY29uZmxpY3RzIHdpdGggb3RoZXIgZmllbGQgb3IgcGFyYW1ldGVyLgorICAgICAgICAgICAgVFJBQ0VEX0ZBSUxVUkUocXVlcnlQYXJhbUFzRXhwZWN0ZWQoKnByZVBhcmFtKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTdG9yZSB0aGUgY3VycmVudCBwYXJhbWV0ZXIgaW4gb3JkZXIgdG8gdGVzdCB8cGFyYW18IGlzIHVuY2hhbmdlZAorICAgIC8vIGFmdGVyIHRyeWluZyB0byB3cml0ZSBhbiBpbnZhbGlkIHZhbHVlLgorICAgIHN0ZDo6dW5pcXVlX3B0cjxUUGFyYW0+IGxhc3RWYWxpZFBhcmFtID0gbWFrZVBhcmFtRnJvbSgqcGFyYW0pOworCisgICAgLy8gVGVzdCBpbnZhbGlkIHZhbHVlcworICAgIGZvciAoY29uc3QgYXV0byAmdmFsIDogaW52YWxpZFZhbHVlcykgeworICAgICAgICAvLyBQYXJhbSBpcyBjaGFuZ2VkCisgICAgICAgICp3cml0YWJsZUZpZWxkID0gdmFsOworICAgICAgICBUUkFDRURfRkFJTFVSRShjb25maWdXcml0YWJsZVBhcmFtSW52YWxpZFZhbHVlKCpwYXJhbSkpOworICAgICAgICBUUkFDRURfRkFJTFVSRShxdWVyeVBhcmFtQXNFeHBlY3RlZCgqbGFzdFZhbGlkUGFyYW0pKTsKKyAgICB9CisgICAgLy8gUmVzZXQgdGhlIHBhcmFtZXRlciBieSBjb25maWcoKS4KKyAgICBUUkFDRURfRkFJTFVSRShjb25maWdXcml0YWJsZVBhcmFtVmFsaWRWYWx1ZSgqZGVmYXVsdFBhcmFtLCAmc3RDb25maWcpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgQzJDb21wSW50ZlRlc3Q6OnRlc3RVbnN1cHBvcnRlZFBhcmFtKCkgeworICAgIFRSQUNFRF9GQUlMVVJFKHF1ZXJ5VW5zdXBwb3J0ZWRQYXJhbTxUPigpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgQzJDb21wSW50ZlRlc3Q6OnRlc3RTdXBwb3J0ZWRQYXJhbSgpIHsKKyAgICBUUkFDRURfRkFJTFVSRShxdWVyeVN1cHBvcnRlZFBhcmFtPFQ+KCkpOworfQorCitib29sIGlzU3VwcG9ydGVkUGFyYW0oCisgICAgICAgIGNvbnN0IEMyUGFyYW0gJnBhcmFtLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAmc1BhcmFtcykgeworICAgIGZvciAoY29uc3QgYXV0byAmcGQgOiBzUGFyYW1zKSB7CisgICAgICAgIGlmIChwYXJhbS50eXBlKCkgPT0gcGQtPmluZGV4KCkudHlwZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBDMkNvbXBJbnRmVGVzdDo6Y2hlY2tQYXJhbVBlcm1pc3Npb24oCisgICAgaW50ICpjb25zdCByZXN1bHQsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gJnN1cHBvcnRlZFBhcmFtcykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiBwYXJhbSA9IG1ha2VQYXJhbTxUPigpOworCisgICAgaWYgKCFpc1N1cHBvcnRlZFBhcmFtKCpwYXJhbSwgc3VwcG9ydGVkUGFyYW1zKSkgeworICAgICAgICAvLyBJZiBhIHBhcmFtZXRlciBpc24ndCBzdXBwb3J0ZWQsIGl0IGp1c3QgZmluaXNoIGFmdGVyIGNhbGxpbmcgdGVzdFVuc3VwcG9ydGVkUGFyYW0oKS4KKyAgICAgICAgdGVzdFVuc3VwcG9ydGVkUGFyYW08VD4oKTsKKyAgICAgICAgKnJlc3VsdCA9IFBhcmFtUGVybWlzc2lvbjo6VU5TVVBQT1JURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0ZXN0U3VwcG9ydGVkUGFyYW08VD4oKTsKKworICAgIFRSQUNFRF9GQUlMVVJFKGdldFZhbHVlKHBhcmFtLmdldCgpKSk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgIC8vIENvbmZpZyBkb2VzIG5vdCBjaGFuZ2UgdGhlIHBhcmFtZXRlciwgYmVjYXVzZSBwYXJhbSBpcyB0aGUgcHJlc2VudCBwYXJhbS4KKyAgICAvLyBUaGlzIGNvbmZpZyBpcyBleGVjdXRlZCB0byBmaW5kIG91dCBpZiBhIHBhcmFtZXRlciBpcyByZWFkLW9ubHkgb3Igd3JpdGFibGUuCisgICAgYzJfc3RhdHVzX3Qgc3RTdGFjayA9IGNvbmZpZyhwYXJhbS5nZXQoKSwgJmZhaWx1cmVzKTsKKyAgICBpZiAoc3RTdGFjayA9PSBDMl9CQURfVkFMVUUpIHsKKyAgICAgICAgLy8gUmVhZC1vbmx5CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiBuZXdQYXJhbSA9IG1ha2VQYXJhbTxUPigpOworICAgICAgICB0ZXN0UmVhZE9ubHlQYXJhbSgqcGFyYW0sICpuZXdQYXJhbSk7CisgICAgICAgICpyZXN1bHQgPSBQYXJhbVBlcm1pc3Npb246OlJFQURPTkxZOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFdyaXRhYmxlCisgICAgICAgIEVYUEVDVF9FUShzdFN0YWNrLCBDMl9PSyk7CisgICAgICAgICpyZXN1bHQgPSBQYXJhbVBlcm1pc3Npb246OldSSVRBQkxFOworICAgIH0KK30KKwordm9pZCBDMkNvbXBJbnRmVGVzdDo6b3V0cHV0UmVzdWx0cyhjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwYXJhbXNbM107CisgICAgZm9yIChjb25zdCBhdXRvICZ0ZXN0SW5mbyA6IG1QYXJhbVJlc3VsdHMpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IHRlc3RJbmZvLnJlc3VsdDsKKyAgICAgICAgQVNTRVJUX1RSVUUoMCA8PSByZXN1bHQgJiYgcmVzdWx0IDw9IDIpOworICAgICAgICBwYXJhbXNbcmVzdWx0XS5lbXBsYWNlX2JhY2sodGVzdEluZm8ubmFtZSk7CisgICAgfQorICAgIGNvbnN0IGNoYXIgKnJlc3VsdFN0cmluZ1tdID0geyJXcml0YWJsZSIsICJSZWFkLU9ubHkiLCAiVW5zdXBwb3J0ZWQifTsKKyAgICBwcmludGYoIlxuLS0tLVRFU1QgUkVTVUxUUyAoJXMpLS0tLVxuXG4iLCBuYW1lLmNfc3RyKCkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgIHByaW50ZigiWyAlcyBdXG4iLCByZXN1bHRTdHJpbmdbaV0pOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnQgOiBwYXJhbXNbaV0pIHsKKyAgICAgICAgICAgIHByaW50ZigiJXNcbiIsIHQuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgIH0KK30KKworI2RlZmluZSBURVNUX0dFTkVSQUxfV1JJVEFCTEVfRklFTEQoVFBhcmFtXywgZmllbGRfdHlwZV9uYW1lXywgZmllbGRfbmFtZV8pIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFRQYXJhbV8+IHBhcmFtID0gbWFrZVBhcmFtPFRQYXJhbV8+KCk7ICAgICAgICAgIFwKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiB2YWxpZFZhbHVlSW5mb3MgPSB7ICAgIFwKKyAgICAgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q3VycmVudCggICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgQzJQYXJhbUZpZWxkKHBhcmFtLmdldCgpLCAmZmllbGRfdHlwZV9uYW1lXzo6ZmllbGRfbmFtZV8pKSBcCisgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFTU0VSVF9FUShDMl9PSywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBtSW50Zi0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXNfdmIodmFsaWRWYWx1ZUluZm9zLCBDMl9ET05UX0JMT0NLKSk7ICAgICBcCisgICAgICAgIEFTU0VSVF9FUSgxdSwgdmFsaWRWYWx1ZUluZm9zLnNpemUoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0ZDo6dmVjdG9yPGRlY2x0eXBlKHBhcmFtLT5maWVsZF9uYW1lXyk+IHZhbGlkVmFsdWVzOyAgICAgICAgICBcCisgICAgICAgIHN0ZDo6dmVjdG9yPGRlY2x0eXBlKHBhcmFtLT5maWVsZF9uYW1lXyk+IGludmFsaWRWYWx1ZXM7ICAgICAgICBcCisgICAgICAgIGdldFRlc3RWYWx1ZXModmFsaWRWYWx1ZUluZm9zWzBdLnZhbHVlcywgJnZhbGlkVmFsdWVzLCAmaW52YWxpZFZhbHVlcyk7ICAgXAorICAgICAgICB0ZXN0V3JpdGFibGVQYXJhbShwYXJhbS5nZXQoKSwgJnBhcmFtLT5maWVsZF9uYW1lXywgdmFsaWRWYWx1ZXMsXAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgVEVTVF9WU1NUUlVDVF9XUklUQUJMRV9GSUVMRChUUGFyYW1fLCBmaWVsZF90eXBlX25hbWVfKSAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVEVTVF9HRU5FUkFMX1dSSVRBQkxFX0ZJRUxEKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8sIHdpZHRoKTsgIFwKKyAgICAgICAgVEVTVF9HRU5FUkFMX1dSSVRBQkxFX0ZJRUxEKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8sIGhlaWdodCk7IFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFRFU1RfVTMyX1dSSVRBQkxFX0ZJRUxEKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8pICAgICAgICAgICAgICBcCisgIFRFU1RfR0VORVJBTF9XUklUQUJMRV9GSUVMRChUUGFyYW1fLCBmaWVsZF90eXBlX25hbWVfLCB2YWx1ZSkKKworI2RlZmluZSBURVNUX0VOVU1fV1JJVEFCTEVfRklFTEQoVFBhcmFtXywgZmllbGRfdHlwZV9uYW1lXykgICAgICAgICAgICAgXAorICBURVNUX0dFTkVSQUxfV1JJVEFCTEVfRklFTEQoVFBhcmFtXywgZmllbGRfdHlwZV9uYW1lXywgdmFsdWUpCisKKy8vIFRPRE8oaGlyb2gpOiBTdXBwb3J0IHBhcmFtZXRlcnMgYmFzZWQgb24gY2hhcltdIGFuZCB1aW50MzJfdFtdLgorLy8jZGVmaW5lIFRFU1RfU1RSSU5HX1dSSVRBQkxFX0ZJRUxEKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8pCisvLyBURVNUX0dFTkVSQUxfV1JJVEFCTEVfRklFTEQoVFBhcmFtXywgZmllbGRfdHlwZV9uYW1lXywgbS52YWx1ZSkKKy8vI2RlZmluZSBURVNUX1UzMkFSUkFZX1dSSVRBQkxFX0ZJRUxEKFRwYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8pCisvLyBURVNUX0dFTkVSQUxfV1JJVEFCTEVfRklFTEQoVHBhcmFtXywgdWludDMyX3RbXSwgZmllbGRfdHlwZV9uYW1lXywgdmFsdWVzKQorCisjZGVmaW5lIEVBQ0hfVEVTVChUUGFyYW1fLCBmaWVsZF90eXBlX25hbWVfLCB0ZXN0X25hbWUpICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpbnQgcmVzdWx0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0aGlzLT5tQ3VycmVudFBhcmFtTmFtZSA9ICNUUGFyYW1fOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjaGVja1BhcmFtUGVybWlzc2lvbjxUUGFyYW1fPigmcmVzdWx0LCBzdXBwb3J0ZWRQYXJhbXMpOyAgICAgICAgICBcCisgICAgICBpZiAocmVzdWx0ID09IFBhcmFtUGVybWlzc2lvbjo6V1JJVEFCTEUpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgdGVzdF9uYW1lKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8pOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBtUGFyYW1SZXN1bHRzLmVtcGxhY2VfYmFjaygjVFBhcmFtXywgcmVzdWx0KTsgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIEVBQ0hfVEVTVF9TRUxGKHR5cGVfLCB0ZXN0X25hbWUpIEVBQ0hfVEVTVCh0eXBlXywgdHlwZV8sIHRlc3RfbmFtZSkKKyNkZWZpbmUgRUFDSF9URVNUX0lOUFVUKHR5cGVfLCB0ZXN0X25hbWUpIEVBQ0hfVEVTVCh0eXBlXzo6aW5wdXQsIHR5cGVfLCB0ZXN0X25hbWUpCisjZGVmaW5lIEVBQ0hfVEVTVF9PVVRQVVQodHlwZV8sIHRlc3RfbmFtZSkgRUFDSF9URVNUKHR5cGVfOjpvdXRwdXQsIHR5cGVfLCB0ZXN0X25hbWUpCit2b2lkIEMyQ29tcEludGZUZXN0Ojp0ZXN0TWFpbihzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmY29tcG9uZW50TmFtZSkgeworICAgIHNldENvbXBvbmVudChpbnRmKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+IHN1cHBvcnRlZFBhcmFtczsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIG1JbnRmLT5xdWVyeVN1cHBvcnRlZFBhcmFtc19uYigmc3VwcG9ydGVkUGFyYW1zKSk7CisKKyAgICBFQUNIX1RFU1RfU0VMRihDMkNvbXBvbmVudExhdGVuY3lJbmZvLCBURVNUX1UzMl9XUklUQUJMRV9GSUVMRCk7CisgICAgRUFDSF9URVNUX1NFTEYoQzJDb21wb25lbnRUZW1wb3JhbEluZm8sIFRFU1RfVTMyX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICBFQUNIX1RFU1RfSU5QVVQoQzJQb3J0TGF0ZW5jeUluZm8sIFRFU1RfVTMyX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICBFQUNIX1RFU1RfT1VUUFVUKEMyUG9ydExhdGVuY3lJbmZvLCBURVNUX1UzMl9XUklUQUJMRV9GSUVMRCk7CisgICAgRUFDSF9URVNUX0lOUFVUKEMyU3RyZWFtRm9ybWF0Q29uZmlnLCBURVNUX1UzMl9XUklUQUJMRV9GSUVMRCk7CisgICAgRUFDSF9URVNUX09VVFBVVChDMlN0cmVhbUZvcm1hdENvbmZpZywgVEVTVF9VMzJfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9JTlBVVChDMlBvcnRTdHJlYW1Db3VudENvbmZpZywgVEVTVF9VMzJfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9PVVRQVVQoQzJQb3J0U3RyZWFtQ291bnRDb25maWcsIFRFU1RfVTMyX1dSSVRBQkxFX0ZJRUxEKTsKKworICAgIEVBQ0hfVEVTVF9TRUxGKEMyQ29tcG9uZW50RG9tYWluSW5mbywgVEVTVF9FTlVNX1dSSVRBQkxFX0ZJRUxEKTsKKworICAgIC8vIFRPRE8oaGlyb2gpOiBTdXBwb3J0IHBhcmFtZXRlcnMgYmFzZWQgb24gdWludDMyX3RbXSBhbmQgY2hhcltdLgorICAgIC8vIEVBQ0hfVEVTVF9JTlBVVChDMlBvcnRNaW1lQ29uZmlnLCBURVNUX1NUUklOR19XUklUQUJMRV9GSUVMRCk7CisgICAgLy8gRUFDSF9URVNUX09VVFBVVChDMlBvcnRNaW1lQ29uZmlnLCBURVNUX1NUUklOR19XUklUQUJMRV9GSUVMRCk7CisgICAgLy8gRUFDSF9URVNUX0lOUFVUKEMyU3RyZWFtTWltZUNvbmZpZywgVEVTVF9TVFJJTkdfV1JJVEFCTEVfRklFTEQpOworICAgIC8vIEVBQ0hfVEVTVF9PVVRQVVQoQzJTdHJlYW1NaW1lQ29uZmlnLCBURVNUX1NUUklOR19XUklUQUJMRV9GSUVMRCk7CisKKyAgICAvLyBFQUNIX1RFU1RfU0VMRihDMlN1cHBvcnRlZFBhcmFtc0luZm8sIFRFU1RfVTMyQVJSQVlfV1JJVEFCTEVfRklFTEQpOworICAgIC8vIEVBQ0hfVEVTVF9TRUxGKEMyUmVxdWlyZWRQYXJhbXNJbmZvLCBURVNUX1UzMkFSUkFZX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICAvLyBFQUNIX1RFU1RfU0VMRihDMlJlYWRPbmx5UGFyYW1zSW5mbywgVEVTVF9VMzJBUlJBWV9XUklUQUJMRV9GSUVMRCk7CisgICAgLy8gRUFDSF9URVNUX1NFTEYoQzJSZXF1ZXN0ZWRJbmZvc0luZm8sIFRFU1RfVTMyQVJSQVlfV1JJVEFCTEVfRklFTEQpOworCisgICAgRUFDSF9URVNUX0lOUFVUKEMyVmlkZW9TaXplU3RyZWFtSW5mbywgVEVTVF9WU1NUUlVDVF9XUklUQUJMRV9GSUVMRCk7CisgICAgRUFDSF9URVNUX09VVFBVVChDMlZpZGVvU2l6ZVN0cmVhbUluZm8sIFRFU1RfVlNTVFJVQ1RfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9JTlBVVChDMlZpZGVvU2l6ZVN0cmVhbVR1bmluZywgVEVTVF9WU1NUUlVDVF9XUklUQUJMRV9GSUVMRCk7CisgICAgRUFDSF9URVNUX09VVFBVVChDMlZpZGVvU2l6ZVN0cmVhbVR1bmluZywgVEVTVF9WU1NUUlVDVF9XUklUQUJMRV9GSUVMRCk7CisgICAgRUFDSF9URVNUX0lOUFVUKEMyTWF4VmlkZW9TaXplSGludFBvcnRTZXR0aW5nLCBURVNUX1ZTU1RSVUNUX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICBFQUNIX1RFU1RfT1VUUFVUKEMyTWF4VmlkZW9TaXplSGludFBvcnRTZXR0aW5nLCBURVNUX1ZTU1RSVUNUX1dSSVRBQkxFX0ZJRUxEKTsKKworICAgIG91dHB1dFJlc3VsdHMoY29tcG9uZW50TmFtZSk7CisgICAgcmVzZXRSZXN1bHRzKCk7Cit9CisKK1RFU1RfRihDMkNvbXBJbnRmVGVzdCwgQzJWNEwyQ29kZWNJbnRmKSB7CisKKyAgICAvLyBSZWFkIGEgc2hhcmVkIG9iamVjdCBsaWJyYXJ5LgorICAgIHZvaWQqIGNvbXBMaWIgPSBkbG9wZW4oInN5c3RlbS9saWIvbGlidjRsMl9jb2RlYzIuc28iLCBSVExEX05PVyk7CisKKyAgICBpZiAoIWNvbXBMaWIpIHsKKyAgICAgICAgcHJpbnRmKCJDYW5ub3Qgb3BlbiBsaWJyYXJ5OiAlcy5cbiIsIGRsZXJyb3IoKSk7CisgICAgICAgIEZBSUwoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHR5cGVkZWYgQzJDb21wb25lbnRTdG9yZSogY3JlYXRlX3QoKTsKKyAgICBjcmVhdGVfdCogY3JlYXRlX3N0b3JlPSAoY3JlYXRlX3QqKSBkbHN5bShjb21wTGliLCAiY3JlYXRlX3N0b3JlIik7CisgICAgY29uc3QgY2hhciogZGxzeW1fZXJyb3IgPSBkbGVycm9yKCk7CisgICAgaWYgKGRsc3ltX2Vycm9yKSB7CisgICAgICAgIHByaW50ZigiQ2Fubm90IGxvYWQgc3ltYm9sIGNyZWF0ZTogJXMuXG4iLCBkbHN5bV9lcnJvcik7CisgICAgICAgIEZBSUwoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHR5cGVkZWYgdm9pZCBkZXN0cm95X3QoQzJDb21wb25lbnRTdG9yZSopOworICAgIGRlc3Ryb3lfdCogZGVzdHJveV9zdG9yZSA9IChkZXN0cm95X3QqKSBkbHN5bShjb21wTGliLCAiZGVzdHJveV9zdG9yZSIpOworICAgIGRsc3ltX2Vycm9yID0gZGxlcnJvcigpOworICAgIGlmIChkbHN5bV9lcnJvcikgeworICAgICAgICBwcmludGYoIkNhbm5vdCBsb2FkIHN5bWJvbCBkZXN0cm95OiAlcy5cbiIsIGRsc3ltX2Vycm9yKTsKKyAgICAgICAgRkFJTCgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IGNvbXBvbmVudFN0b3JlKGNyZWF0ZV9zdG9yZSgpLCBkZXN0cm95X3N0b3JlKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGNvbXBvbmVudEludGY7CisgICAgY29tcG9uZW50U3RvcmUtPmNyZWF0ZUludGVyZmFjZSgidjRsMi5kZWNvZGVyIiwgJmNvbXBvbmVudEludGYpOworICAgIGF1dG8gY29tcG9uZW50TmFtZSA9ICJDMlY0TDJDb2RlYyI7CisgICAgdGVzdE1haW4oY29tcG9uZW50SW50ZiwgY29tcG9uZW50TmFtZSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi90ZXN0cy9DMlBhcmFtX3Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0MyUGFyYW1fdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY0ZDRkMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMlBhcmFtX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMjUxNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlBhcmFtX3Rlc3QiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjZGVmaW5lIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXworI2luY2x1ZGUgPEMyUGFyYW1EZWYuaD4KKworI2luY2x1ZGUgPGxpc3Q+CisKK3ZvaWQgUHJpbnRUbyhjb25zdCBfQzJGaWVsZElkICZpZCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgKm9zIDw8ICJAIiA8PCBpZC5fbU9mZnNldCA8PCAiKyIgPDwgaWQuX21TaXplOworfQorCit2b2lkIFByaW50VG8oY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZkLCA6OnN0ZDo6b3N0cmVhbSAqb3MpIHsKKyAgICB1c2luZyBGRD1DMkZpZWxkRGVzY3JpcHRvcjsKKyAgICBzd2l0Y2ggKGZkLnR5cGUoKSkgeworICAgIGNhc2UgRkQ6OklOVDMyOiAqb3MgPDwgImkzMiI7IGJyZWFrOworICAgIGNhc2UgRkQ6OklOVDY0OiAqb3MgPDwgImk2NCI7IGJyZWFrOworICAgIGNhc2UgRkQ6OlVJTlQzMjogKm9zIDw8ICJ1MzIiOyBicmVhazsKKyAgICBjYXNlIEZEOjpVSU5UNjQ6ICpvcyA8PCAidTY0IjsgYnJlYWs7CisgICAgY2FzZSBGRDo6RkxPQVQ6ICpvcyA8PCAiZmxvYXQiOyBicmVhazsKKyAgICBjYXNlIEZEOjpTVFJJTkc6ICpvcyA8PCAiY2hhciI7IGJyZWFrOworICAgIGNhc2UgRkQ6OkJMT0I6ICpvcyA8PCAidTgiOyBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBpZiAoZmQudHlwZSgpICYgRkQ6OlNUUlVDVF9GTEFHKSB7CisgICAgICAgICAgICAqb3MgPDwgInN0cnVjdC0iIDw8IChmZC50eXBlKCkgJiB+RkQ6OlNUUlVDVF9GTEFHKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpvcyA8PCAidHlwZS0iIDw8IGZkLnR5cGUoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAqb3MgPDwgIiAiIDw8IGZkLm5hbWUoKTsKKyAgICBpZiAoZmQuZXh0ZW50KCkgPiAxKSB7CisgICAgICAgICpvcyA8PCAiWyIgPDwgZmQuZXh0ZW50KCkgPDwgIl0iOworICAgIH0gZWxzZSBpZiAoZmQuZXh0ZW50KCkgPT0gMCkgeworICAgICAgICAqb3MgPDwgIltdIjsKKyAgICB9CisgICAgKm9zIDw8ICIgKCI7CisgICAgUHJpbnRUbyhmZC5fbUZpZWxkSWQsIG9zKTsKKyAgICAqb3MgPDwgIioiIDw8IGZkLmV4dGVudCgpIDw8ICIpIjsKK30KKworZW51bSBDMlBhcmFtSW5kZXhUeXBlIDogQzJQYXJhbTo6dHlwZV9pbmRleF90IHsKKyAgICBrUGFyYW1JbmRleE51bWJlciwKKyAgICBrUGFyYW1JbmRleE51bWJlcnMsCisgICAga1BhcmFtSW5kZXhOdW1iZXIyLAorICAgIGtQYXJhbUluZGV4VmVuZG9yU3RhcnQgPSBDMlBhcmFtOjpUWVBFX0lOREVYX1ZFTkRPUl9TVEFSVCwKKyAgICBrUGFyYW1JbmRleFZlbmRvck51bWJlcnMsCit9OworCit2b2lkIGZmZmYoaW50KCopKGludCkpIHt9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNUUlVDVCBERUNMQVJBVElPTiBBTkQgREVTQ1JJUFRJT04gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwordHlwZWRlZiBDMkZpZWxkRGVzY3JpcHRvciBGRDsKKworY2xhc3MgQzJQYXJhbVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK307CisKK2NsYXNzIEMyUGFyYW1UZXN0X1BhcmFtRmllbGRMaXN0CisgICAgICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4+IHsKK307CisKK2VudW0geworICAgIGtQYXJhbUluZGV4U2l6ZSwKKyAgICBrUGFyYW1JbmRleFRlc3RBLAorICAgIGtQYXJhbUluZGV4VGVzdEIsCisgICAga1BhcmFtSW5kZXhUZXN0RmxleFMzMiwKKyAgICBrUGFyYW1JbmRleFRlc3RGbGV4RW5kUzMyLAorICAgIGtQYXJhbUluZGV4VGVzdEZsZXhTNjQsCisgICAga1BhcmFtSW5kZXhUZXN0RmxleEVuZFM2NCwKKyAgICBrUGFyYW1JbmRleFRlc3RGbGV4U2l6ZSwKKyAgICBrUGFyYW1JbmRleFRlc3RGbGV4RW5kU2l6ZSwKK307CisKK3N0cnVjdCBDMlNpemVTdHJ1Y3QgeworICAgIGludDMyX3Qgd2lkdGg7CisgICAgaW50MzJfdCBoZWlnaHQ7CisgICAgZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IGtQYXJhbUluZGV4U2l6ZSB9OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDw9IG5lZWRlZCBmb3IgQzJGaWVsZERlc2NyaXB0b3IKKyAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IF9GSUVMRF9MSVNUOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCk7ICAvLyA8PSBuZWVkZWQgZm9yIEMyRmllbGREZXNjcmlwdG9yCisgICAgY29uc3Qgc3RhdGljIEZEOjp0eXBlX3QgVFlQRSA9IChGRDo6dHlwZV90KShDT1JFX0lOREVYIHwgRkQ6OlNUUlVDVF9GTEFHKTsKK307CisKK0RFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKEMyU2l6ZVN0cnVjdCkKKworLy8gVGVzdCAxLiBkZWZpbmUgYSBzdHJ1Y3R1cmUgd2l0aG91dCBhbnkgaGVscGVyIG1ldGhvZHMKKworYm9vbCBvcGVyYXRvcj09KGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZhLCBjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmYikgeworICAgIHJldHVybiBhLnR5cGUoKSA9PSBiLnR5cGUoKQorICAgICAgICAgICAgJiYgYS5leHRlbnQoKSA9PSBiLmV4dGVudCgpCisgICAgICAgICAgICAmJiBhLm5hbWUoKSA9PSBiLm5hbWUoKQorICAgICAgICAgICAgJiYgYS5fbUZpZWxkSWQgPT0gYi5fbUZpZWxkSWQ7Cit9CisKK3N0cnVjdCBDMlRlc3RTdHJ1Y3RfQSB7CisgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICBpbnQ2NF90IHNpZ25lZDY0WzJdOworICAgIHVpbnQzMl90IHVuc2lnbmVkMzJbMV07CisgICAgdWludDY0X3QgdW5zaWduZWQ2NDsKKyAgICBmbG9hdCBmcDMyOworICAgIEMyU2l6ZVN0cnVjdCBzelszXTsKKyAgICB1aW50OF90IGJsb2JbMTAwXTsKKyAgICBjaGFyIHN0cmluZ1sxMDBdOworICAgIGJvb2wgeWVzTm9bMTAwXTsKKworICAgIGNvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gX0ZJRUxEX0xJU1Q7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBGaWVsZExpc3QoKTsKKyAgICAvLyBlbnVtIDogdWludDMyX3QgeyBDT1JFX0lOREVYID0ga1BhcmFtSW5kZXhUZXN0IH07CisgICAgLy8gdHlwZWRlZiBDMlRlc3RTdHJ1Y3RfQSBfdHlwZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfQTo6RmllbGRMaXN0KCkgeworICAgIHJldHVybiBfRklFTERfTElTVDsKK30KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfQTo6X0ZJRUxEX0xJU1QgPQorICAgIHsgeyBGRDo6SU5UMzIsICAgIDEsICJzMzIiLCAgIDAsIDQgfSwKKyAgICAgIHsgRkQ6OklOVDY0LCAgICAyLCAiczY0IiwgICA0LCA4IH0sCisgICAgICB7IEZEOjpVSU5UMzIsICAgMSwgInUzMiIsICAyMCwgNCB9LAorICAgICAgeyBGRDo6VUlOVDY0LCAgIDEsICJ1NjQiLCAgMjQsIDggfSwKKyAgICAgIHsgRkQ6OkZMT0FULCAgICAxLCAiZnAiLCAgIDMyLCA0IH0sCisgICAgICB7IEMyU2l6ZVN0cnVjdDo6VFlQRSwgMywgInNpemUiLCAzNiwgOCB9LAorICAgICAgeyBGRDo6QkxPQiwgICAxMDAsICJibG9iIiwgNjAsIDEgfSwKKyAgICAgIHsgRkQ6OlNUUklORywgMTAwLCAic3RyIiwgMTYwLCAxIH0sCisgICAgICB7IEZEOjpCTE9CLCAgIDEwMCwgInktbiIsIDI2MCwgMSB9IH07CisKK1RFU1RfUChDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgVmVyaWZ5U3RydWN0KSB7CisgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IEdldFBhcmFtKCksIGV4cGVjdGVkID0gQzJUZXN0U3RydWN0X0E6Ol9GSUVMRF9MSVNUOworCisgICAgLy8gdmVyaWZ5IGZpcnN0IGZpZWxkIGRlc2NyaXB0b3IKKyAgICBFWFBFQ1RfRVEoRkQ6OklOVDMyLCBmaWVsZHNbMF0udHlwZSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoInMzMiIsIGZpZWxkc1swXS5uYW1lKCkuY19zdHIoKSk7CisgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHNbMF0uZXh0ZW50KCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBmaWVsZHNbMF0uX21GaWVsZElkKTsKKworICAgIEVYUEVDVF9FUShleHBlY3RlZFswXSwgZmllbGRzWzBdKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbMV0sIGZpZWxkc1sxXSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkWzJdLCBmaWVsZHNbMl0pOworICAgIEVYUEVDVF9FUShleHBlY3RlZFszXSwgZmllbGRzWzNdKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbNF0sIGZpZWxkc1s0XSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkWzVdLCBmaWVsZHNbNV0pOworICAgIEVYUEVDVF9FUShleHBlY3RlZFs2XSwgZmllbGRzWzZdKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbN10sIGZpZWxkc1s3XSk7CisgICAgZm9yIChzaXplX3QgaSA9IDg7IGkgPCBmaWVsZHMuc2l6ZSgpICYmIGkgPCBleHBlY3RlZC5zaXplKCk7ICsraSkgeworICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbaV0sIGZpZWxkc1tpXSk7CisgICAgfQorfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChJbml0aWFsaXplckxpc3QsIEMyUGFyYW1UZXN0X1BhcmFtRmllbGRMaXN0LCA6OnRlc3Rpbmc6OlZhbHVlcyhDMlRlc3RTdHJ1Y3RfQTo6X0ZJRUxEX0xJU1QpKTsKKworLy8gZGVmaW5lIGZpZWxkcyB1c2luZyBDMkZpZWxkRGVzY3JpcHRvciBwb2ludGVyIGNvbnN0cnVjdG9yCitjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0FfRkRfUFRSX2ZpZWxkTGlzdCA9CisgICAgeyBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfQSopKG51bGxwdHIpKS0+c2lnbmVkMzIsICAgInMzMiIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0EqKShudWxscHRyKSktPnNpZ25lZDY0LCAgICJzNjQiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9BKikobnVsbHB0cikpLT51bnNpZ25lZDMyLCAidTMyIiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfQSopKG51bGxwdHIpKS0+dW5zaWduZWQ2NCwgInU2NCIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0EqKShudWxscHRyKSktPmZwMzIsICAgICAgImZwIiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfQSopKG51bGxwdHIpKS0+c3osICAgICAgICJzaXplIiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfQSopKG51bGxwdHIpKS0+YmxvYiwgICAgICAgImJsb2IiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9BKikobnVsbHB0cikpLT5zdHJpbmcsICAgICAic3RyIiksCisgICAgLy8gIEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9BKikobnVsbHB0cikpLT55ZXNObywgICAgICAieS1uIikKKyAgICB9OworCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChQb2ludGVyQ29uc3RydWN0b3IsIEMyUGFyYW1UZXN0X1BhcmFtRmllbGRMaXN0LCA6OnRlc3Rpbmc6OlZhbHVlcyhDMlRlc3RTdHJ1Y3RfQV9GRF9QVFJfZmllbGRMaXN0KSk7CisKKy8vIGRlZmluZSBmaWVsZHMgdXNpbmcgQzJGaWVsZERlc2NyaXB0b3IgbWVtYmVyLXBvaW50ZXIgY29uc3RydWN0b3IKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfQV9GRF9NRU1fUFRSX2ZpZWxkTGlzdCA9CisgICAgeyBDMkZpZWxkRGVzY3JpcHRvcigoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6c2lnbmVkMzIsICAgInMzMiIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnNpZ25lZDY0LCAgICJzNjQiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjp1bnNpZ25lZDMyLCAidTMyIiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6dW5zaWduZWQ2NCwgInU2NCIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OmZwMzIsICAgICAgImZwIiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6c3osICAgICAgICJzaXplIiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6YmxvYiwgICAgICAgImJsb2IiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpzdHJpbmcsICAgICAic3RyIiksCisgICAgLy8gIEMyRmllbGREZXNjcmlwdG9yKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjp5ZXNObywgICAgICAieS1uIikKKyAgICB9OworCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChNZW1iZXJQb2ludGVyQ29uc3RydWN0b3IsIEMyUGFyYW1UZXN0X1BhcmFtRmllbGRMaXN0LCA6OnRlc3Rpbmc6OlZhbHVlcyhDMlRlc3RTdHJ1Y3RfQV9GRF9NRU1fUFRSX2ZpZWxkTGlzdCkpOworCisvLyBUZXN0IDIuIGRlZmluZSBhIHN0cnVjdHVyZSB3aXRoIHR3by1zdGVwIGhlbHBlciBtZXRob2RzCisKK3N0cnVjdCBDMlRlc3RBU3RydWN0IHsKKyAgICBpbnQzMl90IHNpZ25lZDMyOworICAgIGludDY0X3Qgc2lnbmVkNjRbMl07CisgICAgdWludDMyX3QgdW5zaWduZWQzMlsxXTsKKyAgICB1aW50NjRfdCB1bnNpZ25lZDY0OworICAgIGZsb2F0IGZwMzI7CisgICAgQzJTaXplU3RydWN0IHN6WzNdOworICAgIHVpbnQ4X3QgYmxvYlsxMDBdOworICAgIGNoYXIgc3RyaW5nWzEwMF07CisgICAgYm9vbCB5ZXNOb1sxMDBdOworCitwcml2YXRlOiAvLyB0ZXN0IGFjY2VzcyBsZXZlbAorICAgIERFRklORV9DMlNUUlVDVChUZXN0QSkKK30gQzJfUEFDSzsKKworREVTQ1JJQkVfQzJTVFJVQ1QoVGVzdEEsIHsKKyAgICBDMkZJRUxEKHNpZ25lZDMyLCAiczMyIikKKyAgICBDMkZJRUxEKHNpZ25lZDY0LCAiczY0IikKKyAgICBDMkZJRUxEKHVuc2lnbmVkMzIsICJ1MzIiKQorICAgIEMyRklFTEQodW5zaWduZWQ2NCwgInU2NCIpCisgICAgQzJGSUVMRChmcDMyLCAiZnAiKQorICAgIEMyRklFTEQoc3osICJzaXplIikKKyAgICBDMkZJRUxEKGJsb2IsICJibG9iIikKKyAgICBDMkZJRUxEKHN0cmluZywgInN0ciIpCisgICAgLy8gQzJGSUVMRCh5ZXNObywgInktbiIpCit9KSAvLyA7IG9wdGlvbmFsCisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKERlc2NyaWJlU3RydWN0MlN0ZXAsIEMyUGFyYW1UZXN0X1BhcmFtRmllbGRMaXN0LCA6OnRlc3Rpbmc6OlZhbHVlcyhDMlRlc3RBU3RydWN0OjpGaWVsZExpc3QoKSkpOworCisvLyBUZXN0IDMuIGRlZmluZSBhIHN0cnVjdHVyZSB3aXRoIG9uZS1zdGVwIGhlbHBlciBtZXRob2QKKworc3RydWN0IEMyVGVzdEJTdHJ1Y3QgeworICAgIGludDMyX3Qgc2lnbmVkMzI7CisgICAgaW50NjRfdCBzaWduZWQ2NFsyXTsKKyAgICB1aW50MzJfdCB1bnNpZ25lZDMyWzFdOworICAgIHVpbnQ2NF90IHVuc2lnbmVkNjQ7CisgICAgZmxvYXQgZnAzMjsKKyAgICBDMlNpemVTdHJ1Y3Qgc3pbM107CisgICAgdWludDhfdCBibG9iWzEwMF07CisgICAgY2hhciBzdHJpbmdbMTAwXTsKKyAgICBib29sIHllc05vWzEwMF07CisKK3ByaXZhdGU6IC8vIHRlc3QgYWNjZXNzIGxldmVsCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChUZXN0QikKKworICAgIEMyRklFTEQoc2lnbmVkMzIsICJzMzIiKQorICAgIEMyRklFTEQoc2lnbmVkNjQsICJzNjQiKQorICAgIEMyRklFTEQodW5zaWduZWQzMiwgInUzMiIpCisgICAgQzJGSUVMRCh1bnNpZ25lZDY0LCAidTY0IikKKyAgICBDMkZJRUxEKGZwMzIsICJmcCIpCisgICAgQzJGSUVMRChzeiwgInNpemUiKQorICAgIEMyRklFTEQoYmxvYiwgImJsb2IiKQorICAgIEMyRklFTEQoc3RyaW5nLCAic3RyIikKKyAgICAvLyBDMkZJRUxEKHllc05vLCAieS1uIikKK307CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKERlc2NyaWJlU3RydWN0MVN0ZXAsIEMyUGFyYW1UZXN0X1BhcmFtRmllbGRMaXN0LCA6OnRlc3Rpbmc6OlZhbHVlcyhDMlRlc3RCU3RydWN0OjpGaWVsZExpc3QoKSkpOworCisvLyBUZXN0IDQuIGZsZXhpYmxlIG1lbWJlcnMKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIEMyUGFyYW1UZXN0X0ZsZXhQYXJhbUZpZWxkTGlzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHJvdGVjdGVkOgorICAgIHVzaW5nIHR5cGVfdD1GRDo6dHlwZV90OworCisgICAgLy8gc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPj4KKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+PgorICAgICAgICAgICAgR2V0TGlzdHMoKTsKKworICAgIGNvbnN0ZXhwciBzdGF0aWMgdHlwZV90IEZsZXhUeXBlID0KKyAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCBpbnQzMl90Pjo6dmFsdWUgPyBGRDo6SU5UMzIgOgorICAgICAgICAgICAgc3RkOjppc19zYW1lPFQsIGludDY0X3Q+Ojp2YWx1ZSA/IEZEOjpJTlQ2NCA6CisgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgdWludDMyX3Q+Ojp2YWx1ZSA/IEZEOjpVSU5UMzIgOgorICAgICAgICAgICAgc3RkOjppc19zYW1lPFQsIHVpbnQ2NF90Pjo6dmFsdWUgPyBGRDo6VUlOVDY0IDoKKyAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCBmbG9hdD46OnZhbHVlID8gRkQ6OkZMT0FUIDoKKyAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCB1aW50OF90Pjo6dmFsdWUgPyBGRDo6QkxPQiA6CisgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgY2hhcj46OnZhbHVlID8gRkQ6OlNUUklORyA6CisgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgQzJTaXplU3RydWN0Pjo6dmFsdWUgPyBDMlNpemVTdHJ1Y3Q6OlRZUEUgOiAodHlwZV90KTA7CisgICAgY29uc3RleHByIHN0YXRpYyBzaXplX3QgRkxFWF9TSVpFID0gc2l6ZW9mKFQpOworfTsKKwordHlwZWRlZiA6OnRlc3Rpbmc6OlR5cGVzPGludDMyX3QsIGludDY0X3QsIEMyU2l6ZVN0cnVjdD4gRmxleFR5cGVzOworVFlQRURfVEVTVF9DQVNFKEMyUGFyYW1UZXN0X0ZsZXhQYXJhbUZpZWxkTGlzdCwgRmxleFR5cGVzKTsKKworVFlQRURfVEVTVChDMlBhcmFtVGVzdF9GbGV4UGFyYW1GaWVsZExpc3QsIFZlcmlmeVN0cnVjdCkgeworICAgIGZvciAoYXV0byBhIDogdGhpcy0+R2V0TGlzdHMoKSkgeworICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gYTsKKyAgICAgICAgaWYgKGZpZWxkcy5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMnUsIGZpZWxkcy5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKEMyRmllbGREZXNjcmlwdG9yKEZEOjpJTlQzMiwgMSwgInMzMiIsIDAsIDQpLCBmaWVsZHNbMF0pOworICAgICAgICAgICAgRVhQRUNUX0VRKEMyRmllbGREZXNjcmlwdG9yKHRoaXMtPkZsZXhUeXBlLCAwLCAiZmxleCIsIDQsIHRoaXMtPkZMRVhfU0laRSksCisgICAgICAgICAgICAgICAgICAgICAgZmllbGRzWzFdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoQzJGaWVsZERlc2NyaXB0b3IodGhpcy0+RmxleFR5cGUsIDAsICJmbGV4IiwgMCwgdGhpcy0+RkxFWF9TSVpFKSwKKyAgICAgICAgICAgICAgICAgICAgICBmaWVsZHNbMF0pOworICAgICAgICB9CisgICAgfQorfQorCitzdHJ1Y3QgQzJUZXN0U3RydWN0X0ZsZXhTMzIgeworICAgIGludDMyX3QgbUZsZXhbXTsKKworICAgIGNvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gX0ZJRUxEX0xJU1Q7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBGaWVsZExpc3QoKTsKKyAgICAvLyBlbnVtIDogdWludDMyX3QgeyBDT1JFX0lOREVYID0ga1BhcmFtSW5kZXhUZXN0RmxleCwgRkxFWF9TSVpFID0gNCB9OworICAgIC8vIHR5cGVkZWYgQzJUZXN0U3RydWN0X0ZsZXhTMzIgX3R5cGU7CisgICAgLy8gdHlwZWRlZiBpbnQzMl90IEZsZXhUeXBlOworfTsKKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4UzMyOjpGaWVsZExpc3QoKSB7CisgICAgcmV0dXJuIF9GSUVMRF9MSVNUOworfQorY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4UzMyOjpfRklFTERfTElTVCA9IHsKKyAgICB7IEZEOjpJTlQzMiwgMCwgImZsZXgiLCAwLCA0IH0KK307CisKK3N0cnVjdCBDMlRlc3RTdHJ1Y3RfRmxleEVuZFMzMiB7CisgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICBpbnQzMl90IG1GbGV4W107CisKKyAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IF9GSUVMRF9MSVNUOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCk7CisgICAgLy8gZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IGtQYXJhbUluZGV4VGVzdEZsZXhFbmQsIEZMRVhfU0laRSA9IDQgfTsKKyAgICAvLyB0eXBlZGVmIEMyVGVzdFN0cnVjdF9GbGV4RW5kIF90eXBlOworICAgIC8vIHR5cGVkZWYgaW50MzJfdCBGbGV4VHlwZTsKK307CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleEVuZFMzMjo6RmllbGRMaXN0KCkgeworICAgIHJldHVybiBfRklFTERfTElTVDsKK30KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleEVuZFMzMjo6X0ZJRUxEX0xJU1QgPSB7CisgICAgeyBGRDo6SU5UMzIsIDEsICJzMzIiLCAwLCA0IH0sCisgICAgeyBGRDo6SU5UMzIsIDAsICJmbGV4IiwgNCwgNCB9LAorfTsKKworY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleEVuZFMzMl9wdHJfZmllbGRMaXN0ID0geworICAgIEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9GbGV4RW5kUzMyKikwKS0+c2lnbmVkMzIsICJzMzIiKSwKKyAgICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfRmxleEVuZFMzMiopMCktPm1GbGV4LCAiZmxleCIpLAorfTsKKworc3RydWN0IEMyVGVzdEZsZXhTMzJTdHJ1Y3QgeworICAgIGludDMyX3QgbUZsZXhTaWduZWQzMltdOworcHJpdmF0ZTogLy8gdGVzdCBhY2Nlc3MgbGV2ZWwKKyAgICBDMlRlc3RGbGV4UzMyU3RydWN0KCkge30KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChUZXN0RmxleFMzMiwgbUZsZXhTaWduZWQzMikKKyAgICBDMkZJRUxEKG1GbGV4U2lnbmVkMzIsICJmbGV4IikKK307CisKK3N0cnVjdCBDMlRlc3RGbGV4RW5kUzMyU3RydWN0IHsKKyAgICBpbnQzMl90IHNpZ25lZDMyOworICAgIGludDMyX3QgbUZsZXhTaWduZWQzMltdOworcHJpdmF0ZTogLy8gdGVzdCBhY2Nlc3MgbGV2ZWwKKyAgICBDMlRlc3RGbGV4RW5kUzMyU3RydWN0KCkge30KKworICAgIERFRklORV9GTEVYX0MyU1RSVUNUKFRlc3RGbGV4RW5kUzMyLCBtRmxleFNpZ25lZDMyKQorfSBDMl9QQUNLOworCitERVNDUklCRV9DMlNUUlVDVChUZXN0RmxleEVuZFMzMiwgeworICAgIEMyRklFTEQoc2lnbmVkMzIsICJzMzIiKQorICAgIEMyRklFTEQobUZsZXhTaWduZWQzMiwgImZsZXgiKQorfSkgLy8gOyBvcHRpb25hbAorCit0ZW1wbGF0ZTw+CitzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4+CisvL3N0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPj4KK0MyUGFyYW1UZXN0X0ZsZXhQYXJhbUZpZWxkTGlzdDxpbnQzMl90Pjo6R2V0TGlzdHMoKSB7CisgICAgcmV0dXJuIHsKKyAgICAgICAgQzJUZXN0U3RydWN0X0ZsZXhTMzI6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RTdHJ1Y3RfRmxleEVuZFMzMjo6RmllbGRMaXN0KCksCisgICAgICAgIEMyVGVzdFN0cnVjdF9GbGV4RW5kUzMyX3B0cl9maWVsZExpc3QsCisgICAgICAgIEMyVGVzdEZsZXhTMzJTdHJ1Y3Q6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RGbGV4RW5kUzMyU3RydWN0OjpGaWVsZExpc3QoKSwKKyAgICB9OworfQorCitzdHJ1Y3QgQzJUZXN0U3RydWN0X0ZsZXhTNjQgeworICAgIGludDY0X3QgbUZsZXhTaWduZWQ2NFtdOworCisgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfRklFTERfTElTVDsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOworICAgIC8vIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBrUGFyYW1JbmRleFRlc3RGbGV4UzY0LCBGTEVYX1NJWkUgPSA4IH07CisgICAgLy8gdHlwZWRlZiBDMlRlc3RTdHJ1Y3RfRmxleFM2NCBfdHlwZTsKKyAgICAvLyB0eXBlZGVmIGludDY0X3QgRmxleFR5cGU7Cit9OworCitjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhTNjQ6OkZpZWxkTGlzdCgpIHsKKyAgICByZXR1cm4gX0ZJRUxEX0xJU1Q7Cit9Citjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhTNjQ6Ol9GSUVMRF9MSVNUID0geworICAgIHsgRkQ6OklOVDY0LCAwLCAiZmxleCIsIDAsIDggfQorfTsKKworc3RydWN0IEMyVGVzdFN0cnVjdF9GbGV4RW5kUzY0IHsKKyAgICBpbnQzMl90IHNpZ25lZDMyOworICAgIGludDY0X3QgbVNpZ25lZDY0RmxleFtdOworCisgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfRklFTERfTElTVDsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOworICAgIC8vIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBDMlRlc3RTdHJ1Y3RfRmxleEVuZFM2NCwgRkxFWF9TSVpFID0gOCB9OworICAgIC8vIHR5cGVkZWYgQzJUZXN0U3RydWN0X0ZsZXhFbmRTNjQgX3R5cGU7CisgICAgLy8gdHlwZWRlZiBpbnQ2NF90IEZsZXhUeXBlOworfTsKKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4RW5kUzY0OjpGaWVsZExpc3QoKSB7CisgICAgcmV0dXJuIF9GSUVMRF9MSVNUOworfQorY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4RW5kUzY0OjpfRklFTERfTElTVCA9IHsKKyAgICB7IEZEOjpJTlQzMiwgMSwgInMzMiIsIDAsIDQgfSwKKyAgICB7IEZEOjpJTlQ2NCwgMCwgImZsZXgiLCA0LCA4IH0sCit9OworCitzdHJ1Y3QgQzJUZXN0RmxleFM2NFN0cnVjdCB7CisgICAgaW50NjRfdCBtRmxleFNpZ25lZDY0W107CisgICAgQzJUZXN0RmxleFM2NFN0cnVjdCgpIHt9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoVGVzdEZsZXhTNjQsIG1GbGV4U2lnbmVkNjQpCisgICAgQzJGSUVMRChtRmxleFNpZ25lZDY0LCAiZmxleCIpCit9OworCitzdHJ1Y3QgQzJUZXN0RmxleEVuZFM2NFN0cnVjdCB7CisgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICBpbnQ2NF90IG1GbGV4U2lnbmVkNjRbXTsKKyAgICBDMlRlc3RGbGV4RW5kUzY0U3RydWN0KCkge30KKworICAgIERFRklORV9GTEVYX0MyU1RSVUNUKFRlc3RGbGV4RW5kUzY0LCBtRmxleFNpZ25lZDY0KQorfSBDMl9QQUNLOworCitERVNDUklCRV9DMlNUUlVDVChUZXN0RmxleEVuZFM2NCwgeworICAgIEMyRklFTEQoc2lnbmVkMzIsICJzMzIiKQorICAgIEMyRklFTEQobUZsZXhTaWduZWQ2NCwgImZsZXgiKQorfSkgLy8gOyBvcHRpb25hbAorCit0ZW1wbGF0ZTw+CitzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4+CisvL3N0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPj4KK0MyUGFyYW1UZXN0X0ZsZXhQYXJhbUZpZWxkTGlzdDxpbnQ2NF90Pjo6R2V0TGlzdHMoKSB7CisgICAgcmV0dXJuIHsKKyAgICAgICAgQzJUZXN0U3RydWN0X0ZsZXhTNjQ6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RTdHJ1Y3RfRmxleEVuZFM2NDo6RmllbGRMaXN0KCksCisgICAgICAgIEMyVGVzdEZsZXhTNjRTdHJ1Y3Q6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RGbGV4RW5kUzY0U3RydWN0OjpGaWVsZExpc3QoKSwKKyAgICB9OworfQorCitzdHJ1Y3QgQzJUZXN0U3RydWN0X0ZsZXhTaXplIHsKKyAgICBDMlNpemVTdHJ1Y3QgbUZsZXhTaXplW107CisKKyAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IF9GSUVMRF9MSVNUOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCk7CisgICAgLy8gZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IGtQYXJhbUluZGV4VGVzdEZsZXhTaXplLCBGTEVYX1NJWkUgPSA4IH07CisgICAgLy8gdHlwZWRlZiBDMlRlc3RTdHJ1Y3RfRmxleFNpemUgX3R5cGU7CisgICAgLy8gdHlwZWRlZiBDMlNpemVTdHJ1Y3QgRmxleFR5cGU7Cit9OworCitjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhTaXplOjpGaWVsZExpc3QoKSB7CisgICAgcmV0dXJuIF9GSUVMRF9MSVNUOworfQorY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4U2l6ZTo6X0ZJRUxEX0xJU1QgPSB7CisgICAgeyBDMlNpemVTdHJ1Y3Q6OlRZUEUsIDAsICJmbGV4IiwgMCwgc2l6ZW9mKEMyU2l6ZVN0cnVjdCkgfQorfTsKKworc3RydWN0IEMyVGVzdFN0cnVjdF9GbGV4RW5kU2l6ZSB7CisgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICBDMlNpemVTdHJ1Y3QgbVNpemVGbGV4W107CisKKyAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IF9GSUVMRF9MSVNUOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCk7CisgICAgLy8gZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IEMyVGVzdFN0cnVjdF9GbGV4RW5kU2l6ZSwgRkxFWF9TSVpFID0gOCB9OworICAgIC8vIHR5cGVkZWYgQzJUZXN0U3RydWN0X0ZsZXhFbmRTaXplIF90eXBlOworICAgIC8vIHR5cGVkZWYgQzJTaXplU3RydWN0IEZsZXhUeXBlOworfTsKKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4RW5kU2l6ZTo6RmllbGRMaXN0KCkgeworICAgIHJldHVybiBfRklFTERfTElTVDsKK30KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleEVuZFNpemU6Ol9GSUVMRF9MSVNUID0geworICAgIHsgRkQ6OklOVDMyLCAxLCAiczMyIiwgMCwgNCB9LAorICAgIHsgQzJTaXplU3RydWN0OjpUWVBFLCAwLCAiZmxleCIsIDQsIHNpemVvZihDMlNpemVTdHJ1Y3QpIH0sCit9OworCitzdHJ1Y3QgQzJUZXN0RmxleFNpemVTdHJ1Y3QgeworICAgIEMyU2l6ZVN0cnVjdCBtRmxleFNpemVbXTsKKyAgICBDMlRlc3RGbGV4U2l6ZVN0cnVjdCgpIHt9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoVGVzdEZsZXhTaXplLCBtRmxleFNpemUpCisgICAgQzJGSUVMRChtRmxleFNpemUsICJmbGV4IikKK307CisKK3N0cnVjdCBDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdCB7CisgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICBDMlNpemVTdHJ1Y3QgbUZsZXhTaXplW107CisgICAgQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3QoKSB7fQorCisgICAgREVGSU5FX0ZMRVhfQzJTVFJVQ1QoVGVzdEZsZXhFbmRTaXplLCBtRmxleFNpemUpCit9IEMyX1BBQ0s7CisKK0RFU0NSSUJFX0MyU1RSVUNUKFRlc3RGbGV4RW5kU2l6ZSwgeworICAgIEMyRklFTEQoc2lnbmVkMzIsICJzMzIiKQorICAgIEMyRklFTEQobUZsZXhTaXplLCAiZmxleCIpCit9KSAvLyA7IG9wdGlvbmFsCisKK3N0cnVjdCBDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3QgeworICAgIGludDMyX3Qgc2lnbmVkMzI7CisgICAgQzJTaXplU3RydWN0IG1GbGV4U2l6ZVtdOworICAgIEMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdCgpIHt9CisKKyAgICBERUZJTkVfQkFTRV9GTEVYX0MyU1RSVUNUKFRlc3RCYXNlRmxleEVuZFNpemUsIG1GbGV4U2l6ZSkKK30gQzJfUEFDSzsKKworREVTQ1JJQkVfQzJTVFJVQ1QoVGVzdEJhc2VGbGV4RW5kU2l6ZSwgeworICAgIEMyRklFTEQoc2lnbmVkMzIsICJzMzIiKQorICAgIEMyRklFTEQobUZsZXhTaXplLCAiZmxleCIpCit9KSAvLyA7IG9wdGlvbmFsCisKK3N0cnVjdCBDMlRlc3RCYXNlRmxleEVuZFNpemUyU3RydWN0IHsKKyAgICBpbnQzMl90IHNpZ25lZDMyOworICAgIEMyU2l6ZVN0cnVjdCBtRmxleFNpemVbXTsKKyAgICBDMlRlc3RCYXNlRmxleEVuZFNpemUyU3RydWN0KCkge30KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQkFTRV9GTEVYX0MyU1RSVUNUKFRlc3RCYXNlRmxleEVuZFNpemUyLCBtRmxleFNpemUpCisgICAgQzJGSUVMRChzaWduZWQzMiwgInMzMiIpCisgICAgQzJGSUVMRChtRmxleFNpemUsICJmbGV4IikKK307CisKK3RlbXBsYXRlPD4KK3N0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPj4KKy8vc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+PgorQzJQYXJhbVRlc3RfRmxleFBhcmFtRmllbGRMaXN0PEMyU2l6ZVN0cnVjdD46OkdldExpc3RzKCkgeworICAgIHJldHVybiB7CisgICAgICAgIEMyVGVzdFN0cnVjdF9GbGV4U2l6ZTo6RmllbGRMaXN0KCksCisgICAgICAgIEMyVGVzdFN0cnVjdF9GbGV4RW5kU2l6ZTo6RmllbGRMaXN0KCksCisgICAgICAgIEMyVGVzdEZsZXhTaXplU3RydWN0OjpGaWVsZExpc3QoKSwKKyAgICAgICAgQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3Q6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3Q6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RCYXNlRmxleEVuZFNpemUyU3RydWN0OjpGaWVsZExpc3QoKSwKKyAgICB9OworfQorCitURVNUX0YoQzJQYXJhbVRlc3QsIEZpZWxkSWQpIHsKKyAgICAvLyBwb2ludGVyIGNvbnN0cnVjdG9yCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+c2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyMCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT51bnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjQsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+dW5zaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDMyLCA0KSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPmZwMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzNiwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5zeikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDYwLCAxKSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPmJsb2IpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxNjAsIDEpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+c3RyaW5nKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjYwLCAxKSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPnllc05vKSk7CisKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgX0MyRmllbGRJZCgmKChDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdCopMCktPnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNCwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3QqKTApLT5tRmxleFNpemUpKTsKKworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdCopMCktPnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNCwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QmFzZUZsZXhFbmRTaXplU3RydWN0KikwKS0+bUZsZXhTaXplKSk7CisKKyAgICAvLyBtZW1iZXIgcG9pbnRlciBjb25zdHJ1Y3RvcgorICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpzaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpzaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDIwLCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6dW5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI0LCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6dW5zaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDMyLCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6ZnAzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDM2LCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6c3opKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg2MCwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OmJsb2IpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxNjAsIDEpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpzdHJpbmcpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNjAsIDEpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjp5ZXNObykpOworCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdEZsZXhFbmRTaXplU3RydWN0KikwLCAmQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3Q6OnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNCwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdEZsZXhFbmRTaXplU3RydWN0KikwLCAmQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3Q6Om1GbGV4U2l6ZSkpOworCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdCopMCwgJkMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdDo6c2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0LCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0QmFzZUZsZXhFbmRTaXplU3RydWN0KikwLCAmQzJUZXN0QmFzZUZsZXhFbmRTaXplU3RydWN0OjptRmxleFNpemUpKTsKKworICAgIC8vIG1lbWJlciBwb2ludGVyIHNhbnMgdHlwZSBwb2ludGVyCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjpzaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6c2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyMCwgNCksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjp1bnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjQsIDgpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6dW5zaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDMyLCA0KSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OmZwMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzNiwgOCksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjpzeikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDYwLCAxKSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OmJsb2IpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxNjAsIDEpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6c3RyaW5nKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjYwLCAxKSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6Onllc05vKSk7CisKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgX0MyRmllbGRJZCgmQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3Q6OnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNCwgOCksIF9DMkZpZWxkSWQoJkMyVGVzdEZsZXhFbmRTaXplU3RydWN0OjptRmxleFNpemUpKTsKKworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKCZDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3Q6OnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNCwgOCksIF9DMkZpZWxkSWQoJkMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdDo6bUZsZXhTaXplKSk7CisKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlRlc3RBU3RydWN0PiBDMlRlc3RBSW5mbzsKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdD4gQzJUZXN0RmxleEVuZFNpemVJbmZvOworICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdCwga1BhcmFtSW5kZXhUZXN0RmxleEVuZFNpemU+IEMyVGVzdEZsZXhFbmRTaXplSW5mb0Zyb21CYXNlOworCisgICAgLy8gcG9pbnRlciBjb25zdHJ1Y3RvciBpbiBDMlBhcmFtCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoOCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDEyLCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjgsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+dW5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDMyLCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnVuc2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0MCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5mcDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDQsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+c3opKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg2OCwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5ibG9iKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTY4LCAxKSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnN0cmluZykpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI2OCwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT55ZXNObykpOworCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoOCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0RmxleEVuZFNpemVJbmZvKikwKS0+bS5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDEyLCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RGbGV4RW5kU2l6ZUluZm8qKTApLT5tLm1GbGV4U2l6ZSkpOworCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoOCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0RmxleEVuZFNpemVJbmZvRnJvbUJhc2UqKTApLT5tLnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTIsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEZsZXhFbmRTaXplSW5mb0Zyb21CYXNlKikwKS0+bS5tRmxleFNpemUpKTsKKworICAgIC8vIG1lbWJlciBwb2ludGVyIGluIEMyUGFyYW0KKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg4LCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6c2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxMiwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86OnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjgsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjp1bnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzIsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjp1bnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDAsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjpmcDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDQsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjpzeikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDY4LCAxKSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6YmxvYikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDE2OCwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86OnN0cmluZykpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI2OCwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86Onllc05vKSk7CisKKyAgICAvLyBOT1RFOiBjYW5ub3QgdXNlIGEgbWVtYmVyIHBvaW50ZXIgZm9yIGZsZXggcGFyYW1zIGR1ZSB0byBpbnRyb2R1Y3Rpb24gb2YgJ20nCisgICAgLy8gRVhQRUNUX0VRKF9DMkZpZWxkSWQoOCwgNCksIF9DMkZpZWxkSWQoJkMyVGVzdEZsZXhFbmRTaXplSW5mbzo6bS5zaWduZWQzMikpOworICAgIC8vIEVYUEVDVF9FUShfQzJGaWVsZElkKDEyLCA4KSwgX0MyRmllbGRJZCgmQzJUZXN0RmxleEVuZFNpemVJbmZvOjptLm1GbGV4U2l6ZSkpOworCisgICAgLy8gRVhQRUNUX0VRKF9DMkZpZWxkSWQoOCwgNCksIF9DMkZpZWxkSWQoJkMyVGVzdEZsZXhFbmRTaXplSW5mb0Zyb21CYXNlOjptLnNpZ25lZDMyKSk7CisgICAgLy8gRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTIsIDgpLCBfQzJGaWVsZElkKCZDMlRlc3RGbGV4RW5kU2l6ZUluZm9Gcm9tQmFzZTo6bS5tRmxleFNpemUpKTsKKworCit9CisKK3N0cnVjdCBTMzIgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIGNsYXNzIEI9dHlwZW5hbWUgc3RkOjpyZW1vdmVfZXh0ZW50PFQ+Ojp0eXBlPgorICAgIGlubGluZSBTMzIoY29uc3QgVCopIHsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghc3RkOjppc19hcnJheTxUPjo6dmFsdWUsICJzaG91bGQgbm90IGJlIGFuIGFycmF5Iik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPEIsIGludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSBpbnQzMl90Iik7CisgICAgfQorfTsKKworc3RydWN0IEZMWCB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgVCwgY2xhc3MgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8VD46OnR5cGU+CisgICAgaW5saW5lIEZMWChjb25zdCBUKiwgY29uc3QgVSopIHsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2FycmF5PFQ+Ojp2YWx1ZSwgInNob3VsZCBiZSBhbiBhcnJheSIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6ZXh0ZW50PFQ+Ojp2YWx1ZSA9PSAwLCAic2hvdWxkIGJlIGFuIGFycmF5IG9mIDAgZXh0ZW50Iik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPEIsIFU+Ojp2YWx1ZSwgInNob3VsZCBiZSB0eXBlIFUiKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgTVAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFQsIHR5cGVuYW1lIEV4cGVjdGVkVSwgdHlwZW5hbWUgVW5leHBlY3RlZFU+CisgICAgaW5saW5lIE1QKFQgVTo6KiwgY29uc3QgRXhwZWN0ZWRVKiwgY29uc3QgVW5leHBlY3RlZFUqKSB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfc2FtZTxVLCBVbmV4cGVjdGVkVT46OnZhbHVlLCAic2hvdWxkIG5vdCBiZSBtZW1iZXIgcG9pbnRlciBvZiB0aGUgYmFzZSB0eXBlIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPFUsIEV4cGVjdGVkVT46OnZhbHVlLCAic2hvdWxkIGJlIG1lbWJlciBwb2ludGVyIG9mIHRoZSBkZXJpdmVkIHR5cGUiKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBULCB0eXBlbmFtZSBCLCB0eXBlbmFtZSBEPgorICAgIGlubGluZSBNUChUIEQ6OiosIGNvbnN0IEQqKSB7IH0KK307CisKK3ZvaWQgY29tcGlsZWRTdGF0aWNfYXJyYXlUeXBlUHJvcGFnYXRpb25UZXN0KCkgeworICAgICh2b2lkKVMzMigmKChDMlRlc3RGbGV4RW5kUzMyU3RydWN0ICopMCktPnNpZ25lZDMyKTsKKyAgICAodm9pZClGTFgoJigoQzJUZXN0RmxleEVuZFMzMlN0cnVjdCAqKTApLT5tRmxleFNpZ25lZDMyLCAoaW50MzJfdCopMCk7CisgICAgKHZvaWQpRkxYKCYoKEMyVGVzdEZsZXhTMzJTdHJ1Y3QgKikwKS0+bUZsZXhTaWduZWQzMiwgKGludDMyX3QqKTApOworCisgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJUZXN0QVN0cnVjdD4gQzJUZXN0QUluZm87CisKKyAgICAvLyBUUklDS1k6ICZkZXJpdmVkQ2xhc3M6OmJhc2VNZW1iZXIgaGFzIHR5cGUgb2YgYmFzZUNsYXNzOjoqCisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoJkMyVGVzdEFJbmZvOjpzaWduZWQzMiksIGludDMyX3QgQzJUZXN0QVN0cnVjdDo6Kj46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgImJhc2UgbWVtYmVyIHBvaW50ZXIgc2hvdWxkIGhhdmUgYmFzZSBjbGFzcyBpbiB0eXBlIik7CisKKyAgICAvLyB0aGVyZWZvcmUsIG1lbWJlciBwb2ludGVyIGV4cGFuZHMgdG8gYmFzZUNsYXNzOjoqIGluIHRlbXBsYXRlcworICAgICh2b2lkKU1QKCZDMlRlc3RBSW5mbzo6c2lnbmVkMzIsCisgICAgICAgICAgICAgKEMyVGVzdEFTdHJ1Y3QqKTAgLyogZXhwZWN0ZWQgKi8sIChDMlRlc3RBSW5mbyopMCAvKiB1bmV4cGVjdGVkICovKTsKKyAgICAvLyBidXQgY2FuIGJlIGNhc3QgdG8gZGVyaXZlZENsYXNzOjoqCisgICAgKHZvaWQpTVAoKGludDMyX3QgQzJUZXN0QUluZm86OiopJkMyVGVzdEFJbmZvOjpzaWduZWQzMiwKKyAgICAgICAgICAgICAoQzJUZXN0QUluZm8qKTAgLyogZXhwZWN0ZWQgKi8sIChDMlRlc3RBU3RydWN0KikwIC8qIHVuZXhwZWN0ZWQgKi8pOworCisgICAgLy8gVFJJQ0tZOiBiYXNlQ2xhc3M6OiogZG9lcyBub3QgYXV0b2NvbnZlcnQgdG8gZGVyaXZlZENsYXNzOjoqIGV2ZW4gaW4gdGVtcGxhdGVzCisgICAgLy8gKHZvaWQpTVAoJkMyVGVzdEFJbmZvOjpzaWduZWQzMiwgKEMyVGVzdEFJbmZvKikwKTsKK30KKworVEVTVF9GKEMyUGFyYW1UZXN0LCBNZW1iZXJQb2ludGVyQ2FzdCkgeworICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyVGVzdEFTdHJ1Y3Q+IEMyVGVzdEFJbmZvOworCisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMlRlc3RBSW5mbywgc2lnbmVkMzIpID09IDgsICJvZmZzZXQgc2hvdWxkIGJlIDgiKTsKKyAgICBjb25zdGV4cHIgaW50MzJfdCBDMlRlc3RBU3RydWN0OjoqIHMzMnB0ciA9ICZDMlRlc3RBSW5mbzo6c2lnbmVkMzI7CisgICAgY29uc3RleHByIGludDMyX3QgQzJUZXN0QUluZm86OiogczMycHRyX2Rlcml2ZWQgPSAoaW50MzJfdCBDMlRlc3RBU3RydWN0OjoqKSZDMlRlc3RBSW5mbzo6c2lnbmVkMzI7CisgICAgY29uc3RleHByIGludDMyX3QgQzJUZXN0QUluZm86OiogczMycHRyX2Nhc3QyZGVyaXZlZCA9IChpbnQzMl90IEMyVGVzdEFJbmZvOjoqKXMzMnB0cjsKKyAgICBDMlRlc3RBSW5mbyAqaW5mbyA9IChDMlRlc3RBSW5mbyAqKTI1NjsKKyAgICBDMlRlc3RBU3RydWN0ICpzdHJ1a3QgPSAoQzJUZXN0QVN0cnVjdCAqKWluZm87CisgICAgaW50MzJfdCAqaW5mb19zMzJfZGVyaXZlZCA9ICYoaW5mby0+KnMzMnB0cl9kZXJpdmVkKTsKKyAgICBpbnQzMl90ICppbmZvX3MzMl9jYXN0MmRlcml2ZWQgPSAmKGluZm8tPipzMzJwdHJfY2FzdDJkZXJpdmVkKTsKKyAgICBpbnQzMl90ICppbmZvX3MzMiA9ICYoaW5mby0+KnMzMnB0cik7CisgICAgaW50MzJfdCAqc3RydWt0X3MzMiA9ICYoc3RydWt0LT4qczMycHRyKTsKKworICAgIEVYUEVDVF9FUSgyNTZ1LCAodWludHB0cl90KWluZm8pOworICAgIEVYUEVDVF9FUSgyNjR1LCAodWludHB0cl90KXN0cnVrdCk7CisgICAgRVhQRUNUX0VRKDI2NHUsICh1aW50cHRyX3QpaW5mb19zMzJfZGVyaXZlZCk7CisgICAgRVhQRUNUX0VRKDI2NHUsICh1aW50cHRyX3QpaW5mb19zMzJfY2FzdDJkZXJpdmVkKTsKKyAgICBFWFBFQ1RfRVEoMjY0dSwgKHVpbnRwdHJfdClpbmZvX3MzMik7CisgICAgRVhQRUNUX0VRKDI2NHUsICh1aW50cHRyX3Qpc3RydWt0X3MzMik7CisKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdD4gQzJUZXN0RmxleEVuZFNpemVJbmZvOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJUZXN0RmxleEVuZFNpemVJbmZvLCBtLnNpZ25lZDMyKSA9PSA4LCAib2Zmc2V0IHNob3VsZCBiZSA4Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMlRlc3RGbGV4RW5kU2l6ZUluZm8sIG0ubUZsZXhTaXplKSA9PSAxMiwgIm9mZnNldCBzaG91bGQgYmUgMTIiKTsKKworICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdCwga1BhcmFtSW5kZXhUZXN0RmxleEVuZFNpemU+IEMyVGVzdEZsZXhFbmRTaXplSW5mb0Zyb21CYXNlOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJUZXN0RmxleEVuZFNpemVJbmZvRnJvbUJhc2UsIG0uc2lnbmVkMzIpID09IDgsICJvZmZzZXQgc2hvdWxkIGJlIDgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyVGVzdEZsZXhFbmRTaXplSW5mb0Zyb21CYXNlLCBtLm1GbGV4U2l6ZSkgPT0gMTIsICJvZmZzZXQgc2hvdWxkIGJlIDEyIik7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUEFSQU0gVVNBR0UgVEVTVFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdHJ1Y3QgQzJOdW1iZXJTdHJ1Y3QgeworICAgIGludDMyX3QgbU51bWJlcjsKKyAgICBDMk51bWJlclN0cnVjdCgpIHt9CisgICAgQzJOdW1iZXJTdHJ1Y3QoaW50MzJfdCBfbnVtYmVyKSA6IG1OdW1iZXIoX251bWJlcikge30KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoTnVtYmVyKQorICAgIEMyRklFTEQobU51bWJlciwgIm51bWJlciIpCit9OworCitzdHJ1Y3QgQzJOdW1iZXJCYXNlU3RydWN0IHsKKyAgICBpbnQzMl90IG1OdW1iZXI7CisgICAgQzJOdW1iZXJCYXNlU3RydWN0KCkge30KKyAgICBDMk51bWJlckJhc2VTdHJ1Y3QoaW50MzJfdCBfbnVtYmVyKSA6IG1OdW1iZXIoX251bWJlcikge30KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQkFTRV9DMlNUUlVDVChOdW1iZXJCYXNlKQorICAgIEMyRklFTEQobU51bWJlciwgIm51bWJlciIpCit9OworCitzdHJ1Y3QgQzJOdW1iZXJzU3RydWN0IHsKKyAgICBpbnQzMl90IG1OdW1iZXJzW107CisgICAgQzJOdW1iZXJzU3RydWN0KCkge30KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChOdW1iZXJzLCBtTnVtYmVycykKKyAgICBDMkZJRUxEKG1OdW1iZXJzLCAibnVtYmVycyIpCit9Oworc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzU3RydWN0KSA9PSAwLCAiQzJOdW1iZXJzU3RydWN0IGhhcyBpbmNvcnJlY3Qgc2l6ZSIpOworCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMk51bWJlclN0cnVjdD4gQzJOdW1iZXJJbmZvOworCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyTnVtYmVyU3RydWN0PiBDMk51bWJlclR1bmluZzsKK3R5cGVkZWYgICBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJOdW1iZXJTdHJ1Y3Q+IEMyTnVtYmVyUG9ydFR1bmluZzsKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJOdW1iZXJTdHJ1Y3Q+IEMyTnVtYmVyU3RyZWFtVHVuaW5nOworCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyTnVtYmVyc1N0cnVjdD4gQzJOdW1iZXJzVHVuaW5nOwordHlwZWRlZiAgIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMk51bWJlcnNTdHJ1Y3Q+IEMyTnVtYmVyc1BvcnRUdW5pbmc7Cit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyTnVtYmVyc1N0cnVjdD4gQzJOdW1iZXJzU3RyZWFtVHVuaW5nOworCisvLworI2lmIDAKKwordm9pZCB0ZXN0KCkgeworICAgIEMyTnVtYmVyU3RydWN0IHMoMTApOworICAgICh2b2lkKUMyTnVtYmVyU3RydWN0OjpGaWVsZExpc3QoKTsKK307CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJJbnQ2NFZhbHVlLCBrUGFyYW1JbmRleE51bWJlckI+IEMyTnVtYmVyQ29uZmlnNDsKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMySW50MzJWYWx1ZSwga1BhcmFtSW5kZXhOdW1iZXI+IEMyTnVtYmVyQ29uZmlnMzsKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJTdHJpbmdWYWx1ZSwga1BhcmFtSW5kZXhOdW1iZXI+IEMyVmlkZW9OYW1lQ29uZmlnOworCit2b2lkIHRlc3QzKCkgeworICAgIEMyTnVtYmVyQ29uZmlnMyBzKDEwKTsKKyAgICBzLnZhbHVlID0gMTE7CisgICAgcyA9IDEyOworICAgICh2b2lkKUMyTnVtYmVyQ29uZmlnMzo6RmllbGRMaXN0KCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyVmlkZW9OYW1lQ29uZmlnPiBuID0gQzJWaWRlb05hbWVDb25maWc6OkFsbG9jU2hhcmVkKDI1KTsKKyAgICBzdHJjcHkobi0+bS52YWx1ZSwgImxham9zIik7CisgICAgQzJOdW1iZXJDb25maWc0IHQoZmFsc2UsIDAsIDExKTsKKyAgICB0LnZhbHVlID0gMTU7Cit9OworCitzdHJ1Y3QgQzJOdW1iZXJzU3RydWN0IHsKKyAgICBpbnQzMl90IG1OdW1iZXJzW107CisgICAgZW51bSB7IENPUkVfSU5ERVggPSBrUGFyYW1JbmRleE51bWJlciB9OworICAgIGNvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCk7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBGaWVsZExpc3QoKTsKKyAgICBDMk51bWJlcnNTdHJ1Y3QoKSB7fQorCisgICAgRkxFWChDMk51bWJlcnNTdHJ1Y3QsIG1OdW1iZXJzKTsKK307CisKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyc1N0cnVjdCkgPT0gMCwgInllcyIpOworCisKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyTnVtYmVyc1N0cnVjdD4gQzJOdW1iZXJzSW5mbzsKKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyTnVtYmVyc1N0cnVjdDo6RmllbGRMaXN0KCkgeworICAgIHJldHVybiBfRklFTERfTElTVDsKK30KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMk51bWJlcnNTdHJ1Y3Q6Ol9GSUVMRF9MSVNUID0KKy8vICAgIHsgeyBGRDo6SU5UMzIsIDAsICJ3aWR0aHMiIH0gfTsKKyAgICB7IEMyRmllbGREZXNjcmlwdG9yKCYoKEMyTnVtYmVyc1N0cnVjdCopKG51bGxwdHIpKS0+bU51bWJlcnMsICJudW1iZXIiKSB9OworCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMk51bWJlclN0cnVjdD4gQzJOdW1iZXJDb25maWc7CisKK3N0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBteUxpc3QgPSBDMk51bWJlckNvbmZpZzo6RmllbGRMaXN0KCk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbURlc2NyaXB0b3I+IF9fdGVzdF9kZXNjcmliZSh1aW50MzJfdCBwYXJhbVR5cGUpIHsKKyAgICAgICAgc3RkOjpsaXN0PEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZHMgPSBkZXNjcmliZUMyUGFyYW1zPEMyTnVtYmVyQ29uZmlnPigpOworCisgICAgICAgIGF1dG8gd2lkdGhzID0gQzJOdW1iZXJzSW5mbzo6QWxsb2NTaGFyZWQoNSk7CisgICAgICAgIHdpZHRocy0+ZmxleENvdW50KCk7CisgICAgICAgIHdpZHRocy0+bS5tTnVtYmVyc1s0XSA9IDE7CisKKyAgICAgICAgdGVzdCgpOworICAgICAgICB0ZXN0MygpOworCisgICAgICAgIEMyTnVtYmVyQ29uZmlnIG91dHB1dFdpZHRoKGZhbHNlLCAxMjMpOworCisgICAgICAgIEMyUGFyYW06OkluZGV4IGluZGV4KHBhcmFtVHlwZSk7CisgICAgICAgIHN3aXRjaCAocGFyYW1UeXBlKSB7CisgICAgICAgIGNhc2UgQzJOdW1iZXJDb25maWc6OkNPUkVfSU5ERVg6CisgICAgICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPihuZXcgQzJQYXJhbURlc2NyaXB0b3J7CisgICAgICAgICAgICAgICAgdHJ1ZSAvKiBpc1JlcXVpcmVkICovLAorICAgICAgICAgICAgICAgICJudW1iZXIiLAorICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCisvLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorYm9vbCBjYW5TZXRQb3J0KFQgJm8sIGJvb2wgb3V0cHV0KSB7IHJldHVybiBvLnNldFBvcnQob3V0cHV0KTsgfQorYm9vbCBjYW5TZXRQb3J0KC4uLikgeyByZXR1cm4gZmFsc2U7IH0KKwordGVtcGxhdGU8dHlwZW5hbWUgUywgdHlwZW5hbWU9ZGVjbHR5cGUoKChTKikwKS0+c2V0UG9ydCh0cnVlKSk+CitzdGF0aWMgc3RkOjp0cnVlX3R5cGUgX2NhbkNhbGxTZXRQb3J0KGludCk7Cit0ZW1wbGF0ZTx0eXBlbmFtZT4KK3N0YXRpYyBzdGQ6OmZhbHNlX3R5cGUgX2NhbkNhbGxTZXRQb3J0KC4uLik7CisjZGVmaW5lIGNhbkNhbGxTZXRQb3J0KHgpIGRlY2x0eXBlKF9jYW5DYWxsU2V0UG9ydDxzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8ZGVjbHR5cGUoeCk+Ojp0eXBlPigwKSk6OnZhbHVlCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTVEFUSUMgVEVTVFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0YXRpY19hc3NlcnQoX0MyQ29tcGFyYWJsZTxpbnQ+Ojp2YWx1ZSwgImludCBpcyBub3QgY29tcGFyYWJsZSIpOworc3RhdGljX2Fzc2VydCghX0MyQ29tcGFyYWJsZTx2b2lkPjo6dmFsdWUsICJ2b2lkIGlzIGNvbXBhcmFibGUiKTsKKworc3RydWN0IEMyX0hJREUgX3Rlc3QwIHsKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgX3Rlc3QwJik7CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IF90ZXN0MCYpOworfTsKK3N0cnVjdCBDMl9ISURFIF90ZXN0MSB7CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IF90ZXN0MSYpOworfTsKK3N0cnVjdCBDMl9ISURFIF90ZXN0MiB7CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IF90ZXN0MiYpOworfTsKK3N0YXRpY19hc3NlcnQoX0MyQ29tcGFyYWJsZTxfdGVzdDA+Ojp2YWx1ZSwgImNsYXNzIHdpdGggPT0gYW5kICE9IGlzIG5vdCBjb21wYXJhYmxlIik7CitzdGF0aWNfYXNzZXJ0KF9DMkNvbXBhcmFibGU8X3Rlc3QxPjo6dmFsdWUsICJjbGFzcyB3aXRoID09IGlzIG5vdCBjb21wYXJhYmxlIik7CitzdGF0aWNfYXNzZXJ0KF9DMkNvbXBhcmFibGU8X3Rlc3QyPjo6dmFsdWUsICJjbGFzcyB3aXRoICE9IGlzIG5vdCBjb21wYXJhYmxlIik7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDMlBBUkFNIFRFU1RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdHJ1Y3QgX0MyUGFyYW1JbnNwZWN0b3IgeworICAgIHN0YXRpYyB2b2lkIFN0YXRpY1Rlc3QoKTsKKyAgICBzdGF0aWMgdm9pZCBTdGF0aWNGcm9tQmFzZVRlc3QoKTsKKyAgICBzdGF0aWMgdm9pZCBTdGF0aWNGbGV4VGVzdCgpOworICAgIHN0YXRpYyB2b2lkIFN0YXRpY0ZsZXhGcm9tQmFzZVRlc3QoKTsKK307CisKKy8vIFRFU1RfRihfQzJQYXJhbUluc3BlY3RvciwgU3RhdGljVGVzdCkgewordm9pZCBfQzJQYXJhbUluc3BlY3Rvcjo6U3RhdGljVGVzdCgpIHsKKyAgICB0eXBlZGVmIEMyUGFyYW06OkluZGV4IEk7CisKKyAgICAvLyBDMk51bWJlclN0cnVjdDogQ09SRV9JTkRFWCA9IGtJbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgKGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclN0cnVjdDo6Q09SRV9JTkRFWCA9PSBrUGFyYW1JbmRleE51bWJlciwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyU3RydWN0KSA9PSA0LCAiYmFkIHNpemUiKTsKKworICAgIC8vIEMyTnVtYmVyVHVuaW5nOiAgICAgICAgICAgICBrSW5kZXggfCB0dW4gfCBnbG9iYWwgICAgICAgICAgIChhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJUdW5pbmc6OkNPUkVfSU5ERVggPT0ga1BhcmFtSW5kZXhOdW1iZXIsICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyVHVuaW5nOjpQQVJBTV9UWVBFID09IChrUGFyYW1JbmRleE51bWJlciB8IEk6OktJTkRfVFVOSU5HIHwgSTo6RElSX0dMT0JBTCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlclR1bmluZykgPT0gMTIsICJiYWQgc2l6ZSIpOworCisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclR1bmluZywgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyVHVuaW5nLCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJUdW5pbmcsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisKKyAgICAvLyBDMk51bWJlclBvcnRUdW5pbmc6ICAgICAgICAga0luZGV4IHwgdHVuIHwgcG9ydCAgICAgICAgICAgICAoYm9vbCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlclBvcnRUdW5pbmcpID09IDEyLCAiYmFkIHNpemUiKTsKKyAgICAvLyBDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OiAga0luZGV4IHwgdHVuIHwgcG9ydCB8IGlucHV0ICAgICAoYXJncykKKyAgICAvLyBDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDoga0luZGV4IHwgdHVuIHwgcG9ydCB8IG91dHB1dCAgICAoYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4TnVtYmVyLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoa1BhcmFtSW5kZXhOdW1iZXIgfCBJOjpLSU5EX1RVTklORyB8IEk6OkRJUl9JTlBVVCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICBrUGFyYW1JbmRleE51bWJlciwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChrUGFyYW1JbmRleE51bWJlciB8IEk6OktJTkRfVFVOSU5HIHwgSTo6RElSX09VVFBVVCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0KSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQpID09IDEyLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dCwgbU51bWJlcikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dCwgbU51bWJlcikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKworICAgIC8vIEMyTnVtYmVyU3RyZWFtVHVuaW5nOiAgICAgICBrSW5kZXggfCB0dW4gfCBzdHIgICAgICAgICAgICAgIChib29sLCB1aW50LCBhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyU3RyZWFtVHVuaW5nKSA9PSAxMnUsICJiYWQgc2l6ZSIpOworICAgIC8vIEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dCBrSW5kZXggfCB0dW4gfCBzdHIgfCBpbnB1dCAgICAgIChpbnQsIGFyZ3MpCisgICAgLy8gQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dCBrSXggICB8IHR1biB8IHN0ciB8IG91dHB1dCAgICAgKGludCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhOdW1iZXIsICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKGtQYXJhbUluZGV4TnVtYmVyIHwgSTo6S0lORF9UVU5JTkcgfCBJOjpESVJfSU5QVVQgfCBJOjpJU19TVFJFQU1fRkxBRyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4TnVtYmVyLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoa1BhcmFtSW5kZXhOdW1iZXIgfCBJOjpLSU5EX1RVTklORyB8IEk6OkRJUl9PVVRQVVQgfCBJOjpJU19TVFJFQU1fRkxBRyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQpID09IDEydSwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dCkgPT0gMTJ1LCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dCwgbU51bWJlcikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dCwgbU51bWJlcikgPT0gOCwgImJhZCBvZmZzZXQiKTsKK30KKwordm9pZCBfQzJQYXJhbUluc3BlY3Rvcjo6U3RhdGljRnJvbUJhc2VUZXN0KCkgeworICAgIGVudW0geyBrUGFyYW1JbmRleE15ID0gMzEwMiB9OworICAgIHR5cGVkZWYgQzJOdW1iZXJCYXNlU3RydWN0IEMyTXlTdHJ1Y3Q7CisgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJNeVN0cnVjdCwga1BhcmFtSW5kZXhNeT4gQzJNeVNldHRpbmc7CisgICAgdHlwZWRlZiAgIEMyUG9ydFBhcmFtPEMyU2V0dGluZywgQzJNeVN0cnVjdCwga1BhcmFtSW5kZXhNeT4gQzJNeVBvcnRTZXR0aW5nOworICAgIHR5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlNldHRpbmcsIEMyTXlTdHJ1Y3QsIGtQYXJhbUluZGV4TXk+IEMyTXlTdHJlYW1TZXR0aW5nOworCisgICAgdHlwZWRlZiBDMlBhcmFtOjpJbmRleCBJOworCisgICAgLy8gQzJNeVN0cnVjdCBoYXMgbm8gQ09SRV9JTkRFWAorICAgIC8vc3RhdGljX2Fzc2VydChDMk15U3RydWN0OjpDT1JFX0lOREVYID09IGtQYXJhbUluZGV4TXksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15U3RydWN0KSA9PSA0LCAiYmFkIHNpemUiKTsKKworICAgIC8vIEMyTXlTZXR0aW5nOiAgICAgICAgICAgICBrSW5kZXggfCB0dW4gfCBnbG9iYWwgICAgICAgICAgIChhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJNeVNldHRpbmc6OkNPUkVfSU5ERVggPT0ga1BhcmFtSW5kZXhNeSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVNldHRpbmc6OlBBUkFNX1RZUEUgPT0gKGtQYXJhbUluZGV4TXkgfCBJOjpLSU5EX1NFVFRJTkcgfCBJOjpESVJfR0xPQkFMKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlTZXR0aW5nKSA9PSAxMiwgImJhZCBzaXplIik7CisKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTZXR0aW5nLCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVNldHRpbmcsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U2V0dGluZywgbU51bWJlcikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKworICAgIC8vIEMyTXlQb3J0U2V0dGluZzogICAgICAgICBrSW5kZXggfCB0dW4gfCBwb3J0ICAgICAgICAgICAgIChib29sLCBhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlQb3J0U2V0dGluZykgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIC8vIEMyTXlQb3J0U2V0dGluZzo6aW5wdXQ6ICBrSW5kZXggfCB0dW4gfCBwb3J0IHwgaW5wdXQgICAgIChhcmdzKQorICAgIC8vIEMyTXlQb3J0U2V0dGluZzo6b3V0cHV0OiBrSW5kZXggfCB0dW4gfCBwb3J0IHwgb3V0cHV0ICAgIChhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJNeVBvcnRTZXR0aW5nOjppbnB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhNeSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVBvcnRTZXR0aW5nOjppbnB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKGtQYXJhbUluZGV4TXkgfCBJOjpLSU5EX1NFVFRJTkcgfCBJOjpESVJfSU5QVVQpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk15UG9ydFNldHRpbmc6Om91dHB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhNeSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVBvcnRTZXR0aW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChrUGFyYW1JbmRleE15IHwgSTo6S0lORF9TRVRUSU5HIHwgSTo6RElSX09VVFBVVCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15UG9ydFNldHRpbmc6OmlucHV0KSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVBvcnRTZXR0aW5nOjpvdXRwdXQpID09IDEyLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlQb3J0U2V0dGluZzo6aW5wdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15UG9ydFNldHRpbmc6OmlucHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVBvcnRTZXR0aW5nOjppbnB1dCwgbU51bWJlcikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlQb3J0U2V0dGluZzo6b3V0cHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVBvcnRTZXR0aW5nOjpvdXRwdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15UG9ydFNldHRpbmc6Om91dHB1dCwgbU51bWJlcikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKworICAgIC8vIEMyTXlTdHJlYW1TZXR0aW5nOiAgICAgICBrSW5kZXggfCB0dW4gfCBzdHIgICAgICAgICAgICAgIChib29sLCB1aW50LCBhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlTdHJlYW1TZXR0aW5nKSA9PSAxMnUsICJiYWQgc2l6ZSIpOworICAgIC8vIEMyTXlTdHJlYW1TZXR0aW5nOjppbnB1dCBrSW5kZXggfCB0dW4gfCBzdHIgfCBpbnB1dCAgICAgIChpbnQsIGFyZ3MpCisgICAgLy8gQzJNeVN0cmVhbVNldHRpbmc6Om91dHB1dCBrSXggICB8IHR1biB8IHN0ciB8IG91dHB1dCAgICAgKGludCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTdHJlYW1TZXR0aW5nOjppbnB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhNeSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVN0cmVhbVNldHRpbmc6OmlucHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoa1BhcmFtSW5kZXhNeSB8IEk6OktJTkRfU0VUVElORyB8IEk6OkRJUl9JTlBVVCB8IEk6OklTX1NUUkVBTV9GTEFHKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVN0cmVhbVNldHRpbmc6Om91dHB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhNeSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVN0cmVhbVNldHRpbmc6Om91dHB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKGtQYXJhbUluZGV4TXkgfCBJOjpLSU5EX1NFVFRJTkcgfCBJOjpESVJfT1VUUFVUIHwgSTo6SVNfU1RSRUFNX0ZMQUcpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVN0cmVhbVNldHRpbmc6OmlucHV0KSA9PSAxMnUsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlTdHJlYW1TZXR0aW5nOjpvdXRwdXQpID09IDEydSwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U3RyZWFtU2V0dGluZzo6aW5wdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U3RyZWFtU2V0dGluZzo6aW5wdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U3RyZWFtU2V0dGluZzo6aW5wdXQsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U3RyZWFtU2V0dGluZzo6b3V0cHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbVNldHRpbmc6Om91dHB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTdHJlYW1TZXR0aW5nOjpvdXRwdXQsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7Cit9CisKK3ZvaWQgX0MyUGFyYW1JbnNwZWN0b3I6OlN0YXRpY0ZsZXhUZXN0KCkgeworICAgIHR5cGVkZWYgQzJQYXJhbTo6SW5kZXggSTsKKworICAgIC8vIEMyTnVtYmVyc1N0cnVjdDogQ09SRV9JTkRFWCA9IGtJbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgKGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNTdHJ1Y3Q6OkNPUkVfSU5ERVggPT0gKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TnVtYmVycyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNTdHJ1Y3QpID09IDAsICJiYWQgc2l6ZSIpOworCisgICAgLy8gQzJOdW1iZXJzVHVuaW5nOiAgICAgICAgICAgICBrSW5kZXggfCB0dW4gfCBnbG9iYWwgICAgICAgICAgIChhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzVHVuaW5nOjpDT1JFX0lOREVYID09IChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNUdW5pbmc6OlBBUkFNX1RZUEUgPT0gKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TnVtYmVycyB8IEk6OktJTkRfVFVOSU5HIHwgSTo6RElSX0dMT0JBTCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNUdW5pbmcpID09IDgsICJiYWQgc2l6ZSIpOworCisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNUdW5pbmcsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNUdW5pbmcsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNUdW5pbmcsIG0ubU51bWJlcnMpID09IDgsICJiYWQgb2Zmc2V0Iik7CisKKyAgICAvLyBDMk51bWJlcnNQb3J0VHVuaW5nOiAgICAgICAgIGtJbmRleCB8IHR1biB8IHBvcnQgICAgICAgICAgICAgKGJvb2wsIGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzUG9ydFR1bmluZykgPT0gOCwgImJhZCBzaXplIik7CisgICAgLy8gQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6ICBrSW5kZXggfCB0dW4gfCBwb3J0IHwgaW5wdXQgICAgIChhcmdzKQorICAgIC8vIEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDoga0luZGV4IHwgdHVuIHwgcG9ydCB8IG91dHB1dCAgICAoYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhOdW1iZXJzKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMgfCBJOjpLSU5EX1RVTklORyB8IEk6OkRJUl9JTlBVVCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TnVtYmVycyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TnVtYmVycyB8IEk6OktJTkRfVFVOSU5HIHwgSTo6RElSX09VVFBVVCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dCkgPT0gOCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0KSA9PSA4LCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dCwgbS5tTnVtYmVycykgPT0gOCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dCwgbS5tTnVtYmVycykgPT0gOCwgImJhZCBvZmZzZXQiKTsKKworICAgIC8vIEMyTnVtYmVyc1N0cmVhbVR1bmluZzogICAgICAga0luZGV4IHwgdHVuIHwgc3RyICAgICAgICAgICAgICAoYm9vbCwgdWludCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNTdHJlYW1UdW5pbmcpID09IDgsICJiYWQgc2l6ZSIpOworICAgIC8vIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQga0luZGV4IHwgdHVuIHwgc3RyIHwgaW5wdXQgICAgICAoaW50LCBhcmdzKQorICAgIC8vIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0IGtJeCAgIHwgdHVuIHwgc3RyIHwgb3V0cHV0ICAgICAoaW50LCBhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TnVtYmVycyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMgfCBJOjpLSU5EX1RVTklORyB8IEk6OkRJUl9JTlBVVCB8IEk6OklTX1NUUkVBTV9GTEFHKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TnVtYmVycyB8IEk6OktJTkRfVFVOSU5HIHwgSTo6RElSX09VVFBVVCB8IEk6OklTX1NUUkVBTV9GTEFHKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQpID09IDgsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0KSA9PSA4LCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dCwgbS5tTnVtYmVycykgPT0gOCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dCwgbS5tTnVtYmVycykgPT0gOCwgImJhZCBvZmZzZXQiKTsKK30KKwordGVtcGxhdGU8Ym9vbCwgdW5zaWduZWQgLi4uTj4KK3N0cnVjdCBfcHJpbnRfYXNfd2FybmluZyB7IH07CisKK3RlbXBsYXRlPHVuc2lnbmVkIC4uLk4+CitzdHJ1Y3QgX3ByaW50X2FzX3dhcm5pbmc8dHJ1ZSwgTi4uLj4gOiBzdGQ6OnRydWVfdHlwZSB7IH07CisKKyNkZWZpbmUgc3RhdGljX2Fzc2VydF9lcXVhbHMoYSwgYiwgbXNnKSBcCitzdGF0aWNfYXNzZXJ0KF9wcmludF9hc193YXJuaW5nPChhKSA9PSAoYiksIGEsIGI+Ojp2YWx1ZSwgbXNnKQorCit2b2lkIF9DMlBhcmFtSW5zcGVjdG9yOjpTdGF0aWNGbGV4RnJvbUJhc2VUZXN0KCkgeworICAgIGVudW0geyBrUGFyYW1JbmRleE15ID0gMTIwMyB9OworICAgIHR5cGVkZWYgQzJUZXN0QmFzZUZsZXhFbmRTaXplU3RydWN0IEMyTXlTdHJ1Y3Q7CisgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJNeVN0cnVjdCwga1BhcmFtSW5kZXhNeT4gQzJNeUluZm87CisgICAgdHlwZWRlZiAgIEMyUG9ydFBhcmFtPEMySW5mbywgQzJNeVN0cnVjdCwga1BhcmFtSW5kZXhNeT4gQzJNeVBvcnRJbmZvOworICAgIHR5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyTXlTdHJ1Y3QsIGtQYXJhbUluZGV4TXk+IEMyTXlTdHJlYW1JbmZvOworCisgICAgdHlwZWRlZiBDMlBhcmFtOjpJbmRleCBJOworCisgICAgLy8gQzJNeVN0cnVjdCBoYXMgbm8gQ09SRV9JTkRFWAorICAgIC8vc3RhdGljX2Fzc2VydChDMk15U3RydWN0OjpDT1JFX0lOREVYID09IChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE15KSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlTdHJ1Y3QpID09IDQsICJiYWQgc2l6ZSIpOworCisgICAgLy8gQzJNeUluZm86ICAgICAgICAgICAgIGtJbmRleCB8IHR1biB8IGdsb2JhbCAgICAgICAgICAgKGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydF9lcXVhbHMoQzJNeUluZm86OkNPUkVfSU5ERVgsIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE15KSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnRfZXF1YWxzKEMyTXlJbmZvOjpQQVJBTV9UWVBFLCAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSB8IEk6OktJTkRfSU5GTyB8IEk6OkRJUl9HTE9CQUwpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeUluZm8pID09IDEyLCAiYmFkIHNpemUiKTsKKworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeUluZm8sIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15SW5mbywgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlJbmZvLCBtLnNpZ25lZDMyKSA9PSA4LCAiYmFkIG9mZnNldCIpOworCisgICAgLy8gQzJNeVBvcnRJbmZvOiAgICAgICAgIGtJbmRleCB8IHR1biB8IHBvcnQgICAgICAgICAgICAgKGJvb2wsIGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVBvcnRJbmZvKSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgLy8gQzJNeVBvcnRJbmZvOjppbnB1dDogIGtJbmRleCB8IHR1biB8IHBvcnQgfCBpbnB1dCAgICAgKGFyZ3MpCisgICAgLy8gQzJNeVBvcnRJbmZvOjpvdXRwdXQ6IGtJbmRleCB8IHR1biB8IHBvcnQgfCBvdXRwdXQgICAgKGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChDMk15UG9ydEluZm86OmlucHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlQb3J0SW5mbzo6aW5wdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE15IHwgSTo6S0lORF9JTkZPIHwgSTo6RElSX0lOUFVUKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVBvcnRJbmZvOjpvdXRwdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE15KSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVBvcnRJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE15IHwgSTo6S0lORF9JTkZPIHwgSTo6RElSX09VVFBVVCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15UG9ydEluZm86OmlucHV0KSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVBvcnRJbmZvOjpvdXRwdXQpID09IDEyLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlQb3J0SW5mbzo6aW5wdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15UG9ydEluZm86OmlucHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVBvcnRJbmZvOjppbnB1dCwgbS5zaWduZWQzMikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlQb3J0SW5mbzo6b3V0cHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVBvcnRJbmZvOjpvdXRwdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15UG9ydEluZm86Om91dHB1dCwgbS5zaWduZWQzMikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKworICAgIC8vIEMyTXlTdHJlYW1JbmZvOiAgICAgICBrSW5kZXggfCB0dW4gfCBzdHIgICAgICAgICAgICAgIChib29sLCB1aW50LCBhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlTdHJlYW1JbmZvKSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgLy8gQzJNeVN0cmVhbUluZm86OmlucHV0IGtJbmRleCB8IHR1biB8IHN0ciB8IGlucHV0ICAgICAgKGludCwgYXJncykKKyAgICAvLyBDMk15U3RyZWFtSW5mbzo6b3V0cHV0IGtJeCAgIHwgdHVuIHwgc3RyIHwgb3V0cHV0ICAgICAoaW50LCBhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJNeVN0cmVhbUluZm86OmlucHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTdHJlYW1JbmZvOjppbnB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TXkgfCBJOjpLSU5EX0lORk8gfCBJOjpESVJfSU5QVVQgfCBJOjpJU19TVFJFQU1fRkxBRyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTdHJlYW1JbmZvOjpvdXRwdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE15KSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVN0cmVhbUluZm86Om91dHB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TXkgfCBJOjpLSU5EX0lORk8gfCBJOjpESVJfT1VUUFVUIHwgSTo6SVNfU1RSRUFNX0ZMQUcpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVN0cmVhbUluZm86OmlucHV0KSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVN0cmVhbUluZm86Om91dHB1dCkgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbUluZm86OmlucHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbUluZm86OmlucHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbUluZm86OmlucHV0LCBtLnNpZ25lZDMyKSA9PSA4LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbUluZm86Om91dHB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTdHJlYW1JbmZvOjpvdXRwdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U3RyZWFtSW5mbzo6b3V0cHV0LCBtLnNpZ25lZDMyKSA9PSA4LCAiYmFkIG9mZnNldCIpOworfQorCitURVNUX0YoQzJQYXJhbVRlc3QsIFBhcmFtT3BzVGVzdCkgeworICAgIGNvbnN0IEMyTnVtYmVyU3RydWN0IHN0cigxMDApOworICAgIEMyTnVtYmVyU3RydWN0IGJzdHI7CisKKyAgICB7CisgICAgICAgIEVYUEVDVF9FUSgxMDAsIHN0ci5tTnVtYmVyKTsKKyAgICAgICAgYnN0ci5tTnVtYmVyID0gMTAwOworCisgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCA9IEMyTnVtYmVyU3RydWN0OjpDT1JFX0lOREVYOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgfQorCisgICAgY29uc3QgQzJOdW1iZXJUdW5pbmcgdHVuKDEwMCk7CisgICAgQzJOdW1iZXJUdW5pbmcgYnR1bjsKKworICAgIHsKKyAgICAgIEMyTnVtYmVySW5mbyBpbmYoMTAwKTsKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMk51bWJlcnNUdW5pbmc+IHR1bl8gPSBDMk51bWJlcnNUdW5pbmc6OkFsbG9jVW5pcXVlKDEpOworCisgICAgICBFWFBFQ1RfRVEodHVuLmNvcmVJbmRleCgpLCBpbmYuY29yZUluZGV4KCkpOworICAgICAgRVhQRUNUX05FKHR1bi5jb3JlSW5kZXgoKSwgdHVuXy0+Y29yZUluZGV4KCkpOworICAgICAgRVhQRUNUX05FKHR1bi50eXBlKCksIGluZi50eXBlKCkpOworICAgICAgRVhQRUNUX05FKHR1bi50eXBlKCksIHR1bl8tPnR5cGUoKSk7CisgICAgfQorCisgICAgeworICAgICAgICAvLyBmbGFncyAmIGludmFyaWFibGVzCisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgdHVuLCBidHVuIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKXApOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCFwKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAuc2l6ZSgpKTsKKworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNWZW5kb3IoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0ZsZXhpYmxlKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yT3V0cHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yUG9ydCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZhbHVlCisgICAgICAgIEVYUEVDVF9FUSgxMDAsIHR1bi5tTnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJ0dW4ubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0dW4gPT0gYnR1bik7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0dW4ub3BlcmF0b3I9PShidHVuKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR1biAhPSBidHVuKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHVuLm9wZXJhdG9yIT0oYnR1bikpOworICAgICAgICBidHVuLm1OdW1iZXIgPSAxMDA7CisgICAgICAgIEVYUEVDVF9FUSh0dW4sIGJ0dW4pOworCisgICAgICAgIC8vIGluZGV4CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKHR1bi50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlclN0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKHR1bi50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSh0dW4udHlwZSgpLCBDMk51bWJlclR1bmluZzo6UEFSQU1fVFlQRSk7CisgICAgICAgIEVYUEVDVF9FUSh0dW4uc3RyZWFtKCksIH4wdSk7CisKKyAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4ID0gQzJOdW1iZXJUdW5pbmc6OkNPUkVfSU5ERVg7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC5jb3JlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXgudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKworICAgICAgICBDMlBhcmFtOjpUeXBlIHR5cGUgPSBDMk51bWJlclR1bmluZzo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuaXNHbG9iYWwoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JPdXRwdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yUG9ydCgpKTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20oJnR1biksICZ0dW4pOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKCZ0dW4pLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oJnR1biksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oJnR1biksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OkZyb20oJnR1biksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKCZ0dW4pLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJnR1biksIG51bGxwdHIpOworCisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoYnR1bikpLCBidHVuKTsKKyAgICAgICAgYnR1bi5pbnZhbGlkYXRlKCk7CisgICAgICAgIEVYUEVDVF9GQUxTRShDMlBhcmFtOjpDb3B5KGJ0dW4pKTsKKyAgICB9CisKKyAgICBjb25zdCBDMk51bWJlclBvcnRUdW5pbmcgb3V0cDEodHJ1ZSwgMTAwKSwgaW5wMShmYWxzZSwgMTAwKTsKKyAgICBDMk51bWJlclBvcnRUdW5pbmcgYm91dHAxLCBiaW5wMSwgYmlucDMoZmFsc2UsIDEwMCk7CisgICAgY29uc3QgQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dCBpbnAyKDEwMCk7CisgICAgQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dCBiaW5wMjsKKyAgICBjb25zdCBDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dCBvdXRwMigxMDApOworICAgIEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0IGJvdXRwMjsKKworICAgIEVYUEVDVF9FUShpbnAxLmNvcmVJbmRleCgpLCB0dW4uY29yZUluZGV4KCkpOworICAgIEVYUEVDVF9FUShvdXRwMS5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKyAgICBFWFBFQ1RfRVEoYmlucDEuY29yZUluZGV4KCksIHR1bi5jb3JlSW5kZXgoKSk7CisgICAgRVhQRUNUX0VRKGJvdXRwMS5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKyAgICBFWFBFQ1RfRVEoaW5wMi5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKyAgICBFWFBFQ1RfRVEob3V0cDIuY29yZUluZGV4KCksIHR1bi5jb3JlSW5kZXgoKSk7CisKKyAgICBFWFBFQ1RfRVEoaW5wMS50eXBlKCksIGlucDIudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEob3V0cDEudHlwZSgpLCBvdXRwMi50eXBlKCkpOworICAgIEVYUEVDVF9ORShpbnAxLnR5cGUoKSwgb3V0cDEudHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUoaW5wMi50eXBlKCksIG91dHAyLnR5cGUoKSk7CisgICAgRVhQRUNUX05FKGlucDEudHlwZSgpLCBiaW5wMS50eXBlKCkpOworICAgIEVYUEVDVF9ORShvdXRwMS50eXBlKCksIGJvdXRwMS50eXBlKCkpOworICAgIEVYUEVDVF9ORShpbnAxLnR5cGUoKSwgdHVuLnR5cGUoKSk7CisgICAgRVhQRUNUX05FKGlucDIudHlwZSgpLCB0dW4udHlwZSgpKTsKKworICAgIHsKKyAgICAgICAgc3RhdGljX2Fzc2VydChjYW5DYWxsU2V0UG9ydChiaW5wMyksICJzaG91bGQgYmUgYWJsZSB0byIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KGNhbkNhbGxTZXRQb3J0KGJpbnAxKSwgInNob3VsZCBiZSBhYmxlIHRvIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KGlucDEpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvIChjb25zdCkiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoaW5wMiksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKGNvbnN0ICYgdHlwZSkiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoYmlucDIpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvICh0eXBlKSIpOworCisgICAgICAgIC8vIGZsYWdzICYgaW52YXJpYWJsZXMKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBvdXRwMSwgaW5wMSwgYm91dHAxIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAuc2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JQb3J0KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgaW5wMiwgYmlucDIgfSkgeworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNWZW5kb3IoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0ZsZXhpYmxlKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLmZvclBvcnQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBvdXRwMiwgYm91dHAyIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAuc2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JQb3J0KCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcG9ydCBzcGVjaWZpYyBmbGFncyAmIGludmFyaWFibGVzCisgICAgICAgIEVYUEVDVF9GQUxTRShvdXRwMS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0cDEuZm9yT3V0cHV0KCkpOworCisgICAgICAgIEVYUEVDVF9UUlVFKGlucDEuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbnAxLmZvck91dHB1dCgpKTsKKworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IG91dHAxLCBpbnAxIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKXApOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCFwKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMDAsIHAubU51bWJlcik7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBvdXRwMiwgYm91dHAyIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKXApOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCFwKTsKKworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLmZvck91dHB1dCgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IGlucDIsIGJpbnAyIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKXApOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCFwKTsKKworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JJbnB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvck91dHB1dCgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IGJvdXRwMSB9ICkgeworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKChib29sKXApOworICAgICAgICAgICAgRVhQRUNUX1RSVUUoIXApOworCisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JJbnB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvck91dHB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgwLCBwLm1OdW1iZXIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdmFsdWVzCisgICAgICAgIEVYUEVDVF9FUSgxMDAsIGlucDIubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSgxMDAsIG91dHAyLm1OdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoMCwgYmlucDEubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBiaW5wMi5tTnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJvdXRwMS5tTnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJvdXRwMi5tTnVtYmVyKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShpbnAxICE9IG91dHAxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5wMSA9PSBpbnAyKTsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0cDEgPT0gb3V0cDIpOworICAgICAgICBFWFBFQ1RfVFJVRShiaW5wMSA9PSBib3V0cDEpOworICAgICAgICBFWFBFQ1RfVFJVRShiaW5wMiAhPSBib3V0cDIpOworCisgICAgICAgIEVYUEVDVF9UUlVFKGlucDEgIT0gYmlucDEpOworICAgICAgICBiaW5wMS5tTnVtYmVyID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRShpbnAxICE9IGJpbnAxKTsKKyAgICAgICAgYmlucDEuc2V0UG9ydChmYWxzZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbCliaW5wMSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSghYmlucDEpOworICAgICAgICBFWFBFQ1RfVFJVRShpbnAxID09IGJpbnAxKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShpbnAyICE9IGJpbnAyKTsKKyAgICAgICAgYmlucDIubU51bWJlciA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5wMiA9PSBiaW5wMik7CisKKyAgICAgICAgYmlucDEuc2V0UG9ydCh0cnVlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHAxID09IGJpbnAxKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShvdXRwMSAhPSBib3V0cDEpOworICAgICAgICBib3V0cDEubU51bWJlciA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0cDEgIT0gYm91dHAxKTsKKyAgICAgICAgYm91dHAxLnNldFBvcnQodHJ1ZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbClib3V0cDEpOworICAgICAgICBFWFBFQ1RfRkFMU0UoIWJvdXRwMSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHAxID09IGJvdXRwMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0cDIgIT0gYm91dHAyKTsKKyAgICAgICAgYm91dHAyLm1OdW1iZXIgPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHAyID09IGJvdXRwMik7CisKKyAgICAgICAgYm91dHAxLnNldFBvcnQoZmFsc2UgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5wMSA9PSBib3V0cDEpOworCisgICAgICAgIC8vIGluZGV4CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDEudHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnAxLnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGlucDEudHlwZSgpLCBDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKyAgICAgICAgRVhQRUNUX0VRKGlucDEuc3RyZWFtKCksIH4wdSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5wMi50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlclN0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDIudHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoaW5wMi50eXBlKCksIEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpOworICAgICAgICBFWFBFQ1RfRVEoaW5wMi5zdHJlYW0oKSwgfjB1KTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRwMS50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlclN0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHAxLnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHAxLnR5cGUoKSwgQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworICAgICAgICBFWFBFQ1RfRVEob3V0cDEuc3RyZWFtKCksIH4wdSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0cDIudHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRwMi50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShvdXRwMi50eXBlKCksIEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHAyLnN0cmVhbSgpLCB+MHUpOworCisgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCA9IEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC5jb3JlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXgudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKworICAgICAgICBpbmRleCA9IEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisKKyAgICAgICAgQzJQYXJhbTo6VHlwZSB0eXBlID0gQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzR2xvYmFsKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JPdXRwdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JQb3J0KCkpOworCisgICAgICAgIHR5cGUgPSBDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzR2xvYmFsKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JPdXRwdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JQb3J0KCkpOworCisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclR1bmluZzo6RnJvbSgmaW5wMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20oJmlucDIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKCZvdXRwMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20oJm91dHAyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20oJmlucDEpLCAmaW5wMSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20oJmlucDIpLCAoQzJOdW1iZXJQb3J0VHVuaW5nKikmaW5wMik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20oJm91dHAxKSwgJm91dHAxKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbSgmb3V0cDIpLCAoQzJOdW1iZXJQb3J0VHVuaW5nKikmb3V0cDIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6RnJvbSgmaW5wMSksIChDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0KikmaW5wMSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKCZpbnAyKSwgJmlucDIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6RnJvbSgmb3V0cDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oJm91dHAyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbSgmaW5wMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oJmlucDIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKCZvdXRwMSksIChDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dCopJm91dHAxKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKCZvdXRwMiksICZvdXRwMik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6RnJvbSgmaW5wMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OkZyb20oJmlucDIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpGcm9tKCZvdXRwMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OkZyb20oJm91dHAyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oJmlucDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmaW5wMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKCZvdXRwMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKCZvdXRwMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbSgmaW5wMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbSgmaW5wMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbSgmb3V0cDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJm91dHAyKSwgbnVsbHB0cik7CisKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weShpbnAxKSksIGlucDEpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KGlucDIpKSwgaW5wMik7CisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkob3V0cDEpKSwgb3V0cDEpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KG91dHAyKSksIG91dHAyKTsKKyAgICB9CisKKyAgICBjb25zdCBDMk51bWJlclN0cmVhbVR1bmluZyBvdXRzMSh0cnVlLCAxdSwgMTAwKSwgaW5zMShmYWxzZSwgMXUsIDEwMCk7CisgICAgQzJOdW1iZXJTdHJlYW1UdW5pbmcgYm91dHMxLCBiaW5zMSwgYmluczMoZmFsc2UsIDF1LCAxMDApOworICAgIGNvbnN0IEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dCBpbnMyKDF1LCAxMDApOworICAgIEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dCBiaW5zMjsKKyAgICBjb25zdCBDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0IG91dHMyKDF1LCAxMDApOworICAgIEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQgYm91dHMyOworCisgICAgRVhQRUNUX0VRKGluczEuY29yZUluZGV4KCksIHR1bi5jb3JlSW5kZXgoKSk7CisgICAgRVhQRUNUX0VRKG91dHMxLmNvcmVJbmRleCgpLCB0dW4uY29yZUluZGV4KCkpOworICAgIEVYUEVDVF9FUShiaW5zMS5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKyAgICBFWFBFQ1RfRVEoYm91dHMxLmNvcmVJbmRleCgpLCB0dW4uY29yZUluZGV4KCkpOworICAgIEVYUEVDVF9FUShpbnMyLmNvcmVJbmRleCgpLCB0dW4uY29yZUluZGV4KCkpOworICAgIEVYUEVDVF9FUShvdXRzMi5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKworICAgIEVYUEVDVF9FUShpbnMxLnR5cGUoKSwgaW5zMi50eXBlKCkpOworICAgIEVYUEVDVF9FUShpbnMxLnR5cGUoKSwgYmluczIudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEob3V0czEudHlwZSgpLCBvdXRzMi50eXBlKCkpOworICAgIEVYUEVDVF9FUShvdXRzMS50eXBlKCksIGJvdXRzMi50eXBlKCkpOworICAgIEVYUEVDVF9ORShpbnMxLnR5cGUoKSwgb3V0czEudHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUoaW5zMi50eXBlKCksIG91dHMyLnR5cGUoKSk7CisgICAgRVhQRUNUX05FKGluczEudHlwZSgpLCBiaW5zMS50eXBlKCkpOworICAgIEVYUEVDVF9ORShvdXRzMS50eXBlKCksIGJvdXRzMS50eXBlKCkpOworICAgIEVYUEVDVF9ORShpbnMxLnR5cGUoKSwgdHVuLnR5cGUoKSk7CisgICAgRVhQRUNUX05FKGluczIudHlwZSgpLCB0dW4udHlwZSgpKTsKKworICAgIHsKKyAgICAgICAgc3RhdGljX2Fzc2VydChjYW5DYWxsU2V0UG9ydChiaW5zMyksICJzaG91bGQgYmUgYWJsZSB0byIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KGNhbkNhbGxTZXRQb3J0KGJpbnMxKSwgInNob3VsZCBiZSBhYmxlIHRvIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KGluczEpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvIChjb25zdCkiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoaW5zMiksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKGNvbnN0ICYgdHlwZSkiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoYmluczIpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvICh0eXBlKSIpOworCisgICAgICAgIC8vIGZsYWdzICYgaW52YXJpYWJsZXMKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBvdXRzMSwgaW5zMSwgYm91dHMxIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAuc2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JQb3J0KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgaW5zMiwgYmluczIgfSkgeworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNWZW5kb3IoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0ZsZXhpYmxlKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLmZvclN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvclBvcnQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBvdXRzMiwgYm91dHMyIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAuc2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JQb3J0KCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcG9ydCBzcGVjaWZpYyBmbGFncyAmIGludmFyaWFibGVzCisgICAgICAgIEVYUEVDVF9GQUxTRShvdXRzMS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0czEuZm9yT3V0cHV0KCkpOworCisgICAgICAgIEVYUEVDVF9UUlVFKGluczEuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbnMxLmZvck91dHB1dCgpKTsKKworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IG91dHMxLCBpbnMxIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKXApOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCFwKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMDAsIHAubU51bWJlcik7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMXUsIHAuc3RyZWFtKCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgb3V0czIsIGJvdXRzMiB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbClwKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghcCk7CisKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JPdXRwdXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBpbnMyLCBiaW5zMiB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbClwKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghcCk7CisKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JPdXRwdXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBib3V0czEgfSApIHsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSgoYm9vbClwKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKCFwKTsKKworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JPdXRwdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMCwgcC5tTnVtYmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZhbHVlcworICAgICAgICBFWFBFQ1RfRVEoMTAwLCBpbnMyLm1OdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoMTAwLCBvdXRzMi5tTnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJpbnMxLm1OdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoMCwgYmluczIubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBib3V0czEubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBib3V0czIubU51bWJlcik7CisKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBpbnMyLnN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBvdXRzMi5zdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9FUSgwdSwgYmluczEuc3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRVEoMHUsIGJpbnMyLnN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBib3V0czEuc3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRVEoMHUsIGJvdXRzMi5zdHJlYW0oKSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5zMSAhPSBvdXRzMSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGluczEgPT0gaW5zMik7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHMxID09IG91dHMyKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoYmluczEgPT0gYm91dHMxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoYmluczIgIT0gYm91dHMyKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShpbnMxICE9IGJpbnMxKTsKKyAgICAgICAgYmluczEubU51bWJlciA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5zMSAhPSBiaW5zMSk7CisgICAgICAgIGJpbnMxLnNldFBvcnQoZmFsc2UgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5zMSAhPSBiaW5zMSk7CisgICAgICAgIGJpbnMxLnNldFN0cmVhbSgxdSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGluczEgPT0gYmluczEpOworCisgICAgICAgIEVYUEVDVF9UUlVFKGluczIgIT0gYmluczIpOworICAgICAgICBiaW5zMi5tTnVtYmVyID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRShpbnMyICE9IGJpbnMyKTsKKyAgICAgICAgYmluczIuc2V0U3RyZWFtKDF1KTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5zMiA9PSBiaW5zMik7CisKKyAgICAgICAgYmluczEuc2V0UG9ydCh0cnVlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHMxID09IGJpbnMxKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShvdXRzMSAhPSBib3V0czEpOworICAgICAgICBib3V0czEubU51bWJlciA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0czEgIT0gYm91dHMxKTsKKyAgICAgICAgYm91dHMxLnNldFBvcnQodHJ1ZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRzMSAhPSBib3V0czEpOworICAgICAgICBib3V0czEuc2V0U3RyZWFtKDF1KTsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0czEgPT0gYm91dHMxKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShvdXRzMiAhPSBib3V0czIpOworICAgICAgICBib3V0czIubU51bWJlciA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0czIgIT0gYm91dHMyKTsKKyAgICAgICAgYm91dHMyLnNldFN0cmVhbSgxdSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHMyID09IGJvdXRzMik7CisKKyAgICAgICAgYm91dHMxLnNldFBvcnQoZmFsc2UgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5zMSA9PSBib3V0czEpOworCisgICAgICAgIC8vIGluZGV4CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGluczEudHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnMxLnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGluczEudHlwZSgpLCBDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGluczIudHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnMyLnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGluczIudHlwZSgpLCBDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHMxLnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0czEudHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEob3V0czEudHlwZSgpLCBDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRzMi50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlclN0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHMyLnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHMyLnR5cGUoKSwgQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisKKyAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4ID0gQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisKKyAgICAgICAgaW5kZXggPSBDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisKKyAgICAgICAgQzJQYXJhbTo6VHlwZSB0eXBlID0gQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNHbG9iYWwoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvck91dHB1dCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JTdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclBvcnQoKSk7CisKKyAgICAgICAgdHlwZSA9IEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0dsb2JhbCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yT3V0cHV0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvclN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yUG9ydCgpKTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20oJmluczEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKCZpbnMyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclR1bmluZzo6RnJvbSgmb3V0czEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKCZvdXRzMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKCZpbnMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20oJmluczIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbSgmb3V0czEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbSgmb3V0czIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oJmluczEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oJmluczIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oJm91dHMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKCZvdXRzMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oJmluczEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKCZpbnMyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbSgmb3V0czEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKCZvdXRzMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OkZyb20oJmluczEpLCAmaW5zMSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6RnJvbSgmaW5zMiksIChDMk51bWJlclN0cmVhbVR1bmluZyopJmluczIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OkZyb20oJm91dHMxKSwgJm91dHMxKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpGcm9tKCZvdXRzMiksIChDMk51bWJlclN0cmVhbVR1bmluZyopJm91dHMyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmaW5zMSksIChDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQqKSZpbnMxKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmaW5zMiksICZpbnMyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmb3V0czEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmb3V0czIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJmluczEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJmluczIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJm91dHMxKSwgKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQqKSZvdXRzMSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKCZvdXRzMiksICZvdXRzMik7CisKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weShpbnMxKSksIGluczEpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KGluczIpKSwgaW5zMik7CisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkob3V0czEpKSwgb3V0czEpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KG91dHMyKSksIG91dHMyKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZpZGVvV2lkdGhbXSA9IHsgMTJ1LCBDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFLCAxMDAgfTsKKyAgICAgICAgQzJQYXJhbSAqcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIHNpemVvZih2aWRlb1dpZHRoKSk7CisgICAgICAgIEVYUEVDVF9ORShwMSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAxLT5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEocDEtPnR5cGUoKSwgQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisKKyAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIHNpemVvZih2aWRlb1dpZHRoKSArIDIpOworICAgICAgICBFWFBFQ1RfRVEocDEsIG51bGxwdHIpOworCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkgLSAyKTsKKyAgICAgICAgRVhQRUNUX0VRKHAxLCBudWxscHRyKTsKKworICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgMyk7CisgICAgICAgIEVYUEVDVF9FUShwMSwgbnVsbHB0cik7CisKKyAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIDApOworICAgICAgICBFWFBFQ1RfRVEocDEsIG51bGxwdHIpOworICAgIH0KK30KKwordm9pZCBTdGF0aWNUZXN0QWRkQ29yZUluZGV4KCkgeworICAgIHN0cnVjdCBub2Jhc2Uge307CisgICAgc3RydWN0IGJhc2UgeyBlbnVtIDogdWludDMyX3QgeyBDT1JFX0lOREVYID0gMSB9OyB9OworICAgIHN0YXRpY19hc3NlcnQoX0MyQWRkQ29yZUluZGV4PG5vYmFzZSwgMj46OkNPUkVfSU5ERVggPT0gMiwgInNob3VsZCBiZSAyIik7CisgICAgc3RhdGljX2Fzc2VydChfQzJBZGRDb3JlSW5kZXg8YmFzZSwgMT46OkNPUkVfSU5ERVggPT0gMSwgInNob3VsZCBiZSAxIik7Cit9CisKK2NsYXNzIFRlc3RGbGV4SGVscGVyIHsKKyAgICBzdHJ1Y3QgX0ZsZXggeworICAgICAgICBpbnQzMl90IGE7CisgICAgICAgIGNoYXIgYltdOworICAgICAgICBfRmxleCgpIHt9CisgICAgICAgIEZMRVgoX0ZsZXgsIGIpOworICAgIH07CisKKyAgICBzdHJ1Y3QgX0JvRmxleCB7CisgICAgICAgIF9GbGV4IGE7CisgICAgICAgIF9Cb0ZsZXgoKSB7fQorICAgICAgICBGTEVYKF9Cb0ZsZXgsIGEpOworICAgIH07CisKKyAgICBzdHJ1Y3QgX05vbkZsZXggeworICAgIH07CisKKworICAgIHN0YXRpYyB2b2lkIFN0YXRpY1Rlc3QoKSB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPF9DMkZsZXhIZWxwZXI8Y2hhcj46OkZsZXhUeXBlLCB2b2lkPjo6dmFsdWUsICJzaG91bGQgYmUgdm9pZCIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxfQzJGbGV4SGVscGVyPGNoYXJbXT46OkZsZXhUeXBlLCBjaGFyPjo6dmFsdWUsICJzaG91bGQgYmUgY2hhciIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxfQzJGbGV4SGVscGVyPF9GbGV4Pjo6RmxleFR5cGUsIGNoYXI+Ojp2YWx1ZSwgInNob3VsZCBiZSBjaGFyIik7CisKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8X0MyRmxleEhlbHBlcjxfQm9GbGV4Pjo6RmxleFR5cGUsIGNoYXI+Ojp2YWx1ZSwgInNob3VsZCBiZSB2b2lkIik7CisKKyAgICAgICAgc3RhdGljX2Fzc2VydChfQzJGbGV4aWJsZTxfRmxleD46OnZhbHVlLCAic2hvdWxkIGJlIGZsZXhpYmxlIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIV9DMkZsZXhpYmxlPF9Ob25GbGV4Pjo6dmFsdWUsICJzaG91bGQgbm90IGJlIGZsZXhpYmxlIik7CisgICAgfQorfTsKKworVEVTVF9GKEMyUGFyYW1UZXN0LCBGbGV4UGFyYW1PcHNUZXN0KSB7CisvLyAgICBjb25zdCBDMk51bWJlcnNTdHJ1Y3Qgc3RyezEwMH07CisgICAgQzJOdW1iZXJzU3RydWN0IGJzdHI7CisgICAgeworLy8gICAgICAgIEVYUEVDVF9FUSgxMDAsIHN0ci0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgICh2b2lkKSZic3RyLm1OdW1iZXJzWzBdOworCisgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCA9IEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWDsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyB8IEMyUGFyYW06OkNvcmVJbmRleDo6SVNfRkxFWF9GTEFHKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMk51bWJlcnNUdW5pbmc+IHR1bl8gPSBDMk51bWJlcnNUdW5pbmc6OkFsbG9jVW5pcXVlKDEpOworICAgIHR1bl8tPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyTnVtYmVyc1R1bmluZz4gdHVuID0gc3RkOjptb3ZlKHR1bl8pOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk51bWJlcnNUdW5pbmc+IGJ0dW4gPSBDMk51bWJlcnNUdW5pbmc6OkFsbG9jU2hhcmVkKDEpOworCisgICAgeworICAgICAgICAvLyBmbGFncyAmIGludmFyaWFibGVzCisgICAgICAgIGNvbnN0IEMyTnVtYmVyc1R1bmluZyAqVFtdID0geyB0dW4uZ2V0KCksIGJ0dW4uZ2V0KCkgfTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBUKSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbCkoKnApKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghKCpwKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLT5zaXplKCkpOworCisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNWZW5kb3IoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5pc0ZsZXhpYmxlKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+aXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yT3V0cHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvclN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JQb3J0KCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdmFsdWUKKyAgICAgICAgRVhQRUNUX0VRKDEwMCwgdHVuLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJ0dW4tPm0ubU51bWJlcnNbMF0pOworICAgICAgICBFWFBFQ1RfRkFMU0UoKnR1biA9PSAqYnR1bik7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0dW4tPm9wZXJhdG9yPT0oKmJ0dW4pKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKnR1biAhPSAqYnR1bik7CisgICAgICAgIEVYUEVDVF9UUlVFKHR1bi0+b3BlcmF0b3IhPSgqYnR1bikpOworICAgICAgICBidHVuLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgICAgICBFWFBFQ1RfRVEoKnR1biwgKmJ0dW4pOworCisgICAgICAgIC8vIGluZGV4CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKHR1bi0+dHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJzU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUodHVuLT50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworICAgICAgICBFWFBFQ1RfRVEodHVuLT50eXBlKCksIEMyTnVtYmVyc1R1bmluZzo6UEFSQU1fVFlQRSk7CisgICAgICAgIEVYUEVDVF9FUSh0dW4tPnN0cmVhbSgpLCB+MHUpOworCisgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCA9IEMyTnVtYmVyc1R1bmluZzo6Q09SRV9JTkRFWDsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyB8IEMyUGFyYW06OkNvcmVJbmRleDo6SVNfRkxFWF9GTEFHKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworCisgICAgICAgIEMyUGFyYW06OlR5cGUgdHlwZSA9IEMyTnVtYmVyc1R1bmluZzo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5pc0dsb2JhbCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvck91dHB1dCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yU3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JQb3J0KCkpOworCisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNUdW5pbmc6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKHR1bi5nZXQoKSksIHR1bi5nZXQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKHR1bi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20odHVuLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20odHVuLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkZyb20odHVuLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKHR1bi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20odHVuLmdldCgpKSwgbnVsbHB0cik7CisKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weSgqdHVuKSksICp0dW4pOworICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMk51bWJlcnNQb3J0VHVuaW5nPiBvdXRwMV8oQzJOdW1iZXJzUG9ydFR1bmluZzo6QWxsb2NVbmlxdWUoMSwgdHJ1ZSkpLAorICAgICAgICAgICAgaW5wMV8gPSBDMk51bWJlcnNQb3J0VHVuaW5nOjpBbGxvY1VuaXF1ZSgxLCBmYWxzZSk7CisgICAgb3V0cDFfLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgIGlucDFfLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNQb3J0VHVuaW5nPiBvdXRwMSA9IHN0ZDo6bW92ZShvdXRwMV8pOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNQb3J0VHVuaW5nPiBpbnAxID0gc3RkOjptb3ZlKGlucDFfKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzUG9ydFR1bmluZz4gYm91dHAxKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkFsbG9jU2hhcmVkKDEpKSwKKyAgICAgICAgICAgIGJpbnAxID0gQzJOdW1iZXJzUG9ydFR1bmluZzo6QWxsb2NTaGFyZWQoMSksCisgICAgICAgICAgICBiaW5wMyA9IEMyTnVtYmVyc1BvcnRUdW5pbmc6OkFsbG9jU2hhcmVkKDEsIGZhbHNlKTsKKyAgICBiaW5wMy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ+IGlucDJfKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpBbGxvY1VuaXF1ZSgxKSk7CisgICAgaW5wMl8tPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0PiBpbnAyID0gc3RkOjptb3ZlKGlucDJfKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ+IGJpbnAyKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpBbGxvY1NoYXJlZCgxKSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dD4gb3V0cDJfKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6QWxsb2NVbmlxdWUoMSkpOworICAgIG91dHAyXy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0PiBvdXRwMiA9IHN0ZDo6bW92ZShvdXRwMl8pOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ+IGJvdXRwMihDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKDEpKTsKKworICAgIHsKKyAgICAgICAgc3RhdGljX2Fzc2VydChjYW5DYWxsU2V0UG9ydCgqYmlucDMpLCAic2hvdWxkIGJlIGFibGUgdG8iKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChjYW5DYWxsU2V0UG9ydCgqYmlucDEpLCAic2hvdWxkIGJlIGFibGUgdG8iKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoKmlucDEpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvIChjb25zdCkiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoKmlucDIpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvIChjb25zdCAmIHR5cGUpIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KCpiaW5wMiksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKHR5cGUpIik7CisKKyAgICAgICAgLy8gZmxhZ3MgJiBpbnZhcmlhYmxlcworICAgICAgICBjb25zdCBDMk51bWJlcnNQb3J0VHVuaW5nICpQW10gPSB7IG91dHAxLmdldCgpLCBpbnAxLmdldCgpLCBib3V0cDEuZ2V0KCkgfTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBQKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLT5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+aXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5mb3JQb3J0KCkpOworICAgICAgICB9CisgICAgICAgIGNvbnN0IEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0ICpQSVtdID0geyBpbnAyLmdldCgpLCBiaW5wMi5nZXQoKSB9OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFBJKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLT5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+aXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5mb3JQb3J0KCkpOworICAgICAgICB9CisgICAgICAgIGNvbnN0IEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dCAqUE9bXSA9IHsgb3V0cDIuZ2V0KCksIGJvdXRwMi5nZXQoKSB9OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFBPKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLT5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+aXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5mb3JQb3J0KCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcG9ydCBzcGVjaWZpYyBmbGFncyAmIGludmFyaWFibGVzCisgICAgICAgIEVYUEVDVF9GQUxTRShvdXRwMS0+Zm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHAxLT5mb3JPdXRwdXQoKSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5wMS0+Zm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbnAxLT5mb3JPdXRwdXQoKSk7CisKKyAgICAgICAgY29uc3QgQzJOdW1iZXJzUG9ydFR1bmluZyAqUDJbXSA9IHsgb3V0cDEuZ2V0KCksIGlucDEuZ2V0KCkgfTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBQMikgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpKCpwKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoISgqcCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKDEwMCwgcC0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBQTykgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpKCpwKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoISgqcCkpOworCisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5mb3JPdXRwdXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBQSSkgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpKCpwKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoISgqcCkpOworCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5mb3JJbnB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JPdXRwdXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgQzJOdW1iZXJzUG9ydFR1bmluZyAqUDNbXSA9IHsgYm91dHAxLmdldCgpIH07CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUDMpIHsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSgoYm9vbCkoKnApKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKCEoKnApKTsKKworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvck91dHB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgwLCBwLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZhbHVlcworICAgICAgICBFWFBFQ1RfRVEoMTAwLCBpbnAyLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0VRKDEwMCwgb3V0cDItPm0ubU51bWJlcnNbMF0pOworICAgICAgICBFWFBFQ1RfRVEoMCwgYmlucDEtPm0ubU51bWJlcnNbMF0pOworICAgICAgICBFWFBFQ1RfRVEoMCwgYmlucDItPm0ubU51bWJlcnNbMF0pOworICAgICAgICBFWFBFQ1RfRVEoMCwgYm91dHAxLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJvdXRwMi0+bS5tTnVtYmVyc1swXSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoKmlucDEgIT0gKm91dHAxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmlucDEgPT0gKmlucDIpOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0cDEgPT0gKm91dHAyKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmJpbnAxID09ICpib3V0cDEpOworICAgICAgICBFWFBFQ1RfVFJVRSgqYmlucDIgIT0gKmJvdXRwMik7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoKmlucDEgIT0gKmJpbnAxKTsKKyAgICAgICAgYmlucDEtPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnAxICE9ICpiaW5wMSk7CisgICAgICAgIGJpbnAxLT5zZXRQb3J0KGZhbHNlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSpiaW5wMSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSghKmJpbnAxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmlucDEgPT0gKmJpbnAxKTsKKworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5wMiAhPSAqYmlucDIpOworICAgICAgICBiaW5wMi0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmlucDIgPT0gKmJpbnAyKTsKKworICAgICAgICBiaW5wMS0+c2V0UG9ydCh0cnVlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRwMSA9PSAqYmlucDEpOworCisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRwMSAhPSAqYm91dHAxKTsKKyAgICAgICAgYm91dHAxLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0cDEgIT0gKmJvdXRwMSk7CisgICAgICAgIGJvdXRwMS0+c2V0UG9ydCh0cnVlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSpib3V0cDEpOworICAgICAgICBFWFBFQ1RfRkFMU0UoISpib3V0cDEpOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0cDEgPT0gKmJvdXRwMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHAyICE9ICpib3V0cDIpOworICAgICAgICBib3V0cDItPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRwMiA9PSAqYm91dHAyKTsKKworICAgICAgICBib3V0cDEtPnNldFBvcnQoZmFsc2UgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmlucDEgPT0gKmJvdXRwMSk7CisKKyAgICAgICAgLy8gaW5kZXgKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5wMS0+dHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJzU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5wMS0+dHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKyAgICAgICAgRVhQRUNUX0VRKGlucDEtPnR5cGUoKSwgQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpOworICAgICAgICBFWFBFQ1RfRVEoaW5wMS0+c3RyZWFtKCksIH4wdSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5wMi0+dHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJzU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5wMi0+dHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKyAgICAgICAgRVhQRUNUX0VRKGlucDItPnR5cGUoKSwgQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpOworICAgICAgICBFWFBFQ1RfRVEoaW5wMi0+c3RyZWFtKCksIH4wdSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0cDEtPnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHAxLT50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworICAgICAgICBFWFBFQ1RfRVEob3V0cDEtPnR5cGUoKSwgQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHAxLT5zdHJlYW0oKSwgfjB1KTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRwMi0+dHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJzU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0cDItPnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisgICAgICAgIEVYUEVDVF9FUShvdXRwMi0+dHlwZSgpLCBDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworICAgICAgICBFWFBFQ1RfRVEob3V0cDItPnN0cmVhbSgpLCB+MHUpOworCisgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCA9IEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGluZGV4LmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC5jb3JlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzIHwgQzJQYXJhbTo6Q29yZUluZGV4OjpJU19GTEVYX0ZMQUcpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXgudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisKKyAgICAgICAgaW5kZXggPSBDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMgfCBDMlBhcmFtOjpDb3JlSW5kZXg6OklTX0ZMRVhfRkxBRyk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKworICAgICAgICBDMlBhcmFtOjpUeXBlIHR5cGUgPSBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNHbG9iYWwoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvck91dHB1dCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yU3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvclBvcnQoKSk7CisKKyAgICAgICAgdHlwZSA9IEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNHbG9iYWwoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvck91dHB1dCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yU3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvclBvcnQoKSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1R1bmluZzo6RnJvbShpbnAxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNUdW5pbmc6OkZyb20oaW5wMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKG91dHAxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNUdW5pbmc6OkZyb20ob3V0cDIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20oaW5wMS5nZXQoKSksIGlucDEuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbShpbnAyLmdldCgpKSwgKEMyTnVtYmVyc1BvcnRUdW5pbmcqKWlucDIuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbShvdXRwMS5nZXQoKSksIG91dHAxLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20ob3V0cDIuZ2V0KCkpLCAoQzJOdW1iZXJzUG9ydFR1bmluZyopb3V0cDIuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oaW5wMS5nZXQoKSksIChDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dCopaW5wMS5nZXQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShpbnAyLmdldCgpKSwgaW5wMi5nZXQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShvdXRwMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20ob3V0cDIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShpbnAxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oaW5wMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKG91dHAxLmdldCgpKSwgKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dCopb3V0cDEuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKG91dHAyLmdldCgpKSwgb3V0cDIuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpGcm9tKGlucDEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6RnJvbShpbnAyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkZyb20ob3V0cDEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6RnJvbShvdXRwMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbShpbnAxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKGlucDIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20ob3V0cDEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20ob3V0cDIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKGlucDEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKGlucDIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKG91dHAxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbShvdXRwMi5nZXQoKSksIG51bGxwdHIpOworCisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoKmlucDEpKSwgKmlucDEpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KCppbnAyKSksICppbnAyKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weSgqb3V0cDEpKSwgKm91dHAxKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weSgqb3V0cDIpKSwgKm91dHAyKTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nPiBvdXRzMV8oQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpBbGxvY1VuaXF1ZSgxLCB0cnVlLCAxdSkpOworICAgIG91dHMxXy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJOdW1iZXJzU3RyZWFtVHVuaW5nPiBvdXRzMSA9IHN0ZDo6bW92ZShvdXRzMV8pOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMk51bWJlcnNTdHJlYW1UdW5pbmc+IGluczFfKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6QWxsb2NVbmlxdWUoMSwgZmFsc2UsIDF1KSk7CisgICAgaW5zMV8tPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyTnVtYmVyc1N0cmVhbVR1bmluZz4gaW5zMSA9IHN0ZDo6bW92ZShpbnMxXyk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTnVtYmVyc1N0cmVhbVR1bmluZz4gYm91dHMxKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6QWxsb2NTaGFyZWQoMSkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk51bWJlcnNTdHJlYW1UdW5pbmc+IGJpbnMxKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6QWxsb2NTaGFyZWQoMSkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk51bWJlcnNTdHJlYW1UdW5pbmc+IGJpbnMzKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6QWxsb2NTaGFyZWQoMSwgZmFsc2UsIDF1KSk7CisgICAgYmluczMtPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ+IGluczJfKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkFsbG9jVW5pcXVlKDEsIDF1KSk7CisgICAgaW5zMl8tPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ+IGluczIgPSBzdGQ6Om1vdmUoaW5zMl8pOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0PiBiaW5zMihDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpBbGxvY1NoYXJlZCgxKSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0PiBvdXRzMl8oQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKDEsIDF1KSk7CisgICAgb3V0czJfLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dD4gb3V0czIgPSBzdGQ6Om1vdmUob3V0czJfKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ+IGJvdXRzMihDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6QWxsb2NTaGFyZWQoMSkpOworCisgICAgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KGNhbkNhbGxTZXRQb3J0KCpiaW5zMyksICJzaG91bGQgYmUgYWJsZSB0byIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KGNhbkNhbGxTZXRQb3J0KCpiaW5zMSksICJzaG91bGQgYmUgYWJsZSB0byIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydCgqaW5zMSksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKGNvbnN0KSIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydCgqaW5zMiksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKGNvbnN0ICYgdHlwZSkiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoKmJpbnMyKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAodHlwZSkiKTsKKworICAgICAgICAvLyBmbGFncyAmIGludmFyaWFibGVzCisgICAgICAgIGNvbnN0IEMyTnVtYmVyc1N0cmVhbVR1bmluZyAqU1tdID0geyBvdXRzMS5nZXQoKSwgaW5zMS5nZXQoKSwgYm91dHMxLmdldCgpIH07CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUykgeworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC0+c2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yUG9ydCgpKTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0ICpTSVtdID0geyBpbnMyLmdldCgpLCBiaW5zMi5nZXQoKSB9OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFNJKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLT5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+aXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmZvclN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JQb3J0KCkpOworICAgICAgICB9CisgICAgICAgIGNvbnN0IEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0ICpTT1tdID0geyBvdXRzMi5nZXQoKSwgYm91dHMyLmdldCgpIH07CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogU08pIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAtPnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNWZW5kb3IoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5pc0ZsZXhpYmxlKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvclBvcnQoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwb3J0IHNwZWNpZmljIGZsYWdzICYgaW52YXJpYWJsZXMKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG91dHMxLT5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0czEtPmZvck91dHB1dCgpKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShpbnMxLT5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluczEtPmZvck91dHB1dCgpKTsKKworICAgICAgICBjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmcgKlMyW10gPSB7IG91dHMxLmdldCgpLCBpbnMxLmdldCgpIH07CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUzIpIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSgqcCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCEoKnApKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMDAsIHAtPm0ubU51bWJlcnNbMF0pOworICAgICAgICAgICAgRVhQRUNUX0VRKDF1LCBwLT5zdHJlYW0oKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBTTykgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpKCpwKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoISgqcCkpOworCisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5mb3JPdXRwdXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBTSSkgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpKCpwKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoISgqcCkpOworCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5mb3JJbnB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JPdXRwdXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgQzJOdW1iZXJzU3RyZWFtVHVuaW5nICpTM1tdID0geyBib3V0czEuZ2V0KCkgfTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBTMykgeworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKChib29sKSgqcCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUoISgqcCkpOworCisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yT3V0cHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKDAsIHAtPm0ubU51bWJlcnNbMF0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gdmFsdWVzCisgICAgICAgIEVYUEVDVF9FUSgxMDAsIGluczItPm0ubU51bWJlcnNbMF0pOworICAgICAgICBFWFBFQ1RfRVEoMTAwLCBvdXRzMi0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBiaW5zMS0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBiaW5zMi0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBib3V0czEtPm0ubU51bWJlcnNbMF0pOworICAgICAgICBFWFBFQ1RfRVEoMCwgYm91dHMyLT5tLm1OdW1iZXJzWzBdKTsKKworICAgICAgICBFWFBFQ1RfRVEoMXUsIGluczItPnN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBvdXRzMi0+c3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRVEoMHUsIGJpbnMxLT5zdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9FUSgwdSwgYmluczItPnN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBib3V0czEtPnN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBib3V0czItPnN0cmVhbSgpKTsKKworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5zMSAhPSAqb3V0czEpOworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5zMSA9PSAqaW5zMik7CisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMSA9PSAqb3V0czIpOworICAgICAgICBFWFBFQ1RfVFJVRSgqYmluczEgPT0gKmJvdXRzMSk7CisgICAgICAgIEVYUEVDVF9UUlVFKCpiaW5zMiAhPSAqYm91dHMyKTsKKworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5zMSAhPSAqYmluczEpOworICAgICAgICBiaW5zMS0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmluczEgIT0gKmJpbnMxKTsKKyAgICAgICAgYmluczEtPnNldFBvcnQoZmFsc2UgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmluczEgIT0gKmJpbnMxKTsKKyAgICAgICAgYmluczEtPnNldFN0cmVhbSgxdSk7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnMxID09ICpiaW5zMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoKmluczIgIT0gKmJpbnMyKTsKKyAgICAgICAgYmluczItPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnMyICE9ICpiaW5zMik7CisgICAgICAgIGJpbnMyLT5zZXRTdHJlYW0oMXUpOworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5zMiA9PSAqYmluczIpOworCisgICAgICAgIGJpbnMxLT5zZXRQb3J0KHRydWUgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHMxID09ICpiaW5zMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHMxICE9ICpib3V0czEpOworICAgICAgICBib3V0czEtPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMSAhPSAqYm91dHMxKTsKKyAgICAgICAgYm91dHMxLT5zZXRQb3J0KHRydWUgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHMxICE9ICpib3V0czEpOworICAgICAgICBib3V0czEtPnNldFN0cmVhbSgxdSk7CisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMSA9PSAqYm91dHMxKTsKKworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0czIgIT0gKmJvdXRzMik7CisgICAgICAgIGJvdXRzMi0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHMyICE9ICpib3V0czIpOworICAgICAgICBib3V0czItPnNldFN0cmVhbSgxdSk7CisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMiA9PSAqYm91dHMyKTsKKworICAgICAgICBib3V0czEtPnNldFBvcnQoZmFsc2UgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmluczEgPT0gKmJvdXRzMSk7CisKKyAgICAgICAgLy8gaW5kZXgKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5zMS0+dHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJzU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5zMS0+dHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKyAgICAgICAgRVhQRUNUX0VRKGluczEtPnR5cGUoKSwgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5zMi0+dHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJzU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5zMi0+dHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKyAgICAgICAgRVhQRUNUX0VRKGluczItPnR5cGUoKSwgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0czEtPnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHMxLT50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworICAgICAgICBFWFBFQ1RfRVEob3V0czEtPnR5cGUoKSwgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHMyLT50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlcnNTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRzMi0+dHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHMyLT50eXBlKCksIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKworICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXggPSBDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGluZGV4LmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC5jb3JlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzIHwgQzJQYXJhbTo6Q29yZUluZGV4OjpJU19GTEVYX0ZMQUcpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXgudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisKKyAgICAgICAgaW5kZXggPSBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyB8IEMyUGFyYW06OkNvcmVJbmRleDo6SVNfRkxFWF9GTEFHKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworCisgICAgICAgIEMyUGFyYW06OlR5cGUgdHlwZSA9IEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzR2xvYmFsKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JPdXRwdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yU3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JQb3J0KCkpOworCisgICAgICAgIHR5cGUgPSBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNHbG9iYWwoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvck91dHB1dCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JTdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclBvcnQoKSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1R1bmluZzo6RnJvbShpbnMxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNUdW5pbmc6OkZyb20oaW5zMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKG91dHMxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNUdW5pbmc6OkZyb20ob3V0czIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20oaW5zMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbShpbnMyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKG91dHMxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKG91dHMyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShpbnMxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShpbnMyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShvdXRzMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20ob3V0czIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShpbnMxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oaW5zMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKG91dHMxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20ob3V0czIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6RnJvbShpbnMxLmdldCgpKSwgaW5zMS5nZXQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkZyb20oaW5zMi5nZXQoKSksIChDMk51bWJlcnNTdHJlYW1UdW5pbmcqKWluczIuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpGcm9tKG91dHMxLmdldCgpKSwgb3V0czEuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpGcm9tKG91dHMyLmdldCgpKSwgKEMyTnVtYmVyc1N0cmVhbVR1bmluZyopb3V0czIuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbShpbnMxLmdldCgpKSwgKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQqKWluczEuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbShpbnMyLmdldCgpKSwgaW5zMi5nZXQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKG91dHMxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKG91dHMyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbShpbnMxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbShpbnMyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbShvdXRzMS5nZXQoKSksIChDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dCopb3V0czEuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20ob3V0czIuZ2V0KCkpLCBvdXRzMi5nZXQoKSk7CisKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weSgqaW5zMSkpLCAqaW5zMSk7CisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoKmluczIpKSwgKmluczIpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KCpvdXRzMSkpLCAqb3V0czEpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KCpvdXRzMikpLCAqb3V0czIpOworICAgIH0KKworICAgIHsKKyAgICAgICAgQzJJbnQzMlZhbHVlIGludDMyVmFsdWUoSU5UMzJfTUlOKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoaW50MzJWYWx1ZS52YWx1ZSksIGludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSBpbnQzMl90Iik7CisgICAgICAgIEVYUEVDVF9FUShJTlQzMl9NSU4sIGludDMyVmFsdWUudmFsdWUpOworICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gaW50MzJWYWx1ZS5GaWVsZExpc3QoKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuc2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEZEOjpJTlQzMiwgZmllbGRzLmNiZWdpbigpLT50eXBlKCkpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5jYmVnaW4oKS0+ZXh0ZW50KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJTdHJpbmcoInZhbHVlIiksIGZpZWxkcy5jYmVnaW4oKS0+bmFtZSgpKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIEMyVWludDMyVmFsdWUgdWludDMyVmFsdWUoVUlOVDMyX01BWCk7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKHVpbnQzMlZhbHVlLnZhbHVlKSwgdWludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50MzJfdCIpOworICAgICAgICBFWFBFQ1RfRVEoVUlOVDMyX01BWCwgdWludDMyVmFsdWUudmFsdWUpOworICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gdWludDMyVmFsdWUuRmllbGRMaXN0KCk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShGRDo6VUlOVDMyLCBmaWVsZHMuY2JlZ2luKCktPnR5cGUoKSk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLmNiZWdpbigpLT5leHRlbnQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMlN0cmluZygidmFsdWUiKSwgZmllbGRzLmNiZWdpbigpLT5uYW1lKCkpOworICAgIH0KKworICAgIHsKKyAgICAgICAgQzJJbnQ2NFZhbHVlIGludDY0VmFsdWUoSU5UNjRfTUlOKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoaW50NjRWYWx1ZS52YWx1ZSksIGludDY0X3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSBpbnQ2NF90Iik7CisgICAgICAgIEVYUEVDVF9FUShJTlQ2NF9NSU4sIGludDY0VmFsdWUudmFsdWUpOworICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gaW50NjRWYWx1ZS5GaWVsZExpc3QoKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuc2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEZEOjpJTlQ2NCwgZmllbGRzLmNiZWdpbigpLT50eXBlKCkpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5jYmVnaW4oKS0+ZXh0ZW50KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJTdHJpbmcoInZhbHVlIiksIGZpZWxkcy5jYmVnaW4oKS0+bmFtZSgpKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIEMyVWludDY0VmFsdWUgdWludDY0VmFsdWUoVUlOVDY0X01BWCk7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKHVpbnQ2NFZhbHVlLnZhbHVlKSwgdWludDY0X3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50NjRfdCIpOworICAgICAgICBFWFBFQ1RfRVEoVUlOVDY0X01BWCwgdWludDY0VmFsdWUudmFsdWUpOworICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gdWludDY0VmFsdWUuRmllbGRMaXN0KCk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShGRDo6VUlOVDY0LCBmaWVsZHMuY2JlZ2luKCktPnR5cGUoKSk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLmNiZWdpbigpLT5leHRlbnQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMlN0cmluZygidmFsdWUiKSwgZmllbGRzLmNiZWdpbigpLT5uYW1lKCkpOworICAgIH0KKworICAgIHsKKyAgICAgICAgQzJGbG9hdFZhbHVlIGZsb2F0VmFsdWUoMTIzLjRmKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoZmxvYXRWYWx1ZS52YWx1ZSksIGZsb2F0Pjo6dmFsdWUsICJzaG91bGQgYmUgZmxvYXQiKTsKKyAgICAgICAgRVhQRUNUX0VRKDEyMy40ZiwgZmxvYXRWYWx1ZS52YWx1ZSk7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZHMgPSBmbG9hdFZhbHVlLkZpZWxkTGlzdCgpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEoRkQ6OkZMT0FULCBmaWVsZHMuY2JlZ2luKCktPnR5cGUoKSk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLmNiZWdpbigpLT5leHRlbnQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMlN0cmluZygidmFsdWUiKSwgZmllbGRzLmNiZWdpbigpLT5uYW1lKCkpOworICAgIH0KKworICAgIHsKKyAgICAgICAgdWludDhfdCBpbml0VmFsdWVbXSA9ICJBQkNEIjsKKyAgICAgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJCbG9iVmFsdWUsIDA+IEJsb2JTZXR0aW5nOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QmxvYlNldHRpbmc+IGJsb2JWYWx1ZSA9IEJsb2JTZXR0aW5nOjpBbGxvY1VuaXF1ZSg2LCBDMkNvbnN0TWVtb3J5QmxvY2s8dWludDhfdD4oaW5pdFZhbHVlKSk7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGJsb2JWYWx1ZS0+bS52YWx1ZSksIHVpbnQ4X3RbXT46OnZhbHVlLCAic2hvdWxkIGJlIHVpbnQ4X3RbXSIpOworICAgICAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKGJsb2JWYWx1ZS0+bS52YWx1ZSwgIkFCQ0RcMCIsIDYpKTsKKyAgICAgICAgRVhQRUNUX0VRKDZ1LCBibG9iVmFsdWUtPmZsZXhDb3VudCgpKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IGJsb2JWYWx1ZS0+RmllbGRMaXN0KCk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShGRDo6QkxPQiwgZmllbGRzLmNiZWdpbigpLT50eXBlKCkpOworICAgICAgICBFWFBFQ1RfRVEoMHUsIGZpZWxkcy5jYmVnaW4oKS0+ZXh0ZW50KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJTdHJpbmcoInZhbHVlIiksIGZpZWxkcy5jYmVnaW4oKS0+bmFtZSgpKTsKKworICAgICAgICBibG9iVmFsdWUgPSBCbG9iU2V0dGluZzo6QWxsb2NVbmlxdWUoMywgQzJDb25zdE1lbW9yeUJsb2NrPHVpbnQ4X3Q+KGluaXRWYWx1ZSkpOworICAgICAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKGJsb2JWYWx1ZS0+bS52YWx1ZSwgIkFCQyIsIDMpKTsKKyAgICAgICAgRVhQRUNUX0VRKDN1LCBibG9iVmFsdWUtPmZsZXhDb3VudCgpKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGNvbnN0ZXhwciBjaGFyIGluaXRWYWx1ZVtdID0gIkFCQ0QiOworICAgICAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlN0cmluZ1ZhbHVlLCAwPiBTdHJpbmdTZXR0aW5nOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nU2V0dGluZz4gc3RyaW5nVmFsdWUgPSBTdHJpbmdTZXR0aW5nOjpBbGxvY1VuaXF1ZSg2LCBDMkNvbnN0TWVtb3J5QmxvY2s8Y2hhcj4oaW5pdFZhbHVlKSk7CisgICAgICAgIHN0cmluZ1ZhbHVlID0gU3RyaW5nU2V0dGluZzo6QWxsb2NVbmlxdWUoNiwgaW5pdFZhbHVlKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoc3RyaW5nVmFsdWUtPm0udmFsdWUpLCBjaGFyW10+Ojp2YWx1ZSwgInNob3VsZCBiZSBjaGFyW10iKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChzdHJpbmdWYWx1ZS0+bS52YWx1ZSwgIkFCQ0RcMCIsIDYpKTsKKyAgICAgICAgRVhQRUNUX0VRKDZ1LCBzdHJpbmdWYWx1ZS0+ZmxleENvdW50KCkpOworICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gc3RyaW5nVmFsdWUtPkZpZWxkTGlzdCgpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEoRkQ6OlNUUklORywgZmllbGRzLmNiZWdpbigpLT50eXBlKCkpOworICAgICAgICBFWFBFQ1RfRVEoMHUsIGZpZWxkcy5jYmVnaW4oKS0+ZXh0ZW50KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJTdHJpbmcoInZhbHVlIiksIGZpZWxkcy5jYmVnaW4oKS0+bmFtZSgpKTsKKworICAgICAgICBzdHJpbmdWYWx1ZSA9IFN0cmluZ1NldHRpbmc6OkFsbG9jVW5pcXVlKDMsIEMyQ29uc3RNZW1vcnlCbG9jazxjaGFyPihpbml0VmFsdWUpKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChzdHJpbmdWYWx1ZS0+bS52YWx1ZSwgIkFCIiwgMykpOworICAgICAgICBFWFBFQ1RfRVEoM3UsIHN0cmluZ1ZhbHVlLT5mbGV4Q291bnQoKSk7CisKKyAgICAgICAgc3RyaW5nVmFsdWUgPSBTdHJpbmdTZXR0aW5nOjpBbGxvY1VuaXF1ZSgxMSwgImluaXRWYWx1ZSIpOworICAgICAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKHN0cmluZ1ZhbHVlLT5tLnZhbHVlLCAiaW5pdFZhbHVlXDAiLCAxMSkpOworICAgICAgICBFWFBFQ1RfRVEoMTF1LCBzdHJpbmdWYWx1ZS0+ZmxleENvdW50KCkpOworCisgICAgICAgIHN0cmluZ1ZhbHVlID0gU3RyaW5nU2V0dGluZzo6QWxsb2NVbmlxdWUoaW5pdFZhbHVlKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChzdHJpbmdWYWx1ZS0+bS52YWx1ZSwgIkFCQ0QiLCA1KSk7CisgICAgICAgIEVYUEVDVF9FUSg1dSwgc3RyaW5nVmFsdWUtPmZsZXhDb3VudCgpKTsKKworICAgICAgICBzdHJpbmdWYWx1ZSA9IFN0cmluZ1NldHRpbmc6OkFsbG9jVW5pcXVlKHsgJ0EnLCAnQicsICdDJywgJ0QnIH0pOworICAgICAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKHN0cmluZ1ZhbHVlLT5tLnZhbHVlLCAiQUJDIiwgNCkpOworICAgICAgICBFWFBFQ1RfRVEoNHUsIHN0cmluZ1ZhbHVlLT5mbGV4Q291bnQoKSk7CisgICAgfQorCisgICAgeworICAgICAgICB1aW50MzJfdCB2aWRlb1dpZHRoW10gPSB7IDEydSwgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUsIDEwMCB9OworICAgICAgICBDMlBhcmFtICpwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgc2l6ZW9mKHZpZGVvV2lkdGgpKTsKKyAgICAgICAgRVhQRUNUX05FKG51bGxwdHIsIHAxKTsKKyAgICAgICAgRVhQRUNUX0VRKDEydSwgcDEtPnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShwMS0+dHlwZSgpLCBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisKKyAgICAgICAgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQgKnZzdCA9IEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKHAxKTsKKyAgICAgICAgRVhQRUNUX05FKG51bGxwdHIsIHZzdCk7CisgICAgICAgIGlmICh2c3QpIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxdSwgdnN0LT5mbGV4Q291bnQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTAwLCB2c3QtPm0ubU51bWJlcnNbMF0pOworICAgICAgICB9CisKKyAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIHNpemVvZih2aWRlb1dpZHRoKSArIDIpOworICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcDEpOworCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkgLSAyKTsKKyAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIHAxKTsKKworICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgMyk7CisgICAgICAgIEVYUEVDVF9FUShudWxscHRyLCBwMSk7CisKKyAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIDApOworICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcDEpOworICAgIH0KKworICAgIHsKKyAgICAgICAgdWludDMyX3QgdmlkZW9XaWR0aFtdID0geyAxNnUsIEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFLCAxMDEsIDEwMiB9OworCisgICAgICAgIEMyUGFyYW0gKnAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkpOworICAgICAgICBFWFBFQ1RfTkUobnVsbHB0ciwgcDEpOworICAgICAgICBFWFBFQ1RfRVEoMTZ1LCBwMS0+c2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKHAxLT50eXBlKCksIEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKworICAgICAgICBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dCAqdnB0ID0gQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20ocDEpOworICAgICAgICBFWFBFQ1RfTkUobnVsbHB0ciwgdnB0KTsKKyAgICAgICAgaWYgKHZwdCkgeworICAgICAgICAgICAgRVhQRUNUX0VRKDJ1LCB2cHQtPmZsZXhDb3VudCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMDEsIHZwdC0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTAyLCB2cHQtPm0ubU51bWJlcnNbMV0pOworICAgICAgICB9CisKKyAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIHNpemVvZih2aWRlb1dpZHRoKSArIDIpOworICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcDEpOworCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkgLSAyKTsKKyAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIHAxKTsKKworICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgMyk7CisgICAgICAgIEVYUEVDVF9FUShudWxscHRyLCBwMSk7CisKKyAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIDApOworICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcDEpOworICAgIH0KK30KKworVEVTVF9GKEMyUGFyYW1UZXN0LCBDMlZhbHVlVGVzdCkgeworICAgIEMyVmFsdWUgdmFsOworICAgIGludDMyX3QgaTMyID0gLTMyOworICAgIGludDY0X3QgaTY0ID0gLTY0OworICAgIHVpbnQzMl90IHUzMiA9IDMyOworICAgIHVpbnQ2NF90IHU2NCA9IDY0OworICAgIGZsb2F0IGZwID0gMS41ZjsKKworICAgIEVYUEVDVF9FUShDMlZhbHVlOjpOT19JTklULCB2YWwudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmkzMikpOworICAgIEVYUEVDVF9FUSgtMzIsIGkzMik7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpNjQpKTsKKyAgICBFWFBFQ1RfRVEoLTY0LCBpNjQpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTMyKSk7CisgICAgRVhQRUNUX0VRKDMydSwgdTMyKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnU2NCkpOworICAgIEVYUEVDVF9FUSg2NHUsIHU2NCk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZmcCkpOworICAgIEVYUEVDVF9FUSgxLjVmLCBmcCk7CisKKyAgICB2YWwgPSBpbnQzMl90KC0zMjE2KTsKKyAgICBFWFBFQ1RfRVEoQzJWYWx1ZTo6SU5UMzIsIHZhbC50eXBlKCkpOworICAgIEVYUEVDVF9FUSh0cnVlLCB2YWwuZ2V0KCZpMzIpKTsKKyAgICBFWFBFQ1RfRVEoLTMyMTYsIGkzMik7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpNjQpKTsKKyAgICBFWFBFQ1RfRVEoLTY0LCBpNjQpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTMyKSk7CisgICAgRVhQRUNUX0VRKDMydSwgdTMyKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnU2NCkpOworICAgIEVYUEVDVF9FUSg2NHUsIHU2NCk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZmcCkpOworICAgIEVYUEVDVF9FUSgxLjVmLCBmcCk7CisKKyAgICB2YWwgPSB1aW50MzJfdCgzMjE2KTsKKyAgICBFWFBFQ1RfRVEoQzJWYWx1ZTo6VUlOVDMyLCB2YWwudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmkzMikpOworICAgIEVYUEVDVF9FUSgtMzIxNiwgaTMyKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmk2NCkpOworICAgIEVYUEVDVF9FUSgtNjQsIGk2NCk7CisgICAgRVhQRUNUX0VRKHRydWUsIHZhbC5nZXQoJnUzMikpOworICAgIEVYUEVDVF9FUSgzMjE2dSwgdTMyKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnU2NCkpOworICAgIEVYUEVDVF9FUSg2NHUsIHU2NCk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZmcCkpOworICAgIEVYUEVDVF9FUSgxLjVmLCBmcCk7CisKKyAgICB2YWwgPSBpbnQ2NF90KC02NDMyKTsKKyAgICBFWFBFQ1RfRVEoQzJWYWx1ZTo6SU5UNjQsIHZhbC50eXBlKCkpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTMyKSk7CisgICAgRVhQRUNUX0VRKC0zMjE2LCBpMzIpOworICAgIEVYUEVDVF9FUSh0cnVlLCB2YWwuZ2V0KCZpNjQpKTsKKyAgICBFWFBFQ1RfRVEoLTY0MzIsIGk2NCk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZ1MzIpKTsKKyAgICBFWFBFQ1RfRVEoMzIxNnUsIHUzMik7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZ1NjQpKTsKKyAgICBFWFBFQ1RfRVEoNjR1LCB1NjQpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmZnApKTsKKyAgICBFWFBFQ1RfRVEoMS41ZiwgZnApOworCisgICAgdmFsID0gdWludDY0X3QoNjQzMik7CisgICAgRVhQRUNUX0VRKEMyVmFsdWU6OlVJTlQ2NCwgdmFsLnR5cGUoKSk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpMzIpKTsKKyAgICBFWFBFQ1RfRVEoLTMyMTYsIGkzMik7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpNjQpKTsKKyAgICBFWFBFQ1RfRVEoLTY0MzIsIGk2NCk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZ1MzIpKTsKKyAgICBFWFBFQ1RfRVEoMzIxNnUsIHUzMik7CisgICAgRVhQRUNUX0VRKHRydWUsIHZhbC5nZXQoJnU2NCkpOworICAgIEVYUEVDVF9FUSg2NDMydSwgdTY0KTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmZwKSk7CisgICAgRVhQRUNUX0VRKDEuNWYsIGZwKTsKKworICAgIHZhbCA9IDE1LjI1ZjsKKyAgICBFWFBFQ1RfRVEoQzJWYWx1ZTo6RkxPQVQsIHZhbC50eXBlKCkpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTMyKSk7CisgICAgRVhQRUNUX0VRKC0zMjE2LCBpMzIpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTY0KSk7CisgICAgRVhQRUNUX0VRKC02NDMyLCBpNjQpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTMyKSk7CisgICAgRVhQRUNUX0VRKDMyMTZ1LCB1MzIpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTY0KSk7CisgICAgRVhQRUNUX0VRKDY0MzJ1LCB1NjQpOworICAgIEVYUEVDVF9FUSh0cnVlLCB2YWwuZ2V0KCZmcCkpOworICAgIEVYUEVDVF9FUSgxNS4yNWYsIGZwKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3Rlc3RzL0MyU2FtcGxlQ29tcG9uZW50X3Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0MyU2FtcGxlQ29tcG9uZW50X3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMzU0YWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQzJTYW1wbGVDb21wb25lbnRfdGVzdC5jcHAKQEAgLTAsMCArMSw0MzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTYW1wbGVDb21wb25lbnRfdGVzdCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNkZWZpbmUgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMkVudW0uaD4KKworI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKK2NsYXNzIEMyU2FtcGxlQ29tcG9uZW50VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworfTsKKwordm9pZCBQcmludFRvKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmZCwgOjpzdGQ6Om9zdHJlYW0gKm9zKSB7CisgICAgdXNpbmcgRkQ9QzJGaWVsZERlc2NyaXB0b3I7CisgICAgc3dpdGNoIChmZC50eXBlKCkpIHsKKyAgICBjYXNlIEZEOjpJTlQzMjogKm9zIDw8ICJpMzIiOyBicmVhazsKKyAgICBjYXNlIEZEOjpJTlQ2NDogKm9zIDw8ICJpNjQiOyBicmVhazsKKyAgICBjYXNlIEZEOjpVSU5UMzI6ICpvcyA8PCAidTMyIjsgYnJlYWs7CisgICAgY2FzZSBGRDo6VUlOVDY0OiAqb3MgPDwgInU2NCI7IGJyZWFrOworICAgIGNhc2UgRkQ6OkZMT0FUOiAqb3MgPDwgImZsb2F0IjsgYnJlYWs7CisgICAgY2FzZSBGRDo6U1RSSU5HOiAqb3MgPDwgImNoYXIiOyBicmVhazsKKyAgICBjYXNlIEZEOjpCTE9COiAqb3MgPDwgInU4IjsgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKGZkLnR5cGUoKSAmIEZEOjpTVFJVQ1RfRkxBRykgeworICAgICAgICAgICAgKm9zIDw8ICJzdHJ1Y3QtIiA8PCAoZmQudHlwZSgpICYgfkZEOjpTVFJVQ1RfRkxBRyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqb3MgPDwgInR5cGUtIiA8PCBmZC50eXBlKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgKm9zIDw8ICIgIiA8PCBmZC5uYW1lKCk7CisgICAgaWYgKGZkLmV4dGVudCgpID4gMSkgeworICAgICAgICAqb3MgPDwgIlsiIDw8IGZkLmV4dGVudCgpIDw8ICJdIjsKKyAgICB9IGVsc2UgaWYgKGZkLmV4dGVudCgpID09IDApIHsKKyAgICAgICAgKm9zIDw8ICJbXSI7CisgICAgfQorICAgICpvcyA8PCAiICgiIDw8IGZkLl9tRmllbGRJZCA8PCAiKiIgPDwgZmQuZXh0ZW50KCkgPDwgIikiOworfQorCitDMkVOVU0oCisgICAgTWV0YWRhdGFUeXBlLCBpbnQzMl90LAorICAgIGtJbnZhbGlkID0gLTEsCisgICAga05vbmUgPSAwLAorICAgIGtHcmFsbG9jLAorICAgIGtOYXRpdmVIYW5kbGUsCisgICAga0FOYXRpdmVXaW5kb3csCisgICAga0NhbWVyYSwKKykKKworZW51bSB7CisgICAga1BhcmFtSW5kZXhWaWRlb0NvbmZpZyA9IDB4MTIzNCwKK307CisKK3N0cnVjdCBDMlZpZGVvQ29uZmlnU3RydWN0IHsKKyAgICBpbnQzMl90IHdpZHRoOworICAgIHVpbnQzMl90IGhlaWdodDsKKyAgICBNZXRhZGF0YVR5cGUgbWV0YWRhdGFUeXBlOworICAgIGludDMyX3Qgc3VwcG9ydGVkRm9ybWF0c1tdOworCisgICAgQzJWaWRlb0NvbmZpZ1N0cnVjdCgpIHt9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoVmlkZW9Db25maWcsIHN1cHBvcnRlZEZvcm1hdHMpCisgICAgQzJGSUVMRCh3aWR0aCwgIndpZHRoIikKKyAgICBDMkZJRUxEKGhlaWdodCwgImhlaWdodCIpCisgICAgQzJGSUVMRChtZXRhZGF0YVR5cGUsICJtZXRhZGF0YS10eXBlIikKKyAgICBDMkZJRUxEKHN1cHBvcnRlZEZvcm1hdHMsICJmb3JtYXRzIikKK307CisKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVmlkZW9Db25maWdTdHJ1Y3Q+IEMyVmlkZW9Db25maWdQb3J0VHVuaW5nOworCitjbGFzcyBNeUNvbXBvbmVudEluc3RhbmNlIDogcHVibGljIEMyQ29tcG9uZW50SW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIC8vLyBcdG9kbyB0aGlzIHNlZW1zIHRvbyBzcGVjaWZpYworICAgICAgICByZXR1cm4gInNhbXBsZS5pbnRlcmZhY2UiOworICAgIH07CisKKyAgICB2aXJ0dWFsIGMyX25vZGVfaWRfdCBnZXRJZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgLy8vIFx0b2RvIGhvdyBhcmUgdGhlc2Ugc2hhcmVkPworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZ192YigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpIG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpcGFyYW1zOworICAgICAgICAodm9pZClmYWlsdXJlczsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlVHVubmVsX3NtKGMyX25vZGVfaWRfdCB0YXJnZXRDb21wb25lbnQpIG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpdGFyZ2V0Q29tcG9uZW50OworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5X3ZiKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBoZWFwUGFyYW1zKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIGZvciAoQzJQYXJhbSogY29uc3QgcGFyYW0gOiBzdGFja1BhcmFtcykgeworICAgICAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICAgICBpZiAoISpwYXJhbSkgeyAvLyBwYXJhbSBpcyBhbHJlYWR5IGludmFsaWQgLSByZW1lbWJlciBpdAorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBub3RlOiB0aGlzIGRvZXMgbm90IGhhbmRsZSBzdHJlYW0gcGFyYW1zIChzaG91bGQgdXNlIGluZGV4Li4uKQorICAgICAgICAgICAgaWYgKCFtTXlQYXJhbXMuY291bnQocGFyYW0tPmluZGV4KCkpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7IC8vIG5vdCBteSBwYXJhbQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDMlBhcmFtICYgbXlQYXJhbSA9IG1NeVBhcmFtcy5maW5kKHBhcmFtLT5pbmRleCgpKS0+c2Vjb25kOworICAgICAgICAgICAgaWYgKG15UGFyYW0uc2l6ZSgpICE9IHBhcmFtLT5zaXplKCkpIHsgLy8gaW5jb3JyZWN0IHNpemUKKyAgICAgICAgICAgICAgICBwYXJhbS0+aW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwYXJhbS0+dXBkYXRlRnJvbShteVBhcmFtKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoY29uc3QgQzJQYXJhbTo6SW5kZXggaW5kZXggOiBoZWFwUGFyYW1JbmRpY2VzKSB7CisgICAgICAgICAgICBpZiAobU15UGFyYW1zLmNvdW50KGluZGV4KSkgeworICAgICAgICAgICAgICAgIEMyUGFyYW0gJiBteVBhcmFtID0gbU15UGFyYW1zLmZpbmQoaW5kZXgpLT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IHBhcmFtQ29weShDMlBhcmFtOjpDb3B5KG15UGFyYW0pKTsKKyAgICAgICAgICAgICAgICBoZWFwUGFyYW1zLT5wdXNoX2JhY2soc3RkOjptb3ZlKHBhcmFtQ29weSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50MzJfdCwgQzJQYXJhbSAmPiBtTXlQYXJhbXM7CisKKyAgICBDMkNvbXBvbmVudERvbWFpbkluZm8gbURvbWFpbkluZm87CisKKyAgICBNeUNvbXBvbmVudEluc3RhbmNlKCkgeworICAgICAgICBtTXlQYXJhbXMuaW5zZXJ0KHttRG9tYWluSW5mby5pbmRleCgpLCBtRG9tYWluSW5mb30pOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVsZWFzZVR1bm5lbF9zbShjMl9ub2RlX2lkX3QgdGFyZ2V0Q29tcG9uZW50KSBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKXRhcmdldENvbXBvbmVudDsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgY2xhc3MgTXlQYXJhbVJlZmxlY3RvciA6IHB1YmxpYyBDMlBhcmFtUmVmbGVjdG9yIHsKKyAgICAgICAgY29uc3QgTXlDb21wb25lbnRJbnN0YW5jZSAqaW5zdGFuY2U7CisKKyAgICBwdWJsaWM6CisgICAgICAgIE15UGFyYW1SZWZsZWN0b3IoY29uc3QgTXlDb21wb25lbnRJbnN0YW5jZSAqaSkgOiBpbnN0YW5jZShpKSB7IH0KKworICAgICAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaWJlKEMyUGFyYW06OkNvcmVJbmRleCBwYXJhbUluZGV4KSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICBzd2l0Y2ggKHBhcmFtSW5kZXgudHlwZUluZGV4KCkpIHsKKyAgICAgICAgICAgIGNhc2UgZGVjbHR5cGUoaW5zdGFuY2UtPm1Eb21haW5JbmZvKTo6Q09SRV9JTkRFWDoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+KG5ldyBDMlN0cnVjdERlc2NyaXB0b3J7CisgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLT5tRG9tYWluSW5mby50eXBlKCksCisgICAgICAgICAgICAgICAgICAgIGRlY2x0eXBlKGluc3RhbmNlLT5tRG9tYWluSW5mbyk6OkZpZWxkTGlzdCgpLAorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlc192YigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGZvciAoQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5ICZxdWVyeSA6IGZpZWxkcykgeworICAgICAgICAgICAgaWYgKHF1ZXJ5LmZpZWxkKCkgPT0gQzJQYXJhbUZpZWxkKCZtRG9tYWluSW5mbywgJkMyQ29tcG9uZW50RG9tYWluSW5mbzo6dmFsdWUpKSB7CisgICAgICAgICAgICAgICAgcXVlcnkudmFsdWVzID0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogZmxhZyAqLywKKyAgICAgICAgICAgICAgICAgICAgJm1Eb21haW5JbmZvLnZhbHVlCisgICAgICAgICAgICAgICAgICAgIC8vLAorICAgICAgICAgICAgICAgICAgICAvL3soaW50MzJfdClDMkRvbWFpblZpZGVvfQorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgcXVlcnkuc3RhdHVzID0gQzJfT0s7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHF1ZXJ5LnN0YXR1cyA9IEMyX0JBRF9JTkRFWDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IGdldFBhcmFtUmVmbGVjdG9yKCkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+KG5ldyBNeVBhcmFtUmVmbGVjdG9yKHRoaXMpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKiBjb25zdCBwYXJhbXMpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcGFyYW1zLT5wdXNoX2JhY2soc3RkOjptYWtlX3NoYXJlZDxDMlBhcmFtRGVzY3JpcHRvcj4oCisgICAgICAgICAgICAgICAgdHJ1ZSAvKiByZXF1aXJlZCAqLywgIl9kb21haW4iLCAmbURvbWFpbkluZm8pKTsKKyAgICAgICAgcGFyYW1zLT5wdXNoX2JhY2soc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPigKKyAgICAgICAgICAgICAgICBuZXcgQzJQYXJhbURlc2NyaXB0b3IodHJ1ZSAvKiByZXF1aXJlZCAqLywgIl9kb21haW4iLCAmbURvbWFpbkluZm8pKSk7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5NeUNvbXBvbmVudEluc3RhbmNlKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRSwgYm9vbCBTPXN0ZDo6aXNfZW51bTxFPjo6dmFsdWU+CitzdHJ1Y3QgZ2V0dGVyIHsKKyAgICBpbnQzMl90IGdldChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpQcmltaXRpdmUgJnAsIGludDMyX3QqKSB7CisgICAgICAgIHJldHVybiBwLmkzMjsKKyAgICB9CisgICAgaW50NjRfdCBnZXQoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCBpbnQ2NF90KikgeworICAgICAgICByZXR1cm4gcC5pNjQ7CisgICAgfQorICAgIHVpbnQzMl90IGdldChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpQcmltaXRpdmUgJnAsIHVpbnQzMl90KikgeworICAgICAgICByZXR1cm4gcC51MzI7CisgICAgfQorICAgIHVpbnQ2NF90IGdldChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpQcmltaXRpdmUgJnAsIHVpbnQ2NF90KikgeworICAgICAgICByZXR1cm4gcC51NjQ7CisgICAgfQorICAgIGZsb2F0IGdldChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpQcmltaXRpdmUgJnAsIGZsb2F0KikgeworICAgICAgICByZXR1cm4gcC5mcDsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBFPgorc3RydWN0IGdldHRlcjxFLCB0cnVlPiB7CisgICAgIHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPEU+Ojp0eXBlIGdldChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpQcmltaXRpdmUgJnAsIEUqKSB7CisgICAgICAgICB1c2luZyB1PXR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPEU+Ojp0eXBlOworICAgICAgICAgcmV0dXJuIGdldHRlcjx1PigpLmdldChwLCAodSopMCk7CisgICAgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGJvb2wgRT1zdGQ6OmlzX2VudW08VD46OnZhbHVlPgorc3RydWN0IGxheF91bmRlcmx5aW5nX3R5cGUgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8VD46OnR5cGUgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgbGF4X3VuZGVybHlpbmdfdHlwZTxULCBmYWxzZT4geworICAgIHR5cGVkZWYgVCB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRT4KK3R5cGVuYW1lIGxheF91bmRlcmx5aW5nX3R5cGU8RT46OnR5cGUgZ2V0KAorICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpQcmltaXRpdmUgJnAsIEUqKSB7CisgICAgcmV0dXJuIGdldHRlcjxFPigpLmdldChwLCAoRSopMCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIGR1bXBGU1YoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmc3YsIFQqdCkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CisgICAgY291dCA8PCAoc3RkOjppc19lbnVtPFQ+Ojp2YWx1ZSA/IChzdGQ6OmlzX3NpZ25lZDx0eXBlbmFtZSBsYXhfdW5kZXJseWluZ190eXBlPFQ+Ojp0eXBlPjo6dmFsdWUgPyAiaSIgOiAidSIpCisgICAgICAgICAgICAgOiBzdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZSA/IHN0ZDo6aXNfc2lnbmVkPFQ+Ojp2YWx1ZSA/ICJpIiA6ICJ1IiA6ICJmIikKKyAgICAgICAgIDw8ICg4ICogc2l6ZW9mKFQpKTsKKyAgICBpZiAoc3YudHlwZSA9PSBzdi5SQU5HRSkgeworICAgICAgICBjb3V0IDw8ICIucmFuZ2UoIiA8PCBnZXQoc3YucmFuZ2UubWluLCB0KTsKKyAgICAgICAgaWYgKGdldChzdi5yYW5nZS5zdGVwLCB0KSAhPSBzdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZSkgeworICAgICAgICAgICAgY291dCA8PCAiOiIgPDwgZ2V0KHN2LnJhbmdlLnN0ZXAsIHQpOworICAgICAgICB9CisgICAgICAgIGlmIChnZXQoc3YucmFuZ2UubnVtLCB0KSAhPSAxIHx8IGdldChzdi5yYW5nZS5kZW5vbSwgdCkgIT0gMSkgeworICAgICAgICAgICAgY291dCA8PCAiOiIgPDwgZ2V0KHN2LnJhbmdlLm51bSwgdCkgPDwgIi8iIDw8IGdldChzdi5yYW5nZS5kZW5vbSwgdCk7CisgICAgICAgIH0KKyAgICAgICAgY291dCA8PCBnZXQoc3YucmFuZ2UubWF4LCB0KSA8PCAiKSI7CisgICAgfQorICAgIGlmIChzdi52YWx1ZXMuc2l6ZSgpKSB7CisgICAgICAgIGNvdXQgPDwgKHN2LnR5cGUgPT0gc3YuRkxBR1MgPyAiLmZsYWdzKCIgOiAiLmxpc3QoIik7CisgICAgICAgIGNvbnN0IGNoYXIgKnNlcCA9ICIiOworICAgICAgICBmb3IgKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlByaW1pdGl2ZSAmcCA6IHN2LnZhbHVlcykgeworICAgICAgICAgICAgY291dCA8PCBzZXAgPDwgZ2V0KHAsIHQpOworICAgICAgICAgICAgc2VwID0gIiwiOworICAgICAgICB9CisgICAgICAgIGNvdXQgPDwgIikiOworICAgIH0KKyAgICBjb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgZHVtcFR5cGUoQzJQYXJhbTo6VHlwZSB0eXBlKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyAgICBjb3V0IDw8ICh0eXBlLmlzVmVuZG9yKCkgPyAiVmVuZG9yIiA6ICJDMiIpOworICAgIGlmICh0eXBlLmZvcklucHV0KCkpIHsKKyAgICAgICAgY291dCA8PCAiSW5wdXQiOworICAgIH0gZWxzZSBpZiAodHlwZS5mb3JPdXRwdXQoKSkgeworICAgICAgICBjb3V0IDw8ICJPdXRwdXQiOworICAgIH0gZWxzZSBpZiAodHlwZS5mb3JQb3J0KCkgJiYgIXR5cGUuZm9yU3RyZWFtKCkpIHsKKyAgICAgICAgY291dCA8PCAiUG9ydCI7CisgICAgfQorICAgIGlmICh0eXBlLmZvclN0cmVhbSgpKSB7CisgICAgICAgIGNvdXQgPDwgIlN0cmVhbSI7CisgICAgfQorCisgICAgaWYgKHR5cGUuaXNGbGV4aWJsZSgpKSB7CisgICAgICAgIGNvdXQgPDwgIkZsZXgiOworICAgIH0KKworICAgIGNvdXQgPDwgdHlwZS50eXBlSW5kZXgoKTsKKworICAgIHN3aXRjaCAodHlwZS5raW5kKCkpIHsKKyAgICBjYXNlIEMyUGFyYW06OklORk86IGNvdXQgPDwgIkluZm8iOyBicmVhazsKKyAgICBjYXNlIEMyUGFyYW06OlNFVFRJTkc6IGNvdXQgPDwgIlNldHRpbmciOyBicmVhazsKKyAgICBjYXNlIEMyUGFyYW06OlRVTklORzogY291dCA8PCAiVHVuaW5nIjsgYnJlYWs7CisgICAgY2FzZSBDMlBhcmFtOjpTVFJVQ1Q6IGNvdXQgPDwgIlN0cnVjdCI7IGJyZWFrOworICAgIGRlZmF1bHQ6IGNvdXQgPDwgIktpbmQiIDw8IChpbnQzMl90KXR5cGUua2luZCgpOyBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgZHVtcFR5cGUoQzJQYXJhbTo6Q29yZUluZGV4IHR5cGUpIHsKKyAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOworICAgIGNvdXQgPDwgKHR5cGUuaXNWZW5kb3IoKSA/ICJWZW5kb3IiIDogIkMyIik7CisgICAgaWYgKHR5cGUuaXNGbGV4aWJsZSgpKSB7CisgICAgICAgIGNvdXQgPDwgIkZsZXgiOworICAgIH0KKworICAgIGNvdXQgPDwgdHlwZS50eXBlSW5kZXgoKSA8PCAiU3RydWN0IjsKK30KKwordm9pZCBkdW1wVHlwZShDMkZpZWxkRGVzY3JpcHRvcjo6dHlwZV90IHR5cGUpIHsKKyAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkJMT0I6IGNvdXQgPDwgImJsb2IgIjsgYnJlYWs7CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6RkxPQVQ6IGNvdXQgPDwgImZsb2F0ICI7IGJyZWFrOworICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDMyOiBjb3V0IDw8ICJpbnQzMl90ICI7IGJyZWFrOworICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDY0OiBjb3V0IDw8ICJpbnQ2NF90ICI7IGJyZWFrOworICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQzMjogY291dCA8PCAidWludDMyX3QgIjsgYnJlYWs7CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDY0OiBjb3V0IDw8ICJ1aW50NjRfdCAiOyBicmVhazsKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpTVFJJTkc6IGNvdXQgPDwgImNoYXIgIjsgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgY291dCA8PCAic3RydWN0ICI7CisgICAgICAgIGR1bXBUeXBlKChDMlBhcmFtOjpUeXBlKXR5cGUpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgZHVtcFN0cnVjdChjb25zdCBDMlN0cnVjdERlc2NyaXB0b3IgJnNkKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyAgICBjb3V0IDw8ICJzdHJ1Y3QgIjsKKyAgICBkdW1wVHlwZShzZC5jb3JlSW5kZXgoKSk7CisgICAgY291dCA8PCAiIHsiIDw8IGVuZGw7CisgICAgLy9DMkZpZWxkRGVzY3JpcHRvciAmZjsKKyAgICBmb3IgKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmIDogc2QpIHsKKyAgICAgICAgUHJpbnRUbyhmLCAmY291dCk7CisgICAgICAgIGNvdXQgPDwgZW5kbDsKKworICAgICAgICBpZiAoZi5uYW1lZFZhbHVlcygpLnNpemUoKSkgeworICAgICAgICAgICAgY291dCA8PCAiLm5hbWVkKCI7CisgICAgICAgICAgICBjb25zdCBjaGFyICpzZXAgPSAiIjsKKyAgICAgICAgICAgIGZvciAoY29uc3QgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVUeXBlICZwIDogZi5uYW1lZFZhbHVlcygpKSB7CisgICAgICAgICAgICAgICAgY291dCA8PCBzZXAgPDwgcC5maXJzdCA8PCAiPSI7CisgICAgICAgICAgICAgICAgc3dpdGNoIChmLnR5cGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDMyOiBjb3V0IDw8IGdldChwLnNlY29uZCwgKGludDMyX3QgKikwKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UNjQ6IGNvdXQgPDwgZ2V0KHAuc2Vjb25kLCAoaW50NjRfdCAqKTApOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UMzI6IGNvdXQgPDwgZ2V0KHAuc2Vjb25kLCAodWludDMyX3QgKikwKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDY0OiBjb3V0IDw8IGdldChwLnNlY29uZCwgKHVpbnQ2NF90ICopMCk7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkZMT0FUOiBjb3V0IDw8IGdldChwLnNlY29uZCwgKGZsb2F0ICopMCk7IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGNvdXQgPDwgIj8/PyI7IGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXAgPSAiLCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb3V0IDw8ICIpIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvdXQgPDwgIn07IiA8PCBlbmRsOworfQorCit2b2lkIGR1bXBEZXNjKGNvbnN0IEMyUGFyYW1EZXNjcmlwdG9yICZwZCkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CisgICAgaWYgKHBkLmlzUmVxdWlyZWQoKSkgeworICAgICAgICBjb3V0IDw8ICJyZXF1aXJlZCAiOworICAgIH0KKyAgICBpZiAocGQuaXNQZXJzaXN0ZW50KCkpIHsKKyAgICAgICAgY291dCA8PCAicGVyc2lzdGVudCAiOworICAgIH0KKyAgICBjb3V0IDw8ICJzdHJ1Y3QgIjsKKyAgICBkdW1wVHlwZShDMlBhcmFtOjpUeXBlKHBkLmluZGV4KCkudHlwZSgpKSk7CisgICAgY291dCA8PCAiICIgPDwgcGQubmFtZSgpIDw8ICI7IiA8PCBlbmRsOworfQorCitURVNUX0YoQzJTYW1wbGVDb21wb25lbnRUZXN0LCBSZWZsZWN0b3JUZXN0KSB7CisgICAgQzJDb21wb25lbnREb21haW5JbmZvIGRvbWFpbkluZm87CisgICAgc3RkOjpzaGFyZWRfcHRyPE15Q29tcG9uZW50SW5zdGFuY2U+IG15Q29tcChuZXcgTXlDb21wb25lbnRJbnN0YW5jZSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBjb21wID0gbXlDb21wOworCisgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzY3sKKyAgICAgICAgbXlDb21wLT5nZXRQYXJhbVJlZmxlY3RvcigpLT5kZXNjcmliZShDMkNvbXBvbmVudERvbWFpbkluZm86OkNPUkVfSU5ERVgpfTsKKyAgICBkdW1wU3RydWN0KCpkZXNjKTsKKworICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gcXVlcnkgPSB7CisgICAgICAgIHsgQzJQYXJhbUZpZWxkKCZkb21haW5JbmZvLCAmQzJDb21wb25lbnREb21haW5JbmZvOjp2YWx1ZSksCisgICAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpDVVJSRU5UIH0sCisgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeShDMlBhcmFtRmllbGQoJmRvbWFpbkluZm8sICZDMkNvbXBvbmVudERvbWFpbkluZm86OnZhbHVlKSwKKyAgICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OkNVUlJFTlQpLAorICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OkN1cnJlbnQoQzJQYXJhbUZpZWxkKCZkb21haW5JbmZvLCAmQzJDb21wb25lbnREb21haW5JbmZvOjp2YWx1ZSkpLAorICAgIH07CisKKyAgICBFWFBFQ1RfRVEoQzJfT0ssIGNvbXAtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3ZiKHF1ZXJ5LCBDMl9ET05UX0JMT0NLKSk7CisKKyAgICBmb3IgKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAmcSA6IHF1ZXJ5KSB7CisgICAgICAgIGR1bXBGU1YocS52YWx1ZXMsICZkb21haW5JbmZvLnZhbHVlKTsKKyAgICB9Cit9CisKK1RFU1RfRihDMlNhbXBsZUNvbXBvbmVudFRlc3QsIEZpZWxkU3VwcG9ydGVkVmFsdWVzVGVzdCkgeworICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIDA+IFVpbnQzMlRlc3RJbmZvOworICAgIFVpbnQzMlRlc3RJbmZvIHQ7CisgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gdmFsdWVzOworICAgIHZhbHVlcy5wdXNoX2JhY2soQzJGaWVsZFN1cHBvcnRlZFZhbHVlcygwLCAxMCwgMSkpOyAgLy8gbWluLCBtYXgsIHN0ZXAKKyAgICB2YWx1ZXMucHVzaF9iYWNrKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoMSwgNjQsIDIsIDEpKTsgIC8vIG1pbiwgbWF4LCBudW0sIGRlbgorICAgIHZhbHVlcy5wdXNoX2JhY2soQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhmYWxzZSwgezEsIDIsIDN9KSk7ICAvLyBmbGFncywgc3RkOjppbml0aWFsaXplcl9saXN0CisgICAgdWludDMyX3QgdmFsW10gPSB7MSwgMywgNSwgN307CisgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHYoc3RkOjpiZWdpbih2YWwpLCBzdGQ6OmVuZCh2YWwpKTsKKyAgICB2YWx1ZXMucHVzaF9iYWNrKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoZmFsc2UsIHYpKTsgIC8vIGZsYWdzLCBzdGQ6OnZlY3RvcgorCisgICAgZm9yIChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZzdiA6IHZhbHVlcykgeworICAgICAgICBkdW1wRlNWKHN2LCAmdC52YWx1ZSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdGVzdHMvQzJVdGlsVGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQzJVdGlsVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTljZDMxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMlV0aWxUZXN0LmNwcApAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJVdGlsVGVzdCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNkZWZpbmUgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fCisjaW5jbHVkZSA8X0MyTWFjcm9VdGlscy5oPgorI2luY2x1ZGUgPEMyRW51bS5oPgorCisvKiogXGZpbGUKKyAqIFRlc3RzIGZvciB2bmRrL3V0aWwuCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIF9DMk1hY3JvVXRpbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpY19hc3NlcnQoMCA9PSBfQzJfQVJHQygpLCAic2hvdWxkIGJlIDAiKTsKK3N0YXRpY19hc3NlcnQoMSA9PSBfQzJfQVJHQygxKSwgInNob3VsZCBiZSAxIik7CitzdGF0aWNfYXNzZXJ0KDIgPT0gX0MyX0FSR0MoMSwgMiksICJzaG91bGQgYmUgMiIpOworc3RhdGljX2Fzc2VydCg2NCA9PSBfQzJfQVJHQygKKyAgICAgICAgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsCisgICAgICAgIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwKKyAgICAgICAgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywgNjQpLCAic2hvdWxkIGJlIDY0Iik7CisKK3N0YXRpY19hc3NlcnQoMCA9PSBfQzJfQVJHQygsKSwgInNob3VsZCBiZSAwIik7CitzdGF0aWNfYXNzZXJ0KDEgPT0gX0MyX0FSR0MoMSwpLCAic2hvdWxkIGJlIDEiKTsKK3N0YXRpY19hc3NlcnQoMiA9PSBfQzJfQVJHQygxLCAyLCksICJzaG91bGQgYmUgMiIpOworc3RhdGljX2Fzc2VydCg2NCA9PSBfQzJfQVJHQygKKyAgICAgICAgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsCisgICAgICAgIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwKKyAgICAgICAgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywgNjQsKSwgInNob3VsZCBiZSA2NCIpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIF9DMkVudW1VdGlscyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2NsYXNzIEMyVXRpbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK307CisKK0MyRU5VTShFbnVtMSwgdWludDMyX3QsCisgICAgRW51bTFWYWx1ZTEsCisgICAgRW51bTFWYWx1ZTIsCisgICAgRW51bTFWYWx1ZTQgPSBFbnVtMVZhbHVlMiArIDIsCispOworCitDMkVOVU1fQ1VTVE9NX1BSRUZJWChFbnVtMiwgdWludDMyX3QsICJFbnVtIiwKKyAgICBFbnVtMlZhbHVlMSwKKyAgICBFbnVtMlZhbHVlMiwKKyAgICBFbnVtMlZhbHVlNCA9IEVudW0xVmFsdWUyICsgMiwKKyk7CisKK0MyRU5VTV9DVVNUT01fTkFNRVMoRW51bTMsIHVpbnQ4X3QsCisgICAgKHsgeyAidmFsdWUxIiwgRW51bTNWYWx1ZTEgfSwKKyAgICAgICB7ICJ2YWx1ZTIiLCBFbnVtM1ZhbHVlMiB9LAorICAgICAgIHsgInZhbHVlNCIsIEVudW0zVmFsdWU0IH0sCisgICAgICAgeyAiaW52YWxpZCIsIEludmFsaWQgfSB9KSwKKyAgICBFbnVtM1ZhbHVlMSwKKyAgICBFbnVtM1ZhbHVlMiwKKyAgICBFbnVtM1ZhbHVlNCA9IEVudW0zVmFsdWUyICsgMiwKKyAgICBJbnZhbGlkLAorKTsKKworVEVTVF9GKEMyVXRpbFRlc3QsIEVudW1VdGlsc1Rlc3QpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8QzJTdHJpbmcsIEVudW0zPj4gcGFpcnMgKCB7IHsgInZhbHVlMSIsIEVudW0zVmFsdWUxIH0sCisgICAgICB7ICJ2YWx1ZTIiLCBFbnVtM1ZhbHVlMiB9LAorICAgICAgeyAidmFsdWU0IiwgRW51bTNWYWx1ZTQgfSwKKyAgICAgIHsgImludmFsaWQiLCBJbnZhbGlkIH0gfSk7CisgICAgRW51bTMgZTM7CisgICAgQzJGaWVsZERlc2NyaXB0b3I6Om5hbWVkVmFsdWVzRm9yKGUzKTsKKworICAgIC8vIHVwcGVyIGNhc2UKKyAgICBFWFBFQ1RfRVEoInllcyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIllFUyIpKTsKKyAgICBFWFBFQ1RfRVEoIm5vIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiTk8iKSk7CisgICAgRVhQRUNUX0VRKCJ5ZXMtbm8iLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJZRVNfTk8iKSk7CisgICAgRVhQRUNUX0VRKCJ5ZXMtbm8iLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJZRVNfX05PIikpOworICAgIEVYUEVDVF9FUSgiYTJkcCIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIkEyRFAiKSk7CisgICAgRVhQRUNUX0VRKCJtcDItdHMiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJNUDJfVFMiKSk7CisgICAgRVhQRUNUX0VRKCJibG9jay0yZCIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIkJMT0NLXzJEIikpOworICAgIEVYUEVDVF9FUSgibXBlZy0yLXRzIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiTVBFR18yX1RTIikpOworICAgIEVYUEVDVF9FUSgiX2hpZGRlbi12YWx1ZSIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIl9ISURERU5fVkFMVUUiKSk7CisgICAgRVhQRUNUX0VRKCJfX2hpZGRlbi12YWx1ZTIiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJfX0hJRERFTl9WQUxVRTIiKSk7CisgICAgRVhQRUNUX0VRKCJfX2hpZGRlbi12YWx1ZS0yIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiX19ISURERU5fVkFMVUVfMiIpKTsKKworICAgIC8vIGNhbWVsIGNhc2UKKyAgICBFWFBFQ1RfRVEoInllcyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIlllcyIpKTsKKyAgICBFWFBFQ1RfRVEoIm5vIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiTm8iKSk7CisgICAgRVhQRUNUX0VRKCJ5ZXMtbm8iLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJZZXNObyIpKTsKKyAgICBFWFBFQ1RfRVEoInllcy1ubyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIlllc19ObyIpKTsKKyAgICBFWFBFQ1RfRVEoIm1wMi10cyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIk1QMlRzIikpOworICAgIEVYUEVDVF9FUSgiYmxvY2stMmQiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJCbG9jazJEIikpOworICAgIEVYUEVDVF9FUSgibXBlZy0yLXRzIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiTXBlZzJ0cyIpKTsKKyAgICBFWFBFQ1RfRVEoIl9oaWRkZW4tdmFsdWUiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJfSGlkZGVuVmFsdWUiKSk7CisgICAgRVhQRUNUX0VRKCJfX2hpZGRlbi12YWx1ZS0yIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiX19IaWRkZW5WYWx1ZTIiKSk7CisKKyAgICAvLyBtaXhlZCBjYXNlCisgICAgRVhQRUNUX0VRKCJtcDJ0LXMiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJNUDJUX3MiKSk7CisgICAgRVhQRUNUX0VRKCJibG9jay0yZCIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIkJsb2NrXzJEIikpOworICAgIEVYUEVDVF9FUSgiYmxvY2stMi1kIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiQmxvY2syX0QiKSk7CisgICAgRVhQRUNUX0VRKCJtcGVnLTItdHMiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJNcGVnXzJ0cyIpKTsKKyAgICBFWFBFQ1RfRVEoIm1wZWctMi10cyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIk1wZWdfMl9UUyIpKTsKKyAgICBFWFBFQ1RfRVEoIl9oaWRkZW4tdmFsdWUiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJfSGlkZGVuX19WQUxVRSIpKTsKKyAgICBFWFBFQ1RfRVEoIl9faGlkZGVuLXZhbHVlLTIiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJfX0hpZGRlblZhbHVlXzIiKSk7CisgICAgRVhQRUNUX0VRKCJfMiIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIl8yIikpOworICAgIEVYUEVDVF9FUSgiX18yMyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIl9fMjMiKSk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi90ZXN0cy9DMl90ZXN0LmNwcCBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWRhOWY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0MyX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyX3Rlc3QiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8QzIuaD4KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNUQVRJQyBURVNUUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwordGVtcGxhdGU8aW50IE4+CitzdHJ1Y3QgYzJfY29uc3RfY2hlY2tlcgoreworICAgIGlubGluZSBjb25zdGV4cHIgc3RhdGljIGludCBudW0oKSB7IHJldHVybiBOOyB9Cit9OworCitjb25zdGV4cHIgYXV0byBtaW5faTMyX2kzMiA9IGMyX21pbihpbnQzMl90KDEpLCBpbnQzMl90KDIpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1pbl9pMzJfaTMyKSwgY29uc3QgaW50MzJfdD46OnZhbHVlLCAic2hvdWxkIGJlIGludDMyX3QiKTsKK2NvbnN0ZXhwciBhdXRvIG1pbl9pMzJfaTY0ID0gYzJfbWluKGludDMyX3QoMyksIGludDY0X3QoMikpOworc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWluX2kzMl9pNjQpLCBjb25zdCBpbnQ2NF90Pjo6dmFsdWUsICJzaG91bGQgYmUgaW50NjRfdCIpOworY29uc3RleHByIGF1dG8gbWluX2k4X2kzMiA9IGMyX21pbihpbnQ4X3QoMHhmZiksIGludDMyX3QoMHhmZmZmZmZmZikpOworc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWluX2k4X2kzMiksIGNvbnN0IGludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSBpbnQzMl90Iik7CisKK3N0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtaW5faTMyX2kzMj46Om51bSgpID09IDEsICJzaG91bGQgYmUgMSIpOworc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1pbl9pMzJfaTY0Pjo6bnVtKCkgPT0gMiwgInNob3VsZCBiZSAyIik7CitzdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWluX2k4X2kzMj46Om51bSgpID09IDB4ZmZmZmZmZmYsICJzaG91bGQgYmUgMHhmZmZmZmZmZiIpOworCitjb25zdGV4cHIgYXV0byBtaW5fdTMyX3UzMiA9IGMyX21pbih1aW50MzJfdCgxKSwgdWludDMyX3QoMikpOworc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWluX3UzMl91MzIpLCBjb25zdCB1aW50MzJfdD46OnZhbHVlLCAic2hvdWxkIGJlIHVpbnQzMl90Iik7Citjb25zdGV4cHIgYXV0byBtaW5fdTMyX3U2NCA9IGMyX21pbih1aW50MzJfdCgzKSwgdWludDY0X3QoMikpOworc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWluX3UzMl91NjQpLCBjb25zdCB1aW50MzJfdD46OnZhbHVlLCAic2hvdWxkIGJlIHVpbnQzMl90Iik7Citjb25zdGV4cHIgYXV0byBtaW5fdTMyX3U4ID0gYzJfbWluKHVpbnQzMl90KDB4ZmZmZmZmZmYpLCB1aW50OF90KDB4ZmYpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1pbl91MzJfdTgpLCBjb25zdCB1aW50OF90Pjo6dmFsdWUsICJzaG91bGQgYmUgdWludDhfdCIpOworCitzdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWluX3UzMl91MzI+OjpudW0oKSA9PSAxLCAic2hvdWxkIGJlIDEiKTsKK3N0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtaW5fdTMyX3U2ND46Om51bSgpID09IDIsICJzaG91bGQgYmUgMiIpOworc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1pbl91MzJfdTg+OjpudW0oKSA9PSAweGZmLCAic2hvdWxkIGJlIDB4ZmYiKTsKKworY29uc3RleHByIGF1dG8gbWF4X2kzMl9pMzIgPSBjMl9tYXgoaW50MzJfdCgxKSwgaW50MzJfdCgyKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtYXhfaTMyX2kzMiksIGNvbnN0IGludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSBpbnQzMl90Iik7Citjb25zdGV4cHIgYXV0byBtYXhfaTMyX2k2NCA9IGMyX21heChpbnQzMl90KDMpLCBpbnQ2NF90KDIpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1heF9pMzJfaTY0KSwgY29uc3QgaW50NjRfdD46OnZhbHVlLCAic2hvdWxkIGJlIGludDY0X3QiKTsKK2NvbnN0ZXhwciBhdXRvIG1heF9pOF9pMzIgPSBjMl9tYXgoaW50OF90KDB4ZmYpLCBpbnQzMl90KDB4ZmZmZmZmZmYpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1heF9pOF9pMzIpLCBjb25zdCBpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgaW50MzJfdCIpOworCitzdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWF4X2kzMl9pMzI+OjpudW0oKSA9PSAyLCAic2hvdWxkIGJlIDIiKTsKK3N0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtYXhfaTMyX2k2ND46Om51bSgpID09IDMsICJzaG91bGQgYmUgMyIpOworc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1heF9pOF9pMzI+OjpudW0oKSA9PSAweGZmZmZmZmZmLCAic2hvdWxkIGJlIDB4ZmZmZmZmZmYiKTsKKworY29uc3RleHByIGF1dG8gbWF4X3UzMl91MzIgPSBjMl9tYXgodWludDMyX3QoMSksIHVpbnQzMl90KDIpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1heF91MzJfdTMyKSwgY29uc3QgdWludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50MzJfdCIpOworY29uc3RleHByIGF1dG8gbWF4X3UzMl91NjQgPSBjMl9tYXgodWludDMyX3QoMyksIHVpbnQ2NF90KDIpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1heF91MzJfdTY0KSwgY29uc3QgdWludDY0X3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50NjRfdCIpOworY29uc3RleHByIGF1dG8gbWF4X3UzMl91OCA9IGMyX21heCh1aW50MzJfdCgweDdmZmZmZmZmKSwgdWludDhfdCgweGZmKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtYXhfdTMyX3U4KSwgY29uc3QgdWludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50MzJfdCIpOworCitzdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWF4X3UzMl91MzI+OjpudW0oKSA9PSAyLCAic2hvdWxkIGJlIDIiKTsKK3N0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtYXhfdTMyX3U2ND46Om51bSgpID09IDMsICJzaG91bGQgYmUgMyIpOworc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1heF91MzJfdTg+OjpudW0oKSA9PSAweDdmZmZmZmZmLCAic2hvdWxkIGJlIDB4N2ZmZmZmZmYiKTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENPVU5URVIgVEVTVFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3ZvaWQgYzJfY250cl9zdGF0aWNfdGVzdCgpIHsKKyAgICAvLyBzYW5pdHkgY2hlY2tzIGZvciBjb25zdHJ1Y3Rpb24vYXNzaWdubWVudAorICAgIGNvbnN0ZXhwciBjMl9jbnRyMzJfdCBjMzJfYSgxMjMpOworICAgIGNvbnN0ZXhwciBjMl9jbnRyNjRfdCBjNjRfYSgtNDU2KTsKKyAgICBjMl9jbnRyMzJfdCBjMzJfYiBfX3VudXNlZCA9IGM2NF9hOworICAgIC8vIGMzMl9iID0gNjQuOyAvLyBESVNBTExPV0VECisgICAgLy8gYzJfY250cjY0X3QgYzY0X2IgPSBjMzJfYTsgLy8gRElTQUxMT1dFRAorCisgICAgLy8gc2FuaXR5IGNoZWNrcyBmb3Igc29tZSBjb25zdGV4cHIgb3BlcmF0b3JzCisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoYzMyX2EgKyBjNjRfYSksIGRlY2x0eXBlKGM2NF9hICsgYzMyX2EpPjo6dmFsdWUsICIrIHNob3VsZCByZXN1bHQgc2FtZSB0eXBlIik7CisgICAgc3RhdGljX2Fzc2VydChjMzJfYSArIGM2NF9hID09IGMyX2NudHIzMl90KC0zMzMpLCAiMTIzICsgLTQ1NiA9IC0zMzMiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGMzMl9hICsgYzMyX2EgPT0gYzJfY250cjMyX3QoMjQ2KSwgIjEyMyArIDEyMyA9IDI0NiIpOworICAgIHN0YXRpY19hc3NlcnQoYzY0X2EgKyBjMzJfYSA9PSBjMl9jbnRyMzJfdCgtMzMzKSwgIi00NTYgKyAxMjMgPSA1NzkiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShjMzJfYSArIDEpLCBkZWNsdHlwZSgxICsgYzMyX2EpPjo6dmFsdWUsICIrIHNob3VsZCByZXN1bHQgc2FtZSB0eXBlIik7CisgICAgc3RhdGljX2Fzc2VydChjMzJfYSArIDQ1NiA9PSBjMl9jbnRyMzJfdCg1NzkpLCAiMTIzICsgNDU2ID0gNTc5Iik7CisgICAgc3RhdGljX2Fzc2VydCg0NTYgKyBjNjRfYSA9PSBjMl9jbnRyNjRfdCgwKSwgIjQ1NiArIC00NTYgPSAwIik7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoYzMyX2EgLSBjNjRfYSksIGRlY2x0eXBlKGM2NF9hIC0gYzMyX2EpPjo6dmFsdWUsICItIHNob3VsZCByZXN1bHQgc2FtZSB0eXBlIik7CisgICAgc3RhdGljX2Fzc2VydChjMzJfYSAtIGM2NF9hID09IGMyX2NudHIzMl90KDU3OSksICIxMjMgLSAtNDU2ID0gNTc5Iik7CisgICAgc3RhdGljX2Fzc2VydChjMzJfYSAtIGMzMl9hID09IGMyX2NudHIzMl90KDApLCAiMTIzIC0gMTIzID0gMCIpOworICAgIHN0YXRpY19hc3NlcnQoYzY0X2EgLSBjMzJfYSA9PSBjMl9jbnRyMzJfdCgtNTc5KSwgIi00NTYgLSAxMjMgPSAtNTc5Iik7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoYzMyX2EgLSAxKSwgZGVjbHR5cGUoMSAtIGMzMl9hKT46OnZhbHVlLCAiLSBzaG91bGQgcmVzdWx0IHNhbWUgdHlwZSIpOworICAgIHN0YXRpY19hc3NlcnQoYzMyX2EgLSA0NTYgPT0gYzJfY250cjMyX3QoLTMzMyksICIxMjMgLSA0NTYgPSAtMzMzIik7CisgICAgc3RhdGljX2Fzc2VydCg0NTYgLSBjNjRfYSA9PSBjMl9jbnRyNjRfdCg5MTIpLCAiNDU2IC0gLTQ1NiA9IDkxMiIpOworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGMzMl9hICogYzY0X2EpLCBkZWNsdHlwZShjNjRfYSAqIGMzMl9hKT46OnZhbHVlLCAiKiBzaG91bGQgcmVzdWx0IHNhbWUgdHlwZSIpOworICAgIHN0YXRpY19hc3NlcnQoYzMyX2EgKiBjNjRfYSA9PSBjMl9jbnRyMzJfdCgtNTYwODgpLCAiMTIzICogLTQ1NiA9IC01NjA4OCIpOworICAgIHN0YXRpY19hc3NlcnQoYzMyX2EgKiBjMzJfYSA9PSBjMl9jbnRyMzJfdCgxNTEyOSksICIxMjMgKiAxMjMgPSAxNTEyOSIpOworICAgIHN0YXRpY19hc3NlcnQoYzY0X2EgKiBjMzJfYSA9PSBjMl9jbnRyMzJfdCgtNTYwODgpLCAiLTQ1NiAqIDEyMyA9IC01NjA4OCIpOworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGMzMl9hICogMSksIGRlY2x0eXBlKDEgKiBjMzJfYSk+Ojp2YWx1ZSwgIiogc2hvdWxkIHJlc3VsdCBzYW1lIHR5cGUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGMzMl9hICogNDU2ID09IGMyX2NudHIzMl90KDU2MDg4KSwgIjEyMyAqIDQ1NiA9IDU2MDg4Iik7CisgICAgc3RhdGljX2Fzc2VydCg0NTYgKiBjNjRfYSA9PSBjMl9jbnRyNjRfdCgtMjA3OTM2KSwgIjQ1NiAqIC00NTYgPSAtMjA3OTM2Iik7CisKKyAgICBzdGF0aWNfYXNzZXJ0KChjMzJfYSA8PCAyNnUpID09IGMyX2NudHIzMl90KDB4RUMwMDAwMDApLCAiMTIzIDw8IDI2ID0gMHhFQzAwMDAwMCIpOworCisgICAgLy8gc2FuaXR5IGNoZWNrcyBmb3IgdW5hcnkgb3BlcmF0b3JzCisgICAgc3RhdGljX2Fzc2VydChjMl9jbnRyMzJfdCgxKSA9PSArYzJfY250cjMyX3QoMSksICIxID09ICsxIik7CisgICAgc3RhdGljX2Fzc2VydChjMl9jbnRyMzJfdCgxKSA9PSAtYzJfY250cjMyX3QoLTEpLCAiMSA9PSAtLTEiKTsKKworICAgIC8vIHNhbml0eSBjaGVja3MgZm9yIGNvbXBhcmlzb24KKyAgICB1c2luZyBjOF90ID0gYzJfY250cl90PHVpbnQ4X3Q+OworICAgIHN0YXRpY19hc3NlcnQoYzhfdCgtMHg4MCkgPiBjOF90KDB4N2YpLCAiODAgPiA3RiIpOworICAgIHN0YXRpY19hc3NlcnQoYzhfdCgtMHg4MCkgPj0gYzhfdCgweDdmKSwgIjgwID49IDdGIik7CisgICAgc3RhdGljX2Fzc2VydChjOF90KDB4N2YpID4gYzhfdCgweDdlKSwgIjdGID4gN0UiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoMHg3ZikgPj0gYzhfdCgweDdlKSwgIjdGID49IDdFIik7CisgICAgc3RhdGljX2Fzc2VydCghKGM4X3QoLTB4ODApID4gYzhfdCgwKSksICI4MCAhPiAwMCIpOworICAgIHN0YXRpY19hc3NlcnQoIShjOF90KC0weDgwKSA+PSBjOF90KDApKSwgIjgwICE+PSAwMCIpOworICAgIHN0YXRpY19hc3NlcnQoIShjOF90KC0weDgwKSA+IGM4X3QoLTB4ODApKSwgIjgwICE+IDgwIik7CisgICAgc3RhdGljX2Fzc2VydChjOF90KC0weDgwKSA+PSBjOF90KC0weDgwKSwgIjgwID49IDgwIik7CisKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoLTB4ODApID09IGM4X3QoMHg4MCksICI4MCA9PSA4MCIpOworICAgIHN0YXRpY19hc3NlcnQoIShjOF90KC0weDgwKSA9PSBjOF90KDApKSwgIjgwICE9IDAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoLTB4ODApICE9IGM4X3QoMHg3ZiksICI4MCAhPSA3RiIpOworICAgIHN0YXRpY19hc3NlcnQoIShjOF90KDB4N2YpICE9IGM4X3QoMHg3ZikpLCAiODAgIT0gN0YiKTsKKworICAgIHN0YXRpY19hc3NlcnQoYzhfdCgweDdmKSA8IGM4X3QoLTB4ODApLCAiN0YgPCA4MCIpOworICAgIHN0YXRpY19hc3NlcnQoYzhfdCgweDdmKSA8PSBjOF90KC0weDgwKSwgIjdGIDwgODAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoMHg3ZSkgPCBjOF90KDB4N2YpLCAiN0UgPCA3RiIpOworICAgIHN0YXRpY19hc3NlcnQoYzhfdCgweDdlKSA8PSBjOF90KDB4N2YpLCAiN0UgPCA3RiIpOworICAgIHN0YXRpY19hc3NlcnQoIShjOF90KC0weDQwKSA8IGM4X3QoMHg0MCkpLCAiLTQwICE8IDQwIik7CisgICAgc3RhdGljX2Fzc2VydCghKGM4X3QoLTB4NDApIDw9IGM4X3QoMHg0MCkpLCAiLTQwICE8PSA0MCIpOworICAgIHN0YXRpY19hc3NlcnQoIShjOF90KC0weDQwKSA8IGM4X3QoLTB4NDApKSwgIi00MCAhPCAtNDAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoLTB4NDApIDw9IGM4X3QoLTB4NDApLCAiLTQwIDw9IC00MCIpOworCisgICAgc3RhdGljX2Fzc2VydChjMl9jbnRyMzJfdCgtMHg3ZmZmZmZmZiAtIDEpID4gYzJfY250cjMyX3QoMHg3ZmZmZmZmZiksICI4MCA+IDdGIik7CisgICAgc3RhdGljX2Fzc2VydCghKGMyX2NudHIzMl90KC0weDdmZmZmZmZmIC0gMSkgPiBjMl9jbnRyMzJfdCgwKSksICI4MCAhPiAwMCIpOworICAgIHN0YXRpY19hc3NlcnQoYzJfY250cjMyX3QoMSkgPT0gYzJfY250cjMyX3QoYzJfY250cjY0X3QoMHgxMDAwMDAwMDF1bCkpLCAiMSA9PSAxIik7Cit9CisKK2NsYXNzIEMyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworfTsKKworVEVTVF9GKEMyVGVzdCwgQ291bnRlclRlc3QpIHsKKyAgICBjMl9jbnRyMzJfdCBjMzJfYSgxMjMpOworICAgIGMyX2NudHI2NF90IGM2NF9hKC00NTYpOworICAgIEVYUEVDVF9FUShjMzJfYSArPSAzLCBjMl9jbnRyMzJfdCgxMjYpKTsKKyAgICBFWFBFQ1RfRVEoYzMyX2EgKz0gYzY0X2EsIGMyX2NudHIzMl90KC0zMzApKTsKKyAgICBFWFBFQ1RfRVEoYzMyX2EgPDw9IDJ1LCBjMl9jbnRyMzJfdCgtMTMyMCkpOworICAgIEVYUEVDVF9FUShjNjRfYSAqPSAzLCBjMl9jbnRyNjRfdCgtMTM2OCkpOworICAgIEVYUEVDVF9FUShjMzJfYSAtPSBjNjRfYSwgYzJfY250cjMyX3QoNDgpKTsKKyAgICBFWFBFQ1RfRVEoYzMyX2EgLT0gNDAsIGMyX2NudHIzMl90KDgpKTsKKyAgICBFWFBFQ1RfRVEoYzMyX2EgKj0gYzMyX2EsIGMyX2NudHIzMl90KDY0KSk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi90ZXN0cy92bmRrL0MyQnVmZmVyVGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvdGVzdHMvdm5kay9DMkJ1ZmZlclRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MDk5NGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdGVzdHMvdm5kay9DMkJ1ZmZlclRlc3QuY3BwCkBAIC0wLDAgKzEsNzY4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMlBhcmFtRGVmLmg+CisKKyNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDMkJ1ZmZlclV0aWxzVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICAgIHN0YXRpYyB2b2lkIFN0YXRpY1NlZ21lbnRUZXN0KCkgeworICAgICAgICAvLyBjb25zdHJ1Y3RvcgorICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5vZmZzZXQgPT0gMTIzLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLnNpemUgPT0gNDU2LCAiIik7CisKKyAgICAgICAgLy8gZW1wdHkKKyAgICAgICAgc3RhdGljX2Fzc2VydCghQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmlzRW1wdHkoKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCAwdSkuaXNFbXB0eSgpLCAiIik7CisKKyAgICAgICAgLy8gdmFsaWQKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaXNWYWxpZCgpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIH4xMjN1KS5pc1ZhbGlkKCksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghQzJTZWdtZW50KDEyM3UsIDEgKyB+MTIzdSkuaXNWYWxpZCgpLCAiIik7CisKKyAgICAgICAgLy8gYm9vbCgpCisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoKGJvb2wpQzJTZWdtZW50KDEyM3UsIH4xMjN1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFib29sKEMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFib29sKEMyU2VnbWVudCgxMjN1LCAwKSksICIiKTsKKworICAgICAgICAvLyAhCisgICAgICAgIHN0YXRpY19hc3NlcnQoISFDMlNlZ21lbnQoMTIzdSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghIUMyU2VnbWVudCgxMjN1LCB+MTIzdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghQzJTZWdtZW50KDEyM3UsIDEgKyB+MTIzdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghQzJTZWdtZW50KDEyM3UsIDApLCAiIik7CisKKyAgICAgICAgLy8gY29udGFpbnMKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLmNvbnRhaW5zKEMyU2VnbWVudCgxMjN1LCAwKSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghQzJTZWdtZW50KDEyM3UsIDEgKyB+MTIzdSkuY29udGFpbnMoQzJTZWdtZW50KDEyM3UsIDApKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCB+MTIzdSkuY29udGFpbnMoQzJTZWdtZW50KDEyM3UsIH4xMjN1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghQzJTZWdtZW50KDEyM3UsIH4xMjN1KS5jb250YWlucyhDMlNlZ21lbnQoMTIzdSwgMSArIH4xMjN1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghQzJTZWdtZW50KDEyM3UsIDEgKyB+MTIzdSkuY29udGFpbnMoQzJTZWdtZW50KDEyM3UsIDEgKyB+MTIzdSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIUMyU2VnbWVudCgxMjN1LCB+MTIzdSkuY29udGFpbnMoQzJTZWdtZW50KDEyMnUsIDJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLmNvbnRhaW5zKEMyU2VnbWVudCgxMjN1LCAydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDN1KS5jb250YWlucyhDMlNlZ21lbnQoMTI0dSwgMnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFDMlNlZ21lbnQoMTIzdSwgM3UpLmNvbnRhaW5zKEMyU2VnbWVudCgxMjV1LCAydSkpLCAiIik7CisKKyAgICAgICAgLy8gPT0KKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPT0gQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPT0gQzJTZWdtZW50KDEyM3UsIDQ1N3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDQ1NnUpID09IEMyU2VnbWVudCgxMjN1LCA0NTV1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA9PSBDMlNlZ21lbnQoMTIydSwgNDU2dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPT0gQzJTZWdtZW50KDEyNHUsIDQ1NnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDB1KSA9PSBDMlNlZ21lbnQoMTI0dSwgMHUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCAwdSkgPT0gQzJTZWdtZW50KDEyM3UsIDB1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpID09IEMyU2VnbWVudCgxMjR1LCAxICsgfjEyNHUpLCAiIik7CisKKyAgICAgICAgLy8gIT0KKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTZ1KSAhPSBDMlNlZ21lbnQoMTIzdSwgNDU2dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpICE9IEMyU2VnbWVudCgxMjN1LCA0NTd1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KSAhPSBDMlNlZ21lbnQoMTIzdSwgNDU1dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkgIT0gQzJTZWdtZW50KDEyMnUsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpICE9IEMyU2VnbWVudCgxMjR1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCAwdSkgIT0gQzJTZWdtZW50KDEyNHUsIDB1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDB1KSAhPSBDMlNlZ21lbnQoMTIzdSwgMHUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDEgKyB+MTIzdSkgIT0gQzJTZWdtZW50KDEyNHUsIDEgKyB+MTI0dSkpLCAiIik7CisKKyAgICAgICAgLy8gPD0KKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPD0gQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpIDw9IEMyU2VnbWVudCgxMjN1LCA0NTd1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA8PSBDMlNlZ21lbnQoMTIydSwgNDU3dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTd1KSA8PSBDMlNlZ21lbnQoMTIzdSwgNDU2dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgNDU3dSkgPD0gQzJTZWdtZW50KDEyM3UsIDQ1NnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDQ1N3UpIDw9IEMyU2VnbWVudCgxMjR1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCA0NTd1KSA8PSBDMlNlZ21lbnQoMTIzdSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMHUpIDw9IEMyU2VnbWVudCgxMjN1LCAwdSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDB1KSA8PSBDMlNlZ21lbnQoMTIydSwgMXUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyMnUsIDB1KSA8PSBDMlNlZ21lbnQoMTIydSwgMXUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgfjEyMnUpIDw9IEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkgPD0gQzJTZWdtZW50KDEyMnUsIH4xMjJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpIDw9IEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpKSwgIiIpOworCisgICAgICAgIC8vIDwKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA8IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPCBDMlNlZ21lbnQoMTIzdSwgNDU3dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPCBDMlNlZ21lbnQoMTIydSwgNDU3dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTd1KSA8IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCA0NTd1KSA8IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTd1KSA8IEMyU2VnbWVudCgxMjR1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCA0NTd1KSA8IEMyU2VnbWVudCgxMjN1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCAwdSkgPCBDMlNlZ21lbnQoMTIzdSwgMHUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCAwdSkgPCBDMlNlZ21lbnQoMTIydSwgMXUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyMnUsIDB1KSA8IEMyU2VnbWVudCgxMjJ1LCAxdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCB+MTIydSkgPCBDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpIDwgQzJTZWdtZW50KDEyMnUsIH4xMjJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpIDwgQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkpLCAiIik7CisKKyAgICAgICAgLy8gPD0KKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPj0gQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1N3UpID49IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjJ1LCA0NTd1KSA+PSBDMlNlZ21lbnQoMTIzdSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA+PSBDMlNlZ21lbnQoMTIzdSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPj0gQzJTZWdtZW50KDEyMnUsIDQ1N3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyNHUsIDQ1N3UpID49IEMyU2VnbWVudCgxMjN1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTd1KSA+PSBDMlNlZ21lbnQoMTIydSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgMHUpID49IEMyU2VnbWVudCgxMjJ1LCAwdSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyMnUsIDF1KSA+PSBDMlNlZ21lbnQoMTIzdSwgMHUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyMnUsIDF1KSA+PSBDMlNlZ21lbnQoMTIydSwgMHUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSA+PSBDMlNlZ21lbnQoMTIydSwgfjEyMnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIH4xMjJ1KSA+PSBDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpID49IEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpKSwgIiIpOworCisgICAgICAgIC8vIDwKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA+IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU3dSkgPiBDMlNlZ21lbnQoMTIzdSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIydSwgNDU3dSkgPiBDMlNlZ21lbnQoMTIzdSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA+IEMyU2VnbWVudCgxMjN1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA+IEMyU2VnbWVudCgxMjJ1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjR1LCA0NTd1KSA+IEMyU2VnbWVudCgxMjN1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTd1KSA+IEMyU2VnbWVudCgxMjJ1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCAwdSkgPiBDMlNlZ21lbnQoMTIydSwgMHUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjJ1LCAxdSkgPiBDMlNlZ21lbnQoMTIzdSwgMHUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyMnUsIDF1KSA+IEMyU2VnbWVudCgxMjJ1LCAwdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpID4gQzJTZWdtZW50KDEyMnUsIH4xMjJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCB+MTIydSkgPiBDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpID4gQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkpLCAiIik7CisKKyAgICAgICAgLy8gZW5kCisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmVuZCgpID09IDU3OXUsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgMHUpLmVuZCgpID09IDEyM3UsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLmVuZCgpID09IDB4ZmZmZmZmZmZ1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDEgKyB+MTIzdSkuZW5kKCkgPT0gMHUsICIiKTsKKworICAgICAgICAvLyBpbnRlcnNlY3QKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KSkgPT0gQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMTIzdSwgNDYwdSkpID09IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDEyNHUsIDQ2MHUpKSA9PSBDMlNlZ21lbnQoMTI0dSwgNDU1dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCg1Nzl1LCA0NjB1KSkgPT0gQzJTZWdtZW50KDU3OXUsIDB1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDU4OXUsIDQ2MHUpKSA9PSBDMlNlZ21lbnQoNTg5dSwgfjl1IC8qIC0xMCAqLyksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgxMjN1LCA0NTV1KSkgPT0gQzJTZWdtZW50KDEyM3UsIDQ1NXUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMTIydSwgNDU2dSkpID09IEMyU2VnbWVudCgxMjN1LCA0NTV1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDB1LCAxMjN1KSkgPT0gQzJTZWdtZW50KDEyM3UsIDB1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDB1LCAwdSkpID09IEMyU2VnbWVudCgxMjN1LCB+MTIydSAvKiAtMTIzICovKSwgIiIpOworCisgICAgICAgIC8vIG5vcm1hbGl6ZSAoY2hhbmdlIGludmFsaWQgc2VnbWVudHMgdG8gZW1wdHkgc2VnbWVudHMpCisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLm5vcm1hbGl6ZSgpID09IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCB+MTIzdSkubm9ybWFsaXplKCkgPT0gQzJTZWdtZW50KDEyM3UsIH4xMjN1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpLm5vcm1hbGl6ZSgpID09IEMyU2VnbWVudCgxMjN1LCAwdSksICIiKTsKKworICAgICAgICAvLyBub3RlOiBub3JtYWxpemUgY2Fubm90IGJlIHVzZWQgdG8gbWFrZSB0aGlzIHdvcmsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgxNTB1LCB+MTUwdSkpLm5vcm1hbGl6ZSgpID09IEMyU2VnbWVudCgxNTB1LCA0Mjl1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDE1MHUsIDEgKyB+MTUwdSkpLm5vcm1hbGl6ZSgpICE9IEMyU2VnbWVudCgxNTB1LCA0Mjl1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDE1MHUsIDEgKyB+MTUwdSkpLm5vcm1hbGl6ZSgpID09IEMyU2VnbWVudCgxNTB1LCAwdSksICIiKTsKKworICAgICAgICAvLyBzYXR1cmF0ZSAoY2hhbmdlIGludmFsaWQgc2VnbWVudHMgdG8gZnVsbCBzZWdtZW50cyB1cCB0byBtYXgpCisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLnNhdHVyYXRlKCkgPT0gQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIH4xMjN1KS5zYXR1cmF0ZSgpID09IEMyU2VnbWVudCgxMjN1LCB+MTIzdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgMSArIH4xMjN1KS5zYXR1cmF0ZSgpID09IEMyU2VnbWVudCgxMjN1LCB+MTIzdSksICIiKTsKKworICAgICAgICAvLyBub3RlOiBzYXR1cmF0ZSBjYW4gYmUgdXNlZCB0byBtYWtlIHRoaXMgd29yayBidXQgb25seSBwYXJ0aWFsbHkKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgxNTB1LCAxICsgfjE1MHUpLnNhdHVyYXRlKCkpLm5vcm1hbGl6ZSgpID09IEMyU2VnbWVudCgxNTB1LCA0Mjl1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDB1LCAxMDB1KS5zYXR1cmF0ZSgpKS5ub3JtYWxpemUoKSA9PSBDMlNlZ21lbnQoMTIzdSwgMHUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMTAwMHUsIDEwMHUpLnNhdHVyYXRlKCkpLm5vcm1hbGl6ZSgpICE9IEMyU2VnbWVudCg1Nzl1LCAwdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgxMDAwdSwgMTAwdSkuc2F0dXJhdGUoKSkubm9ybWFsaXplKCkgPT0gQzJTZWdtZW50KDEwMDB1LCAwdSksICIiKTsKKworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIFN0YXRpY0xpbmVhclJhbmdlQW5kQ2FwYWNpdHlUZXN0KCkgeworICAgICAgICBjbGFzcyBUZXN0Q2FwYWNpdHkgOiBwdWJsaWMgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgeworICAgICAgICAgICAgdXNpbmcgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3Q6Ol9DMkxpbmVhckNhcGFjaXR5QXNwZWN0OworICAgICAgICAgICAgZnJpZW5kIGNsYXNzIEMyQnVmZmVyVXRpbHNUZXN0OworICAgICAgICB9OworCisgICAgICAgIGNsYXNzIFRlc3RSYW5nZSA6IHB1YmxpYyBfQzJMaW5lYXJSYW5nZUFzcGVjdCB7CisgICAgICAgICAgICB1c2luZyBfQzJMaW5lYXJSYW5nZUFzcGVjdDo6X0MyTGluZWFyUmFuZ2VBc3BlY3Q7CisgICAgICAgICAgICBmcmllbmQgY2xhc3MgQzJCdWZmZXJVdGlsc1Rlc3Q7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0Q2FwYWNpdHkoMHUpLmNhcGFjaXR5KCkgPT0gMHUsICIiKTsKKyAgICAgICAgY29uc3RleHByIFRlc3RDYXBhY2l0eSBjYXAoMTIzdSk7CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdENhcGFjaXR5KCZjYXApLmNhcGFjaXR5KCkgPT0gMTIzdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RDYXBhY2l0eShudWxscHRyKS5jYXBhY2l0eSgpID09IDB1LCAiIik7CisKKyAgICAgICAgLy8gX0MyTGluZWFyQ2FwYWNpdHlSYW5nZQorICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RSYW5nZSgmY2FwKS5jYXBhY2l0eSgpID09IDEyM3UsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCkub2Zmc2V0KCkgPT0gMHUsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCkuc2l6ZSgpID09IDEyM3UsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCkuZW5kT2Zmc2V0KCkgPT0gMTIzdSwgIiIpOworCisgICAgICAgIGNvbnN0ZXhwciBUZXN0UmFuZ2UgcmFuZ2UoJmNhcCwgNTB1LCAxMDB1KTsKKworICAgICAgICBzdGF0aWNfYXNzZXJ0KHJhbmdlLmNhcGFjaXR5KCkgPT0gMTIzdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHJhbmdlLm9mZnNldCgpID09IDUwdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHJhbmdlLnNpemUoKSA9PSA3M3UsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChyYW5nZS5lbmRPZmZzZXQoKSA9PSAxMjN1LCAiIik7CisKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCwgMjB1LCAzMHUpLmNhcGFjaXR5KCkgPT0gMTIzdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RSYW5nZSgmY2FwLCAyMHUsIDMwdSkub2Zmc2V0KCkgPT0gMjB1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXAsIDIwdSwgMzB1KS5zaXplKCkgPT0gMzB1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXAsIDIwdSwgMzB1KS5lbmRPZmZzZXQoKSA9PSA1MHUsICIiKTsKKworICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RSYW5nZSgmY2FwLCAyMDB1LCAzMHUpLmNhcGFjaXR5KCkgPT0gMTIzdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RSYW5nZSgmY2FwLCAyMDB1LCAzMHUpLm9mZnNldCgpID09IDEyM3UsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCwgMjAwdSwgMzB1KS5zaXplKCkgPT0gMHUsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCwgMjAwdSwgMzB1KS5lbmRPZmZzZXQoKSA9PSAxMjN1LCAiIik7CisKKyAgICB9CisKK307CisKKworY2xhc3MgQzJCdWZmZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CitwdWJsaWM6CisgICAgQzJCdWZmZXJUZXN0KCkKKyAgICAgICAgOiBtQmxvY2tQb29sSWQoQzJCbG9ja1Bvb2w6OlBMQVRGT1JNX1NUQVJUKSwKKyAgICAgICAgICBtTGluZWFyQWxsb2NhdG9yKHN0ZDo6bWFrZV9zaGFyZWQ8QzJBbGxvY2F0b3JJb24+KCdpJykpLAorICAgICAgICAgIG1TaXplKDB1KSwKKyAgICAgICAgICBtQWRkcihudWxscHRyKSwKKyAgICAgICAgICBtR3JhcGhpY0FsbG9jYXRvcihzdGQ6Om1ha2Vfc2hhcmVkPEMyQWxsb2NhdG9yR3JhbGxvYz4oJ2cnKSkgeworICAgIH0KKworICAgIH5DMkJ1ZmZlclRlc3QoKSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIGFsbG9jYXRlTGluZWFyKHNpemVfdCBjYXBhY2l0eSkgeworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtTGluZWFyQWxsb2NhdG9yLT5uZXdMaW5lYXJBbGxvY2F0aW9uKAorICAgICAgICAgICAgICAgIGNhcGFjaXR5LAorICAgICAgICAgICAgICAgIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LAorICAgICAgICAgICAgICAgICZtTGluZWFyQWxsb2NhdGlvbik7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIG1MaW5lYXJBbGxvY2F0aW9uLnJlc2V0KCk7CisgICAgICAgICAgICBGQUlMKCkgPDwgIkMyQWxsb2NhdG9yOjpuZXdMaW5lYXJBbGxvY2F0aW9uKCkgZmFpbGVkOiAiIDw8IGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgbWFwTGluZWFyKHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplLCB1aW50OF90ICoqYWRkcikgeworICAgICAgICBBU1NFUlRfVFJVRShtTGluZWFyQWxsb2NhdGlvbik7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1MaW5lYXJBbGxvY2F0aW9uLT5tYXAoCisgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgICZtQWRkcik7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIG1BZGRyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIEZBSUwoKSA8PCAiQzJMaW5lYXJBbGxvY2F0aW9uOjptYXAoKSBmYWlsZWQ6ICIgPDwgZXJyOworICAgICAgICB9CisgICAgICAgIEFTU0VSVF9ORShudWxscHRyLCBtQWRkcik7CisgICAgICAgIG1TaXplID0gc2l6ZTsKKyAgICAgICAgKmFkZHIgPSAodWludDhfdCAqKW1BZGRyOworICAgIH0KKworICAgIHZvaWQgdW5tYXBMaW5lYXIoKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKG1MaW5lYXJBbGxvY2F0aW9uKTsKKyAgICAgICAgQVNTRVJUX05FKG51bGxwdHIsIG1BZGRyKTsKKyAgICAgICAgQVNTRVJUX05FKDB1LCBtU2l6ZSk7CisKKyAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgQVNTRVJUX0VRKEMyX09LLCBtTGluZWFyQWxsb2NhdGlvbi0+dW5tYXAobUFkZHIsIG1TaXplLCBudWxscHRyKSk7CisgICAgICAgIG1TaXplID0gMHU7CisgICAgICAgIG1BZGRyID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1ha2VMaW5lYXJCbG9ja1Bvb2woKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sPihtTGluZWFyQWxsb2NhdG9yLCBtQmxvY2tQb29sSWQrKyk7CisgICAgfQorCisgICAgdm9pZCBhbGxvY2F0ZUdyYXBoaWModWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgeworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtR3JhcGhpY0FsbG9jYXRvci0+bmV3R3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICAgICAgd2lkdGgsCisgICAgICAgICAgICAgICAgaGVpZ2h0LAorICAgICAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCwKKyAgICAgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICAgICAmbUdyYXBoaWNBbGxvY2F0aW9uKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgbUdyYXBoaWNBbGxvY2F0aW9uLnJlc2V0KCk7CisgICAgICAgICAgICBGQUlMKCkgPDwgIkMyQWxsb2NhdG9yOjpuZXdHcmFwaGljQWxsb2NhdGlvbigpIGZhaWxlZDogIiA8PCBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIG1hcEdyYXBoaWMoQzJSZWN0IHJlY3QsIEMyUGxhbmFyTGF5b3V0ICpsYXlvdXQsIHVpbnQ4X3QgKiphZGRyKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKG1HcmFwaGljQWxsb2NhdGlvbik7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1HcmFwaGljQWxsb2NhdGlvbi0+bWFwKAorICAgICAgICAgICAgICAgIHJlY3QsCisgICAgICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGxheW91dCwKKyAgICAgICAgICAgICAgICBhZGRyKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfWV0gPSBudWxscHRyOworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVV0gPSBudWxscHRyOworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVl0gPSBudWxscHRyOworICAgICAgICAgICAgRkFJTCgpIDw8ICJDMkdyYXBoaWNBbGxvY2F0aW9uOjptYXAoKSBmYWlsZWQ6ICIgPDwgZXJyOworICAgICAgICB9CisgICAgICAgIG1NYXBwZWRSZWN0ID0gcmVjdDsKKyAgICAgICAgbWVtY3B5KG1BZGRyR3JhcGhpYywgYWRkciwgc2l6ZW9mKHVpbnQ4X3QqKSAqIEMyUGxhbmFyTGF5b3V0OjpNQVhfTlVNX1BMQU5FUyk7CisgICAgfQorCisgICAgdm9pZCB1bm1hcEdyYXBoaWMoKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKG1HcmFwaGljQWxsb2NhdGlvbik7CisKKyAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgQVNTRVJUX0VRKEMyX09LLCBtR3JhcGhpY0FsbG9jYXRpb24tPnVubWFwKG1BZGRyR3JhcGhpYywgbU1hcHBlZFJlY3QsIG51bGxwdHIpKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1ha2VHcmFwaGljQmxvY2tQb29sKCkgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxDMkJhc2ljR3JhcGhpY0Jsb2NrUG9vbD4obUdyYXBoaWNBbGxvY2F0b3IpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBtQmxvY2tQb29sSWQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtTGluZWFyQWxsb2NhdG9yOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+IG1MaW5lYXJBbGxvY2F0aW9uOworICAgIHNpemVfdCBtU2l6ZTsKKyAgICB2b2lkICptQWRkcjsKKyAgICBDMlJlY3QgbU1hcHBlZFJlY3Q7CisgICAgdWludDhfdCogbUFkZHJHcmFwaGljW0MyUGxhbmFyTGF5b3V0OjpNQVhfTlVNX1BMQU5FU107CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1HcmFwaGljQWxsb2NhdG9yOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBtR3JhcGhpY0FsbG9jYXRpb247Cit9OworCitURVNUX0YoQzJCdWZmZXJUZXN0LCBMaW5lYXJBbGxvY2F0aW9uVGVzdCkgeworICAgIGNvbnN0ZXhwciBzaXplX3Qga0NhcGFjaXR5ID0gMTAyNHUgKiAxMDI0dTsKKworICAgIGFsbG9jYXRlTGluZWFyKGtDYXBhY2l0eSk7CisKKyAgICB1aW50OF90ICphZGRyID0gbnVsbHB0cjsKKyAgICBtYXBMaW5lYXIoMHUsIGtDYXBhY2l0eSwgJmFkZHIpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBhZGRyKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga0NhcGFjaXR5OyArK2kpIHsKKyAgICAgICAgYWRkcltpXSA9IGkgJSAxMDB1OworICAgIH0KKworICAgIHVubWFwTGluZWFyKCk7CisgICAgYWRkciA9IG51bGxwdHI7CisKKyAgICBtYXBMaW5lYXIoa0NhcGFjaXR5IC8gMywga0NhcGFjaXR5IC8gMywgJmFkZHIpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBhZGRyKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtDYXBhY2l0eSAvIDM7ICsraSkgeworICAgICAgICBBU1NFUlRfRVEoKGkgKyBrQ2FwYWNpdHkgLyAzKSAlIDEwMCwgYWRkcltpXSkgPDwgIiBhdCBpID0gIiA8PCBpOworICAgIH0KK30KKworVEVTVF9GKEMyQnVmZmVyVGVzdCwgQmxvY2tQb29sVGVzdCkgeworICAgIGNvbnN0ZXhwciBzaXplX3Qga0NhcGFjaXR5ID0gMTAyNHUgKiAxMDI0dTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gYmxvY2tQb29sKG1ha2VMaW5lYXJCbG9ja1Bvb2woKSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQVNTRVJUX0VRKEMyX09LLCBibG9ja1Bvb2wtPmZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICBrQ2FwYWNpdHksCisgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICZibG9jaykpOworICAgIEFTU0VSVF9UUlVFKGJsb2NrKTsKKworICAgIEMyQWNxdWlyYWJsZTxDMldyaXRlVmlldz4gd3JpdGVWaWV3SG9sZGVyID0gYmxvY2stPm1hcCgpOworICAgIEMyV3JpdGVWaWV3IHdyaXRlVmlldyA9IHdyaXRlVmlld0hvbGRlci5nZXQoKTsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIHdyaXRlVmlldy5lcnJvcigpKTsKKyAgICBBU1NFUlRfRVEoa0NhcGFjaXR5LCB3cml0ZVZpZXcuY2FwYWNpdHkoKSk7CisgICAgQVNTRVJUX0VRKDB1LCB3cml0ZVZpZXcub2Zmc2V0KCkpOworICAgIEFTU0VSVF9FUShrQ2FwYWNpdHksIHdyaXRlVmlldy5zaXplKCkpOworCisgICAgdWludDhfdCAqZGF0YSA9IHdyaXRlVmlldy5kYXRhKCk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGRhdGEpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgd3JpdGVWaWV3LnNpemUoKTsgKytpKSB7CisgICAgICAgIGRhdGFbaV0gPSBpICUgMTAwdTsKKyAgICB9CisKKyAgICB3cml0ZVZpZXcuc2V0T2Zmc2V0KGtDYXBhY2l0eSAvIDMpOworICAgIGRhdGEgPSB3cml0ZVZpZXcuZGF0YSgpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBkYXRhKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHdyaXRlVmlldy5zaXplKCk7ICsraSkgeworICAgICAgICBBU1NFUlRfRVEoKGkgKyBrQ2FwYWNpdHkgLyAzKSAlIDEwMHUsIGRhdGFbaV0pIDw8ICIgYXQgaSA9ICIgPDwgaQorICAgICAgICAgICAgPDwgIjsgZGF0YSA9ICIgPDwgc3RhdGljX2Nhc3Q8dm9pZCAqPihkYXRhKTsKKyAgICB9CisKKyAgICBDMkZlbmNlIGZlbmNlOworICAgIEMyQ29uc3RMaW5lYXJCbG9jayBjb25zdEJsb2NrID0gYmxvY2stPnNoYXJlKAorICAgICAgICAgICAga0NhcGFjaXR5IC8gMywga0NhcGFjaXR5IC8gMywgZmVuY2UpOworCisgICAgQzJBY3F1aXJhYmxlPEMyUmVhZFZpZXc+IHJlYWRWaWV3SG9sZGVyID0gY29uc3RCbG9jay5tYXAoKTsKKyAgICBDMlJlYWRWaWV3IHJlYWRWaWV3ID0gcmVhZFZpZXdIb2xkZXIuZ2V0KCk7CisgICAgQVNTRVJUX0VRKEMyX09LLCByZWFkVmlldy5lcnJvcigpKTsKKyAgICBBU1NFUlRfRVEoa0NhcGFjaXR5IC8gMywgcmVhZFZpZXcuY2FwYWNpdHkoKSk7CisKKyAgICAvLyBUT0RPOiBmZW5jZQorICAgIGNvbnN0IHVpbnQ4X3QgKmNvbnN0RGF0YSA9IHJlYWRWaWV3LmRhdGEoKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgY29uc3REYXRhKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlYWRWaWV3LmNhcGFjaXR5KCk7ICsraSkgeworICAgICAgICBBU1NFUlRfRVEoKGkgKyBrQ2FwYWNpdHkgLyAzKSAlIDEwMHUsIGNvbnN0RGF0YVtpXSkgPDwgIiBhdCBpID0gIiA8PCBpCisgICAgICAgICAgICAgICAgPDwgIjsgZGF0YSA9ICIgPDwgc3RhdGljX2Nhc3Q8dm9pZCAqPihkYXRhKQorICAgICAgICAgICAgICAgIDw8ICI7IGNvbnN0RGF0YSA9ICIgPDwgc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCAqPihjb25zdERhdGEpOworICAgIH0KKworICAgIHJlYWRWaWV3ID0gcmVhZFZpZXcuc3ViVmlldygzMzN1LCAxMDB1KTsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIHJlYWRWaWV3LmVycm9yKCkpOworICAgIEFTU0VSVF9FUSgxMDB1LCByZWFkVmlldy5jYXBhY2l0eSgpKTsKKworICAgIGNvbnN0RGF0YSA9IHJlYWRWaWV3LmRhdGEoKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgY29uc3REYXRhKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlYWRWaWV3LmNhcGFjaXR5KCk7ICsraSkgeworICAgICAgICBBU1NFUlRfRVEoKGkgKyAzMzN1ICsga0NhcGFjaXR5IC8gMykgJSAxMDB1LCBjb25zdERhdGFbaV0pIDw8ICIgYXQgaSA9ICIgPDwgaTsKKyAgICB9Cit9CisKK3ZvaWQgZmlsbFBsYW5lKGNvbnN0IEMyUmVjdCByZWN0LCBjb25zdCBDMlBsYW5lSW5mbyBpbmZvLCB1aW50OF90ICphZGRyLCB1aW50OF90IHZhbHVlKSB7CisgICAgZm9yICh1aW50MzJfdCByb3cgPSAwOyByb3cgPCByZWN0LmhlaWdodCAvIGluZm8ucm93U2FtcGxpbmc7ICsrcm93KSB7CisgICAgICAgIGludDMyX3Qgcm93T2Zmc2V0ID0gKHJvdyArIHJlY3QudG9wIC8gaW5mby5yb3dTYW1wbGluZykgKiBpbmZvLnJvd0luYzsKKyAgICAgICAgZm9yICh1aW50MzJfdCBjb2wgPSAwOyBjb2wgPCByZWN0LndpZHRoIC8gaW5mby5jb2xTYW1wbGluZzsgKytjb2wpIHsKKyAgICAgICAgICAgIGludDMyX3QgY29sT2Zmc2V0ID0gKGNvbCArIHJlY3QubGVmdCAvIGluZm8uY29sU2FtcGxpbmcpICogaW5mby5jb2xJbmM7CisgICAgICAgICAgICBhZGRyW3Jvd09mZnNldCArIGNvbE9mZnNldF0gPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCB2ZXJpZnlQbGFuZShjb25zdCBDMlJlY3QgcmVjdCwgY29uc3QgQzJQbGFuZUluZm8gaW5mbywgY29uc3QgdWludDhfdCAqYWRkciwgdWludDhfdCB2YWx1ZSkgeworICAgIGZvciAodWludDMyX3Qgcm93ID0gMDsgcm93IDwgcmVjdC5oZWlnaHQgLyBpbmZvLnJvd1NhbXBsaW5nOyArK3JvdykgeworICAgICAgICBpbnQzMl90IHJvd09mZnNldCA9IChyb3cgKyByZWN0LnRvcCAvIGluZm8ucm93U2FtcGxpbmcpICogaW5mby5yb3dJbmM7CisgICAgICAgIGZvciAodWludDMyX3QgY29sID0gMDsgY29sIDwgcmVjdC53aWR0aCAvIGluZm8uY29sU2FtcGxpbmc7ICsrY29sKSB7CisgICAgICAgICAgICBpbnQzMl90IGNvbE9mZnNldCA9IChjb2wgKyByZWN0LmxlZnQgLyBpbmZvLmNvbFNhbXBsaW5nKSAqIGluZm8uY29sSW5jOworICAgICAgICAgICAgaWYgKGFkZHJbcm93T2Zmc2V0ICsgY29sT2Zmc2V0XSAhPSB2YWx1ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworVEVTVF9GKEMyQnVmZmVyVGVzdCwgR3JhcGhpY0FsbG9jYXRpb25UZXN0KSB7CisgICAgY29uc3RleHByIHVpbnQzMl90IGtXaWR0aCA9IDMyMDsKKyAgICBjb25zdGV4cHIgdWludDMyX3Qga0hlaWdodCA9IDI0MDsKKworICAgIGFsbG9jYXRlR3JhcGhpYyhrV2lkdGgsIGtIZWlnaHQpOworCisgICAgdWludDhfdCAqYWRkcltDMlBsYW5hckxheW91dDo6TUFYX05VTV9QTEFORVNdOworICAgIEMyUmVjdCByZWN0KGtXaWR0aCwga0hlaWdodCk7CisgICAgQzJQbGFuYXJMYXlvdXQgbGF5b3V0OworICAgIG1hcEdyYXBoaWMocmVjdCwgJmxheW91dCwgYWRkcik7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVV0pOworICAgIEFTU0VSVF9ORShudWxscHRyLCBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSk7CisKKyAgICB1aW50OF90ICp5ID0gYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgQzJQbGFuZUluZm8geUluZm8gPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICB1aW50OF90ICp1ID0gYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgQzJQbGFuZUluZm8gdUluZm8gPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICB1aW50OF90ICp2ID0gYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisgICAgQzJQbGFuZUluZm8gdkluZm8gPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKworICAgIGZpbGxQbGFuZShyZWN0LCB5SW5mbywgeSwgMCk7CisgICAgZmlsbFBsYW5lKHJlY3QsIHVJbmZvLCB1LCAwKTsKKyAgICBmaWxsUGxhbmUocmVjdCwgdkluZm8sIHYsIDApOworICAgIGZpbGxQbGFuZShDMlJlY3Qoa1dpZHRoIC8gMiwga0hlaWdodCAvIDIpLmF0KGtXaWR0aCAvIDQsIGtIZWlnaHQgLyA0KSwgeUluZm8sIHksIDB4MTIpOworICAgIGZpbGxQbGFuZShDMlJlY3Qoa1dpZHRoIC8gMiwga0hlaWdodCAvIDIpLmF0KGtXaWR0aCAvIDQsIGtIZWlnaHQgLyA0KSwgdUluZm8sIHUsIDB4MzQpOworICAgIGZpbGxQbGFuZShDMlJlY3Qoa1dpZHRoIC8gMiwga0hlaWdodCAvIDIpLmF0KGtXaWR0aCAvIDQsIGtIZWlnaHQgLyA0KSwgdkluZm8sIHYsIDB4NTYpOworCisgICAgdW5tYXBHcmFwaGljKCk7CisKKyAgICBtYXBHcmFwaGljKHJlY3QsICZsYXlvdXQsIGFkZHIpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVl0pOworCisgICAgeSA9IGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgIHlJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgdSA9IGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgIHVJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgdiA9IGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworICAgIHZJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZShDMlJlY3Qoa1dpZHRoIC8gMiwga0hlaWdodCAvIDIpLmF0KGtXaWR0aCAvIDQsIGtIZWlnaHQgLyA0KSwgeUluZm8sIHksIDB4MTIpKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZShDMlJlY3Qoa1dpZHRoIC8gMiwga0hlaWdodCAvIDIpLmF0KGtXaWR0aCAvIDQsIGtIZWlnaHQgLyA0KSwgdUluZm8sIHUsIDB4MzQpKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZShDMlJlY3Qoa1dpZHRoIC8gMiwga0hlaWdodCAvIDIpLmF0KGtXaWR0aCAvIDQsIGtIZWlnaHQgLyA0KSwgdkluZm8sIHYsIDB4NTYpKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCwga0hlaWdodCAvIDQgfSwgeUluZm8sIHksIDApKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCwga0hlaWdodCAvIDQgfSwgdUluZm8sIHUsIDApKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCwga0hlaWdodCAvIDQgfSwgdkluZm8sIHYsIDApKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCAvIDQsIGtIZWlnaHQgfSwgeUluZm8sIHksIDApKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCAvIDQsIGtIZWlnaHQgfSwgdUluZm8sIHUsIDApKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCAvIDQsIGtIZWlnaHQgfSwgdkluZm8sIHYsIDApKTsKK30KKworVEVTVF9GKEMyQnVmZmVyVGVzdCwgR3JhcGhpY0Jsb2NrUG9vbFRlc3QpIHsKKyAgICBjb25zdGV4cHIgdWludDMyX3Qga1dpZHRoID0gMzIwOworICAgIGNvbnN0ZXhwciB1aW50MzJfdCBrSGVpZ2h0ID0gMjQwOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBibG9ja1Bvb2wobWFrZUdyYXBoaWNCbG9ja1Bvb2woKSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrOworICAgIEFTU0VSVF9FUShDMl9PSywgYmxvY2tQb29sLT5mZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIGtXaWR0aCwKKyAgICAgICAgICAgIGtIZWlnaHQsCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgsCisgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICZibG9jaykpOworICAgIEFTU0VSVF9UUlVFKGJsb2NrKTsKKworICAgIEMyQWNxdWlyYWJsZTxDMkdyYXBoaWNWaWV3PiBncmFwaGljVmlld0hvbGRlciA9IGJsb2NrLT5tYXAoKTsKKyAgICBDMkdyYXBoaWNWaWV3IGdyYXBoaWNWaWV3ID0gZ3JhcGhpY1ZpZXdIb2xkZXIuZ2V0KCk7CisgICAgQVNTRVJUX0VRKEMyX09LLCBncmFwaGljVmlldy5lcnJvcigpKTsKKyAgICBBU1NFUlRfRVEoa1dpZHRoLCBncmFwaGljVmlldy53aWR0aCgpKTsKKyAgICBBU1NFUlRfRVEoa0hlaWdodCwgZ3JhcGhpY1ZpZXcuaGVpZ2h0KCkpOworCisgICAgdWludDhfdCAqY29uc3QgKmRhdGEgPSBncmFwaGljVmlldy5kYXRhKCk7CisgICAgQzJQbGFuYXJMYXlvdXQgbGF5b3V0ID0gZ3JhcGhpY1ZpZXcubGF5b3V0KCk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGRhdGEpOworCisgICAgdWludDhfdCAqeSA9IGRhdGFbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgIEMyUGxhbmVJbmZvIHlJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgdWludDhfdCAqdSA9IGRhdGFbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgIEMyUGxhbmVJbmZvIHVJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgdWludDhfdCAqdiA9IGRhdGFbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworICAgIEMyUGxhbmVJbmZvIHZJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisKKyAgICBmaWxsUGxhbmUoeyBrV2lkdGgsIGtIZWlnaHQgfSwgeUluZm8sIHksIDApOworICAgIGZpbGxQbGFuZSh7IGtXaWR0aCwga0hlaWdodCB9LCB1SW5mbywgdSwgMCk7CisgICAgZmlsbFBsYW5lKHsga1dpZHRoLCBrSGVpZ2h0IH0sIHZJbmZvLCB2LCAwKTsKKyAgICBmaWxsUGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHlJbmZvLCB5LCAweDEyKTsKKyAgICBmaWxsUGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHVJbmZvLCB1LCAweDM0KTsKKyAgICBmaWxsUGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHZJbmZvLCB2LCAweDU2KTsKKworICAgIEMyRmVuY2UgZmVuY2U7CisgICAgQzJDb25zdEdyYXBoaWNCbG9jayBjb25zdEJsb2NrID0gYmxvY2stPnNoYXJlKEMyUmVjdChrV2lkdGgsIGtIZWlnaHQpLCBmZW5jZSk7CisgICAgYmxvY2sucmVzZXQoKTsKKworICAgIEMyQWNxdWlyYWJsZTxjb25zdCBDMkdyYXBoaWNWaWV3PiBjb25zdFZpZXdIb2xkZXIgPSBjb25zdEJsb2NrLm1hcCgpOworICAgIGNvbnN0IEMyR3JhcGhpY1ZpZXcgY29uc3RHcmFwaGljVmlldyA9IGNvbnN0Vmlld0hvbGRlci5nZXQoKTsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIGNvbnN0R3JhcGhpY1ZpZXcuZXJyb3IoKSk7CisgICAgQVNTRVJUX0VRKGtXaWR0aCwgY29uc3RHcmFwaGljVmlldy53aWR0aCgpKTsKKyAgICBBU1NFUlRfRVEoa0hlaWdodCwgY29uc3RHcmFwaGljVmlldy5oZWlnaHQoKSk7CisKKyAgICBjb25zdCB1aW50OF90ICpjb25zdCAqY29uc3REYXRhID0gY29uc3RHcmFwaGljVmlldy5kYXRhKCk7CisgICAgbGF5b3V0ID0gZ3JhcGhpY1ZpZXcubGF5b3V0KCk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGNvbnN0RGF0YSk7CisKKyAgICBjb25zdCB1aW50OF90ICpjeSA9IGNvbnN0RGF0YVtDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgeUluZm8gPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICBjb25zdCB1aW50OF90ICpjdSA9IGNvbnN0RGF0YVtDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgdUluZm8gPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICBjb25zdCB1aW50OF90ICpjdiA9IGNvbnN0RGF0YVtDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisgICAgdkluZm8gPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKworICAgIEFTU0VSVF9UUlVFKHZlcmlmeVBsYW5lKEMyUmVjdChrV2lkdGggLyAyLCBrSGVpZ2h0IC8gMikuYXQoa1dpZHRoIC8gNCwga0hlaWdodCAvIDQpLCB5SW5mbywgY3ksIDB4MTIpKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZShDMlJlY3Qoa1dpZHRoIC8gMiwga0hlaWdodCAvIDIpLmF0KGtXaWR0aCAvIDQsIGtIZWlnaHQgLyA0KSwgdUluZm8sIGN1LCAweDM0KSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHZJbmZvLCBjdiwgMHg1NikpOworICAgIEFTU0VSVF9UUlVFKHZlcmlmeVBsYW5lKHsga1dpZHRoLCBrSGVpZ2h0IC8gNCB9LCB5SW5mbywgY3ksIDApKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCwga0hlaWdodCAvIDQgfSwgdUluZm8sIGN1LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGgsIGtIZWlnaHQgLyA0IH0sIHZJbmZvLCBjdiwgMCkpOworICAgIEFTU0VSVF9UUlVFKHZlcmlmeVBsYW5lKHsga1dpZHRoIC8gNCwga0hlaWdodCB9LCB5SW5mbywgY3ksIDApKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCAvIDQsIGtIZWlnaHQgfSwgdUluZm8sIGN1LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGggLyA0LCBrSGVpZ2h0IH0sIHZJbmZvLCBjdiwgMCkpOworfQorCitjbGFzcyBCdWZmZXJEYXRhIDogcHVibGljIEMyQnVmZmVyRGF0YSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQnVmZmVyRGF0YShjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+ICZibG9ja3MpIDogQzJCdWZmZXJEYXRhKGJsb2Nrcykge30KKyAgICBleHBsaWNpdCBCdWZmZXJEYXRhKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+ICZibG9ja3MpIDogQzJCdWZmZXJEYXRhKGJsb2Nrcykge30KK307CisKK2NsYXNzIEJ1ZmZlciA6IHB1YmxpYyBDMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQnVmZmVyKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gJmJsb2NrcykgOiBDMkJ1ZmZlcihibG9ja3MpIHt9CisgICAgZXhwbGljaXQgQnVmZmVyKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+ICZibG9ja3MpIDogQzJCdWZmZXIoYmxvY2tzKSB7fQorfTsKKworVEVTVF9GKEMyQnVmZmVyVGVzdCwgQnVmZmVyRGF0YVRlc3QpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IGxpbmVhckJsb2NrUG9vbChtYWtlTGluZWFyQmxvY2tQb29sKCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gZ3JhcGhpY0Jsb2NrUG9vbChtYWtlR3JhcGhpY0Jsb2NrUG9vbCgpKTsKKworICAgIGNvbnN0ZXhwciB1aW50MzJfdCBrV2lkdGgxID0gMzIwOworICAgIGNvbnN0ZXhwciB1aW50MzJfdCBrSGVpZ2h0MSA9IDI0MDsKKyAgICBjb25zdGV4cHIgQzJSZWN0IGtDcm9wMShrV2lkdGgxLCBrSGVpZ2h0MSk7CisgICAgY29uc3RleHByIHVpbnQzMl90IGtXaWR0aDIgPSAxNzY7CisgICAgY29uc3RleHByIHVpbnQzMl90IGtIZWlnaHQyID0gMTQ0OworICAgIGNvbnN0ZXhwciBDMlJlY3Qga0Nyb3AyKGtXaWR0aDIsIGtIZWlnaHQyKTsKKyAgICBjb25zdGV4cHIgc2l6ZV90IGtDYXBhY2l0eTEgPSAxMDI0dTsKKyAgICBjb25zdGV4cHIgc2l6ZV90IGtDYXBhY2l0eTIgPSAyMDQ4dTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBsaW5lYXJCbG9jazE7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGxpbmVhckJsb2NrMjsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIGxpbmVhckJsb2NrUG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIGtDYXBhY2l0eTEsCisgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICZsaW5lYXJCbG9jazEpKTsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIGxpbmVhckJsb2NrUG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIGtDYXBhY2l0eTIsCisgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICZsaW5lYXJCbG9jazIpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGdyYXBoaWNCbG9jazE7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBncmFwaGljQmxvY2syOworICAgIEFTU0VSVF9FUShDMl9PSywgZ3JhcGhpY0Jsb2NrUG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICBrV2lkdGgxLAorICAgICAgICAgICAga0hlaWdodDEsCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgsCisgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICZncmFwaGljQmxvY2sxKSk7CisgICAgQVNTRVJUX0VRKEMyX09LLCBncmFwaGljQmxvY2tQb29sLT5mZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIGtXaWR0aDIsCisgICAgICAgICAgICBrSGVpZ2h0MiwKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCwKKyAgICAgICAgICAgIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LAorICAgICAgICAgICAgJmdyYXBoaWNCbG9jazIpKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlckRhdGE+IGRhdGEobmV3IEJ1ZmZlckRhdGEoeyBsaW5lYXJCbG9jazEtPnNoYXJlKDAsIGtDYXBhY2l0eTEsIEMyRmVuY2UoKSkgfSkpOworICAgIEVYUEVDVF9FUShDMkJ1ZmZlckRhdGE6OkxJTkVBUiwgZGF0YS0+dHlwZSgpKTsKKyAgICBBU1NFUlRfRVEoMXUsIGRhdGEtPmxpbmVhckJsb2NrcygpLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKGxpbmVhckJsb2NrMS0+aGFuZGxlKCksIGRhdGEtPmxpbmVhckJsb2NrcygpLmZyb250KCkuaGFuZGxlKCkpOworICAgIEVYUEVDVF9UUlVFKGRhdGEtPmdyYXBoaWNCbG9ja3MoKS5lbXB0eSgpKTsKKworICAgIGRhdGEucmVzZXQobmV3IEJ1ZmZlckRhdGEoeworICAgICAgICBsaW5lYXJCbG9jazEtPnNoYXJlKDAsIGtDYXBhY2l0eTEsIEMyRmVuY2UoKSksCisgICAgICAgIGxpbmVhckJsb2NrMi0+c2hhcmUoMCwga0NhcGFjaXR5MiwgQzJGZW5jZSgpKSwKKyAgICB9KSk7CisgICAgRVhQRUNUX0VRKEMyQnVmZmVyRGF0YTo6TElORUFSX0NIVU5LUywgZGF0YS0+dHlwZSgpKTsKKyAgICBBU1NFUlRfRVEoMnUsIGRhdGEtPmxpbmVhckJsb2NrcygpLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKGxpbmVhckJsb2NrMS0+aGFuZGxlKCksIGRhdGEtPmxpbmVhckJsb2NrcygpLmZyb250KCkuaGFuZGxlKCkpOworICAgIEVYUEVDVF9FUShsaW5lYXJCbG9jazItPmhhbmRsZSgpLCBkYXRhLT5saW5lYXJCbG9ja3MoKS5iYWNrKCkuaGFuZGxlKCkpOworICAgIEVYUEVDVF9UUlVFKGRhdGEtPmdyYXBoaWNCbG9ja3MoKS5lbXB0eSgpKTsKKworICAgIGRhdGEucmVzZXQobmV3IEJ1ZmZlckRhdGEoeyBncmFwaGljQmxvY2sxLT5zaGFyZShrQ3JvcDEsIEMyRmVuY2UoKSkgfSkpOworICAgIEVYUEVDVF9FUShDMkJ1ZmZlckRhdGE6OkdSQVBISUMsIGRhdGEtPnR5cGUoKSk7CisgICAgQVNTRVJUX0VRKDF1LCBkYXRhLT5ncmFwaGljQmxvY2tzKCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoZ3JhcGhpY0Jsb2NrMS0+aGFuZGxlKCksIGRhdGEtPmdyYXBoaWNCbG9ja3MoKS5mcm9udCgpLmhhbmRsZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShkYXRhLT5saW5lYXJCbG9ja3MoKS5lbXB0eSgpKTsKKworICAgIGRhdGEucmVzZXQobmV3IEJ1ZmZlckRhdGEoeworICAgICAgICBncmFwaGljQmxvY2sxLT5zaGFyZShrQ3JvcDEsIEMyRmVuY2UoKSksCisgICAgICAgIGdyYXBoaWNCbG9jazItPnNoYXJlKGtDcm9wMiwgQzJGZW5jZSgpKSwKKyAgICB9KSk7CisgICAgRVhQRUNUX0VRKEMyQnVmZmVyRGF0YTo6R1JBUEhJQ19DSFVOS1MsIGRhdGEtPnR5cGUoKSk7CisgICAgQVNTRVJUX0VRKDJ1LCBkYXRhLT5ncmFwaGljQmxvY2tzKCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoZ3JhcGhpY0Jsb2NrMS0+aGFuZGxlKCksIGRhdGEtPmdyYXBoaWNCbG9ja3MoKS5mcm9udCgpLmhhbmRsZSgpKTsKKyAgICBFWFBFQ1RfRVEoZ3JhcGhpY0Jsb2NrMi0+aGFuZGxlKCksIGRhdGEtPmdyYXBoaWNCbG9ja3MoKS5iYWNrKCkuaGFuZGxlKCkpOworICAgIEVYUEVDVF9UUlVFKGRhdGEtPmxpbmVhckJsb2NrcygpLmVtcHR5KCkpOworfQorCit2b2lkIERlc3Ryb3lDYWxsYmFjayhjb25zdCBDMkJ1ZmZlciAqIC8qIGJ1ZiAqLywgdm9pZCAqYXJnKSB7CisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKHZvaWQpPiAqY2IgPSAoc3RkOjpmdW5jdGlvbjx2b2lkKHZvaWQpPiAqKWFyZzsKKyAgICAoKmNiKSgpOworfQorCitlbnVtIDogdWludDMyX3QgeworICAgIGtQYXJhbUluZGV4TnVtYmVyMSwKKyAgICBrUGFyYW1JbmRleE51bWJlcjIsCit9OworCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMkludDMyVmFsdWUsIGtQYXJhbUluZGV4TnVtYmVyMT4gQzJOdW1iZXIxSW5mbzsKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMySW50MzJWYWx1ZSwga1BhcmFtSW5kZXhOdW1iZXIyPiBDMk51bWJlcjJJbmZvOworCitURVNUX0YoQzJCdWZmZXJUZXN0LCBCdWZmZXJUZXN0KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBhbGxvYyhtYWtlTGluZWFyQmxvY2tQb29sKCkpOworICAgIGNvbnN0ZXhwciBzaXplX3Qga0NhcGFjaXR5ID0gMTAyNHU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworCisgICAgQVNTRVJUX0VRKEMyX09LLCBhbGxvYy0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIGtDYXBhY2l0eSwKKyAgICAgICAgICAgIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LAorICAgICAgICAgICAgJmJsb2NrKSk7CisKKyAgICBzdGQ6OmF0b21pY19ib29sIGRlc3Ryb3llZChmYWxzZSk7CisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKHZvaWQpPiBhcmcgPSBbJmRlc3Ryb3llZF0oKXsgZGVzdHJveWVkID0gdHJ1ZTsgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyKG5ldyBCdWZmZXIoIHsgYmxvY2stPnNoYXJlKDAsIGtDYXBhY2l0eSwgQzJGZW5jZSgpKSB9KSk7CisgICAgQVNTRVJUX0VRKEMyX09LLCBidWZmZXItPnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KCZEZXN0cm95Q2FsbGJhY2ssICZhcmcpKTsKKyAgICBFWFBFQ1RfRkFMU0UoZGVzdHJveWVkKTsKKyAgICBBU1NFUlRfRVEoQzJfRFVQTElDQVRFLCBidWZmZXItPnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KCZEZXN0cm95Q2FsbGJhY2ssICZhcmcpKTsKKyAgICBidWZmZXIucmVzZXQoKTsKKyAgICBFWFBFQ1RfVFJVRShkZXN0cm95ZWQpOworCisgICAgYnVmZmVyLnJlc2V0KG5ldyBCdWZmZXIoIHsgYmxvY2stPnNoYXJlKDAsIGtDYXBhY2l0eSwgQzJGZW5jZSgpKSB9KSk7CisgICAgZGVzdHJveWVkID0gZmFsc2U7CisgICAgQVNTRVJUX0VRKEMyX09LLCBidWZmZXItPnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KCZEZXN0cm95Q2FsbGJhY2ssICZhcmcpKTsKKyAgICBFWFBFQ1RfRkFMU0UoZGVzdHJveWVkKTsKKyAgICBBU1NFUlRfRVEoQzJfTk9UX0ZPVU5ELCBidWZmZXItPnVucmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoJkRlc3Ryb3lDYWxsYmFjaywgbnVsbHB0cikpOworICAgIEFTU0VSVF9FUShDMl9PSywgYnVmZmVyLT51bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KCZEZXN0cm95Q2FsbGJhY2ssICZhcmcpKTsKKyAgICBFWFBFQ1RfRkFMU0UoZGVzdHJveWVkKTsKKyAgICBBU1NFUlRfRVEoQzJfTk9UX0ZPVU5ELCBidWZmZXItPnVucmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoJkRlc3Ryb3lDYWxsYmFjaywgJmFyZykpOworICAgIGJ1ZmZlci5yZXNldCgpOworICAgIEVYUEVDVF9GQUxTRShkZXN0cm95ZWQpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gaW5mbzEobmV3IEMyTnVtYmVyMUluZm8oMSkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkluZm8+IGluZm8yKG5ldyBDMk51bWJlcjJJbmZvKDIpKTsKKyAgICBidWZmZXIucmVzZXQobmV3IEJ1ZmZlciggeyBibG9jay0+c2hhcmUoMCwga0NhcGFjaXR5LCBDMkZlbmNlKCkpIH0pKTsKKyAgICBFWFBFQ1RfVFJVRShidWZmZXItPmluZm8oKS5lbXB0eSgpKTsKKyAgICBFWFBFQ1RfRkFMU0UoYnVmZmVyLT5oYXNJbmZvKGluZm8xLT50eXBlKCkpKTsKKyAgICBFWFBFQ1RfRkFMU0UoYnVmZmVyLT5oYXNJbmZvKGluZm8yLT50eXBlKCkpKTsKKworICAgIEFTU0VSVF9FUShDMl9PSywgYnVmZmVyLT5zZXRJbmZvKGluZm8xKSk7CisgICAgRVhQRUNUX0VRKDF1LCBidWZmZXItPmluZm8oKS5zaXplKCkpOworICAgIEVYUEVDVF9FUSgqaW5mbzEsICpidWZmZXItPmluZm8oKS5mcm9udCgpKTsKKyAgICBFWFBFQ1RfVFJVRShidWZmZXItPmhhc0luZm8oaW5mbzEtPnR5cGUoKSkpOworICAgIEVYUEVDVF9GQUxTRShidWZmZXItPmhhc0luZm8oaW5mbzItPnR5cGUoKSkpOworCisgICAgQVNTRVJUX0VRKEMyX09LLCBidWZmZXItPnNldEluZm8oaW5mbzIpKTsKKyAgICBFWFBFQ1RfRVEoMnUsIGJ1ZmZlci0+aW5mbygpLnNpemUoKSk7CisgICAgRVhQRUNUX1RSVUUoYnVmZmVyLT5oYXNJbmZvKGluZm8xLT50eXBlKCkpKTsKKyAgICBFWFBFQ1RfVFJVRShidWZmZXItPmhhc0luZm8oaW5mbzItPnR5cGUoKSkpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gcmVtb3ZlZCA9IGJ1ZmZlci0+cmVtb3ZlSW5mbyhpbmZvMS0+dHlwZSgpKTsKKyAgICBBU1NFUlRfVFJVRShyZW1vdmVkKTsKKyAgICBFWFBFQ1RfRVEoKnJlbW92ZWQsICppbmZvMSk7CisgICAgRVhQRUNUX0VRKDF1LCBidWZmZXItPmluZm8oKS5zaXplKCkpOworICAgIEVYUEVDVF9FUSgqaW5mbzIsICpidWZmZXItPmluZm8oKS5mcm9udCgpKTsKKyAgICBFWFBFQ1RfRkFMU0UoYnVmZmVyLT5oYXNJbmZvKGluZm8xLT50eXBlKCkpKTsKKyAgICBFWFBFQ1RfVFJVRShidWZmZXItPmhhc0luZm8oaW5mbzItPnR5cGUoKSkpOworCisgICAgcmVtb3ZlZCA9IGJ1ZmZlci0+cmVtb3ZlSW5mbyhpbmZvMS0+dHlwZSgpKTsKKyAgICBBU1NFUlRfRkFMU0UocmVtb3ZlZCk7CisgICAgRVhQRUNUX0VRKDF1LCBidWZmZXItPmluZm8oKS5zaXplKCkpOworICAgIEVYUEVDVF9GQUxTRShidWZmZXItPmhhc0luZm8oaW5mbzEtPnR5cGUoKSkpOworICAgIEVYUEVDVF9UUlVFKGJ1ZmZlci0+aGFzSW5mbyhpbmZvMi0+dHlwZSgpKSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvPiBpbmZvMyhuZXcgQzJOdW1iZXIySW5mbygzKSk7CisgICAgQVNTRVJUX0VRKEMyX09LLCBidWZmZXItPnNldEluZm8oaW5mbzMpKTsKKyAgICBFWFBFQ1RfRVEoMXUsIGJ1ZmZlci0+aW5mbygpLnNpemUoKSk7CisgICAgRVhQRUNUX0ZBTFNFKGJ1ZmZlci0+aGFzSW5mbyhpbmZvMS0+dHlwZSgpKSk7CisgICAgRVhQRUNUX1RSVUUoYnVmZmVyLT5oYXNJbmZvKGluZm8yLT50eXBlKCkpKTsKKworICAgIHJlbW92ZWQgPSBidWZmZXItPnJlbW92ZUluZm8oaW5mbzItPnR5cGUoKSk7CisgICAgQVNTRVJUX1RSVUUocmVtb3ZlZCk7CisgICAgRVhQRUNUX0VRKCppbmZvMywgKnJlbW92ZWQpOworICAgIEVYUEVDVF9UUlVFKGJ1ZmZlci0+aW5mbygpLmVtcHR5KCkpOworICAgIEVYUEVDVF9GQUxTRShidWZmZXItPmhhc0luZm8oaW5mbzEtPnR5cGUoKSkpOworICAgIEVYUEVDVF9GQUxTRShidWZmZXItPmhhc0luZm8oaW5mbzItPnR5cGUoKSkpOworfQorCitURVNUX0YoQzJCdWZmZXJUZXN0LCBNdWx0aXBsZUxpbmVhck1hcFRlc3QpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IHBvb2wobWFrZUxpbmVhckJsb2NrUG9vbCgpKTsKKyAgICBjb25zdGV4cHIgc2l6ZV90IGtDYXBhY2l0eSA9IDUyNDI4OHU7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7ICsraSkgeworICAgICAgICBzdGQ6OnZlY3RvcjxDMldyaXRlVmlldz4gd1ZpZXdzOworICAgICAgICBzdGQ6OnZlY3RvcjxDMlJlYWRWaWV3PiByVmlld3M7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTY7ICsraikgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgICAgICAgICAgQVNTRVJUX0VRKEMyX09LLCBwb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgICAgICAgICBrQ2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LAorICAgICAgICAgICAgICAgICAgICAmYmxvY2spKTsKKyAgICAgICAgICAgIHdWaWV3cy5wdXNoX2JhY2soYmxvY2stPm1hcCgpLmdldCgpKTsKKyAgICAgICAgICAgIEMyQ29uc3RMaW5lYXJCbG9jayBjQmxvY2sgPSBibG9jay0+c2hhcmUoMCwga0NhcGFjaXR5IC8gMiwgQzJGZW5jZSgpKTsKKyAgICAgICAgICAgIHJWaWV3cy5wdXNoX2JhY2soY0Jsb2NrLm1hcCgpLmdldCgpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi92bmRrL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBiMTM1NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMDIgQEAKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYmNvZGVjMl9pbnRlcm5hbCIsCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbnRlcm5hbCIsCisgICAgXSwKKworICAgIC8vIFRPRE86IFJlbW92ZSB0aGlzIHdoZW4gdGhpcyBtb2R1bGUgaXMgbW92ZWQgYmFjayB0byBmcmFtZXdvcmtzL2F2LgorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCit9CisKKy8vICEhIURPIE5PVCBERVBFTkQgT04gVEhJUyBTSEFSRUQgTElCUkFSWSBESVJFQ1RMWSEhIQorLy8gdXNlIGxpYmNvZGVjMi1pbXBsLWRlZmF1bHRzIGluc3RlYWQKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3ZuZGsiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDMkFsbG9jYXRvcklvbi5jcHAiLAorICAgICAgICAiQzJBbGxvY2F0b3JHcmFsbG9jLmNwcCIsCisgICAgICAgICJDMkJ1ZmZlci5jcHAiLAorICAgICAgICAiQzJDb25maWcuY3BwIiwKKyAgICAgICAgIkMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5jcHAiLAorICAgICAgICAiQzJTdG9yZS5jcHAiLAorICAgICAgICAicGxhdGZvcm0vQzJCcUJ1ZmZlci5jcHAiLAorICAgICAgICAidXRpbC9DMkRlYnVnLmNwcCIsCisgICAgICAgICJ1dGlsL0MySW50ZXJmYWNlSGVscGVyLmNwcCIsCisgICAgICAgICJ1dGlsL0MySW50ZXJmYWNlVXRpbHMuY3BwIiwKKyAgICAgICAgInV0aWwvQzJQYXJhbVV0aWxzLmNwcCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgIF0sCisKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImludGVybmFsIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICAgICAgImxpYmNvZGVjMl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYWxsb2NhdG9yQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLm1hcHBlckAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDIuMCIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZGwiLAorICAgICAgICAibGliaGFyZHdhcmUiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaW9uIiwKKyAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycXVldWVfaGVscGVyIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCit9CisKKy8vIHB1YmxpYyBkZXBlbmRlbmN5IGZvciBpbXBsZW1lbnRpbmcgQ29kZWMgMiBjb21wb25lbnRzCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYmNvZGVjMi1pbXBsLWRlZmF1bHRzIiwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiYXNlIiwgLy8gZm9yIEMyX0xPRworICAgICAgICAibGlibG9nIiwgLy8gZm9yIEFMT0cKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKK30KKworLy8gcHVibGljIGRlcGVuZGVuY3kgZm9yIGltcGxlbWVudGluZyBDb2RlYyAyIGZyYW1ld29yayB1dGlsaXRpZXMKKy8vIFRISVMgSVMgT05MWSBGT1IgRlJBTUVXT1JLIFVTRSBPTkxZCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYmNvZGVjMi1pbnRlcm5hbC1kZWZhdWx0cyIsCisgICAgZGVmYXVsdHM6IFsibGliY29kZWMyLWltcGwtZGVmYXVsdHMiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjdXRpbHMiLCAvLyBmb3IgcHJvcGVydGllcworICAgIF0sCisKKyAgICAvLyBUT0RPOiBzZXBhcmF0ZSBpbnRlcm5hbCBoZWFkZXJzIHNvIHRoZXkgY2FuIGJlIGV4cG9zZWQgaGVyZQorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9DMkFsbG9jYXRvckdyYWxsb2MuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JHcmFsbG9jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODc4OTc0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JHcmFsbG9jLmNwcApAQCAtMCwwICsxLDgxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJBbGxvY2F0b3JHcmFsbG9jIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9hbGxvY2F0b3IvMi4wL0lBbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL21hcHBlci8yLjAvSU1hcHBlci5oPgorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvZ3JhbGxvYy5oPgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisgICAgZW51bSA6IHVpbnQ2NF90IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVzYWdlIG1hc2sgdGhhdCBpcyBwYXNzZWQgdGhyb3VnaCBmcm9tIGdyYWxsb2MgdG8gQ29kZWMgMi4wIHVzYWdlLgorICAgICAgICAgKi8KKyAgICAgICAgUEFTU1RIUk9VR0hfVVNBR0VfTUFTSyA9CisgICAgICAgICAgICB+KEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9NQVNLIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9NQVNLIHwgR1JBTExPQ19VU0FHRV9QUk9URUNURUQpCisgICAgfTsKKworICAgIC8vIHZlcmlmeSB0aGF0IHBhc3N0aHJvdWdoIG1hc2sgaXMgd2l0aGluIHRoZSBwbGF0Zm9ybSBtYXNrCisgICAgc3RhdGljX2Fzc2VydCgofkMyTWVtb3J5VXNhZ2U6OlBMQVRGT1JNX01BU0sgJiBQQVNTVEhST1VHSF9VU0FHRV9NQVNLKSA9PSAwLCAiIik7Cit9CisKK0MyTWVtb3J5VXNhZ2UgQzJBbmRyb2lkTWVtb3J5VXNhZ2U6OkZyb21HcmFsbG9jVXNhZ2UodWludDY0X3QgdXNhZ2UpIHsKKyAgICAvLyBncmFsbG9jIGRvZXMgbm90IHN1cHBvcnQgV1JJVEVfUFJPVEVDVEVECisgICAgcmV0dXJuIEMyTWVtb3J5VXNhZ2UoCisgICAgICAgICAgICAoKHVzYWdlICYgR1JBTExPQ19VU0FHRV9TV19SRUFEX01BU0spID8gQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQgOiAwKSB8CisgICAgICAgICAgICAoKHVzYWdlICYgR1JBTExPQ19VU0FHRV9TV19XUklURV9NQVNLKSA/IEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSA6IDApIHwKKyAgICAgICAgICAgICgodXNhZ2UgJiBHUkFMTE9DX1VTQUdFX1BST1RFQ1RFRCkgPyBDMk1lbW9yeVVzYWdlOjpSRUFEX1BST1RFQ1RFRCA6IDApIHwKKyAgICAgICAgICAgICh1c2FnZSAmIFBBU1NUSFJPVUdIX1VTQUdFX01BU0spKTsKK30KKwordWludDY0X3QgQzJBbmRyb2lkTWVtb3J5VXNhZ2U6OmFzR3JhbGxvY1VzYWdlKCkgY29uc3QgeworICAgIC8vIGdyYWxsb2MgZG9lcyBub3Qgc3VwcG9ydCBXUklURV9QUk9URUNURUQKKyAgICByZXR1cm4gKCgoZXhwZWN0ZWQgJiBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCkgPyBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4gOiAwKSB8CisgICAgICAgICAgICAoKGV4cGVjdGVkICYgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFKSA/IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4gOiAwKSB8CisgICAgICAgICAgICAoKGV4cGVjdGVkICYgQzJNZW1vcnlVc2FnZTo6UkVBRF9QUk9URUNURUQpID8gR1JBTExPQ19VU0FHRV9QUk9URUNURUQgOiAwKSB8CisgICAgICAgICAgICAoZXhwZWN0ZWQgJiBQQVNTVEhST1VHSF9VU0FHRV9NQVNLKSk7Cit9CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjphbGxvY2F0b3I6OlYyXzA6OklBbGxvY2F0b3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpCdWZmZXJVc2FnZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6Om1hcHBlcjo6VjJfMDo6QnVmZmVyRGVzY3JpcHRvcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjptYXBwZXI6OlYyXzA6OkVycm9yOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6Om1hcHBlcjo6VjJfMDo6SU1hcHBlcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjptYXBwZXI6OlYyXzA6OllDYkNyTGF5b3V0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKKworbmFtZXNwYWNlIHsKKworc3RydWN0IEJ1ZmZlckRlc2NyaXB0b3JJbmZvIHsKKyAgICBJTWFwcGVyOjpCdWZmZXJEZXNjcmlwdG9ySW5mbyBtYXBwZXJJbmZvOworICAgIHVpbnQzMl90IHN0cmlkZTsKK307CisKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBHUkFMTE9DIEFMTE9DQVRJT04gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitzdGF0aWMgYzJfc3RhdHVzX3QgbWFwZXJyMmVycm9yKEVycm9yIG1hcGVycikgeworICAgIHN3aXRjaCAobWFwZXJyKSB7CisgICAgICAgIGNhc2UgRXJyb3I6Ok5PTkU6ICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgIGNhc2UgRXJyb3I6OkJBRF9ERVNDUklQVE9SOiByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICBjYXNlIEVycm9yOjpCQURfQlVGRkVSOiAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgY2FzZSBFcnJvcjo6QkFEX1ZBTFVFOiAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgIGNhc2UgRXJyb3I6Ok5PX1JFU09VUkNFUzogICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgICAgICBjYXNlIEVycm9yOjpVTlNVUFBPUlRFRDogICAgcmV0dXJuIEMyX0NBTk5PVF9ETzsKKyAgICB9CisgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKK30KKworc3RhdGljCitib29sIG5hdGl2ZV9oYW5kbGVfaXNfaW52YWxpZChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmNvbnN0IGhhbmRsZSkgeworICAgIC8vIHBlcmZvcm0gYmFzaWMgdmFsaWRhdGlvbiBvZiBhIG5hdGl2ZSBoYW5kbGUKKyAgICBpZiAoaGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgLy8gbnVsbCBoYW5kbGUgaXMgY29uc2lkZXJlZCB2YWxpZAorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiAoKHNpemVfdCloYW5kbGUtPnZlcnNpb24gIT0gc2l6ZW9mKG5hdGl2ZV9oYW5kbGVfdCkgfHwKKyAgICAgICAgICAgIGhhbmRsZS0+bnVtRmRzIDwgMCB8fAorICAgICAgICAgICAgaGFuZGxlLT5udW1JbnRzIDwgMCB8fAorICAgICAgICAgICAgLy8gZm9yIHNhbml0eSBhc3N1bWUgaGFuZGxlcyBtdXN0IG9jY3VweSBsZXNzIG1lbW9yeSB0aGFuIElOVF9NQVggYnl0ZXMKKyAgICAgICAgICAgIGhhbmRsZS0+bnVtRmRzID4gaW50KChJTlRfTUFYIC0gaGFuZGxlLT52ZXJzaW9uKSAvIHNpemVvZihpbnQpKSAtIGhhbmRsZS0+bnVtSW50cyk7Cit9CisKK2NsYXNzIEMySGFuZGxlR3JhbGxvYyA6IHB1YmxpYyBDMkhhbmRsZSB7Citwcml2YXRlOgorICAgIHN0cnVjdCBFeHRyYURhdGEgeworICAgICAgICB1aW50MzJfdCB3aWR0aDsKKyAgICAgICAgdWludDMyX3QgaGVpZ2h0OworICAgICAgICB1aW50MzJfdCBmb3JtYXQ7CisgICAgICAgIHVpbnQzMl90IHVzYWdlX2xvOworICAgICAgICB1aW50MzJfdCB1c2FnZV9oaTsKKyAgICAgICAgdWludDMyX3Qgc3RyaWRlOworICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICB1aW50MzJfdCBpZ2JwX2lkX2xvOworICAgICAgICB1aW50MzJfdCBpZ2JwX2lkX2hpOworICAgICAgICB1aW50MzJfdCBpZ2JwX3Nsb3Q7CisgICAgICAgIHVpbnQzMl90IG1hZ2ljOworICAgIH07CisKKyAgICBlbnVtIHsKKyAgICAgICAgTlVNX0lOVFMgPSBzaXplb2YoRXh0cmFEYXRhKSAvIHNpemVvZihpbnQpLAorICAgIH07CisgICAgY29uc3Qgc3RhdGljIHVpbnQzMl90IE1BR0lDID0gJ1x4YzJnclx4MDAnOworCisgICAgc3RhdGljCisgICAgY29uc3QgRXh0cmFEYXRhKiBnZXRFeHRyYURhdGEoY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSkgeworICAgICAgICBpZiAoaGFuZGxlID09IG51bGxwdHIKKyAgICAgICAgICAgICAgICB8fCBuYXRpdmVfaGFuZGxlX2lzX2ludmFsaWQoaGFuZGxlKQorICAgICAgICAgICAgICAgIHx8IGhhbmRsZS0+bnVtSW50cyA8IE5VTV9JTlRTKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFeHRyYURhdGEqPigKKyAgICAgICAgICAgICAgICAmaGFuZGxlLT5kYXRhW2hhbmRsZS0+bnVtRmRzICsgaGFuZGxlLT5udW1JbnRzIC0gTlVNX0lOVFNdKTsKKyAgICB9CisKKyAgICBzdGF0aWMKKyAgICBFeHRyYURhdGEgKmdldEV4dHJhRGF0YShDMkhhbmRsZSAqY29uc3QgaGFuZGxlKSB7CisgICAgICAgIHJldHVybiBjb25zdF9jYXN0PEV4dHJhRGF0YSAqPihnZXRFeHRyYURhdGEoY29uc3RfY2FzdDxjb25zdCBDMkhhbmRsZSAqY29uc3Q+KGhhbmRsZSkpKTsKKyAgICB9CisKK3B1YmxpYzoKKyAgICB2b2lkIGdldElnYnBEYXRhKHVpbnQzMl90ICpnZW5lcmF0aW9uLCB1aW50NjRfdCAqaWdicF9pZCwgdWludDMyX3QgKmlnYnBfc2xvdCkgY29uc3QgeworICAgICAgICBjb25zdCBFeHRyYURhdGEgKmVkID0gZ2V0RXh0cmFEYXRhKHRoaXMpOworICAgICAgICAqZ2VuZXJhdGlvbiA9IGVkLT5nZW5lcmF0aW9uOworICAgICAgICAqaWdicF9pZCA9IHVuc2lnbmVkKGVkLT5pZ2JwX2lkX2xvKSB8IHVpbnQ2NF90KHVuc2lnbmVkKGVkLT5pZ2JwX2lkX2hpKSkgPDwgMzI7CisgICAgICAgICppZ2JwX3Nsb3QgPSBlZC0+aWdicF9zbG90OworICAgIH0KKworICAgIHN0YXRpYyBib29sIGlzVmFsaWQoY29uc3QgQzJIYW5kbGUgKmNvbnN0IG8pIHsKKyAgICAgICAgaWYgKG8gPT0gbnVsbHB0cikgeyAvLyBudWxsIGhhbmRsZSBpcyBhbHdheXMgdmFsaWQKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGNvbnN0IEV4dHJhRGF0YSAqeGQgPSBnZXRFeHRyYURhdGEobyk7CisgICAgICAgIC8vIHdlIGNhbm5vdCB2YWxpZGF0ZSB3aWR0aC9oZWlnaHQvZm9ybWF0L3VzYWdlIHdpdGhvdXQgYWNjZXNzaW5nIGdyYWxsb2MgZHJpdmVyCisgICAgICAgIHJldHVybiB4ZCAhPSBudWxscHRyICYmIHhkLT5tYWdpYyA9PSBNQUdJQzsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJIYW5kbGVHcmFsbG9jKiBXcmFwTmF0aXZlSGFuZGxlKAorICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpjb25zdCBoYW5kbGUsCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBmb3JtYXQsIHVpbnQ2NF90IHVzYWdlLAorICAgICAgICAgICAgdWludDMyX3Qgc3RyaWRlLCB1aW50MzJfdCBnZW5lcmF0aW9uLCB1aW50NjRfdCBpZ2JwX2lkID0gMCwgdWludDMyX3QgaWdicF9zbG90ID0gMCkgeworICAgICAgICAvL0NIRUNLKGhhbmRsZSAhPSBudWxscHRyKTsKKyAgICAgICAgaWYgKG5hdGl2ZV9oYW5kbGVfaXNfaW52YWxpZChoYW5kbGUpIHx8CisgICAgICAgICAgICBoYW5kbGUtPm51bUludHMgPiBpbnQoKElOVF9NQVggLSBoYW5kbGUtPnZlcnNpb24pIC8gc2l6ZW9mKGludCkpIC0gTlVNX0lOVFMgLSBoYW5kbGUtPm51bUZkcykgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgRXh0cmFEYXRhIHhkID0geworICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1aW50MzJfdCh1c2FnZSAmIDB4RkZGRkZGRkYpLCB1aW50MzJfdCh1c2FnZSA+PiAzMiksCisgICAgICAgICAgICBzdHJpZGUsIGdlbmVyYXRpb24sIHVpbnQzMl90KGlnYnBfaWQgJiAweEZGRkZGRkZGKSwgdWludDMyX3QoaWdicF9pZCA+PiAzMiksCisgICAgICAgICAgICBpZ2JwX3Nsb3QsIE1BR0lDCisgICAgICAgIH07CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqcmVzID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoaGFuZGxlLT5udW1GZHMsIGhhbmRsZS0+bnVtSW50cyArIE5VTV9JTlRTKTsKKyAgICAgICAgaWYgKHJlcyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtZW1jcHkoJnJlcy0+ZGF0YSwgJmhhbmRsZS0+ZGF0YSwgc2l6ZW9mKGludCkgKiAoaGFuZGxlLT5udW1GZHMgKyBoYW5kbGUtPm51bUludHMpKTsKKyAgICAgICAgICAgICpnZXRFeHRyYURhdGEocmVzKSA9IHhkOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEMySGFuZGxlR3JhbGxvYyAqPihyZXMpOworICAgIH0KKworICAgIHN0YXRpYyBuYXRpdmVfaGFuZGxlX3QqIFVud3JhcE5hdGl2ZUhhbmRsZSgKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUpIHsKKyAgICAgICAgY29uc3QgRXh0cmFEYXRhICp4ZCA9IGdldEV4dHJhRGF0YShoYW5kbGUpOworICAgICAgICBpZiAoeGQgPT0gbnVsbHB0ciB8fCB4ZC0+bWFnaWMgIT0gTUFHSUMpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqcmVzID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoaGFuZGxlLT5udW1GZHMsIGhhbmRsZS0+bnVtSW50cyAtIE5VTV9JTlRTKTsKKyAgICAgICAgaWYgKHJlcyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtZW1jcHkoJnJlcy0+ZGF0YSwgJmhhbmRsZS0+ZGF0YSwgc2l6ZW9mKGludCkgKiAocmVzLT5udW1GZHMgKyByZXMtPm51bUludHMpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBuYXRpdmVfaGFuZGxlX3QqIFVud3JhcE5hdGl2ZUhhbmRsZSgKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUsCisgICAgICAgICAgICB1aW50MzJfdCAqZ2VuZXJhdGlvbiwgdWludDY0X3QgKmlnYnBfaWQsIHVpbnQzMl90ICppZ2JwX3Nsb3QpIHsKKyAgICAgICAgY29uc3QgRXh0cmFEYXRhICp4ZCA9IGdldEV4dHJhRGF0YShoYW5kbGUpOworICAgICAgICBpZiAoeGQgPT0gbnVsbHB0ciB8fCB4ZC0+bWFnaWMgIT0gTUFHSUMpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgICpnZW5lcmF0aW9uID0geGQtPmdlbmVyYXRpb247CisgICAgICAgICppZ2JwX2lkID0gdW5zaWduZWQoeGQtPmlnYnBfaWRfbG8pIHwgdWludDY0X3QodW5zaWduZWQoeGQtPmlnYnBfaWRfaGkpKSA8PCAzMjsKKyAgICAgICAgKmlnYnBfc2xvdCA9IHhkLT5pZ2JwX3Nsb3Q7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqcmVzID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoaGFuZGxlLT5udW1GZHMsIGhhbmRsZS0+bnVtSW50cyAtIE5VTV9JTlRTKTsKKyAgICAgICAgaWYgKHJlcyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtZW1jcHkoJnJlcy0+ZGF0YSwgJmhhbmRsZS0+ZGF0YSwgc2l6ZW9mKGludCkgKiAocmVzLT5udW1GZHMgKyByZXMtPm51bUludHMpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBjb25zdCBDMkhhbmRsZUdyYWxsb2MqIEltcG9ydCgKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUsCisgICAgICAgICAgICB1aW50MzJfdCAqd2lkdGgsIHVpbnQzMl90ICpoZWlnaHQsIHVpbnQzMl90ICpmb3JtYXQsCisgICAgICAgICAgICB1aW50NjRfdCAqdXNhZ2UsIHVpbnQzMl90ICpzdHJpZGUsCisgICAgICAgICAgICB1aW50MzJfdCAqZ2VuZXJhdGlvbiwgdWludDY0X3QgKmlnYnBfaWQsIHVpbnQzMl90ICppZ2JwX3Nsb3QpIHsKKyAgICAgICAgY29uc3QgRXh0cmFEYXRhICp4ZCA9IGdldEV4dHJhRGF0YShoYW5kbGUpOworICAgICAgICBpZiAoeGQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgKndpZHRoID0geGQtPndpZHRoOworICAgICAgICAqaGVpZ2h0ID0geGQtPmhlaWdodDsKKyAgICAgICAgKmZvcm1hdCA9IHhkLT5mb3JtYXQ7CisgICAgICAgICp1c2FnZSA9IHhkLT51c2FnZV9sbyB8ICh1aW50NjRfdCh4ZC0+dXNhZ2VfaGkpIDw8IDMyKTsKKyAgICAgICAgKnN0cmlkZSA9IHhkLT5zdHJpZGU7CisgICAgICAgICpnZW5lcmF0aW9uID0geGQtPmdlbmVyYXRpb247CisgICAgICAgICppZ2JwX2lkID0geGQtPmlnYnBfaWRfbG8gfCAodWludDY0X3QoeGQtPmlnYnBfaWRfaGkpIDw8IDMyKTsKKyAgICAgICAgKmlnYnBfc2xvdCA9IHhkLT5pZ2JwX3Nsb3Q7CisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IEMySGFuZGxlR3JhbGxvYyAqPihoYW5kbGUpOworICAgIH0KK307CisKK25hdGl2ZV9oYW5kbGVfdCAqVW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZShjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlKSB7CisgICAgcmV0dXJuIEMySGFuZGxlR3JhbGxvYzo6VW53cmFwTmF0aXZlSGFuZGxlKGhhbmRsZSk7Cit9CisKK25hdGl2ZV9oYW5kbGVfdCAqVW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZSgKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSwKKyAgICAgICAgdWludDMyX3QgKmdlbmVyYXRpb24sIHVpbnQ2NF90ICppZ2JwX2lkLCB1aW50MzJfdCAqaWdicF9zbG90KSB7CisgICAgcmV0dXJuIEMySGFuZGxlR3JhbGxvYzo6VW53cmFwTmF0aXZlSGFuZGxlKGhhbmRsZSwgZ2VuZXJhdGlvbiwgaWdicF9pZCwgaWdicF9zbG90KTsKK30KKworQzJIYW5kbGUgKldyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlKAorICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmNvbnN0IGhhbmRsZSwKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LCB1aW50NjRfdCB1c2FnZSwgdWludDMyX3Qgc3RyaWRlLAorICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLCB1aW50NjRfdCBpZ2JwX2lkLCB1aW50MzJfdCBpZ2JwX3Nsb3QpIHsKKyAgICByZXR1cm4gQzJIYW5kbGVHcmFsbG9jOjpXcmFwTmF0aXZlSGFuZGxlKGhhbmRsZSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbiwgaWdicF9pZCwgaWdicF9zbG90KTsKK30KKworY2xhc3MgQzJBbGxvY2F0aW9uR3JhbGxvYyA6IHB1YmxpYyBDMkdyYXBoaWNBbGxvY2F0aW9uIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5DMkFsbG9jYXRpb25HcmFsbG9jKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG1hcCgKKyAgICAgICAgICAgIEMyUmVjdCByZWN0LCBDMk1lbW9yeVVzYWdlIHVzYWdlLCBDMkZlbmNlICpmZW5jZSwKKyAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0ICpsYXlvdXQgLyogbm9ubnVsbCAqLywgdWludDhfdCAqKmFkZHIgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCB1bm1hcCgKKyAgICAgICAgICAgIHVpbnQ4X3QgKiphZGRyIC8qIG5vbm51bGwgKi8sIEMyUmVjdCByZWN0LCBDMkZlbmNlICpmZW5jZSAvKiBudWxsYWJsZSAqLykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBDMkFsbG9jYXRvcjo6aWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1BbGxvY2F0b3JJZDsgfQorICAgIHZpcnR1YWwgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1Mb2NrZWRIYW5kbGUgPyA6IG1IYW5kbGU7IH0KKyAgICB2aXJ0dWFsIGJvb2wgZXF1YWxzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkdyYXBoaWNBbGxvY2F0aW9uPiAmb3RoZXIpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLy8gaW50ZXJuYWwgbWV0aG9kcworICAgIC8vIHxoYW5kbGV8IHdpbGwgYmUgbW92ZWQuCisgICAgQzJBbGxvY2F0aW9uR3JhbGxvYygKKyAgICAgICAgICAgICAgY29uc3QgQnVmZmVyRGVzY3JpcHRvckluZm8gJmluZm8sCisgICAgICAgICAgICAgIGNvbnN0IHNwPElNYXBwZXI+ICZtYXBwZXIsCisgICAgICAgICAgICAgIGhpZGxfaGFuZGxlICZoaWRsSGFuZGxlLAorICAgICAgICAgICAgICBjb25zdCBDMkhhbmRsZUdyYWxsb2MgKmNvbnN0IGhhbmRsZSwKKyAgICAgICAgICAgICAgQzJBbGxvY2F0b3I6OmlkX3QgYWxsb2NhdG9ySWQpOworICAgIGludCBkdXAoKSBjb25zdDsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBjb25zdCBCdWZmZXJEZXNjcmlwdG9ySW5mbyBtSW5mbzsKKyAgICBjb25zdCBzcDxJTWFwcGVyPiBtTWFwcGVyOworICAgIGNvbnN0IGhpZGxfaGFuZGxlIG1IaWRsSGFuZGxlOworICAgIGNvbnN0IEMySGFuZGxlR3JhbGxvYyAqbUhhbmRsZTsKKyAgICBidWZmZXJfaGFuZGxlX3QgbUJ1ZmZlcjsKKyAgICBjb25zdCBDMkhhbmRsZUdyYWxsb2MgKm1Mb2NrZWRIYW5kbGU7CisgICAgYm9vbCBtTG9ja2VkOworICAgIEMyQWxsb2NhdG9yOjppZF90IG1BbGxvY2F0b3JJZDsKKyAgICBzdGQ6Om11dGV4IG1NYXBwZWRMb2NrOworfTsKKworQzJBbGxvY2F0aW9uR3JhbGxvYzo6QzJBbGxvY2F0aW9uR3JhbGxvYygKKyAgICAgICAgICBjb25zdCBCdWZmZXJEZXNjcmlwdG9ySW5mbyAmaW5mbywKKyAgICAgICAgICBjb25zdCBzcDxJTWFwcGVyPiAmbWFwcGVyLAorICAgICAgICAgIGhpZGxfaGFuZGxlICZoaWRsSGFuZGxlLAorICAgICAgICAgIGNvbnN0IEMySGFuZGxlR3JhbGxvYyAqY29uc3QgaGFuZGxlLAorICAgICAgICAgIEMyQWxsb2NhdG9yOjppZF90IGFsbG9jYXRvcklkKQorICAgIDogQzJHcmFwaGljQWxsb2NhdGlvbihpbmZvLm1hcHBlckluZm8ud2lkdGgsIGluZm8ubWFwcGVySW5mby5oZWlnaHQpLAorICAgICAgbUluZm8oaW5mbyksCisgICAgICBtTWFwcGVyKG1hcHBlciksCisgICAgICBtSGlkbEhhbmRsZShzdGQ6Om1vdmUoaGlkbEhhbmRsZSkpLAorICAgICAgbUhhbmRsZShoYW5kbGUpLAorICAgICAgbUJ1ZmZlcihudWxscHRyKSwKKyAgICAgIG1Mb2NrZWRIYW5kbGUobnVsbHB0ciksCisgICAgICBtTG9ja2VkKGZhbHNlKSwKKyAgICAgIG1BbGxvY2F0b3JJZChhbGxvY2F0b3JJZCkgeworfQorCitDMkFsbG9jYXRpb25HcmFsbG9jOjp+QzJBbGxvY2F0aW9uR3JhbGxvYygpIHsKKyAgICBpZiAoIW1CdWZmZXIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAobUxvY2tlZCkgeworICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbiBpZ25vcmVzIGFkZHJlc3NzIGFuZCByZWN0CisgICAgICAgIHVpbnQ4X3QqIGFkZHJbQzJQbGFuYXJMYXlvdXQ6Ok1BWF9OVU1fUExBTkVTXSA9IHt9OworICAgICAgICB1bm1hcChhZGRyLCBDMlJlY3QoKSwgbnVsbHB0cik7CisgICAgfQorICAgIG1NYXBwZXItPmZyZWVCdWZmZXIoY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4obUJ1ZmZlcikpOworICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90Kj4oCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCo+KG1IYW5kbGUpKSk7Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdGlvbkdyYWxsb2M6Om1hcCgKKyAgICAgICAgQzJSZWN0IHJlY3QsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIEMyRmVuY2UgKmZlbmNlLAorICAgICAgICBDMlBsYW5hckxheW91dCAqbGF5b3V0IC8qIG5vbm51bGwgKi8sIHVpbnQ4X3QgKiphZGRyIC8qIG5vbm51bGwgKi8pIHsKKyAgICB1aW50NjRfdCBncmFsbG9jVXNhZ2UgPSBzdGF0aWNfY2FzdDxDMkFuZHJvaWRNZW1vcnlVc2FnZT4odXNhZ2UpLmFzR3JhbGxvY1VzYWdlKCk7CisgICAgQUxPR1YoIm1hcHBpbmcgYnVmZmVyIHdpdGggdXNhZ2UgJSNsbHggPT4gJSNsbHgiLAorICAgICAgICAgIChsb25nIGxvbmcpdXNhZ2UuZXhwZWN0ZWQsIChsb25nIGxvbmcpZ3JhbGxvY1VzYWdlKTsKKworICAgIC8vIFRPRE8KKyAgICAodm9pZCkgZmVuY2U7CisKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTWFwcGVkTG9jayk7CisgICAgaWYgKG1CdWZmZXIgJiYgbUxvY2tlZCkgeworICAgICAgICBBTE9HRCgiYWxyZWFkeSBtYXBwZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX0RVUExJQ0FURTsKKyAgICB9CisgICAgaWYgKCFsYXlvdXQgfHwgIWFkZHIpIHsKKyAgICAgICAgQUxPR0QoIndyb25nIHBhcmFtIik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgZXJyID0gQzJfT0s7CisgICAgaWYgKCFtQnVmZmVyKSB7CisgICAgICAgIG1NYXBwZXItPmltcG9ydEJ1ZmZlcigKKyAgICAgICAgICAgICAgICBtSGlkbEhhbmRsZSwgWyZlcnIsIHRoaXNdKGNvbnN0IGF1dG8gJm1hcGVyciwgY29uc3QgYXV0byAmYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IG1hcGVycjJlcnJvcihtYXBlcnIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVyID0gc3RhdGljX2Nhc3Q8YnVmZmVyX2hhbmRsZV90PihidWZmZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dEKCJpbXBvcnRCdWZmZXIgZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIGlmIChtQnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dEKCJpbXBvcnRCdWZmZXIgcmV0dXJuZWQgbnVsbCBidWZmZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiA9IDA7CisgICAgICAgIHVpbnQ2NF90IGlnYnBfaWQgPSAwOworICAgICAgICB1aW50MzJfdCBpZ2JwX3Nsb3QgPSAwOworICAgICAgICBpZiAobUhhbmRsZSkgeworICAgICAgICAgICAgbUhhbmRsZS0+Z2V0SWdicERhdGEoJmdlbmVyYXRpb24sICZpZ2JwX2lkLCAmaWdicF9zbG90KTsKKyAgICAgICAgfQorICAgICAgICBtTG9ja2VkSGFuZGxlID0gQzJIYW5kbGVHcmFsbG9jOjpXcmFwTmF0aXZlSGFuZGxlKAorICAgICAgICAgICAgICAgIG1CdWZmZXIsIG1JbmZvLm1hcHBlckluZm8ud2lkdGgsIG1JbmZvLm1hcHBlckluZm8uaGVpZ2h0LAorICAgICAgICAgICAgICAgICh1aW50MzJfdCltSW5mby5tYXBwZXJJbmZvLmZvcm1hdCwgbUluZm8ubWFwcGVySW5mby51c2FnZSwgbUluZm8uc3RyaWRlLAorICAgICAgICAgICAgICAgIGdlbmVyYXRpb24sIGlnYnBfaWQsIGlnYnBfc2xvdCk7CisgICAgfQorCisgICAgc3dpdGNoIChtSW5mby5tYXBwZXJJbmZvLmZvcm1hdCkgeworICAgICAgICBjYXNlIFBpeGVsRm9ybWF0OjpSR0JBXzEwMTAxMDI6IHsKKyAgICAgICAgICAgIC8vIFRSSUNLWTogdGhpcyBpcyB1c2VkIGZvciBtZWRpYSBhcyBZVVY0NDQgaW4gdGhlIGNhc2Ugd2hlbiBpdCBpcyBxdWV1ZWQgZGlyZWN0bHkgdG8gYQorICAgICAgICAgICAgLy8gU3VyZmFjZS4gSW4gYWxsIG90aGVyIGNhc2VzIGl0IGlzIFJHQkEuIFdlIGRvbid0IGtub3cgd2hpY2ggY2FzZSBpdCBpcyBoZXJlLCBzbworICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBZVVYgZm9yIG5vdy4KKyAgICAgICAgICAgIHZvaWQgKnBvaW50ZXIgPSBudWxscHRyOworICAgICAgICAgICAgbU1hcHBlci0+bG9jaygKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4obUJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgIGdyYWxsb2NVc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgeyAoaW50MzJfdClyZWN0LmxlZnQsIChpbnQzMl90KXJlY3QudG9wLCAoaW50MzJfdClyZWN0LndpZHRoLCAoaW50MzJfdClyZWN0LmhlaWdodCB9LAorICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBmZW5jZQorICAgICAgICAgICAgICAgICAgICBoaWRsX2hhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICBbJmVyciwgJnBvaW50ZXJdKGNvbnN0IGF1dG8gJm1hcGVyciwgY29uc3QgYXV0byAmbWFwUG9pbnRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gbWFwZXJyMmVycm9yKG1hcGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciA9IG1hcFBvaW50ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIEFMT0dEKCJsb2NrIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyB0cmVhdCBhcyAzMi1iaXQgdmFsdWVzCisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSA9ICh1aW50OF90ICopcG9pbnRlcjsKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdID0gKHVpbnQ4X3QgKilwb2ludGVyOworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVl0gPSAodWludDhfdCAqKXBvaW50ZXI7CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9BXSA9ICh1aW50OF90ICopcG9pbnRlcjsKKyAgICAgICAgICAgIGxheW91dC0+dHlwZSA9IEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVkE7CisgICAgICAgICAgICBsYXlvdXQtPm51bVBsYW5lcyA9IDQ7CisgICAgICAgICAgICBsYXlvdXQtPnJvb3RQbGFuZXMgPSAxOworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX1ksICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgNCAqIChpbnQzMl90KW1JbmZvLnN0cmlkZSwgICAgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDEwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAxMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TElUVExFX0VORCwgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfWSwgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX0NCLCAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIDQgKiAoaW50MzJfdCltSW5mby5zdHJpZGUsICAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICAxMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkxJVFRMRV9FTkQsICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ksICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DUiwgICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICA0ICogKGludDMyX3QpbUluZm8uc3RyaWRlLCAgICAgIC8vIHJvd0luYworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICAzMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCisgICAgICAgICAgICAgICAgMTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgIDIwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpMSVRUTEVfRU5ELCAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9ZLCAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfQV0gPSB7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfQSwgICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICA0ICogKGludDMyX3QpbUluZm8uc3RyaWRlLCAgICAgIC8vIHJvd0luYworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICAzMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCisgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgIDMwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpMSVRUTEVfRU5ELCAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9ZLCAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgUGl4ZWxGb3JtYXQ6OlJHQkFfODg4ODoKKyAgICAgICAgICAgIC8vIFRPRE86IGFscGhhIGNoYW5uZWwKKyAgICAgICAgICAgIC8vIGZhbGwtdGhyb3VnaAorICAgICAgICBjYXNlIFBpeGVsRm9ybWF0OjpSR0JYXzg4ODg6IHsKKyAgICAgICAgICAgIHZvaWQgKnBvaW50ZXIgPSBudWxscHRyOworICAgICAgICAgICAgbU1hcHBlci0+bG9jaygKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4obUJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgIGdyYWxsb2NVc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgeyAoaW50MzJfdClyZWN0LmxlZnQsIChpbnQzMl90KXJlY3QudG9wLCAoaW50MzJfdClyZWN0LndpZHRoLCAoaW50MzJfdClyZWN0LmhlaWdodCB9LAorICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBmZW5jZQorICAgICAgICAgICAgICAgICAgICBoaWRsX2hhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICBbJmVyciwgJnBvaW50ZXJdKGNvbnN0IGF1dG8gJm1hcGVyciwgY29uc3QgYXV0byAmbWFwUG9pbnRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gbWFwZXJyMmVycm9yKG1hcGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciA9IG1hcFBvaW50ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIEFMT0dEKCJsb2NrIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9SXSA9ICh1aW50OF90ICopcG9pbnRlcjsKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0ddID0gKHVpbnQ4X3QgKilwb2ludGVyICsgMTsKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0JdID0gKHVpbnQ4X3QgKilwb2ludGVyICsgMjsKKyAgICAgICAgICAgIGxheW91dC0+dHlwZSA9IEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQjsKKyAgICAgICAgICAgIGxheW91dC0+bnVtUGxhbmVzID0gMzsKKyAgICAgICAgICAgIGxheW91dC0+cm9vdFBsYW5lcyA9IDE7CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfUl0gPSB7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfUiwgICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICA0ICogKGludDMyX3QpbUluZm8uc3RyaWRlLCAgICAgIC8vIHJvd0luYworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpOQVRJVkUsICAgICAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9SLCAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfR10gPSB7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfRywgICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICA0ICogKGludDMyX3QpbUluZm8uc3RyaWRlLCAgICAgIC8vIHJvd0luYworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpOQVRJVkUsICAgICAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9SLCAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfQl0gPSB7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfQiwgICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICA0ICogKGludDMyX3QpbUluZm8uc3RyaWRlLCAgICAgIC8vIHJvd0luYworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpOQVRJVkUsICAgICAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9SLCAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgUGl4ZWxGb3JtYXQ6OllDQkNSXzQyMF84ODg6CisgICAgICAgICAgICAvLyBmYWxsLXRocm91Z2gKKyAgICAgICAgY2FzZSBQaXhlbEZvcm1hdDo6WVYxMjoKKyAgICAgICAgICAgIC8vIGZhbGwtdGhyb3VnaAorICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICBZQ2JDckxheW91dCB5Y2JjckxheW91dDsKKyAgICAgICAgICAgIG1NYXBwZXItPmxvY2tZQ2JDcigKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4obUJ1ZmZlciksIGdyYWxsb2NVc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgeyAoaW50MzJfdClyZWN0LmxlZnQsIChpbnQzMl90KXJlY3QudG9wLCAoaW50MzJfdClyZWN0LndpZHRoLCAoaW50MzJfdClyZWN0LmhlaWdodCB9LAorICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBmZW5jZQorICAgICAgICAgICAgICAgICAgICBoaWRsX2hhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICBbJmVyciwgJnljYmNyTGF5b3V0XShjb25zdCBhdXRvICZtYXBlcnIsIGNvbnN0IGF1dG8gJm1hcExheW91dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gbWFwZXJyMmVycm9yKG1hcGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWNiY3JMYXlvdXQgPSBtYXBMYXlvdXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIEFMT0dEKCJsb2NrWUNiQ3IgZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldID0gKHVpbnQ4X3QgKil5Y2JjckxheW91dC55OworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVV0gPSAodWludDhfdCAqKXljYmNyTGF5b3V0LmNiOworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVl0gPSAodWludDhfdCAqKXljYmNyTGF5b3V0LmNyOworICAgICAgICAgICAgbGF5b3V0LT50eXBlID0gQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWOworICAgICAgICAgICAgbGF5b3V0LT5udW1QbGFuZXMgPSAzOworICAgICAgICAgICAgbGF5b3V0LT5yb290UGxhbmVzID0gMzsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9ZLCAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIChpbnQzMl90KXljYmNyTGF5b3V0LnlTdHJpZGUsICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86Ok5BVElWRSwgICAgICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ksICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DQiwgICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIChpbnQzMl90KXljYmNyTGF5b3V0LmNocm9tYVN0ZXAsICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICAoaW50MzJfdCl5Y2JjckxheW91dC5jU3RyaWRlLCAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpOQVRJVkUsICAgICAgICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1UsICAgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl0gPSB7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfQ1IsICAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAoaW50MzJfdCl5Y2JjckxheW91dC5jaHJvbWFTdGVwLCAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgKGludDMyX3QpeWNiY3JMYXlvdXQuY1N0cmlkZSwgICAgIC8vIHJvd0luYworICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TkFUSVZFLCAgICAgICAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9WLCAgICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgICAgLy8gaGFuZGxlIGludGVybGVhdmVkIGZvcm1hdHMKKyAgICAgICAgICAgIGludHB0cl90IHV2T2Zmc2V0ID0gYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVl0gLSBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICAgICAgICAgIGlmICh1dk9mZnNldCA+IDAgJiYgdXZPZmZzZXQgPCAoaW50cHRyX3QpeWNiY3JMYXlvdXQuY2hyb21hU3RlcCkgeworICAgICAgICAgICAgICAgIGxheW91dC0+cm9vdFBsYW5lcyA9IDI7CisgICAgICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdLnJvb3RJeCA9IEMyUGxhbmFyTGF5b3V0OjpQTEFORV9VOworICAgICAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXS5vZmZzZXQgPSB1dk9mZnNldDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodXZPZmZzZXQgPCAwICYmIHV2T2Zmc2V0ID4gLShpbnRwdHJfdCl5Y2JjckxheW91dC5jaHJvbWFTdGVwKSB7CisgICAgICAgICAgICAgICAgbGF5b3V0LT5yb290UGxhbmVzID0gMjsKKyAgICAgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ucm9vdEl4ID0gQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1Y7CisgICAgICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdLm9mZnNldCA9IC11dk9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIG1Mb2NrZWQgPSB0cnVlOworCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRpb25HcmFsbG9jOjp1bm1hcCgKKyAgICAgICAgdWludDhfdCAqKmFkZHIsIEMyUmVjdCByZWN0LCBDMkZlbmNlICpmZW5jZSAvKiBudWxsYWJsZSAqLykgeworICAgIC8vIFRPRE86IGNoZWNrIGFkZHIgYW5kIHNpemUsIHVzZSBmZW5jZQorICAgICh2b2lkKWFkZHI7CisgICAgKHZvaWQpcmVjdDsKKworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NYXBwZWRMb2NrKTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKyAgICBtTWFwcGVyLT51bmxvY2soCisgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQnVmZmVyKSwKKyAgICAgICAgICAgIFsmZXJyLCAmZmVuY2VdKGNvbnN0IGF1dG8gJm1hcGVyciwgY29uc3QgYXV0byAmcmVsZWFzZUZlbmNlKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETworICAgICAgICAgICAgICAgICh2b2lkKSBmZW5jZTsKKyAgICAgICAgICAgICAgICAodm9pZCkgcmVsZWFzZUZlbmNlOworICAgICAgICAgICAgICAgIGVyciA9IG1hcGVycjJlcnJvcihtYXBlcnIpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgIG1Mb2NrZWQgPSBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworYm9vbCBDMkFsbG9jYXRpb25HcmFsbG9jOjplcXVhbHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyR3JhcGhpY0FsbG9jYXRpb24+ICZvdGhlcikgY29uc3QgeworICAgIHJldHVybiBvdGhlciAmJiBvdGhlci0+aGFuZGxlKCkgPT0gaGFuZGxlKCk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gR1JBTExPQyBBTExPQ0FUT1IgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitjbGFzcyBDMkFsbG9jYXRvckdyYWxsb2M6OkltcGwgeworcHVibGljOgorICAgIEltcGwoaWRfdCBpZCwgYm9vbCBidWZmZXJRdWV1ZSk7CisKKyAgICBpZF90IGdldElkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRyYWl0cy0+aWQ7CisgICAgfQorCisgICAgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UcmFpdHMtPm5hbWU7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQWxsb2NhdG9yOjpUcmFpdHM+IGdldFRyYWl0cygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UcmFpdHM7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgbmV3R3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBmb3JtYXQsIGNvbnN0IEMyTWVtb3J5VXNhZ2UgJnVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICphbGxvY2F0aW9uKTsKKworICAgIGMyX3N0YXR1c190IHByaW9yR3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICphbGxvY2F0aW9uKTsKKworICAgIGMyX3N0YXR1c190IHN0YXR1cygpIGNvbnN0IHsgcmV0dXJuIG1Jbml0OyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yOjpUcmFpdHM+IG1UcmFpdHM7CisgICAgYzJfc3RhdHVzX3QgbUluaXQ7CisgICAgc3A8SUFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKyAgICBzcDxJTWFwcGVyPiBtTWFwcGVyOworICAgIGNvbnN0IGJvb2wgbUJ1ZmZlclF1ZXVlOworfTsKKwordm9pZCBfVW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY01ldGFkYXRhKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlLAorICAgICAgICB1aW50MzJfdCAqd2lkdGgsIHVpbnQzMl90ICpoZWlnaHQsIHVpbnQzMl90ICpmb3JtYXQsdWludDY0X3QgKnVzYWdlLCB1aW50MzJfdCAqc3RyaWRlLAorICAgICAgICB1aW50MzJfdCAqZ2VuZXJhdGlvbiwgdWludDY0X3QgKmlnYnBfaWQsIHVpbnQzMl90ICppZ2JwX3Nsb3QpIHsKKyAgICAodm9pZClDMkhhbmRsZUdyYWxsb2M6OkltcG9ydChoYW5kbGUsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uLCBpZ2JwX2lkLCBpZ2JwX3Nsb3QpOworfQorCitDMkFsbG9jYXRvckdyYWxsb2M6OkltcGw6OkltcGwoaWRfdCBpZCwgYm9vbCBidWZmZXJRdWV1ZSkKKyAgICA6IG1Jbml0KEMyX09LKSwgbUJ1ZmZlclF1ZXVlKGJ1ZmZlclF1ZXVlKSB7CisgICAgLy8gVE9ETzogZ2V0IHRoaXMgZnJvbSBhbGxvY2F0b3IKKyAgICBDMk1lbW9yeVVzYWdlIG1pblVzYWdlID0geyAwLCAwIH0sIG1heFVzYWdlID0geyB+KHVpbnQ2NF90KTAsIH4odWludDY0X3QpMCB9OworICAgIFRyYWl0cyB0cmFpdHMgPSB7ICJhbmRyb2lkLmFsbG9jYXRvci5ncmFsbG9jIiwgaWQsIEMyQWxsb2NhdG9yOjpHUkFQSElDLCBtaW5Vc2FnZSwgbWF4VXNhZ2UgfTsKKyAgICBtVHJhaXRzID0gc3RkOjptYWtlX3NoYXJlZDxDMkFsbG9jYXRvcjo6VHJhaXRzPih0cmFpdHMpOworCisgICAgLy8gZ3JhbGxvYyBhbGxvY2F0b3IgaXMgYSBzaW5nbGV0b24sIHNvIGFsbCBvYmplY3RzIHNoYXJlIGEgZ2xvYmFsIHNlcnZpY2UKKyAgICBtQWxsb2NhdG9yID0gSUFsbG9jYXRvcjo6Z2V0U2VydmljZSgpOworICAgIG1NYXBwZXIgPSBJTWFwcGVyOjpnZXRTZXJ2aWNlKCk7CisgICAgaWYgKG1BbGxvY2F0b3IgPT0gbnVsbHB0ciB8fCBtTWFwcGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgbUluaXQgPSBDMl9DT1JSVVBURUQ7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRvckdyYWxsb2M6OkltcGw6Om5ld0dyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBmb3JtYXQsIGNvbnN0IEMyTWVtb3J5VXNhZ2UgJnVzYWdlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIHsKKyAgICB1aW50NjRfdCBncmFsbG9jVXNhZ2UgPSBzdGF0aWNfY2FzdDxDMkFuZHJvaWRNZW1vcnlVc2FnZT4odXNhZ2UpLmFzR3JhbGxvY1VzYWdlKCk7CisgICAgQUxPR1YoImFsbG9jYXRpbmcgYnVmZmVyIHdpdGggdXNhZ2UgJSNsbHggPT4gJSNsbHgiLAorICAgICAgICAgIChsb25nIGxvbmcpdXNhZ2UuZXhwZWN0ZWQsIChsb25nIGxvbmcpZ3JhbGxvY1VzYWdlKTsKKworICAgIEJ1ZmZlckRlc2NyaXB0b3JJbmZvIGluZm8gPSB7CisgICAgICAgIHsKKyAgICAgICAgICAgIHdpZHRoLAorICAgICAgICAgICAgaGVpZ2h0LAorICAgICAgICAgICAgMXUsICAvLyBsYXllckNvdW50CisgICAgICAgICAgICAoUGl4ZWxGb3JtYXQpZm9ybWF0LAorICAgICAgICAgICAgZ3JhbGxvY1VzYWdlLAorICAgICAgICB9LAorICAgICAgICAwdSwgIC8vIHN0cmlkZSBwbGFjZWhvbGRlcgorICAgIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gQzJfT0s7CisgICAgQnVmZmVyRGVzY3JpcHRvciBkZXNjOworICAgIG1NYXBwZXItPmNyZWF0ZURlc2NyaXB0b3IoCisgICAgICAgICAgICBpbmZvLm1hcHBlckluZm8sIFsmZXJyLCAmZGVzY10oY29uc3QgYXV0byAmbWFwZXJyLCBjb25zdCBhdXRvICZkZXNjcmlwdG9yKSB7CisgICAgICAgICAgICAgICAgZXJyID0gbWFwZXJyMmVycm9yKG1hcGVycik7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBkZXNjID0gZGVzY3JpcHRvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgLy8gSUFsbG9jYXRvciBzaGFyZXMgSU1hcHBlciBlcnJvciBjb2Rlcy4KKyAgICBoaWRsX2hhbmRsZSBidWZmZXI7CisgICAgbUFsbG9jYXRvci0+YWxsb2NhdGUoCisgICAgICAgICAgICBkZXNjLAorICAgICAgICAgICAgMXUsCisgICAgICAgICAgICBbJmVyciwgJmJ1ZmZlciwgJmluZm9dKGNvbnN0IGF1dG8gJm1hcGVyciwgY29uc3QgYXV0byAmc3RyaWRlLCBhdXRvICZidWZmZXJzKSB7CisgICAgICAgICAgICAgICAgZXJyID0gbWFwZXJyMmVycm9yKG1hcGVycik7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChidWZmZXJzLnNpemUoKSAhPSAxdSkgeworICAgICAgICAgICAgICAgICAgICBlcnIgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5mby5zdHJpZGUgPSBzdHJpZGU7CisgICAgICAgICAgICAgICAgYnVmZmVyID0gc3RkOjptb3ZlKGJ1ZmZlcnNbMF0pOworICAgICAgICAgICAgfSk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworCisgICAgYWxsb2NhdGlvbi0+cmVzZXQobmV3IEMyQWxsb2NhdGlvbkdyYWxsb2MoCisgICAgICAgICAgICBpbmZvLCBtTWFwcGVyLCBidWZmZXIsCisgICAgICAgICAgICBDMkhhbmRsZUdyYWxsb2M6OldyYXBOYXRpdmVIYW5kbGUoCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5nZXROYXRpdmVIYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgaW5mby5tYXBwZXJJbmZvLndpZHRoLCBpbmZvLm1hcHBlckluZm8uaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpaW5mby5tYXBwZXJJbmZvLmZvcm1hdCwgaW5mby5tYXBwZXJJbmZvLnVzYWdlLCBpbmZvLnN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgMCwgMCwgbUJ1ZmZlclF1ZXVlID8gfjAgOiAwKSwKKyAgICAgICAgICAgIG1UcmFpdHMtPmlkKSk7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRvckdyYWxsb2M6OkltcGw6OnByaW9yR3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgeworICAgIEJ1ZmZlckRlc2NyaXB0b3JJbmZvIGluZm87CisgICAgaW5mby5tYXBwZXJJbmZvLmxheWVyQ291bnQgPSAxdTsKKyAgICB1aW50MzJfdCBnZW5lcmF0aW9uOworICAgIHVpbnQ2NF90IGlnYnBfaWQ7CisgICAgdWludDMyX3QgaWdicF9zbG90OworICAgIGNvbnN0IEMySGFuZGxlR3JhbGxvYyAqZ3JhbGxvY0hhbmRsZSA9IEMySGFuZGxlR3JhbGxvYzo6SW1wb3J0KAorICAgICAgICAgICAgaGFuZGxlLAorICAgICAgICAgICAgJmluZm8ubWFwcGVySW5mby53aWR0aCwgJmluZm8ubWFwcGVySW5mby5oZWlnaHQsCisgICAgICAgICAgICAodWludDMyX3QgKikmaW5mby5tYXBwZXJJbmZvLmZvcm1hdCwgKHVpbnQ2NF90ICopJmluZm8ubWFwcGVySW5mby51c2FnZSwgJmluZm8uc3RyaWRlLAorICAgICAgICAgICAgJmdlbmVyYXRpb24sICZpZ2JwX2lkLCAmaWdicF9zbG90KTsKKyAgICBpZiAoZ3JhbGxvY0hhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgaGlkbF9oYW5kbGUgaGlkbEhhbmRsZTsKKyAgICBoaWRsSGFuZGxlLnNldFRvKEMySGFuZGxlR3JhbGxvYzo6VW53cmFwTmF0aXZlSGFuZGxlKGdyYWxsb2NIYW5kbGUpLCB0cnVlKTsKKworICAgIGFsbG9jYXRpb24tPnJlc2V0KG5ldyBDMkFsbG9jYXRpb25HcmFsbG9jKGluZm8sIG1NYXBwZXIsIGhpZGxIYW5kbGUsIGdyYWxsb2NIYW5kbGUsIG1UcmFpdHMtPmlkKSk7CisgICAgcmV0dXJuIEMyX09LOworfQorCitDMkFsbG9jYXRvckdyYWxsb2M6OkMyQWxsb2NhdG9yR3JhbGxvYyhpZF90IGlkLCBib29sIGJ1ZmZlclF1ZXVlKQorICAgICAgICA6IG1JbXBsKG5ldyBJbXBsKGlkLCBidWZmZXJRdWV1ZSkpIHt9CisKK0MyQWxsb2NhdG9yR3JhbGxvYzo6fkMyQWxsb2NhdG9yR3JhbGxvYygpIHsgZGVsZXRlIG1JbXBsOyB9CisKK0MyQWxsb2NhdG9yOjppZF90IEMyQWxsb2NhdG9yR3JhbGxvYzo6Z2V0SWQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRJZCgpOworfQorCitDMlN0cmluZyBDMkFsbG9jYXRvckdyYWxsb2M6OmdldE5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXROYW1lKCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkFsbG9jYXRvcjo6VHJhaXRzPiBDMkFsbG9jYXRvckdyYWxsb2M6OmdldFRyYWl0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldFRyYWl0cygpOworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRvckdyYWxsb2M6Om5ld0dyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBmb3JtYXQsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgeworICAgIHJldHVybiBtSW1wbC0+bmV3R3JhcGhpY0FsbG9jYXRpb24od2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgYWxsb2NhdGlvbik7Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdG9yR3JhbGxvYzo6cHJpb3JHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICphbGxvY2F0aW9uKSB7CisgICAgcmV0dXJuIG1JbXBsLT5wcmlvckdyYXBoaWNBbGxvY2F0aW9uKGhhbmRsZSwgYWxsb2NhdGlvbik7Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdG9yR3JhbGxvYzo6c3RhdHVzKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+c3RhdHVzKCk7Cit9CisKK2Jvb2wgQzJBbGxvY2F0b3JHcmFsbG9jOjppc1ZhbGlkKGNvbnN0IEMySGFuZGxlKiBjb25zdCBvKSB7CisgICAgcmV0dXJuIEMySGFuZGxlR3JhbGxvYzo6aXNWYWxpZChvKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JJb24uY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JJb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNmFhYzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkFsbG9jYXRvcklvbi5jcHAKQEAgLTAsMCArMSw1NjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyQWxsb2NhdG9ySW9uIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bGlzdD4KKworI2luY2x1ZGUgPGlvbi9pb24uaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPiAvLyBnZXRwYWdlc2l6ZSwgc2l6ZV90LCBjbG9zZSwgZHVwCisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvcklvbi5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyRXJybm9VdGlscy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisgICAgY29uc3RleHByIHNpemVfdCBVU0FHRV9MUlVfQ0FDSEVfU0laRSA9IDEwMjQ7Cit9CisKKy8qIHNpemVfdCA8PT4gaW50KGxvKSwgaW50KGhpKSBjb252ZXJzaW9ucyAqLworY29uc3RleHByIGlubGluZSBpbnQgc2l6ZTJpbnRMbyhzaXplX3QgcykgeworICAgIHJldHVybiBpbnQocyAmIDB4RkZGRkZGRkYpOworfQorCitjb25zdGV4cHIgaW5saW5lIGludCBzaXplMmludEhpKHNpemVfdCBzKSB7CisgICAgLy8gY2FzdCB0byB1aW50NjRfdCBhcyBzaXplX3QgbWF5IGJlIDMyIGJpdHMgd2lkZQorICAgIHJldHVybiBpbnQoKHVpbnQ2NF90KHMpID4+IDMyKSAmIDB4RkZGRkZGRkYpOworfQorCitjb25zdGV4cHIgaW5saW5lIHNpemVfdCBpbnRzMnNpemUoaW50IGludExvLCBpbnQgaW50SGkpIHsKKyAgICAvLyBjb252ZXJ0IGluIDIgc3RhZ2VzIHRvIDY0IGJpdHMgYXMgaW50SGkgbWF5IGJlIG5lZ2F0aXZlCisgICAgcmV0dXJuIHNpemVfdCh1bnNpZ25lZChpbnRMbykpIHwgc2l6ZV90KHVpbnQ2NF90KHVuc2lnbmVkKGludEhpKSkgPDwgMzIpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJT04gSEFORExFID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qKgorICogSU9OIGhhbmRsZQorICoKKyAqIFRoZXJlIGNhbiBiZSBvbmx5IGEgc29sZSBpb24gY2xpZW50IHBlciBwcm9jZXNzLCB0aGlzIGlzIGNhcHR1cmVkIGluIHRoZSBpb24gZmQgdGhhdCBpcyBwYXNzZWQKKyAqIHRvIHRoZSBjb25zdHJ1Y3RvciwgYnV0IHRoaXMgc2hvdWxkIGJlIG1hbmFnZWQgYnkgdGhlIGlvbiBidWZmZXIgYWxsb2NhdG9yL21hcHBlci4KKyAqCisgKiBpb24gdXNlcyBpb25fdXNlcl9oYW5kbGVfdCBmb3IgYnVmZmVycy4gV2UgZG9uJ3Qgc3RvcmUgdGhpcyBpbiB0aGUgbmF0aXZlIGhhbmRsZSBhcworICogaXQgcmVxdWlyZXMgYW4gaW9uX2ZyZWUgdG8gZGVjcmVmLiBJbnN0ZWFkLCB3ZSBzaGFyZSB0aGUgYnVmZmVyIHRvIGdldCBhbiBmZCB0aGF0IGFsc28gaG9sZHMKKyAqIGEgcmVmY291bnQuCisgKgorICogVGhpcyBoYW5kbGUgd2lsbCBub3QgY2FwdHVyZSBtYXBwZWQgZmQtcyBhcyB1cGRhdGluZyB0aGF0IHdvdWxkIHJlcXVpcmUgYSBnbG9iYWwgbXV0ZXguCisgKi8KKworc3RydWN0IEMySGFuZGxlSW9uIDogcHVibGljIEMySGFuZGxlIHsKKyAgICAvLyBpb24gaGFuZGxlIG93bnMgaW9uRmQoISkgYW5kIGJ1ZmZlckZkCisgICAgQzJIYW5kbGVJb24oaW50IGJ1ZmZlckZkLCBzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBDMkhhbmRsZShjSGVhZGVyKSwKKyAgICAgICAgICBtRmRzeyBidWZmZXJGZCB9LAorICAgICAgICAgIG1JbnRzeyBpbnQoc2l6ZSAmIDB4RkZGRkZGRkYpLCBpbnQoKHVpbnQ2NF90KHNpemUpID4+IDMyKSAmIDB4RkZGRkZGRkYpLCBrTWFnaWMgfSB7IH0KKworICAgIHN0YXRpYyBib29sIGlzVmFsaWQoY29uc3QgQzJIYW5kbGUgKiBjb25zdCBvKTsKKworICAgIGludCBidWZmZXJGZCgpIGNvbnN0IHsgcmV0dXJuIG1GZHMubUJ1ZmZlcjsgfQorICAgIHNpemVfdCBzaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gc2l6ZV90KHVuc2lnbmVkKG1JbnRzLm1TaXplTG8pKQorICAgICAgICAgICAgICAgIHwgc2l6ZV90KHVpbnQ2NF90KHVuc2lnbmVkKG1JbnRzLm1TaXplSGkpKSA8PCAzMik7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgc3RydWN0IHsKKyAgICAgICAgaW50IG1CdWZmZXI7IC8vIHNoYXJlZCBpb24gYnVmZmVyCisgICAgfSBtRmRzOworICAgIHN0cnVjdCB7CisgICAgICAgIGludCBtU2l6ZUxvOyAvLyBsb3cgMzItYml0cyBvZiBzaXplCisgICAgICAgIGludCBtU2l6ZUhpOyAvLyBoaWdoIDMyLWJpdHMgb2Ygc2l6ZQorICAgICAgICBpbnQgbU1hZ2ljOworICAgIH0gbUludHM7CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBDMkhhbmRsZUlvbiBfdHlwZTsKKyAgICBlbnVtIHsKKyAgICAgICAga01hZ2ljID0gJ1x4YzJpb1x4MDAnLAorICAgICAgICBudW1GZHMgPSBzaXplb2YobUZkcykgLyBzaXplb2YoaW50KSwKKyAgICAgICAgbnVtSW50cyA9IHNpemVvZihtSW50cykgLyBzaXplb2YoaW50KSwKKyAgICAgICAgdmVyc2lvbiA9IHNpemVvZihDMkhhbmRsZSkKKyAgICB9OworICAgIC8vY29uc3RleHByIHN0YXRpYyBDMkhhbmRsZSBjSGVhZGVyID0geyB2ZXJzaW9uLCBudW1GZHMsIG51bUludHMsIHt9IH07CisgICAgY29uc3Qgc3RhdGljIEMySGFuZGxlIGNIZWFkZXI7Cit9OworCitjb25zdCBDMkhhbmRsZSBDMkhhbmRsZUlvbjo6Y0hlYWRlciA9IHsKKyAgICBDMkhhbmRsZUlvbjo6dmVyc2lvbiwKKyAgICBDMkhhbmRsZUlvbjo6bnVtRmRzLAorICAgIEMySGFuZGxlSW9uOjpudW1JbnRzLAorICAgIHt9Cit9OworCisvLyBzdGF0aWMKK2Jvb2wgQzJIYW5kbGVJb246OmlzVmFsaWQoY29uc3QgQzJIYW5kbGUgKiBjb25zdCBvKSB7CisgICAgaWYgKCFvIHx8IG1lbWNtcChvLCAmY0hlYWRlciwgc2l6ZW9mKGNIZWFkZXIpKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNvbnN0IEMySGFuZGxlSW9uICpvdGhlciA9IHN0YXRpY19jYXN0PGNvbnN0IEMySGFuZGxlSW9uKj4obyk7CisgICAgcmV0dXJuIG90aGVyLT5tSW50cy5tTWFnaWMgPT0ga01hZ2ljOworfQorCisvLyBUT0RPOiBpcyB0aGUgZHVwIG9mIGFuIGlvbiBmZCBpZGVudGljYWwgdG8gaW9uX3NoYXJlPworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSU9OIEFMTE9DQVRJT04gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2NsYXNzIEMyQWxsb2NhdGlvbklvbiA6IHB1YmxpYyBDMkxpbmVhckFsbG9jYXRpb24geworcHVibGljOgorICAgIC8qIEludGVyZmFjZSBtZXRob2RzICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBtYXAoCisgICAgICAgIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBDMk1lbW9yeVVzYWdlIHVzYWdlLCBDMkZlbmNlICpmZW5jZSwKKyAgICAgICAgdm9pZCAqKmFkZHIgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCB1bm1hcCh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSwgQzJGZW5jZSAqZmVuY2VGZCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB+QzJBbGxvY2F0aW9uSW9uKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBpZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBib29sIGVxdWFscyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAmb3RoZXIpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLy8gaW50ZXJuYWwgbWV0aG9kcworICAgIEMyQWxsb2NhdGlvbklvbihpbnQgaW9uRmQsIHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ24sIHVuc2lnbmVkIGhlYXBNYXNrLCB1bnNpZ25lZCBmbGFncywgQzJBbGxvY2F0b3I6OmlkX3QgaWQpOworICAgIEMyQWxsb2NhdGlvbklvbihpbnQgaW9uRmQsIHNpemVfdCBzaXplLCBpbnQgc2hhcmVGZCwgQzJBbGxvY2F0b3I6OmlkX3QgaWQpOworCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgICBjbGFzcyBJbXBsOworICAgIEltcGwgKm1JbXBsOworCisgICAgLy8gVE9ETzogd2UgY291bGQgbWFrZSB0aGlzIGVuY2Fwc3VsYXRlIHNoYXJlZF9wdHIgYW5kIGNvcGlhYmxlCisgICAgQzJfRE9fTk9UX0NPUFkoQzJBbGxvY2F0aW9uSW9uKTsKK307CisKK2NsYXNzIEMyQWxsb2NhdGlvbklvbjo6SW1wbCB7Citwcml2YXRlOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gaW9uIGFsbG9jYXRpb24uCisgICAgICoKKyAgICAgKiBcbm90ZSBXZSBhbHdheXMgY3JlYXRlIGFuIGlvbiBhbGxvY2F0aW9uLCBldmVuIGlmIHRoZSBhbGxvY2F0aW9uIG9yIGltcG9ydCBmYWlscworICAgICAqIHNvIHRoYXQgd2UgY2FuIGNhcHR1cmUgdGhlIGVycm9yLgorICAgICAqCisgICAgICogXHBhcmFtIGlvbkZkICAgICBpb24gY2xpZW50IChvd25lcnNoaXAgdHJhbnNmZXJyZWQgdG8gY3JlYXRlZCBvYmplY3QpCisgICAgICogXHBhcmFtIGNhcGFjaXR5ICBzaXplIG9mIGFsbG9jYXRpb24KKyAgICAgKiBccGFyYW0gYnVmZmVyRmQgIGJ1ZmZlciBoYW5kbGUgKG93bmVyc2hpcCB0cmFuc2ZlcnJlZCB0byBjcmVhdGVkIG9iamVjdCkuIE11c3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgIGludmFsaWQgaWYgZXJyIGlzIG5vdCAwLgorICAgICAqIFxwYXJhbSBidWZmZXIgICAgaW9uIGJ1ZmZlciB1c2VyIGhhbmRsZSAob3duZXJzaGlwIHRyYW5zZmVycmVkIHRvIGNyZWF0ZWQgb2JqZWN0KS4gTXVzdCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgaW52YWxpZCBpZiBlcnIgaXMgbm90IDAuCisgICAgICogXHBhcmFtIGVyciAgICAgICBlcnJubyBkdXJpbmcgYnVmZmVyIGFsbG9jYXRpb24gb3IgaW1wb3J0CisgICAgICovCisgICAgSW1wbChpbnQgaW9uRmQsIHNpemVfdCBjYXBhY2l0eSwgaW50IGJ1ZmZlckZkLCBpb25fdXNlcl9oYW5kbGVfdCBidWZmZXIsIEMyQWxsb2NhdG9yOjppZF90IGlkLCBpbnQgZXJyKQorICAgICAgICA6IG1Jb25GZChpb25GZCksCisgICAgICAgICAgbUhhbmRsZShidWZmZXJGZCwgY2FwYWNpdHkpLAorICAgICAgICAgIG1CdWZmZXIoYnVmZmVyKSwKKyAgICAgICAgICBtSWQoaWQpLAorICAgICAgICAgIG1Jbml0KGMyX21hcF9lcnJubzxFTk9NRU0sIEVBQ0NFUywgRUlOVkFMPihlcnIpKSwKKyAgICAgICAgICBtTWFwRmQoLTEpIHsKKyAgICAgICAgaWYgKG1Jbml0ICE9IEMyX09LKSB7CisgICAgICAgICAgICAvLyBjbG9zZSBpb25GZCBub3cgb24gZXJyb3IKKyAgICAgICAgICAgIGlmIChtSW9uRmQgPj0gMCkgeworICAgICAgICAgICAgICAgIGNsb3NlKG1Jb25GZCk7CisgICAgICAgICAgICAgICAgbUlvbkZkID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBDMl9DSEVDSyhidWZmZXJGZCA8IDApOworICAgICAgICAgICAgLy8gQzJfQ0hFQ0soYnVmZmVyIDwgMCk7CisgICAgICAgIH0KKyAgICB9CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGlvbiBhbGxvY2F0aW9uIGJ5IGltcG9ydGluZyBhIHNoYXJlZCBidWZmZXIgZmQuCisgICAgICoKKyAgICAgKiBccGFyYW0gaW9uRmQgICAgIGlvbiBjbGllbnQgKG93bmVyc2hpcCB0cmFuc2ZlcnJlZCB0byBjcmVhdGVkIG9iamVjdCkKKyAgICAgKiBccGFyYW0gY2FwYWNpdHkgIHNpemUgb2YgYWxsb2NhdGlvbgorICAgICAqIFxwYXJhbSBidWZmZXJGZCAgYnVmZmVyIGhhbmRsZSAob3duZXJzaGlwIHRyYW5zZmVycmVkIHRvIGNyZWF0ZWQgb2JqZWN0KQorICAgICAqCisgICAgICogXHJldHVybiBjcmVhdGVkIGlvbiBhbGxvY2F0aW9uIChpbXBsZW1lbnRhdGlvbikgd2hpY2ggbWF5IGJlIGludmFsaWQgaWYgdGhlCisgICAgICogaW1wb3J0IGZhaWxlZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgSW1wbCAqSW1wb3J0KGludCBpb25GZCwgc2l6ZV90IGNhcGFjaXR5LCBpbnQgYnVmZmVyRmQsIEMyQWxsb2NhdG9yOjppZF90IGlkKSB7CisgICAgICAgIGlvbl91c2VyX2hhbmRsZV90IGJ1ZmZlciA9IC0xOworICAgICAgICBpbnQgcmV0ID0gaW9uX2ltcG9ydChpb25GZCwgYnVmZmVyRmQsICZidWZmZXIpOworICAgICAgICByZXR1cm4gbmV3IEltcGwoaW9uRmQsIGNhcGFjaXR5LCBidWZmZXJGZCwgYnVmZmVyLCBpZCwgcmV0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGlvbiBhbGxvY2F0aW9uIGJ5IGFsbG9jYXRpbmcgYW4gaW9uIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpb25GZCAgICAgaW9uIGNsaWVudCAob3duZXJzaGlwIHRyYW5zZmVycmVkIHRvIGNyZWF0ZWQgb2JqZWN0KQorICAgICAqIFxwYXJhbSBzaXplICAgICAgc2l6ZSBvZiBhbGxvY2F0aW9uCisgICAgICogXHBhcmFtIGFsaWduICAgICBkZXNpcmVkIGFsaWdubWVudCBvZiBhbGxvY2F0aW9uCisgICAgICogXHBhcmFtIGhlYXBNYXNrICBtYXNrIG9mIGhlYXBzIGNvbnNpZGVyZWQKKyAgICAgKiBccGFyYW0gZmxhZ3MgICAgIGlvbiBhbGxvY2F0aW9uIGZsYWdzCisgICAgICoKKyAgICAgKiBccmV0dXJuIGNyZWF0ZWQgaW9uIGFsbG9jYXRpb24gKGltcGxlbWVudGF0aW9uKSB3aGljaCBtYXkgYmUgaW52YWxpZCBpZiB0aGUKKyAgICAgKiBhbGxvY2F0aW9uIGZhaWxlZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgSW1wbCAqQWxsb2MoaW50IGlvbkZkLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWduLCB1bnNpZ25lZCBoZWFwTWFzaywgdW5zaWduZWQgZmxhZ3MsIEMyQWxsb2NhdG9yOjppZF90IGlkKSB7CisgICAgICAgIGludCBidWZmZXJGZCA9IC0xOworICAgICAgICBpb25fdXNlcl9oYW5kbGVfdCBidWZmZXIgPSAtMTsKKyAgICAgICAgc2l6ZV90IGFsaWduZWRTaXplID0gYWxpZ24gPT0gMCA/IHNpemUgOiAoc2l6ZSArIGFsaWduIC0gMSkgJiB+KGFsaWduIC0gMSk7CisgICAgICAgIGludCByZXQgPSBpb25fYWxsb2MoaW9uRmQsIGFsaWduZWRTaXplLCBhbGlnbiwgaGVhcE1hc2ssIGZsYWdzLCAmYnVmZmVyKTsKKyAgICAgICAgQUxPR1YoImlvbl9hbGxvYyhpb25GZCA9ICVkLCBzaXplID0gJXp1LCBhbGlnbiA9ICV6dSwgcHJvdCA9ICVkLCBmbGFncyA9ICVkKSAiCisgICAgICAgICAgICAgICJyZXR1cm5lZCAoJWQpIDsgYnVmZmVyID0gJWQiLAorICAgICAgICAgICAgICBpb25GZCwgYWxpZ25lZFNpemUsIGFsaWduLCBoZWFwTWFzaywgZmxhZ3MsIHJldCwgYnVmZmVyKTsKKyAgICAgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgICAgICAvLyBnZXQgYnVmZmVyIGZkIGZvciBuYXRpdmUgaGFuZGxlIGNvbnN0cnVjdG9yCisgICAgICAgICAgICByZXQgPSBpb25fc2hhcmUoaW9uRmQsIGJ1ZmZlciwgJmJ1ZmZlckZkKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgICAgIGlvbl9mcmVlKGlvbkZkLCBidWZmZXIpOworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgSW1wbChpb25GZCwgYWxpZ25lZFNpemUsIGJ1ZmZlckZkLCBidWZmZXIsIGlkLCByZXQpOworICAgIH0KKworICAgIGMyX3N0YXR1c190IG1hcChzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSAqZmVuY2UsIHZvaWQgKiphZGRyKSB7CisgICAgICAgICh2b2lkKWZlbmNlOyAvLyBUT0RPOiB3YWl0IGZvciBmZW5jZQorICAgICAgICAqYWRkciA9IG51bGxwdHI7CisgICAgICAgIGlmICghbU1hcHBpbmdzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJtdWx0aXBsZSBtYXAiKTsKKyAgICAgICAgICAgIC8vIFRPRE86IHRlY2huaWNhbGx5IHdlIHNob3VsZCByZXR1cm4gRFVQTElDQVRFIGhlcmUsIGJ1dCBvdXIgYmxvY2sgdmlld3MgZG9uJ3QKKyAgICAgICAgICAgIC8vIGFjdHVhbGx5IHVubWFwLCBzbyB3ZSBlbmQgdXAgcmVtYXBwaW5nIGFuIGlvbiBidWZmZXIgbXVsdGlwbGUgdGltZXMuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gcmV0dXJuIEMyX0RVUExJQ0FURTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgaW50IHByb3QgPSBQUk9UX05PTkU7CisgICAgICAgIGludCBmbGFncyA9IE1BUF9TSEFSRUQ7CisgICAgICAgIGlmICh1c2FnZS5leHBlY3RlZCAmIEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEKSB7CisgICAgICAgICAgICBwcm90IHw9IFBST1RfUkVBRDsKKyAgICAgICAgfQorICAgICAgICBpZiAodXNhZ2UuZXhwZWN0ZWQgJiBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUpIHsKKyAgICAgICAgICAgIHByb3QgfD0gUFJPVF9XUklURTsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBhbGlnbm1lbnRCeXRlcyA9IG9mZnNldCAlIFBBR0VfU0laRTsKKyAgICAgICAgc2l6ZV90IG1hcE9mZnNldCA9IG9mZnNldCAtIGFsaWdubWVudEJ5dGVzOworICAgICAgICBzaXplX3QgbWFwU2l6ZSA9IHNpemUgKyBhbGlnbm1lbnRCeXRlczsKKyAgICAgICAgTWFwcGluZyBtYXAgPSB7IG51bGxwdHIsIGFsaWdubWVudEJ5dGVzLCBtYXBTaXplIH07CisKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gQzJfT0s7CisgICAgICAgIGlmIChtTWFwRmQgPT0gLTEpIHsKKyAgICAgICAgICAgIGludCByZXQgPSBpb25fbWFwKG1Jb25GZCwgbUJ1ZmZlciwgbWFwU2l6ZSwgcHJvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBtYXBPZmZzZXQsICh1bnNpZ25lZCBjaGFyKiopJm1hcC5hZGRyLCAmbU1hcEZkKTsKKyAgICAgICAgICAgIEFMT0dWKCJpb25fbWFwKGlvbkZkID0gJWQsIGhhbmRsZSA9ICVkLCBzaXplID0gJXp1LCBwcm90ID0gJWQsIGZsYWdzID0gJWQsICIKKyAgICAgICAgICAgICAgICAgICJvZmZzZXQgPSAlenUpIHJldHVybmVkICglZCkiLAorICAgICAgICAgICAgICAgICAgbUlvbkZkLCBtQnVmZmVyLCBtYXBTaXplLCBwcm90LCBmbGFncywgbWFwT2Zmc2V0LCByZXQpOworICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgIG1NYXBGZCA9IC0xOworICAgICAgICAgICAgICAgIG1hcC5hZGRyID0gKmFkZHIgPSBudWxscHRyOworICAgICAgICAgICAgICAgIGVyciA9IGMyX21hcF9lcnJubzxFSU5WQUw+KC1yZXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqYWRkciA9ICh1aW50OF90ICopbWFwLmFkZHIgKyBhbGlnbm1lbnRCeXRlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1hcC5hZGRyID0gbW1hcChudWxscHRyLCBtYXBTaXplLCBwcm90LCBmbGFncywgbU1hcEZkLCBtYXBPZmZzZXQpOworICAgICAgICAgICAgQUxPR1YoIm1tYXAoc2l6ZSA9ICV6dSwgcHJvdCA9ICVkLCBmbGFncyA9ICVkLCBtYXBGZCA9ICVkLCBvZmZzZXQgPSAlenUpICIKKyAgICAgICAgICAgICAgICAgICJyZXR1cm5lZCAoJWQpIiwKKyAgICAgICAgICAgICAgICAgIG1hcFNpemUsIHByb3QsIGZsYWdzLCBtTWFwRmQsIG1hcE9mZnNldCwgZXJybm8pOworICAgICAgICAgICAgaWYgKG1hcC5hZGRyID09IE1BUF9GQUlMRUQpIHsKKyAgICAgICAgICAgICAgICBtYXAuYWRkciA9ICphZGRyID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBlcnIgPSBjMl9tYXBfZXJybm88RUlOVkFMPihlcnJubyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICphZGRyID0gKHVpbnQ4X3QgKiltYXAuYWRkciArIGFsaWdubWVudEJ5dGVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtYXAuYWRkcikgeworICAgICAgICAgICAgbU1hcHBpbmdzLnB1c2hfYmFjayhtYXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgdW5tYXAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUsIEMyRmVuY2UgKmZlbmNlKSB7CisgICAgICAgIGlmIChtTWFwRmQgPCAwIHx8IG1NYXBwaW5ncy5lbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HRCgidHJpZWQgdG8gdW5tYXAgdW5tYXBwZWQgYnVmZmVyIik7CisgICAgICAgICAgICByZXR1cm4gQzJfTk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1NYXBwaW5ncy5iZWdpbigpOyBpdCAhPSBtTWFwcGluZ3MuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGlmIChhZGRyICE9ICh1aW50OF90ICopaXQtPmFkZHIgKyBpdC0+YWxpZ25tZW50Qnl0ZXMgfHwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSArIGl0LT5hbGlnbm1lbnRCeXRlcyAhPSBpdC0+c2l6ZSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGVyciA9IG11bm1hcChpdC0+YWRkciwgaXQtPnNpemUpOworICAgICAgICAgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIm11bm1hcCBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYzJfbWFwX2Vycm5vPEVJTlZBTD4oZXJybm8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZlbmNlKSB7CisgICAgICAgICAgICAgICAgKmZlbmNlID0gQzJGZW5jZSgpOyAvLyBub3QgdXNpbmcgZmVuY2VzCisgICAgICAgICAgICB9CisgICAgICAgICAgICAodm9pZCltTWFwcGluZ3MuZXJhc2UoaXQpOworICAgICAgICAgICAgQUxPR1YoInN1Y2Nlc3NmdWxseSB1bm1hcHBlZDogJWQiLCBtQnVmZmVyKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgfQorICAgICAgICBBTE9HRCgidW5tYXAgZmFpbGVkIHRvIGZpbmQgc3BlY2lmaWVkIG1hcCIpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIH5JbXBsKCkgeworICAgICAgICBpZiAoIW1NYXBwaW5ncy5lbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HRCgiRGFuZ2xpbmcgbWFwcGluZ3MhIik7CisgICAgICAgICAgICBmb3IgKGNvbnN0IE1hcHBpbmcgJm1hcCA6IG1NYXBwaW5ncykgeworICAgICAgICAgICAgICAgICh2b2lkKW11bm1hcChtYXAuYWRkciwgbWFwLnNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtTWFwRmQgPj0gMCkgeworICAgICAgICAgICAgY2xvc2UobU1hcEZkKTsKKyAgICAgICAgICAgIG1NYXBGZCA9IC0xOworICAgICAgICB9CisgICAgICAgIGlmIChtSW5pdCA9PSBDMl9PSykgeworICAgICAgICAgICAgKHZvaWQpaW9uX2ZyZWUobUlvbkZkLCBtQnVmZmVyKTsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoJm1IYW5kbGUpOworICAgICAgICB9CisgICAgICAgIGlmIChtSW9uRmQgPj0gMCkgeworICAgICAgICAgICAgY2xvc2UobUlvbkZkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGMyX3N0YXR1c190IHN0YXR1cygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Jbml0OworICAgIH0KKworICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAmbUhhbmRsZTsKKyAgICB9CisKKyAgICBDMkFsbG9jYXRvcjo6aWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1JZDsKKyAgICB9CisKKyAgICBpb25fdXNlcl9oYW5kbGVfdCBpb25IYW5kbGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQnVmZmVyOworICAgIH0KKworcHJpdmF0ZToKKyAgICBpbnQgbUlvbkZkOworICAgIEMySGFuZGxlSW9uIG1IYW5kbGU7CisgICAgaW9uX3VzZXJfaGFuZGxlX3QgbUJ1ZmZlcjsKKyAgICBDMkFsbG9jYXRvcjo6aWRfdCBtSWQ7CisgICAgYzJfc3RhdHVzX3QgbUluaXQ7CisgICAgaW50IG1NYXBGZDsgLy8gb25seSBvbmUgZm9yIG5vdworICAgIHN0cnVjdCBNYXBwaW5nIHsKKyAgICAgICAgdm9pZCAqYWRkcjsKKyAgICAgICAgc2l6ZV90IGFsaWdubWVudEJ5dGVzOworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICB9OworICAgIHN0ZDo6bGlzdDxNYXBwaW5nPiBtTWFwcGluZ3M7Cit9OworCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRpb25Jb246Om1hcCgKKyAgICBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSAqZmVuY2UsIHZvaWQgKiphZGRyKSB7CisgICAgcmV0dXJuIG1JbXBsLT5tYXAob2Zmc2V0LCBzaXplLCB1c2FnZSwgZmVuY2UsIGFkZHIpOworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRpb25Jb246OnVubWFwKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplLCBDMkZlbmNlICpmZW5jZSkgeworICAgIHJldHVybiBtSW1wbC0+dW5tYXAoYWRkciwgc2l6ZSwgZmVuY2UpOworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRpb25Jb246OnN0YXR1cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPnN0YXR1cygpOworfQorCitDMkFsbG9jYXRvcjo6aWRfdCBDMkFsbG9jYXRpb25Jb246OmdldEFsbG9jYXRvcklkKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0QWxsb2NhdG9ySWQoKTsKK30KKworYm9vbCBDMkFsbG9jYXRpb25Jb246OmVxdWFscyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAmb3RoZXIpIGNvbnN0IHsKKyAgICBpZiAoIW90aGVyIHx8IG90aGVyLT5nZXRBbGxvY2F0b3JJZCgpICE9IGdldEFsbG9jYXRvcklkKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBnZXQgdXNlciBoYW5kbGUgdG8gY29tcGFyZSBvYmplY3RzCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdGlvbklvbj4gb3RoZXJBc0lvbiA9IHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMkFsbG9jYXRpb25Jb24+KG90aGVyKTsKKyAgICByZXR1cm4gbUltcGwtPmlvbkhhbmRsZSgpID09IG90aGVyQXNJb24tPm1JbXBsLT5pb25IYW5kbGUoKTsKK30KKworY29uc3QgQzJIYW5kbGUgKkMyQWxsb2NhdGlvbklvbjo6aGFuZGxlKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+aGFuZGxlKCk7Cit9CisKK0MyQWxsb2NhdGlvbklvbjo6fkMyQWxsb2NhdGlvbklvbigpIHsKKyAgICBkZWxldGUgbUltcGw7Cit9CisKK0MyQWxsb2NhdGlvbklvbjo6QzJBbGxvY2F0aW9uSW9uKGludCBpb25GZCwgc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGhlYXBNYXNrLCB1bnNpZ25lZCBmbGFncywgQzJBbGxvY2F0b3I6OmlkX3QgaWQpCisgICAgOiBDMkxpbmVhckFsbG9jYXRpb24oc2l6ZSksCisgICAgICBtSW1wbChJbXBsOjpBbGxvYyhpb25GZCwgc2l6ZSwgYWxpZ24sIGhlYXBNYXNrLCBmbGFncywgaWQpKSB7IH0KKworQzJBbGxvY2F0aW9uSW9uOjpDMkFsbG9jYXRpb25Jb24oaW50IGlvbkZkLCBzaXplX3Qgc2l6ZSwgaW50IHNoYXJlRmQsIEMyQWxsb2NhdG9yOjppZF90IGlkKQorICAgIDogQzJMaW5lYXJBbGxvY2F0aW9uKHNpemUpLAorICAgICAgbUltcGwoSW1wbDo6SW1wb3J0KGlvbkZkLCBzaXplLCBzaGFyZUZkLCBpZCkpIHsgfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSU9OIEFMTE9DQVRPUiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworQzJBbGxvY2F0b3JJb246OkMyQWxsb2NhdG9ySW9uKGlkX3QgaWQpCisgICAgOiBtSW5pdChDMl9PSyksCisgICAgICBtSW9uRmQoaW9uX29wZW4oKSkgeworICAgIGlmIChtSW9uRmQgPCAwKSB7CisgICAgICAgIHN3aXRjaCAoZXJybm8pIHsKKyAgICAgICAgY2FzZSBFTk9FTlQ6ICAgIG1Jbml0ID0gQzJfT01JVFRFRDsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICBtSW5pdCA9IGMyX21hcF9lcnJubzxFQUNDRVM+KGVycm5vKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBDMk1lbW9yeVVzYWdlIG1pblVzYWdlID0geyAwLCAwIH07CisgICAgICAgIEMyTWVtb3J5VXNhZ2UgbWF4VXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgVHJhaXRzIHRyYWl0cyA9IHsgImFuZHJvaWQuYWxsb2NhdG9yLmlvbiIsIGlkLCBMSU5FQVIsIG1pblVzYWdlLCBtYXhVc2FnZSB9OworICAgICAgICBtVHJhaXRzID0gc3RkOjptYWtlX3NoYXJlZDxUcmFpdHM+KHRyYWl0cyk7CisgICAgICAgIG1CbG9ja1NpemUgPSA6OmdldHBhZ2VzaXplKCk7CisgICAgfQorfQorCitDMkFsbG9jYXRvcklvbjo6fkMyQWxsb2NhdG9ySW9uKCkgeworICAgIGlmIChtSW5pdCA9PSBDMl9PSykgeworICAgICAgICBpb25fY2xvc2UobUlvbkZkKTsKKyAgICB9Cit9CisKK0MyQWxsb2NhdG9yOjppZF90IEMyQWxsb2NhdG9ySW9uOjpnZXRJZCgpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVXNhZ2VNYXBwZXJMb2NrKTsKKyAgICByZXR1cm4gbVRyYWl0cy0+aWQ7Cit9CisKK0MyU3RyaW5nIEMyQWxsb2NhdG9ySW9uOjpnZXROYW1lKCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Vc2FnZU1hcHBlckxvY2spOworICAgIHJldHVybiBtVHJhaXRzLT5uYW1lOworfQorCitzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJBbGxvY2F0b3I6OlRyYWl0cz4gQzJBbGxvY2F0b3JJb246OmdldFRyYWl0cygpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVXNhZ2VNYXBwZXJMb2NrKTsKKyAgICByZXR1cm4gbVRyYWl0czsKK30KKwordm9pZCBDMkFsbG9jYXRvcklvbjo6c2V0VXNhZ2VNYXBwZXIoCisgICAgICAgIGNvbnN0IFVzYWdlTWFwcGVyRm4gJm1hcHBlciwgdWludDY0X3QgbWluVXNhZ2UsIHVpbnQ2NF90IG1heFVzYWdlLCB1aW50NjRfdCBibG9ja1NpemUpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVXNhZ2VNYXBwZXJMb2NrKTsKKyAgICBtVXNhZ2VNYXBwZXJDYWNoZS5jbGVhcigpOworICAgIG1Vc2FnZU1hcHBlckxydS5jbGVhcigpOworICAgIG1Vc2FnZU1hcHBlciA9IG1hcHBlcjsKKyAgICBUcmFpdHMgdHJhaXRzID0geworICAgICAgICBtVHJhaXRzLT5uYW1lLCBtVHJhaXRzLT5pZCwgTElORUFSLAorICAgICAgICBDMk1lbW9yeVVzYWdlKG1pblVzYWdlKSwgQzJNZW1vcnlVc2FnZShtYXhVc2FnZSkKKyAgICB9OworICAgIG1UcmFpdHMgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRyYWl0cz4odHJhaXRzKTsKKyAgICBtQmxvY2tTaXplID0gYmxvY2tTaXplOworfQorCitzdGQ6OnNpemVfdCBDMkFsbG9jYXRvcklvbjo6TWFwcGVyS2V5SGFzaDo6b3BlcmF0b3IoKShjb25zdCBNYXBwZXJLZXkgJmspIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjpoYXNoPHVpbnQ2NF90Pnt9KGsuZmlyc3QpIF4gc3RkOjpoYXNoPHNpemVfdD57fShrLnNlY29uZCk7Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdG9ySW9uOjptYXBVc2FnZSgKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwgc2l6ZV90IGNhcGFjaXR5LCBzaXplX3QgKmFsaWduLCB1bnNpZ25lZCAqaGVhcE1hc2ssIHVuc2lnbmVkICpmbGFncykgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Vc2FnZU1hcHBlckxvY2spOworICAgIGMyX3N0YXR1c190IHJlcyA9IEMyX09LOworICAgIC8vIGFsaWduIGNhcGFjaXR5CisgICAgY2FwYWNpdHkgPSAoY2FwYWNpdHkgKyBtQmxvY2tTaXplIC0gMSkgJiB+KG1CbG9ja1NpemUgLSAxKTsKKyAgICBNYXBwZXJLZXkga2V5ID0gc3RkOjptYWtlX3BhaXIodXNhZ2UuZXhwZWN0ZWQsIGNhcGFjaXR5KTsKKyAgICBhdXRvIGVudHJ5ID0gbVVzYWdlTWFwcGVyQ2FjaGUuZmluZChrZXkpOworICAgIGlmIChlbnRyeSA9PSBtVXNhZ2VNYXBwZXJDYWNoZS5lbmQoKSkgeworICAgICAgICBpZiAobVVzYWdlTWFwcGVyKSB7CisgICAgICAgICAgICByZXMgPSBtVXNhZ2VNYXBwZXIodXNhZ2UsIGNhcGFjaXR5LCBhbGlnbiwgaGVhcE1hc2ssIGZsYWdzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICphbGlnbiA9IDA7IC8vIFRPRE8gbWFrZSB0aGlzIDEKKyAgICAgICAgICAgICpoZWFwTWFzayA9IH4wOyAvLyBkZWZhdWx0IG1hc2sKKyAgICAgICAgICAgICpmbGFncyA9IDA7IC8vIGRlZmF1bHQgZmxhZ3MKKyAgICAgICAgICAgIHJlcyA9IEMyX05PX0lOSVQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gYWRkIHVzYWdlIHRvIGNhY2hlCisgICAgICAgIE1hcHBlclZhbHVlIHZhbHVlID0gc3RkOjptYWtlX3R1cGxlKCphbGlnbiwgKmhlYXBNYXNrLCAqZmxhZ3MsIHJlcyk7CisgICAgICAgIG1Vc2FnZU1hcHBlckxydS5lbXBsYWNlX2Zyb250KGtleSwgdmFsdWUpOworICAgICAgICBtVXNhZ2VNYXBwZXJDYWNoZS5lbXBsYWNlKHN0ZDo6bWFrZV9wYWlyKGtleSwgbVVzYWdlTWFwcGVyTHJ1LmJlZ2luKCkpKTsKKyAgICAgICAgaWYgKG1Vc2FnZU1hcHBlckNhY2hlLnNpemUoKSA+IFVTQUdFX0xSVV9DQUNIRV9TSVpFKSB7CisgICAgICAgICAgICAvLyByZW1vdmUgTFJVIGVudHJ5CisgICAgICAgICAgICBNYXBwZXJLZXkgbHJ1S2V5ID0gbVVzYWdlTWFwcGVyTHJ1LmZyb250KCkuZmlyc3Q7CisgICAgICAgICAgICBtVXNhZ2VNYXBwZXJDYWNoZS5lcmFzZShscnVLZXkpOworICAgICAgICAgICAgbVVzYWdlTWFwcGVyTHJ1LnBvcF9iYWNrKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBtb3ZlIGVudHJ5IHRvIE1SVQorICAgICAgICBtVXNhZ2VNYXBwZXJMcnUuc3BsaWNlKG1Vc2FnZU1hcHBlckxydS5iZWdpbigpLCBtVXNhZ2VNYXBwZXJMcnUsIGVudHJ5LT5zZWNvbmQpOworICAgICAgICBjb25zdCBNYXBwZXJWYWx1ZSAmdmFsdWUgPSBlbnRyeS0+c2Vjb25kLT5zZWNvbmQ7CisgICAgICAgIHN0ZDo6dGllKCphbGlnbiwgKmhlYXBNYXNrLCAqZmxhZ3MsIHJlcykgPSB2YWx1ZTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0b3JJb246Om5ld0xpbmVhckFsbG9jYXRpb24oCisgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LCBDMk1lbW9yeVVzYWdlIHVzYWdlLCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgeworICAgIGlmIChhbGxvY2F0aW9uID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICBhbGxvY2F0aW9uLT5yZXNldCgpOworICAgIGlmIChtSW5pdCAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgfQorCisgICAgc2l6ZV90IGFsaWduID0gMDsKKyAgICB1bnNpZ25lZCBoZWFwTWFzayA9IH4wOworICAgIHVuc2lnbmVkIGZsYWdzID0gMDsKKyAgICBjMl9zdGF0dXNfdCByZXQgPSBtYXBVc2FnZSh1c2FnZSwgY2FwYWNpdHksICZhbGlnbiwgJmhlYXBNYXNrLCAmZmxhZ3MpOworICAgIGlmIChyZXQgJiYgcmV0ICE9IEMyX05PX0lOSVQpIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0aW9uSW9uPiBhbGxvYworICAgICAgICA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJBbGxvY2F0aW9uSW9uPihkdXAobUlvbkZkKSwgY2FwYWNpdHksIGFsaWduLCBoZWFwTWFzaywgZmxhZ3MsIG1UcmFpdHMtPmlkKTsKKyAgICByZXQgPSBhbGxvYy0+c3RhdHVzKCk7CisgICAgaWYgKHJldCA9PSBDMl9PSykgeworICAgICAgICAqYWxsb2NhdGlvbiA9IGFsbG9jOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRvcklvbjo6cHJpb3JMaW5lYXJBbGxvY2F0aW9uKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgeworICAgICphbGxvY2F0aW9uID0gbnVsbHB0cjsKKyAgICBpZiAobUluaXQgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0OworICAgIH0KKworICAgIGlmICghQzJIYW5kbGVJb246OmlzVmFsaWQoaGFuZGxlKSkgeworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIFRPRE86IGdldCBjYXBhY2l0eSBhbmQgdmFsaWRhdGUgaXQKKyAgICBjb25zdCBDMkhhbmRsZUlvbiAqaCA9IHN0YXRpY19jYXN0PGNvbnN0IEMySGFuZGxlSW9uKj4oaGFuZGxlKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0aW9uSW9uPiBhbGxvYworICAgICAgICA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJBbGxvY2F0aW9uSW9uPihkdXAobUlvbkZkKSwgaC0+c2l6ZSgpLCBoLT5idWZmZXJGZCgpLCBtVHJhaXRzLT5pZCk7CisgICAgYzJfc3RhdHVzX3QgcmV0ID0gYWxsb2MtPnN0YXR1cygpOworICAgIGlmIChyZXQgPT0gQzJfT0spIHsKKyAgICAgICAgKmFsbG9jYXRpb24gPSBhbGxvYzsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QqPigKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCo+KGhhbmRsZSkpKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYm9vbCBDMkFsbG9jYXRvcklvbjo6aXNWYWxpZChjb25zdCBDMkhhbmRsZSogY29uc3QgbykgeworICAgIHJldHVybiBDMkhhbmRsZUlvbjo6aXNWYWxpZChvKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9DMkJ1ZmZlci5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEwYjUzNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL0MyQnVmZmVyLmNwcApAQCAtMCwwICsxLDEzMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyQnVmZmVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bXV0ZXg+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvcklvbi5oPgorI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgorI2luY2x1ZGUgPEMyQnVmZmVyUHJpdi5oPgorI2luY2x1ZGUgPEMyQmxvY2tJbnRlcm5hbC5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oPgorCituYW1lc3BhY2UgeworCit1c2luZyBhbmRyb2lkOjpDMkFsbG9jYXRvckdyYWxsb2M7Cit1c2luZyBhbmRyb2lkOjpDMkFsbG9jYXRvcklvbjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6QnVmZmVyUG9vbERhdGE7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkJ1ZmZlclBvb2xBbGxvY2F0aW9uOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6QnVmZmVyUG9vbEFsbG9jYXRvcjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkNsaWVudE1hbmFnZXI7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpDb25uZWN0aW9uSWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpJTlZBTElEX0NPTk5FQ1RJT05JRDsKKworLy8gVGhpcyBhbm9ueW1vdXMgbmFtZXNwYWNlIGNvbnRhaW5zIHRoZSBoZWxwZXIgY2xhc3NlcyB0aGF0IGFsbG93IG91ciBpbXBsZW1lbnRhdGlvbiB0byBjcmVhdGUKKy8vIGJsb2NrL2J1ZmZlciBvYmplY3RzLgorLy8KKy8vIEluaGVyaXQgZnJvbSB0aGUgcGFyZW50LCBzaGFyZSB3aXRoIHRoZSBmcmllbmQuCitjbGFzcyBSZWFkVmlld0J1ZGR5IDogcHVibGljIEMyUmVhZFZpZXcgeworICAgIHVzaW5nIEMyUmVhZFZpZXc6OkMyUmVhZFZpZXc7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJDb25zdExpbmVhckJsb2NrOworfTsKKworY2xhc3MgV3JpdGVWaWV3QnVkZHkgOiBwdWJsaWMgQzJXcml0ZVZpZXcgeworICAgIHVzaW5nIEMyV3JpdGVWaWV3OjpDMldyaXRlVmlldzsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkxpbmVhckJsb2NrOworfTsKKworY2xhc3MgQ29uc3RMaW5lYXJCbG9ja0J1ZGR5IDogcHVibGljIEMyQ29uc3RMaW5lYXJCbG9jayB7CisgICAgdXNpbmcgQzJDb25zdExpbmVhckJsb2NrOjpDMkNvbnN0TGluZWFyQmxvY2s7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJMaW5lYXJCbG9jazsKK307CisKK2NsYXNzIExpbmVhckJsb2NrQnVkZHkgOiBwdWJsaWMgQzJMaW5lYXJCbG9jayB7CisgICAgdXNpbmcgQzJMaW5lYXJCbG9jazo6QzJMaW5lYXJCbG9jazsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkJhc2ljTGluZWFyQmxvY2tQb29sOworfTsKKworY2xhc3MgQWNxdWlyYWJsZVJlYWRWaWV3QnVkZHkgOiBwdWJsaWMgQzJBY3F1aXJhYmxlPEMyUmVhZFZpZXc+IHsKKyAgICB1c2luZyBDMkFjcXVpcmFibGU6OkMyQWNxdWlyYWJsZTsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkNvbnN0TGluZWFyQmxvY2s7Cit9OworCitjbGFzcyBBY3F1aXJhYmxlV3JpdGVWaWV3QnVkZHkgOiBwdWJsaWMgQzJBY3F1aXJhYmxlPEMyV3JpdGVWaWV3PiB7CisgICAgdXNpbmcgQzJBY3F1aXJhYmxlOjpDMkFjcXVpcmFibGU7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJMaW5lYXJCbG9jazsKK307CisKK2NsYXNzIEdyYXBoaWNWaWV3QnVkZHkgOiBwdWJsaWMgQzJHcmFwaGljVmlldyB7CisgICAgdXNpbmcgQzJHcmFwaGljVmlldzo6QzJHcmFwaGljVmlldzsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkNvbnN0R3JhcGhpY0Jsb2NrOworICAgIGZyaWVuZCBjbGFzcyA6OkMyR3JhcGhpY0Jsb2NrOworfTsKKworY2xhc3MgQWNxdWlyYWJsZUNvbnN0R3JhcGhpY1ZpZXdCdWRkeSA6IHB1YmxpYyBDMkFjcXVpcmFibGU8Y29uc3QgQzJHcmFwaGljVmlldz4geworICAgIHVzaW5nIEMyQWNxdWlyYWJsZTo6QzJBY3F1aXJhYmxlOworICAgIGZyaWVuZCBjbGFzcyA6OkMyQ29uc3RHcmFwaGljQmxvY2s7Cit9OworCitjbGFzcyBBY3F1aXJhYmxlR3JhcGhpY1ZpZXdCdWRkeSA6IHB1YmxpYyBDMkFjcXVpcmFibGU8QzJHcmFwaGljVmlldz4geworICAgIHVzaW5nIEMyQWNxdWlyYWJsZTo6QzJBY3F1aXJhYmxlOworICAgIGZyaWVuZCBjbGFzcyA6OkMyR3JhcGhpY0Jsb2NrOworfTsKKworY2xhc3MgQ29uc3RHcmFwaGljQmxvY2tCdWRkeSA6IHB1YmxpYyBDMkNvbnN0R3JhcGhpY0Jsb2NrIHsKKyAgICB1c2luZyBDMkNvbnN0R3JhcGhpY0Jsb2NrOjpDMkNvbnN0R3JhcGhpY0Jsb2NrOworICAgIGZyaWVuZCBjbGFzcyA6OkMyR3JhcGhpY0Jsb2NrOworfTsKKworY2xhc3MgR3JhcGhpY0Jsb2NrQnVkZHkgOiBwdWJsaWMgQzJHcmFwaGljQmxvY2sgeworICAgIHVzaW5nIEMyR3JhcGhpY0Jsb2NrOjpDMkdyYXBoaWNCbG9jazsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkJhc2ljR3JhcGhpY0Jsb2NrUG9vbDsKK307CisKK2NsYXNzIEJ1ZmZlckRhdGFCdWRkeSA6IHB1YmxpYyBDMkJ1ZmZlckRhdGEgeworICAgIHVzaW5nIEMyQnVmZmVyRGF0YTo6QzJCdWZmZXJEYXRhOworICAgIGZyaWVuZCBjbGFzcyA6OkMyQnVmZmVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAxRCBCTE9DSyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGFsbCAxRCBibG9jayBhbmQgdmlldyBpbXBsZW1lbnRhdGlvbnMuCisgKgorICogVGhpcyBpcyBiYXNpY2FsbHkganVzdCBhIHBsYWNlaG9sZGVyIGZvciB0aGUgdW5kZXJseWluZyAxRCBhbGxvY2F0aW9uIGFuZCB0aGUgcmFuZ2Ugb2YgdGhlCisgKiBhbGxvdGVkIHBvcnRpb24gdG8gdGhpcyBibG9jay4gVGhlcmUgaXMgYWxzbyBhIHBsYWNlaG9sZGVyIGZvciBhIGJsb2NrcG9vbCBkYXRhLgorICovCitjbGFzcyBDMl9ISURFIF9DMkJsb2NrMURJbXBsIDogcHVibGljIF9DMkxpbmVhclJhbmdlQXNwZWN0IHsKK3B1YmxpYzoKKyAgICBfQzJCbG9jazFESW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gJnBvb2xEYXRhID0gbnVsbHB0ciwKKyAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSAwLCBzaXplX3Qgc2l6ZSA9IH4oc2l6ZV90KTApCisgICAgICAgIDogX0MyTGluZWFyUmFuZ2VBc3BlY3QoYWxsb2MuZ2V0KCksIG9mZnNldCwgc2l6ZSksCisgICAgICAgICAgbUFsbG9jYXRpb24oYWxsb2MpLAorICAgICAgICAgIG1Qb29sRGF0YShwb29sRGF0YSkgeyB9CisKKyAgICBfQzJCbG9jazFESW1wbChjb25zdCBfQzJCbG9jazFESW1wbCAmb3RoZXIsIHNpemVfdCBvZmZzZXQgPSAwLCBzaXplX3Qgc2l6ZSA9IH4oc2l6ZV90KTApCisgICAgICAgIDogX0MyTGluZWFyUmFuZ2VBc3BlY3QoJm90aGVyLCBvZmZzZXQsIHNpemUpLAorICAgICAgICAgIG1BbGxvY2F0aW9uKG90aGVyLm1BbGxvY2F0aW9uKSwKKyAgICAgICAgICBtUG9vbERhdGEob3RoZXIubVBvb2xEYXRhKSB7IH0KKworICAgIC8qKiByZXR1cm5zIHBvb2wgZGF0YSAgKi8KKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gcG9vbERhdGEoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUG9vbERhdGE7CisgICAgfQorCisgICAgLyoqIHJldHVybnMgbmF0aXZlIGhhbmRsZSAqLworICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdGlvbiA/IG1BbGxvY2F0aW9uLT5oYW5kbGUoKSA6IG51bGxwdHI7CisgICAgfQorCisgICAgLyoqIHJldHVybnMgdGhlIGFsbG9jYXRvcidzIElEICovCisgICAgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCB7CisgICAgICAgIC8vIEJBRF9JRCBjYW4gb25seSBoYXBwZW4gaWYgdGhpcyBJbXBsIGNsYXNzIGlzIGluaXRpYWxpemVkIGZvciBhIHZpZXcgLSBuZXZlciBmb3IgYSBibG9jay4KKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uID8gbUFsbG9jYXRpb24tPmdldEFsbG9jYXRvcklkKCkgOiBDMkFsbG9jYXRvcjo6QkFEX0lEOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+IGdldEFsbG9jYXRpb24oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdGlvbjsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gbUFsbG9jYXRpb247CisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IG1Qb29sRGF0YTsKK307CisKKy8qKgorICogVGhpcyBjbGFzcyBjb250YWlucyB0aGUgbWFwcGVkIGRhdGEgcG9pbnRlciwgYW5kIHRoZSBwb3RlbnRpYWwgZXJyb3IuCisgKgorICogcmFuZ2UgaXMgdGhlIG1hcHBlZCByYW5nZSBvZiB0aGUgdW5kZXJseWluZyBhbGxvY2F0aW9uICh3aGljaCBpcyBwYXJ0IG9mIHRoZSBhbGxvdHRlZAorICogcmFuZ2UpLgorICovCitjbGFzcyBDMl9ISURFIF9DMk1hcHBlZEJsb2NrMURJbXBsIDogcHVibGljIF9DMkJsb2NrMURJbXBsIHsKK3B1YmxpYzoKKyAgICBfQzJNYXBwZWRCbG9jazFESW1wbChjb25zdCBfQzJCbG9jazFESW1wbCAmYmxvY2ssIHVpbnQ4X3QgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG9mZnNldCA9IDAsIHNpemVfdCBzaXplID0gfihzaXplX3QpMCkKKyAgICAgICAgOiBfQzJCbG9jazFESW1wbChibG9jaywgb2Zmc2V0LCBzaXplKSwgbURhdGEoZGF0YSksIG1FcnJvcihDMl9PSykgeyB9CisKKyAgICBfQzJNYXBwZWRCbG9jazFESW1wbChjMl9zdGF0dXNfdCBlcnJvcikKKyAgICAgICAgOiBfQzJCbG9jazFESW1wbChudWxscHRyKSwgbURhdGEobnVsbHB0ciksIG1FcnJvcihlcnJvcikgeworICAgICAgICAvLyBDSEVDSyhlcnJvciAhPSBDMl9PSyk7CisgICAgfQorCisgICAgY29uc3QgdWludDhfdCAqZGF0YSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1EYXRhOworICAgIH0KKworICAgIHVpbnQ4X3QgKmRhdGEoKSB7CisgICAgICAgIHJldHVybiBtRGF0YTsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBlcnJvcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1FcnJvcjsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdWludDhfdCAqbURhdGE7CisgICAgYzJfc3RhdHVzX3QgbUVycm9yOworfTsKKworLyoqCisgKiBCbG9jayBpbXBsZW1lbnRhdGlvbi4KKyAqLworY2xhc3MgQzJCbG9jazFEOjpJbXBsIDogcHVibGljIF9DMkJsb2NrMURJbXBsIHsKKyAgICB1c2luZyBfQzJCbG9jazFESW1wbDo6X0MyQmxvY2sxREltcGw7Cit9OworCitjb25zdCBDMkhhbmRsZSAqQzJCbG9jazFEOjpoYW5kbGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5oYW5kbGUoKTsKK307CisKK0MyQWxsb2NhdG9yOjppZF90IEMyQmxvY2sxRDo6Z2V0QWxsb2NhdG9ySWQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRBbGxvY2F0b3JJZCgpOworfTsKKworQzJCbG9jazFEOjpDMkJsb2NrMUQoc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMkxpbmVhclJhbmdlQXNwZWN0ICZyYW5nZSkKKyAgICAvLyBhbHdheXMgY2xhbXAgc3VicmFuZ2UgdG8gcGFyZW50IChpbXBsKSByYW5nZSBmb3Igc2FmZXR5CisgICAgOiBfQzJMaW5lYXJSYW5nZUFzcGVjdChpbXBsLmdldCgpLCByYW5nZS5vZmZzZXQoKSwgcmFuZ2Uuc2l6ZSgpKSwgbUltcGwoaW1wbCkgeworfQorCisvKioKKyAqIFJlYWQgdmlldyBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiByYW5nZSBvZiBJbXBsIGlzIHRoZSBtYXBwZWQgcmFuZ2Ugb2YgdGhlIHVuZGVybHlpbmcgYWxsb2NhdGlvbiAod2hpY2ggaXMgcGFydCBvZiB0aGUgYWxsb3R0ZWQKKyAqIHJhbmdlKS4gcmFuZ2Ugb2YgVmlldyBpcyAwIHRvIGNhcGFjaXR5KCkgKG5vdCByZXByZXNlbnRlZCBhcyBhbiBhY3R1YWwgcmFuZ2UpLiBUaGlzIG1hcHMgdG8gYQorICogc3VicmFuZ2Ugb2YgSW1wbCByYW5nZSBzdGFydGluZyBhdCBtSW1wbC0+b2Zmc2V0KCkgKyBfbU9mZnNldC4KKyAqLworY2xhc3MgQzJSZWFkVmlldzo6SW1wbCA6IHB1YmxpYyBfQzJNYXBwZWRCbG9jazFESW1wbCB7CisgICAgdXNpbmcgX0MyTWFwcGVkQmxvY2sxREltcGw6Ol9DMk1hcHBlZEJsb2NrMURJbXBsOworfTsKKworQzJSZWFkVmlldzo6QzJSZWFkVmlldyhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBzaXplKQorICAgIDogX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QoQzJMaW5lYXJDYXBhY2l0eShpbXBsLT5zaXplKCkpLnJhbmdlKG9mZnNldCwgc2l6ZSkuc2l6ZSgpKSwKKyAgICAgIG1JbXBsKGltcGwpLAorICAgICAgbU9mZnNldChDMkxpbmVhckNhcGFjaXR5KGltcGwtPnNpemUoKSkucmFuZ2Uob2Zmc2V0LCBzaXplKS5vZmZzZXQoKSkgeyB9CisKK0MyUmVhZFZpZXc6OkMyUmVhZFZpZXcoYzJfc3RhdHVzX3QgZXJyb3IpCisgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCgwdSksIG1JbXBsKHN0ZDo6bWFrZV9zaGFyZWQ8SW1wbD4oZXJyb3IpKSwgbU9mZnNldCgwdSkgeworICAgIC8vIENIRUNLKGVycm9yICE9IEMyX09LKTsKK30KKworY29uc3QgdWludDhfdCAqQzJSZWFkVmlldzo6ZGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmVycm9yKCkgPyBudWxscHRyIDogbUltcGwtPmRhdGEoKSArIG1PZmZzZXQ7Cit9CisKK2MyX3N0YXR1c190IEMyUmVhZFZpZXc6OmVycm9yKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+ZXJyb3IoKTsKK30KKworQzJSZWFkVmlldyBDMlJlYWRWaWV3OjpzdWJWaWV3KHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBjb25zdCB7CisgICAgQzJMaW5lYXJSYW5nZSBzdWJSYW5nZSgqdGhpcywgb2Zmc2V0LCBzaXplKTsKKyAgICByZXR1cm4gQzJSZWFkVmlldyhtSW1wbCwgbU9mZnNldCArIHN1YlJhbmdlLm9mZnNldCgpLCBzdWJSYW5nZS5zaXplKCkpOworfQorCisvKioKKyAqIFdyaXRlIHZpZXcgaW1wbGVtZW50YXRpb24uCisgKi8KK2NsYXNzIEMyV3JpdGVWaWV3OjpJbXBsIDogcHVibGljIF9DMk1hcHBlZEJsb2NrMURJbXBsIHsKKyAgICB1c2luZyBfQzJNYXBwZWRCbG9jazFESW1wbDo6X0MyTWFwcGVkQmxvY2sxREltcGw7Cit9OworCitDMldyaXRlVmlldzo6QzJXcml0ZVZpZXcoc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwpCisvLyBVR0xZOiBfQzJMaW5lYXJSYW5nZUFzcGVjdCByZXF1aXJlcyBhIGJvbmEtZmlkZSBvYmplY3QgZm9yIGNhcGFjaXR5IHRvIHByZXZlbnQgc3Bvb2ZpbmcsIHNvCisvLyB0aGlzIGlzIHdoYXQgd2UgaGF2ZSB0byBkby4KKy8vIFRPRE86IHVzZSBjaGlsZFJhbmdlCisgICAgOiBfQzJFZGl0YWJsZUxpbmVhclJhbmdlQXNwZWN0KHN0ZDo6bWFrZV91bmlxdWU8QzJMaW5lYXJDYXBhY2l0eT4oaW1wbC0+c2l6ZSgpKS5nZXQoKSksIG1JbXBsKGltcGwpIHsgfQorCitDMldyaXRlVmlldzo6QzJXcml0ZVZpZXcoYzJfc3RhdHVzX3QgZXJyb3IpCisgICAgOiBfQzJFZGl0YWJsZUxpbmVhclJhbmdlQXNwZWN0KG51bGxwdHIpLCBtSW1wbChzdGQ6Om1ha2Vfc2hhcmVkPEltcGw+KGVycm9yKSkge30KKwordWludDhfdCAqQzJXcml0ZVZpZXc6OmJhc2UoKSB7IHJldHVybiBtSW1wbC0+ZGF0YSgpOyB9CisKK3VpbnQ4X3QgKkMyV3JpdGVWaWV3OjpkYXRhKCkgeyByZXR1cm4gbUltcGwtPmRhdGEoKSArIG9mZnNldCgpOyB9CisKK2MyX3N0YXR1c190IEMyV3JpdGVWaWV3OjplcnJvcigpIGNvbnN0IHsgcmV0dXJuIG1JbXBsLT5lcnJvcigpOyB9CisKKy8qKgorICogQ29uc3QgbGluZWFyIGJsb2NrIGltcGxlbWVudGF0aW9uLgorICovCitDMkNvbnN0TGluZWFyQmxvY2s6OkMyQ29uc3RMaW5lYXJCbG9jayhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyTGluZWFyUmFuZ2VBc3BlY3QgJnJhbmdlLCBDMkZlbmNlIGZlbmNlKQorICAgIDogQzJCbG9jazFEKGltcGwsIHJhbmdlKSwgbUZlbmNlKGZlbmNlKSB7IH0KKworQzJBY3F1aXJhYmxlPEMyUmVhZFZpZXc+IEMyQ29uc3RMaW5lYXJCbG9jazo6bWFwKCkgY29uc3QgeworICAgIHZvaWQgKmJhc2UgPSBudWxscHRyOworICAgIHVpbnQzMl90IGxlbiA9IHNpemUoKTsKKyAgICBjMl9zdGF0dXNfdCBlcnJvciA9IG1JbXBsLT5nZXRBbGxvY2F0aW9uKCktPm1hcCgKKyAgICAgICAgICAgIG9mZnNldCgpLCBsZW4sIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIDAgfSwgbnVsbHB0ciwgJmJhc2UpOworICAgIC8vIFRPRE86IHdhaXQgb24gZmVuY2UKKyAgICBpZiAoZXJyb3IgPT0gQzJfT0spIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlYWRWaWV3QnVkZHk6OkltcGw+IHJ2aSA9IHN0ZDo6c2hhcmVkX3B0cjxSZWFkVmlld0J1ZGR5OjpJbXBsPigKKyAgICAgICAgICAgICAgICBuZXcgUmVhZFZpZXdCdWRkeTo6SW1wbCgqbUltcGwsICh1aW50OF90ICopYmFzZSwgb2Zmc2V0KCksIGxlbiksCisgICAgICAgICAgICAgICAgW2Jhc2UsIGxlbl0oUmVhZFZpZXdCdWRkeTo6SW1wbCAqaSkgeworICAgICAgICAgICAgICAgICAgICAodm9pZClpLT5nZXRBbGxvY2F0aW9uKCktPnVubWFwKGJhc2UsIGxlbiwgbnVsbHB0cik7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpOworICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIEFjcXVpcmFibGVSZWFkVmlld0J1ZGR5KGVycm9yLCBDMkZlbmNlKCksIFJlYWRWaWV3QnVkZHkocnZpLCAwLCBsZW4pKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQWNxdWlyYWJsZVJlYWRWaWV3QnVkZHkoZXJyb3IsIEMyRmVuY2UoKSwgUmVhZFZpZXdCdWRkeShlcnJvcikpOworICAgIH0KK30KKworQzJDb25zdExpbmVhckJsb2NrIEMyQ29uc3RMaW5lYXJCbG9jazo6c3ViQmxvY2soc2l6ZV90IG9mZnNldF8sIHNpemVfdCBzaXplXykgY29uc3QgeworICAgIEMyTGluZWFyUmFuZ2Ugc3ViUmFuZ2UoKm1JbXBsLCBvZmZzZXRfLCBzaXplXyk7CisgICAgcmV0dXJuIEMyQ29uc3RMaW5lYXJCbG9jayhtSW1wbCwgc3ViUmFuZ2UsIG1GZW5jZSk7Cit9CisKKy8qKgorICogTGluZWFyIGJsb2NrIGltcGxlbWVudGF0aW9uLgorICovCitDMkxpbmVhckJsb2NrOjpDMkxpbmVhckJsb2NrKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCBjb25zdCBfQzJMaW5lYXJSYW5nZUFzcGVjdCAmcmFuZ2UpCisgICAgOiBDMkJsb2NrMUQoaW1wbCwgcmFuZ2UpIHsgfQorCitDMkFjcXVpcmFibGU8QzJXcml0ZVZpZXc+IEMyTGluZWFyQmxvY2s6Om1hcCgpIHsKKyAgICB2b2lkICpiYXNlID0gbnVsbHB0cjsKKyAgICB1aW50MzJfdCBsZW4gPSBzaXplKCk7CisgICAgYzJfc3RhdHVzX3QgZXJyb3IgPSBtSW1wbC0+Z2V0QWxsb2NhdGlvbigpLT5tYXAoCisgICAgICAgICAgICBvZmZzZXQoKSwgbGVuLCB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwgbnVsbHB0ciwgJmJhc2UpOworICAgIC8vIFRPRE86IHdhaXQgb24gZmVuY2UKKyAgICBpZiAoZXJyb3IgPT0gQzJfT0spIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFdyaXRlVmlld0J1ZGR5OjpJbXBsPiBydmkgPSBzdGQ6OnNoYXJlZF9wdHI8V3JpdGVWaWV3QnVkZHk6OkltcGw+KAorICAgICAgICAgICAgICAgIG5ldyBXcml0ZVZpZXdCdWRkeTo6SW1wbCgqbUltcGwsICh1aW50OF90ICopYmFzZSwgMCwgbGVuKSwKKyAgICAgICAgICAgICAgICBbYmFzZSwgbGVuXShXcml0ZVZpZXdCdWRkeTo6SW1wbCAqaSkgeworICAgICAgICAgICAgICAgICAgICAodm9pZClpLT5nZXRBbGxvY2F0aW9uKCktPnVubWFwKGJhc2UsIGxlbiwgbnVsbHB0cik7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpOworICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIEFjcXVpcmFibGVXcml0ZVZpZXdCdWRkeShlcnJvciwgQzJGZW5jZSgpLCBXcml0ZVZpZXdCdWRkeShydmkpKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQWNxdWlyYWJsZVdyaXRlVmlld0J1ZGR5KGVycm9yLCBDMkZlbmNlKCksIFdyaXRlVmlld0J1ZGR5KGVycm9yKSk7CisgICAgfQorfQorCitDMkNvbnN0TGluZWFyQmxvY2sgQzJMaW5lYXJCbG9jazo6c2hhcmUoc2l6ZV90IG9mZnNldF8sIHNpemVfdCBzaXplXywgQzJGZW5jZSBmZW5jZSkgeworICAgIHJldHVybiBDb25zdExpbmVhckJsb2NrQnVkZHkobUltcGwsIEMyTGluZWFyUmFuZ2UoKnRoaXMsIG9mZnNldF8sIHNpemVfKSwgZmVuY2UpOworfQorCitDMkJhc2ljTGluZWFyQmxvY2tQb29sOjpDMkJhc2ljTGluZWFyQmxvY2tQb29sKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IpCisgIDogbUFsbG9jYXRvcihhbGxvY2F0b3IpIHsgfQorCitjMl9zdGF0dXNfdCBDMkJhc2ljTGluZWFyQmxvY2tQb29sOjpmZXRjaExpbmVhckJsb2NrKAorICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSB7CisgICAgYmxvY2stPnJlc2V0KCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQWxsb2NhdG9yLT5uZXdMaW5lYXJBbGxvY2F0aW9uKGNhcGFjaXR5LCB1c2FnZSwgJmFsbG9jKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgKmJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVMaW5lYXJCbG9jayhhbGxvYyk7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0cnVjdCBDMl9ISURFIEMyUG9vbGVkQmxvY2tQb29sRGF0YSA6IF9DMkJsb2NrUG9vbERhdGEgeworCisgICAgdmlydHVhbCB0eXBlX3QgZ2V0VHlwZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIFRZUEVfQlVGRkVSUE9PTDsKKyAgICB9CisKKyAgICB2b2lkIGdldEJ1ZmZlclBvb2xEYXRhKHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmRhdGEpIGNvbnN0IHsKKyAgICAgICAgKmRhdGEgPSBtRGF0YTsKKyAgICB9CisKKyAgICBDMlBvb2xlZEJsb2NrUG9vbERhdGEoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmZGF0YSkgOiBtRGF0YShkYXRhKSB7fQorCisgICAgdmlydHVhbCB+QzJQb29sZWRCbG9ja1Bvb2xEYXRhKCkgb3ZlcnJpZGUge30KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IG1EYXRhOworfTsKKworYm9vbCBfQzJCbG9ja0ZhY3Rvcnk6OkdldEJ1ZmZlclBvb2xEYXRhKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgX0MyQmxvY2tQb29sRGF0YT4gJmRhdGEsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlclBvb2xEYXRhKSB7CisgICAgaWYgKGRhdGEgJiYgZGF0YS0+Z2V0VHlwZSgpID09IF9DMkJsb2NrUG9vbERhdGE6OlRZUEVfQlVGRkVSUE9PTCkgeworICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJQb29sZWRCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PGNvbnN0IEMyUG9vbGVkQmxvY2tQb29sRGF0YT4oZGF0YSk7CisgICAgICAgIHBvb2xEYXRhLT5nZXRCdWZmZXJQb29sRGF0YShidWZmZXJQb29sRGF0YSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUxpbmVhckJsb2NrKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiAmZGF0YSwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9jazFEOjpJbXBsPiBpbXBsID0KKyAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMkJsb2NrMUQ6OkltcGw+KGFsbG9jLCBkYXRhLCBvZmZzZXQsIHNpemUpOworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4obmV3IEMyTGluZWFyQmxvY2soaW1wbCwgKmltcGwpKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IF9DMkJsb2NrRmFjdG9yeTo6R2V0TGluZWFyQmxvY2tQb29sRGF0YSgKKyAgICAgICAgY29uc3QgQzJCbG9jazFEICZibG9jaykgeworICAgIGlmIChibG9jay5tSW1wbCkgeworICAgICAgICByZXR1cm4gYmxvY2subUltcGwtPnBvb2xEYXRhKCk7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVMaW5lYXJCbG9jaygKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSkgeworICAgIC8vIFRPRE86IGdldCBwcm9wZXIgYWxsb2NhdG9yPyBhbmQgbXV0ZXg/CisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMkFsbG9jYXRvcklvbj4gc0FsbG9jYXRvciA9IHN0ZDo6bWFrZV91bmlxdWU8QzJBbGxvY2F0b3JJb24+KDApOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgaWYgKEMyQWxsb2NhdG9ySW9uOjppc1ZhbGlkKGhhbmRsZSkpIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gc0FsbG9jYXRvci0+cHJpb3JMaW5lYXJBbGxvY2F0aW9uKGhhbmRsZSwgJmFsbG9jKTsKKyAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVMaW5lYXJCbG9jayhhbGxvYyk7CisgICAgICAgICAgICByZXR1cm4gYmxvY2s7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUxpbmVhckJsb2NrKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqY0hhbmRsZSwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmZGF0YSkgeworICAgIC8vIFRPRE86IGdldCBwcm9wZXIgYWxsb2NhdG9yPyBhbmQgbXV0ZXg/CisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMkFsbG9jYXRvcklvbj4gc0FsbG9jYXRvciA9IHN0ZDo6bWFrZV91bmlxdWU8QzJBbGxvY2F0b3JJb24+KDApOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgaWYgKEMyQWxsb2NhdG9ySW9uOjppc1ZhbGlkKGNIYW5kbGUpKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jbG9uZShjSGFuZGxlKTsKKyAgICAgICAgaWYgKGhhbmRsZSkgeworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gc0FsbG9jYXRvci0+cHJpb3JMaW5lYXJBbGxvY2F0aW9uKGhhbmRsZSwgJmFsbG9jKTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBvb2xlZEJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbERhdGE+KGRhdGEpOworICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSyAmJiBwb29sRGF0YSkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IGNvbmZpZyBwYXJhbXM/CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrID0KKyAgICAgICAgICAgICAgICAgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlTGluZWFyQmxvY2soYWxsb2MsIHBvb2xEYXRhKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYmxvY2s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9OworCisvKioKKyAqIFdyYXBwZWQgQzJBbGxvY2F0b3Igd2hpY2ggaXMgaW5qZWN0ZWQgdG8gYnVmZmVyIHBvb2wgb24gYmVoYWxmIG9mCisgKiBDMkJsb2NrUG9vbC4KKyAqLworY2xhc3MgX0MyQnVmZmVyUG9vbEFsbG9jYXRvciA6IHB1YmxpYyBCdWZmZXJQb29sQWxsb2NhdG9yIHsKK3B1YmxpYzoKKyAgICBfQzJCdWZmZXJQb29sQWxsb2NhdG9yKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jYXRvcikKKyAgICAgICAgOiBtQWxsb2NhdG9yKGFsbG9jYXRvcikge30KKworICAgIH5fQzJCdWZmZXJQb29sQWxsb2NhdG9yKCkgb3ZlcnJpZGUge30KKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICphbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICphbGxvY1NpemUpIG92ZXJyaWRlOworCisgICAgYm9vbCBjb21wYXRpYmxlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZuZXdQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZvbGRQYXJhbXMpIG92ZXJyaWRlOworCisgICAgLy8gTWV0aG9kcyBmb3IgY29kZWMyIGNvbXBvbmVudCAoQzJCbG9ja1Bvb2wpLgorICAgIC8qKgorICAgICAqIFRyYW5zZm9ybXMgbGluZWFyIGFsbG9jYXRpb24gcGFyYW1ldGVycyBmb3IgQzJBbGxvY2F0b3IgdG8gcGFyYW1ldGVycworICAgICAqIGZvciBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYXBhY2l0eSAgICAgIHNpemUgb2YgbGluZWFyIGFsbG9jYXRpb24KKyAgICAgKiBAcGFyYW0gdXNhZ2UgICAgICAgICBtZW1vcnkgdXNhZ2UgcGF0dGVybiBmb3IgbGluZWFyIGFsbG9jYXRpb24KKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgICAgICBhbGxvY2F0aW9uIHBhcmFtZXRlcnMgZm9yIGJ1ZmZlciBwb29sCisgICAgICovCisgICAgdm9pZCBnZXRMaW5lYXJQYXJhbXModWludDMyX3QgY2FwYWNpdHksIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gKnBhcmFtcyk7CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2Zvcm1zIGdyYXBoaWMgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzIGZvciBDMkFsbG9jYXRvciB0byBwYXJhbWV0ZXJzCisgICAgICogZm9yIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIHdpZHRoICAgICAgICAgd2lkdGggb2YgZ3JhcGhpYyBhbGxvY2F0aW9uCisgICAgICogQHBhcmFtIGhlaWdodCAgICAgICAgaGVpZ2h0IG9mIGdyYXBoaWMgYWxsb2NhdGlvbgorICAgICAqIEBwYXJhbSBmb3JtYXQgICAgICAgIGNvbG9yIGZvcm1hdCBvZiBncmFwaGljIGFsbG9jYXRpb24KKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgICAgICBhbGxvY2F0aW9uIHBhcmFtZXRlciBmb3IgYnVmZmVyIHBvb2wKKyAgICAgKi8KKyAgICB2b2lkIGdldEdyYXBoaWNQYXJhbXModWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LCBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqcGFyYW1zKTsKKworICAgIC8qKgorICAgICAqIFRyYW5zZm9ybXMgYW4gZXhpc3RpbmcgbmF0aXZlIGhhbmRsZSB0byBhbiBDMkxpbmVhckFsbGNhdGlvbi4KKyAgICAgKiBXcmFwcGVyIHRvIEMyQWxsb2NhdG9yI3ByaW9yTGluZWFyQWxsb2NhdGlvbgorICAgICAqLworICAgIGMyX3N0YXR1c190IHByaW9yTGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAqYzJBbGxvY2F0aW9uKTsKKworICAgIC8qKgorICAgICAqIFRyYW5zZm9ybXMgYW4gZXhpc3RpbmcgbmF0aXZlIGhhbmRsZSB0byBhbiBDMkdyYXBoaWNBbGxjYXRpb24uCisgICAgICogV3JhcHBlciB0byBDMkFsbG9jYXRvciNwcmlvckdyYXBoaWNBbGxvY2F0aW9uCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgcHJpb3JHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmMyQWxsb2NhdGlvbik7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga01heEludFBhcmFtcyA9IDU7IC8vIGxhcmdlIGVub3VnaCBudW1iZXI7CisKKyAgICBlbnVtIEFsbG9jVHlwZSA6IHVpbnQ4X3QgeworICAgICAgICBBTExPQ19OT05FID0gMCwKKworICAgICAgICBBTExPQ19MSU5FQVIsCisgICAgICAgIEFMTE9DX0dSQVBISUMsCisgICAgfTsKKworICAgIHVuaW9uIEFsbG9jUGFyYW1zIHsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIEFsbG9jVHlwZSBhbGxvY1R5cGU7CisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlOworICAgICAgICAgICAgdWludDMyX3QgcGFyYW1zW2tNYXhJbnRQYXJhbXNdOworICAgICAgICB9IGRhdGE7CisgICAgICAgIHVpbnQ4X3QgYXJyYXlbMF07CisKKyAgICAgICAgQWxsb2NQYXJhbXMoKSA6IGRhdGF7QUxMT0NfTk9ORSwgezAsIDB9LCB7MH19IHt9CisgICAgICAgIEFsbG9jUGFyYW1zKEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIHVpbnQzMl90IGNhcGFjaXR5KQorICAgICAgICAgICAgOiBkYXRhe0FMTE9DX0xJTkVBUiwgdXNhZ2UsIHtbMF0gPSBjYXBhY2l0eX19IHt9CisgICAgICAgIEFsbG9jUGFyYW1zKAorICAgICAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0KQorICAgICAgICAgICAgICAgIDogZGF0YXtBTExPQ19HUkFQSElDLCB1c2FnZSwge3dpZHRoLCBoZWlnaHQsIGZvcm1hdH19IHt9CisgICAgfTsKKworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKK307CisKK3N0cnVjdCBMaW5lYXJBbGxvY2F0aW9uRHRvciB7CisgICAgTGluZWFyQWxsb2NhdGlvbkR0b3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gJmFsbG9jKQorICAgICAgICA6IG1BbGxvY2F0aW9uKGFsbG9jKSB7fQorCisgICAgdm9pZCBvcGVyYXRvcigpKEJ1ZmZlclBvb2xBbGxvY2F0aW9uICpwb29sQWxsb2MpIHsgZGVsZXRlIHBvb2xBbGxvYzsgfQorCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gbUFsbG9jYXRpb247Cit9OworCitzdHJ1Y3QgR3JhcGhpY0FsbG9jYXRpb25EdG9yIHsKKyAgICBHcmFwaGljQWxsb2NhdGlvbkR0b3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICZhbGxvYykKKyAgICAgICAgOiBtQWxsb2NhdGlvbihhbGxvYykge30KKworICAgIHZvaWQgb3BlcmF0b3IoKShCdWZmZXJQb29sQWxsb2NhdGlvbiAqcG9vbEFsbG9jKSB7IGRlbGV0ZSBwb29sQWxsb2M7IH0KKworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBtQWxsb2NhdGlvbjsKK307CisKK1Jlc3VsdFN0YXR1cyBfQzJCdWZmZXJQb29sQWxsb2NhdG9yOjphbGxvY2F0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gICZwYXJhbXMsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gKmFsbG9jLAorICAgICAgICBzaXplX3QgKmFsbG9jU2l6ZSkgeworICAgIEFsbG9jUGFyYW1zIGMyUGFyYW1zOworICAgIG1lbWNweSgmYzJQYXJhbXMsIHBhcmFtcy5kYXRhKCksIHN0ZDo6bWluKHNpemVvZihBbGxvY1BhcmFtcyksIHBhcmFtcy5zaXplKCkpKTsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBDMl9CQURfVkFMVUU7CisgICAgc3dpdGNoKGMyUGFyYW1zLmRhdGEuYWxsb2NUeXBlKSB7CisgICAgICAgIGNhc2UgQUxMT0NfTk9ORToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFMTE9DX0xJTkVBUjogeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gYzJMaW5lYXI7CisgICAgICAgICAgICBzdGF0dXMgPSBtQWxsb2NhdG9yLT5uZXdMaW5lYXJBbGxvY2F0aW9uKAorICAgICAgICAgICAgICAgICAgICBjMlBhcmFtcy5kYXRhLnBhcmFtc1swXSwgYzJQYXJhbXMuZGF0YS51c2FnZSwgJmMyTGluZWFyKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQzJfT0sgJiYgYzJMaW5lYXIpIHsKKyAgICAgICAgICAgICAgICBCdWZmZXJQb29sQWxsb2NhdGlvbiAqcHRyID0gbmV3IEJ1ZmZlclBvb2xBbGxvY2F0aW9uKGMyTGluZWFyLT5oYW5kbGUoKSk7CisgICAgICAgICAgICAgICAgaWYgKHB0cikgeworICAgICAgICAgICAgICAgICAgICAqYWxsb2MgPSBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciwgTGluZWFyQWxsb2NhdGlvbkR0b3IoYzJMaW5lYXIpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCphbGxvYykgeworICAgICAgICAgICAgICAgICAgICAgICAgKmFsbG9jU2l6ZSA9IChzaXplX3QpYzJQYXJhbXMuZGF0YS5wYXJhbXNbMF07CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkZWxldGUgcHRyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEFMTE9DX0dSQVBISUM6IHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBjMkdyYXBoaWM7CisgICAgICAgICAgICBzdGF0dXMgPSBtQWxsb2NhdG9yLT5uZXdHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgYzJQYXJhbXMuZGF0YS5wYXJhbXNbMF0sCisgICAgICAgICAgICAgICAgICAgIGMyUGFyYW1zLmRhdGEucGFyYW1zWzFdLAorICAgICAgICAgICAgICAgICAgICBjMlBhcmFtcy5kYXRhLnBhcmFtc1syXSwKKyAgICAgICAgICAgICAgICAgICAgYzJQYXJhbXMuZGF0YS51c2FnZSwgJmMyR3JhcGhpYyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEMyX09LICYmIGMyR3JhcGhpYykgeworICAgICAgICAgICAgICAgIEJ1ZmZlclBvb2xBbGxvY2F0aW9uICpwdHIgPSBuZXcgQnVmZmVyUG9vbEFsbG9jYXRpb24oYzJHcmFwaGljLT5oYW5kbGUoKSk7CisgICAgICAgICAgICAgICAgaWYgKHB0cikgeworICAgICAgICAgICAgICAgICAgICAqYWxsb2MgPSBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciwgR3JhcGhpY0FsbG9jYXRpb25EdG9yKGMyR3JhcGhpYykpOworICAgICAgICAgICAgICAgICAgICBpZiAoKmFsbG9jKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqYWxsb2NTaXplID0gYzJQYXJhbXMuZGF0YS5wYXJhbXNbMF0gKiBjMlBhcmFtcy5kYXRhLnBhcmFtc1sxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwdHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK2Jvb2wgX0MyQnVmZmVyUG9vbEFsbG9jYXRvcjo6Y29tcGF0aWJsZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gICZuZXdQYXJhbXMsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICAmb2xkUGFyYW1zKSB7CisgICAgQWxsb2NQYXJhbXMgbmV3QWxsb2M7CisgICAgQWxsb2NQYXJhbXMgb2xkQWxsb2M7CisgICAgbWVtY3B5KCZuZXdBbGxvYywgbmV3UGFyYW1zLmRhdGEoKSwgc3RkOjptaW4oc2l6ZW9mKEFsbG9jUGFyYW1zKSwgbmV3UGFyYW1zLnNpemUoKSkpOworICAgIG1lbWNweSgmb2xkQWxsb2MsIG9sZFBhcmFtcy5kYXRhKCksIHN0ZDo6bWluKHNpemVvZihBbGxvY1BhcmFtcyksIG9sZFBhcmFtcy5zaXplKCkpKTsKKworICAgIC8vIFRPRE86IHN1cHBvcnQgbm90IGV4YWN0IG1hdGNoaW5nLiBlLmcpIG5ld0NhcGFjaXR5IDwgb2xkQ2FwYWNpdHkKKyAgICBpZiAobmV3QWxsb2MuZGF0YS5hbGxvY1R5cGUgPT0gb2xkQWxsb2MuZGF0YS5hbGxvY1R5cGUgJiYKKyAgICAgICAgICAgIG5ld0FsbG9jLmRhdGEudXNhZ2UuZXhwZWN0ZWQgPT0gb2xkQWxsb2MuZGF0YS51c2FnZS5leHBlY3RlZCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtNYXhJbnRQYXJhbXM7ICsraSkgeworICAgICAgICAgICAgaWYgKG5ld0FsbG9jLmRhdGEucGFyYW1zW2ldICE9IG9sZEFsbG9jLmRhdGEucGFyYW1zW2ldKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgX0MyQnVmZmVyUG9vbEFsbG9jYXRvcjo6Z2V0TGluZWFyUGFyYW1zKAorICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgc3RkOjp2ZWN0b3I8dWludDhfdD4gKnBhcmFtcykgeworICAgIEFsbG9jUGFyYW1zIGMyUGFyYW1zKHVzYWdlLCBjYXBhY2l0eSk7CisgICAgcGFyYW1zLT5hc3NpZ24oYzJQYXJhbXMuYXJyYXksIGMyUGFyYW1zLmFycmF5ICsgc2l6ZW9mKEFsbG9jUGFyYW1zKSk7Cit9CisKK3ZvaWQgX0MyQnVmZmVyUG9vbEFsbG9jYXRvcjo6Z2V0R3JhcGhpY1BhcmFtcygKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LCBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqcGFyYW1zKSB7CisgICAgQWxsb2NQYXJhbXMgYzJQYXJhbXModXNhZ2UsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCk7CisgICAgcGFyYW1zLT5hc3NpZ24oYzJQYXJhbXMuYXJyYXksIGMyUGFyYW1zLmFycmF5ICsgc2l6ZW9mKEFsbG9jUGFyYW1zKSk7Cit9CisKK2MyX3N0YXR1c190IF9DMkJ1ZmZlclBvb2xBbGxvY2F0b3I6OnByaW9yTGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gKmMyQWxsb2NhdGlvbikgeworICAgIHJldHVybiBtQWxsb2NhdG9yLT5wcmlvckxpbmVhckFsbG9jYXRpb24oaGFuZGxlLCBjMkFsbG9jYXRpb24pOworfQorCitjMl9zdGF0dXNfdCBfQzJCdWZmZXJQb29sQWxsb2NhdG9yOjpwcmlvckdyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmMyQWxsb2NhdGlvbikgeworICAgIHJldHVybiBtQWxsb2NhdG9yLT5wcmlvckdyYXBoaWNBbGxvY2F0aW9uKGhhbmRsZSwgYzJBbGxvY2F0aW9uKTsKK30KKworY2xhc3MgQzJQb29sZWRCbG9ja1Bvb2w6OkltcGwgeworcHVibGljOgorICAgIEltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yKQorICAgICAgICAgICAgOiBtSW5pdChDMl9PSyksCisgICAgICAgICAgICAgIG1CdWZmZXJQb29sTWFuYWdlcihDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpKSwKKyAgICAgICAgICAgICAgbUFsbG9jYXRvcihzdGQ6Om1ha2Vfc2hhcmVkPF9DMkJ1ZmZlclBvb2xBbGxvY2F0b3I+KGFsbG9jYXRvcikpIHsKKyAgICAgICAgaWYgKG1BbGxvY2F0b3IgJiYgbUJ1ZmZlclBvb2xNYW5hZ2VyKSB7CisgICAgICAgICAgICBpZiAobUJ1ZmZlclBvb2xNYW5hZ2VyLT5jcmVhdGUoCisgICAgICAgICAgICAgICAgICAgIG1BbGxvY2F0b3IsICZtQ29ubmVjdGlvbklkKSA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Jbml0ID0gQzJfTk9fSU5JVDsKKyAgICB9CisKKyAgICB+SW1wbCgpIHsKKyAgICAgICAgaWYgKG1Jbml0ID09IEMyX09LKSB7CisgICAgICAgICAgICBtQnVmZmVyUG9vbE1hbmFnZXItPmNsb3NlKG1Db25uZWN0aW9uSWQpOworICAgICAgICB9CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LCBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSB7CisgICAgICAgIGJsb2NrLT5yZXNldCgpOworICAgICAgICBpZiAobUluaXQgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYXJhbXM7CisgICAgICAgIG1BbGxvY2F0b3ItPmdldExpbmVhclBhcmFtcyhjYXBhY2l0eSwgdXNhZ2UsICZwYXJhbXMpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJ1ZmZlclBvb2xEYXRhOworICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmNIYW5kbGUgPSBudWxscHRyOworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUJ1ZmZlclBvb2xNYW5hZ2VyLT5hbGxvY2F0ZSgKKyAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBwYXJhbXMsICZjSGFuZGxlLCAmYnVmZmVyUG9vbERhdGEpOworICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jbG9uZShjSGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb29sZWRCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sRGF0YT4oYnVmZmVyUG9vbERhdGEpOworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1BbGxvY2F0b3ItPnByaW9yTGluZWFyQWxsb2NhdGlvbihoYW5kbGUsICZhbGxvYyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSyAmJiBwb29sRGF0YSAmJiBhbGxvYykgeworICAgICAgICAgICAgICAgICAgICAqYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUxpbmVhckJsb2NrKGFsbG9jLCBwb29sRGF0YSwgMCwgY2FwYWNpdHkpOworICAgICAgICAgICAgICAgICAgICBpZiAoKmJsb2NrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlkpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jaykgeworICAgICAgICBibG9jay0+cmVzZXQoKTsKKyAgICAgICAgaWYgKG1Jbml0ICE9IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGFyYW1zOworICAgICAgICBtQWxsb2NhdG9yLT5nZXRHcmFwaGljUGFyYW1zKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZwYXJhbXMpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJ1ZmZlclBvb2xEYXRhOworICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmNIYW5kbGUgPSBudWxscHRyOworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUJ1ZmZlclBvb2xNYW5hZ2VyLT5hbGxvY2F0ZSgKKyAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBwYXJhbXMsICZjSGFuZGxlLCAmYnVmZmVyUG9vbERhdGEpOworICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jbG9uZShjSGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9vbGVkQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sRGF0YT4oYnVmZmVyUG9vbERhdGEpOworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1BbGxvY2F0b3ItPnByaW9yR3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsICZhbGxvYyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSyAmJiBwb29sRGF0YSAmJiBhbGxvYykgeworICAgICAgICAgICAgICAgICAgICAqYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvYywgcG9vbERhdGEsIEMyUmVjdCh3aWR0aCwgaGVpZ2h0KSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgqYmxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWSkgeworICAgICAgICAgICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIENvbm5lY3Rpb25JZCBnZXRDb25uZWN0aW9uSWQoKSB7CisgICAgICAgIHJldHVybiBtSW5pdCAhPSBDMl9PSyA/IElOVkFMSURfQ09OTkVDVElPTklEIDogbUNvbm5lY3Rpb25JZDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgYzJfc3RhdHVzX3QgbUluaXQ7CisgICAgY29uc3QgYW5kcm9pZDo6c3A8Q2xpZW50TWFuYWdlcj4gbUJ1ZmZlclBvb2xNYW5hZ2VyOworICAgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOyAvLyBsb2NhbGx5CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJ1ZmZlclBvb2xBbGxvY2F0b3I+IG1BbGxvY2F0b3I7Cit9OworCitDMlBvb2xlZEJsb2NrUG9vbDo6QzJQb29sZWRCbG9ja1Bvb2woCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jYXRvciwgY29uc3QgbG9jYWxfaWRfdCBsb2NhbElkKQorICAgICAgICA6IG1BbGxvY2F0b3IoYWxsb2NhdG9yKSwgbUxvY2FsSWQobG9jYWxJZCksIG1JbXBsKG5ldyBJbXBsKGFsbG9jYXRvcikpIHt9CisKK0MyUG9vbGVkQmxvY2tQb29sOjp+QzJQb29sZWRCbG9ja1Bvb2woKSB7Cit9CisKK2MyX3N0YXR1c190IEMyUG9vbGVkQmxvY2tQb29sOjpmZXRjaExpbmVhckJsb2NrKAorICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+ZmV0Y2hMaW5lYXJCbG9jayhjYXBhY2l0eSwgdXNhZ2UsIGJsb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKK30KKworYzJfc3RhdHVzX3QgQzJQb29sZWRCbG9ja1Bvb2w6OmZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+ZmV0Y2hHcmFwaGljQmxvY2sod2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgYmxvY2spOworICAgIH0KKyAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworfQorCitpbnQ2NF90IEMyUG9vbGVkQmxvY2tQb29sOjpnZXRDb25uZWN0aW9uSWQoKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Z2V0Q29ubmVjdGlvbklkKCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gMkQgQkxPQ0sgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiB0aGF0IGlzIHNoYXJlZCBiZXR3ZWVuIGFsbCAyRCBibG9ja3MgYW5kIHZpZXdzLgorICoKKyAqIEZvciBibG9ja3MnIEltcGwncyBjcm9wIGlzIGFsd2F5cyB0aGUgYWxsb3R0ZWQgY3JvcCwgZXZlbiBpZiBpdCBpcyBhIHN1YiBibG9jay4KKyAqCisgKiBGb3Igdmlld3MnIEltcGwncyBjcm9wIGlzIHRoZSBtYXBwZWQgcG9ydGlvbiAtIHdoaWNoIGZvciBub3cgaXMgYWx3YXlzIHRoZQorICogYWxsb3R0ZWQgY3JvcC4KKyAqLworY2xhc3MgQzJfSElERSBfQzJCbG9jazJESW1wbCA6IHB1YmxpYyBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBJbXBsJ3MgY3JvcCBpcyBhbHdheXMgdGhlIG9yIHBhcnQgb2YgdGhlIGFsbG90dGVkIGNyb3Agb2YgdGhlIGFsbG9jYXRpb24uCisgICAgICovCisgICAgX0MyQmxvY2syREltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiAmcG9vbERhdGEgPSBudWxscHRyLAorICAgICAgICAgICAgY29uc3QgQzJSZWN0ICZhbGxvdHRlZENyb3AgPSBDMlJlY3QofjB1LCB+MHUpKQorICAgICAgICA6IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QoYWxsb2MuZ2V0KCksIGFsbG90dGVkQ3JvcCksCisgICAgICAgICAgbUFsbG9jYXRpb24oYWxsb2MpLAorICAgICAgICAgIG1Qb29sRGF0YShwb29sRGF0YSkgeyB9CisKKyAgICB2aXJ0dWFsIH5fQzJCbG9jazJESW1wbCgpID0gZGVmYXVsdDsKKworICAgIC8qKiByZXR1cm5zIHBvb2wgZGF0YSAgKi8KKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gcG9vbERhdGEoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUG9vbERhdGE7CisgICAgfQorCisgICAgLyoqIHJldHVybnMgbmF0aXZlIGhhbmRsZSAqLworICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdGlvbiA/IG1BbGxvY2F0aW9uLT5oYW5kbGUoKSA6IG51bGxwdHI7CisgICAgfQorCisgICAgLyoqIHJldHVybnMgdGhlIGFsbG9jYXRvcidzIElEICovCisgICAgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCB7CisgICAgICAgIC8vIEJBRF9JRCBjYW4gb25seSBoYXBwZW4gaWYgdGhpcyBJbXBsIGNsYXNzIGlzIGluaXRpYWxpemVkIGZvciBhIHZpZXcgLSBuZXZlciBmb3IgYSBibG9jay4KKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uID8gbUFsbG9jYXRpb24tPmdldEFsbG9jYXRvcklkKCkgOiBDMkFsbG9jYXRvcjo6QkFEX0lEOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBnZXRBbGxvY2F0aW9uKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUFsbG9jYXRpb247CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBtQWxsb2NhdGlvbjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gbVBvb2xEYXRhOworfTsKKworY2xhc3MgQzJfSElERSBfQzJNYXBwaW5nQmxvY2syREltcGwKKyAgICA6IHB1YmxpYyBfQzJCbG9jazJESW1wbCwgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8X0MyTWFwcGluZ0Jsb2NrMkRJbXBsPiB7CitwdWJsaWM6CisgICAgdXNpbmcgX0MyQmxvY2syREltcGw6Ol9DMkJsb2NrMkRJbXBsOworCisgICAgdmlydHVhbCB+X0MyTWFwcGluZ0Jsb2NrMkRJbXBsKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogVGhpcyBjbGFzcyBjb250YWlucyB0aGUgbWFwcGVkIGRhdGEgcG9pbnRlciwgYW5kIHRoZSBwb3RlbnRpYWwgZXJyb3IuCisgICAgICovCisgICAgc3RydWN0IE1hcHBlZCB7CisgICAgcHJpdmF0ZToKKyAgICAgICAgZnJpZW5kIGNsYXNzIF9DMk1hcHBpbmdCbG9jazJESW1wbDsKKworICAgICAgICBNYXBwZWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrMkRJbXBsPiAmaW1wbCwgYm9vbCB3cml0YWJsZSwgQzJGZW5jZSAqZmVuY2UgX191bnVzZWQpCisgICAgICAgICAgICA6IG1JbXBsKGltcGwpLCBtV3JpdGFibGUod3JpdGFibGUpIHsKKyAgICAgICAgICAgIG1lbXNldChtRGF0YSwgMCwgc2l6ZW9mKG1EYXRhKSk7CisgICAgICAgICAgICBjb25zdCBDMlJlY3QgY3JvcCA9IG1JbXBsLT5jcm9wKCk7CisgICAgICAgICAgICAvLyBncmFsbG9jIHJlcXVpcmVzIG1hcHBpbmcgdGhlIHdob2xlIHJlZ2lvbiBvZiBpbnRlcmVzdCBhcyB3ZSBjYW5ub3QKKyAgICAgICAgICAgIC8vIG1hcCBtdWx0aXBsZSByZWdpb25zCisgICAgICAgICAgICBtRXJyb3IgPSBtSW1wbC0+Z2V0QWxsb2NhdGlvbigpLT5tYXAoCisgICAgICAgICAgICAgICAgICAgIGNyb3AsCisgICAgICAgICAgICAgICAgICAgIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIHdyaXRhYmxlID8gQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIDogMCB9LAorICAgICAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAmbUxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgbURhdGEpOworICAgICAgICAgICAgaWYgKG1FcnJvciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIG1lbXNldCgmbUxheW91dCwgMCwgc2l6ZW9mKG1MYXlvdXQpKTsKKyAgICAgICAgICAgICAgICBtZW1zZXQobURhdGEsIDAsIHNpemVvZihtRGF0YSkpOworICAgICAgICAgICAgICAgIG1lbXNldChtT2Zmc2V0RGF0YSwgMCwgc2l6ZW9mKG1EYXRhKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IHZhbGlkYXRlIHBsYW5lIGxheW91dCBhbmQKKyAgICAgICAgICAgICAgICAvLyBhZGp1c3QgZGF0YSBwb2ludGVycyB0byB0aGUgY3JvcCByZWdpb24ncyB0b3AgbGVmdCBjb3JuZXIuCisgICAgICAgICAgICAgICAgLy8gZmFpbCBpZiBpdCBpcyBub3Qgb24gYSBzdWJzYW1wbGluZyBib3VuZGFyeQorICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IHBsYW5lSXggPSAwOyBwbGFuZUl4IDwgbUxheW91dC5udW1QbGFuZXM7ICsrcGxhbmVJeCkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjb2xTYW1wbGluZyA9IG1MYXlvdXQucGxhbmVzW3BsYW5lSXhdLmNvbFNhbXBsaW5nOworICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCByb3dTYW1wbGluZyA9IG1MYXlvdXQucGxhbmVzW3BsYW5lSXhdLnJvd1NhbXBsaW5nOworICAgICAgICAgICAgICAgICAgICBpZiAoY3JvcC5sZWZ0ICUgY29sU2FtcGxpbmcgfHwgY3JvcC5yaWdodCgpICUgY29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjcm9wLnRvcCAlIHJvd1NhbXBsaW5nIHx8IGNyb3AuYm90dG9tKCkgJSByb3dTYW1wbGluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2Fubm90IGNhbGN1bGF0ZSBkYXRhIHBvaW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JbXBsLT5nZXRBbGxvY2F0aW9uKCktPnVubWFwKG1EYXRhLCBjcm9wLCBudWxscHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgmbUxheW91dCwgMCwgc2l6ZW9mKG1MYXlvdXQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChtRGF0YSwgMCwgc2l6ZW9mKG1EYXRhKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQobU9mZnNldERhdGEsIDAsIHNpemVvZihtRGF0YSkpOworICAgICAgICAgICAgICAgICAgICAgICAgbUVycm9yID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1PZmZzZXREYXRhW3BsYW5lSXhdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1EYXRhW3BsYW5lSXhdICsgKHNzaXplX3QpY3JvcC5sZWZ0ICogbUxheW91dC5wbGFuZXNbcGxhbmVJeF0uY29sSW5jCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKHNzaXplX3QpY3JvcC50b3AgKiBtTGF5b3V0LnBsYW5lc1twbGFuZUl4XS5yb3dJbmM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZXhwbGljaXQgTWFwcGVkKGMyX3N0YXR1c190IGVycm9yKQorICAgICAgICAgICAgOiBtSW1wbChudWxscHRyKSwgbVdyaXRhYmxlKGZhbHNlKSwgbUVycm9yKGVycm9yKSB7CisgICAgICAgICAgICAvLyBDSEVDSyhlcnJvciAhPSBDMl9PSyk7CisgICAgICAgICAgICBtZW1zZXQoJm1MYXlvdXQsIDAsIHNpemVvZihtTGF5b3V0KSk7CisgICAgICAgICAgICBtZW1zZXQobURhdGEsIDAsIHNpemVvZihtRGF0YSkpOworICAgICAgICAgICAgbWVtc2V0KG1PZmZzZXREYXRhLCAwLCBzaXplb2YobURhdGEpKTsKKyAgICAgICAgfQorCisgICAgcHVibGljOgorICAgICAgICB+TWFwcGVkKCkgeworICAgICAgICAgICAgaWYgKG1EYXRhWzBdICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBtSW1wbC0+Z2V0QWxsb2NhdGlvbigpLT51bm1hcChtRGF0YSwgbUltcGwtPmNyb3AoKSwgbnVsbHB0cik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogcmV0dXJucyBtYXBwaW5nIHN0YXR1cyAqLworICAgICAgICBjMl9zdGF0dXNfdCBlcnJvcigpIGNvbnN0IHsgcmV0dXJuIG1FcnJvcjsgfQorCisgICAgICAgIC8qKiByZXR1cm5zIGRhdGEgcG9pbnRlciAqLworICAgICAgICB1aW50OF90ICpjb25zdCAqZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1PZmZzZXREYXRhOyB9CisKKyAgICAgICAgLyoqIHJldHVybnMgdGhlIHBsYW5lIGxheW91dCAqLworICAgICAgICBDMlBsYW5hckxheW91dCBsYXlvdXQoKSBjb25zdCB7IHJldHVybiBtTGF5b3V0OyB9CisKKyAgICAgICAgLyoqIHJldHVybnMgd2hldGhlciB0aGUgbWFwcGluZyBpcyB3cml0YWJsZSAqLworICAgICAgICBib29sIHdyaXRhYmxlKCkgY29uc3QgeyByZXR1cm4gbVdyaXRhYmxlOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2syREltcGw+IG1JbXBsOworICAgICAgICBib29sIG1Xcml0YWJsZTsKKyAgICAgICAgYzJfc3RhdHVzX3QgbUVycm9yOworICAgICAgICB1aW50OF90ICptRGF0YVtDMlBsYW5hckxheW91dDo6TUFYX05VTV9QTEFORVNdOworICAgICAgICB1aW50OF90ICptT2Zmc2V0RGF0YVtDMlBsYW5hckxheW91dDo6TUFYX05VTV9QTEFORVNdOworICAgICAgICBDMlBsYW5hckxheW91dCBtTGF5b3V0OworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBNYXBzIHRoZSBhbGxvdHRlZCByZWdpb24uCisgICAgICoKKyAgICAgKiBJZiBhbHJlYWR5IG1hcHBlZCBhbmQgaXQgaXMgY3VycmVudGx5IGluIHVzZSwgcmV0dXJucyB0aGUgZXhpc3RpbmcgbWFwcGluZy4KKyAgICAgKiBJZiBmZW5jZSBpcyBwcm92aWRlZCwgYW4gYWNxdWlyZSBmZW5jZSBpcyBzdG9yZWQgdGhlcmUuCisgICAgICovCisgICAgc3RkOjpzaGFyZWRfcHRyPE1hcHBlZD4gbWFwKGJvb2wgd3JpdGFibGUsIEMyRmVuY2UgKmZlbmNlKSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NYXBwZWRMb2NrKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPE1hcHBlZD4gZXhpc3RpbmcgPSBtTWFwcGVkLmxvY2soKTsKKyAgICAgICAgaWYgKCFleGlzdGluZykgeworICAgICAgICAgICAgZXhpc3RpbmcgPSBzdGQ6OnNoYXJlZF9wdHI8TWFwcGVkPihuZXcgTWFwcGVkKHNoYXJlZF9mcm9tX3RoaXMoKSwgd3JpdGFibGUsIGZlbmNlKSk7CisgICAgICAgICAgICBtTWFwcGVkID0gZXhpc3Rpbmc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBpZiB3ZSBtYXBwZWQgdGhlIHJlZ2lvbiByZWFkLW9ubHksIHdlIGNhbm5vdCByZW1hcCBpdCByZWFkLXdyaXRlCisgICAgICAgICAgICBpZiAod3JpdGFibGUgJiYgIWV4aXN0aW5nLT53cml0YWJsZSgpKSB7CisgICAgICAgICAgICAgICAgZXhpc3RpbmcgPSBzdGQ6OnNoYXJlZF9wdHI8TWFwcGVkPihuZXcgTWFwcGVkKEMyX0NBTk5PVF9ETykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZlbmNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAqZmVuY2UgPSBDMkZlbmNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGV4aXN0aW5nOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OndlYWtfcHRyPE1hcHBlZD4gbU1hcHBlZDsKKyAgICBzdGQ6Om11dGV4IG1NYXBwZWRMb2NrOworfTsKKworY2xhc3MgQzJfSElERSBfQzJNYXBwZWRCbG9jazJESW1wbCA6IHB1YmxpYyBfQzJCbG9jazJESW1wbCB7CitwdWJsaWM6CisgICAgX0MyTWFwcGVkQmxvY2syREltcGwoY29uc3QgX0MyQmxvY2syREltcGwgJmltcGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPF9DMk1hcHBpbmdCbG9jazJESW1wbDo6TWFwcGVkPiBtYXBwaW5nKQorICAgICAgICA6IF9DMkJsb2NrMkRJbXBsKGltcGwpLCBtTWFwcGluZyhtYXBwaW5nKSB7CisgICAgfQorCisgICAgdmlydHVhbCB+X0MyTWFwcGVkQmxvY2syREltcGwoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyTWFwcGluZ0Jsb2NrMkRJbXBsOjpNYXBwZWQ+IG1hcHBpbmcoKSBjb25zdCB7IHJldHVybiBtTWFwcGluZzsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJNYXBwaW5nQmxvY2syREltcGw6Ok1hcHBlZD4gbU1hcHBpbmc7Cit9OworCisvKioKKyAqIEJsb2NrIGltcGxlbWVudGF0aW9uLgorICovCitjbGFzcyBDMkJsb2NrMkQ6OkltcGwgOiBwdWJsaWMgX0MyTWFwcGluZ0Jsb2NrMkRJbXBsIHsKK3B1YmxpYzoKKyAgICB1c2luZyBfQzJNYXBwaW5nQmxvY2syREltcGw6Ol9DMk1hcHBpbmdCbG9jazJESW1wbDsKKyAgICB2aXJ0dWFsIH5JbXBsKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworfTsKKworY29uc3QgQzJIYW5kbGUgKkMyQmxvY2syRDo6aGFuZGxlKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+aGFuZGxlKCk7Cit9CisKK0MyQWxsb2NhdG9yOjppZF90IEMyQmxvY2syRDo6Z2V0QWxsb2NhdG9ySWQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRBbGxvY2F0b3JJZCgpOworfQorCitDMkJsb2NrMkQ6OkMyQmxvY2syRChzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCAmc2VjdGlvbikKKyAgICAvLyBhbHdheXMgY2xhbXAgc3Vic2VjdGlvbiB0byBwYXJlbnQgKGltcGwpIGNyb3AgZm9yIHNhZmV0eQorICAgIDogX0MyUGxhbmFyU2VjdGlvbkFzcGVjdChpbXBsLmdldCgpLCBzZWN0aW9uLmNyb3AoKSksIG1JbXBsKGltcGwpIHsKK30KKworLyoqCisgKiBHcmFwaGljIHZpZXcgaW1wbGVtZW50YXRpb24uCisgKgorICogcmFuZ2Ugb2YgSW1wbCBpcyB0aGUgbWFwcGVkIHJhbmdlIG9mIHRoZSB1bmRlcmx5aW5nIGFsbG9jYXRpb24uIHJhbmdlIG9mIFZpZXcgaXMgdGhlIGN1cnJlbnQKKyAqIGNyb3AuCisgKi8KK2NsYXNzIEMyR3JhcGhpY1ZpZXc6OkltcGwgOiBwdWJsaWMgX0MyTWFwcGVkQmxvY2syREltcGwgeworcHVibGljOgorICAgIHVzaW5nIF9DMk1hcHBlZEJsb2NrMkRJbXBsOjpfQzJNYXBwZWRCbG9jazJESW1wbDsKKyAgICB2aXJ0dWFsIH5JbXBsKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworfTsKKworQzJHcmFwaGljVmlldzo6QzJHcmFwaGljVmlldyhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCAmc2VjdGlvbikKKyAgICA6IF9DMkVkaXRhYmxlUGxhbmFyU2VjdGlvbkFzcGVjdChpbXBsLmdldCgpLCBzZWN0aW9uLmNyb3AoKSksIG1JbXBsKGltcGwpIHsKK30KKworY29uc3QgdWludDhfdCAqY29uc3QgKkMyR3JhcGhpY1ZpZXc6OmRhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5tYXBwaW5nKCktPmRhdGEoKTsKK30KKwordWludDhfdCAqY29uc3QgKkMyR3JhcGhpY1ZpZXc6OmRhdGEoKSB7CisgICAgcmV0dXJuIG1JbXBsLT5tYXBwaW5nKCktPmRhdGEoKTsKK30KKworY29uc3QgQzJQbGFuYXJMYXlvdXQgQzJHcmFwaGljVmlldzo6bGF5b3V0KCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+bWFwcGluZygpLT5sYXlvdXQoKTsKK30KKworY29uc3QgQzJHcmFwaGljVmlldyBDMkdyYXBoaWNWaWV3OjpzdWJWaWV3KGNvbnN0IEMyUmVjdCAmcmVjdCkgY29uc3QgeworICAgIHJldHVybiBDMkdyYXBoaWNWaWV3KG1JbXBsLCBDMlBsYW5hclNlY3Rpb24oKm1JbXBsLCByZWN0KSk7Cit9CisKK0MyR3JhcGhpY1ZpZXcgQzJHcmFwaGljVmlldzo6c3ViVmlldyhjb25zdCBDMlJlY3QgJnJlY3QpIHsKKyAgICByZXR1cm4gQzJHcmFwaGljVmlldyhtSW1wbCwgQzJQbGFuYXJTZWN0aW9uKCptSW1wbCwgcmVjdCkpOworfQorCitjMl9zdGF0dXNfdCBDMkdyYXBoaWNWaWV3OjplcnJvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPm1hcHBpbmcoKS0+ZXJyb3IoKTsKK30KKworLyoqCisgKiBDb25zdCBncmFwaGljIGJsb2NrIGltcGxlbWVudGF0aW9uLgorICovCitDMkNvbnN0R3JhcGhpY0Jsb2NrOjpDMkNvbnN0R3JhcGhpY0Jsb2NrKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCAmc2VjdGlvbiwgQzJGZW5jZSBmZW5jZSkKKyAgICA6IEMyQmxvY2syRChpbXBsLCBzZWN0aW9uKSwgbUZlbmNlKGZlbmNlKSB7IH0KKworQzJBY3F1aXJhYmxlPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IEMyQ29uc3RHcmFwaGljQmxvY2s6Om1hcCgpIGNvbnN0IHsKKyAgICBDMkZlbmNlIGZlbmNlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJNYXBwaW5nQmxvY2syREltcGw6Ok1hcHBlZD4gbWFwcGluZyA9CisgICAgICAgIG1JbXBsLT5tYXAoZmFsc2UgLyogd3JpdGFibGUgKi8sICZmZW5jZSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEdyYXBoaWNWaWV3QnVkZHk6OkltcGw+IGd2aSA9CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxHcmFwaGljVmlld0J1ZGR5OjpJbXBsPihuZXcgR3JhcGhpY1ZpZXdCdWRkeTo6SW1wbCgqbUltcGwsIG1hcHBpbmcpKTsKKyAgICByZXR1cm4gQWNxdWlyYWJsZUNvbnN0R3JhcGhpY1ZpZXdCdWRkeSgKKyAgICAgICAgICAgIG1hcHBpbmctPmVycm9yKCksIGZlbmNlLCBHcmFwaGljVmlld0J1ZGR5KGd2aSwgQzJQbGFuYXJTZWN0aW9uKCptSW1wbCwgY3JvcCgpKSkpOworfQorCitDMkNvbnN0R3JhcGhpY0Jsb2NrIEMyQ29uc3RHcmFwaGljQmxvY2s6OnN1YkJsb2NrKGNvbnN0IEMyUmVjdCAmcmVjdCkgY29uc3QgeworICAgIHJldHVybiBDMkNvbnN0R3JhcGhpY0Jsb2NrKG1JbXBsLCBDMlBsYW5hclNlY3Rpb24oKm1JbXBsLCBjcm9wKCkuaW50ZXJzZWN0KHJlY3QpKSwgbUZlbmNlKTsKK30KKworLyoqCisgKiBHcmFwaGljIGJsb2NrIGltcGxlbWVudGF0aW9uLgorICovCitDMkdyYXBoaWNCbG9jazo6QzJHcmFwaGljQmxvY2soCisgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgJnNlY3Rpb24pCisgICAgOiBDMkJsb2NrMkQoaW1wbCwgc2VjdGlvbikgeyB9CisKK0MyQWNxdWlyYWJsZTxDMkdyYXBoaWNWaWV3PiBDMkdyYXBoaWNCbG9jazo6bWFwKCkgeworICAgIEMyRmVuY2UgZmVuY2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMk1hcHBpbmdCbG9jazJESW1wbDo6TWFwcGVkPiBtYXBwaW5nID0KKyAgICAgICAgbUltcGwtPm1hcCh0cnVlIC8qIHdyaXRhYmxlICovLCAmZmVuY2UpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxHcmFwaGljVmlld0J1ZGR5OjpJbXBsPiBndmkgPQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8R3JhcGhpY1ZpZXdCdWRkeTo6SW1wbD4obmV3IEdyYXBoaWNWaWV3QnVkZHk6OkltcGwoKm1JbXBsLCBtYXBwaW5nKSk7CisgICAgcmV0dXJuIEFjcXVpcmFibGVHcmFwaGljVmlld0J1ZGR5KAorICAgICAgICAgICAgbWFwcGluZy0+ZXJyb3IoKSwgZmVuY2UsIEdyYXBoaWNWaWV3QnVkZHkoZ3ZpLCBDMlBsYW5hclNlY3Rpb24oKm1JbXBsLCBjcm9wKCkpKSk7Cit9CisKK0MyQ29uc3RHcmFwaGljQmxvY2sgQzJHcmFwaGljQmxvY2s6OnNoYXJlKGNvbnN0IEMyUmVjdCAmY3JvcCwgQzJGZW5jZSBmZW5jZSkgeworICAgIHJldHVybiBDb25zdEdyYXBoaWNCbG9ja0J1ZGR5KG1JbXBsLCBDMlBsYW5hclNlY3Rpb24oKm1JbXBsLCBjcm9wKSwgZmVuY2UpOworfQorCisvKioKKyAqIEJhc2ljIGJsb2NrIHBvb2wgaW1wbGVtZW50YXRpb25zLgorICovCitDMkJhc2ljR3JhcGhpY0Jsb2NrUG9vbDo6QzJCYXNpY0dyYXBoaWNCbG9ja1Bvb2woCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jYXRvcikKKyAgOiBtQWxsb2NhdG9yKGFsbG9jYXRvcikge30KKworYzJfc3RhdHVzX3QgQzJCYXNpY0dyYXBoaWNCbG9ja1Bvb2w6OmZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICBibG9jay0+cmVzZXQoKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQWxsb2NhdG9yLT5uZXdHcmFwaGljQWxsb2NhdGlvbih3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCAmYWxsb2MpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICAqYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jayhhbGxvYyk7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiAmZGF0YSwgY29uc3QgQzJSZWN0ICZhbGxvdHRlZENyb3ApIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9jazJEOjpJbXBsPiBpbXBsID0KKyAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMkJsb2NrMkQ6OkltcGw+KGFsbG9jLCBkYXRhLCBhbGxvdHRlZENyb3ApOworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+KG5ldyBDMkdyYXBoaWNCbG9jayhpbXBsLCAqaW1wbCkpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gX0MyQmxvY2tGYWN0b3J5OjpHZXRHcmFwaGljQmxvY2tQb29sRGF0YSgKKyAgICAgICAgY29uc3QgQzJCbG9jazJEICZibG9jaykgeworICAgIGlmIChibG9jay5tSW1wbCkgeworICAgICAgICByZXR1cm4gYmxvY2subUltcGwtPnBvb2xEYXRhKCk7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqY0hhbmRsZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmZGF0YSkgeworICAgIC8vIFRPRE86IGdldCBwcm9wZXIgYWxsb2NhdG9yPyBhbmQgbXV0ZXg/CisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMkFsbG9jYXRvckdyYWxsb2M+IHNBbGxvY2F0b3IgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyQWxsb2NhdG9yR3JhbGxvYz4oMCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgaWYgKEMyQWxsb2NhdG9yR3JhbGxvYzo6aXNWYWxpZChjSGFuZGxlKSkgeworICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY2xvbmUoY0hhbmRsZSk7CisgICAgICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHNBbGxvY2F0b3ItPnByaW9yR3JhcGhpY0FsbG9jYXRpb24oaGFuZGxlLCAmYWxsb2MpOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUG9vbGVkQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sRGF0YT4oZGF0YSk7CisgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LICYmIHBvb2xEYXRhKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogY29uZmlnIHNldHVwPworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2sgPQorICAgICAgICAgICAgICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soYWxsb2MsIHBvb2xEYXRhKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYmxvY2s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9OworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBCVUZGRVIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworY2xhc3MgQzJCdWZmZXJEYXRhOjpJbXBsIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbXBsKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gJmJsb2NrcykKKyAgICAgICAgOiBtVHlwZShibG9ja3Muc2l6ZSgpID09IDEgPyBMSU5FQVIgOiBMSU5FQVJfQ0hVTktTKSwKKyAgICAgICAgICBtTGluZWFyQmxvY2tzKGJsb2NrcykgeworICAgIH0KKworICAgIGV4cGxpY2l0IEltcGwoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gJmJsb2NrcykKKyAgICAgICAgOiBtVHlwZShibG9ja3Muc2l6ZSgpID09IDEgPyBHUkFQSElDIDogR1JBUEhJQ19DSFVOS1MpLAorICAgICAgICAgIG1HcmFwaGljQmxvY2tzKGJsb2NrcykgeworICAgIH0KKworICAgIHR5cGVfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gbVR5cGU7IH0KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+ICZsaW5lYXJCbG9ja3MoKSBjb25zdCB7IHJldHVybiBtTGluZWFyQmxvY2tzOyB9CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gJmdyYXBoaWNCbG9ja3MoKSBjb25zdCB7IHJldHVybiBtR3JhcGhpY0Jsb2NrczsgfQorCitwcml2YXRlOgorICAgIHR5cGVfdCBtVHlwZTsKKyAgICBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+IG1MaW5lYXJCbG9ja3M7CisgICAgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gbUdyYXBoaWNCbG9ja3M7Cit9OworCitDMkJ1ZmZlckRhdGE6OkMyQnVmZmVyRGF0YShjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+ICZibG9ja3MpIDogbUltcGwobmV3IEltcGwoYmxvY2tzKSkge30KK0MyQnVmZmVyRGF0YTo6QzJCdWZmZXJEYXRhKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+ICZibG9ja3MpIDogbUltcGwobmV3IEltcGwoYmxvY2tzKSkge30KKworQzJCdWZmZXJEYXRhOjp0eXBlX3QgQzJCdWZmZXJEYXRhOjp0eXBlKCkgY29uc3QgeyByZXR1cm4gbUltcGwtPnR5cGUoKTsgfQorCitjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+IEMyQnVmZmVyRGF0YTo6bGluZWFyQmxvY2tzKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+bGluZWFyQmxvY2tzKCk7Cit9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+IEMyQnVmZmVyRGF0YTo6Z3JhcGhpY0Jsb2NrcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdyYXBoaWNCbG9ja3MoKTsKK30KKworY2xhc3MgQzJCdWZmZXI6OkltcGwgeworcHVibGljOgorICAgIEltcGwoQzJCdWZmZXIgKnRoaXosIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gJmJsb2NrcykKKyAgICAgICAgOiBtVGhpcyh0aGl6KSwgbURhdGEoYmxvY2tzKSB7fQorICAgIEltcGwoQzJCdWZmZXIgKnRoaXosIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+ICZibG9ja3MpCisgICAgICAgIDogbVRoaXModGhpeiksIG1EYXRhKGJsb2Nrcykge30KKworICAgIH5JbXBsKCkgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnBhaXIgOiBtTm90aWZ5KSB7CisgICAgICAgICAgICBwYWlyLmZpcnN0KG1UaGlzLCBwYWlyLnNlY29uZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBDMkJ1ZmZlckRhdGEgJmRhdGEoKSBjb25zdCB7IHJldHVybiBtRGF0YTsgfQorCisgICAgYzJfc3RhdHVzX3QgcmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoT25EZXN0cm95Tm90aWZ5IG9uRGVzdHJveU5vdGlmeSwgdm9pZCAqYXJnKSB7CisgICAgICAgIGF1dG8gaXQgPSBzdGQ6OmZpbmRfaWYoCisgICAgICAgICAgICAgICAgbU5vdGlmeS5iZWdpbigpLCBtTm90aWZ5LmVuZCgpLAorICAgICAgICAgICAgICAgIFtvbkRlc3Ryb3lOb3RpZnksIGFyZ10gKGNvbnN0IGF1dG8gJnBhaXIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhaXIuZmlyc3QgPT0gb25EZXN0cm95Tm90aWZ5ICYmIHBhaXIuc2Vjb25kID09IGFyZzsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKGl0ICE9IG1Ob3RpZnkuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9EVVBMSUNBVEU7CisgICAgICAgIH0KKyAgICAgICAgbU5vdGlmeS5lbXBsYWNlX2JhY2sob25EZXN0cm95Tm90aWZ5LCBhcmcpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgdW5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeShPbkRlc3Ryb3lOb3RpZnkgb25EZXN0cm95Tm90aWZ5LCB2b2lkICphcmcpIHsKKyAgICAgICAgYXV0byBpdCA9IHN0ZDo6ZmluZF9pZigKKyAgICAgICAgICAgICAgICBtTm90aWZ5LmJlZ2luKCksIG1Ob3RpZnkuZW5kKCksCisgICAgICAgICAgICAgICAgW29uRGVzdHJveU5vdGlmeSwgYXJnXSAoY29uc3QgYXV0byAmcGFpcikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFpci5maXJzdCA9PSBvbkRlc3Ryb3lOb3RpZnkgJiYgcGFpci5zZWNvbmQgPT0gYXJnOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoaXQgPT0gbU5vdGlmeS5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIEMyX05PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBtTm90aWZ5LmVyYXNlKGl0KTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+PiBpbmZvKCkgY29uc3QgeworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPj4gcmVzdWx0KG1JbmZvcy5zaXplKCkpOworICAgICAgICBzdGQ6OnRyYW5zZm9ybSgKKyAgICAgICAgICAgICAgICBtSW5mb3MuYmVnaW4oKSwgbUluZm9zLmVuZCgpLCByZXN1bHQuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICBbXSAoY29uc3QgYXV0byAmZWxlbSkgeyByZXR1cm4gZWxlbS5zZWNvbmQ7IH0pOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGMyX3N0YXR1c190IHNldEluZm8oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gJmluZm8pIHsKKyAgICAgICAgLy8gVG8gInVwZGF0ZSIgeW91IG5lZWQgdG8gZXJhc2UgdGhlIGV4aXN0aW5nIG9uZSBpZiBhbnksIGFuZCB0aGVuIGluc2VydC4KKyAgICAgICAgKHZvaWQpIG1JbmZvcy5lcmFzZShpbmZvLT5jb3JlSW5kZXgoKSk7CisgICAgICAgICh2b2lkKSBtSW5mb3MuaW5zZXJ0KHsgaW5mby0+Y29yZUluZGV4KCksIGluZm8gfSk7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBib29sIGhhc0luZm8oQzJQYXJhbTo6VHlwZSBpbmRleCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUluZm9zLmNvdW50KGluZGV4LmNvcmVJbmRleCgpKSA+IDA7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4gZ2V0SW5mbyhDMlBhcmFtOjpUeXBlIGluZGV4KSBjb25zdCB7CisgICAgICAgIGF1dG8gaXQgPSBtSW5mb3MuZmluZChpbmRleC5jb3JlSW5kZXgoKSk7CisgICAgICAgIGlmIChpdCA9PSBtSW5mb3MuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGQ6OmNvbnN0X3BvaW50ZXJfY2FzdDxjb25zdCBDMkluZm8+KGl0LT5zZWNvbmQpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkluZm8+IHJlbW92ZUluZm8oQzJQYXJhbTo6VHlwZSBpbmRleCkgeworICAgICAgICBhdXRvIGl0ID0gbUluZm9zLmZpbmQoaW5kZXguY29yZUluZGV4KCkpOworICAgICAgICBpZiAoaXQgPT0gbUluZm9zLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvPiByZXQgPSBpdC0+c2Vjb25kOworICAgICAgICAodm9pZCkgbUluZm9zLmVyYXNlKGl0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQzJCdWZmZXIgKiBjb25zdCBtVGhpczsKKyAgICBCdWZmZXJEYXRhQnVkZHkgbURhdGE7CisgICAgc3RkOjptYXA8QzJQYXJhbTo6Q29yZUluZGV4LCBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvPj4gbUluZm9zOworICAgIHN0ZDo6bGlzdDxzdGQ6OnBhaXI8T25EZXN0cm95Tm90aWZ5LCB2b2lkICo+PiBtTm90aWZ5OworfTsKKworQzJCdWZmZXI6OkMyQnVmZmVyKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gJmJsb2NrcykKKyAgICA6IG1JbXBsKG5ldyBJbXBsKHRoaXMsIGJsb2NrcykpIHt9CisKK0MyQnVmZmVyOjpDMkJ1ZmZlcihjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiAmYmxvY2tzKQorICAgIDogbUltcGwobmV3IEltcGwodGhpcywgYmxvY2tzKSkge30KKworY29uc3QgQzJCdWZmZXJEYXRhIEMyQnVmZmVyOjpkYXRhKCkgY29uc3QgeyByZXR1cm4gbUltcGwtPmRhdGEoKTsgfQorCitjMl9zdGF0dXNfdCBDMkJ1ZmZlcjo6cmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoT25EZXN0cm95Tm90aWZ5IG9uRGVzdHJveU5vdGlmeSwgdm9pZCAqYXJnKSB7CisgICAgcmV0dXJuIG1JbXBsLT5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeShvbkRlc3Ryb3lOb3RpZnksIGFyZyk7Cit9CisKK2MyX3N0YXR1c190IEMyQnVmZmVyOjp1bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KE9uRGVzdHJveU5vdGlmeSBvbkRlc3Ryb3lOb3RpZnksIHZvaWQgKmFyZykgeworICAgIHJldHVybiBtSW1wbC0+dW5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeShvbkRlc3Ryb3lOb3RpZnksIGFyZyk7Cit9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+PiBDMkJ1ZmZlcjo6aW5mbygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmluZm8oKTsKK30KKworYzJfc3RhdHVzX3QgQzJCdWZmZXI6OnNldEluZm8oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gJmluZm8pIHsKKyAgICByZXR1cm4gbUltcGwtPnNldEluZm8oaW5mbyk7Cit9CisKK2Jvb2wgQzJCdWZmZXI6Omhhc0luZm8oQzJQYXJhbTo6VHlwZSBpbmRleCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+aGFzSW5mbyhpbmRleCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+IEMyQnVmZmVyOjpnZXRJbmZvKEMyUGFyYW06OlR5cGUgaW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldEluZm8oaW5kZXgpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvPiBDMkJ1ZmZlcjo6cmVtb3ZlSW5mbyhDMlBhcmFtOjpUeXBlIGluZGV4KSB7CisgICAgcmV0dXJuIG1JbXBsLT5yZW1vdmVJbmZvKGluZGV4KTsKK30KKworLy8gc3RhdGljCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IEMyQnVmZmVyOjpDcmVhdGVMaW5lYXJCdWZmZXIoY29uc3QgQzJDb25zdExpbmVhckJsb2NrICZibG9jaykgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+KG5ldyBDMkJ1ZmZlcih7IGJsb2NrIH0pKTsKK30KKworLy8gc3RhdGljCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IEMyQnVmZmVyOjpDcmVhdGVHcmFwaGljQnVmZmVyKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2sgJmJsb2NrKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4obmV3IEMyQnVmZmVyKHsgYmxvY2sgfSkpOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9DMkNvbmZpZy5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkNvbmZpZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgyYmVjNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL0MyQ29uZmlnLmNwcApAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJDb25maWciCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKy8qKgorICogRGVmaW5lIGFuZCBpbml0aWFsaXplIGdsb2JhbCBjb25maWcgZmllbGQgZGVzY3JpcHRvcnMgaW4gdGhpcyBjcHAgZmlsZQorICovCisjZGVmaW5lIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXworI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisKK0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIoQzJDb25maWc6OnByb2ZpbGVfdCwgKHsKKyAgICAgICAgeyAidW51c2VkIiwgQzJDb25maWc6OlBST0ZJTEVfVU5VU0VEIH0sCisgICAgICAgIHsgImFhYy1sYyIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MQyB9LAorICAgICAgICB7ICJhYWMtbWFpbiIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19NQUlOIH0sCisgICAgICAgIHsgImFhYy1zc3IiLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfU1NSIH0sCisgICAgICAgIHsgImFhYy1sdHAiLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTFRQIH0sCisgICAgICAgIHsgImFhYy1oZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19IRSB9LAorICAgICAgICB7ICJhYWMtc2NhbGFibGUiLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfU0NBTEFCTEUgfSwKKyAgICAgICAgeyAiYWFjLWVyLWxjIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX0VSX0xDIH0sCisgICAgICAgIHsgImFhYy1lci1zY2FsYWJsZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FUl9TQ0FMQUJMRSB9LAorICAgICAgICB7ICJhYWMtbGQiLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEQgfSwKKyAgICAgICAgeyAiYWFjLWhlLXBzIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX0hFX1BTIH0sCisgICAgICAgIHsgImFhYy1lbGQiLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfRUxEIH0sCisgICAgICAgIHsgImFhYy14aGUiLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfWEhFIH0sCisgICAgICAgIHsgIm1wMnYtc2ltcGxlIiwgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9TSU1QTEUgfSwKKyAgICAgICAgeyAibXAydi1tYWluIiwgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9NQUlOIH0sCisgICAgICAgIHsgIm1wMnYtc25yLXNjYWxhYmxlIiwgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9TTlJfU0NBTEFCTEUgfSwKKyAgICAgICAgeyAibXAydi1zcGF0aWFsbHktc2NhbGFibGUiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX1NQQVRJQUxMWV9TQ0FMQUJMRSB9LAorICAgICAgICB7ICJtcDJ2LWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX0hJR0ggfSwKKyAgICAgICAgeyAibXAydi00MjIiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDJWXzQyMiB9LAorICAgICAgICB7ICJtcDJ2LW11bHRpdmlldyIsIEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfTVVMVElWSUVXIH0sCisgICAgICAgIHsgImgyNjMtYmFzZWxpbmUiLCBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0JBU0VMSU5FIH0sCisgICAgICAgIHsgImgyNjMtaDMyMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSDMyMCB9LAorICAgICAgICB7ICJoMjYzLXYxYmMiLCBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX1YxQkMgfSwKKyAgICAgICAgeyAiaDI2My1pc3d2MiIsIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSVNXVjIgfSwKKyAgICAgICAgeyAiaDI2My1pc3d2MyIsIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSVNXVjMgfSwKKyAgICAgICAgeyAiaDI2My1oaWdoLWNvbXByZXNzaW9uIiwgQzJDb25maWc6OlBST0ZJTEVfSDI2M19ISUdIX0NPTVBSRVNTSU9OIH0sCisgICAgICAgIHsgImgyNjMtaW50ZXJuZXQiLCBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0lOVEVSTkVUIH0sCisgICAgICAgIHsgImgyNjMtaW50ZXJsYWNlIiwgQzJDb25maWc6OlBST0ZJTEVfSDI2M19JTlRFUkxBQ0UgfSwKKyAgICAgICAgeyAiaDI2My1oaWdoLWxhdGVuY3kiLCBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0hJR0hfTEFURU5DWSB9LAorICAgICAgICB7ICJtcDR2LXNpbXBsZSIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfU0lNUExFIH0sCisgICAgICAgIHsgIm1wNHYtc2ltcGxlLXNjYWxhYmxlIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9TSU1QTEVfU0NBTEFCTEUgfSwKKyAgICAgICAgeyAibXA0di1jb3JlIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9DT1JFIH0sCisgICAgICAgIHsgIm1wNHYtbWFpbiIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfTUFJTiB9LAorICAgICAgICB7ICJtcDR2LW5iaXQiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX05CSVQgfSwKKyAgICAgICAgeyAibXA0di1hcnRzIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9BUlRTIH0sCisgICAgICAgIHsgIm1wNHYtY29yZS1zY2FsYWJsZSIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQ09SRV9TQ0FMQUJMRSB9LAorICAgICAgICB7ICJtcDR2LWFjZSIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQUNFIH0sCisgICAgICAgIHsgIm1wNHYtYWR2YW5jZWQtY29yZSIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQURWQU5DRURfQ09SRSB9LAorICAgICAgICB7ICJtcDR2LXNpbXBsZS1zdHVkaW8iLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX1NJTVBMRV9TVFVESU8gfSwKKyAgICAgICAgeyAibXA0di1jb3JlLXN0dWRpbyIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQ09SRV9TVFVESU8gfSwKKyAgICAgICAgeyAibXA0di1hZHZhbmNlZC1zaW1wbGUiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX0FEVkFOQ0VEX1NJTVBMRSB9LAorICAgICAgICB7ICJtcDR2LWZncyIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfRkdTIH0sCisgICAgICAgIHsgImF2Yy1iYXNlbGluZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19CQVNFTElORSB9LAorICAgICAgICB7ICJhdmMtY29uc3RyYWluZWQtYmFzZWxpbmUiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQ09OU1RSQUlORURfQkFTRUxJTkUgfSwKKyAgICAgICAgeyAiYXZjLW1haW4iLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfTUFJTiB9LAorICAgICAgICB7ICJhdmMtZXh0ZW5kZWQiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfRVhURU5ERUQgfSwKKyAgICAgICAgeyAiYXZjLWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSCB9LAorICAgICAgICB7ICJhdmMtcHJvZ3Jlc3NpdmUtaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19QUk9HUkVTU0lWRV9ISUdIIH0sCisgICAgICAgIHsgImF2Yy1jb25zdHJhaW5lZC1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0hJR0ggfSwKKyAgICAgICAgeyAiYXZjLWhpZ2gtMTAiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSF8xMCB9LAorICAgICAgICB7ICJhdmMtcHJvZ3Jlc3NpdmUtaGlnaC0xMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19QUk9HUkVTU0lWRV9ISUdIXzEwIH0sCisgICAgICAgIHsgImF2Yy1oaWdoLTQyMiIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzQyMiB9LAorICAgICAgICB7ICJhdmMtaGlnaC00NDQtcHJlZGljdGl2ZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzQ0NF9QUkVESUNUSVZFIH0sCisgICAgICAgIHsgImF2Yy1oaWdoLTEwLWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfMTBfSU5UUkEgfSwKKyAgICAgICAgeyAiYXZjLWhpZ2gtNDIyLWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfNDIyX0lOVFJBIH0sCisgICAgICAgIHsgImF2Yy1oaWdoLTQ0NC1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzQ0NF9JTlRSQSB9LAorICAgICAgICB7ICJhdmMtY2F2bGMtNDQ0LWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0NBVkxDXzQ0NF9JTlRSQSB9LAorICAgICAgICB7ICJhdmMtc2NhbGFibGUtYmFzZWxpbmUiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfU0NBTEFCTEVfQkFTRUxJTkUgfSwKKyAgICAgICAgeyAiYXZjLXNjYWxhYmxlLWNvbnN0cmFpbmVkLWJhc2VsaW5lIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX1NDQUxBQkxFX0NPTlNUUkFJTkVEX0JBU0VMSU5FIH0sCisgICAgICAgIHsgImF2Yy1zY2FsYWJsZS1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX1NDQUxBQkxFX0hJR0ggfSwKKyAgICAgICAgeyAiYXZjLXNjYWxhYmxlLWNvbnN0cmFpbmVkLWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfU0NBTEFCTEVfQ09OU1RSQUlORURfSElHSCB9LAorICAgICAgICB7ICJhdmMtc2NhbGFibGUtaGlnaC1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19TQ0FMQUJMRV9ISUdIX0lOVFJBIH0sCisgICAgICAgIHsgImF2Yy1tdWx0aXZpZXctaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19NVUxUSVZJRVdfSElHSCB9LAorICAgICAgICB7ICJhdmMtc3RlcmVvLWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfU1RFUkVPX0hJR0ggfSwKKyAgICAgICAgeyAiYXZjLW1mYy1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX01GQ19ISUdIIH0sCisgICAgICAgIHsgImF2Yy1tdWx0aXZpZXctZGVwdGgtaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19NVUxUSVZJRVdfREVQVEhfSElHSCB9LAorICAgICAgICB7ICJhdmMtbWZjLWRlcHRoLWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfTUZDX0RFUFRIX0hJR0ggfSwKKyAgICAgICAgeyAiYXZjLWVuaGFuY2VkLW11bHRpdmlldy1kZXB0aC1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0VOSEFOQ0VEX01VTFRJVklFV19ERVBUSF9ISUdIIH0sCisgICAgICAgIHsgImhldmMtbWFpbiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTiB9LAorICAgICAgICB7ICJoZXZjLW1haW4tMTAiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fMTAgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLXN0aWxsIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOX1NUSUxMIH0sCisgICAgICAgIHsgImhldmMtbW9ubyIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTU9OTyB9LAorICAgICAgICB7ICJoZXZjLW1vbm8tMTIiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01PTk9fMTIgfSwKKyAgICAgICAgeyAiaGV2Yy1tb25vLTE2IiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NT05PXzE2IH0sCisgICAgICAgIHsgImhldmMtbWFpbi0xMiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl8xMiB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDIyLTEwIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQyMl8xMCB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDIyLTEyIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQyMl8xMiB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDQ0IiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQ0NCB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDQ0LTEwIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQ0NF8xMCB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDQ0LTEyIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQ0NF8xMiB9LAorICAgICAgICB7ICJoZXZjLW1haW4taW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fSU5UUkEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTEwLWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzEwX0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtbWFpbi0xMi1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl8xMl9JTlRSQSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDIyLTEwLWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQyMl8xMF9JTlRSQSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDIyLTEyLWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQyMl8xMl9JTlRSQSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDQ0LWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQ0NF9JTlRSQSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDQ0LTEwLWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQ0NF8xMF9JTlRSQSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDQ0LTEyLWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQ0NF8xMl9JTlRSQSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDQ0LTE2LWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQ0NF8xNl9JTlRSQSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDQ0LXN0aWxsIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQ0NF9TVElMTCB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNDQ0LTE2LXN0aWxsIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzQ0NF8xNl9TVElMTCB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNDQ0IiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19ISUdIXzQ0NCB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNDQ0LTEwIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19ISUdIXzQ0NF8xMCB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNDQ0LTE0IiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19ISUdIXzQ0NF8xNCB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNDQ0LTE2LWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19ISUdIXzQ0NF8xNl9JTlRSQSB9LAorICAgICAgICB7ICJoZXZjLXN4LW1haW4iLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NYX01BSU4gfSwKKyAgICAgICAgeyAiaGV2Yy1zeC1tYWluLTEwIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TWF9NQUlOXzEwIH0sCisgICAgICAgIHsgImhldmMtc3gtbWFpbi00NDQiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NYX01BSU5fNDQ0IH0sCisgICAgICAgIHsgImhldmMtc3gtbWFpbi00NDQtMTAiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NYX01BSU5fNDQ0XzEwIH0sCisgICAgICAgIHsgImhldmMtc3gtaGlnaC00NDQiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NYX0hJR0hfNDQ0IH0sCisgICAgICAgIHsgImhldmMtc3gtaGlnaC00NDQtMTAiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NYX0hJR0hfNDQ0XzEwIH0sCisgICAgICAgIHsgImhldmMtc3gtaGlnaC00NDQtMTQiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NYX0hJR0hfNDQ0XzE0IH0sCisgICAgICAgIHsgImhldmMtbXVsdGl2aWV3LW1haW4iLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01VTFRJVklFV19NQUlOIH0sCisgICAgICAgIHsgImhldmMtc2NhbGFibGUtbWFpbiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU0NBTEFCTEVfTUFJTiB9LAorICAgICAgICB7ICJoZXZjLXNjYWxhYmxlLW1haW4tMTAiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NDQUxBQkxFX01BSU5fMTAgfSwKKyAgICAgICAgeyAiaGV2Yy1zY2FsYWJsZS1tb25vIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TQ0FMQUJMRV9NT05PIH0sCisgICAgICAgIHsgImhldmMtc2NhbGFibGUtbW9uby0xMiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU0NBTEFCTEVfTU9OT18xMiB9LAorICAgICAgICB7ICJoZXZjLXNjYWxhYmxlLW1vbm8tMTYiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NDQUxBQkxFX01PTk9fMTYgfSwKKyAgICAgICAgeyAiaGV2Yy1zY2FsYWJsZS1tYWluLTQ0NCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU0NBTEFCTEVfTUFJTl80NDQgfSwKKyAgICAgICAgeyAiaGV2Yy0zZC1tYWluIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ18zRF9NQUlOIH0sCisgICAgICAgIHsgInZwOS0wIiwgQzJDb25maWc6OlBST0ZJTEVfVlA5XzAgfSwKKyAgICAgICAgeyAidnA5LTEiLCBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMSB9LAorICAgICAgICB7ICJ2cDktMiIsIEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8yIH0sCisgICAgICAgIHsgInZwOS0zIiwgQzJDb25maWc6OlBST0ZJTEVfVlA5XzMgfSwKKyAgICAgICAgeyAiYXYxLTAiLCBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCB9LAorICAgICAgICB7ICJhdjEtMSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWMV8xIH0sCisgICAgICAgIHsgImF2MS0yIiwgQzJDb25maWc6OlBST0ZJTEVfQVYxXzIgfSwKK30pKQorCitERUZJTkVfQzJfRU5VTV9WQUxVRV9DVVNUT01fSEVMUEVSKEMyQ29uZmlnOjpsZXZlbF90LCAoeworICAgICAgICB7ICJ1bnVzZWQiLCBDMkNvbmZpZzo6TEVWRUxfVU5VU0VEIH0sCisgICAgICAgIHsgIm1wMnYtbG93IiwgQzJDb25maWc6OkxFVkVMX01QMlZfTE9XIH0sCisgICAgICAgIHsgIm1wMnYtbWFpbiIsIEMyQ29uZmlnOjpMRVZFTF9NUDJWX01BSU4gfSwKKyAgICAgICAgeyAibXAydi1oaWdoLTE0NDAiLCBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdIXzE0NDAgfSwKKyAgICAgICAgeyAibXAydi1oaWdoIiwgQzJDb25maWc6OkxFVkVMX01QMlZfSElHSCB9LAorICAgICAgICB7ICJtcDJ2LWhpZ2hwIiwgQzJDb25maWc6OkxFVkVMX01QMlZfSElHSFAgfSwKKyAgICAgICAgeyAiaDI2My0xMCIsIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzEwIH0sCisgICAgICAgIHsgImgyNjMtMjAiLCBDMkNvbmZpZzo6TEVWRUxfSDI2M18yMCB9LAorICAgICAgICB7ICJoMjYzLTMwIiwgQzJDb25maWc6OkxFVkVMX0gyNjNfMzAgfSwKKyAgICAgICAgeyAiaDI2My00MCIsIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzQwIH0sCisgICAgICAgIHsgImgyNjMtNDUiLCBDMkNvbmZpZzo6TEVWRUxfSDI2M180NSB9LAorICAgICAgICB7ICJoMjYzLTUwIiwgQzJDb25maWc6OkxFVkVMX0gyNjNfNTAgfSwKKyAgICAgICAgeyAiaDI2My02MCIsIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzYwIH0sCisgICAgICAgIHsgImgyNjMtNzAiLCBDMkNvbmZpZzo6TEVWRUxfSDI2M183MCB9LAorICAgICAgICB7ICJtcDR2LTAiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8wIH0sCisgICAgICAgIHsgIm1wNHYtMGIiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8wQiB9LAorICAgICAgICB7ICJtcDR2LTEiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8xIH0sCisgICAgICAgIHsgIm1wNHYtMiIsIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzIgfSwKKyAgICAgICAgeyAibXA0di0zIiwgQzJDb25maWc6OkxFVkVMX01QNFZfMyB9LAorICAgICAgICB7ICJtcDR2LTNiIiwgQzJDb25maWc6OkxFVkVMX01QNFZfM0IgfSwKKyAgICAgICAgeyAibXA0di00IiwgQzJDb25maWc6OkxFVkVMX01QNFZfNCB9LAorICAgICAgICB7ICJtcDR2LTRhIiwgQzJDb25maWc6OkxFVkVMX01QNFZfNEEgfSwKKyAgICAgICAgeyAibXA0di01IiwgQzJDb25maWc6OkxFVkVMX01QNFZfNSB9LAorICAgICAgICB7ICJtcDR2LTYiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl82IH0sCisgICAgICAgIHsgImF2Yy0xIiwgQzJDb25maWc6OkxFVkVMX0FWQ18xIH0sCisgICAgICAgIHsgImF2Yy0xYiIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMUIgfSwKKyAgICAgICAgeyAiYXZjLTEuMSIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMV8xIH0sCisgICAgICAgIHsgImF2Yy0xLjIiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzFfMiB9LAorICAgICAgICB7ICJhdmMtMS4zIiwgQzJDb25maWc6OkxFVkVMX0FWQ18xXzMgfSwKKyAgICAgICAgeyAiYXZjLTIiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzIgfSwKKyAgICAgICAgeyAiYXZjLTIuMSIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMl8xIH0sCisgICAgICAgIHsgImF2Yy0yLjIiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzJfMiB9LAorICAgICAgICB7ICJhdmMtMyIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMyB9LAorICAgICAgICB7ICJhdmMtMy4xIiwgQzJDb25maWc6OkxFVkVMX0FWQ18zXzEgfSwKKyAgICAgICAgeyAiYXZjLTMuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfM18yIH0sCisgICAgICAgIHsgImF2Yy00IiwgQzJDb25maWc6OkxFVkVMX0FWQ180IH0sCisgICAgICAgIHsgImF2Yy00LjEiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzRfMSB9LAorICAgICAgICB7ICJhdmMtNC4yIiwgQzJDb25maWc6OkxFVkVMX0FWQ180XzIgfSwKKyAgICAgICAgeyAiYXZjLTUiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzUgfSwKKyAgICAgICAgeyAiYXZjLTUuMSIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNV8xIH0sCisgICAgICAgIHsgImF2Yy01LjIiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzVfMiB9LAorICAgICAgICB7ICJoZXZjLW1haW4tMSIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tMiIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMiB9LAorICAgICAgICB7ICJoZXZjLW1haW4tMi4xIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8yXzEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTMiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzMgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTMuMSIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fM18xIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00IiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl80IH0sCisgICAgICAgIHsgImhldmMtbWFpbi00LjEiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzRfMSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNSIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNS4xIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl81XzEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTUuMiIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNV8yIH0sCisgICAgICAgIHsgImhldmMtbWFpbi02IiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl82IH0sCisgICAgICAgIHsgImhldmMtbWFpbi02LjEiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzZfMSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNi4yIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl82XzIgfSwKKyAgICAgICAgeyAiaGV2Yy1oaWdoLTQiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzQgfSwKKyAgICAgICAgeyAiaGV2Yy1oaWdoLTQuMSIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNF8xIH0sCisgICAgICAgIHsgImhldmMtaGlnaC01IiwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF81IH0sCisgICAgICAgIHsgImhldmMtaGlnaC01LjEiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzVfMSB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNS4yIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF81XzIgfSwKKyAgICAgICAgeyAiaGV2Yy1oaWdoLTYiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzYgfSwKKyAgICAgICAgeyAiaGV2Yy1oaWdoLTYuMSIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNl8xIH0sCisgICAgICAgIHsgImhldmMtaGlnaC02LjIiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzZfMiB9LAorICAgICAgICB7ICJ2cDktMSIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfMSB9LAorICAgICAgICB7ICJ2cDktMS4xIiwgQzJDb25maWc6OkxFVkVMX1ZQOV8xXzEgfSwKKyAgICAgICAgeyAidnA5LTIiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzIgfSwKKyAgICAgICAgeyAidnA5LTIuMSIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfMl8xIH0sCisgICAgICAgIHsgInZwOS0zIiwgQzJDb25maWc6OkxFVkVMX1ZQOV8zIH0sCisgICAgICAgIHsgInZwOS0zLjEiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzNfMSB9LAorICAgICAgICB7ICJ2cDktNCIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfNCB9LAorICAgICAgICB7ICJ2cDktNC4xIiwgQzJDb25maWc6OkxFVkVMX1ZQOV80XzEgfSwKKyAgICAgICAgeyAidnA5LTUiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzUgfSwKKyAgICAgICAgeyAidnA5LTUuMSIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfNV8xIH0sCisgICAgICAgIHsgInZwOS01LjIiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzVfMiB9LAorICAgICAgICB7ICJ2cDktNiIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfNiB9LAorICAgICAgICB7ICJ2cDktNi4xIiwgQzJDb25maWc6OkxFVkVMX1ZQOV82XzEgfSwKKyAgICAgICAgeyAidnA5LTYuMiIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfNl8yIH0sCit9KSkKKworREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUihDMkJ1ZmZlckRhdGE6OnR5cGVfdCwgKHsKKyAgICAgICAgeyAiaW52YWxpZCIsICAgICAgICBDMkJ1ZmZlckRhdGE6OklOVkFMSUQgfSwKKyAgICAgICAgeyAibGluZWFyIiwgICAgICAgICBDMkJ1ZmZlckRhdGE6OkxJTkVBUiB9LAorICAgICAgICB7ICJsaW5lYXItY2h1bmtzIiwgIEMyQnVmZmVyRGF0YTo6TElORUFSX0NIVU5LUyB9LAorICAgICAgICB7ICJncmFwaGljIiwgICAgICAgIEMyQnVmZmVyRGF0YTo6R1JBUEhJQyB9LAorICAgICAgICB7ICJncmFwaGljLWNodW5rcyIsIEMyQnVmZmVyRGF0YTo6R1JBUEhJQ19DSFVOS1MgfSwKK30pKQorCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0MyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9DMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMzMwZTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9DMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIuY3BwCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlciIKKworI2luY2x1ZGUgPGRsZmNuLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5oIgorCisvKiBzdGF0aWMgKi8gYW5kcm9pZDo6TXV0ZXggQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyOjpzTXV0ZXg7CisvKiBzdGF0aWMgKi8gc3RkOjp1bmlxdWVfcHRyPEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcj4gQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyOjpzSW5zdGFuY2U7CisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworY29uc3RleHByIGNvbnN0IGNoYXIga1N0b3JlUGx1Z2luUGF0aFtdID0gImxpYmMycGx1Z2luX3N0b3JlLnNvIjsKKworfSAgLy8gdW5uYW1lZAorCitDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI6OkMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcihjb25zdCBjaGFyICpsaWJQYXRoKQorICAgIDogbUNyZWF0ZUJsb2NrUG9vbChudWxscHRyKSB7CisgICAgbUxpYkhhbmRsZSA9IGRsb3BlbihsaWJQYXRoLCBSVExEX05PVyB8IFJUTERfTk9ERUxFVEUpOworICAgIGlmIChtTGliSGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoIkZhaWxlZCB0byBsb2FkIGxpYnJhcnk6ICVzICglcykiLCBsaWJQYXRoLCBkbGVycm9yKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1DcmVhdGVCbG9ja1Bvb2wgPSAoQ3JlYXRlQmxvY2tQb29sRnVuYylkbHN5bShtTGliSGFuZGxlLCAiQ3JlYXRlQmxvY2tQb29sIik7CisgICAgaWYgKG1DcmVhdGVCbG9ja1Bvb2wgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIGZpbmQgc3ltYm9sOiBDcmVhdGVCbG9ja1Bvb2wgKCVzKSIsIGRsZXJyb3IoKSk7CisgICAgfQorICAgIG1DcmVhdGVBbGxvY2F0b3IgPSAoQ3JlYXRlQWxsb2NhdG9yRnVuYylkbHN5bShtTGliSGFuZGxlLCAiQ3JlYXRlQWxsb2NhdG9yIik7CisgICAgaWYgKG1DcmVhdGVBbGxvY2F0b3IgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIGZpbmQgc3ltYm9sOiBDcmVhdGVBbGxvY2F0b3IgKCVzKSIsIGRsZXJyb3IoKSk7CisgICAgfQorfQorCitDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI6On5DMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIoKSB7CisgICAgaWYgKG1MaWJIYW5kbGUgIT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVigiQ2xvc2luZyBoYW5kbGUiKTsKKyAgICAgICAgZGxjbG9zZShtTGliSGFuZGxlKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcjo6Y3JlYXRlQmxvY2tQb29sKAorICAgICAgICA6OkMyQWxsb2NhdG9yOjppZF90IGFsbG9jYXRvcklkLCA6OkMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGJsb2NrUG9vbElkLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+KiBwb29sKSB7CisgICAgaWYgKG1DcmVhdGVCbG9ja1Bvb2wgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiSGFuZGxlIG9yIENyZWF0ZUJsb2NrUG9vbCBzeW1ib2wgaXMgbnVsbCIpOworICAgICAgICByZXR1cm4gQzJfTk9UX0ZPVU5EOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjw6OkMyQmxvY2tQb29sPiBwdHIobUNyZWF0ZUJsb2NrUG9vbChhbGxvY2F0b3JJZCwgYmxvY2tQb29sSWQpKTsKKyAgICBpZiAocHRyKSB7CisgICAgICAgICpwb29sID0gcHRyOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIEFMT0dEKCJGYWlsZWQgdG8gQ3JlYXRlQmxvY2tQb29sIGJ5IGFsbG9jYXRvciBpZDogJXUiLCBhbGxvY2F0b3JJZCk7CisgICAgcmV0dXJuIEMyX0JBRF9JTkRFWDsKK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyOjpjcmVhdGVBbGxvY2F0b3IoCisgICAgICAgIDo6QzJBbGxvY2F0b3I6OmlkX3QgYWxsb2NhdG9ySWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4qIGNvbnN0IGFsbG9jYXRvcikgeworICAgIGlmIChtQ3JlYXRlQWxsb2NhdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoIkhhbmRsZSBvciBDcmVhdGVBbGxvY2F0b3Igc3ltYm9sIGlzIG51bGwiKTsKKyAgICAgICAgcmV0dXJuIEMyX05PVF9GT1VORDsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBDMl9DT1JSVVBURUQ7CisgICAgYWxsb2NhdG9yLT5yZXNldChtQ3JlYXRlQWxsb2NhdG9yKGFsbG9jYXRvcklkLCAmcmVzKSk7CisgICAgaWYgKHJlcyAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIENyZWF0ZUFsbG9jYXRvciBieSBpZDogJXUsIHJlczogJWQiLCBhbGxvY2F0b3JJZCwgcmVzKTsKKyAgICAgICAgYWxsb2NhdG9yLT5yZXNldCgpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKy8vIHN0YXRpYworY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcj4mIEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcjo6R2V0SW5zdGFuY2UoKSB7CisgICAgYW5kcm9pZDo6TXV0ZXg6OkF1dG9sb2NrIF9sKHNNdXRleCk7CisgICAgaWYgKCFzSW5zdGFuY2UpIHsKKyAgICAgICAgQUxPR1YoIkxvYWRpbmcgbGlicmFyeSIpOworICAgICAgICBzSW5zdGFuY2UucmVzZXQobmV3IEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcihrU3RvcmVQbHVnaW5QYXRoKSk7CisgICAgfQorICAgIHJldHVybiBzSW5zdGFuY2U7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9DMlN0b3JlLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL0MyU3RvcmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZGQyMDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9DMlN0b3JlLmNwcApAQCAtMCwwICsxLDk3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQzJTdG9yZSIKKyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkFsbG9jYXRvcklvbi5oPgorI2luY2x1ZGUgPEMyQnVmZmVyUHJpdi5oPgorI2luY2x1ZGUgPEMyQnFCdWZmZXJQcml2Lmg+CisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZUhlbHBlci5oPgorCisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4gLy8gZ2V0cGFnZXNpemUKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBwcmVmZXJyZWQgY29tcG9uZW50IHN0b3JlIGluIHRoaXMgcHJvY2VzcyB0byBhY2Nlc3MgaXRzIGludGVyZmFjZS4KKyAqLworc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IEdldFByZWZlcnJlZENvZGVjMkNvbXBvbmVudFN0b3JlKCk7CisKKy8qKgorICogVGhlIHBsYXRmb3JtIGFsbG9jYXRvciBzdG9yZSBwcm92aWRlcyBiYXNpYyBhbGxvY2F0b3ItdHlwZXMgZm9yIHRoZSBmcmFtZXdvcmsgYmFzZWQgb24gaW9uIGFuZAorICogZ3JhbGxvYy4gQWxsb2NhdG9ycyBhcmUgbm90IG1lYW50IHRvIGJlIHVwZGF0YWJsZS4KKyAqCisgKiBcdG9kbyBQcm92aWRlIGFsbG9jYXRvciBiYXNlZCBvbiBhc2htZW0KKyAqIFx0b2RvIE1vdmUgaW9uIGFsbG9jYXRpb24gaW50byBpdHMgSElETCBvciBwcm92aWRlIHNvbWUgbWFwcGluZyBmcm9tIG1lbW9yeSB1c2FnZSB0byBpb24gZmxhZ3MKKyAqIFx0b2RvIE1ha2UgdGhpcyBhbGxvY2F0b3Igc3RvcmUgZXh0ZW5kYWJsZQorICovCitjbGFzcyBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsIDogcHVibGljIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSB7CitwdWJsaWM6CisgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbCgpOworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaEFsbG9jYXRvcigKKyAgICAgICAgICAgIGlkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gKmNvbnN0IGFsbG9jYXRvcikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkFsbG9jYXRvcjo6VHJhaXRzPj4gbGlzdEFsbG9jYXRvcnNfbmIoKQorICAgICAgICAgICAgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQWxsb2NhdG9yOjpUcmFpdHM+PigpOyAvLy8gXHRvZG8KKyAgICB9CisKKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiAiYW5kcm9pZC5hbGxvY2F0b3Itc3RvcmUiOworICAgIH0KKworICAgIHZvaWQgc2V0Q29tcG9uZW50U3RvcmUoc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IHN0b3JlKTsKKworICAgIH5DMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIC8vLyByZXR1cm5zIGEgc2hhcmVkLXNpbmdsZXRvbiBpb24gYWxsb2NhdG9yCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBmZXRjaElvbkFsbG9jYXRvcigpOworCisgICAgLy8vIHJldHVybnMgYSBzaGFyZWQtc2luZ2xldG9uIGdyYWxsb2MgYWxsb2NhdG9yCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBmZXRjaEdyYWxsb2NBbGxvY2F0b3IoKTsKKworICAgIC8vLyByZXR1cm5zIGEgc2hhcmVkLXNpbmdsZXRvbiBidWZmZXJxdWV1ZSBzdXBwb3J0aW5nIGdyYWxsb2MgYWxsb2NhdG9yCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBmZXRjaEJ1ZmZlclF1ZXVlQWxsb2NhdG9yKCk7CisKKyAgICAvLy8gY29tcG9uZW50IHN0b3JlIHRvIHVzZQorICAgIHN0ZDo6bXV0ZXggX21Db21wb25lbnRTdG9yZVNldExvY2s7IC8vIHByb3RlY3RzIHRoZSBlbnRpcmUgdXBkYXRpbmcgX21Db21wb25lbnRTdG9yZSBhbmQgaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVwZW5kZW5jaWVzCisgICAgc3RkOjptdXRleCBfbUNvbXBvbmVudFN0b3JlUmVhZExvY2s7IC8vIG11c3QgcHJvdGVjdCBvbmx5IHJlYWQvd3JpdGUgb2YgX21Db21wb25lbnRTdG9yZQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBfbUNvbXBvbmVudFN0b3JlOworfTsKKworQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbDo6QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbCgpIHsKK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbDo6ZmV0Y2hBbGxvY2F0b3IoCisgICAgICAgIGlkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gKmNvbnN0IGFsbG9jYXRvcikgeworICAgIGFsbG9jYXRvci0+cmVzZXQoKTsKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgLy8gVE9ETzogc2hvdWxkIHdlIGltcGxlbWVudCBhIGdlbmVyaWMgcmVnaXN0cnkgZm9yIGFsbCwgYW5kIHVzZSB0aGF0PworICAgIGNhc2UgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpJT046CisgICAgY2FzZSBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUjoKKyAgICAgICAgKmFsbG9jYXRvciA9IGZldGNoSW9uQWxsb2NhdG9yKCk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkdSQUxMT0M6CisgICAgY2FzZSBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0dSQVBISUM6CisgICAgICAgICphbGxvY2F0b3IgPSBmZXRjaEdyYWxsb2NBbGxvY2F0b3IoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QlVGRkVSUVVFVUU6CisgICAgICAgICphbGxvY2F0b3IgPSBmZXRjaEJ1ZmZlclF1ZXVlQWxsb2NhdG9yKCk7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgLy8gVHJ5IHRvIGNyZWF0ZSBhbGxvY2F0b3IgZnJvbSBwbGF0Zm9ybSBzdG9yZSBwbHVnaW5zLgorICAgICAgICBjMl9zdGF0dXNfdCByZXMgPQorICAgICAgICAgICAgICAgIEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcjo6R2V0SW5zdGFuY2UoKS0+Y3JlYXRlQWxsb2NhdG9yKGlkLCBhbGxvY2F0b3IpOworICAgICAgICBpZiAocmVzICE9IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoKmFsbG9jYXRvciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworbmFtZXNwYWNlIHsKKworc3RkOjptdXRleCBnSW9uQWxsb2NhdG9yTXV0ZXg7CitzdGQ6OndlYWtfcHRyPEMyQWxsb2NhdG9ySW9uPiBnSW9uQWxsb2NhdG9yOworCit2b2lkIFVzZUNvbXBvbmVudFN0b3JlRm9ySW9uQWxsb2NhdG9yKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JJb24+IGFsbG9jYXRvciwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IHN0b3JlKSB7CisgICAgQzJBbGxvY2F0b3JJb246OlVzYWdlTWFwcGVyRm4gbWFwcGVyOworICAgIHVpbnQ2NF90IG1pblVzYWdlID0gMDsKKyAgICB1aW50NjRfdCBtYXhVc2FnZSA9IEMyTWVtb3J5VXNhZ2UoQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSkuZXhwZWN0ZWQ7CisgICAgc2l6ZV90IGJsb2NrU2l6ZSA9IGdldHBhZ2VzaXplKCk7CisKKyAgICAvLyBxdWVyeSBtaW4gYW5kIG1heCB1c2FnZSBhcyB3ZWxsIGFzIGJsb2NrIHNpemUgdmlhIHN1cHBvcnRlZCB2YWx1ZXMKKyAgICBDMlN0b3JlSW9uVXNhZ2VJbmZvIHVzYWdlSW5mbzsKKyAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+IHF1ZXJ5ID0geworICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlBvc3NpYmxlKEMyUGFyYW1GaWVsZDo6TWFrZSh1c2FnZUluZm8sIHVzYWdlSW5mby51c2FnZSkpLAorICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlBvc3NpYmxlKEMyUGFyYW1GaWVsZDo6TWFrZSh1c2FnZUluZm8sIHVzYWdlSW5mby5jYXBhY2l0eSkpLAorICAgIH07CisgICAgYzJfc3RhdHVzX3QgcmVzID0gc3RvcmUtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3NtKHF1ZXJ5KTsKKyAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgIGlmIChxdWVyeVswXS5zdGF0dXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJmZzdiA9IHF1ZXJ5WzBdLnZhbHVlczsKKyAgICAgICAgICAgIGlmIChmc3YudHlwZSA9PSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpGTEFHUyAmJiAhZnN2LnZhbHVlcy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgbWluVXNhZ2UgPSBmc3YudmFsdWVzWzBdLnU2NDsKKyAgICAgICAgICAgICAgICBtYXhVc2FnZSA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChDMlZhbHVlOjpQcmltaXRpdmUgdiA6IGZzdi52YWx1ZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4VXNhZ2UgfD0gdi51NjQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChxdWVyeVsxXS5zdGF0dXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJmZzdiA9IHF1ZXJ5WzFdLnZhbHVlczsKKyAgICAgICAgICAgIGlmIChmc3YudHlwZSA9PSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpSQU5HRSAmJiBmc3YucmFuZ2Uuc3RlcC51MzIgPiAwKSB7CisgICAgICAgICAgICAgICAgYmxvY2tTaXplID0gZnN2LnJhbmdlLnN0ZXAudTMyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbWFwcGVyID0gW3N0b3JlXShDMk1lbW9yeVVzYWdlIHVzYWdlLCBzaXplX3QgY2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICphbGlnbiwgdW5zaWduZWQgKmhlYXBNYXNrLCB1bnNpZ25lZCAqZmxhZ3MpIC0+IGMyX3N0YXR1c190IHsKKyAgICAgICAgICAgIGlmIChjYXBhY2l0eSA+IFVJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQzJTdG9yZUlvblVzYWdlSW5mbyB1c2FnZUluZm8gPSB7IHVzYWdlLmV4cGVjdGVkLCBjYXBhY2l0eSB9OworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOyAvLyBUT0RPOiByZW1vdmUKKyAgICAgICAgICAgIGMyX3N0YXR1c190IHJlcyA9IHN0b3JlLT5jb25maWdfc20oeyZ1c2FnZUluZm99LCAmZmFpbHVyZXMpOworICAgICAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICphbGlnbiA9IHVzYWdlSW5mby5taW5BbGlnbm1lbnQ7CisgICAgICAgICAgICAgICAgKmhlYXBNYXNrID0gdXNhZ2VJbmZvLmhlYXBNYXNrOworICAgICAgICAgICAgICAgICpmbGFncyA9IHVzYWdlSW5mby5hbGxvY0ZsYWdzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBhbGxvY2F0b3ItPnNldFVzYWdlTWFwcGVyKG1hcHBlciwgbWluVXNhZ2UsIG1heFVzYWdlLCBibG9ja1NpemUpOworfQorCit9CisKK3ZvaWQgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbDo6c2V0Q29tcG9uZW50U3RvcmUoc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IHN0b3JlKSB7CisgICAgLy8gdGVjaG5pY2FsbHkgdGhpcyBzZXQgbG9jayBpcyBub3QgbmVlZGVkLCBidXQgaXMgaGVyZSBmb3Igc2FmZXR5IGluIGNhc2Ugd2UgYWRkIG1vcmUKKyAgICAvLyBnZXR0ZXIgb3JkZXJzCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soX21Db21wb25lbnRTdG9yZVNldExvY2spOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soX21Db21wb25lbnRTdG9yZVJlYWRMb2NrKTsKKyAgICAgICAgX21Db21wb25lbnRTdG9yZSA9IHN0b3JlOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JJb24+IGFsbG9jYXRvcjsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGdJb25BbGxvY2F0b3JNdXRleCk7CisgICAgICAgIGFsbG9jYXRvciA9IGdJb25BbGxvY2F0b3IubG9jaygpOworICAgIH0KKyAgICBpZiAoYWxsb2NhdG9yKSB7CisgICAgICAgIFVzZUNvbXBvbmVudFN0b3JlRm9ySW9uQWxsb2NhdG9yKGFsbG9jYXRvciwgc3RvcmUpOworICAgIH0KK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsOjpmZXRjaElvbkFsbG9jYXRvcigpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhnSW9uQWxsb2NhdG9yTXV0ZXgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcklvbj4gYWxsb2NhdG9yID0gZ0lvbkFsbG9jYXRvci5sb2NrKCk7CisgICAgaWYgKGFsbG9jYXRvciA9PSBudWxscHRyKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBjb21wb25lbnRTdG9yZTsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soX21Db21wb25lbnRTdG9yZVJlYWRMb2NrKTsKKyAgICAgICAgICAgIGNvbXBvbmVudFN0b3JlID0gX21Db21wb25lbnRTdG9yZTsKKyAgICAgICAgfQorICAgICAgICBhbGxvY2F0b3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyQWxsb2NhdG9ySW9uPihDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OklPTik7CisgICAgICAgIFVzZUNvbXBvbmVudFN0b3JlRm9ySW9uQWxsb2NhdG9yKGFsbG9jYXRvciwgY29tcG9uZW50U3RvcmUpOworICAgICAgICBnSW9uQWxsb2NhdG9yID0gYWxsb2NhdG9yOworICAgIH0KKyAgICByZXR1cm4gYWxsb2NhdG9yOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw6OmZldGNoR3JhbGxvY0FsbG9jYXRvcigpIHsKKyAgICBzdGF0aWMgc3RkOjptdXRleCBtdXRleDsKKyAgICBzdGF0aWMgc3RkOjp3ZWFrX3B0cjxDMkFsbG9jYXRvcj4gZ3JhbGxvY0FsbG9jYXRvcjsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtdXRleCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBhbGxvY2F0b3IgPSBncmFsbG9jQWxsb2NhdG9yLmxvY2soKTsKKyAgICBpZiAoYWxsb2NhdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgYWxsb2NhdG9yID0gc3RkOjptYWtlX3NoYXJlZDxDMkFsbG9jYXRvckdyYWxsb2M+KEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6R1JBTExPQyk7CisgICAgICAgIGdyYWxsb2NBbGxvY2F0b3IgPSBhbGxvY2F0b3I7CisgICAgfQorICAgIHJldHVybiBhbGxvY2F0b3I7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbDo6ZmV0Y2hCdWZmZXJRdWV1ZUFsbG9jYXRvcigpIHsKKyAgICBzdGF0aWMgc3RkOjptdXRleCBtdXRleDsKKyAgICBzdGF0aWMgc3RkOjp3ZWFrX3B0cjxDMkFsbG9jYXRvcj4gZ3JhbGxvY0FsbG9jYXRvcjsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtdXRleCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBhbGxvY2F0b3IgPSBncmFsbG9jQWxsb2NhdG9yLmxvY2soKTsKKyAgICBpZiAoYWxsb2NhdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgYWxsb2NhdG9yID0gc3RkOjptYWtlX3NoYXJlZDxDMkFsbG9jYXRvckdyYWxsb2M+KAorICAgICAgICAgICAgICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QlVGRkVSUVVFVUUsIHRydWUpOworICAgICAgICBncmFsbG9jQWxsb2NhdG9yID0gYWxsb2NhdG9yOworICAgIH0KKyAgICByZXR1cm4gYWxsb2NhdG9yOworfQorCituYW1lc3BhY2UgeworICAgIHN0ZDo6bXV0ZXggZ1ByZWZlcnJlZENvbXBvbmVudFN0b3JlTXV0ZXg7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IGdQcmVmZXJyZWRDb21wb25lbnRTdG9yZTsKKworICAgIHN0ZDo6bXV0ZXggZ1BsYXRmb3JtQWxsb2NhdG9yU3RvcmVNdXRleDsKKyAgICBzdGQ6OndlYWtfcHRyPEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw+IGdQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gR2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhnUGxhdGZvcm1BbGxvY2F0b3JTdG9yZU11dGV4KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbD4gc3RvcmUgPSBnUGxhdGZvcm1BbGxvY2F0b3JTdG9yZS5sb2NrKCk7CisgICAgaWYgKHN0b3JlID09IG51bGxwdHIpIHsKKyAgICAgICAgc3RvcmUgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw+KCk7CisgICAgICAgIHN0b3JlLT5zZXRDb21wb25lbnRTdG9yZShHZXRQcmVmZXJyZWRDb2RlYzJDb21wb25lbnRTdG9yZSgpKTsKKyAgICAgICAgZ1BsYXRmb3JtQWxsb2NhdG9yU3RvcmUgPSBzdG9yZTsKKyAgICB9CisgICAgcmV0dXJuIHN0b3JlOworfQorCit2b2lkIFNldFByZWZlcnJlZENvZGVjMkNvbXBvbmVudFN0b3JlKHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBjb21wb25lbnRTdG9yZSkgeworICAgIHN0YXRpYyBzdGQ6Om11dGV4IG11dGV4OworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG11dGV4KTsgLy8gZG9uJ3QgaW50ZXJsZXZlIHNldC1zCisKKyAgICAvLyB1cGRhdGUgcHJlZmVycmVkIHN0b3JlCisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhnUHJlZmVycmVkQ29tcG9uZW50U3RvcmVNdXRleCk7CisgICAgICAgIGdQcmVmZXJyZWRDb21wb25lbnRTdG9yZSA9IGNvbXBvbmVudFN0b3JlOworICAgIH0KKworICAgIC8vIHVwZGF0ZSBwbGF0Zm9ybSBhbGxvY2F0b3IncyBzdG9yZSBhcyB3ZWxsIGlmIGl0IGlzIGFsaXZlCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw+IGFsbG9jYXRvclN0b3JlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZ1BsYXRmb3JtQWxsb2NhdG9yU3RvcmVNdXRleCk7CisgICAgICAgIGFsbG9jYXRvclN0b3JlID0gZ1BsYXRmb3JtQWxsb2NhdG9yU3RvcmUubG9jaygpOworICAgIH0KKyAgICBpZiAoYWxsb2NhdG9yU3RvcmUpIHsKKyAgICAgICAgYWxsb2NhdG9yU3RvcmUtPnNldENvbXBvbmVudFN0b3JlKGNvbXBvbmVudFN0b3JlKTsKKyAgICB9Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBHZXRQcmVmZXJyZWRDb2RlYzJDb21wb25lbnRTdG9yZSgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhnUHJlZmVycmVkQ29tcG9uZW50U3RvcmVNdXRleCk7CisgICAgcmV0dXJuIGdQcmVmZXJyZWRDb21wb25lbnRTdG9yZSA/IGdQcmVmZXJyZWRDb21wb25lbnRTdG9yZSA6IEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKTsKK30KKworbmFtZXNwYWNlIHsKKworY2xhc3MgX0MyQmxvY2tQb29sQ2FjaGUgeworcHVibGljOgorICAgIF9DMkJsb2NrUG9vbENhY2hlKCkgOiBtQmxvY2tQb29sU2VxSWQoQzJCbG9ja1Bvb2w6OlBMQVRGT1JNX1NUQVJUICsgMSkge30KKworICAgIGMyX3N0YXR1c190IF9jcmVhdGVCbG9ja1Bvb2woCisgICAgICAgICAgICBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OmlkX3QgYWxsb2NhdG9ySWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IHBvb2xJZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gKnBvb2wpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IGFsbG9jYXRvclN0b3JlID0KKyAgICAgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gYWxsb2NhdG9yOworICAgICAgICBjMl9zdGF0dXNfdCByZXMgPSBDMl9OT1RfRk9VTkQ7CisKKyAgICAgICAgc3dpdGNoKGFsbG9jYXRvcklkKSB7CisgICAgICAgICAgICBjYXNlIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6SU9OOgorICAgICAgICAgICAgY2FzZSBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUjoKKyAgICAgICAgICAgICAgICByZXMgPSBhbGxvY2F0b3JTdG9yZS0+ZmV0Y2hBbGxvY2F0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUiwgJmFsbG9jYXRvcik7CisgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IHB0ciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3IsIHBvb2xJZCk7CisgICAgICAgICAgICAgICAgICAgICpwb29sID0gcHRyOworICAgICAgICAgICAgICAgICAgICBtQmxvY2tQb29sc1twb29sSWRdID0gcHRyOworICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50c1twb29sSWRdID0gY29tcG9uZW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpHUkFMTE9DOgorICAgICAgICAgICAgY2FzZSBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0dSQVBISUM6CisgICAgICAgICAgICAgICAgcmVzID0gYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9HUkFQSElDLCAmYWxsb2NhdG9yKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcHRyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2w+KGFsbG9jYXRvciwgcG9vbElkKTsKKyAgICAgICAgICAgICAgICAgICAgKnBvb2wgPSBwdHI7CisgICAgICAgICAgICAgICAgICAgIG1CbG9ja1Bvb2xzW3Bvb2xJZF0gPSBwdHI7CisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnRzW3Bvb2xJZF0gPSBjb21wb25lbnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJVRkZFUlFVRVVFOgorICAgICAgICAgICAgICAgIHJlcyA9IGFsbG9jYXRvclN0b3JlLT5mZXRjaEFsbG9jYXRvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QlVGRkVSUVVFVUUsICZhbGxvY2F0b3IpOworICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBwdHIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3IsIHBvb2xJZCk7CisgICAgICAgICAgICAgICAgICAgICpwb29sID0gcHRyOworICAgICAgICAgICAgICAgICAgICBtQmxvY2tQb29sc1twb29sSWRdID0gcHRyOworICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50c1twb29sSWRdID0gY29tcG9uZW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIGNyZWF0ZSBibG9jayBwb29sIGZyb20gcGxhdGZvcm0gc3RvcmUgcGx1Z2lucy4KKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IHB0cjsKKyAgICAgICAgICAgICAgICByZXMgPSBDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI6OkdldEluc3RhbmNlKCktPmNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcklkLCBwb29sSWQsICZwdHIpOworICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnBvb2wgPSBwdHI7CisgICAgICAgICAgICAgICAgICAgIG1CbG9ja1Bvb2xzW3Bvb2xJZF0gPSBwdHI7CisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnRzW3Bvb2xJZF0gPSBjb21wb25lbnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgY3JlYXRlQmxvY2tQb29sKAorICAgICAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjppZF90IGFsbG9jYXRvcklkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICpwb29sKSB7CisgICAgICAgIHJldHVybiBfY3JlYXRlQmxvY2tQb29sKGFsbG9jYXRvcklkLCBjb21wb25lbnQsIG1CbG9ja1Bvb2xTZXFJZCsrLCBwb29sKTsKKyAgICB9CisKKyAgICBib29sIGdldEJsb2NrUG9vbCgKKyAgICAgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGJsb2NrUG9vbElkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICpwb29sKSB7CisgICAgICAgIC8vIFRPRE86IHVzZSBvbmUgaXRlcmF0b3IgZm9yIG11bHRpcGxlIGJsb2NrcG9vbCB0eXBlIHNjYWxhYmlsaXR5LgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IHB0cjsKKyAgICAgICAgYXV0byBpdCA9IG1CbG9ja1Bvb2xzLmZpbmQoYmxvY2tQb29sSWQpOworICAgICAgICBpZiAoaXQgIT0gbUJsb2NrUG9vbHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHB0ciA9IGl0LT5zZWNvbmQubG9jaygpOworICAgICAgICAgICAgaWYgKCFwdHIpIHsKKyAgICAgICAgICAgICAgICBtQmxvY2tQb29scy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgbUNvbXBvbmVudHMuZXJhc2UoYmxvY2tQb29sSWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdXRvIGZvdW5kID0gbUNvbXBvbmVudHMuZmluZChibG9ja1Bvb2xJZCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCA9PSBmb3VuZC0+c2Vjb25kLmxvY2soKSkgeworICAgICAgICAgICAgICAgICAgICAqcG9vbCA9IHB0cjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbUJsb2NrUG9vbFNlcUlkOworCisgICAgc3RkOjptYXA8QzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QsIHN0ZDo6d2Vha19wdHI8QzJCbG9ja1Bvb2w+PiBtQmxvY2tQb29sczsKKyAgICBzdGQ6Om1hcDxDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCwgc3RkOjp3ZWFrX3B0cjxjb25zdCBDMkNvbXBvbmVudD4+IG1Db21wb25lbnRzOworfTsKKworc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxfQzJCbG9ja1Bvb2xDYWNoZT4gc0Jsb2NrUG9vbENhY2hlID0KKyAgICBzdGQ6Om1ha2VfdW5pcXVlPF9DMkJsb2NrUG9vbENhY2hlPigpOworc3RhdGljIHN0ZDo6bXV0ZXggc0Jsb2NrUG9vbENhY2hlTXV0ZXg7CisKK30gLy8gYW55bnltb3VzIG5hbWVzcGFjZQorCitjMl9zdGF0dXNfdCBHZXRDb2RlYzJCbG9ja1Bvb2woCisgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAqcG9vbCkgeworICAgIHBvb2wtPnJlc2V0KCk7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soc0Jsb2NrUG9vbENhY2hlTXV0ZXgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBhbGxvY2F0b3JTdG9yZSA9IEdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jYXRvcjsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBDMl9OT1RfRk9VTkQ7CisKKyAgICBpZiAoaWQgPj0gQzJCbG9ja1Bvb2w6OlBMQVRGT1JNX1NUQVJUKSB7CisgICAgICAgIGlmIChzQmxvY2tQb29sQ2FjaGUtPmdldEJsb2NrUG9vbChpZCwgY29tcG9uZW50LCBwb29sKSkgeworICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICB9CisgICAgfQorCisgICAgc3dpdGNoIChpZCkgeworICAgIGNhc2UgQzJCbG9ja1Bvb2w6OkJBU0lDX0xJTkVBUjoKKyAgICAgICAgcmVzID0gYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSLCAmYWxsb2NhdG9yKTsKKyAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAgICAgKnBvb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyQmFzaWNMaW5lYXJCbG9ja1Bvb2w+KGFsbG9jYXRvcik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMkJsb2NrUG9vbDo6QkFTSUNfR1JBUEhJQzoKKyAgICAgICAgcmVzID0gYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfR1JBUEhJQywgJmFsbG9jYXRvcik7CisgICAgICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICpwb29sID0gc3RkOjptYWtlX3NoYXJlZDxDMkJhc2ljR3JhcGhpY0Jsb2NrUG9vbD4oYWxsb2NhdG9yKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAvLyBUT0RPOiByZW1vdmUgdGhpcy4gdGhpcyBpcyB0ZW1wb3JhcnkKKyAgICBjYXNlIEMyQmxvY2tQb29sOjpQTEFURk9STV9TVEFSVDoKKyAgICAgICAgcmVzID0gc0Jsb2NrUG9vbENhY2hlLT5fY3JlYXRlQmxvY2tQb29sKAorICAgICAgICAgICAgICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QlVGRkVSUVVFVUUsIGNvbXBvbmVudCwgaWQsIHBvb2wpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworYzJfc3RhdHVzX3QgQ3JlYXRlQ29kZWMyQmxvY2tQb29sKAorICAgICAgICBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OmlkX3QgYWxsb2NhdG9ySWQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICpwb29sKSB7CisgICAgcG9vbC0+cmVzZXQoKTsKKworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHNCbG9ja1Bvb2xDYWNoZU11dGV4KTsKKyAgICByZXR1cm4gc0Jsb2NrUG9vbENhY2hlLT5jcmVhdGVCbG9ja1Bvb2woYWxsb2NhdG9ySWQsIGNvbXBvbmVudCwgcG9vbCk7Cit9CisKK2NsYXNzIEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSA6IHB1YmxpYyBDMkNvbXBvbmVudFN0b3JlIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPj4gbGlzdENvbXBvbmVudHMoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBnZXRQYXJhbVJlZmxlY3RvcigpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXNfc20oCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqY29uc3QgcGFyYW1zKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5X3NtKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gKmNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgQzJTdHJpbmcgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAqY29uc3QgaW50ZXJmYWNlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIEMyU3RyaW5nIG5hbWUsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gKmNvbnN0IGNvbXBvbmVudCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb3B5QnVmZmVyKAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gc3JjLCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQnVmZmVyPiBkc3QpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnX3NtKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gKmNvbnN0IGZhaWx1cmVzKSBvdmVycmlkZTsKKyAgICBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKTsKKworICAgIHZpcnR1YWwgfkMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKworICAgIC8qKgorICAgICAqIEFuIG9iamVjdCBlbmNhcHN1bGF0aW5nIGEgbG9hZGVkIGNvbXBvbmVudCBtb2R1bGUuCisgICAgICoKKyAgICAgKiBcdG9kbyBwcm92aWRlIGEgd2F5IHRvIGFkZCB0cmFpdHMgdG8ga25vd24gY29tcG9uZW50cyBoZXJlIHRvIGF2b2lkIGxvYWRpbmcgdGhlIC5zby1zCisgICAgICogZm9yIGxpc3RDb21wb25lbnRzCisgICAgICovCisgICAgc3RydWN0IENvbXBvbmVudE1vZHVsZSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnksCisgICAgICAgICAgICBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxDb21wb25lbnRNb2R1bGU+IHsKKyAgICAgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+ICpjb21wb25lbnQsCisgICAgICAgICAgICAgICAgQ29tcG9uZW50RGVsZXRlciBkZWxldGVyID0gc3RkOjpkZWZhdWx0X2RlbGV0ZTxDMkNvbXBvbmVudD4oKSkgb3ZlcnJpZGU7CisgICAgICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAqaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgIEludGVyZmFjZURlbGV0ZXIgZGVsZXRlciA9IHN0ZDo6ZGVmYXVsdF9kZWxldGU8QzJDb21wb25lbnRJbnRlcmZhY2U+KCkpIG92ZXJyaWRlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBccmV0dXJucyB0aGUgdHJhaXRzIG9mIHRoZSBjb21wb25lbnQgaW4gdGhpcyBtb2R1bGUuCisgICAgICAgICAqLworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4gZ2V0VHJhaXRzKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYW4gdW5pbml0aWFsaXplZCBjb21wb25lbnQgbW9kdWxlLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gbmFtZVtpbl0gIGNvbXBvbmVudCBuYW1lLgorICAgICAgICAgKgorICAgICAgICAgKiBcbm90ZSBPbmx5IHVzZWQgYnkgQ29tcG9uZW50TG9hZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgQ29tcG9uZW50TW9kdWxlKCkKKyAgICAgICAgICAgIDogbUluaXQoQzJfTk9fSU5JVCksCisgICAgICAgICAgICAgIG1MaWJIYW5kbGUobnVsbHB0ciksCisgICAgICAgICAgICAgIGNyZWF0ZUZhY3RvcnkobnVsbHB0ciksCisgICAgICAgICAgICAgIGRlc3Ryb3lGYWN0b3J5KG51bGxwdHIpLAorICAgICAgICAgICAgICBtQ29tcG9uZW50RmFjdG9yeShudWxscHRyKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSW5pdGlhbGl6ZXMgYSBjb21wb25lbnQgbW9kdWxlIHdpdGggYSBnaXZlbiBsaWJyYXJ5IHBhdGguIE11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZS4KKyAgICAgICAgICoKKyAgICAgICAgICogXG5vdGUgT25seSB1c2VkIGJ5IENvbXBvbmVudExvYWRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIGFsaWFzW2luXSAgIG1vZHVsZSBhbGlhcworICAgICAgICAgKiBccGFyYW0gbGliUGF0aFtpbl0gbGlicmFyeSBwYXRoCisgICAgICAgICAqCisgICAgICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgbW9kdWxlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBsb2FkZWQKKyAgICAgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gbG9hZGluZyB0aGUgY29tcG9uZW50IG1vZHVsZQorICAgICAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCBjb3VsZCBub3QgbG9jYXRlIHRoZSBjb21wb25lbnQgbW9kdWxlCisgICAgICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHRoZSBjb21wb25lbnQgbW9kdWxlIGNvdWxkIG5vdCBiZSBsb2FkZWQgKHVuZXhwZWN0ZWQpCisgICAgICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIHBlcm1pc3Npb24gZGVuaWVkIHRvIGxvYWQgdGhlIGNvbXBvbmVudCBtb2R1bGUgKHVuZXhwZWN0ZWQpCisgICAgICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBsb2FkIHRoZSBtb2R1bGUgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAgICAgKi8KKyAgICAgICAgYzJfc3RhdHVzX3QgaW5pdChzdGQ6OnN0cmluZyBhbGlhcywgc3RkOjpzdHJpbmcgbGliUGF0aCk7CisKKyAgICAgICAgdmlydHVhbCB+Q29tcG9uZW50TW9kdWxlKCkgb3ZlcnJpZGU7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHN0ZDo6cmVjdXJzaXZlX211dGV4IG1Mb2NrOyAvLy88IGxvY2sgcHJvdGVjdGluZyBtVHJhaXRzCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6VHJhaXRzPiBtVHJhaXRzOyAvLy88IGNhY2hlZCBjb21wb25lbnQgdHJhaXRzCisKKyAgICAgICAgYzJfc3RhdHVzX3QgbUluaXQ7IC8vLzwgaW5pdGlhbGl6YXRpb24gcmVzdWx0CisKKyAgICAgICAgdm9pZCAqbUxpYkhhbmRsZTsgLy8vPCBsb2FkZWQgbGlicmFyeSBoYW5kbGUKKyAgICAgICAgQzJDb21wb25lbnRGYWN0b3J5OjpDcmVhdGVDb2RlYzJGYWN0b3J5RnVuYyBjcmVhdGVGYWN0b3J5OyAvLy88IGxvYWRlZCBjcmVhdGUgZnVuY3Rpb24KKyAgICAgICAgQzJDb21wb25lbnRGYWN0b3J5OjpEZXN0cm95Q29kZWMyRmFjdG9yeUZ1bmMgZGVzdHJveUZhY3Rvcnk7IC8vLzwgbG9hZGVkIGRlc3Ryb3kgZnVuY3Rpb24KKyAgICAgICAgQzJDb21wb25lbnRGYWN0b3J5ICptQ29tcG9uZW50RmFjdG9yeTsgLy8vPCBsb2FkZWQvY3JlYXRlZCBjb21wb25lbnQgZmFjdG9yeQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBBbiBvYmplY3QgZW5jYXBzdWxhdGluZyBhIGxvYWRhYmxlIGNvbXBvbmVudCBtb2R1bGUuCisgICAgICoKKyAgICAgKiBcdG9kbyBtYWtlIHRoaXMgYWxzbyB3b3JrIGZvciBlbnVtZXJhdGlvbnMKKyAgICAgKi8KKyAgICBzdHJ1Y3QgQ29tcG9uZW50TG9hZGVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIExvYWQgdGhlIGNvbXBvbmVudCBtb2R1bGUuCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIHNpbXBseSByZXR1cm5zIHRoZSBjb21wb25lbnQgbW9kdWxlIGlmIGl0IGlzIGFscmVhZHkgY3VycmVudGx5IGxvYWRlZCwgb3IKKyAgICAgICAgICogYXR0ZW1wdHMgdG8gbG9hZCBpdCBpZiBpdCBpcyBub3QuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSBtb2R1bGVbb3V0XSBwb2ludGVyIHRvIHRoZSBzaGFyZWQgcG9pbnRlciB3aGVyZSB0aGUgbG9hZGVkIG1vZHVsZSBzaGFsbCBiZSBzdG9yZWQuCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICBUaGlzIHdpbGwgYmUgbnVsbHB0ciBvbiBlcnJvci4KKyAgICAgICAgICoKKyAgICAgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCBtb2R1bGUgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGxvYWRlZAorICAgICAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBsb2FkaW5nIHRoZSBjb21wb25lbnQgbW9kdWxlCisgICAgICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIGNvdWxkIG5vdCBsb2NhdGUgdGhlIGNvbXBvbmVudCBtb2R1bGUKKyAgICAgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgdGhlIGNvbXBvbmVudCBtb2R1bGUgY291bGQgbm90IGJlIGxvYWRlZAorICAgICAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBwZXJtaXNzaW9uIGRlbmllZCB0byBsb2FkIHRoZSBjb21wb25lbnQgbW9kdWxlCisgICAgICAgICAqLworICAgICAgICBjMl9zdGF0dXNfdCBmZXRjaE1vZHVsZShzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50TW9kdWxlPiAqbW9kdWxlKSB7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCByZXMgPSBDMl9PSzsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50TW9kdWxlPiBsb2NhbE1vZHVsZSA9IG1Nb2R1bGUubG9jaygpOworICAgICAgICAgICAgaWYgKGxvY2FsTW9kdWxlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBsb2NhbE1vZHVsZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q29tcG9uZW50TW9kdWxlPigpOworICAgICAgICAgICAgICAgIHJlcyA9IGxvY2FsTW9kdWxlLT5pbml0KG1BbGlhcywgbUxpYlBhdGgpOworICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgbU1vZHVsZSA9IGxvY2FsTW9kdWxlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICptb2R1bGUgPSBsb2NhbE1vZHVsZTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIGNvbXBvbmVudCBsb2FkZXIgZm9yIGEgc3BlY2lmaWMgbGlicmFyeSBwYXRoIChvciBuYW1lKS4KKyAgICAgICAgICovCisgICAgICAgIENvbXBvbmVudExvYWRlcihzdGQ6OnN0cmluZyBhbGlhcywgc3RkOjpzdHJpbmcgbGliUGF0aCkKKyAgICAgICAgICAgIDogbUFsaWFzKGFsaWFzKSwgbUxpYlBhdGgobGliUGF0aCkge30KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6bXV0ZXggbU11dGV4OyAvLy88IG11dGV4IGd1YXJkaW5nIHRoZSBtb2R1bGUKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxDb21wb25lbnRNb2R1bGU+IG1Nb2R1bGU7IC8vLzwgd2VhayByZWZlcmVuY2UgdG8gdGhlIGxvYWRlZCBtb2R1bGUKKyAgICAgICAgc3RkOjpzdHJpbmcgbUFsaWFzOyAvLy88IGNvbXBvbmVudCBhbGlhcworICAgICAgICBzdGQ6OnN0cmluZyBtTGliUGF0aDsgLy8vPCBsaWJyYXJ5IHBhdGgKKyAgICB9OworCisgICAgc3RydWN0IEludGVyZmFjZSA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0b3JlSW9uVXNhZ2VJbmZvPiBtSW9uVXNhZ2VJbmZvOworCisgICAgICAgIEludGVyZmFjZShzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IHJlZmxlY3RvcikKKyAgICAgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIocmVmbGVjdG9yKSB7CisgICAgICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgICAgIHN0cnVjdCBTZXR0ZXIgeworICAgICAgICAgICAgICAgIHN0YXRpYyBDMlIgc2V0SW9uVXNhZ2UoYm9vbCAvKiBtYXlCbG9jayAqLywgQzJQPEMyU3RvcmVJb25Vc2FnZUluZm8+ICZtZSkgeworICAgICAgICAgICAgICAgICAgICBtZS5zZXQoKS5oZWFwTWFzayA9IH4wOworICAgICAgICAgICAgICAgICAgICBtZS5zZXQoKS5hbGxvY0ZsYWdzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgbWUuc2V0KCkubWluQWxpZ25tZW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlvblVzYWdlSW5mbywgImlvbi11c2FnZSIpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0b3JlSW9uVXNhZ2VJbmZvKCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUlvblVzYWdlSW5mbywgdXNhZ2UpLmZsYWdzKHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCB8IEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobUlvblVzYWdlSW5mbywgY2FwYWNpdHkpLmluUmFuZ2UoMCwgVUlOVDMyX01BWCwgMTAyNCksCisgICAgICAgICAgICAgICAgICAgIEMyRihtSW9uVXNhZ2VJbmZvLCBoZWFwTWFzaykuYW55KCksCisgICAgICAgICAgICAgICAgICAgIEMyRihtSW9uVXNhZ2VJbmZvLCBhbGxvY0ZsYWdzKS5mbGFncyh7fSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtSW9uVXNhZ2VJbmZvLCBtaW5BbGlnbm1lbnQpLmVxdWFsVG8oMCkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjo6c2V0SW9uVXNhZ2UpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgY29tcG9uZW50IGxvYWRlciBmb3IgYSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgbm9uLXJlZi1ob2xkaW5nIHBvaW50ZXIgdG8gdGhlIGNvbXBvbmVudCBsb2FkZXIuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgY29tcG9uZW50IGxvYWRlciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcmV0cmlldmVkCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gbG9jYXRlIHRoZSBjb21wb25lbnQgbG9hZGVyCisgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgY291bGQgbm90IGxvY2F0ZSB0aGUgY29tcG9uZW50IHRvIGJlIGxvYWRlZAorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHRoZSBjb21wb25lbnQgbG9hZGVyIGNvdWxkIG5vdCBiZSBpZGVudGlmaWVkIGR1ZSB0byBzb21lIG1vZHVsZXMgYmVpbmcKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBjb3JydXB0ZWQgKHRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgbmFtZSBkb2VzIG5vdCByZWZlciB0byBhbiBhbHJlYWR5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllZCBjb21wb25lbnQgYnV0IHNvbWUgY29tcG9uZW50cyBjb3VsZCBub3QgYmUgbG9hZGVkIGR1ZSB0bworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGJhZCBsaWJyYXJ5KQorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIHBlcm1pc3Npb24gZGVuaWVkIHRvIGZpbmQgdGhlIGNvbXBvbmVudCBsb2FkZXIgZm9yIHRoZSBuYW1lZCBjb21wb25lbnQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBjYW4gaGFwcGVuIGlmIHRoZSBuYW1lIGRvZXMgbm90IHJlZmVyIHRvIGFuIGFscmVhZHkgaWRlbnRpZmllZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBidXQgc29tZSBjb21wb25lbnRzIGNvdWxkIG5vdCBiZSBsb2FkZWQgZHVlIHRvIGxhY2sgb2YKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucykKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBmaW5kQ29tcG9uZW50KEMyU3RyaW5nIG5hbWUsIENvbXBvbmVudExvYWRlciAqKmxvYWRlcik7CisKKyAgICBzdGQ6Om1hcDxDMlN0cmluZywgQ29tcG9uZW50TG9hZGVyPiBtQ29tcG9uZW50czsgLy8vPCBtYXAgb2YgbmFtZSAtPiBjb21wb25lbnRzCisgICAgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IG1Db21wb25lbnRzTGlzdDsgLy8vPCBsaXN0IG9mIGNvbXBvbmVudHMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1SZWZsZWN0b3I7CisgICAgSW50ZXJmYWNlIG1JbnRlcmZhY2U7Cit9OworCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudE1vZHVsZTo6aW5pdCgKKyAgICAgICAgc3RkOjpzdHJpbmcgYWxpYXMsIHN0ZDo6c3RyaW5nIGxpYlBhdGgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgQUxPR1YoImxvYWRpbmcgZGxsIik7CisgICAgbUxpYkhhbmRsZSA9IGRsb3BlbihsaWJQYXRoLmNfc3RyKCksIFJUTERfTk9XfFJUTERfTk9ERUxFVEUpOworICAgIGlmIChtTGliSGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgLy8gY291bGQgYmUgYWNjZXNzL3N5bWJvbCBvciBzaW1wbHkgbm90IGJlaW5nIHRoZXJlCisgICAgICAgIEFMT0dEKCJjb3VsZCBub3QgZGxvcGVuICVzOiAlcyIsIGxpYlBhdGguY19zdHIoKSwgZGxlcnJvcigpKTsKKyAgICAgICAgbUluaXQgPSBDMl9DT1JSVVBURUQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY3JlYXRlRmFjdG9yeSA9CisgICAgICAgICAgICAoQzJDb21wb25lbnRGYWN0b3J5OjpDcmVhdGVDb2RlYzJGYWN0b3J5RnVuYylkbHN5bShtTGliSGFuZGxlLCAiQ3JlYXRlQ29kZWMyRmFjdG9yeSIpOworICAgICAgICBkZXN0cm95RmFjdG9yeSA9CisgICAgICAgICAgICAoQzJDb21wb25lbnRGYWN0b3J5OjpEZXN0cm95Q29kZWMyRmFjdG9yeUZ1bmMpZGxzeW0obUxpYkhhbmRsZSwgIkRlc3Ryb3lDb2RlYzJGYWN0b3J5Iik7CisKKyAgICAgICAgbUNvbXBvbmVudEZhY3RvcnkgPSBjcmVhdGVGYWN0b3J5KCk7CisgICAgICAgIGlmIChtQ29tcG9uZW50RmFjdG9yeSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRCgiY291bGQgbm90IGNyZWF0ZSBmYWN0b3J5IGluICVzIiwgbGliUGF0aC5jX3N0cigpKTsKKyAgICAgICAgICAgIG1Jbml0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUluaXQgPSBDMl9PSzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobUluaXQgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0OworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gaW50ZjsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBjcmVhdGVJbnRlcmZhY2UoMCwgJmludGYpOworICAgIGlmIChyZXMgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoImZhaWxlZCB0byBjcmVhdGUgaW50ZXJmYWNlOiAlZCIsIHJlcyk7CisgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6OlRyYWl0cz4gdHJhaXRzKG5ldyAoc3RkOjpub3Rocm93KSBDMkNvbXBvbmVudDo6VHJhaXRzKTsKKyAgICBpZiAodHJhaXRzKSB7CisgICAgICAgIGlmIChhbGlhcyAhPSBpbnRmLT5nZXROYW1lKCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBpcyBhbGlhcyB0byAlcyIsIGFsaWFzLmNfc3RyKCksIGludGYtPmdldE5hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICB0cmFpdHMtPm5hbWUgPSBhbGlhczsKKyAgICAgICAgLy8gVE9ETzogZ2V0IHRoaXMgZnJvbSBpbnRlcmZhY2UgcHJvcGVybHkuCisgICAgICAgIGJvb2wgZW5jb2RlciA9ICh0cmFpdHMtPm5hbWUuZmluZCgiZW5jb2RlciIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKTsKKyAgICAgICAgdWludDMyX3QgbWVkaWFUeXBlSW5kZXggPSBlbmNvZGVyID8gQzJQb3J0TWltZUNvbmZpZzo6b3V0cHV0OjpQQVJBTV9UWVBFCisgICAgICAgICAgICAgICAgOiBDMlBvcnRNaW1lQ29uZmlnOjppbnB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbXM7CisgICAgICAgIHJlcyA9IGludGYtPnF1ZXJ5X3ZiKHt9LCB7IG1lZGlhVHlwZUluZGV4IH0sIEMyX01BWV9CTE9DSywgJnBhcmFtcyk7CisgICAgICAgIGlmIChyZXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dEKCJmYWlsZWQgdG8gcXVlcnkgaW50ZXJmYWNlOiAlZCIsIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMXUpIHsKKyAgICAgICAgICAgIEFMT0dEKCJmYWlsZWQgdG8gcXVlcnkgaW50ZXJmYWNlOiB1bmV4cGVjdGVkIHZlY3RvciBzaXplOiAlenUiLCBwYXJhbXMuc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICAgICAgfQorICAgICAgICBDMlBvcnRNaW1lQ29uZmlnICptZWRpYVR5cGVDb25maWcgPSAoQzJQb3J0TWltZUNvbmZpZyAqKShwYXJhbXNbMF0uZ2V0KCkpOworICAgICAgICBpZiAobWVkaWFUeXBlQ29uZmlnID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dEKCJmYWlsZWQgdG8gcXVlcnkgbWVkaWEgdHlwZSIpOworICAgICAgICAgICAgcmV0dXJuIG1Jbml0OworICAgICAgICB9CisgICAgICAgIHRyYWl0cy0+bWVkaWFUeXBlID0gbWVkaWFUeXBlQ29uZmlnLT5tLnZhbHVlOworICAgICAgICAvLyBUT0RPOiBnZXQgdGhpcyBwcm9wZXJseS4KKyAgICAgICAgdHJhaXRzLT5yYW5rID0gMHgyMDA7CisKKyAgICAgICAgLy8gVE9ETzogZGVmaW5lIHRoZXNlIHZhbHVlcyBwcm9wZXJseQorICAgICAgICBib29sIGRlY29kZXIgPSAodHJhaXRzLT5uYW1lLmZpbmQoImRlY29kZXIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyk7CisgICAgICAgIHRyYWl0cy0+a2luZCA9CisgICAgICAgICAgICAgICAgZGVjb2RlciA/IEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIgOgorICAgICAgICAgICAgICAgIGVuY29kZXIgPyBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSIDoKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9PVEhFUjsKKyAgICAgICAgaWYgKHN0cm5jbXAodHJhaXRzLT5tZWRpYVR5cGUuY19zdHIoKSwgImF1ZGlvLyIsIDYpID09IDApIHsKKyAgICAgICAgICAgIHRyYWl0cy0+ZG9tYWluID0gQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTzsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKHRyYWl0cy0+bWVkaWFUeXBlLmNfc3RyKCksICJ2aWRlby8iLCA2KSA9PSAwKSB7CisgICAgICAgICAgICB0cmFpdHMtPmRvbWFpbiA9IEMyQ29tcG9uZW50OjpET01BSU5fVklERU87CisgICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcCh0cmFpdHMtPm1lZGlhVHlwZS5jX3N0cigpLCAiaW1hZ2UvIiwgNikgPT0gMCkgeworICAgICAgICAgICAgdHJhaXRzLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX0lNQUdFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJhaXRzLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX09USEVSOworICAgICAgICB9CisgICAgfQorICAgIG1UcmFpdHMgPSB0cmFpdHM7CisKKyAgICByZXR1cm4gbUluaXQ7Cit9CisKK0MyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6Q29tcG9uZW50TW9kdWxlOjp+Q29tcG9uZW50TW9kdWxlKCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBpZiAoZGVzdHJveUZhY3RvcnkgJiYgbUNvbXBvbmVudEZhY3RvcnkpIHsKKyAgICAgICAgZGVzdHJveUZhY3RvcnkobUNvbXBvbmVudEZhY3RvcnkpOworICAgIH0KKyAgICBpZiAobUxpYkhhbmRsZSkgeworICAgICAgICBBTE9HVigidW5sb2FkaW5nIGRsbCIpOworICAgICAgICBkbGNsb3NlKG1MaWJIYW5kbGUpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRNb2R1bGU6OmNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICppbnRlcmZhY2UsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCg6OkMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIHsKKyAgICBpbnRlcmZhY2UtPnJlc2V0KCk7CisgICAgaWYgKG1Jbml0ICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudE1vZHVsZT4gbW9kdWxlID0gc2hhcmVkX2Zyb21fdGhpcygpOworICAgIGMyX3N0YXR1c190IHJlcyA9IG1Db21wb25lbnRGYWN0b3J5LT5jcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBpZCwgaW50ZXJmYWNlLCBbbW9kdWxlLCBkZWxldGVyXShDMkNvbXBvbmVudEludGVyZmFjZSAqcCkgbXV0YWJsZSB7CisgICAgICAgICAgICAgICAgLy8gY2FwdHVyZSBtb2R1bGUgc28gdGhhdCB3ZSBlbnN1cmUgd2Ugc3RpbGwgaGF2ZSBpdCB3aGlsZSBkZWxldGluZyBpbnRlcmZhY2UKKyAgICAgICAgICAgICAgICBkZWxldGVyKHApOyAvLyBkZWxldGUgaW50ZXJmYWNlIGZpcnN0CisgICAgICAgICAgICAgICAgbW9kdWxlLnJlc2V0KCk7IC8vIHJlbW92ZSBtb2R1bGUgcmVmIChub3QgdGVjaG5pY2FsbHkgbmVlZGVkKQorICAgIH0pOworICAgIHJldHVybiByZXM7Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6Q29tcG9uZW50TW9kdWxlOjpjcmVhdGVDb21wb25lbnQoCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiAqY29tcG9uZW50LAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoOjpDMkNvbXBvbmVudCopPiBkZWxldGVyKSB7CisgICAgY29tcG9uZW50LT5yZXNldCgpOworICAgIGlmIChtSW5pdCAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnRNb2R1bGU+IG1vZHVsZSA9IHNoYXJlZF9mcm9tX3RoaXMoKTsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBtQ29tcG9uZW50RmFjdG9yeS0+Y3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgaWQsIGNvbXBvbmVudCwgW21vZHVsZSwgZGVsZXRlcl0oQzJDb21wb25lbnQgKnApIG11dGFibGUgeworICAgICAgICAgICAgICAgIC8vIGNhcHR1cmUgbW9kdWxlIHNvIHRoYXQgd2UgZW5zdXJlIHdlIHN0aWxsIGhhdmUgaXQgd2hpbGUgZGVsZXRpbmcgY29tcG9uZW50CisgICAgICAgICAgICAgICAgZGVsZXRlcihwKTsgLy8gZGVsZXRlIGNvbXBvbmVudCBmaXJzdAorICAgICAgICAgICAgICAgIG1vZHVsZS5yZXNldCgpOyAvLyByZW1vdmUgbW9kdWxlIHJlZiAobm90IHRlY2huaWNhbGx5IG5lZWRlZCkKKyAgICB9KTsKKyAgICByZXR1cm4gcmVzOworfQorCitzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4gQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRNb2R1bGU6OmdldFRyYWl0cygpIHsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbVRyYWl0czsKK30KKworQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKQorICAgIDogbVJlZmxlY3RvcihzdGQ6Om1ha2Vfc2hhcmVkPEMyUmVmbGVjdG9ySGVscGVyPigpKSwKKyAgICAgIG1JbnRlcmZhY2UobVJlZmxlY3RvcikgeworCisgICAgYXV0byBlbXBsYWNlID0gW3RoaXNdKGNvbnN0IGNoYXIgKmFsaWFzLCBjb25zdCBjaGFyICpsaWJQYXRoKSB7CisgICAgICAgIC8vIENvbXBvbmVudExvYWRlciBpcyBuZWl0aGVyIGNvcGlhYmxlIG5vciBtb3ZhYmxlLCBzbyBpdCBtdXN0IGJlCisgICAgICAgIC8vIGNvbnN0cnVjdGVkIGluLXBsYWNlLiBOb3cgQ29tcG9uZW50TG9hZGVyIHRha2VzIHR3byBhcmd1bWVudHMgaW4KKyAgICAgICAgLy8gY29uc3RydWN0b3IsIHNvIHdlIG5lZWQgdG8gdXNlIHBpZWNld2lzZV9jb25zdHJ1Y3QgdG8gYWNoaWV2ZSB0aGlzCisgICAgICAgIC8vIGJlaGF2aW9yLgorICAgICAgICBtQ29tcG9uZW50cy5lbXBsYWNlKAorICAgICAgICAgICAgICAgIHN0ZDo6cGllY2V3aXNlX2NvbnN0cnVjdCwKKyAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoYWxpYXMpLAorICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZF9hc190dXBsZShhbGlhcywgbGliUGF0aCkpOworICAgICAgICBtQ29tcG9uZW50c0xpc3QuZW1wbGFjZV9iYWNrKGFsaWFzKTsKKyAgICB9OworICAgIC8vIFRPRE86IG1vdmUgdGhpcyBhbHNvIGludG8gYSAuc28gc28gaXQgY2FuIGJlIHVwZGF0ZWQKKyAgICBlbXBsYWNlKCJjMi5hbmRyb2lkLmF2Yy5kZWNvZGVyIiwgImxpYmNvZGVjMl9zb2Z0X2F2Y2RlYy5zbyIpOworICAgIGVtcGxhY2UoImMyLmFuZHJvaWQuYXZjLmVuY29kZXIiLCAibGliY29kZWMyX3NvZnRfYXZjZW5jLnNvIik7CisgICAgZW1wbGFjZSgiYzIuYW5kcm9pZC5hYWMuZGVjb2RlciIsICJsaWJjb2RlYzJfc29mdF9hYWNkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJjMi5hbmRyb2lkLmFhYy5lbmNvZGVyIiwgImxpYmNvZGVjMl9zb2Z0X2FhY2VuYy5zbyIpOworICAgIGVtcGxhY2UoImMyLmFuZHJvaWQuYW1ybmIuZGVjb2RlciIsICJsaWJjb2RlYzJfc29mdF9hbXJuYmRlYy5zbyIpOworICAgIGVtcGxhY2UoImMyLmFuZHJvaWQuYW1ybmIuZW5jb2RlciIsICJsaWJjb2RlYzJfc29mdF9hbXJuYmVuYy5zbyIpOworICAgIGVtcGxhY2UoImMyLmFuZHJvaWQuYW1yd2IuZGVjb2RlciIsICJsaWJjb2RlYzJfc29mdF9hbXJ3YmRlYy5zbyIpOworICAgIGVtcGxhY2UoImMyLmFuZHJvaWQuYW1yd2IuZW5jb2RlciIsICJsaWJjb2RlYzJfc29mdF9hbXJ3YmVuYy5zbyIpOworICAgIGVtcGxhY2UoImMyLmFuZHJvaWQuaGV2Yy5kZWNvZGVyIiwgImxpYmNvZGVjMl9zb2Z0X2hldmNkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJjMi5hbmRyb2lkLmc3MTEuYWxhdy5kZWNvZGVyIiwgImxpYmNvZGVjMl9zb2Z0X2c3MTFhbGF3ZGVjLnNvIik7CisgICAgZW1wbGFjZSgiYzIuYW5kcm9pZC5nNzExLm1sYXcuZGVjb2RlciIsICJsaWJjb2RlYzJfc29mdF9nNzExbWxhd2RlYy5zbyIpOworICAgIGVtcGxhY2UoImMyLmFuZHJvaWQubXBlZzIuZGVjb2RlciIsICJsaWJjb2RlYzJfc29mdF9tcGVnMmRlYy5zbyIpOworICAgIGVtcGxhY2UoImMyLmFuZHJvaWQuaDI2My5kZWNvZGVyIiwgImxpYmNvZGVjMl9zb2Z0X2gyNjNkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJjMi5hbmRyb2lkLmgyNjMuZW5jb2RlciIsICJsaWJjb2RlYzJfc29mdF9oMjYzZW5jLnNvIik7CisgICAgZW1wbGFjZSgiYzIuYW5kcm9pZC5tcGVnNC5kZWNvZGVyIiwgImxpYmNvZGVjMl9zb2Z0X21wZWc0ZGVjLnNvIik7CisgICAgZW1wbGFjZSgiYzIuYW5kcm9pZC5tcGVnNC5lbmNvZGVyIiwgImxpYmNvZGVjMl9zb2Z0X21wZWc0ZW5jLnNvIik7CisgICAgZW1wbGFjZSgiYzIuYW5kcm9pZC5tcDMuZGVjb2RlciIsICJsaWJjb2RlYzJfc29mdF9tcDNkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJjMi5hbmRyb2lkLnZvcmJpcy5kZWNvZGVyIiwgImxpYmNvZGVjMl9zb2Z0X3ZvcmJpc2RlYy5zbyIpOworICAgIGVtcGxhY2UoImMyLmFuZHJvaWQub3B1cy5kZWNvZGVyIiwgImxpYmNvZGVjMl9zb2Z0X29wdXNkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJjMi5hbmRyb2lkLnZwOC5kZWNvZGVyIiwgImxpYmNvZGVjMl9zb2Z0X3ZwOGRlYy5zbyIpOworICAgIGVtcGxhY2UoImMyLmFuZHJvaWQudnA5LmRlY29kZXIiLCAibGliY29kZWMyX3NvZnRfdnA5ZGVjLnNvIik7CisgICAgZW1wbGFjZSgiYzIuYW5kcm9pZC52cDguZW5jb2RlciIsICJsaWJjb2RlYzJfc29mdF92cDhlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJjMi5hbmRyb2lkLnZwOS5lbmNvZGVyIiwgImxpYmNvZGVjMl9zb2Z0X3ZwOWVuYy5zbyIpOworICAgIGVtcGxhY2UoImMyLmFuZHJvaWQuYXYxLmRlY29kZXIiLCAibGliY29kZWMyX3NvZnRfYXYxZGVjLnNvIik7CisgICAgZW1wbGFjZSgiYzIuYW5kcm9pZC5yYXcuZGVjb2RlciIsICJsaWJjb2RlYzJfc29mdF9yYXdkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJjMi5hbmRyb2lkLmZsYWMuZGVjb2RlciIsICJsaWJjb2RlYzJfc29mdF9mbGFjZGVjLnNvIik7CisgICAgZW1wbGFjZSgiYzIuYW5kcm9pZC5mbGFjLmVuY29kZXIiLCAibGliY29kZWMyX3NvZnRfZmxhY2VuYy5zbyIpOworICAgIGVtcGxhY2UoImMyLmFuZHJvaWQuZ3NtLmRlY29kZXIiLCAibGliY29kZWMyX3NvZnRfZ3NtZGVjLnNvIik7CisgICAgZW1wbGFjZSgiYzIuYW5kcm9pZC54YWFjLmRlY29kZXIiLCAibGliY29kZWMyX3NvZnRfeGFhY2RlYy5zbyIpOworCisgICAgLy8gIkFsaWFzZXMiCisgICAgLy8gVE9ETzogdXNlIGFsaWFzZXMgcHJvcGVyIGZyb20gQzJDb21wb25lbnQ6OlRyYWl0cworICAgIGVtcGxhY2UoIk9NWC5nb29nbGUuaDI2NC5kZWNvZGVyIiwgImxpYmNvZGVjMl9zb2Z0X2F2Y2RlYy5zbyIpOworICAgIGVtcGxhY2UoIk9NWC5nb29nbGUuaDI2NC5lbmNvZGVyIiwgImxpYmNvZGVjMl9zb2Z0X2F2Y2VuYy5zbyIpOworICAgIGVtcGxhY2UoIk9NWC5nb29nbGUuYWFjLmRlY29kZXIiLCAibGliY29kZWMyX3NvZnRfYWFjZGVjLnNvIik7CisgICAgZW1wbGFjZSgiT01YLmdvb2dsZS5hYWMuZW5jb2RlciIsICJsaWJjb2RlYzJfc29mdF9hYWNlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJPTVguZ29vZ2xlLmFtcm5iLmRlY29kZXIiLCAibGliY29kZWMyX3NvZnRfYW1ybmJkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJPTVguZ29vZ2xlLmFtcm5iLmVuY29kZXIiLCAibGliY29kZWMyX3NvZnRfYW1ybmJlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJPTVguZ29vZ2xlLmFtcndiLmRlY29kZXIiLCAibGliY29kZWMyX3NvZnRfYW1yd2JkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJPTVguZ29vZ2xlLmFtcndiLmVuY29kZXIiLCAibGliY29kZWMyX3NvZnRfYW1yd2JlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJPTVguZ29vZ2xlLmhldmMuZGVjb2RlciIsICJsaWJjb2RlYzJfc29mdF9oZXZjZGVjLnNvIik7CisgICAgZW1wbGFjZSgiT01YLmdvb2dsZS5nNzExLmFsYXcuZGVjb2RlciIsICJsaWJjb2RlYzJfc29mdF9nNzExYWxhd2RlYy5zbyIpOworICAgIGVtcGxhY2UoIk9NWC5nb29nbGUuZzcxMS5tbGF3LmRlY29kZXIiLCAibGliY29kZWMyX3NvZnRfZzcxMW1sYXdkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJPTVguZ29vZ2xlLm1wZWcyLmRlY29kZXIiLCAibGliY29kZWMyX3NvZnRfbXBlZzJkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJPTVguZ29vZ2xlLmgyNjMuZGVjb2RlciIsICJsaWJjb2RlYzJfc29mdF9oMjYzZGVjLnNvIik7CisgICAgZW1wbGFjZSgiT01YLmdvb2dsZS5oMjYzLmVuY29kZXIiLCAibGliY29kZWMyX3NvZnRfaDI2M2VuYy5zbyIpOworICAgIGVtcGxhY2UoIk9NWC5nb29nbGUubXBlZzQuZGVjb2RlciIsICJsaWJjb2RlYzJfc29mdF9tcGVnNGRlYy5zbyIpOworICAgIGVtcGxhY2UoIk9NWC5nb29nbGUubXBlZzQuZW5jb2RlciIsICJsaWJjb2RlYzJfc29mdF9tcGVnNGVuYy5zbyIpOworICAgIGVtcGxhY2UoIk9NWC5nb29nbGUubXAzLmRlY29kZXIiLCAibGliY29kZWMyX3NvZnRfbXAzZGVjLnNvIik7CisgICAgZW1wbGFjZSgiT01YLmdvb2dsZS52b3JiaXMuZGVjb2RlciIsICJsaWJjb2RlYzJfc29mdF92b3JiaXNkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJPTVguZ29vZ2xlLm9wdXMuZGVjb2RlciIsICJsaWJjb2RlYzJfc29mdF9vcHVzZGVjLnNvIik7CisgICAgZW1wbGFjZSgiT01YLmdvb2dsZS52cDguZGVjb2RlciIsICJsaWJjb2RlYzJfc29mdF92cDhkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJPTVguZ29vZ2xlLnZwOS5kZWNvZGVyIiwgImxpYmNvZGVjMl9zb2Z0X3ZwOWRlYy5zbyIpOworICAgIGVtcGxhY2UoIk9NWC5nb29nbGUudnA4LmVuY29kZXIiLCAibGliY29kZWMyX3NvZnRfdnA4ZW5jLnNvIik7CisgICAgZW1wbGFjZSgiT01YLmdvb2dsZS52cDkuZW5jb2RlciIsICJsaWJjb2RlYzJfc29mdF92cDllbmMuc28iKTsKKyAgICBlbXBsYWNlKCJPTVguZ29vZ2xlLnJhdy5kZWNvZGVyIiwgImxpYmNvZGVjMl9zb2Z0X3Jhd2RlYy5zbyIpOworICAgIGVtcGxhY2UoIk9NWC5nb29nbGUuZmxhYy5kZWNvZGVyIiwgImxpYmNvZGVjMl9zb2Z0X2ZsYWNkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJPTVguZ29vZ2xlLmZsYWMuZW5jb2RlciIsICJsaWJjb2RlYzJfc29mdF9mbGFjZW5jLnNvIik7CisgICAgZW1wbGFjZSgiT01YLmdvb2dsZS5nc20uZGVjb2RlciIsICJsaWJjb2RlYzJfc29mdF9nc21kZWMuc28iKTsKKyAgICBlbXBsYWNlKCJPTVguZ29vZ2xlLnhhYWMuZGVjb2RlciIsICJsaWJjb2RlYzJfc29mdF94YWFjZGVjLnNvIik7Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6Y29weUJ1ZmZlcigKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gc3JjLCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQnVmZmVyPiBkc3QpIHsKKyAgICAodm9pZClzcmM7CisgICAgKHZvaWQpZHN0OworICAgIHJldHVybiBDMl9PTUlUVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OnF1ZXJ5X3NtKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gKmNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0IHsKKyAgICByZXR1cm4gbUludGVyZmFjZS5xdWVyeShzdGFja1BhcmFtcywgaGVhcFBhcmFtSW5kaWNlcywgQzJfTUFZX0JMT0NLLCBoZWFwUGFyYW1zKTsKK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpjb25maWdfc20oCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gKmNvbnN0IGZhaWx1cmVzKSB7CisgICAgcmV0dXJuIG1JbnRlcmZhY2UuY29uZmlnKHBhcmFtcywgQzJfTUFZX0JMT0NLLCBmYWlsdXJlcyk7Cit9CisKK3N0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPj4gQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpsaXN0Q29tcG9uZW50cygpIHsKKyAgICAvLyBUaGlzIG1ldGhvZCBTSEFMTCByZXR1cm4gd2l0aGluIDUwMG1zLgorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPj4gbGlzdDsKKyAgICBmb3IgKGNvbnN0IEMyU3RyaW5nICZhbGlhcyA6IG1Db21wb25lbnRzTGlzdCkgeworICAgICAgICBDb21wb25lbnRMb2FkZXIgJmxvYWRlciA9IG1Db21wb25lbnRzLmF0KGFsaWFzKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudE1vZHVsZT4gbW9kdWxlOworICAgICAgICBjMl9zdGF0dXNfdCByZXMgPSBsb2FkZXIuZmV0Y2hNb2R1bGUoJm1vZHVsZSk7CisgICAgICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPiB0cmFpdHMgPSBtb2R1bGUtPmdldFRyYWl0cygpOworICAgICAgICAgICAgaWYgKHRyYWl0cykgeworICAgICAgICAgICAgICAgIGxpc3QucHVzaF9iYWNrKHRyYWl0cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGxpc3Q7Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6ZmluZENvbXBvbmVudChDMlN0cmluZyBuYW1lLCBDb21wb25lbnRMb2FkZXIgKipsb2FkZXIpIHsKKyAgICAqbG9hZGVyID0gbnVsbHB0cjsKKyAgICBhdXRvIHBvcyA9IG1Db21wb25lbnRzLmZpbmQobmFtZSk7CisgICAgLy8gVE9ETzogY2hlY2sgYWxpYXNlcworICAgIGlmIChwb3MgPT0gbUNvbXBvbmVudHMuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIEMyX05PVF9GT1VORDsKKyAgICB9CisgICAgKmxvYWRlciA9ICZwb3MtPnNlY29uZDsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6Y3JlYXRlQ29tcG9uZW50KAorICAgICAgICBDMlN0cmluZyBuYW1lLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+ICpjb25zdCBjb21wb25lbnQpIHsKKyAgICAvLyBUaGlzIG1ldGhvZCBTSEFMTCByZXR1cm4gd2l0aGluIDEwMG1zLgorICAgIGNvbXBvbmVudC0+cmVzZXQoKTsKKyAgICBDb21wb25lbnRMb2FkZXIgKmxvYWRlcjsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBmaW5kQ29tcG9uZW50KG5hbWUsICZsb2FkZXIpOworICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudE1vZHVsZT4gbW9kdWxlOworICAgICAgICByZXMgPSBsb2FkZXItPmZldGNoTW9kdWxlKCZtb2R1bGUpOworICAgICAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBnZXQgYSB1bmlxdWUgbm9kZSBJRAorICAgICAgICAgICAgcmVzID0gbW9kdWxlLT5jcmVhdGVDb21wb25lbnQoMCwgY29tcG9uZW50KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OmNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgQzJTdHJpbmcgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAqY29uc3QgaW50ZXJmYWNlKSB7CisgICAgLy8gVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiAxMDBtcy4KKyAgICBpbnRlcmZhY2UtPnJlc2V0KCk7CisgICAgQ29tcG9uZW50TG9hZGVyICpsb2FkZXI7CisgICAgYzJfc3RhdHVzX3QgcmVzID0gZmluZENvbXBvbmVudChuYW1lLCAmbG9hZGVyKTsKKyAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnRNb2R1bGU+IG1vZHVsZTsKKyAgICAgICAgcmVzID0gbG9hZGVyLT5mZXRjaE1vZHVsZSgmbW9kdWxlKTsKKyAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAgICAgLy8gVE9ETzogZ2V0IGEgdW5pcXVlIG5vZGUgSUQKKyAgICAgICAgICAgIHJlcyA9IG1vZHVsZS0+Y3JlYXRlSW50ZXJmYWNlKDAsIGludGVyZmFjZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpxdWVyeVN1cHBvcnRlZFBhcmFtc19uYigKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKmNvbnN0IHBhcmFtcykgY29uc3QgeworICAgIHJldHVybiBtSW50ZXJmYWNlLnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKHBhcmFtcyk7Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6cXVlcnlTdXBwb3J0ZWRWYWx1ZXNfc20oCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcykgY29uc3QgeworICAgIHJldHVybiBtSW50ZXJmYWNlLnF1ZXJ5U3VwcG9ydGVkVmFsdWVzKGZpZWxkcywgQzJfTUFZX0JMT0NLKTsKK30KKworQzJTdHJpbmcgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpnZXROYW1lKCkgY29uc3QgeworICAgIHJldHVybiAiYW5kcm9pZC5jb21wb25lbnRTdG9yZS5wbGF0Zm9ybSI7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OmdldFBhcmFtUmVmbGVjdG9yKCkgY29uc3QgeworICAgIHJldHVybiBtUmVmbGVjdG9yOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpIHsKKyAgICBzdGF0aWMgc3RkOjptdXRleCBtdXRleDsKKyAgICBzdGF0aWMgc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBwbGF0Zm9ybVN0b3JlOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG11dGV4KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gc3RvcmUgPSBwbGF0Zm9ybVN0b3JlLmxvY2soKTsKKyAgICBpZiAoc3RvcmUgPT0gbnVsbHB0cikgeworICAgICAgICBzdG9yZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlPigpOworICAgICAgICBwbGF0Zm9ybVN0b3JlID0gc3RvcmU7CisgICAgfQorICAgIHJldHVybiBzdG9yZTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvckdyYWxsb2MuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JHcmFsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVkOTg5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JHcmFsbG9jLmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfQ09ERUMyX0FMTE9DQVRPUl9HUkFMTE9DX0hfCisjZGVmaW5lIFNUQUdFRlJJR0hUX0NPREVDMl9BTExPQ0FUT1JfR1JBTExPQ19IXworCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBVbndyYXAgdGhlIG5hdGl2ZSBoYW5kbGUgZnJvbSBhIENvZGVjMiBoYW5kbGUgYWxsb2NhdGVkIGJ5IEMyQWxsb2NhdG9yR3JhbGxvYy4KKyAqCisgKiBAcGFyYW0gaGFuZGxlIGEgaGFuZGxlIGFsbG9jYXRlZCBieSBDMkFsbG9jYXRvckdyYWxsb2MuIFRoaXMgaW5jbHVkZXMgaGFuZGxlcyByZXR1cm5lZCBmb3IgYQorICogZ3JhcGhpYyBibG9jayBhbGxvY2F0aW9uIGhhbmRsZSByZXR1cm5lZC4KKyAqCisgKiBAcmV0dXJuIGEgbmV3IE5PTi1PV05JTkcgbmF0aXZlIGhhbmRsZSB0aGF0IG11c3QgYmUgZGVsZXRlZCB1c2luZyBuYXRpdmVfaGFuZGxlX2RlbGV0ZS4KKyAqLworbmF0aXZlX2hhbmRsZV90ICpVbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlKGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUpOworCisvKioKKyAqIFdyYXAgdGhlIGdyYWxsb2MgaGFuZGxlIGFuZCBtZXRhZGF0YSBpbnRvIENvZGVjMiBoYW5kbGUgcmVjb2duaXplZCBieQorICogQzJBbGxvY2F0b3JHcmFsbG9jLgorICoKKyAqIEByZXR1cm4gYSBuZXcgTk9OLU9XTklORyBDMkhhbmRsZSB0aGF0IG11c3QgYmUgZGVsZXRlZCB1c2luZyBuYXRpdmVfaGFuZGxlX2RlbGV0ZS4KKyAqLworQzJIYW5kbGUgKldyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlKAorICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmNvbnN0IGhhbmRsZSwKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LCB1aW50NjRfdCB1c2FnZSwgdWludDMyX3Qgc3RyaWRlLAorICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uID0gMCwgdWludDY0X3QgaWdicF9pZCA9IDAsIHVpbnQzMl90IGlnYnBfc2xvdCA9IDApOworCisvKioKKyAqIFx0b2RvIEdldCB0aGlzIGZyb20gdGhlIGJ1ZmZlcgorICovCit2b2lkIF9VbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jTWV0YWRhdGEoCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUsCisgICAgICAgIHVpbnQzMl90ICp3aWR0aCwgdWludDMyX3QgKmhlaWdodCwgdWludDMyX3QgKmZvcm1hdCwgdWludDY0X3QgKnVzYWdlLCB1aW50MzJfdCAqc3RyaWRlLAorICAgICAgICB1aW50MzJfdCAqZ2VuZXJhdGlvbiwgdWludDY0X3QgKmlnYnBfaWQsIHVpbnQzMl90ICppZ2JwX3Nsb3QpOworCitjbGFzcyBDMkFsbG9jYXRvckdyYWxsb2MgOiBwdWJsaWMgQzJBbGxvY2F0b3IgeworcHVibGljOgorICAgIHZpcnR1YWwgaWRfdCBnZXRJZCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUcmFpdHM+IGdldFRyYWl0cygpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBuZXdHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHByaW9yR3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICphbGxvY2F0aW9uKSBvdmVycmlkZTsKKworICAgIEMyQWxsb2NhdG9yR3JhbGxvYyhpZF90IGlkLCBib29sIGJ1ZmZlclF1ZXVlID0gZmFsc2UpOworCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIH5DMkFsbG9jYXRvckdyYWxsb2MoKSBvdmVycmlkZTsKKworICAgIHN0YXRpYyBib29sIGlzVmFsaWQoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pOworCitwcml2YXRlOgorICAgIGNsYXNzIEltcGw7CisgICAgSW1wbCAqbUltcGw7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBTVEFHRUZSSUdIVF9DT0RFQzJfQUxMT0NBVE9SX0dSQUxMT0NfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JJb24uaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JJb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjIwNTFmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvcklvbi5oCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTVEFHRUZSSUdIVF9DT0RFQzJfQUxMT0NBVE9SX0lPTl9IXworI2RlZmluZSBTVEFHRUZSSUdIVF9DT0RFQzJfQUxMT0NBVE9SX0lPTl9IXworCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEMyQWxsb2NhdG9ySW9uIDogcHVibGljIEMyQWxsb2NhdG9yIHsKK3B1YmxpYzoKKyAgICAvLyBVc2FnZSBtYXBwZXIgZnVuY3Rpb24gdXNlZCBieSB0aGUgYWxsb2NhdG9yCisgICAgLy8gICAodXNhZ2UsIGNhcGFjaXR5KSA9PiAoYWxpZ24sIGhlYXBNYXNrLCBmbGFncykKKyAgICAvLworICAgIC8vIGNhcGFjaXR5IGlzIGFsaWduZWQgdG8gdGhlIGRlZmF1bHQgYmxvY2stc2l6ZSAoZGVmYXVsdHMgdG8gcGFnZSBzaXplKSB0byByZWR1Y2UgY2FjaGluZworICAgIC8vIG92ZXJoZWFkCisgICAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KEMyTWVtb3J5VXNhZ2UsIHNpemVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAvKiA9PiAqLyBzaXplX3QqLCB1bnNpZ25lZCosIHVuc2lnbmVkKik+IFVzYWdlTWFwcGVyRm47CisKKyAgICB2aXJ0dWFsIGlkX3QgZ2V0SWQoKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVHJhaXRzPiBnZXRUcmFpdHMoKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbmV3TGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LCBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBwcmlvckxpbmVhckFsbG9jYXRpb24oCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIG92ZXJyaWRlOworCisgICAgQzJBbGxvY2F0b3JJb24oaWRfdCBpZCk7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHN0YXR1cygpIGNvbnN0IHsgcmV0dXJuIG1Jbml0OyB9CisKKyAgICB2aXJ0dWFsIH5DMkFsbG9jYXRvcklvbigpIG92ZXJyaWRlOworCisgICAgc3RhdGljIGJvb2wgaXNWYWxpZChjb25zdCBDMkhhbmRsZSogY29uc3Qgbyk7CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIHRoZSB1c2FnZSBtYXBwZXIgZm9yIHN1YnNlcXVlbnQgbmV3IGFsbG9jYXRpb25zLCBhcyB3ZWxsIGFzIHRoZSBzdXBwb3J0ZWQKKyAgICAgKiBtaW5pbXVtIGFuZCBtYXhpbXVtIHVzYWdlIG1hc2tzIGFuZCBkZWZhdWx0IGJsb2NrLXNpemUgdG8gdXNlIGZvciB0aGUgbWFwcGVyLgorICAgICAqCisgICAgICogXHBhcmFtIG1hcHBlciB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gbWFwIENvZGVjIDIuMCBidWZmZXIgdXNhZ2UgdG8gaW9uIGZsYWdzCisgICAgICogICAgICAgIHJlcXVpcmVkIGJ5IHRoZSBpb24gZGV2aWNlCisgICAgICogXHBhcmFtIG1pblVzYWdlIG1pbmltdW0gYnVmZmVyIHVzYWdlIHJlcXVpcmVkIGZvciBzdXBwb3J0ZWQgYWxsb2NhdGlvbnMgKGRlZmF1bHRzIHRvIDApCisgICAgICogXHBhcmFtIG1heFVzYWdlIG1heGltdW0gYnVmZmVyIHVzYWdlIHN1cHBvcnRlZCBieSB0aGUgaW9uIGFsbG9jYXRvciAoZGVmYXVsdHMgdG8gU1dfUkVBRAorICAgICAqICAgICAgICB8IFNXX1dSSVRFKQorICAgICAqIFxwYXJhbSBibG9ja1NpemUgYWxpZ25tZW50IHVzZWQgcHJpb3IgdG8gY2FsbGluZyB8bWFwcGVyfCBmb3IgdGhlIGJ1ZmZlciBjYXBhY2l0eS4KKyAgICAgKiAgICAgICAgVGhpcyBhbHNvIGhlbHBzIHJlZHVjZSB0aGUgc2l6ZSBvZiBjYWNoZSByZXF1aXJlZCBmb3IgY2FjaGluZyBtYXBwZXIgcmVzdWx0cy4KKyAgICAgKiAgICAgICAgKGRlZmF1bHRzIHRvIHRoZSBwYWdlIHNpemUpCisgICAgICovCisgICAgdm9pZCBzZXRVc2FnZU1hcHBlcigKKyAgICAgICAgICAgIGNvbnN0IFVzYWdlTWFwcGVyRm4gJm1hcHBlciwgdWludDY0X3QgbWluVXNhZ2UsIHVpbnQ2NF90IG1heFVzYWdlLCB1aW50NjRfdCBibG9ja1NpemUpOworCitwcml2YXRlOgorICAgIGMyX3N0YXR1c190IG1hcFVzYWdlKEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgLyogPT4gKi8gc2l6ZV90ICphbGlnbiwgdW5zaWduZWQgKmhlYXBNYXNrLCB1bnNpZ25lZCAqZmxhZ3MpOworCisgICAgYzJfc3RhdHVzX3QgbUluaXQ7CisgICAgaW50IG1Jb25GZDsKKworICAgIC8vIHRoaXMgbG9ja3MgbVRyYWl0cywgbUJsb2NrU2l6ZSwgbVVzYWdlTWFwcGVyLCBtVXNhZ2VNYXBwZXJMcnUgYW5kIG1Vc2FnZU1hcHBlckNhY2hlCisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1Vc2FnZU1hcHBlckxvY2s7CisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFRyYWl0cz4gbVRyYWl0czsKKyAgICBzaXplX3QgbUJsb2NrU2l6ZTsKKyAgICBVc2FnZU1hcHBlckZuIG1Vc2FnZU1hcHBlcjsKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjx1aW50NjRfdCwgc2l6ZV90PiBNYXBwZXJLZXk7CisgICAgc3RydWN0IE1hcHBlcktleUhhc2ggeworICAgICAgICBzdGQ6OnNpemVfdCBvcGVyYXRvcigpKGNvbnN0IE1hcHBlcktleSAmKSBjb25zdDsKKyAgICB9OworICAgIHR5cGVkZWYgc3RkOjp0dXBsZTxzaXplX3QsIHVuc2lnbmVkLCB1bnNpZ25lZCwgYzJfc3RhdHVzX3Q+IE1hcHBlclZhbHVlOworICAgIHR5cGVkZWYgc3RkOjpwYWlyPE1hcHBlcktleSwgTWFwcGVyVmFsdWU+IE1hcHBlcktleVZhbHVlOworICAgIHR5cGVkZWYgc3RkOjpsaXN0PE1hcHBlcktleVZhbHVlPjo6aXRlcmF0b3IgTWFwcGVyS2V5VmFsdWVQb2ludGVyOworICAgIHN0ZDo6bGlzdDxNYXBwZXJLZXlWYWx1ZT4gbVVzYWdlTWFwcGVyTHJ1OworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxNYXBwZXJLZXksIE1hcHBlcktleVZhbHVlUG9pbnRlciwgTWFwcGVyS2V5SGFzaD4gbVVzYWdlTWFwcGVyQ2FjaGU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBTVEFHRUZSSUdIVF9DT0RFQzJfQUxMT0NBVE9SX0lPTl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkJxQnVmZmVyUHJpdi5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkJxQnVmZmVyUHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNzFhNzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQnFCdWZmZXJQcml2LmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfQ09ERUMyX0JRX0JVRkZFUl9QUklWX0hfCisjZGVmaW5lIFNUQUdFRlJJR0hUX0NPREVDMl9CUV9CVUZGRVJfUFJJVl9IXworCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorCitjbGFzcyBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sIDogcHVibGljIEMyQmxvY2tQb29sIHsKK3B1YmxpYzoKKyAgICBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jYXRvciwgY29uc3QgbG9jYWxfaWRfdCBsb2NhbElkKTsKKworICAgIHZpcnR1YWwgfkMyQnVmZmVyUXVldWVCbG9ja1Bvb2woKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdG9yLT5nZXRJZCgpOworICAgIH07CisKKyAgICB2aXJ0dWFsIGxvY2FsX2lkX3QgZ2V0TG9jYWxJZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1Mb2NhbElkOworICAgIH07CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsCisgICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CisKKyAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZCh1aW50NjRfdCBwcm9kdWNlciwgaW50MzJfdCBzbG90LCBpbnQ2NF90IG5zZWNzKT4gT25SZW5kZXJDYWxsYmFjazsKKworICAgIC8qKgorICAgICAqIFNldHMgcmVuZGVyIGNhbGxiYWNrLgorICAgICAqCisgICAgICogXHBhcmFtIHJlbmRlckNhbGxiYWsgY2FsbGJhY2sgdG8gY2FsbCBmb3IgYWxsIGRlcXVldWUgYnVmZmVyLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBzZXRSZW5kZXJDYWxsYmFjayhjb25zdCBPblJlbmRlckNhbGxiYWNrICZyZW5kZXJDYWxsYmFjayA9IE9uUmVuZGVyQ2FsbGJhY2soKSk7CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmVzIGFuIElHQlAgaW4gb3JkZXIgdG8gY3JlYXRlIGJsb2Nrcy4gQSBuZXdseSBjcmVhdGVkIGJsb2NrIGlzCisgICAgICogZGVxdWV1ZWQgZnJvbSB0aGUgY29uZmlndXJlZCBJR0JQLiBVbmlxdWUgSWQgb2YgSUdCUCBhbmQgdGhlIHNsb3QgbnVtYmVyIG9mCisgICAgICogYmxvY2tzIGFyZSBwYXNzZWQgdmlhIG5hdGl2ZV9oYW5kbGUuIE1hbmFnaW5nIElHQlAgaXMgcmVzcG9uc2liaWxpdHkgb2YgY2FsbGVyLgorICAgICAqIFdoZW4gSUdCUCBpcyBub3QgY29uZmlndXJlZCwgYmxvY2sgd2lsbCBiZSBjcmVhdGVkIHZpYSBhbGxvY2F0b3IuCisgICAgICogU2luY2UgemVybyBpcyBub3QgdXNlZCBmb3IgVW5pcXVlIElkIG9mIElHQlAsIGlmIElHQlAgaXMgbm90IGNvbmZpZ3VyZWQgb3IgcHJvZHVjZXIKKyAgICAgKiBpcyBjb25maWd1cmVkIGFzIG51bGxwdHIsIHVuaXF1ZSBpZCB3aGljaCBpcyBidW5kbGVkIGluIG5hdGl2ZV9oYW5kbGUgaXMgemVyby4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwcm9kdWNlciAgICAgIHRoZSBJR0JQLCB3aGljaCB3aWxsIGJlIHVzZWQgdG8gZmV0Y2ggYmxvY2tzCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIGNvbmZpZ3VyZVByb2R1Y2VyKGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OkhHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZwcm9kdWNlcik7CisKK3ByaXZhdGU6CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworICAgIGNvbnN0IGxvY2FsX2lkX3QgbUxvY2FsSWQ7CisKKyAgICBjbGFzcyBJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE7Cit9OworCisjZW5kaWYgLy8gU1RBR0VGUklHSFRfQ09ERUMyX0JVRkZFUl9QUklWX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQnVmZmVyUHJpdi5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkJ1ZmZlclByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTVmNjljCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkJ1ZmZlclByaXYuaApAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfQ09ERUMyX0JVRkZFUl9QUklWX0hfCisjZGVmaW5lIFNUQUdFRlJJR0hUX0NPREVDMl9CVUZGRVJfUFJJVl9IXworCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JQWNjZXNzb3IuaD4KKworY2xhc3MgQzJCYXNpY0xpbmVhckJsb2NrUG9vbCA6IHB1YmxpYyBDMkJsb2NrUG9vbCB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQzJCYXNpY0xpbmVhckJsb2NrUG9vbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IpOworCisgICAgdmlydHVhbCB+QzJCYXNpY0xpbmVhckJsb2NrUG9vbCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdG9yLT5nZXRJZCgpOworICAgIH0KKworICAgIHZpcnR1YWwgbG9jYWxfaWRfdCBnZXRMb2NhbElkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQkFTSUNfTElORUFSOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CisKKyAgICAvLyBUT0RPOiBmZXRjaENpcmN1bGFyQmxvY2sKKworcHJpdmF0ZToKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1BbGxvY2F0b3I7Cit9OworCitjbGFzcyBDMkJhc2ljR3JhcGhpY0Jsb2NrUG9vbCA6IHB1YmxpYyBDMkJsb2NrUG9vbCB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQzJCYXNpY0dyYXBoaWNCbG9ja1Bvb2woY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yKTsKKworICAgIHZpcnR1YWwgfkMyQmFzaWNHcmFwaGljQmxvY2tQb29sKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCBDMkFsbG9jYXRvcjo6aWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0b3ItPmdldElkKCk7CisgICAgfQorCisgICAgdmlydHVhbCBsb2NhbF9pZF90IGdldExvY2FsSWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBCQVNJQ19HUkFQSElDOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1BbGxvY2F0b3I7Cit9OworCitjbGFzcyBDMlBvb2xlZEJsb2NrUG9vbCA6IHB1YmxpYyBDMkJsb2NrUG9vbCB7CitwdWJsaWM6CisgICAgQzJQb29sZWRCbG9ja1Bvb2woY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yLCBjb25zdCBsb2NhbF9pZF90IGxvY2FsSWQpOworCisgICAgdmlydHVhbCB+QzJQb29sZWRCbG9ja1Bvb2woKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdG9yLT5nZXRJZCgpOworICAgIH0KKworICAgIHZpcnR1YWwgbG9jYWxfaWRfdCBnZXRMb2NhbElkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUxvY2FsSWQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHksCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jaykgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGNvbm5lY3Rpb24gSWQgZm9yIHVuZGVybHlpbmcgYnVmZmVycG9vbAorICAgICAqLworICAgIGludDY0X3QgZ2V0Q29ubmVjdGlvbklkKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGFjY2Vzc29yIHdoaWNoIGlzIHVzZWQgYnkgdW5kZXJseWluZyBidWZmZXJwb29sLiAoSXQgY2FuIGJlCisgICAgICogcGFzc2VkIHRvIHJlY2VpdmluZyBwcm9jZXNzLikKKyAgICAgKgorICAgICAqIFxwYXJhbSBhY2Nlc3NvciAgICAgICAgICBJQWNjZXNzb3Igd2lsbCBiZSB3cml0dGVuIHRvIHRoaXMgb3V0IHBhcmFtZXRlci4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdHJ1ZSAgICAgICAgICAgICBJQWNlc3NvciBpcyB3cml0ZW4gc3VjY2Vzc2Z1bGx5LgorICAgICAqIFxyZXR1cm4gZmFsc2UgICAgICAgICAgICBJQWNjZXNzb3IgaXMgbm90IHdyaXR0ZW4uCisgICAgICovCisgICAgYm9vbCBnZXRBY2Nlc3NvcihhbmRyb2lkOjpzcDxhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklBY2Nlc3Nvcj4gKmFjY2Vzc29yKTsKKworcHJpdmF0ZToKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisgICAgY29uc3QgbG9jYWxfaWRfdCBtTG9jYWxJZDsKKworICAgIGNsYXNzIEltcGw7CisgICAgc3RkOjp1bmlxdWVfcHRyPEltcGw+IG1JbXBsOworfTsKKworI2VuZGlmIC8vIFNUQUdFRlJJR0hUX0NPREVDMl9CVUZGRVJfUFJJVl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkNvbXBvbmVudEZhY3RvcnkuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJDb21wb25lbnRGYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZkOGI5OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJDb21wb25lbnRGYWN0b3J5LmgKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfQ09ERUMyX0NPTVBPTkVOVF9GQUNUT1JZX0hfCisjZGVmaW5lIFNUQUdFRlJJR0hUX0NPREVDMl9DT01QT05FTlRfRkFDVE9SWV9IXworCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgorCisvKioKKyAqIENvbXBvbmVudCBmYWN0b3J5IG9iamVjdCB0aGF0IGVuYWJsZXMgdG8gY3JlYXRlIGEgY29tcG9uZW50IGFuZC9vciBpbnRlcmZhY2UgZnJvbSBhIGR5bmFtaWNhbGx5CisgKiBsaW5rZWQgbGlicmFyeS4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgY29tcG9uZW50L2ludGVyZmFjZXMgYXJlIG1hbmFnZWQgb2JqZWN0cywgYnV0IHdlCisgKiBjYW5ub3Qgc2FmZWx5IGNyZWF0ZSBhIG1hbmFnZWQgb2JqZWN0IGFuZCBwYXNzIGl0IGluIEMuCisgKgorICogQ29tcG9uZW50cy9pbnRlcmZhY2VzIHR5cGljYWxseSBpbmhlcml0IGZyb20gc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpcywgYnV0IEMgcmVxdWlyZXMKKyAqIHBhc3Npbmcgc2ltcGxlIHBvaW50ZXIsIGFuZCBzaGFyZWRfcHRyIGNvbnN0cnVjdG9yIG5lZWRzIHRvIGtub3cgdGhlIGNsYXNzIHRvIGJlIGNvbnN0cnVjdGVkCisgKiBkZXJpdmVzIGZyb20gZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMuCisgKgorICovCitjbGFzcyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKDo6QzJDb21wb25lbnQqKT4gQ29tcG9uZW50RGVsZXRlcjsKKyAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZCg6OkMyQ29tcG9uZW50SW50ZXJmYWNlKik+IEludGVyZmFjZURlbGV0ZXI7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiAxMDBtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpZCAgICAgICAgY29tcG9uZW50IElEIGZvciB0aGUgY3JlYXRlZCBjb21wb25lbnQKKyAgICAgKiBccGFyYW0gY29tcG9uZW50IHNoYXJlZCBwb2ludGVyIHdoZXJlIHRoZSBjcmVhdGVkIGNvbXBvbmVudCBpcyBzdG9yZWQuIENsZWFyZWQgb24KKyAgICAgKiAgICAgICAgICAgICAgICAgIGZhaWx1cmUgYW5kIHVwZGF0ZWQgb24gc3VjY2Vzcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IGNyZWF0ZSB0aGUgY29tcG9uZW50IHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBjcmVhdGlvbiBvZiB0aGUgY29tcG9uZW50ICh1bmV4cGVjdGVkKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIHRoZSBjb21wb25lbnQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgQ29tcG9uZW50RGVsZXRlciBkZWxldGVyID0gc3RkOjpkZWZhdWx0X2RlbGV0ZTxDMkNvbXBvbmVudD4oKSkgPSAwOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGNvbXBvbmVudCBpbnRlcmZhY2UuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBTSEFMTCByZXR1cm4gd2l0aGluIDEwMG1zLgorICAgICAqCisgICAgICogXHBhcmFtIGlkICAgICAgICBjb21wb25lbnQgaW50ZXJmYWNlIElEIGZvciB0aGUgY3JlYXRlZCBpbnRlcmZhY2UKKyAgICAgKiBccGFyYW0gaW50ZXJmYWNlIHNoYXJlZCBwb2ludGVyIHdoZXJlIHRoZSBjcmVhdGVkIGludGVyZmFjZSBpcyBzdG9yZWQuIENsZWFyZWQgb24KKyAgICAgKiAgICAgICAgICAgICAgICAgIGZhaWx1cmUgYW5kIHVwZGF0ZWQgb24gc3VjY2Vzcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgaW50ZXJmYWNlIHdhcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBjcmVhdGUgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2Ugd2l0aGluIHRoZSB0aW1lIGxpbWl0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgY3JlYXRpb24gb2YgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSB0aGUgY29tcG9uZW50IGludGVyZmFjZQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBJbnRlcmZhY2VEZWxldGVyIGRlbGV0ZXIgPSBzdGQ6OmRlZmF1bHRfZGVsZXRlPEMyQ29tcG9uZW50SW50ZXJmYWNlPigpKSA9IDA7CisKKyAgICB2aXJ0dWFsIH5DMkNvbXBvbmVudEZhY3RvcnkoKSA9IGRlZmF1bHQ7CisKKyAgICB0eXBlZGVmIDo6QzJDb21wb25lbnRGYWN0b3J5KiAoKkNyZWF0ZUNvZGVjMkZhY3RvcnlGdW5jKSh2b2lkKTsKKyAgICB0eXBlZGVmIHZvaWQgKCpEZXN0cm95Q29kZWMyRmFjdG9yeUZ1bmMpKDo6QzJDb21wb25lbnRGYWN0b3J5Kik7Cit9OworCisKKyNlbmRpZiAvLyBTVEFHRUZSSUdIVF9DT0RFQzJfQ09NUE9ORU5UX0ZBQ1RPUllfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJEZWJ1Zy5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkRlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYxY2RhYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJEZWJ1Zy5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyVVRJTFNfREVCVUdfSF8KKyNkZWZpbmUgQzJVVElMU19ERUJVR19IXworCisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLWxvZy5oPgorCisvLyBUbyBhbGxvdyBhcmJpdHJhcnkgb3JkZXJpbmcgb2YgQzJEZWJ1Zy5oIGFuZCBBUEkgaGVhZGVycyBhbmQgdG8ga2VlcCBkZWJ1ZyB1dGlsaXRpZXMgc2VwYXJhdGVseQorLy8gZnJvbSB0aGUgQVBJIGRlZmluaXRpb25zLCB3ZSBwcm92aWRlIEFQSSBoZWFkZXIgc3BlY2lmaWMgZGVidWcgaGVhZGVycy4KKyNpZmRlZiBDMlBBUkFNX0hfCisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLXBhcmFtLmg+CisjZW5kaWYKKworI2VuZGlmICAvLyBDMlVUSUxTX0RFQlVHX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyRXJybm9VdGlscy5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkVycm5vVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yjk5NWY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkVycm5vVXRpbHMuaApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNUQUdFRlJJR0hUX0NPREVDMl9FUlJOT19VVElMU19IXworI2RlZmluZSBTVEFHRUZSSUdIVF9DT0RFQzJfRVJSTk9fVVRJTFNfSF8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8QzIuaD4KKworLy8gc3RhbmRhcmQgRVJSTk8gbWFwcGluZ3MKK3RlbXBsYXRlPGludCBOPiBjb25zdGV4cHIgYzJfc3RhdHVzX3QgX2MyX2Vycm5vMnN0YXR1c19pbXBsKCk7Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBjMl9zdGF0dXNfdCBfYzJfZXJybm8yc3RhdHVzX2ltcGw8MD4oKSAgICAgICB7IHJldHVybiBDMl9PSzsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgYzJfc3RhdHVzX3QgX2MyX2Vycm5vMnN0YXR1c19pbXBsPEVJTlZBTD4oKSAgeyByZXR1cm4gQzJfQkFEX1ZBTFVFOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBjMl9zdGF0dXNfdCBfYzJfZXJybm8yc3RhdHVzX2ltcGw8RUFDQ0VTPigpICB7IHJldHVybiBDMl9SRUZVU0VEOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBjMl9zdGF0dXNfdCBfYzJfZXJybm8yc3RhdHVzX2ltcGw8RVBFUk0+KCkgICB7IHJldHVybiBDMl9SRUZVU0VEOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBjMl9zdGF0dXNfdCBfYzJfZXJybm8yc3RhdHVzX2ltcGw8RU5PTUVNPigpICB7IHJldHVybiBDMl9OT19NRU1PUlk7IH0KKworLy8gbWFwIHN0YW5kYXJkIGVycm5vLXMgdG8gdGhlIGVxdWl2YWxlbnQgYzJfc3RhdHVzX3QKK3RlbXBsYXRlPGludC4uLiBOPiBzdHJ1Y3QgX2MyX21hcF9lcnJub19pbXBsOwordGVtcGxhdGU8aW50IEUsIGludCAuLi4gTj4gc3RydWN0IF9jMl9tYXBfZXJybm9faW1wbDxFLCBOLi4uPiB7CisgICAgc3RhdGljIGMyX3N0YXR1c190IG1hcChpbnQgcmVzdWx0KSB7CisgICAgICAgIGlmIChyZXN1bHQgPT0gRSkgeworICAgICAgICAgICAgcmV0dXJuIF9jMl9lcnJubzJzdGF0dXNfaW1wbCA8RT4oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBfYzJfbWFwX2Vycm5vX2ltcGw8Ti4uLj46Om1hcChyZXN1bHQpOworICAgICAgICB9CisgICAgfQorfTsKK3RlbXBsYXRlPD4gc3RydWN0IF9jMl9tYXBfZXJybm9faW1wbDw+IHsKKyAgICBzdGF0aWMgYzJfc3RhdHVzX3QgbWFwKGludCByZXN1bHQpIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdCA9PSAwID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7CisgICAgfQorfTsKKwordGVtcGxhdGU8aW50Li4uIE4+CitjMl9zdGF0dXNfdCBjMl9tYXBfZXJybm8oaW50IHJlc3VsdCkgeworICAgIHJldHVybiBfYzJfbWFwX2Vycm5vX2ltcGw8Ti4uLj46Om1hcChyZXN1bHQpOworfQorCisjZW5kaWYgLy8gU1RBR0VGUklHSFRfQ09ERUMyX0VSUk5PX1VUSUxTX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMTA2NDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5oCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfQzJfUExBVEZPUk1fU1RPUkVfUExVR0lOX0xPQURFUl9IXworCisjZGVmaW5lIFNUQUdFRlJJR0hUX0MyX1BMQVRGT1JNX1NUT1JFX1BMVUdJTl9MT0FERVJfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisKKyNpbmNsdWRlIDxDMi5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisKKy8qKgorICogRXh0ZXJuIEMgaW50ZXJmYWNlIGZvciBjcmVhdGluZyBibG9jayBwb29sIGZyb20gcGxhdGZvcm0gc3RvcmUgZXh0ZW5zaW9uLgorICoKKyAqIFxwYXJhbSBhbGxvY3RvcklkICB0aGUgSUQgb2YgdGhlIGJhY2tpbmcgYWxsb2NhdG9yIHR5cGUuCisgKiBccGFyZW0gYmxvY2tQb29sSWQgdGhlIElEIG9mIGNyZWF0ZWQgYmxvY2sgcG9vbC4KKyAqCisgKiBccmV0dXJuIHBvaW50ZXIgb2YgY3JlYXRlZCBDMkJsb2NrUG9vbCwgbnVsbHB0ciBvbiBlcnJvci4KKyAqLwordHlwZWRlZiA6OkMyQmxvY2tQb29sKiAoKkNyZWF0ZUJsb2NrUG9vbEZ1bmMpKDo6QzJBbGxvY2F0b3I6OmlkX3QsIDo6QzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QpOworCisvKioKKyAqIEV4dGVybiBDIGludGVyZmFjZSBmb3IgY3JlYXRpbmcgYWxsb2NhdG9yIGZyb20gcGxhdGZvcm0gc3RvcmUgZXh0ZW5zaW9uLgorICoKKyAqIFxwYXJhbSBhbGxvY3RvcklkICB0aGUgSUQgb2YgdGhlIGFsbG9jYXRvciB0byBjcmVhdGUuCisgKiBccGFyYW0gc3RhdHVzICAgICAgdGhlIHJldHVybmVkIHN0YXR1cyBmcm9tIGNyZWF0aW5nIGFsbG9jYXRvci4KKyAqCisgKiBccmV0dXJuIHBvaW50ZXIgb2YgY3JlYXRlZCBDMkFsbG9jYXRvciwgbnVsbHB0ciBvbiBlcnJvci4KKyAqLwordHlwZWRlZiA6OkMyQWxsb2NhdG9yKiAoKkNyZWF0ZUFsbG9jYXRvckZ1bmMpKDo6QzJBbGxvY2F0b3I6OmlkX3QsIDo6YzJfc3RhdHVzX3QqKTsKKworY2xhc3MgQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcj4mIEdldEluc3RhbmNlKCk7CisgICAgfkMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcigpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBibG9jayBwb29sIGZyb20gcGxhdGZvcm0gc3RvcmUgZXh0ZW5zaW9uLgorICAgICAqCisgICAgICogXHBhcmFtIGFsbG9jdG9ySWQgIHRoZSBJRCBvZiB0aGUgYmFja2luZyBhbGxvY2F0b3IgdHlwZS4KKyAgICAgKiBccGFyYW0gYmxvY2tQb29sSWQgdGhlIElEIG9mIGNyZWF0ZWQgYmxvY2sgcG9vbC4KKyAgICAgKiBccGFyYW0gcG9vbCAgICAgICAgc2hhcmVkIHBvaW50ZXIgd2hlcmUgdGhlIGNyZWF0ZWQgYmxvY2sgcG9vbCBpcyBzdG9yZWQuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgYmxvY2sgcG9vbCB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgdGhlIGV4dGVuc2lvbiBzeW1ib2wgd2FzIG5vdCBmb3VuZC4KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCB0aGUgaW5wdXQgYWxsb2NhdG9ySWQgaXMgbm90IGRlZmluZWQgaW4gcGxhdGZvcm0gc3RvcmUgZXh0ZW5zaW9uLgorICAgICAqLworICAgIGMyX3N0YXR1c190IGNyZWF0ZUJsb2NrUG9vbCg6OkMyQWxsb2NhdG9yOjppZF90IGFsbG9jYXRvcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OkMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGJsb2NrUG9vbElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+KiBwb29sKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYWxsb2NhdG9yIGZyb20gcGxhdGZvcm0gc3RvcmUgZXh0ZW5zaW9uLgorICAgICAqCisgICAgICogTm90ZSB0aGF0IHRoaXMgYWxsb2NhdG9yIGlzIG5vdCBjcmVhdGVkIGFzIHNoYXJlZCBzaW5nbGV0b24gYXMgQzJBbGxvY2F0b3JTdG9yZSBkb2VzLCBiZWNhdXNlCisgICAgICogQyBpbnRlcmZhY2Ugb25seSBhbGxvd3MgcmF3IHBvaW50ZXIgdHJhbnNtaXNzaW9uIGZvciBleHRlbnNpb24uCisgICAgICoKKyAgICAgKiBccGFyYW0gYWxsb2N0b3JJZCAgdGhlIElEIG9mIHRoZSBhbGxvY2F0b3IgdG8gY3JlYXRlLgorICAgICAqIFxwYXJhbSBhbGxvY2F0b3IgICBzaGFyZWQgcG9pbnRlciB3aGVyZSB0aGUgY3JlYXRlZCBhbGxvY2F0b3IgaXMgc3RvcmVkLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGFsbG9jYXRvciB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IGNyZWF0ZSB0aGUgYWxsb2NhdG9yIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBjcmVhdGlvbiBvZiB0aGUgYWxsb2NhdG9yICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIHRoZSBleHRlbnNpb24gc3ltYm9sIHdhcyBub3QgZm91bmQuCisgICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggdGhlIGlucHV0IGFsbG9jYXRvcklkIGlzIG5vdCBkZWZpbmVkIGluIHBsYXRmb3JtIHN0b3JlIGV4dGVuc2lvbi4KKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgdGhlIGFsbG9jYXRvcgorICAgICAqLworICAgIGMyX3N0YXR1c190IGNyZWF0ZUFsbG9jYXRvcig6OkMyQWxsb2NhdG9yOjppZF90IGFsbG9jYXRvcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+KiBjb25zdCBhbGxvY2F0b3IpOworCitwcml2YXRlOgorICAgIGV4cGxpY2l0IEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcihjb25zdCBjaGFyICpsaWJQYXRoKTsKKworICAgIHN0YXRpYyBhbmRyb2lkOjpNdXRleCBzTXV0ZXg7CisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI+IHNJbnN0YW5jZTsKKworICAgIHZvaWQgKm1MaWJIYW5kbGU7CisgICAgQ3JlYXRlQmxvY2tQb29sRnVuYyBtQ3JlYXRlQmxvY2tQb29sOworICAgIENyZWF0ZUFsbG9jYXRvckZ1bmMgbUNyZWF0ZUFsbG9jYXRvcjsKK307CisKKyNlbmRpZiAgLy8gU1RBR0VGUklHSFRfQzJfUExBVEZPUk1fU1RPUkVfUExVR0lOX0xPQURFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMlBsYXRmb3JtU3VwcG9ydC5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMlBsYXRmb3JtU3VwcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMTI4MmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyUGxhdGZvcm1TdXBwb3J0LmgKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNUQUdFRlJJR0hUX0NPREVDMl9QTEFURk9STV9TVVBQT1JUX0hfCisjZGVmaW5lIFNUQUdFRlJJR0hUX0NPREVDMl9QTEFURk9STV9TVVBQT1JUX0hfCisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50RmFjdG9yeS5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogUmV0dXJucyB0aGUgcGxhdGZvcm0gYWxsb2NhdG9yIHN0b3JlLgorICogXHJldHZhbCBudWxscHRyIGlmIHRoZSBwbGF0Zm9ybSBhbGxvY2F0b3Igc3RvcmUgY291bGQgbm90IGJlIG9idGFpbmVkCisgKi8KK3N0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisKKy8qKgorICogUGxhdGZvcm0gYWxsb2NhdG9yIHN0b3JlIElEcworICovCitjbGFzcyBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUgOiBwdWJsaWMgQzJBbGxvY2F0b3JTdG9yZSB7CitwdWJsaWM6CisgICAgZW51bSA6IGlkX3QgeworICAgICAgICAvKioKKyAgICAgICAgICogSUQgb2YgdGhlIGlvbiBiYWNrZWQgcGxhdGZvcm0gYWxsb2NhdG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBDMkhhbmRsZSBjb25zaXN0cyBvZjoKKyAgICAgICAgICogICBmZCAgc2hhcmVkIGlvbiBidWZmZXIgaGFuZGxlCisgICAgICAgICAqICAgaW50IHNpemUgKGxvIDMyIGJpdHMpCisgICAgICAgICAqICAgaW50IHNpemUgKGhpIDMyIGJpdHMpCisgICAgICAgICAqICAgaW50IG1hZ2ljICdceGMyaW9ceDAwJworICAgICAgICAgKi8KKyAgICAgICAgSU9OID0gUExBVEZPUk1fU1RBUlQsCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIElEIG9mIHRoZSBncmFsbG9jIGJhY2tlZCBwbGF0Zm9ybSBhbGxvY2F0b3IuCisgICAgICAgICAqCisgICAgICAgICAqIEMySGFuZGxlIGxheW91dCBpcyBub3QgcHVibGljLiBVc2UgQzJBbGxvY2F0b3JHcmFsbG9jOjpVbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlCisgICAgICAgICAqIHRvIGdldCB0aGUgdW5kZXJseWluZyBncmFsbG9jIGhhbmRsZSBmcm9tIGEgQzJIYW5kbGUsIGFuZCBXcmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZQorICAgICAgICAgKiB0byBjcmVhdGUgYSBDMkhhbmRsZSBmcm9tIGEgZ3JhbGxvYyBoYW5kbGUgLSBmb3IgQzJBbGxvY2F0b3I6OnByaW9yQWxsb2NhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIEdSQUxMT0MsCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIElEIG9mIHRoZSBidWZmZXJxdWV1ZSBiYWNrZWQgcGxhdGZvcm0gYWxsb2NhdG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBDMkhhbmRsZSBsYXlvdXQgaXMgbm90IHB1YmxpYy4gVXNlIEMyQWxsb2NhdG9yR3JhbGxvYzo6VW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZQorICAgICAgICAgKiB0byBnZXQgdGhlIHVuZGVybHlpbmcgaGFuZGxlIGZyb20gYSBDMkhhbmRsZSwgYW5kIFdyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlCisgICAgICAgICAqIHRvIGNyZWF0ZSBhIEMySGFuZGxlIGZyb20gYSBoYW5kbGUgLSBmb3IgQzJBbGxvY2F0b3I6OnByaW9yQWxsb2NhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIEJVRkZFUlFVRVVFLAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJRCBvZiBpbmRpY2F0aW5nIHRoZSBlbmQgb2YgcGxhdGZvcm0gYWxsb2NhdG9yIGRlZmluaXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIFxub3RlIGFsd2F5cyBwdXQgdGhpcyBtYWNybyBpbiB0aGUgbGFzdCBwbGFjZS4KKyAgICAgICAgICoKKyAgICAgICAgICogRXh0ZW5kZWQgcGxhdGZvcm0gc3RvcmUgcGx1Z2luIHNob3VsZCB1c2UgdGhpcyBtYWNybyBhcyB0aGUgc3RhcnQgSUQgb2YgaXRzIG93biBhbGxvY2F0b3IKKyAgICAgICAgICogdHlwZXMuCisgICAgICAgICAqLworICAgICAgICBQTEFURk9STV9FTkQsCisgICAgfTsKK307CisKKy8qKgorICogUmV0cmlldmVzIGEgYmxvY2sgcG9vbCBmb3IgYSBjb21wb25lbnQuCisgKgorICogXHBhcmFtIGlkICAgICAgICB0aGUgbG9jYWwgSUQgb2YgdGhlIGJsb2NrIHBvb2wKKyAqIFxwYXJhbSBjb21wb25lbnQgdGhlIGNvbXBvbmVudCB1c2luZyB0aGUgYmxvY2sgcG9vbCAobXVzdCBiZSBub24tbnVsbCkKKyAqIFxwYXJhbSBwb29sICAgICAgcG9pbnRlciB0byB3aGVyZSB0aGUgb2J0YWluZWQgYmxvY2sgcG9vbCBzaGFsbCBiZSBzdG9yZWQgb24gc3VjY2Vzcy4gbnVsbHB0cgorICogICAgICAgICAgICAgICAgICB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIGZhaWx1cmUKKyAqCisgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCisgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSB0aGUgY29tcG9uZW50IGlzIG51bGwKKyAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIGlmIHRoZSBibG9jayBwb29sIGRvZXMgbm90IGV4aXN0CisgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBmZXRjaCB0aGUgYmxvY2sgcG9vbCAodGhpcyByZXR1cm4gdmFsdWUgaXMgb25seQorICogICAgICAgICAgICAgICAgICAgICAgcG9zc2libGUgZm9yIGJhc2ljIHBvb2xzKQorICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQgKHRoaXMgcmV0dXJuIHZhbHVlIGlzIG9ubHkgcG9zc2libGUgZm9yIGJhc2ljIHBvb2xzKQorICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byBjb21wbGV0ZSBhbnkgcmVxdWlyZWQgYWxsb2NhdGlvbiAodGhpcyByZXR1cm4gdmFsdWUgaXMgb25seQorICogICAgICAgICAgICAgICAgICAgICAgcG9zc2libGUgZm9yIGJhc2ljIHBvb2xzKQorICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nIG9wZXJhdGlvbiAodW5leHBlY3RlZCwKKyAqICAgICAgICAgICAgICAgICAgICAgIHRoaXMgcmV0dXJuIHZhbHVlIGlzIG9ubHkgcG9zc2libGUgZm9yIGJhc2ljIHBvb2xzKQorICovCitjMl9zdGF0dXNfdCBHZXRDb2RlYzJCbG9ja1Bvb2woCisgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAqcG9vbCk7CisKKy8qKgorICogQ3JlYXRlcyBhIGJsb2NrIHBvb2wuCisgKiBccGFyYW0gYWxsb2NhdG9ySWQgIHRoZSBhbGxvY2F0b3IgSUQgd2hpY2ggaXMgdXNlZCB0byBhbGxvY2F0ZSBibG9ja3MKKyAqIFxwYXJhbSBjb21wb25lbnQgICAgIHRoZSBjb21wb25lbnQgdXNpbmcgdGhlIGJsb2NrIHBvb2wgKG11c3QgYmUgbm9uLW51bGwpCisgKiBccGFyYW0gcG9vbCAgICAgICAgICBwb2ludGVyIHRvIHdoZXJlIHRoZSBjcmVhdGVkIGJsb2NrIHBvb2wgc2hhbGwgYmUgc3RvcmUgb24gc3VjY2Vzcy4KKyAqICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCisgKgorICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICogXHJldHZhbCBDMl9CQURfVkFMVUUgdGhlIGNvbXBvbmVudCBpcyBudWxsCisgKiBccmV0dmFsIEMyX05PVF9GT1VORCBpZiB0aGUgYWxsb2NhdG9yIGRvZXMgbm90IGV4aXN0CisgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgYSBibG9jayBwb29sCisgKi8KK2MyX3N0YXR1c190IENyZWF0ZUNvZGVjMkJsb2NrUG9vbCgKKyAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjppZF90IGFsbG9jYXRvcklkLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAqcG9vbCk7CisKKy8qKgorICogUmV0dXJucyB0aGUgcGxhdGZvcm0gY29tcG9uZW50IHN0b3JlLgorICogXHJldHZhbCBudWxscHRyIGlmIHRoZSBwbGF0Zm9ybSBjb21wb25lbnQgc3RvcmUgY291bGQgbm90IGJlIG9idGFpbmVkCisgKi8KK3N0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCk7CisKKy8qKgorICogU2V0cyB0aGUgcHJlZmVycmVkIGNvbXBvbmVudCBzdG9yZSBpbiB0aGlzIHByb2Nlc3MgZm9yIHRoZSBzb2xlIHB1cnBvc2Ugb2YgYWNjZXNzaW5nIGl0cworICogaW50ZXJmYWNlLiBJZiB0aGlzIGlzIG5vdCBjYWxsZWQsIHRoZSBkZWZhdWx0IElDb21wb25lbnRTdG9yZSBIQUwgKGlmIGV4aXN0cykgaXMgdGhlIHByZWZlcnJlZAorICogc3RvcmUgZm9yIHRoaXMgcHVycG9zZS4gSWYgdGhlIGRlZmF1bHQgSUNvbXBvbmVudFN0b3JlIEhBTCBpcyBub3QgcHJlc2VudCwgdGhlIHBsYXRmb3JtCisgKiBjb21wb25lbnQgc3RvcmUgaXMgdXNlZC4KKyAqLwordm9pZCBTZXRQcmVmZXJyZWRDb2RlYzJDb21wb25lbnRTdG9yZShzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gc3RvcmUpOworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBTVEFHRUZSSUdIVF9DT0RFQzJfUExBVEZPUk1fU1VQUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9hbmRyb2lkLUMyRGVidWctbG9nLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL2FuZHJvaWQtQzJEZWJ1Zy1sb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTEwMjI4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9hbmRyb2lkLUMyRGVidWctbG9nLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJVVElMU19BTkRST0lEX0RFQlVHX0xPR19IXworI2RlZmluZSBDMlVUSUxTX0FORFJPSURfREVCVUdfTE9HX0hfCisKKy8qCisgKiBBbmRyb2lkIHByb3ZpZGVzIGxvZ2dpbmcgYW5kIGRlYnVnIG1hY3Jvcy4gUmVkZWZpbmUgdGhlbSB3aXRoIEMyIHByZWZpeCBhbmQgYWRkIHN1cHBvcnQgZm9yCisgKiBvcHRpbmcgb3V0IG9mIHZlcmJvc2UgbG9ncy4KKyAqLworCisjaWZkZWYgQzJfTE9HX1RBRworI2RlZmluZSBMT0dfVEFHIEMyX0xPR19UQUcKKyNlbmRpZgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2lmZGVmIEMyX0xPR19WRVJCT1NFCisjZGVmaW5lIEMyX0xPRyhMRVZFTCkgTE9HKDo6YW5kcm9pZDo6YmFzZTo6TEVWRUwpCisjZWxzZQorLyoqCisgKiBVc2UgYXMgZm9sbG93czoKKyAqCisgKiAjZGVmaW5lIEMyX0xPR19UQUcgInRhZyIKKyAqIC8vI2RlZmluZSBDMl9MT0dfVkVSQk9TRSAgLy8gZW5hYmxlIHZlcmJvc2UgbG9ncyBpbiB0aGlzIGZpbGUKKyAqICNpbmNsdWRlIDxDMkRlYnVnLmg+CisgKgorICogQzJfTE9HKERFQlVHKSA8PCBleHByIC4uLjsKKyAqCisgKiBMb2cgbGV2ZWxzIGFyZTogVkVSQk9TRSwgREVCVUcsIElORk8sIFdBUk5JTkcsIEVSUk9SLCBGQVRBTCAoYWJvcnRzKS4KKyAqCisgKiBObyBlbmRsIGlzIHJlcXVpcmVkLgorICovCisjZGVmaW5lIEMyX0xPRyhMRVZFTCkgXAorICAgICAgICAoOjphbmRyb2lkOjpiYXNlOjpMRVZFTCAhPSA6OmFuZHJvaWQ6OmJhc2U6OlZFUkJPU0UpICYmIExPRyg6OmFuZHJvaWQ6OmJhc2U6OkxFVkVMKQorI2VuZGlmCisKKyNkZWZpbmUgQzJfQ0hFQ0sgICAgQ0hFQ0sKKyNkZWZpbmUgQzJfQ0hFQ0tfTFQgQ0hFQ0tfTFQKKyNkZWZpbmUgQzJfQ0hFQ0tfTEUgQ0hFQ0tfTEUKKyNkZWZpbmUgQzJfQ0hFQ0tfRVEgQ0hFQ0tfRVEKKyNkZWZpbmUgQzJfQ0hFQ0tfR0UgQ0hFQ0tfR0UKKyNkZWZpbmUgQzJfQ0hFQ0tfR1QgQ0hFQ0tfR1QKKyNkZWZpbmUgQzJfQ0hFQ0tfTkUgQ0hFQ0tfTkUKKworI2RlZmluZSBDMl9EQ0hFQ0sgICAgRENIRUNLCisjZGVmaW5lIEMyX0RDSEVDS19MVCBEQ0hFQ0tfTFQKKyNkZWZpbmUgQzJfRENIRUNLX0xFIERDSEVDS19MRQorI2RlZmluZSBDMl9EQ0hFQ0tfRVEgRENIRUNLX0VRCisjZGVmaW5lIEMyX0RDSEVDS19HRSBEQ0hFQ0tfR0UKKyNkZWZpbmUgQzJfRENIRUNLX0dUIERDSEVDS19HVAorI2RlZmluZSBDMl9EQ0hFQ0tfTkUgRENIRUNLX05FCisKKyNlbmRpZiAgLy8gQzJVVElMU19BTkRST0lEX0RFQlVHX0xPR19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctYmFzZS5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNDBlNDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1iYXNlLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJVVElMU19ERUJVR19CQVNFX0hfCisjZGVmaW5lIEMyVVRJTFNfREVCVUdfQkFTRV9IXworCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKy8qKgorICogRGVidWcgcHJpbnQgdXRpbGl0aWVzIGZvciBDb2RlYyAyLjAgYmFzZSBvYmplY3RzLgorICovCisKKyNkZWZpbmUgQzJfREVDTEFSRV9BU19TVFJJTkdfQU5EX0RFRklORV9TVFJFQU1fT1VUKHR5cGUpIFwKK2NvbnN0IGNoYXIgKmFzU3RyaW5nKHR5cGUgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/Iik7IFwKK2lubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgdHlwZSAmaSkgeyBcCisgICAgcmV0dXJuIG9zIDw8IGFzU3RyaW5nKGkpOyBcCit9CisKK0MyX0RFQ0xBUkVfQVNfU1RSSU5HX0FORF9ERUZJTkVfU1RSRUFNX09VVChjMl9zdGF0dXNfdCkKKworCisjZW5kaWYgIC8vIEMyVVRJTFNfREVCVUdfQkFTRV9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1pbnRlcmZhY2UuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLWludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMzE4NzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1pbnRlcmZhY2UuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlVUSUxTX0RFQlVHX0lOVEVSRkFDRV9IXworI2RlZmluZSBDMlVUSUxTX0RFQlVHX0lOVEVSRkFDRV9IXworCisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLWJhc2UuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlVXRpbHMuaD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8VD4gJmkpOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gJmkpOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4gJmkpOworCisjZW5kaWYgIC8vIEMyVVRJTFNfREVCVUdfSU5URVJGQUNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1sb2cuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLWxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NWM0YzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1sb2cuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlVUSUxTX0RFQlVHX0xPR19IXworI2RlZmluZSBDMlVUSUxTX0RFQlVHX0xPR19IXworCisvLyBQbGF0Zm9ybSBzcGVjaWZpYyBkZWJ1ZyB1dGlsaXRpZXMKKyNpZmRlZiBfX0FORFJPSURfXworI2luY2x1ZGUgPGFuZHJvaWQtQzJEZWJ1Zy1sb2cuaD4KKyNlbHNlCisvLyBUT0RPOiBpbXBsZW1lbnQgYmFzZSBkZWJ1ZyB1dGlscworI2VuZGlmCisKKyNlbmRpZiAgLy8gQzJVVElMU19ERUJVR19MT0dfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLXBhcmFtLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1wYXJhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYzFkZTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1wYXJhbS5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyVVRJTFNfREVCVUdfUEFSQU1fSF8KKyNkZWZpbmUgQzJVVElMU19ERUJVR19QQVJBTV9IXworCisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPHV0aWwvQzJEZWJ1Zy1iYXNlLmg+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworLyoqCisgKiBEZWJ1Zy9wcmludCBkZWNsYXJhdGlvbnMgZm9yIG9iamVjdHMgZGVmaW5lZCBpbiBDMlBhcmFtLmgKKyAqLworQzJfREVDTEFSRV9BU19TVFJJTkdfQU5EX0RFRklORV9TVFJFQU1fT1VUKEMyRmllbGREZXNjcmlwdG9yOjp0eXBlX3QpCisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlBhcmFtOjpDb3JlSW5kZXggJmkpOworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW06OlR5cGUgJmkpOworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW06OkluZGV4ICZpKTsKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBfQzJGaWVsZElkICZpKTsKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmaSk7CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJQYXJhbUZpZWxkICZpKTsKKworI2VuZGlmICAvLyBDMlVUSUxTX0RFQlVHX1BBUkFNX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkludGVyZmFjZUhlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYjQzYWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaApAQCAtMCwwICsxLDc1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJVVElMU19JTlRFUkZBQ0VfSEVMUEVSX0hfCisjZGVmaW5lIEMyVVRJTFNfSU5URVJGQUNFX0hFTFBFUl9IXworCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlVXRpbHMuaD4KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyoqCisgKiBJbnRlcmZhY2UgSGVscGVyCisgKi8KK3VzaW5nIEMyUiA9IEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIEU9c3RkOjppc19lbnVtPFQ+Ojp2YWx1ZT4KK3N0cnVjdCBfYzJfcmVkdWNlX2VudW1fdG9fdW5kZXJseWluZ190eXBlIHsKKyAgICB0eXBlZGVmIFQgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZTxULCB0cnVlPiB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxUPjo6dHlwZSB0eXBlOworfTsKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdG8gaW1wbGVtZW50IHBhcmFtZXRlciByZWZsZWN0b3JzLiBUaGlzIGNsYXNzIGlzIGR5bmFtaWMgYW5kIGlzIGRlc2lnbmVkIHRvIGJlCisgKiBzaGFyZWQgYnkgbXVsdGlwbGUgaW50ZXJmYWNlcy4gVGhpcyBhbGxvd3MgaW50ZXJmYWNlcyB0byBhZGQgc3RydWN0dXJlIGRlc2NyaXB0b3JzIGFzIG5lZWRlZC4KKyAqLworY2xhc3MgQzJSZWZsZWN0b3JIZWxwZXIgOiBwdWJsaWMgQzJQYXJhbVJlZmxlY3RvciB7CitwdWJsaWM6CisgICAgQzJSZWZsZWN0b3JIZWxwZXIoKSA9IGRlZmF1bHQ7CisgICAgdmlydHVhbCB+QzJSZWZsZWN0b3JIZWxwZXIoKSA9IGRlZmF1bHQ7CisgICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjcmliZSgKKyAgICAgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBwYXJhbUluZGV4KSBjb25zdCBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIEFkZHMgc3VwcG9ydCBmb3IgZGVzY3JpYmluZyB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBQYXJhbXMgdHlwZXMgb2YgY29kZWMgMi4wIHN0cnVjdHMgKG9yIHBhcmFtZXRlcnMpIHRvIGRlc2NyaWJlCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gUGFyYW1zPgorICAgIEMyX0lOTElORSB2b2lkIGFkZFN0cnVjdERlc2NyaXB0b3JzKCkgeworICAgICAgICBzdGQ6OnZlY3RvcjxDMlN0cnVjdERlc2NyaXB0b3I+IHN0cnVjdHM7CisgICAgICAgIGFkZFN0cnVjdERlc2NyaXB0b3JzKHN0cnVjdHMsIChfVHVwbGU8UGFyYW1zLi4uPiAqKW51bGxwdHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgc3VwcG9ydCBmb3IgZGVzY3JpYmluZyBhIHNwZWNpZmljIHN0cnVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBzdHJ1a3QgZGVzY3JpcHRvciBmb3IgdGhlIHN0cnVjdCB0aGF0IHdpbGwgYmUgbW92ZWQgb3V0LgorICAgICAqLworICAgIHZvaWQgYWRkU3RydWN0RGVzY3JpcHRvcihDMlN0cnVjdERlc2NyaXB0b3IgJiZzdHJ1a3QpOworCitwcml2YXRlOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIFBhcmFtcz4KKyAgICBjbGFzcyBDMl9ISURFIF9UdXBsZSB7IH07CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHN1cHBvcnQgZm9yIGRlc2NyaWJpbmcgdGhlIGdpdmVuIGRlc2NyaXB0b3JzLgorICAgICAqCisgICAgICogXHBhcmFtIHN0cnVjdHMgTGlzdCBvZiBzdHJ1Y3R1cmUgZGVzY3JpcHRvcnMgdG8gYWRkIHN1cHBvcnQgZm9yCisgICAgICovCisgICAgdm9pZCBhZGRTdHJ1Y3REZXNjcmlwdG9ycygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyU3RydWN0RGVzY3JpcHRvcj4gJnN0cnVjdHMsIF9UdXBsZTw+ICopOworCisgICAgLyoqCisgICAgICogVXRpbGl0eSBtZXRob2QgdGhhdCBhZGRzIHN1cHBvcnQgZm9yIGRlc2NyaWJpbmcgdGhlIGdpdmVuIGRlc2NyaXB0b3JzIGluIGEgcmVjdXJzaXZlIG1hbm5lcgorICAgICAqIG9uZSBzdHJ1Y3R1cmUgYXQgYSB0aW1lIHVzaW5nIGEgbGlzdCBvZiBzdHJ1Y3R1cmUgZGVzY3JpcHRvcnMgdGVtcG9yYXJ5LgorICAgICAqCisgICAgICogXHBhcmFtIFQgdGhlIHR5cGUgb2YgY29kZWMgMi4wIHN0cnVjdCB0byBkZXNjcmliZQorICAgICAqIFxwYXJhbSBQYXJhbXMgcmVzdCBvZiB0aGUgc3RydWN0cworICAgICAqIFxwYXJhbSBzdHJ1Y3RzIFRlbXBvcmFyeSBsaXN0IG9mIHN0cnVjdHVyZSBkZXNjcmlwdG9ycyB1c2VkIHRvIG9wdGltaXplIHRoZSBvcGVyYXRpb24uCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gUGFyYW1zPgorICAgIEMyX0lOTElORSB2b2lkIGFkZFN0cnVjdERlc2NyaXB0b3JzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJ1Y3REZXNjcmlwdG9yPiAmc3RydWN0cywgX1R1cGxlPFQsIFBhcmFtcy4uLj4gKikgeworICAgICAgICBzdHJ1Y3RzLmVtcGxhY2VfYmFjaygoVCopbnVsbHB0cik7CisgICAgICAgIGFkZFN0cnVjdERlc2NyaXB0b3JzKHN0cnVjdHMsIChfVHVwbGU8UGFyYW1zLi4uPiAqKW51bGxwdHIpOworICAgIH0KKworICAgIG11dGFibGUgc3RkOjptdXRleCBfbU11dGV4OworICAgIHN0ZDo6bWFwPEMyUGFyYW06OkNvcmVJbmRleCwgY29uc3QgQzJTdHJ1Y3REZXNjcmlwdG9yPiBfbVN0cnVjdHM7IC8vLzwgZGVzY3JpcHRvcnMKK307CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGNvZGVjIDIuMCBpbnRlcmZhY2UgQVBJLXMgZm9yIHNvbWUgcGFyYW1ldGVycy4KKyAqCisgKiBUaGlzIGNsYXNzIG11c3QgYmUgc3ViY2xhc3NlZC4KKyAqLworY2xhc3MgQzJJbnRlcmZhY2VIZWxwZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGJhc2Ugb2Zmc2V0IG9mIGEgZmllbGQgYXQgfG9mZnNldHwgdGhhdCBjb3VsZCBiZSBwYXJ0IG9mIGFuIGFycmF5IG9yIHBhcnQgb2YgYQorICAgICAqIHN1Yi1zdHJ1Y3R1cmUuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBkbyBmaWVsZCBzaXplIHZlcmlmaWNhdGlvbiwgZS5nLiBpZiBvZmZzZXQgaWYgb2J0YWluZWQgZnJvbSBhIHN0cnVjdHVyZSwKKyAgICAgKiBpdCB3aWxsIG5vdCBzdG9wIGF0IHRoZSBzdHJ1Y3R1cmUgYm91bmRhcnkgLSB0aGlzIGlzIG9rYXksIGFzIHdlIGp1c3Qgd2FudCB0aGUgYmFzZSBvZmZzZXQKKyAgICAgKiBoZXJlLCB3aGljaCBpcyB0aGUgc2FtZS4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBzaXplX3QgR2V0QmFzZU9mZnNldChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4LCBzaXplX3Qgb2Zmc2V0KTsKKworICAgIC8qKgorICAgICAqIFRoZSBpbnRlcmZhY2UgaGVscGVyIGNsYXNzIHVzZXMgcmVmZXJlbmNlcyB0byBzdGQ6OnNoYXJlZF9wdHI8VD4gY29uZmlnIHBhcmFtZXRlcnMuCisgICAgICogSW50ZXJuYWxseSwgdGhlc2UgbmVlZCB0byBiZSBnZW5lcmFsaXplZCB0byBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gcmVmcywgYnV0IHRoZSBjYXN0IGlzCisgICAgICogbm90IGFsbG93ZWQgKGFzIHRoZXNlIGFyZSByZWZlcmVuY2VzKS4gQXMgc3VjaCwgdGhpcyBjbGFzcyBuZXZlciByZXR1cm5zIHBvaW50ZXIgdG8gdGhlCisgICAgICogc2hhcmVkX3B0cnMuCisgICAgICovCisgICAgc3RydWN0IFBhcmFtUmVmIHsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgZW5hYmxlPQorICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8VCwgQzJQYXJhbT46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgaW5saW5lIEMyX0hJREUgUGFyYW1SZWYoc3RkOjpzaGFyZWRfcHRyPFQ+ICZwYXJhbSkKKyAgICAgICAgICAgIDogX21SZWYocmVpbnRlcnByZXRfY2FzdDxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4qPigmcGFyYW0pKSB7IH0KKworICAgICAgICAvLyB1c2VkIGJ5IGNvbXBhcmlzb24gb3BlcmF0b3IgZm9yIGNvbnRhaW5lcnMKKyAgICAgICAgb3BlcmF0b3Igc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+ICooKSBjb25zdCB7IHJldHVybiBfbVJlZjsgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIGEgc2hhcmVkIHBvaW50ZXIgdG8gdGhlIHBhcmFtZXRlci4KKyAgICAgICAgICovCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBnZXQoKSBjb25zdCB7IHJldHVybiAqX21SZWY7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiAqX21SZWY7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEZpZWxkIGhlbHBlci4KKyAgICAgKgorICAgICAqIENvbnRhaW5zIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIHRoZSBmaWVsZDogcG9zc2libGUgdmFsdWVzLCBhbmQgY3VycmVudGx5IHN1cHBvcnRlZAorICAgICAqIHZhbHVlcy4KKyAgICAgKi8KKyAgICBjbGFzcyBGaWVsZEhlbHBlciB7CisgICAgcHVibGljOgorICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBoZWxwZXIgZm9yIGEgZmllbGQgd2l0aCBnaXZlbiBwb3NzaWJsZSB2YWx1ZXMuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSBwYXJhbSBwYXJhbWV0ZXIgcmVmZXJlbmNlLiBUaGUgcGFyYW1ldGVyIGRvZXMgbm90IGhhdmUgdG8gYmUgaW5pdGlhbGl6ZWQgYXQgdGhpcworICAgICAgICAgKiAgICAgICAgcG9pbnQuCisgICAgICAgICAqIFxwYXJhbSBmaWVsZCBmaWVsZCBpZGVudGlmaWVyCisgICAgICAgICAqIFxwYXJhbSB2YWx1ZXMgcG9zc2libGUgdmFsdWVzIGZvciB0aGUgZmllbGQKKyAgICAgICAgICovCisgICAgICAgIEZpZWxkSGVscGVyKGNvbnN0IFBhcmFtUmVmICZwYXJhbSwgY29uc3QgX0MyRmllbGRJZCAmZmllbGQsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPiAmJnZhbHVlcyk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBwYXJhbS1maWVsZCBpZGVudGlmaWVyIGZvciB0aGlzIGZpZWxkLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgdGhlCisgICAgICAgICAqIHVuZGVybHlpbmcgcGFyYW1ldGVyIGhhcyBiZWVuIGluaXRpYWxpemVkLgorICAgICAgICAgKgorICAgICAgICAgKiBcYXJhbSBpbmRleAorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIEMyUGFyYW1GaWVsZAorICAgICAgICAgKi8KKyAgICAgICAgQzJQYXJhbUZpZWxkIG1ha2VQYXJhbUZpZWxkKEMyUGFyYW06OkluZGV4IGluZGV4KSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgZm9yIHRoaXMgZmllbGQuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSB2YWx1ZXMgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgdGhhdCB3aWxsIGJlIG1vdmVkIG91dAorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBzZXRTdXBwb3J0ZWRWYWx1ZXMoc3RkOjp1bmlxdWVfcHRyPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+ICYmdmFsdWVzKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgZm9yIHRoaXMgZmllbGQuIFRoaXMgZGVmYXVsdHMgdG8gdGhlIHBvc3NpYmxlIHZhbHVlcworICAgICAgICAgKiBpZiBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyB3ZXJlIG5ldmVyIHNldC4KKyAgICAgICAgICovCisgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgKmdldFN1cHBvcnRlZFZhbHVlcygpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoaXMgZmllbGQuCisgICAgICAgICAqLworICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICpnZXRQb3NzaWJsZVZhbHVlcygpIGNvbnN0OworCisgICAgcHJvdGVjdGVkOgorICAgICAgICAvLyBUT0RPOiBtb3ZlIHRvIGltcGwgZm9yIHNhZmV0eQorICAgICAgICBQYXJhbVJlZiBtUGFyYW07CisgICAgICAgIF9DMkZpZWxkSWQgbUZpZWxkSWQ7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPiBtUG9zc2libGU7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPiBtU3VwcG9ydGVkOyAvLy88IGlmIGRpZmZlcmVudCBmcm9tIHBvc3NpYmxlCisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IEMyX0hJREUgUGFyYW07CisgICAgY2xhc3MgUGFyYW1IZWxwZXI7CisKKyAgICAvKioKKyAgICAgKiBGYWN0b3J5IGlzIGFuIGludGVyZmFjZSB0byBnZXQgdGhlIHBhcmFtZXRlciBoZWxwZXJzIGZyb20gYSBzdGQ6OnNoYXJlZF9wdHI8VD4gJi4KKyAgICAgKi8KKyAgICBjbGFzcyBGYWN0b3J5IHsKKyAgICAgICAgLy8gXHRvZG8gdGhpcyBtYXkgYmUgYWxyZWFkeSBpbiBQYXJhbUhlbHBlcgorICAgICAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBnZXRSZWZsZWN0b3IoKSBjb25zdCA9IDA7CisKKyAgICAgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IGdldFBhcmFtSGVscGVyKGNvbnN0IFBhcmFtUmVmICZwYXJhbSkgY29uc3QgPSAwOworCisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5GYWN0b3J5KCkgPSBkZWZhdWx0OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIFBhcmFtPFQ+IGdldChzdGQ6OnNoYXJlZF9wdHI8VD4gJnBhcmFtLCBzdGQ6OnNoYXJlZF9wdHI8VD4gYWx0VmFsdWUgPSBudWxscHRyKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gUGFyYW08VD4oZ2V0UGFyYW1IZWxwZXIoUGFyYW1SZWYocGFyYW0pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRWYWx1ZSA9PSBudWxscHRyID8gcGFyYW0gOiBhbHRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZWZsZWN0b3IoKSk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogVHlwZWQgZmllbGQgaGVscGVyLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IEZpZWxkIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gaGVscGVyIGhlbHBlciBmb3IgdGhpcyBmaWVsZAorICAgICAgICAgKiBccGFyYW0gaW5kZXggIHBhcmFtZXRlciBpbmRleCAodGhpcyBpcyBuZWVkZWQgYXMgaXQgaXMgbm90IGF2YWlsYWJsZSBkdXJpbmcgcGFyYW1ldGVyCisgICAgICAgICAqICAgICAgICBjb25zdHJ1Y3Rpb24pIFx0b2RvIHJlbW92ZQorICAgICAgICAgKi8KKyAgICAgICAgRmllbGQoc3RkOjpzaGFyZWRfcHRyPEZpZWxkSGVscGVyPiBoZWxwZXIsIEMyUGFyYW06OkluZGV4IGluZGV4KTsKKworICAgICAgICBib29sIHN1cHBvcnRzQXRBbGwoVCB2YWx1ZSkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oKl9tSGVscGVyLT5nZXRQb3NzaWJsZVZhbHVlcygpKS5zdXBwb3J0cyh2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBib29sIHN1cHBvcnRzTm93KFQgdmFsdWUpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KCpfbUhlbHBlci0+Z2V0U3VwcG9ydGVkVmFsdWVzKCkpLnN1cHBvcnRzKHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgY29uZmxpY3QgcmVzb2x1dGlvbiBzdWdnZXN0aW9uIGJ1aWxkZXIgZm9yIHRoaXMgZmllbGQuCisgICAgICAgICAqLworICAgICAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+IHNob3VsZEJlKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyBidWlsZGVyIGZvciB0aGlzIGZpZWxkLiBUaGlzIGlzIG9ubHkgc3VwcG9ydGVkCisgICAgICAgICAqIGZvciBub24tY29uc3QgZmllbGRzIHRvIGRpc2FsbG93IHNldHRpbmcgc3VwcG9ydGVkIHZhbHVlcyBmb3IgZGVwZW5kZW5jaWVzLgorICAgICAgICAgKi8KKyAgICAgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiBtdXN0QmUoKTsKKworICAgICAgICBvcGVyYXRvciBDMlBhcmFtRmllbGQoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gX21GaWVsZDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE8KKyAgICAgICAgQzJSIHZhbGlkYXRlUG9zc2libGUoY29uc3QgVCAmdmFsdWUgX191bnVzZWQpIGNvbnN0IHsKKyAgICAgICAgICAgIC8vLyBUT0RPCisgICAgICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8RmllbGRIZWxwZXI+IF9tSGVscGVyOworICAgICAgICBDMlBhcmFtRmllbGQgX21GaWVsZDsKKyAgICB9OworCisgICAgY2xhc3MgUGFyYW1IZWxwZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgUGFyYW1IZWxwZXIoUGFyYW1SZWYgcGFyYW0sIEMyU3RyaW5nTGl0ZXJhbCBuYW1lLCBDMlN0cnVjdERlc2NyaXB0b3IgJiYpOworICAgICAgICBQYXJhbUhlbHBlcihQYXJhbUhlbHBlciAmJik7CisgICAgICAgIH5QYXJhbUhlbHBlcigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBGaW5kcyBhIGZpZWxkIGRlc2NyaXB0b3IuCisgICAgICAgICAqLworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8RmllbGRIZWxwZXI+IGZpbmRGaWVsZChzaXplX3QgYmFzZU9mZnMsIHNpemVfdCBiYXNlU2l6ZSkgY29uc3Q7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIHBhcmFtZXRlciByZWYgZm9yIHRoaXMgcGFyYW1ldGVyCisgICAgICAgIGNvbnN0IFBhcmFtUmVmIHJlZigpIGNvbnN0OworCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoaXMgcGFyYW1ldGVyIGFzIG1vZGlmaWFibGUuIFRoZSBjb25zdG5lc3Mgb2YgdGhpcworICAgICAgICAvLy8gb2JqZWN0IGRldGVybWluZXMgdGhlIGNvbnN0bmVzcyBvZiB0aGUgcmV0dXJuZWQgdmFsdWUuCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiB2YWx1ZSgpOworCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoaXMgcGFyYW1ldGVyIGFzIGNvbnN0CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlBhcmFtPiB2YWx1ZSgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQZXJmb3JtcyBhIGNvbmZpZ3VyYXRpb24gY2hhbmdlIHJlcXVlc3QgZm9yIHRoaXMgcGFyYW1ldGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gdmFsdWUgICAgdGhlIHZhbHVlIHRoYXQgaXMgYmVpbmcgYXNzaWduZWQgdG8gdGhpcyBwYXJhbWV0ZXIuCisgICAgICAgICAqICAgICAgICAgICAgICAgICBUaGlzIGNvdWxkIGJlIHBvaW50aW5nIHRvIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLiBUaGlzIG11c3Qgbm90IGNoYW5nZS4KKyAgICAgICAgICogXHBhcmFtIG1heUJsb2NrIHdoZXRoZXIgYmxvY2tpbmcgaXMgYWxsb3dlZAorICAgICAgICAgKiBccGFyYW0gZW5kVmFsdWUgdGhlIHJlc3VsdGluZyB2YWx1ZQorICAgICAgICAgKiBccGFyYW0gZmFjdG9yeSAgcGFyYW1ldGVyIGZhY3RvcnkgKHRvIGFjY2VzcyBkZXBlbmRlbmNpZXMpCisgICAgICAgICAqIFxwYXJhbSBmYWlsdXJlcyB2ZWN0b3Igb2YgZmFpbHVyZXMgdG8gYXBwZW5kIGFueSBmYWlsdXJlcyBmcm9tIHRoaXMKKyAgICAgICAgICogICAgICAgICAgICAgICAgIG9wZXJhdGlvbgorICAgICAgICAgKgorICAgICAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICBjb25maWd1cmF0aW9uIHdhcyBzdWNjZXNzZnVsCisgICAgICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHZhbHVlIGlzIGluY29ycmVjdCAoVEJEKQorICAgICAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBwZXJmb3JtIHRoZSBhc3NpZ25tZW50CisgICAgICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvbmZpZ3VyYXRpb24gdGltZWQgb3V0CisgICAgICAgICAqIFxyZXR2YWwgQzJfQkxPQ0tJTkcgIGNvbmZpZ3VyYXRpb24gcmVxdWlyZXMgYmxvY2tpbmcgdG8gYmUgYWxsb3dlZAorICAgICAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBpbnRlcmZhY2UgaXMgY29ycnVwdGVkCisgICAgICAgICAqLworICAgICAgICBjMl9zdGF0dXNfdCB0cnlTZXQoCisgICAgICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAqdmFsdWUsIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgYm9vbCAqY2hhbmdlZCwKKyAgICAgICAgICAgICAgICBGYWN0b3J5ICZmYWN0b3J5LAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpOworCisgICAgICAgIC8vLyByZXR1cm5zIHBhcmFtZXRlciBpbmRpY2VzIHRoYXQgZGVwZW5kIG9uIHRoaXMgcGFyYW1ldGVyCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBnZXREb3duRGVwZW5kZW5jaWVzKCkgY29uc3Q7CisKKyAgICAgICAgLy8vIGFkZHMgYSBkZXBlbmRlbnQgcGFyYW1ldGVyCisgICAgICAgIHZvaWQgYWRkRG93bkRlcGVuZGVuY3koQzJQYXJhbTo6SW5kZXggaW5kZXgpOworCisgICAgICAgIC8vLyByZXR1cm5zIHRoYXQgcGFyYW1ldGVyIHJlZnMgZm9yIHBhcmFtZXRlcnMgdGhhdCBkZXBlbmQgb24gdGhpcworICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxQYXJhbVJlZj4gZ2V0RGVwZW5kZW5jaWVzQXNSZWZzKCkgY29uc3Q7CisKKyAgICAgICAgLy8vIHJldHVybnMgYW5kIG1vdmVzIG91dCBzdG9yZWQgc3RydWN0IGRlc2NyaXB0b3IKKyAgICAgICAgQzJTdHJ1Y3REZXNjcmlwdG9yIHJldHJpZXZlU3RydWN0RGVzY3JpcHRvcigpOworCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgcGFyYW1ldGVyCisgICAgICAgIEMyU3RyaW5nIG5hbWUoKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgaW5kZXggb2YgdGhpcyBwYXJhbWV0ZXIKKyAgICAgICAgQzJQYXJhbTo6SW5kZXggaW5kZXgoKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgcGFyYW1ldGVyIGRlc2NyaXB0b3IKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyUGFyYW1EZXNjcmlwdG9yPiBnZXREZXNjcmlwdG9yKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFZhbGlkYXRlcyBwYXJhbSBoZWxwZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEZvciBub3csIHRoaXMgZmlsbHMgZmllbGQgaW5mbyBmb3IgY29uc3QgcGFyYW1zLgorICAgICAgICAgKgorICAgICAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCB0aGUgcGFyYW1ldGVyIGNhbm5vdCBiZSBhZGRlZCBhcyBzdWNoCisgICAgICAgICAqLworICAgICAgICBjMl9zdGF0dXNfdCB2YWxpZGF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3Rvcik7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHR5cGVkZWYgQzJQYXJhbURlc2NyaXB0b3I6OmF0dHJpYl90IGF0dHJpYl90OworICAgICAgICBhdHRyaWJfdCYgYXR0cmliKCk7CisKKyAgICAgICAgLy8vIHNldHMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBwYXJhbWV0ZXIKKyAgICAgICAgdm9pZCBzZXREZWZhdWx0VmFsdWUoc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IGRlZmF1bHRfKTsKKworICAgICAgICAvLy8gc2V0cyB0aGUgc2V0dGVyIG1ldGhvZAorICAgICAgICB2b2lkIHNldFNldHRlcihzdGQ6OmZ1bmN0aW9uPEMyUihjb25zdCBDMlBhcmFtICosIGJvb2wsIGJvb2wgKiwgRmFjdG9yeSAmKT4gc2V0dGVyKTsKKworICAgICAgICAvLy8gc2V0cyB0aGUgZ2V0dGVyIG1ldGhvZAorICAgICAgICB2b2lkIHNldEdldHRlcihzdGQ6OmZ1bmN0aW9uPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPihib29sKT4gZ2V0dGVyKTsKKworICAgICAgICAvLy8gc2V0cyB0aGUgZGVwZW5kZW5jaWVzCisgICAgICAgIHZvaWQgc2V0RGVwZW5kZW5jaWVzKHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBpbmRpY2VzLCBzdGQ6OnZlY3RvcjxQYXJhbVJlZj4gcmVmcyk7CisKKyAgICAgICAgLy8vIHNldHMgdGhlIGZpZWxkcyBhbmQgdGhlaXIgc3VwcG9ydGVkIHZhbHVlcworICAgICAgICB2b2lkIHNldEZpZWxkcyhzdGQ6OnZlY3RvcjxDMlBhcmFtRmllbGRWYWx1ZXM+ICYmZmllbGRzKTsKKworICAgICAgICAvLy8gYnVpbGQgdGhpcyBpbnRvIGEgZmluYWwgUGFyYW1IZWxwZXIgb2JqZWN0CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gYnVpbGQoKTsKKworICAgICAgICBjbGFzcyBJbXBsOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SW1wbD4gbUltcGw7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFR5cGVkIHBhcmFtZXRlciBoZWxwZXIuIFRoaXMgcHJvdmlkZXMgYWNjZXNzIHRvIG1lbWJlcnMgYXMgd2VsbCBhcyBmaWVsZCBoZWxwZXJzLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IEMyX0hJREUgUGFyYW0geworICAgICAgICBQYXJhbSgKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IGhlbHBlciwgc3RkOjpzaGFyZWRfcHRyPFQ+ICZwYXJhbSwKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gcmVmbGVjdG9yKQorICAgICAgICAgICAgOiB2KCpwYXJhbS5nZXQoKSksCisgICAgICAgICAgICAgIF9tVHlwZWRQYXJhbShwYXJhbSksCisgICAgICAgICAgICAgIF9tSGVscGVyKGhlbHBlciksCisgICAgICAgICAgICAgIF9tUmVmbGVjdG9yKHJlZmxlY3RvcikgeyB9CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUz4KKyAgICAgICAgdXNpbmcgRmllbGRUeXBlID0gRmllbGQ8CisgICAgICAgICAgICAgICAgdHlwZW5hbWUgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZTwKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2NvbnN0PAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8Uz46OnR5cGU+Ojp0eXBlPjo6dHlwZT47CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUz4KKyAgICAgICAgRmllbGRUeXBlPFM+IEYoUyAmZmllbGQpIHsKKyAgICAgICAgICAgIHNpemVfdCBvZmZzID0gKHVpbnRwdHJfdCkmZmllbGQgLSAodWludHB0cl90KSZnZXQoKTsKKyAgICAgICAgICAgIC8vIHRoaXMgbXVzdCBmYWxsIGVpdGhlciB3aXRoaW4gc2l6ZW9mKFQpICsgRkxFWF9TSVpFIG9yIHBhcmFtLT5zaXplKCkKKyAgICAgICAgICAgIC8vIHNpemVfdCBzaXplID0gc2l6ZW9mKGZpZWxkKTsKKyAgICAgICAgICAgIC8vIG1QYXJhbSBtYXkgYmUgbnVsbAorICAgICAgICAgICAgc2l6ZV90IGJhc2VTaXplID0gc2l6ZW9mKHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDxTPjo6dHlwZSk7CisgICAgICAgICAgICBzaXplX3QgYmFzZU9mZnMgPSBHZXRCYXNlT2Zmc2V0KAorICAgICAgICAgICAgICAgICAgICBfbVJlZmxlY3RvciwgVDo6Q09SRV9JTkRFWCwgb2ZmcyAtIHNpemVvZihDMlBhcmFtKSk7CisgICAgICAgICAgICBpZiAofmJhc2VPZmZzID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBDMl9MT0coRkFUQUwpIDw8ICJ1bmtub3duIGZpZWxkIGF0IG9mZnNldCAiIDw8IG9mZnMgPDwgIiBzaXplICIgPDwgc2l6ZW9mKFMpCisgICAgICAgICAgICAgICAgLy8gICAgICAgPDwgIiBiYXNlLXNpemUgIiA8PCBiYXNlU2l6ZTsKKyAgICAgICAgICAgICAgICAvLyBfX2J1aWx0aW5fdHJhcCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBiYXNlT2ZmcyArPSBzaXplb2YoQzJQYXJhbSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxGaWVsZEhlbHBlcj4gaGVscGVyID0gX21IZWxwZXItPmZpbmRGaWVsZChiYXNlT2ZmcywgYmFzZVNpemUpOworICAgICAgICAgICAgcmV0dXJuIEZpZWxkVHlwZTxTPihoZWxwZXIsIF9tVHlwZWRQYXJhbS0+aW5kZXgoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBjb25zdCBQYXJhbSBoYXZlIGNvbnN0IEZpZWxkczsgaG93ZXZlciwgcmVtb3ZlIGNvbnN0IGZyb20gUworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTPgorICAgICAgICBjb25zdCBGaWVsZFR5cGU8Uz4gRihTICZmaWVsZCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Y29uc3QgRmllbGRUeXBlPFM+Pihjb25zdF9jYXN0PFBhcmFtICo+KHRoaXMpLT5GKGZpZWxkKSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gUmV0dXJucyBhIGNvbnN0IHJlZiB2YWx1ZSBvZiB0aGlzIGNvbnN0IHBhcmFtLgorICAgICAgICBjb25zdCBUICZnZXQoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gKl9tVHlwZWRQYXJhbS5nZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyBSZXR1cm5zIGEgbW9kaWZpYWJsZSByZWYgdmFsdWUgb2YgdGhpcyBub24tY29uc3QgcGFyYW0uCisgICAgICAgIFQgJnNldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAqX21UeXBlZFBhcmFtLmdldCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIENvbnN0LXJlZmVyZW5jZSB0byB0aGUgdmFsdWUucworICAgICAgICBUIGNvbnN0ICZ2OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFQ+IF9tVHlwZWRQYXJhbTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBfbUhlbHBlcjsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IF9tUmVmbGVjdG9yOworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHVzaW5nIEMyUCA9IFBhcmFtPFQ+OworCisgICAgLyoqCisgICAgICogVGVtcGxhdGVkIG1vdmUgYnVpbGRlciBjbGFzcyBmb3IgYSBwYXJhbWV0ZXIgaGVscGVyLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgY2xhc3MgQzJfSElERSBQYXJhbUJ1aWxkZXIgOiBwcml2YXRlIFBhcmFtSGVscGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8qKiBDb25zdHJ1Y3QgdGhlIHBhcmFtZXRlciBidWlsZGVyIGZyb20gbWluaW1hbCBpbmZvIHJlcXVpcmVkLiAqLworICAgICAgICBQYXJhbUJ1aWxkZXIoc3RkOjpzaGFyZWRfcHRyPFQ+ICZwYXJhbSwgQzJTdHJpbmdMaXRlcmFsIG5hbWUpCisgICAgICAgICAgICA6IFBhcmFtSGVscGVyKHBhcmFtLCBuYW1lLCBDMlN0cnVjdERlc2NyaXB0b3IoKFQqKW51bGxwdHIpKSwKKyAgICAgICAgICAgICAgbVR5cGVkUGFyYW0oJnBhcmFtKSB7CisgICAgICAgICAgICBhdHRyaWIoKSA9IGF0dHJpYl90OjpJU19QRVJTSVNURU5UOworICAgICAgICB9CisKKyAgICAgICAgLyoqIE1ha2VzIHRoaXMgcGFyYW1ldGVyIHJlcXVpcmVkLiAqLworICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZyZXF1aXJlZCgpIHsKKyAgICAgICAgICAgIGF0dHJpYigpIHw9IGF0dHJpYl90OjpJU19SRVFVSVJFRDsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBNYWtlcyB0aGlzIHBhcmFtZXRlciB0cmFuc2llbnQgKG5vdCBwZXJzaXN0ZW50KS4gKi8KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmdHJhbnNpZW50KCkgeworICAgICAgICAgICAgYXR0cmliKCkgJj0gfmF0dHJpYl90OjpJU19QRVJTSVNURU5UOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqIE1ha2VzIHRoaXMgcGFyYW1ldGVyIGhpZGRlbiAobm90IGV4cG9zZWQgaW4gSkFWQSBBUEkpLiAqLworICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZoaWRkZW4oKSB7CisgICAgICAgICAgICBhdHRyaWIoKSB8PSBhdHRyaWJfdDo6SVNfSElEREVOOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqIE1ha2VzIHRoaXMgcGFyYW1ldGVyIGludGVybmFsIChub3QgZXhwb3NlZCB0byBxdWVyeS9zZXR0aW5ncykuICovCisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJmludGVybmFsKCkgeworICAgICAgICAgICAgYXR0cmliKCkgfD0gYXR0cmliX3Q6OklTX0lOVEVSTkFMOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqIEFkZHMgZGVmYXVsdCB2YWx1ZS4gTXVzdCBiZSBhZGRlZCBleGFjdGx5IG9uY2UuICovCisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJndpdGhEZWZhdWx0KHN0ZDo6c2hhcmVkX3B0cjxUPiBkZWZhdWx0XykgeworICAgICAgICAgICAgLy8gQ0hFQ0soIW1EZWZhdWx0VmFsdWUpOworICAgICAgICAgICAgLy8gV0FSTl9JRighZGVmYXVsdF8pOyAvLyBjb3VsZCBiZSBudWxscHRyIGlmIE9PTQorICAgICAgICAgICAgLy8gdGVjaG5pY2FsbHksIHRoaXMgY291bGQgYmUgaW4gdGhlIHBhcmVudAorICAgICAgICAgICAgKm1UeXBlZFBhcmFtID0gc3RkOjpzaGFyZWRfcHRyPFQ+KFQ6OkZyb20oQzJQYXJhbTo6Q29weSgqZGVmYXVsdF8pLnJlbGVhc2UoKSkpOworICAgICAgICAgICAgc2V0RGVmYXVsdFZhbHVlKGRlZmF1bHRfKTsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUPiAqdHlwZWRQYXJhbSA9IG1UeXBlZFBhcmFtOworICAgICAgICAgICAgc2V0R2V0dGVyKFt0eXBlZFBhcmFtXShib29sKSAtPiBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4geworICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJQYXJhbT4oKnR5cGVkUGFyYW0pOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKiogQWRkcyBkZWZhdWx0IHZhbHVlLiBNdXN0IGJlIGFkZGVkIGV4YWN0bHkgb25jZS4gKi8KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmd2l0aERlZmF1bHQoVCAqZGVmYXVsdF8pIHsKKyAgICAgICAgICAgIHJldHVybiB3aXRoRGVmYXVsdChzdGQ6OnNoYXJlZF9wdHI8VD4oZGVmYXVsdF8pKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBBZGRzIGFsbCBmaWVsZHMgdG8gdGhpcyBwYXJhbWV0ZXIgd2l0aCB0aGVpciBwb3NzaWJsZSB2YWx1ZXMuICovCisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJndpdGhGaWVsZHMoc3RkOjp2ZWN0b3I8QzJQYXJhbUZpZWxkVmFsdWVzPiAmJmZpZWxkc18pIHsKKyAgICAgICAgICAgIHNldEZpZWxkcyhzdGQ6Om1vdmUoZmllbGRzXykpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZHMgYSBjb25zdGFudCB2YWx1ZSAoYWxzbyBhcyBkZWZhdWx0KS4gTXVzdCBiZSBhZGRlZCBleGFjdGx5IG9uY2UuCisgICAgICAgICAqCisgICAgICAgICAqIENvbnN0IHBhcmFtZXRlcnMgYnkgZGVmaW5pdGlvbiBoYXZlIG5vIGRlcGVuZGVuY2llcy4KKyAgICAgICAgICovCisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJndpdGhDb25zdFZhbHVlKHN0ZDo6c2hhcmVkX3B0cjxUPiBkZWZhdWx0XykgeworICAgICAgICAgICAgYXR0cmliKCkgfD0gYXR0cmliX3Q6OklTX0NPTlNUOworICAgICAgICAgICAgc2V0U2V0dGVyKFtkZWZhdWx0X10oCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gKnZhbHVlLCBib29sIG1heUJsb2NrIF9fdW51c2VkLCBib29sICpjaGFuZ2VkLCBGYWN0b3J5ICYpIC0+IEMyUiB7CisgICAgICAgICAgICAgICAgKmNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBjb25zdCBUICp0eXBlZFZhbHVlID0gVDo6RnJvbSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKHR5cGVkVmFsdWUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJSOjpDb3JydXB0ZWQoKTsgLy8gVE9ETyBCYWRWYWx1ZS9JbnZhbGlkLiBUaGlzIHNob3VsZCBub3QgaGFwcGVuIGhlcmUuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgqdHlwZWRWYWx1ZSAhPSAqZGVmYXVsdF8pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyUjo6Q29ycnVwdGVkKCk7IC8vIFRPRE8gUmVhZE9ubHkoKmRlZmF1bHRfKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKmNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gd2l0aERlZmF1bHQoZGVmYXVsdF8pOworICAgICAgICB9CisKKyAgICAgICAgLyoqIEFkZHMgY29uc3RhbnQgdmFsdWUgKGFsc28gYXMgZGVmYXVsdCkuIE11c3QgYmUgYWRkZWQgZXhhY3RseSBvbmNlLiAqLworICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZ3aXRoQ29uc3RWYWx1ZShUICpkZWZhdWx0XykgeworICAgICAgICAgICAgcmV0dXJuIHdpdGhDb25zdFZhbHVlKHN0ZDo6c2hhcmVkX3B0cjxUPihkZWZhdWx0XykpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVzZSBhIHN0cmljdCBzZXR0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSBmbiAgIHN0cmljdCBzZXR0ZXIKKyAgICAgICAgICogXHBhcmFtIGRlcHMgZGVwZW5kZW5jaWVzIChyZWZlcmVuY2VzKQorICAgICAgICAgKi8KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uIERlcHM+CisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJndpdGhTZXR0ZXIoCisgICAgICAgICAgICAgICAgQzJSICgqZm4pKGJvb2wsIGNvbnN0IEMyUDxUPiAmLCBDMlA8VD4gJiwgY29uc3QgQzJQPERlcHM+ICYuLi4pLAorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxEZXBzPiYgLi4uIGRlcHMpIHsKKyAgICAgICAgICAgIGF0dHJpYigpIHw9IGF0dHJpYl90OjpJU19TVFJJQ1Q7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VD4gKnR5cGVkUGFyYW0gPSBtVHlwZWRQYXJhbTsKKyAgICAgICAgICAgIHNldFNldHRlcihbdHlwZWRQYXJhbSwgZm4sICZkZXBzLi4uXSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAqdmFsdWUsIGJvb2wgbWF5QmxvY2ssIGJvb2wgKmNoYW5nZWQsIEZhY3RvcnkgJmZhY3RvcnkpIC0+IEMyUiB7CisgICAgICAgICAgICAgICAgKmNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBjb25zdCBUICp0eXBlZFZhbHVlID0gVDo6RnJvbSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKHR5cGVkVmFsdWUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJSOjpDb3JydXB0ZWQoKTsgLy8gVE9ETyBCYWRWYWx1ZS9JbnZhbGlkLiBUaGlzIHNob3VsZCBub3QgaGFwcGVuIGhlcmUuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIERvIGNvcHktb24tY2hhbmdlIGZvciBwYXJhbWV0ZXJzIGluIHRoaXMgaGVscGVyIHNvIGNoYW5nZSBjYW4gYmUgZGV0ZWN0ZWQgYnkKKyAgICAgICAgICAgICAgICAvLyBhIGNoYW5nZSBvZiB0aGUgcG9pbnRlci4gRG8gdGhpcyBieSB3b3JraW5nIG9uIGEgcHJvcG9zZWQgdmFsdWUuCisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFQ+IHByb3Bvc2VkVmFsdWUgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VD4oVDo6RnJvbShDMlBhcmFtOjpDb3B5KCp2YWx1ZSkucmVsZWFzZSgpKSk7CisgICAgICAgICAgICAgICAgaWYgKHByb3Bvc2VkVmFsdWUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJSOjpOb01lbW9yeSh2YWx1ZS0+aW5kZXgoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEMyUDxUPiBvbGRWYWx1ZSA9IGZhY3RvcnkuZ2V0KCp0eXBlZFBhcmFtKTsKKyAgICAgICAgICAgICAgICAvLyBHZXQgYSBwYXJhbWV0ZXIgaGVscGVyIHdpdGggdmFsdWUgcG9pbnRpbmcgdG8gcHJvcG9zZWRWYWx1ZQorICAgICAgICAgICAgICAgIEMyUDxUPiBoZWxwZXIgPSBmYWN0b3J5LmdldCgqdHlwZWRQYXJhbSwgcHJvcG9zZWRWYWx1ZSk7CisgICAgICAgICAgICAgICAgQzJSIHJlc3VsdCA9IGZuKG1heUJsb2NrLCBvbGRWYWx1ZSwgaGVscGVyLCBmYWN0b3J5LmdldChkZXBzKS4uLik7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB2YWx1ZSBjaGFuZ2VkLCBjb3B5IHJlc3VsdCB0byBjdXJyZW50IHZhbHVlCisgICAgICAgICAgICAgICAgaWYgKGhlbHBlci5nZXQoKSAhPSAqdHlwZWRQYXJhbS0+Z2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKnR5cGVkUGFyYW0gPSBwcm9wb3NlZFZhbHVlOworICAgICAgICAgICAgICAgICAgICAqY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHNldERlcGVuZGVuY2llcyhzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD57IGRlcHMtPmluZGV4KCkuLi4gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQYXJhbVJlZj57IFBhcmFtUmVmKGRlcHMpLi4uIH0pOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVzZSBhIG5vbi1zdHJpY3Qgc2V0dGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gZm4gICBub24tc3RyaWN0IHNldHRlcgorICAgICAgICAgKiBccGFyYW0gZGVwcyBkZXBlbmRlbmNpZXMgKHJlZmVyZW5jZXMpCisgICAgICAgICAqLworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi4gRGVwcz4KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmd2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICBDMlIgKCpmbikoYm9vbCwgQzJQPFQ+ICYsIGNvbnN0IEMyUDxEZXBzPiAmLi4uKSwgc3RkOjpzaGFyZWRfcHRyPERlcHM+JiAuLi4gZGVwcykgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFQ+ICp0eXBlZFBhcmFtID0gbVR5cGVkUGFyYW07CisgICAgICAgICAgICBzZXRTZXR0ZXIoW3R5cGVkUGFyYW0sIGZuLCAmZGVwcy4uLl0oCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gKnZhbHVlLCBib29sIG1heUJsb2NrLCBib29sICpjaGFuZ2VkLCBGYWN0b3J5ICZmYWN0b3J5KSAtPiBDMlIgeworICAgICAgICAgICAgICAgICpjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgY29uc3QgVCAqdHlwZWRWYWx1ZSA9IFQ6OkZyb20odmFsdWUpOworICAgICAgICAgICAgICAgIGlmICh0eXBlZFZhbHVlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyUjo6Q29ycnVwdGVkKCk7IC8vIFRPRE8gQmFkVmFsdWUvSW52YWxpZC4gVGhpcyBzaG91bGQgbm90IGhhcHBlbiBoZXJlLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBEbyBjb3B5LW9uLWNoYW5nZSBmb3IgcGFyYW1ldGVycyBpbiB0aGlzIGhlbHBlciBzbyBjaGFuZ2UgY2FuIGJlIGRldGVjdGVkIGJ5CisgICAgICAgICAgICAgICAgLy8gYSBjaGFuZ2Ugb2YgdGhlIHBvaW50ZXIuIERvIHRoaXMgYnkgd29ya2luZyBvbiBhIHByb3Bvc2VkIHZhbHVlLgorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUPiBwcm9wb3NlZFZhbHVlID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFQ+KFQ6OkZyb20oQzJQYXJhbTo6Q29weSgqdmFsdWUpLnJlbGVhc2UoKSkpOworICAgICAgICAgICAgICAgIGlmIChwcm9wb3NlZFZhbHVlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyUjo6Tm9NZW1vcnkodmFsdWUtPmluZGV4KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBHZXQgYSBwYXJhbWV0ZXIgaGVscGVyIHdpdGggdmFsdWUgcG9pbnRpbmcgdG8gcHJvcG9zZWRWYWx1ZQorICAgICAgICAgICAgICAgIEMyUDxUPiBoZWxwZXIgPSBmYWN0b3J5LmdldCgqdHlwZWRQYXJhbSwgcHJvcG9zZWRWYWx1ZSk7CisgICAgICAgICAgICAgICAgQzJSIHJlc3VsdCA9IGZuKG1heUJsb2NrLCBoZWxwZXIsIGZhY3RvcnkuZ2V0KGRlcHMpLi4uKTsKKworICAgICAgICAgICAgICAgIC8vIElmIHZhbHVlIGNoYW5nZWQsIGNvcHkgcmVzdWx0IHRvIGN1cnJlbnQgdmFsdWUKKyAgICAgICAgICAgICAgICBpZiAoaGVscGVyLmdldCgpICE9ICp0eXBlZFBhcmFtLT5nZXQoKSkgeworICAgICAgICAgICAgICAgICAgICAqdHlwZWRQYXJhbSA9IHByb3Bvc2VkVmFsdWU7CisgICAgICAgICAgICAgICAgICAgICpjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgc2V0RGVwZW5kZW5jaWVzKHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PnsgZGVwcy0+aW5kZXgoKS4uLiB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBhcmFtUmVmPnsgUGFyYW1SZWYoZGVwcykuLi4gfSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTWFya3MgdGhpcyBhIGNhbGN1bGF0ZWQgKHJlYWQtb25seSkgZmllbGQuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSBmbiAgIG5vbi1zdHJpY3Qgc2V0dGVyIChjYWxjdWxhdG9yKQorICAgICAgICAgKiBccGFyYW0gZGVwcyBkZXBlbmRlbmNpZXMgKHJlZmVyZW5jZXMpCisgICAgICAgICAqLworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi4gRGVwcz4KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmY2FsY3VsYXRlZEFzKAorICAgICAgICAgICAgICAgIEMyUiAoKmZuKShib29sLCBDMlA8VD4gJiwgY29uc3QgQzJQPERlcHM+ICYuLi4pLCBzdGQ6OnNoYXJlZF9wdHI8RGVwcz4mIC4uLiBkZXBzKSB7CisgICAgICAgICAgICBhdHRyaWIoKSB8PSBhdHRyaWJfdDo6SVNfUkVBRF9PTkxZOworICAgICAgICAgICAgcmV0dXJuIHdpdGhTZXR0ZXIoZm4sIHN0ZDo6Zm9yd2FyZDxkZWNsdHlwZShkZXBzKT4oZGVwcykuLi4pOworICAgICAgICB9CisKKyAgICAgICAgaW5saW5lIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gYnVpbGQoKSB7CisgICAgICAgICAgICByZXR1cm4gUGFyYW1IZWxwZXI6OmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFQ+ICptVHlwZWRQYXJhbTsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdGF0aWMgUGFyYW1CdWlsZGVyPFQ+IERlZmluZVBhcmFtKHN0ZDo6c2hhcmVkX3B0cjxUPiAmcGFyYW0sIEMyU3RyaW5nTGl0ZXJhbCBuYW1lKSB7CisgICAgICAgIHJldHVybiBQYXJhbUJ1aWxkZXI8VD4ocGFyYW0sIG5hbWUpOworICAgIH0KKworcHVibGljOgorICAgIGMyX3N0YXR1c190IHF1ZXJ5KAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBoZWFwUGFyYW1zKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEhlbHBlciBpbXBsZW1lbnRpbmcgY29uZmlnIGNhbGxzIGFzIHdlbGwgYXMgb3RoZXIgY29uZmlndXJhdGlvbiB1cGRhdGVzLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgaXMgdmlydHVhbCwgc28gaW1wbGVtZW50YXRpb25zIG1heSBwcm92aWRlIHdyYXBwZXJzIGFyb3VuZCBpdCAoYW5kIHBlcmZvcm0KKyAgICAgKiBhY3Rpb25zIGp1c3QgYmVmb3JlIGFuZCBhZnRlciBhIGNvbmZpZ3VyYXRpb24pLgorICAgICAqCisgICAgICogXHBhcmFtIHBhcmFtcworICAgICAqIFxwYXJhbSBtYXlCbG9jaworICAgICAqIFxwYXJhbSBmYWlsdXJlcworICAgICAqIFxwYXJhbSB1cGRhdGVQYXJhbXMgaWYgdHJ1ZSwgdGhlIHVwZGF0ZWQgcGFyYW1ldGVyIHZhbHVlcyBhcmUgY29waWVkIGJhY2sgaW50byB0aGUgYXJndW1lbnRzCisgICAgICogICAgICAgICAgICAgICAgICAgICBwYXNzZWQgaW4gfHBhcmFtc3wKKyAgICAgKiBccGFyYW0gY2hhbmdlcyAgICAgIHBvaW50ZWQgdG8gYSB2ZWN0b3IgdG8gcmVjZWl2ZSBzZXR0aW5ncyB3aXRoIHRoZWlyIHZhbHVlcyBjaGFuZ2VkLiBJZiBub3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIG51bGwsIHNldHRpbmdzIHdpdGggdGhlaXIgdmFsdWVzIGNoYW5nZWQgYXJlIGFkZGVkIHRvIHRoaXMuCisgICAgICogXHJldHVybiByZXN1bHQgZnJvbSBjb25maWcKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLCBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcywKKyAgICAgICAgICAgIGJvb2wgdXBkYXRlUGFyYW1zID0gdHJ1ZSwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPj4gKmNoYW5nZXMgPSBudWxscHRyKTsKKworICAgIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKmNvbnN0IHBhcmFtcykgY29uc3Q7CisKKyAgICBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcywgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3Q7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IGdldFJlZmxlY3RvcigpIHsKKyAgICAgICAgcmV0dXJuIG1SZWZsZWN0b3I7CisgICAgfQorCisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IExvY2s7CisKKyAgICAvKioKKyAgICAgKiBMb2NrcyB0aGUgaW50ZXJmYWNlIGFuZCByZXR1cm5zIGEgbG9jay4gVGhpcyBsb2NrIG11c3QgYmUgdW5sb2NrZWQgb3IgcmVsZWFzZWQgd2l0aG91dAorICAgICAqIGNhbGxpbmcgYW55IG90aGVyIGJsb2NraW5nIGNhbGwuCisgICAgICovCisgICAgTG9jayBsb2NrKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgdm9pZCBzZXRJbnRlcmZhY2VBZGRyZXNzQm91bmRzKHVpbnRwdHJfdCBzdGFydCwgdWludHB0cl90IGVuZCkgeworICAgICAgICAvLyBUT0RPOiBleGNsdWRlIHRoaXMgaGVscGVyCisgICAgICAgICh2b2lkKXN0YXJ0OworICAgICAgICAodm9pZCllbmQ7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1SZWZsZWN0b3I7CisgICAgc3RydWN0IEZhY3RvcnlJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxGYWN0b3J5SW1wbD4gX21GYWN0b3J5OworCisgICAgQzJJbnRlcmZhY2VIZWxwZXIoc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiByZWZsZWN0b3IpOworCisgICAgLyoqCisgICAgICogQWRkcyBhIHBhcmFtZXRlciB0byB0aGlzIGludGVyZmFjZS4KKyAgICAgKiBcbm90ZSBUaGlzIG1ldGhvZCBDSEVDS3MuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW0gcGFyYW1ldGVyIHRvIGFkZC4KKyAgICAgKi8KKyAgICB2b2lkIGFkZFBhcmFtZXRlcihzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IHBhcmFtKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGRlcGVuZGVuY3kgaW5kZXggZm9yIGEgcGFyYW1ldGVyLgorICAgICAqCisgICAgICogXHBhcmFtIGl4IHRoZSBpbmRleCBvZiB0aGUgcGFyYW1ldGVyCisgICAgICovCisgICAgc2l6ZV90IGdldERlcGVuZGVuY3lJbmRleF9sKEMyUGFyYW06OkluZGV4IGl4KSBjb25zdDsKKworICAgIHZpcnR1YWwgfkMySW50ZXJmYWNlSGVscGVyKCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogU2V0cyBzdWJjbGFzcyBpbnN0YW5jZSdzIGFkZHJlc3MgYW5kIHNpemUuCisgICAgICoKKyAgICAgKiBcdG9kbyBhbGxvdyBzdWJjbGFzcyB0byBzcGVjaWZ5IHBhcmFtZXRlciBhZGRyZXNzIHJhbmdlIGRpcmVjdGx5IChlLmcuIGRvIG5vdCBhc3N1bWUgdGhhdAorICAgICAqICAgICAgIHRoZXkgYXJlIGxvY2FsIHRvIHRoZSBzdWJjbGFzcyBpbnN0YW5jZSkKKyAgICAgKgorICAgICAqIFxwYXJhbSBUIHR5cGUgb2YgdGhlIGRlcml2ZWQgaW5zdGFuY2UKKyAgICAgKiBccGFyYW0gaW5zdGFuY2UgcG9pbnRlciB0byB0aGUgZGVyaXZlZCBpbnN0YW5jZQorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIEMyX0hJREUgdm9pZCBzZXREZXJpdmVkSW5zdGFuY2UoVCAqaW5zdGFuY2UpIHsKKyAgICAgICAgc2V0SW50ZXJmYWNlQWRkcmVzc0JvdW5kcygodWludHB0cl90KWluc3RhbmNlLCAodWludHB0cl90KShpbnN0YW5jZSArIDEpKTsKKyAgICB9CisKKyAgICBDMl9ET19OT1RfQ09QWShDMkludGVyZmFjZUhlbHBlcik7Cit9OworCisvKioKKyAqIENyZWF0ZXMgYSBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyIGNsYXNzIGZvciBhIGZpZWxkIG9mIGEgcGFyYW1ldGVyCisgKgorICogXHBhcmFtIHNwUGFyYW0gYSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciBpbiBhbiBpbnRlcmZhY2UgY2xhc3Mgc3ViY2xhc3NlZCBmcm9tIEMySW50ZXJmYWNlSGVscGVyLgorICogXHBhcmFtIGZpZWxkICAgYSBmaWVsZCBvZiBzdWNoIHBhcmFtZXRlcgorICovCisjZGVmaW5lIEMyRihzcFBhcmFtLCBmaWVsZCkgXAorICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8IFwKKyAgICAgICAgICAgIHR5cGVuYW1lIF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGU8IFwKKyAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjpyZW1vdmVfZXh0ZW50PCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsdHlwZShzcFBhcmFtLT5maWVsZCk+Ojp0eXBlPjo6dHlwZT46OnR5cGU+KCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW1GaWVsZChzcFBhcmFtLmdldCgpLCAmc3BQYXJhbS0+ZmllbGQpKQorCisjZW5kaWYgIC8vIEMyVVRJTFNfSU5URVJGQUNFX0hFTFBFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MySW50ZXJmYWNlVXRpbHMuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkludGVyZmFjZVV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkwMzdlNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkludGVyZmFjZVV0aWxzLmgKQEAgLTAsMCArMSwxMTM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlVUSUxTX0lOVEVSRkFDRV9VVElMU19IXworI2RlZmluZSBDMlVUSUxTX0lOVEVSRkFDRV9VVElMU19IXworCisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyV29yay5oPgorCisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisvKioKKyAqIEhlbHBlciBjbGFzcyB0byBtYXAgdW5kZXJseWluZyB0eXBlcyB0byBDMlZhbHVlIHR5cGVzIGFzIHdlbGwgYXMgdG8gcHJpbnQgZmllbGQgdmFsdWVzLiBUaGlzIGlzCisgKiBnZW5lcmFsbHkgdGhlIHNhbWUgYXMgc2ltcGx5IHRoZSB1bmRlcmx5aW5nIHR5cGUgZXhjZXB0IGZvciBjaGFyYWN0ZXJzIChTVFJJTkcpIGFuZCBieXRlcyAoQkxPQikuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQzJfSElERSBfQzJGaWVsZFZhbHVlSGVscGVyIHsKKyAgICB0eXBlZGVmIFQgVmFsdWVUeXBlOworICAgIGlubGluZSBzdGF0aWMgc3RkOjpvc3RyZWFtJiBwdXQoc3RkOjpvc3RyZWFtICZvcywgY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZwKSB7CisgICAgICAgIHJldHVybiBvcyA8PCBwLnJlZjxUPigpOworICAgIH0KK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBDMl9ISURFIF9DMkZpZWxkVmFsdWVIZWxwZXI8dWludDhfdD4geworICAgIHR5cGVkZWYgdWludDMyX3QgVmFsdWVUeXBlOworICAgIHN0YXRpYyBzdGQ6Om9zdHJlYW0mIHB1dChzdGQ6Om9zdHJlYW0gJm9zLCBjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnApOworfTsKKwordGVtcGxhdGU8Pgorc3RydWN0IEMyX0hJREUgX0MyRmllbGRWYWx1ZUhlbHBlcjxjaGFyPiB7CisgICAgdHlwZWRlZiBpbnQzMl90IFZhbHVlVHlwZTsKKyAgICBzdGF0aWMgc3RkOjpvc3RyZWFtJiBwdXQoc3RkOjpvc3RyZWFtICZvcywgY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZwKTsKK307CisKKy8qKgorICogU3VwcG9ydGVkIHZhbHVlIHJhbmdlIHV0aWxpdHkgZm9yIGEgZmllbGQgb2YgYSBnaXZlbiB0eXBlLgorICoKKyAqIFRoaXMgbWltaWNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZSBmb3IgUkFOR0UgdHlwZS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIEMyU3VwcG9ydGVkUmFuZ2UgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0MyRmllbGRWYWx1ZUhlbHBlcjxUPjo6VmFsdWVUeXBlIFZhbHVlVHlwZTsKKworLy9wcml2YXRlOgorICAgIGNvbnN0ZXhwciBzdGF0aWMgVCBNSU5fVkFMVUUgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptaW4oKTsKKyAgICBjb25zdGV4cHIgc3RhdGljIFQgTUFYX1ZBTFVFID0gc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWF4KCk7CisgICAgY29uc3RleHByIHN0YXRpYyBUIE1JTl9TVEVQID0gc3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWUgPyAwIDogMTsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gZW1wdHkgcmFuZ2Ugd2l0aCBubyBzdXBwb3J0ZWQgdmFsdWVzLgorICAgICAqCisgICAgICogXG5vdGUgVGhpcyBpcyBhIHNwZWNpYWxpemF0ZWQgc3VwcG9ydGVkIHJhbmdlIHJlcHJlc2VudGF0aW9uIHRoYXQgaXMgb25seSB1c2VkIGZvcgorICAgICAqIHRoaXMgb2JqZWN0IC0gaXQgaXMgZXF1aXZhbGVudCB0byB0aGUgRU1QVFkgdHlwZSBpbiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzLgorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByIEMyU3VwcG9ydGVkUmFuZ2U8VD4gTm9uZSgpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkUmFuZ2UoTUFYX1ZBTFVFLCBNSU5fVkFMVUUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSB3aXRoIGFsbCB2YWx1ZXMgc3VwcG9ydGVkLgorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByIEMyU3VwcG9ydGVkUmFuZ2U8VD4gQW55KCkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRSYW5nZShNSU5fVkFMVUUsIE1BWF9WQUxVRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIHdpdGggYSBzaW5nbGUgc3VwcG9ydGVkIHZhbHVlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSBzb2xlIHN1cHBvcnRlZCB2YWx1ZQorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByIEMyU3VwcG9ydGVkUmFuZ2U8VD4gRXF1YWxUbyhUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFJhbmdlKHZhbHVlLCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIHdpdGggc3VwcG9ydGVkIHZhbHVlcyBncmVhdGVyIHRoYW4gYSBnaXZlbiB2YWx1ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgZ2l2ZW4gdmFsdWUKKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIEMyU3VwcG9ydGVkUmFuZ2U8VD4gR3JlYXRlclRoYW4oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gKHZhbHVlID09IE1BWF9WQUxVRSA/IE5vbmUoKSA6CisgICAgICAgICAgICAgICAgc3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWUgPworICAgICAgICAgICAgICAgICAgICAgICAgQzJTdXBwb3J0ZWRSYW5nZShzdGQ6Om5leHRhZnRlcih2YWx1ZSwgTUFYX1ZBTFVFKSwgTUFYX1ZBTFVFKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBDMlN1cHBvcnRlZFJhbmdlKHZhbHVlICsgTUlOX1NURVAsIE1BWF9WQUxVRSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSB3aXRoIHN1cHBvcnRlZCB2YWx1ZXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGEgZ2l2ZW4gdmFsdWUuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIGdpdmVuIHZhbHVlCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgQzJTdXBwb3J0ZWRSYW5nZTxUPiBHcmVhdGVyVGhhbk9yRXF1YWxUbyhUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFJhbmdlKHZhbHVlLCBNQVhfVkFMVUUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSB3aXRoIHN1cHBvcnRlZCB2YWx1ZXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIChha2Egbm90IGxlc3MgdGhhbikgYSBnaXZlbgorICAgICAqIHZhbHVlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSBnaXZlbiB2YWx1ZQorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByIEMyU3VwcG9ydGVkUmFuZ2U8VD4gTm90TGVzc1RoYW4oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gR3JlYXRlclRoYW5PckVxdWFsVG8odmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSB3aXRoIHN1cHBvcnRlZCB2YWx1ZXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGEgZ2l2ZW4gdmFsdWUuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIGdpdmVuIHZhbHVlCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgQzJTdXBwb3J0ZWRSYW5nZTxUPiBMZXNzVGhhbk9yRXF1YWxUbyhUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFJhbmdlKE1JTl9WQUxVRSwgdmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSB3aXRoIHN1cHBvcnRlZCB2YWx1ZXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIChha2Egbm90IGdyZWF0ZXIgdGhhbikgYSBnaXZlbgorICAgICAqIHZhbHVlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSBnaXZlbiB2YWx1ZQorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByIEMyU3VwcG9ydGVkUmFuZ2U8VD4gTm90R3JlYXRlclRoYW4oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gTGVzc1RoYW5PckVxdWFsVG8odmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSB3aXRoIHN1cHBvcnRlZCB2YWx1ZXMgbGVzcyB0aGFuIGEgZ2l2ZW4gdmFsdWUuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIGdpdmVuIHZhbHVlCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBDMlN1cHBvcnRlZFJhbmdlPFQ+IExlc3NUaGFuKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuICh2YWx1ZSA9PSBNSU5fVkFMVUUgPyBOb25lKCkgOgorICAgICAgICAgICAgICAgIHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlID8KKyAgICAgICAgICAgICAgICAgICAgICAgIEMyU3VwcG9ydGVkUmFuZ2UoTUlOX1ZBTFVFLCBzdGQ6Om5leHRhZnRlcih2YWx1ZSwgTUlOX1ZBTFVFKSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgQzJTdXBwb3J0ZWRSYW5nZShNSU5fVkFMVUUsIHZhbHVlIC0gTUlOX1NURVApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgY29udGludW91cyBvciBhcml0aG1ldGljIHJhbmdlIGJldHdlZW4gdHdvIHZhbHVlcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBtaW4gdGhlIGxvd2VyIHZhbHVlCisgICAgICogXHBhcmFtIG1heCB0aGUgaGlnaGVyIHZhbHVlIChpZiB0aGlzIGlzIGxvd2VyIHRoYW4gfG1pbnwgdGhlIHJhbmdlIHdpbGwgYmUgZW1wdHkpCisgICAgICogXHBhcmFtIHN0ZXAgdGhlIHN0ZXAgb2YgdGhlIGFyaXRobWV0aWMgcmFuZ2UuIChJZiB0aGlzIGlzIDAgZm9yIGZsb2F0aW5nIHBvaW50IHR5cGVzIG9yIDEgZm9yCisgICAgICogICAgICAgIGludGVnZXIgdHlwZXMsIHRoZSBjb25zdHJ1Y3RlZCByYW5nZSBpcyBjb250aW51b3VzKQorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByCisgICAgQzJTdXBwb3J0ZWRSYW5nZTxUPiBJblJhbmdlKFQgbWluLCBUIG1heCwgVCBzdGVwID0gTUlOX1NURVApIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkUmFuZ2UobWluLCBtYXgsIHN0ZXApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSBvdmVyIGEgZ2VvbWV0cmljIHNlcmllcyBiZXR3ZWVuIHR3byB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gbWluIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgcmFuZ2UuIFRoaXMgdmFsdWUgaXMgYWx3YXlzIHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkIHJhbmdlCisgICAgICogICAgICAgIGFzIGxvbmcgYXMgaXQgaXMgbm90IGdyZWF0ZXIgdGhhbiB8bWF4fC4KKyAgICAgKiBccGFyYW0gbWF4IHRoZSB1cHBlciBib3VuZCBvZiB0aGUgcmFuZ2UuIFRoaXMgdmFsdWUgaXMgb25seSBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZAorICAgICAqICAgICAgICByYW5nZSBpZiBpdCBpcyBwYXJ0IG9mIHRoZSBnZW9tZXRyaWMgc2VyaWVzLgorICAgICAqIFxwYXJhbSBudW0gdGhlIG51bWVyYXRvciBvZiB0aGUgZ2VvbWV0cmljIHNlcmllcy4KKyAgICAgKiBccGFyYW0gZGVub20gdGhlIGRlbm9taW5hdG9yIG9mIHRoZSBnZW9tZXRyaWMgc2VyaWVzLgorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByCisgICAgQzJTdXBwb3J0ZWRSYW5nZTxUPiBJblNlcmllcyhUIG1pbiwgVCBtYXgsIFQgbnVtLCBUIGRlbm9tKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFJhbmdlKG1pbiwgbWF4LCAwLCBudW0sIGRlbm9tKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugb3ZlciBhIG11bHRpcGx5LWFjY3VtdWxhdGUgc2VyaWVzIGJldHdlZW4gdHdvIHZhbHVlcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBtaW4gdGhlIGxvd2VyIGJvdW5kIG9mIHRoZSByYW5nZS4gVGhpcyB2YWx1ZSBpcyBhbHdheXMgcGFydCBvZiB0aGUgY29uc3RydWN0ZWQgcmFuZ2UKKyAgICAgKiAgICAgICAgYXMgbG9uZyBhcyBpdCBpcyBub3QgZ3JlYXRlciB0aGFuIHxtYXh8LgorICAgICAqIFxwYXJhbSBtYXggdGhlIHVwcGVyIGJvdW5kIG9mIHRoZSByYW5nZS4gVGhpcyB2YWx1ZSBpcyBvbmx5IHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkCisgICAgICogICAgICAgIHJhbmdlIGlmIGl0IGlzIHBhcnQgb2YgdGhlIHNlcmllcy4KKyAgICAgKiBccGFyYW0gc3RlcCB0aGUgYWNjdW11bGF0b3Igb2YgdGhlIG11bHRpcGx5LWFjY3VtdWxhdGUgc2VyaWVzCisgICAgICogXHBhcmFtIG51bSB0aGUgbnVtZXJhdG9yIG9mIHRoZSBtdWx0aXBseS1hY2N1bXVsYXRlIHNlcmllcy4KKyAgICAgKiBccGFyYW0gZGVub20gdGhlIGRlbm9taW5hdG9yIG9mIHRoZSBtdWx0aXBseS1hY2N1bXVsYXRlIHNlcmllcy4KKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwcgorICAgIEMyU3VwcG9ydGVkUmFuZ2U8VD4gSW5NYWNTZXJpZXMoVCBtaW4sIFQgbWF4LCBUIHN0ZXAsIFQgbnVtLCBUIGRlbm9tKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFJhbmdlKG1pbiwgbWF4LCBzdGVwLCBudW0sIGRlbm9tKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2UgZnJvbSBhIGdlbmVyaWMgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyBvYmplY3QuIFRoaXMgd2lsbCBiZSBhbiBlbXB0eQorICAgICAqIHJhbmdlIGlmIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGFyZSBub3Qgb2YgUkFOR0UgdHlwZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZXMgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgb2JqZWN0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRSYW5nZShjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWx1ZXMpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcmFuZ2UgaXMgZW1wdHkuCisgICAgICovCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIGlzRW1wdHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbU1pbiA+IF9tTWF4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHJhbmdlIGlzIHZhbGlkLgorICAgICAqCisgICAgICogUmFuZ2VzIGFyZSB2YWxpZCBpZiB0aGV5IGFyZSBjb250aW51b3VzIG9yIG1vbm90b25pYy4KKyAgICAgKi8KKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsKKyAgICAgICAgLy8gVE9ETzogaGFuZGxlIG92ZXJmbG93IG9yIG5lZ2F0aXZlIHNlcmllcworICAgICAgICByZXR1cm4gX21EZW5vbSA+IDAgJiYgX21OdW0gPj0gX21EZW5vbSAmJiBfbU1pbiAqIChfbURlbm9tIC0gX21OdW0pIDwgX21TdGVwICogX21EZW5vbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYSB2YWx1ZSBpcyBwYXJ0IG9mIHRoaXMgcmFuZ2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGNoZWNrLgorICAgICAqLworICAgIGJvb2wgY29udGFpbnMoVCB2YWx1ZSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IHJhbmdlIHRoYXQgaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIHJhbmdlIGFuZCBhbm90aGVyLCBpZiBpdCBpcworICAgICAqIHJlcHJlc2VudGFibGUgYXMgYSByYW5nZSBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gbGltaXQgdGhlIG90aGVyIHJhbmdlCisgICAgICovCisgICAgQzJTdXBwb3J0ZWRSYW5nZTxUPiBsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxUPiAmbGltaXQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIG9iamVjdC4KKyAgICAgKi8KKyAgICBpbmxpbmUgb3BlcmF0b3IgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoX21NaW4sIF9tTWF4LCBfbVN0ZXAsIF9tTnVtLCBfbURlbm9tKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsb3dlciBib3VuZCBhbmQgc3RhcnRpbmcgcG9pbnQgb2YgdGhpcyByYW5nZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgQzJfSElERSBjb25zdGV4cHIgVCBtaW4oKSBjb25zdCAgIHsgcmV0dXJuIF9tTWluOyAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHVwcGVyIGJvdW5kIG9mIHRoaXMgcmFuZ2UuCisgICAgICovCisgICAgaW5saW5lIEMyX0hJREUgY29uc3RleHByIFQgbWF4KCkgY29uc3QgICB7IHJldHVybiBfbU1heDsgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzdGVwIG9mIHRoaXMgcmFuZ2UuCisgICAgICovCisgICAgaW5saW5lIEMyX0hJREUgY29uc3RleHByIFQgc3RlcCgpIGNvbnN0ICB7IHJldHVybiBfbVN0ZXA7ICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1lcmF0b3Igb2YgdGhpcyByYW5nZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgQzJfSElERSBjb25zdGV4cHIgVCBudW0oKSBjb25zdCAgIHsgcmV0dXJuIF9tTnVtOyAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGRlbm9taW5hdG9yIG9mIHRoaXMgcmFuZ2UuCisgICAgICovCisgICAgaW5saW5lIEMyX0hJREUgY29uc3RleHByIFQgZGVub20oKSBjb25zdCB7IHJldHVybiBfbURlbm9tOyB9CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHhbaS4uLl0gaXMgYWxsIHZhbHVlcyBiZXR3ZWVuIF9tTWluIGFuZCBfbU1heC4KKyAgICAgKi8KKyAgICBpbmxpbmUgQzJfSElERSBjb25zdGV4cHIgYm9vbCBpc1NpbXBsZVJhbmdlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gX21TdGVwID09IE1JTl9TVEVQICYmIF9tTnVtID09IDEgJiYgX21EZW5vbSA9PSAxOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB4W2kuLi5dIGlzIGRlZmluZWQgYXMgc3VjaDoKKyAgICAgKiB4W2kgKyAxXSA9IHhbaV0gKyBfbVN0ZXAsIHdoZXJlIF9tU3RlcCA+IDAgYW5kIF9tTWluIDw9IHhbaV0gPD0gX21NYXgKKyAgICAgKi8KKyAgICBpbmxpbmUgQzJfSElERSBjb25zdGV4cHIgYm9vbCBpc0FyaXRobWV0aWNTZXJpZXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbVN0ZXAgPiBNSU5fU1RFUCAmJiBfbU51bSA9PSAxICYmIF9tRGVub20gPT0gMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgeFtpLi4uXSBpcyBkZWZpbmVkIGFzIHN1Y2g6CisgICAgICogeFtpXSA9IHhbMF0gKiAoX21OdW0gLyBfbURlbm9tKSBeIGkgKHdpdGggcm91bmRpbmcpLCB3aGVyZSBfbU51bSA+IF9tRGVub20gPiAwIGFuZCB4WzBdID4gMAorICAgICAqLworICAgIGlubGluZSBDMl9ISURFIGNvbnN0ZXhwciBib29sIGlzR2VvbWV0cmljU2VyaWVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gX21NaW4gPiAwICYmIF9tU3RlcCA9PSAwICYmIF9tTnVtID4gX21EZW5vbSAmJiBfbURlbm9tID4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgeFtpLi4uXSBpcyBkZWZpbmVkIGFzIHN1Y2g6CisgICAgICogeFtpICsgMV0gPSB4W2ldICogX21OdW0gLyBfbURlbm9tICsgX21TdGVwICh3aXRoIHJvdW5kaW5nKSwgd2hpbGUgeFtpICsgMV0gPiB4W2ldLCB3aGVyZQorICAgICAqIF9tU3RlcCAhPSAwLCBfbURlbm9tID4gMCBhbmQgX21OdW0gPiAwCisgICAgICovCisgICAgaW5saW5lIEMyX0hJREUgY29uc3RleHByIGJvb2wgaXNNYWNTZXJpZXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbVN0ZXAgIT0gMCAmJiBfbU51bSA+IDAgJiYgX21EZW5vbSA+IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBhcml0aG1ldGljIG9yIGNvbnRpbnVvdXMgcmFuZ2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gbWluIHRoZSBsb3dlciB2YWx1ZQorICAgICAqIFxwYXJhbSBtYXggdGhlIGhpZ2hlciB2YWx1ZSAoaWYgdGhpcyBpcyBsb3dlciB0aGFuIHxtaW58IHRoZSByYW5nZSB3aWxsIGJlIGVtcHR5KQorICAgICAqIFxwYXJhbSBzdGVwIHRoZSBzdGVwIG9mIHRoZSBhcml0aG1ldGljIHJhbmdlLiAoSWYgdGhpcyBpcyAwIGZvciBmbG9hdGluZyBwb2ludCB0eXBlcyBvciAxIGZvcgorICAgICAqICAgICAgICBpbnRlZ2VyIHR5cGVzLCB0aGUgY29uc3RydWN0ZWQgcmFuZ2UgaXMgY29udGludW91cykKKyAgICAgKi8KKyAgICBjb25zdGV4cHIgQzJfSElERSBDMlN1cHBvcnRlZFJhbmdlKFQgbWluLCBUIG1heCwgVCBzdGVwID0gVChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZSA/IDAgOiAxKSkKKyAgICAgICAgOiBfbU1pbihtaW4pLCBfbU1heChtYXgpLCBfbVN0ZXAoc3RlcCksIF9tTnVtKDEpLCBfbURlbm9tKDEpIHsgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIG92ZXIgYSBnZW9tZXJ0aWMgc29yIG11bHRpcGx5LWFjY3VtdWxhdGUgc2VyaWVzLgorICAgICAqCisgICAgICogXHBhcmFtIG1pbiB0aGUgbG93ZXIgYm91bmQgb2YgdGhlIHJhbmdlLiBUaGlzIHZhbHVlIGlzIGFsd2F5cyBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZCByYW5nZQorICAgICAqICAgICAgICBhcyBsb25nIGFzIGl0IGlzIG5vdCBncmVhdGVyIHRoYW4gfG1heHwuCisgICAgICogXHBhcmFtIG1heCB0aGUgdXBwZXIgYm91bmQgb2YgdGhlIHJhbmdlLiBUaGlzIHZhbHVlIGlzIG9ubHkgcGFydCBvZiB0aGUgY29uc3RydWN0ZWQKKyAgICAgKiAgICAgICAgcmFuZ2UgaWYgaXQgaXMgcGFydCBvZiB0aGUgZ2VvbWV0cmljIHNlcmllcy4KKyAgICAgKiBccGFyYW0gc3RlcCB0aGUgYWNjdW11bGF0b3Igb2YgdGhlIG11bHRpcGx5LWFjY3VtdWxhdGUgc2VyaWVzLiBUaGlzIGlzIDAgZm9yIGEgcHVyZSBnZW9tZXRyaWMKKyAgICAgKiAgICAgICAgc2VyaWVzCisgICAgICogXHBhcmFtIG51bSB0aGUgbnVtZXJhdG9yIG9mIHRoZSBnZW9tZXRyaWMgc2VyaWVzLgorICAgICAqIFxwYXJhbSBkZW5vbSB0aGUgZGVub21pbmF0b3Igb2YgdGhlIGdlb21ldHJpYyBzZXJpZXMuCisgICAgICovCisgICAgY29uc3RleHByIEMyX0hJREUgQzJTdXBwb3J0ZWRSYW5nZShUIG1pbiwgVCBtYXgsIFQgc3RlcCwgVCBudW0sIFQgZGVuKQorICAgICAgICA6IF9tTWluKG1pbiksIF9tTWF4KG1heCksIF9tU3RlcChzdGVwKSwgX21OdW0obnVtKSwgX21EZW5vbShkZW4pIHsgfQorCisgICAgVCBfbU1pbjsgLy8vPCBsb3dlciBib3VuZCBhbmQgc3RhcnRpbmcgcG9pbnQKKyAgICBUIF9tTWF4OyAvLy88IHVwcGVyIGJvdW5kCisgICAgVCBfbVN0ZXA7IC8vLzwgc3RlcCBvZiBhbiBhcml0aG1ldGljIHNlcmllcyAoMCBpZiBjb250aW51b3VzIGZsb2F0aW5nIHBvaW50IHJhbmdlKQorICAgIFQgX21OdW07IC8vLzwgbnVtZXJhdG9yIG9mIGEgZ2VvbWV0cmljIHNlcmllcworICAgIFQgX21EZW5vbTsgLy8vPCBkZW5vbWluYXRvciBvZiBhIGdlb21ldHJpYyBzZXJpZXMKK307CisKKy8qKgorICogT3JkZXJlZCBzdXBwb3J0ZWQgZmxhZyBzZXQgZm9yIGEgZmllbGQgb2YgYSBnaXZlbiB0eXBlLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQzJTdXBwb3J0ZWRGbGFncyB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQzJGaWVsZFZhbHVlSGVscGVyPFQ+OjpWYWx1ZVR5cGUgVmFsdWVUeXBlOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBlbXB0eSBmbGFnIHNldC4KKyAgICAgKgorICAgICAqIFxub3RlIFRoaXMgaXMgYSBzcGVjaWFsaXphdGVkIHN1cHBvcnRlZCBmbGFncyByZXByZXNlbnRhdGlvbiB0aGF0IGlzIG9ubHkgdXNlZCBmb3IKKyAgICAgKiB0aGlzIG9iamVjdCAtIGl0IGlzIGVxdWl2YWxlbnQgdG8gdGhlIEVNUFRZIHR5cGUgaW4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW5saW5lIEMyU3VwcG9ydGVkRmxhZ3M8VD4gTm9uZSgpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkRmxhZ3Moc3RkOjppbml0aWFsaXplcl9saXN0PEMyVmFsdWU6OlByaW1pdGl2ZT4oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGZsYWdzIHNldCBvZiBnaXZlbiBmbGFncy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBmbGFncyB0aGUgb3JkZXJlZCBzZXQgb2YgZmxhZ3MgYXMgYW4gaW5pdGlhbGl6ZXIgbGlzdC4KKyAgICAgKiBccGFyYW0gbWluIG1pbmltdW0gc2V0IG9mIGZsYWdzIHRvIGJlIHNldC4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW5saW5lIEMyU3VwcG9ydGVkRmxhZ3M8VD4gRmxhZ3MoY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IGZsYWdzLCBUIG1pbiA9IFQoMCkpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkRmxhZ3MobWluLCBmbGFncyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGZsYWdzIHNldCBvZiBnaXZlbiBmbGFncy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBmbGFncyB0aGUgb3JkZXJlZCBzZXQgb2YgZmxhZ3MuCisgICAgICogXHBhcmFtIG1pbiBtaW5pbXVtIHNldCBvZiBmbGFncyB0byBiZSBzZXQuCisgICAgICovCisgICAgc3RhdGljIGlubGluZSBDMlN1cHBvcnRlZEZsYWdzPFQ+IEZsYWdzKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICZmbGFncywgVCBtaW4gPSBUKDApKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZEZsYWdzKG1pbiwgZmxhZ3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBmbGFnIHNldCBmcm9tIGEgZ2VuZXJpYyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIG9iamVjdC4gVGhpcyB3aWxsIGJlIGFuIGVtcHR5CisgICAgICogc2V0IGlmIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGFyZSBub3Qgb2YgRkxBR1MgdHlwZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZXMgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgb2JqZWN0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRGbGFnczxUPihjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWx1ZXMpIHsKKyAgICAgICAgaWYgKHZhbHVlcy50eXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OkZMQUdTKSB7CisgICAgICAgICAgICBfbVZhbHVlcy5pbnNlcnQoX21WYWx1ZXMuZW5kKCksIHZhbHVlcy52YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLnZhbHVlcy5lbmQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzZXQgaXMgZW1wdHkuCisgICAgICovCisgICAgY29uc3RleHByIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tVmFsdWVzLmVtcHR5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIGEgdmFsdWUgaXMgcGFydCBvZiB0aGlzIHNldC4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gY2hlY2suCisgICAgICovCisgICAgYm9vbCBjb250YWlucyhUIHZhbHVlKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcgZmxhZyBzZXQgdGhhdCBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoaXMgc2V0IGFuZCBhbm90aGVyLgorICAgICAqCisgICAgICogXHBhcmFtIGxpbWl0IHRoZSBvdGhlciB2YWx1ZSBzZXQKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZEZsYWdzPFQ+IGxpbWl0ZWRUbyhjb25zdCBDMlN1cHBvcnRlZEZsYWdzPFQ+ICZsaW1pdCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyB0aGlzIG9iamVjdCB0byBhIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgb2JqZWN0LgorICAgICAqLworICAgIG9wZXJhdG9yIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKCFpc0VtcHR5KCkgLyogZmxhZ3MgKi8sIF9tVmFsdWVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBvcmRlcmVkIHNldCBvZiBmbGFncyBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxUPiBmbGFncygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWluaW11bSBzZXQgb2YgZmxhZ3MgZm9yIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIFQgbWluKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgdGhpcyBzdXBwb3J0ZWQgdmFsdWUgc2V0LgorICAgICAqLworICAgIGlubGluZSB2b2lkIGNsZWFyKCkgeworICAgICAgICBfbVZhbHVlcy5jbGVhcigpOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgZmxhZyBzZXQgZGlyZWN0bHkgZnJvbSBhbiBpbnRlcm5hbCByZXByZXNlbnRhdGlvbi4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZXMgYSB2ZWN0b3IgY29udGFpbmluZyB0aGUgbWluaW11bSBmbGFnIHNldCBmb2xsb3dlZCBieSB0aGUgc2V0IG9mIGZsYWdzCisgICAgICovCisgICAgQzJTdXBwb3J0ZWRGbGFncyhzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+ICYmdmFsdWVzKQorICAgICAgICA6IF9tVmFsdWVzKHZhbHVlcykgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBmbGFnIHNldCBmcm9tIGEgc2V0IG9mIGZsYWdzIGFuZCBhIG1pbmltdW0gZmxhZyBzZXQuCisgICAgICoKKyAgICAgKiBccGFyYW0gZmxhZ3MgdGhlIHNldAorICAgICAqLworICAgIEMyU3VwcG9ydGVkRmxhZ3MoVCBtaW4sIGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICZmbGFncykgeworICAgICAgICBfbVZhbHVlcy5lbXBsYWNlX2JhY2sobWluKTsKKyAgICAgICAgZm9yIChUIGVsZW0gOiBmbGFncykgeworICAgICAgICAgICAgX21WYWx1ZXMuZW1wbGFjZV9iYWNrKGVsZW0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGZsYWcgc2V0IGZyb20gYSBzZXQgb2YgaW5pdGlhbGl6ZXIgbGlzdCB2YWx1ZXMgYW5kIGEgbWluaW11bSBmbGFnIHNldAorICAgICAqCisgICAgICogXHBhcmFtIGZsYWdzIHRoZSBzZXQKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZEZsYWdzKFQgbWluLCBjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gZmxhZ3MpIHsKKyAgICAgICAgX21WYWx1ZXMuZW1wbGFjZV9iYWNrKG1pbik7CisgICAgICAgIGZvciAoVCBlbGVtIDogZmxhZ3MpIHsKKyAgICAgICAgICAgIF9tVmFsdWVzLmVtcGxhY2VfYmFjayhlbGVtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPEMyVmFsdWU6OlByaW1pdGl2ZT4gX21WYWx1ZXM7IC8vLzwgdGhlIG1pbmltdW0gZmxhZyBzZXQgZm9sbG93ZWQgYnkgdGhlIHNldCBvZiBmbGFncworfTsKKworLyoqCisgKiBPcmRlcmVkIHN1cHBvcnRlZCB2YWx1ZSBzZXQgZm9yIGEgZmllbGQgb2YgYSBnaXZlbiB0eXBlLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQzJTdXBwb3J0ZWRWYWx1ZVNldCB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQzJGaWVsZFZhbHVlSGVscGVyPFQ+OjpWYWx1ZVR5cGUgVmFsdWVUeXBlOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBlbXB0eSB2YWx1ZSBzZXQuCisgICAgICoKKyAgICAgKiBcbm90ZSBUaGlzIGlzIGEgc3BlY2lhbGl6YXRlZCBzdXBwb3J0ZWQgcmFuZ2UgcmVwcmVzZW50YXRpb24gdGhhdCBpcyBvbmx5IHVzZWQgZm9yCisgICAgICogdGhpcyBvYmplY3QgLSBpdCBpcyBlcXVpdmFsZW50IHRvIHRoZSBFTVBUWSB0eXBlIGluIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMuCisgICAgICovCisgICAgc3RhdGljIGlubGluZSBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+IE5vbmUoKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFZhbHVlU2V0KHsgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHZhbHVlIHNldCBvZiBnaXZlbiB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWVzIHRoZSBvcmRlcmVkIHNldCBvZiB2YWx1ZXMgYXMgYW4gaW5pdGlhbGl6ZXIgbGlzdC4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW5saW5lIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gT25lT2YoY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IHZhbHVlcykgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRWYWx1ZVNldCh2YWx1ZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSB2YWx1ZSBzZXQgb2YgZ2l2ZW4gdmFsdWVzLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlcyB0aGUgb3JkZXJlZCBzZXQgb2YgdmFsdWVzLgorICAgICAqLworICAgIHN0YXRpYyBpbmxpbmUgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiBPbmVPZihjb25zdCBzdGQ6OnZlY3RvcjxUPiAmdmFsdWVzKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFZhbHVlU2V0KHZhbHVlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHZhbHVlIHNldCBmcm9tIGEgZ2VuZXJpYyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIG9iamVjdC4gVGhpcyB3aWxsIGJlIGFuIGVtcHR5CisgICAgICogc2V0IGlmIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGFyZSBub3Qgb2YgVkFMVUVTIHR5cGUuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWVzIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIG9iamVjdAorICAgICAqLworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4oY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsdWVzKSB7CisgICAgICAgIGlmICh2YWx1ZXMudHlwZSA9PSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpWQUxVRVMpIHsKKyAgICAgICAgICAgIF9tVmFsdWVzLmluc2VydChfbVZhbHVlcy5lbmQoKSwgdmFsdWVzLnZhbHVlcy5iZWdpbigpLCB2YWx1ZXMudmFsdWVzLmVuZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHJhbmdlIGlzIGVtcHR5LgorICAgICAqLworICAgIGNvbnN0ZXhwciBib29sIGlzRW1wdHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbVZhbHVlcy5lbXB0eSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBhIHZhbHVlIGlzIHBhcnQgb2YgdGhpcyBzZXQuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGNoZWNrLgorICAgICAqLworICAgIGJvb2wgY29udGFpbnMoVCB2YWx1ZSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IHZhbHVlIHNldCB0aGF0IGlzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhpcyBzZXQgYW5kIGFub3RoZXIuCisgICAgICoKKyAgICAgKiBccGFyYW0gbGltaXQgdGhlIG90aGVyIHZhbHVlIHNldAorICAgICAqLworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gbGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gJmxpbWl0KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcgdmFsdWUgc2V0IHRoYXQgaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIHNldCBhbmQgYSB2YWx1ZSByYW5nZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBsaW1pdCB0aGUgb3RoZXIgcmFuZ2UKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+IGxpbWl0ZWRUbyhjb25zdCBDMlN1cHBvcnRlZFJhbmdlPFQ+ICZsaW1pdCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IHZhbHVlIHNldCB0aGF0IGlzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhpcyBzZXQgYW5kIGEgZmxhZyBzZXQuCisgICAgICoKKyAgICAgKiBccGFyYW0gbGltaXQgdGhlIG90aGVyIGZsYWcgc2V0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiBsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxUPiAmbGltaXQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIG9iamVjdC4KKyAgICAgKi8KKyAgICBvcGVyYXRvciBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhmYWxzZSAvKiBmbGFncyAqLywgX21WYWx1ZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG9yZGVyZWQgc2V0IG9mIHZhbHVlcyBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxUPiB2YWx1ZXMoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIENsZWFycyB0aGlzIHN1cHBvcnRlZCB2YWx1ZSBzZXQuCisgICAgICovCisgICAgaW5saW5lIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIF9tVmFsdWVzLmNsZWFyKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSB2YWx1ZSBzZXQgZnJvbSBhIHNldCBvZiBDMlZhbHVlOjpQcmltaXRpdmUgdmFsdWVzLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlcyB0aGUgc2V0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRWYWx1ZVNldChzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+ICYmdmFsdWVzKQorICAgICAgICA6IF9tVmFsdWVzKHZhbHVlcykgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSB2YWx1ZSBzZXQgZnJvbSBhIHNldCBvZiB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWVzIHRoZSBzZXQKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0KGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICZ2YWx1ZXMpIHsKKyAgICAgICAgZm9yIChUIGVsZW0gOiB2YWx1ZXMpIHsKKyAgICAgICAgICAgIF9tVmFsdWVzLmVtcGxhY2VfYmFjayhlbGVtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSB2YWx1ZSBzZXQgZnJvbSBhIHNldCBvZiBpbml0aWFsaXplciBsaXN0IHZhbHVlcworICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlcyB0aGUgc2V0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRWYWx1ZVNldChjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gdmFsdWVzKSB7CisgICAgICAgIGZvciAoVCBlbGVtIDogdmFsdWVzKSB7CisgICAgICAgICAgICBfbVZhbHVlcy5lbXBsYWNlX2JhY2soZWxlbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+IF9tVmFsdWVzOyAvLy88IHRoZSBzdXBwb3J0ZWQgc2V0IG9mIHZhbHVlcworfTsKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdG8gaGFuZGxlIEMyRmllbGRTdXBwb3J0ZVZhbHVlcyBvYmplY3QgZm9yIGZpZWxkcyBvZiB2YXJpb3VzIHR5cGVzLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjsKKworLy8gdGVtcGxhdGVkIG9wZXJhdG9yIG11c3QgYmUgcHJlZGVjbGFyZWQgZm9yIGZyaWVuZCBkZWNsYXJhdGlvbgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+ICZpKTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBoZWxwZXIgZm9yIGEgc3BlY2lmaWMgdHlwZSBmcm9tIGEgZ2VuZXJpYyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIHN0cnVjdC4KKyAgICAgKi8KKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbHVlcyk7CisKKyAgICAvLyBUUklDS1k6IG5lZWRlZCBmb3Igc3RkOjp1bmlxdWVfcHRyPEltcGw+IGRlY2xhcmF0aW9uCisgICAgfkMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXIoKTsKKworICAgIC8vIHN1cHBvcnQgY29weSBjb25zdHJ1Y3Rvci9vcGVyYXRvcgorICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXIoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlciAmKTsKKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyJiBvcGVyYXRvcj0oY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlciAmKTsKKworICAgIGJvb2wgc3VwcG9ydHMoVCB2YWx1ZSkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgLy8gdXNlIHBpbXBsIGFzIGltcGxlbWVudGF0aW9uIG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZQorICAgIHN0cnVjdCBJbXBsOworICAgIHN0ZDo6dW5pcXVlX3B0cjxJbXBsPiBfbUltcGw7CisKKyAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8IDxUPihzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+ICZpKTsKKyAgICAvL2ZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlciAmaSk7Cit9OworCisvKioKKyAqIEJ1aWxkZXIgZm9yIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIGEgZmllbGQgb2YgYSBnaXZlbiB0eXBlLgorICoKKyAqIFRoaXMgYnVpbGRlciBjYW4gYmUgdXNlZCB0byBzdWNjZXNzaXZlbHkgcmVzdHJpY3QgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIGEgZmllbGQuIFVwb24KKyAqIGNyZWF0aW9uLCB0aGVyZSBhcmUgbm8gc3VwcG9ydGVkIHZhbHVlcyBzcGVjaWZpZWQgLSB3aGljaCBmb3IgdGhpcyBidWlsZGVyIG1lYW5zIHRoYXQgYWxsCisgKiB2YWx1ZXMgYXJlIHN1cHBvcnRlZC4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBidWlsZGVyIHdpdGggbm8gZGVmaW5lZCB2YWx1ZXMgLSBidXQgaW1wbGljaXRseSBhbnkgdmFsdWUgYWxsb3dlZC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyKGNvbnN0IEMyUGFyYW1GaWVsZCAmZmllbGQpOworCisgICAgLyoqCisgICAgICogR2V0IEMyUGFyYW1GaWVsZFZhbHVlcyBmcm9tIHRoaXMgYnVpbGRlci4KKyAgICAgKi8KKyAgICBvcGVyYXRvciBDMlBhcmFtRmllbGRWYWx1ZXMoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIERlZmluZSB0aGUgc3VwcG9ydGVkIHZhbHVlcyBhcyB0aGUgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgb2YgdGhpcyBidWlsZGVyLgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmFueSgpOworCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gbm9uZS4KKyAgICAgKgorICAgICAqIFxub3RlIFRoaXMgcmVhbGx5IHNob3VsZCBub3QgYmUgdXNlZCBmcm9tIHRoZSBidWlsZGVyIGFzIGFsbCBwYXJhbXMgbXVzdCBoYXZlIHN1cHBvcnRlZAorICAgICAqICAgICAgIHZhbHVlcywgYnV0IGlzIGhlcmUgaW4gY2FzZSB0aGlzIGlzIHJlYWxseSB0aGUgY2FzZS4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZub25lKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB8dmFsdWV8IGFsb25lLgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmVxdWFsVG8oVCB2YWx1ZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgZ3JlYXRlciB0aGFuIHx2YWx1ZXwuCisgICAgICovCisgICAgaW5saW5lIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmdyZWF0ZXJUaGFuKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRSYW5nZTxUPjo6R3JlYXRlclRoYW4odmFsdWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHx2YWx1ZXwuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmZ3JlYXRlclRoYW5PckVxdWFsVG8oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFJhbmdlPFQ+OjpHcmVhdGVyVGhhbk9yRXF1YWxUbyh2YWx1ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gfHZhbHVlfC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZub3RMZXNzVGhhbihUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkUmFuZ2U8VD46Ok5vdExlc3NUaGFuKHZhbHVlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB8dmFsdWV8LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmxlc3NUaGFuT3JFcXVhbFRvKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRSYW5nZTxUPjo6TGVzc1RoYW5PckVxdWFsVG8odmFsdWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHx2YWx1ZXwuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmbm90R3JlYXRlclRoYW4oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFJhbmdlPFQ+OjpOb3RHcmVhdGVyVGhhbih2YWx1ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBsZXNzIHRoYW4gfHZhbHVlfC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZsZXNzVGhhbihUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkUmFuZ2U8VD46Okxlc3NUaGFuKHZhbHVlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGluIHRoZSByYW5nZSBvZiBbIHxtaW58LCB8bWF4fCBdCisgICAgICogd2l0aCBvcHRpb25hbCB8c3RlcHwuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmaW5SYW5nZSgKKyAgICAgICAgICAgIFQgbWluLCBUIG1heCwgVCBzdGVwID0gc3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWUgPyBUKDApIDogVCgxKSkgIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRSYW5nZTxUPjo6SW5SYW5nZShtaW4sIG1heCwgc3RlcCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBpbiB0aGUgZ2VvbWV0cmljIHNlcmllcyBzdGFydGluZworICAgICAqIGZyb20gfG1pbnwgd2l0aCBmYWN0b3IgfG51bXwgLyB8ZGVub218LCBub3QgZ3JlYXRlciB0aGFuIHxtYXh8LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmluU2VyaWVzKFQgbWluLCBUIG1heCwgVCBudW0sIFQgZGVub20pIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRSYW5nZTxUPjo6SW5TZXJpZXMobWluLCBtYXgsIG51bSwgZGVub20pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgaW4gdGhlIG11bHRpcGx5LWFjY3VtdWxhdGUgc2VyaWVzCisgICAgICogc3RhcnRpbmcgZnJvbSB8bWlufCB3aXRoIGZhY3RvciB8bnVtfCAvIHxkZW5vbXwgYW5kIHxzdGVwfCwgbm90IGdyZWF0ZXIgdGhhbiB8bWF4fC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZpbk1hY1NlcmllcyhUIG1pbiwgVCBtYXgsIFQgc3RlcCwgVCBudW0sIFQgZGVub20pIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRSYW5nZTxUPjo6SW5NYWNTZXJpZXMobWluLCBtYXgsIHN0ZXAsIG51bSwgZGVub20pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgaW4gfHZhbHVlc3wuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmb25lT2YoY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IHZhbHVlcykgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+OjpPbmVPZih2YWx1ZXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgaW4gfHZhbHVlc3wuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmb25lT2YoY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJnZhbHVlcykgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+OjpPbmVPZih2YWx1ZXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byBmbGFncyBpbiB8ZmxhZ3N8IHdpdGggYXQgbGVhc3QgfG1pbnwKKyAgICAgKiBzZXQuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmZmxhZ3MoY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJmZsYWdzLCBUIG1pbiA9IFQoMCkpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRGbGFnczxUPjo6RmxhZ3MoZmxhZ3MsIG1pbikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIGZsYWdzIGluIHx2YWx1ZXN8IHdpdGggYXQgbGVhc3QgfG1pbnwKKyAgICAgKiBzZXQuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmZmxhZ3MoY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IGZsYWdzLCBUIG1pbiA9IFQoMCkpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRGbGFnczxUPjo6RmxhZ3MoZmxhZ3MsIG1pbikpOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIoKTsKKworICAgIC8vIHN1cHBvcnQgY29weSBjb25zdHJ1Y3Rvci9vcGVyYXRvcgorICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIoY29uc3QgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlciAmKTsKKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyJiBvcGVyYXRvcj0oY29uc3QgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlciAmKTsKKworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byBhIHZhbHVlIHNldC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZsaW1pdFRvKGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gJmxpbWl0KTsKKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIGEgdmFsdWUgc2V0LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmxpbWl0VG8oY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxUPiAmbGltaXQpOworCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gYSByYW5nZS4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZsaW1pdFRvKGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8VD4gJmxpbWl0KTsKKworICAgIHN0cnVjdCBJbXBsOworICAgIHN0ZDo6dW5pcXVlX3B0cjxJbXBsPiBfbUltcGw7Cit9OworCisvKioKKyAqIEJ1aWxkZXIgZm9yIGEgbGlzdCBvZiBzZXR0aW5nIGNvbmZsaWN0cy4KKyAqLworY2xhc3MgQzJTZXR0aW5nQ29uZmxpY3RzQnVpbGRlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBlbXB0eSBsaXN0IG9mIHNldHRpbmcgY29uZmxpY3RzLgorICAgICAqLworICAgIEMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXIoKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBsaXN0IGNvbnRhaW5pbmcgYSBzaW5nbGUgc2V0dGluZyBjb25mbGljdC4KKyAgICAgKi8KKyAgICBDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyKEMyUGFyYW1GaWVsZFZhbHVlcyAmJmNvbmZsaWN0KTsKKworICAgIC8qKgorICAgICAqIEFkZHMgYSBjb25mbGljdCB0byB0aGUgY3VycmVudCBsaXN0IG9mIGNvbmZsaWN0cyBhbmQgcmV0dXJucyB0aGlzCisgICAgICovCisgICAgQzJTZXR0aW5nQ29uZmxpY3RzQnVpbGRlciYgd2l0aChDMlBhcmFtRmllbGRWYWx1ZXMgJiZjb25mbGljdCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGxpc3Qgb2YgY29uZmxpY3RzIChhbmQgbW92ZXMgdGhlbSBvdXQgb2YgdGhpcyBidWlsZGVyLikKKyAgICAgKiAodGhpcyBpcyB3aHkgaXQgaXMgbm90IGNvbnN0KQorICAgICAqLworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW1GaWVsZFZhbHVlcz4gcmV0cmlldmVDb25mbGljdHMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBsaXN0IGlzIGVtcHR5LgorICAgICAqLworICAgIGlubGluZSBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gX21Db25mbGljdHMuZW1wdHkoKTsgfQorCisgICAgaW5saW5lIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBlbXB0eSgpOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbUZpZWxkVmFsdWVzPiBfbUNvbmZsaWN0czsKK307CisKKy8qKgorICogU2V0dGluZyByZXN1bHQgYnVpbGRlciBmb3IgYSBwYXJhbWV0ZXIuCisgKi8KK3N0cnVjdCBDMlNldHRpbmdSZXN1bHRCdWlsZGVyIHsKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgcmVhZC1vbmx5IHNldHRpbmcgcmVzdWx0IGZhaWx1cmUuCisgICAgICoKKyAgICAgKiBUaGlzIGRvZXMgbm90IHRha2UgRlNWIGFzIG9ubHkgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGZpZWxkIGlzIHN1cHBvcnRlZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgQzJTZXR0aW5nUmVzdWx0IFJlYWRPbmx5KGNvbnN0IEMyUGFyYW1GaWVsZCAmcGFyYW0pOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJhZC12YWx1ZSBvciBpbmZvaW5mb3JtYXRpb25hbCBiYWQtdmFsdWUgc2V0dGluZyByZXN1bHQgZmFpbHVyZS4KKyAgICAgKgorICAgICAqIFRoaXMgZG9lcyBub3QgdGFrZSBGU1YgYXMgdGhlIHZhbHVlIGlzIG91dHNpZGUgb2YgdGhlIHBvc3NpYmxlIHZhbHVlcy4gQXMgc3VjaCwgdGhlcmUgYXJlIG5vCisgICAgICogY29uZmxpY3RzIGZvciB0aGlzIGNhc2UgZWl0aGVyLgorICAgICAqLworICAgIHN0YXRpYyBDMlNldHRpbmdSZXN1bHQgQmFkVmFsdWUoY29uc3QgQzJQYXJhbUZpZWxkICZwYXJhbUZpZWxkLCBib29sIGlzSW5mbyA9IGZhbHNlKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBjb25mbGljdCAob3IgaW5mb3JtYXRpb25hbCBjb25mbGljdCkgc2V0dGluZyByZXN1bHQgZmFpbHVyZS4KKyAgICAgKgorICAgICAqIFRoaXMgdGFrZXMgRlNWIHNvIHVzZSBwYXJhbUZpZWxkVmFsdWVzIGFuZCBvcHRpb25hbCBjb25mbGljdHMuCisgICAgICovCisgICAgc3RhdGljIEMyU2V0dGluZ1Jlc3VsdCBDb25mbGljdCgKKyAgICAgICAgICAgIEMyUGFyYW1GaWVsZFZhbHVlcyAmJnBhcmFtRmllbGRWYWx1ZXMsIEMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXIgJmNvbmZsaWN0cywKKyAgICAgICAgICAgIGJvb2wgaXNJbmZvID0gZmFsc2UpOworCisgICAgLy8gVE9ETzogcmV0cmlldmUgcmVzdWx0cworCisKK3ByaXZhdGU6CisgICAgQzJQYXJhbUZpZWxkIF9tUGFyYW1GaWVsZDsKKyAgICBDMlNldHRpbmdSZXN1bHQgX21SZXN1bHQ7CisKKyAgICBDMlNldHRpbmdSZXN1bHRCdWlsZGVyKGNvbnN0IEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXIgJikgPSBkZWxldGU7Cit9OworCisvKioKKyAqIFNldHRpbmcgcmVzdWx0cyAoUExVUkFMKSBidWlsZGVyLgorICoKKyAqIFNldHRpbmcgcmVzdWx0cyBjb250YWluIGEgZmFpbHVyZSBzdGF0dXMgYWxvbmcgd2l0aCBhIGxpc3Qgb2YgZmFpbGluZyBmaWVsZHMgb3IgcGFyYW1zLgorICovCitzdHJ1Y3QgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIgeworICAgIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKGNvbnN0IEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyJikgPSBkZWxldGU7CisgICAgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXImJikgPSBkZWZhdWx0OworICAgIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyICZvcGVyYXRvcj0oQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXImJikgPSBkZWZhdWx0OworCisgICAgLyoqIFxyZXR1cm5zIChkZWZhdWx0KSBzdWNjZXNzZnVsIHJlc3VsdCB3aXRoIG5vIGRldGFpbHMuICovCisgICAgaW5saW5lIHN0YXRpYyBDMlNldHRpbmdSZXN1bHRzQnVpbGRlciBPaygpIHsKKyAgICAgICAgcmV0dXJuIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKEMyX09LKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgSW50ZXJmYWNlIGlzIGluIGJhZCBzdGF0ZSwgd2l0aCBubyBmdXJ0aGVyIGRldGFpbHMuICovCisgICAgaW5saW5lIHN0YXRpYyBDMlNldHRpbmdSZXN1bHRzQnVpbGRlciBCYWRTdGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKEMyX0JBRF9TVEFURSk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIEludGVyZmFjZSBjb25uZWN0aW9uIHRpbWVkIG91dCwgd2l0aCBubyBmdXJ0aGVyIGRldGFpbHMuICovCisgICAgaW5saW5lIHN0YXRpYyBDMlNldHRpbmdSZXN1bHRzQnVpbGRlciBUaW1lZE91dCgpIHsKKyAgICAgICAgcmV0dXJuIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKEMyX1RJTUVEX09VVCk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIEludGVyZmFjZSBjb25uZWN0aW9uIGlzIGNvcnJ1cHRlZCwgd2l0aCBubyBmdXJ0aGVyIGRldGFpbHMuICovCisgICAgaW5saW5lIHN0YXRpYyBDMlNldHRpbmdSZXN1bHRzQnVpbGRlciBDb3JydXB0ZWQoKSB7CisgICAgICAgIHJldHVybiBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcihDMl9DT1JSVVBURUQpOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIgTm9NZW1vcnkoQzJQYXJhbTo6SW5kZXggaW5kZXhfIF9fdW51c2VkKSB7CisgICAgICAgIC8vIFRPRE86IHRyeSB0byBhZGQgZmFpbHVyZSByZXN1bHQKKyAgICAgICAgcmV0dXJuIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKEMyX05PX01FTU9SWSk7CisgICAgfQorCisgICAgLy8gVE9ETzogdGhpcyBzaG91bGQgbm90IGJlIGEgY29uc3RydWN0b3IKKyAgICAvKiogQ3JlYXRlcyBhIGJ1aWxkZXIgd2l0aCBhIHNpbmdsZSBiYWQgdmFsdWUgc2V0dGluZyByZXN1bHQuICovCisgICAgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoQzJTZXR0aW5nUmVzdWx0ICYmcmVzdWx0KTsKKworICAgIC8qKiBDb21iaW5lcyB0aGlzIHJlc3VsdHMgd2l0aCBvdGhlciByZXN1bHRzLiAqLworICAgIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyIHBsdXMoQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXImJiByZXN1bHRzKTsKKworICAgIC8qKiBSZXRyaWV2ZSAoZ2V0IGFuZCBtb3ZlIG91dCkgZmFpbHVyZXMgYW5kIHJldHVybiB0aGUgZmFpbHVyZSBzdGF0dXMuICovCisgICAgYzJfc3RhdHVzX3QgcmV0cmlldmVGYWlsdXJlcyhzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKTsKKworcHJpdmF0ZToKKyAgICAvKiogU2V0dGluZyByZXN1bHRzIGJhc2VkIG9uIGEgc2luZ2xlIHN0YXR1cy4gVGhpcyBpcyB1c2VkIHdoZW4gYWN0dWFsIHNldHRpbmcgY291bGQgbm90IGJlCisgICAgICogIGF0dGVtcHRlZCB0byBnZXQgYSBzaW5nbGUgQzJTZXR0aW5nUmVzdWx0LCBvciB3aGVuIGEgc2V0dGluZyBzdWNjZWVkZWQgd2l0aG91dAorICAgICAqICAnY29tcGxhaW50cycuICovCisgICAgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoYzJfc3RhdHVzX3Qgc3RhdHVzKTsKKyAgICAgICAgLy8gc3RhdHVzIG11c3QgYmUgb25lIG9mIE9LLCBCQURfU1RBVEUsIFRJTUVEX09VVCwgQ09SUlVQVEVEIG9yIE5PX01FTU9SWQorICAgICAgICAvLyBtYWlubHk6IEJMT0NLSU5HLCBCQURfSU5ERVgsIEJBRF9WQUxVRSBhbmQgTk9fTUVNT1JZIHJlcXVpcmVzIGEgc2V0dGluZyBhdHRlbXB0LCBidXQKKyAgICAgICAgLy8gTk9fTUVNT1JZIG1heSBub3QgYWxsb3cgdXMgdG8gY3JlYXRlIGEgcmVzdWx0cyBzdHJ1Y3R1cmUuCisKKyAgICAvKioKKyAgICAgKiBPbmUgb2YgT0ssIEJBRF9JTkRFWCwgQkFEX1ZBTFVFLCBCQURfU1RBVEUsIE5PX01FTU9SWSwgVElNRURfT1VULCBCTE9DS0lORyBvciBDT1JSVVBURUQuCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgX21TdGF0dXMgX191bnVzZWQ7CisKKyAgICAvKioKKyAgICAgKiBWZWN0b3Igb2YgaW5kaXZpZHVhbCBzZXR0aW5nIHJlc3VsdCBkZXRhaWxzLgorICAgICAqLworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBfbVJlc3VsdHM7Cit9OworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdG8gZW51bWVyYXRlIGZpZWxkcyBvZiBwYXJhbWV0ZXJzLgorICovCitzdHJ1Y3QgQzJGaWVsZFV0aWxzIHsKKyAgICBzdHJ1Y3QgX0luc3BlY3RvcjsKKworICAgIC8qKgorICAgICAqIEFuIGV4dGVuZGVkIGZpZWxkIGRlc2NyaXB0b3Igb2JqZWN0IHdpdGggc3RydWN0dXJhbCBpbmZvcm1hdGlvbiAobGluZWFnZSBiYWNrIHRvIHRoZSByb290IG9mCisgICAgICogdGhlIHBhcmFtKS4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgSW5mbyB7CisgICAgICAgIHR5cGVkZWYgQzJGaWVsZERlc2NyaXB0b3I6OnR5cGVfdCB0eXBlX3Q7IC8vLzwgZmllbGQgdHlwZQorICAgICAgICB0eXBlZGVmIEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgTmFtZWRWYWx1ZXNUeXBlOyAvLy88IG5hbWVkIHZhbHVlcyBsaXN0IHR5cGUKKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZmllbGQKKyAgICAgICAgQzJTdHJpbmcgbmFtZSgpIGNvbnN0OworCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSB0eXBlIG9mIHRoaXMgZmllbGQKKyAgICAgICAgdHlwZV90IHR5cGUoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgZGVmaW5lZCBuYW1lLXZhbHVlIHBhaXJpbmdzIGZvciB0aGlzIGZpZWxkLiBUaGUgcmV0dXJuZWQgcmVmZXJlbmNlIGlzCisgICAgICAgICAqIG9ubHkgdmFsaWQgZHVyaW5nIHRoZSB2YWxpZGl0eSBvZiB0aGlzIG9iamVjdAorICAgICAgICAgKi8KKyAgICAgICAgY29uc3QgTmFtZWRWYWx1ZXNUeXBlICZuYW1lZFZhbHVlcygpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgaW5kZXggb2YgdGhpcyBmaWVsZC4gRS5nLiBwYXJhbS5maWVsZCBvciBwYXJhbS5maWVsZFswXSBoYXMgYW4gaW5kZXggb2YgMCwgYW5kCisgICAgICAgICAqIHBhcmFtLnN0cnVjdFsyXS5maWVsZFszXSBoYXMgYW4gaW5kZXggb2YgMy4KKyAgICAgICAgICovCisgICAgICAgIHNpemVfdCBpbmRleCgpIGNvbnN0OworCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGZpZWxkIGluIGNhc2UgaXQgaXMgYW4gYXJyYXkuIFJldHVybnMgMCBmb3IKKyAgICAgICAgLy8vIFRbXSBhcnJheXMgaWYgdGhpcyBpbmZvIGNvbWVzIGZyb20gYSBDMlBhcmFtOjpJbmRleCBvYmplY3QsIGFuZCB0aGUgY3VycmVudGx5IHVzZWQKKyAgICAgICAgLy8vIGV4dGVudCBpZiBpdCBjb21lcyBmcm9tIGEgQzJQYXJhbSBvYmplY3QuIFJldHVybnMgMSBmb3IgVFsxXSBhcnJheXMgYXMgd2VsbCBhcyBpZiB0aGUKKyAgICAgICAgLy8vIGZpZWxkIGlzIG5vdCBhbiBhcnJheS4KKyAgICAgICAgc2l6ZV90IGV4dGVudCgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgKHN0cnVjdHVyYWwpIGRlcHRoIG9mIHRoaXMgZmllbGQuIEUuZy4gcGFyYW0uZmllbGQgb3IgcGFyYW0uZmllbGRbMF0gaGFzIGEgZGVwdGggb2YKKyAgICAgICAgICogIDAsIGFuZCBwYXJhbS5zdHJ1Y3QuZmllbGQgb3IgcGFyYW0uc3RydWN0WzBdLmZpZWxkWzBdIGhhcyBhIGRlcHRoIG9mIDEuCisgICAgICAgICAqLworICAgICAgICBzaXplX3QgZGVwdGgoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoaXMgZmllbGQgaW4gdGhlIHBhcmFtZXRlciBpbiBieXRlcy4KKyAgICAgICAgICovCisgICAgICAgIHNpemVfdCBvZmZzZXQoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGlzIGZpZWxkIGluIGJ5dGVzLgorICAgICAgICAgKi8KKyAgICAgICAgc2l6ZV90IHNpemUoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG9mZnNldCBvZiB0aGlzIGZpZWxkJ3MgYXJyYXkuIEUuZy4gZm9yIHBhcmFtLnN0cnVjdFsyXS5maWVsZFszXSB0aGlzIGlzIHRoZSBvZmZzZXQKKyAgICAgICAgICogb2YgaXRzIHNtYWxsZXN0IHNpYmxpbmc6IHBhcmFtLnN0cnVjdFsyXS5maWVsZFswXS4KKyAgICAgICAgICovCisgICAgICAgIHNpemVfdCBhcnJheU9mZnNldCgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoaXMgZmllbGQncyBhcnJheS4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIGV4dGVudCgpICogc2l6ZSgpCisgICAgICAgICAqLworICAgICAgICBzaXplX3QgYXJyYXlTaXplKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBvZmZzZXQgb2YgdGhlIGJhc2UgZmllbGQuIFRoZSBiYXNlIGZpZWxkIGlzIGEgY291c2luIG9mIHRoZSBjdXJyZW50IGZpZWxkIHdoZXJlCisgICAgICAgICAqIGFsbCBpbmRpY2VzIGFyZSAwLiBFLmcuIHRoZSB0aGUgYmFzZSBmaWVsZCBmb3IgcGFyYW0uc3RydWN0WzJdLmZpZWxkWzNdIGlzCisgICAgICAgICAqIHBhcmFtLnN0cnVjdFswXS5maWVsZFswXS4gQmFzZSBmaWVsZHMgYXJlIHVzZWQgdG8gc3BlY2lmeSBzdXBwb3J0ZWQgdmFsdWVzIGZvcgorICAgICAgICAgKiBhbGwgY291c2luIGZpZWxkcy4KKyAgICAgICAgICovCisgICAgICAgIHNpemVfdCBiYXNlRmllbGRPZmZzZXQoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmllbGQgaXMgYW4gYXJpdGhtZXRpYyAoaW50ZWdyYWwsIGNvdW50ZXIgb3IgZmxvYXQpIGZpZWxkLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBpc0FyaXRobWV0aWMoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmllbGQgY2FuIGhhdmUgYSBmbGV4aWJsZSBleHRlbnQuIGV4dGVudCgpIHJldHVybnMgdGhlIGN1cnJlbnQKKyAgICAgICAgICogZXh0ZW50LgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBpc0ZsZXhpYmxlKCkgY29uc3Q7CisKKyAgICAgICAgLy8vIHJldHVybnMgd2hldGhlciB0aGlzIGluZm8gaXMgdmFsaWQKKyAgICAgICAgaW5saW5lIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIF9tSW1wbCAhPSBudWxscHRyOyB9CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIGluZm8gZm9yIHRoZSBwYXJlbnQgb2YgdGhpcyBmaWVsZCwgb3IgYW4gaW52YWxpZCBJbmZvIG9iamVjdCBpZiBpdCBoYXMgbm8KKyAgICAgICAgLy8vIHBhcmVudHMKKyAgICAgICAgSW5mbyBwYXJlbnQoKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyB3aGV0aGVyIHRoaXMgaW5mbyBpcyB2YWxpZAorICAgICAgICBpbmxpbmUgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIGlzVmFsaWQoKTsgfQorCisgICAgICAgIHN0cnVjdCBJbXBsOworICAgICAgICBJbmZvKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPik7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gX21JbXBsOworICAgICAgICBmcmllbmQgc3RydWN0IF9JbnNwZWN0b3I7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEFuIChpbnB1dCkgaXRlcmF0b3Igb2JqZWN0IG92ZXIgZmllbGRzIHVzaW5nIEluZm8gb2JqZWN0cy4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgSXRlcmF0b3IgeworICAgICAgICB0eXBlZGVmIEluZm8gY29uc3QgdmFsdWVfdHlwZTsKKyAgICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOworICAgICAgICB0eXBlZGVmIEluZm8gY29uc3QgKiBwb2ludGVyOworICAgICAgICB0eXBlZGVmIEluZm8gY29uc3QgcmVmZXJlbmNlOworICAgICAgICB0eXBlZGVmIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworCisgICAgICAgIC8vLyByZXR1cm4gSW5mbyBhdCBjdXJyZW50IHBvc2l0aW9uCisgICAgICAgIHZpcnR1YWwgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0OworCisgICAgICAgIC8vLyBtb3ZlIHRvIHRoZSBuZXh0IGZpZWxkCisgICAgICAgIHZpcnR1YWwgSXRlcmF0b3ImIG9wZXJhdG9yKysoKTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJdGVyYXRvciAmKSBjb25zdDsKKyAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBJdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvcj09KG90aGVyKTsgfQorCisgICAgICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkgPSBkZWZhdWx0OworCisgICAgICAgIHN0cnVjdCBJbXBsOworICAgICAgICBJdGVyYXRvcihzdGQ6OnNoYXJlZF9wdHI8SW1wbD4pOworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEFuIChpbnB1dCkgaXRlcmFibGUgb2JqZWN0IHJlcHJlc2VudGluZyBhIGxpc3Qgb2YgZmllbGRzLgorICAgICAqLworICAgIHN0cnVjdCBMaXN0IHsKKyAgICAgICAgLy8vIHJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdAorICAgICAgICB2aXJ0dWFsIEl0ZXJhdG9yIGJlZ2luKCkgY29uc3Q7CisKKyAgICAgICAgLy8vIHJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdAorICAgICAgICB2aXJ0dWFsIEl0ZXJhdG9yIGVuZCgpIGNvbnN0OworCisgICAgICAgIHZpcnR1YWwgfkxpc3QoKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgc3RydWN0IEltcGw7CisgICAgICAgIExpc3Qoc3RkOjpzaGFyZWRfcHRyPEltcGw+KTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVzIGFsbCAoYmFzZSkgZmllbGRzIGF0IGluZGV4IDAgb2YgdGhlIHBhcmFtZXRlci4gVGhlIG9yZGVyIG9mIGl0ZXJhdGlvbiBpcyB0aGUKKyAgICAgKiBmb2xsb3dpbmc6CisgICAgICogICBGaWVsZHMgb2YgYSBzdHJ1Y3R1cmUgYXJlIGVudW1lcmF0ZWQgaW4gZmllbGQgb3JkZXIuIEhvd2V2ZXIsIHN1Yi1maWVsZHMgb2YgYSBzdHJ1Y3R1cmUKKyAgICAgKiAgIGFyZSBlbnVtZXJhdGVkIGRpcmVjdGx5IGFmdGVyIHRoZSBzdHJ1Y3R1cmUgZmllbGQsIGFuZCBwcmlvciB0byBzaWJsaW5nIGZpZWxkcy4KKyAgICAgKgorICAgICAqIEluIGVzc2VuY2UgdGhlIG9yZGVyIG9mIGVudW1lcmF0aW9uIGlzIGZpcnN0IGJ5IGluY3JlYXNpbmcgb2Zmc2V0LCB0aGVuIGJ5IGRlY3JlYXNpbmcgc2l6ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwYXJhbSBwYXJhbWV0ZXIgdG8gZW51bWVyYXRlIGl0cyBmaWVsZHMKKyAgICAgKiBccGFyYW0gcmVmbGVjdG9yIHBhcmFtZXRlciByZWZsZWN0b3IgdXNlZCBmb3IgZW51bWVyYXRpb24KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYW4gaXRlcmFibGUgb2JqZWN0CisgICAgICovCisgICAgc3RhdGljIExpc3QgZW51bWVyYXRlRmllbGRzKAorICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAmcGFyYW0sCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3Rvcik7CisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVzIGFsbCBjb3VzaW4gZmllbGRzIHVwIHRvIGRlcHRoIC0gbGV2ZWwgZm9yIGEgZmllbGQuIElmIGxldmVsIGlzIDAsIGl0IGVudW1lcmF0ZXMKKyAgICAgKiBvbmx5IHRoZSBmaWVsZC4gRm9yIGxldmVsIDEsIGl0IGVudW1lcmF0ZXMgYWxsIGZpZWxkcyBpbiBpdHMgY3VycmVudCBhcnJheSAod2hpY2ggbWF5IGJlCisgICAgICogaXRzZWxmIGlmIGV4dGVudCBpcyAxKS4gVGhlIG9yZGVyIG9mIGl0ZXJhdGlvbiBpcyBieSBpbmNyZWFzaW5nIGZpZWxkIG9mZnNldC4KKyAgICAgKi8KKyAgICBzdGF0aWMgTGlzdCBlbnVtZXJhdGVDb3VzaW5zKAorICAgICAgICAgICAgY29uc3QgSW5mbyAmZmllbGQsCisgICAgICAgICAgICB1aW50MzJfdCBsZXZlbCA9IH4wKTsKKworICAgIC8qKgorICAgICAqIExvY2F0ZXMgdGhlIGZpZWxkIGluIGEgcGFyYW1ldGVyIGFuZCByZXR1cm5zIGEgbGlzdCBvZiAyIGVsZW1lbnRzIC0gdGhlIG1vc3Qtc3BlY2lmaWMgZmllbGQKKyAgICAgKiBhcnJheSBvZiB0aGUgcGFyYW1ldGVyIHRoYXQgY29udGFpbnMgdGhlIGVudGlyZSBmaWVsZC4gSWYgdGhlIGZpZWxkIGlzIG5vdCBhIHZhbGlkIGZpZWxkCisgICAgICogc3BlY2lmaWVyIGZvciB0aGlzIHBhcmFtZXRlciAoZS5nLiBpdCBpcyBvdXRzaWRlIHRoZSBib3VuZHMgb2YgdGhlIHBhcmFtZXRlciksIGl0IHJldHVybnMKKyAgICAgKiBhbiBlbXB0eSBsaXN0LgorICAgICAqLworICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxJbmZvPiBsb2NhdGVGaWVsZCgKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gJnBhcmFtLCBjb25zdCBfQzJGaWVsZElkICZmaWVsZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKTsKKworICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxJbmZvPiBsb2NhdGVGaWVsZCgKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW1GaWVsZCAmcGYsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKTsKKworfTsKKworI2luY2x1ZGUgPHV0aWwvQzJEZWJ1Zy1pbnRlcmZhY2UuaD4KKworI2VuZGlmICAvLyBDMlVUSUxTX0lOVEVSRkFDRV9VVElMU19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyUGFyYW1VdGlscy5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyUGFyYW1VdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MWJkOTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJQYXJhbVV0aWxzLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJVVElMU19QQVJBTV9VVElMU19IXworI2RlZmluZSBDMlVUSUxTX1BBUkFNX1VUSUxTX0hfCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLyoqIFxmaWxlCisgKiBVdGlsaXRpZXMgZm9yIHBhcmFtZXRlciBoYW5kbGluZyB0byBiZSB1c2VkIGJ5IENvZGVjMiBpbXBsZW1lbnRhdGlvbnMuCisgKi8KKworLy8vIFxjb25kIElOVEVSTkFMCisKK3N0cnVjdCBDMlBhcmFtOworCitjbGFzcyBDMlBhcmFtVXRpbHMgeworICAgIGZyaWVuZCBjbGFzcyBDMlV0aWxUZXN0X1BhcmFtVXRpbHNUZXN0X1Rlc3Q7CisKK3B1YmxpYzoKKworICAgIC8vLyBzYWZlKHIpIHBhcnNpbmcgZnJvbSBwYXJhbWV0ZXIgYmxvYgorICAgIHN0YXRpYworICAgIEMyUGFyYW0gKlBhcnNlRmlyc3QoY29uc3QgdWludDhfdCAqYmxvYiwgc2l6ZV90IHNpemUpOworfTsKKworLy8vIFxlbmRjb25kCisKKyNlbmRpZiAgLy8gQzJVVElMU19QQVJBTV9VVElMU19IXworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbnRlcm5hbC9DMkJsb2NrSW50ZXJuYWwuaCBiL21lZGlhL2NvZGVjMi92bmRrL2ludGVybmFsL0MyQmxvY2tJbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYmYzYWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbnRlcm5hbC9DMkJsb2NrSW50ZXJuYWwuaApAQCAtMCwwICsxLDMzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TVEFHRUZSSUdIVF9DMkJMT0NLX0lOVEVSTkFMX0hfCisjZGVmaW5lIEFORFJPSURfU1RBR0VGUklHSFRfQzJCTE9DS19JTlRFUk5BTF9IXworCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9idWZmZXJxdWV1ZS8xLjAvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorCisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CisKK3N0cnVjdCBCdWZmZXJQb29sRGF0YTsKKworfQorfQorfQorfQorCisvKioKKyAqIFN0b3JlcyBpbmZvcm1hdGlvbnMgZnJvbSBDMkJsb2NrUG9vbCBpbXBsZW1lbnRhdGlvbnMgd2hpY2ggYXJlIHJlcXVpcmVkIGJ5IEMyQmxvY2suCisgKi8KK3N0cnVjdCBDMl9ISURFIF9DMkJsb2NrUG9vbERhdGEgeworICAgIGVudW0gdHlwZV90IDogaW50IHsKKyAgICAgICAgVFlQRV9CVUZGRVJQT09MID0gMCwKKyAgICAgICAgVFlQRV9CVUZGRVJRVUVVRSwKKyAgICB9OworCisgICAgdmlydHVhbCB0eXBlX3QgZ2V0VHlwZSgpIGNvbnN0ID0gMDsKKworcHJvdGVjdGVkOgorICAgIF9DMkJsb2NrUG9vbERhdGEoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIH5fQzJCbG9ja1Bvb2xEYXRhKCkgPSBkZWZhdWx0OworfTsKKworc3RydWN0IEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhOworCisvKioKKyAqIEludGVybmFsIG9ubHkgaW50ZXJmYWNlIGZvciBjcmVhdGluZyBibG9ja3MgYnkgYmxvY2sgcG9vbC9idWZmZXIgcGFzc2luZyBpbXBsZW1lbnRhdGlvbnMuCisgKgorICogXHRvZG8gdGhpcyBtdXN0IGJlIGhpZGRlbgorICovCitzdHJ1Y3QgX0MyQmxvY2tGYWN0b3J5IHsKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBsaW5lYXIgYmxvY2sgZnJvbSBhbiBhbGxvY2F0aW9uIGZvciBhbiBhbGxvdHRlZCByYW5nZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBhbGxvYyBwYXJlbnQgYWxsb2NhdGlvbgorICAgICAqIFxwYXJhbSBkYXRhICBibG9ja3Bvb2wgZGF0YQorICAgICAqIFxwYXJhbSBvZmZzZXQgYWxsb3R0ZWQgcmFuZ2Ugb2Zmc2V0CisgICAgICogXHBhcmFtIHNpemUgIGFsbG90dGVkIHNpemUKKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIGxpbmVhciBibG9jay4gbnVsbHB0ciBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkgdG8KKyAgICAgKiAgICAgICAgIGNyZWF0ZSB0aGlzIGJsb2NrLgorICAgICAqLworICAgIHN0YXRpYworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBDcmVhdGVMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiAmZGF0YSA9IG51bGxwdHIsCisgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMCwKKyAgICAgICAgICAgIHNpemVfdCBzaXplID0gfihzaXplX3QpMCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBncmFwaGljIGJsb2NrIGZyb20gYW4gYWxsb2NhdGlvbiBmb3IgYW4gYWxsb3R0ZWQgc2VjdGlvbi4KKyAgICAgKgorICAgICAqIFxwYXJhbSBhbGxvYyBwYXJlbnQgYWxsb2NhdGlvbgorICAgICAqIFxwYXJhbSBkYXRhICBibG9ja3Bvb2wgZGF0YQorICAgICAqIFxwYXJhbSBjcm9wICBhbGxvdHRlZCBjcm9wIHJlZ2lvbgorICAgICAqCisgICAgICogXHJldHVybiBzaGFyZWQgcG9pbnRlciB0byB0aGUgZ3JhcGhpYyBibG9jay4gbnVsbHB0ciBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkgdG8KKyAgICAgKiAgICAgICAgIGNyZWF0ZSB0aGlzIGJsb2NrLgorICAgICAqLworICAgIHN0YXRpYworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gQ3JlYXRlR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiAmZGF0YSA9IG51bGxwdHIsCisgICAgICAgICAgICBjb25zdCBDMlJlY3QgJmFsbG90dGVkQ3JvcCA9IEMyUmVjdCh+MHUsIH4wdSkpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgYmxvY2sgcG9vbCBkYXRhIGZyb20gMUQgYmxvY2suCisgICAgICoKKyAgICAgKiBccGFyYW0gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIDFEIGJsb2NrIHdoaWNoIGlzIGFscmVhZHkgY3JlYXRlZC4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gR2V0TGluZWFyQmxvY2tQb29sRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IEMyQmxvY2sxRCYgYmxvY2spOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgYmxvY2sgcG9vbCBkYXRhIGZyb20gMkQgYmxvY2suCisgICAgICoKKyAgICAgKiBccGFyYW0gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIDJEIGJsb2NrIHdoaWNoIGlzIGFscmVhZHkgY3JlYXRlZC4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gR2V0R3JhcGhpY0Jsb2NrUG9vbERhdGEoCisgICAgICAgICAgICBjb25zdCBDMkJsb2NrMkQmIGJsb2NrKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGxpbmVhciBibG9jayBmcm9tIHRoZSByZWNlaXZlZCBuYXRpdmUgaGFuZGxlLgorICAgICAqCisgICAgICogXHBhcmFtIGhhbmRsZSAgICBuYXRpdmUgaGFuZGxlIHRvIGEgbGluZWFyIGJsb2NrCisgICAgICoKKyAgICAgKiBccmV0dXJuIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBsaW5lYXIgYmxvY2suIG51bGxwdHIgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvCisgICAgICogICAgICAgICBjcmVhdGUgdGhpcyBibG9jay4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gQ3JlYXRlTGluZWFyQmxvY2soCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGdyYXBoaWMgYmxvY2sgZnJvbSB0aGUgcmVjZWl2ZWQgbmF0aXZlIGhhbmRsZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBoYW5kbGUgICAgbmF0aXZlIGhhbmRsZSB0byBhIGdyYXBoaWMgYmxvY2sKKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIGdyYXBoaWMgYmxvY2suIG51bGxwdHIgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvCisgICAgICogICAgICAgICBjcmVhdGUgdGhpcyBibG9jay4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IENyZWF0ZUdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbGluZWFyIGJsb2NrIGZyb20gdGhlIHJlY2VpdmVkIGJ1ZmZlcnBvb2wgZGF0YS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBkYXRhICBidWZmZXJwb29sIGRhdGEgdG8gYSBsaW5lYXIgYmxvY2sKKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIGxpbmVhciBibG9jay4gbnVsbHB0ciBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkgdG8KKyAgICAgKiAgICAgICAgIGNyZWF0ZSB0aGlzIGJsb2NrLgorICAgICAqLworICAgIHN0YXRpYworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBDcmVhdGVMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpCdWZmZXJQb29sRGF0YT4gJmRhdGEpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgZ3JhcGhpYyBibG9jayBmcm9tIHRoZSByZWNlaXZlZCBidWZmZXJwb29sIGRhdGEuCisgICAgICoKKyAgICAgKiBccGFyYW0gZGF0YSAgYnVmZmVycG9vbCBkYXRhIHRvIGEgZ3JhcGhpYyBibG9jaworICAgICAqCisgICAgICogXHJldHVybiBzaGFyZWQgcG9pbnRlciB0byB0aGUgZ3JhcGhpYyBibG9jay4gbnVsbHB0ciBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkgdG8KKyAgICAgKiAgICAgICAgIGNyZWF0ZSB0aGlzIGJsb2NrLgorICAgICAqLworICAgIHN0YXRpYworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gQ3JlYXRlR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OkJ1ZmZlclBvb2xEYXRhPiAmZGF0YSk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgYnVmZmVycG9vbCBkYXRhIGZyb20gdGhlIGJsb2NrcG9vbCBkYXRhLgorICAgICAqCisgICAgICogXHBhcmFtIHBvb2xEYXRhICAgICAgICAgIGJsb2NrcG9vbCBkYXRhCisgICAgICogXHBhcmFtIGJ1ZmZlclBvb2xEYXRhICAgIHBvaW50ZXIgdG8gYnVmZmVycG9vbCBkYXRhIHdoZXJlIHRoZSBidWZmZXJwb29sCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgaXMgc3RvcmVkLgorICAgICAqCisgICAgICogXHJldHVybiB7XGNvZGUgdHJ1ZX0gd2hlbiB0aGVyZSBpcyB2YWxpZCBidWZmZXJwb29sIGRhdGEsIHtcY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHN0YXRpYworICAgIGJvb2wgR2V0QnVmZmVyUG9vbERhdGEoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgX0MyQmxvY2tQb29sRGF0YT4gJnBvb2xEYXRhLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6QnVmZmVyUG9vbERhdGE+ICpidWZmZXJQb29sRGF0YSk7CisKKyAgICAvKgorICAgICAqIExpZmUgQ3ljbGUgTWFuYWdlbWVudCBvZiBCdWZmZXJRdWV1ZS1CYXNlZCBCbG9ja3MKKyAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICoKKyAgICAgKiBBIGJsb2NrIHRoYXQgaXMgY3JlYXRlZCBieSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrcG9vbCByZXF1aXJlcyBzb21lCisgICAgICogc3BlY2lhbCB0cmVhdG1lbnQgd2hlbiBpdCBpcyBkZXN0cm95ZWQuIEluIHBhcnRpY3VsYXIsIGlmIHRoZSBibG9jaworICAgICAqIGNvcnJlc3BvbmRzIHRvIGEgaGVsZCAoZGVxdWV1ZWQvYXR0YWNoZWQpIEdyYXBoaWNCdWZmZXIgaW4gYSBzbG90IG9mIGEKKyAgICAgKiBidWZmZXJxdWV1ZSwgaXRzIGRlc3RydWN0aW9uIHNob3VsZCB0cmlnZ2VyIGEgY2FsbCB0bworICAgICAqIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmNhbmNlbEJ1ZmZlcigpLiBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlCisgICAgICogR3JhcGhpY0J1ZmZlciBpcyBub3QgaGVsZCwgaS5lLiwgaWYgaXQgaGFzIGJlZW4gcXVldWVkIG9yIGRldGFjaGVkLAorICAgICAqIGNhbmNlbEJ1ZmZlcigpIHNob3VsZCBub3QgYmUgY2FsbGVkIHVwb24gdGhlIGRlc3RydWN0aW9uIG9mIHRoZSBibG9jay4KKyAgICAgKgorICAgICAqIF9DMkJsb2NrUG9vbERhdGEgY3JlYXRlZCBieSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrcG9vbCBpbmNsdWRlcyB0d28KKyAgICAgKiBtYWluIHBpZWNlcyBvZiBpbmZvcm1hdGlvbjoKKyAgICAgKiAgIC0gImhlbGQiIHN0YXR1czogV2hldGhlciBjYW5jZWxCdWZmZXIoKSBzaG91bGQgYmUgY2FsbGVkIHVwb24KKyAgICAgKiAgICAgZGVzdHJ1Y3Rpb24gb2YgdGhlIGJsb2NrLgorICAgICAqICAgLSBidWZmZXJxdWV1ZSBhc3NpZ25tZW50OiBUaGUgcXVhZHJ1cGxlIChpZ2JwLCBnZW5lcmF0aW9uLCBicUlkLAorICAgICAqICAgICBicVNsb3QpLCB3aGVyZSBpZ2JwIGlzIHRoZSBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGluc3RhbmNlIG9mIHRoZQorICAgICAqICAgICBidWZmZXJxdWV1ZSwgZ2VuZXJhdGlvbiBpcyB0aGUgbGF0ZXN0IGdlbmVyYXRpb24gbnVtYmVyLCBvZiB0aGUKKyAgICAgKiAgICAgYnVmZmVycXVldWUsIGJxSWQgaXMgdGhlIGdsb2JhbGx5IHVuaXF1ZSBpZCBvZiB0aGUgYnVmZmVycXVldWUsIGFuZAorICAgICAqICAgICBicVNsb3QgaXMgdGhlIHNsb3QgaW4gdGhlIGJ1ZmZlcnF1ZXVlLgorICAgICAqCisgICAgICogaWdicCBpcyB0aGUgaW5zdGFuY2Ugb2YgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBvbiB3aGljaCBjYW5jZWxCdWZmZXIoKQorICAgICAqIHdpbGwgYmUgY2FsbGVkIGlmICJoZWxkIiBzdGF0dXMgaXMgdHJ1ZSB3aGVuIHRoZSBibG9jayBpcyBkZXN0cm95ZWQuCisgICAgICogKGJxU2xvdCBpcyBhbiBpbnB1dCB0byBjYW5jZWxCdWZmZXIoKS4pIEhvd2V2ZXIsIG9ubHkgZ2VuZXJhdGlvbiwgYnFJZAorICAgICAqIGFuZCBicVNsb3QgYXJlIHJldGFpbmVkIHdoZW4gYSBibG9jayBpcyB0cmFuc2ZlcnJlZCBmcm9tIG9uZSBwcm9jZXNzIHRvCisgICAgICogYW5vdGhlci4gSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGJvdGggdGhlIHNlbmRpbmcgYW5kIHJlY2VpdmluZworICAgICAqIHByb2Nlc3NlcyB0byBtYWludGFpbiBjb25zaXN0ZW5jeSBvZiAiaGVsZCIgc3RhdHVzIGFuZCBpZ2JwLiBCZWxvdyBhcmUKKyAgICAgKiBmdW5jdGlvbnMgcHJvdmlkZWQgZm9yIHRoaXMgcHVycG9zZToKKyAgICAgKgorICAgICAqICAgLSBHZXRCdWZmZXJRdWV1ZURhdGEoKTogUmV0dXJucyBnZW5lcmF0aW9uLCBicUlkIGFuZCBicVNsb3QuCisgICAgICogICAtIEhvbGRCbG9ja0Zyb21CdWZmZXJRdWV1ZSgpOiBTZXRzICJoZWxkIiBzdGF0dXMgdG8gdHJ1ZS4KKyAgICAgKiAgIC0gWWllbGRCbG9ja1RvQnVmZmVyUXVldWUoKTogU2V0cyAiaGVsZCIgc3RhdHVzIHRvIGZhbHNlLgorICAgICAqICAgLSBBc3NpZ25CbG9ja1RvQnVmZmVyUXVldWUoKTogU2V0cyB0aGUgYnVmZmVycXVldWUgYXNzaWdubWVudCBhbmQKKyAgICAgKiAgICAgImhlbGQiIHN0YXR1cy4KKyAgICAgKgorICAgICAqIEFsbCB0aGVzZSBmdW5jdGlvbnMgb3BlcmF0ZSBvbiBfQzJCbG9ja1Bvb2xEYXRhLCB3aGljaCBjYW4gYmUgb2J0YWluZWQgYnkKKyAgICAgKiBjYWxsaW5nIEdldEdyYXBoaWNCbG9ja1Bvb2xEYXRhKCkuCisgICAgICoKKyAgICAgKiBIb2xkQmxvY2tGcm9tQnVmZmVyUXVldWUoKSB3aWxsIG1hcmsgdGhlIGJsb2NrIGFzIGhlbGQsIHdoaWxlCisgICAgICogWWllbGRCbG9ja1RvQnVmZmVyUXVldWUoKSB3aWxsIGRvIHRoZSBvcHBvc2l0ZS4gVGhlc2UgdHdvIGZ1bmN0aW9ucyBkbworICAgICAqIG5vdCBtb2RpZnkgdGhlIGJ1ZmZlcnF1ZXVlIGFzc2lnbm1lbnQsIHNvIGl0IGlzIG5vdCB3cm9uZyB0byBjYWxsCisgICAgICogSG9sZEJsb2NrRnJvbUJ1ZmZlclF1ZXVlKCkgYWZ0ZXIgWWllbGRCbG9ja1RvQnVmZmVyUXVldWUoKSBpZiBpdCBjYW4gYmUKKyAgICAgKiBndWFyYW50ZWVkIHRoYXQgdGhlIGJsb2NrIGlzIG5vdCBkZXN0cm95ZWQgZHVyaW5nIHRoZSBwZXJpb2QgYmV0d2VlbiB0aGUKKyAgICAgKiB0d28gY2FsbHMuCisgICAgICoKKyAgICAgKiBBc3NpbmdCbG9ja1RvQnVmZmVyUXVldWUoKSBoYXMgYSAiaGVsZCIgc3RhdHVzIGFzIGFuIG9wdGlvbmFsIGFyZ3VtZW50LgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuCisgICAgICoKKyAgICAgKiBNYWludGFpbmluZyBDb25zaXN0ZW5jeSB3aXRoIElHcmFwaGljQnVmZmVyUHJvZHVjZXIgT3BlcmF0aW9ucworICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICoKKyAgICAgKiBkZXF1ZXVlQnVmZmVyKCkKKyAgICAgKiAgIC0gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGJsb2NrcG9vbC4gSXQgc2hvdWxkIG5vdCBiZSBjYWxsZWQKKyAgICAgKiAgICAgbWFudWFsbHkuIFRoZSBibG9ja3Bvb2wgd2lsbCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIHRoZSBjb3JyZWN0CisgICAgICogICAgIGluZm9ybWF0aW9uIGZvciBfQzJCbG9ja1Bvb2xEYXRhLCB3aXRoICJoZWxkIiBzdGF0dXMgc2V0IHRvIHRydWUuCisgICAgICoKKyAgICAgKiBxdWV1ZUJ1ZmZlcigpCisgICAgICogICAtIEFmdGVyIHF1ZXVlQnVmZmVyKCkgaXMgY2FsbGVkLCBZaWVsZEJsb2NrVG9CdWZmZXJRdWV1ZSgpIHNob3VsZCBiZQorICAgICAqICAgICBjYWxsZWQuCisgICAgICoKKyAgICAgKiBhdHRhY2hCdWZmZXIoKQorICAgICAqICAgLSBBZnRlciBhdHRhY2hCdWZmZXIoKSBpcyBjYWxsZWQsIEFzc2lnbkJsb2NrVG9CdWZmZXJRdWV1ZSgpIHNob3VsZCBiZQorICAgICAqICAgICBjYWxsZWQgd2l0aCAiaGVsZCIgc3RhdHVzIHNldCB0byB0cnVlLgorICAgICAqCisgICAgICogZGV0YWNoQnVmZmVyKCkKKyAgICAgKiAgIC0gQWZ0ZXIgZGV0YWNoQnVmZmVyKCkgaXMgY2FsbGVkLCBIb2xkQmxvY2tGcm9tQnVmZmVyUXVldWUoKSBzaG91bGQgYmUKKyAgICAgKiAgICAgY2FsbGVkLgorICAgICAqLworCisgICAgLyoqCisgICAgICogR2V0IGJ1ZmZlcnF1ZXVlIGRhdGEgZnJvbSB0aGUgYmxvY2twb29sIGRhdGEuCisgICAgICoKKyAgICAgKiBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2l0aCBccCBnZW5lcmF0aW9uIHNldCB0byBudWxscHRyIHdpbGwgcmV0dXJuCisgICAgICogd2hldGhlciB0aGUgYmxvY2sgY29tZXMgZnJvbSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrcG9vbCwgYnV0IHdpbGwgbm90CisgICAgICogZmlsbCBpbiB0aGUgdmFsdWVzIGZvciBccCBnZW5lcmF0aW9uLCBccCBicUlkIG9yIFxwIGJxU2xvdC4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gIHBvb2xEYXRhICAgYmxvY2twb29sIGRhdGEuCisgICAgICogXHBhcmFtW291dF0gZ2VuZXJhdGlvbiBHZW5lcmF0aW9uIG51bWJlciBhdHRhY2hlZCB0byB0aGUgYnVmZmVyLgorICAgICAqIFxwYXJhbVtvdXRdIGJxSWQgICAgICAgSWQgb2YgdGhlIGJ1ZmZlcnF1ZXVlIG93bmluZyB0aGUgYnVmZmVyIChibG9jaykuCisgICAgICogXHBhcmFtW291dF0gYnFTbG90ICAgICBTbG90IG51bWJlciBvZiB0aGUgYnVmZmVyLgorICAgICAqCisgICAgICogXHJldHVybiBcYyB0cnVlIHdoZW4gdGhlcmUgaXMgdmFsaWQgYnVmZmVycXVldWUgZGF0YTsKKyAgICAgKiAgICAgICAgIFxjIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBib29sIEdldEJ1ZmZlclF1ZXVlRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiYgcG9vbERhdGEsCisgICAgICAgICAgICB1aW50MzJfdCogZ2VuZXJhdGlvbiA9IG51bGxwdHIsCisgICAgICAgICAgICB1aW50NjRfdCogYnFJZCA9IG51bGxwdHIsCisgICAgICAgICAgICBpbnQzMl90KiBicVNsb3QgPSBudWxscHRyKTsKKworICAgIC8qKgorICAgICAqIFNldCBidWZmZXJxdWV1ZSBhc3NpZ25tZW50IGFuZCAiaGVsZCIgc3RhdHVzIHRvIGEgYmxvY2sgY3JlYXRlZCBieSBhCisgICAgICogYnVmZmVycXVldWUtYmFzZWQgYmxvY2twb29sLgorICAgICAqCisgICAgICogXHBhcmFtIHBvb2xEYXRhIGJsb2NrcG9vbCBkYXRhIGFzc29jaWF0ZWQgdG8gdGhlIGJsb2NrLgorICAgICAqIFxwYXJhbSBpZ2JwICAgICAgIFxjIElHcmFwaGljQnVmZmVyUHJvZHVjZXIgaW5zdGFuY2UgZnJvbSB0aGUgZGVzaWduYXRlZAorICAgICAqICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnF1ZXVlLgorICAgICAqIFxwYXJhbSBnZW5lcmF0aW9uIEdlbmVyYXRpb24gbnVtYmVyIHRoYXQgdGhlIGJ1ZmZlciBiZWxvbmdzIHRvLgorICAgICAqIFxwYXJhbSBicUlkICAgICAgIElkIG9mIHRoZSBidWZmZXJxdWV1ZSB0aGF0IHdpbGwgb3duIHRoZSBidWZmZXIgKGJsb2NrKS4KKyAgICAgKiBccGFyYW0gYnFTbG90ICAgICBTbG90IG51bWJlciBvZiB0aGUgYnVmZmVyLgorICAgICAqIFxwYXJhbSBoZWxkICAgICAgIFdoZXRoZXIgdGhlIGJsb2NrIGlzIGhlbGQuIFRoaXMgImhlbGQiIHN0YXR1cyBjYW4gYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICBjaGFuZ2VkIGxhdGVyIGJ5IGNhbGxpbmcgWWllbGRCbG9ja1RvQnVmZmVyUXVldWUoKSBvcgorICAgICAqICAgICAgICAgICAgICAgICAgIEhvbGRCbG9ja0Zyb21CdWZmZXJRdWV1ZSgpLgorICAgICAqCisgICAgICogXHJldHVybiBcYyB0cnVlIGlmIFxwIHBvb2xEYXRhIGlzIHZhbGlkIGJ1ZmZlcnF1ZXVlIGRhdGE7CisgICAgICogICAgICAgICBcYyBmYWxzZSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiBOb3RlOiBccCBnZW5lcmF0aW9uIHNob3VsZCBtYXRjaCB0aGUgbGF0ZXN0IGdlbmVyYXRpb24gbnVtYmVyIHNldCBvbiB0aGUKKyAgICAgKiBidWZmZXJxdWV1ZSwgYW5kIFxwIGJxSWQgc2hvdWxkIG1hdGNoIHRoZSB1bmlxdWUgaWQgZm9yIHRoZSBidWZmZXJxdWV1ZQorICAgICAqIChvYnRhaW5hYmxlIGJ5IGNhbGxpbmcgaWdicC0+Z2V0VW5pcXVlSWQoKSkuCisgICAgICovCisgICAgc3RhdGljCisgICAgYm9vbCBBc3NpZ25CbG9ja1RvQnVmZmVyUXVldWUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIHBvb2xEYXRhLAorICAgICAgICAgICAgY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMV8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCwKKyAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sCisgICAgICAgICAgICB1aW50NjRfdCBicUlkLAorICAgICAgICAgICAgaW50MzJfdCBicVNsb3QsCisgICAgICAgICAgICBib29sIGhlbGQgPSB0cnVlKTsKKworICAgIC8qKgorICAgICAqIEhvbGQgYSBibG9jayBmcm9tIHRoZSBkZXNpZ25hdGVkIGJ1ZmZlcnF1ZXVlLiBUaGlzIGNhdXNlcyB0aGUgZGVzdHJ1Y3Rpb24KKyAgICAgKiBvZiB0aGUgYmxvY2sgdG8gdHJpZ2dlciBhIGNhbGwgdG8gY2FuY2VsQnVmZmVyKCkuCisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBccCBwb29sRGF0YSBjb21lcyBmcm9tIGEgYnVmZmVycXVldWUtYmFzZWQKKyAgICAgKiBibG9jay4gSXQgZG9lcyBub3QgY2hlY2sgaWYgdGhhdCBpcyB0aGUgY2FzZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwb29sRGF0YSBibG9ja3Bvb2wgZGF0YSBhc3NvY2lhdGVkIHRvIHRoZSBibG9jay4KKyAgICAgKiBccGFyYW0gaWdicCAgICAgXGMgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBpbnN0YW5jZSB0byBiZSBhc3NpZ25lZCB0byB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgYmxvY2suIFRoaXMgaXMgbm90IG5lZWRlZCB3aGVuIHRoZSBibG9jayBpcyBsb2NhbC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gVGhlIHByZXZpb3VzIGhlbGQgc3RhdHVzLgorICAgICAqLworICAgIHN0YXRpYworICAgIGJvb2wgSG9sZEJsb2NrRnJvbUJ1ZmZlclF1ZXVlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+JiBwb29sRGF0YSwKKyAgICAgICAgICAgIGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjFfMDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnAgPSBudWxscHRyKTsKKworICAgIC8qKgorICAgICAqIFlpZWxkIGEgYmxvY2sgdG8gdGhlIGRlc2lnbmF0ZWQgYnVmZmVycXVldWUuIFRoaXMgY2F1c2VzIHRoZSBkZXN0cnVjdGlvbgorICAgICAqIG9mIHRoZSBibG9jayBub3QgdG8gdHJpZ2dlciBhIGNhbGwgdG8gY2FuY2VsQnVmZmVyKCk7CisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBccCBwb29sRGF0YSBjb21lcyBmcm9tIGEgYnVmZmVycXVldWUtYmFzZWQKKyAgICAgKiBibG9jay4gSXQgZG9lcyBub3QgY2hlY2sgaWYgdGhhdCBpcyB0aGUgY2FzZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwb29sRGF0YSBibG9ja3Bvb2wgZGF0YSBhc3NvY2lhdGVkIHRvIHRoZSBibG9jay4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gVGhlIHByZXZpb3VzIGhlbGQgc3RhdHVzLgorICAgICAqLworICAgIHN0YXRpYworICAgIGJvb2wgWWllbGRCbG9ja1RvQnVmZmVyUXVldWUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIHBvb2xEYXRhKTsKKworfTsKKworI2VuZGlmIC8vIEFORFJPSURfU1RBR0VGUklHSFRfQzJCTE9DS19JTlRFUk5BTF9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbnRlcm5hbC9DMlBhcmFtSW50ZXJuYWwuaCBiL21lZGlhL2NvZGVjMi92bmRrL2ludGVybmFsL0MyUGFyYW1JbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YThmMjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbnRlcm5hbC9DMlBhcmFtSW50ZXJuYWwuaApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TVEFHRUZSSUdIVF9DMlBBUkFNX0lOVEVSTkFMX0hfCisjZGVmaW5lIEFORFJPSURfU1RBR0VGUklHSFRfQzJQQVJBTV9JTlRFUk5BTF9IXworCisjaW5jbHVkZSA8QzJQYXJhbS5oPgorCitzdHJ1Y3QgQzJfSElERSBfQzJQYXJhbUluc3BlY3RvciB7CisgICAgaW5saW5lIHN0YXRpYyB1aW50MzJfdCBHZXRPZmZzZXQoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZkKSB7CisgICAgICAgIHJldHVybiBmZC5fbUZpZWxkSWQuX21PZmZzZXQ7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyB2b2lkIFNldE9mZnNldChDMkZpZWxkRGVzY3JpcHRvciAmZmQsIHVpbnQzMl90IG9mZnNldCkgeworICAgICAgICBmZC5fbUZpZWxkSWQuX21PZmZzZXQgPSBvZmZzZXQ7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyB1aW50MzJfdCBHZXRFbmRPZmZzZXQoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZkLCB1aW50MzJfdCBwYXJhbVNpemUgPSAwKSB7CisgICAgICAgIHVpbnQzMl90IGVuZE9mZnNldCA9IGZkLl9tRmllbGRJZC5fbU9mZnNldCArIGZkLl9tRXh0ZW50ICogZmQuX21GaWVsZElkLl9tU2l6ZTsKKyAgICAgICAgLy8vIGZvciBmbGV4IHBhcmFtZXRlcnMgcmV0dXJuIHBhcmFtU2l6ZSBpZiBnaXZlbgorICAgICAgICByZXR1cm4gZmQuX21FeHRlbnQgPyBlbmRPZmZzZXQgOiBzdGQ6Om1heChlbmRPZmZzZXQsIHBhcmFtU2l6ZSk7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyB1aW50MzJfdCBHZXRTaXplKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmZCkgeworICAgICAgICByZXR1cm4gZmQuX21GaWVsZElkLl9tU2l6ZTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IEdldEluZGV4KGNvbnN0IEMyUGFyYW1GaWVsZCAmcGYpIHsKKyAgICAgICAgcmV0dXJuIHBmLl9tSW5kZXg7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyB1aW50MzJfdCBHZXRPZmZzZXQoY29uc3QgQzJQYXJhbUZpZWxkICZwZikgeworICAgICAgICByZXR1cm4gcGYuX21GaWVsZElkLl9tT2Zmc2V0OworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgdWludDMyX3QgR2V0U2l6ZShjb25zdCBDMlBhcmFtRmllbGQgJnBmKSB7CisgICAgICAgIHJldHVybiBwZi5fbUZpZWxkSWQuX21TaXplOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgdWludDMyX3QgR2V0T2Zmc2V0KGNvbnN0IF9DMkZpZWxkSWQgJmYpIHsKKyAgICAgICAgcmV0dXJuIGYuX21PZmZzZXQ7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyB1aW50MzJfdCBHZXRTaXplKGNvbnN0IF9DMkZpZWxkSWQgJmYpIHsKKyAgICAgICAgcmV0dXJuIGYuX21TaXplOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgX0MyRmllbGRJZCBHZXRGaWVsZChjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmQpIHsKKyAgICAgICAgcmV0dXJuIGZkLl9tRmllbGRJZDsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IEdldEF0dHJpYihjb25zdCBDMlBhcmFtRGVzY3JpcHRvciAmcGQpIHsKKyAgICAgICAgcmV0dXJuIHBkLl9tQXR0cmliOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgX0MyRmllbGRJZCBHZXRGaWVsZChjb25zdCBDMlBhcmFtRmllbGQgJnBmKSB7CisgICAgICAgIHJldHVybiBwZi5fbUZpZWxkSWQ7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYworICAgIEMyUGFyYW1GaWVsZCBDcmVhdGVQYXJhbUZpZWxkKEMyUGFyYW06OkluZGV4IGluZGV4LCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IHNpemUpIHsKKyAgICAgICAgcmV0dXJuIEMyUGFyYW1GaWVsZChpbmRleCwgb2Zmc2V0LCBzaXplKTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljCisgICAgQzJQYXJhbUZpZWxkIENyZWF0ZVBhcmFtRmllbGQoQzJQYXJhbTo6SW5kZXggaW5kZXgsIF9DMkZpZWxkSWQgZmllbGQpIHsKKyAgICAgICAgcmV0dXJuIEMyUGFyYW1GaWVsZChpbmRleCwgZmllbGQuX21PZmZzZXQsIGZpZWxkLl9tU2l6ZSk7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYworICAgIHZvaWQgVHJpbVBhcmFtKEMyUGFyYW0gKnBhcmFtLCB1aW50MzJfdCBuZXdTaXplKSB7CisgICAgICAgIGlmIChwYXJhbSAmJiAqcGFyYW0gJiYgcGFyYW0tPnNpemUoKSA+IG5ld1NpemUgJiYgbmV3U2l6ZSA+PSBzaXplb2YoQzJQYXJhbSkpIHsKKyAgICAgICAgICAgIHBhcmFtLT5fbVNpemUgPSBuZXdTaXplOworICAgICAgICB9CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyB2b2lkIEFkZE5hbWVkVmFsdWVzKAorICAgICAgICAgICAgQzJGaWVsZERlc2NyaXB0b3IgJmZkLCBDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlICYmbmFtZWRWYWx1ZXMpIHsKKyAgICAgICAgZmQuX21OYW1lZFZhbHVlcyA9IHN0ZDo6bW92ZShuYW1lZFZhbHVlcyk7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYworICAgIEMyU3RydWN0RGVzY3JpcHRvciBDcmVhdGVTdHJ1Y3REZXNjcmlwdG9yKEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gJiZmaWVsZHMpIHsKKyAgICAgICAgcmV0dXJuIEMyU3RydWN0RGVzY3JpcHRvcihpbmRleCwgc3RkOjptb3ZlKGZpZWxkcykpOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMKKyAgICBDMkZpZWxkRGVzY3JpcHRvciBPZmZzZXRGaWVsZERlc2NyaXB0b3IoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZkLCBzaXplX3Qgb2Zmc2V0KSB7CisgICAgICAgIHJldHVybiBDMkZpZWxkRGVzY3JpcHRvcihmZCwgb2Zmc2V0KTsKKyAgICB9CisKKyAgICAvLyBleHBvc2UgYXR0cmlidXRlcworICAgIHR5cGVkZWYgQzJQYXJhbURlc2NyaXB0b3I6OmF0dHJpYl90IGF0dHJpYl90OworfTsKKworI2VuZGlmIC8vIEFORFJPSURfU1RBR0VGUklHSFRfQzJQQVJBTV9JTlRFUk5BTF9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9wbGF0Zm9ybS9DMkJxQnVmZmVyLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL3BsYXRmb3JtL0MyQnFCdWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMjYwMzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9wbGF0Zm9ybS9DMkJxQnVmZmVyLmNwcApAQCAtMCwwICsxLDQ5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJCcUJ1ZmZlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGd1aS9CdWZmZXJRdWV1ZURlZnMuaD4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtdXRleD4KKworI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgorI2luY2x1ZGUgPEMyQnFCdWZmZXJQcml2Lmg+CisjaW5jbHVkZSA8QzJCbG9ja0ludGVybmFsLmg+CisKK3VzaW5nIDo6YW5kcm9pZDo6QW53QnVmZmVyOwordXNpbmcgOjphbmRyb2lkOjpCdWZmZXJRdWV1ZURlZnM6Ok5VTV9CVUZGRVJfU0xPVFM7Cit1c2luZyA6OmFuZHJvaWQ6OkMyQWxsb2NhdG9yR3JhbGxvYzsKK3VzaW5nIDo6YW5kcm9pZDo6QzJBbmRyb2lkTWVtb3J5VXNhZ2U7Cit1c2luZyA6OmFuZHJvaWQ6OkZlbmNlOwordXNpbmcgOjphbmRyb2lkOjpHcmFwaGljQnVmZmVyOwordXNpbmcgOjphbmRyb2lkOjpIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwordXNpbmcgOjphbmRyb2lkOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwordXNpbmcgOjphbmRyb2lkOjpoaWRsX2hhbmRsZTsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7Cit1c2luZyA6OmFuZHJvaWQ6OnN0YXR1c190OwordXNpbmcgOjphbmRyb2lkOjp3cDsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQ7CisKK3N0cnVjdCBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSA6IHB1YmxpYyBfQzJCbG9ja1Bvb2xEYXRhIHsKKworICAgIGJvb2wgaGVsZDsKKyAgICBib29sIGxvY2FsOworICAgIHVpbnQzMl90IGdlbmVyYXRpb247CisgICAgdWludDY0X3QgYnFJZDsKKyAgICBpbnQzMl90IGJxU2xvdDsKKyAgICBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBpZ2JwOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpJbXBsPiBsb2NhbFBvb2w7CisKKyAgICB2aXJ0dWFsIHR5cGVfdCBnZXRUeXBlKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gVFlQRV9CVUZGRVJRVUVVRTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgYSByZW1vdGUgQmxvY2tQb29sRGF0YS4KKyAgICBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgKKyAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sIHVpbnQ2NF90IGJxSWQsIGludDMyX3QgYnFTbG90LAorICAgICAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHByb2R1Y2VyID0gbnVsbHB0cik7CisKKyAgICAvLyBDcmVhdGUgYSBsb2NhbCBCbG9ja1Bvb2xEYXRhLgorICAgIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhKAorICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgYnFJZCwgaW50MzJfdCBicVNsb3QsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6SW1wbD4mIHBvb2wpOworCisgICAgdmlydHVhbCB+QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGEoKSBvdmVycmlkZTsKKworfTsKKworYm9vbCBfQzJCbG9ja0ZhY3Rvcnk6OkdldEJ1ZmZlclF1ZXVlRGF0YSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+JiBkYXRhLAorICAgICAgICB1aW50MzJfdCogZ2VuZXJhdGlvbiwgdWludDY0X3QqIGJxSWQsIGludDMyX3QqIGJxU2xvdCkgeworICAgIGlmIChkYXRhICYmIGRhdGEtPmdldFR5cGUoKSA9PSBfQzJCbG9ja1Bvb2xEYXRhOjpUWVBFX0JVRkZFUlFVRVVFKSB7CisgICAgICAgIGlmIChnZW5lcmF0aW9uKSB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPihkYXRhKTsKKyAgICAgICAgICAgICpnZW5lcmF0aW9uID0gcG9vbERhdGEtPmdlbmVyYXRpb247CisgICAgICAgICAgICBpZiAoYnFJZCkgeworICAgICAgICAgICAgICAgICpicUlkID0gcG9vbERhdGEtPmJxSWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYnFTbG90KSB7CisgICAgICAgICAgICAgICAgKmJxU2xvdCA9IHBvb2xEYXRhLT5icVNsb3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBfQzJCbG9ja0ZhY3Rvcnk6OkFzc2lnbkJsb2NrVG9CdWZmZXJRdWV1ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+JiBkYXRhLAorICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCwKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwKKyAgICAgICAgdWludDY0X3QgYnFJZCwKKyAgICAgICAgaW50MzJfdCBicVNsb3QsCisgICAgICAgIGJvb2wgaGVsZCkgeworICAgIGlmIChkYXRhICYmIGRhdGEtPmdldFR5cGUoKSA9PSBfQzJCbG9ja1Bvb2xEYXRhOjpUWVBFX0JVRkZFUlFVRVVFKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgICAgIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4oZGF0YSk7CisgICAgICAgIHBvb2xEYXRhLT5pZ2JwID0gaWdicDsKKyAgICAgICAgcG9vbERhdGEtPmdlbmVyYXRpb24gPSBnZW5lcmF0aW9uOworICAgICAgICBwb29sRGF0YS0+YnFJZCA9IGJxSWQ7CisgICAgICAgIHBvb2xEYXRhLT5icVNsb3QgPSBicVNsb3Q7CisgICAgICAgIHBvb2xEYXRhLT5oZWxkID0gaGVsZDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBfQzJCbG9ja0ZhY3Rvcnk6OkhvbGRCbG9ja0Zyb21CdWZmZXJRdWV1ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+JiBkYXRhLAorICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCkgeworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPihkYXRhKTsKKyAgICBpZiAoIXBvb2xEYXRhLT5sb2NhbCkgeworICAgICAgICBwb29sRGF0YS0+aWdicCA9IGlnYnA7CisgICAgfQorICAgIGlmIChwb29sRGF0YS0+aGVsZCkgeworICAgICAgICBwb29sRGF0YS0+aGVsZCA9IHRydWU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcG9vbERhdGEtPmhlbGQgPSB0cnVlOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIF9DMkJsb2NrRmFjdG9yeTo6WWllbGRCbG9ja1RvQnVmZmVyUXVldWUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiYgZGF0YSkgeworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPihkYXRhKTsKKyAgICBpZiAoIXBvb2xEYXRhLT5oZWxkKSB7CisgICAgICAgIHBvb2xEYXRhLT5oZWxkID0gZmFsc2U7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcG9vbERhdGEtPmhlbGQgPSBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jaygKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSkgeworICAgIC8vIFRPRE86IGdldCBwcm9wZXIgYWxsb2NhdG9yPyBhbmQgbXV0ZXg/CisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMkFsbG9jYXRvckdyYWxsb2M+IHNBbGxvY2F0b3IgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyQWxsb2NhdG9yR3JhbGxvYz4oMCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgaWYgKEMyQWxsb2NhdG9yR3JhbGxvYzo6aXNWYWxpZChoYW5kbGUpKSB7CisgICAgICAgIHVpbnQzMl90IHdpZHRoOworICAgICAgICB1aW50MzJfdCBoZWlnaHQ7CisgICAgICAgIHVpbnQzMl90IGZvcm1hdDsKKyAgICAgICAgdWludDY0X3QgdXNhZ2U7CisgICAgICAgIHVpbnQzMl90IHN0cmlkZTsKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgdWludDY0X3QgYnFJZDsKKyAgICAgICAgdWludDMyX3QgYnFTbG90OworICAgICAgICBhbmRyb2lkOjpfVW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY01ldGFkYXRhKAorICAgICAgICAgICAgICAgIGhhbmRsZSwgJndpZHRoLCAmaGVpZ2h0LCAmZm9ybWF0LCAmdXNhZ2UsICZzdHJpZGUsICZnZW5lcmF0aW9uLCAmYnFJZCwgJmJxU2xvdCk7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHNBbGxvY2F0b3ItPnByaW9yR3JhcGhpY0FsbG9jYXRpb24oaGFuZGxlLCAmYWxsb2MpOworICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrOworICAgICAgICAgICAgaWYgKGJxSWQgfHwgYnFTbG90KSB7CisgICAgICAgICAgICAgICAgLy8gQlFCQlAKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+KGdlbmVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpYnFTbG90KTsKKyAgICAgICAgICAgICAgICBibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jLCBwb29sRGF0YSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soYWxsb2MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJsb2NrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCitjbGFzcyBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpJbXBsCisgICAgICAgIDogcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6SW1wbD4geworcHJpdmF0ZToKKyAgICBjMl9zdGF0dXNfdCBmZXRjaEZyb21JZ2JwX2woCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSB7CisgICAgICAgIC8vIFdlIGhhdmUgYW4gSUdCUCBub3cuCisgICAgICAgIHNwPEZlbmNlPiBmZW5jZSA9IG5ldyBGZW5jZSgpOworICAgICAgICBDMkFuZHJvaWRNZW1vcnlVc2FnZSBhbmRyb2lkVXNhZ2UgPSB1c2FnZTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICBQaXhlbEZvcm1hdCBwaXhlbEZvcm1hdCA9IHN0YXRpY19jYXN0PFBpeGVsRm9ybWF0Pihmb3JtYXQpOworICAgICAgICBpbnQgc2xvdDsKKyAgICAgICAgQUxPR1YoInRyaWVzIHRvIGRlcXVldWUgYnVmZmVyIik7CisgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1Qcm9kdWNlci0+ZGVxdWV1ZUJ1ZmZlcigKKyAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBwaXhlbEZvcm1hdCwgYW5kcm9pZFVzYWdlLmFzR3JhbGxvY1VzYWdlKCksIHRydWUsCisgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZzbG90LCAmZmVuY2VdKAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0U3RhdHVzLCBpbnQzMl90IHRTbG90LCBoaWRsX2hhbmRsZSBjb25zdCYgdEZlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSBjb25zdCYgdFRzKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRTdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIHNsb3QgPSB0U2xvdDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFhbmRyb2lkOjpjb252ZXJzaW9uOjpjb252ZXJ0VG8oZmVuY2UuZ2V0KCksIHRGZW5jZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPT0gYW5kcm9pZDo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAodm9pZCkgdFRzOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAvLyBkZXF1ZXVlQnVmZmVyIHJldHVybnMgZmxhZy4KKyAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkgfHwgc3RhdHVzIDwgYW5kcm9pZDo6T0spIHsKKyAgICAgICAgICAgIEFMT0dEKCJjYW5ub3QgZGVxdWV1ZSBidWZmZXIgJWQiLCBzdGF0dXMpOworICAgICAgICAgICAgaWYgKHRyYW5zU3RhdHVzLmlzT2soKSAmJiBzdGF0dXMgPT0gYW5kcm9pZDo6SU5WQUxJRF9PUEVSQVRJT04pIHsKKyAgICAgICAgICAgICAgLy8gVG9vIG1hbnkgYnVmZmVyIGRlcXVldWVkLiByZXRyeWluZyBhZnRlciBzb21lIHRpbWUgaXMgcmVxdWlyZWQuCisgICAgICAgICAgICAgIHJldHVybiBDMl9USU1FRF9PVVQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dWKCJkZXF1ZXVlZCBhIGJ1ZmZlciBzdWNjZXNzZnVsbHkiKTsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBuaCA9IG51bGxwdHI7CisgICAgICAgIGhpZGxfaGFuZGxlIGZlbmNlSGFuZGxlOworICAgICAgICBpZiAoZmVuY2UpIHsKKyAgICAgICAgICAgIGFuZHJvaWQ6OmNvbnZlcnNpb246OndyYXBBcygmZmVuY2VIYW5kbGUsICZuaCwgKmZlbmNlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmVuY2UpIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtGZW5jZVdhaXRUaW1lTXMgPSAxMDsKKworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZmVuY2UtPndhaXQoa0ZlbmNlV2FpdFRpbWVNcyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IC1FVElNRSkgeworICAgICAgICAgICAgICAgIC8vIGZlbmNlIGlzIG5vdCBzaWduYWxsZWQgeWV0LgorICAgICAgICAgICAgICAgICh2b2lkKW1Qcm9kdWNlci0+Y2FuY2VsQnVmZmVyKHNsb3QsIGZlbmNlSGFuZGxlKS5pc09rKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX1RJTUVEX09VVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gYW5kcm9pZDo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiYnVmZmVyIGZlbmNlIHdhaXQgZXJyb3IgJWQiLCBzdGF0dXMpOworICAgICAgICAgICAgICAgICh2b2lkKW1Qcm9kdWNlci0+Y2FuY2VsQnVmZmVyKHNsb3QsIGZlbmNlSGFuZGxlKS5pc09rKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVJlbmRlckNhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgbnNlY3NfdCBzaWduYWxUaW1lID0gZmVuY2UtPmdldFNpZ25hbFRpbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoc2lnbmFsVGltZSA+PSAwICYmIHNpZ25hbFRpbWUgPCBJTlQ2NF9NQVgpIHsKKyAgICAgICAgICAgICAgICAgICAgbVJlbmRlckNhbGxiYWNrKG1Qcm9kdWNlcklkLCBzbG90LCBzaWduYWxUaW1lKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiZ290IGZlbmNlIHNpZ25hbCB0aW1lIG9mICVsbGQiLCAobG9uZyBsb25nKXNpZ25hbFRpbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+ICZzbG90QnVmZmVyID0gbUJ1ZmZlcnNbc2xvdF07CisgICAgICAgIGlmIChzdGF0dXMgJiBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpCVUZGRVJfTkVFRFNfUkVBTExPQ0FUSU9OIHx8ICFzbG90QnVmZmVyKSB7CisgICAgICAgICAgICBpZiAoIXNsb3RCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBzbG90QnVmZmVyID0gbmV3IEdyYXBoaWNCdWZmZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE4uQi4gVGhpcyBhc3N1bWVzIHJlcXVlc3RCdWZmZXIjIHJldHVybnMgYW4gZXhpc3RpbmcgYWxsb2NhdGlvbgorICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiBhIG5ldyBhbGxvY2F0aW9uLgorICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbVByb2R1Y2VyLT5yZXF1ZXN0QnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBzbG90LAorICAgICAgICAgICAgICAgICAgICBbJnN0YXR1cywgJnNsb3RCdWZmZXJdKGludDMyX3QgdFN0YXR1cywgQW53QnVmZmVyIGNvbnN0JiB0QnVmZmVyKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRTdGF0dXM7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFuZHJvaWQ6OmNvbnZlcnNpb246OmNvbnZlcnRUbyhzbG90QnVmZmVyLmdldCgpLCB0QnVmZmVyKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPT0gYW5kcm9pZDo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBhbmRyb2lkOjpCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBhbmRyb2lkOjpOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHNsb3RCdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAodm9pZCltUHJvZHVjZXItPmNhbmNlbEJ1ZmZlcihzbG90LCBmZW5jZUhhbmRsZSkuaXNPaygpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNsb3RCdWZmZXIpIHsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqZ3JhbGxvY0hhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY2xvbmUoc2xvdEJ1ZmZlci0+aGFuZGxlKTsKKworICAgICAgICAgICAgaWYgKGdyYWxsb2NIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiYnVmZmVyIHdyYXBzICVsbHUgJWQiLCAodW5zaWduZWQgbG9uZyBsb25nKW1Qcm9kdWNlcklkLCBzbG90KTsKKyAgICAgICAgICAgICAgICBDMkhhbmRsZSAqYzJIYW5kbGUgPSBhbmRyb2lkOjpXcmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyYWxsb2NIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBzbG90QnVmZmVyLT53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXItPmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXItPmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXItPnVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlci0+c3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlci0+Z2V0R2VuZXJhdGlvbk51bWJlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgbVByb2R1Y2VySWQsIHNsb3QpOworICAgICAgICAgICAgICAgIGlmIChjMkhhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlZCBldmVyeXRoaW5nIHRvIGMySGFuZGxlLgorICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShncmFsbG9jSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IGFsbG9jOworICAgICAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQWxsb2NhdG9yLT5wcmlvckdyYXBoaWNBbGxvY2F0aW9uKGMySGFuZGxlLCAmYWxsb2MpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlci0+Z2V0R2VuZXJhdGlvbk51bWJlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByb2R1Y2VySWQsIHNsb3QsIHNoYXJlZF9mcm9tX3RoaXMoKSk7CisgICAgICAgICAgICAgICAgICAgICpibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jLCBwb29sRGF0YSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShncmFsbG9jSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShncmFsbG9jSGFuZGxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEJsb2NrIHdhcyBub3QgY3JlYXRlZC4gY2FsbCByZXF1ZXN0QnVmZmVyIyBhZ2FpbiBuZXh0IHRpbWUuCisgICAgICAgICAgICBzbG90QnVmZmVyLmNsZWFyKCk7CisgICAgICAgICAgICAodm9pZCltUHJvZHVjZXItPmNhbmNlbEJ1ZmZlcihzbG90LCBmZW5jZUhhbmRsZSkuaXNPaygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCitwdWJsaWM6CisgICAgSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IpCisgICAgICAgIDogbUluaXQoQzJfT0spLCBtUHJvZHVjZXJJZCgwKSwgbUFsbG9jYXRvcihhbGxvY2F0b3IpIHsKKyAgICB9CisKKyAgICB+SW1wbCgpIHsKKyAgICAgICAgYm9vbCBub0luaXQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fQlVGRkVSX1NMT1RTOyArK2kpIHsKKyAgICAgICAgICAgIGlmICghbm9Jbml0ICYmIG1Qcm9kdWNlcikgeworICAgICAgICAgICAgICAgIFJldHVybjxpbnQzMl90PiB0cmFuc1Jlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgICAgICBtUHJvZHVjZXItPmRldGFjaEJ1ZmZlcihzdGF0aWNfY2FzdDxpbnQzMl90PihpKSk7CisgICAgICAgICAgICAgICAgbm9Jbml0ID0gIXRyYW5zUmVzdWx0LmlzT2soKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHRyYW5zUmVzdWx0KSA9PSBhbmRyb2lkOjpOT19JTklUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJ1ZmZlcnNbaV0uY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGMyX3N0YXR1c190IGZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsCisgICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgeworICAgICAgICBibG9jay0+cmVzZXQoKTsKKyAgICAgICAgaWYgKG1Jbml0ICE9IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgaW50IGtNYXhJZ2JwUmV0cnkgPSAyMDsgLy8gVE9ETzogc21hbGwgbnVtYmVyIGNhbiBjYXVzZSBjcmFzaCBpbiByZWxlYXNpbmcuCisgICAgICAgIHN0YXRpYyBpbnQga01heElnYnBSZXRyeURlbGF5VXMgPSAxMDAwMDsKKworICAgICAgICBpbnQgY3VyVHJ5ID0gMDsKKworICAgICAgICB3aGlsZSAoY3VyVHJ5KysgPCBrTWF4SWdicFJldHJ5KSB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgICAgIC8vIFRPRE86IHJldHVybiBDMl9OT19JTklUCisgICAgICAgICAgICBpZiAobVByb2R1Y2VySWQgPT0gMCkgeworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQWxsb2NhdG9yLT5uZXdHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZhbGxvYyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAodWludDY0X3QpMCwgfjAsIHNoYXJlZF9mcm9tX3RoaXMoKSk7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogY29uZmlnPworICAgICAgICAgICAgICAgICpibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jLCBwb29sRGF0YSk7CisgICAgICAgICAgICAgICAgQUxPR1YoImFsbG9jYXRlZCBhIGJ1ZmZlciBzdWNjZXNzZnVsbHkiKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IGZldGNoRnJvbUlnYnBfbCh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCBibG9jayk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEMyX1RJTUVEX09VVCkgeworICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgOjp1c2xlZXAoa01heElnYnBSZXRyeURlbGF5VXMpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJfVElNRURfT1VUOworICAgIH0KKworICAgIHZvaWQgc2V0UmVuZGVyQ2FsbGJhY2soY29uc3QgT25SZW5kZXJDYWxsYmFjayAmcmVuZGVyQ2FsbGJhY2spIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgbVJlbmRlckNhbGxiYWNrID0gcmVuZGVyQ2FsbGJhY2s7CisgICAgfQorCisgICAgdm9pZCBjb25maWd1cmVQcm9kdWNlcihjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmcHJvZHVjZXIpIHsKKyAgICAgICAgaW50MzJfdCBzdGF0dXMgPSBhbmRyb2lkOjpPSzsKKyAgICAgICAgdWludDY0X3QgcHJvZHVjZXJJZCA9IDA7CisgICAgICAgIGlmIChwcm9kdWNlcikgeworICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gcHJvZHVjZXItPmdldFVuaXF1ZUlkKAorICAgICAgICAgICAgICAgICAgICBbJnN0YXR1cywgJnByb2R1Y2VySWRdKGludDMyX3QgdFN0YXR1cywgaW50NjRfdCB0UHJvZHVjZXJJZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdFN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y2VySWQgPSB0UHJvZHVjZXJJZDsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJjb25maWd1cmVQcm9kdWNlciAtLSBmYWlsZWQgdG8gY29ubmVjdCB0byB0aGUgcHJvZHVjZXIiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgICAgIGJvb2wgbm9Jbml0ID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9CVUZGRVJfU0xPVFM7ICsraSkgeworICAgICAgICAgICAgICAgIGlmICghbm9Jbml0ICYmIG1Qcm9kdWNlcikgeworICAgICAgICAgICAgICAgICAgICBSZXR1cm48aW50MzJfdD4gdHJhbnNSZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9kdWNlci0+ZGV0YWNoQnVmZmVyKHN0YXRpY19jYXN0PGludDMyX3Q+KGkpKTsKKyAgICAgICAgICAgICAgICAgICAgbm9Jbml0ID0gIXRyYW5zUmVzdWx0LmlzT2soKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90Pih0cmFuc1Jlc3VsdCkgPT0gYW5kcm9pZDo6Tk9fSU5JVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0uY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwcm9kdWNlciAmJiBzdGF0dXMgPT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgICAgICAgICBtUHJvZHVjZXIgPSBwcm9kdWNlcjsKKyAgICAgICAgICAgICAgICBtUHJvZHVjZXJJZCA9IHByb2R1Y2VySWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1Qcm9kdWNlciA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgbVByb2R1Y2VySWQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE7CisKKyAgICB2b2lkIGNhbmNlbCh1aW50NjRfdCBpZ2JwX2lkLCBpbnQzMl90IGlnYnBfc2xvdCkgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBpZiAoaWdicF9pZCA9PSBtUHJvZHVjZXJJZCAmJiBtUHJvZHVjZXIpIHsKKyAgICAgICAgICAgICh2b2lkKW1Qcm9kdWNlci0+Y2FuY2VsQnVmZmVyKGlnYnBfc2xvdCwgbnVsbHB0cikuaXNPaygpOworICAgICAgICB9CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgbUluaXQ7CisgICAgdWludDY0X3QgbVByb2R1Y2VySWQ7CisgICAgT25SZW5kZXJDYWxsYmFjayBtUmVuZGVyQ2FsbGJhY2s7CisKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisKKyAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtUHJvZHVjZXI7CisKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBtQnVmZmVyc1tOVU1fQlVGRkVSX1NMT1RTXTsKK307CisKK0MyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhOjpDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgYnFJZCwgaW50MzJfdCBicVNsb3QsCisgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBwcm9kdWNlcikgOgorICAgICAgICBoZWxkKHByb2R1Y2VyICYmIGJxSWQgIT0gMCksIGxvY2FsKGZhbHNlKSwKKyAgICAgICAgZ2VuZXJhdGlvbihnZW5lcmF0aW9uKSwgYnFJZChicUlkKSwgYnFTbG90KGJxU2xvdCksCisgICAgICAgIGlnYnAocHJvZHVjZXIpLAorICAgICAgICBsb2NhbFBvb2woKSB7Cit9CisKK0MyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhOjpDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgYnFJZCwgaW50MzJfdCBicVNsb3QsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpJbXBsPiYgcG9vbCkgOgorICAgICAgICBoZWxkKHRydWUpLCBsb2NhbCh0cnVlKSwKKyAgICAgICAgZ2VuZXJhdGlvbihnZW5lcmF0aW9uKSwgYnFJZChicUlkKSwgYnFTbG90KGJxU2xvdCksCisgICAgICAgIGlnYnAocG9vbCA/IHBvb2wtPm1Qcm9kdWNlciA6IG51bGxwdHIpLAorICAgICAgICBsb2NhbFBvb2wocG9vbCkgeworfQorCitDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YTo6fkMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhKCkgeworICAgIGlmICghaGVsZCB8fCBicUlkID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAobG9jYWwgJiYgbG9jYWxQb29sKSB7CisgICAgICAgIGxvY2FsUG9vbC0+Y2FuY2VsKGJxSWQsIGJxU2xvdCk7CisgICAgfSBlbHNlIGlmIChpZ2JwKSB7CisgICAgICAgIGlnYnAtPmNhbmNlbEJ1ZmZlcihicVNsb3QsIG51bGxwdHIpOworICAgIH0KK30KKworQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yLCBjb25zdCBsb2NhbF9pZF90IGxvY2FsSWQpCisgICAgICAgIDogbUFsbG9jYXRvcihhbGxvY2F0b3IpLCBtTG9jYWxJZChsb2NhbElkKSwgbUltcGwobmV3IEltcGwoYWxsb2NhdG9yKSkge30KKworQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6fkMyQnVmZmVyUXVldWVCbG9ja1Bvb2woKSB7fQorCitjMl9zdGF0dXNfdCBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsCisgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+ZmV0Y2hHcmFwaGljQmxvY2sod2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgYmxvY2spOworICAgIH0KKyAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworfQorCit2b2lkIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w6OmNvbmZpZ3VyZVByb2R1Y2VyKGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZwcm9kdWNlcikgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBtSW1wbC0+Y29uZmlndXJlUHJvZHVjZXIocHJvZHVjZXIpOworICAgIH0KK30KKwordm9pZCBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpzZXRSZW5kZXJDYWxsYmFjayhjb25zdCBPblJlbmRlckNhbGxiYWNrICZyZW5kZXJDYWxsYmFjaykgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBtSW1wbC0+c2V0UmVuZGVyQ2FsbGJhY2socmVuZGVyQ2FsbGJhY2spOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJEZWJ1Zy5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MyRGVidWcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YWE3MTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MyRGVidWcuY3BwCkBAIC0wLDAgKzEsMjc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPEMyUGFyYW1JbnRlcm5hbC5oPgorI2luY2x1ZGUgPHV0aWwvQzJEZWJ1Zy1pbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlsL0MyRGVidWctcGFyYW0uaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlVXRpbHMuaD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorCit1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGFzU3RyaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2NvbnN0IGNoYXIgKmFzU3RyaW5nKGMyX3N0YXR1c190IGksIGNvbnN0IGNoYXIgKmRlZikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIEMyX09LOiAgICAgICAgcmV0dXJuICJPSyI7CisgICAgICAgIGNhc2UgQzJfQkFEX1ZBTFVFOiByZXR1cm4gIkJBRF9WQUxVRSI7CisgICAgICAgIGNhc2UgQzJfQkFEX0lOREVYOiByZXR1cm4gIkJBRF9JTkRFWCI7CisgICAgICAgIGNhc2UgQzJfQ0FOTk9UX0RPOiByZXR1cm4gIkNBTk5PVF9ETyI7CisgICAgICAgIGNhc2UgQzJfRFVQTElDQVRFOiByZXR1cm4gIkRVUExJQ0FURSI7CisgICAgICAgIGNhc2UgQzJfTk9UX0ZPVU5EOiByZXR1cm4gIk5PVF9GT1VORCI7CisgICAgICAgIGNhc2UgQzJfQkFEX1NUQVRFOiByZXR1cm4gIkJBRF9TVEFURSI7CisgICAgICAgIGNhc2UgQzJfQkxPQ0tJTkc6ICByZXR1cm4gIkJMT0NLSU5HIjsKKyAgICAgICAgY2FzZSBDMl9DQU5DRUxFRDogIHJldHVybiAiQ0FOQ0VMRUQiOworICAgICAgICBjYXNlIEMyX05PX01FTU9SWTogcmV0dXJuICJOT19NRU1PUlkiOworICAgICAgICBjYXNlIEMyX1JFRlVTRUQ6ICAgcmV0dXJuICJSRUZVU0VEIjsKKyAgICAgICAgY2FzZSBDMl9USU1FRF9PVVQ6IHJldHVybiAiVElNRURfT1VUIjsKKyAgICAgICAgY2FzZSBDMl9PTUlUVEVEOiAgIHJldHVybiAiT01JVFRFRCI7CisgICAgICAgIGNhc2UgQzJfQ09SUlVQVEVEOiByZXR1cm4gIkNPUlJVUFRFRCI7CisgICAgICAgIGNhc2UgQzJfTk9fSU5JVDogICByZXR1cm4gIk5PX0lOSVQiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKK2NvbnN0IGNoYXIgKmFzU3RyaW5nKEMyRmllbGREZXNjcmlwdG9yOjp0eXBlX3QgaSwgY29uc3QgY2hhciAqZGVmKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkJMT0I6ICAgcmV0dXJuICJ1OCI7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkNOVFIzMjogcmV0dXJuICJjMzIiOworICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpDTlRSNjQ6IHJldHVybiAiYzY0IjsKKyAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6RkxPQVQ6ICByZXR1cm4gImZwIjsKKyAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UMzI6ICByZXR1cm4gImkzMiI7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDY0OiAgcmV0dXJuICJpNjQiOworICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpTVFJJTkc6IHJldHVybiAiY2hyIjsKKyAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDMyOiByZXR1cm4gInUzMiI7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQ2NDogcmV0dXJuICJ1NjQiOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gKGkgJiBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUcpID8gInN0cnVjdCIgOiBkZWY7CisgICAgfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJQYXJhbUZpZWxkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RkOjpzdHJpbmcgYXR0cmliUGFyYW1Db3JlSW5kZXgoY29uc3QgQzJQYXJhbTo6Q29yZUluZGV4ICZpKSB7CisgICAgcmV0dXJuIFN0cmluZ1ByaW50ZigiJWMlYyUwM3giLAorICAgICAgICAgICAgaS5pc0ZsZXhpYmxlKCkgPyAnRicgOiAnLScsCisgICAgICAgICAgICBpLmlzVmVuZG9yKCkgPyAnVicgOiAnLScsCisgICAgICAgICAgICBpLmNvcmVJbmRleCgpKTsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIGF0dHJpYlBhcmFtSW5kZXgoCisgICAgICAgIGNvbnN0IEMyUGFyYW06OlR5cGUgJmksIGJvb2wgYWRkU3RyZWFtLCB1bnNpZ25lZCBzdHJlYW1JZCkgeworICAgIHN0ZDo6c3RyaW5nIHYgPSBTdHJpbmdQcmludGYoIiVjJWMiLAorICAgICAgICAgICAgaS5mb3JJbnB1dCgpID8gJ0knIDogaS5mb3JPdXRwdXQoKSA/ICdPJyA6ICctJywKKyAgICAgICAgICAgIGkuZm9yU3RyZWFtKCkgPyAnUycgOiBpLmZvclBvcnQoKSA/ICdQJyA6ICdHJyk7CisgICAgaWYgKGFkZFN0cmVhbSkgeworICAgICAgICBpZiAoaS5mb3JTdHJlYW0oKSkgeworICAgICAgICAgICAgdiArPSBTdHJpbmdQcmludGYoIiUwMmQiLCBzdHJlYW1JZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2ICs9ICItLSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdgorICAgICAgICAgICAgKyBTdHJpbmdQcmludGYoIiVjICIsCisgICAgICAgICAgICAgICAgICAgICAgIGkua2luZCgpID09IEMyUGFyYW06OlNUUlVDVCAgPyAnUycgOgorICAgICAgICAgICAgICAgICAgICAgICBpLmtpbmQoKSA9PSBDMlBhcmFtOjpJTkZPICAgID8gJ2knIDoKKyAgICAgICAgICAgICAgICAgICAgICAgaS5raW5kKCkgPT0gQzJQYXJhbTo6VFVOSU5HICA/ICd0JyA6CisgICAgICAgICAgICAgICAgICAgICAgIGkua2luZCgpID09IEMyUGFyYW06OlNFVFRJTkcgPyAncycgOgorICAgICAgICAgICAgICAgICAgICAgICBpLmtpbmQoKSA9PSBDMlBhcmFtOjpOT05FICAgID8gJy0nIDogJz8nKQorICAgICAgICAgICAgKyBhdHRyaWJQYXJhbUNvcmVJbmRleChpKTsKK30KKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW06OkNvcmVJbmRleCAmaSkgeworICAgIHJldHVybiBvcyA8PCAiUGFyYW06OkNvcmVJbmRleCgiIDw8IGF0dHJpYlBhcmFtQ29yZUluZGV4KGkpIDw8ICIpIjsKK30KKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW06OlR5cGUgJmkpIHsKKyAgICByZXR1cm4gb3MgPDwgU3RyaW5nUHJpbnRmKCJQYXJhbTo6VHlwZSglMDh4OiAiLCBpLnR5cGUoKSkKKyAgICAgICAgICAgIDw8IGF0dHJpYlBhcmFtSW5kZXgoaSwgZmFsc2UsIDApIDw8ICIpIjsKK30KKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW06OkluZGV4ICZpKSB7CisgICAgcmV0dXJuIG9zIDw8IFN0cmluZ1ByaW50ZigiUGFyYW06OkluZGV4KCUwOHg6ICIsICh1aW50MzJfdClpKQorICAgICAgICAgICAgPDwgYXR0cmliUGFyYW1JbmRleChpLCB0cnVlLCBpLnN0cmVhbSgpKSA8PCAiKSI7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBhdHRyaWJGaWVsZElkKGNvbnN0IF9DMkZpZWxkSWQgJmkpIHsKKyAgICByZXR1cm4gU3RyaW5nUHJpbnRmKCJGaWVsZChAJTAyeCslMDJ4KSIsCisgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KGkpLAorICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldFNpemUoaSkpOworfQorCisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBfQzJGaWVsZElkICZpKSB7CisgICAgcmV0dXJuIG9zIDw8ICI8IiA8PCBhdHRyaWJGaWVsZElkKGkpIDw8ICI+IjsKK30KKworCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmkpIHsKKyAgICBvcyA8PCBhdHRyaWJGaWVsZElkKF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRGaWVsZChpKSkgPDwgIiAiOworICAgIGlmIChpLm5hbWVkVmFsdWVzKCkuc2l6ZSgpKSB7CisgICAgICAgIG9zIDw8ICJlbnVtICI7CisgICAgfQorICAgIHJldHVybiBvcyA8PCBhc1N0cmluZyhpLnR5cGUoKSkgPDwgIiAiIDw8IGkubmFtZSgpCisgICAgICAgICAgICA8PCBTdHJpbmdQcmludGYoIlslenVdIiwgaS5leHRlbnQoKSk7Cit9CisKKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW1GaWVsZCAmaSkgeworICAgIG9zIDw8ICI8IiA8PCBDMlBhcmFtOjpJbmRleChfQzJQYXJhbUluc3BlY3Rvcjo6R2V0SW5kZXgoaSkpCisgICAgICAgICAgICA8PCBTdHJpbmdQcmludGYoIjo6RmllbGQoQCUwMngrJTAyeCk+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRTaXplKGkpKTsKKyAgICByZXR1cm4gb3M7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gX0MyRmllbGRWYWx1ZUhlbHBlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGQ6Om9zdHJlYW0mIF9DMkZpZWxkVmFsdWVIZWxwZXI8Y2hhcj46OnB1dChzdGQ6Om9zdHJlYW0gJm9zLCBjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnApIHsKKyAgICBpZiAoaXNwcmludChwLmkzMikpIHsKKyAgICAgICAgcmV0dXJuIG9zIDw8IFN0cmluZ1ByaW50ZigiJyVjJyIsIHAuaTMyKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gb3MgPDwgU3RyaW5nUHJpbnRmKCInXFx4JTAyeCciLCAodWludDMyX3QpcC5pMzIpOworICAgIH0KK30KKworc3RkOjpvc3RyZWFtJiBfQzJGaWVsZFZhbHVlSGVscGVyPHVpbnQ4X3Q+OjpwdXQoc3RkOjpvc3RyZWFtICZvcywgY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZwKSB7CisgICAgcmV0dXJuIG9zIDw8IFN0cmluZ1ByaW50ZigiMHglMDJ4IiwgcC51MzIpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSAmb3MsIGNvbnN0IGMyX2NudHJfdDxUPiAmdikgeworICAgIHJldHVybiBvcyA8PCAiY3RyKCIgPDwgdi5wZWVrdSgpIDw8ICIpIjsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPFQ+ICZpKSB7CisgICAgb3MgPDwgIlJhbmdlKCI7CisgICAgX0MyRmllbGRWYWx1ZUhlbHBlcjxUPjo6cHV0KG9zLCBpLm1pbigpKTsKKyAgICBvcyA8PCAiLi4iOworICAgIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OnB1dChvcywgaS5tYXgoKSk7CisgICAgb3MgPDwgIiAqPSAiIDw8IGkubnVtKCkgPDwgIiAvPSAiIDw8IGkuZGVub20oKSA8PCAiICs9ICIgPDwgaS5zdGVwKCkgPDwgIikiOworICAgIHJldHVybiBvczsKK30KK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPGNoYXI+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPHVpbnQ4X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPGludDMyX3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPHVpbnQzMl90PiAmaSk7CisvL3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPGMyX2NudHIzMl90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxpbnQ2NF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTx1aW50NjRfdD4gJmkpOworLy90ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxjMl9jbnRyNjRfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8ZmxvYXQ+ICZpKTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPFQ+ICZpKSB7CisgICAgb3MgPDwgIkZsYWdzWyI7CisgICAgaWYgKCFpLmlzRW1wdHkoKSkgeworICAgICAgICBvcyA8PCAibWluPSI7CisgICAgICAgIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OnB1dChvcywgaS5taW4oKSk7CisgICAgfQorICAgIGJvb2wgY29tbWEgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IFQgJnYgOiBpLmZsYWdzKCkpIHsKKyAgICAgICAgaWYgKGNvbW1hKSB7CisgICAgICAgICAgICBvcyA8PCAiLCAiOworICAgICAgICB9CisgICAgICAgIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OnB1dChvcywgdik7CisgICAgICAgIGNvbW1hID0gdHJ1ZTsKKyAgICB9CisgICAgb3MgPDwgIl0iOworICAgIHJldHVybiBvczsKK30KK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPGNoYXI+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPHVpbnQ4X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPGludDMyX3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPHVpbnQzMl90PiAmaSk7CisvL3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPGMyX2NudHIzMl90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxpbnQ2NF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczx1aW50NjRfdD4gJmkpOworLy90ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxjMl9jbnRyNjRfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8ZmxvYXQ+ICZpKTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+ICZpKSB7CisgICAgb3MgPDwgIlZhbHVlc1siOworICAgIGJvb2wgY29tbWEgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IFQgJnYgOiBpLnZhbHVlcygpKSB7CisgICAgICAgIGlmIChjb21tYSkgeworICAgICAgICAgICAgb3MgPDwgIiwgIjsKKyAgICAgICAgfQorICAgICAgICBfQzJGaWVsZFZhbHVlSGVscGVyPFQ+OjpwdXQob3MsIHYpOworICAgICAgICBjb21tYSA9IHRydWU7CisgICAgfQorICAgIG9zIDw8ICJdIjsKKyAgICByZXR1cm4gb3M7Cit9Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxjaGFyPiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDx1aW50OF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxpbnQzMl90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDx1aW50MzJfdD4gJmkpOworLy90ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxjMl9jbnRyMzJfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8aW50NjRfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8dWludDY0X3Q+ICZpKTsKKy8vdGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8YzJfY250cjY0X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PGZsb2F0PiAmaSk7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6SW1wbCB7CisgICAgSW1wbChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWx1ZXMpOworCitwcml2YXRlOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgX0MyRmllbGRWYWx1ZUhlbHBlcjxUPjo6VmFsdWVUeXBlIFZhbHVlVHlwZTsKKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjp0eXBlX3QgX21UeXBlOworICAgIEMyU3VwcG9ydGVkUmFuZ2U8VmFsdWVUeXBlPiBfbVJhbmdlOworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VmFsdWVUeXBlPiBfbVZhbHVlczsKKyAgICBDMlN1cHBvcnRlZEZsYWdzPFZhbHVlVHlwZT4gX21GbGFnczsKKworcHVibGljOgorLy8gICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCA8VD4oc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6SW1wbCAmaSk7CisvLyAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEltcGwgJmkpOworICAgIHN0ZDo6b3N0cmVhbSYgc3RyZWFtT3V0KHN0ZDo6b3N0cmVhbSYgb3MpIGNvbnN0OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6SW1wbDo6c3RyZWFtT3V0KHN0ZDo6b3N0cmVhbSYgb3MpIGNvbnN0IHsKKyAgICBpZiAoX21UeXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlJBTkdFKSB7CisgICAgICAgIG9zIDw8IF9tUmFuZ2U7CisgICAgfSBlbHNlIGlmIChfbVR5cGUgPT0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6VkFMVUVTKSB7CisgICAgICAgIG9zIDw8IF9tVmFsdWVzOworICAgIH0gZWxzZSBpZiAoX21UeXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OkZMQUdTKSB7CisgICAgICAgIG9zIDw8IF9tRmxhZ3M7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3MgPDwgIlVua25vd24gRlNWIHR5cGU6ICIgPDwgKHVpbnQzMl90KV9tVHlwZTsKKyAgICB9CisgICAgcmV0dXJuIG9zOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4gJmkpIHsKKyAgICByZXR1cm4gaS5fbUltcGwtPnN0cmVhbU91dChvcyk7Cit9Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxjaGFyPiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjx1aW50OF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxpbnQzMl90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjx1aW50MzJfdD4gJmkpOworLy90ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxjMl9jbnRyMzJfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8aW50NjRfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8dWludDY0X3Q+ICZpKTsKKy8vdGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8YzJfY250cjY0X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPGZsb2F0PiAmaSk7CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJJbnRlcmZhY2VIZWxwZXIuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkludGVyZmFjZUhlbHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ0N2ZiZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJJbnRlcmZhY2VIZWxwZXIuY3BwCkBAIC0wLDAgKzEsODQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBhcmFtSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CisKK3VzaW5nIDo6YW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVmbGVjdG9ySGVscGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIEMyUmVmbGVjdG9ySGVscGVyOjphZGRTdHJ1Y3REZXNjcmlwdG9ycygKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJ1Y3REZXNjcmlwdG9yPiAmc3RydWN0cywgX1R1cGxlPD4gKikgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKF9tTXV0ZXgpOworICAgIGZvciAoQzJTdHJ1Y3REZXNjcmlwdG9yICZzdHJ1a3QgOiBzdHJ1Y3RzKSB7CisgICAgICAgIC8vIFRPRE86IGNoZWNrIGlmIHN0cnVjdHVyZSBkZXNjcmlwdGlvbnMgY29uZmxpY3Qgd2l0aCBleGlzdGluZyBvbmVzCisgICAgICAgIGFkZFN0cnVjdERlc2NyaXB0b3Ioc3RkOjptb3ZlKHN0cnVrdCkpOworICAgIH0KK30KKworc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4KK0MyUmVmbGVjdG9ySGVscGVyOjpkZXNjcmliZShDMlBhcmFtOjpDb3JlSW5kZXggcGFyYW1JbmRleCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKF9tTXV0ZXgpOworICAgIGF1dG8gaXQgPSBfbVN0cnVjdHMuZmluZChwYXJhbUluZGV4KTsKKyAgICBpZiAoaXQgPT0gX21TdHJ1Y3RzLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEMyU3RydWN0RGVzY3JpcHRvcj4oaXQtPnNlY29uZCk7CisgICAgfQorfTsKKwordm9pZCBDMlJlZmxlY3RvckhlbHBlcjo6YWRkU3RydWN0RGVzY3JpcHRvcihDMlN0cnVjdERlc2NyaXB0b3IgJiZzdHJ1a3QpIHsKKyAgICBpZiAoX21TdHJ1Y3RzLmZpbmQoc3RydWt0LmNvcmVJbmRleCgpKSAhPSBfbVN0cnVjdHMuZW5kKCkpIHsKKyAgICAgICAgLy8gYWxyZWFkeSBhZGRlZAorICAgICAgICAvLyBUT0RPOiB2YWxpZGF0ZSB0aGF0IGRlc2NyaXB0b3IgbWF0Y2hlcyBzdG9yZWQgZGVzY3JpcHRvcgorICAgIH0KKyAgICAvLyB2YWxpZGF0ZSB0aGF0IGFsbCBzdHJ1Y3QgZmllbGRzIGFyZSBrbm93biB0byB0aGlzIHJlZmxlY3RvcgorICAgIGZvciAoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZkIDogc3RydWt0KSB7CisgICAgICAgIGlmIChmZC50eXBlKCkgJiBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUcpIHsKKyAgICAgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBjb3JlSW5kZXggPSBmZC50eXBlKCkgJn4gQzJGaWVsZERlc2NyaXB0b3I6OlNUUlVDVF9GTEFHOworICAgICAgICAgICAgaWYgKF9tU3RydWN0cy5maW5kKGNvcmVJbmRleCkgPT0gX21TdHJ1Y3RzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgQzJfTE9HKElORk8pIDw8ICJtaXNzaW5nIHN0cnVjdCBkZXNjcmlwdG9yICMiIDw8IGNvcmVJbmRleCA8PCAiIGZvciBmaWVsZCAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBmZC5uYW1lKCkgPDwgIiBvZiBzdHJ1Y3QgIyIgPDwgc3RydWt0LmNvcmVJbmRleCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIF9tU3RydWN0cy5lbXBsYWNlKHN0cnVrdC5jb3JlSW5kZXgoKSwgc3RydWt0KTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhcmFtSGVscGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworY2xhc3MgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpJbXBsIHsKK3B1YmxpYzoKKyAgICBJbXBsKFBhcmFtUmVmIHBhcmFtLCBDMlN0cmluZ0xpdGVyYWwgbmFtZSwgQzJTdHJ1Y3REZXNjcmlwdG9yICYmc3RydWt0KQorICAgICAgICA6IG1QYXJhbShwYXJhbSksIG1OYW1lKG5hbWUpLCBfbVN0cnVjdChzdHJ1a3QpIHsgfQorCisgICAgSW1wbChJbXBsJiYpID0gZGVmYXVsdDsKKworICAgIHZvaWQgYWRkRG93bkRlcGVuZGVuY3koQzJQYXJhbTo6SW5kZXggaW5kZXgpIHsKKyAgICAgICAgbURvd25EZXBlbmRlbmNpZXMucHVzaF9iYWNrKGluZGV4KTsKKyAgICB9CisKKyAgICBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmF0dHJpYl90JiBhdHRyaWIoKSB7CisgICAgICAgIHJldHVybiBtQXR0cmliOworICAgIH0KKworICAgIHZvaWQgYnVpbGQoKSB7CisgICAgICAgIC8vIG1vdmUgZGVwZW5kZW5jaWVzIGludG8gZGVzY3JpcHRvcgorICAgICAgICBtRGVzY3JpcHRvciA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQYXJhbURlc2NyaXB0b3I+KAorICAgICAgICAgICAgICAgIGluZGV4KCksIChDMlBhcmFtRGVzY3JpcHRvcjo6YXR0cmliX3QpbUF0dHJpYiwKKyAgICAgICAgICAgICAgICBzdGQ6Om1vdmUobU5hbWUpLCBzdGQ6Om1vdmUobURlcGVuZGVuY2llcykpOworICAgIH0KKworICAgIHZvaWQgY3JlYXRlRmllbGRzQW5kU3VwcG9ydGVkVmFsdWVzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKSB7CisgICAgICAgIGZvciAoY29uc3QgQzJGaWVsZFV0aWxzOjpJbmZvICZmIDoKKyAgICAgICAgICAgICAgICBDMkZpZWxkVXRpbHM6OmVudW1lcmF0ZUZpZWxkcygqbURlZmF1bHRWYWx1ZSwgcmVmbGVjdG9yKSkgeworICAgICAgICAgICAgaWYgKCFmLmlzQXJpdGhtZXRpYygpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gZnN2UG9pbnRlcjsKKworICAgICAgICAgICAgLy8gY3JlYXRlIGEgYnJlYWthYmxlIHN0cnVjdHVyZQorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgZnN2OworICAgICAgICAgICAgICAgIHN3aXRjaCAoZi50eXBlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UMzI6ICBmc3YgPSBDMlN1cHBvcnRlZFJhbmdlPGludDMyX3Q+OjpBbnkoKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQzMjogZnN2ID0gQzJTdXBwb3J0ZWRSYW5nZTx1aW50MzJfdD46OkFueSgpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UNjQ6ICBmc3YgPSBDMlN1cHBvcnRlZFJhbmdlPGludDY0X3Q+OjpBbnkoKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQ2NDogZnN2ID0gQzJTdXBwb3J0ZWRSYW5nZTx1aW50NjRfdD46OkFueSgpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6RkxPQVQ6ICBmc3YgPSBDMlN1cHBvcnRlZFJhbmdlPGZsb2F0Pjo6QW55KCk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpCTE9COiAgIGZzdiA9IEMyU3VwcG9ydGVkUmFuZ2U8dWludDhfdD46OkFueSgpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSSU5HOiBmc3YgPSBDMlN1cHBvcnRlZFJhbmdlPGNoYXI+OjpBbnkoKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGJyZWFrIG91dCBvZiBkbyB7fSB3aGlsZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmc3ZQb2ludGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPihmc3YpOworICAgICAgICAgICAgfSB3aGlsZSAoZmFsc2UpOworCisgICAgICAgICAgICBtRmllbGRzLmVtcGxhY2VfaGludCgKKyAgICAgICAgICAgICAgICAgICAgbUZpZWxkcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgX0MyRmllbGRJZChmLm9mZnNldCgpLCBmLnNpemUoKSksCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8RmllbGRIZWxwZXI+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJhbSwgX0MyRmllbGRJZChmLm9mZnNldCgpLCBmLnNpemUoKSksIHN0ZDo6bW92ZShmc3ZQb2ludGVyKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZHMgYSBmaWVsZCBkZXNjcmlwdG9yLgorICAgICAqLworICAgIHN0ZDo6c2hhcmVkX3B0cjxGaWVsZEhlbHBlcj4gZmluZEZpZWxkKHNpemVfdCBiYXNlT2Zmcywgc2l6ZV90IGJhc2VTaXplKSBjb25zdCB7CisgICAgICAgIGF1dG8gaXQgPSBtRmllbGRzLmZpbmQoX0MyRmllbGRJZChiYXNlT2ZmcywgYmFzZVNpemUpKTsKKyAgICAgICAgaWYgKGl0ID09IG1GaWVsZHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIH0KKworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFBhcmFtUmVmPiBnZXREZXBlbmRlbmNpZXNBc1JlZnMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRGVwZW5kZW5jaWVzQXNSZWZzOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlBhcmFtRGVzY3JpcHRvcj4gZ2V0RGVzY3JpcHRvcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1EZXNjcmlwdG9yOworICAgIH0KKworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBnZXREb3duRGVwZW5kZW5jaWVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURvd25EZXBlbmRlbmNpZXM7CisgICAgfQorCisgICAgQzJQYXJhbTo6SW5kZXggaW5kZXgoKSBjb25zdCB7CisgICAgICAgIGlmICghbURlZmF1bHRWYWx1ZSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyBtaXNzaW5nIGRlZmF1bHQgdmFsdWVcbiIsIG1OYW1lLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtRGVmYXVsdFZhbHVlLT5pbmRleCgpOworICAgIH0KKworICAgIEMyU3RyaW5nIG5hbWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtTmFtZTsKKyAgICB9CisKKyAgICBjb25zdCBQYXJhbVJlZiByZWYoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUGFyYW07CisgICAgfQorCisgICAgQzJTdHJ1Y3REZXNjcmlwdG9yIHJldHJpZXZlU3RydWN0RGVzY3JpcHRvcigpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bW92ZShfbVN0cnVjdCk7CisgICAgfQorCisgICAgdm9pZCBzZXREZWZhdWx0VmFsdWUoc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IGRlZmF1bHRfKSB7CisgICAgICAgIG1EZWZhdWx0VmFsdWUgPSBkZWZhdWx0XzsKKyAgICB9CisKKyAgICB2b2lkIHNldERlcGVuZGVuY2llcyhzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlcywgc3RkOjp2ZWN0b3I8UGFyYW1SZWY+IHJlZnMpIHsKKyAgICAgICAgbURlcGVuZGVuY2llcyA9IGluZGljZXM7CisgICAgICAgIG1EZXBlbmRlbmNpZXNBc1JlZnMgPSByZWZzOworICAgIH0KKworICAgIHZvaWQgc2V0RmllbGRzKHN0ZDo6dmVjdG9yPEMyUGFyYW1GaWVsZFZhbHVlcz4gJiZmaWVsZHMpIHsKKyAgICAgICAgLy8gZG8gbm90IGFsbG93IGFkZGluZyBmaWVsZHMgbXVsdGlwbGUgdGltZXMsIG9yIHRvIGNvbnN0IHZhbHVlcworICAgICAgICBpZiAoIW1GaWVsZHMuZW1wdHkoKSkgeworICAgICAgICAgICAgQzJfTE9HKEZBVEFMKSA8PCAiVHJ5aW5nIHRvIGFkZCBmaWVsZHMgdG8gcGFyYW0gIiA8PCBtTmFtZSA8PCAiIG11bHRpcGxlIHRpbWVzIjsKKyAgICAgICAgfSBlbHNlIGlmIChtQXR0cmliICYgYXR0cmliX3Q6OklTX0NPTlNUKSB7CisgICAgICAgICAgICBDMl9MT0coRkFUQUwpIDw8ICJUcnlpbmcgdG8gYWRkIGZpZWxkcyB0byBjb25zdCBwYXJhbSAiIDw8IG1OYW1lOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChDMlBhcmFtRmllbGRWYWx1ZXMgJnBmdiA6IGZpZWxkcykgeworICAgICAgICAgICAgbUZpZWxkcy5lbXBsYWNlX2hpbnQoCisgICAgICAgICAgICAgICAgICAgIG1GaWVsZHMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgIC8vIF9DMkZpZWxkSWQgY29uc3RydWN0b3IKKyAgICAgICAgICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldEZpZWxkKHBmdi5wYXJhbU9yRmllbGQpLAorICAgICAgICAgICAgICAgICAgICAvLyBGaWVsZCBjb25zdHJ1Y3RvcgorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEZpZWxkSGVscGVyPihtUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRGaWVsZChwZnYucGFyYW1PckZpZWxkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHBmdi52YWx1ZXMpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHNldEdldHRlcihzdGQ6OmZ1bmN0aW9uPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPihib29sKT4gZ2V0dGVyKSB7CisgICAgICAgIG1HZXR0ZXIgPSBnZXR0ZXI7CisgICAgfQorCisgICAgdm9pZCBzZXRTZXR0ZXIoc3RkOjpmdW5jdGlvbjxDMlIoY29uc3QgQzJQYXJhbSAqLCBib29sLCBib29sICosIEZhY3RvcnkgJik+IHNldHRlcikgeworICAgICAgICBtU2V0dGVyID0gc2V0dGVyOworICAgIH0KKworICAgIGMyX3N0YXR1c190IHRyeVNldCgKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gKnZhbHVlLCBib29sIG1heUJsb2NrLCBib29sICpjaGFuZ2VkLCBGYWN0b3J5ICZmLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcykgeworICAgICAgICBDMlIgcmVzdWx0ID0gbVNldHRlcih2YWx1ZSwgbWF5QmxvY2ssIGNoYW5nZWQsIGYpOworICAgICAgICByZXR1cm4gcmVzdWx0LnJldHJpZXZlRmFpbHVyZXMoZmFpbHVyZXMpOworICAgIH0KKworICAgIGMyX3N0YXR1c190IHZhbGlkYXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKSB7CisgICAgICAgIGlmICghbVNldHRlciAmJiBtRmllbGRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEMyX0xPRyhXQVJOSU5HKSA8PCAiUGFyYW0gIiA8PCBtTmFtZSA8PCAiIGhhcyBubyBzZXR0ZXIsIG1ha2luZyBpdCBjb25zdCI7CisgICAgICAgICAgICAvLyBkZXBlbmRlbmNpZXMgYXJlIGVtcHR5IGluIHRoaXMgY2FzZQorICAgICAgICAgICAgbUF0dHJpYiB8PSBhdHRyaWJfdDo6SVNfQ09OU1Q7CisgICAgICAgIH0gZWxzZSBpZiAoIW1TZXR0ZXIpIHsKKyAgICAgICAgICAgIEMyX0xPRyhGQVRBTCkgPDwgIlBhcmFtICIgPDwgbU5hbWUgPDwgIiBoYXMgbm8gc2V0dGVyIjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtQXR0cmliICYgYXR0cmliX3Q6OklTX0NPTlNUKSB7CisgICAgICAgICAgICBjcmVhdGVGaWVsZHNBbmRTdXBwb3J0ZWRWYWx1ZXMocmVmbGVjdG9yKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHVwZGF0ZSBkZWZhdWx0IGJhc2VkIG9uIHNldHRlciBhbmQgdmVyaWZ5IHRoYXQgRlNWIGNvdmVycyB0aGUgdmFsdWVzCisgICAgICAgIH0KKworICAgICAgICBpZiAobUZpZWxkcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBDMl9MT0coRkFUQUwpIDw8ICJQYXJhbSAiIDw8IG1OYW1lIDw8ICIgaGFzIG5vIGZpZWxkcyI7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IHZhbHVlKCkgeworICAgICAgICByZXR1cm4gbVBhcmFtLmdldCgpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlBhcmFtPiB2YWx1ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1QYXJhbS5nZXQoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBfQzJQYXJhbUluc3BlY3Rvcjo6YXR0cmliX3QgYXR0cmliX3Q7CisgICAgUGFyYW1SZWYgbVBhcmFtOworICAgIEMyU3RyaW5nIG1OYW1lOworICAgIEMyU3RydWN0RGVzY3JpcHRvciBfbVN0cnVjdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gbURlZmF1bHRWYWx1ZTsKKyAgICBhdHRyaWJfdCBtQXR0cmliOworICAgIHN0ZDo6ZnVuY3Rpb248QzJSKGNvbnN0IEMyUGFyYW0gKiwgYm9vbCwgYm9vbCAqLCBGYWN0b3J5ICYpPiBtU2V0dGVyOworICAgIHN0ZDo6ZnVuY3Rpb248c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+KGJvb2wpPiBtR2V0dGVyOworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBtRGVwZW5kZW5jaWVzOworICAgIHN0ZDo6dmVjdG9yPFBhcmFtUmVmPiBtRGVwZW5kZW5jaWVzQXNSZWZzOworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBtRG93bkRlcGVuZGVuY2llczsgLy8gVE9ETzogdGhpcyBkb2VzIG5vdCB3b3JrIGZvciBzdHJlYW0gZGVwZW5kZW5jaWVzCisgICAgc3RkOjptYXA8X0MyRmllbGRJZCwgc3RkOjpzaGFyZWRfcHRyPEZpZWxkSGVscGVyPj4gbUZpZWxkczsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+IG1EZXNjcmlwdG9yOworfTsKKworQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpQYXJhbUhlbHBlcigKKyAgICAgICAgUGFyYW1SZWYgcGFyYW0sIEMyU3RyaW5nTGl0ZXJhbCBuYW1lLCBDMlN0cnVjdERlc2NyaXB0b3IgJiZzdHJ1a3QpCisgICAgOiBtSW1wbChzdGQ6Om1ha2VfdW5pcXVlPEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6SW1wbD4oCisgICAgICAgICAgICBwYXJhbSwgbmFtZSwgc3RkOjptb3ZlKHN0cnVrdCkpKSB7IH0KKworQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpQYXJhbUhlbHBlcihDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXIgJiYpID0gZGVmYXVsdDsKKworQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjp+UGFyYW1IZWxwZXIoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjphZGREb3duRGVwZW5kZW5jeShDMlBhcmFtOjpJbmRleCBpbmRleCkgeworICAgIHJldHVybiBtSW1wbC0+YWRkRG93bkRlcGVuZGVuY3koaW5kZXgpOworfQorCitDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmF0dHJpYl90JiBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmF0dHJpYigpIHsKKyAgICByZXR1cm4gbUltcGwtPmF0dHJpYigpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyPiBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmJ1aWxkKCkgeworICAgIG1JbXBsLT5idWlsZCgpOworICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcj4oc3RkOjptb3ZlKCp0aGlzKSk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkludGVyZmFjZUhlbHBlcjo6RmllbGRIZWxwZXI+CitDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmZpbmRGaWVsZChzaXplX3QgYmFzZU9mZnMsIHNpemVfdCBiYXNlU2l6ZSkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+ZmluZEZpZWxkKGJhc2VPZmZzLCBiYXNlU2l6ZSk7Cit9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbVJlZj4KK0MySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6Z2V0RGVwZW5kZW5jaWVzQXNSZWZzKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0RGVwZW5kZW5jaWVzQXNSZWZzKCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlBhcmFtRGVzY3JpcHRvcj4KK0MySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6Z2V0RGVzY3JpcHRvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldERlc2NyaXB0b3IoKTsKK30KKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6Z2V0RG93bkRlcGVuZGVuY2llcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldERvd25EZXBlbmRlbmNpZXMoKTsKK30KKworQzJQYXJhbTo6SW5kZXggQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjppbmRleCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmluZGV4KCk7Cit9CisKK0MyU3RyaW5nIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6bmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPm5hbWUoKTsKK30KKworY29uc3QgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtUmVmIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6cmVmKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+cmVmKCk7Cit9CisKK0MyU3RydWN0RGVzY3JpcHRvciBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnJldHJpZXZlU3RydWN0RGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gbUltcGwtPnJldHJpZXZlU3RydWN0RGVzY3JpcHRvcigpOworfQorCit2b2lkIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6c2V0RGVmYXVsdFZhbHVlKHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBkZWZhdWx0XykgeworICAgIG1JbXBsLT5zZXREZWZhdWx0VmFsdWUoZGVmYXVsdF8pOworfQorCit2b2lkIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6c2V0RGVwZW5kZW5jaWVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlcywgc3RkOjp2ZWN0b3I8UGFyYW1SZWY+IHJlZnMpIHsKKyAgICBtSW1wbC0+c2V0RGVwZW5kZW5jaWVzKGluZGljZXMsIHJlZnMpOworfQorCit2b2lkIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6c2V0RmllbGRzKHN0ZDo6dmVjdG9yPEMyUGFyYW1GaWVsZFZhbHVlcz4gJiZmaWVsZHMpIHsKKyAgICByZXR1cm4gbUltcGwtPnNldEZpZWxkcyhzdGQ6Om1vdmUoZmllbGRzKSk7Cit9CisKK3ZvaWQgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpzZXRHZXR0ZXIoCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+KGJvb2wpPiBnZXR0ZXIpIHsKKyAgICBtSW1wbC0+c2V0R2V0dGVyKGdldHRlcik7Cit9CisKK3ZvaWQgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpzZXRTZXR0ZXIoCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248QzJSKGNvbnN0IEMyUGFyYW0gKiwgYm9vbCwgYm9vbCAqLCBGYWN0b3J5ICYpPiBzZXR0ZXIpIHsKKyAgICBtSW1wbC0+c2V0U2V0dGVyKHNldHRlcik7Cit9CisKK2MyX3N0YXR1c190IEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6dHJ5U2V0KAorICAgICAgICBjb25zdCBDMlBhcmFtICp2YWx1ZSwgYm9vbCBtYXlCbG9jaywgYm9vbCAqY2hhbmdlZCwgRmFjdG9yeSAmZiwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcykgeworICAgIHJldHVybiBtSW1wbC0+dHJ5U2V0KHZhbHVlLCBtYXlCbG9jaywgY2hhbmdlZCwgZiwgZmFpbHVyZXMpOworfQorCitjMl9zdGF0dXNfdCBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnZhbGlkYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvcikgeworICAgIHJldHVybiBtSW1wbC0+dmFsaWRhdGUocmVmbGVjdG9yKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6dmFsdWUoKSB7CisgICAgcmV0dXJuIG1JbXBsLT52YWx1ZSgpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJQYXJhbT4gQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjp2YWx1ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPnZhbHVlKCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmllbGRIZWxwZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitDMlBhcmFtRmllbGQgQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkSGVscGVyOjptYWtlUGFyYW1GaWVsZChDMlBhcmFtOjpJbmRleCBpbmRleCkgY29uc3QgeworICAgIHJldHVybiBfQzJQYXJhbUluc3BlY3Rvcjo6Q3JlYXRlUGFyYW1GaWVsZChpbmRleCwgbUZpZWxkSWQpOworfQorCitDMkludGVyZmFjZUhlbHBlcjo6RmllbGRIZWxwZXI6OkZpZWxkSGVscGVyKGNvbnN0IFBhcmFtUmVmICZwYXJhbSwgY29uc3QgX0MyRmllbGRJZCAmZmllbGQsCisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gJiZ2YWx1ZXMpCisgICAgOiBtUGFyYW0ocGFyYW0pLAorICAgICAgbUZpZWxkSWQoZmllbGQpLAorICAgICAgbVBvc3NpYmxlKHN0ZDo6bW92ZSh2YWx1ZXMpKSB7CisgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJDcmVhdGluZyBmaWVsZCBoZWxwZXIgIiA8PCBmaWVsZCA8PCAiICIKKyAgICAgICAgICAgIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8dWludDMyX3Q+KCptUG9zc2libGUpOworfQorCit2b2lkIEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZEhlbHBlcjo6c2V0U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gJiZ2YWx1ZXMpIHsKKyAgICBtU3VwcG9ydGVkID0gc3RkOjptb3ZlKHZhbHVlcyk7Cit9CisKK2NvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgKkMySW50ZXJmYWNlSGVscGVyOjpGaWVsZEhlbHBlcjo6Z2V0U3VwcG9ydGVkVmFsdWVzKCkgY29uc3QgeworICAgIHJldHVybiAobVN1cHBvcnRlZCA/IG1TdXBwb3J0ZWQgOiBtUG9zc2libGUpLmdldCgpOworfQorCitjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICpDMkludGVyZmFjZUhlbHBlcjo6RmllbGRIZWxwZXI6OmdldFBvc3NpYmxlVmFsdWVzKCkgY29uc3QgeworICAgIHJldHVybiBtUG9zc2libGUuZ2V0KCk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGaWVsZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogV3JhcHBlciBhcm91bmQgZmllbGQtc3VwcG9ydGVkLXZhbHVlcyBidWlsZGVyIHRoYXQgZ2V0cyBzdG9yZWQgaW4gdGhlCisgKiBmaWVsZCBoZWxwZXIgd2hlbiB0aGUgYnVpbGRlciBnb2VzIG91dCBvZiBzY29wZS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBTdXBwb3J0ZWRWYWx1ZXNCdWlsZGVyIDogQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiB7CisgICAgU3VwcG9ydGVkVmFsdWVzQnVpbGRlcigKKyAgICAgICAgICAgIEMyUGFyYW1GaWVsZCAmZmllbGQsIHN0ZDo6c2hhcmVkX3B0cjxDMkludGVyZmFjZUhlbHBlcjo6RmllbGRIZWxwZXI+IGhlbHBlcikKKyAgICAgICAgOiBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+KGZpZWxkKSwgX21IZWxwZXIoaGVscGVyKSwgX21GaWVsZChmaWVsZCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFNhdmUgYnVpbGRlciB2YWx1ZXMgb24gZGVzdHJ1Y3Rpb24uCisgICAgICovCisgICAgdmlydHVhbCB+U3VwcG9ydGVkVmFsdWVzQnVpbGRlcigpIG92ZXJyaWRlIHsKKyAgICAgICAgX21IZWxwZXItPnNldFN1cHBvcnRlZFZhbHVlcyhzdGQ6Om1vdmUoQzJQYXJhbUZpZWxkVmFsdWVzKCp0aGlzKS52YWx1ZXMpKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZEhlbHBlcj4gX21IZWxwZXI7CisgICAgQzJQYXJhbUZpZWxkIF9tRmllbGQ7Cit9OworCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDxUPjo6c2hvdWxkQmUoKSBjb25zdCB7CisgICAgcmV0dXJuIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4oX21GaWVsZCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDxUPjo6bXVzdEJlKCkgeworICAgIHJldHVybiBTdXBwb3J0ZWRWYWx1ZXNCdWlsZGVyPFQ+KF9tRmllbGQsIF9tSGVscGVyKTsKK30KKworLyoKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyIEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDxUPjo6dmFsaWRhdGVQb3NzaWJsZShUICZ2YWx1ZSkKK2NvbnN0IHsKKyAgICAvLy8gVE9ETworICAgIHJldHVybiBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcjo6T2soKTsKK30KKyovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8VD46OkZpZWxkKHN0ZDo6c2hhcmVkX3B0cjxGaWVsZEhlbHBlcj4gaGVscGVyLCBDMlBhcmFtOjpJbmRleCBpbmRleCkKKyAgICA6IF9tSGVscGVyKGhlbHBlciksIF9tRmllbGQoaGVscGVyLT5tYWtlUGFyYW1GaWVsZChpbmRleCkpIHsgfQorCit0ZW1wbGF0ZSBzdHJ1Y3QgQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkPHVpbnQ4X3Q+OwordGVtcGxhdGUgc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDxjaGFyPjsKK3RlbXBsYXRlIHN0cnVjdCBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8aW50MzJfdD47Cit0ZW1wbGF0ZSBzdHJ1Y3QgQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkPHVpbnQzMl90PjsKKy8vdGVtcGxhdGUgc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDxjMl9jbnRyMzJfdD47Cit0ZW1wbGF0ZSBzdHJ1Y3QgQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkPGludDY0X3Q+OwordGVtcGxhdGUgc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDx1aW50NjRfdD47CisvL3RlbXBsYXRlIHN0cnVjdCBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8YzJfY250cjY0X3Q+OwordGVtcGxhdGUgc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDxmbG9hdD47CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGYWN0b3J5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgQzJJbnRlcmZhY2VIZWxwZXI6OkZhY3RvcnlJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyOjpGYWN0b3J5IHsKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBnZXRSZWZsZWN0b3IoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBfbVJlZmxlY3RvcjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4KKyAgICBnZXRQYXJhbUhlbHBlcihjb25zdCBQYXJhbVJlZiAmcGFyYW0pIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIF9tUGFyYW1zLmZpbmQocGFyYW0pLT5zZWNvbmQ7CisgICAgfQorCitwdWJsaWM6CisgICAgRmFjdG9yeUltcGwoc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IHJlZmxlY3RvcikKKyAgICAgICAgOiBfbVJlZmxlY3RvcihyZWZsZWN0b3IpIHsgfQorCisgICAgdmlydHVhbCB+RmFjdG9yeUltcGwoKSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIGFkZFBhcmFtKHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gcGFyYW0pIHsKKyAgICAgICAgX21QYXJhbXMuaW5zZXJ0KHsgcGFyYW0tPnJlZigpLCBwYXJhbSB9KTsKKyAgICAgICAgX21JbmRleFRvSGVscGVyLmluc2VydCh7cGFyYW0tPmluZGV4KCksIHBhcmFtfSk7CisKKyAgICAgICAgLy8gYWRkIGRvd24tZGVwZW5kZW5jaWVzIChhbmQgdmFsaWRhdGUgZGVwZW5kZW5jaWVzIGFzIGEgcmVzdWx0KQorICAgICAgICBzaXplX3QgaXggPSAwOworICAgICAgICBmb3IgKGNvbnN0IFBhcmFtUmVmICZyZWYgOiBwYXJhbS0+Z2V0RGVwZW5kZW5jaWVzQXNSZWZzKCkpIHsKKyAgICAgICAgICAgIC8vIGRlcGVuZGVuY2llcyBtdXN0IGFscmVhZHkgYmUgZGVmaW5lZAorICAgICAgICAgICAgaWYgKCFfbVBhcmFtcy5jb3VudChyZWYpKSB7CisgICAgICAgICAgICAgICAgQzJfTE9HKEZBVEFMKSA8PCAiUGFyYW1ldGVyICIgPDwgcGFyYW0tPm5hbWUoKSA8PCAiIGhhcyBhIGRlcGVuZGVuY3kgYXQgaW5kZXggIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgaXggPDwgIiB0aGF0IGlzIG5vdCB5ZXQgZGVmaW5lZCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfbVBhcmFtcy5maW5kKHJlZiktPnNlY29uZC0+YWRkRG93bkRlcGVuZGVuY3kocGFyYW0tPmluZGV4KCkpOworICAgICAgICAgICAgKytpeDsKKyAgICAgICAgfQorCisgICAgICAgIF9tRGVwZW5kZW5jeUluZGV4LmVtcGxhY2UocGFyYW0tPmluZGV4KCksIF9tRGVwZW5kZW5jeUluZGV4LnNpemUoKSk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBnZXRQYXJhbShDMlBhcmFtOjpJbmRleCBpeCkgY29uc3QgeworICAgICAgICAvLyBUT0RPOiBoYW5kbGUgc3RyZWFtcyBzZXBhcmF0ZWx5CisgICAgICAgIGNvbnN0IGF1dG8gaXQgPSBfbUluZGV4VG9IZWxwZXIuZmluZChpeCk7CisgICAgICAgIGlmIChpdCA9PSBfbUluZGV4VG9IZWxwZXIuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE86IHRoaXMgY291bGQgcmV0dXJuIGEgY29weSB1c2luZyBwcm9wZXIgcG9pbnRlciBjYXN0LgorICAgICAqLworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBnZXRQYXJhbVZhbHVlKEMyUGFyYW06OkluZGV4IGl4KSBjb25zdCB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gaGVscGVyID0gZ2V0UGFyYW0oaXgpOworICAgICAgICByZXR1cm4gaGVscGVyID8gaGVscGVyLT52YWx1ZSgpIDogbnVsbHB0cjsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICpjb25zdCBwYXJhbXMpIGNvbnN0IHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IF9tUGFyYW1zKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBjaGFuZ2UgcXVlcnlTdXBwb3J0ZWRQYXJhbXMgc2lnbmF0dXJlPworICAgICAgICAgICAgcGFyYW1zLT5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y29uc3RfcG9pbnRlcl9jYXN0PEMyUGFyYW1EZXNjcmlwdG9yPihpdC5zZWNvbmQtPmdldERlc2NyaXB0b3IoKSkpOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IGhhbmRsZSBlcnJvcnMKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHNpemVfdCBnZXREZXBlbmRlbmN5SW5kZXgoQzJQYXJhbTo6SW5kZXggaXgpIHsKKyAgICAgICAgLy8gaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBoZWxwZXIgdGhlcmUgaXMgb25seSBhIHNpbmdsZSBzdHJlYW0gc28KKyAgICAgICAgLy8gd2UgY2FuIGxvb2sgdXAgZGlyZWN0bHkgYnkgaW5kZXgKKyAgICAgICAgYXV0byBpdCA9IF9tRGVwZW5kZW5jeUluZGV4LmZpbmQoaXgpOworICAgICAgICByZXR1cm4gaXQgPT0gX21EZXBlbmRlbmN5SW5kZXguZW5kKCkgPyBTSVpFX01BWCA6IGl0LT5zZWNvbmQ7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6bWFwPFBhcmFtUmVmLCBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+PiBfbVBhcmFtczsKKyAgICBzdGQ6Om1hcDxDMlBhcmFtOjpJbmRleCwgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPj4gX21JbmRleFRvSGVscGVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBfbVJlZmxlY3RvcjsKKyAgICBzdGQ6Om1hcDxDMlBhcmFtOjpJbmRleCwgc2l6ZV90PiBfbURlcGVuZGVuY3lJbmRleDsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIZWxwZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK25hbWVzcGFjZSB7CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBhc1N0cmluZyhDMlBhcmFtICpwKSB7CisgICAgY2hhciBhZGRyWzIwXTsKKyAgICBzcHJpbnRmKGFkZHIsICIlcDpbIiwgcCk7CisgICAgc3RkOjpzdHJpbmcgdiA9IGFkZHI7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwLT5zaXplKCk7ICsraSkgeworICAgICAgICBjaGFyIGRbNF07CisgICAgICAgIHNwcmludGYoZCwgIiAlMDJ4IiwgKigoKHVpbnQ4X3QgKilwKSArIGkpKTsKKyAgICAgICAgdiArPSBkICsgKGkgPT0gMCk7CisgICAgfQorICAgIHJldHVybiB2ICsgIl0iOworfQorCit9CisKK0MySW50ZXJmYWNlSGVscGVyOjpDMkludGVyZmFjZUhlbHBlcihzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IHJlZmxlY3RvcikKKyAgICA6IG1SZWZsZWN0b3IocmVmbGVjdG9yKSwKKyAgICAgIF9tRmFjdG9yeShzdGQ6Om1ha2Vfc2hhcmVkPEZhY3RvcnlJbXBsPihyZWZsZWN0b3IpKSB7IH0KKworCitzaXplX3QgQzJJbnRlcmZhY2VIZWxwZXI6OkdldEJhc2VPZmZzZXQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IsCisgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCwgc2l6ZV90IG9mZnNldCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IHBhcmFtID0gcmVmbGVjdG9yLT5kZXNjcmliZShpbmRleCk7CisgICAgaWYgKHBhcmFtID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIH4oc2l6ZV90KTA7IC8vIHBhcmFtIHN0cnVjdHVyZSBub3QgZGVzY3JpYmVkCisgICAgfQorCisgICAgZm9yIChjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmllbGQgOiAqcGFyYW0pIHsKKyAgICAgICAgc2l6ZV90IGZpZWxkT2Zmc2V0ID0gX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldChmaWVsZCk7CisgICAgICAgIHNpemVfdCBmaWVsZFNpemUgPSBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0U2l6ZShmaWVsZCk7CisgICAgICAgIHNpemVfdCBmaWVsZEV4dGVudCA9IGZpZWxkLmV4dGVudCgpOworICAgICAgICBpZiAob2Zmc2V0IDwgZmllbGRPZmZzZXQpIHsKKyAgICAgICAgICAgIHJldHVybiB+KHNpemVfdCkwOyAvLyBub3QgZm91bmQKKyAgICAgICAgfQorICAgICAgICBpZiAob2Zmc2V0ID09IGZpZWxkT2Zmc2V0KSB7CisgICAgICAgICAgICAvLyBleGFjdCBtYXRjaAorICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmllbGQuZXh0ZW50KCkgPT0gMCB8fCBvZmZzZXQgPCBmaWVsZE9mZnNldCArIGZpZWxkU2l6ZSAqIGZpZWxkRXh0ZW50KSB7CisgICAgICAgICAgICAvLyByZWR1Y2UgdG8gZmlyc3QgZWxlbWVudCBpbiBjYXNlIG9mIGFycmF5CisgICAgICAgICAgICBvZmZzZXQgPSBmaWVsZE9mZnNldCArIChvZmZzZXQgLSBmaWVsZE9mZnNldCkgJSBmaWVsZFNpemU7CisgICAgICAgICAgICBpZiAoZmllbGQudHlwZSgpID49IEMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRykgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgb2Zmc2V0IGlzIHdpdGhpbiBhIGZpZWxkCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gR2V0QmFzZU9mZnNldCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZmxlY3RvciwgZmllbGQudHlwZSgpICYgfkMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRywKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCAtIGZpZWxkT2Zmc2V0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gfm9mZnNldCA/IGZpZWxkT2Zmc2V0ICsgb2Zmc2V0IDogb2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB+KHNpemVfdCkwOyAvLyBub3QgZm91bmQKK30KKwordm9pZCBDMkludGVyZmFjZUhlbHBlcjo6YWRkUGFyYW1ldGVyKHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gcGFyYW0pIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIG1SZWZsZWN0b3ItPmFkZFN0cnVjdERlc2NyaXB0b3IocGFyYW0tPnJldHJpZXZlU3RydWN0RGVzY3JpcHRvcigpKTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwYXJhbS0+dmFsaWRhdGUobVJlZmxlY3Rvcik7CisgICAgaWYgKGVyciAhPSBDMl9DT1JSVVBURUQpIHsKKyAgICAgICAgX21GYWN0b3J5LT5hZGRQYXJhbShwYXJhbSk7CisKKyAgICAgICAgLy8gcnVuIHNldHRlciB0byBlbnN1cmUgY29ycmVjdCB2YWx1ZXMKKyAgICAgICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgKHZvaWQpcGFyYW0tPnRyeVNldChwYXJhbS0+dmFsdWUoKS5nZXQoKSwgQzJfTUFZX0JMT0NLLCAmY2hhbmdlZCwgKl9tRmFjdG9yeSwgJmZhaWx1cmVzKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMySW50ZXJmYWNlSGVscGVyOjpjb25maWcoCisgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcywgYm9vbCB1cGRhdGVQYXJhbXMsCisgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+PiAqY2hhbmdlcyBfX3VudXNlZCAvKiBUT0RPICovKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBib29sIHBhcmFtV2FzSW52YWxpZCA9IGZhbHNlOyAvLyBUT0RPIGlzIHRoaXMgdGhlIHNhbWUgYXMgYmFkIHZhbHVlPworICAgIGJvb2wgcGFyYW1Ob3RGb3VuZCA9IGZhbHNlOworICAgIGJvb2wgcGFyYW1CYWRWYWx1ZSA9IGZhbHNlOworICAgIGJvb2wgcGFyYW1Ob01lbW9yeSA9IGZhbHNlOworICAgIGJvb2wgcGFyYW1CbG9ja2luZyA9IGZhbHNlOworICAgIGJvb2wgcGFyYW1UaW1lZE91dCA9IGZhbHNlOworICAgIGJvb2wgcGFyYW1Db3JydXB0ZWQgPSBmYWxzZTsKKworICAgIC8vIGRlcGVuZGVuY2llcworICAgIC8vIGRvd24gZGVwZW5kZW5jaWVzIGFyZSBtYXJrZWQgZGlydHksIGJ1dCBwYXJhbXMgc2V0IGFyZSBub3QgaW1tZWRpYXRlbHkKKyAgICAvLyBtYXJrZWQgZGlydHkgKHVubGVzcyB0aGV5IGJlY29tZSBkb3duIGRlcGVuZGVuY3kpIHNvIHRoYXQgd2UgY2FuCisgICAgLy8gYXZvaWQgc2V0dGluZyB0aGVtIGlmIHRoZXkgZGlkIG5vdCBjaGFuZ2UKKworICAgIC8vIFRPRE86IHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIGluZGljZXMgZm9yIHRoZSBzYW1lIGRlcGVuZGVuY3kgaW5kZXgKKyAgICAvLyB7IGRlcEl4LCBwYXJhbUl4IH0gbWF5IGJlIGEgc3VpdGFibGUga2V5CisgICAgc3RkOjptYXA8c2l6ZV90LCBzdGQ6OnBhaXI8QzJQYXJhbTo6SW5kZXgsIGJvb2w+PiBkZXBlbmRlbmNpZXM7CisKKyAgICAvLyB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBsYXN0IHZhbGlkIHBhcmFtZXRlciwgc28gYWRkIGFuIGV4dHJhCisgICAgLy8gbG9vcCBpdGVyYXRpb24gYWZ0ZXIgdGhlIGxhc3QgcGFyYW1ldGVyCisgICAgZm9yIChzaXplX3QgcF9peCA9IDA7IHBfaXggPD0gcGFyYW1zLnNpemUoKTsgKytwX2l4KSB7CisgICAgICAgIEMyUGFyYW0gKnAgPSBudWxscHRyOworICAgICAgICBDMlBhcmFtOjpJbmRleCBwYXJhbUl4ID0gMHU7CisgICAgICAgIHNpemVfdCBwYXJhbURlcEl4ID0gU0laRV9NQVg7CisgICAgICAgIGJvb2wgbGFzdCA9IHBfaXggPT0gcGFyYW1zLnNpemUoKTsKKyAgICAgICAgaWYgKCFsYXN0KSB7CisgICAgICAgICAgICBwID0gcGFyYW1zW3BfaXhdOworICAgICAgICAgICAgaWYgKCEqcCkgeworICAgICAgICAgICAgICAgIHBhcmFtV2FzSW52YWxpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgcC0+aW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwYXJhbUl4ID0gcC0+aW5kZXgoKTsKKyAgICAgICAgICAgIHBhcmFtRGVwSXggPSBnZXREZXBlbmRlbmN5SW5kZXhfbChwYXJhbUl4KTsKKyAgICAgICAgICAgIGlmIChwYXJhbURlcEl4ID09IFNJWkVfTUFYKSB7CisgICAgICAgICAgICAgICAgLy8gdW5zdXBwb3J0ZWQgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgcGFyYW1Ob3RGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBmaXJzdCBpbnNlcnQgLSBtYXJrIG5vdCBkaXJ0eQorICAgICAgICAgICAgLy8gaXQgbWF5IGhhdmUgYmVlbiBtYXJrZWQgZGlydHkgYnkgYSBkZXBlbmRlbmN5IHVwZGF0ZQorICAgICAgICAgICAgLy8gdGhpcyBkb2VzIG5vdCBvdmVycndyaXRlKCEpCisgICAgICAgICAgICAodm9pZClkZXBlbmRlbmNpZXMuaW5zZXJ0KHsgcGFyYW1EZXBJeCwgeyBwYXJhbUl4LCBmYWxzZSAvKiBkaXJ0eSAqLyB9fSk7CisgICAgICAgICAgICBhdXRvIGl0ID0gZGVwZW5kZW5jaWVzLmZpbmQocGFyYW1EZXBJeCk7CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIm1hcmtpbmcgZGVwZW5kZW5jeSBmb3Igc2V0dGluZyBhdCAjIiA8PCBwYXJhbURlcEl4IDw8ICI6ICIKKyAgICAgICAgICAgICAgICAgICAgPDwgaXQtPnNlY29uZC5maXJzdCA8PCAiLCB1cGRhdGUgIgorICAgICAgICAgICAgICAgICAgICA8PCAoaXQtPnNlY29uZC5zZWNvbmQgPyAiYWx3YXlzIChkaXJ0eSkiIDogIm9ubHkgaWYgY2hhbmdlZCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gcHJvY2VzcyBhbnkgcmVtYWluaW5nIGRlcGVuZGVuY2llcworICAgICAgICAgICAgaWYgKGRlcGVuZGVuY2llcy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgImhhbmRsaW5nIGRpcnR5IGRvd24gZGVwZW5kZW5jaWVzIGFmdGVyIGxhc3Qgc2V0dGluZyI7CisgICAgICAgIH0KKworICAgICAgICAvLyBwcm9jZXNzIGFueSBkaXJ0aWVkIGRvd24tZGVwZW5kZW5jaWVzIHVudGlsIHRoZSBuZXh0IHBhcmFtCisgICAgICAgIHdoaWxlIChkZXBlbmRlbmNpZXMuc2l6ZSgpICYmIGRlcGVuZGVuY2llcy5iZWdpbigpLT5maXJzdCA8PSBwYXJhbURlcEl4KSB7CisgICAgICAgICAgICBhdXRvIG1pbiA9IGRlcGVuZGVuY2llcy5iZWdpbigpOworICAgICAgICAgICAgQzJQYXJhbTo6SW5kZXggaXggPSBtaW4tPnNlY29uZC5maXJzdDsKKyAgICAgICAgICAgIGJvb2wgZGlydHkgPSBtaW4tPnNlY29uZC5zZWNvbmQ7CisgICAgICAgICAgICBkZXBlbmRlbmNpZXMuZXJhc2UobWluKTsKKworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBwYXJhbSA9IF9tRmFjdG9yeS0+Z2V0UGFyYW0oaXgpOworICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJvbGQgdmFsdWUgIiA8PCBhc1N0cmluZyhwYXJhbS0+dmFsdWUoKS5nZXQoKSk7CisgICAgICAgICAgICBpZiAoIWxhc3QpIHsKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIm5ldyB2YWx1ZSAiIDw8IGFzU3RyaW5nKHApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFsYXN0ICYmICFkaXJ0eSAmJiBpeCA9PSBwYXJhbUl4ICYmICpwYXJhbS0+dmFsdWUoKSA9PSAqcCkgeworICAgICAgICAgICAgICAgIC8vIG5vIGNoYW5nZSBpbiB2YWx1ZSAtIGFuZCBkZXBlbmRlbmNpZXMgd2VyZSBub3QgdXBkYXRlZAorICAgICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gdXBkYXRlCisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJpZ25vcmluZyBzZXR0aW5nIHVuY2hhbmdlZCBwYXJhbSAiIDw8IGl4OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBhcHBseSBzZXR0aW5nCisgICAgICAgICAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAic2V0dGluZyBwYXJhbSAiIDw8IGl4OworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IG9sZFZhbHVlID0gcGFyYW0tPnZhbHVlKCk7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCByZXMgPSBwYXJhbS0+dHJ5U2V0KAorICAgICAgICAgICAgICAgICAgICAoIWxhc3QgJiYgcGFyYW1JeCA9PSBpeCkgPyBwIDogcGFyYW0tPnZhbHVlKCkuZ2V0KCksIG1heUJsb2NrLAorICAgICAgICAgICAgICAgICAgICAmY2hhbmdlZCwgKl9tRmFjdG9yeSwgZmFpbHVyZXMpOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IG5ld1ZhbHVlID0gcGFyYW0tPnZhbHVlKCk7CisgICAgICAgICAgICBDMl9DSEVDS19FUShvbGRWYWx1ZSA9PSBuZXdWYWx1ZSwgKm9sZFZhbHVlID09ICpuZXdWYWx1ZSk7CisgICAgICAgICAgICBzd2l0Y2ggKHJlcykgeworICAgICAgICAgICAgICAgIGNhc2UgQzJfT0s6IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJfQkFEX1ZBTFVFOiBwYXJhbUJhZFZhbHVlID0gdHJ1ZTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMl9OT19NRU1PUlk6IHBhcmFtTm9NZW1vcnkgPSB0cnVlOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyX1RJTUVEX09VVDogcGFyYW1UaW1lZE91dCA9IHRydWU7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJfQkxPQ0tJTkc6ICBwYXJhbUJsb2NraW5nID0gdHJ1ZTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMl9DT1JSVVBURUQ6IHBhcmFtQ29ycnVwdGVkID0gdHJ1ZTsgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogOy8vIFRPRE8gZmF0YWwKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY29weSBiYWNrIHJlc3VsdCBmb3IgY29uZmlndXJlZCB2YWx1ZXMgKG9yIGludmFsaWRhdGUgaWYgaXQgZG9lcyBub3QgZml0IG9yIG1hdGNoKQorICAgICAgICAgICAgaWYgKHVwZGF0ZVBhcmFtcyAmJiAhbGFzdCAmJiBwYXJhbUl4ID09IGl4KSB7CisgICAgICAgICAgICAgICAgaWYgKCFwLT51cGRhdGVGcm9tKCpwYXJhbS0+dmFsdWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcC0+aW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY29tcGFyZSBwdHJzIGFzIHBhcmFtcyBhcmUgY29weSBvbiB3cml0ZQorICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgInBhcmFtICIgPDwgaXggPDwgIiB2YWx1ZSBjaGFuZ2VkIjsKKyAgICAgICAgICAgICAgICAvLyB2YWx1ZSBjaGFuZ2VkIHVwZGF0ZSBkb3duLWRlcGVuZGVuY2llcyBhbmQgbWFyayB0aGVtIGRpcnR5CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBDMlBhcmFtOjpJbmRleCBpeCA6IHBhcmFtLT5nZXREb3duRGVwZW5kZW5jaWVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8IDE7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gaW5zZXJ0X3JlcyA9IGRlcGVuZGVuY2llcy5pbnNlcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnZXREZXBlbmRlbmN5SW5kZXhfbChpeCksIHsgaXgsIHRydWUgLyogZGlydHkgKi8gfX0pOworICAgICAgICAgICAgICAgICAgICBpZiAoIWluc2VydF9yZXMuc2Vjb25kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKmluc2VydF9yZXMuZmlyc3QpLnNlY29uZC5zZWNvbmQgPSB0cnVlOyAvLyBtYXJrIGRpcnR5CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBhdXRvIGl0ID0gZGVwZW5kZW5jaWVzLmZpbmQoZ2V0RGVwZW5kZW5jeUluZGV4X2woaXgpKTsKKyAgICAgICAgICAgICAgICAgICAgQzJfQ0hFQ0soaXQtPnNlY29uZC5zZWNvbmQpOworICAgICAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIm1hcmtpbmcgZG93biBkZXBlbmRlbmNpZXMgdG8gdXBkYXRlIGF0ICMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZ2V0RGVwZW5kZW5jeUluZGV4X2woaXgpIDw8ICI6ICIgPDwgaXQtPnNlY29uZC5maXJzdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKHBhcmFtQ29ycnVwdGVkID8gQzJfQ09SUlVQVEVEIDoKKyAgICAgICAgICAgIHBhcmFtQmxvY2tpbmcgPyBDMl9CTE9DS0lORyA6CisgICAgICAgICAgICBwYXJhbVRpbWVkT3V0ID8gQzJfVElNRURfT1VUIDoKKyAgICAgICAgICAgIHBhcmFtTm9NZW1vcnkgPyBDMl9OT19NRU1PUlkgOgorICAgICAgICAgICAgKHBhcmFtQmFkVmFsdWUgfHwgcGFyYW1XYXNJbnZhbGlkKSA/IEMyX0JBRF9WQUxVRSA6CisgICAgICAgICAgICBwYXJhbU5vdEZvdW5kID8gQzJfQkFEX0lOREVYIDogQzJfT0spOworfQorCitzaXplX3QgQzJJbnRlcmZhY2VIZWxwZXI6OmdldERlcGVuZGVuY3lJbmRleF9sKEMyUGFyYW06OkluZGV4IGl4KSBjb25zdCB7CisgICAgcmV0dXJuIF9tRmFjdG9yeS0+Z2V0RGVwZW5kZW5jeUluZGV4KGl4KTsKK30KKworYzJfc3RhdHVzX3QgQzJJbnRlcmZhY2VIZWxwZXI6OnF1ZXJ5KAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2sgX191bnVzZWQgLyogVE9ETyAqLywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgaGVhcFBhcmFtcykgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgYm9vbCBwYXJhbVdhc0ludmFsaWQgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtTm90Rm91bmQgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtRGlkTm90Rml0ID0gZmFsc2U7CisgICAgYm9vbCBwYXJhbU5vTWVtb3J5ID0gZmFsc2U7CisKKyAgICBmb3IgKEMyUGFyYW0qIGNvbnN0IHAgOiBzdGFja1BhcmFtcykgeworICAgICAgICBpZiAoISpwKSB7CisgICAgICAgICAgICBwYXJhbVdhc0ludmFsaWQgPSB0cnVlOworICAgICAgICAgICAgcC0+aW52YWxpZGF0ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IHZhbHVlID0gX21GYWN0b3J5LT5nZXRQYXJhbVZhbHVlKHAtPmluZGV4KCkpOworICAgICAgICAgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICAgICAgICAgIHBhcmFtTm90Rm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIHAtPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXAtPnVwZGF0ZUZyb20oKnZhbHVlKSkgeworICAgICAgICAgICAgICAgIHBhcmFtRGlkTm90Rml0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBwLT5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IEMyUGFyYW06OkluZGV4IGl4IDogaGVhcFBhcmFtSW5kaWNlcykgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gdmFsdWUgPSBfbUZhY3RvcnktPmdldFBhcmFtVmFsdWUoaXgpOworICAgICAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBwID0gQzJQYXJhbTo6Q29weSgqdmFsdWUpOworICAgICAgICAgICAgaWYgKHAgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGhlYXBQYXJhbXMtPnB1c2hfYmFjayhzdGQ6Om1vdmUocCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYXJhbU5vTWVtb3J5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBhcmFtTm90Rm91bmQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHBhcmFtTm9NZW1vcnkgPyBDMl9OT19NRU1PUlkgOgorICAgICAgICAgICBwYXJhbU5vdEZvdW5kID8gQzJfQkFEX0lOREVYIDoKKyAgICAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBlcnJvcnMgYXJlIG5vdCBtYXJrZWQgaW4gdGhlIHJldHVybiB2YWx1ZQorICAgICAgICAgICBwYXJhbURpZE5vdEZpdCA/IEMyX09LIDoKKyAgICAgICAgICAgcGFyYW1XYXNJbnZhbGlkID8gQzJfT0sgOiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJJbnRlcmZhY2VIZWxwZXI6OnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqY29uc3QgcGFyYW1zKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICByZXR1cm4gX21GYWN0b3J5LT5xdWVyeVN1cHBvcnRlZFBhcmFtcyhwYXJhbXMpOworfQorCisKK2MyX3N0YXR1c190IEMySW50ZXJmYWNlSGVscGVyOjpxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzLCBjMl9ibG9ja2luZ190IG1heUJsb2NrIF9fdW51c2VkKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBmb3IgKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAmcXVlcnkgOiBmaWVsZHMpIHsKKyAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJxdWVyeWluZyBmaWVsZCAiIDw8IHF1ZXJ5LmZpZWxkKCk7CisgICAgICAgIEMyUGFyYW06OkluZGV4IGl4ID0gX0MyUGFyYW1JbnNwZWN0b3I6OkdldEluZGV4KHF1ZXJ5LmZpZWxkKCkpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IHBhcmFtID0gX21GYWN0b3J5LT5nZXRQYXJhbShpeCk7CisgICAgICAgIGlmICghcGFyYW0pIHsKKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiYmFkIHBhcmFtIjsKKyAgICAgICAgICAgIHF1ZXJ5LnN0YXR1cyA9IEMyX0JBRF9JTkRFWDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHNpemVfdCBvZmZzID0gR2V0QmFzZU9mZnNldCgKKyAgICAgICAgICAgICAgICBtUmVmbGVjdG9yLCBpeCwKKyAgICAgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KHF1ZXJ5LmZpZWxkKCkpIC0gc2l6ZW9mKEMyUGFyYW0pKTsKKyAgICAgICAgaWYgKH5vZmZzID09IDApIHsKKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiZmllbGQgY291bGQgbm90IGJlIGZvdW5kIjsKKyAgICAgICAgICAgIHF1ZXJ5LnN0YXR1cyA9IEMyX05PVF9GT1VORDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG9mZnMgKz0gc2l6ZW9mKEMyUGFyYW0pOworICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgImZpZWxkIHJlc29sdmVkIHRvICIKKyAgICAgICAgICAgICAgICA8PCBTdHJpbmdQcmludGYoIkAlMDJ6eCslMDJ4Iiwgb2ZmcywgX0MyUGFyYW1JbnNwZWN0b3I6OkdldFNpemUocXVlcnkuZmllbGQoKSkpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8RmllbGRIZWxwZXI+IGZpZWxkID0KKyAgICAgICAgICAgIHBhcmFtLT5maW5kRmllbGQob2ZmcywgX0MyUGFyYW1JbnNwZWN0b3I6OkdldFNpemUocXVlcnkuZmllbGQoKSkpOworICAgICAgICBpZiAoIWZpZWxkKSB7CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgImJhZCBmaWVsZCI7CisgICAgICAgICAgICBxdWVyeS5zdGF0dXMgPSBDMl9OT1RfRk9VTkQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgKnZhbHVlcyA9IG51bGxwdHI7CisgICAgICAgIHN3aXRjaCAocXVlcnkudHlwZSgpKSB7CisgICAgICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpDVVJSRU5UOgorICAgICAgICAgICAgdmFsdWVzID0gZmllbGQtPmdldFN1cHBvcnRlZFZhbHVlcygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpQT1NTSUJMRToKKyAgICAgICAgICAgIHZhbHVlcyA9IGZpZWxkLT5nZXRQb3NzaWJsZVZhbHVlcygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgImJhZCBxdWVyeSB0eXBlOiAiIDw8IHF1ZXJ5LnR5cGUoKTsKKyAgICAgICAgICAgIHF1ZXJ5LnN0YXR1cyA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWVzKSB7CisgICAgICAgICAgICBxdWVyeS52YWx1ZXMgPSAqdmFsdWVzOworICAgICAgICAgICAgcXVlcnkuc3RhdHVzID0gQzJfT0s7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDMl9MT0coREVCVUcpIDw8ICJubyB2YWx1ZXMgcHVibGlzaGVkIGJ5IGNvbXBvbmVudCI7CisgICAgICAgICAgICBxdWVyeS5zdGF0dXMgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IEMySW50ZXJmYWNlSGVscGVyOjpsb2NrKCkgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+KG1NdXRleCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MySW50ZXJmYWNlVXRpbHMuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkludGVyZmFjZVV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWVjOTExCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkludGVyZmFjZVV0aWxzLmNwcApAQCAtMCwwICsxLDEyOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdW51c2VkLXBhcmFtZXRlciIKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC12YXJpYWJsZSIKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC12YWx1ZSIKKworI2RlZmluZSBDMl9MT0dfVkVSQk9TRQorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDxDMlBhcmFtRGVmLmg+CisjaW5jbHVkZSA8QzJQYXJhbUludGVybmFsLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZVV0aWxzLmg+CisKKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgX0MyRmllbGRJZCAmaSk7CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlBhcmFtRmllbGQgJmkpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyU3VwcG9ydGVkUmFuZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIEhlbHBlciBjbGFzcyBmb3Igc3VwcG9ydGVkIHZhbHVlcyByYW5nZSBjYWxjdWxhdGlvbnMuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGJvb2wgRlA9c3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWU+CitzdHJ1Y3QgX0MyVHlwZWRTdXBwb3J0ZWRSYW5nZUhlbHBlciB7CisgICAgLyoqCisgICAgICogdHlwZSBvZiByYW5nZSBzaXplOiBhIC0gYiBpZiBhID49IGIgYW5kIGEgYW5kIGIgYXJlIG9mIHR5cGUgVAorICAgICAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjptYWtlX3Vuc2lnbmVkPFQ+Ojp0eXBlIERpZmZUeXBlOworCisgICAgLyoqCisgICAgICogY2FsY3VsYXRlIChoaWdoIC0gbG93KSBtb2Qgc3RlcAorICAgICAqLworICAgIHN0YXRpYyBEaWZmVHlwZSBtb2QoVCBsb3csIFQgaGlnaCwgVCBzdGVwKSB7CisgICAgICAgIHJldHVybiBEaWZmVHlwZShoaWdoIC0gbG93KSAlIERpZmZUeXBlKHN0ZXApOworICAgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgX0MyVHlwZWRTdXBwb3J0ZWRSYW5nZUhlbHBlcjxULCB0cnVlPiB7CisgICAgdHlwZWRlZiBUIERpZmZUeXBlOworCisgICAgc3RhdGljIERpZmZUeXBlIG1vZChUIGxvdywgVCBoaWdoLCBUIHN0ZXApIHsKKyAgICAgICAgcmV0dXJuIGZtb2QoaGlnaCAtIGxvdywgc3RlcCk7CisgICAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyU3VwcG9ydGVkUmFuZ2U8VD46OkMyU3VwcG9ydGVkUmFuZ2UoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsdWVzKSB7CisgICAgaWYgKHZhbHVlcy50eXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlJBTkdFKSB7CisgICAgICAgIF9tTWluID0gdmFsdWVzLnJhbmdlLm1pbi5yZWY8VmFsdWVUeXBlPigpOworICAgICAgICBfbU1heCA9IHZhbHVlcy5yYW5nZS5tYXgucmVmPFZhbHVlVHlwZT4oKTsKKyAgICAgICAgX21TdGVwID0gdmFsdWVzLnJhbmdlLnN0ZXAucmVmPFZhbHVlVHlwZT4oKTsKKyAgICAgICAgX21OdW0gPSB2YWx1ZXMucmFuZ2UubnVtLnJlZjxWYWx1ZVR5cGU+KCk7CisgICAgICAgIF9tRGVub20gPSB2YWx1ZXMucmFuZ2UuZGVub20ucmVmPFZhbHVlVHlwZT4oKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfbU1pbiA9IE1BWF9WQUxVRTsKKyAgICAgICAgX21NYXggPSBNSU5fVkFMVUU7CisgICAgICAgIF9tU3RlcCA9IE1JTl9TVEVQOworICAgICAgICBfbU51bSA9IDA7CisgICAgICAgIF9tRGVub20gPSAwOworICAgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgQzJTdXBwb3J0ZWRSYW5nZTxUPjo6Y29udGFpbnMoVCB2YWx1ZSkgY29uc3QgeworICAgIC8vIHZhbHVlIG11c3QgZmFsbCBiZXR3ZWVuIG1pbiBhbmQgbWF4CisgICAgaWYgKHZhbHVlIDwgX21NaW4gfHwgdmFsdWUgPiBfbU1heCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIHNpbXBsZSByYW5nZXMgY29udGFpbiBhbGwgdmFsdWVzIGJldHdlZW4gbWluIGFuZCBtYXgKKyAgICBpZiAoaXNTaW1wbGVSYW5nZSgpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyBtaW4gaXMgYWx3YXlzIHBhcnQgb2YgdGhlIHJhbmdlCisgICAgaWYgKHZhbHVlID09IF9tTWluKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyBzdGVwcGVkIHJhbmdlcyByZXF1aXJlICh2YWwgLSBtaW4pICUgc3RlcCB0byBiZSB6ZXJvCisgICAgaWYgKGlzQXJpdGhtZXRpY1NlcmllcygpKSB7CisgICAgICAgIHJldHVybiBfQzJUeXBlZFN1cHBvcnRlZFJhbmdlSGVscGVyPFQ+Ojptb2QoX21NaW4sIHZhbHVlLCBfbVN0ZXApID09IDA7CisgICAgfQorICAgIC8vIHB1cmUgZ2VvbWV0cmljIHNlcmllcyByZXF1aXJlICh2YWwgLyBtaW4pIHRvIGJlIGludGVnZXIgbXVsdGlwbGUgb2YgKG51bS9kZW5vbSkKKyAgICBpZiAoaXNHZW9tZXRyaWNTZXJpZXMoKSkgeworICAgICAgICBpZiAodmFsdWUgPD0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGRvdWJsZSBsb2cyYmFzZSA9IGxvZzIoX21OdW0gLyBfbURlbm9tKTsKKyAgICAgICAgZG91YmxlIHBvd2VyID0gbGxyb3VuZChsb2cyKHZhbHVlIC8gZG91YmxlKF9tTWluKSkgLyBsb2cyYmFzZSk7CisgICAgICAgIC8vIFRPRE86IHZhbGlkYXRlIHRoYXQgcmVzdWx0IGZhbGxzIHdpdGhpbiBwcmVjaXNpb24gKG90aGVyIHRoYW4gcm91bmQpCisgICAgICAgIHJldHVybiB2YWx1ZSA9PSBUKF9tTWluICogcG93KF9tTnVtIC8gX21EZW5vbSwgcG93ZXIpICsgTUlOX1NURVAgLyAyKTsKKyAgICB9CisgICAgLy8gbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMgcmVxdWlyZSB2YWxpZGF0aW5nIGJ5IHdhbGtpbmcgdGhyb3VnaCB0aGUgc2VyaWVzCisgICAgaWYgKGlzTWFjU2VyaWVzKCkpIHsKKyAgICAgICAgZG91YmxlIGxhc3RWYWx1ZSA9IF9tTWluOworICAgICAgICBkb3VibGUgYmFzZSA9IF9tTnVtIC8gX21EZW5vbTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIC8vIHRoaXMgY2FzdCBpcyBzYWZlIGFzIF9tTWluIDw9IGxhc3RWYWx1ZSA8PSBfbU1heAorICAgICAgICAgICAgaWYgKFQobGFzdFZhbHVlICsgTUlOX1NURVAgLyAyKSA9PSB2YWx1ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZG91YmxlIG5leHRWYWx1ZSA9IGZtYShsYXN0VmFsdWUsIGJhc2UsIF9tU3RlcCk7CisgICAgICAgICAgICBpZiAobmV4dFZhbHVlIDw9IGxhc3RWYWx1ZSB8fCBuZXh0VmFsdWUgPiBfbU1heCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gc2VyaWVzIGlzIG5vIGxvbmdlciBtb25vdG9uaWMgb3Igd2l0aGluIHJhbmdlCisgICAgICAgICAgICB9CisgICAgICAgICAgICBsYXN0VmFsdWUgPSBuZXh0VmFsdWU7CisgICAgICAgIH07CisgICAgfQorICAgIC8vIGlmIHdlIGFyZSBoZXJlLCB0aGlzIG11c3QgYmUgYW4gaW52YWxpZCByYW5nZQorICAgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyU3VwcG9ydGVkUmFuZ2U8VD4gQzJTdXBwb3J0ZWRSYW5nZTxUPjo6bGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8VD4gJmxpbWl0KSBjb25zdCB7CisgICAgLy8gVE9ETyAtIHRoaXMgb25seSB3b3JrcyBmb3Igc2ltcGxlIHJhbmdlcworICAgIHJldHVybiBDMlN1cHBvcnRlZFJhbmdlKHN0ZDo6bWF4KF9tTWluLCBsaW1pdC5fbU1pbiksIHN0ZDo6bWluKF9tTWF4LCBsaW1pdC5fbU1heCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1heChfbVN0ZXAsIGxpbWl0Ll9tU3RlcCkpOworfQorCit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFJhbmdlPHVpbnQ4X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZTxjaGFyPjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkUmFuZ2U8aW50MzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFJhbmdlPHVpbnQzMl90PjsKKy8vdGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZTxjMl9jbnRyMzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFJhbmdlPGludDY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZTx1aW50NjRfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkUmFuZ2U8YzJfY250cjY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZTxmbG9hdD47CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyU3VwcG9ydGVkRmxhZ3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBPcmRlcmVkIHN1cHBvcnRlZCBmbGFnIHNldCBmb3IgYSBmaWVsZCBvZiBhIGdpdmVuIHR5cGUuCisgKi8KKy8vIGZsb2F0IGZsYWdzIGFyZSBub3Qgc3VwcG9ydGVkLCBidXQgZGVmaW5lIGEgZmV3IG1ldGhvZHMgdG8gc3VwcG9ydCBnZW5lcmljIHN1cHBvcnRlZCB2YWx1ZXMgY29kZQordGVtcGxhdGU8PgorYm9vbCBDMlN1cHBvcnRlZEZsYWdzPGZsb2F0Pjo6Y29udGFpbnMoZmxvYXQgdmFsdWUpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlPD4KK2NvbnN0IHN0ZDo6dmVjdG9yPGZsb2F0PiBDMlN1cHBvcnRlZEZsYWdzPGZsb2F0Pjo6ZmxhZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPGZsb2F0PigpOworfQorCit0ZW1wbGF0ZTw+CitDMlN1cHBvcnRlZEZsYWdzPGZsb2F0PiBDMlN1cHBvcnRlZEZsYWdzPGZsb2F0Pjo6bGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8ZmxvYXQ+ICZsaW1pdCkgY29uc3QgeworICAgIHN0ZDo6dmVjdG9yPEMyVmFsdWU6OlByaW1pdGl2ZT4gdmFsdWVzOworICAgIHJldHVybiBDMlN1cHBvcnRlZEZsYWdzKHN0ZDo6bW92ZSh2YWx1ZXMpKTsKK30KKwordGVtcGxhdGU8PgorZmxvYXQgQzJTdXBwb3J0ZWRGbGFnczxmbG9hdD46Om1pbigpIGNvbnN0IHsKKyAgICByZXR1cm4gMDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgQzJTdXBwb3J0ZWRGbGFnczxUPjo6Y29udGFpbnMoVCB2YWx1ZSkgY29uc3QgeworICAgIC8vIHZhbHVlIG11c3QgY29udGFpbiB0aGUgbWluaW1hbCBtYXNrCisgICAgVCBtaW5NYXNrID0gbWluKCk7CisgICAgaWYgKH52YWx1ZSAmIG1pbk1hc2spIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2YWx1ZSAmPSB+bWluTWFzazsKKyAgICAvLyBvdGhlcndpc2UsIHJlbW92ZSBmbGFncyBmcm9tIHZhbHVlIGFuZCBzZWUgaWYgd2UgYXJyaXZlIGF0IDAKKyAgICBmb3IgKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmdiA6IF9tVmFsdWVzKSB7CisgICAgICAgIGlmICh2YWx1ZSA9PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoKH52YWx1ZSAmIHYucmVmPFZhbHVlVHlwZT4oKSkgPT0gMCkgeworICAgICAgICAgICAgdmFsdWUgJj0gfnYucmVmPFZhbHVlVHlwZT4oKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdmFsdWUgPT0gMDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NvbnN0IHN0ZDo6dmVjdG9yPFQ+IEMyU3VwcG9ydGVkRmxhZ3M8VD46OmZsYWdzKCkgY29uc3QgeworICAgIHN0ZDo6dmVjdG9yPFQ+IHZhbHMoYzJfbWF4KF9tVmFsdWVzLnNpemUoKSwgMXUpIC0gMSk7CisgICAgaWYgKCFfbVZhbHVlcy5lbXB0eSgpKSB7CisgICAgICAgIHN0ZDo6dHJhbnNmb3JtKF9tVmFsdWVzLmNiZWdpbigpICsgMSwgX21WYWx1ZXMuY2VuZCgpLCB2YWxzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcCktPlQgeworICAgICAgICAgICAgcmV0dXJuIHAucmVmPFZhbHVlVHlwZT4oKTsKKyAgICAgICAgfSk7CisgICAgfQorICAgIHJldHVybiB2YWxzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJTdXBwb3J0ZWRGbGFnczxUPiBDMlN1cHBvcnRlZEZsYWdzPFQ+OjpsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxUPiAmbGltaXQpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+IHZhbHVlcyA9IF9tVmFsdWVzOyAvLyBtYWtlIGEgY29weQorICAgIFQgbWluTWFzayA9IG1pbigpIHwgbGltaXQubWluKCk7CisgICAgLy8gbWluaW11bSBtYXNrIG11c3QgYmUgY292ZXJlZCBieSBib3RoIHRoaXMgYW5kIG90aGVyCisgICAgaWYgKGxpbWl0LmNvbnRhaW5zKG1pbk1hc2spICYmIGNvbnRhaW5zKG1pbk1hc2spKSB7CisgICAgICAgIHZhbHVlc1swXSA9IG1pbk1hc2s7CisgICAgICAgIC8vIGtlZXAgb25seSBmbGFncyB0aGF0IGFyZSBjb3ZlcmVkIGJ5IGxpbWl0CisgICAgICAgIHN0ZDo6cmVtb3ZlX2lmKHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCksIFsmbGltaXQsIG1pbk1hc2tdKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmdikgLT4gYm9vbCB7CisgICAgICAgICAgICBUIHZhbHVlID0gdi5yZWY8VmFsdWVUeXBlPigpIHwgbWluTWFzazsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PSBtaW5NYXNrIHx8ICFsaW1pdC5jb250YWlucyh2YWx1ZSk7IH0pOworICAgICAgICAvLyB3ZSBhbHNvIG5lZWQgdG8gZG8gaXQgdmljZSB2ZXJzYQorICAgICAgICBmb3IgKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmdiA6IF9tVmFsdWVzKSB7CisgICAgICAgICAgICBUIHZhbHVlID0gdi5yZWY8VmFsdWVUeXBlPigpIHwgbWluTWFzazsKKyAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBtaW5NYXNrICYmIGNvbnRhaW5zKHZhbHVlKSkgeworICAgICAgICAgICAgICAgIHZhbHVlcy5lbXBsYWNlX2JhY2soKFZhbHVlVHlwZSl2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEMyU3VwcG9ydGVkRmxhZ3Moc3RkOjptb3ZlKHZhbHVlcykpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorVCBDMlN1cHBvcnRlZEZsYWdzPFQ+OjptaW4oKSBjb25zdCB7CisgICAgaWYgKCFfbVZhbHVlcy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBfbVZhbHVlcy5mcm9udCgpLnRlbXBsYXRlIHJlZjxWYWx1ZVR5cGU+KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFQoMCk7CisgICAgfQorfQorCit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZEZsYWdzPHVpbnQ4X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRGbGFnczxjaGFyPjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkRmxhZ3M8aW50MzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZEZsYWdzPHVpbnQzMl90PjsKKy8vdGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRGbGFnczxjMl9jbnRyMzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZEZsYWdzPGludDY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRGbGFnczx1aW50NjRfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkRmxhZ3M8YzJfY250cjY0X3Q+OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMlN1cHBvcnRlZFZhbHVlU2V0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogT3JkZXJlZCBzdXBwb3J0ZWQgdmFsdWUgc2V0IGZvciBhIGZpZWxkIG9mIGEgZ2l2ZW4gdHlwZS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPjo6Y29udGFpbnMoVCB2YWx1ZSkgY29uc3QgeworICAgIHJldHVybiBzdGQ6OmZpbmRfaWYoX21WYWx1ZXMuY2JlZ2luKCksIF9tVmFsdWVzLmNlbmQoKSwKKyAgICAgICAgICAgIFt2YWx1ZV0oY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZwKSAtPiBib29sIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgPT0gcC5yZWY8VmFsdWVUeXBlPigpOworICAgICAgICAgICAgfSkgIT0gX21WYWx1ZXMuY2VuZCgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+OjpsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiAmbGltaXQpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+IHZhbHVlcyA9IF9tVmFsdWVzOyAvLyBtYWtlIGEgY29weQorICAgIHN0ZDo6cmVtb3ZlX2lmKHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCksIFsmbGltaXRdKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmdikgLT4gYm9vbCB7CisgICAgICAgIHJldHVybiAhbGltaXQuY29udGFpbnModi5yZWY8VmFsdWVUeXBlPigpKTsgfSk7CisgICAgcmV0dXJuIEMyU3VwcG9ydGVkVmFsdWVTZXQoc3RkOjptb3ZlKHZhbHVlcykpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+OjpsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxUPiAmbGltaXQpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+IHZhbHVlcyA9IF9tVmFsdWVzOyAvLyBtYWtlIGEgY29weQorICAgIHN0ZDo6cmVtb3ZlX2lmKHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCksIFsmbGltaXRdKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmdikgLT4gYm9vbCB7CisgICAgICAgIHJldHVybiAhbGltaXQuY29udGFpbnModi5yZWY8VmFsdWVUeXBlPigpKTsgfSk7CisgICAgcmV0dXJuIEMyU3VwcG9ydGVkVmFsdWVTZXQoc3RkOjptb3ZlKHZhbHVlcykpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+OjpsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxUPiAmbGltaXQpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+IHZhbHVlcyA9IF9tVmFsdWVzOyAvLyBtYWtlIGEgY29weQorICAgIHN0ZDo6cmVtb3ZlX2lmKHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCksIFsmbGltaXRdKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmdikgLT4gYm9vbCB7CisgICAgICAgIHJldHVybiAhbGltaXQuY29udGFpbnModi5yZWY8VmFsdWVUeXBlPigpKTsgfSk7CisgICAgcmV0dXJuIEMyU3VwcG9ydGVkVmFsdWVTZXQoc3RkOjptb3ZlKHZhbHVlcykpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY29uc3Qgc3RkOjp2ZWN0b3I8VD4gQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPjo6dmFsdWVzKCkgY29uc3QgeworICAgIHN0ZDo6dmVjdG9yPFQ+IHZhbHMoX21WYWx1ZXMuc2l6ZSgpKTsKKyAgICBzdGQ6OnRyYW5zZm9ybShfbVZhbHVlcy5jYmVnaW4oKSwgX21WYWx1ZXMuY2VuZCgpLCB2YWxzLmJlZ2luKCksIFtdKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcCkgLT4gVCB7CisgICAgICAgIHJldHVybiBwLnJlZjxWYWx1ZVR5cGU+KCk7CisgICAgfSk7CisgICAgcmV0dXJuIHZhbHM7Cit9CisKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkVmFsdWVTZXQ8dWludDhfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0PGNoYXI+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRWYWx1ZVNldDxpbnQzMl90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkVmFsdWVTZXQ8dWludDMyX3Q+OworLy90ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0PGMyX2NudHIzMl90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkVmFsdWVTZXQ8aW50NjRfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0PHVpbnQ2NF90PjsKKy8vdGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRWYWx1ZVNldDxjMl9jbnRyNjRfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0PGZsb2F0PjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+OjpJbXBsIHsKKyAgICBJbXBsKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbHVlcykKKyAgICAgICAgOiBfbVR5cGUodmFsdWVzLnR5cGUpLAorICAgICAgICAgIF9tUmFuZ2UodmFsdWVzKSwKKyAgICAgICAgICBfbVZhbHVlcyh2YWx1ZXMpLAorICAgICAgICAgIF9tRmxhZ3ModmFsdWVzKSB7IH0KKworICAgIGJvb2wgc3VwcG9ydHMoVCB2YWx1ZSkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQzJGaWVsZFZhbHVlSGVscGVyPFQ+OjpWYWx1ZVR5cGUgVmFsdWVUeXBlOworICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnR5cGVfdCBfbVR5cGU7CisgICAgQzJTdXBwb3J0ZWRSYW5nZTxWYWx1ZVR5cGU+IF9tUmFuZ2U7CisgICAgQzJTdXBwb3J0ZWRWYWx1ZVNldDxWYWx1ZVR5cGU+IF9tVmFsdWVzOworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VmFsdWVUeXBlPiBfbUZsYWdzOworCisvLyAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8IDxUPihzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+OjpJbXBsICZpKTsKKy8vICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgSW1wbCAmaSk7CisgICAgc3RkOjpvc3RyZWFtJiBzdHJlYW1PdXQoc3RkOjpvc3RyZWFtJiBvcykgY29uc3Q7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorYm9vbCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+OjpJbXBsOjpzdXBwb3J0cyhUIHZhbHVlKSBjb25zdCB7CisgICAgc3dpdGNoIChfbVR5cGUpIHsKKyAgICAgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpSQU5HRTogcmV0dXJuIF9tUmFuZ2UuY29udGFpbnModmFsdWUpOworICAgICAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlZBTFVFUzogcmV0dXJuIF9tVmFsdWVzLmNvbnRhaW5zKHZhbHVlKTsKKyAgICAgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpGTEFHUzogcmV0dXJuIF9tRmxhZ3MuY29udGFpbnModmFsdWUpOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6QzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcihjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWx1ZXMpCisgICAgOiBfbUltcGwoc3RkOjptYWtlX3VuaXF1ZTxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+OjpJbXBsPih2YWx1ZXMpKSB7IH0KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD46On5DMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyKCkgPSBkZWZhdWx0OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorYm9vbCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+OjpzdXBwb3J0cyhUIHZhbHVlKSBjb25zdCB7CisgICAgcmV0dXJuIF9tSW1wbC0+c3VwcG9ydHModmFsdWUpOworfQorCit0ZW1wbGF0ZSBjbGFzcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPHVpbnQ4X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxjaGFyPjsKK3RlbXBsYXRlIGNsYXNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8aW50MzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPHVpbnQzMl90PjsKKy8vdGVtcGxhdGUgY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxjMl9jbnRyMzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPGludDY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjx1aW50NjRfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8YzJfY250cjY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxmbG9hdD47CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjpJbXBsIHsKKyAgICBJbXBsKGNvbnN0IEMyUGFyYW1GaWVsZCAmZmllbGQpCisgICAgICAgIDogX21QYXJhbUZpZWxkKGZpZWxkKSwKKyAgICAgICAgICBfbVR5cGUodHlwZV90OjpSQU5HRSksCisgICAgICAgICAgX21EZWZpbmVkKGZhbHNlKSwKKyAgICAgICAgICBfbVJhbmdlKEMyU3VwcG9ydGVkUmFuZ2U8VD46OkFueSgpKSwKKyAgICAgICAgICBfbVZhbHVlcyhDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+OjpOb25lKCkpLAorICAgICAgICAgIF9tRmxhZ3MoQzJTdXBwb3J0ZWRGbGFnczxUPjo6Tm9uZSgpKSB7IH0KKworICAgIC8qKgorICAgICAqIEdldCBDMlBhcmFtRmllbGRWYWx1ZXMgZnJvbSB0aGlzIGJ1aWxkZXIuCisgICAgICovCisgICAgb3BlcmF0b3IgQzJQYXJhbUZpZWxkVmFsdWVzKCkgY29uc3QgeworICAgICAgICBpZiAoIV9tRGVmaW5lZCkgeworICAgICAgICAgICAgcmV0dXJuIEMyUGFyYW1GaWVsZFZhbHVlcyhfbVBhcmFtRmllbGQpOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoX21UeXBlKSB7CisgICAgICAgIGNhc2UgdHlwZV90OjpFTVBUWToKKyAgICAgICAgY2FzZSB0eXBlX3Q6OlZBTFVFUzoKKyAgICAgICAgICAgIHJldHVybiBDMlBhcmFtRmllbGRWYWx1ZXMoX21QYXJhbUZpZWxkLCAoQzJGaWVsZFN1cHBvcnRlZFZhbHVlcylfbVZhbHVlcyk7CisgICAgICAgIGNhc2UgdHlwZV90OjpSQU5HRToKKyAgICAgICAgICAgIHJldHVybiBDMlBhcmFtRmllbGRWYWx1ZXMoX21QYXJhbUZpZWxkLCAoQzJGaWVsZFN1cHBvcnRlZFZhbHVlcylfbVJhbmdlKTsKKyAgICAgICAgY2FzZSB0eXBlX3Q6OkZMQUdTOgorICAgICAgICAgICAgcmV0dXJuIEMyUGFyYW1GaWVsZFZhbHVlcyhfbVBhcmFtRmllbGQsIChDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKV9tRmxhZ3MpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gVFJFU1BBU1MKKyAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBnZXQgaGVyZQorICAgICAgICAgICAgcmV0dXJuIEMyUGFyYW1GaWVsZFZhbHVlcyhfbVBhcmFtRmllbGQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIERlZmluZSB0aGUgc3VwcG9ydGVkIHZhbHVlcyBhcyB0aGUgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgb2YgdGhpcyBidWlsZGVyLiAqLworICAgIHZvaWQgYW55KCkgeworICAgICAgICBfbURlZmluZWQgPSB0cnVlOworICAgIH0KKworICAgIC8qKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byBub25lLiAqLworICAgIHZvaWQgbm9uZSgpIHsKKyAgICAgICAgX21EZWZpbmVkID0gdHJ1ZTsKKyAgICAgICAgX21UeXBlID0gdHlwZV90OjpWQUxVRVM7CisgICAgICAgIF9tVmFsdWVzLmNsZWFyKCk7CisgICAgfQorCisgICAgLyoqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHx2YWx1ZXwgYWxvbmUuICovCisgICAgdm9pZCBlcXVhbFRvKFQgdmFsdWUpIHsKKyAgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD46Ok9uZU9mKHt2YWx1ZX0pKTsKKyAgICB9CisKKyAgICAvKiogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gYSB2YWx1ZSBzZXQuICovCisgICAgdm9pZCBsaW1pdFRvKGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gJmxpbWl0KSB7CisgICAgICAgIGlmICghX21EZWZpbmVkKSB7CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIk5BLmxpbWl0VG8oIiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisKKyAgICAgICAgICAgIC8vIHNob3J0Y3V0IGZvciBmaXJzdCBsaW1pdCBhcHBsaWVkCisgICAgICAgICAgICBfbURlZmluZWQgPSB0cnVlOworICAgICAgICAgICAgX21WYWx1ZXMgPSBsaW1pdDsKKyAgICAgICAgICAgIF9tVHlwZSA9IF9tVmFsdWVzLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OlZBTFVFUzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3aXRjaCAoX21UeXBlKSB7CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6RU1QVFk6CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6VkFMVUVTOgorICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiKCIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbVZhbHVlcykgPDwgIikubGltaXRUbygiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisKKyAgICAgICAgICAgICAgICBfbVZhbHVlcyA9IF9tVmFsdWVzLmxpbWl0ZWRUbyhsaW1pdCk7CisgICAgICAgICAgICAgICAgX21UeXBlID0gX21WYWx1ZXMuaXNFbXB0eSgpID8gdHlwZV90OjpFTVBUWSA6IHR5cGVfdDo6VkFMVUVTOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0eXBlX3Q6OlJBTkdFOgorICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiKCIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbVJhbmdlKSA8PCAiKS5saW1pdFRvKCIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4obGltaXQpIDw8ICIpIjsKKworICAgICAgICAgICAgICAgIF9tVmFsdWVzID0gbGltaXQubGltaXRlZFRvKF9tUmFuZ2UpOworICAgICAgICAgICAgICAgIF9tVHlwZSA9IF9tVmFsdWVzLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OlZBTFVFUzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpGTEFHUzoKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIigiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21SYW5nZSkgPDwgIikubGltaXRUbygiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisKKyAgICAgICAgICAgICAgICBfbVZhbHVlcyA9IGxpbWl0LmxpbWl0ZWRUbyhfbUZsYWdzKTsKKyAgICAgICAgICAgICAgICBfbVR5cGUgPSBfbVZhbHVlcy5pc0VtcHR5KCkgPyB0eXBlX3Q6OkVNUFRZIDogdHlwZV90OjpWQUxVRVM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEMyX0xPRyhGQVRBTCk7IC8vIHNob3VsZCBub3QgYmUgaGVyZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBmbGFncworICAgICAgICB9CisgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiID0gIiA8PCBfbVR5cGUgPDwgIjoiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21WYWx1ZXMpOworICAgIH0KKworICAgIC8qKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byBhIGZsYWcgc2V0LiAqLworICAgIHZvaWQgbGltaXRUbyhjb25zdCBDMlN1cHBvcnRlZEZsYWdzPFQ+ICZsaW1pdCkgeworICAgICAgICBpZiAoIV9tRGVmaW5lZCkgeworICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJOQS5saW1pdFRvKCIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworCisgICAgICAgICAgICAvLyBzaG9ydGN1dCBmb3IgZmlyc3QgbGltaXQgYXBwbGllZAorICAgICAgICAgICAgX21EZWZpbmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIF9tRmxhZ3MgPSBsaW1pdDsKKyAgICAgICAgICAgIF9tVHlwZSA9IF9tRmxhZ3MuaXNFbXB0eSgpID8gdHlwZV90OjpFTVBUWSA6IHR5cGVfdDo6RkxBR1M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9tVHlwZSkgeworICAgICAgICAgICAgY2FzZSB0eXBlX3Q6OkVNUFRZOgorICAgICAgICAgICAgY2FzZSB0eXBlX3Q6OlZBTFVFUzoKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIigiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21WYWx1ZXMpIDw8ICIpLmxpbWl0VG8oIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworCisgICAgICAgICAgICAgICAgX21WYWx1ZXMgPSBfbVZhbHVlcy5saW1pdGVkVG8obGltaXQpOworICAgICAgICAgICAgICAgIF9tVHlwZSA9IF9tVmFsdWVzLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OlZBTFVFUzsKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIiA9ICIgPDwgX21UeXBlIDw8ICI6IiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tVmFsdWVzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpGTEFHUzoKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIigiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21GbGFncykgPDwgIikubGltaXRUbygiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisKKyAgICAgICAgICAgICAgICBfbUZsYWdzID0gX21GbGFncy5saW1pdGVkVG8obGltaXQpOworICAgICAgICAgICAgICAgIF9tVHlwZSA9IF9tRmxhZ3MuaXNFbXB0eSgpID8gdHlwZV90OjpFTVBUWSA6IHR5cGVfdDo6RkxBR1M7CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIgPSAiIDw8IF9tVHlwZSA8PCAiOiIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbUZsYWdzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpSQU5HRToKKyAgICAgICAgICAgICAgICBDMl9MT0coRkFUQUwpIDw8ICJsaW1pdGluZyByYW5nZXMgdG8gZmxhZ3MgaXMgbm90IHN1cHBvcnRlZCI7CisgICAgICAgICAgICAgICAgX21UeXBlID0gdHlwZV90OjpFTVBUWTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQzJfTE9HKEZBVEFMKTsgLy8gc2hvdWxkIG5vdCBiZSBoZXJlCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGxpbWl0VG8oY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxUPiAmbGltaXQpIHsKKyAgICAgICAgaWYgKCFfbURlZmluZWQpIHsKKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiTkEubGltaXRUbygiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4obGltaXQpIDw8ICIpIjsKKworICAgICAgICAgICAgLy8gc2hvcnRjdXQgZm9yIGZpcnN0IGxpbWl0IGFwcGxpZWQKKyAgICAgICAgICAgIF9tRGVmaW5lZCA9IHRydWU7CisgICAgICAgICAgICBfbVJhbmdlID0gbGltaXQ7CisgICAgICAgICAgICBfbVR5cGUgPSBfbVJhbmdlLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OlJBTkdFOworICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIgPSAiIDw8IF9tVHlwZSA8PCAiOiIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbVJhbmdlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3aXRjaCAoX21UeXBlKSB7CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6RU1QVFk6CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6VkFMVUVTOgorICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiKCIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbVZhbHVlcykgPDwgIikubGltaXRUbygiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisgICAgICAgICAgICAgICAgX21WYWx1ZXMgPSBfbVZhbHVlcy5saW1pdGVkVG8obGltaXQpOworICAgICAgICAgICAgICAgIF9tVHlwZSA9IF9tVmFsdWVzLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OlZBTFVFUzsKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIiA9ICIgPDwgX21UeXBlIDw8ICI6IiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tVmFsdWVzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpGTEFHUzoKKyAgICAgICAgICAgICAgICBDMl9MT0coRkFUQUwpIDw8ICJsaW1pdGluZyBmbGFncyB0byByYW5nZXMgaXMgbm90IHN1cHBvcnRlZCI7CisgICAgICAgICAgICAgICAgX21UeXBlID0gdHlwZV90OjpFTVBUWTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpSQU5HRToKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIigiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21SYW5nZSkgPDwgIikubGltaXRUbygiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisgICAgICAgICAgICAgICAgX21SYW5nZSA9IF9tUmFuZ2UubGltaXRlZFRvKGxpbWl0KTsKKyAgICAgICAgICAgICAgICBDMl9EQ0hFQ0soX21WYWx1ZXMuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgICAgICBfbVR5cGUgPSBfbVJhbmdlLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OlJBTkdFOworICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiID0gIiA8PCBfbVR5cGUgPDwgIjoiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21SYW5nZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEMyX0xPRyhGQVRBTCk7IC8vIHNob3VsZCBub3QgYmUgaGVyZQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIHZvaWQgaW5zdGFudGlhdGUoKSBfX3VudXNlZCB7CisgICAgICAgICh2b2lkKV9tVmFsdWVzLnZhbHVlcygpOyAvLyBpbnN0YW50aWF0ZSBub24tY29uc3QgdmFsdWVzKCkKKyAgICB9CisKKyAgICB2b2lkIGluc3RhbnRpYXRlKCkgY29uc3QgX191bnVzZWQgeworICAgICAgICAodm9pZClfbVZhbHVlcy52YWx1ZXMoKTsgLy8gaW5zdGFudGlhdGUgY29uc3QgdmFsdWVzKCkKKyAgICB9CisKKyAgICB0eXBlZGVmIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnR5cGVfdCB0eXBlX3Q7CisKKyAgICBDMlBhcmFtRmllbGQgX21QYXJhbUZpZWxkOworICAgIHR5cGVfdCBfbVR5cGU7CisgICAgYm9vbCBfbURlZmluZWQ7CisgICAgQzJTdXBwb3J0ZWRSYW5nZTxUPiBfbVJhbmdlOworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gX21WYWx1ZXM7CisgICAgQzJTdXBwb3J0ZWRGbGFnczxUPiBfbUZsYWdzOworCit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6b3BlcmF0b3IgQzJQYXJhbUZpZWxkVmFsdWVzKCkgY29uc3QgeworICAgIHJldHVybiAoQzJQYXJhbUZpZWxkVmFsdWVzKSgqX21JbXBsLmdldCgpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIoY29uc3QgQzJQYXJhbUZpZWxkICZmaWVsZCkKKyAgICA6IF9tSW1wbChzdGQ6Om1ha2VfdW5pcXVlPEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OkltcGw+KGZpZWxkKSkgeyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjphbnkoKSB7CisgICAgX21JbXBsLT5hbnkoKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+Ojpub25lKCkgeworICAgIF9tSW1wbC0+bm9uZSgpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OmVxdWFsVG8oVCB2YWx1ZSkgeworICAgIF9tSW1wbC0+ZXF1YWxUbyh2YWx1ZSk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6bGltaXRUbyhjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+ICZsaW1pdCkgeworICAgIF9tSW1wbC0+bGltaXRUbyhsaW1pdCk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6bGltaXRUbyhjb25zdCBDMlN1cHBvcnRlZEZsYWdzPFQ+ICZsaW1pdCkgeworICAgIF9tSW1wbC0+bGltaXRUbyhsaW1pdCk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6bGltaXRUbyhjb25zdCBDMlN1cHBvcnRlZFJhbmdlPFQ+ICZsaW1pdCkgeworICAgIF9tSW1wbC0+bGltaXRUbyhsaW1pdCk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6QzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcihjb25zdCBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZvdGhlcikKKyAgICA6IF9tSW1wbChzdGQ6Om1ha2VfdW5pcXVlPEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OkltcGw+KCpvdGhlci5fbUltcGwuZ2V0KCkpKSB7IH0KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46Om9wZXJhdG9yPSgKKyAgICAgICAgY29uc3QgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmb3RoZXIpIHsKKyAgICBfbUltcGwgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OkltcGw+KCpvdGhlci5fbUltcGwuZ2V0KCkpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46On5DMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyKCkgPSBkZWZhdWx0OworCit0ZW1wbGF0ZSBjbGFzcyBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPHVpbnQ4X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxjaGFyPjsKK3RlbXBsYXRlIGNsYXNzIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8aW50MzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPHVpbnQzMl90PjsKKy8vdGVtcGxhdGUgY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxjMl9jbnRyMzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPGludDY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjx1aW50NjRfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8YzJfY250cjY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxmbG9hdD47CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJTZXR0aW5nUmVzdWx0QnVpbGRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK0MyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXI6OkMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXIoKSA6IF9tQ29uZmxpY3RzKCkgeyB9CisKK0MyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXI6OkMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXIoQzJQYXJhbUZpZWxkVmFsdWVzICYmY29uZmxpY3QpIHsKKyAgICBfbUNvbmZsaWN0cy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKGNvbmZsaWN0KSk7Cit9CisKK0MyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXImIEMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXI6OndpdGgoQzJQYXJhbUZpZWxkVmFsdWVzICYmY29uZmxpY3QpIHsKKyAgICBfbUNvbmZsaWN0cy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKGNvbmZsaWN0KSk7CisgICAgcmV0dXJuICp0aGlzOworfQorCitzdGQ6OnZlY3RvcjxDMlBhcmFtRmllbGRWYWx1ZXM+IEMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXI6OnJldHJpZXZlQ29uZmxpY3RzKCkgeworICAgIHJldHVybiBzdGQ6Om1vdmUoX21Db25mbGljdHMpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyU2V0dGluZ1Jlc3VsdC9zQnVpbGRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK0MyU2V0dGluZ1Jlc3VsdCBDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpSZWFkT25seShjb25zdCBDMlBhcmFtRmllbGQgJnBhcmFtKSB7CisgICAgcmV0dXJuIEMyU2V0dGluZ1Jlc3VsdCB7IEMyU2V0dGluZ1Jlc3VsdDo6UkVBRF9PTkxZLCB7IHBhcmFtIH0sIHsgfSB9OworfQorCitDMlNldHRpbmdSZXN1bHQgQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUoY29uc3QgQzJQYXJhbUZpZWxkICZwYXJhbUZpZWxkLCBib29sIGlzSW5mbykgeworICAgIHJldHVybiB7IGlzSW5mbyA/IEMyU2V0dGluZ1Jlc3VsdDo6SU5GT19CQURfVkFMVUUgOiBDMlNldHRpbmdSZXN1bHQ6OkJBRF9WQUxVRSwKKyAgICAgICAgICAgICB7IHBhcmFtRmllbGQgfSwgeyB9IH07Cit9CisKK0MyU2V0dGluZ1Jlc3VsdCBDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpDb25mbGljdCgKKyAgICAgICAgQzJQYXJhbUZpZWxkVmFsdWVzICYmcGFyYW1GaWVsZFZhbHVlcywgQzJTZXR0aW5nQ29uZmxpY3RzQnVpbGRlciAmY29uZmxpY3RzLCBib29sIGlzSW5mbykgeworICAgIEMyX0NIRUNLKCFjb25mbGljdHMuZW1wdHkoKSk7CisgICAgaWYgKGlzSW5mbykgeworICAgICAgICByZXR1cm4gQzJTZXR0aW5nUmVzdWx0IHsKKyAgICAgICAgICAgIEMyU2V0dGluZ1Jlc3VsdDo6SU5GT19DT05GTElDVCwKKyAgICAgICAgICAgIHN0ZDo6bW92ZShwYXJhbUZpZWxkVmFsdWVzKSwgY29uZmxpY3RzLnJldHJpZXZlQ29uZmxpY3RzKCkKKyAgICAgICAgfTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQzJTZXR0aW5nUmVzdWx0IHsKKyAgICAgICAgICAgIEMyU2V0dGluZ1Jlc3VsdDo6Q09ORkxJQ1QsCisgICAgICAgICAgICBzdGQ6Om1vdmUocGFyYW1GaWVsZFZhbHVlcyksIGNvbmZsaWN0cy5yZXRyaWV2ZUNvbmZsaWN0cygpCisgICAgICAgIH07CisgICAgfQorfQorCitDMlNldHRpbmdSZXN1bHRzQnVpbGRlcjo6QzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoQzJTZXR0aW5nUmVzdWx0ICYmcmVzdWx0KQorICAgICAgICA6IF9tU3RhdHVzKEMyX0JBRF9WQUxVRSkgeworICAgIF9tUmVzdWx0cy5lbXBsYWNlX2JhY2sobmV3IEMyU2V0dGluZ1Jlc3VsdChzdGQ6Om1vdmUocmVzdWx0KSkpOworfQorCitDMlNldHRpbmdSZXN1bHRzQnVpbGRlciBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcjo6cGx1cyhDMlNldHRpbmdSZXN1bHRzQnVpbGRlciYmIHJlc3VsdHMpIHsKKyAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+ICZyIDogcmVzdWx0cy5fbVJlc3VsdHMpIHsKKyAgICAgICAgX21SZXN1bHRzLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUocikpOworICAgIH0KKyAgICByZXN1bHRzLl9tUmVzdWx0cy5jbGVhcigpOworICAgIC8vIFRPRE86IG1TdGF0dXMKKyAgICByZXR1cm4gc3RkOjptb3ZlKCp0aGlzKTsKK30KKworYzJfc3RhdHVzX3QgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXI6OnJldHJpZXZlRmFpbHVyZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpIHsKKyAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+ICZyIDogX21SZXN1bHRzKSB7CisgICAgICAgIGZhaWx1cmVzLT5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKHIpKTsKKyAgICB9CisgICAgX21SZXN1bHRzLmNsZWFyKCk7CisgICAgcmV0dXJuIF9tU3RhdHVzOworfQorCitDMlNldHRpbmdSZXN1bHRzQnVpbGRlcjo6QzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoYzJfc3RhdHVzX3Qgc3RhdHVzKSA6IF9tU3RhdHVzKHN0YXR1cykgeworICAgIC8vIHN0YXR1cyBtdXN0IGJlIG9uZSBvZiBPSywgQkFEX1NUQVRFLCBUSU1FRF9PVVQgb3IgQ09SUlVQVEVECisgICAgLy8gbWFpbmx5OiBCTE9DS0lORywgQkFEX0lOREVYLCBCQURfVkFMVUUgYW5kIE5PX01FTU9SWSByZXF1aXJlcyBhIHNldHRpbmcgYXR0ZW1wdAorfQorCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJGaWVsZFV0aWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IEMyX0hJREUgQzJGaWVsZFV0aWxzOjpfSW5zcGVjdG9yIHsKKyAgICAvLy8gcmV0dXJucyB0aGUgaW1wbGVtZW50YXRpb24gb2JqZWN0CisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8SW5mbzo6SW1wbD4gR2V0SW1wbChjb25zdCBJbmZvICZpbmZvKSB7CisgICAgICAgIHJldHVybiBpbmZvLl9tSW1wbDsKKyAgICB9Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyRmllbGRVdGlsczo6SW5mbyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBDMl9ISURFIEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbCB7CisgICAgQzJGaWVsZERlc2NyaXB0b3IgZmllbGQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IHBhcmVudDsKKyAgICB1aW50MzJfdCBpbmRleDsKKyAgICB1aW50MzJfdCBkZXB0aDsKKyAgICB1aW50MzJfdCBiYXNlRmllbGRPZmZzZXQ7CisgICAgdWludDMyX3QgYXJyYXlPZmZzZXQ7CisgICAgdWludDMyX3QgdXNlZEV4dGVudDsKKworICAgIC8vLyBjcmVhdGVzIGEgY29weSBvZiB0aGlzIG9iamVjdCBpbmNsdWRpbmcgY29waWVzIG9mIGl0cyBwYXJlbnQgY2hhaW4KKyAgICBJbXBsIGNsb25lKCkgY29uc3Q7CisKKyAgICAvLy8gY3JlYXRlcyBhIGNvcHkgb2YgYSBzaGFyZWQgcG9pbnRlciB0byBhbiBvYmplY3QKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEltcGw+IENsb25lKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiAmKTsKKworICAgIEltcGwoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZpZWxkXywgc3RkOjpzaGFyZWRfcHRyPEltcGw+IHBhcmVudF8sCisgICAgICAgICAgICB1aW50MzJfdCBpbmRleF8sIHVpbnQzMl90IGRlcHRoXywgdWludDMyX3QgYmFzZUZpZWxkT2Zmc2V0XywKKyAgICAgICAgICAgIHVpbnQzMl90IGFycmF5T2Zmc2V0XywgdWludDMyX3QgdXNlZEV4dGVudF8pCisgICAgICAgIDogZmllbGQoZmllbGRfKSwgcGFyZW50KHBhcmVudF8pLCBpbmRleChpbmRleF8pLCBkZXB0aChkZXB0aF8pLAorICAgICAgICAgIGJhc2VGaWVsZE9mZnNldChiYXNlRmllbGRPZmZzZXRfKSwgYXJyYXlPZmZzZXQoYXJyYXlPZmZzZXRfKSwgdXNlZEV4dGVudCh1c2VkRXh0ZW50XykgeyB9Cit9OworCitzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPiBDMkZpZWxkVXRpbHM6OkluZm86OkltcGw6OkNsb25lKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiAmaW5mbykgeworICAgIGlmIChpbmZvKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEltcGw+KGluZm8tPmNsb25lKCkpOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworQzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsIEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbDo6Y2xvbmUoKSBjb25zdCB7CisgICAgSW1wbCByZXMgPSBJbXBsKCp0aGlzKTsKKyAgICByZXMucGFyZW50ID0gQ2xvbmUocmVzLnBhcmVudCk7CisgICAgcmV0dXJuIHJlczsKK30KKworQzJGaWVsZFV0aWxzOjpJbmZvOjpJbmZvKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsKQorICAgIDogX21JbXBsKGltcGwpIHsgfQorCitzaXplX3QgQzJGaWVsZFV0aWxzOjpJbmZvOjphcnJheU9mZnNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX21JbXBsLT5hcnJheU9mZnNldDsKK30KKworc2l6ZV90IEMyRmllbGRVdGlsczo6SW5mbzo6YXJyYXlTaXplKCkgY29uc3QgeworICAgIHJldHVybiBleHRlbnQoKSAqIHNpemUoKTsKK30KKworc2l6ZV90IEMyRmllbGRVdGlsczo6SW5mbzo6YmFzZUZpZWxkT2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPmJhc2VGaWVsZE9mZnNldDsKK307CisKK3NpemVfdCBDMkZpZWxkVXRpbHM6OkluZm86OmRlcHRoKCkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPmRlcHRoOworfQorCitzaXplX3QgQzJGaWVsZFV0aWxzOjpJbmZvOjpleHRlbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIF9tSW1wbC0+dXNlZEV4dGVudDsKK30KKworc2l6ZV90IEMyRmllbGRVdGlsczo6SW5mbzo6aW5kZXgoKSBjb25zdCB7CisgICAgcmV0dXJuIF9tSW1wbC0+aW5kZXg7Cit9CisKK2Jvb2wgQzJGaWVsZFV0aWxzOjpJbmZvOjppc0FyaXRobWV0aWMoKSBjb25zdCB7CisgICAgc3dpdGNoIChfbUltcGwtPmZpZWxkLnR5cGUoKSkgeworICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkJMT0I6CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6Q05UUjMyOgorICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkNOVFI2NDoKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpGTE9BVDoKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQzMjoKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQ2NDoKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpTVFJJTkc6CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDMyOgorICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQ2NDoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworYm9vbCBDMkZpZWxkVXRpbHM6OkluZm86OmlzRmxleGlibGUoKSBjb25zdCB7CisgICAgcmV0dXJuIF9tSW1wbC0+ZmllbGQuZXh0ZW50KCkgPT0gMDsKK30KKworQzJTdHJpbmcgQzJGaWVsZFV0aWxzOjpJbmZvOjpuYW1lKCkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPmZpZWxkLm5hbWUoKTsKK30KKworY29uc3QgQzJGaWVsZFV0aWxzOjpJbmZvOjpOYW1lZFZhbHVlc1R5cGUgJkMyRmllbGRVdGlsczo6SW5mbzo6bmFtZWRWYWx1ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIF9tSW1wbC0+ZmllbGQubmFtZWRWYWx1ZXMoKTsKK30KKworc2l6ZV90IEMyRmllbGRVdGlsczo6SW5mbzo6b2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KF9tSW1wbC0+ZmllbGQpOworfQorCitDMkZpZWxkVXRpbHM6OkluZm8gQzJGaWVsZFV0aWxzOjpJbmZvOjpwYXJlbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIEluZm8oX21JbXBsLT5wYXJlbnQpOworfTsKKworc2l6ZV90IEMyRmllbGRVdGlsczo6SW5mbzo6c2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gX0MyUGFyYW1JbnNwZWN0b3I6OkdldFNpemUoX21JbXBsLT5maWVsZCk7Cit9CisKK0MyRmllbGRVdGlsczo6SW5mbzo6dHlwZV90IEMyRmllbGRVdGlsczo6SW5mbzo6dHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gX21JbXBsLT5maWVsZC50eXBlKCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJGaWVsZFV0aWxzOjpJdGVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBDMl9ISURFIEMyRmllbGRVdGlsczo6SXRlcmF0b3I6OkltcGwgOiBwdWJsaWMgX0MyUGFyYW1JbnNwZWN0b3IgeworICAgIEltcGwoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIH5JbXBsKCkgPSBkZWZhdWx0OworCisgICAgLy8vIGltcGxlbWVudHMgb2JqZWN0IGVxdWFsaXR5CisgICAgdmlydHVhbCBib29sIGVxdWFscyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBvdGhlciAhPSBudWxscHRyICYmIG1IZWFkID09IG90aGVyLT5tSGVhZDsKKyAgICB9OworCisgICAgLy8vIHJldHVybnMgdGhlIGluZm8gcG9pbnRlZCB0byBieSB0aGlzIGl0ZXJhdG9yCisgICAgdmlydHVhbCB2YWx1ZV90eXBlIGdldCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEluZm8obUhlYWQpOworICAgIH0KKworICAgIC8vLyBpbmNyZW1lbnRzIHRoaXMgaXRlcmF0b3IKKyAgICB2aXJ0dWFsIHZvaWQgaW5jcmVtZW50KCkgeworICAgICAgICAvLyBub3RlOiB0aGlzIGNhbm5vdCBiZSBhYnN0cmFjdCBhcyB3ZSBpbnN0YW50aWF0ZSB0aGlzIGZvciBMaXN0OjplbmQoKS4gaW5jcmVtZW50IHRvIGVuZCgpCisgICAgICAgIC8vIGluc3RlYWQuCisgICAgICAgIG1IZWFkLnJlc2V0KCk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgSW1wbChzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPiBoZWFkKQorICAgICAgICA6IG1IZWFkKGhlYWQpIHsgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEluZm86OkltcGw+IG1IZWFkOyAvLy88IGN1cnJlbnQgZmllbGQKK307CisKK0MyRmllbGRVdGlsczo6SXRlcmF0b3I6Okl0ZXJhdG9yKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsKQorICAgIDogbUltcGwoaW1wbCkgeyB9CisKK0MyRmllbGRVdGlsczo6SXRlcmF0b3I6OnZhbHVlX3R5cGUgQzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6b3BlcmF0b3IqKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0KCk7Cit9CisKK0MyRmllbGRVdGlsczo6SXRlcmF0b3ImIEMyRmllbGRVdGlsczo6SXRlcmF0b3I6Om9wZXJhdG9yKysoKSB7CisgICAgbUltcGwtPmluY3JlbWVudCgpOworICAgIHJldHVybiAqdGhpczsKK30KKworYm9vbCBDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpvcGVyYXRvcj09KGNvbnN0IEl0ZXJhdG9yICZvdGhlcikgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+ZXF1YWxzKG90aGVyLm1JbXBsKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMkZpZWxkVXRpbHM6Okxpc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgQzJfSElERSBDMkZpZWxkVXRpbHM6Okxpc3Q6OkltcGwgeworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEl0ZXJhdG9yOjpJbXBsPiBiZWdpbigpIGNvbnN0ID0gMDsKKworICAgIC8vLyByZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxJdGVyYXRvcjo6SW1wbD4gZW5kKCkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxJdGVyYXRvcjo6SW1wbD4oKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5JbXBsKCkgPSBkZWZhdWx0OworfTsKKworQzJGaWVsZFV0aWxzOjpMaXN0OjpMaXN0KHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsKQorICAgIDogbUltcGwoaW1wbCkgeyB9CisKK0MyRmllbGRVdGlsczo6SXRlcmF0b3IgQzJGaWVsZFV0aWxzOjpMaXN0OjpiZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gQzJGaWVsZFV0aWxzOjpJdGVyYXRvcihtSW1wbC0+YmVnaW4oKSk7Cit9CisKK0MyRmllbGRVdGlsczo6SXRlcmF0b3IgQzJGaWVsZFV0aWxzOjpMaXN0OjplbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIEMyRmllbGRVdGlsczo6SXRlcmF0b3IobUltcGwtPmVuZCgpKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMkZpZWxkVXRpbHM6OmVudW1lcmF0ZUZpZWxkcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK25hbWVzcGFjZSB7CisKKy8qKgorICogSXRlcmF0b3IgYmFzZSBjbGFzcyBoZWxwZXIgdGhhdCBhbGxvd3MgZGVzY2VuZGluZyBpbnRvIHRoZSBmaWVsZCBoaWVyYXJjaHkuCisgKi8KK3N0cnVjdCBDMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvckhlbHBlciA6IHB1YmxpYyBDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpJbXBsIHsKKyAgICB2aXJ0dWFsIH5DMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvckhlbHBlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIC8vLyByZXR1cm5zIHRoZSBiYXNlLWZpZWxkJ3Mgb2Zmc2V0IG9mIHRoZSBwYXJlbnQgZmllbGQgKG9yIHRoZSBwYXJhbSBvZmZzZXQgaWYgbm8gcGFyZW50KQorICAgIHN0YXRpYyBpbmxpbmUgdWludDMyX3QgR2V0UGFyZW50QmFzZUZpZWxkT2Zmc2V0KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gcGFyZW50KSB7CisgICAgICAgIHJldHVybiBwYXJlbnQgPT0gbnVsbHB0ciA/IHNpemVvZihDMlBhcmFtKSA6IHBhcmVudC0+YmFzZUZpZWxkT2Zmc2V0OworICAgIH0KKworICAgIC8vLyByZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhlIHBhcmVudCBmaWVsZCAob3IgdGhlIHBhcmFtKQorICAgIHN0YXRpYyBpbmxpbmUgdWludDMyX3QgR2V0UGFyZW50T2Zmc2V0KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+IHBhcmVudCkgeworICAgICAgICByZXR1cm4gcGFyZW50ID09IG51bGxwdHIgPyBzaXplb2YoQzJQYXJhbSkgOiBHZXRPZmZzZXQocGFyZW50LT5maWVsZCk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgQzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3JIZWxwZXIoCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gcmVmbGVjdG9yLAorICAgICAgICAgICAgdWludDMyX3QgcGFyYW1TaXplLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gaGVhZCA9IG51bGxwdHIpCisgICAgICAgIDogQzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6SW1wbChoZWFkKSwKKyAgICAgICAgICBtUGFyYW1TaXplKHBhcmFtU2l6ZSksCisgICAgICAgICAgbVJlZmxlY3RvcihyZWZsZWN0b3IpIHsgfQorCisgICAgLy8vIHJldHVybnMgYSBsZWFmIGluZm8gb2JqZWN0IGF0IGEgc3BlY2lmaWMgaW5kZXggZm9yIGEgY2hpbGQgZmllbGQKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPiBtYWtlTGVhZigKKyAgICAgICAgICAgIGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmaWVsZCwgdWludDMyX3QgaW5kZXgpIHsKKyAgICAgICAgdWludDMyX3QgcGFyZW50T2Zmc2V0ID0gR2V0UGFyZW50T2Zmc2V0KG1IZWFkKTsKKyAgICAgICAgdWludDMyX3QgYXJyYXlPZmZzZXQgPSBwYXJlbnRPZmZzZXQgKyBHZXRPZmZzZXQoZmllbGQpOworICAgICAgICB1aW50MzJfdCB1c2VkRXh0ZW50ID0gZmllbGQuZXh0ZW50KCkgPyA6CisgICAgICAgICAgICAgICAgKHN0ZDo6bWF4KGFycmF5T2Zmc2V0LCBtUGFyYW1TaXplKSAtIGFycmF5T2Zmc2V0KSAvIEdldFNpemUoZmllbGQpOworCisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4oCisgICAgICAgICAgICAgICAgT2Zmc2V0RmllbGREZXNjcmlwdG9yKGZpZWxkLCBwYXJlbnRPZmZzZXQgKyBpbmRleCAqIEdldFNpemUoZmllbGQpKSwKKyAgICAgICAgICAgICAgICBtSGVhZCAvKiBwYXJlbnQgKi8sIGluZGV4LCBtSGVhZCA9PSBudWxscHRyID8gMCA6IG1IZWFkLT5kZXB0aCArIDEsCisgICAgICAgICAgICAgICAgR2V0UGFyZW50QmFzZUZpZWxkT2Zmc2V0KG1IZWFkKSArIEdldE9mZnNldChmaWVsZCksCisgICAgICAgICAgICAgICAgYXJyYXlPZmZzZXQsIHVzZWRFeHRlbnQpOworICAgIH0KKworICAgIC8vLyByZXR1cm5zIHdoZXRoZXIgdGhpcyBzdHJ1Y3QgaW5kZXggaGF2ZSBiZWVuIHRyYXZlcnNlZCB0byBnZXQgdG8gdGhpcyBmaWVsZAorICAgIGJvb2wgdmlzaXRlZChDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgpIGNvbnN0IHsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiAmc2QgOiBtSGlzdG9yeSkgeworICAgICAgICAgICAgaWYgKHNkLT5jb3JlSW5kZXgoKSA9PSBpbmRleCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBtUGFyYW1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBtUmVmbGVjdG9yOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+PiBtSGlzdG9yeTsgLy8gc3RydWN0dXJlIHR5cGVzIHZpc2l0ZWQKK307CisKKy8qKgorICogSXRlcmF0b3IgaW1wbGVtZW50aW5nIGVudW1lcmF0ZUZpZWxkcygpIHRoYXQgdmlzaXRzIGVhY2ggYmFzZSBmaWVsZC4KKyAqLworc3RydWN0IEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9yIDogcHVibGljIEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9ySGVscGVyIHsKKyAgICAvLy8gZW51bWVyYXRlIGJhc2UgZmllbGRzIG9mIGEgcGFyYW1ldGVyCisgICAgQzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3IoY29uc3QgQzJQYXJhbSAmcGFyYW0sIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiByZWZsZWN0b3IpCisgICAgICAgIDogQzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3JIZWxwZXIocmVmbGVjdG9yLCBwYXJhbS5zaXplKCkpIHsKKyAgICAgICAgZGVzY2VuZEludG8ocGFyYW0uY29yZUluZGV4KCkpOworICAgIH0KKworICAgIC8vLyBlbnVtZXJhdGUgYmFzZSBmaWVsZHMgb2YgYSBmaWVsZAorICAgIEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9yKHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvcj4gaW1wbCkKKyAgICAgICAgOiBDMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvckhlbHBlcihpbXBsLT5tUmVmbGVjdG9yLCBpbXBsLT5tUGFyYW1TaXplLCBpbXBsLT5tSGVhZCkgeworICAgICAgICBtSGlzdG9yeSA9IGltcGwtPm1IaXN0b3J5OworICAgICAgICBpZiAobUhlYWQtPmZpZWxkLnR5cGUoKSAmIEMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRykgeworICAgICAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4ID0geyBtSGVhZC0+ZmllbGQudHlwZSgpICZ+QzJGaWVsZERlc2NyaXB0b3I6OlNUUlVDVF9GTEFHIH07CisgICAgICAgICAgICBpZiAoIXZpc2l0ZWQoaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgZGVzY2VuZEludG8oaW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB+QzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3IoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICAvLy8gSW5jcmVtZW50cyB0aGlzIGl0ZXJhdG9yIGJ5IHZpc2l0aW5nIGVhY2ggYmFzZSBmaWVsZC4KKyAgICB2aXJ0dWFsIHZvaWQgaW5jcmVtZW50KCkgb3ZlcnJpZGUgeworICAgICAgICAvLyBkb24ndCBnbyBwYXN0IGVuZAorICAgICAgICBpZiAobUhlYWQgPT0gbnVsbHB0ciB8fCBfbUZpZWxkcy5lbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBkZXNjZW5kIGludG8gc3RydWN0dXJlcworICAgICAgICBpZiAobUhlYWQtPmZpZWxkLnR5cGUoKSAmIEMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRykgeworICAgICAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4ID0geyBtSGVhZC0+ZmllbGQudHlwZSgpICZ+QzJGaWVsZERlc2NyaXB0b3I6OlNUUlVDVF9GTEFHIH07CisgICAgICAgICAgICAvLyBkbyBub3QgcmVjdXJzZSBpbnRvIHRoZSBzYW1lIHN0cnVjdHMKKyAgICAgICAgICAgIGlmICghdmlzaXRlZChpbmRleCkgJiYgZGVzY2VuZEludG8oaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gYXNjZW5kIGFmdGVyIHRoZSBsYXN0IGZpZWxkIGluIHRoZSBjdXJyZW50IHN0cnVjdAorICAgICAgICB3aGlsZSAoIW1IaXN0b3J5LmVtcHR5KCkgJiYgX21GaWVsZHMuYmFjaygpID09IG1IaXN0b3J5LmJhY2soKS0+ZW5kKCkpIHsKKyAgICAgICAgICAgIG1IZWFkID0gbUhlYWQtPnBhcmVudDsKKyAgICAgICAgICAgIG1IaXN0b3J5LnBvcF9iYWNrKCk7CisgICAgICAgICAgICBfbUZpZWxkcy5wb3BfYmFjaygpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZG9uZSBpZiBoaXN0b3J5IGlzIG5vdyBlbXB0eQorICAgICAgICBpZiAoX21GaWVsZHMuZW1wdHkoKSkgeworICAgICAgICAgICAgLy8gd2UgY291bGQgYmUgdHJhdmVyc2luZyBhIHN1Yi10cmVlIHNvIGNsZWFyIGhlYWQKKyAgICAgICAgICAgIG1IZWFkLnJlc2V0KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBtb3ZlIHRvIHRoZSBuZXh0IGZpZWxkIGluIHRoZSBjdXJyZW50IHN0cnVjdAorICAgICAgICBDMlN0cnVjdERlc2NyaXB0b3I6OmZpZWxkX2l0ZXJhdG9yIG5leHQgPSBfbUZpZWxkcy5iYWNrKCk7CisgICAgICAgIG1IZWFkLT5maWVsZCA9IE9mZnNldEZpZWxkRGVzY3JpcHRvcigqbmV4dCwgR2V0UGFyZW50T2Zmc2V0KG1IZWFkLT5wYXJlbnQpKTsKKyAgICAgICAgbUhlYWQtPmluZGV4ID0gMDsgLy8gcmVzZXQgaW5kZXgganVzdCBpbiBjYXNlIGZvciBjb3JyZWN0bmVzcworICAgICAgICBtSGVhZC0+YmFzZUZpZWxkT2Zmc2V0ID0gR2V0UGFyZW50QmFzZUZpZWxkT2Zmc2V0KG1IZWFkLT5wYXJlbnQpICsgR2V0T2Zmc2V0KCpuZXh0KTsKKyAgICAgICAgbUhlYWQtPmFycmF5T2Zmc2V0ID0gR2V0T2Zmc2V0KG1IZWFkLT5maWVsZCk7CisgICAgICAgIG1IZWFkLT51c2VkRXh0ZW50ID0gbUhlYWQtPmZpZWxkLmV4dGVudCgpID8gOgorICAgICAgICAgICAgICAgIChzdGQ6Om1heChtSGVhZC0+YXJyYXlPZmZzZXQsIG1QYXJhbVNpemUpIC0gbUhlYWQtPmFycmF5T2Zmc2V0KQorICAgICAgICAgICAgICAgICAgICAgICAgLyBHZXRTaXplKG1IZWFkLT5maWVsZCk7CisgICAgICAgICsrX21GaWVsZHMuYmFjaygpOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLy8gSWYgdGhlIGN1cnJlbnQgZmllbGQgaXMgYSBrbm93biwgdmFsaWQgKHVudHJhdmVyc2VkKSBzdHJ1Y3R1cmUsIGl0IG1vZGlmaWVzIHRoaXMgaXRlcmF0b3IKKyAgICAvLy8gdG8gcG9pbnQgdG8gdGhlIGZpcnN0IGZpZWxkIG9mIHRoZSBzdHJ1Y3R1cmUgYW5kIHJldHVybnMgdHJ1ZS4gT3RoZXJ3aXNlLCBpdCBkb2VzIG5vdAorICAgIC8vLyBtb2RpZnkgdGhpcyBpdGVyYXRvciBhbmQgcmV0dXJucyBmYWxzZS4KKyAgICBib29sIGRlc2NlbmRJbnRvKEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjVW5pcXVlID0gbVJlZmxlY3Rvci0+ZGVzY3JpYmUoaW5kZXgpOworICAgICAgICAvLyBkZXNjZW5kIGludG8ga25vd24gc3RydWN0cyAoYXMgbG9uZyBhcyB0aGV5IGhhdmUgYXQgbGVhc3Qgb25lIGZpZWxkKQorICAgICAgICBpZiAoZGVzY1VuaXF1ZSAmJiBkZXNjVW5pcXVlLT5iZWdpbigpICE9IGRlc2NVbmlxdWUtPmVuZCgpKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjKHN0ZDo6bW92ZShkZXNjVW5pcXVlKSk7CisgICAgICAgICAgICBtSGlzdG9yeS5lbXBsYWNlX2JhY2soZGVzYyk7CisgICAgICAgICAgICBDMlN0cnVjdERlc2NyaXB0b3I6OmZpZWxkX2l0ZXJhdG9yIGZpcnN0ID0gZGVzYy0+YmVnaW4oKTsKKyAgICAgICAgICAgIG1IZWFkID0gbWFrZUxlYWYoKmZpcnN0LCAwIC8qIGluZGV4ICovKTsKKyAgICAgICAgICAgIF9tRmllbGRzLmVtcGxhY2VfYmFjaygrK2ZpcnN0KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLy8gbmV4dCBmaWVsZCBwb2ludGVycyBmb3IgZWFjaCBkZXB0aC4KKyAgICAvLy8gbm90ZTogX21GaWVsZHMgbWF5IGJlIHNob3J0ZWQgdGhhbiBtSGlzdG9yeSwgaWYgaXRlcmF0aW5nIGF0IGEgZGVwdGgKKyAgICBzdGQ6OnZlY3RvcjxDMlN0cnVjdERlc2NyaXB0b3I6OmZpZWxkX2l0ZXJhdG9yPiBfbUZpZWxkczsKK307CisKKy8qKgorICogSXRlcmFibGUgaW1wbGVtZW50aW5nIGVudW1lcmF0ZUZpZWxkcygpLgorICovCitzdHJ1Y3QgQzJGaWVsZFV0aWxzRmllbGRJdGVyYWJsZSA6IHB1YmxpYyBDMkZpZWxkVXRpbHM6Okxpc3Q6OkltcGwgeworICAgIC8vLyByZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpJbXBsPiBiZWdpbigpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8QzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3I+KCpfbVBhcmFtLCBfbVJlZmxlY3Rvcik7CisgICAgfTsKKworICAgIEMyRmllbGRVdGlsc0ZpZWxkSXRlcmFibGUoY29uc3QgQzJQYXJhbSAmcGFyYW0sIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiByZWZsZWN0b3IpCisgICAgICAgIDogX21QYXJhbSgmcGFyYW0pLCBfbVJlZmxlY3RvcihyZWZsZWN0b3IpIHsgfQorCitwcml2YXRlOgorICAgIGNvbnN0IEMyUGFyYW0gKl9tUGFyYW07CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IF9tUmVmbGVjdG9yOworfTsKKworfQorCitDMkZpZWxkVXRpbHM6Okxpc3QgQzJGaWVsZFV0aWxzOjplbnVtZXJhdGVGaWVsZHMoCisgICAgICAgIGNvbnN0IEMyUGFyYW0gJnBhcmFtLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvcikgeworICAgIHJldHVybiBDMkZpZWxkVXRpbHM6Okxpc3Qoc3RkOjptYWtlX3NoYXJlZDxDMkZpZWxkVXRpbHNGaWVsZEl0ZXJhYmxlPihwYXJhbSwgcmVmbGVjdG9yKSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJGaWVsZFV0aWxzOjplbnVtZXJhdGUgc2libGluZ3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCituYW1lc3BhY2UgeworCitzdHJ1Y3QgQzJGaWVsZFV0aWxzQ291c2luc0l0ZXJhdG9yIDogcHVibGljIEMyRmllbGRVdGlsczo6SXRlcmF0b3I6OkltcGwgeworICAgIEMyRmllbGRVdGlsc0NvdXNpbnNJdGVyYXRvcigKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPiAmaW5mbywgc2l6ZV90IGxldmVsKQorICAgICAgICAgIC8vIGNsb25lIGluZm8gY2hhaW4gYXMgdGhpcyBpdGVyYXRvciB3aWxsIGNoYW5nZSBpdAorICAgICAgICA6IEMyRmllbGRVdGlsczo6SXRlcmF0b3I6OkltcGwoQzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsOjpDbG9uZShpbmZvKSkgeworICAgICAgICBpZiAobGV2ZWwgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gc3RvcmUgcGFyZW50IGNoYWluICh1cCB0byBsZXZlbCkgZm9yIHF1aWNrIGFjY2VzcworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPiBub2RlID0gbUhlYWQ7CisgICAgICAgIHNpemVfdCBpeCA9IDA7CisgICAgICAgIGZvciAoOyBpeCA8IGxldmVsICYmIG5vZGU7ICsraXgpIHsKKyAgICAgICAgICAgIG5vZGUtPmluZGV4ID0gMDsKKyAgICAgICAgICAgIF9tUGF0aC5lbXBsYWNlX2JhY2sobm9kZSk7CisgICAgICAgICAgICBub2RlID0gbm9kZS0+cGFyZW50OworICAgICAgICB9CisgICAgICAgIHNldHVwUGF0aChpeCk7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJGaWVsZFV0aWxzQ291c2luc0l0ZXJhdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgLy8vIEluY3JlbWVudHMgdGhpcyBpdGVyYXRvciBieSB2aXNpdGluZyBlYWNoIGluZGV4LgorICAgIHZpcnR1YWwgdm9pZCBpbmNyZW1lbnQoKSBvdmVycmlkZSB7CisgICAgICAgIHNpemVfdCBpeCA9IDA7CisgICAgICAgIHdoaWxlIChpeCA8IF9tUGF0aC5zaXplKCkpIHsKKyAgICAgICAgICAgIGlmICgrK19tUGF0aFtpeF0tPmluZGV4IDwgX21QYXRoW2l4XS0+dXNlZEV4dGVudCkgeworICAgICAgICAgICAgICAgIHNldHVwUGF0aChpeCArIDEpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9tUGF0aFtpeCsrXS0+aW5kZXggPSAwOworICAgICAgICB9CisgICAgICAgIG1IZWFkLnJlc2V0KCk7CisgICAgfQorCitwcml2YXRlOgorICAgIC8vLyBhZGp1c3RzIGZpZWxkIG9mZnNldHMgYWxvbmcgdGhlIHBhdGggdXAgdG8gdGhlIHNwZWNpZmljIGxldmVsIC0gMS4KKyAgICAvLy8gVGhpcyBpbi1mYWN0IGhhcyB0byBiZSBkb25lIGRvd24gdGhlIHBhdGggZnJvbSBwYXJlbnQgdG8gY2hpbGQgYXMgY2hpbGQgZmllbGRzIG11c3QKKyAgICAvLy8gZmFsbCB3aXRoaW4gcGFyZW50IGZpZWxkcy4KKyAgICB2b2lkIHNldHVwUGF0aChzaXplX3QgbGV2ZWwpIHsKKyAgICAgICAgQzJfQ0hFQ0tfTEUobGV2ZWwsIF9tUGF0aC5zaXplKCkpOworICAgICAgICB1aW50MzJfdCBvbGRBcnJheU9mZnNldCA9IGxldmVsID8gX21QYXRoW2xldmVsIC0gMV0tPmFycmF5T2Zmc2V0IDogMCAvKiB1bnVzZWQgKi87CisgICAgICAgIHdoaWxlIChsZXZlbCkgeworICAgICAgICAgICAgLS1sZXZlbDsKKyAgICAgICAgICAgIEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbCAmcGF0aCA9ICpfbVBhdGhbbGV2ZWxdOworICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSA9IEdldFNpemUocGF0aC5maWVsZCk7CisgICAgICAgICAgICB1aW50MzJfdCBvZmZzZXQgPSBwYXRoLmFycmF5T2Zmc2V0ICsgc2l6ZSAqIHBhdGguaW5kZXg7CisgICAgICAgICAgICBTZXRPZmZzZXQocGF0aC5maWVsZCwgb2Zmc2V0KTsKKyAgICAgICAgICAgIGlmIChsZXZlbCkgeworICAgICAgICAgICAgICAgIC8vIHJlc2V0IGNoaWxkJ3MgYXJyYXkgb2Zmc2V0IHRvIGZhbGwgd2l0aGluIGN1cnJlbnQgaW5kZXgsIGJ1dCBob2xkIG9udG8gdGhlCisgICAgICAgICAgICAgICAgLy8gb3JpZ2luYWwgdmFsdWUgb2YgdGhlIGFycmF5T2Zmc2V0IHNvIHRoYXQgd2UgY2FuIGFkanVzdCBzdWJzZXF1ZW50IGNoaWxkcmVuLgorICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYmVjYXVzZSB0aGUgbW9kdWxvIGlzIG9ubHkgZGVmaW5lZCB3aXRoaW4gdGhlIGN1cnJlbnQgYXJyYXkuCisgICAgICAgICAgICAgICAgdWludDMyX3QgY2hpbGRBcnJheU9mZnNldCA9CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArIChfbVBhdGhbbGV2ZWwgLSAxXS0+YXJyYXlPZmZzZXQgLSBvbGRBcnJheU9mZnNldCkgJSBzaXplOworICAgICAgICAgICAgICAgIG9sZEFycmF5T2Zmc2V0ID0gX21QYXRoW2xldmVsIC0gMV0tPmFycmF5T2Zmc2V0OworICAgICAgICAgICAgICAgIF9tUGF0aFtsZXZlbCAtIDFdLT5hcnJheU9mZnNldCA9IGNoaWxkQXJyYXlPZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPj4gX21QYXRoOworfTsKKworLyoqCisgKiBJdGVyYWJsZSBpbXBsZW1lbnRpbmcgZW51bWVyYXRlRmllbGRzKCkuCisgKi8KK3N0cnVjdCBDMkZpZWxkVXRpbHNDb3VzaW5zSXRlcmFibGUgOiBwdWJsaWMgQzJGaWVsZFV0aWxzOjpMaXN0OjpJbXBsIHsKKyAgICAvLy8gcmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0CisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6SW1wbD4gYmVnaW4oKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEMyRmllbGRVdGlsc0NvdXNpbnNJdGVyYXRvcj4oX21IZWFkLCBfbUxldmVsKTsKKyAgICB9OworCisgICAgQzJGaWVsZFV0aWxzQ291c2luc0l0ZXJhYmxlKGNvbnN0IEMyRmllbGRVdGlsczo6SW5mbyAmZmllbGQsIHVpbnQzMl90IGxldmVsKQorICAgICAgICA6IF9tSGVhZChDMkZpZWxkVXRpbHM6Ol9JbnNwZWN0b3I6OkdldEltcGwoZmllbGQpKSwgX21MZXZlbChsZXZlbCkgeyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gX21IZWFkOworICAgIHNpemVfdCBfbUxldmVsOworfTsKKworfQorCitDMkZpZWxkVXRpbHM6Okxpc3QgQzJGaWVsZFV0aWxzOjplbnVtZXJhdGVDb3VzaW5zKGNvbnN0IEMyRmllbGRVdGlsczo6SW5mbyAmZmllbGQsIHVpbnQzMl90IGxldmVsKSB7CisgICAgcmV0dXJuIEMyRmllbGRVdGlsczo6TGlzdChzdGQ6Om1ha2Vfc2hhcmVkPEMyRmllbGRVdGlsc0NvdXNpbnNJdGVyYWJsZT4oZmllbGQsIGxldmVsKSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJGaWVsZFV0aWxzOjpsb2NhdGVGaWVsZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK25hbWVzcGFjZSB7CisKKy8qKgorICogSXRlcmF0b3IgaW1wbGVtZW50aW5nIGxvY2F0ZUZpZWxkKCkuCisgKi8KK3N0cnVjdCBDMkZpZWxkVXRpbHNGaWVsZExvY2F0b3IgOiBwdWJsaWMgQzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3JIZWxwZXIgeworICAgIEMyRmllbGRVdGlsc0ZpZWxkTG9jYXRvcigKKyAgICAgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCwgY29uc3QgX0MyRmllbGRJZCAmZmllbGQsIHVpbnQzMl90IHBhcmFtU2l6ZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiByZWZsZWN0b3IpCisgICAgICAgIDogQzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3JIZWxwZXIocmVmbGVjdG9yLCBwYXJhbVNpemUpLAorICAgICAgICAgIF9tRmllbGQoZmllbGQpIHsKKyAgICAgICAgd2hpbGUgKGRlc2NlbmRJbnRvKGluZGV4KSkgeworICAgICAgICAgICAgaWYgKChtSGVhZC0+ZmllbGQudHlwZSgpICYgQzJGaWVsZERlc2NyaXB0b3I6OlNUUlVDVF9GTEFHKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmRleCA9IEMyUGFyYW06OkNvcmVJbmRleChtSGVhZC0+ZmllbGQudHlwZSgpICZ+IEMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGluY3JlbWVudCgpIHsKKyAgICAgICAgbUhlYWQgPSBfbVRhaWw7CisgICAgICAgIF9tVGFpbCA9IG51bGxwdHI7CisgICAgfQorCitwcml2YXRlOgorICAgIC8vLyBJZiB0aGUgY3VycmVudCBmaWVsZCBpcyBhIGtub3duLCB2YWxpZCAodW50cmF2ZXJzZWQpIHN0cnVjdHVyZSwgaXQgbW9kaWZpZXMgdGhpcyBpdGVyYXRvcgorICAgIC8vLyB0byBwb2ludCB0byB0aGUgZmllbGQgYXQgdGhlIGJlZ2lubmluZy9lbmQgb2YgdGhlIGdpdmVuIGZpZWxkIG9mIHRoZSBzdHJ1Y3R1cmUgYW5kIHJldHVybnMKKyAgICAvLy8gdHJ1ZS4gT3RoZXJ3aXNlLCBpbmNsdWRpbmcgaWYgbm8gc3VjaCBmaWVsZCBleGlzdHMgaW4gdGhlIHN0cnVjdHVyZSwgaXQgZG9lcyBub3QgbW9kaWZ5IHRoaXMKKyAgICAvLy8gaXRlcmF0b3IgYW5kIHJldHVybnMgZmFsc2UuCisgICAgYm9vbCBkZXNjZW5kSW50byhDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgpIHsKKyAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgYm91bmRhcmllcyBvZiB0aGUgZmllbGQgdG8gYmUgbG9jYXRlZCBhcmUgc3RpbGwgd2l0aGluIHRoZSBzYW1lIHBhcmVudAorICAgICAgICAvLyBmaWVsZAorICAgICAgICBpZiAobUhlYWQgIT0gX21UYWlsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjVW5pcXVlID0gbVJlZmxlY3Rvci0+ZGVzY3JpYmUoaW5kZXgpOworICAgICAgICAvLyBkZXNjZW5kIGludG8ga25vd24gc3RydWN0cyAoYXMgbG9uZyBhcyB0aGV5IGhhdmUgYXQgbGVhc3Qgb25lIGZpZWxkKQorICAgICAgICBpZiAoZGVzY1VuaXF1ZSAmJiBkZXNjVW5pcXVlLT5iZWdpbigpICE9IGRlc2NVbmlxdWUtPmVuZCgpKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjKHN0ZDo6bW92ZShkZXNjVW5pcXVlKSk7CisgICAgICAgICAgICBtSGlzdG9yeS5lbXBsYWNlX2JhY2soZGVzYyk7CisKKyAgICAgICAgICAgIHVpbnQzMl90IHBhcmVudE9mZnNldCA9IEdldFBhcmVudE9mZnNldChtSGVhZCk7CisKKyAgICAgICAgICAgIC8vIGxvY2F0ZSBmaWVsZCB1c2luZyBhIGR1bW15IGZpZWxkIGRlc2NyaXB0b3IKKyAgICAgICAgICAgIEMyRmllbGREZXNjcmlwdG9yIGR1bW15ID0geworICAgICAgICAgICAgICAgIEMyRmllbGREZXNjcmlwdG9yOjpCTE9CLCAxIC8qIGV4dGVudCAqLywgIm5hbWUiLAorICAgICAgICAgICAgICAgIEdldE9mZnNldChfbUZpZWxkKSAtIHBhcmVudE9mZnNldCwgR2V0U2l6ZShfbUZpZWxkKQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgLy8gbG9jYXRlIGZpcnN0IGZpZWxkIHdoZXJlIG9mZnNldCBpcyBncmVhdGVyIHRoYW4gZHVtbXkgb2Zmc2V0ICh3aGljaCBpcyBvbmUgcGFzdCkKKyAgICAgICAgICAgIGF1dG8gaXQgPSBzdGQ6OnVwcGVyX2JvdW5kKAorICAgICAgICAgICAgICAgICAgICBkZXNjLT5jYmVnaW4oKSwgZGVzYy0+Y2VuZCgpLCBkdW1teSwKKyAgICAgICAgICAgICAgICAgICAgW10oY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmEsIGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZiKSAtPiBib29sIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldChhKSA8IF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRPZmZzZXQoYik7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmIChpdCA9PSBkZXNjLT5iZWdpbigpKSB7CisgICAgICAgICAgICAgICAgLy8gZmllbGQgaXMgcHJpb3IgdG8gZmlyc3QgZmllbGQKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAtLWl0OworICAgICAgICAgICAgY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZpZWxkID0gKml0OworCisgICAgICAgICAgICAvLyBjaGVjayB0aGF0IGR1bW15IGVuZC1vZmZzZXQgaXMgd2l0aGluIHRoaXMgZmllbGQKKyAgICAgICAgICAgIHVpbnQzMl90IHN0cnVjdFNpemUgPSBzdGQ6Om1heChtUGFyYW1TaXplLCBwYXJlbnRPZmZzZXQpIC0gcGFyZW50T2Zmc2V0OworICAgICAgICAgICAgaWYgKEdldEVuZE9mZnNldChkdW1teSkgPiBHZXRFbmRPZmZzZXQoZmllbGQsIHN0cnVjdFNpemUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50MzJfdCBzdGFydEluZGV4ID0gKEdldE9mZnNldChkdW1teSkgLSBHZXRPZmZzZXQoZmllbGQpKSAvIEdldFNpemUoZmllbGQpOworICAgICAgICAgICAgdWludDMyX3QgZW5kSW5kZXggPQorICAgICAgICAgICAgICAgIChHZXRFbmRPZmZzZXQoZHVtbXkpIC0gR2V0T2Zmc2V0KGZpZWxkKSArIEdldFNpemUoZmllbGQpIC0gMSkgLyBHZXRTaXplKGZpZWxkKTsKKyAgICAgICAgICAgIGlmIChlbmRJbmRleCA+IHN0YXJ0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICAvLyBGaWVsZCBzaXplIGNvdWxkIGJlIHplcm8sIGluIHdoaWNoIGNhc2UgZW5kIGluZGV4IGlzIHN0aWxsIG9uIHN0YXJ0IGluZGV4LgorICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIGZvciBhbGwgb3RoZXIgY2FzZXMsIGVuZEluZGV4IHdhcyByb3VuZGVkIHVwIHRvIHRoZSBuZXh0IGluZGV4LCBzbworICAgICAgICAgICAgICAgIC8vIGRlY3JlbWVudCBpdC4KKyAgICAgICAgICAgICAgICAtLWVuZEluZGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gc3RhcnRMZWFmID0KKyAgICAgICAgICAgICAgICBtYWtlTGVhZihmaWVsZCwgc3RhcnRJbmRleCk7CisgICAgICAgICAgICBpZiAoZW5kSW5kZXggPT0gc3RhcnRJbmRleCkgeworICAgICAgICAgICAgICAgIF9tVGFpbCA9IHN0YXJ0TGVhZjsKKyAgICAgICAgICAgICAgICBtSGVhZCA9IHN0YXJ0TGVhZjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgX21UYWlsID0gbWFrZUxlYWYoZmllbGQsIGVuZEluZGV4KTsKKyAgICAgICAgICAgICAgICBtSGVhZCA9IHN0YXJ0TGVhZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBfQzJGaWVsZElkIF9tRmllbGQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gX21UYWlsOworfTsKKworLyoqCisgKiBJdGVyYWJsZSBpbXBsZW1lbnRpbmcgbG9jYXRlRmllbGQoKS4KKyAqLworc3RydWN0IEMyRmllbGRVdGlsc0ZpZWxkTG9jYXRpb24gOiBwdWJsaWMgQzJGaWVsZFV0aWxzOjpMaXN0OjpJbXBsIHsKKyAgICAvLy8gcmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0CisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6SW1wbD4gYmVnaW4oKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEMyRmllbGRVdGlsc0ZpZWxkTG9jYXRvcj4oCisgICAgICAgICAgICAgICAgX21JbmRleCwgX21GaWVsZCwgX21QYXJhbVNpemUsIF9tUmVmbGVjdG9yKTsKKyAgICB9OworCisgICAgQzJGaWVsZFV0aWxzRmllbGRMb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW1GaWVsZCAmcGYsIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiByZWZsZWN0b3IpCisgICAgICAgIDogX21JbmRleChDMlBhcmFtOjpDb3JlSW5kZXgoX0MyUGFyYW1JbnNwZWN0b3I6OkdldEluZGV4KHBmKSkpLAorICAgICAgICAgIF9tRmllbGQoX0MyUGFyYW1JbnNwZWN0b3I6OkdldEZpZWxkKHBmKSksCisgICAgICAgICAgX21QYXJhbVNpemUoMCksCisgICAgICAgICAgX21SZWZsZWN0b3IocmVmbGVjdG9yKSB7IH0KKworCisgICAgQzJGaWVsZFV0aWxzRmllbGRMb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gJnBhcmFtLCBjb25zdCBfQzJGaWVsZElkICZmaWVsZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiByZWZsZWN0b3IpCisgICAgICAgIDogX21JbmRleChwYXJhbS5jb3JlSW5kZXgoKSksCisgICAgICAgICAgX21GaWVsZChmaWVsZCksCisgICAgICAgICAgX21QYXJhbVNpemUocGFyYW0uc2l6ZSgpKSwKKyAgICAgICAgICBfbVJlZmxlY3RvcihyZWZsZWN0b3IpIHsgfQorCitwcml2YXRlOgorICAgIEMyUGFyYW06OkNvcmVJbmRleCBfbUluZGV4OworICAgIF9DMkZpZWxkSWQgX21GaWVsZDsKKyAgICB1aW50MzJfdCBfbVBhcmFtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gX21SZWZsZWN0b3I7Cit9OworCit9CisKK3N0ZDo6dmVjdG9yPEMyRmllbGRVdGlsczo6SW5mbz4gQzJGaWVsZFV0aWxzOjpsb2NhdGVGaWVsZCgKKyAgICAgICAgY29uc3QgQzJQYXJhbUZpZWxkICZwZiwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpIHsKKyAgICBDMkZpZWxkVXRpbHM6Okxpc3QgbG9jYXRpb24gPSB7IHN0ZDo6bWFrZV9zaGFyZWQ8QzJGaWVsZFV0aWxzRmllbGRMb2NhdGlvbj4ocGYsIHJlZmxlY3RvcikgfTsKKyAgICByZXR1cm4gc3RkOjp2ZWN0b3I8SW5mbz4obG9jYXRpb24uYmVnaW4oKSwgbG9jYXRpb24uZW5kKCkpOworfQorCitzdGQ6OnZlY3RvcjxDMkZpZWxkVXRpbHM6OkluZm8+IEMyRmllbGRVdGlsczo6bG9jYXRlRmllbGQoCisgICAgICAgIGNvbnN0IEMyUGFyYW0gJnBhcmFtLCBjb25zdCBfQzJGaWVsZElkICZmaWVsZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpIHsKKyAgICBDMkZpZWxkVXRpbHM6Okxpc3QgbG9jYXRpb24gPSB7CisgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJGaWVsZFV0aWxzRmllbGRMb2NhdGlvbj4ocGFyYW0sIGZpZWxkLCByZWZsZWN0b3IpCisgICAgfTsKKyAgICByZXR1cm4gc3RkOjp2ZWN0b3I8SW5mbz4obG9jYXRpb24uYmVnaW4oKSwgbG9jYXRpb24uZW5kKCkpOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MyUGFyYW1VdGlscy5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MyUGFyYW1VdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA1NzNkOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJQYXJhbVV0aWxzLmNwcApAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fIC8vIHRvIGJlIGFibGUgdG8gaW1wbGVtZW50IHRoZSBtZXRob2RzIGRlZmluZWQKKyNpbmNsdWRlIDxDMkVudW0uaD4KKyNpbmNsdWRlIDx1dGlsL0MyRGVidWctbG9nLmg+CisjaW5jbHVkZSA8dXRpbC9DMlBhcmFtVXRpbHMuaD4KKworI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvKiogXGZpbGUKKyAqIFV0aWxpdGllcyBmb3IgcGFyYW1ldGVyIGhhbmRsaW5nIHRvIGJlIHVzZWQgYnkgQ29kZWMyIGltcGxlbWVudGF0aW9ucy4KKyAqLworCisvLy8gXGNvbmQgSU5URVJOQUwKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVVElMSVRJRVMgRk9SIEVOVU1FUkFUSU9OIFJFRkxFQ1RJT04gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc2l6ZV90IGNvdW50TGVhZGluZ1VuZGVyc2NvcmVzKEMyU3RyaW5nTGl0ZXJhbCBhKSB7CisgICAgc2l6ZV90IGkgPSAwOworICAgIHdoaWxlIChhW2ldID09ICdfJykgeworICAgICAgICArK2k7CisgICAgfQorICAgIHJldHVybiBpOworfQorCitzdGF0aWMgc2l6ZV90IGNvdW50TWF0Y2hpbmcoQzJTdHJpbmdMaXRlcmFsIGEsIGNvbnN0IEMyU3RyaW5nICZiKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBiLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmICghYVtpXSB8fCBhW2ldICE9IGJbaV0pIHsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBiLnNpemUoKTsKK30KKworLy8gQUJDRGVmID0+IGFiYy1kZWYKKy8vIEFCQ0QyZWYgPT4gYWJjZDItZWYgLy8gMAorLy8gQUJDRDJFZiA9PiBhbmNkMi1lZiAvLyAtMQorLy8gQWJjRGVmID0+IGFiYy1kZWYgLy8gLTEKKy8vIEFiYzJEZWYgPT4gYWJjLTJkZWYKKy8vIEFiYzJkZWYgPT4gYWJjLTItZGVmCisvLyBfWW8gPT4gX3lvCisvLyBfeW8gPT4gX3lvCisvLyBDMl95byA9PiBjMi15bworLy8gQzJfX3lvID0+IGMyLXlvCisKKy8vc3RhdGljCitDMlN0cmluZyBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKEMyU3RyaW5nIG5hbWUpIHsKKyAgICBlbnVtIHsKKyAgICAgICAga05vbmUgPSAnLicsCisgICAgICAgIGtMb3dlciA9ICdhJywKKyAgICAgICAga1VwcGVyID0gJ0EnLAorICAgICAgICBrRGlnaXQgPSAnMScsCisgICAgICAgIGtEYXNoID0gJy0nLAorICAgICAgICBrVW5kZXJzY29yZSA9ICdfJywKKyAgICB9IHR5cGUgPSBrTm9uZTsKKyAgICBzaXplX3Qgd29yZF9zdGFydCA9IDA7CisgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IG5hbWUuc2l6ZSgpOyArK2l4KSB7CisgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCBuYW1lLnN1YnN0cigwLCB3b3JkX3N0YXJ0KSA8PCAifCIKKyAgICAgICAgICAgICAgICA8PCBuYW1lLnN1YnN0cih3b3JkX3N0YXJ0LCBpeCAtIHdvcmRfc3RhcnQpIDw8ICJbIgorICAgICAgICAgICAgICAgIDw8IG5hbWUuc3Vic3RyKGl4LCAxKSA8PCAiXSIgPDwgbmFtZS5zdWJzdHIoaXggKyAxKQorICAgICAgICAgICAgICAgIDw8ICI6ICIgPDwgKGNoYXIpdHlwZTsKKyAgICAgICAgaWYgKGlzdXBwZXIobmFtZVtpeF0pKSB7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBrTG93ZXIpIHsKKyAgICAgICAgICAgICAgICBuYW1lLmluc2VydChpeCsrLCAxLCAnLScpOworICAgICAgICAgICAgICAgIHdvcmRfc3RhcnQgPSBpeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5hbWVbaXhdID0gdG9sb3dlcihuYW1lW2l4XSk7CisgICAgICAgICAgICB0eXBlID0ga1VwcGVyOworICAgICAgICB9IGVsc2UgaWYgKGlzbG93ZXIobmFtZVtpeF0pKSB7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBrRGlnaXQgJiYgaXggPiAwKSB7CisgICAgICAgICAgICAgICAgbmFtZS5pbnNlcnQoaXgrKywgMSwgJy0nKTsKKyAgICAgICAgICAgICAgICB3b3JkX3N0YXJ0ID0gaXg7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0ga1VwcGVyICYmIGl4ID4gd29yZF9zdGFydCArIDEpIHsKKyAgICAgICAgICAgICAgICBuYW1lLmluc2VydChpeCsrIC0gMSwgMSwgJy0nKTsKKyAgICAgICAgICAgICAgICB3b3JkX3N0YXJ0ID0gaXggLSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHlwZSA9IGtMb3dlcjsKKyAgICAgICAgfSBlbHNlIGlmIChpc2RpZ2l0KG5hbWVbaXhdKSkgeworICAgICAgICAgICAgaWYgKHR5cGUgPT0ga0xvd2VyKSB7CisgICAgICAgICAgICAgICAgbmFtZS5pbnNlcnQoaXgrKywgMSwgJy0nKTsKKyAgICAgICAgICAgICAgICB3b3JkX3N0YXJ0ID0gaXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0eXBlID0ga0RpZ2l0OworICAgICAgICB9IGVsc2UgaWYgKG5hbWVbaXhdID09ICdfJykgeworICAgICAgICAgICAgaWYgKHR5cGUgPT0ga0Rhc2gpIHsKKyAgICAgICAgICAgICAgICBuYW1lLmVyYXNlKGl4LS0sIDEpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlICE9IGtOb25lICYmIHR5cGUgIT0ga1VuZGVyc2NvcmUpIHsKKyAgICAgICAgICAgICAgICBuYW1lW2l4XSA9ICctJzsKKyAgICAgICAgICAgICAgICB0eXBlID0ga0Rhc2g7CisgICAgICAgICAgICAgICAgd29yZF9zdGFydCA9IGl4ICsgMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHlwZSA9IGtVbmRlcnNjb3JlOworICAgICAgICAgICAgICAgIHdvcmRfc3RhcnQgPSBpeCArIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuYW1lLnJlc2l6ZShpeCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICI9PiAiIDw8IG5hbWU7CisgICAgcmV0dXJuIG5hbWU7Cit9CisKKy8vc3RhdGljCitzdGQ6OnZlY3RvcjxDMlN0cmluZz4gX0MyRW51bVV0aWxzOjpzYW5pdGl6ZUVudW1WYWx1ZU5hbWVzKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlN0cmluZ0xpdGVyYWw+IG5hbWVzLAorICAgICAgICBDMlN0cmluZ0xpdGVyYWwgX3ByZWZpeCkgeworICAgIHN0ZDo6dmVjdG9yPEMyU3RyaW5nPiBzYW5pdGl6ZWROYW1lczsKKyAgICBDMlN0cmluZyBwcmVmaXg7CisgICAgc2l6ZV90IGV4dHJhVW5kZXJzY29yZXMgPSAwOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGlmIChfcHJlZml4KSB7CisgICAgICAgIGV4dHJhVW5kZXJzY29yZXMgPSBjb3VudExlYWRpbmdVbmRlcnNjb3JlcyhfcHJlZml4KTsKKyAgICAgICAgcHJlZml4ID0gX3ByZWZpeCArIGV4dHJhVW5kZXJzY29yZXM7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAicHJlZml4OiIgPDwgcHJlZml4IDw8ICIsIHVuZGVyc2NvcmVzOiIgPDwgZXh0cmFVbmRlcnNjb3JlczsKKyAgICB9CisKKyAgICAvLyBjYWxjdWxhdGUgcHJlZml4IGFuZCBtaW5pbXVtIGxlYWRpbmcgdW5kZXJzY29yZXMKKyAgICBmb3IgKEMyU3RyaW5nTGl0ZXJhbCBzIDogbmFtZXMpIHsKKyAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8IHM7CisgICAgICAgIHNpemVfdCB1bmRlcnNjb3JlcyA9IGNvdW50TGVhZGluZ1VuZGVyc2NvcmVzKHMpOworICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgIGV4dHJhVW5kZXJzY29yZXMgPSB1bmRlcnNjb3JlczsKKyAgICAgICAgICAgIHByZWZpeCA9IHMgKyB1bmRlcnNjb3JlczsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaXplX3QgbWF0Y2hpbmcgPSBjb3VudE1hdGNoaW5nKAorICAgICAgICAgICAgICAgIHMgKyB1bmRlcnNjb3JlcywKKyAgICAgICAgICAgICAgICBwcmVmaXgpOworICAgICAgICAgICAgcHJlZml4LnJlc2l6ZShtYXRjaGluZyk7CisgICAgICAgICAgICBleHRyYVVuZGVyc2NvcmVzID0gc3RkOjptaW4odW5kZXJzY29yZXMsIGV4dHJhVW5kZXJzY29yZXMpOworICAgICAgICB9CisgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAicHJlZml4OiIgPDwgcHJlZml4IDw8ICIsIHVuZGVyc2NvcmVzOiIgPDwgZXh0cmFVbmRlcnNjb3JlczsKKyAgICAgICAgaWYgKHByZWZpeC5zaXplKCkgPT0gMCAmJiBleHRyYVVuZGVyc2NvcmVzID09IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gd2Ugc3dhbGxvdyB0aGUgZmlyc3QgdW5kZXJzY29yZSBhZnRlciB1cHBlciBjYXNlIHByZWZpeGVzCisgICAgYm9vbCB1cHBlckNhc2VQcmVmaXggPSB0cnVlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHJlZml4LnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChpc2xvd2VyKHByZWZpeFtpXSkpIHsKKyAgICAgICAgICAgIHVwcGVyQ2FzZVByZWZpeCA9IGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKEMyU3RyaW5nTGl0ZXJhbCBzIDogbmFtZXMpIHsKKyAgICAgICAgc2l6ZV90IHVuZGVyc2NvcmVzID0gY291bnRMZWFkaW5nVW5kZXJzY29yZXMocyk7CisgICAgICAgIEMyU3RyaW5nIHNhbml0aXplZCA9IEMyU3RyaW5nKHMsIHVuZGVyc2NvcmVzIC0gZXh0cmFVbmRlcnNjb3Jlcyk7CisgICAgICAgIHNhbml0aXplZC5hcHBlbmQocyArIHByZWZpeC5zaXplKCkgKyB1bmRlcnNjb3JlcyArCisgICAgICAgICAgICAgICAgICAgICh1cHBlckNhc2VQcmVmaXggJiYgc1twcmVmaXguc2l6ZSgpICsgdW5kZXJzY29yZXNdID09ICdfJykpOworICAgICAgICBzYW5pdGl6ZWROYW1lcy5wdXNoX2JhY2soY2FtZWxDYXNlVG9EYXNoZWQoc2FuaXRpemVkKSk7CisgICAgfQorCisgICAgZm9yIChDMlN0cmluZyBzIDogc2FuaXRpemVkTmFtZXMpIHsKKyAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8IHM7CisgICAgfQorCisgICAgcmV0dXJuIHNhbml0aXplZE5hbWVzOworfQorCisvL3N0YXRpYworc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IF9DMkVudW1VdGlsczo6cGFyc2VFbnVtVmFsdWVzRnJvbVN0cmluZyhDMlN0cmluZ0xpdGVyYWwgdmFsdWUpIHsKKyAgICBzdGQ6OnZlY3RvcjxDMlN0cmluZz4gZm91bmROYW1lczsKKyAgICBzaXplX3QgcG9zID0gMCwgbGVuID0gc3RybGVuKHZhbHVlKTsKKyAgICBkbyB7CisgICAgICAgIHNpemVfdCBlbmRQb3MgPSBzdHJjc3BuKHZhbHVlICsgcG9zLCAiICw9IikgKyBwb3M7CisgICAgICAgIGlmIChlbmRQb3MgPiBwb3MpIHsKKyAgICAgICAgICAgIGZvdW5kTmFtZXMuZW1wbGFjZV9iYWNrKHZhbHVlICsgcG9zLCBlbmRQb3MgLSBwb3MpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZVtlbmRQb3NdICYmIHZhbHVlW2VuZFBvc10gIT0gJywnKSB7CisgICAgICAgICAgICBlbmRQb3MgKz0gc3RyY3Nwbih2YWx1ZSArIGVuZFBvcywgIiwiKTsKKyAgICAgICAgfQorICAgICAgICBwb3MgPSBzdHJzcG4odmFsdWUgKyBlbmRQb3MsICIgLCIpICsgZW5kUG9zOworICAgIH0gd2hpbGUgKHBvcyA8IGxlbik7CisgICAgcmV0dXJuIGZvdW5kTmFtZXM7Cit9CisKKy8vLyBzYWZlKHIpIHBhcnNpbmcgZnJvbSBwYXJhbWV0ZXIgYmxvYgorLy9zdGF0aWMKK0MyUGFyYW0gKkMyUGFyYW1VdGlsczo6UGFyc2VGaXJzdChjb25zdCB1aW50OF90ICpibG9iLCBzaXplX3Qgc2l6ZSkgeworICAgIC8vIF9tU2l6ZSBtdXN0IGZpdCBpbnRvIHNpemUsIGJ1dCByZWFsbHkgQzJQYXJhbSBtdXN0IGFsc28gdG8gYmUgYSB2YWxpZCBwYXJhbQorICAgIGlmIChzaXplIDwgc2l6ZW9mKEMyUGFyYW0pKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICAvLyBfbVNpemUgbXVzdCBtYXRjaCBsZW5ndGgKKyAgICBDMlBhcmFtICpwYXJhbSA9IChDMlBhcmFtKilibG9iOworICAgIGlmIChwYXJhbS0+c2l6ZSgpID4gc2l6ZSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIHBhcmFtOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQUFDRXh0cmFjdG9yLmNwcAppbmRleCA5ZmM1YTc2Li5iZWRkYWQwIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FBQ0V4dHJhY3Rvci5jcHAKQEAgLTE5LDQ4ICsxOSw0NSBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiQUFDRXh0cmFjdG9yLmgiCi0jaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgQUFDU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworY2xhc3MgQUFDU291cmNlIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogcHVibGljOgogICAgIEFBQ1NvdXJjZSgKLSAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsCisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDY0X3Q+ICZvZmZzZXRfdmVjdG9yLAogICAgICAgICAgICAgaW50NjRfdCBmcmFtZV9kdXJhdGlvbl91cyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlJik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0Kik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BQUNTb3VyY2UoKTsKIAogcHJpdmF0ZToKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhGcmFtZVNpemU7Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOwotICAgIE1ldGFEYXRhQmFzZSBtTWV0YTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXQgKm1NZXRhOwogCiAgICAgb2ZmNjRfdCBtT2Zmc2V0OwogICAgIGludDY0X3QgbUN1cnJlbnRUaW1lVXM7CiAgICAgYm9vbCBtU3RhcnRlZDsKLSAgICBNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7CiAKICAgICBWZWN0b3I8dWludDY0X3Q+IG1PZmZzZXRWZWN0b3I7CiAgICAgaW50NjRfdCBtRnJhbWVEdXJhdGlvblVzOwpAQCAtOTIsNyArODksNyBAQAogLy8gVGhlIHJldHVybmVkIHZhbHVlIGlzIHRoZSBBQUMgZnJhbWUgc2l6ZSB3aXRoIHRoZSBBRFRTIGhlYWRlciBsZW5ndGggKHJlZ2FyZGxlc3Mgb2YKIC8vICAgICB0aGUgcHJlc2VuY2Ugb2YgdGhlIENSQykuCiAvLyBJZiBoZWFkZXJTaXplIGlzIG5vbi1OVUxMLCBpdCB3aWxsIGJlIHVzZWQgdG8gcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBoZWFkZXIgb2YgdGhpcyBBRFRTIGZyYW1lLgotc3RhdGljIHNpemVfdCBnZXRBZHRzRnJhbWVMZW5ndGgoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCogaGVhZGVyU2l6ZSkgeworc3RhdGljIHNpemVfdCBnZXRBZHRzRnJhbWVMZW5ndGgoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90KiBoZWFkZXJTaXplKSB7CiAKICAgICBjb25zdCBzaXplX3Qga0FkdHNIZWFkZXJMZW5ndGhOb0NyYyA9IDc7CiAgICAgY29uc3Qgc2l6ZV90IGtBZHRzSGVhZGVyTGVuZ3RoV2l0aENyYyA9IDk7CkBAIC0xMzMsNyArMTMwLDcgQEAKIH0KIAogQUFDRXh0cmFjdG9yOjpBQUNFeHRyYWN0b3IoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3Qgb2Zmc2V0KQorICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIG9mZjY0X3Qgb2Zmc2V0KQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCiAgICAgICBtRnJhbWVEdXJhdGlvblVzKDApIHsKQEAgLTE1MSw2ICsxNDgsNyBAQAogICAgIH0KICAgICBjaGFubmVsID0gKGhlYWRlclswXSAmIDB4MSkgPDwgMiB8IChoZWFkZXJbMV0gPj4gNik7CiAKKyAgICBtTWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKICAgICBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEobU1ldGEsIHByb2ZpbGUsIHNmX2luZGV4LCBjaGFubmVsKTsKIAogICAgIG9mZjY0X3Qgc3RyZWFtU2l6ZSwgbnVtRnJhbWVzID0gMDsKQEAgLTE3NCwyOSArMTcyLDMwIEBACiAgICAgICAgIC8vIFJvdW5kIHVwIGFuZCBnZXQgdGhlIGR1cmF0aW9uCiAgICAgICAgIG1GcmFtZUR1cmF0aW9uVXMgPSAoMTAyNCAqIDEwMDAwMDBsbCArIChzciAtIDEpKSAvIHNyOwogICAgICAgICBkdXJhdGlvbiA9IG51bUZyYW1lcyAqIG1GcmFtZUR1cmF0aW9uVXM7Ci0gICAgICAgIG1NZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb24pOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uKTsKICAgICB9CiAKICAgICBtSW5pdENoZWNrID0gT0s7CiB9CiAKIEFBQ0V4dHJhY3Rvcjo6fkFBQ0V4dHJhY3RvcigpIHsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1NZXRhKTsKIH0KIAotc3RhdHVzX3QgQUFDRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhLmNsZWFyKCk7CittZWRpYV9zdGF0dXNfdCBBQUNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIEFNZWRpYUZvcm1hdF9jbGVhcihtZXRhKTsKICAgICBpZiAobUluaXRDaGVjayA9PSBPSykgewotICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUUyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUUyk7CiAgICAgfQogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHNpemVfdCBBQUNFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtSW5pdENoZWNrID09IE9LID8gMSA6IDA7CiB9CiAKLU1lZGlhVHJhY2sgKkFBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpBQUNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ICE9IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMjA0LDEzICsyMDMsMTIgQEAKICAgICByZXR1cm4gbmV3IEFBQ1NvdXJjZShtRGF0YVNvdXJjZSwgbU1ldGEsIG1PZmZzZXRWZWN0b3IsIG1GcmFtZUR1cmF0aW9uVXMpOwogfQogCi1zdGF0dXNfdCBBQUNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CittZWRpYV9zdGF0dXNfdCBBQUNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAotICAgIG1ldGEgPSBtTWV0YTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1NZXRhKTsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTIxOSw4ICsyMTcsOCBAQAogY29uc3Qgc2l6ZV90IEFBQ1NvdXJjZTo6a01heEZyYW1lU2l6ZSA9IDgxOTI7CiAKIEFBQ1NvdXJjZTo6QUFDU291cmNlKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBjb25zdCBWZWN0b3I8dWludDY0X3Q+ICZvZmZzZXRfdmVjdG9yLAogICAgICAgICBpbnQ2NF90IGZyYW1lX2R1cmF0aW9uX3VzKQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKQEAgLTIyOCw3ICsyMjYsNiBAQAogICAgICAgbU9mZnNldCgwKSwKICAgICAgIG1DdXJyZW50VGltZVVzKDApLAogICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbUdyb3VwKE5VTEwpLAogICAgICAgbU9mZnNldFZlY3RvcihvZmZzZXRfdmVjdG9yKSwKICAgICAgIG1GcmFtZUR1cmF0aW9uVXMoZnJhbWVfZHVyYXRpb25fdXMpIHsKIH0KQEAgLTIzOSw3ICsyMzYsNyBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgQUFDU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKiAvKiBwYXJhbXMgKi8pIHsKK21lZGlhX3N0YXR1c190IEFBQ1NvdXJjZTo6c3RhcnQoKSB7CiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKIAogICAgIGlmIChtT2Zmc2V0VmVjdG9yLmVtcHR5KCkpIHsKQEAgLTI0OSwzMCArMjQ2LDI1IEBACiAgICAgfQogCiAgICAgbUN1cnJlbnRUaW1lVXMgPSAwOwotICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOwotICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZShrTWF4RnJhbWVTaXplKSk7CisgICAgbUJ1ZmZlckdyb3VwLT5hZGRfYnVmZmVyKGtNYXhGcmFtZVNpemUpOwogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBBQUNTb3VyY2U6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBBQUNTb3VyY2U6OnN0b3AoKSB7CiAgICAgQ0hFQ0sobVN0YXJ0ZWQpOwogCi0gICAgZGVsZXRlIG1Hcm91cDsKLSAgICBtR3JvdXAgPSBOVUxMOwotCiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgQUFDU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7Ci0gICAgbWV0YSA9IG1NZXRhOwotICAgIHJldHVybiBPSzsKK21lZGlhX3N0YXR1c190IEFBQ1NvdXJjZTo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtTWV0YSk7CiB9CiAKLXN0YXR1c190IEFBQ1NvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworbWVkaWFfc3RhdHVzX3QgQUFDU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICAqb3V0ID0gTlVMTDsKIAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKQEAgLTI4Miw3ICsyNzQsNyBAQAogICAgICAgICAgICAgaW50NjRfdCBzZWVrRnJhbWUgPSBzZWVrVGltZVVzIC8gbUZyYW1lRHVyYXRpb25VczsKICAgICAgICAgICAgIGlmIChzZWVrRnJhbWUgPCAwIHx8IHNlZWtGcmFtZSA+PSAoaW50NjRfdCltT2Zmc2V0VmVjdG9yLnNpemUoKSkgewogICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNzAyMzk1MDciKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUN1cnJlbnRUaW1lVXMgPSBzZWVrRnJhbWUgKiBtRnJhbWVEdXJhdGlvblVzOwogCkBAIC0yOTIsMTMgKzI4NCwxMyBAQAogCiAgICAgc2l6ZV90IGZyYW1lU2l6ZSwgZnJhbWVTaXplV2l0aG91dEhlYWRlciwgaGVhZGVyU2l6ZTsKICAgICBpZiAoKGZyYW1lU2l6ZSA9IGdldEFkdHNGcmFtZUxlbmd0aChtRGF0YVNvdXJjZSwgbU9mZnNldCwgJmhlYWRlclNpemUpKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgfQogCi0gICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyOworICAgIHN0YXR1c190IGVyciA9IG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgZnJhbWVTaXplV2l0aG91dEhlYWRlciA9IGZyYW1lU2l6ZSAtIGhlYWRlclNpemU7CkBAIC0zMDcsMzcgKzI5OSwzOSBAQAogICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgYnVmZmVyID0gTlVMTDsKIAotICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CiAgICAgfQogCiAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgZnJhbWVTaXplV2l0aG91dEhlYWRlcik7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgbUN1cnJlbnRUaW1lVXMpOwotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIG1DdXJyZW50VGltZVVzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKIAogICAgIG1PZmZzZXQgKz0gZnJhbWVTaXplOwogICAgIG1DdXJyZW50VGltZVVzICs9IG1GcmFtZUR1cmF0aW9uVXM7CiAKICAgICAqb3V0ID0gYnVmZmVyOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1zdGF0aWMgTWVkaWFFeHRyYWN0b3IqIENyZWF0ZUV4dHJhY3RvcigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKK3N0YXRpYyBDTWVkaWFFeHRyYWN0b3IqIENyZWF0ZUV4dHJhY3RvcigKKyAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKICAgICAgICAgdm9pZCAqbWV0YSkgewogICAgIG9mZjY0X3Qgb2Zmc2V0ID0gKnN0YXRpY19jYXN0PG9mZjY0X3QqPihtZXRhKTsKLSAgICByZXR1cm4gbmV3IEFBQ0V4dHJhY3Rvcihzb3VyY2UsIG9mZnNldCk7CisgICAgcmV0dXJuIHdyYXAobmV3IEFBQ0V4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpLCBvZmZzZXQpKTsKIH0KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBTbmlmZigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiptZXRhLAotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICpmcmVlTWV0YSkgeworc3RhdGljIENyZWF0b3JGdW5jIFNuaWZmKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsCisgICAgICAgIEZyZWVNZXRhRnVuYyAqZnJlZU1ldGEpIHsKICAgICBvZmY2NF90IHBvcyA9IDA7CiAKKyAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihzb3VyY2UpOwogICAgIGZvciAoOzspIHsKICAgICAgICAgdWludDhfdCBpZDNoZWFkZXJbMTBdOwotICAgICAgICBpZiAoc291cmNlLT5yZWFkQXQocG9zLCBpZDNoZWFkZXIsIHNpemVvZihpZDNoZWFkZXIpKQorICAgICAgICBpZiAoaGVscGVyLnJlYWRBdChwb3MsIGlkM2hlYWRlciwgc2l6ZW9mKGlkM2hlYWRlcikpCiAgICAgICAgICAgICAgICAgPCAoc3NpemVfdClzaXplb2YoaWQzaGVhZGVyKSkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KQEAgLTM2NCw3ICszNTgsNyBAQAogCiAgICAgdWludDhfdCBoZWFkZXJbMl07CiAKLSAgICBpZiAoc291cmNlLT5yZWFkQXQocG9zLCAmaGVhZGVyLCAyKSAhPSAyKSB7CisgICAgaWYgKGhlbHBlci5yZWFkQXQocG9zLCAmaGVhZGVyLCAyKSAhPSAyKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtMzgzLDE3ICszNzcsMjEgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnNbXSA9IHsKKyAgICAiYWFjIiwKKyAgICBOVUxMCit9OwogCiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OLAogICAgICAgICBVVUlEKCI0ZmQ4MGVhZS0wM2QyLTRkNzItOWViOS00OGZhNmJiNTQ2MTMiKSwKICAgICAgICAgMSwgLy8gdmVyc2lvbgogICAgICAgICAiQUFDIEV4dHJhY3RvciIsCi0gICAgICAgIFNuaWZmCisgICAgICAgIHsgLnYzID0ge1NuaWZmLCBleHRlbnNpb25zfSB9LAogICAgIH07CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FBQ0V4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQUFDRXh0cmFjdG9yLmgKaW5kZXggOWRhZGJlZC4uNjQzZDNmNCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQUFDRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQUFDRXh0cmFjdG9yLmgKQEAgLTE4LDggKzE4LDkgQEAKIAogI2RlZmluZSBBQUNfRVhUUkFDVE9SX0hfCiAKLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogCiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKQEAgLTI4LDIzICsyOSwyMyBAQAogc3RydWN0IEFNZXNzYWdlOwogY2xhc3MgU3RyaW5nODsKIAotY2xhc3MgQUFDRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKK2NsYXNzIEFBQ0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciB7CiBwdWJsaWM6Ci0gICAgQUFDRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3Qgb2Zmc2V0KTsKKyAgICBBQUNFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBvZmY2NF90IG9mZnNldCk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiQUFDRXh0cmFjdG9yIjsgfQogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QUFDRXh0cmFjdG9yKCk7CiAKIHByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOwotICAgIE1ldGFEYXRhQmFzZSBtTWV0YTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXQgKm1NZXRhOwogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAKICAgICBWZWN0b3I8dWludDY0X3Q+IG1PZmZzZXRWZWN0b3I7CkBAIC01NSw3ICs1Niw3IEBACiB9OwogCiBib29sIFNuaWZmQUFDKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsIG9mZjY0X3QgKm9mZnNldCk7CisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLCBvZmY2NF90ICpvZmZzZXQpOwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQW5kcm9pZC5icAppbmRleCA3YzU2Yzk3Li5hNTgxNjdhIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FuZHJvaWQuYnAKQEAgLTgsNyArOCw3IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FNUkV4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuY3BwCmluZGV4IGY1NmQ1ZWYuLmRmOGRlOWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FNUkV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQU1SRXh0cmFjdG9yLmNwcApAQCAtMjAsOCArMjAsNiBAQAogCiAjaW5jbHVkZSAiQU1SRXh0cmFjdG9yLmgiCiAKLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KQEAgLTMxLDI5ICsyOSwyOSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIEFNUlNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKK2NsYXNzIEFNUlNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyIHsKIHB1YmxpYzoKICAgICBBTVJTb3VyY2UoCi0gICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICAgICAgYm9vbCBpc1dpZGUsCiAgICAgICAgICAgICBjb25zdCBvZmY2NF90ICpvZmZzZXRfdGFibGUsCiAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0X3RhYmxlX2xlbmd0aCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlICYpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFNUlNvdXJjZSgpOwogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKLSAgICBNZXRhRGF0YUJhc2UgbU1ldGE7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0ICptTWV0YTsKICAgICBib29sIG1Jc1dpZGU7CiAKICAgICBvZmY2NF90IG1PZmZzZXQ7CkBAIC05OCwyNyArOTYsMjcgQEAKICAgICByZXR1cm4gZnJhbWVTaXplOwogfQogCi1zdGF0aWMgc3RhdHVzX3QgZ2V0RnJhbWVTaXplQnlPZmZzZXQoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKK3N0YXRpYyBtZWRpYV9zdGF0dXNfdCBnZXRGcmFtZVNpemVCeU9mZnNldChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsCiAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0LCBib29sIGlzV2lkZSwgc2l6ZV90ICpmcmFtZVNpemUpIHsKICAgICB1aW50OF90IGhlYWRlcjsKICAgICBzc2l6ZV90IGNvdW50ID0gc291cmNlLT5yZWFkQXQob2Zmc2V0LCAmaGVhZGVyLCAxKTsKICAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgIH0gZWxzZSBpZiAoY291bnQgPCAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICB9CiAKICAgICB1bnNpZ25lZCBGVCA9IChoZWFkZXIgPj4gMykgJiAweDBmOwogCiAgICAgKmZyYW1lU2l6ZSA9IGdldEZyYW1lU2l6ZShpc1dpZGUsIEZUKTsKICAgICBpZiAoKmZyYW1lU2l6ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogc3RhdGljIGJvb2wgU25pZmZBTVIoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGJvb2wgKmlzV2lkZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBib29sICppc1dpZGUsIGZsb2F0ICpjb25maWRlbmNlKSB7CiAgICAgY2hhciBoZWFkZXJbOV07CiAKICAgICBpZiAoc291cmNlLT5yZWFkQXQoMCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgIT0gc2l6ZW9mKGhlYWRlcikpIHsKQEAgLTE0NCw3ICsxNDIsNyBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotQU1SRXh0cmFjdG9yOjpBTVJFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKK0FNUkV4dHJhY3Rvcjo6QU1SRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKICAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICBtSW5pdENoZWNrKE5PX0lOSVQpLAogICAgICAgbU9mZnNldFRhYmxlTGVuZ3RoKDApIHsKQEAgLTE1MywxMiArMTUxLDEyIEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBtTWV0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAga0tleU1JTUVUeXBlLCBtSXNXaWRlID8gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIpOworICAgIG1NZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwKKyAgICAgICAgICAgIG1Jc1dpZGUgPyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IgOiBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIpOwogCi0gICAgbU1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgMSk7Ci0gICAgbU1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1Jc1dpZGUgPyAxNjAwMCA6IDgwMDApOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCAxKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIG1Jc1dpZGUgPyAxNjAwMCA6IDgwMDApOwogCiAgICAgb2ZmNjRfdCBvZmZzZXQgPSBtSXNXaWRlID8gOSA6IDY7CiAgICAgb2ZmNjRfdCBzdHJlYW1TaXplOwpAQCAtMTY2LDExICsxNjQsMTEgQEAKICAgICBpbnQ2NF90IGR1cmF0aW9uID0gMDsKIAogICAgIGlmIChtRGF0YVNvdXJjZS0+Z2V0U2l6ZSgmc3RyZWFtU2l6ZSkgPT0gT0spIHsKLSAgICAgICAgIHdoaWxlIChvZmZzZXQgPCBzdHJlYW1TaXplKSB7Ci0gICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0RnJhbWVTaXplQnlPZmZzZXQoc291cmNlLCBvZmZzZXQsIG1Jc1dpZGUsICZmcmFtZVNpemUpOwotICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewotICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICB3aGlsZSAob2Zmc2V0IDwgc3RyZWFtU2l6ZSkgeworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0RnJhbWVTaXplQnlPZmZzZXQoc291cmNlLCBvZmZzZXQsIG1Jc1dpZGUsICZmcmFtZVNpemUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIApAQCAtMTg1LDMwICsxODMsMzMgQEAKICAgICAgICAgICAgIG51bUZyYW1lcyArKzsKICAgICAgICAgfQogCi0gICAgICAgIG1NZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb24pOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uKTsKICAgICB9CiAKICAgICBtSW5pdENoZWNrID0gT0s7CiB9CiAKIEFNUkV4dHJhY3Rvcjo6fkFNUkV4dHJhY3RvcigpIHsKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtTWV0YSk7CiB9CiAKLXN0YXR1c190IEFNUkV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7Ci0gICAgbWV0YS5jbGVhcigpOworbWVkaWFfc3RhdHVzX3QgQU1SRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpIHsKKyAgICBBTWVkaWFGb3JtYXRfY2xlYXIobWV0YSk7CiAKICAgICBpZiAobUluaXRDaGVjayA9PSBPSykgewotICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBtSXNXaWRlID8gImF1ZGlvL2Ftci13YiIgOiAiYXVkaW8vYW1yIik7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIG1Jc1dpZGUgPyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IgOiAiYXVkaW8vYW1yIik7CiAgICAgfQogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHNpemVfdCBBTVJFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtSW5pdENoZWNrID09IE9LID8gMSA6IDA7CiB9CiAKLU1lZGlhVHJhY2sgKkFNUkV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpBTVJFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ICE9IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMjE3LDE5ICsyMTgsMTggQEAKICAgICAgICAgICAgIG1PZmZzZXRUYWJsZSwgbU9mZnNldFRhYmxlTGVuZ3RoKTsKIH0KIAotc3RhdHVzX3QgQU1SRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgeworbWVkaWFfc3RhdHVzX3QgQU1SRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ICE9IDApIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKLSAgICBtZXRhID0gbU1ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtTWV0YSk7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIEFNUlNvdXJjZTo6QU1SU291cmNlKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBib29sIGlzV2lkZSwgY29uc3Qgb2ZmNjRfdCAqb2Zmc2V0X3RhYmxlLCBzaXplX3Qgb2Zmc2V0X3RhYmxlX2xlbmd0aCkKICAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICBtTWV0YShtZXRhKSwKQEAgLTI1MCwzNSArMjUwLDMwIEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBBTVJTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqIC8qIHBhcmFtcyAqLykgeworbWVkaWFfc3RhdHVzX3QgQU1SU291cmNlOjpzdGFydCgpIHsKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogCiAgICAgbU9mZnNldCA9IG1Jc1dpZGUgPyA5IDogNjsKICAgICBtQ3VycmVudFRpbWVVcyA9IDA7Ci0gICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7Ci0gICAgbUdyb3VwLT5hZGRfYnVmZmVyKE1lZGlhQnVmZmVyQmFzZTo6Q3JlYXRlKDEyOCkpOworICAgIG1CdWZmZXJHcm91cC0+YWRkX2J1ZmZlcigxMjgpOwogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBBTVJTb3VyY2U6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBBTVJTb3VyY2U6OnN0b3AoKSB7CiAgICAgQ0hFQ0sobVN0YXJ0ZWQpOwogCi0gICAgZGVsZXRlIG1Hcm91cDsKLSAgICBtR3JvdXAgPSBOVUxMOwotCiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgQU1SU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7Ci0gICAgbWV0YSA9IG1NZXRhOwotICAgIHJldHVybiBPSzsKK21lZGlhX3N0YXR1c190IEFNUlNvdXJjZTo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtTWV0YSk7CiB9CiAKLXN0YXR1c190IEFNUlNvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworbWVkaWFfc3RhdHVzX3QgQU1SU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICAqb3V0ID0gTlVMTDsKIAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKQEAgLTI5Niw3ICsyOTEsNyBAQAogICAgICAgICBtT2Zmc2V0ID0gbU9mZnNldFRhYmxlW2luZGV4XSArIChtSXNXaWRlID8gOSA6IDYpOwogCiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpPCBzZWVrRnJhbWUgLSBpbmRleCAqIDUwOyBpKyspIHsKLSAgICAgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgICAgIG1lZGlhX3N0YXR1c190IGVycjsKICAgICAgICAgICAgIGlmICgoZXJyID0gZ2V0RnJhbWVTaXplQnlPZmZzZXQobURhdGFTb3VyY2UsIG1PZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlzV2lkZSwgJnNpemUpKSAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CkBAIC0zMDksNyArMzA0LDcgQEAKICAgICBzc2l6ZV90IG4gPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG1PZmZzZXQsICZoZWFkZXIsIDEpOwogCiAgICAgaWYgKG4gPCAxKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgfQogCiAgICAgaWYgKGhlYWRlciAmIDB4ODMpIHsKQEAgLTMxNywyMCArMzEyLDIwIEBACiAKICAgICAgICAgQUxPR0UoInBhZGRpbmcgYml0cyBtdXN0IGJlIDAsIGhlYWRlciBpcyAweCUwMngiLCBoZWFkZXIpOwogCi0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAogICAgIHVuc2lnbmVkIEZUID0gKGhlYWRlciA+PiAzKSAmIDB4MGY7CiAKICAgICBzaXplX3QgZnJhbWVTaXplID0gZ2V0RnJhbWVTaXplKG1Jc1dpZGUsIEZUKTsKICAgICBpZiAoZnJhbWVTaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCi0gICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyOworICAgIHN0YXR1c190IGVyciA9IG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgbiA9IG1EYXRhU291cmNlLT5yZWFkQXQobU9mZnNldCwgYnVmZmVyLT5kYXRhKCksIGZyYW1lU2l6ZSk7CkBAIC0zNDAsNTAgKzMzNSw2MyBAQAogICAgICAgICBidWZmZXIgPSBOVUxMOwogCiAgICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIG9ubHkgcGFydGlhbCBmcmFtZSBpcyBhdmFpbGFibGUsIHRyZWF0IGl0IGFzIEVPUy4KICAgICAgICAgICAgIG1PZmZzZXQgKz0gbjsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgICAgICB9CiAgICAgfQogCiAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgZnJhbWVTaXplKTsKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCBtQ3VycmVudFRpbWVVcyk7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgbUN1cnJlbnRUaW1lVXMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogCiAgICAgbU9mZnNldCArPSBmcmFtZVNpemU7CiAgICAgbUN1cnJlbnRUaW1lVXMgKz0gMjAwMDA7ICAvLyBFYWNoIGZyYW1lIGlzIDIwbXMKIAogICAgICpvdXQgPSBidWZmZXI7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAorc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnNbXSA9IHsKKyAgICAiYW1yIiwKKyAgICAiYXdiIiwKKyAgICBOVUxMCit9OworCiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OLAogICAgICAgICBVVUlEKCJjODY2MzljOS0yZjMxLTQwYWMtYTcxNS1mYTAxYjQ0OTNhYWYiKSwKICAgICAgICAgMSwKICAgICAgICAgIkFNUiBFeHRyYWN0b3IiLAotICAgICAgICBbXSgKLSAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICAgICAgICAgIHZvaWQgKiosCi0gICAgICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSAtPiBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgewotICAgICAgICAgICAgaWYgKFNuaWZmQU1SKHNvdXJjZSwgbnVsbHB0ciwgY29uZmlkZW5jZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gW10oCi0gICAgICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBNZWRpYUV4dHJhY3RvciogewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFNUkV4dHJhY3Rvcihzb3VyY2UpO307Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgIC52MyA9IHsKKyAgICAgICAgICAgICAgIFtdKAorICAgICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgICAgICAgICAgICAgdm9pZCAqKiwKKyAgICAgICAgICAgICAgICAgICBGcmVlTWV0YUZ1bmMgKikgLT4gQ3JlYXRvckZ1bmMgeworICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKHNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgaWYgKFNuaWZmQU1SKCZoZWxwZXIsIG51bGxwdHIsIGNvbmZpZGVuY2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gQ01lZGlhRXh0cmFjdG9yKiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcChuZXcgQU1SRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKHNvdXJjZSkpKTt9OworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICBleHRlbnNpb25zCisgICAgICAgICAgIH0sCisgICAgICAgIH0sCiAgICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQU1SRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuaAppbmRleCBjOTBiMzI1Li5iNzZlZTljIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuaApAQCAtMTksOCArMTksOSBAQAogI2RlZmluZSBBTVJfRVhUUkFDVE9SX0hfCiAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTI4LDIzICsyOSwyMyBAQAogY2xhc3MgU3RyaW5nODsKICNkZWZpbmUgT0ZGU0VUX1RBQkxFX0xFTiAgICAzMDAKIAotY2xhc3MgQU1SRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKK2NsYXNzIEFNUkV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciB7CiBwdWJsaWM6Ci0gICAgZXhwbGljaXQgQU1SRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworICAgIGV4cGxpY2l0IEFNUkV4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIkFNUkV4dHJhY3RvciI7IH0KIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFNUkV4dHJhY3RvcigpOwogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKLSAgICBNZXRhRGF0YUJhc2UgbU1ldGE7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0ICptTWV0YTsKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwogICAgIGJvb2wgbUlzV2lkZTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FuZHJvaWQuYnAKaW5kZXggYjJmYjg4MC4uNGJkOTMzZCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9BbmRyb2lkLmJwCkBAIC04LDcgKzgsNyBAQAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9BbmRyb2lkLmJwCmluZGV4IDQyNDJkNzYuLjNhM2QwNTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9BbmRyb2lkLmJwCkBAIC04LDEzICs4LDE3IEBACiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKICAgICAgICAgImxpYkZMQUMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogCiAgICAgbmFtZTogImxpYmZsYWNleHRyYWN0b3IiLApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0ZMQUNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0ZMQUNFeHRyYWN0b3IuY3BwCmluZGV4IGNjZjgwZDAuLmU0YmJjMDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9GTEFDRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvRkxBQ0V4dHJhY3Rvci5jcHAKQEAgLTI0LDQxICsyNCw1NiBAQAogLy8gbGliRkxBQyBwYXJzZXIKICNpbmNsdWRlICJGTEFDL3N0cmVhbV9kZWNvZGVyLmgiCiAKLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KLSNpbmNsdWRlIDxtZWRpYS9Wb3JiaXNDb21tZW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlci5oPiAvLyBmb3IgQUlCaW5kZXJfZ2V0Q2FsbGluZ1VpZAorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oPgorI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPiAvLyBmb3IgQUlEX01FRElBCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorLy8gTWVkaWFTZXJ2ZXIgaXMgY2FwYWJsZSBvZiBoYW5kbGluZyBmbG9hdCBleHRyYWN0b3Igb3V0cHV0LCBidXQgZ2VuZXJhbCBwcm9jZXNzZXMKKy8vIG1heSBub3QgYmUgYWJsZSB0byBkbyBzby4KKy8vIFRPRE86IEltcHJvdmUgQVBJIHRvIHNldCBleHRyYWN0b3IgZmxvYXQgb3V0cHV0LgorLy8gKE5vdGU6IGR1cGxpY2F0ZWQgd2l0aCBXQVZFeHRyYWN0b3IuY3BwKQorc3RhdGljIGlubGluZSBib29sIHNob3VsZEV4dHJhY3Rvck91dHB1dEZsb2F0KGludCBiaXRzUGVyU2FtcGxlKQoreworICAgIHJldHVybiBiaXRzUGVyU2FtcGxlID4gMTYgJiYgQUlCaW5kZXJfZ2V0Q2FsbGluZ1VpZCgpID09IEFJRF9NRURJQTsKK30KKwogY2xhc3MgRkxBQ1BhcnNlcjsKIAotY2xhc3MgRkxBQ1NvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKK2NsYXNzIEZMQUNTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CiAKIHB1YmxpYzoKICAgICBGTEFDU291cmNlKAotICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCi0gICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEpOworICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqZGF0YVNvdXJjZSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKKyAgICAgICAgICAgIGJvb2wgb3V0cHV0RmxvYXQpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkZMQUNTb3VyY2UoKTsKIAogcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7Ci0gICAgTWV0YURhdGFCYXNlIG1UcmFja01ldGFkYXRhOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOworICAgIEFNZWRpYUZvcm1hdCAqbVRyYWNrTWV0YWRhdGE7CisgICAgY29uc3QgYm9vbCBtT3V0cHV0RmxvYXQ7CiAgICAgRkxBQ1BhcnNlciAqbVBhcnNlcjsKICAgICBib29sIG1Jbml0Q2hlY2s7CiAgICAgYm9vbCBtU3RhcnRlZDsKQEAgLTc1LDE0ICs5MCwxNSBAQAogCiBwdWJsaWM6CiAgICAgZW51bSB7Ci0gICAgICAgIGtNYXhDaGFubmVscyA9IDgsCisgICAgICAgIGtNYXhDaGFubmVscyA9IEZDQ184LAogICAgIH07CiAKICAgICBleHBsaWNpdCBGTEFDUGFyc2VyKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSwKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqZGF0YVNvdXJjZSwKKyAgICAgICAgYm9vbCBvdXRwdXRGbG9hdCwKICAgICAgICAgLy8gSWYgbWV0YWRhdGEgcG9pbnRlcnMgYXJlbid0IHByb3ZpZGVkLCB3ZSBkb24ndCBmaWxsIHRoZW0KLSAgICAgICAgTWV0YURhdGFCYXNlICpmaWxlTWV0YWRhdGEgPSAwLAotICAgICAgICBNZXRhRGF0YUJhc2UgKnRyYWNrTWV0YWRhdGEgPSAwKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmaWxlTWV0YWRhdGEgPSAwLAorICAgICAgICBBTWVkaWFGb3JtYXQgKnRyYWNrTWV0YWRhdGEgPSAwKTsKIAogICAgIHZpcnR1YWwgfkZMQUNQYXJzZXIoKTsKIApAQCAtMTA4LDI0ICsxMjQsMjUgQEAKICAgICB9CiAKICAgICAvLyBtZWRpYSBidWZmZXJzCi0gICAgdm9pZCBhbGxvY2F0ZUJ1ZmZlcnMoKTsKKyAgICB2b2lkIGFsbG9jYXRlQnVmZmVycyhNZWRpYUJ1ZmZlckdyb3VwSGVscGVyICpncm91cCk7CiAgICAgdm9pZCByZWxlYXNlQnVmZmVycygpOwotICAgIE1lZGlhQnVmZmVyQmFzZSAqcmVhZEJ1ZmZlcigpIHsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqcmVhZEJ1ZmZlcigpIHsKICAgICAgICAgcmV0dXJuIHJlYWRCdWZmZXIoZmFsc2UsIDBMTCk7CiAgICAgfQotICAgIE1lZGlhQnVmZmVyQmFzZSAqcmVhZEJ1ZmZlcihGTEFDX191aW50NjQgc2FtcGxlKSB7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKnJlYWRCdWZmZXIoRkxBQ19fdWludDY0IHNhbXBsZSkgewogICAgICAgICByZXR1cm4gcmVhZEJ1ZmZlcih0cnVlLCBzYW1wbGUpOwogICAgIH0KIAogcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7Ci0gICAgTWV0YURhdGFCYXNlICptRmlsZU1ldGFkYXRhOwotICAgIE1ldGFEYXRhQmFzZSAqbVRyYWNrTWV0YWRhdGE7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CisgICAgY29uc3QgYm9vbCBtT3V0cHV0RmxvYXQ7CisgICAgQU1lZGlhRm9ybWF0ICptRmlsZU1ldGFkYXRhOworICAgIEFNZWRpYUZvcm1hdCAqbVRyYWNrTWV0YWRhdGE7CiAgICAgYm9vbCBtSW5pdENoZWNrOwogCiAgICAgLy8gbWVkaWEgYnVmZmVycwogICAgIHNpemVfdCBtTWF4QnVmZmVyU2l6ZTsKLSAgICBNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7CisgICAgTWVkaWFCdWZmZXJHcm91cEhlbHBlciAqbUdyb3VwOwogICAgIHZvaWQgKCptQ29weSkoaW50MTZfdCAqZHN0LCBjb25zdCBpbnQgKiBzcmNba01heENoYW5uZWxzXSwgdW5zaWduZWQgblNhbXBsZXMsIHVuc2lnbmVkIG5DaGFubmVscyk7CiAKICAgICAvLyBoYW5kbGUgdG8gdW5kZXJseWluZyBsaWJGTEFDIHBhcnNlcgpAQCAtMTQ5LDcgKzE2Niw3IEBACiAgICAgRkxBQ19fU3RyZWFtRGVjb2RlckVycm9yU3RhdHVzIG1FcnJvclN0YXR1czsKIAogICAgIHN0YXR1c190IGluaXQoKTsKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKnJlYWRCdWZmZXIoYm9vbCBkb1NlZWssIEZMQUNfX3VpbnQ2NCBzYW1wbGUpOworICAgIE1lZGlhQnVmZmVySGVscGVyICpyZWFkQnVmZmVyKGJvb2wgZG9TZWVrLCBGTEFDX191aW50NjQgc2FtcGxlKTsKIAogICAgIC8vIG5vIGNvcHkgY29uc3RydWN0b3Igb3IgYXNzaWdubWVudAogICAgIEZMQUNQYXJzZXIoY29uc3QgRkxBQ1BhcnNlciAmKTsKQEAgLTE2OSw2ICsxODYsNyBAQAogICAgICAgICAgICAgY29uc3QgRkxBQ19fRnJhbWUgKmZyYW1lLCBjb25zdCBGTEFDX19pbnQzMiAqIGNvbnN0IGJ1ZmZlcltdKTsKICAgICB2b2lkIG1ldGFkYXRhQ2FsbGJhY2soY29uc3QgRkxBQ19fU3RyZWFtTWV0YWRhdGEgKm1ldGFkYXRhKTsKICAgICB2b2lkIGVycm9yQ2FsbGJhY2soRkxBQ19fU3RyZWFtRGVjb2RlckVycm9yU3RhdHVzIHN0YXR1cyk7CisgICAgc2l6ZV90IGdldE91dHB1dFNhbXBsZVNpemUoKSBjb25zdCB7IHJldHVybiBtT3V0cHV0RmxvYXQgPyBzaXplb2YoZmxvYXQpIDogc2l6ZW9mKGludDE2X3QpOyB9CiAKICAgICAvLyBGTEFDIHBhcnNlciBjYWxsYmFja3MgYXMgQy1jYWxsYWJsZSBmdW5jdGlvbnMKICAgICBzdGF0aWMgRkxBQ19fU3RyZWFtRGVjb2RlclJlYWRTdGF0dXMgcmVhZF9jYWxsYmFjaygKQEAgLTM2NCw5ICszODIsOCBAQAogICAgIGNhc2UgRkxBQ19fTUVUQURBVEFfVFlQRV9QSUNUVVJFOgogICAgICAgICBpZiAobUZpbGVNZXRhZGF0YSAhPSAwKSB7CiAgICAgICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1NZXRhZGF0YV9QaWN0dXJlICpwID0gJm1ldGFkYXRhLT5kYXRhLnBpY3R1cmU7Ci0gICAgICAgICAgICBtRmlsZU1ldGFkYXRhLT5zZXREYXRhKGtLZXlBbGJ1bUFydCwKLSAgICAgICAgICAgICAgICAgICAgTWV0YURhdGE6OlRZUEVfTk9ORSwgcC0+ZGF0YSwgcC0+ZGF0YV9sZW5ndGgpOwotICAgICAgICAgICAgbUZpbGVNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5QWxidW1BcnRNSU1FLCBwLT5taW1lX3R5cGUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtRmlsZU1ldGFkYXRhLCBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJULAorICAgICAgICAgICAgICAgICAgIHAtPmRhdGEsIHAtPmRhdGFfbGVuZ3RoKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgpAQCAtMzgxLDEyMiArMzk4LDYxIEBACiAgICAgbUVycm9yU3RhdHVzID0gc3RhdHVzOwogfQogCi0vLyBDb3B5IHNhbXBsZXMgZnJvbSBGTEFDIG5hdGl2ZSAzMi1iaXQgbm9uLWludGVybGVhdmVkIHRvIDE2LWJpdCBpbnRlcmxlYXZlZC4KKy8vIENvcHkgc2FtcGxlcyBmcm9tIEZMQUMgbmF0aXZlIDMyLWJpdCBub24taW50ZXJsZWF2ZWQgdG8gMTYtYml0IHNpZ25lZAorLy8gb3IgMzItYml0IGZsb2F0IGludGVybGVhdmVkLgorLy8gVE9ETzogQ29uc2lkZXIgbW92aW5nIHRvIGF1ZGlvX3V0aWxzLgogLy8gVGhlc2UgYXJlIGNhbmRpZGF0ZXMgZm9yIG9wdGltaXphdGlvbiBpZiBuZWVkZWQuCi0KLXN0YXRpYyB2b2lkIGNvcHlNb25vOCgKLSAgICAgICAgaW50MTZfdCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwKK3N0YXRpYyB2b2lkIGNvcHlUbzE2U2lnbmVkKAorICAgICAgICBzaG9ydCAqZHN0LAorICAgICAgICBjb25zdCBpbnQgKmNvbnN0ICpzcmMsCiAgICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPDwgODsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlTdGVyZW84KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldIDw8IDg7Ci0gICAgICAgICpkc3QrKyA9IHNyY1sxXVtpXSA8PCA4OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weU11bHRpQ2g4KGludDE2X3QgKmRzdCwgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpCi17Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7Ci0gICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV0gPDwgODsKKyAgICAgICAgdW5zaWduZWQgbkNoYW5uZWxzLAorICAgICAgICB1bnNpZ25lZCBiaXRzUGVyU2FtcGxlKSB7CisgICAgY29uc3QgaW50IGxlZnRTaGlmdCA9IDE2IC0gKGludCliaXRzUGVyU2FtcGxlOyAvLyBjYXN0IHRvIGludCB0byBwcmV2ZW50IHVuc2lnbmVkIG92ZXJmbG93LgorICAgIGlmIChsZWZ0U2hpZnQgPj0gMCkgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgeworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gc3JjW2NdW2ldIDw8IGxlZnRTaGlmdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGludCByaWdodFNoaWZ0ID0gLWxlZnRTaGlmdDsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBuQ2hhbm5lbHM7ICsrYykgeworICAgICAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXSA+PiByaWdodFNoaWZ0OworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjb3B5TW9ubzE2KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLAorc3RhdGljIHZvaWQgY29weVRvRmxvYXQoCisgICAgICAgIGZsb2F0ICpkc3QsCisgICAgICAgIGNvbnN0IGludCAqY29uc3QgKnNyYywKICAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlTdGVyZW8xNigKLSAgICAgICAgaW50MTZfdCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwKLSAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXTsKLSAgICAgICAgKmRzdCsrID0gc3JjWzFdW2ldOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weU11bHRpQ2gxNihpbnQxNl90ICpkc3QsIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKQoteworICAgICAgICB1bnNpZ25lZCBuQ2hhbm5lbHMsCisgICAgICAgIHVuc2lnbmVkIGJpdHNQZXJTYW1wbGUpIHsKKyAgICBjb25zdCB1bnNpZ25lZCBsZWZ0U2hpZnQgPSAzMiAtIGJpdHNQZXJTYW1wbGU7CiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKICAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7Ci0gICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV07CisgICAgICAgICAgICAqZHN0KysgPSBmbG9hdF9mcm9tX2kzMihzcmNbY11baV0gPDwgbGVmdFNoaWZ0KTsKICAgICAgICAgfQogICAgIH0KIH0KIAotLy8gMjQtYml0IHZlcnNpb25zIHNob3VsZCBkbyBkaXRoZXJpbmcgb3Igbm9pc2Utc2hhcGluZywgaGVyZSBvciBpbiBBdWRpb0ZsaW5nZXIKLQotc3RhdGljIHZvaWQgY29weU1vbm8yNCgKLSAgICAgICAgaW50MTZfdCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwKLSAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXSA+PiA4OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weVN0ZXJlbzI0KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldID4+IDg7Ci0gICAgICAgICpkc3QrKyA9IHNyY1sxXVtpXSA+PiA4OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weU11bHRpQ2gyNChpbnQxNl90ICpkc3QsIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKQotewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBuQ2hhbm5lbHM7ICsrYykgewotICAgICAgICAgICAgKmRzdCsrID0gc3JjW2NdW2ldID4+IDg7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlUcmVzcGFzcygKLSAgICAgICAgaW50MTZfdCAqIC8qIGRzdCAqLywKLSAgICAgICAgY29uc3QgaW50ICpbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSAvKiBzcmMgKi8sCi0gICAgICAgIHVuc2lnbmVkIC8qIG5TYW1wbGVzICovLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBUUkVTUEFTUygpOwotfQotCiAvLyBGTEFDUGFyc2VyCiAKIEZMQUNQYXJzZXI6OkZMQUNQYXJzZXIoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAotICAgICAgICBNZXRhRGF0YUJhc2UgKmZpbGVNZXRhZGF0YSwKLSAgICAgICAgTWV0YURhdGFCYXNlICp0cmFja01ldGFkYXRhKQorICAgICAgICBEYXRhU291cmNlSGVscGVyICpkYXRhU291cmNlLAorICAgICAgICBib29sIG91dHB1dEZsb2F0LAorICAgICAgICBBTWVkaWFGb3JtYXQgKmZpbGVNZXRhZGF0YSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICp0cmFja01ldGFkYXRhKQogICAgIDogbURhdGFTb3VyY2UoZGF0YVNvdXJjZSksCisgICAgICBtT3V0cHV0RmxvYXQob3V0cHV0RmxvYXQpLAogICAgICAgbUZpbGVNZXRhZGF0YShmaWxlTWV0YWRhdGEpLAogICAgICAgbVRyYWNrTWV0YWRhdGEodHJhY2tNZXRhZGF0YSksCiAgICAgICBtSW5pdENoZWNrKGZhbHNlKSwKICAgICAgIG1NYXhCdWZmZXJTaXplKDApLAogICAgICAgbUdyb3VwKE5VTEwpLAotICAgICAgbUNvcHkoY29weVRyZXNwYXNzKSwKICAgICAgIG1EZWNvZGVyKE5VTEwpLAogICAgICAgbUN1cnJlbnRQb3MoMExMKSwKICAgICAgIG1FT0YoZmFsc2UpLApAQCAtNTY3LDggKzUyMywxMCBAQAogICAgICAgICBjYXNlIDg6CiAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgIGNhc2UgMzI6IC8vIGdlbmVyYWxseSBub3QgZXhwZWN0ZWQgZm9yIEZMQUMKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gTm90ZTogaW50ZXJuYWxseSB0aGUgRkxBQyBleHRyYWN0b3Igc3VwcG9ydHMgMi0zMiBiaXRzLgogICAgICAgICAgICAgQUxPR0UoInVuc3VwcG9ydGVkIGJpdHMgcGVyIHNhbXBsZSAldSIsIGdldEJpdHNQZXJTYW1wbGUoKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICAgICAgfQpAQCAtNTg1LDcxICs1NDMsNTIgQEAKICAgICAgICAgY2FzZSA0ODAwMDoKICAgICAgICAgY2FzZSA4ODIwMDoKICAgICAgICAgY2FzZSA5NjAwMDoKKyAgICAgICAgY2FzZSAxNzY0MDA6CisgICAgICAgIGNhc2UgMTkyMDAwOgogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyBOb3RlOiBpbnRlcm5hbGx5IHdlIHN1cHBvcnQgYXJiaXRyYXJ5IHNhbXBsZSByYXRlcyBmcm9tIDhrSHogdG8gMTkya0h6LgogICAgICAgICAgICAgQUxPR0UoInVuc3VwcG9ydGVkIHNhbXBsZSByYXRlICV1IiwgZ2V0U2FtcGxlUmF0ZSgpKTsKICAgICAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgICAgICB9Ci0gICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgYXBwcm9wcmlhdGUgY29weSBmdW5jdGlvbiwgZGVmYXVsdGluZyB0byB0cmVzcGFzcwotICAgICAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKLSAgICAgICAgICAgIHVuc2lnbmVkIG1DaGFubmVsczsKLSAgICAgICAgICAgIHVuc2lnbmVkIG1CaXRzUGVyU2FtcGxlOwotICAgICAgICAgICAgdm9pZCAoKm1Db3B5KShpbnQxNl90ICpkc3QsIGNvbnN0IGludCAqIHNyY1trTWF4Q2hhbm5lbHNdLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKTsKLSAgICAgICAgfSB0YWJsZVtdID0gewotICAgICAgICAgICAgeyAxLCAgOCwgY29weU1vbm84ICAgIH0sCi0gICAgICAgICAgICB7IDIsICA4LCBjb3B5U3RlcmVvOCAgfSwKLSAgICAgICAgICAgIHsgOCwgIDgsIGNvcHlNdWx0aUNoOCAgfSwKLSAgICAgICAgICAgIHsgMSwgMTYsIGNvcHlNb25vMTYgICB9LAotICAgICAgICAgICAgeyAyLCAxNiwgY29weVN0ZXJlbzE2IH0sCi0gICAgICAgICAgICB7IDgsIDE2LCBjb3B5TXVsdGlDaDE2IH0sCi0gICAgICAgICAgICB7IDEsIDI0LCBjb3B5TW9ubzI0ICAgfSwKLSAgICAgICAgICAgIHsgMiwgMjQsIGNvcHlTdGVyZW8yNCB9LAotICAgICAgICAgICAgeyA4LCAyNCwgY29weU11bHRpQ2gyNCB9LAotICAgICAgICB9OwotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZW9mKHRhYmxlKS9zaXplb2YodGFibGVbMF0pOyArK2kpIHsKLSAgICAgICAgICAgIGlmICh0YWJsZVtpXS5tQ2hhbm5lbHMgPj0gZ2V0Q2hhbm5lbHMoKSAmJgotICAgICAgICAgICAgICAgICAgICB0YWJsZVtpXS5tQml0c1BlclNhbXBsZSA9PSBnZXRCaXRzUGVyU2FtcGxlKCkpIHsKLSAgICAgICAgICAgICAgICBtQ29weSA9IHRhYmxlW2ldLm1Db3B5OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9CiAgICAgICAgIC8vIHBvcHVsYXRlIHRyYWNrIG1ldGFkYXRhCiAgICAgICAgIGlmIChtVHJhY2tNZXRhZGF0YSAhPSAwKSB7Ci0gICAgICAgICAgICBtVHJhY2tNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7Ci0gICAgICAgICAgICBtVHJhY2tNZXRhZGF0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgZ2V0Q2hhbm5lbHMoKSk7Ci0gICAgICAgICAgICBtVHJhY2tNZXRhZGF0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIGdldFNhbXBsZVJhdGUoKSk7Ci0gICAgICAgICAgICBtVHJhY2tNZXRhZGF0YS0+c2V0SW50MzIoa0tleUJpdHNQZXJTYW1wbGUsIGdldEJpdHNQZXJTYW1wbGUoKSk7Ci0gICAgICAgICAgICBtVHJhY2tNZXRhZGF0YS0+c2V0SW50MzIoa0tleVBjbUVuY29kaW5nLCBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0KTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobVRyYWNrTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtVHJhY2tNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBnZXRDaGFubmVscygpKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtVHJhY2tNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgZ2V0U2FtcGxlUmF0ZSgpKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtVHJhY2tNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUsIGdldEJpdHNQZXJTYW1wbGUoKSk7CiAgICAgICAgICAgICAvLyBzYW1wbGUgcmF0ZSBpcyBub24temVybywgc28gZGl2aXNpb24gYnkgemVybyBub3QgcG9zc2libGUKLSAgICAgICAgICAgIG1UcmFja01ldGFkYXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIChnZXRUb3RhbFNhbXBsZXMoKSAqIDEwMDAwMDBMTCkgLyBnZXRTYW1wbGVSYXRlKCkpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1UcmFja01ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAoZ2V0VG90YWxTYW1wbGVzKCkgKiAxMDAwMDAwTEwpIC8gZ2V0U2FtcGxlUmF0ZSgpKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dFKCJtaXNzaW5nIFNUUkVBTUlORk8iKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIGlmIChtRmlsZU1ldGFkYXRhICE9IDApIHsKLSAgICAgICAgbUZpbGVNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKTsKICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIEZMQUNQYXJzZXI6OmFsbG9jYXRlQnVmZmVycygpCit2b2lkIEZMQUNQYXJzZXI6OmFsbG9jYXRlQnVmZmVycyhNZWRpYUJ1ZmZlckdyb3VwSGVscGVyICpncm91cCkKIHsKICAgICBDSEVDSyhtR3JvdXAgPT0gTlVMTCk7Ci0gICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7Ci0gICAgbU1heEJ1ZmZlclNpemUgPSBnZXRNYXhCbG9ja1NpemUoKSAqIGdldENoYW5uZWxzKCkgKiBzaXplb2YoaW50MTZfdCk7Ci0gICAgbUdyb3VwLT5hZGRfYnVmZmVyKE1lZGlhQnVmZmVyQmFzZTo6Q3JlYXRlKG1NYXhCdWZmZXJTaXplKSk7CisgICAgbUdyb3VwID0gZ3JvdXA7CisgICAgbU1heEJ1ZmZlclNpemUgPSBnZXRNYXhCbG9ja1NpemUoKSAqIGdldENoYW5uZWxzKCkgKiBnZXRPdXRwdXRTYW1wbGVTaXplKCk7CisgICAgbUdyb3VwLT5hZGRfYnVmZmVyKG1NYXhCdWZmZXJTaXplKTsKIH0KIAogdm9pZCBGTEFDUGFyc2VyOjpyZWxlYXNlQnVmZmVycygpCiB7Ci0gICAgQ0hFQ0sobUdyb3VwICE9IE5VTEwpOwotICAgIGRlbGV0ZSBtR3JvdXA7Ci0gICAgbUdyb3VwID0gTlVMTDsKIH0KIAotTWVkaWFCdWZmZXJCYXNlICpGTEFDUGFyc2VyOjpyZWFkQnVmZmVyKGJvb2wgZG9TZWVrLCBGTEFDX191aW50NjQgc2FtcGxlKQorTWVkaWFCdWZmZXJIZWxwZXIgKkZMQUNQYXJzZXI6OnJlYWRCdWZmZXIoYm9vbCBkb1NlZWssIEZMQUNfX3VpbnQ2NCBzYW1wbGUpCiB7CiAgICAgbVdyaXRlUmVxdWVzdGVkID0gdHJ1ZTsKICAgICBtV3JpdGVDb21wbGV0ZWQgPSBmYWxzZTsKQEAgLTY4Niw0MSArNjI1LDUzIEBACiAgICAgfQogICAgIC8vIGFjcXVpcmUgYSBtZWRpYSBidWZmZXIKICAgICBDSEVDSyhtR3JvdXAgIT0gTlVMTCk7Ci0gICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcjsKICAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIHNpemVfdCBidWZmZXJTaXplID0gYmxvY2tzaXplICogZ2V0Q2hhbm5lbHMoKSAqIHNpemVvZihpbnQxNl90KTsKKyAgICBjb25zdCBzaXplX3QgYnVmZmVyU2l6ZSA9IGJsb2Nrc2l6ZSAqIGdldENoYW5uZWxzKCkgKiBnZXRPdXRwdXRTYW1wbGVTaXplKCk7CiAgICAgQ0hFQ0soYnVmZmVyU2l6ZSA8PSBtTWF4QnVmZmVyU2l6ZSk7Ci0gICAgaW50MTZfdCAqZGF0YSA9IChpbnQxNl90ICopIGJ1ZmZlci0+ZGF0YSgpOwogICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIGJ1ZmZlclNpemUpOwogICAgIC8vIGNvcHkgUENNIGZyb20gRkxBQyB3cml0ZSBidWZmZXIgdG8gb3VyIG1lZGlhIGJ1ZmZlciwgd2l0aCBpbnRlcmxlYXZpbmcKLSAgICAoKm1Db3B5KShkYXRhLCBtV3JpdGVCdWZmZXIsIGJsb2Nrc2l6ZSwgZ2V0Q2hhbm5lbHMoKSk7CisgICAgY29uc3QgdW5zaWduZWQgYml0c1BlclNhbXBsZSA9IGdldEJpdHNQZXJTYW1wbGUoKTsKKyAgICBpZiAobU91dHB1dEZsb2F0KSB7CisgICAgICAgIGNvcHlUb0Zsb2F0KHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPihidWZmZXItPmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgIG1Xcml0ZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tzaXplLAorICAgICAgICAgICAgICAgICAgICBnZXRDaGFubmVscygpLAorICAgICAgICAgICAgICAgICAgICBiaXRzUGVyU2FtcGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb3B5VG8xNlNpZ25lZChyZWludGVycHJldF9jYXN0PHNob3J0Kj4oYnVmZmVyLT5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICBtV3JpdGVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2hhbm5lbHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgYml0c1BlclNhbXBsZSk7CisgICAgfQogICAgIC8vIGZpbGwgaW4gYnVmZmVyIG1ldGFkYXRhCiAgICAgQ0hFQ0sobVdyaXRlSGVhZGVyLm51bWJlcl90eXBlID09IEZMQUNfX0ZSQU1FX05VTUJFUl9UWVBFX1NBTVBMRV9OVU1CRVIpOwogICAgIEZMQUNfX3VpbnQ2NCBzYW1wbGVOdW1iZXIgPSBtV3JpdGVIZWFkZXIubnVtYmVyLnNhbXBsZV9udW1iZXI7CiAgICAgaW50NjRfdCB0aW1lVXMgPSAoMTAwMDAwMExMICogc2FtcGxlTnVtYmVyKSAvIGdldFNhbXBsZVJhdGUoKTsKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOwotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIHRpbWVVcyk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAgICAgcmV0dXJuIGJ1ZmZlcjsKIH0KIAogLy8gRkxBQ3NvdXJjZQogCiBGTEFDU291cmNlOjpGTEFDU291cmNlKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSwKLSAgICAgICAgTWV0YURhdGFCYXNlICZ0cmFja01ldGFkYXRhKQorICAgICAgICBEYXRhU291cmNlSGVscGVyICpkYXRhU291cmNlLAorICAgICAgICBBTWVkaWFGb3JtYXQgKnRyYWNrTWV0YWRhdGEsCisgICAgICAgIGJvb2wgb3V0cHV0RmxvYXQpCiAgICAgOiBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKICAgICAgIG1UcmFja01ldGFkYXRhKHRyYWNrTWV0YWRhdGEpLAotICAgICAgbVBhcnNlcigwKSwKLSAgICAgIG1Jbml0Q2hlY2soZmFsc2UpLAorICAgICAgbU91dHB1dEZsb2F0KG91dHB1dEZsb2F0KSwKKyAgICAgIG1QYXJzZXIobmV3IEZMQUNQYXJzZXIobURhdGFTb3VyY2UsIG91dHB1dEZsb2F0KSksCisgICAgICBtSW5pdENoZWNrKG1QYXJzZXItPmluaXRDaGVjaygpKSwKICAgICAgIG1TdGFydGVkKGZhbHNlKQogewogICAgIEFMT0dWKCJGTEFDU291cmNlOjpGTEFDU291cmNlIik7Ci0gICAgLy8gcmUtdXNlIHRoZSBzYW1lIHRyYWNrIG1ldGFkYXRhIHBhc3NlZCBpbnRvIGNvbnN0cnVjdG9yIGZyb20gRkxBQ0V4dHJhY3RvcgotICAgIG1QYXJzZXIgPSBuZXcgRkxBQ1BhcnNlcihtRGF0YVNvdXJjZSk7Ci0gICAgbUluaXRDaGVjayAgPSBtUGFyc2VyLT5pbml0Q2hlY2soKTsKIH0KIAogRkxBQ1NvdXJjZTo6fkZMQUNTb3VyY2UoKQpAQCAtNzMyLDE4ICs2ODMsMTggQEAKICAgICBkZWxldGUgbVBhcnNlcjsKIH0KIAotc3RhdHVzX3QgRkxBQ1NvdXJjZTo6c3RhcnQoTWV0YURhdGFCYXNlICogLyogcGFyYW1zICovKQorbWVkaWFfc3RhdHVzX3QgRkxBQ1NvdXJjZTo6c3RhcnQoKQogewogICAgIEFMT0dWKCJGTEFDU291cmNlOjpzdGFydCIpOwogCiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKLSAgICBtUGFyc2VyLT5hbGxvY2F0ZUJ1ZmZlcnMoKTsKKyAgICBtUGFyc2VyLT5hbGxvY2F0ZUJ1ZmZlcnMobUJ1ZmZlckdyb3VwKTsKICAgICBtU3RhcnRlZCA9IHRydWU7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgRkxBQ1NvdXJjZTo6c3RvcCgpCittZWRpYV9zdGF0dXNfdCBGTEFDU291cmNlOjpzdG9wKCkKIHsKICAgICBBTE9HVigiRkxBQ1NvdXJjZTo6c3RvcCIpOwogCkBAIC03NTEsMTkgKzcwMiwyMyBAQAogICAgIG1QYXJzZXItPnJlbGVhc2VCdWZmZXJzKCk7CiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBGTEFDU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKQorbWVkaWFfc3RhdHVzX3QgRkxBQ1NvdXJjZTo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkKIHsKLSAgICBtZXRhID0gbVRyYWNrTWV0YWRhdGE7Ci0gICAgcmV0dXJuIE9LOworICAgIGNvbnN0IG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1UcmFja01ldGFkYXRhKTsKKyAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1BDTV9FTkNPRElORywKKyAgICAgICAgICAgICAgICBtT3V0cHV0RmxvYXQgPyBrQXVkaW9FbmNvZGluZ1BjbUZsb2F0IDoga0F1ZGlvRW5jb2RpbmdQY20xNmJpdCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IEZMQUNTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dEJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpCittZWRpYV9zdGF0dXNfdCBGTEFDU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKm91dEJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpCiB7Ci0gICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcjsKICAgICAvLyBwcm9jZXNzIGFuIG9wdGlvbmFsIHNlZWsgcmVxdWVzdAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKICAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKQEAgLTc4NCwyMCArNzM5LDIyIEBACiAgICAgICAgIGJ1ZmZlciA9IG1QYXJzZXItPnJlYWRCdWZmZXIoKTsKICAgICB9CiAgICAgKm91dEJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICByZXR1cm4gYnVmZmVyICE9IE5VTEwgPyAoc3RhdHVzX3QpIE9LIDogKHN0YXR1c190KSBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIHJldHVybiBidWZmZXIgIT0gTlVMTCA/IEFNRURJQV9PSyA6IEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogfQogCiAvLyBGTEFDRXh0cmFjdG9yCiAKIEZMQUNFeHRyYWN0b3I6OkZMQUNFeHRyYWN0b3IoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlKQorICAgICAgICBEYXRhU291cmNlSGVscGVyICpkYXRhU291cmNlKQogICAgIDogbURhdGFTb3VyY2UoZGF0YVNvdXJjZSksCiAgICAgICBtUGFyc2VyKG51bGxwdHIpLAogICAgICAgbUluaXRDaGVjayhmYWxzZSkKIHsKICAgICBBTE9HVigiRkxBQ0V4dHJhY3Rvcjo6RkxBQ0V4dHJhY3RvciIpOwogICAgIC8vIEZMQUNQYXJzZXIgd2lsbCBmaWxsIGluIHRoZSBtZXRhZGF0YSBmb3IgdXMKLSAgICBtUGFyc2VyID0gbmV3IEZMQUNQYXJzZXIobURhdGFTb3VyY2UsICZtRmlsZU1ldGFkYXRhLCAmbVRyYWNrTWV0YWRhdGEpOworICAgIG1GaWxlTWV0YWRhdGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgbVRyYWNrTWV0YWRhdGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgbVBhcnNlciA9IG5ldyBGTEFDUGFyc2VyKG1EYXRhU291cmNlLCBmYWxzZSAvKiBvdXRwdXRGbG9hdCAqLywgbUZpbGVNZXRhZGF0YSwgbVRyYWNrTWV0YWRhdGEpOwogICAgIG1Jbml0Q2hlY2sgPSBtUGFyc2VyLT5pbml0Q2hlY2soKTsKIH0KIApAQCAtODA1LDYgKzc2Miw5IEBACiB7CiAgICAgQUxPR1YoIn5GTEFDRXh0cmFjdG9yOjpGTEFDRXh0cmFjdG9yIik7CiAgICAgZGVsZXRlIG1QYXJzZXI7CisgICAgZGVsZXRlIG1EYXRhU291cmNlOworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobUZpbGVNZXRhZGF0YSk7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtVHJhY2tNZXRhZGF0YSk7CiB9CiAKIHNpemVfdCBGTEFDRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpCkBAIC04MTIsMzMgKzc3MiwzOSBAQAogICAgIHJldHVybiBtSW5pdENoZWNrID09IE9LID8gMSA6IDA7CiB9CiAKLU1lZGlhVHJhY2sgKkZMQUNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkKK01lZGlhVHJhY2tIZWxwZXIgKkZMQUNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkKIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCA+IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIHJldHVybiBuZXcgRkxBQ1NvdXJjZShtRGF0YVNvdXJjZSwgbVRyYWNrTWV0YWRhdGEpOworCisgICAgcmV0dXJuIG5ldyBGTEFDU291cmNlKAorICAgICAgICAgICAgbURhdGFTb3VyY2UsIG1UcmFja01ldGFkYXRhLCBzaG91bGRFeHRyYWN0b3JPdXRwdXRGbG9hdChtUGFyc2VyLT5nZXRCaXRzUGVyU2FtcGxlKCkpKTsKIH0KIAotc3RhdHVzX3QgRkxBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorbWVkaWFfc3RhdHVzX3QgRkxBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggPiAwKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQotICAgIG1ldGEgPSBtVHJhY2tNZXRhZGF0YTsKLSAgICByZXR1cm4gT0s7CisgICAgY29uc3QgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbVRyYWNrTWV0YWRhdGEpOworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfUENNX0VOQ09ESU5HLAorICAgICAgICAgICAgICAgIHNob3VsZEV4dHJhY3Rvck91dHB1dEZsb2F0KG1QYXJzZXItPmdldEJpdHNQZXJTYW1wbGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgID8ga0F1ZGlvRW5jb2RpbmdQY21GbG9hdCA6IGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBGTEFDRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpCittZWRpYV9zdGF0dXNfdCBGTEFDRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpCiB7Ci0gICAgbWV0YSA9IG1GaWxlTWV0YWRhdGE7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtRmlsZU1ldGFkYXRhKTsKIH0KIAogLy8gU25pZmZlcgogCi1ib29sIFNuaWZmRkxBQyhEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkKK2Jvb2wgU25pZmZGTEFDKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpCiB7CiAgICAgLy8gZmlyc3QgNCBpcyB0aGUgc2lnbmF0dXJlIHdvcmQKICAgICAvLyBzZWNvbmQgNCBpcyB0aGUgc2l6ZW9mIFNUUkVBTUlORk8KQEAgLTg1NiwyOSArODIyLDQwIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICpleHRlbnNpb25zW10gPSB7CisgICAgImZsYWMiLAorICAgICJmbCIsCisgICAgTlVMTAorfTsKIAogZXh0ZXJuICJDIiB7CiAvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCiBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCi1NZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKK0V4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CiAgICAgcmV0dXJuIHsKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OLAorICAgICAgICAgICAgRVhUUkFDVE9SREVGX1ZFUlNJT04sCiAgICAgICAgICAgICBVVUlEKCIxMzY0YjA0OC1jYzQ1LTRmZGEtOTkzNC0zMjdkMGViZjk4MjkiKSwKICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAiRkxBQyBFeHRyYWN0b3IiLAotICAgICAgICAgICAgW10oCi0gICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICAgICAgICAgICAgICB2b2lkICoqLAotICAgICAgICAgICAgICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICopIC0+IE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyB7Ci0gICAgICAgICAgICAgICAgaWYgKFNuaWZmRkxBQyhzb3VyY2UsIGNvbmZpZGVuY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gTWVkaWFFeHRyYWN0b3IqIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRkxBQ0V4dHJhY3Rvcihzb3VyY2UpO307CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLnYzID0geworICAgICAgICAgICAgICAgICAgICBbXSgKKyAgICAgICAgICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiosCisgICAgICAgICAgICAgICAgICAgICAgICBGcmVlTWV0YUZ1bmMgKikgLT4gQ3JlYXRvckZ1bmMgeworICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciBoZWxwZXIoc291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTbmlmZkZMQUMoJmhlbHBlciwgY29uZmlkZW5jZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW10oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBDTWVkaWFFeHRyYWN0b3IqIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAobmV3IEZMQUNFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSkpO307CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCiAgICAgIH07CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9GTEFDRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvRkxBQ0V4dHJhY3Rvci5oCmluZGV4IDdmYjZlYzYuLjVhNzNkMjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9GTEFDRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0ZMQUNFeHRyYWN0b3IuaApAQCAtMTgsNDUgKzE4LDQ0IEBACiAjZGVmaW5lIEZMQUNfRVhUUkFDVE9SX0hfCiAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIEZMQUNQYXJzZXI7CiAKLWNsYXNzIEZMQUNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworY2xhc3MgRkxBQ0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciB7CiAKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBGTEFDRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworICAgIGV4cGxpY2l0IEZMQUNFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKTsKIAogICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7Ci0gICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgTWVkaWFUcmFja0hlbHBlciAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJGTEFDRXh0cmFjdG9yIjsgfQogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+RkxBQ0V4dHJhY3RvcigpOwogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICBGTEFDUGFyc2VyICptUGFyc2VyOwogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7Ci0gICAgTWV0YURhdGFCYXNlIG1GaWxlTWV0YWRhdGE7CisgICAgQU1lZGlhRm9ybWF0ICptRmlsZU1ldGFkYXRhOwogCiAgICAgLy8gVGhlcmUgaXMgb25seSBvbmUgdHJhY2sKLSAgICBNZXRhRGF0YUJhc2UgbVRyYWNrTWV0YWRhdGE7CisgICAgQU1lZGlhRm9ybWF0ICptVHJhY2tNZXRhZGF0YTsKIAogICAgIEZMQUNFeHRyYWN0b3IoY29uc3QgRkxBQ0V4dHJhY3RvciAmKTsKICAgICBGTEFDRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgRkxBQ0V4dHJhY3RvciAmKTsKIAogfTsKIAotYm9vbCBTbmlmZkZMQUMoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpOwotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIEZMQUNfRVhUUkFDVE9SX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21pZGkvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9BbmRyb2lkLmJwCmluZGV4IDZlOTgxMTQuLjdkNDJlNzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9BbmRyb2lkLmJwCkBAIC04LDcgKzgsNyBAQAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21pZGkvTWlkaUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21pZGkvTWlkaUV4dHJhY3Rvci5jcHAKaW5kZXggYTMwYjZmOC4uOWY0ZjllNiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9taWRpL01pZGlFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmNwcApAQCAtMjQsMzUgKzI0LDM0IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxsaWJzb25pdm94L2Vhc19yZXZlcmIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi0vLyBob3cgbWFueSBTb25pdm94IG91dHB1dCBidWZmZXJzIHRvIGFnZ3JlZ2F0ZSBpbnRvIG9uZSBNZWRpYUJ1ZmZlckJhc2UKKy8vIGhvdyBtYW55IFNvbml2b3ggb3V0cHV0IGJ1ZmZlcnMgdG8gYWdncmVnYXRlIGludG8gb25lIE1lZGlhQnVmZmVyCiBzdGF0aWMgY29uc3QgaW50IE5VTV9DT01CSU5FX0JVRkZFUlMgPSA0OwogCi1jbGFzcyBNaWRpU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworY2xhc3MgTWlkaVNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyIHsKIAogcHVibGljOgogICAgIE1pZGlTb3VyY2UoCiAgICAgICAgICAgICBNaWRpRW5naW5lICZlbmdpbmUsCi0gICAgICAgICAgICBNZXRhRGF0YUJhc2UgJnRyYWNrTWV0YWRhdGEpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICp0cmFja01ldGFkYXRhKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSYpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldEZvcm1hdChBTWVkaWFGb3JtYXQgKik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5NaWRpU291cmNlKCk7CiAKIHByaXZhdGU6CiAgICAgTWlkaUVuZ2luZSAmbUVuZ2luZTsKLSAgICBNZXRhRGF0YUJhc2UgJm1UcmFja01ldGFkYXRhOworICAgIEFNZWRpYUZvcm1hdCAqbVRyYWNrTWV0YWRhdGE7CiAgICAgYm9vbCBtSW5pdENoZWNrOwogICAgIGJvb2wgbVN0YXJ0ZWQ7CiAKQEAgLTY5LDcgKzY4LDcgQEAKIAogTWlkaVNvdXJjZTo6TWlkaVNvdXJjZSgKICAgICAgICAgTWlkaUVuZ2luZSAmZW5naW5lLAotICAgICAgICBNZXRhRGF0YUJhc2UgJnRyYWNrTWV0YWRhdGEpCisgICAgICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tNZXRhZGF0YSkKICAgICA6IG1FbmdpbmUoZW5naW5lKSwKICAgICAgIG1UcmFja01ldGFkYXRhKHRyYWNrTWV0YWRhdGEpLAogICAgICAgbUluaXRDaGVjayhmYWxzZSksCkBAIC04NywxNyArODYsMTcgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IE1pZGlTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqIC8qIHBhcmFtcyAqLykKK21lZGlhX3N0YXR1c190IE1pZGlTb3VyY2U6OnN0YXJ0KCkKIHsKICAgICBBTE9HVigiTWlkaVNvdXJjZTo6c3RhcnQiKTsKIAogICAgIENIRUNLKCFtU3RhcnRlZCk7CiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwotICAgIG1FbmdpbmUuYWxsb2NhdGVCdWZmZXJzKCk7Ci0gICAgcmV0dXJuIE9LOworICAgIG1FbmdpbmUuYWxsb2NhdGVCdWZmZXJzKG1CdWZmZXJHcm91cCk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTWlkaVNvdXJjZTo6c3RvcCgpCittZWRpYV9zdGF0dXNfdCBNaWRpU291cmNlOjpzdG9wKCkKIHsKICAgICBBTE9HVigiTWlkaVNvdXJjZTo6c3RvcCIpOwogCkBAIC0xMDUsMjAgKzEwNCwxOSBAQAogICAgIG1TdGFydGVkID0gZmFsc2U7CiAgICAgbUVuZ2luZS5yZWxlYXNlQnVmZmVycygpOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1pZGlTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpCittZWRpYV9zdGF0dXNfdCBNaWRpU291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKQogewotICAgIG1ldGEgPSBtVHJhY2tNZXRhZGF0YTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1UcmFja01ldGFkYXRhKTsKIH0KIAotc3RhdHVzX3QgTWlkaVNvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0QnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykKK21lZGlhX3N0YXR1c190IE1pZGlTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0QnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykKIHsKICAgICBBTE9HVigiTWlkaVNvdXJjZTo6cmVhZCIpOwotICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOworICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXI7CiAgICAgLy8gcHJvY2VzcyBhbiBvcHRpb25hbCBzZWVrIHJlcXVlc3QKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CiAgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CkBAIC0xMzEsNyArMTI5LDcgQEAKICAgICBidWZmZXIgPSBtRW5naW5lLnJlYWRCdWZmZXIoKTsKICAgICAqb3V0QnVmZmVyID0gYnVmZmVyOwogICAgIEFMT0dWKCJNaWRpU291cmNlOjpyZWFkICVwIGRvbmUiLCB0aGlzKTsKLSAgICByZXR1cm4gYnVmZmVyICE9IE5VTEwgPyAoc3RhdHVzX3QpIE9LIDogKHN0YXR1c190KSBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIHJldHVybiBidWZmZXIgIT0gTlVMTCA/IEFNRURJQV9PSyA6IEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogfQogCiBzdGF0dXNfdCBNaWRpU291cmNlOjppbml0KCkKQEAgLTE0MiwxMCArMTQwLDkgQEAKIAogLy8gTWlkaUVuZ2luZQogCi1NaWRpRW5naW5lOjpNaWRpRW5naW5lKERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAotICAgICAgICBNZXRhRGF0YUJhc2UgKmZpbGVNZXRhZGF0YSwKLSAgICAgICAgTWV0YURhdGFCYXNlICp0cmFja01ldGFkYXRhKSA6Ci0gICAgICAgICAgICBtR3JvdXAoTlVMTCksCitNaWRpRW5naW5lOjpNaWRpRW5naW5lKENEYXRhU291cmNlICpkYXRhU291cmNlLAorICAgICAgICBBTWVkaWFGb3JtYXQgKmZpbGVNZXRhZGF0YSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICp0cmFja01ldGFkYXRhKSA6CiAgICAgICAgICAgICBtRWFzRGF0YShOVUxMKSwKICAgICAgICAgICAgIG1FYXNIYW5kbGUoTlVMTCksCiAgICAgICAgICAgICBtRWFzQ29uZmlnKE5VTEwpLApAQCAtMTcwLDE2ICsxNjcsMjAgQEAKICAgICB9CiAKICAgICBpZiAoZmlsZU1ldGFkYXRhICE9IE5VTEwpIHsKLSAgICAgICAgZmlsZU1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTUlESSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcoZmlsZU1ldGFkYXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX01JREkpOwogICAgIH0KIAogICAgIGlmICh0cmFja01ldGFkYXRhICE9IE5VTEwpIHsKLSAgICAgICAgdHJhY2tNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7Ci0gICAgICAgIHRyYWNrTWV0YWRhdGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgMTAwMGxsICogdGVtcCk7IC8vIG1pbGxpLT5taWNybworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKHRyYWNrTWV0YWRhdGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgIHRyYWNrTWV0YWRhdGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIDEwMDBsbCAqIHRlbXApOyAvLyBtaWxsaS0+bWljcm8KICAgICAgICAgbUVhc0NvbmZpZyA9IEVBU19Db25maWcoKTsKLSAgICAgICAgdHJhY2tNZXRhZGF0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1FYXNDb25maWctPnNhbXBsZVJhdGUpOwotICAgICAgICB0cmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBtRWFzQ29uZmlnLT5udW1DaGFubmVscyk7Ci0gICAgICAgIHRyYWNrTWV0YWRhdGEtPnNldEludDMyKGtLZXlQY21FbmNvZGluZywga0F1ZGlvRW5jb2RpbmdQY20xNmJpdCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMigKKyAgICAgICAgICAgICAgICB0cmFja01ldGFkYXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBtRWFzQ29uZmlnLT5zYW1wbGVSYXRlKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKAorICAgICAgICAgICAgICAgIHRyYWNrTWV0YWRhdGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbUVhc0NvbmZpZy0+bnVtQ2hhbm5lbHMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoCisgICAgICAgICAgICAgICAgdHJhY2tNZXRhZGF0YSwgQU1FRElBRk9STUFUX0tFWV9QQ01fRU5DT0RJTkcsIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOwogICAgIH0KICAgICBtSXNJbml0aWFsaXplZCA9IHRydWU7CiB9CkBAIC0xOTEsNyArMTkyLDYgQEAKICAgICBpZiAobUVhc0RhdGEpIHsKICAgICAgICAgRUFTX1NodXRkb3duKG1FYXNEYXRhKTsKICAgICB9Ci0gICAgZGVsZXRlIG1Hcm91cDsKICAgICBkZWxldGUgbUlvV3JhcHBlcjsKIH0KIApAQCAtMTk5LDIyICsxOTksMjAgQEAKICAgICByZXR1cm4gbUlzSW5pdGlhbGl6ZWQgPyBPSyA6IFVOS05PV05fRVJST1I7CiB9CiAKLXN0YXR1c190IE1pZGlFbmdpbmU6OmFsbG9jYXRlQnVmZmVycygpIHsKK3N0YXR1c190IE1pZGlFbmdpbmU6OmFsbG9jYXRlQnVmZmVycyhNZWRpYUJ1ZmZlckdyb3VwSGVscGVyICpncm91cCkgewogICAgIC8vIHNlbGVjdCByZXZlcmIgcHJlc2V0IGFuZCBlbmFibGUKICAgICBFQVNfU2V0UGFyYW1ldGVyKG1FYXNEYXRhLCBFQVNfTU9EVUxFX1JFVkVSQiwgRUFTX1BBUkFNX1JFVkVSQl9QUkVTRVQsIEVBU19QQVJBTV9SRVZFUkJfQ0hBTUJFUik7CiAgICAgRUFTX1NldFBhcmFtZXRlcihtRWFzRGF0YSwgRUFTX01PRFVMRV9SRVZFUkIsIEVBU19QQVJBTV9SRVZFUkJfQllQQVNTLCBFQVNfRkFMU0UpOwogCi0gICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7CiAgICAgaW50IGJ1ZnNpemUgPSBzaXplb2YoRUFTX1BDTSkKICAgICAgICAgICAgICogbUVhc0NvbmZpZy0+bWl4QnVmZmVyU2l6ZSAqIG1FYXNDb25maWctPm51bUNoYW5uZWxzICogTlVNX0NPTUJJTkVfQlVGRkVSUzsKICAgICBBTE9HVigidXNpbmcgJWQgYnl0ZSBidWZmZXIiLCBidWZzaXplKTsKLSAgICBtR3JvdXAtPmFkZF9idWZmZXIoTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUoYnVmc2l6ZSkpOworICAgIG1Hcm91cCA9IGdyb3VwOworICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihidWZzaXplKTsKICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IE1pZGlFbmdpbmU6OnJlbGVhc2VCdWZmZXJzKCkgewotICAgIGRlbGV0ZSBtR3JvdXA7Ci0gICAgbUdyb3VwID0gTlVMTDsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTIyNCwxMyArMjIyLDEzIEBACiAgICAgcmV0dXJuIHJlc3VsdCA9PSBFQVNfU1VDQ0VTUyA/IE9LIDogVU5LTk9XTl9FUlJPUjsKIH0KIAotTWVkaWFCdWZmZXJCYXNlKiBNaWRpRW5naW5lOjpyZWFkQnVmZmVyKCkgeworTWVkaWFCdWZmZXJIZWxwZXIqIE1pZGlFbmdpbmU6OnJlYWRCdWZmZXIoKSB7CiAgICAgRUFTX1NUQVRFIHN0YXRlOwogICAgIEVBU19TdGF0ZShtRWFzRGF0YSwgbUVhc0hhbmRsZSwgJnN0YXRlKTsKICAgICBpZiAoKHN0YXRlID09IEVBU19TVEFURV9TVE9QUEVEKSB8fCAoc3RhdGUgPT0gRUFTX1NUQVRFX0VSUk9SKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcjsKICAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgQUxPR0UoInJlYWRCdWZmZXI6IG5vIGJ1ZmZlciIpOwpAQCAtMjM5LDcgKzIzNyw5IEBACiAgICAgRUFTX0kzMiB0aW1lTXM7CiAgICAgRUFTX0dldExvY2F0aW9uKG1FYXNEYXRhLCBtRWFzSGFuZGxlLCAmdGltZU1zKTsKICAgICBpbnQ2NF90IHRpbWVVcyA9IDEwMDBsbCAqIHRpbWVNczsKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdGltZVVzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKIAogICAgIEVBU19QQ00qIHAgPSAoRUFTX1BDTSopIGJ1ZmZlci0+ZGF0YSgpOwogICAgIGludCBudW1CeXRlc091dHB1dCA9IDA7CkBAIC0yNjMsMTggKzI2MywyMyBAQAogLy8gTWlkaUV4dHJhY3RvcgogCiBNaWRpRXh0cmFjdG9yOjpNaWRpRXh0cmFjdG9yKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSkKKyAgICAgICAgQ0RhdGFTb3VyY2UgKmRhdGFTb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKICAgICAgIG1Jbml0Q2hlY2soZmFsc2UpCiB7CiAgICAgQUxPR1YoIk1pZGlFeHRyYWN0b3IgY3RvciIpOwotICAgIG1FbmdpbmUgPSBuZXcgTWlkaUVuZ2luZShtRGF0YVNvdXJjZSwgJm1GaWxlTWV0YWRhdGEsICZtVHJhY2tNZXRhZGF0YSk7CisgICAgbUZpbGVNZXRhZGF0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBtVHJhY2tNZXRhZGF0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBtRW5naW5lID0gbmV3IE1pZGlFbmdpbmUobURhdGFTb3VyY2UsIG1GaWxlTWV0YWRhdGEsIG1UcmFja01ldGFkYXRhKTsKICAgICBtSW5pdENoZWNrID0gbUVuZ2luZS0+aW5pdENoZWNrKCk7CiB9CiAKIE1pZGlFeHRyYWN0b3I6On5NaWRpRXh0cmFjdG9yKCkKIHsKICAgICBBTE9HVigiTWlkaUV4dHJhY3RvciBkdG9yIik7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtRmlsZU1ldGFkYXRhKTsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1UcmFja01ldGFkYXRhKTsKKyAgICBkZWxldGUgbUVuZ2luZTsKIH0KIAogc2l6ZV90IE1pZGlFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkKQEAgLTI4Miw3ICsyODcsNyBAQAogICAgIHJldHVybiBtSW5pdENoZWNrID09IE9LID8gMSA6IDA7CiB9CiAKLU1lZGlhVHJhY2sgKk1pZGlFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkKK01lZGlhVHJhY2tIZWxwZXIgKk1pZGlFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkKIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCA+IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0yOTAsMjcgKzI5NSwyNSBAQAogICAgIHJldHVybiBuZXcgTWlkaVNvdXJjZSgqbUVuZ2luZSwgbVRyYWNrTWV0YWRhdGEpOwogfQogCi1zdGF0dXNfdCBNaWRpRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCittZWRpYV9zdGF0dXNfdCBNaWRpRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBBTE9HVigiTWlkaUV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSIpOwogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ID4gMCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KLSAgICBtZXRhID0gbVRyYWNrTWV0YWRhdGE7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtVHJhY2tNZXRhZGF0YSk7CiB9CiAKLXN0YXR1c190IE1pZGlFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkKK21lZGlhX3N0YXR1c190IE1pZGlFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkKIHsKICAgICBBTE9HVigiTWlkaUV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEiKTsKLSAgICBtZXRhID0gbUZpbGVNZXRhZGF0YTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1GaWxlTWV0YWRhdGEpOwogfQogCiAvLyBTbmlmZmVyCiAKLWJvb2wgU25pZmZNaWRpKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKQorYm9vbCBTbmlmZk1pZGkoQ0RhdGFTb3VyY2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpCiB7CiAgICAgTWlkaUVuZ2luZSBwKHNvdXJjZSwgTlVMTCwgTlVMTCk7CiAgICAgaWYgKHAuaW5pdENoZWNrKCkgPT0gT0spIHsKQEAgLTMyMywyOCArMzI2LDQ2IEBACiAKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnNbXSA9IHsKKyAgICAiaW15IiwKKyAgICAibWlkIiwKKyAgICAibWlkaSIsCisgICAgIm14bWYiLAorICAgICJvdGEiLAorICAgICJydHR0bCIsCisgICAgInJ0eCIsCisgICAgInNtZiIsCisgICAgInhtZiIsCisgICAgTlVMTAorfTsKKwogZXh0ZXJuICJDIiB7CiAvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCiBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCi1NZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKK0V4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CiAgICAgcmV0dXJuIHsKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OLAorICAgICAgICBFWFRSQUNUT1JERUZfVkVSU0lPTiwKICAgICAgICAgVVVJRCgiZWY2Y2NhMGEtZjhhMi00M2U2LWJhNWYtZGZjZDdjOWE3ZWYyIiksCiAgICAgICAgIDEsCiAgICAgICAgICJNSURJIEV4dHJhY3RvciIsCi0gICAgICAgIFtdKAotICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgICAgIHsKKyAgICAgICAgICAgIC52MyA9IHsKKyAgICAgICAgICAgICAgICBbXSgKKyAgICAgICAgICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAogICAgICAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAogICAgICAgICAgICAgICAgIHZvaWQgKiosCi0gICAgICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSAtPiBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgewotICAgICAgICAgICAgaWYgKFNuaWZmTWlkaShzb3VyY2UsIGNvbmZpZGVuY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFtdKAotICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gTWVkaWFFeHRyYWN0b3IqIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNaWRpRXh0cmFjdG9yKHNvdXJjZSk7fTsKKyAgICAgICAgICAgICAgICBGcmVlTWV0YUZ1bmMgKikgLT4gQ3JlYXRvckZ1bmMgeworICAgICAgICAgICAgICAgICAgICBpZiAoU25pZmZNaWRpKHNvdXJjZSwgY29uZmlkZW5jZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBDTWVkaWFFeHRyYWN0b3IqIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcChuZXcgTWlkaUV4dHJhY3Rvcihzb3VyY2UpKTt9OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KKyAgICAgICAgfSwKICAgICB9OwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21pZGkvTWlkaUV4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9taWRpL01pZGlFeHRyYWN0b3IuaAppbmRleCAyNDRkZDBmLi4yZTc4MDg2IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21pZGkvTWlkaUV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmgKQEAgLTE4LDExICsxOCwxMiBAQAogI2RlZmluZSBNSURJX0VYVFJBQ1RPUl9IXwogCiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWlkaUlvV3JhcHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPGxpYnNvbml2b3gvZWFzLmg+CiAKQEAgLTMwLDQ4ICszMSw0OCBAQAogCiBjbGFzcyBNaWRpRW5naW5lIHsKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBNaWRpRW5naW5lKERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAotICAgICAgICAgICAgTWV0YURhdGFCYXNlICpmaWxlTWV0YWRhdGEsCi0gICAgICAgICAgICBNZXRhRGF0YUJhc2UgKnRyYWNrTWV0YWRhdGEpOworICAgIGV4cGxpY2l0IE1pZGlFbmdpbmUoQ0RhdGFTb3VyY2UgKmRhdGFTb3VyY2UsCisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKmZpbGVNZXRhZGF0YSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tNZXRhZGF0YSk7CiAgICAgfk1pZGlFbmdpbmUoKTsKIAogICAgIHN0YXR1c190IGluaXRDaGVjaygpOwogCi0gICAgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXJzKCk7CisgICAgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXJzKE1lZGlhQnVmZmVyR3JvdXBIZWxwZXIgKmdyb3VwKTsKICAgICBzdGF0dXNfdCByZWxlYXNlQnVmZmVycygpOwogICAgIHN0YXR1c190IHNlZWtUbyhpbnQ2NF90IHBvc2l0aW9uVXMpOwotICAgIE1lZGlhQnVmZmVyQmFzZSogcmVhZEJ1ZmZlcigpOworICAgIE1lZGlhQnVmZmVySGVscGVyKiByZWFkQnVmZmVyKCk7CiBwcml2YXRlOgogICAgIE1pZGlJb1dyYXBwZXIgKm1Jb1dyYXBwZXI7Ci0gICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOworICAgIE1lZGlhQnVmZmVyR3JvdXBIZWxwZXIgKm1Hcm91cDsKICAgICBFQVNfREFUQV9IQU5ETEUgbUVhc0RhdGE7CiAgICAgRUFTX0hBTkRMRSBtRWFzSGFuZGxlOwogICAgIGNvbnN0IFNfRUFTX0xJQl9DT05GSUcqIG1FYXNDb25maWc7CiAgICAgYm9vbCBtSXNJbml0aWFsaXplZDsKIH07CiAKLWNsYXNzIE1pZGlFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworY2xhc3MgTWlkaUV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciB7CiAKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBNaWRpRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworICAgIGV4cGxpY2l0IE1pZGlFeHRyYWN0b3IoQ0RhdGFTb3VyY2UgKnNvdXJjZSk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiTWlkaUV4dHJhY3RvciI7IH0KIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk1pZGlFeHRyYWN0b3IoKTsKIAogcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgQ0RhdGFTb3VyY2UgKm1EYXRhU291cmNlOwogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7Ci0gICAgTWV0YURhdGFCYXNlIG1GaWxlTWV0YWRhdGE7CisgICAgQU1lZGlhRm9ybWF0ICptRmlsZU1ldGFkYXRhOwogCiAgICAgLy8gVGhlcmUgaXMgb25seSBvbmUgdHJhY2sKLSAgICBNZXRhRGF0YUJhc2UgbVRyYWNrTWV0YWRhdGE7CisgICAgQU1lZGlhRm9ybWF0ICptVHJhY2tNZXRhZGF0YTsKIAogICAgIE1pZGlFbmdpbmUgKm1FbmdpbmU7CiAKQEAgLTg4LDcgKzg5LDcgQEAKIAogfTsKIAotYm9vbCBTbmlmZk1pZGkoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpOworYm9vbCBTbmlmZk1pZGkoQ0RhdGFTb3VyY2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpOwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21rdi9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvQW5kcm9pZC5icAppbmRleCBmN2VkMGM4Li4xNzQ0ZDNkIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21rdi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbWt2L0FuZHJvaWQuYnAKQEAgLTExLDcgKzExLDcgQEAKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGlibWVkaWFuZGsiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuY3BwCmluZGV4IGQ2NTc1ODIuLjQyMDBhNDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5jcHAKQEAgLTIzLDE3ICsyMywxNCBAQAogCiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9FeHRyYWN0b3JVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIApAQCAtNDQsNyArNDEsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgRGF0YVNvdXJjZUJhc2VSZWFkZXIgOiBwdWJsaWMgbWt2cGFyc2VyOjpJTWt2UmVhZGVyIHsKLSAgICBleHBsaWNpdCBEYXRhU291cmNlQmFzZVJlYWRlcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorICAgIGV4cGxpY2l0IERhdGFTb3VyY2VCYXNlUmVhZGVyKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKICAgICAgICAgOiBtU291cmNlKHNvdXJjZSkgewogICAgIH0KIApAQCAtNjgsOCArNjUsMTIgQEAKICAgICB2aXJ0dWFsIGludCBMZW5ndGgobG9uZyBsb25nKiB0b3RhbCwgbG9uZyBsb25nKiBhdmFpbGFibGUpIHsKICAgICAgICAgb2ZmNjRfdCBzaXplOwogICAgICAgICBpZiAobVNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSkgIT0gT0spIHsKLSAgICAgICAgICAgICp0b3RhbCA9IC0xOwotICAgICAgICAgICAgKmF2YWlsYWJsZSA9IChsb25nIGxvbmcpKCgxdWxsIDw8IDYzKSAtIDEpOworICAgICAgICAgICAgaWYgKHRvdGFsKSB7CisgICAgICAgICAgICAgICAgKnRvdGFsID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXZhaWxhYmxlKSB7CisgICAgICAgICAgICAgICAgKmF2YWlsYWJsZSA9IChsb25nIGxvbmcpKCgxdWxsIDw8IDYzKSAtIDEpOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQpAQCAtODYsNyArODcsNyBAQAogICAgIH0KIAogcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZSAqbVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptU291cmNlOwogCiAgICAgRGF0YVNvdXJjZUJhc2VSZWFkZXIoY29uc3QgRGF0YVNvdXJjZUJhc2VSZWFkZXIgJik7CiAgICAgRGF0YVNvdXJjZUJhc2VSZWFkZXIgJm9wZXJhdG9yPShjb25zdCBEYXRhU291cmNlQmFzZVJlYWRlciAmKTsKQEAgLTEyNCwxNiArMTI1LDE2IEBACiAgICAgQmxvY2tJdGVyYXRvciAmb3BlcmF0b3I9KGNvbnN0IEJsb2NrSXRlcmF0b3IgJik7CiB9OwogCi1zdHJ1Y3QgTWF0cm9za2FTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFjayB7CitzdHJ1Y3QgTWF0cm9za2FTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CiAgICAgTWF0cm9za2FTb3VyY2UoTWF0cm9za2FFeHRyYWN0b3IgKmV4dHJhY3Rvciwgc2l6ZV90IGluZGV4KTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0b3AoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldEZvcm1hdChBTWVkaWFGb3JtYXQgKik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TWF0cm9za2FTb3VyY2UoKTsKQEAgLTE1MywxMiArMTU0LDEyIEBACiAgICAgQmxvY2tJdGVyYXRvciBtQmxvY2tJdGVyOwogICAgIHNzaXplX3QgbU5BTFNpemVMZW47ICAvLyBmb3IgdHlwZSBBVkMgb3IgSEVWQwogCi0gICAgTGlzdDxNZWRpYUJ1ZmZlckJhc2UgKj4gbVBlbmRpbmdGcmFtZXM7CisgICAgTGlzdDxNZWRpYUJ1ZmZlckhlbHBlciAqPiBtUGVuZGluZ0ZyYW1lczsKIAogICAgIHN0YXR1c190IGFkdmFuY2UoKTsKIAotICAgIHN0YXR1c190IHNldFdlYm1CbG9ja0NyeXB0b0luZm8oTWVkaWFCdWZmZXJCYXNlICptYnVmKTsKLSAgICBzdGF0dXNfdCByZWFkQmxvY2soKTsKKyAgICBzdGF0dXNfdCBzZXRXZWJtQmxvY2tDcnlwdG9JbmZvKE1lZGlhQnVmZmVySGVscGVyICptYnVmKTsKKyAgICBtZWRpYV9zdGF0dXNfdCByZWFkQmxvY2soKTsKICAgICB2b2lkIGNsZWFyUGVuZGluZ0ZyYW1lcygpOwogCiAgICAgTWF0cm9za2FTb3VyY2UoY29uc3QgTWF0cm9za2FTb3VyY2UgJik7CkBAIC0yMjIsNDMgKzIyMywzMSBAQAogICAgICAgICAgICAgICAgICBtRXh0cmFjdG9yLT5tVHJhY2tzLml0ZW1BdChpbmRleCkubVRyYWNrTnVtLAogICAgICAgICAgICAgICAgICBpbmRleCksCiAgICAgICBtTkFMU2l6ZUxlbigtMSkgewotICAgIE1ldGFEYXRhQmFzZSAmbWV0YSA9IG1FeHRyYWN0b3ItPm1UcmFja3MuZWRpdEl0ZW1BdChpbmRleCkubU1ldGE7CisgICAgTWF0cm9za2FFeHRyYWN0b3I6OlRyYWNrSW5mbyAmdHJhY2tJbmZvID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5lZGl0SXRlbUF0KGluZGV4KTsKKyAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSB0cmFja0luZm8ubU1ldGE7CiAKICAgICBjb25zdCBjaGFyICptaW1lOwotICAgIENIRUNLKG1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpOwogCiAgICAgbUlzQXVkaW8gPSAhc3RybmNhc2VjbXAoImF1ZGlvLyIsIG1pbWUsIDYpOwogCiAgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykpIHsKICAgICAgICAgbVR5cGUgPSBBVkM7CiAKLSAgICAgICAgdWludDMyX3QgZHVtbXk7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmF2Y2M7Ci0gICAgICAgIHNpemVfdCBhdmNjU2l6ZTsKLSAgICAgICAgaW50MzJfdCBuYWxTaXplTGVuID0gMDsKLSAgICAgICAgaWYgKG1ldGEuZmluZEludDMyKGtLZXlOYWxMZW5ndGhTaXplLCAmbmFsU2l6ZUxlbikpIHsKLSAgICAgICAgICAgIGlmIChuYWxTaXplTGVuID49IDAgJiYgbmFsU2l6ZUxlbiA8PSA0KSB7Ci0gICAgICAgICAgICAgICAgbU5BTFNpemVMZW4gPSBuYWxTaXplTGVuOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1ldGEuZmluZERhdGEoa0tleUFWQ0MsICZkdW1teSwgKGNvbnN0IHZvaWQgKiopJmF2Y2MsICZhdmNjU2l6ZSkKLSAgICAgICAgICAgICAgICAmJiBhdmNjU2l6ZSA+PSA1dSkgewotICAgICAgICAgICAgbU5BTFNpemVMZW4gPSAxICsgKGF2Y2NbNF0gJiAzKTsKLSAgICAgICAgICAgIEFMT0dWKCJtTkFMU2l6ZUxlbiA9ICV6ZCIsIG1OQUxTaXplTGVuKTsKKyAgICAgICAgaW50MzJfdCBuYWxTaXplTGVuID0gdHJhY2tJbmZvLm1OYWxMZW5ndGhTaXplOworICAgICAgICBpZiAobmFsU2l6ZUxlbiA+PSAwICYmIG5hbFNpemVMZW4gPD0gNCkgeworICAgICAgICAgICAgbU5BTFNpemVMZW4gPSBuYWxTaXplTGVuOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIk5vIG1OQUxTaXplTGVuIik7CisgICAgICAgICAgICBBTE9HRSgiTm8gQVZDIG1OQUxTaXplTGVuIik7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpKSB7CiAgICAgICAgIG1UeXBlID0gSEVWQzsKIAotICAgICAgICB1aW50MzJfdCBkdW1teTsKLSAgICAgICAgY29uc3QgdWludDhfdCAqaHZjYzsKLSAgICAgICAgc2l6ZV90IGh2Y2NTaXplOwotICAgICAgICBpZiAobWV0YS5maW5kRGF0YShrS2V5SFZDQywgJmR1bW15LCAoY29uc3Qgdm9pZCAqKikmaHZjYywgJmh2Y2NTaXplKQotICAgICAgICAgICAgICAgICYmIGh2Y2NTaXplID49IDIydSkgewotICAgICAgICAgICAgbU5BTFNpemVMZW4gPSAxICsgKGh2Y2NbMTQrN10gJiAzKTsKLSAgICAgICAgICAgIEFMT0dWKCJtTkFMU2l6ZUxlbiA9ICV6dSIsIG1OQUxTaXplTGVuKTsKKyAgICAgICAgaW50MzJfdCBuYWxTaXplTGVuID0gdHJhY2tJbmZvLm1OYWxMZW5ndGhTaXplOworICAgICAgICBpZiAobmFsU2l6ZUxlbiA+PSAwICYmIG5hbFNpemVMZW4gPD0gNCkgeworICAgICAgICAgICAgbU5BTFNpemVMZW4gPSBuYWxTaXplTGVuOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIk5vIG1OQUxTaXplTGVuIik7CisgICAgICAgICAgICBBTE9HRSgiTm8gSEVWQyBtTkFMU2l6ZUxlbiIpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKSB7CiAgICAgICAgIG1UeXBlID0gQUFDOwpAQCAtMjY5LDI1ICsyNTgsMjYgQEAKICAgICBjbGVhclBlbmRpbmdGcmFtZXMoKTsKIH0KIAotc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqIC8qIHBhcmFtcyAqLykgeworbWVkaWFfc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnN0YXJ0KCkgewogICAgIGlmIChtVHlwZSA9PSBBVkMgJiYgbU5BTFNpemVMZW4gPCAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAorICAgIC8vIGFsbG9jYXRlIG9uZSBzbWFsbCBpbml0aWFsIGJ1ZmZlciwgYnV0IGxlYXZlIHBsZW50eSBvZiByb29tIHRvIGdyb3cKKyAgICBtQnVmZmVyR3JvdXAtPmluaXQoMSAvKiBudW1iZXIgb2YgYnVmZmVycyAqLywgMTAyNCAvKiBidWZmZXIgc2l6ZSAqLywgNjQgLyogZ3Jvd3RoIGxpbWl0ICovKTsKICAgICBtQmxvY2tJdGVyLnJlc2V0KCk7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6c3RvcCgpIHsKICAgICBjbGVhclBlbmRpbmdGcmFtZXMoKTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgIG1ldGEgPSBtRXh0cmFjdG9yLT5tVHJhY2tzLml0ZW1BdChtVHJhY2tJbmRleCkubU1ldGE7Ci0gICAgcmV0dXJuIE9LOworbWVkaWFfc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OmdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpIHsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQobVRyYWNrSW5kZXgpLm1NZXRhKTsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTU3OSw3ICs1NjksNyBAQAogCiB2b2lkIE1hdHJvc2thU291cmNlOjpjbGVhclBlbmRpbmdGcmFtZXMoKSB7CiAgICAgd2hpbGUgKCFtUGVuZGluZ0ZyYW1lcy5lbXB0eSgpKSB7Ci0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqZnJhbWUgPSAqbVBlbmRpbmdGcmFtZXMuYmVnaW4oKTsKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmZyYW1lID0gKm1QZW5kaW5nRnJhbWVzLmJlZ2luKCk7CiAgICAgICAgIG1QZW5kaW5nRnJhbWVzLmVyYXNlKG1QZW5kaW5nRnJhbWVzLmJlZ2luKCkpOwogCiAgICAgICAgIGZyYW1lLT5yZWxlYXNlKCk7CkBAIC01ODcsNyArNTc3LDcgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IE1hdHJvc2thU291cmNlOjpzZXRXZWJtQmxvY2tDcnlwdG9JbmZvKE1lZGlhQnVmZmVyQmFzZSAqbWJ1Zikgeworc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnNldFdlYm1CbG9ja0NyeXB0b0luZm8oTWVkaWFCdWZmZXJIZWxwZXIgKm1idWYpIHsKICAgICBpZiAobWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgPCAxIHx8IG1idWYtPnJhbmdlX2xlbmd0aCgpIC0gMSA+IElOVDMyX01BWCkgewogICAgICAgICAvLyAxLWJ5dGUgc2lnbmFsCiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CkBAIC02MDEsMTcgKzU5MSwxNyBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotICAgIE1ldGFEYXRhQmFzZSAmbWV0YSA9IG1idWYtPm1ldGFfZGF0YSgpOworICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IG1idWYtPm1ldGFfZGF0YSgpOwogICAgIGlmIChlbmNyeXB0ZWQpIHsKICAgICAgICAgdWludDhfdCBjdHJDb3VudGVyWzE2XSA9IHsgMCB9OwotICAgICAgICB1aW50MzJfdCB0eXBlOwogICAgICAgICBjb25zdCB1aW50OF90ICprZXlJZDsKICAgICAgICAgc2l6ZV90IGtleUlkU2l6ZTsKLSAgICAgICAgY29uc3QgTWV0YURhdGFCYXNlICZ0cmFja01ldGEgPSBtRXh0cmFjdG9yLT5tVHJhY2tzLml0ZW1BdChtVHJhY2tJbmRleCkubU1ldGE7Ci0gICAgICAgIENIRUNLKHRyYWNrTWV0YS5maW5kRGF0YShrS2V5Q3J5cHRvS2V5LCAmdHlwZSwgKGNvbnN0IHZvaWQgKiopJmtleUlkLCAma2V5SWRTaXplKSk7Ci0gICAgICAgIG1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvS2V5LCAwLCBrZXlJZCwga2V5SWRTaXplKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0ICp0cmFja01ldGEgPSBtRXh0cmFjdG9yLT5tVHJhY2tzLml0ZW1BdChtVHJhY2tJbmRleCkubU1ldGE7CisgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2tNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksCisgICAgICAgICAgICAgICAgKHZvaWQqKikma2V5SWQsICZrZXlJZFNpemUpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSwga2V5SWQsIGtleUlkU2l6ZSk7CiAgICAgICAgIG1lbWNweShjdHJDb3VudGVyLCBkYXRhICsgMSwgOCk7Ci0gICAgICAgIG1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvSVYsIDAsIGN0ckNvdW50ZXIsIDE2KTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19JViwgY3RyQ291bnRlciwgMTYpOwogICAgICAgICBpZiAocGFydGl0aW9uZWQpIHsKICAgICAgICAgICAgIC8qICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCiAgICAgICAgICAgICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCkBAIC02NjQsOCArNjU0LDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB1aW50MzJfdCBzaXplb2ZQbGFpblNpemVzID0gc2l6ZW9mKHVpbnQzMl90KSAqIHBsYWluU2l6ZXMuc2l6ZSgpOwogICAgICAgICAgICAgdWludDMyX3Qgc2l6ZW9mRW5jcnlwdGVkU2l6ZXMgPSBzaXplb2YodWludDMyX3QpICogZW5jcnlwdGVkU2l6ZXMuc2l6ZSgpOwotICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlQbGFpblNpemVzLCAwLCBwbGFpblNpemVzLmRhdGEoKSwgc2l6ZW9mUGxhaW5TaXplcyk7Ci0gICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleUVuY3J5cHRlZFNpemVzLCAwLCBlbmNyeXB0ZWRTaXplcy5kYXRhKCksIHNpemVvZkVuY3J5cHRlZFNpemVzKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fUExBSU5fU0laRVMsCisgICAgICAgICAgICAgICAgICAgIHBsYWluU2l6ZXMuZGF0YSgpLCBzaXplb2ZQbGFpblNpemVzKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX1NJWkVTLAorICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWRTaXplcy5kYXRhKCksIHNpemVvZkVuY3J5cHRlZFNpemVzKTsKICAgICAgICAgICAgIG1idWYtPnNldF9yYW5nZShmcmFtZU9mZnNldCwgbWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSBmcmFtZU9mZnNldCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvKgpAQCAtNjg1LDggKzY3NywxMCBAQAogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBpbnQzMl90IHBsYWluU2l6ZXNbXSA9IHsgMCB9OwogICAgICAgICAgICAgaW50MzJfdCBlbmNyeXB0ZWRTaXplc1tdID0geyBzdGF0aWNfY2FzdDxpbnQzMl90PihtYnVmLT5yYW5nZV9sZW5ndGgoKSAtIDkpIH07Ci0gICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleVBsYWluU2l6ZXMsIDAsIHBsYWluU2l6ZXMsIHNpemVvZihwbGFpblNpemVzKSk7Ci0gICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleUVuY3J5cHRlZFNpemVzLCAwLCBlbmNyeXB0ZWRTaXplcywgc2l6ZW9mKGVuY3J5cHRlZFNpemVzKSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1BMQUlOX1NJWkVTLAorICAgICAgICAgICAgICAgICAgICBwbGFpblNpemVzLCBzaXplb2YocGxhaW5TaXplcykpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfU0laRVMsCisgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRlZFNpemVzLCBzaXplb2YoZW5jcnlwdGVkU2l6ZXMpKTsKICAgICAgICAgICAgIG1idWYtPnNldF9yYW5nZSg5LCBtYnVmLT5yYW5nZV9sZW5ndGgoKSAtIDkpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTcwMywxOSArNjk3LDIxIEBACiAgICAgICAgICAqLwogICAgICAgICBpbnQzMl90IHBsYWluU2l6ZXNbXSA9IHsgc3RhdGljX2Nhc3Q8aW50MzJfdD4obWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSAxKSB9OwogICAgICAgICBpbnQzMl90IGVuY3J5cHRlZFNpemVzW10gPSB7IDAgfTsKLSAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlQbGFpblNpemVzLCAwLCBwbGFpblNpemVzLCBzaXplb2YocGxhaW5TaXplcykpOwotICAgICAgICBtZXRhLnNldERhdGEoa0tleUVuY3J5cHRlZFNpemVzLCAwLCBlbmNyeXB0ZWRTaXplcywgc2l6ZW9mKGVuY3J5cHRlZFNpemVzKSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fUExBSU5fU0laRVMsCisgICAgICAgICAgICAgICAgcGxhaW5TaXplcywgc2l6ZW9mKHBsYWluU2l6ZXMpKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfU0laRVMsCisgICAgICAgICAgICAgICAgZW5jcnlwdGVkU2l6ZXMsIHNpemVvZihlbmNyeXB0ZWRTaXplcykpOwogICAgICAgICBtYnVmLT5zZXRfcmFuZ2UoMSwgbWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSAxKTsKICAgICB9CiAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE1hdHJvc2thU291cmNlOjpyZWFkQmxvY2soKSB7CittZWRpYV9zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6cmVhZEJsb2NrKCkgewogICAgIENIRUNLKG1QZW5kaW5nRnJhbWVzLmVtcHR5KCkpOwogCiAgICAgaWYgKG1CbG9ja0l0ZXIuZW9zKCkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICB9CiAKICAgICBjb25zdCBta3ZwYXJzZXI6OkJsb2NrICpibG9jayA9IG1CbG9ja0l0ZXIuYmxvY2soKTsKQEAgLTcyNywxOCArNzIzLDIxIEBACiAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6QmxvY2s6OkZyYW1lICZmcmFtZSA9IGJsb2NrLT5HZXRGcmFtZShpKTsKICAgICAgICAgc2l6ZV90IGxlbiA9IGZyYW1lLmxlbjsKICAgICAgICAgaWYgKFNJWkVfTUFYIC0gbGVuIDwgdHJhY2tJbmZvLT5tSGVhZGVyTGVuKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KIAogICAgICAgICBsZW4gKz0gdHJhY2tJbmZvLT5tSGVhZGVyTGVuOwotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKm1idWYgPSBNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZShsZW4pOworICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqbWJ1ZjsKKyAgICAgICAgbUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmbWJ1ZiwgZmFsc2UgLyogbm9uYmxvY2tpbmcgKi8sIGxlbiAvKiByZXF1ZXN0ZWQgc2l6ZSAqLyk7CisgICAgICAgIG1idWYtPnNldF9yYW5nZSgwLCBsZW4pOwogICAgICAgICB1aW50OF90ICpkYXRhID0gc3RhdGljX2Nhc3Q8dWludDhfdCAqPihtYnVmLT5kYXRhKCkpOwogICAgICAgICBpZiAodHJhY2tJbmZvLT5tSGVhZGVyKSB7CiAgICAgICAgICAgICBtZW1jcHkoZGF0YSwgdHJhY2tJbmZvLT5tSGVhZGVyLCB0cmFja0luZm8tPm1IZWFkZXJMZW4pOwogICAgICAgICB9CiAKLSAgICAgICAgbWJ1Zi0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7Ci0gICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgYmxvY2stPklzS2V5KCkpOworICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBtYnVmLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdGltZVVzKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgYmxvY2stPklzS2V5KCkpOwogCiAgICAgICAgIHN0YXR1c190IGVyciA9IGZyYW1lLlJlYWQobUV4dHJhY3Rvci0+bVJlYWRlciwgZGF0YSArIHRyYWNrSW5mby0+bUhlYWRlckxlbik7CiAgICAgICAgIGlmIChlcnIgPT0gT0sKQEAgLTc1Miw3ICs3NTEsNyBAQAogCiAgICAgICAgICAgICBtQmxvY2tJdGVyLmFkdmFuY2UoKTsKICAgICAgICAgICAgIG1idWYtPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgIH0KIAogICAgICAgICBtUGVuZGluZ0ZyYW1lcy5wdXNoX2JhY2sobWJ1Zik7CkBAIC03NjAsMTEgKzc1OSwxMSBAQAogCiAgICAgbUJsb2NrSXRlci5hZHZhbmNlKCk7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKK21lZGlhX3N0YXR1c190IE1hdHJvc2thU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICAqb3V0ID0gTlVMTDsKIAogICAgIGludDY0X3QgdGFyZ2V0U2FtcGxlVGltZVVzID0gLTFsbDsKQEAgLTc3Myw3ICs3NzIsNyBAQAogICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwogICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CiAgICAgICAgIGlmIChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX0ZSQU1FX0lOREVYKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFtRXh0cmFjdG9yLT5pc0xpdmVTdHJlYW1pbmcoKSkgewpAQCAtNzkxLDcgKzc5MCw3IEBACiAgICAgfQogCiAgICAgd2hpbGUgKG1QZW5kaW5nRnJhbWVzLmVtcHR5KCkpIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVhZEJsb2NrKCk7CisgICAgICAgIG1lZGlhX3N0YXR1c190IGVyciA9IHJlYWRCbG9jaygpOwogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIGNsZWFyUGVuZGluZ0ZyYW1lcygpOwpAQCAtODAwLDE4ICs3OTksMTggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIE1lZGlhQnVmZmVyQmFzZSAqZnJhbWUgPSAqbVBlbmRpbmdGcmFtZXMuYmVnaW4oKTsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqZnJhbWUgPSAqbVBlbmRpbmdGcmFtZXMuYmVnaW4oKTsKICAgICBtUGVuZGluZ0ZyYW1lcy5lcmFzZShtUGVuZGluZ0ZyYW1lcy5iZWdpbigpKTsKIAogICAgIGlmICgobVR5cGUgIT0gQVZDICYmIG1UeXBlICE9IEhFVkMpIHx8IG1OQUxTaXplTGVuID09IDApIHsKICAgICAgICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwbGwpIHsKLSAgICAgICAgICAgIGZyYW1lLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAga0tleVRhcmdldFRpbWUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoZnJhbWUtPm1ldGFfZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FLCB0YXJnZXRTYW1wbGVUaW1lVXMpOwogICAgICAgICB9CiAKICAgICAgICAgKm91dCA9IGZyYW1lOwogCi0gICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKICAgICB9CiAKICAgICAvLyBFYWNoIGlucHV0IGZyYW1lIGNvbnRhaW5zIG9uZSBvciBtb3JlIE5BTCBmcmFnbWVudHMsIGVhY2ggZnJhZ21lbnQKQEAgLTgyOSw3ICs4MjgsNyBAQAogICAgIHNpemVfdCBzcmNTaXplID0gZnJhbWUtPnJhbmdlX2xlbmd0aCgpOwogCiAgICAgc2l6ZV90IGRzdFNpemUgPSAwOwotICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyID0gTlVMTDsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyID0gTlVMTDsKICAgICB1aW50OF90ICpkc3RQdHIgPSBOVUxMOwogCiAgICAgZm9yIChpbnQzMl90IHBhc3MgPSAwOyBwYXNzIDwgMjsgKytwYXNzKSB7CkBAIC04NTAsNyArODQ5LDcgQEAKICAgICAgICAgICAgICAgICBmcmFtZS0+cmVsZWFzZSgpOwogICAgICAgICAgICAgICAgIGZyYW1lID0gTlVMTDsKIAotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHNyY09mZnNldCArIG1OQUxTaXplTGVuICsgTkFMc2l6ZSA+IHNyY1NpemUpIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTg3OCw3ICs4NzcsNyBAQAogICAgICAgICAgICAgZnJhbWUtPnJlbGVhc2UoKTsKICAgICAgICAgICAgIGZyYW1lID0gTlVMTDsKIAotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHBhc3MgPT0gMCkgewpAQCAtODg5LDE2ICs4ODgsMjAgQEAKICAgICAgICAgICAgICAgICAvLyBlYWNoIDQtYnl0ZSBuYWwgc2l6ZSB3aXRoIGEgNC1ieXRlIHN0YXJ0IGNvZGUKICAgICAgICAgICAgICAgICBidWZmZXIgPSBmcmFtZTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyID0gTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUoZHN0U2l6ZSk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXIsIGZhbHNlIC8qIG5vbmJsb2NraW5nICovLCBkc3RTaXplIC8qIHJlcXVlc3RlZCBzaXplICovKTsKKyAgICAgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCBkc3RTaXplKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICpmcmFtZU1ldGEgPSBmcmFtZS0+bWV0YV9kYXRhKCk7CiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKLSAgICAgICAgICAgIENIRUNLKGZyYW1lLT5tZXRhX2RhdGEoKS5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKKyAgICAgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQ2NChmcmFtZU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgJnRpbWVVcykpOwogICAgICAgICAgICAgaW50MzJfdCBpc1N5bmM7Ci0gICAgICAgICAgICBDSEVDSyhmcmFtZS0+bWV0YV9kYXRhKCkuZmluZEludDMyKGtLZXlJc1N5bmNGcmFtZSwgJmlzU3luYykpOworICAgICAgICAgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDMyKGZyYW1lTWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAmaXNTeW5jKSk7CiAKLSAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7Ci0gICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgaXNTeW5jKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqYnVmTWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmTWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCB0aW1lVXMpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zk1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgaXNTeW5jKTsKIAogICAgICAgICAgICAgZHN0UHRyID0gKHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKTsKICAgICAgICAgfQpAQCAtOTEwLDE4ICs5MTMsMTggQEAKICAgICB9CiAKICAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDBsbCkgewotICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgIGtLZXlUYXJnZXRUaW1lLCB0YXJnZXRTYW1wbGVUaW1lVXMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmZmVyLT5tZXRhX2RhdGEoKSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FLCB0YXJnZXRTYW1wbGVUaW1lVXMpOwogICAgIH0KIAogICAgICpvdXQgPSBidWZmZXI7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotTWF0cm9za2FFeHRyYWN0b3I6Ok1hdHJvc2thRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCitNYXRyb3NrYUV4dHJhY3Rvcjo6TWF0cm9za2FFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1SZWFkZXIobmV3IERhdGFTb3VyY2VCYXNlUmVhZGVyKG1EYXRhU291cmNlKSksCiAgICAgICBtU2VnbWVudChOVUxMKSwKQEAgLTk5NCwxMyArOTk3LDE1IEBACiAKICAgICBkZWxldGUgbVJlYWRlcjsKICAgICBtUmVhZGVyID0gTlVMTDsKKworICAgIGRlbGV0ZSBtRGF0YVNvdXJjZTsKIH0KIAogc2l6ZV90IE1hdHJvc2thRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKICAgICByZXR1cm4gbVRyYWNrcy5zaXplKCk7CiB9CiAKLU1lZGlhVHJhY2sgKk1hdHJvc2thRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKK01lZGlhVHJhY2tIZWxwZXIgKk1hdHJvc2thRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKICAgICBpZiAoaW5kZXggPj0gbVRyYWNrcy5zaXplKCkpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMTAwOCwxMSArMTAxMywxMSBAQAogICAgIHJldHVybiBuZXcgTWF0cm9za2FTb3VyY2UodGhpcywgaW5kZXgpOwogfQogCi1zdGF0dXNfdCBNYXRyb3NrYUV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorbWVkaWFfc3RhdHVzX3QgTWF0cm9za2FFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncykgewogICAgIGlmIChpbmRleCA+PSBtVHJhY2tzLnNpemUoKSkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAogICAgIGlmICgoZmxhZ3MgJiBrSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhKSAmJiAhbUV4dHJhY3RlZFRodW1ibmFpbHMKQEAgLTEwMjEsOCArMTAyNiw3IEBACiAgICAgICAgIG1FeHRyYWN0ZWRUaHVtYm5haWxzID0gdHJ1ZTsKICAgICB9CiAKLSAgICBtZXRhID0gbVRyYWNrcy5pdGVtQXQoaW5kZXgpLm1NZXRhOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbVRyYWNrcy5pdGVtQXQoaW5kZXgpLm1NZXRhKTsKIH0KIAogYm9vbCBNYXRyb3NrYUV4dHJhY3Rvcjo6aXNMaXZlU3RyZWFtaW5nKCkgY29uc3QgewpAQCAtMTA1Nyw3ICsxMDYxLDcgQEAKIH0KIAogc3RhdGljIHZvaWQgYWRkRVNEU0Zyb21Db2RlY1ByaXZhdGUoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBib29sIGlzQXVkaW8sIGNvbnN0IHZvaWQgKnByaXYsIHNpemVfdCBwcml2U2l6ZSkgewogCiAgICAgaW50IHByaXZTaXplQnl0ZXNSZXF1aXJlZCA9IGJ5dGVzRm9yU2l6ZShwcml2U2l6ZSk7CkBAIC0xMDg1LDE0ICsxMDg5LDE0IEBACiAgICAgc3RvcmVTaXplKGVzZHMsIGlkeCwgcHJpdlNpemUpOwogICAgIG1lbWNweShlc2RzICsgaWR4LCBwcml2LCBwcml2U2l6ZSk7CiAKLSAgICBtZXRhLnNldERhdGEoa0tleUVTRFMsIDAsIGVzZHMsIGVzZHNTaXplKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIHByaXYsIHByaXZTaXplKTsKIAogICAgIGRlbGV0ZVtdIGVzZHM7CiAgICAgZXNkcyA9IE5VTEw7CiB9CiAKIHN0YXR1c190IGFkZFZvcmJpc0NvZGVjSW5mbygKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIGNvbnN0IHZvaWQgKl9jb2RlY1ByaXZhdGUsIHNpemVfdCBjb2RlY1ByaXZhdGVTaXplKSB7CiAgICAgLy8gaGV4ZHVtcChfY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKIApAQCAtMTE1MCw3ICsxMTU0LDggQEAKICAgICBpZiAoY29kZWNQcml2YXRlW29mZnNldF0gIT0gMHgwMSkgewogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KLSAgICBtZXRhLnNldERhdGEoa0tleVZvcmJpc0luZm8sIDAsICZjb2RlY1ByaXZhdGVbb2Zmc2V0XSwgbGVuMSk7CisgICAgLy8gZm9ybWVybHkga0tleVZvcmJpc0luZm8KKyAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsICZjb2RlY1ByaXZhdGVbb2Zmc2V0XSwgbGVuMSk7CiAKICAgICBvZmZzZXQgKz0gbGVuMTsKICAgICBpZiAoY29kZWNQcml2YXRlW29mZnNldF0gIT0gMHgwMykgewpAQCAtMTE2MiwxOSArMTE2NywyMCBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotICAgIG1ldGEuc2V0RGF0YSgKLSAgICAgICAgICAgIGtLZXlWb3JiaXNCb29rcywgMCwgJmNvZGVjUHJpdmF0ZVtvZmZzZXRdLAotICAgICAgICAgICAgY29kZWNQcml2YXRlU2l6ZSAtIG9mZnNldCk7CisgICAgLy8gZm9ybWVybHkga0tleVZvcmJpc0Jvb2tzCisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8xLAorICAgICAgICAgICAgJmNvZGVjUHJpdmF0ZVtvZmZzZXRdLCBjb2RlY1ByaXZhdGVTaXplIC0gb2Zmc2V0KTsKIAogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdGljIHN0YXR1c190IGFkZEZsYWNNZXRhZGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIGNvbnN0IHZvaWQgKmNvZGVjUHJpdmF0ZSwgc2l6ZV90IGNvZGVjUHJpdmF0ZVNpemUpIHsKICAgICAvLyBoZXhkdW1wKGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CiAKLSAgICBtZXRhLnNldERhdGEoa0tleUZsYWNNZXRhZGF0YSwgMCwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAvLyBmb3JtZXJseSBrS2V5RmxhY01ldGFkYXRhCisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOwogCiAgICAgaW50MzJfdCBtYXhJbnB1dFNpemUgPSA2NCA8PCAxMDsKICAgICBGTEFDRGVjb2RlciAqZmxhY0RlY29kZXIgPSBGTEFDRGVjb2Rlcjo6Q3JlYXRlKCk7CkBAIC0xMTk2LDcgKzEyMDIsNyBAQAogICAgICAgICAgICAgICAgICogc3RyZWFtSW5mby5tYXhfYmxvY2tzaXplICogc3RyZWFtSW5mby5jaGFubmVsczsKICAgICAgICAgfQogICAgIH0KLSAgICBtZXRhLnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIG1heElucHV0U2l6ZSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsIG1heElucHV0U2l6ZSk7CiAKICAgICBkZWxldGUgZmxhY0RlY29kZXI7CiAgICAgcmV0dXJuIE9LOwpAQCAtMTIyNSw3ICsxMjMxLDcgQEAKICAgICB9CiAKICAgICAvLyBPdmVycmlkZSB0aGUgc3ludGhlc2l6ZWQgbmFsIGxlbmd0aCBzaXplLCB3aGljaCBpcyBhcmJpdHJhcnkKLSAgICB0cmFja0luZm8tPm1NZXRhLnNldEludDMyKGtLZXlOYWxMZW5ndGhTaXplLCAwKTsKKyAgICB0cmFja0luZm8tPm1OYWxMZW5ndGhTaXplID0gMDsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTEyNDcsNyArMTI1Myw3IEBACiB9CiAKIHZvaWQgTWF0cm9za2FFeHRyYWN0b3I6OmdldENvbG9ySW5mb3JtYXRpb24oCi0gICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6VmlkZW9UcmFjayAqdnRyYWNrLCBNZXRhRGF0YUJhc2UgJm1ldGEpIHsKKyAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpWaWRlb1RyYWNrICp2dHJhY2ssIEFNZWRpYUZvcm1hdCAqbWV0YSkgewogICAgIGNvbnN0IG1rdnBhcnNlcjo6Q29sb3VyICpjb2xvciA9IHZ0cmFjay0+R2V0Q29sb3VyKCk7CiAgICAgaWYgKGNvbG9yID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtMTI1Niw3ICsxMjYyLDcgQEAKICAgICAvLyBDb2xvciBBc3BlY3RzCiAgICAgewogICAgICAgICBpbnQzMl90IHByaW1hcmllcyA9IDI7IC8vIElTTyB1bnNwZWNpZmllZAotICAgICAgICBpbnQzMl90IHRyYW5zZmVyID0gMjsgLy8gSVNPIHVuc3BlY2lmaWVkCisgICAgICAgIGludDMyX3QgaXNvdHJhbnNmZXIgPSAyOyAvLyBJU08gdW5zcGVjaWZpZWQKICAgICAgICAgaW50MzJfdCBjb2VmZnMgPSAyOyAvLyBJU08gdW5zcGVjaWZpZWQKICAgICAgICAgYm9vbCBmdWxsUmFuZ2UgPSBmYWxzZTsgLy8gZGVmYXVsdAogICAgICAgICBib29sIHJhbmdlU3BlY2lmaWVkID0gZmFsc2U7CkBAIC0xMjY1LDcgKzEyNzEsNyBAQAogICAgICAgICAgICAgcHJpbWFyaWVzID0gY29sb3ItPnByaW1hcmllczsKICAgICAgICAgfQogICAgICAgICBpZiAoaXNWYWxpZEludDMyQ29sb3VyVmFsdWUoY29sb3ItPnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljcykpIHsKLSAgICAgICAgICAgIHRyYW5zZmVyID0gY29sb3ItPnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljczsKKyAgICAgICAgICAgIGlzb3RyYW5zZmVyID0gY29sb3ItPnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljczsKICAgICAgICAgfQogICAgICAgICBpZiAoaXNWYWxpZEludDMyQ29sb3VyVmFsdWUoY29sb3ItPm1hdHJpeF9jb2VmZmljaWVudHMpKSB7CiAgICAgICAgICAgICBjb2VmZnMgPSBjb2xvci0+bWF0cml4X2NvZWZmaWNpZW50czsKQEAgLTEyNzgsMTQgKzEyODQsMjEgQEAKICAgICAgICAgICAgIHJhbmdlU3BlY2lmaWVkID0gdHJ1ZTsKICAgICAgICAgfQogCi0gICAgICAgIENvbG9yQXNwZWN0cyBhc3BlY3RzOwotICAgICAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMoCi0gICAgICAgICAgICAgICAgcHJpbWFyaWVzLCB0cmFuc2ZlciwgY29lZmZzLCBmdWxsUmFuZ2UsIGFzcGVjdHMpOwotICAgICAgICBtZXRhLnNldEludDMyKGtLZXlDb2xvclByaW1hcmllcywgYXNwZWN0cy5tUHJpbWFyaWVzKTsKLSAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5VHJhbnNmZXJGdW5jdGlvbiwgYXNwZWN0cy5tVHJhbnNmZXIpOwotICAgICAgICBtZXRhLnNldEludDMyKGtLZXlDb2xvck1hdHJpeCwgYXNwZWN0cy5tTWF0cml4Q29lZmZzKTsKLSAgICAgICAgbWV0YS5zZXRJbnQzMigKLSAgICAgICAgICAgICAgICBrS2V5Q29sb3JSYW5nZSwgcmFuZ2VTcGVjaWZpZWQgPyBhc3BlY3RzLm1SYW5nZSA6IENvbG9yQXNwZWN0czo6UmFuZ2VVbnNwZWNpZmllZCk7CisgICAgICAgIGludDMyX3QgcmFuZ2UgPSAwOworICAgICAgICBpbnQzMl90IHN0YW5kYXJkID0gMDsKKyAgICAgICAgaW50MzJfdCB0cmFuc2ZlciA9IDA7CisgICAgICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb1BsYXRmb3JtQXNwZWN0cygKKyAgICAgICAgICAgICAgICBwcmltYXJpZXMsIGlzb3RyYW5zZmVyLCBjb2VmZnMsIGZ1bGxSYW5nZSwKKyAgICAgICAgICAgICAgICAmcmFuZ2UsICZzdGFuZGFyZCwgJnRyYW5zZmVyKTsKKyAgICAgICAgaWYgKHJhbmdlICE9IDApIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1JBTkdFLCByYW5nZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YW5kYXJkICE9IDApIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1NUQU5EQVJELCBzdGFuZGFyZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRyYW5zZmVyICE9IDApIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1RSQU5TRkVSLCB0cmFuc2Zlcik7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBIRFIgU3RhdGljIEluZm8KQEAgLTEzMjksMjYgKzEzNDIsMjggQEAKICAgICAgICAgLy8gT25seSBhZHZlcnRpc2Ugc3RhdGljIGluZm8gaWYgYXQgbGVhc3Qgb25lIG9mIHRoZSBncm91cHMgaGF2ZSBiZWVuIHNwZWNpZmllZC4KICAgICAgICAgaWYgKG1lbWNtcCgmaW5mbywgJm51bGxJbmZvLCBzaXplb2YoaW5mbykpICE9IDApIHsKICAgICAgICAgICAgIGluZm8ubUlEID0gSERSU3RhdGljSW5mbzo6a1R5cGUxOwotICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlIZHJTdGF0aWNJbmZvLCAnaGRyUycsICZpbmZvLCBzaXplb2YoaW5mbykpOworICAgICAgICAgICAgQ29sb3JVdGlsczo6c2V0SERSU3RhdGljSW5mb0ludG9BTWVkaWFGb3JtYXQoaW5mbywgbWV0YSk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKIHN0YXR1c190IE1hdHJvc2thRXh0cmFjdG9yOjppbml0VHJhY2tJbmZvKAotICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrICp0cmFjaywgTWV0YURhdGFCYXNlICZtZXRhLCBUcmFja0luZm8gKnRyYWNrSW5mbykgeworICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrICp0cmFjaywgQU1lZGlhRm9ybWF0ICptZXRhLCBUcmFja0luZm8gKnRyYWNrSW5mbykgewogICAgIHRyYWNrSW5mby0+bVRyYWNrTnVtID0gdHJhY2stPkdldE51bWJlcigpOwogICAgIHRyYWNrSW5mby0+bU1ldGEgPSBtZXRhOwogICAgIHRyYWNrSW5mby0+bUV4dHJhY3RvciA9IHRoaXM7CiAgICAgdHJhY2tJbmZvLT5tRW5jcnlwdGVkID0gZmFsc2U7CiAgICAgdHJhY2tJbmZvLT5tSGVhZGVyID0gTlVMTDsKICAgICB0cmFja0luZm8tPm1IZWFkZXJMZW4gPSAwOworICAgIHRyYWNrSW5mby0+bU5hbExlbmd0aFNpemUgPSAtMTsKIAogICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCB0cmFjay0+R2V0Q29udGVudEVuY29kaW5nQ291bnQoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q29udGVudEVuY29kaW5nICplbmNvZGluZyA9IHRyYWNrLT5HZXRDb250ZW50RW5jb2RpbmdCeUluZGV4KGkpOwogICAgICAgICBmb3Ioc2l6ZV90IGogPSAwOyBqIDwgZW5jb2RpbmctPkdldEVuY3J5cHRpb25Db3VudCgpOyBqKyspIHsKICAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q29udGVudEVuY29kaW5nOjpDb250ZW50RW5jcnlwdGlvbiAqZW5jcnlwdGlvbjsKICAgICAgICAgICAgIGVuY3J5cHRpb24gPSBlbmNvZGluZy0+R2V0RW5jcnlwdGlvbkJ5SW5kZXgoaik7Ci0gICAgICAgICAgICB0cmFja0luZm8tPm1NZXRhLnNldERhdGEoa0tleUNyeXB0b0tleSwgMCwgZW5jcnlwdGlvbi0+a2V5X2lkLCBlbmNyeXB0aW9uLT5rZXlfaWRfbGVuKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIodHJhY2tJbmZvLT5tTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fS0VZLCBlbmNyeXB0aW9uLT5rZXlfaWQsIGVuY3J5cHRpb24tPmtleV9pZF9sZW4pOwogICAgICAgICAgICAgdHJhY2tJbmZvLT5tRW5jcnlwdGVkID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xMzk3LDkgKzE0MTIsMTAgQEAKIAogICAgICAgICBlbnVtIHsgVklERU9fVFJBQ0sgPSAxLCBBVURJT19UUkFDSyA9IDIgfTsKIAotICAgICAgICBNZXRhRGF0YUJhc2UgbWV0YTsKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOwogCiAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworICAgICAgICBpbnQzMl90IG5hbFNpemUgPSAtMTsKIAogICAgICAgICBzd2l0Y2ggKHRyYWNrLT5HZXRUeXBlKCkpIHsKICAgICAgICAgICAgIGNhc2UgVklERU9fVFJBQ0s6CkBAIC0xNDA4LDIwICsxNDI0LDI4IEBACiAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IG1rdnBhcnNlcjo6VmlkZW9UcmFjayAqPih0cmFjayk7CiAKICAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcCgiVl9NUEVHNC9JU08vQVZDIiwgY29kZWNJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlBVkNDLCAwLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZWNQcml2YXRlU2l6ZSA+IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbFNpemUgPSAxICsgKGNvZGVjUHJpdmF0ZVs0XSAmIDMpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJWX01QRUdIL0lTTy9IRVZDIiwgY29kZWNJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjUHJpdmF0ZVNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleUhWQ0MsIGtUeXBlSFZDQywgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF9IRVZDLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjUHJpdmF0ZVNpemUgPiAxNCArIDcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYWxTaXplID0gMSArIChjb2RlY1ByaXZhdGVbMTQgKyA3XSAmIDMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIkhFVkMgaXMgZGV0ZWN0ZWQsIGJ1dCBkb2VzIG5vdCBoYXZlIGNvbmZpZ3VyYXRpb24uIik7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiVl9NUEVHNC9JU08vQVNQIiwgY29kZWNJRCkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjUHJpdmF0ZVNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVTRFNGcm9tQ29kZWNQcml2YXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCBmYWxzZSwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTE0MzAsMTYgKzE0NTQsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJWX1ZQOCIsIGNvZGVjSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9WSURFT19WUDgpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiVl9WUDkiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19WUDkpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfVklERU9fVlA5KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjUHJpdmF0ZVNpemUgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgLy8gJ2NzZC0wJyBmb3IgVlA5IGlzIHRoZSBCbG9iIG9mIENvZGVjIFByaXZhdGUgZGF0YSBhcwogICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCBpbiBodHRwOi8vd3d3LndlYm1wcm9qZWN0Lm9yZy92cDkvcHJvZmlsZXMvLgotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXREYXRhKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleVZwOUNvZGVjUHJpdmF0ZSwgMCwgY29kZWNQcml2YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJWX0FWMSIsIGNvZGVjSUQpKSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVjEpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBpcyBub3Qgc3VwcG9ydGVkLiIsIGNvZGVjSUQpOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTE0NTUsOCArMTQ4MCw4IEBACiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJ0cmFjayBoZWlnaHQgZXhjZWVkcyBpbnQzMl90LCAlbGxkIiwgaGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleVdpZHRoLCAoaW50MzJfdCl3aWR0aCk7Ci0gICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5SGVpZ2h0LCAoaW50MzJfdCloZWlnaHQpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCAoaW50MzJfdCl3aWR0aCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULCAoaW50MzJfdCloZWlnaHQpOwogCiAgICAgICAgICAgICAgICAgLy8gc2V0dGluZyBkaXNwbGF5IHdpZHRoL2hlaWdodCBpcyBvcHRpb25hbAogICAgICAgICAgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBkaXNwbGF5VW5pdCA9IHZ0cmFjay0+R2V0RGlzcGxheVVuaXQoKTsKQEAgLTE0NjYsOCArMTQ5MSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGlzcGxheUhlaWdodCA+IDAgJiYgZGlzcGxheUhlaWdodCA8PSBJTlQzMl9NQVgpIHsKICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChkaXNwbGF5VW5pdCkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IC8vIHBpeGVscwotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5RGlzcGxheVdpZHRoLCAoaW50MzJfdClkaXNwbGF5V2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5RGlzcGxheUhlaWdodCwgKGludDMyX3QpZGlzcGxheUhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX1dJRFRILCAoaW50MzJfdClkaXNwbGF5V2lkdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9IRUlHSFQsIChpbnQzMl90KWRpc3BsYXlIZWlnaHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogLy8gY2VudGltZXRlcnMKICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiAvLyBpbmNoZXMKQEAgLTE0ODEsOCArMTUwOCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9uZyBsb25nIGNvbXB1dGVkSGVpZ2h0ID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXgoaGVpZ2h0LCB3aWR0aCAqIGRpc3BsYXlIZWlnaHQgLyBkaXNwbGF5V2lkdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXB1dGVkV2lkdGggPD0gSU5UMzJfTUFYICYmIGNvbXB1dGVkSGVpZ2h0IDw9IElOVDMyX01BWCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleURpc3BsYXlXaWR0aCwgKGludDMyX3QpY29tcHV0ZWRXaWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5RGlzcGxheUhlaWdodCwgKGludDMyX3QpY29tcHV0ZWRIZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX1dJRFRILCAoaW50MzJfdCljb21wdXRlZFdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9IRUlHSFQsIChpbnQzMl90KWNvbXB1dGVkSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0xNTAyLDM0ICsxNTMxLDM5IEBACiAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IG1rdnBhcnNlcjo6QXVkaW9UcmFjayAqPih0cmFjayk7CiAKICAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcCgiQV9BQUMiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soY29kZWNQcml2YXRlU2l6ZSA+PSAyKTsKIAogICAgICAgICAgICAgICAgICAgICBhZGRFU0RTRnJvbUNvZGVjUHJpdmF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCB0cnVlLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiQV9WT1JCSVMiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKTsKIAogICAgICAgICAgICAgICAgICAgICBlcnIgPSBhZGRWb3JiaXNDb2RlY0luZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIkFfT1BVUyIsIGNvZGVjSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMpOwotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleU9wdXNIZWFkZXIsIDAsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50NjQoa0tleU9wdXNDb2RlY0RlbGF5LCB0cmFjay0+R2V0Q29kZWNEZWxheSgpKTsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQ2NChrS2V5T3B1c1NlZWtQcmVSb2xsLCB0cmFjay0+R2V0U2Vla1ByZVJvbGwoKSk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjb2RlY0RlbGF5ID0gdHJhY2stPkdldENvZGVjRGVsYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzEsICZjb2RlY0RlbGF5LCBzaXplb2YoY29kZWNEZWxheSkpOwogICAgICAgICAgICAgICAgICAgICBtU2Vla1ByZVJvbGxOcyA9IHRyYWNrLT5HZXRTZWVrUHJlUm9sbCgpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMiwgJm1TZWVrUHJlUm9sbE5zLCBzaXplb2YobVNlZWtQcmVSb2xsTnMpKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIkFfTVBFRy9MMyIsIGNvZGVjSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRyk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJBX0ZMQUMiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpOwogICAgICAgICAgICAgICAgICAgICBlcnIgPSBhZGRGbGFjTWV0YWRhdGEobWV0YSwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMgaXMgbm90IHN1cHBvcnRlZC4iLCBjb2RlY0lEKTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgYXRyYWNrLT5HZXRTYW1wbGluZ1JhdGUoKSk7Ci0gICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBhdHJhY2stPkdldENoYW5uZWxzKCkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBhdHJhY2stPkdldFNhbXBsaW5nUmF0ZSgpKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBhdHJhY2stPkdldENoYW5uZWxzKCkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC0xNTQyLDcgKzE1NzYsNyBAQAogICAgICAgICAgICBjaGFyIGxhbmdbNF07CiAgICAgICAgICAgIHN0cm5jcHkobGFuZywgbGFuZ3VhZ2UsIDMpOwogICAgICAgICAgICBsYW5nWzNdID0gJ1wwJzsKLSAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNZWRpYUxhbmd1YWdlLCBsYW5nKTsKKyAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0xBTkdVQUdFLCBsYW5nKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTE1NTEsMTIgKzE1ODUsMTMgQEAKICAgICAgICAgfQogCiAgICAgICAgIGxvbmcgbG9uZyBkdXJhdGlvbk5zID0gbVNlZ21lbnQtPkdldER1cmF0aW9uKCk7Ci0gICAgICAgIG1ldGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCAoZHVyYXRpb25OcyArIDUwMCkgLyAxMDAwKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIChkdXJhdGlvbk5zICsgNTAwKSAvIDEwMDApOwogCiAgICAgICAgIG1UcmFja3MucHVzaCgpOwogICAgICAgICBzaXplX3QgbiA9IG1UcmFja3Muc2l6ZSgpIC0gMTsKICAgICAgICAgVHJhY2tJbmZvICp0cmFja0luZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KG4pOwogICAgICAgICBpbml0VHJhY2tJbmZvKHRyYWNrLCBtZXRhLCB0cmFja0luZm8pOworICAgICAgICB0cmFja0luZm8tPm1OYWxMZW5ndGhTaXplID0gbmFsU2l6ZTsKIAogICAgICAgICBpZiAoIXN0cmNtcCgiVl9NUEVHNC9JU08vQVZDIiwgY29kZWNJRCkgJiYgY29kZWNQcml2YXRlU2l6ZSA9PSAwKSB7CiAgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIHJlY292ZXIgZnJvbSBBVkMgdHJhY2sgd2l0aG91dCBjb2RlYyBwcml2YXRlIGRhdGEKQEAgLTE1NzMsNyArMTYwOCw3IEBACiAgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQoaSk7CiAKICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgQ0hFQ0soaW5mby0+bU1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKGluZm8tPm1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKSk7CiAKICAgICAgICAgaWYgKHN0cm5jYXNlY21wKG1pbWUsICJ2aWRlby8iLCA2KSkgewogICAgICAgICAgICAgY29udGludWU7CkBAIC0xNTk5LDE2ICsxNjM0LDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpdGVyLmFkdmFuY2UoKTsKICAgICAgICAgfQotICAgICAgICBpbmZvLT5tTWV0YS5zZXRJbnQ2NChrS2V5VGh1bWJuYWlsVGltZSwgdGh1bWJuYWlsVGltZVVzKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGluZm8tPm1NZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1RJTUUsIHRodW1ibmFpbFRpbWVVcyk7CiAgICAgfQogfQogCi1zdGF0dXNfdCBNYXRyb3NrYUV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7Ci0gICAgbWV0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAga0tleU1JTUVUeXBlLAotICAgICAgICAgICAgbUlzV2VibSA/ICJ2aWRlby93ZWJtIiA6IE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NQVRST1NLQSk7CittZWRpYV9zdGF0dXNfdCBNYXRyb3NrYUV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBtSXNXZWJtID8gInZpZGVvL3dlYm0iIDogTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01BVFJPU0tBKTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiB1aW50MzJfdCBNYXRyb3NrYUV4dHJhY3Rvcjo6ZmxhZ3MoKSBjb25zdCB7CkBAIC0xNjIxLDcgKzE2NTYsNyBAQAogfQogCiBib29sIFNuaWZmTWF0cm9za2EoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKICAgICBEYXRhU291cmNlQmFzZVJlYWRlciByZWFkZXIoc291cmNlKTsKICAgICBta3ZwYXJzZXI6OkVCTUxIZWFkZXIgZWJtbEhlYWRlcjsKICAgICBsb25nIGxvbmcgcG9zOwpAQCAtMTYzNCwyOCArMTY2OSw0MCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCitzdGF0aWMgY29uc3QgY2hhciAqZXh0ZW5zaW9uc1tdID0geworICAgICJta2EiLAorICAgICJta3YiLAorICAgICJ3ZWJtIiwKKyAgICBOVUxMCit9OwogCiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OLAogICAgICAgICBVVUlEKCJhYmJlZGQ5Mi0zOGM0LTQ5MDQtYTRjMS1iM2Y0NWY4OTk5ODAiKSwKICAgICAgICAgMSwKICAgICAgICAgIk1hdHJvc2thIEV4dHJhY3RvciIsCi0gICAgICAgIFtdKAotICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCi0gICAgICAgICAgICAgICAgdm9pZCAqKiwKLSAgICAgICAgICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICopIC0+IE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyB7Ci0gICAgICAgICAgICBpZiAoU25pZmZNYXRyb3NrYShzb3VyY2UsIGNvbmZpZGVuY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFtdKAotICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gTWVkaWFFeHRyYWN0b3IqIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNYXRyb3NrYUV4dHJhY3Rvcihzb3VyY2UpO307CisgICAgICAgIHsKKyAgICAgICAgICAgIC52MyA9IHsKKyAgICAgICAgICAgICAgICBbXSgKKyAgICAgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKiosCisgICAgICAgICAgICAgICAgICAgIEZyZWVNZXRhRnVuYyAqKSAtPiBDcmVhdG9yRnVuYyB7CisgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKHNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChTbmlmZk1hdHJvc2thKCZoZWxwZXIsIGNvbmZpZGVuY2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW10oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gQ01lZGlhRXh0cmFjdG9yKiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAobmV3IE1hdHJvc2thRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKHNvdXJjZSkpKTt9OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KICAgICB9OwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmgKaW5kZXggMzU2OGVhMS4uMzg3MWJkZiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5oCkBAIC0yMCw4ICsyMCw5IEBACiAKICNpbmNsdWRlICJta3ZwYXJzZXIvbWt2cGFyc2VyLmgiCiAKLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KIApAQCAtMzQsMTYgKzM1LDE2IEBACiBzdHJ1Y3QgRGF0YVNvdXJjZUJhc2VSZWFkZXI7CiBzdHJ1Y3QgTWF0cm9za2FTb3VyY2U7CiAKLXN0cnVjdCBNYXRyb3NrYUV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7Ci0gICAgZXhwbGljaXQgTWF0cm9za2FFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CitzdHJ1Y3QgTWF0cm9za2FFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgeworICAgIGV4cGxpY2l0IE1hdHJvc2thRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwogCi0gICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgTWVkaWFUcmFja0hlbHBlciAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKIAogICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKIApAQCAtNTcsOSArNTgsMTcgQEAKICAgICBmcmllbmQgc3RydWN0IEJsb2NrSXRlcmF0b3I7CiAKICAgICBzdHJ1Y3QgVHJhY2tJbmZvIHsKKyAgICAgICAgVHJhY2tJbmZvKCkgeworICAgICAgICAgICAgbU1ldGEgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIH5UcmFja0luZm8oKSB7CisgICAgICAgICAgICBpZiAobU1ldGEpIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1NZXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICB1bnNpZ25lZCBsb25nIG1UcmFja051bTsKICAgICAgICAgYm9vbCBtRW5jcnlwdGVkOwotICAgICAgICBNZXRhRGF0YUJhc2UgbU1ldGE7CisgICAgICAgIEFNZWRpYUZvcm1hdCAqbU1ldGE7CiAgICAgICAgIGNvbnN0IE1hdHJvc2thRXh0cmFjdG9yICptRXh0cmFjdG9yOwogICAgICAgICBWZWN0b3I8Y29uc3QgbWt2cGFyc2VyOjpDdWVQb2ludCo+IG1DdWVQb2ludHM7CiAKQEAgLTY4LDYgKzc3LDcgQEAKICAgICAgICAgLy8gaW4gfk1hdHJvc2thRXh0cmFjdG9yLgogICAgICAgICB1bnNpZ25lZCBjaGFyICptSGVhZGVyOwogICAgICAgICBzaXplX3QgbUhlYWRlckxlbjsKKyAgICAgICAgaW50MzJfdCBtTmFsTGVuZ3RoU2l6ZTsKIAogICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrKiBnZXRUcmFjaygpIGNvbnN0OwogICAgICAgICBjb25zdCBta3ZwYXJzZXI6OkN1ZVBvaW50OjpUcmFja1Bvc2l0aW9uICpmaW5kKGxvbmcgbG9uZyB0aW1lTnMpIGNvbnN0OwpAQCAtNzYsNyArODYsNyBAQAogICAgIE11dGV4IG1Mb2NrOwogICAgIFZlY3RvcjxUcmFja0luZm8+IG1UcmFja3M7CiAKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAgICAgRGF0YVNvdXJjZUJhc2VSZWFkZXIgKm1SZWFkZXI7CiAgICAgbWt2cGFyc2VyOjpTZWdtZW50ICptU2VnbWVudDsKICAgICBib29sIG1FeHRyYWN0ZWRUaHVtYm5haWxzOwpAQCAtODcsMTMgKzk3LDEzIEBACiAgICAgc3RhdHVzX3Qgc3ludGhlc2l6ZUFWQ0MoVHJhY2tJbmZvICp0cmFja0luZm8sIHNpemVfdCBpbmRleCk7CiAgICAgc3RhdHVzX3QgaW5pdFRyYWNrSW5mbygKICAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6VHJhY2sgKnRyYWNrLAotICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICAgICAgVHJhY2tJbmZvICp0cmFja0luZm8pOwogICAgIHZvaWQgYWRkVHJhY2tzKCk7CiAgICAgdm9pZCBmaW5kVGh1bWJuYWlscygpOwogICAgIHZvaWQgZ2V0Q29sb3JJbmZvcm1hdGlvbigKICAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6VmlkZW9UcmFjayAqdnRyYWNrLAotICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAgICAgYm9vbCBpc0xpdmVTdHJlYW1pbmcoKSBjb25zdDsKIAogICAgIE1hdHJvc2thRXh0cmFjdG9yKGNvbnN0IE1hdHJvc2thRXh0cmFjdG9yICYpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL0FuZHJvaWQuYnAKaW5kZXggNDk0Y2VhYy4uNGUyZjI0OCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9BbmRyb2lkLmJwCkBAIC0xMiwxMyArMTIsMTMgQEAKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9pZDMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgXSwKIAogICAgIG5hbWU6ICJsaWJtcDNleHRyYWN0b3IiLApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvTVAzRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL01QM0V4dHJhY3Rvci5jcHAKaW5kZXggMzNjZmY5Ni4uNjE4MzhmNiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvTVAzRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuY3BwCkBAIC0yNCw4ICsyNCw2IEBACiAjaW5jbHVkZSAiVkJSSVNlZWtlci5oIgogI2luY2x1ZGUgIlhJTkdTZWVrZXIuaCIKIAotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmg+CkBAIC00Niw3ICs0NCw3IEBACiBzdGF0aWMgY29uc3QgdWludDMyX3Qga01hc2sgPSAweGZmZmUwYzAwOwogCiBzdGF0aWMgYm9vbCBSZXN5bmMoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIHVpbnQzMl90IG1hdGNoX2hlYWRlciwKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCB1aW50MzJfdCBtYXRjaF9oZWFkZXIsCiAgICAgICAgIG9mZjY0X3QgKmlub3V0X3Bvcywgb2ZmNjRfdCAqcG9zdF9pZDNfcG9zLCB1aW50MzJfdCAqb3V0X2hlYWRlcikgewogICAgIGlmIChwb3N0X2lkM19wb3MgIT0gTlVMTCkgewogICAgICAgICAqcG9zdF9pZDNfcG9zID0gMDsKQEAgLTIwOSwzNSArMjA3LDM0IEBACiAgICAgcmV0dXJuIHZhbGlkOwogfQogCi1jbGFzcyBNUDNTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFjayB7CitjbGFzcyBNUDNTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CiBwdWJsaWM6CiAgICAgTVAzU291cmNlKAotICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLCBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLCBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsCiAgICAgICAgICAgICBvZmY2NF90IGZpcnN0X2ZyYW1lX3BvcywgdWludDMyX3QgZml4ZWRfaGVhZGVyLAogICAgICAgICAgICAgTVAzU2Vla2VyICpzZWVrZXIpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0b3AoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk1QM1NvdXJjZSgpOwogCiBwcml2YXRlOgogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heEZyYW1lU2l6ZTsKLSAgICBNZXRhRGF0YUJhc2UgJm1NZXRhOwotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXQgKm1NZXRhOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIG9mZjY0X3QgbUZpcnN0RnJhbWVQb3M7CiAgICAgdWludDMyX3QgbUZpeGVkSGVhZGVyOwogICAgIG9mZjY0X3QgbUN1cnJlbnRQb3M7CiAgICAgaW50NjRfdCBtQ3VycmVudFRpbWVVczsKICAgICBib29sIG1TdGFydGVkOwogICAgIE1QM1NlZWtlciAqbVNlZWtlcjsKLSAgICBNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7CiAKICAgICBpbnQ2NF90IG1CYXNpc1RpbWVVczsKICAgICBpbnQ2NF90IG1TYW1wbGVzUmVhZDsKQEAgLTI1Myw3ICsyNTAsNyBAQAogfTsKIAogTVAzRXh0cmFjdG9yOjpNUDNFeHRyYWN0b3IoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIE1wM01ldGEgKm1ldGEpCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgTXAzTWV0YSAqbWV0YSkKICAgICA6IG1Jbml0Q2hlY2soTk9fSU5JVCksCiAgICAgICBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbUZpcnN0RnJhbWVQb3MoLTEpLApAQCAtMjg1LDYgKzI4Miw3IEBACiAgICAgbUZpeGVkSGVhZGVyID0gaGVhZGVyOwogICAgIFhJTkdTZWVrZXIgKnNlZWtlciA9IFhJTkdTZWVrZXI6OkNyZWF0ZUZyb21Tb3VyY2UobURhdGFTb3VyY2UsIG1GaXJzdEZyYW1lUG9zKTsKIAorICAgIG1NZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOwogICAgIGlmIChzZWVrZXIgPT0gTlVMTCkgewogICAgICAgICBtU2Vla2VyID0gVkJSSVNlZWtlcjo6Q3JlYXRlRnJvbVNvdXJjZShtRGF0YVNvdXJjZSwgcG9zdF9pZDNfcG9zKTsKICAgICB9IGVsc2UgewpAQCAtMjkyLDggKzI5MCw4IEBACiAgICAgICAgIGludCBlbmNkID0gc2Vla2VyLT5nZXRFbmNvZGVyRGVsYXkoKTsKICAgICAgICAgaW50IGVuY3AgPSBzZWVrZXItPmdldEVuY29kZXJQYWRkaW5nKCk7CiAgICAgICAgIGlmIChlbmNkICE9IDAgfHwgZW5jcCAhPSAwKSB7Ci0gICAgICAgICAgICBtTWV0YS5zZXRJbnQzMihrS2V5RW5jb2RlckRlbGF5LCBlbmNkKTsKLSAgICAgICAgICAgIG1NZXRhLnNldEludDMyKGtLZXlFbmNvZGVyUGFkZGluZywgZW5jcCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9ERUxBWSwgZW5jZCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9QQURESU5HLCBlbmNwKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzI5LDIxICszMjcsMjMgQEAKIAogICAgIHN3aXRjaCAobGF5ZXIpIHsKICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgbU1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUdfTEFZRVJfSSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1NZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUdfTEFZRVJfSSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgbU1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUdfTEFZRVJfSUkpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0lJKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICBtTWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBUUkVTUEFTUygpOwogICAgIH0KIAotICAgIG1NZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVfcmF0ZSk7Ci0gICAgbU1ldGEuc2V0SW50MzIoa0tleUJpdFJhdGUsIGJpdHJhdGUgKiAxMDAwKTsKLSAgICBtTWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBudW1fY2hhbm5lbHMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgc2FtcGxlX3JhdGUpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSwgYml0cmF0ZSAqIDEwMDApOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBudW1fY2hhbm5lbHMpOwogCiAgICAgaW50NjRfdCBkdXJhdGlvblVzOwogCkBAIC0zNjMsNyArMzYzLDcgQEAKICAgICB9CiAKICAgICBpZiAoZHVyYXRpb25VcyA+PSAwKSB7Ci0gICAgICAgIG1NZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb25Vcyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgZHVyYXRpb25Vcyk7CiAgICAgfQogCiAgICAgbUluaXRDaGVjayA9IE9LOwpAQCAtMzcxLDcgKzM3MSw4IEBACiAgICAgLy8gR2V0IGlUdW5lcy1zdHlsZSBnYXBsZXNzIGluZm8gaWYgcHJlc2VudC4KICAgICAvLyBXaGVuIGdldHRpbmcgdGhlIGlkMyB0YWcsIHNraXAgdGhlIFYxIHRhZ3MgdG8gcHJldmVudCB0aGUgc291cmNlIGNhY2hlCiAgICAgLy8gZnJvbSBiZWluZyBpdGVyYXRlZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLgotICAgIElEMyBpZDMobURhdGFTb3VyY2UsIHRydWUpOworICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKG1EYXRhU291cmNlKTsKKyAgICBJRDMgaWQzKCZoZWxwZXIsIHRydWUpOwogICAgIGlmIChpZDMuaXNWYWxpZCgpKSB7CiAgICAgICAgIElEMzo6SXRlcmF0b3IgKmNvbSA9IG5ldyBJRDM6Okl0ZXJhdG9yKGlkMywgIkNPTSIpOwogICAgICAgICBpZiAoY29tLT5kb25lKCkpIHsKQEAgLTM5MCw4ICszOTEsOCBAQAogCiAgICAgICAgICAgICAgICAgaW50MzJfdCBkZWxheSwgcGFkZGluZzsKICAgICAgICAgICAgICAgICBpZiAoc3NjYW5mKHZhbHVlLCAiICUqeCAleCAleCAlKngiLCAmZGVsYXksICZwYWRkaW5nKSA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NZXRhLnNldEludDMyKGtLZXlFbmNvZGVyRGVsYXksIGRlbGF5KTsKLSAgICAgICAgICAgICAgICAgICAgbU1ldGEuc2V0SW50MzIoa0tleUVuY29kZXJQYWRkaW5nLCBwYWRkaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfREVMQVksIGRlbGF5KTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfUEFERElORywgcGFkZGluZyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNDA0LDEzICs0MDUsMTUgQEAKIAogTVAzRXh0cmFjdG9yOjp+TVAzRXh0cmFjdG9yKCkgewogICAgIGRlbGV0ZSBtU2Vla2VyOworICAgIGRlbGV0ZSBtRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1NZXRhKTsKIH0KIAogc2l6ZV90IE1QM0V4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7CiAgICAgcmV0dXJuIG1Jbml0Q2hlY2sgIT0gT0sgPyAwIDogMTsKIH0KIAotTWVkaWFUcmFjayAqTVAzRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKK01lZGlhVHJhY2tIZWxwZXIgKk1QM0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC00MjAsMTQgKzQyMywxNCBAQAogICAgICAgICAgICAgbVNlZWtlcik7CiB9CiAKLXN0YXR1c190IE1QM0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorbWVkaWFfc3RhdHVzX3QgTVAzRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQotICAgIG1ldGEgPSBtTWV0YTsKLSAgICByZXR1cm4gT0s7CisgICAgQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbU1ldGEpOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC00NDAsNyArNDQzLDcgQEAKIC8vIFNldCBvdXIgbWF4IGZyYW1lIHNpemUgdG8gdGhlIG5lYXJlc3QgcG93ZXIgb2YgMiBhYm92ZSB0aGlzIHNpemUgKGFrYSwgNGtCKQogY29uc3Qgc2l6ZV90IE1QM1NvdXJjZTo6a01heEZyYW1lU2l6ZSA9ICgxIDw8IDEyKTsgLyogNDA5NiBieXRlcyAqLwogTVAzU291cmNlOjpNUDNTb3VyY2UoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLCBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsCiAgICAgICAgIG9mZjY0X3QgZmlyc3RfZnJhbWVfcG9zLCB1aW50MzJfdCBmaXhlZF9oZWFkZXIsCiAgICAgICAgIE1QM1NlZWtlciAqc2Vla2VyKQogICAgIDogbU1ldGEobWV0YSksCkBAIC00NTEsNyArNDU0LDYgQEAKICAgICAgIG1DdXJyZW50VGltZVVzKDApLAogICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAogICAgICAgbVNlZWtlcihzZWVrZXIpLAotICAgICAgbUdyb3VwKE5VTEwpLAogICAgICAgbUJhc2lzVGltZVVzKDApLAogICAgICAgbVNhbXBsZXNSZWFkKDApIHsKIH0KQEAgLTQ2MiwxMiArNDY0LDEwIEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBNUDNTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqKSB7CittZWRpYV9zdGF0dXNfdCBNUDNTb3VyY2U6OnN0YXJ0KCkgewogICAgIENIRUNLKCFtU3RhcnRlZCk7CiAKLSAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKLQotICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZShrTWF4RnJhbWVTaXplKSk7CisgICAgbUJ1ZmZlckdyb3VwLT5hZGRfYnVmZmVyKGtNYXhGcmFtZVNpemUpOwogCiAgICAgbUN1cnJlbnRQb3MgPSBtRmlyc3RGcmFtZVBvczsKICAgICBtQ3VycmVudFRpbWVVcyA9IDA7CkBAIC00NzcsMjcgKzQ3NywyMyBAQAogCiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1QM1NvdXJjZTo6c3RvcCgpIHsKK21lZGlhX3N0YXR1c190IE1QM1NvdXJjZTo6c3RvcCgpIHsKICAgICBDSEVDSyhtU3RhcnRlZCk7CiAKLSAgICBkZWxldGUgbUdyb3VwOwotICAgIG1Hcm91cCA9IE5VTEw7Ci0KICAgICBtU3RhcnRlZCA9IGZhbHNlOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1QM1NvdXJjZTo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgIG1ldGEgPSBtTWV0YTsKLSAgICByZXR1cm4gT0s7CittZWRpYV9zdGF0dXNfdCBNUDNTb3VyY2U6OmdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpIHsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbU1ldGEpOwogfQogCi1zdGF0dXNfdCBNUDNTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKK21lZGlhX3N0YXR1c190IE1QM1NvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgKm91dCA9IE5VTEw7CiAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CkBAIC01MDksMTEgKzUwNSwxMSBAQAogICAgICAgICBpZiAobVNlZWtlciA9PSBOVUxMCiAgICAgICAgICAgICAgICAgfHwgIW1TZWVrZXItPmdldE9mZnNldEZvclRpbWUoJmFjdHVhbFNlZWtUaW1lVXMsICZtQ3VycmVudFBvcykpIHsKICAgICAgICAgICAgIGludDMyX3QgYml0cmF0ZTsKLSAgICAgICAgICAgIGlmICghbU1ldGEuZmluZEludDMyKGtLZXlCaXRSYXRlLCAmYml0cmF0ZSkpIHsKKyAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFLCAmYml0cmF0ZSkpIHsKICAgICAgICAgICAgICAgICAvLyBiaXRyYXRlIGlzIGluIGJpdHMvc2VjLgogICAgICAgICAgICAgICAgIEFMT0dJKCJubyBiaXRyYXRlIik7CiAKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbUN1cnJlbnRUaW1lVXMgPSBzZWVrVGltZVVzOwpAQCAtNTI3LDEwICs1MjMsMTAgQEAKICAgICAgICAgbVNhbXBsZXNSZWFkID0gMDsKICAgICB9CiAKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKLSAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOworICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXI7CisgICAgc3RhdHVzX3QgZXJyID0gbUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICBzaXplX3QgZnJhbWVfc2l6ZTsKQEAgLTU0Myw3ICs1MzksOCBAQAogICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOwogCi0gICAgICAgICAgICByZXR1cm4gKG4gPCAwID8gbiA6IEVSUk9SX0VORF9PRl9TVFJFQU0pOworICAgICAgICAgICAgcmV0dXJuICgobiA8IDAgJiYgbiAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSA/CisgICAgICAgICAgICAgICAgICAgIEFNRURJQV9FUlJPUl9VTktOT1dOIDogQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU0pOwogICAgICAgICB9CiAKICAgICAgICAgdWludDMyX3QgaGVhZGVyID0gVTMyX0FUKChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkpOwpAQCAtNTcyLDcgKzU2OSw3IEBACiAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgICAgICB9CiAKICAgICAgICAgbUN1cnJlbnRQb3MgPSBwb3M7CkBAIC01ODcsMTMgKzU4NCwxNSBAQAogICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgYnVmZmVyID0gTlVMTDsKIAotICAgICAgICByZXR1cm4gKG4gPCAwID8gbiA6IEVSUk9SX0VORF9PRl9TVFJFQU0pOworICAgICAgICByZXR1cm4gKChuIDwgMCAmJiBuICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pID8KKyAgICAgICAgICAgICAgICBBTUVESUFfRVJST1JfVU5LTk9XTiA6IEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNKTsKICAgICB9CiAKICAgICBidWZmZXItPnNldF9yYW5nZSgwLCBmcmFtZV9zaXplKTsKIAotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIG1DdXJyZW50VGltZVVzKTsKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCBtQ3VycmVudFRpbWVVcyk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAKICAgICBtQ3VycmVudFBvcyArPSBmcmFtZV9zaXplOwogCkBAIC02MDIsMzkgKzYwMSw0MCBAQAogCiAgICAgKm91dCA9IGJ1ZmZlcjsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNUDNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgIG1ldGEuY2xlYXIoKTsKK21lZGlhX3N0YXR1c190IE1QM0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1ldGEpOwogICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQotICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsICJhdWRpby9tcGVnIik7CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOwogCi0gICAgSUQzIGlkMyhtRGF0YVNvdXJjZSk7CisgICAgRGF0YVNvdXJjZUhlbHBlciBoZWxwZXIobURhdGFTb3VyY2UpOworICAgIElEMyBpZDMoJmhlbHBlcik7CiAKICAgICBpZiAoIWlkMy5pc1ZhbGlkKCkpIHsKLSAgICAgICAgcmV0dXJuIE9LOworICAgICAgICByZXR1cm4gQU1FRElBX09LOwogICAgIH0KIAogICAgIHN0cnVjdCBNYXAgewotICAgICAgICBpbnQga2V5OworICAgICAgICBjb25zdCBjaGFyICprZXk7CiAgICAgICAgIGNvbnN0IGNoYXIgKnRhZzE7CiAgICAgICAgIGNvbnN0IGNoYXIgKnRhZzI7CiAgICAgfTsKICAgICBzdGF0aWMgY29uc3QgTWFwIGtNYXBbXSA9IHsKLSAgICAgICAgeyBrS2V5QWxidW0sICJUQUxCIiwgIlRBTCIgfSwKLSAgICAgICAgeyBrS2V5QXJ0aXN0LCAiVFBFMSIsICJUUDEiIH0sCi0gICAgICAgIHsga0tleUFsYnVtQXJ0aXN0LCAiVFBFMiIsICJUUDIiIH0sCi0gICAgICAgIHsga0tleUNvbXBvc2VyLCAiVENPTSIsICJUQ00iIH0sCi0gICAgICAgIHsga0tleUdlbnJlLCAiVENPTiIsICJUQ08iIH0sCi0gICAgICAgIHsga0tleVRpdGxlLCAiVElUMiIsICJUVDIiIH0sCi0gICAgICAgIHsga0tleVllYXIsICJUWUUiLCAiVFlFUiIgfSwKLSAgICAgICAgeyBrS2V5QXV0aG9yLCAiVFhUIiwgIlRFWFQiIH0sCi0gICAgICAgIHsga0tleUNEVHJhY2tOdW1iZXIsICJUUksiLCAiVFJDSyIgfSwKLSAgICAgICAgeyBrS2V5RGlzY051bWJlciwgIlRQQSIsICJUUE9TIiB9LAotICAgICAgICB7IGtLZXlDb21waWxhdGlvbiwgIlRDUCIsICJUQ01QIiB9LAorICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQUxCVU0sICJUQUxCIiwgIlRBTCIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0FSVElTVCwgIlRQRTEiLCAiVFAxIiB9LAorICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlRJU1QsICJUUEUyIiwgIlRQMiIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0NPTVBPU0VSLCAiVENPTSIsICJUQ00iIH0sCisgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9HRU5SRSwgIlRDT04iLCAiVENPIiB9LAorICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfVElUTEUsICJUSVQyIiwgIlRUMiIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX1lFQVIsICJUWUUiLCAiVFlFUiIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0FVVEhPUiwgIlRYVCIsICJURVhUIiB9LAorICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQ0RUUkFDS05VTUJFUiwgIlRSSyIsICJUUkNLIiB9LAorICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfRElTQ05VTUJFUiwgIlRQQSIsICJUUE9TIiB9LAorICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQ09NUElMQVRJT04sICJUQ1AiLCAiVENNUCIgfSwKICAgICB9OwogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga051bU1hcEVudHJpZXMgPSBzaXplb2Yoa01hcCkgLyBzaXplb2Yoa01hcFswXSk7CiAKQEAgLTY1NCw3ICs2NTQsNyBAQAogICAgICAgICBpdC0+Z2V0U3RyaW5nKCZzKTsKICAgICAgICAgZGVsZXRlIGl0OwogCi0gICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrTWFwW2ldLmtleSwgcyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwga01hcFtpXS5rZXksIHMuc3RyaW5nKCkpOwogICAgIH0KIAogICAgIHNpemVfdCBkYXRhU2l6ZTsKQEAgLTY2MiwyOCArNjYyLDI4IEBACiAgICAgY29uc3Qgdm9pZCAqZGF0YSA9IGlkMy5nZXRBbGJ1bUFydCgmZGF0YVNpemUsICZtaW1lKTsKIAogICAgIGlmIChkYXRhKSB7Ci0gICAgICAgIG1ldGEuc2V0RGF0YShrS2V5QWxidW1BcnQsIE1ldGFEYXRhOjpUWVBFX05PTkUsIGRhdGEsIGRhdGFTaXplKTsKLSAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlBbGJ1bUFydE1JTUUsIG1pbWUuc3RyaW5nKCkpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlQsIGRhdGEsIGRhdGFTaXplKTsKICAgICB9CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yKiBDcmVhdGVFeHRyYWN0b3IoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCitzdGF0aWMgQ01lZGlhRXh0cmFjdG9yKiBDcmVhdGVFeHRyYWN0b3IoCisgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCiAgICAgICAgIHZvaWQgKm1ldGEpIHsKICAgICBNcDNNZXRhICptZXRhRGF0YSA9IHN0YXRpY19jYXN0PE1wM01ldGEgKj4obWV0YSk7Ci0gICAgcmV0dXJuIG5ldyBNUDNFeHRyYWN0b3Ioc291cmNlLCBtZXRhRGF0YSk7CisgICAgcmV0dXJuIHdyYXAobmV3IE1QM0V4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpLCBtZXRhRGF0YSkpOwogfQogCi1zdGF0aWMgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIFNuaWZmKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsCi0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKmZyZWVNZXRhKSB7CitzdGF0aWMgQ3JlYXRvckZ1bmMgU25pZmYoCisgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlLCB2b2lkICoqbWV0YSwKKyAgICAgICAgRnJlZU1ldGFGdW5jICpmcmVlTWV0YSkgewogICAgIG9mZjY0X3QgcG9zID0gMDsKICAgICBvZmY2NF90IHBvc3RfaWQzX3BvczsKICAgICB1aW50MzJfdCBoZWFkZXI7CiAgICAgdWludDhfdCBtcGVnX2hlYWRlcls1XTsKLSAgICBpZiAoc291cmNlLT5yZWFkQXQoMCwgbXBlZ19oZWFkZXIsIHNpemVvZihtcGVnX2hlYWRlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKG1wZWdfaGVhZGVyKSkgeworICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKHNvdXJjZSk7CisgICAgaWYgKGhlbHBlci5yZWFkQXQoMCwgbXBlZ19oZWFkZXIsIHNpemVvZihtcGVnX2hlYWRlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKG1wZWdfaGVhZGVyKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTY5MSw3ICs2OTEsNyBAQAogICAgICAgICBBTE9HVigiTVBFRzFQUyBjb250YWluZXIgaXMgbm90IHN1cHBvcnRlZCEiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGlmICghUmVzeW5jKHNvdXJjZSwgMCwgJnBvcywgJnBvc3RfaWQzX3BvcywgJmhlYWRlcikpIHsKKyAgICBpZiAoIVJlc3luYygmaGVscGVyLCAwLCAmcG9zLCAmcG9zdF9pZDNfcG9zLCAmaGVhZGVyKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTcwNywxNiArNzA3LDI0IEBACiAgICAgcmV0dXJuIENyZWF0ZUV4dHJhY3RvcjsKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnNbXSA9IHsKKyAgICAibXAzIiwKKyAgICAibXBlZyIsCisgICAgIm1wZyIsCisgICAgIm1wZ2EiLAorICAgIE5VTEwKK307CisKIGV4dGVybiAiQyIgewogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAogX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CitFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgewogICAgIHJldHVybiB7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgRVhUUkFDVE9SREVGX1ZFUlNJT04sCiAgICAgICAgIFVVSUQoIjgxMmEzZjZjLWM4Y2YtNDZkZS1iNTI5LTM3NzRiMTQxMDNkNCIpLAogICAgICAgICAxLCAvLyB2ZXJzaW9uCiAgICAgICAgICJNUDMgRXh0cmFjdG9yIiwKLSAgICAgICAgU25pZmYKKyAgICAgICAgeyAudjMgPSB7U25pZmYsIGV4dGVuc2lvbnN9IH0KICAgICB9OwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL01QM0V4dHJhY3Rvci5oCmluZGV4IDQ4NWIwY2EuLjFlMzhhYjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL01QM0V4dHJhY3Rvci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL01QM0V4dHJhY3Rvci5oCkBAIC0xOSwzNSArMTksMzcgQEAKICNkZWZpbmUgTVAzX0VYVFJBQ1RPUl9IXwogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitjbGFzcyBEYXRhU291cmNlSGVscGVyOworCiBzdHJ1Y3QgQU1lc3NhZ2U7Ci1jbGFzcyBEYXRhU291cmNlQmFzZTsKIHN0cnVjdCBNUDNTZWVrZXI7CiBjbGFzcyBTdHJpbmc4Owogc3RydWN0IE1wM01ldGE7CiAKLWNsYXNzIE1QM0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CitjbGFzcyBNUDNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgewogcHVibGljOgotICAgIE1QM0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlLCBNcDNNZXRhICptZXRhKTsKKyAgICBNUDNFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBNcDNNZXRhICptZXRhKTsKICAgICB+TVAzRXh0cmFjdG9yKCk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiTVAzRXh0cmFjdG9yIjsgfQogCiBwcml2YXRlOgogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAgICAgb2ZmNjRfdCBtRmlyc3RGcmFtZVBvczsKLSAgICBNZXRhRGF0YUJhc2UgbU1ldGE7CisgICAgQU1lZGlhRm9ybWF0ICptTWV0YTsKICAgICB1aW50MzJfdCBtRml4ZWRIZWFkZXI7CiAgICAgTVAzU2Vla2VyICptU2Vla2VyOwogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL1ZCUklTZWVrZXIuY3BwCmluZGV4IDUyM2YxNGMuLjllYjcyYTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL1ZCUklTZWVrZXIuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL1ZCUklTZWVrZXIuY3BwCkBAIC0yNyw3ICsyNyw5IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zNyw3ICszOSw3IEBACiAKIC8vIHN0YXRpYwogVkJSSVNlZWtlciAqVkJSSVNlZWtlcjo6Q3JlYXRlRnJvbVNvdXJjZSgKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgb2ZmNjRfdCBwb3N0X2lkM19wb3MpIHsKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBvZmY2NF90IHBvc3RfaWQzX3BvcykgewogICAgIG9mZjY0X3QgcG9zID0gcG9zdF9pZDNfcG9zOwogCiAgICAgdWludDhfdCBoZWFkZXJbNF07CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmggYi9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmgKaW5kZXggOTIxM2Y2ZS4uNTA3ODk5YyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvVkJSSVNlZWtlci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL1ZCUklTZWVrZXIuaApAQCAtMjQsMTEgKzI0LDExIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitjbGFzcyBEYXRhU291cmNlSGVscGVyOwogCiBzdHJ1Y3QgVkJSSVNlZWtlciA6IHB1YmxpYyBNUDNTZWVrZXIgewogICAgIHN0YXRpYyBWQlJJU2Vla2VyICpDcmVhdGVGcm9tU291cmNlKAotICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgb2ZmNjRfdCBwb3N0X2lkM19wb3MpOworICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBvZmY2NF90IHBvc3RfaWQzX3Bvcyk7CiAKICAgICB2aXJ0dWFsIGJvb2wgZ2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25Vcyk7CiAgICAgdmlydHVhbCBib29sIGdldE9mZnNldEZvclRpbWUoaW50NjRfdCAqdGltZVVzLCBvZmY2NF90ICpwb3MpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9YSU5HU2Vla2VyLmNwcAppbmRleCAwMWUwNmNhLi45ZjFmZDdhIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wMy9YSU5HU2Vla2VyLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9YSU5HU2Vla2VyLmNwcApAQCAtMjEsNyArMjEsOSBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNzksNyArODEsNyBAQAogCiAvLyBzdGF0aWMKIFhJTkdTZWVrZXIgKlhJTkdTZWVrZXI6OkNyZWF0ZUZyb21Tb3VyY2UoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3QgZmlyc3RfZnJhbWVfcG9zKSB7CisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgb2ZmNjRfdCBmaXJzdF9mcmFtZV9wb3MpIHsKIAogICAgIHVpbnQ4X3QgYnVmZmVyWzRdOwogICAgIGludCBvZmZzZXQgPSBmaXJzdF9mcmFtZV9wb3M7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9YSU5HU2Vla2VyLmggYi9tZWRpYS9leHRyYWN0b3JzL21wMy9YSU5HU2Vla2VyLmgKaW5kZXggNTg2N2VhZS4uOWFjZWUzOCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL1hJTkdTZWVrZXIuaApAQCAtMjIsMTEgKzIyLDExIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitjbGFzcyBEYXRhU291cmNlSGVscGVyOwogCiBzdHJ1Y3QgWElOR1NlZWtlciA6IHB1YmxpYyBNUDNTZWVrZXIgewogICAgIHN0YXRpYyBYSU5HU2Vla2VyICpDcmVhdGVGcm9tU291cmNlKAotICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgb2ZmNjRfdCBmaXJzdF9mcmFtZV9wb3MpOworICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBvZmY2NF90IGZpcnN0X2ZyYW1lX3Bvcyk7CiAKICAgICB2aXJ0dWFsIGJvb2wgZ2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25Vcyk7CiAgICAgdmlydHVhbCBib29sIGdldE9mZnNldEZvclRpbWUoaW50NjRfdCAqdGltZVVzLCBvZmY2NF90ICpwb3MpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQUM0UGFyc2VyLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FDNFBhcnNlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlhMmU5YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FDNFBhcnNlci5jcHAKQEAgLTAsMCArMSw2MjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFDNFBhcnNlciIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgorCisjaW5jbHVkZSAiQUM0UGFyc2VyLmgiCisKKyNkZWZpbmUgQk9PTFNUUihhKSAgKChhKT8idHJ1ZSI6ImZhbHNlIikKKyNkZWZpbmUgQllURV9BTElHTiBtQml0UmVhZGVyLnNraXBCaXRzKG1CaXRSZWFkZXIubnVtQml0c0xlZnQoKSAlIDgpCisjZGVmaW5lIENIRUNLX0JJVFNfTEVGVChuKSBpZiAobUJpdFJlYWRlci5udW1CaXRzTGVmdCgpIDwgbikge3JldHVybiBmYWxzZTt9CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQUM0UGFyc2VyOjpBQzRQYXJzZXIoKSB7Cit9CisKK0FDNERTSVBhcnNlcjo6QUM0RFNJUGFyc2VyKEFCaXRSZWFkZXIgJmJyKQorICAgIDogbUJpdFJlYWRlcihicil7CisKKyAgICBtRFNJU2l6ZSA9IG1CaXRSZWFkZXIubnVtQml0c0xlZnQoKTsKK30KKworLy8gRVRTSSBUUyAxMDMgMTkwLTIgVjEuMS4xICgyMDE1LTA5KSBUYWJsZSA3OTogY2hhbm5lbF9tb2RlCitzdGF0aWMgY29uc3QgY2hhciAqQ2hhbm5lbE1vZGVzW10gPSB7CisgICAgIm1vbm8iLAorICAgICJzdGVyZW8iLAorICAgICIzLjAiLAorICAgICI1LjAiLAorICAgICI1LjEiLAorICAgICI3LjAgKDMvNC8wKSIsCisgICAgIjcuMSAoMy80LzAuMSkiLAorICAgICI3LjAgKDUvMi8wKSIsCisgICAgIjcuMSAoNS8yLzAuMSkiLAorICAgICI3LjAgKDMvMi8yKSIsCisgICAgIjcuMSAoMy8yLzIuMSkiLAorICAgICI3LjAuNCIsCisgICAgIjcuMS40IiwKKyAgICAiOS4wLjQiLAorICAgICI5LjEuNCIsCisgICAgIjIyLjIiCit9OworCitzdGF0aWMgY29uc3QgY2hhciogQ29udGVudENsYXNzaWZpZXJbXSA9IHsKKyAgICAiQ29tcGxldGUgTWFpbiIsCisgICAgIk11c2ljIGFuZCBFZmZlY3RzIiwKKyAgICAiVmlzdWFsbHkgSW1wYWlyZWQiLAorICAgICJIZWFyaW5nIEltcGFpcmVkIiwKKyAgICAiRGlhbG9nIiwKKyAgICAiQ29tbWVudGFyeSIsCisgICAgIkVtZXJnZW5jeSIsCisgICAgIlZvaWNlIE92ZXIiCit9OworCitib29sIEFDNERTSVBhcnNlcjo6cGFyc2VMYW5ndWFnZVRhZyh1aW50MzJfdCBwcmVzZW50YXRpb25JRCwgdWludDMyX3Qgc3Vic3RyZWFtSUQpeworICAgIENIRUNLX0JJVFNfTEVGVCg2KTsKKyAgICB1aW50MzJfdCBuX2xhbmd1YWdlX3RhZ19ieXRlcyA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg2KTsKKyAgICBpZiAobl9sYW5ndWFnZV90YWdfYnl0ZXMgPCAyIHx8IG5fbGFuZ3VhZ2VfdGFnX2J5dGVzID49IDQyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQ0hFQ0tfQklUU19MRUZUKG5fbGFuZ3VhZ2VfdGFnX2J5dGVzICogOCk7CisgICAgY2hhciBsYW5ndWFnZV90YWdfYnl0ZXNbNDJdOyAvLyBUUyAxMDMgMTkwIHBhcnQgMSA0LjMuMy44LjcKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbl9sYW5ndWFnZV90YWdfYnl0ZXM7IGkrKykgeworICAgICAgICBsYW5ndWFnZV90YWdfYnl0ZXNbaV0gPSAoY2hhciltQml0UmVhZGVyLmdldEJpdHMoOCk7CisgICAgfQorICAgIGxhbmd1YWdlX3RhZ19ieXRlc1tuX2xhbmd1YWdlX3RhZ19ieXRlc10gPSAwOworICAgIEFMT0dWKCIldS4ldTogbGFuZ3VhZ2VfdGFnID0gJXNcbiIsIHByZXNlbnRhdGlvbklELCBzdWJzdHJlYW1JRCwgbGFuZ3VhZ2VfdGFnX2J5dGVzKTsKKworICAgIHN0ZDo6c3RyaW5nIGxhbmd1YWdlKGxhbmd1YWdlX3RhZ19ieXRlcywgbl9sYW5ndWFnZV90YWdfYnl0ZXMpOworICAgIG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbklEXS5tTGFuZ3VhZ2UgPSBsYW5ndWFnZTsKKworICAgIHJldHVybiB0cnVlOworfQorCisvLyBUUyAxMDMgMTkwLTEgdjEuMi4xIEUuNSBhbmQgVFMgMTAzIDE5MC0yIHYxLjEuMSBFLjkKK2Jvb2wgQUM0RFNJUGFyc2VyOjpwYXJzZVN1YnN0cmVhbURTSSh1aW50MzJfdCBwcmVzZW50YXRpb25JRCwgdWludDMyX3Qgc3Vic3RyZWFtSUQpeworICAgIENIRUNLX0JJVFNfTEVGVCg1KTsKKyAgICB1aW50MzJfdCBjaGFubmVsX21vZGUgPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgQ0hFQ0tfQklUU19MRUZUKDIpOworICAgIHVpbnQzMl90IGRzaV9zZl9tdWx0aXBsaWVyID0gbUJpdFJlYWRlci5nZXRCaXRzKDIpOworICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICBib29sIGJfc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICBBTE9HVigiJXUuJXU6IGNoYW5uZWxfbW9kZSA9ICV1ICglcylcbiIsIHByZXNlbnRhdGlvbklELCBzdWJzdHJlYW1JRCwgY2hhbm5lbF9tb2RlLAorICAgIGNoYW5uZWxfbW9kZSA8IE5FTEVNKENoYW5uZWxNb2RlcykgPyBDaGFubmVsTW9kZXNbY2hhbm5lbF9tb2RlXSA6ICJyZXNlcnZlZCIpOworICAgIEFMT0dWKCIldS4ldTogZHNpX3NmX211bHRpcGxpZXIgPSAldVxuIiwgcHJlc2VudGF0aW9uSUQsCisgICAgICAgIHN1YnN0cmVhbUlELCBkc2lfc2ZfbXVsdGlwbGllcik7CisgICAgQUxPR1YoIiV1LiV1OiBiX3N1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvciA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwKKyAgICAgICAgc3Vic3RyZWFtSUQsIEJPT0xTVFIoYl9zdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IpKTsKKworICAgIGlmIChiX3N1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvcikgeworICAgICAgICBDSEVDS19CSVRTX0xFRlQoNSk7CisgICAgICAgIHVpbnQzMl90IHN1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvciA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg1KTsKKyAgICAgICAgQUxPR1YoIiV1LiV1OiBzdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IgPSAldVxuIiwgcHJlc2VudGF0aW9uSUQsIHN1YnN0cmVhbUlELAorICAgICAgICAgICAgc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yKTsKKyAgICB9CisgICAgaWYgKGNoYW5uZWxfbW9kZSA+PSA3ICYmIGNoYW5uZWxfbW9kZSA8PSAxMCkgeworICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgIHVpbnQzMl90IGFkZF9jaF9iYXNlID0gbUJpdFJlYWRlci5nZXRCaXRzKDEpOworICAgICAgICBBTE9HVigiJXUuJXU6IGFkZF9jaF9iYXNlID0gJXVcbiIsIHByZXNlbnRhdGlvbklELCBzdWJzdHJlYW1JRCwgYWRkX2NoX2Jhc2UpOworICAgIH0KKyAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgYm9vbCBiX2NvbnRlbnRfdHlwZSA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgQUxPR1YoIiV1LiV1OiBiX2NvbnRlbnRfdHlwZSA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgc3Vic3RyZWFtSUQsIEJPT0xTVFIoYl9jb250ZW50X3R5cGUpKTsKKyAgICBpZiAoYl9jb250ZW50X3R5cGUpIHsKKyAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDMpOworICAgICAgICB1aW50MzJfdCBjb250ZW50X2NsYXNzaWZpZXIgPSBtQml0UmVhZGVyLmdldEJpdHMoMyk7CisgICAgICAgIEFMT0dWKCIldS4ldTogY29udGVudF9jbGFzc2lmaWVyID0gJXUgKCVzKVxuIiwgcHJlc2VudGF0aW9uSUQsIHN1YnN0cmVhbUlELAorICAgICAgICAgICAgY29udGVudF9jbGFzc2lmaWVyLCBDb250ZW50Q2xhc3NpZmllcltjb250ZW50X2NsYXNzaWZpZXJdKTsKKworICAgICAgICAvLyBGb3Igc3RyZWFtcyBiYXNlZCBvbiBUUyAxMDMgMTkwIHBhcnQgMSB0aGUgcHJlc2VudGF0aW9uIGxldmVsIGNoYW5uZWxfbW9kZSBkb2Vzbid0CisgICAgICAgIC8vIGV4aXN0IGFuZCBzbyB3ZSB1c2UgdGhlIGNoYW5uZWxfbW9kZSBmcm9tIGVpdGhlciB0aGUgQ00gb3IgTSZFIHN1YnN0cmVhbQorICAgICAgICAvLyAodGhleSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlKQorICAgICAgICBpZiAobVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uSURdLm1DaGFubmVsTW9kZSA9PSAtMSAmJgorICAgICAgICAgICAgKGNvbnRlbnRfY2xhc3NpZmllciA9PSAwIHx8IGNvbnRlbnRfY2xhc3NpZmllciA9PSAxKSkgeworICAgICAgICAgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uSURdLm1DaGFubmVsTW9kZSA9IGNoYW5uZWxfbW9kZTsKKyAgICAgICAgfQorICAgICAgICBtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25JRF0ubUNvbnRlbnRDbGFzc2lmaWVyID0gY29udGVudF9jbGFzc2lmaWVyOworICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgIGJvb2wgYl9sYW5ndWFnZV9pbmRpY2F0b3IgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICBBTE9HVigiJXUuJXU6IGJfbGFuZ3VhZ2VfaW5kaWNhdG9yID0gJXNcbiIsIHByZXNlbnRhdGlvbklELCBzdWJzdHJlYW1JRCwKKyAgICAgICAgICAgIEJPT0xTVFIoYl9sYW5ndWFnZV9pbmRpY2F0b3IpKTsKKyAgICAgICAgaWYgKGJfbGFuZ3VhZ2VfaW5kaWNhdG9yKSB7CisgICAgICAgICAgICBpZiAoIXBhcnNlTGFuZ3VhZ2VUYWcocHJlc2VudGF0aW9uSUQsIHN1YnN0cmVhbUlEKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisvLyBFVFNJIFRTIDEwMyAxOTAtMiB2MS4xLjEgc2VjdGlvbiBFLjExCitib29sIEFDNERTSVBhcnNlcjo6cGFyc2VTdWJzdHJlYW1Hcm91cERTSSh1aW50MzJfdCBwcmVzZW50YXRpb25JRCwgdWludDMyX3QgZ3JvdXBJRCkKK3sKKyAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgYm9vbCBiX3N1YnN0cmVhbXNfcHJlc2VudCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgIGJvb2wgYl9oc2ZfZXh0ID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgYm9vbCBiX2NoYW5uZWxfY29kZWQgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgIENIRUNLX0JJVFNfTEVGVCg4KTsKKyAgICB1aW50MzJfdCBuX3N1YnN0cmVhbXMgPSBtQml0UmVhZGVyLmdldEJpdHMoOCk7CisgICAgQUxPR1YoIiV1LiV1OiBiX3N1YnN0cmVhbXNfcHJlc2VudCA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwKKyAgICAgICAgQk9PTFNUUihiX3N1YnN0cmVhbXNfcHJlc2VudCkpOworICAgIEFMT0dWKCIldS4ldTogYl9oc2ZfZXh0ID0gJXNcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELCBCT09MU1RSKGJfaHNmX2V4dCkpOworICAgIEFMT0dWKCIldS4ldTogYl9jaGFubmVsX2NvZGVkID0gJXNcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELCBCT09MU1RSKGJfY2hhbm5lbF9jb2RlZCkpOworICAgIEFMT0dWKCIldS4ldTogbl9zdWJzdHJlYW1zID0gJXVcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELCBuX3N1YnN0cmVhbXMpOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG5fc3Vic3RyZWFtczsgaSsrKSB7CisgICAgICAgIENIRUNLX0JJVFNfTEVGVCgyKTsKKyAgICAgICAgdWludDMyX3QgZHNpX3NmX211bHRpcGxpZXIgPSBtQml0UmVhZGVyLmdldEJpdHMoMik7CisgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgYm9vbCBiX3N1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvciA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgIEFMT0dWKCIldS4ldS4ldTogZHNpX3NmX211bHRpcGxpZXIgPSAldVxuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIGksIGRzaV9zZl9tdWx0aXBsaWVyKTsKKyAgICAgICAgQUxPR1YoIiV1LiV1LiV1OiBiX3N1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvciA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgaSwKKyAgICAgICAgICAgIEJPT0xTVFIoYl9zdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IpKTsKKworICAgICAgICBpZiAoYl9zdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IpIHsKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg1KTsKKyAgICAgICAgICAgIHVpbnQzMl90IHN1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvciA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg1KTsKKyAgICAgICAgICAgIEFMT0dWKCIldS4ldS4ldTogc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yID0gJXVcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELCBpLAorICAgICAgICAgICAgICAgIHN1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJfY2hhbm5lbF9jb2RlZCkgeworICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDI0KTsKKyAgICAgICAgICAgIHVpbnQzMl90IGRzaV9zdWJzdHJlYW1fY2hhbm5lbF9tYXNrID0gbUJpdFJlYWRlci5nZXRCaXRzKDI0KTsKKyAgICAgICAgICAgIEFMT0dWKCIldS4ldS4ldTogZHNpX3N1YnN0cmVhbV9jaGFubmVsX21hc2sgPSAweCUwNnhcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELCBpLAorICAgICAgICAgICAgICAgIGRzaV9zdWJzdHJlYW1fY2hhbm5lbF9tYXNrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgICAgIGJvb2wgYl9ham9jID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgIEFMT0dWKCIldS4ldS4ldTogYl9ham9jID0gJXNcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELCBpLCBCT09MU1RSKGJfYWpvYykpOworICAgICAgICAgICAgaWYgKGJfYWpvYykgeworICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgICAgICAgICBib29sIGJfc3RhdGljX2RteCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiV1LiV1LiV1OiBiX3N0YXRpY19kbXggPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIGksCisgICAgICAgICAgICAgICAgICAgIEJPT0xTVFIoYl9zdGF0aWNfZG14KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiX3N0YXRpY19kbXgpIHsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDQpOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuX2RteF9vYmplY3RzX21pbnVzMSA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiV1LiV1LiV1OiBuX2RteF9vYmplY3RzX21pbnVzMSA9ICV1XG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5fZG14X29iamVjdHNfbWludXMxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDYpOworICAgICAgICAgICAgICAgIHVpbnQzMl90IG5fdW14X29iamVjdHNfbWludXMxID0gbUJpdFJlYWRlci5nZXRCaXRzKDYpOworICAgICAgICAgICAgICAgIEFMT0dWKCIldS4ldS4ldTogbl91bXhfb2JqZWN0c19taW51czEgPSAldVxuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIGksCisgICAgICAgICAgICAgICAgICAgIG5fdW14X29iamVjdHNfbWludXMxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg0KTsKKyAgICAgICAgICAgIG1CaXRSZWFkZXIuc2tpcEJpdHMoNCk7IC8vIG9iamVjdHNfYXNzaWdubWVudF9tYXNrCisgICAgICAgIH0KKyAgICB9CisKKyAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgYm9vbCBiX2NvbnRlbnRfdHlwZSA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgQUxPR1YoIiV1LiV1OiBiX2NvbnRlbnRfdHlwZSA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgQk9PTFNUUihiX2NvbnRlbnRfdHlwZSkpOworICAgIGlmIChiX2NvbnRlbnRfdHlwZSkgeworICAgICAgICBDSEVDS19CSVRTX0xFRlQoMyk7CisgICAgICAgIHVpbnQzMl90IGNvbnRlbnRfY2xhc3NpZmllciA9IG1CaXRSZWFkZXIuZ2V0Qml0cygzKTsKKyAgICAgICAgQUxPR1YoIiV1LiV1OiBjb250ZW50X2NsYXNzaWZpZXIgPSAlcyAoJXUpXG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwKKyAgICAgICAgICAgIENvbnRlbnRDbGFzc2lmaWVyW2NvbnRlbnRfY2xhc3NpZmllcl0sIGNvbnRlbnRfY2xhc3NpZmllcik7CisKKyAgICAgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uSURdLm1Db250ZW50Q2xhc3NpZmllciA9IGNvbnRlbnRfY2xhc3NpZmllcjsKKworICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgIGJvb2wgYl9sYW5ndWFnZV9pbmRpY2F0b3IgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICBBTE9HVigiJXUuJXU6IGJfbGFuZ3VhZ2VfaW5kaWNhdG9yID0gJXNcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELAorICAgICAgICAgICAgQk9PTFNUUihiX2xhbmd1YWdlX2luZGljYXRvcikpOworCisgICAgICAgIGlmIChiX2xhbmd1YWdlX2luZGljYXRvcikgeworICAgICAgICAgICAgaWYgKCFwYXJzZUxhbmd1YWdlVGFnKHByZXNlbnRhdGlvbklELCBncm91cElEKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEFDNERTSVBhcnNlcjo6cGFyc2VCaXRyYXRlRHNpKCkgeworICAgIENIRUNLX0JJVFNfTEVGVCgyICsgMzIgKyAzMik7CisgICAgbUJpdFJlYWRlci5za2lwQml0cygyKTsgLy8gYml0X3JhdGVfbW9kZQorICAgIG1CaXRSZWFkZXIuc2tpcEJpdHMoMzIpOyAvLyBiaXRfcmF0ZQorICAgIG1CaXRSZWFkZXIuc2tpcEJpdHMoMzIpOyAvLyBiaXRfcmF0ZV9wcmVjaXNpb24KKworICAgIHJldHVybiB0cnVlOworfQorCisvLyBUUyAxMDMgMTkwLTEgc2VjdGlvbiBFLjQgKGFjNF9kc2kpIGFuZCBUUyAxMDMgMTkwLTIgc2VjdGlvbiBFLjYgKGFjNF9kc2lfdjEpCitib29sIEFDNERTSVBhcnNlcjo6cGFyc2UoKSB7CisgICAgQ0hFQ0tfQklUU19MRUZUKDMpOworICAgIHVpbnQzMl90IGFjNF9kc2lfdmVyc2lvbiA9IG1CaXRSZWFkZXIuZ2V0Qml0cygzKTsKKyAgICBpZiAoYWM0X2RzaV92ZXJzaW9uID4gMSkgeworICAgICAgICBBTE9HRSgiZXJyb3Igd2hpbGUgcGFyc2luZyBhYy00IGRzaTogb25seSB2ZXJzaW9ucyAwIGFuZCAxIGFyZSBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIENIRUNLX0JJVFNfTEVGVCg3ICsgMSArIDQgKyA5KTsKKyAgICB1aW50MzJfdCBiaXRzdHJlYW1fdmVyc2lvbiA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg3KTsKKyAgICBtQml0UmVhZGVyLnNraXBCaXRzKDEpOyAvLyBmc19pbmRleAorICAgIG1CaXRSZWFkZXIuc2tpcEJpdHMoNCk7IC8vIGZyYW1lX3JhdGVfaW5kZXgKKyAgICB1aW50MzJfdCBuX3ByZXNlbnRhdGlvbnMgPSBtQml0UmVhZGVyLmdldEJpdHMoOSk7CisKKyAgICBpbnQzMl90IHNob3J0X3Byb2dyYW1faWQgPSAtMTsKKyAgICBpZiAoYml0c3RyZWFtX3ZlcnNpb24gPiAxKSB7CisgICAgICAgIGlmIChhYzRfZHNpX3ZlcnNpb24gPT0gMCl7CisgICAgICAgICAgICBBTE9HRSgiaW52YWxpZCBhYzQgZHNpIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICBib29sIGJfcHJvZ3JhbV9pZCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgIGlmIChiX3Byb2dyYW1faWQpIHsKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxNiArIDEpOworICAgICAgICAgICAgc2hvcnRfcHJvZ3JhbV9pZCA9IG1CaXRSZWFkZXIuZ2V0Qml0cygxNik7CisgICAgICAgICAgICBib29sIGJfdXVpZCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICBpZiAoYl91dWlkKSB7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qga0FDNFVVSURTaXplSW5CeXRlcyA9IDE2OworICAgICAgICAgICAgICAgIGNoYXIgcHJvZ3JhbV91dWlkW2tBQzRVVUlEU2l6ZUluQnl0ZXNdOworICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVChrQUM0VVVJRFNpemVJbkJ5dGVzICogOCk7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGtBQzRVVUlEU2l6ZUluQnl0ZXM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBwcm9ncmFtX3V1aWRbaV0gPSAoY2hhcikobUJpdFJlYWRlci5nZXRCaXRzKDgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoIlVVSUQgPSAlcyIsIHByb2dyYW1fdXVpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYWM0X2RzaV92ZXJzaW9uID09IDEpIHsKKyAgICAgICAgaWYgKCFwYXJzZUJpdHJhdGVEc2koKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEJZVEVfQUxJR047CisgICAgfQorCisgICAgZm9yICh1aW50MzJfdCBwcmVzZW50YXRpb24gPSAwOyBwcmVzZW50YXRpb24gPCBuX3ByZXNlbnRhdGlvbnM7IHByZXNlbnRhdGlvbisrKSB7CisgICAgICAgIG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbl0ubVByb2dyYW1JRCA9IHNob3J0X3Byb2dyYW1faWQ7CisgICAgICAgIC8vIGtub3duIGFzIGJfc2luZ2xlX3N1YnN0cmVhbSBpbiBhYzRfZHNpX3ZlcnNpb24gMAorICAgICAgICBib29sIGJfc2luZ2xlX3N1YnN0cmVhbV9ncm91cCA9IGZhbHNlOworICAgICAgICB1aW50MzJfdCBwcmVzZW50YXRpb25fY29uZmlnID0gMCwgcHJlc2VudGF0aW9uX3ZlcnNpb24gPSAwOworICAgICAgICB1aW50MzJfdCBwcmVzX2J5dGVzID0gMDsKKworICAgICAgICBpZiAoYWM0X2RzaV92ZXJzaW9uID09IDApIHsKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxICsgNSArIDUpOworICAgICAgICAgICAgYl9zaW5nbGVfc3Vic3RyZWFtX2dyb3VwID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgIHByZXNlbnRhdGlvbl9jb25maWcgPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgICAgICAgICBwcmVzZW50YXRpb25fdmVyc2lvbiA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg1KTsKKyAgICAgICAgfSBlbHNlIGlmIChhYzRfZHNpX3ZlcnNpb24gPT0gMSkgeworICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDggKyA4KTsKKyAgICAgICAgICAgIHByZXNlbnRhdGlvbl92ZXJzaW9uID0gbUJpdFJlYWRlci5nZXRCaXRzKDgpOworICAgICAgICAgICAgcHJlc19ieXRlcyA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg4KTsKKyAgICAgICAgICAgIGlmIChwcmVzX2J5dGVzID09IDB4ZmYpIHsKKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMTYpOworICAgICAgICAgICAgICAgIHByZXNfYnl0ZXMgKz0gbUJpdFJlYWRlci5nZXRCaXRzKDE2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCIldTogcHJlc19ieXRlcyA9ICV1XG4iLCBwcmVzZW50YXRpb24sIHByZXNfYnl0ZXMpOworICAgICAgICAgICAgaWYgKHByZXNlbnRhdGlvbl92ZXJzaW9uID4gMikgeworICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVChwcmVzX2J5dGVzICogOCk7CisgICAgICAgICAgICAgICAgbUJpdFJlYWRlci5za2lwQml0cyhwcmVzX2J5dGVzICogOCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBhYzRfcHJlc2VudGF0aW9uX3YwX2RzaSgpLCBhYzRfcHJlc2VudGF0aW9uX3YxX2RzaSgpIGFuZCBhYzRfcHJlc2VudGF0aW9uX3YyX2RzaSgpCisgICAgICAgICAgICAvLyBhbGwgc3RhcnQgd2l0aCBhIHByZXNlbnRhdGlvbl9jb25maWcgb2YgNSBiaXRzCisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoNSk7CisgICAgICAgICAgICBwcmVzZW50YXRpb25fY29uZmlnID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgICAgICAgICAgYl9zaW5nbGVfc3Vic3RyZWFtX2dyb3VwID0gKHByZXNlbnRhdGlvbl9jb25maWcgPT0gMHgxZik7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqUHJlc2VudGF0aW9uQ29uZmlnW10gPSB7CisgICAgICAgICAgICAiTXVzaWMmRWZmZWN0cyArIERpYWxvZyIsCisgICAgICAgICAgICAiTWFpbiArIERFIiwKKyAgICAgICAgICAgICJNYWluICsgQXNzb2NpYXRlIiwKKyAgICAgICAgICAgICJNdXNpYyZFZmZlY3RzICsgRGlhbG9nICsgQXNzb2NpYXRlIiwKKyAgICAgICAgICAgICJNYWluICsgREUgKyBBc3NvY2lhdGUiLAorICAgICAgICAgICAgIkFyYml0cmFyeSBzdWJzdHJlYW0gZ3JvdXBzIiwKKyAgICAgICAgICAgICJFTURGIG9ubHkiCisgICAgICAgIH07CisgICAgICAgIEFMT0dWKCIldTogYl9zaW5nbGVfc3Vic3RyZWFtL2dyb3VwID0gJXNcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgIEJPT0xTVFIoYl9zaW5nbGVfc3Vic3RyZWFtX2dyb3VwKSk7CisgICAgICAgIEFMT0dWKCIldTogcHJlc2VudGF0aW9uX3ZlcnNpb24gPSAldVxuIiwgcHJlc2VudGF0aW9uLCBwcmVzZW50YXRpb25fdmVyc2lvbik7CisgICAgICAgIEFMT0dWKCIldTogcHJlc2VudGF0aW9uX2NvbmZpZyA9ICV1ICglcylcbiIsIHByZXNlbnRhdGlvbiwgcHJlc2VudGF0aW9uX2NvbmZpZywKKyAgICAgICAgICAgIChwcmVzZW50YXRpb25fY29uZmlnID49IE5FTEVNKFByZXNlbnRhdGlvbkNvbmZpZykgPworICAgICAgICAgICAgInJlc2VydmVkIiA6IFByZXNlbnRhdGlvbkNvbmZpZ1twcmVzZW50YXRpb25fY29uZmlnXSkpOworCisgICAgICAgIC8qIHJlY29yZCBhIG1hcmtlciwgbGVzcyB0aGUgc2l6ZSBvZiB0aGUgcHJlc2VudGF0aW9uX2NvbmZpZyAqLworICAgICAgICB1aW50NjRfdCBzdGFydCA9IChtRFNJU2l6ZSAtIG1CaXRSZWFkZXIubnVtQml0c0xlZnQoKSkgLyA4OworCisgICAgICAgIGJvb2wgYl9hZGRfZW1kZl9zdWJzdHJlYW1zID0gZmFsc2U7CisgICAgICAgIGlmICghYl9zaW5nbGVfc3Vic3RyZWFtX2dyb3VwICYmIHByZXNlbnRhdGlvbl9jb25maWcgPT0gNikgeworICAgICAgICAgICAgYl9hZGRfZW1kZl9zdWJzdHJlYW1zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCIldTogYl9hZGRfZW1kZl9zdWJzdHJlYW1zID0gJXNcbiIsIHByZXNlbnRhdGlvbiwgQk9PTFNUUihiX2FkZF9lbWRmX3N1YnN0cmVhbXMpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgzICsgMSk7CisgICAgICAgICAgICB1aW50MzJfdCBtZGNvbXBhdCA9IG1CaXRSZWFkZXIuZ2V0Qml0cygzKTsKKyAgICAgICAgICAgIEFMT0dWKCIldTogbWRjb21wYXQgPSAlZFxuIiwgcHJlc2VudGF0aW9uLCBtZGNvbXBhdCk7CisKKyAgICAgICAgICAgIGJvb2wgYl9wcmVzZW50YXRpb25fZ3JvdXBfaW5kZXggPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgQUxPR1YoIiV1OiBiX3ByZXNlbnRhdGlvbl9ncm91cF9pbmRleCA9ICVzXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgQk9PTFNUUihiX3ByZXNlbnRhdGlvbl9ncm91cF9pbmRleCkpOworICAgICAgICAgICAgaWYgKGJfcHJlc2VudGF0aW9uX2dyb3VwX2luZGV4KSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDUpOworICAgICAgICAgICAgICAgIG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbl0ubUdyb3VwSW5kZXggPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBwcmVzZW50YXRpb25fZ3JvdXBfaW5kZXggPSAlZFxuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICBtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25dLm1Hcm91cEluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgyKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGRzaV9mcmFtZV9yYXRlX211bHRpcGx5X2luZm8gPSBtQml0UmVhZGVyLmdldEJpdHMoMik7CisgICAgICAgICAgICBBTE9HVigiJXU6IGRzaV9mcmFtZV9yYXRlX211bHRpcGx5X2luZm8gPSAlZFxuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgIGRzaV9mcmFtZV9yYXRlX211bHRpcGx5X2luZm8pOworICAgICAgICAgICAgaWYgKGFjNF9kc2lfdmVyc2lvbiA9PSAxICYmIChwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAxIHx8IHByZXNlbnRhdGlvbl92ZXJzaW9uID09IDIpKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDIpOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGRzaV9mcmFtZV9yYXRlX2ZyYWN0aW9uX2luZm8gPSBtQml0UmVhZGVyLmdldEJpdHMoMik7CisgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBkc2lfZnJhbWVfcmF0ZV9mcmFjdGlvbl9pbmZvID0gJWRcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgZHNpX2ZyYW1lX3JhdGVfZnJhY3Rpb25faW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoNSArIDEwKTsKKyAgICAgICAgICAgIHVpbnQzMl90IHByZXNlbnRhdGlvbl9lbWRmX3ZlcnNpb24gPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgICAgICAgICB1aW50MzJfdCBwcmVzZW50YXRpb25fa2V5X2lkID0gbUJpdFJlYWRlci5nZXRCaXRzKDEwKTsKKyAgICAgICAgICAgIEFMT0dWKCIldTogcHJlc2VudGF0aW9uX2VtZGZfdmVyc2lvbiA9ICVkXG4iLCBwcmVzZW50YXRpb24sIHByZXNlbnRhdGlvbl9lbWRmX3ZlcnNpb24pOworICAgICAgICAgICAgQUxPR1YoIiV1OiBwcmVzZW50YXRpb25fa2V5X2lkID0gJWRcbiIsIHByZXNlbnRhdGlvbiwgcHJlc2VudGF0aW9uX2tleV9pZCk7CisKKyAgICAgICAgICAgIGlmIChhYzRfZHNpX3ZlcnNpb24gPT0gMSkgeworICAgICAgICAgICAgICAgIGJvb2wgYl9wcmVzZW50YXRpb25fY2hhbm5lbF9jb2RlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJfcHJlc2VudGF0aW9uX2NoYW5uZWxfY29kZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgICAgICAgICAgICAgYl9wcmVzZW50YXRpb25fY2hhbm5lbF9jb2RlZCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCIldTogYl9wcmVzZW50YXRpb25fY2hhbm5lbF9jb2RlZCA9ICVzXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgIEJPT0xTVFIoYl9wcmVzZW50YXRpb25fY2hhbm5lbF9jb2RlZCkpOworICAgICAgICAgICAgICAgIGlmIChiX3ByZXNlbnRhdGlvbl9jaGFubmVsX2NvZGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAxIHx8IHByZXNlbnRhdGlvbl92ZXJzaW9uID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRzaV9wcmVzZW50YXRpb25fY2hfbW9kZSA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbl0ubUNoYW5uZWxNb2RlID0gZHNpX3ByZXNlbnRhdGlvbl9jaF9tb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBkc2lfcHJlc2VudGF0aW9uX2NoX21vZGUgPSAlZCAoJXMpXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHNpX3ByZXNlbnRhdGlvbl9jaF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzaV9wcmVzZW50YXRpb25fY2hfbW9kZSA8IE5FTEVNKENoYW5uZWxNb2RlcykgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWxNb2Rlc1tkc2lfcHJlc2VudGF0aW9uX2NoX21vZGVdIDogInJlc2VydmVkIik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkc2lfcHJlc2VudGF0aW9uX2NoX21vZGUgPj0gMTEgJiYgZHNpX3ByZXNlbnRhdGlvbl9jaF9tb2RlIDw9IDE0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEgKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVzX2JfNF9iYWNrX2NoYW5uZWxzX3ByZXNlbnQgPSBtQml0UmVhZGVyLmdldEJpdHMoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlc190b3BfY2hhbm5lbF9wYWlycyA9IG1CaXRSZWFkZXIuZ2V0Qml0cygyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXU6IHByZXNfYl80X2JhY2tfY2hhbm5lbHNfcHJlc2VudCA9ICVzXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0xTVFIocHJlc19iXzRfYmFja19jaGFubmVsc19wcmVzZW50KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBwcmVzX3RvcF9jaGFubmVsX3BhaXJzID0gJWRcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc190b3BfY2hhbm5lbF9wYWlycyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gcHJlc2VudGF0aW9uX2NoYW5uZWxfbWFzayBpbiBhYzRfcHJlc2VudGF0aW9uX3YwX2RzaSgpCisgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgyNCk7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZXNlbnRhdGlvbl9jaGFubmVsX21hc2tfdjEgPSBtQml0UmVhZGVyLmdldEJpdHMoMjQpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXU6IHByZXNlbnRhdGlvbl9jaGFubmVsX21hc2tfdjEgPSAweCUwNnhcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbl9jaGFubmVsX21hc2tfdjEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMSB8fCBwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBiX3ByZXNlbnRhdGlvbl9jb3JlX2RpZmZlcnMgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXU6IGJfcHJlc2VudGF0aW9uX2NvcmVfZGlmZmVycyA9ICVzXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBCT09MU1RSKGJfcHJlc2VudGF0aW9uX2NvcmVfZGlmZmVycykpOworICAgICAgICAgICAgICAgICAgICBpZiAoYl9wcmVzZW50YXRpb25fY29yZV9kaWZmZXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfcHJlc2VudGF0aW9uX2NvcmVfY2hhbm5lbF9jb2RlZCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYl9wcmVzZW50YXRpb25fY29yZV9jaGFubmVsX2NvZGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CaXRSZWFkZXIuc2tpcEJpdHMoMik7IC8vIGRzaV9wcmVzZW50YXRpb25fY2hhbm5lbF9tb2RlX2NvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9wcmVzZW50YXRpb25fZmlsdGVyID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBiX3ByZXNlbnRhdGlvbl9maWx0ZXIgPSAlc1xuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgQk9PTFNUUihiX3ByZXNlbnRhdGlvbl9maWx0ZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJfcHJlc2VudGF0aW9uX2ZpbHRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEgKyA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9lbmFibGVfcHJlc2VudGF0aW9uID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYl9lbmFibGVfcHJlc2VudGF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uXS5tRW5hYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBiX2VuYWJsZV9wcmVzZW50YXRpb24gPSAlc1xuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0xTVFIoYl9lbmFibGVfcHJlc2VudGF0aW9uKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuX2ZpbHRlcl9ieXRlcyA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVChuX2ZpbHRlcl9ieXRlcyAqIDgpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG5fZmlsdGVyX2J5dGVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQml0UmVhZGVyLnNraXBCaXRzKDgpOyAvLyBmaWx0ZXJfZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAvKiBhYzRfZHNpX3ZlcnNpb24gPT0gMSAqLworCisgICAgICAgICAgICBpZiAoYl9zaW5nbGVfc3Vic3RyZWFtX2dyb3VwKSB7CisgICAgICAgICAgICAgICAgaWYgKHByZXNlbnRhdGlvbl92ZXJzaW9uID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbURTSShwcmVzZW50YXRpb24sIDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtR3JvdXBEU0kocHJlc2VudGF0aW9uLCAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoYWM0X2RzaV92ZXJzaW9uID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICAgICAgICAgICAgICBib29sIGJfbXVsdGlfcGlkID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBiX211bHRpX3BpZCA9ICVzXG4iLCBwcmVzZW50YXRpb24sIEJPT0xTVFIoYl9tdWx0aV9waWQpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9oc2ZfZXh0ID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBiX2hzZl9leHQgPSAlc1xuIiwgcHJlc2VudGF0aW9uLCBCT09MU1RSKGJfaHNmX2V4dCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHByZXNlbnRhdGlvbl9jb25maWcpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZXNlbnRhdGlvbl92ZXJzaW9uID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1EU0kocHJlc2VudGF0aW9uLCAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1EU0kocHJlc2VudGF0aW9uLCAxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1Hcm91cERTSShwcmVzZW50YXRpb24sIDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbUdyb3VwRFNJKHByZXNlbnRhdGlvbiwgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZXNlbnRhdGlvbl92ZXJzaW9uID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1EU0kocHJlc2VudGF0aW9uLCAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1EU0kocHJlc2VudGF0aW9uLCAxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1EU0kocHJlc2VudGF0aW9uLCAyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1Hcm91cERTSShwcmVzZW50YXRpb24sIDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbUdyb3VwRFNJKHByZXNlbnRhdGlvbiwgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtR3JvdXBEU0kocHJlc2VudGF0aW9uLCAyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtRFNJKHByZXNlbnRhdGlvbiwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMyk7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuX3N1YnN0cmVhbV9ncm91cHNfbWludXMyID0gbUJpdFJlYWRlci5nZXRCaXRzKDMpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBuX3N1YnN0cmVhbV9ncm91cHNfbWludXMyID0gJWRcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuX3N1YnN0cmVhbV9ncm91cHNfbWludXMyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3Qgc2cgPSAwOyBzZyA8IG5fc3Vic3RyZWFtX2dyb3Vwc19taW51czIgKyAyOyBzZysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbUdyb3VwRFNJKHByZXNlbnRhdGlvbiwgc2cpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDcpOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuX3NraXBfYnl0ZXMgPSBtQml0UmVhZGVyLmdldEJpdHMoNyk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVChuX3NraXBfYnl0ZXMgKiA4KQorICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgbl9za2lwX2J5dGVzOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CaXRSZWFkZXIuZ2V0Qml0cyg4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEgKyAxKTsKKyAgICAgICAgICAgICAgICBib29sIGJfcHJlX3ZpcnR1YWxpemVkID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICBtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25dLm1QcmVWaXJ0dWFsaXplZCA9IGJfcHJlX3ZpcnR1YWxpemVkOworICAgICAgICAgICAgICAgIGJfYWRkX2VtZGZfc3Vic3RyZWFtcyA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBiX3ByZV92aXJ0dWFsaXplZCA9ICVzXG4iLCBwcmVzZW50YXRpb24sIEJPT0xTVFIoYl9wcmVfdmlydHVhbGl6ZWQpKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXU6IGJfYWRkX2VtZGZfc3Vic3RyZWFtcyA9ICVzXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgIEJPT0xTVFIoYl9hZGRfZW1kZl9zdWJzdHJlYW1zKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJfYWRkX2VtZGZfc3Vic3RyZWFtcykgeworICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDcpOworICAgICAgICAgICAgdWludDMyX3Qgbl9hZGRfZW1kZl9zdWJzdHJlYW1zID0gbUJpdFJlYWRlci5nZXRCaXRzKDcpOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IG5fYWRkX2VtZGZfc3Vic3RyZWFtczsgaisrKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDUgKyAxMCk7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgc3Vic3RyZWFtX2VtZGZfdmVyc2lvbiA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg1KTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzdWJzdHJlYW1fa2V5X2lkID0gbUJpdFJlYWRlci5nZXRCaXRzKDEwKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXU6IGVtZGZfc3Vic3RyZWFtWyVkXTogdmVyc2lvbj0lZCwga2V5X2lkPSVkXG4iLCBwcmVzZW50YXRpb24sIGosCisgICAgICAgICAgICAgICAgICAgIHN1YnN0cmVhbV9lbWRmX3ZlcnNpb24sIHN1YnN0cmVhbV9rZXlfaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYm9vbCBiX3ByZXNlbnRhdGlvbl9iaXRyYXRlX2luZm8gPSBmYWxzZTsKKyAgICAgICAgaWYgKHByZXNlbnRhdGlvbl92ZXJzaW9uID4gMCkgeworICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICAgICAgYl9wcmVzZW50YXRpb25fYml0cmF0ZV9pbmZvID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJiX3ByZXNlbnRhdGlvbl9iaXRyYXRlX2luZm8gPSAlc1xuIiwgQk9PTFNUUihiX3ByZXNlbnRhdGlvbl9iaXRyYXRlX2luZm8pKTsKKyAgICAgICAgaWYgKGJfcHJlc2VudGF0aW9uX2JpdHJhdGVfaW5mbykgeworICAgICAgICAgICAgaWYgKCFwYXJzZUJpdHJhdGVEc2koKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA+IDApIHsKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgICAgIGJvb2wgYl9hbHRlcm5hdGl2ZSA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICBBTE9HVigiYl9hbHRlcm5hdGl2ZSA9ICVzXG4iLCBCT09MU1RSKGJfYWx0ZXJuYXRpdmUpKTsKKyAgICAgICAgICAgIGlmIChiX2FsdGVybmF0aXZlKSB7CisgICAgICAgICAgICAgICAgQllURV9BTElHTjsKKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMTYpOworICAgICAgICAgICAgICAgIHVpbnQzMl90IG5hbWVfbGVuID0gbUJpdFJlYWRlci5nZXRCaXRzKDE2KTsKKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQobmFtZV9sZW4gKiA4KTsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmcHJlc2VudGF0aW9uX25hbWUgPQorICAgICAgICAgICAgICAgICAgICBtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25dLm1EZXNjcmlwdGlvbjsKKyAgICAgICAgICAgICAgICBwcmVzZW50YXRpb25fbmFtZS5jbGVhcigpOworICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbl9uYW1lLnJlc2l6ZShuYW1lX2xlbik7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG5hbWVfbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uX25hbWVbaV0gPSAoY2hhcikobUJpdFJlYWRlci5nZXRCaXRzKDgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDUpOworICAgICAgICAgICAgICAgIHVpbnQzMl90IG5fdGFyZ2V0cyA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg1KTsKKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQobl90YXJnZXRzICogKDMgKyA4KSk7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG5fdGFyZ2V0czsgaSsrKXsKKyAgICAgICAgICAgICAgICAgICAgbUJpdFJlYWRlci5za2lwQml0cygzKTsgLy8gdGFyZ2V0X21kX2NvbXBhdAorICAgICAgICAgICAgICAgICAgICBtQml0UmVhZGVyLnNraXBCaXRzKDgpOyAvLyB0YXJnZXRfZGV2aWNlX2NhdGVnb3J5CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQllURV9BTElHTjsKKworICAgICAgICBpZiAoYWM0X2RzaV92ZXJzaW9uID09IDEpIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IGVuZCA9IChtRFNJU2l6ZSAtIG1CaXRSZWFkZXIubnVtQml0c0xlZnQoKSkgLyA4OworICAgICAgICAgICAgaWYgKG1CaXRSZWFkZXIubnVtQml0c0xlZnQoKSAlIDggIT0gMCkgeworICAgICAgICAgICAgICAgIGVuZCArPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50NjRfdCBwcmVzZW50YXRpb25fYnl0ZXMgPSBlbmQgLSBzdGFydDsKKyAgICAgICAgICAgIHVpbnQ2NF90IHNraXBfYnl0ZXMgPSBwcmVzX2J5dGVzIC0gcHJlc2VudGF0aW9uX2J5dGVzOworICAgICAgICAgICAgQUxPR1YoInNraXBwaW5nID0gJSIgUFJJdTY0ICIgYnl0ZXMiLCBza2lwX2J5dGVzKTsKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVChza2lwX2J5dGVzICogOCk7CisgICAgICAgICAgICBtQml0UmVhZGVyLnNraXBCaXRzKHNraXBfYnl0ZXMgKiA4KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdlIHNob3VsZCBrbm93IHRoaXMgb3Igc29tZXRoaW5nIGlzIHByb2JhYmx5IHdyb25nCisgICAgICAgIC8vIHdpdGggdGhlIGJpdHN0cmVhbSAob3Igd2UgZG9uJ3Qgc3VwcG9ydCBpdCkKKyAgICAgICAgaWYgKG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbl0ubUNoYW5uZWxNb2RlID09IC0xKXsKKyAgICAgICAgICAgIEFMT0dFKCJjb3VsZCBub3QgZGV0ZXJtaW5nIGNoYW5uZWwgbW9kZSBvZiBwcmVzZW50YXRpb24gJWQiLCBwcmVzZW50YXRpb24pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfSAvKiBlYWNoIHByZXNlbnRhdGlvbiAqLworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK307CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9BQzRQYXJzZXIuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FDNFBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYjZlMzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9BQzRQYXJzZXIuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQUM0X1BBUlNFUl9IXworI2RlZmluZSBBQzRfUEFSU0VSX0hfCisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBBQzRQYXJzZXIgeworcHVibGljOgorICAgIEFDNFBhcnNlcigpOworICAgIHZpcnR1YWwgfkFDNFBhcnNlcigpIHsgfQorCisgICAgdmlydHVhbCBib29sIHBhcnNlKCkgPSAwOworCisgICAgc3RydWN0IEFDNFByZXNlbnRhdGlvbiB7CisgICAgICAgIGludDMyX3QgbUNoYW5uZWxNb2RlID0gLTE7CisgICAgICAgIGludDMyX3QgbVByb2dyYW1JRCA9IC0xOworICAgICAgICBpbnQzMl90IG1Hcm91cEluZGV4ID0gLTE7CisKKyAgICAgICAgLy8gVFMgMTAzIDE5MC0xIHYxLjIuMSA0LjMuMy44LjEKKyAgICAgICAgZW51bSBDb250ZW50Q2xhc3NpZmllcnMgeworICAgICAgICAgICAga0NvbXBsZXRlTWFpbiwKKyAgICAgICAgICAgIGtNdXNpY0FuZEVmZmVjdHMsCisgICAgICAgICAgICBrVmlzdWFsbHlJbXBhaXJlZCwKKyAgICAgICAgICAgIGtIZWFyaW5nSW1wYWlyZWQsCisgICAgICAgICAgICBrRGlhbG9nLAorICAgICAgICAgICAga0NvbW1lbnRhcnksCisgICAgICAgICAgICBrRW1lcmdlbmN5LAorICAgICAgICAgICAga1ZvaWNlT3ZlcgorICAgICAgICB9OworCisgICAgICAgIHVpbnQzMl90IG1Db250ZW50Q2xhc3NpZmllciA9IGtDb21wbGV0ZU1haW47CisKKyAgICAgICAgLy8gRVRTSSBUUyAxMDMgMTkwLTIgVjEuMS4xICgyMDE1LTA5KSBUYWJsZSA3OTogY2hhbm5lbF9tb2RlCisgICAgICAgIGVudW0gSW5wdXRDaGFubmVsTW9kZSB7CisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfTW9ubywKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV9TdGVyZW8sCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfM18wLAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzVfMCwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV81XzEsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfN18wXzM0LAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzdfMV8zNCwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV83XzBfNTIsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfN18xXzUyLAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzdfMF8zMjIsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfN18xXzMyMiwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV83XzBfNCwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV83XzFfNCwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV85XzBfNCwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV85XzFfNCwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV8yMl8yLAorICAgICAgICAgICAga0NoYW5uZWxNb2RlX1Jlc2VydmVkLAorICAgICAgICB9OworCisgICAgICAgIGJvb2wgbUhhc0RpYWxvZ0VuaGFuY2VtZW50cyA9IGZhbHNlOworICAgICAgICBib29sIG1QcmVWaXJ0dWFsaXplZCA9IGZhbHNlOworICAgICAgICBib29sIG1FbmFibGVkID0gdHJ1ZTsKKworICAgICAgICBzdGQ6OnN0cmluZyBtTGFuZ3VhZ2U7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1EZXNjcmlwdGlvbjsKKyAgICB9OworICAgIHR5cGVkZWYgc3RkOjptYXA8dWludDMyX3QsIEFDNFByZXNlbnRhdGlvbj4gQUM0UHJlc2VudGF0aW9uczsKKworICAgIGNvbnN0IEFDNFByZXNlbnRhdGlvbnMmIGdldFByZXNlbnRhdGlvbnMoKSBjb25zdCB7IHJldHVybiBtUHJlc2VudGF0aW9uczsgfQorCitwcm90ZWN0ZWQ6CisgICAgQUM0UHJlc2VudGF0aW9ucyBtUHJlc2VudGF0aW9uczsKK307CisKK2NsYXNzIEFDNERTSVBhcnNlcjogcHVibGljIEFDNFBhcnNlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQUM0RFNJUGFyc2VyKEFCaXRSZWFkZXIgJmJyKTsKKyAgICB2aXJ0dWFsIH5BQzREU0lQYXJzZXIoKSB7IH0KKworICAgIGJvb2wgcGFyc2UoKTsKKworcHJpdmF0ZToKKyAgICBib29sIHBhcnNlU3Vic3RyZWFtRFNJKHVpbnQzMl90IHByZXNlbnRhdGlvbklELCB1aW50MzJfdCBzdWJzdHJlYW1JRCk7CisgICAgYm9vbCBwYXJzZVN1YnN0cmVhbUdyb3VwRFNJKHVpbnQzMl90IHByZXNlbnRhdGlvbklELCB1aW50MzJfdCBncm91cElEKTsKKyAgICBib29sIHBhcnNlTGFuZ3VhZ2VUYWcodWludDMyX3QgcHJlc2VudGF0aW9uSUQsIHVpbnQzMl90IHN1YnN0cmVhbUlEKTsKKyAgICBib29sIHBhcnNlQml0cmF0ZURzaSgpOworCisgICAgdWludDY0X3QgbURTSVNpemU7CisgICAgQUJpdFJlYWRlciYgbUJpdFJlYWRlcjsKK307CisKK307CisKKyNlbmRpZiAgLy8gQUM0X1BBUlNFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FuZHJvaWQuYnAKaW5kZXggZjMxNmRmNi4uMWIzMDhhYSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9BbmRyb2lkLmJwCkBAIC0yLDYgKzIsNyBAQAogICAgIG5hbWU6ICJsaWJtcDRleHRyYWN0b3JfZGVmYXVsdHMiLAogCiAgICAgc3JjczogWworICAgICAgICAiQUM0UGFyc2VyLmNwcCIsCiAgICAgICAgICJJdGVtVGFibGUuY3BwIiwKICAgICAgICAgIk1QRUc0RXh0cmFjdG9yLmNwcCIsCiAgICAgICAgICJTYW1wbGVJdGVyYXRvci5jcHAiLApAQCAtMTQsNyArMTUsNyBAQAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYW5kayIKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuY3BwCmluZGV4IGNhOWRlYWIuLjU1YTBjNDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmNwcApAQCAtMTgsNyArMTgsOCBAQAogI2RlZmluZSBMT0dfVEFHICJJdGVtVGFibGUiCiAKICNpbmNsdWRlIDxJdGVtVGFibGUuaD4KLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CkBAIC05Miw3ICs5Myw3IEBACiAKIHN0cnVjdCBCb3ggewogcHJvdGVjdGVkOgotICAgIEJveChEYXRhU291cmNlQmFzZSAqc291cmNlLCB1aW50MzJfdCB0eXBlKSA6CisgICAgQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgdWludDMyX3QgdHlwZSkgOgogICAgICAgICBtRGF0YVNvdXJjZShzb3VyY2UpLCBtVHlwZSh0eXBlKSB7fQogCiAgICAgdmlydHVhbCB+Qm94KCkge30KQEAgLTEwNCwxNCArMTA1LDE0IEBACiAKICAgICBpbmxpbmUgdWludDMyX3QgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1UeXBlOyB9CiAKLSAgICBpbmxpbmUgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIG1EYXRhU291cmNlOyB9CisgICAgaW5saW5lIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIG1EYXRhU291cmNlOyB9CiAKICAgICBzdGF0dXNfdCBwYXJzZUNodW5rKG9mZjY0X3QgKm9mZnNldCk7CiAKICAgICBzdGF0dXNfdCBwYXJzZUNodW5rcyhvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICB1aW50MzJfdCBtVHlwZTsKIH07CiAKQEAgLTE4Niw3ICsxODcsNyBAQAogCiBzdHJ1Y3QgRnVsbEJveCA6IHB1YmxpYyBCb3ggewogcHJvdGVjdGVkOgotICAgIEZ1bGxCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgdWludDMyX3QgdHlwZSkgOgorICAgIEZ1bGxCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCB1aW50MzJfdCB0eXBlKSA6CiAgICAgICAgIEJveChzb3VyY2UsIHR5cGUpLCBtVmVyc2lvbigwKSwgbUZsYWdzKDApIHt9CiAKICAgICBpbmxpbmUgdWludDhfdCB2ZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gbVZlcnNpb247IH0KQEAgLTIyMSw3ICsyMjIsNyBAQAogLy8KIAogc3RydWN0IFBpdG1Cb3ggOiBwdWJsaWMgRnVsbEJveCB7Ci0gICAgUGl0bUJveChEYXRhU291cmNlQmFzZSAqc291cmNlKSA6CisgICAgUGl0bUJveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UpIDoKICAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygncCcsICdpJywgJ3QnLCAnbScpKSB7fQogCiAgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCB1aW50MzJfdCAqcHJpbWFyeUl0ZW1JZCk7CkBAIC0zMDEsNyArMzAyLDcgQEAKIH07CiAKIHN0cnVjdCBJbG9jQm94IDogcHVibGljIEZ1bGxCb3ggewotICAgIElsb2NCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgS2V5ZWRWZWN0b3I8dWludDMyX3QsIEl0ZW1Mb2M+ICppdGVtTG9jcykgOgorICAgIElsb2NCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBLZXllZFZlY3Rvcjx1aW50MzJfdCwgSXRlbUxvYz4gKml0ZW1Mb2NzKSA6CiAgICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoJ2knLCAnbCcsICdvJywgJ2MnKSksCiAgICAgICAgIG1JdGVtTG9jcyhpdGVtTG9jcyksIG1IYXNDb25zdHJ1Y3RNZXRob2QxKGZhbHNlKSB7fQogCkBAIC00NzEsNyArNDcyLDcgQEAKIC8vCiAKIHN0cnVjdCBJdGVtUmVmZXJlbmNlIDogcHVibGljIEJveCwgcHVibGljIFJlZkJhc2UgewotICAgIEl0ZW1SZWZlcmVuY2UoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgdWludDMyX3QgdHlwZSwgdWludDMyX3QgaXRlbUlkU2l6ZSkgOgorICAgIEl0ZW1SZWZlcmVuY2UoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCB1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBpdGVtSWRTaXplKSA6CiAgICAgICAgIEJveChzb3VyY2UsIHR5cGUpLCBtSXRlbUlkKDApLCBtUmVmSWRTaXplKGl0ZW1JZFNpemUpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwpAQCAtNjI2LDcgKzYyNyw3IEBACiB9CiAKIHN0cnVjdCBJcmVmQm94IDogcHVibGljIEZ1bGxCb3ggewotICAgIElyZWZCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgVmVjdG9yPHNwPEl0ZW1SZWZlcmVuY2U+ID4gKml0ZW1SZWZzKSA6CisgICAgSXJlZkJveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIFZlY3RvcjxzcDxJdGVtUmVmZXJlbmNlPiA+ICppdGVtUmVmcykgOgogICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ3InLCAnZScsICdmJykpLCBtUmVmSWRTaXplKDApLCBtSXRlbVJlZnMoaXRlbVJlZnMpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwpAQCAtNjg4LDcgKzY4OSw3IEBACiB9OwogCiBzdHJ1Y3QgSXNwZUJveCA6IHB1YmxpYyBGdWxsQm94LCBwdWJsaWMgSXRlbVByb3BlcnR5IHsKLSAgICBJc3BlQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIDoKKyAgICBJc3BlQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkgOgogICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ3MnLCAncCcsICdlJykpLCBtV2lkdGgoMCksIG1IZWlnaHQoMCkge30KIAogICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CkBAIC03MjQsNyArNzI1LDcgQEAKIH0KIAogc3RydWN0IEh2Y2NCb3ggOiBwdWJsaWMgQm94LCBwdWJsaWMgSXRlbVByb3BlcnR5IHsKLSAgICBIdmNjQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIDoKKyAgICBIdmNjQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkgOgogICAgICAgICBCb3goc291cmNlLCBGT1VSQ0MoJ2gnLCAndicsICdjJywgJ0MnKSkge30KIAogICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CkBAIC03NTcsNyArNzU4LDcgQEAKIH0KIAogc3RydWN0IElyb3RCb3ggOiBwdWJsaWMgQm94LCBwdWJsaWMgSXRlbVByb3BlcnR5IHsKLSAgICBJcm90Qm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIDoKKyAgICBJcm90Qm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkgOgogICAgICAgICBCb3goc291cmNlLCBGT1VSQ0MoJ2knLCAncicsICdvJywgJ3QnKSksIG1BbmdsZSgwKSB7fQogCiAgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKQEAgLTc4Niw3ICs3ODcsNyBAQAogfQogCiBzdHJ1Y3QgQ29sckJveCA6IHB1YmxpYyBCb3gsIHB1YmxpYyBJdGVtUHJvcGVydHkgewotICAgIENvbHJCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkgOgorICAgIENvbHJCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKSA6CiAgICAgICAgIEJveChzb3VyY2UsIEZPVVJDQygnYycsICdvJywgJ2wnLCAncicpKSB7fQogCiAgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKQEAgLTgzNCw3ICs4MzUsNyBAQAogfQogCiBzdHJ1Y3QgSXBtYUJveCA6IHB1YmxpYyBGdWxsQm94IHsKLSAgICBJcG1hQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIFZlY3RvcjxBc3NvY2lhdGlvbkVudHJ5PiAqYXNzb2NpYXRpb25zKSA6CisgICAgSXBtYUJveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIFZlY3RvcjxBc3NvY2lhdGlvbkVudHJ5PiAqYXNzb2NpYXRpb25zKSA6CiAgICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoJ2knLCAncCcsICdtJywgJ2EnKSksIG1Bc3NvY2lhdGlvbnMoYXNzb2NpYXRpb25zKSB7fQogCiAgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKQEAgLTkwOCw3ICs5MDksNyBAQAogfQogCiBzdHJ1Y3QgSXBjb0JveCA6IHB1YmxpYyBCb3ggewotICAgIElwY29Cb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgVmVjdG9yPHNwPEl0ZW1Qcm9wZXJ0eT4gPiAqcHJvcGVydGllcykgOgorICAgIElwY29Cb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBWZWN0b3I8c3A8SXRlbVByb3BlcnR5PiA+ICpwcm9wZXJ0aWVzKSA6CiAgICAgICAgIEJveChzb3VyY2UsIEZPVVJDQygnaScsICdwJywgJ2MnLCAnbycpKSwgbUl0ZW1Qcm9wZXJ0aWVzKHByb3BlcnRpZXMpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwpAQCAtOTY1LDcgKzk2Niw3IEBACiB9CiAKIHN0cnVjdCBJcHJwQm94IDogcHVibGljIEJveCB7Ci0gICAgSXBycEJveChEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgIElwcnBCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAogICAgICAgICAgICAgVmVjdG9yPHNwPEl0ZW1Qcm9wZXJ0eT4gPiAqcHJvcGVydGllcywKICAgICAgICAgICAgIFZlY3RvcjxBc3NvY2lhdGlvbkVudHJ5PiAqYXNzb2NpYXRpb25zKSA6CiAgICAgICAgIEJveChzb3VyY2UsIEZPVVJDQygnaScsICdwJywgJ3InLCAncCcpKSwKQEAgLTEwMjIsNyArMTAyMyw3IEBACiB9OwogCiBzdHJ1Y3QgSW5mZUJveCA6IHB1YmxpYyBGdWxsQm94IHsKLSAgICBJbmZlQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIDoKKyAgICBJbmZlQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkgOgogICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ24nLCAnZicsICdlJykpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUsIEl0ZW1JbmZvICppdGVtSW5mbyk7CkBAIC0xMTI3LDcgKzExMjgsNyBAQAogfQogCiBzdHJ1Y3QgSWluZkJveCA6IHB1YmxpYyBGdWxsQm94IHsKLSAgICBJaW5mQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIFZlY3RvcjxJdGVtSW5mbz4gKml0ZW1JbmZvcykgOgorICAgIElpbmZCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBWZWN0b3I8SXRlbUluZm8+ICppdGVtSW5mb3MpIDoKICAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygnaScsICdpJywgJ24nLCAnZicpKSwKICAgICAgICAgbUl0ZW1JbmZvcyhpdGVtSW5mb3MpLCBtSGFzR3JpZHMoZmFsc2UpIHt9CiAKQEAgLTExOTYsNyArMTE5Nyw3IEBACiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1JdGVtVGFibGU6Okl0ZW1UYWJsZShEYXRhU291cmNlQmFzZSAqc291cmNlKQorSXRlbVRhYmxlOjpJdGVtVGFibGUoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1QcmltYXJ5SXRlbUlkKDApLAogICAgICAgbUlkYXRPZmZzZXQoMCksCkBAIC0xNDc2LDcgKzE0NzcsNyBAQAogICAgIHJldHVybiBtSW1hZ2VJdGVtc1ZhbGlkID8gbURpc3BsYXlhYmxlcy5zaXplKCkgOiAwOwogfQogCi1zcDxNZXRhRGF0YT4gSXRlbVRhYmxlOjpnZXRJbWFnZU1ldGEoY29uc3QgdWludDMyX3QgaW1hZ2VJbmRleCkgeworQU1lZGlhRm9ybWF0ICpJdGVtVGFibGU6OmdldEltYWdlTWV0YShjb25zdCB1aW50MzJfdCBpbWFnZUluZGV4KSB7CiAgICAgaWYgKCFtSW1hZ2VJdGVtc1ZhbGlkKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTE1MDEsNjQgKzE1MDIsNzkgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpOworICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDKTsKIAogICAgIGlmIChpbWFnZS0+aXRlbUlkID09IG1QcmltYXJ5SXRlbUlkKSB7Ci0gICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlUcmFja0lzRGVmYXVsdCwgMSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX0RFRkFVTFQsIDEpOwogICAgIH0KIAogICAgIEFMT0dWKCJpbWFnZVsldV06IHNpemUgJWR4JWQiLCBpbWFnZUluZGV4LCBpbWFnZS0+d2lkdGgsIGltYWdlLT5oZWlnaHQpOwogCi0gICAgbWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCBpbWFnZS0+d2lkdGgpOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGltYWdlLT5oZWlnaHQpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCBpbWFnZS0+d2lkdGgpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwgaW1hZ2UtPmhlaWdodCk7CiAgICAgaWYgKGltYWdlLT5yb3RhdGlvbiAhPSAwKSB7CiAgICAgICAgIC8vIFJvdGF0aW9uIGFuZ2xlIGluIEhFSUYgaXMgQ0NXLCBjb252ZXJ0IHRvIENXIGhlcmUgdG8gYmUKICAgICAgICAgLy8gY29uc2lzdGVudCB3aXRoIHRoZSBvdGhlciBtZWRpYSBmb3JtYXRzLgogICAgICAgICBzd2l0Y2goaW1hZ2UtPnJvdGF0aW9uKSB7Ci0gICAgICAgICAgICBjYXNlIDkwOiBtZXRhLT5zZXRJbnQzMihrS2V5Um90YXRpb24sIDI3MCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxODA6IG1ldGEtPnNldEludDMyKGtLZXlSb3RhdGlvbiwgMTgwKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI3MDogbWV0YS0+c2V0SW50MzIoa0tleVJvdGF0aW9uLCA5MCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA5MDoKKyAgICAgICAgICAgIGNhc2UgMTgwOgorICAgICAgICAgICAgY2FzZSAyNzA6CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfUk9UQVRJT04sIDM2MCAtIGltYWdlLT5yb3RhdGlvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OiBicmVhazsgLy8gZG9uJ3Qgc2V0IGlmIGludmFsaWQKICAgICAgICAgfQogICAgIH0KLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBpbWFnZS0+d2lkdGggKiBpbWFnZS0+aGVpZ2h0ICogMS41KTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsIGltYWdlLT53aWR0aCAqIGltYWdlLT5oZWlnaHQgKiAxLjUpOwogCiAgICAgaWYgKCFpbWFnZS0+dGh1bWJuYWlscy5lbXB0eSgpKSB7CiAgICAgICAgIHNzaXplX3QgdGh1bWJJdGVtSW5kZXggPSBtSXRlbUlkVG9JdGVtTWFwLmluZGV4T2ZLZXkoaW1hZ2UtPnRodW1ibmFpbHNbMF0pOwogICAgICAgICBpZiAodGh1bWJJdGVtSW5kZXggPj0gMCkgewogICAgICAgICAgICAgY29uc3QgSW1hZ2VJdGVtICZ0aHVtYm5haWwgPSBtSXRlbUlkVG9JdGVtTWFwW3RodW1iSXRlbUluZGV4XTsKIAotICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVRodW1ibmFpbFdpZHRoLCB0aHVtYm5haWwud2lkdGgpOwotICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVRodW1ibmFpbEhlaWdodCwgdGh1bWJuYWlsLmhlaWdodCk7Ci0gICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlUaHVtYm5haWxIVkNDLCBrVHlwZUhWQ0MsCi0gICAgICAgICAgICAgICAgICAgIHRodW1ibmFpbC5odmNjLT5kYXRhKCksIHRodW1ibmFpbC5odmNjLT5zaXplKCkpOwotICAgICAgICAgICAgQUxPR1YoImltYWdlWyV1XTogdGh1bWJuYWlsOiBzaXplICVkeCVkLCBpdGVtIGluZGV4ICV6ZCIsCi0gICAgICAgICAgICAgICAgICAgIGltYWdlSW5kZXgsIHRodW1ibmFpbC53aWR0aCwgdGh1bWJuYWlsLmhlaWdodCwgdGh1bWJJdGVtSW5kZXgpOworICAgICAgICAgICAgaWYgKHRodW1ibmFpbC5odmNjICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1dJRFRILCB0aHVtYm5haWwud2lkdGgpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfSEVJR0hULCB0aHVtYm5haWwuaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF9IRVZDLCB0aHVtYm5haWwuaHZjYy0+ZGF0YSgpLCB0aHVtYm5haWwuaHZjYy0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiaW1hZ2VbJXVdOiB0aHVtYm5haWw6IHNpemUgJWR4JWQsIGl0ZW0gaW5kZXggJXpkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5kZXgsIHRodW1ibmFpbC53aWR0aCwgdGh1bWJuYWlsLmhlaWdodCwgdGh1bWJJdGVtSW5kZXgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXM6IHRodW1ibmFpbCBkYXRhIGlzIG1pc3NpbmcgZm9yIGltYWdlWyV1XSEiLCBfX0ZVTkNUSU9OX18sIGltYWdlSW5kZXgpOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR1coIiVzOiBSZWZlcmVuY2VkIHRodW1ibmFpbCBkb2VzIG5vdCBleGlzdCEiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKGltYWdlLT5pc0dyaWQoKSkgewotICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5R3JpZFJvd3MsIGltYWdlLT5yb3dzKTsKLSAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUdyaWRDb2xzLCBpbWFnZS0+Y29sdW1ucyk7Ci0KKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9HUklEX1JPV1MsIGltYWdlLT5yb3dzKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9HUklEX0NPTFVNTlMsIGltYWdlLT5jb2x1bW5zKTsKICAgICAgICAgLy8gcG9pbnQgaW1hZ2UgdG8gdGhlIGZpcnN0IHRpbGUgZm9yIGdyaWQgc2l6ZSBhbmQgSFZDQwogICAgICAgICBpbWFnZSA9ICZtSXRlbUlkVG9JdGVtTWFwLmVkaXRWYWx1ZUF0KHRpbGVJdGVtSW5kZXgpOwotICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VGlsZVdpZHRoLCBpbWFnZS0+d2lkdGgpOwotICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VGlsZUhlaWdodCwgaW1hZ2UtPmhlaWdodCk7Ci0gICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIGltYWdlLT53aWR0aCAqIGltYWdlLT5oZWlnaHQgKiAxLjUpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RJTEVfV0lEVEgsIGltYWdlLT53aWR0aCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVElMRV9IRUlHSFQsIGltYWdlLT5oZWlnaHQpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFLCBpbWFnZS0+d2lkdGggKiBpbWFnZS0+aGVpZ2h0ICogMS41KTsKICAgICB9CiAKICAgICBpZiAoaW1hZ2UtPmh2Y2MgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiJXM6IGh2Y2MgaXMgbWlzc2luZyBmb3IgaW1hZ2VbJXVdISIsIF9fRlVOQ1RJT05fXywgaW1hZ2VJbmRleCk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBtZXRhLT5zZXREYXRhKGtLZXlIVkNDLCBrVHlwZUhWQ0MsIGltYWdlLT5odmNjLT5kYXRhKCksIGltYWdlLT5odmNjLT5zaXplKCkpOworICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0hFVkMsIGltYWdlLT5odmNjLT5kYXRhKCksIGltYWdlLT5odmNjLT5zaXplKCkpOwogCiAgICAgaWYgKGltYWdlLT5pY2MgIT0gTlVMTCkgewotICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlJY2NQcm9maWxlLCAwLCBpbWFnZS0+aWNjLT5kYXRhKCksIGltYWdlLT5pY2MtPnNpemUoKSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0lDQ19QUk9GSUxFLCBpbWFnZS0+aWNjLT5kYXRhKCksIGltYWdlLT5pY2MtPnNpemUoKSk7CiAgICAgfQogICAgIHJldHVybiBtZXRhOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmggYi9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuaAppbmRleCA1MzZkY2IwLi5iZTgxYjU5IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuaApAQCAtMTksMTMgKzE5LDE1IEBACiAKICNpbmNsdWRlIDxzZXQ+CiAKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgorCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBEYXRhU291cmNlQmFzZTsKK2NsYXNzIERhdGFTb3VyY2VIZWxwZXI7CiBjbGFzcyBNZXRhRGF0YTsKIAogbmFtZXNwYWNlIGhlaWYgewpAQCAtNDUsMTMgKzQ3LDEzIEBACiAKIGNsYXNzIEl0ZW1UYWJsZSA6IHB1YmxpYyBSZWZCYXNlIHsKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBJdGVtVGFibGUoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CisgICAgZXhwbGljaXQgSXRlbVRhYmxlKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAKICAgICBzdGF0dXNfdCBwYXJzZSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwogCiAgICAgYm9vbCBpc1ZhbGlkKCkgeyByZXR1cm4gbUltYWdlSXRlbXNWYWxpZDsgfQogICAgIHVpbnQzMl90IGNvdW50SW1hZ2VzKCkgY29uc3Q7Ci0gICAgc3A8TWV0YURhdGE+IGdldEltYWdlTWV0YShjb25zdCB1aW50MzJfdCBpbWFnZUluZGV4KTsKKyAgICBBTWVkaWFGb3JtYXQgKmdldEltYWdlTWV0YShjb25zdCB1aW50MzJfdCBpbWFnZUluZGV4KTsKICAgICBzdGF0dXNfdCBmaW5kSW1hZ2VJdGVtKGNvbnN0IHVpbnQzMl90IGltYWdlSW5kZXgsIHVpbnQzMl90ICppdGVtSW5kZXgpOwogICAgIHN0YXR1c190IGZpbmRUaHVtYm5haWxJdGVtKGNvbnN0IHVpbnQzMl90IGltYWdlSW5kZXgsIHVpbnQzMl90ICppdGVtSW5kZXgpOwogICAgIHN0YXR1c190IGdldEltYWdlT2Zmc2V0QW5kU2l6ZSgKQEAgLTYyLDcgKzY0LDcgQEAKICAgICB+SXRlbVRhYmxlKCk7CiAKIHByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogCiAgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIEl0ZW1Mb2M+IG1JdGVtTG9jczsKICAgICBWZWN0b3I8SXRlbUluZm8+IG1JdGVtSW5mb3M7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5jcHAKaW5kZXggMjFjY2Y0NC4uMDQ0MTM1OSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmNwcApAQCAtMjYsMjYgKzI2LDI3IEBACiAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgIkFDNFBhcnNlci5oIgogI2luY2x1ZGUgIk1QRUc0RXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiU2FtcGxlVGFibGUuaCIKICNpbmNsdWRlICJJdGVtVGFibGUuaCIKICNpbmNsdWRlICJpbmNsdWRlL0VTRFMuaCIKIAorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvRXh0cmFjdG9yVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BdWRpb1ByZXNlbnRhdGlvbkluZm8uaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKICNpbmNsdWRlIDxieXRlc3dhcC5oPgpAQCAtNjgsMzcgKzY5LDM4IEBACiAgICAga01heEF0b21TaXplID0gNjQgKiAxMDI0ICogMTAyNCwKIH07CiAKK2NsYXNzIE1QRUc0U291cmNlIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogc3RhdGljIGNvbnN0IHNpemVfdCAga01heFBjbUZyYW1lU2l6ZSA9IDgxOTI7Ci0KLWNsYXNzIE1QRUc0U291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgewogcHVibGljOgogICAgIC8vIENhbGxlciByZXRhaW5zIG93bmVyc2hpcCBvZiBib3RoICJkYXRhU291cmNlIiBhbmQgInNhbXBsZVRhYmxlIi4KLSAgICBNUEVHNFNvdXJjZShNZXRhRGF0YUJhc2UgJmZvcm1hdCwKLSAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSwKKyAgICBNUEVHNFNvdXJjZShBTWVkaWFGb3JtYXQgKmZvcm1hdCwKKyAgICAgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyICpkYXRhU291cmNlLAogICAgICAgICAgICAgICAgIGludDMyX3QgdGltZVNjYWxlLAogICAgICAgICAgICAgICAgIGNvbnN0IHNwPFNhbXBsZVRhYmxlPiAmc2FtcGxlVGFibGUsCiAgICAgICAgICAgICAgICAgVmVjdG9yPFNpZHhFbnRyeT4gJnNpZHgsCiAgICAgICAgICAgICAgICAgY29uc3QgVHJleCAqdHJleCwKICAgICAgICAgICAgICAgICBvZmY2NF90IGZpcnN0TW9vZk9mZnNldCwKLSAgICAgICAgICAgICAgICBjb25zdCBzcDxJdGVtVGFibGU+ICZpdGVtVGFibGUpOworICAgICAgICAgICAgICAgIGNvbnN0IHNwPEl0ZW1UYWJsZT4gJml0ZW1UYWJsZSwKKyAgICAgICAgICAgICAgICBpbnQzMl90IGVsc3RTaGlmdFN0YXJ0VGlja3MpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0b3AoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldEZvcm1hdChBTWVkaWFGb3JtYXQgKik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZChNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKICAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydE5vbmJsb2NraW5nUmVhZCgpIHsgcmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGZyYWdtZW50ZWRSZWFkKE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGZyYWdtZW50ZWRSZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKICAgICB2aXJ0dWFsIH5NUEVHNFNvdXJjZSgpOwogCiBwcml2YXRlOgogICAgIE11dGV4IG1Mb2NrOwogCi0gICAgTWV0YURhdGFCYXNlICZtRm9ybWF0OwotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXQgKm1Gb3JtYXQ7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAgICAgaW50MzJfdCBtVGltZXNjYWxlOwogICAgIHNwPFNhbXBsZVRhYmxlPiBtU2FtcGxlVGFibGU7CiAgICAgdWludDMyX3QgbUN1cnJlbnRTYW1wbGVJbmRleDsKQEAgLTEwOCw3ICsxMTAsNyBAQAogICAgIG9mZjY0X3QgbUZpcnN0TW9vZk9mZnNldDsKICAgICBvZmY2NF90IG1DdXJyZW50TW9vZk9mZnNldDsKICAgICBvZmY2NF90IG1OZXh0TW9vZk9mZnNldDsKLSAgICB1aW50MzJfdCBtQ3VycmVudFRpbWU7CisgICAgdWludDMyX3QgbUN1cnJlbnRUaW1lOyAvLyBpbiBtZWRpYSB0aW1lc2NhbGUgdGlja3MKICAgICBpbnQzMl90IG1MYXN0UGFyc2VkVHJhY2tJZDsKICAgICBpbnQzMl90IG1UcmFja0lkOwogCkBAIC0xMjksMjIgKzEzMSwyMyBAQAogCiAgICAgYm9vbCBtSXNBVkM7CiAgICAgYm9vbCBtSXNIRVZDOworICAgIGJvb2wgbUlzQUM0OwogICAgIGJvb2wgbUlzUGNtOwogICAgIHNpemVfdCBtTkFMTGVuZ3RoU2l6ZTsKIAogICAgIGJvb2wgbVN0YXJ0ZWQ7CiAKLSAgICBNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7Ci0KLSAgICBNZWRpYUJ1ZmZlckJhc2UgKm1CdWZmZXI7Ci0KLSAgICBib29sIG1XYW50c05BTEZyYWdtZW50czsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqbUJ1ZmZlcjsKIAogICAgIHVpbnQ4X3QgKm1TcmNCdWZmZXI7CiAKICAgICBib29sIG1Jc0hlaWY7CiAgICAgc3A8SXRlbVRhYmxlPiBtSXRlbVRhYmxlOwogCisgICAgLy8gU3RhcnQgb2Zmc2V0IGZyb20gY29tcG9zaXRpb24gdGltZSB0byBwcmVzZW50YXRpb24gdGltZS4KKyAgICAvLyBTdXBwb3J0IHNoaWZ0IG9ubHkgZm9yIHZpZGVvIHRyYWNrcyB0aHJvdWdoIG1FbHN0U2hpZnRTdGFydFRpY2tzIGZvciBub3cuCisgICAgaW50MzJfdCBtRWxzdFNoaWZ0U3RhcnRUaWNrczsKKwogICAgIHNpemVfdCBwYXJzZU5BTFNpemUoY29uc3QgdWludDhfdCAqZGF0YSkgY29uc3Q7CiAgICAgc3RhdHVzX3QgcGFyc2VDaHVuayhvZmY2NF90ICpvZmZzZXQpOwogICAgIHN0YXR1c190IHBhcnNlVHJhY2tGcmFnbWVudEhlYWRlcihvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBzaXplKTsKQEAgLTE1Myw2ICsxNTYsOCBAQAogICAgIHN0YXR1c190IHBhcnNlU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25PZmZzZXRzKG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IHNpemUpOwogICAgIHN0YXR1c190IHBhcnNlQ2xlYXJFbmNyeXB0ZWRTaXplcyhvZmY2NF90IG9mZnNldCwgYm9vbCBpc1N1YnNhbXBsZUVuY3J5cHRpb24sIHVpbnQzMl90IGZsYWdzKTsKICAgICBzdGF0dXNfdCBwYXJzZVNhbXBsZUVuY3J5cHRpb24ob2ZmNjRfdCBvZmZzZXQpOworICAgIC8vIHJldHVybnMgLTEgZm9yIGludmFsaWQgbGF5ZXIgSUQKKyAgICBpbnQzMl90IHBhcnNlSEVWQ0xheWVySWQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOwogCiAgICAgc3RydWN0IFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvIHsKICAgICAgICAgZW51bSBGbGFncyB7CkBAIC0xOTgsMTQgKzIwMywxNCBAQAogLy8gcG9zc2libHkgd3JhcHBpbmcgbXVsdGlwbGUgdGltZXMgdG8gY292ZXIgYWxsIHRyYWNrcywgaS5lLgogLy8gRWFjaCBDYWNoZWRSYW5nZWREYXRhU291cmNlIGNhY2hlcyB0aGUgc2FtcGxldGFibGUgbWV0YWRhdGEgZm9yIGEgc2luZ2xlIHRyYWNrLgogCi1zdHJ1Y3QgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlQmFzZSB7Ci0gICAgZXhwbGljaXQgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZShEYXRhU291cmNlQmFzZSAqc291cmNlKTsKK2NsYXNzIENhY2hlZFJhbmdlZERhdGFTb3VyY2UgOiBwdWJsaWMgRGF0YVNvdXJjZUhlbHBlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZShEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogICAgIHZpcnR1YWwgfkNhY2hlZFJhbmdlZERhdGFTb3VyY2UoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKLSAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCk7CisgICAgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpIG92ZXJyaWRlOworICAgIHVpbnQzMl90IGZsYWdzKCkgb3ZlcnJpZGU7CiAKICAgICBzdGF0dXNfdCBzZXRDYWNoZWRSYW5nZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUsIGJvb2wgYXNzdW1lU291cmNlT3duZXJzaGlwT25TdWNjZXNzKTsKIApAQCAtMjEzLDcgKzIxOCw3IEBACiBwcml2YXRlOgogICAgIE11dGV4IG1Mb2NrOwogCi0gICAgRGF0YVNvdXJjZUJhc2UgKm1Tb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbVNvdXJjZTsKICAgICBib29sIG1Pd25zRGF0YVNvdXJjZTsKICAgICBvZmY2NF90IG1DYWNoZWRPZmZzZXQ7CiAgICAgc2l6ZV90IG1DYWNoZWRTaXplOwpAQCAtMjI1LDggKzIzMCw5IEBACiAgICAgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IENhY2hlZFJhbmdlZERhdGFTb3VyY2UgJik7CiB9OwogCi1DYWNoZWRSYW5nZWREYXRhU291cmNlOjpDYWNoZWRSYW5nZWREYXRhU291cmNlKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCi0gICAgOiBtU291cmNlKHNvdXJjZSksCitDYWNoZWRSYW5nZWREYXRhU291cmNlOjpDYWNoZWRSYW5nZWREYXRhU291cmNlKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKKyAgICA6IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSwKKyAgICAgIG1Tb3VyY2Uoc291cmNlKSwKICAgICAgIG1Pd25zRGF0YVNvdXJjZShmYWxzZSksCiAgICAgICBtQ2FjaGVkT2Zmc2V0KDApLAogICAgICAgbUNhY2hlZFNpemUoMCksCkBAIC0yMzYsNyArMjQyLDcgQEAKIENhY2hlZFJhbmdlZERhdGFTb3VyY2U6On5DYWNoZWRSYW5nZWREYXRhU291cmNlKCkgewogICAgIGNsZWFyQ2FjaGUoKTsKICAgICBpZiAobU93bnNEYXRhU291cmNlKSB7Ci0gICAgICAgIGRlbGV0ZSAoQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZSopbVNvdXJjZTsKKyAgICAgICAgZGVsZXRlIG1Tb3VyY2U7CiAgICAgfQogfQogCkBAIC0yNTAsMTAgKzI1Niw2IEBACiAgICAgbUNhY2hlZFNpemUgPSAwOwogfQogCi1zdGF0dXNfdCBDYWNoZWRSYW5nZWREYXRhU291cmNlOjppbml0Q2hlY2soKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Tb3VyY2UtPmluaXRDaGVjaygpOwotfQotCiBzc2l6ZV90IENhY2hlZFJhbmdlZERhdGFTb3VyY2U6OnJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCkBAIC0zMTUsNiArMzE3LDkgQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnYScsICd3JywgJ2InKToKICAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0I7CiAKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2UnLCAnYycsICctJywgJzMnKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzOworCiAgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICd2Jyk6CiAgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQ7CiAKQEAgLTMyOSw2ICszMzQsOCBAQAogICAgICAgICBjYXNlIEZPVVJDQygnaCcsICd2JywgJ2MnLCAnMScpOgogICAgICAgICBjYXNlIEZPVVJDQygnaCcsICdlJywgJ3YnLCAnMScpOgogICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkM7CisgICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ2MnLCAnLScsICc0Jyk6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0OwogCiAgICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ3cnLCAnbycsICdzJyk6CiAgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ28nLCAndycsICd0Jyk6CkBAIC0zMzYsNiArMzQzLDggQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2EnLCAnbCcsICdhJywgJ2MnKToKICAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19BTEFDOwogCisgICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ3YnLCAnMCcsICcxJyk6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fQVYxOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR1coIlVua25vd24gZm91cmNjOiAlYyVjJWMlYyIsCiAgICAgICAgICAgICAgICAgICAgKGZvdXJjYyA+PiAyNCkgJiAweGZmLApAQCAtMzYyLDEyICszNzEsMTEgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLU1QRUc0RXh0cmFjdG9yOjpNUEVHNEV4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlLCBjb25zdCBjaGFyICptaW1lKQorTVBFRzRFeHRyYWN0b3I6Ok1QRUc0RXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgY29uc3QgY2hhciAqbWltZSkKICAgICA6IG1Nb29mT2Zmc2V0KDApLAogICAgICAgbU1vb2ZGb3VuZChmYWxzZSksCiAgICAgICBtTWRhdEZvdW5kKGZhbHNlKSwKICAgICAgIG1EYXRhU291cmNlKHNvdXJjZSksCi0gICAgICBtQ2FjaGVkU291cmNlKE5VTEwpLAogICAgICAgbUluaXRDaGVjayhOT19JTklUKSwKICAgICAgIG1IZWFkZXJUaW1lc2NhbGUoMCksCiAgICAgICBtSXNRVChmYWxzZSksCkBAIC0zNzcsNiArMzg1LDcgQEAKICAgICAgIG1GaXJzdFRyYWNrKE5VTEwpLAogICAgICAgbUxhc3RUcmFjayhOVUxMKSB7CiAgICAgQUxPR1YoIm1pbWU9JXMsIG1QcmVmZXJIZWlmPSVkIiwgbWltZSwgbVByZWZlckhlaWYpOworICAgIG1GaWxlTWV0YURhdGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CiB9CiAKIE1QRUc0RXh0cmFjdG9yOjp+TVBFRzRFeHRyYWN0b3IoKSB7CkBAIC0zODQsNiArMzkzLDcgQEAKICAgICB3aGlsZSAodHJhY2spIHsKICAgICAgICAgVHJhY2sgKm5leHQgPSB0cmFjay0+bmV4dDsKIAorICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKHRyYWNrLT5tZXRhKTsKICAgICAgICAgZGVsZXRlIHRyYWNrOwogICAgICAgICB0cmFjayA9IG5leHQ7CiAgICAgfQpAQCAtMzk0LDcgKzQwNCw4IEBACiAgICAgfQogICAgIG1Qc3NoLmNsZWFyKCk7CiAKLSAgICBkZWxldGUgbUNhY2hlZFNvdXJjZTsKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtRmlsZU1ldGFEYXRhKTsKIH0KIAogdWludDMyX3QgTVBFRzRFeHRyYWN0b3I6OmZsYWdzKCkgY29uc3QgewpAQCAtNDAzLDEzICs0MTQsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgKENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9TRUVLKSA6IDApOwogfQogCi1zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CiAgICAgc3RhdHVzX3QgZXJyOwogICAgIGlmICgoZXJyID0gcmVhZE1ldGFEYXRhKCkpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQotICAgIG1ldGEgPSBtRmlsZU1ldGFEYXRhOwotICAgIHJldHVybiBPSzsKKyAgICBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtRmlsZU1ldGFEYXRhKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiBzaXplX3QgTVBFRzRFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewpAQCAtNDMwLDE4ICs0NDEsMTggQEAKICAgICByZXR1cm4gbjsKIH0KIAotc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKK21lZGlhX3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKICAgICBzdGF0dXNfdCBlcnI7CiAgICAgaWYgKChlcnIgPSByZWFkTWV0YURhdGEoKSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICBUcmFjayAqdHJhY2sgPSBtRmlyc3RUcmFjazsKICAgICB3aGlsZSAoaW5kZXggPiAwKSB7CiAgICAgICAgIGlmICh0cmFjayA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfQogCiAgICAgICAgIHRyYWNrID0gdHJhY2stPm5leHQ7CkBAIC00NDksMTcgKzQ2MCwxOCBAQAogICAgIH0KIAogICAgIGlmICh0cmFjayA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgWz1dIHsKICAgICAgICAgaW50NjRfdCBkdXJhdGlvbjsKICAgICAgICAgaW50MzJfdCBzYW1wbGVyYXRlOworICAgICAgICAvLyBPbmx5IGZvciBhdWRpbyB0cmFjay4KICAgICAgICAgaWYgKHRyYWNrLT5oYXNfZWxzdCAmJiBtSGVhZGVyVGltZXNjYWxlICE9IDAgJiYKLSAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb24pICYmCi0gICAgICAgICAgICAgICAgdHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlcmF0ZSkpIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50NjQodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICZkdXJhdGlvbikgJiYKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsICZzYW1wbGVyYXRlKSkgewogCi0gICAgICAgICAgICAvLyBlbHN0IGhhcyB0byBiZSBwcm9jZXNzZWQgb25seSB0aGUgZmlyc3QgdGltZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZAorICAgICAgICAgICAgLy8gRWxzdCBoYXMgdG8gYmUgcHJvY2Vzc2VkIG9ubHkgdGhlIGZpcnN0IHRpbWUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuCiAgICAgICAgICAgICB0cmFjay0+aGFzX2Vsc3QgPSBmYWxzZTsKIAogICAgICAgICAgICAgaWYgKHRyYWNrLT5lbHN0X3NlZ21lbnRfZHVyYXRpb24gPiBJTlQ2NF9NQVgpIHsKQEAgLTQ3NSw3NyArNDg3LDc2IEBACiAgICAgICAgICAgICAgICAgICBoYWxmc2NhbGUsIG1IZWFkZXJUaW1lc2NhbGUsIHRyYWNrLT50aW1lc2NhbGUpOwogCiAgICAgICAgICAgICBpZiAoKHVpbnQzMl90KXNhbXBsZXJhdGUgIT0gdHJhY2stPnRpbWVzY2FsZSl7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInNhbXBsZXJhdGU6JSIgUFJJZDMyICIsIHRyYWNrLT50aW1lc2NhbGUgYW5kIHNhbXBsZXJhdGUgYXJlIGRpZmZlcmVudCEiLCBzYW1wbGVyYXRlKTsKKyAgICAgICAgICAgICAgICBBTE9HVigic2FtcGxlcmF0ZTolIiBQUklkMzIgIiwgdHJhY2stPnRpbWVzY2FsZSBhbmQgc2FtcGxlcmF0ZSBhcmUgZGlmZmVyZW50ISIsCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZXJhdGUpOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQ2NF90IGRlbGF5OwotICAgICAgICAgICAgLy8gZGVsYXkgPSAoKG1lZGlhX3RpbWUgKiBzYW1wbGVyYXRlKSArIGhhbGZzY2FsZSkgLyB0cmFjay0+dGltZXNjYWxlOwotICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cobWVkaWFfdGltZSwgc2FtcGxlcmF0ZSwgJmRlbGF5KSB8fAotICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fYWRkX292ZXJmbG93KGRlbGF5LCBoYWxmc2NhbGUsICZkZWxheSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKGRlbGF5IC89IG1IZWFkZXJUaW1lc2NhbGUsIGZhbHNlKSB8fAotICAgICAgICAgICAgICAgICAgICAvKiB0aGUgY2FsY3VsYXRlZCBkZWxheSBzaG91bGQgYmUgc21hbGwsIGJ1dCBzb21lIGFwcHMKLSAgICAgICAgICAgICAgICAgICAgICogYXBwZWFyIHRvIHdyaXRlIGEgYm9ndXMgZWRpdCBsaXN0IHRoYXQgY2F1c2VzIGEgcmVhbGx5Ci0gICAgICAgICAgICAgICAgICAgICAqIGxhcmdlIGRlbGF5LCByZXN1bHRpbmcgaW4gcGxheWJhY2sgcHJvYmxlbXMuCi0gICAgICAgICAgICAgICAgICAgICAqIElnbm9yZSBzdWNoIGVkaXQgbGlzdHMuCi0gICAgICAgICAgICAgICAgICAgICAqICg0MDk2IGlzIGVub3VnaCB0byBkcm9wIDQgZnVsbCBzYW1wbGVzKQotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgZGVsYXkgPiA0MDk2IHx8Ci0gICAgICAgICAgICAgICAgICAgIGRlbGF5IDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJpZ25vcmluZyBlZGl0IGxpc3Qgd2l0aCBib2d1cyB2YWx1ZXMiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiZGVsYXkgPSAlIiBQUklkNjQsIGRlbGF5KTsKLSAgICAgICAgICAgIHRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlFbmNvZGVyRGVsYXksIGRlbGF5KTsKLQotICAgICAgICAgICAgaW50NjRfdCBzY2FsZWRfZHVyYXRpb247Ci0gICAgICAgICAgICAvLyBzY2FsZWRfZHVyYXRpb24gPSBkdXJhdGlvbiAqIG1IZWFkZXJUaW1lc2NhbGU7Ci0gICAgICAgICAgICBpZiAoX19idWlsdGluX211bF9vdmVyZmxvdyhkdXJhdGlvbiwgbUhlYWRlclRpbWVzY2FsZSwgJnNjYWxlZF9kdXJhdGlvbikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigic2NhbGVkX2R1cmF0aW9uID0gJSIgUFJJZDY0LCBzY2FsZWRfZHVyYXRpb24pOwotCi0gICAgICAgICAgICBpbnQ2NF90IHNlZ21lbnRfZW5kOwotICAgICAgICAgICAgaW50NjRfdCBwYWRkaW5nOwotICAgICAgICAgICAgaW50NjRfdCBzZWdtZW50X2R1cmF0aW9uX2U2OwotICAgICAgICAgICAgaW50NjRfdCBtZWRpYV90aW1lX3NjYWxlZF9lNjsKLSAgICAgICAgICAgIGludDY0X3QgbWVkaWFfdGltZV9zY2FsZWQ7Ci0gICAgICAgICAgICAvLyBwYWRkaW5nID0gc2NhbGVkX2R1cmF0aW9uIC0gKChzZWdtZW50X2R1cmF0aW9uICogMTAwMDAwMCkgKwotICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAoKG1lZGlhX3RpbWUgKiBtSGVhZGVyVGltZVNjYWxlICogMTAwMDAwMCkvdHJhY2stPnRpbWVzY2FsZSkgKQotICAgICAgICAgICAgLy8gc2VnbWVudF9kdXJhdGlvbiBpcyBiYXNlZCBvbiB0aW1lc2NhbGUgaW4gbW92aWUgaGVhZGVyIGJveChtZGhkKQotICAgICAgICAgICAgLy8gbWVkaWFfdGltZSBpcyBiYXNlZCBvbiB0aW1lc2NhbGUgdHJhY2sgaGVhZGVyL21lZGlhIHRpbWVzY2FsZQotICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3coc2VnbWVudF9kdXJhdGlvbiwgMTAwMDAwMCwgJnNlZ21lbnRfZHVyYXRpb25fZTYpIHx8Ci0gICAgICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhtZWRpYV90aW1lLCBtSGVhZGVyVGltZXNjYWxlLCAmbWVkaWFfdGltZV9zY2FsZWQpIHx8Ci0gICAgICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhtZWRpYV90aW1lX3NjYWxlZCwgMTAwMDAwMCwgJm1lZGlhX3RpbWVfc2NhbGVkX2U2KSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lZGlhX3RpbWVfc2NhbGVkX2U2IC89IHRyYWNrLT50aW1lc2NhbGU7Ci0gICAgICAgICAgICBpZihfX2J1aWx0aW5fYWRkX292ZXJmbG93KHNlZ21lbnRfZHVyYXRpb25fZTYsIG1lZGlhX3RpbWVfc2NhbGVkX2U2LCAmc2VnbWVudF9lbmQpIHx8Ci0gICAgICAgICAgICAgICAgX19idWlsdGluX3N1Yl9vdmVyZmxvdyhzY2FsZWRfZHVyYXRpb24sIHNlZ21lbnRfZW5kLCAmcGFkZGluZykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigic2VnbWVudF9lbmQgPSAlIiBQUklkNjQgIiwgcGFkZGluZyA9ICUiIFBSSWQ2NCwgc2VnbWVudF9lbmQsIHBhZGRpbmcpOwotICAgICAgICAgICAgaW50NjRfdCBwYWRkaW5nc2FtcGxlcyA9IDA7Ci0gICAgICAgICAgICBpZiAocGFkZGluZyA8IDApIHsKLSAgICAgICAgICAgICAgICAvLyB0cmFjayBkdXJhdGlvbiBmcm9tIG1lZGlhIGhlYWRlciAod2hpY2ggaXMgd2hhdCBrS2V5RHVyYXRpb24gaXMpIG1pZ2h0Ci0gICAgICAgICAgICAgICAgLy8gYmUgc2xpZ2h0bHkgc2hvcnRlciB0aGFuIHRoZSBzZWdtZW50IGR1cmF0aW9uLCB3aGljaCB3b3VsZCBtYWtlIHRoZQotICAgICAgICAgICAgICAgIC8vIHBhZGRpbmcgbmVnYXRpdmUuIENsYW1wIHRvIHplcm8uCi0gICAgICAgICAgICAgICAgcGFkZGluZyA9IDA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludDY0X3QgaGFsZnNjYWxlX2U2OwotICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXNjYWxlX2U2OwotICAgICAgICAgICAgICAgIC8vIHBhZGRpbmdzYW1wbGVzID0gKChwYWRkaW5nICogc2FtcGxlcmF0ZSkgKyAoaGFsZnNjYWxlICogMTAwMDAwMCkpCi0gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgLyAobUhlYWRlclRpbWVzY2FsZSAqIDEwMDAwMDApOwotICAgICAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KHBhZGRpbmcsIHNhbXBsZXJhdGUsICZwYWRkaW5nc2FtcGxlcykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3coaGFsZnNjYWxlLCAxMDAwMDAwLCAmaGFsZnNjYWxlX2U2KSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhtSGVhZGVyVGltZXNjYWxlLCAxMDAwMDAwLCAmdGltZXNjYWxlX2U2KSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX2FkZF9vdmVyZmxvdyhwYWRkaW5nc2FtcGxlcywgaGFsZnNjYWxlX2U2LCAmcGFkZGluZ3NhbXBsZXMpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAocGFkZGluZ3NhbXBsZXMgLz0gdGltZXNjYWxlX2U2LCBmYWxzZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmdzYW1wbGVzID4gSU5UMzJfTUFYKSB7CisgICAgICAgICAgICAvLyBCb3RoIGRlbGF5IGFuZCBwYWRkaW5nc2FtcGxlcyBoYXZlIHRvIGJlIHNldCBpbm9yZGVyIGZvciBlaXRoZXIgdG8gYmUKKyAgICAgICAgICAgIC8vIGVmZmVjdGl2ZSBpbiB0aGUgbG93ZXIgbGF5ZXJzLgorICAgICAgICAgICAgaW50NjRfdCBkZWxheSA9IDA7CisgICAgICAgICAgICBpZiAobWVkaWFfdGltZSA+IDApIHsgLy8gR2FwbGVzcyBwbGF5YmFjaworICAgICAgICAgICAgICAgIC8vIGRlbGF5ID0gKChtZWRpYV90aW1lICogc2FtcGxlcmF0ZSkgKyBoYWxmc2NhbGUpIC8gdHJhY2stPnRpbWVzY2FsZTsKKyAgICAgICAgICAgICAgICBpZiAoX19idWlsdGluX211bF9vdmVyZmxvdyhtZWRpYV90aW1lLCBzYW1wbGVyYXRlLCAmZGVsYXkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fYWRkX292ZXJmbG93KGRlbGF5LCBoYWxmc2NhbGUsICZkZWxheSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChkZWxheSAvPSB0cmFjay0+dGltZXNjYWxlLCBmYWxzZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5ID4gSU5UMzJfTUFYIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBkZWxheSA8IElOVDMyX01JTikgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiaWdub3JpbmcgZWRpdCBsaXN0IHdpdGggYm9ndXMgdmFsdWVzIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiZGVsYXkgPSAlIiBQUklkNjQsIGRlbGF5KTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX0RFTEFZLCBkZWxheSk7CisKKyAgICAgICAgICAgIGludDY0X3QgcGFkZGluZ3NhbXBsZXMgPSAwOworICAgICAgICAgICAgaWYgKHNlZ21lbnRfZHVyYXRpb24gPiAwKSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBzY2FsZWRfZHVyYXRpb247CisgICAgICAgICAgICAgICAgLy8gc2NhbGVkX2R1cmF0aW9uID0gZHVyYXRpb24gKiBtSGVhZGVyVGltZXNjYWxlOworICAgICAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KGR1cmF0aW9uLCBtSGVhZGVyVGltZXNjYWxlLCAmc2NhbGVkX2R1cmF0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJzY2FsZWRfZHVyYXRpb24gPSAlIiBQUklkNjQsIHNjYWxlZF9kdXJhdGlvbik7CisKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHNlZ21lbnRfZW5kOworICAgICAgICAgICAgICAgIGludDY0X3QgcGFkZGluZzsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHNlZ21lbnRfZHVyYXRpb25fZTY7CisgICAgICAgICAgICAgICAgaW50NjRfdCBtZWRpYV90aW1lX3NjYWxlZF9lNjsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IG1lZGlhX3RpbWVfc2NhbGVkOworICAgICAgICAgICAgICAgIC8vIHBhZGRpbmcgPSBzY2FsZWRfZHVyYXRpb24gLSAoKHNlZ21lbnRfZHVyYXRpb24gKiAxMDAwMDAwKSArCisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAoKG1lZGlhX3RpbWUgKiBtSGVhZGVyVGltZXNjYWxlICogMTAwMDAwMCkvdHJhY2stPnRpbWVzY2FsZSkgKQorICAgICAgICAgICAgICAgIC8vIHNlZ21lbnRfZHVyYXRpb24gaXMgYmFzZWQgb24gdGltZXNjYWxlIGluIG1vdmllIGhlYWRlciBib3gobWRoZCkKKyAgICAgICAgICAgICAgICAvLyBtZWRpYV90aW1lIGlzIGJhc2VkIG9uIHRpbWVzY2FsZSB0cmFjayBoZWFkZXIvbWVkaWEgdGltZXNjYWxlCisgICAgICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3coc2VnbWVudF9kdXJhdGlvbiwgMTAwMDAwMCwgJnNlZ21lbnRfZHVyYXRpb25fZTYpIHx8CisgICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cobWVkaWFfdGltZSwgbUhlYWRlclRpbWVzY2FsZSwgJm1lZGlhX3RpbWVfc2NhbGVkKSB8fAorICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fbXVsX292ZXJmbG93KG1lZGlhX3RpbWVfc2NhbGVkLCAxMDAwMDAwLCAmbWVkaWFfdGltZV9zY2FsZWRfZTYpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVkaWFfdGltZV9zY2FsZWRfZTYgLz0gdHJhY2stPnRpbWVzY2FsZTsKKyAgICAgICAgICAgICAgICBpZiAoX19idWlsdGluX2FkZF9vdmVyZmxvdyhzZWdtZW50X2R1cmF0aW9uX2U2LCBtZWRpYV90aW1lX3NjYWxlZF9lNiwgJnNlZ21lbnRfZW5kKQorICAgICAgICAgICAgICAgICAgICB8fCBfX2J1aWx0aW5fc3ViX292ZXJmbG93KHNjYWxlZF9kdXJhdGlvbiwgc2VnbWVudF9lbmQsICZwYWRkaW5nKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJzZWdtZW50X2VuZCA9ICUiIFBSSWQ2NCAiLCBwYWRkaW5nID0gJSIgUFJJZDY0LCBzZWdtZW50X2VuZCwgcGFkZGluZyk7CisgICAgICAgICAgICAgICAgLy8gdHJhY2sgZHVyYXRpb24gZnJvbSBtZWRpYSBoZWFkZXIgKHdoaWNoIGlzIHdoYXQgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiBpcykKKyAgICAgICAgICAgICAgICAvLyBtaWdodCBiZSBzbGlnaHRseSBzaG9ydGVyIHRoYW4gdGhlIHNlZ21lbnQgZHVyYXRpb24sIHdoaWNoIHdvdWxkIG1ha2UgdGhlCisgICAgICAgICAgICAgICAgLy8gcGFkZGluZyBuZWdhdGl2ZS4gQ2xhbXAgdG8gemVyby4KKyAgICAgICAgICAgICAgICBpZiAocGFkZGluZyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBoYWxmc2NhbGVfbWh0ID0gbUhlYWRlclRpbWVzY2FsZSAvIDI7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgaGFsZnNjYWxlX2U2OworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzY2FsZV9lNjsKKyAgICAgICAgICAgICAgICAgICAgLy8gcGFkZGluZ3NhbXBsZXMgPSAoKHBhZGRpbmcgKiBzYW1wbGVyYXRlKSArIChoYWxmc2NhbGVfbWh0ICogMTAwMDAwMCkpCisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIC8gKG1IZWFkZXJUaW1lc2NhbGUgKiAxMDAwMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cocGFkZGluZywgc2FtcGxlcmF0ZSwgJnBhZGRpbmdzYW1wbGVzKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3coaGFsZnNjYWxlX21odCwgMTAwMDAwMCwgJmhhbGZzY2FsZV9lNikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fbXVsX292ZXJmbG93KG1IZWFkZXJUaW1lc2NhbGUsIDEwMDAwMDAsICZ0aW1lc2NhbGVfZTYpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX2FkZF9vdmVyZmxvdyhwYWRkaW5nc2FtcGxlcywgaGFsZnNjYWxlX2U2LCAmcGFkZGluZ3NhbXBsZXMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhZGRpbmdzYW1wbGVzIC89IHRpbWVzY2FsZV9lNiwgZmFsc2UpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZ3NhbXBsZXMgPiBJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFMT0dWKCJwYWRkaW5nc2FtcGxlcyA9ICUiIFBSSWQ2NCwgcGFkZGluZ3NhbXBsZXMpOwotICAgICAgICAgICAgdHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUVuY29kZXJQYWRkaW5nLCBwYWRkaW5nc2FtcGxlcyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9QQURESU5HLCBwYWRkaW5nc2FtcGxlcyk7CiAgICAgICAgIH0KICAgICB9KCk7CiAKQEAgLTU1NCw3ICs1NjUsNyBAQAogICAgICAgICB0cmFjay0+aW5jbHVkZXNfZXhwZW5zaXZlX21ldGFkYXRhID0gdHJ1ZTsKIAogICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICBDSEVDSyh0cmFjay0+bWV0YS5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKTsKICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikpIHsKICAgICAgICAgICAgIC8vIE1QRUcyIHRyYWNrcyBkbyBub3QgcHJvdmlkZSBDU0QsIHNvIHJlYWQgdGhlIHN0cmVhbSBoZWFkZXIKICAgICAgICAgICAgIGlmICghc3RyY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKSkgewpAQCAtNTY3LDE3ICs1NzgsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB1aW50OF90IGhlYWRlcltrTWF4VHJhY2tIZWFkZXJTaXplXTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCAmaGVhZGVyLCBzaXplKSA9PSAoc3NpemVfdClzaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS5zZXREYXRhKGtLZXlTdHJlYW1IZWFkZXIsICdtZGF0JywgaGVhZGVyLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIodHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTVBFRzJfU1RSRUFNX0hFQURFUiwgaGVhZGVyLCBzaXplKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1Nb29mT2Zmc2V0ID4gMCkgewogICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb247Ci0gICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5tZXRhLmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvbikpIHsKKyAgICAgICAgICAgICAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDY0KHRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgJmR1cmF0aW9uKSkgewogICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIGZhbmN5LCBqdXN0IHBpY2sgYSBmcmFtZSBuZWFyIDEvNHRoIG9mIHRoZSBkdXJhdGlvbgotICAgICAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VGh1bWJuYWlsVGltZSwgZHVyYXRpb24gLyA0KTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KHRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1RJTUUsIGR1cmF0aW9uIC8gNCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleDsKQEAgLTU4NywxNiArNjAwLDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0cmFjay0+c2FtcGxlVGFibGUtPmdldE1ldGFEYXRhRm9yU2FtcGxlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUluZGV4LCBOVUxMIC8qIG9mZnNldCAqLywgTlVMTCAvKiBzaXplICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lKSA9PSBPSykgewotICAgICAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VGh1bWJuYWlsVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGludDY0X3Qpc2FtcGxlVGltZSAqIDEwMDAwMDApIC8gdHJhY2stPnRpbWVzY2FsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQodHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1RJTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50NjRfdClzYW1wbGVUaW1lICogMTAwMDAwMCkgLyB0cmFjay0+dGltZXNjYWxlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBtZXRhID0gdHJhY2stPm1ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIHRyYWNrLT5tZXRhKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiBzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cmVhZE1ldGFEYXRhKCkgewpAQCAtNjMxLDEyICs2NDQsMTQgQEAKICAgICAgICAgb2ZmNjRfdCBleGlmT2Zmc2V0OwogICAgICAgICBzaXplX3QgZXhpZlNpemU7CiAgICAgICAgIGlmIChtSXRlbVRhYmxlLT5nZXRFeGlmT2Zmc2V0QW5kU2l6ZSgmZXhpZk9mZnNldCwgJmV4aWZTaXplKSA9PSBPSykgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRJbnQ2NChrS2V5RXhpZk9mZnNldCwgKGludDY0X3QpZXhpZk9mZnNldCk7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldEludDY0KGtLZXlFeGlmU2l6ZSwgKGludDY0X3QpZXhpZlNpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9PRkZTRVQsIChpbnQ2NF90KWV4aWZPZmZzZXQpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9TSVpFLCAoaW50NjRfdClleGlmU2l6ZSk7CiAgICAgICAgIH0KICAgICAgICAgZm9yICh1aW50MzJfdCBpbWFnZUluZGV4ID0gMDsKICAgICAgICAgICAgICAgICBpbWFnZUluZGV4IDwgbUl0ZW1UYWJsZS0+Y291bnRJbWFnZXMoKTsgaW1hZ2VJbmRleCsrKSB7Ci0gICAgICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1JdGVtVGFibGUtPmdldEltYWdlTWV0YShpbWFnZUluZGV4KTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IG1JdGVtVGFibGUtPmdldEltYWdlTWV0YShpbWFnZUluZGV4KTsKICAgICAgICAgICAgIGlmIChtZXRhID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiaGVpZiBpbWFnZSAldSBoYXMgbm8gbWV0YSEiLCBpbWFnZUluZGV4KTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTY2MSwyNiArNjc2LDI5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtTGFzdFRyYWNrID0gdHJhY2s7CiAKLSAgICAgICAgICAgIHRyYWNrLT5tZXRhID0gKihtZXRhLmdldCgpKTsKLSAgICAgICAgICAgIHRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlUcmFja0lELCBpbWFnZUluZGV4KTsKKyAgICAgICAgICAgIHRyYWNrLT5tZXRhID0gbWV0YTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9UUkFDS19JRCwgaW1hZ2VJbmRleCk7CiAgICAgICAgICAgICB0cmFjay0+aW5jbHVkZXNfZXhwZW5zaXZlX21ldGFkYXRhID0gZmFsc2U7CiAgICAgICAgICAgICB0cmFjay0+c2tpcFRyYWNrID0gZmFsc2U7CiAgICAgICAgICAgICB0cmFjay0+dGltZXNjYWxlID0gMTAwMDAwMDsKKyAgICAgICAgICAgIHRyYWNrLT5lbHN0U2hpZnRTdGFydFRpY2tzID0gMDsKICAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7CiAgICAgICAgIGlmIChmaW5kVHJhY2tCeU1pbWVQcmVmaXgoInZpZGVvLyIpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAga0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzQpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHNCk7CiAgICAgICAgIH0gZWxzZSBpZiAoZmluZFRyYWNrQnlNaW1lUHJlZml4KCJhdWRpby8iKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCAiYXVkaW8vbXA0Iik7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgImF1ZGlvL21wNCIpOwogICAgICAgICB9IGVsc2UgaWYgKGZpbmRUcmFja0J5TWltZVByZWZpeCgKICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAga0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfSEVJRik7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX0hFSUYpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIG1Jbml0Q2hlY2sgPSBlcnI7CkBAIC03MDUsNyArNzIzLDcgQEAKICAgICAgICAgICAgIG1lbWNweShwdHIgKyAyMCwgbVBzc2hbaV0uZGF0YSwgbVBzc2hbaV0uZGF0YWxlbik7CiAgICAgICAgICAgICBwdHIgKz0gKDIwICsgbVBzc2hbaV0uZGF0YWxlbik7CiAgICAgICAgIH0KLSAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXREYXRhKGtLZXlQc3NoLCAncHNzaCcsIGJ1ZiwgcHNzaHNpemUpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1GaWxlTWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfUFNTSCwgYnVmLCBwc3Noc2l6ZSk7CiAgICAgICAgIGZyZWUoYnVmKTsKICAgICB9CiAKQEAgLTkyMSw4ICs5MzksOCBAQAogCiAgICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZWRTb3VyY2UtPnNldENhY2hlZFJhbmdlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvZmZzZXQsIGNodW5rX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhY2hlZFNvdXJjZSAhPSBOVUxMIC8qIGFzc3VtZSBvd25lcnNoaXAgb24gc3VjY2VzcyAqLykgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EYXRhU291cmNlID0gbUNhY2hlZFNvdXJjZSA9IGNhY2hlZFNvdXJjZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGFzc3VtZSBvd25lcnNoaXAgb24gc3VjY2VzcyAqLykgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EYXRhU291cmNlID0gY2FjaGVkU291cmNlOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNhY2hlZFNvdXJjZTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtOTU2LDkgKzk3NCwxMiBAQAogICAgICAgICAgICAgICAgIHRyYWNrLT5pbmNsdWRlc19leHBlbnNpdmVfbWV0YWRhdGEgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB0cmFjay0+c2tpcFRyYWNrID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgdHJhY2stPnRpbWVzY2FsZSA9IDA7Ci0gICAgICAgICAgICAgICAgdHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKKyAgICAgICAgICAgICAgICB0cmFjay0+bWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKHRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CiAgICAgICAgICAgICAgICAgdHJhY2stPmhhc19lbHN0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgdHJhY2stPnN1YnNhbXBsZV9lbmNyeXB0aW9uID0gZmFsc2U7CisgICAgICAgICAgICAgICAgdHJhY2stPmVsc3RTaGlmdFN0YXJ0VGlja3MgPSAwOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBvZmY2NF90IHN0b3Bfb2Zmc2V0ID0gKm9mZnNldCArIGNodW5rX3NpemU7CkBAIC05ODAsOCArMTAwMSwxMCBAQAogCiAgICAgICAgICAgICBpZiAoaXNUcmFjaykgewogICAgICAgICAgICAgICAgIGludDMyX3QgdHJhY2tJZDsKLSAgICAgICAgICAgICAgICAvLyBUaGVyZSBtdXN0IGJlIGV4YWN0IG9uZSB0cmFjayBoZWFkZXIgcGVyIHRyYWNrLgotICAgICAgICAgICAgICAgIGlmICghbUxhc3RUcmFjay0+bWV0YS5maW5kSW50MzIoa0tleVRyYWNrSUQsICZ0cmFja0lkKSkgeworICAgICAgICAgICAgICAgIC8vIFRoZXJlIG11c3QgYmUgZXhhY3RseSBvbmUgdHJhY2sgaGVhZGVyIHBlciB0cmFjay4KKworICAgICAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCAmdHJhY2tJZCkpIHsKICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2tpcFRyYWNrID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTEwNTcsNyArMTA4MCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1vZGUgIT0ga0NyeXB0b01vZGVVbmVuY3J5cHRlZCkgewotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNyeXB0b01vZGUsIG1vZGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLCBtb2RlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xMDg0LDYgKzExMDcsNyBAQAogCiAgICAgICAgICAgICBpZiAoZW50cnlfY291bnQgIT0gMSkgewogICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgc3VwcG9ydCBhIHNpbmdsZSBlbnRyeSBhdCB0aGUgbW9tZW50LCBmb3IgZ2FwbGVzcyBwbGF5YmFjaworICAgICAgICAgICAgICAgIC8vIG9yIHN0YXJ0IG9mZnNldAogICAgICAgICAgICAgICAgIEFMT0dXKCJpZ25vcmluZyBlZGl0IGxpc3Qgd2l0aCAlZCBlbnRyaWVzIiwgZW50cnlfY291bnQpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBvZmY2NF90IGVudHJpZXNvZmZzZXQgPSBkYXRhX29mZnNldCArIDg7CkBAIC0xMTMzLDEyICsxMTU3LDE1IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgRm91ckNDMk1JTUUob3JpZ2luYWxfZm91cmNjKSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgRm91ckNDMk1JTUUob3JpZ2luYWxfZm91cmNjKSk7CiAgICAgICAgICAgICB1aW50MzJfdCBudW1fY2hhbm5lbHMgPSAwOwogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlX3JhdGUgPSAwOwogICAgICAgICAgICAgaWYgKEFkanVzdENoYW5uZWxzQW5kUmF0ZShvcmlnaW5hbF9mb3VyY2MsICZudW1fY2hhbm5lbHMsICZzYW1wbGVfcmF0ZSkpIHsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG51bV9jaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlX3JhdGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBudW1fY2hhbm5lbHMpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgc2FtcGxlX3JhdGUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBJZiBmb3JtYXQgdHlwZSBpcyAnYWxhYycsIGl0IGlzIG5lY2Vzc2FyeSB0byBnZXQgdGhlIHBhcmFtZXRlcnMKQEAgLTExNjcsMTEgKzExOTQsMTQgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICB1aW50OF90IGJpdHNQZXJTYW1wbGUgPSBjb29raWVbNV07Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Qml0c1BlclNhbXBsZSwgYml0c1BlclNhbXBsZSk7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBjb29raWVbOV0pOwotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIFUzMl9BVCgmY29va2llWzIwXSkpOwotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleUFsYWNNYWdpY0Nvb2tpZSwgTWV0YURhdGE6OlRZUEVfTk9ORSwgY29va2llLCBzaXplb2YoY29va2llKSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSwgYml0c1BlclNhbXBsZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIGNvb2tpZVs5XSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBVMzJfQVQoJmNvb2tpZVsyMF0pKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBjb29raWUsIHNpemVvZihjb29raWUpKTsKIAogICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgc2l6ZSBvZiBBTEFDIFNwZWNpZmljIEluZm8gKDM2IGJ5dGVzKSBhbmQgdGVybWluYXRvcgogICAgICAgICAgICAgICAgIC8vIGF0b20gKDggYnl0ZXMpLgpAQCAtMTI3MiwxNiArMTMwMiwyMyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQzMl90IHRtcEFsZ29yaXRobUlkOwotICAgICAgICAgICAgaWYgKCFtTGFzdFRyYWNrLT5tZXRhLmZpbmRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgJnRtcEFsZ29yaXRobUlkKSkgewotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNyeXB0b01vZGUsIGRlZmF1bHRBbGdvcml0aG1JZCk7CisgICAgICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLCAmdG1wQWxnb3JpdGhtSWQpKSB7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLCBkZWZhdWx0QWxnb3JpdGhtSWQpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplLCBkZWZhdWx0SVZTaXplKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvS2V5LCAndGVuYycsIGRlZmF1bHRLZXlJZCwgMTYpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RW5jcnlwdGVkQnl0ZUJsb2NrLCBkZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVNraXBCeXRlQmxvY2ssIGRlZmF1bHRTa2lwQnl0ZUJsb2NrKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19ERUZBVUxUX0lWX1NJWkUsIGRlZmF1bHRJVlNpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksIGRlZmF1bHRLZXlJZCwgMTYpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9CWVRFX0JMT0NLLCBkZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19TS0lQX0JZVEVfQkxPQ0ssIGRlZmF1bHRTa2lwQnl0ZUJsb2NrKTsKICAgICAgICAgICAgIGlmIChkZWZhdWx0Q29uc3RhbnRJdiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXREYXRhKGtLZXlDcnlwdG9JViwgJ2RjaXYnLCBkZWZhdWx0Q29uc3RhbnRJdi0+ZGF0YSgpLCBkZWZhdWx0Q29uc3RhbnRJdi0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0lWLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdENvbnN0YW50SXYtPmRhdGEoKSwgZGVmYXVsdENvbnN0YW50SXYtPnNpemUoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTQzMCw4ICsxNDY3LDggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gMCAmJiBtTGFzdFRyYWNrLT50aW1lc2NhbGUgIT0gMCkgewotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sIChkdXJhdGlvbiAqIDEwMDAwMDApIC8gbUxhc3RUcmFjay0+dGltZXNjYWxlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChkdXJhdGlvbiAqIDEwMDAwMDApIC8gbUxhc3RUcmFjay0+dGltZXNjYWxlKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdWludDhfdCBsYW5nWzJdOwpAQCAtMTQ1OCw4ICsxNDk1LDcgQEAKICAgICAgICAgICAgIGxhbmdfY29kZVsyXSA9IChsYW5nWzFdICYgMHgxZikgKyAweDYwOwogICAgICAgICAgICAgbGFuZ19jb2RlWzNdID0gJ1wwJzsKIAotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBrS2V5TWVkaWFMYW5ndWFnZSwgbGFuZ19jb2RlKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9MQU5HVUFHRSwgbGFuZ19jb2RlKTsKIAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTE0OTMsNyArMTUyOSw3IEBACiAgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAotICAgICAgICAgICAgICAgIENIRUNLKG1MYXN0VHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgICAgICAgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpOwogICAgICAgICAgICAgICAgIGlmIChzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1RFWFRfM0dQUCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNhc2VjbXAobWltZSwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBub3cgd2Ugb25seSBzdXBwb3J0IGEgc2luZ2xlIHR5cGUgb2YgbWVkaWEgcGVyIHRyYWNrLgpAQCAtMTUzMyw5ICsxNTY5LDQwIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBTdHJpbmc4IG1pbWVGb3JtYXQoKGNvbnN0IGNoYXIgKikoYnVmZmVyLmdldCgpKSwgY2h1bmtfZGF0YV9zaXplKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIG1pbWVGb3JtYXQuc3RyaW5nKCkpOworICAgICAgICAgICAgLy8gUHJpb3IgdG8gQVBJIDI5LCB0aGUgbWV0YWRhdGEgdHJhY2sgd2FzIG5vdCBjb21wbGlhbnQgd2l0aCBJU08vSUVDCisgICAgICAgICAgICAvLyAxNDQ5Ni0xMi0yMDE1LiBUaGlzIGxlZCB0byBzb21lIElTTy1jb21wbGlhbnQgcGFyc2VycyBmYWlsaW5nIHRvIHJlYWQgdGhlCisgICAgICAgICAgICAvLyBtZXRhdHJhY2suIEFzIG9mIEFQSSAyOSBhbmQgb253YXJkcywgYSBjaGFuZ2Ugd2FzIG1hZGUgdG8gbWV0YWRhdGEgdHJhY2sgdG8KKyAgICAgICAgICAgIC8vIG1ha2UgaXQgY29tcGxpYW50IHdpdGggdGhlIHN0YW5kYXJkLiBUaGUgd29ya2Fyb3VuZCBpcyB0byB3cml0ZSB0aGUKKyAgICAgICAgICAgIC8vIG51bGwtdGVybWluYXRlZCBtaW1lX2Zvcm1hdCBzdHJpbmcgdHdpY2UuIFRoaXMgYWxsb3dzIGNvbXBsaWFudCBwYXJzZXJzIHRvCisgICAgICAgICAgICAvLyByZWFkIHRoZSBtaXNzaW5nIHJlc2VydmVkLCBkYXRhX3JlZmVyZW5jZV9pbmRleCwgYW5kIGNvbnRlbnRfZW5jb2RpbmcgZmllbGRzCisgICAgICAgICAgICAvLyBmcm9tIHRoZSBmaXJzdCBtaW1lX3R5cGUgc3RyaW5nLiBUaGUgYWN0dWFsIG1pbWVfZm9ybWF0IGZpZWxkIHdvdWxkIHRoZW4gYmUKKyAgICAgICAgICAgIC8vIHJlYWQgY29ycmVjdGx5IGZyb20gdGhlIHNlY29uZCBzdHJpbmcuIFRoZSBub24tY29tcGxpYW50IEFuZHJvaWQgZnJhbWV3b3JrcworICAgICAgICAgICAgLy8gZnJvbSBBUEkgMjggYW5kIGVhcmxpZXIgd291bGQgc3RpbGwgYmUgYWJsZSB0byByZWFkIHRoZSBtaW1lX2Zvcm1hdCBjb3JyZWN0bHkKKyAgICAgICAgICAgIC8vIGFzIGl0IHdvdWxkIG9ubHkgcmVhZCB0aGUgZmlyc3QgbnVsbC10ZXJtaW5hdGVkIG1pbWVfZm9ybWF0IHN0cmluZy4gVG8gZW5hYmxlCisgICAgICAgICAgICAvLyByZWFkaW5nIG1ldGFkYXRhIHRyYWNrcyBnZW5lcmF0ZWQgZnJvbSBib3RoIHRoZSBub24tY29tcGxpYW50IGFuZCBjb21wbGlhbnQKKyAgICAgICAgICAgIC8vIGZvcm1hdHMsIGEgY2hlY2sgbmVlZHMgdG8gYmUgZG9uZSB0byBzZWUgd2hpY2ggZm9ybWF0IGlzIHVzZWQuCisgICAgICAgICAgICBpbnQgbnVsbF9wb3MgPSAwOworICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3RyID0gYnVmZmVyLmdldCgpOworICAgICAgICAgICAgd2hpbGUgKG51bGxfcG9zIDwgY2h1bmtfZGF0YV9zaXplKSB7CisgICAgICAgICAgICAgIGlmICgqKHN0ciArIG51bGxfcG9zKSA9PSAnXDAnKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgKytudWxsX3BvczsKKyAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKG51bGxfcG9zID09IGNodW5rX2RhdGFfc2l6ZSAtIDEpIHsKKyAgICAgICAgICAgICAgLy8gVGhpcyBpcyBub3QgYSBzdGFuZGFyZCBvbXBsaWFudCBtZXRhZGF0YSB0cmFjay4KKyAgICAgICAgICAgICAgU3RyaW5nOCBtaW1lRm9ybWF0KChjb25zdCBjaGFyICopKGJ1ZmZlci5nZXQoKSksIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgbWltZUZvcm1hdC5zdHJpbmcoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgc3RhbmRhcmQgY29tcGxpYW50IG1ldGFkYXRhIHRyYWNrLgorICAgICAgICAgICAgICBTdHJpbmc4IGNvbnRlbnRFbmNvZGluZygoY29uc3QgY2hhciAqKShidWZmZXIuZ2V0KCkgKyA4KSk7CisgICAgICAgICAgICAgIFN0cmluZzggbWltZUZvcm1hdCgoY29uc3QgY2hhciAqKShidWZmZXIuZ2V0KCkgKyA4ICsgY29udGVudEVuY29kaW5nLnNpemUoKSArIDEpLAorICAgICAgICAgICAgICAgICAgY2h1bmtfZGF0YV9zaXplIC0gOCAtIGNvbnRlbnRFbmNvZGluZy5zaXplKCkgLSAxKTsKKyAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBtaW1lRm9ybWF0LnN0cmluZygpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTE2MTMsMjAgKzE2ODAsMjMgQEAKIAogICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgIT0gRk9VUkNDKCdlJywgJ24nLCAnYycsICdhJykpIHsKICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgY2h1bmsgdHlwZSBpcyBlbmNhLCB3ZSdsbCBnZXQgdGhlIHR5cGUgZnJvbSB0aGUgZnJtYSBib3ggbGF0ZXIKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBGb3VyQ0MyTUlNRShjaHVua190eXBlKSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBGb3VyQ0MyTUlNRShjaHVua190eXBlKSk7CiAgICAgICAgICAgICAgICAgQWRqdXN0Q2hhbm5lbHNBbmRSYXRlKGNodW5rX3R5cGUsICZudW1fY2hhbm5lbHMsICZzYW1wbGVfcmF0ZSk7CiAKICAgICAgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXLCBGb3VyQ0MyTUlNRShjaHVua190eXBlKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Qml0c1BlclNhbXBsZSwgc2FtcGxlX3NpemUpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSwgc2FtcGxlX3NpemUpOwogICAgICAgICAgICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ3QnLCAndycsICdvJywgJ3MnKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5UGNtQmlnRW5kaWFuLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1BDTV9CSUdfRU5ESUFOLCAxKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFMT0dWKCIqKiogY29kaW5nPSclcycgJWQgY2hhbm5lbHMsIHNpemUgJWQsIHJhdGUgJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgY2h1bmssIG51bV9jaGFubmVscywgc2FtcGxlX3NpemUsIHNhbXBsZV9yYXRlKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtX2NoYW5uZWxzKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIG51bV9jaGFubmVscyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgc2FtcGxlX3JhdGUpOwogCiAgICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ2EnLCAnbCcsICdhJywgJ2MnKSkgewogCkBAIC0xNjUyLDExICsxNzIyLDE0IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgdWludDhfdCBiaXRzUGVyU2FtcGxlID0gY29va2llWzVdOwotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUJpdHNQZXJTYW1wbGUsIGJpdHNQZXJTYW1wbGUpOwotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgY29va2llWzldKTsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBVMzJfQVQoJmNvb2tpZVsyMF0pKTsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldERhdGEoCi0gICAgICAgICAgICAgICAgICAgICAgICBrS2V5QWxhY01hZ2ljQ29va2llLCBNZXRhRGF0YTo6VFlQRV9OT05FLCBjb29raWUsIHNpemVvZihjb29raWUpKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQklUU19QRVJfU0FNUExFLCBiaXRzUGVyU2FtcGxlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgY29va2llWzldKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIFUzMl9BVCgmY29va2llWzIwXSkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIGNvb2tpZSwgc2l6ZW9mKGNvb2tpZSkpOwogICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0ICs9IHNpemVvZihjb29raWUpOwogICAgICAgICAgICAgICAgICpvZmZzZXQgPSBkYXRhX29mZnNldDsKICAgICAgICAgICAgICAgICBDSEVDS19FUSgqb2Zmc2V0LCBzdG9wX29mZnNldCk7CkBAIC0xNjgzLDYgKzE3NTYsNyBAQAogICAgICAgICBjYXNlIEZPVVJDQygnYScsICd2JywgJ2MnLCAnMScpOgogICAgICAgICBjYXNlIEZPVVJDQygnaCcsICd2JywgJ2MnLCAnMScpOgogICAgICAgICBjYXNlIEZPVVJDQygnaCcsICdlJywgJ3YnLCAnMScpOgorICAgICAgICBjYXNlIEZPVVJDQygnYScsICd2JywgJzAnLCAnMScpOgogICAgICAgICB7CiAgICAgICAgICAgICB1aW50OF90IGJ1ZmZlcls3OF07CiAgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgKHNzaXplX3Qpc2l6ZW9mKGJ1ZmZlcikpIHsKQEAgLTE3MTQsMTAgKzE3ODgsMTEgQEAKIAogICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgIT0gRk9VUkNDKCdlJywgJ24nLCAnYycsICd2JykpIHsKICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgY2h1bmsgdHlwZSBpcyBlbmN2LCB3ZSdsbCBnZXQgdGhlIHR5cGUgZnJvbSB0aGUgZnJtYSBib3ggbGF0ZXIKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBGb3VyQ0MyTUlNRShjaHVua190eXBlKSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBGb3VyQ0MyTUlNRShjaHVua190eXBlKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5SGVpZ2h0LCBoZWlnaHQpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsIHdpZHRoKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwgaGVpZ2h0KTsKIAogICAgICAgICAgICAgb2ZmNjRfdCBzdG9wX29mZnNldCA9ICpvZmZzZXQgKyBjaHVua19zaXplOwogICAgICAgICAgICAgKm9mZnNldCA9IGRhdGFfb2Zmc2V0ICsgc2l6ZW9mKGJ1ZmZlcik7CkBAIC0xODA1LDEyICsxODgwLDE1IEBACiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJtYXggc2FtcGxlIHNpemUgdG9vIGJpZzogJXp1IiwgbWF4X3NpemUpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIG1heF9zaXplICsgMTAgKiAyKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsIG1heF9zaXplICsgMTAgKiAyKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gTm8gc2l6ZSB3YXMgc3BlY2lmaWVkLiBQaWNrIGEgY29uc2VydmF0aXZlbHkgbGFyZ2Ugc2l6ZS4KICAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgaGVpZ2h0OwotICAgICAgICAgICAgICAgIGlmICghbUxhc3RUcmFjay0+bWV0YS5maW5kSW50MzIoa0tleVdpZHRoLCAoaW50MzJfdCopJndpZHRoKSB8fAotICAgICAgICAgICAgICAgICAgICAhbUxhc3RUcmFjay0+bWV0YS5maW5kSW50MzIoa0tleUhlaWdodCwoaW50MzJfdCopICZoZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsIChpbnQzMl90Kikmd2lkdGgpIHx8CisgICAgICAgICAgICAgICAgICAgICFBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwoaW50MzJfdCopICZoZWlnaHQpKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJObyB3aWR0aCBvciBoZWlnaHQsIGFzc3VtaW5nIHdvcnN0IGNhc2UgMTA4MHAiKTsKICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAxOTIwOwogICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSAxMDgwOwpAQCAtMTgyNSw3ICsxOTAzLDcgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICAgICAgICAgIENIRUNLKG1MYXN0VHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgICAgICAgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpOwogICAgICAgICAgICAgICAgIGlmICghc3RybmNtcChtaW1lLCAiYXVkaW8vIiwgNikpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGF1ZGlvLCB1c2UgMTI4S0IKICAgICAgICAgICAgICAgICAgICAgbWF4X3NpemUgPSAxMDI0ICogMTI4OwpAQCAtMTg0MiwyNiArMTkyMCwyOCBAQAogICAgICAgICAgICAgICAgIC8vIEhBQ0s6IGFsbG93IDEwJSBvdmVyaGVhZAogICAgICAgICAgICAgICAgIC8vIFRPRE86IHJlYWQgc2FtcGxlIHNpemUgZnJvbSB0cmFmIGF0b20gZm9yIGZyYWdtZW50ZWQgTVBFRzQuCiAgICAgICAgICAgICAgICAgbWF4X3NpemUgKz0gbWF4X3NpemUgLyAxMDsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIG1heF9zaXplKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSwgbWF4X3NpemUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBOT1RFOiBzZXR0aW5nIGFub3RoZXIgcGllY2Ugb2YgbWV0YWRhdGEgaW52YWxpZGF0ZXMgYW55IHBvaW50ZXJzIChzdWNoIGFzIHRoZQogICAgICAgICAgICAgLy8gbWltZXR5cGUpIHByZXZpb3VzbHkgb2J0YWluZWQsIHNvIGRvbid0IGNhY2hlIHRoZW0uCiAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICAgICAgQ0hFQ0sobUxhc3RUcmFjay0+bWV0YS5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisgICAgICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKTsKICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBhdmVyYWdlIGZyYW1lIHJhdGUuCiAgICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKCJ2aWRlby8iLCBtaW1lLCA2KSkgewogICAgICAgICAgICAgICAgIHNpemVfdCBuU2FtcGxlcyA9IG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5jb3VudFNhbXBsZXMoKTsKICAgICAgICAgICAgICAgICBpZiAoblNhbXBsZXMgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRyYWNrSWQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrLT5tZXRhLmZpbmRJbnQzMihrS2V5VHJhY2tJRCwgJnRyYWNrSWQpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCAmdHJhY2tJZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyZXguc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmV4ICp0ID0gJm1UcmV4LmVkaXRJdGVtQXQoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQtPnRyYWNrX0lEID09ICh1aW50MzJfdCkgdHJhY2tJZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC0+ZGVmYXVsdF9zYW1wbGVfZHVyYXRpb24gPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lUmF0ZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnRpbWVzY2FsZSAvIHQtPmRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RnJhbWVSYXRlLCBmcmFtZVJhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURSwgZnJhbWVSYXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0xODY5LDE1ICsxOTQ5LDE4IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrLT5tZXRhLmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvblVzKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDY0KG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgJmR1cmF0aW9uVXMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb25VcyA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lUmF0ZSA9IChuU2FtcGxlcyAqIDEwMDAwMDBMTCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGR1cmF0aW9uVXMgPj4gMSkpIC8gZHVyYXRpb25VczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlGcmFtZVJhdGUsIGZyYW1lUmF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX1JBVEUsIGZyYW1lUmF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInNldHRpbmcgZnJhbWUgY291bnQgJXp1IiwgblNhbXBsZXMpOwotICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlGcmFtZUNvdW50LCBuU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfQ09VTlQsIG5TYW1wbGVzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTE5ODUsNyArMjA2OCw3IEBACiAgICAgICAgICAgICBpZiAoYnVmZmVyW2xlbiAtIDFdICE9ICcvJykgewogICAgICAgICAgICAgICAgIGJ1ZmZlcltsZW5dID0gJy8nOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlMb2NhdGlvbiwgJmJ1ZmZlclswXSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfTE9DQVRJT04sICZidWZmZXJbMF0pOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMjAxNSw4ICsyMDk4LDggQEAKICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXREYXRhKAotICAgICAgICAgICAgICAgICAgICBrS2V5RVNEUywga1R5cGVFU0RTLCAmYnVmZmVyWzRdLCBjaHVua19kYXRhX3NpemUgLSA0KTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwgCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRVNEUywgJmJ1ZmZlcls0XSwgY2h1bmtfZGF0YV9zaXplIC0gNCk7CiAKICAgICAgICAgICAgIGlmIChtUGF0aC5zaXplKCkgPj0gMgogICAgICAgICAgICAgICAgICAgICAmJiBtUGF0aFttUGF0aC5zaXplKCkgLSAyXSA9PSBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ2EnKSkgewpAQCAtMjA0MCw3ICsyMTIzLDggQEAKICAgICAgICAgICAgICAgICB1aW50OF90IG9iamVjdFR5cGVJbmRpY2F0aW9uOwogICAgICAgICAgICAgICAgIGlmIChlc2RzLmdldE9iamVjdFR5cGVJbmRpY2F0aW9uKCZvYmplY3RUeXBlSW5kaWNhdGlvbikgPT0gT0spIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdFR5cGVJbmRpY2F0aW9uID49IDB4NjAgJiYgb2JqZWN0VHlwZUluZGljYXRpb24gPD0gMHg2NSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIpOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTIwNjcsMTAgKzIxNTEsMTIgQEAKICAgICAgICAgICAgIHVpbnQzMl90IG1heEJpdHJhdGUgPSBVMzJfQVQoJmJ1ZmZlcls0XSk7CiAgICAgICAgICAgICB1aW50MzJfdCBhdmdCaXRyYXRlID0gVTMyX0FUKCZidWZmZXJbOF0pOwogICAgICAgICAgICAgaWYgKG1heEJpdHJhdGUgPiAwICYmIG1heEJpdHJhdGUgPCBJTlQzMl9NQVgpIHsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlNYXhCaXRSYXRlLCAoaW50MzJfdCltYXhCaXRyYXRlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0JJVF9SQVRFLCAoaW50MzJfdCltYXhCaXRyYXRlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChhdmdCaXRyYXRlID4gMCAmJiBhdmdCaXRyYXRlIDwgSU5UMzJfTUFYKSB7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Qml0UmF0ZSwgKGludDMyX3QpYXZnQml0cmF0ZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFLCAoaW50MzJfdClhdmdCaXRyYXRlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yMDk0LDggKzIxODAsOCBAQAogICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCi0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldERhdGEoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlBVkNDLCBrVHlwZUFWQ0MsIGJ1ZmZlci5nZXQoKSwgY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwgCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0FWQywgYnVmZmVyLmdldCgpLCBjaHVua19kYXRhX3NpemUpOwogCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjExNiw4ICsyMjAyLDggQEAKICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXREYXRhKAotICAgICAgICAgICAgICAgICAgICBrS2V5SFZDQywga1R5cGVIVkNDLCBidWZmZXIuZ2V0KCksIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsIAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF9IRVZDLCBidWZmZXIuZ2V0KCksIGNodW5rX2RhdGFfc2l6ZSk7CiAKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjE1Miw3ICsyMjM4LDggQEAKICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXREYXRhKGtLZXlEMjYzLCBrVHlwZUQyNjMsIGJ1ZmZlciwgY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9EMjYzLCBidWZmZXIsIGNodW5rX2RhdGFfc2l6ZSk7CiAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yMjgwLDE1ICsyMzY3LDE1IEBACiAgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBkMzI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gMCAmJiBtSGVhZGVyVGltZXNjYWxlICE9IDAgJiYgZHVyYXRpb24gPCBVSU5UNjRfTUFYIC8gMTAwMDAwMCkgewotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvbiAqIDEwMDAwMDAgLyBtSGVhZGVyVGltZXNjYWxlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uICogMTAwMDAwMCAvIG1IZWFkZXJUaW1lc2NhbGUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBTdHJpbmc4IHM7CiAgICAgICAgICAgICBpZiAoY29udmVydFRpbWVUb0RhdGUoY3JlYXRpb25UaW1lLCAmcykpIHsKLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleURhdGUsIHMuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9EQVRFLCBzLnN0cmluZygpKTsKICAgICAgICAgICAgIH0KIAotCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0yMzMwLDcgKzI0MTcsOCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gMCAmJiBtSGVhZGVyVGltZXNjYWxlICE9IDApIHsKLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb24gKiAxMDAwMDAwIC8gbUhlYWRlclRpbWVzY2FsZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCBkdXJhdGlvbiAqIDEwMDAwMDAgLyBtSGVhZGVyVGltZXNjYWxlKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYnJlYWs7CkBAIC0yMzY0LDcgKzI0NTIsOCBAQAogICAgICAgICAgICAgLy8gZm9yIGEgcHJhY3RpY2FsIHJlYXNvbiBhcyB2YXJpb3VzIE1QRUc0IGNvbnRhaW5lcnMgdXNlIGl0LgogICAgICAgICAgICAgaWYgKHR5cGUgPT0gRk9VUkNDKCd0JywgJ2UnLCAneCcsICd0JykgfHwgdHlwZSA9PSBGT1VSQ0MoJ3MnLCAnYicsICd0JywgJ2wnKSkgewogICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTI0MDgsMTEgKzI0OTcsMTAgQEAKICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAotICAgICAgICAgICAgdWludDMyX3QgdHlwZTsKLSAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgICAgICAgICB2b2lkICpkYXRhOwogICAgICAgICAgICAgc2l6ZV90IHNpemUgPSAwOwotICAgICAgICAgICAgaWYgKCFtTGFzdFRyYWNrLT5tZXRhLmZpbmREYXRhKAotICAgICAgICAgICAgICAgICAgICBrS2V5VGV4dEZvcm1hdERhdGEsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9URVhUX0ZPUk1BVF9EQVRBLCAmZGF0YSwgJnNpemUpKSB7CiAgICAgICAgICAgICAgICAgc2l6ZSA9IDA7CiAgICAgICAgICAgICB9CiAKQEAgLTI0MzksOCArMjUyNyw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldERhdGEoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUZXh0Rm9ybWF0RGF0YSwgMCwgYnVmZmVyLCBzaXplICsgY2h1bmtfc2l6ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVEVYVF9GT1JNQVRfREFUQSwgYnVmZmVyLCBzaXplICsgY2h1bmtfc2l6ZSk7CiAKICAgICAgICAgICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKIApAQCAtMjQ3Miw4ICsyNTYwLDggQEAKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldERhdGEoCi0gICAgICAgICAgICAgICAga0tleUFsYnVtQXJ0LCBNZXRhRGF0YTo6VFlQRV9OT05FLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtRmlsZU1ldGFEYXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlQsCiAgICAgICAgICAgICAgICAgYnVmZmVyLmdldCgpICsga1NraXBCeXRlc09mRGF0YUJveCwgY2h1bmtfZGF0YV9zaXplIC0ga1NraXBCeXRlc09mRGF0YUJveCk7CiAKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjU0Nyw3ICsyNjM1LDE5IEBACiAgICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ2MnLCAnLScsICczJyk6CiAgICAgICAgIHsKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLSAgICAgICAgICAgIHJldHVybiBwYXJzZUFDM1NhbXBsZUVudHJ5KGRhdGFfb2Zmc2V0KTsKKyAgICAgICAgICAgIHJldHVybiBwYXJzZUFDM1NwZWNpZmljQm94KGRhdGFfb2Zmc2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCdlJywgJ2MnLCAnLScsICczJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgIHJldHVybiBwYXJzZUVBQzNTcGVjaWZpY0JveChkYXRhX29mZnNldCk7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygnYScsICdjJywgJy0nLCAnNCcpOgorICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICByZXR1cm4gcGFyc2VBQzRTcGVjaWZpY0JveChkYXRhX29mZnNldCk7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIEZPVVJDQygnZicsICd0JywgJ3knLCAncCcpOgpAQCAtMjYyMSwzNiArMjcyMSwzMjggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZUFDM1NhbXBsZUVudHJ5KG9mZjY0X3Qgb2Zmc2V0KSB7CitzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VDaGFubmVsQ291bnRTYW1wbGVSYXRlKAorICAgICAgICBvZmY2NF90ICpvZmZzZXQsIHVpbnQxNl90ICpjaGFubmVsQ291bnQsIHVpbnQxNl90ICpzYW1wbGVSYXRlKSB7CiAgICAgLy8gc2tpcCAxNiBieXRlczoKICAgICAvLyAgKyA2LWJ5dGUgcmVzZXJ2ZWQsCiAgICAgLy8gICsgMi1ieXRlIGRhdGEgcmVmZXJlbmNlIGluZGV4LAogICAgIC8vICArIDgtYnl0ZSByZXNlcnZlZAotICAgIG9mZnNldCArPSAxNjsKLSAgICB1aW50MTZfdCBjaGFubmVsQ291bnQ7Ci0gICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDE2KG9mZnNldCwgJmNoYW5uZWxDb3VudCkpIHsKKyAgICAqb2Zmc2V0ICs9IDE2OworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQxNigqb2Zmc2V0LCBjaGFubmVsQ291bnQpKSB7CisgICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcmVhZGluZyBzYW1wbGUgZW50cnkgYm94OiBjYW5ub3QgcmVhZCBjaGFubmVsIGNvdW50Iik7CiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogICAgIC8vIHNraXAgOCBieXRlczoKICAgICAvLyAgKyAyLWJ5dGUgY2hhbm5lbENvdW50LAogICAgIC8vICArIDItYnl0ZSBzYW1wbGUgc2l6ZSwKICAgICAvLyAgKyA0LWJ5dGUgcmVzZXJ2ZWQKLSAgICBvZmZzZXQgKz0gODsKLSAgICB1aW50MTZfdCBzYW1wbGVSYXRlOwotICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQxNihvZmZzZXQsICZzYW1wbGVSYXRlKSkgewotICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgYWMtMyBibG9jazogY2Fubm90IHJlYWQgc2FtcGxlIHJhdGUiKTsKKyAgICAqb2Zmc2V0ICs9IDg7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDE2KCpvZmZzZXQsIHNhbXBsZVJhdGUpKSB7CisgICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcmVhZGluZyBzYW1wbGUgZW50cnkgYm94OiBjYW5ub3QgcmVhZCBzYW1wbGUgcmF0ZSIpOwogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KLQogICAgIC8vIHNraXAgNCBieXRlczoKICAgICAvLyAgKyAyLWJ5dGUgc2FtcGxlUmF0ZSwKICAgICAvLyAgKyAyLWJ5dGUgcmVzZXJ2ZWQKLSAgICBvZmZzZXQgKz0gNDsKLSAgICByZXR1cm4gcGFyc2VBQzNTcGVjaWZpY0JveChvZmZzZXQsIHNhbXBsZVJhdGUpOworICAgICpvZmZzZXQgKz0gNDsKKyAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZUFDM1NwZWNpZmljQm94KAotICAgICAgICBvZmY2NF90IG9mZnNldCwgdWludDE2X3Qgc2FtcGxlUmF0ZSkgeworc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlQUM0U3BlY2lmaWNCb3gob2ZmNjRfdCBvZmZzZXQpIHsKKyAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdWludDE2X3Qgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50OworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcnNlQ2hhbm5lbENvdW50U2FtcGxlUmF0ZSgmb2Zmc2V0LCAmY2hhbm5lbENvdW50LCAmc2FtcGxlUmF0ZSkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHVpbnQzMl90IHNpemU7CisgICAgLy8gKyA0LWJ5dGUgc2l6ZQorICAgIC8vICsgNC1ieXRlIHR5cGUKKyAgICAvLyArIDMtYnl0ZSBwYXlsb2FkCisgICAgY29uc3QgdWludDMyX3Qga0FDNE1pbmltdW1Cb3hTaXplID0gNCArIDQgKyAzOworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZzaXplKSB8fCBzaXplIDwga0FDNE1pbmltdW1Cb3hTaXplKSB7CisgICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcmVhZGluZyBhYy00IGJsb2NrOiBjYW5ub3QgcmVhZCBzcGVjaWZpYyBib3ggc2l6ZSIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIC8vICsgNC1ieXRlIHNpemUKKyAgICBvZmZzZXQgKz0gNDsKKyAgICB1aW50MzJfdCB0eXBlOworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZ0eXBlKSB8fCB0eXBlICE9IEZPVVJDQygnZCcsICdhJywgJ2MnLCAnNCcpKSB7CisgICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcmVhZGluZyBhYy00IHNwZWNpZmljIGJsb2NrOiBoZWFkZXIgbm90IGRhYzQiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICAvLyArIDQtYnl0ZSB0eXBlCisgICAgb2Zmc2V0ICs9IDQ7CisgICAgY29uc3QgdWludDMyX3Qga0FDNFNwZWNpZmljQm94UGF5bG9hZFNpemUgPSAxMTc2OworICAgIHVpbnQ4X3QgY2h1bmtba0FDNFNwZWNpZmljQm94UGF5bG9hZFNpemVdOworICAgIHNzaXplX3QgZHNpU2l6ZSA9IHNpemUgLSA4OyAvLyBzaXplIG9mIGJveCAtIHNpemUgYW5kIHR5cGUgZmllbGRzCisgICAgaWYgKGRzaVNpemUgPj0gKHNzaXplX3Qpa0FDNFNwZWNpZmljQm94UGF5bG9hZFNpemUgfHwKKyAgICAgICAgbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGNodW5rLCBkc2lTaXplKSAhPSBkc2lTaXplKSB7CisgICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcmVhZGluZyBhYy00IHNwZWNpZmljIGJsb2NrOiBiaXRzdHJlYW0gZmllbGRzIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIC8vICsgc2l6ZS1ieXRlIHBheWxvYWQKKyAgICBvZmZzZXQgKz0gZHNpU2l6ZTsKKyAgICBBQml0UmVhZGVyIGJyKGNodW5rLCBkc2lTaXplKTsKKyAgICBBQzREU0lQYXJzZXIgcGFyc2VyKGJyKTsKKyAgICBpZiAoIXBhcnNlci5wYXJzZSgpKXsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSBwYXJzaW5nIGFjLTQgc3BlY2lmaWMgYmxvY2siKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0KTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBjaGFubmVsQ291bnQpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBzYW1wbGVSYXRlKTsKKworICAgIEF1ZGlvUHJlc2VudGF0aW9uQ29sbGVjdGlvbiBwcmVzZW50YXRpb25zOworICAgIC8vIHRyYW5zbGF0ZSB0aGUgQUM0IHByZXNlbnRhdGlvbiBpbmZvcm1hdGlvbiB0byBhdWRpbyBwcmVzZW50YXRpb25zIGZvciB0aGlzIHRyYWNrCisgICAgQUM0RFNJUGFyc2VyOjpBQzRQcmVzZW50YXRpb25zIGFjNFByZXNlbnRhdGlvbnMgPSBwYXJzZXIuZ2V0UHJlc2VudGF0aW9ucygpOworICAgIGlmICghYWM0UHJlc2VudGF0aW9ucy5lbXB0eSgpKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgYWM0UHJlc2VudGF0aW9uIDogYWM0UHJlc2VudGF0aW9ucykgeworICAgICAgICAgICAgYXV0byYgcHJlc2VudGF0aW9uID0gYWM0UHJlc2VudGF0aW9uLnNlY29uZDsKKyAgICAgICAgICAgIGlmICghcHJlc2VudGF0aW9uLm1FbmFibGVkKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBdWRpb1ByZXNlbnRhdGlvblYxIGFwOworICAgICAgICAgICAgYXAubVByZXNlbnRhdGlvbklkID0gcHJlc2VudGF0aW9uLm1Hcm91cEluZGV4OworICAgICAgICAgICAgYXAubVByb2dyYW1JZCA9IHByZXNlbnRhdGlvbi5tUHJvZ3JhbUlEOworICAgICAgICAgICAgYXAubUxhbmd1YWdlID0gcHJlc2VudGF0aW9uLm1MYW5ndWFnZTsKKyAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb24ubVByZVZpcnR1YWxpemVkKSB7CisgICAgICAgICAgICAgICAgYXAubU1hc3RlcmluZ0luZGljYXRpb24gPSBNQVNURVJFRF9GT1JfSEVBRFBIT05FOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHByZXNlbnRhdGlvbi5tQ2hhbm5lbE1vZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlX01vbm86CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV9TdGVyZW86CisgICAgICAgICAgICAgICAgICAgICAgICBhcC5tTWFzdGVyaW5nSW5kaWNhdGlvbiA9IE1BU1RFUkVEX0ZPUl9TVEVSRU87CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzNfMDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzVfMDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzVfMToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzdfMF8zNDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzdfMV8zNDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzdfMF81MjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzdfMV81MjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwLm1NYXN0ZXJpbmdJbmRpY2F0aW9uID0gTUFTVEVSRURfRk9SX1NVUlJPVU5EOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV83XzBfMzIyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfN18xXzMyMjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzdfMF80OgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfN18xXzQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV85XzBfNDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzlfMV80OgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfMjJfMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwLm1NYXN0ZXJpbmdJbmRpY2F0aW9uID0gTUFTVEVSRURfRk9SXzNEOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBjaGFubmVsIG1vZGUgaW4gQUM0IHByZXNlbnRhdGlvbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFwLm1BdWRpb0Rlc2NyaXB0aW9uQXZhaWxhYmxlID0gKHByZXNlbnRhdGlvbi5tQ29udGVudENsYXNzaWZpZXIgPT0KKyAgICAgICAgICAgICAgICAgICAgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtWaXN1YWxseUltcGFpcmVkKTsKKyAgICAgICAgICAgIGFwLm1TcG9rZW5TdWJ0aXRsZXNBdmFpbGFibGUgPSAocHJlc2VudGF0aW9uLm1Db250ZW50Q2xhc3NpZmllciA9PQorICAgICAgICAgICAgICAgICAgICBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a1ZvaWNlT3Zlcik7CisgICAgICAgICAgICBhcC5tRGlhbG9ndWVFbmhhbmNlbWVudEF2YWlsYWJsZSA9IHByZXNlbnRhdGlvbi5tSGFzRGlhbG9nRW5oYW5jZW1lbnRzOworICAgICAgICAgICAgaWYgKCFhcC5tTGFuZ3VhZ2UuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGFwLm1MYWJlbHMuZW1wbGFjZShhcC5tTGFuZ3VhZ2UsIHByZXNlbnRhdGlvbi5tRGVzY3JpcHRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJlc2VudGF0aW9ucy5wdXNoX2JhY2soc3RkOjptb3ZlKGFwKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocHJlc2VudGF0aW9ucy5lbXB0eSgpKSB7CisgICAgICAgIC8vIENsZWFyIGF1ZGlvIHByZXNlbnRhdGlvbiBpbmZvIGluIG1ldGFkYXRhLgorICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKAorICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX0lORk8sIG51bGxwdHIsIDApOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXRTdHJlYW0oc3RkOjppb3M6Om91dCk7CisgICAgICAgIHNlcmlhbGl6ZUF1ZGlvUHJlc2VudGF0aW9ucyhwcmVzZW50YXRpb25zLCAmb3V0U3RyZWFtKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcigKKyAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9JTkZPLAorICAgICAgICAgICAgICAgIG91dFN0cmVhbS5zdHIoKS5kYXRhKCksIG91dFN0cmVhbS5zdHIoKS5zaXplKCkpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZUVBQzNTcGVjaWZpY0JveChvZmY2NF90IG9mZnNldCkgeworICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICB1aW50MTZfdCBzYW1wbGVSYXRlLCBjaGFubmVsczsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKChzdGF0dXMgPSBwYXJzZUNoYW5uZWxDb3VudFNhbXBsZVJhdGUoJm9mZnNldCwgJmNoYW5uZWxzLCAmc2FtcGxlUmF0ZSkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHVpbnQzMl90IHNpemU7CisgICAgLy8gKyA0LWJ5dGUgc2l6ZQorICAgIC8vICsgNC1ieXRlIHR5cGUKKyAgICAvLyArIDMtYnl0ZSBwYXlsb2FkCisgICAgY29uc3QgdWludDMyX3Qga0VBQzNTcGVjaWZpY0JveE1pblNpemUgPSAxMTsKKyAgICAvLyAxMyArIDMgKyAoOCAqICgyICsgNSArIDUgKyAzICsgMSArIDMgKyA0ICsgKDE0ICogOSArIDEpKSkgYml0cyA9PSAxNTIgYnl0ZXMgdGhlb3JldGljYWwgbWF4CisgICAgLy8gY2FsY3VsYXRlZCBmcm9tIHRoZSByZXF1aXJlZCBiaXRzIHJlYWQgYmVsb3cgYXMgd2VsbCBhcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgaW5kZXBlbmRlbnQKKyAgICAvLyBhbmQgZGVwZW5kYW50IHN1YiBzdHJlYW1zIHlvdSBjYW4gaGF2ZQorICAgIGNvbnN0IHVpbnQzMl90IGtFQUMzU3BlY2lmaWNCb3hNYXhTaXplID0gMTUyOworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZzaXplKSB8fAorICAgICAgICBzaXplIDwga0VBQzNTcGVjaWZpY0JveE1pblNpemUgfHwKKyAgICAgICAgc2l6ZSA+IGtFQUMzU3BlY2lmaWNCb3hNYXhTaXplKSB7CisgICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcmVhZGluZyBlYWMtMyBibG9jazogY2Fubm90IHJlYWQgc3BlY2lmaWMgYm94IHNpemUiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBvZmZzZXQgKz0gNDsKKyAgICB1aW50MzJfdCB0eXBlOworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZ0eXBlKSB8fCB0eXBlICE9IEZPVVJDQygnZCcsICdlJywgJ2MnLCAnMycpKSB7CisgICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcmVhZGluZyBlYWMtMyBzcGVjaWZpYyBibG9jazogaGVhZGVyIG5vdCBkZWMzIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgb2Zmc2V0ICs9IDQ7CisgICAgdWludDhfdCogY2h1bmsgPSBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFtzaXplXTsKKyAgICBpZiAoY2h1bmsgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgY2h1bmssIHNpemUpICE9IChzc2l6ZV90KXNpemUpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIGVhYy0zIHNwZWNpZmljIGJsb2NrOiBiaXRzdHJlYW0gZmllbGRzIik7CisgICAgICAgIGRlbGV0ZVtdIGNodW5rOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIEFCaXRSZWFkZXIgYnIoY2h1bmssIHNpemUpOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFubmVsQ291bnRUYWJsZVtdID0gezIsIDEsIDIsIDMsIDMsIDQsIDQsIDV9OworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzYW1wbGVSYXRlVGFibGVbXSA9IHs0ODAwMCwgNDQxMDAsIDMyMDAwfTsKKworICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgMTYpIHsKKyAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIHVuc2lnbmVkIGRhdGFfcmF0ZSA9IGJyLmdldEJpdHMoMTMpOworICAgIEFMT0dWKCJFQUMzIGRhdGEgcmF0ZSA9ICVkIiwgZGF0YV9yYXRlKTsKKworICAgIHVuc2lnbmVkIG51bV9pbmRfc3ViID0gYnIuZ2V0Qml0cygzKSArIDE7CisgICAgQUxPR1YoIkVBQzMgaW5kZXBlbmRhbnQgc3Vic3RyZWFtcyA9ICVkIiwgbnVtX2luZF9zdWIpOworICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgKG51bV9pbmRfc3ViICogMjMpKSB7CisgICAgICAgIGRlbGV0ZVtdIGNodW5rOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVuc2lnbmVkIGNoYW5uZWxDb3VudCA9IDA7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bV9pbmRfc3ViOyBpKyspIHsKKyAgICAgICAgdW5zaWduZWQgZnNjb2QgPSBici5nZXRCaXRzKDIpOworICAgICAgICBpZiAoZnNjb2QgPT0gMykgeworICAgICAgICAgICAgQUxPR0UoIkluY29ycmVjdCBmc2NvZCAoMykgaW4gRUFDMyBoZWFkZXIiKTsKKyAgICAgICAgICAgIGRlbGV0ZVtdIGNodW5rOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICB1bnNpZ25lZCBib3hTYW1wbGVSYXRlID0gc2FtcGxlUmF0ZVRhYmxlW2ZzY29kXTsKKyAgICAgICAgaWYgKGJveFNhbXBsZVJhdGUgIT0gc2FtcGxlUmF0ZSkgeworICAgICAgICAgICAgQUxPR0UoInNhbXBsZSByYXRlIG1pc21hdGNoOiBib3hTYW1wbGVSYXRlID0gJWQsIHNhbXBsZVJhdGUgPSAlZCIsCisgICAgICAgICAgICAgICAgYm94U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CisgICAgICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICB1bnNpZ25lZCBic2lkID0gYnIuZ2V0Qml0cyg1KTsKKyAgICAgICAgaWYgKGJzaWQgPCA4KSB7CisgICAgICAgICAgICBBTE9HVygiSW5jb3JyZWN0IGJzaWQgaW4gRUFDMyBoZWFkZXIuIFBvc3NpYmx5IEFDLTM/Iik7CisgICAgICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBza2lwCisgICAgICAgIGJyLnNraXBCaXRzKDIpOworICAgICAgICB1bnNpZ25lZCBic21vZCA9IGJyLmdldEJpdHMoMyk7CisgICAgICAgIHVuc2lnbmVkIGFjbW9kID0gYnIuZ2V0Qml0cygzKTsKKyAgICAgICAgdW5zaWduZWQgbGZlb24gPSBici5nZXRCaXRzKDEpOworICAgICAgICAvLyB3ZSBjdXJyZW50bHkgb25seSBzdXBwb3J0IHRoZSBmaXJzdCBzdHJlYW0KKyAgICAgICAgaWYgKGkgPT0gMCkKKyAgICAgICAgICAgIGNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudFRhYmxlW2FjbW9kXSArIGxmZW9uOworICAgICAgICBBTE9HVigiYnNtb2QgPSAlZCwgYWNtb2QgPSAlZCwgbGZlb24gPSAlZCIsIGJzbW9kLCBhY21vZCwgbGZlb24pOworCisgICAgICAgIGJyLnNraXBCaXRzKDMpOworICAgICAgICB1bnNpZ25lZCBudW1fZGVwX3N1YiA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgIEFMT0dWKCJFQUMzIGRlcGVuZGFudCBzdWJzdHJlYW1zID0gJWQiLCBudW1fZGVwX3N1Yik7CisgICAgICAgIGlmIChudW1fZGVwX3N1YiAhPSAwKSB7CisgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDkpIHsKKyAgICAgICAgICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGNoYW5fbG9jX3RibFtdID0geyAiTGMvUmMiLCJMcnMvUnJzIiwiQ3MiLCJUcyIsIkxzZC9Sc2QiLAorICAgICAgICAgICAgICAgICJMdy9SdyIsIkx2aC9SdmgiLCJDdmgiLCJMZmUyIiB9OworICAgICAgICAgICAgdW5zaWduZWQgY2hhbl9sb2MgPSBici5nZXRCaXRzKDkpOworICAgICAgICAgICAgdW5zaWduZWQgbWFzayA9IDE7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgOTsgaisrLCBtYXNrIDw8PSAxKSB7CisgICAgICAgICAgICAgICAgaWYgKChjaGFuX2xvYyAmIG1hc2spICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCB0aGUgZmlyc3Qgc3RyZWFtCisgICAgICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2UgYXJlIDIgY2hhbm5lbHMgaW4gdGhlIG1hc2sKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqID09IDAgfHwgaiA9PSAxIHx8IGogPT0gNCB8fCBqID09IDUgfHwgaiA9PSA2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiAlcyIsIGNoYW5fbG9jX3RibFtqXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGRlbGV0ZVtdIGNodW5rOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBici5za2lwQml0cygxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChici5udW1CaXRzTGVmdCgpICE9IDApIHsKKyAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA4KSB7CisgICAgICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgdW5zaWduZWQgbWFzayA9IGJyLmdldEJpdHMoOCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgICAgIGlmICgoKDB4MSA8PCBpKSAmJiBtYXNrKSA9PSAwKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDgpIHsKKyAgICAgICAgICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChpKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOiB7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNvbXBsZXhpdHkgPSBici5nZXRCaXRzKDgpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiRm91bmQgYSBKT0Mgc3RyZWFtIHdpdGggY29tcGxleGl0eSA9ICVkIiwgY29tcGxleGl0eSk7CisgICAgICAgICAgICAgICAgfWJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoOCk7CisgICAgICAgICAgICAgICAgfWJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBjaGFubmVsQ291bnQpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBzYW1wbGVSYXRlKTsKKworICAgIGRlbGV0ZVtdIGNodW5rOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlQUMzU3BlY2lmaWNCb3gob2ZmNjRfdCBvZmZzZXQpIHsKKyAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdWludDE2X3Qgc2FtcGxlUmF0ZSwgY2hhbm5lbHM7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICgoc3RhdHVzID0gcGFyc2VDaGFubmVsQ291bnRTYW1wbGVSYXRlKCZvZmZzZXQsICZjaGFubmVscywgJnNhbXBsZVJhdGUpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KICAgICB1aW50MzJfdCBzaXplOwogICAgIC8vICsgNC1ieXRlIHNpemUKICAgICAvLyArIDQtYnl0ZSB0eXBlCkBAIC0yNzA1LDEyICszMDk3LDkgQEAKICAgICB1bnNpZ25lZCBsZmVvbiA9IGJyLmdldEJpdHMoMSk7CiAgICAgdW5zaWduZWQgY2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50VGFibGVbYWNtb2RdICsgbGZlb247CiAKLSAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FDMyk7Ci0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBjaGFubmVsQ291bnQpOwotICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQzMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIGNoYW5uZWxDb3VudCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIHNhbXBsZVJhdGUpOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMjgzMCw4ICszMjE5LDkgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAogICAgIGludDY0X3QgbWV0YUR1cmF0aW9uOwotICAgIGlmICghbUxhc3RUcmFjay0+bWV0YS5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmbWV0YUR1cmF0aW9uKSB8fCBtZXRhRHVyYXRpb24gPT0gMCkgewotICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgc2lkeER1cmF0aW9uKTsKKyAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQ2NChtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICZtZXRhRHVyYXRpb24pIHx8IG1ldGFEdXJhdGlvbiA9PSAwKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCBzaWR4RHVyYXRpb24pOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CkBAIC0yOTI5LDcgKzMzMTksNyBAQAogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogICAgICAgICBpZiAoIXN0cmNhc2VjbXAobU1ldGFLZXlNYXBbaW5kZXhdLmNfc3RyKCksICJjb20uYW5kcm9pZC5jYXB0dXJlLmZwcyIpKSB7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldEZsb2F0KGtLZXlDYXB0dXJlRnJhbWVyYXRlLCAqKGZsb2F0ICopJnZhbCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0RmxvYXQobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9DQVBUVVJFX1JBVEUsICooZmxvYXQgKikmdmFsKTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgPT0gNjcgJiYgZGF0YVNpemUgPj0gNCkgewogICAgICAgICAvLyBCRSBzaWduZWQgaW50MzIKQEAgLTI5MzgsNyArMzMyOCw4IEBACiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgICAgIGlmICghc3RyY2FzZWNtcChtTWV0YUtleU1hcFtpbmRleF0uY19zdHIoKSwgImNvbS5hbmRyb2lkLnZpZGVvLnRlbXBvcmFsX2xheWVyc19jb3VudCIpKSB7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldEludDMyKGtLZXlUZW1wb3JhbExheWVyQ291bnQsIHZhbCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9DT1VOVCwgdmFsKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIGFkZCBtb3JlIGtleXMgaWYgbmVlZGVkCkBAIC0yOTkyLDcgKzMzODMsNyBAQAogICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKLSAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlUcmFja0lELCBpZCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQsIGlkKTsKIAogICAgIHNpemVfdCBtYXRyaXhPZmZzZXQgPSBkeW5TaXplICsgMTY7CiAgICAgaW50MzJfdCBhMDAgPSBVMzJfQVQoJmJ1ZmZlclttYXRyaXhPZmZzZXRdKTsKQEAgLTMwMjgsMTUgKzM0MTksMTUgQEAKICAgICB9CiAKICAgICBpZiAocm90YXRpb25EZWdyZWVzICE9IDApIHsKLSAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Um90YXRpb24sIHJvdGF0aW9uRGVncmVlcyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1JPVEFUSU9OLCByb3RhdGlvbkRlZ3JlZXMpOwogICAgIH0KIAogICAgIC8vIEhhbmRsZSBwcmVzZW50YXRpb24gZGlzcGxheSBzaXplLCB3aGljaCBjb3VsZCBiZSBkaWZmZXJlbnQKLSAgICAvLyBmcm9tIHRoZSBpbWFnZSBzaXplIGluZGljYXRlZCBieSBrS2V5V2lkdGggYW5kIGtLZXlIZWlnaHQuCisgICAgLy8gZnJvbSB0aGUgaW1hZ2Ugc2l6ZSBpbmRpY2F0ZWQgYnkgQU1FRElBRk9STUFUX0tFWV9XSURUSCBhbmQgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQuCiAgICAgdWludDMyX3Qgd2lkdGggPSBVMzJfQVQoJmJ1ZmZlcltkeW5TaXplICsgNTJdKTsKICAgICB1aW50MzJfdCBoZWlnaHQgPSBVMzJfQVQoJmJ1ZmZlcltkeW5TaXplICsgNTZdKTsKLSAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlEaXNwbGF5V2lkdGgsIHdpZHRoID4+IDE2KTsKLSAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlEaXNwbGF5SGVpZ2h0LCBoZWlnaHQgPj4gMTYpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfV0lEVEgsIHdpZHRoID4+IDE2KTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX0hFSUdIVCwgaGVpZ2h0ID4+IDE2KTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTMwNjQsNTQgKzM0NTUsNTAgQEAKIAogICAgIHVpbnQzMl90IGZsYWdzID0gVTMyX0FUKGJ1ZmZlcik7CiAKLSAgICB1aW50MzJfdCBtZXRhZGF0YUtleSA9IDA7CisgICAgY29uc3QgY2hhciAqbWV0YWRhdGFLZXkgPSBudWxscHRyOwogICAgIGNoYXIgY2h1bmtbNV07CiAgICAgTWFrZUZvdXJDQ1N0cmluZyhtUGF0aFs0XSwgY2h1bmspOwogICAgIEFMT0dWKCJtZXRhOiAlcyBAICVsbGQiLCBjaHVuaywgKGxvbmcgbG9uZylvZmZzZXQpOwogICAgIHN3aXRjaCAoKGludDMyX3QpbVBhdGhbNF0pIHsKICAgICAgICAgY2FzZSBGT1VSQ0MoMHhhOSwgJ2EnLCAnbCcsICdiJyk6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUFsYnVtOworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAiYWxidW0iOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoMHhhOSwgJ0EnLCAnUicsICdUJyk6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUFydGlzdDsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gImFydGlzdCI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygnYScsICdBJywgJ1InLCAnVCcpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlBbGJ1bUFydGlzdDsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gImFsYnVtYXJ0aXN0IjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKDB4YTksICdkJywgJ2EnLCAneScpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlZZWFyOworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAieWVhciI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygweGE5LCAnbicsICdhJywgJ20nKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5VGl0bGU7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJ0aXRsZSI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygweGE5LCAndycsICdyJywgJ3QnKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5V3JpdGVyOworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAid3JpdGVyIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCdjJywgJ28nLCAndicsICdyJyk6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUFsYnVtQXJ0OworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAiYWxidW1hcnQiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoJ2cnLCAnbicsICdyJywgJ2UnKToKLSAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5R2VucmU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygweGE5LCAnZycsICdlJywgJ24nKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5R2VucmU7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJnZW5yZSI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygnYycsICdwJywgJ2knLCAnbCcpOgpAQCAtMzEyMSw3ICszNTA4LDcgQEAKICAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpYnVmZmVyW3NpemUgLSAxXSk7CiAKLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleUNvbXBpbGF0aW9uLCB0bXApOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9DT01QSUxBVElPTiwgdG1wKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0zMTMzLDcgKzM1MjAsNyBAQAogICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwVG90YWxUcmFja3MgPSAodWludDE2X3QqKSZidWZmZXJbMTJdOwogICAgICAgICAgICAgICAgIHNwcmludGYodG1wLCAiJWQvJWQiLCBudG9ocygqcFRyYWNrKSwgbnRvaHMoKnBUb3RhbFRyYWNrcykpOwogCi0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlDRFRyYWNrTnVtYmVyLCB0bXApOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9DRFRSQUNLTlVNQkVSLCB0bXApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTMxNDUsNyArMzUzMiw3IEBACiAgICAgICAgICAgICAgICAgdWludDE2X3QqIHBUb3RhbERpc2NzID0gKHVpbnQxNl90KikmYnVmZmVyWzEyXTsKICAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiVkLyVkIiwgbnRvaHMoKnBEaXNjKSwgbnRvaHMoKnBUb3RhbERpc2NzKSk7CiAKLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleURpc2NOdW1iZXIsIHRtcCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX0RJU0NOVU1CRVIsIHRtcCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMzE4OSw4ICszNTc2LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RW5jb2RlckRlbGF5LCBkZWxheSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlFbmNvZGVyUGFkZGluZywgcGFkZGluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX0RFTEFZLCBkZWxheSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX1BBRERJTkcsIHBhZGRpbmcpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCkBAIC0zMjA1LDEyICszNTk0LDE0IEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBpZiAoc2l6ZSA+PSA4ICYmIG1ldGFkYXRhS2V5ICYmICFtRmlsZU1ldGFEYXRhLmhhc0RhdGEobWV0YWRhdGFLZXkpKSB7Ci0gICAgICAgIGlmIChtZXRhZGF0YUtleSA9PSBrS2V5QWxidW1BcnQpIHsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleUFsYnVtQXJ0LCBNZXRhRGF0YTo6VFlQRV9OT05FLAorICAgIHZvaWQgKnRtcERhdGE7CisgICAgc2l6ZV90IHRtcERhdGFTaXplOworICAgIGlmIChzaXplID49IDggJiYgbWV0YWRhdGFLZXkgJiYKKyAgICAgICAgICAgICFBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKG1GaWxlTWV0YURhdGEsIG1ldGFkYXRhS2V5LCAmdG1wRGF0YSwgJnRtcERhdGFTaXplKSkgeworICAgICAgICBpZiAoIXN0cmNtcChtZXRhZGF0YUtleSwgImFsYnVtYXJ0IikpIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUZpbGVNZXRhRGF0YSwgbWV0YWRhdGFLZXksCiAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciArIDgsIHNpemUgLSA4KTsKLSAgICAgICAgfSBlbHNlIGlmIChtZXRhZGF0YUtleSA9PSBrS2V5R2VucmUpIHsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKG1ldGFkYXRhS2V5LCAiZ2VucmUiKSkgewogICAgICAgICAgICAgaWYgKGZsYWdzID09IDApIHsKICAgICAgICAgICAgICAgICAvLyB1aW50OF90IGdlbnJlIGNvZGUsIGlUdW5lcyBnZW5yZSBjb2RlcyBhcmUKICAgICAgICAgICAgICAgICAvLyB0aGUgc3RhbmRhcmQgaWQzIGNvZGVzLCBleGNlcHQgdGhleSBzdGFydApAQCAtMzIyNCwxOCArMzYxNSwxOCBAQAogICAgICAgICAgICAgICAgIGNoYXIgZ2VucmVbMTBdOwogICAgICAgICAgICAgICAgIHNwcmludGYoZ2VucmUsICIlZCIsIGdlbnJlY29kZSk7CiAKLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcobWV0YWRhdGFLZXksIGdlbnJlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIG1ldGFkYXRhS2V5LCBnZW5yZSk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGZsYWdzID09IDEpIHsKICAgICAgICAgICAgICAgICAvLyBjdXN0b20gZ2VucmUgc3RyaW5nCiAgICAgICAgICAgICAgICAgYnVmZmVyW3NpemVdID0gJ1wwJzsKIAotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZygKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIAogICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFLZXksIChjb25zdCBjaGFyICopYnVmZmVyICsgOCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBidWZmZXJbc2l6ZV0gPSAnXDAnOwogCi0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoCisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIAogICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUtleSwgKGNvbnN0IGNoYXIgKilidWZmZXIgKyA4KTsKICAgICAgICAgfQogICAgIH0KQEAgLTMyNjUsMjEgKzM2NTYsMzEgQEAKICAgICBpbnQzMl90IHR5cGUgPSBVMzJfQVQoJmJ1ZmZlclswXSk7CiAgICAgaWYgKCh0eXBlID09IEZPVVJDQygnbicsICdjJywgJ2wnLCAneCcpICYmIHNpemUgPj0gMTEpCiAgICAgICAgICAgICB8fCAodHlwZSA9PSBGT1VSQ0MoJ24nLCAnYycsICdsJywgJ2MnKSAmJiBzaXplID49IDEwKSkgewotICAgICAgICBpbnQzMl90IHByaW1hcmllcyA9IFUxNl9BVCgmYnVmZmVyWzRdKTsKLSAgICAgICAgaW50MzJfdCB0cmFuc2ZlciA9IFUxNl9BVCgmYnVmZmVyWzZdKTsKLSAgICAgICAgaW50MzJfdCBjb2VmZnMgPSBVMTZfQVQoJmJ1ZmZlcls4XSk7Ci0gICAgICAgIGJvb2wgZnVsbFJhbmdlID0gKHR5cGUgPT0gRk9VUkNDKCduJywgJ2MnLCAnbCcsICd4JykpICYmIChidWZmZXJbMTBdICYgMTI4KTsKLQotICAgICAgICBDb2xvckFzcGVjdHMgYXNwZWN0czsKLSAgICAgICAgQ29sb3JVdGlsczo6Y29udmVydElzb0NvbG9yQXNwZWN0c1RvQ29kZWNBc3BlY3RzKAotICAgICAgICAgICAgICAgIHByaW1hcmllcywgdHJhbnNmZXIsIGNvZWZmcywgZnVsbFJhbmdlLCBhc3BlY3RzKTsKLQogICAgICAgICAvLyBvbmx5IHN0b3JlIHRoZSBmaXJzdCBjb2xvciBzcGVjaWZpY2F0aW9uCi0gICAgICAgIGlmICghbUxhc3RUcmFjay0+bWV0YS5oYXNEYXRhKGtLZXlDb2xvclByaW1hcmllcykpIHsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNvbG9yUHJpbWFyaWVzLCBhc3BlY3RzLm1QcmltYXJpZXMpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5VHJhbnNmZXJGdW5jdGlvbiwgYXNwZWN0cy5tVHJhbnNmZXIpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q29sb3JNYXRyaXgsIGFzcGVjdHMubU1hdHJpeENvZWZmcyk7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDb2xvclJhbmdlLCBhc3BlY3RzLm1SYW5nZSk7CisgICAgICAgIGludDMyX3QgZXhpc3RpbmdDb2xvcjsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1JBTkdFLCAmZXhpc3RpbmdDb2xvcikpIHsKKyAgICAgICAgICAgIGludDMyX3QgcHJpbWFyaWVzID0gVTE2X0FUKCZidWZmZXJbNF0pOworICAgICAgICAgICAgaW50MzJfdCBpc290cmFuc2ZlciA9IFUxNl9BVCgmYnVmZmVyWzZdKTsKKyAgICAgICAgICAgIGludDMyX3QgY29lZmZzID0gVTE2X0FUKCZidWZmZXJbOF0pOworICAgICAgICAgICAgYm9vbCBmdWxsUmFuZ2UgPSAodHlwZSA9PSBGT1VSQ0MoJ24nLCAnYycsICdsJywgJ3gnKSkgJiYgKGJ1ZmZlclsxMF0gJiAxMjgpOworCisgICAgICAgICAgICBpbnQzMl90IHJhbmdlID0gMDsKKyAgICAgICAgICAgIGludDMyX3Qgc3RhbmRhcmQgPSAwOworICAgICAgICAgICAgaW50MzJfdCB0cmFuc2ZlciA9IDA7CisgICAgICAgICAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9QbGF0Zm9ybUFzcGVjdHMoCisgICAgICAgICAgICAgICAgICAgIHByaW1hcmllcywgaXNvdHJhbnNmZXIsIGNvZWZmcywgZnVsbFJhbmdlLAorICAgICAgICAgICAgICAgICAgICAmcmFuZ2UsICZzdGFuZGFyZCwgJnRyYW5zZmVyKTsKKworICAgICAgICAgICAgaWYgKHJhbmdlICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9SQU5HRSwgcmFuZ2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YW5kYXJkICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9TVEFOREFSRCwgc3RhbmRhcmQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRyYW5zZmVyICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9UUkFOU0ZFUiwgdHJhbnNmZXIpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0zMzA2LDI2ICszNzA3LDI2IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICB9CiAKLSAgICB1aW50MzJfdCBtZXRhZGF0YUtleSA9IDA7CisgICAgY29uc3QgY2hhciAqbWV0YWRhdGFLZXkgPSBudWxscHRyOwogICAgIHN3aXRjaCAobVBhdGhbZGVwdGhdKSB7CiAgICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ2knLCAndCcsICdsJyk6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleVRpdGxlOworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAidGl0bGUiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoJ3AnLCAnZScsICdyJywgJ2YnKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5QXJ0aXN0OworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAiYXJ0aXN0IjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ3UnLCAndCcsICdoJyk6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleVdyaXRlcjsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gIndyaXRlciI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygnZycsICduJywgJ3InLCAnZScpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlHZW5yZTsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gImdlbnJlIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ2wnLCAnYicsICdtJyk6CkBAIC0zMzM0LDEwICszNzM1LDEwIEBACiAgICAgICAgICAgICAgIGNoYXIgdG1wWzRdOwogICAgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiV1IiwgYnVmZmVyW3NpemUgLSAxXSk7CiAKLSAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlDRFRyYWNrTnVtYmVyLCB0bXApOworICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfQ0RUUkFDS05VTUJFUiwgdG1wKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5QWxidW07CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJhbGJ1bSI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygneScsICdyJywgJ3InLCAnYycpOgpAQCAtMzM1NSw3ICszNzU2LDcgQEAKICAgICAgICAgICAgIGlmICh5ZWFyIDwgMTAwMDApIHsKICAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiV1IiwgeWVhcik7CiAKLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleVllYXIsIHRtcCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX1lFQVIsIHRtcCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMzM2NCw3ICszNzY1LDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGlmIChtZXRhZGF0YUtleSA+IDApIHsKKyAgICBpZiAobWV0YWRhdGFLZXkpIHsKICAgICAgICAgYm9vbCBpc1VURjggPSB0cnVlOyAvLyBDb21tb24gY2FzZQogICAgICAgICBjaGFyMTZfdCAqZnJhbWVkYXRhID0gTlVMTDsKICAgICAgICAgaW50IGxlbjE2ID0gMDsgLy8gTnVtYmVyIG9mIFVURi0xNiBjaGFyYWN0ZXJzCkBAIC0zNDAwLDExICszODAxLDExIEBACiAKICAgICAgICAgaWYgKGlzVVRGOCkgewogICAgICAgICAgICAgYnVmZmVyW3NpemVdID0gMDsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhtZXRhZGF0YUtleSwgKGNvbnN0IGNoYXIgKilidWZmZXIgKyA2KTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgbWV0YWRhdGFLZXksIChjb25zdCBjaGFyICopYnVmZmVyICsgNik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBDb252ZXJ0IGZyb20gVVRGLTE2IHN0cmluZyB0byBVVEYtOCBzdHJpbmcuCiAgICAgICAgICAgICBTdHJpbmc4IHRtcFVURjhzdHIoZnJhbWVkYXRhLCBsZW4xNik7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcobWV0YWRhdGFLZXksIHRtcFVURjhzdHIuc3RyaW5nKCkpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBtZXRhZGF0YUtleSwgdG1wVVRGOHN0ci5zdHJpbmcoKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM0MTksMjcgKzM4MjAsMjkgQEAKIAogICAgIGlmIChpZDMuaXNWYWxpZCgpKSB7CiAgICAgICAgIHN0cnVjdCBNYXAgewotICAgICAgICAgICAgaW50IGtleTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleTsKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRhZzE7CiAgICAgICAgICAgICBjb25zdCBjaGFyICp0YWcyOwogICAgICAgICB9OwogICAgICAgICBzdGF0aWMgY29uc3QgTWFwIGtNYXBbXSA9IHsKLSAgICAgICAgICAgIHsga0tleUFsYnVtLCAiVEFMQiIsICJUQUwiIH0sCi0gICAgICAgICAgICB7IGtLZXlBcnRpc3QsICJUUEUxIiwgIlRQMSIgfSwKLSAgICAgICAgICAgIHsga0tleUFsYnVtQXJ0aXN0LCAiVFBFMiIsICJUUDIiIH0sCi0gICAgICAgICAgICB7IGtLZXlDb21wb3NlciwgIlRDT00iLCAiVENNIiB9LAotICAgICAgICAgICAgeyBrS2V5R2VucmUsICJUQ09OIiwgIlRDTyIgfSwKLSAgICAgICAgICAgIHsga0tleVRpdGxlLCAiVElUMiIsICJUVDIiIH0sCi0gICAgICAgICAgICB7IGtLZXlZZWFyLCAiVFlFIiwgIlRZRVIiIH0sCi0gICAgICAgICAgICB7IGtLZXlBdXRob3IsICJUWFQiLCAiVEVYVCIgfSwKLSAgICAgICAgICAgIHsga0tleUNEVHJhY2tOdW1iZXIsICJUUksiLCAiVFJDSyIgfSwKLSAgICAgICAgICAgIHsga0tleURpc2NOdW1iZXIsICJUUEEiLCAiVFBPUyIgfSwKLSAgICAgICAgICAgIHsga0tleUNvbXBpbGF0aW9uLCAiVENQIiwgIlRDTVAiIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQUxCVU0sICJUQUxCIiwgIlRBTCIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9BUlRJU1QsICJUUEUxIiwgIlRQMSIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVElTVCwgIlRQRTIiLCAiVFAyIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0NPTVBPU0VSLCAiVENPTSIsICJUQ00iIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfR0VOUkUsICJUQ09OIiwgIlRDTyIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9USVRMRSwgIlRJVDIiLCAiVFQyIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX1lFQVIsICJUWUUiLCAiVFlFUiIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9BVVRIT1IsICJUWFQiLCAiVEVYVCIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9DRFRSQUNLTlVNQkVSLCAiVFJLIiwgIlRSQ0siIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfRElTQ05VTUJFUiwgIlRQQSIsICJUUE9TIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0NPTVBJTEFUSU9OLCAiVENQIiwgIlRDTVAiIH0sCiAgICAgICAgIH07CiAgICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga051bU1hcEVudHJpZXMgPSBzaXplb2Yoa01hcCkgLyBzaXplb2Yoa01hcFswXSk7CiAKKyAgICAgICAgdm9pZCAqdG1wRGF0YTsKKyAgICAgICAgc2l6ZV90IHRtcERhdGFTaXplOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1NYXBFbnRyaWVzOyArK2kpIHsKLSAgICAgICAgICAgIGlmICghbUZpbGVNZXRhRGF0YS5oYXNEYXRhKGtNYXBbaV0ua2V5KSkgeworICAgICAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKG1GaWxlTWV0YURhdGEsIGtNYXBbaV0ua2V5LCAmdG1wRGF0YSwgJnRtcERhdGFTaXplKSkgewogICAgICAgICAgICAgICAgIElEMzo6SXRlcmF0b3IgKml0ID0gbmV3IElEMzo6SXRlcmF0b3IoaWQzLCBrTWFwW2ldLnRhZzEpOwogICAgICAgICAgICAgICAgIGlmIChpdC0+ZG9uZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpdDsKQEAgLTM0NTUsNyArMzg1OCw3IEBACiAgICAgICAgICAgICAgICAgaXQtPmdldFN0cmluZygmcyk7CiAgICAgICAgICAgICAgICAgZGVsZXRlIGl0OwogCi0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtNYXBbaV0ua2V5LCBzKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIGtNYXBbaV0ua2V5LCBzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0zNDY0LDEzICszODY3LDEyIEBACiAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEgPSBpZDMuZ2V0QWxidW1BcnQoJmRhdGFTaXplLCAmbWltZSk7CiAKICAgICAgICAgaWYgKGRhdGEpIHsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0RGF0YShrS2V5QWxidW1BcnQsIE1ldGFEYXRhOjpUWVBFX05PTkUsIGRhdGEsIGRhdGFTaXplKTsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5QWxidW1BcnRNSU1FLCBtaW1lLnN0cmluZygpKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCwgZGF0YSwgZGF0YVNpemUpOwogICAgICAgICB9CiAgICAgfQogfQogCi1NZWRpYVRyYWNrICpNUEVHNEV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpNUEVHNEV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CiAgICAgc3RhdHVzX3QgZXJyOwogICAgIGlmICgoZXJyID0gcmVhZE1ldGFEYXRhKCkpICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMzQ5Myw3ICszODk1LDcgQEAKIAogICAgIFRyZXggKnRyZXggPSBOVUxMOwogICAgIGludDMyX3QgdHJhY2tJZDsKLSAgICBpZiAodHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlUcmFja0lELCAmdHJhY2tJZCkpIHsKKyAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDMyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCAmdHJhY2tJZCkpIHsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJleC5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgVHJleCAqdCA9ICZtVHJleC5lZGl0SXRlbUF0KGkpOwogICAgICAgICAgICAgaWYgKHQtPnRyYWNrX0lEID09ICh1aW50MzJfdCkgdHJhY2tJZCkgewpAQCAtMzUwOSwxNiArMzkxMSwxNSBAQAogICAgIEFMT0dWKCJnZXRUcmFjayBjYWxsZWQsIHBzc2g6ICV6dSIsIG1Qc3NoLnNpemUoKSk7CiAKICAgICBjb25zdCBjaGFyICptaW1lOwotICAgIGlmICghdHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpIHsKKyAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIHNwPEl0ZW1UYWJsZT4gaXRlbVRhYmxlOwogICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7Ci0gICAgICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgICAgIHZvaWQgKmRhdGE7CiAgICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0FWQywgJmRhdGEsICZzaXplKSkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KIApAQCAtMzUyOSwxMCArMzkzMCw5IEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpCiAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpKSB7Ci0gICAgICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgICAgIHZvaWQgKmRhdGE7CiAgICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLmZpbmREYXRhKGtLZXlIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0hFVkMsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAKQEAgLTM1NDYsOSArMzk0NiwxNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgaWYgKHRyYWNrLT5oYXNfZWxzdCBhbmQgIXN0cm5jYXNlY21wKCJ2aWRlby8iLCBtaW1lLCA2KSBhbmQgdHJhY2stPmVsc3RfbWVkaWFfdGltZSA+IDApIHsKKyAgICAgICAgdHJhY2stPmVsc3RTaGlmdFN0YXJ0VGlja3MgPSB0cmFjay0+ZWxzdF9tZWRpYV90aW1lOworICAgICAgICBBTE9HVigidmlkZW8gdHJhY2stPmVsc3RTaGlmdFN0YXJ0VGlja3MgOiUiIFBSSWQ2NCwgdHJhY2stPmVsc3RfbWVkaWFfdGltZSk7CisgICAgfQorCiAgICAgTVBFRzRTb3VyY2UgKnNvdXJjZSA9ICBuZXcgTVBFRzRTb3VyY2UoCiAgICAgICAgICAgICB0cmFjay0+bWV0YSwgbURhdGFTb3VyY2UsIHRyYWNrLT50aW1lc2NhbGUsIHRyYWNrLT5zYW1wbGVUYWJsZSwKLSAgICAgICAgICAgIG1TaWR4RW50cmllcywgdHJleCwgbU1vb2ZPZmZzZXQsIGl0ZW1UYWJsZSk7CisgICAgICAgICAgICBtU2lkeEVudHJpZXMsIHRyZXgsIG1Nb29mT2Zmc2V0LCBpdGVtVGFibGUsCisgICAgICAgICAgICB0cmFjay0+ZWxzdFNoaWZ0U3RhcnRUaWNrcyk7CiAgICAgaWYgKHNvdXJjZS0+aW5pdCgpICE9IE9LKSB7CiAgICAgICAgIGRlbGV0ZSBzb3VyY2U7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMzU1OSwyNiArMzk2NSwyMiBAQAogLy8gc3RhdGljCiBzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6dmVyaWZ5VHJhY2soVHJhY2sgKnRyYWNrKSB7CiAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICBDSEVDSyh0cmFjay0+bWV0YS5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldFN0cmluZyh0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpOwogCi0gICAgdWludDMyX3QgdHlwZTsKLSAgICBjb25zdCB2b2lkICpkYXRhOworICAgIHZvaWQgKmRhdGE7CiAgICAgc2l6ZV90IHNpemU7CiAgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykpIHsKLSAgICAgICAgaWYgKCF0cmFjay0+bWV0YS5maW5kRGF0YShrS2V5QVZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkKLSAgICAgICAgICAgICAgICB8fCB0eXBlICE9IGtUeXBlQVZDQykgeworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0FWQywgJmRhdGEsICZzaXplKSkgewogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQykpIHsKLSAgICAgICAgaWYgKCF0cmFjay0+bWV0YS5maW5kRGF0YShrS2V5SFZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgdHlwZSAhPSBrVHlwZUhWQ0MpIHsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF9IRVZDLCAmZGF0YSwgJnNpemUpKSB7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCkKICAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKQogICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSkgewotICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLmZpbmREYXRhKGtLZXlFU0RTLCAmdHlwZSwgJmRhdGEsICZzaXplKQotICAgICAgICAgICAgICAgIHx8IHR5cGUgIT0ga1R5cGVFU0RTKSB7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9FU0RTLCAmZGF0YSwgJnNpemUpKSB7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgfQpAQCAtMzY2Myw3ICs0MDY1LDcgQEAKICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKLSAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUUNFTFApOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUUNFTFApOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCkBAIC0zNjgwLDEwICs0MDgyLDEyIEBACiAgICAgICAgIHVpbnQzMl90IGF2Z0JpdHJhdGUgPSAwOwogICAgICAgICBlc2RzLmdldEJpdFJhdGUoJm1heEJpdHJhdGUsICZhdmdCaXRyYXRlKTsKICAgICAgICAgaWYgKG1heEJpdHJhdGUgPiAwICYmIG1heEJpdHJhdGUgPCBJTlQzMl9NQVgpIHsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleU1heEJpdFJhdGUsIChpbnQzMl90KW1heEJpdHJhdGUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0JJVF9SQVRFLCAoaW50MzJfdCltYXhCaXRyYXRlKTsKICAgICAgICAgfQogICAgICAgICBpZiAoYXZnQml0cmF0ZSA+IDAgJiYgYXZnQml0cmF0ZSA8IElOVDMyX01BWCkgewotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Qml0UmF0ZSwgKGludDMyX3QpYXZnQml0cmF0ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSwgKGludDMyX3QpYXZnQml0cmF0ZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM3MjcsNyArNDEzMSw3IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKICAgICAvL2tlZXAgQU9UIHR5cGUKLSAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlBQUNBT1QsIG9iamVjdFR5cGUpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0FBQ19QUk9GSUxFLCBvYmplY3RUeXBlKTsKIAogICAgIHVpbnQzMl90IGZyZXFJbmRleCA9IGJyLmdldEJpdHMoNCk7CiAKQEAgLTM3NDgsNyArNDE1Miw3IEBACiAgICAgICAgIHNhbXBsZVJhdGUgPSBrU2FtcGxpbmdSYXRlW2ZyZXFJbmRleF07CiAgICAgfQogCi0gICAgaWYgKG9iamVjdFR5cGUgPT0gQU9UX1NCUiB8fCBvYmplY3RUeXBlID09IEFPVF9QUykgey8vU0JSIHNwZWNpZmljIGNvbmZpZyBwZXIgMTQ0OTYtMyB0YWJsZSAxLjEzCisgICAgaWYgKG9iamVjdFR5cGUgPT0gQU9UX1NCUiB8fCBvYmplY3RUeXBlID09IEFPVF9QUykgey8vU0JSIHNwZWNpZmljIGNvbmZpZyBwZXIgMTQ0OTYtMyB0YmwgMS4xMwogICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDQpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIHVpbnQzMl90IGV4dEZyZXFJbmRleCA9IGJyLmdldEJpdHMoNCk7CiAgICAgICAgIGludDMyX3QgZXh0U2FtcGxlUmF0ZSBfX3VudXNlZDsKQEAgLTM3NjUsNyArNDE2OSw3IEBACiAgICAgICAgICAgICBleHRTYW1wbGVSYXRlID0ga1NhbXBsaW5nUmF0ZVtleHRGcmVxSW5kZXhdOwogICAgICAgICB9CiAgICAgICAgIC8vVE9ETzogc2F2ZSB0aGUgZXh0ZW5zaW9uIHNhbXBsaW5nIHJhdGUgdmFsdWUgaW4gbWV0YSBkYXRhID0+Ci0gICAgICAgIC8vICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RXh0U2FtcGxlUmF0ZSwgZXh0U2FtcGxlUmF0ZSk7CisgICAgICAgIC8vICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIGtLZXlFeHRTYW1wbGVSYXRlLCBleHRTYW1wbGVSYXRlKTsKICAgICB9CiAKICAgICBzd2l0Y2ggKG51bUNoYW5uZWxzKSB7CkBAIC0zOTE4LDI0ICs0MzIyLDI1IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKICAgICBpbnQzMl90IHByZXZTYW1wbGVSYXRlOwotICAgIENIRUNLKG1MYXN0VHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmcHJldlNhbXBsZVJhdGUpKTsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgJnByZXZTYW1wbGVSYXRlKSk7CiAKICAgICBpZiAocHJldlNhbXBsZVJhdGUgIT0gc2FtcGxlUmF0ZSkgewogICAgICAgICBBTE9HVigibXBlZzQgYXVkaW8gc2FtcGxlIHJhdGUgZGlmZmVyZW50IGZyb20gcHJldmlvdXMgc2V0dGluZy4gIgogICAgICAgICAgICAgICJ3YXM6ICVkLCBub3c6ICVkIiwgcHJldlNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOwogICAgIH0KIAotICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBzYW1wbGVSYXRlKTsKIAogICAgIGludDMyX3QgcHJldkNoYW5uZWxDb3VudDsKLSAgICBDSEVDSyhtTGFzdFRyYWNrLT5tZXRhLmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmcHJldkNoYW5uZWxDb3VudCkpOworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCAmcHJldkNoYW5uZWxDb3VudCkpOwogCiAgICAgaWYgKHByZXZDaGFubmVsQ291bnQgIT0gbnVtQ2hhbm5lbHMpIHsKICAgICAgICAgQUxPR1YoIm1wZWc0IGF1ZGlvIGNoYW5uZWwgY291bnQgZGlmZmVyZW50IGZyb20gcHJldmlvdXMgc2V0dGluZy4gIgogICAgICAgICAgICAgICJ3YXM6ICVkLCBub3c6ICVkIiwgcHJldkNoYW5uZWxDb3VudCwgbnVtQ2hhbm5lbHMpOwogICAgIH0KIAotICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtQ2hhbm5lbHMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIG51bUNoYW5uZWxzKTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTM5NDMsMTQgKzQzNDgsMTUgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIE1QRUc0U291cmNlOjpNUEVHNFNvdXJjZSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZmb3JtYXQsCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAorICAgICAgICBBTWVkaWFGb3JtYXQgKmZvcm1hdCwKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqZGF0YVNvdXJjZSwKICAgICAgICAgaW50MzJfdCB0aW1lU2NhbGUsCiAgICAgICAgIGNvbnN0IHNwPFNhbXBsZVRhYmxlPiAmc2FtcGxlVGFibGUsCiAgICAgICAgIFZlY3RvcjxTaWR4RW50cnk+ICZzaWR4LAogICAgICAgICBjb25zdCBUcmV4ICp0cmV4LAogICAgICAgICBvZmY2NF90IGZpcnN0TW9vZk9mZnNldCwKLSAgICAgICAgY29uc3Qgc3A8SXRlbVRhYmxlPiAmaXRlbVRhYmxlKQorICAgICAgICBjb25zdCBzcDxJdGVtVGFibGU+ICZpdGVtVGFibGUsCisgICAgICAgIGludDMyX3QgZWxzdFNoaWZ0U3RhcnRUaWNrcykKICAgICA6IG1Gb3JtYXQoZm9ybWF0KSwKICAgICAgIG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAogICAgICAgbVRpbWVzY2FsZSh0aW1lU2NhbGUpLApAQCAtMzk3MSw0NiArNDM3Nyw1MCBAQAogICAgICAgbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0cyhOVUxMKSwKICAgICAgIG1Jc0FWQyhmYWxzZSksCiAgICAgICBtSXNIRVZDKGZhbHNlKSwKKyAgICAgIG1Jc0FDNChmYWxzZSksCiAgICAgICBtSXNQY20oZmFsc2UpLAogICAgICAgbU5BTExlbmd0aFNpemUoMCksCiAgICAgICBtU3RhcnRlZChmYWxzZSksCi0gICAgICBtR3JvdXAoTlVMTCksCiAgICAgICBtQnVmZmVyKE5VTEwpLAotICAgICAgbVdhbnRzTkFMRnJhZ21lbnRzKGZhbHNlKSwKICAgICAgIG1TcmNCdWZmZXIoTlVMTCksCiAgICAgICBtSXNIZWlmKGl0ZW1UYWJsZSAhPSBOVUxMKSwKLSAgICAgIG1JdGVtVGFibGUoaXRlbVRhYmxlKSB7CisgICAgICBtSXRlbVRhYmxlKGl0ZW1UYWJsZSksCisgICAgICBtRWxzdFNoaWZ0U3RhcnRUaWNrcyhlbHN0U2hpZnRTdGFydFRpY2tzKSB7CiAKICAgICBtZW1zZXQoJm1UcmFja0ZyYWdtZW50SGVhZGVySW5mbywgMCwgc2l6ZW9mKG1UcmFja0ZyYWdtZW50SGVhZGVySW5mbykpOwogCi0gICAgbUZvcm1hdC5maW5kSW50MzIoa0tleUNyeXB0b01vZGUsICZtQ3J5cHRvTW9kZSk7CisgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsCisgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLCAmbUNyeXB0b01vZGUpOwogICAgIG1EZWZhdWx0SVZTaXplID0gMDsKLSAgICBtRm9ybWF0LmZpbmRJbnQzMihrS2V5Q3J5cHRvRGVmYXVsdElWU2l6ZSwgJm1EZWZhdWx0SVZTaXplKTsKLSAgICB1aW50MzJfdCBrZXl0eXBlOwotICAgIGNvbnN0IHZvaWQgKmtleTsKKyAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0RFRkFVTFRfSVZfU0laRSwgJm1EZWZhdWx0SVZTaXplKTsKKyAgICB2b2lkICprZXk7CiAgICAgc2l6ZV90IGtleXNpemU7Ci0gICAgaWYgKG1Gb3JtYXQuZmluZERhdGEoa0tleUNyeXB0b0tleSwgJmtleXR5cGUsICZrZXksICZrZXlzaXplKSkgeworICAgIGlmIChBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKG1Gb3JtYXQsCisgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksICZrZXksICZrZXlzaXplKSkgewogICAgICAgICBDSEVDSyhrZXlzaXplIDw9IDE2KTsKICAgICAgICAgbWVtc2V0KG1DcnlwdG9LZXksIDAsIDE2KTsKICAgICAgICAgbWVtY3B5KG1DcnlwdG9LZXksIGtleSwga2V5c2l6ZSk7CiAgICAgfQogCi0gICAgbUZvcm1hdC5maW5kSW50MzIoa0tleUVuY3J5cHRlZEJ5dGVCbG9jaywgJm1EZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrKTsKLSAgICBtRm9ybWF0LmZpbmRJbnQzMihrS2V5U2tpcEJ5dGVCbG9jaywgJm1EZWZhdWx0U2tpcEJ5dGVCbG9jayk7CisgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsCisgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfQllURV9CTE9DSywgJm1EZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrKTsKKyAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1NLSVBfQllURV9CTE9DSywgJm1EZWZhdWx0U2tpcEJ5dGVCbG9jayk7CiAKICAgICBjb25zdCBjaGFyICptaW1lOwotICAgIGJvb2wgc3VjY2VzcyA9IG1Gb3JtYXQuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7CisgICAgYm9vbCBzdWNjZXNzID0gQU1lZGlhRm9ybWF0X2dldFN0cmluZyhtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKTsKICAgICBDSEVDSyhzdWNjZXNzKTsKIAogICAgIG1Jc0FWQyA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CiAgICAgbUlzSEVWQyA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpIHx8CiAgICAgICAgICAgICAgICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQyk7CisgICAgbUlzQUM0ID0gIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0KTsKIAogICAgIGlmIChtSXNBVkMpIHsKLSAgICAgICAgdWludDMyX3QgdHlwZTsKLSAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICAgICAgdm9pZCAqZGF0YTsKICAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgIENIRUNLKGZvcm1hdC5maW5kRGF0YShrS2V5QVZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpOworICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDLCAmZGF0YSwgJnNpemUpKTsKIAogICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CiAKQEAgLTQwMjAsMTAgKzQ0MzAsOSBAQAogICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgdG8gZW5jb2RlIHRoZSBsZW5ndGggb2YgYSBOQUwgdW5pdC4KICAgICAgICAgbU5BTExlbmd0aFNpemUgPSAxICsgKHB0cls0XSAmIDMpOwogICAgIH0gZWxzZSBpZiAobUlzSEVWQykgewotICAgICAgICB1aW50MzJfdCB0eXBlOwotICAgICAgICBjb25zdCB2b2lkICpkYXRhOworICAgICAgICB2b2lkICpkYXRhOwogICAgICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgICAgQ0hFQ0soZm9ybWF0LmZpbmREYXRhKGtLZXlIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSk7CisgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRCdWZmZXIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NTRF9IRVZDLCAmZGF0YSwgJnNpemUpKTsKIAogICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CiAKQEAgLTQwMzgsMzIgKzQ0NDcsNTQgQEAKICAgICBpZiAobUlzUGNtKSB7CiAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHMgPSAwOwogICAgICAgICBpbnQzMl90IGJpdHNQZXJTYW1wbGUgPSAwOwotICAgICAgICBDSEVDSyhtRm9ybWF0LmZpbmRJbnQzMihrS2V5Qml0c1BlclNhbXBsZSwgJmJpdHNQZXJTYW1wbGUpKTsKLSAgICAgICAgQ0hFQ0sobUZvcm1hdC5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm51bUNoYW5uZWxzKSk7CisgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSwgJmJpdHNQZXJTYW1wbGUpKTsKKyAgICAgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgJm51bUNoYW5uZWxzKSk7CiAKICAgICAgICAgaW50MzJfdCBieXRlc1BlclNhbXBsZSA9IGJpdHNQZXJTYW1wbGUgPj4gMzsKICAgICAgICAgaW50MzJfdCBwY21TYW1wbGVTaXplID0gYnl0ZXNQZXJTYW1wbGUgKiBudW1DaGFubmVsczsKIAogICAgICAgICBzaXplX3QgbWF4U2FtcGxlU2l6ZTsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNhbXBsZVRhYmxlLT5nZXRNYXhTYW1wbGVTaXplKCZtYXhTYW1wbGVTaXplKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSyB8fCBtYXhTYW1wbGVTaXplICE9IHN0YXRpY19jYXN0PHNpemVfdD4ocGNtU2FtcGxlU2l6ZSkgfHwgYml0c1BlclNhbXBsZSAhPSAxNikgeworICAgICAgICBpZiAoZXJyICE9IE9LIHx8IG1heFNhbXBsZVNpemUgIT0gc3RhdGljX2Nhc3Q8c2l6ZV90PihwY21TYW1wbGVTaXplKQorICAgICAgICAgICAgICAgfHwgYml0c1BlclNhbXBsZSAhPSAxNikgewogICAgICAgICAgICAgLy8gTm90IHN1cHBvcnRlZAogICAgICAgICAgICAgbUlzUGNtID0gZmFsc2U7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRm9ybWF0LnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIHBjbVNhbXBsZVNpemUgKiBrTWF4UGNtRnJhbWVTaXplKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFLCBwY21TYW1wbGVTaXplICoga01heFBjbUZyYW1lU2l6ZSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBDSEVDSyhmb3JtYXQuZmluZEludDMyKGtLZXlUcmFja0lELCAmbVRyYWNrSWQpKTsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCAmbVRyYWNrSWQpKTsKIAogfQogCiBzdGF0dXNfdCBNUEVHNFNvdXJjZTo6aW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpOwogICAgIGlmIChtRmlyc3RNb29mT2Zmc2V0ICE9IDApIHsKICAgICAgICAgb2ZmNjRfdCBvZmZzZXQgPSBtRmlyc3RNb29mT2Zmc2V0OwotICAgICAgICByZXR1cm4gcGFyc2VDaHVuaygmb2Zmc2V0KTsKKyAgICAgICAgZXJyID0gcGFyc2VDaHVuaygmb2Zmc2V0KTsKKyAgICAgICAgaWYoZXJyID09IE9LICYmICFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikKKyAgICAgICAgICAgICYmICFtQ3VycmVudFNhbXBsZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAvLyBTdGFydCBvZmZzZXQgc2hvdWxkIGJlIGxlc3Mgb3IgZXF1YWwgdG8gY29tcG9zaXRpb24gdGltZSBvZiBmaXJzdCBzYW1wbGUuCisgICAgICAgICAgICAvLyBJU08gOiBzYW1wbGVfY29tcG9zaXRpb25fdGltZV9vZmZzZXQsIHZlcnNpb24gMCAodW5zaWduZWQpIGZvciBtYWpvciBicmFuZHMuCisgICAgICAgICAgICBtRWxzdFNoaWZ0U3RhcnRUaWNrcyA9IHN0ZDo6bWluKG1FbHN0U2hpZnRTdGFydFRpY2tzLAorICAgICAgICAgICAgICAgICgqbUN1cnJlbnRTYW1wbGVzLmJlZ2luKCkpLmNvbXBvc2l0aW9uT2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KLSAgICByZXR1cm4gT0s7CisKKyAgICBpZiAoIXN0cm5jYXNlY21wKCJ2aWRlby8iLCBtaW1lLCA2KSkgeworICAgICAgICB1aW50MzJfdCBmaXJzdFNhbXBsZUNUUyA9IDA7CisgICAgICAgIGVyciA9IG1TYW1wbGVUYWJsZS0+Z2V0TWV0YURhdGFGb3JTYW1wbGUoMCwgTlVMTCwgTlVMTCwgJmZpcnN0U2FtcGxlQ1RTKTsKKyAgICAgICAgLy8gU3RhcnQgb2Zmc2V0IHNob3VsZCBiZSBsZXNzIG9yIGVxdWFsIHRvIGNvbXBvc2l0aW9uIHRpbWUgb2YgZmlyc3Qgc2FtcGxlLgorICAgICAgICAvLyBDb21wb3NpdGlvbiB0aW1lIHN0YW1wIG9mIGZpcnN0IHNhbXBsZSBjYW5ub3QgYmUgbmVnYXRpdmUuCisgICAgICAgIG1FbHN0U2hpZnRTdGFydFRpY2tzID0gc3RkOjptaW4obUVsc3RTaGlmdFN0YXJ0VGlja3MsIChpbnQzMl90KWZpcnN0U2FtcGxlQ1RTKTsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOwogfQogCiBNUEVHNFNvdXJjZTo6fk1QRUc0U291cmNlKCkgewpAQCAtNDA3NCwyMSArNDUwNSwxMyBAQAogICAgIGZyZWUobUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0cyk7CiB9CiAKLXN0YXR1c190IE1QRUc0U291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcykgeworbWVkaWFfc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnN0YXJ0KCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogCi0gICAgaW50MzJfdCB2YWw7Ci0gICAgaWYgKHBhcmFtcyAmJiBwYXJhbXMtPmZpbmRJbnQzMihrS2V5V2FudHNOQUxGcmFnbWVudHMsICZ2YWwpCi0gICAgICAgICYmIHZhbCAhPSAwKSB7Ci0gICAgICAgIG1XYW50c05BTEZyYWdtZW50cyA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbVdhbnRzTkFMRnJhZ21lbnRzID0gZmFsc2U7Ci0gICAgfQotCiAgICAgaW50MzJfdCB0bXA7Ci0gICAgQ0hFQ0sobUZvcm1hdC5maW5kSW50MzIoa0tleU1heElucHV0U2l6ZSwgJnRtcCkpOworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFLCAmdG1wKSk7CiAgICAgc2l6ZV90IG1heF9zaXplID0gdG1wOwogCiAgICAgLy8gQSBzb21ld2hhdCBhcmJpdHJhcnkgbGltaXQgdGhhdCBzaG91bGQgYmUgc3VmZmljaWVudCBmb3IgOGsgdmlkZW8gZnJhbWVzCkBAIC00MDk2LDMyICs0NTE5LDMwIEBACiAgICAgY29uc3Qgc2l6ZV90IGtNYXhCdWZmZXJTaXplID0gNjQgKiAxMDI0ICogMTAyNDsKICAgICBpZiAobWF4X3NpemUgPiBrTWF4QnVmZmVyU2l6ZSkgewogICAgICAgICBBTE9HRSgiYm9ndXMgbWF4IGlucHV0IHNpemU6ICV6dSA+ICV6dSIsIG1heF9zaXplLCBrTWF4QnVmZmVyU2l6ZSk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KICAgICBpZiAobWF4X3NpemUgPT0gMCkgewogICAgICAgICBBTE9HRSgiemVybyBtYXggaW5wdXQgc2l6ZSIpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICAvLyBBbGxvdyB1cCB0byBrTWF4QnVmZmVycywgYnV0IG5vdCBpZiB0aGUgdG90YWwgZXhjZWVkcyBrTWF4QnVmZmVyU2l6ZS4KICAgICBjb25zdCBzaXplX3Qga0luaXRpYWxCdWZmZXJzID0gMjsKICAgICBjb25zdCBzaXplX3Qga01heEJ1ZmZlcnMgPSA4OwogICAgIGNvbnN0IHNpemVfdCByZWFsTWF4QnVmZmVycyA9IG1pbihrTWF4QnVmZmVyU2l6ZSAvIG1heF9zaXplLCBrTWF4QnVmZmVycyk7Ci0gICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXAoa0luaXRpYWxCdWZmZXJzLCBtYXhfc2l6ZSwgcmVhbE1heEJ1ZmZlcnMpOworICAgIG1CdWZmZXJHcm91cC0+aW5pdChrSW5pdGlhbEJ1ZmZlcnMsIG1heF9zaXplLCByZWFsTWF4QnVmZmVycyk7CiAgICAgbVNyY0J1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W21heF9zaXplXTsKICAgICBpZiAobVNyY0J1ZmZlciA9PSBOVUxMKSB7CiAgICAgICAgIC8vIGZpbGUgcHJvYmFibHkgc3BlY2lmaWVkIGEgYmFkIG1heCBzaXplCi0gICAgICAgIGRlbGV0ZSBtR3JvdXA7Ci0gICAgICAgIG1Hcm91cCA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNUEVHNFNvdXJjZTo6c3RvcCgpIHsKK21lZGlhX3N0YXR1c190IE1QRUc0U291cmNlOjpzdG9wKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBDSEVDSyhtU3RhcnRlZCk7CkBAIC00MTM0LDEzICs0NTU1LDEwIEBACiAgICAgZGVsZXRlW10gbVNyY0J1ZmZlcjsKICAgICBtU3JjQnVmZmVyID0gTlVMTDsKIAotICAgIGRlbGV0ZSBtR3JvdXA7Ci0gICAgbUdyb3VwID0gTlVMTDsKLQogICAgIG1TdGFydGVkID0gZmFsc2U7CiAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IDA7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnBhcnNlQ2h1bmsob2ZmNjRfdCAqb2Zmc2V0KSB7CkBAIC00MjU4LDcgKzQ2NzYsOCBAQAogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ2EnLCAnaScsICdvJyk6IHsKICAgICAgICAgICAgIHN0YXR1c190IGVycjsKLSAgICAgICAgICAgIGlmICgoZXJyID0gcGFyc2VTYW1wbGVBdXhpbGlhcnlJbmZvcm1hdGlvbk9mZnNldHMoZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSkpICE9IE9LKSB7CisgICAgICAgICAgICBpZiAoKGVyciA9IHBhcnNlU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25PZmZzZXRzKGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpKQorICAgICAgICAgICAgICAgICAgICAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CkBAIC00Mzg5LDcgKzQ4MDgsOCBAQAogICAgIGlmIChlbnRyeWNvdW50ID4gbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0c0FsbG9jU2l6ZSkgewogICAgICAgICB1aW50NjRfdCAqbmV3UHRyID0gKHVpbnQ2NF90ICopcmVhbGxvYyhtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzLCBlbnRyeWNvdW50ICogOCk7CiAgICAgICAgIGlmIChuZXdQdHIgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byByZWFsbG9jICV1IC0+ICV1IiwgbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0c0FsbG9jU2l6ZSwgZW50cnljb3VudCAqIDgpOworICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byByZWFsbG9jICV1IC0+ICV1IiwKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0c0FsbG9jU2l6ZSwgZW50cnljb3VudCAqIDgpOwogICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICAgICAgfQogICAgICAgICBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzID0gbmV3UHRyOwpAQCAtNDQyOCwxMCArNDg0OCwxMSBAQAogICAgIHJldHVybiBwYXJzZUNsZWFyRW5jcnlwdGVkU2l6ZXMoZHJtb2Zmc2V0LCBmYWxzZSwgMCk7CiB9CiAKLXN0YXR1c190IE1QRUc0U291cmNlOjpwYXJzZUNsZWFyRW5jcnlwdGVkU2l6ZXMob2ZmNjRfdCBvZmZzZXQsIGJvb2wgaXNTdWJzYW1wbGVFbmNyeXB0aW9uLCB1aW50MzJfdCBmbGFncykgeworc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnBhcnNlQ2xlYXJFbmNyeXB0ZWRTaXplcygKKyAgICAgICAgb2ZmNjRfdCBvZmZzZXQsIGJvb2wgaXNTdWJzYW1wbGVFbmNyeXB0aW9uLCB1aW50MzJfdCBmbGFncykgewogCi0gICAgaW50IGl2bGVuZ3RoOwotICAgIENIRUNLKG1Gb3JtYXQuZmluZEludDMyKGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplLCAmaXZsZW5ndGgpKTsKKyAgICBpbnQzMl90IGl2bGVuZ3RoOworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19ERUZBVUxUX0lWX1NJWkUsICZpdmxlbmd0aCkpOwogCiAgICAgLy8gb25seSAwLCA4IGFuZCAxNiBieXRlIGluaXRpYWxpemF0aW9uIHZlY3RvcnMgYXJlIHN1cHBvcnRlZAogICAgIGlmIChpdmxlbmd0aCAhPSAwICYmIGl2bGVuZ3RoICE9IDggJiYgaXZsZW5ndGggIT0gMTYpIHsKQEAgLTQ2MTQsNyArNTAzNSw3IEBACiAKIHN0YXR1c190IE1QRUc0U291cmNlOjpwYXJzZVRyYWNrRnJhZ21lbnRSdW4ob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3Qgc2l6ZSkgewogCi0gICAgQUxPR1YoIk1QRUc0RXh0cmFjdG9yOjpwYXJzZVRyYWNrRnJhZ21lbnRSdW4iKTsKKyAgICBBTE9HVigiTVBFRzRTb3VyY2U6OnBhcnNlVHJhY2tGcmFnbWVudFJ1biIpOwogICAgIGlmIChzaXplIDwgOCkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CkBAIC00NzU2LDEwICs1MTc3LDEwIEBACiAgICAgICAgIH0KIAogICAgICAgICBBTE9HVigiYWRkaW5nIHNhbXBsZSAlZCBhdCBvZmZzZXQgMHglMDgiIFBSSXg2NCAiLCBzaXplICV1LCBkdXJhdGlvbiAldSwgIgotICAgICAgICAgICAgICAiIGZsYWdzIDB4JTA4eCIsIGkgKyAxLAorICAgICAgICAgICAgICAiIGZsYWdzIDB4JTA4eCBjdHNPZmZzZXQgJSIgUFJJdTMyLCBpICsgMSwKICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LCBzYW1wbGVTaXplLCBzYW1wbGVEdXJhdGlvbiwKICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBrRmlyc3RTYW1wbGVGbGFnc1ByZXNlbnQpICYmIGkgPT0gMAotICAgICAgICAgICAgICAgICAgICA/IGZpcnN0U2FtcGxlRmxhZ3MgOiBzYW1wbGVGbGFncyk7CisgICAgICAgICAgICAgICAgICAgID8gZmlyc3RTYW1wbGVGbGFncyA6IHNhbXBsZUZsYWdzLCBzYW1wbGVDdHNPZmZzZXQpOwogICAgICAgICB0bXAub2Zmc2V0ID0gZGF0YU9mZnNldDsKICAgICAgICAgdG1wLnNpemUgPSBzYW1wbGVTaXplOwogICAgICAgICB0bXAuZHVyYXRpb24gPSBzYW1wbGVEdXJhdGlvbjsKQEAgLTQ3NzUsMTAgKzUxOTYsMTAgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE1QRUc0U291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHNFNvdXJjZTo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbWV0YSA9IG1Gb3JtYXQ7Ci0gICAgcmV0dXJuIE9LOworICAgIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1Gb3JtYXQpOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHNpemVfdCBNUEVHNFNvdXJjZTo6cGFyc2VOQUxTaXplKGNvbnN0IHVpbnQ4X3QgKmRhdGEpIGNvbnN0IHsKQEAgLTQ4MDAsMTUgKzUyMjEsNDQgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKK2ludDMyX3QgTVBFRzRTb3VyY2U6OnBhcnNlSEVWQ0xheWVySWQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBDSEVDSyhkYXRhICE9IG51bGxwdHIgJiYgc2l6ZSA+PSAobU5BTExlbmd0aFNpemUgKyAyKSk7CisKKyAgICAvLyBIRVZDIE5BTC1oZWFkZXIgKDE2LWJpdCkKKyAgICAvLyAgMSAgIDYgICAgICA2ICAgICAzCisgICAgLy8gfC18dXV1dXV1fC0tLS0tLXxpaWl8CisgICAgLy8gICAgICBeICAgICAgICAgICAgXgorICAgIC8vICBOQUxfdHlwZSAgICAgICAgbGF5ZXJfaWQgKyAxCisgICAgLy8KKyAgICAvLyBMYXllci1pZCBpcyBub24temVybyBvbmx5IGZvciBUZW1wb3JhbCBTdWItbGF5ZXIgQWNjZXNzIHBpY3R1cmVzIChUU0EpCisgICAgZW51bSB7CisgICAgICAgIFRTQV9OID0gMiwKKyAgICAgICAgVFNBX1IgPSAzLAorICAgICAgICBTVFNBX04gPSA0LAorICAgICAgICBTVFNBX1IgPSA1LAorICAgIH07CisKKyAgICBkYXRhICs9IG1OQUxMZW5ndGhTaXplOworICAgIHVpbnQxNl90IG5hbEhlYWRlciA9IGRhdGFbMF0gPDwgOCB8IGRhdGFbMV07CisKKyAgICB1aW50MTZfdCBuYWxUeXBlID0gKG5hbEhlYWRlciA+PiA5KSAmIDB4M0Z1OworICAgIGlmIChuYWxUeXBlID09IFRTQV9OIHx8IG5hbFR5cGUgPT0gVFNBX1IgfHwgbmFsVHlwZSA9PSBTVFNBX04gfHwgbmFsVHlwZSA9PSBTVFNBX1IpIHsKKyAgICAgICAgaW50MzJfdCBsYXllcklkUGx1c09uZSA9IG5hbEhlYWRlciAmIDB4N3U7CisgICAgICAgIEFMT0dEX0lGKGxheWVySWRQbHVzT25lID09IDAsICJnb3QgbGF5ZXJJZCAwIGZvciBUU0EgcGljdHVyZSIpOworICAgICAgICByZXR1cm4gbGF5ZXJJZFBsdXNPbmUgLSAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworbWVkaWFfc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBDSEVDSyhtU3RhcnRlZCk7CiAKLSAgICBpZiAob3B0aW9ucyAhPSBudWxscHRyICYmIG9wdGlvbnMtPmdldE5vbkJsb2NraW5nKCkgJiYgIW1Hcm91cC0+aGFzX2J1ZmZlcnMoKSkgeworICAgIGlmIChvcHRpb25zICE9IG51bGxwdHIgJiYgb3B0aW9ucy0+Z2V0Tm9uQmxvY2tpbmcoKSAmJiAhbUJ1ZmZlckdyb3VwLT5oYXNfYnVmZmVycygpKSB7CiAgICAgICAgICpvdXQgPSBudWxscHRyOwotICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfV09VTERfQkxPQ0s7CiAgICAgfQogCiAgICAgaWYgKG1GaXJzdE1vb2ZPZmZzZXQgPiAwKSB7CkBAIC00ODIyLDEyICs1MjcyLDEzIEBACiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwogICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwogICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CisKICAgICAgICAgaWYgKG1Jc0hlaWYpIHsKICAgICAgICAgICAgIENIRUNLKG1TYW1wbGVUYWJsZSA9PSBOVUxMKTsKICAgICAgICAgICAgIENIRUNLKG1JdGVtVGFibGUgIT0gTlVMTCk7CiAgICAgICAgICAgICBpbnQzMl90IGltYWdlSW5kZXg7Ci0gICAgICAgICAgICBpZiAoIW1Gb3JtYXQuZmluZEludDMyKGtLZXlUcmFja0lELCAmaW1hZ2VJbmRleCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9UUkFDS19JRCwgJmltYWdlSW5kZXgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHN0YXR1c190IGVycjsKQEAgLTQ4MzcsNyArNTI4OCw3IEBACiAgICAgICAgICAgICAgICAgZXJyID0gbUl0ZW1UYWJsZS0+ZmluZFRodW1ibmFpbEl0ZW0oaW1hZ2VJbmRleCwgJm1DdXJyZW50U2FtcGxlSW5kZXgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdWludDMyX3QgZmluZEZsYWdzID0gMDsKQEAgLTQ4NTksNiArNTMxMCw5IEBACiAgICAgICAgICAgICAgICAgICAgIENIRUNLKCEiU2hvdWxkIG5vdCBiZSBoZXJlLiIpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBtb2RlICE9IFJlYWRPcHRpb25zOjpTRUVLX0ZSQU1FX0lOREVYKSB7CisgICAgICAgICAgICAgICAgc2Vla1RpbWVVcyArPSAoKGludDY0X3QpbUVsc3RTaGlmdFN0YXJ0VGlja3MgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGU7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4OwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNhbXBsZVRhYmxlLT5maW5kU2FtcGxlQXRUaW1lKApAQCAtNDg5MiwxNCArNTM0NiwxNSBAQAogICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGFsbCB0aGUgd2F5IHRvIHRoZSBNZWRpYVBsYXllciB3b3VsZCBjYXVzZSBhYm5vcm1hbAogICAgICAgICAgICAgICAgICAgICAvLyB0ZXJtaW5hdGlvbi4gTGVnYWN5IGJlaGF2aW91ciBhcHBlYXJzIHRvIGJlIHRvIGJlaGF2ZSBhcyBpZgogICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYWQgc2Vla2VkIHRvIHRoZSBlbmQgb2Ygc3RyZWFtLCBlbmRpbmcgbm9ybWFsbHkuCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQUxPR1YoImVuZCBvZiBzdHJlYW0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1vZGUgPT0gUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVAogICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0gUmVhZE9wdGlvbnM6OlNFRUtfRlJBTUVfSU5ERVgpIHsKKyAgICAgICAgICAgICAgICBzYW1wbGVUaW1lIC09IG1FbHN0U2hpZnRTdGFydFRpY2tzOwogICAgICAgICAgICAgICAgIHRhcmdldFNhbXBsZVRpbWVVcyA9IChzYW1wbGVUaW1lICogMTAwMDAwMGxsKSAvIG1UaW1lc2NhbGU7CiAgICAgICAgICAgICB9CiAKQEAgLTQ5MzgsNiArNTM5MywxMCBAQAogICAgICAgICBpZiAoIW1Jc0hlaWYpIHsKICAgICAgICAgICAgIGVyciA9IG1TYW1wbGVUYWJsZS0+Z2V0TWV0YURhdGFGb3JTYW1wbGUoCiAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXgsICZvZmZzZXQsICZzaXplLCAmY3RzLCAmaXNTeW5jU2FtcGxlLCAmc3R0cyk7CisgICAgICAgICAgICBpZihlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBjdHMgLT0gbUVsc3RTaGlmdFN0YXJ0VGlja3M7CisgICAgICAgICAgICB9CisKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGVyciA9IG1JdGVtVGFibGUtPmdldEltYWdlT2Zmc2V0QW5kU2l6ZSgKICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSA/CkBAIC00OTQ5LDI0ICs1NDA4LDI3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICB9CiAKLSAgICAgICAgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmbUJ1ZmZlcik7CisgICAgICAgIGVyciA9IG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJm1CdWZmZXIpOwogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgPT0gTlVMTCk7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICB9CiAgICAgICAgIGlmIChzaXplID4gbUJ1ZmZlci0+c2l6ZSgpKSB7CiAgICAgICAgICAgICBBTE9HRSgiYnVmZmVyIHRvbyBzbWFsbDogJXp1ID4gJXp1Iiwgc2l6ZSwgbUJ1ZmZlci0+c2l6ZSgpKTsKICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0JVRkZFUl9UT09fU01BTEw7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047IC8vIEVSUk9SX0JVRkZFUl9UT09fU01BTEwKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmICgoIW1Jc0FWQyAmJiAhbUlzSEVWQykgfHwgbVdhbnRzTkFMRnJhZ21lbnRzKSB7CisgICAgaWYgKCFtSXNBVkMgJiYgIW1Jc0hFVkMgJiYgIW1Jc0FDNCkgewogICAgICAgICBpZiAobmV3QnVmZmVyKSB7CiAgICAgICAgICAgICBpZiAobUlzUGNtKSB7CiAgICAgICAgICAgICAgICAgLy8gVGhlIHR3b3MnIFBDTSBibG9jayByZWFkZXIgYXNzdW1lcyB0aGF0IGFsbCBzYW1wbGVzIGhhcyB0aGUgc2FtZSBzaXplLgpAQCAtNDk4MSwyMiArNTQ0MywyNSBAQAogICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNUb1JlYWQsIHNpemUsIG1DdXJyZW50U2FtcGxlSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVRhYmxlLT5nZXRMYXN0U2FtcGxlSW5kZXhJbkNodW5rKCkpOwogCi0gICAgICAgICAgICAgICAgc2l6ZV90IHRvdGFsU2l6ZSA9IHNhbXBsZXNUb1JlYWQgKiBzaXplOworICAgICAgICAgICAgICAgc2l6ZV90IHRvdGFsU2l6ZSA9IHNhbXBsZXNUb1JlYWQgKiBzaXplOwogICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGJ1ZiA9ICh1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpOwogICAgICAgICAgICAgICAgIHNzaXplX3QgYnl0ZXNSZWFkID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGJ1ZiwgdG90YWxTaXplKTsKICAgICAgICAgICAgICAgICBpZiAoYnl0ZXNSZWFkIDwgKHNzaXplX3QpdG90YWxTaXplKSB7CiAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwotICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gbUJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1ldGEpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogCiAgICAgICAgICAgICAgICAgaW50MzJfdCBieXRlT3JkZXI7Ci0gICAgICAgICAgICAgICAgbUZvcm1hdC5maW5kSW50MzIoa0tleVBjbUJpZ0VuZGlhbiwgJmJ5dGVPcmRlcik7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1BDTV9CSUdfRU5ESUFOLCAmYnl0ZU9yZGVyKTsKIAogICAgICAgICAgICAgICAgIGlmIChieXRlT3JkZXIgPT0gMSkgewogICAgICAgICAgICAgICAgICAgICAvLyBCaWctZW5kaWFuIC0+IGxpdHRsZS1lbmRpYW4KQEAgLTUwMTgsMTY2ICs1NDgzLDgxIEBACiAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIHNpemUpOwotICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICBrS2V5VGltZSwgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICgoaW50NjRfdClzdHRzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBtQnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfY2xlYXIobWV0YSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAoKGludDY0X3Qpc3R0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CiAKICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleVRhcmdldFRpbWUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FLCB0YXJnZXRTYW1wbGVUaW1lVXMpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChpc1N5bmNTYW1wbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAgICAgICAgICAgICAgICAgfQotCisgCiAgICAgICAgICAgICAgICAgKyttQ3VycmVudFNhbXBsZUluZGV4OwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFtSXNBVkMgJiYgIW1Jc0hFVkMpIHsKLSAgICAgICAgICAgICpvdXQgPSBtQnVmZmVyOwotICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisgICAgICAgICpvdXQgPSBtQnVmZmVyOworICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CiAKLSAgICAgICAgLy8gRWFjaCBOQUwgdW5pdCBpcyBzcGxpdCB1cCBpbnRvIGl0cyBjb25zdGl0dWVudCBmcmFnbWVudHMgYW5kCi0gICAgICAgIC8vIGVhY2ggb25lIG9mIHRoZW0gcmV0dXJuZWQgaW4gaXRzIG93biBidWZmZXIuCi0KLSAgICAgICAgQ0hFQ0sobUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPj0gbU5BTExlbmd0aFNpemUpOwotCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9Ci0gICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSArIG1CdWZmZXItPnJhbmdlX29mZnNldCgpOwotCi0gICAgICAgIHNpemVfdCBuYWxfc2l6ZSA9IHBhcnNlTkFMU2l6ZShzcmMpOwotICAgICAgICBpZiAobU5BTExlbmd0aFNpemUgPiBTSVpFX01BWCAtIG5hbF9zaXplKSB7Ci0gICAgICAgICAgICBBTE9HRSgiYi8yNDQ0MTU1MywgYi8yNDQ0NTEyMiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIG1OQUxMZW5ndGhTaXplIDwgbmFsX3NpemUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJpbmNvbXBsZXRlIE5BTCB1bml0LiIpOwotCi0gICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLQotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqY2xvbmUgPSBtQnVmZmVyLT5jbG9uZSgpOwotICAgICAgICBDSEVDSyhjbG9uZSAhPSBOVUxMKTsKLSAgICAgICAgY2xvbmUtPnNldF9yYW5nZShtQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIG1OQUxMZW5ndGhTaXplLCBuYWxfc2l6ZSk7Ci0KKyAgICB9IGVsc2UgaWYgKG1Jc0FDNCkgewogICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwotICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoCi0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkgKyBtTkFMTGVuZ3RoU2l6ZSArIG5hbF9zaXplLAotICAgICAgICAgICAgICAgIG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpIC0gbU5BTExlbmd0aFNpemUgLSBuYWxfc2l6ZSk7Ci0KLSAgICAgICAgaWYgKG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgKm91dCA9IGNsb25lOwotCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBXaG9sZSBOQUwgdW5pdHMgYXJlIHJldHVybmVkIGJ1dCBlYWNoIGZyYWdtZW50IGlzIHByZWZpeGVkIGJ5Ci0gICAgICAgIC8vIHRoZSBzdGFydCBjb2RlICgweDAwIDAwIDAwIDAxKS4KLSAgICAgICAgc3NpemVfdCBudW1fYnl0ZXNfcmVhZCA9IDA7Ci0gICAgICAgIGludDMyX3QgZHJtID0gMDsKLSAgICAgICAgYm9vbCB1c2VzRFJNID0gKG1Gb3JtYXQuZmluZEludDMyKGtLZXlJc0RSTSwgJmRybSkgJiYgZHJtICE9IDApOwotICAgICAgICBpZiAodXNlc0RSTSkgewotICAgICAgICAgICAgbnVtX2J5dGVzX3JlYWQgPQotICAgICAgICAgICAgICAgIG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCAodWludDhfdCopbUJ1ZmZlci0+ZGF0YSgpLCBzaXplKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG51bV9ieXRlc19yZWFkID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIG1TcmNCdWZmZXIsIHNpemUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG51bV9ieXRlc19yZWFkIDwgKHNzaXplX3Qpc2l6ZSkgeworICAgICAgICAvLyBNYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIHRvIHdyaXRlIHRoZSBzeW5jIGhlYWRlciBhbmQgdGhlIHJhdyBmcmFtZQorICAgICAgICBpZiAobUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPCAoNyArIHNpemUpKSB7CiAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICAgICAgfQogCi0gICAgICAgIGlmICh1c2VzRFJNKSB7Ci0gICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwotICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIHNpemUpOworICAgICAgICB1aW50OF90ICpkc3REYXRhID0gKHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCk7CisgICAgICAgIHNpemVfdCBkc3RPZmZzZXQgPSAwOworICAgICAgICAvLyBBZGQgQUMtNCBzeW5jIGhlYWRlciB0byBNUEVHNCBlbmNhcHN1bGF0ZWQgQUMtNCByYXcgZnJhbWUKKyAgICAgICAgLy8gQUM0MCBzeW5jIHdvcmQsIG1lYW5pbmcgbm8gQ1JDIGF0IHRoZSBlbmQgb2YgdGhlIGZyYW1lCisgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMHhBQzsKKyAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAweDQwOworICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDB4RkY7CisgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMHhGRjsKKyAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAodWludDhfdCkoKHNpemUgPj4gMTYpICYgMHhGRik7CisgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gKHVpbnQ4X3QpKChzaXplID4+IDgpICYgMHhGRik7CisgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gKHVpbnQ4X3QpKChzaXplID4+IDApICYgMHhGRik7CiAKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgKmRzdERhdGEgPSAodWludDhfdCAqKW1CdWZmZXItPmRhdGEoKTsKLSAgICAgICAgICAgIHNpemVfdCBzcmNPZmZzZXQgPSAwOwotICAgICAgICAgICAgc2l6ZV90IGRzdE9mZnNldCA9IDA7CisgICAgICAgIHNzaXplX3QgbnVtQnl0ZXNSZWFkID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGRzdERhdGEgKyBkc3RPZmZzZXQsIHNpemUpOworICAgICAgICBpZiAobnVtQnl0ZXNSZWFkICE9IChzc2l6ZV90KXNpemUpIHsKKyAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCi0gICAgICAgICAgICB3aGlsZSAoc3JjT2Zmc2V0IDwgc2l6ZSkgewotICAgICAgICAgICAgICAgIGJvb2wgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbU5BTExlbmd0aFNpemUpOwotICAgICAgICAgICAgICAgIHNpemVfdCBuYWxMZW5ndGggPSAwOwotICAgICAgICAgICAgICAgIGlmICghaXNNYWxGb3JtZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbmFsTGVuZ3RoID0gcGFyc2VOQUxTaXplKCZtU3JjQnVmZmVyW3NyY09mZnNldF0pOwotICAgICAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbU5BTExlbmd0aFNpemU7Ci0gICAgICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG5hbExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzTWFsRm9ybWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJWaWRlbyBpcyBtYWxmb3JtZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFsTGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGRzdE9mZnNldCA+IFNJWkVfTUFYIC0gNCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCA+IFNJWkVfTUFYIC0gbmFsTGVuZ3RoIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKyA0ICsgbmFsTGVuZ3RoID4gbUJ1ZmZlci0+c2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJiLzI3MjA4NjIxIDogJXp1ICV6dSIsIGRzdE9mZnNldCwgbUJ1ZmZlci0+c2l6ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzIwODYyMSIpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKLSAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7Ci0gICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOwotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoJmRzdERhdGFbZHN0T2Zmc2V0XSwgJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSwgbmFsTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbmFsTGVuZ3RoOwotICAgICAgICAgICAgICAgIGRzdE9mZnNldCArPSBuYWxMZW5ndGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDSEVDS19FUShzcmNPZmZzZXQsIHNpemUpOwotICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBkc3RPZmZzZXQpOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICAgICAgfQogCi0gICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLmNsZWFyKCk7Ci0gICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKLSAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoKGludDY0X3Qpc3R0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBkc3RPZmZzZXQgKyBzaXplKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gbUJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9jbGVhcihtZXRhKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgIG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAoKGludDY0X3Qpc3R0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CiAKICAgICAgICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwKSB7Ci0gICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAga0tleVRhcmdldFRpbWUsIHRhcmdldFNhbXBsZVRpbWVVcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUlzQVZDKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCBsYXllcklkID0gRmluZEFWQ0xheWVySWQoCi0gICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5VGVtcG9yYWxMYXllcklkLCBsYXllcklkKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9UQVJHRVRfVElNRSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChpc1N5bmNTYW1wbGUpIHsKLSAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKICAgICAgICAgfQogCiAgICAgICAgICsrbUN1cnJlbnRTYW1wbGVJbmRleDsKQEAgLTUxODUsMTIgKzU1NjUsMTA1IEBACiAgICAgICAgICpvdXQgPSBtQnVmZmVyOwogICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAotICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gV2hvbGUgTkFMIHVuaXRzIGFyZSByZXR1cm5lZCBidXQgZWFjaCBmcmFnbWVudCBpcyBwcmVmaXhlZCBieQorICAgICAgICAvLyB0aGUgc3RhcnQgY29kZSAoMHgwMCAwMCAwMCAwMSkuCisgICAgICAgIHNzaXplX3QgbnVtX2J5dGVzX3JlYWQgPSAwOworICAgICAgICBudW1fYnl0ZXNfcmVhZCA9IG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBtU3JjQnVmZmVyLCBzaXplKTsKKworICAgICAgICBpZiAobnVtX2J5dGVzX3JlYWQgPCAoc3NpemVfdClzaXplKSB7CisgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQ4X3QgKmRzdERhdGEgPSAodWludDhfdCAqKW1CdWZmZXItPmRhdGEoKTsKKyAgICAgICAgc2l6ZV90IHNyY09mZnNldCA9IDA7CisgICAgICAgIHNpemVfdCBkc3RPZmZzZXQgPSAwOworCisgICAgICAgIHdoaWxlIChzcmNPZmZzZXQgPCBzaXplKSB7CisgICAgICAgICAgICBib29sIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG1OQUxMZW5ndGhTaXplKTsKKyAgICAgICAgICAgIHNpemVfdCBuYWxMZW5ndGggPSAwOworICAgICAgICAgICAgaWYgKCFpc01hbEZvcm1lZCkgeworICAgICAgICAgICAgICAgIG5hbExlbmd0aCA9IHBhcnNlTkFMU2l6ZSgmbVNyY0J1ZmZlcltzcmNPZmZzZXRdKTsKKyAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbU5BTExlbmd0aFNpemU7CisgICAgICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbmFsTGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGlzTWFsRm9ybWVkKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlZpZGVvIGlzIG1hbGZvcm1lZCIpOworICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG5hbExlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkc3RPZmZzZXQgPiBTSVpFX01BWCAtIDQgfHwKKyAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCA+IFNJWkVfTUFYIC0gbmFsTGVuZ3RoIHx8CisgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCArIDQgKyBuYWxMZW5ndGggPiBtQnVmZmVyLT5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYi8yNzIwODYyMSA6ICV6dSAlenUiLCBkc3RPZmZzZXQsIG1CdWZmZXItPnNpemUoKSk7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzIwODYyMSIpOworICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAxOworICAgICAgICAgICAgbWVtY3B5KCZkc3REYXRhW2RzdE9mZnNldF0sICZtU3JjQnVmZmVyW3NyY09mZnNldF0sIG5hbExlbmd0aCk7CisgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbmFsTGVuZ3RoOworICAgICAgICAgICAgZHN0T2Zmc2V0ICs9IG5hbExlbmd0aDsKKyAgICAgICAgfQorICAgICAgICBDSEVDS19FUShzcmNPZmZzZXQsIHNpemUpOworICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOworICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgZHN0T2Zmc2V0KTsKKworICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBtQnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1ldGEpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoCisgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgIG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICgoaW50NjRfdClzdHRzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKworICAgICAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDApIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9UQVJHRVRfVElNRSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtSXNBVkMpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGxheWVySWQgPSBGaW5kQVZDTGF5ZXJJZCgKKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0lELCBsYXllcklkKTsKKyAgICAgICAgfSBlbHNlIGlmIChtSXNIRVZDKSB7CisgICAgICAgICAgICBpbnQzMl90IGxheWVySWQgPSBwYXJzZUhFVkNMYXllcklkKAorICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworICAgICAgICAgICAgaWYgKGxheWVySWQgPj0gMCkgeworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0lELCBsYXllcklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc1N5bmNTYW1wbGUpIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOworICAgICAgICB9CisKKyAgICAgICAgKyttQ3VycmVudFNhbXBsZUluZGV4OworCisgICAgICAgICpvdXQgPSBtQnVmZmVyOworICAgICAgICBtQnVmZmVyID0gTlVMTDsKKworICAgICAgICByZXR1cm4gQU1FRElBX09LOwogICAgIH0KIH0KIAotc3RhdHVzX3QgTVBFRzRTb3VyY2U6OmZyYWdtZW50ZWRSZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHNFNvdXJjZTo6ZnJhZ21lbnRlZFJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogCiAgICAgQUxPR1YoIk1QRUc0U291cmNlOjpmcmFnbWVudGVkUmVhZCIpOwogCkBAIC01MjA0LDYgKzU2NzcsMTAgQEAKICAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgewogCisgICAgICAgIHNlZWtUaW1lVXMgKz0gKChpbnQ2NF90KW1FbHN0U2hpZnRTdGFydFRpY2tzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlOworICAgICAgICBBTE9HVigic2hpZnRlZCBzZWVrVGltZVVzIDolIiBQUklkNjQgIiwgbUVsc3RTaGlmdFN0YXJ0VGlja3M6JSIgUFJJZDMyLCBzZWVrVGltZVVzLAorICAgICAgICAgICAgICAgIG1FbHN0U2hpZnRTdGFydFRpY2tzKTsKKwogICAgICAgICBpbnQgbnVtU2lkeEVudHJpZXMgPSBtU2VnbWVudHMuc2l6ZSgpOwogICAgICAgICBpZiAobnVtU2lkeEVudHJpZXMgIT0gMCkgewogICAgICAgICAgICAgaW50NjRfdCB0b3RhbFRpbWUgPSAwOwpAQCAtNTIzMSw3ICs1NzA4LDcgQEAKICAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXggPSAwOwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuaygmdG90YWxPZmZzZXQpOwogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUN1cnJlbnRUaW1lID0gdG90YWxUaW1lICogbVRpbWVzY2FsZSAvIDEwMDAwMDBsbDsKICAgICAgICAgfSBlbHNlIHsKQEAgLTUyNDMsNyArNTcyMCw3IEBACiAgICAgICAgICAgICBvZmY2NF90IHRtcCA9IG1DdXJyZW50TW9vZk9mZnNldDsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsoJnRtcCk7CiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtQ3VycmVudFRpbWUgPSAwOwogICAgICAgICB9CkBAIC01MjYxLDEzICs1NzM4LDE3IEBACiAgICAgdWludDMyX3QgY3RzID0gMDsKICAgICBib29sIGlzU3luY1NhbXBsZSA9IGZhbHNlOwogICAgIGJvb2wgbmV3QnVmZmVyID0gZmFsc2U7Ci0gICAgaWYgKG1CdWZmZXIgPT0gTlVMTCkgeworICAgIGlmIChtQnVmZmVyID09IE5VTEwgfHwgbUN1cnJlbnRTYW1wbGVJbmRleCA+PSBtQ3VycmVudFNhbXBsZXMuc2l6ZSgpKSB7CiAgICAgICAgIG5ld0J1ZmZlciA9IHRydWU7CiAKKyAgICAgICAgaWYgKG1CdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisgICAgICAgIH0KICAgICAgICAgaWYgKG1DdXJyZW50U2FtcGxlSW5kZXggPj0gbUN1cnJlbnRTYW1wbGVzLnNpemUoKSkgewogICAgICAgICAgICAgLy8gbW92ZSB0byBuZXh0IGZyYWdtZW50IGlmIHRoZXJlIGlzIG9uZQogICAgICAgICAgICAgaWYgKG1OZXh0TW9vZk9mZnNldCA8PSBtQ3VycmVudE1vb2ZPZmZzZXQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBvZmY2NF90IG5leHRNb29mID0gbU5leHRNb29mT2Zmc2V0OwogICAgICAgICAgICAgbUN1cnJlbnRNb29mT2Zmc2V0ID0gbmV4dE1vb2Y7CkBAIC01Mjc1LDEwICs1NzU2LDEwIEBACiAgICAgICAgICAgICBtQ3VycmVudFNhbXBsZUluZGV4ID0gMDsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsoJm5leHRNb29mKTsKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtQ3VycmVudFNhbXBsZUluZGV4ID49IG1DdXJyZW50U2FtcGxlcy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtNTI4Niw1OSArNTc2Nyw2MSBAQAogICAgICAgICBvZmZzZXQgPSBzbXBsLT5vZmZzZXQ7CiAgICAgICAgIHNpemUgPSBzbXBsLT5zaXplOwogICAgICAgICBjdHMgPSBtQ3VycmVudFRpbWUgKyBzbXBsLT5jb21wb3NpdGlvbk9mZnNldDsKLSAgICAgICAgbUN1cnJlbnRUaW1lICs9IHNtcGwtPmR1cmF0aW9uOwotICAgICAgICBpc1N5bmNTYW1wbGUgPSAobUN1cnJlbnRTYW1wbGVJbmRleCA9PSAwKTsgLy8gWFhYCisgICAgICAgIGN0cyAtPSBtRWxzdFNoaWZ0U3RhcnRUaWNrczsKIAotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZtQnVmZmVyKTsKKyAgICAgICAgbUN1cnJlbnRUaW1lICs9IHNtcGwtPmR1cmF0aW9uOworICAgICAgICBpc1N5bmNTYW1wbGUgPSAobUN1cnJlbnRTYW1wbGVJbmRleCA9PSAwKTsKKworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZtQnVmZmVyKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBDSEVDSyhtQnVmZmVyID09IE5VTEwpOwogICAgICAgICAgICAgQUxPR1YoImFjcXVpcmVfYnVmZmVyIHJldHVybmVkICVkIiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgIH0KICAgICAgICAgaWYgKHNpemUgPiBtQnVmZmVyLT5zaXplKCkpIHsKICAgICAgICAgICAgIEFMT0dFKCJidWZmZXIgdG9vIHNtYWxsOiAlenUgPiAlenUiLCBzaXplLCBtQnVmZmVyLT5zaXplKCkpOwogICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfQlVGRkVSX1RPT19TTUFMTDsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfQogICAgIH0KIAogICAgIGNvbnN0IFNhbXBsZSAqc21wbCA9ICZtQ3VycmVudFNhbXBsZXNbbUN1cnJlbnRTYW1wbGVJbmRleF07Ci0gICAgTWV0YURhdGFCYXNlICZidWZtZXRhID0gbUJ1ZmZlci0+bWV0YV9kYXRhKCk7Ci0gICAgYnVmbWV0YS5jbGVhcigpOworICAgIEFNZWRpYUZvcm1hdCAqYnVmbWV0YSA9IG1CdWZmZXItPm1ldGFfZGF0YSgpOworICAgIEFNZWRpYUZvcm1hdF9jbGVhcihidWZtZXRhKTsKICAgICBpZiAoc21wbC0+ZW5jcnlwdGVkc2l6ZXMuc2l6ZSgpKSB7CiAgICAgICAgIC8vIHN0b3JlIGNsZWFyL2VuY3J5cHRlZCBsZW5ndGhzIGluIG1ldGFkYXRhCi0gICAgICAgIGJ1Zm1ldGEuc2V0RGF0YShrS2V5UGxhaW5TaXplcywgMCwKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihidWZtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19QTEFJTl9TSVpFUywKICAgICAgICAgICAgICAgICBzbXBsLT5jbGVhcnNpemVzLmFycmF5KCksIHNtcGwtPmNsZWFyc2l6ZXMuc2l6ZSgpICogNCk7Ci0gICAgICAgIGJ1Zm1ldGEuc2V0RGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsIDAsCisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX1NJWkVTLAogICAgICAgICAgICAgICAgIHNtcGwtPmVuY3J5cHRlZHNpemVzLmFycmF5KCksIHNtcGwtPmVuY3J5cHRlZHNpemVzLnNpemUoKSAqIDQpOwotICAgICAgICBidWZtZXRhLnNldEludDMyKGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplLCBtRGVmYXVsdElWU2l6ZSk7Ci0gICAgICAgIGJ1Zm1ldGEuc2V0SW50MzIoa0tleUNyeXB0b01vZGUsIG1DcnlwdG9Nb2RlKTsKLSAgICAgICAgYnVmbWV0YS5zZXREYXRhKGtLZXlDcnlwdG9LZXksIDAsIG1DcnlwdG9LZXksIDE2KTsKLSAgICAgICAgYnVmbWV0YS5zZXRJbnQzMihrS2V5RW5jcnlwdGVkQnl0ZUJsb2NrLCBtRGVmYXVsdEVuY3J5cHRlZEJ5dGVCbG9jayk7Ci0gICAgICAgIGJ1Zm1ldGEuc2V0SW50MzIoa0tleVNraXBCeXRlQmxvY2ssIG1EZWZhdWx0U2tpcEJ5dGVCbG9jayk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihidWZtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19ERUZBVUxUX0lWX1NJWkUsIG1EZWZhdWx0SVZTaXplKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX01PREUsIG1DcnlwdG9Nb2RlKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihidWZtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksIG1DcnlwdG9LZXksIDE2KTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX0JZVEVfQkxPQ0ssIG1EZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fU0tJUF9CWVRFX0JMT0NLLCBtRGVmYXVsdFNraXBCeXRlQmxvY2spOwogCi0gICAgICAgIHVpbnQzMl90IHR5cGUgPSAwOwotICAgICAgICBjb25zdCB2b2lkICppdiA9IE5VTEw7CisgICAgICAgIHZvaWQgKml2ID0gTlVMTDsKICAgICAgICAgc2l6ZV90IGl2bGVuZ3RoID0gMDsKLSAgICAgICAgaWYgKCFtRm9ybWF0LmZpbmREYXRhKAotICAgICAgICAgICAgICAgIGtLZXlDcnlwdG9JViwgJnR5cGUsICZpdiwgJml2bGVuZ3RoKSkgewotICAgICAgICAgICAgaXYgPSBzbXBsLT5pdjsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKG1Gb3JtYXQsCisgICAgICAgICAgICAgICAgImNyeXB0by1pdiIsICZpdiwgJml2bGVuZ3RoKSkgeworICAgICAgICAgICAgaXYgPSAodm9pZCAqKSBzbXBsLT5pdjsKICAgICAgICAgICAgIGl2bGVuZ3RoID0gMTY7IC8vIHVzZSAxNiBvciB0aGUgYWN0dWFsIHNpemU/CiAgICAgICAgIH0KLSAgICAgICAgYnVmbWV0YS5zZXREYXRhKGtLZXlDcnlwdG9JViwgMCwgaXYsIGl2bGVuZ3RoKTsKLQorICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0lWLCBpdiwgaXZsZW5ndGgpOwogICAgIH0KIAotICAgIGlmICgoIW1Jc0FWQyAmJiAhbUlzSEVWQyl8fCBtV2FudHNOQUxGcmFnbWVudHMpIHsKKyAgICBpZiAoIW1Jc0FWQyAmJiAhbUlzSEVWQykgewogICAgICAgICBpZiAobmV3QnVmZmVyKSB7CiAgICAgICAgICAgICBpZiAoIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBtQnVmZmVyLT5zaXplKCksIHNpemUpKSB7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCiAgICAgICAgICAgICAgICAgQUxPR0UoImZyYWdtZW50ZWRSZWFkIEVSUk9SX01BTEZPUk1FRCBzaXplICV6dSIsIHNpemUpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHNzaXplX3QgbnVtX2J5dGVzX3JlYWQgPQpAQCAtNTM0OSwxMDMgKzU4MzIsNTcgQEAKICAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAogICAgICAgICAgICAgICAgIEFMT0dFKCJpL28gZXJyb3IiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKICAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBzaXplKTsKLSAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICBrS2V5VGltZSwgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoKGludDY0X3Qpc21wbC0+ZHVyYXRpb24gKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGJ1Zm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmbWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgKChpbnQ2NF90KXNtcGwtPmR1cmF0aW9uICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKIAogICAgICAgICAgICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICBrS2V5VGFyZ2V0VGltZSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9UQVJHRVRfVElNRSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1Jc0FWQykgewogICAgICAgICAgICAgICAgIHVpbnQzMl90IGxheWVySWQgPSBGaW5kQVZDTGF5ZXJJZCgKICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleVRlbXBvcmFsTGF5ZXJJZCwgbGF5ZXJJZCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfSUQsIGxheWVySWQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtSXNIRVZDKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBsYXllcklkID0gcGFyc2VIRVZDTGF5ZXJJZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgaWYgKGxheWVySWQgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9JRCwgbGF5ZXJJZCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoaXNTeW5jU2FtcGxlKSB7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgKyttQ3VycmVudFNhbXBsZUluZGV4OwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFtSXNBVkMgJiYgIW1Jc0hFVkMpIHsKLSAgICAgICAgICAgICpvdXQgPSBtQnVmZmVyOwotICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisgICAgICAgICpvdXQgPSBtQnVmZmVyOworICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CiAKLSAgICAgICAgLy8gRWFjaCBOQUwgdW5pdCBpcyBzcGxpdCB1cCBpbnRvIGl0cyBjb25zdGl0dWVudCBmcmFnbWVudHMgYW5kCi0gICAgICAgIC8vIGVhY2ggb25lIG9mIHRoZW0gcmV0dXJuZWQgaW4gaXRzIG93biBidWZmZXIuCi0KLSAgICAgICAgQ0hFQ0sobUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPj0gbU5BTExlbmd0aFNpemUpOwotCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9Ci0gICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSArIG1CdWZmZXItPnJhbmdlX29mZnNldCgpOwotCi0gICAgICAgIHNpemVfdCBuYWxfc2l6ZSA9IHBhcnNlTkFMU2l6ZShzcmMpOwotICAgICAgICBpZiAobU5BTExlbmd0aFNpemUgPiBTSVpFX01BWCAtIG5hbF9zaXplKSB7Ci0gICAgICAgICAgICBBTE9HRSgiYi8yNDQ0MTU1MywgYi8yNDQ0NTEyMiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpIC0gbU5BTExlbmd0aFNpemUgPCBuYWxfc2l6ZSkgewotICAgICAgICAgICAgQUxPR0UoImluY29tcGxldGUgTkFMIHVuaXQuIik7Ci0KLSAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpjbG9uZSA9IG1CdWZmZXItPmNsb25lKCk7Ci0gICAgICAgIENIRUNLKGNsb25lICE9IE5VTEwpOwotICAgICAgICBjbG9uZS0+c2V0X3JhbmdlKG1CdWZmZXItPnJhbmdlX29mZnNldCgpICsgbU5BTExlbmd0aFNpemUsIG5hbF9zaXplKTsKLQotICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwotICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoCi0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkgKyBtTkFMTGVuZ3RoU2l6ZSArIG5hbF9zaXplLAotICAgICAgICAgICAgICAgIG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpIC0gbU5BTExlbmd0aFNpemUgLSBuYWxfc2l6ZSk7Ci0KLSAgICAgICAgaWYgKG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgKm91dCA9IGNsb25lOwotCi0gICAgICAgIHJldHVybiBPSzsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HVigid2hvbGUgTkFMIik7CiAgICAgICAgIC8vIFdob2xlIE5BTCB1bml0cyBhcmUgcmV0dXJuZWQgYnV0IGVhY2ggZnJhZ21lbnQgaXMgcHJlZml4ZWQgYnkKICAgICAgICAgLy8gdGhlIHN0YXJ0IGNvZGUgKDB4MDAgMDAgMDAgMDEpLgogICAgICAgICBzc2l6ZV90IG51bV9ieXRlc19yZWFkID0gMDsKLSAgICAgICAgaW50MzJfdCBkcm0gPSAwOwotICAgICAgICBib29sIHVzZXNEUk0gPSAobUZvcm1hdC5maW5kSW50MzIoa0tleUlzRFJNLCAmZHJtKSAmJiBkcm0gIT0gMCk7CiAgICAgICAgIHZvaWQgKmRhdGEgPSBOVUxMOwogICAgICAgICBib29sIGlzTWFsRm9ybWVkID0gZmFsc2U7Ci0gICAgICAgIGlmICh1c2VzRFJNKSB7Ci0gICAgICAgICAgICBpZiAobUJ1ZmZlciA9PSBOVUxMIHx8ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgbUJ1ZmZlci0+c2l6ZSgpLCBzaXplKSkgewotICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGF0YSA9IG1CdWZmZXItPmRhdGEoKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBtYXhfc2l6ZTsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSwgJm1heF9zaXplKQorICAgICAgICAgICAgICAgIHx8ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgKHNpemVfdCltYXhfc2l6ZSwgc2l6ZSkpIHsKKyAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gdHJ1ZTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludDMyX3QgbWF4X3NpemU7Ci0gICAgICAgICAgICBpZiAoIW1Gb3JtYXQuZmluZEludDMyKGtLZXlNYXhJbnB1dFNpemUsICZtYXhfc2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCAoc2l6ZV90KW1heF9zaXplLCBzaXplKSkgewotICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGF0YSA9IG1TcmNCdWZmZXI7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBkYXRhID0gbVNyY0J1ZmZlcjsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChpc01hbEZvcm1lZCB8fCBkYXRhID09IE5VTEwpIHsKQEAgLTU0NTQsNyArNTg5MSw3IEBACiAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgICAgIG51bV9ieXRlc19yZWFkID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGRhdGEsIHNpemUpOwogCkBAIC01NDYzLDc1ICs1OTAwLDY5IEBACiAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAogICAgICAgICAgICAgQUxPR0UoImkvbyBlcnJvciIpOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICAgICAgfQogCi0gICAgICAgIGlmICh1c2VzRFJNKSB7Ci0gICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwotICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIHNpemUpOworICAgICAgICB1aW50OF90ICpkc3REYXRhID0gKHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCk7CisgICAgICAgIHNpemVfdCBzcmNPZmZzZXQgPSAwOworICAgICAgICBzaXplX3QgZHN0T2Zmc2V0ID0gMDsKIAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdWludDhfdCAqZHN0RGF0YSA9ICh1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpOwotICAgICAgICAgICAgc2l6ZV90IHNyY09mZnNldCA9IDA7Ci0gICAgICAgICAgICBzaXplX3QgZHN0T2Zmc2V0ID0gMDsKLQotICAgICAgICAgICAgd2hpbGUgKHNyY09mZnNldCA8IHNpemUpIHsKLSAgICAgICAgICAgICAgICBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBtTkFMTGVuZ3RoU2l6ZSk7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IG5hbExlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc01hbEZvcm1lZCkgewotICAgICAgICAgICAgICAgICAgICBuYWxMZW5ndGggPSBwYXJzZU5BTFNpemUoJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSk7Ci0gICAgICAgICAgICAgICAgICAgIHNyY09mZnNldCArPSBtTkFMTGVuZ3RoU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbmFsTGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgbUJ1ZmZlci0+c2l6ZSgpLCBkc3RPZmZzZXQsIChzaXplX3QpNHUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBtQnVmZmVyLT5zaXplKCksIGRzdE9mZnNldCArIDQsIG5hbExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzTWFsRm9ybWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJWaWRlbyBpcyBtYWxmb3JtZWQ7IG5hbExlbmd0aCAlenUiLCBuYWxMZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYWxMZW5ndGggPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZHN0T2Zmc2V0ID4gU0laRV9NQVggLSA0IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKyA0ID4gU0laRV9NQVggLSBuYWxMZW5ndGggfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCArIDQgKyBuYWxMZW5ndGggPiBtQnVmZmVyLT5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImIvMjYzNjUzNDkgOiAlenUgJXp1IiwgZHN0T2Zmc2V0LCBtQnVmZmVyLT5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI2MzY1MzQ5Iik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOwotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKLSAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7Ci0gICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAxOwotICAgICAgICAgICAgICAgIG1lbWNweSgmZHN0RGF0YVtkc3RPZmZzZXRdLCAmbVNyY0J1ZmZlcltzcmNPZmZzZXRdLCBuYWxMZW5ndGgpOwotICAgICAgICAgICAgICAgIHNyY09mZnNldCArPSBuYWxMZW5ndGg7Ci0gICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICs9IG5hbExlbmd0aDsKKyAgICAgICAgd2hpbGUgKHNyY09mZnNldCA8IHNpemUpIHsKKyAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG1OQUxMZW5ndGhTaXplKTsKKyAgICAgICAgICAgIHNpemVfdCBuYWxMZW5ndGggPSAwOworICAgICAgICAgICAgaWYgKCFpc01hbEZvcm1lZCkgeworICAgICAgICAgICAgICAgIG5hbExlbmd0aCA9IHBhcnNlTkFMU2l6ZSgmbVNyY0J1ZmZlcltzcmNPZmZzZXRdKTsKKyAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbU5BTExlbmd0aFNpemU7CisgICAgICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbmFsTGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBtQnVmZmVyLT5zaXplKCksIGRzdE9mZnNldCwgKHNpemVfdCk0dSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgbUJ1ZmZlci0+c2l6ZSgpLCBkc3RPZmZzZXQgKyA0LCBuYWxMZW5ndGgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQ0hFQ0tfRVEoc3JjT2Zmc2V0LCBzaXplKTsKLSAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgZHN0T2Zmc2V0KTsKLSAgICAgICAgfQogCi0gICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKLSAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoKGludDY0X3Qpc21wbC0+ZHVyYXRpb24gKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICAgICAgaWYgKGlzTWFsRm9ybWVkKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlZpZGVvIGlzIG1hbGZvcm1lZDsgbmFsTGVuZ3RoICV6dSIsIG5hbExlbmd0aCk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobmFsTGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRzdE9mZnNldCA+IFNJWkVfTUFYIC0gNCB8fAorICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKyA0ID4gU0laRV9NQVggLSBuYWxMZW5ndGggfHwKKyAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCArIG5hbExlbmd0aCA+IG1CdWZmZXItPnNpemUoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJiLzI2MzY1MzQ5IDogJXp1ICV6dSIsIGRzdE9mZnNldCwgbUJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI2MzY1MzQ5Iik7CisgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDE7CisgICAgICAgICAgICBtZW1jcHkoJmRzdERhdGFbZHN0T2Zmc2V0XSwgJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSwgbmFsTGVuZ3RoKTsKKyAgICAgICAgICAgIHNyY09mZnNldCArPSBuYWxMZW5ndGg7CisgICAgICAgICAgICBkc3RPZmZzZXQgKz0gbmFsTGVuZ3RoOworICAgICAgICB9CisgICAgICAgIENIRUNLX0VRKHNyY09mZnNldCwgc2l6ZSk7CisgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7CisgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBkc3RPZmZzZXQpOworCisgICAgICAgIEFNZWRpYUZvcm1hdCAqYnVmbWV0YSA9IG1CdWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmbWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmbWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAoKGludDY0X3Qpc21wbC0+ZHVyYXRpb24gKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwogCiAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgewotICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUYXJnZXRUaW1lLCB0YXJnZXRTYW1wbGVUaW1lVXMpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaXNTeW5jU2FtcGxlKSB7Ci0gICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAgICAgICAgIH0KIAogICAgICAgICArK21DdXJyZW50U2FtcGxlSW5kZXg7CkBAIC01NTM5LDE1ICs1OTcwLDE3IEBACiAgICAgICAgICpvdXQgPSBtQnVmZmVyOwogICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAotICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CiAgICAgfQorCisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogTVBFRzRFeHRyYWN0b3I6OlRyYWNrICpNUEVHNEV4dHJhY3Rvcjo6ZmluZFRyYWNrQnlNaW1lUHJlZml4KAogICAgICAgICBjb25zdCBjaGFyICptaW1lUHJlZml4KSB7CiAgICAgZm9yIChUcmFjayAqdHJhY2sgPSBtRmlyc3RUcmFjazsgdHJhY2sgIT0gTlVMTDsgdHJhY2sgPSB0cmFjay0+bmV4dCkgewogICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICBpZiAodHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkKKyAgICAgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpCiAgICAgICAgICAgICAgICAgJiYgIXN0cm5jYXNlY21wKG1pbWUsIG1pbWVQcmVmaXgsIHN0cmxlbihtaW1lUHJlZml4KSkpIHsKICAgICAgICAgICAgIHJldHVybiB0cmFjazsKICAgICAgICAgfQpAQCAtNTU1Niw3ICs1OTg5LDcgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGJvb2wgTGVnYWN5U25pZmZNUEVHNChEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgeworc3RhdGljIGJvb2wgTGVnYWN5U25pZmZNUEVHNChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CiAgICAgdWludDhfdCBoZWFkZXJbOF07CiAKICAgICBzc2l6ZV90IG4gPSBzb3VyY2UtPnJlYWRBdCg0LCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKTsKQEAgLTU1ODcsNiArNjAyMCw3IEBACiAgICAgICAgIEZPVVJDQygnYScsICd2JywgJ2MnLCAnMScpLAogICAgICAgICBGT1VSQ0MoJ2gnLCAndicsICdjJywgJzEnKSwKICAgICAgICAgRk9VUkNDKCdoJywgJ2UnLCAndicsICcxJyksCisgICAgICAgIEZPVVJDQygnYScsICd2JywgJzAnLCAnMScpLAogICAgICAgICBGT1VSQ0MoJzMnLCAnZycsICdwJywgJzQnKSwKICAgICAgICAgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICcxJyksCiAgICAgICAgIEZPVVJDQygnbScsICdwJywgJzQnLCAnMicpLApAQCAtNTYyMSw3ICs2MDU1LDcgQEAKIC8vIEFsc28gdHJ5IHRvIGlkZW50aWZ5IHdoZXJlIHRoaXMgZmlsZSdzIG1ldGFkYXRhIGVuZHMKIC8vIChlbmQgb2YgdGhlICdtb292JyBhdG9tKSBhbmQgcmVwb3J0IGl0IHRvIHRoZSBjYWxsZXIgYXMgcGFydCBvZgogLy8gdGhlIG1ldGFkYXRhLgotc3RhdGljIGJvb2wgQmV0dGVyU25pZmZNUEVHNChEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgeworc3RhdGljIGJvb2wgQmV0dGVyU25pZmZNUEVHNChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CiAgICAgLy8gV2Ugc2NhbiB1cCB0byAxMjggYnl0ZXMgdG8gaWRlbnRpZnkgdGhpcyBmaWxlIGFzIGFuIE1QNC4KICAgICBzdGF0aWMgY29uc3Qgb2ZmNjRfdCBrTWF4U2Nhbk9mZnNldCA9IDEyOGxsOwogCkBAIC01NjY3LDcgKzYxMDEsOCBAQAogCiAgICAgICAgIGNoYXIgY2h1bmtzdHJpbmdbNV07CiAgICAgICAgIE1ha2VGb3VyQ0NTdHJpbmcoY2h1bmtUeXBlLCBjaHVua3N0cmluZyk7Ci0gICAgICAgIEFMT0dWKCJzYXcgY2h1bmsgdHlwZSAlcywgc2l6ZSAlIiBQUkl1NjQgIiBAICVsbGQiLCBjaHVua3N0cmluZywgY2h1bmtTaXplLCAobG9uZyBsb25nKW9mZnNldCk7CisgICAgICAgIEFMT0dWKCJzYXcgY2h1bmsgdHlwZSAlcywgc2l6ZSAlIiBQUkl1NjQgIiBAICVsbGQiLAorICAgICAgICAgICAgICAgIGNodW5rc3RyaW5nLCBjaHVua1NpemUsIChsb25nIGxvbmcpb2Zmc2V0KTsKICAgICAgICAgc3dpdGNoIChjaHVua1R5cGUpIHsKICAgICAgICAgICAgIGNhc2UgRk9VUkNDKCdmJywgJ3QnLCAneScsICdwJyk6CiAgICAgICAgICAgICB7CkBAIC01NzI4LDE4ICs2MTYzLDE5IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIHZvaWQgKikgewotICAgIHJldHVybiBuZXcgTVBFRzRFeHRyYWN0b3Ioc291cmNlKTsKK3N0YXRpYyBDTWVkaWFFeHRyYWN0b3IqIENyZWF0ZUV4dHJhY3RvcihDRGF0YVNvdXJjZSAqc291cmNlLCB2b2lkICopIHsKKyAgICByZXR1cm4gd3JhcChuZXcgTVBFRzRFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSkpOwogfQogCi1zdGF0aWMgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIFNuaWZmKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKiwKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSB7Ci0gICAgaWYgKEJldHRlclNuaWZmTVBFRzQoc291cmNlLCBjb25maWRlbmNlKSkgeworc3RhdGljIENyZWF0b3JGdW5jIFNuaWZmKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKiwKKyAgICAgICAgRnJlZU1ldGFGdW5jICopIHsKKyAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihzb3VyY2UpOworICAgIGlmIChCZXR0ZXJTbmlmZk1QRUc0KCZoZWxwZXIsIGNvbmZpZGVuY2UpKSB7CiAgICAgICAgIHJldHVybiBDcmVhdGVFeHRyYWN0b3I7CiAgICAgfQogCi0gICAgaWYgKExlZ2FjeVNuaWZmTVBFRzQoc291cmNlLCBjb25maWRlbmNlKSkgeworICAgIGlmIChMZWdhY3lTbmlmZk1QRUc0KCZoZWxwZXIsIGNvbmZpZGVuY2UpKSB7CiAgICAgICAgIEFMT0dXKCJJZGVudGlmaWVkIHN1cHBvcnRlZCBtcGVnNCB0aHJvdWdoIExlZ2FjeVNuaWZmTVBFRzQuIik7CiAgICAgICAgIHJldHVybiBDcmVhdGVFeHRyYWN0b3I7CiAgICAgfQpAQCAtNTc0NywxNiArNjE4MywyOSBAQAogICAgIHJldHVybiBOVUxMOwogfQogCitzdGF0aWMgY29uc3QgY2hhciAqZXh0ZW5zaW9uc1tdID0geworICAgICIzZzIiLAorICAgICIzZ3AiLAorICAgICIzZ3BwIiwKKyAgICAiM2dwcDIiLAorICAgICJtNGEiLAorICAgICJtNHIiLAorICAgICJtNHYiLAorICAgICJtb3YiLAorICAgICJtcDQiLAorICAgIE5VTEwKK307CisKIGV4dGVybiAiQyIgewogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAogX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CitFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgewogICAgIHJldHVybiB7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgRVhUUkFDVE9SREVGX1ZFUlNJT04sCiAgICAgICAgIFVVSUQoIjI3NTc1YzY3LTQ0MTctNGM1NC04ZDNkLThlNjI2OTg1YTE2NCIpLAotICAgICAgICAxLCAvLyB2ZXJzaW9uCisgICAgICAgIDIsIC8vIHZlcnNpb24KICAgICAgICAgIk1QNCBFeHRyYWN0b3IiLAotICAgICAgICBTbmlmZgorICAgICAgICB7IC52MyA9IHtTbmlmZiwgZXh0ZW5zaW9uc30gfSwKICAgICB9OwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuaAppbmRleCAzZWEwOTYzLi5mYWRmYjUwIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmgKQEAgLTIwLDkgKzIwLDkgQEAKIAogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgogCi0jaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgpAQCAtMzEsOCArMzEsOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBzdHJ1Y3QgQU1lc3NhZ2U7Ci1jbGFzcyBEYXRhU291cmNlQmFzZTsKLXN0cnVjdCBDYWNoZWRSYW5nZWREYXRhU291cmNlOworc3RydWN0IENEYXRhU291cmNlOworY2xhc3MgRGF0YVNvdXJjZUhlbHBlcjsKIGNsYXNzIFNhbXBsZVRhYmxlOwogY2xhc3MgU3RyaW5nODsKIG5hbWVzcGFjZSBoZWlmIHsKQEAgLTUzLDE1ICs1MywxNSBAQAogICAgIHVpbnQzMl90IGRlZmF1bHRfc2FtcGxlX2ZsYWdzOwogfTsKIAotY2xhc3MgTVBFRzRFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworY2xhc3MgTVBFRzRFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgewogcHVibGljOgotICAgIGV4cGxpY2l0IE1QRUc0RXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUgPSBOVUxMKTsKKyAgICBleHBsaWNpdCBNUEVHNEV4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUgPSBOVUxMKTsKIAogICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7Ci0gICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgTWVkaWFUcmFja0hlbHBlciAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiTVBFRzRFeHRyYWN0b3IiOyB9CiAKQEAgLTc3LDcgKzc3LDcgQEAKICAgICB9OwogICAgIHN0cnVjdCBUcmFjayB7CiAgICAgICAgIFRyYWNrICpuZXh0OwotICAgICAgICBNZXRhRGF0YUJhc2UgbWV0YTsKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhOwogICAgICAgICB1aW50MzJfdCB0aW1lc2NhbGU7CiAgICAgICAgIHNwPFNhbXBsZVRhYmxlPiBzYW1wbGVUYWJsZTsKICAgICAgICAgYm9vbCBpbmNsdWRlc19leHBlbnNpdmVfbWV0YWRhdGE7CkBAIC04NSw2ICs4NSw3IEBACiAgICAgICAgIGJvb2wgaGFzX2Vsc3Q7CiAgICAgICAgIGludDY0X3QgZWxzdF9tZWRpYV90aW1lOwogICAgICAgICB1aW50NjRfdCBlbHN0X3NlZ21lbnRfZHVyYXRpb247CisgICAgICAgIGludDMyX3QgZWxzdFNoaWZ0U3RhcnRUaWNrczsKICAgICAgICAgYm9vbCBzdWJzYW1wbGVfZW5jcnlwdGlvbjsKICAgICB9OwogCkBAIC05Nyw4ICs5OCw3IEBACiAKICAgICBWZWN0b3I8VHJleD4gbVRyZXg7CiAKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7Ci0gICAgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZSAqbUNhY2hlZFNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwogICAgIHVpbnQzMl90IG1IZWFkZXJUaW1lc2NhbGU7CiAgICAgYm9vbCBtSXNRVDsKQEAgLTEwOCw3ICsxMDgsNyBAQAogCiAgICAgVHJhY2sgKm1GaXJzdFRyYWNrLCAqbUxhc3RUcmFjazsKIAotICAgIE1ldGFEYXRhQmFzZSBtRmlsZU1ldGFEYXRhOworICAgIEFNZWRpYUZvcm1hdCAqbUZpbGVNZXRhRGF0YTsKIAogICAgIFZlY3Rvcjx1aW50MzJfdD4gbVBhdGg7CiAgICAgU3RyaW5nOCBtTGFzdENvbW1lbnRNZWFuOwpAQCAtMTM5LDE3ICsxMzksMTYgQEAKIAogICAgIFRyYWNrICpmaW5kVHJhY2tCeU1pbWVQcmVmaXgoY29uc3QgY2hhciAqbWltZVByZWZpeCk7CiAKLSAgICBzdGF0dXNfdCBwYXJzZUFDM1NhbXBsZUVudHJ5KG9mZjY0X3Qgb2Zmc2V0KTsKLSAgICBzdGF0dXNfdCBwYXJzZUFDM1NwZWNpZmljQm94KG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCBzYW1wbGVSYXRlKTsKKyAgICBzdGF0dXNfdCBwYXJzZUNoYW5uZWxDb3VudFNhbXBsZVJhdGUoCisgICAgICAgICAgICBvZmY2NF90ICpvZmZzZXQsIHVpbnQxNl90ICpjaGFubmVsQ291bnQsIHVpbnQxNl90ICpzYW1wbGVSYXRlKTsKKyAgICBzdGF0dXNfdCBwYXJzZUFDM1NwZWNpZmljQm94KG9mZjY0X3Qgb2Zmc2V0KTsKKyAgICBzdGF0dXNfdCBwYXJzZUVBQzNTcGVjaWZpY0JveChvZmY2NF90IG9mZnNldCk7CisgICAgc3RhdHVzX3QgcGFyc2VBQzRTcGVjaWZpY0JveChvZmY2NF90IG9mZnNldCk7CiAKICAgICBNUEVHNEV4dHJhY3Rvcihjb25zdCBNUEVHNEV4dHJhY3RvciAmKTsKICAgICBNUEVHNEV4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IE1QRUc0RXh0cmFjdG9yICYpOwogfTsKIAotYm9vbCBTbmlmZk1QRUc0KAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsCi0gICAgICAgIHNwPEFNZXNzYWdlPiAqKTsKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBNUEVHNF9FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZUl0ZXJhdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZUl0ZXJhdG9yLmNwcAppbmRleCA5M2VlN2M2Li4xYTZkMzA2IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVJdGVyYXRvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlSXRlcmF0b3IuY3BwCkBAIC0zMjgsNyArMzI4LDE1IEBACiAgICAgICAgICsrbVRpbWVUb1NhbXBsZUluZGV4OwogICAgIH0KIAotICAgICp0aW1lID0gbVRUU1NhbXBsZVRpbWUgKyBtVFRTRHVyYXRpb24gKiAoc2FtcGxlSW5kZXggLSBtVFRTU2FtcGxlSW5kZXgpOworICAgIC8vIGJlbG93IGlzIGVxdWl2YWxlbnQgdG86CisgICAgLy8gKnRpbWUgPSBtVFRTU2FtcGxlVGltZSArIG1UVFNEdXJhdGlvbiAqIChzYW1wbGVJbmRleCAtIG1UVFNTYW1wbGVJbmRleCk7CisgICAgdWludDMyX3QgdG1wOworICAgIGlmIChfX2J1aWx0aW5fc3ViX292ZXJmbG93KHNhbXBsZUluZGV4LCBtVFRTU2FtcGxlSW5kZXgsICZ0bXApIHx8CisgICAgICAgICAgICBfX2J1aWx0aW5fbXVsX292ZXJmbG93KG1UVFNEdXJhdGlvbiwgdG1wLCAmdG1wKSB8fAorICAgICAgICAgICAgX19idWlsdGluX2FkZF9vdmVyZmxvdyhtVFRTU2FtcGxlVGltZSwgdG1wLCAmdG1wKSkgeworICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgIH0KKyAgICAqdGltZSA9IHRtcDsKIAogICAgIGludDMyX3Qgb2Zmc2V0ID0gbVRhYmxlLT5nZXRDb21wb3NpdGlvblRpbWVPZmZzZXQoc2FtcGxlSW5kZXgpOwogICAgIGlmICgob2Zmc2V0IDwgMCAmJiAqdGltZSA8IChvZmZzZXQgPT0gSU5UMzJfTUlOID8KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZVRhYmxlLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZVRhYmxlLmNwcAppbmRleCAyOGZlNzE3Li5kMjQyNzk4IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVUYWJsZS5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlVGFibGUuY3BwCkBAIC0yNSw3ICsyNSw3IEBACiAKICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KIAotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CiAKQEAgLTExNCw3ICsxMTQsNyBAQAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1TYW1wbGVUYWJsZTo6U2FtcGxlVGFibGUoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKK1NhbXBsZVRhYmxlOjpTYW1wbGVUYWJsZShEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbUNodW5rT2Zmc2V0T2Zmc2V0KC0xKSwKICAgICAgIG1DaHVua09mZnNldFR5cGUoMCksCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVUYWJsZS5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlVGFibGUuaAppbmRleCBkZDY4ODYwLi5kNGI1ZGM4IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVUYWJsZS5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZVRhYmxlLmgKQEAgLTIxLDE4ICsyMSwxOSBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgogCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitjbGFzcyBEYXRhU291cmNlSGVscGVyOwogc3RydWN0IFNhbXBsZUl0ZXJhdG9yOwogCiBjbGFzcyBTYW1wbGVUYWJsZSA6IHB1YmxpYyBSZWZCYXNlIHsKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBTYW1wbGVUYWJsZShEYXRhU291cmNlQmFzZSAqc291cmNlKTsKKyAgICBleHBsaWNpdCBTYW1wbGVUYWJsZShEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogCiAgICAgYm9vbCBpc1ZhbGlkKCkgY29uc3Q7CiAKQEAgLTEwMiw3ICsxMDMsNyBAQAogICAgIC8vIExpbWl0IHRoZSB0b3RhbCBzaXplIG9mIGFsbCBpbnRlcm5hbCB0YWJsZXMgdG8gMjAwTWlCLgogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heFRvdGFsU2l6ZSA9IDIwMCAqICgxIDw8IDIwKTsKIAotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICBNdXRleCBtTG9jazsKIAogICAgIG9mZjY0X3QgbUNodW5rT2Zmc2V0T2Zmc2V0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9BbmRyb2lkLmJwCmluZGV4IDM4Yzg2ZWIuLmI4MTYwOTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0FuZHJvaWQuYnAKQEAgLTE1LDE0ICsxNSwxMSBAQAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXNAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzLm5hdGl2ZUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCi0gICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGliY3J5cHRvIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJoaWRsYWxsb2NhdG9ydXRpbHMiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAorICAgICAgICAibGliaGlkbG1lbW9yeSIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCkBAIC0zMCw4ICsyNywxMyBAQAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliY3J5cHRvIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0IiwKKyAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKICAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VzZHMiLAogICAgIF0sCiAKICAgICBuYW1lOiAibGlibXBlZzJleHRyYWN0b3IiLApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9FeHRyYWN0b3JCdW5kbGUuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9FeHRyYWN0b3JCdW5kbGUuY3BwCmluZGV4IDhhMGZhMDMuLjk0NmEyYTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvRXh0cmFjdG9yQnVuZGxlLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0V4dHJhY3RvckJ1bmRsZS5jcHAKQEAgLTE4LDM5ICsxOCw1NCBAQAogI2RlZmluZSBMT0dfVEFHICJNUEVHMkV4dHJhY3RvckJ1bmRsZSIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlICJNUEVHMlBTRXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiTVBFRzJUU0V4dHJhY3Rvci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0cnVjdCBDRGF0YVNvdXJjZTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnNbXSA9IHsKKyAgICJtMnAiLAorICAgInRzIiwKKyAgIE5VTEwKK307CisKIGV4dGVybiAiQyIgewogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAogX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CitFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgewogICAgIHJldHVybiB7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgRVhUUkFDVE9SREVGX1ZFUlNJT04sCiAgICAgICAgIFVVSUQoIjNkMWRjZmViLWU0MGEtNDM2ZC1hNTc0LWMyNDM4YTU1NWU1ZiIpLAogICAgICAgICAxLAogICAgICAgICAiTVBFRzItUFMvVFMgRXh0cmFjdG9yIiwKLSAgICAgICAgW10oCi0gICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgICAgICAgICB2b2lkICoqLAotICAgICAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKikgLT4gTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIHsKLSAgICAgICAgICAgIGlmIChTbmlmZk1QRUcyVFMoc291cmNlLCBjb25maWRlbmNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBbXSgKLSAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IE1lZGlhRXh0cmFjdG9yKiB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTVBFRzJUU0V4dHJhY3Rvcihzb3VyY2UpO307Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFNuaWZmTVBFRzJQUyhzb3VyY2UsIGNvbmZpZGVuY2UpKSB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC52MyA9IHsKKyAgICAgICAgICAgICAgICBbXSgKKyAgICAgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKiosCisgICAgICAgICAgICAgICAgICAgIEZyZWVNZXRhRnVuYyAqKSAtPiBDcmVhdG9yRnVuYyB7CisgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKHNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChTbmlmZk1QRUcyVFMoJmhlbHBlciwgY29uZmlkZW5jZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBNZWRpYUV4dHJhY3RvciogewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTVBFRzJQU0V4dHJhY3Rvcihzb3VyY2UpO307CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gQ01lZGlhRXh0cmFjdG9yKiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAobmV3IE1QRUcyVFNFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSkpO307CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoU25pZmZNUEVHMlBTKCZoZWxwZXIsIGNvbmZpZGVuY2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW10oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gQ01lZGlhRXh0cmFjdG9yKiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAobmV3IE1QRUcyUFNFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSkpO307CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBleHRlbnNpb25zCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQorICAgICAgICB9LAogICAgIH07CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJQU0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuY3BwCmluZGV4IDY5ODBiODIuLjU1NGQyNTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJQU0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmNwcApAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgIm1wZWcydHMvRVNRdWV1ZS5oIgogCiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTM0LDIyICszMywyMyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrIDogcHVibGljIE1lZGlhVHJhY2ssIHB1YmxpYyBSZWZCYXNlIHsKK3N0cnVjdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjayA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyIHsKICAgICBUcmFjayhNUEVHMlBTRXh0cmFjdG9yICpleHRyYWN0b3IsCiAgICAgICAgICAgdW5zaWduZWQgc3RyZWFtX2lkLCB1bnNpZ25lZCBzdHJlYW1fdHlwZSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5UcmFjaygpOwpAQCAtNzIsMjkgKzcyLDI5IEBACiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVHJhY2spOwogfTsKIAotc3RydWN0IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjayA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKLSAgICBXcmFwcGVkVHJhY2soTVBFRzJQU0V4dHJhY3RvciAqZXh0cmFjdG9yLCBjb25zdCBzcDxUcmFjaz4gJnRyYWNrKTsKK3N0cnVjdCBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2sgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CisgICAgV3JhcHBlZFRyYWNrKE1QRUcyUFNFeHRyYWN0b3IgKmV4dHJhY3RvciwgVHJhY2sgKnRyYWNrKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICopOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfldyYXBwZWRUcmFjaygpOwogCiBwcml2YXRlOgogICAgIE1QRUcyUFNFeHRyYWN0b3IgKm1FeHRyYWN0b3I7Ci0gICAgc3A8TVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s+IG1UcmFjazsKKyAgICBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjayAqbVRyYWNrOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoV3JhcHBlZFRyYWNrKTsKIH07CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLU1QRUcyUFNFeHRyYWN0b3I6Ok1QRUcyUFNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKK01QRUcyUFNFeHRyYWN0b3I6Ok1QRUcyUFNFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1PZmZzZXQoMCksCiAgICAgICBtRmluYWxSZXN1bHQoT0spLApAQCAtMTA4LDI1ICsxMDgsMjcgQEAKICAgICB9CiAKICAgICAvLyBSZW1vdmUgYWxsIHRyYWNrcyB0aGF0IHdlcmUgdW5hYmxlIHRvIGRldGVybWluZSB0aGVpciBmb3JtYXQuCi0gICAgTWV0YURhdGFCYXNlIG1ldGE7CisgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOwogICAgIGZvciAoc2l6ZV90IGkgPSBtVHJhY2tzLnNpemUoKTsgaSA+IDA7KSB7CiAgICAgICAgIGktLTsKLSAgICAgICAgaWYgKG1UcmFja3MudmFsdWVBdChpKS0+Z2V0Rm9ybWF0KG1ldGEpICE9IE9LKSB7CisgICAgICAgIGlmIChtVHJhY2tzLnZhbHVlQXQoaSktPmdldEZvcm1hdChtZXRhKSAhPSBBTUVESUFfT0spIHsKICAgICAgICAgICAgIG1UcmFja3MucmVtb3ZlSXRlbXNBdChpKTsKICAgICAgICAgfQogICAgIH0KKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1ldGEpOwogCiAgICAgbVNjYW5uaW5nID0gZmFsc2U7CiB9CiAKIE1QRUcyUFNFeHRyYWN0b3I6On5NUEVHMlBTRXh0cmFjdG9yKCkgeworICAgIGRlbGV0ZSBtRGF0YVNvdXJjZTsKIH0KIAogc2l6ZV90IE1QRUcyUFNFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtVHJhY2tzLnNpemUoKTsKIH0KIAotTWVkaWFUcmFjayAqTVBFRzJQU0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpNUEVHMlBTRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKICAgICBpZiAoaW5kZXggPj0gbVRyYWNrcy5zaXplKCkpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMTM0LDIwICsxMzYsMjAgQEAKICAgICByZXR1cm4gbmV3IFdyYXBwZWRUcmFjayh0aGlzLCBtVHJhY2tzLnZhbHVlQXQoaW5kZXgpKTsKIH0KIAotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorbWVkaWFfc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgaWYgKGluZGV4ID49IG1UcmFja3Muc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgcmV0dXJuIG1UcmFja3MudmFsdWVBdChpbmRleCktPmdldEZvcm1hdChtZXRhKTsKIH0KIAotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7Ci0gICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyUFMpOworbWVkaWFfc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlBTKTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiB1aW50MzJfdCBNUEVHMlBTRXh0cmFjdG9yOjpmbGFncygpIGNvbnN0IHsKQEAgLTYzNSw0MiArNjM3LDU1IEBACiAgICAgbVF1ZXVlID0gTlVMTDsKIH0KIAotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6c3RhcnQoKSB7CiAgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAotICAgIHJldHVybiBtU291cmNlLT5zdGFydChOVUxMKTsgLy8gQW5vdGhlclBhY2tldFNvdXJjZTo6c3RhcnQgZG9lc24ndCB1c2UgaXRzIGFyZ3VtZW50CisgICAgLy8gaW5pdGlhbGl6ZSB3aXRoIG9uZSBzbWFsbCBidWZmZXIsIGJ1dCBhbGxvdyBncm93dGgKKyAgICBtQnVmZmVyR3JvdXAtPmluaXQoMSAvKiBvbmUgYnVmZmVyICovLCAyNTYgLyogYnVmZmVyIHNpemUgKi8sIDY0IC8qIG1heCBudW1iZXIgb2YgYnVmZmVycyAqLyk7CisKKyAgICBpZiAobVNvdXJjZS0+c3RhcnQoTlVMTCkgPT0gT0spIHsgLy8gQW5vdGhlclBhY2tldFNvdXJjZTo6c3RhcnQgZG9lc24ndCB1c2UgaXRzIGFyZ3VtZW50CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgfQorICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKIH0KIAotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6c3RvcCgpIHsKICAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCi0gICAgcmV0dXJuIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICBpZiAobVNvdXJjZS0+c3RvcCgpID09IE9LKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgfQorICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKIH0KIAotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKK3ZvaWQgY29weUFNZXNzYWdlVG9BTWVkaWFGb3JtYXQoQU1lZGlhRm9ybWF0ICpmb3JtYXQsIHNwPEFNZXNzYWdlPiBtc2cpOworCittZWRpYV9zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgewogICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICBzcDxNZXRhRGF0YT4gc291cmNlTWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOwotICAgIG1ldGEgPSAqc291cmNlTWV0YTsKLSAgICByZXR1cm4gT0s7CisgICAgc3A8QU1lc3NhZ2U+IG1zZzsKKyAgICBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2Uoc291cmNlTWV0YSwgJm1zZyk7CisgICAgY29weUFNZXNzYWdlVG9BTWVkaWFGb3JtYXQobWV0YSwgbXNnKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworbWVkaWFfc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKICAgICB3aGlsZSAoIW1Tb3VyY2UtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpKSB7CiAgICAgICAgIGlmIChmaW5hbFJlc3VsdCAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgICAgIH0KIAogICAgICAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5mZWVkTW9yZSgpOwpAQCAtNjgwLDcgKzY5NSw0NyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIG1Tb3VyY2UtPnJlYWQoYnVmZmVyLCBvcHRpb25zKTsKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKm1idWY7CisgICAgbVNvdXJjZS0+cmVhZCgmbWJ1ZiwgKE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zKikgb3B0aW9ucyk7CisgICAgc2l6ZV90IGxlbmd0aCA9IG1idWYtPnJhbmdlX2xlbmd0aCgpOworICAgIE1lZGlhQnVmZmVySGVscGVyICpvdXRidWY7CisgICAgbUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmb3V0YnVmLCBmYWxzZSwgbGVuZ3RoKTsKKyAgICBtZW1jcHkob3V0YnVmLT5kYXRhKCksIG1idWYtPmRhdGEoKSwgbGVuZ3RoKTsKKyAgICBvdXRidWYtPnNldF9yYW5nZSgwLCBsZW5ndGgpOworICAgICpidWZmZXIgPSBvdXRidWY7CisgICAgTWV0YURhdGFCYXNlICZpbk1ldGEgPSBtYnVmLT5tZXRhX2RhdGEoKTsKKyAgICBBTWVkaWFGb3JtYXQgKm91dE1ldGEgPSBvdXRidWYtPm1ldGFfZGF0YSgpOworICAgIGludDY0X3QgdmFsNjQ7CisgICAgaWYgKGluTWV0YS5maW5kSW50NjQoa0tleVRpbWUsICZ2YWw2NCkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdmFsNjQpOworICAgIH0KKyAgICBpbnQzMl90IHZhbDMyOworICAgIGlmIChpbk1ldGEuZmluZEludDMyKGtLZXlJc1N5bmNGcmFtZSwgJnZhbDMyKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCB2YWwzMik7CisgICAgfQorICAgIGlmIChpbk1ldGEuZmluZEludDMyKGtLZXlDcnlwdG9Nb2RlLCAmdmFsMzIpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLCB2YWwzMik7CisgICAgfQorICAgIHVpbnQzMl90IGJ1ZlR5cGU7CisgICAgY29uc3Qgdm9pZCAqYnVmRGF0YTsKKyAgICBzaXplX3QgYnVmU2l6ZTsKKyAgICBpZiAoaW5NZXRhLmZpbmREYXRhKGtLZXlDcnlwdG9JViwgJmJ1ZlR5cGUsICZidWZEYXRhLCAmYnVmU2l6ZSkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19JViwgYnVmRGF0YSwgYnVmU2l6ZSk7CisgICAgfQorICAgIGlmIChpbk1ldGEuZmluZERhdGEoa0tleUNyeXB0b0tleSwgJmJ1ZlR5cGUsICZidWZEYXRhLCAmYnVmU2l6ZSkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksIGJ1ZkRhdGEsIGJ1ZlNpemUpOworICAgIH0KKyAgICBpZiAoaW5NZXRhLmZpbmREYXRhKGtLZXlQbGFpblNpemVzLCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1BMQUlOX1NJWkVTLCBidWZEYXRhLCBidWZTaXplKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kRGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsICZidWZUeXBlLCAmYnVmRGF0YSwgJmJ1ZlNpemUpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX1NJWkVTLCBidWZEYXRhLCBidWZTaXplKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kRGF0YShrS2V5U0VJLCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0VJLCBidWZEYXRhLCBidWZTaXplKTsKKyAgICB9CisgICAgbWJ1Zi0+cmVsZWFzZSgpOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHN0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjphcHBlbmRQRVNEYXRhKApAQCAtNzI2LDcgKzc4MSw3IEBACiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2s6OldyYXBwZWRUcmFjaygKLSAgICAgICAgTVBFRzJQU0V4dHJhY3RvciAqZXh0cmFjdG9yLCBjb25zdCBzcDxUcmFjaz4gJnRyYWNrKQorICAgICAgICBNUEVHMlBTRXh0cmFjdG9yICpleHRyYWN0b3IsIFRyYWNrICp0cmFjaykKICAgICA6IG1FeHRyYWN0b3IoZXh0cmFjdG9yKSwKICAgICAgIG1UcmFjayh0cmFjaykgewogfQpAQCAtNzM0LDI3ICs3ODksMjcgQEAKIE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6fldyYXBwZWRUcmFjaygpIHsKIH0KIAotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcykgewotICAgIHJldHVybiBtVHJhY2stPnN0YXJ0KHBhcmFtcyk7CittZWRpYV9zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2s6OnN0YXJ0KCkgeworICAgIHJldHVybiBtVHJhY2stPnN0YXJ0KCk7CiB9CiAKLXN0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6c3RvcCgpIHsKK21lZGlhX3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6c3RvcCgpIHsKICAgICByZXR1cm4gbVRyYWNrLT5zdG9wKCk7CiB9CiAKLXN0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkgeworbWVkaWFfc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSB7CiAgICAgcmV0dXJuIG1UcmFjay0+Z2V0Rm9ybWF0KG1ldGEpOwogfQogCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2s6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKK21lZGlhX3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgcmV0dXJuIG1UcmFjay0+cmVhZChidWZmZXIsIG9wdGlvbnMpOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBib29sIFNuaWZmTVBFRzJQUygKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgewogICAgIHVpbnQ4X3QgaGVhZGVyWzVdOwogICAgIGlmIChzb3VyY2UtPnJlYWRBdCgwLCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKSA8IChzc2l6ZV90KXNpemVvZihoZWFkZXIpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJQU0V4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmgKaW5kZXggOGI5ZGFkOS4uZTVkNTkxZiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmgKQEAgLTE5LDcgKzE5LDggQEAKICNkZWZpbmUgTVBFRzJfUFNfRVhUUkFDVE9SX0hfCiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CkBAIC0zMSwxNCArMzIsMTQgQEAKIHN0cnVjdCBUcmFjazsKIGNsYXNzIFN0cmluZzg7CiAKLXN0cnVjdCBNUEVHMlBTRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKLSAgICBleHBsaWNpdCBNUEVHMlBTRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworc3RydWN0IE1QRUcyUFNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgeworICAgIGV4cGxpY2l0IE1QRUcyUFNFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKTsKIAogICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7Ci0gICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgTWVkaWFUcmFja0hlbHBlciAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAKICAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJNUEVHMlBTRXh0cmFjdG9yIjsgfQpAQCAtNTEsMTIgKzUyLDEyIEBACiAgICAgc3RydWN0IFdyYXBwZWRUcmFjazsKIAogICAgIG11dGFibGUgTXV0ZXggbUxvY2s7Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogCiAgICAgb2ZmNjRfdCBtT2Zmc2V0OwogICAgIHN0YXR1c190IG1GaW5hbFJlc3VsdDsKICAgICBzcDxBQnVmZmVyPiBtQnVmZmVyOwotICAgIEtleWVkVmVjdG9yPHVuc2lnbmVkLCBzcDxUcmFjaz4gPiBtVHJhY2tzOworICAgIEtleWVkVmVjdG9yPHVuc2lnbmVkLCBUcmFjayogPiBtVHJhY2tzOwogICAgIGJvb2wgbVNjYW5uaW5nOwogCiAgICAgYm9vbCBtUHJvZ3JhbVN0cmVhbU1hcFZhbGlkOwpAQCAtNzIsNyArNzMsNyBAQAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1QRUcyUFNFeHRyYWN0b3IpOwogfTsKIAotYm9vbCBTbmlmZk1QRUcyUFMoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpOworYm9vbCBTbmlmZk1QRUcyUFMoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSk7CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuY3BwCmluZGV4IDI0ZTYyM2IuLjNiYjJhZjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmNwcApAQCAtMjYsNyArMjYsNiBAQAogCiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JU3RyZWFtU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CkBAIC0zNSw2ICszNCw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiAjaW5jbHVkZSAibXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgiCkBAIC01MSwxOSArNTEsMTkgQEAKIHN0YXRpYyBjb25zdCBpbnQga01heER1cmF0aW9uUmVhZFNpemUgPSAyNTAwMDBMTDsKIHN0YXRpYyBjb25zdCBpbnQga01heER1cmF0aW9uUmV0cnkgPSA2OwogCi1zdHJ1Y3QgTVBFRzJUU1NvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKK3N0cnVjdCBNUEVHMlRTU291cmNlIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogICAgIE1QRUcyVFNTb3VyY2UoCiAgICAgICAgICAgICBNUEVHMlRTRXh0cmFjdG9yICpleHRyYWN0b3IsCiAgICAgICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCwKICAgICAgICAgICAgIGJvb2wgZG9lc1NlZWspOwogICAgIHZpcnR1YWwgfk1QRUcyVFNTb3VyY2UoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKIAogcHJpdmF0ZToKICAgICBNUEVHMlRTRXh0cmFjdG9yICptRXh0cmFjdG9yOwpAQCAtODgsNDQgKzg4LDE0OSBAQAogTVBFRzJUU1NvdXJjZTo6fk1QRUcyVFNTb3VyY2UoKSB7CiB9CiAKLXN0YXR1c190IE1QRUcyVFNTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqKSB7Ci0gICAgcmV0dXJuIG1JbXBsLT5zdGFydChOVUxMKTsgLy8gQW5vdGhlclBhY2tldFNvdXJjZTo6c3RhcnQoKSBkb2Vzbid0IHVzZSBpdHMgYXJndW1lbnQKK21lZGlhX3N0YXR1c190IE1QRUcyVFNTb3VyY2U6OnN0YXJ0KCkgeworICAgIC8vIGluaXRpYWxpemUgd2l0aCBvbmUgc21hbGwgYnVmZmVyLCBidXQgYWxsb3cgZ3Jvd3RoCisgICAgbUJ1ZmZlckdyb3VwLT5pbml0KDEgLyogb25lIGJ1ZmZlciAqLywgMjU2IC8qIGJ1ZmZlciBzaXplICovLCA2NCAvKiBtYXggbnVtYmVyIG9mIGJ1ZmZlcnMgKi8pOworCisgICAgaWYgKCFtSW1wbC0+c3RhcnQoTlVMTCkpIHsgLy8gQW5vdGhlclBhY2tldFNvdXJjZTo6c3RhcnQoKSBkb2Vzbid0IHVzZSBpdHMgYXJndW1lbnQKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9CisgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogfQogCi1zdGF0dXNfdCBNUEVHMlRTU291cmNlOjpzdG9wKCkgewotICAgIHJldHVybiBtSW1wbC0+c3RvcCgpOworbWVkaWFfc3RhdHVzX3QgTVBFRzJUU1NvdXJjZTo6c3RvcCgpIHsKKyAgICBpZiAoIW1JbXBsLT5zdG9wKCkpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9CisgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogfQogCi1zdGF0dXNfdCBNUEVHMlRTU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7Cit2b2lkIGNvcHlBTWVzc2FnZVRvQU1lZGlhRm9ybWF0KEFNZWRpYUZvcm1hdCAqZm9ybWF0LCBzcDxBTWVzc2FnZT4gbXNnKSB7CisgICAgc2l6ZV90IG51bUVudHJpZXMgPSBtc2ctPmNvdW50RW50cmllcygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtRW50cmllczsgaSsrKSB7CisgICAgICAgIEFNZXNzYWdlOjpUeXBlIHR5cGU7CisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBtc2ctPmdldEVudHJ5TmFtZUF0KGksICZ0eXBlKTsKKyAgICAgICAgQU1lc3NhZ2U6Okl0ZW1EYXRhIGlkID0gbXNnLT5nZXRFbnRyeUF0KGkpOworCisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVJbnQzMjoKKyAgICAgICAgICAgICAgICBpbnQzMl90IHZhbDMyOworICAgICAgICAgICAgICAgIGlmIChpZC5maW5kKCZ2YWwzMikpIHsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGZvcm1hdCwgbmFtZSwgdmFsMzIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlSW50NjQ6CisgICAgICAgICAgICAgICAgaW50NjRfdCB2YWw2NDsKKyAgICAgICAgICAgICAgICBpZiAoaWQuZmluZCgmdmFsNjQpKSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChmb3JtYXQsIG5hbWUsIHZhbDY0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZUZsb2F0OgorICAgICAgICAgICAgICAgIGZsb2F0IHZhbGZsb2F0OworICAgICAgICAgICAgICAgIGlmIChpZC5maW5kKCZ2YWxmbG9hdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEZsb2F0KGZvcm1hdCwgbmFtZSwgdmFsZmxvYXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlRG91YmxlOgorICAgICAgICAgICAgICAgIGRvdWJsZSB2YWxkb3VibGU7CisgICAgICAgICAgICAgICAgaWYgKGlkLmZpbmQoJnZhbGRvdWJsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldERvdWJsZShmb3JtYXQsIG5hbWUsIHZhbGRvdWJsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVTdHJpbmc6CisgICAgICAgICAgICAgICAgaWYgKEFTdHJpbmcgczsgaWQuZmluZCgmcykpIHsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhmb3JtYXQsIG5hbWUsIHMuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVCdWZmZXI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgICAgICAgICAgICAgIGlmIChpZC5maW5kKCZidWZmZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoZm9ybWF0LCBuYW1lLCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nIHVuc3VwcG9ydGVkIHR5cGUgJWQgJyVzJyIsIHR5cGUsIG5hbWUpOworICAgICAgICB9CisgICAgfQorfQorCittZWRpYV9zdGF0dXNfdCBNUEVHMlRTU291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSB7CiAgICAgc3A8TWV0YURhdGE+IGltcGxNZXRhID0gbUltcGwtPmdldEZvcm1hdCgpOwotICAgIG1ldGEgPSAqaW1wbE1ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIHNwPEFNZXNzYWdlPiBtc2c7CisgICAgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKGltcGxNZXRhLCAmbXNnKTsKKyAgICBjb3B5QU1lc3NhZ2VUb0FNZWRpYUZvcm1hdChtZXRhLCBtc2cpOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1QRUcyVFNTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKK21lZGlhX3N0YXR1c190IE1QRUcyVFNTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgICpvdXQgPSBOVUxMOwogCiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwogICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBzZWVrTW9kZTsKICAgICBpZiAobURvZXNTZWVrICYmIG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmc2Vla01vZGUpKSB7CiAgICAgICAgIC8vIHNlZWsgaXMgbmVlZGVkCi0gICAgICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPnNlZWsoc2Vla1RpbWVVcywgc2Vla01vZGUpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5zZWVrKHNlZWtUaW1lVXMsIChSZWFkT3B0aW9uczo6U2Vla01vZGUpc2Vla01vZGUpOworICAgICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChtRXh0cmFjdG9yLT5mZWVkVW50aWxCdWZmZXJBdmFpbGFibGUobUltcGwpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgfQogCi0gICAgcmV0dXJuIG1JbXBsLT5yZWFkKG91dCwgb3B0aW9ucyk7CisgICAgTWVkaWFCdWZmZXJCYXNlICptYnVmOworICAgIG1JbXBsLT5yZWFkKCZtYnVmLCAoTWVkaWFUcmFjazo6UmVhZE9wdGlvbnMqKSBvcHRpb25zKTsKKyAgICBzaXplX3QgbGVuZ3RoID0gbWJ1Zi0+cmFuZ2VfbGVuZ3RoKCk7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKm91dGJ1ZjsKKyAgICBtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZvdXRidWYsIGZhbHNlLCBsZW5ndGgpOworICAgIG1lbWNweShvdXRidWYtPmRhdGEoKSwgbWJ1Zi0+ZGF0YSgpLCBsZW5ndGgpOworICAgIG91dGJ1Zi0+c2V0X3JhbmdlKDAsIGxlbmd0aCk7CisgICAgKm91dCA9IG91dGJ1ZjsKKyAgICBNZXRhRGF0YUJhc2UgJmluTWV0YSA9IG1idWYtPm1ldGFfZGF0YSgpOworICAgIEFNZWRpYUZvcm1hdCAqb3V0TWV0YSA9IG91dGJ1Zi0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG91dE1ldGEpOworICAgIGludDY0X3QgdmFsNjQ7CisgICAgaWYgKGluTWV0YS5maW5kSW50NjQoa0tleVRpbWUsICZ2YWw2NCkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdmFsNjQpOworICAgIH0KKyAgICBpbnQzMl90IHZhbDMyOworICAgIGlmIChpbk1ldGEuZmluZEludDMyKGtLZXlJc1N5bmNGcmFtZSwgJnZhbDMyKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCB2YWwzMik7CisgICAgfQorICAgIGlmIChpbk1ldGEuZmluZEludDMyKGtLZXlDcnlwdG9Nb2RlLCAmdmFsMzIpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLCB2YWwzMik7CisgICAgfQorICAgIHVpbnQzMl90IGJ1ZlR5cGU7CisgICAgY29uc3Qgdm9pZCAqYnVmRGF0YTsKKyAgICBzaXplX3QgYnVmU2l6ZTsKKyAgICBpZiAoaW5NZXRhLmZpbmREYXRhKGtLZXlDcnlwdG9JViwgJmJ1ZlR5cGUsICZidWZEYXRhLCAmYnVmU2l6ZSkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19JViwgYnVmRGF0YSwgYnVmU2l6ZSk7CisgICAgfQorICAgIGlmIChpbk1ldGEuZmluZERhdGEoa0tleUNyeXB0b0tleSwgJmJ1ZlR5cGUsICZidWZEYXRhLCAmYnVmU2l6ZSkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksIGJ1ZkRhdGEsIGJ1ZlNpemUpOworICAgIH0KKyAgICBpZiAoaW5NZXRhLmZpbmREYXRhKGtLZXlQbGFpblNpemVzLCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1BMQUlOX1NJWkVTLCBidWZEYXRhLCBidWZTaXplKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kRGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsICZidWZUeXBlLCAmYnVmRGF0YSwgJmJ1ZlNpemUpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX1NJWkVTLCBidWZEYXRhLCBidWZTaXplKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kRGF0YShrS2V5U0VJLCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0VJLCBidWZEYXRhLCBidWZTaXplKTsKKyAgICB9CisgICAgbWJ1Zi0+cmVsZWFzZSgpOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLU1QRUcyVFNFeHRyYWN0b3I6Ok1QRUcyVFNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKK01QRUcyVFNFeHRyYWN0b3I6Ok1QRUcyVFNFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1QYXJzZXIobmV3IEFUU1BhcnNlciksCiAgICAgICBtTGFzdFN5bmNFdmVudCgwKSwKQEAgLTEzMywxMSArMjM4LDE1IEBACiAgICAgaW5pdCgpOwogfQogCitNUEVHMlRTRXh0cmFjdG9yOjp+TVBFRzJUU0V4dHJhY3RvcigpIHsKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7Cit9CisKIHNpemVfdCBNUEVHMlRTRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKICAgICByZXR1cm4gbVNvdXJjZUltcGxzLnNpemUoKTsKIH0KIAotTWVkaWFUcmFjayAqTVBFRzJUU0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpNUEVHMlRTRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKICAgICBpZiAoaW5kZXggPj0gbVNvdXJjZUltcGxzLnNpemUoKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC0xNDgsMjIgKzI1NywyMyBAQAogICAgICAgICAgICAgKG1TZWVrU3luY1BvaW50cyA9PSAmbVN5bmNQb2ludHMuZWRpdEl0ZW1BdChpbmRleCkpKTsKIH0KIAotc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorbWVkaWFfc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgc3A8TWV0YURhdGE+IGltcGxNZXRhID0gaW5kZXggPCBtU291cmNlSW1wbHMuc2l6ZSgpCiAgICAgICAgID8gbVNvdXJjZUltcGxzLmVkaXRJdGVtQXQoaW5kZXgpLT5nZXRGb3JtYXQoKSA6IE5VTEw7CiAgICAgaWYgKGltcGxNZXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9Ci0gICAgbWV0YSA9ICppbXBsTWV0YTsKLSAgICByZXR1cm4gT0s7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZTsKKyAgICBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UoaW1wbE1ldGEsICZtc2cpOworICAgIGNvcHlBTWVzc2FnZVRvQU1lZGlhRm9ybWF0KG1ldGEsIG1zZyk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7Ci0gICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyVFMpOwotCi0gICAgcmV0dXJuIE9LOworbWVkaWFfc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlRTKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiAvL3N0YXRpYwpAQCAtMTc0LDcgKzI4NCw3IEBACiAgICAgICAgICAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX1NDUkFNQkxFRCwgbWltZSkpOwogfQogCi1zdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiBjYXNUb2tlbiwgc2l6ZV90IHNpemUpIHsKK21lZGlhX3N0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OnNldE1lZGlhQ2FzKGNvbnN0IHVpbnQ4X3QqIGNhc1Rva2VuLCBzaXplX3Qgc2l6ZSkgewogICAgIEhhbFRva2VuIGhhbFRva2VuOwogICAgIGhhbFRva2VuLnNldFRvRXh0ZXJuYWwoKHVpbnQ4X3QqKWNhc1Rva2VuLCBzaXplKTsKICAgICBzcDxJQ2FzPiBjYXMgPSBJQ2FzOjpjYXN0RnJvbShyZXRyaWV2ZUhhbEludGVyZmFjZShoYWxUb2tlbikpOwpAQCAtMTg0LDggKzI5NCw5IEBACiAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICBBTE9HSSgiQWxsIHRyYWNrcyBub3cgaGF2ZSBkZXNjcmFtYmxlcnMiKTsKICAgICAgICAgaW5pdCgpOworICAgICAgICByZXR1cm4gQU1FRElBX09LOwogICAgIH0KLSAgICByZXR1cm4gZXJyOworICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKIH0KIAogdm9pZCBNUEVHMlRTRXh0cmFjdG9yOjphZGRTb3VyY2UoY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmltcGwpIHsKQEAgLTQ5MSw3ICs2MDIsNyBAQAogfQogCiBzdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpzZWVrKGludDY0X3Qgc2Vla1RpbWVVcywKLSAgICAgICAgY29uc3QgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlICZzZWVrTW9kZSkgeworICAgICAgICBjb25zdCBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgJnNlZWtNb2RlKSB7CiAgICAgaWYgKG1TZWVrU3luY1BvaW50cyA9PSBOVUxMIHx8IG1TZWVrU3luY1BvaW50cy0+aXNFbXB0eSgpKSB7CiAgICAgICAgIEFMT0dXKCJObyBzeW5jIHBvaW50IHRvIHNlZWsgdG8uIik7CiAgICAgICAgIC8vIC4uLiBhbmQgdGhlcmVmb3JlIHdlIGhhdmUgbm90aGluZyB1c2VmdWwgdG8gZG8gaGVyZS4KQEAgLTUxMiwxOCArNjIzLDE4IEBACiAgICAgfQogCiAgICAgc3dpdGNoIChzZWVrTW9kZSkgewotICAgICAgICBjYXNlIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQzoKKyAgICAgICAgY2FzZSBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9uczo6U0VFS19ORVhUX1NZTkM6CiAgICAgICAgICAgICBpZiAoaW5kZXggPT0gbVNlZWtTeW5jUG9pbnRzLT5zaXplKCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiTmV4dCBzeW5jIG5vdCBmb3VuZDsgc3RhcnRpbmcgZnJvbSB0aGUgbGF0ZXN0IHN5bmMuIik7CiAgICAgICAgICAgICAgICAgLS1pbmRleDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQzoKLSAgICAgICAgY2FzZSBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUOgorICAgICAgICBjYXNlIE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQzoKKyAgICAgICAgY2FzZSBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUOgogICAgICAgICAgICAgQUxPR1coInNlZWtNb2RlIG5vdCBzdXBwb3J0ZWQ6ICVkOyBmYWxsaW5nIGJhY2sgdG8gUFJFVklPVVNfU1lOQyIsCiAgICAgICAgICAgICAgICAgICAgIHNlZWtNb2RlKTsKICAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwotICAgICAgICBjYXNlIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM6CisgICAgICAgIGNhc2UgTWVkaWFUcmFja0hlbHBlcjo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQzoKICAgICAgICAgICAgIGlmIChpbmRleCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coIlByZXZpb3VzIHN5bmMgbm90IGZvdW5kOyBzdGFydGluZyBmcm9tIHRoZSBlYXJsaWVzdCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAic3luYy4iKTsKQEAgLTY2Niw3ICs3NzcsNyBAQAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1ib29sIFNuaWZmTVBFRzJUUyhEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgeworYm9vbCBTbmlmZk1QRUcyVFMoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgewogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgKytpKSB7CiAgICAgICAgIGNoYXIgaGVhZGVyOwogICAgICAgICBpZiAoc291cmNlLT5yZWFkQXQoa1RTUGFja2V0U2l6ZSAqIGksICZoZWFkZXIsIDEpICE9IDEKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmgKaW5kZXggY2JkZDNjYi4uZTQyNWQyMyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmgKQEAgLTIwLDggKzIwLDggQEAKICNkZWZpbmUgTVBFRzJfVFNfRVhUUkFDVE9SX0hfCiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgpAQCAtMzQsMzAgKzM0LDMzIEBACiBzdHJ1Y3QgQU1lc3NhZ2U7CiBzdHJ1Y3QgQW5vdGhlclBhY2tldFNvdXJjZTsKIHN0cnVjdCBBVFNQYXJzZXI7Ci1jbGFzcyBEYXRhU291cmNlQmFzZTsKK3N0cnVjdCBDRGF0YVNvdXJjZTsKIHN0cnVjdCBNUEVHMlRTU291cmNlOwogY2xhc3MgU3RyaW5nODsKIAotc3RydWN0IE1QRUcyVFNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewotICAgIGV4cGxpY2l0IE1QRUcyVFNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CitzdHJ1Y3QgTVBFRzJUU0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciB7CisgICAgZXhwbGljaXQgTVBFRzJUU0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgdWludDhfdCogLypjYXNUb2tlbiovLCBzaXplX3QgLypzaXplKi8pIG92ZXJyaWRlOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgdWludDhfdCogLypjYXNUb2tlbiovLCBzaXplX3QgLypzaXplKi8pIG92ZXJyaWRlOwogCiAgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiTVBFRzJUU0V4dHJhY3RvciI7IH0KIAorcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk1QRUcyVFNFeHRyYWN0b3IoKTsKKwogcHJpdmF0ZToKICAgICBmcmllbmQgc3RydWN0IE1QRUcyVFNTb3VyY2U7CiAKICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwogCi0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogCiAgICAgc3A8QVRTUGFyc2VyPiBtUGFyc2VyOwogCkBAIC04MSwxMyArODQsMTMgQEAKICAgICAvLyBUcnkgdG8gZmVlZCBtb3JlIGRhdGEgZnJvbSBzb3VyY2UgdG8gcGFyc2VyLgogICAgIC8vIHxpc0luaXR8IG1lYW5zIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluc2lkZSBpbml0KCkuIFRoaXMgaXMgYSBzaWduYWwgdG8KICAgICAvLyBzYXZlIFN5bmNFdmVudCBzbyB0aGF0IGluaXQoKSBjYW4gYWRkIFN5bmNQb2ludCBhZnRlciBpdCB1cGRhdGVzIHxtU291cmNlSW1wbHN8LgotICAgIC8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBPSyBpZiBleHBlY3RlZCBhbW91bnQgb2YgZGF0YSBpcyBmZWQgZnJvbSBEYXRhU291cmNlQmFzZSB0bworICAgIC8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBPSyBpZiBleHBlY3RlZCBhbW91bnQgb2YgZGF0YSBpcyBmZWQgZnJvbSBEYXRhU291cmNlSGVscGVyIHRvCiAgICAgLy8gcGFyc2VyIGFuZCBpcyBzdWNjZXNzZnVsbHkgcGFyc2VkLiBPdGhlcndpc2UsIHZhcmlvdXMgZXJyb3IgY29kZXMgY291bGQgYmUKLSAgICAvLyByZXR1cm5lZCwgZS5nLiwgRVJST1JfRU5EX09GX1NUUkVBTSwgb3Igbm8gZGF0YSBhdmFpbGFsYmUgZnJvbSBEYXRhU291cmNlQmFzZSwgb3IKKyAgICAvLyByZXR1cm5lZCwgZS5nLiwgRVJST1JfRU5EX09GX1NUUkVBTSwgb3Igbm8gZGF0YSBhdmFpbGFsYmUgZnJvbSBEYXRhU291cmNlSGVscGVyLCBvcgogICAgIC8vIHRoZSBkYXRhIGhhcyBzeW50YXggZXJyb3IgZHVyaW5nIHBhcnNpbmcsIGV0Yy4KICAgICBzdGF0dXNfdCBmZWVkTW9yZShib29sIGlzSW5pdCA9IGZhbHNlKTsKICAgICBzdGF0dXNfdCBzZWVrKGludDY0X3Qgc2Vla1RpbWVVcywKLSAgICAgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUmIHNlZWtNb2RlKTsKKyAgICAgICAgICAgIGNvbnN0IE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSYgc2Vla01vZGUpOwogICAgIHN0YXR1c190IHF1ZXVlRGlzY29udGludWl0eUZvclNlZWsoaW50NjRfdCBhY3R1YWxTZWVrVGltZVVzKTsKICAgICBzdGF0dXNfdCBzZWVrQmV5b25kKGludDY0X3Qgc2Vla1RpbWVVcyk7CiAKQEAgLTEwMSw3ICsxMDQsNyBAQAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1QRUcyVFNFeHRyYWN0b3IpOwogfTsKIAotYm9vbCBTbmlmZk1QRUcyVFMoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpOworYm9vbCBTbmlmZk1QRUcyVFMoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSk7CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvb2dnL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL29nZy9BbmRyb2lkLmJwCmluZGV4IGYzZDI3OTQuLjYwNGVjNTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvb2dnL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvQW5kcm9pZC5icApAQCAtNywxMyArNywxOCBAQAogICAgICAgICAiZXh0ZXJuYWwvdHJlbW9sbyIsCiAgICAgXSwKIAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb19zeXN0ZW1faGVhZGVycyIsCisgICAgXSwKKwogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGlibWVkaWFuZGsiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYnZvcmJpc2lkZWMiLAogICAgIF0sCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL29nZy9PZ2dFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvT2dnRXh0cmFjdG9yLmNwcAppbmRleCBiMmZlNjljLi42ZWZiZmVlIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL29nZy9PZ2dFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5jcHAKQEAgLTIxLDE5ICsyMSwxNyBAQAogI2luY2x1ZGUgIk9nZ0V4dHJhY3Rvci5oIgogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL0V4dHJhY3RvclV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgotI2luY2x1ZGUgPG1lZGlhL1ZvcmJpc0NvbW1lbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiBleHRlcm4gIkMiIHsKQEAgLTQ3LDE2ICs0NSwxNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBPZ2dTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFjayB7CitzdHJ1Y3QgT2dnU291cmNlIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogICAgIGV4cGxpY2l0IE9nZ1NvdXJjZShPZ2dFeHRyYWN0b3IgKmV4dHJhY3Rvcik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICopOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0b3AoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk9nZ1NvdXJjZSgpOwpAQCAtNzEsMjggKzY5LDMwIEBACiAKIHN0cnVjdCBNeU9nZ0V4dHJhY3RvciB7CiAgICAgTXlPZ2dFeHRyYWN0b3IoCi0gICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAogICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZVR5cGUsCiAgICAgICAgICAgICBzaXplX3QgbnVtSGVhZGVycywKICAgICAgICAgICAgIGludDY0X3Qgc2Vla1ByZVJvbGxVcyk7CiAgICAgdmlydHVhbCB+TXlPZ2dFeHRyYWN0b3IoKTsKIAotICAgIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJikgY29uc3Q7CisgICAgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqKSBjb25zdDsKIAogICAgIC8vIFJldHVybnMgYW4gYXBwcm94aW1hdGUgYml0cmF0ZSBpbiBiaXRzIHBlciBzZWNvbmQuCiAgICAgdmlydHVhbCB1aW50NjRfdCBhcHByb3hCaXRyYXRlKCkgY29uc3QgPSAwOwogCiAgICAgc3RhdHVzX3Qgc2Vla1RvVGltZShpbnQ2NF90IHRpbWVVcyk7CiAgICAgc3RhdHVzX3Qgc2Vla1RvT2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlcikgPSAwOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIpID0gMDsKIAogICAgIHN0YXR1c190IGluaXQoKTsKIAotICAgIHN0YXR1c190IGdldEZpbGVNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICAgICAgbWV0YSA9IG1GaWxlTWV0YTsKLSAgICAgICAgcmV0dXJuIE9LOworICAgIG1lZGlhX3N0YXR1c190IGdldEZpbGVNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpIHsKKyAgICAgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1GaWxlTWV0YSk7CiAgICAgfQogCisgICAgdm9pZCBzZXRCdWZmZXJHcm91cChNZWRpYUJ1ZmZlckdyb3VwSGVscGVyICpncm91cCkgeworICAgICAgICBtQnVmZmVyR3JvdXAgPSBncm91cDsKKyAgICB9CiBwcm90ZWN0ZWQ6CiAgICAgc3RydWN0IFBhZ2UgewogICAgICAgICB1aW50NjRfdCBtR3JhbnVsZVBvc2l0aW9uOwpAQCAtMTEwLDcgKzExMCw4IEBACiAgICAgICAgIGludDY0X3QgbVRpbWVVczsKICAgICB9OwogCi0gICAgRGF0YVNvdXJjZUJhc2UgKm1Tb3VyY2U7CisgICAgTWVkaWFCdWZmZXJHcm91cEhlbHBlciAqbUJ1ZmZlckdyb3VwOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1Tb3VyY2U7CiAgICAgb2ZmNjRfdCBtT2Zmc2V0OwogICAgIFBhZ2UgbUN1cnJlbnRQYWdlOwogICAgIHVpbnQ2NF90IG1DdXJHcmFudWxlUG9zaXRpb247CkBAIC0xMjksMTEgKzEzMCwxMyBAQAogICAgIHZvcmJpc19pbmZvIG1WaTsKICAgICB2b3JiaXNfY29tbWVudCBtVmM7CiAKLSAgICBNZXRhRGF0YUJhc2UgbU1ldGE7Ci0gICAgTWV0YURhdGFCYXNlIG1GaWxlTWV0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1NZXRhOworICAgIEFNZWRpYUZvcm1hdCAqbUZpbGVNZXRhOwogCiAgICAgVmVjdG9yPFRPQ0VudHJ5PiBtVGFibGVPZkNvbnRlbnRzOwogCisgICAgaW50MzJfdCBtSGFwdGljQ2hhbm5lbENvdW50OworCiAgICAgc3NpemVfdCByZWFkUGFnZShvZmY2NF90IG9mZnNldCwgUGFnZSAqcGFnZSk7CiAgICAgc3RhdHVzX3QgZmluZE5leHRQYWdlKG9mZjY0X3Qgc3RhcnRPZmZzZXQsIG9mZjY0X3QgKnBhZ2VPZmZzZXQpOwogCkBAIC0xNDYsNyArMTQ5LDcgQEAKICAgICAvLyAxIC0gYml0c3RyZWFtIGlkZW50aWZpY2F0aW9uIGhlYWRlcgogICAgIC8vIDMgLSBjb21tZW50IGhlYWRlcgogICAgIC8vIDUgLSBjb2RlYyBzZXR1cCBoZWFkZXIgKFZvcmJpcyBvbmx5KQotICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyLCB1aW50OF90IHR5cGUpID0gMDsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyLCB1aW50OF90IHR5cGUpID0gMDsKIAogICAgIC8vIFJlYWQgdGhlIG5leHQgb2dnIHBhY2tldCBmcm9tIHRoZSB1bmRlcmx5aW5nIGRhdGEgc291cmNlOyBvcHRpb25hbGx5CiAgICAgLy8gY2FsY3VsYXRlIHRoZSB0aW1lc3RhbXAgZm9yIHRoZSBvdXRwdXQgcGFja2V0IHdoaWxzdCBwcmV0ZW5kaW5nCkBAIC0xNTQsOSArMTU3LDkgQEAKICAgICAvLwogICAgIC8vICpidWZmZXIgaXMgTlVMTCdlZCBvdXQgaW1tZWRpYXRlbHkgdXBvbiBlbnRyeSwgYW5kIGlmIHN1Y2Nlc3NmdWwgYSBuZXcgYnVmZmVyIGlzIGFsbG9jYXRlZDsKICAgICAvLyBjbGllbnRzIGFyZSByZXNwb25zaWJsZSBmb3IgcmVsZWFzaW5nIHRoZSBvcmlnaW5hbCBidWZmZXIuCi0gICAgc3RhdHVzX3QgX3JlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgYm9vbCBjYWxjVm9yYmlzVGltZXN0YW1wKTsKKyAgICBtZWRpYV9zdGF0dXNfdCBfcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGJvb2wgY2FsY1ZvcmJpc1RpbWVzdGFtcCk7CiAKLSAgICBpbnQzMl90IGdldFBhY2tldEJsb2NrU2l6ZShNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7CisgICAgaW50MzJfdCBnZXRQYWNrZXRCbG9ja1NpemUoTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcik7CiAKICAgICB2b2lkIHBhcnNlRmlsZU1ldGFEYXRhKCk7CiAKQEAgLTE2NCwxMiArMTY3LDE0IEBACiAKICAgICB2b2lkIGJ1aWxkVGFibGVPZkNvbnRlbnRzKCk7CiAKKyAgICB2b2lkIHNldENoYW5uZWxNYXNrKGludCBjaGFubmVsQ291bnQpOworCiAgICAgTXlPZ2dFeHRyYWN0b3IoY29uc3QgTXlPZ2dFeHRyYWN0b3IgJik7CiAgICAgTXlPZ2dFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBNeU9nZ0V4dHJhY3RvciAmKTsKIH07CiAKIHN0cnVjdCBNeVZvcmJpc0V4dHJhY3RvciA6IHB1YmxpYyBNeU9nZ0V4dHJhY3RvciB7Ci0gICAgZXhwbGljaXQgTXlWb3JiaXNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKKyAgICBleHBsaWNpdCBNeVZvcmJpc0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgICAgIDogTXlPZ2dFeHRyYWN0b3Ioc291cmNlLAogICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywKICAgICAgICAgICAgICAgICAvKiBudW1IZWFkZXJzICovIDMsCkBAIC0xNzgsNyArMTgzLDcgQEAKIAogICAgIHZpcnR1YWwgdWludDY0X3QgYXBwcm94Qml0cmF0ZSgpIGNvbnN0OwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIpIHsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyKSB7CiAgICAgICAgIHJldHVybiBfcmVhZE5leHRQYWNrZXQoYnVmZmVyLCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi8gdHJ1ZSk7CiAgICAgfQogCkBAIC0xOTAsMTQgKzE5NSwxNCBAQAogICAgICAgICByZXR1cm4gZ3JhbnVsZVBvcyAqIDEwMDAwMDBsbCAvIG1WaS5yYXRlOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyLCB1aW50OF90IHR5cGUpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIsIHVpbnQ4X3QgdHlwZSk7CiB9OwogCiBzdHJ1Y3QgTXlPcHVzRXh0cmFjdG9yIDogcHVibGljIE15T2dnRXh0cmFjdG9yIHsKICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrT3B1c1NhbXBsZVJhdGUgPSA0ODAwMDsKICAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrT3B1c1NlZWtQcmVSb2xsVXMgPSA4MDAwMDsgLy8gODAgbXMKIAotICAgIGV4cGxpY2l0IE15T3B1c0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorICAgIGV4cGxpY2l0IE15T3B1c0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgICAgIDogTXlPZ2dFeHRyYWN0b3Ioc291cmNlLCBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTLCAvKm51bUhlYWRlcnMqLyAyLCBrT3B1c1NlZWtQcmVSb2xsVXMpLAogICAgICAgICAgIG1DaGFubmVsQ291bnQoMCksCiAgICAgICAgICAgbUNvZGVjRGVsYXkoMCksCkBAIC0yMDgsMTYgKzIxMywxNiBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlcik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlcik7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIGludDY0X3QgZ2V0VGltZVVzT2ZHcmFudWxlKHVpbnQ2NF90IGdyYW51bGVQb3MpIGNvbnN0OwotICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyLCB1aW50OF90IHR5cGUpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIsIHVpbnQ4X3QgdHlwZSk7CiAKIHByaXZhdGU6Ci0gICAgc3RhdHVzX3QgdmVyaWZ5T3B1c0hlYWRlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7Ci0gICAgc3RhdHVzX3QgdmVyaWZ5T3B1c0NvbW1lbnRzKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKTsKLSAgICB1aW50MzJfdCBnZXROdW1TYW1wbGVzSW5QYWNrZXQoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIGNvbnN0OworICAgIG1lZGlhX3N0YXR1c190IHZlcmlmeU9wdXNIZWFkZXIoTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcik7CisgICAgbWVkaWFfc3RhdHVzX3QgdmVyaWZ5T3B1c0NvbW1lbnRzKE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIpOworICAgIHVpbnQzMl90IGdldE51bVNhbXBsZXNJblBhY2tldChNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyKSBjb25zdDsKIAogICAgIHVpbnQ4X3QgbUNoYW5uZWxDb3VudDsKICAgICB1aW50MTZfdCBtQ29kZWNEZWxheTsKQEAgLTIzNywyOCArMjQyLDMwIEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBPZ2dTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKK21lZGlhX3N0YXR1c190IE9nZ1NvdXJjZTo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgewogICAgIHJldHVybiBtRXh0cmFjdG9yLT5tSW1wbC0+Z2V0Rm9ybWF0KG1ldGEpOwogfQogCi1zdGF0dXNfdCBPZ2dTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqIC8qIHBhcmFtcyAqLykgeworbWVkaWFfc3RhdHVzX3QgT2dnU291cmNlOjpzdGFydCgpIHsKICAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLQorICAgIC8vIGluaXRpYWxpemUgYnVmZmVyIGdyb3VwIHdpdGggYSBzaW5nbGUgc21hbGwgYnVmZmVyLCBidXQgYSBnZW5lcm91cyB1cHBlciBsaW1pdAorICAgIG1CdWZmZXJHcm91cC0+aW5pdCgxIC8qIG51bWJlciBvZiBidWZmZXJzICovLCAxMjggLyogc2l6ZSAqLywgNjQgLyogbWF4IG51bWJlciBvZiBidWZmZXJzICovKTsKKyAgICBtRXh0cmFjdG9yLT5tSW1wbC0+c2V0QnVmZmVyR3JvdXAobUJ1ZmZlckdyb3VwKTsKICAgICBtU3RhcnRlZCA9IHRydWU7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgT2dnU291cmNlOjpzdG9wKCkgeworbWVkaWFfc3RhdHVzX3QgT2dnU291cmNlOjpzdG9wKCkgewogICAgIG1TdGFydGVkID0gZmFsc2U7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgT2dnU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CittZWRpYV9zdGF0dXNfdCBPZ2dTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgICpvdXQgPSBOVUxMOwogCiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwpAQCAtMjY2LDQxICsyNzMsNDMgQEAKICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgewogICAgICAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5tSW1wbC0+c2Vla1RvVGltZShzZWVrVGltZVVzKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfQogICAgIH0KIAotICAgIE1lZGlhQnVmZmVyQmFzZSAqcGFja2V0OwotICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPm1JbXBsLT5yZWFkTmV4dFBhY2tldCgmcGFja2V0KTsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqcGFja2V0OworICAgIG1lZGlhX3N0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPm1JbXBsLT5yZWFkTmV4dFBhY2tldCgmcGFja2V0KTsKIAotICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICBpZiAoZXJyICE9IEFNRURJQV9PSykgewogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAorICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IHBhY2tldC0+bWV0YV9kYXRhKCk7CiAjaWYgMAogICAgIGludDY0X3QgdGltZVVzOwotICAgIGlmIChwYWNrZXQtPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpIHsKKyAgICBpZiAoQU1lZGlhRm9ybWF0X2ZpbmRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIHRpbWVTdGFtcFVzKSkgewogICAgICAgICBBTE9HSSgiZm91bmQgdGltZSA9ICVsbGQgdXMiLCB0aW1lVXMpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dJKCJOTyB0aW1lIik7CiAgICAgfQogI2VuZGlmCiAKLSAgICBwYWNrZXQtPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAKICAgICAqb3V0ID0gcGFja2V0OwotCi0gICAgcmV0dXJuIE9LOworICAgIEFMT0dWKCJyZXR1cm5pbmcgYnVmZmVyICVwIiwgcGFja2V0KTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBNeU9nZ0V4dHJhY3Rvcjo6TXlPZ2dFeHRyYWN0b3IoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwKICAgICAgICAgY29uc3QgY2hhciAqbWltZVR5cGUsCiAgICAgICAgIHNpemVfdCBudW1IZWFkZXJzLAogICAgICAgICBpbnQ2NF90IHNlZWtQcmVSb2xsVXMpCi0gICAgOiBtU291cmNlKHNvdXJjZSksCisgICAgOiBtQnVmZmVyR3JvdXAoTlVMTCksCisgICAgICBtU291cmNlKHNvdXJjZSksCiAgICAgICBtT2Zmc2V0KDApLAogICAgICAgbUN1ckdyYW51bGVQb3NpdGlvbigwKSwKICAgICAgIG1QcmV2R3JhbnVsZVBvc2l0aW9uKDApLApAQCAtMzExLDIxICszMjAsMjUgQEAKICAgICAgIG1NaW1lVHlwZShtaW1lVHlwZSksCiAgICAgICBtTnVtSGVhZGVycyhudW1IZWFkZXJzKSwKICAgICAgIG1TZWVrUHJlUm9sbFVzKHNlZWtQcmVSb2xsVXMpLAotICAgICAgbUZpcnN0RGF0YU9mZnNldCgtMSkgeworICAgICAgbUZpcnN0RGF0YU9mZnNldCgtMSksCisgICAgICBtSGFwdGljQ2hhbm5lbENvdW50KDApIHsKICAgICBtQ3VycmVudFBhZ2UubU51bVNlZ21lbnRzID0gMDsKIAogICAgIHZvcmJpc19pbmZvX2luaXQoJm1WaSk7CiAgICAgdm9yYmlzX2NvbW1lbnRfaW5pdCgmbVZjKTsKKyAgICBtTWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBtRmlsZU1ldGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CiB9CiAKIE15T2dnRXh0cmFjdG9yOjp+TXlPZ2dFeHRyYWN0b3IoKSB7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtRmlsZU1ldGEpOworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobU1ldGEpOwogICAgIHZvcmJpc19jb21tZW50X2NsZWFyKCZtVmMpOwogICAgIHZvcmJpc19pbmZvX2NsZWFyKCZtVmkpOwogfQogCi1zdGF0dXNfdCBNeU9nZ0V4dHJhY3Rvcjo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkgY29uc3QgewotICAgIG1ldGEgPSBtTWV0YTsKLSAgICByZXR1cm4gT0s7CittZWRpYV9zdGF0dXNfdCBNeU9nZ0V4dHJhY3Rvcjo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgY29uc3QgeworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtTWV0YSk7CiB9CiAKIHN0YXR1c190IE15T2dnRXh0cmFjdG9yOjpmaW5kTmV4dFBhZ2UoCkBAIC01MDUsMjcgKzUxOCwyNyBAQAogICAgICAgICBpZiAobiA8IDApIHsKICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICB9IGVsc2UgaWYgKG4gPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKG1lbWNtcChoZWFkZXIsICJPZ2dTIiwgNCkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCiAgICAgaWYgKGhlYWRlcls0XSAhPSAwKSB7CiAgICAgICAgIC8vIFdyb25nIHZlcnNpb24uCiAKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0KIAogICAgIHBhZ2UtPm1GbGFncyA9IGhlYWRlcls1XTsKIAogICAgIGlmIChwYWdlLT5tRmxhZ3MgJiB+NykgewogICAgICAgICAvLyBPbmx5IGJpdHMgMC0yIGFyZSBkZWZpbmVkIGluIHZlcnNpb24gMC4KLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCiAgICAgcGFnZS0+bUdyYW51bGVQb3NpdGlvbiA9IFU2NExFX0FUKCZoZWFkZXJbNl0pOwpAQCAtNTQyLDcgKzU1NSw3IEBACiAgICAgaWYgKG1Tb3VyY2UtPnJlYWRBdCgKICAgICAgICAgICAgICAgICBvZmZzZXQgKyBzaXplb2YoaGVhZGVyKSwgcGFnZS0+bUxhY2UsIHBhZ2UtPm1OdW1TZWdtZW50cykKICAgICAgICAgICAgIDwgKHNzaXplX3QpcGFnZS0+bU51bVNlZ21lbnRzKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICB9CiAKICAgICBzaXplX3QgdG90YWxTaXplID0gMDs7CkBAIC01NjUsMjIgKzU3OCwyMiBAQAogICAgIHJldHVybiBzaXplb2YoaGVhZGVyKSArIHBhZ2UtPm1OdW1TZWdtZW50cyArIHRvdGFsU2l6ZTsKIH0KIAotc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjpyZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckJhc2UgKipvdXQpIHsKK21lZGlhX3N0YXR1c190IE15T3B1c0V4dHJhY3Rvcjo6cmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJIZWxwZXIgKipvdXQpIHsKICAgICBpZiAobU9mZnNldCA8PSBtRmlyc3REYXRhT2Zmc2V0ICYmIG1TdGFydEdyYW51bGVQb3NpdGlvbiA8IDApIHsKICAgICAgICAgLy8gVGhlIGZpcnN0IHNhbXBsZSBtaWdodCBub3Qgc3RhcnQgYXQgdGltZSAwOyBmaW5kIG91dCB3aGVyZSBieSBzdWJ0cmFjdGluZwogICAgICAgICAvLyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgb24gdGhlIGZpcnN0IHBhZ2UgZnJvbSB0aGUgZ3JhbnVsZSBwb3NpdGlvbgogICAgICAgICAvLyAocG9zaXRpb24gb2YgbGFzdCBjb21wbGV0ZSBzYW1wbGUpIG9mIHRoZSBmaXJzdCBwYWdlLiBUaGlzIGhhcHBlbnMKICAgICAgICAgLy8gdGhlIGZpcnN0IHRpbWUgYmVmb3JlIHdlIGF0dGVtcHQgdG8gcmVhZCBhIHBhY2tldCBmcm9tIHRoZSBmaXJzdCBwYWdlLgotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKm1CdWY7CisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICptQnVmOwogICAgICAgICB1aW50MzJfdCBudW1TYW1wbGVzID0gMDsKICAgICAgICAgdWludDY0X3QgY3VyR3JhbnVsZVBvc2l0aW9uID0gMDsKICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IF9yZWFkTmV4dFBhY2tldCgmbUJ1ZiwgLyogY2FsY1ZvcmJpc1RpbWVzdGFtcCA9ICovZmFsc2UpOwotICAgICAgICAgICAgaWYgKGVyciAhPSBPSyAmJiBlcnIgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gX3JlYWROZXh0UGFja2V0KCZtQnVmLCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi9mYWxzZSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEFNRURJQV9PSyAmJiBlcnIgIT0gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU0pIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gRmlyc3QgdHdvIHBhZ2VzIGFyZSBoZWFkZXIgcGFnZXMuCi0gICAgICAgICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0gfHwgbUN1cnJlbnRQYWdlLm1QYWdlTm8gPiAyKSB7CisgICAgICAgICAgICBpZiAoZXJyID09IEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNIHx8IG1DdXJyZW50UGFnZS5tUGFnZU5vID4gMikgewogICAgICAgICAgICAgICAgIGlmIChtQnVmICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgbUJ1Zi0+cmVsZWFzZSgpOwogICAgICAgICAgICAgICAgICAgICBtQnVmID0gTlVMTDsKQEAgLTYwMSwzMiArNjE0LDMzIEBACiAgICAgICAgIHNlZWtUb09mZnNldCgwKTsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBlcnIgPSBfcmVhZE5leHRQYWNrZXQob3V0LCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi9mYWxzZSk7Ci0gICAgaWYgKGVyciAhPSBPSykgeworICAgIG1lZGlhX3N0YXR1c190IGVyciA9IF9yZWFkTmV4dFBhY2tldChvdXQsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqL2ZhbHNlKTsKKyAgICBpZiAoZXJyICE9IEFNRURJQV9PSykgewogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAogICAgIGludDMyX3QgY3VycmVudFBhZ2VTYW1wbGVzOwogICAgIC8vIENhbGN1bGF0ZSB0aW1lc3RhbXBzIGJ5IGFjY3VtdWxhdGluZyBkdXJhdGlvbnMgc3RhcnRpbmcgZnJvbSB0aGUgZmlyc3Qgc2FtcGxlIG9mIGEgcGFnZTsKICAgICAvLyBXZSBhc3N1bWUgdGhhdCB3ZSBvbmx5IHNlZWsgdG8gcGFnZSBib3VuZGFyaWVzLgotICAgIGlmICgoKm91dCktPm1ldGFfZGF0YSgpLmZpbmRJbnQzMihrS2V5VmFsaWRTYW1wbGVzLCAmY3VycmVudFBhZ2VTYW1wbGVzKSkgeworICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9ICgqb3V0KS0+bWV0YV9kYXRhKCk7CisgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1ZBTElEX1NBTVBMRVMsICZjdXJyZW50UGFnZVNhbXBsZXMpKSB7CiAgICAgICAgIC8vIGZpcnN0IHBhY2tldCBpbiBwYWdlCiAgICAgICAgIGlmIChtT2Zmc2V0ID09IG1GaXJzdERhdGFPZmZzZXQpIHsKICAgICAgICAgICAgIGN1cnJlbnRQYWdlU2FtcGxlcyAtPSBtU3RhcnRHcmFudWxlUG9zaXRpb247Ci0gICAgICAgICAgICAoKm91dCktPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlWYWxpZFNhbXBsZXMsIGN1cnJlbnRQYWdlU2FtcGxlcyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9WQUxJRF9TQU1QTEVTLCBjdXJyZW50UGFnZVNhbXBsZXMpOwogICAgICAgICB9CiAgICAgICAgIG1DdXJHcmFudWxlUG9zaXRpb24gPSBtQ3VycmVudFBhZ2UubUdyYW51bGVQb3NpdGlvbiAtIGN1cnJlbnRQYWdlU2FtcGxlczsKICAgICB9CiAKICAgICBpbnQ2NF90IHRpbWVVcyA9IGdldFRpbWVVc09mR3JhbnVsZShtQ3VyR3JhbnVsZVBvc2l0aW9uKTsKLSAgICAoKm91dCktPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIHRpbWVVcyk7CiAKICAgICB1aW50MzJfdCBmcmFtZXMgPSBnZXROdW1TYW1wbGVzSW5QYWNrZXQoKm91dCk7CiAgICAgbUN1ckdyYW51bGVQb3NpdGlvbiArPSBmcmFtZXM7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXVpbnQzMl90IE15T3B1c0V4dHJhY3Rvcjo6Z2V0TnVtU2FtcGxlc0luUGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSBjb25zdCB7Cit1aW50MzJfdCBNeU9wdXNFeHRyYWN0b3I6OmdldE51bVNhbXBsZXNJblBhY2tldChNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyKSBjb25zdCB7CiAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMIHx8IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPCAxKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTY3MiwxMCArNjg2LDY2IEBACiAgICAgcmV0dXJuIG51bVNhbXBsZXM7CiB9CiAKLXN0YXR1c190IE15T2dnRXh0cmFjdG9yOjpfcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBib29sIGNhbGNWb3JiaXNUaW1lc3RhbXApIHsKKy8qCisgKiBiYXNpYyBtZWRpYWJ1ZmZlciBpbXBsZW1lbnRhdGlvbiB1c2VkIGR1cmluZyBpbml0aWFsIHBhcnNpbmcgb2YgdGhlCisgKiBoZWFkZXIgcGFja2V0cywgd2hpY2ggaGFwcGVucyBiZWZvcmUgd2UgaGF2ZSBhIGJ1ZmZlciBncm91cAorICovCitjbGFzcyBTdGFuZEFsb25lTWVkaWFCdWZmZXIgOiBwdWJsaWMgTWVkaWFCdWZmZXJIZWxwZXIgeworcHJpdmF0ZToKKyAgICB2b2lkICptRGF0YTsKKyAgICBzaXplX3QgbVNpemU7CisgICAgc2l6ZV90IG1PZmZzZXQ7CisgICAgc2l6ZV90IG1MZW5ndGg7CisgICAgQU1lZGlhRm9ybWF0ICptRm9ybWF0OworcHVibGljOgorICAgIFN0YW5kQWxvbmVNZWRpYUJ1ZmZlcihzaXplX3Qgc2l6ZSkgOiBNZWRpYUJ1ZmZlckhlbHBlcihOVUxMKSB7CisgICAgICAgIG1TaXplID0gc2l6ZTsKKyAgICAgICAgbURhdGEgPSBtYWxsb2MobVNpemUpOworICAgICAgICBtT2Zmc2V0ID0gMDsKKyAgICAgICAgbUxlbmd0aCA9IG1TaXplOworICAgICAgICBtRm9ybWF0ID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgICAgICBBTE9HVigiY3JlYXRlZCBzdGFuZGFsb25lIG1lZGlhIGJ1ZmZlciAlcCBvZiBzaXplICV6dSIsIHRoaXMsIG1TaXplKTsKKyAgICB9CisKKyAgICB+U3RhbmRBbG9uZU1lZGlhQnVmZmVyKCkgb3ZlcnJpZGUgeworICAgICAgICBmcmVlKG1EYXRhKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtRm9ybWF0KTsKKyAgICAgICAgQUxPR1YoImRlbGV0ZWQgc3RhbmRhbG9uZSBtZWRpYSBidWZmZXIgJXAgb2Ygc2l6ZSAlenUiLCB0aGlzLCBtU2l6ZSk7CisgICAgfQorCisgICAgdm9pZCByZWxlYXNlKCkgb3ZlcnJpZGUgeworICAgICAgICBkZWxldGUgdGhpczsKKyAgICB9CisKKyAgICB2b2lkKiBkYXRhKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbURhdGE7CisgICAgfQorCisgICAgc2l6ZV90IHNpemUoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtU2l6ZTsKKyAgICB9CisKKyAgICBzaXplX3QgcmFuZ2Vfb2Zmc2V0KCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbU9mZnNldDsKKyAgICB9CisKKyAgICBzaXplX3QgcmFuZ2VfbGVuZ3RoKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUxlbmd0aDsKKyAgICB9CisKKyAgICB2b2lkIHNldF9yYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoKSBvdmVycmlkZSB7CisgICAgICAgIG1PZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgIG1MZW5ndGggPSBsZW5ndGg7CisgICAgfQorICAgIEFNZWRpYUZvcm1hdCAqbWV0YV9kYXRhKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUZvcm1hdDsKKyAgICB9Cit9OworCittZWRpYV9zdGF0dXNfdCBNeU9nZ0V4dHJhY3Rvcjo6X3JlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBib29sIGNhbGNWb3JiaXNUaW1lc3RhbXApIHsKICAgICAqb3V0ID0gTlVMTDsKIAotICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyID0gTlVMTDsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyID0gTlVMTDsKICAgICBpbnQ2NF90IHRpbWVVcyA9IC0xOwogCiAgICAgZm9yICg7OykgewpAQCAtNzA5LDE2ICs3NzksMjMgQEAKICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEFMT0dFKCJiLzM2NTkyMjAyIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqdG1wID0gTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUoZnVsbFNpemUpOworICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKnRtcDsKKyAgICAgICAgICAgIGlmIChtQnVmZmVyR3JvdXApIHsKKyAgICAgICAgICAgICAgICBtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZ0bXAsIGZhbHNlLCBmdWxsU2l6ZSk7CisgICAgICAgICAgICAgICAgQUxPR1YoImFjcXVpcmVkIGJ1ZmZlciAlcCBmcm9tIGdyb3VwIiwgdG1wKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdG1wID0gbmV3IFN0YW5kQWxvbmVNZWRpYUJ1ZmZlcihmdWxsU2l6ZSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodG1wID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEFMT0dFKCJiLzM2NTkyMjAyIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9jbGVhcih0bXAtPm1ldGFfZGF0YSgpKTsKICAgICAgICAgICAgIGlmIChidWZmZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIG1lbWNweSh0bXAtPmRhdGEoKSwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwogICAgICAgICAgICAgICAgIHRtcC0+c2V0X3JhbmdlKDAsIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwpAQCAtNzM3LDcgKzgxNCw3IEBACiAgICAgICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgQUxPR1YoImZhaWxlZCB0byByZWFkICV6dSBieXRlcyBhdCAlIzAxNmxseCwgZ290ICV6ZCBieXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXRTaXplLCAobG9uZyBsb25nKWRhdGFPZmZzZXQsIG4pOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCBmdWxsU2l6ZSk7CkBAIC03NDgsOCArODI1LDkgQEAKICAgICAgICAgICAgICAgICAvLyBXZSd2ZSBqdXN0IHJlYWQgdGhlIGVudGlyZSBwYWNrZXQuCiAKICAgICAgICAgICAgICAgICBpZiAobUZpcnN0UGFja2V0SW5QYWdlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleVZhbGlkU2FtcGxlcywgbUN1cnJlbnRQYWdlU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1ZBTElEX1NBTVBMRVMsIG1DdXJyZW50UGFnZVNhbXBsZXMpOwogICAgICAgICAgICAgICAgICAgICBtRmlyc3RQYWNrZXRJblBhZ2UgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTc3MCwxMSArODQ4LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFBhZ2UubVByZXZQYWNrZXRQb3MgKz0gYWN0dWFsQmxvY2tTaXplIC8gMjsKICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50UGFnZS5tUHJldlBhY2tldFNpemUgPSBjdXJCbG9ja1NpemU7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdGltZVVzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgKm91dCA9IGJ1ZmZlcjsKIAotICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX09LOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gsIHRoZSBidWZmZXIgbm93IGNvbnRhaW5zIHRoZSBzdGFydCBvZiB0aGUgcGFja2V0LgpAQCAtNzkzLDcgKzg3Miw3IEBACiAKICAgICAgICAgICAgIEFMT0dWKCJyZWFkUGFnZSByZXR1cm5lZCAlemQiLCBuKTsKIAotICAgICAgICAgICAgcmV0dXJuIG4gPCAwID8gbiA6IChzdGF0dXNfdClFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgcmV0dXJuIG4gPT0gRVJST1JfRU5EX09GX1NUUkVBTSA/IEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNIDogQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgIH0KIAogICAgICAgICAvLyBQcmV2ZW50IGEgaGFybWxlc3MgdW5zaWduZWQgaW50ZWdlciBvdmVyZmxvdyBieSBjbGFtcGluZyB0byAwCkBAIC04MTYsMzYgKzg5NSwzOCBAQAogICAgICAgICAgICAgICAgIC8vIGlzIGFscmVhZHkgY29tcGxldGUuCiAKICAgICAgICAgICAgICAgICBpZiAodGltZVVzID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdGltZVVzKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKAotICAgICAgICAgICAgICAgICAgICAgICAga0tleVZhbGlkU2FtcGxlcywgbUN1cnJlbnRQYWdlU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1ZBTElEX1NBTVBMRVMsIG1DdXJyZW50UGFnZVNhbXBsZXMpOwogICAgICAgICAgICAgICAgIG1GaXJzdFBhY2tldEluUGFnZSA9IGZhbHNlOwogCiAgICAgICAgICAgICAgICAgKm91dCA9IGJ1ZmZlcjsKIAotICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX09LOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQogCiBzdGF0dXNfdCBNeU9nZ0V4dHJhY3Rvcjo6aW5pdCgpIHsKLSAgICBtTWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbU1pbWVUeXBlKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIG1NaW1lVHlwZSk7CiAKLSAgICBzdGF0dXNfdCBlcnI7Ci0gICAgTWVkaWFCdWZmZXJCYXNlICpwYWNrZXQ7CisgICAgbWVkaWFfc3RhdHVzX3QgZXJyOworICAgIE1lZGlhQnVmZmVySGVscGVyICpwYWNrZXQ7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtSGVhZGVyczsgKytpKSB7CiAgICAgICAgIC8vIGlnbm9yZSB0aW1lc3RhbXAgZm9yIGNvbmZpZ3VyYXRpb24gcGFja2V0cwotICAgICAgICBpZiAoKGVyciA9IF9yZWFkTmV4dFBhY2tldCgmcGFja2V0LCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi8gZmFsc2UpKSAhPSBPSykgeworICAgICAgICBpZiAoKGVyciA9IF9yZWFkTmV4dFBhY2tldCgmcGFja2V0LCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi8gZmFsc2UpKSAhPSBBTUVESUFfT0spIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KICAgICAgICAgQUxPR1YoInJlYWQgcGFja2V0IG9mIHNpemUgJXp1XG4iLCBwYWNrZXQtPnJhbmdlX2xlbmd0aCgpKTsKICAgICAgICAgZXJyID0gdmVyaWZ5SGVhZGVyKHBhY2tldCwgLyogdHlwZSA9ICovIGkgKiAyICsgMSk7CiAgICAgICAgIHBhY2tldC0+cmVsZWFzZSgpOwogICAgICAgICBwYWNrZXQgPSBOVUxMOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIGlmIChlcnIgIT0gQU1FRElBX09LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgfQpAQCAtODY1LDEyICs5NDYsMTIgQEAKIAogICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSBnZXRUaW1lVXNPZkdyYW51bGUobGFzdEdyYW51bGVQb3NpdGlvbik7CiAKLSAgICAgICAgbU1ldGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvblVzKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCBkdXJhdGlvblVzKTsKIAogICAgICAgICBidWlsZFRhYmxlT2ZDb250ZW50cygpOwogICAgIH0KIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiB2b2lkIE15T2dnRXh0cmFjdG9yOjpidWlsZFRhYmxlT2ZDb250ZW50cygpIHsKQEAgLTkxMiw3ICs5OTMsNyBAQAogICAgIH0KIH0KIAotaW50MzJfdCBNeU9nZ0V4dHJhY3Rvcjo6Z2V0UGFja2V0QmxvY2tTaXplKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSB7CitpbnQzMl90IE15T2dnRXh0cmFjdG9yOjpnZXRQYWNrZXRCbG9ja1NpemUoTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcikgewogICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPQogICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKIApAQCAtOTUyLDcgKzEwMzMsNyBAQAogICAgIHJldHVybiBwY21TYW1wbGVQb3NpdGlvbiAqIDEwMDAwMDBsbCAvIGtPcHVzU2FtcGxlUmF0ZTsKIH0KIAotc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjp2ZXJpZnlIZWFkZXIoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIsIHVpbnQ4X3QgdHlwZSkgeworbWVkaWFfc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjp2ZXJpZnlIZWFkZXIoTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlciwgdWludDhfdCB0eXBlKSB7CiAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgIC8vIHRoZXJlIGFyZSBhY3R1YWxseSBubyBoZWFkZXIgdHlwZXMgZGVmaW5lZCBpbiB0aGUgT3B1cyBzcGVjOyB3ZSBjaG9vc2UgMSBhbmQgMyB0byBtZWFuCiAgICAgICAgIC8vIGhlYWRlciBhbmQgY29tbWVudHMgc3VjaCB0aGF0IHdlIGNhbiBzaGFyZSBjb2RlIHdpdGggTXlWb3JiaXNFeHRyYWN0b3IuCkBAIC05NjEsMTEgKzEwNDIsMTEgQEAKICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgcmV0dXJuIHZlcmlmeU9wdXNDb21tZW50cyhidWZmZXIpOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKICAgICB9CiB9CiAKLXN0YXR1c190IE15T3B1c0V4dHJhY3Rvcjo6dmVyaWZ5T3B1c0hlYWRlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgeworbWVkaWFfc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjp2ZXJpZnlPcHVzSGVhZGVyKE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIpIHsKICAgICBjb25zdCBzaXplX3Qga09wdXNIZWFkZXJTaXplID0gMTk7CiAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9CiAgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOwpAQCAtOTc1LDI5ICsxMDU2LDMxIEBACiAgICAgaWYgKHNpemUgPCBrT3B1c0hlYWRlclNpemUKICAgICAgICAgICAgIHx8IG1lbWNtcChkYXRhLCAiT3B1c0hlYWQiLCA4KQogICAgICAgICAgICAgfHwgLyogdmVyc2lvbiA9ICovIGRhdGFbOF0gIT0gMSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICBtQ2hhbm5lbENvdW50ID0gZGF0YVs5XTsKICAgICBtQ29kZWNEZWxheSA9IFUxNkxFX0FUKCZkYXRhWzEwXSk7CiAKLSAgICBtTWV0YS5zZXREYXRhKGtLZXlPcHVzSGVhZGVyLCAwLCBkYXRhLCBzaXplKTsKLSAgICBtTWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwga09wdXNTYW1wbGVSYXRlKTsKLSAgICBtTWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBtQ2hhbm5lbENvdW50KTsKLSAgICBtTWV0YS5zZXRJbnQ2NChrS2V5T3B1c1NlZWtQcmVSb2xsIC8qIG5zICovLCBrT3B1c1NlZWtQcmVSb2xsVXMgKiAxMDAwIC8qID0gODAgbXMqLyk7Ci0gICAgbU1ldGEuc2V0SW50NjQoa0tleU9wdXNDb2RlY0RlbGF5IC8qIG5zICovLAotICAgICAgICAgICAgbUNvZGVjRGVsYXkgLyogc2FtcGxlL3MgKi8gKiAxMDAwMDAwMDAwbGwgLyBrT3B1c1NhbXBsZVJhdGUpOworICAgIC8vIGtLZXlPcHVzSGVhZGVyIGlzIGNzZC0wCisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgZGF0YSwgc2l6ZSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBrT3B1c1NhbXBsZVJhdGUpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBtQ2hhbm5lbENvdW50KTsKKyAgICBpbnQ2NF90IGNvZGVjZGVsYXkgPSBtQ29kZWNEZWxheSAvKiBzYW1wbGUvcyAqLyAqIDEwMDAwMDAwMDBsbCAvIGtPcHVzU2FtcGxlUmF0ZTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8xLCAmY29kZWNkZWxheSwgc2l6ZW9mKGNvZGVjZGVsYXkpKTsKKyAgICBpbnQ2NF90IHByZXJvbGwgPSBrT3B1c1NlZWtQcmVSb2xsVXMgKiAxMDAwIC8qID0gODAgbXMqLzsKKyAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8yLCAmcHJlcm9sbCwgc2l6ZW9mKHByZXJvbGwpKTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnZlcmlmeU9wdXNDb21tZW50cyhNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgeworbWVkaWFfc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjp2ZXJpZnlPcHVzQ29tbWVudHMoTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcikgewogICAgIC8vIGFkZCBhcnRpZmljaWFsIGZyYW1pbmcgYml0IHNvIHdlIGNhbiByZXVzZSBfdm9yYmlzX3VucGFja19jb21tZW50CiAgICAgaW50MzJfdCBjb21tZW50U2l6ZSA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgKyAxOwogICAgIGF1dG8gdG1wID0gaGVhcGJ1ZmZlcjx1aW50OF90Pihjb21tZW50U2l6ZSk7CiAgICAgdWludDhfdCAqY29tbWVudERhdGEgPSB0bXAuZ2V0KCk7CiAgICAgaWYgKGNvbW1lbnREYXRhID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCiAgICAgbWVtY3B5KGNvbW1lbnREYXRhLApAQCAtMTAyNiwxNCArMTEwOSwxNCBAQAogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVhZGVyTGVuOyArK2kpIHsKICAgICAgICAgY2hhciBjaHIgPSBvZ2dwYWNrX3JlYWQoJmJpdHMsIDgpOwogICAgICAgICBpZiAoY2hyICE9IE9wdXNUYWdzW2ldKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpbnQzMl90IHZlbmRvckxlbiA9IG9nZ3BhY2tfcmVhZCgmYml0cywgMzIpOwogICAgIGZyYW1pbmdCaXRPZmZzZXQgKz0gNDsKICAgICBpZiAodmVuZG9yTGVuIDwgMCB8fCB2ZW5kb3JMZW4gPiBjb21tZW50U2l6ZSAtIDgpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogICAgIC8vIHNraXAgdmVuZG9yIHN0cmluZwogICAgIGZyYW1pbmdCaXRPZmZzZXQgKz0gdmVuZG9yTGVuOwpAQCAtMTA0NCwxMyArMTEyNywxMyBAQAogICAgIGludDMyX3QgbiA9IG9nZ3BhY2tfcmVhZCgmYml0cywgMzIpOwogICAgIGZyYW1pbmdCaXRPZmZzZXQgKz0gNDsKICAgICBpZiAobiA8IDAgfHwgbiA+ICgoY29tbWVudFNpemUgLSBvZ2dwYWNrX2J5dGVzKCZiaXRzKSkgPj4gMikpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgIGludDMyX3QgbGVuID0gb2dncGFja19yZWFkKCZiaXRzLCAzMik7CiAgICAgICAgIGZyYW1pbmdCaXRPZmZzZXQgKz0gNDsKICAgICAgICAgaWYgKGxlbiAgPCAwIHx8IGxlbiAgPiAoY29tbWVudFNpemUgLSBvZ2dwYWNrX2J5dGVzKCZiaXRzKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogICAgICAgICBmcmFtaW5nQml0T2Zmc2V0ICs9IGxlbjsKICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsZW47ICsraikgewpAQCAtMTA1OCw3ICsxMTQxLDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoZnJhbWluZ0JpdE9mZnNldCA8IDAgfHwgZnJhbWluZ0JpdE9mZnNldCA+PSBjb21tZW50U2l6ZSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAgICAgY29tbWVudERhdGFbZnJhbWluZ0JpdE9mZnNldF0gPSAxOwogCkBAIC0xMDc1LDIyICsxMTU4LDIzIEBACiAgICAgb2dncGFja19yZWFkaW5pdCgmYml0cywgJnJlZik7CiAgICAgaW50IGVyciA9IF92b3JiaXNfdW5wYWNrX2NvbW1lbnQoJm1WYywgJmJpdHMpOwogICAgIGlmICgwICE9IGVycikgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICBwYXJzZUZpbGVNZXRhRGF0YSgpOwotICAgIHJldHVybiBPSzsKKyAgICBzZXRDaGFubmVsTWFzayhtQ2hhbm5lbENvdW50KTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNeVZvcmJpc0V4dHJhY3Rvcjo6dmVyaWZ5SGVhZGVyKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciwgdWludDhfdCB0eXBlKSB7CittZWRpYV9zdGF0dXNfdCBNeVZvcmJpc0V4dHJhY3Rvcjo6dmVyaWZ5SGVhZGVyKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyLCB1aW50OF90IHR5cGUpIHsKICAgICBjb25zdCB1aW50OF90ICpkYXRhID0KICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CiAKICAgICBzaXplX3Qgc2l6ZSA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CiAKICAgICBpZiAoc2l6ZSA8IDcgfHwgZGF0YVswXSAhPSB0eXBlIHx8IG1lbWNtcCgmZGF0YVsxXSwgInZvcmJpcyIsIDYpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAogICAgIG9nZ19idWZmZXIgYnVmOwpAQCAtMTEwOSw3ICsxMTkzLDcgQEAKICAgICBvZ2dwYWNrX3JlYWRpbml0KCZiaXRzLCAmcmVmKTsKIAogICAgIGlmIChvZ2dwYWNrX3JlYWQoJmJpdHMsIDgpICE9IHR5cGUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgNjsgKytpKSB7CiAgICAgICAgIG9nZ3BhY2tfcmVhZCgmYml0cywgOCk7ICAvLyBza2lwICd2b3JiaXMnCkBAIC0xMTE5LDEzICsxMjAzLDEzIEBACiAgICAgICAgIGNhc2UgMToKICAgICAgICAgewogICAgICAgICAgICAgaWYgKDAgIT0gX3ZvcmJpc191bnBhY2tfaW5mbygmbVZpLCAmYml0cykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtTWV0YS5zZXREYXRhKGtLZXlWb3JiaXNJbmZvLCAwLCBkYXRhLCBzaXplKTsKLSAgICAgICAgICAgIG1NZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtVmkucmF0ZSk7Ci0gICAgICAgICAgICBtTWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBtVmkuY2hhbm5lbHMpOwotICAgICAgICAgICAgbU1ldGEuc2V0SW50MzIoa0tleUJpdFJhdGUsIG1WaS5iaXRyYXRlX25vbWluYWwpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIG1WaS5yYXRlKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBtVmkuY2hhbm5lbHMpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFLCBtVmkuYml0cmF0ZV9ub21pbmFsKTsKIAogICAgICAgICAgICAgQUxPR1YoImxvd2VyLWJpdHJhdGUgPSAlbGQiLCBtVmkuYml0cmF0ZV9sb3dlcik7CiAgICAgICAgICAgICBBTE9HVigidXBwZXItYml0cmF0ZSA9ICVsZCIsIG1WaS5iaXRyYXRlX3VwcGVyKTsKQEAgLTExNDAsNyArMTIyNCw3IEBACiAgICAgICAgICAgICBpZiAobVNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSkgPT0gT0spIHsKICAgICAgICAgICAgICAgICB1aW50NjRfdCBicHMgPSBhcHByb3hCaXRyYXRlKCk7CiAgICAgICAgICAgICAgICAgaWYgKGJwcyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgc2l6ZSAqIDgwMDAwMDBsbCAvIGJwcyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgc2l6ZSAqIDgwMDAwMDBsbCAvIGJwcyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CkBAIC0xMTQ5LDI1ICsxMjMzLDI2IEBACiAgICAgICAgIGNhc2UgMzoKICAgICAgICAgewogICAgICAgICAgICAgaWYgKDAgIT0gX3ZvcmJpc191bnBhY2tfY29tbWVudCgmbVZjLCAmYml0cykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBwYXJzZUZpbGVNZXRhRGF0YSgpOworICAgICAgICAgICAgc2V0Q2hhbm5lbE1hc2sobVZpLmNoYW5uZWxzKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSA1OgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoMCAhPSBfdm9yYmlzX3VucGFja19ib29rcygmbVZpLCAmYml0cykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtTWV0YS5zZXREYXRhKGtLZXlWb3JiaXNCb29rcywgMCwgZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8xLCBkYXRhLCBzaXplKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHVpbnQ2NF90IE15Vm9yYmlzRXh0cmFjdG9yOjphcHByb3hCaXRyYXRlKCkgY29uc3QgewpAQCAtMTE4MCwyMCArMTI2NSw0MyBAQAogCiAKIHZvaWQgTXlPZ2dFeHRyYWN0b3I6OnBhcnNlRmlsZU1ldGFEYXRhKCkgewotICAgIG1GaWxlTWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX09HRyk7CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX09HRyk7CiAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1WYy5jb21tZW50czsgKytpKSB7CiAgICAgICAgIGNvbnN0IGNoYXIgKmNvbW1lbnQgPSBtVmMudXNlcl9jb21tZW50c1tpXTsKICAgICAgICAgc2l6ZV90IGNvbW1lbnRMZW5ndGggPSBtVmMuY29tbWVudF9sZW5ndGhzW2ldOwotICAgICAgICBwYXJzZVZvcmJpc0NvbW1lbnQoJm1GaWxlTWV0YSwgY29tbWVudCwgY29tbWVudExlbmd0aCk7CisgICAgICAgIHBhcnNlVm9yYmlzQ29tbWVudChtRmlsZU1ldGEsIGNvbW1lbnQsIGNvbW1lbnRMZW5ndGgpOwogICAgICAgICAvL0FMT0dJKCJjb21tZW50ICMlZDogJyVzJyIsIGkgKyAxLCBtVmMudXNlcl9jb21tZW50c1tpXSk7CiAgICAgfQorCisgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKG1GaWxlTWV0YSwgImhhcHRpYyIsICZtSGFwdGljQ2hhbm5lbENvdW50KTsKK30KKwordm9pZCBNeU9nZ0V4dHJhY3Rvcjo6c2V0Q2hhbm5lbE1hc2soaW50IGNoYW5uZWxDb3VudCkgeworICAgIC8vIFNldCBjaGFubmVsIG1hc2sgYWNjb3JkaW5nIHRvIGNoYW5uZWwgY291bnQuIFdoZW4gaGFwdGljIGNoYW5uZWwgY291bnQgaXMgZm91bmQgaW4KKyAgICAvLyBmaWxlIG1ldGEsIHNldCBoYXB0aWMgY2hhbm5lbCBtYXNrIHRvIHRyeSBoYXB0aWMgcGxheWJhY2suCisgICAgaWYgKG1IYXB0aWNDaGFubmVsQ291bnQgPiAwKSB7CisgICAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IGhhcHRpY0NoYW5uZWxNYXNrID0KKyAgICAgICAgICAgICAgICBoYXB0aWNfY2hhbm5lbF9tYXNrX2Zyb21fY291bnQobUhhcHRpY0NoYW5uZWxDb3VudCk7CisgICAgICAgIGNvbnN0IGludDMyX3QgYXVkaW9DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQgLSBtSGFwdGljQ2hhbm5lbENvdW50OworICAgICAgICBpZiAoaGFwdGljQ2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9JTlZBTElECisgICAgICAgICAgICAgICAgfHwgYXVkaW9DaGFubmVsQ291bnQgPD0gMCB8fCBhdWRpb0NoYW5uZWxDb3VudCA+IEZDQ184KSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBoYXB0aWMgY2hhbm5lbCBjb3VudCBmb3VuZCBpbiBtZXRhZGF0YTogJWQiLCBtSGFwdGljQ2hhbm5lbENvdW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KAorICAgICAgICAgICAgICAgICAgICBhdWRpb0NoYW5uZWxDb3VudCkgfCBoYXB0aWNDaGFubmVsTWFzazsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX01BU0ssIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX01BU0ssCisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KGNoYW5uZWxDb3VudCkpOworICAgIH0KIH0KIAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1PZ2dFeHRyYWN0b3I6Ok9nZ0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorT2dnRXh0cmFjdG9yOjpPZ2dFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCiAgICAgICBtSW1wbChOVUxMKSB7CkBAIC0xMjIwLDEzICsxMzI4LDE0IEBACiBPZ2dFeHRyYWN0b3I6On5PZ2dFeHRyYWN0b3IoKSB7CiAgICAgZGVsZXRlIG1JbXBsOwogICAgIG1JbXBsID0gTlVMTDsKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CiB9CiAKIHNpemVfdCBPZ2dFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtSW5pdENoZWNrICE9IE9LID8gMCA6IDE7CiB9CiAKLU1lZGlhVHJhY2sgKk9nZ0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpPZ2dFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewogICAgIGlmIChpbmRleCA+PSAxKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTEyMzQsMzMgKzEzNDMsMzQgQEAKICAgICByZXR1cm4gbmV3IE9nZ1NvdXJjZSh0aGlzKTsKIH0KIAotc3RhdHVzX3QgT2dnRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCittZWRpYV9zdGF0dXNfdCBPZ2dFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIGlmIChpbmRleCA+PSAxKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgcmV0dXJuIG1JbXBsLT5nZXRGb3JtYXQobWV0YSk7CiB9CiAKLXN0YXR1c190IE9nZ0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7CittZWRpYV9zdGF0dXNfdCBPZ2dFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgewogICAgIHJldHVybiBtSW1wbC0+Z2V0RmlsZU1ldGFEYXRhKG1ldGEpOwogfQogCi1zdGF0aWMgTWVkaWFFeHRyYWN0b3IqIENyZWF0ZUV4dHJhY3RvcigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKK3N0YXRpYyBDTWVkaWFFeHRyYWN0b3IqIENyZWF0ZUV4dHJhY3RvcigKKyAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKICAgICAgICAgdm9pZCAqKSB7Ci0gICAgcmV0dXJuIG5ldyBPZ2dFeHRyYWN0b3Ioc291cmNlKTsKKyAgICByZXR1cm4gd3JhcChuZXcgT2dnRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKHNvdXJjZSkpKTsKIH0KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBTbmlmZigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKK3N0YXRpYyBDcmVhdG9yRnVuYyBTbmlmZigKKyAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCiAgICAgICAgIHZvaWQgKiosCi0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKikgeworICAgICAgICBGcmVlTWV0YUZ1bmMgKikgeworICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKHNvdXJjZSk7CiAgICAgY2hhciB0bXBbNF07Ci0gICAgaWYgKHNvdXJjZS0+cmVhZEF0KDAsIHRtcCwgNCkgPCA0IHx8IG1lbWNtcCh0bXAsICJPZ2dTIiwgNCkpIHsKKyAgICBpZiAoaGVscGVyLnJlYWRBdCgwLCB0bXAsIDQpIDwgNCB8fCBtZW1jbXAodG1wLCAiT2dnUyIsIDQpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtMTI2OSwxNiArMTM3OSwyMiBAQAogICAgIHJldHVybiBDcmVhdGVFeHRyYWN0b3I7CiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICpleHRlbnNpb25zW10gPSB7CisgICAgIm9nYSIsCisgICAgIm9nZyIsCisgICAgTlVMTAorfTsKKwogZXh0ZXJuICJDIiB7CiAvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCiBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCi1NZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKK0V4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CiAgICAgcmV0dXJuIHsKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OLAorICAgICAgICBFWFRSQUNUT1JERUZfVkVSU0lPTiwKICAgICAgICAgVVVJRCgiOGNjNWNkMDYtZjc3Mi00OTVlLThhNjItY2JhOTY0OTM3NGU5IiksCiAgICAgICAgIDEsIC8vIHZlcnNpb24KICAgICAgICAgIk9nZyBFeHRyYWN0b3IiLAotICAgICAgICBTbmlmZgorICAgICAgICB7IC52MyA9IHtTbmlmZiwgZXh0ZW5zaW9uc30gfSwKICAgICB9OwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL29nZy9PZ2dFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5oCmluZGV4IDlmZTI5NDQuLmM3NWRmYTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5oCkBAIC0xOSwyNSArMTksMjYgQEAKICNkZWZpbmUgT0dHX0VYVFJBQ1RPUl9IXwogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQU1lc3NhZ2U7Ci1jbGFzcyBEYXRhU291cmNlQmFzZTsKIGNsYXNzIFN0cmluZzg7CiAKIHN0cnVjdCBNeU9nZ0V4dHJhY3RvcjsKIHN0cnVjdCBPZ2dTb3VyY2U7CiAKLXN0cnVjdCBPZ2dFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewotICAgIGV4cGxpY2l0IE9nZ0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKTsKK3N0cnVjdCBPZ2dFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgeworICAgIGV4cGxpY2l0IE9nZ0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk9nZ0V4dHJhY3RvciI7IH0KIAogcHJvdGVjdGVkOgpAQCAtNDYsNyArNDcsNyBAQAogcHJpdmF0ZToKICAgICBmcmllbmQgc3RydWN0IE9nZ1NvdXJjZTsKIAotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwogCiAgICAgTXlPZ2dFeHRyYWN0b3IgKm1JbXBsOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy93YXYvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvd2F2L0FuZHJvaWQuYnAKaW5kZXggZGQwNDViOS4uN2U4OTI3MSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy93YXYvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9BbmRyb2lkLmJwCkBAIC03LDExICs3LDEzIEBACiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKICAgICAgICAgImxpYmZpZm8iLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgXSwKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvd2F2L1dBVkV4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuY3BwCmluZGV4IGZlNTA5YmYuLmU1OGJkMWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvd2F2L1dBVkV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmNwcApAQCAtMjAsMjEgKzIwLDMyIEBACiAKICNpbmNsdWRlICJXQVZFeHRyYWN0b3IuaCIKIAorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2liaW5kZXIuaD4gLy8gZm9yIEFJQmluZGVyX2dldENhbGxpbmdVaWQKICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPiAvLyBmb3IgQUlEX01FRElBCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPGN1dGlscy9iaXRvcHMuaD4KIAogI2RlZmluZSBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVIgMAogCisvLyBOT1RFOiBUaGlzIGNvZGUgYXNzdW1lcyB0aGUgZGV2aWNlIHByb2Nlc3NvciBpcyBsaXR0bGUgZW5kaWFuLgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKKy8vIE1lZGlhU2VydmVyIGlzIGNhcGFibGUgb2YgaGFuZGxpbmcgZmxvYXQgZXh0cmFjdG9yIG91dHB1dCwgYnV0IGdlbmVyYWwgcHJvY2Vzc2VzCisvLyBtYXkgbm90IGJlIGFibGUgdG8gZG8gc28uCisvLyBUT0RPOiBJbXByb3ZlIEFQSSB0byBzZXQgZXh0cmFjdG9yIGZsb2F0IG91dHB1dC4KKy8vIChOb3RlOiBkdXBsaWNhdGVkIHdpdGggRkxBQ0V4dHJhY3Rvci5jcHApCitzdGF0aWMgaW5saW5lIGJvb2wgc2hvdWxkRXh0cmFjdG9yT3V0cHV0RmxvYXQoaW50IGJpdHNQZXJTYW1wbGUpCit7CisgICAgcmV0dXJuIGJpdHNQZXJTYW1wbGUgPiAxNiAmJiBBSUJpbmRlcl9nZXRDYWxsaW5nVWlkKCkgPT0gQUlEX01FRElBOworfQorCiBlbnVtIHsKICAgICBXQVZFX0ZPUk1BVF9QQ00gICAgICAgID0gMHgwMDAxLAogICAgIFdBVkVfRk9STUFUX0lFRUVfRkxPQVQgPSAweDAwMDMsCkBAIC01NSwyMCArNjYsMjAgQEAKICAgICByZXR1cm4gcHRyWzFdIDw8IDggfCBwdHJbMF07CiB9CiAKLXN0cnVjdCBXQVZTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFjayB7CitzdHJ1Y3QgV0FWU291cmNlIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogICAgIFdBVlNvdXJjZSgKLSAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAotICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqZGF0YVNvdXJjZSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgICAgIHVpbnQxNl90IHdhdmVGb3JtYXQsCi0gICAgICAgICAgICBpbnQzMl90IGJpdHNQZXJTYW1wbGUsCisgICAgICAgICAgICBib29sIG91dHB1dEZsb2F0LAogICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogCiAgICAgdmlydHVhbCBib29sIHN1cHBvcnROb25ibG9ja2luZ1JlYWQoKSB7IHJldHVybiB0cnVlOyB9CiAKQEAgLTc4LDY0ICs4OSw3MiBAQAogcHJpdmF0ZToKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhGcmFtZVNpemU7CiAKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7Ci0gICAgTWV0YURhdGFCYXNlICZtTWV0YTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXQgKm1NZXRhOwogICAgIHVpbnQxNl90IG1XYXZlRm9ybWF0OworICAgIGNvbnN0IGJvb2wgbU91dHB1dEZsb2F0OwogICAgIGludDMyX3QgbVNhbXBsZVJhdGU7CiAgICAgaW50MzJfdCBtTnVtQ2hhbm5lbHM7CiAgICAgaW50MzJfdCBtQml0c1BlclNhbXBsZTsKICAgICBvZmY2NF90IG1PZmZzZXQ7CiAgICAgc2l6ZV90IG1TaXplOwogICAgIGJvb2wgbVN0YXJ0ZWQ7Ci0gICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOwogICAgIG9mZjY0X3QgbUN1cnJlbnRQb3M7CiAKICAgICBXQVZTb3VyY2UoY29uc3QgV0FWU291cmNlICYpOwogICAgIFdBVlNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IFdBVlNvdXJjZSAmKTsKIH07CiAKLVdBVkV4dHJhY3Rvcjo6V0FWRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCitXQVZFeHRyYWN0b3I6OldBVkV4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbVZhbGlkRm9ybWF0KGZhbHNlKSwKICAgICAgIG1DaGFubmVsTWFzayhDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVIpIHsKKyAgICBtVHJhY2tNZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOwogICAgIG1Jbml0Q2hlY2sgPSBpbml0KCk7CiB9CiAKIFdBVkV4dHJhY3Rvcjo6fldBVkV4dHJhY3RvcigpIHsKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtVHJhY2tNZXRhKTsKIH0KIAotc3RhdHVzX3QgV0FWRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhLmNsZWFyKCk7CittZWRpYV9zdGF0dXNfdCBXQVZFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIEFNZWRpYUZvcm1hdF9jbGVhcihtZXRhKTsKICAgICBpZiAobUluaXRDaGVjayA9PSBPSykgewotICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfV0FWKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9XQVYpOwogICAgIH0KIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiBzaXplX3QgV0FWRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKICAgICByZXR1cm4gbUluaXRDaGVjayA9PSBPSyA/IDEgOiAwOwogfQogCi1NZWRpYVRyYWNrICpXQVZFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworTWVkaWFUcmFja0hlbHBlciAqV0FWRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCA+IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgcmV0dXJuIG5ldyBXQVZTb3VyY2UoCiAgICAgICAgICAgICBtRGF0YVNvdXJjZSwgbVRyYWNrTWV0YSwKLSAgICAgICAgICAgIG1XYXZlRm9ybWF0LCBtQml0c1BlclNhbXBsZSwgbURhdGFPZmZzZXQsIG1EYXRhU2l6ZSk7CisgICAgICAgICAgICBtV2F2ZUZvcm1hdCwgc2hvdWxkRXh0cmFjdG9yT3V0cHV0RmxvYXQobUJpdHNQZXJTYW1wbGUpLCBtRGF0YU9mZnNldCwgbURhdGFTaXplKTsKIH0KIAotc3RhdHVzX3QgV0FWRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCittZWRpYV9zdGF0dXNfdCBXQVZFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ID4gMCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAotICAgIG1ldGEgPSBtVHJhY2tNZXRhOwotICAgIHJldHVybiBPSzsKKyAgICBjb25zdCBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPSBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtVHJhY2tNZXRhKTsKKyAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1BDTV9FTkNPRElORywKKyAgICAgICAgICAgICAgICBzaG91bGRFeHRyYWN0b3JPdXRwdXRGbG9hdChtQml0c1BlclNhbXBsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgID8ga0F1ZGlvRW5jb2RpbmdQY21GbG9hdCA6IGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0dXNfdCBXQVZFeHRyYWN0b3I6OmluaXQoKSB7CkBAIC0xODUsNyArMjA0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgJiYgbVdhdmVGb3JtYXQgIT0gV0FWRV9GT1JNQVRfTVVMQVcKICAgICAgICAgICAgICAgICAgICAgJiYgbVdhdmVGb3JtYXQgIT0gV0FWRV9GT1JNQVRfTVNHU00KICAgICAgICAgICAgICAgICAgICAgJiYgbVdhdmVGb3JtYXQgIT0gV0FWRV9GT1JNQVRfRVhURU5TSUJMRSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB1aW50OF90IGZtdFNpemUgPSAxNjsKQEAgLTE5OCwxMyArMjE3LDEzIEBACiAKICAgICAgICAgICAgIG1OdW1DaGFubmVscyA9IFUxNl9MRV9BVCgmZm9ybWF0U3BlY1syXSk7CiAKLSAgICAgICAgICAgIGlmIChtTnVtQ2hhbm5lbHMgPCAxIHx8IG1OdW1DaGFubmVscyA+IDgpIHsKKyAgICAgICAgICAgIGlmIChtTnVtQ2hhbm5lbHMgPCAxIHx8IG1OdW1DaGFubmVscyA+IEZDQ184KSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIG51bWJlciBvZiBjaGFubmVscyAoJWQpIiwgbU51bUNoYW5uZWxzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1XYXZlRm9ybWF0ICE9IFdBVkVfRk9STUFUX0VYVEVOU0lCTEUpIHsKLSAgICAgICAgICAgICAgICBpZiAobU51bUNoYW5uZWxzICE9IDEgJiYgbU51bUNoYW5uZWxzICE9IDIpIHsKKyAgICAgICAgICAgICAgICBpZiAobU51bUNoYW5uZWxzICE9IDEgJiYgbU51bUNoYW5uZWxzICE9IEZDQ18yKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJNb3JlIHRoYW4gMiBjaGFubmVscyAoJWQpIGluIG5vbi1XQVZFX0VYVCwgdW5rbm93biBjaGFubmVsIG1hc2siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1DaGFubmVscyk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjI0LDcgKzI0Myw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZEJpdHNQZXJTYW1wbGUgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoInZhbGlkQml0cyglZCkgIT0gYml0c1BlclNhbXBsZSglZCkgYXJlIG5vdCBzdXBwb3J0ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZEJpdHNQZXJTYW1wbGUsIG1CaXRzUGVyU2FtcGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBvbmx5IHN1cHBvcnQgdmFsaXRCaXRzUGVyU2FtcGxlID09IGJpdHNQZXJTYW1wbGUgYnV0IHNvbWUgV0FWX0VYVAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGVycyBkb24ndCBjb3JyZWN0bHkgc2V0IHRoZSB2YWxpZCBiaXRzIHZhbHVlLCBhbmQgbGVhdmUgaXQgYXQgMC4KQEAgLTI4NCwzNSArMzAzLDMzIEBACiAgICAgICAgICAgICAgICAgbURhdGFPZmZzZXQgPSBvZmZzZXQ7CiAgICAgICAgICAgICAgICAgbURhdGFTaXplID0gY2h1bmtTaXplOwogCi0gICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5jbGVhcigpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9jbGVhcihtVHJhY2tNZXRhKTsKIAogICAgICAgICAgICAgICAgIHN3aXRjaCAobVdhdmVGb3JtYXQpIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBXQVZFX0ZPUk1BVF9QQ006CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0FWRV9GT1JNQVRfSUVFRV9GTE9BVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0Q1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtVHJhY2tNZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBXQVZFX0ZPUk1BVF9BTEFXOgotICAgICAgICAgICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVyk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1UcmFja01ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIFdBVkVfRk9STUFUX01TR1NNOgotICAgICAgICAgICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01TR1NNKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobVRyYWNrTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NU0dTTSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1XYXZlRm9ybWF0LCAodWludDE2X3QpV0FWRV9GT1JNQVRfTVVMQVcpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVyk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1UcmFja01ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbU51bUNoYW5uZWxzKTsKLSAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldEludDMyKGtLZXlDaGFubmVsTWFzaywgbUNoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSk7Ci0gICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRJbnQzMihrS2V5Qml0c1BlclNhbXBsZSwgbUJpdHNQZXJTYW1wbGUpOwotICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0SW50MzIoa0tleVBjbUVuY29kaW5nLCBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0KTsKLQorICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtVHJhY2tNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIG1OdW1DaGFubmVscyk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1UcmFja01ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9NQVNLLCBtQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtVHJhY2tNZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBtU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1UcmFja01ldGEsIEFNRURJQUZPUk1BVF9LRVlfQklUU19QRVJfU0FNUExFLCBtQml0c1BlclNhbXBsZSk7CiAgICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzID0gMDsKICAgICAgICAgICAgICAgICBpZiAobVdhdmVGb3JtYXQgPT0gV0FWRV9GT1JNQVRfTVNHU00pIHsKICAgICAgICAgICAgICAgICAgICAgLy8gNjUgYnl0ZXMgZGVjb2RlIHRvIDMyMCA4a0h6IHNhbXBsZXMKQEAgLTMyMiwxOCArMzM5LDE4IEBACiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBieXRlc1BlclNhbXBsZSA9IG1CaXRzUGVyU2FtcGxlID4+IDM7CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKCFieXRlc1BlclNhbXBsZSB8fCAhbU51bUNoYW5uZWxzKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1fc2FtcGxlcyA9IG1EYXRhU2l6ZSAvIChtTnVtQ2hhbm5lbHMgKiBieXRlc1BlclNhbXBsZSk7CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKCFtU2FtcGxlUmF0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKIAogICAgICAgICAgICAgICAgICAgICBkdXJhdGlvblVzID0KICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDBMTCAqIG51bV9zYW1wbGVzIC8gbVNhbXBsZVJhdGU7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtVHJhY2tNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCBkdXJhdGlvblVzKTsKIAogICAgICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgICAgIH0KQEAgLTM0OCwyNSArMzY1LDIxIEBACiBjb25zdCBzaXplX3QgV0FWU291cmNlOjprTWF4RnJhbWVTaXplID0gMzI3Njg7CiAKIFdBVlNvdXJjZTo6V0FWU291cmNlKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSwKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICBEYXRhU291cmNlSGVscGVyICpkYXRhU291cmNlLAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIHVpbnQxNl90IHdhdmVGb3JtYXQsCi0gICAgICAgIGludDMyX3QgYml0c1BlclNhbXBsZSwKKyAgICAgICAgYm9vbCBvdXRwdXRGbG9hdCwKICAgICAgICAgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKQogICAgIDogbURhdGFTb3VyY2UoZGF0YVNvdXJjZSksCiAgICAgICBtTWV0YShtZXRhKSwKICAgICAgIG1XYXZlRm9ybWF0KHdhdmVGb3JtYXQpLAotICAgICAgbVNhbXBsZVJhdGUoMCksCi0gICAgICBtTnVtQ2hhbm5lbHMoMCksCi0gICAgICBtQml0c1BlclNhbXBsZShiaXRzUGVyU2FtcGxlKSwKKyAgICAgIG1PdXRwdXRGbG9hdChvdXRwdXRGbG9hdCksCiAgICAgICBtT2Zmc2V0KG9mZnNldCksCiAgICAgICBtU2l6ZShzaXplKSwKLSAgICAgIG1TdGFydGVkKGZhbHNlKSwKLSAgICAgIG1Hcm91cChOVUxMKSB7Ci0gICAgQ0hFQ0sobU1ldGEuZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmbVNhbXBsZVJhdGUpKTsKLSAgICBDSEVDSyhtTWV0YS5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm1OdW1DaGFubmVscykpOwotCi0gICAgbU1ldGEuc2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwga01heEZyYW1lU2l6ZSk7CisgICAgICBtU3RhcnRlZChmYWxzZSkgeworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgJm1TYW1wbGVSYXRlKSk7CisgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsICZtTnVtQ2hhbm5lbHMpKTsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQklUU19QRVJfU0FNUExFLCAmbUJpdHNQZXJTYW1wbGUpKTsKIH0KIAogV0FWU291cmNlOjp+V0FWU291cmNlKCkgewpAQCAtMzc1LDUyICszODgsNTEgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IFdBVlNvdXJjZTo6c3RhcnQoTWV0YURhdGFCYXNlICogLyogcGFyYW1zICovKSB7CittZWRpYV9zdGF0dXNfdCBXQVZTb3VyY2U6OnN0YXJ0KCkgewogICAgIEFMT0dWKCJXQVZTb3VyY2U6OnN0YXJ0Iik7CiAKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogCiAgICAgLy8gc29tZSBXQVYgZmlsZXMgbWF5IGhhdmUgbGFyZ2UgYXVkaW8gYnVmZmVycyB0aGF0IHVzZSBzaGFyZWQgbWVtb3J5IHRyYW5zZmVyLgotICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwKDQgLyogYnVmZmVycyAqLywga01heEZyYW1lU2l6ZSk7Ci0KLSAgICBpZiAobUJpdHNQZXJTYW1wbGUgPT0gOCkgewotICAgICAgICAvLyBBcyBhIHRlbXBvcmFyeSBidWZmZXIgZm9yIDgtPjE2IGJpdCBjb252ZXJzaW9uLgotICAgICAgICBtR3JvdXAtPmFkZF9idWZmZXIoTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUoa01heEZyYW1lU2l6ZSkpOworICAgIGlmICghbUJ1ZmZlckdyb3VwLT5pbml0KDQgLyogYnVmZmVycyAqLywga01heEZyYW1lU2l6ZSkpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAogICAgIG1DdXJyZW50UG9zID0gbU9mZnNldDsKIAogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBXQVZTb3VyY2U6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBXQVZTb3VyY2U6OnN0b3AoKSB7CiAgICAgQUxPR1YoIldBVlNvdXJjZTo6c3RvcCIpOwogCiAgICAgQ0hFQ0sobVN0YXJ0ZWQpOwogCi0gICAgZGVsZXRlIG1Hcm91cDsKLSAgICBtR3JvdXAgPSBOVUxMOwotCiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBXQVZTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKK21lZGlhX3N0YXR1c190IFdBVlNvdXJjZTo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgewogICAgIEFMT0dWKCJXQVZTb3VyY2U6OmdldEZvcm1hdCIpOwogCi0gICAgbWV0YSA9IG1NZXRhOwotICAgIHJldHVybiBPSzsKKyAgICBjb25zdCBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPSBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtTWV0YSk7CisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSwga01heEZyYW1lU2l6ZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1BDTV9FTkNPRElORywKKyAgICAgICAgICAgICAgICBtT3V0cHV0RmxvYXQgPyBrQXVkaW9FbmNvZGluZ1BjbUZsb2F0IDoga0F1ZGlvRW5jb2RpbmdQY20xNmJpdCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IFdBVlNvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworbWVkaWFfc3RhdHVzX3QgV0FWU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICAqb3V0ID0gTlVMTDsKIAotICAgIGlmIChvcHRpb25zICE9IG51bGxwdHIgJiYgb3B0aW9ucy0+Z2V0Tm9uQmxvY2tpbmcoKSAmJiAhbUdyb3VwLT5oYXNfYnVmZmVycygpKSB7Ci0gICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICBpZiAob3B0aW9ucyAhPSBudWxscHRyICYmIG9wdGlvbnMtPmdldE5vbkJsb2NraW5nKCkgJiYgIW1CdWZmZXJHcm91cC0+aGFzX2J1ZmZlcnMoKSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1dPVUxEX0JMT0NLOwogICAgIH0KIAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKQEAgLTQ0MiwxOCArNDU0LDIyIEBACiAgICAgICAgIG1DdXJyZW50UG9zID0gcG9zICsgbU9mZnNldDsKICAgICB9CiAKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKLSAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOworICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXI7CisgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gbUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgLy8gbWFrZSBzdXJlIHRoYXQgbWF4Qnl0ZXNUb1JlYWQgaXMgbXVsdGlwbGUgb2YgMywgaW4gMjQtYml0IGNhc2UKLSAgICBzaXplX3QgbWF4Qnl0ZXNUb1JlYWQgPQotICAgICAgICBtQml0c1BlclNhbXBsZSA9PSA4ID8ga01heEZyYW1lU2l6ZSAvIDIgOiAKLSAgICAgICAgKG1CaXRzUGVyU2FtcGxlID09IDI0ID8gMyooa01heEZyYW1lU2l6ZS8zKToga01heEZyYW1lU2l6ZSk7CisgICAgLy8gbWF4Qnl0ZXNUb1JlYWQgbWF5IGJlIHJlZHVjZWQgc28gdGhhdCBpbi1wbGFjZSBkYXRhIGNvbnZlcnNpb24gd2lsbCBmaXQgaW4gYnVmZmVyIHNpemUuCisgICAgY29uc3Qgc2l6ZV90IGJ1ZmZlclNpemUgPSBidWZmZXItPnNpemUoKTsKKyAgICBzaXplX3QgbWF4Qnl0ZXNUb1JlYWQ7CisgICAgaWYgKG1PdXRwdXRGbG9hdCkgeyAvLyBkZXN0aW5hdGlvbiBpcyBmbG9hdCBhdCA0IGJ5dGVzIHBlciBzYW1wbGUsIHNvdXJjZSBtYXkgYmUgbGVzcy4KKyAgICAgICAgbWF4Qnl0ZXNUb1JlYWQgPSAobUJpdHNQZXJTYW1wbGUgLyA4KSAqIChidWZmZXJTaXplIC8gNCk7CisgICAgfSBlbHNlIHsgLy8gZGVzdGluYXRpb24gaXMgaW50MTZfdCBhdCAyIGJ5dGVzIHBlciBzYW1wbGUsIG9ubHkgc291cmNlIG9mIDggYml0cyBpcyBsZXNzLgorICAgICAgICBtYXhCeXRlc1RvUmVhZCA9IG1CaXRzUGVyU2FtcGxlID09IDggPyBidWZmZXJTaXplIC8gMiA6IGJ1ZmZlclNpemU7CisgICAgfQogCi0gICAgc2l6ZV90IG1heEJ5dGVzQXZhaWxhYmxlID0KKyAgICBjb25zdCBzaXplX3QgbWF4Qnl0ZXNBdmFpbGFibGUgPQogICAgICAgICAobUN1cnJlbnRQb3MgLSBtT2Zmc2V0ID49IChvZmY2NF90KW1TaXplKQogICAgICAgICAgICAgPyAwIDogbVNpemUgLSAobUN1cnJlbnRQb3MgLSBtT2Zmc2V0KTsKIApAQCAtNDgyLDQ1ICs0OTgsNjQgQEAKICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICB9CiAKICAgICBidWZmZXItPnNldF9yYW5nZSgwLCBuKTsKIAogICAgIC8vIFRPRE86IGFkZCBjYXBhYmlsaXR5IHRvIHJldHVybiBkYXRhIGFzIGZsb2F0IFBDTSBpbnN0ZWFkIG9mIDE2IGJpdCBQQ00uCiAgICAgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX1BDTSkgewotICAgICAgICBpZiAobUJpdHNQZXJTYW1wbGUgPT0gOCkgewotICAgICAgICAgICAgLy8gQ29udmVydCA4LWJpdCB1bnNpZ25lZCBzYW1wbGVzIHRvIDE2LWJpdCBzaWduZWQuCi0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBuZXcgYnVmZmVyIHdpdGggMiBieXRlIHdpZGUgc2FtcGxlcwotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICp0bXA7Ci0gICAgICAgICAgICBDSEVDS19FUShtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZ0bXApLCAoc3RhdHVzX3QpT0spOwotICAgICAgICAgICAgdG1wLT5zZXRfcmFuZ2UoMCwgMiAqIG4pOwotCi0gICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fdTgoKGludDE2X3QgKil0bXAtPmRhdGEoKSwgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSwgbik7Ci0gICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIGJ1ZmZlciA9IHRtcDsKLSAgICAgICAgfSBlbHNlIGlmIChtQml0c1BlclNhbXBsZSA9PSAyNCkgewotICAgICAgICAgICAgLy8gQ29udmVydCAyNC1iaXQgc2lnbmVkIHNhbXBsZXMgdG8gMTYtYml0IHNpZ25lZCBpbiBwbGFjZQotICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG51bVNhbXBsZXMgPSBuIC8gMzsKLQotICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX3AyNCgoaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpLCAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKLSAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIDIgKiBudW1TYW1wbGVzKTsKLSAgICAgICAgfSAgZWxzZSBpZiAobUJpdHNQZXJTYW1wbGUgPT0gMzIpIHsKLSAgICAgICAgICAgIC8vIENvbnZlcnQgMzItYml0IHNpZ25lZCBzYW1wbGVzIHRvIDE2LWJpdCBzaWduZWQgaW4gcGxhY2UKLSAgICAgICAgICAgIGNvbnN0IHNpemVfdCBudW1TYW1wbGVzID0gbiAvIDQ7Ci0KLSAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9pMzIoKGludDE2X3QgKilidWZmZXItPmRhdGEoKSwgKGNvbnN0IGludDMyX3QgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7Ci0gICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCAyICogbnVtU2FtcGxlcyk7CisgICAgICAgIGlmIChtT3V0cHV0RmxvYXQpIHsKKyAgICAgICAgICAgIGZsb2F0ICpmZGVzdCA9IChmbG9hdCAqKWJ1ZmZlci0+ZGF0YSgpOworICAgICAgICAgICAgc3dpdGNoIChtQml0c1BlclNhbXBsZSkgeworICAgICAgICAgICAgY2FzZSA4OiB7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgNCAqIG4pOworICAgICAgICAgICAgICAgIG1lbWNweV90b19mbG9hdF9mcm9tX3U4KGZkZXN0LCAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBuKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE2OiB7CisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG51bVNhbXBsZXMgPSBuIC8gMjsKKyAgICAgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCA0ICogbnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KGZkZXN0LCAoY29uc3QgaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI0OiB7CisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG51bVNhbXBsZXMgPSBuIC8gMzsKKyAgICAgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCA0ICogbnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21fcDI0KGZkZXN0LCAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMyOiB7IC8vIGJ1ZmZlciByYW5nZSBpcyBjb3JyZWN0CisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG51bVNhbXBsZXMgPSBuIC8gNDsKKyAgICAgICAgICAgICAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMzIoZmRlc3QsIChjb25zdCBpbnQzMl90ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludDE2X3QgKmlkZXN0ID0gKGludDE2X3QgKilidWZmZXItPmRhdGEoKTsKKyAgICAgICAgICAgIHN3aXRjaCAobUJpdHNQZXJTYW1wbGUpIHsKKyAgICAgICAgICAgIGNhc2UgODogeworICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIDIgKiBuKTsKKyAgICAgICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fdTgoaWRlc3QsIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCksIG4pOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgYnJlYWs7IC8vIG5vIHRyYW5zbGF0aW9uIG5lZWRlZAorICAgICAgICAgICAgY2FzZSAyNDogeworICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBudW1TYW1wbGVzID0gbiAvIDM7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgMiAqIG51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9wMjQoaWRlc3QsIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzI6IHsKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgbnVtU2FtcGxlcyA9IG4gLyA0OworICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIDIgKiBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21faTMyKGlkZXN0LCAoY29uc3QgaW50MzJfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX0lFRUVfRkxPQVQpIHsKLSAgICAgICAgaWYgKG1CaXRzUGVyU2FtcGxlID09IDMyKSB7Ci0gICAgICAgICAgICAvLyBDb252ZXJ0IDMyLWJpdCBmbG9hdCBzYW1wbGVzIHRvIDE2LWJpdCBzaWduZWQgaW4gcGxhY2UKKyAgICAgICAgaWYgKCFtT3V0cHV0RmxvYXQpIHsgLy8gbUJpdHNQZXJTYW1wbGUgPT0gMzIKKyAgICAgICAgICAgIGludDE2X3QgKmlkZXN0ID0gKGludDE2X3QgKilidWZmZXItPmRhdGEoKTsKICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBudW1TYW1wbGVzID0gbiAvIDQ7Ci0KLSAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdCgoaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpLCAoY29uc3QgZmxvYXQgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7CisgICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQoaWRlc3QsIChjb25zdCBmbG9hdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKICAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIDIgKiBudW1TYW1wbGVzKTsKICAgICAgICAgfQorICAgICAgICAvLyBOb3RlOiBpZiBvdXRwdXQgZW5jb2RpbmcgaXMgZmxvYXQsIG5vIG5lZWQgdG8gY29udmVydCBpZiBzb3VyY2UgaXMgZmxvYXQuCiAgICAgfQogCiAgICAgaW50NjRfdCB0aW1lU3RhbXBVcyA9IDA7CkBAIC01MzMsMzkgKzU2OCw0MyBAQAogICAgICAgICAgICAgICAgIC8gKG1OdW1DaGFubmVscyAqIGJ5dGVzUGVyU2FtcGxlKSAvIG1TYW1wbGVSYXRlOwogICAgIH0KIAotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIHRpbWVTdGFtcFVzKTsKKyAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIHRpbWVTdGFtcFVzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKIAotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKICAgICBtQ3VycmVudFBvcyArPSBuOwogCiAgICAgKm91dCA9IGJ1ZmZlcjsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1zdGF0aWMgTWVkaWFFeHRyYWN0b3IqIENyZWF0ZUV4dHJhY3RvcigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKK3N0YXRpYyBDTWVkaWFFeHRyYWN0b3IqIENyZWF0ZUV4dHJhY3RvcigKKyAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKICAgICAgICAgdm9pZCAqKSB7Ci0gICAgcmV0dXJuIG5ldyBXQVZFeHRyYWN0b3Ioc291cmNlKTsKKyAgICByZXR1cm4gd3JhcChuZXcgV0FWRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKHNvdXJjZSkpKTsKIH0KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBTbmlmZigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKK3N0YXRpYyBDcmVhdG9yRnVuYyBTbmlmZigKKyAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCiAgICAgICAgIHZvaWQgKiosCi0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKikgeworICAgICAgICBGcmVlTWV0YUZ1bmMgKikgeworICAgIERhdGFTb3VyY2VIZWxwZXIgKmhlbHBlciA9IG5ldyBEYXRhU291cmNlSGVscGVyKHNvdXJjZSk7CiAgICAgY2hhciBoZWFkZXJbMTJdOwotICAgIGlmIChzb3VyY2UtPnJlYWRBdCgwLCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKSA8IChzc2l6ZV90KXNpemVvZihoZWFkZXIpKSB7CisgICAgaWYgKGhlbHBlci0+cmVhZEF0KDAsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKKyAgICAgICAgZGVsZXRlIGhlbHBlcjsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgaWYgKG1lbWNtcChoZWFkZXIsICJSSUZGIiwgNCkgfHwgbWVtY21wKCZoZWFkZXJbOF0sICJXQVZFIiwgNCkpIHsKKyAgICAgICAgZGVsZXRlIGhlbHBlcjsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgTWVkaWFFeHRyYWN0b3IgKmV4dHJhY3RvciA9IG5ldyBXQVZFeHRyYWN0b3Ioc291cmNlKTsKKyAgICBXQVZFeHRyYWN0b3IgKmV4dHJhY3RvciA9IG5ldyBXQVZFeHRyYWN0b3IoaGVscGVyKTsgLy8gZXh0cmFjdG9yIG93bnMgdGhlIGhlbHBlcgogICAgIGludCBudW1UcmFja3MgPSBleHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CiAgICAgZGVsZXRlIGV4dHJhY3RvcjsKICAgICBpZiAobnVtVHJhY2tzID09IDApIHsKQEAgLTU3NywxNiArNjE2LDIxIEBACiAgICAgcmV0dXJuIENyZWF0ZUV4dHJhY3RvcjsKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnNbXSA9IHsKKyAgICAid2F2IiwKKyAgICBOVUxMCit9OworCiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OLAogICAgICAgICBVVUlEKCI3ZDYxMzg1OC01ODM3LTRhMzgtODRjNS0zMzJkMWNkZGVlMjciKSwKICAgICAgICAgMSwgLy8gdmVyc2lvbgogICAgICAgICAiV0FWIEV4dHJhY3RvciIsCi0gICAgICAgIFNuaWZmCisgICAgICAgIHsgLnYzID0ge1NuaWZmLCBleHRlbnNpb25zfSB9LAogICAgIH07CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvd2F2L1dBVkV4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmgKaW5kZXggNDY3ZDBiNy4uYjUxNDE5NiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmgKQEAgLTE5LDMwICsxOSwzMSBAQAogI2RlZmluZSBXQVZfRVhUUkFDVE9SX0hfCiAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBTWVzc2FnZTsKLWNsYXNzIERhdGFTb3VyY2VCYXNlOworc3RydWN0IENEYXRhU291cmNlOwogY2xhc3MgU3RyaW5nODsKIAotY2xhc3MgV0FWRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKK2NsYXNzIFdBVkV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciB7CiBwdWJsaWM6Ci0gICAgZXhwbGljaXQgV0FWRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworICAgIGV4cGxpY2l0IFdBVkV4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIldBVkV4dHJhY3RvciI7IH0KIAogICAgIHZpcnR1YWwgfldBVkV4dHJhY3RvcigpOwogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwogICAgIGJvb2wgbVZhbGlkRm9ybWF0OwogICAgIHVpbnQxNl90IG1XYXZlRm9ybWF0OwpAQCAtNTIsNyArNTMsNyBAQAogICAgIHVpbnQxNl90IG1CaXRzUGVyU2FtcGxlOwogICAgIG9mZjY0X3QgbURhdGFPZmZzZXQ7CiAgICAgc2l6ZV90IG1EYXRhU2l6ZTsKLSAgICBNZXRhRGF0YUJhc2UgbVRyYWNrTWV0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1UcmFja01ldGE7CiAKICAgICBzdGF0dXNfdCBpbml0KCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9EbmdVdGlscy5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0RuZ1V0aWxzLmgKaW5kZXggZGU4ZjEyMC4uODgxOWY4NyAxMDA2NDQKLS0tIGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0RuZ1V0aWxzLmgKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0RuZ1V0aWxzLmgKQEAgLTQ5LDYgKzQ5LDcgQEAKICAgICAgICAgICAgIENGQV9SR0dCLAogICAgICAgICAgICAgQ0ZBX0JHR1IsCiAgICAgICAgICAgICBDRkFfR0JSRywKKyAgICAgICAgICAgIENGQV9OT05FLAogICAgICAgICB9OwogCiAgICAgICAgIE9wY29kZUxpc3RCdWlsZGVyKCk7CkBAIC04OSw3ICs5MCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZmFMYXlvdXQgY2ZhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGxlbnNTaGFkaW5nTWFwKTsKIAotCiAgICAgICAgIC8qKgogICAgICAgICAgKiBBZGQgYSBHYWluTWFwIG9wY29kZSB3aXRoIHRoZSBnaXZlbiBmaWVsZHMuICBUaGUgbWFwR2FpbnMgYXJyYXkKICAgICAgICAgICogbXVzdCBoYXZlIG1hcFBvaW50c1YgKiBtYXBQb2ludHNIICogbWFwUGxhbmVzIGVsZW1lbnRzLgpAQCAtMTk3LDYgKzE5NywzMyBAQAogCiAgICAgICAgIHN0YXR1c190IGFkZE9wY29kZVByZWFtYmxlKHVpbnQzMl90IG9wY29kZUlkKTsKIAorICAgIHByaXZhdGU6CisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgQmF5ZXIgR2Fpbk1hcCBvcGNvZGUocykgZm9yIHRoZSBnaXZlbiBtZXRhZGF0YSBwYXJhbWV0ZXJzLgorICAgICAgICAgKiBDRkEgbGF5b3V0IG11c3QgbWF0Y2ggdGhlIGxheW91dCBvZiB0aGUgc2hhZGluZyBtYXAgcGFzc2VkIGludG8gdGhlCisgICAgICAgICAqIGxlbnNTaGFkaW5nTWFwIHBhcmFtZXRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICBzdGF0dXNfdCBhZGRCYXllckdhaW5NYXBzRm9yTWV0YWRhdGEodWludDMyX3QgbHNtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsc21IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2ZhTGF5b3V0IGNmYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBsZW5zU2hhZGluZ01hcCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBCYXllciBHYWluTWFwIG9wY29kZShzKSBmb3IgdGhlIGdpdmVuIG1ldGFkYXRhIHBhcmFtZXRlcnMuCisgICAgICAgICAqIENGQSBsYXlvdXQgbXVzdCBtYXRjaCB0aGUgbGF5b3V0IG9mIHRoZSBzaGFkaW5nIG1hcCBwYXNzZWQgaW50byB0aGUKKyAgICAgICAgICogbGVuc1NoYWRpbmdNYXAgcGFyYW1ldGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHN0YXR1c190IGFkZE1vbm9jaHJvbWVHYWluTWFwc0Zvck1ldGFkYXRhKHVpbnQzMl90IGxzbVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbHNtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBsZW5zU2hhZGluZ01hcCk7CiB9OwogCiB9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvc3JjL0RuZ1V0aWxzLmNwcCBiL21lZGlhL2ltZ191dGlscy9zcmMvRG5nVXRpbHMuY3BwCmluZGV4IDlhYzdlMmEuLjkzMDRmNTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2ltZ191dGlscy9zcmMvRG5nVXRpbHMuY3BwCisrKyBiL21lZGlhL2ltZ191dGlscy9zcmMvRG5nVXRpbHMuY3BwCkBAIC02MCwzNCArNjAsMzYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFSaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENmYUxheW91dCBjZmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbGVuc1NoYWRpbmdNYXApIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKICAgICB1aW50MzJfdCBhY3RpdmVBcmVhV2lkdGggPSBhY3RpdmVBcmVhUmlnaHQgLSBhY3RpdmVBcmVhTGVmdDsKICAgICB1aW50MzJfdCBhY3RpdmVBcmVhSGVpZ2h0ID0gYWN0aXZlQXJlYUJvdHRvbSAtIGFjdGl2ZUFyZWFUb3A7Ci0gICAgZG91YmxlIHNwYWNpbmdWID0gMS4wIC8gc3RkOjptYXgoMXUsIGxzbUhlaWdodCAtIDEpOwotICAgIGRvdWJsZSBzcGFjaW5nSCA9IDEuMCAvIHN0ZDo6bWF4KDF1LCBsc21XaWR0aCAtIDEpOwogCi0gICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHJlZE1hcFZlY3Rvcihsc21XaWR0aCAqIGxzbUhlaWdodCk7Ci0gICAgZmxvYXQgKnJlZE1hcCA9IHJlZE1hcFZlY3Rvci5kYXRhKCk7Ci0KLSAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gZ3JlZW5FdmVuTWFwVmVjdG9yKGxzbVdpZHRoICogbHNtSGVpZ2h0KTsKLSAgICBmbG9hdCAqZ3JlZW5FdmVuTWFwID0gZ3JlZW5FdmVuTWFwVmVjdG9yLmRhdGEoKTsKLQotICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBncmVlbk9kZE1hcFZlY3Rvcihsc21XaWR0aCAqIGxzbUhlaWdodCk7Ci0gICAgZmxvYXQgKmdyZWVuT2RkTWFwID0gZ3JlZW5PZGRNYXBWZWN0b3IuZGF0YSgpOwotCi0gICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGJsdWVNYXBWZWN0b3IobHNtV2lkdGggKiBsc21IZWlnaHQpOwotICAgIGZsb2F0ICpibHVlTWFwID0gYmx1ZU1hcFZlY3Rvci5kYXRhKCk7Ci0KLSAgICBzaXplX3QgbHNtTWFwU2l6ZSA9IGxzbVdpZHRoICogbHNtSGVpZ2h0ICogNDsKLQotICAgIC8vIFNwbGl0IGxlbnMgc2hhZGluZyBtYXAgY2hhbm5lbHMgaW50byBzZXBhcmF0ZSBhcnJheXMKLSAgICBzaXplX3QgaiA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsc21NYXBTaXplOyBpICs9IDQsICsraikgewotICAgICAgICByZWRNYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpICsgTFNNX1JfSU5EXTsKLSAgICAgICAgZ3JlZW5FdmVuTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9HRV9JTkRdOwotICAgICAgICBncmVlbk9kZE1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fR09fSU5EXTsKLSAgICAgICAgYmx1ZU1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fQl9JTkRdOworICAgIHN3aXRjaCAoY2ZhKSB7CisgICAgICAgIGNhc2UgQ0ZBX1JHR0I6CisgICAgICAgIGNhc2UgQ0ZBX0dSQkc6CisgICAgICAgIGNhc2UgQ0ZBX0dCUkc6CisgICAgICAgIGNhc2UgQ0ZBX0JHR1I6CisgICAgICAgICAgICBlcnIgPSBhZGRCYXllckdhaW5NYXBzRm9yTWV0YWRhdGEobHNtV2lkdGgsIGxzbUhlaWdodCwgYWN0aXZlQXJlYVdpZHRoLAorICAgICAgICAgICAgICAgICAgICBhY3RpdmVBcmVhSGVpZ2h0LCBjZmEsIGxlbnNTaGFkaW5nTWFwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENGQV9OT05FOgorICAgICAgICAgICAgZXJyID0gYWRkTW9ub2Nocm9tZUdhaW5NYXBzRm9yTWV0YWRhdGEobHNtV2lkdGgsIGxzbUhlaWdodCwgYWN0aXZlQXJlYVdpZHRoLAorICAgICAgICAgICAgICAgICAgICBhY3RpdmVBcmVhSGVpZ2h0LCBsZW5zU2hhZGluZ01hcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5rbm93biBDRkEgbGF5b3V0ICVkIiwgX19GVU5DVElPTl9fLCBjZmEpOworICAgICAgICAgICAgZXJyID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgYnJlYWs7CiAgICAgfQorICAgIHJldHVybiBlcnI7Cit9CiAKK3N0YXR1c190IE9wY29kZUxpc3RCdWlsZGVyOjphZGRCYXllckdhaW5NYXBzRm9yTWV0YWRhdGEodWludDMyX3QgbHNtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsc21IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2ZhTGF5b3V0IGNmYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBsZW5zU2hhZGluZ01hcCkgewogICAgIHVpbnQzMl90IHJlZFRvcCA9IDA7CiAgICAgdWludDMyX3QgcmVkTGVmdCA9IDA7CiAgICAgdWludDMyX3QgZ3JlZW5FdmVuVG9wID0gMDsKQEAgLTE0Myw2ICsxNDUsMzIgQEAKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHJlZE1hcFZlY3Rvcihsc21XaWR0aCAqIGxzbUhlaWdodCk7CisgICAgZmxvYXQgKnJlZE1hcCA9IHJlZE1hcFZlY3Rvci5kYXRhKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gZ3JlZW5FdmVuTWFwVmVjdG9yKGxzbVdpZHRoICogbHNtSGVpZ2h0KTsKKyAgICBmbG9hdCAqZ3JlZW5FdmVuTWFwID0gZ3JlZW5FdmVuTWFwVmVjdG9yLmRhdGEoKTsKKworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBncmVlbk9kZE1hcFZlY3Rvcihsc21XaWR0aCAqIGxzbUhlaWdodCk7CisgICAgZmxvYXQgKmdyZWVuT2RkTWFwID0gZ3JlZW5PZGRNYXBWZWN0b3IuZGF0YSgpOworCisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGJsdWVNYXBWZWN0b3IobHNtV2lkdGggKiBsc21IZWlnaHQpOworICAgIGZsb2F0ICpibHVlTWFwID0gYmx1ZU1hcFZlY3Rvci5kYXRhKCk7CisKKyAgICBkb3VibGUgc3BhY2luZ1YgPSAxLjAgLyBzdGQ6Om1heCgxdSwgbHNtSGVpZ2h0IC0gMSk7CisgICAgZG91YmxlIHNwYWNpbmdIID0gMS4wIC8gc3RkOjptYXgoMXUsIGxzbVdpZHRoIC0gMSk7CisKKyAgICBzaXplX3QgbHNtTWFwU2l6ZSA9IGxzbVdpZHRoICogbHNtSGVpZ2h0ICogNDsKKworICAgIC8vIFNwbGl0IGxlbnMgc2hhZGluZyBtYXAgY2hhbm5lbHMgaW50byBzZXBhcmF0ZSBhcnJheXMKKyAgICBzaXplX3QgaiA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsc21NYXBTaXplOyBpICs9IDQsICsraikgeworICAgICAgICByZWRNYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpICsgTFNNX1JfSU5EXTsKKyAgICAgICAgZ3JlZW5FdmVuTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9HRV9JTkRdOworICAgICAgICBncmVlbk9kZE1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fR09fSU5EXTsKKyAgICAgICAgYmx1ZU1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fQl9JTkRdOworICAgIH0KKwogICAgIHN0YXR1c190IGVyciA9IGFkZEdhaW5NYXAoLyp0b3AqL3JlZFRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbGVmdCovcmVkTGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qYm90dG9tKi9hY3RpdmVBcmVhSGVpZ2h0IC0gMSwKQEAgLTIxNiw2ICsyNDQsNDYgQEAKICAgICByZXR1cm4gZXJyOwogfQogCitzdGF0dXNfdCBPcGNvZGVMaXN0QnVpbGRlcjo6YWRkTW9ub2Nocm9tZUdhaW5NYXBzRm9yTWV0YWRhdGEodWludDMyX3QgbHNtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsc21IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGxlbnNTaGFkaW5nTWFwKSB7CisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IG1hcFZlY3Rvcihsc21XaWR0aCAqIGxzbUhlaWdodCk7CisgICAgZmxvYXQgKm1hcCA9IG1hcFZlY3Rvci5kYXRhKCk7CisKKyAgICBkb3VibGUgc3BhY2luZ1YgPSAxLjAgLyBzdGQ6Om1heCgxdSwgbHNtSGVpZ2h0IC0gMSk7CisgICAgZG91YmxlIHNwYWNpbmdIID0gMS4wIC8gc3RkOjptYXgoMXUsIGxzbVdpZHRoIC0gMSk7CisKKyAgICBzaXplX3QgbHNtTWFwU2l6ZSA9IGxzbVdpZHRoICogbHNtSGVpZ2h0ICogNDsKKworICAgIC8vIFNwbGl0IGxlbnMgc2hhZGluZyBtYXAgY2hhbm5lbHMgaW50byBzZXBhcmF0ZSBhcnJheXMKKyAgICBzaXplX3QgaiA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsc21NYXBTaXplOyBpICs9IDQsICsraikgeworICAgICAgICBtYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpXTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBhZGRHYWluTWFwKC8qdG9wKi8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypsZWZ0Ki8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypib3R0b20qL2FjdGl2ZUFyZWFIZWlnaHQgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypyaWdodCovYWN0aXZlQXJlYVdpZHRoIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcGxhbmUqLzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnBsYW5lcyovMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcm93UGl0Y2gqLzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmNvbFBpdGNoKi8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBQb2ludHNWKi9sc21IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcFBvaW50c0gqL2xzbVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBTcGFjaW5nViovc3BhY2luZ1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcFNwYWNpbmdIKi9zcGFjaW5nSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwT3JpZ2luViovMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwT3JpZ2luSCovMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwUGxhbmVzKi8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBHYWlucyovbWFwKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgcmV0dXJuIGVycjsKK30KKwogc3RhdHVzX3QgT3Bjb2RlTGlzdEJ1aWxkZXI6OmFkZEdhaW5NYXAodWludDMyX3QgdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJvdHRvbSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL2puaS9BbmRyb2lkLm1rIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivam5pL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYjk4MWMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivam5pL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL3NyYyBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMKLQotIyBOREsgcmVjb21tZW5kcyB1c2luZyB0aGlzIGtpbmQgb2YgcmVsYXRpdmUgcGF0aCBpbnN0ZWFkIG9mIGFuIGFic29sdXRlIHBhdGguCi1MT0NBTF9TUkNfRklMRVM6PSAuLi9zcmMvaW5wdXRfbW9uaXRvci5jcHAKLUxPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbwotTE9DQUxfTU9EVUxFIDo9IGlucHV0X21vbml0b3IKLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscwotCi1MT0NBTF9TUkNfRklMRVM6PSAuLi9zcmMvaW5wdXRfbW9uaXRvcl9jYWxsYmFjay5jcHAKLUxPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbwotTE9DQUxfTU9EVUxFIDo9IGlucHV0X21vbml0b3JfY2FsbGJhY2sKLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBsaWJhYXVkaW9fcHJlYnVpbHQKLUxPQ0FMX1NSQ19GSUxFUyA6PSBsaWJhYXVkaW8uc28KLUxPQ0FMX0VYUE9SVF9DX0lOQ0xVREVTIDo9ICQoTE9DQUxfUEFUSCkvaW5jbHVkZQotaW5jbHVkZSAkKFBSRUJVSUxUX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivam5pL0FwcGxpY2F0aW9uLm1rIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivam5pL0FwcGxpY2F0aW9uLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzQ0NzVjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL2puaS9BcHBsaWNhdGlvbi5taworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotIyBUT0RPIHJlbW92ZSB0aGVuIHdoZW4gd2Ugc3VwcG9ydCBvdGhlciBhcmNoaXRlY3R1cmVzCi1BUFBfQUJJIDo9IGFybTY0LXY4YQotQVBQX0NQUEZMQUdTICs9IC1zdGQ9YysrMTEKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9qbmkvQW5kcm9pZC5tayBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9qbmkvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWViZTg3Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svam5pL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzCi0KLSMgTkRLIHJlY29tbWVuZHMgdXNpbmcgdGhpcyBraW5kIG9mIHJlbGF0aXZlIHBhdGggaW5zdGVhZCBvZiBhbiBhYnNvbHV0ZSBwYXRoLgotTE9DQUxfU1JDX0ZJTEVTOj0gLi4vc3JjL2xvb3BiYWNrLmNwcAotTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGlic25kZmlsZQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhYXVkaW8gbGliYXVkaW91dGlscwotTE9DQUxfTU9EVUxFIDo9IGFhdWRpb19sb29wYmFjawotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svam5pL0FwcGxpY2F0aW9uLm1rIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL2puaS9BcHBsaWNhdGlvbi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE0NGYzNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svam5pL0FwcGxpY2F0aW9uLm1rCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotQVBQX0NQUEZMQUdTICs9IC1zdGQ9YysrMTEKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9BcmdzUGFyc2VyLmggYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvQXJnc1BhcnNlci5oCmluZGV4IGEyYjkxNzcuLmE1ZGM1NWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9BcmdzUGFyc2VyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb0FyZ3NQYXJzZXIuaApAQCAtMjgzLDcgKzI4Myw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJsZW4oYXJnKSA+IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeSA9IGF0b2koJmFyZ1syXSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFBQXVkaW9fc2V0TU1hcFBvbGljeShwb2xpY3kpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChBQXVkaW9fc2V0TU1hcFBvbGljeShwb2xpY3kpICE9IEFBVURJT19PSykgewogICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJFUlJPUjogaW52YWxpZCBNTUFQIHBvbGljeSBtb2RlICVpXG4iLCBwb2xpY3kpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL2puaS9BbmRyb2lkLm1rIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvam5pL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMWJkNDMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvam5pL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL3NyYyBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMKLQotIyBOREsgcmVjb21tZW5kcyB1c2luZyB0aGlzIGtpbmQgb2YgcmVsYXRpdmUgcGF0aCBpbnN0ZWFkIG9mIGFuIGFic29sdXRlIHBhdGguCi1MT0NBTF9TUkNfRklMRVM6PSAuLi9zcmMvd3JpdGVfc2luZS5jcHAKLUxPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbwotTE9DQUxfTU9EVUxFIDo9IHdyaXRlX3NpbmUKLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscwotCi1MT0NBTF9TUkNfRklMRVM6PSAuLi9zcmMvd3JpdGVfc2luZV9jYWxsYmFjay5jcHAKLUxPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbwotTE9DQUxfTU9EVUxFIDo9IHdyaXRlX3NpbmVfY2FsbGJhY2sKLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBsaWJhYXVkaW9fcHJlYnVpbHQKLUxPQ0FMX1NSQ19GSUxFUyA6PSBsaWJhYXVkaW8uc28KLUxPQ0FMX0VYUE9SVF9DX0lOQ0xVREVTIDo9ICQoTE9DQUxfUEFUSCkvaW5jbHVkZQotaW5jbHVkZSAkKFBSRUJVSUxUX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvam5pL0FwcGxpY2F0aW9uLm1rIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvam5pL0FwcGxpY2F0aW9uLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTQ0ZjM3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL2puaS9BcHBsaWNhdGlvbi5taworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUFQUF9DUFBGTEFHUyArPSAtc3RkPWMrKzExCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL0FuZHJvaWQuYnAKaW5kZXggYjllMjhhMC4uNDA5MDI4NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5icApAQCAtNiw2ICs2LDcgQEAKICAgICAgICAgImNsaWVudCIsCiAgICAgICAgICJjb3JlIiwKICAgICAgICAgImZpZm8iLAorICAgICAgICAiZmxvd2dyYXBoIiwKICAgICAgICAgImxlZ2FjeSIsCiAgICAgICAgICJ1dGlsaXR5IiwKICAgICBdLApAQCAtMjUsOSArMjYsOSBAQAogICAgICAgICAidXRpbGl0eS9GaXhlZEJsb2NrQWRhcHRlci5jcHAiLAogICAgICAgICAidXRpbGl0eS9GaXhlZEJsb2NrUmVhZGVyLmNwcCIsCiAgICAgICAgICJ1dGlsaXR5L0ZpeGVkQmxvY2tXcml0ZXIuY3BwIiwKLSAgICAgICAgInV0aWxpdHkvTGluZWFyUmFtcC5jcHAiLAogICAgICAgICAiZmlmby9GaWZvQnVmZmVyLmNwcCIsCiAgICAgICAgICJmaWZvL0ZpZm9Db250cm9sbGVyQmFzZS5jcHAiLAorICAgICAgICAiY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5jcHAiLAogICAgICAgICAiY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwIiwKICAgICAgICAgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcCIsCiAgICAgICAgICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuY3BwIiwKQEAgLTQyLDYgKzQzLDE2IEBACiAgICAgICAgICJiaW5kaW5nL1JpbmdCdWZmZXJQYXJjZWxhYmxlLmNwcCIsCiAgICAgICAgICJiaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwIiwKICAgICAgICAgImJpbmRpbmcvU2hhcmVkUmVnaW9uUGFyY2VsYWJsZS5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL0NsaXBUb1JhbmdlLmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9SYW1wTGluZWFyLmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvU2lua0Zsb2F0LmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvU2lua0kxNi5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL1NpbmtJMjQuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9Tb3VyY2VGbG9hdC5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL1NvdXJjZUkxNi5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL1NvdXJjZUkyNC5jcHAiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmNwcAppbmRleCA5NTlkYjYxLi4zZDFiYzliIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uY3BwCkBAIC0xNCw2ICsxNCwxMCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2RlZmluZSBMT0dfVEFHICJBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKICNpbmNsdWRlIDxzeXMvbW1hbi5oPgpAQCAtMzYsNiArNDAsNyBAQAogCiBzdGF0dXNfdCBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzOworCiAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKGdldERldmljZUlkKCkpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKGdldFNhbXBsZVJhdGUoKSk7CkBAIC00Niw2ICs1MSw3IEBACiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoKGludDMyX3QpIGdldEZvcm1hdCgpKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOworCiAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKChpbnQzMl90KSBnZXREaXJlY3Rpb24oKSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7CkBAIC02MCw3ICs2Niw3IEBACiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICByZXR1cm4gTk9fRVJST1I7CiBlcnJvcjoKLSAgICBBTE9HRSgiQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi53cml0ZVRvUGFyY2VsKCk6IHdyaXRlIGZhaWxlZCA9ICVkIiwgc3RhdHVzKTsKKyAgICBBTE9HRSgiJXMoKTogd3JpdGUgZmFpbGVkID0gJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCkBAIC04MCw3ICs4Niw4IEBACiAgICAgc2V0U2hhcmluZ01vZGUoKGFhdWRpb19zaGFyaW5nX21vZGVfdCkgdmFsdWUpOwogICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ2YWx1ZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICBzZXRGb3JtYXQoKGFhdWRpb19mb3JtYXRfdCkgdmFsdWUpOworICAgIHNldEZvcm1hdCgoYXVkaW9fZm9ybWF0X3QpIHZhbHVlKTsKKwogICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ2YWx1ZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICBzZXREaXJlY3Rpb24oKGFhdWRpb19kaXJlY3Rpb25fdCkgdmFsdWUpOwpAQCAtOTksOCArMTA2LDkgQEAKICAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgc2V0U2Vzc2lvbklkKHZhbHVlKTsKKwogICAgIHJldHVybiBOT19FUlJPUjsKIGVycm9yOgotICAgIEFMT0dFKCJBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLnJlYWRGcm9tUGFyY2VsKCk6IHJlYWQgZmFpbGVkID0gJWQiLCBzdGF0dXMpOworICAgIEFMT0dFKCIlcygpOiByZWFkIGZhaWxlZCA9ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9JQUF1ZGlvU2VydmljZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvSUFBdWRpb1NlcnZpY2UuY3BwCmluZGV4IDYyMGVkYzcuLjliMzI1NDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9JQUF1ZGlvU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmNwcApAQCAtNzIsNyArNzIsNiBAQAogICAgICAgICAgICAgQUxPR0UoIkJwQUF1ZGlvU2VydmljZTo6Y2xpZW50IHRyYW5zYWN0KE9QRU5fU1RSRUFNKSByZWFkSW50ICVkIiwgZXJyKTsKICAgICAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChlcnIpOwogICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbSA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJCcEFBdWRpb1NlcnZpY2U6OmNsaWVudCBPUEVOX1NUUkVBTSBwYXNzZWQgc3RyZWFtICVkIiwgc3RyZWFtKTsKICAgICAgICAgICAgIHJldHVybiBzdHJlYW07CiAgICAgICAgIH0KICAgICAgICAgZXJyID0gY29uZmlndXJhdGlvbk91dHB1dC5yZWFkRnJvbVBhcmNlbCgmcmVwbHkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwCmluZGV4IDBiMGNmNzcuLjY3OTU1ZTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5jcHAKQEAgLTQzLDcgKzQzLDcgQEAKIAogdm9pZCBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlOjpzZXR1cChjb25zdCB1bmlxdWVfZmQmIGZkLCBpbnQzMl90IHNpemVJbkJ5dGVzKSB7CiAgICAgbUZkLnJlc2V0KGR1cChmZC5nZXQoKSkpOyAvLyBzdG9yZSBhIGR1cGxpY2F0ZSBmZAotICAgIEFMT0dWKCJzZXR1cCglZCAtPiAlZCwgJWQpIHRoaXMgPSAlcFxuIiwgZmQuZ2V0KCksIG1GZC5nZXQoKSwgc2l6ZUluQnl0ZXMsIHRoaXMpOworICAgIEFMT0dWKCJzZXR1cChmZCA9ICVkIC0+ICVkLCBzaXplID0gJWQpIHRoaXMgPSAlcFxuIiwgZmQuZ2V0KCksIG1GZC5nZXQoKSwgc2l6ZUluQnl0ZXMsIHRoaXMpOwogICAgIG1TaXplSW5CeXRlcyA9IHNpemVJbkJ5dGVzOwogfQogCkBAIC0xMDQsNyArMTA0LDggQEAKICAgICBtUmVzb2x2ZWRBZGRyZXNzID0gKHVpbnQ4X3QgKikgbW1hcCgwLCBtU2l6ZUluQnl0ZXMsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFQX1NIQVJFRCwgZmQuZ2V0KCksIDApOwogICAgIGlmIChtUmVzb2x2ZWRBZGRyZXNzID09IE1NQVBfVU5SRVNPTFZFRF9BRERSRVNTKSB7Ci0gICAgICAgIEFMT0dFKCJtbWFwKCkgZmFpbGVkIGZvciBmZCA9ICVkLCBlcnJubyA9ICVzIiwgZmQuZ2V0KCksIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIEFMT0dFKCJtbWFwKCkgZmFpbGVkIGZvciBmZCA9ICVkLCBuQnl0ZXMgPSAlZCwgZXJybm8gPSAlcyIsCisgICAgICAgICAgICAgIGZkLmdldCgpLCBtU2l6ZUluQnl0ZXMsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7CiAgICAgfQogICAgIHJldHVybiBBQVVESU9fT0s7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuaAppbmRleCA4MmMyMjQwLi40ZWMzOGM1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmgKQEAgLTcwLDggKzcwLDggQEAKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzb2x2ZVNoYXJlZE1lbW9yeShjb25zdCBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQmIGZkKTsKIAogICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCAgIG1GZDsKLSAgICBpbnQzMl90ICAgICBtU2l6ZUluQnl0ZXMgPSAwOwotICAgIHVpbnQ4X3QgICAgKm1SZXNvbHZlZEFkZHJlc3MgPSBNTUFQX1VOUkVTT0xWRURfQUREUkVTUzsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtU2l6ZUluQnl0ZXMgPSAwOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgKm1SZXNvbHZlZEFkZHJlc3MgPSBNTUFQX1VOUkVTT0xWRURfQUREUkVTUzsKIAogcHJpdmF0ZToKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U0M2M2YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5jcHAKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFBdWRpb0Zsb3dHcmFwaCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkFBdWRpb0Zsb3dHcmFwaC5oIgorCisjaW5jbHVkZSA8Zmxvd2dyYXBoL0NsaXBUb1JhbmdlLmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL1JhbXBMaW5lYXIuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvU2lua0Zsb2F0Lmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL1NpbmtJMTYuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvU2lua0kyNC5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9Tb3VyY2VGbG9hdC5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9Tb3VyY2VJMTYuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvU291cmNlSTI0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9GbG93R3JhcGg6OmNvbmZpZ3VyZShhdWRpb19mb3JtYXRfdCBzb3VyY2VGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc291cmNlQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBzaW5rRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNpbmtDaGFubmVsQ291bnQpIHsKKyAgICBBdWRpb0Zsb2F0T3V0cHV0UG9ydCAqbGFzdE91dHB1dCA9IG51bGxwdHI7CisKKyAgICBBTE9HRCgiJXMoKSBzb3VyY2UgZm9ybWF0ID0gMHglMDh4LCBjaGFubmVscyA9ICVkLCBzaW5rIGZvcm1hdCA9IDB4JTA4eCwgY2hhbm5lbHMgPSAlZCIsCisgICAgICAgICAgX19mdW5jX18sIHNvdXJjZUZvcm1hdCwgc291cmNlQ2hhbm5lbENvdW50LCBzaW5rRm9ybWF0LCBzaW5rQ2hhbm5lbENvdW50KTsKKworICAgIHN3aXRjaCAoc291cmNlRm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIG1Tb3VyY2UgPSBzdGQ6Om1ha2VfdW5pcXVlPFNvdXJjZUZsb2F0Pihzb3VyY2VDaGFubmVsQ291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgICAgICBtU291cmNlID0gc3RkOjptYWtlX3VuaXF1ZTxTb3VyY2VJMTY+KHNvdXJjZUNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQ6CisgICAgICAgICAgICBtU291cmNlID0gc3RkOjptYWtlX3VuaXF1ZTxTb3VyY2VJMjQ+KHNvdXJjZUNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLy8gVE9ETyBhZGQgSTMyCisgICAgICAgICAgICBBTE9HRSgiJXMoKSBVbnN1cHBvcnRlZCBzb3VyY2UgZm9ybWF0ID0gJWQiLCBfX2Z1bmNfXywgc291cmNlRm9ybWF0KTsKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRDsKKyAgICB9CisgICAgbGFzdE91dHB1dCA9ICZtU291cmNlLT5vdXRwdXQ7CisKKyAgICAvLyBBcHBseSB2b2x1bWUgYXMgYSByYW1wIHRvIGF2b2lkIHBvcHMuCisgICAgbVZvbHVtZVJhbXAgPSBzdGQ6Om1ha2VfdW5pcXVlPFJhbXBMaW5lYXI+KHNvdXJjZUNoYW5uZWxDb3VudCk7CisgICAgbGFzdE91dHB1dC0+Y29ubmVjdCgmbVZvbHVtZVJhbXAtPmlucHV0KTsKKyAgICBsYXN0T3V0cHV0ID0gJm1Wb2x1bWVSYW1wLT5vdXRwdXQ7CisKKyAgICAvLyBGb3IgYSBwdXJlIGZsb2F0IGdyYXBoLCB0aGVyZSBpcyBjaGFuY2UgdGhhdCB0aGUgZGF0YSByYW5nZSBtYXkgYmUgdmVyeSBsYXJnZS4KKyAgICAvLyBTbyB3ZSBzaG91bGQgY2xpcCB0byBhIHJlYXNvbmFibGUgdmFsdWUgdGhhdCBhbGxvd3MgYSBsaXR0bGUgaGVhZHJvb20uCisgICAgaWYgKHNvdXJjZUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUICYmIHNpbmtGb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICBtQ2xpcHBlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q2xpcFRvUmFuZ2U+KHNvdXJjZUNoYW5uZWxDb3VudCk7CisgICAgICAgIGxhc3RPdXRwdXQtPmNvbm5lY3QoJm1DbGlwcGVyLT5pbnB1dCk7CisgICAgICAgIGxhc3RPdXRwdXQgPSAmbUNsaXBwZXItPm91dHB1dDsKKyAgICB9CisKKyAgICAvLyBFeHBhbmQgdGhlIG51bWJlciBvZiBjaGFubmVscyBpZiByZXF1aXJlZC4KKyAgICBpZiAoc291cmNlQ2hhbm5lbENvdW50ID09IDEgJiYgc2lua0NoYW5uZWxDb3VudCA+IDEpIHsKKyAgICAgICAgbUNoYW5uZWxDb252ZXJ0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPE1vbm9Ub011bHRpQ29udmVydGVyPihzaW5rQ2hhbm5lbENvdW50KTsKKyAgICAgICAgbGFzdE91dHB1dC0+Y29ubmVjdCgmbUNoYW5uZWxDb252ZXJ0ZXItPmlucHV0KTsKKyAgICAgICAgbGFzdE91dHB1dCA9ICZtQ2hhbm5lbENvbnZlcnRlci0+b3V0cHV0OworICAgIH0gZWxzZSBpZiAoc291cmNlQ2hhbm5lbENvdW50ICE9IHNpbmtDaGFubmVsQ291bnQpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgQ2hhbm5lbCByZWR1Y3Rpb24gbm90IHN1cHBvcnRlZC4iLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHNpbmtGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICAgICAgbVNpbmsgPSBzdGQ6Om1ha2VfdW5pcXVlPFNpbmtGbG9hdD4oc2lua0NoYW5uZWxDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgICAgIG1TaW5rID0gc3RkOjptYWtlX3VuaXF1ZTxTaW5rSTE2PihzaW5rQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRDoKKyAgICAgICAgICAgIG1TaW5rID0gc3RkOjptYWtlX3VuaXF1ZTxTaW5rSTI0PihzaW5rQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvLyBUT0RPIGFkZCBJMzIKKyAgICAgICAgICAgIEFMT0dFKCIlcygpIFVuc3VwcG9ydGVkIHNpbmsgZm9ybWF0ID0gJWQiLCBfX2Z1bmNfXywgc2lua0Zvcm1hdCk7CisgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOSU1QTEVNRU5URUQ7CisgICAgfQorICAgIGxhc3RPdXRwdXQtPmNvbm5lY3QoJm1TaW5rLT5pbnB1dCk7CisKKyAgICByZXR1cm4gQUFVRElPX09LOworfQorCit2b2lkIEFBdWRpb0Zsb3dHcmFwaDo6cHJvY2Vzcyhjb25zdCB2b2lkICpzb3VyY2UsIHZvaWQgKmRlc3RpbmF0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIG1Tb3VyY2UtPnNldERhdGEoc291cmNlLCBudW1GcmFtZXMpOworICAgIG1TaW5rLT5yZWFkKGRlc3RpbmF0aW9uLCBudW1GcmFtZXMpOworfQorCisvKioKKyAqIEBwYXJhbSB2b2x1bWUgYmV0d2VlbiAwLjAgYW5kIDEuMAorICovCit2b2lkIEFBdWRpb0Zsb3dHcmFwaDo6c2V0VGFyZ2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIG1Wb2x1bWVSYW1wLT5zZXRUYXJnZXQodm9sdW1lKTsKK30KKwordm9pZCBBQXVkaW9GbG93R3JhcGg6OnNldFJhbXBMZW5ndGhJbkZyYW1lcyhpbnQzMl90IG51bUZyYW1lcykgeworICAgIG1Wb2x1bWVSYW1wLT5zZXRMZW5ndGhJbkZyYW1lcyhudW1GcmFtZXMpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BQXVkaW9GbG93R3JhcGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDlmNjRlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmgKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BQVVESU9fRkxPV19HUkFQSF9ICisjZGVmaW5lIEFORFJPSURfQUFVRElPX0ZMT1dfR1JBUEhfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9DbGlwVG9SYW5nZS5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9SYW1wTGluZWFyLmg+CisKK2NsYXNzIEFBdWRpb0Zsb3dHcmFwaCB7CitwdWJsaWM6CisgICAgLyoqIENvbm5lY3Qgc2V2ZXJhbCBtb2R1bGVzIHRvZ2V0aGVyIHRvIGNvbnZlcnQgZnJvbSBzb3VyY2UgdG8gc2luay4KKyAgICAgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlIGZvciBlYWNoIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZUZvcm1hdAorICAgICAqIEBwYXJhbSBzb3VyY2VDaGFubmVsQ291bnQKKyAgICAgKiBAcGFyYW0gc2lua0Zvcm1hdAorICAgICAqIEBwYXJhbSBzaW5rQ2hhbm5lbENvdW50CisgICAgICogQHJldHVybgorICAgICAqLworICAgIGFhdWRpb19yZXN1bHRfdCBjb25maWd1cmUoYXVkaW9fZm9ybWF0X3Qgc291cmNlRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzb3VyY2VDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBzaW5rRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzaW5rQ2hhbm5lbENvdW50KTsKKworICAgIHZvaWQgcHJvY2Vzcyhjb25zdCB2b2lkICpzb3VyY2UsIHZvaWQgKmRlc3RpbmF0aW9uLCBpbnQzMl90IG51bUZyYW1lcyk7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gdm9sdW1lIGJldHdlZW4gMC4wIGFuZCAxLjAKKyAgICAgKi8KKyAgICB2b2lkIHNldFRhcmdldFZvbHVtZShmbG9hdCB2b2x1bWUpOworCisgICAgdm9pZCBzZXRSYW1wTGVuZ3RoSW5GcmFtZXMoaW50MzJfdCBudW1GcmFtZXMpOworCitwcml2YXRlOgorICAgIHN0ZDo6dW5pcXVlX3B0cjxmbG93Z3JhcGg6OkF1ZGlvU291cmNlPiAgICAgICAgICBtU291cmNlOworICAgIHN0ZDo6dW5pcXVlX3B0cjxmbG93Z3JhcGg6OlJhbXBMaW5lYXI+ICAgICAgICAgICBtVm9sdW1lUmFtcDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Zmxvd2dyYXBoOjpDbGlwVG9SYW5nZT4gICAgICAgICAgbUNsaXBwZXI7CisgICAgc3RkOjp1bmlxdWVfcHRyPGZsb3dncmFwaDo6TW9ub1RvTXVsdGlDb252ZXJ0ZXI+IG1DaGFubmVsQ29udmVydGVyOworICAgIHN0ZDo6dW5pcXVlX3B0cjxmbG93Z3JhcGg6OkF1ZGlvU2luaz4gICAgICAgICAgICBtU2luazsKK307CisKKworI2VuZGlmIC8vQU5EUk9JRF9BQVVESU9fRkxPV19HUkFQSF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwCmluZGV4IGY4ZTM0ZDEuLjIxNGY4ODggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwCkBAIC0xOTYsNyArMTk2LDcgQEAKIAogaW50MzJfdCBBdWRpb0VuZHBvaW50OjpnZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpCiB7Ci0gICAgcmV0dXJuIG1EYXRhUXVldWUtPmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOworICAgIHJldHVybiBtRGF0YVF1ZXVlLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOwogfQogCiBpbnQzMl90IEF1ZGlvRW5kcG9pbnQ6OmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoV3JhcHBpbmdCdWZmZXIgKndyYXBwaW5nQnVmZmVyKQpAQCAtMjA2LDE1ICsyMDYsMTUgQEAKIAogaW50MzJfdCBBdWRpb0VuZHBvaW50OjpnZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCkKIHsKLSAgICByZXR1cm4gbURhdGFRdWV1ZS0+Z2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKKyAgICByZXR1cm4gbURhdGFRdWV1ZS0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOwogfQogCiB2b2lkIEF1ZGlvRW5kcG9pbnQ6OmFkdmFuY2VXcml0ZUluZGV4KGludDMyX3QgZGVsdGFGcmFtZXMpIHsKLSAgICBtRGF0YVF1ZXVlLT5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+YWR2YW5jZVdyaXRlSW5kZXgoZGVsdGFGcmFtZXMpOworICAgIG1EYXRhUXVldWUtPmFkdmFuY2VXcml0ZUluZGV4KGRlbHRhRnJhbWVzKTsKIH0KIAogdm9pZCBBdWRpb0VuZHBvaW50OjphZHZhbmNlUmVhZEluZGV4KGludDMyX3QgZGVsdGFGcmFtZXMpIHsKLSAgICBtRGF0YVF1ZXVlLT5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+YWR2YW5jZVJlYWRJbmRleChkZWx0YUZyYW1lcyk7CisgICAgbURhdGFRdWV1ZS0+YWR2YW5jZVJlYWRJbmRleChkZWx0YUZyYW1lcyk7CiB9CiAKIHZvaWQgQXVkaW9FbmRwb2ludDo6c2V0RGF0YVJlYWRDb3VudGVyKGZpZm9fY291bnRlcl90IGZyYW1lc1JlYWQpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuY3BwCmluZGV4IDkyMDQ4MjQuLmZmZmNkYTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuY3BwCkBAIC0zOSw3ICszOSw2IEBACiAjaW5jbHVkZSAiY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuaCIKICNpbmNsdWRlICJmaWZvL0ZpZm9CdWZmZXIuaCIKICNpbmNsdWRlICJ1dGlsaXR5L0F1ZGlvQ2xvY2suaCIKLSNpbmNsdWRlICJ1dGlsaXR5L0xpbmVhclJhbXAuaCIKIAogI2luY2x1ZGUgIkF1ZGlvU3RyZWFtSW50ZXJuYWwuaCIKIApAQCAtOTIsMTEgKzkxLDExIEBACiAgICAgfQogCiAgICAgLy8gV2UgaGF2ZSB0byBkbyB2b2x1bWUgc2NhbGluZy4gU28gd2UgcHJlZmVyIEZMT0FUIGZvcm1hdC4KLSAgICBpZiAoZ2V0Rm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRCkgewotICAgICAgICBzZXRGb3JtYXQoQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOworICAgIGlmIChnZXRGb3JtYXQoKSA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgeworICAgICAgICBzZXRGb3JtYXQoQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CiAgICAgfQogICAgIC8vIFJlcXVlc3QgRkxPQVQgZm9yIHRoZSBzaGFyZWQgbWl4ZXIuCi0gICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0Rm9ybWF0KEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKKyAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRGb3JtYXQoQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CiAKICAgICAvLyBCdWlsZCB0aGUgcmVxdWVzdCB0byBzZW5kIHRvIHRoZSBzZXJ2ZXIuCiAgICAgcmVxdWVzdC5zZXRVc2VySWQoZ2V0dWlkKCkpOwpAQCAtMTI2LDEzICsxMjUsMTIgQEAKICAgICAgICAgLy8gaWYgdGhhdCBmYWlsZWQgdGhlbiB0cnkgc3dpdGNoaW5nIGZyb20gbW9ubyB0byBzdGVyZW8gaWYgT1VUUFVULgogICAgICAgICAvLyBPbmx5IGRvIHRoaXMgaW4gdGhlIGNsaWVudC4gT3RoZXJ3aXNlIHdlIGVuZCB1cCB3aXRoIGEgbW9ubyBtaXhlciBpbiB0aGUgc2VydmljZQogICAgICAgICAvLyB0aGF0IHdyaXRlcyB0byBhIHN0ZXJlbyBNTUFQIHN0cmVhbS4KLSAgICAgICAgQUxPR0QoIiVzIC0gb3BlblN0cmVhbSgpIHJldHVybmVkICVkLCB0cnkgc3dpdGNoaW5nIGZyb20gTU9OTyB0byBTVEVSRU8iLAorICAgICAgICBBTE9HRCgiJXMoKSAtIG9wZW5TdHJlYW0oKSByZXR1cm5lZCAlZCwgdHJ5IHN3aXRjaGluZyBmcm9tIE1PTk8gdG8gU1RFUkVPIiwKICAgICAgICAgICAgICAgX19mdW5jX18sIG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKICAgICAgICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0U2FtcGxlc1BlckZyYW1lKDIpOyAvLyBzdGVyZW8KICAgICAgICAgbVNlcnZpY2VTdHJlYW1IYW5kbGUgPSBtU2VydmljZUludGVyZmFjZS5vcGVuU3RyZWFtKHJlcXVlc3QsIGNvbmZpZ3VyYXRpb25PdXRwdXQpOwogICAgIH0KICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgPCAwKSB7Ci0gICAgICAgIEFMT0dFKCIlcyAtIG9wZW5TdHJlYW0oKSByZXR1cm5lZCAlZCIsIF9fZnVuY19fLCBtU2VydmljZVN0cmVhbUhhbmRsZSk7CiAgICAgICAgIHJldHVybiBtU2VydmljZVN0cmVhbUhhbmRsZTsKICAgICB9CiAKQEAgLTIxMiw5ICsyMTAsNyBAQAogICAgICAgICAgICAgbUNhbGxiYWNrRnJhbWVzID0gbUZyYW1lc1BlckJ1cnN0OwogICAgICAgICB9CiAKLSAgICAgICAgaW50MzJfdCBieXRlc1BlckZyYW1lID0gZ2V0U2FtcGxlc1BlckZyYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBQXVkaW9Db252ZXJ0X2Zvcm1hdFRvU2l6ZUluQnl0ZXMoZ2V0Rm9ybWF0KCkpOwotICAgICAgICBpbnQzMl90IGNhbGxiYWNrQnVmZmVyU2l6ZSA9IG1DYWxsYmFja0ZyYW1lcyAqIGJ5dGVzUGVyRnJhbWU7CisgICAgICAgIGNvbnN0IGludDMyX3QgY2FsbGJhY2tCdWZmZXJTaXplID0gbUNhbGxiYWNrRnJhbWVzICogZ2V0Qnl0ZXNQZXJGcmFtZSgpOwogICAgICAgICBtQ2FsbGJhY2tCdWZmZXIgPSBuZXcgdWludDhfdFtjYWxsYmFja0J1ZmZlclNpemVdOwogICAgIH0KIApAQCAtNjk2LDcgKzY5Miw2IEBACiAgICAgfQogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IG1BdWRpb0VuZHBvaW50LnNldEJ1ZmZlclNpemVJbkZyYW1lcyhhZGp1c3RlZEZyYW1lcywgJmFjdHVhbEZyYW1lcyk7Ci0gICAgQUxPR0QoInNldEJ1ZmZlclNpemUoKSByZXEgPSAlZCA9PiAlZCIsIHJlcXVlc3RlZEZyYW1lcywgYWN0dWFsRnJhbWVzKTsKICAgICBpZiAocmVzdWx0IDwgMCkgewogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgKaW5kZXggMDQyNWNkNS4uM2JiOWUxZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaApAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgImNsaWVudC9BdWRpb0VuZHBvaW50LmgiCiAjaW5jbHVkZSAiY29yZS9BdWRpb1N0cmVhbS5oIgogI2luY2x1ZGUgInV0aWxpdHkvQXVkaW9DbG9jay5oIgotI2luY2x1ZGUgInV0aWxpdHkvTGluZWFyUmFtcC5oIgogCiB1c2luZyBhbmRyb2lkOjpzcDsKIHVzaW5nIGFuZHJvaWQ6OklBQXVkaW9TZXJ2aWNlOwpAQCAtMTkzLDYgKzE5Miw4IEBACiAKICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgbVNlcnZpY2VMYXRlbmN5TmFub3MgPSAwOwogCisgICAgLy8gU29tZXRpbWVzIHRoZSBoYXJkd2FyZSBpcyBvcGVyYXRpbmcgd2l0aCBhIGRpZmZlcmVudCBjaGFubmVsIGNvdW50IGZyb20gdGhlIGFwcC4KKyAgICAvLyBUaGVuIHdlIHJlcXVpcmUgY29udmVyc2lvbiBpbiBBQXVkaW8uCiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgIG1EZXZpY2VDaGFubmVsQ291bnQgPSAwOwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuY3BwCmluZGV4IDA3MTlmZTEuLjU4ZWY3YjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgogCiAjaW5jbHVkZSAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmgiCkBAIC0xNjUsMzUgKzE2NiwzNiBAQAogICAgIC8vIFJlYWQgZGF0YSBpbiBvbmUgb3IgdHdvIHBhcnRzLgogICAgIGZvciAoaW50IHBhcnRJbmRleCA9IDA7IGZyYW1lc0xlZnQgPiAwICYmIHBhcnRJbmRleCA8IFdyYXBwaW5nQnVmZmVyOjpTSVpFOyBwYXJ0SW5kZXgrKykgewogICAgICAgICBpbnQzMl90IGZyYW1lc1RvUHJvY2VzcyA9IGZyYW1lc0xlZnQ7Ci0gICAgICAgIGludDMyX3QgZnJhbWVzQXZhaWxhYmxlID0gd3JhcHBpbmdCdWZmZXIubnVtRnJhbWVzW3BhcnRJbmRleF07CisgICAgICAgIGNvbnN0IGludDMyX3QgZnJhbWVzQXZhaWxhYmxlID0gd3JhcHBpbmdCdWZmZXIubnVtRnJhbWVzW3BhcnRJbmRleF07CiAgICAgICAgIGlmIChmcmFtZXNBdmFpbGFibGUgPD0gMCkgYnJlYWs7CiAKICAgICAgICAgaWYgKGZyYW1lc1RvUHJvY2VzcyA+IGZyYW1lc0F2YWlsYWJsZSkgewogICAgICAgICAgICAgZnJhbWVzVG9Qcm9jZXNzID0gZnJhbWVzQXZhaWxhYmxlOwogICAgICAgICB9CiAKLSAgICAgICAgaW50MzJfdCBudW1CeXRlcyA9IGdldEJ5dGVzUGVyRnJhbWUoKSAqIGZyYW1lc1RvUHJvY2VzczsKLSAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzVG9Qcm9jZXNzICogZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisgICAgICAgIGNvbnN0IGludDMyX3QgbnVtQnl0ZXMgPSBnZXRCeXRlc1BlckZyYW1lKCkgKiBmcmFtZXNUb1Byb2Nlc3M7CisgICAgICAgIGNvbnN0IGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1RvUHJvY2VzcyAqIGdldFNhbXBsZXNQZXJGcmFtZSgpOwogCisgICAgICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IHNvdXJjZUZvcm1hdCA9IGdldERldmljZUZvcm1hdCgpOworICAgICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBkZXN0aW5hdGlvbkZvcm1hdCA9IGdldEZvcm1hdCgpOwogICAgICAgICAvLyBUT0RPIGZhY3RvciB0aGlzIG91dCBpbnRvIGEgdXRpbGl0eSBmdW5jdGlvbgotICAgICAgICBpZiAoZ2V0RGV2aWNlRm9ybWF0KCkgPT0gZ2V0Rm9ybWF0KCkpIHsKKyAgICAgICAgaWYgKHNvdXJjZUZvcm1hdCA9PSBkZXN0aW5hdGlvbkZvcm1hdCkgewogICAgICAgICAgICAgbWVtY3B5KGRlc3RpbmF0aW9uLCB3cmFwcGluZ0J1ZmZlci5kYXRhW3BhcnRJbmRleF0sIG51bUJ5dGVzKTsKLSAgICAgICAgfSBlbHNlIGlmIChnZXREZXZpY2VGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYKLSAgICAgICAgICAgICAgICAgICAmJiBnZXRGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoCi0gICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICopIHdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwKKyAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VGb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQKKyAgICAgICAgICAgICAgICAgICAmJiBkZXN0aW5hdGlvbkZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CisgICAgICAgICAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMTYoCiAgICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgMS4wZik7Ci0gICAgICAgIH0gZWxzZSBpZiAoZ2V0RGV2aWNlRm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQKLSAgICAgICAgICAgICAgICAgICAmJiBnZXRGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKLSAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfZmxvYXRUb1BjbTE2KAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKikgd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSB3cmFwcGluZ0J1ZmZlci5kYXRhW3BhcnRJbmRleF0sCisgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMpOworICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUCisgICAgICAgICAgICAgICAgICAgJiYgZGVzdGluYXRpb25Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKKyAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdCgKICAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKikgZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgIDEuMGYpOworICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKikgd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLAorICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJGb3JtYXQgY29udmVyc2lvbiBub3Qgc3VwcG9ydGVkISIpOworICAgICAgICAgICAgQUxPR0UoIiVzKCkgLSBGb3JtYXQgY29udmVyc2lvbiBub3Qgc3VwcG9ydGVkISBhdWRpb19mb3JtYXRfdCBzb3VyY2UgPSAldSwgZGVzdCA9ICV1IiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc291cmNlRm9ybWF0LCBkZXN0aW5hdGlvbkZvcm1hdCk7CiAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfRk9STUFUOwogICAgICAgICB9CiAgICAgICAgIGRlc3RpbmF0aW9uICs9IG51bUJ5dGVzOwpAQCAtMjU2LDcgKzI1OCw3IEBACiAgICAgICAgIGNhbGxiYWNrUmVzdWx0ID0gbWF5YmVDYWxsRGF0YUNhbGxiYWNrKG1DYWxsYmFja0J1ZmZlciwgbUNhbGxiYWNrRnJhbWVzKTsKIAogICAgICAgICBpZiAoY2FsbGJhY2tSZXN1bHQgPT0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QKSB7Ci0gICAgICAgICAgICBBTE9HRCgiY2FsbGJhY2sgcmV0dXJuZWQgQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QIik7CisgICAgICAgICAgICBBTE9HRCgiJXMoKTogY2FsbGJhY2sgcmV0dXJuZWQgQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QIiwgX19mdW5jX18pOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5jcHAKaW5kZXggNzk1YmEyYy4uOWFmNDdiMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcApAQCAtNDMsOSArNDMsMTcgQEAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsUGxheTo6b3Blbihjb25zdCBBdWRpb1N0cmVhbUJ1aWxkZXIgJmJ1aWxkZXIpIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQXVkaW9TdHJlYW1JbnRlcm5hbDo6b3BlbihidWlsZGVyKTsKICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICByZXN1bHQgPSBtRmxvd0dyYXBoLmNvbmZpZ3VyZShnZXRGb3JtYXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2FtcGxlc1BlckZyYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERldmljZUZvcm1hdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VDaGFubmVsQ291bnQoKSk7CisKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgIH0KICAgICAgICAgLy8gU2FtcGxlIHJhdGUgaXMgY29uc3RyYWluZWQgdG8gY29tbW9uIHZhbHVlcyBieSBub3cgYW5kIHNob3VsZCBub3Qgb3ZlcmZsb3cuCiAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzID0ga1JhbXBNU2VjICogZ2V0U2FtcGxlUmF0ZSgpIC8gQUFVRElPX01JTExJU19QRVJfU0VDT05EOwotICAgICAgICBtVm9sdW1lUmFtcC5zZXRMZW5ndGhJbkZyYW1lcyhudW1GcmFtZXMpOworICAgICAgICBtRmxvd0dyYXBoLnNldFJhbXBMZW5ndGhJbkZyYW1lcyhudW1GcmFtZXMpOwogICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwogfQpAQCAtMjE2LDIyICsyMjQsMTAgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaW50MzJfdCBudW1CeXRlcyA9IGdldEJ5dGVzUGVyRnJhbWUoKSAqIGZyYW1lc1RvV3JpdGU7Ci0gICAgICAgICAgICAvLyBEYXRhIGNvbnZlcnNpb24uCi0gICAgICAgICAgICBmbG9hdCBsZXZlbEZyb207Ci0gICAgICAgICAgICBmbG9hdCBsZXZlbFRvOwotICAgICAgICAgICAgbVZvbHVtZVJhbXAubmV4dFNlZ21lbnQoZnJhbWVzVG9Xcml0ZSwgJmxldmVsRnJvbSwgJmxldmVsVG8pOwogCi0gICAgICAgICAgICBBQXVkaW9EYXRhQ29udmVydGVyOjpGb3JtYXR0ZWREYXRhIHNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilieXRlQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICBnZXRGb3JtYXQoKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0U2FtcGxlc1BlckZyYW1lKCkpOwotICAgICAgICAgICAgQUF1ZGlvRGF0YUNvbnZlcnRlcjo6Rm9ybWF0dGVkRGF0YSBkZXN0aW5hdGlvbigKLSAgICAgICAgICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLAotICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JtYXQoKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlQ2hhbm5lbENvdW50KCkpOwotCi0gICAgICAgICAgICBBQXVkaW9EYXRhQ29udmVydGVyOjpjb252ZXJ0KHNvdXJjZSwgZGVzdGluYXRpb24sIGZyYW1lc1RvV3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwgbGV2ZWxUbyk7CisgICAgICAgICAgICBtRmxvd0dyYXBoLnByb2Nlc3MoKHZvaWQgKilieXRlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNUb1dyaXRlKTsKIAogICAgICAgICAgICAgYnl0ZUJ1ZmZlciArPSBudW1CeXRlczsKICAgICAgICAgICAgIGZyYW1lc0xlZnQgLT0gZnJhbWVzVG9Xcml0ZTsKQEAgLTI5Nyw3ICsyOTMsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKGNhbGxiYWNrUmVzdWx0ID09IEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCkgewotICAgICAgICAgICAgQUxPR1YoIiVzKCk6IGNhbGxiYWNrIHJldHVybmVkIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIEFMT0dEKCIlcygpOiBjYWxsYmFjayByZXR1cm5lZCBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1AiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KQEAgLTMxMyw2ICszMDksNiBAQAogICAgIGZsb2F0IGNvbWJpbmVkVm9sdW1lID0gbVN0cmVhbVZvbHVtZSAqIGdldER1Y2tBbmRNdXRlVm9sdW1lKCk7CiAgICAgQUxPR0QoIiVzKCkgbVN0cmVhbVZvbHVtZSAqIGR1Y2tBbmRNdXRlVm9sdW1lID0gJWYgKiAlZiA9ICVmIiwKICAgICAgICAgICBfX2Z1bmNfXywgbVN0cmVhbVZvbHVtZSwgZ2V0RHVja0FuZE11dGVWb2x1bWUoKSwgY29tYmluZWRWb2x1bWUpOwotICAgIG1Wb2x1bWVSYW1wLnNldFRhcmdldChjb21iaW5lZFZvbHVtZSk7CisgICAgbUZsb3dHcmFwaC5zZXRUYXJnZXRWb2x1bWUoY29tYmluZWRWb2x1bWUpOwogICAgIHJldHVybiBhbmRyb2lkOjpOT19FUlJPUjsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oCmluZGV4IDk3N2E5MDkuLmNhYjI5NDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuaApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KIAogI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvU2VydmljZUludGVyZmFjZS5oIgorI2luY2x1ZGUgImNsaWVudC9BQXVkaW9GbG93R3JhcGguaCIKICNpbmNsdWRlICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oIgogCiB1c2luZyBhbmRyb2lkOjpzcDsKQEAgLTkzLDcgKzk0LDcgQEAKIAogICAgIGludDY0X3QgICAgICAgICAgICAgICAgICBtTGFzdEZyYW1lc1JlYWQgPSAwOyAvLyB1c2VkIHRvIHByZXZlbnQgcmV0cm9ncmFkZSBtb3Rpb24KIAotICAgIExpbmVhclJhbXAgICAgICAgICAgICAgICBtVm9sdW1lUmFtcDsKKyAgICBBQXVkaW9GbG93R3JhcGggICAgICAgICAgbUZsb3dHcmFwaDsKIAogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9BdWRpby5jcHAKaW5kZXggZGYwZGI3OS4uMmZiMzk4NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvQXVkaW8uY3BwCkBAIC0xNDYsMTQgKzE0NiwxNCBAQAogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q2hhbm5lbENvdW50KEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsQ291bnQpCiB7Ci0gICAgQXVkaW9TdHJlYW1CdWlsZGVyICpzdHJlYW1CdWlsZGVyID0gY29udmVydEFBdWRpb0J1aWxkZXJUb1N0cmVhbUJ1aWxkZXIoYnVpbGRlcik7Ci0gICAgc3RyZWFtQnVpbGRlci0+c2V0U2FtcGxlc1BlckZyYW1lKGNoYW5uZWxDb3VudCk7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTYW1wbGVzUGVyRnJhbWUoYnVpbGRlciwgY2hhbm5lbENvdW50KTsKIH0KIAogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2FtcGxlc1BlckZyYW1lKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUpCiB7Ci0gICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDaGFubmVsQ291bnQoYnVpbGRlciwgY2hhbm5lbENvdW50KTsKKyAgICBBdWRpb1N0cmVhbUJ1aWxkZXIgKnN0cmVhbUJ1aWxkZXIgPSBjb252ZXJ0QUF1ZGlvQnVpbGRlclRvU3RyZWFtQnVpbGRlcihidWlsZGVyKTsKKyAgICBzdHJlYW1CdWlsZGVyLT5zZXRTYW1wbGVzUGVyRnJhbWUoc2FtcGxlc1BlckZyYW1lKTsKIH0KIAogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGlyZWN0aW9uKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCkBAIC0xNjcsNyArMTY3LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19mb3JtYXRfdCBmb3JtYXQpCiB7CiAgICAgQXVkaW9TdHJlYW1CdWlsZGVyICpzdHJlYW1CdWlsZGVyID0gY29udmVydEFBdWRpb0J1aWxkZXJUb1N0cmVhbUJ1aWxkZXIoYnVpbGRlcik7Ci0gICAgc3RyZWFtQnVpbGRlci0+c2V0Rm9ybWF0KGZvcm1hdCk7CisgICAgLy8gVXNlIGF1ZGlvX2Zvcm1hdF90IGV2ZXJ5d2hlcmUgaW50ZXJuYWxseS4KKyAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBpbnRlcm5hbEZvcm1hdCA9IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkRGF0YUZvcm1hdChmb3JtYXQpOworICAgIHN0cmVhbUJ1aWxkZXItPnNldEZvcm1hdChpbnRlcm5hbEZvcm1hdCk7CiB9CiAKIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNoYXJpbmdNb2RlKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCkBAIC0yMzksNyArMjQxLDcgQEAKIHsKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBudWxscHRyOwogICAgIC8vIFBsZWFzZSBsZWF2ZSB0aGVzZSBsb2dzIGJlY2F1c2UgdGhleSBhcmUgdmVyeSBoZWxwZnVsIHdoZW4gZGVidWdnaW5nLgotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKSBjYWxsZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworICAgIEFMT0dEKCIlcygpIGNhbGxlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiwgX19mdW5jX18pOwogICAgIEF1ZGlvU3RyZWFtQnVpbGRlciAqc3RyZWFtQnVpbGRlciA9IENPTU1PTl9HRVRfRlJPTV9CVUlMREVSX09SX1JFVFVSTihzdHJlYW1QdHIpOwogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzdHJlYW1CdWlsZGVyLT5idWlsZCgmYXVkaW9TdHJlYW0pOwogICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKSByZXR1cm5zICVkID0gJXMgZm9yICglcCkgLS0tLS0tLS0tLS0tLS0tLSIsCkBAIC0yNjcsNyArMjY5LDcgQEAKIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX0VSUk9SX05VTEw7CiAgICAgQXVkaW9TdHJlYW0gKmF1ZGlvU3RyZWFtID0gY29udmVydEFBdWRpb1N0cmVhbVRvQXVkaW9TdHJlYW0oc3RyZWFtKTsKLSAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtX2Nsb3NlKCVwKSBjYWxsZWQgLS0tLS0tLS0tLS0tLS0tIiwgc3RyZWFtKTsKKyAgICBBTE9HRCgiJXMoJXApIGNhbGxlZCAtLS0tLS0tLS0tLS0tLS0iLCBfX2Z1bmNfXywgc3RyZWFtKTsKICAgICBpZiAoYXVkaW9TdHJlYW0gIT0gbnVsbHB0cikgewogICAgICAgICByZXN1bHQgPSBhdWRpb1N0cmVhbS0+c2FmZUNsb3NlKCk7CiAgICAgICAgIC8vIENsb3NlIHdpbGwgb25seSBmYWlsIGlmIGNhbGxlZCBpbGxlZ2FsbHksIGZvciBleGFtcGxlLCBmcm9tIGEgY2FsbGJhY2suCkBAIC0yODIsNyArMjg0LDcgQEAKICAgICAvLyBXZSdyZSBwb3RlbnRpYWxseSBmcmVlaW5nIGBzdHJlYW1gIGFib3ZlLCBzbyBpdHMgdXNlIGhlcmUgbWFrZXMgc29tZQogICAgIC8vIHN0YXRpYyBhbmFseXNpcyB0b29scyB1bmhhcHB5LiBDYXN0aW5nIHRvIHVpbnRwdHJfdCBoZWxwcyBhc3N1cmUKICAgICAvLyBzYWlkIHRvb2xzIHRoYXQgd2UncmUgbm90IGRvaW5nIGFueXRoaW5nIGJhZCBoZXJlLgotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1fY2xvc2UoJSMiIFBSSXhQVFIgIikgcmV0dXJuZWQgJWQgLS0tLS0tLS0tIiwKKyAgICBBTE9HRCgiJXMoJSMiIFBSSXhQVFIgIikgcmV0dXJuZWQgJWQgLS0tLS0tLS0tIiwgX19mdW5jX18sCiAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHN0cmVhbSksIHJlc3VsdCk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTI5MCwzMCArMjkyLDMwIEBACiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCAgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChBQXVkaW9TdHJlYW0qIHN0cmVhbSkKIHsKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOwotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KCVwKSBjYWxsZWQgLS0tLS0tLS0tLS0tLS0iLCBzdHJlYW0pOworICAgIEFMT0dEKCIlcyglcCkgY2FsbGVkIC0tLS0tLS0tLS0tLS0tIiwgX19mdW5jX18sIHN0cmVhbSk7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGF1ZGlvU3RyZWFtLT5zeXN0ZW1TdGFydCgpOwotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KCVwKSByZXR1cm5lZCAlZCAtLS0tLS0tLS0iLCBzdHJlYW0sIHJlc3VsdCk7CisgICAgQUxPR0QoIiVzKCVwKSByZXR1cm5lZCAlZCAtLS0tLS0tLS0iLCBfX2Z1bmNfXywgc3RyZWFtLCByZXN1bHQpOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIEFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90ICBBQXVkaW9TdHJlYW1fcmVxdWVzdFBhdXNlKEFBdWRpb1N0cmVhbSogc3RyZWFtKQogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7Ci0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0UGF1c2UoJXApIiwgc3RyZWFtKTsKKyAgICBBTE9HRCgiJXMoJXApIGNhbGxlZCIsIF9fZnVuY19fLCBzdHJlYW0pOwogICAgIHJldHVybiBhdWRpb1N0cmVhbS0+c3lzdGVtUGF1c2UoKTsKIH0KIAogQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgIEFBdWRpb1N0cmVhbV9yZXF1ZXN0Rmx1c2goQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCiB7CiAgICAgQXVkaW9TdHJlYW0gKmF1ZGlvU3RyZWFtID0gY29udmVydEFBdWRpb1N0cmVhbVRvQXVkaW9TdHJlYW0oc3RyZWFtKTsKLSAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtX3JlcXVlc3RGbHVzaCglcCkiLCBzdHJlYW0pOworICAgIEFMT0dEKCIlcyglcCkgY2FsbGVkIiwgX19mdW5jX18sIHN0cmVhbSk7CiAgICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5zYWZlRmx1c2goKTsKIH0KIAogQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcChBQXVkaW9TdHJlYW0qIHN0cmVhbSkKIHsKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOwotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoJXApIiwgc3RyZWFtKTsKKyAgICBBTE9HRCgiJXMoJXApIGNhbGxlZCIsIF9fZnVuY19fLCBzdHJlYW0pOwogICAgIHJldHVybiBhdWRpb1N0cmVhbS0+c3lzdGVtU3RvcCgpOwogfQogCkBAIC00MDgsNyArNDEwLDkgQEAKIEFBVURJT19BUEkgYWF1ZGlvX2Zvcm1hdF90IEFBdWRpb1N0cmVhbV9nZXRGb3JtYXQoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCiB7CiAgICAgQXVkaW9TdHJlYW0gKmF1ZGlvU3RyZWFtID0gY29udmVydEFBdWRpb1N0cmVhbVRvQXVkaW9TdHJlYW0oc3RyZWFtKTsKLSAgICByZXR1cm4gYXVkaW9TdHJlYW0tPmdldEZvcm1hdCgpOworICAgIC8vIFVzZSBhdWRpb19mb3JtYXRfdCBpbnRlcm5hbGx5LgorICAgIGF1ZGlvX2Zvcm1hdF90IGludGVybmFsRm9ybWF0ID0gYXVkaW9TdHJlYW0tPmdldEZvcm1hdCgpOworICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb0RhdGFGb3JtYXQoaW50ZXJuYWxGb3JtYXQpOwogfQogCiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TdHJlYW1fc2V0QnVmZmVyU2l6ZUluRnJhbWVzKEFBdWRpb1N0cmVhbSogc3RyZWFtLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuY3BwCmluZGV4IGQ1NjcwMWIuLmJkNDI2OTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5jcHAKQEAgLTQ4LDYgKzQ4LDIwIEBACiAgICAgbUlucHV0UHJlc2V0ICAgICA9IG90aGVyLm1JbnB1dFByZXNldDsKIH0KIAorc3RhdGljIGFhdWRpb19yZXN1bHRfdCBpc0Zvcm1hdFZhbGlkKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgeworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0RFRkFVTFQ6CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIGJyZWFrOyAvLyB2YWxpZAorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoImF1ZGlvRm9ybWF0IG5vdCB2YWxpZCwgYXVkaW9fZm9ybWF0X3QgPSAweCUwOHgiLCBmb3JtYXQpOworICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0ZPUk1BVDsKKyAgICAgICAgICAgIC8vIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gQUFVRElPX09LOworfQorCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU3RyZWFtUGFyYW1ldGVyczo6dmFsaWRhdGUoKSBjb25zdCB7CiAgICAgaWYgKG1TYW1wbGVzUGVyRnJhbWUgIT0gQUFVRElPX1VOU1BFQ0lGSUVECiAgICAgICAgICYmIChtU2FtcGxlc1BlckZyYW1lIDwgU0FNUExFU19QRVJfRlJBTUVfTUlOIHx8IG1TYW1wbGVzUGVyRnJhbWUgPiBTQU1QTEVTX1BFUl9GUkFNRV9NQVgpKSB7CkBAIC03OSwxNiArOTMsOCBAQAogICAgICAgICAgICAgLy8gYnJlYWs7CiAgICAgfQogCi0gICAgc3dpdGNoIChtQXVkaW9Gb3JtYXQpIHsKLSAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOgotICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0kxNjoKLSAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKLSAgICAgICAgICAgIGJyZWFrOyAvLyB2YWxpZAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoImF1ZGlvRm9ybWF0IG5vdCB2YWxpZCA9ICVkIiwgbUF1ZGlvRm9ybWF0KTsKLSAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9GT1JNQVQ7Ci0gICAgICAgICAgICAvLyBicmVhazsKLSAgICB9CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGlzRm9ybWF0VmFsaWQgKG1BdWRpb0Zvcm1hdCk7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHJldHVybiByZXN1bHQ7CiAKICAgICBpZiAobVNhbXBsZVJhdGUgIT0gQUFVRElPX1VOU1BFQ0lGSUVECiAgICAgICAgICYmIChtU2FtcGxlUmF0ZSA8IFNBTVBMRV9SQVRFX0haX01JTiB8fCBtU2FtcGxlUmF0ZSA+IFNBTVBMRV9SQVRFX0haX01BWCkpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5oCmluZGV4IGNlNWRhY2QuLjZiZWI0YjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuaApAQCAtNTYsMTEgKzU2LDExIEBACiAgICAgICAgIG1TYW1wbGVzUGVyRnJhbWUgPSBzYW1wbGVzUGVyRnJhbWU7CiAgICAgfQogCi0gICAgYWF1ZGlvX2Zvcm1hdF90IGdldEZvcm1hdCgpIGNvbnN0IHsKKyAgICBhdWRpb19mb3JtYXRfdCBnZXRGb3JtYXQoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtQXVkaW9Gb3JtYXQ7CiAgICAgfQogCi0gICAgdm9pZCBzZXRGb3JtYXQoYWF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0KSB7CisgICAgdm9pZCBzZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQpIHsKICAgICAgICAgbUF1ZGlvRm9ybWF0ID0gYXVkaW9Gb3JtYXQ7CiAgICAgfQogCkBAIC0xMjAsOCArMTIwLDExIEBACiAgICAgICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQHJldHVybiBieXRlcyBwZXIgZnJhbWUgb2YgZ2V0Rm9ybWF0KCkKKyAgICAgKi8KICAgICBpbnQzMl90IGNhbGN1bGF0ZUJ5dGVzUGVyRnJhbWUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBnZXRTYW1wbGVzUGVyRnJhbWUoKSAqIEFBdWRpb0NvbnZlcnRfZm9ybWF0VG9TaXplSW5CeXRlcyhnZXRGb3JtYXQoKSk7CisgICAgICAgIHJldHVybiBnZXRTYW1wbGVzUGVyRnJhbWUoKSAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZ2V0Rm9ybWF0KCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTM5LDcgKzE0Miw3IEBACiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUgICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtRGV2aWNlSWQgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCAgICAgIG1TaGFyaW5nTW9kZSAgICAgPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDsKLSAgICBhYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICBtQXVkaW9Gb3JtYXQgICAgID0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDsKKyAgICBhdWRpb19mb3JtYXRfdCAgICAgICAgICAgICBtQXVkaW9Gb3JtYXQgICAgID0gQVVESU9fRk9STUFUX0RFRkFVTFQ7CiAgICAgYWF1ZGlvX2RpcmVjdGlvbl90ICAgICAgICAgbURpcmVjdGlvbiAgICAgICA9IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUOwogICAgIGFhdWRpb191c2FnZV90ICAgICAgICAgICAgIG1Vc2FnZSAgICAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgYWF1ZGlvX2NvbnRlbnRfdHlwZV90ICAgICAgbUNvbnRlbnRUeXBlICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uY3BwCmluZGV4IDM1ODAyMWIuLjM5MWFmMjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmNwcApAQCAtMzcsNyArMzcsNiBAQAogfQogCiBBdWRpb1N0cmVhbTo6fkF1ZGlvU3RyZWFtKCkgewotICAgIEFMT0dEKCJkZXN0cm95aW5nICVwLCBzdGF0ZSA9ICVzIiwgdGhpcywgQUF1ZGlvX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChnZXRTdGF0ZSgpKSk7CiAgICAgLy8gSWYgdGhlIHN0cmVhbSBpcyBkZWxldGVkIHdoZW4gT1BFTiBvciBpbiB1c2UgdGhlbiBhdWRpbyByZXNvdXJjZXMgd2lsbCBsZWFrLgogICAgIC8vIFRoaXMgd291bGQgaW5kaWNhdGUgYW4gaW50ZXJuYWwgZXJyb3IuIFNvIHdlIHdhbnQgdG8gZmluZCB0aGlzIEFTQVAuCiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRighKGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmgKaW5kZXggMzFiODk1Yy4uNjAyMDBiMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmgKQEAgLTE5Miw3ICsxOTIsNyBAQAogICAgICAgICByZXR1cm4gbVNhbXBsZVJhdGU7CiAgICAgfQogCi0gICAgYWF1ZGlvX2Zvcm1hdF90IGdldEZvcm1hdCgpICBjb25zdCB7CisgICAgYXVkaW9fZm9ybWF0X3QgZ2V0Rm9ybWF0KCkgIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1Gb3JtYXQ7CiAgICAgfQogCkBAIC0yNDksMjEgKzI0OSwxNCBAQAogICAgICAqIFRoaXMgaXMgb25seSB2YWxpZCBhZnRlciBzZXRGb3JtYXQoKSBoYXMgYmVlbiBjYWxsZWQuCiAgICAgICovCiAgICAgaW50MzJfdCBnZXRCeXRlc1BlclNhbXBsZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfZm9ybWF0VG9TaXplSW5CeXRlcyhtRm9ybWF0KTsKKyAgICAgICAgcmV0dXJuIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobUZvcm1hdCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogVGhpcyBpcyBvbmx5IHZhbGlkIGFmdGVyIHNldFNhbXBsZXNQZXJGcmFtZSgpIGFuZCBzZXREZXZpY2VGb3JtYXQoKSBoYXZlIGJlZW4gY2FsbGVkLgogICAgICAqLwogICAgIGludDMyX3QgZ2V0Qnl0ZXNQZXJEZXZpY2VGcmFtZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1TYW1wbGVzUGVyRnJhbWUgKiBnZXRCeXRlc1BlckRldmljZVNhbXBsZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgb25seSB2YWxpZCBhZnRlciBzZXREZXZpY2VGb3JtYXQoKSBoYXMgYmVlbiBjYWxsZWQuCi0gICAgICovCi0gICAgaW50MzJfdCBnZXRCeXRlc1BlckRldmljZVNhbXBsZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfZm9ybWF0VG9TaXplSW5CeXRlcyhnZXREZXZpY2VGb3JtYXQoKSk7CisgICAgICAgIHJldHVybiBnZXRTYW1wbGVzUGVyRnJhbWUoKSAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZ2V0RGV2aWNlRm9ybWF0KCkpOwogICAgIH0KIAogICAgIHZpcnR1YWwgaW50NjRfdCBnZXRGcmFtZXNXcml0dGVuKCkgPSAwOwpAQCAtNDc4LDE4ICs0NzEsMTggQEAKICAgICAvKioKICAgICAgKiBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBvcGVuKCkgY2FsbC4KICAgICAgKi8KLSAgICB2b2lkIHNldEZvcm1hdChhYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CisgICAgdm9pZCBzZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CiAgICAgICAgIG1Gb3JtYXQgPSBmb3JtYXQ7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBhZnRlciB0aGUgb3BlbigpIGNhbGwuCiAgICAgICovCi0gICAgdm9pZCBzZXREZXZpY2VGb3JtYXQoYWF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgeworICAgIHZvaWQgc2V0RGV2aWNlRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgewogICAgICAgICBtRGV2aWNlRm9ybWF0ID0gZm9ybWF0OwogICAgIH0KIAotICAgIGFhdWRpb19mb3JtYXRfdCBnZXREZXZpY2VGb3JtYXQoKSBjb25zdCB7CisgICAgYXVkaW9fZm9ybWF0X3QgZ2V0RGV2aWNlRm9ybWF0KCkgY29uc3QgewogICAgICAgICByZXR1cm4gbURldmljZUZvcm1hdDsKICAgICB9CiAKQEAgLTU2NSw3ICs1NTgsNyBAQAogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBtRGV2aWNlSWQgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90ICAgICAgIG1TaGFyaW5nTW9kZSA9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtU2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkID0gZmFsc2U7IC8vIG11c3QgbWF0Y2ggc2hhcmluZyBtb2RlIHJlcXVlc3RlZAotICAgIGFhdWRpb19mb3JtYXRfdCAgICAgICAgICAgICBtRm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDsKKyAgICBhdWRpb19mb3JtYXRfdCAgICAgICAgICAgICAgbUZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxUOwogICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCAgICAgICBtU3RhdGUgPSBBQVVESU9fU1RSRUFNX1NUQVRFX1VOSU5JVElBTElaRUQ7CiAgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCAgIG1QZXJmb3JtYW5jZU1vZGUgPSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FOwogCkBAIC01NzcsNyArNTcwLDcgQEAKIAogICAgIC8vIFNvbWV0aW1lcyB0aGUgaGFyZHdhcmUgaXMgb3BlcmF0aW5nIHdpdGggYSBkaWZmZXJlbnQgZm9ybWF0IGZyb20gdGhlIGFwcC4KICAgICAvLyBUaGVuIHdlIHJlcXVpcmUgY29udmVyc2lvbiBpbiBBQXVkaW8uCi0gICAgYWF1ZGlvX2Zvcm1hdF90ICAgICAgICAgICAgIG1EZXZpY2VGb3JtYXQgPSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOworICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgICAgICAgICBtRGV2aWNlRm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CiAKICAgICAvLyBjYWxsYmFjayAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmNwcAppbmRleCBiMDkyNThlLi5mNTExM2YyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuY3BwCkBAIC0yMywzMCArMjMsMjYgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKICNpbmNsdWRlICJGaWZvQ29udHJvbGxlckJhc2UuaCIKICNpbmNsdWRlICJGaWZvQ29udHJvbGxlci5oIgogI2luY2x1ZGUgIkZpZm9Db250cm9sbGVySW5kaXJlY3QuaCIKICNpbmNsdWRlICJGaWZvQnVmZmVyLmgiCiAKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOyAvLyBUT0RPIGp1c3QgaW1wb3J0IG5hbWVzIG5lZWRlZAordXNpbmcgYW5kcm9pZDo6Rmlmb0J1ZmZlcjsKK3VzaW5nIGFuZHJvaWQ6OmZpZm9fZnJhbWVzX3Q7CiAKIEZpZm9CdWZmZXI6OkZpZm9CdWZmZXIoaW50MzJfdCBieXRlc1BlckZyYW1lLCBmaWZvX2ZyYW1lc190IGNhcGFjaXR5SW5GcmFtZXMpCi0gICAgICAgIDogbUZyYW1lQ2FwYWNpdHkoY2FwYWNpdHlJbkZyYW1lcykKLSAgICAgICAgLCBtQnl0ZXNQZXJGcmFtZShieXRlc1BlckZyYW1lKQotICAgICAgICAsIG1TdG9yYWdlKG51bGxwdHIpCi0gICAgICAgICwgbUZyYW1lc1JlYWRDb3VudCgwKQotICAgICAgICAsIG1GcmFtZXNVbmRlcnJ1bkNvdW50KDApCi0gICAgICAgICwgbVVuZGVycnVuQ291bnQoMCkKKyAgICAgICAgOiBtQnl0ZXNQZXJGcmFtZShieXRlc1BlckZyYW1lKQogewotICAgIC8vIFRPRE8gSGFuZGxlIHBvc3NpYmxlIGZhaWx1cmVzIHRvIGFsbG9jYXRlLiBNb3ZlIG91dCBvZiBjb25zdHJ1Y3Rvcj8KLSAgICBtRmlmbyA9IG5ldyBGaWZvQ29udHJvbGxlcihjYXBhY2l0eUluRnJhbWVzLCBjYXBhY2l0eUluRnJhbWVzKTsKKyAgICBtRmlmbyA9IHN0ZDo6bWFrZV91bmlxdWU8Rmlmb0NvbnRyb2xsZXI+KGNhcGFjaXR5SW5GcmFtZXMsIGNhcGFjaXR5SW5GcmFtZXMpOwogICAgIC8vIGFsbG9jYXRlIGJ1ZmZlcgogICAgIGludDMyX3QgYnl0ZXNQZXJCdWZmZXIgPSBieXRlc1BlckZyYW1lICogY2FwYWNpdHlJbkZyYW1lczsKICAgICBtU3RvcmFnZSA9IG5ldyB1aW50OF90W2J5dGVzUGVyQnVmZmVyXTsKICAgICBtU3RvcmFnZU93bmVkID0gdHJ1ZTsKLSAgICBBTE9HVigiY2FwYWNpdHlJbkZyYW1lcyA9ICVkLCBieXRlc1BlckZyYW1lID0gJWQiLAotICAgICAgICAgIGNhcGFjaXR5SW5GcmFtZXMsIGJ5dGVzUGVyRnJhbWUpOworICAgIEFMT0dWKCIlcygpIGNhcGFjaXR5SW5GcmFtZXMgPSAlZCwgYnl0ZXNQZXJGcmFtZSA9ICVkIiwKKyAgICAgICAgICBfX2Z1bmNfXywgY2FwYWNpdHlJbkZyYW1lcywgYnl0ZXNQZXJGcmFtZSk7CiB9CiAKIEZpZm9CdWZmZXI6OkZpZm9CdWZmZXIoIGludDMyX3QgICBieXRlc1BlckZyYW1lLApAQCAtNTUsMTQgKzUxLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBmaWZvX2NvdW50ZXJfdCAqICB3cml0ZUluZGV4QWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiAgZGF0YVN0b3JhZ2VBZGRyZXNzCiAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgIDogbUZyYW1lQ2FwYWNpdHkoY2FwYWNpdHlJbkZyYW1lcykKLSAgICAgICAgLCBtQnl0ZXNQZXJGcmFtZShieXRlc1BlckZyYW1lKQorICAgICAgICA6IG1CeXRlc1BlckZyYW1lKGJ5dGVzUGVyRnJhbWUpCiAgICAgICAgICwgbVN0b3JhZ2Uoc3RhdGljX2Nhc3Q8dWludDhfdCAqPihkYXRhU3RvcmFnZUFkZHJlc3MpKQotICAgICAgICAsIG1GcmFtZXNSZWFkQ291bnQoMCkKLSAgICAgICAgLCBtRnJhbWVzVW5kZXJydW5Db3VudCgwKQotICAgICAgICAsIG1VbmRlcnJ1bkNvdW50KDApCiB7Ci0gICAgbUZpZm8gPSBuZXcgRmlmb0NvbnRyb2xsZXJJbmRpcmVjdChjYXBhY2l0eUluRnJhbWVzLAorICAgIG1GaWZvID0gc3RkOjptYWtlX3VuaXF1ZTxGaWZvQ29udHJvbGxlckluZGlyZWN0PihjYXBhY2l0eUluRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHlJbkZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRJbmRleEFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUluZGV4QWRkcmVzcyk7CkBAIC03MywxMCArNjUsOCBAQAogICAgIGlmIChtU3RvcmFnZU93bmVkKSB7CiAgICAgICAgIGRlbGV0ZVtdIG1TdG9yYWdlOwogICAgIH0KLSAgICBkZWxldGUgbUZpZm87CiB9CiAKLQogaW50MzJfdCBGaWZvQnVmZmVyOjpjb252ZXJ0RnJhbWVzVG9CeXRlcyhmaWZvX2ZyYW1lc190IGZyYW1lcykgewogICAgIHJldHVybiBmcmFtZXMgKiBtQnl0ZXNQZXJGcmFtZTsKIH0KQEAgLTg3LDExICs3NywxMiBAQAogICAgIHdyYXBwaW5nQnVmZmVyLT5kYXRhWzFdID0gbnVsbHB0cjsKICAgICB3cmFwcGluZ0J1ZmZlci0+bnVtRnJhbWVzWzFdID0gMDsKICAgICBpZiAoZnJhbWVzQXZhaWxhYmxlID4gMCkgeworICAgICAgICBmaWZvX2ZyYW1lc190IGNhcGFjaXR5ID0gbUZpZm8tPmdldENhcGFjaXR5KCk7CiAgICAgICAgIHVpbnQ4X3QgKnNvdXJjZSA9ICZtU3RvcmFnZVtjb252ZXJ0RnJhbWVzVG9CeXRlcyhzdGFydEluZGV4KV07CiAgICAgICAgIC8vIERvZXMgdGhlIGF2YWlsYWJsZSBkYXRhIGNyb3NzIHRoZSBlbmQgb2YgdGhlIEZJRk8/Ci0gICAgICAgIGlmICgoc3RhcnRJbmRleCArIGZyYW1lc0F2YWlsYWJsZSkgPiBtRnJhbWVDYXBhY2l0eSkgeworICAgICAgICBpZiAoKHN0YXJ0SW5kZXggKyBmcmFtZXNBdmFpbGFibGUpID4gY2FwYWNpdHkpIHsKICAgICAgICAgICAgIHdyYXBwaW5nQnVmZmVyLT5kYXRhWzBdID0gc291cmNlOwotICAgICAgICAgICAgZmlmb19mcmFtZXNfdCBmaXJzdEZyYW1lcyA9IG1GcmFtZUNhcGFjaXR5IC0gc3RhcnRJbmRleDsKKyAgICAgICAgICAgIGZpZm9fZnJhbWVzX3QgZmlyc3RGcmFtZXMgPSBjYXBhY2l0eSAtIHN0YXJ0SW5kZXg7CiAgICAgICAgICAgICB3cmFwcGluZ0J1ZmZlci0+bnVtRnJhbWVzWzBdID0gZmlyc3RGcmFtZXM7CiAgICAgICAgICAgICB3cmFwcGluZ0J1ZmZlci0+ZGF0YVsxXSA9ICZtU3RvcmFnZVswXTsKICAgICAgICAgICAgIHdyYXBwaW5nQnVmZmVyLT5udW1GcmFtZXNbMV0gPSBmcmFtZXNBdmFpbGFibGUgLSBmaXJzdEZyYW1lczsKQEAgLTEwNyw3ICs5OCw4IEBACiAKIGZpZm9fZnJhbWVzX3QgRmlmb0J1ZmZlcjo6Z2V0RnVsbERhdGFBdmFpbGFibGUoV3JhcHBpbmdCdWZmZXIgKndyYXBwaW5nQnVmZmVyKSB7CiAgICAgLy8gVGhlIEZJRk8gbWlnaHQgYmUgb3ZlcmZ1bGwgc28gY2xpcCB0byBjYXBhY2l0eS4KLSAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0F2YWlsYWJsZSA9IHN0ZDo6bWluKG1GaWZvLT5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCksIG1GcmFtZUNhcGFjaXR5KTsKKyAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0F2YWlsYWJsZSA9IHN0ZDo6bWluKG1GaWZvLT5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlmby0+Z2V0Q2FwYWNpdHkoKSk7CiAgICAgZmlmb19mcmFtZXNfdCBzdGFydEluZGV4ID0gbUZpZm8tPmdldFJlYWRJbmRleCgpOwogICAgIGZpbGxXcmFwcGluZ0J1ZmZlcih3cmFwcGluZ0J1ZmZlciwgZnJhbWVzQXZhaWxhYmxlLCBzdGFydEluZGV4KTsKICAgICByZXR1cm4gZnJhbWVzQXZhaWxhYmxlOwpAQCAtMTE1LDcgKzEwNyw4IEBACiAKIGZpZm9fZnJhbWVzX3QgRmlmb0J1ZmZlcjo6Z2V0RW1wdHlSb29tQXZhaWxhYmxlKFdyYXBwaW5nQnVmZmVyICp3cmFwcGluZ0J1ZmZlcikgewogICAgIC8vIFRoZSBGSUZPIG1pZ2h0IGhhdmUgdW5kZXJydW4gc28gY2xpcCB0byBjYXBhY2l0eS4KLSAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0F2YWlsYWJsZSA9IHN0ZDo6bWluKG1GaWZvLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpLCBtRnJhbWVDYXBhY2l0eSk7CisgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPSBzdGQ6Om1pbihtRmlmby0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GaWZvLT5nZXRDYXBhY2l0eSgpKTsKICAgICBmaWZvX2ZyYW1lc190IHN0YXJ0SW5kZXggPSBtRmlmby0+Z2V0V3JpdGVJbmRleCgpOwogICAgIGZpbGxXcmFwcGluZ0J1ZmZlcih3cmFwcGluZ0J1ZmZlciwgZnJhbWVzQXZhaWxhYmxlLCBzdGFydEluZGV4KTsKICAgICByZXR1cm4gZnJhbWVzQXZhaWxhYmxlOwpAQCAtMTgzLDIzICsxNzYsNiBAQAogICAgIHJldHVybiBmcmFtZXNXcml0dGVuOwogfQogCi1maWZvX2ZyYW1lc190IEZpZm9CdWZmZXI6OnJlYWROb3codm9pZCAqYnVmZmVyLCBmaWZvX2ZyYW1lc190IG51bUZyYW1lcykgewotICAgIG1MYXN0UmVhZFNpemUgPSBudW1GcmFtZXM7Ci0gICAgZmlmb19mcmFtZXNfdCBmcmFtZXNMZWZ0ID0gbnVtRnJhbWVzOwotICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzUmVhZCA9IHJlYWQoYnVmZmVyLCBudW1GcmFtZXMpOwotICAgIGZyYW1lc0xlZnQgLT0gZnJhbWVzUmVhZDsKLSAgICBtRnJhbWVzUmVhZENvdW50ICs9IGZyYW1lc1JlYWQ7Ci0gICAgbUZyYW1lc1VuZGVycnVuQ291bnQgKz0gZnJhbWVzTGVmdDsKLSAgICAvLyBaZXJvIG91dCBhbnkgc2FtcGxlcyB3ZSBjb3VsZCBub3Qgc2V0LgotICAgIGlmIChmcmFtZXNMZWZ0ID4gMCkgewotICAgICAgICBtVW5kZXJydW5Db3VudCsrOwotICAgICAgICBpbnQzMl90IGJ5dGVzVG9aZXJvID0gY29udmVydEZyYW1lc1RvQnl0ZXMoZnJhbWVzTGVmdCk7Ci0gICAgICAgIG1lbXNldChidWZmZXIsIDAsIGJ5dGVzVG9aZXJvKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZnJhbWVzUmVhZDsKLX0KLQogZmlmb19mcmFtZXNfdCBGaWZvQnVmZmVyOjpnZXRUaHJlc2hvbGQoKSB7CiAgICAgcmV0dXJuIG1GaWZvLT5nZXRUaHJlc2hvbGQoKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5oCmluZGV4IGY1YTllMjcuLjBkMTg4YzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuaApAQCAtMTcsNiArMTcsNyBAQAogI2lmbmRlZiBGSUZPX0ZJRk9fQlVGRkVSX0gKICNkZWZpbmUgRklGT19GSUZPX0JVRkZFUl9ICiAKKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKICNpbmNsdWRlICJGaWZvQ29udHJvbGxlckJhc2UuaCIKQEAgLTc3LDI0ICs3OCwxMiBAQAogICAgICAqLwogICAgIGZpZm9fZnJhbWVzX3QgZ2V0RW1wdHlSb29tQXZhaWxhYmxlKFdyYXBwaW5nQnVmZmVyICp3cmFwcGluZ0J1ZmZlcik7CiAKLSAgICAvKioKLSAgICAgKiBDb3B5IGRhdGEgZnJvbSB0aGUgRklGTyBpbnRvIHRoZSBidWZmZXIuCi0gICAgICogQHBhcmFtIGJ1ZmZlcgotICAgICAqIEBwYXJhbSBudW1GcmFtZXMKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgZmlmb19mcmFtZXNfdCByZWFkTm93KHZvaWQgKmJ1ZmZlciwgZmlmb19mcmFtZXNfdCBudW1GcmFtZXMpOwotCi0gICAgaW50NjRfdCBnZXROZXh0UmVhZFRpbWUoaW50MzJfdCBmcmFtZVJhdGUpOwotCi0gICAgaW50MzJfdCBnZXRVbmRlcnJ1bkNvdW50KCkgY29uc3QgeyByZXR1cm4gbVVuZGVycnVuQ291bnQ7IH0KLQotICAgIEZpZm9Db250cm9sbGVyQmFzZSAqZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCkgeyByZXR1cm4gbUZpZm87IH0KLQogICAgIGludDMyX3QgZ2V0Qnl0ZXNQZXJGcmFtZSgpIHsKICAgICAgICAgcmV0dXJuIG1CeXRlc1BlckZyYW1lOwogICAgIH0KIAorICAgIC8vIFByb3h5IG1ldGhvZHMgZm9yIHRoZSBpbnRlcm5hbCBGaWZvQ29udHJvbGxlcgorCiAgICAgZmlmb19jb3VudGVyX3QgZ2V0UmVhZENvdW50ZXIoKSB7CiAgICAgICAgIHJldHVybiBtRmlmby0+Z2V0UmVhZENvdW50ZXIoKTsKICAgICB9CkBAIC0xMTEsNiArMTAwLDIyIEBACiAgICAgICAgIG1GaWZvLT5zZXRXcml0ZUNvdW50ZXIobik7CiAgICAgfQogCisgICAgdm9pZCBhZHZhbmNlUmVhZEluZGV4KGZpZm9fZnJhbWVzX3QgbnVtRnJhbWVzKSB7CisgICAgICAgIG1GaWZvLT5hZHZhbmNlUmVhZEluZGV4KG51bUZyYW1lcyk7CisgICAgfQorCisgICAgdm9pZCBhZHZhbmNlV3JpdGVJbmRleChmaWZvX2ZyYW1lc190IG51bUZyYW1lcykgeworICAgICAgICBtRmlmby0+YWR2YW5jZVdyaXRlSW5kZXgobnVtRnJhbWVzKTsKKyAgICB9CisKKyAgICBmaWZvX2ZyYW1lc190IGdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCkgeworICAgICAgICByZXR1cm4gbUZpZm8tPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCk7CisgICAgfQorCisgICAgZmlmb19mcmFtZXNfdCBnZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCkgeworICAgICAgICByZXR1cm4gbUZpZm8tPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKKyAgICB9CisKICAgICAvKgogICAgICAqIFRoaXMgaXMgZ2VuZXJhbGx5IG9ubHkgY2FsbGVkIGJlZm9yZSBvciBhZnRlciB0aGUgYnVmZmVyIGlzIHVzZWQuCiAgICAgICovCkBAIC0xMjEsMTUgKzEyNiwxMiBAQAogICAgIHZvaWQgZmlsbFdyYXBwaW5nQnVmZmVyKFdyYXBwaW5nQnVmZmVyICp3cmFwcGluZ0J1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lc0F2YWlsYWJsZSwgaW50MzJfdCBzdGFydEluZGV4KTsKIAotICAgIGNvbnN0IGZpZm9fZnJhbWVzX3QgbUZyYW1lQ2FwYWNpdHk7Ci0gICAgY29uc3QgaW50MzJfdCBtQnl0ZXNQZXJGcmFtZTsKLSAgICB1aW50OF90ICptU3RvcmFnZTsKLSAgICBib29sIG1TdG9yYWdlT3duZWQ7IC8vIGRpZCB0aGlzIG9iamVjdCBhbGxvY2F0ZSB0aGUgc3RvcmFnZT8KLSAgICBGaWZvQ29udHJvbGxlckJhc2UgKm1GaWZvOwotICAgIGZpZm9fY291bnRlcl90IG1GcmFtZXNSZWFkQ291bnQ7Ci0gICAgZmlmb19jb3VudGVyX3QgbUZyYW1lc1VuZGVycnVuQ291bnQ7Ci0gICAgaW50MzJfdCBtVW5kZXJydW5Db3VudDsgLy8gbmVlZD8ganVzdCB1c2UgZnJhbWVzCi0gICAgaW50MzJfdCBtTGFzdFJlYWRTaXplOworICAgIGNvbnN0IGludDMyX3QgICAgICAgICAgICAgbUJ5dGVzUGVyRnJhbWU7CisgICAgLy8gV2UgZG8gbm90IHVzZSBhIHN0ZDo6dW5pcXVlX3B0ciBmb3IgbVN0b3JhZ2UgYmVjYXVzZSBpdCBpcyBvZnRlbiBhIHBvaW50ZXIgdG8KKyAgICAvLyBtZW1vcnkgc2hhcmVkIGJldHdlZW4gcHJvY2Vzc2VzIGFuZCBjYW5ub3QgYmUgZGVsZXRlZCB0cml2aWFsbHkuCisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICptU3RvcmFnZSA9IG51bGxwdHI7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICBtU3RvcmFnZU93bmVkID0gZmFsc2U7IC8vIGRpZCB0aGlzIG9iamVjdCBhbGxvY2F0ZSB0aGUgc3RvcmFnZT8KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Rmlmb0NvbnRyb2xsZXJCYXNlPiBtRmlmb3t9OwogfTsKIAogfSAgLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXIuaAppbmRleCA3OWQ5OGExLi4wNTdhOTRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXIuaApAQCAtMzAsNyArMzAsNyBAQAogY2xhc3MgRmlmb0NvbnRyb2xsZXIgOiBwdWJsaWMgRmlmb0NvbnRyb2xsZXJCYXNlCiB7CiBwdWJsaWM6Ci0gICAgRmlmb0NvbnRyb2xsZXIoZmlmb19jb3VudGVyX3QgYnVmZmVyU2l6ZSwgZmlmb19jb3VudGVyX3QgdGhyZXNob2xkKQorICAgIEZpZm9Db250cm9sbGVyKGZpZm9fZnJhbWVzX3QgYnVmZmVyU2l6ZSwgZmlmb19mcmFtZXNfdCB0aHJlc2hvbGQpCiAgICAgOiBGaWZvQ29udHJvbGxlckJhc2UoYnVmZmVyU2l6ZSwgdGhyZXNob2xkKQogICAgICwgbVJlYWRDb3VudGVyKDApCiAgICAgLCBtV3JpdGVDb3VudGVyKDApCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckJhc2UuY3BwCmluZGV4IDUxYThlMzQuLjY2ZTI0N2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckJhc2UuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckJhc2UuY3BwCkBAIC01OSw1ICs1OSwxMCBAQAogfQogCiB2b2lkIEZpZm9Db250cm9sbGVyQmFzZTo6c2V0VGhyZXNob2xkKGZpZm9fZnJhbWVzX3QgdGhyZXNob2xkKSB7CisgICAgaWYgKHRocmVzaG9sZCA+IG1DYXBhY2l0eSkgeworICAgICAgICB0aHJlc2hvbGQgPSBtQ2FwYWNpdHk7CisgICAgfSBlbHNlIGlmICh0aHJlc2hvbGQgPCAwKSB7CisgICAgICAgIHRocmVzaG9sZCA9IDA7CisgICAgfQogICAgIG1UaHJlc2hvbGQgPSB0aHJlc2hvbGQ7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmgKaW5kZXggNjRhZjc3Ny4uMWVkYjhhMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckJhc2UuaApAQCAtMTAyLDYgKzEwMiw5IEBACiAgICAgLyoqCiAgICAgICogWW91IGNhbiByZXF1ZXN0IHRoYXQgdGhlIGJ1ZmZlciBub3QgYmUgZmlsbGVkIGFib3ZlIGEgbWF4aW11bQogICAgICAqIG51bWJlciBvZiBmcmFtZXMuCisgICAgICoKKyAgICAgKiBUaGUgdGhyZXNob2xkIHdpbGwgYmUgY2xpcHBlZCBiZXR3ZWVuIHplcm8gYW5kIHRoZSBidWZmZXIgY2FwYWNpdHkuCisgICAgICoKICAgICAgKiBAcGFyYW0gdGhyZXNob2xkIGVmZmVjdGl2ZSBzaXplIG9mIHRoZSBidWZmZXIKICAgICAgKi8KICAgICB2b2lkIHNldFRocmVzaG9sZChmaWZvX2ZyYW1lc190IHRocmVzaG9sZCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQXVkaW9Qcm9jZXNzb3JCYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjY3ZmRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQXVkaW9Qcm9jZXNzb3JCYXNlLmNwcApAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdCBBdWRpb1Byb2Nlc3NvckJhc2U6OnB1bGxEYXRhKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBpZiAoZnJhbWVQb3NpdGlvbiA+IG1MYXN0RnJhbWVQb3NpdGlvbikgeworICAgICAgICBtTGFzdEZyYW1lUG9zaXRpb24gPSBmcmFtZVBvc2l0aW9uOworICAgICAgICBtRnJhbWVzVmFsaWQgPSBvblByb2Nlc3MoZnJhbWVQb3NpdGlvbiwgbnVtRnJhbWVzKTsKKyAgICB9CisgICAgcmV0dXJuIG1GcmFtZXNWYWxpZDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0F1ZGlvRmxvYXRCbG9ja1BvcnQ6OkF1ZGlvRmxvYXRCbG9ja1BvcnQoQXVkaW9Qcm9jZXNzb3JCYXNlICZwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZXNQZXJCbG9jaykKKyAgICAgICAgOiBBdWRpb1BvcnQocGFyZW50LCBzYW1wbGVzUGVyRnJhbWUpCisgICAgICAgICwgbUZyYW1lc1BlckJsb2NrKGZyYW1lc1BlckJsb2NrKQorICAgICAgICAsIG1TYW1wbGVCbG9jayhOVUxMKSB7CisgICAgaW50MzJfdCBudW1GbG9hdHMgPSBmcmFtZXNQZXJCbG9jayAqIGdldFNhbXBsZXNQZXJGcmFtZSgpOworICAgIG1TYW1wbGVCbG9jayA9IG5ldyBmbG9hdFtudW1GbG9hdHNdezAuMGZ9OworfQorCitBdWRpb0Zsb2F0QmxvY2tQb3J0Ojp+QXVkaW9GbG9hdEJsb2NrUG9ydCgpIHsKKyAgICBkZWxldGVbXSBtU2FtcGxlQmxvY2s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90IEF1ZGlvRmxvYXRPdXRwdXRQb3J0OjpwdWxsRGF0YShpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgbnVtRnJhbWVzID0gc3RkOjptaW4oZ2V0RnJhbWVzUGVyQmxvY2soKSwgbnVtRnJhbWVzKTsKKyAgICByZXR1cm4gbVBhcmVudC5wdWxsRGF0YShmcmFtZVBvc2l0aW9uLCBudW1GcmFtZXMpOworfQorCisvLyBUaGVzZSBuZWVkIHRvIGJlIGluIHRoZSAuY3BwIGZpbGUgYmVjYXVzZSBvZiBmb3J3YXJkIGNyb3NzIHJlZmVyZW5jZXMuCit2b2lkIEF1ZGlvRmxvYXRPdXRwdXRQb3J0Ojpjb25uZWN0KEF1ZGlvRmxvYXRJbnB1dFBvcnQgKnBvcnQpIHsKKyAgICBwb3J0LT5jb25uZWN0KHRoaXMpOworfQorCit2b2lkIEF1ZGlvRmxvYXRPdXRwdXRQb3J0OjpkaXNjb25uZWN0KEF1ZGlvRmxvYXRJbnB1dFBvcnQgKnBvcnQpIHsKKyAgICBwb3J0LT5kaXNjb25uZWN0KHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdCBBdWRpb0Zsb2F0SW5wdXRQb3J0OjpwdWxsRGF0YShpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgcmV0dXJuIChtQ29ubmVjdGVkID09IE5VTEwpCisgICAgICAgICAgICA/IHN0ZDo6bWluKGdldEZyYW1lc1BlckJsb2NrKCksIG51bUZyYW1lcykKKyAgICAgICAgICAgIDogbUNvbm5lY3RlZC0+cHVsbERhdGEoZnJhbWVQb3NpdGlvbiwgbnVtRnJhbWVzKTsKK30KKworZmxvYXQgKkF1ZGlvRmxvYXRJbnB1dFBvcnQ6OmdldEJsb2NrKCkgeworICAgIGlmIChtQ29ubmVjdGVkID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEF1ZGlvRmxvYXRCbG9ja1BvcnQ6OmdldEJsb2NrKCk7IC8vIGxvYWRlZCB1c2luZyBzZXRWYWx1ZSgpCisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1Db25uZWN0ZWQtPmdldEJsb2NrKCk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdCBBdWRpb1Npbms6OnB1bGwoaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBpbnQzMl90IGFjdHVhbEZyYW1lcyA9IGlucHV0LnB1bGxEYXRhKG1GcmFtZVBvc2l0aW9uLCBudW1GcmFtZXMpOworICAgIG1GcmFtZVBvc2l0aW9uICs9IGFjdHVhbEZyYW1lczsKKyAgICByZXR1cm4gYWN0dWFsRnJhbWVzOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQXVkaW9Qcm9jZXNzb3JCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRhNDZhZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5oCkBAIC0wLDAgKzEsMjkzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQXVkaW9Qcm9jZXNzb3JCYXNlLmgKKyAqCisgKiBBdWRpbyBwcm9jZXNzaW5nIG5vZGUgYW5kIHBvcnRzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYSBzaW1wbGUgZGF0YSBmbG93IGdyYXBoLgorICovCisKKyNpZm5kZWYgRkxPV0dSQVBIX0FVRElPX1BST0NFU1NPUl9CQVNFX0gKKyNkZWZpbmUgRkxPV0dSQVBIX0FVRElPX1BST0NFU1NPUl9CQVNFX0gKKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisvLyBUT0RPIGNvbnNpZGVyIHB1Ymxpc2hpbmcgYWxsIGhlYWRlciBmaWxlcyB1bmRlciAiaW5jbHVkZS9saWJhYXVkaW8vRmxvd0dyYXBoLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCisvLyBEZWZhdWx0IGJsb2NrIHNpemUgdGhhdCBjYW4gYmUgb3ZlcnJpZGRlbiB3aGVuIHRoZSBBdWRpb0Zsb2F0QmxvY2tQb3J0IGlzIGNyZWF0ZWQuCisvLyBJZiBpdCBpcyB0b28gc21hbGwgdGhlbiB3ZSB3aWxsIGhhdmUgdG9vIG11Y2ggb3ZlcmhlYWQgZnJvbSBzd2l0Y2hpbmcgYmV0d2VlbiBub2Rlcy4KKy8vIElmIGl0IGlzIHRvbyBoaWdoIHRoZW4gd2Ugd2lsbCB0aHJhc2ggdGhlIGNhY2hlcy4KK2NvbnN0ZXhwciBpbnQga0RlZmF1bHRCbG9ja1NpemUgPSA4OyAvLyBhcmJpdHJhcnkKKworY2xhc3MgQXVkaW9GbG9hdElucHV0UG9ydDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NsYXNzIEF1ZGlvUHJvY2Vzc29yQmFzZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+QXVkaW9Qcm9jZXNzb3JCYXNlKCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogUGVyZm9ybSBjdXN0b20gZnVuY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhbWVQb3NpdGlvbiBpbmRleCBvZiBmaXJzdCBmcmFtZSB0byBiZSBwcm9jZXNzZWQKKyAgICAgKiBAcGFyYW0gbnVtRnJhbWVzIG1heGltdW0gbnVtYmVyIG9mIGZyYW1lcyByZXF1ZXN0ZWQgZm9yIHByb2Nlc3NpbmcKKyAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBmcmFtZXMgYWN0dWFsbHkgcHJvY2Vzc2VkCisgICAgICovCisgICAgdmlydHVhbCBpbnQzMl90IG9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGUgZnJhbWVQb3NpdGlvbiBpcyBhdCBvciBhZnRlciB0aGUgbGFzdCBmcmFtZSBwb3NpdGlvbiB0aGVuIGNhbGwgb25Qcm9jZXNzKCkuCisgICAgICogVGhpcyBwcmV2ZW50cyBpbmZpbml0ZSByZWN1cnNpb24gaW4gY2FzZSBvZiBjeWNsaWMgZ3JhcGhzLgorICAgICAqIEl0IGFsc28gcHJldmVudHMgbm9kZXMgdXBzdHJlYW0gZnJvbSBhIGJyYW5jaCBmcm9tIGJlaW5nIGV4ZWN1dGVkIHR3aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYW1lUG9zaXRpb24KKyAgICAgKiBAcGFyYW0gbnVtRnJhbWVzCisgICAgICogQHJldHVybgorICAgICAqLworICAgIGludDMyX3QgcHVsbERhdGEoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcyk7CisKK3Byb3RlY3RlZDoKKyAgICBpbnQ2NF90ICBtTGFzdEZyYW1lUG9zaXRpb24gPSAtMTsgLy8gU3RhcnQgYXQgLTEgc28gdGhhdCB0aGUgZmlyc3QgcHVsbCB3b3Jrcy4KKworcHJpdmF0ZToKKyAgICBpbnQzMl90ICBtRnJhbWVzVmFsaWQgPSAwOyAvLyBudW0gdmFsaWQgZnJhbWVzIGluIHRoZSBibG9jaworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICAqIFRoaXMgaXMgYSBjb25uZWN0b3IgdGhhdCBhbGxvd3MgZGF0YSB0byBmbG93IGJldHdlZW4gbW9kdWxlcy4KKyAgKi8KK2NsYXNzIEF1ZGlvUG9ydCB7CitwdWJsaWM6CisgICAgQXVkaW9Qb3J0KEF1ZGlvUHJvY2Vzc29yQmFzZSAmcGFyZW50LCBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSkKKyAgICAgICAgICAgIDogbVBhcmVudChwYXJlbnQpCisgICAgICAgICAgICAsIG1TYW1wbGVzUGVyRnJhbWUoc2FtcGxlc1BlckZyYW1lKSB7CisgICAgfQorCisgICAgLy8gUG9ydHMgYXJlIG9mdGVuIGRlY2xhcmVkIHB1YmxpYy4gU28gbGV0J3MgbWFrZSB0aGVtIG5vbi1jb3B5YWJsZS4KKyAgICBBdWRpb1BvcnQoY29uc3QgQXVkaW9Qb3J0JikgPSBkZWxldGU7CisgICAgQXVkaW9Qb3J0JiBvcGVyYXRvcj0oY29uc3QgQXVkaW9Qb3J0JikgPSBkZWxldGU7CisKKyAgICBpbnQzMl90IGdldFNhbXBsZXNQZXJGcmFtZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TYW1wbGVzUGVyRnJhbWU7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgQXVkaW9Qcm9jZXNzb3JCYXNlICZtUGFyZW50OworCitwcml2YXRlOgorICAgIGNvbnN0IGludDMyX3QgICAgbVNhbXBsZXNQZXJGcmFtZSA9IDE7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBUaGlzIHBvcnQgY29udGFpbnMgYSBmbG9hdCB0eXBlIGJ1ZmZlci4KKyAqIFRoZSBzaXplIGlzIGZyYW1lc1BlckJsb2NrICogc2FtcGxlc1BlckZyYW1lKS4KKyAqLworY2xhc3MgQXVkaW9GbG9hdEJsb2NrUG9ydCAgOiBwdWJsaWMgQXVkaW9Qb3J0IHsKK3B1YmxpYzoKKyAgICBBdWRpb0Zsb2F0QmxvY2tQb3J0KEF1ZGlvUHJvY2Vzc29yQmFzZSAmbVBhcmVudCwKKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lc1BlckJsb2NrID0ga0RlZmF1bHRCbG9ja1NpemUKKyAgICAgICAgICAgICAgICApOworCisgICAgdmlydHVhbCB+QXVkaW9GbG9hdEJsb2NrUG9ydCgpOworCisgICAgaW50MzJfdCBnZXRGcmFtZXNQZXJCbG9jaygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1GcmFtZXNQZXJCbG9jazsKKyAgICB9CisKK3Byb3RlY3RlZDoKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYnVmZmVyIGludGVybmFsIHRvIHRoZSBwb3J0IG9yIGZyb20gYSBjb25uZWN0ZWQgcG9ydAorICAgICAqLworICAgIHZpcnR1YWwgZmxvYXQgKmdldEJsb2NrKCkgeworICAgICAgICByZXR1cm4gbVNhbXBsZUJsb2NrOworICAgIH0KKworCitwcml2YXRlOgorICAgIGNvbnN0IGludDMyX3QgICAgbUZyYW1lc1BlckJsb2NrID0gMTsKKyAgICBmbG9hdCAgICAgICAgICAgKm1TYW1wbGVCbG9jayA9IG51bGxwdHI7IC8vIGFsbG9jYXRlZCBpbiBjb25zdHJ1Y3RvcgorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICAqIFRoZSByZXN1bHRzIG9mIGEgbW9kdWxlIGFyZSBzdG9yZWQgaW4gdGhlIGJ1ZmZlciBvZiB0aGUgb3V0cHV0IHBvcnRzLgorICAqLworY2xhc3MgQXVkaW9GbG9hdE91dHB1dFBvcnQgOiBwdWJsaWMgQXVkaW9GbG9hdEJsb2NrUG9ydCB7CitwdWJsaWM6CisgICAgQXVkaW9GbG9hdE91dHB1dFBvcnQoQXVkaW9Qcm9jZXNzb3JCYXNlICZwYXJlbnQsIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lKQorICAgICAgICAgICAgOiBBdWRpb0Zsb2F0QmxvY2tQb3J0KHBhcmVudCwgc2FtcGxlc1BlckZyYW1lKSB7CisgICAgfQorCisgICAgdmlydHVhbCB+QXVkaW9GbG9hdE91dHB1dFBvcnQoKSA9IGRlZmF1bHQ7CisKKyAgICB1c2luZyBBdWRpb0Zsb2F0QmxvY2tQb3J0OjpnZXRCbG9jazsKKworICAgIC8qKgorICAgICAqIENhbGwgdGhlIHBhcmVudCBtb2R1bGUncyBvblByb2Nlc3MoKSBtZXRob2QuCisgICAgICogVGhhdCBtYXkgcHVsbCBkYXRhIGZyb20gaXRzIGlucHV0cyBhbmQgcmVjdXJzaXZlbHkKKyAgICAgKiBwcm9jZXNzIHRoZSBlbnRpcmUgZ3JhcGguCisgICAgICogQHJldHVybiBudW1iZXIgb2YgZnJhbWVzIGFjdHVhbGx5IHB1bGxlZAorICAgICAqLworICAgIGludDMyX3QgcHVsbERhdGEoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcyk7CisKKyAgICAvKioKKyAgICAgKiBDb25uZWN0IHRvIHRoZSBpbnB1dCBvZiBhbm90aGVyIG1vZHVsZS4KKyAgICAgKiBBbiBpbnB1dCBwb3J0IGNhbiBvbmx5IGhhdmUgb25lIGNvbm5lY3Rpb24uCisgICAgICogQW4gb3V0cHV0IHBvcnQgY2FuIGhhdmUgbXVsdGlwbGUgY29ubmVjdGlvbnMuCisgICAgICogSWYgeW91IGNvbm5lY3QgYSBzZWNvbmQgb3V0cHV0IHBvcnQgdG8gYW4gaW5wdXQgcG9ydAorICAgICAqIHRoZW4gaXQgb3ZlcndyaXRlcyB0aGUgcHJldmlvdXMgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIFRoaXMgbm90IHRocmVhZCBzYWZlLiBEbyBub3QgbW9kaWZ5IHRoZSBncmFwaCB0b3BvbG9neSBmb3JtIGFub3RoZXIgdGhyZWFkIHdoaWxlIHJ1bm5pbmcuCisgICAgICovCisgICAgdm9pZCBjb25uZWN0KEF1ZGlvRmxvYXRJbnB1dFBvcnQgKnBvcnQpOworCisgICAgLyoqCisgICAgICogRGlzY29ubmVjdCBmcm9tIHRoZSBpbnB1dCBvZiBhbm90aGVyIG1vZHVsZS4KKyAgICAgKiBUaGlzIG5vdCB0aHJlYWQgc2FmZS4KKyAgICAgKi8KKyAgICB2b2lkIGRpc2Nvbm5lY3QoQXVkaW9GbG9hdElucHV0UG9ydCAqcG9ydCk7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY2xhc3MgQXVkaW9GbG9hdElucHV0UG9ydCA6IHB1YmxpYyBBdWRpb0Zsb2F0QmxvY2tQb3J0IHsKK3B1YmxpYzoKKyAgICBBdWRpb0Zsb2F0SW5wdXRQb3J0KEF1ZGlvUHJvY2Vzc29yQmFzZSAmcGFyZW50LCBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSkKKyAgICAgICAgICAgIDogQXVkaW9GbG9hdEJsb2NrUG9ydChwYXJlbnQsIHNhbXBsZXNQZXJGcmFtZSkgeworICAgIH0KKworICAgIHZpcnR1YWwgfkF1ZGlvRmxvYXRJbnB1dFBvcnQoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBJZiBjb25uZWN0ZWQgdG8gYW4gb3V0cHV0IHBvcnQgdGhlbiB0aGlzIHdpbGwgcmV0dXJuCisgICAgICogdGhhdCBvdXRwdXQgcG9ydHMgYnVmZmVycy4KKyAgICAgKiBJZiBub3QgY29ubmVjdGVkIHRoZW4gaXQgcmV0dXJucyB0aGUgaW5wdXQgcG9ydHMgb3duIGJ1ZmZlcgorICAgICAqIHdoaWNoIGNhbiBiZSBsb2FkZWQgdXNpbmcgc2V0VmFsdWUoKS4KKyAgICAgKi8KKyAgICBmbG9hdCAqZ2V0QmxvY2soKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIFB1bGwgZGF0YSBmcm9tIGFueSBvdXRwdXQgcG9ydCB0aGF0IGlzIGNvbm5lY3RlZC4KKyAgICAgKi8KKyAgICBpbnQzMl90IHB1bGxEYXRhKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpOworCisgICAgLyoqCisgICAgICogV3JpdGUgZXZlcnkgdmFsdWUgb2YgdGhlIGZsb2F0IGJ1ZmZlci4KKyAgICAgKiBUaGlzIHZhbHVlIHdpbGwgYmUgaWdub3JlZCBpZiBhbiBvdXRwdXQgcG9ydCBpcyBjb25uZWN0ZWQKKyAgICAgKiB0byB0aGlzIHBvcnQuCisgICAgICovCisgICAgdm9pZCBzZXRWYWx1ZShmbG9hdCB2YWx1ZSkgeworICAgICAgICBpbnQgbnVtRmxvYXRzID0ga0RlZmF1bHRCbG9ja1NpemUgKiBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICAgICAgZmxvYXQgKmJ1ZmZlciA9IGdldEJsb2NrKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRmxvYXRzOyBpKyspIHsKKyAgICAgICAgICAgICpidWZmZXIrKyA9IHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29ubmVjdCB0byB0aGUgb3V0cHV0IG9mIGFub3RoZXIgbW9kdWxlLgorICAgICAqIEFuIGlucHV0IHBvcnQgY2FuIG9ubHkgaGF2ZSBvbmUgY29ubmVjdGlvbi4KKyAgICAgKiBBbiBvdXRwdXQgcG9ydCBjYW4gaGF2ZSBtdWx0aXBsZSBjb25uZWN0aW9ucy4KKyAgICAgKiBUaGlzIG5vdCB0aHJlYWQgc2FmZS4KKyAgICAgKi8KKyAgICB2b2lkIGNvbm5lY3QoQXVkaW9GbG9hdE91dHB1dFBvcnQgKnBvcnQpIHsKKyAgICAgICAgYXNzZXJ0KGdldFNhbXBsZXNQZXJGcmFtZSgpID09IHBvcnQtPmdldFNhbXBsZXNQZXJGcmFtZSgpKTsKKyAgICAgICAgbUNvbm5lY3RlZCA9IHBvcnQ7CisgICAgfQorCisgICAgdm9pZCBkaXNjb25uZWN0KEF1ZGlvRmxvYXRPdXRwdXRQb3J0ICpwb3J0KSB7CisgICAgICAgIGFzc2VydChtQ29ubmVjdGVkID09IHBvcnQpOworICAgICAgICAodm9pZCkgcG9ydDsKKyAgICAgICAgbUNvbm5lY3RlZCA9IG51bGxwdHI7CisgICAgfQorCisgICAgdm9pZCBkaXNjb25uZWN0KCkgeworICAgICAgICBtQ29ubmVjdGVkID0gbnVsbHB0cjsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQXVkaW9GbG9hdE91dHB1dFBvcnQgKm1Db25uZWN0ZWQgPSBudWxscHRyOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NsYXNzIEF1ZGlvU291cmNlIDogcHVibGljIEF1ZGlvUHJvY2Vzc29yQmFzZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQXVkaW9Tb3VyY2UoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgICAgICA6IG91dHB1dCgqdGhpcywgY2hhbm5lbENvdW50KSB7CisgICAgfQorCisgICAgdmlydHVhbCB+QXVkaW9Tb3VyY2UoKSA9IGRlZmF1bHQ7CisKKyAgICBBdWRpb0Zsb2F0T3V0cHV0UG9ydCBvdXRwdXQ7CisKKyAgICB2b2lkIHNldERhdGEoY29uc3Qgdm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICAgICAgbURhdGEgPSBkYXRhOworICAgICAgICBtU2l6ZUluRnJhbWVzID0gbnVtRnJhbWVzOworICAgICAgICBtRnJhbWVJbmRleCA9IDA7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgY29uc3Qgdm9pZCAqbURhdGEgPSBudWxscHRyOworICAgIGludDMyX3QgICAgIG1TaXplSW5GcmFtZXMgPSAwOyAvLyBudW1iZXIgb2YgZnJhbWVzIGluIG1EYXRhCisgICAgaW50MzJfdCAgICAgbUZyYW1lSW5kZXggPSAwOyAvLyBpbmRleCBvZiBuZXh0IGZyYW1lIHRvIGJlIHByb2Nlc3NlZAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NsYXNzIEF1ZGlvU2luayA6IHB1YmxpYyBBdWRpb1Byb2Nlc3NvckJhc2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IEF1ZGlvU2luayhpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgICAgIDogaW5wdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkgeworICAgIH0KKworICAgIHZpcnR1YWwgfkF1ZGlvU2luaygpID0gZGVmYXVsdDsKKworICAgIEF1ZGlvRmxvYXRJbnB1dFBvcnQgaW5wdXQ7CisKKyAgICAvKioKKyAgICAgKiBEdW1teSBwcm9jZXNzb3IuIFRoZSB3b3JrIGhhcHBlbnMgaW4gdGhlIHJlYWQoKSBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhbWVQb3NpdGlvbiBpbmRleCBvZiBmaXJzdCBmcmFtZSB0byBiZSBwcm9jZXNzZWQKKyAgICAgKiBAcGFyYW0gbnVtRnJhbWVzCisgICAgICogQHJldHVybiBudW1iZXIgb2YgZnJhbWVzIGFjdHVhbGx5IHByb2Nlc3NlZAorICAgICAqLworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpIGZyYW1lUG9zaXRpb247CisgICAgICAgICh2b2lkKSBudW1GcmFtZXM7CisgICAgICAgIHJldHVybiAwOworICAgIH07CisKKyAgICB2aXJ0dWFsIGludDMyX3QgcmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgaW50MzJfdCBwdWxsKGludDMyX3QgbnVtRnJhbWVzKTsKKworcHJpdmF0ZToKKyAgICBpbnQ2NF90IG1GcmFtZVBvc2l0aW9uID0gMDsKK307CisKK30gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworCisjZW5kaWYgLyogRkxPV0dSQVBIX0FVRElPX1BST0NFU1NPUl9CQVNFX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0NsaXBUb1JhbmdlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0NsaXBUb1JhbmdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDljMjJhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuY3BwCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiQ2xpcFRvUmFuZ2UuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworQ2xpcFRvUmFuZ2U6OkNsaXBUb1JhbmdlKGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICA6IGlucHV0KCp0aGlzLCBjaGFubmVsQ291bnQpCisgICAgICAgICwgb3V0cHV0KCp0aGlzLCBjaGFubmVsQ291bnQpIHsKK30KKworaW50MzJfdCBDbGlwVG9SYW5nZTo6b25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBpbnQzMl90IGZyYW1lc1RvUHJvY2VzcyA9IGlucHV0LnB1bGxEYXRhKGZyYW1lUG9zaXRpb24sIG51bUZyYW1lcyk7CisgICAgY29uc3QgZmxvYXQgKmlucHV0QnVmZmVyID0gaW5wdXQuZ2V0QmxvY2soKTsKKyAgICBmbG9hdCAqb3V0cHV0QnVmZmVyID0gb3V0cHV0LmdldEJsb2NrKCk7CisKKyAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNUb1Byb2Nlc3MgKiBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgICpvdXRwdXRCdWZmZXIrKyA9IHN0ZDo6bWluKG1NYXhpbXVtLCBzdGQ6Om1heChtTWluaW11bSwgKmlucHV0QnVmZmVyKyspKTsKKyAgICB9CisKKyAgICByZXR1cm4gZnJhbWVzVG9Qcm9jZXNzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0NsaXBUb1JhbmdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVlZjI1NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0NsaXBUb1JhbmdlLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGTE9XR1JBUEhfQ0xJUF9UT19SQU5HRV9ICisjZGVmaW5lIEZMT1dHUkFQSF9DTElQX1RPX1JBTkdFX0gKKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorCituYW1lc3BhY2UgZmxvd2dyYXBoIHsKKworLy8gVGhpcyBpcyAzIGRCLCAoMTBeKDMvMjApKSwgdG8gbWF0Y2ggdGhlIG1heGltdW0gaGVhZHJvb20gaW4gQXVkaW9UcmFjayBmb3IgZmxvYXQgZGF0YS4KKy8vIEl0IGlzIGRlc2lnbmVkIHRvIGFsbG93IG9jY2FzaW9uYWwgdHJhbnNpZW50IHBlYWtzLgorY29uc3RleHByIGZsb2F0IGtEZWZhdWx0TWF4SGVhZHJvb20gPSAxLjQxMjUzNzU0ZjsKK2NvbnN0ZXhwciBmbG9hdCBrRGVmYXVsdE1pbkhlYWRyb29tID0gLWtEZWZhdWx0TWF4SGVhZHJvb207CisKK2NsYXNzIENsaXBUb1JhbmdlIDogcHVibGljIEF1ZGlvUHJvY2Vzc29yQmFzZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQ2xpcFRvUmFuZ2UoaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgdmlydHVhbCB+Q2xpcFRvUmFuZ2UoKSA9IGRlZmF1bHQ7CisKKyAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKKworICAgIHZvaWQgc2V0TWluaW11bShmbG9hdCBtaW4pIHsKKyAgICAgICAgbU1pbmltdW0gPSBtaW47CisgICAgfQorCisgICAgZmxvYXQgZ2V0TWluaW11bSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1NaW5pbXVtOworICAgIH0KKworICAgIHZvaWQgc2V0TWF4aW11bShmbG9hdCBtaW4pIHsKKyAgICAgICAgbU1heGltdW0gPSBtaW47CisgICAgfQorCisgICAgZmxvYXQgZ2V0TWF4aW11bSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1NYXhpbXVtOworICAgIH0KKworICAgIEF1ZGlvRmxvYXRJbnB1dFBvcnQgaW5wdXQ7CisgICAgQXVkaW9GbG9hdE91dHB1dFBvcnQgb3V0cHV0OworCitwcml2YXRlOgorICAgIGZsb2F0IG1NaW5pbXVtID0ga0RlZmF1bHRNaW5IZWFkcm9vbTsKKyAgICBmbG9hdCBtTWF4aW11bSA9IGtEZWZhdWx0TWF4SGVhZHJvb207Cit9OworCit9IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX0NMSVBfVE9fUkFOR0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YWFkNTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5jcHAKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiTW9ub1RvTXVsdGlDb252ZXJ0ZXIuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworTW9ub1RvTXVsdGlDb252ZXJ0ZXI6Ok1vbm9Ub011bHRpQ29udmVydGVyKGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICA6IGlucHV0KCp0aGlzLCAxKQorICAgICAgICAsIG91dHB1dCgqdGhpcywgY2hhbm5lbENvdW50KSB7Cit9CisKK01vbm9Ub011bHRpQ29udmVydGVyOjp+TW9ub1RvTXVsdGlDb252ZXJ0ZXIoKSB7IH0KKworaW50MzJfdCBNb25vVG9NdWx0aUNvbnZlcnRlcjo6b25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBpbnQzMl90IGZyYW1lc1RvUHJvY2VzcyA9IGlucHV0LnB1bGxEYXRhKGZyYW1lUG9zaXRpb24sIG51bUZyYW1lcyk7CisKKyAgICBjb25zdCBmbG9hdCAqaW5wdXRCdWZmZXIgPSBpbnB1dC5nZXRCbG9jaygpOworICAgIGZsb2F0ICpvdXRwdXRCdWZmZXIgPSBvdXRwdXQuZ2V0QmxvY2soKTsKKyAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IG91dHB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICAvLyBUT0RPIG1heWJlIG1vdmUgdG8gYXVkaW9fdXRpbCBhcyBhdWRpb19tb25vX3RvX211bHRpKCkKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lc1RvUHJvY2VzczsgaSsrKSB7CisgICAgICAgIC8vIHJlYWQgb25lLCB3cml0ZSBtYW55CisgICAgICAgIGZsb2F0IHNhbXBsZSA9ICppbnB1dEJ1ZmZlcisrOworICAgICAgICBmb3IgKGludCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IGNoYW5uZWxDb3VudDsgY2hhbm5lbCsrKSB7CisgICAgICAgICAgICAqb3V0cHV0QnVmZmVyKysgPSBzYW1wbGU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZyYW1lc1RvUHJvY2VzczsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRkNTNjNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaWZuZGVmIEZMT1dHUkFQSF9NT05PX1RPX01VTFRJX0NPTlZFUlRFUl9ICisjZGVmaW5lIEZMT1dHUkFQSF9NT05PX1RPX01VTFRJX0NPTlZFUlRFUl9ICisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorCituYW1lc3BhY2UgZmxvd2dyYXBoIHsKKworY2xhc3MgTW9ub1RvTXVsdGlDb252ZXJ0ZXIgOiBwdWJsaWMgQXVkaW9Qcm9jZXNzb3JCYXNlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBNb25vVG9NdWx0aUNvbnZlcnRlcihpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICB2aXJ0dWFsIH5Nb25vVG9NdWx0aUNvbnZlcnRlcigpOworCisgICAgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisKKyAgICBBdWRpb0Zsb2F0SW5wdXRQb3J0IGlucHV0OworICAgIEF1ZGlvRmxvYXRPdXRwdXRQb3J0IG91dHB1dDsKK307CisKK30gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworCisjZW5kaWYgLy9GTE9XR1JBUEhfTU9OT19UT19NVUxUSV9DT05WRVJURVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvUmFtcExpbmVhci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9SYW1wTGluZWFyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjYwODI4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvUmFtcExpbmVhci5jcHAKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJSYW1wTGluZWFyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIlJhbXBMaW5lYXIuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworUmFtcExpbmVhcjo6UmFtcExpbmVhcihpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBpbnB1dCgqdGhpcywgY2hhbm5lbENvdW50KQorICAgICAgICAsIG91dHB1dCgqdGhpcywgY2hhbm5lbENvdW50KSB7CisgICAgbVRhcmdldC5zdG9yZSgxLjBmKTsKK30KKwordm9pZCBSYW1wTGluZWFyOjpzZXRMZW5ndGhJbkZyYW1lcyhpbnQzMl90IGZyYW1lcykgeworICAgIG1MZW5ndGhJbkZyYW1lcyA9IGZyYW1lczsKK30KKwordm9pZCBSYW1wTGluZWFyOjpzZXRUYXJnZXQoZmxvYXQgdGFyZ2V0KSB7CisgICAgbVRhcmdldC5zdG9yZSh0YXJnZXQpOworfQorCitmbG9hdCBSYW1wTGluZWFyOjppbnRlcnBvbGF0ZUN1cnJlbnQoKSB7CisgICAgcmV0dXJuIG1MZXZlbFRvIC0gKG1SZW1haW5pbmcgKiBtU2NhbGVyKTsKK30KKworaW50MzJfdCBSYW1wTGluZWFyOjpvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIGludDMyX3QgZnJhbWVzVG9Qcm9jZXNzID0gaW5wdXQucHVsbERhdGEoZnJhbWVQb3NpdGlvbiwgbnVtRnJhbWVzKTsKKyAgICBjb25zdCBmbG9hdCAqaW5wdXRCdWZmZXIgPSBpbnB1dC5nZXRCbG9jaygpOworICAgIGZsb2F0ICpvdXRwdXRCdWZmZXIgPSBvdXRwdXQuZ2V0QmxvY2soKTsKKyAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IG91dHB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKworICAgIGZsb2F0IHRhcmdldCA9IGdldFRhcmdldCgpOworICAgIGlmICh0YXJnZXQgIT0gbUxldmVsVG8pIHsKKyAgICAgICAgLy8gU3RhcnQgbmV3IHJhbXAuIENvbnRpbnVlIGZyb20gcHJldmlvdXMgbGV2ZWwuCisgICAgICAgIG1MZXZlbEZyb20gPSBpbnRlcnBvbGF0ZUN1cnJlbnQoKTsKKyAgICAgICAgbUxldmVsVG8gPSB0YXJnZXQ7CisgICAgICAgIG1SZW1haW5pbmcgPSBtTGVuZ3RoSW5GcmFtZXM7CisgICAgICAgIEFMT0dWKCIlcygpIG1MZXZlbEZyb20gPSAlZiwgbUxldmVsVG8gPSAlZiwgbVJlbWFpbmluZyA9ICVkLCBtU2NhbGVyID0gJWYiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgbUxldmVsRnJvbSwgbUxldmVsVG8sIG1SZW1haW5pbmcsIG1TY2FsZXIpOworICAgICAgICBtU2NhbGVyID0gKG1MZXZlbFRvIC0gbUxldmVsRnJvbSkgLyBtTGVuZ3RoSW5GcmFtZXM7IC8vIGZvciBpbnRlcnBvbGF0aW9uCisgICAgfQorCisgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gZnJhbWVzVG9Qcm9jZXNzOworCisgICAgaWYgKG1SZW1haW5pbmcgPiAwKSB7IC8vIFJhbXBpbmc/IFRoaXMgZG9lc24ndCBoYXBwZW4gdmVyeSBvZnRlbi4KKyAgICAgICAgaW50MzJfdCBmcmFtZXNUb1JhbXAgPSBzdGQ6Om1pbihmcmFtZXNMZWZ0LCBtUmVtYWluaW5nKTsKKyAgICAgICAgZnJhbWVzTGVmdCAtPSBmcmFtZXNUb1JhbXA7CisgICAgICAgIHdoaWxlIChmcmFtZXNUb1JhbXAgPiAwKSB7CisgICAgICAgICAgICBmbG9hdCBjdXJyZW50TGV2ZWwgPSBpbnRlcnBvbGF0ZUN1cnJlbnQoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGNoID0gMDsgY2ggPCBjaGFubmVsQ291bnQ7IGNoKyspIHsKKyAgICAgICAgICAgICAgICAqb3V0cHV0QnVmZmVyKysgPSAqaW5wdXRCdWZmZXIrKyAqIGN1cnJlbnRMZXZlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1SZW1haW5pbmctLTsKKyAgICAgICAgICAgIGZyYW1lc1RvUmFtcC0tOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUHJvY2VzcyBhbnkgZnJhbWVzIGFmdGVyIHRoZSByYW1wLgorICAgIGludDMyX3Qgc2FtcGxlc0xlZnQgPSBmcmFtZXNMZWZ0ICogY2hhbm5lbENvdW50OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2FtcGxlc0xlZnQ7IGkrKykgeworICAgICAgICAqb3V0cHV0QnVmZmVyKysgPSAqaW5wdXRCdWZmZXIrKyAqIG1MZXZlbFRvOworICAgIH0KKworICAgIHJldHVybiBmcmFtZXNUb1Byb2Nlc3M7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9SYW1wTGluZWFyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9SYW1wTGluZWFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRjOGY0MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1JhbXBMaW5lYXIuaApAQCAtMCwwICsxLDg3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9SQU1QX0xJTkVBUl9ICisjZGVmaW5lIEZMT1dHUkFQSF9SQU1QX0xJTkVBUl9ICisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKworbmFtZXNwYWNlIGZsb3dncmFwaCB7CisKK2NsYXNzIFJhbXBMaW5lYXIgOiBwdWJsaWMgQXVkaW9Qcm9jZXNzb3JCYXNlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBSYW1wTGluZWFyKGludDMyX3QgY2hhbm5lbENvdW50KTsKKworICAgIHZpcnR1YWwgflJhbXBMaW5lYXIoKSA9IGRlZmF1bHQ7CisKKyAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgdXNlZCBmb3IgdGhlIG5leHQgcmFtcC4KKyAgICAgKiBDYWxsaW5nIHRoaXMgZG9lcyBub3QgYWZmZWN0IGEgcmFtcCB0aGF0IGlzIGluIHByb2dyZXNzLgorICAgICAqLworICAgIHZvaWQgc2V0TGVuZ3RoSW5GcmFtZXMoaW50MzJfdCBmcmFtZXMpOworCisgICAgaW50MzJfdCBnZXRMZW5ndGhJbkZyYW1lcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1MZW5ndGhJbkZyYW1lczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1heSBiZSBzYWZlbHkgY2FsbGVkIGJ5IGFub3RoZXIgdGhyZWFkLgorICAgICAqIEBwYXJhbSB0YXJnZXQKKyAgICAgKi8KKyAgICB2b2lkIHNldFRhcmdldChmbG9hdCB0YXJnZXQpOworCisgICAgZmxvYXQgZ2V0VGFyZ2V0KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRhcmdldC5sb2FkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9yY2UgdGhlIG5leHRTZWdtZW50IHRvIHN0YXJ0IGZyb20gdGhpcyBsZXZlbC4KKyAgICAgKgorICAgICAqIFdBUk5JTkc6IHRoaXMgY2FuIGNhdXNlIGEgZGlzY29udGludWl0eSBpZiBjYWxsZWQgd2hpbGUgdGhlIHJhbXAgaXMgYmVpbmcgdXNlZC4KKyAgICAgKiBPbmx5IGNhbGwgdGhpcyB3aGVuIHNldHRpbmcgdGhlIGluaXRpYWwgcmFtcC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZXZlbAorICAgICAqLworICAgIHZvaWQgZm9yY2VDdXJyZW50KGZsb2F0IGxldmVsKSB7CisgICAgICAgIG1MZXZlbEZyb20gPSBsZXZlbDsKKyAgICAgICAgbUxldmVsVG8gPSBsZXZlbDsKKyAgICB9CisKKyAgICBBdWRpb0Zsb2F0SW5wdXRQb3J0IGlucHV0OworICAgIEF1ZGlvRmxvYXRPdXRwdXRQb3J0IG91dHB1dDsKKworcHJpdmF0ZToKKworICAgIGZsb2F0IGludGVycG9sYXRlQ3VycmVudCgpOworCisgICAgc3RkOjphdG9taWM8ZmxvYXQ+ICBtVGFyZ2V0OworCisgICAgaW50MzJfdCAgICAgICAgICAgICBtTGVuZ3RoSW5GcmFtZXMgID0gNDgwMDAuMGYgLyAxMDAuMGYgOyAvLyAxMCBtc2VjIGF0IDQ4MDAwIEh6OworICAgIGludDMyX3QgICAgICAgICAgICAgbVJlbWFpbmluZyAgICAgICA9IDA7CisgICAgZmxvYXQgICAgICAgICAgICAgICBtU2NhbGVyICAgICAgICAgID0gMC4wZjsKKyAgICBmbG9hdCAgICAgICAgICAgICAgIG1MZXZlbEZyb20gICAgICAgPSAwLjBmOworICAgIGZsb2F0ICAgICAgICAgICAgICAgbUxldmVsVG8gICAgICAgICA9IDAuMGY7Cit9OworCit9IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX1JBTVBfTElORUFSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtGbG9hdC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rRmxvYXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiM2RjYmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rRmxvYXQuY3BwCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiU2lua0Zsb2F0LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKK1NpbmtGbG9hdDo6U2lua0Zsb2F0KGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICA6IEF1ZGlvU2luayhjaGFubmVsQ291bnQpIHsKK30KKworaW50MzJfdCBTaW5rRmxvYXQ6OnJlYWQodm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBmbG9hdCAqZmxvYXREYXRhID0gKGZsb2F0ICopIGRhdGE7CisgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBpbnB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKworICAgIGludDMyX3QgZnJhbWVzTGVmdCA9IG51bUZyYW1lczsKKyAgICB3aGlsZSAoZnJhbWVzTGVmdCA+IDApIHsKKyAgICAgICAgLy8gUnVuIHRoZSBncmFwaCBhbmQgcHVsbCBkYXRhIHRocm91Z2ggdGhlIGlucHV0IHBvcnQuCisgICAgICAgIGludDMyX3QgZnJhbWVzUmVhZCA9IHB1bGwoZnJhbWVzTGVmdCk7CisgICAgICAgIGlmIChmcmFtZXNSZWFkIDw9IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNvbnN0IGZsb2F0ICpzaWduYWwgPSBpbnB1dC5nZXRCbG9jaygpOworICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNSZWFkICogY2hhbm5lbENvdW50OworICAgICAgICBtZW1jcHkoZmxvYXREYXRhLCBzaWduYWwsIG51bVNhbXBsZXMgKiBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgZmxvYXREYXRhICs9IG51bVNhbXBsZXM7CisgICAgICAgIGZyYW1lc0xlZnQgLT0gZnJhbWVzUmVhZDsKKyAgICB9CisgICAgcmV0dXJuIG51bUZyYW1lcyAtIGZyYW1lc0xlZnQ7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rRmxvYXQuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtGbG9hdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NzVjMDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rRmxvYXQuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNpZm5kZWYgRkxPV0dSQVBIX1NJTktfRkxPQVRfSAorI2RlZmluZSBGTE9XR1JBUEhfU0lOS19GTE9BVF9ICisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorCituYW1lc3BhY2UgZmxvd2dyYXBoIHsKKworY2xhc3MgU2lua0Zsb2F0IDogcHVibGljIEF1ZGlvU2luayB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgU2lua0Zsb2F0KGludDMyX3QgY2hhbm5lbENvdW50KTsKKworICAgIGludDMyX3QgcmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisKK307CisKK30gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworCisjZW5kaWYgLy9GTE9XR1JBUEhfU0lOS19GTE9BVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTE2LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMTYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZWM4ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTE2LmNwcApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWZkZWYgX19BTkRST0lEX18KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIlNpbmtJMTYuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworU2lua0kxNjo6U2lua0kxNihpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBBdWRpb1NpbmsoY2hhbm5lbENvdW50KSB7fQorCitpbnQzMl90IFNpbmtJMTY6OnJlYWQodm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBpbnQxNl90ICpzaG9ydERhdGEgPSAoaW50MTZfdCAqKSBkYXRhOworICAgIGNvbnN0IGludDMyX3QgY2hhbm5lbENvdW50ID0gaW5wdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisKKyAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSBudW1GcmFtZXM7CisgICAgd2hpbGUgKGZyYW1lc0xlZnQgPiAwKSB7CisgICAgICAgIC8vIFJ1biB0aGUgZ3JhcGggYW5kIHB1bGwgZGF0YSB0aHJvdWdoIHRoZSBpbnB1dCBwb3J0LgorICAgICAgICBpbnQzMl90IGZyYW1lc1JlYWQgPSBwdWxsKGZyYW1lc0xlZnQpOworICAgICAgICBpZiAoZnJhbWVzUmVhZCA8PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBmbG9hdCAqc2lnbmFsID0gaW5wdXQuZ2V0QmxvY2soKTsKKyAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzUmVhZCAqIGNoYW5uZWxDb3VudDsKKyNpZmRlZiBfX0FORFJPSURfXworICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQoc2hvcnREYXRhLCBzaWduYWwsIG51bVNhbXBsZXMpOworICAgICAgICBzaG9ydERhdGEgKz0gbnVtU2FtcGxlczsKKyAgICAgICAgc2lnbmFsICs9IG51bVNhbXBsZXM7CisjZWxzZQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgaW50MzJfdCBuID0gKGludDMyX3QpICgqc2lnbmFsKysgKiAzMjc2OC4wZik7CisgICAgICAgICAgICAqc2hvcnREYXRhKysgPSBzdGQ6Om1pbihJTlQxNl9NQVgsIHN0ZDo6bWF4KElOVDE2X01JTiwgbikpOyAvLyBjbGlwCisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBmcmFtZXNMZWZ0IC09IGZyYW1lc1JlYWQ7CisgICAgfQorICAgIHJldHVybiBudW1GcmFtZXMgLSBmcmFtZXNMZWZ0OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kxNi5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kxNi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkODYyNjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTE2LmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGTE9XR1JBUEhfU0lOS19JMTZfSAorI2RlZmluZSBGTE9XR1JBUEhfU0lOS19JMTZfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKworbmFtZXNwYWNlIGZsb3dncmFwaCB7CisKK2NsYXNzIFNpbmtJMTYgOiBwdWJsaWMgQXVkaW9TaW5rIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBTaW5rSTE2KGludDMyX3QgY2hhbm5lbENvdW50KTsKKworICAgIGludDMyX3QgcmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7Cit9OworCit9IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX1NJTktfSTE2X0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMjQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kyNC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU5MjgyOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMjQuY3BwCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZmRlZiBfX0FORFJPSURfXworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiU2lua0kyNC5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCisKK1NpbmtJMjQ6OlNpbmtJMjQoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogQXVkaW9TaW5rKGNoYW5uZWxDb3VudCkge30KKworaW50MzJfdCBTaW5rSTI0OjpyZWFkKHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgdWludDhfdCAqYnl0ZURhdGEgPSAodWludDhfdCAqKSBkYXRhOworICAgIGNvbnN0IGludDMyX3QgY2hhbm5lbENvdW50ID0gaW5wdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisKKyAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSBudW1GcmFtZXM7CisgICAgd2hpbGUgKGZyYW1lc0xlZnQgPiAwKSB7CisgICAgICAgIC8vIFJ1biB0aGUgZ3JhcGggYW5kIHB1bGwgZGF0YSB0aHJvdWdoIHRoZSBpbnB1dCBwb3J0LgorICAgICAgICBpbnQzMl90IGZyYW1lc1JlYWQgPSBwdWxsKGZyYW1lc0xlZnQpOworICAgICAgICBpZiAoZnJhbWVzUmVhZCA8PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBmbG9hdCAqZmxvYXREYXRhID0gaW5wdXQuZ2V0QmxvY2soKTsKKyAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzUmVhZCAqIGNoYW5uZWxDb3VudDsKKyNpZmRlZiBfX0FORFJPSURfXworICAgICAgICBtZW1jcHlfdG9fcDI0X2Zyb21fZmxvYXQoYnl0ZURhdGEsIGZsb2F0RGF0YSwgbnVtU2FtcGxlcyk7CisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0J5dGVzUGVySTI0UGFja2VkID0gMzsKKyAgICAgICAgYnl0ZURhdGEgKz0gbnVtU2FtcGxlcyAqIGtCeXRlc1BlckkyNFBhY2tlZDsKKyAgICAgICAgZmxvYXREYXRhICs9IG51bVNhbXBsZXM7CisjZWxzZQorICAgICAgICBjb25zdCBpbnQzMl90IGtJMjRQYWNrZWRNYXggPSAweDAwN0ZGRkZGOworICAgICAgICBjb25zdCBpbnQzMl90IGtJMjRQYWNrZWRNaW4gPSAweEZGODAwMDAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgaW50MzJfdCBuID0gKGludDMyX3QpICgqZmxvYXREYXRhKysgKiAweDAwODAwMDAwKTsKKyAgICAgICAgICAgIG4gPSBzdGQ6Om1pbihrSTI0UGFja2VkTWF4LCBzdGQ6Om1heChrSTI0UGFja2VkTWluLCBuKSk7IC8vIGNsaXAKKyAgICAgICAgICAgIC8vIFdyaXRlIGFzIGEgcGFja2VkIDI0LWJpdCBpbnRlZ2VyIGluIExpdHRsZSBFbmRpYW4gZm9ybWF0LgorICAgICAgICAgICAgKmJ5dGVEYXRhKysgPSAodWludDhfdCkgbjsKKyAgICAgICAgICAgICpieXRlRGF0YSsrID0gKHVpbnQ4X3QpIChuID4+IDgpOworICAgICAgICAgICAgKmJ5dGVEYXRhKysgPSAodWludDhfdCkgKG4gPj4gMTYpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgZnJhbWVzTGVmdCAtPSBmcmFtZXNSZWFkOworICAgIH0KKyAgICByZXR1cm4gbnVtRnJhbWVzIC0gZnJhbWVzTGVmdDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMjQuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjliNTA1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kyNC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRkxPV0dSQVBIX1NJTktfSTI0X0gKKyNkZWZpbmUgRkxPV0dSQVBIX1NJTktfSTI0X0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCitjbGFzcyBTaW5rSTI0IDogcHVibGljIEF1ZGlvU2luayB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgU2lua0kyNChpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICBpbnQzMl90IHJlYWQodm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9TSU5LX0kyNF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VGbG9hdC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VGbG9hdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJiNjc0ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUZsb2F0LmNwcApAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIlNvdXJjZUZsb2F0LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKK1NvdXJjZUZsb2F0OjpTb3VyY2VGbG9hdChpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBBdWRpb1NvdXJjZShjaGFubmVsQ291bnQpIHsKK30KKworaW50MzJfdCBTb3VyY2VGbG9hdDo6b25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKKworICAgIGZsb2F0ICpvdXRwdXRCdWZmZXIgPSBvdXRwdXQuZ2V0QmxvY2soKTsKKyAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IG91dHB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKworICAgIGludDMyX3QgZnJhbWVzTGVmdCA9IG1TaXplSW5GcmFtZXMgLSBtRnJhbWVJbmRleDsKKyAgICBpbnQzMl90IGZyYW1lc1RvUHJvY2VzcyA9IHN0ZDo6bWluKG51bUZyYW1lcywgZnJhbWVzTGVmdCk7CisgICAgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzVG9Qcm9jZXNzICogY2hhbm5lbENvdW50OworCisgICAgY29uc3QgZmxvYXQgKmZsb2F0QmFzZSA9IChmbG9hdCAqKSBtRGF0YTsKKyAgICBjb25zdCBmbG9hdCAqZmxvYXREYXRhID0gJmZsb2F0QmFzZVttRnJhbWVJbmRleCAqIGNoYW5uZWxDb3VudF07CisgICAgbWVtY3B5KG91dHB1dEJ1ZmZlciwgZmxvYXREYXRhLCBudW1TYW1wbGVzICogc2l6ZW9mKGZsb2F0KSk7CisgICAgbUZyYW1lSW5kZXggKz0gZnJhbWVzVG9Qcm9jZXNzOworICAgIHJldHVybiBmcmFtZXNUb1Byb2Nlc3M7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUZsb2F0LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VGbG9hdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZWVkOWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VGbG9hdC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRkxPV0dSQVBIX1NPVVJDRV9GTE9BVF9ICisjZGVmaW5lIEZMT1dHUkFQSF9TT1VSQ0VfRkxPQVRfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKworbmFtZXNwYWNlIGZsb3dncmFwaCB7CisKK2NsYXNzIFNvdXJjZUZsb2F0IDogcHVibGljIEF1ZGlvU291cmNlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBTb3VyY2VGbG9hdChpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKK307CisKK30gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworCisjZW5kaWYgLy9GTE9XR1JBUEhfU09VUkNFX0ZMT0FUX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkxNi5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMTYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZmNlYzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMTYuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZmRlZiBfX0FORFJPSURfXworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiU291cmNlSTE2LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKK1NvdXJjZUkxNjo6U291cmNlSTE2KGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICA6IEF1ZGlvU291cmNlKGNoYW5uZWxDb3VudCkgeworfQorCitpbnQzMl90IFNvdXJjZUkxNjo6b25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBmbG9hdCAqZmxvYXREYXRhID0gb3V0cHV0LmdldEJsb2NrKCk7CisgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisKKyAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSBtU2l6ZUluRnJhbWVzIC0gbUZyYW1lSW5kZXg7CisgICAgaW50MzJfdCBmcmFtZXNUb1Byb2Nlc3MgPSBzdGQ6Om1pbihudW1GcmFtZXMsIGZyYW1lc0xlZnQpOworICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1RvUHJvY2VzcyAqIGNoYW5uZWxDb3VudDsKKworICAgIGNvbnN0IGludDE2X3QgKnNob3J0QmFzZSA9IHN0YXRpY19jYXN0PGNvbnN0IGludDE2X3QgKj4obURhdGEpOworICAgIGNvbnN0IGludDE2X3QgKnNob3J0RGF0YSA9ICZzaG9ydEJhc2VbbUZyYW1lSW5kZXggKiBjaGFubmVsQ291bnRdOworCisjaWZkZWYgX19BTkRST0lEX18KKyAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMTYoZmxvYXREYXRhLCBzaG9ydERhdGEsIG51bVNhbXBsZXMpOworI2Vsc2UKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICAqZmxvYXREYXRhKysgPSAqc2hvcnREYXRhKysgKiAoMS4wZiAvIDMyNzY4KTsKKyAgICB9CisjZW5kaWYKKworICAgIG1GcmFtZUluZGV4ICs9IGZyYW1lc1RvUHJvY2VzczsKKyAgICByZXR1cm4gZnJhbWVzVG9Qcm9jZXNzOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkxNi5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTE2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIxMTZjZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkxNi5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRkxPV0dSQVBIX1NPVVJDRV9JMTZfSAorI2RlZmluZSBGTE9XR1JBUEhfU09VUkNFX0kxNl9ICisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorCituYW1lc3BhY2UgZmxvd2dyYXBoIHsKKworY2xhc3MgU291cmNlSTE2IDogcHVibGljIEF1ZGlvU291cmNlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBTb3VyY2VJMTYoaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7Cit9OworCit9IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX1NPVVJDRV9JMTZfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkyNC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMxOTg4MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkyNC5jcHAKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJTb3VyY2VJMjQuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworY29uc3RleHByIGludCBrQnl0ZXNQZXJJMjRQYWNrZWQgPSAzOworCitTb3VyY2VJMjQ6OlNvdXJjZUkyNChpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBBdWRpb1NvdXJjZShjaGFubmVsQ291bnQpIHsKK30KKworaW50MzJfdCBTb3VyY2VJMjQ6Om9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgZmxvYXQgKmZsb2F0RGF0YSA9IG91dHB1dC5nZXRCbG9jaygpOworICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gb3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworCisgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbVNpemVJbkZyYW1lcyAtIG1GcmFtZUluZGV4OworICAgIGludDMyX3QgZnJhbWVzVG9Qcm9jZXNzID0gc3RkOjptaW4obnVtRnJhbWVzLCBmcmFtZXNMZWZ0KTsKKyAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNUb1Byb2Nlc3MgKiBjaGFubmVsQ291bnQ7CisKKyAgICBjb25zdCB1aW50OF90ICpieXRlQmFzZSA9ICh1aW50OF90ICopIG1EYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ5dGVEYXRhID0gJmJ5dGVCYXNlW21GcmFtZUluZGV4ICogY2hhbm5lbENvdW50ICoga0J5dGVzUGVySTI0UGFja2VkXTsKKworI2lmZGVmIF9fQU5EUk9JRF9fCisgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21fcDI0KGZsb2F0RGF0YSwgYnl0ZURhdGEsIG51bVNhbXBsZXMpOworI2Vsc2UKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgc2NhbGUgPSAxLiAvIChmbG9hdCkoMVVMIDw8IDMxKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICAvLyBBc3NlbWJsZSB0aGUgZGF0YSBhc3N1bWluZyBMaXR0bGUgRW5kaWFuIGZvcm1hdC4KKyAgICAgICAgaW50MzJfdCBwYWQgPSBieXRlRGF0YVsyXTsKKyAgICAgICAgcGFkIDw8PSA4OworICAgICAgICBwYWQgfD0gYnl0ZURhdGFbMV07CisgICAgICAgIHBhZCA8PD0gODsKKyAgICAgICAgcGFkIHw9IGJ5dGVEYXRhWzBdOworICAgICAgICBwYWQgPDw9IDg7IC8vIFNoaWZ0IHRvIDMyIGJpdCBkYXRhIHNvIHRoZSBzaWduIGlzIGNvcnJlY3QuCisgICAgICAgIGJ5dGVEYXRhICs9IGtCeXRlc1BlckkyNFBhY2tlZDsKKyAgICAgICAgKmZsb2F0RGF0YSsrID0gcGFkICogc2NhbGU7IC8vIHNjYWxlIHRvIHJhbmdlIC0xLjAgdG8gMS4wCisgICAgfQorI2VuZGlmCisKKyAgICBtRnJhbWVJbmRleCArPSBmcmFtZXNUb1Byb2Nlc3M7CisgICAgcmV0dXJuIGZyYW1lc1RvUHJvY2VzczsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMjQuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkyNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZjE0ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMjQuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9TT1VSQ0VfSTI0X0gKKyNkZWZpbmUgRkxPV0dSQVBIX1NPVVJDRV9JMjRfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKworbmFtZXNwYWNlIGZsb3dncmFwaCB7CisKK2NsYXNzIFNvdXJjZUkyNCA6IHB1YmxpYyBBdWRpb1NvdXJjZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgU291cmNlSTI0KGludDMyX3QgY2hhbm5lbENvdW50KTsKKworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9TT1VSQ0VfSTI0X0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oCmluZGV4IDQ5NGVkYmMuLjhlNzg1NTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuaApAQCAtNzcsNyArNzcsNiBAQAogCiAgICAgdmlydHVhbCBpbnQ2NF90IGluY3JlbWVudENsaWVudEZyYW1lQ291bnRlcihpbnQzMl90IGZyYW1lcykgID0gMDsKIAotCiAgICAgdmlydHVhbCBpbnQ2NF90IGdldEZyYW1lc1dyaXR0ZW4oKSBvdmVycmlkZSB7CiAgICAgICAgIHJldHVybiBtRnJhbWVzV3JpdHRlbi5nZXQoKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5jcHAKaW5kZXggNTA1ZjJlZS4uNDBlMjJhYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmNwcApAQCAtNTcsNiArNTcsOSBAQAogCiAgICAgLy8gVHJ5IHRvIGNyZWF0ZSBhbiBBdWRpb1JlY29yZAogCisgICAgY29uc3QgYWF1ZGlvX3Nlc3Npb25faWRfdCByZXF1ZXN0ZWRTZXNzaW9uSWQgPSBidWlsZGVyLmdldFNlc3Npb25JZCgpOworICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFNlc3Npb25JZChyZXF1ZXN0ZWRTZXNzaW9uSWQpOworCiAgICAgLy8gVE9ETyBTdXBwb3J0IFVOU1BFQ0lGSUVEIGluIEF1ZGlvUmVjb3JkLiBGb3Igbm93LCB1c2Ugc3RlcmVvIGlmIHVuc3BlY2lmaWVkLgogICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lID0gKGdldFNhbXBsZXNQZXJGcmFtZSgpID09IEFBVURJT19VTlNQRUNJRklFRCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMiA6IGdldFNhbXBsZXNQZXJGcmFtZSgpOwpAQCAtNjYsMjMgKzY5LDI3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICA6IGJ1aWxkZXIuZ2V0QnVmZmVyQ2FwYWNpdHkoKTsKIAogCi0gICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORTsKKyAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzOwogICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUgPSBnZXRQZXJmb3JtYW5jZU1vZGUoKTsKICAgICBzd2l0Y2ggKHBlcmZNb2RlKSB7CiAgICAgICAgIGNhc2UgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1k6Ci0gICAgICAgICAgICBmbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KSAoQVVESU9fSU5QVVRfRkxBR19GQVNUIHwgQVVESU9fSU5QVVRfRkxBR19SQVcpOworICAgICAgICAgICAgLy8gSWYgdGhlIGFwcCBhc2tzIGZvciBhIHNlc3Npb25JZCB0aGVuIGl0IG1lYW5zIHRoZXkgd2FudCB0byB1c2UgZWZmZWN0cy4KKyAgICAgICAgICAgIC8vIFNvIGRvbid0IHVzZSBSQVcgZmxhZy4KKyAgICAgICAgICAgIGZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpICgocmVxdWVzdGVkU2Vzc2lvbklkID09IEFBVURJT19TRVNTSU9OX0lEX05PTkUpCisgICAgICAgICAgICAgICAgICAgID8gKEFVRElPX0lOUFVUX0ZMQUdfRkFTVCB8IEFVRElPX0lOUFVUX0ZMQUdfUkFXKQorICAgICAgICAgICAgICAgICAgICA6IChBVURJT19JTlBVVF9GTEFHX0ZBU1QpKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfUE9XRVJfU0FWSU5HOgogICAgICAgICBjYXNlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkU6CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBObyBmbGFncy4KKyAgICAgICAgICAgIGZsYWdzID0gQVVESU9fSU5QVVRfRkxBR19OT05FOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCiAgICAgLy8gUHJlc2VydmUgYmVoYXZpb3Igb2YgQVBJIDI2Ci0gICAgaWYgKGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgc2V0Rm9ybWF0KEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKKyAgICBpZiAoZ2V0Rm9ybWF0KCkgPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKKyAgICAgICAgc2V0Rm9ybWF0KEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOwogICAgIH0KIAogICAgIC8vIE1heWJlIGNoYW5nZSBkZXZpY2UgZm9ybWF0IHRvIGdldCBhIEZBU1QgcGF0aC4KQEAgLTk5LDEyICsxMDYsMTIgQEAKICAgICAvLyBXZSBqdXN0IG1heSBub3QgZ2V0IGEgRkFTVCB0cmFjay4KICAgICAvLyBCdXQgd2Ugd291bGRuJ3QgaGF2ZSBhbnl3YXkgd2l0aG91dCB0aGlzIGhhY2suCiAgICAgY29uc3RleHByIGludDMyX3Qga01vc3RMaWtlbHlTYW1wbGVSYXRlRm9yRmFzdCA9IDQ4MDAwOwotICAgIGlmIChnZXRGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVAorICAgIGlmIChnZXRGb3JtYXQoKSA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUCiAgICAgICAgICAgICAmJiBwZXJmTW9kZSA9PSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWQogICAgICAgICAgICAgJiYgKHNhbXBsZXNQZXJGcmFtZSA8PSAyKSAvLyBGQVNUIG9ubHkgZm9yIG1vbm8gYW5kIHN0ZXJlbwogICAgICAgICAgICAgJiYgKGdldFNhbXBsZVJhdGUoKSA9PSBrTW9zdExpa2VseVNhbXBsZVJhdGVGb3JGYXN0CiAgICAgICAgICAgICAgICAgfHwgZ2V0U2FtcGxlUmF0ZSgpID09IEFBVURJT19VTlNQRUNJRklFRCkpIHsKLSAgICAgICAgc2V0RGV2aWNlRm9ybWF0KEFBVURJT19GT1JNQVRfUENNX0kxNik7CisgICAgICAgIHNldERldmljZUZvcm1hdChBVURJT19GT1JNQVRfUENNXzE2X0JJVCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0RGV2aWNlRm9ybWF0KGdldEZvcm1hdCgpKTsKICAgICB9CkBAIC0xNDEsMTQgKzE0OCwxMCBAQAogICAgICAgICAgICAgLnRhZ3MgPSAiIgogICAgIH07CiAKLSAgICBhYXVkaW9fc2Vzc2lvbl9pZF90IHJlcXVlc3RlZFNlc3Npb25JZCA9IGJ1aWxkZXIuZ2V0U2Vzc2lvbklkKCk7Ci0gICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU2Vzc2lvbklkKHJlcXVlc3RlZFNlc3Npb25JZCk7Ci0KICAgICAvLyAtLS0tLS0tLS0tLSBvcGVuIHRoZSBBdWRpb1JlY29yZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAvLyBNaWdodCByZXRyeSwgYnV0IG5ldmVyIG1vcmUgdGhhbiBvbmNlLgogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSArKykgewotICAgICAgICBhdWRpb19mb3JtYXRfdCByZXF1ZXN0ZWRJbnRlcm5hbEZvcm1hdCA9Ci0gICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWREYXRhRm9ybWF0KGdldERldmljZUZvcm1hdCgpKTsKKyAgICAgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgcmVxdWVzdGVkSW50ZXJuYWxGb3JtYXQgPSBnZXREZXZpY2VGb3JtYXQoKTsKIAogICAgICAgICBtQXVkaW9SZWNvcmQgPSBuZXcgQXVkaW9SZWNvcmQoCiAgICAgICAgICAgICAgICAgbU9wUGFja2FnZU5hbWUgLy8gY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUgVE9ETyBkb2VzIG5vdCBjb21waWxlCkBAIC0yMTQsOCArMjE3LDggQEAKICAgICB9CiAKICAgICAvLyBBbGxvY2F0ZSBmb3JtYXQgY29udmVyc2lvbiBidWZmZXIgaWYgbmVlZGVkLgotICAgIGlmIChnZXREZXZpY2VGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYKLSAgICAgICAgJiYgZ2V0Rm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKKyAgICBpZiAoZ2V0RGV2aWNlRm9ybWF0KCkgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQKKyAgICAgICAgJiYgZ2V0Rm9ybWF0KCkgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewogCiAgICAgICAgIGlmIChidWlsZGVyLmdldERhdGFDYWxsYmFja1Byb2MoKSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgY2FsbGJhY2sgdGhlbiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlIGRhdGEgaW50byBhbiBpbnRlcm5hbCBmbG9hdApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmNwcAppbmRleCA1MDVjZDc3Li4xYWMyNTU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmNwcApAQCAtNTksMTggKzU5LDI1IEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCisgICAgY29uc3QgYWF1ZGlvX3Nlc3Npb25faWRfdCByZXF1ZXN0ZWRTZXNzaW9uSWQgPSBidWlsZGVyLmdldFNlc3Npb25JZCgpOworICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFNlc3Npb25JZChyZXF1ZXN0ZWRTZXNzaW9uSWQpOworCiAgICAgLy8gVHJ5IHRvIGNyZWF0ZSBhbiBBdWRpb1RyYWNrCiAgICAgLy8gVXNlIHN0ZXJlbyBpZiB1bnNwZWNpZmllZC4KICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSA9IChnZXRTYW1wbGVzUGVyRnJhbWUoKSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDIgOiBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChzYW1wbGVzUGVyRnJhbWUpOwogCi0gICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOworICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzOwogICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUgPSBnZXRQZXJmb3JtYW5jZU1vZGUoKTsKICAgICBzd2l0Y2gocGVyZk1vZGUpIHsKICAgICAgICAgY2FzZSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWToKICAgICAgICAgICAgIC8vIEJ5cGFzcyB0aGUgbm9ybWFsIG1peGVyIGFuZCBnbyBzdHJhaWdodCB0byB0aGUgRkFTVCBtaXhlci4KLSAgICAgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShBVURJT19PVVRQVVRfRkxBR19GQVNUIHwgQVVESU9fT1VUUFVUX0ZMQUdfUkFXKTsKKyAgICAgICAgICAgIC8vIElmIHRoZSBhcHAgYXNrcyBmb3IgYSBzZXNzaW9uSWQgdGhlbiBpdCBtZWFucyB0aGV5IHdhbnQgdG8gdXNlIGVmZmVjdHMuCisgICAgICAgICAgICAvLyBTbyBkb24ndCB1c2UgUkFXIGZsYWcuCisgICAgICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKChyZXF1ZXN0ZWRTZXNzaW9uSWQgPT0gQUFVRElPX1NFU1NJT05fSURfTk9ORSkKKyAgICAgICAgICAgICAgICAgICAgPyAoQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCB8IEFVRElPX09VVFBVVF9GTEFHX1JBVykKKyAgICAgICAgICAgICAgICAgICAgOiAoQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9QT1dFUl9TQVZJTkc6CkBAIC04MSw2ICs4OCw3IEBACiAgICAgICAgIGNhc2UgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORToKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIC8vIE5vIGZsYWdzLiBVc2UgYSBub3JtYWwgbWl4ZXIgaW4gZnJvbnQgb2YgdGhlIEZBU1QgbWl4ZXIuCisgICAgICAgICAgICBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkU7CiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKQEAgLTg4LDkgKzk2LDkgQEAKIAogICAgIGludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gMDsKIAotICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IChnZXRGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEKQorICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IChnZXRGb3JtYXQoKSA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkKICAgICAgICAgICAgID8gQVVESU9fRk9STUFUX1BDTV9GTE9BVAotICAgICAgICAgICAgOiBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZERhdGFGb3JtYXQoZ2V0Rm9ybWF0KCkpOworICAgICAgICAgICAgOiBnZXRGb3JtYXQoKTsKIAogICAgIC8vIFNldHVwIHRoZSBjYWxsYmFjayBpZiB0aGVyZSBpcyBvbmUuCiAgICAgQXVkaW9UcmFjazo6Y2FsbGJhY2tfdCBjYWxsYmFjayA9IG51bGxwdHI7CkBAIC0xMzUsMTEgKzE0Myw2IEBACiAgICAgICAgICAgICAudGFncyA9ICIiCiAgICAgfTsKIAotICAgIHN0YXRpY19hc3NlcnQoQUFVRElPX1VOU1BFQ0lGSUVEID09IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsICJTZXNzaW9uIElEcyBzaG91bGQgbWF0Y2giKTsKLQotICAgIGFhdWRpb19zZXNzaW9uX2lkX3QgcmVxdWVzdGVkU2Vzc2lvbklkID0gYnVpbGRlci5nZXRTZXNzaW9uSWQoKTsKLSAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTZXNzaW9uSWQocmVxdWVzdGVkU2Vzc2lvbklkKTsKLQogICAgIG1BdWRpb1RyYWNrID0gbmV3IEF1ZGlvVHJhY2soKTsKICAgICBtQXVkaW9UcmFjay0+c2V0KAogICAgICAgICAgICAgQVVESU9fU1RSRUFNX0RFRkFVTFQsICAvLyBpZ25vcmVkIGJlY2F1c2Ugd2UgcGFzcyBhdHRyaWJ1dGVzIGJlbG93CkBAIC0xNzgsMTAgKzE4MSw4IEBACiAKICAgICAvLyBHZXQgdGhlIGFjdHVhbCB2YWx1ZXMgZnJvbSB0aGUgQXVkaW9UcmFjay4KICAgICBzZXRTYW1wbGVzUGVyRnJhbWUobUF1ZGlvVHJhY2stPmNoYW5uZWxDb3VudCgpKTsKLSAgICBhYXVkaW9fZm9ybWF0X3QgYWF1ZGlvRm9ybWF0ID0KLSAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvRGF0YUZvcm1hdChtQXVkaW9UcmFjay0+Zm9ybWF0KCkpOwotICAgIHNldEZvcm1hdChhYXVkaW9Gb3JtYXQpOwotICAgIHNldERldmljZUZvcm1hdChhYXVkaW9Gb3JtYXQpOworICAgIHNldEZvcm1hdChtQXVkaW9UcmFjay0+Zm9ybWF0KCkpOworICAgIHNldERldmljZUZvcm1hdChtQXVkaW9UcmFjay0+Zm9ybWF0KCkpOwogCiAgICAgaW50MzJfdCBhY3R1YWxTYW1wbGVSYXRlID0gbUF1ZGlvVHJhY2stPmdldFNhbXBsZVJhdGUoKTsKICAgICBBTE9HV19JRihhY3R1YWxTYW1wbGVSYXRlICE9IGdldFNhbXBsZVJhdGUoKSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAKaW5kZXggNDBlYmI3Ni4uZjViM2FkNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAKQEAgLTMzLDM5NSArMzMsNiBAQAogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAotLy8gVGhpcyBpcyAzIGRCLCAoMTBeKDMvMjApKSwgdG8gbWF0Y2ggdGhlIG1heGltdW0gaGVhZHJvb20gaW4gQXVkaW9UcmFjayBmb3IgZmxvYXQgZGF0YS4KLS8vIEl0IGlzIGRlc2lnbmVkIHRvIGFsbG93IG9jY2FzaW9uYWwgdHJhbnNpZW50IHBlYWtzLgotI2RlZmluZSBNQVhfSEVBRFJPT00gKDEuNDEyNTM3NTRmKQotI2RlZmluZSBNSU5fSEVBRFJPT00gKDAgLSBNQVhfSEVBRFJPT00pCi0KLWludDMyX3QgQUF1ZGlvQ29udmVydF9mb3JtYXRUb1NpemVJbkJ5dGVzKGFhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKLSAgICBpbnQzMl90IHNpemUgPSBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKLSAgICBzd2l0Y2ggKGZvcm1hdCkgewotICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0kxNjoKLSAgICAgICAgICAgIHNpemUgPSBzaXplb2YoaW50MTZfdCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKLSAgICAgICAgICAgIHNpemUgPSBzaXplb2YoZmxvYXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIHNpemU7Ci19Ci0KLS8vIFRPRE8gZXhwb3NlIGFuZCBjYWxsIGNsYW1wMTZfZnJvbV9mbG9hdCBmdW5jdGlvbiBpbiBwcmltaXRpdmVzLmgKLXN0YXRpYyBpbmxpbmUgaW50MTZfdCBjbGFtcDE2X2Zyb21fZmxvYXQoZmxvYXQgZikgewotICAgIHN0YXRpYyBjb25zdCBmbG9hdCBzY2FsZSA9IDEgPDwgMTU7Ci0gICAgcmV0dXJuIChpbnQxNl90KSByb3VuZGYoZm1heGYoZm1pbmYoZiAqIHNjYWxlLCBzY2FsZSAtIDEuZiksIC1zY2FsZSkpOwotfQotCi0vLyBDbGlwIHRvIHZhbGlkIHJhbmdlIG9mIGEgZmxvYXQgc2FtcGxlIHRvIHByZXZlbnQgZXhjZXNzaXZlIHZvbHVtZS4KLS8vIEJ5IHVzaW5nIGZtaW4gYW5kIGZtYXggd2UgYWxzbyBwcm90ZWN0IGFnYWluc3QgTmFOLgotc3RhdGljIGZsb2F0IGNsaXBUb01pbk1heEhlYWRyb29tKGZsb2F0IGlucHV0KSB7Ci0gICAgcmV0dXJuIGZtaW4oTUFYX0hFQURST09NLCBmbWF4KE1JTl9IRUFEUk9PTSwgaW5wdXQpKTsKLX0KLQotc3RhdGljIGZsb2F0IGNsaXBBbmRDbGFtcEZsb2F0VG9QY20xNihmbG9hdCBzYW1wbGUsIGZsb2F0IHNjYWxlcikgewotICAgIC8vIENsaXAgdG8gdmFsaWQgcmFuZ2Ugb2YgYSBmbG9hdCBzYW1wbGUgdG8gcHJldmVudCBleGNlc3NpdmUgdm9sdW1lLgotICAgIHNhbXBsZSA9IGNsaXBUb01pbk1heEhlYWRyb29tKHNhbXBsZSk7Ci0KLSAgICAvLyBTY2FsZSBhbmQgY29udmVydCB0byBhIHNob3J0LgotICAgIGZsb2F0IGZ2YWwgPSBzYW1wbGUgKiBzY2FsZXI7Ci0gICAgcmV0dXJuIGNsYW1wMTZfZnJvbV9mbG9hdChmdmFsKTsKLX0KLQotdm9pZCBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNihjb25zdCBmbG9hdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUpIHsKLSAgICBjb25zdCBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKLSAgICAgICAgZmxvYXQgc2FtcGxlID0gKnNvdXJjZSsrOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IGNsaXBBbmRDbGFtcEZsb2F0VG9QY20xNihzYW1wbGUsIHNjYWxlcik7Ci0gICAgfQotfQotCi12b2lkIEFBdWRpb0NvbnZlcnRfZmxvYXRUb1BjbTE2KGNvbnN0IGZsb2F0ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpIHsKLSAgICBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUxOwotICAgIC8vIGRpdmlkZSBieSBudW1GcmFtZXMgc28gdGhhdCB3ZSBhbG1vc3QgcmVhY2ggYW1wbGl0dWRlMgotICAgIGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIG51bUZyYW1lczsKLSAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7Ci0gICAgICAgIGZvciAoaW50IHNhbXBsZUluZGV4ID0gMDsgc2FtcGxlSW5kZXggPCBzYW1wbGVzUGVyRnJhbWU7IHNhbXBsZUluZGV4KyspIHsKLSAgICAgICAgICAgIGZsb2F0IHNhbXBsZSA9ICpzb3VyY2UrKzsKLSAgICAgICAgICAgICpkZXN0aW5hdGlvbisrID0gY2xpcEFuZENsYW1wRmxvYXRUb1BjbTE2KHNhbXBsZSwgc2NhbGVyKTsKLSAgICAgICAgfQotICAgICAgICBzY2FsZXIgKz0gZGVsdGE7Ci0gICAgfQotfQotCi0jZGVmaW5lIFNIT1JUX1NDQUxFICAzMjc2OAotCi12b2lkIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZSkgewotICAgIGNvbnN0IGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZSAvIFNIT1JUX1NDQUxFOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7Ci0gICAgICAgIGRlc3RpbmF0aW9uW2ldID0gc291cmNlW2ldICogc2NhbGVyOwotICAgIH0KLX0KLQotLy8gVGhpcyBjb2RlIGFzc3VtZXMgYW1wbGl0dWRlMSBhbmQgYW1wbGl0dWRlMiBhcmUgYmV0d2VlbiAwLjAgYW5kIDEuMAotdm9pZCBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdChjb25zdCBpbnQxNl90ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7Ci0gICAgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlMSAvIFNIT1JUX1NDQUxFOwotICAgIGNvbnN0IGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIChTSE9SVF9TQ0FMRSAqIChmbG9hdCkgbnVtRnJhbWVzKTsKLSAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7Ci0gICAgICAgIGZvciAoaW50IHNhbXBsZUluZGV4ID0gMDsgc2FtcGxlSW5kZXggPCBzYW1wbGVzUGVyRnJhbWU7IHNhbXBsZUluZGV4KyspIHsKLSAgICAgICAgICAgICpkZXN0aW5hdGlvbisrID0gKnNvdXJjZSsrICogc2NhbGVyOwotICAgICAgICB9Ci0gICAgICAgIHNjYWxlciArPSBkZWx0YTsKLSAgICB9Ci19Ci0KLQotLy8gVGhpcyBjb2RlIGFzc3VtZXMgYW1wbGl0dWRlMSBhbmQgYW1wbGl0dWRlMiBhcmUgYmV0d2VlbiAwLjAgYW5kIDEuMAotdm9pZCBBQXVkaW9fbGluZWFyUmFtcChjb25zdCBmbG9hdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMikgewotICAgIGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTE7Ci0gICAgY29uc3QgZmxvYXQgZGVsdGEgPSAoYW1wbGl0dWRlMiAtIGFtcGxpdHVkZTEpIC8gbnVtRnJhbWVzOwotICAgIGZvciAoaW50IGZyYW1lSW5kZXggPSAwOyBmcmFtZUluZGV4IDwgbnVtRnJhbWVzOyBmcmFtZUluZGV4KyspIHsKLSAgICAgICAgZm9yIChpbnQgc2FtcGxlSW5kZXggPSAwOyBzYW1wbGVJbmRleCA8IHNhbXBsZXNQZXJGcmFtZTsgc2FtcGxlSW5kZXgrKykgewotICAgICAgICAgICAgZmxvYXQgc2FtcGxlID0gKnNvdXJjZSsrOwotICAgICAgICAgICAgLy8gQ2xpcCB0byB2YWxpZCByYW5nZSBvZiBhIGZsb2F0IHNhbXBsZSB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSB2b2x1bWUuCi0gICAgICAgICAgICBzYW1wbGUgPSBjbGlwVG9NaW5NYXhIZWFkcm9vbShzYW1wbGUpOwotCi0gICAgICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZSAqIHNjYWxlcjsKLSAgICAgICAgfQotICAgICAgICBzY2FsZXIgKz0gZGVsdGE7Ci0gICAgfQotfQotCi0vLyBUaGlzIGNvZGUgYXNzdW1lcyBhbXBsaXR1ZGUxIGFuZCBhbXBsaXR1ZGUyIGFyZSBiZXR3ZWVuIDAuMCBhbmQgMS4wCi12b2lkIEFBdWRpb19saW5lYXJSYW1wKGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMikgewotICAgIC8vIEJlY2F1c2Ugd2UgYXJlIGNvbnZlcnRpbmcgZnJvbSBpbnQxNiB0byAxbnQxNiwgd2UgZG8gbm90IGhhdmUgdG8gc2NhbGUgYnkgMS8zMjc2OC4KLSAgICBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUxOwotICAgIGNvbnN0IGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIG51bUZyYW1lczsKLSAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7Ci0gICAgICAgIGZvciAoaW50IHNhbXBsZUluZGV4ID0gMDsgc2FtcGxlSW5kZXggPCBzYW1wbGVzUGVyRnJhbWU7IHNhbXBsZUluZGV4KyspIHsKLSAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gY2xpcCBiZWNhdXNlIGludDE2X3QgcmFuZ2UgaXMgaW5oZXJlbnRseSBsaW1pdGVkLgotICAgICAgICAgICAgZmxvYXQgc2FtcGxlID0gICpzb3VyY2UrKyAqIHNjYWxlcjsKLSAgICAgICAgICAgICpkZXN0aW5hdGlvbisrID0gKGludDE2X3QpIHJvdW5kZihzYW1wbGUpOwotICAgICAgICB9Ci0gICAgICAgIHNjYWxlciArPSBkZWx0YTsKLSAgICB9Ci19Ci0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvbnZlcnQgTW9ubyBUbyBTdGVyZW8gYXQgdGhlIHNhbWUgdGltZSBhcyBjb252ZXJ0aW5nIGZvcm1hdC4KLXZvaWQgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oY29uc3QgZmxvYXQgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUpIHsKLSAgICBjb25zdCBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgewotICAgICAgICBmbG9hdCBzYW1wbGUgPSAqc291cmNlKys7Ci0gICAgICAgIGludDE2X3Qgc2FtcGxlMTYgPSBjbGlwQW5kQ2xhbXBGbG9hdFRvUGNtMTYoc2FtcGxlLCBzY2FsZXIpOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTE2OwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTE2OwotICAgIH0KLX0KLQotdm9pZCBBQXVkaW9Db252ZXJ0X2Zvcm1hdE1vbm9Ub1N0ZXJlbyhjb25zdCBmbG9hdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpIHsKLSAgICAvLyBkaXZpZGUgYnkgbnVtRnJhbWVzIHNvIHRoYXQgd2UgYWxtb3N0IHJlYWNoIGFtcGxpdHVkZTIKLSAgICBjb25zdCBmbG9hdCBkZWx0YSA9IChhbXBsaXR1ZGUyIC0gYW1wbGl0dWRlMSkgLyBudW1GcmFtZXM7Ci0gICAgZm9yIChpbnQgZnJhbWVJbmRleCA9IDA7IGZyYW1lSW5kZXggPCBudW1GcmFtZXM7IGZyYW1lSW5kZXgrKykgewotICAgICAgICBjb25zdCBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUxICsgKGZyYW1lSW5kZXggKiBkZWx0YSk7Ci0gICAgICAgIGNvbnN0IGZsb2F0IHNhbXBsZSA9ICpzb3VyY2UrKzsKLSAgICAgICAgaW50MTZfdCBzYW1wbGUxNiA9IGNsaXBBbmRDbGFtcEZsb2F0VG9QY20xNihzYW1wbGUsIHNjYWxlcik7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlMTY7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlMTY7Ci0gICAgfQotfQotCi12b2lkIEFBdWRpb0NvbnZlcnRfZm9ybWF0TW9ub1RvU3RlcmVvKGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKSB7Ci0gICAgY29uc3QgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlIC8gU0hPUlRfU0NBTEU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgewotICAgICAgICBmbG9hdCBzYW1wbGUgPSBzb3VyY2VbaV0gKiBzY2FsZXI7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTsKLSAgICB9Ci19Ci0KLS8vIFRoaXMgY29kZSBhc3N1bWVzIGFtcGxpdHVkZTEgYW5kIGFtcGxpdHVkZTIgYXJlIGJldHdlZW4gMC4wIGFuZCAxLjAKLXZvaWQgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7Ci0gICAgY29uc3QgZmxvYXQgc2NhbGVyMSA9IGFtcGxpdHVkZTEgLyBTSE9SVF9TQ0FMRTsKLSAgICBjb25zdCBmbG9hdCBkZWx0YSA9IChhbXBsaXR1ZGUyIC0gYW1wbGl0dWRlMSkgLyAoU0hPUlRfU0NBTEUgKiAoZmxvYXQpIG51bUZyYW1lcyk7Ci0gICAgZm9yIChpbnQgZnJhbWVJbmRleCA9IDA7IGZyYW1lSW5kZXggPCBudW1GcmFtZXM7IGZyYW1lSW5kZXgrKykgewotICAgICAgICBmbG9hdCBzY2FsZXIgPSBzY2FsZXIxICsgKGZyYW1lSW5kZXggKiBkZWx0YSk7Ci0gICAgICAgIGZsb2F0IHNhbXBsZSA9IHNvdXJjZVtmcmFtZUluZGV4XSAqIHNjYWxlcjsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGU7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlOwotICAgIH0KLX0KLQotLy8gVGhpcyBjb2RlIGFzc3VtZXMgYW1wbGl0dWRlMSBhbmQgYW1wbGl0dWRlMiBhcmUgYmV0d2VlbiAwLjAgYW5kIDEuMAotdm9pZCBBQXVkaW9fbGluZWFyUmFtcE1vbm9Ub1N0ZXJlbyhjb25zdCBmbG9hdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7Ci0gICAgY29uc3QgZmxvYXQgZGVsdGEgPSAoYW1wbGl0dWRlMiAtIGFtcGxpdHVkZTEpIC8gbnVtRnJhbWVzOwotICAgIGZvciAoaW50IGZyYW1lSW5kZXggPSAwOyBmcmFtZUluZGV4IDwgbnVtRnJhbWVzOyBmcmFtZUluZGV4KyspIHsKLSAgICAgICAgZmxvYXQgc2FtcGxlID0gKnNvdXJjZSsrOwotCi0gICAgICAgIC8vIENsaXAgdG8gdmFsaWQgcmFuZ2Ugb2YgYSBmbG9hdCBzYW1wbGUgdG8gcHJldmVudCBleGNlc3NpdmUgdm9sdW1lLgotICAgICAgICBzYW1wbGUgPSBjbGlwVG9NaW5NYXhIZWFkcm9vbShzYW1wbGUpOwotCi0gICAgICAgIGNvbnN0IGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTEgKyAoZnJhbWVJbmRleCAqIGRlbHRhKTsKLSAgICAgICAgZmxvYXQgc2FtcGxlU2NhbGVkID0gc2FtcGxlICogc2NhbGVyOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZVNjYWxlZDsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGVTY2FsZWQ7Ci0gICAgfQotfQotCi0vLyBUaGlzIGNvZGUgYXNzdW1lcyBhbXBsaXR1ZGUxIGFuZCBhbXBsaXR1ZGUyIGFyZSBiZXR3ZWVuIDAuMCBhbmQgMS4wCi12b2lkIEFBdWRpb19saW5lYXJSYW1wTW9ub1RvU3RlcmVvKGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7Ci0gICAgLy8gQmVjYXVzZSB3ZSBhcmUgY29udmVydGluZyBmcm9tIGludDE2IHRvIDFudDE2LCB3ZSBkbyBub3QgaGF2ZSB0byBzY2FsZSBieSAxLzMyNzY4LgotICAgIGNvbnN0IGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIG51bUZyYW1lczsKLSAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7Ci0gICAgICAgIGNvbnN0IGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTEgKyAoZnJhbWVJbmRleCAqIGRlbHRhKTsKLSAgICAgICAgLy8gTm8gbmVlZCB0byBjbGlwIGJlY2F1c2UgaW50MTZfdCByYW5nZSBpcyBpbmhlcmVudGx5IGxpbWl0ZWQuCi0gICAgICAgIGNvbnN0IGZsb2F0IHNhbXBsZSA9ICAqc291cmNlKysgKiBzY2FsZXI7Ci0gICAgICAgIGludDE2X3Qgc2FtcGxlMTYgPSAoaW50MTZfdCkgcm91bmRmKHNhbXBsZSk7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlMTY7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlMTY7Ci0gICAgfQotfQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi12b2lkIEFBdWRpb0RhdGFDb252ZXJ0ZXI6OmNvbnZlcnQoCi0gICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJnNvdXJjZSwKLSAgICAgICAgY29uc3QgRm9ybWF0dGVkRGF0YSAmZGVzdGluYXRpb24sCi0gICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICBmbG9hdCBsZXZlbEZyb20sCi0gICAgICAgIGZsb2F0IGxldmVsVG8pIHsKLQotICAgIGlmIChzb3VyY2UuY2hhbm5lbENvdW50ID09IDEgJiYgZGVzdGluYXRpb24uY2hhbm5lbENvdW50ID09IDIpIHsKLSAgICAgICAgY29udmVydE1vbm9Ub1N0ZXJlbyhzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBXZSBvbmx5IHN1cHBvcnQgbW9ubyB0byBzdGVyZW8gY29udmVyc2lvbi4gT3RoZXJ3aXNlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24KLSAgICAgICAgLy8gbXVzdCBtYXRjaC4KLSAgICAgICAgYXNzZXJ0KHNvdXJjZS5jaGFubmVsQ291bnQgPT0gZGVzdGluYXRpb24uY2hhbm5lbENvdW50KTsKLSAgICAgICAgY29udmVydENoYW5uZWxzTWF0Y2goc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgIH0KLX0KLQotdm9pZCBBQXVkaW9EYXRhQ29udmVydGVyOjpjb252ZXJ0TW9ub1RvU3RlcmVvKAotICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZzb3VyY2UsCi0gICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJmRlc3RpbmF0aW9uLAotICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgZmxvYXQgbGV2ZWxGcm9tLAotICAgICAgICBmbG9hdCBsZXZlbFRvKSB7Ci0KLSAgICAvLyBUaGUgZm9ybWF0cyBhcmUgdmFsaWRhdGVkIHdoZW4gdGhlIHN0cmVhbSBpcyBvcGVuZWQgc28gd2UgZG8gbm90IGhhdmUgdG8KLSAgICAvLyBjaGVjayBmb3IgaWxsZWdhbCBjb21iaW5hdGlvbnMgaGVyZS4KLSAgICBpZiAoc291cmNlLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICBpZiAoZGVzdGluYXRpb24uZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgICAgICBBQXVkaW9fbGluZWFyUmFtcE1vbm9Ub1N0ZXJlbygKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICB9IGVsc2UgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKLSAgICAgICAgICAgIGlmIChsZXZlbEZyb20gIT0gbGV2ZWxUbykgewotICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfZm9ybWF0TW9ub1RvU3RlcmVvKAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2Zvcm1hdE1vbm9Ub1N0ZXJlbygKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoc291cmNlLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKLSAgICAgICAgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICAgICAgaWYgKGxldmVsRnJvbSAhPSBsZXZlbFRvKSB7Ci0gICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfZm9ybWF0TW9ub1RvU3RlcmVvKAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKLSAgICAgICAgICAgIEFBdWRpb19saW5lYXJSYW1wTW9ub1RvU3RlcmVvKAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIEFBdWRpb0RhdGFDb252ZXJ0ZXI6OmNvbnZlcnRDaGFubmVsc01hdGNoKAotICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZzb3VyY2UsCi0gICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJmRlc3RpbmF0aW9uLAotICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgZmxvYXQgbGV2ZWxGcm9tLAotICAgICAgICBmbG9hdCBsZXZlbFRvKSB7Ci0gICAgY29uc3QgaW50MzJfdCBudW1TYW1wbGVzID0gbnVtRnJhbWVzICogc291cmNlLmNoYW5uZWxDb3VudDsKLQotICAgIC8vIFRoZSBmb3JtYXRzIGFyZSB2YWxpZGF0ZWQgd2hlbiB0aGUgc3RyZWFtIGlzIG9wZW5lZCBzbyB3ZSBkbyBub3QgaGF2ZSB0bwotICAgIC8vIGNoZWNrIGZvciBpbGxlZ2FsIGNvbWJpbmF0aW9ucyBoZXJlLgotICAgIGlmIChzb3VyY2UuZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgIGlmIChkZXN0aW5hdGlvbi5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgICAgIEFBdWRpb19saW5lYXJSYW1wKAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIHNvdXJjZS5jaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGVzdGluYXRpb24uZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgewotICAgICAgICAgICAgaWYgKGxldmVsRnJvbSAhPSBsZXZlbFRvKSB7Ci0gICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNigKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHNvdXJjZS5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7Ci0gICAgICAgIGlmIChkZXN0aW5hdGlvbi5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgICAgIGlmIChsZXZlbEZyb20gIT0gbGV2ZWxUbykgewotICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5jaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKLSAgICAgICAgICAgIEFBdWRpb19saW5lYXJSYW1wKAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICBzb3VyY2UuY2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICB9Ci0gICAgfQotfQotCiBzdGF0dXNfdCBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyhhYXVkaW9fcmVzdWx0X3QgcmVzdWx0KSB7CiAgICAgLy8gVGhpcyBjb3ZlcnMgdGhlIGNhc2UgZm9yIEFBVURJT19PSyBhbmQgZm9yIHBvc2l0aXZlIHJlc3VsdHMuCiAgICAgaWYgKHJlc3VsdCA+PSAwKSB7CkBAIC01MTMsNiArMTI0LDkgQEAKIGF1ZGlvX2Zvcm1hdF90IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkRGF0YUZvcm1hdChhYXVkaW9fZm9ybWF0X3QgYWF1ZGlvRm9ybWF0KSB7CiAgICAgYXVkaW9fZm9ybWF0X3QgYW5kcm9pZEZvcm1hdDsKICAgICBzd2l0Y2ggKGFhdWRpb0Zvcm1hdCkgeworICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDoKKyAgICAgICAgYW5kcm9pZEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxUOworICAgICAgICBicmVhazsKICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0kxNjoKICAgICAgICAgYW5kcm9pZEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgICAgICBicmVhazsKQEAgLTUyMCwxNiArMTM0LDE5IEBACiAgICAgICAgIGFuZHJvaWRGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBhbmRyb2lkRm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQ7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZERhdGFGb3JtYXQgMHglMDhYIHVucmVjb2duaXplZCIsIGFhdWRpb0Zvcm1hdCk7CisgICAgICAgIGFuZHJvaWRGb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICAgICAgQUxPR0UoIiVzKCkgMHglMDhYIHVucmVjb2duaXplZCIsIF9fZnVuY19fLCBhYXVkaW9Gb3JtYXQpOwogICAgICAgICBicmVhazsKICAgICB9CiAgICAgcmV0dXJuIGFuZHJvaWRGb3JtYXQ7CiB9CiAKIGFhdWRpb19mb3JtYXRfdCBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb0RhdGFGb3JtYXQoYXVkaW9fZm9ybWF0X3QgYW5kcm9pZEZvcm1hdCkgewotICAgIGFhdWRpb19mb3JtYXRfdCBhYXVkaW9Gb3JtYXQgPSBBQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgYWF1ZGlvX2Zvcm1hdF90IGFhdWRpb0Zvcm1hdDsKICAgICBzd2l0Y2ggKGFuZHJvaWRGb3JtYXQpIHsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9ERUZBVUxUOgorICAgICAgICBhYXVkaW9Gb3JtYXQgPSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOworICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgogICAgICAgICBhYXVkaW9Gb3JtYXQgPSBBQVVESU9fRk9STUFUX1BDTV9JMTY7CiAgICAgICAgIGJyZWFrOwpAQCAtNTM4LDcgKzE1NSw3IEBACiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIGFhdWRpb0Zvcm1hdCA9IEFBVURJT19GT1JNQVRfSU5WQUxJRDsKLSAgICAgICAgQUxPR0UoIkFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvRGF0YUZvcm1hdCAweCUwOFggdW5yZWNvZ25pemVkIiwgYW5kcm9pZEZvcm1hdCk7CisgICAgICAgIEFMT0dFKCIlcygpIDB4JTA4WCB1bnJlY29nbml6ZWQiLCBfX2Z1bmNfXywgYW5kcm9pZEZvcm1hdCk7CiAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICByZXR1cm4gYWF1ZGlvRm9ybWF0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oCmluZGV4IDRiOTc1ZTguLmRjMmIxOTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgKQEAgLTQ1LDE1NiArNDUsNiBAQAogYXVkaW9fc2Vzc2lvbl90IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU2Vzc2lvbklkKGFhdWRpb19zZXNzaW9uX2lkX3Qgc2Vzc2lvbklkKTsKIAogLyoqCi0gKiBDb252ZXJ0IGFuIGFycmF5IG9mIGZsb2F0cyB0byBhbiBhcnJheSBvZiBpbnQxNl90LgotICoKLSAqIEBwYXJhbSBzb3VyY2UKLSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotICogQHBhcmFtIG51bVNhbXBsZXMgbnVtYmVyIG9mIHZhbHVlcyBpbiB0aGUgYXJyYXkKLSAqIEBwYXJhbSBhbXBsaXR1ZGUgbGV2ZWwgYmV0d2VlbiAwLjAgYW5kIDEuMAotICovCi12b2lkIEFBdWRpb0NvbnZlcnRfZmxvYXRUb1BjbTE2KGNvbnN0IGZsb2F0ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZSk7Ci0KLS8qKgotICogQ29udmVydCBmbG9hdHMgdG8gaW50MTZfdCBhbmQgc2NhbGUgYnkgYSBsaW5lYXIgcmFtcC4KLSAqCi0gKiBUaGUgcmFtcCBzdG9wcyBqdXN0IHNob3J0IG9mIHJlYWNoaW5nIGFtcGxpdHVkZTIgc28gdGhhdCB0aGUgbmV4dAotICogcmFtcCBjYW4gc3RhcnQgYXQgYW1wbGl0dWRlMiB3aXRob3V0IGNhdXNpbmcgYSBkaXNjb250aW51aXR5LgotICoKLSAqIEBwYXJhbSBzb3VyY2UKLSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotICogQHBhcmFtIG51bUZyYW1lcwotICogQHBhcmFtIHNhbXBsZXNQZXJGcmFtZSBBS0EgbnVtYmVyIG9mIGNoYW5uZWxzCi0gKiBAcGFyYW0gYW1wbGl0dWRlMSBsZXZlbCBhdCBzdGFydCBvZiByYW1wLCBiZXR3ZWVuIDAuMCBhbmQgMS4wCi0gKiBAcGFyYW0gYW1wbGl0dWRlMiBsZXZlbCBwYXN0IGVuZCBvZiByYW1wLCBiZXR3ZWVuIDAuMCBhbmQgMS4wCi0gKi8KLXZvaWQgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoY29uc3QgZmxvYXQgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMik7Ci0KLS8qKgotICogQ29udmVydCBpbnQxNl90IGFycmF5IHRvIGZsb2F0IGFycmF5IHJhbmdpbmcgZnJvbSAtMS4wIHRvICsxLjAuCi0gKiBAcGFyYW0gc291cmNlCi0gKiBAcGFyYW0gZGVzdGluYXRpb24KLSAqIEBwYXJhbSBudW1TYW1wbGVzCi0gKi8KLS8vdm9pZCBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdChjb25zdCBpbnQxNl90ICpzb3VyY2UsIGludDMyX3QgbnVtU2FtcGxlcywKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24pOwotCi0vKioKLSAqCi0gKiBDb252ZXJ0IGludDE2X3QgYXJyYXkgdG8gZmxvYXQgYXJyYXkgcmFuZ2luZyBmcm9tICsvLSBhbXBsaXR1ZGUuCi0gKiBAcGFyYW0gc291cmNlCi0gKiBAcGFyYW0gZGVzdGluYXRpb24KLSAqIEBwYXJhbSBudW1TYW1wbGVzCi0gKiBAcGFyYW0gYW1wbGl0dWRlCi0gKi8KLXZvaWQgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKTsKLQotLyoqCi0gKiBDb252ZXJ0IGZsb2F0cyB0byBpbnQxNl90IGFuZCBzY2FsZSBieSBhIGxpbmVhciByYW1wLgotICoKLSAqIFRoZSByYW1wIHN0b3BzIGp1c3Qgc2hvcnQgb2YgcmVhY2hpbmcgYW1wbGl0dWRlMiBzbyB0aGF0IHRoZSBuZXh0Ci0gKiByYW1wIGNhbiBzdGFydCBhdCBhbXBsaXR1ZGUyIHdpdGhvdXQgY2F1c2luZyBhIGRpc2NvbnRpbnVpdHkuCi0gKgotICogQHBhcmFtIHNvdXJjZQotICogQHBhcmFtIGRlc3RpbmF0aW9uCi0gKiBAcGFyYW0gbnVtRnJhbWVzCi0gKiBAcGFyYW0gc2FtcGxlc1BlckZyYW1lIEFLQSBudW1iZXIgb2YgY2hhbm5lbHMKLSAqIEBwYXJhbSBhbXBsaXR1ZGUxIGxldmVsIGF0IHN0YXJ0IG9mIHJhbXAsIGJldHdlZW4gMC4wIGFuZCAxLjAKLSAqIEBwYXJhbSBhbXBsaXR1ZGUyIGxldmVsIGF0IGVuZCBvZiByYW1wLCBiZXR3ZWVuIDAuMCBhbmQgMS4wCi0gKi8KLXZvaWQgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMik7Ci0KLS8qKgotICogU2NhbGUgZmxvYXRzIGJ5IGEgbGluZWFyIHJhbXAuCi0gKgotICogVGhlIHJhbXAgc3RvcHMganVzdCBzaG9ydCBvZiByZWFjaGluZyBhbXBsaXR1ZGUyIHNvIHRoYXQgdGhlIG5leHQKLSAqIHJhbXAgY2FuIHN0YXJ0IGF0IGFtcGxpdHVkZTIgd2l0aG91dCBjYXVzaW5nIGEgZGlzY29udGludWl0eS4KLSAqCi0gKiBAcGFyYW0gc291cmNlCi0gKiBAcGFyYW0gZGVzdGluYXRpb24KLSAqIEBwYXJhbSBudW1GcmFtZXMKLSAqIEBwYXJhbSBzYW1wbGVzUGVyRnJhbWUKLSAqIEBwYXJhbSBhbXBsaXR1ZGUxCi0gKiBAcGFyYW0gYW1wbGl0dWRlMgotICovCi12b2lkIEFBdWRpb19saW5lYXJSYW1wKGNvbnN0IGZsb2F0ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKTsKLQotLyoqCi0gKiBTY2FsZSBpbnQxNl90J3MgYnkgYSBsaW5lYXIgcmFtcC4KLSAqCi0gKiBUaGUgcmFtcCBzdG9wcyBqdXN0IHNob3J0IG9mIHJlYWNoaW5nIGFtcGxpdHVkZTIgc28gdGhhdCB0aGUgbmV4dAotICogcmFtcCBjYW4gc3RhcnQgYXQgYW1wbGl0dWRlMiB3aXRob3V0IGNhdXNpbmcgYSBkaXNjb250aW51aXR5LgotICoKLSAqIEBwYXJhbSBzb3VyY2UKLSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotICogQHBhcmFtIG51bUZyYW1lcwotICogQHBhcmFtIHNhbXBsZXNQZXJGcmFtZQotICogQHBhcmFtIGFtcGxpdHVkZTEKLSAqIEBwYXJhbSBhbXBsaXR1ZGUyCi0gKi8KLXZvaWQgQUF1ZGlvX2xpbmVhclJhbXAoY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKTsKLQotY2xhc3MgQUF1ZGlvRGF0YUNvbnZlcnRlciB7Ci1wdWJsaWM6Ci0KLSAgICBzdHJ1Y3QgRm9ybWF0dGVkRGF0YSB7Ci0KLSAgICAgICAgRm9ybWF0dGVkRGF0YSh2b2lkICpkYXRhLCBhYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQzMl90IGNoYW5uZWxDb3VudCkKLSAgICAgICAgICAgIDogZGF0YShkYXRhKQotICAgICAgICAgICAgLCBmb3JtYXQoZm9ybWF0KQotICAgICAgICAgICAgLCBjaGFubmVsQ291bnQoY2hhbm5lbENvdW50KSB7fQotCi0gICAgICAgIGNvbnN0IHZvaWQgICAgICAgICAgICAqZGF0YSA9IG51bGxwdHI7Ci0gICAgICAgIGNvbnN0IGFhdWRpb19mb3JtYXRfdCAgZm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDsKLSAgICAgICAgY29uc3QgaW50MzJfdCAgICAgICAgICBjaGFubmVsQ291bnQgPSAxOwotICAgIH07Ci0KLSAgICBzdGF0aWMgdm9pZCBjb252ZXJ0KGNvbnN0IEZvcm1hdHRlZERhdGEgJnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZXZlbFRvKTsKLQotcHJpdmF0ZToKLSAgICBzdGF0aWMgdm9pZCBjb252ZXJ0TW9ub1RvU3RlcmVvKGNvbnN0IEZvcm1hdHRlZERhdGEgJnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZXZlbFRvKTsKLQotICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRDaGFubmVsc01hdGNoKGNvbnN0IEZvcm1hdHRlZERhdGEgJnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGV2ZWxUbyk7Ci19OwotCi0vKioKICAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFuZCBwcmV2ZW50IG51bWVyaWMgb3ZlcmZsb3cuCiAgKiBUaGUgKnNpemVJbkJ5dGVzIHdpbGwgYmUgc2V0IHRvIHplcm8gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCiAgKgpAQCAtMjM0LDEyICs4NCw2IEBACiAgKi8KIGF1ZGlvX3NvdXJjZV90IEFBdWRpb0NvbnZlcnRfaW5wdXRQcmVzZXRUb0F1ZGlvU291cmNlKGFhdWRpb19pbnB1dF9wcmVzZXRfdCBwcmVzZXQpOwogCi0vKioKLSAqIEByZXR1cm4gdGhlIHNpemUgb2YgYSBzYW1wbGUgb2YgdGhlIGdpdmVuIGZvcm1hdCBpbiBieXRlcyBvciBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVAotICovCi1pbnQzMl90IEFBdWRpb0NvbnZlcnRfZm9ybWF0VG9TaXplSW5CeXRlcyhhYXVkaW9fZm9ybWF0X3QgZm9ybWF0KTsKLQotCiAvLyBOb3RlIHRoYXQgdGhpcyBjb2RlIG1heSBiZSByZXBsYWNlZCBieSBTZXR0aW5ncyBvciBieSBzb21lIG90aGVyIHN5c3RlbSBjb25maWd1cmF0aW9uIHRvb2wuCiAKICNkZWZpbmUgQUFVRElPX1BST1BfTU1BUF9QT0xJQ1kgICAgICAgICAgICJhYXVkaW8ubW1hcF9wb2xpY3kiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTGluZWFyUmFtcC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTGluZWFyUmFtcC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MTRiYmYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0xpbmVhclJhbXAuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkxpbmVhclJhbXAuaCIKLQotYm9vbCBMaW5lYXJSYW1wOjppc1JhbXBpbmcoKSB7Ci0gICAgZmxvYXQgdGFyZ2V0ID0gbVRhcmdldC5sb2FkKCk7Ci0gICAgaWYgKHRhcmdldCAhPSBtTGV2ZWxUbykgewotICAgICAgICAvLyBVcGRhdGUgdGFyZ2V0LiBDb250aW51ZSBmcm9tIHByZXZpb3VzIGxldmVsLgotICAgICAgICBtTGV2ZWxUbyA9IHRhcmdldDsKLSAgICAgICAgbVJlbWFpbmluZyA9IG1MZW5ndGhJbkZyYW1lczsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG1SZW1haW5pbmcgPiAwOwotICAgIH0KLX0KLQotYm9vbCBMaW5lYXJSYW1wOjpuZXh0U2VnbWVudChpbnQzMl90IGZyYW1lcywgZmxvYXQgKmxldmVsRnJvbSwgZmxvYXQgKmxldmVsVG8pIHsKLSAgICBib29sIHJhbXBpbmcgPSBpc1JhbXBpbmcoKTsKLSAgICAqbGV2ZWxGcm9tID0gbUxldmVsRnJvbTsKLSAgICBpZiAocmFtcGluZykgewotICAgICAgICBmbG9hdCBsZXZlbDsKLSAgICAgICAgaWYgKGZyYW1lcyA+PSBtUmVtYWluaW5nKSB7Ci0gICAgICAgICAgICBsZXZlbCA9IG1MZXZlbFRvOwotICAgICAgICAgICAgbVJlbWFpbmluZyA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBJbnRlcnBvbGF0ZSB0byBhIHBvaW50IGFsb25nIHRoZSBmdWxsIHJhbXAuCi0gICAgICAgICAgICBsZXZlbCA9IG1MZXZlbEZyb20gKyAoZnJhbWVzICogKG1MZXZlbFRvIC0gbUxldmVsRnJvbSkgLyBtUmVtYWluaW5nKTsKLSAgICAgICAgICAgIG1SZW1haW5pbmcgLT0gZnJhbWVzOwotICAgICAgICB9Ci0gICAgICAgIG1MZXZlbEZyb20gPSBsZXZlbDsgLy8gZm9yIG5leHQgcmFtcAotICAgICAgICAqbGV2ZWxUbyA9IGxldmVsOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICpsZXZlbFRvID0gbUxldmVsVG87Ci0gICAgfQotICAgIHJldHVybiByYW1waW5nOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9MaW5lYXJSYW1wLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTGluZWFyUmFtcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjFiOGUwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9MaW5lYXJSYW1wLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFBVURJT19MSU5FQVJfUkFNUF9ICi0jZGVmaW5lIEFBVURJT19MSU5FQVJfUkFNUF9ICi0KLSNpbmNsdWRlIDxhdG9taWM+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLS8qKgotICogR2VuZXJhdGUgc2VnbWVudHMgYWxvbmcgYSBsaW5lYXIgcmFtcC4KLSAqIFRoZSByYW1wIHRhcmdldCBjYW4gYmUgdXBkYXRlZCBmcm9tIGFub3RoZXIgdGhyZWFkLgotICogV2hlbiB0aGUgdGFyZ2V0IGlzIHVwZGF0ZWQsIGEgbmV3IHJhbXAgaXMgc3RhcnRlZCBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uLgotICoKLSAqIFRoZSBmaXJzdCByYW1wIHN0YXJ0cyBhdCAwLjAuCi0gKgotICovCi1jbGFzcyBMaW5lYXJSYW1wIHsKLXB1YmxpYzoKLSAgICBMaW5lYXJSYW1wKCkgewotICAgICAgICBtVGFyZ2V0LnN0b3JlKDEuMGYpOwotICAgIH0KLQotICAgIHZvaWQgc2V0TGVuZ3RoSW5GcmFtZXMoaW50MzJfdCBmcmFtZXMpIHsKLSAgICAgICAgbUxlbmd0aEluRnJhbWVzID0gZnJhbWVzOwotICAgIH0KLQotICAgIGludDMyX3QgZ2V0TGVuZ3RoSW5GcmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiBtTGVuZ3RoSW5GcmFtZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtYXkgYmUgY2FsbGVkIGJ5IGFub3RoZXIgdGhyZWFkLgotICAgICAqIEBwYXJhbSB0YXJnZXQKLSAgICAgKi8KLSAgICB2b2lkIHNldFRhcmdldChmbG9hdCB0YXJnZXQpIHsKLSAgICAgICAgbVRhcmdldC5zdG9yZSh0YXJnZXQpOwotICAgIH0KLQotICAgIGZsb2F0IGdldFRhcmdldCgpIHsKLSAgICAgICAgcmV0dXJuIG1UYXJnZXQubG9hZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvcmNlIHRoZSBuZXh0U2VnbWVudCB0byBzdGFydCBmcm9tIHRoaXMgbGV2ZWwuCi0gICAgICoKLSAgICAgKiBXQVJOSU5HOiB0aGlzIGNhbiBjYXVzZSBhIGRpc2NvbnRpbnVpdHkgaWYgY2FsbGVkIHdoaWxlIHRoZSByYW1wIGlzIGJlaW5nIHVzZWQuCi0gICAgICogT25seSBjYWxsIHRoaXMgd2hlbiBzZXR0aW5nIHRoZSBpbml0aWFsIHJhbXAuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGV2ZWwKLSAgICAgKi8KLSAgICB2b2lkIGZvcmNlQ3VycmVudChmbG9hdCBsZXZlbCkgewotICAgICAgICBtTGV2ZWxGcm9tID0gbGV2ZWw7Ci0gICAgICAgIG1MZXZlbFRvID0gbGV2ZWw7IC8vIGZvcmNlcyBhIHJhbXAgaWYgaXQgZG9lcyBub3QgbWF0Y2ggdGFyZ2V0Ci0gICAgfQotCi0gICAgZmxvYXQgZ2V0Q3VycmVudCgpIHsKLSAgICAgICAgcmV0dXJuIG1MZXZlbEZyb207Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGxldmVscyBmb3IgbmV4dCByYW1wIHNlZ21lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZnJhbWVzIG51bWJlciBvZiBmcmFtZXMgaW4gdGhlIHNlZ21lbnQKLSAgICAgKiBAcGFyYW0gbGV2ZWxGcm9tIHBvaW50ZXIgdG8gc3RhcnRpbmcgYW1wbGl0dWRlCi0gICAgICogQHBhcmFtIGxldmVsVG8gcG9pbnRlciB0byBlbmRpbmcgYW1wbGl0dWRlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHJhbXAgaXMgc3RpbGwgbW92aW5nIHRvd2FyZHMgdGhlIHRhcmdldAotICAgICAqLwotICAgIGJvb2wgbmV4dFNlZ21lbnQoaW50MzJfdCBmcmFtZXMsIGZsb2F0ICpsZXZlbEZyb20sIGZsb2F0ICpsZXZlbFRvKTsKLQotcHJpdmF0ZToKLQotICAgIGJvb2wgaXNSYW1waW5nKCk7Ci0KLSAgICBzdGQ6OmF0b21pYzxmbG9hdD4gICBtVGFyZ2V0OwotCi0gICAgaW50MzJfdCBtTGVuZ3RoSW5GcmFtZXMgID0gNDgwMDAgLyAxMDA7IC8vIDEwIG1zZWMgYXQgNDgwMDAgSHoKLSAgICBpbnQzMl90IG1SZW1haW5pbmcgICAgICAgPSAwOwotICAgIGZsb2F0ICAgbUxldmVsRnJvbSAgICAgICA9IDAuMGY7Ci0gICAgZmxvYXQgICBtTGV2ZWxUbyAgICAgICAgID0gMC4wZjsKLX07Ci0KLQotI2VuZGlmIC8vQUFVRElPX0xJTkVBUl9SQU1QX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggNjgxOTRkYi4uY2IyNDNhMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTE5LDYgKzE5LDE4IEBACiB9CiAKIGNjX3Rlc3QgeworICAgIG5hbWU6ICJ0ZXN0X2Nsb2NrX21vZGVsIiwKKyAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInRlc3RfY2xvY2tfbW9kZWwuY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmFhdWRpbyIsCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CiAgICAgbmFtZTogInRlc3RfYmxvY2tfYWRhcHRlciIsCiAgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCiAgICAgc3JjczogWyJ0ZXN0X2Jsb2NrX2FkYXB0ZXIuY3BwIl0sCkBAIC0zNCwxMyArNDYsNiBAQAogfQogCiBjY190ZXN0IHsKLSAgICBuYW1lOiAidGVzdF9saW5lYXJfcmFtcCIsCi0gICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCi0gICAgc3JjczogWyJ0ZXN0X2xpbmVhcl9yYW1wLmNwcCJdLAotICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAotfQotCi1jY190ZXN0IHsKICAgICBuYW1lOiAidGVzdF9vcGVuX3BhcmFtcyIsCiAgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCiAgICAgc3JjczogWyJ0ZXN0X29wZW5fcGFyYW1zLmNwcCJdLApAQCAtMTY3LDMgKzE3MiwyNyBAQAogICAgIHNyY3M6IFsidGVzdF9hdG9taWNfZmlmby5jcHAiXSwKICAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW8iXSwKIH0KKworY2NfdGVzdCB7CisgICAgbmFtZTogInRlc3RfZmxvd2dyYXBoIiwKKyAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInRlc3RfZmxvd2dyYXBoLmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhYXVkaW8iLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogInRlc3RfcmV0dXJuX3N0b3AiLAorICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsidGVzdF9yZXR1cm5fc3RvcC5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYWF1ZGlvIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdG9taWNfZmlmby5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdG9taWNfZmlmby5jcHAKaW5kZXggMGVkZmViZS4uMTMwZWY0MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXRvbWljX2ZpZm8uY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2F0b21pY19maWZvLmNwcApAQCAtMTU4LDE0ICsxNTgsMTQgQEAKICAgICAgICAgLy8gRG9lcyB0aGUgc3VtIG9mIHRoZSB0d28gcGFydHMgbWF0Y2ggdGhlIGF2YWlsYWJsZSB2YWx1ZSByZXR1cm5lZD8KICAgICAgICAgLy8gRm9yIEVtcHR5Um9vbQogICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0F2YWlsYWJsZSA9Ci0gICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCk7CisgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKICAgICAgICAgZmlmb19mcmFtZXNfdCB3cmFwQXZhaWxhYmxlID0gbUZpZm9CdWZmZXIuZ2V0RW1wdHlSb29tQXZhaWxhYmxlKCZ3cmFwcGluZ0J1ZmZlcik7CiAgICAgICAgIEVYUEVDVF9FUShmcmFtZXNBdmFpbGFibGUsIHdyYXBBdmFpbGFibGUpOwogICAgICAgICBmaWZvX2ZyYW1lc190IGJvdGhBdmFpbGFibGUgPSB3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbMF0gKyB3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbMV07CiAgICAgICAgIEVYUEVDVF9FUShmcmFtZXNBdmFpbGFibGUsIGJvdGhBdmFpbGFibGUpOwogICAgICAgICAvLyBGb3IgRnVsbERhdGEKICAgICAgICAgZnJhbWVzQXZhaWxhYmxlID0KLSAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOworICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKICAgICAgICAgd3JhcEF2YWlsYWJsZSA9IG1GaWZvQnVmZmVyLmdldEZ1bGxEYXRhQXZhaWxhYmxlKCZ3cmFwcGluZ0J1ZmZlcik7CiAgICAgICAgIEVYUEVDVF9FUShmcmFtZXNBdmFpbGFibGUsIHdyYXBBdmFpbGFibGUpOwogICAgICAgICBib3RoQXZhaWxhYmxlID0gd3JhcHBpbmdCdWZmZXIubnVtRnJhbWVzWzBdICsgd3JhcHBpbmdCdWZmZXIubnVtRnJhbWVzWzFdOwpAQCAtMTk4LDcgKzE5OCw3IEBACiAgICAgLy8gV3JpdGUgZGF0YSBidXQgZG8gbm90IG92ZXJmbG93LgogICAgIHZvaWQgd3JpdGVNdWx0aXBsZURhdGFGcmFtZXMoZmlmb19mcmFtZXNfdCBudW1GcmFtZXMpIHsKICAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPQotICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOworICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCk7CiAgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzVG9Xcml0ZSA9IHN0ZDo6bWluKGZyYW1lc0F2YWlsYWJsZSwgbnVtRnJhbWVzKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZXNUb1dyaXRlOyBpKyspIHsKICAgICAgICAgICAgIG1EYXRhW2ldID0gbU5leHRXcml0ZUluZGV4Kys7CkBAIC0yMTAsNyArMjEwLDcgQEAKICAgICAvLyBSZWFkIHdoYXRldmVyIGRhdGEgaXMgYXZhaWxhYmxlLCBEbyBub3QgdW5kZXJmbG93LgogICAgIHZvaWQgdmVyaWZ5TXVsdGlwbGVEYXRhRnJhbWVzKGZpZm9fZnJhbWVzX3QgbnVtRnJhbWVzKSB7CiAgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0KLSAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOworICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKICAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNUb1JlYWQgPSBzdGQ6Om1pbihmcmFtZXNBdmFpbGFibGUsIG51bUZyYW1lcyk7CiAgICAgICAgIGZpZm9fZnJhbWVzX3QgYWN0dWFsID0gbUZpZm9CdWZmZXIucmVhZChtRGF0YSwgZnJhbWVzVG9SZWFkKTsKICAgICAgICAgQVNTRVJUX0VRKGZyYW1lc1RvUmVhZCwgYWN0dWFsKTsKQEAgLTIyMiw3ICsyMjIsNyBAQAogICAgIC8vIFJlYWQgc3BlY2lmaWVkIG51bWJlciBvZiBmcmFtZXMKICAgICB2b2lkIHZlcmlmeVJlcXVlc3RlZERhdGEoZmlmb19mcmFtZXNfdCBudW1GcmFtZXMpIHsKICAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPQotICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CisgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOwogICAgICAgICBBU1NFUlRfTEUobnVtRnJhbWVzLCBmcmFtZXNBdmFpbGFibGUpOwogICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc1RvUmVhZCA9IHN0ZDo6bWluKGZyYW1lc0F2YWlsYWJsZSwgbnVtRnJhbWVzKTsKICAgICAgICAgZmlmb19mcmFtZXNfdCBhY3R1YWwgPSBtRmlmb0J1ZmZlci5yZWFkKG1EYXRhLCBmcmFtZXNUb1JlYWQpOwpAQCAtMjgyLDEyICsyODIsMTIgQEAKICAgICB2b2lkIGNoZWNrUmFuZG9tV3JpdGVSZWFkKCkgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKICAgICAgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzRW1wdHkgPQotICAgICAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKICAgICAgICAgICAgIGZpZm9fZnJhbWVzX3QgbnVtRnJhbWVzID0gKGZpZm9fZnJhbWVzX3QpKGRyYW5kNDgoKSAqIGZyYW1lc0VtcHR5KTsKICAgICAgICAgICAgIHdyaXRlTXVsdGlwbGVEYXRhRnJhbWVzKG51bUZyYW1lcyk7CiAKICAgICAgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzRnVsbCA9Ci0gICAgICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CisgICAgICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKICAgICAgICAgICAgIG51bUZyYW1lcyA9IChmaWZvX2ZyYW1lc190KShkcmFuZDQ4KCkgKiBmcmFtZXNGdWxsKTsKICAgICAgICAgICAgIHZlcmlmeU11bHRpcGxlRGF0YUZyYW1lcyhudW1GcmFtZXMpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9jbG9ja19tb2RlbC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9jbG9ja19tb2RlbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MwOTAyNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2Nsb2NrX21vZGVsLmNwcApAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFVuaXQgdGVzdHMgZm9yIElzb2Nocm9ub3VzIENsb2NrIE1vZGVsCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKworI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgorI2luY2x1ZGUgPGNsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCit1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOworCisvLyBXZSBjYW4gdXNlIGFyYml0cmFyeSB2YWx1ZXMgaGVyZSBiZWNhdXNlIHdlIGFyZSBub3Qgb3BlbmluZyBhIHJlYWwgYXVkaW8gc3RyZWFtLgorI2RlZmluZSBTQU1QTEVfUkFURSAgICAgICAgICAgICA0ODAwMAorI2RlZmluZSBIV19GUkFNRVNfUEVSX0JVUlNUICAgICA0OAorI2RlZmluZSBOQU5PU19QRVJfQlVSU1QgICAgICAgICAoTkFOT1NfUEVSX1NFQ09ORCAqIEhXX0ZSQU1FU19QRVJfQlVSU1QgLyBTQU1QTEVfUkFURSkKKworY2xhc3MgQ2xvY2tNb2RlbFRlc3RGaXh0dXJlOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK3B1YmxpYzoKKyAgICBDbG9ja01vZGVsVGVzdEZpeHR1cmUoKSB7CisgICAgfQorCisgICAgdm9pZCBTZXRVcCgpIHsKKyAgICAgICAgbW9kZWwuc2V0U2FtcGxlUmF0ZShTQU1QTEVfUkFURSk7CisgICAgICAgIG1vZGVsLnNldEZyYW1lc1BlckJ1cnN0KEhXX0ZSQU1FU19QRVJfQlVSU1QpOworICAgIH0KKworICAgIHZvaWQgVGVhckRvd24oKSB7CisKKyAgICB9CisKKyAgICB+Q2xvY2tNb2RlbFRlc3RGaXh0dXJlKCkgIHsKKyAgICAgICAgLy8gY2xlYW51cCBhbnkgcGVuZGluZyBzdHVmZiwgYnV0IG5vIGV4Y2VwdGlvbnMgYWxsb3dlZAorICAgIH0KKworICAgIElzb2Nocm9ub3VzQ2xvY2tNb2RlbCBtb2RlbDsKK307CisKKy8vIENoZWNrIGRlZmF1bHQgc2V0dXAuCitURVNUX0YoQ2xvY2tNb2RlbFRlc3RGaXh0dXJlLCBjbG9ja19zZXR1cCkgeworICAgIEFTU0VSVF9FUShTQU1QTEVfUkFURSwgbW9kZWwuZ2V0U2FtcGxlUmF0ZSgpKTsKKyAgICBBU1NFUlRfRVEoSFdfRlJBTUVTX1BFUl9CVVJTVCwgbW9kZWwuZ2V0RnJhbWVzUGVyQnVyc3QoKSk7Cit9CisKKy8vIFRlc3QgZGVsdGEgY2FsY3VsYXRpb25zLgorVEVTVF9GKENsb2NrTW9kZWxUZXN0Rml4dHVyZSwgY2xvY2tfZGVsdGFzKSB7CisgICAgaW50NjRfdCBwb3NpdGlvbiA9IG1vZGVsLmNvbnZlcnREZWx0YVRpbWVUb1Bvc2l0aW9uKE5BTk9TX1BFUl9TRUNPTkQpOworICAgIEFTU0VSVF9FUShTQU1QTEVfUkFURSwgcG9zaXRpb24pOworCisgICAgLy8gRGVsdGFzIGFyZSBub3QgcXVhbnRpemVkLgorICAgIC8vIENvbXBhcmUgdGltZSB0byB0aGUgZXF1aXZhbGVudCBwb3NpdGlvbiBpbiBmcmFtZXMuCisgICAgY29uc3RleHByIGludDY0X3Qga05hbm9zUGVyQnVyc3QgPSBIV19GUkFNRVNfUEVSX0JVUlNUICogTkFOT1NfUEVSX1NFQ09ORCAvIFNBTVBMRV9SQVRFOworICAgIHBvc2l0aW9uID0gbW9kZWwuY29udmVydERlbHRhVGltZVRvUG9zaXRpb24oTkFOT1NfUEVSX1NFQ09ORCArIChrTmFub3NQZXJCdXJzdCAvIDIpKTsKKyAgICBBU1NFUlRfRVEoU0FNUExFX1JBVEUgKyAoSFdfRlJBTUVTX1BFUl9CVVJTVCAvIDIpLCBwb3NpdGlvbik7CisKKyAgICBpbnQ2NF90IHRpbWUgPSBtb2RlbC5jb252ZXJ0RGVsdGFQb3NpdGlvblRvVGltZShTQU1QTEVfUkFURSk7CisgICAgQVNTRVJUX0VRKE5BTk9TX1BFUl9TRUNPTkQsIHRpbWUpOworCisgICAgLy8gQ29tcGFyZSBwb3NpdGlvbiBpbiBmcmFtZXMgdG8gdGhlIGVxdWl2YWxlbnQgdGltZS4KKyAgICB0aW1lID0gbW9kZWwuY29udmVydERlbHRhUG9zaXRpb25Ub1RpbWUoU0FNUExFX1JBVEUgKyAoSFdfRlJBTUVTX1BFUl9CVVJTVCAvIDIpKTsKKyAgICBBU1NFUlRfRVEoTkFOT1NfUEVSX1NFQ09ORCArIChrTmFub3NQZXJCdXJzdCAvIDIpLCB0aW1lKTsKK30KKworLy8gc3RhcnQoKSBzaG91bGQgZm9yY2UgdGhlIGludGVybmFsIG1hcmtlcnMKK1RFU1RfRihDbG9ja01vZGVsVGVzdEZpeHR1cmUsIGNsb2NrX3N0YXJ0KSB7CisgICAgY29uc3QgaW50NjRfdCBzdGFydFRpbWUgPSAxMDAwMDA7CisgICAgbW9kZWwuc3RhcnQoc3RhcnRUaW1lKTsKKworICAgIGludDY0X3QgcG9zaXRpb24gPSBtb2RlbC5jb252ZXJ0VGltZVRvUG9zaXRpb24oc3RhcnRUaW1lKTsKKyAgICBFWFBFQ1RfRVEoMCwgcG9zaXRpb24pOworCisgICAgaW50NjRfdCB0aW1lID0gbW9kZWwuY29udmVydFBvc2l0aW9uVG9UaW1lKHBvc2l0aW9uKTsKKyAgICBFWFBFQ1RfRVEoc3RhcnRUaW1lLCB0aW1lKTsKKworICAgIHRpbWUgPSBzdGFydFRpbWUgKyAoNTAwICogTkFOT1NfUEVSX01JQ1JPU0VDT05EKTsKKyAgICBwb3NpdGlvbiA9IG1vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbih0aW1lKTsKKyAgICBFWFBFQ1RfRVEoMCwgcG9zaXRpb24pOworfQorCisvLyB0aW1lc3RhbXBzIG1vdmVzIHRoZSB3aW5kb3cgaWYgb3V0c2lkZSB0aGUgYm91bmRzCisvLyBUT0RPIHRlc3QgbnVkZ2luZyB0aGUgd2luZG93CitURVNUX0YoQ2xvY2tNb2RlbFRlc3RGaXh0dXJlLCBjbG9ja190aW1lc3RhbXApIHsKKyAgICBjb25zdCBpbnQ2NF90IHN0YXJ0VGltZSA9IDEwMDAwMDAwMDsKKyAgICBtb2RlbC5zdGFydChzdGFydFRpbWUpOworCisgICAgY29uc3QgaW50NjRfdCBwb3NpdGlvbiA9IEhXX0ZSQU1FU19QRVJfQlVSU1Q7IC8vIGhhcmR3YXJlCisgICAgaW50NjRfdCBtYXJrZXJUaW1lID0gc3RhcnRUaW1lICsgTkFOT1NfUEVSX01JTExJU0VDT05EICsgKDIwMCAqIE5BTk9TX1BFUl9NSUNST1NFQ09ORCk7CisKKyAgICAvLyBTaG91bGQgc2V0IG1hcmtlci4KKyAgICBtb2RlbC5wcm9jZXNzVGltZXN0YW1wKHBvc2l0aW9uLCBtYXJrZXJUaW1lKTsKKyAgICBFWFBFQ1RfRVEocG9zaXRpb24sIG1vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbihtYXJrZXJUaW1lKSk7CisKKyAgICAvLyBjb252ZXJ0VGltZVRvUG9zaXRpb24gcm91bmRzIGRvd24KKyAgICBFWFBFQ1RfRVEocG9zaXRpb24sIG1vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbihtYXJrZXJUaW1lICsgKDczICogTkFOT1NfUEVSX01JQ1JPU0VDT05EKSkpOworCisgICAgLy8gY29udmVydFBvc2l0aW9uVG9UaW1lIHJvdW5kcyB1cAorICAgIEVYUEVDVF9FUShtYXJrZXJUaW1lICsgTkFOT1NfUEVSX0JVUlNULCBtb2RlbC5jb252ZXJ0UG9zaXRpb25Ub1RpbWUocG9zaXRpb24gKyAxNykpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfZmxvd2dyYXBoLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2Zsb3dncmFwaC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU2M2E3ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2Zsb3dncmFwaC5jcHAKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBUZXN0IEZsb3dHcmFwaAorICovCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlICJmbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuaCIKKyNpbmNsdWRlICJmbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuaCIKKyNpbmNsdWRlICJmbG93Z3JhcGgvU291cmNlRmxvYXQuaCIKKyNpbmNsdWRlICJmbG93Z3JhcGgvUmFtcExpbmVhci5oIgorI2luY2x1ZGUgImZsb3dncmFwaC9TaW5rRmxvYXQuaCIKKyNpbmNsdWRlICJmbG93Z3JhcGgvU2lua0kxNi5oIgorI2luY2x1ZGUgImZsb3dncmFwaC9TaW5rSTI0LmgiCisjaW5jbHVkZSAiZmxvd2dyYXBoL1NvdXJjZUkxNi5oIgorI2luY2x1ZGUgImZsb3dncmFwaC9Tb3VyY2VJMjQuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworY29uc3RleHByIGludCBrQnl0ZXNQZXJJMjRQYWNrZWQgPSAzOworCitURVNUKHRlc3RfZmxvd2dyYXBoLCBtb2R1bGVfc2lua2kxNikgeworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBpbnB1dFtdID0gezEuMGYsIDAuNWYsIC0wLjI1ZiwgLTEuMGYsIDAuMGYsIDUzLjlmLCAtODcuMmZ9OworICAgIHN0YXRpYyBjb25zdCBpbnQxNl90IGV4cGVjdGVkW10gPSB7MzI3NjcsIDE2Mzg0LCAtODE5MiwgLTMyNzY4LCAwLCAzMjc2NywgLTMyNzY4fTsKKyAgICBpbnQxNl90IG91dHB1dFsyMF07CisgICAgU291cmNlRmxvYXQgc291cmNlRmxvYXR7MX07CisgICAgU2lua0kxNiBzaW5rSTE2ezF9OworCisgICAgaW50IG51bUlucHV0RnJhbWVzID0gc2l6ZW9mKGlucHV0KSAvIHNpemVvZihpbnB1dFswXSk7CisgICAgc291cmNlRmxvYXQuc2V0RGF0YShpbnB1dCwgbnVtSW5wdXRGcmFtZXMpOworICAgIHNvdXJjZUZsb2F0Lm91dHB1dC5jb25uZWN0KCZzaW5rSTE2LmlucHV0KTsKKworICAgIGludCBudW1PdXRwdXRGcmFtZXMgPSBzaXplb2Yob3V0cHV0KSAvIHNpemVvZihpbnQxNl90KTsKKyAgICBpbnQzMl90IG51bVJlYWQgPSBzaW5rSTE2LnJlYWQob3V0cHV0LCBudW1PdXRwdXRGcmFtZXMpOworICAgIEFTU0VSVF9FUShudW1JbnB1dEZyYW1lcywgbnVtUmVhZCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1SZWFkOyBpKyspIHsKKyAgICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkW2ldLCBvdXRwdXRbaV0pOworICAgIH0KK30KKworVEVTVCh0ZXN0X2Zsb3dncmFwaCwgbW9kdWxlX21vbm9fdG9fc3RlcmVvKSB7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGlucHV0W10gPSB7MS4wZiwgMi4wZiwgMy4wZn07CisgICAgZmxvYXQgb3V0cHV0WzEwMF0gPSB7fTsKKyAgICBTb3VyY2VGbG9hdCBzb3VyY2VGbG9hdHsxfTsKKyAgICBNb25vVG9NdWx0aUNvbnZlcnRlciBtb25vVG9TdGVyZW97Mn07CisgICAgU2lua0Zsb2F0IHNpbmtGbG9hdHsyfTsKKworICAgIHNvdXJjZUZsb2F0LnNldERhdGEoaW5wdXQsIDMpOworCisgICAgc291cmNlRmxvYXQub3V0cHV0LmNvbm5lY3QoJm1vbm9Ub1N0ZXJlby5pbnB1dCk7CisgICAgbW9ub1RvU3RlcmVvLm91dHB1dC5jb25uZWN0KCZzaW5rRmxvYXQuaW5wdXQpOworCisgICAgaW50MzJfdCBudW1SZWFkID0gc2lua0Zsb2F0LnJlYWQob3V0cHV0LCA4KTsKKyAgICBBU1NFUlRfRVEoMywgbnVtUmVhZCk7CisgICAgRVhQRUNUX0VRKGlucHV0WzBdLCBvdXRwdXRbMF0pOworICAgIEVYUEVDVF9FUShpbnB1dFswXSwgb3V0cHV0WzFdKTsKKyAgICBFWFBFQ1RfRVEoaW5wdXRbMV0sIG91dHB1dFsyXSk7CisgICAgRVhQRUNUX0VRKGlucHV0WzFdLCBvdXRwdXRbM10pOworfQorCitURVNUKHRlc3RfZmxvd2dyYXBoLCBtb2R1bGVfcmFtcF9saW5lYXIpIHsKKyAgICBjb25zdGV4cHIgaW50IHJhbXBTaXplID0gNTsKKyAgICBjb25zdGV4cHIgaW50IG51bU91dHB1dCA9IDEwMDsKKyAgICBjb25zdGV4cHIgZmxvYXQgdmFsdWUgPSAxLjBmOworICAgIGNvbnN0ZXhwciBmbG9hdCB0YXJnZXQgPSAxMDAuMGY7CisgICAgZmxvYXQgb3V0cHV0W251bU91dHB1dF0gPSB7fTsKKyAgICBSYW1wTGluZWFyIHJhbXBMaW5lYXJ7MX07CisgICAgU2lua0Zsb2F0IHNpbmtGbG9hdHsxfTsKKworICAgIHJhbXBMaW5lYXIuaW5wdXQuc2V0VmFsdWUodmFsdWUpOworICAgIHJhbXBMaW5lYXIuc2V0TGVuZ3RoSW5GcmFtZXMocmFtcFNpemUpOworICAgIHJhbXBMaW5lYXIuc2V0VGFyZ2V0KHRhcmdldCk7CisgICAgcmFtcExpbmVhci5mb3JjZUN1cnJlbnQoMC4wZik7CisKKyAgICByYW1wTGluZWFyLm91dHB1dC5jb25uZWN0KCZzaW5rRmxvYXQuaW5wdXQpOworCisgICAgaW50MzJfdCBudW1SZWFkID0gc2lua0Zsb2F0LnJlYWQob3V0cHV0LCBudW1PdXRwdXQpOworICAgIEFTU0VSVF9FUShudW1PdXRwdXQsIG51bVJlYWQpOworICAgIGNvbnN0ZXhwciBmbG9hdCB0b2xlcmFuY2UgPSAwLjAwMDFmOyAvLyBhcmJpdHJhcnkKKyAgICBpbnQgaSA9IDA7CisgICAgZm9yICg7IGkgPCByYW1wU2l6ZTsgaSsrKSB7CisgICAgICAgIGZsb2F0IGV4cGVjdGVkID0gaSAqIHZhbHVlICogdGFyZ2V0IC8gcmFtcFNpemU7CisgICAgICAgIEVYUEVDVF9ORUFSKGV4cGVjdGVkLCBvdXRwdXRbaV0sIHRvbGVyYW5jZSk7CisgICAgfQorICAgIGZvciAoOyBpIDwgbnVtT3V0cHV0OyBpKyspIHsKKyAgICAgICAgZmxvYXQgZXhwZWN0ZWQgPSB2YWx1ZSAqIHRhcmdldDsKKyAgICAgICAgRVhQRUNUX05FQVIoZXhwZWN0ZWQsIG91dHB1dFtpXSwgdG9sZXJhbmNlKTsKKyAgICB9Cit9CisKKy8vIEl0IGlzIGVhc2llc3QgdG8gcmVwcmVzZW50IHBhY2tlZCAyNC1iaXQgZGF0YSBhcyBhIGJ5dGUgYXJyYXkuCisvLyBUaGlzIHRlc3Qgd2lsbCByZWFkIGZyb20gaW5wdXQsIGNvbnZlcnQgdG8gZmxvYXQsIHRoZW4gd3JpdGUKKy8vIGJhY2sgdG8gb3V0cHV0IGFzIGJ5dGVzLgorVEVTVCh0ZXN0X2Zsb3dncmFwaCwgbW9kdWxlX3BhY2tlZF8yNCkgeworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGlucHV0W10gPSB7MHgwMSwgMHgyMywgMHg0NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjcsIDB4ODksIDB4QUIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweENELCAweEVGLCAweDVBfTsKKyAgICB1aW50OF90IG91dHB1dFs5OV0gPSB7fTsKKyAgICBTb3VyY2VJMjQgc291cmNlSTI0ezF9OworICAgIFNpbmtJMjQgc2lua0kyNHsxfTsKKworICAgIGludCBudW1JbnB1dEZyYW1lcyA9IHNpemVvZihpbnB1dCkgLyBrQnl0ZXNQZXJJMjRQYWNrZWQ7CisgICAgc291cmNlSTI0LnNldERhdGEoaW5wdXQsIG51bUlucHV0RnJhbWVzKTsKKyAgICBzb3VyY2VJMjQub3V0cHV0LmNvbm5lY3QoJnNpbmtJMjQuaW5wdXQpOworCisgICAgaW50MzJfdCBudW1SZWFkID0gc2lua0kyNC5yZWFkKG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLyBrQnl0ZXNQZXJJMjRQYWNrZWQpOworICAgIEFTU0VSVF9FUShudW1JbnB1dEZyYW1lcywgbnVtUmVhZCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YoaW5wdXQpOyBpKyspIHsKKyAgICAgICAgRVhQRUNUX0VRKGlucHV0W2ldLCBvdXRwdXRbaV0pOworICAgIH0KK30KKworVEVTVCh0ZXN0X2Zsb3dncmFwaCwgbW9kdWxlX2NsaXBfdG9fcmFuZ2UpIHsKKyAgICBjb25zdGV4cHIgZmxvYXQgbXlNaW4gPSAtMi4wZjsKKyAgICBjb25zdGV4cHIgZmxvYXQgbXlNYXggPSAxLjVmOworCisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGlucHV0W10gPSB7LTkuNywgMC41ZiwgLTAuMjUsIDEuMGYsIDEyLjN9OworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBleHBlY3RlZFtdID0ge215TWluLCAwLjVmLCAtMC4yNSwgMS4wZiwgbXlNYXh9OworICAgIGZsb2F0IG91dHB1dFsxMDBdOworICAgIFNvdXJjZUZsb2F0IHNvdXJjZUZsb2F0ezF9OworICAgIENsaXBUb1JhbmdlIGNsaXBwZXJ7MX07CisgICAgU2lua0Zsb2F0IHNpbmtGbG9hdHsxfTsKKworICAgIGludCBudW1JbnB1dEZyYW1lcyA9IHNpemVvZihpbnB1dCkgLyBzaXplb2YoaW5wdXRbMF0pOworICAgIHNvdXJjZUZsb2F0LnNldERhdGEoaW5wdXQsIG51bUlucHV0RnJhbWVzKTsKKworICAgIGNsaXBwZXIuc2V0TWluaW11bShteU1pbik7CisgICAgY2xpcHBlci5zZXRNYXhpbXVtKG15TWF4KTsKKworICAgIHNvdXJjZUZsb2F0Lm91dHB1dC5jb25uZWN0KCZjbGlwcGVyLmlucHV0KTsKKyAgICBjbGlwcGVyLm91dHB1dC5jb25uZWN0KCZzaW5rRmxvYXQuaW5wdXQpOworCisgICAgaW50IG51bU91dHB1dEZyYW1lcyA9IHNpemVvZihvdXRwdXQpIC8gc2l6ZW9mKG91dHB1dFswXSk7CisgICAgaW50MzJfdCBudW1SZWFkID0gc2lua0Zsb2F0LnJlYWQob3V0cHV0LCBudW1PdXRwdXRGcmFtZXMpOworICAgIEFTU0VSVF9FUShudW1JbnB1dEZyYW1lcywgbnVtUmVhZCk7CisgICAgY29uc3RleHByIGZsb2F0IHRvbGVyYW5jZSA9IDAuMDAwMDAxZjsgLy8gYXJiaXRyYXJ5CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1SZWFkOyBpKyspIHsKKyAgICAgICAgRVhQRUNUX05FQVIoZXhwZWN0ZWRbaV0sIG91dHB1dFtpXSwgdG9sZXJhbmNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9saW5lYXJfcmFtcC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9saW5lYXJfcmFtcC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMjI2YmEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfbGluZWFyX3JhbXAuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8bWF0aC5oPgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgInV0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgiCi0jaW5jbHVkZSAidXRpbGl0eS9MaW5lYXJSYW1wLmgiCi0KLVRFU1QodGVzdF9saW5lYXJfcmFtcCwgbGluZWFyX3JhbXBfc2VnbWVudHMpIHsKLSAgICBMaW5lYXJSYW1wIHJhbXA7Ci0gICAgY29uc3QgZmxvYXQgc291cmNlWzRdID0gezEuMGYsIDEuMGYsIDEuMGYsIDEuMGYgfTsKLSAgICBmbG9hdCBkZXN0aW5hdGlvbls0XSA9IHsxLjBmLCAxLjBmLCAxLjBmLCAxLjBmIH07Ci0KLSAgICBmbG9hdCBsZXZlbEZyb20gPSAtMS4wZjsKLSAgICBmbG9hdCBsZXZlbFRvID0gLTEuMGY7Ci0gICAgcmFtcC5zZXRMZW5ndGhJbkZyYW1lcyg4KTsKLSAgICByYW1wLnNldFRhcmdldCg4LjBmKTsKLQotICAgIEVYUEVDVF9FUSg4LCByYW1wLmdldExlbmd0aEluRnJhbWVzKCkpOwotCi0gICAgYm9vbCByYW1waW5nID0gcmFtcC5uZXh0U2VnbWVudCg0LCAmbGV2ZWxGcm9tLCAmbGV2ZWxUbyk7Ci0gICAgRVhQRUNUX0VRKDEsIHJhbXBpbmcpOwotICAgIEVYUEVDVF9FUSgwLjBmLCBsZXZlbEZyb20pOwotICAgIEVYUEVDVF9FUSg0LjBmLCBsZXZlbFRvKTsKLQotICAgIEFBdWRpb19saW5lYXJSYW1wKHNvdXJjZSwgZGVzdGluYXRpb24sIDQsIDEsIGxldmVsRnJvbSwgbGV2ZWxUbyk7Ci0gICAgRVhQRUNUX0VRKDAuMGYsIGRlc3RpbmF0aW9uWzBdKTsKLSAgICBFWFBFQ1RfRVEoMS4wZiwgZGVzdGluYXRpb25bMV0pOwotICAgIEVYUEVDVF9FUSgyLjBmLCBkZXN0aW5hdGlvblsyXSk7Ci0gICAgRVhQRUNUX0VRKDMuMGYsIGRlc3RpbmF0aW9uWzNdKTsKLQotICAgIHJhbXBpbmcgPSByYW1wLm5leHRTZWdtZW50KDQsICZsZXZlbEZyb20sICZsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoMSwgcmFtcGluZyk7Ci0gICAgRVhQRUNUX0VRKDQuMGYsIGxldmVsRnJvbSk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGxldmVsVG8pOwotCi0gICAgQUF1ZGlvX2xpbmVhclJhbXAoc291cmNlLCBkZXN0aW5hdGlvbiwgNCwgMSwgbGV2ZWxGcm9tLCBsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoNC4wZiwgZGVzdGluYXRpb25bMF0pOwotICAgIEVYUEVDVF9FUSg1LjBmLCBkZXN0aW5hdGlvblsxXSk7Ci0gICAgRVhQRUNUX0VRKDYuMGYsIGRlc3RpbmF0aW9uWzJdKTsKLSAgICBFWFBFQ1RfRVEoNy4wZiwgZGVzdGluYXRpb25bM10pOwotCi0gICAgcmFtcGluZyA9IHJhbXAubmV4dFNlZ21lbnQoNCwgJmxldmVsRnJvbSwgJmxldmVsVG8pOwotICAgIEVYUEVDVF9FUSgwLCByYW1waW5nKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgbGV2ZWxGcm9tKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgbGV2ZWxUbyk7Ci0KLSAgICBBQXVkaW9fbGluZWFyUmFtcChzb3VyY2UsIGRlc3RpbmF0aW9uLCA0LCAxLCBsZXZlbEZyb20sIGxldmVsVG8pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBkZXN0aW5hdGlvblswXSk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGRlc3RpbmF0aW9uWzFdKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgZGVzdGluYXRpb25bMl0pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBkZXN0aW5hdGlvblszXSk7Ci0KLX07Ci0KLQotVEVTVCh0ZXN0X2xpbmVhcl9yYW1wLCBsaW5lYXJfcmFtcF9mb3JjZWQpIHsKLSAgICBMaW5lYXJSYW1wIHJhbXA7Ci0gICAgY29uc3QgZmxvYXQgc291cmNlWzRdID0gezEuMGYsIDEuMGYsIDEuMGYsIDEuMGYgfTsKLSAgICBmbG9hdCBkZXN0aW5hdGlvbls0XSA9IHsxLjBmLCAxLjBmLCAxLjBmLCAxLjBmIH07Ci0KLSAgICBmbG9hdCBsZXZlbEZyb20gPSAtMS4wZjsKLSAgICBmbG9hdCBsZXZlbFRvID0gLTEuMGY7Ci0gICAgcmFtcC5zZXRMZW5ndGhJbkZyYW1lcyg0KTsKLSAgICByYW1wLnNldFRhcmdldCg4LjBmKTsKLSAgICByYW1wLmZvcmNlQ3VycmVudCg0LjBmKTsKLSAgICBFWFBFQ1RfRVEoNC4wZiwgcmFtcC5nZXRDdXJyZW50KCkpOwotCi0gICAgYm9vbCByYW1waW5nID0gcmFtcC5uZXh0U2VnbWVudCg0LCAmbGV2ZWxGcm9tLCAmbGV2ZWxUbyk7Ci0gICAgRVhQRUNUX0VRKDEsIHJhbXBpbmcpOwotICAgIEVYUEVDVF9FUSg0LjBmLCBsZXZlbEZyb20pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBsZXZlbFRvKTsKLQotICAgIEFBdWRpb19saW5lYXJSYW1wKHNvdXJjZSwgZGVzdGluYXRpb24sIDQsIDEsIGxldmVsRnJvbSwgbGV2ZWxUbyk7Ci0gICAgRVhQRUNUX0VRKDQuMGYsIGRlc3RpbmF0aW9uWzBdKTsKLSAgICBFWFBFQ1RfRVEoNS4wZiwgZGVzdGluYXRpb25bMV0pOwotICAgIEVYUEVDVF9FUSg2LjBmLCBkZXN0aW5hdGlvblsyXSk7Ci0gICAgRVhQRUNUX0VRKDcuMGYsIGRlc3RpbmF0aW9uWzNdKTsKLQotICAgIHJhbXBpbmcgPSByYW1wLm5leHRTZWdtZW50KDQsICZsZXZlbEZyb20sICZsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoMCwgcmFtcGluZyk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGxldmVsRnJvbSk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGxldmVsVG8pOwotCi0gICAgQUF1ZGlvX2xpbmVhclJhbXAoc291cmNlLCBkZXN0aW5hdGlvbiwgNCwgMSwgbGV2ZWxGcm9tLCBsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgZGVzdGluYXRpb25bMF0pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBkZXN0aW5hdGlvblsxXSk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGRlc3RpbmF0aW9uWzJdKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgZGVzdGluYXRpb25bM10pOwotCi19OwotCi1jb25zdGV4cHIgaW50MTZfdCBrTWF4STE2ID0gSU5UMTZfTUFYOwotY29uc3RleHByIGludDE2X3Qga01pbkkxNiA9IElOVDE2X01JTjsKLWNvbnN0ZXhwciBpbnQxNl90IGtIYWxmSTE2ID0gMTYzODQ7Ci1jb25zdGV4cHIgaW50MTZfdCBrVGVudGhJMTYgPSAzMjc3OwotCi0vL3ZvaWQgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoY29uc3QgZmxvYXQgKnNvdXJjZSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKTsKLVRFU1QodGVzdF9saW5lYXJfcmFtcCwgZmxvYXRfdG9faTE2KSB7Ci0gICAgY29uc3QgZmxvYXQgc291cmNlW10gPSB7MTIzNDUuNmYsIDEuMGYsIDAuNWYsIDAuMWYsIDAuMGYsIC0wLjFmLCAtMC41ZiwgLTEuMGYsIC0xMjM0NS42Zn07Ci0gICAgY29uc3RleHByIHNpemVfdCBjb3VudCA9IHNpemVvZihzb3VyY2UpIC8gc2l6ZW9mKHNvdXJjZVswXSk7Ci0gICAgaW50MTZfdCBkZXN0aW5hdGlvbltjb3VudF07Ci0gICAgY29uc3QgaW50MTZfdCBleHBlY3RlZFtjb3VudF0gPSB7a01heEkxNiwga01heEkxNiwga0hhbGZJMTYsIGtUZW50aEkxNiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAta1RlbnRoSTE2LCAta0hhbGZJMTYsIGtNaW5JMTYsIGtNaW5JMTZ9OwotCi0gICAgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoc291cmNlLCBkZXN0aW5hdGlvbiwgY291bnQsIDEuMGYpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbaV0sIGRlc3RpbmF0aW9uW2ldKTsKLSAgICB9Ci0KLX0KLQotLy92b2lkIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZSk7Ci1URVNUKHRlc3RfbGluZWFyX3JhbXAsIGkxNl90b19mbG9hdCkgewotICAgIGNvbnN0IGludDE2X3Qgc291cmNlW10gPSB7a01heEkxNiwga0hhbGZJMTYsIGtUZW50aEkxNiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1rVGVudGhJMTYsIC1rSGFsZkkxNiwga01pbkkxNn07Ci0gICAgY29uc3RleHByIHNpemVfdCBjb3VudCA9IHNpemVvZihzb3VyY2UpIC8gc2l6ZW9mKHNvdXJjZVswXSk7Ci0gICAgZmxvYXQgZGVzdGluYXRpb25bY291bnRdOwotICAgIGNvbnN0IGZsb2F0IGV4cGVjdGVkW2NvdW50XSA9IHsoMzI3NjcuMGYgLyAzMjc2OC4wZiksIDAuNWYsIDAuMWYsIDAuMGYsIC0wLjFmLCAtMC41ZiwgLTEuMGZ9OwotCi0gICAgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoc291cmNlLCBkZXN0aW5hdGlvbiwgY291bnQsIDEuMGYpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBFWFBFQ1RfTkVBUihleHBlY3RlZFtpXSwgZGVzdGluYXRpb25baV0sIDAuMDAwMWYpOwotICAgIH0KLQotfQotCi0vL3ZvaWQgQUF1ZGlvX2xpbmVhclJhbXAoY29uc3QgaW50MTZfdCAqc291cmNlLAotLy8gICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotLy8gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotLy8gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotLy8gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMik7Ci1URVNUKHRlc3RfbGluZWFyX3JhbXAsIHJhbXBfaTE2X3RvX2kxNikgewotICAgIGNvbnN0IGludDE2X3Qgc291cmNlW10gPSB7MSwgMSwgMSwgMSwgMSwgMSwgMSwgMX07Ci0gICAgY29uc3RleHByIHNpemVfdCBjb3VudCA9IHNpemVvZihzb3VyY2UpIC8gc2l6ZW9mKHNvdXJjZVswXSk7Ci0gICAgaW50MTZfdCBkZXN0aW5hdGlvbltjb3VudF07Ci0gICAgLy8gUmFtcCB3aWxsIHN3ZWVwIGZyb20gLTEgdG8gYWxtb3N0ICsxCi0gICAgY29uc3QgaW50MTZfdCBleHBlY3RlZFtjb3VudF0gPSB7Ci0gICAgICAgICAgICAtMSwgLy8gZnJvbSAtMS4wMAotICAgICAgICAgICAgLTEsIC8vIGZyb20gLTAuNzUKLSAgICAgICAgICAgIC0xLCAvLyBmcm9tIC0wLjU1LCByb3VuZCBhd2F5IGZyb20gemVybwotICAgICAgICAgICAgMCwgIC8vIGZyb20gLTAuMjUsIHJvdW5kIHVwIHRvIHplcm8KLSAgICAgICAgICAgIDAsICAvLyBmcm9tICAwLjAwCi0gICAgICAgICAgICAwLCAgLy8gZnJvbSAgMC4yNSwgcm91bmQgZG93biB0byB6ZXJvCi0gICAgICAgICAgICAxLCAgLy8gZnJvbSAgMC41MCwgcm91bmQgYXdheSBmcm9tIHplcm8KLSAgICAgICAgICAgIDEgICAvLyBmcm9tICAwLjc1Ci0gICAgfTsKLQotICAgIC8vIHN3ZWVwIGFjcm9zcyB6ZXJvIHRvIHRlc3Qgc3ltbWV0cnkKLSAgICBjb25zdGV4cHIgZmxvYXQgYW1wbGl0dWRlMSA9IC0xLjA7Ci0gICAgY29uc3RleHByIGZsb2F0IGFtcGxpdHVkZTIgPSAxLjA7Ci0gICAgQUF1ZGlvX2xpbmVhclJhbXAoc291cmNlLCBkZXN0aW5hdGlvbiwgY291bnQsIDEsIGFtcGxpdHVkZTEsIGFtcGxpdHVkZTIpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbaV0sIGRlc3RpbmF0aW9uW2ldKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3JldHVybl9zdG9wLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3JldHVybl9zdG9wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTllMDBjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfcmV0dXJuX3N0b3AuY3BwCkBAIC0wLDAgKzEsMjgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBSZXR1cm4gc3RvcCBmcm9tIHRoZSBjYWxsYmFjay4KKyAqIEV4cGVjdCB0aGUgY2FsbGJhY2sgdG8gY2Vhc2UuCisgKiBDaGVjayB0aGUgbG9nY2F0IGZvciBiYWQgYmVoYXZpb3IuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorCisjZGVmaW5lIERFRkFVTFRfVElNRU9VVF9OQU5PUyAgKChpbnQ2NF90KTEwMDAwMDAwMDApCisjZGVmaW5lIFNUT1BfQVRfTVNFQyAgICAgICAgICAxMDAwCisjZGVmaW5lIExPT1BfRFVSQVRJT05fTVNFQyAgICA0MDAwCisjZGVmaW5lIFNMRUVQX0RVUkFUSU9OX01TRUMgICAgMjAwCisKK3N0YXRpYyB2b2lkIHNfbXlFcnJvckNhbGxiYWNrUHJvYygKKyAgICAgICAgQUF1ZGlvU3RyZWFtICpzdHJlYW0sCisgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICBhYXVkaW9fcmVzdWx0X3QgZXJyb3IpOworCitzdHJ1Y3QgQXVkaW9FbmdpbmUgeworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXIgKmJ1aWxkZXIgPSBudWxscHRyOworICAgIEFBdWRpb1N0cmVhbSAgICAgICAgKnN0cmVhbSA9IG51bGxwdHI7CisgICAgc3RkOjp0aHJlYWQgICAgICAgICAqdGhyZWFkID0gbnVsbHB0cjsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICBzdG9wQXRGcmFtZSA9IDA7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgc3RvcHBlZCA9IGZhbHNlOworICAgIC8vIFRoZXNlIGNvdW50ZXJzIGFyZSByZWFkIGFuZCB3cml0dGVuIGJ5IHRoZSBjYWxsYmFjayBhbmQgdGhlIG1haW4gdGhyZWFkLgorICAgIHN0ZDo6YXRvbWljPGludDMyX3Q+IGZyYW1lc1JlYWR7fTsKKyAgICBzdGQ6OmF0b21pYzxpbnQzMl90PiBzdGFydGluZ0ZyYW1lc1JlYWR7fTsKKyAgICBzdGQ6OmF0b21pYzxpbnQzMl90PiBmcmFtZXNDYWxsZWR7fTsKKyAgICBzdGQ6OmF0b21pYzxpbnQzMl90PiBjYWxsYmFja0NvdW50e307CisgICAgc3RkOjphdG9taWM8aW50MzJfdD4gY2FsbGJhY2tDb3VudEFmdGVyU3RvcHt9OworCisgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgZnJhbWVzUmVhZC5zdG9yZSgwKTsKKyAgICAgICAgc3RhcnRpbmdGcmFtZXNSZWFkLnN0b3JlKDApOworICAgICAgICBmcmFtZXNDYWxsZWQuc3RvcmUoMCk7CisgICAgICAgIGNhbGxiYWNrQ291bnQuc3RvcmUoMCk7CisgICAgICAgIGNhbGxiYWNrQ291bnRBZnRlclN0b3Auc3RvcmUoMCk7CisgICAgICAgIHN0b3BwZWQgPSBmYWxzZTsKKyAgICB9Cit9OworCisvLyBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IGZpbGxzIHRoZSBhdWRpbyBvdXRwdXQgYnVmZmVyLgorc3RhdGljIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IHNfbXlEYXRhQ2FsbGJhY2tQcm9jKAorICAgICAgICBBQXVkaW9TdHJlYW0gKnN0cmVhbSwKKyAgICAgICAgdm9pZCAqdXNlckRhdGEsCisgICAgICAgIHZvaWQgKmF1ZGlvRGF0YSwKKyAgICAgICAgaW50MzJfdCBudW1GcmFtZXMKKykgeworICAgICh2b2lkKSBhdWRpb0RhdGE7CisgICAgKHZvaWQpIG51bUZyYW1lczsKKyAgICBBdWRpb0VuZ2luZSAqZW5naW5lID0gKHN0cnVjdCBBdWRpb0VuZ2luZSAqKXVzZXJEYXRhOworICAgIGVuZ2luZS0+Y2FsbGJhY2tDb3VudCsrOworICAgIGlmIChlbmdpbmUtPnN0b3BwZWQpIHsKKyAgICAgICAgZW5naW5lLT5jYWxsYmFja0NvdW50QWZ0ZXJTdG9wKys7CisgICAgfQorCisgICAgZW5naW5lLT5mcmFtZXNSZWFkID0gKGludDMyX3QpQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQoc3RyZWFtKTsKKyAgICBpZiAoZW5naW5lLT5zdGFydGluZ0ZyYW1lc1JlYWQgPT0gMCkgeworICAgICAgICBlbmdpbmUtPnN0YXJ0aW5nRnJhbWVzUmVhZC5zdG9yZShlbmdpbmUtPmZyYW1lc1JlYWQubG9hZCgpKTsKKyAgICB9CisgICAgZW5naW5lLT5mcmFtZXNDYWxsZWQgKz0gbnVtRnJhbWVzOworICAgIGlmIChlbmdpbmUtPmZyYW1lc0NhbGxlZCA+PSBlbmdpbmUtPnN0b3BBdEZyYW1lKSB7CisgICAgICAgIGVuZ2luZS0+c3RvcHBlZCA9IHRydWU7CisgICAgICAgIHJldHVybiBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1A7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19DQUxMQkFDS19SRVNVTFRfQ09OVElOVUU7CisgICAgfQorfQorCitzdGF0aWMgYWF1ZGlvX3Jlc3VsdF90IHNfT3BlbkF1ZGlvU3RyZWFtKHN0cnVjdCBBdWRpb0VuZ2luZSAqZW5naW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUpIHsKKyAgICAvLyBVc2UgYW4gQUF1ZGlvU3RyZWFtQnVpbGRlciB0byBjb250YWluIHJlcXVlc3RlZCBwYXJhbWV0ZXJzLgorICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigmZW5naW5lLT5idWlsZGVyKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICBwcmludGYoIkFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyIHJldHVybmVkICVzIiwKKyAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8vIFJlcXVlc3Qgc3RyZWFtIHByb3BlcnRpZXMuCisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRGb3JtYXQoZW5naW5lLT5idWlsZGVyLCBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRQZXJmb3JtYW5jZU1vZGUoZW5naW5lLT5idWlsZGVyLCBwZXJmTW9kZSk7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTaGFyaW5nTW9kZShlbmdpbmUtPmJ1aWxkZXIsIHNoYXJpbmdNb2RlKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERpcmVjdGlvbihlbmdpbmUtPmJ1aWxkZXIsIGRpcmVjdGlvbik7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREYXRhQ2FsbGJhY2soZW5naW5lLT5idWlsZGVyLCBzX215RGF0YUNhbGxiYWNrUHJvYywgZW5naW5lKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEVycm9yQ2FsbGJhY2soZW5naW5lLT5idWlsZGVyLCBzX215RXJyb3JDYWxsYmFja1Byb2MsIGVuZ2luZSk7CisKKyAgICAvLyBDcmVhdGUgYW4gQUF1ZGlvU3RyZWFtIHVzaW5nIHRoZSBCdWlsZGVyLgorICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbShlbmdpbmUtPmJ1aWxkZXIsICZlbmdpbmUtPnN0cmVhbSk7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgcHJpbnRmKCJBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0gcmV0dXJuZWQgJXMiLAorICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGFhdWRpb19yZXN1bHRfdCBzX0Nsb3NlQXVkaW9TdHJlYW0oc3RydWN0IEF1ZGlvRW5naW5lICplbmdpbmUpIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOworICAgIGlmIChlbmdpbmUtPnN0cmVhbSAhPSBudWxscHRyKSB7CisgICAgICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9jbG9zZShlbmdpbmUtPnN0cmVhbSk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICBwcmludGYoIkFBdWRpb1N0cmVhbV9jbG9zZSByZXR1cm5lZCAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICAgICAgfQorICAgICAgICBlbmdpbmUtPnN0cmVhbSA9IG51bGxwdHI7CisgICAgfQorICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfZGVsZXRlKGVuZ2luZS0+YnVpbGRlcik7CisgICAgZW5naW5lLT5idWlsZGVyID0gbnVsbHB0cjsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBzX215RXJyb3JDYWxsYmFja1Byb2MoCisgICAgICAgIEFBdWRpb1N0cmVhbSAqc3RyZWFtIF9fdW51c2VkLAorICAgICAgICB2b2lkICp1c2VyRGF0YSBfX3VudXNlZCwKKyAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IGVycm9yKSB7CisgICAgcHJpbnRmKCIlcygpIC0gZXJyb3IgPSAlZFxuIiwgX19mdW5jX18sIGVycm9yKTsKK30KKwordm9pZCB1c2FnZSgpIHsKKyAgICBwcmludGYoInRlc3RfcmV0dXJuX3N0b3AgWy1pXSBbLXhdIFstbl0gWy1jXVxuIik7CisgICAgcHJpbnRmKCIgICAgIC1pIGRpcmVjdGlvbiBJTlBVVCwgb3RoZXJ3aXNlIE9VVFBVVFxuIik7CisgICAgcHJpbnRmKCIgICAgIC14IHNoYXJpbmcgbW9kZSBFWENMVVNJVkUsIG90aGVyd2lzZSBTSEFSRURcbiIpOworICAgIHByaW50ZigiICAgICAtbiBwZXJmb3JtYW5jZSBtb2RlIE5PTkUsIG90aGVyd2lzZSBMT1dfTEFURU5DWVxuIik7CisgICAgcHJpbnRmKCIgICAgIC1jIGFsd2F5cyByZXR1cm4gQ09OVElOVUUgZnJvbSBjYWxsYmFjaywgbm90IFNUT1BcbiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICAodm9pZCkgYXJnYzsKKyAgICAodm9pZCkgYXJndjsKKyAgICBzdHJ1Y3QgQXVkaW9FbmdpbmUgZW5naW5lOworICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSA9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOworICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUgPSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWTsKKyAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uID0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQ7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKKyAgICBib29sIGFsd2F5c0NvbnRpbnVlID0gZmFsc2U7CisgICAgaW50IGVycm9yQ291bnQgPSAwOworICAgIGludCBjYWxsYmFja1Jlc3VsdCA9IEVYSVRfU1VDQ0VTUzsKKworICAgIC8vIE1ha2UgcHJpbnRmIHByaW50IGltbWVkaWF0ZWx5IHNvIHRoYXQgZGVidWcgaW5mbyBpcyBub3Qgc3R1Y2sKKyAgICAvLyBpbiBhIGJ1ZmZlciBpZiB3ZSBoYW5nIG9yIGNyYXNoLgorICAgIHNldHZidWYoc3Rkb3V0LCBudWxscHRyLCBfSU9OQkYsIChzaXplX3QpIDApOworCisgICAgcHJpbnRmKCJUZXN0IFJldHVybiBTdG9wIFYxLjBcbiIpOworICAgIHByaW50ZigiV2FpdCBmb3IgYSBmZXcgc2Vjb25kcy5cbiIpOworICAgIHByaW50ZigiWW91IHNob3VsZCBzZWUgY2FsbGJhY2tDb3VudCBhbmQgZnJhbWVzUmVhZCBzdG9wIGFkdmFuY2luZ1xuIik7CisgICAgcHJpbnRmKCJ3aGVuIGNhbGxiYWNrQ291bnQgcmVhY2hlcyAlZCBtc2VjXG4iLCBTVE9QX0FUX01TRUMpOworICAgIHByaW50ZigiXG4iKTsKKworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisgICAgICAgIGlmIChhcmdbMF0gPT0gJy0nKSB7CisgICAgICAgICAgICBjaGFyIG9wdGlvbiA9IGFyZ1sxXTsKKyAgICAgICAgICAgIHN3aXRjaCAob3B0aW9uKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnYyc6CisgICAgICAgICAgICAgICAgICAgIGFsd2F5c0NvbnRpbnVlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IEFBVURJT19ESVJFQ1RJT05fSU5QVVQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ24nOgorICAgICAgICAgICAgICAgICAgICBwZXJmTW9kZSA9IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ3gnOgorICAgICAgICAgICAgICAgICAgICBzaGFyaW5nTW9kZSA9IEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB1c2FnZSgpOworICAgICAgICAgICAgICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzdWx0ID0gc19PcGVuQXVkaW9TdHJlYW0oJmVuZ2luZSwgZGlyZWN0aW9uLCBzaGFyaW5nTW9kZSwgcGVyZk1vZGUpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIHByaW50Zigic19PcGVuQXVkaW9TdHJlYW0gcmV0dXJuZWQgJXMiLAorICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgICAgIGVycm9yQ291bnQrKzsKKyAgICB9CisKKyAgICBpbnQzMl90IGZyYW1lc1BlckJ1cnN0ID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1BlckJ1cnN0KGVuZ2luZS5zdHJlYW0pOworICAgIC8vIENoZWNrIHRvIHNlZSB3aGF0IGtpbmQgb2Ygc3RyZWFtIHdlIGFjdHVhbGx5IGdvdC4KKyAgICBpbnQzMl90IGRldmljZUlkID0gQUF1ZGlvU3RyZWFtX2dldERldmljZUlkKGVuZ2luZS5zdHJlYW0pOworICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgYWN0dWFsUGVyZk1vZGUgPSBBQXVkaW9TdHJlYW1fZ2V0UGVyZm9ybWFuY2VNb2RlKGVuZ2luZS5zdHJlYW0pOworICAgIHByaW50ZigiLS0tLS0tLS0gb3BlbmVkOiBkZXZpY2VJZCA9ICUzZCwgZnJhbWVzUGVyQnVyc3QgPSAlM2QsIHBlcmZNb2RlID0gJWRcbiIsCisgICAgICAgICAgIGRldmljZUlkLCBmcmFtZXNQZXJCdXJzdCwgYWN0dWFsUGVyZk1vZGUpOworCisgICAgLy8gQ2FsY3VsYXRlIGhvdyBtYW55IGNhbGxiYWNrcyBuZWVkZWQuCisgICAgaWYgKGFsd2F5c0NvbnRpbnVlKSB7CisgICAgICAgIGVuZ2luZS5zdG9wQXRGcmFtZSA9IElOVDMyX01BWDsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGUgPSBBQXVkaW9TdHJlYW1fZ2V0U2FtcGxlUmF0ZShlbmdpbmUuc3RyZWFtKTsKKyAgICAgICAgZW5naW5lLnN0b3BBdEZyYW1lID0gU1RPUF9BVF9NU0VDICogc2FtcGxlUmF0ZSAvIDEwMDA7CisgICAgfQorCisgICAgZm9yIChpbnQgbG9vcHMgPSAwOyBsb29wcyA8IDIgJiYgcmVzdWx0ID09IEFBVURJT19PSzsgbG9vcHMrKykgeworICAgICAgICBlbmdpbmUucmVzZXQoKTsKKworICAgICAgICAvLyBTdGFydCBzdHJlYW0uCisgICAgICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoZW5naW5lLnN0cmVhbSk7CisgICAgICAgIHByaW50ZigiQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydCgpIHJldHVybmVkICVkID4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj5cbiIsIHJlc3VsdCk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICBlcnJvckNvdW50Kys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgd2F0Y2hMb29wcyA9IExPT1BfRFVSQVRJT05fTVNFQyAvIFNMRUVQX0RVUkFUSU9OX01TRUM7CisgICAgICAgICAgICBmb3IgKGludCBpID0gd2F0Y2hMb29wczsgaSA+IDA7IGktLSkgeworICAgICAgICAgICAgICAgIHByaW50ZigicGxheWluZyBzaWxlbmNlICMlMDJkLCBmcmFtZXNSZWFkID0gJTdkLCBmcmFtZXNXcml0dGVuID0gJTdkLCIKKyAgICAgICAgICAgICAgICAgICAgICAgIiBmcmFtZXNDYWxsZWQgPSAlNmQsIGNhbGxiYWNrQ291bnQgPSAlNGRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZChlbmdpbmUuc3RyZWFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKGVuZ2luZS5zdHJlYW0pLAorICAgICAgICAgICAgICAgICAgICAgICBlbmdpbmUuZnJhbWVzQ2FsbGVkLmxvYWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lLmNhbGxiYWNrQ291bnQubG9hZCgpCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB1c2xlZXAoU0xFRVBfRFVSQVRJT05fTVNFQyAqIDEwMDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGVuZ2luZS5zdG9wQXRGcmFtZSAhPSBJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgIGNhbGxiYWNrUmVzdWx0ID0gKGVuZ2luZS5jYWxsYmFja0NvdW50QWZ0ZXJTdG9wID09IDApID8gRVhJVF9TVUNDRVNTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRVhJVF9GQUlMVVJFOworICAgICAgICAgICAgaWYgKGNhbGxiYWNrUmVzdWx0KSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJFUlJPUiAtIENhbGxiYWNrIGNvdW50IGFmdGVyIFNUT1AgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lLmNhbGxiYWNrQ291bnRBZnRlclN0b3AubG9hZCgpKTsKKyAgICAgICAgICAgICAgICBlcnJvckNvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW5naW5lLnN0YXJ0aW5nRnJhbWVzUmVhZC5sb2FkKCkgPT0gZW5naW5lLmZyYW1lc1JlYWQubG9hZCgpKSB7CisgICAgICAgICAgICBwcmludGYoIkVSUk9SIC0gZnJhbWVzUmVhZCBkaWQgbm90IGFkdmFuY2UgYWNyb3NzIGNhbGxiYWNrc1xuIik7CisgICAgICAgICAgICBlcnJvckNvdW50Kys7CisgICAgICAgIH0KKworICAgICAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoZW5naW5lLnN0cmVhbSk7CisgICAgICAgIHByaW50ZigiQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKCkgcmV0dXJuZWQgJWQgPDw8PDw8PDw8PDw8PDw8PDw8PDw8XG4iLCByZXN1bHQpOworICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgZXJyb3JDb3VudCsrOworICAgICAgICB9CisgICAgICAgIHVzbGVlcChTTEVFUF9EVVJBVElPTl9NU0VDICogMTAwMCk7CisgICAgICAgIHByaW50ZigiZ2V0RnJhbWVzUmVhZCgpID0gJWQsIGdldEZyYW1lc1dyaXR0ZW4oKSA9ICVkXG4iLAorICAgICAgICAgICAgICAgKGludDMyX3QpIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKGVuZ2luZS5zdHJlYW0pLAorICAgICAgICAgICAgICAgKGludDMyX3QpIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKGVuZ2luZS5zdHJlYW0pKTsKKyAgICB9CisKKyAgICBzX0Nsb3NlQXVkaW9TdHJlYW0oJmVuZ2luZSk7CisKKyAgICBwcmludGYoImFhdWRpbyByZXN1bHQgPSAlZCA9ICVzXG4iLCByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgIHByaW50ZigidGVzdCAlc1xuIiwgZXJyb3JDb3VudCA/ICJGQUlMRUQiIDogIlBBU1NFRCIpOworCisgICAgcmV0dXJuIGVycm9yQ291bnQgPyBFWElUX0ZBSUxVUkUgOiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQW5kcm9pZC5icAppbmRleCBmOTNkNDRiLi44MjdkZjZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FuZHJvaWQuYnAKQEAgLTQwLDE1ICs0MCwxNyBAQAogICAgICAgICAiVHJhY2tQbGF5ZXJCYXNlLmNwcCIsCiAgICAgXSwKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGliZGwiLAogICAgICAgICAibGliYXVkaW91dGlscyIsCiAgICAgICAgICJsaWJhdWRpb21hbmFnZXIiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJkbCIsCisgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKICAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYm5ibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsibGliYmluZGVyIl0sCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvRWZmZWN0LmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvRWZmZWN0LmNwcAppbmRleCBiNDBmMGRiLi5jZjExOTM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0VmZmVjdC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9FZmZlY3QuY3BwCkBAIC00MzIsMTQgKzQzMiwxNSBAQAogfQogCiBzdGF0dXNfdCBBdWRpb0VmZmVjdDo6Z2V0RWZmZWN0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAotICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKSAvKmNvbnN0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYWYtPmdldEVmZmVjdERlc2NyaXB0b3IodXVpZCwgZGVzY3JpcHRvcik7CisgICAgcmV0dXJuIGFmLT5nZXRFZmZlY3REZXNjcmlwdG9yKHV1aWQsIHR5cGUsIHByZWZlcnJlZFR5cGVGbGFnLCBkZXNjcmlwdG9yKTsKIH0KIAotCiBzdGF0dXNfdCBBdWRpb0VmZmVjdDo6cXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpCkBAIC00NDgsNiArNDQ5LDk1IEBACiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgcmV0dXJuIGFwcy0+cXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhhdWRpb1Nlc3Npb24sIGRlc2NyaXB0b3JzLCBjb3VudCk7CiB9CisKK3N0YXR1c190IEF1ZGlvRWZmZWN0OjpuZXdFZmZlY3RVbmlxdWVJZChhdWRpb191bmlxdWVfaWRfdCogaWQpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAqaWQgPSBhZi0+bmV3QXVkaW9VbmlxdWVJZChBVURJT19VTklRVUVfSURfVVNFX0VGRkVDVCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb0VmZmVjdDo6YWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBjaGFyICp0eXBlU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1dWlkU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90ICppZCkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworCisgICAgaWYgKHR5cGVTdHIgPT0gTlVMTCAmJiB1dWlkU3RyID09IE5VTEwpIHJldHVybiBCQURfVkFMVUU7CisKKyAgICAvLyBDb252ZXJ0IHR5cGUgJiB1dWlkIGZyb20gc3RyaW5nIHRvIGVmZmVjdF91dWlkX3QuCisgICAgZWZmZWN0X3V1aWRfdCB0eXBlOworICAgIGlmICh0eXBlU3RyICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gc3RyaW5nVG9HdWlkKHR5cGVTdHIsICZ0eXBlKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKKyAgICB9IGVsc2UgeworICAgICAgICB0eXBlID0gKkVGRkVDVF9VVUlEX05VTEw7CisgICAgfQorCisgICAgZWZmZWN0X3V1aWRfdCB1dWlkOworICAgIGlmICh1dWlkU3RyICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gc3RyaW5nVG9HdWlkKHV1aWRTdHIsICZ1dWlkKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKKyAgICB9IGVsc2UgeworICAgICAgICB1dWlkID0gKkVGRkVDVF9VVUlEX05VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGFwcy0+YWRkU291cmNlRGVmYXVsdEVmZmVjdCgmdHlwZSwgb3BQYWNrYWdlTmFtZSwgJnV1aWQsIHByaW9yaXR5LCBzb3VyY2UsIGlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OmFkZFN0cmVhbURlZmF1bHRFZmZlY3QoY29uc3QgY2hhciAqdHlwZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXVpZFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgKmlkKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisKKyAgICBpZiAodHlwZVN0ciA9PSBOVUxMICYmIHV1aWRTdHIgPT0gTlVMTCkgcmV0dXJuIEJBRF9WQUxVRTsKKworICAgIC8vIENvbnZlcnQgdHlwZSAmIHV1aWQgZnJvbSBzdHJpbmcgdG8gZWZmZWN0X3V1aWRfdC4KKyAgICBlZmZlY3RfdXVpZF90IHR5cGU7CisgICAgaWYgKHR5cGVTdHIgIT0gTlVMTCkgeworICAgICAgICBzdGF0dXNfdCByZXMgPSBzdHJpbmdUb0d1aWQodHlwZVN0ciwgJnR5cGUpOworICAgICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOworICAgIH0gZWxzZSB7CisgICAgICAgIHR5cGUgPSAqRUZGRUNUX1VVSURfTlVMTDsKKyAgICB9CisKKyAgICBlZmZlY3RfdXVpZF90IHV1aWQ7CisgICAgaWYgKHV1aWRTdHIgIT0gTlVMTCkgeworICAgICAgICBzdGF0dXNfdCByZXMgPSBzdHJpbmdUb0d1aWQodXVpZFN0ciwgJnV1aWQpOworICAgICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOworICAgIH0gZWxzZSB7CisgICAgICAgIHV1aWQgPSAqRUZGRUNUX1VVSURfTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gYXBzLT5hZGRTdHJlYW1EZWZhdWx0RWZmZWN0KCZ0eXBlLCBvcFBhY2thZ2VOYW1lLCAmdXVpZCwgcHJpb3JpdHksIHVzYWdlLCBpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvRWZmZWN0OjpyZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisKKyAgICByZXR1cm4gYXBzLT5yZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OnJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKworICAgIHJldHVybiBhcHMtPnJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoaWQpOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXR1c190IEF1ZGlvRWZmZWN0OjpzdHJpbmdUb0d1aWQoY29uc3QgY2hhciAqc3RyLCBlZmZlY3RfdXVpZF90ICpndWlkKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9Qb2xpY3kuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9Qb2xpY3kuY3BwCmluZGV4IGQxZjc1MjUuLjk2MDFkNmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUG9saWN5LmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1BvbGljeS5jcHAKQEAgLTIyLDYgKzIyLDIyIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vCisvLyAgQXVkaW9EZXZpY2VUeXBlQWRkciBpbXBsZW1lbnRhdGlvbgorLy8KK3N0YXR1c190IEF1ZGlvRGV2aWNlVHlwZUFkZHI6OnJlYWRGcm9tUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSB7CisgICAgbVR5cGUgPSAoYXVkaW9fZGV2aWNlc190KSBwYXJjZWwtPnJlYWRJbnQzMigpOworICAgIG1BZGRyZXNzID0gcGFyY2VsLT5yZWFkU3RyaW5nOCgpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9EZXZpY2VUeXBlQWRkcjo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QgeworICAgIHBhcmNlbC0+d3JpdGVJbnQzMigoaW50MzJfdCkgbVR5cGUpOworICAgIHBhcmNlbC0+d3JpdGVTdHJpbmc4KG1BZGRyZXNzKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKworLy8KIC8vICBBdWRpb01peE1hdGNoQ3JpdGVyaW9uIGltcGxlbWVudGF0aW9uCiAvLwogQXVkaW9NaXhNYXRjaENyaXRlcmlvbjo6QXVkaW9NaXhNYXRjaENyaXRlcmlvbihhdWRpb191c2FnZV90IHVzYWdlLApAQCAtNDAsMTEgKzU2LDIyIEBACiBzdGF0dXNfdCBBdWRpb01peE1hdGNoQ3JpdGVyaW9uOjpyZWFkRnJvbVBhcmNlbChQYXJjZWwgKnBhcmNlbCkKIHsKICAgICBtUnVsZSA9IHBhcmNlbC0+cmVhZEludDMyKCk7Ci0gICAgaWYgKG1SdWxlID09IFJVTEVfTUFUQ0hfQVRUUklCVVRFX1VTQUdFIHx8Ci0gICAgICAgICAgICBtUnVsZSA9PSBSVUxFX0VYQ0xVREVfQVRUUklCVVRFX1VTQUdFKSB7Ci0gICAgICAgIG1WYWx1ZS5tVXNhZ2UgPSAoYXVkaW9fdXNhZ2VfdClwYXJjZWwtPnJlYWRJbnQzMigpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1WYWx1ZS5tU291cmNlID0gKGF1ZGlvX3NvdXJjZV90KXBhcmNlbC0+cmVhZEludDMyKCk7CisgICAgc3dpdGNoIChtUnVsZSkgeworICAgIGNhc2UgUlVMRV9NQVRDSF9BVFRSSUJVVEVfVVNBR0U6CisgICAgY2FzZSBSVUxFX0VYQ0xVREVfQVRUUklCVVRFX1VTQUdFOgorICAgICAgICBtVmFsdWUubVVzYWdlID0gKGF1ZGlvX3VzYWdlX3QpIHBhcmNlbC0+cmVhZEludDMyKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlVMRV9NQVRDSF9BVFRSSUJVVEVfQ0FQVFVSRV9QUkVTRVQ6CisgICAgY2FzZSBSVUxFX0VYQ0xVREVfQVRUUklCVVRFX0NBUFRVUkVfUFJFU0VUOgorICAgICAgICBtVmFsdWUubVNvdXJjZSA9IChhdWRpb19zb3VyY2VfdCkgcGFyY2VsLT5yZWFkSW50MzIoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSVUxFX01BVENIX1VJRDoKKyAgICBjYXNlIFJVTEVfRVhDTFVERV9VSUQ6CisgICAgICAgIG1WYWx1ZS5tVWlkID0gKHVpZF90KSBwYXJjZWwtPnJlYWRJbnQzMigpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgiVHJ5aW5nIHRvIGJ1aWxkIEF1ZGlvTWl4TWF0Y2hDcml0ZXJpb24gZnJvbSB1bmtub3duIHJ1bGUgJWQiLCBtUnVsZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTExNiw0ICsxNDMsMTEgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3ZvaWQgQXVkaW9NaXg6OmV4Y2x1ZGVVaWQodWlkX3QgdWlkKSBjb25zdCB7CisgICAgQXVkaW9NaXhNYXRjaENyaXRlcmlvbiBjcml0OworICAgIGNyaXQubVJ1bGUgPSBSVUxFX0VYQ0xVREVfVUlEOworICAgIGNyaXQubVZhbHVlLm1VaWQgPSB1aWQ7CisgICAgbUNyaXRlcmlhLmFkZChjcml0KTsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwCmluZGV4IDBhYWJhZjcuLjMyMjM2NDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUmVjb3JkLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAKQEAgLTQ5LDggKzQ5LDkgQEAKICAgICBzaXplX3Qgc2l6ZTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRCdWZmZXJTaXplKHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssICZzaXplKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpb1N5c3RlbSBjb3VsZCBub3QgcXVlcnkgdGhlIGlucHV0IGJ1ZmZlciBzaXplIGZvciBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCAiCi0gICAgICAgICAgICAgICJjaGFubmVsTWFzayAlI3g7IHN0YXR1cyAlZCIsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIHN0YXR1cyk7CisgICAgICAgIEFMT0dFKCIlcygpOiBBdWRpb1N5c3RlbSBjb3VsZCBub3QgcXVlcnkgdGhlIGlucHV0IGJ1ZmZlciBzaXplIGZvciIKKyAgICAgICAgICAgICAgIiBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3g7IHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICBfX2Z1bmNfXywgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKQEAgLTU4LDggKzU5LDggQEAKICAgICAvLyBBc3N1bWVzIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KQogICAgIGlmICgoKmZyYW1lQ291bnQgPSAoc2l6ZSAqIDIpIC8gKGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNoYW5uZWxNYXNrKSAqCiAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkpKSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBjb25maWd1cmF0aW9uOiBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3giLAotICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzayk7CisgICAgICAgIEFMT0dFKCIlcygpOiBVbnN1cHBvcnRlZCBjb25maWd1cmF0aW9uOiBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3giLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKQEAgLTIwOSw4ICsyMTAsOCBAQAogICAgICAgICBtQ2Jsa01lbW9yeS5jbGVhcigpOwogICAgICAgICBtQnVmZmVyTWVtb3J5LmNsZWFyKCk7CiAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLSAgICAgICAgQUxPR1YoIn5BdWRpb1JlY29yZCwgcmVsZWFzaW5nIHNlc3Npb24gaWQgJWQiLAotICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQpOworICAgICAgICBBTE9HVigiJXMoJWQpOiByZWxlYXNpbmcgc2Vzc2lvbiBpZCAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIG1TZXNzaW9uSWQpOwogICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKG1TZXNzaW9uSWQsIC0xIC8qcGlkKi8pOwogICAgIH0KIH0KQEAgLTIzOCw5ICsyMzksMTEgQEAKICAgICBwaWRfdCBjYWxsaW5nUGlkOwogICAgIHBpZF90IG15UGlkOwogCi0gICAgQUxPR1YoInNldCgpOiBpbnB1dFNvdXJjZSAlZCwgc2FtcGxlUmF0ZSAldSwgZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgJSN4LCBmcmFtZUNvdW50ICV6dSwgIgorICAgIC8vIE5vdGUgbVBvcnRJZCBpcyBub3QgdmFsaWQgdW50aWwgdGhlIHRyYWNrIGlzIGNyZWF0ZWQsIHNvIG9taXQgbVBvcnRJZCBpbiBBTE9HIGZvciBzZXQuCisgICAgQUxPR1YoIiVzKCk6IGlucHV0U291cmNlICVkLCBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3gsIGZyYW1lQ291bnQgJXp1LCAiCiAgICAgICAgICAgIm5vdGlmaWNhdGlvbkZyYW1lcyAldSwgc2Vzc2lvbklkICVkLCB0cmFuc2ZlclR5cGUgJWQsIGZsYWdzICUjeCwgb3BQYWNrYWdlTmFtZSAlcyAiCiAgICAgICAgICAgInVpZCAlZCwgcGlkICVkIiwKKyAgICAgICAgICBfX2Z1bmNfXywKICAgICAgICAgICBpbnB1dFNvdXJjZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICAgIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBmbGFncywgU3RyaW5nOChtT3BQYWNrYWdlTmFtZSkuc3RyaW5nKCksIHVpZCwgcGlkKTsKIApAQCAtMjU2LDcgKzI1OSw3IEBACiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgVFJBTlNGRVJfQ0FMTEJBQ0s6CiAgICAgICAgIGlmIChjYmYgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIlRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfQ0FMTEJBQ0sgYnV0IGNiZiA9PSBOVUxMIik7CisgICAgICAgICAgICBBTE9HRSgiJXMoKTogVHJhbnNmZXIgdHlwZSBUUkFOU0ZFUl9DQUxMQkFDSyBidXQgY2JmID09IE5VTEwiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KQEAgLTI2NSw3ICsyNjgsNyBAQAogICAgIGNhc2UgVFJBTlNGRVJfU1lOQzoKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR0UoIkludmFsaWQgdHJhbnNmZXIgdHlwZSAlZCIsIHRyYW5zZmVyVHlwZSk7CisgICAgICAgIEFMT0dFKCIlcygpOiBJbnZhbGlkIHRyYW5zZmVyIHR5cGUgJWQiLCBfX2Z1bmNfXywgdHJhbnNmZXJUeXBlKTsKICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtMjczLDcgKzI3Niw3IEBACiAKICAgICAvLyBpbnZhcmlhbnQgdGhhdCBtQXVkaW9SZWNvcmQgIT0gMCBpcyB0cnVlIG9ubHkgYWZ0ZXIgc2V0KCkgcmV0dXJucyBzdWNjZXNzZnVsbHkKICAgICBpZiAobUF1ZGlvUmVjb3JkICE9IDApIHsKLSAgICAgICAgQUxPR0UoIlRyYWNrIGFscmVhZHkgaW4gdXNlIik7CisgICAgICAgIEFMT0dFKCIlcygpOiBUcmFjayBhbHJlYWR5IGluIHVzZSIsIF9fZnVuY19fKTsKICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC0yODQsOCArMjg3LDggQEAKICAgICB9IGVsc2UgewogICAgICAgICAvLyBzdHJlYW0gdHlwZSBzaG91bGRuJ3QgYmUgbG9va2VkIGF0LCB0aGlzIHRyYWNrIGhhcyBhdWRpbyBhdHRyaWJ1dGVzCiAgICAgICAgIG1lbWNweSgmbUF0dHJpYnV0ZXMsIHBBdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0gICAgICAgIEFMT0dWKCJCdWlsZGluZyBBdWRpb1JlY29yZCB3aXRoIGF0dHJpYnV0ZXM6IHNvdXJjZT0lZCBmbGFncz0weCV4IHRhZ3M9WyVzXSIsCi0gICAgICAgICAgICAgIG1BdHRyaWJ1dGVzLnNvdXJjZSwgbUF0dHJpYnV0ZXMuZmxhZ3MsIG1BdHRyaWJ1dGVzLnRhZ3MpOworICAgICAgICBBTE9HVigiJXMoKTogQnVpbGRpbmcgQXVkaW9SZWNvcmQgd2l0aCBhdHRyaWJ1dGVzOiBzb3VyY2U9JWQgZmxhZ3M9MHgleCB0YWdzPVslc10iLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtQXR0cmlidXRlcy5zb3VyY2UsIG1BdHRyaWJ1dGVzLmZsYWdzLCBtQXR0cmlidXRlcy50YWdzKTsKICAgICB9CiAKICAgICBtU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CkBAIC0yOTgsMTQgKzMwMSwxNCBAQAogICAgIC8vIHZhbGlkYXRlIHBhcmFtZXRlcnMKICAgICAvLyBBdWRpb0ZsaW5nZXIgY2FwdHVyZSBvbmx5IHN1cHBvcnRzIGxpbmVhciBQQ00KICAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpIHx8ICFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKLSAgICAgICAgQUxPR0UoIkZvcm1hdCAlI3ggaXMgbm90IGxpbmVhciBwY20iLCBmb3JtYXQpOworICAgICAgICBBTE9HRSgiJXMoKTogRm9ybWF0ICUjeCBpcyBub3QgbGluZWFyIHBjbSIsIF9fZnVuY19fLCBmb3JtYXQpOwogICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAgICAgbUZvcm1hdCA9IGZvcm1hdDsKIAogICAgIGlmICghYXVkaW9faXNfaW5wdXRfY2hhbm5lbChjaGFubmVsTWFzaykpIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgY2hhbm5lbCBtYXNrICUjeCIsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IEludmFsaWQgY2hhbm5lbCBtYXNrICUjeCIsIF9fZnVuY19fLCBjaGFubmVsTWFzayk7CiAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KQEAgLTMyNiw3ICszMjksNyBAQAogICAgIC8vIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgaXMgaW5pdGlhbGl6ZWQgaW4gY3JlYXRlUmVjb3JkX2wKIAogICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7Ci0gICAgQUxPR1YoInNldCgpOiBtU2Vzc2lvbklkICVkIiwgbVNlc3Npb25JZCk7CisgICAgQUxPR1YoIiVzKCk6IG1TZXNzaW9uSWQgJWQiLCBfX2Z1bmNfXywgbVNlc3Npb25JZCk7CiAKICAgICBjYWxsaW5nUGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwogICAgIG15UGlkID0gZ2V0cGlkKCk7CkBAIC0zNTMsNiArMzU2LDggQEAKICAgICAvLyBjcmVhdGUgdGhlIElBdWRpb1JlY29yZAogICAgIHN0YXR1cyA9IGNyZWF0ZVJlY29yZF9sKDAgLyplcG9jaCovLCBtT3BQYWNrYWdlTmFtZSk7CiAKKyAgICBBTE9HVigiJXMoJWQpOiBzdGF0dXMgJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdHVzKTsKKwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgaWYgKG1BdWRpb1JlY29yZFRocmVhZCAhPSAwKSB7CiAgICAgICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQtPnJlcXVlc3RFeGl0KCk7ICAgLy8gc2VlIGNvbW1lbnQgaW4gQXVkaW9SZWNvcmQuaApAQCAtMzg4LDcgKzM5Myw3IEBACiAKIHN0YXR1c190IEF1ZGlvUmVjb3JkOjpzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50LCBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24pCiB7Ci0gICAgQUxPR1YoInN0YXJ0LCBzeW5jIGV2ZW50ICVkIHRyaWdnZXIgc2Vzc2lvbiAlZCIsIGV2ZW50LCB0cmlnZ2VyU2Vzc2lvbik7CisgICAgQUxPR1YoIiVzKCVkKTogc3luYyBldmVudCAlZCB0cmlnZ2VyIHNlc3Npb24gJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgZXZlbnQsIHRyaWdnZXJTZXNzaW9uKTsKIAogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICBpZiAobUFjdGl2ZSkgewpAQCAtNDI5LDcgKzQzNCw3IEBACiAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIG1BY3RpdmUgPSBmYWxzZTsKLSAgICAgICAgQUxPR0UoInN0YXJ0KCkgc3RhdHVzICVkIiwgc3RhdHVzKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogc3RhdHVzICVkIiwgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXR1cyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgc3A8QXVkaW9SZWNvcmRUaHJlYWQ+IHQgPSBtQXVkaW9SZWNvcmRUaHJlYWQ7CiAgICAgICAgIGlmICh0ICE9IDApIHsKQEAgLTQ1Myw2ICs0NTgsNyBAQAogdm9pZCBBdWRpb1JlY29yZDo6c3RvcCgpCiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIEFMT0dWKCIlcyglZCk6IG1BY3RpdmU6JWRcbiIsIF9fZnVuY19fLCBtUG9ydElkLCBtQWN0aXZlKTsKICAgICBpZiAoIW1BY3RpdmUpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTYzMSw4ICs2MzcsOCBAQAogICAgIFN0cmluZzggcmVzdWx0OwogCiAgICAgcmVzdWx0LmFwcGVuZCgiIEF1ZGlvUmVjb3JkOjpkdW1wXG4iKTsKLSAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIHN0YXR1cyglZCksIGFjdGl2ZSglZCksIHNlc3Npb24gSWQoJWQpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1cywgbUFjdGl2ZSwgbVNlc3Npb25JZCk7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBpZCglZCkgc3RhdHVzKCVkKSwgYWN0aXZlKCVkKSwgc2Vzc2lvbiBJZCglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBtUG9ydElkLCBtU3RhdHVzLCBtQWN0aXZlLCBtU2Vzc2lvbklkKTsKICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIGZsYWdzKCUjeCksIHJlcS4gZmxhZ3MoJSN4KSwgYXVkaW8gc291cmNlKCVkKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncywgbU9yaWdGbGFncywgbUF0dHJpYnV0ZXMuc291cmNlKTsKICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIGZvcm1hdCglI3gpLCBjaGFubmVsIG1hc2soJSN4KSwgY2hhbm5lbCBjb3VudCgldSksIHNhbXBsZSByYXRlKCV1KVxuIiwKQEAgLTY3NCw3ICs2ODAsNyBAQAogICAgIHN0YXR1c190IHN0YXR1czsKIAogICAgIGlmIChhdWRpb0ZsaW5nZXIgPT0gMCkgewotICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBhdWRpb2ZsaW5nZXIiKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogQ291bGQgbm90IGdldCBhdWRpb2ZsaW5nZXIiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC03MDEsNyArNzA3LDggQEAKICAgICAgICAgICAgIC8vIHVzZSBjYXNlIDM6IG9idGFpbi9yZWxlYXNlIG1vZGUKICAgICAgICAgICAgIChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfT0JUQUlOKTsKICAgICAgICAgaWYgKCF1c2VDYXNlQWxsb3dlZCkgewotICAgICAgICAgICAgQUxPR1coIkFVRElPX0lOUFVUX0ZMQUdfRkFTVCBkZW5pZWQsIGluY29tcGF0aWJsZSB0cmFuc2ZlciA9ICVzIiwKKyAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IEFVRElPX0lOUFVUX0ZMQUdfRkFTVCBkZW5pZWQsIGluY29tcGF0aWJsZSB0cmFuc2ZlciA9ICVzIiwKKyAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgICAgY29udmVydFRyYW5zZmVyVG9UZXh0KG1UcmFuc2ZlcikpOwogICAgICAgICAgICAgbUZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpIChtRmxhZ3MgJiB+KEFVRElPX0lOUFVUX0ZMQUdfRkFTVCB8CiAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfUkFXKSk7CkBAIC03MzYsNyArNzQzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7CiAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpb0ZsaW5nZXIgY291bGQgbm90IGNyZWF0ZSByZWNvcmQgdHJhY2ssIHN0YXR1czogJWQiLCBzdGF0dXMpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBBdWRpb0ZsaW5nZXIgY291bGQgbm90IGNyZWF0ZSByZWNvcmQgdHJhY2ssIHN0YXR1czogJWQiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdHVzKTsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KICAgICBBTE9HX0FTU0VSVChyZWNvcmQgIT0gMCk7CkBAIC03NDYsNyArNzU0LDggQEAKIAogICAgIG1Bd2FpdEJvb3N0ID0gZmFsc2U7CiAgICAgaWYgKG91dHB1dC5mbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgewotICAgICAgICBBTE9HSSgiQVVESU9fSU5QVVRfRkxBR19GQVNUIHN1Y2Nlc3NmdWw7IGZyYW1lQ291bnQgJXp1IC0+ICV6dSIsCisgICAgICAgIEFMT0dJKCIlcyglZCk6IEFVRElPX0lOUFVUX0ZMQUdfRkFTVCBzdWNjZXNzZnVsOyBmcmFtZUNvdW50ICV6dSAtPiAlenUiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgICAgbVJlcUZyYW1lQ291bnQsIG91dHB1dC5mcmFtZUNvdW50KTsKICAgICAgICAgbUF3YWl0Qm9vc3QgPSB0cnVlOwogICAgIH0KQEAgLTc1NiwxMyArNzY1LDEzIEBACiAgICAgbVNhbXBsZVJhdGUgPSBvdXRwdXQuc2FtcGxlUmF0ZTsKIAogICAgIGlmIChvdXRwdXQuY2JsayA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2siKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogICAgIGlNZW1Qb2ludGVyID0gb3V0cHV0LmNibGsgLT5wb2ludGVyKCk7CiAgICAgaWYgKGlNZW1Qb2ludGVyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayBwb2ludGVyIik7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IENvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayBwb2ludGVyIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtNzc3LDcgKzc4Niw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgYnVmZmVycyA9IG91dHB1dC5idWZmZXJzLT5wb2ludGVyKCk7CiAgICAgICAgIGlmIChidWZmZXJzID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGJ1ZmZlciBwb2ludGVyIik7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGJ1ZmZlciBwb2ludGVyIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQpAQCAtNzkxLDE5ICs4MDAsMjIgQEAKICAgICBtQXVkaW9SZWNvcmQgPSByZWNvcmQ7CiAgICAgbUNibGtNZW1vcnkgPSBvdXRwdXQuY2JsazsKICAgICBtQnVmZmVyTWVtb3J5ID0gb3V0cHV0LmJ1ZmZlcnM7CisgICAgbVBvcnRJZCA9IG91dHB1dC5wb3J0SWQ7CiAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwogCiAgICAgbUNibGsgPSBjYmxrOwogICAgIC8vIG5vdGUgdGhhdCBvdXRwdXQuZnJhbWVDb3VudCBpcyB0aGUgKHBvc3NpYmx5IHJldmlzZWQpIHZhbHVlIG9mIG1SZXFGcmFtZUNvdW50CiAgICAgaWYgKG91dHB1dC5mcmFtZUNvdW50IDwgbVJlcUZyYW1lQ291bnQgfHwgKG1SZXFGcmFtZUNvdW50ID09IDAgJiYgb3V0cHV0LmZyYW1lQ291bnQgPT0gMCkpIHsKLSAgICAgICAgQUxPR1coIlJlcXVlc3RlZCBmcmFtZUNvdW50ICV6dSBidXQgcmVjZWl2ZWQgZnJhbWVDb3VudCAlenUiLAorICAgICAgICBBTE9HVygiJXMoJWQpOiBSZXF1ZXN0ZWQgZnJhbWVDb3VudCAlenUgYnV0IHJlY2VpdmVkIGZyYW1lQ291bnQgJXp1IiwKKyAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCiAgICAgICAgICAgICAgIG1SZXFGcmFtZUNvdW50LCAgb3V0cHV0LmZyYW1lQ291bnQpOwogICAgIH0KIAogICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGFwcGxpY2F0aW9uIGlzIG5vdGlmaWVkIHdpdGggc3VmZmljaWVudCBtYXJnaW4gYmVmb3JlIG92ZXJydW4uCiAgICAgLy8gVGhlIGNvbXB1dGF0aW9uIGlzIGRvbmUgb24gc2VydmVyIHNpZGUuCiAgICAgaWYgKG1Ob3RpZmljYXRpb25GcmFtZXNSZXEgPiAwICYmIG91dHB1dC5ub3RpZmljYXRpb25GcmFtZUNvdW50ICE9IG1Ob3RpZmljYXRpb25GcmFtZXNSZXEpIHsKLSAgICAgICAgQUxPR1coIlNlcnZlciBhZGp1c3RlZCBub3RpZmljYXRpb25GcmFtZXMgZnJvbSAldSB0byAlenUgZm9yIGZyYW1lQ291bnQgJXp1IiwKKyAgICAgICAgQUxPR1coIiVzKCVkKTogU2VydmVyIGFkanVzdGVkIG5vdGlmaWNhdGlvbkZyYW1lcyBmcm9tICV1IHRvICV6dSBmb3IgZnJhbWVDb3VudCAlenUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNSZXEsIG91dHB1dC5ub3RpZmljYXRpb25GcmFtZUNvdW50LCBvdXRwdXQuZnJhbWVDb3VudCk7CiAgICAgfQogICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSAodWludDMyX3Qpb3V0cHV0Lm5vdGlmaWNhdGlvbkZyYW1lQ291bnQ7CkBAIC04NzEsNyArODgzLDcgQEAKICAgICAgICAgdGltZW91dC50dl9uc2VjID0gKGxvbmcpIChtcyAlIDEwMDApICogMTAwMDAwMDsKICAgICAgICAgcmVxdWVzdGVkID0gJnRpbWVvdXQ7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIiVzIGludmFsaWQgd2FpdENvdW50ICVkIiwgX19mdW5jX18sIHdhaXRDb3VudCk7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IGludmFsaWQgd2FpdENvdW50ICVkIiwgX19mdW5jX18sIG1Qb3J0SWQsIHdhaXRDb3VudCk7CiAgICAgICAgIHJlcXVlc3RlZCA9IE5VTEw7CiAgICAgfQogICAgIHJldHVybiBvYnRhaW5CdWZmZXIoYXVkaW9CdWZmZXIsIHJlcXVlc3RlZCwgTlVMTCAvKmVsYXBzZWQqLywgbm9uQ29udGlnKTsKQEAgLTk4MCw3ICs5OTIsOCBAQAogICAgIGlmIChzc2l6ZV90KHVzZXJTaXplKSA8IDAgfHwgKGJ1ZmZlciA9PSBOVUxMICYmIHVzZXJTaXplICE9IDApKSB7CiAgICAgICAgIC8vIHNhbml0eS1jaGVjay4gdXNlciBpcyBtb3N0LWxpa2VseSBwYXNzaW5nIGFuIGVycm9yIGNvZGUsIGFuZCBpdCB3b3VsZAogICAgICAgICAvLyBtYWtlIHRoZSByZXR1cm4gdmFsdWUgYW1iaWd1b3VzIChhY3R1YWxTaXplIHZzIGVycm9yKS4KLSAgICAgICAgQUxPR0UoIkF1ZGlvUmVjb3JkOjpyZWFkKGJ1ZmZlcj0lcCwgc2l6ZT0lenUgKCV6dSkiLCBidWZmZXIsIHVzZXJTaXplLCB1c2VyU2l6ZSk7CisgICAgICAgIEFMT0dFKCIlcyglZCkgKGJ1ZmZlcj0lcCwgc2l6ZT0lenUgKCV6dSkiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBidWZmZXIsIHVzZXJTaXplLCB1c2VyU2l6ZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCkBAIC0xMDM3LDcgKzEwNTAsNyBAQAogICAgICAgICAgICAgcG9sbFVzIDw8PSAxOwogICAgICAgICB9IHdoaWxlICh0cnlDb3VudGVyLS0gPiAwKTsKICAgICAgICAgaWYgKHRyeUNvdW50ZXIgPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZGlkIG5vdCByZWNlaXZlIGV4cGVjdGVkIHByaW9yaXR5IGJvb3N0IG9uIHRpbWUiKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IGRpZCBub3QgcmVjZWl2ZSBleHBlY3RlZCBwcmlvcml0eSBib29zdCBvbiB0aW1lIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICB9CiAgICAgICAgIC8vIFJ1biBhZ2FpbiBpbW1lZGlhdGVseQogICAgICAgICByZXR1cm4gMDsKQEAgLTExNjAsNyArMTE3Myw4IEBACiAgICAgaWYgKG5zICE9IE5TX1dIRU5FVkVSKSB7CiAgICAgICAgIHRpbWVvdXQudHZfc2VjID0gbnMgLyAxMDAwMDAwMDAwTEw7CiAgICAgICAgIHRpbWVvdXQudHZfbnNlYyA9IG5zICUgMTAwMDAwMDAwMExMOwotICAgICAgICBBTE9HVigidGltZW91dCAlbGQuJTAzZCIsIHRpbWVvdXQudHZfc2VjLCAoaW50KSB0aW1lb3V0LnR2X25zZWMgLyAxMDAwMDAwKTsKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogdGltZW91dCAlbGQuJTAzZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHRpbWVvdXQudHZfc2VjLCAoaW50KSB0aW1lb3V0LnR2X25zZWMgLyAxMDAwMDAwKTsKICAgICAgICAgcmVxdWVzdGVkID0gJnRpbWVvdXQ7CiAgICAgfQogCkBAIC0xMTcyLDE2ICsxMTg2LDE4IEBACiAgICAgICAgIHNpemVfdCBub25Db250aWc7CiAgICAgICAgIHN0YXR1c190IGVyciA9IG9idGFpbkJ1ZmZlcigmYXVkaW9CdWZmZXIsIHJlcXVlc3RlZCwgTlVMTCwgJm5vbkNvbnRpZyk7CiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKGVyciAhPSBOT19FUlJPUikgIT0gKGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgPT0gMCksCi0gICAgICAgICAgICAgICAgIm9idGFpbkJ1ZmZlcigpIGVycj0lZCBmcmFtZUNvdW50PSV6dSIsIGVyciwgYXVkaW9CdWZmZXIuZnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgIiVzKCVkKTogb2J0YWluQnVmZmVyKCkgZXJyPSVkIGZyYW1lQ291bnQ9JXp1IiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgZXJyLCBhdWRpb0J1ZmZlci5mcmFtZUNvdW50KTsKICAgICAgICAgcmVxdWVzdGVkID0gJkNsaWVudFByb3h5OjprTm9uQmxvY2tpbmc7CiAgICAgICAgIHNpemVfdCBhdmFpbCA9IGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgKyBub25Db250aWc7Ci0gICAgICAgIEFMT0dWKCJvYnRhaW5CdWZmZXIoJXUpIHJldHVybmVkICV6dSA9ICV6dSArICV6dSBlcnIgJWQiLAotICAgICAgICAgICAgICAgIG1SZW1haW5pbmdGcmFtZXMsIGF2YWlsLCBhdWRpb0J1ZmZlci5mcmFtZUNvdW50LCBub25Db250aWcsIGVycik7CisgICAgICAgIEFMT0dWKCIlcyglZCk6IG9idGFpbkJ1ZmZlcigldSkgcmV0dXJuZWQgJXp1ID0gJXp1ICsgJXp1IGVyciAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIG1SZW1haW5pbmdGcmFtZXMsIGF2YWlsLCBhdWRpb0J1ZmZlci5mcmFtZUNvdW50LCBub25Db250aWcsIGVycik7CiAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIGlmIChlcnIgPT0gVElNRURfT1VUIHx8IGVyciA9PSBXT1VMRF9CTE9DSyB8fCBlcnIgPT0gLUVJTlRSKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HRSgiRXJyb3IgJWQgb2J0YWluaW5nIGFuIGF1ZGlvIGJ1ZmZlciwgZ2l2aW5nIHVwLiIsIGVycik7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBFcnJvciAlZCBvYnRhaW5pbmcgYW4gYXVkaW8gYnVmZmVyLCBnaXZpbmcgdXAuIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIGVycik7CiAgICAgICAgICAgICByZXR1cm4gTlNfTkVWRVI7CiAgICAgICAgIH0KIApAQCAtMTIwMyw4ICsxMjE5LDggQEAKIAogICAgICAgICAvLyBTYW5pdHkgY2hlY2sgb24gcmV0dXJuZWQgc2l6ZQogICAgICAgICBpZiAoc3NpemVfdChyZWFkU2l6ZSkgPCAwIHx8IHJlYWRTaXplID4gcmVxU2l6ZSkgewotICAgICAgICAgICAgQUxPR0UoIkVWRU5UX01PUkVfREFUQSByZXF1ZXN0ZWQgJXp1IGJ5dGVzIGJ1dCBjYWxsYmFjayByZXR1cm5lZCAlemQgYnl0ZXMiLAotICAgICAgICAgICAgICAgICAgICByZXFTaXplLCBzc2l6ZV90KHJlYWRTaXplKSk7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiAgRVZFTlRfTU9SRV9EQVRBIHJlcXVlc3RlZCAlenUgYnl0ZXMgYnV0IGNhbGxiYWNrIHJldHVybmVkICV6ZCBieXRlcyIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCByZXFTaXplLCBzc2l6ZV90KHJlYWRTaXplKSk7CiAgICAgICAgICAgICByZXR1cm4gTlNfTkVWRVI7CiAgICAgICAgIH0KIApAQCAtMTI2NCw3ICsxMjgwLDcgQEAKIAogc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OnJlc3RvcmVSZWNvcmRfbChjb25zdCBjaGFyICpmcm9tKQogewotICAgIEFMT0dXKCJkZWFkIElBdWRpb1JlY29yZCwgY3JlYXRpbmcgYSBuZXcgb25lIGZyb20gJXMoKSIsIGZyb20pOworICAgIEFMT0dXKCIlcyglZCk6IGRlYWQgSUF1ZGlvUmVjb3JkLCBjcmVhdGluZyBhIG5ldyBvbmUgZnJvbSAlcygpIiwgX19mdW5jX18sIG1Qb3J0SWQsIGZyb20pOwogICAgICsrbVNlcXVlbmNlOwogCiAgICAgY29uc3QgaW50IElOSVRJQUxfUkVUUklFUyA9IDM7CkBAIC0xMjg0LDEwICsxMzAwLDcgQEAKICAgICBtTmV3UG9zaXRpb24gPSBwb3NpdGlvbiArIG1VcGRhdGVQZXJpb2Q7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gY3JlYXRlUmVjb3JkX2wocG9zaXRpb24sIG1PcFBhY2thZ2VOYW1lKTsKIAotICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR1coIiVzKCk6IGNyZWF0ZVJlY29yZF9sIGZhaWxlZCwgZG8gbm90IHJldHJ5IiwgX19mdW5jX18pOwotICAgICAgICByZXRyaWVzID0gMDsKLSAgICB9IGVsc2UgeworICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKICAgICAgICAgaWYgKG1BY3RpdmUpIHsKICAgICAgICAgICAgIC8vIGNhbGxiYWNrIHRocmVhZCBvciBzeW5jIGV2ZW50IGhhc24ndCBjaGFuZ2VkCiAgICAgICAgICAgICAvLyBGSVhNRSB0aGlzIGZhaWxzIGlmIHdlIGhhdmUgYSBuZXcgQXVkaW9GbGluZ2VyIGluc3RhbmNlCkBAIC0xMjk4LDE1ICsxMzExLDE3IEBACiAgICAgfQogCiAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HVygiJXMoKSBmYWlsZWQgc3RhdHVzICVkLCByZXRyaWVzICVkIiwgX19mdW5jX18sIHJlc3VsdCwgcmV0cmllcyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IGZhaWxlZCBzdGF0dXMgJWQsIHJldHJpZXMgJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgcmVzdWx0LCByZXRyaWVzKTsKICAgICAgICAgaWYgKC0tcmV0cmllcyA+IDApIHsKKyAgICAgICAgICAgIC8vIGxlYXZlIHRpbWUgZm9yIGFuIGV2ZW50dWFsIHJhY2UgY29uZGl0aW9uIHRvIGNsZWFyIGJlZm9yZSByZXRyeWluZworICAgICAgICAgICAgdXNsZWVwKDUwMDAwMCk7CiAgICAgICAgICAgICBnb3RvIHJldHJ5OwogICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HVygicmVzdG9yZVJlY29yZF9sKCkgZmFpbGVkIHN0YXR1cyAlZCIsIHJlc3VsdCk7Ci0gICAgICAgIG1BY3RpdmUgPSBmYWxzZTsKKyAgICAgICAgLy8gaWYgbm8gcmV0cmllcyBsZWZ0LCBzZXQgaW52YWxpZCBiaXQgdG8gZm9yY2UgcmVzdG9yaW5nIGF0IG5leHQgb2NjYXNpb24KKyAgICAgICAgLy8gYW5kIGF2b2lkIGluY29uc2lzdGVudCBhY3RpdmUgc3RhdGUgb24gY2xpZW50IGFuZCBzZXJ2ZXIgc2lkZXMKKyAgICAgICAgaWYgKG1DYmxrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGFuZHJvaWRfYXRvbWljX29yKENCTEtfSU5WQUxJRCwgJm1DYmxrLT5tRmxhZ3MpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTEzMTUsMTggKzEzMzAsMTggQEAKIHN0YXR1c190IEF1ZGlvUmVjb3JkOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spCiB7CiAgICAgaWYgKGNhbGxiYWNrID09IDApIHsKLSAgICAgICAgQUxPR1coIiVzIGFkZGluZyBOVUxMIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IGFkZGluZyBOVUxMIGNhbGxiYWNrISIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sudW5zYWZlX2dldCgpID09IGNhbGxiYWNrLmdldCgpKSB7Ci0gICAgICAgIEFMT0dXKCIlcyBhZGRpbmcgc2FtZSBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBBTE9HVygiJXMoJWQpOiBhZGRpbmcgc2FtZSBjYWxsYmFjayEiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgaWYgKG1JbnB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICBpZiAobURldmljZUNhbGxiYWNrICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dXKCIlcyBjYWxsYmFjayBhbHJlYWR5IHByZXNlbnQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IGNhbGxiYWNrIGFscmVhZHkgcHJlc2VudCEiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtSW5wdXQpOwogICAgICAgICB9CiAgICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1JbnB1dCk7CkBAIC0xMzM5LDEyICsxMzU0LDEyIEBACiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spCiB7CiAgICAgaWYgKGNhbGxiYWNrID09IDApIHsKLSAgICAgICAgQUxPR1coIiVzIHJlbW92aW5nIE5VTEwgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogcmVtb3ZpbmcgTlVMTCBjYWxsYmFjayEiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICBpZiAobURldmljZUNhbGxiYWNrLnVuc2FmZV9nZXQoKSAhPSBjYWxsYmFjay5nZXQoKSkgewotICAgICAgICBBTE9HVygiJXMgcmVtb3ZpbmcgZGlmZmVyZW50IGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IHJlbW92aW5nIGRpZmZlcmVudCBjYWxsYmFjayEiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgbURldmljZUNhbGxiYWNrLmNsZWFyKCk7CkBAIC0xNDQ5LDcgKzE0NjQsNyBAQAogICAgICAgICBucyA9IElOVDY0X01BWDsKICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihucyA8IDAsICJwcm9jZXNzQXVkaW9CdWZmZXIoKSByZXR1cm5lZCAlIiBQUklkNjQsIG5zKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihucyA8IDAsICIlcygpIHJldHVybmVkICVsbGQiLCBfX2Z1bmNfXywgKGxvbmcgbG9uZylucyk7CiAgICAgICAgIHBhdXNlSW50ZXJuYWwobnMpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAKaW5kZXggYzA3MjkwMS4uYmFlYWU4YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcApAQCAtODc4LDMxICs4NzgsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+c3RhcnRPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIHJldHVybiBhcHMtPnN0YXJ0T3V0cHV0KHBvcnRJZCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPnN0b3BPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIHJldHVybiBhcHMtPnN0b3BPdXRwdXQocG9ydElkKTsKIH0KIAotdm9pZCBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3ZvaWQgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybjsKLSAgICBhcHMtPnJlbGVhc2VPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIGFwcy0+cmVsZWFzZU91dHB1dChwb3J0SWQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKQEAgLTkyMywxMSArOTE3LDExIEBACiAgICAgICAgICAgICBjb25maWcsIGZsYWdzLCBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwgYm9vbCAqc2lsZW5jZWQpCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPnN0YXJ0SW5wdXQocG9ydElkLCBzaWxlbmNlZCk7CisgICAgcmV0dXJuIGFwcy0+c3RhcnRJbnB1dChwb3J0SWQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RvcElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQpAQCAtMTI0MiwyMCArMTIzNiwzMyBAQAogICAgIHJldHVybiBhcHMtPnJlZ2lzdGVyUG9saWN5TWl4ZXMobWl4ZXMsIHJlZ2lzdHJhdGlvbik7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+c3RhcnRBdWRpb1NvdXJjZShzb3VyY2UsIGF0dHJpYnV0ZXMsIGhhbmRsZSk7CisgICAgcmV0dXJuIGFwcy0+c2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWQsIGRldmljZXMpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpyZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCkgeworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFwcy0+cmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWQpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPnN0b3BBdWRpb1NvdXJjZShoYW5kbGUpOworICAgIHJldHVybiBhcHMtPnN0YXJ0QXVkaW9Tb3VyY2Uoc291cmNlLCBhdHRyaWJ1dGVzLCBwb3J0SWQpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFwcy0+c3RvcEF1ZGlvU291cmNlKHBvcnRJZCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRNYXN0ZXJNb25vKGJvb2wgbW9ubykKQEAgLTEzMDQsNiArMTMxMSwzMSBAQAogICAgIHJldHVybiBhcHMtPnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb0Zvcm1hdCwgZW5hYmxlZCk7CiB9CiAKKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldEFzc2lzdGFudFVpZCh1aWRfdCB1aWQpCit7CisgICAgY29uc3Qgc3AgPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisKKyAgICByZXR1cm4gYXBzLT5zZXRBc3Npc3RhbnRVaWQodWlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldEExMXlTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiB1aWRzKQoreworICAgIGNvbnN0IHNwIDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworCisgICAgcmV0dXJuIGFwcy0+c2V0QTExeVNlcnZpY2VzVWlkcyh1aWRzKTsKK30KKworYm9vbCBBdWRpb1N5c3RlbTo6aXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gYXBzLT5pc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCk7Cit9CisKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIGludCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjphZGRBdWRpb1BvcnRDYWxsYmFjaygKQEAgLTEzNjksOSArMTQwMSwxNCBAQAogfQogCiB2b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6Om9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKLSAgICAgICAgaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCi0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpIHsKICAgICByZWNvcmRfY29uZmlnX2NhbGxiYWNrIGNiID0gTlVMTDsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChBdWRpb1N5c3RlbTo6Z0xvY2spOwpAQCAtMTM3OSw3ICsxNDE2LDggQEAKICAgICB9CiAKICAgICBpZiAoY2IgIT0gTlVMTCkgewotICAgICAgICBjYihldmVudCwgY2xpZW50SW5mbywgY2xpZW50Q29uZmlnLCBkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKKyAgICAgICAgY2IoZXZlbnQsIGNsaWVudEluZm8sIGNsaWVudENvbmZpZywgY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgZGV2aWNlQ29uZmlnLCBlZmZlY3RzLCBwYXRjaEhhbmRsZSwgc291cmNlKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFjay5jcHAKaW5kZXggYWRlYjZhNi4uYjQ0NGQyZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFjay5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFjay5jcHAKQEAgLTMwLDkgKzMwLDExIEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvRmxpbmdlci5oPgorI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgogI2luY2x1ZGUgPG1lZGlhL1R5cGVDb252ZXJ0ZXIuaD4KIApAQCAtMTIwLDIyICsxMjIsMjIgQEAKICAgICBzdGF0dXNfdCBzdGF0dXM7CiAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZSgmYWZTYW1wbGVSYXRlLCBzdHJlYW1UeXBlKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJVbmFibGUgdG8gcXVlcnkgb3V0cHV0IHNhbXBsZSByYXRlIGZvciBzdHJlYW0gdHlwZSAlZDsgc3RhdHVzICVkIiwKLSAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLCBzdGF0dXMpOworICAgICAgICBBTE9HRSgiJXMoKTogVW5hYmxlIHRvIHF1ZXJ5IG91dHB1dCBzYW1wbGUgcmF0ZSBmb3Igc3RyZWFtIHR5cGUgJWQ7IHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIHN0cmVhbVR5cGUsIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogICAgIHNpemVfdCBhZkZyYW1lQ291bnQ7CiAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dEZyYW1lQ291bnQoJmFmRnJhbWVDb3VudCwgc3RyZWFtVHlwZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHF1ZXJ5IG91dHB1dCBmcmFtZSBjb3VudCBmb3Igc3RyZWFtIHR5cGUgJWQ7IHN0YXR1cyAlZCIsCi0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwgc3RhdHVzKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IFVuYWJsZSB0byBxdWVyeSBvdXRwdXQgZnJhbWUgY291bnQgZm9yIHN0cmVhbSB0eXBlICVkOyBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzdHJlYW1UeXBlLCBzdGF0dXMpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KICAgICB1aW50MzJfdCBhZkxhdGVuY3k7CiAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dExhdGVuY3koJmFmTGF0ZW5jeSwgc3RyZWFtVHlwZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHF1ZXJ5IG91dHB1dCBsYXRlbmN5IGZvciBzdHJlYW0gdHlwZSAlZDsgc3RhdHVzICVkIiwKLSAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLCBzdGF0dXMpOworICAgICAgICBBTE9HRSgiJXMoKTogVW5hYmxlIHRvIHF1ZXJ5IG91dHB1dCBsYXRlbmN5IGZvciBzdHJlYW0gdHlwZSAlZDsgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RyZWFtVHlwZSwgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKQEAgLTE0OCwxNSArMTUwLDI0IEBACiAgICAgLy8gQXVkaW9UcmFjay5TQU1QTEVfUkFURV9IWl9NSU4gPD0gc2FtcGxlUmF0ZSA8PSBBdWRpb1RyYWNrLlNBTVBMRV9SQVRFX0haX01BWC4KICAgICAvLyBSZXR1cm4gZXJyb3IgaW4gdGhlIHVubGlrZWx5IGV2ZW50IHRoYXQgaXQgZG9lcyBub3QsIGFzIHRoYXQncyBwYXJ0IG9mIHRoZSBBUEkgY29udHJhY3QuCiAgICAgaWYgKCpmcmFtZUNvdW50ID09IDApIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvVHJhY2s6OmdldE1pbkZyYW1lQ291bnQgZmFpbGVkIGZvciBzdHJlYW1UeXBlICVkLCBzYW1wbGVSYXRlICV1IiwKLSAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLCBzYW1wbGVSYXRlKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IGZhaWxlZCBmb3Igc3RyZWFtVHlwZSAlZCwgc2FtcGxlUmF0ZSAldSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBBTE9HVigiZ2V0TWluRnJhbWVDb3VudD0lenU6IGFmRnJhbWVDb3VudD0lenUsIGFmU2FtcGxlUmF0ZT0ldSwgYWZMYXRlbmN5PSV1IiwKLSAgICAgICAgICAgICpmcmFtZUNvdW50LCBhZkZyYW1lQ291bnQsIGFmU2FtcGxlUmF0ZSwgYWZMYXRlbmN5KTsKKyAgICBBTE9HVigiJXMoKTogZ2V0TWluRnJhbWVDb3VudD0lenU6IGFmRnJhbWVDb3VudD0lenUsIGFmU2FtcGxlUmF0ZT0ldSwgYWZMYXRlbmN5PSV1IiwKKyAgICAgICAgICAgIF9fZnVuY19fLCAqZnJhbWVDb3VudCwgYWZGcmFtZUNvdW50LCBhZlNhbXBsZVJhdGUsIGFmTGF0ZW5jeSk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCisvLyBzdGF0aWMKK2Jvb2wgQXVkaW9UcmFjazo6aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCYgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMpIHsKKyAgICBBTE9HVigiJXMoKSIsIF9fRlVOQ1RJT05fXyk7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gYXBzLT5pc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25maWcsIGF0dHJpYnV0ZXMpOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIHN0ZDo6c3RyaW5nIGF1ZGlvQ29udGVudFR5cGVTdHJpbmcoYXVkaW9fY29udGVudF90eXBlX3QgdmFsdWUpIHsKQEAgLTIwMSw3ICsyMTIsNyBAQAogICAgIC8vIFhYWDogc2hhbGwgd2UgZ2F0aGVyIGFsdGVybmF0aXZlIGluZm8gaWYgZmFpbGluZz8KICAgICBjb25zdCBzdGF0dXNfdCBsc3RhdHVzID0gdHJhY2stPmluaXRDaGVjaygpOwogICAgIGlmIChsc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dEKCJubyBtZXRyaWNzIGdhdGhlcmVkLCB0cmFjayBzdGF0dXM9JWQiLCAoaW50KSBsc3RhdHVzKTsKKyAgICAgICAgQUxPR0QoIiVzKCk6IG5vIG1ldHJpY3MgZ2F0aGVyZWQsIHRyYWNrIHN0YXR1cz0lZCIsIF9fZnVuY19fLCAoaW50KSBsc3RhdHVzKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMzQzLDcgKzM1NCw4IEBACiAgICAgICAgIG1DYmxrTWVtb3J5LmNsZWFyKCk7CiAgICAgICAgIG1TaGFyZWRCdWZmZXIuY2xlYXIoKTsKICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgICAgICBBTE9HVigifkF1ZGlvVHJhY2ssIHJlbGVhc2luZyBzZXNzaW9uIGlkICVkIGZyb20gJWQgb24gYmVoYWxmIG9mICVkIiwKKyAgICAgICAgQUxPR1YoIiVzKCVkKSwgcmVsZWFzaW5nIHNlc3Npb24gaWQgJWQgZnJvbSAlZCBvbiBiZWhhbGYgb2YgJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CiAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCwgbUNsaWVudFBpZCk7CiAgICAgfQpAQCAtMzc2LDggKzM4OCwxMCBAQAogICAgIHBpZF90IGNhbGxpbmdQaWQ7CiAgICAgcGlkX3QgbXlQaWQ7CiAKLSAgICBBTE9HVigic2V0KCk6IHN0cmVhbVR5cGUgJWQsIHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCwgZnJhbWVDb3VudCAlenUsICIKKyAgICAvLyBOb3RlIG1Qb3J0SWQgaXMgbm90IHZhbGlkIHVudGlsIHRoZSB0cmFjayBpcyBjcmVhdGVkLCBzbyBvbWl0IG1Qb3J0SWQgaW4gQUxPRyBmb3Igc2V0LgorICAgIEFMT0dWKCIlcygpOiBzdHJlYW1UeXBlICVkLCBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3gsIGZyYW1lQ291bnQgJXp1LCAiCiAgICAgICAgICAgImZsYWdzICMleCwgbm90aWZpY2F0aW9uRnJhbWVzICVkLCBzZXNzaW9uSWQgJWQsIHRyYW5zZmVyVHlwZSAlZCwgdWlkICVkLCBwaWQgJWQiLAorICAgICAgICAgIF9fZnVuY19fLAogICAgICAgICAgIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIGZsYWdzLCBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgICAgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIHVpZCwgcGlkKTsKIApAQCAtMzk2LDggKzQxMCwxMCBAQAogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgVFJBTlNGRVJfQ0FMTEJBQ0s6CisgICAgY2FzZSBUUkFOU0ZFUl9TWU5DX05PVElGX0NBTExCQUNLOgogICAgICAgICBpZiAoY2JmID09IE5VTEwgfHwgc2hhcmVkQnVmZmVyICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJUcmFuc2ZlciB0eXBlIFRSQU5TRkVSX0NBTExCQUNLIGJ1dCBjYmYgPT0gTlVMTCB8fCBzaGFyZWRCdWZmZXIgIT0gMCIpOworICAgICAgICAgICAgQUxPR0UoIiVzKCk6IFRyYW5zZmVyIHR5cGUgJXMgYnV0IGNiZiA9PSBOVUxMIHx8IHNoYXJlZEJ1ZmZlciAhPSAwIiwKKyAgICAgICAgICAgICAgICAgICAgY29udmVydFRyYW5zZmVyVG9UZXh0KHRyYW5zZmVyVHlwZSksIF9fZnVuY19fKTsKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQpAQCAtNDA1LDIwICs0MjEsMjEgQEAKICAgICBjYXNlIFRSQU5TRkVSX09CVEFJTjoKICAgICBjYXNlIFRSQU5TRkVSX1NZTkM6CiAgICAgICAgIGlmIChzaGFyZWRCdWZmZXIgIT0gMCkgewotICAgICAgICAgICAgQUxPR0UoIlRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfT0JUQUlOIGJ1dCBzaGFyZWRCdWZmZXIgIT0gMCIpOworICAgICAgICAgICAgQUxPR0UoIiVzKCk6IFRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfT0JUQUlOIGJ1dCBzaGFyZWRCdWZmZXIgIT0gMCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBjYXNlIFRSQU5TRkVSX1NIQVJFRDoKICAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVHJhbnNmZXIgdHlwZSBUUkFOU0ZFUl9TSEFSRUQgYnV0IHNoYXJlZEJ1ZmZlciA9PSAwIik7CisgICAgICAgICAgICBBTE9HRSgiJXMoKTogVHJhbnNmZXIgdHlwZSBUUkFOU0ZFUl9TSEFSRUQgYnV0IHNoYXJlZEJ1ZmZlciA9PSAwIiwgX19mdW5jX18pOwogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIHRyYW5zZmVyIHR5cGUgJWQiLCB0cmFuc2ZlclR5cGUpOworICAgICAgICBBTE9HRSgiJXMoKTogSW52YWxpZCB0cmFuc2ZlciB0eXBlICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdHJhbnNmZXJUeXBlKTsKICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtNDI2LDE0ICs0NDMsMTUgQEAKICAgICBtVHJhbnNmZXIgPSB0cmFuc2ZlclR5cGU7CiAgICAgbURvTm90UmVjb25uZWN0ID0gZG9Ob3RSZWNvbm5lY3Q7CiAKLSAgICBBTE9HVl9JRihzaGFyZWRCdWZmZXIgIT0gMCwgInNoYXJlZEJ1ZmZlcjogJXAsIHNpemU6ICV6dSIsIHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpLAotICAgICAgICAgICAgc2hhcmVkQnVmZmVyLT5zaXplKCkpOworICAgIEFMT0dWX0lGKHNoYXJlZEJ1ZmZlciAhPSAwLCAiJXMoKTogc2hhcmVkQnVmZmVyOiAlcCwgc2l6ZTogJXp1IiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSwgc2hhcmVkQnVmZmVyLT5zaXplKCkpOwogCi0gICAgQUxPR1YoInNldCgpIHN0cmVhbVR5cGUgJWQgZnJhbWVDb3VudCAlenUgZmxhZ3MgJTA0eCIsIHN0cmVhbVR5cGUsIGZyYW1lQ291bnQsIGZsYWdzKTsKKyAgICBBTE9HVigiJXMoKTogc3RyZWFtVHlwZSAlZCBmcmFtZUNvdW50ICV6dSBmbGFncyAlMDR4IiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBzdHJlYW1UeXBlLCBmcmFtZUNvdW50LCBmbGFncyk7CiAKICAgICAvLyBpbnZhcmlhbnQgdGhhdCBtQXVkaW9UcmFjayAhPSAwIGlzIHRydWUgb25seSBhZnRlciBzZXQoKSByZXR1cm5zIHN1Y2Nlc3NmdWxseQogICAgIGlmIChtQXVkaW9UcmFjayAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJUcmFjayBhbHJlYWR5IGluIHVzZSIpOworICAgICAgICBBTE9HRSgiJXMoKTogVHJhY2sgYWxyZWFkeSBpbiB1c2UiLCBfX2Z1bmNfXyk7CiAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtNDQ0LDcgKzQ2Miw3IEBACiAgICAgfQogICAgIGlmIChwQXR0cmlidXRlcyA9PSBOVUxMKSB7CiAgICAgICAgIGlmICh1aW50MzJfdChzdHJlYW1UeXBlKSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgewotICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgc3RyZWFtIHR5cGUgJWQiLCBzdHJlYW1UeXBlKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpOiBJbnZhbGlkIHN0cmVhbSB0eXBlICVkIiwgX19mdW5jX18sIHN0cmVhbVR5cGUpOwogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CkBAIC00NTMsMTkgKzQ3MSwxMiBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIHN0cmVhbSB0eXBlIHNob3VsZG4ndCBiZSBsb29rZWQgYXQsIHRoaXMgdHJhY2sgaGFzIGF1ZGlvIGF0dHJpYnV0ZXMKICAgICAgICAgbWVtY3B5KCZtQXR0cmlidXRlcywgcEF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgQUxPR1YoIkJ1aWxkaW5nIEF1ZGlvVHJhY2sgd2l0aCBhdHRyaWJ1dGVzOiB1c2FnZT0lZCBjb250ZW50PSVkIGZsYWdzPTB4JXggdGFncz1bJXNdIiwKLSAgICAgICAgICAgICAgICBtQXR0cmlidXRlcy51c2FnZSwgbUF0dHJpYnV0ZXMuY29udGVudF90eXBlLCBtQXR0cmlidXRlcy5mbGFncywgbUF0dHJpYnV0ZXMudGFncyk7CisgICAgICAgIEFMT0dWKCIlcygpOiBCdWlsZGluZyBBdWRpb1RyYWNrIHdpdGggYXR0cmlidXRlczoiCisgICAgICAgICAgICAgICAgIiB1c2FnZT0lZCBjb250ZW50PSVkIGZsYWdzPTB4JXggdGFncz1bJXNdIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgbUF0dHJpYnV0ZXMudXNhZ2UsIG1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSwgbUF0dHJpYnV0ZXMuZmxhZ3MsIG1BdHRyaWJ1dGVzLnRhZ3MpOwogICAgICAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOwotICAgICAgICBpZiAoKG1BdHRyaWJ1dGVzLmZsYWdzICYgQVVESU9fRkxBR19IV19BVl9TWU5DKSAhPSAwKSB7Ci0gICAgICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKG1BdHRyaWJ1dGVzLmZsYWdzICYgQVVESU9fRkxBR19MT1dfTEFURU5DWSkgIT0gMCkgewotICAgICAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIChmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNoZWNrIGRlZXAgYnVmZmVyIGFmdGVyIGZsYWdzIGhhdmUgYmVlbiBtb2RpZmllZCBhYm92ZQotICAgICAgICBpZiAoZmxhZ3MgPT0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSAmJiAobUF0dHJpYnV0ZXMuZmxhZ3MgJiBBVURJT19GTEFHX0RFRVBfQlVGRkVSKSAhPSAwKSB7Ci0gICAgICAgICAgICBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSOwotICAgICAgICB9CisgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfZmxhZ3NfdG9fYXVkaW9fb3V0cHV0X2ZsYWdzKG1BdHRyaWJ1dGVzLmZsYWdzLCBmbGFncyk7CiAgICAgfQogCiAgICAgLy8gdGhlc2UgYmVsb3cgc2hvdWxkIHByb2JhYmx5IGNvbWUgZnJvbSB0aGUgYXVkaW9GbGluZ2VyIHRvby4uLgpAQCAtNDc3LDE0ICs0ODgsMTQgQEAKIAogICAgIC8vIHZhbGlkYXRlIHBhcmFtZXRlcnMKICAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpKSB7Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIGZvcm1hdCAlI3giLCBmb3JtYXQpOworICAgICAgICBBTE9HRSgiJXMoKTogSW52YWxpZCBmb3JtYXQgJSN4IiwgX19mdW5jX18sIGZvcm1hdCk7CiAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KICAgICBtRm9ybWF0ID0gZm9ybWF0OwogCiAgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfY2hhbm5lbChjaGFubmVsTWFzaykpIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgY2hhbm5lbCBtYXNrICUjeCIsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IEludmFsaWQgY2hhbm5lbCBtYXNrICUjeCIsICBfX2Z1bmNfXywgY2hhbm5lbE1hc2spOwogICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC00OTcsOCArNTA4LDkgQEAKICAgICBpZiAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkKICAgICAgICAgICAgIHx8ICFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKICAgICAgICAgQUxPR1YoIChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpCi0gICAgICAgICAgICAgICAgICAgID8gIk9mZmxvYWQgcmVxdWVzdCwgZm9yY2luZyB0byBEaXJlY3QgT3V0cHV0IgotICAgICAgICAgICAgICAgICAgICA6ICJOb3QgbGluZWFyIFBDTSwgZm9yY2luZyB0byBEaXJlY3QgT3V0cHV0Iik7CisgICAgICAgICAgICAgICAgICAgID8gIiVzKCk6IE9mZmxvYWQgcmVxdWVzdCwgZm9yY2luZyB0byBEaXJlY3QgT3V0cHV0IgorICAgICAgICAgICAgICAgICAgICA6ICIlcygpOiBOb3QgbGluZWFyIFBDTSwgZm9yY2luZyB0byBEaXJlY3QgT3V0cHV0IiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwogICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkKICAgICAgICAgICAgICAgICAvLyBGSVhNRSB3aHkgY2FuJ3Qgd2UgYWxsb3cgZGlyZWN0IEFORCBmYXN0PwogICAgICAgICAgICAgICAgICgoZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICYgfkFVRElPX09VVFBVVF9GTEFHX0ZBU1QpOwpAQCAtNTU0LDE0ICs1NjYsMTQgQEAKICAgICAgICAgbU5vdGlmaWNhdGlvbnNQZXJCdWZmZXJSZXEgPSAwOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmICghKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJub3RpZmljYXRpb25GcmFtZXM9JWQgbm90IHBlcm1pdHRlZCBmb3Igbm9uLWZhc3QgdHJhY2siLAotICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMpOworICAgICAgICAgICAgQUxPR0UoIiVzKCk6IG5vdGlmaWNhdGlvbkZyYW1lcz0lZCBub3QgcGVybWl0dGVkIGZvciBub24tZmFzdCB0cmFjayIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBub3RpZmljYXRpb25GcmFtZXMpOwogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CiAgICAgICAgIGlmIChmcmFtZUNvdW50ID4gMCkgewotICAgICAgICAgICAgQUxPR0UoIm5vdGlmaWNhdGlvbkZyYW1lcz0lZCBub3QgcGVybWl0dGVkIHdpdGggbm9uLXplcm8gZnJhbWVDb3VudD0lenUiLAotICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMsIGZyYW1lQ291bnQpOworICAgICAgICAgICAgQUxPR0UoIiVzKCk6IG5vdGlmaWNhdGlvbkZyYW1lcz0lZCBub3QgcGVybWl0dGVkIHdpdGggbm9uLXplcm8gZnJhbWVDb3VudD0lenUiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbm90aWZpY2F0aW9uRnJhbWVzLCBmcmFtZUNvdW50KTsKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQpAQCAtNTcxLDcgKzU4Myw4IEBACiAgICAgICAgIG1Ob3RpZmljYXRpb25zUGVyQnVmZmVyUmVxID0gbWluKG1heE5vdGlmaWNhdGlvbnNQZXJCdWZmZXIsCiAgICAgICAgICAgICAgICAgbWF4KCh1aW50MzJfdCkgLW5vdGlmaWNhdGlvbkZyYW1lcywgbWluTm90aWZpY2F0aW9uc1BlckJ1ZmZlcikpOwogICAgICAgICBBTE9HV19JRihtTm90aWZpY2F0aW9uc1BlckJ1ZmZlclJlcSAhPSAodWludDMyX3QpIC1ub3RpZmljYXRpb25GcmFtZXMsCi0gICAgICAgICAgICAgICAgIm5vdGlmaWNhdGlvbkZyYW1lcz0lZCBjbGFtcGVkIHRvIHRoZSByYW5nZSAtJXUgdG8gLSV1IiwKKyAgICAgICAgICAgICAgICAiJXMoKTogbm90aWZpY2F0aW9uRnJhbWVzPSVkIGNsYW1wZWQgdG8gdGhlIHJhbmdlIC0ldSB0byAtJXUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLAogICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcywgbWluTm90aWZpY2F0aW9uc1BlckJ1ZmZlciwgbWF4Tm90aWZpY2F0aW9uc1BlckJ1ZmZlcik7CiAgICAgfQogICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSAwOwpAQCAtNjQ3LDYgKzY2MCw3IEBACiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpzdGFydCgpCiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIEFMT0dWKCIlcyglZCk6IHByaW9yIHN0YXRlOiVzIiwgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXRlVG9TdHJpbmcobVN0YXRlKSk7CiAKICAgICBpZiAobVN0YXRlID09IFNUQVRFX0FDVElWRSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC02ODYsNyArNzAwLDggQEAKICAgICAgICAgICAgIC8vIFNlcnZlciBzaWRlIGhhcyBjb25zdW1lZCBzb21ldGhpbmcsIGJ1dCBpcyBpdCBmaW5pc2hlZCBjb25zdW1pbmc/CiAgICAgICAgICAgICAvLyBJdCBpcyBwb3NzaWJsZSBzaW5jZSBmbHVzaCBhbmQgc3RvcCBhcmUgYXN5bmNocm9ub3VzIHRoYXQgdGhlIHNlcnZlcgogICAgICAgICAgICAgLy8gaXMgc3RpbGwgYWN0aXZlIGF0IHRoaXMgcG9pbnQuCi0gICAgICAgICAgICBBTE9HVigic3RhcnQ6IHNlcnZlciByZWFkOiVsbGQgIGN1bXVsYXRpdmUgZmx1c2hlZDolbGxkICBjbGllbnQgd3JpdHRlbjolbGxkIiwKKyAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IHNlcnZlciByZWFkOiVsbGQgIGN1bXVsYXRpdmUgZmx1c2hlZDolbGxkICBjbGllbnQgd3JpdHRlbjolbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpKG1GcmFtZXNXcml0dGVuU2VydmVyT2Zmc2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtU3RhcnRFdHMubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdKSwKICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltU3RhcnRFdHMubUZsdXNoZWQsCkBAIC03NDcsNyArNzYyLDcgQEAKICAgICAgICAgLy8gU3RhcnQgb3VyIGxvY2FsIFZvbHVtZUhhbmRsZXIgZm9yIHJlc3RvcmF0aW9uIHB1cnBvc2VzLgogICAgICAgICBtVm9sdW1lSGFuZGxlci0+c2V0U3RhcnRlZCgpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJzdGFydCgpIHN0YXR1cyAlZCIsIHN0YXR1cyk7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IHN0YXR1cyAlZCIsIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0dXMpOwogICAgICAgICBtU3RhdGUgPSBwcmV2aW91c1N0YXRlOwogICAgICAgICBpZiAodCAhPSAwKSB7CiAgICAgICAgICAgICBpZiAocHJldmlvdXNTdGF0ZSAhPSBTVEFURV9TVE9QUElORykgewpAQCAtNzY1LDYgKzc4MCw4IEBACiB2b2lkIEF1ZGlvVHJhY2s6OnN0b3AoKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigiJXMoJWQpOiBwcmlvciBzdGF0ZTolcyIsIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0ZVRvU3RyaW5nKG1TdGF0ZSkpOworCiAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9BQ1RJVkUgJiYgbVN0YXRlICE9IFNUQVRFX1BBVVNFRCkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNzc0LDcgKzc5MSw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRDsKICAgICAgICAgQUxPR0RfSUYobVNoYXJlZEJ1ZmZlciA9PSBudWxscHRyLAotICAgICAgICAgICAgICAgICJzdG9wKCkgY2FsbGVkIHdpdGggJXUgZnJhbWVzIGRlbGl2ZXJlZCIsIG1SZWxlYXNlZC52YWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAiJXMoJWQpOiBjYWxsZWQgd2l0aCAldSBmcmFtZXMgZGVsaXZlcmVkIiwgX19mdW5jX18sIG1Qb3J0SWQsIG1SZWxlYXNlZC52YWx1ZSgpKTsKICAgICAgICAgbVJlbGVhc2VkID0gMDsKICAgICB9CiAKQEAgLTc5NSw2ICs4MTIsMTAgQEAKICAgICBpZiAodCAhPSAwKSB7CiAgICAgICAgIGlmICghaXNPZmZsb2FkZWRfbCgpKSB7CiAgICAgICAgICAgICB0LT5wYXVzZSgpOworICAgICAgICB9IGVsc2UgaWYgKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9TWU5DX05PVElGX0NBTExCQUNLKSB7CisgICAgICAgICAgICAvLyBjYXVzZXMgd2FrZSB1cCBvZiB0aGUgcGxheWJhY2sgdGhyZWFkLCB0aGF0IHdpbGwgY2FsbGJhY2sgdGhlIGNsaWVudCBmb3IKKyAgICAgICAgICAgIC8vIEVWRU5UX1NUUkVBTV9FTkQgaW4gcHJvY2Vzc0F1ZGlvQnVmZmVyKCkKKyAgICAgICAgICAgIHQtPndha2UoKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgMCwgbVByZXZpb3VzUHJpb3JpdHkpOwpAQCAtODEwLDEwICs4MzEsMTIgQEAKIAogdm9pZCBBdWRpb1RyYWNrOjpmbHVzaCgpCiB7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIEFMT0dWKCIlcyglZCk6IHByaW9yIHN0YXRlOiVzIiwgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXRlVG9TdHJpbmcobVN0YXRlKSk7CisKICAgICBpZiAobVNoYXJlZEJ1ZmZlciAhPSAwKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfQUNUSVZFKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC04NDIsNiArODY1LDggQEAKIHZvaWQgQXVkaW9UcmFjazo6cGF1c2UoKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigiJXMoJWQpOiBwcmlvciBzdGF0ZTolcyIsIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0ZVRvU3RyaW5nKG1TdGF0ZSkpOworCiAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9BQ1RJVkUpIHsKICAgICAgICAgbVN0YXRlID0gU1RBVEVfUEFVU0VEOwogICAgIH0gZWxzZSBpZiAobVN0YXRlID09IFNUQVRFX1NUT1BQSU5HKSB7CkBAIC04NjcsNyArODkyLDggQEAKIAogICAgICAgICAgICAgdWludDMyX3QgaGFsRnJhbWVzOwogICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmdldFJlbmRlclBvc2l0aW9uKG1PdXRwdXQsICZoYWxGcmFtZXMsICZtUGF1c2VkUG9zaXRpb24pOwotICAgICAgICAgICAgQUxPR1YoIkF1ZGlvVHJhY2s6OnBhdXNlIGZvciBvZmZsb2FkLCBjYWNoZSBjdXJyZW50IHBvc2l0aW9uICV1IiwgbVBhdXNlZFBvc2l0aW9uKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IGZvciBvZmZsb2FkLCBjYWNoZSBjdXJyZW50IHBvc2l0aW9uICV1IiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIG1QYXVzZWRQb3NpdGlvbik7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC05MjEsMTAgKzk0NywxMyBAQAogc3RhdHVzX3QgQXVkaW9UcmFjazo6c2V0U2FtcGxlUmF0ZSh1aW50MzJfdCByYXRlKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigiJXMoJWQpOiBwcmlvciBzdGF0ZTolcyByYXRlOiV1IiwgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXRlVG9TdHJpbmcobVN0YXRlKSwgcmF0ZSk7CisKICAgICBpZiAocmF0ZSA9PSBtU2FtcGxlUmF0ZSkgewogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQotICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0X2woKSB8fCAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkpIHsKKyAgICBpZiAoaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkgfHwgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpCisgICAgICAgICAgICB8fCAobUNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIGlmIChtT3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CkBAIC05ODYsOCArMTAxNSw4IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBBTE9HVigic2V0UGxheWJhY2tSYXRlIChpbnB1dCk6IG1TYW1wbGVSYXRlOiV1ICBtU3BlZWQ6JWYgIG1QaXRjaDolZiIsCi0gICAgICAgICAgICBtU2FtcGxlUmF0ZSwgcGxheWJhY2tSYXRlLm1TcGVlZCwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CisgICAgQUxPR1YoIiVzKCVkKTogbVNhbXBsZVJhdGU6JXUgIG1TcGVlZDolZiAgbVBpdGNoOiVmIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBtU2FtcGxlUmF0ZSwgcGxheWJhY2tSYXRlLm1TcGVlZCwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CiAgICAgLy8gcGl0Y2ggaXMgZW11bGF0ZWQgYnkgYWRqdXN0aW5nIHNwZWVkIGFuZCBzYW1wbGVSYXRlCiAgICAgY29uc3QgdWludDMyX3QgZWZmZWN0aXZlUmF0ZSA9IGFkanVzdFNhbXBsZVJhdGUobVNhbXBsZVJhdGUsIHBsYXliYWNrUmF0ZS5tUGl0Y2gpOwogICAgIGNvbnN0IGZsb2F0IGVmZmVjdGl2ZVNwZWVkID0gYWRqdXN0U3BlZWQocGxheWJhY2tSYXRlLm1TcGVlZCwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CkBAIC05OTYsMzIgKzEwMjUsMzIgQEAKICAgICBwbGF5YmFja1JhdGVUZW1wLm1TcGVlZCA9IGVmZmVjdGl2ZVNwZWVkOwogICAgIHBsYXliYWNrUmF0ZVRlbXAubVBpdGNoID0gZWZmZWN0aXZlUGl0Y2g7CiAKLSAgICBBTE9HVigic2V0UGxheWJhY2tSYXRlIChlZmZlY3RpdmUpOiBtU2FtcGxlUmF0ZToldSAgbVNwZWVkOiVmICBtUGl0Y2g6JWYiLAotICAgICAgICAgICAgZWZmZWN0aXZlUmF0ZSwgZWZmZWN0aXZlU3BlZWQsIGVmZmVjdGl2ZVBpdGNoKTsKKyAgICBBTE9HVigiJXMoJWQpIChlZmZlY3RpdmUpIG1TYW1wbGVSYXRlOiV1ICBtU3BlZWQ6JWYgIG1QaXRjaDolZiIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgZWZmZWN0aXZlUmF0ZSwgZWZmZWN0aXZlU3BlZWQsIGVmZmVjdGl2ZVBpdGNoKTsKIAogICAgIGlmICghaXNBdWRpb1BsYXliYWNrUmF0ZVZhbGlkKHBsYXliYWNrUmF0ZVRlbXApKSB7Ci0gICAgICAgIEFMT0dXKCJzZXRQbGF5YmFja1JhdGUoJWYsICVmKSBmYWlsZWQgKGVmZmVjdGl2ZSByYXRlIG91dCBvZiBib3VuZHMpIiwKLSAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKSAoJWYsICVmKSBmYWlsZWQgKGVmZmVjdGl2ZSByYXRlIG91dCBvZiBib3VuZHMpIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgcGxheWJhY2tSYXRlLm1TcGVlZCwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIC8vIENoZWNrIGlmIHRoZSBidWZmZXIgc2l6ZSBpcyBjb21wYXRpYmxlLgogICAgIGlmICghaXNTYW1wbGVSYXRlU3BlZWRBbGxvd2VkX2woZWZmZWN0aXZlUmF0ZSwgZWZmZWN0aXZlU3BlZWQpKSB7Ci0gICAgICAgIEFMT0dXKCJzZXRQbGF5YmFja1JhdGUoJWYsICVmKSBmYWlsZWQgKGJ1ZmZlciBzaXplKSIsCi0gICAgICAgICAgICAgICAgcGxheWJhY2tSYXRlLm1TcGVlZCwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CisgICAgICAgIEFMT0dXKCIlcyglZCkgKCVmLCAlZikgZmFpbGVkIChidWZmZXIgc2l6ZSkiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICAvLyBDaGVjayByZXNhbXBsZXIgcmF0aW9zIGFyZSB3aXRoaW4gYm91bmRzCiAgICAgaWYgKCh1aW50NjRfdCllZmZlY3RpdmVSYXRlID4gKHVpbnQ2NF90KW1TYW1wbGVSYXRlICoKICAgICAgICAgICAgICh1aW50NjRfdClBVURJT19SRVNBTVBMRVJfRE9XTl9SQVRJT19NQVgpIHsKLSAgICAgICAgQUxPR1coInNldFBsYXliYWNrUmF0ZSglZiwgJWYpIGZhaWxlZC4gUmVzYW1wbGUgcmF0ZSBleGNlZWRzIG1heCBhY2NlcHRlZCB2YWx1ZSIsCi0gICAgICAgICAgICAgICAgcGxheWJhY2tSYXRlLm1TcGVlZCwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CisgICAgICAgIEFMT0dXKCIlcyglZCkgKCVmLCAlZikgZmFpbGVkLiBSZXNhbXBsZSByYXRlIGV4Y2VlZHMgbWF4IGFjY2VwdGVkIHZhbHVlIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgcGxheWJhY2tSYXRlLm1TcGVlZCwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgaWYgKCh1aW50NjRfdCllZmZlY3RpdmVSYXRlICogKHVpbnQ2NF90KUFVRElPX1JFU0FNUExFUl9VUF9SQVRJT19NQVggPCAodWludDY0X3QpbVNhbXBsZVJhdGUpIHsKLSAgICAgICAgQUxPR1coInNldFBsYXliYWNrUmF0ZSglZiwgJWYpIGZhaWxlZC4gUmVzYW1wbGUgcmF0ZSBiZWxvdyBtaW4gYWNjZXB0ZWQgdmFsdWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tSYXRlLm1TcGVlZCwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CisgICAgICAgIEFMT0dXKCIlcyglZCkgKCVmLCAlZikgZmFpbGVkLiBSZXNhbXBsZSByYXRlIGJlbG93IG1pbiBhY2NlcHRlZCB2YWx1ZSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHBsYXliYWNrUmF0ZS5tU3BlZWQsIHBsYXliYWNrUmF0ZS5tUGl0Y2gpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBtUGxheWJhY2tSYXRlID0gcGxheWJhY2tSYXRlOwpAQCAtMTIyMiw3ICsxMjUxLDggQEAKICAgICAgICAgdWludDMyX3QgZHNwRnJhbWVzID0gMDsKIAogICAgICAgICBpZiAoaXNPZmZsb2FkZWRfbCgpICYmICgobVN0YXRlID09IFNUQVRFX1BBVVNFRCkgfHwgKG1TdGF0ZSA9PSBTVEFURV9QQVVTRURfU1RPUFBJTkcpKSkgewotICAgICAgICAgICAgQUxPR1YoImdldFBvc2l0aW9uIGNhbGxlZCBpbiBwYXVzZWQgc3RhdGUsIHJldHVybiBjYWNoZWQgcG9zaXRpb24gJXUiLCBtUGF1c2VkUG9zaXRpb24pOworICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogY2FsbGVkIGluIHBhdXNlZCBzdGF0ZSwgcmV0dXJuIGNhY2hlZCBwb3NpdGlvbiAldSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIG1QYXVzZWRQb3NpdGlvbik7CiAgICAgICAgICAgICAqcG9zaXRpb24gPSBtUGF1c2VkUG9zaXRpb247CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KQEAgLTEzNjgsNyArMTM5OCw3IEBACiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldExhdGVuY3kobU91dHB1dCwgJm1BZkxhdGVuY3kpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR1coImdldExhdGVuY3koJWQpIGZhaWxlZCBzdGF0dXMgJWQiLCBtT3V0cHV0LCBzdGF0dXMpOworICAgICAgICBBTE9HVygiJXMoJWQpOiBnZXRMYXRlbmN5KCVkKSBmYWlsZWQgc3RhdHVzICVkIiwgX19mdW5jX18sIG1Qb3J0SWQsIG1PdXRwdXQsIHN0YXR1cyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gRklYTUUgZG9uJ3QgYmVsaWV2ZSB0aGlzIGxpZQogICAgICAgICBtTGF0ZW5jeSA9IG1BZkxhdGVuY3kgKyAoMTAwMExMICogbUZyYW1lQ291bnQpIC8gbVNhbXBsZVJhdGU7CkBAIC0xMzg0LDYgKzE0MTQsNyBAQAogICAgICAgICBNRURJQV9DQVNFX0VOVU0oVFJBTlNGRVJfT0JUQUlOKTsKICAgICAgICAgTUVESUFfQ0FTRV9FTlVNKFRSQU5TRkVSX1NZTkMpOwogICAgICAgICBNRURJQV9DQVNFX0VOVU0oVFJBTlNGRVJfU0hBUkVEKTsKKyAgICAgICAgTUVESUFfQ0FTRV9FTlVNKFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0spOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuICJVTlJFQ09HTklaRUQiOwogICAgIH0KQEAgLTEzOTYsNyArMTQyNyw4IEBACiAKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGF1ZGlvRmxpbmdlciA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGF1ZGlvZmxpbmdlciIpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGF1ZGlvZmxpbmdlciIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtMTQxNSwxMSArMTQ0NywxNCBAQAogICAgICAgICAgICAgLy8gdXNlIGNhc2UgMzogb2J0YWluL3JlbGVhc2UgbW9kZQogICAgICAgICAgICAgKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9PQlRBSU4pIHx8CiAgICAgICAgICAgICAvLyB1c2UgY2FzZSA0OiBzeW5jaHJvbm91cyB3cml0ZQotICAgICAgICAgICAgKChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfU1lOQykgJiYgbVRocmVhZENhbkNhbGxKYXZhKTsKKyAgICAgICAgICAgICgobVRyYW5zZmVyID09IFRSQU5TRkVSX1NZTkMgfHwgbVRyYW5zZmVyID09IFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0spCisgICAgICAgICAgICAgICAgICAgICYmIG1UaHJlYWRDYW5DYWxsSmF2YSk7CiAKICAgICAgICAgYm9vbCBmYXN0QWxsb3dlZCA9IHNoYXJlZEJ1ZmZlciB8fCB0cmFuc2ZlckFsbG93ZWQ7CiAgICAgICAgIGlmICghZmFzdEFsbG93ZWQpIHsKLSAgICAgICAgICAgIEFMT0dXKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIGRlbmllZCBieSBjbGllbnQsIG5vdCBzaGFyZWQgYnVmZmVyIGFuZCB0cmFuc2ZlciA9ICVzIiwKKyAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgZGVuaWVkIGJ5IGNsaWVudCwiCisgICAgICAgICAgICAgICAgICAiIG5vdCBzaGFyZWQgYnVmZmVyIGFuZCB0cmFuc2ZlciA9ICVzIiwKKyAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgICAgY29udmVydFRyYW5zZmVyVG9UZXh0KG1UcmFuc2ZlcikpOwogICAgICAgICAgICAgbUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAobUZsYWdzICYgfkFVRElPX09VVFBVVF9GTEFHX0ZBU1QpOwogICAgICAgICB9CkBAIC0xNDY4LDcgKzE1MDMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7CiAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8IG91dHB1dC5vdXRwdXRJZCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICBBTE9HRSgiQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgdHJhY2ssIHN0YXR1czogJWQgb3V0cHV0ICVkIiwgc3RhdHVzLCBvdXRwdXQub3V0cHV0SWQpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBBdWRpb0ZsaW5nZXIgY291bGQgbm90IGNyZWF0ZSB0cmFjaywgc3RhdHVzOiAlZCBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0dXMsIG91dHB1dC5vdXRwdXRJZCk7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgIH0KQEAgLTE0ODksNiArMTUyNSw3IEBACiAgICAgbUFmRnJhbWVDb3VudCA9IG91dHB1dC5hZkZyYW1lQ291bnQ7CiAgICAgbUFmU2FtcGxlUmF0ZSA9IG91dHB1dC5hZlNhbXBsZVJhdGU7CiAgICAgbUFmTGF0ZW5jeSA9IG91dHB1dC5hZkxhdGVuY3lNczsKKyAgICBtUG9ydElkID0gb3V0cHV0LnBvcnRJZDsKIAogICAgIG1MYXRlbmN5ID0gbUFmTGF0ZW5jeSArICgxMDAwTEwgKiBtRnJhbWVDb3VudCkgLyBtU2FtcGxlUmF0ZTsKIApAQCAtMTQ5OCwxMyArMTUzNSwxMyBAQAogICAgIC8vIEZJWE1FIGNvbXBhcmUgdG8gQXVkaW9SZWNvcmQKICAgICBzcDxJTWVtb3J5PiBpTWVtID0gdHJhY2stPmdldENibGsoKTsKICAgICBpZiAoaU1lbSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2siKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogICAgIHZvaWQgKmlNZW1Qb2ludGVyID0gaU1lbS0+cG9pbnRlcigpOwogICAgIGlmIChpTWVtUG9pbnRlciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2sgcG9pbnRlciIpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2sgcG9pbnRlciIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KQEAgLTE1MjMsMTQgKzE1NjAsMTQgQEAKICAgICBtQXdhaXRCb29zdCA9IGZhbHNlOwogICAgIGlmIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSB7CiAgICAgICAgIGlmIChvdXRwdXQuZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSB7Ci0gICAgICAgICAgICBBTE9HSSgiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBzdWNjZXNzZnVsOyBmcmFtZUNvdW50ICV6dSAtPiAlenUiLAotICAgICAgICAgICAgICAgICAgbVJlcUZyYW1lQ291bnQsIG1GcmFtZUNvdW50KTsKKyAgICAgICAgICAgIEFMT0dJKCIlcyglZCk6IEFVRElPX09VVFBVVF9GTEFHX0ZBU1Qgc3VjY2Vzc2Z1bDsgZnJhbWVDb3VudCAlenUgLT4gJXp1IiwKKyAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBtUmVxRnJhbWVDb3VudCwgbUZyYW1lQ291bnQpOwogICAgICAgICAgICAgaWYgKCFtVGhyZWFkQ2FuQ2FsbEphdmEpIHsKICAgICAgICAgICAgICAgICBtQXdhaXRCb29zdCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVygiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgc2VydmVyOyBmcmFtZUNvdW50ICV6dSAtPiAlenUiLCBtUmVxRnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50KTsKKyAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgZGVuaWVkIGJ5IHNlcnZlcjsgZnJhbWVDb3VudCAlenUgLT4gJXp1IiwKKyAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBtUmVxRnJhbWVDb3VudCwgbUZyYW1lQ291bnQpOwogICAgICAgICB9CiAgICAgfQogICAgIG1GbGFncyA9IG91dHB1dC5mbGFnczsKQEAgLTE1NTgsNyArMTU5NSw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgYnVmZmVycyA9IG1TaGFyZWRCdWZmZXItPnBvaW50ZXIoKTsKICAgICAgICAgaWYgKGJ1ZmZlcnMgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgYnVmZmVyIHBvaW50ZXIiKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IENvdWxkIG5vdCBnZXQgYnVmZmVyIHBvaW50ZXIiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CkBAIC0xNjQ3LDcgKzE2ODQsNyBAQAogICAgICAgICB0aW1lb3V0LnR2X25zZWMgPSAobG9uZykgKG1zICUgMTAwMCkgKiAxMDAwMDAwOwogICAgICAgICByZXF1ZXN0ZWQgPSAmdGltZW91dDsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiJXMgaW52YWxpZCB3YWl0Q291bnQgJWQiLCBfX2Z1bmNfXywgd2FpdENvdW50KTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogaW52YWxpZCB3YWl0Q291bnQgJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgd2FpdENvdW50KTsKICAgICAgICAgcmVxdWVzdGVkID0gTlVMTDsKICAgICB9CiAgICAgcmV0dXJuIG9idGFpbkJ1ZmZlcihhdWRpb0J1ZmZlciwgcmVxdWVzdGVkLCBOVUxMIC8qZWxhcHNlZCovLCBub25Db250aWcpOwpAQCAtMTc1Nyw3ICsxNzk0LDggQEAKIHsKICAgICBpbnQzMl90IGZsYWdzID0gYW5kcm9pZF9hdG9taWNfYW5kKH5DQkxLX0RJU0FCTEVELCAmbUNibGstPm1GbGFncyk7CiAgICAgaWYgKChtU3RhdGUgPT0gU1RBVEVfQUNUSVZFKSAmJiAoZmxhZ3MgJiBDQkxLX0RJU0FCTEVEKSkgewotICAgICAgICBBTE9HVygicmVsZWFzZUJ1ZmZlcigpIHRyYWNrICVwIGRpc2FibGVkIGR1ZSB0byBwcmV2aW91cyB1bmRlcnJ1biwgcmVzdGFydGluZyIsIHRoaXMpOworICAgICAgICBBTE9HVygiJXMoJWQpOiByZWxlYXNlQnVmZmVyKCkgdHJhY2sgJXAgZGlzYWJsZWQgZHVlIHRvIHByZXZpb3VzIHVuZGVycnVuLCByZXN0YXJ0aW5nIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgdGhpcyk7CiAgICAgICAgIC8vIEZJWE1FIGlnbm9yaW5nIHN0YXR1cwogICAgICAgICBtQXVkaW9UcmFjay0+c3RhcnQoKTsKICAgICB9CkBAIC0xNzY3LDcgKzE4MDUsNyBAQAogCiBzc2l6ZV90IEF1ZGlvVHJhY2s6OndyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHVzZXJTaXplLCBib29sIGJsb2NraW5nKQogewotICAgIGlmIChtVHJhbnNmZXIgIT0gVFJBTlNGRVJfU1lOQykgeworICAgIGlmIChtVHJhbnNmZXIgIT0gVFJBTlNGRVJfU1lOQyAmJiBtVHJhbnNmZXIgIT0gVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSykgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCkBAIC0xNzg0LDcgKzE4MjIsOCBAQAogICAgIGlmIChzc2l6ZV90KHVzZXJTaXplKSA8IDAgfHwgKGJ1ZmZlciA9PSBOVUxMICYmIHVzZXJTaXplICE9IDApKSB7CiAgICAgICAgIC8vIFNhbml0eS1jaGVjazogdXNlciBpcyBtb3N0LWxpa2VseSBwYXNzaW5nIGFuIGVycm9yIGNvZGUsIGFuZCBpdCB3b3VsZAogICAgICAgICAvLyBtYWtlIHRoZSByZXR1cm4gdmFsdWUgYW1iaWd1b3VzIChhY3R1YWxTaXplIHZzIGVycm9yKS4KLSAgICAgICAgQUxPR0UoIkF1ZGlvVHJhY2s6OndyaXRlKGJ1ZmZlcj0lcCwgc2l6ZT0lenUgKCV6ZCkiLCBidWZmZXIsIHVzZXJTaXplLCB1c2VyU2l6ZSk7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IEF1ZGlvVHJhY2s6OndyaXRlKGJ1ZmZlcj0lcCwgc2l6ZT0lenUgKCV6ZCkiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBidWZmZXIsIHVzZXJTaXplLCB1c2VyU2l6ZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCkBAIC0xODE3LDcgKzE4NTYsMTcgQEAKIAogICAgIGlmICh3cml0dGVuID4gMCkgewogICAgICAgICBtRnJhbWVzV3JpdHRlbiArPSB3cml0dGVuIC8gbUZyYW1lU2l6ZTsKKworICAgICAgICBpZiAobVRyYW5zZmVyID09IFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0spIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvVHJhY2tUaHJlYWQ+IHQgPSBtQXVkaW9UcmFja1RocmVhZDsKKyAgICAgICAgICAgIGlmICh0ICE9IDApIHsKKyAgICAgICAgICAgICAgICAvLyBjYXVzZXMgd2FrZSB1cCBvZiB0aGUgcGxheWJhY2sgdGhyZWFkLCB0aGF0IHdpbGwgY2FsbGJhY2sgdGhlIGNsaWVudCBmb3IKKyAgICAgICAgICAgICAgICAvLyBtb3JlIGRhdGEgKHdpdGggRVZFTlRfQ0FOX1dSSVRFX01PUkVfREFUQSkgaW4gcHJvY2Vzc0F1ZGlvQnVmZmVyKCkKKyAgICAgICAgICAgICAgICB0LT53YWtlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CisKICAgICByZXR1cm4gd3JpdHRlbjsKIH0KIApAQCAtMTg0Niw3ICsxODk1LDggQEAKICAgICAgICAgICAgIHBvbGxVcyA8PD0gMTsKICAgICAgICAgfSB3aGlsZSAodHJ5Q291bnRlci0tID4gMCk7CiAgICAgICAgIGlmICh0cnlDb3VudGVyIDwgMCkgewotICAgICAgICAgICAgQUxPR0UoImRpZCBub3QgcmVjZWl2ZSBleHBlY3RlZCBwcmlvcml0eSBib29zdCBvbiB0aW1lIik7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBkaWQgbm90IHJlY2VpdmUgZXhwZWN0ZWQgcHJpb3JpdHkgYm9vc3Qgb24gdGltZSIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgfQogICAgICAgICAvLyBSdW4gYWdhaW4gaW1tZWRpYXRlbHkKICAgICAgICAgcmV0dXJuIDA7CkBAIC0yMDcwLDggKzIxMjAsOCBAQAogICAgICAgICBpZiAobnMgPCAwKSBucyA9IDA7CiAgICAgfQogCi0gICAgLy8gSWYgbm90IHN1cHBseWluZyBkYXRhIGJ5IEVWRU5UX01PUkVfREFUQSwgdGhlbiB3ZSdyZSBkb25lCi0gICAgaWYgKG1UcmFuc2ZlciAhPSBUUkFOU0ZFUl9DQUxMQkFDSykgeworICAgIC8vIElmIG5vdCBzdXBwbHlpbmcgZGF0YSBieSBFVkVOVF9NT1JFX0RBVEEgb3IgRVZFTlRfQ0FOX1dSSVRFX01PUkVfREFUQSwgdGhlbiB3ZSdyZSBkb25lCisgICAgaWYgKG1UcmFuc2ZlciAhPSBUUkFOU0ZFUl9DQUxMQkFDSyAmJiBtVHJhbnNmZXIgIT0gVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSykgewogICAgICAgICByZXR1cm4gbnM7CiAgICAgfQogCkBAIC0yMDg3LDcgKzIxMzcsOCBAQAogICAgIGlmIChucyAhPSBOU19XSEVORVZFUikgewogICAgICAgICB0aW1lb3V0LnR2X3NlYyA9IG5zIC8gMTAwMDAwMDAwMExMOwogICAgICAgICB0aW1lb3V0LnR2X25zZWMgPSBucyAlIDEwMDAwMDAwMDBMTDsKLSAgICAgICAgQUxPR1YoInRpbWVvdXQgJWxkLiUwM2QiLCB0aW1lb3V0LnR2X3NlYywgKGludCkgdGltZW91dC50dl9uc2VjIC8gMTAwMDAwMCk7CisgICAgICAgIEFMT0dWKCIlcyglZCk6IHRpbWVvdXQgJWxkLiUwM2QiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCB0aW1lb3V0LnR2X3NlYywgKGludCkgdGltZW91dC50dl9uc2VjIC8gMTAwMDAwMCk7CiAgICAgICAgIHJlcXVlc3RlZCA9ICZ0aW1lb3V0OwogICAgIH0KIApAQCAtMjA5OSwxOCArMjE1MCwyMCBAQAogICAgICAgICBzaXplX3Qgbm9uQ29udGlnOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBvYnRhaW5CdWZmZXIoJmF1ZGlvQnVmZmVyLCByZXF1ZXN0ZWQsIE5VTEwsICZub25Db250aWcpOwogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKChlcnIgIT0gTk9fRVJST1IpICE9IChhdWRpb0J1ZmZlci5mcmFtZUNvdW50ID09IDApLAotICAgICAgICAgICAgICAgICJvYnRhaW5CdWZmZXIoKSBlcnI9JWQgZnJhbWVDb3VudD0lenUiLCBlcnIsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgICIlcyglZCk6IG9idGFpbkJ1ZmZlcigpIGVycj0lZCBmcmFtZUNvdW50PSV6dSIsCisgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBlcnIsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQpOwogICAgICAgICByZXF1ZXN0ZWQgPSAmQ2xpZW50UHJveHk6OmtOb25CbG9ja2luZzsKICAgICAgICAgc2l6ZV90IGF2YWlsID0gYXVkaW9CdWZmZXIuZnJhbWVDb3VudCArIG5vbkNvbnRpZzsKLSAgICAgICAgQUxPR1YoIm9idGFpbkJ1ZmZlcigldSkgcmV0dXJuZWQgJXp1ID0gJXp1ICsgJXp1IGVyciAlZCIsCi0gICAgICAgICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lcywgYXZhaWwsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQsIG5vbkNvbnRpZywgZXJyKTsKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogb2J0YWluQnVmZmVyKCV1KSByZXR1cm5lZCAlenUgPSAlenUgKyAlenUgZXJyICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgbVJlbWFpbmluZ0ZyYW1lcywgYXZhaWwsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQsIG5vbkNvbnRpZywgZXJyKTsKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgaWYgKGVyciA9PSBUSU1FRF9PVVQgfHwgZXJyID09IFdPVUxEX0JMT0NLIHx8IGVyciA9PSAtRUlOVFIgfHwKICAgICAgICAgICAgICAgICAgICAgKGlzT2ZmbG9hZGVkKCkgJiYgKGVyciA9PSBERUFEX09CSkVDVCkpKSB7CiAgICAgICAgICAgICAgICAgLy8gRklYTUUgYnVnIDI1MTk1NzU5CiAgICAgICAgICAgICAgICAgcmV0dXJuIDEwMDAwMDA7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HRSgiRXJyb3IgJWQgb2J0YWluaW5nIGFuIGF1ZGlvIGJ1ZmZlciwgZ2l2aW5nIHVwLiIsIGVycik7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBFcnJvciAlZCBvYnRhaW5pbmcgYW4gYXVkaW8gYnVmZmVyLCBnaXZpbmcgdXAuIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIGVycik7CiAgICAgICAgICAgICByZXR1cm4gTlNfTkVWRVI7CiAgICAgICAgIH0KIApAQCAtMjEzMCwxNyArMjE4MywzMSBAQAogICAgICAgICB9CiAKICAgICAgICAgc2l6ZV90IHJlcVNpemUgPSBhdWRpb0J1ZmZlci5zaXplOwotICAgICAgICBtQ2JmKEVWRU5UX01PUkVfREFUQSwgbVVzZXJEYXRhLCAmYXVkaW9CdWZmZXIpOworICAgICAgICBpZiAobVRyYW5zZmVyID09IFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0spIHsKKyAgICAgICAgICAgIC8vIHdoZW4gbm90aWZ5aW5nIGNsaWVudCBpdCBjYW4gd3JpdGUgbW9yZSBkYXRhLCBwYXNzIHRoZSB0b3RhbCBzaXplIHRoYXQgY2FuIGJlCisgICAgICAgICAgICAvLyB3cml0dGVuIGluIHRoZSBuZXh0IHdyaXRlKCkgY2FsbCwgc2luY2UgaXQncyBub3QgcGFzc2VkIHRocm91Z2ggdGhlIGNhbGxiYWNrCisgICAgICAgICAgICBhdWRpb0J1ZmZlci5zaXplICs9IG5vbkNvbnRpZzsKKyAgICAgICAgfQorICAgICAgICBtQ2JmKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9DQUxMQkFDSyA/IEVWRU5UX01PUkVfREFUQSA6IEVWRU5UX0NBTl9XUklURV9NT1JFX0RBVEEsCisgICAgICAgICAgICAgICAgbVVzZXJEYXRhLCAmYXVkaW9CdWZmZXIpOwogICAgICAgICBzaXplX3Qgd3JpdHRlblNpemUgPSBhdWRpb0J1ZmZlci5zaXplOwogCiAgICAgICAgIC8vIFNhbml0eSBjaGVjayBvbiByZXR1cm5lZCBzaXplCiAgICAgICAgIGlmIChzc2l6ZV90KHdyaXR0ZW5TaXplKSA8IDAgfHwgd3JpdHRlblNpemUgPiByZXFTaXplKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRVZFTlRfTU9SRV9EQVRBIHJlcXVlc3RlZCAlenUgYnl0ZXMgYnV0IGNhbGxiYWNrIHJldHVybmVkICV6ZCBieXRlcyIsCi0gICAgICAgICAgICAgICAgICAgIHJlcVNpemUsIHNzaXplX3Qod3JpdHRlblNpemUpKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IEVWRU5UX01PUkVfREFUQSByZXF1ZXN0ZWQgJXp1IGJ5dGVzIGJ1dCBjYWxsYmFjayByZXR1cm5lZCAlemQgYnl0ZXMiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgcmVxU2l6ZSwgc3NpemVfdCh3cml0dGVuU2l6ZSkpOwogICAgICAgICAgICAgcmV0dXJuIE5TX05FVkVSOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHdyaXR0ZW5TaXplID09IDApIHsKKyAgICAgICAgICAgIGlmIChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSykgeworICAgICAgICAgICAgICAgIC8vIFRoZSBjYWxsYmFjayBFVkVOVF9DQU5fV1JJVEVfTU9SRV9EQVRBIHdhcyBwcm9jZXNzZWQgaW4gdGhlIEpOSSBvZgorICAgICAgICAgICAgICAgIC8vIGFuZHJvaWQubWVkaWEuQXVkaW9UcmFjay4gVGhlIEpOSSBpcyBub3QgdXNpbmcgdGhlIGNhbGxiYWNrIHRvIHByb3ZpZGUgZGF0YSwKKyAgICAgICAgICAgICAgICAvLyBpdCBvbmx5IHNpZ25hbHMgdG8gdGhlIEphdmEgY2xpZW50IHRoYXQgaXQgY2FuIHByb3ZpZGUgbW9yZSBkYXRhLCB3aGljaAorICAgICAgICAgICAgICAgIC8vIHRoaXMgdHJhY2sgaXMgcmVhZCB0byBhY2NlcHQgbm93LgorICAgICAgICAgICAgICAgIC8vIFRoZSBwbGF5YmFjayB0aHJlYWQgd2lsbCBiZSBhd2FrZW4gYXQgdGhlIG5leHQgOjp3cml0ZSgpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5TX1dIRU5FVkVSOworICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gVGhlIGNhbGxiYWNrIGlzIGRvbmUgZmlsbGluZyBidWZmZXJzCiAgICAgICAgICAgICAvLyBLZWVwIHRoaXMgdGhyZWFkIGdvaW5nIHRvIGhhbmRsZSB0aW1lZCBldmVudHMgYW5kCiAgICAgICAgICAgICAvLyBzdGlsbCB0cnkgdG8gZ2V0IG1vcmUgZGF0YSBpbiBpbnRlcnZhbHMgb2YgV0FJVF9QRVJJT0RfTVMKQEAgLTIyMzEsOCArMjI5OCw4IEBACiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnJlc3RvcmVUcmFja19sKGNvbnN0IGNoYXIgKmZyb20pCiB7Ci0gICAgQUxPR1coImRlYWQgSUF1ZGlvVHJhY2ssICVzLCBjcmVhdGluZyBhIG5ldyBvbmUgZnJvbSAlcygpIiwKLSAgICAgICAgICBpc09mZmxvYWRlZE9yRGlyZWN0X2woKSA/ICJPZmZsb2FkZWQgb3IgRGlyZWN0IiA6ICJQQ00iLCBmcm9tKTsKKyAgICBBTE9HVygiJXMoJWQpOiBkZWFkIElBdWRpb1RyYWNrLCAlcywgY3JlYXRpbmcgYSBuZXcgb25lIGZyb20gJXMoKSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkgPyAiT2ZmbG9hZGVkIG9yIERpcmVjdCIgOiAiUENNIiwgZnJvbSk7CiAgICAgKyttU2VxdWVuY2U7CiAKICAgICAvLyByZWZyZXNoIHRoZSBhdWRpbyBjb25maWd1cmF0aW9uIGNhY2hlIGluIHRoaXMgcHJvY2VzcyB0byBtYWtlIHN1cmUgd2UgZ2V0IG5ldwpAQCAtMjI3NSwxMCArMjM0Miw3IEBACiAgICAgLy8gSWYgYSBuZXcgSUF1ZGlvVHJhY2sgY2Fubm90IGJlIGNyZWF0ZWQsIHRoZSBwcmV2aW91cyAoZGVhZCkgaW5zdGFuY2Ugd2lsbCBiZSBsZWZ0IGludGFjdC4KICAgICBzdGF0dXNfdCByZXN1bHQgPSBjcmVhdGVUcmFja19sKCk7CiAKLSAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dXKCIlcygpOiBjcmVhdGVUcmFja19sIGZhaWxlZCwgZG8gbm90IHJldHJ5IiwgX19mdW5jX18pOwotICAgICAgICByZXRyaWVzID0gMDsKLSAgICB9IGVsc2UgeworICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKICAgICAgICAgLy8gdGFrZSB0aGUgZnJhbWVzIHRoYXQgd2lsbCBiZSBsb3N0IGJ5IHRyYWNrIHJlY3JlYXRpb24gaW50byBhY2NvdW50IGluIHNhdmVkIHBvc2l0aW9uCiAgICAgICAgIC8vIEZvciBzdHJlYW1pbmcgdHJhY2tzLCB0aGlzIGlzIHRoZSBhbW91bnQgd2Ugb2J0YWluZWQgZnJvbSB0aGUgdXNlci9jbGllbnQKICAgICAgICAgLy8gKG5vdCB0aGUgbnVtYmVyIGFjdHVhbGx5IGNvbnN1bWVkIGF0IHRoZSBzZXJ2ZXIgLSB0aG9zZSBhcmUgYWxyZWFkeSBsb3N0KS4KQEAgLTIyOTMsNyArMjM1Nyw3IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG1TdGF0aWNQcm94eS0+c2V0QnVmZmVyUG9zaXRpb24oYnVmZmVyUG9zaXRpb24pOwogICAgICAgICAgICAgICAgIGlmIChidWZmZXJQb3NpdGlvbiA9PSBtRnJhbWVDb3VudCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRCgicmVzdG9yaW5nIHRyYWNrIGF0IGVuZCBvZiBzdGF0aWMgYnVmZmVyIik7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCIlcyglZCk6IHJlc3RvcmluZyB0cmFjayBhdCBlbmQgb2Ygc3RhdGljIGJ1ZmZlciIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIzMjMsMTQgKzIzODcsMTggQEAKICAgICAgICAgbUZyYW1lc1dyaXR0ZW5BdFJlc3RvcmUgPSBtRnJhbWVzV3JpdHRlblNlcnZlck9mZnNldDsKICAgICB9CiAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HVygiJXMoKSBmYWlsZWQgc3RhdHVzICVkLCByZXRyaWVzICVkIiwgX19mdW5jX18sIHJlc3VsdCwgcmV0cmllcyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IGZhaWxlZCBzdGF0dXMgJWQsIHJldHJpZXMgJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgcmVzdWx0LCByZXRyaWVzKTsKICAgICAgICAgaWYgKC0tcmV0cmllcyA+IDApIHsKKyAgICAgICAgICAgIC8vIGxlYXZlIHRpbWUgZm9yIGFuIGV2ZW50dWFsIHJhY2UgY29uZGl0aW9uIHRvIGNsZWFyIGJlZm9yZSByZXRyeWluZworICAgICAgICAgICAgdXNsZWVwKDUwMDAwMCk7CiAgICAgICAgICAgICBnb3RvIHJldHJ5OwogICAgICAgICB9Ci0gICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7Ci0gICAgICAgIG1SZWxlYXNlZCA9IDA7CisgICAgICAgIC8vIGlmIG5vIHJldHJpZXMgbGVmdCwgc2V0IGludmFsaWQgYml0IHRvIGZvcmNlIHJlc3RvcmluZyBhdCBuZXh0IG9jY2FzaW9uCisgICAgICAgIC8vIGFuZCBhdm9pZCBpbmNvbnNpc3RlbnQgYWN0aXZlIHN0YXRlIG9uIGNsaWVudCBhbmQgc2VydmVyIHNpZGVzCisgICAgICAgIGlmIChtQ2JsayAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBhbmRyb2lkX2F0b21pY19vcihDQkxLX0lOVkFMSUQsICZtQ2Jsay0+bUZsYWdzKTsKKyAgICAgICAgfQogICAgIH0KLQogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTIzNDgsOCArMjQxNiw4IEBACiAgICAgLy8gICAgICB1bmxlc3MgdGhlIHNlcnZlciBoYXMgbW9yZSB0aGFuIDJeMzEgZnJhbWVzIGluIGl0cyBidWZmZXIsCiAgICAgLy8gICAgICBpbiB3aGljaCBjYXNlIHRoZSB1c2Ugb2YgdWludDMyX3QgZm9yIHRoZXNlIGNvdW50ZXJzIGhhcyBiaWdnZXIgaXNzdWVzLgogICAgIEFMT0dFX0lGKGRlbHRhIDwgMCwKLSAgICAgICAgICAgICJkZXRlY3RlZCBpbGxlZ2FsIHJldHJvZ3JhZGUgbW90aW9uIGJ5IHRoZSBzZXJ2ZXI6IG1TZXJ2ZXIgYWR2YW5jZWQgYnkgJWQiLAotICAgICAgICAgICAgZGVsdGEpOworICAgICAgICAgICAgIiVzKCVkKTogZGV0ZWN0ZWQgaWxsZWdhbCByZXRyb2dyYWRlIG1vdGlvbiBieSB0aGUgc2VydmVyOiBtU2VydmVyIGFkdmFuY2VkIGJ5ICVkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBkZWx0YSk7CiAgICAgbVNlcnZlciA9IG5ld1NlcnZlcjsKICAgICBpZiAoZGVsdGEgPiAwKSB7IC8vIGF2b2lkIHJldHJvZ3JhZGUKICAgICAgICAgbVBvc2l0aW9uICs9IGRlbHRhOwpAQCAtMjM2OSw5ICsyNDM3LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIHNwZWVkIC8qLCAwIG1Ob3RpZmljYXRpb25zUGVyQnVmZmVyUmVxKi8pOwogICAgIGNvbnN0IGJvb2wgYWxsb3dlZCA9IG1GcmFtZUNvdW50ID49IG1pbkZyYW1lQ291bnQ7CiAgICAgQUxPR0RfSUYoIWFsbG93ZWQsCi0gICAgICAgICAgICAiaXNTYW1wbGVSYXRlU3BlZWRBbGxvd2VkX2wgZGVuaWVkICIKKyAgICAgICAgICAgICIlcyglZCk6IGRlbmllZCAiCiAgICAgICAgICAgICAibUFmTGF0ZW5jeToldSAgbUFmRnJhbWVDb3VudDolenUgIG1BZlNhbXBsZVJhdGU6JXUgIHNhbXBsZVJhdGU6JXUgIHNwZWVkOiVmICIKICAgICAgICAgICAgICJtRnJhbWVDb3VudDolenUgPCBtaW5GcmFtZUNvdW50OiV6dSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgIG1BZkxhdGVuY3ksIG1BZkZyYW1lQ291bnQsIG1BZlNhbXBsZVJhdGUsIHNhbXBsZVJhdGUsIHNwZWVkLAogICAgICAgICAgICAgbUZyYW1lQ291bnQsIG1pbkZyYW1lQ291bnQpOwogICAgIHJldHVybiBhbGxvd2VkOwpAQCAtMjM4OSw3ICsyNDU4LDggQEAKICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7CiAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVByZXNlbnRhdGlvbklkKSwgcHJlc2VudGF0aW9uSWQpOwogICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlQcm9ncmFtSWQpLCBwcm9ncmFtSWQpOwotICAgIEFMT0dWKCJQcmVzZW50YXRpb25JZC9Qcm9ncmFtSWRbJXNdIixwYXJhbS50b1N0cmluZygpLnN0cmluZygpKTsKKyAgICBBTE9HVigiJXMoJWQpOiBQcmVzZW50YXRpb25JZC9Qcm9ncmFtSWRbJXNdIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBwYXJhbS50b1N0cmluZygpLnN0cmluZygpKTsKIAogICAgIHJldHVybiBtQXVkaW9UcmFjay0+c2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKIH0KQEAgLTI0MTYsNyArMjQ4Niw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gd2FybiBvbmx5IGlmIG5vdCBhbiBleHBlY3RlZCByZXN0b3JlIGZhaWx1cmUuCiAgICAgICAgIEFMT0dXX0lGKCEoKGlzT2ZmbG9hZGVkT3JEaXJlY3RfbCgpIHx8IG1Eb05vdFJlY29ubmVjdCkgJiYgc3RhdHVzID09IERFQURfT0JKRUNUKSwKLSAgICAgICAgICAgICAgICAiYXBwbHlWb2x1bWVTaGFwZXIgZmFpbGVkOiAlZCIsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgIiVzKCVkKTogYXBwbHlWb2x1bWVTaGFwZXIgZmFpbGVkOiAlZCIsIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0dXMpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtMjQ1Nyw3ICsyNTI3LDggQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyAvLyBub3Qgc3VwcG9ydGVkCiAgICAgfQogICAgIHN0YXR1c190IHN0YXR1cyA9IG1Qcm94eS0+Z2V0VGltZXN0YW1wKHRpbWVzdGFtcCk7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihzdGF0dXMgIT0gT0ssICJzdGF0dXMgJWQgbm90IGFsbG93ZWQgZnJvbSBwcm94eSBnZXRUaW1lc3RhbXAiLCBzdGF0dXMpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RhdHVzICE9IE9LLCAiJXMoJWQpOiBzdGF0dXMgJWQgbm90IGFsbG93ZWQgZnJvbSBwcm94eSBnZXRUaW1lc3RhbXAiLAorICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXR1cyk7CiAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwogICAgIHRpbWVzdGFtcC0+bVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9DTElFTlRdID0gbUZyYW1lc1dyaXR0ZW47CiAgICAgdGltZXN0YW1wLT5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9DTElFTlRdID0gMDsKQEAgLTI1MDAsNyArMjU3MSw4IEBACiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7IC8vIG9mZmxvYWRlZCB0cmFja3MgaGFuZGxlZCBiZWxvdwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkludmFsaWQgbVN0YXRlIGluIGdldFRpbWVzdGFtcCgpOiAlZCIsIG1TdGF0ZSk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzKCVkKTogSW52YWxpZCBtU3RhdGUgaW4gZ2V0VGltZXN0YW1wKCk6ICVkIiwKKyAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBtU3RhdGUpOwogICAgICAgICBicmVhazsKICAgICB9CiAKQEAgLTI1MzQsNyArMjYwNiw4IEBACiAgICAgICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlIHdlIGFkanVzdCB0aGUgcG9zaXRpb24gZnJvbSB0aGUgcHJldmlvdXMgY29tcHV0ZWQgbGF0ZW5jeS4KICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gPT0gRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUikgewogICAgICAgICAgICAgICAgICAgICBBTE9HV19JRihtUHJldmlvdXNMb2NhdGlvbiA9PSBFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZXRUaW1lc3RhbXAoKSBsb2NhdGlvbiBtb3ZlZCBmcm9tIGtlcm5lbCB0byBzZXJ2ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoJWQpOiBsb2NhdGlvbiBtb3ZlZCBmcm9tIGtlcm5lbCB0byBzZXJ2ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgbGFzdCBrZXJuZWwgT0sgdGltZSBpbmZvIGV4aXN0cyBhbmQgdGhlIHBvc2l0aW9ucwogICAgICAgICAgICAgICAgICAgICAvLyBhcmUgdmFsaWQgKGlmIHRoZXkgcHJlZGF0ZSB0aGUgY3VycmVudCB0cmFjaywgdGhlIHBvc2l0aW9ucyBtYXkKICAgICAgICAgICAgICAgICAgICAgLy8gYmUgemVybyBvciBuZWdhdGl2ZSkuCkBAIC0yNTQ5LDggKzI2MjIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXRzLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSX0xBU1RLRVJORUxPS10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGV0cy5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF9MQVNUS0VSTkVMT0tdKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImZyYW1lIGFkanVzdG1lbnQ6JWxsZCAgdGltZXN0YW1wOiVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWZyYW1lcywgZXRzLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IGZyYW1lIGFkanVzdG1lbnQ6JWxsZCAgdGltZXN0YW1wOiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgKGxvbmcgbG9uZylmcmFtZXMsIGV0cy50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVzID49IGV0cy5tUG9zaXRpb25bbG9jYXRpb25dKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uID0gMDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTI1NTgsNyArMjYzMSw4IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxvY2F0aW9uID09IEV4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUwpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1ZfSUYobVByZXZpb3VzTG9jYXRpb24gPT0gRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0VGltZXN0YW1wKCkgbG9jYXRpb24gbW92ZWQgZnJvbSBzZXJ2ZXIgdG8ga2VybmVsIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCVkKTogbG9jYXRpb24gbW92ZWQgZnJvbSBzZXJ2ZXIgdG8ga2VybmVsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gV2UgdXBkYXRlIHRoZSB0aW1lc3RhbXAgdGltZSBldmVuIHdoZW4gcGF1c2VkLgpAQCAtMjU4Miw3ICsyNjU2LDcgQEAKICAgICAgICAgICAgICAgICBtUHJldmlvdXNMb2NhdGlvbiA9IGxvY2F0aW9uOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyByaWdodCBhZnRlciBBdWRpb1RyYWNrIGlzIHN0YXJ0ZWQsIG9uZSBtYXkgbm90IGZpbmQgYSB0aW1lc3RhbXAKLSAgICAgICAgICAgICAgICBBTE9HVigiZ2V0QmVzdFRpbWVzdGFtcCBkaWQgbm90IGZpbmQgdGltZXN0YW1wIik7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogZ2V0QmVzdFRpbWVzdGFtcCBkaWQgbm90IGZpbmQgdGltZXN0YW1wIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChzdGF0dXMgPT0gSU5WQUxJRF9PUEVSQVRJT04pIHsKQEAgLTI1OTIsNyArMjY2Niw4IEBACiAgICAgICAgICAgICAvLyB0byBiZSB6ZXJvIHdlIGNvbnZlcnQgdGhpcyB0byBXT1VMRF9CTE9DSyAod2l0aCB0aGUgaW1wbGljaXQgbWVhbmluZyBvZgogICAgICAgICAgICAgLy8gInplcm8iIGZvciBOdVBsYXllcikuICBXZSBkb24ndCBjb252ZXJ0IGZvciB0cmFjayByZXN0b3JhdGlvbiBhcyBwb3NpdGlvbgogICAgICAgICAgICAgLy8gZG9lcyBub3QgcmVzZXQuCi0gICAgICAgICAgICBBTE9HVigidGltZXN0YW1wIHNlcnZlciBvZmZzZXQ6JWxsZCByZXN0b3JlIGZyYW1lczolbGxkIiwKKyAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IHRpbWVzdGFtcCBzZXJ2ZXIgb2Zmc2V0OiVsbGQgcmVzdG9yZSBmcmFtZXM6JWxsZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1GcmFtZXNXcml0dGVuU2VydmVyT2Zmc2V0LCAobG9uZyBsb25nKW1GcmFtZXNXcml0dGVuQXRSZXN0b3JlKTsKICAgICAgICAgICAgIGlmIChtRnJhbWVzV3JpdHRlblNlcnZlck9mZnNldCAhPSBtRnJhbWVzV3JpdHRlbkF0UmVzdG9yZSkgewogICAgICAgICAgICAgICAgIHN0YXR1cyA9IFdPVUxEX0JMT0NLOwpAQCAtMjYwMCw3ICsyNjc1LDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dWX0lGKHN0YXR1cyAhPSBXT1VMRF9CTE9DSywgImdldFRpbWVzdGFtcCBlcnJvcjolI3giLCBzdGF0dXMpOworICAgICAgICBBTE9HVl9JRihzdGF0dXMgIT0gV09VTERfQkxPQ0ssICIlcyglZCk6IGdldFRpbWVzdGFtcCBlcnJvcjolI3giLCBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAgICAgaWYgKGlzT2ZmbG9hZGVkT3JEaXJlY3RfbCgpKSB7CkBAIC0yNjM5LDggKzI3MTQsOSBAQAogICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgc3RhcnQgdGltZS4gIElmIGdyZWF0ZXIsIHRoZW4gdGhhdCBtZWFucyB3ZSBtYXkgaGF2ZSBmYWlsZWQKICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY29tcGxldGVseSBmbHVzaCBvciBzdG9wIHRoZSBwcmV2aW91cyBwbGF5aW5nIHRyYWNrLgogICAgICAgICAgICAgICAgICAgICBBTE9HV19JRighbVRpbWVzdGFtcFN0YXJ0dXBHbGl0Y2hSZXBvcnRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0VGltZXN0YW1wIHN0YXJ0dXAgZ2xpdGNoIGRldGVjdGVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyglZCk6IHN0YXJ0dXAgZ2xpdGNoIGRldGVjdGVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZGVsdGFUaW1lVXMoJWxsZCkgZGVsdGFQb3NpdGlvblVzKCVsbGQpIHRzbVBvc2l0aW9uKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylkZWx0YVRpbWVVcywgKGxvbmcgbG9uZylkZWx0YVBvc2l0aW9uQnlVcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFN0YXJ0dXBHbGl0Y2hSZXBvcnRlZCA9IHRydWU7CkBAIC0yNzA4LDggKzI3ODQsOSBAQAogICAgICAgICAgICAgY29uc3QgaW50NjRfdCBsYWdOcyA9IGludDY0X3QobUFmTGF0ZW5jeSAqIDEwMDAwMDBMTCk7CiAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGxpbWl0TnMgPSBtU3RhcnROcyAtIGxhZ05zOwogICAgICAgICAgICAgaWYgKGN1cnJlbnRUaW1lTmFub3MgPCBsaW1pdE5zKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0QoImNvcnJlY3RpbmcgdGltZXN0YW1wIHRpbWUgZm9yIHBhdXNlLCAiCisgICAgICAgICAgICAgICAgQUxPR0QoIiVzKCVkKTogY29ycmVjdGluZyB0aW1lc3RhbXAgdGltZSBmb3IgcGF1c2UsICIKICAgICAgICAgICAgICAgICAgICAgICAgICJjdXJyZW50VGltZU5hbm9zOiAlbGxkIDwgbGltaXROczogJWxsZCA8IG1TdGFydE5zOiAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyljdXJyZW50VGltZU5hbm9zLCAobG9uZyBsb25nKWxpbWl0TnMsIChsb25nIGxvbmcpbVN0YXJ0TnMpOwogICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZSA9IGNvbnZlcnROc1RvVGltZXNwZWMobGltaXROcyk7CiAgICAgICAgICAgICAgICAgY3VycmVudFRpbWVOYW5vcyA9IGxpbWl0TnM7CkBAIC0yNzE3LDcgKzI3OTQsOCBAQAogCiAgICAgICAgICAgICAvLyByZXRyb2dyYWRlIGNoZWNrCiAgICAgICAgICAgICBpZiAoY3VycmVudFRpbWVOYW5vcyA8IHByZXZpb3VzVGltZU5hbm9zKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInJldHJvZ3JhZGUgdGltZXN0YW1wIHRpbWUgY29ycmVjdGVkLCAlbGxkIDwgJWxsZCIsCisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogcmV0cm9ncmFkZSB0aW1lc3RhbXAgdGltZSBjb3JyZWN0ZWQsICVsbGQgPCAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyljdXJyZW50VGltZU5hbm9zLCAobG9uZyBsb25nKXByZXZpb3VzVGltZU5hbm9zKTsKICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWUgPSBtUHJldmlvdXNUaW1lc3RhbXAubVRpbWU7CiAgICAgICAgICAgICAgICAgLy8gY3VycmVudFRpbWVOYW5vcyBub3QgdXNlZCBiZWxvdy4KQEAgLTI3MzAsNyArMjgwOCw4IEBACiAgICAgICAgICAgICBpZiAoZGVsdGFQb3NpdGlvbiA8IDApIHsKICAgICAgICAgICAgICAgICAvLyBPbmx5IHJlcG9ydCBvbmNlIHBlciBwb3NpdGlvbiBpbnN0ZWFkIG9mIHNwYW1taW5nIHRoZSBsb2cuCiAgICAgICAgICAgICAgICAgaWYgKCFtUmV0cm9ncmFkZU1vdGlvblJlcG9ydGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJyZXRyb2dyYWRlIHRpbWVzdGFtcCBwb3NpdGlvbiBjb3JyZWN0ZWQsICVkID0gJXUgLSAldSIsCisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IHJldHJvZ3JhZGUgdGltZXN0YW1wIHBvc2l0aW9uIGNvcnJlY3RlZCwgJWQgPSAldSAtICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzVGltZXN0YW1wLm1Qb3NpdGlvbik7CkBAIC0yNzUwLDcgKzI4MjksOCBAQAogICAgICAgICAgICAgaWYgKGRlbHRhVGltZSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBjb21wdXRlZFNhbXBsZVJhdGUgPQogICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFQb3NpdGlvbiAqIChsb25nIGxvbmcpTkFOT1NfUEVSX1NFQ09ORCAvIGRlbHRhVGltZTsKLSAgICAgICAgICAgICAgICBBTE9HRCgiY29tcHV0ZWRTYW1wbGVSYXRlOiV1ICBzYW1wbGVSYXRlOiV1IiwKKyAgICAgICAgICAgICAgICBBTE9HRCgiJXMoJWQpOiBjb21wdXRlZFNhbXBsZVJhdGU6JXUgIHNhbXBsZVJhdGU6JXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpY29tcHV0ZWRTYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSk7CiAgICAgICAgICAgICB9CiAjZW5kaWYKQEAgLTI3OTYsOCArMjg3Niw4IEBACiAgICAgU3RyaW5nOCByZXN1bHQ7CiAKICAgICByZXN1bHQuYXBwZW5kKCIgQXVkaW9UcmFjazo6ZHVtcFxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBzdGF0dXMoJWQpLCBzdGF0ZSglZCksIHNlc3Npb24gSWQoJWQpLCBmbGFncyglI3gpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1cywgbVN0YXRlLCBtU2Vzc2lvbklkLCBtRmxhZ3MpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgaWQoJWQpIHN0YXR1cyglZCksIHN0YXRlKCVkKSwgc2Vzc2lvbiBJZCglZCksIGZsYWdzKCUjeClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBtUG9ydElkLCBtU3RhdHVzLCBtU3RhdGUsIG1TZXNzaW9uSWQsIG1GbGFncyk7CiAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBzdHJlYW0gdHlwZSglZCksIGxlZnQgLSByaWdodCB2b2x1bWUoJWYsICVmKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIChtU3RyZWFtVHlwZSA9PSBBVURJT19TVFJFQU1fREVGQVVMVCkgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKCZtQXR0cmlidXRlcykgOiBtU3RyZWFtVHlwZSwKQEAgLTI4MzksMTggKzI5MTksMTggQEAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaykKIHsKICAgICBpZiAoY2FsbGJhY2sgPT0gMCkgewotICAgICAgICBBTE9HVygiJXMgYWRkaW5nIE5VTEwgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogYWRkaW5nIE5VTEwgY2FsbGJhY2shIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgaWYgKG1EZXZpY2VDYWxsYmFjay51bnNhZmVfZ2V0KCkgPT0gY2FsbGJhY2suZ2V0KCkpIHsKLSAgICAgICAgQUxPR1coIiVzIGFkZGluZyBzYW1lIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IGFkZGluZyBzYW1lIGNhbGxiYWNrISIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKICAgICBpZiAobU91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICBpZiAobURldmljZUNhbGxiYWNrICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dXKCIlcyBjYWxsYmFjayBhbHJlYWR5IHByZXNlbnQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IGNhbGxiYWNrIGFscmVhZHkgcHJlc2VudCEiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtT3V0cHV0KTsKICAgICAgICAgfQogICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtT3V0cHV0KTsKQEAgLTI4NjMsMTIgKzI5NDMsMTIgQEAKICAgICAgICAgY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaykKIHsKICAgICBpZiAoY2FsbGJhY2sgPT0gMCkgewotICAgICAgICBBTE9HVygiJXMgcmVtb3ZpbmcgTlVMTCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBBTE9HVygiJXMoJWQpOiByZW1vdmluZyBOVUxMIGNhbGxiYWNrISIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sudW5zYWZlX2dldCgpICE9IGNhbGxiYWNrLmdldCgpKSB7Ci0gICAgICAgIEFMT0dXKCIlcyByZW1vdmluZyBkaWZmZXJlbnQgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogcmVtb3ZpbmcgZGlmZmVyZW50IGNhbGxiYWNrISIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBtRGV2aWNlQ2FsbGJhY2suY2xlYXIoKTsKQEAgLTI5NzQsNyArMzA1NCw3IEBACiAgICAgY2FzZSBTVEFURV9GTFVTSEVEOgogICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyB3ZSdyZSBub3QgYWN0aXZlCiAgICAgZGVmYXVsdDoKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiSW52YWxpZCBtU3RhdGUgaW4gaGFzU3RhcnRlZCgpOiAlZCIsIG1TdGF0ZSk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzKCVkKTogSW52YWxpZCBtU3RhdGUgaW4gaGFzU3RhcnRlZCgpOiAlZCIsIF9fZnVuY19fLCBtUG9ydElkLCBtU3RhdGUpOwogICAgICAgICBicmVhazsKICAgICB9CiAKQEAgLTI5OTAsNyArMzA3MCw4IEBACiAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09IE9LKSB7CiAgICAgICAgICAgICB3YWl0ID0gKHRzLm1Qb3NpdGlvbiA9PSAwIHx8IHRzLm1Qb3NpdGlvbiA9PSBtU3RhcnRUcy5tUG9zaXRpb24pOwogICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJoYXNTdGFydGVkIHdhaXQ6JWQgIHRzOiV1ICBzdGFydCBwb3NpdGlvbjolbGxkIiwKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogaGFzU3RhcnRlZCB3YWl0OiVkICB0czoldSAgc3RhcnQgcG9zaXRpb246JWxsZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCiAgICAgICAgICAgICAgICAgKGludCl3YWl0LAogICAgICAgICAgICAgICAgIHRzLm1Qb3NpdGlvbiwKICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1TdGFydFRzLm1Qb3NpdGlvbik7CkBAIC0zMDExLDcgKzMwOTIsOCBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJoYXNTdGFydGVkIHdhaXQ6JWQgIGV0czolbGxkICBzdGFydCBwb3NpdGlvbjolbGxkIiwKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogaGFzU3RhcnRlZCB3YWl0OiVkICBldHM6JWxsZCAgc3RhcnQgcG9zaXRpb246JWxsZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCiAgICAgICAgICAgICAgICAgKGludCl3YWl0LAogICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZXRzLm1Qb3NpdGlvbltsb2NhdGlvbl0sCiAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltU3RhcnRFdHMubVBvc2l0aW9uW2xvY2F0aW9uXSk7CkBAIC0zMDg2LDcgKzMxNjgsOCBAQAogICAgICAgICBucyA9IElOVDY0X01BWDsKICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihucyA8IDAsICJwcm9jZXNzQXVkaW9CdWZmZXIoKSByZXR1cm5lZCAlIiBQUklkNjQsIG5zKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihucyA8IDAsICIlcyglZCk6IHByb2Nlc3NBdWRpb0J1ZmZlcigpIHJldHVybmVkICVsbGQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUmVjZWl2ZXIubVBvcnRJZCwgKGxvbmcgbG9uZylucyk7CiAgICAgICAgIHBhdXNlSW50ZXJuYWwobnMpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2tTaGFyZWQuY3BwCmluZGV4IDAxZjQwMGQuLmM5OTdjZmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2tTaGFyZWQuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2tTaGFyZWQuY3BwCkBAIC0yNiw2ICsyNiwyNCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKKy8vIFRPRE86IGNvbnNpZGVyIHB1bGxpbmcgdGhpcyBpbnRvIGEgc2hhcmVkIGhlYWRlci4KKy8vIHNhZmVfc3ViX292ZXJmbG93IGlzIHVzZWQgZW5zdXJlIHRoYXQgc3VidHJhY3Rpb24gb2NjdXJzIGluIHRoZSBzYW1lIG5hdGl2ZSB0eXBlCisvLyB3aXRoIHByb3BlciAyJ3MgY29tcGxlbWVudCBvdmVyZmxvdy4gIFdpdGhvdXQgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCBpdCBpcyBwb3NzaWJsZSwKKy8vIGZvciBleGFtcGxlLCB0aGF0IG9wdGltaXppbmcgY29tcGlsZXJzIG1heSBlbGVjdCB0byB0cmVhdCAzMiBiaXQgc3VidHJhY3Rpb24KKy8vIGFzIDY0IGJpdCBzdWJ0cmFjdGlvbiB3aGVuIHN0b3JpbmcgaW50byBhIDY0IGJpdCBkZXN0aW5hdGlvbiBhcyBpbnRlZ2VyIG92ZXJmbG93IGlzCisvLyB0ZWNobmljYWxseSB1bmRlZmluZWQuCit0ZW1wbGF0ZTx0eXBlbmFtZSBULAorICAgICAgICAgdHlwZW5hbWUgVSwKKyAgICAgICAgIHR5cGVuYW1lID0gc3RkOjplbmFibGVfaWZfdDxzdGQ6OmlzX3NhbWU8c3RkOjpkZWNheV90PFQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpkZWNheV90PFU+Pnt9Pj4KKyAgICAgICAgIC8vIGVuc3VyZSBhcmd1bWVudHMgYXJlIHNhbWUgdHlwZSAoaWdub3Jpbmcgdm9sYXRpbGUsIHdoaWNoIGlzIHVzZWQgaW4gY2JsayB2YXJpYWJsZXMpLgorYXV0byBzYWZlX3N1Yl9vdmVyZmxvdyhjb25zdCBUJiBhLCBjb25zdCBVJiBiKSB7CisgICAgc3RkOjpkZWNheV90PFQ+IHJlc3VsdDsKKyAgICAodm9pZClfX2J1aWx0aW5fc3ViX292ZXJmbG93KGEsIGIsICZyZXN1bHQpOworICAgIC8vIG5vdGUgaWYgX19idWlsdGluX3N1Yl9vdmVyZmxvdyByZXR1cm5zIHRydWUsIGFuIG92ZXJmbG93IG9jY3VycmVkLgorICAgIHJldHVybiByZXN1bHQ7Cit9CisKIC8vIHVzZWQgdG8gY2xhbXAgYSB2YWx1ZSB0byBzaXplX3QuICBUT0RPOiBtb3ZlIHRvIGFub3RoZXIgZmlsZS4KIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogc2l6ZV90IGNsYW1wVG9TaXplKFQgeCkgewpAQCAtMTg2LDcgKzIwNCw3IEBACiAgICAgICAgICAgICBmcm9udCA9IGNibGstPnUubVN0cmVhbWluZy5tRnJvbnQ7CiAgICAgICAgIH0KICAgICAgICAgLy8gd3JpdGUgdG8gcmVhciwgcmVhZCBmcm9tIGZyb250Ci0gICAgICAgIHNzaXplX3QgZmlsbGVkID0gcmVhciAtIGZyb250OworICAgICAgICBzc2l6ZV90IGZpbGxlZCA9IHNhZmVfc3ViX292ZXJmbG93KHJlYXIsIGZyb250KTsKICAgICAgICAgLy8gcGlwZSBzaG91bGQgbm90IGJlIG92ZXJmdWxsCiAgICAgICAgIGlmICghKDAgPD0gZmlsbGVkICYmIChzaXplX3QpIGZpbGxlZCA8PSBtRnJhbWVDb3VudCkpIHsKICAgICAgICAgICAgIGlmIChtSXNPdXQpIHsKQEAgLTY4NCw3ICs3MDIsNyBAQAogICAgICAgICBjb25zdCBzaXplX3Qgb3ZlcmZsb3dCaXQgPSBtRnJhbWVDb3VudFAyIDw8IDE7CiAgICAgICAgIGNvbnN0IHNpemVfdCBtYXNrID0gb3ZlcmZsb3dCaXQgLSAxOwogICAgICAgICBpbnQzMl90IG5ld0Zyb250ID0gKGZyb250ICYgfm1hc2spIHwgKGZsdXNoICYgbWFzayk7Ci0gICAgICAgIHNzaXplX3QgZmlsbGVkID0gcmVhciAtIG5ld0Zyb250OworICAgICAgICBzc2l6ZV90IGZpbGxlZCA9IHNhZmVfc3ViX292ZXJmbG93KHJlYXIsIG5ld0Zyb250KTsKICAgICAgICAgaWYgKGZpbGxlZCA+PSAoc3NpemVfdClvdmVyZmxvd0JpdCkgewogICAgICAgICAgICAgLy8gZnJvbnQgYW5kIHJlYXIgb2Zmc2V0cyBzcGFuIHRoZSBvdmVyZmxvdyBiaXQgb2YgdGhlIHAyIG1hc2sKICAgICAgICAgICAgIC8vIHNvIHJlYmFzaW5nIG5ld0Zyb250IG9uIHRoZSBmcm9udCBvZmZzZXQgaXMgb2ZmIGJ5IHRoZSBvdmVyZmxvdyBiaXQuCkBAIC03MjYsNyArNzQ0LDcgQEAKICAgICAgICAgY29uc3Qgc2l6ZV90IG92ZXJmbG93Qml0ID0gbUZyYW1lQ291bnRQMiA8PCAxOwogICAgICAgICBjb25zdCBzaXplX3QgbWFzayA9IG92ZXJmbG93Qml0IC0gMTsKICAgICAgICAgaW50MzJfdCBuZXdSZWFyID0gKHJlYXIgJiB+bWFzaykgfCAoc3RvcCAmIG1hc2spOwotICAgICAgICBzc2l6ZV90IGZpbGxlZCA9IG5ld1JlYXIgLSBmcm9udDsKKyAgICAgICAgc3NpemVfdCBmaWxsZWQgPSBzYWZlX3N1Yl9vdmVyZmxvdyhuZXdSZWFyLCBmcm9udCk7CiAgICAgICAgIC8vIG92ZXJmbG93Qml0IGlzIHVuc2lnbmVkLCBzbyBjYXN0IHRvIHNpZ25lZCBmb3IgY29tcGFyaXNvbi4KICAgICAgICAgaWYgKGZpbGxlZCA+PSAoc3NpemVfdClvdmVyZmxvd0JpdCkgewogICAgICAgICAgICAgLy8gZnJvbnQgYW5kIHJlYXIgb2Zmc2V0cyBzcGFuIHRoZSBvdmVyZmxvdyBiaXQgb2YgdGhlIHAyIG1hc2sKQEAgLTc3OCw3ICs3OTYsNyBAQAogICAgICAgICBmcm9udCA9IGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCgmY2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udCk7CiAgICAgICAgIHJlYXIgPSBjYmxrLT51Lm1TdHJlYW1pbmcubVJlYXI7CiAgICAgfQotICAgIHNzaXplX3QgZmlsbGVkID0gcmVhciAtIGZyb250OworICAgIHNzaXplX3QgZmlsbGVkID0gc2FmZV9zdWJfb3ZlcmZsb3cocmVhciwgZnJvbnQpOwogICAgIC8vIHBpcGUgc2hvdWxkIG5vdCBhbHJlYWR5IGJlIG92ZXJmdWxsCiAgICAgaWYgKCEoMCA8PSBmaWxsZWQgJiYgKHNpemVfdCkgZmlsbGVkIDw9IG1GcmFtZUNvdW50KSkgewogICAgICAgICBBTE9HRSgiU2hhcmVkIG1lbW9yeSBjb250cm9sIGJsb2NrIGlzIGNvcnJ1cHQgKGZpbGxlZD0lemQsIG1GcmFtZUNvdW50PSV6dSk7IHNodXR0aW5nIGRvd24iLApAQCAtOTA1LDcgKzkyMyw3IEBACiAgICAgICAgIHJldHVybiBtRnJhbWVDb3VudDsKICAgICB9CiAgICAgY29uc3QgaW50MzJfdCByZWFyID0gZ2V0UmVhcigpOwotICAgIHNzaXplX3QgZmlsbGVkID0gcmVhciAtIGNibGstPnUubVN0cmVhbWluZy5tRnJvbnQ7CisgICAgc3NpemVfdCBmaWxsZWQgPSBzYWZlX3N1Yl9vdmVyZmxvdyhyZWFyLCBjYmxrLT51Lm1TdHJlYW1pbmcubUZyb250KTsKICAgICAvLyBwaXBlIHNob3VsZCBub3QgYWxyZWFkeSBiZSBvdmVyZnVsbAogICAgIGlmICghKDAgPD0gZmlsbGVkICYmIChzaXplX3QpIGZpbGxlZCA8PSBtRnJhbWVDb3VudCkpIHsKICAgICAgICAgQUxPR0UoIlNoYXJlZCBtZW1vcnkgY29udHJvbCBibG9jayBpcyBjb3JydXB0IChmaWxsZWQ9JXpkLCBtRnJhbWVDb3VudD0lenUpOyBzaHV0dGluZyBkb3duIiwKQEAgLTkzMSw3ICs5NDksNyBAQAogICAgICAgICByZXR1cm4gbUZyYW1lQ291bnQ7CiAgICAgfQogICAgIGNvbnN0IGludDMyX3QgcmVhciA9IGdldFJlYXIoKTsKLSAgICBjb25zdCBzc2l6ZV90IGZpbGxlZCA9IHJlYXIgLSBjYmxrLT51Lm1TdHJlYW1pbmcubUZyb250OworICAgIGNvbnN0IHNzaXplX3QgZmlsbGVkID0gc2FmZV9zdWJfb3ZlcmZsb3cocmVhciwgY2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udCk7CiAgICAgaWYgKCEoMCA8PSBmaWxsZWQgJiYgKHNpemVfdCkgZmlsbGVkIDw9IG1GcmFtZUNvdW50KSkgewogICAgICAgICByZXR1cm4gMDsgLy8gZXJyb3IgY29uZGl0aW9uLCBzaWxlbnRseSByZXR1cm4gMC4KICAgICB9CkBAIC0xMjMzLDYgKzEyNTEsMjEgQEAKICAgICByZXR1cm4gMDsKIH0KIAorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoImludGVnZXIiKSkpCitzaXplX3QgQXVkaW9SZWNvcmRTZXJ2ZXJQcm94eTo6ZnJhbWVzUmVhZHlTYWZlKCkgY29uc3QKK3sKKyAgICBpZiAobUlzU2h1dGRvd24pIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGNvbnN0IGludDMyX3QgZnJvbnQgPSBhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoJm1DYmxrLT51Lm1TdHJlYW1pbmcubUZyb250KTsKKyAgICBjb25zdCBpbnQzMl90IHJlYXIgPSBtQ2Jsay0+dS5tU3RyZWFtaW5nLm1SZWFyOworICAgIGNvbnN0IHNzaXplX3QgZmlsbGVkID0gc2FmZV9zdWJfb3ZlcmZsb3cocmVhciwgZnJvbnQpOworICAgIGlmICghKDAgPD0gZmlsbGVkICYmIChzaXplX3QpIGZpbGxlZCA8PSBtRnJhbWVDb3VudCkpIHsKKyAgICAgICAgcmV0dXJuIDA7IC8vIGVycm9yIGNvbmRpdGlvbiwgc2lsZW50bHkgcmV0dXJuIDAuCisgICAgfQorICAgIHJldHVybiBmaWxsZWQ7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiB9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvRmxpbmdlci5jcHAKaW5kZXggOWYzYjc0Mi4uMDA2NzhjMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvRmxpbmdlci5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvRmxpbmdlci5jcHAKQEAgLTI0LDEwICsyNCw4IEBACiAKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL211bHRpdXNlci5oPgogI2luY2x1ZGUgPG1lZGlhL1RpbWVDaGVjay5oPgotI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgotCisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSAiSUF1ZGlvRmxpbmdlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC02MDAsMTQgKzU5OCwxOCBAQAogICAgIH0KIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RWZmZWN0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICpwVXVpZCwKLSAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSBjb25zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICpwVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlZmVycmVkVHlwZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSBjb25zdAogICAgIHsKLSAgICAgICAgaWYgKHBVdWlkID09IE5VTEwgfHwgcERlc2NyaXB0b3IgPT0gTlVMTCkgeworICAgICAgICBpZiAocFV1aWQgPT0gTlVMTCB8fCBwVHlwZSA9PSBOVUxMIHx8IHBEZXNjcmlwdG9yID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZShwVXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgZGF0YS53cml0ZShwVHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgZGF0YS53cml0ZVVpbnQzMihwcmVmZXJyZWRUeXBlRmxhZyk7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfRUZGRUNUX0RFU0NSSVBUT1IsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CkBAIC02MzYsMTAgKzYzOCwxMCBAQAogICAgICAgICBzcDxJRWZmZWN0PiBlZmZlY3Q7CiAKICAgICAgICAgaWYgKHBEZXNjID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBlZmZlY3Q7CiAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAqc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVmZmVjdDsKICAgICAgICAgfQogCiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwpAQCAtOTEyLDcgKzkxNCw3IEBACiAgICAgICAgIGNhc2UgU0VUX01JQ19NVVRFOgogICAgICAgICBjYXNlIFNFVF9MT1dfUkFNX0RFVklDRToKICAgICAgICAgY2FzZSBTWVNURU1fUkVBRFk6IHsKLSAgICAgICAgICAgIGlmIChtdWx0aXVzZXJfZ2V0X2FwcF9pZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpID49IEFJRF9BUFBfU1RBUlQpIHsKKyAgICAgICAgICAgIGlmICghaXNTZXJ2aWNlVWlkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IHRyYW5zYWN0aW9uICVkIHJlY2VpdmVkIGZyb20gUElEICVkIHVuYXV0aG9yaXplZCBVSUQgJWQiLAogICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjb2RlLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCiAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKQEAgLTk1MSw5ICs5NTMsOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgY2hhciB0aW1lQ2hlY2tTdHJpbmdbNjRdOwotICAgIHNucHJpbnRmKHRpbWVDaGVja1N0cmluZywgc2l6ZW9mKHRpbWVDaGVja1N0cmluZyksICJJQXVkaW9GbGluZ2VyOiAlZCIsIGNvZGUpOwotICAgIFRpbWVDaGVjayBjaGVjayh0aW1lQ2hlY2tTdHJpbmcpOworICAgIHN0ZDo6c3RyaW5nIHRhZygiSUF1ZGlvRmxpbmdlciBjb21tYW5kICIgKyBzdGQ6OnRvX3N0cmluZyhjb2RlKSk7CisgICAgVGltZUNoZWNrIGNoZWNrKHRhZy5jX3N0cigpKTsKIAogICAgIHN3aXRjaCAoY29kZSkgewogICAgICAgICBjYXNlIENSRUFURV9UUkFDSzogewpAQCAtMTI4MCw4ICsxMjgxLDExIEBACiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgZWZmZWN0X3V1aWRfdCB1dWlkOwogICAgICAgICAgICAgZGF0YS5yZWFkKCZ1dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICAgICAgZWZmZWN0X3V1aWRfdCB0eXBlOworICAgICAgICAgICAgZGF0YS5yZWFkKCZ0eXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICAgICAgdWludDMyX3QgcHJlZmVycmVkVHlwZUZsYWcgPSBkYXRhLnJlYWRVaW50MzIoKTsKICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYyA9IHt9OwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0RWZmZWN0RGVzY3JpcHRvcigmdXVpZCwgJmRlc2MpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0RWZmZWN0RGVzY3JpcHRvcigmdXVpZCwgJnR5cGUsIHByZWZlcnJlZFR5cGVGbGFnLCAmZGVzYyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZSgmZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKaW5kZXggOGNkNGE4NS4uMjcyNDE1YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKQEAgLTI0LDExICsyNCwxMCBAQAogCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPGN1dGlscy9tdWx0aXVzZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9UaW1lQ2hlY2suaD4KLSNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNjMsNiArNjIsNyBAQAogICAgIFNFVF9FRkZFQ1RfRU5BQkxFRCwKICAgICBJU19TVFJFQU1fQUNUSVZFX1JFTU9URUxZLAogICAgIElTX09GRkxPQURfU1VQUE9SVEVELAorICAgIElTX0RJUkVDVF9PVVRQVVRfU1VQUE9SVEVELAogICAgIExJU1RfQVVESU9fUE9SVFMsCiAgICAgR0VUX0FVRElPX1BPUlQsCiAgICAgQ1JFQVRFX0FVRElPX1BBVENILApAQCAtODIsNyArODIsMTYgQEAKICAgICBHRVRfTUFTVEVSX01PTk8sCiAgICAgR0VUX1NUUkVBTV9WT0xVTUVfREIsCiAgICAgR0VUX1NVUlJPVU5EX0ZPUk1BVFMsCi0gICAgU0VUX1NVUlJPVU5EX0ZPUk1BVF9FTkFCTEVECisgICAgU0VUX1NVUlJPVU5EX0ZPUk1BVF9FTkFCTEVELAorICAgIEFERF9TVFJFQU1fREVGQVVMVF9FRkZFQ1QsCisgICAgUkVNT1ZFX1NUUkVBTV9ERUZBVUxUX0VGRkVDVCwKKyAgICBBRERfU09VUkNFX0RFRkFVTFRfRUZGRUNULAorICAgIFJFTU9WRV9TT1VSQ0VfREVGQVVMVF9FRkZFQ1QsCisgICAgU0VUX0FTU0lTVEFOVF9VSUQsCisgICAgU0VUX0ExMVlfU0VSVklDRVNfVUlEUywKKyAgICBJU19IQVBUSUNfUExBWUJBQ0tfU1VQUE9SVEVELAorICAgIFNFVF9VSURfREVWSUNFX0FGRklOSVRZLAorICAgIFJFTU9WRV9VSURfREVWSUNFX0FGRklOSVRZLAogfTsKIAogI2RlZmluZSBNQVhfSVRFTVNfUEVSX0xJU1QgMTAyNApAQCAtMjQ1LDQxICsyNTQsMjkgQEAKICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKG91dHB1dCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc3RyZWFtKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBzZXNzaW9uKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KXBvcnRJZCk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTVEFSVF9PVVRQVVQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihvdXRwdXQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHN0cmVhbSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc2Vzc2lvbik7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClwb3J0SWQpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU1RPUF9PVVRQVVQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKG91dHB1dCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClzdHJlYW0pOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpc2Vzc2lvbik7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClwb3J0SWQpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVMRUFTRV9PVVRQVVQsIGRhdGEsICZyZXBseSk7CiAgICAgfQogCkBAIC0zMzYsMTYgKzMzMywxMyBAQAogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzaWxlbmNlZCkKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydElkKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKCpzaWxlbmNlZCA/IDEgOiAwKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNUQVJUX0lOUFVULCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICpzaWxlbmNlZCA9IHJlcGx5LnJlYWRJbnQzMigpID09IDE7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCkBAIC01MzMsNiArNTI3LDE2IEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKKyAgICB2aXJ0dWFsIGJvb2wgaXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCYgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZSgmY29uZmlnLCBzaXplb2YoYXVkaW9fY29uZmlnX2Jhc2VfdCkpOworICAgICAgICBkYXRhLndyaXRlKCZhdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChJU19ESVJFQ1RfT1VUUFVUX1NVUFBPUlRFRCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSBOT19FUlJPUiA/IHN0YXRpY19jYXN0PGJvb2w+KHJlcGx5LnJlYWRJbnQzMigpKSA6IGZhbHNlOworICAgIH0KKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKQEAgLTc1MywxMSArNzU3LDExIEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgaWYgKHNvdXJjZSA9PSBOVUxMIHx8IGF0dHJpYnV0ZXMgPT0gTlVMTCB8fCBoYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBpZiAoc291cmNlID09IE5VTEwgfHwgYXR0cmlidXRlcyA9PSBOVUxMIHx8IHBvcnRJZCA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgICAgIGRhdGEud3JpdGUoc291cmNlLCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnKSk7CkBAIC03NzAsMTUgKzc3NCwxNSBAQAogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICB9Ci0gICAgICAgICpoYW5kbGUgPSAoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgICpwb3J0SWQgPSAoYXVkaW9fcG9ydF9oYW5kbGVfdClyZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoaGFuZGxlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRJZCk7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTVE9QX0FVRElPX1NPVVJDRSwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTg3OSw2ICs4ODMsMTU5IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU3RyZWFtRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdXNhZ2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZSh0eXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYob3BQYWNrYWdlTmFtZSk7CisgICAgICAgIGRhdGEud3JpdGUodXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHByaW9yaXR5KTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSB1c2FnZSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChBRERfU1RSRUFNX0RFRkFVTFRfRUZGRUNULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgKmlkID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGlkKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFJFTU9WRV9TVFJFQU1fREVGQVVMVF9FRkZFQ1QsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFNvdXJjZURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZSh0eXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYob3BQYWNrYWdlTmFtZSk7CisgICAgICAgIGRhdGEud3JpdGUodXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHByaW9yaXR5KTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBzb3VyY2UpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQUREX1NPVVJDRV9ERUZBVUxUX0VGRkVDVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgICppZCA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihpZCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChSRU1PVkVfU09VUkNFX0RFRkFVTFRfRUZGRUNULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBc3Npc3RhbnRVaWQodWlkX3QgdWlkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHVpZCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQVNTSVNUQU5UX1VJRCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QTExeVNlcnZpY2VzVWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIHVpZHMpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIodWlkcy5zaXplKCkpOworICAgICAgICBmb3IgKGF1dG8gdWlkIDogdWlkcykgeworICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKHVpZCk7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9BMTFZX1NFUlZJQ0VTX1VJRFMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoSVNfSEFQVElDX1BMQVlCQUNLX1NVUFBPUlRFRCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXBseS5yZWFkQm9vbCgpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSB1aWQpOworICAgICAgICBzaXplX3Qgc2l6ZSA9IGRldmljZXMuc2l6ZSgpOworICAgICAgICBzaXplX3Qgc2l6ZVBvc2l0aW9uID0gZGF0YS5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBzaXplKTsKKyAgICAgICAgc2l6ZV90IGZpbmFsU2l6ZSA9IHNpemU7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBzaXplX3QgcG9zaXRpb24gPSBkYXRhLmRhdGFQb3NpdGlvbigpOworICAgICAgICAgICAgaWYgKGRldmljZXNbaV0ud3JpdGVUb1BhcmNlbCgmZGF0YSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBkYXRhLnNldERhdGFQb3NpdGlvbihwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgZmluYWxTaXplLS07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemUgIT0gZmluYWxTaXplKSB7CisgICAgICAgICAgICBzaXplX3QgcG9zaXRpb24gPSBkYXRhLmRhdGFQb3NpdGlvbigpOworICAgICAgICAgICAgZGF0YS5zZXREYXRhUG9zaXRpb24oc2l6ZVBvc2l0aW9uKTsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihmaW5hbFNpemUpOworICAgICAgICAgICAgZGF0YS5zZXREYXRhUG9zaXRpb24ocG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9VSURfREVWSUNFX0FGRklOSVRZLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHVpZCk7CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFJFTU9WRV9VSURfREVWSUNFX0FGRklOSVRZLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CiB9OwogCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoQXVkaW9Qb2xpY3lTZXJ2aWNlLCAiYW5kcm9pZC5tZWRpYS5JQXVkaW9Qb2xpY3lTZXJ2aWNlIik7CkBAIC05MzUsOCArMTA5MiwxMiBAQAogICAgICAgICBjYXNlIFNUQVJUX0FVRElPX1NPVVJDRToKICAgICAgICAgY2FzZSBTVE9QX0FVRElPX1NPVVJDRToKICAgICAgICAgY2FzZSBHRVRfU1VSUk9VTkRfRk9STUFUUzoKLSAgICAgICAgY2FzZSBTRVRfU1VSUk9VTkRfRk9STUFUX0VOQUJMRUQ6IHsKLSAgICAgICAgICAgIGlmIChtdWx0aXVzZXJfZ2V0X2FwcF9pZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpID49IEFJRF9BUFBfU1RBUlQpIHsKKyAgICAgICAgY2FzZSBTRVRfU1VSUk9VTkRfRk9STUFUX0VOQUJMRUQ6CisgICAgICAgIGNhc2UgU0VUX0FTU0lTVEFOVF9VSUQ6CisgICAgICAgIGNhc2UgU0VUX0ExMVlfU0VSVklDRVNfVUlEUzoKKyAgICAgICAgY2FzZSBTRVRfVUlEX0RFVklDRV9BRkZJTklUWToKKyAgICAgICAgY2FzZSBSRU1PVkVfVUlEX0RFVklDRV9BRkZJTklUWTogeworICAgICAgICAgICAgaWYgKCFpc1NlcnZpY2VVaWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgewogICAgICAgICAgICAgICAgIEFMT0dXKCIlczogdHJhbnNhY3Rpb24gJWQgcmVjZWl2ZWQgZnJvbSBQSUQgJWQgdW5hdXRob3JpemVkIFVJRCAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNvZGUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOwpAQCAtOTQ4LDkgKzExMDksOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgY2hhciB0aW1lQ2hlY2tTdHJpbmdbNjRdOwotICAgIHNucHJpbnRmKHRpbWVDaGVja1N0cmluZywgc2l6ZW9mKHRpbWVDaGVja1N0cmluZyksICJJQXVkaW9Qb2xpY3lTZXJ2aWNlOiAlZCIsIGNvZGUpOwotICAgIFRpbWVDaGVjayBjaGVjayh0aW1lQ2hlY2tTdHJpbmcpOworICAgIHN0ZDo6c3RyaW5nIHRhZygiSUF1ZGlvUG9saWN5U2VydmljZSBjb21tYW5kICIgKyBzdGQ6OnRvX3N0cmluZyhjb2RlKSk7CisgICAgVGltZUNoZWNrIGNoZWNrKHRhZy5jX3N0cigpKTsKIAogICAgIHN3aXRjaCAoY29kZSkgewogICAgICAgICBjYXNlIFNFVF9ERVZJQ0VfQ09OTkVDVElPTl9TVEFURTogewpAQCAtMTA3NywzNCArMTIzNywyMiBAQAogCiAgICAgICAgIGNhc2UgU1RBUlRfT1VUUFVUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc3RhdGljX2Nhc3QgPGF1ZGlvX2lvX2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0YXJ0T3V0cHV0KG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uKSkpOworICAgICAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBzdGF0aWNfY2FzdCA8YXVkaW9fcG9ydF9oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0YXJ0T3V0cHV0KHBvcnRJZCkpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBjYXNlIFNUT1BfT1VUUFVUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc3RhdGljX2Nhc3QgPGF1ZGlvX2lvX2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0b3BPdXRwdXQob3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uKSkpOworICAgICAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBzdGF0aWNfY2FzdCA8YXVkaW9fcG9ydF9oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0b3BPdXRwdXQocG9ydElkKSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGNhc2UgUkVMRUFTRV9PVVRQVVQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSAoYXVkaW9fc3RyZWFtX3R5cGVfdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZWxlYXNlT3V0cHV0KG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gc3RhdGljX2Nhc3QgPGF1ZGlvX3BvcnRfaGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgcmVsZWFzZU91dHB1dChwb3J0SWQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCkBAIC0xMTM5LDEwICsxMjg3LDggQEAKICAgICAgICAgY2FzZSBTVEFSVF9JTlBVVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gc3RhdGljX2Nhc3QgPGF1ZGlvX3BvcnRfaGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYm9vbCBzaWxlbmNlZCA9IGRhdGEucmVhZEludDMyKCkgPT0gMTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0YXJ0SW5wdXQocG9ydElkLCAmc2lsZW5jZWQpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhcnRJbnB1dChwb3J0SWQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdGF0dXMpKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNpbGVuY2VkID8gMSA6IDApOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCkBAIC0xMzEzLDYgKzE0NTksMTggQEAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgSVNfRElSRUNUX09VVFBVVF9TVVBQT1JURUQ6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZyA9IHt9OworICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSB7fTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZCgmY29uZmlnLCBzaXplb2YoYXVkaW9fY29uZmlnX2Jhc2VfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIHN0YXR1cyA9IGRhdGEucmVhZCgmYXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbmZpZywgYXR0cmlidXRlcykpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBMSVNUX0FVRElPX1BPUlRTOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSA9IChhdWRpb19wb3J0X3JvbGVfdClkYXRhLnJlYWRJbnQzMigpOwpAQCAtMTQ5OCwxNyArMTY1NiwxNyBAQAogICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSB7fTsKICAgICAgICAgICAgIGRhdGEucmVhZCgmYXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwogICAgICAgICAgICAgc2FuZXRpemVBdWRpb0F0dHJpYnV0ZXMoJmF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGFydEF1ZGlvU291cmNlKCZzb3VyY2UsICZhdHRyaWJ1dGVzLCAmaGFuZGxlKTsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0YXJ0QXVkaW9Tb3VyY2UoJnNvdXJjZSwgJmF0dHJpYnV0ZXMsICZwb3J0SWQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGhhbmRsZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihwb3J0SWQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGNhc2UgU1RPUF9BVURJT19TT1VSQ0U6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUgPSAoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdG9wQXVkaW9Tb3VyY2UoaGFuZGxlKTsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gKGF1ZGlvX3BvcnRfaGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdG9wQXVkaW9Tb3VyY2UocG9ydElkKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC0xNTg3LDYgKzE3NDUsMTQ3IEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIEFERF9TVFJFQU1fREVGQVVMVF9FRkZFQ1Q6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBlZmZlY3RfdXVpZF90IHR5cGU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWQoJnR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZzE2IG9wUGFja2FnZU5hbWU7CisgICAgICAgICAgICBzdGF0dXMgPSBkYXRhLnJlYWRTdHJpbmcxNigmb3BQYWNrYWdlTmFtZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVmZmVjdF91dWlkX3QgdXVpZDsKKyAgICAgICAgICAgIHN0YXR1cyA9IGRhdGEucmVhZCgmdXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlID0gKGF1ZGlvX3VzYWdlX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCBpZCA9IDA7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4oYWRkU3RyZWFtRGVmYXVsdEVmZmVjdCgmdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWQpKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpZCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFJFTU9WRV9TVFJFQU1fREVGQVVMVF9FRkZFQ1Q6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCBpZCA9IHN0YXRpY19jYXN0PGF1ZGlvX3VuaXF1ZV9pZF90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDxpbnQzMl90PihyZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGlkKSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBBRERfU09VUkNFX0RFRkFVTFRfRUZGRUNUOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgZWZmZWN0X3V1aWRfdCB0eXBlOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkKCZ0eXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcxNiBvcFBhY2thZ2VOYW1lOworICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkU3RyaW5nMTYoJm9wUGFja2FnZU5hbWUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlZmZlY3RfdXVpZF90IHV1aWQ7CisgICAgICAgICAgICBzdGF0dXMgPSBkYXRhLnJlYWQoJnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlID0gKGF1ZGlvX3NvdXJjZV90KSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgaWQgPSAwOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludDMyX3Q+KGFkZFNvdXJjZURlZmF1bHRFZmZlY3QoJnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZCkpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlkKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgUkVNT1ZFX1NPVVJDRV9ERUZBVUxUX0VGRkVDVDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IGlkID0gc3RhdGljX2Nhc3Q8YXVkaW9fdW5pcXVlX2lkX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludDMyX3Q+KHJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoaWQpKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNFVF9BU1NJU1RBTlRfVUlEOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgaW50MzJfdCB1aWQ7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigmdWlkKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gc2V0QXNzaXN0YW50VWlkKHVpZCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4oc3RhdHVzKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNFVF9BMTFZX1NFUlZJQ0VTX1VJRFM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aWRfdD4gdWlkczsKKyAgICAgICAgICAgIGludDMyX3Qgc2l6ZTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZEludDMyKCZzaXplKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNpemUgPiBNQVhfSVRFTVNfUEVSX0xJU1QpIHsKKyAgICAgICAgICAgICAgICBzaXplID0gTUFYX0lURU1TX1BFUl9MSVNUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCB1aWQ7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gIGRhdGEucmVhZEludDMyKCZ1aWQpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdWlkcy5wdXNoX2JhY2sodWlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IHNldEExMXlTZXJ2aWNlc1VpZHModWlkcyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4oc3RhdHVzKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIElTX0hBUFRJQ19QTEFZQkFDS19TVVBQT1JURUQ6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBib29sIGlzU3VwcG9ydGVkID0gaXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpOworICAgICAgICAgICAgcmVwbHktPndyaXRlQm9vbChpc1N1cHBvcnRlZCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7ICAgIAorICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTRVRfVUlEX0RFVklDRV9BRkZJTklUWTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGNvbnN0IHVpZF90IHVpZCA9ICh1aWRfdCkgZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiBkZXZpY2VzOworICAgICAgICAgICAgc2l6ZV90IHNpemUgPSAoc2l6ZV90KWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgZGV2aWNlOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UucmVhZEZyb21QYXJjZWwoKFBhcmNlbCopJmRhdGEpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIGRldmljZXMuYWRkKGRldmljZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWQsIGRldmljZXMpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgUkVNT1ZFX1VJRF9ERVZJQ0VfQUZGSU5JVFk6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBjb25zdCB1aWRfdCB1aWQgPSAodWlkX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcAppbmRleCBhZDdmMWRlLi4xZjllYWI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcApAQCAtNTIsMTIgKzUyLDM3IEBACiAgICAgY2xpZW50SW5mby0+dWlkID0gKHVpZF90KSBkYXRhLnJlYWRVaW50MzIoKTsKICAgICBjbGllbnRJbmZvLT5zZXNzaW9uID0gKGF1ZGlvX3Nlc3Npb25fdCkgZGF0YS5yZWFkSW50MzIoKTsKICAgICBjbGllbnRJbmZvLT5zb3VyY2UgPSAoYXVkaW9fc291cmNlX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgZGF0YS5yZWFkKCZjbGllbnRJbmZvLT5wb3J0X2lkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOworICAgIGNsaWVudEluZm8tPnNpbGVuY2VkID0gZGF0YS5yZWFkQm9vbCgpOwogfQogCi1pbmxpbmUgdm9pZCB3cml0ZVJlY29yZENsaWVudEluZm9Gcm9tUGFyY2VsKFBhcmNlbCYgZGF0YSwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8pIHsKK2lubGluZSB2b2lkIHdyaXRlUmVjb3JkQ2xpZW50SW5mb1RvUGFyY2VsKFBhcmNlbCYgZGF0YSwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8pIHsKICAgICBkYXRhLndyaXRlVWludDMyKCh1aW50MzJfdCkgY2xpZW50SW5mby0+dWlkKTsKICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIGNsaWVudEluZm8tPnNlc3Npb24pOwogICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgY2xpZW50SW5mby0+c291cmNlKTsKKyAgICBkYXRhLndyaXRlKCZjbGllbnRJbmZvLT5wb3J0X2lkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOworICAgIGRhdGEud3JpdGVCb29sKGNsaWVudEluZm8tPnNpbGVuY2VkKTsKK30KKworaW5saW5lIHZvaWQgcmVhZEVmZmVjdFZlY3RvckZyb21QYXJjZWwoY29uc3QgUGFyY2VsJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gKmVmZmVjdHMpIHsKKyAgICBpbnQzMl90IG51bUVmZmVjdHMgPSBkYXRhLnJlYWRJbnQzMigpOworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bUVmZmVjdHM7IGkrKykgeworICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGVmZmVjdDsKKyAgICAgICAgaWYgKGRhdGEucmVhZCgmZWZmZWN0LCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAoKmVmZmVjdHMpLnB1c2hfYmFjayhlZmZlY3QpOworICAgIH0KK30KKworaW5saW5lIHZvaWQgd3JpdGVFZmZlY3RWZWN0b3JUb1BhcmNlbChQYXJjZWwmIGRhdGEsIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMpIHsKKyAgICBkYXRhLndyaXRlVWludDMyKCh1aW50MzJfdCkgZWZmZWN0cy5zaXplKCkpOworICAgIGZvciAoY29uc3QgYXV0byYgZWZmZWN0IDogZWZmZWN0cykgeworICAgICAgICBpZiAoZGF0YS53cml0ZSgmZWZmZWN0LCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtOTIsMTYgKzExNywyNCBAQAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoTUlYX1NUQVRFX1VQREFURSwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CiAgICAgfQogCi0gICAgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKLSAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpIHsKKyAgICB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihldmVudCk7Ci0gICAgICAgIHdyaXRlUmVjb3JkQ2xpZW50SW5mb0Zyb21QYXJjZWwoZGF0YSwgY2xpZW50SW5mbyk7CisgICAgICAgIHdyaXRlUmVjb3JkQ2xpZW50SW5mb1RvUGFyY2VsKGRhdGEsIGNsaWVudEluZm8pOwogICAgICAgICB3cml0ZUF1ZGlvQ29uZmlnQmFzZVRvUGFyY2VsKGRhdGEsIGNsaWVudENvbmZpZyk7CisgICAgICAgIHdyaXRlRWZmZWN0VmVjdG9yVG9QYXJjZWwoZGF0YSwgY2xpZW50RWZmZWN0cyk7CiAgICAgICAgIHdyaXRlQXVkaW9Db25maWdCYXNlVG9QYXJjZWwoZGF0YSwgZGV2aWNlQ29uZmlnKTsKKyAgICAgICAgd3JpdGVFZmZlY3RWZWN0b3JUb1BhcmNlbChkYXRhLCBlZmZlY3RzKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBhdGNoSGFuZGxlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBzb3VyY2UpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVDT1JESU5HX0NPTkZJR1VSQVRJT05fVVBEQVRFLCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKICAgICB9CiB9OwpAQCAtMTM5LDEwICsxNzIsMTUgQEAKICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgZGV2aWNlQ29uZmlnOwogICAgICAgICAgICAgcmVhZFJlY29yZENsaWVudEluZm9Gcm9tUGFyY2VsKGRhdGEsICZjbGllbnRJbmZvKTsKICAgICAgICAgICAgIHJlYWRBdWRpb0NvbmZpZ0Jhc2VGcm9tUGFyY2VsKGRhdGEsICZjbGllbnRDb25maWcpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0czsKKyAgICAgICAgICAgIHJlYWRFZmZlY3RWZWN0b3JGcm9tUGFyY2VsKGRhdGEsICZjbGllbnRFZmZlY3RzKTsKICAgICAgICAgICAgIHJlYWRBdWRpb0NvbmZpZ0Jhc2VGcm9tUGFyY2VsKGRhdGEsICZkZXZpY2VDb25maWcpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0czsKKyAgICAgICAgICAgIHJlYWRFZmZlY3RWZWN0b3JGcm9tUGFyY2VsKGRhdGEsICZlZmZlY3RzKTsKICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlID0gKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCAmY2xpZW50SW5mbywgJmNsaWVudENvbmZpZywgJmRldmljZUNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlID0gKGF1ZGlvX3NvdXJjZV90KSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCAmY2xpZW50SW5mbywgJmNsaWVudENvbmZpZywgY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlQ29uZmlnLCBlZmZlY3RzLCBwYXRjaEhhbmRsZSwgc291cmNlKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICBkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvVHJhY2suY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvVHJhY2suY3BwCmluZGV4IGFkZmYwNTcuLjgzYTU2OGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1RyYWNrLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9UcmFjay5jcHAKQEAgLTM5LDYgKzM5LDcgQEAKICAgICBQQVVTRSwKICAgICBBVFRBQ0hfQVVYX0VGRkVDVCwKICAgICBTRVRfUEFSQU1FVEVSUywKKyAgICBTRUxFQ1RfUFJFU0VOVEFUSU9OLAogICAgIEdFVF9USU1FU1RBTVAsCiAgICAgU0lHTkFMLAogICAgIEFQUExZX1ZPTFVNRV9TSEFQRVIsCkBAIC0xMjcsNiArMTI4LDE5IEBACiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCisgICAgLyogU2VsZWN0cyB0aGUgcHJlc2VudGF0aW9uIChpZiBhdmFpbGFibGUpICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1RyYWNrOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIocHJlc2VudGF0aW9uSWQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIocHJvZ3JhbUlkKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFTEVDVF9QUkVTRU5UQVRJT04sIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9UcmFjazo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKQEAgLTIzOSw2ICsyNTMsMTEgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldFBhcmFtZXRlcnMoa2V5VmFsdWVQYWlycykpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFNFTEVDVF9QUkVTRU5UQVRJT046IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9UcmFjaywgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2VsZWN0UHJlc2VudGF0aW9uKGRhdGEucmVhZEludDMyKCksIGRhdGEucmVhZEludDMyKCkpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBHRVRfVElNRVNUQU1QOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvVHJhY2ssIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIEF1ZGlvVGltZXN0YW1wIHRpbWVzdGFtcDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaAppbmRleCAzMjRiY2I5Li42YmQ0MTM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oCkBAIC05MCwyNyArOTAsMzQgQEAKICAgICAgKi8KICAgICBzdGF0aWMgc3RhdHVzX3QgcXVlcnlFZmZlY3QodWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpOwogCi0KICAgICAvKgotICAgICAqIFJldHVybnMgdGhlIGRlc2NyaXB0b3IgZm9yIHRoZSBzcGVjaWZpZWQgZWZmZWN0IHV1aWQuCisgICAgICogUmV0dXJucyBhIGRlc2NyaXB0b3IgZm9yIHRoZSBzcGVjaWZpZWQgZWZmZWN0IHV1aWQgb3IgdHlwZS4KKyAgICAgKgorICAgICAqIExvb2t1cCBhbiBlZmZlY3QgYnkgdXVpZCwgb3IgaWYgdGhhdCdzIHVuc3BlY2lmaWVkIChFRkZFQ1RfVVVJRF9OVUxMKSwKKyAgICAgKiBkbyBzbyBieSB0eXBlIGFuZCBwcmVmZXJyZWQgZmxhZ3MgaW5zdGVhZC4KICAgICAgKgogICAgICAqIFBhcmFtZXRlcnM6CiAgICAgICogICAgICB1dWlkOiAgICAgICBwb2ludGVyIHRvIGVmZmVjdCB1dWlkLgorICAgICAqICAgICAgdHlwZTogICAgICAgcG9pbnRlciB0byBlZmZlY3QgdHlwZSB1dWlkLgorICAgICAqICAgICAgcHJlZmVycmVkVHlwZUZsYWdzOiBpZiBtdWx0aXBsZSBlZmZlY3RzIG9mIHRoZSBnaXZlbiB0eXBlIGV4aXN0LAorICAgICAqICAgICAgICAgICAgICAgICAgb25lIHdpdGggYSBtYXRjaGluZyB0eXBlIGZsYWcgd2lsbCBiZSBjaG9zZW4gb3ZlciBvbmUgd2l0aG91dC4KKyAgICAgKiAgICAgICAgICAgICAgICAgIFVzZSBFRkZFQ1RfRkxBR19UWVBFX01BU0sgdG8gaW5kaWNhdGUgbm8gcHJlZmVyZW5jZS4KICAgICAgKiAgICAgIGRlc2NyaXB0b3I6IGFkZHJlc3Mgd2hlcmUgdGhlIGVmZmVjdCBkZXNjcmlwdG9yIHNob3VsZCBiZSByZXR1cm5lZC4KICAgICAgKgogICAgICAqIFJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgogICAgICAqICAgICAgTk9fRVJST1IgICAgICAgIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgogICAgICAqICAgICAgUEVSTUlTU0lPTl9ERU5JRUQgY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIgaW50ZXJmYWNlCiAgICAgICogICAgICBOT19JTklUICAgICAgICAgZWZmZWN0IGxpYnJhcnkgZmFpbGVkIHRvIGluaXRpYWxpemUKLSAgICAgKiAgICAgIEJBRF9WQUxVRSAgICAgICBpbnZhbGlkIHV1aWQgb3IgZGVzY3JpcHRvciBwb2ludGVycworICAgICAqICAgICAgQkFEX1ZBTFVFICAgICAgIGludmFsaWQgdHlwZSBvciBkZXNjcmlwdG9yIHBvaW50ZXJzCiAgICAgICogICAgICBOQU1FX05PVF9GT1VORCAgbm8gZWZmZWN0IHdpdGggdGhpcyB1dWlkIGZvdW5kCiAgICAgICoKICAgICAgKiBSZXR1cm5lZCB2YWx1ZQogICAgICAqICAgKmRlc2NyaXB0b3IgdXBkYXRlZCB3aXRoIGVmZmVjdCBkZXNjcmlwdG9yCiAgICAgICovCiAgICAgc3RhdGljIHN0YXR1c190IGdldEVmZmVjdERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKSAvKmNvbnN0Ki87Ci0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZWZlcnJlZFR5cGVGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpOwogCiAgICAgLyoKICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBkZXNjcmlwdG9ycyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcmUgcHJvY2Vzc2luZ3MgZW5hYmxlZCBieSBkZWZhdWx0CkBAIC0xNDQsNiArMTUxLDEzMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCk7CiAKICAgICAvKgorICAgICAqIEdldHMgYSBuZXcgc3lzdGVtLXdpZGUgdW5pcXVlIGVmZmVjdCBpZC4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogICAgICBpZDogVGhlIGFkZHJlc3MgdG8gcmV0dXJuIHRoZSBnZW5lcmF0ZWQgaWQuCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgKiAgICAgIE5PX0VSUk9SICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKyAgICAgKiAgICAgIFBFUk1JU1NJT05fREVOSUVEIGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIGludGVyZmFjZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgb3IgY2FsbGVyIGxhY2tzIHJlcXVpcmVkIHBlcm1pc3Npb25zLgorICAgICAqIFJldHVybmVkIHZhbHVlCisgICAgICogICAqaWQ6ICBUaGUgbmV3IHVuaXF1ZSBzeXN0ZW0td2lkZSBlZmZlY3QgaWQuCisgICAgICovCisgICAgc3RhdGljIHN0YXR1c190IG5ld0VmZmVjdFVuaXF1ZUlkKGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCk7CisKKyAgICAvKgorICAgICAqIFN0YXRpYyBtZXRob2RzIGZvciBhZGRpbmcvcmVtb3Zpbmcgc3lzdGVtLXdpZGUgZWZmZWN0cy4KKyAgICAgKi8KKworICAgIC8qCisgICAgICogQWRkcyBhbiBlZmZlY3QgdG8gdGhlIGxpc3Qgb2YgZGVmYXVsdCBvdXRwdXQgZWZmZWN0cyBmb3IgYSBnaXZlbiBzb3VyY2UgdHlwZS4KKyAgICAgKgorICAgICAqIElmIHRoZSBlZmZlY3QgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSB3aGVuIGEgc291cmNlIG9mIHRoZSBnaXZlbiB0eXBlCisgICAgICogaXMgY3JlYXRlZCwgdGhlIHN5c3RlbSB3aWxsIGNvbnRpbnVlIHdpdGhvdXQgYWRkaW5nIGl0LgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiAgIHR5cGVTdHI6ICBUeXBlIHV1aWQgb2YgZWZmZWN0IHRvIGJlIGEgZGVmYXVsdDogY2FuIGJlIG51bGwgaWYgdXVpZFN0ciBpcyBzcGVjaWZpZWQuCisgICAgICogICAgICAgICAgICAgVGhpcyBtYXkgY29ycmVzcG9uZCB0byB0aGUgT3BlblNMIEVTIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSB0aGlzIGVmZmVjdCwKKyAgICAgKiAgICAgICAgICAgICBvciBjb3VsZCBiZSBzb21lIHZlbmRvci1kZWZpbmVkIHR5cGUuCisgICAgICogICBvcFBhY2thZ2VOYW1lOiBUaGUgcGFja2FnZSBuYW1lIHVzZWQgZm9yIGFwcCBvcCBjaGVja3MuCisgICAgICogICB1dWlkU3RyOiAgVXVpZCBvZiBlZmZlY3QgdG8gYmUgYSBkZWZhdWx0OiBjYW4gYmUgbnVsbCBpZiB0eXBlIGlzIHNwZWNpZmllZC4KKyAgICAgKiAgICAgICAgICAgICBUaGlzIHV1aWQgY29ycmVzcG9uZHMgdG8gYSBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIG9mIGFuIGVmZmVjdCB0eXBlLgorICAgICAqICAgICAgICAgICAgIE5vdGUgaWYgYm90aCB1dWlkU3RyIGFuZCB0eXBlU3RyIGFyZSBzcGVjaWZpZWQsIHR5cGVTdHIgaXMgaWdub3JlZC4KKyAgICAgKiAgIHByaW9yaXR5OiBSZXF1ZXN0ZWQgcHJpb3JpdHkgZm9yIGVmZmVjdCBjb250cm9sOiB0aGUgcHJpb3JpdHkgbGV2ZWwgY29ycmVzcG9uZHMgdG8gdGhlCisgICAgICogICAgICAgICAgICAgdmFsdWUgb2YgcHJpb3JpdHkgcGFyYW1ldGVyOiBuZWdhdGl2ZSB2YWx1ZXMgaW5kaWNhdGUgbG93ZXIgcHJpb3JpdGllcywgcG9zaXRpdmUKKyAgICAgKiAgICAgICAgICAgICB2YWx1ZXMgaGlnaGVyIHByaW9yaXRpZXMsIDAgYmVpbmcgdGhlIG5vcm1hbCBwcmlvcml0eS4KKyAgICAgKiAgIHNvdXJjZTogICBUaGUgc291cmNlIHRoaXMgZWZmZWN0IHNob3VsZCBiZSBhIGRlZmF1bHQgZm9yLgorICAgICAqICAgaWQ6ICAgICAgIEFkZHJlc3Mgd2hlcmUgdGhlIHN5c3RlbS13aWRlIHVuaXF1ZSBpZCBvZiB0aGUgZGVmYXVsdCBlZmZlY3Qgc2hvdWxkIGJlIHJldHVybmVkLgorICAgICAqCisgICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CisgICAgICogICAgICBOT19FUlJPUiAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCisgICAgICogICAgICBQRVJNSVNTSU9OX0RFTklFRCBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciBpbnRlcmZhY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9yIGNhbGxlciBsYWNrcyByZXF1aXJlZCBwZXJtaXNzaW9ucy4KKyAgICAgKiAgICAgIE5PX0lOSVQgICAgICAgICBlZmZlY3QgbGlicmFyeSBmYWlsZWQgdG8gaW5pdGlhbGl6ZS4KKyAgICAgKiAgICAgIEJBRF9WQUxVRSAgICAgICBpbnZhbGlkIHNvdXJjZSwgdHlwZSB1dWlkIG9yIGltcGxlbWVudGF0aW9uIHV1aWQuCisgICAgICogICAgICBOQU1FX05PVF9GT1VORCAgbm8gZWZmZWN0IHdpdGggdGhpcyB1dWlkIG9yIHR5cGUgZm91bmQuCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCB2YWx1ZQorICAgICAqICAgKmlkOiAgVGhlIHN5c3RlbS13aWRlIHVuaXF1ZSBpZCBvZiB0aGUgYWRkZWQgZGVmYXVsdCBlZmZlY3QuCisgICAgICovCisgICAgc3RhdGljIHN0YXR1c190IGFkZFNvdXJjZURlZmF1bHRFZmZlY3QoY29uc3QgY2hhciogdHlwZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB1dWlkU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCk7CisKKyAgICAvKgorICAgICAqIEFkZHMgYW4gZWZmZWN0IHRvIHRoZSBsaXN0IG9mIGRlZmF1bHQgb3V0cHV0IGVmZmVjdHMgZm9yIGEgZ2l2ZW4gc3RyZWFtIHR5cGUuCisgICAgICoKKyAgICAgKiBJZiB0aGUgZWZmZWN0IGlzIG5vIGxvbmdlciBhdmFpbGFibGUgd2hlbiBhIHN0cmVhbSBvZiB0aGUgZ2l2ZW4gdHlwZQorICAgICAqIGlzIGNyZWF0ZWQsIHRoZSBzeXN0ZW0gd2lsbCBjb250aW51ZSB3aXRob3V0IGFkZGluZyBpdC4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogICB0eXBlU3RyOiAgVHlwZSB1dWlkIG9mIGVmZmVjdCB0byBiZSBhIGRlZmF1bHQ6IGNhbiBiZSBudWxsIGlmIHV1aWRTdHIgaXMgc3BlY2lmaWVkLgorICAgICAqICAgICAgICAgICAgIFRoaXMgbWF5IGNvcnJlc3BvbmQgdG8gdGhlIE9wZW5TTCBFUyBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgdGhpcyBlZmZlY3QsCisgICAgICogICAgICAgICAgICAgb3IgY291bGQgYmUgc29tZSB2ZW5kb3ItZGVmaW5lZCB0eXBlLgorICAgICAqICAgb3BQYWNrYWdlTmFtZTogVGhlIHBhY2thZ2UgbmFtZSB1c2VkIGZvciBhcHAgb3AgY2hlY2tzLgorICAgICAqICAgdXVpZFN0cjogIFV1aWQgb2YgZWZmZWN0IHRvIGJlIGEgZGVmYXVsdDogY2FuIGJlIG51bGwgaWYgdHlwZSBpcyBzcGVjaWZpZWQuCisgICAgICogICAgICAgICAgICAgVGhpcyB1dWlkIGNvcnJlc3BvbmRzIHRvIGEgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbiBvZiBhbiBlZmZlY3QgdHlwZS4KKyAgICAgKiAgICAgICAgICAgICBOb3RlIGlmIGJvdGggdXVpZFN0ciBhbmQgdHlwZVN0ciBhcmUgc3BlY2lmaWVkLCB0eXBlU3RyIGlzIGlnbm9yZWQuCisgICAgICogICBwcmlvcml0eTogUmVxdWVzdGVkIHByaW9yaXR5IGZvciBlZmZlY3QgY29udHJvbDogdGhlIHByaW9yaXR5IGxldmVsIGNvcnJlc3BvbmRzIHRvIHRoZQorICAgICAqICAgICAgICAgICAgIHZhbHVlIG9mIHByaW9yaXR5IHBhcmFtZXRlcjogbmVnYXRpdmUgdmFsdWVzIGluZGljYXRlIGxvd2VyIHByaW9yaXRpZXMsIHBvc2l0aXZlCisgICAgICogICAgICAgICAgICAgdmFsdWVzIGhpZ2hlciBwcmlvcml0aWVzLCAwIGJlaW5nIHRoZSBub3JtYWwgcHJpb3JpdHkuCisgICAgICogICB1c2FnZTogICAgVGhlIHVzYWdlIHRoaXMgZWZmZWN0IHNob3VsZCBiZSBhIGRlZmF1bHQgZm9yLiBVbnJlY29nbml6ZWQgdmFsdWVzIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICB0cmVhdGVkIGFzIEFVRElPX1VTQUdFX1VOS05PV04uCisgICAgICogICBpZDogICAgICAgQWRkcmVzcyB3aGVyZSB0aGUgc3lzdGVtLXdpZGUgdW5pcXVlIGlkIG9mIHRoZSBkZWZhdWx0IGVmZmVjdCBzaG91bGQgYmUgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgKiAgICAgIE5PX0VSUk9SICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKyAgICAgKiAgICAgIFBFUk1JU1NJT05fREVOSUVEIGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIGludGVyZmFjZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgb3IgY2FsbGVyIGxhY2tzIHJlcXVpcmVkIHBlcm1pc3Npb25zLgorICAgICAqICAgICAgTk9fSU5JVCAgICAgICAgIGVmZmVjdCBsaWJyYXJ5IGZhaWxlZCB0byBpbml0aWFsaXplLgorICAgICAqICAgICAgQkFEX1ZBTFVFICAgICAgIGludmFsaWQgdHlwZSB1dWlkIG9yIGltcGxlbWVudGF0aW9uIHV1aWQuCisgICAgICogICAgICBOQU1FX05PVF9GT1VORCAgbm8gZWZmZWN0IHdpdGggdGhpcyB1dWlkIG9yIHR5cGUgZm91bmQuCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCB2YWx1ZQorICAgICAqICAgKmlkOiAgVGhlIHN5c3RlbS13aWRlIHVuaXF1ZSBpZCBvZiB0aGUgYWRkZWQgZGVmYXVsdCBlZmZlY3QuCisgICAgICovCisgICAgc3RhdGljIHN0YXR1c190IGFkZFN0cmVhbURlZmF1bHRFZmZlY3QoY29uc3QgY2hhciogdHlwZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB1dWlkU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdXNhZ2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpOworCisgICAgLyoKKyAgICAgKiBSZW1vdmVzIGFuIGVmZmVjdCBmcm9tIHRoZSBsaXN0IG9mIGRlZmF1bHQgb3V0cHV0IGVmZmVjdHMgZm9yIGEgZ2l2ZW4gc291cmNlIHR5cGUuCisgICAgICoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqICAgICAgaWQ6IFRoZSBzeXN0ZW0td2lkZSB1bmlxdWUgaWQgb2YgdGhlIGVmZmVjdCB0aGF0IHNob3VsZCBubyBsb25nZXIgYmUgYSBkZWZhdWx0LgorICAgICAqCisgICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CisgICAgICogICAgICBOT19FUlJPUiAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCisgICAgICogICAgICBQRVJNSVNTSU9OX0RFTklFRCBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciBpbnRlcmZhY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9yIGNhbGxlciBsYWNrcyByZXF1aXJlZCBwZXJtaXNzaW9ucy4KKyAgICAgKiAgICAgIE5PX0lOSVQgICAgICAgICBlZmZlY3QgbGlicmFyeSBmYWlsZWQgdG8gaW5pdGlhbGl6ZS4KKyAgICAgKiAgICAgIEJBRF9WQUxVRSAgICAgICBpbnZhbGlkIGlkLgorICAgICAqLworICAgIHN0YXRpYyBzdGF0dXNfdCByZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKTsKKworICAgIC8qCisgICAgICogUmVtb3ZlcyBhbiBlZmZlY3QgZnJvbSB0aGUgbGlzdCBvZiBkZWZhdWx0IG91dHB1dCBlZmZlY3RzIGZvciBhIGdpdmVuIHN0cmVhbSB0eXBlLgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiAgICAgIGlkOiBUaGUgc3lzdGVtLXdpZGUgdW5pcXVlIGlkIG9mIHRoZSBlZmZlY3QgdGhhdCBzaG91bGQgbm8gbG9uZ2VyIGJlIGEgZGVmYXVsdC4KKyAgICAgKgorICAgICAqIFJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgorICAgICAqICAgICAgTk9fRVJST1IgICAgICAgIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgorICAgICAqICAgICAgUEVSTUlTU0lPTl9ERU5JRUQgY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIgaW50ZXJmYWNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBvciBjYWxsZXIgbGFja3MgcmVxdWlyZWQgcGVybWlzc2lvbnMuCisgICAgICogICAgICBOT19JTklUICAgICAgICAgZWZmZWN0IGxpYnJhcnkgZmFpbGVkIHRvIGluaXRpYWxpemUuCisgICAgICogICAgICBCQURfVkFMVUUgICAgICAgaW52YWxpZCBpZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgcmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCk7CisKKyAgICAvKgogICAgICAqIEV2ZW50cyB1c2VkIGJ5IGNhbGxiYWNrIGZ1bmN0aW9uIChlZmZlY3RfY2FsbGJhY2tfdCkuCiAgICAgICovCiAgICAgZW51bSBldmVudF90eXBlIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9NaXhlci5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb01peGVyLmgKaW5kZXggY2Y3ZDkwZi4uM2FlNzEwNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb01peGVyLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb01peGVyLmgKQEAgLTE4LDE3ICsxOCwxOCBAQAogI2lmbmRlZiBBTkRST0lEX0FVRElPX01JWEVSX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT19NSVhFUl9ICiAKKyNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8cHRocmVhZC5oPgogI2luY2x1ZGUgPHNzdHJlYW0+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgogI2luY2x1ZGUgPG1lZGlhL0J1ZmZlclByb3ZpZGVycy5oPgotI2luY2x1ZGUgPG1lZGlhL25ibG9nL05CTG9nLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8dXRpbHMvQ29tcGF0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgpAQCAtNDEsNiArNDIsMTAgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCituYW1lc3BhY2UgTkJMb2cgeworY2xhc3MgV3JpdGVyOworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIGNsYXNzIEF1ZGlvTWl4ZXIKQEAgLTczLDYgKzc4LDggQEAKICAgICAgICAgRE9XTk1JWF9UWVBFICAgID0gMFg0MDA0LAogICAgICAgICBNSVhFUl9GT1JNQVQgICAgPSAweDQwMDUsIC8vIEFVRElPX0ZPUk1BVF9QQ01fKEZMT0FUfDE2X0JJVCkKICAgICAgICAgTUlYRVJfQ0hBTk5FTF9NQVNLID0gMHg0MDA2LCAvLyBDaGFubmVsIG1hc2sgZm9yIG1peGVyIG91dHB1dAorICAgICAgICAvLyBmb3IgaGFwdGljCisgICAgICAgIEhBUFRJQ19FTkFCTEVEICA9IDB4NDAwNywgLy8gU2V0IGhhcHRpYyBkYXRhIGZyb20gdGhpcyB0cmFjayBzaG91bGQgYmUgcGxheWVkIG9yIG5vdC4KICAgICAgICAgLy8gZm9yIHRhcmdldCBSRVNBTVBMRQogICAgICAgICBTQU1QTEVfUkFURSAgICAgPSAweDQxMDAsIC8vIENvbmZpZ3VyZSBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uIG9uIHRoaXMgdHJhY2sgbmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJhbWV0ZXIgJ3ZhbHVlJyBpcyB0aGUgbmV3IHNhbXBsZSByYXRlIGluIEh6LgpAQCAtMTMyLDYgKzEzOSwxMyBAQAogICAgIHZvaWQgICAgICAgIHNldEJ1ZmZlclByb3ZpZGVyKGludCBuYW1lLCBBdWRpb0J1ZmZlclByb3ZpZGVyKiBidWZmZXJQcm92aWRlcik7CiAKICAgICB2b2lkICAgICAgICBwcm9jZXNzKCkgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnBhaXIgOiBtVHJhY2tzKSB7CisgICAgICAgICAgICAvLyBDbGVhciBjb250cmFjdGVkIGJ1ZmZlciBiZWZvcmUgcHJvY2Vzc2luZyBpZiBjb250cmFjdGVkIGNoYW5uZWxzIGFyZSBzYXZlZAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdCA9IHBhaXIuc2Vjb25kOworICAgICAgICAgICAgaWYgKHQtPm1LZWVwQ29udHJhY3RlZENoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgdC0+Y2xlYXJDb250cmFjdGVkQnVmZmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgKHRoaXMtPiptSG9vaykoKTsKICAgICB9CiAKQEAgLTIzMCw2ICsyNDQsOCBAQAogICAgICAgICAgICAgbVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlci5yZXNldChudWxscHRyKTsKICAgICAgICAgICAgIG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlci5yZXNldChudWxscHRyKTsKICAgICAgICAgICAgIG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLnJlc2V0KG51bGxwdHIpOworICAgICAgICAgICAgbUFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5yZXNldChudWxscHRyKTsKKyAgICAgICAgICAgIG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyLnJlc2V0KG51bGxwdHIpOwogICAgICAgICB9CiAKICAgICAgICAgYm9vbCAgICAgICAgbmVlZHNSYW1wKCkgeyByZXR1cm4gKHZvbHVtZUluY1swXSB8IHZvbHVtZUluY1sxXSB8IGF1eEluYykgIT0gMDsgfQpAQCAtMjQ0LDYgKzI2MCwxMSBAQAogICAgICAgICB2b2lkICAgICAgICB1bnByZXBhcmVGb3JEb3dubWl4KCk7CiAgICAgICAgIHN0YXR1c190ICAgIHByZXBhcmVGb3JSZWZvcm1hdCgpOwogICAgICAgICB2b2lkICAgICAgICB1bnByZXBhcmVGb3JSZWZvcm1hdCgpOworICAgICAgICBzdGF0dXNfdCAgICBwcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMoKTsKKyAgICAgICAgdm9pZCAgICAgICAgdW5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMoKTsKKyAgICAgICAgc3RhdHVzX3QgICAgcHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUoc2l6ZV90IGZyYW1lcyk7CisgICAgICAgIHZvaWQgICAgICAgIHVucHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUoKTsKKyAgICAgICAgdm9pZCAgICAgICAgY2xlYXJDb250cmFjdGVkQnVmZmVyKCk7CiAgICAgICAgIGJvb2wgICAgICAgIHNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcGxheWJhY2tSYXRlKTsKICAgICAgICAgdm9pZCAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKIApAQCAtMjk3LDE3ICszMTgsMjIgQEAKICAgICAgICAgICogYWxsIHByZS1taXhlciB0cmFjayBidWZmZXIgY29udmVyc2lvbnMgb3V0c2lkZSB0aGUgQXVkaW9NaXhlciBjbGFzcy4KICAgICAgICAgICoKICAgICAgICAgICogMSkgbUlucHV0QnVmZmVyUHJvdmlkZXI6IFRoZSBBdWRpb1RyYWNrIGJ1ZmZlciBwcm92aWRlci4KLSAgICAgICAgICogMikgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI6IElmIG5vdCBOVUxMLCBwZXJmb3JtcyB0aGUgYXVkaW8gcmVmb3JtYXQgdG8KKyAgICAgICAgICogMikgbUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXI6IEV4cGVuZCBvciBjb250cmFjdHMgZGF0YQorICAgICAgICAgKiAzKSBtQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyOiBOb24tZGVzdHJ1Y3RpdmVseSBhZGp1c3Qgc2FtcGxlIGRhdGEKKyAgICAgICAgICogNCkgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI6IElmIG5vdCBOVUxMLCBwZXJmb3JtcyB0aGUgYXVkaW8gcmVmb3JtYXQgdG8KICAgICAgICAgICogICAgbWF0Y2ggZWl0aGVyIG1NaXhlckluRm9ybWF0IG9yIG1Eb3dubWl4UmVxdWlyZXNGb3JtYXQsIGlmIHRoZSBkb3dubWl4ZXIKICAgICAgICAgICogICAgcmVxdWlyZXMgcmVmb3JtYXQuIEZvciBleGFtcGxlLCBpdCBtYXkgY29udmVydCBmbG9hdGluZyBwb2ludCBpbnB1dCB0bwogICAgICAgICAgKiAgICBQQ01fMTZfYml0IGlmIHRoYXQncyByZXF1aXJlZCBieSB0aGUgZG93bm1peGVyLgotICAgICAgICAgKiAzKSBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6IElmIG5vdCBOVUxMLCBwZXJmb3JtcyB0aGUgY2hhbm5lbCByZW1peGluZyB0byBtYXRjaAorICAgICAgICAgKiA1KSBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6IElmIG5vdCBOVUxMLCBwZXJmb3JtcyB0aGUgY2hhbm5lbCByZW1peGluZyB0byBtYXRjaAogICAgICAgICAgKiAgICB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIHJlcXVpcmVkIGJ5IHRoZSBtaXhlciBzaW5rLgotICAgICAgICAgKiA0KSBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOiBJZiBub3QgTlVMTCwgcGVyZm9ybXMgcmVmb3JtYXR0aW5nIGZyb20KKyAgICAgICAgICogNikgbVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlcjogSWYgbm90IE5VTEwsIHBlcmZvcm1zIHJlZm9ybWF0dGluZyBmcm9tCiAgICAgICAgICAqICAgIHRoZSBkb3dubWl4ZXIgcmVxdWlyZW1lbnRzIHRvIHRoZSBtaXhlciBlbmdpbmUgaW5wdXQgcmVxdWlyZW1lbnRzLgotICAgICAgICAgKiA1KSBtVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcjogQWRkcyB0aW1lc3RyZXRjaGluZyBmb3IgcGxheWJhY2sgcmF0ZQorICAgICAgICAgKiA3KSBtVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcjogQWRkcyB0aW1lc3RyZXRjaGluZyBmb3IgcGxheWJhY2sgcmF0ZQogICAgICAgICAgKi8KICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogICAgIG1JbnB1dEJ1ZmZlclByb3ZpZGVyOyAgICAvLyBleHRlcm5hbGx5IHByb3ZpZGVkIGJ1ZmZlciBwcm92aWRlci4KKyAgICAgICAgLy8gVE9ETzogY29tYmluZSBBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyIGFuZCBBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXI+IG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UGFzc3RocnVCdWZmZXJQcm92aWRlcj4gbUFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlcjsKICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXI+IG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOwogICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UGFzc3RocnVCdWZmZXJQcm92aWRlcj4gbURvd25taXhlckJ1ZmZlclByb3ZpZGVyOwogICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UGFzc3RocnVCdWZmZXJQcm92aWRlcj4gbVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlcjsKQEAgLTMzNiw2ICszNjIsMTggQEAKIAogICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSAgICBtUGxheWJhY2tSYXRlOwogCisgICAgICAgIC8vIEhhcHRpYworICAgICAgICBib29sICAgICAgICAgICAgICAgICBtSGFwdGljUGxheWJhY2tFbmFibGVkOworICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtSGFwdGljQ2hhbm5lbE1hc2s7CisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIG1IYXB0aWNDaGFubmVsQ291bnQ7CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1NaXhlckhhcHRpY0NoYW5uZWxNYXNrOworICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICBtTWl4ZXJIYXB0aWNDaGFubmVsQ291bnQ7CisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIG1BZGp1c3RJbkNoYW5uZWxDb3VudDsKKyAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgbUFkanVzdE91dENoYW5uZWxDb3VudDsKKyAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgbUFkanVzdE5vbkRlc3RydWN0aXZlSW5DaGFubmVsQ291bnQ7CisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIG1BZGp1c3ROb25EZXN0cnVjdGl2ZU91dENoYW5uZWxDb3VudDsKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgbUtlZXBDb250cmFjdGVkQ2hhbm5lbHM7CisKICAgICBwcml2YXRlOgogICAgICAgICAvLyBob29rcwogICAgICAgICB2b2lkIHRyYWNrX19nZW5lcmljUmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3QgbnVtRnJhbWVzLCBpbnQzMl90KiB0ZW1wLCBpbnQzMl90KiBhdXgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BhcmFtZXRlci5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BhcmFtZXRlci5oCmluZGV4IDk2N2Q4OTUuLjI0ODM3ZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9QYXJhbWV0ZXIuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUGFyYW1ldGVyLmgKQEAgLTY0LDYgKzY0LDkgQEAKICAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleVByZXNlbnRhdGlvbklkOwogICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5UHJvZ3JhbUlkOwogCisgICAgLy8gIGtleUF1ZGlvTGFuZ3VhZ2VQcmVmZXJyZWQ6IFByZWZlcnJlZCBhdWRpbyBsYW5ndWFnZQorICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5QXVkaW9MYW5ndWFnZVByZWZlcnJlZDsKKwogICAgIC8vICBrZXlTdHJlYW1Db25uZWN0IC8gRGlzY29ubmVjdDogdmFsdWUgaXMgYW4gaW50IGluIGF1ZGlvX2RldmljZXNfdAogICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5U3RyZWFtQ29ubmVjdDsKICAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleVN0cmVhbURpc2Nvbm5lY3Q7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5LmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5LmgKaW5kZXggOGRhMDA2OS4uOTZlMTIzNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3kuaApAQCAtNTYsNiArNTYsMTkgQEAKICNkZWZpbmUgTUFYX01JWEVTX1BFUl9QT0xJQ1kgMTAKICNkZWZpbmUgTUFYX0NSSVRFUklBX1BFUl9NSVggMjAKIAorY2xhc3MgQXVkaW9EZXZpY2VUeXBlQWRkciB7CitwdWJsaWM6CisgICAgQXVkaW9EZXZpY2VUeXBlQWRkcigpIHt9CisgICAgQXVkaW9EZXZpY2VUeXBlQWRkcihhdWRpb19kZXZpY2VzX3QgdHlwZSwgU3RyaW5nOCBhZGRyZXNzKSA6CisgICAgICAgIG1UeXBlKHR5cGUpLCBtQWRkcmVzcyhhZGRyZXNzKSB7fQorCisgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoUGFyY2VsICpwYXJjZWwpOworICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0OworCisgICAgYXVkaW9fZGV2aWNlc190IG1UeXBlOworICAgIFN0cmluZzggbUFkZHJlc3M7Cit9OworCiBjbGFzcyBBdWRpb01peE1hdGNoQ3JpdGVyaW9uIHsKIHB1YmxpYzoKICAgICBBdWRpb01peE1hdGNoQ3JpdGVyaW9uKCkge30KQEAgLTg3LDcgKzEwMCw5IEBACiAgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoUGFyY2VsICpwYXJjZWwpOwogICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0OwogCi0gICAgVmVjdG9yPEF1ZGlvTWl4TWF0Y2hDcml0ZXJpb24+IG1Dcml0ZXJpYTsKKyAgICB2b2lkIGV4Y2x1ZGVVaWQodWlkX3QgdWlkKSBjb25zdDsKKworICAgIG11dGFibGUgVmVjdG9yPEF1ZGlvTWl4TWF0Y2hDcml0ZXJpb24+IG1Dcml0ZXJpYTsKICAgICB1aW50MzJfdCAgICAgICAgbU1peFR5cGU7CiAgICAgYXVkaW9fY29uZmlnX3QgIG1Gb3JtYXQ7CiAgICAgdWludDMyX3QgICAgICAgIG1Sb3V0ZUZsYWdzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oCmluZGV4IGZiZTk1NDYuLjQ2ZGU2YjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmgKQEAgLTIwLDYgKzIwLDQzIEBACiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKIHN0YXRpYyBpbmxpbmUKK2F1ZGlvX3N0cmVhbV90eXBlX3QgYXVkaW9fdXNhZ2VfdG9fc3RyZWFtX3R5cGUoY29uc3QgYXVkaW9fdXNhZ2VfdCB1c2FnZSkKK3sKKyAgICBzd2l0Y2godXNhZ2UpIHsKKyAgICAgICAgY2FzZSBBVURJT19VU0FHRV9NRURJQToKKyAgICAgICAgY2FzZSBBVURJT19VU0FHRV9HQU1FOgorICAgICAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRToKKyAgICAgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTlQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX01VU0lDOworICAgICAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWTsKKyAgICAgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTjoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fU1lTVEVNOworICAgICAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT046CisgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw7CisKKyAgICAgICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0RUTUY7CisKKyAgICAgICAgY2FzZSBBVURJT19VU0FHRV9BTEFSTToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQUxBUk07CisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fUklORzsKKworICAgICAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTjoKKyAgICAgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOgorICAgICAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQ6CisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRDoKKyAgICAgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX05PVElGSUNBVElPTjsKKworICAgICAgICBjYXNlIEFVRElPX1VTQUdFX1VOS05PV046CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX01VU0lDOworICAgIH0KK30KKworc3RhdGljIGlubGluZQogYXVkaW9fc3RyZWFtX3R5cGVfdCBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cikKIHsKICAgICAvLyBmbGFncyB0byBzdHJlYW0gdHlwZSBtYXBwaW5nCkBAIC0zMSwzOCArNjgsNyBAQAogICAgIH0KIAogICAgIC8vIHVzYWdlIHRvIHN0cmVhbSB0eXBlIG1hcHBpbmcKLSAgICBzd2l0Y2ggKGF0dHItPnVzYWdlKSB7Ci0gICAgY2FzZSBBVURJT19VU0FHRV9NRURJQToKLSAgICBjYXNlIEFVRElPX1VTQUdFX0dBTUU6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0U6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTlQ6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWTsKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1NZU1RFTTsKLSAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT046Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0RUTUY7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX0FMQVJNOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0FMQVJNOwotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORToKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9SSU5HOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT046Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQ6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9VTktOT1dOOgotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7Ci0gICAgfQorICAgIHJldHVybiBhdWRpb191c2FnZV90b19zdHJlYW1fdHlwZShhdHRyLT51c2FnZSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUKQEAgLTExNyw0ICsxMjMsMjEgQEAKICAgICB9CiB9CiAKKy8vIENvbnZlcnQgZmxhZ3Mgc2VudCBmcm9tIEphdmEgQXVkaW9BdHRyaWJ1dGVzLmdldEZsYWdzKCkgbWV0aG9kIHRvIGF1ZGlvX291dHB1dF9mbGFnc190CitzdGF0aWMgaW5saW5lCit2b2lkIGF1ZGlvX2F0dHJpYnV0ZXNfZmxhZ3NfdG9fYXVkaW9fb3V0cHV0X2ZsYWdzKGNvbnN0IGF1ZGlvX2ZsYWdzX21hc2tfdCBhdWRpb0F0dHJpYnV0ZUZsYWdzLAorICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgJmZsYWdzKSB7CisgICAgaWYgKChhdWRpb0F0dHJpYnV0ZUZsYWdzICYgQVVESU9fRkxBR19IV19BVl9TWU5DKSAhPSAwKSB7CisgICAgICAgIGZsYWdzID0gc3RhdGljX2Nhc3Q8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+KGZsYWdzIHwKKyAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgIH0KKyAgICBpZiAoKGF1ZGlvQXR0cmlidXRlRmxhZ3MgJiBBVURJT19GTEFHX0xPV19MQVRFTkNZKSAhPSAwKSB7CisgICAgICAgIGZsYWdzID0gc3RhdGljX2Nhc3Q8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+KGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCk7CisgICAgfQorICAgIC8vIGNoZWNrIGRlZXAgYnVmZmVyIGFmdGVyIGZsYWdzIGhhdmUgYmVlbiBtb2RpZmllZCBhYm92ZQorICAgIGlmIChmbGFncyA9PSBBVURJT19PVVRQVVRfRkxBR19OT05FICYmIChhdWRpb0F0dHJpYnV0ZUZsYWdzICYgQVVESU9fRkxBR19ERUVQX0JVRkZFUikgIT0gMCkgeworICAgICAgICBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSOworICAgIH0KK30KKwogI2VuZGlmIC8vQVVESU9fUE9MSUNZX0hFTFBFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oCmluZGV4IDgwNjI4MGEuLjM1YTdlMDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKQEAgLTUzNCw5ICs1MzQsMTUgQEAKICAgICAgKi8KICAgICAgICAgICAgIHN0YXR1c190ICAgIGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKTsKIAotICAgIC8qCi0gICAgICogRHVtcHMgdGhlIHN0YXRlIG9mIGFuIGF1ZGlvIHJlY29yZC4KLSAgICAgKi8KKyAgICAgLyogR2V0IHRoZSB1bmlxdWUgcG9ydCBJRCBhc3NpZ25lZCB0byB0aGlzIEF1ZGlvUmVjb3JkIGluc3RhbmNlIGJ5IGF1ZGlvIHBvbGljeSBtYW5hZ2VyLgorICAgICAgKiBUaGUgSUQgaXMgdW5pcXVlIGFjcm9zcyBhbGwgYXVkaW9zZXJ2ZXIgY2xpZW50cyBhbmQgY2FuIGNoYW5nZSBkdXJpbmcgdGhlIGxpZmUgY3ljbGUKKyAgICAgICogb2YgYSBnaXZlbiBBdWRpb1JlY29yZCBpbnN0YW5jZSBpZiB0aGUgY29ubmVjdGlvbiB0byBhdWRpb3NlcnZlciBpcyByZXN0b3JlZC4KKyAgICAgICovCisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldFBvcnRJZCgpIGNvbnN0IHsgcmV0dXJuIG1Qb3J0SWQ7IH07CisKKyAgICAgLyoKKyAgICAgICogRHVtcHMgdGhlIHN0YXRlIG9mIGFuIGF1ZGlvIHJlY29yZC4KKyAgICAgICovCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CiAKIHByaXZhdGU6CkBAIC02NTQsNiArNjYwLDcgQEAKICAgICBhdWRpb19pbnB1dF9mbGFnc190ICAgICBtT3JpZ0ZsYWdzOyAgICAgICAgICAgICAvLyBhcyBzcGVjaWZpZWQgaW4gY29uc3RydWN0b3Igb3Igc2V0KCksIGNvbnN0CiAKICAgICBhdWRpb19zZXNzaW9uX3QgICAgICAgICBtU2Vzc2lvbklkOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1Qb3J0SWQ7ICAgICAgICAgICAgICAgICAgICAvLyBJZCBmcm9tIEF1ZGlvIFBvbGljeSBNYW5hZ2VyCiAgICAgdHJhbnNmZXJfdHlwZSAgICAgICAgICAgbVRyYW5zZmVyOwogCiAgICAgLy8gTmV4dCA1IGZpZWxkcyBtYXkgYmUgY2hhbmdlZCBpZiBJQXVkaW9SZWNvcmQgaXMgcmUtY3JlYXRlZCwgYnV0IGFsd2F5cyAhPSAwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKaW5kZXggNGMwZjc5Ni4uNzgxZTlkZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaApAQCAtMzUsOSArMzUsMTQgQEAKIAogdHlwZWRlZiB2b2lkICgqYXVkaW9fZXJyb3JfY2FsbGJhY2spKHN0YXR1c190IGVycik7CiB0eXBlZGVmIHZvaWQgKCpkeW5hbWljX3BvbGljeV9jYWxsYmFjaykoaW50IGV2ZW50LCBTdHJpbmc4IHJlZ0lkLCBpbnQgdmFsKTsKLXR5cGVkZWYgdm9pZCAoKnJlY29yZF9jb25maWdfY2FsbGJhY2spKGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCi0gICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOwordHlwZWRlZiB2b2lkICgqcmVjb3JkX2NvbmZpZ19jYWxsYmFjaykoaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKTsKIAogY2xhc3MgSUF1ZGlvRmxpbmdlcjsKIGNsYXNzIElBdWRpb1BvbGljeVNlcnZpY2U7CkBAIC0yMjQsMTUgKzIyOSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgc3RhdGljIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICBzdGF0aWMgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgIHN0YXRpYyBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgc3RhdGljIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgIHN0YXRpYyB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCiAgICAgLy8gQ2xpZW50IG11c3Qgc3VjY2Vzc2Z1bGx5IGhhbmQgb2ZmIHRoZSBoYW5kbGUgcmVmZXJlbmNlIHRvIEF1ZGlvRmxpbmdlciB2aWEgY3JlYXRlUmVjb3JkKCksCiAgICAgLy8gb3IgcmVsZWFzZSBpdCB3aXRoIHJlbGVhc2VJbnB1dCgpLgpAQCAtMjQ3LDggKzI0Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKTsKIAotICAgIHN0YXRpYyBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnNpbGVuY2VkKTsKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAgICAgc3RhdGljIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAgICAgc3RhdGljIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKQEAgLTMyNywxMCArMzI1LDE0IEBACiAKICAgICBzdGF0aWMgc3RhdHVzX3QgcmVnaXN0ZXJQb2xpY3lNaXhlcyhjb25zdCBWZWN0b3I8QXVkaW9NaXg+JiBtaXhlcywgYm9vbCByZWdpc3RyYXRpb24pOwogCisgICAgc3RhdGljIHN0YXR1c190IHNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLCBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpOworCisgICAgc3RhdGljIHN0YXR1c190IHJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkKTsKKwogICAgIHN0YXRpYyBzdGF0dXNfdCBzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKTsKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRNYXN0ZXJNb25vKGJvb2wgbW9ubyk7CiAgICAgc3RhdGljIHN0YXR1c190IGdldE1hc3Rlck1vbm8oYm9vbCAqbW9ubyk7CkBAIC0zNDksNiArMzUxLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcG9ydGVkKTsKICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0LCBib29sIGVuYWJsZWQpOwogCisgICAgc3RhdGljIHN0YXR1c190IHNldEFzc2lzdGFudFVpZCh1aWRfdCB1aWQpOworICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRBMTF5U2VydmljZXNVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgdWlkcyk7CisKKyAgICBzdGF0aWMgYm9vbCAgICAgaXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpOworCiAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAgICAgY2xhc3MgQXVkaW9Qb3J0Q2FsbGJhY2sgOiBwdWJsaWMgUmVmQmFzZQpAQCAtNDUwLDkgKzQ1NywxMyBAQAogICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpOwogCiAgICAgcHJpdmF0ZToKICAgICAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVGltZXN0YW1wLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVGltZXN0YW1wLmgKaW5kZXggNDk4ZGU4ZS4uZTU5MjVkZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1RpbWVzdGFtcC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UaW1lc3RhbXAuaApAQCAtMTM1LDggKzEzNSwyMyBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCisgICAgZG91YmxlIGdldE91dHB1dFNlcnZlckxhdGVuY3lNcyh1aW50MzJfdCBzYW1wbGVSYXRlKSBjb25zdCB7CisgICAgICAgIHJldHVybiBnZXRMYXRlbmN5TXMoc2FtcGxlUmF0ZSwgTE9DQVRJT05fU0VSVkVSLCBMT0NBVElPTl9LRVJORUwpOworICAgIH0KKworICAgIGRvdWJsZSBnZXRMYXRlbmN5TXModWludDMyX3Qgc2FtcGxlUmF0ZSwgTG9jYXRpb24gbG9jYXRpb24xLCBMb2NhdGlvbiBsb2NhdGlvbjIpIGNvbnN0IHsKKyAgICAgICAgaWYgKHNhbXBsZVJhdGUgPiAwICYmIG1UaW1lTnNbbG9jYXRpb24xXSA+IDAgJiYgbVRpbWVOc1tsb2NhdGlvbjJdID4gMCkgeworICAgICAgICAgICAgY29uc3QgaW50NjRfdCBmcmFtZURpZmZlcmVuY2UgPQorICAgICAgICAgICAgICAgICAgICBtUG9zaXRpb25bbG9jYXRpb24xXSAtIG1Qb3NpdGlvbltsb2NhdGlvbjJdOworICAgICAgICAgICAgY29uc3QgaW50NjRfdCB0aW1lRGlmZmVyZW5jZU5zID0KKyAgICAgICAgICAgICAgICAgICAgbVRpbWVOc1tsb2NhdGlvbjFdIC0gbVRpbWVOc1tsb2NhdGlvbjJdOworICAgICAgICAgICAgcmV0dXJuICgoZG91YmxlKWZyYW1lRGlmZmVyZW5jZSAqIDFlOSAvIHNhbXBsZVJhdGUgLSB0aW1lRGlmZmVyZW5jZU5zKSAqIDFlLTY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDAuOworICAgIH0KKwogICAgIC8vIGNvbnZlcnQgZmllbGRzIHRvIGEgcHJpbnRhYmxlIHN0cmluZwotICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgewogICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKIAogICAgICAgICBzcyA8PCAiQk9PVFRJTUUgb2Zmc2V0ICIgPDwgbVRpbWViYXNlT2Zmc2V0W1RJTUVCQVNFX0JPT1RUSU1FXSA8PCAiXG4iOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAppbmRleCA1OWM2ZjRjLi43ZmRmN2NjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaApAQCAtNzQsNiArNzQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIG1hcHBpbmcgZnJvbSBmcmFtZSBwb3NpdGlvbiB0byBwcmVzZW50YXRpb24gdGltZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlZSBBdWRpb1RpbWVzdGFtcCBmb3IgdGhlIGluZm9ybWF0aW9uIGluY2x1ZGVkIHdpdGggZXZlbnQuCiAjZW5kaWYKKyAgICAgICAgRVZFTlRfQ0FOX1dSSVRFX01PUkVfREFUQSA9IDksLy8gTm90aWZpY2F0aW9uIHRoYXQgbW9yZSBkYXRhIGNhbiBiZSBnaXZlbiBieSB3cml0ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGV2ZW50IG9ubHkgb2NjdXJzIGZvciBUUkFOU0ZFUl9TWU5DX05PVElGX0NBTExCQUNLLgogICAgIH07CiAKICAgICAvKiBDbGllbnQgc2hvdWxkIGRlY2xhcmUgYSBCdWZmZXIgYW5kIHBhc3MgdGhlIGFkZHJlc3MgdG8gb2J0YWluQnVmZmVyKCkKQEAgLTE0NSw2ICsxNDcsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSk7CiAKKyAgICAvKiBDaGVjayBpZiBkaXJlY3QgcGxheWJhY2sgaXMgcG9zc2libGUgZm9yIHRoZSBnaXZlbiBhdWRpbyBjb25maWd1cmF0aW9uIGFuZCBhdHRyaWJ1dGVzLgorICAgICAqIFJldHVybiB0cnVlIGlmIG91dHB1dCBpcyBwb3NzaWJsZSBmb3IgdGhlIGdpdmVuIHBhcmFtZXRlcnMuIE90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgorICAgICAqLworICAgIHN0YXRpYyBib29sIGlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QmIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMpOworCiAgICAgLyogSG93IGRhdGEgaXMgdHJhbnNmZXJyZWQgdG8gQXVkaW9UcmFjawogICAgICAqLwogICAgIGVudW0gdHJhbnNmZXJfdHlwZSB7CkBAIC0xNTMsNiArMTYxLDcgQEAKICAgICAgICAgVFJBTlNGRVJfT0JUQUlOLCAgICAvLyBjYWxsIG9idGFpbkJ1ZmZlcigpIGFuZCByZWxlYXNlQnVmZmVyKCkKICAgICAgICAgVFJBTlNGRVJfU1lOQywgICAgICAvLyBzeW5jaHJvbm91cyB3cml0ZSgpCiAgICAgICAgIFRSQU5TRkVSX1NIQVJFRCwgICAgLy8gc2hhcmVkIG1lbW9yeQorICAgICAgICBUUkFOU0ZFUl9TWU5DX05PVElGX0NBTExCQUNLLCAvLyBzeW5jaHJvbm91cyB3cml0ZSgpLCBub3RpZiBFVkVOVF9DQU5fV1JJVEVfTU9SRV9EQVRBCiAgICAgfTsKIAogICAgIC8qIENvbnN0cnVjdHMgYW4gdW5pbml0aWFsaXplZCBBdWRpb1RyYWNrLiBObyBjb25uZWN0aW9uIHdpdGgKQEAgLTI5NSw2ICszMDQsOCBAQAogICAgICAqIFBhcmFtZXRlcnMgbm90IGxpc3RlZCBpbiB0aGUgQXVkaW9UcmFjayBjb25zdHJ1Y3RvcnMgYWJvdmU6CiAgICAgICoKICAgICAgKiB0aHJlYWRDYW5DYWxsSmF2YTogIFdoZXRoZXIgY2FsbGJhY2tzIGFyZSBtYWRlIGZyb20gYW4gYXR0YWNoZWQgdGhyZWFkIGFuZCB0aHVzIGNhbiBjYWxsIEpOSS4KKyAgICAgKiAgICAgIE9ubHkgc2V0IHRvIHRydWUgd2hlbiBBdWRpb1RyYWNrIG9iamVjdCBpcyB1c2VkIGZvciBhIGphdmEgYW5kcm9pZC5tZWRpYS5BdWRpb1RyYWNrCisgICAgICogICAgICBpbiBpdHMgSk5JIGNvZGUuCiAgICAgICoKICAgICAgKiBJbnRlcm5hbCBzdGF0ZSBwb3N0IGNvbmRpdGlvbjoKICAgICAgKiAgICAgIChtU3RyZWFtVHlwZSA9PSBBVURJT19TVFJFQU1fREVGQVVMVCkgaW1wbGllcyB0aGlzIEF1ZGlvVHJhY2sgaGFzIHZhbGlkIGF0dHJpYnV0ZXMKQEAgLTkwNyw3ICs5MTgsMTQgQEAKICAgICAgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG1TdGF0ZSA9PSBTVEFURV9BQ1RJVkUgfHwgbVN0YXRlID09IFNUQVRFX1NUT1BQSU5HOwogICAgICAgICAgICAgfQotcHJvdGVjdGVkOgorCisgICAgLyogR2V0IHRoZSB1bmlxdWUgcG9ydCBJRCBhc3NpZ25lZCB0byB0aGlzIEF1ZGlvVHJhY2sgaW5zdGFuY2UgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIuCisgICAgICogVGhlIElEIGlzIHVuaXF1ZSBhY3Jvc3MgYWxsIGF1ZGlvc2VydmVyIGNsaWVudHMgYW5kIGNhbiBjaGFuZ2UgZHVyaW5nIHRoZSBsaWZlIGN5Y2xlCisgICAgICogb2YgYSBnaXZlbiBBdWRpb1RyYWNrIGluc3RhbmNlIGlmIHRoZSBjb25uZWN0aW9uIHRvIGF1ZGlvc2VydmVyIGlzIHJlc3RvcmVkLgorICAgICAqLworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRQb3J0SWQoKSBjb25zdCB7IHJldHVybiBtUG9ydElkOyB9OworCisgcHJvdGVjdGVkOgogICAgIC8qIGNvcHlpbmcgYXVkaW8gdHJhY2tzIGlzIG5vdCBhbGxvd2VkICovCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RyYWNrKGNvbnN0IEF1ZGlvVHJhY2smIG90aGVyKTsKICAgICAgICAgICAgIEF1ZGlvVHJhY2smIG9wZXJhdG9yID0gKGNvbnN0IEF1ZGlvVHJhY2smIG90aGVyKTsKQEAgLTEwNTgsNiArMTA3NiwxOSBAQAogICAgICAgICBTVEFURV9TVE9QUElORywKICAgICB9ICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGU7CiAKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnN0YXRlVG9TdHJpbmcoU3RhdGUgc3RhdGUpCisgICAgeworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgIGNhc2UgU1RBVEVfQUNUSVZFOiAgICAgICAgICByZXR1cm4gIlNUQVRFX0FDVElWRSI7CisgICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRDogICAgICAgICByZXR1cm4gIlNUQVRFX1NUT1BQRUQiOworICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDogICAgICAgICAgcmV0dXJuICJTVEFURV9QQVVTRUQiOworICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRF9TVE9QUElORzogcmV0dXJuICJTVEFURV9QQVVTRURfU1RPUFBJTkciOworICAgICAgICBjYXNlIFNUQVRFX0ZMVVNIRUQ6ICAgICAgICAgcmV0dXJuICJTVEFURV9GTFVTSEVEIjsKKyAgICAgICAgY2FzZSBTVEFURV9TVE9QUElORzogICAgICAgIHJldHVybiAiU1RBVEVfU1RPUFBJTkciOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJVTktOT1dOIjsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIGZvciBjbGllbnQgY2FsbGJhY2sgaGFuZGxlcgogICAgIGNhbGxiYWNrX3QgICAgICAgICAgICAgIG1DYmY7ICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrIGhhbmRsZXIgZm9yIGV2ZW50cywgb3IgTlVMTAogICAgIHZvaWQqICAgICAgICAgICAgICAgICAgIG1Vc2VyRGF0YTsKQEAgLTExNDgsNiArMTE3OSw3IEBACiAKICAgICBhdWRpb19zZXNzaW9uX3QgICAgICAgICBtU2Vzc2lvbklkOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1BdXhFZmZlY3RJZDsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICBtUG9ydElkOyAgICAgICAgICAgICAgICAgICAgLy8gSWQgZnJvbSBBdWRpbyBQb2xpY3kgTWFuYWdlcgogCiAgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgbUxvY2s7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKaW5kZXggZTZiZjcyZi4uYTM0YjIwNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKQEAgLTE0Niw2ICsxNDYsNyBAQAogICAgICAgICAgICAgYWZTYW1wbGVSYXRlID0gcGFyY2VsLT5yZWFkSW50NjQoKTsKICAgICAgICAgICAgIGFmTGF0ZW5jeU1zID0gcGFyY2VsLT5yZWFkSW50MzIoKTsKICAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+cmVhZCgmb3V0cHV0SWQsIHNpemVvZihhdWRpb19pb19oYW5kbGVfdCkpOworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT5yZWFkKCZwb3J0SWQsIHNpemVvZihhdWRpb19wb3J0X2hhbmRsZV90KSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIApAQCAtMTYzLDYgKzE2NCw3IEBACiAgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50NjQoYWZTYW1wbGVSYXRlKTsKICAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQzMihhZkxhdGVuY3lNcyk7CiAgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZvdXRwdXRJZCwgc2l6ZW9mKGF1ZGlvX2lvX2hhbmRsZV90KSk7CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZwb3J0SWQsIHNpemVvZihhdWRpb19wb3J0X2hhbmRsZV90KSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIApAQCAtMTc5LDYgKzE4MSw3IEBACiAgICAgICAgIHVpbnQzMl90IGFmU2FtcGxlUmF0ZTsKICAgICAgICAgdWludDMyX3QgYWZMYXRlbmN5TXM7CiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dElkOworICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZDsKICAgICB9OwogCiAgICAgLyogQ3JlYXRlUmVjb3JkSW5wdXQgY29udGFpbnMgYWxsIGlucHV0IGFyZ3VtZW50cyBzZW50IGJ5IEF1ZGlvUmVjb3JkIHRvIEF1ZGlvRmxpbmdlcgpAQCAtMjcxLDYgKzI3NCw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT5yZWFkKCZwb3J0SWQsIHNpemVvZihhdWRpb19wb3J0X2hhbmRsZV90KSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIApAQCAtMjk3LDYgKzMwMSw3IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQzMigwKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJnBvcnRJZCwgc2l6ZW9mKGF1ZGlvX3BvcnRfaGFuZGxlX3QpKTsKIAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CkBAIC0zMTMsNiArMzE4LDcgQEAKICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXRJZDsKICAgICAgICAgc3A8SU1lbW9yeT4gY2JsazsKICAgICAgICAgc3A8SU1lbW9yeT4gYnVmZmVyczsKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQ7CiAgICAgfTsKIAogICAgIC8vIGludmFyaWFudCBvbiBleGl0IGZvciBhbGwgQVBJcyB0aGF0IHJldHVybiBhbiBzcDw+OgpAQCAtNDI4LDcgKzQzNCw5IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeUVmZmVjdCh1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIGNvbnN0ID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RWZmZWN0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VVVJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgY29uc3QgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICpwVHlwZVVVSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZWZlcnJlZFR5cGVGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgY29uc3QgPSAwOwogCiAgICAgdmlydHVhbCBzcDxJRWZmZWN0PiBjcmVhdGVFZmZlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzYywKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKaW5kZXggYzM4NzZhZi4uZmI0ZmU5MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKQEAgLTIwLDE1ICsyMCwxNCBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgotCiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaD4KLQogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNjYsMTUgKzY1LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOwotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgIGdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKQEAgLTg1LDggKzc4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzaWxlbmNlZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKQEAgLTExNSwxMCArMTA3LDI4IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU3RyZWFtRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdXNhZ2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKSA9IDA7CiAgICAvLyBDaGVjayBpZiBvZmZsb2FkIGlzIHBvc3NpYmxlIGZvciBnaXZlbiBmb3JtYXQsIHN0cmVhbSB0eXBlLCBzYW1wbGUgcmF0ZSwKICAgICAvLyBiaXQgcmF0ZSwgZHVyYXRpb24sIHZpZGVvIGFuZCBzdHJlYW1pbmcgb3Igb2ZmbG9hZCBwcm9wZXJ0eSBpcyBlbmFibGVkCiAgICAgdmlydHVhbCBib29sIGlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgaW5mbykgPSAwOwogCisgICAgLy8gQ2hlY2sgaWYgZGlyZWN0IHBsYXliYWNrIGlzIHBvc3NpYmxlIGZvciBnaXZlbiBmb3JtYXQsIHNhbXBsZSByYXRlLCBjaGFubmVsIG1hc2sgYW5kIGZsYWdzLgorICAgIHZpcnR1YWwgYm9vbCBpc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcykgPSAwOworCiAgICAgLyogTGlzdCBhdmFpbGFibGUgYXVkaW8gcG9ydHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLApAQCAtMTU3LDEwICsxNjcsMTUgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJQb2xpY3lNaXhlcyhjb25zdCBWZWN0b3I8QXVkaW9NaXg+JiBtaXhlcywgYm9vbCByZWdpc3RyYXRpb24pID0gMDsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykKKyAgICAgICAgICAgID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpID0gMDsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck1vbm8oYm9vbCBtb25vKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNb25vKGJvb2wgKm1vbm8pID0gMDsKQEAgLTE3Miw2ICsxODcsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzdXJyb3VuZEZvcm1hdHNFbmFibGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVwb3J0ZWQpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwgYm9vbCBlbmFibGVkKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEFzc2lzdGFudFVpZCh1aWRfdCB1aWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEExMXlTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiB1aWRzKSA9IDA7CisKKyAgICB2aXJ0dWFsIGJvb2wgICAgIGlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKSA9IDA7CiB9OwogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmgKaW5kZXggZTBkMjQ5NS4uYjNjMDM4MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmgKQEAgLTE3LDEwICsxNywxMiBAQAogI2lmbmRlZiBBTkRST0lEX0lBVURJT1BPTElDWVNFUlZJQ0VDTElFTlRfSAogI2RlZmluZSBBTkRST0lEX0lBVURJT1BPTElDWVNFUlZJQ0VDTElFTlRfSAogCisjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTMwLDYgKzMyLDggQEAKICAgICB1aWRfdCB1aWQ7CiAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb247CiAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydF9pZDsKKyAgICBib29sIHNpbGVuY2VkOwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgcmVjb3JkX2NsaWVudF9pbmZvIHJlY29yZF9jbGllbnRfaW5mb190OwpAQCAtNTEsOCArNTUsMTEgQEAKICAgICB2aXJ0dWFsIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKSA9IDA7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpID0gMDsKIH07CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9UcmFjay5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9UcmFjay5oCmluZGV4IDk0YWZlM2MuLjA2ZTc4NmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvVHJhY2suaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1RyYWNrLmgKQEAgLTcwLDYgKzcwLDkgQEAKICAgICAvKiBTZW5kIHBhcmFtZXRlcnMgdG8gdGhlIGF1ZGlvIGhhcmR3YXJlICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpID0gMDsKIAorICAgIC8qIFNlbGVjdHMgdGhlIHByZXNlbnRhdGlvbiAoaWYgYXZhaWxhYmxlKSAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCkgPSAwOworCiAgICAgLyogUmV0dXJuIE5PX0VSUk9SIGlmIHRpbWVzdGFtcCBpcyB2YWxpZC4gIHRpbWVzdGFtcCBpcyB1bmRlZmluZWQgb3RoZXJ3aXNlLiAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApID0gMDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc0YjQzNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKLSAgICBuYW1lOiAibGliYXVkaW9oYWxAMi4wIiwKLQotICAgIHNyY3M6IFsKLSAgICAgICAgIkRldmljZUhhbExvY2FsLmNwcCIsCi0gICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAiLAotICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAiLAotICAgICAgICAiU3RyZWFtSGFsTG9jYWwuY3BwIiwKLQotICAgICAgICAiQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwIiwKLSAgICAgICAgIkRldmljZUhhbEhpZGwuY3BwIiwKLSAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAiLAotICAgICAgICAiRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAiLAotICAgICAgICAiRWZmZWN0SGFsSGlkbC5jcHAiLAotICAgICAgICAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcCIsCi0gICAgICAgICJTdHJlYW1IYWxIaWRsLmNwcCIsCi0gICAgXSwKLQotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2FsbCIsCi0gICAgICAgICItV2Vycm9yIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJhdWRpb2hhbF9kZWF0aGhhbmRsZXIiLAotICAgICAgICAibGliYXVkaW91dGlscyIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmhhcmR3YXJlIiwKLSAgICAgICAgImxpYmJhc2UiLAotICAgICAgICAibGliZm1xIiwKLSAgICAgICAgImxpYmh3YmluZGVyIiwKLSAgICAgICAgImxpYmhpZGxiYXNlIiwKLSAgICAgICAgImxpYmhpZGxtZW1vcnkiLAotICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvQDIuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkAyLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25AMi4wLXV0aWwiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RAMi4wIiwKLSAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKLSAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKLSAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCi0gICAgICAgICJsaWJtZWRpYXV0aWxzIiwKLSAgICBdLAotICAgIGhlYWRlcl9saWJzOiBbCi0gICAgICAgICJsaWJhdWRpb2hhbF9oZWFkZXJzIgotICAgIF0sCi0KLSAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCi0gICAgICAgICJsaWJmbXEiLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYwYmY4Yi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNkZWZpbmUgTE9HX1RBRyAiSGFsSGlkbCIKLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlJlc3VsdDsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBzdGF0aWMKLXN0YXR1c190IENvbnZlcnNpb25IZWxwZXJIaWRsOjprZXlzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrZXlzLCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gKmhpZGxLZXlzKSB7Ci0gICAgQXVkaW9QYXJhbWV0ZXIgaGFsS2V5cyhrZXlzKTsKLSAgICBpZiAoaGFsS2V5cy5zaXplKCkgPT0gMCkgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICBoaWRsS2V5cy0+cmVzaXplKGhhbEtleXMuc2l6ZSgpKTsKLSAgICAvL0ZJWE1FOiAga2V5U3RyZWFtU3VwcG9ydGVkQ2hhbm5lbHMgYW5kIGtleVN0cmVhbVN1cHBvcnRlZFNhbXBsaW5nUmF0ZXMgY29tZSB3aXRoIGEKLSAgICAvLyAia2V5Rm9ybWF0PTx2YWx1ZT4iIHBhaXIuIFdlIG5lZWQgdG8gdHJhbnNmb3JtIGl0IGludG8gYSBzaW5nbGUga2V5IHN0cmluZyBzbyB0aGF0IGl0IGlzCi0gICAgLy8gY2FycmllZCBvdmVyIHRvIHRoZSBsZWdhY3kgSEFMIHZpYSBISURMLgotICAgIFN0cmluZzggdmFsdWU7Ci0gICAgYm9vbCBrZWVwRm9ybWF0VmFsdWUgPSBoYWxLZXlzLnNpemUoKSA9PSAyICYmCi0gICAgICAgICAoaGFsS2V5cy5nZXQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkQ2hhbm5lbHMpLCB2YWx1ZSkgPT0gTk9fRVJST1IgfHwKLSAgICAgICAgIGhhbEtleXMuZ2V0KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZFNhbXBsaW5nUmF0ZXMpLCB2YWx1ZSkgPT0gTk9fRVJST1IpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoYWxLZXlzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFN0cmluZzgga2V5OwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBoYWxLZXlzLmdldEF0KGksIGtleSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIGlmIChrZWVwRm9ybWF0VmFsdWUgJiYga2V5ID09IEF1ZGlvUGFyYW1ldGVyOjprZXlGb3JtYXQpIHsKLSAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIGZvcm1hdFBhcmFtOwotICAgICAgICAgICAgaGFsS2V5cy5nZXRBdChpLCBrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIGZvcm1hdFBhcmFtLmFkZChrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIGtleSA9IGZvcm1hdFBhcmFtLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgKCpoaWRsS2V5cylbaV0gPSBrZXkuc3RyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotLy8gc3RhdGljCi1zdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6cGFyYW1ldGVyc0Zyb21IYWwoCi0gICAgICAgIGNvbnN0IFN0cmluZzgmIGt2UGFpcnMsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiAqaGlkbFBhcmFtcykgewotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtcyhrdlBhaXJzKTsKLSAgICBpZiAocGFyYW1zLnNpemUoKSA9PSAwKSByZXR1cm4gQkFEX1ZBTFVFOwotICAgIGhpZGxQYXJhbXMtPnJlc2l6ZShwYXJhbXMuc2l6ZSgpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhcmFtcy5zaXplKCk7ICsraSkgewotICAgICAgICBTdHJpbmc4IGtleSwgdmFsdWU7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtcy5nZXRBdChpLCBrZXksIHZhbHVlKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgKCpoaWRsUGFyYW1zKVtpXS5rZXkgPSBrZXkuc3RyaW5nKCk7Ci0gICAgICAgICgqaGlkbFBhcmFtcylbaV0udmFsdWUgPSB2YWx1ZS5zdHJpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ29udmVyc2lvbkhlbHBlckhpZGw6OnBhcmFtZXRlcnNUb0hhbCgKLSAgICAgICAgY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKLSAgICBBdWRpb1BhcmFtZXRlciBwYXJhbXM7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHBhcmFtcy5hZGQoU3RyaW5nOChwYXJhbWV0ZXJzW2ldLmtleS5jX3N0cigpKSwgU3RyaW5nOChwYXJhbWV0ZXJzW2ldLnZhbHVlLmNfc3RyKCkpKTsKLSAgICB9Ci0gICAgdmFsdWVzLT5zZXRUbyhwYXJhbXMudG9TdHJpbmcoKSk7Ci19Ci0KLUNvbnZlcnNpb25IZWxwZXJIaWRsOjpDb252ZXJzaW9uSGVscGVySGlkbChjb25zdCBjaGFyKiBjbGFzc05hbWUpCi0gICAgICAgIDogbUNsYXNzTmFtZShjbGFzc05hbWUpIHsKLX0KLQotLy8gc3RhdGljCi1zdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6YW5hbHl6ZVJlc3VsdChjb25zdCBSZXN1bHQmIHJlc3VsdCkgewotICAgIHN3aXRjaCAocmVzdWx0KSB7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpPSzogcmV0dXJuIE9LOwotICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFM6IHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX1NUQVRFOiByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwotICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOiByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9TVVBQT1JURUQ6IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotfQotCi12b2lkIENvbnZlcnNpb25IZWxwZXJIaWRsOjplbWl0RXJyb3IoY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uKSB7Ci0gICAgQUxPR0UoIiVzICVwICVzOiAlcyAoZnJvbSBycGMpIiwgbUNsYXNzTmFtZSwgdGhpcywgZnVuY05hbWUsIGRlc2NyaXB0aW9uKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9Db252ZXJzaW9uSGVscGVySGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNTZmMzcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6UGFyYW1ldGVyVmFsdWU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIENvbnZlcnNpb25IZWxwZXJIaWRsIHsKLSAgcHJvdGVjdGVkOgotICAgIHN0YXRpYyBzdGF0dXNfdCBrZXlzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrZXlzLCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gKmhpZGxLZXlzKTsKLSAgICBzdGF0aWMgc3RhdHVzX3QgcGFyYW1ldGVyc0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga3ZQYWlycywgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+ICpoaWRsUGFyYW1zKTsKLSAgICBzdGF0aWMgdm9pZCBwYXJhbWV0ZXJzVG9IYWwoY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzLCBTdHJpbmc4ICp2YWx1ZXMpOwotCi0gICAgQ29udmVyc2lvbkhlbHBlckhpZGwoY29uc3QgY2hhciogY2xhc3NOYW1lKTsKLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFQ+Ci0gICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFI+JiByZXQsIFQgKnJldHZhbCkgewotICAgICAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICAgICAgLy8gVGhpcyB3YXkgaXQgYWxzbyB3b3JrcyBmb3IgZW51bSBjbGFzcyB0byB1bnNjb3BlZCBlbnVtIGNvbnZlcnNpb24uCi0gICAgICAgICAgICAqcmV0dmFsID0gc3RhdGljX2Nhc3Q8VD4oc3RhdGljX2Nhc3Q8Uj4ocmV0KSk7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oZnVuY05hbWUsIHJldCk7Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48VD4mIHJldCkgewotICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgICAgIGVtaXRFcnJvcihmdW5jTmFtZSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBPSyA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQ+JiByZXQpIHsKLSAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgICAgICBlbWl0RXJyb3IoZnVuY05hbWUsIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybigKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48VD4mIHJldCwgaGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQgcmV0dmFsKSB7Ci0gICAgICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBjb25zdCBjaGFyKiBtQ2xhc3NOYW1lOwotCi0gICAgc3RhdGljIHN0YXR1c190IGFuYWx5emVSZXN1bHQoY29uc3QgaGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQmIHJlc3VsdCk7Ci0KLSAgICB2b2lkIGVtaXRFcnJvcihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgY2hhciogZGVzY3JpcHRpb24pOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfQ09OVkVSU0lPTl9IRUxQRVJfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOTlkNzAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSVByaW1hcnlEZXZpY2UuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgotI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0jaW5jbHVkZSAiSGlkbFV0aWxzLmgiCi0jaW5jbHVkZSAiU3RyZWFtSGFsSGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0NvbmZpZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvRGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9JbnB1dEZsYWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb091dHB1dEZsYWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb1BhdGNoSGFuZGxlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Qb3J0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Qb3J0Q29uZmlnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Nb2RlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Tb3VyY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpIaWRsVXRpbHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6RGV2aWNlQWRkcmVzczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJUHJpbWFyeURldmljZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpQYXJhbWV0ZXJWYWx1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLW5hbWVzcGFjZSB7Ci0KLXN0YXR1c190IGRldmljZUFkZHJlc3NGcm9tSGFsKAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBjb25zdCBjaGFyKiBoYWxBZGRyZXNzLCBEZXZpY2VBZGRyZXNzKiBhZGRyZXNzKSB7Ci0gICAgYWRkcmVzcy0+ZGV2aWNlID0gQXVkaW9EZXZpY2UoZGV2aWNlKTsKLQotICAgIGlmIChoYWxBZGRyZXNzID09IG51bGxwdHIgfHwgc3RybmxlbihoYWxBZGRyZXNzLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgY29uc3QgYm9vbCBpc0lucHV0ID0gKGRldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDA7Ci0gICAgaWYgKGlzSW5wdXQpIGRldmljZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKLSAgICBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSAhPSAwKQotICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCkgIT0gMCkpIHsKLSAgICAgICAgaW50IHN0YXR1cyA9IHNzY2FuZihoYWxBZGRyZXNzLAotICAgICAgICAgICAgICAgICIlaGhYOiVoaFg6JWhoWDolaGhYOiVoaFg6JWhoWCIsCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzBdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMV0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1syXSwKLSAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbM10sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1s0XSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzVdKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSA2ID8gT0sgOiBCQURfVkFMVUU7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfSVApICE9IDApCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0lQKSAhPSAwKSkgewotICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCi0gICAgICAgICAgICAgICAgIiVoaHUuJWhodS4laGh1LiVoaHUiLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMF0sICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMV0sCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFsyXSwgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFszXSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXMgPT0gNCA/IE9LIDogQkFEX1ZBTFVFOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9VU0IpKSAhPSAwCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0FMTF9VU0IpKSAhPSAwKSB7Ci0gICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKLSAgICAgICAgICAgICAgICAiY2FyZD0lZDtkZXZpY2U9JWQiLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmFsc2EuY2FyZCwgJmFkZHJlc3MtPmFkZHJlc3MuYWxzYS5kZXZpY2UpOwotICAgICAgICByZXR1cm4gc3RhdHVzID09IDIgPyBPSyA6IEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9CVVMpICE9IDApCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0JVUykgIT0gMCkpIHsKLSAgICAgICAgaWYgKGhhbEFkZHJlc3MgIT0gTlVMTCkgewotICAgICAgICAgICAgYWRkcmVzcy0+YnVzQWRkcmVzcyA9IGhhbEFkZHJlc3M7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSkgIT0gMAotICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSAhPSAwKSkgewotICAgICAgICBpZiAoaGFsQWRkcmVzcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBhZGRyZXNzLT5yU3VibWl4QWRkcmVzcyA9IGhhbEFkZHJlc3M7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotRGV2aWNlSGFsSGlkbDo6RGV2aWNlSGFsSGlkbChjb25zdCBzcDxJRGV2aWNlPiYgZGV2aWNlKQotICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJEZXZpY2UiKSwgbURldmljZShkZXZpY2UpLAotICAgICAgICAgIG1QcmltYXJ5RGV2aWNlKElQcmltYXJ5RGV2aWNlOjpjYXN0RnJvbShkZXZpY2UpKSB7Ci19Ci0KLURldmljZUhhbEhpZGw6On5EZXZpY2VIYWxIaWRsKCkgewotICAgIGlmIChtRGV2aWNlICE9IDApIHsKLSAgICAgICAgbURldmljZS5jbGVhcigpOwotICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCopIHsKLSAgICAvLyBPYnNvbGV0ZS4KLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmluaXRDaGVjaygpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiaW5pdENoZWNrIiwgbURldmljZS0+aW5pdENoZWNrKCkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRWb2ljZVZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1hc3RlclZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRNYXN0ZXJWb2x1bWUodm9sdW1lKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtUHJpbWFyeURldmljZS0+Z2V0TWFzdGVyVm9sdW1lKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBmbG9hdCB2KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnZvbHVtZSA9IHY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1hc3RlclZvbHVtZSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1vZGUiLCBtUHJpbWFyeURldmljZS0+c2V0TW9kZShBdWRpb01vZGUobW9kZSkpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1pY011dGUiLCBtRGV2aWNlLT5zZXRNaWNNdXRlKHN0YXRlKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1pY011dGUoYm9vbCAqc3RhdGUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNaWNNdXRlKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBib29sIG11dGUpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqc3RhdGUgPSBtdXRlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNaWNNdXRlIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyTXV0ZSIsIG1EZXZpY2UtPnNldE1hc3Rlck11dGUoc3RhdGUpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1hc3Rlck11dGUoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGJvb2wgbXV0ZSkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpzdGF0ZSA9IG11dGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1hc3Rlck11dGUiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBoaWRsUGFyYW1zOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtZXRlcnNGcm9tSGFsKGt2UGFpcnMsICZoaWRsUGFyYW1zKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRQYXJhbWV0ZXJzIiwgbURldmljZS0+c2V0UGFyYW1ldGVycyhoaWRsUGFyYW1zKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgdmFsdWVzLT5jbGVhcigpOwotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBoaWRsS2V5czsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBrZXlzRnJvbUhhbChrZXlzLCAmaGlkbEtleXMpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0UGFyYW1ldGVycygKLSAgICAgICAgICAgIGhpZGxLZXlzLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzVG9IYWwocGFyYW1ldGVycywgdmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UGFyYW1ldGVycyIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldElucHV0QnVmZmVyU2l6ZSgKLSAgICAgICAgICAgIGhpZGxDb25maWcsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IGJ1ZmZlclNpemUpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oYnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldElucHV0QnVmZmVyU2l6ZSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgRGV2aWNlQWRkcmVzcyBoaWRsRGV2aWNlOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZUFkZHJlc3NGcm9tSGFsKGRldmljZXMsIGFkZHJlc3MsICZoaWRsRGV2aWNlKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgICAgIGhhbmRsZSwKLSAgICAgICAgICAgIGhpZGxEZXZpY2UsCi0gICAgICAgICAgICBoaWRsQ29uZmlnLAotICAgICAgICAgICAgQXVkaW9PdXRwdXRGbGFnKGZsYWdzKSwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SVN0cmVhbU91dD4mIHJlc3VsdCwgY29uc3QgQXVkaW9Db25maWcmIHN1Z2dlc3RlZENvbmZpZykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpvdXRTdHJlYW0gPSBuZXcgU3RyZWFtT3V0SGFsSGlkbChyZXN1bHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnVG9IYWwoc3VnZ2VzdGVkQ29uZmlnLCBjb25maWcpOwotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oIm9wZW5PdXRwdXRTdHJlYW0iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6Om9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBEZXZpY2VBZGRyZXNzIGhpZGxEZXZpY2U7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2aWNlQWRkcmVzc0Zyb21IYWwoZGV2aWNlcywgYWRkcmVzcywgJmhpZGxEZXZpY2UpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgQXVkaW9Db25maWcgaGlkbENvbmZpZzsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5vcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICBoYW5kbGUsCi0gICAgICAgICAgICBoaWRsRGV2aWNlLAotICAgICAgICAgICAgaGlkbENvbmZpZywKLSAgICAgICAgICAgIEF1ZGlvSW5wdXRGbGFnKGZsYWdzKSwKLSAgICAgICAgICAgIEF1ZGlvU291cmNlKHNvdXJjZSksCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElTdHJlYW1Jbj4mIHJlc3VsdCwgY29uc3QgQXVkaW9Db25maWcmIHN1Z2dlc3RlZENvbmZpZykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICppblN0cmVhbSA9IG5ldyBTdHJlYW1JbkhhbEhpZGwocmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ1RvSGFsKHN1Z2dlc3RlZENvbmZpZywgY29uZmlnKTsKLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJvcGVuSW5wdXRTdHJlYW0iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcykgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdXBwb3J0c0F1ZGlvUGF0Y2hlcyIsIG1EZXZpY2UtPnN1cHBvcnRzQXVkaW9QYXRjaGVzKCksIHN1cHBvcnRzUGF0Y2hlcyk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmNyZWF0ZUF1ZGlvUGF0Y2goCi0gICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxBdWRpb1BvcnRDb25maWc+IGhpZGxTb3VyY2VzLCBoaWRsU2lua3M7Ci0gICAgSGlkbFV0aWxzOjphdWRpb1BvcnRDb25maWdzRnJvbUhhbChudW1fc291cmNlcywgc291cmNlcywgJmhpZGxTb3VyY2VzKTsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ3NGcm9tSGFsKG51bV9zaW5rcywgc2lua3MsICZoaWRsU2lua3MpOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goCi0gICAgICAgICAgICBoaWRsU291cmNlcywgaGlkbFNpbmtzLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBBdWRpb1BhdGNoSGFuZGxlIGhpZGxQYXRjaCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpwYXRjaCA9IHN0YXRpY19jYXN0PGF1ZGlvX3BhdGNoX2hhbmRsZV90PihoaWRsUGF0Y2gpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJjcmVhdGVBdWRpb1BhdGNoIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJyZWxlYXNlQXVkaW9QYXRjaCIsIG1EZXZpY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIEF1ZGlvUG9ydCBoaWRsUG9ydDsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydEZyb21IYWwoKnBvcnQsICZoaWRsUG9ydCk7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0QXVkaW9Qb3J0KAotICAgICAgICAgICAgaGlkbFBvcnQsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEF1ZGlvUG9ydCYgcCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0VG9IYWwocCwgcG9ydCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEF1ZGlvUG9ydCIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgQXVkaW9Qb3J0Q29uZmlnIGhpZGxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjphdWRpb1BvcnRDb25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0QXVkaW9Qb3J0Q29uZmlnIiwgbURldmljZS0+c2V0QXVkaW9Qb3J0Q29uZmlnKGhpZGxDb25maWcpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWljcm9waG9uZXMoCi0gICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzSW5mbyBfX3VudXNlZCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6ZHVtcChpbnQgZmQpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKLSAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmRlYnVnRHVtcChoaWRsSGFuZGxlKTsKLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZHVtcCIsIHJldCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzFjYjU5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JRGV2aWNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSVByaW1hcnlEZXZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJRGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklQcmltYXJ5RGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERldmljZUhhbEhpZGwgOiBwdWJsaWMgRGV2aWNlSGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKLXsKLSAgcHVibGljOgotICAgIC8vIFNldHMgdGhlIHZhbHVlIG9mICdkZXZpY2VzJyB0byBhIGJpdG1hc2sgb2YgMSBvciBtb3JlIHZhbHVlcyBvZiBhdWRpb19kZXZpY2VzX3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKTsKLQotICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIGhhcyBiZWVuIGluaXRpYWxpemVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7Ci0KLSAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBvZiBhIHZvaWNlIGNhbGwuIFJhbmdlIGlzIGJldHdlZW4gMC4wIGFuZCAxLjAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgZm9yIGFsbCBhdWRpbyBhY3Rpdml0aWVzIG90aGVyIHRoYW4gdm9pY2UgY2FsbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpOwotCi0gICAgLy8gR2V0IHRoZSBjdXJyZW50IG1hc3RlciB2b2x1bWUgdmFsdWUgZm9yIHRoZSBIQUwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgYXVkaW8gbW9kZSBjaGFuZ2VzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSk7Ci0KLSAgICAvLyBNdXRpbmcgY29udHJvbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY011dGUoYm9vbCBzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKTsKLQotICAgIC8vIFNldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7Ci0KLSAgICAvLyBHZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7Ci0KLSAgICAvLyBSZXR1cm5zIGF1ZGlvIGlucHV0IGJ1ZmZlciBzaXplIGFjY29yZGluZyB0byBwYXJhbWV0ZXJzIHBhc3NlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyU2l6ZShjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBzaXplX3QgKnNpemUpOwotCi0gICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCi0gICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pOwotCi0gICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKLSAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBjcmVhdGVBdWRpb1BhdGNoIGFuZCByZWxlYXNlQXVkaW9QYXRjaCBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpOwotCi0gICAgLy8gQ3JlYXRlcyBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaCgKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKTsKLQotICAgIC8vIFJlbGVhc2VzIGFuIGF1ZGlvIHBhdGNoLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpOwotCi0gICAgLy8gRmlsbHMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7Ci0KLSAgICAvLyBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKLQotICAgIC8vIExpc3QgbWljcm9waG9uZXMKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSGlkbDsKLSAgICBzcDxJRGV2aWNlPiBtRGV2aWNlOwotICAgIHNwPElQcmltYXJ5RGV2aWNlPiBtUHJpbWFyeURldmljZTsgIC8vIE51bGwgaWYgaXQncyBub3QgYSBwcmltYXJ5IGRldmljZS4KLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBEZXZpY2VIYWxIaWRsKGNvbnN0IHNwPElEZXZpY2U+JiBkZXZpY2UpOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIGRldmljZS4KLSAgICB2aXJ0dWFsIH5EZXZpY2VIYWxIaWRsKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbExvY2FsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMzYmY3OC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsTG9jYWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZUhhbExvY2FsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotRGV2aWNlSGFsTG9jYWw6OkRldmljZUhhbExvY2FsKGF1ZGlvX2h3X2RldmljZV90ICpkZXYpCi0gICAgICAgIDogbURldihkZXYpIHsKLX0KLQotRGV2aWNlSGFsTG9jYWw6On5EZXZpY2VIYWxMb2NhbCgpIHsKLSAgICBpbnQgc3RhdHVzID0gYXVkaW9faHdfZGV2aWNlX2Nsb3NlKG1EZXYpOwotICAgIEFMT0dXX0lGKHN0YXR1cywgIkVycm9yIGNsb3NpbmcgYXVkaW8gaHcgZGV2aWNlICVwOiAlcyIsIG1EZXYsIHN0cmVycm9yKC1zdGF0dXMpKTsKLSAgICBtRGV2ID0gMDsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpIHsKLSAgICBpZiAobURldi0+Z2V0X3N1cHBvcnRlZF9kZXZpY2VzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAqZGV2aWNlcyA9IG1EZXYtPmdldF9zdXBwb3J0ZWRfZGV2aWNlcyhtRGV2KTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjppbml0Q2hlY2soKSB7Ci0gICAgcmV0dXJuIG1EZXYtPmluaXRfY2hlY2sobURldik7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICByZXR1cm4gbURldi0+c2V0X3ZvaWNlX3ZvbHVtZShtRGV2LCB2b2x1bWUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgIGlmIChtRGV2LT5zZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSkgewotICAgIGlmIChtRGV2LT5nZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKSB7Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9tb2RlKG1EZXYsIG1vZGUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKSB7Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKLSAgICBpZiAobURldi0+c2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbURldi0+c2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpIHsKLSAgICBpZiAobURldi0+Z2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbURldi0+Z2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIHJldHVybiBtRGV2LT5zZXRfcGFyYW1ldGVycyhtRGV2LCBrdlBhaXJzLnN0cmluZygpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgY2hhciAqaGFsVmFsdWVzID0gbURldi0+Z2V0X3BhcmFtZXRlcnMobURldiwga2V5cy5zdHJpbmcoKSk7Ci0gICAgaWYgKGhhbFZhbHVlcyAhPSBOVUxMKSB7Ci0gICAgICAgIHZhbHVlcy0+c2V0VG8oaGFsVmFsdWVzKTsKLSAgICAgICAgZnJlZShoYWxWYWx1ZXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhbHVlcy0+Y2xlYXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gbURldi0+Z2V0X2lucHV0X2J1ZmZlcl9zaXplKG1EZXYsIGNvbmZpZyk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7Ci0gICAgYXVkaW9fc3RyZWFtX291dF90ICpoYWxTdHJlYW07Ci0gICAgQUxPR1YoIm9wZW5fb3V0cHV0X3N0cmVhbSBoYW5kbGU6ICVkIGRldmljZXM6ICV4IGZsYWdzOiAlI3giCi0gICAgICAgICAgICAic3JhdGU6ICVkIGZvcm1hdCAlI3ggY2hhbm5lbHMgJXggYWRkcmVzcyAlcyIsCi0gICAgICAgICAgICBoYW5kbGUsIGRldmljZXMsIGZsYWdzLAotICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgYWRkcmVzcyk7Ci0gICAgaW50IG9wZW5SZXN1dCA9IG1EZXYtPm9wZW5fb3V0cHV0X3N0cmVhbSgKLSAgICAgICAgICAgIG1EZXYsIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsIGNvbmZpZywgJmhhbFN0cmVhbSwgYWRkcmVzcyk7Ci0gICAgaWYgKG9wZW5SZXN1dCA9PSBPSykgewotICAgICAgICAqb3V0U3RyZWFtID0gbmV3IFN0cmVhbU91dEhhbExvY2FsKGhhbFN0cmVhbSwgdGhpcyk7Ci0gICAgfQotICAgIEFMT0dWKCJvcGVuX291dHB1dF9zdHJlYW0gc3RhdHVzICVkIHN0cmVhbSAlcCIsIG9wZW5SZXN1dCwgaGFsU3RyZWFtKTsKLSAgICByZXR1cm4gb3BlblJlc3V0OwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3BlbklucHV0U3RyZWFtKAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSkgewotICAgIGF1ZGlvX3N0cmVhbV9pbl90ICpoYWxTdHJlYW07Ci0gICAgQUxPR1YoIm9wZW5faW5wdXRfc3RyZWFtIGhhbmRsZTogJWQgZGV2aWNlczogJXggZmxhZ3M6ICUjeCAiCi0gICAgICAgICAgICAic3JhdGU6ICVkIGZvcm1hdCAlI3ggY2hhbm5lbHMgJXggYWRkcmVzcyAlcyBzb3VyY2UgJWQiLAotICAgICAgICAgICAgaGFuZGxlLCBkZXZpY2VzLCBmbGFncywKLSAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywKLSAgICAgICAgICAgIGFkZHJlc3MsIHNvdXJjZSk7Ci0gICAgaW50IG9wZW5SZXN1bHQgPSBtRGV2LT5vcGVuX2lucHV0X3N0cmVhbSgKLSAgICAgICAgICAgIG1EZXYsIGhhbmRsZSwgZGV2aWNlcywgY29uZmlnLCAmaGFsU3RyZWFtLCBmbGFncywgYWRkcmVzcywgc291cmNlKTsKLSAgICBpZiAob3BlblJlc3VsdCA9PSBPSykgewotICAgICAgICAqaW5TdHJlYW0gPSBuZXcgU3RyZWFtSW5IYWxMb2NhbChoYWxTdHJlYW0sIHRoaXMpOwotICAgIH0KLSAgICBBTE9HVigib3Blbl9pbnB1dF9zdHJlYW0gc3RhdHVzICVkIHN0cmVhbSAlcCIsIG9wZW5SZXN1bHQsIGluU3RyZWFtKTsKLSAgICByZXR1cm4gb3BlblJlc3VsdDsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcykgewotICAgICpzdXBwb3J0c1BhdGNoZXMgPSB2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpjcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKSB7Ci0gICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7Ci0gICAgICAgIHJldHVybiBtRGV2LT5jcmVhdGVfYXVkaW9fcGF0Y2goCi0gICAgICAgICAgICAgICAgbURldiwgbnVtX3NvdXJjZXMsIHNvdXJjZXMsIG51bV9zaW5rcywgc2lua3MsIHBhdGNoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpIHsKLSAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKLSAgICAgICAgcmV0dXJuIG1EZXYtPnJlbGVhc2VfYXVkaW9fcGF0Y2gobURldiwgcGF0Y2gpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIHsKLSAgICByZXR1cm4gbURldi0+Z2V0X2F1ZGlvX3BvcnQobURldiwgcG9ydCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKLSAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApCi0gICAgICAgIHJldHVybiBtRGV2LT5zZXRfYXVkaW9fcG9ydF9jb25maWcobURldiwgY29uZmlnKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1pY3JvcGhvbmVzKAotICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyBfX3VudXNlZCkgewotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmR1bXAoaW50IGZkKSB7Ci0gICAgcmV0dXJuIG1EZXYtPmR1bXAobURldiwgZmQpOwotfQotCi12b2lkIERldmljZUhhbExvY2FsOjpjbG9zZU91dHB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCAqc3RyZWFtX291dCkgewotICAgIG1EZXYtPmNsb3NlX291dHB1dF9zdHJlYW0obURldiwgc3RyZWFtX291dCk7Ci19Ci0KLXZvaWQgRGV2aWNlSGFsTG9jYWw6OmNsb3NlSW5wdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiAqc3RyZWFtX2luKSB7Ci0gICAgbURldi0+Y2xvc2VfaW5wdXRfc3RyZWFtKG1EZXYsIHN0cmVhbV9pbik7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbExvY2FsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYzIwMWEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbExvY2FsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMX0gKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGV2aWNlSGFsTG9jYWwgOiBwdWJsaWMgRGV2aWNlSGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBTZXRzIHRoZSB2YWx1ZSBvZiAnZGV2aWNlcycgdG8gYSBiaXRtYXNrIG9mIDEgb3IgbW9yZSB2YWx1ZXMgb2YgYXVkaW9fZGV2aWNlc190LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCAqZGV2aWNlcyk7Ci0KLSAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZSBoYXMgYmVlbiBpbml0aWFsaXplZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgb2YgYSB2b2ljZSBjYWxsLiBSYW5nZSBpcyBiZXR3ZWVuIDAuMCBhbmQgMS4wLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIGZvciBhbGwgYXVkaW8gYWN0aXZpdGllcyBvdGhlciB0aGFuIHZvaWNlIGNhbGwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIC8vIEdldCB0aGUgY3VycmVudCBtYXN0ZXIgdm9sdW1lIHZhbHVlIGZvciB0aGUgSEFMLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlIGF1ZGlvIG1vZGUgY2hhbmdlcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpOwotCi0gICAgLy8gTXV0aW5nIGNvbnRyb2wuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNNdXRlKGJvb2wgc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljTXV0ZShib29sICpzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSk7Ci0KLSAgICAvLyBTZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOwotCi0gICAgLy8gR2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOwotCi0gICAgLy8gUmV0dXJucyBhdWRpbyBpbnB1dCBidWZmZXIgc2l6ZSBhY2NvcmRpbmcgdG8gcGFyYW1ldGVycyBwYXNzZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlclNpemUoY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAotICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKTsKLQotICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCi0gICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgY3JlYXRlQXVkaW9QYXRjaCBhbmQgcmVsZWFzZUF1ZGlvUGF0Y2ggb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKTsKLQotICAgIC8vIENyZWF0ZXMgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCk7Ci0KLSAgICAvLyBSZWxlYXNlcyBhbiBhdWRpbyBwYXRjaC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKTsKLQotICAgIC8vIEZpbGxzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpOwotCi0gICAgLy8gU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7Ci0KLSAgICAvLyBMaXN0IG1pY3JvcGhvbmVzCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKLQotICAgIHZvaWQgY2xvc2VPdXRwdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgKnN0cmVhbV9vdXQpOwotICAgIHZvaWQgY2xvc2VJbnB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luICpzdHJlYW1faW4pOwotCi0gIHByaXZhdGU6Ci0gICAgYXVkaW9faHdfZGV2aWNlX3QgKm1EZXY7Ci0KLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBEZXZpY2VIYWxMb2NhbChhdWRpb19od19kZXZpY2VfdCAqZGV2KTsKLQotICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBkZXZpY2UuCi0gICAgdmlydHVhbCB+RGV2aWNlSGFsTG9jYWwoKTsKLQotICAgIHVpbnQzMl90IHZlcnNpb24oKSBjb25zdCB7IHJldHVybiBtRGV2LT5jb21tb24udmVyc2lvbjsgfQotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMzM1OTIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lEZXZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9oaWRsL0hhbERlYXRoSGFuZGxlci5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJRGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1EZXZpY2VzRmFjdG9yeUhhbEhpZGw6OkRldmljZXNGYWN0b3J5SGFsSGlkbCgpIHsKLSAgICBtRGV2aWNlc0ZhY3RvcnkgPSBJRGV2aWNlc0ZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKLSAgICBpZiAobURldmljZXNGYWN0b3J5ICE9IDApIHsKLSAgICAgICAgLy8gSXQgaXMgYXNzdW1lZCB0aGF0IERldmljZXNGYWN0b3J5IGlzIG93bmVkIGJ5IEF1ZGlvRmxpbmdlcgotICAgICAgICAvLyBhbmQgdGh1cyBoYXZlIHRoZSBzYW1lIGxpZmVzcGFuLgotICAgICAgICBtRGV2aWNlc0ZhY3RvcnktPmxpbmtUb0RlYXRoKEhhbERlYXRoSGFuZGxlcjo6Z2V0SW5zdGFuY2UoKSwgMCAvKmNvb2tpZSovKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9idGFpbiBJRGV2aWNlc0ZhY3Rvcnkgc2VydmljZSwgdGVybWluYXRpbmcgcHJvY2Vzcy4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgLy8gVGhlIE1TRCBmYWN0b3J5IGlzIG9wdGlvbmFsCi0gICAgbURldmljZXNGYWN0b3J5TXNkID0gSURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKEFVRElPX0hBTF9TRVJWSUNFX05BTUVfTVNEKTsKLSAgICAvLyBUT0RPOiBSZWdpc3RlciBkZWF0aCBoYW5kbGVyLCBhbmQgYWRkICdyZXN0YXJ0JyBkaXJlY3RpdmUgdG8gYXVkaW9zZXJ2ZXIucmMKLX0KLQotRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjp+RGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCkgewotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IERldmljZXNGYWN0b3J5SGFsSGlkbDo6bmFtZUZyb21IYWwoY29uc3QgY2hhciAqbmFtZSwgSURldmljZXNGYWN0b3J5OjpEZXZpY2UgKmRldmljZSkgewotICAgIGlmIChzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlkpID09IDApIHsKLSAgICAgICAgKmRldmljZSA9IElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpQUklNQVJZOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIGlmKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfQTJEUCkgPT0gMCkgewotICAgICAgICAqZGV2aWNlID0gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OkEyRFA7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9VU0IpID09IDApIHsKLSAgICAgICAgKmRldmljZSA9IElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpVU0I7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9SRU1PVEVfU1VCTUlYKSA9PSAwKSB7Ci0gICAgICAgICpkZXZpY2UgPSBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6Ul9TVUJNSVg7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9TVFVCKSA9PSAwKSB7Ci0gICAgICAgICpkZXZpY2UgPSBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6U1RVQjsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICBBTE9HRSgiSW52YWxpZCBkZXZpY2UgbmFtZSAlcyIsIG5hbWUpOwotICAgIHJldHVybiBCQURfVkFMVUU7Ci19Ci0KLXN0YXR1c190IERldmljZXNGYWN0b3J5SGFsSGlkbDo6b3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpIHsKLSAgICBpZiAobURldmljZXNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwotICAgIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlIGhpZGxEZXZpY2U7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbmFtZUZyb21IYWwobmFtZSwgJmhpZGxEZXZpY2UpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlc0ZhY3RvcnktPm9wZW5EZXZpY2UoCi0gICAgICAgICAgICBoaWRsRGV2aWNlLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJRGV2aWNlPiYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKmRldmljZSA9IG5ldyBEZXZpY2VIYWxIaWRsKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7Ci0gICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICBlbHNlIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NDg4NDkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hJRExfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JRGV2aWNlc0ZhY3RvcnkuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklEZXZpY2VzRmFjdG9yeTsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEhpZGwgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcwotICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDsKLQotICAgIHNwPElEZXZpY2VzRmFjdG9yeT4gbURldmljZXNGYWN0b3J5OwotICAgIHNwPElEZXZpY2VzRmFjdG9yeT4gbURldmljZXNGYWN0b3J5TXNkOwotCi0gICAgc3RhdGljIHN0YXR1c190IG5hbWVGcm9tSGFsKGNvbnN0IGNoYXIgKm5hbWUsIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlICpkZXZpY2UpOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIERldmljZXNGYWN0b3J5SGFsSGlkbCgpOwotCi0gICAgdmlydHVhbCB+RGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM0YmU3NC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oIgotI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuaCIKLSNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKQotICAgICAgICA6IG1Mb2NhbEZhY3RvcnkobmV3IERldmljZXNGYWN0b3J5SGFsTG9jYWwoKSksCi0gICAgICAgICAgbUhpZGxGYWN0b3J5KG5ldyBEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKSkgewotfQotCi1EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6fkRldmljZXNGYWN0b3J5SGFsSHlicmlkKCkgewotfQotCi1zdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6b3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpIHsKLSAgICBpZiAobUhpZGxGYWN0b3J5ICE9IDAgJiYgc3RyY21wKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9BMkRQLCBuYW1lKSAhPSAwICYmCi0gICAgICAgIHN0cmNtcChBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfSEVBUklOR19BSUQsIG5hbWUpICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1IaWRsRmFjdG9yeS0+b3BlbkRldmljZShuYW1lLCBkZXZpY2UpOwotICAgIH0KLSAgICByZXR1cm4gbUxvY2FsRmFjdG9yeS0+b3BlbkRldmljZShuYW1lLCBkZXZpY2UpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQ1N2Q2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hZQlJJRF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9IWUJSSURfSAotCi0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcwotICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZTsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpOwotCi0gICAgdmlydHVhbCB+RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKTsKLQotICAgIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBtTG9jYWxGYWN0b3J5OwotICAgIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBtSGlkbEZhY3Rvcnk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSFlCUklEX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNhOWFjZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKLSNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIHN0YXR1c190IGxvYWRfYXVkaW9faW50ZXJmYWNlKGNvbnN0IGNoYXIgKmlmX25hbWUsIGF1ZGlvX2h3X2RldmljZV90ICoqZGV2KQotewotICAgIGNvbnN0IGh3X21vZHVsZV90ICptb2Q7Ci0gICAgaW50IHJjOwotCi0gICAgcmMgPSBod19nZXRfbW9kdWxlX2J5X2NsYXNzKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgJm1vZCk7Ci0gICAgaWYgKHJjKSB7Ci0gICAgICAgIEFMT0dFKCIlcyBjb3VsZG4ndCBsb2FkIGF1ZGlvIGh3IG1vZHVsZSAlcy4lcyAoJXMpIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCBzdHJlcnJvcigtcmMpKTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotICAgIHJjID0gYXVkaW9faHdfZGV2aWNlX29wZW4obW9kLCBkZXYpOwotICAgIGlmIChyYykgewotICAgICAgICBBTE9HRSgiJXMgY291bGRuJ3Qgb3BlbiBhdWRpbyBodyBkZXZpY2UgaW4gJXMuJXMgKCVzKSIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgc3RyZXJyb3IoLXJjKSk7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLSAgICBpZiAoKCpkZXYpLT5jb21tb24udmVyc2lvbiA8IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl9NSU4pIHsKLSAgICAgICAgQUxPR0UoIiVzIHdyb25nIGF1ZGlvIGh3IGRldmljZSB2ZXJzaW9uICUwNHgiLCBfX2Z1bmNfXywgKCpkZXYpLT5jb21tb24udmVyc2lvbik7Ci0gICAgICAgIHJjID0gQkFEX1ZBTFVFOwotICAgICAgICBhdWRpb19od19kZXZpY2VfY2xvc2UoKmRldik7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci0KLW91dDoKLSAgICAqZGV2ID0gTlVMTDsKLSAgICByZXR1cm4gcmM7Ci19Ci0KLXN0YXR1c190IERldmljZXNGYWN0b3J5SGFsTG9jYWw6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7Ci0gICAgYXVkaW9faHdfZGV2aWNlX3QgKmRldjsKLSAgICBzdGF0dXNfdCByYyA9IGxvYWRfYXVkaW9faW50ZXJmYWNlKG5hbWUsICZkZXYpOwotICAgIGlmIChyYyA9PSBPSykgewotICAgICAgICAqZGV2aWNlID0gbmV3IERldmljZUhhbExvY2FsKGRldik7Ci0gICAgfQotICAgIHJldHVybiByYzsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZDE4YWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF9ICi0KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCA6IHB1YmxpYyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gT3BlbnMgYSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRvIGNsb3NlIHRoZSBkZXZpY2UsIGl0IGlzCi0gICAgLy8gbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSHlicmlkOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIERldmljZXNGYWN0b3J5SGFsTG9jYWwoKSB7fQotCi0gICAgdmlydHVhbCB+RGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCgpIHt9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfTE9DQUxfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjZhNTAwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGF0b21pYz4KLQotI2RlZmluZSBMT0dfVEFHICJFZmZlY3RCdWZmZXJIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oaWRsL2FsbG9jYXRvci8xLjAvSUFsbG9jYXRvci5oPgotI2luY2x1ZGUgPGhpZGxtZW1vcnkvbWFwcGluZy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGlkbDo6YWxsb2NhdG9yOjpWMV8wOjpJQWxsb2NhdG9yOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIHN0YXRpYwotdWludDY0X3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6bWFrZVVuaXF1ZUlkKCkgewotICAgIHN0YXRpYyBzdGQ6OmF0b21pYzx1aW50NjRfdD4gY291bnRlcnsxfTsKLSAgICByZXR1cm4gY291bnRlcisrOwotfQotCi1zdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHJldHVybiBtaXJyb3IobnVsbHB0ciwgc2l6ZSwgYnVmZmVyKTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6bWlycm9yKAotICAgICAgICB2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gdGVtcEJ1ZmZlciA9IG5ldyBFZmZlY3RCdWZmZXJIYWxIaWRsKHNpemUpOwotICAgIHN0YXR1c190IHJlc3VsdCA9IHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPih0ZW1wQnVmZmVyLmdldCgpKS0+aW5pdCgpOwotICAgIGlmIChyZXN1bHQgPT0gT0spIHsKLSAgICAgICAgdGVtcEJ1ZmZlci0+c2V0RXh0ZXJuYWxEYXRhKGV4dGVybmFsKTsKLSAgICAgICAgKmJ1ZmZlciA9IHRlbXBCdWZmZXI7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLUVmZmVjdEJ1ZmZlckhhbEhpZGw6OkVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZV90IHNpemUpCi0gICAgICAgIDogbUJ1ZmZlclNpemUoc2l6ZSksIG1GcmFtZUNvdW50Q2hhbmdlZChmYWxzZSksCi0gICAgICAgICAgbUV4dGVybmFsRGF0YShudWxscHRyKSwgbUF1ZGlvQnVmZmVyezAsIHtudWxscHRyfX0gewotICAgIG1IaWRsQnVmZmVyLmlkID0gbWFrZVVuaXF1ZUlkKCk7Ci0gICAgbUhpZGxCdWZmZXIuZnJhbWVDb3VudCA9IDA7Ci19Ci0KLUVmZmVjdEJ1ZmZlckhhbEhpZGw6On5FZmZlY3RCdWZmZXJIYWxIaWRsKCkgewotfQotCi1zdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjppbml0KCkgewotICAgIHNwPElBbGxvY2F0b3I+IGFzaG1lbSA9IElBbGxvY2F0b3I6OmdldFNlcnZpY2UoImFzaG1lbSIpOwotICAgIGlmIChhc2htZW0gPT0gMCkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJldHJpZXZlIGFzaG1lbSBhbGxvY2F0b3Igc2VydmljZSIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgc3RhdHVzX3QgcmV0dmFsID0gTk9fTUVNT1JZOwotICAgIFJldHVybjx2b2lkPiByZXN1bHQgPSBhc2htZW0tPmFsbG9jYXRlKAotICAgICAgICAgICAgbUJ1ZmZlclNpemUsCi0gICAgICAgICAgICBbJl0oYm9vbCBzdWNjZXNzLCBjb25zdCBoaWRsX21lbW9yeSYgbWVtb3J5KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgbUhpZGxCdWZmZXIuZGF0YSA9IG1lbW9yeTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gT0s7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJlc3VsdC5pc09rKCkgJiYgcmV0dmFsID09IE9LKSB7Ci0gICAgICAgIG1NZW1vcnkgPSBoYXJkd2FyZTo6bWFwTWVtb3J5KG1IaWRsQnVmZmVyLmRhdGEpOwotICAgICAgICBpZiAobU1lbW9yeSAhPSAwKSB7Ci0gICAgICAgICAgICBtTWVtb3J5LT51cGRhdGUoKTsKLSAgICAgICAgICAgIG1BdWRpb0J1ZmZlci5yYXcgPSBzdGF0aWNfY2FzdDx2b2lkKj4obU1lbW9yeS0+Z2V0UG9pbnRlcigpKTsKLSAgICAgICAgICAgIG1lbXNldChtQXVkaW9CdWZmZXIucmF3LCAwLCBtTWVtb3J5LT5nZXRTaXplKCkpOwotICAgICAgICAgICAgbU1lbW9yeS0+Y29tbWl0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG1hcCBhbGxvY2F0ZWQgYXNobWVtIik7Ci0gICAgICAgICAgICByZXR2YWwgPSBOT19NRU1PUlk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZyb20gYXNobWVtIiwgKGludCltQnVmZmVyU2l6ZSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQuaXNPaygpID8gcmV0dmFsIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1hdWRpb19idWZmZXJfdCogRWZmZWN0QnVmZmVySGFsSGlkbDo6YXVkaW9CdWZmZXIoKSB7Ci0gICAgcmV0dXJuICZtQXVkaW9CdWZmZXI7Ci19Ci0KLXZvaWQqIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmV4dGVybmFsRGF0YSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUV4dGVybmFsRGF0YTsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpzZXRGcmFtZUNvdW50KHNpemVfdCBmcmFtZUNvdW50KSB7Ci0gICAgbUhpZGxCdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7Ci0gICAgbUF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwotICAgIG1GcmFtZUNvdW50Q2hhbmdlZCA9IHRydWU7Ci19Ci0KLWJvb2wgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCkgewotICAgIGJvb2wgcmVzdWx0ID0gbUZyYW1lQ291bnRDaGFuZ2VkOwotICAgIG1GcmFtZUNvdW50Q2hhbmdlZCA9IGZhbHNlOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6c2V0RXh0ZXJuYWxEYXRhKHZvaWQqIGV4dGVybmFsKSB7Ci0gICAgbUV4dGVybmFsRGF0YSA9IGV4dGVybmFsOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnVwZGF0ZSgpIHsKLSAgICB1cGRhdGUobUJ1ZmZlclNpemUpOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmNvbW1pdCgpIHsKLSAgICBjb21taXQobUJ1ZmZlclNpemUpOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnVwZGF0ZShzaXplX3Qgc2l6ZSkgewotICAgIGlmIChtRXh0ZXJuYWxEYXRhID09IG51bGxwdHIpIHJldHVybjsKLSAgICBtTWVtb3J5LT51cGRhdGUoKTsKLSAgICBpZiAoc2l6ZSA+IG1CdWZmZXJTaXplKSBzaXplID0gbUJ1ZmZlclNpemU7Ci0gICAgbWVtY3B5KG1BdWRpb0J1ZmZlci5yYXcsIG1FeHRlcm5hbERhdGEsIHNpemUpOwotICAgIG1NZW1vcnktPmNvbW1pdCgpOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmNvbW1pdChzaXplX3Qgc2l6ZSkgewotICAgIGlmIChtRXh0ZXJuYWxEYXRhID09IG51bGxwdHIpIHJldHVybjsKLSAgICBpZiAoc2l6ZSA+IG1CdWZmZXJTaXplKSBzaXplID0gbUJ1ZmZlclNpemU7Ci0gICAgbWVtY3B5KG1FeHRlcm5hbERhdGEsIG1BdWRpb0J1ZmZlci5yYXcsIHNpemUpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0QnVmZmVySGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFlMDA4Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0QnVmZmVySGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzIuMC90eXBlcy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tZW1vcnkvMS4wL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgotCi11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6QXVkaW9CdWZmZXI7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Ci11c2luZyBhbmRyb2lkOjpoaWRsOjptZW1vcnk6OlYxXzA6OklNZW1vcnk7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRWZmZWN0QnVmZmVySGFsSGlkbCA6IHB1YmxpYyBFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIHN0YXRpYyBzdGF0dXNfdCBhbGxvY2F0ZShzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKTsKLSAgICBzdGF0aWMgc3RhdHVzX3QgbWlycm9yKHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKTsKLQotICAgIHZpcnR1YWwgYXVkaW9fYnVmZmVyX3QqIGF1ZGlvQnVmZmVyKCk7Ci0gICAgdmlydHVhbCB2b2lkKiBleHRlcm5hbERhdGEoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgc2l6ZV90IGdldFNpemUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtQnVmZmVyU2l6ZTsgfQotCi0gICAgdmlydHVhbCB2b2lkIHNldEV4dGVybmFsRGF0YSh2b2lkKiBleHRlcm5hbCk7Ci0gICAgdmlydHVhbCB2b2lkIHNldEZyYW1lQ291bnQoc2l6ZV90IGZyYW1lQ291bnQpOwotICAgIHZpcnR1YWwgYm9vbCBjaGVja0ZyYW1lQ291bnRDaGFuZ2UoKTsKLQotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQgY29tbWl0KCk7Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZShzaXplX3Qgc2l6ZSk7Ci0gICAgdmlydHVhbCB2b2lkIGNvbW1pdChzaXplX3Qgc2l6ZSk7Ci0KLSAgICBjb25zdCBBdWRpb0J1ZmZlciYgaGlkbEJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1IaWRsQnVmZmVyOyB9Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlOwotCi0gICAgc3RhdGljIHVpbnQ2NF90IG1ha2VVbmlxdWVJZCgpOwotCi0gICAgY29uc3Qgc2l6ZV90IG1CdWZmZXJTaXplOwotICAgIGJvb2wgbUZyYW1lQ291bnRDaGFuZ2VkOwotICAgIHZvaWQqIG1FeHRlcm5hbERhdGE7Ci0gICAgQXVkaW9CdWZmZXIgbUhpZGxCdWZmZXI7Ci0gICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKLSAgICBhdWRpb19idWZmZXJfdCBtQXVkaW9CdWZmZXI7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgZXhwbGljaXQgRWZmZWN0QnVmZmVySGFsSGlkbChzaXplX3Qgc2l6ZSk7Ci0KLSAgICB2aXJ0dWFsIH5FZmZlY3RCdWZmZXJIYWxIaWRsKCk7Ci0KLSAgICBzdGF0dXNfdCBpbml0KCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9CVUZGRVJfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmIwMzJjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RIYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJFZmZlY3RIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgotI2luY2x1ZGUgIkhpZGxVdGlscy5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpBdWRpb0J1ZmZlcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OkVmZmVjdEJ1ZmZlckFjY2VzczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OkVmZmVjdENvbmZpZ1BhcmFtZXRlcnM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpNZXNzYWdlUXVldWVGbGFnQml0czsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkhpZGxVdGlsczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvQ2hhbm5lbE1hc2s7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0Zvcm1hdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1FZmZlY3RIYWxIaWRsOjpFZmZlY3RIYWxIaWRsKGNvbnN0IHNwPElFZmZlY3Q+JiBlZmZlY3QsIHVpbnQ2NF90IGVmZmVjdElkKQotICAgICAgICA6IG1FZmZlY3QoZWZmZWN0KSwgbUVmZmVjdElkKGVmZmVjdElkKSwgbUJ1ZmZlcnNDaGFuZ2VkKHRydWUpLCBtRWZHcm91cChudWxscHRyKSB7Ci19Ci0KLUVmZmVjdEhhbEhpZGw6On5FZmZlY3RIYWxIaWRsKCkgewotICAgIGlmIChtRWZmZWN0ICE9IDApIHsKLSAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgbUVmZmVjdC5jbGVhcigpOwotICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgIH0KLSAgICBpZiAobUVmR3JvdXApIHsKLSAgICAgICAgRXZlbnRGbGFnOjpkZWxldGVFdmVudEZsYWcoJm1FZkdyb3VwKTsKLSAgICB9Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwoCi0gICAgICAgIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIGRlc2NyaXB0b3IsIGVmZmVjdF9kZXNjcmlwdG9yX3QqIGhhbERlc2NyaXB0b3IpIHsKLSAgICBIaWRsVXRpbHM6OnV1aWRUb0hhbChkZXNjcmlwdG9yLnR5cGUsICZoYWxEZXNjcmlwdG9yLT50eXBlKTsKLSAgICBIaWRsVXRpbHM6OnV1aWRUb0hhbChkZXNjcmlwdG9yLnV1aWQsICZoYWxEZXNjcmlwdG9yLT51dWlkKTsKLSAgICBoYWxEZXNjcmlwdG9yLT5mbGFncyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkZXNjcmlwdG9yLmZsYWdzKTsKLSAgICBoYWxEZXNjcmlwdG9yLT5jcHVMb2FkID0gZGVzY3JpcHRvci5jcHVMb2FkOwotICAgIGhhbERlc2NyaXB0b3ItPm1lbW9yeVVzYWdlID0gZGVzY3JpcHRvci5tZW1vcnlVc2FnZTsKLSAgICBtZW1jcHkoaGFsRGVzY3JpcHRvci0+bmFtZSwgZGVzY3JpcHRvci5uYW1lLmRhdGEoKSwgZGVzY3JpcHRvci5uYW1lLnNpemUoKSk7Ci0gICAgbWVtY3B5KGhhbERlc2NyaXB0b3ItPmltcGxlbWVudG9yLAotICAgICAgICAgICAgZGVzY3JpcHRvci5pbXBsZW1lbnRvci5kYXRhKCksIGRlc2NyaXB0b3IuaW1wbGVtZW50b3Iuc2l6ZSgpKTsKLX0KLQotLy8gVE9ETyhtbmFnYW5vdik6IFRoZXNlIGJ1ZmZlciBjb252ZXJzaW9uIGZ1bmN0aW9ucyBzaG91bGQgYmUgc2hhcmVkIHdpdGggRWZmZWN0IHdyYXBwZXIKLS8vIHZpYSBIaWRsVXRpbHMuIE1vdmUgdGhlbSB0aGVyZSB3aGVuIGhhcmR3YXJlL2ludGVyZmFjZXMgd2lsbCBnZXQgdW4tZnJvemVuIGFnYWluLgotCi0vLyBzdGF0aWMKLXZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbCgKLSAgICAgICAgY29uc3QgYnVmZmVyX2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdEJ1ZmZlckNvbmZpZyogY29uZmlnKSB7Ci0gICAgY29uZmlnLT5zYW1wbGluZ1JhdGVIeiA9IGhhbENvbmZpZy5zYW1wbGluZ1JhdGU7Ci0gICAgY29uZmlnLT5jaGFubmVscyA9IEF1ZGlvQ2hhbm5lbE1hc2soaGFsQ29uZmlnLmNoYW5uZWxzKTsKLSAgICBjb25maWctPmZvcm1hdCA9IEF1ZGlvRm9ybWF0KGhhbENvbmZpZy5mb3JtYXQpOwotICAgIGNvbmZpZy0+YWNjZXNzTW9kZSA9IEVmZmVjdEJ1ZmZlckFjY2VzcyhoYWxDb25maWcuYWNjZXNzTW9kZSk7Ci0gICAgY29uZmlnLT5tYXNrID0gRWZmZWN0Q29uZmlnUGFyYW1ldGVycyhoYWxDb25maWcubWFzayk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RCdWZmZXJDb25maWdUb0hhbCgKLSAgICAgICAgY29uc3QgRWZmZWN0QnVmZmVyQ29uZmlnJiBjb25maWcsIGJ1ZmZlcl9jb25maWdfdCogaGFsQ29uZmlnKSB7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXIuZnJhbWVDb3VudCA9IDA7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXIucmF3ID0gTlVMTDsKLSAgICBoYWxDb25maWctPnNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGluZ1JhdGVIejsKLSAgICBoYWxDb25maWctPmNoYW5uZWxzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNvbmZpZy5jaGFubmVscyk7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOwotICAgIGhhbENvbmZpZy0+YnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKLSAgICBoYWxDb25maWctPmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwotICAgIGhhbENvbmZpZy0+Zm9ybWF0ID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLmZvcm1hdCk7Ci0gICAgaGFsQ29uZmlnLT5hY2Nlc3NNb2RlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLmFjY2Vzc01vZGUpOwotICAgIGhhbENvbmZpZy0+bWFzayA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5tYXNrKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdENvbmZpZ0Zyb21IYWwoY29uc3QgZWZmZWN0X2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdENvbmZpZyogY29uZmlnKSB7Ci0gICAgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbChoYWxDb25maWcuaW5wdXRDZmcsICZjb25maWctPmlucHV0Q2ZnKTsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKGhhbENvbmZpZy5vdXRwdXRDZmcsICZjb25maWctPm91dHB1dENmZyk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RDb25maWdUb0hhbChjb25zdCBFZmZlY3RDb25maWcmIGNvbmZpZywgZWZmZWN0X2NvbmZpZ190KiBoYWxDb25maWcpIHsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdUb0hhbChjb25maWcuaW5wdXRDZmcsICZoYWxDb25maWctPmlucHV0Q2ZnKTsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdUb0hhbChjb25maWcub3V0cHV0Q2ZnLCAmaGFsQ29uZmlnLT5vdXRwdXRDZmcpOwotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmFuYWx5emVSZXN1bHQoY29uc3QgUmVzdWx0JiByZXN1bHQpIHsKLSAgICBzd2l0Y2ggKHJlc3VsdCkgewotICAgICAgICBjYXNlIFJlc3VsdDo6T0s6IHJldHVybiBPSzsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTOiByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9TVEFURTogcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDogcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfU1VQUE9SVEVEOiByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpSRVNVTFRfVE9PX0JJRzogcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRJbkJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKLSAgICBpZiAoIW1CdWZmZXJzQ2hhbmdlZCkgewotICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IG51bGxwdHIgfHwgbUluQnVmZmVyLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci5nZXQoKSAhPSBtSW5CdWZmZXIuZ2V0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXItPmF1ZGlvQnVmZmVyKCkgIT0gbUluQnVmZmVyLT5hdWRpb0J1ZmZlcigpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1JbkJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldE91dEJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKLSAgICBpZiAoIW1CdWZmZXJzQ2hhbmdlZCkgewotICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IG51bGxwdHIgfHwgbU91dEJ1ZmZlci5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXIuZ2V0KCkgIT0gbU91dEJ1ZmZlci5nZXQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci0+YXVkaW9CdWZmZXIoKSAhPSBtT3V0QnVmZmVyLT5hdWRpb0J1ZmZlcigpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1PdXRCdWZmZXIgPSBidWZmZXI7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzKCkgewotICAgIHJldHVybiBwcm9jZXNzSW1wbChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OlJFUVVFU1RfUFJPQ0VTUykpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzUmV2ZXJzZSgpIHsKLSAgICByZXR1cm4gcHJvY2Vzc0ltcGwoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpSRVFVRVNUX1BST0NFU1NfUkVWRVJTRSkpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcmVwYXJlRm9yUHJvY2Vzc2luZygpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IHRlbXBTdGF0dXNNUTsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5wcmVwYXJlRm9yUHJvY2Vzc2luZygKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTVFEZXNjcmlwdG9yU3luYzxSZXN1bHQ+JiBzdGF0dXNNUSkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBTdGF0dXNNUS5yZXNldChuZXcgU3RhdHVzTVEoc3RhdHVzTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpICYmIHRlbXBTdGF0dXNNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wU3RhdHVzTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSwgJm1FZkdyb3VwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgewotICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0gICAgaWYgKCF0ZW1wU3RhdHVzTVEgfHwgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpIHx8ICFtRWZHcm91cCkgewotICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgZWZmZWN0cyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgZWZmZWN0cyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIGVmZmVjdHMgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBtU3RhdHVzTVEgPSBzdGQ6Om1vdmUodGVtcFN0YXR1c01RKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLWJvb2wgRWZmZWN0SGFsSGlkbDo6bmVlZFRvUmVzZXRCdWZmZXJzKCkgewotICAgIGlmIChtQnVmZmVyc0NoYW5nZWQpIHJldHVybiB0cnVlOwotICAgIGJvb2wgaW5CdWZmZXJGcmFtZUNvdW50VXBkYXRlZCA9IG1JbkJ1ZmZlci0+Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7Ci0gICAgYm9vbCBvdXRCdWZmZXJGcmFtZUNvdW50VXBkYXRlZCA9IG1PdXRCdWZmZXItPmNoZWNrRnJhbWVDb3VudENoYW5nZSgpOwotICAgIHJldHVybiBpbkJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkIHx8IG91dEJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzSW1wbCh1aW50MzJfdCBtcUZsYWcpIHsKLSAgICBpZiAobUVmZmVjdCA9PSAwIHx8IG1JbkJ1ZmZlciA9PSAwIHx8IG1PdXRCdWZmZXIgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmICghbVN0YXR1c01RICYmIChzdGF0dXMgPSBwcmVwYXJlRm9yUHJvY2Vzc2luZygpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBpZiAobmVlZFRvUmVzZXRCdWZmZXJzKCkgJiYgKHN0YXR1cyA9IHNldFByb2Nlc3NCdWZmZXJzKCkpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIC8vIFRoZSBkYXRhIGlzIGFscmVhZHkgaW4gdGhlIGJ1ZmZlcnMsIGp1c3QgbmVlZCB0byBmbHVzaCBpdCBhbmQgd2FrZSB1cCB0aGUgc2VydmVyIHNpZGUuCi0gICAgc3RkOjphdG9taWNfdGhyZWFkX2ZlbmNlKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UpOwotICAgIG1FZkdyb3VwLT53YWtlKG1xRmxhZyk7Ci0gICAgdWludDMyX3QgZWZTdGF0ZSA9IDA7Ci1yZXRyeToKLSAgICBzdGF0dXNfdCByZXQgPSBtRWZHcm91cC0+d2FpdCgKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6RE9ORV9QUk9DRVNTSU5HKSwgJmVmU3RhdGUpOwotICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpET05FX1BST0NFU1NJTkcpKSB7Ci0gICAgICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICAgICAgbVN0YXR1c01RLT5yZWFkKCZyZXR2YWwpOwotICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0sgfHwgcmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9TVEFURSkgewotICAgICAgICAgICAgLy8gU3luYyBiYWNrIHRoZSBjaGFuZ2VkIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIuCi0gICAgICAgICAgICBzdGQ6OmF0b21pY190aHJlYWRfZmVuY2Uoc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFuYWx5emVSZXN1bHQocmV0dmFsKTsKLSAgICB9Ci0gICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKLSAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCi0gICAgICAgIGdvdG8gcmV0cnk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldFByb2Nlc3NCdWZmZXJzKCkgewotICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IG1FZmZlY3QtPnNldFByb2Nlc3NCdWZmZXJzKAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KG1JbkJ1ZmZlci5nZXQoKSktPmhpZGxCdWZmZXIoKSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPihtT3V0QnVmZmVyLmdldCgpKS0+aGlkbEJ1ZmZlcigpKTsKLSAgICBpZiAocmV0LmlzT2soKSAmJiByZXQgPT0gUmVzdWx0OjpPSykgewotICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Y29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKLSAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgewotICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOwotCi0gICAgLy8gU3BlY2lhbCBjYXNlcy4KLSAgICBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgfHwgY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUdfUkVWRVJTRSkgewotICAgICAgICByZXR1cm4gc2V0Q29uZmlnSW1wbChjbWRDb2RlLCBjbWRTaXplLCBwQ21kRGF0YSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKLSAgICB9IGVsc2UgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHIHx8IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHX1JFVkVSU0UpIHsKLSAgICAgICAgcmV0dXJuIGdldENvbmZpZ0ltcGwoY21kQ29kZSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKLSAgICB9Ci0KLSAgICAvLyBDb21tb24gY2FzZS4KLSAgICBoaWRsX3ZlYzx1aW50OF90PiBoaWRsRGF0YTsKLSAgICBpZiAocENtZERhdGEgIT0gbnVsbHB0ciAmJiBjbWRTaXplID4gMCkgewotICAgICAgICBoaWRsRGF0YS5zZXRUb0V4dGVybmFsKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHBDbWREYXRhKSwgY21kU2l6ZSk7Ci0gICAgfQotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICB1aW50MzJfdCByZXBseVNpemVTdHViID0gMDsKLSAgICBpZiAocmVwbHlTaXplID09IG51bGxwdHIgfHwgcFJlcGx5RGF0YSA9PSBudWxscHRyKSByZXBseVNpemUgPSAmcmVwbHlTaXplU3R1YjsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+Y29tbWFuZChjbWRDb2RlLCBoaWRsRGF0YSwgKnJlcGx5U2l6ZSwKLSAgICAgICAgICAgIFsmXShpbnQzMl90IHMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKnJlcGx5U2l6ZSA+IHJlc3VsdC5zaXplKCkpICpyZXBseVNpemUgPSByZXN1bHQuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSAhPSBudWxscHRyICYmICpyZXBseVNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocFJlcGx5RGF0YSwgJnJlc3VsdFswXSwgKnJlcGx5U2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcmV0LmlzT2soKSA/IHN0YXR1cyA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgewotICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+Z2V0RGVzY3JpcHRvcigKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzY3JpcHRvclRvSGFsKHJlc3VsdCwgcERlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXR2YWwpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpjbG9zZSgpIHsKLSAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBtRWZmZWN0LT5jbG9zZSgpOwotICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpnZXRDb25maWdJbXBsKAotICAgICAgICB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7Ci0gICAgaWYgKHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkgfHwgcFJlcGx5RGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHN0YXR1c190IHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICBSZXR1cm48dm9pZD4gcmV0OwotICAgIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfR0VUX0NPTkZJRykgewotICAgICAgICByZXQgPSBtRWZmZWN0LT5nZXRDb25maWcoWyZdIChSZXN1bHQgciwgY29uc3QgRWZmZWN0Q29uZmlnICZoaWRsQ29uZmlnKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHIpOwotICAgICAgICAgICAgaWYgKHIgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgIGVmZmVjdENvbmZpZ1RvSGFsKGhpZGxDb25maWcsIHN0YXRpY19jYXN0PGVmZmVjdF9jb25maWdfdCo+KHBSZXBseURhdGEpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0ID0gbUVmZmVjdC0+Z2V0Q29uZmlnUmV2ZXJzZShbJl0gKFJlc3VsdCByLCBjb25zdCBFZmZlY3RDb25maWcgJmhpZGxDb25maWcpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGFuYWx5emVSZXN1bHQocik7Ci0gICAgICAgICAgICBpZiAociA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgZWZmZWN0Q29uZmlnVG9IYWwoaGlkbENvbmZpZywgc3RhdGljX2Nhc3Q8ZWZmZWN0X2NvbmZpZ190Kj4ocFJlcGx5RGF0YSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0gICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgIHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0Q29uZmlnSW1wbCgKLSAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKLSAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpIHx8Ci0gICAgICAgICAgICByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSB8fCBwUmVwbHlEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgY29uc3QgZWZmZWN0X2NvbmZpZ190ICpoYWxDb25maWcgPSBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwQ21kRGF0YSk7Ci0gICAgaWYgKGhhbENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICE9IE5VTEwgfHwKLSAgICAgICAgICAgIGhhbENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAhPSBOVUxMIHx8Ci0gICAgICAgICAgICBoYWxDb25maWctPm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgIT0gTlVMTCB8fAotICAgICAgICAgICAgaGFsQ29uZmlnLT5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJCdWZmZXIgcHJvdmlkZXIgY2FsbGJhY2tzIGFyZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgfQotICAgIEVmZmVjdENvbmZpZyBoaWRsQ29uZmlnOwotICAgIGVmZmVjdENvbmZpZ0Zyb21IYWwoKmhhbENvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfQ09ORklHID8KLSAgICAgICAgICAgIG1FZmZlY3QtPnNldENvbmZpZyhoaWRsQ29uZmlnLCBudWxscHRyLCBudWxscHRyKSA6Ci0gICAgICAgICAgICBtRWZmZWN0LT5zZXRDb25maWdSZXZlcnNlKGhpZGxDb25maWcsIG51bGxwdHIsIG51bGxwdHIpOwotICAgIHN0YXR1c190IHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHJldCk7Ci0gICAgICAgICpzdGF0aWNfY2FzdDxpbnQzMl90Kj4ocFJlcGx5RGF0YSkgPSByZXN1bHQ7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0SGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmZkYWYxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfSEFMX0hJRExfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9IQUxfSElETF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC8yLjAvSUVmZmVjdC5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgPGZtcS9FdmVudEZsYWcuaD4KLSNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpFZmZlY3RCdWZmZXJDb25maWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpFZmZlY3RDb25maWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpFZmZlY3REZXNjcmlwdG9yOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6SUVmZmVjdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OkV2ZW50RmxhZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBFZmZlY3RIYWxIaWRsIDogcHVibGljIEVmZmVjdEhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gU2V0IHRoZSBpbnB1dCBidWZmZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRJbkJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpOwotCi0gICAgLy8gU2V0IHRoZSBvdXRwdXQgYnVmZmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0QnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcik7Ci0KLSAgICAvLyBFZmZlY3QgcHJvY2VzcyBmdW5jdGlvbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHByb2Nlc3MoKTsKLQotICAgIC8vIFByb2Nlc3MgcmV2ZXJzZSBzdHJlYW0gZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBwYXNzCi0gICAgLy8gYSByZWZlcmVuY2Ugc3RyZWFtIHRvIHRoZSBlZmZlY3QgZW5naW5lLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2Vzc1JldmVyc2UoKTsKLQotICAgIC8vIFNlbmQgYSBjb21tYW5kIGFuZCByZWNlaXZlIGEgcmVzcG9uc2UgdG8vZnJvbSBlZmZlY3QgZW5naW5lLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKLSAgICAgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpOwotCi0gICAgLy8gUmV0dXJucyB0aGUgZWZmZWN0IGRlc2NyaXB0b3IuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKLQotICAgIC8vIEZyZWUgcmVzb3VyY2VzIG9uIHRoZSByZW1vdGUgc2lkZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlKCk7Ci0KLSAgICAvLyBXaGV0aGVyIGl0J3MgYSBsb2NhbCBpbXBsZW1lbnRhdGlvbi4KLSAgICB2aXJ0dWFsIGJvb2wgaXNMb2NhbCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICB1aW50NjRfdCBlZmZlY3RJZCgpIGNvbnN0IHsgcmV0dXJuIG1FZmZlY3RJZDsgfQotCi0gICAgc3RhdGljIHZvaWQgZWZmZWN0RGVzY3JpcHRvclRvSGFsKAotICAgICAgICAgICAgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgZGVzY3JpcHRvciwgZWZmZWN0X2Rlc2NyaXB0b3JfdCogaGFsRGVzY3JpcHRvcik7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPAotICAgICAgICBoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6UmVzdWx0LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7Ci0KLSAgICBzcDxJRWZmZWN0PiBtRWZmZWN0OwotICAgIGNvbnN0IHVpbnQ2NF90IG1FZmZlY3RJZDsKLSAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IG1JbkJ1ZmZlcjsKLSAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IG1PdXRCdWZmZXI7Ci0gICAgYm9vbCBtQnVmZmVyc0NoYW5nZWQ7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7Ci0gICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBhbmFseXplUmVzdWx0KGNvbnN0IGhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpSZXN1bHQmIHJlc3VsdCk7Ci0gICAgc3RhdGljIHZvaWQgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbCgKLSAgICAgICAgICAgIGNvbnN0IGJ1ZmZlcl9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RCdWZmZXJDb25maWcqIGNvbmZpZyk7Ci0gICAgc3RhdGljIHZvaWQgZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoCi0gICAgICAgICAgICBjb25zdCBFZmZlY3RCdWZmZXJDb25maWcmIGNvbmZpZywgYnVmZmVyX2NvbmZpZ190KiBoYWxDb25maWcpOwotICAgIHN0YXRpYyB2b2lkIGVmZmVjdENvbmZpZ0Zyb21IYWwoY29uc3QgZWZmZWN0X2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdENvbmZpZyogY29uZmlnKTsKLSAgICBzdGF0aWMgdm9pZCBlZmZlY3RDb25maWdUb0hhbChjb25zdCBFZmZlY3RDb25maWcmIGNvbmZpZywgZWZmZWN0X2NvbmZpZ190KiBoYWxDb25maWcpOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIEVmZmVjdEhhbEhpZGwoY29uc3Qgc3A8SUVmZmVjdD4mIGVmZmVjdCwgdWludDY0X3QgZWZmZWN0SWQpOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSByZWxlYXNlcyB0aGUgZWZmZWN0LgotICAgIHZpcnR1YWwgfkVmZmVjdEhhbEhpZGwoKTsKLQotICAgIHN0YXR1c190IGdldENvbmZpZ0ltcGwodWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7Ci0gICAgc3RhdHVzX3QgcHJlcGFyZUZvclByb2Nlc3NpbmcoKTsKLSAgICBib29sIG5lZWRUb1Jlc2V0QnVmZmVycygpOwotICAgIHN0YXR1c190IHByb2Nlc3NJbXBsKHVpbnQzMl90IG1xRmxhZyk7Ci0gICAgc3RhdHVzX3Qgc2V0Q29uZmlnSW1wbCgKLSAgICAgICAgICAgIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLAotICAgICAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7Ci0gICAgc3RhdHVzX3Qgc2V0UHJvY2Vzc0J1ZmZlcnMoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNDBlNmQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0QnVmZmVySGFsSGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeUhhbEhpZGwuaCIKLSNpbmNsdWRlICJIaWRsVXRpbHMuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6SGlkbFV0aWxzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6VXVpZDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OklFZmZlY3Q7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpFZmZlY3RzRmFjdG9yeUhhbEhpZGwoKSA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJFZmZlY3RzRmFjdG9yeSIpIHsKLSAgICBtRWZmZWN0c0ZhY3RvcnkgPSBJRWZmZWN0c0ZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvYnRhaW4gSUVmZmVjdHNGYWN0b3J5IHNlcnZpY2UsIHRlcm1pbmF0aW5nIHByb2Nlc3MuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotfQotCi1FZmZlY3RzRmFjdG9yeUhhbEhpZGw6On5FZmZlY3RzRmFjdG9yeUhhbEhpZGwoKSB7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6cXVlcnlBbGxEZXNjcmlwdG9ycygpIHsKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5nZXRBbGxEZXNjcmlwdG9ycygKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8RWZmZWN0RGVzY3JpcHRvcj4mIHJlc3VsdCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0RGVzY3JpcHRvcnMgPSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgcmV0dXJuIHJldHZhbCA9PSBSZXN1bHQ6Ok9LID8gT0sgOiBOT19JTklUOwotICAgIH0KLSAgICBtTGFzdERlc2NyaXB0b3JzLnJlc2l6ZSgwKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6cXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpwTnVtRWZmZWN0cykgewotICAgIHN0YXR1c190IHF1ZXJ5UmVzdWx0ID0gcXVlcnlBbGxEZXNjcmlwdG9ycygpOwotICAgIGlmIChxdWVyeVJlc3VsdCA9PSBPSykgewotICAgICAgICAqcE51bUVmZmVjdHMgPSBtTGFzdERlc2NyaXB0b3JzLnNpemUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHF1ZXJ5UmVzdWx0OwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmdldERlc2NyaXB0b3IoCi0gICAgICAgIHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgewotICAgIC8vIFRPRE86IFdlIG5lZWQgc29tZWhvdyB0byB0cmFjayB0aGUgY2hhbmdlcyBvbiB0aGUgc2VydmVyIHNpZGUKLSAgICAvLyBvciBmaWd1cmUgb3V0IGhvdyB0byBjb252ZXJ0IGV2ZXJ5Ym9keSB0byBxdWVyeSBhbGwgdGhlIGRlc2NyaXB0b3JzIGF0IG9uY2UuCi0gICAgLy8gVE9ETzogY2hlY2sgZm9yIG51bGxwdHIKLSAgICBpZiAobUxhc3REZXNjcmlwdG9ycy5zaXplKCkgPT0gMCkgewotICAgICAgICBzdGF0dXNfdCBxdWVyeVJlc3VsdCA9IHF1ZXJ5QWxsRGVzY3JpcHRvcnMoKTsKLSAgICAgICAgaWYgKHF1ZXJ5UmVzdWx0ICE9IE9LKSByZXR1cm4gcXVlcnlSZXN1bHQ7Ci0gICAgfQotICAgIGlmIChpbmRleCA+PSBtTGFzdERlc2NyaXB0b3JzLnNpemUoKSkgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwotICAgIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbChtTGFzdERlc2NyaXB0b3JzW2luZGV4XSwgcERlc2NyaXB0b3IpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpnZXREZXNjcmlwdG9yKAotICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKLSAgICAvLyBUT0RPOiBjaGVjayBmb3IgbnVsbHB0cgotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgVXVpZCBoaWRsVXVpZDsKLSAgICBIaWRsVXRpbHM6OnV1aWRGcm9tSGFsKCpwRWZmZWN0VXVpZCwgJmhpZGxVdWlkKTsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+Z2V0RGVzY3JpcHRvcihoaWRsVXVpZCwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0RGVzY3JpcHRvclRvSGFsKHJlc3VsdCwgcERlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmIChyZXQuaXNPaygpKSB7Ci0gICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgcmV0dXJuIE9LOwotICAgICAgICBlbHNlIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUykgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwotICAgICAgICBlbHNlIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Y3JlYXRlRWZmZWN0KAotICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwgaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QgaW9JZCwKLSAgICAgICAgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiAqZWZmZWN0KSB7Ci0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBVdWlkIGhpZGxVdWlkOwotICAgIEhpZGxVdGlsczo6dXVpZEZyb21IYWwoKnBFZmZlY3RVdWlkLCAmaGlkbFV1aWQpOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5jcmVhdGVFZmZlY3QoCi0gICAgICAgICAgICBoaWRsVXVpZCwgc2Vzc2lvbklkLCBpb0lkLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJRWZmZWN0PiYgcmVzdWx0LCB1aW50NjRfdCBlZmZlY3RJZCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICplZmZlY3QgPSBuZXcgRWZmZWN0SGFsSGlkbChyZXN1bHQsIGVmZmVjdElkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHJldHVybiBPSzsKLSAgICAgICAgZWxzZSBpZiAocmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFMpIHJldHVybiBOQU1FX05PVF9GT1VORDsKLSAgICAgICAgZWxzZSByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmR1bXBFZmZlY3RzKGludCBmZCkgewotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7Ci0gICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmRlYnVnRHVtcChoaWRsSGFuZGxlKTsKLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6YWxsb2NhdGVCdWZmZXIoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHJldHVybiBFZmZlY3RCdWZmZXJIYWxIaWRsOjphbGxvY2F0ZShzaXplLCBidWZmZXIpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6Om1pcnJvckJ1ZmZlcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHJldHVybiBFZmZlY3RCdWZmZXJIYWxIaWRsOjptaXJyb3IoZXh0ZXJuYWwsIHNpemUsIGJ1ZmZlcik7Ci19Ci0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmI1NDgxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9ISURMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvMi4wL0lFZmZlY3RzRmFjdG9yeS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzIuMC90eXBlcy5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OkVmZmVjdERlc2NyaXB0b3I7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpJRWZmZWN0c0ZhY3Rvcnk7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLQotY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsIDogcHVibGljIEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKLXsKLSAgcHVibGljOgotICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgZWZmZWN0cyBpbiBhbGwgbG9hZGVkIGxpYnJhcmllcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqcE51bUVmZmVjdHMpOwotCi0gICAgLy8gUmV0dXJucyBhIGRlc2NyaXB0b3Igb2YgdGhlIG5leHQgYXZhaWxhYmxlIGVmZmVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IodWludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsCi0gICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7Ci0KLSAgICAvLyBDcmVhdGVzIGFuIGVmZmVjdCBlbmdpbmUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotICAgIC8vIFRvIHJlbGVhc2UgdGhlIGVmZmVjdCBlbmdpbmUsIGl0IGlzIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMKLSAgICAvLyB0byB0aGUgcmV0dXJuZWQgZWZmZWN0IG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwKLSAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsCi0gICAgICAgICAgICBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+ICplZmZlY3QpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wRWZmZWN0cyhpbnQgZmQpOwotCi0gICAgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXIoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgb3ZlcnJpZGU7Ci0gICAgc3RhdHVzX3QgbWlycm9yQnVmZmVyKHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSBvdmVycmlkZTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTsKLQotICAgIHNwPElFZmZlY3RzRmFjdG9yeT4gbUVmZmVjdHNGYWN0b3J5OwotICAgIGhpZGxfdmVjPEVmZmVjdERlc2NyaXB0b3I+IG1MYXN0RGVzY3JpcHRvcnM7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCk7Ci0gICAgdmlydHVhbCB+RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCk7Ci0KLSAgICBzdGF0dXNfdCBxdWVyeUFsbERlc2NyaXB0b3JzKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyY2JkNDUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlN0cmVhbUhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JU3RyZWFtT3V0Q2FsbGJhY2suaD4KLSNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCi0jaW5jbHVkZSAiU3RyZWFtSGFsSGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0NoYW5uZWxNYXNrOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Gb3JtYXQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpUaHJlYWRJbmZvOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OkF1ZGlvRHJhaW47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbU91dENhbGxiYWNrOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6Ok1lc3NhZ2VRdWV1ZUZsYWdCaXRzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6Ok1tYXBCdWZmZXJJbmZvOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6Ok1tYXBQb3NpdGlvbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpQYXJhbWV0ZXJWYWx1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6VGltZVNwZWM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKLXVzaW5nIFJlYWRDb21tYW5kID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1Jbjo6UmVhZENvbW1hbmQ7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotU3RyZWFtSGFsSGlkbDo6U3RyZWFtSGFsSGlkbChJU3RyZWFtICpzdHJlYW0pCi0gICAgICAgIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIlN0cmVhbSIpLAotICAgICAgICAgIG1TdHJlYW0oc3RyZWFtKSwKLSAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHkoSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUKSwKLSAgICAgICAgICBtQ2FjaGVkQnVmZmVyU2l6ZSgwKXsKLQotICAgIC8vIEluc3RydW1lbnQgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCi0gICAgLy8gTm90ZTogVGhpcyBhc3N1bWVzIGNoYW5uZWwgbWFzaywgZm9ybWF0LCBhbmQgc2FtcGxlIHJhdGUgZG8gbm90IGNoYW5nZSBhZnRlciBjcmVhdGlvbi4KLSAgICBpZiAobVN0cmVhbSAhPSBudWxscHRyICYmIG1TdHJlYW1Qb3dlckxvZy5pc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSkgewotICAgICAgICAvLyBPYnRhaW4gYXVkaW8gcHJvcGVydGllcyAoc2VlIFN0cmVhbUhhbEhpZGw6OmdldEF1ZGlvUHJvcGVydGllcygpIGJlbG93KS4KLSAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgICAgICAgICBbJl0odWludDMyX3Qgc3IsIEF1ZGlvQ2hhbm5lbE1hc2sgbSwgQXVkaW9Gb3JtYXQgZikgewotICAgICAgICAgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KHNyLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpKTsKLSAgICAgICAgICAgIH0pOwotICAgIH0KLX0KLQotU3RyZWFtSGFsSGlkbDo6flN0cmVhbUhhbEhpZGwoKSB7Ci0gICAgbVN0cmVhbSA9IG51bGxwdHI7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRTYW1wbGVSYXRlIiwgbVN0cmVhbS0+Z2V0U2FtcGxlUmF0ZSgpLCByYXRlKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oImdldEJ1ZmZlclNpemUiLCBtU3RyZWFtLT5nZXRCdWZmZXJTaXplKCksIHNpemUpOwotICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgbUNhY2hlZEJ1ZmZlclNpemUgPSAqc2l6ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRDaGFubmVsTWFzayIsIG1TdHJlYW0tPmdldENoYW5uZWxNYXNrKCksIG1hc2spOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZvcm1hdCIsIG1TdHJlYW0tPmdldEZvcm1hdCgpLCBmb3JtYXQpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgICAgIFsmXSh1aW50MzJfdCBzciwgQXVkaW9DaGFubmVsTWFzayBtLCBBdWRpb0Zvcm1hdCBmKSB7Ci0gICAgICAgICAgICAgICAgKnNhbXBsZVJhdGUgPSBzcjsKLSAgICAgICAgICAgICAgICAqbWFzayA9IHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihtKTsKLSAgICAgICAgICAgICAgICAqZm9ybWF0ID0gc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpOwotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEF1ZGlvUHJvcGVydGllcyIsIHJldCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGhpZGxQYXJhbXM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyYW1ldGVyc0Zyb21IYWwoa3ZQYWlycywgJmhpZGxQYXJhbXMpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFBhcmFtZXRlcnMiLCBtU3RyZWFtLT5zZXRQYXJhbWV0ZXJzKGhpZGxQYXJhbXMpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKLSAgICB2YWx1ZXMtPmNsZWFyKCk7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gaGlkbEtleXM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0ga2V5c0Zyb21IYWwoa2V5cywgJmhpZGxLZXlzKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldFBhcmFtZXRlcnMoCi0gICAgICAgICAgICBoaWRsS2V5cywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc1RvSGFsKHBhcmFtZXRlcnMsIHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFBhcmFtZXRlcnMiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImFkZEVmZmVjdCIsIG1TdHJlYW0tPmFkZEVmZmVjdCgKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0SGFsSGlkbCo+KGVmZmVjdC5nZXQoKSktPmVmZmVjdElkKCkpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6cmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicmVtb3ZlRWZmZWN0IiwgbVN0cmVhbS0+cmVtb3ZlRWZmZWN0KAotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RIYWxIaWRsKj4oZWZmZWN0LmdldCgpKS0+ZWZmZWN0SWQoKSkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzdGFuZGJ5KCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0YW5kYnkiLCBtU3RyZWFtLT5zdGFuZGJ5KCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpkdW1wKGludCBmZCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7Ci0gICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5kZWJ1Z0R1bXAoaGlkbEhhbmRsZSk7Ci0gICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7Ci0gICAgbVN0cmVhbVBvd2VyTG9nLmR1bXAoZmQpOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJkdW1wIiwgcmV0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c3RhcnQoKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RhcnQiLCBtU3RyZWFtLT5zdGFydCgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c3RvcCgpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdG9wIiwgbVN0cmVhbS0+c3RvcCgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5jcmVhdGVNbWFwQnVmZmVyKAotICAgICAgICAgICAgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTW1hcEJ1ZmZlckluZm8mIGhpZGxJbmZvKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZSAqaGFuZGxlID0gaGlkbEluZm8uc2hhcmVkTWVtb3J5LmhhbmRsZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlLT5udW1GZHMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zaGFyZWRfbWVtb3J5X2ZkID0gaGFuZGxlLT5kYXRhWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YnVmZmVyX3NpemVfZnJhbWVzID0gaGlkbEluZm8uYnVmZmVyU2l6ZUZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lZ2F0aXZlIGJ1ZmZlciBzaXplIGZyYW1lIHdhcyBhIGhhY2sgaW4gTyBhbmQgUCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kaWNhdGUgdGhhdCB0aGUgYnVmZmVyIGlzIHNoYXJlYWJsZSB0byBhcHBsaWNhdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLT5idWZmZXJfc2l6ZV9mcmFtZXMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YnVmZmVyX3NpemVfZnJhbWVzICo9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmZsYWdzID0gYXVkaW9fbW1hcF9idWZmZXJfZmxhZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmZsYWdzIHwgQVVESU9fTU1BUF9BUFBMSUNBVElPTl9TSEFSRUFCTEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YnVyc3Rfc2l6ZV9mcmFtZXMgPSBoaWRsSW5mby5idXJzdFNpemVGcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmZvLT5zaGFyZWRfbWVtb3J5X2FkZHJlc3MgaXMgbm90IG5lZWRlZCBpbiBISURMIGNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNoYXJlZF9tZW1vcnlfYWRkcmVzcyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJjcmVhdGVNbWFwQnVmZmVyIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSB7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0TW1hcFBvc2l0aW9uKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBNbWFwUG9zaXRpb24mIGhpZGxQb3NpdGlvbikgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLT50aW1lX25hbm9zZWNvbmRzID0gaGlkbFBvc2l0aW9uLnRpbWVOYW5vc2Vjb25kczsKLSAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24tPnBvc2l0aW9uX2ZyYW1lcyA9IGhpZGxQb3NpdGlvbi5wb3NpdGlvbkZyYW1lczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TW1hcFBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQgcHJpb3JpdHkpIHsKLSAgICBtSGFsVGhyZWFkUHJpb3JpdHkgPSBwcmlvcml0eTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldENhY2hlZEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgaWYgKG1DYWNoZWRCdWZmZXJTaXplICE9IDApIHsKLSAgICAgICAgKnNpemUgPSBtQ2FjaGVkQnVmZmVyU2l6ZTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICByZXR1cm4gZ2V0QnVmZmVyU2l6ZShzaXplKTsKLX0KLQotYm9vbCBTdHJlYW1IYWxIaWRsOjpyZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkocGlkX3QgdGhyZWFkUGlkLCBwaWRfdCB0aHJlYWRJZCkgewotICAgIGlmIChtSGFsVGhyZWFkUHJpb3JpdHkgPT0gSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpbnQgZXJyID0gcmVxdWVzdFByaW9yaXR5KAotICAgICAgICAgICAgdGhyZWFkUGlkLCB0aHJlYWRJZCwKLSAgICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eSwgZmFsc2UgLyppc0ZvckFwcCovLCB0cnVlIC8qYXN5bmNocm9ub3VzKi8pOwotICAgIEFMT0dFX0lGKGVyciwgImZhaWxlZCB0byBzZXQgcHJpb3JpdHkgJWQgZm9yIHBpZCAlZCB0aWQgJWQ7IGVycm9yICVkIiwKLSAgICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eSwgdGhyZWFkUGlkLCB0aHJlYWRJZCwgZXJyKTsKLSAgICAvLyBBdWRpbyB3aWxsIHN0aWxsIHdvcmssIGJ1dCBsYXRlbmN5IHdpbGwgYmUgaGlnaGVyIGFuZCBzb21ldGltZXMgdW5hY2NlcHRhYmxlLgotICAgIHJldHVybiBlcnIgPT0gMDsKLX0KLQotbmFtZXNwYWNlIHsKLQotLyogTm90ZXMgb24gY2FsbGJhY2sgb3duZXJzaGlwLgotCi1UaGlzIGlzIGhvdyAoSHcpQmluZGVyIG93bmVyc2hpcCBtb2RlbCBsb29rcyBsaWtlLiBUaGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi1pcyBvd25lZCBieSBCaW5kZXIgZnJhbWV3b3JrICh2aWEgc3A8PikuIFByb3hpZXMgYXJlIG93bmVkIGJ5IGNsaWVudHMuCi1XaGVuIHRoZSBsYXN0IHByb3h5IGRpc2FwcGVhcnMsIEJpbmRlciBmcmFtZXdvcmsgcmVsZWFzZXMgdGhlIHNlcnZlciBpbXBsLgotCi1UaHVzLCBpdCBpcyBub3QgbmVlZGVkIHRvIGtlZXAgYW55IHJlZmVyZW5jZXMgdG8gU3RyZWFtT3V0Q2FsbGJhY2sgKHRoaXMgaXMKLXRoZSBzZXJ2ZXIgaW1wbCkgLS0gaXQgd2lsbCBsaXZlIGFzIGxvbmcgYXMgSEFMIHNlcnZlciBob2xkcyBhIHN0cm9uZyByZWYgdG8KLUlTdHJlYW1PdXRDYWxsYmFjayBwcm94eS4gV2UgY2xlYXIgdGhhdCByZWZlcmVuY2UgYnkgY2FsbGluZyAnY2xlYXJDYWxsYmFjaycKLWZyb20gdGhlIGRlc3RydWN0b3Igb2YgU3RyZWFtT3V0SGFsSGlkbC4KLQotVGhlIGNhbGxiYWNrIG9ubHkga2VlcHMgYSB3ZWFrIHJlZmVyZW5jZSB0byB0aGUgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIG93bmVkCi1ieSBBdWRpb0ZsaW5nZXIuCi0KLSovCi0KLXN0cnVjdCBTdHJlYW1PdXRDYWxsYmFjayA6IHB1YmxpYyBJU3RyZWFtT3V0Q2FsbGJhY2sgewotICAgIFN0cmVhbU91dENhbGxiYWNrKGNvbnN0IHdwPFN0cmVhbU91dEhhbEhpZGw+JiBzdHJlYW0pIDogbVN0cmVhbShzdHJlYW0pIHt9Ci0KLSAgICAvLyBJU3RyZWFtT3V0Q2FsbGJhY2sgaW1wbGVtZW50YXRpb24KLSAgICBSZXR1cm48dm9pZD4gb25Xcml0ZVJlYWR5KCkgIG92ZXJyaWRlIHsKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChzdHJlYW0gIT0gMCkgewotICAgICAgICAgICAgc3RyZWFtLT5vbldyaXRlUmVhZHkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLQotICAgIFJldHVybjx2b2lkPiBvbkRyYWluUmVhZHkoKSAgb3ZlcnJpZGUgewotICAgICAgICBzcDxTdHJlYW1PdXRIYWxIaWRsPiBzdHJlYW0gPSBtU3RyZWFtLnByb21vdGUoKTsKLSAgICAgICAgaWYgKHN0cmVhbSAhPSAwKSB7Ci0gICAgICAgICAgICBzdHJlYW0tPm9uRHJhaW5SZWFkeSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gICAgUmV0dXJuPHZvaWQ+IG9uRXJyb3IoKSAgb3ZlcnJpZGUgewotICAgICAgICBzcDxTdHJlYW1PdXRIYWxIaWRsPiBzdHJlYW0gPSBtU3RyZWFtLnByb21vdGUoKTsKLSAgICAgICAgaWYgKHN0cmVhbSAhPSAwKSB7Ci0gICAgICAgICAgICBzdHJlYW0tPm9uRXJyb3IoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLQotICBwcml2YXRlOgotICAgIHdwPFN0cmVhbU91dEhhbEhpZGw+IG1TdHJlYW07Ci19OwotCi19ICAvLyBuYW1lc3BhY2UKLQotU3RyZWFtT3V0SGFsSGlkbDo6U3RyZWFtT3V0SGFsSGlkbChjb25zdCBzcDxJU3RyZWFtT3V0PiYgc3RyZWFtKQotICAgICAgICA6IFN0cmVhbUhhbEhpZGwoc3RyZWFtLmdldCgpKSwgbVN0cmVhbShzdHJlYW0pLCBtV3JpdGVyQ2xpZW50KDApLCBtRWZHcm91cChudWxscHRyKSB7Ci19Ci0KLVN0cmVhbU91dEhhbEhpZGw6On5TdHJlYW1PdXRIYWxIaWRsKCkgewotICAgIGlmIChtU3RyZWFtICE9IDApIHsKLSAgICAgICAgaWYgKG1DYWxsYmFjay51bnNhZmVfZ2V0KCkpIHsKLSAgICAgICAgICAgIHByb2Nlc3NSZXR1cm4oImNsZWFyQ2FsbGJhY2siLCBtU3RyZWFtLT5jbGVhckNhbGxiYWNrKCkpOwotICAgICAgICB9Ci0gICAgICAgIHByb2Nlc3NSZXR1cm4oImNsb3NlIiwgbVN0cmVhbS0+Y2xvc2UoKSk7Ci0gICAgICAgIG1TdHJlYW0uY2xlYXIoKTsKLSAgICB9Ci0gICAgbUNhbGxiYWNrLmNsZWFyKCk7Ci0gICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLSAgICBpZiAobUVmR3JvdXApIHsKLSAgICAgICAgRXZlbnRGbGFnOjpkZWxldGVFdmVudEZsYWcoJm1FZkdyb3VwKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0RnJhbWVTaXplIiwgbVN0cmVhbS0+Z2V0RnJhbWVTaXplKCksIHNpemUpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1Xcml0ZXJDbGllbnQgPT0gZ2V0dGlkKCkgJiYgbUNvbW1hbmRNUSkgewotICAgICAgICByZXR1cm4gY2FsbFdyaXRlclRocmVhZCgKLSAgICAgICAgICAgICAgICBXcml0ZUNvbW1hbmQ6OkdFVF9MQVRFTkNZLCAiZ2V0TGF0ZW5jeSIsIG51bGxwdHIsIDAsCi0gICAgICAgICAgICAgICAgWyZdKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICAqbGF0ZW5jeSA9IHdyaXRlU3RhdHVzLnJlcGx5LmxhdGVuY3lNczsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TGF0ZW5jeSIsIG1TdHJlYW0tPmdldExhdGVuY3koKSwgbGF0ZW5jeSk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0Vm9sdW1lIiwgbVN0cmVhbS0+c2V0Vm9sdW1lKGxlZnQsIHJpZ2h0KSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OndyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICAqd3JpdHRlbiA9IDA7Ci0KLSAgICBpZiAoYnl0ZXMgPT0gMCAmJiAhbURhdGFNUSkgewotICAgICAgICAvLyBDYW4ndCBkZXRlcm1pbmUgdGhlIHNpemUgZm9yIHRoZSBNUSBidWZmZXIuIFdhaXQgZm9yIGEgbm9uLWVtcHR5IHdyaXRlIHJlcXVlc3QuCi0gICAgICAgIEFMT0dXX0lGKG1DYWxsYmFjay51bnNhZmVfZ2V0KCksICJGaXJzdCBjYWxsIHRvIGFzeW5jIHdyaXRlIHdpdGggMCBieXRlcyIpOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmICghbURhdGFNUSkgewotICAgICAgICAvLyBJbiBjYXNlIGlmIHBsYXliYWNrIHN0YXJ0cyBjbG9zZSB0byB0aGUgZW5kIG9mIGEgY29tcHJlc3NlZCB0cmFjaywgdGhlIGJ5dGVzCi0gICAgICAgIC8vIHRoYXQgbmVlZCB0byBiZSB3cml0dGVuIGlzIGxlc3MgdGhhbiB0aGUgYWN0dWFsIGJ1ZmZlciBzaXplLiBOZWVkIHRvIHVzZQotICAgICAgICAvLyBmdWxsIGJ1ZmZlciBzaXplIGZvciB0aGUgTVEgc2luY2Ugb3RoZXJ3aXNlIGFmdGVyIHNlZWtpbmcgYmFjayB0byB0aGUgbWlkZGxlCi0gICAgICAgIC8vIGRhdGEgd2lsbCBiZSB0cnVuY2F0ZWQuCi0gICAgICAgIHNpemVfdCBidWZmZXJTaXplOwotICAgICAgICBpZiAoKHN0YXR1cyA9IGdldENhY2hlZEJ1ZmZlclNpemUoJmJ1ZmZlclNpemUpKSAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnl0ZXMgPiBidWZmZXJTaXplKSBidWZmZXJTaXplID0gYnl0ZXM7Ci0gICAgICAgIGlmICgoc3RhdHVzID0gcHJlcGFyZUZvcldyaXRpbmcoYnVmZmVyU2l6ZSkpICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdHVzID0gY2FsbFdyaXRlclRocmVhZCgKLSAgICAgICAgICAgIFdyaXRlQ29tbWFuZDo6V1JJVEUsICJ3cml0ZSIsIHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QqPihidWZmZXIpLCBieXRlcywKLSAgICAgICAgICAgIFsmXSAoY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgKndyaXR0ZW4gPSB3cml0ZVN0YXR1cy5yZXBseS53cml0dGVuOwotICAgICAgICAgICAgICAgIC8vIERpYWdub3N0aWNzIG9mIHRoZSBjYXVzZSBvZiBiLzM1ODEzMTEzLgotICAgICAgICAgICAgICAgIEFMT0dFX0lGKCp3cml0dGVuID4gYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAiaGFsIHJlcG9ydHMgbW9yZSBieXRlcyB3cml0dGVuIHRoYW4gYXNrZWQgZm9yOiAlbGxkID4gJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSp3cml0dGVuLCAobG9uZyBsb25nKWJ5dGVzKTsKLSAgICAgICAgICAgIH0pOwotICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqd3JpdHRlbik7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Y2FsbFdyaXRlclRocmVhZCgKLSAgICAgICAgV3JpdGVDb21tYW5kIGNtZCwgY29uc3QgY2hhciogY21kTmFtZSwKLSAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFTaXplLCBTdHJlYW1PdXRIYWxIaWRsOjpXcml0ZXJDYWxsYmFjayBjYWxsYmFjaykgewotICAgIGlmICghbUNvbW1hbmRNUS0+d3JpdGUoJmNtZCkpIHsKLSAgICAgICAgQUxPR0UoImNvbW1hbmQgbWVzc2FnZSBxdWV1ZSB3cml0ZSBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOwotICAgICAgICByZXR1cm4gLUVBR0FJTjsKLSAgICB9Ci0gICAgaWYgKGRhdGEgIT0gbnVsbHB0cikgewotICAgICAgICBzaXplX3QgYXZhaWxhYmxlVG9Xcml0ZSA9IG1EYXRhTVEtPmF2YWlsYWJsZVRvV3JpdGUoKTsKLSAgICAgICAgaWYgKGRhdGFTaXplID4gYXZhaWxhYmxlVG9Xcml0ZSkgewotICAgICAgICAgICAgQUxPR1coInRydW5jYXRpbmcgd3JpdGUgZGF0YSBmcm9tICVsbGQgdG8gJWxsZCBkdWUgdG8gaW5zdWZmaWNpZW50IGRhdGEgcXVldWUgc3BhY2UiLAotICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWRhdGFTaXplLCAobG9uZyBsb25nKWF2YWlsYWJsZVRvV3JpdGUpOwotICAgICAgICAgICAgZGF0YVNpemUgPSBhdmFpbGFibGVUb1dyaXRlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbURhdGFNUS0+d3JpdGUoZGF0YSwgZGF0YVNpemUpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZGF0YSBtZXNzYWdlIHF1ZXVlIHdyaXRlIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbUVmR3JvdXAtPndha2Uoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpKTsKLQotICAgIC8vIFRPRE86IFJlbW92ZSBtYW51YWwgZXZlbnQgZmxhZyBoYW5kbGluZyBvbmNlIGJsb2NraW5nIE1RIGlzIGltcGxlbWVudGVkLiBiLzMzODE1NDIyCi0gICAgdWludDMyX3QgZWZTdGF0ZSA9IDA7Ci1yZXRyeToKLSAgICBzdGF0dXNfdCByZXQgPSBtRWZHcm91cC0+d2FpdChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSwgJmVmU3RhdGUpOwotICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRlVMTCkpIHsKLSAgICAgICAgV3JpdGVTdGF0dXMgd3JpdGVTdGF0dXM7Ci0gICAgICAgIHdyaXRlU3RhdHVzLnJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgICAgICBpZiAoIW1TdGF0dXNNUS0+cmVhZCgmd3JpdGVTdGF0dXMpKSB7Ci0gICAgICAgICAgICBBTE9HRSgic3RhdHVzIG1lc3NhZ2UgcmVhZCBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3cml0ZVN0YXR1cy5yZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgcmV0ID0gT0s7Ci0gICAgICAgICAgICBjYWxsYmFjayh3cml0ZVN0YXR1cyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXQgPSBwcm9jZXNzUmV0dXJuKGNtZE5hbWUsIHdyaXRlU3RhdHVzLnJldHZhbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKLSAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCi0gICAgICAgIGdvdG8gcmV0cnk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnByZXBhcmVGb3JXcml0aW5nKHNpemVfdCBidWZmZXJTaXplKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gdGVtcENvbW1hbmRNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiB0ZW1wRGF0YU1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gdGVtcFN0YXR1c01ROwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgcGlkX3QgaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPnByZXBhcmVGb3JXcml0aW5nKAotICAgICAgICAgICAgMSwgYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tbWFuZE1ROjpEZXNjcmlwdG9yJiBjb21tYW5kTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFNUTo6RGVzY3JpcHRvciYgZGF0YU1RLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGF0dXNNUTo6RGVzY3JpcHRvciYgc3RhdHVzTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmVhZEluZm8mIGhhbFRocmVhZEluZm8pIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICB0ZW1wQ29tbWFuZE1RLnJlc2V0KG5ldyBDb21tYW5kTVEoY29tbWFuZE1RKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBEYXRhTVEucmVzZXQobmV3IERhdGFNUShkYXRhTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcFN0YXR1c01RLnJlc2V0KG5ldyBTdGF0dXNNUShzdGF0dXNNUSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAodGVtcERhdGFNUS0+aXNWYWxpZCgpICYmIHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRGbGFnOjpjcmVhdGVFdmVudEZsYWcodGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpLCAmbUVmR3JvdXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFBpZCA9IGhhbFRocmVhZEluZm8ucGlkOwotICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRUaWQgPSBoYWxUaHJlYWRJbmZvLnRpZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAoIXJldC5pc09rKCkgfHwgcmV0dmFsICE9IFJlc3VsdDo6T0spIHsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInByZXBhcmVGb3JXcml0aW5nIiwgcmV0LCByZXR2YWwpOwotICAgIH0KLSAgICBpZiAoIXRlbXBDb21tYW5kTVEgfHwgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIXRlbXBEYXRhTVEgfHwgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIXRlbXBTdGF0dXNNUSB8fCAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgfHwKLSAgICAgICAgICAgICFtRWZHcm91cCkgewotICAgICAgICBBTE9HRV9JRighdGVtcENvbW1hbmRNUSwgIkZhaWxlZCB0byBvYnRhaW4gY29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBDb21tYW5kTVEgJiYgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSwKLSAgICAgICAgICAgICAgICAiQ29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIXRlbXBEYXRhTVEsICJGYWlsZWQgdG8gb2J0YWluIGRhdGEgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wRGF0YU1RICYmICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCksICJEYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIHdyaXRpbmcgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkoaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQpOwotCi0gICAgbUNvbW1hbmRNUSA9IHN0ZDo6bW92ZSh0ZW1wQ29tbWFuZE1RKTsKLSAgICBtRGF0YU1RID0gc3RkOjptb3ZlKHRlbXBEYXRhTVEpOwotICAgIG1TdGF0dXNNUSA9IHN0ZDo6bW92ZSh0ZW1wU3RhdHVzTVEpOwotICAgIG1Xcml0ZXJDbGllbnQgPSBnZXR0aWQoKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRSZW5kZXJQb3NpdGlvbigKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDMyX3QgZCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpkc3BGcmFtZXMgPSBkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRSZW5kZXJQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldE5leHRXcml0ZVRpbWVzdGFtcCgKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgaW50NjRfdCB0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnRpbWVzdGFtcCA9IHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFJlbmRlclBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwcm9jZXNzUmV0dXJuKAotICAgICAgICAgICAgInNldENhbGxiYWNrIiwgbVN0cmVhbS0+c2V0Q2FsbGJhY2sobmV3IFN0cmVhbU91dENhbGxiYWNrKHRoaXMpKSk7Ci0gICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5zdXBwb3J0c1BhdXNlQW5kUmVzdW1lKAotICAgICAgICAgICAgWyZdKGJvb2wgcCwgYm9vbCByKSB7Ci0gICAgICAgICAgICAgICAgKnN1cHBvcnRzUGF1c2UgPSBwOwotICAgICAgICAgICAgICAgICpzdXBwb3J0c1Jlc3VtZSA9IHI7Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNQYXVzZUFuZFJlc3VtZSIsIHJldCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnBhdXNlKCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwYXVzZSIsIG1TdHJlYW0tPnBhdXNlKCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpyZXN1bWUoKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+cmVzdW1lKCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNEcmFpbiIsIG1TdHJlYW0tPnN1cHBvcnRzRHJhaW4oKSwgc3VwcG9ydHNEcmFpbik7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmRyYWluKGJvb2wgZWFybHlOb3RpZnkpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigKLSAgICAgICAgICAgICJkcmFpbiIsIG1TdHJlYW0tPmRyYWluKGVhcmx5Tm90aWZ5ID8gQXVkaW9EcmFpbjo6RUFSTFlfTk9USUZZIDogQXVkaW9EcmFpbjo6QUxMKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmZsdXNoKCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwYXVzZSIsIG1TdHJlYW0tPmZsdXNoKCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtV3JpdGVyQ2xpZW50ID09IGdldHRpZCgpICYmIG1Db21tYW5kTVEpIHsKLSAgICAgICAgcmV0dXJuIGNhbGxXcml0ZXJUaHJlYWQoCi0gICAgICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpHRVRfUFJFU0VOVEFUSU9OX1BPU0lUSU9OLCAiZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24iLCBudWxscHRyLCAwLAotICAgICAgICAgICAgICAgIFsmXShjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IHdyaXRlU3RhdHVzLnJlcGx5LnByZXNlbnRhdGlvblBvc2l0aW9uLmZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9zZWMgPSB3cml0ZVN0YXR1cy5yZXBseS5wcmVzZW50YXRpb25Qb3NpdGlvbi50aW1lU3RhbXAudHZTZWM7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfbnNlYyA9IHdyaXRlU3RhdHVzLnJlcGx5LnByZXNlbnRhdGlvblBvc2l0aW9uLnRpbWVTdGFtcC50dk5TZWM7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgUmVzdWx0IHJldHZhbDsKLSAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldFByZXNlbnRhdGlvblBvc2l0aW9uKAotICAgICAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDY0X3QgaGlkbEZyYW1lcywgY29uc3QgVGltZVNwZWMmIGhpZGxUaW1lU3RhbXApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gaGlkbEZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfc2VjID0gaGlkbFRpbWVTdGFtcC50dlNlYzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfbnNlYyA9IGhpZGxUaW1lU3RhbXAudHZOU2VjOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRQcmVzZW50YXRpb25Qb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiAvKiBzb3VyY2VNZXRhZGF0YSAqLykgewotICAgIC8vIEF1ZGlvIEhBTCBWMi4wIGRvZXMgbm90IHN1cHBvcnQgcHJvcGFnYXRpbmcgc291cmNlIG1ldGFkYXRhCi0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi12b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uV3JpdGVSZWFkeSgpIHsKLSAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOwotICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47Ci0gICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25Xcml0ZVJlYWR5Iik7Ci0gICAgY2FsbGJhY2stPm9uV3JpdGVSZWFkeSgpOwotfQotCi12b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uRHJhaW5SZWFkeSgpIHsKLSAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOwotICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47Ci0gICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25EcmFpblJlYWR5Iik7Ci0gICAgY2FsbGJhY2stPm9uRHJhaW5SZWFkeSgpOwotfQotCi12b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uRXJyb3IoKSB7Ci0gICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKLSAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOwotICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uRXJyb3IiKTsKLSAgICBjYWxsYmFjay0+b25FcnJvcigpOwotfQotCi0KLVN0cmVhbUluSGFsSGlkbDo6U3RyZWFtSW5IYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1Jbj4mIHN0cmVhbSkKLSAgICAgICAgOiBTdHJlYW1IYWxIaWRsKHN0cmVhbS5nZXQoKSksIG1TdHJlYW0oc3RyZWFtKSwgbVJlYWRlckNsaWVudCgwKSwgbUVmR3JvdXAobnVsbHB0cikgewotfQotCi1TdHJlYW1JbkhhbEhpZGw6On5TdHJlYW1JbkhhbEhpZGwoKSB7Ci0gICAgaWYgKG1TdHJlYW0gIT0gMCkgewotICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbG9zZSIsIG1TdHJlYW0tPmNsb3NlKCkpOwotICAgICAgICBtU3RyZWFtLmNsZWFyKCk7Ci0gICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgfQotICAgIGlmIChtRWZHcm91cCkgewotICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZyYW1lU2l6ZSIsIG1TdHJlYW0tPmdldEZyYW1lU2l6ZSgpLCBzaXplKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpzZXRHYWluKGZsb2F0IGdhaW4pIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0R2FpbiIsIG1TdHJlYW0tPnNldEdhaW4oZ2FpbikpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgICpyZWFkID0gMDsKLQotICAgIGlmIChieXRlcyA9PSAwICYmICFtRGF0YU1RKSB7Ci0gICAgICAgIC8vIENhbid0IGRldGVybWluZSB0aGUgc2l6ZSBmb3IgdGhlIE1RIGJ1ZmZlci4gV2FpdCBmb3IgYSBub24tZW1wdHkgcmVhZCByZXF1ZXN0LgotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmICghbURhdGFNUSAmJiAoc3RhdHVzID0gcHJlcGFyZUZvclJlYWRpbmcoYnl0ZXMpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKLSAgICBwYXJhbXMuY29tbWFuZCA9IFJlYWRDb21tYW5kOjpSRUFEOwotICAgIHBhcmFtcy5wYXJhbXMucmVhZCA9IGJ5dGVzOwotICAgIHN0YXR1cyA9IGNhbGxSZWFkZXJUaHJlYWQocGFyYW1zLCAicmVhZCIsCi0gICAgICAgICAgICBbJl0oY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cykgewotICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhdmFpbFRvUmVhZCA9IG1EYXRhTVEtPmF2YWlsYWJsZVRvUmVhZCgpOwotICAgICAgICAgICAgICAgIGlmICghbURhdGFNUS0+cmVhZChzdGF0aWNfY2FzdDx1aW50OF90Kj4oYnVmZmVyKSwgc3RkOjptaW4oYnl0ZXMsIGF2YWlsVG9SZWFkKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImRhdGEgbWVzc2FnZSBxdWV1ZSByZWFkIGZhaWxlZCBmb3IgXCJyZWFkXCIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQUxPR1dfSUYoYXZhaWxUb1JlYWQgIT0gcmVhZFN0YXR1cy5yZXBseS5yZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgIkhBTCByZWFkIHJlcG9ydCBpbmNvbnNpc3RlbnQ6IG1xID0gJWQsIHN0YXR1cyA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KWF2YWlsVG9SZWFkLCAoaW50MzJfdClyZWFkU3RhdHVzLnJlcGx5LnJlYWQpOwotICAgICAgICAgICAgICAgICpyZWFkID0gcmVhZFN0YXR1cy5yZXBseS5yZWFkOwotICAgICAgICAgICAgfSk7Ci0gICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICpyZWFkKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmNhbGxSZWFkZXJUaHJlYWQoCi0gICAgICAgIGNvbnN0IFJlYWRQYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCi0gICAgICAgIFN0cmVhbUluSGFsSGlkbDo6UmVhZGVyQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICBpZiAoIW1Db21tYW5kTVEtPndyaXRlKCZwYXJhbXMpKSB7Ci0gICAgICAgIEFMT0dXKCJjb21tYW5kIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiAtRUFHQUlOOwotICAgIH0KLSAgICBtRWZHcm91cC0+d2FrZShzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSk7Ci0KLSAgICAvLyBUT0RPOiBSZW1vdmUgbWFudWFsIGV2ZW50IGZsYWcgaGFuZGxpbmcgb25jZSBibG9ja2luZyBNUSBpcyBpbXBsZW1lbnRlZC4gYi8zMzgxNTQyMgotICAgIHVpbnQzMl90IGVmU3RhdGUgPSAwOwotcmV0cnk6Ci0gICAgc3RhdHVzX3QgcmV0ID0gbUVmR3JvdXAtPndhaXQoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpLCAmZWZTdGF0ZSk7Ci0gICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9FTVBUWSkpIHsKLSAgICAgICAgUmVhZFN0YXR1cyByZWFkU3RhdHVzOwotICAgICAgICByZWFkU3RhdHVzLnJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgICAgICBpZiAoIW1TdGF0dXNNUS0+cmVhZCgmcmVhZFN0YXR1cykpIHsKLSAgICAgICAgICAgIEFMT0dFKCJzdGF0dXMgbWVzc2FnZSByZWFkIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgIGlmIChyZWFkU3RhdHVzLnJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICByZXQgPSBPSzsKLSAgICAgICAgICAgIGNhbGxiYWNrKHJlYWRTdGF0dXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0ID0gcHJvY2Vzc1JldHVybihjbWROYW1lLCByZWFkU3RhdHVzLnJldHZhbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKLSAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCi0gICAgICAgIGdvdG8gcmV0cnk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6cHJlcGFyZUZvclJlYWRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiB0ZW1wQ29tbWFuZE1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IHRlbXBEYXRhTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBwaWRfdCBoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+cHJlcGFyZUZvclJlYWRpbmcoCi0gICAgICAgICAgICAxLCBidWZmZXJTaXplLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tYW5kTVE6OkRlc2NyaXB0b3ImIGNvbW1hbmRNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YU1ROjpEZXNjcmlwdG9yJiBkYXRhTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXR1c01ROjpEZXNjcmlwdG9yJiBzdGF0dXNNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyZWFkSW5mbyYgaGFsVGhyZWFkSW5mbykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBDb21tYW5kTVEucmVzZXQobmV3IENvbW1hbmRNUShjb21tYW5kTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcERhdGFNUS5yZXNldChuZXcgRGF0YU1RKGRhdGFNUSkpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgJiYgdGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkUGlkID0gaGFsVGhyZWFkSW5mby5waWQ7Ci0gICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFRpZCA9IGhhbFRocmVhZEluZm8udGlkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgewotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicHJlcGFyZUZvclJlYWRpbmciLCByZXQsIHJldHZhbCk7Ci0gICAgfQotICAgIGlmICghdGVtcENvbW1hbmRNUSB8fCAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhdGVtcERhdGFNUSB8fCAhdGVtcERhdGFNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIW1FZkdyb3VwKSB7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wQ29tbWFuZE1RLCAiRmFpbGVkIHRvIG9idGFpbiBjb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcENvbW1hbmRNUSAmJiAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJDb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighdGVtcERhdGFNUSwgIkZhaWxlZCB0byBvYnRhaW4gZGF0YSBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBEYXRhTVEgJiYgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSwgIkRhdGEgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCi0gICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3IgcmVhZGluZyBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZCk7Ci0KLSAgICBtQ29tbWFuZE1RID0gc3RkOjptb3ZlKHRlbXBDb21tYW5kTVEpOwotICAgIG1EYXRhTVEgPSBzdGQ6Om1vdmUodGVtcERhdGFNUSk7Ci0gICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7Ci0gICAgbVJlYWRlckNsaWVudCA9IGdldHRpZCgpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0SW5wdXRGcmFtZXNMb3N0IiwgbVN0cmVhbS0+Z2V0SW5wdXRGcmFtZXNMb3N0KCksIGZyYW1lc0xvc3QpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVJlYWRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7Ci0gICAgICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKLSAgICAgICAgcGFyYW1zLmNvbW1hbmQgPSBSZWFkQ29tbWFuZDo6R0VUX0NBUFRVUkVfUE9TSVRJT047Ci0gICAgICAgIHJldHVybiBjYWxsUmVhZGVyVGhyZWFkKHBhcmFtcywgImdldENhcHR1cmVQb3NpdGlvbiIsCi0gICAgICAgICAgICAgICAgWyZdKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IHJlYWRTdGF0dXMucmVwbHkuY2FwdHVyZVBvc2l0aW9uLmZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgKnRpbWUgPSByZWFkU3RhdHVzLnJlcGx5LmNhcHR1cmVQb3NpdGlvbi50aW1lOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRDYXB0dXJlUG9zaXRpb24oCi0gICAgICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBoaWRsRnJhbWVzLCB1aW50NjRfdCBoaWRsVGltZSkgewotICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSBoaWRsRnJhbWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgKnRpbWUgPSBoaWRsVGltZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0Q2FwdHVyZVBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKLSAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMgX191bnVzZWQpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6dXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgLyogc2lua01ldGFkYXRhICovKSB7Ci0gICAgLy8gQXVkaW8gSEFMIFYyLjAgZG9lcyBub3Qgc3VwcG9ydCBwcm9wYWdhdGluZyBzaW5rIG1ldGFkYXRhCi0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJhZDhhZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfSAotCi0jaW5jbHVkZSA8YXRvbWljPgotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSVN0cmVhbS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lTdHJlYW1Jbi5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lTdHJlYW1PdXQuaD4KLSNpbmNsdWRlIDxmbXEvRXZlbnRGbGFnLmg+Ci0jaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJTdHJlYW1Qb3dlckxvZy5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtSW47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbU91dDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OkV2ZW50RmxhZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIFJlYWRQYXJhbWV0ZXJzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1Jbjo6UmVhZFBhcmFtZXRlcnM7Ci11c2luZyBSZWFkU3RhdHVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1Jbjo6UmVhZFN0YXR1czsKLXVzaW5nIFdyaXRlQ29tbWFuZCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtT3V0OjpXcml0ZUNvbW1hbmQ7Ci11c2luZyBXcml0ZVN0YXR1cyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtT3V0OjpXcml0ZVN0YXR1czsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEZXZpY2VIYWxIaWRsOwotCi1jbGFzcyBTdHJlYW1IYWxIaWRsIDogcHVibGljIHZpcnR1YWwgU3RyZWFtSGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKLXsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgc2FtcGxpbmcgcmF0ZSBpbiBIeiAtIGVnLiA0NDEwMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpOwotCi0gICAgLy8gUmV0dXJuIHNpemUgb2YgaW5wdXQvb3V0cHV0IGJ1ZmZlciBpbiBieXRlcyBmb3IgdGhpcyBzdHJlYW0gLSBlZy4gNDgwMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIFJldHVybiB0aGUgY2hhbm5lbCBtYXNrLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBmb3JtYXQgLSBlLmcuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOwotCi0gICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKLQotICAgIC8vIFNldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7Ci0KLSAgICAvLyBHZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7Ci0KLSAgICAvLyBBZGQgb3IgcmVtb3ZlIHRoZSBlZmZlY3Qgb24gdGhlIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOwotCi0gICAgLy8gUHV0IHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dC9vdXRwdXQgaW50byBzdGFuZGJ5IG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFuZGJ5KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKLQotICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwotCi0gICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotCi0gICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7Ci0KLSAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7Ci0KLSAgICAvLyBTZXQgdGhlIHByaW9yaXR5IG9mIHRoZSB0aHJlYWQgdGhhdCBpbnRlcmFjdHMgd2l0aCB0aGUgSEFMCi0gICAgLy8gKG11c3QgbWF0Y2ggdGhlIHByaW9yaXR5IG9mIHRoZSBhdWRpb2ZsaW5nZXIncyB0aHJlYWQgdGhhdCBjYWxscyAncmVhZCcgLyAnd3JpdGUnKQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KTsKLQotICBwcm90ZWN0ZWQ6Ci0gICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgZXhwbGljaXQgU3RyZWFtSGFsSGlkbChJU3RyZWFtICpzdHJlYW0pOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIHN0cmVhbS4KLSAgICB2aXJ0dWFsIH5TdHJlYW1IYWxIaWRsKCk7Ci0KLSAgICBzdGF0dXNfdCBnZXRDYWNoZWRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICBib29sIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShwaWRfdCB0aHJlYWRQaWQsIHBpZF90IHRocmVhZElkKTsKLQotICAgIC8vIG1TdHJlYW1Qb3dlckxvZyBpcyB1c2VkIGZvciBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KLSAgICBTdHJlYW1Qb3dlckxvZyBtU3RyZWFtUG93ZXJMb2c7Ci0KLSAgcHJpdmF0ZToKLSAgICBjb25zdCBpbnQgSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUID0gLTE7Ci0gICAgSVN0cmVhbSAqbVN0cmVhbTsKLSAgICBpbnQgbUhhbFRocmVhZFByaW9yaXR5OwotICAgIHNpemVfdCBtQ2FjaGVkQnVmZmVyU2l6ZTsKLX07Ci0KLWNsYXNzIFN0cmVhbU91dEhhbEhpZGwgOiBwdWJsaWMgU3RyZWFtT3V0SGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsSGlkbCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBoYXJkd2FyZSBkcml2ZXIgZXN0aW1hdGVkIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSk7Ci0KLSAgICAvLyBVc2UgdGhpcyBtZXRob2QgaW4gc2l0dWF0aW9ucyB3aGVyZSBhdWRpbyBtaXhpbmcgaXMgZG9uZSBpbiB0aGUgaGFyZHdhcmUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOwotCi0gICAgLy8gV3JpdGUgYXVkaW8gYnVmZmVyIHRvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pOwotCi0gICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdyaXR0ZW4gYnkgdGhlIGF1ZGlvIGRzcCB0byBEQUMgc2luY2UKLSAgICAvLyB0aGUgb3V0cHV0IGhhcyBleGl0ZWQgc3RhbmRieS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpOwotCi0gICAgLy8gR2V0IHRoZSBsb2NhbCB0aW1lIGF0IHdoaWNoIHRoZSBuZXh0IHdyaXRlIHRvIHRoZSBhdWRpbyBkcml2ZXIgd2lsbCBiZSBwcmVzZW50ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKTsKLQotICAgIC8vIFNldCB0aGUgY2FsbGJhY2sgZm9yIG5vdGlmeWluZyBjb21wbGV0aW9uIG9mIG5vbi1ibG9ja2luZyB3cml0ZSBhbmQgZHJhaW4uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIHBhdXNlIGFuZCByZXN1bWUgb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3VtZSgpOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIGRyYWluIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pOwotCi0gICAgLy8gUmVxdWVzdHMgbm90aWZpY2F0aW9uIHdoZW4gZGF0YSBidWZmZXJlZCBieSB0aGUgZHJpdmVyL2hhcmR3YXJlIGhhcyBiZWVuIHBsYXllZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRyYWluKGJvb2wgZWFybHlOb3RpZnkpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byBmbHVzaCB0aGUgcXVldWVkIGRhdGEuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpOwotCi0gICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHByZXNlbnRlZCB0byBhbiBleHRlcm5hbCBvYnNlcnZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc291cmNlIGhhcyBiZWVuIGNoYW5nZWQuCi0gICAgc3RhdHVzX3QgdXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSBvdmVycmlkZTsKLQotICAgIC8vIE1ldGhvZHMgdXNlZCBieSBTdHJlYW1PdXRDYWxsYmFjayAoSElETCkuCi0gICAgdm9pZCBvbldyaXRlUmVhZHkoKTsKLSAgICB2b2lkIG9uRHJhaW5SZWFkeSgpOwotICAgIHZvaWQgb25FcnJvcigpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZUhhbEhpZGw7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8V3JpdGVDb21tYW5kLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gQ29tbWFuZE1ROwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBEYXRhTVE7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8V3JpdGVTdGF0dXMsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBTdGF0dXNNUTsKLQotICAgIHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBtQ2FsbGJhY2s7Ci0gICAgc3A8SVN0cmVhbU91dD4gbVN0cmVhbTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiBtQ29tbWFuZE1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IG1EYXRhTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7Ci0gICAgc3RkOjphdG9taWM8cGlkX3Q+IG1Xcml0ZXJDbGllbnQ7Ci0gICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBTdHJlYW1PdXRIYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1PdXQ+JiBzdHJlYW0pOwotCi0gICAgdmlydHVhbCB+U3RyZWFtT3V0SGFsSGlkbCgpOwotCi0gICAgdXNpbmcgV3JpdGVyQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKT47Ci0gICAgc3RhdHVzX3QgY2FsbFdyaXRlclRocmVhZCgKLSAgICAgICAgICAgIFdyaXRlQ29tbWFuZCBjbWQsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCi0gICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YVNpemUsIFdyaXRlckNhbGxiYWNrIGNhbGxiYWNrKTsKLSAgICBzdGF0dXNfdCBwcmVwYXJlRm9yV3JpdGluZyhzaXplX3QgYnVmZmVyU2l6ZSk7Ci19OwotCi1jbGFzcyBTdHJlYW1JbkhhbEhpZGwgOiBwdWJsaWMgU3RyZWFtSW5IYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxIaWRsIHsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBTZXQgdGhlIGlucHV0IGdhaW4gZm9yIHRoZSBhdWRpbyBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRHYWluKGZsb2F0IGdhaW4pOwotCi0gICAgLy8gUmVhZCBhdWRpbyBidWZmZXIgaW4gZnJvbSBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhbW91bnQgb2YgaW5wdXQgZnJhbWVzIGxvc3QgaW4gdGhlIGF1ZGlvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCk7Ci0KLSAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcmVjZWl2ZWQgYW5kCi0gICAgLy8gdGhlIGNsb2NrIHRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZnJhbWUgY291bnQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKTsKLQotICAgIC8vIEdldCBhY3RpdmUgbWljcm9waG9uZXMKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc2luayBoYXMgYmVlbiBjaGFuZ2VkLgotICAgIHN0YXR1c190IHVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsSGlkbDsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxSZWFkUGFyYW1ldGVycywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IENvbW1hbmRNUTsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gRGF0YU1ROwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFJlYWRTdGF0dXMsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBTdGF0dXNNUTsKLQotICAgIHNwPElTdHJlYW1Jbj4gbVN0cmVhbTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiBtQ29tbWFuZE1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IG1EYXRhTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7Ci0gICAgc3RkOjphdG9taWM8cGlkX3Q+IG1SZWFkZXJDbGllbnQ7Ci0gICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBTdHJlYW1JbkhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbUluPiYgc3RyZWFtKTsKLQotICAgIHZpcnR1YWwgflN0cmVhbUluSGFsSGlkbCgpOwotCi0gICAgdXNpbmcgUmVhZGVyQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cyk+OwotICAgIHN0YXR1c190IGNhbGxSZWFkZXJUaHJlYWQoCi0gICAgICAgICAgICBjb25zdCBSZWFkUGFyYW1ldGVycyYgcGFyYW1zLCBjb25zdCBjaGFyKiBjbWROYW1lLCBSZWFkZXJDYWxsYmFjayBjYWxsYmFjayk7Ci0gICAgc3RhdHVzX3QgcHJlcGFyZUZvclJlYWRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxMb2NhbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MTA3ZTUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbExvY2FsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJTdHJlYW1IYWxMb2NhbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotU3RyZWFtSGFsTG9jYWw6OlN0cmVhbUhhbExvY2FsKGF1ZGlvX3N0cmVhbV90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCi0gICAgICAgIDogbURldmljZShkZXZpY2UpLAotICAgICAgICAgIG1TdHJlYW0oc3RyZWFtKSB7Ci0gICAgLy8gSW5zdHJ1bWVudCBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KLSAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgY2hhbm5lbCBtYXNrLCBmb3JtYXQsIGFuZCBzYW1wbGUgcmF0ZSBkbyBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLgotICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIgJiYgbVN0cmVhbVBvd2VyTG9nLmlzVXNlckRlYnVnT3JFbmdCdWlsZCgpKSB7Ci0gICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKSwKLSAgICAgICAgICAgICAgICBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSksCi0gICAgICAgICAgICAgICAgbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKSk7Ci0gICAgfQotfQotCi1TdHJlYW1IYWxMb2NhbDo6flN0cmVhbUhhbExvY2FsKCkgewotICAgIG1TdHJlYW0gPSAwOwotICAgIG1EZXZpY2UuY2xlYXIoKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpIHsKLSAgICAqcmF0ZSA9IG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gbVN0cmVhbS0+Z2V0X2J1ZmZlcl9zaXplKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKSB7Ci0gICAgKm1hc2sgPSBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKLSAgICAqZm9ybWF0ID0gbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgICpzYW1wbGVSYXRlID0gbVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pOwotICAgICptYXNrID0gbVN0cmVhbS0+Z2V0X2NoYW5uZWxzKG1TdHJlYW0pOwotICAgICpmb3JtYXQgPSBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIHJldHVybiBtU3RyZWFtLT5zZXRfcGFyYW1ldGVycyhtU3RyZWFtLCBrdlBhaXJzLnN0cmluZygpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgY2hhciAqaGFsVmFsdWVzID0gbVN0cmVhbS0+Z2V0X3BhcmFtZXRlcnMobVN0cmVhbSwga2V5cy5zdHJpbmcoKSk7Ci0gICAgaWYgKGhhbFZhbHVlcyAhPSBOVUxMKSB7Ci0gICAgICAgIHZhbHVlcy0+c2V0VG8oaGFsVmFsdWVzKTsKLSAgICAgICAgZnJlZShoYWxWYWx1ZXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhbHVlcy0+Y2xlYXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6YWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4pIHsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMKCJMb2NhbCBzdHJlYW1zIGNhbiBub3QgaGF2ZSBlZmZlY3RzIik7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6cmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4pIHsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMKCJMb2NhbCBzdHJlYW1zIGNhbiBub3QgaGF2ZSBlZmZlY3RzIik7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c3RhbmRieSgpIHsKLSAgICByZXR1cm4gbVN0cmVhbS0+c3RhbmRieShtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmR1bXAoaW50IGZkKSB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0cmVhbS0+ZHVtcChtU3RyZWFtLCBmZCk7Ci0gICAgbVN0cmVhbVBvd2VyTG9nLmR1bXAoZmQpOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQpIHsKLSAgICAvLyBEb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGFzIGxvY2FsIGhhbCBpcyBleGVjdXRlZCBieSBhdWRpb2ZsaW5nZXIgZGlyZWN0bHkKLSAgICAvLyBvbiB0aGUgc2FtZSB0aHJlYWQuCi0gICAgcmV0dXJuIE9LOwotfQotCi1TdHJlYW1PdXRIYWxMb2NhbDo6U3RyZWFtT3V0SGFsTG9jYWwoYXVkaW9fc3RyZWFtX291dF90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCi0gICAgICAgIDogU3RyZWFtSGFsTG9jYWwoJnN0cmVhbS0+Y29tbW9uLCBkZXZpY2UpLCBtU3RyZWFtKHN0cmVhbSkgewotfQotCi1TdHJlYW1PdXRIYWxMb2NhbDo6flN0cmVhbU91dEhhbExvY2FsKCkgewotICAgIG1DYWxsYmFjay5jbGVhcigpOwotICAgIG1EZXZpY2UtPmNsb3NlT3V0cHV0U3RyZWFtKG1TdHJlYW0pOwotICAgIG1TdHJlYW0gPSAwOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gYXVkaW9fc3RyZWFtX291dF9mcmFtZV9zaXplKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpIHsKLSAgICAqbGF0ZW5jeSA9IG1TdHJlYW0tPmdldF9sYXRlbmN5KG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgewotICAgIGlmIChtU3RyZWFtLT5zZXRfdm9sdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c2V0X3ZvbHVtZShtU3RyZWFtLCBsZWZ0LCByaWdodCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjp3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKSB7Ci0gICAgc3NpemVfdCB3cml0ZVJlc3VsdCA9IG1TdHJlYW0tPndyaXRlKG1TdHJlYW0sIGJ1ZmZlciwgYnl0ZXMpOwotICAgIGlmICh3cml0ZVJlc3VsdCA+IDApIHsKLSAgICAgICAgKndyaXR0ZW4gPSB3cml0ZVJlc3VsdDsKLSAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICp3cml0dGVuKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICp3cml0dGVuID0gMDsKLSAgICAgICAgcmV0dXJuIHdyaXRlUmVzdWx0OwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpIHsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X3JlbmRlcl9wb3NpdGlvbihtU3RyZWFtLCBkc3BGcmFtZXMpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCkgewotICAgIGlmIChtU3RyZWFtLT5nZXRfbmV4dF93cml0ZV90aW1lc3RhbXAgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfbmV4dF93cml0ZV90aW1lc3RhbXAobVN0cmVhbSwgdGltZXN0YW1wKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjaykgewotICAgIGlmIChtU3RyZWFtLT5zZXRfY2FsbGJhY2sgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHN0YXR1c190IHJlc3VsdCA9IG1TdHJlYW0tPnNldF9jYWxsYmFjayhtU3RyZWFtLCBTdHJlYW1PdXRIYWxMb2NhbDo6YXN5bmNDYWxsYmFjaywgdGhpcyk7Ci0gICAgaWYgKHJlc3VsdCA9PSBPSykgewotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gc3RhdGljCi1pbnQgU3RyZWFtT3V0SGFsTG9jYWw6OmFzeW5jQ2FsbGJhY2soc3RyZWFtX2NhbGxiYWNrX2V2ZW50X3QgZXZlbnQsIHZvaWQqLCB2b2lkICpjb29raWUpIHsKLSAgICAvLyBXZSBhY3QgYXMgaWYgd2UgZ2F2ZSBhIHdwPFN0cmVhbU91dEhhbExvY2FsPiB0byBIQUwuIFRoaXMgd2F5IHdlIHNob3VsZCBoYW5kbGUKLSAgICAvLyBjb3JyZWN0bHkgdGhlIGNhc2Ugd2hlbiB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGlsZSBTdHJlYW1PdXRIYWxMb2NhbCdzIGRlc3RydWN0b3IgaXMKLSAgICAvLyBhbHJlYWR5IHJ1bm5pbmcsIGJlY2F1c2UgdGhlIGRlc3RydWN0b3IgaXMgaW52b2tlZCBhZnRlciB0aGUgcmVmY291bnQgaGFzIGJlZW4gYXRvbWljYWxseQotICAgIC8vIGRlY3JlbWVudGVkLgotICAgIHdwPFN0cmVhbU91dEhhbExvY2FsPiB3ZWFrU2VsZihzdGF0aWNfY2FzdDxTdHJlYW1PdXRIYWxMb2NhbCo+KGNvb2tpZSkpOwotICAgIHNwPFN0cmVhbU91dEhhbExvY2FsPiBzZWxmID0gd2Vha1NlbGYucHJvbW90ZSgpOwotICAgIGlmIChzZWxmID09IDApIHJldHVybiAwOwotICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IHNlbGYtPm1DYWxsYmFjay5wcm9tb3RlKCk7Ci0gICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybiAwOwotICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrKCkgZXZlbnQgJWQiLCBldmVudCk7Ci0gICAgc3dpdGNoIChldmVudCkgewotICAgICAgICBjYXNlIFNUUkVBTV9DQktfRVZFTlRfV1JJVEVfUkVBRFk6Ci0gICAgICAgICAgICBjYWxsYmFjay0+b25Xcml0ZVJlYWR5KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVFJFQU1fQ0JLX0VWRU5UX0RSQUlOX1JFQURZOgotICAgICAgICAgICAgY2FsbGJhY2stPm9uRHJhaW5SZWFkeSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RSRUFNX0NCS19FVkVOVF9FUlJPUjoKLSAgICAgICAgICAgIGNhbGxiYWNrLT5vbkVycm9yKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dXKCJhc3luY0NhbGxiYWNrKCkgdW5rbm93biBldmVudCAlZCIsIGV2ZW50KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpIHsKLSAgICAqc3VwcG9ydHNQYXVzZSA9IG1TdHJlYW0tPnBhdXNlICE9IE5VTEw7Ci0gICAgKnN1cHBvcnRzUmVzdW1lID0gbVN0cmVhbS0+cmVzdW1lICE9IE5VTEw7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6cGF1c2UoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnBhdXNlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+cGF1c2UobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpyZXN1bWUoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnJlc3VtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnJlc3VtZShtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbikgewotICAgICpzdXBwb3J0c0RyYWluID0gbVN0cmVhbS0+ZHJhaW4gIT0gTlVMTDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpkcmFpbihib29sIGVhcmx5Tm90aWZ5KSB7Ci0gICAgaWYgKG1TdHJlYW0tPmRyYWluID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+ZHJhaW4obVN0cmVhbSwgZWFybHlOb3RpZnkgPyBBVURJT19EUkFJTl9FQVJMWV9OT1RJRlkgOiBBVURJT19EUkFJTl9BTEwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Zmx1c2goKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmZsdXNoID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Zmx1c2gobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCkgewotICAgIGlmIChtU3RyZWFtLT5nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbihtU3RyZWFtLCBmcmFtZXMsIHRpbWVzdGFtcCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjp1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIHsKLSAgICBpZiAobVN0cmVhbS0+dXBkYXRlX3NvdXJjZV9tZXRhZGF0YSA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgY29uc3Qgc291cmNlX21ldGFkYXRhX3QgbWV0YWRhdGEgewotICAgICAgICAudHJhY2tfY291bnQgPSBzb3VyY2VNZXRhZGF0YS50cmFja3Muc2l6ZSgpLAotICAgICAgICAvLyBjb25zdCBjYXN0IGlzIGZpbmUgYXMgaXQgaXMgaW4gYSBjb25zdCBzdHJ1Y3R1cmUKLSAgICAgICAgLnRyYWNrcyA9IGNvbnN0X2Nhc3Q8cGxheWJhY2tfdHJhY2tfbWV0YWRhdGEqPihzb3VyY2VNZXRhZGF0YS50cmFja3MuZGF0YSgpKSwKLSAgICB9OwotICAgIG1TdHJlYW0tPnVwZGF0ZV9zb3VyY2VfbWV0YWRhdGEobVN0cmVhbSwgJm1ldGFkYXRhKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdGFydCgpIHsKLSAgICBpZiAobVN0cmVhbS0+c3RhcnQgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zdGFydChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN0b3AoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnN0b3AgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zdG9wKG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKLSAgICBpZiAobVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyKG1TdHJlYW0sIG1pblNpemVGcmFtZXMsIGluZm8pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgewotICAgIGlmIChtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uKG1TdHJlYW0sIHBvc2l0aW9uKTsKLX0KLQotU3RyZWFtSW5IYWxMb2NhbDo6U3RyZWFtSW5IYWxMb2NhbChhdWRpb19zdHJlYW1faW5fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQotICAgICAgICA6IFN0cmVhbUhhbExvY2FsKCZzdHJlYW0tPmNvbW1vbiwgZGV2aWNlKSwgbVN0cmVhbShzdHJlYW0pIHsKLX0KLQotU3RyZWFtSW5IYWxMb2NhbDo6flN0cmVhbUluSGFsTG9jYWwoKSB7Ci0gICAgbURldmljZS0+Y2xvc2VJbnB1dFN0cmVhbShtU3RyZWFtKTsKLSAgICBtU3RyZWFtID0gMDsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gYXVkaW9fc3RyZWFtX2luX2ZyYW1lX3NpemUobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzZXRHYWluKGZsb2F0IGdhaW4pIHsKLSAgICByZXR1cm4gbVN0cmVhbS0+c2V0X2dhaW4obVN0cmVhbSwgZ2Fpbik7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCkgewotICAgIHNzaXplX3QgcmVhZFJlc3VsdCA9IG1TdHJlYW0tPnJlYWQobVN0cmVhbSwgYnVmZmVyLCBieXRlcyk7Ci0gICAgaWYgKHJlYWRSZXN1bHQgPiAwKSB7Ci0gICAgICAgICpyZWFkID0gcmVhZFJlc3VsdDsKLSAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyggYnVmZmVyLCAqcmVhZCk7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgewotICAgICAgICAqcmVhZCA9IDA7Ci0gICAgICAgIHJldHVybiByZWFkUmVzdWx0OwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KSB7Ci0gICAgKmZyYW1lc0xvc3QgPSBtU3RyZWFtLT5nZXRfaW5wdXRfZnJhbWVzX2xvc3QobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9jYXB0dXJlX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X2NhcHR1cmVfcG9zaXRpb24obVN0cmVhbSwgZnJhbWVzLCB0aW1lKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6dXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnVwZGF0ZV9zaW5rX21ldGFkYXRhID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBjb25zdCBzaW5rX21ldGFkYXRhX3QgbWV0YWRhdGEgewotICAgICAgICAudHJhY2tfY291bnQgPSBzaW5rTWV0YWRhdGEudHJhY2tzLnNpemUoKSwKLSAgICAgICAgLy8gY29uc3QgY2FzdCBpcyBmaW5lIGFzIGl0IGlzIGluIGEgY29uc3Qgc3RydWN0dXJlCi0gICAgICAgIC50cmFja3MgPSBjb25zdF9jYXN0PHJlY29yZF90cmFja19tZXRhZGF0YSo+KHNpbmtNZXRhZGF0YS50cmFja3MuZGF0YSgpKSwKLSAgICB9OwotICAgIG1TdHJlYW0tPnVwZGF0ZV9zaW5rX21ldGFkYXRhKG1TdHJlYW0sICZtZXRhZGF0YSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzdGFydCgpIHsKLSAgICBpZiAobVN0cmVhbS0+c3RhcnQgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zdGFydChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c3RvcCgpIHsKLSAgICBpZiAobVN0cmVhbS0+c3RvcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnN0b3AobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlciA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlcihtU3RyZWFtLCBtaW5TaXplRnJhbWVzLCBpbmZvKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgewotICAgIGlmIChtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uKG1TdHJlYW0sIHBvc2l0aW9uKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0QWN0aXZlTWljcm9waG9uZXMoCi0gICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzIF9fdW51c2VkKSB7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxMb2NhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGE4ZDBjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxMb2NhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF9ICi0KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlICJTdHJlYW1Qb3dlckxvZy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERldmljZUhhbExvY2FsOwotCi1jbGFzcyBTdHJlYW1IYWxMb2NhbCA6IHB1YmxpYyB2aXJ0dWFsIFN0cmVhbUhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBzYW1wbGluZyByYXRlIGluIEh6IC0gZWcuIDQ0MTAwLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSk7Ci0KLSAgICAvLyBSZXR1cm4gc2l6ZSBvZiBpbnB1dC9vdXRwdXQgYnVmZmVyIGluIGJ5dGVzIGZvciB0aGlzIHN0cmVhbSAtIGVnLiA0ODAwLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBjaGFubmVsIG1hc2suCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzayk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGZvcm1hdCAtIGUuZy4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7Ci0KLSAgICAvLyBDb252ZW5pZW5jZSBtZXRob2QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOwotCi0gICAgLy8gU2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKLQotICAgIC8vIEdldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKLQotICAgIC8vIEFkZCBvciByZW1vdmUgdGhlIGVmZmVjdCBvbiB0aGUgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7Ci0KLSAgICAvLyBQdXQgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0L291dHB1dCBpbnRvIHN0YW5kYnkgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YW5kYnkoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgPSAwOwotCi0gICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpID0gMDsKLQotICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pID0gMDsKLQotICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSA9IDA7Ci0KLSAgICAvLyBTZXQgdGhlIHByaW9yaXR5IG9mIHRoZSB0aHJlYWQgdGhhdCBpbnRlcmFjdHMgd2l0aCB0aGUgSEFMCi0gICAgLy8gKG11c3QgbWF0Y2ggdGhlIHByaW9yaXR5IG9mIHRoZSBhdWRpb2ZsaW5nZXIncyB0aHJlYWQgdGhhdCBjYWxscyAncmVhZCcgLyAnd3JpdGUnKQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KTsKLQotICBwcm90ZWN0ZWQ6Ci0gICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtSGFsTG9jYWwoYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7Ci0KLSAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgc3RyZWFtLgotICAgIHZpcnR1YWwgflN0cmVhbUhhbExvY2FsKCk7Ci0KLSAgICBzcDxEZXZpY2VIYWxMb2NhbD4gbURldmljZTsKLQotICAgIC8vIG1TdHJlYW1Qb3dlckxvZyBpcyB1c2VkIGZvciBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KLSAgICBTdHJlYW1Qb3dlckxvZyBtU3RyZWFtUG93ZXJMb2c7Ci0KLSAgcHJpdmF0ZToKLSAgICBhdWRpb19zdHJlYW1fdCAqbVN0cmVhbTsKLX07Ci0KLWNsYXNzIFN0cmVhbU91dEhhbExvY2FsIDogcHVibGljIFN0cmVhbU91dEhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbExvY2FsIHsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGhhcmR3YXJlIGRyaXZlciBlc3RpbWF0ZWQgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KTsKLQotICAgIC8vIFVzZSB0aGlzIG1ldGhvZCBpbiBzaXR1YXRpb25zIHdoZXJlIGF1ZGlvIG1peGluZyBpcyBkb25lIGluIHRoZSBoYXJkd2FyZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7Ci0KLSAgICAvLyBXcml0ZSBhdWRpbyBidWZmZXIgdG8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbik7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgd3JpdHRlbiBieSB0aGUgYXVkaW8gZHNwIHRvIERBQyBzaW5jZQotICAgIC8vIHRoZSBvdXRwdXQgaGFzIGV4aXRlZCBzdGFuZGJ5LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcyk7Ci0KLSAgICAvLyBHZXQgdGhlIGxvY2FsIHRpbWUgYXQgd2hpY2ggdGhlIG5leHQgd3JpdGUgdG8gdGhlIGF1ZGlvIGRyaXZlciB3aWxsIGJlIHByZXNlbnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApOwotCi0gICAgLy8gU2V0IHRoZSBjYWxsYmFjayBmb3Igbm90aWZ5aW5nIGNvbXBsZXRpb24gb2Ygbm9uLWJsb2NraW5nIHdyaXRlIGFuZCBkcmFpbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgcGF1c2UgYW5kIHJlc3VtZSBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdW1lKCk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgZHJhaW4gb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbik7Ci0KLSAgICAvLyBSZXF1ZXN0cyBub3RpZmljYXRpb24gd2hlbiBkYXRhIGJ1ZmZlcmVkIGJ5IHRoZSBkcml2ZXIvaGFyZHdhcmUgaGFzIGJlZW4gcGxheWVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHJhaW4oYm9vbCBlYXJseU5vdGlmeSk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIGZsdXNoIHRoZSBxdWV1ZWQgZGF0YS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCk7Ci0KLSAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcHJlc2VudGVkIHRvIGFuIGV4dGVybmFsIG9ic2VydmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApOwotCi0gICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7Ci0KLSAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0KLSAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKLQotICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc291cmNlIGhhcyBiZWVuIGNoYW5nZWQuCi0gICAgc3RhdHVzX3QgdXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSBvdmVycmlkZTsKLQotICBwcml2YXRlOgotICAgIGF1ZGlvX3N0cmVhbV9vdXRfdCAqbVN0cmVhbTsKLSAgICB3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gbUNhbGxiYWNrOwotCi0gICAgZnJpZW5kIGNsYXNzIERldmljZUhhbExvY2FsOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbU91dEhhbExvY2FsKGF1ZGlvX3N0cmVhbV9vdXRfdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKLQotICAgIHZpcnR1YWwgflN0cmVhbU91dEhhbExvY2FsKCk7Ci0KLSAgICBzdGF0aWMgaW50IGFzeW5jQ2FsbGJhY2soc3RyZWFtX2NhbGxiYWNrX2V2ZW50X3QgZXZlbnQsIHZvaWQgKnBhcmFtLCB2b2lkICpjb29raWUpOwotfTsKLQotY2xhc3MgU3RyZWFtSW5IYWxMb2NhbCA6IHB1YmxpYyBTdHJlYW1JbkhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbExvY2FsIHsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBTZXQgdGhlIGlucHV0IGdhaW4gZm9yIHRoZSBhdWRpbyBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRHYWluKGZsb2F0IGdhaW4pOwotCi0gICAgLy8gUmVhZCBhdWRpbyBidWZmZXIgaW4gZnJvbSBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhbW91bnQgb2YgaW5wdXQgZnJhbWVzIGxvc3QgaW4gdGhlIGF1ZGlvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCk7Ci0KLSAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcmVjZWl2ZWQgYW5kCi0gICAgLy8gdGhlIGNsb2NrIHRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZnJhbWUgY291bnQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKTsKLQotICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwotCi0gICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotCi0gICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7Ci0KLSAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7Ci0KLSAgICAvLyBHZXQgYWN0aXZlIG1pY3JvcGhvbmVzCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNpbmsgaGFzIGJlZW4gY2hhbmdlZC4KLSAgICBzdGF0dXNfdCB1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIG92ZXJyaWRlOwotCi0gIHByaXZhdGU6Ci0gICAgYXVkaW9fc3RyZWFtX2luX3QgKm1TdHJlYW07Ci0KLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsTG9jYWw7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtSW5IYWxMb2NhbChhdWRpb19zdHJlYW1faW5fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKLQotICAgIHZpcnR1YWwgflN0cmVhbUluSGFsTG9jYWwoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtUG93ZXJMb2cuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1Qb3dlckxvZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzhiMWFhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1Qb3dlckxvZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR19ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR19ICi0KLSNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL1Bvd2VyTG9nLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBTdHJlYW1Qb3dlckxvZyB7Ci1wdWJsaWM6Ci0gICAgU3RyZWFtUG93ZXJMb2coKSA6Ci0gICAgICAgIG1Jc1VzZXJEZWJ1Z09yRW5nQnVpbGQoaXNfdXNlcmRlYnVnX29yX2VuZ19idWlsZCgpKSwKLSAgICAgICAgbVBvd2VyTG9nKG51bGxwdHIpLAotICAgICAgICBtRnJhbWVTaXplKDApIHsKLSAgICAgICAgLy8gdXNlIGluaXQoKSB0byBzZXQgdXAgdGhlIHBvd2VyIGxvZy4KLSAgICB9Ci0KLSAgICB+U3RyZWFtUG93ZXJMb2coKSB7Ci0gICAgICAgIHBvd2VyX2xvZ19kZXN0cm95KG1Qb3dlckxvZyk7IC8vIE9LIGZvciBudWxsIG1Qb3dlckxvZwotICAgICAgICBtUG93ZXJMb2cgPSBudWxscHRyOwotICAgIH0KLQotICAgIC8vIEEgb25lLXRpbWUgaW5pdGlhbGl6YXRpb24gKGRvIG5vdCBjYWxsIHR3aWNlKSBiZWZvcmUgdXNpbmcgU3RyZWFtUG93ZXJMb2cuCi0gICAgdm9pZCBpbml0KHVpbnQzMl90IHNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKLSAgICAgICAgaWYgKG1Qb3dlckxvZyA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAvLyBOb3RlOiBBIHdheSB0byBnZXQgY2hhbm5lbCBjb3VudCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGNoYW5uZWwgbWFza3MKLSAgICAgICAgICAgIC8vIGJ1dCBkb2VzIG5vdCBjaGVjayB2YWxpZGl0eSBvZiB0aGUgY2hhbm5lbCBtYXNrLgotICAgICAgICAgICAgY29uc3QgdWludDMyX3QgY2hhbm5lbENvdW50ID0gcG9wY291bnQoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKGNoYW5uZWxNYXNrKSk7Ci0gICAgICAgICAgICBtRnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpOwotICAgICAgICAgICAgaWYgKG1GcmFtZVNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0ZyYW1lc1BlckVudHJ5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpc2FtcGxlUmF0ZSAqIGtQb3dlckxvZ1NhbXBsaW5nSW50ZXJ2YWxNcyAvIDEwMDA7Ci0gICAgICAgICAgICAgICAgbVBvd2VyTG9nID0gcG93ZXJfbG9nX2NyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBrUG93ZXJMb2dFbnRyaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAga1Bvd2VyTG9nRnJhbWVzUGVyRW50cnkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIG1Qb3dlckxvZyBtYXkgYmUgTlVMTCAobm90IHRoZSByaWdodCBidWlsZCwgZm9ybWF0IG5vdCBhY2NlcHRlZCwgZXRjLikuCi0gICAgfQotCi0gICAgLy8gRHVtcCB0aGUgcG93ZXIgbG9nIHRvIGZkLgotICAgIHZvaWQgZHVtcChpbnQgZmQpIGNvbnN0IHsKLSAgICAgICAgLy8gT0sgZm9yIG51bGwgbVBvd2VyTG9nCi0gICAgICAgICh2b2lkKXBvd2VyX2xvZ19kdW1wKAotICAgICAgICAgICAgICAgIG1Qb3dlckxvZywgZmQsICIgICAgICAiIC8qIHByZWZpeCAqLywga1Bvd2VyTG9nTGluZXMsIDAgLyogbGltaXRfbnMgKi8pOwotICAgIH0KLQotICAgIC8vIExvZyB0aGUgYXVkaW8gZGF0YSBjb250YWluZWQgaW4gYnVmZmVyLgotICAgIHZvaWQgbG9nKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemVJbkJ5dGVzKSBjb25zdCB7Ci0gICAgICAgIGlmIChtUG93ZXJMb2cgIT0gbnVsbHB0cikgeyAvLyBtRnJhbWVTaXplIGlzIGFsd2F5cyBub256ZXJvIGlmIG1Qb3dlckxvZyBleGlzdHMuCi0gICAgICAgICAgICBwb3dlcl9sb2dfbG9nKAotICAgICAgICAgICAgICAgICAgICBtUG93ZXJMb2csIGJ1ZmZlciwgc2l6ZUluQnl0ZXMgLyBtRnJhbWVTaXplLCBhdWRpb191dGlsc19nZXRfcmVhbF90aW1lX25zKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYm9vbCBpc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtSXNVc2VyRGVidWdPckVuZ0J1aWxkOwotICAgIH0KLQotcHJpdmF0ZToKLQotICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc191c2VyZGVidWdfb3JfZW5nX2J1aWxkKCkgewotICAgICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgICAgICh2b2lkKXByb3BlcnR5X2dldCgicm8uYnVpbGQudHlwZSIsIHZhbHVlLCAidW5rbm93biIpOyAvLyBpZ25vcmUgYWN0dWFsIGxlbmd0aAotICAgICAgICByZXR1cm4gc3RyY21wKHZhbHVlLCAidXNlcmRlYnVnIikgPT0gMCB8fCBzdHJjbXAodmFsdWUsICJlbmciKSA9PSAwOwotICAgIH0KLQotICAgIC8vIEF1ZGlvIHNpZ25hbCBwb3dlciBsb2cgY29uZmlndXJhdGlvbi4KLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0xpbmVzID0gNDA7Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMgPSA1MDsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0VudHJpZXMgPSAoMSAvKiBtaW51dGVzICovICogNjAgLyogc2Vjb25kcyAqLyAqIDEwMDAgLyogbXNlYyAqLwotICAgICAgICAgICAgLyBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMpOwotCi0gICAgY29uc3QgYm9vbCBtSXNVc2VyRGVidWdPckVuZ0J1aWxkOwotICAgIHBvd2VyX2xvZ190ICptUG93ZXJMb2c7Ci0gICAgc2l6ZV90IG1GcmFtZVNpemU7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMzZGVmYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKLSAgICBuYW1lOiAibGliYXVkaW9oYWxANC4wIiwKLQotICAgIHNyY3M6IFsKLSAgICAgICAgIkRldmljZUhhbExvY2FsLmNwcCIsCi0gICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAiLAotICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAiLAotICAgICAgICAiU3RyZWFtSGFsTG9jYWwuY3BwIiwKLQotICAgICAgICAiQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwIiwKLSAgICAgICAgIkRldmljZUhhbEhpZGwuY3BwIiwKLSAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAiLAotICAgICAgICAiRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAiLAotICAgICAgICAiRWZmZWN0SGFsSGlkbC5jcHAiLAotICAgICAgICAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcCIsCi0gICAgICAgICJTdHJlYW1IYWxIaWRsLmNwcCIsCi0gICAgXSwKLQotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2FsbCIsCi0gICAgICAgICItV2V4dHJhIiwKLSAgICAgICAgIi1XZXJyb3IiLAotICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmF1ZGlvaGFsX2RlYXRoaGFuZGxlciIsCi0gICAgICAgICJsaWJhdWRpb3V0aWxzIiwKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmhhcmR3YXJlIiwKLSAgICAgICAgImxpYmJhc2UiLAotICAgICAgICAibGliZm1xIiwKLSAgICAgICAgImxpYmh3YmluZGVyIiwKLSAgICAgICAgImxpYmhpZGxiYXNlIiwKLSAgICAgICAgImxpYmhpZGxtZW1vcnkiLAotICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvQDQuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbi11dGlsIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDQuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA0LjAtdXRpbCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA0LjAiLAotICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAotICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAotICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKLSAgICAgICAgImxpYm1lZGlhdXRpbHMiLAotICAgIF0sCi0gICAgaGVhZGVyX2xpYnM6IFsKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uLnV0aWxAYWxsLXZlcnNpb25zIiwKLSAgICAgICAgImxpYmF1ZGlvaGFsX2hlYWRlcnMiCi0gICAgXSwKLQotICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKLSAgICAgICAgImxpYmZtcSIsCi0gICAgXSwKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTI3NTA0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2RlZmluZSBMT0dfVEFHICJIYWxIaWRsIgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6QXVkaW9NaWNyb3Bob25lQ2hhbm5lbE1hcHBpbmc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6QXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHk7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6QXVkaW9NaWNyb3Bob25lTG9jYXRpb247Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6RGV2aWNlQWRkcmVzczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpNaWNyb3Bob25lSW5mbzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZXN1bHQ7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotLy8gc3RhdGljCi1zdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6a2V5c0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga2V5cywgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICpoaWRsS2V5cykgewotICAgIEF1ZGlvUGFyYW1ldGVyIGhhbEtleXMoa2V5cyk7Ci0gICAgaWYgKGhhbEtleXMuc2l6ZSgpID09IDApIHJldHVybiBCQURfVkFMVUU7Ci0gICAgaGlkbEtleXMtPnJlc2l6ZShoYWxLZXlzLnNpemUoKSk7Ci0gICAgLy9GSVhNRTogIGtleVN0cmVhbVN1cHBvcnRlZENoYW5uZWxzIGFuZCBrZXlTdHJlYW1TdXBwb3J0ZWRTYW1wbGluZ1JhdGVzIGNvbWUgd2l0aCBhCi0gICAgLy8gImtleUZvcm1hdD08dmFsdWU+IiBwYWlyLiBXZSBuZWVkIHRvIHRyYW5zZm9ybSBpdCBpbnRvIGEgc2luZ2xlIGtleSBzdHJpbmcgc28gdGhhdCBpdCBpcwotICAgIC8vIGNhcnJpZWQgb3ZlciB0byB0aGUgbGVnYWN5IEhBTCB2aWEgSElETC4KLSAgICBTdHJpbmc4IHZhbHVlOwotICAgIGJvb2wga2VlcEZvcm1hdFZhbHVlID0gaGFsS2V5cy5zaXplKCkgPT0gMiAmJgotICAgICAgICAgKGhhbEtleXMuZ2V0KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZENoYW5uZWxzKSwgdmFsdWUpID09IE5PX0VSUk9SIHx8Ci0gICAgICAgICBoYWxLZXlzLmdldChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRTYW1wbGluZ1JhdGVzKSwgdmFsdWUpID09IE5PX0VSUk9SKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGFsS2V5cy5zaXplKCk7ICsraSkgewotICAgICAgICBTdHJpbmc4IGtleTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaGFsS2V5cy5nZXRBdChpLCBrZXkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgICAgICBpZiAoa2VlcEZvcm1hdFZhbHVlICYmIGtleSA9PSBBdWRpb1BhcmFtZXRlcjo6a2V5Rm9ybWF0KSB7Ci0gICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBmb3JtYXRQYXJhbTsKLSAgICAgICAgICAgIGhhbEtleXMuZ2V0QXQoaSwga2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICBmb3JtYXRQYXJhbS5hZGQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICBrZXkgPSBmb3JtYXRQYXJhbS50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgICgqaGlkbEtleXMpW2ldID0ga2V5LnN0cmluZygpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgQ29udmVyc2lvbkhlbHBlckhpZGw6OnBhcmFtZXRlcnNGcm9tSGFsKAotICAgICAgICBjb25zdCBTdHJpbmc4JiBrdlBhaXJzLCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gKmhpZGxQYXJhbXMpIHsKLSAgICBBdWRpb1BhcmFtZXRlciBwYXJhbXMoa3ZQYWlycyk7Ci0gICAgaWYgKHBhcmFtcy5zaXplKCkgPT0gMCkgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICBoaWRsUGFyYW1zLT5yZXNpemUocGFyYW1zLnNpemUoKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXJhbXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgU3RyaW5nOCBrZXksIHZhbHVlOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbXMuZ2V0QXQoaSwga2V5LCB2YWx1ZSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICgqaGlkbFBhcmFtcylbaV0ua2V5ID0ga2V5LnN0cmluZygpOwotICAgICAgICAoKmhpZGxQYXJhbXMpW2ldLnZhbHVlID0gdmFsdWUuc3RyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotLy8gc3RhdGljCi12b2lkIENvbnZlcnNpb25IZWxwZXJIaWRsOjpwYXJhbWV0ZXJzVG9IYWwoCi0gICAgICAgIGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW1zOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5zaXplKCk7ICsraSkgewotICAgICAgICBwYXJhbXMuYWRkKFN0cmluZzgocGFyYW1ldGVyc1tpXS5rZXkuY19zdHIoKSksIFN0cmluZzgocGFyYW1ldGVyc1tpXS52YWx1ZS5jX3N0cigpKSk7Ci0gICAgfQotICAgIHZhbHVlcy0+c2V0VG8ocGFyYW1zLnRvU3RyaW5nKCkpOwotfQotCi1Db252ZXJzaW9uSGVscGVySGlkbDo6Q29udmVyc2lvbkhlbHBlckhpZGwoY29uc3QgY2hhciogY2xhc3NOYW1lKQotICAgICAgICA6IG1DbGFzc05hbWUoY2xhc3NOYW1lKSB7Ci19Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgQ29udmVyc2lvbkhlbHBlckhpZGw6OmFuYWx5emVSZXN1bHQoY29uc3QgUmVzdWx0JiByZXN1bHQpIHsKLSAgICBzd2l0Y2ggKHJlc3VsdCkgewotICAgICAgICBjYXNlIFJlc3VsdDo6T0s6IHJldHVybiBPSzsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTOiByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9TVEFURTogcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDogcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfU1VQUE9SVEVEOiByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIGRlZmF1bHQ6IHJldHVybiBOT19JTklUOwotICAgIH0KLX0KLQotdm9pZCBDb252ZXJzaW9uSGVscGVySGlkbDo6ZW1pdEVycm9yKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbikgewotICAgIEFMT0dFKCIlcyAlcCAlczogJXMgKGZyb20gcnBjKSIsIG1DbGFzc05hbWUsIHRoaXMsIGZ1bmNOYW1lLCBkZXNjcmlwdGlvbik7Ci19Ci0KLS8vIFRPRE86IFVzZSB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgaGFsIHdoZW4gaXQgbW92ZXMgdG8gYSB1dGlsIGxpYnJhcnkuCi1zdGQ6OnN0cmluZyBkZXZpY2VBZGRyZXNzVG9IYWwoY29uc3QgRGV2aWNlQWRkcmVzcyYgYWRkcmVzcykgewotICAgIC8vIEhBTCBhc3N1bWVzIHRoYXQgdGhlIGFkZHJlc3MgaXMgTlVMLXRlcm1pbmF0ZWQuCi0gICAgY2hhciBoYWxBZGRyZXNzW0FVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU5dOwotICAgIG1lbXNldChoYWxBZGRyZXNzLCAwLCBzaXplb2YoaGFsQWRkcmVzcykpOwotICAgIGF1ZGlvX2RldmljZXNfdCBoYWxEZXZpY2UgPSBzdGF0aWNfY2FzdDxhdWRpb19kZXZpY2VzX3Q+KGFkZHJlc3MuZGV2aWNlKTsKLSAgICBjb25zdCBib29sIGlzSW5wdXQgPSAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0JJVF9JTikgIT0gMDsKLSAgICBpZiAoaXNJbnB1dCkgaGFsRGV2aWNlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOwotICAgIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApICE9IDApIHx8Ci0gICAgICAgIChpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFApICE9IDApKSB7Ci0gICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIiwKLSAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzLm1hY1swXSwgYWRkcmVzcy5hZGRyZXNzLm1hY1sxXSwgYWRkcmVzcy5hZGRyZXNzLm1hY1syXSwKLSAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzLm1hY1szXSwgYWRkcmVzcy5hZGRyZXNzLm1hY1s0XSwgYWRkcmVzcy5hZGRyZXNzLm1hY1s1XSk7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfSVApICE9IDApIHx8Ci0gICAgICAgICAgICAgICAoaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0lQKSAhPSAwKSkgewotICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlZC4lZC4lZC4lZCIsIGFkZHJlc3MuYWRkcmVzcy5pcHY0WzBdLAotICAgICAgICAgICAgICAgICBhZGRyZXNzLmFkZHJlc3MuaXB2NFsxXSwgYWRkcmVzcy5hZGRyZXNzLmlwdjRbMl0sIGFkZHJlc3MuYWRkcmVzcy5pcHY0WzNdKTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfVVNCKSAhPSAwKSB8fAotICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9BTExfVVNCKSAhPSAwKSkgewotICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICJjYXJkPSVkO2RldmljZT0lZCIsIGFkZHJlc3MuYWRkcmVzcy5hbHNhLmNhcmQsCi0gICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcy5hbHNhLmRldmljZSk7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQlVTKSAhPSAwKSB8fAotICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9CVVMpICE9IDApKSB7Ci0gICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiVzIiwgYWRkcmVzcy5idXNBZGRyZXNzLmNfc3RyKCkpOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgpKSAhPSAwIHx8Ci0gICAgICAgICAgICAgICAoaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpICE9IDApKSB7Ci0gICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiVzIiwgYWRkcmVzcy5yU3VibWl4QWRkcmVzcy5jX3N0cigpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlcyIsIGFkZHJlc3MuYnVzQWRkcmVzcy5jX3N0cigpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGhhbEFkZHJlc3M7Ci19Ci0KLS8vbG9jYWwgY29udmVyc2lvbiBoZWxwZXJzCi0KLWF1ZGlvX21pY3JvcGhvbmVfY2hhbm5lbF9tYXBwaW5nX3QgIGNoYW5uZWxNYXBwaW5nVG9IYWwoQXVkaW9NaWNyb3Bob25lQ2hhbm5lbE1hcHBpbmcgbWFwcGluZykgewotICAgIHN3aXRjaCAobWFwcGluZykgewotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUNoYW5uZWxNYXBwaW5nOjpVTlVTRUQ6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9DSEFOTkVMX01BUFBJTkdfVU5VU0VEOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUNoYW5uZWxNYXBwaW5nOjpESVJFQ1Q6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9DSEFOTkVMX01BUFBJTkdfRElSRUNUOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUNoYW5uZWxNYXBwaW5nOjpQUk9DRVNTRUQ6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9DSEFOTkVMX01BUFBJTkdfUFJPQ0VTU0VEOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBjaGFubmVsTWFwcGluZ1RvSGFsIGNvbnZlcnNpb24gJWQiLCBtYXBwaW5nKTsKLSAgICB9Ci19Ci0KLWF1ZGlvX21pY3JvcGhvbmVfbG9jYXRpb25fdCBsb2NhdGlvblRvSGFsKEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uIGxvY2F0aW9uKSB7Ci0gICAgc3dpdGNoIChsb2NhdGlvbikgewotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uOjpVTktOT1dOOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfTE9DQVRJT05fVU5LTk9XTjsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjo6TUFJTkJPRFk6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9MT0NBVElPTl9NQUlOQk9EWTsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjo6TUFJTkJPRFlfTU9WQUJMRToKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0xPQ0FUSU9OX01BSU5CT0RZX01PVkFCTEU7Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lTG9jYXRpb246OlBFUklQSEVSQUw6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9MT0NBVElPTl9QRVJJUEhFUkFMOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBsb2NhdGlvblRvSGFsIGNvbnZlcnNpb24gJWQiLCBsb2NhdGlvbik7Ci0gICAgfQotfQotYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25hbGl0eV90IGRpcmVjdGlvbmFsaXR5VG9IYWwoQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHkgZGlyKSB7Ci0gICAgc3dpdGNoIChkaXIpIHsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6VU5LTk9XTjoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX1VOS05PV047Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHk6Ok9NTkk6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9PTU5JOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpCSV9ESVJFQ1RJT05BTDoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX0JJX0RJUkVDVElPTkFMOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpDQVJESU9JRDoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX0NBUkRJT0lEOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpIWVBFUl9DQVJESU9JRDoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX0hZUEVSX0NBUkRJT0lEOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpTVVBFUl9DQVJESU9JRDoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX1NVUEVSX0NBUkRJT0lEOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBkaXJlY3Rpb25hbGl0eVRvSGFsIGNvbnZlcnNpb24gJWQiLCBkaXIpOwotICAgIH0KLX0KLQotLy8gc3RhdGljCi12b2lkIENvbnZlcnNpb25IZWxwZXJIaWRsOjptaWNyb3Bob25lSW5mb1RvSGFsKGNvbnN0IE1pY3JvcGhvbmVJbmZvJiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCAqcERzdCkgewotICAgIGlmIChwRHN0ICE9IE5VTEwpIHsKLSAgICAgICAgc25wcmludGYocERzdC0+ZGV2aWNlX2lkLCBzaXplb2YocERzdC0+ZGV2aWNlX2lkKSwKLSAgICAgICAgICAgICAgICAgIiVzIiwgc3JjLmRldmljZUlkLmNfc3RyKCkpOwotICAgICAgICBwRHN0LT5kZXZpY2UgPSBzdGF0aWNfY2FzdDxhdWRpb19kZXZpY2VzX3Q+KHNyYy5kZXZpY2VBZGRyZXNzLmRldmljZSk7Ci0gICAgICAgIHNucHJpbnRmKHBEc3QtPmFkZHJlc3MsIHNpemVvZihwRHN0LT5hZGRyZXNzKSwKLSAgICAgICAgICAgICAgICAgIiVzIiwgZGV2aWNlQWRkcmVzc1RvSGFsKHNyYy5kZXZpY2VBZGRyZXNzKS5jX3N0cigpKTsKLSAgICAgICAgaWYgKHNyYy5jaGFubmVsTWFwcGluZy5zaXplKCkgPiBBVURJT19DSEFOTkVMX0NPVU5UX01BWCkgewotICAgICAgICAgICAgQUxPR1coIm1pY3JvcGhvbmVJbmZvVG9TdHJ1Y3QgZm91bmQgJXp1IGNoYW5uZWxNYXBwaW5nIGVsZW1lbnRzLiBNYXggZXhwZWN0ZWQgaXMgJWQiLAotICAgICAgICAgICAgICAgICAgc3JjLmNoYW5uZWxNYXBwaW5nLnNpemUoKSwgQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVgpOwotICAgICAgICB9Ci0gICAgICAgIHNpemVfdCBjaDsKLSAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgc3JjLmNoYW5uZWxNYXBwaW5nLnNpemUoKSAmJiBjaCA8IEFVRElPX0NIQU5ORUxfQ09VTlRfTUFYOyBjaCsrKSB7Ci0gICAgICAgICAgICBwRHN0LT5jaGFubmVsX21hcHBpbmdbY2hdID0gY2hhbm5lbE1hcHBpbmdUb0hhbChzcmMuY2hhbm5lbE1hcHBpbmdbY2hdKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKDsgY2ggPCBBVURJT19DSEFOTkVMX0NPVU5UX01BWDsgY2grKykgewotICAgICAgICAgICAgcERzdC0+Y2hhbm5lbF9tYXBwaW5nW2NoXSA9IEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX1VOVVNFRDsKLSAgICAgICAgfQotICAgICAgICBwRHN0LT5sb2NhdGlvbiA9IGxvY2F0aW9uVG9IYWwoc3JjLmxvY2F0aW9uKTsKLSAgICAgICAgcERzdC0+Z3JvdXAgPSAoYXVkaW9fbWljcm9waG9uZV9ncm91cF90KXNyYy5ncm91cDsKLSAgICAgICAgcERzdC0+aW5kZXhfaW5fdGhlX2dyb3VwID0gKHVuc2lnbmVkIGludClzcmMuaW5kZXhJblRoZUdyb3VwOwotICAgICAgICBwRHN0LT5zZW5zaXRpdml0eSA9IHNyYy5zZW5zaXRpdml0eTsKLSAgICAgICAgcERzdC0+bWF4X3NwbCA9IHNyYy5tYXhTcGw7Ci0gICAgICAgIHBEc3QtPm1pbl9zcGwgPSBzcmMubWluU3BsOwotICAgICAgICBwRHN0LT5kaXJlY3Rpb25hbGl0eSA9IGRpcmVjdGlvbmFsaXR5VG9IYWwoc3JjLmRpcmVjdGlvbmFsaXR5KTsKLSAgICAgICAgcERzdC0+bnVtX2ZyZXF1ZW5jeV9yZXNwb25zZXMgPSAodW5zaWduZWQgaW50KXNyYy5mcmVxdWVuY3lSZXNwb25zZS5zaXplKCk7Ci0gICAgICAgIGlmIChwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcyA+IEFVRElPX01JQ1JPUEhPTkVfTUFYX0ZSRVFVRU5DWV9SRVNQT05TRVMpIHsKLSAgICAgICAgICAgIEFMT0dXKCJtaWNyb3Bob25lSW5mb1RvU3RydWN0IGZvdW5kICVkIGZyZXF1ZW5jeSByZXNwb25zZXMuIE1heCBleHBlY3RlZCBpcyAlZCIsCi0gICAgICAgICAgICAgICAgICBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcywgQVVESU9fTUlDUk9QSE9ORV9NQVhfRlJFUVVFTkNZX1JFU1BPTlNFUyk7Ci0gICAgICAgICAgICBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcyA9IEFVRElPX01JQ1JPUEhPTkVfTUFYX0ZSRVFVRU5DWV9SRVNQT05TRVM7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlczsgaysrKSB7Ci0gICAgICAgICAgICBwRHN0LT5mcmVxdWVuY3lfcmVzcG9uc2VzWzBdW2tdID0gc3JjLmZyZXF1ZW5jeVJlc3BvbnNlW2tdLmZyZXF1ZW5jeTsKLSAgICAgICAgICAgIHBEc3QtPmZyZXF1ZW5jeV9yZXNwb25zZXNbMV1ba10gPSBzcmMuZnJlcXVlbmN5UmVzcG9uc2Vba10ubGV2ZWw7Ci0gICAgICAgIH0KLSAgICAgICAgcERzdC0+Z2VvbWV0cmljX2xvY2F0aW9uLnggPSBzcmMucG9zaXRpb24ueDsKLSAgICAgICAgcERzdC0+Z2VvbWV0cmljX2xvY2F0aW9uLnkgPSBzcmMucG9zaXRpb24ueTsKLSAgICAgICAgcERzdC0+Z2VvbWV0cmljX2xvY2F0aW9uLnogPSBzcmMucG9zaXRpb24uejsKLSAgICAgICAgcERzdC0+b3JpZW50YXRpb24ueCA9IHNyYy5vcmllbnRhdGlvbi54OwotICAgICAgICBwRHN0LT5vcmllbnRhdGlvbi55ID0gc3JjLm9yaWVudGF0aW9uLnk7Ci0gICAgICAgIHBEc3QtPm9yaWVudGF0aW9uLnogPSBzcmMub3JpZW50YXRpb24uejsKLSAgICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBWNF8wCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvQ29udmVyc2lvbkhlbHBlckhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgyM2E4ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvQ29udmVyc2lvbkhlbHBlckhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfQ09OVkVSU0lPTl9IRUxQRVJfSElETF80XzBfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfNF8wX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL3R5cGVzLmg+Ci0jaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlBhcmFtZXRlclZhbHVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6Ok1pY3JvcGhvbmVJbmZvOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1jbGFzcyBDb252ZXJzaW9uSGVscGVySGlkbCB7Ci0gIHByb3RlY3RlZDoKLSAgICBzdGF0aWMgc3RhdHVzX3Qga2V5c0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga2V5cywgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICpoaWRsS2V5cyk7Ci0gICAgc3RhdGljIHN0YXR1c190IHBhcmFtZXRlcnNGcm9tSGFsKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiAqaGlkbFBhcmFtcyk7Ci0gICAgc3RhdGljIHZvaWQgcGFyYW1ldGVyc1RvSGFsKGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycywgU3RyaW5nOCAqdmFsdWVzKTsKLSAgICBzdGF0aWMgdm9pZCBtaWNyb3Bob25lSW5mb1RvSGFsKGNvbnN0IE1pY3JvcGhvbmVJbmZvJiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgKnBEc3QpOwotCi0gICAgQ29udmVyc2lvbkhlbHBlckhpZGwoY29uc3QgY2hhciogY2xhc3NOYW1lKTsKLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFQ+Ci0gICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFI+JiByZXQsIFQgKnJldHZhbCkgewotICAgICAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICAgICAgLy8gVGhpcyB3YXkgaXQgYWxzbyB3b3JrcyBmb3IgZW51bSBjbGFzcyB0byB1bnNjb3BlZCBlbnVtIGNvbnZlcnNpb24uCi0gICAgICAgICAgICAqcmV0dmFsID0gc3RhdGljX2Nhc3Q8VD4oc3RhdGljX2Nhc3Q8Uj4ocmV0KSk7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oZnVuY05hbWUsIHJldCk7Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48VD4mIHJldCkgewotICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgICAgIGVtaXRFcnJvcihmdW5jTmFtZSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBPSyA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZXN1bHQ+JiByZXQpIHsKLSAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgICAgICBlbWl0RXJyb3IoZnVuY05hbWUsIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybigKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48VD4mIHJldCwgaGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZXN1bHQgcmV0dmFsKSB7Ci0gICAgICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBjb25zdCBjaGFyKiBtQ2xhc3NOYW1lOwotCi0gICAgc3RhdGljIHN0YXR1c190IGFuYWx5emVSZXN1bHQoY29uc3QgaGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZXN1bHQmIHJlc3VsdCk7Ci0KLSAgICB2b2lkIGVtaXRFcnJvcihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgY2hhciogZGVzY3JpcHRpb24pOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIFY0XzAKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZhY2NhOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZUhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JUHJpbWFyeURldmljZS5oPgotI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+Ci0jaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPGNvbW1vbi9hbGwtdmVyc2lvbnMvVmVyc2lvblV0aWxzLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0jaW5jbHVkZSAiSGlkbFV0aWxzLmgiCi0jaW5jbHVkZSAiU3RyZWFtSGFsSGlkbC5oIgotI2luY2x1ZGUgIlZlcnNpb25VdGlscy5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb0NvbmZpZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvRGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9JbnB1dEZsYWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb091dHB1dEZsYWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb1BhdGNoSGFuZGxlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Qb3J0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Qb3J0Q29uZmlnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Nb2RlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Tb3VyY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpIaWRsVXRpbHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjp1dGlsczo6bWtFbnVtQ29udmVydGVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OkRldmljZUFkZHJlc3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVByaW1hcnlEZXZpY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UGFyYW1ldGVyVmFsdWU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UmVzdWx0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlNpbmtNZXRhZGF0YTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotbmFtZXNwYWNlIHsKLQotc3RhdHVzX3QgZGV2aWNlQWRkcmVzc0Zyb21IYWwoCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGNvbnN0IGNoYXIqIGhhbEFkZHJlc3MsIERldmljZUFkZHJlc3MqIGFkZHJlc3MpIHsKLSAgICBhZGRyZXNzLT5kZXZpY2UgPSBBdWRpb0RldmljZShkZXZpY2UpOwotCi0gICAgaWYgKGhhbEFkZHJlc3MgPT0gbnVsbHB0ciB8fCBzdHJubGVuKGhhbEFkZHJlc3MsIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pID09IDApIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICBjb25zdCBib29sIGlzSW5wdXQgPSAoZGV2aWNlICYgQVVESU9fREVWSUNFX0JJVF9JTikgIT0gMDsKLSAgICBpZiAoaXNJbnB1dCkgZGV2aWNlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOwotICAgIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApICE9IDApCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQKSAhPSAwKSkgewotICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCi0gICAgICAgICAgICAgICAgIiVoaFg6JWhoWDolaGhYOiVoaFg6JWhoWDolaGhYIiwKLSAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMF0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1sxXSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzJdLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLm1hY1szXSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzRdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbNV0pOwotICAgICAgICByZXR1cm4gc3RhdHVzID09IDYgPyBPSyA6IEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9JUCkgIT0gMCkKLSAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fSVApICE9IDApKSB7Ci0gICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKLSAgICAgICAgICAgICAgICAiJWhodS4laGh1LiVoaHUuJWhodSIsCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFswXSwgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFsxXSwKLSAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5pcHY0WzJdLCAmYWRkcmVzcy0+YWRkcmVzcy5pcHY0WzNdKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSA0ID8gT0sgOiBCQURfVkFMVUU7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX1VTQikpICE9IDAKLSAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQUxMX1VTQikpICE9IDApIHsKLSAgICAgICAgaW50IHN0YXR1cyA9IHNzY2FuZihoYWxBZGRyZXNzLAotICAgICAgICAgICAgICAgICJjYXJkPSVkO2RldmljZT0lZCIsCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MuYWxzYS5jYXJkLCAmYWRkcmVzcy0+YWRkcmVzcy5hbHNhLmRldmljZSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXMgPT0gMiA/IE9LIDogQkFEX1ZBTFVFOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0JVUykgIT0gMCkKLSAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQlVTKSAhPSAwKSkgewotICAgICAgICBpZiAoaGFsQWRkcmVzcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBhZGRyZXNzLT5idXNBZGRyZXNzID0gaGFsQWRkcmVzczsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgpKSAhPSAwCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpICE9IDApKSB7Ci0gICAgICAgIGlmIChoYWxBZGRyZXNzICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGFkZHJlc3MtPnJTdWJtaXhBZGRyZXNzID0gaGFsQWRkcmVzczsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1EZXZpY2VIYWxIaWRsOjpEZXZpY2VIYWxIaWRsKGNvbnN0IHNwPElEZXZpY2U+JiBkZXZpY2UpCi0gICAgICAgIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIkRldmljZSIpLCBtRGV2aWNlKGRldmljZSksCi0gICAgICAgICAgbVByaW1hcnlEZXZpY2UoSVByaW1hcnlEZXZpY2U6OmNhc3RGcm9tKGRldmljZSkpIHsKLX0KLQotRGV2aWNlSGFsSGlkbDo6fkRldmljZUhhbEhpZGwoKSB7Ci0gICAgaWYgKG1EZXZpY2UgIT0gMCkgewotICAgICAgICBtRGV2aWNlLmNsZWFyKCk7Ci0gICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90KikgewotICAgIC8vIE9ic29sZXRlLgotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6aW5pdENoZWNrKCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJpbml0Q2hlY2siLCBtRGV2aWNlLT5pbml0Q2hlY2soKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFZvaWNlVm9sdW1lIiwgbVByaW1hcnlEZXZpY2UtPnNldFZvaWNlVm9sdW1lKHZvbHVtZSkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyVm9sdW1lIiwgbVByaW1hcnlEZXZpY2UtPnNldE1hc3RlclZvbHVtZSh2b2x1bWUpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1QcmltYXJ5RGV2aWNlLT5nZXRNYXN0ZXJWb2x1bWUoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGZsb2F0IHYpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqdm9sdW1lID0gdjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TWFzdGVyVm9sdW1lIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TW9kZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRNb2RlKEF1ZGlvTW9kZShtb2RlKSkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNaWNNdXRlKGJvb2wgc3RhdGUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWljTXV0ZSIsIG1EZXZpY2UtPnNldE1pY011dGUoc3RhdGUpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWljTXV0ZShib29sICpzdGF0ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1pY011dGUoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGJvb2wgbXV0ZSkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpzdGF0ZSA9IG11dGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1pY011dGUiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNYXN0ZXJNdXRlIiwgbURldmljZS0+c2V0TWFzdGVyTXV0ZShzdGF0ZSkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0TWFzdGVyTXV0ZSgKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgYm9vbCBtdXRlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnN0YXRlID0gbXV0ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TWFzdGVyTXV0ZSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGhpZGxQYXJhbXM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyYW1ldGVyc0Zyb21IYWwoa3ZQYWlycywgJmhpZGxQYXJhbXMpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgLy8gVE9ETzogY2hhbmdlIHRoZSBBUEkgc28gdGhhdCBjb250ZXh0IGFuZCBrdlBhaXJzIGFyZSBzZXBhcmF0ZWQKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0UGFyYW1ldGVycyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHM6OnNldFBhcmFtZXRlcnMobURldmljZSwge30gLyogY29udGV4dCAqLywgaGlkbFBhcmFtcykpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgewotICAgIHZhbHVlcy0+Y2xlYXIoKTsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gaGlkbEtleXM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0ga2V5c0Zyb21IYWwoa2V5cywgJmhpZGxLZXlzKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IHV0aWxzOjpnZXRQYXJhbWV0ZXJzKG1EZXZpY2UsCi0gICAgICAgICAgICB7fSAvKiBjb250ZXh0ICovLAotICAgICAgICAgICAgaGlkbEtleXMsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNUb0hhbChwYXJhbWV0ZXJzLCB2YWx1ZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRQYXJhbWV0ZXJzIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRJbnB1dEJ1ZmZlclNpemUoCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywgc2l6ZV90ICpzaXplKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgQXVkaW9Db25maWcgaGlkbENvbmZpZzsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0SW5wdXRCdWZmZXJTaXplKAotICAgICAgICAgICAgaGlkbENvbmZpZywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDY0X3QgYnVmZmVyU2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihidWZmZXJTaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0SW5wdXRCdWZmZXJTaXplIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpvcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBEZXZpY2VBZGRyZXNzIGhpZGxEZXZpY2U7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2aWNlQWRkcmVzc0Zyb21IYWwoZGV2aWNlcywgYWRkcmVzcywgJmhpZGxEZXZpY2UpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgQXVkaW9Db25maWcgaGlkbENvbmZpZzsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5vcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICAgICAgaGFuZGxlLAotICAgICAgICAgICAgaGlkbERldmljZSwKLSAgICAgICAgICAgIGhpZGxDb25maWcsCi0gICAgICAgICAgICBta0VudW1Db252ZXJ0ZXI8QXVkaW9PdXRwdXRGbGFnPihmbGFncyksCi0gICAgICAgICAgICB7fSAvKiBtZXRhZGF0YSAqLywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SVN0cmVhbU91dD4mIHJlc3VsdCwgY29uc3QgQXVkaW9Db25maWcmIHN1Z2dlc3RlZENvbmZpZykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpvdXRTdHJlYW0gPSBuZXcgU3RyZWFtT3V0SGFsSGlkbChyZXN1bHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnVG9IYWwoc3VnZ2VzdGVkQ29uZmlnLCBjb25maWcpOwotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oIm9wZW5PdXRwdXRTdHJlYW0iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6Om9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBEZXZpY2VBZGRyZXNzIGhpZGxEZXZpY2U7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2aWNlQWRkcmVzc0Zyb21IYWwoZGV2aWNlcywgYWRkcmVzcywgJmhpZGxEZXZpY2UpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgQXVkaW9Db25maWcgaGlkbENvbmZpZzsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIC8vIFRPRE86IGNvcnJlY3RseSBwcm9wYWdhdGUgdGhlIHRyYWNrcyBzb3VyY2VzIGFuZCB2b2x1bWUKLSAgICAvLyAgICAgICBmb3Igbm93LCBvbmx5IHNlbmQgdGhlIG1haW4gc291cmNlIGF0IDFkYmZzCi0gICAgU2lua01ldGFkYXRhIG1ldGFkYXRhID0ge3t7QXVkaW9Tb3VyY2Uoc291cmNlKSwgMX19fTsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3BlbklucHV0U3RyZWFtKAotICAgICAgICAgICAgaGFuZGxlLAotICAgICAgICAgICAgaGlkbERldmljZSwKLSAgICAgICAgICAgIGhpZGxDb25maWcsCi0gICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgIG1ldGFkYXRhLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJU3RyZWFtSW4+JiByZXN1bHQsIGNvbnN0IEF1ZGlvQ29uZmlnJiBzdWdnZXN0ZWRDb25maWcpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqaW5TdHJlYW0gPSBuZXcgU3RyZWFtSW5IYWxIaWRsKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdUb0hhbChzdWdnZXN0ZWRDb25maWcsIGNvbmZpZyk7Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigib3BlbklucHV0U3RyZWFtIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNBdWRpb1BhdGNoZXMiLCBtRGV2aWNlLT5zdXBwb3J0c0F1ZGlvUGF0Y2hlcygpLCBzdXBwb3J0c1BhdGNoZXMpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpjcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaGlkbF92ZWM8QXVkaW9Qb3J0Q29uZmlnPiBoaWRsU291cmNlcywgaGlkbFNpbmtzOwotICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0Q29uZmlnc0Zyb21IYWwobnVtX3NvdXJjZXMsIHNvdXJjZXMsICZoaWRsU291cmNlcyk7Ci0gICAgSGlkbFV0aWxzOjphdWRpb1BvcnRDb25maWdzRnJvbUhhbChudW1fc2lua3MsIHNpbmtzLCAmaGlkbFNpbmtzKTsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5jcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICAgICAgaGlkbFNvdXJjZXMsIGhpZGxTaW5rcywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgQXVkaW9QYXRjaEhhbmRsZSBoaWRsUGF0Y2gpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqcGF0Y2ggPSBzdGF0aWNfY2FzdDxhdWRpb19wYXRjaF9oYW5kbGVfdD4oaGlkbFBhdGNoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiY3JlYXRlQXVkaW9QYXRjaCIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicmVsZWFzZUF1ZGlvUGF0Y2giLCBtRGV2aWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaCkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBBdWRpb1BvcnQgaGlkbFBvcnQ7Ci0gICAgSGlkbFV0aWxzOjphdWRpb1BvcnRGcm9tSGFsKCpwb3J0LCAmaGlkbFBvcnQpOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldEF1ZGlvUG9ydCgKLSAgICAgICAgICAgIGhpZGxQb3J0LAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBBdWRpb1BvcnQmIHApIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydFRvSGFsKHAsIHBvcnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRBdWRpb1BvcnQiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIEF1ZGlvUG9ydENvbmZpZyBoaWRsQ29uZmlnOwotICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0Q29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldEF1ZGlvUG9ydENvbmZpZyIsIG1EZXZpY2UtPnNldEF1ZGlvUG9ydENvbmZpZyhoaWRsQ29uZmlnKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzSW5mbykgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1pY3JvcGhvbmVzKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBoaWRsX3ZlYzxNaWNyb3Bob25lSW5mbz4gbWljQXJyYXlIYWwpIHsKLSAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBtaWNBcnJheUhhbC5zaXplKCk7IGsrKykgewotICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190IGRzdDsKLSAgICAgICAgICAgIC8vY29udmVydAotICAgICAgICAgICAgbWljcm9waG9uZUluZm9Ub0hhbChtaWNBcnJheUhhbFtrXSwgJmRzdCk7Ci0gICAgICAgICAgICBtZWRpYTo6TWljcm9waG9uZUluZm8gbWljcm9waG9uZSA9IG1lZGlhOjpNaWNyb3Bob25lSW5mbyhkc3QpOwotICAgICAgICAgICAgbWljcm9waG9uZXNJbmZvLT5wdXNoX2JhY2sobWljcm9waG9uZSk7Ci0gICAgICAgIH0KLSAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TWljcm9waG9uZXMiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmR1bXAoaW50IGZkKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7Ci0gICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5kZWJ1ZyhoaWRsSGFuZGxlLCB7fSAvKiBvcHRpb25zICovKTsKLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZHVtcCIsIHJldCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmQyMTc1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfNF8wX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lEZXZpY2UuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JUHJpbWFyeURldmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklEZXZpY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVByaW1hcnlEZXZpY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotY2xhc3MgRGV2aWNlSGFsSGlkbCA6IHB1YmxpYyBEZXZpY2VIYWxJbnRlcmZhY2UsIHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbAotewotICBwdWJsaWM6Ci0gICAgLy8gU2V0cyB0aGUgdmFsdWUgb2YgJ2RldmljZXMnIHRvIGEgYml0bWFzayBvZiAxIG9yIG1vcmUgdmFsdWVzIG9mIGF1ZGlvX2RldmljZXNfdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpOwotCi0gICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIG9mIGEgdm9pY2UgY2FsbC4gUmFuZ2UgaXMgYmV0d2VlbiAwLjAgYW5kIDEuMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSk7Ci0KLSAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBmb3IgYWxsIGF1ZGlvIGFjdGl2aXRpZXMgb3RoZXIgdGhhbiB2b2ljZSBjYWxsLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSk7Ci0KLSAgICAvLyBHZXQgdGhlIGN1cnJlbnQgbWFzdGVyIHZvbHVtZSB2YWx1ZSBmb3IgdGhlIEhBTC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSBhdWRpbyBtb2RlIGNoYW5nZXMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKTsKLQotICAgIC8vIE11dGluZyBjb250cm9sLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWljTXV0ZShib29sIHN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY011dGUoYm9vbCAqc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpOwotCi0gICAgLy8gU2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKLQotICAgIC8vIEdldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKLQotICAgIC8vIFJldHVybnMgYXVkaW8gaW5wdXQgYnVmZmVyIHNpemUgYWNjb3JkaW5nIHRvIHBhcmFtZXRlcnMgcGFzc2VkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJTaXplKGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKLSAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXRTdHJlYW0oCi0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSk7Ci0KLSAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAotICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbklucHV0U3RyZWFtKAotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIGNyZWF0ZUF1ZGlvUGF0Y2ggYW5kIHJlbGVhc2VBdWRpb1BhdGNoIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcyk7Ci0KLSAgICAvLyBDcmVhdGVzIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAotICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCi0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpOwotCi0gICAgLy8gUmVsZWFzZXMgYW4gYXVkaW8gcGF0Y2guCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCk7Ci0KLSAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKLQotICAgIC8vIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOwotCi0gICAgLy8gTGlzdCBtaWNyb3Bob25lcwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOwotICAgIHNwPElEZXZpY2U+IG1EZXZpY2U7Ci0gICAgc3A8SVByaW1hcnlEZXZpY2U+IG1QcmltYXJ5RGV2aWNlOyAgLy8gTnVsbCBpZiBpdCdzIG5vdCBhIHByaW1hcnkgZGV2aWNlLgotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIGV4cGxpY2l0IERldmljZUhhbEhpZGwoY29uc3Qgc3A8SURldmljZT4mIGRldmljZSk7Ci0KLSAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgZGV2aWNlLgotICAgIHZpcnR1YWwgfkRldmljZUhhbEhpZGwoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbExvY2FsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI0NWRkOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsTG9jYWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZUhhbExvY2FsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotRGV2aWNlSGFsTG9jYWw6OkRldmljZUhhbExvY2FsKGF1ZGlvX2h3X2RldmljZV90ICpkZXYpCi0gICAgICAgIDogbURldihkZXYpIHsKLX0KLQotRGV2aWNlSGFsTG9jYWw6On5EZXZpY2VIYWxMb2NhbCgpIHsKLSAgICBpbnQgc3RhdHVzID0gYXVkaW9faHdfZGV2aWNlX2Nsb3NlKG1EZXYpOwotICAgIEFMT0dXX0lGKHN0YXR1cywgIkVycm9yIGNsb3NpbmcgYXVkaW8gaHcgZGV2aWNlICVwOiAlcyIsIG1EZXYsIHN0cmVycm9yKC1zdGF0dXMpKTsKLSAgICBtRGV2ID0gMDsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpIHsKLSAgICBpZiAobURldi0+Z2V0X3N1cHBvcnRlZF9kZXZpY2VzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAqZGV2aWNlcyA9IG1EZXYtPmdldF9zdXBwb3J0ZWRfZGV2aWNlcyhtRGV2KTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjppbml0Q2hlY2soKSB7Ci0gICAgcmV0dXJuIG1EZXYtPmluaXRfY2hlY2sobURldik7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICByZXR1cm4gbURldi0+c2V0X3ZvaWNlX3ZvbHVtZShtRGV2LCB2b2x1bWUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgIGlmIChtRGV2LT5zZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSkgewotICAgIGlmIChtRGV2LT5nZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKSB7Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9tb2RlKG1EZXYsIG1vZGUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKSB7Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKLSAgICBpZiAobURldi0+c2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbURldi0+c2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpIHsKLSAgICBpZiAobURldi0+Z2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbURldi0+Z2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIHJldHVybiBtRGV2LT5zZXRfcGFyYW1ldGVycyhtRGV2LCBrdlBhaXJzLnN0cmluZygpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgY2hhciAqaGFsVmFsdWVzID0gbURldi0+Z2V0X3BhcmFtZXRlcnMobURldiwga2V5cy5zdHJpbmcoKSk7Ci0gICAgaWYgKGhhbFZhbHVlcyAhPSBOVUxMKSB7Ci0gICAgICAgIHZhbHVlcy0+c2V0VG8oaGFsVmFsdWVzKTsKLSAgICAgICAgZnJlZShoYWxWYWx1ZXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhbHVlcy0+Y2xlYXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gbURldi0+Z2V0X2lucHV0X2J1ZmZlcl9zaXplKG1EZXYsIGNvbmZpZyk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7Ci0gICAgYXVkaW9fc3RyZWFtX291dF90ICpoYWxTdHJlYW07Ci0gICAgQUxPR1YoIm9wZW5fb3V0cHV0X3N0cmVhbSBoYW5kbGU6ICVkIGRldmljZXM6ICV4IGZsYWdzOiAlI3giCi0gICAgICAgICAgICAic3JhdGU6ICVkIGZvcm1hdCAlI3ggY2hhbm5lbHMgJXggYWRkcmVzcyAlcyIsCi0gICAgICAgICAgICBoYW5kbGUsIGRldmljZXMsIGZsYWdzLAotICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgYWRkcmVzcyk7Ci0gICAgaW50IG9wZW5SZXN1dCA9IG1EZXYtPm9wZW5fb3V0cHV0X3N0cmVhbSgKLSAgICAgICAgICAgIG1EZXYsIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsIGNvbmZpZywgJmhhbFN0cmVhbSwgYWRkcmVzcyk7Ci0gICAgaWYgKG9wZW5SZXN1dCA9PSBPSykgewotICAgICAgICAqb3V0U3RyZWFtID0gbmV3IFN0cmVhbU91dEhhbExvY2FsKGhhbFN0cmVhbSwgdGhpcyk7Ci0gICAgfQotICAgIEFMT0dWKCJvcGVuX291dHB1dF9zdHJlYW0gc3RhdHVzICVkIHN0cmVhbSAlcCIsIG9wZW5SZXN1dCwgaGFsU3RyZWFtKTsKLSAgICByZXR1cm4gb3BlblJlc3V0OwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3BlbklucHV0U3RyZWFtKAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSkgewotICAgIGF1ZGlvX3N0cmVhbV9pbl90ICpoYWxTdHJlYW07Ci0gICAgQUxPR1YoIm9wZW5faW5wdXRfc3RyZWFtIGhhbmRsZTogJWQgZGV2aWNlczogJXggZmxhZ3M6ICUjeCAiCi0gICAgICAgICAgICAic3JhdGU6ICVkIGZvcm1hdCAlI3ggY2hhbm5lbHMgJXggYWRkcmVzcyAlcyBzb3VyY2UgJWQiLAotICAgICAgICAgICAgaGFuZGxlLCBkZXZpY2VzLCBmbGFncywKLSAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywKLSAgICAgICAgICAgIGFkZHJlc3MsIHNvdXJjZSk7Ci0gICAgaW50IG9wZW5SZXN1bHQgPSBtRGV2LT5vcGVuX2lucHV0X3N0cmVhbSgKLSAgICAgICAgICAgIG1EZXYsIGhhbmRsZSwgZGV2aWNlcywgY29uZmlnLCAmaGFsU3RyZWFtLCBmbGFncywgYWRkcmVzcywgc291cmNlKTsKLSAgICBpZiAob3BlblJlc3VsdCA9PSBPSykgewotICAgICAgICAqaW5TdHJlYW0gPSBuZXcgU3RyZWFtSW5IYWxMb2NhbChoYWxTdHJlYW0sIHRoaXMpOwotICAgIH0KLSAgICBBTE9HVigib3Blbl9pbnB1dF9zdHJlYW0gc3RhdHVzICVkIHN0cmVhbSAlcCIsIG9wZW5SZXN1bHQsIGluU3RyZWFtKTsKLSAgICByZXR1cm4gb3BlblJlc3VsdDsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcykgewotICAgICpzdXBwb3J0c1BhdGNoZXMgPSB2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpjcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKSB7Ci0gICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7Ci0gICAgICAgIHJldHVybiBtRGV2LT5jcmVhdGVfYXVkaW9fcGF0Y2goCi0gICAgICAgICAgICAgICAgbURldiwgbnVtX3NvdXJjZXMsIHNvdXJjZXMsIG51bV9zaW5rcywgc2lua3MsIHBhdGNoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpIHsKLSAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKLSAgICAgICAgcmV0dXJuIG1EZXYtPnJlbGVhc2VfYXVkaW9fcGF0Y2gobURldiwgcGF0Y2gpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIHsKLSAgICByZXR1cm4gbURldi0+Z2V0X2F1ZGlvX3BvcnQobURldiwgcG9ydCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKLSAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApCi0gICAgICAgIHJldHVybiBtRGV2LT5zZXRfYXVkaW9fcG9ydF9jb25maWcobURldiwgY29uZmlnKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKSB7Ci0gICAgaWYgKG1EZXYtPmdldF9taWNyb3Bob25lcyA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgc2l6ZV90IGFjdHVhbF9taWNzID0gQVVESU9fTUlDUk9QSE9ORV9NQVhfQ09VTlQ7Ci0gICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190IG1pY19hcnJheVtBVURJT19NSUNST1BIT05FX01BWF9DT1VOVF07Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbURldi0+Z2V0X21pY3JvcGhvbmVzKG1EZXYsICZtaWNfYXJyYXlbMF0sICZhY3R1YWxfbWljcyk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3R1YWxfbWljczsgaSsrKSB7Ci0gICAgICAgIG1lZGlhOjpNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lSW5mbyA9IG1lZGlhOjpNaWNyb3Bob25lSW5mbyhtaWNfYXJyYXlbaV0pOwotICAgICAgICBtaWNyb3Bob25lcy0+cHVzaF9iYWNrKG1pY3JvcGhvbmVJbmZvKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmR1bXAoaW50IGZkKSB7Ci0gICAgcmV0dXJuIG1EZXYtPmR1bXAobURldiwgZmQpOwotfQotCi12b2lkIERldmljZUhhbExvY2FsOjpjbG9zZU91dHB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCAqc3RyZWFtX291dCkgewotICAgIG1EZXYtPmNsb3NlX291dHB1dF9zdHJlYW0obURldiwgc3RyZWFtX291dCk7Ci19Ci0KLXZvaWQgRGV2aWNlSGFsTG9jYWw6OmNsb3NlSW5wdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiAqc3RyZWFtX2luKSB7Ci0gICAgbURldi0+Y2xvc2VfaW5wdXRfc3RyZWFtKG1EZXYsIHN0cmVhbV9pbik7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbExvY2FsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MzQxYTQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbExvY2FsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF80XzBfSAotCi0jaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1jbGFzcyBEZXZpY2VIYWxMb2NhbCA6IHB1YmxpYyBEZXZpY2VIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIFNldHMgdGhlIHZhbHVlIG9mICdkZXZpY2VzJyB0byBhIGJpdG1hc2sgb2YgMSBvciBtb3JlIHZhbHVlcyBvZiBhdWRpb19kZXZpY2VzX3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKTsKLQotICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIGhhcyBiZWVuIGluaXRpYWxpemVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7Ci0KLSAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBvZiBhIHZvaWNlIGNhbGwuIFJhbmdlIGlzIGJldHdlZW4gMC4wIGFuZCAxLjAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgZm9yIGFsbCBhdWRpbyBhY3Rpdml0aWVzIG90aGVyIHRoYW4gdm9pY2UgY2FsbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpOwotCi0gICAgLy8gR2V0IHRoZSBjdXJyZW50IG1hc3RlciB2b2x1bWUgdmFsdWUgZm9yIHRoZSBIQUwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgYXVkaW8gbW9kZSBjaGFuZ2VzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSk7Ci0KLSAgICAvLyBNdXRpbmcgY29udHJvbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY011dGUoYm9vbCBzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKTsKLQotICAgIC8vIFNldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7Ci0KLSAgICAvLyBHZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7Ci0KLSAgICAvLyBSZXR1cm5zIGF1ZGlvIGlucHV0IGJ1ZmZlciBzaXplIGFjY29yZGluZyB0byBwYXJhbWV0ZXJzIHBhc3NlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyU2l6ZShjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBzaXplX3QgKnNpemUpOwotCi0gICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCi0gICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pOwotCi0gICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKLSAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBjcmVhdGVBdWRpb1BhdGNoIGFuZCByZWxlYXNlQXVkaW9QYXRjaCBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpOwotCi0gICAgLy8gQ3JlYXRlcyBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaCgKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKTsKLQotICAgIC8vIFJlbGVhc2VzIGFuIGF1ZGlvIHBhdGNoLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpOwotCi0gICAgLy8gRmlsbHMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7Ci0KLSAgICAvLyBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKLQotICAgIC8vIExpc3QgbWljcm9waG9uZXMKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gICAgdm9pZCBjbG9zZU91dHB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCAqc3RyZWFtX291dCk7Ci0gICAgdm9pZCBjbG9zZUlucHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1faW4gKnN0cmVhbV9pbik7Ci0KLSAgcHJpdmF0ZToKLSAgICBhdWRpb19od19kZXZpY2VfdCAqbURldjsKLQotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbExvY2FsOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIGV4cGxpY2l0IERldmljZUhhbExvY2FsKGF1ZGlvX2h3X2RldmljZV90ICpkZXYpOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIGRldmljZS4KLSAgICB2aXJ0dWFsIH5EZXZpY2VIYWxMb2NhbCgpOwotCi0gICAgdWludDMyX3QgdmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1EZXYtPmNvbW1vbi52ZXJzaW9uOyB9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfTE9DQUxfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MzE5NGUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lEZXZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9oaWRsL0hhbERlYXRoSGFuZGxlci5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJRGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1EZXZpY2VzRmFjdG9yeUhhbEhpZGw6OkRldmljZXNGYWN0b3J5SGFsSGlkbCgpIHsKLSAgICBtRGV2aWNlc0ZhY3RvcnkgPSBJRGV2aWNlc0ZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKLSAgICBpZiAobURldmljZXNGYWN0b3J5ICE9IDApIHsKLSAgICAgICAgLy8gSXQgaXMgYXNzdW1lZCB0aGF0IERldmljZXNGYWN0b3J5IGlzIG93bmVkIGJ5IEF1ZGlvRmxpbmdlcgotICAgICAgICAvLyBhbmQgdGh1cyBoYXZlIHRoZSBzYW1lIGxpZmVzcGFuLgotICAgICAgICBtRGV2aWNlc0ZhY3RvcnktPmxpbmtUb0RlYXRoKEhhbERlYXRoSGFuZGxlcjo6Z2V0SW5zdGFuY2UoKSwgMCAvKmNvb2tpZSovKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9idGFpbiBJRGV2aWNlc0ZhY3Rvcnkgc2VydmljZSwgdGVybWluYXRpbmcgcHJvY2Vzcy4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgLy8gVGhlIE1TRCBmYWN0b3J5IGlzIG9wdGlvbmFsCi0gICAgbURldmljZXNGYWN0b3J5TXNkID0gSURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKEFVRElPX0hBTF9TRVJWSUNFX05BTUVfTVNEKTsKLSAgICAvLyBUT0RPOiBSZWdpc3RlciBkZWF0aCBoYW5kbGVyLCBhbmQgYWRkICdyZXN0YXJ0JyBkaXJlY3RpdmUgdG8gYXVkaW9zZXJ2ZXIucmMKLX0KLQotRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjp+RGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCkgewotfQotCi1zdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbEhpZGw6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7Ci0gICAgaWYgKG1EZXZpY2VzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2VzRmFjdG9yeS0+b3BlbkRldmljZSgKLSAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElEZXZpY2U+JiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqZGV2aWNlID0gbmV3IERldmljZUhhbEhpZGwocmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHJldHVybiBPSzsKLSAgICAgICAgZWxzZSBpZiAocmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFMpIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIGVsc2UgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBGQUlMRURfVFJBTlNBQ1RJT047Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE0ODg5Yi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF80XzBfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF80XzBfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSURldmljZXNGYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJRGV2aWNlc0ZhY3Rvcnk7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsIDogcHVibGljIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBPcGVucyBhIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gVG8gY2xvc2UgdGhlIGRldmljZSwgaXQgaXMKLSAgICAvLyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSk7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ7Ci0KLSAgICBzcDxJRGV2aWNlc0ZhY3Rvcnk+IG1EZXZpY2VzRmFjdG9yeTsKLSAgICBzcDxJRGV2aWNlc0ZhY3Rvcnk+IG1EZXZpY2VzRmFjdG9yeU1zZDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKTsKLQotICAgIHZpcnR1YWwgfkRldmljZXNGYWN0b3J5SGFsSGlkbCgpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hJRExfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmYxZWM3ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxsaWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaD4KLSNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgiCi0jaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6OkRldmljZXNGYWN0b3J5SGFsSHlicmlkKCkKLSAgICAgICAgOiBtTG9jYWxGYWN0b3J5KG5ldyBEZXZpY2VzRmFjdG9yeUhhbExvY2FsKCkpLAotICAgICAgICAgIG1IaWRsRmFjdG9yeShuZXcgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCkpIHsKLX0KLQotRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6On5EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpIHsKLX0KLQotc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7Ci0gICAgaWYgKG1IaWRsRmFjdG9yeSAhPSAwICYmIHN0cmNtcChBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfQTJEUCwgbmFtZSkgIT0gMCAmJgotICAgICAgICBzdHJjbXAoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0hFQVJJTkdfQUlELCBuYW1lKSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtSGlkbEZhY3RvcnktPm9wZW5EZXZpY2UobmFtZSwgZGV2aWNlKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1Mb2NhbEZhY3RvcnktPm9wZW5EZXZpY2UobmFtZSwgZGV2aWNlKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTRlZGQ0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1zdGF0aWMgc3RhdHVzX3QgbG9hZF9hdWRpb19pbnRlcmZhY2UoY29uc3QgY2hhciAqaWZfbmFtZSwgYXVkaW9faHdfZGV2aWNlX3QgKipkZXYpCi17Ci0gICAgY29uc3QgaHdfbW9kdWxlX3QgKm1vZDsKLSAgICBpbnQgcmM7Ci0KLSAgICByYyA9IGh3X2dldF9tb2R1bGVfYnlfY2xhc3MoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCAmbW9kKTsKLSAgICBpZiAocmMpIHsKLSAgICAgICAgQUxPR0UoIiVzIGNvdWxkbid0IGxvYWQgYXVkaW8gaHcgbW9kdWxlICVzLiVzICglcykiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICBBVURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIGlmX25hbWUsIHN0cmVycm9yKC1yYykpOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0gICAgcmMgPSBhdWRpb19od19kZXZpY2Vfb3Blbihtb2QsIGRldik7Ci0gICAgaWYgKHJjKSB7Ci0gICAgICAgIEFMT0dFKCIlcyBjb3VsZG4ndCBvcGVuIGF1ZGlvIGh3IGRldmljZSBpbiAlcy4lcyAoJXMpIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCBzdHJlcnJvcigtcmMpKTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotICAgIGlmICgoKmRldiktPmNvbW1vbi52ZXJzaW9uIDwgQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OX01JTikgewotICAgICAgICBBTE9HRSgiJXMgd3JvbmcgYXVkaW8gaHcgZGV2aWNlIHZlcnNpb24gJTA0eCIsIF9fZnVuY19fLCAoKmRldiktPmNvbW1vbi52ZXJzaW9uKTsKLSAgICAgICAgcmMgPSBCQURfVkFMVUU7Ci0gICAgICAgIGF1ZGlvX2h3X2RldmljZV9jbG9zZSgqZGV2KTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLQotb3V0OgotICAgICpkZXYgPSBOVUxMOwotICAgIHJldHVybiByYzsKLX0KLQotc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbDo6b3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpIHsKLSAgICBhdWRpb19od19kZXZpY2VfdCAqZGV2OwotICAgIHN0YXR1c190IHJjID0gbG9hZF9hdWRpb19pbnRlcmZhY2UobmFtZSwgJmRldik7Ci0gICAgaWYgKHJjID09IE9LKSB7Ci0gICAgICAgICpkZXZpY2UgPSBuZXcgRGV2aWNlSGFsTG9jYWwoZGV2KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJjOwotfQotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMxYzUyMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0xPQ0FMXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF80XzBfSAotCi0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLWNsYXNzIERldmljZXNGYWN0b3J5SGFsTG9jYWwgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcwotICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBEZXZpY2VzRmFjdG9yeUhhbExvY2FsKCkge30KLQotICAgIHZpcnR1YWwgfkRldmljZXNGYWN0b3J5SGFsTG9jYWwoKSB7fQotfTsKLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0xPQ0FMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1N2M4OWYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8YXRvbWljPgotCi0jZGVmaW5lIExPR19UQUcgIkVmZmVjdEJ1ZmZlckhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvYWxsb2NhdG9yLzEuMC9JQWxsb2NhdG9yLmg+Ci0jaW5jbHVkZSA8aGlkbG1lbW9yeS9tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoaWRsOjphbGxvY2F0b3I6OlYxXzA6OklBbGxvY2F0b3I7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotLy8gc3RhdGljCi11aW50NjRfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjptYWtlVW5pcXVlSWQoKSB7Ci0gICAgc3RhdGljIHN0ZDo6YXRvbWljPHVpbnQ2NF90PiBjb3VudGVyezF9OwotICAgIHJldHVybiBjb3VudGVyKys7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmFsbG9jYXRlKAotICAgICAgICBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7Ci0gICAgcmV0dXJuIG1pcnJvcihudWxscHRyLCBzaXplLCBidWZmZXIpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjptaXJyb3IoCi0gICAgICAgIHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7Ci0gICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiB0ZW1wQnVmZmVyID0gbmV3IEVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZSk7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KHRlbXBCdWZmZXIuZ2V0KCkpLT5pbml0KCk7Ci0gICAgaWYgKHJlc3VsdCA9PSBPSykgewotICAgICAgICB0ZW1wQnVmZmVyLT5zZXRFeHRlcm5hbERhdGEoZXh0ZXJuYWwpOwotICAgICAgICAqYnVmZmVyID0gdGVtcEJ1ZmZlcjsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotRWZmZWN0QnVmZmVySGFsSGlkbDo6RWZmZWN0QnVmZmVySGFsSGlkbChzaXplX3Qgc2l6ZSkKLSAgICAgICAgOiBtQnVmZmVyU2l6ZShzaXplKSwgbUZyYW1lQ291bnRDaGFuZ2VkKGZhbHNlKSwKLSAgICAgICAgICBtRXh0ZXJuYWxEYXRhKG51bGxwdHIpLCBtQXVkaW9CdWZmZXJ7MCwge251bGxwdHJ9fSB7Ci0gICAgbUhpZGxCdWZmZXIuaWQgPSBtYWtlVW5pcXVlSWQoKTsKLSAgICBtSGlkbEJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKLX0KLQotRWZmZWN0QnVmZmVySGFsSGlkbDo6fkVmZmVjdEJ1ZmZlckhhbEhpZGwoKSB7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmluaXQoKSB7Ci0gICAgc3A8SUFsbG9jYXRvcj4gYXNobWVtID0gSUFsbG9jYXRvcjo6Z2V0U2VydmljZSgiYXNobWVtIik7Ci0gICAgaWYgKGFzaG1lbSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmV0cmlldmUgYXNobWVtIGFsbG9jYXRvciBzZXJ2aWNlIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBzdGF0dXNfdCByZXR2YWwgPSBOT19NRU1PUlk7Ci0gICAgUmV0dXJuPHZvaWQ+IHJlc3VsdCA9IGFzaG1lbS0+YWxsb2NhdGUoCi0gICAgICAgICAgICBtQnVmZmVyU2l6ZSwKLSAgICAgICAgICAgIFsmXShib29sIHN1Y2Nlc3MsIGNvbnN0IGhpZGxfbWVtb3J5JiBtZW1vcnkpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykgewotICAgICAgICAgICAgICAgICAgICBtSGlkbEJ1ZmZlci5kYXRhID0gbWVtb3J5OwotICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBPSzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmVzdWx0LmlzT2soKSAmJiByZXR2YWwgPT0gT0spIHsKLSAgICAgICAgbU1lbW9yeSA9IGhhcmR3YXJlOjptYXBNZW1vcnkobUhpZGxCdWZmZXIuZGF0YSk7Ci0gICAgICAgIGlmIChtTWVtb3J5ICE9IDApIHsKLSAgICAgICAgICAgIG1NZW1vcnktPnVwZGF0ZSgpOwotICAgICAgICAgICAgbUF1ZGlvQnVmZmVyLnJhdyA9IHN0YXRpY19jYXN0PHZvaWQqPihtTWVtb3J5LT5nZXRQb2ludGVyKCkpOwotICAgICAgICAgICAgbWVtc2V0KG1BdWRpb0J1ZmZlci5yYXcsIDAsIG1NZW1vcnktPmdldFNpemUoKSk7Ci0gICAgICAgICAgICBtTWVtb3J5LT5jb21taXQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbWFwIGFsbG9jYXRlZCBhc2htZW0iKTsKLSAgICAgICAgICAgIHJldHZhbCA9IE5PX01FTU9SWTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZnJvbSBhc2htZW0iLCAoaW50KW1CdWZmZXJTaXplKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdC5pc09rKCkgPyByZXR2YWwgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci19Ci0KLWF1ZGlvX2J1ZmZlcl90KiBFZmZlY3RCdWZmZXJIYWxIaWRsOjphdWRpb0J1ZmZlcigpIHsKLSAgICByZXR1cm4gJm1BdWRpb0J1ZmZlcjsKLX0KLQotdm9pZCogRWZmZWN0QnVmZmVySGFsSGlkbDo6ZXh0ZXJuYWxEYXRhKCkgY29uc3QgewotICAgIHJldHVybiBtRXh0ZXJuYWxEYXRhOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnNldEZyYW1lQ291bnQoc2l6ZV90IGZyYW1lQ291bnQpIHsKLSAgICBtSGlkbEJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKLSAgICBtQXVkaW9CdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7Ci0gICAgbUZyYW1lQ291bnRDaGFuZ2VkID0gdHJ1ZTsKLX0KLQotYm9vbCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpjaGVja0ZyYW1lQ291bnRDaGFuZ2UoKSB7Ci0gICAgYm9vbCByZXN1bHQgPSBtRnJhbWVDb3VudENoYW5nZWQ7Ci0gICAgbUZyYW1lQ291bnRDaGFuZ2VkID0gZmFsc2U7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpzZXRFeHRlcm5hbERhdGEodm9pZCogZXh0ZXJuYWwpIHsKLSAgICBtRXh0ZXJuYWxEYXRhID0gZXh0ZXJuYWw7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6dXBkYXRlKCkgewotICAgIHVwZGF0ZShtQnVmZmVyU2l6ZSk7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y29tbWl0KCkgewotICAgIGNvbW1pdChtQnVmZmVyU2l6ZSk7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6dXBkYXRlKHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKG1FeHRlcm5hbERhdGEgPT0gbnVsbHB0cikgcmV0dXJuOwotICAgIG1NZW1vcnktPnVwZGF0ZSgpOwotICAgIGlmIChzaXplID4gbUJ1ZmZlclNpemUpIHNpemUgPSBtQnVmZmVyU2l6ZTsKLSAgICBtZW1jcHkobUF1ZGlvQnVmZmVyLnJhdywgbUV4dGVybmFsRGF0YSwgc2l6ZSk7Ci0gICAgbU1lbW9yeS0+Y29tbWl0KCk7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y29tbWl0KHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKG1FeHRlcm5hbERhdGEgPT0gbnVsbHB0cikgcmV0dXJuOwotICAgIGlmIChzaXplID4gbUJ1ZmZlclNpemUpIHNpemUgPSBtQnVmZmVyU2l6ZTsKLSAgICBtZW1jcHkobUV4dGVybmFsRGF0YSwgbUF1ZGlvQnVmZmVyLnJhdywgc2l6ZSk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0QnVmZmVySGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDU3OGM2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9CVUZGRVJfSEFMX0hJRExfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMXzRfMF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC80LjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWVtb3J5LzEuMC9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEJ1ZmZlckhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KLQotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OkF1ZGlvQnVmZmVyOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwotdXNpbmcgYW5kcm9pZDo6aGlkbDo6bWVtb3J5OjpWMV8wOjpJTWVtb3J5OwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLWNsYXNzIEVmZmVjdEJ1ZmZlckhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICBzdGF0aWMgc3RhdHVzX3QgYWxsb2NhdGUoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcik7Ci0gICAgc3RhdGljIHN0YXR1c190IG1pcnJvcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcik7Ci0KLSAgICB2aXJ0dWFsIGF1ZGlvX2J1ZmZlcl90KiBhdWRpb0J1ZmZlcigpOwotICAgIHZpcnR1YWwgdm9pZCogZXh0ZXJuYWxEYXRhKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHNpemVfdCBnZXRTaXplKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbUJ1ZmZlclNpemU7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBzZXRFeHRlcm5hbERhdGEodm9pZCogZXh0ZXJuYWwpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRGcmFtZUNvdW50KHNpemVfdCBmcmFtZUNvdW50KTsKLSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlKCk7Ci0gICAgdmlydHVhbCB2b2lkIGNvbW1pdCgpOwotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGUoc2l6ZV90IHNpemUpOwotICAgIHZpcnR1YWwgdm9pZCBjb21taXQoc2l6ZV90IHNpemUpOwotCi0gICAgY29uc3QgQXVkaW9CdWZmZXImIGhpZGxCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtSGlkbEJ1ZmZlcjsgfQotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZTsKLQotICAgIHN0YXRpYyB1aW50NjRfdCBtYWtlVW5pcXVlSWQoKTsKLQotICAgIGNvbnN0IHNpemVfdCBtQnVmZmVyU2l6ZTsKLSAgICBib29sIG1GcmFtZUNvdW50Q2hhbmdlZDsKLSAgICB2b2lkKiBtRXh0ZXJuYWxEYXRhOwotICAgIEF1ZGlvQnVmZmVyIG1IaWRsQnVmZmVyOwotICAgIHNwPElNZW1vcnk+IG1NZW1vcnk7Ci0gICAgYXVkaW9fYnVmZmVyX3QgbUF1ZGlvQnVmZmVyOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIGV4cGxpY2l0IEVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZV90IHNpemUpOwotCi0gICAgdmlydHVhbCB+RWZmZWN0QnVmZmVySGFsSGlkbCgpOwotCi0gICAgc3RhdHVzX3QgaW5pdCgpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0SGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5OWM0YzguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkVmZmVjdEhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxjb21tb24vYWxsLXZlcnNpb25zL1ZlcnNpb25VdGlscy5oPgotI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0QnVmZmVySGFsSGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKLSNpbmNsdWRlICJIaWRsVXRpbHMuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6QXVkaW9CdWZmZXI7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpFZmZlY3RCdWZmZXJBY2Nlc3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpFZmZlY3RDb25maWdQYXJhbWV0ZXJzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6TWVzc2FnZVF1ZXVlRmxhZ0JpdHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpIaWRsVXRpbHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb0NoYW5uZWxNYXNrOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Gb3JtYXQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjp1dGlsczo6bWtFbnVtQ29udmVydGVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLUVmZmVjdEhhbEhpZGw6OkVmZmVjdEhhbEhpZGwoY29uc3Qgc3A8SUVmZmVjdD4mIGVmZmVjdCwgdWludDY0X3QgZWZmZWN0SWQpCi0gICAgICAgIDogbUVmZmVjdChlZmZlY3QpLCBtRWZmZWN0SWQoZWZmZWN0SWQpLCBtQnVmZmVyc0NoYW5nZWQodHJ1ZSksIG1FZkdyb3VwKG51bGxwdHIpIHsKLX0KLQotRWZmZWN0SGFsSGlkbDo6fkVmZmVjdEhhbEhpZGwoKSB7Ci0gICAgaWYgKG1FZmZlY3QgIT0gMCkgewotICAgICAgICBjbG9zZSgpOwotICAgICAgICBtRWZmZWN0LmNsZWFyKCk7Ci0gICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgfQotICAgIGlmIChtRWZHcm91cCkgewotICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOwotICAgIH0KLX0KLQotLy8gc3RhdGljCi12b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbCgKLSAgICAgICAgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgZGVzY3JpcHRvciwgZWZmZWN0X2Rlc2NyaXB0b3JfdCogaGFsRGVzY3JpcHRvcikgewotICAgIEhpZGxVdGlsczo6dXVpZFRvSGFsKGRlc2NyaXB0b3IudHlwZSwgJmhhbERlc2NyaXB0b3ItPnR5cGUpOwotICAgIEhpZGxVdGlsczo6dXVpZFRvSGFsKGRlc2NyaXB0b3IudXVpZCwgJmhhbERlc2NyaXB0b3ItPnV1aWQpOwotICAgIGhhbERlc2NyaXB0b3ItPmZsYWdzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGRlc2NyaXB0b3IuZmxhZ3MpOwotICAgIGhhbERlc2NyaXB0b3ItPmNwdUxvYWQgPSBkZXNjcmlwdG9yLmNwdUxvYWQ7Ci0gICAgaGFsRGVzY3JpcHRvci0+bWVtb3J5VXNhZ2UgPSBkZXNjcmlwdG9yLm1lbW9yeVVzYWdlOwotICAgIG1lbWNweShoYWxEZXNjcmlwdG9yLT5uYW1lLCBkZXNjcmlwdG9yLm5hbWUuZGF0YSgpLCBkZXNjcmlwdG9yLm5hbWUuc2l6ZSgpKTsKLSAgICBtZW1jcHkoaGFsRGVzY3JpcHRvci0+aW1wbGVtZW50b3IsCi0gICAgICAgICAgICBkZXNjcmlwdG9yLmltcGxlbWVudG9yLmRhdGEoKSwgZGVzY3JpcHRvci5pbXBsZW1lbnRvci5zaXplKCkpOwotfQotCi0vLyBUT0RPKG1uYWdhbm92KTogVGhlc2UgYnVmZmVyIGNvbnZlcnNpb24gZnVuY3Rpb25zIHNob3VsZCBiZSBzaGFyZWQgd2l0aCBFZmZlY3Qgd3JhcHBlcgotLy8gdmlhIEhpZGxVdGlscy4gTW92ZSB0aGVtIHRoZXJlIHdoZW4gaGFyZHdhcmUvaW50ZXJmYWNlcyB3aWxsIGdldCB1bi1mcm96ZW4gYWdhaW4uCi0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKAotICAgICAgICBjb25zdCBidWZmZXJfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0QnVmZmVyQ29uZmlnKiBjb25maWcpIHsKLSAgICBjb25maWctPnNhbXBsaW5nUmF0ZUh6ID0gaGFsQ29uZmlnLnNhbXBsaW5nUmF0ZTsKLSAgICBjb25maWctPmNoYW5uZWxzID0gbWtFbnVtQ29udmVydGVyPEF1ZGlvQ2hhbm5lbE1hc2s+KGhhbENvbmZpZy5jaGFubmVscyk7Ci0gICAgY29uZmlnLT5mb3JtYXQgPSBBdWRpb0Zvcm1hdChoYWxDb25maWcuZm9ybWF0KTsKLSAgICBjb25maWctPmFjY2Vzc01vZGUgPSBFZmZlY3RCdWZmZXJBY2Nlc3MoaGFsQ29uZmlnLmFjY2Vzc01vZGUpOwotICAgIGNvbmZpZy0+bWFzayA9IG1rRW51bUNvbnZlcnRlcjxFZmZlY3RDb25maWdQYXJhbWV0ZXJzPihoYWxDb25maWcubWFzayk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RCdWZmZXJDb25maWdUb0hhbCgKLSAgICAgICAgY29uc3QgRWZmZWN0QnVmZmVyQ29uZmlnJiBjb25maWcsIGJ1ZmZlcl9jb25maWdfdCogaGFsQ29uZmlnKSB7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXIuZnJhbWVDb3VudCA9IDA7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXIucmF3ID0gTlVMTDsKLSAgICBoYWxDb25maWctPnNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGluZ1JhdGVIejsKLSAgICBoYWxDb25maWctPmNoYW5uZWxzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNvbmZpZy5jaGFubmVscyk7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOwotICAgIGhhbENvbmZpZy0+YnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKLSAgICBoYWxDb25maWctPmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwotICAgIGhhbENvbmZpZy0+Zm9ybWF0ID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLmZvcm1hdCk7Ci0gICAgaGFsQ29uZmlnLT5hY2Nlc3NNb2RlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLmFjY2Vzc01vZGUpOwotICAgIGhhbENvbmZpZy0+bWFzayA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5tYXNrKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdENvbmZpZ0Zyb21IYWwoY29uc3QgZWZmZWN0X2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdENvbmZpZyogY29uZmlnKSB7Ci0gICAgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbChoYWxDb25maWcuaW5wdXRDZmcsICZjb25maWctPmlucHV0Q2ZnKTsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKGhhbENvbmZpZy5vdXRwdXRDZmcsICZjb25maWctPm91dHB1dENmZyk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RDb25maWdUb0hhbChjb25zdCBFZmZlY3RDb25maWcmIGNvbmZpZywgZWZmZWN0X2NvbmZpZ190KiBoYWxDb25maWcpIHsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdUb0hhbChjb25maWcuaW5wdXRDZmcsICZoYWxDb25maWctPmlucHV0Q2ZnKTsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdUb0hhbChjb25maWcub3V0cHV0Q2ZnLCAmaGFsQ29uZmlnLT5vdXRwdXRDZmcpOwotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmFuYWx5emVSZXN1bHQoY29uc3QgUmVzdWx0JiByZXN1bHQpIHsKLSAgICBzd2l0Y2ggKHJlc3VsdCkgewotICAgICAgICBjYXNlIFJlc3VsdDo6T0s6IHJldHVybiBPSzsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTOiByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9TVEFURTogcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDogcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfU1VQUE9SVEVEOiByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpSRVNVTFRfVE9PX0JJRzogcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRJbkJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKLSAgICBpZiAoIW1CdWZmZXJzQ2hhbmdlZCkgewotICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IG51bGxwdHIgfHwgbUluQnVmZmVyLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci5nZXQoKSAhPSBtSW5CdWZmZXIuZ2V0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXItPmF1ZGlvQnVmZmVyKCkgIT0gbUluQnVmZmVyLT5hdWRpb0J1ZmZlcigpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1JbkJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldE91dEJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKLSAgICBpZiAoIW1CdWZmZXJzQ2hhbmdlZCkgewotICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IG51bGxwdHIgfHwgbU91dEJ1ZmZlci5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXIuZ2V0KCkgIT0gbU91dEJ1ZmZlci5nZXQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci0+YXVkaW9CdWZmZXIoKSAhPSBtT3V0QnVmZmVyLT5hdWRpb0J1ZmZlcigpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1PdXRCdWZmZXIgPSBidWZmZXI7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzKCkgewotICAgIHJldHVybiBwcm9jZXNzSW1wbChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OlJFUVVFU1RfUFJPQ0VTUykpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzUmV2ZXJzZSgpIHsKLSAgICByZXR1cm4gcHJvY2Vzc0ltcGwoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpSRVFVRVNUX1BST0NFU1NfUkVWRVJTRSkpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcmVwYXJlRm9yUHJvY2Vzc2luZygpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IHRlbXBTdGF0dXNNUTsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5wcmVwYXJlRm9yUHJvY2Vzc2luZygKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTVFEZXNjcmlwdG9yU3luYzxSZXN1bHQ+JiBzdGF0dXNNUSkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBTdGF0dXNNUS5yZXNldChuZXcgU3RhdHVzTVEoc3RhdHVzTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpICYmIHRlbXBTdGF0dXNNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wU3RhdHVzTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSwgJm1FZkdyb3VwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgewotICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0gICAgaWYgKCF0ZW1wU3RhdHVzTVEgfHwgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpIHx8ICFtRWZHcm91cCkgewotICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgZWZmZWN0cyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgZWZmZWN0cyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIGVmZmVjdHMgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBtU3RhdHVzTVEgPSBzdGQ6Om1vdmUodGVtcFN0YXR1c01RKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLWJvb2wgRWZmZWN0SGFsSGlkbDo6bmVlZFRvUmVzZXRCdWZmZXJzKCkgewotICAgIGlmIChtQnVmZmVyc0NoYW5nZWQpIHJldHVybiB0cnVlOwotICAgIGJvb2wgaW5CdWZmZXJGcmFtZUNvdW50VXBkYXRlZCA9IG1JbkJ1ZmZlci0+Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7Ci0gICAgYm9vbCBvdXRCdWZmZXJGcmFtZUNvdW50VXBkYXRlZCA9IG1PdXRCdWZmZXItPmNoZWNrRnJhbWVDb3VudENoYW5nZSgpOwotICAgIHJldHVybiBpbkJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkIHx8IG91dEJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzSW1wbCh1aW50MzJfdCBtcUZsYWcpIHsKLSAgICBpZiAobUVmZmVjdCA9PSAwIHx8IG1JbkJ1ZmZlciA9PSAwIHx8IG1PdXRCdWZmZXIgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmICghbVN0YXR1c01RICYmIChzdGF0dXMgPSBwcmVwYXJlRm9yUHJvY2Vzc2luZygpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBpZiAobmVlZFRvUmVzZXRCdWZmZXJzKCkgJiYgKHN0YXR1cyA9IHNldFByb2Nlc3NCdWZmZXJzKCkpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIC8vIFRoZSBkYXRhIGlzIGFscmVhZHkgaW4gdGhlIGJ1ZmZlcnMsIGp1c3QgbmVlZCB0byBmbHVzaCBpdCBhbmQgd2FrZSB1cCB0aGUgc2VydmVyIHNpZGUuCi0gICAgc3RkOjphdG9taWNfdGhyZWFkX2ZlbmNlKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UpOwotICAgIG1FZkdyb3VwLT53YWtlKG1xRmxhZyk7Ci0gICAgdWludDMyX3QgZWZTdGF0ZSA9IDA7Ci1yZXRyeToKLSAgICBzdGF0dXNfdCByZXQgPSBtRWZHcm91cC0+d2FpdCgKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6RE9ORV9QUk9DRVNTSU5HKSwgJmVmU3RhdGUpOwotICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpET05FX1BST0NFU1NJTkcpKSB7Ci0gICAgICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICAgICAgbVN0YXR1c01RLT5yZWFkKCZyZXR2YWwpOwotICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0sgfHwgcmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9TVEFURSkgewotICAgICAgICAgICAgLy8gU3luYyBiYWNrIHRoZSBjaGFuZ2VkIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIuCi0gICAgICAgICAgICBzdGQ6OmF0b21pY190aHJlYWRfZmVuY2Uoc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFuYWx5emVSZXN1bHQocmV0dmFsKTsKLSAgICB9Ci0gICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKLSAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCi0gICAgICAgIGdvdG8gcmV0cnk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldFByb2Nlc3NCdWZmZXJzKCkgewotICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IG1FZmZlY3QtPnNldFByb2Nlc3NCdWZmZXJzKAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KG1JbkJ1ZmZlci5nZXQoKSktPmhpZGxCdWZmZXIoKSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPihtT3V0QnVmZmVyLmdldCgpKS0+aGlkbEJ1ZmZlcigpKTsKLSAgICBpZiAocmV0LmlzT2soKSAmJiByZXQgPT0gUmVzdWx0OjpPSykgewotICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Y29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKLSAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgewotICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOwotCi0gICAgLy8gU3BlY2lhbCBjYXNlcy4KLSAgICBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgfHwgY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUdfUkVWRVJTRSkgewotICAgICAgICByZXR1cm4gc2V0Q29uZmlnSW1wbChjbWRDb2RlLCBjbWRTaXplLCBwQ21kRGF0YSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKLSAgICB9IGVsc2UgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHIHx8IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHX1JFVkVSU0UpIHsKLSAgICAgICAgcmV0dXJuIGdldENvbmZpZ0ltcGwoY21kQ29kZSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKLSAgICB9Ci0KLSAgICAvLyBDb21tb24gY2FzZS4KLSAgICBoaWRsX3ZlYzx1aW50OF90PiBoaWRsRGF0YTsKLSAgICBpZiAocENtZERhdGEgIT0gbnVsbHB0ciAmJiBjbWRTaXplID4gMCkgewotICAgICAgICBoaWRsRGF0YS5zZXRUb0V4dGVybmFsKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHBDbWREYXRhKSwgY21kU2l6ZSk7Ci0gICAgfQotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICB1aW50MzJfdCByZXBseVNpemVTdHViID0gMDsKLSAgICBpZiAocmVwbHlTaXplID09IG51bGxwdHIgfHwgcFJlcGx5RGF0YSA9PSBudWxscHRyKSByZXBseVNpemUgPSAmcmVwbHlTaXplU3R1YjsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+Y29tbWFuZChjbWRDb2RlLCBoaWRsRGF0YSwgKnJlcGx5U2l6ZSwKLSAgICAgICAgICAgIFsmXShpbnQzMl90IHMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKnJlcGx5U2l6ZSA+IHJlc3VsdC5zaXplKCkpICpyZXBseVNpemUgPSByZXN1bHQuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSAhPSBudWxscHRyICYmICpyZXBseVNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocFJlcGx5RGF0YSwgJnJlc3VsdFswXSwgKnJlcGx5U2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcmV0LmlzT2soKSA/IHN0YXR1cyA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgewotICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+Z2V0RGVzY3JpcHRvcigKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzY3JpcHRvclRvSGFsKHJlc3VsdCwgcERlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXR2YWwpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpjbG9zZSgpIHsKLSAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBtRWZmZWN0LT5jbG9zZSgpOwotICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpnZXRDb25maWdJbXBsKAotICAgICAgICB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7Ci0gICAgaWYgKHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkgfHwgcFJlcGx5RGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHN0YXR1c190IHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICBSZXR1cm48dm9pZD4gcmV0OwotICAgIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfR0VUX0NPTkZJRykgewotICAgICAgICByZXQgPSBtRWZmZWN0LT5nZXRDb25maWcoWyZdIChSZXN1bHQgciwgY29uc3QgRWZmZWN0Q29uZmlnICZoaWRsQ29uZmlnKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHIpOwotICAgICAgICAgICAgaWYgKHIgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgIGVmZmVjdENvbmZpZ1RvSGFsKGhpZGxDb25maWcsIHN0YXRpY19jYXN0PGVmZmVjdF9jb25maWdfdCo+KHBSZXBseURhdGEpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0ID0gbUVmZmVjdC0+Z2V0Q29uZmlnUmV2ZXJzZShbJl0gKFJlc3VsdCByLCBjb25zdCBFZmZlY3RDb25maWcgJmhpZGxDb25maWcpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGFuYWx5emVSZXN1bHQocik7Ci0gICAgICAgICAgICBpZiAociA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgZWZmZWN0Q29uZmlnVG9IYWwoaGlkbENvbmZpZywgc3RhdGljX2Nhc3Q8ZWZmZWN0X2NvbmZpZ190Kj4ocFJlcGx5RGF0YSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0gICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgIHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0Q29uZmlnSW1wbCgKLSAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKLSAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpIHx8Ci0gICAgICAgICAgICByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSB8fCBwUmVwbHlEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgY29uc3QgZWZmZWN0X2NvbmZpZ190ICpoYWxDb25maWcgPSBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwQ21kRGF0YSk7Ci0gICAgaWYgKGhhbENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICE9IE5VTEwgfHwKLSAgICAgICAgICAgIGhhbENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAhPSBOVUxMIHx8Ci0gICAgICAgICAgICBoYWxDb25maWctPm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgIT0gTlVMTCB8fAotICAgICAgICAgICAgaGFsQ29uZmlnLT5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJCdWZmZXIgcHJvdmlkZXIgY2FsbGJhY2tzIGFyZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgfQotICAgIEVmZmVjdENvbmZpZyBoaWRsQ29uZmlnOwotICAgIGVmZmVjdENvbmZpZ0Zyb21IYWwoKmhhbENvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfQ09ORklHID8KLSAgICAgICAgICAgIG1FZmZlY3QtPnNldENvbmZpZyhoaWRsQ29uZmlnLCBudWxscHRyLCBudWxscHRyKSA6Ci0gICAgICAgICAgICBtRWZmZWN0LT5zZXRDb25maWdSZXZlcnNlKGhpZGxDb25maWcsIG51bGxwdHIsIG51bGxwdHIpOwotICAgIHN0YXR1c190IHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHJldCk7Ci0gICAgICAgICpzdGF0aWNfY2FzdDxpbnQzMl90Kj4ocFJlcGx5RGF0YSkgPSByZXN1bHQ7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0SGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTRkYWIxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfSEFMX0hJRExfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfSEFMX0hJRExfNF8wX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzQuMC9JRWZmZWN0Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8Zm1xL0V2ZW50RmxhZy5oPgotI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OkVmZmVjdEJ1ZmZlckNvbmZpZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OkVmZmVjdENvbmZpZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OkVmZmVjdERlc2NyaXB0b3I7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpJRWZmZWN0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6RXZlbnRGbGFnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLWNsYXNzIEVmZmVjdEhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0SGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBTZXQgdGhlIGlucHV0IGJ1ZmZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEluQnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcik7Ci0KLSAgICAvLyBTZXQgdGhlIG91dHB1dCBidWZmZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRCdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKTsKLQotICAgIC8vIEVmZmVjdCBwcm9jZXNzIGZ1bmN0aW9uLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2VzcygpOwotCi0gICAgLy8gUHJvY2VzcyByZXZlcnNlIHN0cmVhbSBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHBhc3MKLSAgICAvLyBhIHJlZmVyZW5jZSBzdHJlYW0gdG8gdGhlIGVmZmVjdCBlbmdpbmUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwcm9jZXNzUmV2ZXJzZSgpOwotCi0gICAgLy8gU2VuZCBhIGNvbW1hbmQgYW5kIHJlY2VpdmUgYSByZXNwb25zZSB0by9mcm9tIGVmZmVjdCBlbmdpbmUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjb21tYW5kKHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLAotICAgICAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7Ci0KLSAgICAvLyBSZXR1cm5zIHRoZSBlZmZlY3QgZGVzY3JpcHRvci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOwotCi0gICAgLy8gRnJlZSByZXNvdXJjZXMgb24gdGhlIHJlbW90ZSBzaWRlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2UoKTsKLQotICAgIC8vIFdoZXRoZXIgaXQncyBhIGxvY2FsIGltcGxlbWVudGF0aW9uLgotICAgIHZpcnR1YWwgYm9vbCBpc0xvY2FsKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgIHVpbnQ2NF90IGVmZmVjdElkKCkgY29uc3QgeyByZXR1cm4gbUVmZmVjdElkOyB9Ci0KLSAgICBzdGF0aWMgdm9pZCBlZmZlY3REZXNjcmlwdG9yVG9IYWwoCi0gICAgICAgICAgICBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiBkZXNjcmlwdG9yLCBlZmZlY3RfZGVzY3JpcHRvcl90KiBoYWxEZXNjcmlwdG9yKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBFZmZlY3RzRmFjdG9yeUhhbEhpZGw7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8Ci0gICAgICAgIGhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpSZXN1bHQsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBTdGF0dXNNUTsKLQotICAgIHNwPElFZmZlY3Q+IG1FZmZlY3Q7Ci0gICAgY29uc3QgdWludDY0X3QgbUVmZmVjdElkOwotICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gbUluQnVmZmVyOwotICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gbU91dEJ1ZmZlcjsKLSAgICBib29sIG1CdWZmZXJzQ2hhbmdlZDsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKLSAgICBFdmVudEZsYWcqIG1FZkdyb3VwOwotCi0gICAgc3RhdGljIHN0YXR1c190IGFuYWx5emVSZXN1bHQoY29uc3QgaGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OlJlc3VsdCYgcmVzdWx0KTsKLSAgICBzdGF0aWMgdm9pZCBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKAotICAgICAgICAgICAgY29uc3QgYnVmZmVyX2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdEJ1ZmZlckNvbmZpZyogY29uZmlnKTsKLSAgICBzdGF0aWMgdm9pZCBlZmZlY3RCdWZmZXJDb25maWdUb0hhbCgKLSAgICAgICAgICAgIGNvbnN0IEVmZmVjdEJ1ZmZlckNvbmZpZyYgY29uZmlnLCBidWZmZXJfY29uZmlnX3QqIGhhbENvbmZpZyk7Ci0gICAgc3RhdGljIHZvaWQgZWZmZWN0Q29uZmlnRnJvbUhhbChjb25zdCBlZmZlY3RfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0Q29uZmlnKiBjb25maWcpOwotICAgIHN0YXRpYyB2b2lkIGVmZmVjdENvbmZpZ1RvSGFsKGNvbnN0IEVmZmVjdENvbmZpZyYgY29uZmlnLCBlZmZlY3RfY29uZmlnX3QqIGhhbENvbmZpZyk7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgRWZmZWN0SGFsSGlkbChjb25zdCBzcDxJRWZmZWN0PiYgZWZmZWN0LCB1aW50NjRfdCBlZmZlY3RJZCk7Ci0KLSAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IHJlbGVhc2VzIHRoZSBlZmZlY3QuCi0gICAgdmlydHVhbCB+RWZmZWN0SGFsSGlkbCgpOwotCi0gICAgc3RhdHVzX3QgZ2V0Q29uZmlnSW1wbCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKTsKLSAgICBzdGF0dXNfdCBwcmVwYXJlRm9yUHJvY2Vzc2luZygpOwotICAgIGJvb2wgbmVlZFRvUmVzZXRCdWZmZXJzKCk7Ci0gICAgc3RhdHVzX3QgcHJvY2Vzc0ltcGwodWludDMyX3QgbXFGbGFnKTsKLSAgICBzdGF0dXNfdCBzZXRDb25maWdJbXBsKAotICAgICAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsCi0gICAgICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKTsKLSAgICBzdGF0dXNfdCBzZXRQcm9jZXNzQnVmZmVycygpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfSEFMX0hJRExfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZWQ3ODQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KLSNpbmNsdWRlIDxsaWJhdWRpb2hhbC80LjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCi0jaW5jbHVkZSAiSGlkbFV0aWxzLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkhpZGxVdGlsczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OlV1aWQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpJRWZmZWN0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6UmVzdWx0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLUVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCkgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiRWZmZWN0c0ZhY3RvcnkiKSB7Ci0gICAgbUVmZmVjdHNGYWN0b3J5ID0gSUVmZmVjdHNGYWN0b3J5OjpnZXRTZXJ2aWNlKCk7Ci0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb2J0YWluIElFZmZlY3RzRmFjdG9yeSBzZXJ2aWNlLCB0ZXJtaW5hdGluZyBwcm9jZXNzLiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLX0KLQotRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjp+RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCkgewotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OnF1ZXJ5QWxsRGVzY3JpcHRvcnMoKSB7Ci0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+Z2V0QWxsRGVzY3JpcHRvcnMoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPEVmZmVjdERlc2NyaXB0b3I+JiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBtTGFzdERlc2NyaXB0b3JzID0gcmVzdWx0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmIChyZXQuaXNPaygpKSB7Ci0gICAgICAgIHJldHVybiByZXR2YWwgPT0gUmVzdWx0OjpPSyA/IE9LIDogTk9fSU5JVDsKLSAgICB9Ci0gICAgbUxhc3REZXNjcmlwdG9ycy5yZXNpemUoMCk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OnF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqcE51bUVmZmVjdHMpIHsKLSAgICBzdGF0dXNfdCBxdWVyeVJlc3VsdCA9IHF1ZXJ5QWxsRGVzY3JpcHRvcnMoKTsKLSAgICBpZiAocXVlcnlSZXN1bHQgPT0gT0spIHsKLSAgICAgICAgKnBOdW1FZmZlY3RzID0gbUxhc3REZXNjcmlwdG9ycy5zaXplKCk7Ci0gICAgfQotICAgIHJldHVybiBxdWVyeVJlc3VsdDsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpnZXREZXNjcmlwdG9yKAotICAgICAgICB1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKLSAgICAvLyBUT0RPOiBXZSBuZWVkIHNvbWVob3cgdG8gdHJhY2sgdGhlIGNoYW5nZXMgb24gdGhlIHNlcnZlciBzaWRlCi0gICAgLy8gb3IgZmlndXJlIG91dCBob3cgdG8gY29udmVydCBldmVyeWJvZHkgdG8gcXVlcnkgYWxsIHRoZSBkZXNjcmlwdG9ycyBhdCBvbmNlLgotICAgIC8vIFRPRE86IGNoZWNrIGZvciBudWxscHRyCi0gICAgaWYgKG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgc3RhdHVzX3QgcXVlcnlSZXN1bHQgPSBxdWVyeUFsbERlc2NyaXB0b3JzKCk7Ci0gICAgICAgIGlmIChxdWVyeVJlc3VsdCAhPSBPSykgcmV0dXJuIHF1ZXJ5UmVzdWx0OwotICAgIH0KLSAgICBpZiAoaW5kZXggPj0gbUxhc3REZXNjcmlwdG9ycy5zaXplKCkpIHJldHVybiBOQU1FX05PVF9GT1VORDsKLSAgICBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwobUxhc3REZXNjcmlwdG9yc1tpbmRleF0sIHBEZXNjcmlwdG9yKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcigKLSAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7Ci0gICAgLy8gVE9ETzogY2hlY2sgZm9yIG51bGxwdHIKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFV1aWQgaGlkbFV1aWQ7Ci0gICAgSGlkbFV0aWxzOjp1dWlkRnJvbUhhbCgqcEVmZmVjdFV1aWQsICZoaWRsVXVpZCk7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmdldERlc2NyaXB0b3IoaGlkbFV1aWQsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIHJlc3VsdCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbChyZXN1bHQsIHBEZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHJldHVybiBPSzsKLSAgICAgICAgZWxzZSBpZiAocmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFMpIHJldHVybiBOQU1FX05PVF9GT1VORDsKLSAgICAgICAgZWxzZSByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmNyZWF0ZUVmZmVjdCgKLSAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsCi0gICAgICAgIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gKmVmZmVjdCkgewotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgVXVpZCBoaWRsVXVpZDsKLSAgICBIaWRsVXRpbHM6OnV1aWRGcm9tSGFsKCpwRWZmZWN0VXVpZCwgJmhpZGxVdWlkKTsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+Y3JlYXRlRWZmZWN0KAotICAgICAgICAgICAgaGlkbFV1aWQsIHNlc3Npb25JZCwgaW9JZCwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SUVmZmVjdD4mIHJlc3VsdCwgdWludDY0X3QgZWZmZWN0SWQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqZWZmZWN0ID0gbmV3IEVmZmVjdEhhbEhpZGwocmVzdWx0LCBlZmZlY3RJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7Ci0gICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgICAgIGVsc2UgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpkdW1wRWZmZWN0cyhpbnQgZmQpIHsKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwotICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOwotICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5kZWJ1ZyhoaWRsSGFuZGxlLCB7fSAvKiBvcHRpb25zICovKTsKLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6YWxsb2NhdGVCdWZmZXIoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHJldHVybiBFZmZlY3RCdWZmZXJIYWxIaWRsOjphbGxvY2F0ZShzaXplLCBidWZmZXIpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6Om1pcnJvckJ1ZmZlcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHJldHVybiBFZmZlY3RCdWZmZXJIYWxIaWRsOjptaXJyb3IoZXh0ZXJuYWwsIHNpemUsIGJ1ZmZlcik7Ci19Ci0KLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTJmNWY2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDgyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJTdHJlYW1IYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSVN0cmVhbU91dENhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxtZWRpYXV0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbEhpZGwuaCIKLSNpbmNsdWRlICJWZXJzaW9uVXRpbHMuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9DaGFubmVsTWFzazsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvQ29udGVudFR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb0Zvcm1hdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvU291cmNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Vc2FnZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OlRocmVhZEluZm87Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6QXVkaW9EcmFpbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJU3RyZWFtT3V0Q2FsbGJhY2s7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6TWVzc2FnZVF1ZXVlRmxhZ0JpdHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6TWljcm9waG9uZUluZm87Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6TW1hcEJ1ZmZlckluZm87Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6TW1hcFBvc2l0aW9uOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlBhcmFtZXRlclZhbHVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlBsYXliYWNrVHJhY2tNZXRhZGF0YTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZWNvcmRUcmFja01ldGFkYXRhOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpUaW1lU3BlYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwotdXNpbmcgUmVhZENvbW1hbmQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVN0cmVhbUluOjpSZWFkQ29tbWFuZDsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1TdHJlYW1IYWxIaWRsOjpTdHJlYW1IYWxIaWRsKElTdHJlYW0gKnN0cmVhbSkKLSAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiU3RyZWFtIiksCi0gICAgICAgICAgbVN0cmVhbShzdHJlYW0pLAotICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eShIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQpLAotICAgICAgICAgIG1DYWNoZWRCdWZmZXJTaXplKDApewotCi0gICAgLy8gSW5zdHJ1bWVudCBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KLSAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgY2hhbm5lbCBtYXNrLCBmb3JtYXQsIGFuZCBzYW1wbGUgcmF0ZSBkbyBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLgotICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIgJiYgbVN0cmVhbVBvd2VyTG9nLmlzVXNlckRlYnVnT3JFbmdCdWlsZCgpKSB7Ci0gICAgICAgIC8vIE9idGFpbiBhdWRpbyBwcm9wZXJ0aWVzIChzZWUgU3RyZWFtSGFsSGlkbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKCkgYmVsb3cpLgotICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICAgICAgICAgIFsmXShhdXRvIHNyLCBhdXRvIG0sIGF1dG8gZikgewotICAgICAgICAgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KHNyLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpKTsKLSAgICAgICAgICAgIH0pOwotICAgIH0KLX0KLQotU3RyZWFtSGFsSGlkbDo6flN0cmVhbUhhbEhpZGwoKSB7Ci0gICAgbVN0cmVhbSA9IG51bGxwdHI7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRTYW1wbGVSYXRlIiwgbVN0cmVhbS0+Z2V0U2FtcGxlUmF0ZSgpLCByYXRlKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oImdldEJ1ZmZlclNpemUiLCBtU3RyZWFtLT5nZXRCdWZmZXJTaXplKCksIHNpemUpOwotICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgbUNhY2hlZEJ1ZmZlclNpemUgPSAqc2l6ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRDaGFubmVsTWFzayIsIG1TdHJlYW0tPmdldENoYW5uZWxNYXNrKCksIG1hc2spOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZvcm1hdCIsIG1TdHJlYW0tPmdldEZvcm1hdCgpLCBmb3JtYXQpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgICAgIFsmXSh1aW50MzJfdCBzciwgYXV0byBtLCBhdXRvIGYpIHsKLSAgICAgICAgICAgICAgICAqc2FtcGxlUmF0ZSA9IHNyOwotICAgICAgICAgICAgICAgICptYXNrID0gc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pOwotICAgICAgICAgICAgICAgICpmb3JtYXQgPSBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4oZik7Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QXVkaW9Qcm9wZXJ0aWVzIiwgcmV0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gaGlkbFBhcmFtczsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbWV0ZXJzRnJvbUhhbChrdlBhaXJzLCAmaGlkbFBhcmFtcyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0UGFyYW1ldGVycyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHM6OnNldFBhcmFtZXRlcnMobVN0cmVhbSwgaGlkbFBhcmFtcywge30gLyogb3B0aW9ucyAqLykpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgewotICAgIHZhbHVlcy0+Y2xlYXIoKTsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBoaWRsS2V5czsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBrZXlzRnJvbUhhbChrZXlzLCAmaGlkbEtleXMpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gdXRpbHM6OmdldFBhcmFtZXRlcnMoCi0gICAgICAgICAgICBtU3RyZWFtLAotICAgICAgICAgICAge30gLyogY29udGV4dCAqLywKLSAgICAgICAgICAgIGhpZGxLZXlzLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzVG9IYWwocGFyYW1ldGVycywgdmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UGFyYW1ldGVycyIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6YWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiYWRkRWZmZWN0IiwgbVN0cmVhbS0+YWRkRWZmZWN0KAotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RIYWxIaWRsKj4oZWZmZWN0LmdldCgpKS0+ZWZmZWN0SWQoKSkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpyZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJyZW1vdmVFZmZlY3QiLCBtU3RyZWFtLT5yZW1vdmVFZmZlY3QoCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEhhbEhpZGwqPihlZmZlY3QuZ2V0KCkpLT5lZmZlY3RJZCgpKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0YW5kYnkoKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RhbmRieSIsIG1TdHJlYW0tPnN0YW5kYnkoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmR1bXAoaW50IGZkKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKLSAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmRlYnVnKGhpZGxIYW5kbGUsIHt9IC8qIG9wdGlvbnMgKi8pOwotICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhpZGxIYW5kbGUpOwotICAgIG1TdHJlYW1Qb3dlckxvZy5kdW1wKGZkKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZHVtcCIsIHJldCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0YXJ0KCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0YXJ0IiwgbVN0cmVhbS0+c3RhcnQoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0b3AoKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RvcCIsIG1TdHJlYW0tPnN0b3AoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Y3JlYXRlTW1hcEJ1ZmZlcigKLSAgICAgICAgICAgIG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IE1tYXBCdWZmZXJJbmZvJiBoaWRsSW5mbykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGUgKmhhbmRsZSA9IGhpZGxJbmZvLnNoYXJlZE1lbW9yeS5oYW5kbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZS0+bnVtRmRzID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2hhcmVkX21lbW9yeV9mZCA9IGhhbmRsZS0+ZGF0YVswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmZsYWdzID0gYXVkaW9fbW1hcF9idWZmZXJfZmxhZyhoaWRsSW5mby5mbGFncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5idWZmZXJfc2l6ZV9mcmFtZXMgPSBoaWRsSW5mby5idWZmZXJTaXplRnJhbWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVnYXRpdmUgYnVmZmVyIHNpemUgZnJhbWUgd2FzIGEgaGFjayBpbiBPIGFuZCBQIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmRpY2F0ZSB0aGF0IHRoZSBidWZmZXIgaXMgc2hhcmVhYmxlIHRvIGFwcGxpY2F0aW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8tPmJ1ZmZlcl9zaXplX2ZyYW1lcyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5idWZmZXJfc2l6ZV9mcmFtZXMgKj0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+ZmxhZ3MgPSBhdWRpb19tbWFwX2J1ZmZlcl9mbGFnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+ZmxhZ3MgfCBBVURJT19NTUFQX0FQUExJQ0FUSU9OX1NIQVJFQUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5idXJzdF9zaXplX2ZyYW1lcyA9IGhpZGxJbmZvLmJ1cnN0U2l6ZUZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZm8tPnNoYXJlZF9tZW1vcnlfYWRkcmVzcyBpcyBub3QgbmVlZGVkIGluIEhJREwgY29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2hhcmVkX21lbW9yeV9hZGRyZXNzID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImNyZWF0ZU1tYXBCdWZmZXIiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pIHsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRNbWFwUG9zaXRpb24oCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IE1tYXBQb3NpdGlvbiYgaGlkbFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24tPnRpbWVfbmFub3NlY29uZHMgPSBoaWRsUG9zaXRpb24udGltZU5hbm9zZWNvbmRzOwotICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi0+cG9zaXRpb25fZnJhbWVzID0gaGlkbFBvc2l0aW9uLnBvc2l0aW9uRnJhbWVzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNbWFwUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSkgewotICAgIG1IYWxUaHJlYWRQcmlvcml0eSA9IHByaW9yaXR5OwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Q2FjaGVkQnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICBpZiAobUNhY2hlZEJ1ZmZlclNpemUgIT0gMCkgewotICAgICAgICAqc2l6ZSA9IG1DYWNoZWRCdWZmZXJTaXplOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotICAgIHJldHVybiBnZXRCdWZmZXJTaXplKHNpemUpOwotfQotCi1ib29sIFN0cmVhbUhhbEhpZGw6OnJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShwaWRfdCB0aHJlYWRQaWQsIHBpZF90IHRocmVhZElkKSB7Ci0gICAgaWYgKG1IYWxUaHJlYWRQcmlvcml0eSA9PSBIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGludCBlcnIgPSByZXF1ZXN0UHJpb3JpdHkoCi0gICAgICAgICAgICB0aHJlYWRQaWQsIHRocmVhZElkLAotICAgICAgICAgICAgbUhhbFRocmVhZFByaW9yaXR5LCBmYWxzZSAvKmlzRm9yQXBwKi8sIHRydWUgLyphc3luY2hyb25vdXMqLyk7Ci0gICAgQUxPR0VfSUYoZXJyLCAiZmFpbGVkIHRvIHNldCBwcmlvcml0eSAlZCBmb3IgcGlkICVkIHRpZCAlZDsgZXJyb3IgJWQiLAotICAgICAgICAgICAgbUhhbFRocmVhZFByaW9yaXR5LCB0aHJlYWRQaWQsIHRocmVhZElkLCBlcnIpOwotICAgIC8vIEF1ZGlvIHdpbGwgc3RpbGwgd29yaywgYnV0IGxhdGVuY3kgd2lsbCBiZSBoaWdoZXIgYW5kIHNvbWV0aW1lcyB1bmFjY2VwdGFibGUuCi0gICAgcmV0dXJuIGVyciA9PSAwOwotfQotCi1uYW1lc3BhY2UgewotCi0vKiBOb3RlcyBvbiBjYWxsYmFjayBvd25lcnNoaXAuCi0KLVRoaXMgaXMgaG93IChIdylCaW5kZXIgb3duZXJzaGlwIG1vZGVsIGxvb2tzIGxpa2UuIFRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KLWlzIG93bmVkIGJ5IEJpbmRlciBmcmFtZXdvcmsgKHZpYSBzcDw+KS4gUHJveGllcyBhcmUgb3duZWQgYnkgY2xpZW50cy4KLVdoZW4gdGhlIGxhc3QgcHJveHkgZGlzYXBwZWFycywgQmluZGVyIGZyYW1ld29yayByZWxlYXNlcyB0aGUgc2VydmVyIGltcGwuCi0KLVRodXMsIGl0IGlzIG5vdCBuZWVkZWQgdG8ga2VlcCBhbnkgcmVmZXJlbmNlcyB0byBTdHJlYW1PdXRDYWxsYmFjayAodGhpcyBpcwotdGhlIHNlcnZlciBpbXBsKSAtLSBpdCB3aWxsIGxpdmUgYXMgbG9uZyBhcyBIQUwgc2VydmVyIGhvbGRzIGEgc3Ryb25nIHJlZiB0bwotSVN0cmVhbU91dENhbGxiYWNrIHByb3h5LiBXZSBjbGVhciB0aGF0IHJlZmVyZW5jZSBieSBjYWxsaW5nICdjbGVhckNhbGxiYWNrJwotZnJvbSB0aGUgZGVzdHJ1Y3RvciBvZiBTdHJlYW1PdXRIYWxIaWRsLgotCi1UaGUgY2FsbGJhY2sgb25seSBrZWVwcyBhIHdlYWsgcmVmZXJlbmNlIHRvIHRoZSBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgb3duZWQKLWJ5IEF1ZGlvRmxpbmdlci4KLQotKi8KLQotc3RydWN0IFN0cmVhbU91dENhbGxiYWNrIDogcHVibGljIElTdHJlYW1PdXRDYWxsYmFjayB7Ci0gICAgU3RyZWFtT3V0Q2FsbGJhY2soY29uc3Qgd3A8U3RyZWFtT3V0SGFsSGlkbD4mIHN0cmVhbSkgOiBtU3RyZWFtKHN0cmVhbSkge30KLQotICAgIC8vIElTdHJlYW1PdXRDYWxsYmFjayBpbXBsZW1lbnRhdGlvbgotICAgIFJldHVybjx2b2lkPiBvbldyaXRlUmVhZHkoKSAgb3ZlcnJpZGUgewotICAgICAgICBzcDxTdHJlYW1PdXRIYWxIaWRsPiBzdHJlYW0gPSBtU3RyZWFtLnByb21vdGUoKTsKLSAgICAgICAgaWYgKHN0cmVhbSAhPSAwKSB7Ci0gICAgICAgICAgICBzdHJlYW0tPm9uV3JpdGVSZWFkeSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gICAgUmV0dXJuPHZvaWQ+IG9uRHJhaW5SZWFkeSgpICBvdmVycmlkZSB7Ci0gICAgICAgIHNwPFN0cmVhbU91dEhhbEhpZGw+IHN0cmVhbSA9IG1TdHJlYW0ucHJvbW90ZSgpOwotICAgICAgICBpZiAoc3RyZWFtICE9IDApIHsKLSAgICAgICAgICAgIHN0cmVhbS0+b25EcmFpblJlYWR5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48dm9pZD4gb25FcnJvcigpICBvdmVycmlkZSB7Ci0gICAgICAgIHNwPFN0cmVhbU91dEhhbEhpZGw+IHN0cmVhbSA9IG1TdHJlYW0ucHJvbW90ZSgpOwotICAgICAgICBpZiAoc3RyZWFtICE9IDApIHsKLSAgICAgICAgICAgIHN0cmVhbS0+b25FcnJvcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgd3A8U3RyZWFtT3V0SGFsSGlkbD4gbVN0cmVhbTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1TdHJlYW1PdXRIYWxIaWRsOjpTdHJlYW1PdXRIYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1PdXQ+JiBzdHJlYW0pCi0gICAgICAgIDogU3RyZWFtSGFsSGlkbChzdHJlYW0uZ2V0KCkpLCBtU3RyZWFtKHN0cmVhbSksIG1Xcml0ZXJDbGllbnQoMCksIG1FZkdyb3VwKG51bGxwdHIpIHsKLX0KLQotU3RyZWFtT3V0SGFsSGlkbDo6flN0cmVhbU91dEhhbEhpZGwoKSB7Ci0gICAgaWYgKG1TdHJlYW0gIT0gMCkgewotICAgICAgICBpZiAobUNhbGxiYWNrLnVuc2FmZV9nZXQoKSkgewotICAgICAgICAgICAgcHJvY2Vzc1JldHVybigiY2xlYXJDYWxsYmFjayIsIG1TdHJlYW0tPmNsZWFyQ2FsbGJhY2soKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvY2Vzc1JldHVybigiY2xvc2UiLCBtU3RyZWFtLT5jbG9zZSgpKTsKLSAgICAgICAgbVN0cmVhbS5jbGVhcigpOwotICAgIH0KLSAgICBtQ2FsbGJhY2suY2xlYXIoKTsKLSAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgIGlmIChtRWZHcm91cCkgewotICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRGcmFtZVNpemUiLCBtU3RyZWFtLT5nZXRGcmFtZVNpemUoKSwgc2l6ZSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVdyaXRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7Ci0gICAgICAgIHJldHVybiBjYWxsV3JpdGVyVGhyZWFkKAotICAgICAgICAgICAgICAgIFdyaXRlQ29tbWFuZDo6R0VUX0xBVEVOQ1ksICJnZXRMYXRlbmN5IiwgbnVsbHB0ciwgMCwKLSAgICAgICAgICAgICAgICBbJl0oY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICpsYXRlbmN5ID0gd3JpdGVTdGF0dXMucmVwbHkubGF0ZW5jeU1zOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRMYXRlbmN5IiwgbVN0cmVhbS0+Z2V0TGF0ZW5jeSgpLCBsYXRlbmN5KTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRWb2x1bWUiLCBtU3RyZWFtLT5zZXRWb2x1bWUobGVmdCwgcmlnaHQpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6d3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbikgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgICp3cml0dGVuID0gMDsKLQotICAgIGlmIChieXRlcyA9PSAwICYmICFtRGF0YU1RKSB7Ci0gICAgICAgIC8vIENhbid0IGRldGVybWluZSB0aGUgc2l6ZSBmb3IgdGhlIE1RIGJ1ZmZlci4gV2FpdCBmb3IgYSBub24tZW1wdHkgd3JpdGUgcmVxdWVzdC4KLSAgICAgICAgQUxPR1dfSUYobUNhbGxiYWNrLnVuc2FmZV9nZXQoKSwgIkZpcnN0IGNhbGwgdG8gYXN5bmMgd3JpdGUgd2l0aCAwIGJ5dGVzIik7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgaWYgKCFtRGF0YU1RKSB7Ci0gICAgICAgIC8vIEluIGNhc2UgaWYgcGxheWJhY2sgc3RhcnRzIGNsb3NlIHRvIHRoZSBlbmQgb2YgYSBjb21wcmVzc2VkIHRyYWNrLCB0aGUgYnl0ZXMKLSAgICAgICAgLy8gdGhhdCBuZWVkIHRvIGJlIHdyaXR0ZW4gaXMgbGVzcyB0aGFuIHRoZSBhY3R1YWwgYnVmZmVyIHNpemUuIE5lZWQgdG8gdXNlCi0gICAgICAgIC8vIGZ1bGwgYnVmZmVyIHNpemUgZm9yIHRoZSBNUSBzaW5jZSBvdGhlcndpc2UgYWZ0ZXIgc2Vla2luZyBiYWNrIHRvIHRoZSBtaWRkbGUKLSAgICAgICAgLy8gZGF0YSB3aWxsIGJlIHRydW5jYXRlZC4KLSAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemU7Ci0gICAgICAgIGlmICgoc3RhdHVzID0gZ2V0Q2FjaGVkQnVmZmVyU2l6ZSgmYnVmZmVyU2l6ZSkpICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChieXRlcyA+IGJ1ZmZlclNpemUpIGJ1ZmZlclNpemUgPSBieXRlczsKLSAgICAgICAgaWYgKChzdGF0dXMgPSBwcmVwYXJlRm9yV3JpdGluZyhidWZmZXJTaXplKSkgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0dXMgPSBjYWxsV3JpdGVyVGhyZWFkKAotICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpXUklURSwgIndyaXRlIiwgc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJ1ZmZlciksIGJ5dGVzLAotICAgICAgICAgICAgWyZdIChjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAqd3JpdHRlbiA9IHdyaXRlU3RhdHVzLnJlcGx5LndyaXR0ZW47Ci0gICAgICAgICAgICAgICAgLy8gRGlhZ25vc3RpY3Mgb2YgdGhlIGNhdXNlIG9mIGIvMzU4MTMxMTMuCi0gICAgICAgICAgICAgICAgQUxPR0VfSUYoKndyaXR0ZW4gPiBieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICJoYWwgcmVwb3J0cyBtb3JlIGJ5dGVzIHdyaXR0ZW4gdGhhbiBhc2tlZCBmb3I6ICVsbGQgPiAlbGxkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpKndyaXR0ZW4sIChsb25nIGxvbmcpYnl0ZXMpOwotICAgICAgICAgICAgfSk7Ci0gICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICp3cml0dGVuKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpjYWxsV3JpdGVyVGhyZWFkKAotICAgICAgICBXcml0ZUNvbW1hbmQgY21kLCBjb25zdCBjaGFyKiBjbWROYW1lLAotICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YVNpemUsIFN0cmVhbU91dEhhbEhpZGw6OldyaXRlckNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgaWYgKCFtQ29tbWFuZE1RLT53cml0ZSgmY21kKSkgewotICAgICAgICBBTE9HRSgiY29tbWFuZCBtZXNzYWdlIHF1ZXVlIHdyaXRlIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7Ci0gICAgICAgIHJldHVybiAtRUFHQUlOOwotICAgIH0KLSAgICBpZiAoZGF0YSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHNpemVfdCBhdmFpbGFibGVUb1dyaXRlID0gbURhdGFNUS0+YXZhaWxhYmxlVG9Xcml0ZSgpOwotICAgICAgICBpZiAoZGF0YVNpemUgPiBhdmFpbGFibGVUb1dyaXRlKSB7Ci0gICAgICAgICAgICBBTE9HVygidHJ1bmNhdGluZyB3cml0ZSBkYXRhIGZyb20gJWxsZCB0byAlbGxkIGR1ZSB0byBpbnN1ZmZpY2llbnQgZGF0YSBxdWV1ZSBzcGFjZSIsCi0gICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZGF0YVNpemUsIChsb25nIGxvbmcpYXZhaWxhYmxlVG9Xcml0ZSk7Ci0gICAgICAgICAgICBkYXRhU2l6ZSA9IGF2YWlsYWJsZVRvV3JpdGU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtRGF0YU1RLT53cml0ZShkYXRhLCBkYXRhU2l6ZSkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJkYXRhIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtRWZHcm91cC0+d2FrZShzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9FTVBUWSkpOwotCi0gICAgLy8gVE9ETzogUmVtb3ZlIG1hbnVhbCBldmVudCBmbGFnIGhhbmRsaW5nIG9uY2UgYmxvY2tpbmcgTVEgaXMgaW1wbGVtZW50ZWQuIGIvMzM4MTU0MjIKLSAgICB1aW50MzJfdCBlZlN0YXRlID0gMDsKLXJldHJ5OgotICAgIHN0YXR1c190IHJldCA9IG1FZkdyb3VwLT53YWl0KHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0ZVTEwpLCAmZWZTdGF0ZSk7Ci0gICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSkgewotICAgICAgICBXcml0ZVN0YXR1cyB3cml0ZVN0YXR1czsKLSAgICAgICAgd3JpdGVTdGF0dXMucmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgICAgIGlmICghbVN0YXR1c01RLT5yZWFkKCZ3cml0ZVN0YXR1cykpIHsKLSAgICAgICAgICAgIEFMT0dFKCJzdGF0dXMgbWVzc2FnZSByZWFkIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdyaXRlU3RhdHVzLnJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICByZXQgPSBPSzsKLSAgICAgICAgICAgIGNhbGxiYWNrKHdyaXRlU3RhdHVzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldCA9IHByb2Nlc3NSZXR1cm4oY21kTmFtZSwgd3JpdGVTdGF0dXMucmV0dmFsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICBpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FSU5UUikgewotICAgICAgICAvLyBTcHVyaW91cyB3YWtldXAuIFRoaXMgbm9ybWFsbHkgcmV0cmllcyBubyBtb3JlIHRoYW4gb25jZS4KLSAgICAgICAgZ290byByZXRyeTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6cHJlcGFyZUZvcldyaXRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiB0ZW1wQ29tbWFuZE1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IHRlbXBEYXRhTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBwaWRfdCBoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+cHJlcGFyZUZvcldyaXRpbmcoCi0gICAgICAgICAgICAxLCBidWZmZXJTaXplLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tYW5kTVE6OkRlc2NyaXB0b3ImIGNvbW1hbmRNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YU1ROjpEZXNjcmlwdG9yJiBkYXRhTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXR1c01ROjpEZXNjcmlwdG9yJiBzdGF0dXNNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyZWFkSW5mbyYgaGFsVGhyZWFkSW5mbykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBDb21tYW5kTVEucmVzZXQobmV3IENvbW1hbmRNUShjb21tYW5kTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcERhdGFNUS5yZXNldChuZXcgRGF0YU1RKGRhdGFNUSkpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgJiYgdGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkUGlkID0gaGFsVGhyZWFkSW5mby5waWQ7Ci0gICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFRpZCA9IGhhbFRocmVhZEluZm8udGlkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgewotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicHJlcGFyZUZvcldyaXRpbmciLCByZXQsIHJldHZhbCk7Ci0gICAgfQotICAgIGlmICghdGVtcENvbW1hbmRNUSB8fCAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhdGVtcERhdGFNUSB8fCAhdGVtcERhdGFNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIW1FZkdyb3VwKSB7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wQ29tbWFuZE1RLCAiRmFpbGVkIHRvIG9idGFpbiBjb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcENvbW1hbmRNUSAmJiAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJDb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighdGVtcERhdGFNUSwgIkZhaWxlZCB0byBvYnRhaW4gZGF0YSBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBEYXRhTVEgJiYgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSwgIkRhdGEgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCi0gICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3Igd3JpdGluZyBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZCk7Ci0KLSAgICBtQ29tbWFuZE1RID0gc3RkOjptb3ZlKHRlbXBDb21tYW5kTVEpOwotICAgIG1EYXRhTVEgPSBzdGQ6Om1vdmUodGVtcERhdGFNUSk7Ci0gICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7Ci0gICAgbVdyaXRlckNsaWVudCA9IGdldHRpZCgpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcykgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldFJlbmRlclBvc2l0aW9uKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50MzJfdCBkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKmRzcEZyYW1lcyA9IGQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFJlbmRlclBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0TmV4dFdyaXRlVGltZXN0YW1wKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBpbnQ2NF90IHQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqdGltZXN0YW1wID0gdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UmVuZGVyUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjaykgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oCi0gICAgICAgICAgICAic2V0Q2FsbGJhY2siLCBtU3RyZWFtLT5zZXRDYWxsYmFjayhuZXcgU3RyZWFtT3V0Q2FsbGJhY2sodGhpcykpKTsKLSAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoCi0gICAgICAgICAgICBbJl0oYm9vbCBwLCBib29sIHIpIHsKLSAgICAgICAgICAgICAgICAqc3VwcG9ydHNQYXVzZSA9IHA7Ci0gICAgICAgICAgICAgICAgKnN1cHBvcnRzUmVzdW1lID0gcjsKLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdXBwb3J0c1BhdXNlQW5kUmVzdW1lIiwgcmV0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6cGF1c2UoKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+cGF1c2UoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnJlc3VtZSgpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicGF1c2UiLCBtU3RyZWFtLT5yZXN1bWUoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbikgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdXBwb3J0c0RyYWluIiwgbVN0cmVhbS0+c3VwcG9ydHNEcmFpbigpLCBzdXBwb3J0c0RyYWluKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6ZHJhaW4oYm9vbCBlYXJseU5vdGlmeSkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKAotICAgICAgICAgICAgImRyYWluIiwgbVN0cmVhbS0+ZHJhaW4oZWFybHlOb3RpZnkgPyBBdWRpb0RyYWluOjpFQVJMWV9OT1RJRlkgOiBBdWRpb0RyYWluOjpBTEwpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Zmx1c2goKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+Zmx1c2goKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1Xcml0ZXJDbGllbnQgPT0gZ2V0dGlkKCkgJiYgbUNvbW1hbmRNUSkgewotICAgICAgICByZXR1cm4gY2FsbFdyaXRlclRocmVhZCgKLSAgICAgICAgICAgICAgICBXcml0ZUNvbW1hbmQ6OkdFVF9QUkVTRU5UQVRJT05fUE9TSVRJT04sICJnZXRQcmVzZW50YXRpb25Qb3NpdGlvbiIsIG51bGxwdHIsIDAsCi0gICAgICAgICAgICAgICAgWyZdKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gd3JpdGVTdGF0dXMucmVwbHkucHJlc2VudGF0aW9uUG9zaXRpb24uZnJhbWVzOwotICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X3NlYyA9IHdyaXRlU3RhdHVzLnJlcGx5LnByZXNlbnRhdGlvblBvc2l0aW9uLnRpbWVTdGFtcC50dlNlYzsKLSAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9uc2VjID0gd3JpdGVTdGF0dXMucmVwbHkucHJlc2VudGF0aW9uUG9zaXRpb24udGltZVN0YW1wLnR2TlNlYzsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9IGVsc2UgewotICAgICAgICBSZXN1bHQgcmV0dmFsOwotICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24oCi0gICAgICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBoaWRsRnJhbWVzLCBjb25zdCBUaW1lU3BlYyYgaGlkbFRpbWVTdGFtcCkgewotICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSBoaWRsRnJhbWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9zZWMgPSBoaWRsVGltZVN0YW1wLnR2U2VjOwotICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9uc2VjID0gaGlkbFRpbWVTdGFtcC50dk5TZWM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFByZXNlbnRhdGlvblBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOwotICAgIH0KLX0KLQotLyoqIFRyYW5zZm9ybSBhIHN0YW5kYXJkIGNvbGxlY3Rpb24gdG8gYW4gSElETCB2ZWN0b3IuICovCi10ZW1wbGF0ZSA8Y2xhc3MgVmFsdWVzLCBjbGFzcyBFbGVtZW50Q29udmVydGVyPgotc3RhdGljIGF1dG8gdHJhbnNmb3JtVG9IaWRsVmVjKGNvbnN0IFZhbHVlcyYgdmFsdWVzLCBFbGVtZW50Q29udmVydGVyIGNvbnZlcnRlcikgewotICAgIGhpZGxfdmVjPGRlY2x0eXBlKGNvbnZlcnRlcigqdmFsdWVzLmJlZ2luKCkpKT4gcmVzdWx0e3ZhbHVlcy5zaXplKCl9OwotICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0gICAgdHJhbnNmb3JtKGJlZ2luKHZhbHVlcyksIGVuZCh2YWx1ZXMpLCBiZWdpbihyZXN1bHQpLCBjb252ZXJ0ZXIpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgewotICAgIGhhcmR3YXJlOjphdWRpbzo6VjRfMDo6U291cmNlTWV0YWRhdGEgaGFsTWV0YWRhdGEgPSB7Ci0gICAgICAgIC50cmFja3MgPSB0cmFuc2Zvcm1Ub0hpZGxWZWMoc291cmNlTWV0YWRhdGEudHJhY2tzLAotICAgICAgICAgICAgICBbXShjb25zdCBwbGF5YmFja190cmFja19tZXRhZGF0YSYgbWV0YWRhdGEpIC0+IFBsYXliYWNrVHJhY2tNZXRhZGF0YSB7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gewotICAgICAgICAgICAgICAgICAgICAudXNhZ2U9c3RhdGljX2Nhc3Q8QXVkaW9Vc2FnZT4obWV0YWRhdGEudXNhZ2UpLAotICAgICAgICAgICAgICAgICAgICAuY29udGVudFR5cGU9c3RhdGljX2Nhc3Q8QXVkaW9Db250ZW50VHlwZT4obWV0YWRhdGEuY29udGVudF90eXBlKSwKLSAgICAgICAgICAgICAgICAgICAgLmdhaW49bWV0YWRhdGEuZ2FpbiwKLSAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgIH0pfTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigidXBkYXRlU291cmNlTWV0YWRhdGEiLCBtU3RyZWFtLT51cGRhdGVTb3VyY2VNZXRhZGF0YShoYWxNZXRhZGF0YSkpOwotfQotCi12b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uV3JpdGVSZWFkeSgpIHsKLSAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOwotICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47Ci0gICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25Xcml0ZVJlYWR5Iik7Ci0gICAgY2FsbGJhY2stPm9uV3JpdGVSZWFkeSgpOwotfQotCi12b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uRHJhaW5SZWFkeSgpIHsKLSAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOwotICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47Ci0gICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25EcmFpblJlYWR5Iik7Ci0gICAgY2FsbGJhY2stPm9uRHJhaW5SZWFkeSgpOwotfQotCi12b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uRXJyb3IoKSB7Ci0gICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKLSAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOwotICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uRXJyb3IiKTsKLSAgICBjYWxsYmFjay0+b25FcnJvcigpOwotfQotCi0KLVN0cmVhbUluSGFsSGlkbDo6U3RyZWFtSW5IYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1Jbj4mIHN0cmVhbSkKLSAgICAgICAgOiBTdHJlYW1IYWxIaWRsKHN0cmVhbS5nZXQoKSksIG1TdHJlYW0oc3RyZWFtKSwgbVJlYWRlckNsaWVudCgwKSwgbUVmR3JvdXAobnVsbHB0cikgewotfQotCi1TdHJlYW1JbkhhbEhpZGw6On5TdHJlYW1JbkhhbEhpZGwoKSB7Ci0gICAgaWYgKG1TdHJlYW0gIT0gMCkgewotICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbG9zZSIsIG1TdHJlYW0tPmNsb3NlKCkpOwotICAgICAgICBtU3RyZWFtLmNsZWFyKCk7Ci0gICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgfQotICAgIGlmIChtRWZHcm91cCkgewotICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZyYW1lU2l6ZSIsIG1TdHJlYW0tPmdldEZyYW1lU2l6ZSgpLCBzaXplKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpzZXRHYWluKGZsb2F0IGdhaW4pIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0R2FpbiIsIG1TdHJlYW0tPnNldEdhaW4oZ2FpbikpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgICpyZWFkID0gMDsKLQotICAgIGlmIChieXRlcyA9PSAwICYmICFtRGF0YU1RKSB7Ci0gICAgICAgIC8vIENhbid0IGRldGVybWluZSB0aGUgc2l6ZSBmb3IgdGhlIE1RIGJ1ZmZlci4gV2FpdCBmb3IgYSBub24tZW1wdHkgcmVhZCByZXF1ZXN0LgotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmICghbURhdGFNUSAmJiAoc3RhdHVzID0gcHJlcGFyZUZvclJlYWRpbmcoYnl0ZXMpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKLSAgICBwYXJhbXMuY29tbWFuZCA9IFJlYWRDb21tYW5kOjpSRUFEOwotICAgIHBhcmFtcy5wYXJhbXMucmVhZCA9IGJ5dGVzOwotICAgIHN0YXR1cyA9IGNhbGxSZWFkZXJUaHJlYWQocGFyYW1zLCAicmVhZCIsCi0gICAgICAgICAgICBbJl0oY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cykgewotICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhdmFpbFRvUmVhZCA9IG1EYXRhTVEtPmF2YWlsYWJsZVRvUmVhZCgpOwotICAgICAgICAgICAgICAgIGlmICghbURhdGFNUS0+cmVhZChzdGF0aWNfY2FzdDx1aW50OF90Kj4oYnVmZmVyKSwgc3RkOjptaW4oYnl0ZXMsIGF2YWlsVG9SZWFkKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImRhdGEgbWVzc2FnZSBxdWV1ZSByZWFkIGZhaWxlZCBmb3IgXCJyZWFkXCIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQUxPR1dfSUYoYXZhaWxUb1JlYWQgIT0gcmVhZFN0YXR1cy5yZXBseS5yZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgIkhBTCByZWFkIHJlcG9ydCBpbmNvbnNpc3RlbnQ6IG1xID0gJWQsIHN0YXR1cyA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KWF2YWlsVG9SZWFkLCAoaW50MzJfdClyZWFkU3RhdHVzLnJlcGx5LnJlYWQpOwotICAgICAgICAgICAgICAgICpyZWFkID0gcmVhZFN0YXR1cy5yZXBseS5yZWFkOwotICAgICAgICAgICAgfSk7Ci0gICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICpyZWFkKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmNhbGxSZWFkZXJUaHJlYWQoCi0gICAgICAgIGNvbnN0IFJlYWRQYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCi0gICAgICAgIFN0cmVhbUluSGFsSGlkbDo6UmVhZGVyQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICBpZiAoIW1Db21tYW5kTVEtPndyaXRlKCZwYXJhbXMpKSB7Ci0gICAgICAgIEFMT0dXKCJjb21tYW5kIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiAtRUFHQUlOOwotICAgIH0KLSAgICBtRWZHcm91cC0+d2FrZShzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSk7Ci0KLSAgICAvLyBUT0RPOiBSZW1vdmUgbWFudWFsIGV2ZW50IGZsYWcgaGFuZGxpbmcgb25jZSBibG9ja2luZyBNUSBpcyBpbXBsZW1lbnRlZC4gYi8zMzgxNTQyMgotICAgIHVpbnQzMl90IGVmU3RhdGUgPSAwOwotcmV0cnk6Ci0gICAgc3RhdHVzX3QgcmV0ID0gbUVmR3JvdXAtPndhaXQoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpLCAmZWZTdGF0ZSk7Ci0gICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9FTVBUWSkpIHsKLSAgICAgICAgUmVhZFN0YXR1cyByZWFkU3RhdHVzOwotICAgICAgICByZWFkU3RhdHVzLnJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgICAgICBpZiAoIW1TdGF0dXNNUS0+cmVhZCgmcmVhZFN0YXR1cykpIHsKLSAgICAgICAgICAgIEFMT0dFKCJzdGF0dXMgbWVzc2FnZSByZWFkIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgIGlmIChyZWFkU3RhdHVzLnJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICByZXQgPSBPSzsKLSAgICAgICAgICAgIGNhbGxiYWNrKHJlYWRTdGF0dXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0ID0gcHJvY2Vzc1JldHVybihjbWROYW1lLCByZWFkU3RhdHVzLnJldHZhbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKLSAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCi0gICAgICAgIGdvdG8gcmV0cnk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6cHJlcGFyZUZvclJlYWRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiB0ZW1wQ29tbWFuZE1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IHRlbXBEYXRhTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBwaWRfdCBoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+cHJlcGFyZUZvclJlYWRpbmcoCi0gICAgICAgICAgICAxLCBidWZmZXJTaXplLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tYW5kTVE6OkRlc2NyaXB0b3ImIGNvbW1hbmRNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YU1ROjpEZXNjcmlwdG9yJiBkYXRhTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXR1c01ROjpEZXNjcmlwdG9yJiBzdGF0dXNNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyZWFkSW5mbyYgaGFsVGhyZWFkSW5mbykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBDb21tYW5kTVEucmVzZXQobmV3IENvbW1hbmRNUShjb21tYW5kTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcERhdGFNUS5yZXNldChuZXcgRGF0YU1RKGRhdGFNUSkpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgJiYgdGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkUGlkID0gaGFsVGhyZWFkSW5mby5waWQ7Ci0gICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFRpZCA9IGhhbFRocmVhZEluZm8udGlkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgewotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicHJlcGFyZUZvclJlYWRpbmciLCByZXQsIHJldHZhbCk7Ci0gICAgfQotICAgIGlmICghdGVtcENvbW1hbmRNUSB8fCAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhdGVtcERhdGFNUSB8fCAhdGVtcERhdGFNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIW1FZkdyb3VwKSB7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wQ29tbWFuZE1RLCAiRmFpbGVkIHRvIG9idGFpbiBjb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcENvbW1hbmRNUSAmJiAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJDb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighdGVtcERhdGFNUSwgIkZhaWxlZCB0byBvYnRhaW4gZGF0YSBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBEYXRhTVEgJiYgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSwgIkRhdGEgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCi0gICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3IgcmVhZGluZyBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZCk7Ci0KLSAgICBtQ29tbWFuZE1RID0gc3RkOjptb3ZlKHRlbXBDb21tYW5kTVEpOwotICAgIG1EYXRhTVEgPSBzdGQ6Om1vdmUodGVtcERhdGFNUSk7Ci0gICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7Ci0gICAgbVJlYWRlckNsaWVudCA9IGdldHRpZCgpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0SW5wdXRGcmFtZXNMb3N0IiwgbVN0cmVhbS0+Z2V0SW5wdXRGcmFtZXNMb3N0KCksIGZyYW1lc0xvc3QpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVJlYWRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7Ci0gICAgICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKLSAgICAgICAgcGFyYW1zLmNvbW1hbmQgPSBSZWFkQ29tbWFuZDo6R0VUX0NBUFRVUkVfUE9TSVRJT047Ci0gICAgICAgIHJldHVybiBjYWxsUmVhZGVyVGhyZWFkKHBhcmFtcywgImdldENhcHR1cmVQb3NpdGlvbiIsCi0gICAgICAgICAgICAgICAgWyZdKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IHJlYWRTdGF0dXMucmVwbHkuY2FwdHVyZVBvc2l0aW9uLmZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgKnRpbWUgPSByZWFkU3RhdHVzLnJlcGx5LmNhcHR1cmVQb3NpdGlvbi50aW1lOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRDYXB0dXJlUG9zaXRpb24oCi0gICAgICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBoaWRsRnJhbWVzLCB1aW50NjRfdCBoaWRsVGltZSkgewotICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSBoaWRsRnJhbWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgKnRpbWUgPSBoaWRsVGltZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0Q2FwdHVyZVBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOwotICAgIH0KLX0KLQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKAotICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lc0luZm8pIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEFjdGl2ZU1pY3JvcGhvbmVzKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBoaWRsX3ZlYzxNaWNyb3Bob25lSW5mbz4gbWljQXJyYXlIYWwpIHsKLSAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBtaWNBcnJheUhhbC5zaXplKCk7IGsrKykgewotICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190IGRzdDsKLSAgICAgICAgICAgIC8vIGNvbnZlcnQKLSAgICAgICAgICAgIG1pY3JvcGhvbmVJbmZvVG9IYWwobWljQXJyYXlIYWxba10sICZkc3QpOwotICAgICAgICAgICAgbWVkaWE6Ok1pY3JvcGhvbmVJbmZvIG1pY3JvcGhvbmUgPSBtZWRpYTo6TWljcm9waG9uZUluZm8oZHN0KTsKLSAgICAgICAgICAgIG1pY3JvcGhvbmVzSW5mby0+cHVzaF9iYWNrKG1pY3JvcGhvbmUpOwotICAgICAgICB9Ci0gICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEFjdGl2ZU1pY3JvcGhvbmVzIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgewotICAgIGhhcmR3YXJlOjphdWRpbzo6VjRfMDo6U2lua01ldGFkYXRhIGhhbE1ldGFkYXRhID0gewotICAgICAgICAudHJhY2tzID0gdHJhbnNmb3JtVG9IaWRsVmVjKHNpbmtNZXRhZGF0YS50cmFja3MsCi0gICAgICAgICAgICAgIFtdKGNvbnN0IHJlY29yZF90cmFja19tZXRhZGF0YSYgbWV0YWRhdGEpIC0+IFJlY29yZFRyYWNrTWV0YWRhdGEgewotICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKLSAgICAgICAgICAgICAgICAgICAgLnNvdXJjZT1zdGF0aWNfY2FzdDxBdWRpb1NvdXJjZT4obWV0YWRhdGEuc291cmNlKSwKLSAgICAgICAgICAgICAgICAgICAgLmdhaW49bWV0YWRhdGEuZ2FpbiwKLSAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgIH0pfTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigidXBkYXRlU2lua01ldGFkYXRhIiwgbVN0cmVhbS0+dXBkYXRlU2lua01ldGFkYXRhKGhhbE1ldGFkYXRhKSk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGRhMGY4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfNF8wX0gKLQotI2luY2x1ZGUgPGF0b21pYz4KLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lTdHJlYW0uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JU3RyZWFtSW4uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JU3RyZWFtT3V0Lmg+Ci0jaW5jbHVkZSA8Zm1xL0V2ZW50RmxhZy5oPgotI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0jaW5jbHVkZSAiU3RyZWFtUG93ZXJMb2cuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklTdHJlYW07Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVN0cmVhbUluOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklTdHJlYW1PdXQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpFdmVudEZsYWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNZXNzYWdlUXVldWU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyBSZWFkUGFyYW1ldGVycyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJU3RyZWFtSW46OlJlYWRQYXJhbWV0ZXJzOwotdXNpbmcgUmVhZFN0YXR1cyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJU3RyZWFtSW46OlJlYWRTdGF0dXM7Ci11c2luZyBXcml0ZUNvbW1hbmQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVN0cmVhbU91dDo6V3JpdGVDb21tYW5kOwotdXNpbmcgV3JpdGVTdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVN0cmVhbU91dDo6V3JpdGVTdGF0dXM7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotY2xhc3MgRGV2aWNlSGFsSGlkbDsKLQotY2xhc3MgU3RyZWFtSGFsSGlkbCA6IHB1YmxpYyB2aXJ0dWFsIFN0cmVhbUhhbEludGVyZmFjZSwgcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIHNhbXBsaW5nIHJhdGUgaW4gSHogLSBlZy4gNDQxMDAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKTsKLQotICAgIC8vIFJldHVybiBzaXplIG9mIGlucHV0L291dHB1dCBidWZmZXIgaW4gYnl0ZXMgZm9yIHRoaXMgc3RyZWFtIC0gZWcuIDQ4MDAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGNoYW5uZWwgbWFzay4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKTsKLQotICAgIC8vIFJldHVybiB0aGUgYXVkaW8gZm9ybWF0IC0gZS5nLiBBVURJT19GT1JNQVRfUENNXzE2X0JJVC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKLQotICAgIC8vIENvbnZlbmllbmNlIG1ldGhvZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7Ci0KLSAgICAvLyBTZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOwotCi0gICAgLy8gR2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOwotCi0gICAgLy8gQWRkIG9yIHJlbW92ZSB0aGUgZWZmZWN0IG9uIHRoZSBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBhZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKLQotICAgIC8vIFB1dCB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQvb3V0cHV0IGludG8gc3RhbmRieSBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhbmRieSgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7Ci0KLSAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKLQotICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLQotICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOwotCi0gICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOwotCi0gICAgLy8gU2V0IHRoZSBwcmlvcml0eSBvZiB0aGUgdGhyZWFkIHRoYXQgaW50ZXJhY3RzIHdpdGggdGhlIEhBTAotICAgIC8vIChtdXN0IG1hdGNoIHRoZSBwcmlvcml0eSBvZiB0aGUgYXVkaW9mbGluZ2VyJ3MgdGhyZWFkIHRoYXQgY2FsbHMgJ3JlYWQnIC8gJ3dyaXRlJykKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSk7Ci0KLSAgcHJvdGVjdGVkOgotICAgIC8vIFN1YmNsYXNzZXMgY2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIGV4cGxpY2l0IFN0cmVhbUhhbEhpZGwoSVN0cmVhbSAqc3RyZWFtKTsKLQotICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBzdHJlYW0uCi0gICAgdmlydHVhbCB+U3RyZWFtSGFsSGlkbCgpOwotCi0gICAgc3RhdHVzX3QgZ2V0Q2FjaGVkQnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgYm9vbCByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkocGlkX3QgdGhyZWFkUGlkLCBwaWRfdCB0aHJlYWRJZCk7Ci0KLSAgICAvLyBtU3RyZWFtUG93ZXJMb2cgaXMgdXNlZCBmb3IgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCi0gICAgU3RyZWFtUG93ZXJMb2cgbVN0cmVhbVBvd2VyTG9nOwotCi0gIHByaXZhdGU6Ci0gICAgY29uc3QgaW50IEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCA9IC0xOwotICAgIElTdHJlYW0gKm1TdHJlYW07Ci0gICAgaW50IG1IYWxUaHJlYWRQcmlvcml0eTsKLSAgICBzaXplX3QgbUNhY2hlZEJ1ZmZlclNpemU7Ci19OwotCi1jbGFzcyBTdHJlYW1PdXRIYWxIaWRsIDogcHVibGljIFN0cmVhbU91dEhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbEhpZGwgewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIFJldHVybiB0aGUgYXVkaW8gaGFyZHdhcmUgZHJpdmVyIGVzdGltYXRlZCBsYXRlbmN5IGluIG1pbGxpc2Vjb25kcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpOwotCi0gICAgLy8gVXNlIHRoaXMgbWV0aG9kIGluIHNpdHVhdGlvbnMgd2hlcmUgYXVkaW8gbWl4aW5nIGlzIGRvbmUgaW4gdGhlIGhhcmR3YXJlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKLQotICAgIC8vIFdyaXRlIGF1ZGlvIGJ1ZmZlciB0byBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKTsKLQotICAgIC8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyB3cml0dGVuIGJ5IHRoZSBhdWRpbyBkc3AgdG8gREFDIHNpbmNlCi0gICAgLy8gdGhlIG91dHB1dCBoYXMgZXhpdGVkIHN0YW5kYnkuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKTsKLQotICAgIC8vIEdldCB0aGUgbG9jYWwgdGltZSBhdCB3aGljaCB0aGUgbmV4dCB3cml0ZSB0byB0aGUgYXVkaW8gZHJpdmVyIHdpbGwgYmUgcHJlc2VudGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCk7Ci0KLSAgICAvLyBTZXQgdGhlIGNhbGxiYWNrIGZvciBub3RpZnlpbmcgY29tcGxldGlvbiBvZiBub24tYmxvY2tpbmcgd3JpdGUgYW5kIGRyYWluLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBwYXVzZSBhbmQgcmVzdW1lIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZXN1bWUoKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBkcmFpbiBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKTsKLQotICAgIC8vIFJlcXVlc3RzIG5vdGlmaWNhdGlvbiB3aGVuIGRhdGEgYnVmZmVyZWQgYnkgdGhlIGRyaXZlci9oYXJkd2FyZSBoYXMgYmVlbiBwbGF5ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkcmFpbihib29sIGVhcmx5Tm90aWZ5KTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gZmx1c2ggdGhlIHF1ZXVlZCBkYXRhLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goKTsKLQotICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyBwcmVzZW50ZWQgdG8gYW4gZXh0ZXJuYWwgb2JzZXJ2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkLgotICAgIHN0YXR1c190IHVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgICAvLyBNZXRob2RzIHVzZWQgYnkgU3RyZWFtT3V0Q2FsbGJhY2sgKEhJREwpLgotICAgIHZvaWQgb25Xcml0ZVJlYWR5KCk7Ci0gICAgdm9pZCBvbkRyYWluUmVhZHkoKTsKLSAgICB2b2lkIG9uRXJyb3IoKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxIaWRsOwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFdyaXRlQ29tbWFuZCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IENvbW1hbmRNUTsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gRGF0YU1ROwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFdyaXRlU3RhdHVzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7Ci0KLSAgICB3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gbUNhbGxiYWNrOwotICAgIHNwPElTdHJlYW1PdXQ+IG1TdHJlYW07Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gbUNvbW1hbmRNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiBtRGF0YU1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gbVN0YXR1c01ROwotICAgIHN0ZDo6YXRvbWljPHBpZF90PiBtV3JpdGVyQ2xpZW50OwotICAgIEV2ZW50RmxhZyogbUVmR3JvdXA7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtT3V0SGFsSGlkbChjb25zdCBzcDxJU3RyZWFtT3V0PiYgc3RyZWFtKTsKLQotICAgIHZpcnR1YWwgflN0cmVhbU91dEhhbEhpZGwoKTsKLQotICAgIHVzaW5nIFdyaXRlckNhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cyk+OwotICAgIHN0YXR1c190IGNhbGxXcml0ZXJUaHJlYWQoCi0gICAgICAgICAgICBXcml0ZUNvbW1hbmQgY21kLCBjb25zdCBjaGFyKiBjbWROYW1lLAotICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFTaXplLCBXcml0ZXJDYWxsYmFjayBjYWxsYmFjayk7Ci0gICAgc3RhdHVzX3QgcHJlcGFyZUZvcldyaXRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpOwotfTsKLQotY2xhc3MgU3RyZWFtSW5IYWxIaWRsIDogcHVibGljIFN0cmVhbUluSGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsSGlkbCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gU2V0IHRoZSBpbnB1dCBnYWluIGZvciB0aGUgYXVkaW8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0R2FpbihmbG9hdCBnYWluKTsKLQotICAgIC8vIFJlYWQgYXVkaW8gYnVmZmVyIGluIGZyb20gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKTsKLQotICAgIC8vIFJldHVybiB0aGUgYW1vdW50IG9mIGlucHV0IGZyYW1lcyBsb3N0IGluIHRoZSBhdWRpbyBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpOwotCi0gICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHJlY2VpdmVkIGFuZAotICAgIC8vIHRoZSBjbG9jayB0aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGZyYW1lIGNvdW50LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSk7Ci0KLSAgICAvLyBHZXQgYWN0aXZlIG1pY3JvcGhvbmVzCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNpbmsgaGFzIGJlZW4gY2hhbmdlZC4KLSAgICBzdGF0dXNfdCB1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIG92ZXJyaWRlOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZUhhbEhpZGw7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8UmVhZFBhcmFtZXRlcnMsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBDb21tYW5kTVE7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IERhdGFNUTsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxSZWFkU3RhdHVzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7Ci0KLSAgICBzcDxJU3RyZWFtSW4+IG1TdHJlYW07Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gbUNvbW1hbmRNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiBtRGF0YU1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gbVN0YXR1c01ROwotICAgIHN0ZDo6YXRvbWljPHBpZF90PiBtUmVhZGVyQ2xpZW50OwotICAgIEV2ZW50RmxhZyogbUVmR3JvdXA7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtSW5IYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1Jbj4mIHN0cmVhbSk7Ci0KLSAgICB2aXJ0dWFsIH5TdHJlYW1JbkhhbEhpZGwoKTsKLQotICAgIHVzaW5nIFJlYWRlckNhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpPjsKLSAgICBzdGF0dXNfdCBjYWxsUmVhZGVyVGhyZWFkKAotICAgICAgICAgICAgY29uc3QgUmVhZFBhcmFtZXRlcnMmIHBhcmFtcywgY29uc3QgY2hhciogY21kTmFtZSwgUmVhZGVyQ2FsbGJhY2sgY2FsbGJhY2spOwotICAgIHN0YXR1c190IHByZXBhcmVGb3JSZWFkaW5nKHNpemVfdCBidWZmZXJTaXplKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbExvY2FsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlkOTZiZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsTG9jYWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlN0cmVhbUhhbExvY2FsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCi0jaW5jbHVkZSAiU3RyZWFtSGFsTG9jYWwuaCIKLSNpbmNsdWRlICJWZXJzaW9uVXRpbHMuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1TdHJlYW1IYWxMb2NhbDo6U3RyZWFtSGFsTG9jYWwoYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKLSAgICAgICAgOiBtRGV2aWNlKGRldmljZSksCi0gICAgICAgICAgbVN0cmVhbShzdHJlYW0pIHsKLSAgICAvLyBJbnN0cnVtZW50IGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgotICAgIC8vIE5vdGU6IFRoaXMgYXNzdW1lcyBjaGFubmVsIG1hc2ssIGZvcm1hdCwgYW5kIHNhbXBsZSByYXRlIGRvIG5vdCBjaGFuZ2UgYWZ0ZXIgY3JlYXRpb24uCi0gICAgaWYgKG1TdHJlYW0gIT0gbnVsbHB0ciAmJiBtU3RyZWFtUG93ZXJMb2cuaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkpIHsKLSAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmluaXQobVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pLAotICAgICAgICAgICAgICAgIG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKSwKLSAgICAgICAgICAgICAgICBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pKTsKLSAgICB9Ci19Ci0KLVN0cmVhbUhhbExvY2FsOjp+U3RyZWFtSGFsTG9jYWwoKSB7Ci0gICAgbVN0cmVhbSA9IDA7Ci0gICAgbURldmljZS5jbGVhcigpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSkgewotICAgICpyYXRlID0gbVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgKnNpemUgPSBtU3RyZWFtLT5nZXRfYnVmZmVyX3NpemUobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spIHsKLSAgICAqbWFzayA9IG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgICpmb3JtYXQgPSBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7Ci0gICAgKnNhbXBsZVJhdGUgPSBtU3RyZWFtLT5nZXRfc2FtcGxlX3JhdGUobVN0cmVhbSk7Ci0gICAgKm1hc2sgPSBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSk7Ci0gICAgKmZvcm1hdCA9IG1TdHJlYW0tPmdldF9mb3JtYXQobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnNldF9wYXJhbWV0ZXJzKG1TdHJlYW0sIGt2UGFpcnMuc3RyaW5nKCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKLSAgICBjaGFyICpoYWxWYWx1ZXMgPSBtU3RyZWFtLT5nZXRfcGFyYW1ldGVycyhtU3RyZWFtLCBrZXlzLnN0cmluZygpKTsKLSAgICBpZiAoaGFsVmFsdWVzICE9IE5VTEwpIHsKLSAgICAgICAgdmFsdWVzLT5zZXRUbyhoYWxWYWx1ZXMpOwotICAgICAgICBmcmVlKGhhbFZhbHVlcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdmFsdWVzLT5jbGVhcigpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjphZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPikgewotICAgIExPR19BTFdBWVNfRkFUQUwoIkxvY2FsIHN0cmVhbXMgY2FuIG5vdCBoYXZlIGVmZmVjdHMiKTsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpyZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPikgewotICAgIExPR19BTFdBWVNfRkFUQUwoIkxvY2FsIHN0cmVhbXMgY2FuIG5vdCBoYXZlIGVmZmVjdHMiKTsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzdGFuZGJ5KCkgewotICAgIHJldHVybiBtU3RyZWFtLT5zdGFuZGJ5KG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6ZHVtcChpbnQgZmQpIHsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RyZWFtLT5kdW1wKG1TdHJlYW0sIGZkKTsKLSAgICBtU3RyZWFtUG93ZXJMb2cuZHVtcChmZCk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnNldEhhbFRocmVhZFByaW9yaXR5KGludCkgewotICAgIC8vIERvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgYXMgbG9jYWwgaGFsIGlzIGV4ZWN1dGVkIGJ5IGF1ZGlvZmxpbmdlciBkaXJlY3RseQotICAgIC8vIG9uIHRoZSBzYW1lIHRocmVhZC4KLSAgICByZXR1cm4gT0s7Ci19Ci0KLVN0cmVhbU91dEhhbExvY2FsOjpTdHJlYW1PdXRIYWxMb2NhbChhdWRpb19zdHJlYW1fb3V0X3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKLSAgICAgICAgOiBTdHJlYW1IYWxMb2NhbCgmc3RyZWFtLT5jb21tb24sIGRldmljZSksIG1TdHJlYW0oc3RyZWFtKSB7Ci19Ci0KLVN0cmVhbU91dEhhbExvY2FsOjp+U3RyZWFtT3V0SGFsTG9jYWwoKSB7Ci0gICAgbUNhbGxiYWNrLmNsZWFyKCk7Ci0gICAgbURldmljZS0+Y2xvc2VPdXRwdXRTdHJlYW0obVN0cmVhbSk7Ci0gICAgbVN0cmVhbSA9IDA7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgKnNpemUgPSBhdWRpb19zdHJlYW1fb3V0X2ZyYW1lX3NpemUobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSkgewotICAgICpsYXRlbmN5ID0gbVN0cmVhbS0+Z2V0X2xhdGVuY3kobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7Ci0gICAgaWYgKG1TdHJlYW0tPnNldF92b2x1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zZXRfdm9sdW1lKG1TdHJlYW0sIGxlZnQsIHJpZ2h0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OndyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pIHsKLSAgICBzc2l6ZV90IHdyaXRlUmVzdWx0ID0gbVN0cmVhbS0+d3JpdGUobVN0cmVhbSwgYnVmZmVyLCBieXRlcyk7Ci0gICAgaWYgKHdyaXRlUmVzdWx0ID4gMCkgewotICAgICAgICAqd3JpdHRlbiA9IHdyaXRlUmVzdWx0OwotICAgICAgICBtU3RyZWFtUG93ZXJMb2cubG9nKGJ1ZmZlciwgKndyaXR0ZW4pOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKndyaXR0ZW4gPSAwOwotICAgICAgICByZXR1cm4gd3JpdGVSZXN1bHQ7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcykgewotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfcmVuZGVyX3Bvc2l0aW9uKG1TdHJlYW0sIGRzcEZyYW1lcyk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9uZXh0X3dyaXRlX3RpbWVzdGFtcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9uZXh0X3dyaXRlX3RpbWVzdGFtcChtU3RyZWFtLCB0aW1lc3RhbXApOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnNldF9jYWxsYmFjayA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gbVN0cmVhbS0+c2V0X2NhbGxiYWNrKG1TdHJlYW0sIFN0cmVhbU91dEhhbExvY2FsOjphc3luY0NhbGxiYWNrLCB0aGlzKTsKLSAgICBpZiAocmVzdWx0ID09IE9LKSB7Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBzdGF0aWMKLWludCBTdHJlYW1PdXRIYWxMb2NhbDo6YXN5bmNDYWxsYmFjayhzdHJlYW1fY2FsbGJhY2tfZXZlbnRfdCBldmVudCwgdm9pZCosIHZvaWQgKmNvb2tpZSkgewotICAgIC8vIFdlIGFjdCBhcyBpZiB3ZSBnYXZlIGEgd3A8U3RyZWFtT3V0SGFsTG9jYWw+IHRvIEhBTC4gVGhpcyB3YXkgd2Ugc2hvdWxkIGhhbmRsZQotICAgIC8vIGNvcnJlY3RseSB0aGUgY2FzZSB3aGVuIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkIHdoaWxlIFN0cmVhbU91dEhhbExvY2FsJ3MgZGVzdHJ1Y3RvciBpcwotICAgIC8vIGFscmVhZHkgcnVubmluZywgYmVjYXVzZSB0aGUgZGVzdHJ1Y3RvciBpcyBpbnZva2VkIGFmdGVyIHRoZSByZWZjb3VudCBoYXMgYmVlbiBhdG9taWNhbGx5Ci0gICAgLy8gZGVjcmVtZW50ZWQuCi0gICAgd3A8U3RyZWFtT3V0SGFsTG9jYWw+IHdlYWtTZWxmKHN0YXRpY19jYXN0PFN0cmVhbU91dEhhbExvY2FsKj4oY29va2llKSk7Ci0gICAgc3A8U3RyZWFtT3V0SGFsTG9jYWw+IHNlbGYgPSB3ZWFrU2VsZi5wcm9tb3RlKCk7Ci0gICAgaWYgKHNlbGYgPT0gMCkgcmV0dXJuIDA7Ci0gICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gc2VsZi0+bUNhbGxiYWNrLnByb21vdGUoKTsKLSAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuIDA7Ci0gICAgQUxPR1YoImFzeW5jQ2FsbGJhY2soKSBldmVudCAlZCIsIGV2ZW50KTsKLSAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgIGNhc2UgU1RSRUFNX0NCS19FVkVOVF9XUklURV9SRUFEWToKLSAgICAgICAgICAgIGNhbGxiYWNrLT5vbldyaXRlUmVhZHkoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUUkVBTV9DQktfRVZFTlRfRFJBSU5fUkVBRFk6Ci0gICAgICAgICAgICBjYWxsYmFjay0+b25EcmFpblJlYWR5KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVFJFQU1fQ0JLX0VWRU5UX0VSUk9SOgotICAgICAgICAgICAgY2FsbGJhY2stPm9uRXJyb3IoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1coImFzeW5jQ2FsbGJhY2soKSB1bmtub3duIGV2ZW50ICVkIiwgZXZlbnQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSkgewotICAgICpzdXBwb3J0c1BhdXNlID0gbVN0cmVhbS0+cGF1c2UgIT0gTlVMTDsKLSAgICAqc3VwcG9ydHNSZXN1bWUgPSBtU3RyZWFtLT5yZXN1bWUgIT0gTlVMTDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpwYXVzZSgpIHsKLSAgICBpZiAobVN0cmVhbS0+cGF1c2UgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5wYXVzZShtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnJlc3VtZSgpIHsKLSAgICBpZiAobVN0cmVhbS0+cmVzdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+cmVzdW1lKG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKSB7Ci0gICAgKnN1cHBvcnRzRHJhaW4gPSBtU3RyZWFtLT5kcmFpbiAhPSBOVUxMOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmRyYWluKGJvb2wgZWFybHlOb3RpZnkpIHsKLSAgICBpZiAobVN0cmVhbS0+ZHJhaW4gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5kcmFpbihtU3RyZWFtLCBlYXJseU5vdGlmeSA/IEFVRElPX0RSQUlOX0VBUkxZX05PVElGWSA6IEFVRElPX0RSQUlOX0FMTCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpmbHVzaCgpIHsKLSAgICBpZiAobVN0cmVhbS0+Zmx1c2ggPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5mbHVzaChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9wcmVzZW50YXRpb25fcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uKG1TdHJlYW0sIGZyYW1lcywgdGltZXN0YW1wKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgewotICAgIGlmIChtU3RyZWFtLT51cGRhdGVfc291cmNlX21ldGFkYXRhID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBjb25zdCBzb3VyY2VfbWV0YWRhdGFfdCBtZXRhZGF0YSB7Ci0gICAgICAgIC50cmFja19jb3VudCA9IHNvdXJjZU1ldGFkYXRhLnRyYWNrcy5zaXplKCksCi0gICAgICAgIC8vIGNvbnN0IGNhc3QgaXMgZmluZSBhcyBpdCBpcyBpbiBhIGNvbnN0IHN0cnVjdHVyZQotICAgICAgICAudHJhY2tzID0gY29uc3RfY2FzdDxwbGF5YmFja190cmFja19tZXRhZGF0YSo+KHNvdXJjZU1ldGFkYXRhLnRyYWNrcy5kYXRhKCkpLAotICAgIH07Ci0gICAgbVN0cmVhbS0+dXBkYXRlX3NvdXJjZV9tZXRhZGF0YShtU3RyZWFtLCAmbWV0YWRhdGEpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN0YXJ0KCkgewotICAgIGlmIChtU3RyZWFtLT5zdGFydCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnN0YXJ0KG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3RvcCgpIHsKLSAgICBpZiAobVN0cmVhbS0+c3RvcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnN0b3AobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgewotICAgIGlmIChtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIobVN0cmVhbSwgbWluU2l6ZUZyYW1lcywgaW5mbyk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24obVN0cmVhbSwgcG9zaXRpb24pOwotfQotCi1TdHJlYW1JbkhhbExvY2FsOjpTdHJlYW1JbkhhbExvY2FsKGF1ZGlvX3N0cmVhbV9pbl90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCi0gICAgICAgIDogU3RyZWFtSGFsTG9jYWwoJnN0cmVhbS0+Y29tbW9uLCBkZXZpY2UpLCBtU3RyZWFtKHN0cmVhbSkgewotfQotCi1TdHJlYW1JbkhhbExvY2FsOjp+U3RyZWFtSW5IYWxMb2NhbCgpIHsKLSAgICBtRGV2aWNlLT5jbG9zZUlucHV0U3RyZWFtKG1TdHJlYW0pOwotICAgIG1TdHJlYW0gPSAwOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgKnNpemUgPSBhdWRpb19zdHJlYW1faW5fZnJhbWVfc2l6ZShtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnNldEdhaW4oZmxvYXQgZ2FpbikgewotICAgIHJldHVybiBtU3RyZWFtLT5zZXRfZ2FpbihtU3RyZWFtLCBnYWluKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6cmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKSB7Ci0gICAgc3NpemVfdCByZWFkUmVzdWx0ID0gbVN0cmVhbS0+cmVhZChtU3RyZWFtLCBidWZmZXIsIGJ5dGVzKTsKLSAgICBpZiAocmVhZFJlc3VsdCA+IDApIHsKLSAgICAgICAgKnJlYWQgPSByZWFkUmVzdWx0OwotICAgICAgICBtU3RyZWFtUG93ZXJMb2cubG9nKCBidWZmZXIsICpyZWFkKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICpyZWFkID0gMDsKLSAgICAgICAgcmV0dXJuIHJlYWRSZXN1bHQ7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpIHsKLSAgICAqZnJhbWVzTG9zdCA9IG1TdHJlYW0tPmdldF9pbnB1dF9mcmFtZXNfbG9zdChtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X2NhcHR1cmVfcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfY2FwdHVyZV9wb3NpdGlvbihtU3RyZWFtLCBmcmFtZXMsIHRpbWUpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjp1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIHsKLSAgICBpZiAobVN0cmVhbS0+dXBkYXRlX3NpbmtfbWV0YWRhdGEgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIGNvbnN0IHNpbmtfbWV0YWRhdGFfdCBtZXRhZGF0YSB7Ci0gICAgICAgIC50cmFja19jb3VudCA9IHNpbmtNZXRhZGF0YS50cmFja3Muc2l6ZSgpLAotICAgICAgICAvLyBjb25zdCBjYXN0IGlzIGZpbmUgYXMgaXQgaXMgaW4gYSBjb25zdCBzdHJ1Y3R1cmUKLSAgICAgICAgLnRyYWNrcyA9IGNvbnN0X2Nhc3Q8cmVjb3JkX3RyYWNrX21ldGFkYXRhKj4oc2lua01ldGFkYXRhLnRyYWNrcy5kYXRhKCkpLAotICAgIH07Ci0gICAgbVN0cmVhbS0+dXBkYXRlX3NpbmtfbWV0YWRhdGEobVN0cmVhbSwgJm1ldGFkYXRhKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnN0YXJ0KCkgewotICAgIGlmIChtU3RyZWFtLT5zdGFydCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnN0YXJ0KG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzdG9wKCkgewotICAgIGlmIChtU3RyZWFtLT5zdG9wID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c3RvcChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKLSAgICBpZiAobVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyKG1TdHJlYW0sIG1pblNpemVGcmFtZXMsIGluZm8pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24obVN0cmVhbSwgcG9zaXRpb24pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcykgewotICAgIGlmIChtU3RyZWFtLT5nZXRfYWN0aXZlX21pY3JvcGhvbmVzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICBzaXplX3QgYWN0dWFsX21pY3MgPSBBVURJT19NSUNST1BIT05FX01BWF9DT1VOVDsKLSAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgbWljX2FycmF5W0FVRElPX01JQ1JPUEhPTkVfTUFYX0NPVU5UXTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RyZWFtLT5nZXRfYWN0aXZlX21pY3JvcGhvbmVzKG1TdHJlYW0sICZtaWNfYXJyYXlbMF0sICZhY3R1YWxfbWljcyk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3R1YWxfbWljczsgaSsrKSB7Ci0gICAgICAgIG1lZGlhOjpNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lSW5mbyA9IG1lZGlhOjpNaWNyb3Bob25lSW5mbyhtaWNfYXJyYXlbaV0pOwotICAgICAgICBtaWNyb3Bob25lcy0+cHVzaF9iYWNrKG1pY3JvcGhvbmVJbmZvKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsTG9jYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIzNzUwOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsTG9jYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0xPQ0FMXzRfMF9ICi0KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlICJTdHJlYW1Qb3dlckxvZy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLWNsYXNzIERldmljZUhhbExvY2FsOwotCi1jbGFzcyBTdHJlYW1IYWxMb2NhbCA6IHB1YmxpYyB2aXJ0dWFsIFN0cmVhbUhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBzYW1wbGluZyByYXRlIGluIEh6IC0gZWcuIDQ0MTAwLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSk7Ci0KLSAgICAvLyBSZXR1cm4gc2l6ZSBvZiBpbnB1dC9vdXRwdXQgYnVmZmVyIGluIGJ5dGVzIGZvciB0aGlzIHN0cmVhbSAtIGVnLiA0ODAwLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBjaGFubmVsIG1hc2suCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzayk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGZvcm1hdCAtIGUuZy4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7Ci0KLSAgICAvLyBDb252ZW5pZW5jZSBtZXRob2QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOwotCi0gICAgLy8gU2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKLQotICAgIC8vIEdldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKLQotICAgIC8vIEFkZCBvciByZW1vdmUgdGhlIGVmZmVjdCBvbiB0aGUgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7Ci0KLSAgICAvLyBQdXQgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0L291dHB1dCBpbnRvIHN0YW5kYnkgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YW5kYnkoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgPSAwOwotCi0gICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpID0gMDsKLQotICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pID0gMDsKLQotICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSA9IDA7Ci0KLSAgICAvLyBTZXQgdGhlIHByaW9yaXR5IG9mIHRoZSB0aHJlYWQgdGhhdCBpbnRlcmFjdHMgd2l0aCB0aGUgSEFMCi0gICAgLy8gKG11c3QgbWF0Y2ggdGhlIHByaW9yaXR5IG9mIHRoZSBhdWRpb2ZsaW5nZXIncyB0aHJlYWQgdGhhdCBjYWxscyAncmVhZCcgLyAnd3JpdGUnKQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KTsKLQotICBwcm90ZWN0ZWQ6Ci0gICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtSGFsTG9jYWwoYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7Ci0KLSAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgc3RyZWFtLgotICAgIHZpcnR1YWwgflN0cmVhbUhhbExvY2FsKCk7Ci0KLSAgICBzcDxEZXZpY2VIYWxMb2NhbD4gbURldmljZTsKLQotICAgIC8vIG1TdHJlYW1Qb3dlckxvZyBpcyB1c2VkIGZvciBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KLSAgICBTdHJlYW1Qb3dlckxvZyBtU3RyZWFtUG93ZXJMb2c7Ci0KLSAgcHJpdmF0ZToKLSAgICBhdWRpb19zdHJlYW1fdCAqbVN0cmVhbTsKLX07Ci0KLWNsYXNzIFN0cmVhbU91dEhhbExvY2FsIDogcHVibGljIFN0cmVhbU91dEhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbExvY2FsIHsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGhhcmR3YXJlIGRyaXZlciBlc3RpbWF0ZWQgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KTsKLQotICAgIC8vIFVzZSB0aGlzIG1ldGhvZCBpbiBzaXR1YXRpb25zIHdoZXJlIGF1ZGlvIG1peGluZyBpcyBkb25lIGluIHRoZSBoYXJkd2FyZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7Ci0KLSAgICAvLyBXcml0ZSBhdWRpbyBidWZmZXIgdG8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbik7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgd3JpdHRlbiBieSB0aGUgYXVkaW8gZHNwIHRvIERBQyBzaW5jZQotICAgIC8vIHRoZSBvdXRwdXQgaGFzIGV4aXRlZCBzdGFuZGJ5LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcyk7Ci0KLSAgICAvLyBHZXQgdGhlIGxvY2FsIHRpbWUgYXQgd2hpY2ggdGhlIG5leHQgd3JpdGUgdG8gdGhlIGF1ZGlvIGRyaXZlciB3aWxsIGJlIHByZXNlbnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApOwotCi0gICAgLy8gU2V0IHRoZSBjYWxsYmFjayBmb3Igbm90aWZ5aW5nIGNvbXBsZXRpb24gb2Ygbm9uLWJsb2NraW5nIHdyaXRlIGFuZCBkcmFpbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgcGF1c2UgYW5kIHJlc3VtZSBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdW1lKCk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgZHJhaW4gb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbik7Ci0KLSAgICAvLyBSZXF1ZXN0cyBub3RpZmljYXRpb24gd2hlbiBkYXRhIGJ1ZmZlcmVkIGJ5IHRoZSBkcml2ZXIvaGFyZHdhcmUgaGFzIGJlZW4gcGxheWVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHJhaW4oYm9vbCBlYXJseU5vdGlmeSk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIGZsdXNoIHRoZSBxdWV1ZWQgZGF0YS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCk7Ci0KLSAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcHJlc2VudGVkIHRvIGFuIGV4dGVybmFsIG9ic2VydmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApOwotCi0gICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7Ci0KLSAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0KLSAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKLQotICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc291cmNlIGhhcyBiZWVuIGNoYW5nZWQuCi0gICAgc3RhdHVzX3QgdXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSBvdmVycmlkZTsKLQotICBwcml2YXRlOgotICAgIGF1ZGlvX3N0cmVhbV9vdXRfdCAqbVN0cmVhbTsKLSAgICB3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gbUNhbGxiYWNrOwotCi0gICAgZnJpZW5kIGNsYXNzIERldmljZUhhbExvY2FsOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbU91dEhhbExvY2FsKGF1ZGlvX3N0cmVhbV9vdXRfdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKLQotICAgIHZpcnR1YWwgflN0cmVhbU91dEhhbExvY2FsKCk7Ci0KLSAgICBzdGF0aWMgaW50IGFzeW5jQ2FsbGJhY2soc3RyZWFtX2NhbGxiYWNrX2V2ZW50X3QgZXZlbnQsIHZvaWQgKnBhcmFtLCB2b2lkICpjb29raWUpOwotfTsKLQotY2xhc3MgU3RyZWFtSW5IYWxMb2NhbCA6IHB1YmxpYyBTdHJlYW1JbkhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbExvY2FsIHsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBTZXQgdGhlIGlucHV0IGdhaW4gZm9yIHRoZSBhdWRpbyBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRHYWluKGZsb2F0IGdhaW4pOwotCi0gICAgLy8gUmVhZCBhdWRpbyBidWZmZXIgaW4gZnJvbSBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhbW91bnQgb2YgaW5wdXQgZnJhbWVzIGxvc3QgaW4gdGhlIGF1ZGlvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCk7Ci0KLSAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcmVjZWl2ZWQgYW5kCi0gICAgLy8gdGhlIGNsb2NrIHRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZnJhbWUgY291bnQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKTsKLQotICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwotCi0gICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotCi0gICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7Ci0KLSAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7Ci0KLSAgICAvLyBHZXQgYWN0aXZlIG1pY3JvcGhvbmVzCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNpbmsgaGFzIGJlZW4gY2hhbmdlZC4KLSAgICBzdGF0dXNfdCB1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIG92ZXJyaWRlOwotCi0gIHByaXZhdGU6Ci0gICAgYXVkaW9fc3RyZWFtX2luX3QgKm1TdHJlYW07Ci0KLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsTG9jYWw7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtSW5IYWxMb2NhbChhdWRpb19zdHJlYW1faW5fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKLQotICAgIHZpcnR1YWwgflN0cmVhbUluSGFsTG9jYWwoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF80XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbVBvd2VyTG9nLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtUG93ZXJMb2cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdiNzIwMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtUG93ZXJMb2cuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HXzRfMF9ICi0KLSNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL1Bvd2VyTG9nLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1jbGFzcyBTdHJlYW1Qb3dlckxvZyB7Ci1wdWJsaWM6Ci0gICAgU3RyZWFtUG93ZXJMb2coKSA6Ci0gICAgICAgIG1Jc1VzZXJEZWJ1Z09yRW5nQnVpbGQoaXNfdXNlcmRlYnVnX29yX2VuZ19idWlsZCgpKSwKLSAgICAgICAgbVBvd2VyTG9nKG51bGxwdHIpLAotICAgICAgICBtRnJhbWVTaXplKDApIHsKLSAgICAgICAgLy8gdXNlIGluaXQoKSB0byBzZXQgdXAgdGhlIHBvd2VyIGxvZy4KLSAgICB9Ci0KLSAgICB+U3RyZWFtUG93ZXJMb2coKSB7Ci0gICAgICAgIHBvd2VyX2xvZ19kZXN0cm95KG1Qb3dlckxvZyk7IC8vIE9LIGZvciBudWxsIG1Qb3dlckxvZwotICAgICAgICBtUG93ZXJMb2cgPSBudWxscHRyOwotICAgIH0KLQotICAgIC8vIEEgb25lLXRpbWUgaW5pdGlhbGl6YXRpb24gKGRvIG5vdCBjYWxsIHR3aWNlKSBiZWZvcmUgdXNpbmcgU3RyZWFtUG93ZXJMb2cuCi0gICAgdm9pZCBpbml0KHVpbnQzMl90IHNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKLSAgICAgICAgaWYgKG1Qb3dlckxvZyA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAvLyBOb3RlOiBBIHdheSB0byBnZXQgY2hhbm5lbCBjb3VudCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGNoYW5uZWwgbWFza3MKLSAgICAgICAgICAgIC8vIGJ1dCBkb2VzIG5vdCBjaGVjayB2YWxpZGl0eSBvZiB0aGUgY2hhbm5lbCBtYXNrLgotICAgICAgICAgICAgY29uc3QgdWludDMyX3QgY2hhbm5lbENvdW50ID0gcG9wY291bnQoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKGNoYW5uZWxNYXNrKSk7Ci0gICAgICAgICAgICBtRnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpOwotICAgICAgICAgICAgaWYgKG1GcmFtZVNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0ZyYW1lc1BlckVudHJ5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpc2FtcGxlUmF0ZSAqIGtQb3dlckxvZ1NhbXBsaW5nSW50ZXJ2YWxNcyAvIDEwMDA7Ci0gICAgICAgICAgICAgICAgbVBvd2VyTG9nID0gcG93ZXJfbG9nX2NyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBrUG93ZXJMb2dFbnRyaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAga1Bvd2VyTG9nRnJhbWVzUGVyRW50cnkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIG1Qb3dlckxvZyBtYXkgYmUgTlVMTCAobm90IHRoZSByaWdodCBidWlsZCwgZm9ybWF0IG5vdCBhY2NlcHRlZCwgZXRjLikuCi0gICAgfQotCi0gICAgLy8gRHVtcCB0aGUgcG93ZXIgbG9nIHRvIGZkLgotICAgIHZvaWQgZHVtcChpbnQgZmQpIGNvbnN0IHsKLSAgICAgICAgLy8gT0sgZm9yIG51bGwgbVBvd2VyTG9nCi0gICAgICAgICh2b2lkKXBvd2VyX2xvZ19kdW1wKAotICAgICAgICAgICAgICAgIG1Qb3dlckxvZywgZmQsICIgICAgICAiIC8qIHByZWZpeCAqLywga1Bvd2VyTG9nTGluZXMsIDAgLyogbGltaXRfbnMgKi8pOwotICAgIH0KLQotICAgIC8vIExvZyB0aGUgYXVkaW8gZGF0YSBjb250YWluZWQgaW4gYnVmZmVyLgotICAgIHZvaWQgbG9nKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemVJbkJ5dGVzKSBjb25zdCB7Ci0gICAgICAgIGlmIChtUG93ZXJMb2cgIT0gbnVsbHB0cikgeyAvLyBtRnJhbWVTaXplIGlzIGFsd2F5cyBub256ZXJvIGlmIG1Qb3dlckxvZyBleGlzdHMuCi0gICAgICAgICAgICBwb3dlcl9sb2dfbG9nKAotICAgICAgICAgICAgICAgICAgICBtUG93ZXJMb2csIGJ1ZmZlciwgc2l6ZUluQnl0ZXMgLyBtRnJhbWVTaXplLCBhdWRpb191dGlsc19nZXRfcmVhbF90aW1lX25zKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYm9vbCBpc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtSXNVc2VyRGVidWdPckVuZ0J1aWxkOwotICAgIH0KLQotcHJpdmF0ZToKLQotICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc191c2VyZGVidWdfb3JfZW5nX2J1aWxkKCkgewotICAgICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgICAgICh2b2lkKXByb3BlcnR5X2dldCgicm8uYnVpbGQudHlwZSIsIHZhbHVlLCAidW5rbm93biIpOyAvLyBpZ25vcmUgYWN0dWFsIGxlbmd0aAotICAgICAgICByZXR1cm4gc3RyY21wKHZhbHVlLCAidXNlcmRlYnVnIikgPT0gMCB8fCBzdHJjbXAodmFsdWUsICJlbmciKSA9PSAwOwotICAgIH0KLQotICAgIC8vIEF1ZGlvIHNpZ25hbCBwb3dlciBsb2cgY29uZmlndXJhdGlvbi4KLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0xpbmVzID0gNDA7Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMgPSA1MDsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0VudHJpZXMgPSAoMSAvKiBtaW51dGVzICovICogNjAgLyogc2Vjb25kcyAqLyAqIDEwMDAgLyogbXNlYyAqLwotICAgICAgICAgICAgLyBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMpOwotCi0gICAgY29uc3QgYm9vbCBtSXNVc2VyRGVidWdPckVuZ0J1aWxkOwotICAgIHBvd2VyX2xvZ190ICptUG93ZXJMb2c7Ci0gICAgc2l6ZV90IG1GcmFtZVNpemU7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9WZXJzaW9uVXRpbHMuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9WZXJzaW9uVXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI0NmMyZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvVmVyc2lvblV0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1ZFUlNJT05fVVRJTFNfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9WRVJTSU9OX1VUSUxTXzRfMF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC90eXBlcy5oPgotI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlBhcmFtZXRlclZhbHVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLW5hbWVzcGFjZSB1dGlscyB7Ci0KLXRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBDYWxsYmFjaz4KLVJldHVybjx2b2lkPiBnZXRQYXJhbWV0ZXJzKFQmIG9iamVjdCwgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4ga2V5cywgQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICByZXR1cm4gb2JqZWN0LT5nZXRQYXJhbWV0ZXJzKGNvbnRleHQsIGtleXMsIGNhbGxiYWNrKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1SZXR1cm48UmVzdWx0PiBzZXRQYXJhbWV0ZXJzKFQmIG9iamVjdCwgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBrZXlzKSB7Ci0gICAgcmV0dXJuIG9iamVjdC0+c2V0UGFyYW1ldGVycyhjb250ZXh0LCBrZXlzKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgdXRpbHMKLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfVkVSU0lPTl9VVElMU180XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL2luY2x1ZGUvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvaW5jbHVkZS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJmNmRlMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvaW5jbHVkZS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9IWUJSSURfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hZQlJJRF80XzBfSAotCi0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcwotICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZTsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpOwotCi0gICAgdmlydHVhbCB+RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKTsKLQotICAgIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBtTG9jYWxGYWN0b3J5OwotICAgIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBtSGlkbEZhY3Rvcnk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSFlCUklEXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvaW5jbHVkZS9saWJhdWRpb2hhbC80LjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvaW5jbHVkZS9saWJhdWRpb2hhbC80LjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MGI3YTEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL2luY2x1ZGUvbGliYXVkaW9oYWwvNC4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfNF8wX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzQuMC9JRWZmZWN0c0ZhY3RvcnkuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC80LjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpFZmZlY3REZXNjcmlwdG9yOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6SUVmZmVjdHNGYWN0b3J5OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci0KLWNsYXNzIEVmZmVjdHNGYWN0b3J5SGFsSGlkbCA6IHB1YmxpYyBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZSwgcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IGVmZmVjdHMgaW4gYWxsIGxvYWRlZCBsaWJyYXJpZXMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKTsKLQotICAgIC8vIFJldHVybnMgYSBkZXNjcmlwdG9yIG9mIHRoZSBuZXh0IGF2YWlsYWJsZSBlZmZlY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKHVpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLAotICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOwotCi0gICAgLy8gQ3JlYXRlcyBhbiBlZmZlY3QgZW5naW5lIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KLSAgICAvLyBUbyByZWxlYXNlIHRoZSBlZmZlY3QgZW5naW5lLCBpdCBpcyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzCi0gICAgLy8gdG8gdGhlIHJldHVybmVkIGVmZmVjdCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsCi0gICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLAotICAgICAgICAgICAgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiAqZWZmZWN0KTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcEVmZmVjdHMoaW50IGZkKTsKLQotICAgIHN0YXR1c190IGFsbG9jYXRlQnVmZmVyKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIG92ZXJyaWRlOwotICAgIHN0YXR1c190IG1pcnJvckJ1ZmZlcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgb3ZlcnJpZGU7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U7Ci0KLSAgICBzcDxJRWZmZWN0c0ZhY3Rvcnk+IG1FZmZlY3RzRmFjdG9yeTsKLSAgICBoaWRsX3ZlYzxFZmZlY3REZXNjcmlwdG9yPiBtTGFzdERlc2NyaXB0b3JzOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIEVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpOwotICAgIHZpcnR1YWwgfkVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpOwotCi0gICAgc3RhdHVzX3QgcXVlcnlBbGxEZXNjcmlwdG9ycygpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2hhbC9BbmRyb2lkLmJwCmluZGV4IDNhNWRmMjcuLjU4NGMyYzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvQW5kcm9pZC5icApAQCAtOCwxNiArOCwyMCBAQAogCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKICAgICAgICAgIi1XZXJyb3IiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RAMi4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uZWZmZWN0QDQuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA1LjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0AyLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A0LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A1LjAiLAogICAgICAgICAibGliYXVkaW9oYWxAMi4wIiwKICAgICAgICAgImxpYmF1ZGlvaGFsQDQuMCIsCisgICAgICAgICJsaWJhdWRpb2hhbEA1LjAiLAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcAppbmRleCA0YzhlYWY2Li5mODYwMDljIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwCkBAIC0xNiwxOSArMTYsMjIgQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lEZXZpY2VzRmFjdG9yeS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lEZXZpY2VzRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNS4wL0lEZXZpY2VzRmFjdG9yeS5oPgogCi0jaW5jbHVkZSA8RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaD4KLSNpbmNsdWRlIDxsaWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaD4KKyNpbmNsdWRlIDxsaWJhdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIHN0YXRpYwogc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlOjpjcmVhdGUoKSB7CisgICAgaWYgKGhhcmR3YXJlOjphdWRpbzo6VjVfMDo6SURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKCkgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gVjVfMDo6Y3JlYXRlRGV2aWNlc0ZhY3RvcnlIYWwoKTsKKyAgICB9CiAgICAgaWYgKGhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKCkgIT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gbmV3IFY0XzA6OkRldmljZXNGYWN0b3J5SGFsSHlicmlkKCk7CisgICAgICAgIHJldHVybiBWNF8wOjpjcmVhdGVEZXZpY2VzRmFjdG9yeUhhbCgpOwogICAgIH0KICAgICBpZiAoaGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJRGV2aWNlc0ZhY3Rvcnk6OmdldFNlcnZpY2UoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKTsKKyAgICAgICAgcmV0dXJuIFYyXzA6OmNyZWF0ZURldmljZXNGYWN0b3J5SGFsKCk7CiAgICAgfQogICAgIHJldHVybiBudWxscHRyOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwCmluZGV4IGVhZDFmYTIuLmJkM2VmNjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAKQEAgLTE2LDIwICsxNiwyMiBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvMi4wL0lFZmZlY3RzRmFjdG9yeS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzQuMC9JRWZmZWN0c0ZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC81LjAvSUVmZmVjdHNGYWN0b3J5Lmg+CiAKLSNpbmNsdWRlIDxFZmZlY3RzRmFjdG9yeUhhbEhpZGwuaD4KLSNpbmNsdWRlIDxsaWJhdWRpb2hhbC80LjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmg+Ci0KKyNpbmNsdWRlIDxsaWJhdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIHN0YXRpYwogc3A8RWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U+IEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOjpjcmVhdGUoKSB7CisgICAgaWYgKGhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNV8wOjpJRWZmZWN0c0ZhY3Rvcnk6OmdldFNlcnZpY2UoKSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBlZmZlY3Q6OlY1XzA6OmNyZWF0ZUVmZmVjdHNGYWN0b3J5SGFsKCk7CisgICAgfQogICAgIGlmIChoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6SUVmZmVjdHNGYWN0b3J5OjpnZXRTZXJ2aWNlKCkgIT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gbmV3IFY0XzA6OkVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpOworICAgICAgICByZXR1cm4gZWZmZWN0OjpWNF8wOjpjcmVhdGVFZmZlY3RzRmFjdG9yeUhhbCgpOwogICAgIH0KICAgICBpZiAoaGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OklFZmZlY3RzRmFjdG9yeTo6Z2V0U2VydmljZSgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFZmZlY3RzRmFjdG9yeUhhbEhpZGwoKTsKKyAgICAgICAgcmV0dXJuIGVmZmVjdDo6VjJfMDo6Y3JlYXRlRWZmZWN0c0ZhY3RvcnlIYWwoKTsKICAgICB9CiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg1MzNkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQW5kcm9pZC5icApAQCAtMCwwICsxLDEwMiBAQAorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJhdWRpb2hhbF9kZWZhdWx0IiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkRldmljZUhhbExvY2FsLmNwcCIsCisgICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAiLAorICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAiLAorICAgICAgICAiU3RyZWFtSGFsTG9jYWwuY3BwIiwKKworICAgICAgICAiQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwIiwKKyAgICAgICAgIkRldmljZUhhbEhpZGwuY3BwIiwKKyAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAiLAorICAgICAgICAiRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAiLAorICAgICAgICAiRWZmZWN0SGFsSGlkbC5jcHAiLAorICAgICAgICAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcCIsCisgICAgICAgICJTdHJlYW1IYWxIaWRsLmNwcCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uLXV0aWwiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAorICAgICAgICAibGliYXVkaW9oYWxfZGVhdGhoYW5kbGVyIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJsaWJoYXJkd2FyZSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbi51dGlsQGFsbC12ZXJzaW9ucyIsCisgICAgICAgICJsaWJhdWRpb2hhbF9oZWFkZXJzIgorICAgIF0sCisKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJmbXEiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliYXVkaW9oYWxAMi4wIiwKKyAgICBkZWZhdWx0czogWyJsaWJhdWRpb2hhbF9kZWZhdWx0Il0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkAyLjAtdXRpbCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0AyLjAiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE1BSk9SX1ZFUlNJT049MiIsCisgICAgICAgICItRE1JTk9SX1ZFUlNJT049MCIsCisgICAgICAgICItaW5jbHVkZSBjb21tb24vYWxsLXZlcnNpb25zL1ZlcnNpb25NYWNyby5oIiwKKyAgICBdCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliYXVkaW9oYWxANC4wIiwKKyAgICBkZWZhdWx0czogWyJsaWJhdWRpb2hhbF9kZWZhdWx0Il0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDQuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA0LjAtdXRpbCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA0LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A0LjAiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE1BSk9SX1ZFUlNJT049NCIsCisgICAgICAgICItRE1JTk9SX1ZFUlNJT049MCIsCisgICAgICAgICItaW5jbHVkZSBjb21tb24vYWxsLXZlcnNpb25zL1ZlcnNpb25NYWNyby5oIiwKKyAgICBdCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliYXVkaW9oYWxANS4wIiwKKyAgICBkZWZhdWx0czogWyJsaWJhdWRpb2hhbF9kZWZhdWx0Il0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDUuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA1LjAtdXRpbCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA1LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A1LjAiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE1BSk9SX1ZFUlNJT049NSIsCisgICAgICAgICItRE1JTk9SX1ZFUlNJT049MCIsCisgICAgICAgICItaW5jbHVkZSBjb21tb24vYWxsLXZlcnNpb25zL1ZlcnNpb25NYWNyby5oIiwKKyAgICBdCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmOGE1MjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcApAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBMT0dfVEFHICJIYWxIaWRsIgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT047Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOworCisvLyBzdGF0aWMKK3N0YXR1c190IENvbnZlcnNpb25IZWxwZXJIaWRsOjprZXlzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrZXlzLCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gKmhpZGxLZXlzKSB7CisgICAgQXVkaW9QYXJhbWV0ZXIgaGFsS2V5cyhrZXlzKTsKKyAgICBpZiAoaGFsS2V5cy5zaXplKCkgPT0gMCkgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBoaWRsS2V5cy0+cmVzaXplKGhhbEtleXMuc2l6ZSgpKTsKKyAgICAvL0ZJWE1FOiAga2V5U3RyZWFtU3VwcG9ydGVkQ2hhbm5lbHMgYW5kIGtleVN0cmVhbVN1cHBvcnRlZFNhbXBsaW5nUmF0ZXMgY29tZSB3aXRoIGEKKyAgICAvLyAia2V5Rm9ybWF0PTx2YWx1ZT4iIHBhaXIuIFdlIG5lZWQgdG8gdHJhbnNmb3JtIGl0IGludG8gYSBzaW5nbGUga2V5IHN0cmluZyBzbyB0aGF0IGl0IGlzCisgICAgLy8gY2FycmllZCBvdmVyIHRvIHRoZSBsZWdhY3kgSEFMIHZpYSBISURMLgorICAgIFN0cmluZzggdmFsdWU7CisgICAgYm9vbCBrZWVwRm9ybWF0VmFsdWUgPSBoYWxLZXlzLnNpemUoKSA9PSAyICYmCisgICAgICAgICAoaGFsS2V5cy5nZXQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkQ2hhbm5lbHMpLCB2YWx1ZSkgPT0gTk9fRVJST1IgfHwKKyAgICAgICAgIGhhbEtleXMuZ2V0KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZFNhbXBsaW5nUmF0ZXMpLCB2YWx1ZSkgPT0gTk9fRVJST1IpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoYWxLZXlzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFN0cmluZzgga2V5OworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBoYWxLZXlzLmdldEF0KGksIGtleSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgICAgIGlmIChrZWVwRm9ybWF0VmFsdWUgJiYga2V5ID09IEF1ZGlvUGFyYW1ldGVyOjprZXlGb3JtYXQpIHsKKyAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIGZvcm1hdFBhcmFtOworICAgICAgICAgICAgaGFsS2V5cy5nZXRBdChpLCBrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIGZvcm1hdFBhcmFtLmFkZChrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIGtleSA9IGZvcm1hdFBhcmFtLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgKCpoaWRsS2V5cylbaV0gPSBrZXkuc3RyaW5nKCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworLy8gc3RhdGljCitzdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6cGFyYW1ldGVyc0Zyb21IYWwoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGt2UGFpcnMsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiAqaGlkbFBhcmFtcykgeworICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtcyhrdlBhaXJzKTsKKyAgICBpZiAocGFyYW1zLnNpemUoKSA9PSAwKSByZXR1cm4gQkFEX1ZBTFVFOworICAgIGhpZGxQYXJhbXMtPnJlc2l6ZShwYXJhbXMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhcmFtcy5zaXplKCk7ICsraSkgeworICAgICAgICBTdHJpbmc4IGtleSwgdmFsdWU7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtcy5nZXRBdChpLCBrZXksIHZhbHVlKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgKCpoaWRsUGFyYW1zKVtpXS5rZXkgPSBrZXkuc3RyaW5nKCk7CisgICAgICAgICgqaGlkbFBhcmFtcylbaV0udmFsdWUgPSB2YWx1ZS5zdHJpbmcoKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ29udmVyc2lvbkhlbHBlckhpZGw6OnBhcmFtZXRlcnNUb0hhbCgKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKKyAgICBBdWRpb1BhcmFtZXRlciBwYXJhbXM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIHBhcmFtcy5hZGQoU3RyaW5nOChwYXJhbWV0ZXJzW2ldLmtleS5jX3N0cigpKSwgU3RyaW5nOChwYXJhbWV0ZXJzW2ldLnZhbHVlLmNfc3RyKCkpKTsKKyAgICB9CisgICAgdmFsdWVzLT5zZXRUbyhwYXJhbXMudG9TdHJpbmcoKSk7Cit9CisKK0NvbnZlcnNpb25IZWxwZXJIaWRsOjpDb252ZXJzaW9uSGVscGVySGlkbChjb25zdCBjaGFyKiBjbGFzc05hbWUpCisgICAgICAgIDogbUNsYXNzTmFtZShjbGFzc05hbWUpIHsKK30KKworLy8gc3RhdGljCitzdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6YW5hbHl6ZVJlc3VsdChjb25zdCBSZXN1bHQmIHJlc3VsdCkgeworICAgIHN3aXRjaCAocmVzdWx0KSB7CisgICAgICAgIGNhc2UgUmVzdWx0OjpPSzogcmV0dXJuIE9LOworICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFM6IHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX1NUQVRFOiByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOiByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9TVVBQT1JURUQ6IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorfQorCit2b2lkIENvbnZlcnNpb25IZWxwZXJIaWRsOjplbWl0RXJyb3IoY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uKSB7CisgICAgQUxPR0UoIiVzICVwICVzOiAlcyAoZnJvbSBycGMpIiwgbUNsYXNzTmFtZSwgdGhpcywgZnVuY05hbWUsIGRlc2NyaXB0aW9uKTsKK30KKworI2lmIE1BSk9SX1ZFUlNJT04gPj0gNAorLy8gVE9ETzogVXNlIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uIGluIHRoZSBoYWwgd2hlbiBpdCBtb3ZlcyB0byBhIHV0aWwgbGlicmFyeS4KK3N0YXRpYyBzdGQ6OnN0cmluZyBkZXZpY2VBZGRyZXNzVG9IYWwoY29uc3QgRGV2aWNlQWRkcmVzcyYgYWRkcmVzcykgeworICAgIC8vIEhBTCBhc3N1bWVzIHRoYXQgdGhlIGFkZHJlc3MgaXMgTlVMLXRlcm1pbmF0ZWQuCisgICAgY2hhciBoYWxBZGRyZXNzW0FVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU5dOworICAgIG1lbXNldChoYWxBZGRyZXNzLCAwLCBzaXplb2YoaGFsQWRkcmVzcykpOworICAgIGF1ZGlvX2RldmljZXNfdCBoYWxEZXZpY2UgPSBzdGF0aWNfY2FzdDxhdWRpb19kZXZpY2VzX3Q+KGFkZHJlc3MuZGV2aWNlKTsKKyAgICBjb25zdCBib29sIGlzSW5wdXQgPSAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0JJVF9JTikgIT0gMDsKKyAgICBpZiAoaXNJbnB1dCkgaGFsRGV2aWNlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOworICAgIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApICE9IDApIHx8CisgICAgICAgIChpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFApICE9IDApKSB7CisgICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIiwKKyAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzLm1hY1swXSwgYWRkcmVzcy5hZGRyZXNzLm1hY1sxXSwgYWRkcmVzcy5hZGRyZXNzLm1hY1syXSwKKyAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzLm1hY1szXSwgYWRkcmVzcy5hZGRyZXNzLm1hY1s0XSwgYWRkcmVzcy5hZGRyZXNzLm1hY1s1XSk7CisgICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfSVApICE9IDApIHx8CisgICAgICAgICAgICAgICAoaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0lQKSAhPSAwKSkgeworICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlZC4lZC4lZC4lZCIsIGFkZHJlc3MuYWRkcmVzcy5pcHY0WzBdLAorICAgICAgICAgICAgICAgICBhZGRyZXNzLmFkZHJlc3MuaXB2NFsxXSwgYWRkcmVzcy5hZGRyZXNzLmlwdjRbMl0sIGFkZHJlc3MuYWRkcmVzcy5pcHY0WzNdKTsKKyAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfVVNCKSAhPSAwKSB8fAorICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9BTExfVVNCKSAhPSAwKSkgeworICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICJjYXJkPSVkO2RldmljZT0lZCIsIGFkZHJlc3MuYWRkcmVzcy5hbHNhLmNhcmQsCisgICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcy5hbHNhLmRldmljZSk7CisgICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQlVTKSAhPSAwKSB8fAorICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9CVVMpICE9IDApKSB7CisgICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiVzIiwgYWRkcmVzcy5idXNBZGRyZXNzLmNfc3RyKCkpOworICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgpKSAhPSAwIHx8CisgICAgICAgICAgICAgICAoaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpICE9IDApKSB7CisgICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiVzIiwgYWRkcmVzcy5yU3VibWl4QWRkcmVzcy5jX3N0cigpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlcyIsIGFkZHJlc3MuYnVzQWRkcmVzcy5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIGhhbEFkZHJlc3M7Cit9CisKKy8vbG9jYWwgY29udmVyc2lvbiBoZWxwZXJzCisKK3N0YXRpYyBhdWRpb19taWNyb3Bob25lX2NoYW5uZWxfbWFwcGluZ190ICBjaGFubmVsTWFwcGluZ1RvSGFsKEF1ZGlvTWljcm9waG9uZUNoYW5uZWxNYXBwaW5nIG1hcHBpbmcpIHsKKyAgICBzd2l0Y2ggKG1hcHBpbmcpIHsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVDaGFubmVsTWFwcGluZzo6VU5VU0VEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX1VOVVNFRDsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVDaGFubmVsTWFwcGluZzo6RElSRUNUOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX0RJUkVDVDsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVDaGFubmVsTWFwcGluZzo6UFJPQ0VTU0VEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX1BST0NFU1NFRDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVua25vd24gY2hhbm5lbE1hcHBpbmdUb0hhbCBjb252ZXJzaW9uICVkIiwgbWFwcGluZyk7CisgICAgfQorfQorCitzdGF0aWMgYXVkaW9fbWljcm9waG9uZV9sb2NhdGlvbl90IGxvY2F0aW9uVG9IYWwoQXVkaW9NaWNyb3Bob25lTG9jYXRpb24gbG9jYXRpb24pIHsKKyAgICBzd2l0Y2ggKGxvY2F0aW9uKSB7CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lTG9jYXRpb246OlVOS05PV046CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9MT0NBVElPTl9VTktOT1dOOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uOjpNQUlOQk9EWToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0xPQ0FUSU9OX01BSU5CT0RZOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uOjpNQUlOQk9EWV9NT1ZBQkxFOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfTE9DQVRJT05fTUFJTkJPRFlfTU9WQUJMRTsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjo6UEVSSVBIRVJBTDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0xPQ0FUSU9OX1BFUklQSEVSQUw7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmtub3duIGxvY2F0aW9uVG9IYWwgY29udmVyc2lvbiAlZCIsIGxvY2F0aW9uKTsKKyAgICB9Cit9CitzdGF0aWMgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25hbGl0eV90IGRpcmVjdGlvbmFsaXR5VG9IYWwoQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHkgZGlyKSB7CisgICAgc3dpdGNoIChkaXIpIHsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6VU5LTk9XTjoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX1VOS05PV047CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHk6Ok9NTkk6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9PTU5JOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpCSV9ESVJFQ1RJT05BTDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX0JJX0RJUkVDVElPTkFMOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpDQVJESU9JRDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX0NBUkRJT0lEOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpIWVBFUl9DQVJESU9JRDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX0hZUEVSX0NBUkRJT0lEOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpTVVBFUl9DQVJESU9JRDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX1NVUEVSX0NBUkRJT0lEOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBkaXJlY3Rpb25hbGl0eVRvSGFsIGNvbnZlcnNpb24gJWQiLCBkaXIpOworICAgIH0KK30KKwordm9pZCBtaWNyb3Bob25lSW5mb1RvSGFsKGNvbnN0IE1pY3JvcGhvbmVJbmZvJiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190ICpwRHN0KSB7CisgICAgaWYgKHBEc3QgIT0gTlVMTCkgeworICAgICAgICBzbnByaW50ZihwRHN0LT5kZXZpY2VfaWQsIHNpemVvZihwRHN0LT5kZXZpY2VfaWQpLAorICAgICAgICAgICAgICAgICAiJXMiLCBzcmMuZGV2aWNlSWQuY19zdHIoKSk7CisgICAgICAgIHBEc3QtPmRldmljZSA9IHN0YXRpY19jYXN0PGF1ZGlvX2RldmljZXNfdD4oc3JjLmRldmljZUFkZHJlc3MuZGV2aWNlKTsKKyAgICAgICAgc25wcmludGYocERzdC0+YWRkcmVzcywgc2l6ZW9mKHBEc3QtPmFkZHJlc3MpLAorICAgICAgICAgICAgICAgICAiJXMiLCBkZXZpY2VBZGRyZXNzVG9IYWwoc3JjLmRldmljZUFkZHJlc3MpLmNfc3RyKCkpOworICAgICAgICBpZiAoc3JjLmNoYW5uZWxNYXBwaW5nLnNpemUoKSA+IEFVRElPX0NIQU5ORUxfQ09VTlRfTUFYKSB7CisgICAgICAgICAgICBBTE9HVygibWljcm9waG9uZUluZm9Ub1N0cnVjdCBmb3VuZCAlenUgY2hhbm5lbE1hcHBpbmcgZWxlbWVudHMuIE1heCBleHBlY3RlZCBpcyAlZCIsCisgICAgICAgICAgICAgICAgICBzcmMuY2hhbm5lbE1hcHBpbmcuc2l6ZSgpLCBBVURJT19DSEFOTkVMX0NPVU5UX01BWCk7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZV90IGNoOworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzcmMuY2hhbm5lbE1hcHBpbmcuc2l6ZSgpICYmIGNoIDwgQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVg7IGNoKyspIHsKKyAgICAgICAgICAgIHBEc3QtPmNoYW5uZWxfbWFwcGluZ1tjaF0gPSBjaGFubmVsTWFwcGluZ1RvSGFsKHNyYy5jaGFubmVsTWFwcGluZ1tjaF0pOworICAgICAgICB9CisgICAgICAgIGZvciAoOyBjaCA8IEFVRElPX0NIQU5ORUxfQ09VTlRfTUFYOyBjaCsrKSB7CisgICAgICAgICAgICBwRHN0LT5jaGFubmVsX21hcHBpbmdbY2hdID0gQVVESU9fTUlDUk9QSE9ORV9DSEFOTkVMX01BUFBJTkdfVU5VU0VEOworICAgICAgICB9CisgICAgICAgIHBEc3QtPmxvY2F0aW9uID0gbG9jYXRpb25Ub0hhbChzcmMubG9jYXRpb24pOworICAgICAgICBwRHN0LT5ncm91cCA9IChhdWRpb19taWNyb3Bob25lX2dyb3VwX3Qpc3JjLmdyb3VwOworICAgICAgICBwRHN0LT5pbmRleF9pbl90aGVfZ3JvdXAgPSAodW5zaWduZWQgaW50KXNyYy5pbmRleEluVGhlR3JvdXA7CisgICAgICAgIHBEc3QtPnNlbnNpdGl2aXR5ID0gc3JjLnNlbnNpdGl2aXR5OworICAgICAgICBwRHN0LT5tYXhfc3BsID0gc3JjLm1heFNwbDsKKyAgICAgICAgcERzdC0+bWluX3NwbCA9IHNyYy5taW5TcGw7CisgICAgICAgIHBEc3QtPmRpcmVjdGlvbmFsaXR5ID0gZGlyZWN0aW9uYWxpdHlUb0hhbChzcmMuZGlyZWN0aW9uYWxpdHkpOworICAgICAgICBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcyA9ICh1bnNpZ25lZCBpbnQpc3JjLmZyZXF1ZW5jeVJlc3BvbnNlLnNpemUoKTsKKyAgICAgICAgaWYgKHBEc3QtPm51bV9mcmVxdWVuY3lfcmVzcG9uc2VzID4gQVVESU9fTUlDUk9QSE9ORV9NQVhfRlJFUVVFTkNZX1JFU1BPTlNFUykgeworICAgICAgICAgICAgQUxPR1coIm1pY3JvcGhvbmVJbmZvVG9TdHJ1Y3QgZm91bmQgJWQgZnJlcXVlbmN5IHJlc3BvbnNlcy4gTWF4IGV4cGVjdGVkIGlzICVkIiwKKyAgICAgICAgICAgICAgICAgIHBEc3QtPm51bV9mcmVxdWVuY3lfcmVzcG9uc2VzLCBBVURJT19NSUNST1BIT05FX01BWF9GUkVRVUVOQ1lfUkVTUE9OU0VTKTsKKyAgICAgICAgICAgIHBEc3QtPm51bV9mcmVxdWVuY3lfcmVzcG9uc2VzID0gQVVESU9fTUlDUk9QSE9ORV9NQVhfRlJFUVVFTkNZX1JFU1BPTlNFUzsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IHBEc3QtPm51bV9mcmVxdWVuY3lfcmVzcG9uc2VzOyBrKyspIHsKKyAgICAgICAgICAgIHBEc3QtPmZyZXF1ZW5jeV9yZXNwb25zZXNbMF1ba10gPSBzcmMuZnJlcXVlbmN5UmVzcG9uc2Vba10uZnJlcXVlbmN5OworICAgICAgICAgICAgcERzdC0+ZnJlcXVlbmN5X3Jlc3BvbnNlc1sxXVtrXSA9IHNyYy5mcmVxdWVuY3lSZXNwb25zZVtrXS5sZXZlbDsKKyAgICAgICAgfQorICAgICAgICBwRHN0LT5nZW9tZXRyaWNfbG9jYXRpb24ueCA9IHNyYy5wb3NpdGlvbi54OworICAgICAgICBwRHN0LT5nZW9tZXRyaWNfbG9jYXRpb24ueSA9IHNyYy5wb3NpdGlvbi55OworICAgICAgICBwRHN0LT5nZW9tZXRyaWNfbG9jYXRpb24ueiA9IHNyYy5wb3NpdGlvbi56OworICAgICAgICBwRHN0LT5vcmllbnRhdGlvbi54ID0gc3JjLm9yaWVudGF0aW9uLng7CisgICAgICAgIHBEc3QtPm9yaWVudGF0aW9uLnkgPSBzcmMub3JpZW50YXRpb24ueTsKKyAgICAgICAgcERzdC0+b3JpZW50YXRpb24ueiA9IHNyYy5vcmllbnRhdGlvbi56OworICAgIH0KK30KKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzYmI5ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQ29udmVyc2lvbkhlbHBlckhpZGwuaApAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfSAorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL3R5cGVzLmgpCisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpQYXJhbWV0ZXJWYWx1ZTsKK3VzaW5nIENvcmVSZXN1bHQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OlJlc3VsdDsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworY2xhc3MgQ29udmVyc2lvbkhlbHBlckhpZGwgeworICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHN0YXR1c190IGtleXNGcm9tSGFsKGNvbnN0IFN0cmluZzgmIGtleXMsIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAqaGlkbEtleXMpOworICAgIHN0YXRpYyBzdGF0dXNfdCBwYXJhbWV0ZXJzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrdlBhaXJzLCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gKmhpZGxQYXJhbXMpOworICAgIHN0YXRpYyB2b2lkIHBhcmFtZXRlcnNUb0hhbChjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMsIFN0cmluZzggKnZhbHVlcyk7CisKKyAgICBDb252ZXJzaW9uSGVscGVySGlkbChjb25zdCBjaGFyKiBjbGFzc05hbWUpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVD4KKyAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48Uj4mIHJldCwgVCAqcmV0dmFsKSB7CisgICAgICAgIGlmIChyZXQuaXNPaygpKSB7CisgICAgICAgICAgICAvLyBUaGlzIHdheSBpdCBhbHNvIHdvcmtzIGZvciBlbnVtIGNsYXNzIHRvIHVuc2NvcGVkIGVudW0gY29udmVyc2lvbi4KKyAgICAgICAgICAgICpyZXR2YWwgPSBzdGF0aWNfY2FzdDxUPihzdGF0aWNfY2FzdDxSPihyZXQpKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybihmdW5jTmFtZSwgcmV0KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IFJldHVybjxUPiYgcmV0KSB7CisgICAgICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IE9LIDogRkFJTEVEX1RSQU5TQUNUSU9OOworICAgIH0KKworICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IFJldHVybjxDb3JlUmVzdWx0PiYgcmV0KSB7CisgICAgICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oCisgICAgICAgICAgICBjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFQ+JiByZXQsIENvcmVSZXN1bHQgcmV0dmFsKSB7CisgICAgICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBjaGFyKiBtQ2xhc3NOYW1lOworCisgICAgc3RhdGljIHN0YXR1c190IGFuYWx5emVSZXN1bHQoY29uc3QgQ29yZVJlc3VsdCYgcmVzdWx0KTsKKworICAgIHZvaWQgZW1pdEVycm9yKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbik7Cit9OworCisjaWYgTUFKT1JfVkVSU0lPTiA+PSA0Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046Ok1pY3JvcGhvbmVJbmZvOwordm9pZCBtaWNyb3Bob25lSW5mb1RvSGFsKGNvbnN0IE1pY3JvcGhvbmVJbmZvJiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190ICpwRHN0KTsKKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsSGlkbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E5ZTg0MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsSGlkbC5jcHAKQEAgLTAsMCArMSwzOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2RlZmluZSBMT0dfVEFHICJEZXZpY2VIYWxIaWRsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL0lQcmltYXJ5RGV2aWNlLmgpCisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8Y29tbW9uL2FsbC12ZXJzaW9ucy9WZXJzaW9uVXRpbHMuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKKyNpbmNsdWRlICJIaWRsVXRpbHMuaCIKKyNpbmNsdWRlICJTdHJlYW1IYWxIaWRsLmgiCisjaW5jbHVkZSAiVmVyc2lvblV0aWxzLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOjppbXBsZW1lbnRhdGlvbjo6SGlkbFV0aWxzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6dXRpbHM6OkVudW1CaXRmaWVsZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT047CisKK25hbWVzcGFjZSB7CisKK3N0YXR1c190IGRldmljZUFkZHJlc3NGcm9tSGFsKAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBjb25zdCBjaGFyKiBoYWxBZGRyZXNzLCBEZXZpY2VBZGRyZXNzKiBhZGRyZXNzKSB7CisgICAgYWRkcmVzcy0+ZGV2aWNlID0gQXVkaW9EZXZpY2UoZGV2aWNlKTsKKworICAgIGlmIChoYWxBZGRyZXNzID09IG51bGxwdHIgfHwgc3RybmxlbihoYWxBZGRyZXNzLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgY29uc3QgYm9vbCBpc0lucHV0ID0gKGRldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDA7CisgICAgaWYgKGlzSW5wdXQpIGRldmljZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKKyAgICBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSAhPSAwKQorICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCkgIT0gMCkpIHsKKyAgICAgICAgaW50IHN0YXR1cyA9IHNzY2FuZihoYWxBZGRyZXNzLAorICAgICAgICAgICAgICAgICIlaGhYOiVoaFg6JWhoWDolaGhYOiVoaFg6JWhoWCIsCisgICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzBdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMV0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1syXSwKKyAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbM10sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1s0XSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzVdKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSA2ID8gT0sgOiBCQURfVkFMVUU7CisgICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfSVApICE9IDApCisgICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0lQKSAhPSAwKSkgeworICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCisgICAgICAgICAgICAgICAgIiVoaHUuJWhodS4laGh1LiVoaHUiLAorICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMF0sICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMV0sCisgICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFsyXSwgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFszXSk7CisgICAgICAgIHJldHVybiBzdGF0dXMgPT0gNCA/IE9LIDogQkFEX1ZBTFVFOworICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9VU0IpKSAhPSAwCisgICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0FMTF9VU0IpKSAhPSAwKSB7CisgICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKKyAgICAgICAgICAgICAgICAiY2FyZD0lZDtkZXZpY2U9JWQiLAorICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmFsc2EuY2FyZCwgJmFkZHJlc3MtPmFkZHJlc3MuYWxzYS5kZXZpY2UpOworICAgICAgICByZXR1cm4gc3RhdHVzID09IDIgPyBPSyA6IEJBRF9WQUxVRTsKKyAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9CVVMpICE9IDApCisgICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0JVUykgIT0gMCkpIHsKKyAgICAgICAgaWYgKGhhbEFkZHJlc3MgIT0gTlVMTCkgeworICAgICAgICAgICAgYWRkcmVzcy0+YnVzQWRkcmVzcyA9IGhhbEFkZHJlc3M7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSkgIT0gMAorICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSAhPSAwKSkgeworICAgICAgICBpZiAoaGFsQWRkcmVzcyAhPSBOVUxMKSB7CisgICAgICAgICAgICBhZGRyZXNzLT5yU3VibWl4QWRkcmVzcyA9IGhhbEFkZHJlc3M7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworRGV2aWNlSGFsSGlkbDo6RGV2aWNlSGFsSGlkbChjb25zdCBzcDxJRGV2aWNlPiYgZGV2aWNlKQorICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJEZXZpY2UiKSwgbURldmljZShkZXZpY2UpLAorICAgICAgICAgIG1QcmltYXJ5RGV2aWNlKElQcmltYXJ5RGV2aWNlOjpjYXN0RnJvbShkZXZpY2UpKSB7Cit9CisKK0RldmljZUhhbEhpZGw6On5EZXZpY2VIYWxIaWRsKCkgeworICAgIGlmIChtRGV2aWNlICE9IDApIHsKKyAgICAgICAgbURldmljZS5jbGVhcigpOworICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOworICAgIH0KK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCopIHsKKyAgICAvLyBPYnNvbGV0ZS4KKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmluaXRDaGVjaygpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiaW5pdENoZWNrIiwgbURldmljZS0+aW5pdENoZWNrKCkpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRWb2ljZVZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1hc3RlclZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRNYXN0ZXJWb2x1bWUodm9sdW1lKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtUHJpbWFyeURldmljZS0+Z2V0TWFzdGVyVm9sdW1lKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBmbG9hdCB2KSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnZvbHVtZSA9IHY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1hc3RlclZvbHVtZSIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1vZGUiLCBtUHJpbWFyeURldmljZS0+c2V0TW9kZShBdWRpb01vZGUobW9kZSkpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1pY011dGUiLCBtRGV2aWNlLT5zZXRNaWNNdXRlKHN0YXRlKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1pY011dGUoYm9vbCAqc3RhdGUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNaWNNdXRlKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBib29sIG11dGUpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqc3RhdGUgPSBtdXRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNaWNNdXRlIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyTXV0ZSIsIG1EZXZpY2UtPnNldE1hc3Rlck11dGUoc3RhdGUpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1hc3Rlck11dGUoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGJvb2wgbXV0ZSkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpzdGF0ZSA9IG11dGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1hc3Rlck11dGUiLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBoaWRsUGFyYW1zOworICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtZXRlcnNGcm9tSGFsKGt2UGFpcnMsICZoaWRsUGFyYW1zKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIC8vIFRPRE86IGNoYW5nZSB0aGUgQVBJIHNvIHRoYXQgY29udGV4dCBhbmQga3ZQYWlycyBhcmUgc2VwYXJhdGVkCisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFBhcmFtZXRlcnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzOjpzZXRQYXJhbWV0ZXJzKG1EZXZpY2UsIHt9IC8qIGNvbnRleHQgKi8sIGhpZGxQYXJhbXMpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKKyAgICB2YWx1ZXMtPmNsZWFyKCk7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGhpZGxLZXlzOworICAgIHN0YXR1c190IHN0YXR1cyA9IGtleXNGcm9tSGFsKGtleXMsICZoaWRsS2V5cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSB1dGlsczo6Z2V0UGFyYW1ldGVycyhtRGV2aWNlLAorICAgICAgICAgICAge30gLyogY29udGV4dCAqLywKKyAgICAgICAgICAgIGhpZGxLZXlzLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzVG9IYWwocGFyYW1ldGVycywgdmFsdWVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UGFyYW1ldGVycyIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7CisgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldElucHV0QnVmZmVyU2l6ZSgKKyAgICAgICAgICAgIGhpZGxDb25maWcsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldElucHV0QnVmZmVyU2l6ZSIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6b3Blbk91dHB1dFN0cmVhbSgKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgRGV2aWNlQWRkcmVzcyBoaWRsRGV2aWNlOworICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZUFkZHJlc3NGcm9tSGFsKGRldmljZXMsIGFkZHJlc3MsICZoaWRsRGV2aWNlKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7CisgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOworICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3Blbk91dHB1dFN0cmVhbSgKKyAgICAgICAgICAgIGhhbmRsZSwKKyAgICAgICAgICAgIGhpZGxEZXZpY2UsCisgICAgICAgICAgICBoaWRsQ29uZmlnLAorICAgICAgICAgICAgRW51bUJpdGZpZWxkPEF1ZGlvT3V0cHV0RmxhZz4oZmxhZ3MpLAorI2lmIE1BSk9SX1ZFUlNJT04gPj0gNAorICAgICAgICAgICAge30gLyogbWV0YWRhdGEgKi8sCisjZW5kaWYKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SVN0cmVhbU91dD4mIHJlc3VsdCwgY29uc3QgQXVkaW9Db25maWcmIHN1Z2dlc3RlZENvbmZpZykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXRTdHJlYW0gPSBuZXcgU3RyZWFtT3V0SGFsSGlkbChyZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnVG9IYWwoc3VnZ2VzdGVkQ29uZmlnLCBjb25maWcpOworICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oIm9wZW5PdXRwdXRTdHJlYW0iLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6Om9wZW5JbnB1dFN0cmVhbSgKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBEZXZpY2VBZGRyZXNzIGhpZGxEZXZpY2U7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2aWNlQWRkcmVzc0Zyb21IYWwoZGV2aWNlcywgYWRkcmVzcywgJmhpZGxEZXZpY2UpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgQXVkaW9Db25maWcgaGlkbENvbmZpZzsKKyAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgorICAgIGF1dG8gc2lua01ldGFkYXRhID0gQXVkaW9Tb3VyY2Uoc291cmNlKTsKKyNlbGlmIE1BSk9SX1ZFUlNJT04gPj0gNAorICAgIC8vIFRPRE86IGNvcnJlY3RseSBwcm9wYWdhdGUgdGhlIHRyYWNrcyBzb3VyY2VzIGFuZCB2b2x1bWUKKyAgICAvLyAgICAgICBmb3Igbm93LCBvbmx5IHNlbmQgdGhlIG1haW4gc291cmNlIGF0IDFkYmZzCisgICAgU2lua01ldGFkYXRhIHNpbmtNZXRhZGF0YSA9IHt7eyAuc291cmNlID0gQXVkaW9Tb3VyY2Uoc291cmNlKSwgLmdhaW4gPSAxIH19fTsKKyNlbmRpZgorICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5vcGVuSW5wdXRTdHJlYW0oCisgICAgICAgICAgICBoYW5kbGUsCisgICAgICAgICAgICBoaWRsRGV2aWNlLAorICAgICAgICAgICAgaGlkbENvbmZpZywKKyAgICAgICAgICAgIEVudW1CaXRmaWVsZDxBdWRpb0lucHV0RmxhZz4oZmxhZ3MpLAorICAgICAgICAgICAgc2lua01ldGFkYXRhLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJU3RyZWFtSW4+JiByZXN1bHQsIGNvbnN0IEF1ZGlvQ29uZmlnJiBzdWdnZXN0ZWRDb25maWcpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqaW5TdHJlYW0gPSBuZXcgU3RyZWFtSW5IYWxIaWRsKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdUb0hhbChzdWdnZXN0ZWRDb25maWcsIGNvbmZpZyk7CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigib3BlbklucHV0U3RyZWFtIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNBdWRpb1BhdGNoZXMiLCBtRGV2aWNlLT5zdXBwb3J0c0F1ZGlvUGF0Y2hlcygpLCBzdXBwb3J0c1BhdGNoZXMpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpjcmVhdGVBdWRpb1BhdGNoKAorICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKKyAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKKyAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKKyAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaGlkbF92ZWM8QXVkaW9Qb3J0Q29uZmlnPiBoaWRsU291cmNlcywgaGlkbFNpbmtzOworICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0Q29uZmlnc0Zyb21IYWwobnVtX3NvdXJjZXMsIHNvdXJjZXMsICZoaWRsU291cmNlcyk7CisgICAgSGlkbFV0aWxzOjphdWRpb1BvcnRDb25maWdzRnJvbUhhbChudW1fc2lua3MsIHNpbmtzLCAmaGlkbFNpbmtzKTsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5jcmVhdGVBdWRpb1BhdGNoKAorICAgICAgICAgICAgaGlkbFNvdXJjZXMsIGhpZGxTaW5rcywKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgQXVkaW9QYXRjaEhhbmRsZSBoaWRsUGF0Y2gpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqcGF0Y2ggPSBzdGF0aWNfY2FzdDxhdWRpb19wYXRjaF9oYW5kbGVfdD4oaGlkbFBhdGNoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiY3JlYXRlQXVkaW9QYXRjaCIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicmVsZWFzZUF1ZGlvUGF0Y2giLCBtRGV2aWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaCkpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBBdWRpb1BvcnQgaGlkbFBvcnQ7CisgICAgSGlkbFV0aWxzOjphdWRpb1BvcnRGcm9tSGFsKCpwb3J0LCAmaGlkbFBvcnQpOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldEF1ZGlvUG9ydCgKKyAgICAgICAgICAgIGhpZGxQb3J0LAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBBdWRpb1BvcnQmIHApIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydFRvSGFsKHAsIHBvcnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRBdWRpb1BvcnQiLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIEF1ZGlvUG9ydENvbmZpZyBoaWRsQ29uZmlnOworICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0Q29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldEF1ZGlvUG9ydENvbmZpZyIsIG1EZXZpY2UtPnNldEF1ZGlvUG9ydENvbmZpZyhoaWRsQ29uZmlnKSk7Cit9CisKKyNpZiBNQUpPUl9WRVJTSU9OID09IDIKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1pY3JvcGhvbmVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lc0luZm8gX191bnVzZWQpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisjZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzSW5mbykgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1pY3JvcGhvbmVzKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBoaWRsX3ZlYzxNaWNyb3Bob25lSW5mbz4gbWljQXJyYXlIYWwpIHsKKyAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBtaWNBcnJheUhhbC5zaXplKCk7IGsrKykgeworICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190IGRzdDsKKyAgICAgICAgICAgIC8vY29udmVydAorICAgICAgICAgICAgbWljcm9waG9uZUluZm9Ub0hhbChtaWNBcnJheUhhbFtrXSwgJmRzdCk7CisgICAgICAgICAgICBtZWRpYTo6TWljcm9waG9uZUluZm8gbWljcm9waG9uZSA9IG1lZGlhOjpNaWNyb3Bob25lSW5mbyhkc3QpOworICAgICAgICAgICAgbWljcm9waG9uZXNJbmZvLT5wdXNoX2JhY2sobWljcm9waG9uZSk7CisgICAgICAgIH0KKyAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TWljcm9waG9uZXMiLCByZXQsIHJldHZhbCk7Cit9CisjZW5kaWYKKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6ZHVtcChpbnQgZmQpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmRlYnVnKGhpZGxIYW5kbGUsIHt9IC8qIG9wdGlvbnMgKi8pOworICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhpZGxIYW5kbGUpOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJkdW1wIiwgcmV0KTsKK30KKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkxYzg4ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsSGlkbC5oCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMX0gKKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JRGV2aWNlLmgpCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL0lQcmltYXJ5RGV2aWNlLmgpCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklEZXZpY2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklQcmltYXJ5RGV2aWNlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitjbGFzcyBEZXZpY2VIYWxIaWRsIDogcHVibGljIERldmljZUhhbEludGVyZmFjZSwgcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsCit7CisgIHB1YmxpYzoKKyAgICAvLyBTZXRzIHRoZSB2YWx1ZSBvZiAnZGV2aWNlcycgdG8gYSBiaXRtYXNrIG9mIDEgb3IgbW9yZSB2YWx1ZXMgb2YgYXVkaW9fZGV2aWNlc190LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCAqZGV2aWNlcyk7CisKKyAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZSBoYXMgYmVlbiBpbml0aWFsaXplZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOworCisgICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgb2YgYSB2b2ljZSBjYWxsLiBSYW5nZSBpcyBiZXR3ZWVuIDAuMCBhbmQgMS4wLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKTsKKworICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIGZvciBhbGwgYXVkaW8gYWN0aXZpdGllcyBvdGhlciB0aGFuIHZvaWNlIGNhbGwuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKTsKKworICAgIC8vIEdldCB0aGUgY3VycmVudCBtYXN0ZXIgdm9sdW1lIHZhbHVlIGZvciB0aGUgSEFMLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpOworCisgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIGF1ZGlvIG1vZGUgY2hhbmdlcy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpOworCisgICAgLy8gTXV0aW5nIGNvbnRyb2wuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNNdXRlKGJvb2wgc3RhdGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljTXV0ZShib29sICpzdGF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSk7CisKKyAgICAvLyBTZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOworCisgICAgLy8gR2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOworCisgICAgLy8gUmV0dXJucyBhdWRpbyBpbnB1dCBidWZmZXIgc2l6ZSBhY2NvcmRpbmcgdG8gcGFyYW1ldGVycyBwYXNzZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlclNpemUoY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgc2l6ZV90ICpzaXplKTsKKworICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAorICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3Blbk91dHB1dFN0cmVhbSgKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKTsKKworICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCisgICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuSW5wdXRTdHJlYW0oCisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgY3JlYXRlQXVkaW9QYXRjaCBhbmQgcmVsZWFzZUF1ZGlvUGF0Y2ggb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKTsKKworICAgIC8vIENyZWF0ZXMgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCk7CisKKyAgICAvLyBSZWxlYXNlcyBhbiBhdWRpbyBwYXRjaC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKTsKKworICAgIC8vIEZpbGxzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpOworCisgICAgLy8gU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisKKyAgICAvLyBMaXN0IG1pY3JvcGhvbmVzCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEhpZGw7CisgICAgc3A8SURldmljZT4gbURldmljZTsKKyAgICBzcDxJUHJpbWFyeURldmljZT4gbVByaW1hcnlEZXZpY2U7ICAvLyBOdWxsIGlmIGl0J3Mgbm90IGEgcHJpbWFyeSBkZXZpY2UuCisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgZXhwbGljaXQgRGV2aWNlSGFsSGlkbChjb25zdCBzcDxJRGV2aWNlPiYgZGV2aWNlKTsKKworICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBkZXZpY2UuCisgICAgdmlydHVhbCB+RGV2aWNlSGFsSGlkbCgpOworfTsKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxMb2NhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZmZTlkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsTG9jYWwuY3BwCkBAIC0wLDAgKzEsMjIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJEZXZpY2VIYWxMb2NhbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKKyNpbmNsdWRlICJTdHJlYW1IYWxMb2NhbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitEZXZpY2VIYWxMb2NhbDo6RGV2aWNlSGFsTG9jYWwoYXVkaW9faHdfZGV2aWNlX3QgKmRldikKKyAgICAgICAgOiBtRGV2KGRldikgeworfQorCitEZXZpY2VIYWxMb2NhbDo6fkRldmljZUhhbExvY2FsKCkgeworICAgIGludCBzdGF0dXMgPSBhdWRpb19od19kZXZpY2VfY2xvc2UobURldik7CisgICAgQUxPR1dfSUYoc3RhdHVzLCAiRXJyb3IgY2xvc2luZyBhdWRpbyBodyBkZXZpY2UgJXA6ICVzIiwgbURldiwgc3RyZXJyb3IoLXN0YXR1cykpOworICAgIG1EZXYgPSAwOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCAqZGV2aWNlcykgeworICAgIGlmIChtRGV2LT5nZXRfc3VwcG9ydGVkX2RldmljZXMgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICpkZXZpY2VzID0gbURldi0+Z2V0X3N1cHBvcnRlZF9kZXZpY2VzKG1EZXYpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmluaXRDaGVjaygpIHsKKyAgICByZXR1cm4gbURldi0+aW5pdF9jaGVjayhtRGV2KTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIHJldHVybiBtRGV2LT5zZXRfdm9pY2Vfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CisgICAgaWYgKG1EZXYtPnNldF9tYXN0ZXJfdm9sdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbURldi0+c2V0X21hc3Rlcl92b2x1bWUobURldiwgdm9sdW1lKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKSB7CisgICAgaWYgKG1EZXYtPmdldF9tYXN0ZXJfdm9sdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbURldi0+Z2V0X21hc3Rlcl92b2x1bWUobURldiwgdm9sdW1lKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpIHsKKyAgICByZXR1cm4gbURldi0+c2V0X21vZGUobURldiwgbW9kZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNaWNNdXRlKGJvb2wgc3RhdGUpIHsKKyAgICByZXR1cm4gbURldi0+c2V0X21pY19tdXRlKG1EZXYsIHN0YXRlKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1pY011dGUoYm9vbCAqc3RhdGUpIHsKKyAgICByZXR1cm4gbURldi0+Z2V0X21pY19tdXRlKG1EZXYsIHN0YXRlKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSkgeworICAgIGlmIChtRGV2LT5zZXRfbWFzdGVyX211dGUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtRGV2LT5zZXRfbWFzdGVyX211dGUobURldiwgc3RhdGUpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSkgeworICAgIGlmIChtRGV2LT5nZXRfbWFzdGVyX211dGUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtRGV2LT5nZXRfbWFzdGVyX211dGUobURldiwgc3RhdGUpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7CisgICAgcmV0dXJuIG1EZXYtPnNldF9wYXJhbWV0ZXJzKG1EZXYsIGt2UGFpcnMuc3RyaW5nKCkpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKKyAgICBjaGFyICpoYWxWYWx1ZXMgPSBtRGV2LT5nZXRfcGFyYW1ldGVycyhtRGV2LCBrZXlzLnN0cmluZygpKTsKKyAgICBpZiAoaGFsVmFsdWVzICE9IE5VTEwpIHsKKyAgICAgICAgdmFsdWVzLT5zZXRUbyhoYWxWYWx1ZXMpOworICAgICAgICBmcmVlKGhhbFZhbHVlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsdWVzLT5jbGVhcigpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRJbnB1dEJ1ZmZlclNpemUoCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywgc2l6ZV90ICpzaXplKSB7CisgICAgKnNpemUgPSBtRGV2LT5nZXRfaW5wdXRfYnVmZmVyX3NpemUobURldiwgY29uZmlnKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpvcGVuT3V0cHV0U3RyZWFtKAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pIHsKKyAgICBhdWRpb19zdHJlYW1fb3V0X3QgKmhhbFN0cmVhbTsKKyAgICBBTE9HVigib3Blbl9vdXRwdXRfc3RyZWFtIGhhbmRsZTogJWQgZGV2aWNlczogJXggZmxhZ3M6ICUjeCIKKyAgICAgICAgICAgICJzcmF0ZTogJWQgZm9ybWF0ICUjeCBjaGFubmVscyAleCBhZGRyZXNzICVzIiwKKyAgICAgICAgICAgIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsCisgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssCisgICAgICAgICAgICBhZGRyZXNzKTsKKyAgICBpbnQgb3BlblJlc3V0ID0gbURldi0+b3Blbl9vdXRwdXRfc3RyZWFtKAorICAgICAgICAgICAgbURldiwgaGFuZGxlLCBkZXZpY2VzLCBmbGFncywgY29uZmlnLCAmaGFsU3RyZWFtLCBhZGRyZXNzKTsKKyAgICBpZiAob3BlblJlc3V0ID09IE9LKSB7CisgICAgICAgICpvdXRTdHJlYW0gPSBuZXcgU3RyZWFtT3V0SGFsTG9jYWwoaGFsU3RyZWFtLCB0aGlzKTsKKyAgICB9CisgICAgQUxPR1YoIm9wZW5fb3V0cHV0X3N0cmVhbSBzdGF0dXMgJWQgc3RyZWFtICVwIiwgb3BlblJlc3V0LCBoYWxTdHJlYW0pOworICAgIHJldHVybiBvcGVuUmVzdXQ7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpvcGVuSW5wdXRTdHJlYW0oCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKSB7CisgICAgYXVkaW9fc3RyZWFtX2luX3QgKmhhbFN0cmVhbTsKKyAgICBBTE9HVigib3Blbl9pbnB1dF9zdHJlYW0gaGFuZGxlOiAlZCBkZXZpY2VzOiAleCBmbGFnczogJSN4ICIKKyAgICAgICAgICAgICJzcmF0ZTogJWQgZm9ybWF0ICUjeCBjaGFubmVscyAleCBhZGRyZXNzICVzIHNvdXJjZSAlZCIsCisgICAgICAgICAgICBoYW5kbGUsIGRldmljZXMsIGZsYWdzLAorICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgYWRkcmVzcywgc291cmNlKTsKKyAgICBpbnQgb3BlblJlc3VsdCA9IG1EZXYtPm9wZW5faW5wdXRfc3RyZWFtKAorICAgICAgICAgICAgbURldiwgaGFuZGxlLCBkZXZpY2VzLCBjb25maWcsICZoYWxTdHJlYW0sIGZsYWdzLCBhZGRyZXNzLCBzb3VyY2UpOworICAgIGlmIChvcGVuUmVzdWx0ID09IE9LKSB7CisgICAgICAgICppblN0cmVhbSA9IG5ldyBTdHJlYW1JbkhhbExvY2FsKGhhbFN0cmVhbSwgdGhpcyk7CisgICAgfQorICAgIEFMT0dWKCJvcGVuX2lucHV0X3N0cmVhbSBzdGF0dXMgJWQgc3RyZWFtICVwIiwgb3BlblJlc3VsdCwgaW5TdHJlYW0pOworICAgIHJldHVybiBvcGVuUmVzdWx0OworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKSB7CisgICAgKnN1cHBvcnRzUGF0Y2hlcyA9IHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmNyZWF0ZUF1ZGlvUGF0Y2goCisgICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKKyAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAorICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAorICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpIHsKKyAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKKyAgICAgICAgcmV0dXJuIG1EZXYtPmNyZWF0ZV9hdWRpb19wYXRjaCgKKyAgICAgICAgICAgICAgICBtRGV2LCBudW1fc291cmNlcywgc291cmNlcywgbnVtX3NpbmtzLCBzaW5rcywgcGF0Y2gpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCkgeworICAgIGlmICh2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgeworICAgICAgICByZXR1cm4gbURldi0+cmVsZWFzZV9hdWRpb19wYXRjaChtRGV2LCBwYXRjaCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgeworICAgIHJldHVybiBtRGV2LT5nZXRfYXVkaW9fcG9ydChtRGV2LCBwb3J0KTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgeworICAgIGlmICh2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkKKyAgICAgICAgcmV0dXJuIG1EZXYtPnNldF9hdWRpb19wb3J0X2NvbmZpZyhtRGV2LCBjb25maWcpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCisjaWYgTUFKT1JfVkVSU0lPTiA9PSAyCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWljcm9waG9uZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzIF9fdW51c2VkKSB7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpIHsKKyAgICBpZiAobURldi0+Z2V0X21pY3JvcGhvbmVzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBzaXplX3QgYWN0dWFsX21pY3MgPSBBVURJT19NSUNST1BIT05FX01BWF9DT1VOVDsKKyAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgbWljX2FycmF5W0FVRElPX01JQ1JPUEhPTkVfTUFYX0NPVU5UXTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtRGV2LT5nZXRfbWljcm9waG9uZXMobURldiwgJm1pY19hcnJheVswXSwgJmFjdHVhbF9taWNzKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFjdHVhbF9taWNzOyBpKyspIHsKKyAgICAgICAgbWVkaWE6Ok1pY3JvcGhvbmVJbmZvIG1pY3JvcGhvbmVJbmZvID0gbWVkaWE6Ok1pY3JvcGhvbmVJbmZvKG1pY19hcnJheVtpXSk7CisgICAgICAgIG1pY3JvcGhvbmVzLT5wdXNoX2JhY2sobWljcm9waG9uZUluZm8pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorI2VuZGlmCisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpkdW1wKGludCBmZCkgeworICAgIHJldHVybiBtRGV2LT5kdW1wKG1EZXYsIGZkKTsKK30KKwordm9pZCBEZXZpY2VIYWxMb2NhbDo6Y2xvc2VPdXRwdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgKnN0cmVhbV9vdXQpIHsKKyAgICBtRGV2LT5jbG9zZV9vdXRwdXRfc3RyZWFtKG1EZXYsIHN0cmVhbV9vdXQpOworfQorCit2b2lkIERldmljZUhhbExvY2FsOjpjbG9zZUlucHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1faW4gKnN0cmVhbV9pbikgeworICAgIG1EZXYtPmNsb3NlX2lucHV0X3N0cmVhbShtRGV2LCBzdHJlYW1faW4pOworfQorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxMb2NhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YmQ4NzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbExvY2FsLmgKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF9ICisKKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitjbGFzcyBEZXZpY2VIYWxMb2NhbCA6IHB1YmxpYyBEZXZpY2VIYWxJbnRlcmZhY2UKK3sKKyAgcHVibGljOgorICAgIC8vIFNldHMgdGhlIHZhbHVlIG9mICdkZXZpY2VzJyB0byBhIGJpdG1hc2sgb2YgMSBvciBtb3JlIHZhbHVlcyBvZiBhdWRpb19kZXZpY2VzX3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKTsKKworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIGhhcyBiZWVuIGluaXRpYWxpemVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7CisKKyAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBvZiBhIHZvaWNlIGNhbGwuIFJhbmdlIGlzIGJldHdlZW4gMC4wIGFuZCAxLjAuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOworCisgICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgZm9yIGFsbCBhdWRpbyBhY3Rpdml0aWVzIG90aGVyIHRoYW4gdm9pY2UgY2FsbC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpOworCisgICAgLy8gR2V0IHRoZSBjdXJyZW50IG1hc3RlciB2b2x1bWUgdmFsdWUgZm9yIHRoZSBIQUwuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSk7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgYXVkaW8gbW9kZSBjaGFuZ2VzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSk7CisKKyAgICAvLyBNdXRpbmcgY29udHJvbC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY011dGUoYm9vbCBzdGF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKTsKKworICAgIC8vIFNldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7CisKKyAgICAvLyBHZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7CisKKyAgICAvLyBSZXR1cm5zIGF1ZGlvIGlucHV0IGJ1ZmZlciBzaXplIGFjY29yZGluZyB0byBwYXJhbWV0ZXJzIHBhc3NlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyU2l6ZShjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgICAgICBzaXplX3QgKnNpemUpOworCisgICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCisgICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0U3RyZWFtKAorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pOworCisgICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKKyAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dFN0cmVhbSgKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKTsKKworICAgIC8vIFJldHVybnMgd2hldGhlciBjcmVhdGVBdWRpb1BhdGNoIGFuZCByZWxlYXNlQXVkaW9QYXRjaCBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpOworCisgICAgLy8gQ3JlYXRlcyBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaCgKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAorICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKTsKKworICAgIC8vIFJlbGVhc2VzIGFuIGF1ZGlvIHBhdGNoLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpOworCisgICAgLy8gRmlsbHMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7CisKKyAgICAvLyBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKworICAgIC8vIExpc3QgbWljcm9waG9uZXMKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworCisgICAgdm9pZCBjbG9zZU91dHB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCAqc3RyZWFtX291dCk7CisgICAgdm9pZCBjbG9zZUlucHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1faW4gKnN0cmVhbV9pbik7CisKKyAgcHJpdmF0ZToKKyAgICBhdWRpb19od19kZXZpY2VfdCAqbURldjsKKworICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbExvY2FsOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIGV4cGxpY2l0IERldmljZUhhbExvY2FsKGF1ZGlvX2h3X2RldmljZV90ICpkZXYpOworCisgICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIGRldmljZS4KKyAgICB2aXJ0dWFsIH5EZXZpY2VIYWxMb2NhbCgpOworCisgICAgdWludDMyX3QgdmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1EZXYtPmNvbW1vbi52ZXJzaW9uOyB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTAxZTQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2RlZmluZSBMT0dfVEFHICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSURldmljZS5oKQorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL2hpZGwvSGFsRGVhdGhIYW5kbGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKKyNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJRGV2aWNlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpSZXN1bHQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK0RldmljZXNGYWN0b3J5SGFsSGlkbDo6RGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCkgeworICAgIHNwPElEZXZpY2VzRmFjdG9yeT4gZGVmYXVsdEZhY3Rvcnl7SURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKCl9OworICAgIGlmICghZGVmYXVsdEZhY3RvcnkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvYnRhaW4gSURldmljZXNGYWN0b3J5L2RlZmF1bHQgc2VydmljZSwgdGVybWluYXRpbmcgcHJvY2Vzcy4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgbURldmljZUZhY3Rvcmllcy5wdXNoX2JhY2soZGVmYXVsdEZhY3RvcnkpOworICAgIGlmIChNQUpPUl9WRVJTSU9OID49IDQpIHsKKyAgICAgICAgLy8gVGhlIE1TRCBmYWN0b3J5IGlzIG9wdGlvbmFsIGFuZCBvbmx5IGF2YWlsYWJsZSBzdGFydGluZyBhdCBIQUwgNC4wCisgICAgICAgIHNwPElEZXZpY2VzRmFjdG9yeT4gbXNkRmFjdG9yeXtJRGV2aWNlc0ZhY3Rvcnk6OmdldFNlcnZpY2UoQVVESU9fSEFMX1NFUlZJQ0VfTkFNRV9NU0QpfTsKKyAgICAgICAgaWYgKG1zZEZhY3RvcnkpIHsKKyAgICAgICAgICAgIG1EZXZpY2VGYWN0b3JpZXMucHVzaF9iYWNrKG1zZEZhY3RvcnkpOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYgZmFjdG9yeSA6IG1EZXZpY2VGYWN0b3JpZXMpIHsKKyAgICAgICAgLy8gSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZSBpbnN0YW5jZSBpcyBvd25lZAorICAgICAgICAvLyBieSBBdWRpb0ZsaW5nZXIgYW5kIHRodXMgaGF2ZSB0aGUgc2FtZSBsaWZlc3Bhbi4KKyAgICAgICAgZmFjdG9yeS0+bGlua1RvRGVhdGgoSGFsRGVhdGhIYW5kbGVyOjpnZXRJbnN0YW5jZSgpLCAwIC8qY29va2llKi8pOworICAgIH0KK30KKworCisjaWYgTUFKT1JfVkVSU0lPTiA9PSAyCitzdGF0aWMgSURldmljZXNGYWN0b3J5OjpEZXZpY2UgaWRGcm9tSGFsKGNvbnN0IGNoYXIgKm5hbWUsIHN0YXR1c190KiBzdGF0dXMpIHsKKyAgICAqc3RhdHVzID0gT0s7CisgICAgaWYgKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSkgPT0gMCkgeworICAgICAgICByZXR1cm4gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OlBSSU1BUlk7CisgICAgfSBlbHNlIGlmKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfQTJEUCkgPT0gMCkgeworICAgICAgICByZXR1cm4gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OkEyRFA7CisgICAgfSBlbHNlIGlmKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfVVNCKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6VVNCOworICAgIH0gZWxzZSBpZihzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1JFTU9URV9TVUJNSVgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpSX1NVQk1JWDsKKyAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9TVFVCKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6U1RVQjsKKyAgICB9CisgICAgQUxPR0UoIkludmFsaWQgZGV2aWNlIG5hbWUgJXMiLCBuYW1lKTsKKyAgICAqc3RhdHVzID0gQkFEX1ZBTFVFOworICAgIHJldHVybiB7fTsKK30KKyNlbGlmIE1BSk9SX1ZFUlNJT04gPj0gNAorc3RhdGljIGNvbnN0IGNoYXIqIGlkRnJvbUhhbChjb25zdCBjaGFyICpuYW1lLCBzdGF0dXNfdCogc3RhdHVzKSB7CisgICAgKnN0YXR1cyA9IE9LOworICAgIHJldHVybiBuYW1lOworfQorI2VuZGlmCisKK3N0YXR1c190IERldmljZXNGYWN0b3J5SGFsSGlkbDo6b3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpIHsKKyAgICBpZiAobURldmljZUZhY3Rvcmllcy5lbXB0eSgpKSByZXR1cm4gTk9fSU5JVDsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgYXV0byBoaWRsSWQgPSBpZEZyb21IYWwobmFtZSwgJnN0YXR1cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgZm9yIChjb25zdCBhdXRvJiBmYWN0b3J5IDogbURldmljZUZhY3RvcmllcykgeworICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gZmFjdG9yeS0+b3BlbkRldmljZSgKKyAgICAgICAgICAgICAgICBoaWRsSWQsCisgICAgICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJRGV2aWNlPiYgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgKmRldmljZSA9IG5ldyBEZXZpY2VIYWxIaWRsKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCFyZXQuaXNPaygpKSByZXR1cm4gRkFJTEVEX1RSQU5TQUNUSU9OOworICAgICAgICBzd2l0Y2ggKHJldHZhbCkgeworICAgICAgICAgICAgLy8gRGV2aWNlIHdhcyBmb3VuZCBhbmQgd2FzIGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgICAgICAgIGNhc2UgUmVzdWx0OjpPSzogcmV0dXJuIE9LOworICAgICAgICAgICAgLy8gRGV2aWNlIHdhcyBmb3VuZCBidXQgZmFpbGVkIHRvIGluaXRhbGl6ZS4KKyAgICAgICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ6IHJldHVybiBOT19JTklUOworICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGNvbnRpbnVlIGl0ZXJhdGluZy4KKyAgICAgICAgICAgIGRlZmF1bHQ6IDsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVygiVGhlIHNwZWNpZmllZCBkZXZpY2UgbmFtZSBpcyBub3QgcmVjb2duaXplZDogXCIlc1wiIiwgbmFtZSk7CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZTA2NDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSGlkbC5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9ISURMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hJRExfSAorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL0lEZXZpY2VzRmFjdG9yeS5oKQorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklEZXZpY2VzRmFjdG9yeTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsIDogcHVibGljIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlCit7CisgIHB1YmxpYzoKKyAgICAvLyBPcGVucyBhIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gVG8gY2xvc2UgdGhlIGRldmljZSwgaXQgaXMKKyAgICAvLyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSk7CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ7CisKKyAgICBzdGQ6OnZlY3RvcjxzcDxJRGV2aWNlc0ZhY3Rvcnk+PiBtRGV2aWNlRmFjdG9yaWVzOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIERldmljZXNGYWN0b3J5SGFsSGlkbCgpOworCisgICAgdmlydHVhbCB+RGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCkgPSBkZWZhdWx0OworfTsKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMzN2E4YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsSHlicmlkIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaCIKKyNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgiCisjaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK0RldmljZXNGYWN0b3J5SGFsSHlicmlkOjpEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpCisgICAgICAgIDogbUxvY2FsRmFjdG9yeShuZXcgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCgpKSwKKyAgICAgICAgICBtSGlkbEZhY3RvcnkobmV3IERldmljZXNGYWN0b3J5SGFsSGlkbCgpKSB7Cit9CisKK3N0YXR1c190IERldmljZXNGYWN0b3J5SGFsSHlicmlkOjpvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSkgeworICAgIGlmIChtSGlkbEZhY3RvcnkgIT0gMCAmJiBzdHJjbXAoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0EyRFAsIG5hbWUpICE9IDAgJiYKKyAgICAgICAgc3RyY21wKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9IRUFSSU5HX0FJRCwgbmFtZSkgIT0gMCkgeworICAgICAgICByZXR1cm4gbUhpZGxGYWN0b3J5LT5vcGVuRGV2aWNlKG5hbWUsIGRldmljZSk7CisgICAgfQorICAgIHJldHVybiBtTG9jYWxGYWN0b3J5LT5vcGVuRGV2aWNlKG5hbWUsIGRldmljZSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFjMGQwZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSFlCUklEX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hZQlJJRF9ICisKKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKK3sKKyAgcHVibGljOgorICAgIERldmljZXNGYWN0b3J5SGFsSHlicmlkKCk7CisKKyAgICAvLyBPcGVucyBhIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gVG8gY2xvc2UgdGhlIGRldmljZSwgaXQgaXMKKyAgICAvLyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSk7CisKKyAgcHJpdmF0ZToKKyAgICBzcDxEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZT4gbUxvY2FsRmFjdG9yeTsKKyAgICBzcDxEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZT4gbUhpZGxGYWN0b3J5OworfTsKKworc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IGNyZWF0ZURldmljZXNGYWN0b3J5SGFsKCkgeworICAgIHJldHVybiBuZXcgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9IWUJSSURfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY2N2ZmNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCisjaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitzdGF0aWMgc3RhdHVzX3QgbG9hZF9hdWRpb19pbnRlcmZhY2UoY29uc3QgY2hhciAqaWZfbmFtZSwgYXVkaW9faHdfZGV2aWNlX3QgKipkZXYpCit7CisgICAgY29uc3QgaHdfbW9kdWxlX3QgKm1vZDsKKyAgICBpbnQgcmM7CisKKyAgICByYyA9IGh3X2dldF9tb2R1bGVfYnlfY2xhc3MoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCAmbW9kKTsKKyAgICBpZiAocmMpIHsKKyAgICAgICAgQUxPR0UoIiVzIGNvdWxkbid0IGxvYWQgYXVkaW8gaHcgbW9kdWxlICVzLiVzICglcykiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICBBVURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIGlmX25hbWUsIHN0cmVycm9yKC1yYykpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgcmMgPSBhdWRpb19od19kZXZpY2Vfb3Blbihtb2QsIGRldik7CisgICAgaWYgKHJjKSB7CisgICAgICAgIEFMT0dFKCIlcyBjb3VsZG4ndCBvcGVuIGF1ZGlvIGh3IGRldmljZSBpbiAlcy4lcyAoJXMpIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCBzdHJlcnJvcigtcmMpKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIGlmICgoKmRldiktPmNvbW1vbi52ZXJzaW9uIDwgQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OX01JTikgeworICAgICAgICBBTE9HRSgiJXMgd3JvbmcgYXVkaW8gaHcgZGV2aWNlIHZlcnNpb24gJTA0eCIsIF9fZnVuY19fLCAoKmRldiktPmNvbW1vbi52ZXJzaW9uKTsKKyAgICAgICAgcmMgPSBCQURfVkFMVUU7CisgICAgICAgIGF1ZGlvX2h3X2RldmljZV9jbG9zZSgqZGV2KTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIHJldHVybiBPSzsKKworb3V0OgorICAgICpkZXYgPSBOVUxMOworICAgIHJldHVybiByYzsKK30KKworc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbDo6b3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpIHsKKyAgICBhdWRpb19od19kZXZpY2VfdCAqZGV2OworICAgIHN0YXR1c190IHJjID0gbG9hZF9hdWRpb19pbnRlcmZhY2UobmFtZSwgJmRldik7CisgICAgaWYgKHJjID09IE9LKSB7CisgICAgICAgICpkZXZpY2UgPSBuZXcgRGV2aWNlSGFsTG9jYWwoZGV2KTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDEwOGRkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0xPQ0FMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0xPQ0FMX0gKKworI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCA6IHB1YmxpYyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZQoreworICBwdWJsaWM6CisgICAgLy8gT3BlbnMgYSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRvIGNsb3NlIHRoZSBkZXZpY2UsIGl0IGlzCisgICAgLy8gbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpOworCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSHlicmlkOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIERldmljZXNGYWN0b3J5SGFsTG9jYWwoKSB7fQorCisgICAgdmlydHVhbCB+RGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCgpIHt9Cit9OworCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0xPQ0FMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNjc5NzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGF0b21pYz4KKworI2RlZmluZSBMT0dfVEFHICJFZmZlY3RCdWZmZXJIYWxIaWRsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL2FsbG9jYXRvci8xLjAvSUFsbG9jYXRvci5oPgorI2luY2x1ZGUgPGhpZGxtZW1vcnkvbWFwcGluZy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKyNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGlkbDo6YWxsb2NhdG9yOjpWMV8wOjpJQWxsb2NhdG9yOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZWZmZWN0IHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKKy8vIHN0YXRpYwordWludDY0X3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6bWFrZVVuaXF1ZUlkKCkgeworICAgIHN0YXRpYyBzdGQ6OmF0b21pYzx1aW50NjRfdD4gY291bnRlcnsxfTsKKyAgICByZXR1cm4gY291bnRlcisrOworfQorCitzdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjphbGxvY2F0ZSgKKyAgICAgICAgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgeworICAgIHJldHVybiBtaXJyb3IobnVsbHB0ciwgc2l6ZSwgYnVmZmVyKTsKK30KKworc3RhdHVzX3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6bWlycm9yKAorICAgICAgICB2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgeworICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gdGVtcEJ1ZmZlciA9IG5ldyBFZmZlY3RCdWZmZXJIYWxIaWRsKHNpemUpOworICAgIHN0YXR1c190IHJlc3VsdCA9IHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPih0ZW1wQnVmZmVyLmdldCgpKS0+aW5pdCgpOworICAgIGlmIChyZXN1bHQgPT0gT0spIHsKKyAgICAgICAgdGVtcEJ1ZmZlci0+c2V0RXh0ZXJuYWxEYXRhKGV4dGVybmFsKTsKKyAgICAgICAgKmJ1ZmZlciA9IHRlbXBCdWZmZXI7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0VmZmVjdEJ1ZmZlckhhbEhpZGw6OkVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZV90IHNpemUpCisgICAgICAgIDogbUJ1ZmZlclNpemUoc2l6ZSksIG1GcmFtZUNvdW50Q2hhbmdlZChmYWxzZSksCisgICAgICAgICAgbUV4dGVybmFsRGF0YShudWxscHRyKSwgbUF1ZGlvQnVmZmVyezAsIHtudWxscHRyfX0geworICAgIG1IaWRsQnVmZmVyLmlkID0gbWFrZVVuaXF1ZUlkKCk7CisgICAgbUhpZGxCdWZmZXIuZnJhbWVDb3VudCA9IDA7Cit9CisKK0VmZmVjdEJ1ZmZlckhhbEhpZGw6On5FZmZlY3RCdWZmZXJIYWxIaWRsKCkgeworfQorCitzdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjppbml0KCkgeworICAgIHNwPElBbGxvY2F0b3I+IGFzaG1lbSA9IElBbGxvY2F0b3I6OmdldFNlcnZpY2UoImFzaG1lbSIpOworICAgIGlmIChhc2htZW0gPT0gMCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJldHJpZXZlIGFzaG1lbSBhbGxvY2F0b3Igc2VydmljZSIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgc3RhdHVzX3QgcmV0dmFsID0gTk9fTUVNT1JZOworICAgIFJldHVybjx2b2lkPiByZXN1bHQgPSBhc2htZW0tPmFsbG9jYXRlKAorICAgICAgICAgICAgbUJ1ZmZlclNpemUsCisgICAgICAgICAgICBbJl0oYm9vbCBzdWNjZXNzLCBjb25zdCBoaWRsX21lbW9yeSYgbWVtb3J5KSB7CisgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgbUhpZGxCdWZmZXIuZGF0YSA9IG1lbW9yeTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gT0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKHJlc3VsdC5pc09rKCkgJiYgcmV0dmFsID09IE9LKSB7CisgICAgICAgIG1NZW1vcnkgPSBoYXJkd2FyZTo6bWFwTWVtb3J5KG1IaWRsQnVmZmVyLmRhdGEpOworICAgICAgICBpZiAobU1lbW9yeSAhPSAwKSB7CisgICAgICAgICAgICBtTWVtb3J5LT51cGRhdGUoKTsKKyAgICAgICAgICAgIG1BdWRpb0J1ZmZlci5yYXcgPSBzdGF0aWNfY2FzdDx2b2lkKj4obU1lbW9yeS0+Z2V0UG9pbnRlcigpKTsKKyAgICAgICAgICAgIG1lbXNldChtQXVkaW9CdWZmZXIucmF3LCAwLCBtTWVtb3J5LT5nZXRTaXplKCkpOworICAgICAgICAgICAgbU1lbW9yeS0+Y29tbWl0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG1hcCBhbGxvY2F0ZWQgYXNobWVtIik7CisgICAgICAgICAgICByZXR2YWwgPSBOT19NRU1PUlk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZyb20gYXNobWVtIiwgKGludCltQnVmZmVyU2l6ZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQuaXNPaygpID8gcmV0dmFsIDogRkFJTEVEX1RSQU5TQUNUSU9OOworfQorCithdWRpb19idWZmZXJfdCogRWZmZWN0QnVmZmVySGFsSGlkbDo6YXVkaW9CdWZmZXIoKSB7CisgICAgcmV0dXJuICZtQXVkaW9CdWZmZXI7Cit9CisKK3ZvaWQqIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmV4dGVybmFsRGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUV4dGVybmFsRGF0YTsKK30KKwordm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpzZXRGcmFtZUNvdW50KHNpemVfdCBmcmFtZUNvdW50KSB7CisgICAgbUhpZGxCdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisgICAgbUF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgIG1GcmFtZUNvdW50Q2hhbmdlZCA9IHRydWU7Cit9CisKK2Jvb2wgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCkgeworICAgIGJvb2wgcmVzdWx0ID0gbUZyYW1lQ291bnRDaGFuZ2VkOworICAgIG1GcmFtZUNvdW50Q2hhbmdlZCA9IGZhbHNlOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6c2V0RXh0ZXJuYWxEYXRhKHZvaWQqIGV4dGVybmFsKSB7CisgICAgbUV4dGVybmFsRGF0YSA9IGV4dGVybmFsOworfQorCit2b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnVwZGF0ZSgpIHsKKyAgICB1cGRhdGUobUJ1ZmZlclNpemUpOworfQorCit2b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmNvbW1pdCgpIHsKKyAgICBjb21taXQobUJ1ZmZlclNpemUpOworfQorCit2b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnVwZGF0ZShzaXplX3Qgc2l6ZSkgeworICAgIGlmIChtRXh0ZXJuYWxEYXRhID09IG51bGxwdHIpIHJldHVybjsKKyAgICBtTWVtb3J5LT51cGRhdGUoKTsKKyAgICBpZiAoc2l6ZSA+IG1CdWZmZXJTaXplKSBzaXplID0gbUJ1ZmZlclNpemU7CisgICAgbWVtY3B5KG1BdWRpb0J1ZmZlci5yYXcsIG1FeHRlcm5hbERhdGEsIHNpemUpOworICAgIG1NZW1vcnktPmNvbW1pdCgpOworfQorCit2b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmNvbW1pdChzaXplX3Qgc2l6ZSkgeworICAgIGlmIChtRXh0ZXJuYWxEYXRhID09IG51bGxwdHIpIHJldHVybjsKKyAgICBpZiAoc2l6ZSA+IG1CdWZmZXJTaXplKSBzaXplID0gbUJ1ZmZlclNpemU7CisgICAgbWVtY3B5KG1FeHRlcm5hbERhdGEsIG1BdWRpb0J1ZmZlci5yYXcsIHNpemUpOworfQorCit9IC8vIG5hbWVzcGFjZSBlZmZlY3QKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0QnVmZmVySGFsSGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MjY4MTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaApAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9CVUZGRVJfSEFMX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9CVUZGRVJfSEFMX0hJRExfSAorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0L0ZJTEVfVkVSU0lPTi90eXBlcy5oKQorI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tZW1vcnkvMS4wL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgorCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyBhbmRyb2lkOjpoaWRsOjptZW1vcnk6OlYxXzA6OklNZW1vcnk7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBlZmZlY3QgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OkNQUF9WRVJTSU9OOworCitjbGFzcyBFZmZlY3RCdWZmZXJIYWxIaWRsIDogcHVibGljIEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZQoreworICBwdWJsaWM6CisgICAgc3RhdGljIHN0YXR1c190IGFsbG9jYXRlKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpOworICAgIHN0YXRpYyBzdGF0dXNfdCBtaXJyb3Iodm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpOworCisgICAgdmlydHVhbCBhdWRpb19idWZmZXJfdCogYXVkaW9CdWZmZXIoKTsKKyAgICB2aXJ0dWFsIHZvaWQqIGV4dGVybmFsRGF0YSgpIGNvbnN0OworCisgICAgdmlydHVhbCBzaXplX3QgZ2V0U2l6ZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1CdWZmZXJTaXplOyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0RXh0ZXJuYWxEYXRhKHZvaWQqIGV4dGVybmFsKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0RnJhbWVDb3VudChzaXplX3QgZnJhbWVDb3VudCk7CisgICAgdmlydHVhbCBib29sIGNoZWNrRnJhbWVDb3VudENoYW5nZSgpOworCisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZSgpOworICAgIHZpcnR1YWwgdm9pZCBjb21taXQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlKHNpemVfdCBzaXplKTsKKyAgICB2aXJ0dWFsIHZvaWQgY29tbWl0KHNpemVfdCBzaXplKTsKKworICAgIGNvbnN0IEF1ZGlvQnVmZmVyJiBoaWRsQnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbUhpZGxCdWZmZXI7IH0KKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U7CisKKyAgICBzdGF0aWMgdWludDY0X3QgbWFrZVVuaXF1ZUlkKCk7CisKKyAgICBjb25zdCBzaXplX3QgbUJ1ZmZlclNpemU7CisgICAgYm9vbCBtRnJhbWVDb3VudENoYW5nZWQ7CisgICAgdm9pZCogbUV4dGVybmFsRGF0YTsKKyAgICBBdWRpb0J1ZmZlciBtSGlkbEJ1ZmZlcjsKKyAgICBzcDxJTWVtb3J5PiBtTWVtb3J5OworICAgIGF1ZGlvX2J1ZmZlcl90IG1BdWRpb0J1ZmZlcjsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBleHBsaWNpdCBFZmZlY3RCdWZmZXJIYWxIaWRsKHNpemVfdCBzaXplKTsKKworICAgIHZpcnR1YWwgfkVmZmVjdEJ1ZmZlckhhbEhpZGwoKTsKKworICAgIHN0YXR1c190IGluaXQoKTsKK307CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBlZmZlY3QKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0JVRkZFUl9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RIYWxIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDU5N2IzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RIYWxIaWRsLmNwcApAQCAtMCwwICsxLDMzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0SGFsSGlkbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGNvbW1vbi9hbGwtdmVyc2lvbnMvVmVyc2lvblV0aWxzLmg+CisjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRWZmZWN0QnVmZmVySGFsSGlkbC5oIgorI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKKyNpbmNsdWRlICJIaWRsVXRpbHMuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT046OmltcGxlbWVudGF0aW9uOjpIaWRsVXRpbHM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjp1dGlsczo6RW51bUJpdGZpZWxkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZWZmZWN0IHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpDUFBfVkVSU0lPTjsKKworRWZmZWN0SGFsSGlkbDo6RWZmZWN0SGFsSGlkbChjb25zdCBzcDxJRWZmZWN0PiYgZWZmZWN0LCB1aW50NjRfdCBlZmZlY3RJZCkKKyAgICAgICAgOiBtRWZmZWN0KGVmZmVjdCksIG1FZmZlY3RJZChlZmZlY3RJZCksIG1CdWZmZXJzQ2hhbmdlZCh0cnVlKSwgbUVmR3JvdXAobnVsbHB0cikgeworfQorCitFZmZlY3RIYWxIaWRsOjp+RWZmZWN0SGFsSGlkbCgpIHsKKyAgICBpZiAobUVmZmVjdCAhPSAwKSB7CisgICAgICAgIGNsb3NlKCk7CisgICAgICAgIG1FZmZlY3QuY2xlYXIoKTsKKyAgICAgICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKyAgICB9CisgICAgaWYgKG1FZkdyb3VwKSB7CisgICAgICAgIEV2ZW50RmxhZzo6ZGVsZXRlRXZlbnRGbGFnKCZtRWZHcm91cCk7CisgICAgfQorfQorCisvLyBzdGF0aWMKK3ZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0RGVzY3JpcHRvclRvSGFsKAorICAgICAgICBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiBkZXNjcmlwdG9yLCBlZmZlY3RfZGVzY3JpcHRvcl90KiBoYWxEZXNjcmlwdG9yKSB7CisgICAgSGlkbFV0aWxzOjp1dWlkVG9IYWwoZGVzY3JpcHRvci50eXBlLCAmaGFsRGVzY3JpcHRvci0+dHlwZSk7CisgICAgSGlkbFV0aWxzOjp1dWlkVG9IYWwoZGVzY3JpcHRvci51dWlkLCAmaGFsRGVzY3JpcHRvci0+dXVpZCk7CisgICAgaGFsRGVzY3JpcHRvci0+ZmxhZ3MgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZGVzY3JpcHRvci5mbGFncyk7CisgICAgaGFsRGVzY3JpcHRvci0+Y3B1TG9hZCA9IGRlc2NyaXB0b3IuY3B1TG9hZDsKKyAgICBoYWxEZXNjcmlwdG9yLT5tZW1vcnlVc2FnZSA9IGRlc2NyaXB0b3IubWVtb3J5VXNhZ2U7CisgICAgbWVtY3B5KGhhbERlc2NyaXB0b3ItPm5hbWUsIGRlc2NyaXB0b3IubmFtZS5kYXRhKCksIGRlc2NyaXB0b3IubmFtZS5zaXplKCkpOworICAgIG1lbWNweShoYWxEZXNjcmlwdG9yLT5pbXBsZW1lbnRvciwKKyAgICAgICAgICAgIGRlc2NyaXB0b3IuaW1wbGVtZW50b3IuZGF0YSgpLCBkZXNjcmlwdG9yLmltcGxlbWVudG9yLnNpemUoKSk7Cit9CisKKy8vIFRPRE8obW5hZ2Fub3YpOiBUaGVzZSBidWZmZXIgY29udmVyc2lvbiBmdW5jdGlvbnMgc2hvdWxkIGJlIHNoYXJlZCB3aXRoIEVmZmVjdCB3cmFwcGVyCisvLyB2aWEgSGlkbFV0aWxzLiBNb3ZlIHRoZW0gdGhlcmUgd2hlbiBoYXJkd2FyZS9pbnRlcmZhY2VzIHdpbGwgZ2V0IHVuLWZyb3plbiBhZ2Fpbi4KKworLy8gc3RhdGljCit2b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdEJ1ZmZlckNvbmZpZ0Zyb21IYWwoCisgICAgICAgIGNvbnN0IGJ1ZmZlcl9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RCdWZmZXJDb25maWcqIGNvbmZpZykgeworICAgIGNvbmZpZy0+c2FtcGxpbmdSYXRlSHogPSBoYWxDb25maWcuc2FtcGxpbmdSYXRlOworICAgIGNvbmZpZy0+Y2hhbm5lbHMgPSBFbnVtQml0ZmllbGQ8QXVkaW9DaGFubmVsTWFzaz4oaGFsQ29uZmlnLmNoYW5uZWxzKTsKKyAgICBjb25maWctPmZvcm1hdCA9IEF1ZGlvRm9ybWF0KGhhbENvbmZpZy5mb3JtYXQpOworICAgIGNvbmZpZy0+YWNjZXNzTW9kZSA9IEVmZmVjdEJ1ZmZlckFjY2VzcyhoYWxDb25maWcuYWNjZXNzTW9kZSk7CisgICAgY29uZmlnLT5tYXNrID0gRW51bUJpdGZpZWxkPEVmZmVjdENvbmZpZ1BhcmFtZXRlcnM+KGhhbENvbmZpZy5tYXNrKTsKK30KKworLy8gc3RhdGljCit2b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdEJ1ZmZlckNvbmZpZ1RvSGFsKAorICAgICAgICBjb25zdCBFZmZlY3RCdWZmZXJDb25maWcmIGNvbmZpZywgYnVmZmVyX2NvbmZpZ190KiBoYWxDb25maWcpIHsKKyAgICBoYWxDb25maWctPmJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKKyAgICBoYWxDb25maWctPmJ1ZmZlci5yYXcgPSBOVUxMOworICAgIGhhbENvbmZpZy0+c2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsaW5nUmF0ZUh6OworICAgIGhhbENvbmZpZy0+Y2hhbm5lbHMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oY29uZmlnLmNoYW5uZWxzKTsKKyAgICBoYWxDb25maWctPmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IE5VTEw7CisgICAgaGFsQ29uZmlnLT5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOworICAgIGhhbENvbmZpZy0+YnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CisgICAgaGFsQ29uZmlnLT5mb3JtYXQgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihjb25maWcuZm9ybWF0KTsKKyAgICBoYWxDb25maWctPmFjY2Vzc01vZGUgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihjb25maWcuYWNjZXNzTW9kZSk7CisgICAgaGFsQ29uZmlnLT5tYXNrID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLm1hc2spOworfQorCisvLyBzdGF0aWMKK3ZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0Q29uZmlnRnJvbUhhbChjb25zdCBlZmZlY3RfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0Q29uZmlnKiBjb25maWcpIHsKKyAgICBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKGhhbENvbmZpZy5pbnB1dENmZywgJmNvbmZpZy0+aW5wdXRDZmcpOworICAgIGVmZmVjdEJ1ZmZlckNvbmZpZ0Zyb21IYWwoaGFsQ29uZmlnLm91dHB1dENmZywgJmNvbmZpZy0+b3V0cHV0Q2ZnKTsKK30KKworLy8gc3RhdGljCit2b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdENvbmZpZ1RvSGFsKGNvbnN0IEVmZmVjdENvbmZpZyYgY29uZmlnLCBlZmZlY3RfY29uZmlnX3QqIGhhbENvbmZpZykgeworICAgIGVmZmVjdEJ1ZmZlckNvbmZpZ1RvSGFsKGNvbmZpZy5pbnB1dENmZywgJmhhbENvbmZpZy0+aW5wdXRDZmcpOworICAgIGVmZmVjdEJ1ZmZlckNvbmZpZ1RvSGFsKGNvbmZpZy5vdXRwdXRDZmcsICZoYWxDb25maWctPm91dHB1dENmZyk7Cit9CisKKy8vIHN0YXRpYworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6YW5hbHl6ZVJlc3VsdChjb25zdCBSZXN1bHQmIHJlc3VsdCkgeworICAgIHN3aXRjaCAocmVzdWx0KSB7CisgICAgICAgIGNhc2UgUmVzdWx0OjpPSzogcmV0dXJuIE9LOworICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFM6IHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX1NUQVRFOiByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOiByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9TVVBQT1JURUQ6IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgY2FzZSBSZXN1bHQ6OlJFU1VMVF9UT09fQklHOiByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gTk9fSU5JVDsKKyAgICB9Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldEluQnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcikgeworICAgIGlmICghbUJ1ZmZlcnNDaGFuZ2VkKSB7CisgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gbnVsbHB0ciB8fCBtSW5CdWZmZXIuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gYnVmZmVyLmdldCgpICE9IG1JbkJ1ZmZlci5nZXQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci0+YXVkaW9CdWZmZXIoKSAhPSBtSW5CdWZmZXItPmF1ZGlvQnVmZmVyKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbUluQnVmZmVyID0gYnVmZmVyOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0T3V0QnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcikgeworICAgIGlmICghbUJ1ZmZlcnNDaGFuZ2VkKSB7CisgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gbnVsbHB0ciB8fCBtT3V0QnVmZmVyLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci5nZXQoKSAhPSBtT3V0QnVmZmVyLmdldCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gYnVmZmVyLT5hdWRpb0J1ZmZlcigpICE9IG1PdXRCdWZmZXItPmF1ZGlvQnVmZmVyKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbU91dEJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByb2Nlc3MoKSB7CisgICAgcmV0dXJuIHByb2Nlc3NJbXBsKHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6UkVRVUVTVF9QUk9DRVNTKSk7Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByb2Nlc3NSZXZlcnNlKCkgeworICAgIHJldHVybiBwcm9jZXNzSW1wbChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OlJFUVVFU1RfUFJPQ0VTU19SRVZFUlNFKSk7Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByZXBhcmVGb3JQcm9jZXNzaW5nKCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gdGVtcFN0YXR1c01ROworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3QtPnByZXBhcmVGb3JQcm9jZXNzaW5nKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBNUURlc2NyaXB0b3JTeW5jPFJlc3VsdD4mIHN0YXR1c01RKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcFN0YXR1c01RLnJlc2V0KG5ldyBTdGF0dXNNUShzdGF0dXNNUSkpOworICAgICAgICAgICAgICAgICAgICBpZiAodGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgJiYgdGVtcFN0YXR1c01RLT5nZXRFdmVudEZsYWdXb3JkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50RmxhZzo6Y3JlYXRlRXZlbnRGbGFnKHRlbXBTdGF0dXNNUS0+Z2V0RXZlbnRGbGFnV29yZCgpLCAmbUVmR3JvdXApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCFyZXQuaXNPaygpIHx8IHJldHZhbCAhPSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXR2YWwpIDogRkFJTEVEX1RSQU5TQUNUSU9OOworICAgIH0KKyAgICBpZiAoIXRlbXBTdGF0dXNNUSB8fCAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgfHwgIW1FZkdyb3VwKSB7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciBlZmZlY3RzIik7CisgICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCisgICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciBlZmZlY3RzIGlzIGludmFsaWQiKTsKKyAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3IgZWZmZWN0cyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIG1TdGF0dXNNUSA9IHN0ZDo6bW92ZSh0ZW1wU3RhdHVzTVEpOworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBFZmZlY3RIYWxIaWRsOjpuZWVkVG9SZXNldEJ1ZmZlcnMoKSB7CisgICAgaWYgKG1CdWZmZXJzQ2hhbmdlZCkgcmV0dXJuIHRydWU7CisgICAgYm9vbCBpbkJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkID0gbUluQnVmZmVyLT5jaGVja0ZyYW1lQ291bnRDaGFuZ2UoKTsKKyAgICBib29sIG91dEJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkID0gbU91dEJ1ZmZlci0+Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7CisgICAgcmV0dXJuIGluQnVmZmVyRnJhbWVDb3VudFVwZGF0ZWQgfHwgb3V0QnVmZmVyRnJhbWVDb3VudFVwZGF0ZWQ7Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByb2Nlc3NJbXBsKHVpbnQzMl90IG1xRmxhZykgeworICAgIGlmIChtRWZmZWN0ID09IDAgfHwgbUluQnVmZmVyID09IDAgfHwgbU91dEJ1ZmZlciA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKCFtU3RhdHVzTVEgJiYgKHN0YXR1cyA9IHByZXBhcmVGb3JQcm9jZXNzaW5nKCkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGlmIChuZWVkVG9SZXNldEJ1ZmZlcnMoKSAmJiAoc3RhdHVzID0gc2V0UHJvY2Vzc0J1ZmZlcnMoKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgLy8gVGhlIGRhdGEgaXMgYWxyZWFkeSBpbiB0aGUgYnVmZmVycywganVzdCBuZWVkIHRvIGZsdXNoIGl0IGFuZCB3YWtlIHVwIHRoZSBzZXJ2ZXIgc2lkZS4KKyAgICBzdGQ6OmF0b21pY190aHJlYWRfZmVuY2Uoc3RkOjptZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisgICAgbUVmR3JvdXAtPndha2UobXFGbGFnKTsKKyAgICB1aW50MzJfdCBlZlN0YXRlID0gMDsKK3JldHJ5OgorICAgIHN0YXR1c190IHJldCA9IG1FZkdyb3VwLT53YWl0KAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpET05FX1BST0NFU1NJTkcpLCAmZWZTdGF0ZSk7CisgICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OkRPTkVfUFJPQ0VTU0lORykpIHsKKyAgICAgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgICAgICBtU3RhdHVzTVEtPnJlYWQoJnJldHZhbCk7CisgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSyB8fCByZXR2YWwgPT0gUmVzdWx0OjpJTlZBTElEX1NUQVRFKSB7CisgICAgICAgICAgICAvLyBTeW5jIGJhY2sgdGhlIGNoYW5nZWQgY29udGVudHMgb2YgdGhlIGJ1ZmZlci4KKyAgICAgICAgICAgIHN0ZDo6YXRvbWljX3RocmVhZF9mZW5jZShzdGQ6Om1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5hbHl6ZVJlc3VsdChyZXR2YWwpOworICAgIH0KKyAgICBpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FSU5UUikgeworICAgICAgICAvLyBTcHVyaW91cyB3YWtldXAuIFRoaXMgbm9ybWFsbHkgcmV0cmllcyBubyBtb3JlIHRoYW4gb25jZS4KKyAgICAgICAgZ290byByZXRyeTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0UHJvY2Vzc0J1ZmZlcnMoKSB7CisgICAgUmV0dXJuPFJlc3VsdD4gcmV0ID0gbUVmZmVjdC0+c2V0UHJvY2Vzc0J1ZmZlcnMoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RCdWZmZXJIYWxIaWRsKj4obUluQnVmZmVyLmdldCgpKS0+aGlkbEJ1ZmZlcigpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KG1PdXRCdWZmZXIuZ2V0KCkpLT5oaWRsQnVmZmVyKCkpOworICAgIGlmIChyZXQuaXNPaygpICYmIHJldCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGZhbHNlOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpjb21tYW5kKHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLAorICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7CisgICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisKKyAgICAvLyBTcGVjaWFsIGNhc2VzLgorICAgIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfU0VUX0NPTkZJRyB8fCBjbWRDb2RlID09IEVGRkVDVF9DTURfU0VUX0NPTkZJR19SRVZFUlNFKSB7CisgICAgICAgIHJldHVybiBzZXRDb25maWdJbXBsKGNtZENvZGUsIGNtZFNpemUsIHBDbWREYXRhLCByZXBseVNpemUsIHBSZXBseURhdGEpOworICAgIH0gZWxzZSBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0dFVF9DT05GSUcgfHwgY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0dFVF9DT05GSUdfUkVWRVJTRSkgeworICAgICAgICByZXR1cm4gZ2V0Q29uZmlnSW1wbChjbWRDb2RlLCByZXBseVNpemUsIHBSZXBseURhdGEpOworICAgIH0KKworICAgIC8vIENvbW1vbiBjYXNlLgorICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IGhpZGxEYXRhOworICAgIGlmIChwQ21kRGF0YSAhPSBudWxscHRyICYmIGNtZFNpemUgPiAwKSB7CisgICAgICAgIGhpZGxEYXRhLnNldFRvRXh0ZXJuYWwocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4ocENtZERhdGEpLCBjbWRTaXplKTsKKyAgICB9CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIHVpbnQzMl90IHJlcGx5U2l6ZVN0dWIgPSAwOworICAgIGlmIChyZXBseVNpemUgPT0gbnVsbHB0ciB8fCBwUmVwbHlEYXRhID09IG51bGxwdHIpIHJlcGx5U2l6ZSA9ICZyZXBseVNpemVTdHViOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5jb21tYW5kKGNtZENvZGUsIGhpZGxEYXRhLCAqcmVwbHlTaXplLAorICAgICAgICAgICAgWyZdKGludDMyX3QgcywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgqcmVwbHlTaXplID4gcmVzdWx0LnNpemUoKSkgKnJlcGx5U2l6ZSA9IHJlc3VsdC5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhICE9IG51bGxwdHIgJiYgKnJlcGx5U2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShwUmVwbHlEYXRhLCAmcmVzdWx0WzBdLCAqcmVwbHlTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiByZXQuaXNPaygpID8gc3RhdHVzIDogRkFJTEVEX1RSQU5TQUNUSU9OOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpnZXREZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CisgICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5nZXREZXNjcmlwdG9yKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBlZmZlY3REZXNjcmlwdG9yVG9IYWwocmVzdWx0LCBwRGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldHZhbCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OmNsb3NlKCkgeworICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOworICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IG1FZmZlY3QtPmNsb3NlKCk7CisgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OmdldENvbmZpZ0ltcGwoCisgICAgICAgIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKKyAgICBpZiAocmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSB8fCBwUmVwbHlEYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gRkFJTEVEX1RSQU5TQUNUSU9OOworICAgIFJldHVybjx2b2lkPiByZXQ7CisgICAgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHKSB7CisgICAgICAgIHJldCA9IG1FZmZlY3QtPmdldENvbmZpZyhbJl0gKFJlc3VsdCByLCBjb25zdCBFZmZlY3RDb25maWcgJmhpZGxDb25maWcpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGFuYWx5emVSZXN1bHQocik7CisgICAgICAgICAgICBpZiAociA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgZWZmZWN0Q29uZmlnVG9IYWwoaGlkbENvbmZpZywgc3RhdGljX2Nhc3Q8ZWZmZWN0X2NvbmZpZ190Kj4ocFJlcGx5RGF0YSkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBtRWZmZWN0LT5nZXRDb25maWdSZXZlcnNlKFsmXSAoUmVzdWx0IHIsIGNvbnN0IEVmZmVjdENvbmZpZyAmaGlkbENvbmZpZykgeworICAgICAgICAgICAgcmVzdWx0ID0gYW5hbHl6ZVJlc3VsdChyKTsKKyAgICAgICAgICAgIGlmIChyID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICBlZmZlY3RDb25maWdUb0hhbChoaWRsQ29uZmlnLCBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwUmVwbHlEYXRhKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgcmVzdWx0ID0gRkFJTEVEX1RSQU5TQUNUSU9OOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRDb25maWdJbXBsKAorICAgICAgICB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgeworICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkgfHwKKyAgICAgICAgICAgIHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludDMyX3QpIHx8IHBSZXBseURhdGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBjb25zdCBlZmZlY3RfY29uZmlnX3QgKmhhbENvbmZpZyA9IHN0YXRpY19jYXN0PGVmZmVjdF9jb25maWdfdCo+KHBDbWREYXRhKTsKKyAgICBpZiAoaGFsQ29uZmlnLT5pbnB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgIT0gTlVMTCB8fAorICAgICAgICAgICAgaGFsQ29uZmlnLT5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyICE9IE5VTEwgfHwKKyAgICAgICAgICAgIGhhbENvbmZpZy0+b3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciAhPSBOVUxMIHx8CisgICAgICAgICAgICBoYWxDb25maWctPm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkJ1ZmZlciBwcm92aWRlciBjYWxsYmFja3MgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICB9CisgICAgRWZmZWN0Q29uZmlnIGhpZGxDb25maWc7CisgICAgZWZmZWN0Q29uZmlnRnJvbUhhbCgqaGFsQ29uZmlnLCAmaGlkbENvbmZpZyk7CisgICAgUmV0dXJuPFJlc3VsdD4gcmV0ID0gY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgPworICAgICAgICAgICAgbUVmZmVjdC0+c2V0Q29uZmlnKGhpZGxDb25maWcsIG51bGxwdHIsIG51bGxwdHIpIDoKKyAgICAgICAgICAgIG1FZmZlY3QtPnNldENvbmZpZ1JldmVyc2UoaGlkbENvbmZpZywgbnVsbHB0ciwgbnVsbHB0cik7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gRkFJTEVEX1RSQU5TQUNUSU9OOworICAgIGlmIChyZXQuaXNPaygpKSB7CisgICAgICAgIHJlc3VsdCA9IGFuYWx5emVSZXN1bHQocmV0KTsKKyAgICAgICAgKnN0YXRpY19jYXN0PGludDMyX3QqPihwUmVwbHlEYXRhKSA9IHJlc3VsdDsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGVmZmVjdAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDlmNzA3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RIYWxIaWRsLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0hBTF9ISURMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfSEFMX0hJRExfSAorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0L0ZJTEVfVkVSU0lPTi9JRWZmZWN0LmgpCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8Zm1xL0V2ZW50RmxhZy5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OkV2ZW50RmxhZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGVmZmVjdCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6Q1BQX1ZFUlNJT047CisKK2NsYXNzIEVmZmVjdEhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0SGFsSW50ZXJmYWNlCit7CisgIHB1YmxpYzoKKyAgICAvLyBTZXQgdGhlIGlucHV0IGJ1ZmZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEluQnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcik7CisKKyAgICAvLyBTZXQgdGhlIG91dHB1dCBidWZmZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRCdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKTsKKworICAgIC8vIEVmZmVjdCBwcm9jZXNzIGZ1bmN0aW9uLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2VzcygpOworCisgICAgLy8gUHJvY2VzcyByZXZlcnNlIHN0cmVhbSBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHBhc3MKKyAgICAvLyBhIHJlZmVyZW5jZSBzdHJlYW0gdG8gdGhlIGVmZmVjdCBlbmdpbmUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBwcm9jZXNzUmV2ZXJzZSgpOworCisgICAgLy8gU2VuZCBhIGNvbW1hbmQgYW5kIHJlY2VpdmUgYSByZXNwb25zZSB0by9mcm9tIGVmZmVjdCBlbmdpbmUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb21tYW5kKHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLAorICAgICAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBlZmZlY3QgZGVzY3JpcHRvci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOworCisgICAgLy8gRnJlZSByZXNvdXJjZXMgb24gdGhlIHJlbW90ZSBzaWRlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2UoKTsKKworICAgIC8vIFdoZXRoZXIgaXQncyBhIGxvY2FsIGltcGxlbWVudGF0aW9uLgorICAgIHZpcnR1YWwgYm9vbCBpc0xvY2FsKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAgIHVpbnQ2NF90IGVmZmVjdElkKCkgY29uc3QgeyByZXR1cm4gbUVmZmVjdElkOyB9CisKKyAgICBzdGF0aWMgdm9pZCBlZmZlY3REZXNjcmlwdG9yVG9IYWwoCisgICAgICAgICAgICBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiBkZXNjcmlwdG9yLCBlZmZlY3RfZGVzY3JpcHRvcl90KiBoYWxEZXNjcmlwdG9yKTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBFZmZlY3RzRmFjdG9yeUhhbEhpZGw7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8UmVzdWx0LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7CisKKyAgICBzcDxJRWZmZWN0PiBtRWZmZWN0OworICAgIGNvbnN0IHVpbnQ2NF90IG1FZmZlY3RJZDsKKyAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IG1JbkJ1ZmZlcjsKKyAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IG1PdXRCdWZmZXI7CisgICAgYm9vbCBtQnVmZmVyc0NoYW5nZWQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7CisgICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBhbmFseXplUmVzdWx0KGNvbnN0IFJlc3VsdCYgcmVzdWx0KTsKKyAgICBzdGF0aWMgdm9pZCBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKAorICAgICAgICAgICAgY29uc3QgYnVmZmVyX2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdEJ1ZmZlckNvbmZpZyogY29uZmlnKTsKKyAgICBzdGF0aWMgdm9pZCBlZmZlY3RCdWZmZXJDb25maWdUb0hhbCgKKyAgICAgICAgICAgIGNvbnN0IEVmZmVjdEJ1ZmZlckNvbmZpZyYgY29uZmlnLCBidWZmZXJfY29uZmlnX3QqIGhhbENvbmZpZyk7CisgICAgc3RhdGljIHZvaWQgZWZmZWN0Q29uZmlnRnJvbUhhbChjb25zdCBlZmZlY3RfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0Q29uZmlnKiBjb25maWcpOworICAgIHN0YXRpYyB2b2lkIGVmZmVjdENvbmZpZ1RvSGFsKGNvbnN0IEVmZmVjdENvbmZpZyYgY29uZmlnLCBlZmZlY3RfY29uZmlnX3QqIGhhbENvbmZpZyk7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgRWZmZWN0SGFsSGlkbChjb25zdCBzcDxJRWZmZWN0PiYgZWZmZWN0LCB1aW50NjRfdCBlZmZlY3RJZCk7CisKKyAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IHJlbGVhc2VzIHRoZSBlZmZlY3QuCisgICAgdmlydHVhbCB+RWZmZWN0SGFsSGlkbCgpOworCisgICAgc3RhdHVzX3QgZ2V0Q29uZmlnSW1wbCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKTsKKyAgICBzdGF0dXNfdCBwcmVwYXJlRm9yUHJvY2Vzc2luZygpOworICAgIGJvb2wgbmVlZFRvUmVzZXRCdWZmZXJzKCk7CisgICAgc3RhdHVzX3QgcHJvY2Vzc0ltcGwodWludDMyX3QgbXFGbGFnKTsKKyAgICBzdGF0dXNfdCBzZXRDb25maWdJbXBsKAorICAgICAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsCisgICAgICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKTsKKyAgICBzdGF0dXNfdCBzZXRQcm9jZXNzQnVmZmVycygpOworfTsKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGVmZmVjdAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZDZiZGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisKKyNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeUhhbEhpZGwuaCIKKyNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKKyNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCisjaW5jbHVkZSAiSGlkbFV0aWxzLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOjppbXBsZW1lbnRhdGlvbjo6SGlkbFV0aWxzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZWZmZWN0IHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpDUFBfVkVSU0lPTjsKKworRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpFZmZlY3RzRmFjdG9yeUhhbEhpZGwoKSA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJFZmZlY3RzRmFjdG9yeSIpIHsKKyAgICBtRWZmZWN0c0ZhY3RvcnkgPSBJRWZmZWN0c0ZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKKyAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvYnRhaW4gSUVmZmVjdHNGYWN0b3J5IHNlcnZpY2UsIHRlcm1pbmF0aW5nIHByb2Nlc3MuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OnF1ZXJ5QWxsRGVzY3JpcHRvcnMoKSB7CisgICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+Z2V0QWxsRGVzY3JpcHRvcnMoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPEVmZmVjdERlc2NyaXB0b3I+JiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBtTGFzdERlc2NyaXB0b3JzID0gcmVzdWx0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmIChyZXQuaXNPaygpKSB7CisgICAgICAgIHJldHVybiByZXR2YWwgPT0gUmVzdWx0OjpPSyA/IE9LIDogTk9fSU5JVDsKKyAgICB9CisgICAgbUxhc3REZXNjcmlwdG9ycy5yZXNpemUoMCk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OnF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqcE51bUVmZmVjdHMpIHsKKyAgICBzdGF0dXNfdCBxdWVyeVJlc3VsdCA9IHF1ZXJ5QWxsRGVzY3JpcHRvcnMoKTsKKyAgICBpZiAocXVlcnlSZXN1bHQgPT0gT0spIHsKKyAgICAgICAgKnBOdW1FZmZlY3RzID0gbUxhc3REZXNjcmlwdG9ycy5zaXplKCk7CisgICAgfQorICAgIHJldHVybiBxdWVyeVJlc3VsdDsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpnZXREZXNjcmlwdG9yKAorICAgICAgICB1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKKyAgICAvLyBUT0RPOiBXZSBuZWVkIHNvbWVob3cgdG8gdHJhY2sgdGhlIGNoYW5nZXMgb24gdGhlIHNlcnZlciBzaWRlCisgICAgLy8gb3IgZmlndXJlIG91dCBob3cgdG8gY29udmVydCBldmVyeWJvZHkgdG8gcXVlcnkgYWxsIHRoZSBkZXNjcmlwdG9ycyBhdCBvbmNlLgorICAgIC8vIFRPRE86IGNoZWNrIGZvciBudWxscHRyCisgICAgaWYgKG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgc3RhdHVzX3QgcXVlcnlSZXN1bHQgPSBxdWVyeUFsbERlc2NyaXB0b3JzKCk7CisgICAgICAgIGlmIChxdWVyeVJlc3VsdCAhPSBPSykgcmV0dXJuIHF1ZXJ5UmVzdWx0OworICAgIH0KKyAgICBpZiAoaW5kZXggPj0gbUxhc3REZXNjcmlwdG9ycy5zaXplKCkpIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwobUxhc3REZXNjcmlwdG9yc1tpbmRleF0sIHBEZXNjcmlwdG9yKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcigKKyAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CisgICAgLy8gVE9ETzogY2hlY2sgZm9yIG51bGxwdHIKKyAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOworICAgIFV1aWQgaGlkbFV1aWQ7CisgICAgSGlkbFV0aWxzOjp1dWlkRnJvbUhhbCgqcEVmZmVjdFV1aWQsICZoaWRsVXVpZCk7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmdldERlc2NyaXB0b3IoaGlkbFV1aWQsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbChyZXN1bHQsIHBEZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAocmV0LmlzT2soKSkgeworICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHJldHVybiBPSzsKKyAgICAgICAgZWxzZSBpZiAocmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFMpIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICAgICAgZWxzZSByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmNyZWF0ZUVmZmVjdCgKKyAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsCisgICAgICAgIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gKmVmZmVjdCkgeworICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgVXVpZCBoaWRsVXVpZDsKKyAgICBIaWRsVXRpbHM6OnV1aWRGcm9tSGFsKCpwRWZmZWN0VXVpZCwgJmhpZGxVdWlkKTsKKyAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+Y3JlYXRlRWZmZWN0KAorICAgICAgICAgICAgaGlkbFV1aWQsIHNlc3Npb25JZCwgaW9JZCwKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SUVmZmVjdD4mIHJlc3VsdCwgdWludDY0X3QgZWZmZWN0SWQpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqZWZmZWN0ID0gbmV3IEVmZmVjdEhhbEhpZGwocmVzdWx0LCBlZmZlY3RJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKHJldC5pc09rKCkpIHsKKyAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7CisgICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgICAgIGVsc2UgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpkdW1wRWZmZWN0cyhpbnQgZmQpIHsKKyAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOworICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOworICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5kZWJ1ZyhoaWRsSGFuZGxlLCB7fSAvKiBvcHRpb25zICovKTsKKyAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Cit9CisKK3N0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6YWxsb2NhdGVCdWZmZXIoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgeworICAgIHJldHVybiBFZmZlY3RCdWZmZXJIYWxIaWRsOjphbGxvY2F0ZShzaXplLCBidWZmZXIpOworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6Om1pcnJvckJ1ZmZlcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgeworICAgIHJldHVybiBFZmZlY3RCdWZmZXJIYWxIaWRsOjptaXJyb3IoZXh0ZXJuYWwsIHNpemUsIGJ1ZmZlcik7Cit9CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBlZmZlY3QKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMTc4ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9ISURMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfSAorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0L0ZJTEVfVkVSU0lPTi9JRWZmZWN0c0ZhY3RvcnkuaCkKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvRklMRV9WRVJTSU9OL3R5cGVzLmgpCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBlZmZlY3QgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OkNQUF9WRVJTSU9OOjpDb252ZXJzaW9uSGVscGVySGlkbDsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpDUFBfVkVSU0lPTjsKKworY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsIDogcHVibGljIEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKK3sKKyAgcHVibGljOgorICAgIEVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpOworCisgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRpZmZlcmVudCBlZmZlY3RzIGluIGFsbCBsb2FkZWQgbGlicmFyaWVzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpwTnVtRWZmZWN0cyk7CisKKyAgICAvLyBSZXR1cm5zIGEgZGVzY3JpcHRvciBvZiB0aGUgbmV4dCBhdmFpbGFibGUgZWZmZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGVzY3JpcHRvcih1aW50MzJfdCBpbmRleCwKKyAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwKKyAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKKworICAgIC8vIENyZWF0ZXMgYW4gZWZmZWN0IGVuZ2luZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCisgICAgLy8gVG8gcmVsZWFzZSB0aGUgZWZmZWN0IGVuZ2luZSwgaXQgaXMgbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcworICAgIC8vIHRvIHRoZSByZXR1cm5lZCBlZmZlY3Qgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlRWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLAorICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QgaW9JZCwKKyAgICAgICAgICAgIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gKmVmZmVjdCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBFZmZlY3RzKGludCBmZCk7CisKKyAgICBzdGF0dXNfdCBhbGxvY2F0ZUJ1ZmZlcihzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBtaXJyb3JCdWZmZXIodm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIG92ZXJyaWRlOworCisgIHByaXZhdGU6CisgICAgc3A8SUVmZmVjdHNGYWN0b3J5PiBtRWZmZWN0c0ZhY3Rvcnk7CisgICAgaGlkbF92ZWM8RWZmZWN0RGVzY3JpcHRvcj4gbUxhc3REZXNjcmlwdG9yczsKKworICAgIHN0YXR1c190IHF1ZXJ5QWxsRGVzY3JpcHRvcnMoKTsKK307CisKK3NwPEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlPiBjcmVhdGVFZmZlY3RzRmFjdG9yeUhhbCgpIHsKKyAgICByZXR1cm4gbmV3IEVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgZWZmZWN0Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTJiMzYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxIaWRsLmNwcApAQCAtMCwwICsxLDg1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiU3RyZWFtSGFsSGlkbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JU3RyZWFtT3V0Q2FsbGJhY2suaCkKKyNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TY2hlZHVsaW5nUG9saWN5U2VydmljZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgorI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKKyNpbmNsdWRlICJTdHJlYW1IYWxIaWRsLmgiCisjaW5jbHVkZSAiVmVyc2lvblV0aWxzLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCit1c2luZyBFZmZlY3RIYWxIaWRsID0gOjphbmRyb2lkOjplZmZlY3Q6OkNQUF9WRVJTSU9OOjpFZmZlY3RIYWxIaWRsOwordXNpbmcgUmVhZENvbW1hbmQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1Jbjo6UmVhZENvbW1hbmQ7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT047CisKK1N0cmVhbUhhbEhpZGw6OlN0cmVhbUhhbEhpZGwoSVN0cmVhbSAqc3RyZWFtKQorICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJTdHJlYW0iKSwKKyAgICAgICAgICBtU3RyZWFtKHN0cmVhbSksCisgICAgICAgICAgbUhhbFRocmVhZFByaW9yaXR5KEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCksCisgICAgICAgICAgbUNhY2hlZEJ1ZmZlclNpemUoMCl7CisKKyAgICAvLyBJbnN0cnVtZW50IGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgorICAgIC8vIE5vdGU6IFRoaXMgYXNzdW1lcyBjaGFubmVsIG1hc2ssIGZvcm1hdCwgYW5kIHNhbXBsZSByYXRlIGRvIG5vdCBjaGFuZ2UgYWZ0ZXIgY3JlYXRpb24uCisgICAgaWYgKG1TdHJlYW0gIT0gbnVsbHB0ciAmJiBtU3RyZWFtUG93ZXJMb2cuaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkpIHsKKyAgICAgICAgLy8gT2J0YWluIGF1ZGlvIHByb3BlcnRpZXMgKHNlZSBTdHJlYW1IYWxIaWRsOjpnZXRBdWRpb1Byb3BlcnRpZXMoKSBiZWxvdykuCisgICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRBdWRpb1Byb3BlcnRpZXMoCisgICAgICAgICAgICAgICAgWyZdKGF1dG8gc3IsIGF1dG8gbSwgYXV0byBmKSB7CisgICAgICAgICAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmluaXQoc3IsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4obSksCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4oZikpOworICAgICAgICAgICAgfSk7CisgICAgfQorfQorCitTdHJlYW1IYWxIaWRsOjp+U3RyZWFtSGFsSGlkbCgpIHsKKyAgICBtU3RyZWFtID0gbnVsbHB0cjsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFNhbXBsZVJhdGUiLCBtU3RyZWFtLT5nZXRTYW1wbGVSYXRlKCksIHJhdGUpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcHJvY2Vzc1JldHVybigiZ2V0QnVmZmVyU2l6ZSIsIG1TdHJlYW0tPmdldEJ1ZmZlclNpemUoKSwgc2l6ZSk7CisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICBtQ2FjaGVkQnVmZmVyU2l6ZSA9ICpzaXplOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaykgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldENoYW5uZWxNYXNrIiwgbVN0cmVhbS0+Z2V0Q2hhbm5lbE1hc2soKSwgbWFzayk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0Rm9ybWF0IiwgbVN0cmVhbS0+Z2V0Rm9ybWF0KCksIGZvcm1hdCk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEF1ZGlvUHJvcGVydGllcygKKyAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKAorICAgICAgICAgICAgWyZdKHVpbnQzMl90IHNyLCBhdXRvIG0sIGF1dG8gZikgeworICAgICAgICAgICAgICAgICpzYW1wbGVSYXRlID0gc3I7CisgICAgICAgICAgICAgICAgKm1hc2sgPSBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4obSk7CisgICAgICAgICAgICAgICAgKmZvcm1hdCA9IHN0YXRpY19jYXN0PGF1ZGlvX2Zvcm1hdF90PihmKTsKKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRBdWRpb1Byb3BlcnRpZXMiLCByZXQpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBoaWRsUGFyYW1zOworICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtZXRlcnNGcm9tSGFsKGt2UGFpcnMsICZoaWRsUGFyYW1zKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRQYXJhbWV0ZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsczo6c2V0UGFyYW1ldGVycyhtU3RyZWFtLCBoaWRsUGFyYW1zLCB7fSAvKiBvcHRpb25zICovKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7CisgICAgdmFsdWVzLT5jbGVhcigpOworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGhpZGxLZXlzOworICAgIHN0YXR1c190IHN0YXR1cyA9IGtleXNGcm9tSGFsKGtleXMsICZoaWRsS2V5cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSB1dGlsczo6Z2V0UGFyYW1ldGVycygKKyAgICAgICAgICAgIG1TdHJlYW0sCisgICAgICAgICAgICB7fSAvKiBjb250ZXh0ICovLAorICAgICAgICAgICAgaGlkbEtleXMsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNUb0hhbChwYXJhbWV0ZXJzLCB2YWx1ZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRQYXJhbWV0ZXJzIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjphZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJhZGRFZmZlY3QiLCBtU3RyZWFtLT5hZGRFZmZlY3QoCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEhhbEhpZGwqPihlZmZlY3QuZ2V0KCkpLT5lZmZlY3RJZCgpKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OnJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInJlbW92ZUVmZmVjdCIsIG1TdHJlYW0tPnJlbW92ZUVmZmVjdCgKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0SGFsSGlkbCo+KGVmZmVjdC5nZXQoKSktPmVmZmVjdElkKCkpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c3RhbmRieSgpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdGFuZGJ5IiwgbVN0cmVhbS0+c3RhbmRieSgpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6ZHVtcChpbnQgZmQpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOworICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+ZGVidWcoaGlkbEhhbmRsZSwge30gLyogb3B0aW9ucyAqLyk7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7CisgICAgbVN0cmVhbVBvd2VyTG9nLmR1bXAoZmQpOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJkdW1wIiwgcmV0KTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c3RhcnQoKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RhcnQiLCBtU3RyZWFtLT5zdGFydCgpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c3RvcCgpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdG9wIiwgbVN0cmVhbS0+c3RvcCgpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5jcmVhdGVNbWFwQnVmZmVyKAorICAgICAgICAgICAgbWluU2l6ZUZyYW1lcywKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTW1hcEJ1ZmZlckluZm8mIGhpZGxJbmZvKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZSAqaGFuZGxlID0gaGlkbEluZm8uc2hhcmVkTWVtb3J5LmhhbmRsZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlLT5udW1GZHMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zaGFyZWRfbWVtb3J5X2ZkID0gaGFuZGxlLT5kYXRhWzBdOworI2lmIE1BSk9SX1ZFUlNJT04gPj0gNAorICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+ZmxhZ3MgPSBhdWRpb19tbWFwX2J1ZmZlcl9mbGFnKGhpZGxJbmZvLmZsYWdzKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YnVmZmVyX3NpemVfZnJhbWVzID0gaGlkbEluZm8uYnVmZmVyU2l6ZUZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lZ2F0aXZlIGJ1ZmZlciBzaXplIGZyYW1lIHdhcyBhIGhhY2sgaW4gTyBhbmQgUCB0bworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kaWNhdGUgdGhhdCB0aGUgYnVmZmVyIGlzIHNoYXJlYWJsZSB0byBhcHBsaWNhdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLT5idWZmZXJfc2l6ZV9mcmFtZXMgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YnVmZmVyX3NpemVfZnJhbWVzICo9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmZsYWdzID0gYXVkaW9fbW1hcF9idWZmZXJfZmxhZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmZsYWdzIHwgQVVESU9fTU1BUF9BUFBMSUNBVElPTl9TSEFSRUFCTEUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YnVyc3Rfc2l6ZV9mcmFtZXMgPSBoaWRsSW5mby5idXJzdFNpemVGcmFtZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmZvLT5zaGFyZWRfbWVtb3J5X2FkZHJlc3MgaXMgbm90IG5lZWRlZCBpbiBISURMIGNvbnRleHQKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNoYXJlZF9tZW1vcnlfYWRkcmVzcyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJjcmVhdGVNbWFwQnVmZmVyIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSB7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0TW1hcFBvc2l0aW9uKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBNbWFwUG9zaXRpb24mIGhpZGxQb3NpdGlvbikgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLT50aW1lX25hbm9zZWNvbmRzID0gaGlkbFBvc2l0aW9uLnRpbWVOYW5vc2Vjb25kczsKKyAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24tPnBvc2l0aW9uX2ZyYW1lcyA9IGhpZGxQb3NpdGlvbi5wb3NpdGlvbkZyYW1lczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TW1hcFBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQgcHJpb3JpdHkpIHsKKyAgICBtSGFsVGhyZWFkUHJpb3JpdHkgPSBwcmlvcml0eTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldENhY2hlZEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgaWYgKG1DYWNoZWRCdWZmZXJTaXplICE9IDApIHsKKyAgICAgICAgKnNpemUgPSBtQ2FjaGVkQnVmZmVyU2l6ZTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICByZXR1cm4gZ2V0QnVmZmVyU2l6ZShzaXplKTsKK30KKworYm9vbCBTdHJlYW1IYWxIaWRsOjpyZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkocGlkX3QgdGhyZWFkUGlkLCBwaWRfdCB0aHJlYWRJZCkgeworICAgIGlmIChtSGFsVGhyZWFkUHJpb3JpdHkgPT0gSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpbnQgZXJyID0gcmVxdWVzdFByaW9yaXR5KAorICAgICAgICAgICAgdGhyZWFkUGlkLCB0aHJlYWRJZCwKKyAgICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eSwgZmFsc2UgLyppc0ZvckFwcCovLCB0cnVlIC8qYXN5bmNocm9ub3VzKi8pOworICAgIEFMT0dFX0lGKGVyciwgImZhaWxlZCB0byBzZXQgcHJpb3JpdHkgJWQgZm9yIHBpZCAlZCB0aWQgJWQ7IGVycm9yICVkIiwKKyAgICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eSwgdGhyZWFkUGlkLCB0aHJlYWRJZCwgZXJyKTsKKyAgICAvLyBBdWRpbyB3aWxsIHN0aWxsIHdvcmssIGJ1dCBsYXRlbmN5IHdpbGwgYmUgaGlnaGVyIGFuZCBzb21ldGltZXMgdW5hY2NlcHRhYmxlLgorICAgIHJldHVybiBlcnIgPT0gMDsKK30KKworbmFtZXNwYWNlIHsKKworLyogTm90ZXMgb24gY2FsbGJhY2sgb3duZXJzaGlwLgorCitUaGlzIGlzIGhvdyAoSHcpQmluZGVyIG93bmVyc2hpcCBtb2RlbCBsb29rcyBsaWtlLiBUaGUgc2VydmVyIGltcGxlbWVudGF0aW9uCitpcyBvd25lZCBieSBCaW5kZXIgZnJhbWV3b3JrICh2aWEgc3A8PikuIFByb3hpZXMgYXJlIG93bmVkIGJ5IGNsaWVudHMuCitXaGVuIHRoZSBsYXN0IHByb3h5IGRpc2FwcGVhcnMsIEJpbmRlciBmcmFtZXdvcmsgcmVsZWFzZXMgdGhlIHNlcnZlciBpbXBsLgorCitUaHVzLCBpdCBpcyBub3QgbmVlZGVkIHRvIGtlZXAgYW55IHJlZmVyZW5jZXMgdG8gU3RyZWFtT3V0Q2FsbGJhY2sgKHRoaXMgaXMKK3RoZSBzZXJ2ZXIgaW1wbCkgLS0gaXQgd2lsbCBsaXZlIGFzIGxvbmcgYXMgSEFMIHNlcnZlciBob2xkcyBhIHN0cm9uZyByZWYgdG8KK0lTdHJlYW1PdXRDYWxsYmFjayBwcm94eS4gV2UgY2xlYXIgdGhhdCByZWZlcmVuY2UgYnkgY2FsbGluZyAnY2xlYXJDYWxsYmFjaycKK2Zyb20gdGhlIGRlc3RydWN0b3Igb2YgU3RyZWFtT3V0SGFsSGlkbC4KKworVGhlIGNhbGxiYWNrIG9ubHkga2VlcHMgYSB3ZWFrIHJlZmVyZW5jZSB0byB0aGUgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIG93bmVkCitieSBBdWRpb0ZsaW5nZXIuCisKKyovCisKK3N0cnVjdCBTdHJlYW1PdXRDYWxsYmFjayA6IHB1YmxpYyBJU3RyZWFtT3V0Q2FsbGJhY2sgeworICAgIFN0cmVhbU91dENhbGxiYWNrKGNvbnN0IHdwPFN0cmVhbU91dEhhbEhpZGw+JiBzdHJlYW0pIDogbVN0cmVhbShzdHJlYW0pIHt9CisKKyAgICAvLyBJU3RyZWFtT3V0Q2FsbGJhY2sgaW1wbGVtZW50YXRpb24KKyAgICBSZXR1cm48dm9pZD4gb25Xcml0ZVJlYWR5KCkgIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChzdHJlYW0gIT0gMCkgeworICAgICAgICAgICAgc3RyZWFtLT5vbldyaXRlUmVhZHkoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIFJldHVybjx2b2lkPiBvbkRyYWluUmVhZHkoKSAgb3ZlcnJpZGUgeworICAgICAgICBzcDxTdHJlYW1PdXRIYWxIaWRsPiBzdHJlYW0gPSBtU3RyZWFtLnByb21vdGUoKTsKKyAgICAgICAgaWYgKHN0cmVhbSAhPSAwKSB7CisgICAgICAgICAgICBzdHJlYW0tPm9uRHJhaW5SZWFkeSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgUmV0dXJuPHZvaWQ+IG9uRXJyb3IoKSAgb3ZlcnJpZGUgeworICAgICAgICBzcDxTdHJlYW1PdXRIYWxIaWRsPiBzdHJlYW0gPSBtU3RyZWFtLnByb21vdGUoKTsKKyAgICAgICAgaWYgKHN0cmVhbSAhPSAwKSB7CisgICAgICAgICAgICBzdHJlYW0tPm9uRXJyb3IoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICBwcml2YXRlOgorICAgIHdwPFN0cmVhbU91dEhhbEhpZGw+IG1TdHJlYW07Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworU3RyZWFtT3V0SGFsSGlkbDo6U3RyZWFtT3V0SGFsSGlkbChjb25zdCBzcDxJU3RyZWFtT3V0PiYgc3RyZWFtKQorICAgICAgICA6IFN0cmVhbUhhbEhpZGwoc3RyZWFtLmdldCgpKSwgbVN0cmVhbShzdHJlYW0pLCBtV3JpdGVyQ2xpZW50KDApLCBtRWZHcm91cChudWxscHRyKSB7Cit9CisKK1N0cmVhbU91dEhhbEhpZGw6On5TdHJlYW1PdXRIYWxIaWRsKCkgeworICAgIGlmIChtU3RyZWFtICE9IDApIHsKKyAgICAgICAgaWYgKG1DYWxsYmFjay51bnNhZmVfZ2V0KCkpIHsKKyAgICAgICAgICAgIHByb2Nlc3NSZXR1cm4oImNsZWFyQ2FsbGJhY2siLCBtU3RyZWFtLT5jbGVhckNhbGxiYWNrKCkpOworICAgICAgICB9CisgICAgICAgIHByb2Nlc3NSZXR1cm4oImNsb3NlIiwgbVN0cmVhbS0+Y2xvc2UoKSk7CisgICAgICAgIG1TdHJlYW0uY2xlYXIoKTsKKyAgICB9CisgICAgbUNhbGxiYWNrLmNsZWFyKCk7CisgICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKyAgICBpZiAobUVmR3JvdXApIHsKKyAgICAgICAgRXZlbnRGbGFnOjpkZWxldGVFdmVudEZsYWcoJm1FZkdyb3VwKTsKKyAgICB9Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0RnJhbWVTaXplIiwgbVN0cmVhbS0+Z2V0RnJhbWVTaXplKCksIHNpemUpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaWYgKG1Xcml0ZXJDbGllbnQgPT0gZ2V0dGlkKCkgJiYgbUNvbW1hbmRNUSkgeworICAgICAgICByZXR1cm4gY2FsbFdyaXRlclRocmVhZCgKKyAgICAgICAgICAgICAgICBXcml0ZUNvbW1hbmQ6OkdFVF9MQVRFTkNZLCAiZ2V0TGF0ZW5jeSIsIG51bGxwdHIsIDAsCisgICAgICAgICAgICAgICAgWyZdKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAqbGF0ZW5jeSA9IHdyaXRlU3RhdHVzLnJlcGx5LmxhdGVuY3lNczsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TGF0ZW5jeSIsIG1TdHJlYW0tPmdldExhdGVuY3koKSwgbGF0ZW5jeSk7CisgICAgfQorfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0Vm9sdW1lIiwgbVN0cmVhbS0+c2V0Vm9sdW1lKGxlZnQsIHJpZ2h0KSk7Cit9CisKKyNpZiBNQUpPUl9WRVJTSU9OID09IDIKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBzdGQ6OnZlY3RvcjxQYXJhbWV0ZXJWYWx1ZT4gcGFyYW1ldGVyczsKKyAgICBTdHJpbmc4IGhhbFBhcmFtZXRlcnM7CisgICAgcGFyYW1ldGVycy5wdXNoX2JhY2soe0F1ZGlvUGFyYW1ldGVyOjprZXlQcmVzZW50YXRpb25JZCwgc3RkOjp0b19zdHJpbmcocHJlc2VudGF0aW9uSWQpfSk7CisgICAgcGFyYW1ldGVycy5wdXNoX2JhY2soe0F1ZGlvUGFyYW1ldGVyOjprZXlQcm9ncmFtSWQsIHN0ZDo6dG9fc3RyaW5nKHByb2dyYW1JZCl9KTsKKyAgICBwYXJhbWV0ZXJzVG9IYWwoaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+KHBhcmFtZXRlcnMpLCAmaGFsUGFyYW1ldGVycyk7CisgICAgcmV0dXJuIHNldFBhcmFtZXRlcnMoaGFsUGFyYW1ldGVycyk7Cit9CisjZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2VsZWN0UHJlc2VudGF0aW9uIiwKKyAgICAgICAgICAgIG1TdHJlYW0tPnNlbGVjdFByZXNlbnRhdGlvbihwcmVzZW50YXRpb25JZCwgcHJvZ3JhbUlkKSk7Cit9CisjZW5kaWYKKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6d3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbikgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgICp3cml0dGVuID0gMDsKKworICAgIGlmIChieXRlcyA9PSAwICYmICFtRGF0YU1RKSB7CisgICAgICAgIC8vIENhbid0IGRldGVybWluZSB0aGUgc2l6ZSBmb3IgdGhlIE1RIGJ1ZmZlci4gV2FpdCBmb3IgYSBub24tZW1wdHkgd3JpdGUgcmVxdWVzdC4KKyAgICAgICAgQUxPR1dfSUYobUNhbGxiYWNrLnVuc2FmZV9nZXQoKSwgIkZpcnN0IGNhbGwgdG8gYXN5bmMgd3JpdGUgd2l0aCAwIGJ5dGVzIik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKCFtRGF0YU1RKSB7CisgICAgICAgIC8vIEluIGNhc2UgaWYgcGxheWJhY2sgc3RhcnRzIGNsb3NlIHRvIHRoZSBlbmQgb2YgYSBjb21wcmVzc2VkIHRyYWNrLCB0aGUgYnl0ZXMKKyAgICAgICAgLy8gdGhhdCBuZWVkIHRvIGJlIHdyaXR0ZW4gaXMgbGVzcyB0aGFuIHRoZSBhY3R1YWwgYnVmZmVyIHNpemUuIE5lZWQgdG8gdXNlCisgICAgICAgIC8vIGZ1bGwgYnVmZmVyIHNpemUgZm9yIHRoZSBNUSBzaW5jZSBvdGhlcndpc2UgYWZ0ZXIgc2Vla2luZyBiYWNrIHRvIHRoZSBtaWRkbGUKKyAgICAgICAgLy8gZGF0YSB3aWxsIGJlIHRydW5jYXRlZC4KKyAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemU7CisgICAgICAgIGlmICgoc3RhdHVzID0gZ2V0Q2FjaGVkQnVmZmVyU2l6ZSgmYnVmZmVyU2l6ZSkpICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIGlmIChieXRlcyA+IGJ1ZmZlclNpemUpIGJ1ZmZlclNpemUgPSBieXRlczsKKyAgICAgICAgaWYgKChzdGF0dXMgPSBwcmVwYXJlRm9yV3JpdGluZyhidWZmZXJTaXplKSkgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0dXMgPSBjYWxsV3JpdGVyVGhyZWFkKAorICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpXUklURSwgIndyaXRlIiwgc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJ1ZmZlciksIGJ5dGVzLAorICAgICAgICAgICAgWyZdIChjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAqd3JpdHRlbiA9IHdyaXRlU3RhdHVzLnJlcGx5LndyaXR0ZW47CisgICAgICAgICAgICAgICAgLy8gRGlhZ25vc3RpY3Mgb2YgdGhlIGNhdXNlIG9mIGIvMzU4MTMxMTMuCisgICAgICAgICAgICAgICAgQUxPR0VfSUYoKndyaXR0ZW4gPiBieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICJoYWwgcmVwb3J0cyBtb3JlIGJ5dGVzIHdyaXR0ZW4gdGhhbiBhc2tlZCBmb3I6ICVsbGQgPiAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpKndyaXR0ZW4sIChsb25nIGxvbmcpYnl0ZXMpOworICAgICAgICAgICAgfSk7CisgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICp3cml0dGVuKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpjYWxsV3JpdGVyVGhyZWFkKAorICAgICAgICBXcml0ZUNvbW1hbmQgY21kLCBjb25zdCBjaGFyKiBjbWROYW1lLAorICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YVNpemUsIFN0cmVhbU91dEhhbEhpZGw6OldyaXRlckNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgaWYgKCFtQ29tbWFuZE1RLT53cml0ZSgmY21kKSkgeworICAgICAgICBBTE9HRSgiY29tbWFuZCBtZXNzYWdlIHF1ZXVlIHdyaXRlIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7CisgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgIH0KKyAgICBpZiAoZGF0YSAhPSBudWxscHRyKSB7CisgICAgICAgIHNpemVfdCBhdmFpbGFibGVUb1dyaXRlID0gbURhdGFNUS0+YXZhaWxhYmxlVG9Xcml0ZSgpOworICAgICAgICBpZiAoZGF0YVNpemUgPiBhdmFpbGFibGVUb1dyaXRlKSB7CisgICAgICAgICAgICBBTE9HVygidHJ1bmNhdGluZyB3cml0ZSBkYXRhIGZyb20gJWxsZCB0byAlbGxkIGR1ZSB0byBpbnN1ZmZpY2llbnQgZGF0YSBxdWV1ZSBzcGFjZSIsCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZGF0YVNpemUsIChsb25nIGxvbmcpYXZhaWxhYmxlVG9Xcml0ZSk7CisgICAgICAgICAgICBkYXRhU2l6ZSA9IGF2YWlsYWJsZVRvV3JpdGU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtRGF0YU1RLT53cml0ZShkYXRhLCBkYXRhU2l6ZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJkYXRhIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtRWZHcm91cC0+d2FrZShzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9FTVBUWSkpOworCisgICAgLy8gVE9ETzogUmVtb3ZlIG1hbnVhbCBldmVudCBmbGFnIGhhbmRsaW5nIG9uY2UgYmxvY2tpbmcgTVEgaXMgaW1wbGVtZW50ZWQuIGIvMzM4MTU0MjIKKyAgICB1aW50MzJfdCBlZlN0YXRlID0gMDsKK3JldHJ5OgorICAgIHN0YXR1c190IHJldCA9IG1FZkdyb3VwLT53YWl0KHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0ZVTEwpLCAmZWZTdGF0ZSk7CisgICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSkgeworICAgICAgICBXcml0ZVN0YXR1cyB3cml0ZVN0YXR1czsKKyAgICAgICAgd3JpdGVTdGF0dXMucmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgICAgIGlmICghbVN0YXR1c01RLT5yZWFkKCZ3cml0ZVN0YXR1cykpIHsKKyAgICAgICAgICAgIEFMT0dFKCJzdGF0dXMgbWVzc2FnZSByZWFkIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdyaXRlU3RhdHVzLnJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICByZXQgPSBPSzsKKyAgICAgICAgICAgIGNhbGxiYWNrKHdyaXRlU3RhdHVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IHByb2Nlc3NSZXR1cm4oY21kTmFtZSwgd3JpdGVTdGF0dXMucmV0dmFsKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FSU5UUikgeworICAgICAgICAvLyBTcHVyaW91cyB3YWtldXAuIFRoaXMgbm9ybWFsbHkgcmV0cmllcyBubyBtb3JlIHRoYW4gb25jZS4KKyAgICAgICAgZ290byByZXRyeTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6cHJlcGFyZUZvcldyaXRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiB0ZW1wQ29tbWFuZE1ROworICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IHRlbXBEYXRhTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBwaWRfdCBoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+cHJlcGFyZUZvcldyaXRpbmcoCisgICAgICAgICAgICAxLCBidWZmZXJTaXplLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tYW5kTVE6OkRlc2NyaXB0b3ImIGNvbW1hbmRNUSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YU1ROjpEZXNjcmlwdG9yJiBkYXRhTVEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXR1c01ROjpEZXNjcmlwdG9yJiBzdGF0dXNNUSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyZWFkSW5mbyYgaGFsVGhyZWFkSW5mbykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXBDb21tYW5kTVEucmVzZXQobmV3IENvbW1hbmRNUShjb21tYW5kTVEpKTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcERhdGFNUS5yZXNldChuZXcgRGF0YU1RKGRhdGFNUSkpOworICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgJiYgdGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkUGlkID0gaGFsVGhyZWFkSW5mby5waWQ7CisgICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFRpZCA9IGhhbFRocmVhZEluZm8udGlkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgeworICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicHJlcGFyZUZvcldyaXRpbmciLCByZXQsIHJldHZhbCk7CisgICAgfQorICAgIGlmICghdGVtcENvbW1hbmRNUSB8fCAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpIHx8CisgICAgICAgICAgICAhdGVtcERhdGFNUSB8fCAhdGVtcERhdGFNUS0+aXNWYWxpZCgpIHx8CisgICAgICAgICAgICAhdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fAorICAgICAgICAgICAgIW1FZkdyb3VwKSB7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wQ29tbWFuZE1RLCAiRmFpbGVkIHRvIG9idGFpbiBjb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKKyAgICAgICAgQUxPR0VfSUYodGVtcENvbW1hbmRNUSAmJiAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpLAorICAgICAgICAgICAgICAgICJDb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOworICAgICAgICBBTE9HRV9JRighdGVtcERhdGFNUSwgIkZhaWxlZCB0byBvYnRhaW4gZGF0YSBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7CisgICAgICAgIEFMT0dFX0lGKHRlbXBEYXRhTVEgJiYgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSwgIkRhdGEgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7CisgICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCisgICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKKyAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3Igd3JpdGluZyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZCk7CisKKyAgICBtQ29tbWFuZE1RID0gc3RkOjptb3ZlKHRlbXBDb21tYW5kTVEpOworICAgIG1EYXRhTVEgPSBzdGQ6Om1vdmUodGVtcERhdGFNUSk7CisgICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7CisgICAgbVdyaXRlckNsaWVudCA9IGdldHRpZCgpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcykgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldFJlbmRlclBvc2l0aW9uKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50MzJfdCBkKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKmRzcEZyYW1lcyA9IGQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFJlbmRlclBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0TmV4dFdyaXRlVGltZXN0YW1wKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBpbnQ2NF90IHQpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqdGltZXN0YW1wID0gdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UmVuZGVyUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjaykgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oCisgICAgICAgICAgICAic2V0Q2FsbGJhY2siLCBtU3RyZWFtLT5zZXRDYWxsYmFjayhuZXcgU3RyZWFtT3V0Q2FsbGJhY2sodGhpcykpKTsKKyAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoCisgICAgICAgICAgICBbJl0oYm9vbCBwLCBib29sIHIpIHsKKyAgICAgICAgICAgICAgICAqc3VwcG9ydHNQYXVzZSA9IHA7CisgICAgICAgICAgICAgICAgKnN1cHBvcnRzUmVzdW1lID0gcjsKKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdXBwb3J0c1BhdXNlQW5kUmVzdW1lIiwgcmV0KTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6cGF1c2UoKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+cGF1c2UoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnJlc3VtZSgpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicGF1c2UiLCBtU3RyZWFtLT5yZXN1bWUoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbikgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdXBwb3J0c0RyYWluIiwgbVN0cmVhbS0+c3VwcG9ydHNEcmFpbigpLCBzdXBwb3J0c0RyYWluKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6ZHJhaW4oYm9vbCBlYXJseU5vdGlmeSkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKAorICAgICAgICAgICAgImRyYWluIiwgbVN0cmVhbS0+ZHJhaW4oZWFybHlOb3RpZnkgPyBBdWRpb0RyYWluOjpFQVJMWV9OT1RJRlkgOiBBdWRpb0RyYWluOjpBTEwpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Zmx1c2goKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+Zmx1c2goKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaWYgKG1Xcml0ZXJDbGllbnQgPT0gZ2V0dGlkKCkgJiYgbUNvbW1hbmRNUSkgeworICAgICAgICByZXR1cm4gY2FsbFdyaXRlclRocmVhZCgKKyAgICAgICAgICAgICAgICBXcml0ZUNvbW1hbmQ6OkdFVF9QUkVTRU5UQVRJT05fUE9TSVRJT04sICJnZXRQcmVzZW50YXRpb25Qb3NpdGlvbiIsIG51bGxwdHIsIDAsCisgICAgICAgICAgICAgICAgWyZdKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gd3JpdGVTdGF0dXMucmVwbHkucHJlc2VudGF0aW9uUG9zaXRpb24uZnJhbWVzOworICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X3NlYyA9IHdyaXRlU3RhdHVzLnJlcGx5LnByZXNlbnRhdGlvblBvc2l0aW9uLnRpbWVTdGFtcC50dlNlYzsKKyAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9uc2VjID0gd3JpdGVTdGF0dXMucmVwbHkucHJlc2VudGF0aW9uUG9zaXRpb24udGltZVN0YW1wLnR2TlNlYzsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgICBSZXN1bHQgcmV0dmFsOworICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24oCisgICAgICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBoaWRsRnJhbWVzLCBjb25zdCBUaW1lU3BlYyYgaGlkbFRpbWVTdGFtcCkgeworICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSBoaWRsRnJhbWVzOworICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9zZWMgPSBoaWRsVGltZVN0YW1wLnR2U2VjOworICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9uc2VjID0gaGlkbFRpbWVTdGFtcC50dk5TZWM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFByZXNlbnRhdGlvblBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOworICAgIH0KK30KKworI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgorc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6dXBkYXRlU291cmNlTWV0YWRhdGEoCisgICAgICAgIGNvbnN0IFN0cmVhbU91dEhhbEludGVyZmFjZTo6U291cmNlTWV0YWRhdGEmIC8qIHNvdXJjZU1ldGFkYXRhICovKSB7CisgICAgLy8gQXVkaW8gSEFMIFYyLjAgZG9lcyBub3Qgc3VwcG9ydCBwcm9wYWdhdGluZyBzb3VyY2UgbWV0YWRhdGEKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisjZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKKy8qKiBUcmFuc2Zvcm0gYSBzdGFuZGFyZCBjb2xsZWN0aW9uIHRvIGFuIEhJREwgdmVjdG9yLiAqLwordGVtcGxhdGUgPGNsYXNzIFZhbHVlcywgY2xhc3MgRWxlbWVudENvbnZlcnRlcj4KK3N0YXRpYyBhdXRvIHRyYW5zZm9ybVRvSGlkbFZlYyhjb25zdCBWYWx1ZXMmIHZhbHVlcywgRWxlbWVudENvbnZlcnRlciBjb252ZXJ0ZXIpIHsKKyAgICBoaWRsX3ZlYzxkZWNsdHlwZShjb252ZXJ0ZXIoKnZhbHVlcy5iZWdpbigpKSk+IHJlc3VsdHt2YWx1ZXMuc2l6ZSgpfTsKKyAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOworICAgIHRyYW5zZm9ybShiZWdpbih2YWx1ZXMpLCBlbmQodmFsdWVzKSwgYmVnaW4ocmVzdWx0KSwgY29udmVydGVyKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjp1cGRhdGVTb3VyY2VNZXRhZGF0YSgKKyAgICAgICAgY29uc3QgU3RyZWFtT3V0SGFsSW50ZXJmYWNlOjpTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIHsKKyAgICBDUFBfVkVSU0lPTjo6U291cmNlTWV0YWRhdGEgaGFsTWV0YWRhdGEgPSB7CisgICAgICAgIC50cmFja3MgPSB0cmFuc2Zvcm1Ub0hpZGxWZWMoc291cmNlTWV0YWRhdGEudHJhY2tzLAorICAgICAgICAgICAgICBbXShjb25zdCBwbGF5YmFja190cmFja19tZXRhZGF0YSYgbWV0YWRhdGEpIC0+IFBsYXliYWNrVHJhY2tNZXRhZGF0YSB7CisgICAgICAgICAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgICAgICAgICAudXNhZ2U9c3RhdGljX2Nhc3Q8QXVkaW9Vc2FnZT4obWV0YWRhdGEudXNhZ2UpLAorICAgICAgICAgICAgICAgICAgICAuY29udGVudFR5cGU9c3RhdGljX2Nhc3Q8QXVkaW9Db250ZW50VHlwZT4obWV0YWRhdGEuY29udGVudF90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgLmdhaW49bWV0YWRhdGEuZ2FpbiwKKyAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgIH0pfTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigidXBkYXRlU291cmNlTWV0YWRhdGEiLCBtU3RyZWFtLT51cGRhdGVTb3VyY2VNZXRhZGF0YShoYWxNZXRhZGF0YSkpOworfQorI2VuZGlmCisKK3ZvaWQgU3RyZWFtT3V0SGFsSGlkbDo6b25Xcml0ZVJlYWR5KCkgeworICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7CisgICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybjsKKyAgICBBTE9HVigiYXN5bmNDYWxsYmFjayBvbldyaXRlUmVhZHkiKTsKKyAgICBjYWxsYmFjay0+b25Xcml0ZVJlYWR5KCk7Cit9CisKK3ZvaWQgU3RyZWFtT3V0SGFsSGlkbDo6b25EcmFpblJlYWR5KCkgeworICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7CisgICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybjsKKyAgICBBTE9HVigiYXN5bmNDYWxsYmFjayBvbkRyYWluUmVhZHkiKTsKKyAgICBjYWxsYmFjay0+b25EcmFpblJlYWR5KCk7Cit9CisKK3ZvaWQgU3RyZWFtT3V0SGFsSGlkbDo6b25FcnJvcigpIHsKKyAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOworICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47CisgICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25FcnJvciIpOworICAgIGNhbGxiYWNrLT5vbkVycm9yKCk7Cit9CisKKworU3RyZWFtSW5IYWxIaWRsOjpTdHJlYW1JbkhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbUluPiYgc3RyZWFtKQorICAgICAgICA6IFN0cmVhbUhhbEhpZGwoc3RyZWFtLmdldCgpKSwgbVN0cmVhbShzdHJlYW0pLCBtUmVhZGVyQ2xpZW50KDApLCBtRWZHcm91cChudWxscHRyKSB7Cit9CisKK1N0cmVhbUluSGFsSGlkbDo6flN0cmVhbUluSGFsSGlkbCgpIHsKKyAgICBpZiAobVN0cmVhbSAhPSAwKSB7CisgICAgICAgIHByb2Nlc3NSZXR1cm4oImNsb3NlIiwgbVN0cmVhbS0+Y2xvc2UoKSk7CisgICAgICAgIG1TdHJlYW0uY2xlYXIoKTsKKyAgICAgICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKyAgICB9CisgICAgaWYgKG1FZkdyb3VwKSB7CisgICAgICAgIEV2ZW50RmxhZzo6ZGVsZXRlRXZlbnRGbGFnKCZtRWZHcm91cCk7CisgICAgfQorfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0RnJhbWVTaXplIiwgbVN0cmVhbS0+Z2V0RnJhbWVTaXplKCksIHNpemUpOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnNldEdhaW4oZmxvYXQgZ2FpbikgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRHYWluIiwgbVN0cmVhbS0+c2V0R2FpbihnYWluKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6cmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgKnJlYWQgPSAwOworCisgICAgaWYgKGJ5dGVzID09IDAgJiYgIW1EYXRhTVEpIHsKKyAgICAgICAgLy8gQ2FuJ3QgZGV0ZXJtaW5lIHRoZSBzaXplIGZvciB0aGUgTVEgYnVmZmVyLiBXYWl0IGZvciBhIG5vbi1lbXB0eSByZWFkIHJlcXVlc3QuCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKCFtRGF0YU1RICYmIChzdGF0dXMgPSBwcmVwYXJlRm9yUmVhZGluZyhieXRlcykpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgUmVhZFBhcmFtZXRlcnMgcGFyYW1zOworICAgIHBhcmFtcy5jb21tYW5kID0gUmVhZENvbW1hbmQ6OlJFQUQ7CisgICAgcGFyYW1zLnBhcmFtcy5yZWFkID0gYnl0ZXM7CisgICAgc3RhdHVzID0gY2FsbFJlYWRlclRocmVhZChwYXJhbXMsICJyZWFkIiwKKyAgICAgICAgICAgIFsmXShjb25zdCBSZWFkU3RhdHVzJiByZWFkU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGF2YWlsVG9SZWFkID0gbURhdGFNUS0+YXZhaWxhYmxlVG9SZWFkKCk7CisgICAgICAgICAgICAgICAgaWYgKCFtRGF0YU1RLT5yZWFkKHN0YXRpY19jYXN0PHVpbnQ4X3QqPihidWZmZXIpLCBzdGQ6Om1pbihieXRlcywgYXZhaWxUb1JlYWQpKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZGF0YSBtZXNzYWdlIHF1ZXVlIHJlYWQgZmFpbGVkIGZvciBcInJlYWRcIiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HV19JRihhdmFpbFRvUmVhZCAhPSByZWFkU3RhdHVzLnJlcGx5LnJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAiSEFMIHJlYWQgcmVwb3J0IGluY29uc2lzdGVudDogbXEgPSAlZCwgc3RhdHVzID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpYXZhaWxUb1JlYWQsIChpbnQzMl90KXJlYWRTdGF0dXMucmVwbHkucmVhZCk7CisgICAgICAgICAgICAgICAgKnJlYWQgPSByZWFkU3RhdHVzLnJlcGx5LnJlYWQ7CisgICAgICAgICAgICB9KTsKKyAgICBtU3RyZWFtUG93ZXJMb2cubG9nKGJ1ZmZlciwgKnJlYWQpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Y2FsbFJlYWRlclRocmVhZCgKKyAgICAgICAgY29uc3QgUmVhZFBhcmFtZXRlcnMmIHBhcmFtcywgY29uc3QgY2hhciogY21kTmFtZSwKKyAgICAgICAgU3RyZWFtSW5IYWxIaWRsOjpSZWFkZXJDYWxsYmFjayBjYWxsYmFjaykgeworICAgIGlmICghbUNvbW1hbmRNUS0+d3JpdGUoJnBhcmFtcykpIHsKKyAgICAgICAgQUxPR1coImNvbW1hbmQgbWVzc2FnZSBxdWV1ZSB3cml0ZSBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgfQorICAgIG1FZkdyb3VwLT53YWtlKHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0ZVTEwpKTsKKworICAgIC8vIFRPRE86IFJlbW92ZSBtYW51YWwgZXZlbnQgZmxhZyBoYW5kbGluZyBvbmNlIGJsb2NraW5nIE1RIGlzIGltcGxlbWVudGVkLiBiLzMzODE1NDIyCisgICAgdWludDMyX3QgZWZTdGF0ZSA9IDA7CityZXRyeToKKyAgICBzdGF0dXNfdCByZXQgPSBtRWZHcm91cC0+d2FpdChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9FTVBUWSksICZlZlN0YXRlKTsKKyAgICBpZiAoZWZTdGF0ZSAmIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0VNUFRZKSkgeworICAgICAgICBSZWFkU3RhdHVzIHJlYWRTdGF0dXM7CisgICAgICAgIHJlYWRTdGF0dXMucmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgICAgIGlmICghbVN0YXR1c01RLT5yZWFkKCZyZWFkU3RhdHVzKSkgeworICAgICAgICAgICAgQUxPR0UoInN0YXR1cyBtZXNzYWdlIHJlYWQgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKKyAgICAgICAgfQorICAgICAgICAgaWYgKHJlYWRTdGF0dXMucmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgIHJldCA9IE9LOworICAgICAgICAgICAgY2FsbGJhY2socmVhZFN0YXR1cyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBwcm9jZXNzUmV0dXJuKGNtZE5hbWUsIHJlYWRTdGF0dXMucmV0dmFsKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FSU5UUikgeworICAgICAgICAvLyBTcHVyaW91cyB3YWtldXAuIFRoaXMgbm9ybWFsbHkgcmV0cmllcyBubyBtb3JlIHRoYW4gb25jZS4KKyAgICAgICAgZ290byByZXRyeTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpwcmVwYXJlRm9yUmVhZGluZyhzaXplX3QgYnVmZmVyU2l6ZSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IHRlbXBDb21tYW5kTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gdGVtcERhdGFNUTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IHRlbXBTdGF0dXNNUTsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIHBpZF90IGhhbFRocmVhZFBpZCwgaGFsVGhyZWFkVGlkOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5wcmVwYXJlRm9yUmVhZGluZygKKyAgICAgICAgICAgIDEsIGJ1ZmZlclNpemUsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbW1hbmRNUTo6RGVzY3JpcHRvciYgY29tbWFuZE1RLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTVE6OkRlc2NyaXB0b3ImIGRhdGFNUSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdHVzTVE6OkRlc2NyaXB0b3ImIHN0YXR1c01RLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJlYWRJbmZvJiBoYWxUaHJlYWRJbmZvKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcENvbW1hbmRNUS5yZXNldChuZXcgQ29tbWFuZE1RKGNvbW1hbmRNUSkpOworICAgICAgICAgICAgICAgICAgICB0ZW1wRGF0YU1RLnJlc2V0KG5ldyBEYXRhTVEoZGF0YU1RKSk7CisgICAgICAgICAgICAgICAgICAgIHRlbXBTdGF0dXNNUS5yZXNldChuZXcgU3RhdHVzTVEoc3RhdHVzTVEpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBEYXRhTVEtPmlzVmFsaWQoKSAmJiB0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50RmxhZzo6Y3JlYXRlRXZlbnRGbGFnKHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSwgJm1FZkdyb3VwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRQaWQgPSBoYWxUaHJlYWRJbmZvLnBpZDsKKyAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkVGlkID0gaGFsVGhyZWFkSW5mby50aWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCFyZXQuaXNPaygpIHx8IHJldHZhbCAhPSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwcmVwYXJlRm9yUmVhZGluZyIsIHJldCwgcmV0dmFsKTsKKyAgICB9CisgICAgaWYgKCF0ZW1wQ29tbWFuZE1RIHx8ICF0ZW1wQ29tbWFuZE1RLT5pc1ZhbGlkKCkgfHwKKyAgICAgICAgICAgICF0ZW1wRGF0YU1RIHx8ICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgfHwKKyAgICAgICAgICAgICF0ZW1wU3RhdHVzTVEgfHwgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpIHx8CisgICAgICAgICAgICAhbUVmR3JvdXApIHsKKyAgICAgICAgQUxPR0VfSUYoIXRlbXBDb21tYW5kTVEsICJGYWlsZWQgdG8gb2J0YWluIGNvbW1hbmQgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOworICAgICAgICBBTE9HRV9JRih0ZW1wQ29tbWFuZE1RICYmICF0ZW1wQ29tbWFuZE1RLT5pc1ZhbGlkKCksCisgICAgICAgICAgICAgICAgIkNvbW1hbmQgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wRGF0YU1RLCAiRmFpbGVkIHRvIG9idGFpbiBkYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHJlYWRpbmciKTsKKyAgICAgICAgQUxPR0VfSUYodGVtcERhdGFNUSAmJiAhdGVtcERhdGFNUS0+aXNWYWxpZCgpLCAiRGF0YSBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIGlzIGludmFsaWQiKTsKKyAgICAgICAgQUxPR0VfSUYoIXRlbXBTdGF0dXNNUSwgIkZhaWxlZCB0byBvYnRhaW4gc3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIHJlYWRpbmciKTsKKyAgICAgICAgQUxPR0VfSUYodGVtcFN0YXR1c01RICYmICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSwKKyAgICAgICAgICAgICAgICAiU3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIHJlYWRpbmcgaXMgaW52YWxpZCIpOworICAgICAgICBBTE9HRV9JRighbUVmR3JvdXAsICJFdmVudCBmbGFnIGNyZWF0aW9uIGZvciByZWFkaW5nIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KGhhbFRocmVhZFBpZCwgaGFsVGhyZWFkVGlkKTsKKworICAgIG1Db21tYW5kTVEgPSBzdGQ6Om1vdmUodGVtcENvbW1hbmRNUSk7CisgICAgbURhdGFNUSA9IHN0ZDo6bW92ZSh0ZW1wRGF0YU1RKTsKKyAgICBtU3RhdHVzTVEgPSBzdGQ6Om1vdmUodGVtcFN0YXR1c01RKTsKKyAgICBtUmVhZGVyQ2xpZW50ID0gZ2V0dGlkKCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRJbnB1dEZyYW1lc0xvc3QiLCBtU3RyZWFtLT5nZXRJbnB1dEZyYW1lc0xvc3QoKSwgZnJhbWVzTG9zdCk7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIGlmIChtUmVhZGVyQ2xpZW50ID09IGdldHRpZCgpICYmIG1Db21tYW5kTVEpIHsKKyAgICAgICAgUmVhZFBhcmFtZXRlcnMgcGFyYW1zOworICAgICAgICBwYXJhbXMuY29tbWFuZCA9IFJlYWRDb21tYW5kOjpHRVRfQ0FQVFVSRV9QT1NJVElPTjsKKyAgICAgICAgcmV0dXJuIGNhbGxSZWFkZXJUaHJlYWQocGFyYW1zLCAiZ2V0Q2FwdHVyZVBvc2l0aW9uIiwKKyAgICAgICAgICAgICAgICBbJl0oY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gcmVhZFN0YXR1cy5yZXBseS5jYXB0dXJlUG9zaXRpb24uZnJhbWVzOworICAgICAgICAgICAgICAgICAgICAqdGltZSA9IHJlYWRTdGF0dXMucmVwbHkuY2FwdHVyZVBvc2l0aW9uLnRpbWU7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUmVzdWx0IHJldHZhbDsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldENhcHR1cmVQb3NpdGlvbigKKyAgICAgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IGhpZGxGcmFtZXMsIHVpbnQ2NF90IGhpZGxUaW1lKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IGhpZGxGcmFtZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAqdGltZSA9IGhpZGxUaW1lOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRDYXB0dXJlUG9zaXRpb24iLCByZXQsIHJldHZhbCk7CisgICAgfQorfQorCisjaWYgTUFKT1JfVkVSU0lPTiA9PSAyCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyBfX3VudXNlZCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjp1cGRhdGVTaW5rTWV0YWRhdGEoCisgICAgICAgIGNvbnN0IFN0cmVhbUluSGFsSW50ZXJmYWNlOjpTaW5rTWV0YWRhdGEmIC8qIHNpbmtNZXRhZGF0YSAqLykgeworICAgIC8vIEF1ZGlvIEhBTCBWMi4wIGRvZXMgbm90IHN1cHBvcnQgcHJvcGFnYXRpbmcgc2luayBtZXRhZGF0YQorICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lc0luZm8pIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEFjdGl2ZU1pY3JvcGhvbmVzKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBoaWRsX3ZlYzxNaWNyb3Bob25lSW5mbz4gbWljQXJyYXlIYWwpIHsKKyAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBtaWNBcnJheUhhbC5zaXplKCk7IGsrKykgeworICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190IGRzdDsKKyAgICAgICAgICAgIC8vIGNvbnZlcnQKKyAgICAgICAgICAgIG1pY3JvcGhvbmVJbmZvVG9IYWwobWljQXJyYXlIYWxba10sICZkc3QpOworICAgICAgICAgICAgbWVkaWE6Ok1pY3JvcGhvbmVJbmZvIG1pY3JvcGhvbmUgPSBtZWRpYTo6TWljcm9waG9uZUluZm8oZHN0KTsKKyAgICAgICAgICAgIG1pY3JvcGhvbmVzSW5mby0+cHVzaF9iYWNrKG1pY3JvcGhvbmUpOworICAgICAgICB9CisgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEFjdGl2ZU1pY3JvcGhvbmVzIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdAorICAgICAgICBTdHJlYW1JbkhhbEludGVyZmFjZTo6U2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIHsKKyAgICBDUFBfVkVSU0lPTjo6U2lua01ldGFkYXRhIGhhbE1ldGFkYXRhID0geworICAgICAgICAudHJhY2tzID0gdHJhbnNmb3JtVG9IaWRsVmVjKHNpbmtNZXRhZGF0YS50cmFja3MsCisgICAgICAgICAgICAgIFtdKGNvbnN0IHJlY29yZF90cmFja19tZXRhZGF0YSYgbWV0YWRhdGEpIC0+IFJlY29yZFRyYWNrTWV0YWRhdGEgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICAgICAgICAgLnNvdXJjZT1zdGF0aWNfY2FzdDxBdWRpb1NvdXJjZT4obWV0YWRhdGEuc291cmNlKSwKKyAgICAgICAgICAgICAgICAgICAgLmdhaW49bWV0YWRhdGEuZ2FpbiwKKyAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgIH0pfTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigidXBkYXRlU2lua01ldGFkYXRhIiwgbVN0cmVhbS0+dXBkYXRlU2lua01ldGFkYXRhKGhhbE1ldGFkYXRhKSk7Cit9CisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdiNTA3ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5oCkBAIC0wLDAgKzEsMjUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfSElETF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMX0gKKworI2luY2x1ZGUgPGF0b21pYz4KKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JU3RyZWFtLmgpCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL0lTdHJlYW1Jbi5oKQorI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JU3RyZWFtT3V0LmgpCisjaW5jbHVkZSA8Zm1xL0V2ZW50RmxhZy5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisjaW5jbHVkZSAiU3RyZWFtUG93ZXJMb2cuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtSW47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1PdXQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpFdmVudEZsYWc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNZXNzYWdlUXVldWU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyBSZWFkUGFyYW1ldGVycyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbUluOjpSZWFkUGFyYW1ldGVyczsKK3VzaW5nIFJlYWRTdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1Jbjo6UmVhZFN0YXR1czsKK3VzaW5nIFdyaXRlQ29tbWFuZCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbU91dDo6V3JpdGVDb21tYW5kOwordXNpbmcgV3JpdGVTdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1PdXQ6OldyaXRlU3RhdHVzOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitjbGFzcyBEZXZpY2VIYWxIaWRsOworCitjbGFzcyBTdHJlYW1IYWxIaWRsIDogcHVibGljIHZpcnR1YWwgU3RyZWFtSGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKK3sKKyAgcHVibGljOgorICAgIC8vIFJldHVybiB0aGUgc2FtcGxpbmcgcmF0ZSBpbiBIeiAtIGVnLiA0NDEwMC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpOworCisgICAgLy8gUmV0dXJuIHNpemUgb2YgaW5wdXQvb3V0cHV0IGJ1ZmZlciBpbiBieXRlcyBmb3IgdGhpcyBzdHJlYW0gLSBlZy4gNDgwMC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIC8vIFJldHVybiB0aGUgY2hhbm5lbCBtYXNrLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spOworCisgICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBmb3JtYXQgLSBlLmcuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOworCisgICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qcm9wZXJ0aWVzKAorICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKKworICAgIC8vIFNldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7CisKKyAgICAvLyBHZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7CisKKyAgICAvLyBBZGQgb3IgcmVtb3ZlIHRoZSBlZmZlY3Qgb24gdGhlIHN0cmVhbS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOworCisgICAgLy8gUHV0IHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dC9vdXRwdXQgaW50byBzdGFuZGJ5IG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFuZGJ5KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKworICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOworCisgICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworCisgICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7CisKKyAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7CisKKyAgICAvLyBTZXQgdGhlIHByaW9yaXR5IG9mIHRoZSB0aHJlYWQgdGhhdCBpbnRlcmFjdHMgd2l0aCB0aGUgSEFMCisgICAgLy8gKG11c3QgbWF0Y2ggdGhlIHByaW9yaXR5IG9mIHRoZSBhdWRpb2ZsaW5nZXIncyB0aHJlYWQgdGhhdCBjYWxscyAncmVhZCcgLyAnd3JpdGUnKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KTsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgZXhwbGljaXQgU3RyZWFtSGFsSGlkbChJU3RyZWFtICpzdHJlYW0pOworCisgICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIHN0cmVhbS4KKyAgICB2aXJ0dWFsIH5TdHJlYW1IYWxIaWRsKCk7CisKKyAgICBzdGF0dXNfdCBnZXRDYWNoZWRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICBib29sIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShwaWRfdCB0aHJlYWRQaWQsIHBpZF90IHRocmVhZElkKTsKKworICAgIC8vIG1TdHJlYW1Qb3dlckxvZyBpcyB1c2VkIGZvciBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KKyAgICBTdHJlYW1Qb3dlckxvZyBtU3RyZWFtUG93ZXJMb2c7CisKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBpbnQgSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUID0gLTE7CisgICAgSVN0cmVhbSAqbVN0cmVhbTsKKyAgICBpbnQgbUhhbFRocmVhZFByaW9yaXR5OworICAgIHNpemVfdCBtQ2FjaGVkQnVmZmVyU2l6ZTsKK307CisKK2NsYXNzIFN0cmVhbU91dEhhbEhpZGwgOiBwdWJsaWMgU3RyZWFtT3V0SGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsSGlkbCB7CisgIHB1YmxpYzoKKyAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOworCisgICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBoYXJkd2FyZSBkcml2ZXIgZXN0aW1hdGVkIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSk7CisKKyAgICAvLyBVc2UgdGhpcyBtZXRob2QgaW4gc2l0dWF0aW9ucyB3aGVyZSBhdWRpbyBtaXhpbmcgaXMgZG9uZSBpbiB0aGUgaGFyZHdhcmUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOworCisgICAgLy8gU2VsZWN0cyB0aGUgYXVkaW8gcHJlc2VudGF0aW9uIChpZiBhdmFpbGFibGUpLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCk7CisKKyAgICAvLyBXcml0ZSBhdWRpbyBidWZmZXIgdG8gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbik7CisKKyAgICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgd3JpdHRlbiBieSB0aGUgYXVkaW8gZHNwIHRvIERBQyBzaW5jZQorICAgIC8vIHRoZSBvdXRwdXQgaGFzIGV4aXRlZCBzdGFuZGJ5LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcyk7CisKKyAgICAvLyBHZXQgdGhlIGxvY2FsIHRpbWUgYXQgd2hpY2ggdGhlIG5leHQgd3JpdGUgdG8gdGhlIGF1ZGlvIGRyaXZlciB3aWxsIGJlIHByZXNlbnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApOworCisgICAgLy8gU2V0IHRoZSBjYWxsYmFjayBmb3Igbm90aWZ5aW5nIGNvbXBsZXRpb24gb2Ygbm9uLWJsb2NraW5nIHdyaXRlIGFuZCBkcmFpbi4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgcGF1c2UgYW5kIHJlc3VtZSBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKTsKKworICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKKworICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdW1lKCk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgZHJhaW4gb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbik7CisKKyAgICAvLyBSZXF1ZXN0cyBub3RpZmljYXRpb24gd2hlbiBkYXRhIGJ1ZmZlcmVkIGJ5IHRoZSBkcml2ZXIvaGFyZHdhcmUgaGFzIGJlZW4gcGxheWVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZHJhaW4oYm9vbCBlYXJseU5vdGlmeSk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIGZsdXNoIHRoZSBxdWV1ZWQgZGF0YS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCk7CisKKyAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcHJlc2VudGVkIHRvIGFuIGV4dGVybmFsIG9ic2VydmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApOworCisgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZC4KKyAgICBzdGF0dXNfdCB1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIG92ZXJyaWRlOworCisgICAgLy8gTWV0aG9kcyB1c2VkIGJ5IFN0cmVhbU91dENhbGxiYWNrIChISURMKS4KKyAgICB2b2lkIG9uV3JpdGVSZWFkeSgpOworICAgIHZvaWQgb25EcmFpblJlYWR5KCk7CisgICAgdm9pZCBvbkVycm9yKCk7CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsSGlkbDsKKyAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxXcml0ZUNvbW1hbmQsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBDb21tYW5kTVE7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IERhdGFNUTsKKyAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxXcml0ZVN0YXR1cywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IFN0YXR1c01ROworCisgICAgd3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IG1DYWxsYmFjazsKKyAgICBzcDxJU3RyZWFtT3V0PiBtU3RyZWFtOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IG1Db21tYW5kTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gbURhdGFNUTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKKyAgICBzdGQ6OmF0b21pYzxwaWRfdD4gbVdyaXRlckNsaWVudDsKKyAgICBFdmVudEZsYWcqIG1FZkdyb3VwOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIFN0cmVhbU91dEhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbU91dD4mIHN0cmVhbSk7CisKKyAgICB2aXJ0dWFsIH5TdHJlYW1PdXRIYWxIaWRsKCk7CisKKyAgICB1c2luZyBXcml0ZXJDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpPjsKKyAgICBzdGF0dXNfdCBjYWxsV3JpdGVyVGhyZWFkKAorICAgICAgICAgICAgV3JpdGVDb21tYW5kIGNtZCwgY29uc3QgY2hhciogY21kTmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhU2l6ZSwgV3JpdGVyQ2FsbGJhY2sgY2FsbGJhY2spOworICAgIHN0YXR1c190IHByZXBhcmVGb3JXcml0aW5nKHNpemVfdCBidWZmZXJTaXplKTsKK307CisKK2NsYXNzIFN0cmVhbUluSGFsSGlkbCA6IHB1YmxpYyBTdHJlYW1JbkhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbEhpZGwgeworICBwdWJsaWM6CisgICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIC8vIFNldCB0aGUgaW5wdXQgZ2FpbiBmb3IgdGhlIGF1ZGlvIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEdhaW4oZmxvYXQgZ2Fpbik7CisKKyAgICAvLyBSZWFkIGF1ZGlvIGJ1ZmZlciBpbiBmcm9tIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGFtb3VudCBvZiBpbnB1dCBmcmFtZXMgbG9zdCBpbiB0aGUgYXVkaW8gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KTsKKworICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyByZWNlaXZlZCBhbmQKKyAgICAvLyB0aGUgY2xvY2sgdGltZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBmcmFtZSBjb3VudC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpOworCisgICAgLy8gR2V0IGFjdGl2ZSBtaWNyb3Bob25lcworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOworCisgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzaW5rIGhhcyBiZWVuIGNoYW5nZWQuCisgICAgc3RhdHVzX3QgdXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSBvdmVycmlkZTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxIaWRsOworICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFJlYWRQYXJhbWV0ZXJzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gQ29tbWFuZE1ROworICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBEYXRhTVE7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8UmVhZFN0YXR1cywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IFN0YXR1c01ROworCisgICAgc3A8SVN0cmVhbUluPiBtU3RyZWFtOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IG1Db21tYW5kTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gbURhdGFNUTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKKyAgICBzdGQ6OmF0b21pYzxwaWRfdD4gbVJlYWRlckNsaWVudDsKKyAgICBFdmVudEZsYWcqIG1FZkdyb3VwOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIFN0cmVhbUluSGFsSGlkbChjb25zdCBzcDxJU3RyZWFtSW4+JiBzdHJlYW0pOworCisgICAgdmlydHVhbCB+U3RyZWFtSW5IYWxIaWRsKCk7CisKKyAgICB1c2luZyBSZWFkZXJDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSZWFkU3RhdHVzJiByZWFkU3RhdHVzKT47CisgICAgc3RhdHVzX3QgY2FsbFJlYWRlclRocmVhZCgKKyAgICAgICAgICAgIGNvbnN0IFJlYWRQYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IGNoYXIqIGNtZE5hbWUsIFJlYWRlckNhbGxiYWNrIGNhbGxiYWNrKTsKKyAgICBzdGF0dXNfdCBwcmVwYXJlRm9yUmVhZGluZyhzaXplX3QgYnVmZmVyU2l6ZSk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbExvY2FsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmQzMGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5jcHAKQEAgLTAsMCArMSwzNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlN0cmVhbUhhbExvY2FsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKKyNpbmNsdWRlICJTdHJlYW1IYWxMb2NhbC5oIgorI2luY2x1ZGUgIlZlcnNpb25VdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitTdHJlYW1IYWxMb2NhbDo6U3RyZWFtSGFsTG9jYWwoYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKKyAgICAgICAgOiBtRGV2aWNlKGRldmljZSksCisgICAgICAgICAgbVN0cmVhbShzdHJlYW0pIHsKKyAgICAvLyBJbnN0cnVtZW50IGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgorICAgIC8vIE5vdGU6IFRoaXMgYXNzdW1lcyBjaGFubmVsIG1hc2ssIGZvcm1hdCwgYW5kIHNhbXBsZSByYXRlIGRvIG5vdCBjaGFuZ2UgYWZ0ZXIgY3JlYXRpb24uCisgICAgaWYgKG1TdHJlYW0gIT0gbnVsbHB0ciAmJiBtU3RyZWFtUG93ZXJMb2cuaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkpIHsKKyAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmluaXQobVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pLAorICAgICAgICAgICAgICAgIG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKSwKKyAgICAgICAgICAgICAgICBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pKTsKKyAgICB9Cit9CisKK1N0cmVhbUhhbExvY2FsOjp+U3RyZWFtSGFsTG9jYWwoKSB7CisgICAgbVN0cmVhbSA9IDA7CisgICAgbURldmljZS5jbGVhcigpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSkgeworICAgICpyYXRlID0gbVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgKnNpemUgPSBtU3RyZWFtLT5nZXRfYnVmZmVyX3NpemUobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spIHsKKyAgICAqbWFzayA9IG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgeworICAgICpmb3JtYXQgPSBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEF1ZGlvUHJvcGVydGllcygKKyAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7CisgICAgKnNhbXBsZVJhdGUgPSBtU3RyZWFtLT5nZXRfc2FtcGxlX3JhdGUobVN0cmVhbSk7CisgICAgKm1hc2sgPSBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSk7CisgICAgKmZvcm1hdCA9IG1TdHJlYW0tPmdldF9mb3JtYXQobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7CisgICAgcmV0dXJuIG1TdHJlYW0tPnNldF9wYXJhbWV0ZXJzKG1TdHJlYW0sIGt2UGFpcnMuc3RyaW5nKCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKKyAgICBjaGFyICpoYWxWYWx1ZXMgPSBtU3RyZWFtLT5nZXRfcGFyYW1ldGVycyhtU3RyZWFtLCBrZXlzLnN0cmluZygpKTsKKyAgICBpZiAoaGFsVmFsdWVzICE9IE5VTEwpIHsKKyAgICAgICAgdmFsdWVzLT5zZXRUbyhoYWxWYWx1ZXMpOworICAgICAgICBmcmVlKGhhbFZhbHVlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsdWVzLT5jbGVhcigpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjphZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPikgeworICAgIExPR19BTFdBWVNfRkFUQUwoIkxvY2FsIHN0cmVhbXMgY2FuIG5vdCBoYXZlIGVmZmVjdHMiKTsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpyZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPikgeworICAgIExPR19BTFdBWVNfRkFUQUwoIkxvY2FsIHN0cmVhbXMgY2FuIG5vdCBoYXZlIGVmZmVjdHMiKTsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzdGFuZGJ5KCkgeworICAgIHJldHVybiBtU3RyZWFtLT5zdGFuZGJ5KG1TdHJlYW0pOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6ZHVtcChpbnQgZmQpIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RyZWFtLT5kdW1wKG1TdHJlYW0sIGZkKTsKKyAgICBtU3RyZWFtUG93ZXJMb2cuZHVtcChmZCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnNldEhhbFRocmVhZFByaW9yaXR5KGludCkgeworICAgIC8vIERvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgYXMgbG9jYWwgaGFsIGlzIGV4ZWN1dGVkIGJ5IGF1ZGlvZmxpbmdlciBkaXJlY3RseQorICAgIC8vIG9uIHRoZSBzYW1lIHRocmVhZC4KKyAgICByZXR1cm4gT0s7Cit9CisKK1N0cmVhbU91dEhhbExvY2FsOjpTdHJlYW1PdXRIYWxMb2NhbChhdWRpb19zdHJlYW1fb3V0X3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKKyAgICAgICAgOiBTdHJlYW1IYWxMb2NhbCgmc3RyZWFtLT5jb21tb24sIGRldmljZSksIG1TdHJlYW0oc3RyZWFtKSB7Cit9CisKK1N0cmVhbU91dEhhbExvY2FsOjp+U3RyZWFtT3V0SGFsTG9jYWwoKSB7CisgICAgbUNhbGxiYWNrLmNsZWFyKCk7CisgICAgbURldmljZS0+Y2xvc2VPdXRwdXRTdHJlYW0obVN0cmVhbSk7CisgICAgbVN0cmVhbSA9IDA7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgKnNpemUgPSBhdWRpb19zdHJlYW1fb3V0X2ZyYW1lX3NpemUobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSkgeworICAgICpsYXRlbmN5ID0gbVN0cmVhbS0+Z2V0X2xhdGVuY3kobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7CisgICAgaWYgKG1TdHJlYW0tPnNldF92b2x1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zZXRfdm9sdW1lKG1TdHJlYW0sIGxlZnQsIHJpZ2h0KTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpIHsKKyAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKKyAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5UHJlc2VudGF0aW9uSWQpLCBwcmVzZW50YXRpb25JZCk7CisgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVByb2dyYW1JZCksIHByb2dyYW1JZCk7CisgICAgcmV0dXJuIHNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjp3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKSB7CisgICAgc3NpemVfdCB3cml0ZVJlc3VsdCA9IG1TdHJlYW0tPndyaXRlKG1TdHJlYW0sIGJ1ZmZlciwgYnl0ZXMpOworICAgIGlmICh3cml0ZVJlc3VsdCA+IDApIHsKKyAgICAgICAgKndyaXR0ZW4gPSB3cml0ZVJlc3VsdDsKKyAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICp3cml0dGVuKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSB7CisgICAgICAgICp3cml0dGVuID0gMDsKKyAgICAgICAgcmV0dXJuIHdyaXRlUmVzdWx0OworICAgIH0KK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpIHsKKyAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X3JlbmRlcl9wb3NpdGlvbihtU3RyZWFtLCBkc3BGcmFtZXMpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCkgeworICAgIGlmIChtU3RyZWFtLT5nZXRfbmV4dF93cml0ZV90aW1lc3RhbXAgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5nZXRfbmV4dF93cml0ZV90aW1lc3RhbXAobVN0cmVhbSwgdGltZXN0YW1wKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjaykgeworICAgIGlmIChtU3RyZWFtLT5zZXRfY2FsbGJhY2sgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHN0YXR1c190IHJlc3VsdCA9IG1TdHJlYW0tPnNldF9jYWxsYmFjayhtU3RyZWFtLCBTdHJlYW1PdXRIYWxMb2NhbDo6YXN5bmNDYWxsYmFjaywgdGhpcyk7CisgICAgaWYgKHJlc3VsdCA9PSBPSykgeworICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gc3RhdGljCitpbnQgU3RyZWFtT3V0SGFsTG9jYWw6OmFzeW5jQ2FsbGJhY2soc3RyZWFtX2NhbGxiYWNrX2V2ZW50X3QgZXZlbnQsIHZvaWQqLCB2b2lkICpjb29raWUpIHsKKyAgICAvLyBXZSBhY3QgYXMgaWYgd2UgZ2F2ZSBhIHdwPFN0cmVhbU91dEhhbExvY2FsPiB0byBIQUwuIFRoaXMgd2F5IHdlIHNob3VsZCBoYW5kbGUKKyAgICAvLyBjb3JyZWN0bHkgdGhlIGNhc2Ugd2hlbiB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGlsZSBTdHJlYW1PdXRIYWxMb2NhbCdzIGRlc3RydWN0b3IgaXMKKyAgICAvLyBhbHJlYWR5IHJ1bm5pbmcsIGJlY2F1c2UgdGhlIGRlc3RydWN0b3IgaXMgaW52b2tlZCBhZnRlciB0aGUgcmVmY291bnQgaGFzIGJlZW4gYXRvbWljYWxseQorICAgIC8vIGRlY3JlbWVudGVkLgorICAgIHdwPFN0cmVhbU91dEhhbExvY2FsPiB3ZWFrU2VsZihzdGF0aWNfY2FzdDxTdHJlYW1PdXRIYWxMb2NhbCo+KGNvb2tpZSkpOworICAgIHNwPFN0cmVhbU91dEhhbExvY2FsPiBzZWxmID0gd2Vha1NlbGYucHJvbW90ZSgpOworICAgIGlmIChzZWxmID09IDApIHJldHVybiAwOworICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IHNlbGYtPm1DYWxsYmFjay5wcm9tb3RlKCk7CisgICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybiAwOworICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrKCkgZXZlbnQgJWQiLCBldmVudCk7CisgICAgc3dpdGNoIChldmVudCkgeworICAgICAgICBjYXNlIFNUUkVBTV9DQktfRVZFTlRfV1JJVEVfUkVBRFk6CisgICAgICAgICAgICBjYWxsYmFjay0+b25Xcml0ZVJlYWR5KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVFJFQU1fQ0JLX0VWRU5UX0RSQUlOX1JFQURZOgorICAgICAgICAgICAgY2FsbGJhY2stPm9uRHJhaW5SZWFkeSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RSRUFNX0NCS19FVkVOVF9FUlJPUjoKKyAgICAgICAgICAgIGNhbGxiYWNrLT5vbkVycm9yKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJhc3luY0NhbGxiYWNrKCkgdW5rbm93biBldmVudCAlZCIsIGV2ZW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpIHsKKyAgICAqc3VwcG9ydHNQYXVzZSA9IG1TdHJlYW0tPnBhdXNlICE9IE5VTEw7CisgICAgKnN1cHBvcnRzUmVzdW1lID0gbVN0cmVhbS0+cmVzdW1lICE9IE5VTEw7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6cGF1c2UoKSB7CisgICAgaWYgKG1TdHJlYW0tPnBhdXNlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+cGF1c2UobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpyZXN1bWUoKSB7CisgICAgaWYgKG1TdHJlYW0tPnJlc3VtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnJlc3VtZShtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbikgeworICAgICpzdXBwb3J0c0RyYWluID0gbVN0cmVhbS0+ZHJhaW4gIT0gTlVMTDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpkcmFpbihib29sIGVhcmx5Tm90aWZ5KSB7CisgICAgaWYgKG1TdHJlYW0tPmRyYWluID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+ZHJhaW4obVN0cmVhbSwgZWFybHlOb3RpZnkgPyBBVURJT19EUkFJTl9FQVJMWV9OT1RJRlkgOiBBVURJT19EUkFJTl9BTEwpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Zmx1c2goKSB7CisgICAgaWYgKG1TdHJlYW0tPmZsdXNoID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Zmx1c2gobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCkgeworICAgIGlmIChtU3RyZWFtLT5nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbihtU3RyZWFtLCBmcmFtZXMsIHRpbWVzdGFtcCk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjp1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIHsKKyAgICBpZiAobVN0cmVhbS0+dXBkYXRlX3NvdXJjZV9tZXRhZGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgY29uc3Qgc291cmNlX21ldGFkYXRhX3QgbWV0YWRhdGEgeworICAgICAgICAudHJhY2tfY291bnQgPSBzb3VyY2VNZXRhZGF0YS50cmFja3Muc2l6ZSgpLAorICAgICAgICAvLyBjb25zdCBjYXN0IGlzIGZpbmUgYXMgaXQgaXMgaW4gYSBjb25zdCBzdHJ1Y3R1cmUKKyAgICAgICAgLnRyYWNrcyA9IGNvbnN0X2Nhc3Q8cGxheWJhY2tfdHJhY2tfbWV0YWRhdGEqPihzb3VyY2VNZXRhZGF0YS50cmFja3MuZGF0YSgpKSwKKyAgICB9OworICAgIG1TdHJlYW0tPnVwZGF0ZV9zb3VyY2VfbWV0YWRhdGEobVN0cmVhbSwgJm1ldGFkYXRhKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdGFydCgpIHsKKyAgICBpZiAobVN0cmVhbS0+c3RhcnQgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zdGFydChtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN0b3AoKSB7CisgICAgaWYgKG1TdHJlYW0tPnN0b3AgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zdG9wKG1TdHJlYW0pOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKKyAgICBpZiAobVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyKG1TdHJlYW0sIG1pblNpemVGcmFtZXMsIGluZm8pOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgeworICAgIGlmIChtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uKG1TdHJlYW0sIHBvc2l0aW9uKTsKK30KKworU3RyZWFtSW5IYWxMb2NhbDo6U3RyZWFtSW5IYWxMb2NhbChhdWRpb19zdHJlYW1faW5fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQorICAgICAgICA6IFN0cmVhbUhhbExvY2FsKCZzdHJlYW0tPmNvbW1vbiwgZGV2aWNlKSwgbVN0cmVhbShzdHJlYW0pIHsKK30KKworU3RyZWFtSW5IYWxMb2NhbDo6flN0cmVhbUluSGFsTG9jYWwoKSB7CisgICAgbURldmljZS0+Y2xvc2VJbnB1dFN0cmVhbShtU3RyZWFtKTsKKyAgICBtU3RyZWFtID0gMDsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgeworICAgICpzaXplID0gYXVkaW9fc3RyZWFtX2luX2ZyYW1lX3NpemUobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzZXRHYWluKGZsb2F0IGdhaW4pIHsKKyAgICByZXR1cm4gbVN0cmVhbS0+c2V0X2dhaW4obVN0cmVhbSwgZ2Fpbik7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCkgeworICAgIHNzaXplX3QgcmVhZFJlc3VsdCA9IG1TdHJlYW0tPnJlYWQobVN0cmVhbSwgYnVmZmVyLCBieXRlcyk7CisgICAgaWYgKHJlYWRSZXN1bHQgPiAwKSB7CisgICAgICAgICpyZWFkID0gcmVhZFJlc3VsdDsKKyAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyggYnVmZmVyLCAqcmVhZCk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgeworICAgICAgICAqcmVhZCA9IDA7CisgICAgICAgIHJldHVybiByZWFkUmVzdWx0OworICAgIH0KK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KSB7CisgICAgKmZyYW1lc0xvc3QgPSBtU3RyZWFtLT5nZXRfaW5wdXRfZnJhbWVzX2xvc3QobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKSB7CisgICAgaWYgKG1TdHJlYW0tPmdldF9jYXB0dXJlX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X2NhcHR1cmVfcG9zaXRpb24obVN0cmVhbSwgZnJhbWVzLCB0aW1lKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6dXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSB7CisgICAgaWYgKG1TdHJlYW0tPnVwZGF0ZV9zaW5rX21ldGFkYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBjb25zdCBzaW5rX21ldGFkYXRhX3QgbWV0YWRhdGEgeworICAgICAgICAudHJhY2tfY291bnQgPSBzaW5rTWV0YWRhdGEudHJhY2tzLnNpemUoKSwKKyAgICAgICAgLy8gY29uc3QgY2FzdCBpcyBmaW5lIGFzIGl0IGlzIGluIGEgY29uc3Qgc3RydWN0dXJlCisgICAgICAgIC50cmFja3MgPSBjb25zdF9jYXN0PHJlY29yZF90cmFja19tZXRhZGF0YSo+KHNpbmtNZXRhZGF0YS50cmFja3MuZGF0YSgpKSwKKyAgICB9OworICAgIG1TdHJlYW0tPnVwZGF0ZV9zaW5rX21ldGFkYXRhKG1TdHJlYW0sICZtZXRhZGF0YSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzdGFydCgpIHsKKyAgICBpZiAobVN0cmVhbS0+c3RhcnQgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zdGFydChtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c3RvcCgpIHsKKyAgICBpZiAobVN0cmVhbS0+c3RvcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnN0b3AobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7CisgICAgaWYgKG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlciA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlcihtU3RyZWFtLCBtaW5TaXplRnJhbWVzLCBpbmZvKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgeworICAgIGlmIChtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uKG1TdHJlYW0sIHBvc2l0aW9uKTsKK30KKworI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgorc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0QWN0aXZlTWljcm9waG9uZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzIF9fdW51c2VkKSB7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcykgeworICAgIGlmIChtU3RyZWFtLT5nZXRfYWN0aXZlX21pY3JvcGhvbmVzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBzaXplX3QgYWN0dWFsX21pY3MgPSBBVURJT19NSUNST1BIT05FX01BWF9DT1VOVDsKKyAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgbWljX2FycmF5W0FVRElPX01JQ1JPUEhPTkVfTUFYX0NPVU5UXTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RyZWFtLT5nZXRfYWN0aXZlX21pY3JvcGhvbmVzKG1TdHJlYW0sICZtaWNfYXJyYXlbMF0sICZhY3R1YWxfbWljcyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3R1YWxfbWljczsgaSsrKSB7CisgICAgICAgIG1lZGlhOjpNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lSW5mbyA9IG1lZGlhOjpNaWNyb3Bob25lSW5mbyhtaWNfYXJyYXlbaV0pOworICAgICAgICBtaWNyb3Bob25lcy0+cHVzaF9iYWNrKG1pY3JvcGhvbmVJbmZvKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZgorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZDE5NjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbExvY2FsLmgKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF9ICisKKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlICJTdHJlYW1Qb3dlckxvZy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitjbGFzcyBEZXZpY2VIYWxMb2NhbDsKKworY2xhc3MgU3RyZWFtSGFsTG9jYWwgOiBwdWJsaWMgdmlydHVhbCBTdHJlYW1IYWxJbnRlcmZhY2UKK3sKKyAgcHVibGljOgorICAgIC8vIFJldHVybiB0aGUgc2FtcGxpbmcgcmF0ZSBpbiBIeiAtIGVnLiA0NDEwMC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpOworCisgICAgLy8gUmV0dXJuIHNpemUgb2YgaW5wdXQvb3V0cHV0IGJ1ZmZlciBpbiBieXRlcyBmb3IgdGhpcyBzdHJlYW0gLSBlZy4gNDgwMC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIC8vIFJldHVybiB0aGUgY2hhbm5lbCBtYXNrLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spOworCisgICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBmb3JtYXQgLSBlLmcuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOworCisgICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qcm9wZXJ0aWVzKAorICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKKworICAgIC8vIFNldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7CisKKyAgICAvLyBHZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7CisKKyAgICAvLyBBZGQgb3IgcmVtb3ZlIHRoZSBlZmZlY3Qgb24gdGhlIHN0cmVhbS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOworCisgICAgLy8gUHV0IHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dC9vdXRwdXQgaW50byBzdGFuZGJ5IG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFuZGJ5KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKworICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpID0gMDsKKworICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSA9IDA7CisKKyAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSA9IDA7CisKKyAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgPSAwOworCisgICAgLy8gU2V0IHRoZSBwcmlvcml0eSBvZiB0aGUgdGhyZWFkIHRoYXQgaW50ZXJhY3RzIHdpdGggdGhlIEhBTAorICAgIC8vIChtdXN0IG1hdGNoIHRoZSBwcmlvcml0eSBvZiB0aGUgYXVkaW9mbGluZ2VyJ3MgdGhyZWFkIHRoYXQgY2FsbHMgJ3JlYWQnIC8gJ3dyaXRlJykKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSk7CisKKyAgcHJvdGVjdGVkOgorICAgIC8vIFN1YmNsYXNzZXMgY2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIFN0cmVhbUhhbExvY2FsKGF1ZGlvX3N0cmVhbV90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpOworCisgICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIHN0cmVhbS4KKyAgICB2aXJ0dWFsIH5TdHJlYW1IYWxMb2NhbCgpOworCisgICAgc3A8RGV2aWNlSGFsTG9jYWw+IG1EZXZpY2U7CisKKyAgICAvLyBtU3RyZWFtUG93ZXJMb2cgaXMgdXNlZCBmb3IgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCisgICAgU3RyZWFtUG93ZXJMb2cgbVN0cmVhbVBvd2VyTG9nOworCisgIHByaXZhdGU6CisgICAgYXVkaW9fc3RyZWFtX3QgKm1TdHJlYW07Cit9OworCitjbGFzcyBTdHJlYW1PdXRIYWxMb2NhbCA6IHB1YmxpYyBTdHJlYW1PdXRIYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxMb2NhbCB7CisgIHB1YmxpYzoKKyAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOworCisgICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBoYXJkd2FyZSBkcml2ZXIgZXN0aW1hdGVkIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSk7CisKKyAgICAvLyBVc2UgdGhpcyBtZXRob2QgaW4gc2l0dWF0aW9ucyB3aGVyZSBhdWRpbyBtaXhpbmcgaXMgZG9uZSBpbiB0aGUgaGFyZHdhcmUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOworCisgICAgLy8gU2VsZWN0cyB0aGUgYXVkaW8gcHJlc2VudGF0aW9uIChpZiBhdmFpbGFibGUpLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCk7CisKKyAgICAvLyBXcml0ZSBhdWRpbyBidWZmZXIgdG8gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbik7CisKKyAgICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgd3JpdHRlbiBieSB0aGUgYXVkaW8gZHNwIHRvIERBQyBzaW5jZQorICAgIC8vIHRoZSBvdXRwdXQgaGFzIGV4aXRlZCBzdGFuZGJ5LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcyk7CisKKyAgICAvLyBHZXQgdGhlIGxvY2FsIHRpbWUgYXQgd2hpY2ggdGhlIG5leHQgd3JpdGUgdG8gdGhlIGF1ZGlvIGRyaXZlciB3aWxsIGJlIHByZXNlbnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApOworCisgICAgLy8gU2V0IHRoZSBjYWxsYmFjayBmb3Igbm90aWZ5aW5nIGNvbXBsZXRpb24gb2Ygbm9uLWJsb2NraW5nIHdyaXRlIGFuZCBkcmFpbi4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgcGF1c2UgYW5kIHJlc3VtZSBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKTsKKworICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKKworICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdW1lKCk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgZHJhaW4gb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbik7CisKKyAgICAvLyBSZXF1ZXN0cyBub3RpZmljYXRpb24gd2hlbiBkYXRhIGJ1ZmZlcmVkIGJ5IHRoZSBkcml2ZXIvaGFyZHdhcmUgaGFzIGJlZW4gcGxheWVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZHJhaW4oYm9vbCBlYXJseU5vdGlmeSk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIGZsdXNoIHRoZSBxdWV1ZWQgZGF0YS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCk7CisKKyAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcHJlc2VudGVkIHRvIGFuIGV4dGVybmFsIG9ic2VydmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApOworCisgICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7CisKKyAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisKKyAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKKworICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKTsKKworICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc291cmNlIGhhcyBiZWVuIGNoYW5nZWQuCisgICAgc3RhdHVzX3QgdXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSBvdmVycmlkZTsKKworICBwcml2YXRlOgorICAgIGF1ZGlvX3N0cmVhbV9vdXRfdCAqbVN0cmVhbTsKKyAgICB3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gbUNhbGxiYWNrOworCisgICAgZnJpZW5kIGNsYXNzIERldmljZUhhbExvY2FsOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIFN0cmVhbU91dEhhbExvY2FsKGF1ZGlvX3N0cmVhbV9vdXRfdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKKworICAgIHZpcnR1YWwgflN0cmVhbU91dEhhbExvY2FsKCk7CisKKyAgICBzdGF0aWMgaW50IGFzeW5jQ2FsbGJhY2soc3RyZWFtX2NhbGxiYWNrX2V2ZW50X3QgZXZlbnQsIHZvaWQgKnBhcmFtLCB2b2lkICpjb29raWUpOworfTsKKworY2xhc3MgU3RyZWFtSW5IYWxMb2NhbCA6IHB1YmxpYyBTdHJlYW1JbkhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbExvY2FsIHsKKyAgcHVibGljOgorICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBTZXQgdGhlIGlucHV0IGdhaW4gZm9yIHRoZSBhdWRpbyBkcml2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRHYWluKGZsb2F0IGdhaW4pOworCisgICAgLy8gUmVhZCBhdWRpbyBidWZmZXIgaW4gZnJvbSBkcml2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpOworCisgICAgLy8gUmV0dXJuIHRoZSBhbW91bnQgb2YgaW5wdXQgZnJhbWVzIGxvc3QgaW4gdGhlIGF1ZGlvIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCk7CisKKyAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcmVjZWl2ZWQgYW5kCisgICAgLy8gdGhlIGNsb2NrIHRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZnJhbWUgY291bnQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKTsKKworICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOworCisgICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworCisgICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7CisKKyAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7CisKKyAgICAvLyBHZXQgYWN0aXZlIG1pY3JvcGhvbmVzCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNpbmsgaGFzIGJlZW4gY2hhbmdlZC4KKyAgICBzdGF0dXNfdCB1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIG92ZXJyaWRlOworCisgIHByaXZhdGU6CisgICAgYXVkaW9fc3RyZWFtX2luX3QgKm1TdHJlYW07CisKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsTG9jYWw7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgU3RyZWFtSW5IYWxMb2NhbChhdWRpb19zdHJlYW1faW5fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKKworICAgIHZpcnR1YWwgflN0cmVhbUluSGFsTG9jYWwoKTsKK307CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1Qb3dlckxvZy5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1Qb3dlckxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZDM5MTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbVBvd2VyTG9nLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR19ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR19ICisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL1Bvd2VyTG9nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworY2xhc3MgU3RyZWFtUG93ZXJMb2cgeworcHVibGljOgorICAgIFN0cmVhbVBvd2VyTG9nKCkgOgorICAgICAgICBtSXNVc2VyRGVidWdPckVuZ0J1aWxkKGlzX3VzZXJkZWJ1Z19vcl9lbmdfYnVpbGQoKSksCisgICAgICAgIG1Qb3dlckxvZyhudWxscHRyKSwKKyAgICAgICAgbUZyYW1lU2l6ZSgwKSB7CisgICAgICAgIC8vIHVzZSBpbml0KCkgdG8gc2V0IHVwIHRoZSBwb3dlciBsb2cuCisgICAgfQorCisgICAgflN0cmVhbVBvd2VyTG9nKCkgeworICAgICAgICBwb3dlcl9sb2dfZGVzdHJveShtUG93ZXJMb2cpOyAvLyBPSyBmb3IgbnVsbCBtUG93ZXJMb2cKKyAgICAgICAgbVBvd2VyTG9nID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICAvLyBBIG9uZS10aW1lIGluaXRpYWxpemF0aW9uIChkbyBub3QgY2FsbCB0d2ljZSkgYmVmb3JlIHVzaW5nIFN0cmVhbVBvd2VyTG9nLgorICAgIHZvaWQgaW5pdCh1aW50MzJfdCBzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CisgICAgICAgIGlmIChtUG93ZXJMb2cgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gTm90ZTogQSB3YXkgdG8gZ2V0IGNoYW5uZWwgY291bnQgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCBjaGFubmVsIG1hc2tzCisgICAgICAgICAgICAvLyBidXQgZG9lcyBub3QgY2hlY2sgdmFsaWRpdHkgb2YgdGhlIGNoYW5uZWwgbWFzay4KKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhjaGFubmVsTWFzaykpOworICAgICAgICAgICAgbUZyYW1lU2l6ZSA9IGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KTsKKyAgICAgICAgICAgIGlmIChtRnJhbWVTaXplID4gMCkgeworICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dGcmFtZXNQZXJFbnRyeSA9CisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXNhbXBsZVJhdGUgKiBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMgLyAxMDAwOworICAgICAgICAgICAgICAgIG1Qb3dlckxvZyA9IHBvd2VyX2xvZ19jcmVhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAga1Bvd2VyTG9nRW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGtQb3dlckxvZ0ZyYW1lc1BlckVudHJ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBtUG93ZXJMb2cgbWF5IGJlIE5VTEwgKG5vdCB0aGUgcmlnaHQgYnVpbGQsIGZvcm1hdCBub3QgYWNjZXB0ZWQsIGV0Yy4pLgorICAgIH0KKworICAgIC8vIER1bXAgdGhlIHBvd2VyIGxvZyB0byBmZC4KKyAgICB2b2lkIGR1bXAoaW50IGZkKSBjb25zdCB7CisgICAgICAgIC8vIE9LIGZvciBudWxsIG1Qb3dlckxvZworICAgICAgICAodm9pZClwb3dlcl9sb2dfZHVtcCgKKyAgICAgICAgICAgICAgICBtUG93ZXJMb2csIGZkLCAiICAgICAgIiAvKiBwcmVmaXggKi8sIGtQb3dlckxvZ0xpbmVzLCAwIC8qIGxpbWl0X25zICovKTsKKyAgICB9CisKKyAgICAvLyBMb2cgdGhlIGF1ZGlvIGRhdGEgY29udGFpbmVkIGluIGJ1ZmZlci4KKyAgICB2b2lkIGxvZyhjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplSW5CeXRlcykgY29uc3QgeworICAgICAgICBpZiAobVBvd2VyTG9nICE9IG51bGxwdHIpIHsgLy8gbUZyYW1lU2l6ZSBpcyBhbHdheXMgbm9uemVybyBpZiBtUG93ZXJMb2cgZXhpc3RzLgorICAgICAgICAgICAgcG93ZXJfbG9nX2xvZygKKyAgICAgICAgICAgICAgICAgICAgbVBvd2VyTG9nLCBidWZmZXIsIHNpemVJbkJ5dGVzIC8gbUZyYW1lU2l6ZSwgYXVkaW9fdXRpbHNfZ2V0X3JlYWxfdGltZV9ucygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUlzVXNlckRlYnVnT3JFbmdCdWlsZDsKKyAgICB9CisKK3ByaXZhdGU6CisKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgaXNfdXNlcmRlYnVnX29yX2VuZ19idWlsZCgpIHsKKyAgICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgICAgICAodm9pZClwcm9wZXJ0eV9nZXQoInJvLmJ1aWxkLnR5cGUiLCB2YWx1ZSwgInVua25vd24iKTsgLy8gaWdub3JlIGFjdHVhbCBsZW5ndGgKKyAgICAgICAgcmV0dXJuIHN0cmNtcCh2YWx1ZSwgInVzZXJkZWJ1ZyIpID09IDAgfHwgc3RyY21wKHZhbHVlLCAiZW5nIikgPT0gMDsKKyAgICB9CisKKyAgICAvLyBBdWRpbyBzaWduYWwgcG93ZXIgbG9nIGNvbmZpZ3VyYXRpb24uCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dMaW5lcyA9IDQwOworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zID0gNTA7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dFbnRyaWVzID0gKDEgLyogbWludXRlcyAqLyAqIDYwIC8qIHNlY29uZHMgKi8gKiAxMDAwIC8qIG1zZWMgKi8KKyAgICAgICAgICAgIC8ga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zKTsKKworICAgIGNvbnN0IGJvb2wgbUlzVXNlckRlYnVnT3JFbmdCdWlsZDsKKyAgICBwb3dlcl9sb2dfdCAqbVBvd2VyTG9nOworICAgIHNpemVfdCBtRnJhbWVTaXplOworfTsKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1ZlcnNpb25VdGlscy5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9WZXJzaW9uVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjBhNDJhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9WZXJzaW9uVXRpbHMuaApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1ZFUlNJT05fVVRJTFNfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1ZFUlNJT05fVVRJTFNfSAorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL3R5cGVzLmgpCisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OlBhcmFtZXRlclZhbHVlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpSZXN1bHQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworbmFtZXNwYWNlIHV0aWxzIHsKKworI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIENhbGxiYWNrPgorUmV0dXJuPHZvaWQ+IGdldFBhcmFtZXRlcnMoVCYgb2JqZWN0LCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gLypjb250ZXh0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4ga2V5cywgQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICByZXR1cm4gb2JqZWN0LT5nZXRQYXJhbWV0ZXJzKGtleXMsIGNhbGxiYWNrKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitSZXR1cm48UmVzdWx0PiBzZXRQYXJhbWV0ZXJzKFQmIG9iamVjdCwgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IC8qY29udGV4dCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4ga2V5cykgeworICAgIHJldHVybiBvYmplY3QtPnNldFBhcmFtZXRlcnMoa2V5cyk7Cit9CisjZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBDYWxsYmFjaz4KK1JldHVybjx2b2lkPiBnZXRQYXJhbWV0ZXJzKFQmIG9iamVjdCwgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4ga2V5cywgQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICByZXR1cm4gb2JqZWN0LT5nZXRQYXJhbWV0ZXJzKGNvbnRleHQsIGtleXMsIGNhbGxiYWNrKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitSZXR1cm48UmVzdWx0PiBzZXRQYXJhbWV0ZXJzKFQmIG9iamVjdCwgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBrZXlzKSB7CisgICAgcmV0dXJuIG9iamVjdC0+c2V0UGFyYW1ldGVycyhjb250ZXh0LCBrZXlzKTsKK30KKyNlbmRpZgorCit9IC8vIG5hbWVzcGFjZSB1dGlscworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfVkVSU0lPTl9VVElMU19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL2luY2x1ZGUvbGliYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvaW5jbHVkZS9saWJhdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MzE5ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL2luY2x1ZGUvbGliYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuaApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0ZBQ1RPUllfSEFMX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0ZBQ1RPUllfSEFMX0hJRExfSAorCisvKiogQGZpbGUgTGlicmFyeSBlbnRyeSBwb2ludHMgdG8gY3JlYXRlIHRoZSBIQUwgZmFjdG9yaWVzLiAqLworCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgZWZmZWN0IHsKK25hbWVzcGFjZSBWMl8wIHsKK3NwPEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlPiBjcmVhdGVFZmZlY3RzRmFjdG9yeUhhbCgpOworfSAvLyBuYW1lc3BhY2UgVjJfMAorCituYW1lc3BhY2UgVjRfMCB7CitzcDxFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZT4gY3JlYXRlRWZmZWN0c0ZhY3RvcnlIYWwoKTsKK30gLy8gbmFtZXNwYWNlIFY0XzAKKworbmFtZXNwYWNlIFY1XzAgeworc3A8RWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U+IGNyZWF0ZUVmZmVjdHNGYWN0b3J5SGFsKCk7Cit9IC8vIG5hbWVzcGFjZSBWNV8wCit9IC8vIG5hbWVzcGFjZSBlZmZlY3QKKworbmFtZXNwYWNlIFYyXzAgeworc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IGNyZWF0ZURldmljZXNGYWN0b3J5SGFsKCk7Cit9IC8vIG5hbWVzcGFjZSBWMl8wCisKK25hbWVzcGFjZSBWNF8wIHsKK3NwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBjcmVhdGVEZXZpY2VzRmFjdG9yeUhhbCgpOworfSAvLyBuYW1lc3BhY2UgVjRfMAorCituYW1lc3BhY2UgVjVfMCB7CitzcDxEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZT4gY3JlYXRlRGV2aWNlc0ZhY3RvcnlIYWwoKTsKK30gLy8gbmFtZXNwYWNlIFY1XzAKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9GQUNUT1JZX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oCmluZGV4IGM5NjllMjguLmJkNzFkYzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaApAQCAtMTA5LDYgKzEwOSw5IEBACiAgICAgLy8gVXNlIHRoaXMgbWV0aG9kIGluIHNpdHVhdGlvbnMgd2hlcmUgYXVkaW8gbWl4aW5nIGlzIGRvbmUgaW4gdGhlIGhhcmR3YXJlLgogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSA9IDA7CiAKKyAgICAvLyBTZWxlY3RzIHRoZSBhdWRpbyBwcmVzZW50YXRpb24gKGlmIGF2YWlsYWJsZSkuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKSA9IDA7CisKICAgICAvLyBXcml0ZSBhdWRpbyBidWZmZXIgdG8gZHJpdmVyLgogICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbikgPSAwOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlci5jcHAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlci5jcHAKaW5kZXggZjNlYTgyNi4uODY3MTFkZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXIuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb01peGVyLmNwcApAQCAtMTM2LDYgKzEzNiw5IEBACiAKICAgICAgICAgLy8gbm8gaW5pdGlhbGl6YXRpb24gbmVlZGVkCiAgICAgICAgIC8vIHQtPmZyYW1lQ291bnQKKyAgICAgICAgdC0+bUhhcHRpY0NoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2sgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEw7CisgICAgICAgIHQtPm1IYXB0aWNDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sodC0+bUhhcHRpY0NoYW5uZWxNYXNrKTsKKyAgICAgICAgY2hhbm5lbE1hc2sgJj0gfkFVRElPX0NIQU5ORUxfSEFQVElDX0FMTDsKICAgICAgICAgdC0+Y2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKTsKICAgICAgICAgdC0+ZW5hYmxlZCA9IGZhbHNlOwogICAgICAgICBBTE9HVl9JRihhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMoY2hhbm5lbE1hc2spICE9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywKQEAgLTE2Miw2ICsxNjUsMTUgQEAKICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX1BPU0lUSU9OLCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pOwogICAgICAgICB0LT5tTWl4ZXJDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sodC0+bU1peGVyQ2hhbm5lbE1hc2spOwogICAgICAgICB0LT5tUGxheWJhY2tSYXRlID0gQVVESU9fUExBWUJBQ0tfUkFURV9ERUZBVUxUOworICAgICAgICAvLyBoYXB0aWMKKyAgICAgICAgdC0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCA9IGZhbHNlOworICAgICAgICB0LT5tTWl4ZXJIYXB0aWNDaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKKyAgICAgICAgdC0+bU1peGVySGFwdGljQ2hhbm5lbENvdW50ID0gMDsKKyAgICAgICAgdC0+bUFkanVzdEluQ2hhbm5lbENvdW50ID0gdC0+Y2hhbm5lbENvdW50ICsgdC0+bUhhcHRpY0NoYW5uZWxDb3VudDsKKyAgICAgICAgdC0+bUFkanVzdE91dENoYW5uZWxDb3VudCA9IHQtPmNoYW5uZWxDb3VudCArIHQtPm1NaXhlckhhcHRpY0NoYW5uZWxDb3VudDsKKyAgICAgICAgdC0+bUFkanVzdE5vbkRlc3RydWN0aXZlSW5DaGFubmVsQ291bnQgPSB0LT5tQWRqdXN0T3V0Q2hhbm5lbENvdW50OworICAgICAgICB0LT5tQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVPdXRDaGFubmVsQ291bnQgPSB0LT5jaGFubmVsQ291bnQ7CisgICAgICAgIHQtPm1LZWVwQ29udHJhY3RlZENoYW5uZWxzID0gZmFsc2U7CiAgICAgICAgIC8vIENoZWNrIHRoZSBkb3dubWl4aW5nIChvciB1cG1peGluZykgcmVxdWlyZW1lbnRzLgogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSB0LT5wcmVwYXJlRm9yRG93bm1peCgpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CkBAIC0xNzEsNiArMTgzLDggQEAKICAgICAgICAgLy8gcHJlcGFyZUZvckRvd25taXgoKSBtYXkgY2hhbmdlIG1Eb3dubWl4UmVxdWlyZXNGb3JtYXQKICAgICAgICAgQUxPR1ZWKCJtTWl4ZXJGb3JtYXQ6JSN4ICBtTWl4ZXJJbkZvcm1hdDolI3hcbiIsIHQtPm1NaXhlckZvcm1hdCwgdC0+bU1peGVySW5Gb3JtYXQpOwogICAgICAgICB0LT5wcmVwYXJlRm9yUmVmb3JtYXQoKTsKKyAgICAgICAgdC0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUobUZyYW1lQ291bnQpOworICAgICAgICB0LT5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMoKTsKIAogICAgICAgICBtVHJhY2tzW25hbWVdID0gdDsKICAgICAgICAgcmV0dXJuIE9LOwpAQCAtMTg1LDEzICsxOTksMjAgQEAKICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFleGlzdHMobmFtZSksICJpbnZhbGlkIG5hbWU6ICVkIiwgbmFtZSk7CiAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdHJhY2sgPSBtVHJhY2tzW25hbWVdOwogCi0gICAgaWYgKHRyYWNrQ2hhbm5lbE1hc2sgPT0gdHJhY2stPmNoYW5uZWxNYXNrCi0gICAgICAgICAgICAmJiBtaXhlckNoYW5uZWxNYXNrID09IHRyYWNrLT5tTWl4ZXJDaGFubmVsTWFzaykgeworICAgIGlmICh0cmFja0NoYW5uZWxNYXNrID09ICh0cmFjay0+Y2hhbm5lbE1hc2sgfCB0cmFjay0+bUhhcHRpY0NoYW5uZWxNYXNrKQorICAgICAgICAgICAgJiYgbWl4ZXJDaGFubmVsTWFzayA9PSAodHJhY2stPm1NaXhlckNoYW5uZWxNYXNrIHwgdHJhY2stPm1NaXhlckhhcHRpY0NoYW5uZWxNYXNrKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBubyBuZWVkIHRvIGNoYW5nZQogICAgIH0KKyAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBoYXB0aWNDaGFubmVsTWFzayA9IHRyYWNrQ2hhbm5lbE1hc2sgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEw7CisgICAgdHJhY2tDaGFubmVsTWFzayAmPSB+QVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMOworICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IG1peGVySGFwdGljQ2hhbm5lbE1hc2sgPSBtaXhlckNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMOworICAgIG1peGVyQ2hhbm5lbE1hc2sgJj0gfkFVRElPX0NIQU5ORUxfSEFQVElDX0FMTDsKICAgICAvLyBhbHdheXMgcmVjb21wdXRlIGZvciBib3RoIGNoYW5uZWwgbWFza3MgZXZlbiBpZiBvbmx5IG9uZSBoYXMgY2hhbmdlZC4KICAgICBjb25zdCB1aW50MzJfdCB0cmFja0NoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayh0cmFja0NoYW5uZWxNYXNrKTsKICAgICBjb25zdCB1aW50MzJfdCBtaXhlckNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtaXhlckNoYW5uZWxNYXNrKTsKKyAgICBjb25zdCB1aW50MzJfdCBoYXB0aWNDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soaGFwdGljQ2hhbm5lbE1hc2spOworICAgIGNvbnN0IHVpbnQzMl90IG1peGVySGFwdGljQ2hhbm5lbENvdW50ID0KKyAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtaXhlckhhcHRpY0NoYW5uZWxNYXNrKTsKIAogICAgIEFMT0dfQVNTRVJUKCh0cmFja0NoYW5uZWxDb3VudCA8PSBNQVhfTlVNX0NIQU5ORUxTX1RPX0RPV05NSVgpCiAgICAgICAgICAgICAmJiB0cmFja0NoYW5uZWxDb3VudApAQCAtMjAwLDYgKzIyMSwyNCBAQAogICAgIHRyYWNrLT5jaGFubmVsQ291bnQgPSB0cmFja0NoYW5uZWxDb3VudDsKICAgICB0cmFjay0+bU1peGVyQ2hhbm5lbE1hc2sgPSBtaXhlckNoYW5uZWxNYXNrOwogICAgIHRyYWNrLT5tTWl4ZXJDaGFubmVsQ291bnQgPSBtaXhlckNoYW5uZWxDb3VudDsKKyAgICB0cmFjay0+bUhhcHRpY0NoYW5uZWxNYXNrID0gaGFwdGljQ2hhbm5lbE1hc2s7CisgICAgdHJhY2stPm1IYXB0aWNDaGFubmVsQ291bnQgPSBoYXB0aWNDaGFubmVsQ291bnQ7CisgICAgdHJhY2stPm1NaXhlckhhcHRpY0NoYW5uZWxNYXNrID0gbWl4ZXJIYXB0aWNDaGFubmVsTWFzazsKKyAgICB0cmFjay0+bU1peGVySGFwdGljQ2hhbm5lbENvdW50ID0gbWl4ZXJIYXB0aWNDaGFubmVsQ291bnQ7CisKKyAgICBpZiAodHJhY2stPm1IYXB0aWNDaGFubmVsQ291bnQgPiAwKSB7CisgICAgICAgIHRyYWNrLT5tQWRqdXN0SW5DaGFubmVsQ291bnQgPSB0cmFjay0+Y2hhbm5lbENvdW50ICsgdHJhY2stPm1IYXB0aWNDaGFubmVsQ291bnQ7CisgICAgICAgIHRyYWNrLT5tQWRqdXN0T3V0Q2hhbm5lbENvdW50ID0gdHJhY2stPmNoYW5uZWxDb3VudCArIHRyYWNrLT5tTWl4ZXJIYXB0aWNDaGFubmVsQ291bnQ7CisgICAgICAgIHRyYWNrLT5tQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVJbkNoYW5uZWxDb3VudCA9IHRyYWNrLT5tQWRqdXN0T3V0Q2hhbm5lbENvdW50OworICAgICAgICB0cmFjay0+bUFkanVzdE5vbkRlc3RydWN0aXZlT3V0Q2hhbm5lbENvdW50ID0gdHJhY2stPmNoYW5uZWxDb3VudDsKKyAgICAgICAgdHJhY2stPm1LZWVwQ29udHJhY3RlZENoYW5uZWxzID0gdHJhY2stPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdHJhY2stPm1BZGp1c3RJbkNoYW5uZWxDb3VudCA9IDA7CisgICAgICAgIHRyYWNrLT5tQWRqdXN0T3V0Q2hhbm5lbENvdW50ID0gMDsKKyAgICAgICAgdHJhY2stPm1BZGp1c3ROb25EZXN0cnVjdGl2ZUluQ2hhbm5lbENvdW50ID0gMDsKKyAgICAgICAgdHJhY2stPm1BZGp1c3ROb25EZXN0cnVjdGl2ZU91dENoYW5uZWxDb3VudCA9IDA7CisgICAgICAgIHRyYWNrLT5tS2VlcENvbnRyYWN0ZWRDaGFubmVscyA9IGZhbHNlOworICAgIH0KIAogICAgIC8vIGNoYW5uZWwgbWFza3MgaGF2ZSBjaGFuZ2VkLCBkb2VzIHRoaXMgdHJhY2sgbmVlZCBhIGRvd25taXhlcj8KICAgICAvLyB1cGRhdGUgdG8gdHJ5IHVzaW5nIG91ciBkZXNpcmVkIGZvcm1hdCAoaWYgd2UgYXJlbid0IGFscmVhZHkgdXNpbmcgaXQpCkBAIC0yMTIsNiArMjUxLDkgQEAKICAgICAvLyBkbyBpdCBhZnRlciBkb3dubWl4IHNpbmNlIHRyYWNrIGZvcm1hdCBtYXkgY2hhbmdlIQogICAgIHRyYWNrLT5wcmVwYXJlRm9yUmVmb3JtYXQoKTsKIAorICAgIHRyYWNrLT5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZShtRnJhbWVDb3VudCk7CisgICAgdHJhY2stPnByZXBhcmVGb3JBZGp1c3RDaGFubmVscygpOworCiAgICAgaWYgKHRyYWNrLT5tUmVzYW1wbGVyLmdldCgpICE9IG51bGxwdHIpIHsKICAgICAgICAgLy8gcmVzYW1wbGVyIGNoYW5uZWxzIG1heSBoYXZlIGNoYW5nZWQuCiAgICAgICAgIGNvbnN0IHVpbnQzMl90IHJlc2V0VG9TYW1wbGVSYXRlID0gdHJhY2stPnNhbXBsZVJhdGU7CkBAIC0yNjAsMTQgKzMwMiwxOSBAQAogICAgIGlmIChhdWRpb19jaGFubmVsX21hc2tfZ2V0X3JlcHJlc2VudGF0aW9uKGNoYW5uZWxNYXNrKQogICAgICAgICAgICAgICAgID09IEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fUE9TSVRJT04KICAgICAgICAgICAgICYmIERvd25taXhlckJ1ZmZlclByb3ZpZGVyOjppc011bHRpY2hhbm5lbENhcGFibGUoKSkgewotICAgICAgICBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXIucmVzZXQobmV3IERvd25taXhlckJ1ZmZlclByb3ZpZGVyKGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgIG1NaXhlckNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIC8qIFRPRE86IHVzZSBtTWl4ZXJJbkZvcm1hdCwgbm93IG9ubHkgUENNIDE2ICovLAotICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIHNlc3Npb25JZCwga0NvcHlCdWZmZXJGcmFtZUNvdW50KSk7Ci0gICAgICAgIGlmIChzdGF0aWNfY2FzdDxEb3dubWl4ZXJCdWZmZXJQcm92aWRlciAqPihtRG93bm1peGVyQnVmZmVyUHJvdmlkZXIuZ2V0KCkpLT5pc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgIG1Eb3dubWl4UmVxdWlyZXNGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsgLy8gUENNIDE2IGJpdCByZXF1aXJlZCBmb3IgZG93bm1peAotICAgICAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKworICAgICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGEgZmxvYXQgb3IgaW50MTYgZG93bm1peGVyLCBpbiB0aGF0IG9yZGVyLgorICAgICAgICBmb3IgKGNvbnN0IGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA6IHsgQVVESU9fRk9STUFUX1BDTV9GTE9BVCwgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgfSkgeworICAgICAgICAgICAgbURvd25taXhlckJ1ZmZlclByb3ZpZGVyLnJlc2V0KG5ldyBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcigKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIG1NaXhlckNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIHNlc3Npb25JZCwga0NvcHlCdWZmZXJGcmFtZUNvdW50KSk7CisgICAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8RG93bm1peGVyQnVmZmVyUHJvdmlkZXIgKj4obURvd25taXhlckJ1ZmZlclByb3ZpZGVyLmdldCgpKQorICAgICAgICAgICAgICAgICAgICAtPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgICAgIG1Eb3dubWl4UmVxdWlyZXNGb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgICAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLy8gbURvd25taXhlckJ1ZmZlclByb3ZpZGVyIHJlc2V0IGJlbG93LgogICAgIH0KQEAgLTMzNSw5ICszODIsODIgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3ZvaWQgQXVkaW9NaXhlcjo6VHJhY2s6OnVucHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCkKK3sKKyAgICBBTE9HVigiQVVESU9NSVhFUjo6dW5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMiKTsKKyAgICBpZiAobUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBtQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlci5yZXNldChudWxscHRyKTsKKyAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvTWl4ZXI6OlRyYWNrOjpwcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMoKQoreworICAgIEFMT0dWKCJBdWRpb01peGVyOjpwcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMoJXApIHdpdGggaW5DaGFubmVsQ291bnQ6ICV1LCBvdXRDaGFubmVsQ291bnQ6ICV1IiwKKyAgICAgICAgICAgIHRoaXMsIG1BZGp1c3RJbkNoYW5uZWxDb3VudCwgbUFkanVzdE91dENoYW5uZWxDb3VudCk7CisgICAgdW5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMoKTsKKyAgICBpZiAobUFkanVzdEluQ2hhbm5lbENvdW50ICE9IG1BZGp1c3RPdXRDaGFubmVsQ291bnQpIHsKKyAgICAgICAgbUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIucmVzZXQobmV3IEFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIoCisgICAgICAgICAgICAgICAgbUZvcm1hdCwgbUFkanVzdEluQ2hhbm5lbENvdW50LCBtQWRqdXN0T3V0Q2hhbm5lbENvdW50LCBrQ29weUJ1ZmZlckZyYW1lQ291bnQpKTsKKyAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEF1ZGlvTWl4ZXI6OlRyYWNrOjp1bnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKCkKK3sKKyAgICBBTE9HVigiQVVESU9NSVhFUjo6dW5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZSIpOworICAgIGlmIChtQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5yZXNldChudWxscHRyKTsKKyAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvTWl4ZXI6OlRyYWNrOjpwcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZShzaXplX3QgZnJhbWVzKQoreworICAgIEFMT0dWKCJBdWRpb01peGVyOjpwcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZSglcCkgd2l0aCBpbkNoYW5uZWxDb3VudDogJXUsICIKKyAgICAgICAgICAib3V0Q2hhbm5lbENvdW50OiAldSwga2VlcENvbnRyYWN0ZWRDaGFubmVsczogJWQiLAorICAgICAgICAgICAgdGhpcywgbUFkanVzdE5vbkRlc3RydWN0aXZlSW5DaGFubmVsQ291bnQsIG1BZGp1c3ROb25EZXN0cnVjdGl2ZU91dENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIG1LZWVwQ29udHJhY3RlZENoYW5uZWxzKTsKKyAgICB1bnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKCk7CisgICAgaWYgKG1BZGp1c3ROb25EZXN0cnVjdGl2ZUluQ2hhbm5lbENvdW50ICE9IG1BZGp1c3ROb25EZXN0cnVjdGl2ZU91dENoYW5uZWxDb3VudCkgeworICAgICAgICB1aW50OF90KiBidWZmZXIgPSBtS2VlcENvbnRyYWN0ZWRDaGFubmVscworICAgICAgICAgICAgICAgID8gKHVpbnQ4X3QqKW1haW5CdWZmZXIgKyBmcmFtZXMgKiBhdWRpb19ieXRlc19wZXJfZnJhbWUoCisgICAgICAgICAgICAgICAgICAgICAgICBtTWl4ZXJDaGFubmVsQ291bnQsIG1NaXhlckZvcm1hdCkKKyAgICAgICAgICAgICAgICA6IE5VTEw7CisgICAgICAgIG1BZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIucmVzZXQoCisgICAgICAgICAgICAgICAgbmV3IEFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBtQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVJbkNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BZGp1c3ROb25EZXN0cnVjdGl2ZU91dENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1LZWVwQ29udHJhY3RlZENoYW5uZWxzID8gbU1peGVyRm9ybWF0IDogQVVESU9fRk9STUFUX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIpKTsKKyAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEF1ZGlvTWl4ZXI6OlRyYWNrOjpjbGVhckNvbnRyYWN0ZWRCdWZmZXIoKQoreworICAgIGlmIChtQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgc3RhdGljX2Nhc3Q8QWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyKj4oCisgICAgICAgICAgICAgICAgbUFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5nZXQoKSktPmNsZWFyQ29udHJhY3RlZEZyYW1lcygpOworICAgIH0KK30KKwogdm9pZCBBdWRpb01peGVyOjpUcmFjazo6cmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKQogeworICAgIC8vIGNvbmZpZ3VyZSBmcm9tIHVwc3RyZWFtIHRvIGRvd25zdHJlYW0gYnVmZmVyIHByb3ZpZGVycy4KICAgICBidWZmZXJQcm92aWRlciA9IG1JbnB1dEJ1ZmZlclByb3ZpZGVyOworICAgIGlmIChtQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyLT5zZXRCdWZmZXJQcm92aWRlcihidWZmZXJQcm92aWRlcik7CisgICAgICAgIGJ1ZmZlclByb3ZpZGVyID0gbUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIuZ2V0KCk7CisgICAgfQorICAgIGlmIChtQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci0+c2V0QnVmZmVyUHJvdmlkZXIoYnVmZmVyUHJvdmlkZXIpOworICAgICAgICBidWZmZXJQcm92aWRlciA9IG1BZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIuZ2V0KCk7CisgICAgfQogICAgIGlmIChtUmVmb3JtYXRCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgIG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLT5zZXRCdWZmZXJQcm92aWRlcihidWZmZXJQcm92aWRlcik7CiAgICAgICAgIGJ1ZmZlclByb3ZpZGVyID0gbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIuZ2V0KCk7CkBAIC01MzIsNyArNjUyLDggQEAKICAgICAgICAgY2FzZSBDSEFOTkVMX01BU0s6IHsKICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IHRyYWNrQ2hhbm5lbE1hc2sgPQogICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190Pih2YWx1ZUludCk7Ci0gICAgICAgICAgICBpZiAoc2V0Q2hhbm5lbE1hc2tzKG5hbWUsIHRyYWNrQ2hhbm5lbE1hc2ssIHRyYWNrLT5tTWl4ZXJDaGFubmVsTWFzaykpIHsKKyAgICAgICAgICAgIGlmIChzZXRDaGFubmVsTWFza3MobmFtZSwgdHJhY2tDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgKHRyYWNrLT5tTWl4ZXJDaGFubmVsTWFzayB8IHRyYWNrLT5tTWl4ZXJIYXB0aWNDaGFubmVsTWFzaykpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihUUkFDSywgQ0hBTk5FTF9NQVNLLCAleCkiLCB0cmFja0NoYW5uZWxNYXNrKTsKICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICB9CkBAIC01NDEsNiArNjYyLDkgQEAKICAgICAgICAgICAgIGlmICh0cmFjay0+bWFpbkJ1ZmZlciAhPSB2YWx1ZUJ1ZikgewogICAgICAgICAgICAgICAgIHRyYWNrLT5tYWluQnVmZmVyID0gdmFsdWVCdWY7CiAgICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihUUkFDSywgTUFJTl9CVUZGRVIsICVwKSIsIHZhbHVlQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAodHJhY2stPm1LZWVwQ29udHJhY3RlZENoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZShtRnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtNTcwLDE2ICs2OTQsMjkgQEAKICAgICAgICAgICAgIGlmICh0cmFjay0+bU1peGVyRm9ybWF0ICE9IGZvcm1hdCkgewogICAgICAgICAgICAgICAgIHRyYWNrLT5tTWl4ZXJGb3JtYXQgPSBmb3JtYXQ7CiAgICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihUUkFDSywgTUlYRVJfRk9STUFULCAlI3gpIiwgZm9ybWF0KTsKKyAgICAgICAgICAgICAgICBpZiAodHJhY2stPm1LZWVwQ29udHJhY3RlZENoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZShtRnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBNSVhFUl9DSEFOTkVMX01BU0s6IHsKICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IG1peGVyQ2hhbm5lbE1hc2sgPQogICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4odmFsdWVJbnQpOwotICAgICAgICAgICAgaWYgKHNldENoYW5uZWxNYXNrcyhuYW1lLCB0cmFjay0+Y2hhbm5lbE1hc2ssIG1peGVyQ2hhbm5lbE1hc2spKSB7CisgICAgICAgICAgICBpZiAoc2V0Q2hhbm5lbE1hc2tzKG5hbWUsIHRyYWNrLT5jaGFubmVsTWFzayB8IHRyYWNrLT5tSGFwdGljQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgIG1peGVyQ2hhbm5lbE1hc2spKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihUUkFDSywgTUlYRVJfQ0hBTk5FTF9NQVNLLCAlI3gpIiwgbWl4ZXJDaGFubmVsTWFzayk7CiAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBIQVBUSUNfRU5BQkxFRDogeworICAgICAgICAgICAgY29uc3QgYm9vbCBoYXB0aWNQbGF5YmFja0VuYWJsZWQgPSBzdGF0aWNfY2FzdDxib29sPih2YWx1ZUludCk7CisgICAgICAgICAgICBpZiAodHJhY2stPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQgIT0gaGFwdGljUGxheWJhY2tFbmFibGVkKSB7CisgICAgICAgICAgICAgICAgdHJhY2stPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQgPSBoYXB0aWNQbGF5YmFja0VuYWJsZWQ7CisgICAgICAgICAgICAgICAgdHJhY2stPm1LZWVwQ29udHJhY3RlZENoYW5uZWxzID0gaGFwdGljUGxheWJhY2tFbmFibGVkOworICAgICAgICAgICAgICAgIHRyYWNrLT5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZShtRnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgdHJhY2stPnByZXBhcmVGb3JBZGp1c3RDaGFubmVscygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoInNldFBhcmFtZXRlciB0cmFjazogYmFkIHBhcmFtICVkIiwgcGFyYW0pOwogICAgICAgICB9CkBAIC04MTMsMTQgKzk1MCwxOSBAQAogICAgIGlmICh0cmFjay0+bUlucHV0QnVmZmVyUHJvdmlkZXIgPT0gYnVmZmVyUHJvdmlkZXIpIHsKICAgICAgICAgcmV0dXJuOyAvLyBkb24ndCByZXNldCBhbnkgYnVmZmVyIHByb3ZpZGVycyBpZiBpZGVudGljYWwuCiAgICAgfQotICAgIGlmICh0cmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgewotICAgICAgICB0cmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7Ci0gICAgfSBlbHNlIGlmICh0cmFjay0+bURvd25taXhlckJ1ZmZlclByb3ZpZGVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgdHJhY2stPm1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKKyAgICAvLyByZXNldCBvcmRlciBmcm9tIGRvd25zdHJlYW0gdG8gdXBzdHJlYW0gYnVmZmVyIHByb3ZpZGVycy4KKyAgICBpZiAodHJhY2stPm1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgdHJhY2stPm1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOwogICAgIH0gZWxzZSBpZiAodHJhY2stPm1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICB0cmFjay0+bVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKLSAgICB9IGVsc2UgaWYgKHRyYWNrLT5tVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHRyYWNrLT5tVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKKyAgICB9IGVsc2UgaWYgKHRyYWNrLT5tRG93bm1peGVyQnVmZmVyUHJvdmlkZXIgIT0gbnVsbHB0cikgeworICAgICAgICB0cmFjay0+bURvd25taXhlckJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOworICAgIH0gZWxzZSBpZiAodHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgdHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOworICAgIH0gZWxzZSBpZiAodHJhY2stPm1BZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICB0cmFjay0+bUFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKKyAgICB9IGVsc2UgaWYgKHRyYWNrLT5tQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIHRyYWNrLT5tQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKICAgICB9CiAKICAgICB0cmFjay0+bUlucHV0QnVmZmVyUHJvdmlkZXIgPSBidWZmZXJQcm92aWRlcjsKQEAgLTEyNjQsOCArMTQwNiw4IEBACiAKICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdCA9IG1UcmFja3NbZ3JvdXBbMF1dOwogICAgICAgICBtZW1zZXQodC0+bWFpbkJ1ZmZlciwgMCwKLSAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCAqIHQtPm1NaXhlckNoYW5uZWxDb3VudAotICAgICAgICAgICAgICAgICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZSh0LT5tTWl4ZXJGb3JtYXQpKTsKKyAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHQtPm1NaXhlckNoYW5uZWxDb3VudCArIHQtPm1NaXhlckhhcHRpY0NoYW5uZWxDb3VudCwgdC0+bU1peGVyRm9ybWF0KSk7CiAKICAgICAgICAgLy8gbm93IGNvbnN1bWUgZGF0YQogICAgICAgICBmb3IgKGNvbnN0IGludCBuYW1lIDogZ3JvdXApIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckR5bi5oIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRHluLmgKaW5kZXggOTIxNDRkMC4uNDc5MTQyZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRHluLmgKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRHluLmgKQEAgLTU1LDYgKzU1LDExIEBACiAgICAgdmlydHVhbCBzaXplX3QgcmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKTsKIAorICAgIHZvaWQgcmVzZXQoKSBvdmVycmlkZSB7CisgICAgICAgIEF1ZGlvUmVzYW1wbGVyOjpyZXNldCgpOworICAgICAgICBtSW5CdWZmZXIucmVzZXQoKTsKKyAgICB9CisKICAgICAvLyBNYWtlIGF2YWlsYWJsZSBrZXkgZGVzaWduIGNyaXRlcmlhIGZvciB0ZXN0aW5nCiAgICAgaW50IGdldEhhbGZMZW5ndGgoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtQ29uc3RhbnRzLm1IYWxmTnVtQ29lZnM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzLmggYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzLmgKaW5kZXggYTc0MTY3Ny4uOWI3MGExYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaApAQCAtOTAsNyArOTAsNyBAQAogICAgICAgICBBY2N1bXVsYXRvcjxDSEFOTkVMUy0xLCBUTz46OmFjYyhjb2VmLCBkYXRhKTsKICAgICB9CiAgICAgaW5saW5lIHZvaWQgdm9sdW1lKFRPKiYgb3V0LCBUTyBnYWluKSB7Ci0gICAgICAgICpvdXQrKyA9IHZvbHVtZUFkanVzdCh2YWx1ZSwgZ2Fpbik7CisgICAgICAgICpvdXQrKyArPSB2b2x1bWVBZGp1c3QodmFsdWUsIGdhaW4pOwogICAgICAgICBBY2N1bXVsYXRvcjxDSEFOTkVMUy0xLCBUTz46OnZvbHVtZShvdXQsIGdhaW4pOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcAppbmRleCAzMjBiOGNmLi41YTAzYTBkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcApAQCAtMTksNiArMTksNyBAQAogCiAjZGVmaW5lIF9fU1REQ19DT05TVEFOVF9NQUNST1MKICNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8ZGxmY24uaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9CdWZmZXJQcm92aWRlcnMuY3BwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0J1ZmZlclByb3ZpZGVycy5jcHAKaW5kZXggZDYwNTYwYi4uYjc2NGNjYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0J1ZmZlclByb3ZpZGVycy5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0J1ZmZlclByb3ZpZGVycy5jcHAKQEAgLTE3LDggKzE3LDExIEBACiAjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclByb3ZpZGVyIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Zvcm1hdC5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2NoYW5uZWxzLmg+CiAjaW5jbHVkZSA8c29uaWMuaD4KICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RIYWxJbnRlcmZhY2UuaD4KQEAgLTM1LDEzICszOCw2IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdGF0aWMgaW5saW5lIFQgbWluKGNvbnN0IFQmIGEsIGNvbnN0IFQmIGIpCi17Ci0gICAgcmV0dXJuIGEgPCBiID8gYSA6IGI7Ci19Ci0KIENvcHlCdWZmZXJQcm92aWRlcjo6Q29weUJ1ZmZlclByb3ZpZGVyKHNpemVfdCBpbnB1dEZyYW1lU2l6ZSwKICAgICAgICAgc2l6ZV90IG91dHB1dEZyYW1lU2l6ZSwgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpIDoKICAgICAgICAgbUlucHV0RnJhbWVTaXplKGlucHV0RnJhbWVTaXplKSwKQEAgLTYzLDcgKzU5LDggQEAKIAogQ29weUJ1ZmZlclByb3ZpZGVyOjp+Q29weUJ1ZmZlclByb3ZpZGVyKCkKIHsKLSAgICBBTE9HVigifkNvcHlCdWZmZXJQcm92aWRlciglcCkiLCB0aGlzKTsKKyAgICBBTE9HVigiJXMoJXApICV6dSAlcCAlcCIsCisgICAgICAgICAgIF9fZnVuY19fLCB0aGlzLCBtQnVmZmVyLmZyYW1lQ291bnQsIG1UcmFja0J1ZmZlclByb3ZpZGVyLCBtTG9jYWxCdWZmZXJEYXRhKTsKICAgICBpZiAobUJ1ZmZlci5mcmFtZUNvdW50ICE9IDApIHsKICAgICAgICAgbVRyYWNrQnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJm1CdWZmZXIpOwogICAgIH0KQEAgLTk4LDggKzk1LDggQEAKICAgICAgICAgbUNvbnN1bWVkID0gMDsKICAgICB9CiAgICAgQUxPR19BU1NFUlQobUNvbnN1bWVkIDwgbUJ1ZmZlci5mcmFtZUNvdW50KTsKLSAgICBzaXplX3QgY291bnQgPSBtaW4obUxvY2FsQnVmZmVyRnJhbWVDb3VudCwgbUJ1ZmZlci5mcmFtZUNvdW50IC0gbUNvbnN1bWVkKTsKLSAgICBjb3VudCA9IG1pbihjb3VudCwgcEJ1ZmZlci0+ZnJhbWVDb3VudCk7CisgICAgc2l6ZV90IGNvdW50ID0gc3RkOjptaW4obUxvY2FsQnVmZmVyRnJhbWVDb3VudCwgbUJ1ZmZlci5mcmFtZUNvdW50IC0gbUNvbnN1bWVkKTsKKyAgICBjb3VudCA9IHN0ZDo6bWluKGNvdW50LCBwQnVmZmVyLT5mcmFtZUNvdW50KTsKICAgICBwQnVmZmVyLT5yYXcgPSBtTG9jYWxCdWZmZXJEYXRhOwogICAgIHBCdWZmZXItPmZyYW1lQ291bnQgPSBjb3VudDsKICAgICBjb3B5RnJhbWVzKHBCdWZmZXItPnJhdywgKHVpbnQ4X3QqKW1CdWZmZXIucmF3ICsgbUNvbnN1bWVkICogbUlucHV0RnJhbWVTaXplLApAQCAtMTMzLDYgKzEzMCwxNiBAQAogICAgIG1Db25zdW1lZCA9IDA7CiB9CiAKK3ZvaWQgQ29weUJ1ZmZlclByb3ZpZGVyOjpzZXRCdWZmZXJQcm92aWRlcihBdWRpb0J1ZmZlclByb3ZpZGVyICpwKSB7CisgICAgQUxPR1YoIiVzKCVwKTogbVRyYWNrQnVmZmVyUHJvdmlkZXI6JXAgIG1CdWZmZXIuZnJhbWVDb3VudDolenUiLAorICAgICAgICAgICAgX19mdW5jX18sIHAsIG1UcmFja0J1ZmZlclByb3ZpZGVyLCBtQnVmZmVyLmZyYW1lQ291bnQpOworICAgIGlmIChtVHJhY2tCdWZmZXJQcm92aWRlciA9PSBwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKKyAgICBQYXNzdGhydUJ1ZmZlclByb3ZpZGVyOjpzZXRCdWZmZXJQcm92aWRlcihwKTsKK30KKwogRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBpbnB1dENoYW5uZWxNYXNrLAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBvdXRwdXRDaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LApAQCAtNDc5LDcgKzQ4Niw3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyB0aW1lLXN0cmV0Y2ggdGhlIGRhdGEKLSAgICAgICAgZHN0QXZhaWxhYmxlID0gbWluKG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQgLSBtUmVtYWluaW5nLCBvdXRwdXREZXNpcmVkKTsKKyAgICAgICAgZHN0QXZhaWxhYmxlID0gc3RkOjptaW4obUxvY2FsQnVmZmVyRnJhbWVDb3VudCAtIG1SZW1haW5pbmcsIG91dHB1dERlc2lyZWQpOwogICAgICAgICBzaXplX3Qgc3JjQXZhaWxhYmxlID0gbUJ1ZmZlci5mcmFtZUNvdW50OwogICAgICAgICBwcm9jZXNzRnJhbWVzKCh1aW50OF90KiltTG9jYWxCdWZmZXJEYXRhICsgbVJlbWFpbmluZyAqIG1GcmFtZVNpemUsICZkc3RBdmFpbGFibGUsCiAgICAgICAgICAgICAgICAgbUJ1ZmZlci5yYXcsICZzcmNBdmFpbGFibGUpOwpAQCAtNTI4LDYgKzUzNSwxNiBAQAogICAgIG1SZW1haW5pbmcgPSAwOwogfQogCit2b2lkIFRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXI6OnNldEJ1ZmZlclByb3ZpZGVyKEF1ZGlvQnVmZmVyUHJvdmlkZXIgKnApIHsKKyAgICBBTE9HVigiJXMoJXApOiBtVHJhY2tCdWZmZXJQcm92aWRlcjolcCAgbUJ1ZmZlci5mcmFtZUNvdW50OiV6dSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgcCwgbVRyYWNrQnVmZmVyUHJvdmlkZXIsIG1CdWZmZXIuZnJhbWVDb3VudCk7CisgICAgaWYgKG1UcmFja0J1ZmZlclByb3ZpZGVyID09IHApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSAwOworICAgIFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXI6OnNldEJ1ZmZlclByb3ZpZGVyKHApOworfQorCiBzdGF0dXNfdCBUaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyOjpzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnBsYXliYWNrUmF0ZSkKIHsKICAgICBtUGxheWJhY2tSYXRlID0gcGxheWJhY2tSYXRlOwpAQCAtNTY3LDcgKzU4NCw3IEBACiAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgIC8vIGN5Y2xpY2FsbHkgcmVwZWF0IHRoZSBzb3VyY2UuCiAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgY291bnQgPSAwOyBjb3VudCA8ICpkc3RGcmFtZXM7IGNvdW50ICs9ICpzcmNGcmFtZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJlbWFpbmluZyA9IG1pbigqc3JjRnJhbWVzLCAqZHN0RnJhbWVzIC0gY291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmVtYWluaW5nID0gc3RkOjptaW4oKnNyY0ZyYW1lcywgKmRzdEZyYW1lcyAtIGNvdW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh1aW50OF90Kilkc3RCdWZmZXIgKyBtRnJhbWVTaXplICogY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjQnVmZmVyLCBtRnJhbWVTaXplICogcmVtYWluaW5nKTsKICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC02MDksNSArNjI2LDgzIEBACiAgICAgICAgIH0KICAgICB9CiB9CisKK0FkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXI6OkFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIoYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICBzaXplX3QgaW5DaGFubmVsQ291bnQsIHNpemVfdCBvdXRDaGFubmVsQ291bnQsIHNpemVfdCBmcmFtZUNvdW50KSA6CisgICAgICAgIENvcHlCdWZmZXJQcm92aWRlcigKKyAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfZnJhbWUoaW5DaGFubmVsQ291bnQsIGZvcm1hdCksCisgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKG91dENoYW5uZWxDb3VudCwgZm9ybWF0KSwKKyAgICAgICAgICAgICAgICBmcmFtZUNvdW50KSwKKyAgICAgICAgbUZvcm1hdChmb3JtYXQpLAorICAgICAgICBtSW5DaGFubmVsQ291bnQoaW5DaGFubmVsQ291bnQpLAorICAgICAgICBtT3V0Q2hhbm5lbENvdW50KG91dENoYW5uZWxDb3VudCksCisgICAgICAgIG1TYW1wbGVTaXplSW5CeXRlcyhhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkpCit7CisgICAgQUxPR1YoIkFkanVzdEJ1ZmZlclByb3ZpZGVyKCVwKSglI3gsICV6dSwgJXp1LCAlenUpIiwKKyAgICAgICAgICAgIHRoaXMsIGZvcm1hdCwgaW5DaGFubmVsQ291bnQsIG91dENoYW5uZWxDb3VudCwgZnJhbWVDb3VudCk7Cit9CisKK3ZvaWQgQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcjo6Y29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcykKK3sKKyAgICBhZGp1c3RfY2hhbm5lbHMoc3JjLCBtSW5DaGFubmVsQ291bnQsIGRzdCwgbU91dENoYW5uZWxDb3VudCwgbVNhbXBsZVNpemVJbkJ5dGVzLAorICAgICAgICAgICAgZnJhbWVzICogbUluQ2hhbm5lbENvdW50ICogbVNhbXBsZVNpemVJbkJ5dGVzKTsKK30KKworQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyOjpBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIoCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgc2l6ZV90IGluQ2hhbm5lbENvdW50LCBzaXplX3Qgb3V0Q2hhbm5lbENvdW50LAorICAgICAgICBhdWRpb19mb3JtYXRfdCBjb250cmFjdGVkRm9ybWF0LCBzaXplX3QgY29udHJhY3RlZEZyYW1lQ291bnQsIHZvaWQqIGNvbnRyYWN0ZWRCdWZmZXIpIDoKKyAgICAgICAgQ29weUJ1ZmZlclByb3ZpZGVyKAorICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZShzdGQ6Om1heChpbkNoYW5uZWxDb3VudCwgb3V0Q2hhbm5lbENvdW50KSwgZm9ybWF0KSwKKyAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfZnJhbWUoc3RkOjptYXgoaW5DaGFubmVsQ291bnQsIG91dENoYW5uZWxDb3VudCksIGZvcm1hdCksCisgICAgICAgICAgICAgICAgY29udHJhY3RlZEZyYW1lQ291bnQpLAorICAgICAgICBtRm9ybWF0KGZvcm1hdCksCisgICAgICAgIG1JbkNoYW5uZWxDb3VudChpbkNoYW5uZWxDb3VudCksCisgICAgICAgIG1PdXRDaGFubmVsQ291bnQob3V0Q2hhbm5lbENvdW50KSwKKyAgICAgICAgbVNhbXBsZVNpemVJbkJ5dGVzKGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSksCisgICAgICAgIG1Db250cmFjdGVkQ2hhbm5lbENvdW50KGluQ2hhbm5lbENvdW50IC0gb3V0Q2hhbm5lbENvdW50KSwKKyAgICAgICAgbUNvbnRyYWN0ZWRGb3JtYXQoY29udHJhY3RlZEZvcm1hdCksCisgICAgICAgIG1Db250cmFjdGVkRnJhbWVDb3VudChjb250cmFjdGVkRnJhbWVDb3VudCksCisgICAgICAgIG1Db250cmFjdGVkQnVmZmVyKGNvbnRyYWN0ZWRCdWZmZXIpLAorICAgICAgICBtQ29udHJhY3RlZFdyaXR0ZW5GcmFtZXMoMCkKK3sKKyAgICBBTE9HVigiQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyKCVwKSglI3gsICV6dSwgJXp1LCAlI3gsICVwKSIsCisgICAgICAgICAgICB0aGlzLCBmb3JtYXQsIGluQ2hhbm5lbENvdW50LCBvdXRDaGFubmVsQ291bnQsIGNvbnRyYWN0ZWRGb3JtYXQsIGNvbnRyYWN0ZWRCdWZmZXIpOworICAgIGlmIChtQ29udHJhY3RlZEZvcm1hdCAhPSBBVURJT19GT1JNQVRfSU5WQUxJRCAmJiBtSW5DaGFubmVsQ291bnQgPiBtT3V0Q2hhbm5lbENvdW50KSB7CisgICAgICAgIG1Db250cmFjdGVkRnJhbWVTaXplID0gYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKG1Db250cmFjdGVkQ2hhbm5lbENvdW50LCBtQ29udHJhY3RlZEZvcm1hdCk7CisgICAgfQorfQorCitzdGF0dXNfdCBBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXI6OmdldE5leHRCdWZmZXIoCisgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogcEJ1ZmZlcikKK3sKKyAgICBjb25zdCBzaXplX3Qgb3V0RnJhbWVzTGVmdCA9IG1Db250cmFjdGVkRnJhbWVDb3VudCAtIG1Db250cmFjdGVkV3JpdHRlbkZyYW1lczsKKyAgICBpZiAob3V0RnJhbWVzTGVmdCA8IHBCdWZmZXItPmZyYW1lQ291bnQpIHsKKyAgICAgICAgLy8gUmVzdHJpY3QgdGhlIGZyYW1lIGNvdW50IHNvIHRoYXQgd2UgZG9uJ3Qgd3JpdGUgb3ZlciB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICAgICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCA9IG91dEZyYW1lc0xlZnQ7CisgICAgfQorICAgIHJldHVybiBDb3B5QnVmZmVyUHJvdmlkZXI6OmdldE5leHRCdWZmZXIocEJ1ZmZlcik7Cit9CisKK3ZvaWQgQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyOjpjb3B5RnJhbWVzKAorICAgICAgICB2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcykKK3sKKyAgICBhZGp1c3RfY2hhbm5lbHNfbm9uX2Rlc3RydWN0aXZlKHNyYywgbUluQ2hhbm5lbENvdW50LCBkc3QsIG1PdXRDaGFubmVsQ291bnQsIG1TYW1wbGVTaXplSW5CeXRlcywKKyAgICAgICAgICAgIGZyYW1lcyAqIG1JbkNoYW5uZWxDb3VudCAqIG1TYW1wbGVTaXplSW5CeXRlcyk7CisgICAgaWYgKG1Db250cmFjdGVkRm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9JTlZBTElEICYmIG1Db250cmFjdGVkQnVmZmVyICE9IE5VTEwKKyAgICAgICAgICAgICYmIG1JbkNoYW5uZWxDb3VudCA+IG1PdXRDaGFubmVsQ291bnQpIHsKKyAgICAgICAgY29uc3Qgc2l6ZV90IGNvbnRyYWN0ZWRJZHggPSBmcmFtZXMgKiBtT3V0Q2hhbm5lbENvdW50ICogbVNhbXBsZVNpemVJbkJ5dGVzOworICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KAorICAgICAgICAgICAgICAgICh1aW50OF90KiltQ29udHJhY3RlZEJ1ZmZlciArIG1Db250cmFjdGVkV3JpdHRlbkZyYW1lcyAqIG1Db250cmFjdGVkRnJhbWVTaXplLAorICAgICAgICAgICAgICAgIG1Db250cmFjdGVkRm9ybWF0LCAodWludDhfdCopZHN0ICsgY29udHJhY3RlZElkeCwgbUZvcm1hdCwKKyAgICAgICAgICAgICAgICBtQ29udHJhY3RlZENoYW5uZWxDb3VudCAqIGZyYW1lcyk7CisgICAgICAgIG1Db250cmFjdGVkV3JpdHRlbkZyYW1lcyArPSBmcmFtZXM7CisgICAgfQorfQorCit2b2lkIEFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlcjo6cmVzZXQoKQoreworICAgIG1Db250cmFjdGVkV3JpdHRlbkZyYW1lcyA9IDA7CisgICAgQ29weUJ1ZmZlclByb3ZpZGVyOjpyZXNldCgpOworfQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKaW5kZXggMDU1ZjcyNC4uNTBjYTMzZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oCkBAIC0xMDQsOCArMTA0LDggQEAKICAgICAgICAgY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnByMikgewogICAgIHJldHVybiBmYWJzKHByMS5tU3BlZWQgLSBwcjIubVNwZWVkKSA8IEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01JTl9ERUxUQSAmJgogICAgICAgICAgICBmYWJzKHByMS5tUGl0Y2ggLSBwcjIubVBpdGNoKSA8IEFVRElPX1RJTUVTVFJFVENIX1BJVENIX01JTl9ERUxUQSAmJgotICAgICAgICAgICBwcjIubVN0cmV0Y2hNb2RlID09IHByMi5tU3RyZXRjaE1vZGUgJiYKLSAgICAgICAgICAgcHIyLm1GYWxsYmFja01vZGUgPT0gcHIyLm1GYWxsYmFja01vZGU7CisgICAgICAgICAgIHByMS5tU3RyZXRjaE1vZGUgPT0gcHIyLm1TdHJldGNoTW9kZSAmJgorICAgICAgICAgICBwcjEubUZhbGxiYWNrTW9kZSA9PSBwcjIubUZhbGxiYWNrTW9kZTsKIH0KIAogc3RhdGljIGlubGluZSBib29sIGlzQXVkaW9QbGF5YmFja1JhdGVWYWxpZChjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcGxheWJhY2tSYXRlKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLmJwCmluZGV4IDIyN2YyYTEuLjljODJiMWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLmJwCkBAIC0xMyw3ICsxMyw3IEBACiAgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAic291bmRmeCIsCiAKICAgICBjZmxhZ3M6IFsKLSAgICAgICAgLy8iLURCVUlMRF9GTE9BVCIsCisgICAgICAgICItREJVSUxEX0ZMT0FUIiwKICAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdlcnJvciIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguYwppbmRleCBiNGExZDc3Li45OWFjNGY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmMKQEAgLTMxLDEwICszMSwxMiBAQAogLy8gRG8gbm90IHN1Ym1pdCB3aXRoIERPV05NSVhfQUxXQVlTX1VTRV9HRU5FUklDX0RPV05NSVhFUiBkZWZpbmVkLCBzdHJpY3RseSBmb3IgdGVzdGluZwogLy8jZGVmaW5lIERPV05NSVhfQUxXQVlTX1VTRV9HRU5FUklDX0RPV05NSVhFUiAwCiAKLSNkZWZpbmUgTUlOVVNfM19EQl9JTl9RMTlfMTIgMjg5NiAvLyAtM2RCID0gMC43MDcgKiAyXjEyID0gMjg5NgotCiAjaWZkZWYgQlVJTERfRkxPQVQKICNkZWZpbmUgTUlOVVNfM19EQl9JTl9GTE9BVCAwLjcwNzEwNjc4ZiAvLyAtM2RCID0gMC43MDcxMDY3OGYKK2NvbnN0IGF1ZGlvX2Zvcm1hdF90IGdUYXJnZXRGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworI2Vsc2UKKyNkZWZpbmUgTUlOVVNfM19EQl9JTl9RMTlfMTIgMjg5NiAvLyAtM2RCID0gMC43MDcgKiAyXjEyID0gMjg5NgorY29uc3QgYXVkaW9fZm9ybWF0X3QgZ1RhcmdldEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogI2VuZGlmCiAKIC8vIHN1YnNldCBvZiBwb3NzaWJsZSBhdWRpb19jaGFubmVsX21hc2tfdCB2YWx1ZXMsIGFuZCBBVURJT19DSEFOTkVMX09VVF8qIHJlbmFtZWQgdG8gQ0hBTk5FTF9NQVNLXyoKQEAgLTcwMyw3ICs3MDUsNyBAQAogICAgIG1lbXNldCgmcER3bU1vZHVsZS0+Y29udGV4dCwgMCwgc2l6ZW9mKGRvd25taXhfb2JqZWN0X3QpKTsKIAogICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKLSAgICBwRHdtTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgcER3bU1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IGdUYXJnZXRGb3JtYXQ7CiAgICAgcER3bU1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMTsKICAgICBwRHdtTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKICAgICBwRHdtTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CkBAIC03MTUsNyArNzE3LDcgQEAKIAogICAgIC8vIHNldCBhIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBhY2Nlc3MgbW9kZSwgYnV0IHNob3VsZCBiZSBvdmVyd3JpdHRlbiBieSBjYWxsZXIKICAgICBwRHdtTW9kdWxlLT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOwotICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgcER3bU1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBnVGFyZ2V0Rm9ybWF0OwogICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CiAgICAgcER3bU1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwogICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CkBAIC03NjIsOCArNzY0LDggQEAKICAgICAvLyBDaGVjayBjb25maWd1cmF0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBidWlsZCBvcHRpb25zLCBhbmQgZWZmZWN0IGNhcGFiaWxpdGllcwogICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgIT0gcENvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZQogICAgICAgICB8fCBwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMgIT0gRE9XTk1JWF9PVVRQVVRfQ0hBTk5FTFMKLSAgICAgICAgfHwgcENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUCi0gICAgICAgIHx8IHBDb25maWctPm91dHB1dENmZy5mb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKKyAgICAgICAgfHwgcENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IGdUYXJnZXRGb3JtYXQKKyAgICAgICAgfHwgcENvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCAhPSBnVGFyZ2V0Rm9ybWF0KSB7CiAgICAgICAgIEFMT0dFKCJEb3dubWl4X0NvbmZpZ3VyZSBlcnJvcjogaW52YWxpZCBjb25maWciKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQpAQCAtMTE4NSw4ICsxMTg3LDggQEAKICAgICBpZiAoYWNjdW11bGF0ZSkgewogICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CiAgICAgICAgICAgICAvLyBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IEZDKC0zZEIpICsgTEZFKC0zZEIpCi0gICAgICAgICAgICBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9RMTlfMTIpCi0gICAgICAgICAgICAgICAgICAgICsgKHBTcmNbM10gKiBNSU5VU18zX0RCX0lOX1ExOV8xMik7CisgICAgICAgICAgICBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9GTE9BVCkKKyAgICAgICAgICAgICAgICAgICAgKyAocFNyY1szXSAqIE1JTlVTXzNfREJfSU5fRkxPQVQpOwogICAgICAgICAgICAgLy8gRkwgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFNMICsgUkwKICAgICAgICAgICAgIGx0ID0gcFNyY1swXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s2XSArIHBTcmNbNF07CiAgICAgICAgICAgICAvLyBGUiArIGNlbnRlclBsdXNMZmVDb250cmliICsgU1IgKyBSUgpAQCAtMTQyNyw0ICsxNDI5LDQgQEAKICAgICB9CiAgICAgcmV0dXJuIHRydWU7CiB9Ci0jZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbG91ZG5lc3MvRWZmZWN0TG91ZG5lc3NFbmhhbmNlci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2xvdWRuZXNzL0VmZmVjdExvdWRuZXNzRW5oYW5jZXIuY3BwCmluZGV4IDlkMjljZjEuLmQ2MWVmZDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbG91ZG5lc3MvRWZmZWN0TG91ZG5lc3NFbmhhbmNlci5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sb3VkbmVzcy9FZmZlY3RMb3VkbmVzc0VuaGFuY2VyLmNwcApAQCAtMzAsNiArMzAsMjYgQEAKICNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9sb3VkbmVzc2VuaGFuY2VyLmg+CiAjaW5jbHVkZSAiZHNwL2NvcmUvZHluYW1pY19yYW5nZV9jb21wcmVzc2lvbi5oIgogCisvLyBCVUlMRF9GTE9BVCB0YXJnZXRzIGJ1aWxkaW5nIGEgZmxvYXQgZWZmZWN0IGluc3RlYWQgb2YgdGhlIGxlZ2FjeSBpbnQxNl90IGVmZmVjdC4KKyNkZWZpbmUgQlVJTERfRkxPQVQKKworI2lmZGVmIEJVSUxEX0ZMT0FUCisKK3N0YXRpYyBjb25zdGV4cHIgYXVkaW9fZm9ybWF0X3Qga1Byb2Nlc3NGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworCisjZWxzZQorCitzdGF0aWMgY29uc3RleHByIGF1ZGlvX2Zvcm1hdF90IGtQcm9jZXNzRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisKK3N0YXRpYyBpbmxpbmUgaW50MTZfdCBjbGFtcDE2KGludDMyX3Qgc2FtcGxlKQoreworICAgIGlmICgoc2FtcGxlPj4xNSkgXiAoc2FtcGxlPj4zMSkpCisgICAgICAgIHNhbXBsZSA9IDB4N0ZGRiBeIChzYW1wbGU+PjMxKTsKKyAgICByZXR1cm4gc2FtcGxlOworfQorCisjZW5kaWYgLy8gQlVJTERfRkxPQVQKKwogZXh0ZXJuICJDIiB7CiAKIC8vIGVmZmVjdF9oYW5kbGVfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIExFIGVmZmVjdApAQCAtODAsMTMgKzEwMCw2IEBACiAgICAgfQogfQogCi1zdGF0aWMgaW5saW5lIGludDE2X3QgY2xhbXAxNihpbnQzMl90IHNhbXBsZSkKLXsKLSAgICBpZiAoKHNhbXBsZT4+MTUpIF4gKHNhbXBsZT4+MzEpKQotICAgICAgICBzYW1wbGUgPSAweDdGRkYgXiAoc2FtcGxlPj4zMSk7Ci0gICAgcmV0dXJuIHNhbXBsZTsKLX0KLQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBMRV9zZXRDb25maWcoKQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMTEsNyArMTI0LDcgQEAKICAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgIT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSByZXR1cm4gLUVJTlZBTDsKICAgICBpZiAocENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgIT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUgJiYKICAgICAgICAgICAgIHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlICE9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHJldHVybiAtRUlOVkFMOwotICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHJldHVybiAtRUlOVkFMOworICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0ga1Byb2Nlc3NGb3JtYXQpIHJldHVybiAtRUlOVkFMOwogCiAgICAgcENvbnRleHQtPm1Db25maWcgPSAqcENvbmZpZzsKIApAQCAtMTU5LDcgKzE3Miw3IEBACiAKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBrUHJvY2Vzc0Zvcm1hdDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwpAQCAtMTY3LDcgKzE4MCw3IEBACiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURTsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBrUHJvY2Vzc0Zvcm1hdDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwpAQCAtMjg0LDE4ICsyOTcsNDEgQEAKIAogICAgIC8vQUxPR1YoIkxFIGFib3V0IHRvIHByb2Nlc3MgJWQgc2FtcGxlcyIsIGluQnVmZmVyLT5mcmFtZUNvdW50KTsKICAgICB1aW50MTZfdCBpbklkeDsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIGNvbnN0ZXhwciBmbG9hdCBzY2FsZSA9IDEgPDwgMTU7IC8vIHBvd2VyIG9mIDIgaXMgbG9zc2xlc3MgY29udmVyc2lvbiB0byBpbnQxNl90IHJhbmdlCisgICAgY29uc3RleHByIGZsb2F0IGludmVyc2VTY2FsZSA9IDEuZiAvIHNjYWxlOworICAgIGNvbnN0IGZsb2F0IGlucHV0QW1wID0gcG93KDEwLCBwQ29udGV4dC0+bVRhcmdldEdhaW5tQi8yMDAwLjBmKSAqIHNjYWxlOworI2Vsc2UKICAgICBmbG9hdCBpbnB1dEFtcCA9IHBvdygxMCwgcENvbnRleHQtPm1UYXJnZXRHYWlubUIvMjAwMC4wZik7CisjZW5kaWYKICAgICBmbG9hdCBsZWZ0U2FtcGxlLCByaWdodFNhbXBsZTsKICAgICBmb3IgKGluSWR4ID0gMCA7IGluSWR4IDwgaW5CdWZmZXItPmZyYW1lQ291bnQgOyBpbklkeCsrKSB7CiAgICAgICAgIC8vIG1ha2V1cCBnYWluIGlzIGFwcGxpZWQgb24gdGhlIGlucHV0IG9mIHRoZSBjb21wcmVzc29yCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgbGVmdFNhbXBsZSAgPSBpbnB1dEFtcCAqIGluQnVmZmVyLT5mMzJbMippbklkeF07CisgICAgICAgIHJpZ2h0U2FtcGxlID0gaW5wdXRBbXAgKiBpbkJ1ZmZlci0+ZjMyWzIqaW5JZHggKzFdOworICAgICAgICBwQ29udGV4dC0+bUNvbXByZXNzb3ItPkNvbXByZXNzKCZsZWZ0U2FtcGxlLCAmcmlnaHRTYW1wbGUpOworICAgICAgICBpbkJ1ZmZlci0+ZjMyWzIqaW5JZHhdICAgID0gbGVmdFNhbXBsZSAqIGludmVyc2VTY2FsZTsKKyAgICAgICAgaW5CdWZmZXItPmYzMlsyKmluSWR4ICsxXSA9IHJpZ2h0U2FtcGxlICogaW52ZXJzZVNjYWxlOworI2Vsc2UKICAgICAgICAgbGVmdFNhbXBsZSAgPSBpbnB1dEFtcCAqIChmbG9hdClpbkJ1ZmZlci0+czE2WzIqaW5JZHhdOwogICAgICAgICByaWdodFNhbXBsZSA9IGlucHV0QW1wICogKGZsb2F0KWluQnVmZmVyLT5zMTZbMippbklkeCArMV07CiAgICAgICAgIHBDb250ZXh0LT5tQ29tcHJlc3Nvci0+Q29tcHJlc3MoJmxlZnRTYW1wbGUsICZyaWdodFNhbXBsZSk7CiAgICAgICAgIGluQnVmZmVyLT5zMTZbMippbklkeF0gICAgPSAoaW50MTZfdCkgbGVmdFNhbXBsZTsKICAgICAgICAgaW5CdWZmZXItPnMxNlsyKmluSWR4ICsxXSA9IChpbnQxNl90KSByaWdodFNhbXBsZTsKKyNlbmRpZiAvLyBCVUlMRF9GTE9BVAogICAgIH0KIAogICAgIGlmIChpbkJ1ZmZlci0+cmF3ICE9IG91dEJ1ZmZlci0+cmF3KSB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgaWYgKHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0QnVmZmVyLT5mcmFtZUNvdW50KjI7IGkrKykgeworICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZjMyW2ldICs9IGluQnVmZmVyLT5mMzJbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1jcHkob3V0QnVmZmVyLT5yYXcsIGluQnVmZmVyLT5yYXcsIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIDIgKiBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgfQorI2Vsc2UKICAgICAgICAgaWYgKHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0QnVmZmVyLT5mcmFtZUNvdW50KjI7IGkrKykgewogICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+czE2W2ldID0gY2xhbXAxNihvdXRCdWZmZXItPnMxNltpXSArIGluQnVmZmVyLT5zMTZbaV0pOwpAQCAtMzAzLDYgKzMzOSw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtZW1jcHkob3V0QnVmZmVyLT5yYXcsIGluQnVmZmVyLT5yYXcsIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIDIgKiBzaXplb2YoaW50MTZfdCkpOwogICAgICAgICB9CisjZW5kaWYgLy8gQlVJTERfRkxPQVQKICAgICB9CiAgICAgaWYgKHBDb250ZXh0LT5tU3RhdGUgIT0gTE9VRE5FU1NfRU5IQU5DRVJfU1RBVEVfQUNUSVZFKSB7CiAgICAgICAgIHJldHVybiAtRU5PREFUQTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0FuZHJvaWQuYnAKaW5kZXggNWM1N2M0My4uN2EzMmQzZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0FuZHJvaWQuYnAKQEAgLTEyOSwxMSArMTI5LDE0IEBACiAgICAgICAgICJDb21tb24vbGliIiwKICAgICAgICAgIkJ1bmRsZS9saWIiLAogICAgIF0sCi0KKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICBdLAogICAgIGNmbGFnczogWwogICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCiAgICAgICAgICItREJVSUxEX0ZMT0FUIiwKICAgICAgICAgIi1ESElHSEVSX0ZTIiwKKyAgICAgICAgIi1EU1VQUE9SVF9NQyIsCiAKICAgICAgICAgIi1XYWxsIiwKICAgICAgICAgIi1XZXJyb3IiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3MvbGliL0xWREJFLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIvTFZEQkUuaAppbmRleCA0YzJiOTU0Li5jYzA2NmIwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIvTFZEQkUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIvTFZEQkUuaApAQCAtMTk5LDggKzE5OSwxMCBAQAogI2RlZmluZSBMVkRCRV9DQVBfRlNfNDQxMDAgICAgICAgICAgICAgICAxMjgKICNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzQ4MDAwICAgICAgICAgICAgICAgMjU2CiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCi0jZGVmaW5lIExWREJFX0NBUF9GU185NjAwMCAgICAgICAgICAgICAgIDUxMgotI2RlZmluZSBMVkRCRV9DQVBfRlNfMTkyMDAwICAgICAgICAgICAgICAxMDI0CisjZGVmaW5lIExWREJFX0NBUF9GU184ODIwMCAgICAgICAgICAgICAgIDUxMgorI2RlZmluZSBMVkRCRV9DQVBfRlNfOTYwMDAgICAgICAgICAgICAgICAxMDI0CisjZGVmaW5lIExWREJFX0NBUF9GU18xNzY0MDAgICAgICAgICAgICAgIDIwNDgKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzE5MjAwMCAgICAgICAgICAgICAgNDA5NgogI2VuZGlmCiAKIHR5cGVkZWYgZW51bQpAQCAtMjE1LDggKzIxNywxMCBAQAogICAgIExWREJFX0ZTXzQ0MTAwID0gNywKICAgICBMVkRCRV9GU180ODAwMCA9IDgsCiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCi0gICAgTFZEQkVfRlNfOTYwMDAgPSA5LAotICAgIExWREJFX0ZTXzE5MjAwMCA9IDEwLAorICAgIExWREJFX0ZTXzg4MjAwID0gOSwKKyAgICBMVkRCRV9GU185NjAwMCA9IDEwLAorICAgIExWREJFX0ZTXzE3NjQwMCA9IDExLAorICAgIExWREJFX0ZTXzE5MjAwMCA9IDEyLAogI2VuZGlmCiAgICAgTFZEQkVfRlNfTUFYICAgPSBMVk1fTUFYSU5UXzMyCiB9IExWREJFX0ZzX2VuOwpAQCAtMjU2LDYgKzI2MCw5IEBACiAgICAgTFZEQkVfVm9sdW1lX2VuICAgICAgICAgVm9sdW1lQ29udHJvbDsKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBWb2x1bWVkQjsKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBIZWFkcm9vbWRCOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckNoYW5uZWxzOworI2VuZGlmCiAKIH0gTFZEQkVfUGFyYW1zX3Q7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db2VmZnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db2VmZnMuaAppbmRleCA0ZWNhZjE0Li44ZjA1OGU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29lZmZzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvZWZmcy5oCkBAIC01ODAsMTIgKzU4MCwyNCBAQAogI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4OTg4MmYKIAogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBIUEZfRnM4ODIwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTgxOGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MTYzNmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1ODE4ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk0NDY2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTQ0ODFmCisKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODYwNDBmCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NzIwODBmKQogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NjA0MGYKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NDkxNWYpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTk0OTI4ZgogCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg3MTgzZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTc0MzY2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODcxODNmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTcyMzNmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NzIzN2YKKwogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NzI5NGYKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3NDU4OGYpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg3Mjk0ZgpAQCAtNjQyLDEyICs2NTQsMjQgQEAKICNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODc4NzFmCiAKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODUyNzNmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NzA1NDZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTI3M2YKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MzM1OWYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTkzMzgxZgorCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1NTM5ZgogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTcxMDc3ZikKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODU1MzlmCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTM4OThmKQogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5MzkxN2YKIAorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NjkxMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MzgyMGYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2OTEwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk2Njc5ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTY2ODVmCisKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODcwNDNmCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzQwODZmKQogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NzA0M2YKQEAgLTcwMywxMiArNzI3LDI0IEBACiAjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1NjgxZgogCiAjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0Njc4ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY5MzU2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ2NzhmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTIxNTFmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5MjE4MmYKKwogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDk5MmYKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2OTk4NGYpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0OTkyZgogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTkyNzg5ZikKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTI4MTVmCiAKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODY2MTJmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzMyMjRmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NjYxMmYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NjA3NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2MDgzZgorCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NzY5ZgogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTczNTM5ZikKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODY3NjlmCkBAIC03NjQsMTIgKzgwMCwyNCBAQAogI2RlZmluZSBIUEZfRnM0ODAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTgzNDk3ZgogCiAjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0MDg0ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY4MTY4ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODQwODRmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTA5NDRmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5MDk4NWYKKwogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDQ0NmYKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2ODg5MmYpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0NDQ2ZgogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTkxNjgwZikKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTE3MTRmCiAKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODYzMTRmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzI2MjlmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NjMxNGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NTQ3MmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk1NDgyZgorCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NDk2ZgogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTcyOTkyZikKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODY0OTZmCkBAIC04MzEsMTIgKzg3OSwyNCBAQAogI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2ODc1ZgogCiAjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDA4MzFmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDgzMWYpCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5ODMyMWYpCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTgzMzhmCisKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMDc2MmYKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwNzYyZikKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk4NDYxZikKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5ODQ3N2YKIAorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAwNDE2ZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDA0MTZmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTkxNjRmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk5MTY5ZgorCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDAzODFmCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDM4MWYpCkBAIC04OTIsMTIgKzk1MiwyNCBAQAogI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTU2OTBmCiAKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAxMTQ2ZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAxMTQ2ZikKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTc2ODRmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTc3MDhmCisKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAxMDU1ZgogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAxMDU1ZikKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTc4NjhmKQogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTc4OTFmCiAKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgIDAuMDAwNTczZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAoLTAuMDAwNTczZikKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICgtMS45OTg4NDdmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgMC45OTg4NTNmCisKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgIDAuMDAwNTI4ZgogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICgtMC4wMDA1MjhmKQpAQCAtOTUzLDEyICsxMDI1LDI0IEBACiAjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5MzYzOWYKIAogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBCUEZfRnM4ODIwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAwLjAwMTY5M2YKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICgtMC4wMDE2OTNmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAoLTEuOTk2NTgyZikKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgMC45OTY2MTVmCisKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAxNTU1ZgogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICgtMC4wMDE1NTU1ZikKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgKC0xLjk5Njg2MGYpCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5Njg5MWYKIAorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgMC4wMDA4NDdmCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICgtMC4wMDA4NDdmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgKC0xLjk5ODI5OGYpCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAwLjk5ODMwNmYKKwogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgMC4wMDA3NzhmCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgKC0wLjAwMDc3OGYpCkBAIC0xMDE0LDEyICsxMDk4LDI0IEBACiAjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTIxNzdmCiAKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMjA4M2YKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAyMDgzZikKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk1NzkxZikKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NTgzNWYKKwogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAxOTEzZgogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMTkxM2YpCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTk2MTM0ZikKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NjE3NGYKIAorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAxMDQyZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDEwNDJmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTc5MDRmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk3OTE1ZgorCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDA5NThmCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAoLTAuMDAwOTU4ZikKQEAgLTEwNDUsNyArMTE0MSw5IEBACiAjZGVmaW5lIEFHQ19BVFRBQ0tfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk3MTYyOGYKIAogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBBR0NfQVRUQUNLX0ZzODgyMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0NDU4ZgogI2RlZmluZSBBR0NfQVRUQUNLX0ZzOTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1NzEyZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzMTc2NDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTkyMTk5ZgogI2RlZmluZSBBR0NfQVRUQUNLX0ZzMTkyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTkyODMwZgogI2VuZGlmCiAKQEAgLTEwNjIsNyArMTE2MCw5IEBACiAjZGVmaW5lIEFHQ19ERUNBWV9GczQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwN2YKIAogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBBR0NfREVDQVlfRnM4ODIwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMzhmCiAjZGVmaW5lIEFHQ19ERUNBWV9GUzk2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAzNWYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzMTc2NDAwICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMTg4ZgogI2RlZmluZSBBR0NfREVDQVlfRlMxOTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAxNzVmCiAjZW5kaWYKIApAQCAtMTEyNSw3ICsxMjI1LDkgQEAKICNkZWZpbmUgVk9MX1RDX0ZzNDQxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDQ1MjVmCiAjZGVmaW5lIFZPTF9UQ19GczQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA0MTU4ZgogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBWT0xfVENfRnM4ODIwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMjI2M2YKICNkZWZpbmUgVk9MX1RDX0ZzOTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDIwNzlmCisjZGVmaW5lIFZPTF9UQ19GczE3NjQwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAxMTMxZgogI2RlZmluZSBWT0xfVENfRnMxOTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMTAzOWYKICNlbmRpZgogI2RlZmluZSBNSVhfVENfRnM4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOTM2NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuODk2MTUxICovCkBAIC0xMTM4LDkgKzEyNDAsMTMgQEAKICNkZWZpbmUgTUlYX1RDX0ZzNDQxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwOTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3OTUxNSAqLwogI2RlZmluZSBNSVhfVENfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjE1MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgxMTUwICovCiAjaWZkZWYgSElHSEVSX0ZTCisvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4OTcwNCAqLworI2RlZmluZSBNSVhfVENfRnM4ODIwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjQzMAogI2RlZmluZSBNSVhfVENfRnM5NjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjQ1NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTkwNTMwICovCisvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NDgzOCAqLworI2RlZmluZSBNSVhfVENfRnMxNzY0MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjU5OAogI2RlZmluZSBNSVhfVENfRnMxOTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjYxMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTkyNTI0ICovCiAjZW5kaWYKIAogI2VuZGlmIC8qQlVJTERfRkxPQVQqLwotI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29udHJvbC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvbnRyb2wuYwppbmRleCBmZDQwMTZiLi4wYmEyYzg2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29udHJvbC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db250cm9sLmMKQEAgLTExOCw3ICsxMTgsNyBAQAogICAgICAqIENhbGN1bGF0ZSB0aGUgdGFibGUgb2Zmc2V0cwogICAgICAqLwogICAgIExWTV9VSU5UMTYgT2Zmc2V0ID0gKExWTV9VSU5UMTYpKChMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGUgKyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikocFBhcmFtcy0+Q2VudHJlRnJlcXVlbmN5ICogKDErTFZEQkVfRlNfNDgwMDApKSk7ICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHBQYXJhbXMtPkNlbnRyZUZyZXF1ZW5jeSAqICgxK0xWREJFX0ZTXzQ4MDAwKSkpOwogI2VuZGlmCiAKICAgICAvKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmMKaW5kZXggM2ZmZjJhMi4uMjk0NjczNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfSW5pdC5jCkBAIC05NSw3ICs5NSw3IEBACiAjaWZkZWYgQlVJTERfRkxPQVQKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSAgID0gc2l6ZW9mKExWREJFX0NvZWZfRkxPQVRfdCk7CiAjZWxzZQotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5TaXplICAgICAgICAgPSBzaXplb2YoTFZEQkVfQ29lZl90KTsgICAKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSAgICAgICAgID0gc2l6ZW9mKExWREJFX0NvZWZfdCk7CiAjZW5kaWYKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uQWxpZ25tZW50ICAgID0gTFZEQkVfUEVSU0lTVEVOVF9DT0VGX0FMSUdOOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5UeXBlICAgICAgICAgPSBMVkRCRV9QRVJTSVNURU5UX0NPRUY7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1ByaXZhdGUuaAppbmRleCA0ZTUyMDdmLi40MjI1YTMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcml2YXRlLmgKQEAgLTY0LDcgKzY0LDEyIEBACiAjZGVmaW5lIExWREJFX1BFUlNJU1RFTlRfQ09FRl9BTElHTiAgICAgIDQgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgY29lZiAqLwogI2RlZmluZSBMVkRCRV9TQ1JBVENIX0FMSUdOICAgICAgICAgICAgICA0ICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGxvbmcgZGF0YSAqLwogCisjaWZkZWYgU1VQUE9SVF9NQworLyogTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWlyZWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLworI2RlZmluZSBMVkRCRV9TQ1JBVENIQlVGRkVSU19JTlBMQUNFICAgICAoTFZNX01BWF9DSEFOTkVMUyAqIDMpCisjZWxzZQogI2RlZmluZSBMVkRCRV9TQ1JBVENIQlVGRkVSU19JTlBMQUNFICAgICA2ICAgICAgIC8qIE51bWJlciBvZiBidWZmZXJzIHJlcXVpcmVkIGZvciBpbnBsYWNlIHByb2Nlc3NpbmcgKi8KKyNlbmRpZgogCiAjZGVmaW5lIExWREJFX01JWEVSX1RDICAgICAgICAgICAgICAgICAgIDUgICAgICAgLyogTWl4ZXIgdGltZSAgKi8KICNkZWZpbmUgTFZEQkVfQllQQVNTX01JWEVSX1RDICAgICAgICAgICAgMTAwICAgICAvKiBCeXBhc3MgbWl4ZXIgdGltZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcm9jZXNzLmMKaW5kZXggMTBlYTcwMC4uYzRkMzQwMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1Byb2Nlc3MuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jCkBAIC0yMSwxMSArMjEsMTMgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpbmNsdWRlIDxzdHJpbmcuaD4gLy8gbWVtc2V0CiAjaW5jbHVkZSAiTFZEQkUuaCIKICNpbmNsdWRlICJMVkRCRV9Qcml2YXRlLmgiCiAjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgogI2luY2x1ZGUgIkFHQy5oIgogI2luY2x1ZGUgIkxWREJFX0NvZWZmcy5oIiAgICAgICAgICAgICAgIC8qIEZpbHRlciBjb2VmZmljaWVudHMgKi8KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE4Nyw0MiArMTg5LDQ5IEBACiBMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfUHJvY2VzcyhMVkRCRV9IYW5kbGVfdCBoSW5zdGFuY2UsCiAgICAgY29uc3QgTFZNX0ZMT0FUICpwSW5EYXRhLAogICAgIExWTV9GTE9BVCAqcE91dERhdGEsCi0gICAgTFZNX1VJTlQxNiBOdW1TYW1wbGVzKQorICAgIGNvbnN0IExWTV9VSU5UMTYgTnJGcmFtZXMpIC8vIHVwZGF0ZWQgdG8gdXNlIHNhbXBsZXMgPSBmcmFtZXMgKiBjaGFubmVscy4KIHsKLQogICBMVkRCRV9JbnN0YW5jZV90ICpwSW5zdGFuY2UgPShMVkRCRV9JbnN0YW5jZV90ICopaEluc3RhbmNlOwotICBMVk1fRkxPQVQgKnBTY3JhdGNoX2luID0gKExWTV9GTE9BVCAqKXBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uCi0gIFtMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzOwotICBMVk1fRkxPQVQgKnBTY3JhdGNoID0gcFNjcmF0Y2hfaW4gKyAyICogTnVtU2FtcGxlczsKLSAgTFZNX0ZMT0FUICpwTW9ubzsKLSAgTFZNX0lOVDMyIGlpID0gMDsKIAotICAvKiBTY3JhdGNoIGZvciBWb2x1bWUgQ29udHJvbCBzdGFydHMgYXQgb2Zmc2V0IG9mIDQqTnVtU2FtcGxlcyBmbG9hdCB2YWx1ZXMgZnJvbSBwU2NyYXRjaCAqLwotICBMVk1fRkxPQVQgICAgICAgICAgICpwU2NyYXRjaFZvbCA9IChMVk1fRkxPQVQgKikoJnBTY3JhdGNoX2luWzQgKiBOdW1TYW1wbGVzXSk7Ci0vLyAgTFZNX0lOVDE2ICpwU2NyYXRjaFZvbF9pbnQgPSAoTFZNX0lOVDE2ICopKHBTY3JhdGNoVm9sKTsKKyAgLypFeHRyYWN0IG51bWJlciBvZiBDaGFubmVscyBpbmZvKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgIC8vIE1vbm8gcGFzc2VkIGluIGFzIHN0ZXJlbworICBjb25zdCBMVk1fSU5UMzIgTnJDaGFubmVscyA9IHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHMgPT0gMQorICAgICAgPyAyIDogcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVsczsKKyNlbHNlCisgIGNvbnN0IExWTV9JTlQzMiBOckNoYW5uZWxzID0gMjsgLy8gRkNDXzIKKyNlbmRpZgorICBjb25zdCBMVk1fSU5UMzIgTnJTYW1wbGVzID0gTnJDaGFubmVscyAqIE5yRnJhbWVzOwogCi0gIC8qIFNjcmF0Y2ggZm9yIE1vbm8gcGF0aCBzdGFydHMgYXQgb2Zmc2V0IG9mIDYqTnVtU2FtcGxlcyAzMi1iaXQgdmFsdWVzIGZyb20gcFNjcmF0Y2ggKi8KLSAgcE1vbm8gPSAmcFNjcmF0Y2hfaW5bNCAqIE51bVNhbXBsZXNdOworICAvKiBTcGFjZSB0byBzdG9yZSBEQkUgcGF0aCBjb21wdXRhdGlvbiAqLworICBMVk1fRkxPQVQgKiBjb25zdCBwU2NyYXRjaCA9CisgICAgICAgICAgKExWTV9GTE9BVCAqKXBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWREJFX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3M7CiAKICAgLyoKLSAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vdCB0b28gbGFyZ2UKKyAgICogU2NyYXRjaCBmb3IgTW9ubyBwYXRoIHN0YXJ0cyBhdCBvZmZzZXQgb2YKKyAgICogTnJTYW1wbGVzIGZsb2F0IHZhbHVlcyBmcm9tIHBTY3JhdGNoLgogICAgKi8KLSAgaWYgKE51bVNhbXBsZXMgPiBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUpCisgIExWTV9GTE9BVCAqIGNvbnN0IHBNb25vID0gcFNjcmF0Y2ggKyBOclNhbXBsZXM7CisKKyAgLyoKKyAgICogVFJJQ0tZOiBwTW9ubyBpcyB1c2VkIGFuZCBkaXNjYXJkZWQgYnkgdGhlIERCRSBwYXRoLgorICAgKiAgICAgICAgIHNvIGl0IGlzIGF2YWlsYWJsZSBmb3IgdXNlIGZvciB0aGUgcFNjcmF0Y2hWb2wKKyAgICogICAgICAgICBwYXRoIHdoaWNoIGlzIGNvbXB1dGVkIGFmdGVyd2FyZHMuCisgICAqCisgICAqIFNwYWNlIHRvIHN0b3JlIFZvbHVtZSBDb250cm9sIHBhdGggY29tcHV0YXRpb24uCisgICAqIFRoaXMgaXMgaWRlbnRpY2FsIHRvIHBNb25vIChzZWUgVFJJQ0tZIGNvbW1lbnQpLgorICAgKi8KKyAgTFZNX0ZMT0FUICogY29uc3QgcFNjcmF0Y2hWb2wgPSBwTW9ubzsKKworICAvKgorICAgKiBDaGVjayB0aGUgbnVtYmVyIG9mIGZyYW1lcyBpcyBub3QgdG9vIGxhcmdlCisgICAqLworICBpZiAoTnJGcmFtZXMgPiBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUpCiAgIHsKLSAgICByZXR1cm4oTFZEQkVfVE9PTUFOWVNBTVBMRVMpOworICAgIHJldHVybiBMVkRCRV9UT09NQU5ZU0FNUExFUzsKICAgfQogCiAgIC8qCi0gICAqIENvbnZlcnQgMTYtYml0IHNhbXBsZXMgdG8gRmxvYXQKLSAgICovCi0gIENvcHlfRmxvYXQocEluRGF0YSwgLyogU291cmNlIDE2LWJpdCBkYXRhICAgICovCi0gICAgICBwU2NyYXRjaF9pbiwgLyogRGVzdC4gMzItYml0IGRhdGEgICAgICovCi0gICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAvKiBMZWZ0IGFuZCByaWdodCAgICAgICAgKi8KLQotICBmb3IgKGlpID0gMDsgaWkgPCAyICogTnVtU2FtcGxlczsgaWkrKykgewotICAgIHBTY3JhdGNoW2lpXSA9IHBTY3JhdGNoX2luW2lpXTsKLSAgfQotICAvKgogICAgKiBDaGVjayBpZiB0aGUgYWxnb3JpdGhtIGlzIGVuYWJsZWQKICAgICovCiAgIC8qIERCRSBwYXRoIGlzIHByb2Nlc3NlZCB3aGVuIERCRSBpcyBPTiBvciBkdXJpbmcgT24vT2ZmIHRyYW5zaXRpb25zICovCkBAIC0yMzAsNTAgKzIzOSw4MSBAQAogICAgICAgKExWQ19NaXhlcl9HZXRDdXJyZW50KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSkKICAgICAgICAgICAhPUxWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKSkpCiAgIHsKKyAgICAvLyBtYWtlIGNvcHkgb2YgaW5wdXQgZGF0YQorICAgIENvcHlfRmxvYXQocEluRGF0YSwKKyAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgIChMVk1fSU5UMTYpTnJTYW1wbGVzKTsKIAogICAgIC8qCiAgICAgICogQXBwbHkgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgaWYgc2VsZWN0ZWQKICAgICAgKi8KICAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuSFBGU2VsZWN0ID09IExWREJFX0hQRl9PTikKICAgICB7CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgQlFfTUNfRDMyRjMyQzMwX1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+cENvZWYtPkhQRkluc3RhbmNlLCAvKiBGaWx0ZXIgaW5zdGFuY2UgICAgICAqLworICAgICAgICAgIHBTY3JhdGNoLCAvKiBTb3VyY2UgICAgICAgICAgICAgICAqLworICAgICAgICAgIHBTY3JhdGNoLCAvKiBEZXN0aW5hdGlvbiAgICAgICAgICAqLworICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCisgICAgICAgICAgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKKyNlbHNlCiAgICAgICBCUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5wQ29lZi0+SFBGSW5zdGFuY2UsLyogRmlsdGVyIGluc3RhbmNlICAgICAgKi8KLSAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsIC8qIFNvdXJjZSAgICAgICAgICAgICAgICovCi0gICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLCAvKiBEZXN0aW5hdGlvbiAgICAgICAgICAqLwotICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7IC8qIE51bWJlciBvZiBzYW1wbGVzICAgICovCisgICAgICAgICAgcFNjcmF0Y2gsIC8qIFNvdXJjZSAgICAgICAgICAgICAgICovCisgICAgICAgICAgcFNjcmF0Y2gsIC8qIERlc3RpbmF0aW9uICAgICAgICAgICovCisgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcyk7CisjZW5kaWYKICAgICB9CiAKICAgICAvKgogICAgICAqIENyZWF0ZSB0aGUgbW9ubyBzdHJlYW0KICAgICAgKi8KLSAgICBGcm9tMmlUb01vbm9fRmxvYXQoKExWTV9GTE9BVCAqKXBTY3JhdGNoLCAvKiBTdGVyZW8gc291cmNlICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgRnJvbU1jVG9Nb25vX0Zsb2F0KHBTY3JhdGNoLCAvKiBTb3VyY2UgKi8KKyAgICAgICAgcE1vbm8sIC8qIE1vbm8gZGVzdGluYXRpb24gKi8KKyAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcywgIC8qIE51bWJlciBvZiBmcmFtZXMgKi8KKyAgICAgICAgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKKyNlbHNlCisgICAgRnJvbTJpVG9Nb25vX0Zsb2F0KHBTY3JhdGNoLCAvKiBTdGVyZW8gc291cmNlICAgICAgICAgKi8KICAgICAgICAgcE1vbm8sIC8qIE1vbm8gZGVzdGluYXRpb24gICAgICAqLwotICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KKyAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcyk7CisjZW5kaWYKIAogICAgIC8qCiAgICAgICogQXBwbHkgdGhlIGJhbmQgcGFzcyBmaWx0ZXIKICAgICAgKi8KICAgICBCUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMigmcEluc3RhbmNlLT5wQ29lZi0+QlBGSW5zdGFuY2UsIC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICAqLwotICAgICAgICAoTFZNX0ZMT0FUICopcE1vbm8sIC8qIFNvdXJjZSAgICAgICAgICAgICAgICAqLwotICAgICAgICAoTFZNX0ZMT0FUICopcE1vbm8sIC8qIERlc3RpbmF0aW9uICAgICAgICAgICAqLwotICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KKyAgICAgICAgcE1vbm8sIC8qIFNvdXJjZSAgICAgICAgICAgICAgICAqLworICAgICAgICBwTW9ubywgLyogRGVzdGluYXRpb24gICAgICAgICAgICovCisgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMpOwogCiAgICAgLyoKICAgICAgKiBBcHBseSB0aGUgQUdDIGFuZCBtaXgKICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgQUdDX01JWF9WT0xfTWMxTW9uX0QzMl9XUkEoJnBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLCAvKiBJbnN0YW5jZSBwb2ludGVyICAgICAgKi8KKyAgICAgICAgcFNjcmF0Y2gsIC8qIFNvdXJjZSAgICAgICAgICovCisgICAgICAgIHBNb25vLCAvKiBNb25vIGJhbmQgcGFzcyBzb3VyY2UgKi8KKyAgICAgICAgcFNjcmF0Y2gsIC8qIERlc3RpbmF0aW9uICAgICovCisgICAgICAgIE5yRnJhbWVzLCAvKiBOdW1iZXIgb2YgZnJhbWVzICAgICAqLworICAgICAgICBOckNoYW5uZWxzKTsgLyogTnVtYmVyIG9mIGNoYW5uZWxzICAgICAqLworI2Vsc2UKICAgICBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEoJnBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLCAvKiBJbnN0YW5jZSBwb2ludGVyICAgICAgKi8KICAgICAgICAgcFNjcmF0Y2gsIC8qIFN0ZXJlbyBzb3VyY2UgICAgICAgICAqLwogICAgICAgICBwTW9ubywgLyogTW9ubyBiYW5kIHBhc3Mgc291cmNlICovCiAgICAgICAgIHBTY3JhdGNoLCAvKiBTdGVyZW8gZGVzdGluYXRpb24gICAgKi8KLSAgICAgICAgTnVtU2FtcGxlcyk7IC8qIE51bWJlciBvZiBzYW1wbGVzICAgICAqLworICAgICAgICBOckZyYW1lcyk7CisjZW5kaWYKIAotICAgIGZvciAoaWkgPSAwOyBpaSA8IDIgKiBOdW1TYW1wbGVzOyBpaSsrKSB7CisgICAgZm9yIChMVk1fSU5UMzIgaWkgPSAwOyBpaSA8IE5yU2FtcGxlczsgKytpaSkgewogICAgICAgLy9UT0RPOiByZXBsYWNlIHdpdGggZXhpc3RpbmcgY2xhbXBpbmcgZnVuY3Rpb24KLSAgICAgIGlmKHBTY3JhdGNoW2lpXSA8IC0xLjApIHsKKyAgICAgIGlmIChwU2NyYXRjaFtpaV0gPCAtMS4wKSB7CiAgICAgICAgIHBTY3JhdGNoW2lpXSA9IC0xLjA7Ci0gICAgICB9IGVsc2UgaWYocFNjcmF0Y2hbaWldID4gMS4wKSB7CisgICAgICB9IGVsc2UgaWYgKHBTY3JhdGNoW2lpXSA+IDEuMCkgewogICAgICAgICBwU2NyYXRjaFtpaV0gPSAxLjA7CiAgICAgICB9CiAgICAgfQorICB9IGVsc2UgeworICAgIC8vIGNsZWFyIERCRSBwcm9jZXNzZWQgcGF0aAorICAgIG1lbXNldChwU2NyYXRjaCwgMCwgc2l6ZW9mKCpwU2NyYXRjaCkgKiBOclNhbXBsZXMpOwogICB9CiAKICAgLyogQnlwYXNzIFZvbHVtZSBwYXRoIGlzIHByb2Nlc3NlZCB3aGVuIERCRSBpcyBPRkYgb3IgZHVyaW5nIE9uL09mZiB0cmFuc2l0aW9ucyAqLwpAQCAtMjg2LDIxICszMjYsNDAgQEAKICAgICAgKiBUaGUgYWxnb3JpdGhtIGlzIGRpc2FibGVkIGJ1dCB2b2x1bWUgbWFuYWdlbWVudCBpcyByZXF1aXJlZCB0byBjb21wZW5zYXRlIGZvcgogICAgICAqIGhlYWRyb29tIGFuZCB2b2x1bWUgKGlmIGVuYWJsZWQpCiAgICAgICovCi0gICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZSwKLSAgICAgICAgcFNjcmF0Y2hfaW4sCisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZSwKKyAgICAgICAgcEluRGF0YSwKICAgICAgICAgcFNjcmF0Y2hWb2wsCi0gICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7IC8qIExlZnQgYW5kIHJpZ2h0ICovCisgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCisgICAgICAgIChMVk1fSU5UMTYpTnJDaGFubmVscyk7CisjZWxzZQorICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUsCisgICAgICAgIHBJbkRhdGEsCisgICAgICAgIHBTY3JhdGNoVm9sLAorICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7IC8qIExlZnQgYW5kIHJpZ2h0LCByZWFsbHkgIyBzYW1wbGVzICovCisjZW5kaWYKKyAgfSBlbHNlIHsKKyAgICAvLyBjbGVhciBieXBhc3Mgdm9sdW1lIHBhdGgKKyAgICBtZW1zZXQocFNjcmF0Y2hWb2wsIDAsIHNpemVvZigqcFNjcmF0Y2hWb2wpICogTnJTYW1wbGVzKTsKICAgfQogCiAgIC8qCiAgICAqIE1peCBEQkUgcHJvY2Vzc2VkIHBhdGggYW5kIGJ5cGFzcyB2b2x1bWUgcGF0aAogICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgIExWQ19NaXhTb2Z0XzJNY19EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlciwKKyAgICAgIHBTY3JhdGNoLAorICAgICAgcFNjcmF0Y2hWb2wsCisgICAgICBwT3V0RGF0YSwKKyAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCisgICAgICAoTFZNX0lOVDE2KU5yQ2hhbm5lbHMpOworI2Vsc2UKICAgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLAogICAgICAgcFNjcmF0Y2gsCiAgICAgICBwU2NyYXRjaFZvbCwKICAgICAgIHBPdXREYXRhLAotICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsKLQotICByZXR1cm4oTFZEQkVfU1VDQ0VTUyk7CisgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7CisjZW5kaWYKKyAgcmV0dXJuIExWREJFX1NVQ0NFU1M7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuYwppbmRleCBjNGE5YjE0Li5hMmNlNDA0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5jCkBAIC04OCwxMSArODgsMjEgQEAKICAgICAgLUhQRl9GczQ4MDAwX0ZjNTVfQjIsCiAgICAgIC1IUEZfRnM0ODAwMF9GYzU1X0IxfSwKICNpZmRlZiBISUdIRVJfRlMKKyAgICB7SFBGX0ZzODgyMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM4ODIwMF9GYzU1X0ExLAorICAgICBIUEZfRnM4ODIwMF9GYzU1X0EwLAorICAgICAtSFBGX0ZzODgyMDBfRmM1NV9CMiwKKyAgICAgLUhQRl9Gczg4MjAwX0ZjNTVfQjF9LAogICAgIHtIUEZfRnM5NjAwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIEhQRl9Gczk2MDAwX0ZjNTVfQTEsCiAgICAgIEhQRl9Gczk2MDAwX0ZjNTVfQTAsCiAgICAgIC1IUEZfRnM5NjAwMF9GYzU1X0IyLAogICAgICAtSFBGX0ZzOTYwMDBfRmM1NV9CMX0sCisgICAge0hQRl9GczE3NjQwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxNzY0MDBfRmM1NV9BMSwKKyAgICAgSFBGX0ZzMTc2NDAwX0ZjNTVfQTAsCisgICAgIC1IUEZfRnMxNzY0MDBfRmM1NV9CMiwKKyAgICAgLUhQRl9GczE3NjQwMF9GYzU1X0IxfSwKICAgICB7SFBGX0ZzMTkyMDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIEhQRl9GczE5MjAwMF9GYzU1X0ExLAogICAgICBIUEZfRnMxOTIwMDBfRmM1NV9BMCwKQEAgLTE0NywxMSArMTU3LDIxIEBACiAgICAgIC1IUEZfRnM0ODAwMF9GYzY2X0IyLAogICAgICAtSFBGX0ZzNDgwMDBfRmM2Nl9CMX0sCiAjaWZkZWYgSElHSEVSX0ZTCisgICAge0hQRl9Gczg4MjAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzODgyMDBfRmM2Nl9BMSwKKyAgICAgSFBGX0ZzODgyMDBfRmM2Nl9BMCwKKyAgICAgLUhQRl9Gczg4MjAwX0ZjNjZfQjIsCisgICAgIC1IUEZfRnM4ODIwMF9GYzY2X0IxfSwKICAgICB7SFBGX0ZzOTYwMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBIUEZfRnM5NjAwMF9GYzY2X0ExLAogICAgICBIUEZfRnM5NjAwMF9GYzY2X0EwLAogICAgICAtSFBGX0ZzOTYwMDBfRmM2Nl9CMiwKICAgICAgLUhQRl9Gczk2MDAwX0ZjNjZfQjF9LAorICAgIHtIUEZfRnMxNzY0MDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTc2NDAwX0ZjNjZfQTEsCisgICAgIEhQRl9GczE3NjQwMF9GYzY2X0EwLAorICAgICAtSFBGX0ZzMTc2NDAwX0ZjNjZfQjIsCisgICAgIC1IUEZfRnMxNzY0MDBfRmM2Nl9CMX0sCiAgICAge0hQRl9GczE5MjAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBIUEZfRnMxOTIwMDBfRmM2Nl9BMSwKICAgICAgSFBGX0ZzMTkyMDAwX0ZjNjZfQTAsCkBAIC0yMDcsMTEgKzIyNywyMSBAQAogICAgICAtSFBGX0ZzNDgwMDBfRmM3OF9CMiwKICAgICAgLUhQRl9GczQ4MDAwX0ZjNzhfQjF9LAogI2lmZGVmIEhJR0hFUl9GUworICAgIHtIUEZfRnM4ODIwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9Gczg4MjAwX0ZjNzhfQTEsCisgICAgIEhQRl9Gczg4MjAwX0ZjNzhfQTAsCisgICAgIC1IUEZfRnM4ODIwMF9GYzc4X0IyLAorICAgICAtSFBGX0ZzODgyMDBfRmM3OF9CMX0sCiAgICAge0hQRl9Gczk2MDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgSFBGX0ZzOTYwMDBfRmM3OF9BMSwKICAgICAgSFBGX0ZzOTYwMDBfRmM3OF9BMCwKICAgICAgLUhQRl9Gczk2MDAwX0ZjNzhfQjIsCiAgICAgIC1IUEZfRnM5NjAwMF9GYzc4X0IxfSwKKyAgICB7SFBGX0ZzMTc2NDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczE3NjQwMF9GYzc4X0ExLAorICAgICBIUEZfRnMxNzY0MDBfRmM3OF9BMCwKKyAgICAgLUhQRl9GczE3NjQwMF9GYzc4X0IyLAorICAgICAtSFBGX0ZzMTc2NDAwX0ZjNzhfQjF9LAogICAgIHtIUEZfRnMxOTIwMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgSFBGX0ZzMTkyMDAwX0ZjNzhfQTEsCiAgICAgIEhQRl9GczE5MjAwMF9GYzc4X0EwLApAQCAtMjY5LDExICsyOTksMjEgQEAKIAogI2lmZGVmIEhJR0hFUl9GUwogICAgICwKKyAgICB7SFBGX0ZzODgyMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM4ODIwMF9GYzkwX0ExLAorICAgICBIUEZfRnM4ODIwMF9GYzkwX0EwLAorICAgICAtSFBGX0ZzODgyMDBfRmM5MF9CMiwKKyAgICAgLUhQRl9Gczg4MjAwX0ZjOTBfQjF9LAogICAgIHtIUEZfRnM5NjAwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIEhQRl9Gczk2MDAwX0ZjOTBfQTEsCiAgICAgIEhQRl9Gczk2MDAwX0ZjOTBfQTAsCiAgICAgIC1IUEZfRnM5NjAwMF9GYzkwX0IyLAogICAgICAtSFBGX0ZzOTYwMDBfRmM5MF9CMX0sCisgICAge0hQRl9GczE3NjQwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxNzY0MDBfRmM5MF9BMSwKKyAgICAgSFBGX0ZzMTc2NDAwX0ZjOTBfQTAsCisgICAgIC1IUEZfRnMxNzY0MDBfRmM5MF9CMiwKKyAgICAgLUhQRl9GczE3NjQwMF9GYzkwX0IxfSwKICAgICB7SFBGX0ZzMTkyMDAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIEhQRl9GczE5MjAwMF9GYzkwX0ExLAogICAgICBIUEZfRnMxOTIwMDBfRmM5MF9BMCwKQEAgLTMyMCw5ICszNjAsMTUgQEAKICAgICAgLUJQRl9GczQ4MDAwX0ZjNTVfQjIsCiAgICAgIC1CUEZfRnM0ODAwMF9GYzU1X0IxfSwKICNpZmRlZiBISUdIRVJfRlMKKyAgICAge0JQRl9Gczg4MjAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgIC1CUEZfRnM4ODIwMF9GYzU1X0IyLAorICAgICAgLUJQRl9Gczg4MjAwX0ZjNTVfQjF9LAogICAgICB7QlBGX0ZzOTYwMDBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICAtQlBGX0ZzOTYwMDBfRmM1NV9CMiwKICAgICAgLUJQRl9Gczk2MDAwX0ZjNTVfQjF9LAorICAgICB7QlBGX0ZzMTc2NDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAtQlBGX0ZzMTc2NDAwX0ZjNTVfQjIsCisgICAgICAtQlBGX0ZzMTc2NDAwX0ZjNTVfQjF9LAogICAgICB7QlBGX0ZzMTkyMDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIC1CUEZfRnMxOTIwMDBfRmM1NV9CMiwKICAgICAgLUJQRl9GczE5MjAwMF9GYzU1X0IxfSwKQEAgLTM1Nyw5ICs0MDMsMTUgQEAKICAgICAgLUJQRl9GczQ4MDAwX0ZjNjZfQjIsCiAgICAgIC1CUEZfRnM0ODAwMF9GYzY2X0IxfSwKICNpZmRlZiBISUdIRVJfRlMKKyAgICB7QlBGX0ZzODgyMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzODgyMDBfRmM2Nl9CMiwKKyAgICAgLUJQRl9Gczg4MjAwX0ZjNjZfQjF9LAogICAgIHtCUEZfRnM5NjAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIC1CUEZfRnM5NjAwMF9GYzY2X0IyLAogICAgICAtQlBGX0ZzOTYwMDBfRmM2Nl9CMX0sCisgICAge0JQRl9GczE3NjQwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTc2NDAwX0ZjNjZfQjIsCisgICAgIC1CUEZfRnMxNzY0MDBfRmM2Nl9CMX0sCiAgICAge0JQRl9GczE5MjAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICAtQlBGX0ZzMTkyMDAwX0ZjNjZfQjIsCiAgICAgIC1CUEZfRnMxOTIwMDBfRmM2Nl9CMX0sCkBAIC0zOTQsOSArNDQ2LDE1IEBACiAgICAgIC1CUEZfRnM0ODAwMF9GYzc4X0IyLAogICAgICAtQlBGX0ZzNDgwMDBfRmM3OF9CMX0sCiAjaWZkZWYgSElHSEVSX0ZTCisgICAge0JQRl9Gczg4MjAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9Gczg4MjAwX0ZjNjZfQjIsCisgICAgIC1CUEZfRnM4ODIwMF9GYzY2X0IxfSwKICAgICB7QlBGX0ZzOTYwMDBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICAtQlBGX0ZzOTYwMDBfRmM3OF9CMiwKICAgICAgLUJQRl9Gczk2MDAwX0ZjNzhfQjF9LAorICAgIHtCUEZfRnMxNzY0MDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczE3NjQwMF9GYzY2X0IyLAorICAgICAtQlBGX0ZzMTc2NDAwX0ZjNjZfQjF9LAogICAgIHtCUEZfRnMxOTIwMDBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgLUJQRl9GczE5MjAwMF9GYzc4X0IyLAogICAgICAtQlBGX0ZzMTkyMDAwX0ZjNzhfQjF9LApAQCAtNDMyLDkgKzQ5MCwxNSBAQAogICAgICAtQlBGX0ZzNDgwMDBfRmM5MF9CMX0KICNpZmRlZiBISUdIRVJfRlMKICAgICAsCisgICAge0JQRl9Gczg4MjAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9Gczg4MjAwX0ZjOTBfQjIsCisgICAgIC1CUEZfRnM4ODIwMF9GYzkwX0IxfSwKICAgICB7QlBGX0ZzOTYwMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICAtQlBGX0ZzOTYwMDBfRmM5MF9CMiwKICAgICAgLUJQRl9Gczk2MDAwX0ZjOTBfQjF9LAorICAgIHtCUEZfRnMxNzY0MDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczE3NjQwMF9GYzkwX0IyLAorICAgICAtQlBGX0ZzMTc2NDAwX0ZjOTBfQjF9LAogICAgIHtCUEZfRnMxOTIwMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgLUJQRl9GczE5MjAwMF9GYzkwX0IyLAogICAgICAtQlBGX0ZzMTkyMDAwX0ZjOTBfQjF9CkBAIC00NjYsNyArNTMwLDkgQEAKICAgICBBR0NfQVRUQUNLX0ZzNDQxMDAsCiAgICAgQUdDX0FUVEFDS19GczQ4MDAwCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgLEFHQ19BVFRBQ0tfRnM4ODIwMAogICAgICxBR0NfQVRUQUNLX0ZzOTYwMDAKKyAgICAsQUdDX0FUVEFDS19GczE3NjQwMAogICAgICxBR0NfQVRUQUNLX0ZzMTkyMDAwCiAjZW5kaWYKIApAQCAtNDg4LDcgKzU1NCw5IEBACiAgICAgQUdDX0RFQ0FZX0ZzNDQxMDAsCiAgICAgQUdDX0RFQ0FZX0ZzNDgwMDAKICNpZmRlZiBISUdIRVJfRlMKKyAgICAsQUdDX0RFQ0FZX0ZzODgyMDAKICAgICAsQUdDX0RFQ0FZX0ZTOTYwMDAKKyAgICAsQUdDX0RFQ0FZX0ZzMTc2NDAwCiAgICAgLEFHQ19ERUNBWV9GUzE5MjAwMAogI2VuZGlmCiAKQEAgLTU4Myw3ICs2NTEsOSBAQAogICAgIFZPTF9UQ19GczQ0MTAwLAogICAgIFZPTF9UQ19GczQ4MDAwCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgLFZPTF9UQ19Gczg4MjAwCiAgICAgLFZPTF9UQ19Gczk2MDAwCisgICAgLFZPTF9UQ19GczE3NjQwMAogICAgICxWT0xfVENfRnMxOTIwMDAKICNlbmRpZgogfTsKQEAgLTYwMiw3ICs2NzIsOSBAQAogICAgIE1JWF9UQ19GczQ0MTAwLAogICAgIE1JWF9UQ19GczQ4MDAwCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgLE1JWF9UQ19Gczg4MjAwCiAgICAgLE1JWF9UQ19Gczk2MDAwCisgICAgLE1JWF9UQ19GczE3NjQwMAogICAgICxNSVhfVENfRnMxOTIwMDAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL2xpYi9MVk0uaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvbGliL0xWTS5oCmluZGV4IDliNmRhMzEuLjgzZWNhZTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvbGliL0xWTS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvbGliL0xWTS5oCkBAIC0yOTYsNiArMjk2LDkgQEAKICAgICAvKiBTcGVjdHJ1bSBBbmFseXplciBwYXJhbWV0ZXJzIENvbnRyb2wgKi8KICAgICBMVk1fUFNBX01vZGVfZW4gICAgICAgICAgICAgUFNBX0VuYWJsZTsKICAgICBMVk1fUFNBX0RlY2F5U3BlZWRfZW4gICAgICAgUFNBX1BlYWtEZWNheVJhdGU7ICAgICAgLyogUGVhayB2YWx1ZSBkZWNheSByYXRlKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHM7CisjZW5kaWYKIAogfSBMVk1fQ29udHJvbFBhcmFtc190OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQnVmZmVycy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0J1ZmZlcnMuYwppbmRleCAwYTNjMzBlLi4zNzI3MmUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQnVmZmVycy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmMKQEAgLTI1LDYgKzI1LDggQEAKICNpbmNsdWRlICJMVk1fUHJpdmF0ZS5oIgogI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKIAorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZNX0J1ZmZlck1hbmFnZWRJbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjIsOCArNjQsMTEgQEAKICAgICBMVk1fSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwogICAgIExWTV9CdWZmZXJfdCAgICAgKnBCdWZmZXI7CiAgICAgTFZNX0ZMT0FUICAgICAgICAqcERlc3Q7CisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9JTlQxNiAgICAgICAgTnVtQ2hhbm5lbHMgPSBwSW5zdGFuY2UtPk5yQ2hhbm5lbHM7CisjZWxzZQogICAgIExWTV9JTlQxNiAgICAgICAgTnVtQ2hhbm5lbHMgPSAyOwotCisjZW5kaWYKIAogICAgIC8qCiAgICAgICogU2V0IHRoZSBwcm9jZXNzaW5nIGFkZHJlc3MgcG9pbnRlcnMKQEAgLTIwNyw4ICsyMTIsNyBAQAogICAgIExWTV9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CiAgICAgTFZNX0J1ZmZlcl90ICAgICAqcEJ1ZmZlcjsKICAgICBMVk1fSU5UMTYgICAgICAgICpwRGVzdDsKLSAgICBMVk1fSU5UMTYgICAgICAgIE51bUNoYW5uZWxzID0yOwotCisgICAgTFZNX0lOVDE2ICAgICAgICBOdW1DaGFubmVscyA9IDI7CiAKICAgICAvKgogICAgICAqIFNldCB0aGUgcHJvY2Vzc2luZyBhZGRyZXNzIHBvaW50ZXJzCkBAIC00OTksNyArNTAzLDcgQEAKICAgICAgICAgaWYgKHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyAhPSAwKQogICAgICAgICB7CiAgICAgICAgICAgICBDb3B5XzE2KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXRzaW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKnBCdWZmZXItPk91dERlbGF5U2FtcGxlcykpOyAgICAgICAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlcyAqLwogICAgICAgICAgICAgcERlc3QgKz0gMiAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlczsgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIG91dHB1dCBwb2ludGVyICovCiAgICAgICAgICAgICBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgPSAoTFZNX0lOVDE2KShwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgLSBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpOyAvKiBVcGRhdGUgdGhlIG51bWJyIG9mIHNhbXBsZXMgdG8gb3V0cHV0ICovCkBAIC03NTAsNyArNzU0LDExIEBACiAgICAgTFZNX0lOVDE2ICAgICAgIE51bVNhbXBsZXM7CiAgICAgTFZNX0ZMT0FUICAgICAgICpwU3RhcnQ7CiAgICAgTFZNX0ZMT0FUICAgICAgICpwRGVzdDsKLQorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fSU5UMzIgICAgICAgTnJDaGFubmVscyA9IHBJbnN0YW5jZS0+TnJDaGFubmVsczsKKyNkZWZpbmUgTnJGcmFtZXMgTnVtU2FtcGxlcyAgLy8gYWxpYXMgZm9yIGNsYXJpdHkKKyNkZWZpbmUgRnJhbWVDb3VudCBTYW1wbGVDb3VudAorI2VuZGlmCiAKICAgICAvKgogICAgICAqIFNldCB0aGUgcG9pbnRlcnMKQEAgLTc1OCw3ICs3NjYsNiBAQAogICAgIE51bVNhbXBsZXMgPSBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQ7CiAgICAgcFN0YXJ0ICAgICA9IHBCdWZmZXItPnBTY3JhdGNoOwogCi0KICAgICAvKgogICAgICAqIGNoZWNrIGlmIGl0IGlzIHRoZSBmaXJzdCBjYWxsIG9mIGEgYmxvY2sKICAgICAgICovCkBAIC03ODYsMTQgKzc5MywyNSBAQAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIENvcHkgYWxsIG91dHB1dCBkZWxheSBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKICAgICAgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKICAgICAgICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXRzaW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yQ2hhbm5lbHMgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpKTsKKyNlbHNlCisgICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcykpOyAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlcyAqLworI2VuZGlmCiAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIHBvaW50ZXIgYW5kIHNhbXBsZSBjb3VudHMKICAgICAgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgIHBEZXN0ICs9IE5yQ2hhbm5lbHMgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXM7IC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworI2Vsc2UKICAgICAgICAgICAgIHBEZXN0ICs9IDIgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXM7IC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworI2VuZGlmCiAgICAgICAgICAgICBOdW1TYW1wbGVzID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyAtIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyk7IC8qIFNhbXBsZXMgbGVmdCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHNlbmQgKi8KICAgICAgICAgICAgIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyA9IDA7IC8qIE5vIHNhbXBsZXMgbGVmdCBpbiB0aGUgYnVmZmVyICovCkBAIC04MDMsMjMgKzgyMSw0MCBAQAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIENvcHkgb25seSBzb21lIG9mIHRoZSBvdXB1dCBkZWxheSBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKICAgICAgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKICAgICAgICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERldHNpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yQ2hhbm5lbHMgKiBOckZyYW1lcykpOyAgICAgICAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlcyAqLworI2Vsc2UKKyAgICAgICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgIC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCisjZW5kaWYKIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlciBhbmQgc2FtcGxlIGNvdW50cwogICAgICAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgcERlc3QgKz0gTnJDaGFubmVscyAqIE5yRnJhbWVzOyAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyNlbHNlCiAgICAgICAgICAgICBwRGVzdCArPSAyICogTnVtU2FtcGxlczsgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisjZW5kaWYKICAgICAgICAgICAgIC8qIE5vIHNhbXBsZXMgbGVmdCBpbiB0aGUgYnVmZmVyICovCiAgICAgICAgICAgICBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgPSAoTFZNX0lOVDE2KShwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgLSBOdW1TYW1wbGVzKTsKIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFJlYWxpZ24gdGhlIGRlbGF5IGJ1ZmZlciBkYXRhIHRvIGF2b2lkIHVzaW5nIGNpcmN1bGFyIGJ1ZmZlciBtYW5hZ2VtZW50CiAgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlcltOckNoYW5uZWxzICogTnJGcmFtZXNdLCAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBtb3ZlICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yQ2hhbm5lbHMgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpKTsKKyNlbHNlCiAgICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclsyICogTnVtU2FtcGxlc10sICAgICAgICAgLyogU291cmNlICovCiAgICAgICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gbW92ZSAqLworI2VuZGlmCiAgICAgICAgICAgICBOdW1TYW1wbGVzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZXMgbGVmdCB0byBzZW5kICovCiAgICAgICAgIH0KICAgICB9CkBAIC04MzYsMTMgKzg3MSwyMyBAQAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIENvcHkgYWxsIHByb2Nlc3NlZCBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKICAgICAgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKICAgICAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERldHNpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yQ2hhbm5lbHMgKiBGcmFtZUNvdW50KSk7IC8qIE51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLworI2Vsc2UKKyAgICAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBTYW1wbGVDb3VudCkpOyAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KKyNlbmRpZgogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlciBhbmQgc2FtcGxlIGNvdW50cwogICAgICAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgcERlc3QgICAgICArPSBOckNoYW5uZWxzICogRnJhbWVDb3VudDsgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworI2Vsc2UKICAgICAgICAgICAgIHBEZXN0ICAgICAgKz0gMiAqIFNhbXBsZUNvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisjZW5kaWYKICAgICAgICAgICAgIE51bVNhbXBsZXMgID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyAtIFNhbXBsZUNvdW50KTsgICAgLyogU2FtcGxlcyBsZWZ0IHRvIHNlbmQgKi8KICAgICAgICAgICAgIFNhbXBsZUNvdW50ID0gMDsgLyogTm8gc2FtcGxlcyBsZWZ0IGluIHRoZSBidWZmZXIgKi8KICAgICAgICAgfQpAQCAtODUxLDE0ICs4OTYsMjUgQEAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBDb3B5IG9ubHkgc29tZSBwcm9jZXNzZWQgc2FtcGxlcyB0byB0aGUgb3V0cHV0CiAgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogTnJGcmFtZXMpKTsgIC8qIE51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLworI2Vsc2UKICAgICAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCiAgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KKyNlbmRpZgogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlcnMgYW5kIHNhbXBsZSBjb3VudHMKICAgICAgICAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgcFN0YXJ0ICAgICAgKz0gTnJDaGFubmVscyAqIE5yRnJhbWVzOyAgICAgICAgICAgICAgIC8qIFByb2Nlc3NlZCBzYW1wbGUgcG9pbnRlciAqLworICAgICAgICAgICAgcERlc3QgICAgICAgKz0gTnJDaGFubmVscyAqIE5yRnJhbWVzOyAgICAgICAgICAgICAgIC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworI2Vsc2UKICAgICAgICAgICAgIHBTdGFydCAgICAgICs9IDIgKiBOdW1TYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByb2Nlc3NlZCBzYW1wbGUgcG9pbnRlciAqLwogICAgICAgICAgICAgcERlc3QgICAgICAgKz0gMiAqIE51bVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisjZW5kaWYKICAgICAgICAgICAgIFNhbXBsZUNvdW50ICA9IChMVk1fSU5UMTYpKFNhbXBsZUNvdW50IC0gTnVtU2FtcGxlcyk7IC8qIFByb2Nlc3NlZCBzYW1wbGVzIGxlZnQgKi8KICAgICAgICAgICAgIE51bVNhbXBsZXMgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBzYW1wbGUgY291bnQgKi8KICAgICAgICAgfQpAQCAtODcwLDkgKzkyNiwxNiBAQAogICAgICAqLwogICAgIGlmIChTYW1wbGVDb3VudCAhPSAwKQogICAgIHsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlcltOckNoYW5uZWxzICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzXSwKKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogRnJhbWVDb3VudCkpOyAgICAgIC8qIE51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLworI2Vsc2UKICAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwogICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclsyICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzXSwgLyogRGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogU2FtcGxlQ291bnQpKTsgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KKyNlbmRpZgogICAgICAgICAvKiBVcGRhdGUgdGhlIGJ1ZmZlciBjb3VudCAqLwogICAgICAgICBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgPSAoTFZNX0lOVDE2KShwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgKyBTYW1wbGVDb3VudCk7CiAgICAgfQpAQCAtMTA2MywxNCArMTEyNiwyNCBAQAogewogCiAgICAgTFZNX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlICA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscyA9MjsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscyA9IHBJbnN0YW5jZS0+TnJDaGFubmVsczsKKyN1bmRlZiBOckZyYW1lcworI2RlZmluZSBOckZyYW1lcyAoKnBOdW1TYW1wbGVzKSAvLyBhbGlhcyBmb3IgY2xhcml0eQorI2Vsc2UKKyAgICBMVk1fSU5UMTYgICAgICAgICAgIE51bUNoYW5uZWxzID0gMjsKKyNlbmRpZgogCiAKICAgICAvKgogICAgICAqIFVwZGF0ZSBzYW1wbGUgY291bnRzCiAgICAgICovCiAgICAgcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzICAgICs9IChMVk1fSU5UMTYpKCpwTnVtU2FtcGxlcyAqIE51bUNoYW5uZWxzKTsgLyogVXBkYXRlIHRoZSBJL08gcG9pbnRlcnMgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlcyAgICs9IChMVk1fSU5UMTYpKE5yRnJhbWVzICogTnVtQ2hhbm5lbHMpOworI2Vsc2UKICAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzICAgKz0gKExWTV9JTlQxNikoKnBOdW1TYW1wbGVzICogMik7CisjZW5kaWYKICAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgID0gKExWTV9JTlQxNikocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzIC0gKnBOdW1TYW1wbGVzKTsgLyogVXBkYXRlIHRoZSBzYW1wbGUgY291bnQgKi8KIAogICAgIC8qCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29lZmZzLmgKaW5kZXggOGMwNDg0Ny4uYmFiNDA0OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvZWZmcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db2VmZnMuaApAQCAtNDg3LDYgKzQ4Nyw5NyBAQAogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKIAogI2lmZGVmIEhJR0hFUl9GUworLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSA4ODIwMCAqLworLyogR2FpbiA9IDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjA5NDM3NGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC42NDEyNTZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjIwMDI2NGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDcxNDZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4zX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjMxOTA3NGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC44NjU5NTZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQ1MjM4MGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC45OTkyNjNmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjYwMTk1M2YKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4xNDg4MzZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDYuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjc2OTc3N2YKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4zMTY2NTlmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjk1ODA3OGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS41MDQ5NjBmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjE2OTM1NWYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS43MTYyMzhmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjQwNjQxMmYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS45NTMyOTVmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDEwLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNjcyMzk1ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi4yMTkyNzdmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDExLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuOTcwODMyZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi41MTc3MTRmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMzA1Njg0ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi44NTI1NjZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDEzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNjgxMzk0ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMy4yMjgyNzZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDE0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuMTAyOTQ3ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMy42NDk4MzBmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuNTc1OTM4ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtNC4xMjI4MjBmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgogCiAvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDk2MDAwSHogKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLwpAQCAtNTgwLDYgKzY3MSw5OCBAQAogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU3NzM1MCkKICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAKKy8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgMTc2NDAwICovCisvKiBHYWluID0gMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjEwNjcxMWYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuODU1ODA3ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjI2NDQzZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC45NzU1MzlmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zNjA3ODRmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjEwOTg4MGYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjUxMTUxN2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW40X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMjYwNjEzZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW40X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjgwNjQzZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS40Mjk3MzlmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDYuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS44NzA0MDVmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjYxOTUwMWYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gNy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjA4MzMyMWYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuODMyNDE3ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW43X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA4LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMzIyMjE3ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi4wNzEzMTNmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi41OTAyNjNmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjMzOTM1OWYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuODkxMDE2ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuNjQwMTEyZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy4yMjg0NjVmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi45Nzc1NjFmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjYwNzA5MGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0zLjM1NjE4NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuMDMxOTE0ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTMuNzgxMDEwZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgNC41MDg1NzVmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtNC4yNTc2NzFmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE0X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICA1LjA0MzM5N2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC00Ljc5MjQ5M2YpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisKIC8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgMTkyMDAwSHogKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjEwNzgyMwpAQCAtMTIxNiw0ICsxMzk5LDQgQEAKIAogCiAjZW5kaWYKLSNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvbnRyb2wuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db250cm9sLmMKaW5kZXggY2ZlNTNiOC4uNjJiNGM3MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvbnRyb2wuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jCkBAIC0yOCw2ICsyOCw4IEBACiAjaW5jbHVkZSAiTFZNX1RhYmxlcy5oIgogI2luY2x1ZGUgIkxWTV9Qcml2YXRlLmgiCiAKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgIExWTV9TZXRDb250cm9sUGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTY5LDE4ICs3MSwyOSBAQAogICAgICgocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzExMDI1KSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTIwMDApICAgICAgICYmCiAgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xNjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzIyMDUwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjQwMDApICAgICAgJiYKICAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzMyMDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDQxMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkgICAgICAmJgotICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfOTYwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xOTIwMDApKSAgICAgIHx8CisgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU184ODIwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzk2MDAwKSAmJgorICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTc2NDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTkyMDAwKSkgICAgICB8fAogI2Vsc2UKICAgICAgICAgKChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU184MDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTEwMjUpICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMjAwMCkgICAgICAgJiYKICAgICAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE2MDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjIwNTApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yNDAwMCkgICAgICAgJiYKICAgICAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzMyMDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDQxMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkpICAgICAgfHwKICNlbmRpZgorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgKChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX1NURVJFTykgJiYKKyAgICAgICAgIChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk9JTlNURVJFTykgJiYKKyAgICAgICAgIChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk8pICYmCisgICAgICAgICAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NVUxUSUNIQU5ORUwpKSB8fAorI2Vsc2UKICAgICAgICAgKChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX1NURVJFTykgJiYgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OT0lOU1RFUkVPKSAmJiAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PKSkgfHwKKyNlbmRpZgogICAgICAgICAocFBhcmFtcy0+U3BlYWtlclR5cGUgPiBMVk1fRVhfSEVBRFBIT05FUykpCiAgICAgewogICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKICAgICB9CiAKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVscyA9IHBQYXJhbXMtPk5yQ2hhbm5lbHM7CisjZW5kaWYKICAgICAvKgogICAgICAqIENpbmVtYSBTb3VuZCBwYXJhbWV0ZXJzCiAgICAgICovCkBAIC01NjksNiArNTgyLDEwIEBACiAgICAgfSB3aGlsZSAoKHBJbnN0YW5jZS0+Q29udHJvbFBlbmRpbmcgIT0gTFZNX0ZBTFNFKSAmJgogICAgICAgICAgICAgIChDb3VudCA+IDApKTsKIAorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBwSW5zdGFuY2UtPk5yQ2hhbm5lbHMgPSBMb2NhbFBhcmFtcy5OckNoYW5uZWxzOworI2VuZGlmCisKICAgICAvKiBDbGVhciBhbGwgaW50ZXJuYWwgZGF0YSBpZiBmb3JtYXQgY2hhbmdlKi8KICAgICBpZihMb2NhbFBhcmFtcy5Tb3VyY2VGb3JtYXQgIT0gcEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0KQogICAgIHsKQEAgLTcxOSw2ICs3MzYsOSBAQAogICAgICAgICBEQkVfUGFyYW1zLkhlYWRyb29tZEIgICAgICAgPSAwOwogICAgICAgICBEQkVfUGFyYW1zLlZvbHVtZUNvbnRyb2wgICAgPSBMVkRCRV9WT0xVTUVfT0ZGOwogICAgICAgICBEQkVfUGFyYW1zLlZvbHVtZWRCICAgICAgICAgPSAwOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgREJFX1BhcmFtcy5OckNoYW5uZWxzICAgICAgICAgPSBMb2NhbFBhcmFtcy5OckNoYW5uZWxzOworI2VuZGlmCiAKICAgICAgICAgLyoKICAgICAgICAgICogTWFrZSB0aGUgY2hhbmdlcwpAQCAtNzc1LDcgKzc5NSw5IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIEVRTkJfUGFyYW1zLlNvdXJjZUZvcm1hdCA9IExWRVFOQl9NT05PSU5TVEVSRU87ICAgICAvKiBGb3JjZSB0byBNb25vLWluLVN0ZXJlbyBtb2RlICovCiAgICAgICAgIH0KLQorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgRVFOQl9QYXJhbXMuTnJDaGFubmVscyAgICAgICAgID0gTG9jYWxQYXJhbXMuTnJDaGFubmVsczsKKyNlbmRpZgogCiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldCB0aGUgY29udHJvbCBmbGFnCkBAIC04NDksNyArODcxLDkgQEAKICAgICAgICAgQ1NfUGFyYW1zLlNhbXBsZVJhdGUgID0gTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZTsKICAgICAgICAgQ1NfUGFyYW1zLlJldmVyYkxldmVsID0gTG9jYWxQYXJhbXMuVmlydHVhbGl6ZXJSZXZlcmJMZXZlbDsKICAgICAgICAgQ1NfUGFyYW1zLkVmZmVjdExldmVsID0gTG9jYWxQYXJhbXMuQ1NfRWZmZWN0TGV2ZWw7Ci0KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgIENTX1BhcmFtcy5OckNoYW5uZWxzICA9IExvY2FsUGFyYW1zLk5yQ2hhbm5lbHM7CisjZW5kaWYKIAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIGNvbnRyb2wgZmxhZwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Jbml0LmMKaW5kZXggMjZjMWM0Zi4uMDY2OWE4MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fSW5pdC5jCkBAIC0yMzMsNyArMjMzLDEzIEBACiAgICAgICAgICAqIFNldCB0aGUgY2FwYWJpbGl0aWVzCiAgICAgICAgICAqLwogI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQotICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWREJFX0NBUF9GU184MDAwIHwgTFZEQkVfQ0FQX0ZTXzExMDI1IHwgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwgTFZEQkVfQ0FQX0ZTXzMyMDAwIHwgTFZEQkVfQ0FQX0ZTXzQ0MTAwIHwgTFZEQkVfQ0FQX0ZTXzQ4MDAwIHwgTFZEQkVfQ0FQX0ZTXzk2MDAwIHwgTFZEQkVfQ0FQX0ZTXzE5MjAwMDsKKyAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMjIwNTAgfCBMVkRCRV9DQVBfRlNfMjQwMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzQ4MDAwIHwgTFZEQkVfQ0FQX0ZTXzg4MjAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfOTYwMDAgfCBMVkRCRV9DQVBfRlNfMTc2NDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMTkyMDAwOwogI2Vsc2UKICAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8IExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8IExWREJFX0NBUF9GU18yMjA1MCB8IExWREJFX0NBUF9GU18yNDAwMCB8IExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8IExWREJFX0NBUF9GU180ODAwMDsKICNlbmRpZgpAQCAtMjcwLDcgKzI3NiwxMyBAQAogICAgICAgICAgKiBTZXQgdGhlIGNhcGFiaWxpdGllcwogICAgICAgICAgKi8KICNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLSAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgID0gTFZFUU5CX0NBUF9GU184MDAwIHwgTFZFUU5CX0NBUF9GU18xMTAyNSB8IExWRVFOQl9DQVBfRlNfMTIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfCBMVkVRTkJfQ0FQX0ZTXzMyMDAwIHwgTFZFUU5CX0NBUF9GU180NDEwMCB8IExWRVFOQl9DQVBfRlNfNDgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzk2MDAwIHwgTFZFUU5CX0NBUF9GU18xOTIwMDA7CisgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzQ4MDAwIHwgTFZFUU5CX0NBUF9GU184ODIwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfOTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE3NjQwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMTkyMDAwOwogI2Vsc2UKICAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgID0gTFZFUU5CX0NBUF9GU184MDAwIHwgTFZFUU5CX0NBUF9GU18xMTAyNSB8IExWRVFOQl9DQVBfRlNfMTIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfCBMVkVRTkJfQ0FQX0ZTXzMyMDAwIHwgTFZFUU5CX0NBUF9GU180NDEwMCB8IExWRVFOQl9DQVBfRlNfNDgwMDA7CiAjZW5kaWYKQEAgLTU4NCw4ICs1OTYsMTEgQEAKICAgICAvKgogICAgICAqIERDIHJlbW92YWwgZmlsdGVyCiAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIERDX01jX0QxNl9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlKTsKKyNlbHNlCiAgICAgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UpOwotCisjZW5kaWYKIAogICAgIC8qCiAgICAgICogVHJlYmxlIEVuaGFuY2VtZW50CkBAIC03NDQsNyArNzU5LDEzIEBACiAgICAgICAgICAqIFNldCB0aGUgaW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzCiAgICAgICAgICAqLwogI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQotICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWREJFX0NBUF9GU184MDAwIHwgTFZEQkVfQ0FQX0ZTXzExMDI1IHwgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwgTFZEQkVfQ0FQX0ZTXzMyMDAwIHwgTFZEQkVfQ0FQX0ZTXzQ0MTAwIHwgTFZEQkVfQ0FQX0ZTXzQ4MDAwIHwgTFZEQkVfQ0FQX0ZTXzk2MDAwIHwgTFZEQkVfQ0FQX0ZTXzE5MjAwMDsKKyAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMjIwNTAgfCBMVkRCRV9DQVBfRlNfMjQwMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzQ4MDAwIHwgTFZEQkVfQ0FQX0ZTXzg4MjAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfOTYwMDAgfCBMVkRCRV9DQVBfRlNfMTc2NDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMTkyMDAwOwogI2Vsc2UKICAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8IExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8IExWREJFX0NBUF9GU18yMjA1MCB8IExWREJFX0NBUF9GU18yNDAwMCB8IExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8IExWREJFX0NBUF9GU180ODAwMDsKICNlbmRpZgpAQCAtODAyLDcgKzgyMywxMyBAQAogICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcwogICAgICAgICAgKi8KICNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLSAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZFUU5CX0NBUF9GU184MDAwIHwgTFZFUU5CX0NBUF9GU18xMTAyNSB8IExWRVFOQl9DQVBfRlNfMTIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfCBMVkVRTkJfQ0FQX0ZTXzMyMDAwIHwgTFZFUU5CX0NBUF9GU180NDEwMCB8IExWRVFOQl9DQVBfRlNfNDgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzk2MDAwIHwgTFZFUU5CX0NBUF9GU18xOTIwMDA7CisgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzQ4MDAwIHwgTFZFUU5CX0NBUF9GU184ODIwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfOTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE3NjQwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMTkyMDAwOwogI2Vsc2UKICAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZFUU5CX0NBUF9GU184MDAwIHwgTFZFUU5CX0NBUF9GU18xMTAyNSB8IExWRVFOQl9DQVBfRlNfMTIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfCBMVkVRTkJfQ0FQX0ZTXzMyMDAwIHwgTFZFUU5CX0NBUF9GU180NDEwMCB8IExWRVFOQl9DQVBfRlNfNDgwMDA7CiAjZW5kaWYKQEAgLTEwMzksNyArMTA2NiwxMSBAQAogICAgIExWTV9TZXRIZWFkcm9vbVBhcmFtcyhoSW5zdGFuY2UsICZIZWFkcm9vbVBhcmFtcyk7CiAKICAgICAvKiBEQyByZW1vdmFsIGZpbHRlciAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBEQ19NY19EMTZfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPkRDX1JlbW92YWxJbnN0YW5jZSk7CisjZWxzZQogICAgIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlKTsKKyNlbmRpZgogCiAgICAgcmV0dXJuIExWTV9TVUNDRVNTOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcml2YXRlLmgKaW5kZXggYjQ1MzIyMi4uMTlkMTUzMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJpdmF0ZS5oCkBAIC0xNDQsMTIgKzE0NCwxOSBAQAogICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwU2NyYXRjaDsgICAgICAgICAgLyogQnVuZGxlIHNjcmF0Y2ggYnVmZmVyICovCiAKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBCdWZmZXJTdGF0ZTsgICAgICAgIC8qIEJ1ZmZlciBzdGF0dXMgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgSW5EZWxheUJ1ZmZlclszICogTFZNX01BWF9DSEFOTkVMUyAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkVdOworI2Vsc2UKICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBJbkRlbGF5QnVmZmVyWzYgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFXTsgLyogSW5wdXQgYnVmZmVyIGRlbGF5IGxpbmUsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgYW5kIHJpZ2h0ICovCisjZW5kaWYKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBJbkRlbGF5U2FtcGxlczsgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBpbnB1dCBkZWxheSBidWZmZXIgKi8KLQorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBPdXREZWxheUJ1ZmZlcltMVk1fTUFYX0NIQU5ORUxTICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRV07CisjZWxzZQogICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIE91dERlbGF5QnVmZmVyWzIgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFXTsgLyogT3V0cHV0IGJ1ZmZlciBkZWxheSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgKi8KKyNlbmRpZgogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE91dERlbGF5U2FtcGxlczsgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIG91dHB1dCBkZWxheSBidWZmZXIsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBhbmQgcmlnaHQgKi8KICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBTYW1wbGVzVG9PdXRwdXQ7ICAgIC8qIFNhbXBsZXMgdG8gd3JpdGUgdG8gdGhlIG91dHB1dCAqLwpAQCAtMjgyLDYgKzI4OSwxMCBAQAogCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICBOb1Ntb290aFZvbHVtZTsgICAgICAvKiBFbmFibGUgb3IgZGlzYWJsZSBzbW9vdGggdm9sdW1lIGNoYW5nZXMqLwogCisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgTnJDaGFubmVsczsKKyNlbmRpZgorCiB9IExWTV9JbnN0YW5jZV90OwogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJvY2Vzcy5jCmluZGV4IDRhMTlhMTMuLjk0YmEyNzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuYwpAQCAtNjUsNiArNjUsMTAgQEAKICAgICBMVk1fRkxPQVQgICAgICAgICAgICpwVG9Qcm9jZXNzID0gKExWTV9GTE9BVCAqKXBJbkRhdGE7CiAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcFByb2Nlc3NlZCA9IHBPdXREYXRhOwogICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gIFN0YXR1czsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0lOVDMyICAgICAgICAgICBOckNoYW5uZWxzICA9IHBJbnN0YW5jZS0+TnJDaGFubmVsczsKKyNkZWZpbmUgTnJGcmFtZXMgU2FtcGxlQ291bnQgIC8vIGFsaWFzIGZvciBjbGFyaXR5CisjZW5kaWYKIAogICAgIC8qCiAgICAgICogQ2hlY2sgaWYgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIHplcm8KQEAgLTExMiw2ICsxMTYsMTAgQEAKICAgICBpZiAocEluc3RhbmNlLT5Db250cm9sUGVuZGluZyA9PSBMVk1fVFJVRSkKICAgICB7CiAgICAgICAgIFN0YXR1cyA9IExWTV9BcHBseU5ld1NldHRpbmdzKGhJbnN0YW5jZSk7CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAvKiBVcGRhdGUgdGhlIGxvY2FsIHZhcmlhYmxlIE5yQ2hhbm5lbHMgZnJvbSBwSW5zdGFuY2UtPk5yQ2hhbm5lbHMgdmFsdWUgKi8KKyAgICAgICAgTnJDaGFubmVscyA9IHBJbnN0YW5jZS0+TnJDaGFubmVsczsKKyNlbmRpZgogCiAgICAgICAgIGlmKFN0YXR1cyAhPSBMVk1fU1VDQ0VTUykKICAgICAgICAgewpAQCAtMTMwLDYgKzEzOCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgaW5wdXQgc2FtcGxlcyAqLwogICAgICAgICBwSW5wdXQgICAgID0gcE91dERhdGE7CiAgICAgICAgIHBUb1Byb2Nlc3MgPSBwT3V0RGF0YTsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgIE5yQ2hhbm5lbHMgPSAyOworI2VuZGlmCiAgICAgfQogCiAKQEAgLTE1Myw3ICsxNjQsNiBAQAogICAgICAgICAgKi8KICAgICAgICAgaWYgKFNhbXBsZUNvdW50ICE9IDApCiAgICAgICAgIHsKLQogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIEFwcGx5IENvbmNlcnRTb3VuZCBpZiByZXF1aXJlZAogICAgICAgICAgICAgICovCkBAIC0xNzEsMTAgKzE4MSwxOCBAQAogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5WQ19BY3RpdmUhPTApCiAgICAgICAgICAgICB7CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgICAgIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckZyYW1lcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKKyNlbHNlCiAgICAgICAgICAgICAgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogU2FtcGxlQ291bnQpKTsgICAgIC8qIExlZnQgYW5kIHJpZ2h0Ki8KKyNlbmRpZgogICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MgPSBwUHJvY2Vzc2VkOwogICAgICAgICAgICAgfQogCkBAIC0yMjEsMjAgKzIzOSwzMyBAQAogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogQXBwbHkgdGhlIGZpbHRlcgogICAgICAgICAgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgICAgICBGT19NY19EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPnBURV9TdGF0ZS0+VHJlYmxlQm9vc3RfU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKKyNlbHNlCiAgICAgICAgICAgICAgICAgRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5wVEVfU3RhdGUtPlRyZWJsZUJvb3N0X1N0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KVNhbXBsZUNvdW50KTsKKyNlbmRpZgogCiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBWb2x1bWUgYmFsYW5jZQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVDb3VudCk7CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgLyogVE9ETyAtIE11bHRpY2hhbm5lbCBzdXBwb3J0IHRvIGJlIGFkZGVkICovCisgICAgICAgICAgICBpZiAoTnJDaGFubmVscyA9PSAyKQorI2VuZGlmCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBWb2x1bWUgYmFsYW5jZQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIExWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZUNvdW50KTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFBlcmZvcm0gUGFyYW1ldHJpYyBTcGVjdHVtIEFuYWx5c2lzCkBAIC0yNDIsMjggKzI3MywzOSBAQAogICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5QU0FfRW5hYmxlID09IExWTV9QU0FfT04pICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPkluc3RQYXJhbXMuUFNBX0luY2x1ZGVkID09IExWTV9QU0FfT04pKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGcm9tMmlUb01vbm9fRmxvYXQocFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoU2FtcGxlQ291bnQpKTsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICAgICAgRnJvbU1jVG9Nb25vX0Zsb2F0KHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckZyYW1lcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOworI2Vsc2UKKyAgICAgICAgICAgICAgICBGcm9tMmlUb01vbm9fRmxvYXQocFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKFNhbXBsZUNvdW50KSk7CisjZW5kaWYKIAotICAgICAgICAgICAgICAgICAgICBMVlBTQV9Qcm9jZXNzKHBJbnN0YW5jZS0+aFBTQUluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShTYW1wbGVDb3VudCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UaW1lKTsKKyAgICAgICAgICAgICAgICBMVlBTQV9Qcm9jZXNzKHBJbnN0YW5jZS0+aFBTQUluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoU2FtcGxlQ291bnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UaW1lKTsKICAgICAgICAgICAgIH0KIAotCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogREMgcmVtb3ZhbAogICAgICAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgRENfTWNfRDE2X1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7CisjZWxzZQogICAgICAgICAgICAgRENfMklfRDE2X1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KVNhbXBsZUNvdW50KTsKLQotCisjZW5kaWYKICAgICAgICAgfQotCiAgICAgICAgIC8qCiAgICAgICAgICAqIE1hbmFnZSB0aGUgb3V0cHV0IGJ1ZmZlcgogICAgICAgICAgKi8KQEAgLTQ5Nyw0ICs1MzksNCBAQAogCiAgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKIH0KLSNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5jCmluZGV4IDE5OWRkZGUuLmE1MzU2ZDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmMKQEAgLTI2OSw2ICsyNjksNTMgQEAKICAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluMTVfQjF9CiAjaWZkZWYgSElHSEVSX0ZTCiAgICAgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgICAgLyogODhrSHogU2FtcGxpbmcgcmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4xX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjJfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAzICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4zX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgNCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW40X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjVfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluNV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA2ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW42X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjZfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgNyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluN19BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW43X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDggKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjhfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluOF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA5ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW45X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjlfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDEwICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xMF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4xMF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTEgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjExX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjExX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluMTJfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMTJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDEzICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xM19BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4xM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTQgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjE0X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjE0X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxNSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluMTVfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMTVfQjF9LAorCiAgICAgICAgICAgICAgICAgICAgIC8qIDk2a0h6IHNhbXBsaW5nIHJhdGUgKi8KICAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLwogICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMV9BMCwKQEAgLTMxNiw2ICszNjMsNTMgQEAKICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjE1X0EwLAogICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjE1X0IxfSwKIAorICAgICAgICAgICAgICAgICAgICAvKiAxNzZrSHogU2FtcGxpbmcgcmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4xX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAyICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjNfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW40X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW40X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA1ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluNV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgNiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjZfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjZfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDcgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW43X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW43X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA4ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluOF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluOF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgOSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjlfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjlfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjEwX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4xMF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDExICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTFfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjExX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMTJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjEzX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4xM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDE0ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTRfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjE0X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMTVfQjF9LAorCiAgICAgICAgICAgICAgICAgICAgIC8qIDE5MmtIeiBzYW1wbGluZyByYXRlICovCiAgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCiAgICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMV9BMCwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQUdDLmgKaW5kZXggOWEzZDM1ZC4uMDZlNzQyZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQUdDLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQUdDLmgKQEAgLTc4LDYgKzc4LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcE1vbm9TcmMsICAgICAgLyogTW9ubyBzb3VyY2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICpwRHN0LCAgICAgICAgICAvKiBTdGVyZW8gZGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIG4pOyAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAqLworI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgQUdDX01JWF9WT0xfTWMxTW9uX0QzMl9XUkEoQUdDX01JWF9WT0xfMlN0MU1vbl9GTE9BVF90ICAqcEluc3RhbmNlLCAgLyogSW5zdGFuY2UgcG9pbnRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBTdFNyYywgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwTW9ub1NyYywgICAgLyogTW9ubyBzb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICpwRHN0LCAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE5yRnJhbWVzLCAgICAgLyogTnVtYmVyIG9mIGZyYW1lcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7ICAvKiBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KKyNlbmRpZgorCiAjZWxzZQogdm9pZCBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEoQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfdCAgKnBJbnN0YW5jZSwgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgICAgICAgICpwU3RTcmMsICAgICAgICAvKiBTdGVyZW8gc291cmNlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9CSVFVQUQuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0JJUVVBRC5oCmluZGV4IDNlZTdmNjMuLjAxNTM5YjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0JJUVVBRC5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0JJUVVBRC5oCkBAIC0zMCw4ICszMCwxNyBAQAogI2lmZGVmIEJVSUxEX0ZMT0FUCiB0eXBlZGVmIHN0cnVjdAogeworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAvKiBUaGUgbWVtb3J5IHJlZ2lvbiBjcmVhdGVkIGJ5IHRoaXMgc3RydWN0dXJlIGluc3RhbmNlIGlzIHR5cGVjYXN0CisgICAgICogaW50byBhbm90aGVyIHN0cnVjdHVyZSBjb250YWluaW5nIGEgcG9pbnRlciBhbmQgYW4gYXJyYXkgb2YgZmlsdGVyCisgICAgICogY29lZmZpY2llbnRzLiBJbiBvbmUgY2FzZSB0aGlzIG1lbW9yeSByZWdpb24gaXMgdXNlZCBmb3Igc3RvcmluZworICAgICAqIERDIGNvbXBvbmVudCBvZiBjaGFubmVscworICAgICAqLworICAgIExWTV9GTE9BVCAqcFN0b3JhZ2U7CisgICAgTFZNX0ZMT0FUIFN0b3JhZ2VbTFZNX01BWF9DSEFOTkVMU107CisjZWxzZQogICAgIExWTV9GTE9BVCBTdG9yYWdlWzZdOwotCisjZW5kaWYKIH0gQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3Q7CiAjZWxzZQogdHlwZWRlZiBzdHJ1Y3QKQEAgLTE3OSw3ICsxODgsMTIgQEAKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKDIgKiAyKSBdOyAgLyogVHdvIGNoYW5uZWxzLCB0d28gdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAvKiBMVk1fTUFYX0NIQU5ORUxTIGNoYW5uZWxzLCB0d28gdGFwcyBvZiBzaXplIExWTV9GTE9BVCAqLworICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoTFZNX01BWF9DSEFOTkVMUyAqIDIpIF07CisjZWxzZQorICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoMiAqIDIpIF07ICAvKiBUd28gY2hhbm5lbHMsIHR3byB0YXBzIG9mIHNpemUgTFZNX0ZMT0FUICovCisjZW5kaWYKIH0gQmlxdWFkXzJJX09yZGVyMV9GTE9BVF9UYXBzX3Q7CiAjZWxzZQogdHlwZWRlZiBzdHJ1Y3QKQEAgLTE5NywxMiArMjExLDE3IEBACiAjaWZkZWYgQlVJTERfRkxPQVQKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgTFZNX0ZMT0FUIFN0b3JhZ2VbICgxICogNCkgXTsgIC8qIE9uZSBjaGFubmVsLCBmb3VyIHRhcHMgb2Ygc2l6ZSBMVk1fSU5UMzIgKi8KKyAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKDEgKiA0KSBdOyAgLyogT25lIGNoYW5uZWwsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9GTE9BVCAqLwogfSBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdDsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKDIgKiA0KSBdOyAgLyogVHdvIGNoYW5uZWxzLCBmb3VyIHRhcHMgb2Ygc2l6ZSBMVk1fSU5UMzIgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgLyogTFZNX01BWF9DSEFOTkVMUywgZm91ciB0YXBzIG9mIHNpemUgTFZNX0ZMT0FUICovCisgICAgTFZNX0ZMT0FUIFN0b3JhZ2VbIChMVk1fTUFYX0NIQU5ORUxTICogNCkgXTsKKyNlbHNlCisgICAgTFZNX0ZMT0FUIFN0b3JhZ2VbICgyICogNCkgXTsgIC8qIFR3byBjaGFubmVscywgZm91ciB0YXBzIG9mIHNpemUgTFZNX0ZMT0FUICovCisjZW5kaWYKIH0gQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3Q7CiAjZWxzZQogdHlwZWRlZiBzdHJ1Y3QKQEAgLTM2Niw2ICszODUsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIEJRX01DX0QzMkYzMkMzMF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7CisjZW5kaWYKICNlbHNlCiB2b2lkIEJRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgKCAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICpwVGFwcywKQEAgLTQzNCw2ICs0NjAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIEZPX01jX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKKyNlbmRpZgogI2Vsc2UKIHZvaWQgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCggICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMV9UYXBzX3QgKnBUYXBzLApAQCAtNTI3LDYgKzU2MCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgUEtfTWNfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOworI2VuZGlmCiAjZWxzZQogdm9pZCBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMSAoICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLApAQCAtNTQwLDEyICs1ODAsMjIgQEAKIAogLyoqKiAxNiBiaXQgZGF0YSBwYXRoIFNURVJFTyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZkZWYgQlVJTERfRkxPQVQKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIERDX01jX0QxNl9UUkNfV1JBXzAxX0luaXQgICAgICggICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UpOworCit2b2lkIERDX01jX0QxNl9UUkNfV1JBXzAxICAgICAgICAgICggICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKKyNlbHNlCiB2b2lkIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQgICAgICggICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UpOwogCiB2b2lkIERDXzJJX0QxNl9UUkNfV1JBXzAxICAgICAgICAgICggICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZW5kaWYKICNlbHNlCiB2b2lkIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQgICAgICggICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVGltZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UaW1lci5oCmluZGV4IDgxZTI4OGMuLmE3NjM1NGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UaW1lci5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UaW1lci5oCkBAIC00NCw3ICs0NCwxNSBAQAogCiB0eXBlZGVmIHN0cnVjdAogewotICAgIExWTV9JTlQzMiBTdG9yYWdlWzZdOworICAgIC8qCisgICAgICogVGhlIG1lbW9yeSBhcmVhIGNyZWF0ZWQgdXNpbmcgdGhpcyBzdHJ1Y3R1cmUgaXMgaW50ZXJuYWxseQorICAgICAqIHR5cGVjYXN0IHRvIExWTV9UaW1lcl9JbnN0YW5jZV9Qcml2YXRlX3QgYW5kIHVzZWQuCisgICAgICogVGhlIExWTV9UaW1lcl9JbnN0YW5jZV9Qcml2YXRlX3Qgc3RydWN0dXJlIGhhcyAzIHBvaW50ZXIgdHlwZSBlbGVtZW50cworICAgICAqIDIgZWxlbWVudHMgb2YgdHlwZSBMVk1fSU5UMzIgYW5kIG9uZSBlbGVtZW50IG9mIHR5cGUgTFZNX0lOVDE2LgorICAgICAqIElub3JkZXIgdG8gY2F0ZXIgYm90aCAzMiBhbmQgNjQgYml0IGJ1aWxkcywgU3RvcmFnZSBhcnJheSBzaG91bGQKKyAgICAgKiBoYXZlIGEgbWluaW11bSBvZiA5IGVsZW1lbnRzIG9mIHR5cGUgTFZNX0lOVDMyLgorICAgICAqLworICAgIExWTV9JTlQzMiBTdG9yYWdlWzldOwogCiB9IExWTV9UaW1lcl9JbnN0YW5jZV90OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UeXBlcy5oCmluZGV4IGVhMTYwNzIuLjU5NTg2ZTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UeXBlcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UeXBlcy5oCkBAIC0xMjIsNiArMTIyLDEyIEBACiAKICNlbmRpZiAvLyBOQVRJVkVfRkxPQVRfQlVGRkVSCiAKKyNpZmRlZiBTVVBQT1JUX01DCisjZGVmaW5lIExWTV9NQVhfQ0hBTk5FTFMgOCAvLyBGQ0NfOAorI2Vsc2UKKyNkZWZpbmUgTFZNX01BWF9DSEFOTkVMUyAyIC8vIEZDQ18yCisjZW5kaWYKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBTdGFuZGFyZCBFbnVtZXJhdGVkIHR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTQzLDYgKzE0OSw5IEBACiAgICAgTFZNX1NURVJFTyAgICAgICAgICA9IDAsCiAgICAgTFZNX01PTk9JTlNURVJFTyAgICA9IDEsCiAgICAgTFZNX01PTk8gICAgICAgICAgICA9IDIsCisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9NVUxUSUNIQU5ORUwgICAgPSAzLAorI2VuZGlmCiAgICAgTFZNX1NPVVJDRV9EVU1NWSAgICA9IExWTV9NQVhFTlVNCiB9IExWTV9Gb3JtYXRfZW47CiAKQEAgLTE2MCw4ICsxNjksMTAgQEAKICAgICBMVk1fRlNfNDQxMDAgPSA3LAogICAgIExWTV9GU180ODAwMCA9IDgsCiAjaWZkZWYgSElHSEVSX0ZTCi0gICAgTFZNX0ZTXzk2MDAwID0gOSwKLSAgICBMVk1fRlNfMTkyMDAwID0gMTAsCisgICAgTFZNX0ZTXzg4MjAwID0gOSwKKyAgICBMVk1fRlNfOTYwMDAgPSAxMCwKKyAgICBMVk1fRlNfMTc2NDAwID0gMTEsCisgICAgTFZNX0ZTXzE5MjAwMCA9IDEyLAogI2VuZGlmCiAgICAgTFZNX0ZTX0lOVkFMSUQgPSBMVk1fTUFYRU5VTS0xLAogICAgIExWTV9GU19EVU1NWSA9IExWTV9NQVhFTlVNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9WZWN0b3JBcml0aG1ldGljLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9WZWN0b3JBcml0aG1ldGljLmgKaW5kZXggMGJhMjBhMy4uNzQ2OGE5MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvVmVjdG9yQXJpdGhtZXRpYy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1ZlY3RvckFyaXRobWV0aWMuaApAQCAtNDcsNiArNDcsMTYgQEAKIHZvaWQgQ29weV9GbG9hdCggICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgQ29weV9GbG9hdF9NY19TdGVyZW8oICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgTnJDaGFubmVscyk7Cit2b2lkIENvcHlfRmxvYXRfU3RlcmVvX01jKCAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyIE5yQ2hhbm5lbHMpOworI2VuZGlmCiAjZWxzZQogdm9pZCBDb3B5XzE2KCAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKQEAgLTE4MSw2ICsxOTEsMTIgQEAKIHZvaWQgRnJvbTJpVG9Nb25vX0Zsb2F0KCAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIEZyb21NY1RvTW9ub19GbG9hdChjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpOworI2VuZGlmCiAjZWxzZQogdm9pZCBGcm9tMmlUb01vbm9fMzIoICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEuYwppbmRleCBmYTlmMDFmLi41Yzg2NTVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEuYwpAQCAtMzA1LDQgKzMwNSwxNTAgQEAKIAogICAgIHJldHVybjsKIH0KKyNpZmRlZiBTVVBQT1JUX01DCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgQUdDX01JWF9WT0xfTWMxTW9uX0QzMl9XUkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQXBwbHkgQUdDIGFuZCBtaXggc2lnbmFscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1jU3JjICAgLS0tLS0tLS0tLS0tLS0tLS0tfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICBfX19fX18gICAgICAgX3xfICAgICAgICBfX19fX19fXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgfCAgICAgIHwgICAgIHwgICB8ICAgICAgfCAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9ub1NyYyAtLT58IEFHQyAgfC0tLS0+fCArIHwtLS0tLT58IFZvbHVtZSB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLT4gICAgKi8KKy8qICAgICAgICAgICAgIHwgR2FpbiB8ICAgICB8X19ffCAgICAgIHwgR2FpbiAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAqLworLyogICAgICAgICAgICAgfF9fX19fX3wgICAgICAgICAgICAgICAgfF9fX19fX19ffCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAvfFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19fX19fX19fXyAgICAgX19fX19fX18gICAgfCAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgIHwgICAgICAgIHwgICB8ICAgICAgICAqLworLyogICAgICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCBBR0MgR2FpbiB8PC0tfCBQZWFrICAgfDwtLXwgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFVwZGF0ZSAgIHwgICB8IERldGVjdCB8ICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxfX19fX19fX19ffCAgIHxfX19fX19fX3wgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1jU3JjICAgICAgICAgICAgICAgICAgTXVsdGljaGFubmVsIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwTW9ub1NyYyAgICAgICAgICAgICAgICBNb25vIGJhbmQgcGFzcyBzb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBEc3QgICAgICAgICAgICAgICAgICAgIE11bHRpY2hhbm5lbCBkZXN0aW5hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTnJGcmFtZXMgICAgICAgICAgICAgICAgTnVtYmVyIG9mIGZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOckNoYW5uZWxzICAgICAgICAgICAgICBOdW1iZXIgb2YgY2hhbm5lbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBWb2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEFHQ19NSVhfVk9MX01jMU1vbl9EMzJfV1JBKEFHQ19NSVhfVk9MXzJTdDFNb25fRkxPQVRfdCAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwTWNTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcE1vbm9TcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAqcERzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgTnJDaGFubmVscykKK3sKKworICAgIC8qCisgICAgICogR2VuZXJhbCB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgaSwgamo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGUgaW5kZXggKi8KKyAgICBMVk1fRkxPQVQgICAgICAgU2FtcGxlVmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGUgdmFsdWUgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgTW9ubzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNb25vIHNhbXBsZSAqLworICAgIExWTV9GTE9BVCAgICAgICBBYnNQZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFic29sdXRlIHBlYWsgc2lnbmFsICovCisgICAgTFZNX0ZMT0FUICAgICAgIEFHQ19NdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hvcnQgQUdDIGdhaW4gKi8KKyAgICBMVk1fRkxPQVQgICAgICAgVm9sX011bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaG9ydCB2b2x1bWUgKi8KKworCisgICAgLyoKKyAgICAgKiBJbnN0YW5jZSBjb250cm9sIHZhcmlhYmxlcworICAgICAqLworICAgIExWTV9GTE9BVCAgICAgIEFHQ19HYWluICAgICAgPSBwSW5zdGFuY2UtPkFHQ19HYWluOyAgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBBR0MgZ2FpbiAqLworICAgIExWTV9GTE9BVCAgICAgIEFHQ19NYXhHYWluICAgPSBwSW5zdGFuY2UtPkFHQ19NYXhHYWluOyAgICAgIC8qIEdldCBtYXhpbXVtIEFHQyBnYWluICovCisgICAgTFZNX0ZMT0FUICAgICAgQUdDX0F0dGFjayAgICA9IHBJbnN0YW5jZS0+QUdDX0F0dGFjazsgICAgICAgLyogQXR0YWNrIHNjYWxlciAqLworICAgIC8qIERlY2F5IHNjYWxlciAqLworICAgIExWTV9GTE9BVCAgICAgIEFHQ19EZWNheSAgICAgPSAocEluc3RhbmNlLT5BR0NfRGVjYXkgKiAoMSA8PCAoREVDQVlfU0hJRlQpKSk7CisgICAgTFZNX0ZMT0FUICAgICAgQUdDX1RhcmdldCAgICA9IHBJbnN0YW5jZS0+QUdDX1RhcmdldDsgICAgICAgLyogR2V0IHRoZSB0YXJnZXQgbGV2ZWwgKi8KKyAgICBMVk1fRkxPQVQgICAgICBWb2xfQ3VycmVudCAgID0gcEluc3RhbmNlLT5Wb2x1bWU7ICAgICAgICAgICAvKiBBY3R1YWwgdm9sdW1lIHNldHRpbmcgKi8KKyAgICBMVk1fRkxPQVQgICAgICBWb2xfVGFyZ2V0ICAgID0gcEluc3RhbmNlLT5UYXJnZXQ7ICAgICAgICAgICAvKiBUYXJnZXQgdm9sdW1lIHNldHRpbmcgKi8KKyAgICBMVk1fRkxPQVQgICAgICBWb2xfVEMgICAgICAgID0gcEluc3RhbmNlLT5Wb2x1bWVUQzsgICAgICAgICAvKiBUaW1lIGNvbnN0YW50ICovCisKKworICAgIC8qCisgICAgICogUHJvY2VzcyBvbiBhIHNhbXBsZSBieSBzYW1wbGUgYmFzaXMKKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTnJGcmFtZXM7IGkrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIGVhY2ggZnJhbWUgKi8KKyAgICB7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSBzY2FsZXJzCisgICAgICAgICAqLworICAgICAgICBBR0NfTXVsdCAgICA9IChMVk1fRkxPQVQpKEFHQ19HYWluKTsgICAgICAgICAgICAgIC8qIEdldCB0aGUgQUdDIGdhaW4gKi8KKyAgICAgICAgVm9sX011bHQgICAgPSAoTFZNX0ZMT0FUKShWb2xfQ3VycmVudCk7ICAgICAgICAgICAvKiBHZXQgdGhlIHZvbHVtZSBnYWluICovCisKKyAgICAgICAgQWJzUGVhayA9IDAuMGY7CisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgaW5wdXQgc2FtcGxlcworICAgICAgICAgKi8KKyAgICAgICAgZm9yIChqaiA9IDA7IGpqIDwgTnJDaGFubmVsczsgamorKykKKyAgICAgICAgeworICAgICAgICAgICAgU2FtcGxlVmFsICA9ICpwTWNTcmMrKzsgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgc2FtcGxlIHZhbHVlIG9mIGpqIENoYW5uZWwqLworICAgICAgICAgICAgTW9ubyAgICAgICA9ICpwTW9ub1NyYzsgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbW9ubyBzYW1wbGUgKi8KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEFwcGx5IHRoZSBBR0MgZ2FpbiB0byB0aGUgbW9ubyBpbnB1dCBhbmQgbWl4IHdpdGggdGhlIGlucHV0IHNpZ25hbAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBTYW1wbGVWYWwgICs9IChNb25vICogQUdDX011bHQpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1peCBpbiB0aGUgbW9ubyBzaWduYWwgKi8KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEFwcGx5IHRoZSB2b2x1bWUgYW5kIHdyaXRlIHRvIHRoZSBvdXRwdXQgc3RyZWFtCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFNhbXBsZVZhbCAgPSBTYW1wbGVWYWwgICogVm9sX011bHQ7CisKKyAgICAgICAgICAgICpwRHN0KysgPSBTYW1wbGVWYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIHRoZSByZXN1bHRzICovCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIEFHQyBnYWluCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEFic1BlYWsgPSBBYnNfRmxvYXQoU2FtcGxlVmFsKSA+IEFic1BlYWsgPyBBYnNfRmxvYXQoU2FtcGxlVmFsKSA6IEFic1BlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEFic1BlYWsgPiBBR0NfVGFyZ2V0KQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhlIHNpZ25hbCBpcyB0b28gbGFyZ2Ugc28gZGVjcmVhc2UgdGhlIGdhaW4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQUdDX0dhaW4gPSBBR0NfR2FpbiAqIEFHQ19BdHRhY2s7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhlIHNpZ25hbCBpcyB0b28gc21hbGwgc28gaW5jcmVhc2UgdGhlIGdhaW4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKEFHQ19HYWluID4gQUdDX01heEdhaW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQUdDX0dhaW4gLT0gKEFHQ19EZWNheSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQUdDX0dhaW4gKz0gKEFHQ19EZWNheSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcE1vbm9TcmMrKzsKKyAgICAgICAgLyoKKyAgICAgICAgICogVXBkYXRlIHRoZSBnYWluCisgICAgICAgICAqLworICAgICAgICBWb2xfQ3VycmVudCArPSAgKFZvbF9UYXJnZXQgLSBWb2xfQ3VycmVudCkgKiAoKExWTV9GTE9BVClWb2xfVEMgLyBWT0xfVENfRkxPQVQpOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPlZvbHVtZSA9IFZvbF9DdXJyZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBY3R1YWwgdm9sdW1lIHNldHRpbmcgKi8KKyAgICBwSW5zdGFuY2UtPkFHQ19HYWluID0gQUdDX0dhaW47CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYgLypTVVBQT1JUX01DKi8KICNlbmRpZiAvKkJVSUxEX0ZMT0FUKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jCmluZGV4IDk2MGRlNzkuLmQ2MzM2NWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEuYwpAQCAtMTIzLDYgKzEyMyw4NyBAQAogICAgICAgICB9CiAKICAgICB9CisKKyNpZmRlZiBTVVBQT1JUX01DCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBBU1NVTVBUSU9OUzoKKyBDT0VGUy0KKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEyLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEExCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyBBMCwgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSBpcyAtQjIKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdIGlzIC1CMQorCisgREVMQVlTLQorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSB0bworIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzIC0gMV0gaXMgeChuLTEpIGZvciBhbGwgTnJDaGFubmVscworCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHNdIHRvCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzIqTnJDaGFubmVscyAtIDFdIGlzIHgobi0yKSBmb3IgYWxsIE5yQ2hhbm5lbHMKKworIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syKk5yQ2hhbm5lbHNdIHRvCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzMqTnJDaGFubmVscyAtIDFdIGlzIHkobi0xKSBmb3IgYWxsIE5yQ2hhbm5lbHMKKworIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szKk5yQ2hhbm5lbHNdIHRvCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzQqTnJDaGFubmVscyAtIDFdIGlzIHkobi0yKSBmb3IgYWxsIE5yQ2hhbm5lbHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgQlFfTUNfRDMyRjMyQzMwX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKQorCisKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCB5biwgdGVtcDsKKyAgICAgICAgTFZNX0lOVDE2IGlpLCBqajsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworCisgICAgICAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIENIQU5ORUwtV0lTRQorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgZm9yIChqaiA9IDA7IGpqIDwgTnJDaGFubmVsczsgamorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiB5bj0gKEEyICAqIHgobi0yKSkgKi8KKyAgICAgICAgICAgICAgICB5biA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyArIGpqXTsKKworICAgICAgICAgICAgICAgIC8qIHluKz0gKEExICAqIHgobi0xKSkgKi8KKyAgICAgICAgICAgICAgICB0ZW1wID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tqal07CisgICAgICAgICAgICAgICAgeW4gKz0gdGVtcDsKKworICAgICAgICAgICAgICAgIC8qIHluKz0gKEEwICAqIHgobikpICovCisgICAgICAgICAgICAgICAgdGVtcCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKnBEYXRhSW4pOworICAgICAgICAgICAgICAgIHluICs9IHRlbXA7CisKKyAgICAgICAgICAgICAgICAgLyogeW4rPSAoLUIyICAqIHkobi0yKSkgKi8KKyAgICAgICAgICAgICAgICB0ZW1wID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzKjMgKyBqal07CisgICAgICAgICAgICAgICAgeW4gKz0gdGVtcDsKKworICAgICAgICAgICAgICAgIC8qIHluKz0gKC1CMSAgKiB5KG4tMSkpICovCisgICAgICAgICAgICAgICAgdGVtcCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyoyICsgampdOworICAgICAgICAgICAgICAgIHluICs9IHRlbXA7CisKKyAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDMgKyBqal0gPQorICAgICAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDIgKyBqal07IC8qIHkobi0yKT15KG4tMSkqLworICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICogMSArIGpqXSA9CisgICAgICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tqal07IC8qIHgobi0yKT14KG4tMSkqLworICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICogMiArIGpqXSA9IChMVk1fRkxPQVQpeW47IC8qIFVwZGF0ZSB5KG4tMSkqLworICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tqal0gPSAoKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpKi8KKyAgICAgICAgICAgICAgICBwRGF0YUluKys7CisgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKXluOyAvKiBXcml0ZSBqaiBDaGFubmVsIG91dHB1dCAqLworICAgICAgICAgICAgICAgIHBEYXRhT3V0Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKyNlbmRpZiAvKlNVUFBPUlRfTUMqLworCiAjZWxzZQogdm9pZCBCUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29weV8xNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29weV8xNi5jCmluZGV4IGU0ODkwMzEuLjFmOWY2NTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcHlfMTYuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3B5XzE2LmMKQEAgLTg0LDUgKzg0LDY1IEBACiAKICAgICByZXR1cm47CiB9CisjaWZkZWYgU1VQUE9SVF9NQworLy8gRXh0cmFjdCBvdXQgdGhlIHN0ZXJlbyBjaGFubmVsIHBhaXIgZnJvbSBtdWx0aWNoYW5uZWwgc291cmNlLgordm9pZCBDb3B5X0Zsb2F0X01jX1N0ZXJlbyhjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckZyYW1lcywgLyogTnVtYmVyIG9mIGZyYW1lcyAqLworICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgTnJDaGFubmVscykKK3sKKyAgICBMVk1fSU5UMTYgaWk7CisKKyAgICBpZiAoTnJDaGFubmVscyA+PSAyKQorICAgIHsKKyAgICAgICAgZm9yIChpaSA9IE5yRnJhbWVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisgICAgICAgICAgICBkc3RbMF0gPSBzcmNbMF07CisgICAgICAgICAgICBkc3RbMV0gPSBzcmNbMV07CisgICAgICAgICAgICBkc3QgKz0gMjsKKyAgICAgICAgICAgIHNyYyArPSBOckNoYW5uZWxzOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKE5yQ2hhbm5lbHMgPT0gMSkKKyAgICB7ICAgLy8gbm90IGV4cGVjdGVkIHRvIG9jY3VyLCBwcm92aWRlZCBmb3IgY29tcGxldGVuZXNzLgorICAgICAgICBzcmMgKz0gKE5yRnJhbWVzIC0gMSk7CisgICAgICAgIGRzdCArPSAyICogKE5yRnJhbWVzIC0gMSk7CisgICAgICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworICAgICAgICAgICAgZHN0WzBdID0gc3JjWzBdOworICAgICAgICAgICAgZHN0WzFdID0gc3JjWzBdOworICAgICAgICAgICAgZHN0IC09IDI7CisgICAgICAgICAgICBzcmMgLS07CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIE1lcmdlIGEgbXVsdGljaGFubmVsIHNvdXJjZSB3aXRoIHN0ZXJlbyBjb250YWluZWQgaW4gZHN0LCB0byBkc3QuCit2b2lkIENvcHlfRmxvYXRfU3RlcmVvX01jKGNvbnN0IExWTV9GTE9BVCAqc3JjLAorICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yRnJhbWVzLCAvKiBOdW1iZXIgb2YgZnJhbWVzKi8KKyAgICAgICAgICAgICAgICAgTFZNX0lOVDMyIE5yQ2hhbm5lbHMpCit7CisgICAgTFZNX0lOVDE2IGlpLCBqajsKKyAgICBMVk1fRkxPQVQgKnNyY19zdCA9IGRzdCArIDIgKiAoTnJGcmFtZXMgLSAxKTsKKworICAgIC8vIHJlcGFjayBkc3Qgd2hpY2ggY2FycmllcyBzdGVyZW8gaW5mb3JtYXRpb24KKyAgICAvLyB0b2dldGhlciB3aXRoIHRoZSB1cHBlciBjaGFubmVscyBvZiBzcmMuCisgICAgZHN0ICs9IE5yQ2hhbm5lbHMgKiAoTnJGcmFtZXMgLSAxKTsKKyAgICBzcmMgKz0gTnJDaGFubmVscyAqIChOckZyYW1lcyAtIDEpOworICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIGRzdFswXSA9IHNyY19zdFswXTsKKyAgICAgICAgZHN0WzFdID0gc3JjX3N0WzFdOworICAgICAgICBmb3IgKGpqID0gMjsgamogPCBOckNoYW5uZWxzOyBqaisrKQorICAgICAgICB7CisgICAgICAgICAgICBkc3RbampdID0gc3JjW2pqXTsKKyAgICAgICAgfQorICAgICAgICBkc3QgICAgLT0gTnJDaGFubmVsczsKKyAgICAgICAgc3JjICAgIC09IE5yQ2hhbm5lbHM7CisgICAgICAgIHNyY19zdCAtPSAyOworICAgIH0KK30KKyNlbmRpZgogI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMS5jCmluZGV4IGQyNjFjOWUuLjEzZmFjNWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDEuYwpAQCAtMzMsNyArMzMsNyBAQAogICAgICAgICBSaWdodERDID0gcEJpcXVhZFN0YXRlLT5SaWdodERDOwogICAgICAgICBmb3IoaiA9IE5yU2FtcGxlcy0xOyBqID49IDA7IGotLSkKICAgICAgICAgewotICAgICAgICAgICAgLyogU3VidHJhY3QgREMgYW4gc2F0dXJhdGUgKi8KKyAgICAgICAgICAgIC8qIFN1YnRyYWN0IERDIGFuZCBzYXR1cmF0ZSAqLwogICAgICAgICAgICAgRGlmZiA9KiAocERhdGFJbisrKSAtIChMZWZ0REMpOwogICAgICAgICAgICAgaWYgKERpZmYgPiAxLjBmKSB7CiAgICAgICAgICAgICAgICAgRGlmZiA9IDEuMGY7IH0KQEAgLTY0LDYgKzY0LDU4IEBACiAKIAogICAgIH0KKyNpZmRlZiBTVVBQT1JUX01DCisvKgorICogRlVOQ1RJT046ICAgICAgIERDX01jX0QxNl9UUkNfV1JBXzAxCisgKgorICogREVTQ1JJUFRJT046CisgKiAgREMgcmVtb3ZhbCBmcm9tIGFsbCBjaGFubmVscyBvZiBhIG11bHRpY2hhbm5lbCBpbnB1dAorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgcEluc3RhbmNlICAgICAgSW5zdGFuY2UgcG9pbnRlcgorICogIHBEYXRhSW4gICAgICAgIElucHV0L1NvdXJjZQorICogIHBEYXRhT3V0ICAgICAgIE91dHB1dC9EZXN0aW5hdGlvbgorICogIE5yRnJhbWVzICAgICAgIE51bWJlciBvZiBmcmFtZXMKKyAqICBOckNoYW5uZWxzICAgICBOdW1iZXIgb2YgY2hhbm5lbHMKKyAqCisgKiBSRVRVUk5TOgorICogIHZvaWQKKyAqCisgKi8KK3ZvaWQgRENfTWNfRDE2X1RSQ19XUkFfMDEoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgKkNoREM7CisgICAgICAgIExWTV9GTE9BVCBEaWZmOworICAgICAgICBMVk1fSU5UMzIgajsKKyAgICAgICAgTFZNX0lOVDMyIGk7CisgICAgICAgIFBGaWx0ZXJfRkxPQVRfU3RhdGVfTWMgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfRkxPQVRfU3RhdGVfTWMpIHBJbnN0YW5jZTsKKworICAgICAgICBDaERDID0gJnBCaXF1YWRTdGF0ZS0+Q2hEQ1swXTsKKyAgICAgICAgZm9yIChqID0gTnJGcmFtZXMgLSAxOyBqID49IDA7IGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogU3VidHJhY3QgREMgYW5kIHNhdHVyYXRlICovCisgICAgICAgICAgICBmb3IgKGkgPSBOckNoYW5uZWxzIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRGlmZiA9ICoocERhdGFJbisrKSAtIChDaERDW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAoRGlmZiA+IDEuMGYpIHsKKyAgICAgICAgICAgICAgICAgICAgRGlmZiA9IDEuMGY7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChEaWZmIDwgLTEuMGYpIHsKKyAgICAgICAgICAgICAgICAgICAgRGlmZiA9IC0xLjBmOyB9CisgICAgICAgICAgICAgICAgKihwRGF0YU91dCsrKSA9IChMVk1fRkxPQVQpRGlmZjsKKyAgICAgICAgICAgICAgICBpZiAoRGlmZiA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQ2hEQ1tpXSAtPSBEQ19GTE9BVF9TVEVQOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIENoRENbaV0gKz0gRENfRkxPQVRfU1RFUDsgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgIH0KKyNlbmRpZgogI2Vsc2UKIHZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDEoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuYwppbmRleCA0ZjRmY2Q4Li4wZjk0MWEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdC5jCkBAIC0yNCw2ICsyNCwxNyBAQAogICAgIHBCaXF1YWRTdGF0ZS0+TGVmdERDICAgICAgICA9IDAuMGY7CiAgICAgcEJpcXVhZFN0YXRlLT5SaWdodERDICAgICAgID0gMC4wZjsKIH0KKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkICBEQ19NY19EMTZfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSkKK3sKKyAgICBQRmlsdGVyX0ZMT0FUX1N0YXRlX01jIHBCaXF1YWRTdGF0ZSAgPSAoUEZpbHRlcl9GTE9BVF9TdGF0ZV9NYykgcEluc3RhbmNlOworICAgIExWTV9JTlQzMiBpOworICAgIGZvciAoaSA9IDA7IGkgPCBMVk1fTUFYX0NIQU5ORUxTOyBpKyspCisgICAgeworICAgICAgICBwQmlxdWFkU3RhdGUtPkNoRENbaV0gPSAwLjBmOworICAgIH0KK30KKyNlbmRpZgogI2Vsc2UKIHZvaWQgIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0luc3RhbmNlX3QgICAqcEluc3RhbmNlKQogewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IGZhNmI3MjkuLmRiM2E2ZDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTM0LDYgKzM0LDEzIEBACiAgICAgTFZNX0ZMT0FUICBSaWdodERDOyAgICAvKiBSaWdodERDICAqLwogfUZpbHRlcl9GTE9BVF9TdGF0ZTsKIHR5cGVkZWYgRmlsdGVyX0ZMT0FUX1N0YXRlICogUEZpbHRlcl9GTE9BVF9TdGF0ZSA7CisjaWZkZWYgU1VQUE9SVF9NQwordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9GTE9BVF9TdGF0ZV9NY18KK3sKKyAgICBMVk1fRkxPQVQgIENoRENbTFZNX01BWF9DSEFOTkVMU107ICAgICAvKiBDaGFubmVsREMgICovCit9IEZpbHRlcl9GTE9BVF9TdGF0ZV9NYzsKK3R5cGVkZWYgRmlsdGVyX0ZMT0FUX1N0YXRlX01jICogUEZpbHRlcl9GTE9BVF9TdGF0ZV9NYyA7CisjZW5kaWYKICNlbHNlCiB0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXwogewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMS5jCmluZGV4IDE5MjkyN2MuLjJhNTBmMTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxLmMKQEAgLTExNyw2ICsxMTcsOTMgQEAKICAgICAgICAgfQogCiAgICAgfQorI2lmZGVmIFNVUFBPUlRfTUMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQVNTVU1QVElPTlM6CitDT0VGUy0KK3BCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTEsCitwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEEwLAorcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyAtQjEsCitERUxBWVMtCitwQmlxdWFkU3RhdGUtPnBEZWxheXNbMipjaCArIDBdIGlzIHgobi0xKSBvZiB0aGUgJ2NoJyAtIGNoYW5uZWwKK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1syKmNoICsgMV0gaXMgeShuLTEpIG9mIHRoZSAnY2gnIC0gY2hhbm5lbAorVGhlIGluZGV4ICdjaCcgcnVucyBmcm9tIDAgdG8gKE5yQ2hhbm5lbHMgLSAxKQorCitQQVJBTUVURVJTOgorIHBJbnN0YW5jZSAgICAgICAgUG9pbnRlciBJbnN0YW5jZQorIHBEYXRhSW4gICAgICAgICAgSW5wdXQvU291cmNlCisgcERhdGFPdXQgICAgICAgICBPdXRwdXQvRGVzdGluYXRpb24KKyBOckZyYW1lcyAgICAgICAgIE51bWJlciBvZiBmcmFtZXMKKyBOckNoYW5uZWxzICAgICAgIE51bWJlciBvZiBjaGFubmVscworCitSRVRVUk5TOgorIHZvaWQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRk9fTWNfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckNoYW5uZWxzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUICAgeW47CisgICAgICAgIExWTV9GTE9BVCAgIFRlbXA7CisgICAgICAgIExWTV9JTlQxNiAgIGlpOworICAgICAgICBMVk1fSU5UMTYgICBjaDsKKyAgICAgICAgUEZpbHRlcl9GbG9hdF9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9GbG9hdF9TdGF0ZSkgcEluc3RhbmNlOworCisgICAgICAgIExWTV9GTE9BVCAgICpwRGVsYXlzID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzOworICAgICAgICBMVk1fRkxPQVQgICAqcENvZWZzICA9ICZwQmlxdWFkU3RhdGUtPmNvZWZzWzBdOworICAgICAgICBMVk1fRkxPQVQgICBBMCA9IHBDb2Vmc1sxXTsKKyAgICAgICAgTFZNX0ZMT0FUICAgQTEgPSBwQ29lZnNbMF07CisgICAgICAgIExWTV9GTE9BVCAgIEIxID0gcENvZWZzWzJdOworCisKKworCisgICAgICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBDSEFOTkVMUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgTnJDaGFubmVsczsgY2grKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB5biA9QTEgICogeChuLTEpCisgICAgICAgICAgICAgICAgeW4gPSAoTFZNX0ZMT0FUKUExICogcERlbGF5c1swXTsKKworICAgICAgICAgICAgICAgIC8vIHluKz1BMCAgKiB4KG4pCisgICAgICAgICAgICAgICAgeW4gKz0gKExWTV9GTE9BVClBMCAqICgqcERhdGFJbik7CisKKyAgICAgICAgICAgICAgICAvLyB5biArPSAgKC1CMSAgKiB5KG4tMSkpCisgICAgICAgICAgICAgICAgVGVtcCA9IEIxICogcERlbGF5c1sxXTsKKyAgICAgICAgICAgICAgICB5biArPSBUZW1wOworCisKKyAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICBwRGVsYXlzWzFdID0geW47IC8vIFVwZGF0ZSB5KG4tMSkKKyAgICAgICAgICAgICAgICBwRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpCisKKyAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICAgICAgLypTYXR1cmF0ZSByZXN1bHRzKi8KKyAgICAgICAgICAgICAgICBpZiAoeW4gPiAxLjBmKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeW4gPSAxLjBmOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeW4gPCAtMS4wZikgeworICAgICAgICAgICAgICAgICAgICB5biA9IC0xLjBmOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCl5bjsKKyAgICAgICAgICAgICAgICBwRGVsYXlzICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwRGVsYXlzIC09IE5yQ2hhbm5lbHMgKiAyOworICAgICAgICB9CisgICAgfQorI2VuZGlmCiAjZWxzZQogdm9pZCBGT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jCmluZGV4IGFjMWVlYTguLmQwMmFmODggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jCkBAIC02OCw1ICs2OCw0NyBAQAogCiAgICAgcmV0dXJuOwogfQorI2lmZGVmIFNVUFBPUlRfTUMKKy8qCisgKiBGVU5DVElPTjogICAgICAgRnJvbU1jVG9Nb25vX0Zsb2F0CisgKgorICogREVTQ1JJUFRJT046CisgKiAgQ3JlYXRlcyBhIG1vbm8gc3RyZWFtIGZyb20gYSBtdWx0aWNoYW5uZWwgaW5wdXQgdGFraW5nIHRoZSBhdmVyZ2FlIG9mCisgKiAgc2FtcGxlIHZhbHVlcyBvZiBhbGwgY2hhbm5lbHMKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHNyYyAgICAgICAgICAgIFNvdXJjZQorICogIGRzdCAgICAgICAgICAgIERlc3RpbmF0aW9uCisgKiAgTnJGcmFtZXMgICAgICAgTnVtYmVyIG9mIGZyYW1lcworICogIE5yQ2hhbm5lbHMgICAgIE51bWJlciBvZiBjaGFubmVscworICoKKyAqIFJFVFVSTlM6CisgKiAgdm9pZAorICoKKyAqLwordm9pZCBGcm9tTWNUb01vbm9fRmxvYXQoY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckNoYW5uZWxzKQoreworICAgIExWTV9JTlQxNiBpaSwgamo7CisgICAgTFZNX0ZMT0FUIFRlbXA7CisKKyAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBUZW1wID0gMC4wZjsKKyAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9MDsgamotLSkKKyAgICAgICAgeworICAgICAgICAgICAgVGVtcCArPSAoKnNyYyk7CisgICAgICAgICAgICBzcmMrKzsKKyAgICAgICAgfQorICAgICAgICAqZHN0ID0gVGVtcCAvIE5yQ2hhbm5lbHM7CisgICAgICAgIGRzdCsrOworICAgIH0KKworICAgIHJldHVybjsKK30KKyNlbmRpZgorCiAjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FULmMKaW5kZXggZDI2OTRjYy4uNDE5YzdjNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVC5jCkBAIC0yNiwxMCArMjYsMTAgQEAKICAgIEZVTkNUSU9OIExWQ29yZV9NSVhTT0ZUXzFTVF9EMTZDMzFfV1JBCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQordm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVChMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgIG4pCiB7CiAKICAgICBMVk1fSU5UMTYgICBPdXRMb29wOwpAQCAtMTE0LDYgKzExNCwxMzkgQEAKICAgICB9CiAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gQ3VycmVudDsKIH0KKyNpZmRlZiBTVVBQT1JUX01DCisvKgorICogRlVOQ1RJT046ICAgICAgIExWQ19Db3JlX01peEluU29mdF9NY19EMTZDMzFfU0FUCisgKgorICogREVTQ1JJUFRJT046CisgKiAgTWl4ZXIgZnVuY3Rpb24gd2l0aCBzdXBwb3J0IGZvciBwcm9jZXNzaW5nIG11bHRpY2hhbm5lbCBpbnB1dC4KKyAqCisgKiBQQVJBTUVURVJTOgorICogIHB0ckluc3RhbmNlICAgIEluc3RhbmNlIHBvaW50ZXIKKyAqICBzcmMgICAgICAgICAgICBTb3VyY2UKKyAqICBkc3QgICAgICAgICAgICBEZXN0aW5hdGlvbgorICogIE5yRnJhbWVzICAgICAgIE51bWJlciBvZiBmcmFtZXMKKyAqICBOckNoYW5uZWxzICAgICBOdW1iZXIgb2YgY2hhbm5lbHMKKyAqCisgKiBSRVRVUk5TOgorICogIHZvaWQKKyAqCisgKi8KK3ZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQoTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgTnJDaGFubmVscykKK3sKKworICAgIExWTV9JTlQxNiAgIE91dExvb3A7CisgICAgTFZNX0lOVDE2ICAgSW5Mb29wOworICAgIExWTV9JTlQzMiAgIGlpLCBqajsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+UHJpdmF0ZVBhcmFtcyk7CisgICAgTFZNX0ZMT0FUICAgRGVsdGEgPSBwSW5zdGFuY2UtPkRlbHRhOworICAgIExWTV9GTE9BVCAgIEN1cnJlbnQgPSBwSW5zdGFuY2UtPkN1cnJlbnQ7CisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgTFZNX0ZMT0FUICAgVGVtcDsKKworICAgIC8qCisgICAgICogU2FtZSBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIG9uIGNvbnNlY3V0aXZlIGZyYW1lcy4KKyAgICAgKiBTbyB0d28gZnJhbWVzIGFyZSBwcm9jZXNzZWQgaW4gb25lIGl0ZXJhdGlvbiBhbmQKKyAgICAgKiB0aGUgbG9vcCB3aWxsIHJ1biBvbmx5IGZvciBoYWxmIHRoZSBOckZyYW1lcyB2YWx1ZSB0aW1lcy4KKyAgICAgKi8KKyAgICBJbkxvb3AgPSAoTFZNX0lOVDE2KShOckZyYW1lcyA+PiAxKTsKKyAgICAvKiBPdXRMb29wIGlzIGNhbGN1bGF0ZWQgdG8gaGFuZGxlIGNhc2VzIHdoZXJlIE5yRnJhbWVzIHZhbHVlIGNhbiBiZSBvZGQuKi8KKyAgICBPdXRMb29wID0gKExWTV9JTlQxNikoTnJGcmFtZXMgLSAoSW5Mb29wIDw8IDEpKTsKKworICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KSB7CisgICAgICAgIGlmIChPdXRMb29wKSB7CisgICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOworICAgICAgICAgICAgQ3VycmVudCA9IFRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wKk5yQ2hhbm5lbHM7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgICAgICAgICBUZW1wID0gKCpkc3QpICsgKCooc3JjKyspICogQ3VycmVudCk7CisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSBUZW1wOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAgICAgVGVtcCA9IEN1cnJlbnQgKyBEZWx0YTsKKyAgICAgICAgICAgIEN1cnJlbnQgPSBUZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9IDAgOyBqai0tKSB7CisgICAgICAgICAgICAgICAgVGVtcCA9ICgqZHN0KSArICgqKHNyYysrKSAqIEN1cnJlbnQpOworICAgICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gVGVtcDsKKworICAgICAgICAgICAgICAgIFRlbXAgPSAoKmRzdCkgKyAoKihzcmMrKykgKiBDdXJyZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IFRlbXA7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNleworICAgICAgICBpZiAoT3V0TG9vcCkgeworICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKKyAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wKk5yQ2hhbm5lbHM7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgICAgICAgICBUZW1wID0gKCpkc3QpICsgKCooc3JjKyspICogQ3VycmVudCk7CisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSBUZW1wOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKKyAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPSAwIDsgamotLSkgeworICAgICAgICAgICAgICAgIFRlbXAgPSAoKmRzdCkgKyAoKihzcmMrKykgKiBDdXJyZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IFRlbXA7CisKKyAgICAgICAgICAgICAgICBUZW1wID0gKCpkc3QpICsgKCooc3JjKyspICogQ3VycmVudCk7CisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSBUZW1wOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gQ3VycmVudDsKK30KKworI2VuZGlmCiAjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfc3QgKnB0ckluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQS5jCmluZGV4IGI1ZTdmNWMuLjViZmRhZDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmMKQEAgLTI3LDEwICsyNywxMCBAQAogICAgRlVOQ1RJT04gTFZDb3JlX01JWFNPRlRfMVNUX0QxNkMzMV9XUkEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3ZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQShMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgIG4pCiB7CiAgICAgTFZNX0lOVDE2ICAgT3V0TG9vcDsKICAgICBMVk1fSU5UMTYgICBJbkxvb3A7CkBAIC0xMDUsNiArMTA1LDExOSBAQAogICAgIH0KICAgICBwSW5zdGFuY2UtPkN1cnJlbnQ9Q3VycmVudDsKIH0KKworCisjaWZkZWYgU1VQUE9SVF9NQworLyoKKyAqIEZVTkNUSU9OOiAgICAgICBMVkNfQ29yZV9NaXhTb2Z0X01jX0QxNkMzMV9XUkEKKyAqCisgKiBERVNDUklQVElPTjoKKyAqICBNaXhlciBmdW5jdGlvbiB3aXRoIHN1cHBvcnQgZm9yIHByb2Nlc3NpbmcgbXVsdGljaGFubmVsIGlucHV0CisgKgorICogUEFSQU1FVEVSUzoKKyAqICBwdHJJbnN0YW5jZSAgICBJbnN0YW5jZSBwb2ludGVyCisgKiAgc3JjICAgICAgICAgICAgU291cmNlCisgKiAgZHN0ICAgICAgICAgICAgRGVzdGluYXRpb24KKyAqICBOckZyYW1lcyAgICAgICBOdW1iZXIgb2YgZnJhbWVzCisgKiAgTnJDaGFubmVscyAgICAgTnVtYmVyIG9mIGNoYW5uZWxzCisgKgorICogUkVUVVJOUzoKKyAqICB2b2lkCisgKgorICovCit2b2lkIExWQ19Db3JlX01peFNvZnRfTWNfRDE2QzMxX1dSQShMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgTnJDaGFubmVscykKK3sKKyAgICBMVk1fSU5UMTYgICBPdXRMb29wOworICAgIExWTV9JTlQxNiAgIEluTG9vcDsKKyAgICBMVk1fSU5UMzIgICBpaSwgamo7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2U9KE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBMVk1fRkxPQVQgICBEZWx0YT0gKExWTV9GTE9BVClwSW5zdGFuY2UtPkRlbHRhOworICAgIExWTV9GTE9BVCAgIEN1cnJlbnQgPSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+Q3VycmVudDsKKyAgICBMVk1fRkxPQVQgICBUYXJnZXQ9IChMVk1fRkxPQVQpcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgTFZNX0ZMT0FUICAgVGVtcDsKKworICAgIC8qCisgICAgICogU2FtZSBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIG9uIGNvbnNlY3V0aXZlIGZyYW1lcy4KKyAgICAgKiBTbyB0d28gZnJhbWVzIGFyZSBwcm9jZXNzZWQgaW4gb25lIGl0ZXJhdGlvbiBhbmQKKyAgICAgKiB0aGUgbG9vcCB3aWxsIHJ1biBvbmx5IGZvciBoYWxmIHRoZSBOckZyYW1lcyB2YWx1ZSB0aW1lcy4KKyAgICAgKi8KKyAgICBJbkxvb3AgPSAoTFZNX0lOVDE2KShOckZyYW1lcyA+PiAxKTsKKyAgICAvKiBPdXRMb29wIGlzIGNhbGN1bGF0ZWQgdG8gaGFuZGxlIGNhc2VzIHdoZXJlIE5yRnJhbWVzIHZhbHVlIGNhbiBiZSBvZGQuKi8KKyAgICBPdXRMb29wID0gKExWTV9JTlQxNikoTnJGcmFtZXMgLSAoSW5Mb29wIDw8IDEpKTsKKworICAgIGlmIChDdXJyZW50PFRhcmdldCkgeworICAgICAgICBpZiAoT3V0TG9vcCkgeworCisgICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOworICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgIFRlbXAgPSAxLjBmOworICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgIFRlbXAgPSAtMS4wZjsKKworICAgICAgICAgICAgQ3VycmVudD1UZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0wOyBqai0tKSB7CisgICAgICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSkgeworCisgICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOworCisgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgVGVtcCA9IDEuMGY7CisgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgVGVtcCA9IC0xLjBmOworCisgICAgICAgICAgICBDdXJyZW50PVRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0gMCA7IGpqLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZXsKKyAgICAgICAgaWYgKE91dExvb3ApIHsKKyAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPTA7IGpqLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9IDAgOyBqai0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHBJbnN0YW5jZS0+Q3VycmVudD1DdXJyZW50OworfQorI2VuZGlmCisKICNlbHNlCiB2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoIExWTWl4ZXIzX3N0ICpwdHJJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYywKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhJblNvZnRfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmMKaW5kZXggMTkyZjEyNi4uNjU5NTZmNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmMKQEAgLTM0LDEwICszNCwxMCBAQAogICAgRlVOQ1RJT04gTUlYSU5TT0ZUX0QxNkMzMV9TQVQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgbikKK3ZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIG4pCiB7CiAgICAgY2hhciAgICAgICAgSGFyZE1peGluZyA9IFRSVUU7CiAgICAgTFZNX0ZMT0FUICAgVGFyZ2V0R2FpbjsKQEAgLTEwNiw2ICsxMDYsMTEwIEBACiAgICAgfQogCiB9CisKKworCisjaWZkZWYgU1VQUE9SVF9NQworLyoKKyAqIEZVTkNUSU9OOiAgICAgICBMVkNfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQKKyAqCisgKiBERVNDUklQVElPTjoKKyAqICBNaXhlciBmdW5jdGlvbiB3aXRoIHN1cHBvcnQgZm9yIHByb2Nlc3NpbmcgbXVsdGljaGFubmVsIGlucHV0CisgKgorICogUEFSQU1FVEVSUzoKKyAqICBwdHJJbnN0YW5jZSAgICBJbnN0YW5jZSBwb2ludGVyCisgKiAgc3JjICAgICAgICAgICAgU291cmNlCisgKiAgZHN0ICAgICAgICAgICAgRGVzdGluYXRpb24KKyAqICBOckZyYW1lcyAgICAgICBOdW1iZXIgb2YgZnJhbWVzCisgKiAgTnJDaGFubmVscyAgICAgTnVtYmVyIG9mIGNoYW5uZWxzCisgKgorICogUkVUVVJOUzoKKyAqICB2b2lkCisgKgorICovCit2b2lkIExWQ19NaXhJblNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBOckNoYW5uZWxzKQoreworICAgIGNoYXIgICAgICAgIEhhcmRNaXhpbmcgPSBUUlVFOworICAgIExWTV9GTE9BVCAgIFRhcmdldEdhaW47CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7CisKKyAgICBpZiAoTnJGcmFtZXMgPD0gMCkgICAgcmV0dXJuOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFNPRlQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAocEluc3RhbmNlLT5DdXJyZW50ICE9IHBJbnN0YW5jZS0+VGFyZ2V0KQorICAgIHsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+RGVsdGEgPT0gMS4wZikgeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgIH1lbHNlIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSkgeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KKyAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIExWQ19Db3JlX01peEluU29mdF9NY19EMTZDMzFfU0FUKCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgSEFSRCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKEhhcmRNaXhpbmcpIHsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ICE9IDApIHsgLyogTm90aGluZyB0byBkbyBpbiBjYXNlIFRhcmdldCA9IDAgKi8KKyAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5UYXJnZXQpID09IDEuMGYpIHsKKyAgICAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChzcmMsIGRzdCwgTnJGcmFtZXMqTnJDaGFubmVscyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPlRhcmdldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMgKiBOckNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICAvKiBJbiBjYXNlIHRoZSBMVkNvcmUgZnVuY3Rpb24gd291bGQgaGF2ZSBjaGFuZ2VkIHRoZSBDdXJyZW50IHZhbHVlICovCisgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBDQUxMIEJBQ0sKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCkgeworICAgICAgICBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW0sIFRhcmdldEdhaW4pOworICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAhPSAwKSB7CisgICAgICAgICAgICAgICAgKCpwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrKSAoXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30KKyNlbmRpZgorCisKICNlbHNlCiB2b2lkIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X3N0ICpwdHJJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqc3JjLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FULmMKaW5kZXggMTAxN2RlMy4uMDY3OGFlMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jCkBAIC0xMDMsNiArMTAzLDEwMSBAQAogICAgICAgICB9CiAgICAgfQogfQorI2lmZGVmIFNVUFBPUlRfTUMKKy8qCisgKiBGVU5DVElPTjogICAgICAgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVAorICoKKyAqIERFU0NSSVBUSU9OOgorICogIE1peGVyIGZ1bmN0aW9uIHdpdGggc3VwcG9ydCBmb3IgcHJvY2Vzc2luZyBtdWx0aWNoYW5uZWwgaW5wdXQKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHB0ckluc3RhbmNlICAgIEluc3RhbmNlIHBvaW50ZXIKKyAqICBzcmMgICAgICAgICAgICBTb3VyY2UKKyAqICBkc3QgICAgICAgICAgICBEZXN0aW5hdGlvbgorICogIE5yRnJhbWVzICAgICAgIE51bWJlciBvZiBGcmFtZXMKKyAqICBOckNoYW5uZWxzICAgICBOdW1iZXIgb2YgY2hhbm5lbHMKKyAqCisgKiBSRVRVUk5TOgorICogIHZvaWQKKyAqCisgKi8KK3ZvaWQgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICBOckNoYW5uZWxzKQoreworICAgIGNoYXIgICAgICAgIEhhcmRNaXhpbmcgPSBUUlVFOworICAgIExWTV9GTE9BVCAgIFRhcmdldEdhaW47CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7CisKKyAgICBpZiAoTnJGcmFtZXMgPD0gMCkgICAgcmV0dXJuOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFNPRlQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAocEluc3RhbmNlLT5DdXJyZW50ICE9IHBJbnN0YW5jZS0+VGFyZ2V0KQorICAgIHsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+RGVsdGEgPT0gMS4wZikgeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgIH1lbHNlIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSkgeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KKyAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIExWQ19Db3JlX01peFNvZnRfTWNfRDE2QzMxX1dSQSgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoSGFyZE1peGluZykgeworICAgICAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgPT0gMCkKKyAgICAgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLjAsIGRzdCwgTnJGcmFtZXMgKiBOckNoYW5uZWxzKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+VGFyZ2V0KSAhPSAxLjBmKQorICAgICAgICAgICAgICAgIE11bHQzc19GbG9hdChzcmMsIChwSW5zdGFuY2UtPlRhcmdldCksIGRzdCwgTnJGcmFtZXMgKiBOckNoYW5uZWxzKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHNyYyAhPSBkc3QpCisgICAgICAgICAgICAgICAgQ29weV9GbG9hdChzcmMsIGRzdCwgTnJGcmFtZXMgKiBOckNoYW5uZWxzKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENBTEwgQkFDSworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0KSB7CisgICAgICAgIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSkgeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbSwgVGFyZ2V0R2Fpbik7CisgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICE9IDApIHsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spIChcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworI2VuZGlmCisKICNlbHNlCiB2b2lkIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3Rfc3QgKnB0ckluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgICAqc3JjLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmMKaW5kZXggM2M5MDA3MS4uOGE4OWRlMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jCkBAIC0yNiwxMSArMjYsMTEgQEAKICAgIEZVTkNUSU9OIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fRkxPQVQgICAgICAgKnNyYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKnNyYzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBuKQordm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBuKQogewogICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMSA9IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKQEAgLTY3LDYgKzY3LDcwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIHNyYzIsIGRzdCwgbik7CiAgICAgfQogfQorCisjaWZkZWYgU1VQUE9SVF9NQworLyoKKyAqIEZVTkNUSU9OOiAgICAgICBMVkNfTWl4U29mdF8yTWNfRDE2QzMxX1NBVAorICoKKyAqIERFU0NSSVBUSU9OOgorICogIDIgc3RyZWFtIE1peGVyIGZ1bmN0aW9uIHdpdGggc3VwcG9ydCBmb3IgcHJvY2Vzc2luZyBtdWx0aWNoYW5uZWwgaW5wdXQKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHB0ckluc3RhbmNlICAgIEluc3RhbmNlIHBvaW50ZXIKKyAqICBzcmMxICAgICAgICAgICBGaXJzdCBtdWx0aWNoYW5uZWwgc291cmNlCisgKiAgc3JjMiAgICAgICAgICAgU2Vjb25kIG11bHRpY2hhbm5lbCBzb3VyY2UKKyAqICBkc3QgICAgICAgICAgICBEZXN0aW5hdGlvbgorICogIE5yRnJhbWVzICAgICAgIE51bWJlciBvZiBmcmFtZXMKKyAqICBOckNoYW5uZWxzICAgICBOdW1iZXIgb2YgY2hhbm5lbHMKKyAqCisgKiBSRVRVUk5TOgorICogIHZvaWQKKyAqCisgKi8KK3ZvaWQgTFZDX01peFNvZnRfMk1jX0QxNkMzMV9TQVQoTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBOckNoYW5uZWxzKQoreworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTIgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uUHJpdmF0ZVBhcmFtcyk7CisKKyAgICBpZiAoTnJGcmFtZXMgPD0gMCkgICAgcmV0dXJuOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFNPRlQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAoKHBJbnN0YW5jZTEtPkN1cnJlbnQgPT0gcEluc3RhbmNlMS0+VGFyZ2V0KSAmJiAocEluc3RhbmNlMS0+Q3VycmVudCA9PSAwKSkgeworICAgICAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMyLCBkc3QsIE5yRnJhbWVzLCBOckNoYW5uZWxzKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKHBJbnN0YW5jZTItPkN1cnJlbnQgPT0gcEluc3RhbmNlMi0+VGFyZ2V0KSAmJiAocEluc3RhbmNlMi0+Q3VycmVudCA9PSAwKSkgeworICAgICAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxLCBkc3QsIE5yRnJhbWVzLCBOckNoYW5uZWxzKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKHBJbnN0YW5jZTEtPkN1cnJlbnQgIT0gcEluc3RhbmNlMS0+VGFyZ2V0KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEluc3RhbmNlMi0+Q3VycmVudCAhPSBwSW5zdGFuY2UyLT5UYXJnZXQpKQorICAgIHsKKyAgICAgICAgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICopKCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxLCBkc3QsIE5yRnJhbWVzLCBOckNoYW5uZWxzKTsKKyAgICAgICAgTFZDX01peEluU29mdF9NY19EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzIsIGRzdCwgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOworICAgIH0KKyAgICBlbHNleworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgIEhBUkQgTUlYSU5HCisgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIHNyYzIsIGRzdCwgTnJGcmFtZXMgKiBOckNoYW5uZWxzKTsKKyAgICB9Cit9CisjZW5kaWYKKwogI2Vsc2UKIHZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9zdCAqcHRySW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9JTlQxNiAgICAgICAqc3JjMSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmgKaW5kZXggZjkwNDkxNS4uN2YxODc0NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmgKQEAgLTE1NywxMCArMTU3LDE4IEBACiAvKioqIDE2IGJpdCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgbik7Cit2b2lkIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBuKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBOckNoYW5uZWxzKTsKKyNlbmRpZgorCiAjZWxzZQogdm9pZCBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X3N0ICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAqc3JjLApAQCAtMTY5LDEwICsxNzcsMTggQEAKICNlbmRpZgogCiAjaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgbik7Cit2b2lkIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgbik7CisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBMVkNfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yQ2hhbm5lbHMpOworI2VuZGlmCisKICNlbHNlCiB2b2lkIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X3N0ICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAqc3JjLApAQCAtMTgxLDExICsxOTcsMTkgQEAKICNlbmRpZgogCiAjaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgICpzcmMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpzcmMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpkc3QsICAvKiBkc3QgY2Fubm90IGJlIGVxdWFsIHRvIHNyYzIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKTsKK3ZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwgIC8qIGRzdCBjYW5ub3QgYmUgZXF1YWwgdG8gc3JjMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgbik7CisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBMVkNfTWl4U29mdF8yTWNfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LCAgLyogZHN0IGNhbm5vdCBiZSBlcXVhbCB0byBzcmMyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOworI2VuZGlmCiAjZWxzZQogdm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X3N0ICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgICAqc3JjMSwKQEAgLTIwMCwxMCArMjI0LDEwIEBACiAvKiBHYWluIHZhbHVlcyBzaG91bGQgbm90IGJlIG1vcmUgdGhhdCAxLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIExWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3RfRkxPQVRfc3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fRkxPQVQgICAgICAgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpkc3QsICAgLyogZHN0IGNhbiBiZSBlcXVhbCB0byBzcmMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgbik7ICAgICAvKiBOdW1iZXIgb2Ygc3RlcmVvIHNhbXBsZXMgKi8KK3ZvaWQgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwgICAvKiBkc3QgY2FuIGJlIGVxdWFsIHRvIHNyYyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgbik7ICAgICAvKiBOdW1iZXIgb2Ygc3RlcmVvIHNhbXBsZXMgKi8KICNlbHNlCiB2b2lkIExWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3Rfc3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9JTlQxNiAgICAgICAgICAgKnNyYywKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRUYXJnZXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRUYXJnZXQuYwppbmRleCBjNjc0NTVhLi41MDdlZWZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0VGFyZ2V0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jCkBAIC0zNSw3ICszNSw3IEBACiB7CiAgICAgTFZNX0ZMT0FUICAgICAgIFRhcmdldEdhaW47CiAgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOwotICAgIAorCiAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAgLy8gVGFyZ2V0R2FpbgogICAgIHJldHVybiBUYXJnZXRHYWluOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Qcml2YXRlLmgKaW5kZXggZDBkMGUxZi4uZjEwMDk0YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfUHJpdmF0ZS5oCkBAIC02Miw2ICs2MiwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIExWQ19Db3JlX01peEluU29mdF9NY19EMTZDMzFfU0FUKExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIE5yQ2hhbm5lbHMpOworI2VuZGlmCiAjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfc3QgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYywKQEAgLTczLDYgKzgwLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgTFZDX0NvcmVfTWl4U29mdF9NY19EMTZDMzFfV1JBKExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIE5yQ2hhbm5lbHMpOworI2VuZGlmCiAjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKCBMVk1peGVyM19zdCAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmMKaW5kZXggOWMxN2EwNS4uNmM4YjJkYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMS5jCkBAIC0xMTksNiArMTE5LDgwIEBACiAgICAgICAgIH0KIAogICAgIH0KKworI2lmZGVmIFNVUFBPUlRfTUMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorREVMQVlTLQorcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIHRvCitwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAtIDFdIGlzIHgobi0xKSBmb3IgYWxsIE5yQ2hhbm5lbHMKKworcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHNdIHRvCitwQmlxdWFkU3RhdGUtPnBEZWxheXNbMipOckNoYW5uZWxzIC0gMV0gaXMgeChuLTIpIGZvciBhbGwgTnJDaGFubmVscworCitwQmlxdWFkU3RhdGUtPnBEZWxheXNbMipOckNoYW5uZWxzXSB0bworcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzMqTnJDaGFubmVscyAtIDFdIGlzIHkobi0xKSBmb3IgYWxsIE5yQ2hhbm5lbHMKKworcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzMqTnJDaGFubmVsc10gdG8KK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1s0Kk5yQ2hhbm5lbHMgLSAxXSBpcyB5KG4tMikgZm9yIGFsbCBOckNoYW5uZWxzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgUEtfTWNfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEgKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJDaGFubmVscykKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCB5biwgeW5PLCB0ZW1wOworICAgICAgICBMVk1fSU5UMTYgaWksIGpqOworICAgICAgICBQRmlsdGVyX1N0YXRlX0Zsb2F0IHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0Zsb2F0KSBwSW5zdGFuY2U7CisKKyAgICAgICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKworICAgICAgICAgICAgZm9yIChqaiA9IDA7IGpqIDwgTnJDaGFubmVsczsgamorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgamogQ0hBTk5FTAorICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICAvKiB5bj0gKEEwICAqICh4KG4pIC0geChuLTIpKSkqLworICAgICAgICAgICAgICAgIHRlbXAgPSAoKnBEYXRhSW4pIC0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKyBqal07CisgICAgICAgICAgICAgICAgeW4gPSB0ZW1wICogcEJpcXVhZFN0YXRlLT5jb2Vmc1swXTsKKworICAgICAgICAgICAgICAgIC8qIHluKz0gKCgtQjIgICogeShuLTIpKSkgKi8KKyAgICAgICAgICAgICAgICB0ZW1wID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMqMyArIGpqXSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV07CisgICAgICAgICAgICAgICAgeW4gKz0gdGVtcDsKKworICAgICAgICAgICAgICAgIC8qIHluKz0gKCgtQjEgKiB5KG4tMSkpKSAqLworICAgICAgICAgICAgICAgIHRlbXAgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyoyICsgampdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1syXTsKKyAgICAgICAgICAgICAgICB5biArPSB0ZW1wOworCisgICAgICAgICAgICAgICAgLyogeW5PPSAoKEdhaW4gKiB5bikpICovCisgICAgICAgICAgICAgICAgeW5PID0geW4gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOworCisgICAgICAgICAgICAgICAgLyogeW5PPSh5bk8gKyB4KG4pKSovCisgICAgICAgICAgICAgICAgeW5PICs9ICgqcERhdGFJbik7CisKKyAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDMgKyBqal0gPQorICAgICAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDIgKyBqal07IC8qIHkobi0yKT15KG4tMSkqLworICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICogMSArIGpqXSA9CisgICAgICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tqal07IC8qIHgobi0yKT14KG4tMSkqLworICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICogMiArIGpqXSA9IHluOyAvKiBVcGRhdGUgeShuLTEpICovCisgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW2pqXSA9ICgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSkqLworICAgICAgICAgICAgICAgIHBEYXRhSW4rKzsKKworICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgKnBEYXRhT3V0ID0geW5POyAvKiBXcml0ZSBvdXRwdXQqLworICAgICAgICAgICAgICAgIHBEYXRhT3V0Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKyNlbmRpZgogI2Vsc2UKIHZvaWQgUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEgKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YUluLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYi9MVkVRTkIuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9saWIvTFZFUU5CLmgKaW5kZXggOGUwYjczOC4uMzg1ZGJjZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYi9MVkVRTkIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvbGliL0xWRVFOQi5oCkBAIC0yMDEsOCArMjAxLDEwIEBACiAjZGVmaW5lIExWRVFOQl9DQVBfRlNfNDQxMDAgICAgICAgICAgICAgICAgMTI4CiAjZGVmaW5lIExWRVFOQl9DQVBfRlNfNDgwMDAgICAgICAgICAgICAgICAgMjU2CiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCi0jZGVmaW5lIExWRVFOQl9DQVBfRlNfOTYwMDAgICAgICAgICAgICAgICAgNTEyCi0jZGVmaW5lIExWRVFOQl9DQVBfRlNfMTkyMDAwICAgICAgICAgICAgICAgMTAyNAorI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzg4MjAwICAgICAgICAgICAgICAgIDUxMgorI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzk2MDAwICAgICAgICAgICAgICAgIDEwMjQKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU18xNzY0MDAgICAgICAgICAgICAgICAyMDQ4CisjZGVmaW5lIExWRVFOQl9DQVBfRlNfMTkyMDAwICAgICAgICAgICAgICAgNDA5NgogI2VuZGlmCiAKIHR5cGVkZWYgZW51bQpAQCAtMjE3LDggKzIxOSwxMCBAQAogICAgIExWRVFOQl9GU180NDEwMCA9IDcsCiAgICAgTFZFUU5CX0ZTXzQ4MDAwID0gOCwKICNpZmRlZiBISUdIRVJfRlMKLSAgICBMVkVRTkJfRlNfOTYwMDAgPSA5LAotICAgIExWRVFOQl9GU18xOTIwMDAgPSAxMCwKKyAgICBMVkVRTkJfRlNfODgyMDAgPSA5LAorICAgIExWRVFOQl9GU185NjAwMCA9IDEwLAorICAgIExWRVFOQl9GU18xNzY0MDAgPSAxMSwKKyAgICBMVkVRTkJfRlNfMTkyMDAwID0gMTIsCiAjZW5kaWYKICAgICBMVkVRTkJfRlNfTUFYICAgPSBMVk1fTUFYSU5UXzMyCiB9IExWRVFOQl9Gc19lbjsKQEAgLTI2Nyw3ICsyNzEsOSBAQAogICAgIC8qIEVxdWFsaXNlciBwYXJhbWV0ZXJzICovCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIE5CYW5kczsgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBiYW5kcyAqLwogICAgIExWRVFOQl9CYW5kRGVmX3QgICAgICAgICAgICAqcEJhbmREZWZpbml0aW9uOyAgICAgICAvKiBQb2ludGVyIHRvIGVxdWFsaXNlciBkZWZpbml0aW9ucyAqLwotCisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzOworI2VuZGlmCiB9IExWRVFOQl9QYXJhbXNfdDsKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvZWZmcy5oCmluZGV4IDQyZWE0NmYuLjc1NTE0MWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvZWZmcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvZWZmcy5oCkBAIC0xMDksNyArMTA5LDkgQEAKICNkZWZpbmUgTFZFUU5CXzJQaU9uXzQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMTMxZgogCiAjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIExWRVFOQl8yUGlPbl84ODIwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDA3MWYKICNkZWZpbmUgTFZFUU5CXzJQaU9uXzk2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDY1ZgorI2RlZmluZSBMVkVRTkJfMlBpT25fMTc2NDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMzZmCiAjZGVmaW5lIExWRVFOQl8yUGlPbl8xOTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAzM2YKICNlbmRpZgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcml2YXRlLmgKaW5kZXggNTZiMDJlMC4uYTljZDVmZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1ByaXZhdGUuaApAQCAtNDYsNyArNDYsMTIgQEAKICNkZWZpbmUgTFZFUU5CX0lOU1RBTkNFX0FMSUdOICAgICAgIDQgICAgICAgICAgICAgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgaW5zdGFuY2Ugc3RydWN0dXJlcyAqLwogI2RlZmluZSBMVkVRTkJfREFUQV9BTElHTiAgICAgICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBzdHJ1Y3R1cmVzICovCiAjZGVmaW5lIExWRVFOQl9DT0VGX0FMSUdOICAgICAgICAgICA0ICAgICAgICAgICAgICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGxvbmcgd29yZHMgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisvKiBOdW1iZXIgb2YgYnVmZmVycyByZXF1aXJlZCBmb3IgaW5wbGFjZSBwcm9jZXNzaW5nICovCisjZGVmaW5lIExWRVFOQl9TQ1JBVENIQlVGRkVSUyAgICAgICAoTFZNX01BWF9DSEFOTkVMUyAqIDIpCisjZWxzZQogI2RlZmluZSBMVkVRTkJfU0NSQVRDSEJVRkZFUlMgICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYnVmZmVycyByZXF1aXJlZCBmb3IgaW5wbGFjZSBwcm9jZXNzaW5nICovCisjZW5kaWYKICNkZWZpbmUgTFZFUU5CX1NDUkFUQ0hfQUxJR04gICAgICAgIDQgICAgICAgICAgICAgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgbG9uZyBkYXRhICovCiAKICNkZWZpbmUgTFZFUU5CX0JZUEFTU19NSVhFUl9UQyAgICAgIDEwMCAgICAgICAgICAgICAgICAgLyogQnlwYXNzIE1peGVyIFRDICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMKaW5kZXggNjMyODE4MS4uZDE4OGMwZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1Byb2Nlc3MuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKICNpbmNsdWRlICJCSVFVQUQuaCIKIAorI2luY2x1ZGUgPGxvZy9sb2cuaD4KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTYxLDE0ICs2MiwxOCBAQAogTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfUHJvY2VzcyhMVkVRTkJfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICBOdW1TYW1wbGVzKQotewotCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICBpOwotICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgKnBCaXF1YWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9VSU5UMTYgICAgICBOckZyYW1lcykKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlZCB0byB1c2Ugc2FtcGxlcyA9IGZyYW1lcyAqIGNoYW5uZWxzLgogICAgIExWRVFOQl9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSA9IChMVkVRTkJfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICAqcFNjcmF0Y2g7CiAKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgLy8gTW9ubyBwYXNzZWQgaW4gYXMgc3RlcmVvCisgICAgY29uc3QgTFZNX0lOVDMyIE5yQ2hhbm5lbHMgPSBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzID09IDEKKyAgICAgICAgPyAyIDogcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVsczsKKyNlbHNlCisgICAgY29uc3QgTFZNX0lOVDMyIE5yQ2hhbm5lbHMgPSAyOyAvLyBGQ0NfMgorI2VuZGlmCisgICAgY29uc3QgTFZNX0lOVDMyIE5yU2FtcGxlcyA9IE5yQ2hhbm5lbHMgKiBOckZyYW1lczsKIAogICAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVycyAqLwogICAgIGlmKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwSW5EYXRhID09IExWTV9OVUxMKSB8fCAocE91dERhdGEgPT0gTFZNX05VTEwpKQpAQCAtODIsMTQgKzg3LDE0IEBACiAgICAgICAgIHJldHVybiBMVkVRTkJfQUxJR05NRU5URVJST1I7CiAgICAgfQogCi0gICAgcFNjcmF0Y2ggID0gKExWTV9GTE9BVCAqKXBJbnN0YW5jZS0+cEZhc3RUZW1wb3Jhcnk7CisgICAgTFZNX0ZMT0FUICogY29uc3QgcFNjcmF0Y2ggPSAoTFZNX0ZMT0FUICopcEluc3RhbmNlLT5wRmFzdFRlbXBvcmFyeTsKIAogICAgIC8qCi0gICAgKiBDaGVjayB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgbm90IHRvbyBsYXJnZQorICAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBmcmFtZXMgaXMgbm90IHRvbyBsYXJnZQogICAgICovCi0gICAgaWYgKE51bVNhbXBsZXMgPiBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUpCisgICAgaWYgKE5yRnJhbWVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKQogICAgIHsKLSAgICAgICAgcmV0dXJuKExWRVFOQl9UT09NQU5ZU0FNUExFUyk7CisgICAgICAgIHJldHVybiBMVkVRTkJfVE9PTUFOWVNBTVBMRVM7CiAgICAgfQogCiAgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZFUU5CX09OKQpAQCAtOTcsMTYgKzEwMiwxNiBAQAogICAgICAgICAvKgogICAgICAgICAgKiBDb3B5IGlucHV0IGRhdGEgaW4gdG8gc2NyYXRjaCBidWZmZXIKICAgICAgICAgICovCisgICAgICAgIENvcHlfRmxvYXQocEluRGF0YSwgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLCAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJTYW1wbGVzKTsKIAotICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQgKilwSW5EYXRhLCAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLCAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgLyogTGVmdCBhbmQgUmlnaHQgKi8KICAgICAgICAgLyoKICAgICAgICAgICogRm9yIGVhY2ggc2VjdGlvbiBleGVjdGUgdGhlIGZpbHRlciB1bmxlc3MgdGhlIGdhaW4gaXMgMGRCCiAgICAgICAgICAqLwogICAgICAgICBpZiAocEluc3RhbmNlLT5OQmFuZHMgIT0gMCkKICAgICAgICAgewotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBJbnN0YW5jZS0+TkJhbmRzOyBpKyspCisgICAgICAgICAgICBmb3IgKExWTV9VSU5UMTYgaSA9IDA7IGkgPCBwSW5zdGFuY2UtPk5CYW5kczsgaSsrKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgYmFuZCBpcyBub24temVybyBkQiBnYWluCkBAIC0xMTYsNyArMTIxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBiaXF1YWQgaW5zdGFuY2UKICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHBCaXF1YWQgPSAmcEluc3RhbmNlLT5wRVFOQl9GaWx0ZXJTdGF0ZV9GbG9hdFtpXTsKKyAgICAgICAgICAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgKnBCaXF1YWQgPSAmcEluc3RhbmNlLT5wRVFOQl9GaWx0ZXJTdGF0ZV9GbG9hdFtpXTsKIAogCiAgICAgICAgICAgICAgICAgICAgIC8qCkBAIC0xMjYsMTAgKzEzMSwxOCBAQAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIExWRVFOQl9TaW5nbGVQcmVjaXNpb25fRmxvYXQ6CiAgICAgICAgICAgICAgICAgICAgICAgICB7CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX01jX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxKHBCaXF1YWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yQ2hhbm5lbHMpOworI2Vsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMShwQmlxdWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzKTsKKyNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKQEAgLTE0MSwxOSArMTU0LDI5IEBACiAKIAogICAgICAgICBpZihwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uID09IExWTV9UUlVFKXsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICBMVkNfTWl4U29mdF8yTWNfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJDaGFubmVscyk7CisjZWxzZQogICAgICAgICAgICAgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7Ci0gICAgICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQqKXBTY3JhdGNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAgICAgICAgICAgICAgIC8qIExlZnQgYW5kIFJpZ2h0IHNhbXBsZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOworI2VuZGlmCisgICAgICAgICAgICAvLyBkdXBsaWNhdGUgd2l0aCBlbHNlIGNsYXVzZShzKQorICAgICAgICAgICAgQ29weV9GbG9hdChwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7ICAgICAgICAgICAgLyogQWxsIGNoYW5uZWwgc2FtcGxlcyAqLwogICAgICAgICB9CiAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICBDb3B5X0Zsb2F0KHBTY3JhdGNoLCAgICAgICAgICAgICAgLyogU291cmNlICovCiAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiApKDIgKiBOdW1TYW1wbGVzKSk7IC8qIExlZnQgYW5kIFJpZ2h0ICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJTYW1wbGVzKTsgLyogQWxsIGNoYW5uZWwgc2FtcGxlcyAqLwogICAgICAgICB9CiAgICAgfQogICAgIGVsc2UKQEAgLTE2MywxMiArMTg2LDEyIEBACiAgICAgICAgICAqLwogICAgICAgICBpZiAocEluRGF0YSAhPSBwT3V0RGF0YSkKICAgICAgICAgewotICAgICAgICAgICAgQ29weV9GbG9hdChwSW5EYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAvKiBMZWZ0IGFuZCBSaWdodCBzYW1wbGVzICovCisgICAgICAgICAgICBDb3B5X0Zsb2F0KHBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJTYW1wbGVzKTsgICAgICAgICAgICAvKiBBbGwgY2hhbm5lbCBzYW1wbGVzICovCiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKKyAgICByZXR1cm4gTFZFUU5CX1NVQ0NFU1M7CiAKIH0KICNlbHNlCkBAIC0zMTIsNCArMzM1LDQgQEAKICAgICByZXR1cm4oTFZFUU5CX1NVQ0NFU1MpOwogCiB9Ci0jZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1RhYmxlcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmMKaW5kZXggNTYzMTgxYy4uNDUzYzQyZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmMKQEAgLTQ2LDcgKzQ2LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ODIwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzY0MDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkyMDAwCiB9OwogI2Vsc2UKQEAgLTgyLDcgKzg0LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzQ0MTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fNDgwMDAKICNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsTFZFUU5CXzJQaU9uXzg4MjAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWRVFOQl8yUGlPbl85NjAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVkVRTkJfMlBpT25fMTc2NDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWRVFOQl8yUGlPbl8xOTIwMDAKICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwpAQCAtMjQ5LDMwICsyNTMsNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTY1ODYsICAgICAgICAgICAgICAgICAgICAgICAvKiBhMiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTQ0fTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMyAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBCeXBhc3MgbWl4ZXIgdGltZSBjb25zdGFudHMgKDEwMG1zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzODAwMCAgICAzMjU4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk0MjYyNjk1ICovCi0jZGVmaW5lIExWRVFOQl9NSVhfVENfRnMxMTAyNSAgIDMyNjMyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTU4NDk2MDkgKi8KLSNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczEyMDAwICAgMzI2NDMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NjE4NTMwMyAqLwotI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzMTYwMDAgICAzMjY3NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk3MTMxMzQ4ICovCi0jZGVmaW5lIExWRVFOQl9NSVhfVENfRnMyMjA1MCAgIDMyNzAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTc5MjQ4MDUgKi8KLSNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczI0MDAwICAgMzI3MDUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODA3NzM5MyAqLwotI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzMzIwMDAgICAzMjcyMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4NTY1Njc0ICovCi0jZGVmaW5lIExWRVFOQl9NSVhfVENfRnM0NDEwMCAgIDMyNzM0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg5NjI0MDIgKi8KLSNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczQ4MDAwICAgMzI3MzcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5OTA1Mzk1NSAqLwotCi0KLWNvbnN0IExWTV9JTlQxNiBMVkVRTkJfTWl4ZXJUQ1RhYmxlW10gPSB7Ci0gICAgTFZFUU5CX01JWF9UQ19GczgwMDAsCi0gICAgTFZFUU5CX01JWF9UQ19GczExMDI1LAotICAgIExWRVFOQl9NSVhfVENfRnMxMjAwMCwKLSAgICBMVkVRTkJfTUlYX1RDX0ZzMTYwMDAsCi0gICAgTFZFUU5CX01JWF9UQ19GczIyMDUwLAotICAgIExWRVFOQl9NSVhfVENfRnMyNDAwMCwKLSAgICBMVkVRTkJfTUlYX1RDX0ZzMzIwMDAsCi0gICAgTFZFUU5CX01JWF9UQ19GczQ0MTAwLAotICAgIExWRVFOQl9NSVhfVENfRnM0ODAwMH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcml2YXRlLmgKaW5kZXggZmY3NDc1ZS4uYzkxNWFjMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1ByaXZhdGUuaApAQCAtMTIzLDcgKzEyMyw3IEBACiAjaWZuZGVmIEhJR0hFUl9GUwogI2RlZmluZSBMVlJFVl9OVU1fRlMgICAgICAgICAgICAgICAgICAgICAgICA5ICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc3VwcG9ydGVkIHNhbXBsZSByYXRlcyAqLwogI2Vsc2UKLSNkZWZpbmUgTFZSRVZfTlVNX0ZTICAgICAgICAgICAgICAgICAgICAgICAxMSAgICAgICAgICAgLyogTnVtYmVyIG9mIHN1cHBvcnRlZCBzYW1wbGUgcmF0ZXMgKi8KKyNkZWZpbmUgTFZSRVZfTlVNX0ZTICAgICAgICAgICAgICAgICAgICAgICAxMyAgICAgICAgICAgLyogTnVtYmVyIG9mIHN1cHBvcnRlZCBzYW1wbGUgcmF0ZXMgKi8KICNlbmRpZgogCiAjZGVmaW5lIExWUkVWX01BWEJMS1NJWkVfTElNSVQgICAgICAgICAgICAgNjQgICAgICAgICAgIC8qIE1heGltdW0gYmxvY2sgc2l6ZSBsb3cgbGltaXQgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1Byb2Nlc3MuYwppbmRleCA1NjZkODRmLi4xZDEyODNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJvY2Vzcy5jCkBAIC01NzksNyArNTc5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotICAgIAorCiAgICAgLyoKICAgICAgKiAgUHJvY2VzcyBhbGwgZGVsYXkgbGluZXMKICAgICAgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jCmluZGV4IGE3MTkwNTMuLmRmZWQyOGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMuYwpAQCAtNjQsMTIgKzY0LDIyIEBACiAgICAgICAgICgKICAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzgwMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMTAyNSkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzEyMDAwKSAgICAgICAmJgogICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTYwMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yMjA1MCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzI0MDAwKSAgICAgICAmJgotICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMzIwMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180NDEwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ4MDAwKSAgICAgIAorICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMzIwMDApICYmCisgICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180NDEwMCkgJiYKKyAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ4MDAwKQogI2lmZGVmIEhJR0hFUl9GUwotICAgICAgICAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfOTYwMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xOTIwMDApCisgICAgICAgICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU184ODIwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzk2MDAwKQorICAgICAgICAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTc2NDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTkyMDAwKQogI2VuZGlmCiAgICAgICAgICkKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgIHx8ICgocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9TVEVSRU8pICAgICAgICYmCisgICAgICAgICAgICAocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PSU5TVEVSRU8pICYmCisgICAgICAgICAgICAocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PKSAgICAgICAgICYmCisgICAgICAgICAgICAocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NVUxUSUNIQU5ORUwpKSkKKyNlbHNlCiAgICAgICAgIHx8ICgocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9TVEVSRU8pICYmIChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk9JTlNURVJFTykgJiYgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OTykpICkKKyNlbmRpZgogICAgIHsKICAgICAgICAgcmV0dXJuIChMVlJFVl9PVVRPRlJBTkdFKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5jCmluZGV4IGIzZWRjNjAuLjEwNTg3NDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5jCkBAIC01Miw3ICs1Miw5IEBACiAgICAgMzIwMDAsCiAgICAgNDQxMDAsCiAgICAgNDgwMDAsCisgICAgODgyMDAsCiAgICAgOTYwMDAsCisgICAgMTc2NDAwLAogICAgIDE5MjAwMAogfTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcml2YXRlLmgKaW5kZXggYTc1MGJiMC4uZWUwN2UyZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJpdmF0ZS5oCkBAIC00Niw3ICs0Niw3IEBACiAjaWZuZGVmIEhJR0hFUl9GUwogI2RlZmluZSBMVlBTQV9OUl9TVVBQT1JURURfUkFURSAgICAgICAgICA5ICAgICAgLyogRnJvbSA4MDAwSHogdG8gNDgwMDBIeiovCiAjZWxzZQotI2RlZmluZSBMVlBTQV9OUl9TVVBQT1JURURfUkFURSAgICAgICAgICAxMSAgICAgIC8qIEZyb20gODAwMEh6IHRvIDE5MjAwMEh6Ki8KKyNkZWZpbmUgTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUgICAgICAgICAgMTMgICAgICAvKiBGcm9tIDgwMDBIeiB0byAxOTIwMDBIeiovCiAjZW5kaWYKICNkZWZpbmUgTFZQU0FfTlJfU1VQUE9SVEVEX1NQRUVEICAgICAgICAgMyAgICAgIC8qIExPVywgTUVESVVNLCBISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5jCmluZGV4IDEyODc1MDMuLmY4YWY0OTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfVGFibGVzLmMKQEAgLTU0LDcgKzU0LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg4MjAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3NjQwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkyMDAwfTsgICAgICAgICAgICAgICAgICAvKiAxOTJrUy9zICovCiAjZW5kaWYKIApAQCAtNzgsNyArODAsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4Njk2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0NzM5CiAjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDI0MzQ4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDIyMzY5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDEyMTc0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDExMTg1ICAgICAgICAgICAgICAgICAgLyogMTkya1MvcyAqLwogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CkBAIC0xMDUsNyArMTA5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODgyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NjAKICNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDE3NjQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDE5MjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDM1MjgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDM4NDAgICAgICAgICAgICAgICAgICAvKiAxOTJrUy9zICovCiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwpAQCAtMTI4LDcgKzEzNCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLCAgICAgICAgICAgICAgICAgICAvKiA0NDEwMCBTL3MgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyICAgICAgICAgICAgICAgICAgICAvKiA0ODAwMCBTL3MgICovCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDYwICAgICAgICAgICAgICAgICAgIC8qIDg4MjAwIFMvcyAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsNjQgICAgICAgICAgICAgICAgICAgLyogOTYwMDAgUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxMjAgICAgICAgICAgICAgICAgICAvKiAxNzY0MDAgUy9zICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxMjggICAgICAgICAgICAgICAgICAvKjE5MjAwMCBTL3MgICovCiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKQEAgLTE1Myw3ICsxNjEsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ3ODEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDM5MgogI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDIzOTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwyMTk2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTE5NQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDEwOTggICAgLyogMTkya1MvcyAqLwogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwpAQCAtMTY5LDcgKzE3OSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE0NTkwODlmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMzQwMzcyZgogI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMC4wNzI5NDc2ZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMC4wNjcwMTg2ZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMC4wMzY0NzM4ZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMC4wMzM1MDkzZiAgICAvKiAxOTJrUy9zICovCiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CkBAIC0zNTIsNyArMzY0LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMjYzODQ1Nzk3NjI4MmYsMC4wMDY2MjQ5OTM0MDI1MTA5Zn0sCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMxMjY5NjE4NjgyNTYzZiwwLjAwNjc1OTI2NDk3MjA2MDlmfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzI2Mzg0NTc5NzYyODJmLDAuMDA2NjI0OTkzNDAyNTEwOWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMTI2OTYxODY4MjU2M2YsMC4wMDY3NTkyNjQ5NzIwNjA5Zn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwwLjAwNjYyNDk5MzQwMjUxMDlmfSwKICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8gICAgLyogTFZQU0FfU1BFRURfTUVESVVNICAgICAgKi8KQEAgLTM2OCw3ICszODIsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDhrUy9zICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTQwMTE5NTYyMjk4MDU5ZiwwLjA0NDUzNDM4MTk0NDY4NjJmfSwKICNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1MzEwMTE5MTIwNDA0MTJmLDAuMDQ1Mzk5NTIzODA1ODI2OWZ9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU0MDExOTU2MjI5ODA1OWYsMC4wNDQ1MzQzODE5NDQ2ODYyZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTMxMDExOTEyMDQwNDEyZiwwLjA0NTM5OTUyMzgwNTgyNjlmfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8gICAvKiBMVlBTQV9TUEVFRF9ISUdIICAgICAgKi8KQEAgLTM4Myw3ICszOTksOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzI3NDgwNzMxOTA0NTA2N2YsMC4yMzU2NjY2NTQwNzI3MDE5Zn0KICNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsey0wLjcyMjk3MDYzMTkwNDkwMDFmLDAuMjM4ODk4NzIyNDU0OTA1NWZ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHstMC43Mjc0ODA3MzE5MDQ1MDY3ZiwwLjIzNTY2NjY1NDA3MjcwMTlmfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICx7LTAuNzIyOTcwNjMxOTA0OTAwMWYsMC4yMzg4OTg3MjI0NTQ5MDU1Zn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsey0wLjcyNzQ4MDczMTkwNDUwNjdmLDAuMjM1NjY2NjU0MDcyNzAxOWZ9CiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL2xpYi9MVkNTLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliL0xWQ1MuaAppbmRleCBlNzU2OTVlLi5lNTA3YTdjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliL0xWQ1MuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliL0xWQ1MuaApAQCAtMjA1LDYgKzIwNSw5IEBACiAgICAgTFZNX0ZzX2VuICAgICAgICAgICAgICAgU2FtcGxlUmF0ZTsgICAgICAgICAgICAgLyogU2FtcGxpbmcgcmF0ZSAqLwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEVmZmVjdExldmVsOyAgICAgICAgICAgIC8qIEVmZmVjdCBsZXZlbCAqLwogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIFJldmVyYkxldmVsOyAgICAgICAgICAgIC8qIFJldmVyYiBsZXZlbCBpbiAlICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIE5yQ2hhbm5lbHM7CisjZW5kaWYKIH0gTFZDU19QYXJhbXNfdDsKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSGVhZHBob25lX0NvZWZmcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaAppbmRleCAwYzJmZTUzLi5lNDVkODFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSGVhZHBob25lX0NvZWZmcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19IZWFkcGhvbmVfQ29lZmZzLmgKQEAgLTE1Miw2ICsxNTIsMjQgQEAKICNkZWZpbmUgQ1NfU0lERV80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKIAogI2lmZGVmIEhJR0hFUl9GUworLyogQ29lZmZpY2llbnRzIGZvciA4ODIwMEh6IHNhbXBsZSByYXRlLgorICogVGhlIGZpbHRlciBjb2VmZmljaWVudHMgYXJlIG9idGFpbmVkIGJ5IGNhcnJ5aW5nIG91dAorICogc3RhdGUtc3BhY2UgYW5hbHlzaXMgdXNpbmcgdGhlIGNvZWZmaWNpZW50cyBhdmFpbGFibGUKKyAqIGZvciA0NDEwMEh6LgorICovCisjZGVmaW5lIENTX01JRERMRV84ODIwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjMzODQ2ZgorI2RlZmluZSBDU19NSURETEVfODgyMDBfQTEgICAgICAgICAgICAgICAgICAgICAoLTAuMjMyNjU3ZikKKyNkZWZpbmUgQ1NfTUlERExFXzg4MjAwX0EyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIENTX01JRERMRV84ODIwMF9CMSAgICAgICAgICAgICAgICAgICAgICgtMC45OTI3NDdmKQorI2RlZmluZSBDU19NSURETEVfODgyMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQ1NfTUlERExFXzg4MjAwX1NDQUxFICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfU0lERV84ODIwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4yMzE1NDFmCisjZGVmaW5lIENTX1NJREVfODgyMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMC4yODk1ODZmKQorI2RlZmluZSBDU19TSURFXzg4MjAwX0EyICAgICAgICAgICAgICAgICAgICAgICAwLjA1ODA0NWYKKyNkZWZpbmUgQ1NfU0lERV84ODIwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjc2NTMwMGYpCisjZGVmaW5lIENTX1NJREVfODgyMDBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuNzY5ODE2ZgorI2RlZmluZSBDU19TSURFXzg4MjAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAxNAorCiAvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciA5NjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAgMC4xNjUqLwogLyogaGlnaCBwYXNzIGZpbHRlciB3aXRoIGN1dG9mZiBmcmVxdWVuY3kgMTAyLjE4IEh6Ki8KICNkZWZpbmUgQ1NfTUlERExFXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yMzU1MzIKQEAgLTE2MCwxMyArMTc4LDMzIEBACiAjZGVmaW5lIENTX01JRERMRV85NjAwMF9CMSAgICAgICAgICAgICAgICAgICAgKC0wLjk5MzMzNCkKICNkZWZpbmUgQ1NfTUlERExFXzk2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICNkZWZpbmUgQ1NfTUlERExFXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKLS8qIGJhbmRwYXNzIGZpbHRlciB3aXRoIGZjMSAyNzAgYW5kIGZjMiAzNzAzLCBkZXNpZ25lZCB1c2luZyAybmQgb3JkZXIgYnV0dGVyd29ydGggKi8KLSNkZWZpbmUgQ1NfU0lERV85NjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDE2NzI3Ci0jZGVmaW5lIENTX1NJREVfOTYwMDBfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19TSURFXzk2MDAwX0EyICAgICAgICAgICAgICAgICAgICAoLTAuMDE2NzI3KQotI2RlZmluZSBDU19TSURFXzk2MDAwX0IxICAgICAgICAgICAgICAgICAgICAoLTEuNzkzMzcyKQotI2RlZmluZSBDU19TSURFXzk2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC43OTcyMzYKLSNkZWZpbmUgQ1NfU0lERV85NjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE0CisvKiBDb2VmZmljaWVudHMgY2FsY3VsYXRlZCB1c2luZyB0ZjJzcyBhbmQgc3MydGYgZnVuY3Rpb25zIGJhc2VkIG9uCisgKiBjb2VmZmljaWVudHMgYXZhaWxhYmxlIGZvciA0ODAwMEh6IHNhbXBsaW5nIGZyZXF1ZW5jeQorICovCisjZGVmaW5lIENTX1NJREVfOTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjIyNDMyNmYKKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICgtMC4yOTQ5MzdmKQorI2RlZmluZSBDU19TSURFXzk2MDAwX0EyICAgICAgICAgICAgICAgICAgICAgMC4wNzA2MTFmCisjZGVmaW5lIENTX1NJREVfOTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuNzkyMTY2ZikKKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuNzk1ODMwZgorI2RlZmluZSBDU19TSURFXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgMTQKKworLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMTc2NDAwSHogc2FtcGxlIHJhdGUuCisgKiBUaGUgZmlsdGVyIGNvZWZmaWNpZW50cyBhcmUgb2J0YWluZWQgYnkgY2Fycnlpbmcgb3V0CisgKiBzdGF0ZS1zcGFjZSBhbmFseXNpcyB1c2luZyB0aGUgY29lZmZpY2llbnRzIGF2YWlsYWJsZQorICogZm9yIDQ0MTAwSHouCisgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzE3NjQwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjMzOTczZgorI2RlZmluZSBDU19NSURETEVfMTc2NDAwX0ExICAgICAgICAgICAgICAgICAgICAgKC0wLjIzMzM3OGYpCisjZGVmaW5lIENTX01JRERMRV8xNzY0MDBfQTIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQ1NfTUlERExFXzE3NjQwMF9CMSAgICAgICAgICAgICAgICAgICAgICgtMC45OTYzNjdmKQorI2RlZmluZSBDU19NSURETEVfMTc2NDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIENTX01JRERMRV8xNzY0MDBfU0NBTEUgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19TSURFXzE3NjQwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4xOTk4MzZmCisjZGVmaW5lIENTX1NJREVfMTc2NDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAoLTAuMzA3NTQ0ZikKKyNkZWZpbmUgQ1NfU0lERV8xNzY0MDBfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuMTA3NzA4ZgorI2RlZmluZSBDU19TSURFXzE3NjQwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjg3NjU3MmYpCisjZGVmaW5lIENTX1NJREVfMTc2NDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjg3Nzc3MWYKKyNkZWZpbmUgQ1NfU0lERV8xNzY0MDBfU0NBTEUgICAgICAgICAgICAgICAgICAgIDE0CiAKIC8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDE5MjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAgMC4xNjg5Ki8KICNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjQxMjE5CkBAIC0xNzUsMTMgKzIxMywxNSBAQAogI2RlZmluZSBDU19NSURETEVfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAgICAoLTAuOTk2NjYxKQogI2RlZmluZSBDU19NSURETEVfMTkyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1Ci0vKiBiYW5kcGFzcyBmaWx0ZXIgd2l0aCBmYzEgMjcwIGFuZCBmYzIgMzcwMywgZGVzaWduZWQgdXNpbmcgMm5kIG9yZGVyIGJ1dHRlcndvcnRoICovCi0jZGVmaW5lIENTX1NJREVfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDg5OTEKLSNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQTEgICAgICAgICAgICAgICAgICAgICgtMC4wMDAwMDApCi0jZGVmaW5lIENTX1NJREVfMTkyMDAwX0EyICAgICAgICAgICAgICAgICAgICAoLTAuMDA4OTkxKQotI2RlZmluZSBDU19TSURFXzE5MjAwMF9CMSAgICAgICAgICAgICAgICAgICAgKC0xLjg5MjUwOSkKLSNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjg5MzUyNAotI2RlZmluZSBDU19TSURFXzE5MjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgMTQKKy8qIENvZWZmaWNpZW50cyBjYWxjdWxhdGVkIHVzaW5nIHRmMnNzIGFuZCBzczJ0ZiBmdW5jdGlvbnMgYmFzZWQgb24KKyAqIGNvZWZmaWNpZW50cyBhdmFpbGFibGUgZm9yIDQ4MDAwSHogc2FtcGxpbmcgZnJlcXVlbmN5CisgKi8KKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQTAgICAgICAgICAgICAgICAgICAgIDAuMTk2MDM5ZgorI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMSAgICAgICAgICAgICAgICAgICAgKC0wLjMxMTAyN2YpCisjZGVmaW5lIENTX1NJREVfMTkyMDAwX0EyICAgICAgICAgICAgICAgICAgICAwLjExNDk4OGYKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICgtMS44OTEzODBmKQorI2RlZmluZSBDU19TSURFXzE5MjAwMF9CMiAgICAgICAgICAgICAgICAgICAgMC44OTIzNDYwZgorI2RlZmluZSBDU19TSURFXzE5MjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgMTQKICNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTk5LDcgKzIzOSwxMyBAQAogI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzI0S0haICAgICAgICAgICAgICAgICAgIDI3OSAgICAgICAgIC8qIFNhbXBsZSByYXRlIDI0a1MvcyAqLwogI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzMyS0haICAgICAgICAgICAgICAgICAgIDM3MiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDMya1MvcyAqLwogI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzQ0S0haICAgICAgICAgICAgICAgICAgIDUxMiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDQ0a1MvcyAqLworLy8gVE9ETzogdGhpcyBzaG91bGQgbGluZWFybHkgc2NhbGUgYnkgZnJlcXVlbmN5IGJ1dCBpcyBsaW1pdGVkIHRvIDUxMiBmcmFtZXMgdW50aWwKKy8vIHdlIGVuc3VyZSBlbm91Z2ggYnVmZmVyIHNpemUgaGFzIGJlZW4gYWxsb2NhdGVkLgogI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzQ4S0haICAgICAgICAgICAgICAgICAgIDUxMiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDQ4a1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzg4S0haICAgICAgICAgICAgICAgICAgIDUxMiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDg4LjJrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfOTZLSFogICAgICAgICAgICAgICAgICAgNTEyICAgICAgICAgLyogU2FtcGxlIHJhdGUgOTZrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTc2S0haICAgICAgICAgICAgICAgICAgNTEyICAgICAgICAgLyogU2FtcGxlIHJhdGUgMTc2LjRrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTkyS0haICAgICAgICAgICAgICAgICAgNTEyICAgICAgICAgLyogU2FtcGxlIHJhdGUgMTk2a1MvcyAqLwogCiAvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciA4MDAwIEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLwogI2RlZmluZSBDU19SRVZFUkJfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMC42NjcyNzEKQEAgLTI3NSw2ICszMjEsMTQgQEAKICNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTQKIAogI2lmZGVmIEhJR0hFUl9GUworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgODgyMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC44ICovCisvKiBCYW5kIHBhc3MgZmlsdGVyIHdpdGggZmMxPTUwMCBhbmQgZmMyPTgwMDAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjE3MTkwMWYKKyNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4xNzE5MDFmKQorI2RlZmluZSBDU19SRVZFUkJfODgyMDBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjU1Mzk0OGYpCisjZGVmaW5lIENTX1JFVkVSQl84ODIwMF9CMiAgICAgICAgICAgICAgICAgICAgICAoMC41NzAyNDhmKQorI2RlZmluZSBDU19SRVZFUkJfODgyMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgMTQKIC8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDk2MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuOCAqLwogLyogQmFuZCBwYXNzIGZpbHRlciB3aXRoIGZjMT01MDAgYW5kIGZjMj04MDAwKi8KICNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjE2MDI0ODgKQEAgLTI4NCw2ICszMzgsMTQgQEAKICNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjU5OTM3NwogI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNAogCisvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAxNzY0MDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC44ICovCisvKiBCYW5kIHBhc3MgZmlsdGVyIHdpdGggZmMxPTUwMCBhbmQgZmMyPTgwMDAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzE3NjQwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4wOTQ3NjNmCisjZGVmaW5lIENTX1JFVkVSQl8xNzY0MDBfQTEgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wOTQ3NjNmKQorI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS43NTg1OTNmKQorI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX0IyICAgICAgICAgICAgICAgICAgICAgICgwLjc2MzA5MWYpCisjZGVmaW5lIENTX1JFVkVSQl8xNzY0MDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgMTQKIC8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDE5MjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjggKi8KIC8qIEJhbmQgcGFzcyBmaWx0ZXIgd2l0aCBmYzE9NTAwIGFuZCBmYzI9ODAwMCovCiAjZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMDg3ODM2OQpAQCAtNDQ2LDYgKzUwOCwyNCBAQAogCiAKICNpZmRlZiBISUdIRVJfRlMKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDg4MjAwSHogc2FtcGxlIHJhdGUuCisgKiBUaGUgZmlsdGVyIGNvZWZmaWNpZW50cyBhcmUgb2J0YWluZWQgYnkgY2Fycnlpbmcgb3V0CisgKiBzdGF0ZS1zcGFjZSBhbmFseXNpcyB1c2luZyB0aGUgY29lZmZpY2llbnRzIGF2YWlsYWJsZQorICogZm9yIDQ0MTAwSHouCisgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzg4MjAwX0EwICAgICAgICAgICAgICAgICAgIDEuNzcxODk5ZgorI2RlZmluZSBDU19FUVVBTElTRVJfODgyMDBfQTEgICAgICAgICAgICAgICAgICAgKC0yLjkzMDc2MmYpCisjZGVmaW5lIENTX0VRVUFMSVNFUl84ODIwMF9BMiAgICAgICAgICAgICAgICAgICAxLjE3MjE3NWYKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzg4MjAwX0IxICAgICAgICAgICAgICAgICAgICgtMS40MzgzNDlmKQorI2RlZmluZSBDU19FUVVBTElTRVJfODgyMDBfQjIgICAgICAgICAgICAgICAgICAgMC40NDI1MjBmCisjZGVmaW5lIENTX0VRVUFMSVNFUl84ODIwMF9TQ0FMRSAgICAgICAgICAgICAgICAxMworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84ODIwMF9BMCAgICAgICAgICAgICAgICAgMi42NzUyNDFmCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzg4MjAwX0ExICAgICAgICAgICAgICAgICAoLTQuNDY2MTU0ZikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODgyMDBfQTIgICAgICAgICAgICAgICAgIDEuODEwMzA1ZgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84ODIwMF9CMSAgICAgICAgICAgICAgICAgKC0wLjkyNTM1MGYpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzg4MjAwX0IyICAgICAgICAgICAgICAgICAoLTAuMDY2NjE2ZikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODgyMDBfU0NBTEUgICAgICAgICAgICAgIDEzCisKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAxLjc4NDQ5NwogI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfQTEgICAgICAgICAgICAgICAgICAgKC0zLjAwMTQzNSkKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0EyICAgICAgICAgICAgICAgICAgICAxLjIyODQyMgpAQCAtNDU4LDYgKzUzOCwyMyBAQAogI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9CMSAgICAgICAgICAgICAgICAgKC0wLjk3MTcxOCkKICNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQjIgICAgICAgICAgICAgICAgICgtMC4wMjEyMTYpCiAjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAxNzY0MDBIeiBzYW1wbGUgcmF0ZS4KKyAqIFRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGFyZSBvYnRhaW5lZCBieSBjYXJyeWluZyBvdXQKKyAqIHN0YXRlLXNwYWNlIGFuYWx5c2lzIHVzaW5nIHRoZSBjb2VmZmljaWVudHMgYXZhaWxhYmxlCisgKiBmb3IgNDQxMDBIei4KKyAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMTc2NDAwX0EwICAgICAgICAgICAgICAgICAgMS44ODM0NDBmCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNzY0MDBfQTEgICAgICAgICAgICAgICAgICAoLTMuNDE0MjcyZikKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE3NjQwMF9BMiAgICAgICAgICAgICAgICAgIDEuNTM0NzAyZgorI2RlZmluZSBDU19FUVVBTElTRVJfMTc2NDAwX0IxICAgICAgICAgICAgICAgICAgKC0xLjY3NDYxNGYpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNzY0MDBfQjIgICAgICAgICAgICAgICAgICAwLjY3NTgyN2YKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE3NjQwMF9TQ0FMRSAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9BMCAgICAgICAgICAgICAgICAzLjM1NTA2OGYKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0ExICAgICAgICAgICAgICAgICgtNi4xMTI1NzhmKQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQTIgICAgICAgICAgICAgICAgMi43NjQxMzVmCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9CMSAgICAgICAgICAgICAgICAoLTEuMjY4NTMzZikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0IyICAgICAgICAgICAgICAgIDAuMjcxMjc3ZgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfU0NBTEUgICAgICAgICAgICAgMTMKIAogI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgICAxLjg4OTU4MgogI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0ExICAgICAgICAgICAgICAgICAgICgtMy40NTYxNDApCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1ByaXZhdGUuaAppbmRleCBhOTdlNGYwLi5hYjhjY2QxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcml2YXRlLmgKQEAgLTYxLDYgKzYxLDE1IEBACiAKIC8qIE1lbW9yeSAqLwogI2RlZmluZSBMVkNTX1NDUkFUQ0hCVUZGRVJTICAgICAgICAgICAgICA2ICAgICAgLyogTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWlyZWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLworI2lmZGVmIFNVUFBPUlRfTUMKKy8qCisgKiBUaGUgQ29uY2VydCBTdXJyb3VuZCBtb2R1bGUgYXBwbGllcyBwcm9jZXNzaW5nIG9ubHkgb24gdGhlIGZpcnN0IHR3bworICogY2hhbm5lbHMgb2YgYSBtdWx0aWNoYW5uZWwgaW5wdXQuIFRoZSBkYXRhIG9mIGZpcnN0IHR3byBjaGFubmVscyBpcyBjb3BpZWQKKyAqIGZyb20gdGhlIG11bHRpY2hhbm5lbCBpbnB1dCBpbnRvIHNjcmF0Y2ggYnVmZmVyLiBUaGUgYnVmZmVycyBhZGRlZCBoZXJlCisgKiBhcmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlCisgKi8KKyNkZWZpbmUgTFZDU19NQ19TQ1JBVENIQlVGRkVSUyAgICAgICAgICAgMgorI2VuZGlmCiAKIC8qIEdlbmVyYWwgKi8KICNkZWZpbmUgTFZDU19JTlZBTElEICAgICAgICAgICAgICAgIDB4RkZGRiAgICAgIC8qIEludmFsaWQgaW5pdCBwYXJhbWV0ZXIgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jCmluZGV4IDM5NTZkNGQuLmVmMWQ5ZWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcm9jZXNzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1Byb2Nlc3MuYwpAQCAtNzYsNiArNzYsMjIgQEAKICAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKICAgICBMVk1fRkxPQVQgICAgICAgICAgICpwU2NyYXRjaDsKICAgICBMVkNTX1JldHVyblN0YXR1c19lbiBlcnI7CisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBTdEluOworICAgIExWTV9JTlQzMiAgICAgICAgICAgY2hhbm5lbHMgPSBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzOworI2RlZmluZSBOckZyYW1lcyBOdW1TYW1wbGVzICAvLyBhbGlhcyBmb3IgY2xhcml0eQorCisgICAgLypJbiBjYXNlIG9mIG1vbm8gcHJvY2Vzc2luZywgc3RlcmVvIGlucHV0IGlzIGNyZWF0ZWQgZnJvbSBtb25vCisgICAgICphbmQgc3RvcmVkIGluIHBJbkRhdGEgYmVmb3JlIGFwcGx5aW5nIGFueSBvZiB0aGUgZWZmZWN0cy4KKyAgICAgKkhvd2V2ZXIgd2UgZG8gbm90IHVwZGF0ZSB0aGUgdmFsdWUgcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVscworICAgICAqYXQgdGhpcyBwb2ludC4KKyAgICAgKlNvIHRvIHRyZWF0IHRoZSBwSW5EYXRhIGFzIHN0ZXJlbyB3ZSBhcmUgc2V0dGluZyBjaGFubmVscyB0byAyCisgICAgICovCisgICAgaWYgKGNoYW5uZWxzID09IDEpCisgICAgeworICAgICAgICBjaGFubmVscyA9IDI7CisgICAgfQorI2VuZGlmCiAKICAgICBwU2NyYXRjaCAgPSAoTFZNX0ZMT0FUICopIFwKICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3M7CkBAIC04Myw2ICs5OSwyNSBAQAogICAgIC8qCiAgICAgICogQ2hlY2sgaWYgdGhlIHByb2Nlc3NpbmcgaXMgaW5wbGFjZQogICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAvKgorICAgICAqIFRoZSBwSW5wdXQgYnVmZmVyIGhvbGRzIHRoZSBmaXJzdCAyIChMZWZ0LCBSaWdodCkgY2hhbm5lbHMgaW5mb3JtYXRpb24uCisgICAgICogSGVuY2UgdGhlIG1lbW9yeSByZXF1aXJlZCBieSB0aGlzIGJ1ZmZlciBpcyAyICogTnVtRnJhbWVzLgorICAgICAqIFRoZSBDb25jZXJ0IFN1cnJvdW5kIG1vZHVsZSBjYXJyaWVzIG91dCBwcm9jZXNzaW5nIG9ubHkgb24gTCwgUi4KKyAgICAgKi8KKyAgICBwSW5wdXQgPSBwU2NyYXRjaCArICgyICogTnJGcmFtZXMpOworICAgIHBTdEluICA9IHBTY3JhdGNoICsgKExWQ1NfU0NSQVRDSEJVRkZFUlMgKiBOckZyYW1lcyk7CisgICAgLyogVGhlIGZpcnN0IHR3byBjaGFubmVsIGRhdGEgaXMgZXh0cmFjdGVkIGZyb20gdGhlIGlucHV0IGRhdGEgYW5kCisgICAgICogY29waWVkIGludG8gcElucHV0IGJ1ZmZlcgorICAgICAqLworICAgIENvcHlfRmxvYXRfTWNfU3RlcmVvKChMVk1fRkxPQVQgKilwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMpOworICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbnB1dCwKKyAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU3RJbiwKKyAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOckZyYW1lcykpOworI2Vsc2UKICAgICBpZiAocEluRGF0YSA9PSBwT3V0RGF0YSkKICAgICB7CiAgICAgICAgIC8qIFByb2Nlc3NpbmcgaW5wbGFjZSAqLwpAQCAtOTYsMTQgKzEzMSwyMSBAQAogICAgICAgICAvKiBQcm9jZXNzaW5nIG91dHBsYWNlICovCiAgICAgICAgIHBJbnB1dCA9IHBJbkRhdGE7CiAgICAgfQotCisjZW5kaWYKICAgICAvKgogICAgICAqIENhbGwgdGhlIHN0ZXJlbyBlbmhhbmNlcgogICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBlcnIgPSBMVkNTX1N0ZXJlb0VuaGFuY2VyKGhJbnN0YW5jZSwgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0SW4sICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzKTsgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBmcmFtZXMgdG8gcHJvY2VzcyAqLworI2Vsc2UKICAgICBlcnIgPSBMVkNTX1N0ZXJlb0VuaGFuY2VyKGhJbnN0YW5jZSwgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluRGF0YSwgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KKyNlbmRpZgogCiAgICAgLyoKICAgICAgKiBDYWxsIHRoZSByZXZlcmIgZ2VuZXJhdG9yCkBAIC0xMTIsNyArMTU0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCi0gICAgCisKICAgICAvKgogICAgICAqIENhbGwgdGhlIGVxdWFsaXNlcgogICAgICAqLwpAQCAtMjM5LDcgKzI4MSwxNSBAQAogCiAgICAgTFZDU19JbnN0YW5jZV90ICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKICAgICBMVkNTX1JldHVyblN0YXR1c19lbiBlcnI7Ci0KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgLypFeHRyYWN0IG51bWJlciBvZiBDaGFubmVscyBpbmZvKi8KKyAgICBMVk1fSU5UMzIgY2hhbm5lbHMgPSBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzOworI2RlZmluZSBOckZyYW1lcyBOdW1TYW1wbGVzICAvLyBhbGlhcyBmb3IgY2xhcml0eQorICAgIGlmIChjaGFubmVscyA9PSAxKQorICAgIHsKKyAgICAgICAgY2hhbm5lbHMgPSAyOworICAgIH0KKyNlbmRpZgogICAgIC8qCiAgICAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vdCB0b28gbGFyZ2UKICAgICAgKi8KQEAgLTI2MCw4ICszMTAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAorCisKICAgICAgICAgLyoKICAgICAgICAgICogQ29tcHJlc3MgdG8gcmVkdWNlIGV4cGFuc2lvbiBlZmZlY3Qgb2YgQ29uY2VydCBTb3VuZCBhbmQgY29ycmVjdCB2b2x1bWUKICAgICAgICAgICogZGlmZmVyZW5jZXMgZm9yIGRpZmZlcmVuY2Ugc2V0dGluZ3MuIE5vdCBhcHBsaWVkIGluIHRlc3QgbW9kZXMKQEAgLTM3NiwxNyArNDI2LDMyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgQ29weV9GbG9hdF9TdGVyZW9fTWMocEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscyk7CisjZW5kaWYKICAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgICAgaWYgKHBJbkRhdGEgIT0gcE91dERhdGEpCiAgICAgICAgIHsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhlIGFsZ29yaXRobSBpcyBkaXNhYmxlZCBzbyBqdXN0IGNvcHkgdGhlIGRhdGEKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBPdXREYXRhLCAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKGNoYW5uZWxzICogTnJGcmFtZXMpKTsgICAgLyogQWxsIENoYW5uZWxzKi8KKyNlbHNlCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogVGhlIGFsZ29yaXRobSBpcyBkaXNhYmxlZCBzbyBqdXN0IGNvcHkgdGhlIGRhdGEKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBPdXREYXRhLCAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCisjZW5kaWYKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5jCmluZGV4IGUxNTRlMjkuLmExZmI0OGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmMKQEAgLTc0LDEwICs3NCwxOCBAQAogICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzQ4MDAwX1NDQUxFfQogI2lmZGVmIEhJR0hFUl9GUwogICAgICwKKyAgICB7Q1NfTUlERExFXzg4MjAwX0EwLCAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19NSURETEVfODgyMDBfQTEsCisgICAgIENTX01JRERMRV84ODIwMF9CMSwKKyAgICAgKExWTV9VSU5UMTYpQ1NfTUlERExFXzg4MjAwX1NDQUxFfSwKICAgICB7Q1NfTUlERExFXzk2MDAwX0EwLCAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU19NSURETEVfOTYwMDBfQTEsCiAgICAgIENTX01JRERMRV85NjAwMF9CMSwKICAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV85NjAwMF9TQ0FMRX0sCisgICAge0NTX01JRERMRV8xNzY0MDBfQTAsICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19NSURETEVfMTc2NDAwX0ExLAorICAgICBDU19NSURETEVfMTc2NDAwX0IxLAorICAgICAoTFZNX1VJTlQxNilDU19NSURETEVfMTc2NDAwX1NDQUxFfSwKICAgICB7Q1NfTUlERExFXzE5MjAwMF9BMCwgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIENTX01JRERMRV8xOTIwMDBfQTEsCiAgICAgIENTX01JRERMRV8xOTIwMDBfQjEsCkBAIC0xNDQsMTIgKzE1MiwyNCBAQAogICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV80ODAwMF9TQ0FMRX0KICNpZmRlZiBISUdIRVJfRlMKICAgICAgLAorICAgIHtDU19TSURFXzg4MjAwX0EwLCAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1NJREVfODgyMDBfQTEsCisgICAgIENTX1NJREVfODgyMDBfQTIsCisgICAgIENTX1NJREVfODgyMDBfQjEsCisgICAgIENTX1NJREVfODgyMDBfQjIsCisgICAgIChMVk1fVUlOVDE2KUNTX1NJREVfODgyMDBfU0NBTEV9LAogICAgICB7Q1NfU0lERV85NjAwMF9BMCwgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU19TSURFXzk2MDAwX0ExLAogICAgICBDU19TSURFXzk2MDAwX0EyLAogICAgICBDU19TSURFXzk2MDAwX0IxLAogICAgICBDU19TSURFXzk2MDAwX0IyLAogICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV85NjAwMF9TQ0FMRX0sCisgICAge0NTX1NJREVfMTc2NDAwX0EwLCAgICAgICAgICAvKjE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1NJREVfMTc2NDAwX0ExLAorICAgICBDU19TSURFXzE3NjQwMF9BMiwKKyAgICAgQ1NfU0lERV8xNzY0MDBfQjEsCisgICAgIENTX1NJREVfMTc2NDAwX0IyLAorICAgICAoTFZNX1VJTlQxNilDU19TSURFXzE3NjQwMF9TQ0FMRX0sCiAgICAgIHtDU19TSURFXzE5MjAwMF9BMCwgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgQ1NfU0lERV8xOTIwMDBfQTEsCiAgICAgIENTX1NJREVfMTkyMDAwX0EyLApAQCAtMjIzLDEyICsyNDMsMjQgQEAKICAgICAgQ1NfRVFVQUxJU0VSXzQ4MDAwX0IyLAogICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFfSwKICNpZmRlZiBISUdIRVJfRlMKKyAgICB7Q1NfRVFVQUxJU0VSXzg4MjAwX0EwLCAgICAgLyogODhrUy9zIGNvZWZmaWVpZW50cyAqLworICAgICBDU19FUVVBTElTRVJfODgyMDBfQTEsCisgICAgIENTX0VRVUFMSVNFUl84ODIwMF9BMiwKKyAgICAgQ1NfRVFVQUxJU0VSXzg4MjAwX0IxLAorICAgICBDU19FUVVBTElTRVJfODgyMDBfQjIsCisgICAgIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl84ODIwMF9TQ0FMRX0sCiAgICAge0NTX0VRVUFMSVNFUl85NjAwMF9BMCwgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgQ1NfRVFVQUxJU0VSXzk2MDAwX0ExLAogICAgICBDU19FUVVBTElTRVJfOTYwMDBfQTIsCiAgICAgIENTX0VRVUFMSVNFUl85NjAwMF9CMSwKICAgICAgQ1NfRVFVQUxJU0VSXzk2MDAwX0IyLAogICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzk2MDAwX1NDQUxFfSwKKyAgICB7Q1NfRVFVQUxJU0VSXzE3NjQwMF9BMCwgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX0VRVUFMSVNFUl8xNzY0MDBfQTEsCisgICAgIENTX0VRVUFMSVNFUl8xNzY0MDBfQTIsCisgICAgIENTX0VRVUFMSVNFUl8xNzY0MDBfQjEsCisgICAgIENTX0VRVUFMSVNFUl8xNzY0MDBfQjIsCisgICAgIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl8xNzY0MDBfU0NBTEV9LAogICAgIHtDU19FUVVBTElTRVJfMTkyMDAwX0EwLCAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMSwKICAgICAgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMiwKQEAgLTI5NCwxMiArMzI2LDI0IEBACiAgICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl80ODAwMF9TQ0FMRX0KICNpZmRlZiBISUdIRVJfRlMKICAgICAsCisgICAge0NTRVhfRVFVQUxJU0VSXzg4MjAwX0EwLCAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NFWF9FUVVBTElTRVJfODgyMDBfQTEsCisgICAgIENTRVhfRVFVQUxJU0VSXzg4MjAwX0EyLAorICAgICBDU0VYX0VRVUFMSVNFUl84ODIwMF9CMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfODgyMDBfQjIsCisgICAgIChMVk1fVUlOVDE2KUNTRVhfRVFVQUxJU0VSXzg4MjAwX1NDQUxFfSwKICAgICB7Q1NFWF9FUVVBTElTRVJfOTYwMDBfQTAsICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMSwKICAgICAgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQTIsCiAgICAgIENTRVhfRVFVQUxJU0VSXzk2MDAwX0IxLAogICAgICBDU0VYX0VRVUFMSVNFUl85NjAwMF9CMiwKICAgICAgKExWTV9VSU5UMTYgKUNTRVhfRVFVQUxJU0VSXzk2MDAwX1NDQUxFfSwKKyAgICB7Q1NFWF9FUVVBTElTRVJfMTc2NDAwX0EwLCAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9BMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0EyLAorICAgICBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQjEsCisgICAgIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYpQ1NFWF9FUVVBTElTRVJfMTc2NDAwX1NDQUxFfSwKICAgICAge0NTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMCwgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTEsCiAgICAgIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMiwKQEAgLTMyNiw3ICszNzAsMTIgQEAKICAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzI0S0haLAogICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMzJLSFosCiAgICAgTFZDU19TVEVSRU9ERUxBWV9DU180NEtIWiwKLSAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzQ4S0hafTsKKyAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzQ4S0haLAorICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfODhLSFosCisgICAgTFZDU19TVEVSRU9ERUxBWV9DU185NktIWiwKKyAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzE3NktIWiwKKyAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzE5MktIWiwKK307CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzkyLDEyICs0NDEsMjQgQEAKICAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl80ODAwMF9TQ0FMRX0KICNpZmRlZiBISUdIRVJfRlMKICAgICAsCisgICAge0NTX1JFVkVSQl84ODIwMF9BMCwgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1JFVkVSQl84ODIwMF9BMSwKKyAgICAgQ1NfUkVWRVJCXzg4MjAwX0EyLAorICAgICBDU19SRVZFUkJfODgyMDBfQjEsCisgICAgIENTX1JFVkVSQl84ODIwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYpQ1NfUkVWRVJCXzg4MjAwX1NDQUxFfSwKICAgICB7Q1NfUkVWRVJCXzk2MDAwX0EwLCAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgQ1NfUkVWRVJCXzk2MDAwX0ExLAogICAgICBDU19SRVZFUkJfOTYwMDBfQTIsCiAgICAgIENTX1JFVkVSQl85NjAwMF9CMSwKICAgICAgQ1NfUkVWRVJCXzk2MDAwX0IyLAogICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzk2MDAwX1NDQUxFfSwKKyAgICB7Q1NfUkVWRVJCXzE3NjQwMF9BMCwgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19SRVZFUkJfMTc2NDAwX0ExLAorICAgICBDU19SRVZFUkJfMTc2NDAwX0EyLAorICAgICBDU19SRVZFUkJfMTc2NDAwX0IxLAorICAgICBDU19SRVZFUkJfMTc2NDAwX0IyLAorICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfMTc2NDAwX1NDQUxFfSwKICAgICAge0NTX1JFVkVSQl8xOTIwMDBfQTAsICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgQ1NfUkVWRVJCXzE5MjAwMF9BMSwKICAgICAgQ1NfUkVWRVJCXzE5MjAwMF9BMiwKQEAgLTUwOSwyMiArNTcwLDI2IEBACiAjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzNDQxMDAgICAgIDMyNzM0ICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4OTYyNDAyICovCiAjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzNDgwMDAgICAgIDMyNzM3ICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5MDUzOTU1ICovCiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzODgyMDAgICAgIDMyNzUxICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5NDgxMDY2ICovCiAjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzOTYwMDAgICAgIDMyNzUxICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5NTExNzAzICovICAgLyogVG9kbyBAIG5lZWQgdG8gcmUgY2hlY2sgdGhpcyB2YWx1ZSovCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzMTc2NDAwICAgIDMyNzU5ICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5NzQwNDk5ICovCiAjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzMTkyMDAwICAgIDMyNzYzICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5ODc3OTI1ICovICAvKiBUb2RvIEAgbmVlZCB0byByZSBjaGVjayB0aGlzIHZhbHVlKi8KICNlbmRpZgogCiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCi1jb25zdCBMVk1fSU5UMTYgTFZDU19Wb2x1bWVUQ1RhYmxlWzExXSA9IHtMVkNTX1ZPTF9UQ19GczgwMDAsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczExMDI1LAotCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnMxMjAwMCwKLQkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzMTYwMDAsCi0JCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczIyMDUwLAotCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnMyNDAwMCwKLQkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzMzIwMDAsCi0JCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczQ0MTAwLAotCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnM0ODAwMCwKLQkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzOTYwMDAsCi0JCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczE5MjAwMAorY29uc3QgTFZNX0lOVDE2IExWQ1NfVm9sdW1lVENUYWJsZVsxM10gPSB7TFZDU19WT0xfVENfRnM4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxMTAyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczE2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMyMjA1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMjQwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczMyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnM0NDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzNDgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19Gczg4MjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnM5NjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTc2NDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxOTIwMDAKIH07CiAjZWxzZQogY29uc3QgTFZNX0lOVDE2IExWQ1NfVm9sdW1lVENUYWJsZVs5XSA9IHtMVkNTX1ZPTF9UQ19GczgwMDAsCkBAIC01NDUsMTcgKzYxMCwxOSBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCi1jb25zdCBMVk1fSU5UMzIgICBMVkNTX1NhbXBsZVJhdGVUYWJsZVsxMV0gPSB7ODAwMCwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAyNSwKLQkJCQkJCQkJCQkJICAxMjAwMCwKLQkJCQkJCQkJCQkJICAxNjAwMCwKLQkJCQkJCQkJCQkJICAyMjA1MCwKLQkJCQkJCQkJCQkJICAyNDAwMCwKLQkJCQkJCQkJCQkJICAzMjAwMCwKLQkJCQkJCQkJCQkJICA0NDEwMCwKLQkJCQkJCQkJCQkJICA0ODAwMCwKLQkJCQkJCQkJCQkJICA5NjAwMCwKLQkJCQkJCQkJCQkJICAxOTIwMDAKK2NvbnN0IExWTV9JTlQzMiAgIExWQ1NfU2FtcGxlUmF0ZVRhYmxlWzEzXSA9IHs4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg4MjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3NjQwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTIwMDAKIH07CiAjZWxzZQogY29uc3QgTFZNX0lOVDE2ICAgTFZDU19TYW1wbGVSYXRlVGFibGVbOV0gPSB7ODAwMCwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZTgwN2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDYgQEAKKy8vIEJ1aWxkIHRoZSB1bml0IHRlc3RzIGZvciBlZmZlY3RzCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJsdm10ZXN0IiwKKyAgICBob3N0X3N1cHBvcnRlZDogZmFsc2UsCisgICAgcHJvcHJpZXRhcnk6IHRydWUsCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3MvbGliIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYyIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9saWIiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvbGliIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL2xpYiIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZSIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2VmZmVjdHMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlibXVzaWNidW5kbGUiLAorICAgIF0sCisKKyAgICBzcmNzOiBbImx2bXRlc3QuY3BwIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EQlVJTERfRkxPQVQiLAorICAgICAgICAiLURISUdIRVJfRlMiLAorICAgICAgICAiLURTVVBQT1JUX01DIiwKKworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODYxZWU2NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKQEAgLTAsMCArMSw4OCBAQAorIyEvYmluL2Jhc2gKKyMKKyMgUnVuIHRlc3RzIGluIHRoaXMgZGlyZWN0b3J5LgorIworCitpZiBbIC16ICIkQU5EUk9JRF9CVUlMRF9UT1AiIF07IHRoZW4KKyAgICBlY2hvICJBbmRyb2lkIGJ1aWxkIGVudmlyb25tZW50IG5vdCBzZXQiCisgICAgZXhpdCAtMQorZmkKKworIyBlbnN1cmUgd2UgaGF2ZSBtbQorLiAkQU5EUk9JRF9CVUlMRF9UT1AvYnVpbGQvZW52c2V0dXAuc2gKKworbW0gLWoKKworZWNobyAid2FpdGluZyBmb3IgZGV2aWNlIgorCithZGIgcm9vdCAmJiBhZGIgd2FpdC1mb3ItZGV2aWNlIHJlbW91bnQKKworIyBsb2NhdGlvbiBvZiB0ZXN0IGZpbGVzCit0ZXN0ZGlyPSIvZGF0YS9sb2NhbC90bXAvbHZtVGVzdCIKKworZWNobyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKK2VjaG8gInRlc3RpbmcgbHZtIgorYWRiIHNoZWxsIG1rZGlyIC1wICR0ZXN0ZGlyCithZGIgcHVzaCAkQU5EUk9JRF9CVUlMRF9UT1AvY3RzL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvc2luZXN3ZWVwcmF3LnJhdyAkdGVzdGRpcgorYWRiIHB1c2ggJE9VVC90ZXN0Y2FzZXMvbHZtdGVzdC9hcm02NC9sdm10ZXN0ICR0ZXN0ZGlyCisKK2ZsYWdzX2Fycj0oCisgICAgIi1jc0UiCisgICAgIi1lcUUiCisgICAgIi10RSIKKyAgICAiLWNzRSAtdEUgLWVxRSIKKyAgICAiLWJFIgorICAgICItY3NFIC10RSIKKyAgICAiLWNzRSAtZXFFIiAiLXRFIC1lcUUiCisgICAgIi1jc0UgLXRFIC1iRSAtZXFFIgorKQorCitmc19hcnI9KAorICAgIDgwMDAKKyAgICAxMTAyNQorICAgIDEyMDAwCisgICAgMTYwMDAKKyAgICAyMjA1MAorICAgIDI0MDAwCisgICAgMzIwMDAKKyAgICA0NDEwMAorICAgIDQ4MDAwCisgICAgODgyMDAKKyAgICA5NjAwMAorICAgIDE3NjQwMAorICAgIDE5MjAwMAorKQorCitjaF9hcnI9KAorICAgIDEKKyAgICAyCisgICAgNAorICAgIDYKKyAgICA4CispCisKKyMgcnVuIG11bHRpY2hhbm5lbCBlZmZlY3RzIGF0IGRpZmZlcmVudCBjb25maWdzLCBzYXZpbmcgb25seSB0aGUgc3RlcmVvIGNoYW5uZWwKKyMgcGFpci4KK2ZvciBmbGFncyBpbiAiJHtmbGFnc19hcnJbQF19IgorZG8KKyAgICBmb3IgZnMgaW4gJHtmc19hcnJbKl19CisgICAgZG8KKyAgICAgICAgZm9yIGNoIGluICR7Y2hfYXJyWypdfQorICAgICAgICBkbworICAgICAgICAgICAgYWRiIHNoZWxsICR0ZXN0ZGlyL2x2bXRlc3QgLWk6JHRlc3RkaXIvc2luZXN3ZWVwcmF3LnJhdyBcCisgICAgICAgICAgICAgICAgLW86JHRlc3RkaXIvc2luZXN3ZWVwXyQoKGNoKSlfJCgoZnMpKS5yYXcgLWNoOiRjaCAtZnM6JGZzICRmbGFncworCisgICAgICAgICAgICAjIHR3byBjaGFubmVsIGZpbGVzIHNob3VsZCBiZSBpZGVudGljYWwgdG8gaGlnaGVyIGNoYW5uZWwKKyAgICAgICAgICAgICMgY29tcHV0YXRpb24gKGZpcnN0IDIgY2hhbm5lbHMpLgorICAgICAgICAgICAgIyBEbyBub3QgY29tcGFyZSBjYXNlcyB3aGVyZSAtYkUgaXMgaW4gZmxhZ3MgKGR1ZSB0byBtb25vIGNvbXB1dGF0aW9uKQorICAgICAgICAgICAgaWYgW1sgJGZsYWdzICE9ICoiLWJFIiogXV0gJiYgWyAiJGNoIiAtZ3QgMiBdCisgICAgICAgICAgICB0aGVuCisgICAgICAgICAgICAgICAgYWRiIHNoZWxsIGNtcCAkdGVzdGRpci9zaW5lc3dlZXBfMl8kKChmcykpLnJhdyBcCisgICAgICAgICAgICAgICAgICAgICR0ZXN0ZGlyL3NpbmVzd2VlcF8kKChjaCkpXyQoKGZzKSkucmF3CisgICAgICAgICAgICBmaQorCisgICAgICAgIGRvbmUKKyAgICBkb25lCitkb25lCisKK2FkYiBzaGVsbCBybSAtciAkdGVzdGRpcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvbHZtdGVzdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9sdm10ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzI3MWQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvbHZtdGVzdC5jcHAKQEAgLTAsMCArMSw3NDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2NoYW5uZWxzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgIkVmZmVjdEJ1bmRsZS5oIgorI2luY2x1ZGUgIkxWTV9Qcml2YXRlLmgiCisKKyNpZmRlZiBWRVJZX1ZFUllfVkVSQk9TRV9MT0dHSU5HCisjZGVmaW5lIEFMT0dWViBBTE9HVgorI2Vsc2UKKyNkZWZpbmUgQUxPR1ZWKGEuLi4pIFwKKyAgZG8geyAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoZmFsc2UpCisjZW5kaWYKKworI2RlZmluZSBDSEVDS19BUkcoY29uZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCEoY29uZCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQUxPR0UoIlx0TFZNX0VSUk9SIDogSW52YWxpZCBhcmd1bWVudDogIiAjY29uZCk7IFwKKyAgICAgIHJldHVybiAtRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBcCit9CisKKyNkZWZpbmUgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoTHZtU3RhdHVzKSA9PSBMVk1fTlVMTEFERFJFU1MpIHsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEFMT0dFKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIlx0TFZNX0VSUk9SIDogUGFyYW1ldGVyIGVycm9yIC0gIiAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICJudWxsIHBvaW50ZXIgcmV0dXJuZWQgYnkgJXMgaW4gJXNcblxuXG5cbiIsICAgICAgICAgIFwKKyAgICAgICAgICBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoTHZtU3RhdHVzKSA9PSBMVk1fQUxJR05NRU5URVJST1IpIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEFMT0dFKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIlx0TFZNX0VSUk9SIDogUGFyYW1ldGVyIGVycm9yIC0gIiAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICJiYWQgYWxpZ25tZW50IHJldHVybmVkIGJ5ICVzIGluICVzXG5cblxuXG4iLCAgICAgICAgIFwKKyAgICAgICAgICBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoTHZtU3RhdHVzKSA9PSBMVk1fSU5WQUxJRE5VTVNBTVBMRVMpIHsgICAgICAgICAgICAgICAgIFwKKyAgICAgIEFMT0dFKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIlx0TFZNX0VSUk9SIDogUGFyYW1ldGVyIGVycm9yIC0gIiAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICJiYWQgbnVtYmVyIG9mIHNhbXBsZXMgcmV0dXJuZWQgYnkgJXMgaW4gJXNcblxuXG5cbiIsIFwKKyAgICAgICAgICBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoTHZtU3RhdHVzKSA9PSBMVk1fT1VUT0ZSQU5HRSkgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEFMT0dFKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIlx0TFZNX0VSUk9SIDogUGFyYW1ldGVyIGVycm9yIC0gIiAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICJvdXQgb2YgcmFuZ2UgcmV0dXJuZWQgYnkgJXMgaW4gJXNcbiIsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKK3N0cnVjdCBsdm1Db25maWdQYXJhbXNfdCB7CisgIGludCAgICAgICAgICAgICAgc2FtcGxpbmdGcmVxICAgID0gNDQxMDA7CisgIGludCAgICAgICAgICAgICAgbnJDaGFubmVscyAgICAgID0gMjsKKyAgaW50ICAgICAgICAgICAgICBmQ2hhbm5lbHMgICAgICAgPSAyOworICBib29sICAgICAgICAgICAgIG1vbm9Nb2RlICAgICAgICA9IGZhbHNlOworICBpbnQgICAgICAgICAgICAgIGJhc3NFZmZlY3RMZXZlbCA9IDA7CisgIGludCAgICAgICAgICAgICAgZXFQcmVzZXRMZXZlbCAgID0gMDsKKyAgaW50ICAgICAgICAgICAgICBmcmFtZUxlbmd0aCAgICAgPSAyNTY7CisgIExWTV9CRV9Nb2RlX2VuICAgYmFzc0VuYWJsZSAgICAgID0gTFZNX0JFX09GRjsKKyAgTFZNX1RFX01vZGVfZW4gICB0cmVibGVFbmFibGUgICAgPSBMVk1fVEVfT0ZGOworICBMVk1fRVFOQl9Nb2RlX2VuIGVxRW5hYmxlICAgICAgICA9IExWTV9FUU5CX09GRjsKKyAgTFZNX01vZGVfZW4gICAgICBjc0VuYWJsZSAgICAgICAgPSBMVk1fTU9ERV9PRkY7Cit9OworCit2b2lkIHByaW50VXNhZ2UoKSB7CisgIHByaW50ZigiXG5Vc2FnZTogIik7CisgIHByaW50ZigiXG4gICAgIDxleGNldXRhYmxlPiAtaTo8aW5wdXRfZmlsZT4gLW86PG91dF9maWxlPiBbb3B0aW9uc11cbiIpOworICBwcmludGYoIlxud2hlcmUsIFxuICAgICA8aW5wdXRmaWxlPiAgaXMgdGhlIGlucHV0IGZpbGUgbmFtZSIpOworICBwcmludGYoIlxuICAgICAgICAgICAgICAgICAgb24gd2hpY2ggTFZNIGVmZmVjdHMgYXJlIGFwcGxpZWQiKTsKKyAgcHJpbnRmKCJcbiAgICAgPG91dHB1dGZpbGU+IHByb2Nlc3NlZCBvdXRwdXQgZmlsZSIpOworICBwcmludGYoIlxuICAgICBhbmQgb3B0aW9ucyBhcmUgbWVudGlvbmVkIGJlbG93Iik7CisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCJcbiAgICAgLWhlbHAgKG9yKSAtaCIpOworICBwcmludGYoIlxuICAgICAgICAgICBQcmludHMgdGhpcyB1c2FnZSBpbmZvcm1hdGlvbiIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgIC1jaDo8cHJvY2Vzc19jaGFubmVscz4gKDEgdGhyb3VnaCA4KVxuXG4iKTsKKyAgcHJpbnRmKCJcbiAgICAgLWZjaDo8ZmlsZV9jaGFubmVscz4gKDEgdGhyb3VnaCA4KVxuXG4iKTsKKyAgcHJpbnRmKCJcbiAgICAgLU0iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgTW9ubyBtb2RlIChmb3JjZSBhbGwgaW5wdXQgYXVkaW8gY2hhbm5lbHMgdG8gYmUgaWRlbnRpY2FsKSIpOworICBwcmludGYoIlxuICAgICAtYmFzc2x2bDo8ZWZmZWN0X2xldmVsPiIpOworICBwcmludGYoIlxuICAgICAgICAgICBBIHZhbHVlIHRoYXQgcmFuZ2VzIGJldHdlZW4gMCAtIDE1IGRlZmF1bHQgMCIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgIC1lcVByZXNldDo8cHJlc2V0IFZhbHVlPiIpOworICBwcmludGYoIlxuICAgICAgICAgICAwIC0gTm9ybWFsIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDEgLSBDbGFzc2ljYWwiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgMiAtIERhbmNlIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDMgLSBGbGF0Iik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDQgLSBGb2xrIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDUgLSBIZWF2eSBNZXRhbCIpOworICBwcmludGYoIlxuICAgICAgICAgICA2IC0gSGlwIEhvcCIpOworICBwcmludGYoIlxuICAgICAgICAgICA3IC0gSmF6eiIpOworICBwcmludGYoIlxuICAgICAgICAgICA4IC0gUG9wIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDkgLSBSb2NrIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIGRlZmF1bHQgMCIpOworICBwcmludGYoIlxuICAgICAtYkUgIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQiKTsKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIlxuICAgICAtdEUgIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBUcmVibGUgQm9vc3QiKTsKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIlxuICAgICAtY3NFICIpOworICBwcmludGYoIlxuICAgICAgICAgICBFbmFibGUgQ29uY2VydCBTdXJyb3VuZCIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgIC1lcUUgIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBFcXVhbGl6ZXIiKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMdm1FZmZlY3RfZnJlZSgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6IEZyZWUgYWxsIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIEJ1bmRsZS4KKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLworLy8gT3V0cHV0czoKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBMdm1FZmZlY3RfZnJlZShzdHJ1Y3QgRWZmZWN0Q29udGV4dCAqcENvbnRleHQpIHsKKyAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgTFZNX01lbVRhYl90IE1lbVRhYjsKKworICAvKiBGcmVlIHRoZSBhbGdvcml0aG0gbWVtb3J5ICovCisgIEx2bVN0YXR1cyA9IExWTV9HZXRNZW1vcnlUYWJsZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZNZW1UYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTlVMTCk7CisKKyAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRNZW1vcnlUYWJsZSIsICJMdm1FZmZlY3RfZnJlZSIpCisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKykgeworICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLlNpemUgIT0gMCkgeworICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzICE9IE5VTEwpIHsKKyAgICAgICAgQUxPR1YoIlx0THZtRWZmZWN0X2ZyZWUgLSBTVEFSVCBmcmVlaW5nICUiIFBSSXUzMgorICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCisgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworCisgICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworCisgICAgICAgIEFMT0dWKCJcdEx2bUVmZmVjdF9mcmVlIC0gRU5EICAgZnJlZWluZyAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAorICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKAorICAgICAgICAgICAgIlx0TFZNX0VSUk9SIDogTHZtRWZmZWN0X2ZyZWUgLSB0cnlpbmcgdG8gZnJlZSB3aXRoIE5VTEwgcG9pbnRlciAiCisgICAgICAgICAgICAiJSIgUFJJdTMyICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcCBFUlJPUlxuIiwKKyAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgICAgfQorICAgIH0KKyAgfQorfSAvKiBlbmQgTHZtRWZmZWN0X2ZyZWUgKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMdm1CdW5kbGVfaW5pdCgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6IEluaXRpYWxpemUgZW5naW5lIHdpdGggZGVmYXVsdCBjb25maWd1cmF0aW9uLCBjcmVhdGVzIGluc3RhbmNlCisvLyB3aXRoIGFsbCBlZmZlY3RzIGRpc2FibGVkLgorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgTHZtQnVuZGxlX2luaXQoc3RydWN0IEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBMVk1fQ29udHJvbFBhcmFtc190ICpwYXJhbXMpIHsKKyAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgc3RhcnQiKTsKKworICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOworICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEVGRkVDVF9CVUZGRVJfRk9STUFUOworICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOworICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKKyAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CisgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOworICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gRUZGRUNUX0JVRkZFUl9GT1JNQVQ7CisgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOworICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOworICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKKyAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKKyAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOworCisgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UgIT0gTlVMTCkgeworICAgIEFMT0dWKAorICAgICAgICAiXHRMdm1CdW5kbGVfaW5pdCBwQ29udGV4dC0+cEJhc3NCb29zdCAhPSBOVUxMICIKKyAgICAgICAgIi0+IENhbGxpbmcgcENvbnRleHQtPnBCYXNzQm9vc3QtPmZyZWUoKSIpOworCisgICAgTHZtRWZmZWN0X2ZyZWUocENvbnRleHQpOworCisgICAgQUxPR1YoCisgICAgICAgICJcdEx2bUJ1bmRsZV9pbml0IHBDb250ZXh0LT5wQmFzc0Jvb3N0ICE9IE5VTEwgIgorICAgICAgICAiLT4gQ2FsbGVkIHBDb250ZXh0LT5wQmFzc0Jvb3N0LT5mcmVlKCkiKTsKKyAgfQorCisgIExWTV9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgIExWTV9JbnN0UGFyYW1zX3QgSW5zdFBhcmFtczsgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KKyAgTFZNX0VRTkJfQmFuZERlZl90IEJhbmREZWZzW01BWF9OVU1fQkFORFNdOyAgLyogRXF1YWxpc2VyIGJhbmQgZGVmaW5pdGlvbnMgKi8KKyAgTFZNX0hlYWRyb29tUGFyYW1zX3QgSGVhZHJvb21QYXJhbXM7ICAgICAgICAgLyogSGVhZHJvb20gcGFyYW1ldGVycyAqLworICBMVk1fSGVhZHJvb21CYW5kRGVmX3QgSGVhZHJvb21CYW5kRGVmW0xWTV9IRUFEUk9PTV9NQVhfTkJBTkRTXTsKKyAgTFZNX01lbVRhYl90IE1lbVRhYjsgLyogTWVtb3J5IGFsbG9jYXRpb24gdGFibGUgKi8KKyAgYm9vbCBiTWFsbG9jRmFpbHVyZSA9IExWTV9GQUxTRTsKKworICAvKiBTZXQgdGhlIGNhcGFiaWxpdGllcyAqLworICBJbnN0UGFyYW1zLkJ1ZmZlck1vZGUgPSBMVk1fVU5NQU5BR0VEX0JVRkZFUlM7CisgIEluc3RQYXJhbXMuTWF4QmxvY2tTaXplID0gTUFYX0NBTExfU0laRTsKKyAgSW5zdFBhcmFtcy5FUU5CX051bUJhbmRzID0gTUFYX05VTV9CQU5EUzsKKyAgSW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQgPSBMVk1fUFNBX09OOworCisgIC8qIEFsbG9jYXRlIG1lbW9yeSwgZm9yY2luZyBhbGlnbm1lbnQgKi8KKyAgTHZtU3RhdHVzID0gTFZNX0dldE1lbW9yeVRhYmxlKExWTV9OVUxMLCAmTWVtVGFiLCAmSW5zdFBhcmFtcyk7CisKKyAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRNZW1vcnlUYWJsZSIsICJMdm1CdW5kbGVfaW5pdCIpOworICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICBBTE9HVigiXHRDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX0dldE1lbW9yeVRhYmxlXG4iKTsKKworICAvKiBBbGxvY2F0ZSBtZW1vcnkgKi8KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKykgeworICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLlNpemUgIT0gMCkgeworICAgICAgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPSBtYWxsb2MoTWVtVGFiLlJlZ2lvbltpXS5TaXplKTsKKworICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzID09IExWTV9OVUxMKSB7CisgICAgICAgIEFMT0dFKAorICAgICAgICAgICAgIlx0TFZNX0VSUk9SIDpMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQgdG8gYWxsb2NhdGUgIgorICAgICAgICAgICAgIiUiIFBSSXUzMiAiIGJ5dGVzIGZvciByZWdpb24gJXVcbiIsCisgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkpOworICAgICAgICBiTWFsbG9jRmFpbHVyZSA9IExWTV9UUlVFOworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIGFsbG9jYXRlZCAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAorICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBJZiBvbmUgb3IgbW9yZSBvZiB0aGUgbWVtb3J5IHJlZ2lvbnMgZmFpbGVkIHRvIGFsbG9jYXRlLCBmcmVlIHRoZSByZWdpb25zCisgICAqIHRoYXQgd2VyZQorICAgKiBzdWNjZXNmdWxseSBhbGxvY2F0ZWQgYW5kIHJldHVybiB3aXRoIGFuIGVycm9yCisgICAqLworICBpZiAoYk1hbGxvY0ZhaWx1cmUgPT0gTFZNX1RSVUUpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKSB7CisgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgQUxPR0UoCisgICAgICAgICAgICAiXHRMVk1fRVJST1IgOkx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAiCisgICAgICAgICAgICAiJSIgUFJJdTMyICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBOb3QgZnJlZWluZ1xuIiwKKyAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgKKyAgICAgICAgICAgICJcdExWTV9FUlJPUiA6THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkOiBidXQgYWxsb2NhdGVkICIKKyAgICAgICAgICAgICIlIiBQUkl1MzIgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwLSBmcmVlXG4iLAorICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CisgICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLUVJTlZBTDsKKyAgfQorICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBtYWxsb2MnZCBtZW1vcnlcbiIpOworCisgIC8qIEluaXRpYWxpc2UgKi8KKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlID0gTFZNX05VTEw7CisKKyAgLyogSW5pdCBzZXRzIHRoZSBpbnN0YW5jZSBoYW5kbGUgKi8KKyAgTHZtU3RhdHVzID0gTFZNX0dldEluc3RhbmNlSGFuZGxlKCZwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTWVtVGFiLCAmSW5zdFBhcmFtcyk7CisKKyAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRJbnN0YW5jZUhhbmRsZSIsICJMdm1CdW5kbGVfaW5pdCIpOworICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICBBTE9HVigKKyAgICAgICJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCAiCisgICAgICAiTFZNX0dldEluc3RhbmNlSGFuZGxlXG4iKTsKKworICAvKiBTZXQgdGhlIGluaXRpYWwgcHJvY2VzcyBwYXJhbWV0ZXJzICovCisgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPk9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PTjsKKyAgcGFyYW1zLT5TYW1wbGVSYXRlID0gTFZNX0ZTXzQ0MTAwOworICBwYXJhbXMtPlNvdXJjZUZvcm1hdCA9IExWTV9TVEVSRU87CisgIHBhcmFtcy0+U3BlYWtlclR5cGUgPSBMVk1fSEVBRFBIT05FUzsKKworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVSYXRlID0gTFZNX0ZTXzQ0MTAwOworCisgIC8qIENvbmNlcnQgU291bmQgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX09GRjsKKyAgcGFyYW1zLT5WaXJ0dWFsaXplclR5cGUgPSBMVk1fQ09OQ0VSVFNPVU5EOworICBwYXJhbXMtPlZpcnR1YWxpemVyUmV2ZXJiTGV2ZWwgPSAxMDA7CisgIHBhcmFtcy0+Q1NfRWZmZWN0TGV2ZWwgPSBMVk1fQ1NfRUZGRUNUX05PTkU7CisKKyAgLyogTi1CYW5kIEVxdWFsaXNlciBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+RVFOQl9PcGVyYXRpbmdNb2RlID0gTFZNX0VRTkJfT047CisgIHBhcmFtcy0+RVFOQl9OQmFuZHMgPSBGSVZFQkFORF9OVU1CQU5EUzsKKyAgcGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbiA9ICZCYW5kRGVmc1swXTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKKyAgICBCYW5kRGVmc1tpXS5GcmVxdWVuY3kgPSBFUU5CXzVCYW5kUHJlc2V0c0ZyZXF1ZW5jaWVzW2ldOworICAgIEJhbmREZWZzW2ldLlFGYWN0b3IgPSBFUU5CXzVCYW5kUHJlc2V0c1FGYWN0b3JzW2ldOworICAgIEJhbmREZWZzW2ldLkdhaW4gPSBFUU5CXzVCYW5kU29mdFByZXNldHNbaV07CisgIH0KKworICAvKiBWb2x1bWUgQ29udHJvbCBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+VkNfRWZmZWN0TGV2ZWwgPSAwOworICBwYXJhbXMtPlZDX0JhbGFuY2UgPSAwOworCisgIC8qIFRyZWJsZSBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+VEVfT3BlcmF0aW5nTW9kZSA9IExWTV9URV9PRkY7CisgIHBhcmFtcy0+VEVfRWZmZWN0TGV2ZWwgPSAwOworCisgIC8qIFBTQSBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5QU0FfRW5hYmxlID0gTFZNX1BTQV9PRkY7CisgIHBhcmFtcy0+UFNBX1BlYWtEZWNheVJhdGUgPSAoTFZNX1BTQV9EZWNheVNwZWVkX2VuKTA7CisKKyAgLyogQmFzcyBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+QkVfT3BlcmF0aW5nTW9kZSA9IExWTV9CRV9PTjsKKyAgcGFyYW1zLT5CRV9FZmZlY3RMZXZlbCA9IDA7CisgIHBhcmFtcy0+QkVfQ2VudHJlRnJlcSA9IExWTV9CRV9DRU5UUkVfOTBIejsKKyAgcGFyYW1zLT5CRV9IUEYgPSBMVk1fQkVfSFBGX09OOworCisgIC8qIFBTQSBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5QU0FfRW5hYmxlID0gTFZNX1BTQV9PRkY7CisgIHBhcmFtcy0+UFNBX1BlYWtEZWNheVJhdGUgPSBMVk1fUFNBX1NQRUVEX01FRElVTTsKKworICAvKiBURSBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5URV9PcGVyYXRpbmdNb2RlID0gTFZNX1RFX09GRjsKKyAgcGFyYW1zLT5URV9FZmZlY3RMZXZlbCA9IDA7CisKKyAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KKyAgTHZtU3RhdHVzID0KKyAgICAgIExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsIHBhcmFtcyk7CisKKyAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJMdm1CdW5kbGVfaW5pdCIpOworICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICBBTE9HVigKKyAgICAgICJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCAiCisgICAgICAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKworICAvKiBTZXQgdGhlIGhlYWRyb29tIHBhcmFtZXRlcnMgKi8KKyAgSGVhZHJvb21CYW5kRGVmWzBdLkxpbWl0X0xvdyA9IDIwOworICBIZWFkcm9vbUJhbmREZWZbMF0uTGltaXRfSGlnaCA9IDQ5OTk7CisgIEhlYWRyb29tQmFuZERlZlswXS5IZWFkcm9vbV9PZmZzZXQgPSAwOworICBIZWFkcm9vbUJhbmREZWZbMV0uTGltaXRfTG93ID0gNTAwMDsKKyAgSGVhZHJvb21CYW5kRGVmWzFdLkxpbWl0X0hpZ2ggPSAyNDAwMDsKKyAgSGVhZHJvb21CYW5kRGVmWzFdLkhlYWRyb29tX09mZnNldCA9IDA7CisgIEhlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb24gPSAmSGVhZHJvb21CYW5kRGVmWzBdOworICBIZWFkcm9vbVBhcmFtcy5IZWFkcm9vbV9PcGVyYXRpbmdNb2RlID0gTFZNX0hFQURST09NX09OOworICBIZWFkcm9vbVBhcmFtcy5OSGVhZHJvb21CYW5kcyA9IDI7CisKKyAgTHZtU3RhdHVzID0gTFZNX1NldEhlYWRyb29tUGFyYW1zKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIZWFkcm9vbVBhcmFtcyk7CisKKyAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRIZWFkcm9vbVBhcmFtcyIsICJMdm1CdW5kbGVfaW5pdCIpOworICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICBBTE9HVigKKyAgICAgICJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCAiCisgICAgICAiTFZNX1NldEhlYWRyb29tUGFyYW1zXG4iKTsKKyAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgRW5kIik7CisgIHJldHVybiAwOworfSAvKiBlbmQgTHZtQnVuZGxlX2luaXQgKi8KKworaW50IGx2bUNyZWF0ZShzdHJ1Y3QgRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCisgICAgICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtc190ICAgICpwbHZtQ29uZmlnUGFyYW1zLAorICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAqcGFyYW1zKSB7CisgIGludCByZXQgPSAwOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0ID0gTlVMTDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCA9IChCdW5kbGVkRWZmZWN0Q29udGV4dCAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IEJ1bmRsZWRFZmZlY3RDb250ZXh0KSk7CisgIGlmIChOVUxMID09IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQpIHsKKyAgICByZXR1cm4gLUVJTlZBTDsKKyAgfQorCisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25ObyA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25JZCA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSA9IE5VTEw7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWb2x1bWVFbmFibGVkID0gTFZNX0ZBTFNFOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iRXF1YWxpemVyRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NFbmFibGVkID0gTFZNX0ZBTFNFOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc1RlbXBEaXNhYmxlZCA9IExWTV9GQUxTRTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkID0gTFZNX0ZBTFNFOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uT3V0cHV0RGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5WaXJ0dWFsaXplckZvcmNlZERldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQgPSAwOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5maXJzdFZvbHVtZSA9IExWTV9UUlVFOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT52b2x1bWUgPSAwOworCisgIC8qIFNhdmVkIHN0cmVuZ3RoIGlzIHVzZWQgdG8gcmV0dXJuIHRoZSBleGFjdCBzdHJlbmd0aCB0aGF0IHdhcyB1c2VkIGluIHRoZQorICAgKiBzZXQgdG8gdGhlIGdldAorICAgKiBiZWNhdXNlIHdlIG1hcCB0aGUgb3JpZ2luYWwgc3RyZW5ndGggcmFuZ2Ugb2YgMDoxMDAwIHRvIDE6MTUsIGFuZCB0aGlzIHdpbGwKKyAgICogYXZvaWQKKyAgICogcXVhbnRpc2F0aW9uIGxpa2UgZWZmZWN0IHdoZW4gcmV0dXJuaW5nCisgICAqLworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5CYXNzU3RyZW5ndGhTYXZlZCA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlZpcnRTdHJlbmd0aFNhdmVkID0gMDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Q3VyUHJlc2V0ID0gUFJFU0VUX0NVU1RPTTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+bGV2ZWxTYXZlZCA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJNdXRlRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlN0ZXJlb1Bvc2l0aW9uRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgPSBOVUxMOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5mcmFtZUNvdW50ID0gLTE7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgPSAwOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEVxID0gMDsKKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiAhZGVmaW5lZChOQVRJVkVfRkxPQVRfQlVGRkVSKQorICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgPSBOVUxMOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyID0gTlVMTDsKKyNlbmRpZgorICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iYW5kR2FpbmRCW2ldID0gRVFOQl81QmFuZFNvZnRQcmVzZXRzW2ldOworICB9CisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBwbHZtQ29uZmlnUGFyYW1zLT5uckNoYW5uZWxzOworICBBTE9HVigiXHRFZmZlY3RDcmVhdGUgLSBDYWxsaW5nIEx2bUJ1bmRsZV9pbml0Iik7CisgIHJldCA9IEx2bUJ1bmRsZV9pbml0KHBDb250ZXh0LCBwYXJhbXMpOworCisgIGlmIChyZXQgPCAwKSB7CisgICAgQUxPR0UoIlx0TFZNX0VSUk9SIDogbHZtQ3JlYXRlKCkgQnVuZGxlIGluaXQgZmFpbGVkIik7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IGx2bUNvbnRyb2woc3RydWN0IEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAorICAgICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zX3QgICAgKnBsdm1Db25maWdQYXJhbXMsCisgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAqcGFyYW1zKSB7CisgIExWTV9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisKKyAgLyogU2V0IHRoZSBpbml0aWFsIHByb2Nlc3MgcGFyYW1ldGVycyAqLworICAvKiBHZW5lcmFsIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5PcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT047CisgIHBhcmFtcy0+U3BlYWtlclR5cGUgPSBMVk1fSEVBRFBIT05FUzsKKworICBjb25zdCBpbnQgbnJDaGFubmVscyA9IHBsdm1Db25maWdQYXJhbXMtPm5yQ2hhbm5lbHM7CisgIHBhcmFtcy0+TnJDaGFubmVscyA9IG5yQ2hhbm5lbHM7CisgIGlmIChuckNoYW5uZWxzID09IDEpIHsKKyAgICBwYXJhbXMtPlNvdXJjZUZvcm1hdCA9IExWTV9NT05POworICB9IGVsc2UgaWYgKG5yQ2hhbm5lbHMgPT0gMikgeworICAgIHBhcmFtcy0+U291cmNlRm9ybWF0ID0gTFZNX1NURVJFTzsKKyAgfSBlbHNlIGlmIChuckNoYW5uZWxzID4gMiAmJiBuckNoYW5uZWxzIDw9IDgpIHsgLy8gRkNDXzIgRkNDXzgKKyAgICBwYXJhbXMtPlNvdXJjZUZvcm1hdCA9IExWTV9NVUxUSUNIQU5ORUw7CisgIH0gZWxzZSB7CisgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgfQorCisgIExWTV9Gc19lbiBzYW1wbGVSYXRlOworICBzd2l0Y2ggKHBsdm1Db25maWdQYXJhbXMtPnNhbXBsaW5nRnJlcSkgeworICAgIGNhc2UgODAwMDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfODAwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTEwMjU6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzExMDI1OworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjAwMDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfMTIwMDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE2MDAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU18xNjAwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjIwNTA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzIyMDUwOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDAwMDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfMjQwMDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDMyMDAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU18zMjAwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDQxMDA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzQ0MTAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0ODAwMDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfNDgwMDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDg4MjAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU184ODIwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgOTYwMDA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzk2MDAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxNzY0MDA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzE3NjQwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTkyMDAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU18xOTIwMDA7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIC1FSU5WQUw7CisgIH0KKyAgcGFyYW1zLT5TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKKworICAvKiBDb25jZXJ0IFNvdW5kIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgPSBwbHZtQ29uZmlnUGFyYW1zLT5jc0VuYWJsZTsKKyAgcGFyYW1zLT5WaXJ0dWFsaXplclR5cGUgPSBMVk1fQ09OQ0VSVFNPVU5EOworICBwYXJhbXMtPlZpcnR1YWxpemVyUmV2ZXJiTGV2ZWwgPSAxMDA7CisgIHBhcmFtcy0+Q1NfRWZmZWN0TGV2ZWwgPSBMVk1fQ1NfRUZGRUNUX05PTkU7CisKKyAgLyogTi1CYW5kIEVxdWFsaXNlciBwYXJhbWV0ZXJzICovCisgIGNvbnN0IGludCBlcVByZXNldExldmVsID0gcGx2bUNvbmZpZ1BhcmFtcy0+ZXFQcmVzZXRMZXZlbDsKKyAgTFZNX0VRTkJfQmFuZERlZl90IEJhbmREZWZzW01BWF9OVU1fQkFORFNdOyAgLyogRXF1YWxpc2VyIGJhbmQgZGVmaW5pdGlvbnMgKi8KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUzsgaSsrKSB7CisgICAgQmFuZERlZnNbaV0uRnJlcXVlbmN5ID0gRVFOQl81QmFuZFByZXNldHNGcmVxdWVuY2llc1tpXTsKKyAgICBCYW5kRGVmc1tpXS5RRmFjdG9yID0gRVFOQl81QmFuZFByZXNldHNRRmFjdG9yc1tpXTsKKyAgICBCYW5kRGVmc1tpXS5HYWluID0KKyAgICAgICAgRVFOQl81QmFuZFNvZnRQcmVzZXRzWyhGSVZFQkFORF9OVU1CQU5EUyAqIGVxUHJlc2V0TGV2ZWwpICsgaV07CisgIH0KKyAgcGFyYW1zLT5FUU5CX09wZXJhdGluZ01vZGUgPSBwbHZtQ29uZmlnUGFyYW1zLT5lcUVuYWJsZTsKKyAvLyBDYXV0aW9uOiByYXcgcG9pbnRlciB0byBzdGFjayBkYXRhLCBzdG9yZWQgaW4gaW5zdGFuY2UgYnkgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzLgorICBwYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uID0gJkJhbmREZWZzWzBdOworCisgIC8qIFZvbHVtZSBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5WQ19FZmZlY3RMZXZlbCA9IDA7CisgIHBhcmFtcy0+VkNfQmFsYW5jZSA9IDA7CisKKyAgLyogVHJlYmxlIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5URV9PcGVyYXRpbmdNb2RlID0gcGx2bUNvbmZpZ1BhcmFtcy0+dHJlYmxlRW5hYmxlOworCisgIC8qIFBTQSBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5QU0FfRW5hYmxlID0gTFZNX1BTQV9PTjsKKworICAvKiBCYXNzIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5CRV9PcGVyYXRpbmdNb2RlID0gcGx2bUNvbmZpZ1BhcmFtcy0+YmFzc0VuYWJsZTsKKworICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLworICBMdm1TdGF0dXMgPQorICAgICAgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgcGFyYW1zKTsKKworICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkx2bUJ1bmRsZV9pbml0Iik7CisgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgIEx2bVN0YXR1cyA9IExWTV9BcHBseU5ld1NldHRpbmdzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSk7CisKKyAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBsdm1FeGVjdXRlKGZsb2F0ICpmbG9hdEluLCBmbG9hdCAqZmxvYXRPdXQsIHN0cnVjdCBFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKKyAgICAgICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtc190ICpwbHZtQ29uZmlnUGFyYW1zKSB7CisgIGNvbnN0IGludCBmcmFtZUxlbmd0aCA9IHBsdm1Db25maWdQYXJhbXMtPmZyYW1lTGVuZ3RoOworICByZXR1cm4KKyAgICAgIExWTV9Qcm9jZXNzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICBmbG9hdEluLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElucHV0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgZmxvYXRPdXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNilmcmFtZUxlbmd0aCwgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcmVhZCAqLworICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgIC8qIEF1ZGlvIFRpbWUgKi8KK30KKworaW50IGx2bU1haW5Qcm9jZXNzKGx2bUNvbmZpZ1BhcmFtc190ICpwbHZtQ29uZmlnUGFyYW1zLCBGSUxFICpmaW5wLCBGSUxFICpmb3V0KSB7CisgIHN0cnVjdCBFZmZlY3RDb250ZXh0IGNvbnRleHQ7CisgIExWTV9Db250cm9sUGFyYW1zX3QgcGFyYW1zOworCisgIGludCBlcnJDb2RlID0gbHZtQ3JlYXRlKCZjb250ZXh0LCBwbHZtQ29uZmlnUGFyYW1zLCAmcGFyYW1zKTsKKyAgaWYgKGVyckNvZGUpIHsKKyAgICBBTE9HRSgiRXJyb3I6IGx2bUNyZWF0ZSByZXR1cm5lZCB3aXRoICVkXG4iLCBlcnJDb2RlKTsKKyAgICByZXR1cm4gZXJyQ29kZTsKKyAgfQorCisgIGVyckNvZGUgPSBsdm1Db250cm9sKCZjb250ZXh0LCBwbHZtQ29uZmlnUGFyYW1zLCAmcGFyYW1zKTsKKyAgaWYgKGVyckNvZGUpIHsKKyAgICBBTE9HRSgiRXJyb3I6IGx2bUNvbnRyb2wgcmV0dXJuZWQgd2l0aCAlZFxuIiwgZXJyQ29kZSk7CisgICAgcmV0dXJuIGVyckNvZGU7CisgIH0KKworICBjb25zdCBpbnQgY2hhbm5lbENvdW50ID0gcGx2bUNvbmZpZ1BhcmFtcy0+bnJDaGFubmVsczsKKyAgY29uc3QgaW50IGZyYW1lTGVuZ3RoID0gcGx2bUNvbmZpZ1BhcmFtcy0+ZnJhbWVMZW5ndGg7CisgIGNvbnN0IGludCBmcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBzaXplb2YoZmxvYXQpOyAgLy8gcHJvY2Vzc2luZyBzaXplCisgIGNvbnN0IGludCBpb0NoYW5uZWxDb3VudCA9IHBsdm1Db25maWdQYXJhbXMtPmZDaGFubmVsczsKKyAgY29uc3QgaW50IGlvRnJhbWVTaXplID0gaW9DaGFubmVsQ291bnQgKiBzaXplb2Yoc2hvcnQpOyAvLyBmaWxlIGxvYWQgc2l6ZQorICBjb25zdCBpbnQgbWF4Q2hhbm5lbENvdW50ID0gc3RkOjptYXgoY2hhbm5lbENvdW50LCBpb0NoYW5uZWxDb3VudCk7CisgIC8qCisgICAqIE1vbm8gaW5wdXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gMiBjaGFubmVscyBpbnRlcm5hbGx5IGluIHRoZSBwcm9jZXNzIGNhbGwKKyAgICogYnkgY29weWluZyB0aGUgc2FtZSBkYXRhIGludG8gdGhlIHNlY29uZCBjaGFubmVsLgorICAgKiBIZW5jZSB3aGVuIGNoYW5uZWxDb3VudCBpcyAxLCBvdXRwdXQgYnVmZmVyIHNob3VsZCBiZSBhbGxvY2F0ZWQgZm9yCisgICAqIDIgY2hhbm5lbHMuIFRoZSBtZW1BbGxvY0NoQ291bnQgdGFrZXMgY2FyZSBvZiBhbGxvY2F0aW9uIG9mIHN1ZmZpY2llbnQKKyAgICogbWVtb3J5IGZvciB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICovCisgIGNvbnN0IGludCBtZW1BbGxvY0NoQ291bnQgPSAoY2hhbm5lbENvdW50ID09IDEgPyAyIDogY2hhbm5lbENvdW50KTsKKworICBzdGQ6OnZlY3RvcjxzaG9ydD4gaW4oZnJhbWVMZW5ndGggKiBtYXhDaGFubmVsQ291bnQpOworICBzdGQ6OnZlY3RvcjxzaG9ydD4gb3V0KGZyYW1lTGVuZ3RoICogbWF4Q2hhbm5lbENvdW50KTsKKyAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGZsb2F0SW4oZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQpOworICBzdGQ6OnZlY3RvcjxmbG9hdD4gZmxvYXRPdXQoZnJhbWVMZW5ndGggKiBtZW1BbGxvY0NoQ291bnQpOworCisgIGludCBmcmFtZUNvdW50ZXIgPSAwOworICB3aGlsZSAoZnJlYWQoaW4uZGF0YSgpLCBpb0ZyYW1lU2l6ZSwgZnJhbWVMZW5ndGgsIGZpbnApID09IChzaXplX3QpZnJhbWVMZW5ndGgpIHsKKyAgICBpZiAoaW9DaGFubmVsQ291bnQgIT0gY2hhbm5lbENvdW50KSB7CisgICAgICAgIGFkanVzdF9jaGFubmVscyhpbi5kYXRhKCksIGlvQ2hhbm5lbENvdW50LCBpbi5kYXRhKCksIGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgIHNpemVvZihzaG9ydCksIGZyYW1lTGVuZ3RoICogaW9GcmFtZVNpemUpOworICAgIH0KKyAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMTYoZmxvYXRJbi5kYXRhKCksIGluLmRhdGEoKSwgZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQpOworCisgICAgLy8gTW9ubyBtb2RlIHdpbGwgcmVwbGljYXRlIHRoZSBmaXJzdCBjaGFubmVsIHRvIGFsbCBvdGhlciBjaGFubmVscy4KKyAgICAvLyBUaGlzIGVuc3VyZXMgYWxsIGF1ZGlvIGNoYW5uZWxzIGFyZSBpZGVudGljYWwuIFRoaXMgaXMgdXNlZnVsIGZvciB0ZXN0aW5nCisgICAgLy8gQmFzcyBCb29zdCwgd2hpY2ggZXh0cmFjdHMgYSBtb25vIHNpZ25hbCBmb3IgcHJvY2Vzc2luZy4KKyAgICBpZiAocGx2bUNvbmZpZ1BhcmFtcy0+bW9ub01vZGUgJiYgY2hhbm5lbENvdW50ID4gMSkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lTGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGF1dG8gKmZwID0gJmZsb2F0SW5baSAqIGNoYW5uZWxDb3VudF07CisgICAgICAgICAgICBzdGQ6OmZpbGwoZnAgKyAxLCBmcCArIGNoYW5uZWxDb3VudCwgKmZwKTsgLy8gcmVwbGljYXRlIGNoIDAKKyAgICAgICAgfQorICAgIH0KKyNpZiAxCisgICAgZXJyQ29kZSA9IGx2bUV4ZWN1dGUoZmxvYXRJbi5kYXRhKCksIGZsb2F0T3V0LmRhdGEoKSwgJmNvbnRleHQsIHBsdm1Db25maWdQYXJhbXMpOworICAgIGlmIChlcnJDb2RlKSB7CisgICAgICBwcmludGYoIlxuRXJyb3I6IGx2bUV4ZWN1dGUgcmV0dXJuZWQgd2l0aCAlZFxuIiwgZXJyQ29kZSk7CisgICAgICByZXR1cm4gZXJyQ29kZTsKKyAgICB9CisKKyAgICAodm9pZClmcmFtZVNpemU7IC8vIGVsaW1pbmF0ZSB3YXJuaW5nCisjZWxzZQorICAgIG1lbWNweShmbG9hdE91dC5kYXRhKCksIGZsb2F0SW4uZGF0YSgpLCBmcmFtZUxlbmd0aCAqIGZyYW1lU2l6ZSk7CisjZW5kaWYKKyAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQob3V0LmRhdGEoKSwgZmxvYXRPdXQuZGF0YSgpLCBmcmFtZUxlbmd0aCAqIGNoYW5uZWxDb3VudCk7CisgICAgaWYgKGlvQ2hhbm5lbENvdW50ICE9IGNoYW5uZWxDb3VudCkgeworICAgICAgICBhZGp1c3RfY2hhbm5lbHMob3V0LmRhdGEoKSwgY2hhbm5lbENvdW50LCBvdXQuZGF0YSgpLCBpb0NoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgIHNpemVvZihzaG9ydCksIGZyYW1lTGVuZ3RoICogY2hhbm5lbENvdW50ICogc2l6ZW9mKHNob3J0KSk7CisgICAgfQorICAgICh2b2lkKSBmd3JpdGUob3V0LmRhdGEoKSwgaW9GcmFtZVNpemUsIGZyYW1lTGVuZ3RoLCBmb3V0KTsKKyAgICBmcmFtZUNvdW50ZXIgKz0gZnJhbWVMZW5ndGg7CisgIH0KKyAgcHJpbnRmKCJmcmFtZUNvdW50ZXI6IFslZF1cbiIsIGZyYW1lQ291bnRlcik7CisgIHJldHVybiAwOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKSB7CisgIGlmIChhcmdjID09IDEpIHsKKyAgICBwcmludFVzYWdlKCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgbHZtQ29uZmlnUGFyYW1zX3QgbHZtQ29uZmlnUGFyYW1ze307IC8vIGRlZmF1bHQgaW5pdGlhbGl6ZQorICBGSUxFICpmaW5wID0gbnVsbHB0ciwgKmZvdXQgPSBudWxscHRyOworCisgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgcHJpbnRmKCIlcyAiLCBhcmd2W2ldKTsKKyAgICBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1pOiIsIDMpKSB7CisgICAgICBmaW5wID0gZm9wZW4oYXJndltpXSArIDMsICJyYiIpOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1vOiIsIDMpKSB7CisgICAgICBmb3V0ID0gZm9wZW4oYXJndltpXSArIDMsICJ3YiIpOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1mczoiLCA0KSkgeworICAgICAgY29uc3QgaW50IHNhbXBsaW5nRnJlcSA9IGF0b2koYXJndltpXSArIDQpOworICAgICAgaWYgKHNhbXBsaW5nRnJlcSAhPSA4MDAwICYmIHNhbXBsaW5nRnJlcSAhPSAxMTAyNSAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSAxMjAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gMTYwMDAgJiYKKyAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gMjIwNTAgJiYgc2FtcGxpbmdGcmVxICE9IDI0MDAwICYmCisgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDMyMDAwICYmIHNhbXBsaW5nRnJlcSAhPSA0NDEwMCAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSA0ODAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gODgyMDAgJiYKKyAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gOTYwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDE3NjQwMCAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSAxOTIwMDApIHsKKyAgICAgICAgQUxPR0UoIlxuRXJyb3I6IFVuc3VwcG9ydGVkIFNhbXBsaW5nIEZyZXF1ZW5jeSA6ICVkXG4iLCBzYW1wbGluZ0ZyZXEpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBsdm1Db25maWdQYXJhbXMuc2FtcGxpbmdGcmVxID0gc2FtcGxpbmdGcmVxOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1jaDoiLCA0KSkgeworICAgICAgY29uc3QgaW50IG5yQ2hhbm5lbHMgPSBhdG9pKGFyZ3ZbaV0gKyA0KTsKKyAgICAgIGlmIChuckNoYW5uZWxzID4gOCB8fCBuckNoYW5uZWxzIDwgMSkgeworICAgICAgICBBTE9HRSgiXG5FcnJvcjogVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGNoYW5uZWxzIDogJWRcbiIsIG5yQ2hhbm5lbHMpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBsdm1Db25maWdQYXJhbXMubnJDaGFubmVscyA9IG5yQ2hhbm5lbHM7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWZjaDoiLCA1KSkgeworICAgICAgY29uc3QgaW50IGZDaGFubmVscyA9IGF0b2koYXJndltpXSArIDUpOworICAgICAgaWYgKGZDaGFubmVscyA+IDggfHwgZkNoYW5uZWxzIDwgMSkgeworICAgICAgICAgICAgIEFMT0dFKCJcbkVycm9yOiBVbnN1cHBvcnRlZCBudW1iZXIgb2YgZmlsZSBjaGFubmVscyA6ICVkXG4iLCBmQ2hhbm5lbHMpOworICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBsdm1Db25maWdQYXJhbXMuZkNoYW5uZWxzID0gZkNoYW5uZWxzOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCItTSIpKSB7CisgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zLm1vbm9Nb2RlID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItYmFzc2x2bDoiLCA5KSkgeworICAgICAgY29uc3QgaW50IGJhc3NFZmZlY3RMZXZlbCA9IGF0b2koYXJndltpXSArIDkpOworICAgICAgaWYgKGJhc3NFZmZlY3RMZXZlbCA+IDE1IHx8IGJhc3NFZmZlY3RMZXZlbCA8IDApIHsKKyAgICAgICAgQUxPR0UoIlxuRXJyb3I6IFVuc3VwcG9ydGVkIEJhc3MgRWZmZWN0IExldmVsIDogJWRcbiIsCisgICAgICAgICAgICAgICBiYXNzRWZmZWN0TGV2ZWwpOworICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGx2bUNvbmZpZ1BhcmFtcy5iYXNzRWZmZWN0TGV2ZWwgPSBiYXNzRWZmZWN0TGV2ZWw7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWVxUHJlc2V0OiIsIDEwKSkgeworICAgICAgY29uc3QgaW50IGVxUHJlc2V0TGV2ZWwgPSBhdG9pKGFyZ3ZbaV0gKyAxMCk7CisgICAgICBpZiAoZXFQcmVzZXRMZXZlbCA+IDkgfHwgZXFQcmVzZXRMZXZlbCA8IDApIHsKKyAgICAgICAgQUxPR0UoIlxuRXJyb3I6IFVuc3VwcG9ydGVkIEVxdWFsaXplciBQcmVzZXQgOiAlZFxuIiwgZXFQcmVzZXRMZXZlbCk7CisgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgbHZtQ29uZmlnUGFyYW1zLmVxUHJlc2V0TGV2ZWwgPSBlcVByZXNldExldmVsOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWJFIikpIHsKKyAgICAgIGx2bUNvbmZpZ1BhcmFtcy5iYXNzRW5hYmxlID0gTFZNX0JFX09OOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWVxRSIpKSB7CisgICAgICBsdm1Db25maWdQYXJhbXMuZXFFbmFibGUgPSBMVk1fRVFOQl9PTjsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi10RSIpKSB7CisgICAgICBsdm1Db25maWdQYXJhbXMudHJlYmxlRW5hYmxlID0gTFZNX1RFX09OOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWNzRSIpKSB7CisgICAgICBsdm1Db25maWdQYXJhbXMuY3NFbmFibGUgPSBMVk1fTU9ERV9PTjsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1oIikpIHsKKyAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIGlmIChmaW5wID09IG51bGxwdHIgfHwgZm91dCA9PSBudWxscHRyKSB7CisgICAgQUxPR0UoIlxuRXJyb3I6IG1pc3NpbmcgaW5wdXQvb3V0cHV0IGZpbGVzXG4iKTsKKyAgICBwcmludFVzYWdlKCk7CisgICAgLy8gb2sgbm90IHRvIGNsb3NlLgorICAgIHJldHVybiAtMTsKKyAgfQorCisgIGNvbnN0IGludCBlcnJDb2RlID0gbHZtTWFpblByb2Nlc3MoJmx2bUNvbmZpZ1BhcmFtcywgZmlucCwgZm91dCk7CisgIGZjbG9zZShmaW5wKTsKKyAgZmNsb3NlKGZvdXQpOworCisgIGlmIChlcnJDb2RlKSB7CisgICAgQUxPR0UoIkVycm9yOiBsdm1NYWluUHJvY2VzcyByZXR1cm5zIHdpdGggdGhlIGVycm9yOiAlZCBcbiIsIGVyckNvZGUpOworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5icAppbmRleCAxMGZkOTcwLi4xNmZhMTI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLmJwCkBAIC0xOCw2ICsxOCw3IEBACiAgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKICAgICAgICAgIi1EQlVJTERfRkxPQVQiLAogICAgICAgICAiLURISUdIRVJfRlMiLAorICAgICAgICAiLURTVVBQT1JUX01DIiwKIAogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdlcnJvciIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcAppbmRleCA1M2QyNjZhLi4wYzZmOGRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKQEAgLTQzNSw3ICs0MzUsNyBAQAogICAgICAgICAgICAgKHBTZXNzaW9uQ29udGV4dC0+YkVxdWFsaXplckluc3RhbnRpYXRlZCA9PUxWTV9GQUxTRSkgJiYKICAgICAgICAgICAgIChwU2Vzc2lvbkNvbnRleHQtPmJWaXJ0dWFsaXplckluc3RhbnRpYXRlZD09TFZNX0ZBTFNFKSkKICAgICB7Ci0gICAgICAgICNpZmRlZiBMVk1fUENNCisjaWZkZWYgTFZNX1BDTQogICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIgIT0gTlVMTCkgewogICAgICAgICAgICAgZmNsb3NlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbUluUHRyKTsKICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbUluUHRyID0gTlVMTDsKQEAgLTQ0NCw3ICs0NDQsNyBAQAogICAgICAgICAgICAgZmNsb3NlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbU91dFB0cik7CiAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21PdXRQdHIgPSBOVUxMOwogICAgICAgICB9Ci0gICAgICAgICNlbmRpZgorI2VuZGlmCiAKIAogICAgICAgICAvLyBDbGVhciB0aGUgU2Vzc2lvbkluZGV4CkBAIC03NTEsMTkgKzc1MSwyMSBAQAogCiAgICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7ICAgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAgICAgZWZmZWN0X2J1ZmZlcl90ICAgICAgICAgKnBPdXRUbXA7CisgICAgY29uc3QgTFZNX0lOVDMyIE5yQ2hhbm5lbHMgPQorICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyk7CiAjaWZuZGVmIE5BVElWRV9GTE9BVF9CVUZGRVIKICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyID09IG51bGxwdHIgfHwKICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZyYW1lQ291bnQgPCBmcmFtZUNvdW50KSB7CiAgICAgICAgIGZyZWUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyKTsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyID0KLSAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopY2FsbG9jKGZyYW1lQ291bnQsIHNpemVvZihMVk1fRkxPQVQpICogRkNDXzIpOworICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKiljYWxsb2MoZnJhbWVDb3VudCwgc2l6ZW9mKExWTV9GTE9BVCkgKiBOckNoYW5uZWxzKTsKICAgICB9CiAKICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlciA9PSBudWxscHRyIHx8CiAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5mcmFtZUNvdW50IDwgZnJhbWVDb3VudCkgewogICAgICAgICBmcmVlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIpOwogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyID0KLSAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopY2FsbG9jKGZyYW1lQ291bnQsIHNpemVvZihMVk1fRkxPQVQpICogRkNDXzIpOworICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKiljYWxsb2MoZnJhbWVDb3VudCwgc2l6ZW9mKExWTV9GTE9BVCkgKiBOckNoYW5uZWxzKTsKICAgICB9CiAKICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyID09IG51bGxwdHIgfHwKQEAgLTc4NCw3ICs3ODYsNyBAQAogICAgICAgICAgICAgICAgIGZyZWUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlcik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyID0KLSAgICAgICAgICAgICAgICAgICAgKGVmZmVjdF9idWZmZXJfdCAqKWNhbGxvYyhmcmFtZUNvdW50LCBzaXplb2YoZWZmZWN0X2J1ZmZlcl90KSAqIEZDQ18yKTsKKyAgICAgICAgICAgICAgICAgICAgKGVmZmVjdF9idWZmZXJfdCAqKWNhbGxvYyhmcmFtZUNvdW50LCBzaXplb2YoZWZmZWN0X2J1ZmZlcl90KSAqIE5yQ2hhbm5lbHMpOwogICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwogICAgICAgICAgICAgfQpAQCAtNzk4LDEzICs4MDAsMTUgQEAKIAogI2lmZGVmIExWTV9QQ00KICAgICBmd3JpdGUocEluLAotICAgICAgICAgICAgZnJhbWVDb3VudCpzaXplb2YoZWZmZWN0X2J1ZmZlcl90KSAqIEZDQ18yLCAxLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21JblB0cik7CisgICAgICAgICAgIGZyYW1lQ291bnQgKiBzaXplb2YoZWZmZWN0X2J1ZmZlcl90KSAqIE5yQ2hhbm5lbHMsCisgICAgICAgICAgIDEsCisgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbUluUHRyKTsKICAgICBmZmx1c2gocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIpOwogI2VuZGlmCiAKICNpZm5kZWYgTkFUSVZFX0ZMT0FUX0JVRkZFUgogICAgIC8qIENvbnZlcnRpbmcgaW5wdXQgZGF0YSBmcm9tIGZpeGVkIHBvaW50IHRvIGZsb2F0IHBvaW50ICovCi0gICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KHBJbnB1dEJ1ZmYsIHBJbiwgZnJhbWVDb3VudCAqIEZDQ18yKTsKKyAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMTYocElucHV0QnVmZiwgcEluLCBmcmFtZUNvdW50ICogTnJDaGFubmVscyk7CiAKICAgICAvKiBQcm9jZXNzIHRoZSBzYW1wbGVzICovCiAgICAgTHZtU3RhdHVzID0gTFZNX1Byb2Nlc3MocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KQEAgLTgxNCw3ICs4MTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXVkaW8gVGltZSAqLwogCiAgICAgLyogQ29udmVydGluZyBvdXRwdXQgZGF0YSBmcm9tIGZsb2F0IHBvaW50IHRvIGZpeGVkIHBvaW50ICovCi0gICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KHBPdXRUbXAsIHBPdXRwdXRCdWZmLCBmcmFtZUNvdW50ICogRkNDXzIpOworICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdChwT3V0VG1wLCBwT3V0cHV0QnVmZiwgZnJhbWVDb3VudCAqIE5yQ2hhbm5lbHMpOwogCiAjZWxzZQogICAgIC8qIFByb2Nlc3MgdGhlIHNhbXBsZXMgKi8KQEAgLTgyOSwxMiArODMzLDE0IEBACiAKICNpZmRlZiBMVk1fUENNCiAgICAgZndyaXRlKHBPdXRUbXAsCi0gICAgICAgICAgICBmcmFtZUNvdW50KnNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogRkNDXzIsIDEsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbU91dFB0cik7CisgICAgICAgICAgIGZyYW1lQ291bnQgKiBzaXplb2YoZWZmZWN0X2J1ZmZlcl90KSAqIE5yQ2hhbm5lbHMsCisgICAgICAgICAgIDEsCisgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbU91dFB0cik7CiAgICAgZmZsdXNoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbU91dFB0cik7CiAjZW5kaWYKIAogICAgIGlmIChwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQgKiBGQ0NfMjsgaSsrKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudCAqIE5yQ2hhbm5lbHM7IGkrKykgewogI2lmbmRlZiBOQVRJVkVfRkxPQVRfQlVGRkVSCiAgICAgICAgICAgICBwT3V0W2ldID0gY2xhbXAxNigoTFZNX0lOVDMyKXBPdXRbaV0gKyAoTFZNX0lOVDMyKXBPdXRUbXBbaV0pOwogI2Vsc2UKQEAgLTEyMzIsNDUgKzEyMzgsNTggQEAKICAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlID09IHBDb25maWctPm91dHB1dENmZy5zYW1wbGluZ1JhdGUpOwogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyA9PSBwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMpOwogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgPT0gcENvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCk7CisjaWZkZWYgU1VQUE9SVF9NQworICAgIENIRUNLX0FSRyhhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpIDw9IExWTV9NQVhfQ0hBTk5FTFMpOworI2Vsc2UKICAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKTsKKyNlbmRpZgogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURQogICAgICAgICAgICAgICB8fCBwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKTsKICAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID09IEVGRkVDVF9CVUZGRVJfRk9STUFUKTsKICAgICBwQ29udGV4dC0+Y29uZmlnID0gKnBDb25maWc7CisgICAgY29uc3QgTFZNX0lOVDE2IE5yQ2hhbm5lbHMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpOwogCiAgICAgc3dpdGNoIChwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUpIHsKICAgICBjYXNlIDgwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfODAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDgwMDAqMjsgLy8gMiBzZWNzIFN0ZXJlbworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gODAwMCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMTYwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTYwMDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAxNjAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAxNjAwMCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMjIwNTA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMjIwNTA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAyMjA1MCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAyMjA1MCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMzIwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMzIwMDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAzMjAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAzMjAwMCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgNDQxMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfNDQxMDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA0NDEwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA0NDEwMCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgNDgwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfNDgwMDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA0ODAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA0ODAwMCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwogI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQorICAgIGNhc2UgODgyMDA6CisgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfODgyMDA7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA4ODIwMCAqIE5yQ2hhbm5lbHM7CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgOTYwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfOTYwMDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA5NjAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA5NjAwMCAqIE5yQ2hhbm5lbHM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTc2NDAwOgorICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzE3NjQwMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDE3NjQwMCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMTkyMDAwOgogICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzE5MjAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDE5MjAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAxOTIwMDAgKiBOckNoYW5uZWxzOwogICAgICAgICBicmVhazsKICNlbmRpZgogICAgIGRlZmF1bHQ6CkBAIC0xMjk0LDYgKzEzMTMsMTAgQEAKIAogICAgICAgICBBY3RpdmVQYXJhbXMuU2FtcGxlUmF0ZSA9IFNhbXBsZVJhdGU7CiAKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgIEFjdGl2ZVBhcmFtcy5OckNoYW5uZWxzID0gTnJDaGFubmVsczsKKyNlbmRpZgorCiAgICAgICAgIEx2bVN0YXR1cyA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogCiAgICAgICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiRWZmZWN0X3NldENvbmZpZyIpCkBAIC0xNDk4LDYgKzE1MjEsNyBAQAogICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkU6CiAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVM6CiAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9IRUFEU0VUOgorICAgIC8vIGNhc2UgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFOiAgLy8gRm9yIFVTQiB0ZXN0aW5nIG9mIHRoZSB2aXJ0dWFsaXplciBvbmx5LgogICAgICAgICByZXR1cm4gMDsKICAgICBkZWZhdWx0IDoKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CkBAIC0xNTIwLDEwICsxNTQ0LDkgQEAKIGludCBWaXJ0dWFsaXplcklzQ29uZmlndXJhdGlvblN1cHBvcnRlZChhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUpIHsKICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOwotICAgIGlmICgoY2hhbm5lbENvdW50ID09IDApIHx8IChjaGFubmVsQ291bnQgPiAyKSkgeworICAgIGlmIChjaGFubmVsQ291bnQgPCAxIHx8IGNoYW5uZWxDb3VudCA+IEZDQ18yKSB7IC8vIFRPRE86IHVwZGF0ZSB0byA4IGNoYW5uZWxzIHdoZW4gc3VwcG9ydGVkLgogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9Ci0KICAgICByZXR1cm4gVmlydHVhbGl6ZXJJc0RldmljZVN1cHBvcnRlZChkZXZpY2VUeXBlKTsKIH0KIApAQCAtMzIxNiw2ICszMjM5LDcgQEAKICAgICBFZmZlY3RDb250ZXh0ICogcENvbnRleHQgPSAoRWZmZWN0Q29udGV4dCAqKSBzZWxmOwogICAgIGludCAgICBzdGF0dXMgPSAwOwogICAgIGludCAgICBwcm9jZXNzU3RhdHVzID0gMDsKKyAgICBjb25zdCBpbnQgTnJDaGFubmVscyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzKTsKIAogLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzcyBTdGFydCA6IEVuYWJsZWQgPSAlZCAgICAgQ2FsbGVkID0gJWQgKCU4ZCAlOGQgJThkKSIsCiAvL3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkLHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQsCkBAIC0zMjQ2LDcgKzMyNzAsNyBAQAogICAgICAgICAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpKXsKICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzcygpIExWTV9CQVNTX0JPT1NUIEVmZmVjdCBpcyBub3QgZW5hYmxlZCIpOwogICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiA+IDApewotICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIgLT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogMjsgLy8gU1RFUkVPCisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiAtPSBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiBOckNoYW5uZWxzOwogICAgICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzczogV2FpdGluZyB0byB0dXJuIG9mZiBCQVNTX0JPT1NULCAlZCBzYW1wbGVzIGxlZnQiLAogICAgICAgICAgICAgLy8gICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIpOwogICAgICAgICB9CkBAIC0zMjY2LDcgKzMyOTAsNyBAQAogICAgICAgICAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0VRVUFMSVpFUikpewogICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzKCkgTFZNX0VRVUFMSVpFUiBFZmZlY3QgaXMgbm90IGVuYWJsZWQiKTsKICAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgPiAwKXsKLSAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEVxIC09IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIDI7IC8vIFNURVJFTworICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgLT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogTnJDaGFubmVsczsKICAgICAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3M6IFdhaXRpbmcgdG8gdHVybiBvZmYgRVFVQUxJWkVSLCAlZCBzYW1wbGVzIGxlZnQiLAogICAgICAgICAgICAgLy8gICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEpOwogICAgICAgICB9CkBAIC0zMjgwLDcgKzMzMDQsOCBAQAogICAgICAgICAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKSl7CiAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3MoKSBMVk1fVklSVFVBTElaRVIgRWZmZWN0IGlzIG5vdCBlbmFibGVkIik7CiAgICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgPiAwKXsKLSAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgLT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogMjsvLyBTVEVSRU8KKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgLT0KKyAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiBOckNoYW5uZWxzOwogICAgICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzczogV2FpdGluZyBmb3IgdG8gdHVybiBvZmYgVklSVFVBTElaRVIsICVkIHNhbXBsZXMgbGVmdCIsCiAgICAgICAgICAgICAvLyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0KTsKICAgICAgICAgfQpAQCAtMzMzMSw3ICszMzU2LDcgQEAKICAgICAgICAgLy9wQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkLCBwQ29udGV4dC0+RWZmZWN0VHlwZSk7CiAKICAgICAgICAgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiBGQ0NfMjsgKytpKXsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogTnJDaGFubmVsczsgKytpKSB7CiAjaWZkZWYgTkFUSVZFX0ZMT0FUX0JVRkZFUgogICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZjMyW2ldICs9IGluQnVmZmVyLT5mMzJbaV07CiAjZWxzZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKaW5kZXggZDU1ODE2OS4uNjAyZjYwNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwCkBAIC02NzUsOSArNjc1LDE1IEBACiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfNDgwMDA7CiAgICAgICAgIGJyZWFrOwogI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQorICAgIGNhc2UgODgyMDA6CisgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfODgyMDA7CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgOTYwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfOTYwMDA7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTc2NDAwOgorICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzE3NjQwMDsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAxOTIwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTkyMDAwOwogICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsKaW5kZXggNzA0MDlkZS4uMzVlMmYzZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsKQEAgLTksNiArOSw3IEBACiAKIExPQ0FMX0NGTEFHUys9IC1PMiAtZnZpc2liaWxpdHk9aGlkZGVuCiBMT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgorTE9DQUxfQ0ZMQUdTICs9IC1EQlVJTERfRkxPQVQgLURTVVBQT1JUX01DCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogCWxpYmN1dGlscyBcCkBAIC0xOSw3ICsyMCw4IEBACiBMT0NBTF9NT0RVTEU6PSBsaWJ2aXN1YWxpemVyCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAotCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKQorCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKSBcCisJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKQogCiAKIExPQ0FMX0hFQURFUl9MSUJSQVJJRVMgKz0gbGliaGFyZHdhcmVfaGVhZGVycwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwCmluZGV4IDgwN2YyNGQuLjAwYmMzNzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9FZmZlY3RWaXN1YWxpemVyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAKQEAgLTI0LDExICsyNCwyMyBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHRpbWUuaD4KIAorI2luY2x1ZGUgPGFsZ29yaXRobT4gLy8gbWF4CiAjaW5jbHVkZSA8bmV3PgogCiAjaW5jbHVkZSA8bG9nL2xvZy5oPgogCiAjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfdmlzdWFsaXplci5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKworI2lmZGVmIEJVSUxEX0ZMT0FUCisKK3N0YXRpYyBjb25zdGV4cHIgYXVkaW9fZm9ybWF0X3Qga1Byb2Nlc3NGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworCisjZWxzZQorCitzdGF0aWMgY29uc3RleHByIGF1ZGlvX2Zvcm1hdF90IGtQcm9jZXNzRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisKKyNlbmRpZiAvLyBCVUlMRF9GTE9BVAogCiBleHRlcm4gIkMiIHsKIApAQCAtMTQzLDEwICsxNTUsMTUgQEAKICAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlICE9IHBDb25maWctPm91dHB1dENmZy5zYW1wbGluZ1JhdGUpIHJldHVybiAtRUlOVkFMOwogICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyAhPSBwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMpIHJldHVybiAtRUlOVkFMOwogICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0gcENvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCkgcmV0dXJuIC1FSU5WQUw7Ci0gICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzICE9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykgcmV0dXJuIC1FSU5WQUw7CisgICAgY29uc3QgdWludDMyX3QgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgaWYgKGNoYW5uZWxDb3VudCA8IDEgfHwgY2hhbm5lbENvdW50ID4gRkNDXzgpIHJldHVybiAtRUlOVkFMOworI2Vsc2UKKyAgICBpZiAoY2hhbm5lbENvdW50ICE9IEZDQ18yKSByZXR1cm4gLUVJTlZBTDsKKyNlbmRpZgogICAgIGlmIChwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSAhPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURSAmJgogICAgICAgICAgICAgcENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgIT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgcmV0dXJuIC1FSU5WQUw7Ci0gICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBrUHJvY2Vzc0Zvcm1hdCkgcmV0dXJuIC1FSU5WQUw7CiAKICAgICBwQ29udGV4dC0+bUNvbmZpZyA9ICpwQ29uZmlnOwogCkBAIC0xOTIsNyArMjA5LDcgQEAKIHsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBrUHJvY2Vzc0Zvcm1hdDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwpAQCAtMjAwLDcgKzIxNyw3IEBACiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURTsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBrUHJvY2Vzc0Zvcm1hdDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwpAQCAtMzAxLDE1ICszMTgsOCBAQAogLy8tLS0gRWZmZWN0IENvbnRyb2wgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uCiAvLwogCi1zdGF0aWMgaW5saW5lIGludDE2X3QgY2xhbXAxNihpbnQzMl90IHNhbXBsZSkKLXsKLSAgICBpZiAoKHNhbXBsZT4+MTUpIF4gKHNhbXBsZT4+MzEpKQotICAgICAgICBzYW1wbGUgPSAweDdGRkYgXiAoc2FtcGxlPj4zMSk7Ci0gICAgcmV0dXJuIHNhbXBsZTsKLX0KLQogaW50IFZpc3VhbGl6ZXJfcHJvY2VzcygKLSAgICAgICAgZWZmZWN0X2hhbmRsZV90IHNlbGYsYXVkaW9fYnVmZmVyX3QgKmluQnVmZmVyLCBhdWRpb19idWZmZXJfdCAqb3V0QnVmZmVyKQorICAgICAgICBlZmZlY3RfaGFuZGxlX3Qgc2VsZiwgYXVkaW9fYnVmZmVyX3QgKmluQnVmZmVyLCBhdWRpb19idWZmZXJfdCAqb3V0QnVmZmVyKQogewogICAgIFZpc3VhbGl6ZXJDb250ZXh0ICogcENvbnRleHQgPSAoVmlzdWFsaXplckNvbnRleHQgKilzZWxmOwogCkBAIC0zMjQsNzEgKzMzNCwxMTggQEAKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCisgICAgY29uc3Qgc2l6ZV90IHNhbXBsZUxlbiA9IGluQnVmZmVyLT5mcmFtZUNvdW50ICogcENvbnRleHQtPm1DaGFubmVsQ291bnQ7CisKICAgICAvLyBwZXJmb3JtIG1lYXN1cmVtZW50cyBpZiBuZWVkZWQKICAgICBpZiAocENvbnRleHQtPm1NZWFzdXJlbWVudE1vZGUgJiBNRUFTVVJFTUVOVF9NT0RFX1BFQUtfUk1TKSB7CiAgICAgICAgIC8vIGZpbmQgdGhlIHBlYWsgYW5kIFJNUyBzcXVhcmVkIGZvciB0aGUgbmV3IGJ1ZmZlcgotICAgICAgICB1aW50MzJfdCBpbklkeDsKLSAgICAgICAgaW50MTZfdCBtYXhTYW1wbGUgPSAwOwogICAgICAgICBmbG9hdCBybXNTcUFjYyA9IDA7Ci0gICAgICAgIGZvciAoaW5JZHggPSAwIDsgaW5JZHggPCBpbkJ1ZmZlci0+ZnJhbWVDb3VudCAqIHBDb250ZXh0LT5tQ2hhbm5lbENvdW50IDsgaW5JZHgrKykgewotICAgICAgICAgICAgaWYgKGluQnVmZmVyLT5zMTZbaW5JZHhdID4gbWF4U2FtcGxlKSB7Ci0gICAgICAgICAgICAgICAgbWF4U2FtcGxlID0gaW5CdWZmZXItPnMxNltpbklkeF07Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKC1pbkJ1ZmZlci0+czE2W2luSWR4XSA+IG1heFNhbXBsZSkgewotICAgICAgICAgICAgICAgIG1heFNhbXBsZSA9IC1pbkJ1ZmZlci0+czE2W2luSWR4XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJtc1NxQWNjICs9IChpbkJ1ZmZlci0+czE2W2luSWR4XSAqIGluQnVmZmVyLT5zMTZbaW5JZHhdKTsKKworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIGZsb2F0IG1heFNhbXBsZSA9IDAuZjsKKyAgICAgICAgZm9yIChzaXplX3QgaW5JZHggPSAwOyBpbklkeCA8IHNhbXBsZUxlbjsgKytpbklkeCkgeworICAgICAgICAgICAgbWF4U2FtcGxlID0gZm1heChtYXhTYW1wbGUsIGZhYnMoaW5CdWZmZXItPmYzMltpbklkeF0pKTsKKyAgICAgICAgICAgIHJtc1NxQWNjICs9IGluQnVmZmVyLT5mMzJbaW5JZHhdICogaW5CdWZmZXItPmYzMltpbklkeF07CiAgICAgICAgIH0KKyAgICAgICAgbWF4U2FtcGxlICo9IDEgPDwgMTU7IC8vIHNjYWxlIHRvIGludDE2X3QsIHdpdGggZXhhY3RseSAxIDw8IDE1IHJlcHJlc2VudGluZyBwb3NpdGl2ZSBudW0uCisgICAgICAgIHJtc1NxQWNjICo9IDEgPDwgMzA7IC8vIHNjYWxlIHRvIGludDE2X3QgKiAyCisjZWxzZQorICAgICAgICBpbnQgbWF4U2FtcGxlID0gMDsKKyAgICAgICAgZm9yIChzaXplX3QgaW5JZHggPSAwOyBpbklkeCA8IHNhbXBsZUxlbjsgKytpbklkeCkgeworICAgICAgICAgICAgbWF4U2FtcGxlID0gc3RkOjptYXgobWF4U2FtcGxlLCBzdGQ6OmFicyhpbnQzMl90KGluQnVmZmVyLT5zMTZbaW5JZHhdKSkpOworICAgICAgICAgICAgcm1zU3FBY2MgKz0gaW5CdWZmZXItPnMxNltpbklkeF0gKiBpbkJ1ZmZlci0+czE2W2luSWR4XTsKKyAgICAgICAgfQorI2VuZGlmCiAgICAgICAgIC8vIHN0b3JlIHRoZSBtZWFzdXJlbWVudAogICAgICAgICBwQ29udGV4dC0+bVBhc3RNZWFzdXJlbWVudHNbcENvbnRleHQtPm1NZWFzdXJlbWVudEJ1ZmZlcklkeF0ubVBlYWtVMTYgPSAodWludDE2X3QpbWF4U2FtcGxlOwogICAgICAgICBwQ29udGV4dC0+bVBhc3RNZWFzdXJlbWVudHNbcENvbnRleHQtPm1NZWFzdXJlbWVudEJ1ZmZlcklkeF0ubVJtc1NxdWFyZWQgPQotICAgICAgICAgICAgICAgIHJtc1NxQWNjIC8gKGluQnVmZmVyLT5mcmFtZUNvdW50ICogcENvbnRleHQtPm1DaGFubmVsQ291bnQpOworICAgICAgICAgICAgICAgIHJtc1NxQWNjIC8gc2FtcGxlTGVuOwogICAgICAgICBwQ29udGV4dC0+bVBhc3RNZWFzdXJlbWVudHNbcENvbnRleHQtPm1NZWFzdXJlbWVudEJ1ZmZlcklkeF0ubUlzVmFsaWQgPSB0cnVlOwogICAgICAgICBpZiAoKytwQ29udGV4dC0+bU1lYXN1cmVtZW50QnVmZmVySWR4ID49IHBDb250ZXh0LT5tTWVhc3VyZW1lbnRXaW5kb3dTaXplSW5CdWZmZXJzKSB7CiAgICAgICAgICAgICBwQ29udGV4dC0+bU1lYXN1cmVtZW50QnVmZmVySWR4ID0gMDsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIGFsbCBjb2RlIGJlbG93IGFzc3VtZXMgc3RlcmVvIDE2IGJpdCBQQ00gb3V0cHV0IGFuZCBpbnB1dAorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgZmxvYXQgZnNjYWxlOyAvLyBtdWx0aXBsaWNhdGl2ZSBzY2FsZQorI2Vsc2UKICAgICBpbnQzMl90IHNoaWZ0OworI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCiAKICAgICBpZiAocENvbnRleHQtPm1TY2FsaW5nTW9kZSA9PSBWSVNVQUxJWkVSX1NDQUxJTkdfTU9ERV9OT1JNQUxJWkVEKSB7CiAgICAgICAgIC8vIGRlcml2ZSBjYXB0dXJlIHNjYWxpbmcgZmFjdG9yIGZyb20gcGVhayB2YWx1ZSBpbiBjdXJyZW50IGJ1ZmZlcgogICAgICAgICAvLyB0aGlzIGdpdmVzIG1vcmUgaW50ZXJlc3RpbmcgY2FwdHVyZXMgZm9yIGRpc3BsYXkuCi0gICAgICAgIHNoaWZ0ID0gMzI7Ci0gICAgICAgIGludCBsZW4gPSBpbkJ1ZmZlci0+ZnJhbWVDb3VudCAqIDI7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIGZsb2F0IG1heFNhbXBsZSA9IDAuZjsKKyAgICAgICAgZm9yIChzaXplX3QgaW5JZHggPSAwOyBpbklkeCA8IHNhbXBsZUxlbjsgKSB7CisgICAgICAgICAgICAvLyB3ZSByZWNvbnN0cnVjdCB0aGUgYWN0dWFsIHN1bW1lZCB2YWx1ZSB0byBlbnN1cmUgcHJvcGVyIG5vcm1hbGl6YXRpb24KKyAgICAgICAgICAgIC8vIGZvciBtdWx0aWNoYW5uZWwgb3V0cHV0cyAoY2hhbm5lbHMgPiAyIG1heSBvZnRlbiBiZSAwKS4KKyAgICAgICAgICAgIGZsb2F0IHNtcCA9IDAuZjsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcENvbnRleHQtPm1DaGFubmVsQ291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIHNtcCArPSBpbkJ1ZmZlci0+ZjMyW2luSWR4KytdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF4U2FtcGxlID0gZm1heChtYXhTYW1wbGUsIGZhYnMoc21wKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1heFNhbXBsZSA+IDAuZikgeworICAgICAgICAgICAgZnNjYWxlID0gMTI3LmYgLyBtYXhTYW1wbGU7CisgICAgICAgICAgICBpbnQgZXhwOyAvLyB1bnVzZWQKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IHNpZ25pZmljYW5kID0gZnJleHAoZnNjYWxlLCAmZXhwKTsKKyAgICAgICAgICAgIGlmIChzaWduaWZpY2FuZCA9PSAwLjVmKSB7CisgICAgICAgICAgICAgICAgZnNjYWxlICo9IDI1NS5mIC8gMjU2LmY7IC8vIGF2b2lkIHJldHVybmluZyB1bmFsdGVyZWQgUENNIHNpZ25hbAorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gc2NhbGUgZG9lc24ndCBtYXR0ZXIsIHRoZSB2YWx1ZXMgYXJlIGFsbCAwLgorICAgICAgICAgICAgZnNjYWxlID0gMS5mOworICAgICAgICB9CisjZWxzZQorICAgICAgICBpbnQzMl90IG9yQWNjdW0gPSAwOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNhbXBsZUxlbjsgKytpKSB7CiAgICAgICAgICAgICBpbnQzMl90IHNtcCA9IGluQnVmZmVyLT5zMTZbaV07CiAgICAgICAgICAgICBpZiAoc21wIDwgMCkgc21wID0gLXNtcCAtIDE7IC8vIHRha2UgY2FyZSB0byBrZWVwIHRoZSBtYXggbmVnYXRpdmUgaW4gcmFuZ2UKLSAgICAgICAgICAgIGludDMyX3QgY2x6ID0gX19idWlsdGluX2NseihzbXApOwotICAgICAgICAgICAgaWYgKHNoaWZ0ID4gY2x6KSBzaGlmdCA9IGNsejsKKyAgICAgICAgICAgIG9yQWNjdW0gfD0gc21wOwogICAgICAgICB9CisKICAgICAgICAgLy8gQSBtYXhpbXVtIGFtcGxpdHVkZSBzaWduYWwgd2lsbCBoYXZlIDE3IGxlYWRpbmcgemVyb3MsIHdoaWNoIHdlIHdhbnQgdG8KICAgICAgICAgLy8gdHJhbnNsYXRlIHRvIGEgc2hpZnQgb2YgOCAoZm9yIGNvbnZlcnRpbmcgMTYgYml0IHRvIDggYml0KQotICAgICAgICBzaGlmdCA9IDI1IC0gc2hpZnQ7CisgICAgICAgIHNoaWZ0ID0gMjUgLSBfX2J1aWx0aW5fY2x6KG9yQWNjdW0pOworCiAgICAgICAgIC8vIE5ldmVyIHNjYWxlIGJ5IGxlc3MgdGhhbiA4IHRvIGF2b2lkIHJldHVybmluZyB1bmFsdGVyZWQgUENNIHNpZ25hbC4KICAgICAgICAgaWYgKHNoaWZ0IDwgMykgewogICAgICAgICAgICAgc2hpZnQgPSAzOwogICAgICAgICB9CiAgICAgICAgIC8vIGFkZCBvbmUgdG8gY29tYmluZSB0aGUgZGl2aXNpb24gYnkgMiBuZWVkZWQgYWZ0ZXIgc3VtbWluZyBsZWZ0IGFuZCByaWdodCBjaGFubmVscyBiZWxvdwogICAgICAgICBzaGlmdCsrOworI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCiAgICAgfSBlbHNlIHsKICAgICAgICAgYXNzZXJ0KHBDb250ZXh0LT5tU2NhbGluZ01vZGUgPT0gVklTVUFMSVpFUl9TQ0FMSU5HX01PREVfQVNfUExBWUVEKTsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICAvLyBOb3RlOiBpZiBjaGFubmVscyBhcmUgdW5jb3JyZWxhdGVkLCAxL3NxcnQoTikgY291bGQgYmUgdXNlZCBhdCB0aGUgcmlzayBvZiBjbGlwcGluZy4KKyAgICAgICAgZnNjYWxlID0gMS5mIC8gcENvbnRleHQtPm1DaGFubmVsQ291bnQ7ICAvLyBhY2NvdW50IGZvciBzdW1taW5nIGFsbCB0aGUgY2hhbm5lbHMgdG9nZXRoZXIuCisjZWxzZQogICAgICAgICBzaGlmdCA9IDk7CisjZW5kaWYgLy8gQlVJTERfRkxPQVQKICAgICB9CiAKICAgICB1aW50MzJfdCBjYXB0SWR4OwogICAgIHVpbnQzMl90IGluSWR4OwogICAgIHVpbnQ4X3QgKmJ1ZiA9IHBDb250ZXh0LT5tQ2FwdHVyZUJ1ZjsKICAgICBmb3IgKGluSWR4ID0gMCwgY2FwdElkeCA9IHBDb250ZXh0LT5tQ2FwdHVyZUlkeDsKLSAgICAgICAgIGluSWR4IDwgaW5CdWZmZXItPmZyYW1lQ291bnQ7Ci0gICAgICAgICBpbklkeCsrLCBjYXB0SWR4KyspIHsKLSAgICAgICAgaWYgKGNhcHRJZHggPj0gQ0FQVFVSRV9CVUZfU0laRSkgewotICAgICAgICAgICAgLy8gd3JhcCBhcm91bmQKLSAgICAgICAgICAgIGNhcHRJZHggPSAwOworICAgICAgICAgaW5JZHggPCBzYW1wbGVMZW47CisgICAgICAgICBjYXB0SWR4KyspIHsKKyAgICAgICAgaWYgKGNhcHRJZHggPj0gQ0FQVFVSRV9CVUZfU0laRSkgY2FwdElkeCA9IDA7IC8vIHdyYXAKKworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIGZsb2F0IHNtcCA9IDAuZjsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBDb250ZXh0LT5tQ2hhbm5lbENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHNtcCArPSBpbkJ1ZmZlci0+ZjMyW2luSWR4KytdOwogICAgICAgICB9Ci0gICAgICAgIGludDMyX3Qgc21wID0gaW5CdWZmZXItPnMxNlsyICogaW5JZHhdICsgaW5CdWZmZXItPnMxNlsyICogaW5JZHggKyAxXTsKLSAgICAgICAgc21wID0gc21wID4+IHNoaWZ0OworICAgICAgICBidWZbY2FwdElkeF0gPSBjbGFtcDhfZnJvbV9mbG9hdChzbXAgKiBmc2NhbGUpOworI2Vsc2UKKyAgICAgICAgY29uc3QgaW50MzJfdCBzbXAgPSAoaW5CdWZmZXItPnMxNltpbklkeF0gKyBpbkJ1ZmZlci0+czE2W2luSWR4ICsgMV0pID4+IHNoaWZ0OworICAgICAgICBpbklkeCArPSBGQ0NfMjsgIC8vIGludGVnZXIgc3VwcG9ydHMgc3RlcmVvIG9ubHkuCiAgICAgICAgIGJ1ZltjYXB0SWR4XSA9ICgodWludDhfdClzbXApXjB4ODA7CisjZW5kaWYgLy8gQlVJTERfRkxPQVQKICAgICB9CiAKICAgICAvLyBYWFggdGhlIGZvbGxvd2luZyB0d28gc2hvdWxkIHJlYWxseSBiZSBhdG9taWMsIHRob3VnaCBpdCBwcm9iYWJseSBkb2Vzbid0CkBAIC00MDAsNiArNDU3LDE1IEBACiAgICAgfQogCiAgICAgaWYgKGluQnVmZmVyLT5yYXcgIT0gb3V0QnVmZmVyLT5yYXcpIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBpZiAocENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzYW1wbGVMZW47ICsraSkgeworICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZjMyW2ldICs9IGluQnVmZmVyLT5mMzJbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1jcHkob3V0QnVmZmVyLT5yYXcsIGluQnVmZmVyLT5yYXcsIHNhbXBsZUxlbiAqIHNpemVvZihmbG9hdCkpOworICAgICAgICB9CisjZWxzZQogICAgICAgICBpZiAocENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgewogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRCdWZmZXItPmZyYW1lQ291bnQqMjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5zMTZbaV0gPSBjbGFtcDE2KG91dEJ1ZmZlci0+czE2W2ldICsgaW5CdWZmZXItPnMxNltpXSk7CkBAIC00MDcsNiArNDczLDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1lbWNweShvdXRCdWZmZXItPnJhdywgaW5CdWZmZXItPnJhdywgb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogMiAqIHNpemVvZihpbnQxNl90KSk7CiAgICAgICAgIH0KKyNlbmRpZiAvLyBCVUlMRF9GTE9BVAogICAgIH0KICAgICBpZiAocENvbnRleHQtPm1TdGF0ZSAhPSBWSVNVQUxJWkVSX1NUQVRFX0FDVElWRSkgewogICAgICAgICByZXR1cm4gLUVOT0RBVEE7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5jcHAgYi9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5jcHAKaW5kZXggMDFmMDE0Zi4uYTk3NzMwMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliaGVpZi9IZWlmRGVjb2RlckltcGwuY3BwCisrKyBiL21lZGlhL2xpYmhlaWYvSGVpZkRlY29kZXJJbXBsLmNwcApAQCAtODYsNyArODYsNyBAQAogICAgIHNwPElNZW1vcnk+IG1NZW1vcnk7CiAgICAgc3RkOjp1bmlxdWVfcHRyPEhlaWZTdHJlYW0+IG1TdHJlYW07CiAgICAgYm9vbCBtRU9TOwotICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90PiBtQ2FjaGU7CisgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gbUNhY2hlOwogICAgIG9mZjY0X3QgbUNhY2hlZE9mZnNldDsKICAgICBzaXplX3QgbUNhY2hlZFNpemU7CiAgICAgc2l6ZV90IG1DYWNoZUJ1ZmZlclNpemU7CkBAIC0xNjUsNyArMTY1LDcgQEAKICAgICAgICAgLy8gaXQncyByZWFjaGluZyBtYXggY2FjaGUgYnVmZmVyIHNpemUsIG5lZWQgdG8gcm9sbCB3aW5kb3csIGFuZCBwb3NzaWJseQogICAgICAgICAvLyBleHBhbmQgdGhlIGNhY2hlIGJ1ZmZlci4KICAgICAgICAgc2l6ZV90IG5ld0NhY2hlQnVmZmVyU2l6ZSA9IG1DYWNoZUJ1ZmZlclNpemU7Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90PiBuZXdDYWNoZTsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gbmV3Q2FjaGU7CiAgICAgICAgIHVpbnQ4X3QqIGRzdCA9IG1DYWNoZS5nZXQoKTsKICAgICAgICAgaWYgKG5ld0NhY2hlQnVmZmVyU2l6ZSA8IGtNYXhDYWNoZUJ1ZmZlclNpemUpIHsKICAgICAgICAgICAgIG5ld0NhY2hlQnVmZmVyU2l6ZSA9IGtNYXhDYWNoZUJ1ZmZlclNpemU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWlmL2luY2x1ZGUvSGVpZkRlY29kZXJBUEkuaCBiL21lZGlhL2xpYmhlaWYvaW5jbHVkZS9IZWlmRGVjb2RlckFQSS5oCmluZGV4IDUxODNjMzkuLmFhMTBmMzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmhlaWYvaW5jbHVkZS9IZWlmRGVjb2RlckFQSS5oCisrKyBiL21lZGlhL2xpYmhlaWYvaW5jbHVkZS9IZWlmRGVjb2RlckFQSS5oCkBAIC03NCw3ICs3NCw3IEBACiAgICAgaW50MzJfdCAgbVJvdGF0aW9uQW5nbGU7ICAgICAgICAgICAvLyBSb3RhdGlvbiBhbmdsZSwgY2xvY2t3aXNlLCBzaG91bGQgYmUgbXVsdGlwbGUgb2YgOTAKICAgICB1aW50MzJfdCBtQnl0ZXNQZXJQaXhlbDsgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyBmb3Igb25lIHBpeGVsCiAgICAgdWludDMyX3QgbUljY1NpemU7ICAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgaW4gbUljY0RhdGEKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdD4gbUljY0RhdGE7IC8vIEFjdHVhbCBJQ0MgZGF0YSwgbWVtb3J5IGlzIG93bmVkIGJ5IHRoaXMgc3RydWN0dXJlCisgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gbUljY0RhdGE7IC8vIEFjdHVhbCBJQ0MgZGF0YSwgbWVtb3J5IGlzIG93bmVkIGJ5IHRoaXMgc3RydWN0dXJlCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAKaW5kZXggMmEyZDFiYy4uN2Q3NTllMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwCkBAIC0yMSw3ICsyMSw3IEBACiAgICAgdm5kazogewogICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgIH0sCi0gICAgc3JjczogWyJBdWRpb1BhcmFtZXRlci5jcHAiLCAiVHlwZUNvbnZlcnRlci5jcHAiLCAiVGltZUNoZWNrLmNwcCJdLAorICAgIHNyY3M6IFsiQXVkaW9QYXJhbWV0ZXIuY3BwIiwgIlR5cGVDb252ZXJ0ZXIuY3BwIl0sCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLApAQCAtMzMsNiArMzMsOSBAQAogICAgICAgICAibGliYXVkaW9jbGllbnRfaGVhZGVycyIsCiAgICAgICAgICJsaWJhdWRpb19zeXN0ZW1faGVhZGVycyIsCiAgICAgXSwKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICBdLAogICAgIGNsYW5nOiB0cnVlLAogfQogCkBAIC0xMjIsNiArMTI1LDEwIEBACiAgICAgICAgICJsaWJzb25pdm94IiwKICAgICBdLAogCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKKyAgICBdLAorCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLApAQCAtMTQwLDcgKzE0Nyw3IEBACiBmaWxlZ3JvdXAgewogICAgIG5hbWU6ICJtZWRpYXVwZGF0ZXNlcnZpY2VfYWlkbCIsCiAgICAgc3JjczogWwotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhVXBkYXRlU2VydmljZS5haWRsIiwKICAgICBdLAogfQogCkBAIC0xODMsNiArMTkwLDggQEAKICAgICAgICAgIk1lZGlhUmVzb3VyY2VQb2xpY3kuY3BwIiwKICAgICAgICAgIlZpc3VhbGl6ZXIuY3BwIiwKICAgICAgICAgIlN0cmluZ0FycmF5LmNwcCIsCisgICAgICAgICJOZGtNZWRpYUZvcm1hdFByaXYuY3BwIiwKKyAgICAgICAgIk5ka01lZGlhRXJyb3JQcml2LmNwcCIsCiAgICAgXSwKIAogICAgIGFpZGw6IHsKQEAgLTE5MiwxMCArMjAxLDEyIEBACiAKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwpAQCAtMjUxLDE4ICsyNjIsMTMgQEAKICAgICB9LAogfQogCi1jY19saWJyYXJ5IHsKK2NjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlibWVkaWFfcGxheWVyMl91dGlsIiwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIkJ1ZmZlcmluZ1NldHRpbmdzLmNwcCIsCiAgICAgICAgICJEYXRhU291cmNlRGVzYy5jcHAiLAotICAgICAgICAiSURhdGFTb3VyY2UuY3BwIiwKLSAgICAgICAgIklNZWRpYUV4dHJhY3Rvci5jcHAiLAotICAgICAgICAiSU1lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAiLAotICAgICAgICAiSU1lZGlhU291cmNlLmNwcCIsCiAgICAgICAgICJNZWRpYUNvZGVjQnVmZmVyLmNwcCIsCi0gICAgICAgICJNZWRpYVV0aWxzLmNwcCIsCiAgICAgICAgICJNZXRhZGF0YS5jcHAiLAogICAgICAgICAiTmRrV3JhcHBlci5jcHAiLAogICAgIF0sCkBAIC0yNzQsNyArMjgwLDcgQEAKICAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKICAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJtZWRpYW5ka191dGlscyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnVpIiwKICAgICAgICAgImxpYnV0aWxzIiwKQEAgLTI4OSw2ICsyOTUsMTAgQEAKICAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKICAgICBdLAogCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL25kayIsCisgICAgXSwKKwogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9ydHNwIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3RpbWVkdGV4dCIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BdWRpb1BhcmFtZXRlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1BhcmFtZXRlci5jcHAKaW5kZXggMDM0ZjdjMi4uMWM5NWUyNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQXVkaW9QYXJhbWV0ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvUGFyYW1ldGVyLmNwcApAQCAtMzYsNiArMzYsOCBAQAogY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlId0F2U3luYyA9IEFVRElPX1BBUkFNRVRFUl9IV19BVl9TWU5DOwogY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlQcmVzZW50YXRpb25JZCA9IEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fUFJFU0VOVEFUSU9OX0lEOwogY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlQcm9ncmFtSWQgPSBBVURJT19QQVJBTUVURVJfU1RSRUFNX1BST0dSQU1fSUQ7Citjb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleUF1ZGlvTGFuZ3VhZ2VQcmVmZXJyZWQgPQorICAgICAgICBBVURJT19QQVJBTUVURVJfS0VZX0FVRElPX0xBTkdVQUdFX1BSRUZFUlJFRDsKIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5TW9ub091dHB1dCA9IEFVRElPX1BBUkFNRVRFUl9NT05PX09VVFBVVDsKIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtSHdBdlN5bmMgPSBBVURJT19QQVJBTUVURVJfU1RSRUFNX0hXX0FWX1NZTkM7CiBjb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbUNvbm5lY3QgPSBBVURJT19QQVJBTUVURVJfREVWSUNFX0NPTk5FQ1Q7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwCmluZGV4IGQ3NTMzY2EuLjI0M2IwOWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwCkBAIC0yMywxMyArMjMsMTMgQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogZW51bSB7CiAgICAgTUFLRV9FWFRSQUNUT1IgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAogICAgIE1BS0VfSURBVEFfU09VUkNFX0ZELAorICAgIEdFVF9TVVBQT1JURURfVFlQRVMsCiB9OwogCiBjbGFzcyBCcE1lZGlhRXh0cmFjdG9yU2VydmljZSA6IHB1YmxpYyBCcEludGVyZmFjZTxJTWVkaWFFeHRyYWN0b3JTZXJ2aWNlPgpAQCAtNjksNiArNjksMjQgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CisKKyAgICB2aXJ0dWFsIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gZ2V0U3VwcG9ydGVkVHlwZXMoKSB7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gc3VwcG9ydGVkVHlwZXM7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYUV4dHJhY3RvclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHN0YXR1c190IHJldCA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfU1VQUE9SVEVEX1RZUEVTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAvLyBwcm9jZXNzIHJlcGx5CisgICAgICAgICAgICB3aGlsZSh0cnVlKSB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXh0ID0gcmVwbHkucmVhZENTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWV4dCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3VwcG9ydGVkVHlwZXMuaW5zZXJ0KHN0ZDo6c3RyaW5nKGV4dCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBwb3J0ZWRUeXBlczsKKyAgICB9CiB9OwogCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLCAiYW5kcm9pZC5tZWRpYS5JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlIik7CkBAIC0xMTQsNiArMTMyLDE1IEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIEdFVF9TVVBQT1JURURfVFlQRVM6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IHN1cHBvcnRlZFR5cGVzID0gZ2V0U3VwcG9ydGVkVHlwZXMoKTsKKyAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IHN1cHBvcnRlZFR5cGVzLmJlZ2luKCk7IGl0ICE9IHN1cHBvcnRlZFR5cGVzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlQ1N0cmluZygoKml0KS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwCmluZGV4IGFjYTdhZDkuLmJkMThhNDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhQ29kZWNMaXN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUmVjb3JkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CiAjaW5jbHVkZSA8bWVkaWEvSVJlbW90ZURpc3BsYXkuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcAppbmRleCBiMmM5MWM0Li41NmVlMThlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwCkBAIC02NSw3ICs2NSw3IEBACiAgICAgR0VUX1JPVVRFRF9ERVZJQ0VfSUQsCiAgICAgRU5BQkxFX0FVRElPX0RFVklDRV9DQUxMQkFDSywKICAgICBHRVRfQUNUSVZFX01JQ1JPUEhPTkVTLAotCisgICAgR0VUX1BPUlRfSUQsCiB9OwogCiBjbGFzcyBCcE1lZGlhUmVjb3JkZXI6IHB1YmxpYyBCcEludGVyZmFjZTxJTWVkaWFSZWNvcmRlcj4KQEAgLTQwNyw2ICs0MDcsMjMgQEAKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKKyAgICBzdGF0dXNfdCBnZXRQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKQorICAgIHsKKyAgICAgICAgQUxPR1YoImdldFBvcnRJZCIpOworICAgICAgICBpZiAocG9ydElkID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUmVjb3JkZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfUE9SVF9JRCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSworICAgICAgICAgICAgICAgIHx8IChzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAqcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgKnBvcnRJZCA9IChhdWRpb19wb3J0X2hhbmRsZV90KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQogfTsKIAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKE1lZGlhUmVjb3JkZXIsICJhbmRyb2lkLm1lZGlhLklNZWRpYVJlY29yZGVyIik7CkBAIC02NjEsNiArNjc4LDE3IEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAKICAgICAgICAgfQorICAgICAgICBjYXNlIEdFVF9QT1JUX0lEOiB7CisgICAgICAgICAgICBBTE9HVigiR0VUX1BPUlRfSUQiKTsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFSZWNvcmRlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQ7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRQb3J0SWQoJnBvcnRJZCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHBvcnRJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVNvdXJjZS5jcHAKaW5kZXggZjE4NWZkNC4uZTdkYTQ4OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFTb3VyY2UuY3BwCkBAIC0xODYsNiArMTg2LDkgQEAKICAgICAgICAgcmV0ID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIEFMT0dWKCJyZWFkTXVsdGlwbGUgc3RhdHVzICVkLCBidWZmZXJDb3VudCAldSwgc2luY2VTdG9wICV1IiwKICAgICAgICAgICAgICAgICByZXQsIGJ1ZmZlckNvdW50LCBtQnVmZmVyc1NpbmNlU3RvcCk7CisgICAgICAgIGlmIChidWZmZXJDb3VudCAmJiByZXQgPT0gV09VTERfQkxPQ0spIHsKKyAgICAgICAgICAgIHJldCA9IE9LOworICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCmluZGV4IGUwZjVhNDAuLjA4YzZhNTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCkBAIC00OCw3ICs0OCw4IEBACiAgICAgeyJhbXJ3YiIsICBBVURJT19FTkNPREVSX0FNUl9XQn0sCiAgICAgeyJhYWMiLCAgICBBVURJT19FTkNPREVSX0FBQ30sCiAgICAgeyJoZWFhYyIsICBBVURJT19FTkNPREVSX0hFX0FBQ30sCi0gICAgeyJhYWNlbGQiLCBBVURJT19FTkNPREVSX0FBQ19FTER9CisgICAgeyJhYWNlbGQiLCBBVURJT19FTkNPREVSX0FBQ19FTER9LCAKKyAgICB7Im9wdXMiLCAgIEFVRElPX0VOQ09ERVJfT1BVU30KIH07CiAKIGNvbnN0IE1lZGlhUHJvZmlsZXM6Ok5hbWVUb1RhZ01hcCBNZWRpYVByb2ZpbGVzOjpzRmlsZUZvcm1hdE1hcFtdID0gewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9NaWRpSW9XcmFwcGVyLmNwcAppbmRleCA1Y2EzYjQ4Li5kOGVmOWNmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NaWRpSW9XcmFwcGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NaWRpSW9XcmFwcGVyLmNwcApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGZjbnRsLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9NaWRpSW9XcmFwcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KIAogc3RhdGljIGludCByZWFkQXQodm9pZCAqaGFuZGxlLCB2b2lkICpidWZmZXIsIGludCBwb3MsIGludCBzaXplKSB7CiAgICAgcmV0dXJuICgoYW5kcm9pZDo6TWlkaUlvV3JhcHBlciopaGFuZGxlKS0+cmVhZEF0KGJ1ZmZlciwgcG9zLCBzaXplKTsKQEAgLTQ5LDEwICs1MCw0NyBAQAogICAgIG1EYXRhU291cmNlID0gbnVsbHB0cjsKIH0KIAotTWlkaUlvV3JhcHBlcjo6TWlkaUlvV3JhcHBlcihEYXRhU291cmNlQmFzZSAqc291cmNlKSB7Ci0gICAgQUxPR1YoIk1pZGlJb1dyYXBwZXIoRGF0YVNvdXJjZSkiKTsKK2NsYXNzIERhdGFTb3VyY2VVbndyYXBwZXIgOiBwdWJsaWMgRGF0YVNvdXJjZUJhc2UgeworCitwdWJsaWM6CisgICAgZXhwbGljaXQgRGF0YVNvdXJjZVVud3JhcHBlcihDRGF0YVNvdXJjZSAqY3NvdXJjZSkgeworICAgICAgICBtU291cmNlID0gY3NvdXJjZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5EYXRhU291cmNlVW53cmFwcGVyKCkge30KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3QgeyByZXR1cm4gT0s7IH0KKworICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLCBvciAtMSBvbiBmYWlsdXJlLiBJdCdzIG5vdCBhbiBlcnJvciBpZgorICAgIC8vIHRoaXMgcmV0dXJucyB6ZXJvOyBpdCBqdXN0IG1lYW5zIHRoZSBnaXZlbiBvZmZzZXQgaXMgZXF1YWwgdG8sIG9yCisgICAgLy8gYmV5b25kLCB0aGUgZW5kIG9mIHRoZSBzb3VyY2UuCisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPnJlYWRBdChtU291cmNlLT5oYW5kbGUsIG9mZnNldCwgZGF0YSwgc2l6ZSk7CisgICAgfQorCisgICAgLy8gTWF5IHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSkgeworICAgICAgICByZXR1cm4gbVNvdXJjZS0+Z2V0U2l6ZShtU291cmNlLT5oYW5kbGUsIHNpemUpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBnZXRVcmkoY2hhciAqIC8qdXJpU3RyaW5nKi8sIHNpemVfdCAvKmJ1ZmZlclNpemUqLykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGNsb3NlKCkge307Citwcml2YXRlOgorICAgIENEYXRhU291cmNlICptU291cmNlOworfTsKKworTWlkaUlvV3JhcHBlcjo6TWlkaUlvV3JhcHBlcihDRGF0YVNvdXJjZSAqY3NvdXJjZSkgeworICAgIEFMT0dWKCJNaWRpSW9XcmFwcGVyKENEYXRhU291cmNlKSIpOwogICAgIG1GZCA9IC0xOwotICAgIG1EYXRhU291cmNlID0gc291cmNlOworICAgIG1CYXNlID0gMDsKKyAgICBtRGF0YVNvdXJjZSA9IG5ldyBEYXRhU291cmNlVW53cmFwcGVyKGNzb3VyY2UpOwogICAgIG9mZjY0X3QgbDsKICAgICBpZiAobURhdGFTb3VyY2UtPmdldFNpemUoJmwpID09IE9LKSB7CiAgICAgICAgIG1MZW5ndGggPSBsOwpAQCAtNjYsNiArMTA0LDcgQEAKICAgICBpZiAobUZkID49IDApIHsKICAgICAgICAgY2xvc2UobUZkKTsKICAgICB9CisgICAgZGVsZXRlIG1EYXRhU291cmNlOwogfQogCiBpbnQgTWlkaUlvV3JhcHBlcjo6cmVhZEF0KHZvaWQgKmJ1ZmZlciwgaW50IG9mZnNldCwgaW50IHNpemUpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL05ka01lZGlhRXJyb3JQcml2LmNwcCBiL21lZGlhL2xpYm1lZGlhL05ka01lZGlhRXJyb3JQcml2LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTNiOTE5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvTmRrTWVkaWFFcnJvclByaXYuY3BwCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCittZWRpYV9zdGF0dXNfdCB0cmFuc2xhdGVfZXJyb3Ioc3RhdHVzX3QgZXJyKSB7CisKKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgfSBlbHNlIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CisgICAgfSBlbHNlIGlmIChlcnIgPT0gRVJST1JfSU8pIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBFUlJPUl9NQUxGT1JNRUQpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CisgICAgfSBlbHNlIGlmIChlcnIgPT0gSU5WQUxJRF9PUEVSQVRJT04pIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBVTktOT1dOX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBBTE9HRSgic2YgZXJyb3IgY29kZTogJWQiLCBlcnIpOworICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKK30KKworc3RhdHVzX3QgcmV2ZXJzZV90cmFuc2xhdGVfZXJyb3IobWVkaWFfc3RhdHVzX3QgZXJyKSB7CisKKyAgICBpZiAoZXJyID09IEFNRURJQV9PSykgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIGlmIChlcnIgPT0gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgfSBlbHNlIGlmIChlcnIgPT0gQU1FRElBX0VSUk9SX0lPKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBBTUVESUFfRVJST1JfV09VTERfQkxPQ0spIHsKKyAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOworICAgIH0gZWxzZSBpZiAoZXJyID09IEFNRURJQV9FUlJPUl9NQUxGT1JNRUQpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBBTUVESUFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT04pIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0gZWxzZSBpZiAoZXJyID09IEFNRURJQV9FUlJPUl9VTktOT1dOKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIEFMT0dFKCJuZGsgZXJyb3IgY29kZTogJWQiLCBlcnIpOworICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2LmNwcCBiL21lZGlhL2xpYm1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E5ZmI4YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5jcHAKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTmRrTWVkaWFGb3JtYXQiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworI2luY2x1ZGUgPGpuaS5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBwcml2YXRlIGZ1bmN0aW9ucyBmb3IgY29udmVyc2lvbiB0by9mcm9tIEFNZXNzYWdlCitBTWVkaWFGb3JtYXQqIEFNZWRpYUZvcm1hdF9mcm9tTXNnKHNwPEFNZXNzYWdlPiAqZGF0YSkgeworICAgIEFMT0dWKCJwcml2YXRlIGN0b3IiKTsKKyAgICBBTWVkaWFGb3JtYXQqIG1EYXRhID0gbmV3IEFNZWRpYUZvcm1hdCgpOworICAgIG1EYXRhLT5tRm9ybWF0ID0gKmRhdGE7CisgICAgaWYgKG1EYXRhLT5tRm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coImdvdCBOVUxMIGZvcm1hdCIpOworICAgICAgICBtRGF0YS0+bUZvcm1hdCA9IG5ldyBBTWVzc2FnZTsKKyAgICB9CisgICAgcmV0dXJuIG1EYXRhOworfQorCit2b2lkIEFNZWRpYUZvcm1hdF9nZXRGb3JtYXQoY29uc3QgQU1lZGlhRm9ybWF0KiBtRGF0YSwgc3A8QU1lc3NhZ2U+ICpkZXN0KSB7CisgICAgKmRlc3QgPSBtRGF0YS0+bUZvcm1hdDsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL05ka1dyYXBwZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvTmRrV3JhcHBlci5jcHAKaW5kZXggMTE4NDA3ZS4uNmRiYzliOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTmRrV3JhcHBlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTmRrV3JhcHBlci5jcHAKQEAgLTI3LDIzICsyNywxMSBAQAogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgogCi0vLyBUZW1wb3JhcmlseSBrZWVwaW5nIEFNZWRpYUV4dHJhY3Rvcl9kaXNjb25uZWN0KCkgd2hlcmUgaXQgaXMgdXNlZC4KLS8vIFdpbGwgYmUgcmVtb3ZlZCBzb29uIGluIGZhdm9yIG9mIG9mZmljaWFsIHB1YmxpYyBBUElzLgotc3RydWN0IEFNZWRpYUV4dHJhY3RvciB7Ci0gICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6TnVNZWRpYUV4dHJhY3Rvcj4gbUltcGw7Ci0gICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6QUJ1ZmZlcj4gbVBzc2hCdWY7Ci19OwotCi1tZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JfZGlzY29ubmVjdChBTWVkaWFFeHRyYWN0b3IgKiBleCkgewotICAgIGV4LT5tSW1wbC0+ZGlzY29ubmVjdCgpOwotICAgIHJldHVybiBBTUVESUFfT0s7Ci19CisjaW5jbHVkZSAiTmRrTWVkaWFEYXRhU291cmNlQ2FsbGJhY2tzUHJpdi5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTY5LDYgKzU3LDEwIEBACiAgICAgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9TVEFOREFSRCwKICAgICBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1RSQU5TRkVSLAogICAgIEFNRURJQUZPUk1BVF9LRVlfQ09NUExFWElUWSwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19ERUZBVUxUX0lWX1NJWkUsCisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX0JZVEVfQkxPQ0ssCisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fTU9ERSwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19TS0lQX0JZVEVfQkxPQ0ssCiAgICAgQU1FRElBRk9STUFUX0tFWV9GTEFDX0NPTVBSRVNTSU9OX0xFVkVMLAogICAgIEFNRURJQUZPUk1BVF9LRVlfR1JJRF9DT0xVTU5TLAogICAgIEFNRURJQUZPUk1BVF9LRVlfR1JJRF9ST1dTLApAQCAtMTE0LDYgKzEwNiw4IEBACiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqQU1lZGlhRm9ybWF0S2V5R3JvdXBCdWZmZXJbXSA9IHsKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19JViwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksCiAgICAgQU1FRElBRk9STUFUX0tFWV9IRFJfU1RBVElDX0lORk8sCiAgICAgQU1FRElBRk9STUFUX0tFWV9TRUksCiAgICAgQU1FRElBRk9STUFUX0tFWV9NUEVHX1VTRVJfREFUQSwKQEAgLTEwODIsMTQgKzEwNzYsNiBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6ZGlzY29ubmVjdCgpIHsKLSAgICBpZiAobUFNZWRpYUV4dHJhY3RvciAhPSBOVUxMKSB7Ci0gICAgICAgIG1lZGlhX3N0YXR1c190IGVyciA9IEFNZWRpYUV4dHJhY3Rvcl9kaXNjb25uZWN0KG1BTWVkaWFFeHRyYWN0b3IpOwotICAgICAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKGVycik7Ci0gICAgfQotICAgIHJldHVybiBERUFEX09CSkVDVDsKLX0KLQogQU1lZGlhRXh0cmFjdG9yICpBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpnZXRBTWVkaWFFeHRyYWN0b3IoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1BTWVkaWFFeHRyYWN0b3I7CiB9CkBAIC0xMjYzLDQwICsxMjQ5LDI4IEBACiAgICAgaWYgKG1BTWVkaWFFeHRyYWN0b3IgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgcmV0dXJuIG5ldyBBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyKEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVDcnlwdG9JbmZvKG1BTWVkaWFFeHRyYWN0b3IpKTsKLX0KLQotc3NpemVfdCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcjo6QU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfZ2V0U2l6ZSh2b2lkICp1c2VyZGF0YSkgewotICAgIERhdGFTb3VyY2UgKnNvdXJjZSA9IHN0YXRpY19jYXN0PERhdGFTb3VyY2UgKj4odXNlcmRhdGEpOwotICAgIG9mZjY0X3Qgc2l6ZSA9IC0xOwotICAgIHNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSk7Ci0gICAgcmV0dXJuIHNpemU7Ci19Ci0KLXNzaXplX3QgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXI6OkFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX3JlYWRBdCh2b2lkICp1c2VyZGF0YSwgb2ZmNjRfdCBvZmZzZXQsIHZvaWQgKiBidWYsIHNpemVfdCBzaXplKSB7Ci0gICAgRGF0YVNvdXJjZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8RGF0YVNvdXJjZSAqPih1c2VyZGF0YSk7Ci0gICAgcmV0dXJuIHNvdXJjZS0+cmVhZEF0KG9mZnNldCwgYnVmLCBzaXplKTsKLX0KLQotdm9pZCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcjo6QU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfY2xvc2Uodm9pZCAqdXNlcmRhdGEpIHsKLSAgICBEYXRhU291cmNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxEYXRhU291cmNlICo+KHVzZXJkYXRhKTsKLSAgICBzb3VyY2UtPmNsb3NlKCk7CisgICAgQU1lZGlhQ29kZWNDcnlwdG9JbmZvICpjcnlwdG9JbmZvID0gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZUNyeXB0b0luZm8obUFNZWRpYUV4dHJhY3Rvcik7CisgICAgaWYgKGNyeXB0b0luZm8gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyKGNyeXB0b0luZm8pOwogfQogCiBBTWVkaWFEYXRhU291cmNlV3JhcHBlcjo6QU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKLSAgICAgIG1BTWVkaWFEYXRhU291cmNlKEFNZWRpYURhdGFTb3VyY2VfbmV3KCkpIHsKLSAgICBBTE9HVigic2V0RGF0YVNvdXJjZSAoc291cmNlOiAlcCkiLCBkYXRhU291cmNlLmdldCgpKTsKLSAgICBBTWVkaWFEYXRhU291cmNlX3NldFVzZXJkYXRhKG1BTWVkaWFEYXRhU291cmNlLCBkYXRhU291cmNlLmdldCgpKTsKLSAgICBBTWVkaWFEYXRhU291cmNlX3NldFJlYWRBdChtQU1lZGlhRGF0YVNvdXJjZSwgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfcmVhZEF0KTsKLSAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldFNpemUobUFNZWRpYURhdGFTb3VyY2UsIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX2dldFNpemUpOwotICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0Q2xvc2UobUFNZWRpYURhdGFTb3VyY2UsIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX2Nsb3NlKTsKKyAgICAgIG1BTWVkaWFEYXRhU291cmNlKGNvbnZlcnREYXRhU291cmNlVG9BTWVkaWFEYXRhU291cmNlKGRhdGFTb3VyY2UpKSB7Cit9CisKK0FNZWRpYURhdGFTb3VyY2VXcmFwcGVyOjpBTWVkaWFEYXRhU291cmNlV3JhcHBlcihBTWVkaWFEYXRhU291cmNlICphRGF0YVNvdXJjZSkKKyAgICA6IG1EYXRhU291cmNlKE5VTEwpLAorICAgICAgbUFNZWRpYURhdGFTb3VyY2UoYURhdGFTb3VyY2UpIHsKIH0KIAogQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXI6On5BTWVkaWFEYXRhU291cmNlV3JhcHBlcigpIHsKICAgICBpZiAobUFNZWRpYURhdGFTb3VyY2UgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CiAgICAgfQorICAgIEFNZWRpYURhdGFTb3VyY2VfY2xvc2UobUFNZWRpYURhdGFTb3VyY2UpOwogICAgIEFNZWRpYURhdGFTb3VyY2VfZGVsZXRlKG1BTWVkaWFEYXRhU291cmNlKTsKICAgICBtQU1lZGlhRGF0YVNvdXJjZSA9IE5VTEw7CiB9CkBAIC0xMzA1LDQgKzEyNzksOCBAQAogICAgIHJldHVybiBtQU1lZGlhRGF0YVNvdXJjZTsKIH0KIAordm9pZCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcjo6Y2xvc2UoKSB7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9jbG9zZShtQU1lZGlhRGF0YVNvdXJjZSk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9UaW1lQ2hlY2suY3BwIGIvbWVkaWEvbGlibWVkaWEvVGltZUNoZWNrLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFiNWQ0Zi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYS9UaW1lQ2hlY2suY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotI2luY2x1ZGUgPG1lZGlhL1RpbWVDaGVjay5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8qIHN0YXRpYyAqLwotc3A8VGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ+IFRpbWVDaGVjazo6Z2V0VGltZUNoZWNrVGhyZWFkKCkKLXsKLSAgICBzdGF0aWMgc3A8VGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ+IHNUaW1lQ2hlY2tUaHJlYWQgPSBuZXcgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQoKTsKLSAgICByZXR1cm4gc1RpbWVDaGVja1RocmVhZDsKLX0KLQotVGltZUNoZWNrOjpUaW1lQ2hlY2soY29uc3QgY2hhciAqdGFnLCB1aW50MzJfdCB0aW1lb3V0TXMpCi0gICAgOiBtRW5kVGltZU5zKGdldFRpbWVDaGVja1RocmVhZCgpLT5zdGFydE1vbml0b3JpbmcodGFnLCB0aW1lb3V0TXMpKQotewotfQotCi1UaW1lQ2hlY2s6On5UaW1lQ2hlY2soKSB7Ci0gICAgZ2V0VGltZUNoZWNrVGhyZWFkKCktPnN0b3BNb25pdG9yaW5nKG1FbmRUaW1lTnMpOwotfQotCi1UaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6flRpbWVDaGVja1RocmVhZCgpCi17Ci0gICAgQXV0b011dGV4IF9sKG1NdXRleCk7Ci0gICAgcmVxdWVzdEV4aXQoKTsKLSAgICBtTW9uaXRvclJlcXVlc3RzLmNsZWFyKCk7Ci0gICAgbUNvbmQuc2lnbmFsKCk7Ci19Ci0KLW5zZWNzX3QgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6OnN0YXJ0TW9uaXRvcmluZyhjb25zdCBjaGFyICp0YWcsIHVpbnQzMl90IHRpbWVvdXRNcykgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTXV0ZXgpOwotICAgIG5zZWNzX3QgZW5kVGltZU5zID0gc3lzdGVtVGltZSgpICsgbWlsbGlzZWNvbmRzKHRpbWVvdXRNcyk7Ci0gICAgZm9yICg7IG1Nb25pdG9yUmVxdWVzdHMuaW5kZXhPZktleShlbmRUaW1lTnMpID49IDA7ICsrZW5kVGltZU5zKTsKLSAgICBtTW9uaXRvclJlcXVlc3RzLmFkZChlbmRUaW1lTnMsIHRhZyk7Ci0gICAgbUNvbmQuc2lnbmFsKCk7Ci0gICAgcmV0dXJuIGVuZFRpbWVOczsKLX0KLQotdm9pZCBUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6c3RvcE1vbml0b3JpbmcobnNlY3NfdCBlbmRUaW1lTnMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobU11dGV4KTsKLSAgICBtTW9uaXRvclJlcXVlc3RzLnJlbW92ZUl0ZW0oZW5kVGltZU5zKTsKLSAgICBtQ29uZC5zaWduYWwoKTsKLX0KLQotYm9vbCBUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6dGhyZWFkTG9vcCgpCi17Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gVElNRURfT1VUOwotICAgIGNvbnN0IGNoYXIgKnRhZzsKLSAgICB7Ci0gICAgICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOwotCi0gICAgICAgIGlmIChleGl0UGVuZGluZygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBuc2Vjc190IGVuZFRpbWVOcyA9IElOVDY0X01BWDsKLSAgICAgICAgLy8gS2V5ZWRWZWN0b3IgbU1vbml0b3JSZXF1ZXN0cyBpcyBvcmRlcmVkIHNvIHRha2UgZmlyc3QgZW50cnkgYXMgbmV4dCB0aW1lb3V0Ci0gICAgICAgIGlmIChtTW9uaXRvclJlcXVlc3RzLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgICAgICBlbmRUaW1lTnMgPSBtTW9uaXRvclJlcXVlc3RzLmtleUF0KDApOwotICAgICAgICAgICAgdGFnID0gbU1vbml0b3JSZXF1ZXN0cy52YWx1ZUF0KDApOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgbnNlY3NfdCB3YWl0VGltZU5zID0gZW5kVGltZU5zIC0gc3lzdGVtVGltZSgpOwotICAgICAgICBpZiAod2FpdFRpbWVOcyA+IDApIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG1Db25kLndhaXRSZWxhdGl2ZShtTXV0ZXgsIHdhaXRUaW1lTnMpOwotICAgICAgICB9Ci0gICAgfQotICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RhdHVzICE9IE5PX0VSUk9SLCAiVGltZUNoZWNrIHRpbWVvdXQgZm9yICVzIiwgdGFnKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL1R5cGVDb252ZXJ0ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvVHlwZUNvbnZlcnRlci5jcHAKaW5kZXggYTNkYjc1NC4uYjVhNzE3MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvVHlwZUNvbnZlcnRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvVHlwZUNvbnZlcnRlci5jcHAKQEAgLTEzMiw2ICsxMzIsNyBAQAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19JTlBVVF9GTEFHX01NQVBfTk9JUlEpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19JTlBVVF9GTEFHX1ZPSVBfVFgpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19JTlBVVF9GTEFHX0hXX0FWX1NZTkMpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19JTlBVVF9GTEFHX0RJUkVDVCksCiAgICAgVEVSTUlOQVRPUgogfTsKIApAQCAtMjMyLDYgKzIzMywxMiBAQAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF83UE9JTlQxKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMVBPSU5UMiksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDFQT0lOVDQpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9IQVBUSUNfQSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX01PTk9fSEFQVElDX0EpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9TVEVSRU9fSEFQVElDX0EpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9IQVBUSUNfQUIpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9NT05PX0hBUFRJQ19BQiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1NURVJFT19IQVBUSUNfQUIpLAogICAgIFRFUk1JTkFUT1IKIH07CiAKQEAgLTI3OCw2ICsyODUsNyBAQAogCiB0ZW1wbGF0ZSA8PgogY29uc3QgU3RyZWFtVHlwZUNvbnZlcnRlcjo6VGFibGUgU3RyZWFtVHlwZUNvbnZlcnRlcjo6bVRhYmxlW10gPSB7CisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9ERUZBVUxUKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fU1lTVEVNKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX1JJTkcpLApAQCAtMzU0LDYgKzM2MiwyMiBAQAogICAgIFRFUk1JTkFUT1IKIH07CiAKK3RlbXBsYXRlIDw+Citjb25zdCBBdWRpb0ZsYWdDb252ZXJ0ZXI6OlRhYmxlIEF1ZGlvRmxhZ0NvbnZlcnRlcjo6bVRhYmxlW10gPSB7CisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfTk9ORSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfU0VDVVJFKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19TQ08pLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GTEFHX0JFQUNPTiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfSFdfQVZfU1lOQyksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfSFdfSE9UV09SRCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfQllQQVNTX0lOVEVSUlVQVElPTl9QT0xJQ1kpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GTEFHX0JZUEFTU19NVVRFKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19MT1dfTEFURU5DWSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfREVFUF9CVUZGRVIpLAorICAgIFRFUk1JTkFUT1IKK307CisKIHRlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8T3V0cHV0RGV2aWNlVHJhaXRzPjsKIHRlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8SW5wdXREZXZpY2VUcmFpdHM+OwogdGVtcGxhdGUgY2xhc3MgVHlwZUNvbnZlcnRlcjxPdXRwdXRGbGFnVHJhaXRzPjsKQEAgLTM2Nyw2ICszOTEsNyBAQAogdGVtcGxhdGUgY2xhc3MgVHlwZUNvbnZlcnRlcjxBdWRpb01vZGVUcmFpdHM+OwogdGVtcGxhdGUgY2xhc3MgVHlwZUNvbnZlcnRlcjxVc2FnZVRyYWl0cz47CiB0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPFNvdXJjZVRyYWl0cz47Cit0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPEF1ZGlvRmxhZ1RyYWl0cz47CiAKIGJvb2wgZGV2aWNlRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgbGl0ZXJhbERldmljZSwgYXVkaW9fZGV2aWNlc190JiBkZXZpY2UpIHsKICAgICByZXR1cm4gSW5wdXREZXZpY2VDb252ZXJ0ZXI6OmZyb21TdHJpbmcobGl0ZXJhbERldmljZSwgZGV2aWNlKSB8fApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvYWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuYWlkbCBiL21lZGlhL2xpYm1lZGlhL2FpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YjFiYzkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWEvYWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqCi0gKiBTZXJ2aWNlIHRvIHJlbG9hZCBleHRyYWN0b3IgcGx1Z2lucyB3aGVuIHVwZGF0ZSBwYWNrYWdlIGlzIGluc3RhbGxlZC91bmluc3RhbGxlZC4KLSAqIEBoaWRlCi0gKi8KLWludGVyZmFjZSBJTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlIHsKLSAgICB2b2lkIGxvYWRQbHVnaW5zKEB1dGY4SW5DcHAgU3RyaW5nIGFwa1BhdGgpOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvYWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYVVwZGF0ZVNlcnZpY2UuYWlkbCBiL21lZGlhL2xpYm1lZGlhL2FpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFVcGRhdGVTZXJ2aWNlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc3Nzk2OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL2FpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFVcGRhdGVTZXJ2aWNlLmFpZGwKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIFNlcnZpY2UgdG8gcmVsb2FkIG1lZGlhIGNvbXBvbmVudCBwbHVnaW5zIHdoZW4gdXBkYXRlIHBhY2thZ2UgaXMgaW5zdGFsbGVkL3VuaW5zdGFsbGVkLgorICogQGhpZGUKKyAqLworaW50ZXJmYWNlIElNZWRpYVVwZGF0ZVNlcnZpY2UgeworICAgIHZvaWQgbG9hZFBsdWdpbnMoQHV0ZjhJbkNwcCBTdHJpbmcgYXBrUGF0aCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0J1ZmZlclByb3ZpZGVycy5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9CdWZmZXJQcm92aWRlcnMuaAppbmRleCBkNmE5Y2ZiLi5lYTQxNTI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0J1ZmZlclByb3ZpZGVycy5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQnVmZmVyUHJvdmlkZXJzLmgKQEAgLTc4LDYgKzc4LDcgQEAKIAogICAgIC8vIE92ZXJyaWRlcyBQYXNzdGhydUJ1ZmZlclByb3ZpZGVyCiAgICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7CisgICAgdm9pZCBzZXRCdWZmZXJQcm92aWRlcihBdWRpb0J1ZmZlclByb3ZpZGVyICpwKSBvdmVycmlkZTsKIAogICAgIC8vIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHN1cHBsaWVkIGJ5IHRoZSBkZXJpdmVkIGNsYXNzLiAgSXQgY29udmVydHMKICAgICAvLyAjZnJhbWVzIGluIHRoZSAqc3JjIHBvaW50ZXIgdG8gdGhlICpkc3QgcG9pbnRlci4gIEl0IGlzIHB1YmxpYyBiZWNhdXNlCkBAIC0xODYsNiArMTg3LDcgQEAKIAogICAgIC8vIE92ZXJyaWRlcyBQYXNzdGhydUJ1ZmZlclByb3ZpZGVyCiAgICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7CisgICAgdm9pZCBzZXRCdWZmZXJQcm92aWRlcihBdWRpb0J1ZmZlclByb3ZpZGVyICpwKSBvdmVycmlkZTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tSYXRlKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZwbGF5YmFja1JhdGUpOwogCkBAIC0yMTYsNiArMjE4LDUzIEBACiAgICAgYm9vbCAgICAgICAgICAgICAgICAgbUF1ZGlvUGxheWJhY2tSYXRlVmFsaWQ7IC8vIGZsYWcgZm9yIGN1cnJlbnQgcGFyYW1ldGVycyB2YWxpZGl0eQogfTsKIAorLy8gQWRqdXN0QnVmZmVyUHJvdmlkZXIgZGVyaXZlcyBmcm9tIENvcHlCdWZmZXJQcm92aWRlciB0byBhZGp1c3Qgc2FtcGxlIGRhdGEuCisvLyBFeHBhbmRzIG9yIGNvbnRyYWN0cyBzYW1wbGUgZGF0YSBmcm9tIG9uZSBpbnRlcmxlYXZlZCBjaGFubmVsIGZvcm1hdCB0byBhbm90aGVyLgorLy8gRXhwYW5kZWQgY2hhbm5lbHMgYXJlIGZpbGxlZCB3aXRoIHplcm9zIGFuZCBwdXQgYXQgdGhlIGVuZCBvZiBlYWNoIGF1ZGlvIGZyYW1lLgorLy8gQ29udHJhY3RlZCBjaGFubmVscyBhcmUgb21pdHRlZCBmcm9tIHRoZSBlbmQgb2YgZWFjaCBhdWRpbyBmcmFtZS4KK2NsYXNzIEFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgQ29weUJ1ZmZlclByb3ZpZGVyIHsKK3B1YmxpYzoKKyAgICBBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgc2l6ZV90IGluQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgc2l6ZV90IG91dENoYW5uZWxDb3VudCwgc2l6ZV90IGZyYW1lQ291bnQpOworICAgIC8vT3ZlcnJpZGVzCisgICAgdm9pZCBjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IG1Gb3JtYXQ7CisgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbUluQ2hhbm5lbENvdW50OworICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1PdXRDaGFubmVsQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbVNhbXBsZVNpemVJbkJ5dGVzOworfTsKKworLy8gQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyIGRlcml2ZXMgZnJvbSBDb3B5QnVmZmVyUHJvdmlkZXIgdG8gYWRqdXN0IHNhbXBsZSBkYXRhLgorLy8gRXhwYW5kcyBvciBjb250cmFjdHMgc2FtcGxlIGRhdGEgZnJvbSBvbmUgaW50ZXJsZWF2ZWQgY2hhbm5lbCBmb3JtYXQgdG8gYW5vdGhlci4KKy8vIEV4dHJhIGV4cGFuZGVkIGNoYW5uZWxzIGFyZSBpbnRlcmxlYXZlZCBpbiBmcm9tIHRoZSBlbmQgb2YgdGhlIGlucHV0IGJ1ZmZlci4KKy8vIENvbnRyYWN0ZWQgY2hhbm5lbHMgYXJlIGNvcGllZCB0byB0aGUgZW5kIG9mIHRoZSBvdXRwdXQgYnVmZmVyLgorLy8gQ29udHJhY3RlZCBjaGFubmVscyBjb3VsZCBiZSB3cml0dGVuIHRvIG91dHB1dCBidWZmZXIuCitjbGFzcyBBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgQ29weUJ1ZmZlclByb3ZpZGVyIHsKK3B1YmxpYzoKKyAgICBBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIoYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBzaXplX3QgaW5DaGFubmVsQ291bnQsCisgICAgICAgICAgICBzaXplX3Qgb3V0Q2hhbm5lbENvdW50LCBhdWRpb19mb3JtYXRfdCBjb250cmFjdGVkRm9ybWF0LCBzaXplX3QgY29udHJhY3RlZEZyYW1lQ291bnQsCisgICAgICAgICAgICB2b2lkKiBjb250cmFjdGVkQnVmZmVyKTsKKyAgICAvL092ZXJyaWRlcworICAgIHN0YXR1c190IGdldE5leHRCdWZmZXIoQnVmZmVyKiBwQnVmZmVyKSBvdmVycmlkZTsKKyAgICB2b2lkIGNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpIG92ZXJyaWRlOworICAgIHZvaWQgcmVzZXQoKSBvdmVycmlkZTsKKworICAgIHZvaWQgY2xlYXJDb250cmFjdGVkRnJhbWVzKCkgeyBtQ29udHJhY3RlZFdyaXR0ZW5GcmFtZXMgPSAwOyB9CisKK3Byb3RlY3RlZDoKKyAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBtRm9ybWF0OworICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1JbkNoYW5uZWxDb3VudDsKKyAgICBjb25zdCBzaXplX3QgICAgICAgICBtT3V0Q2hhbm5lbENvdW50OworICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1TYW1wbGVTaXplSW5CeXRlczsKKyAgICBjb25zdCBzaXplX3QgICAgICAgICBtQ29udHJhY3RlZENoYW5uZWxDb3VudDsKKyAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBtQ29udHJhY3RlZEZvcm1hdDsKKyAgICBjb25zdCBzaXplX3QgICAgICAgICBtQ29udHJhY3RlZEZyYW1lQ291bnQ7CisgICAgdm9pZCAgICAgICAgICAgICAgICAqbUNvbnRyYWN0ZWRCdWZmZXI7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgbUNvbnRyYWN0ZWRXcml0dGVuRnJhbWVzOworICAgIHNpemVfdCAgICAgICAgICAgICAgIG1Db250cmFjdGVkRnJhbWVTaXplOworfTsKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlRGVzYy5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlRGVzYy5oCmluZGV4IGMxOTAyNjEuLjQzMzY3NjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZURlc2MuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VEZXNjLmgKQEAgLTMwLDYgKzMwLDExIEBACiAvLyBBIGJpbmRlciBpbnRlcmZhY2UgZm9yIGltcGxlbWVudGluZyBhIHN0YWdlZnJpZ2h0IERhdGFTb3VyY2UgcmVtb3RlbHkuCiBzdHJ1Y3QgRGF0YVNvdXJjZURlc2MgOiBwdWJsaWMgUmVmQmFzZSB7CiBwdWJsaWM6CisgICAgLy8gaW50ZW50aW9uYWxseSBsZXNzIHRoYW4gSU5UNjRfTUFYCisgICAgLy8ga2VlcCBjb25zaXN0ZW50IHdpdGggSkFWQSBjb2RlCisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga01heFRpbWVNcyA9IDB4N2ZmZmZmZmZmZmZmZmZmbGwgLyAxMDAwOworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNYXhUaW1lVXMgPSBrTWF4VGltZU1zICogMTAwMDsKKwogICAgIGVudW0gewogICAgICAgICAvKiBObyBkYXRhIHNvdXJjZSBoYXMgYmVlbiBzZXQgeWV0ICovCiAgICAgICAgIFRZUEVfTk9ORSAgICAgPSAwLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Ecm1IYWwuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtSGFsLmgKaW5kZXggZjI2N2Y3Ni4uMzMwMjk4MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Ecm1IYWwuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybUhhbC5oCkBAIC0yMyw2ICsyMyw4IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lEcm1QbHVnaW5MaXN0ZW5lci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JRHJtRmFjdG9yeS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JRHJtUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1GYWN0b3J5Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1QbHVnaW4uaD4KIAogI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgogI2luY2x1ZGUgPG1lZGlhZHJtL0RybU1ldHJpY3MuaD4KQEAgLTM2LDYgKzM4LDcgQEAKIHVzaW5nIGRybTo6VjFfMDo6SURybVBsdWdpbjsKIHVzaW5nIGRybTo6VjFfMDo6SURybVBsdWdpbkxpc3RlbmVyOwogdXNpbmcgZHJtOjpWMV8wOjpLZXlTdGF0dXM7Cit1c2luZyBkcm06OlYxXzI6Ok9mZmxpbmVMaWNlbnNlU3RhdGU7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7CkBAIC0xMTMsNiArMTE2LDExIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cml0eUxldmVsKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAogICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsICpsZXZlbCkgY29uc3Q7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAma2V5U2V0SWRzKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZU9mZmxpbmVMaWNlbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkLAorICAgICAgICAgICAgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlICpsaWNlbnNlU3RhdGUpIGNvbnN0OworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4ICZ2YWx1ZSApIGNvbnN0OwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCBjb25zdCAmbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmdmFsdWUgKSBjb25zdDsKQEAgLTE4Miw2ICsxOTAsNyBAQAogICAgIGNvbnN0IFZlY3RvcjxzcDxJRHJtRmFjdG9yeT4+IG1GYWN0b3JpZXM7CiAgICAgc3A8SURybVBsdWdpbj4gbVBsdWdpbjsKICAgICBzcDxkcm06OlYxXzE6OklEcm1QbHVnaW4+IG1QbHVnaW5WMV8xOworICAgIHNwPGRybTo6VjFfMjo6SURybVBsdWdpbj4gbVBsdWdpblYxXzI7CiAgICAgU3RyaW5nOCBtQXBwUGFja2FnZU5hbWU7CiAKICAgICAvLyBNdXRhYmxlIHRvIGFsbG93IG1vZGlmaWNhdGlvbiB3aXRoaW4gR2V0UHJvcGVydHlCeXRlQXJyYXkuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lEcm0uaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSURybS5oCmluZGV4IDhlOWViM2EuLjQ5MTY2YzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSURybS5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSURybS5oCkBAIC03NSw4ICs3NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZjZXJ0aWZpY2F0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJndyYXBwZWRLZXkpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcHMoTGlzdDxWZWN0b3I8dWludDhfdD4gPiAmc2VjdXJlU3RvcHMpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BJZHMoTGlzdDxWZWN0b3I8dWludDhfdD4gPiAmc2VjdXJlU3RvcElkcykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcHMoTGlzdDxWZWN0b3I8dWludDhfdD4+ICZzZWN1cmVTdG9wcykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcElkcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4gJnNlY3VyZVN0b3BJZHMpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3AoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzc2lkLCBWZWN0b3I8dWludDhfdD4gJnNlY3VyZVN0b3ApID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNlY3VyZVN0b3BzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NSZWxlYXNlKSA9IDA7CkBAIC05MSw2ICs5MSwxMSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJpdHlMZXZlbChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCAqbGV2ZWwpIGNvbnN0ID0gMDsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoTGlzdDxWZWN0b3I8dWludDhfdD4+ICZrZXlTZXRJZHMpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZU9mZmxpbmVMaWNlbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9mZmxpbmVMaWNlbnNlU3RhdGUoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCwKKyAgICAgICAgICAgIERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSAqbGljZW5zZVN0YXRlKSBjb25zdCA9IDA7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggJnZhbHVlKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4IGNvbnN0ICZuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZ2YWx1ZSkgY29uc3QgPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaAppbmRleCA0NWU5NjIwLi41Y2UyY2RiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaApAQCAtMTcsNiArMTcsOCBAQAogI2lmbmRlZiBBTkRST0lEX0lNRURJQUVYVFJBQ1RPUlNFUlZJQ0VfSAogI2RlZmluZSBBTkRST0lEX0lNRURJQUVYVFJBQ1RPUlNFUlZJQ0VfSAogCisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKwogI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CkBAIC0zMyw2ICszNSw4IEBACiAgICAgdmlydHVhbCBzcDxJTWVkaWFFeHRyYWN0b3I+IG1ha2VFeHRyYWN0b3IoY29uc3Qgc3A8SURhdGFTb3VyY2U+ICZzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUpID0gMDsKIAogICAgIHZpcnR1YWwgc3A8SURhdGFTb3VyY2U+IG1ha2VJRGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgPSAwOworCisgICAgdmlydHVhbCBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IGdldFN1cHBvcnRlZFR5cGVzKCkgPSAwOwogfTsKIAogY2xhc3MgQm5NZWRpYUV4dHJhY3RvclNlcnZpY2U6IHB1YmxpYyBCbkludGVyZmFjZTxJTWVkaWFFeHRyYWN0b3JTZXJ2aWNlPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaAppbmRleCAyMTdkZTE0Li5mMmUyMDYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaApAQCAtMjYsMTEgKzI2LDExIEBACiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJDbGllbnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK2NsYXNzIElNZWRpYVBsYXllcjsKIGNsYXNzIElNZWRpYUNvZGVjTGlzdDsKIHN0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIGNsYXNzIElNZWRpYVJlY29yZGVyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oCmluZGV4IDM3OTAwMGUuLmU3YzQ2NmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUmVjb3JkZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyLmgKQEAgLTczLDcgKzczLDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcygKICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKSA9IDA7Ci0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpID0gMDsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSkF1ZGlvQXR0cmlidXRlcy5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9KQXVkaW9BdHRyaWJ1dGVzLmgKaW5kZXggZmIxMTQzNS4uZWEwYWFhMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9KQXVkaW9BdHRyaWJ1dGVzLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9KQXVkaW9BdHRyaWJ1dGVzLmgKQEAgLTI2LDggKzI2LDcgQEAKIHB1YmxpYzoKICAgICAvKiBDcmVhdGVzIGEgSmF2YSBBdWRpb0F0dHJpYnV0ZXMgb2JqZWN0LiAqLwogICAgIHN0YXRpYyBqb2JqZWN0IGNyZWF0ZUF1ZGlvQXR0cmlidXRlc09iaihKTklFbnYgKmVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMpIHsKIAogICAgICAgICBqY2xhc3MgakJ1aWxkZXJDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMkQnVpbGRlciIpOwogICAgICAgICBqbWV0aG9kSUQgakJ1aWxkZXJDdG9yID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgIjxpbml0PiIsICIoKVYiKTsKQEAgLTU4LDExICs1Nyw2IEBACiAgICAgICAgICAgICAvLyBUT0RPOiBIYW5kbGUgdGhlICd0YWdzJyAoY2hhcltdIHRvIEhhc2hTZXQ8U3RyaW5nPikuCiAgICAgICAgICAgICAvLyBIb3cgdG8gcGFyc2UgdGhlIGNoYXJbXT8gSXMgdGhlcmUgYW55IGV4YW1wbGUgb2YgaXQ/CiAgICAgICAgICAgICAvLyBBbHNvLCB0aGUgYWRkVGFncygpIG1ldGhvZCBpcyBoaWRkZW4uCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBDYWxsIEF1ZGlvQXR0cmlidXRlcy5CdWlsZGVyLnNldExlZ2FjeVN0cmVhbVR5cGUoKS5idWlsZCgpCi0gICAgICAgICAgICBqbWV0aG9kSUQgalNldExlZ2FjeVN0cmVhbVR5cGUgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAic2V0TGVnYWN5U3RyZWFtVHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICIoSSlMYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMkQnVpbGRlcjsiKTsKLSAgICAgICAgICAgIGpCdWlsZGVyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyT2JqLCBqU2V0TGVnYWN5U3RyZWFtVHlwZSwgc3RyZWFtVHlwZSk7CiAgICAgICAgIH0KIAogICAgICAgICBqbWV0aG9kSUQgakJ1aWxkID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgImJ1aWxkIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaAppbmRleCA1MzQwZGRlLi5lMWM1ZDQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUmVjb3JkZXJCYXNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oCkBAIC03Miw2ICs3Miw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgY29uc3QgPSAwOwogCiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NaWRpSW9XcmFwcGVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01pZGlJb1dyYXBwZXIuaAppbmRleCBiNWU1NjVlLi5iMTlkNDllIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01pZGlJb1dyYXBwZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01pZGlJb1dyYXBwZXIuaApAQCAtMjMsMTEgKzIzLDE0IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RydWN0IENEYXRhU291cmNlOworY2xhc3MgRGF0YVNvdXJjZVVud3JhcHBlcjsKKwogY2xhc3MgTWlkaUlvV3JhcHBlciB7CiBwdWJsaWM6CiAgICAgZXhwbGljaXQgTWlkaUlvV3JhcHBlcihjb25zdCBjaGFyICpwYXRoKTsKICAgICBleHBsaWNpdCBNaWRpSW9XcmFwcGVyKGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIGludDY0X3Qgc2l6ZSk7Ci0gICAgZXhwbGljaXQgTWlkaUlvV3JhcHBlcihEYXRhU291cmNlQmFzZSAqc291cmNlKTsKKyAgICBleHBsaWNpdCBNaWRpSW9XcmFwcGVyKENEYXRhU291cmNlICpjc291cmNlKTsKIAogICAgIH5NaWRpSW9XcmFwcGVyKCk7CiAKQEAgLTQwLDcgKzQzLDcgQEAKICAgICBpbnQgbUZkOwogICAgIG9mZjY0X3QgbUJhc2U7CiAgICAgaW50NjRfdCAgbUxlbmd0aDsKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZVVud3JhcHBlciAqbURhdGFTb3VyY2U7CiAgICAgRUFTX0ZJTEUgbUVhc0ZpbGU7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL05ka1dyYXBwZXIuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTmRrV3JhcHBlci5oCmluZGV4IGM5N2QxNzEuLjhhNDE3ZjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTmRrV3JhcHBlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTmRrV3JhcHBlci5oCkBAIC0yNzgsNiArMjc4LDI1IEBACiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQU1lZGlhQ29kZWNXcmFwcGVyKTsKIH07CiAKK3N0cnVjdCBBTWVkaWFEYXRhU291cmNlV3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKKworICAgIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKGNvbnN0IHNwPERhdGFTb3VyY2U+Jik7CisgICAgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoQU1lZGlhRGF0YVNvdXJjZSopOworCisgICAgQU1lZGlhRGF0YVNvdXJjZSAqZ2V0QU1lZGlhRGF0YVNvdXJjZSgpOworCisgICAgdm9pZCBjbG9zZSgpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoKTsKKworcHJpdmF0ZToKKyAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFEYXRhU291cmNlICptQU1lZGlhRGF0YVNvdXJjZTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKTsKK307CisKIHN0cnVjdCBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyIDogcHVibGljIFJlZkJhc2UgewogCiAgICAgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcihBTWVkaWFFeHRyYWN0b3IgKmFNZWRpYUV4dHJhY3Rvcik7CkBAIC0yODcsOCArMzA2LDYgQEAKIAogICAgIHN0YXR1c190IHJlbGVhc2UoKTsKIAotICAgIHN0YXR1c190IGRpc2Nvbm5lY3QoKTsKLQogICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgpOwogCiAgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBjaGFyICpsb2NhdGlvbik7CkBAIC0zMzksMzEgKzM1Niw2IEBACiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQU1lZGlhRXh0cmFjdG9yV3JhcHBlcik7CiB9OwogCi1zdHJ1Y3QgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIgOiBwdWJsaWMgUmVmQmFzZSB7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgdHJhbnNsYXRlX2Vycm9yKG1lZGlhX3N0YXR1c190IGVycik7Ci0KLSAgICBzdGF0aWMgc3NpemVfdCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcl9nZXRTaXplKHZvaWQgKnVzZXJkYXRhKTsKLQotICAgIHN0YXRpYyBzc2l6ZV90IEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX3JlYWRBdCh2b2lkICp1c2VyZGF0YSwgb2ZmNjRfdCBvZmZzZXQsIHZvaWQgKiBidWYsIHNpemVfdCBzaXplKTsKLQotICAgIHN0YXRpYyB2b2lkIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX2Nsb3NlKHZvaWQgKnVzZXJkYXRhKTsKLQotICAgIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZkYXRhU291cmNlKTsKLQotICAgIEFNZWRpYURhdGFTb3VyY2UgKmdldEFNZWRpYURhdGFTb3VyY2UoKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKCk7Ci0KLXByaXZhdGU6Ci0gICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7Ci0KLSAgICBBTWVkaWFEYXRhU291cmNlICptQU1lZGlhRGF0YVNvdXJjZTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKTsKLX07Ci0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gTkRLX1dSQVBQRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvUGF0Y2hCdWlsZGVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1BhdGNoQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNzIyYTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1BhdGNoQnVpbGRlci5oCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1BBVENIX0JVSUxERVJfSAorI2RlZmluZSBBTkRST0lEX1BBVENIX0JVSUxERVJfSAorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCisvLyBUaGlzIGlzIGEgaGVhZGVyLW9ubHkgdXRpbGl0eS4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBQYXRjaEJ1aWxkZXIgeworICBwdWJsaWM6CisgICAgdXNpbmcgbWl4X3VzZWNhc2VfdCA9IGRlY2x0eXBlKGF1ZGlvX3BvcnRfY29uZmlnX21peF9leHQ6OnVzZWNhc2UpOworCisgICAgUGF0Y2hCdWlsZGVyKCkgPSBkZWZhdWx0OworCisgICAgLy8gQWxsIGV4aXN0aW5nIG1ldGhvZHMgb3BlcmF0aW5nIG9uIGF1ZGlvIHBhdGNoZXMgdGFrZSBhIHBvaW50ZXIgdG8gY29uc3QuCisgICAgLy8gSXQncyBPSyB0byBjb25zdHJ1Y3QgYSB0ZW1wb3JhcnkgUGF0Y2hCdWlsZGVyIHdoaWxlIHByZXBhcmluZyBhIHBhcmFtZXRlcgorICAgIC8vIHRvIHN1Y2ggYSBmdW5jdGlvbiBiZWNhdXNlIHRoZSBCdWlsZGVyIHdpbGwgYmUga2VwdCBhbGl2ZSB1bnRpbCB0aGUgY29kZQorICAgIC8vIGV4ZWN1dGlvbiByZWFjaGVzIHRoZSBmdW5jdGlvbiBjYWxsIHN0YXRlbWVudCBzZW1pY29sb24uCisgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoKiBwYXRjaCgpIGNvbnN0IHsgcmV0dXJuICZtUGF0Y2g7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIFM+CisgICAgUGF0Y2hCdWlsZGVyJiBhZGRTaW5rKFQmJiB0LCBTJiYuLi4gcykgeworICAgICAgICBzaW5rcygpLmFkZChzdGQ6OmZvcndhcmQ8VD4odCksIHN0ZDo6Zm9yd2FyZDxTPihzKS4uLik7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgLy8gRXhwbGljaXQgdHlwZSBvZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBhbGxvd3MgY2xpZW50cyB0byBwcm92aWRlIHRoZSBzdHJ1Y3QgaW5saW5lLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgUGF0Y2hCdWlsZGVyJiBhZGRTaW5rKFQmJiB0LCBjb25zdCBtaXhfdXNlY2FzZV90JiB1cGRhdGUpIHsKKyAgICAgICAgc2lua3MoKS5hZGQoc3RkOjpmb3J3YXJkPFQ+KHQpLCB1cGRhdGUpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIFM+CisgICAgUGF0Y2hCdWlsZGVyJiBhZGRTb3VyY2UoVCYmIHQsIFMmJi4uLiBzKSB7CisgICAgICAgIHNvdXJjZXMoKS5hZGQoc3RkOjpmb3J3YXJkPFQ+KHQpLCBzdGQ6OmZvcndhcmQ8Uz4ocykuLi4pOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIC8vIEV4cGxpY2l0IHR5cGUgb2YgdGhlIHNlY29uZCBwYXJhbWV0ZXIgYWxsb3dzIGNsaWVudHMgdG8gcHJvdmlkZSB0aGUgc3RydWN0IGlubGluZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFBhdGNoQnVpbGRlciYgYWRkU291cmNlKFQmJiB0LCBjb25zdCBtaXhfdXNlY2FzZV90JiB1cGRhdGUpIHsKKyAgICAgICAgc291cmNlcygpLmFkZChzdGQ6OmZvcndhcmQ8VD4odCksIHVwZGF0ZSk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBzdHJ1Y3QgUG9ydENmZ3MgeworICAgICAgICBQb3J0Q2Zncyh1bnNpZ25lZCBpbnQgKmNvdW50UHRyLCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnBvcnRDZmdzKQorICAgICAgICAgICAgICAgIDogbUNvdW50UHRyKGNvdW50UHRyKSwgbVBvcnRDZmdzKHBvcnRDZmdzKSB7fQorICAgICAgICBhdWRpb19wb3J0X2NvbmZpZyYgYWRkKGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnJiBwb3J0Q2ZnKSB7CisgICAgICAgICAgICByZXR1cm4gKmFkdmFuY2UoKSA9IHBvcnRDZmc7CisgICAgICAgIH0KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgYXVkaW9fcG9ydF9jb25maWcmIGFkZChjb25zdCBzcDxUPiYgZW50aXR5KSB7CisgICAgICAgICAgICBhdWRpb19wb3J0X2NvbmZpZyogYWRkZWQgPSBhZHZhbmNlKCk7CisgICAgICAgICAgICBlbnRpdHktPnRvQXVkaW9Qb3J0Q29uZmlnKGFkZGVkKTsKKyAgICAgICAgICAgIHJldHVybiAqYWRkZWQ7CisgICAgICAgIH0KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgdm9pZCBhZGQoY29uc3Qgc3A8VD4mIGVudGl0eSwgY29uc3QgbWl4X3VzZWNhc2VfdCYgdXNlY2FzZVVwZGF0ZSkgeworICAgICAgICAgICAgYWRkKGVudGl0eSkuZXh0Lm1peC51c2VjYXNlID0gdXNlY2FzZVVwZGF0ZTsKKyAgICAgICAgfQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICB2b2lkIGFkZChjb25zdCBzcDxUPiYgZW50aXR5LAorICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248bWl4X3VzZWNhc2VfdChjb25zdCBtaXhfdXNlY2FzZV90Jik+IHVzZWNhc2VVcGRhdGVyKSB7CisgICAgICAgICAgICBtaXhfdXNlY2FzZV90KiB1c2VjYXNlID0gJmFkZChlbnRpdHkpLmV4dC5taXgudXNlY2FzZTsKKyAgICAgICAgICAgICp1c2VjYXNlID0gdXNlY2FzZVVwZGF0ZXIoKnVzZWNhc2UpOworICAgICAgICB9CisgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyogYWR2YW5jZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAmbVBvcnRDZmdzWygqbUNvdW50UHRyKSsrXTsKKyAgICAgICAgfQorICAgICAgICB1bnNpZ25lZCBpbnQgKm1Db3VudFB0cjsKKyAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICptUG9ydENmZ3M7CisgICAgfTsKKworICAgIFBvcnRDZmdzIHNpbmtzKCkgeyByZXR1cm4gUG9ydENmZ3MoJm1QYXRjaC5udW1fc2lua3MsIG1QYXRjaC5zaW5rcyk7IH0KKyAgICBQb3J0Q2ZncyBzb3VyY2VzKCkgeyByZXR1cm4gUG9ydENmZ3MoJm1QYXRjaC5udW1fc291cmNlcywgbVBhdGNoLnNvdXJjZXMpOyB9CisKKyAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggbVBhdGNoID0ge307Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfUEFUQ0hfQlVJTERFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1NpbmdsZVN0YXRlUXVldWUuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvU2luZ2xlU3RhdGVRdWV1ZS5oCmluZGV4IGQ0MjM5NjIuLmMyNzYxY2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvU2luZ2xlU3RhdGVRdWV1ZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvU2luZ2xlU3RhdGVRdWV1ZS5oCkBAIC05OSw2ICs5OSwxMyBAQAogICAgICAgICAgICAgcmV0dXJuIG1TaGFyZWQtPm1BY2sgLSBzZXF1ZW5jZSA+PSAwOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gcmV0dXJucyB0aGUgbGFzdCB2YWx1ZSB3cml0dGVuIChvciB0aGUgY29udGVudHMgb2YgdGhlIHNoYXJlZCBidWZmZXIgYWZ0ZXIgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgLy8gaWYgbm8gdmFsdWUgd2FzIHdyaXR0ZW4pLgorICAgICAgICBUIGxhc3QoKSBjb25zdAorICAgICAgICB7ICAgLy8gYXNzdW1lIG5vIHNlcXVlbmNlIGNoZWNrIHJlcXVpcmVkIC0gd2UgYXJlIHRoZSB3cml0ZXIuCisgICAgICAgICAgICByZXR1cm4gbVNoYXJlZC0+bVZhbHVlOworICAgICAgICB9CisKICAgICBwcml2YXRlOgogICAgICAgICBpbnQzMl90ICAgICBtU2VxdWVuY2U7CiAgICAgICAgIFNoYXJlZCAqIGNvbnN0IG1TaGFyZWQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1R5cGVDb252ZXJ0ZXIuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvVHlwZUNvbnZlcnRlci5oCmluZGV4IDg2ZjBkNGMuLjQxOGUwOWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvVHlwZUNvbnZlcnRlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvVHlwZUNvbnZlcnRlci5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCisjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgpAQCAtMzAsNzcgKzMxLDU1IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IFNhbXBsZVJhdGVUcmFpdHMKLXsKLSAgICB0eXBlZGVmIHVpbnQzMl90IFR5cGU7Ci0gICAgdHlwZWRlZiBTb3J0ZWRWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgRGV2aWNlVHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb19kZXZpY2VzX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBPdXRwdXREZXZpY2VUcmFpdHMgOiBwdWJsaWMgRGV2aWNlVHJhaXRzIHt9Owotc3RydWN0IElucHV0RGV2aWNlVHJhaXRzIDogcHVibGljIERldmljZVRyYWl0cyB7fTsKLXN0cnVjdCBPdXRwdXRGbGFnVHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb19vdXRwdXRfZmxhZ3NfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IElucHV0RmxhZ1RyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9faW5wdXRfZmxhZ3NfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IEZvcm1hdFRyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9fZm9ybWF0X3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBDaGFubmVsVHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb19jaGFubmVsX21hc2tfdCBUeXBlOwotICAgIHR5cGVkZWYgU29ydGVkVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IE91dHB1dENoYW5uZWxUcmFpdHMgOiBwdWJsaWMgQ2hhbm5lbFRyYWl0cyB7fTsKLXN0cnVjdCBJbnB1dENoYW5uZWxUcmFpdHMgOiBwdWJsaWMgQ2hhbm5lbFRyYWl0cyB7fTsKLXN0cnVjdCBDaGFubmVsSW5kZXhUcmFpdHMgOiBwdWJsaWMgQ2hhbm5lbFRyYWl0cyB7fTsKLXN0cnVjdCBHYWluTW9kZVRyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9fZ2Fpbl9tb2RlX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBTdHJlYW1UcmFpdHMKLXsKLSAgICB0eXBlZGVmIGF1ZGlvX3N0cmVhbV90eXBlX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBBdWRpb01vZGVUcmFpdHMKLXsKLSAgICB0eXBlZGVmIGF1ZGlvX21vZGVfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IEF1ZGlvQ29udGVudFRyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9fY29udGVudF90eXBlX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBVc2FnZVRyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9fdXNhZ2VfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IFNvdXJjZVRyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9fc291cmNlX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogc3RydWN0IERlZmF1bHRUcmFpdHMKIHsKICAgICB0eXBlZGVmIFQgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOworICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKKyAgICBzdGF0aWMgdm9pZCBhZGQoQ29sbGVjdGlvbiAmY29sbGVjdGlvbiwgVHlwZSB2YWx1ZSkKKyAgICB7CisgICAgICAgIGNvbGxlY3Rpb24ucHVzaF9iYWNrKHZhbHVlKTsKKyAgICB9CiB9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgVmVjdG9yVHJhaXRzCit7CisgICAgdHlwZWRlZiBUIFR5cGU7CisgICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKKyAgICBzdGF0aWMgdm9pZCBhZGQoQ29sbGVjdGlvbiAmY29sbGVjdGlvbiwgVHlwZSB2YWx1ZSkKKyAgICB7CisgICAgICAgIGNvbGxlY3Rpb24uYWRkKHZhbHVlKTsKKyAgICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgU29ydGVkVmVjdG9yVHJhaXRzCit7CisgICAgdHlwZWRlZiBUIFR5cGU7CisgICAgdHlwZWRlZiBTb3J0ZWRWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKKyAgICBzdGF0aWMgdm9pZCBhZGQoQ29sbGVjdGlvbiAmY29sbGVjdGlvbiwgVHlwZSB2YWx1ZSkKKyAgICB7CisgICAgICAgIGNvbGxlY3Rpb24uYWRkKHZhbHVlKTsKKyAgICB9Cit9OworCit1c2luZyBTYW1wbGVSYXRlVHJhaXRzID0gU29ydGVkVmVjdG9yVHJhaXRzPHVpbnQzMl90PjsKK3VzaW5nIERldmljZVRyYWl0cyA9IERlZmF1bHRUcmFpdHM8YXVkaW9fZGV2aWNlc190PjsKK3N0cnVjdCBPdXRwdXREZXZpY2VUcmFpdHMgOiBwdWJsaWMgRGV2aWNlVHJhaXRzIHt9Oworc3RydWN0IElucHV0RGV2aWNlVHJhaXRzIDogcHVibGljIERldmljZVRyYWl0cyB7fTsKK3VzaW5nIENoYW5uZWxUcmFpdHMgPSBTb3J0ZWRWZWN0b3JUcmFpdHM8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+Oworc3RydWN0IE91dHB1dENoYW5uZWxUcmFpdHMgOiBwdWJsaWMgQ2hhbm5lbFRyYWl0cyB7fTsKK3N0cnVjdCBJbnB1dENoYW5uZWxUcmFpdHMgOiBwdWJsaWMgQ2hhbm5lbFRyYWl0cyB7fTsKK3N0cnVjdCBDaGFubmVsSW5kZXhUcmFpdHMgOiBwdWJsaWMgQ2hhbm5lbFRyYWl0cyB7fTsKK3VzaW5nIElucHV0RmxhZ1RyYWl0cyA9IERlZmF1bHRUcmFpdHM8YXVkaW9faW5wdXRfZmxhZ3NfdD47Cit1c2luZyBPdXRwdXRGbGFnVHJhaXRzID0gRGVmYXVsdFRyYWl0czxhdWRpb19vdXRwdXRfZmxhZ3NfdD47Cit1c2luZyBGb3JtYXRUcmFpdHMgPSBWZWN0b3JUcmFpdHM8YXVkaW9fZm9ybWF0X3Q+OwordXNpbmcgR2Fpbk1vZGVUcmFpdHMgPSBEZWZhdWx0VHJhaXRzPGF1ZGlvX2dhaW5fbW9kZV90PjsKK3VzaW5nIFN0cmVhbVRyYWl0cyA9IERlZmF1bHRUcmFpdHM8YXVkaW9fc3RyZWFtX3R5cGVfdD47Cit1c2luZyBBdWRpb01vZGVUcmFpdHMgPSBEZWZhdWx0VHJhaXRzPGF1ZGlvX21vZGVfdD47Cit1c2luZyBBdWRpb0NvbnRlbnRUcmFpdHMgPSBEZWZhdWx0VHJhaXRzPGF1ZGlvX2NvbnRlbnRfdHlwZV90PjsKK3VzaW5nIFVzYWdlVHJhaXRzID0gRGVmYXVsdFRyYWl0czxhdWRpb191c2FnZV90PjsKK3VzaW5nIFNvdXJjZVRyYWl0cyA9IERlZmF1bHRUcmFpdHM8YXVkaW9fc291cmNlX3Q+Oworc3RydWN0IEF1ZGlvRmxhZ1RyYWl0cyA6IHB1YmxpYyBEZWZhdWx0VHJhaXRzPGF1ZGlvX2ZsYWdzX21hc2tfdD4ge307CiAKIHRlbXBsYXRlIDxjbGFzcyBUcmFpdHM+CiBzdGF0aWMgdm9pZCBjb2xsZWN0aW9uRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCB0eXBlbmFtZSBUcmFpdHM6OkNvbGxlY3Rpb24gJmNvbGxlY3Rpb24sCkBAIC0xMTAsNyArODksNyBAQAogICAgIGZvciAoY29uc3QgY2hhciAqY3N0ciA9IHN0cnRvayhsaXRlcmFsLCBkZWwpOyBjc3RyICE9IE5VTEw7IGNzdHIgPSBzdHJ0b2soTlVMTCwgZGVsKSkgewogICAgICAgICB0eXBlbmFtZSBUcmFpdHM6OlR5cGUgdmFsdWU7CiAgICAgICAgIGlmICh1dGlsaXRpZXM6OmNvbnZlcnRUbzxzdGQ6OnN0cmluZywgdHlwZW5hbWUgVHJhaXRzOjpUeXBlID4oY3N0ciwgdmFsdWUpKSB7Ci0gICAgICAgICAgICBjb2xsZWN0aW9uLmFkZCh2YWx1ZSk7CisgICAgICAgICAgICBUcmFpdHM6OmFkZChjb2xsZWN0aW9uLCB2YWx1ZSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgZnJlZShsaXRlcmFsKTsKQEAgLTE4MSw3ICsxNjAsNyBAQAogICAgIGZvciAoY29uc3QgY2hhciAqY3N0ciA9IHN0cnRvayhsaXRlcmFsLCBkZWwpOyBjc3RyICE9IE5VTEw7IGNzdHIgPSBzdHJ0b2soTlVMTCwgZGVsKSkgewogICAgICAgICB0eXBlbmFtZSBUcmFpdHM6OlR5cGUgdmFsdWU7CiAgICAgICAgIGlmIChmcm9tU3RyaW5nKGNzdHIsIHZhbHVlKSkgewotICAgICAgICAgICAgY29sbGVjdGlvbi5hZGQodmFsdWUpOworICAgICAgICAgICAgVHJhaXRzOjphZGQoY29sbGVjdGlvbiwgdmFsdWUpOwogICAgICAgICB9CiAgICAgfQogICAgIGZyZWUobGl0ZXJhbCk7CkBAIC0yMzQsNiArMjEzLDcgQEAKIHR5cGVkZWYgVHlwZUNvbnZlcnRlcjxBdWRpb0NvbnRlbnRUcmFpdHM+IEF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI7CiB0eXBlZGVmIFR5cGVDb252ZXJ0ZXI8VXNhZ2VUcmFpdHM+IFVzYWdlVHlwZUNvbnZlcnRlcjsKIHR5cGVkZWYgVHlwZUNvbnZlcnRlcjxTb3VyY2VUcmFpdHM+IFNvdXJjZVR5cGVDb252ZXJ0ZXI7Cit0eXBlZGVmIFR5cGVDb252ZXJ0ZXI8QXVkaW9GbGFnVHJhaXRzPiBBdWRpb0ZsYWdDb252ZXJ0ZXI7CiAKIHRlbXBsYXRlPD4gY29uc3QgT3V0cHV0RGV2aWNlQ29udmVydGVyOjpUYWJsZSBPdXRwdXREZXZpY2VDb252ZXJ0ZXI6Om1UYWJsZVtdOwogdGVtcGxhdGU8PiBjb25zdCBJbnB1dERldmljZUNvbnZlcnRlcjo6VGFibGUgSW5wdXREZXZpY2VDb252ZXJ0ZXI6Om1UYWJsZVtdOwpAQCAtMjQ5LDYgKzIyOSw3IEBACiB0ZW1wbGF0ZTw+IGNvbnN0IEF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI6OlRhYmxlIEF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdOwogdGVtcGxhdGU8PiBjb25zdCBVc2FnZVR5cGVDb252ZXJ0ZXI6OlRhYmxlIFVzYWdlVHlwZUNvbnZlcnRlcjo6bVRhYmxlW107CiB0ZW1wbGF0ZTw+IGNvbnN0IFNvdXJjZVR5cGVDb252ZXJ0ZXI6OlRhYmxlIFNvdXJjZVR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdOwordGVtcGxhdGU8PiBjb25zdCBBdWRpb0ZsYWdDb252ZXJ0ZXI6OlRhYmxlIEF1ZGlvRmxhZ0NvbnZlcnRlcjo6bVRhYmxlW107CiAKIGJvb2wgZGV2aWNlRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgbGl0ZXJhbERldmljZSwgYXVkaW9fZGV2aWNlc190JiBkZXZpY2UpOwogCkBAIC0yNzQsNiArMjU1LDY5IEBACiBPdXRwdXRDaGFubmVsVHJhaXRzOjpDb2xsZWN0aW9uIG91dHB1dENoYW5uZWxNYXNrc0Zyb21TdHJpbmcoCiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZvdXRDaGFubmVscywgY29uc3QgY2hhciAqZGVsID0gQXVkaW9QYXJhbWV0ZXI6OnZhbHVlTGlzdFNlcGFyYXRvcik7CiAKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoYXVkaW9fdXNhZ2VfdCB1c2FnZSkKK3sKKyAgICBzdGQ6OnN0cmluZyB1c2FnZUxpdGVyYWw7CisgICAgaWYgKCFhbmRyb2lkOjpVc2FnZVR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKHVzYWdlLCB1c2FnZUxpdGVyYWwpKSB7CisgICAgICAgIEFMT0dWKCJmYWlsZWQgdG8gY29udmVydCB1c2FnZTogJWQiLCB1c2FnZSk7CisgICAgICAgIHJldHVybiAiQVVESU9fVVNBR0VfVU5LTk9XTiI7CisgICAgfQorICAgIHJldHVybiB1c2FnZUxpdGVyYWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoYXVkaW9fY29udGVudF90eXBlX3QgY29udGVudCkKK3sKKyAgICBzdGQ6OnN0cmluZyBjb250ZW50TGl0ZXJhbDsKKyAgICBpZiAoIWFuZHJvaWQ6OkF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKGNvbnRlbnQsIGNvbnRlbnRMaXRlcmFsKSkgeworICAgICAgICBBTE9HVigiZmFpbGVkIHRvIGNvbnZlcnQgY29udGVudCB0eXBlOiAlZCIsIGNvbnRlbnQpOworICAgICAgICByZXR1cm4gIkFVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOIjsKKyAgICB9CisgICAgcmV0dXJuIGNvbnRlbnRMaXRlcmFsOworfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIHN0ZDo6c3RyaW5nIHN0cmVhbUxpdGVyYWw7CisgICAgaWYgKCFhbmRyb2lkOjpTdHJlYW1UeXBlQ29udmVydGVyOjp0b1N0cmluZyhzdHJlYW0sIHN0cmVhbUxpdGVyYWwpKSB7CisgICAgICAgIEFMT0dWKCJmYWlsZWQgdG8gY29udmVydCBzdHJlYW06ICVkIiwgc3RyZWFtKTsKKyAgICAgICAgcmV0dXJuICJBVURJT19TVFJFQU1fREVGQVVMVCI7CisgICAgfQorICAgIHJldHVybiBzdHJlYW1MaXRlcmFsOworfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKK3sKKyAgICBzdGQ6OnN0cmluZyBzb3VyY2VMaXRlcmFsOworICAgIGlmICghYW5kcm9pZDo6U291cmNlVHlwZUNvbnZlcnRlcjo6dG9TdHJpbmcoc291cmNlLCBzb3VyY2VMaXRlcmFsKSkgeworICAgICAgICBBTE9HVigiZmFpbGVkIHRvIGNvbnZlcnQgc291cmNlOiAlZCIsIHNvdXJjZSk7CisgICAgICAgIHJldHVybiAiQVVESU9fU09VUkNFX0RFRkFVTFQiOworICAgIH0KKyAgICByZXR1cm4gc291cmNlTGl0ZXJhbDsKK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMpCit7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlc3VsdDsKKyAgICByZXN1bHQgPDwgInsgQ29udGVudCB0eXBlOiAiIDw8IHRvU3RyaW5nKGF0dHJpYnV0ZXMuY29udGVudF90eXBlKQorICAgICAgICAgICA8PCAiIFVzYWdlOiAiIDw8IHRvU3RyaW5nKGF0dHJpYnV0ZXMudXNhZ2UpCisgICAgICAgICAgIDw8ICIgU291cmNlOiAiIDw8IHRvU3RyaW5nKGF0dHJpYnV0ZXMuc291cmNlKQorICAgICAgICAgICA8PCAiIEZsYWdzOiAiIDw8IGF0dHJpYnV0ZXMuZmxhZ3MKKyAgICAgICAgICAgPDwgIiBUYWdzOiAiIDw8IGF0dHJpYnV0ZXMudGFncworICAgICAgICAgICA8PCAiIH0iOworCisgICAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhhdWRpb19tb2RlX3QgbW9kZSkKK3sKKyAgICBzdGQ6OnN0cmluZyBtb2RlTGl0ZXJhbDsKKyAgICBpZiAoIWFuZHJvaWQ6OkF1ZGlvTW9kZUNvbnZlcnRlcjo6dG9TdHJpbmcobW9kZSwgbW9kZUxpdGVyYWwpKSB7CisgICAgICAgIEFMT0dWKCJmYWlsZWQgdG8gY29udmVydCBtb2RlOiAlZCIsIG1vZGUpOworICAgICAgICByZXR1cm4gIkFVRElPX01PREVfSU5WQUxJRCI7CisgICAgfQorICAgIHJldHVybiBtb2RlTGl0ZXJhbDsKK30KKwogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvKkFORFJPSURfVFlQRV9DT05WRVJURVJfSF8qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaAppbmRleCBkOGIwZmU3Li4zM2JlNTU5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaApAQCAtNjcsNyArNjcsNyBAQAogICAgIE9VVFBVVF9GT1JNQVRfQUFDX0FEVFMgPSA2LAogCiAgICAgT1VUUFVUX0ZPUk1BVF9BVURJT19PTkxZX0VORCA9IDcsIC8vIFVzZWQgaW4gdmFsaWRhdGluZyB0aGUgb3V0cHV0IGZvcm1hdC4gIFNob3VsZCBiZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIGF0IHRoZSBlbmQgb2YgdGhlIGF1ZGlvIG9ubHkgb3V0cHV0IGZvcm1hdHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIGF1ZGlvIG9ubHkgb3V0cHV0IGZvcm1hdHMuCiAKICAgICAvKiBTdHJlYW0gb3ZlciBhIHNvY2tldCwgbGltaXRlZCB0byBhIHNpbmdsZSBzdHJlYW0gKi8KICAgICBPVVRQVVRfRk9STUFUX1JUUF9BVlAgPSA3LApAQCAtODEsNiArODEsOSBAQAogICAgIC8qIEhFSUMgZGF0YSBpbiBhIEhFSUYgY29udGFpbmVyICovCiAgICAgT1VUUFVUX0ZPUk1BVF9IRUlGID0gMTAsCiAKKyAgICAvKiBPcHVzIGRhdGEgaW4gYSBPR0cgY29udGFpbmVyICovCisgICAgT1VUUFVUX0ZPUk1BVF9PR0cgPSAxMSwKKwogICAgIE9VVFBVVF9GT1JNQVRfTElTVF9FTkQgLy8gbXVzdCBiZSBsYXN0IC0gdXNlZCB0byB2YWxpZGF0ZSBmb3JtYXQgdHlwZQogfTsKIApAQCAtOTIsNiArOTUsNyBAQAogICAgIEFVRElPX0VOQ09ERVJfSEVfQUFDID0gNCwKICAgICBBVURJT19FTkNPREVSX0FBQ19FTEQgPSA1LAogICAgIEFVRElPX0VOQ09ERVJfVk9SQklTID0gNiwKKyAgICBBVURJT19FTkNPREVSX09QVVMgPSA3LAogCiAgICAgQVVESU9fRU5DT0RFUl9MSVNUX0VORCAvLyBtdXN0IGJlIHRoZSBsYXN0IC0gdXNlZCB0byB2YWxpZGF0ZSB0aGUgYXVkaW8gZW5jb2RlciB0eXBlCiB9OwpAQCAtMTExLDkgKzExNSw2IEBACiAgKiBUaGUgc3RhdGUgbWFjaGluZSBvZiB0aGUgbWVkaWFfcmVjb3JkZXIuCiAgKi8KIGVudW0gbWVkaWFfcmVjb3JkZXJfc3RhdGVzIHsKLSAgICAvLyBFcnJvciBzdGF0ZS4KLSAgICBNRURJQV9SRUNPUkRFUl9FUlJPUiAgICAgICAgICAgICAgICAgPSAgICAgIDAsCi0KICAgICAvLyBSZWNvcmRlciB3YXMganVzdCBjcmVhdGVkLgogICAgIE1FRElBX1JFQ09SREVSX0lETEUgICAgICAgICAgICAgICAgICA9IDEgPDwgMCwKIApAQCAtMTI4LDYgKzEyOSw5IEBACiAKICAgICAvLyBSZWNvcmRpbmcgaXMgaW4gcHJvZ3Jlc3MuCiAgICAgTUVESUFfUkVDT1JERVJfUkVDT1JESU5HICAgICAgICAgICAgID0gMSA8PCA0LAorCisgICAgLy8gRXJyb3Igc3RhdGUuCisgICAgTUVESUFfUkVDT1JERVJfRVJST1IgICAgICAgICAgICAgICAgID0gMSA8PCA1LAogfTsKIAogLy8gVGhlICJtc2ciIGNvZGUgcGFzc2VkIHRvIHRoZSBsaXN0ZW5lciBpbiBub3RpZnkuCkBAIC0yNjAsNiArMjY0LDcgQEAKICAgICBzdGF0dXNfdCAgICBnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90ICpkZXZpY2VJZCk7CiAgICAgc3RhdHVzX3QgICAgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpOwogICAgIHN0YXR1c190ICAgIGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKTsKKyAgICBzdGF0dXNfdCAgICBnZXRQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBkb0NsZWFuVXAoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL21lZGlhcmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKaW5kZXggOTJjZmIxYy4uZDA3ZTcwMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKQEAgLTg0Miw0ICs4NDIsMTUgQEAKICAgICByZXR1cm4gbU1lZGlhUmVjb3JkZXItPmdldEFjdGl2ZU1pY3JvcGhvbmVzKGFjdGl2ZU1pY3JvcGhvbmVzKTsKIH0KIAorc3RhdHVzX3QgTWVkaWFSZWNvcmRlcjo6Z2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgY29uc3QKK3sKKyAgICBBTE9HVigiZ2V0UG9ydElkIik7CisKKyAgICBpZiAobU1lZGlhUmVjb3JkZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgibWVkaWEgcmVjb3JkZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHJldHVybiBtTWVkaWFSZWNvcmRlci0+Z2V0UG9ydElkKHBvcnRJZCk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9BbmRyb2lkLmJwCmluZGV4IGI0M2I4ZjYuLjQ3NThjZDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvQW5kcm9pZC5icApAQCAtMTQsMjUgKzE0LDM4IEBACiAgICAgICAgICItV2FsbCIsCiAgICAgXSwKIAorICAgIHN0YXRpYzogeworICAgICAgICBjZmxhZ3M6IFsKKyAgICAgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICAgICAiLVdhbGwiLAorICAgICAgICAgICAgIi1ETk9fSU1FTU9SWSIsCisgICAgICAgIF0sCisgICAgfSwKKwogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICBdLAogCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgIF0sCisKICAgICBzcmNzOiBbCiAgICAgICAgICJEYXRhU291cmNlQmFzZS5jcHAiLAogICAgICAgICAiTWVkaWFCdWZmZXIuY3BwIiwKICAgICAgICAgIk1lZGlhQnVmZmVyQmFzZS5jcHAiLAogICAgICAgICAiTWVkaWFCdWZmZXJHcm91cC5jcHAiLAogICAgICAgICAiTWVkaWFTb3VyY2UuY3BwIiwKLSAgICAgICAgIk1lZGlhVHJhY2suY3BwIiwKLSAgICAgICAgIk1lZGlhRXh0cmFjdG9yLmNwcCIsCiAgICAgICAgICJNZXRhRGF0YS5jcHAiLAogICAgICAgICAiTWV0YURhdGFCYXNlLmNwcCIsCi0gICAgICAgICJWb3JiaXNDb21tZW50LmNwcCIsCiAgICAgXSwKIAogICAgIGNsYW5nOiB0cnVlLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFCdWZmZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFCdWZmZXIuY3BwCmluZGV4IGQxOTdiM2YuLmJhYjNhMDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhQnVmZmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlci5jcHAKQEAgLTM5LDggKzM5LDcgQEAKICAgICAgIG1SYW5nZU9mZnNldCgwKSwKICAgICAgIG1SYW5nZUxlbmd0aChzaXplKSwKICAgICAgIG1Pd25zRGF0YShmYWxzZSksCi0gICAgICBtTWV0YURhdGEobmV3IE1ldGFEYXRhQmFzZSksCi0gICAgICBtT3JpZ2luYWwoTlVMTCkgeworICAgICAgbU1ldGFEYXRhKG5ldyBNZXRhRGF0YUJhc2UpIHsKIH0KIAogTWVkaWFCdWZmZXI6Ok1lZGlhQnVmZmVyKHNpemVfdCBzaXplKQpAQCAtNTEsMTEgKzUwLDEzIEBACiAgICAgICBtUmFuZ2VPZmZzZXQoMCksCiAgICAgICBtUmFuZ2VMZW5ndGgoc2l6ZSksCiAgICAgICBtT3duc0RhdGEodHJ1ZSksCi0gICAgICBtTWV0YURhdGEobmV3IE1ldGFEYXRhQmFzZSksCi0gICAgICBtT3JpZ2luYWwoTlVMTCkgeworICAgICAgbU1ldGFEYXRhKG5ldyBNZXRhRGF0YUJhc2UpIHsKKyNpZm5kZWYgTk9fSU1FTU9SWQogICAgIGlmIChzaXplIDwga1NoYXJlZE1lbVRocmVzaG9sZAogICAgICAgICAgICAgfHwgc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCgmbVVzZVNoYXJlZE1lbW9yeSwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCkgPT0gMCkgeworI2VuZGlmCiAgICAgICAgIG1EYXRhID0gbWFsbG9jKHNpemUpOworI2lmbmRlZiBOT19JTUVNT1JZCiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1YoImNyZWF0aW5nIG1lbW9yeURlYWxlciIpOwogICAgICAgICBzcDxNZW1vcnlEZWFsZXI+IG1lbW9yeURlYWxlciA9CkBAIC03Myw2ICs3NCw3IEBACiAgICAgICAgICAgICBBTE9HVigiQWxsb2NhdGVkIHNoYXJlZCBtZW0gYnVmZmVyIG9mIHNpemUgJXp1IEAgJXAiLCBzaXplLCBtRGF0YSk7CiAgICAgICAgIH0KICAgICB9CisjZW5kaWYKIH0KIAogTWVkaWFCdWZmZXI6Ok1lZGlhQnVmZmVyKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpCkBAIC04NCw4ICs4Niw3IEBACiAgICAgICBtUmFuZ2VMZW5ndGgobVNpemUpLAogICAgICAgbUJ1ZmZlcihidWZmZXIpLAogICAgICAgbU93bnNEYXRhKGZhbHNlKSwKLSAgICAgIG1NZXRhRGF0YShuZXcgTWV0YURhdGFCYXNlKSwKLSAgICAgIG1PcmlnaW5hbChOVUxMKSB7CisgICAgICBtTWV0YURhdGEobmV3IE1ldGFEYXRhQmFzZSkgewogfQogCiB2b2lkIE1lZGlhQnVmZmVyOjpyZWxlYXNlKCkgewpAQCAtMTYyLDExICsxNjMsNiBAQAogICAgICAgICBtRGF0YSA9IE5VTEw7CiAgICAgfQogCi0gICAgaWYgKG1PcmlnaW5hbCAhPSBOVUxMKSB7Ci0gICAgICAgIG1PcmlnaW5hbC0+cmVsZWFzZSgpOwotICAgICAgICBtT3JpZ2luYWwgPSBOVUxMOwotICAgIH0KLQogICAgaWYgKG1NZW1vcnkuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgIGdldFNoYXJlZENvbnRyb2woKS0+c2V0RGVhZE9iamVjdCgpOwogICAgfQpAQCAtMTc4LDE1ICsxNzQsNCBAQAogICAgIG1PYnNlcnZlciA9IG9ic2VydmVyOwogfQogCi1NZWRpYUJ1ZmZlckJhc2UgKk1lZGlhQnVmZmVyOjpjbG9uZSgpIHsKLSAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKG1EYXRhLCBtU2l6ZSk7Ci0gICAgYnVmZmVyLT5zZXRfcmFuZ2UobVJhbmdlT2Zmc2V0LCBtUmFuZ2VMZW5ndGgpOwotICAgIGJ1ZmZlci0+bU1ldGFEYXRhID0gbmV3IE1ldGFEYXRhQmFzZSgqbU1ldGFEYXRhKTsKLQotICAgIGFkZF9yZWYoKTsKLSAgICBidWZmZXItPm1PcmlnaW5hbCA9IHRoaXM7Ci0KLSAgICByZXR1cm4gYnVmZmVyOwotfQotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFCdWZmZXJHcm91cC5jcHAgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlckdyb3VwLmNwcAppbmRleCAyYThkZDQxLi44NGZmOWE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlckdyb3VwLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlckdyb3VwLmNwcApAQCAtNDQsMTIgKzQ0LDE2IEBACiB9OwogCiBNZWRpYUJ1ZmZlckdyb3VwOjpNZWRpYUJ1ZmZlckdyb3VwKHNpemVfdCBncm93dGhMaW1pdCkKLSAgICA6IG1JbnRlcm5hbChuZXcgSW50ZXJuYWxEYXRhKCkpIHsKKyAgICA6IG1XcmFwcGVyKG51bGxwdHIpLCBtSW50ZXJuYWwobmV3IEludGVybmFsRGF0YSgpKSB7CiAgICAgbUludGVybmFsLT5tR3Jvd3RoTGltaXQgPSBncm93dGhMaW1pdDsKIH0KIAogTWVkaWFCdWZmZXJHcm91cDo6TWVkaWFCdWZmZXJHcm91cChzaXplX3QgYnVmZmVycywgc2l6ZV90IGJ1ZmZlcl9zaXplLCBzaXplX3QgZ3Jvd3RoTGltaXQpCi0gICAgOiBtSW50ZXJuYWwobmV3IEludGVybmFsRGF0YSgpKSB7CisgICAgOiBtV3JhcHBlcihudWxscHRyKSwgbUludGVybmFsKG5ldyBJbnRlcm5hbERhdGEoKSkgeworICAgIGluaXQoYnVmZmVycywgYnVmZmVyX3NpemUsIGdyb3d0aExpbWl0KTsKK30KKwordm9pZCBNZWRpYUJ1ZmZlckdyb3VwOjppbml0KHNpemVfdCBidWZmZXJzLCBzaXplX3QgYnVmZmVyX3NpemUsIHNpemVfdCBncm93dGhMaW1pdCkgewogICAgIG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0ID0gZ3Jvd3RoTGltaXQ7CiAKICAgICBpZiAobUludGVybmFsLT5tR3Jvd3RoTGltaXQgPiAwICYmIGJ1ZmZlcnMgPiBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCkgewpAQCAtNTgsNiArNjIsNyBAQAogICAgICAgICBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCA9IGJ1ZmZlcnM7CiAgICAgfQogCisjaWZuZGVmIE5PX0lNRU1PUlkKICAgICBpZiAoYnVmZmVyX3NpemUgPj0ga1NoYXJlZE1lbW9yeVRocmVzaG9sZCkgewogICAgICAgICBBTE9HRCgiY3JlYXRpbmcgTWVtb3J5RGVhbGVyIik7CiAgICAgICAgIC8vIFVzaW5nIGEgc2luZ2xlIE1lbW9yeURlYWxlciBpcyBlZmZpY2llbnQgZm9yIGEgZ3JvdXAgb2Ygc2hhcmVkIG1lbW9yeSBvYmplY3RzLgpAQCAtODAsNiArODUsOSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybjsKICAgICB9CisjZWxzZQorICAgICh2b2lkKWtTaGFyZWRNZW1vcnlUaHJlc2hvbGQ7CisjZW5kaWYKIAogICAgIC8vIE5vbi1zaGFyZWQgbWVtb3J5IGFsbG9jYXRpb24uCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBidWZmZXJzOyArK2kpIHsKQEAgLTExNyw2ICsxMjUsNyBAQAogICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICB9CiAgICAgZGVsZXRlIG1JbnRlcm5hbDsKKyAgICBkZWxldGUgbVdyYXBwZXI7CiB9CiAKIHZvaWQgTWVkaWFCdWZmZXJHcm91cDo6YWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgewpAQCAtMTU3LDExICsxNjYsMTUgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUludGVybmFsLT5tTG9jayk7CiAgICAgZm9yICg7OykgewogICAgICAgICBzaXplX3Qgc21hbGxlc3QgPSByZXF1ZXN0ZWRTaXplOworICAgICAgICBzaXplX3QgYmlnZ2VzdCA9IHJlcXVlc3RlZFNpemU7CiAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyID0gbnVsbHB0cjsKICAgICAgICAgYXV0byBmcmVlID0gbUludGVybmFsLT5tQnVmZmVycy5lbmQoKTsKICAgICAgICAgZm9yIChhdXRvIGl0ID0gbUludGVybmFsLT5tQnVmZmVycy5iZWdpbigpOyBpdCAhPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBjb25zdCBzaXplX3Qgc2l6ZSA9ICgqaXQpLT5zaXplKCk7CisgICAgICAgICAgICBpZiAoc2l6ZSA+IGJpZ2dlc3QpIHsKKyAgICAgICAgICAgICAgICBiaWdnZXN0ID0gc2l6ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICgoKml0KS0+cmVmY291bnQoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHNpemUgPSAoKml0KS0+c2l6ZSgpOwogICAgICAgICAgICAgICAgIGlmIChzaXplID49IHJlcXVlc3RlZFNpemUpIHsKICAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gKml0OwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTE3Niw3ICsxODksOCBAQAogICAgICAgICAgICAgICAgICYmIChmcmVlICE9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW5kKCkKICAgICAgICAgICAgICAgICAgICAgfHwgbUludGVybmFsLT5tQnVmZmVycy5zaXplKCkgPCBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCkpIHsKICAgICAgICAgICAgIC8vIFdlIGFsbG9jIGJlZm9yZSB3ZSBmcmVlIHNvIGZhaWx1cmUgbGVhdmVzIGdyb3VwIHVuY2hhbmdlZC4KLSAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhbGxvY2F0ZVNpemUgPSByZXF1ZXN0ZWRTaXplIDwgU0laRV9NQVggLyAzICogMiAvKiBOQjogb3JkZXJpbmcgKi8gPworICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jYXRlU2l6ZSA9IHJlcXVlc3RlZFNpemUgPT0gMCA/IGJpZ2dlc3QgOgorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRTaXplIDwgU0laRV9NQVggLyAzICogMiAvKiBOQjogb3JkZXJpbmcgKi8gPwogICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRTaXplICogMyAvIDIgOiByZXF1ZXN0ZWRTaXplOwogICAgICAgICAgICAgYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKGFsbG9jYXRlU2l6ZSk7CiAgICAgICAgICAgICBpZiAoYnVmZmVyLT5kYXRhKCkgPT0gbnVsbHB0cikgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmIzZGM5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIk1lZGlhRXh0cmFjdG9yIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHB3ZC5oPgotCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotTWVkaWFFeHRyYWN0b3I6Ok1lZGlhRXh0cmFjdG9yKCkgewotICAgIGlmICghTE9HX05ERUJVRykgewotICAgICAgICB1aWRfdCB1aWQgPSBnZXR1aWQoKTsKLSAgICAgICAgc3RydWN0IHBhc3N3ZCAqcHcgPSBnZXRwd3VpZCh1aWQpOwotICAgICAgICBBTE9HVigiZXh0cmFjdG9yIGNyZWF0ZWQgaW4gdWlkOiAlZCAoJXMpIiwgZ2V0dWlkKCksIHB3LT5wd19uYW1lKTsKLSAgICB9Ci19Ci0KLU1lZGlhRXh0cmFjdG9yOjp+TWVkaWFFeHRyYWN0b3IoKSB7fQotCi11aW50MzJfdCBNZWRpYUV4dHJhY3Rvcjo6ZmxhZ3MoKSBjb25zdCB7Ci0gICAgcmV0dXJuIENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9QQVVTRSB8IENBTl9TRUVLOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFUcmFjay5jcHAgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYVRyYWNrLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk2M2Y1OC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYVRyYWNrLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLU1lZGlhVHJhY2s6Ok1lZGlhVHJhY2soKSB7fQotCi1NZWRpYVRyYWNrOjp+TWVkaWFUcmFjaygpIHt9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLU1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpSZWFkT3B0aW9ucygpIHsKLSAgICByZXNldCgpOwotfQotCi12b2lkIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpyZXNldCgpIHsKLSAgICBtT3B0aW9ucyA9IDA7Ci0gICAgbVNlZWtUaW1lVXMgPSAwOwotICAgIG1Ob25CbG9ja2luZyA9IGZhbHNlOwotfQotCi12b2lkIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpzZXROb25CbG9ja2luZygpIHsKLSAgICBtTm9uQmxvY2tpbmcgPSB0cnVlOwotfQotCi12b2lkIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpjbGVhck5vbkJsb2NraW5nKCkgewotICAgIG1Ob25CbG9ja2luZyA9IGZhbHNlOwotfQotCi1ib29sIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpnZXROb25CbG9ja2luZygpIGNvbnN0IHsKLSAgICByZXR1cm4gbU5vbkJsb2NraW5nOwotfQotCi12b2lkIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpzZXRTZWVrVG8oaW50NjRfdCB0aW1lX3VzLCBTZWVrTW9kZSBtb2RlKSB7Ci0gICAgbU9wdGlvbnMgfD0ga1NlZWtUb19PcHRpb247Ci0gICAgbVNlZWtUaW1lVXMgPSB0aW1lX3VzOwotICAgIG1TZWVrTW9kZSA9IG1vZGU7Ci19Ci0KLXZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OmNsZWFyU2Vla1RvKCkgewotICAgIG1PcHRpb25zICY9IH5rU2Vla1RvX09wdGlvbjsKLSAgICBtU2Vla1RpbWVVcyA9IDA7Ci0gICAgbVNlZWtNb2RlID0gU0VFS19DTE9TRVNUX1NZTkM7Ci19Ci0KLWJvb2wgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OmdldFNlZWtUbygKLSAgICAgICAgaW50NjRfdCAqdGltZV91cywgU2Vla01vZGUgKm1vZGUpIGNvbnN0IHsKLSAgICAqdGltZV91cyA9IG1TZWVrVGltZVVzOwotICAgICptb2RlID0gbVNlZWtNb2RlOwotICAgIHJldHVybiAobU9wdGlvbnMgJiBrU2Vla1RvX09wdGlvbikgIT0gMDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL1ZvcmJpc0NvbW1lbnQuY3BwIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvVm9yYmlzQ29tbWVudC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYmFmNTEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvVm9yYmlzQ29tbWVudC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiVm9yYmlzQ29tbWVudCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIm1lZGlhL1ZvcmJpc0NvbW1lbnQuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgdm9pZCBleHRyYWN0QWxidW1BcnQoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAqZmlsZU1ldGEsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgQUxPR1YoImV4dHJhY3RBbGJ1bUFydCBmcm9tICclcyciLCAoY29uc3QgY2hhciAqKWRhdGEpOwotCi0gICAgc3A8QUJ1ZmZlcj4gZmxhY0J1ZmZlciA9IGRlY29kZUJhc2U2NChBU3RyaW5nKChjb25zdCBjaGFyICopZGF0YSwgc2l6ZSkpOwotICAgIGlmIChmbGFjQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIm1hbGZvcm1lZCBiYXNlNjQgZW5jb2RlZCBkYXRhLiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc2l6ZV90IGZsYWNTaXplID0gZmxhY0J1ZmZlci0+c2l6ZSgpOwotICAgIHVpbnQ4X3QgKmZsYWMgPSBmbGFjQnVmZmVyLT5kYXRhKCk7Ci0gICAgQUxPR1YoImdvdCBmbGFjIG9mIHNpemUgJXp1IiwgZmxhY1NpemUpOwotCi0gICAgdWludDMyX3QgcGljVHlwZTsKLSAgICB1aW50MzJfdCB0eXBlTGVuOwotICAgIHVpbnQzMl90IGRlc2NMZW47Ci0gICAgdWludDMyX3QgZGF0YUxlbjsKLSAgICBjaGFyIHR5cGVbMTI4XTsKLQotICAgIGlmIChmbGFjU2l6ZSA8IDgpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHBpY1R5cGUgPSBVMzJfQVQoZmxhYyk7Ci0KLSAgICBpZiAocGljVHlwZSAhPSAzKSB7Ci0gICAgICAgIC8vIFRoaXMgaXMgbm90IGEgZnJvbnQgY292ZXIuCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB0eXBlTGVuID0gVTMyX0FUKCZmbGFjWzRdKTsKLSAgICBpZiAodHlwZUxlbiA+IHNpemVvZih0eXBlKSAtIDEpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZCBhYm92ZSB0aGF0IGZsYWNTaXplID49IDgKLSAgICBpZiAoZmxhY1NpemUgLSA4IDwgdHlwZUxlbikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbWVtY3B5KHR5cGUsICZmbGFjWzhdLCB0eXBlTGVuKTsKLSAgICB0eXBlW3R5cGVMZW5dID0gJ1wwJzsKLQotICAgIEFMT0dWKCJwaWNUeXBlID0gJWQsIHR5cGUgPSAnJXMnIiwgcGljVHlwZSwgdHlwZSk7Ci0KLSAgICBpZiAoIXN0cmNtcCh0eXBlLCAiLS0+IikpIHsKLSAgICAgICAgLy8gVGhpcyBpcyBub3QgaW5saW5lIGNvdmVyIGFydCwgYnV0IGFuIGV4dGVybmFsIHVybCBpbnN0ZWFkLgotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGZsYWNTaXplIDwgMzIgfHwgZmxhY1NpemUgLSAzMiA8IHR5cGVMZW4pIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGRlc2NMZW4gPSBVMzJfQVQoJmZsYWNbOCArIHR5cGVMZW5dKTsKLSAgICBpZiAoZmxhY1NpemUgLSAzMiAtIHR5cGVMZW4gPCBkZXNjTGVuKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBkYXRhTGVuID0gVTMyX0FUKCZmbGFjWzggKyB0eXBlTGVuICsgNCArIGRlc2NMZW4gKyAxNl0pOwotCi0gICAgLy8gd2UndmUgYWxyZWFkeSBjaGVja2VkIGFib3ZlIHRoYXQgKGZsYWNTaXplIC0gMzIgLSB0eXBlTGVuIC0gZGVzY0xlbikgPj0gMAotICAgIGlmIChmbGFjU2l6ZSAtIDMyIC0gdHlwZUxlbiAtIGRlc2NMZW4gPCBkYXRhTGVuKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBTE9HVigiZ290IGltYWdlIGRhdGEsICV6dSB0cmFpbGluZyBieXRlcyIsCi0gICAgICAgICBmbGFjU2l6ZSAtIDMyIC0gdHlwZUxlbiAtIGRlc2NMZW4gLSBkYXRhTGVuKTsKLQotICAgIGZpbGVNZXRhLT5zZXREYXRhKAotICAgICAgICAgICAga0tleUFsYnVtQXJ0LCAwLCAmZmxhY1s4ICsgdHlwZUxlbiArIDQgKyBkZXNjTGVuICsgMjBdLCBkYXRhTGVuKTsKLQotICAgIGZpbGVNZXRhLT5zZXRDU3RyaW5nKGtLZXlBbGJ1bUFydE1JTUUsIHR5cGUpOwotfQotCi12b2lkIHBhcnNlVm9yYmlzQ29tbWVudCgKLSAgICAgICAgTWV0YURhdGFCYXNlICpmaWxlTWV0YSwgY29uc3QgY2hhciAqY29tbWVudCwgc2l6ZV90IGNvbW1lbnRMZW5ndGgpCi17Ci0gICAgc3RydWN0IHsKLSAgICAgICAgY29uc3QgY2hhciAqY29uc3QgbVRhZzsKLSAgICAgICAgdWludDMyX3QgbUtleTsKLSAgICB9IGtNYXBbXSA9IHsKLSAgICAgICAgeyAiVElUTEUiLCBrS2V5VGl0bGUgfSwKLSAgICAgICAgeyAiQVJUSVNUIiwga0tleUFydGlzdCB9LAotICAgICAgICB7ICJBTEJVTUFSVElTVCIsIGtLZXlBbGJ1bUFydGlzdCB9LAotICAgICAgICB7ICJBTEJVTSBBUlRJU1QiLCBrS2V5QWxidW1BcnRpc3QgfSwKLSAgICAgICAgeyAiQ09NUElMQVRJT04iLCBrS2V5Q29tcGlsYXRpb24gfSwKLSAgICAgICAgeyAiQUxCVU0iLCBrS2V5QWxidW0gfSwKLSAgICAgICAgeyAiQ09NUE9TRVIiLCBrS2V5Q29tcG9zZXIgfSwKLSAgICAgICAgeyAiR0VOUkUiLCBrS2V5R2VucmUgfSwKLSAgICAgICAgeyAiQVVUSE9SIiwga0tleUF1dGhvciB9LAotICAgICAgICB7ICJUUkFDS05VTUJFUiIsIGtLZXlDRFRyYWNrTnVtYmVyIH0sCi0gICAgICAgIHsgIkRJU0NOVU1CRVIiLCBrS2V5RGlzY051bWJlciB9LAotICAgICAgICB7ICJEQVRFIiwga0tleURhdGUgfSwKLSAgICAgICAgeyAiWUVBUiIsIGtLZXlZZWFyIH0sCi0gICAgICAgIHsgIkxZUklDSVNUIiwga0tleVdyaXRlciB9LAotICAgICAgICB7ICJNRVRBREFUQV9CTE9DS19QSUNUVVJFIiwga0tleUFsYnVtQXJ0IH0sCi0gICAgICAgIHsgIkFORFJPSURfTE9PUCIsIGtLZXlBdXRvTG9vcCB9LAotICAgIH07Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzaXplb2Yoa01hcCkgLyBzaXplb2Yoa01hcFswXSk7ICsraikgewotICAgICAgICAgICAgc2l6ZV90IHRhZ0xlbiA9IHN0cmxlbihrTWFwW2pdLm1UYWcpOwotICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcChrTWFwW2pdLm1UYWcsIGNvbW1lbnQsIHRhZ0xlbikKLSAgICAgICAgICAgICAgICAgICAgJiYgY29tbWVudFt0YWdMZW5dID09ICc9JykgewotICAgICAgICAgICAgICAgIGlmIChrTWFwW2pdLm1LZXkgPT0ga0tleUFsYnVtQXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGV4dHJhY3RBbGJ1bUFydCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTWV0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tbWVudFt0YWdMZW4gKyAxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50TGVuZ3RoIC0gdGFnTGVuIC0gMSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrTWFwW2pdLm1LZXkgPT0ga0tleUF1dG9Mb29wKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcCgmY29tbWVudFt0YWdMZW4gKyAxXSwgInRydWUiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU1ldGEtPnNldEludDMyKGtLZXlBdXRvTG9vcCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmaWxlTWV0YS0+c2V0Q1N0cmluZyhrTWFwW2pdLm1LZXksICZjb21tZW50W3RhZ0xlbiArIDFdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlLmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2UuaAppbmRleCAwZTU5ZjM5Li4xZjdhNDczIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2UuaApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KQEAgLTM0LDcgKzM1LDcgQEAKIAogY2xhc3MgRGF0YVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlQmFzZSwgcHVibGljIHZpcnR1YWwgUmVmQmFzZSB7CiBwdWJsaWM6Ci0gICAgRGF0YVNvdXJjZSgpIHt9CisgICAgRGF0YVNvdXJjZSgpIDogbVdyYXBwZXIoTlVMTCkge30KIAogICAgIC8vIHJldHVybnMgYSBwb2ludGVyIHRvIElEYXRhU291cmNlIGlmIGl0IGlzIHdyYXBwZWQuCiAgICAgdmlydHVhbCBzcDxJRGF0YVNvdXJjZT4gZ2V0SURhdGFTb3VyY2UoKSBjb25zdCB7CkBAIC02OSwxMCArNzAsMzUgQEAKICAgICAgICAgcmV0dXJuIFN0cmluZzgoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwogICAgIH0KIAorICAgIENEYXRhU291cmNlICp3cmFwKCkgeworICAgICAgICBpZiAobVdyYXBwZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBtV3JhcHBlcjsKKyAgICAgICAgfQorICAgICAgICBtV3JhcHBlciA9IG5ldyBDRGF0YVNvdXJjZSgpOworICAgICAgICBtV3JhcHBlci0+aGFuZGxlID0gdGhpczsKKworICAgICAgICBtV3JhcHBlci0+cmVhZEF0ID0gW10odm9pZCAqaGFuZGxlLCBvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIC0+IHNzaXplX3QgeworICAgICAgICAgICAgcmV0dXJuICgoRGF0YVNvdXJjZSopaGFuZGxlKS0+cmVhZEF0KG9mZnNldCwgZGF0YSwgc2l6ZSk7CisgICAgICAgIH07CisgICAgICAgIG1XcmFwcGVyLT5nZXRTaXplID0gW10odm9pZCAqaGFuZGxlLCBvZmY2NF90ICpzaXplKSAtPiBzdGF0dXNfdCB7CisgICAgICAgICAgICByZXR1cm4gKChEYXRhU291cmNlKiloYW5kbGUpLT5nZXRTaXplKHNpemUpOworICAgICAgICB9OworICAgICAgICBtV3JhcHBlci0+ZmxhZ3MgPSBbXSh2b2lkICpoYW5kbGUpIC0+IHVpbnQzMl90IHsKKyAgICAgICAgICAgIHJldHVybiAoKERhdGFTb3VyY2UqKWhhbmRsZSktPmZsYWdzKCk7CisgICAgICAgIH07CisgICAgICAgIG1XcmFwcGVyLT5nZXRVcmkgPSBbXSh2b2lkICpoYW5kbGUsIGNoYXIgKnVyaVN0cmluZywgc2l6ZV90IGJ1ZmZlclNpemUpIC0+IGJvb2wgeworICAgICAgICAgICAgcmV0dXJuICgoRGF0YVNvdXJjZSopaGFuZGxlKS0+Z2V0VXJpKHVyaVN0cmluZywgYnVmZmVyU2l6ZSk7CisgICAgICAgIH07CisgICAgICAgIHJldHVybiBtV3JhcHBlcjsKKyAgICB9CisKIHByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5EYXRhU291cmNlKCkge30KKyAgICB2aXJ0dWFsIH5EYXRhU291cmNlKCkgeworICAgICAgICBkZWxldGUgbVdyYXBwZXI7CisgICAgfQogCiBwcml2YXRlOgorICAgIENEYXRhU291cmNlICptV3JhcHBlcjsKICAgICBEYXRhU291cmNlKGNvbnN0IERhdGFTb3VyY2UgJik7CiAgICAgRGF0YVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IERhdGFTb3VyY2UgJik7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlQmFzZS5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlQmFzZS5oCmluZGV4IDUxOTkzZGEuLmFmNWI4M2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZUJhc2UuaAorKysgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VCYXNlLmgKQEAgLTY2LDYgKzY2LDEwIEBACiAKICAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSB7fTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXZhaWxhYmxlU2l6ZShvZmY2NF90IC8qb2Zmc2V0Ki8sIG9mZjY0X3QgKiAvKnNpemUqLykgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+RGF0YVNvdXJjZUJhc2UoKSB7fQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYTk4ZGEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3Rvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FRElBX0VYVFJBQ1RPUl9IXwotCi0jZGVmaW5lIE1FRElBX0VYVFJBQ1RPUl9IXwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGF0YVNvdXJjZUJhc2U7Ci1jbGFzcyBNZXRhRGF0YUJhc2U7Ci1zdHJ1Y3QgTWVkaWFUcmFjazsKLQotCi1jbGFzcyBFeHRyYWN0b3JBbGxvY1RyYWNrZXIgewotcHVibGljOgotICAgIEV4dHJhY3RvckFsbG9jVHJhY2tlcigpIHsKLSAgICAgICAgQUxPR0QoImV4dHJhY3RvciBhbGxvY2F0ZWQ6ICVwIiwgdGhpcyk7Ci0gICAgfQotICAgIHZpcnR1YWwgfkV4dHJhY3RvckFsbG9jVHJhY2tlcigpIHsKLSAgICAgICAgQUxPR0QoImV4dHJhY3RvciBmcmVlZDogJXAiLCB0aGlzKTsKLSAgICB9Ci19OwotCi0KLWNsYXNzIE1lZGlhRXh0cmFjdG9yCi0vLyA6IHB1YmxpYyBFeHRyYWN0b3JBbGxvY1RyYWNrZXIKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5NZWRpYUV4dHJhY3RvcigpOwotICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCkgPSAwOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KSA9IDA7Ci0KLSAgICBlbnVtIEdldFRyYWNrTWV0YURhdGFGbGFncyB7Ci0gICAgICAgIGtJbmNsdWRlRXh0ZW5zaXZlTWV0YURhdGEgPSAxCi0gICAgfTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgICAgICBNZXRhRGF0YUJhc2UmIG1ldGEsCi0gICAgICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzID0gMCkgPSAwOwotCi0gICAgLy8gUmV0dXJuIGNvbnRhaW5lciBzcGVjaWZpYyBtZXRhLWRhdGEuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCi0gICAgLy8gcmV0dXJucyBhbiBlbXB0eSBtZXRhZGF0YSBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpID0gMDsKLQotICAgIGVudW0gRmxhZ3MgewotICAgICAgICBDQU5fU0VFS19CQUNLV0FSRCAgPSAxLCAgLy8gdGhlICJzZWVrIDEwc2VjcyBiYWNrIGJ1dHRvbiIKLSAgICAgICAgQ0FOX1NFRUtfRk9SV0FSRCAgID0gMiwgIC8vIHRoZSAic2VlayAxMHNlY3MgZm9yd2FyZCBidXR0b24iCi0gICAgICAgIENBTl9QQVVTRSAgICAgICAgICA9IDQsCi0gICAgICAgIENBTl9TRUVLICAgICAgICAgICA9IDgsICAvLyB0aGUgInNlZWsgYmFyIgotICAgIH07Ci0KLSAgICAvLyBJZiBzdWJjbGFzc2VzIGRvIF9ub3RfIG92ZXJyaWRlIHRoaXMsIHRoZSBkZWZhdWx0IGlzCi0gICAgLy8gQ0FOX1NFRUtfQkFDS1dBUkQgfCBDQU5fU0VFS19GT1JXQVJEIHwgQ0FOX1NFRUsgfCBDQU5fUEFVU0UKLSAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IHVpbnQ4X3QqIC8qY2FzVG9rZW4qLywgc2l6ZV90IC8qc2l6ZSovKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIjx1bnNwZWNpZmllZD4iOyB9Ci0KLSAgICB0eXBlZGVmIE1lZGlhRXh0cmFjdG9yKiAoKkNyZWF0b3JGdW5jKSgKLSAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIHZvaWQgKm1ldGEpOwotICAgIHR5cGVkZWYgdm9pZCAoKkZyZWVNZXRhRnVuYykodm9pZCAqbWV0YSk7Ci0KLSAgICAvLyBUaGUgc25pZmZlciBjYW4gb3B0aW9uYWxseSBmaWxsIGluIGFuIG9wYXF1ZSBvYmplY3QsICJtZXRhIiwgdGhhdCBoZWxwcwotICAgIC8vIHRoZSBjb3JyZXNwb25kaW5nIGV4dHJhY3RvciBpbml0aWFsaXplIGl0cyBzdGF0ZSB3aXRob3V0IGR1cGxpY2F0aW5nCi0gICAgLy8gZWZmb3J0IGFscmVhZHkgZXhlcnRlZCBieSB0aGUgc25pZmZlci4gSWYgImZyZWVNZXRhIiBpcyBnaXZlbiwgaXQgd2lsbCBiZQotICAgIC8vIGNhbGxlZCBhZ2FpbnN0IHRoZSBvcGFxdWUgb2JqZWN0IHdoZW4gaXQgaXMgbm8gbG9uZ2VyIHVzZWQuCi0gICAgdHlwZWRlZiBDcmVhdG9yRnVuYyAoKlNuaWZmZXJGdW5jKSgKLSAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICAgICAgdm9pZCAqKm1ldGEsIEZyZWVNZXRhRnVuYyAqZnJlZU1ldGEpOwotCi0gICAgdHlwZWRlZiBzdHJ1Y3QgewotICAgICAgICBjb25zdCB1aW50OF90IGJbMTZdOwotICAgIH0gdXVpZF90OwotCi0gICAgdHlwZWRlZiBzdHJ1Y3QgewotICAgICAgICAvLyB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIHN0cnVjdHVyZQotICAgICAgICBjb25zdCB1aW50MzJfdCBkZWZfdmVyc2lvbjsKLQotICAgICAgICAvLyBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dHJhY3Rvci4KLSAgICAgICAgLy8gU2VlIGJlbG93IGZvciBhIGNvbnZlbmllbmNlIG1hY3JvIHRvIGNyZWF0ZSB0aGlzIGZyb20gYSBzdHJpbmcuCi0gICAgICAgIHV1aWRfdCBleHRyYWN0b3JfdXVpZDsKLQotICAgICAgICAvLyBWZXJzaW9uIG51bWJlciBvZiB0aGlzIGV4dHJhY3Rvci4gV2hlbiB0d28gZXh0cmFjdG9ycyB3aXRoIHRoZSBzYW1lCi0gICAgICAgIC8vIHV1aWQgYXJlIGVuY291bnRlcmVkLCB0aGUgb25lIHdpdGggdGhlIGxhcmdlc3QgdmVyc2lvbiBudW1iZXIgd2lsbAotICAgICAgICAvLyBiZSB1c2VkLgotICAgICAgICBjb25zdCB1aW50MzJfdCBleHRyYWN0b3JfdmVyc2lvbjsKLQotICAgICAgICAvLyBhIGh1bWFuIHJlYWRhYmxlIG5hbWUKLSAgICAgICAgY29uc3QgY2hhciAqZXh0cmFjdG9yX25hbWU7Ci0KLSAgICAgICAgLy8gdGhlIHNuaWZmZXIgZnVuY3Rpb24KLSAgICAgICAgY29uc3QgU25pZmZlckZ1bmMgc25pZmY7Ci0gICAgfSBFeHRyYWN0b3JEZWY7Ci0KLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgRVhUUkFDVE9SREVGX1ZFUlNJT04gPSAxOwotCi0gICAgdHlwZWRlZiBFeHRyYWN0b3JEZWYgKCpHZXRFeHRyYWN0b3JEZWYpKCk7Ci0KLXByb3RlY3RlZDoKLSAgICBNZWRpYUV4dHJhY3RvcigpOwotCi1wcml2YXRlOgotICAgIE1lZGlhRXh0cmFjdG9yKGNvbnN0IE1lZGlhRXh0cmFjdG9yICYpOwotICAgIE1lZGlhRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgTWVkaWFFeHRyYWN0b3IgJik7Ci19OwotCi0vLyBwdXJwb3NlbHkgbm90IGRlZmluZWQgYW55d2hlcmUgc28gdGhhdCB0aGlzIHdpbGwgZmFpbCB0byBsaW5rIGlmCi0vLyBleHByZXNzaW9ucyBiZWxvdyBhcmUgbm90IGV2YWx1YXRlZCBhdCBjb21waWxlIHRpbWUKLWludCBpbnZhbGlkX3V1aWRfc3RyaW5nKGNvbnN0IGNoYXIgKik7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KLWNvbnN0ZXhwciB1aW50OF90IF9kaWdpdEF0Xyhjb25zdCBUICgmcylbTl0sIGNvbnN0IHNpemVfdCBuKSB7Ci0gICAgcmV0dXJuIHNbbl0gPj0gJzAnICYmIHNbbl0gPD0gJzknID8gc1tuXSAtICcwJwotICAgICAgICAgICAgOiBzW25dID49ICdhJyAmJiBzW25dIDw9ICdmJyA/IHNbbl0gLSAnYScgKyAxMAotICAgICAgICAgICAgICAgICAgICA6IHNbbl0gPj0gJ0EnICYmIHNbbl0gPD0gJ0YnID8gc1tuXSAtICdBJyArIDEwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpbnZhbGlkX3V1aWRfc3RyaW5nKCJ1dWlkOiBiYWQgZGlnaXRzIik7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KLWNvbnN0ZXhwciB1aW50OF90IF9oZXhCeXRlQXRfKGNvbnN0IFQgKCZzKVtOXSwgc2l6ZV90IG4pIHsKLSAgICByZXR1cm4gKF9kaWdpdEF0XyhzLCBuKSA8PCA0KSArIF9kaWdpdEF0XyhzLCBuICsgMSk7Ci19Ci0KLWNvbnN0ZXhwciBib29sIF9hc3NlcnRJc0Rhc2hfKGNoYXIgYykgewotICAgIHJldHVybiBjID09ICctJyA/IHRydWUgOiBpbnZhbGlkX3V1aWRfc3RyaW5nKCJXcm9uZyBmb3JtYXQiKTsKLX0KLQotdGVtcGxhdGUgPHNpemVfdCBOPgotY29uc3RleHByIE1lZGlhRXh0cmFjdG9yOjp1dWlkX3QgY29uc3RVVUlEKGNvbnN0IGNoYXIgKCZzKSBbTl0pIHsKLSAgICBzdGF0aWNfYXNzZXJ0KE4gPT0gMzcsICJ1dWlkOiB3cm9uZyBsZW5ndGgiKTsKLSAgICByZXR1cm4KLSAgICAgICAgICAgIF9hc3NlcnRJc0Rhc2hfKHNbOF0pLAotICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1sxM10pLAotICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1sxOF0pLAotICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1syM10pLAotICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OnV1aWRfdCB7ewotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDApLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDIpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDQpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDYpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDkpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDExKSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAxNCksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMTYpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDE5KSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAyMSksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMjQpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDI2KSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAyOCksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMzApLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDMyKSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAzNCksCi0gICAgICAgICAgICB9fTsKLX0KLS8vIENvbnZlbmllbmNlIG1hY3JvIHRvIGNyZWF0ZSBhIHV1aWRfdCBmcm9tIGEgc3RyaW5nIGxpdGVyYWwsIHdoaWNoIHNob3VsZAotLy8gYmUgZm9ybWF0dGVkIGFzICIxMjM0NTY3OC0xMjM0LTEyMzQtMTIzNC0xMjM0NTY3ODlhYmMiLCBhcyBnZW5lcmF0ZWQgYnkKLS8vIGUuZy4gaHR0cHM6Ly93d3cudXVpZGdlbmVyYXRvci5uZXQvIG9yIHRoZSAndXVpZGdlbicgbGludXggY29tbWFuZC4KLS8vIEhleCBkaWdpdHMgbWF5IGJlIHVwcGVyIG9yIGxvd2VyIGNhc2UuCi0vLwotLy8gVGhlIG1hY3JvIGNhbGwgaXMgb3RoZXJ3aXNlIGVxdWl2YWxlbnQgdG8gc3BlY2lmeWluZyB0aGUgc3RydWN0dXJlIGRpcmVjdGx5Ci0vLyAoZS5nLiBVVUlEKCI3ZDYxMzg1OC01ODM3LTRhMzgtODRjNS0zMzJkMWNkZGVlMjciKSBpcyB0aGUgc2FtZSBhcwotLy8gICAgICAge3sweDdkLCAweDYxLCAweDM4LCAweDU4LCAweDU4LCAweDM3LCAweDRhLCAweDM4LAotLy8gICAgICAgICAweDg0LCAweGM1LCAweDMzLCAweDJkLCAweDFjLCAweGRkLCAweGVlLCAweDI3fX0pCi0KLSNkZWZpbmUgVVVJRChzdHIpIFtdeyBjb25zdGV4cHIgTWVkaWFFeHRyYWN0b3I6OnV1aWRfdCB1dWlkID0gY29uc3RVVUlEKHN0cik7IHJldHVybiB1dWlkOyB9KCkKLQotCi0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTUVESUFfRVhUUkFDVE9SX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2suaCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGVhNjFhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FRElBX1NPVVJDRV9CQVNFX0hfCi0KLSNkZWZpbmUgTUVESUFfU09VUkNFX0JBU0VfSF8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBNZWRpYUJ1ZmZlckJhc2U7Ci0KLWNsYXNzIFNvdXJjZUJhc2VBbGxvY1RyYWNrZXIgewotcHVibGljOgotICAgIFNvdXJjZUJhc2VBbGxvY1RyYWNrZXIoKSB7Ci0gICAgICAgIEFMT0dEKCJzb3VyY2ViYXNlIGFsbG9jYXRlZDogJXAiLCB0aGlzKTsKLSAgICB9Ci0gICAgdmlydHVhbCB+U291cmNlQmFzZUFsbG9jVHJhY2tlcigpIHsKLSAgICAgICAgQUxPR0QoInNvdXJjZWJhc2UgZnJlZWQ6ICVwIiwgdGhpcyk7Ci0gICAgfQotfTsKLQotc3RydWN0IE1lZGlhVHJhY2sKLS8vICAgIDogcHVibGljIFNvdXJjZUJhc2VBbGxvY1RyYWNrZXIKLXsKLSAgICBNZWRpYVRyYWNrKCk7Ci0KLSAgICAvLyBUbyBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciBtZXRob2RzIG9uIHRoaXMgb2JqZWN0LCBleGNlcHQKLSAgICAvLyBnZXRGb3JtYXQoKS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zID0gTlVMTCkgPSAwOwotCi0gICAgLy8gQW55IGJsb2NraW5nIHJlYWQgY2FsbCByZXR1cm5zIGltbWVkaWF0ZWx5IHdpdGggYSByZXN1bHQgb2YgTk9fSU5JVC4KLSAgICAvLyBJdCBpcyBhbiBlcnJvciB0byBjYWxsIGFueSBtZXRob2RzIG90aGVyIHRoYW4gc3RhcnQgYWZ0ZXIgdGhpcyBjYWxsCi0gICAgLy8gcmV0dXJucy4gQW55IGJ1ZmZlcnMgdGhlIG9iamVjdCBtYXkgYmUgaG9sZGluZyBvbnRvIGF0IHRoZSB0aW1lIG9mCi0gICAgLy8gdGhlIHN0b3AoKSBjYWxsIGFyZSByZWxlYXNlZC4KLSAgICAvLyBBbHNvLCBpdCBpcyBpbXBlcmF0aXZlIHRoYXQgYW55IGJ1ZmZlcnMgb3V0cHV0IGJ5IHRoaXMgb2JqZWN0IGFuZAotICAgIC8vIGhlbGQgb250byBieSBjYWxsZXJzIGJlIHJlbGVhc2VkIGJlZm9yZSBhIGNhbGwgdG8gc3RvcCgpICEhIQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpID0gMDsKLQotICAgIC8vIFJldHVybnMgdGhlIGZvcm1hdCBvZiB0aGUgZGF0YSBvdXRwdXQgYnkgdGhpcyBtZWRpYSB0cmFjay4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UmIGZvcm1hdCkgPSAwOwotCi0gICAgLy8gT3B0aW9ucyB0aGF0IG1vZGlmeSByZWFkKCkgYmVoYXZpb3VyLiBUaGUgZGVmYXVsdCBpcyB0bwotICAgIC8vIGEpIG5vdCByZXF1ZXN0IGEgc2VlawotICAgIC8vIGIpIG5vdCBiZSBsYXRlLCBpLmUuIGxhdGVuZXNzX3VzID0gMAotICAgIHN0cnVjdCBSZWFkT3B0aW9ucyB7Ci0gICAgICAgIGVudW0gU2Vla01vZGUgOiBpbnQzMl90IHsKLSAgICAgICAgICAgIFNFRUtfUFJFVklPVVNfU1lOQywKLSAgICAgICAgICAgIFNFRUtfTkVYVF9TWU5DLAotICAgICAgICAgICAgU0VFS19DTE9TRVNUX1NZTkMsCi0gICAgICAgICAgICBTRUVLX0NMT1NFU1QsCi0gICAgICAgICAgICBTRUVLX0ZSQU1FX0lOREVYLAotICAgICAgICB9OwotCi0gICAgICAgIFJlYWRPcHRpb25zKCk7Ci0KLSAgICAgICAgLy8gUmVzZXQgZXZlcnl0aGluZyBiYWNrIHRvIGRlZmF1bHRzLgotICAgICAgICB2b2lkIHJlc2V0KCk7Ci0KLSAgICAgICAgdm9pZCBzZXRTZWVrVG8oaW50NjRfdCB0aW1lX3VzLCBTZWVrTW9kZSBtb2RlID0gU0VFS19DTE9TRVNUX1NZTkMpOwotICAgICAgICB2b2lkIGNsZWFyU2Vla1RvKCk7Ci0gICAgICAgIGJvb2wgZ2V0U2Vla1RvKGludDY0X3QgKnRpbWVfdXMsIFNlZWtNb2RlICptb2RlKSBjb25zdDsKLQotICAgICAgICB2b2lkIHNldE5vbkJsb2NraW5nKCk7Ci0gICAgICAgIHZvaWQgY2xlYXJOb25CbG9ja2luZygpOwotICAgICAgICBib29sIGdldE5vbkJsb2NraW5nKCkgY29uc3Q7Ci0KLSAgICAgICAgLy8gVXNlZCB0byBjbGVhciBhbGwgbm9uLXBlcnNpc3RlbnQgb3B0aW9ucyBmb3IgbXVsdGlwbGUgYnVmZmVyIHJlYWRzLgotICAgICAgICB2b2lkIGNsZWFyTm9uUGVyc2lzdGVudCgpIHsKLSAgICAgICAgICAgIGNsZWFyU2Vla1RvKCk7Ci0gICAgICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGVudW0gT3B0aW9ucyB7Ci0gICAgICAgICAgICBrU2Vla1RvX09wdGlvbiAgICAgID0gMSwKLSAgICAgICAgfTsKLQotICAgICAgICB1aW50MzJfdCBtT3B0aW9uczsKLSAgICAgICAgaW50NjRfdCBtU2Vla1RpbWVVczsKLSAgICAgICAgU2Vla01vZGUgbVNlZWtNb2RlOwotICAgICAgICBib29sIG1Ob25CbG9ja2luZzsKLSAgICB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOyAvLyBzZW50IHRocm91Z2ggQmluZGVyCi0KLSAgICAvLyBSZXR1cm5zIGEgbmV3IGJ1ZmZlciBvZiBkYXRhLiBDYWxsIGJsb2NrcyB1bnRpbCBhCi0gICAgLy8gYnVmZmVyIGlzIGF2YWlsYWJsZSwgYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQgb2YgdGhlIGVuZCBvZiB0aGUgc3RyZWFtCi0gICAgLy8gaXMgcmVhY2hlZC4KLSAgICAvLyBFbmQgb2Ygc3RyZWFtIGlzIHNpZ25hbGxlZCBieSBhIHJlc3VsdCBvZiBFUlJPUl9FTkRfT0ZfU1RSRUFNLgotICAgIC8vIEEgcmVzdWx0IG9mIElORk9fRk9STUFUX0NIQU5HRUQgaW5kaWNhdGVzIHRoYXQgdGhlIGZvcm1hdCBvZiB0aGlzCi0gICAgLy8gTWVkaWFTb3VyY2UgaGFzIGNoYW5nZWQgbWlkLXN0cmVhbSwgdGhlIGNsaWVudCBjYW4gY29udGludWUgcmVhZGluZwotICAgIC8vIGJ1dCBzaG91bGQgYmUgcHJlcGFyZWQgZm9yIGJ1ZmZlcnMgb2YgdGhlIG5ldyBjb25maWd1cmF0aW9uLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIH5NZWRpYVRyYWNrKCk7Ci0KLXByaXZhdGU6Ci0gICAgTWVkaWFUcmFjayhjb25zdCBNZWRpYVRyYWNrICYpOwotICAgIE1lZGlhVHJhY2sgJm9wZXJhdG9yPShjb25zdCBNZWRpYVRyYWNrICYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBNRURJQV9TT1VSQ0VfQkFTRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9Wb3JiaXNDb21tZW50LmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL1ZvcmJpc0NvbW1lbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJhMzI5NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL1ZvcmJpc0NvbW1lbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLSNpZm5kZWYgVk9SQklTX0NPTU1FTlRfSF8KLSNkZWZpbmUgVk9SQklTX0NPTU1FTlRfSF8KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBNZXRhRGF0YUJhc2U7Ci0KLXZvaWQgcGFyc2VWb3JiaXNDb21tZW50KAotICAgICAgICBNZXRhRGF0YUJhc2UgKmZpbGVNZXRhLCBjb25zdCBjaGFyICpjb21tZW50LCBzaXplX3QgY29tbWVudExlbmd0aCk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBWT1JCSVNfQ09NTUVOVF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oCmluZGV4IDVhMjU5NjUuLmFjZTYzYWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmgKQEAgLTQ2LDEyICs0NiwxMyBAQAogICAgIGV4cGxpY2l0IE1lZGlhQnVmZmVyKHNpemVfdCBzaXplKTsKIAogICAgIGV4cGxpY2l0IE1lZGlhQnVmZmVyKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwotCisjaWZuZGVmIE5PX0lNRU1PUlkKICAgICBNZWRpYUJ1ZmZlcihjb25zdCBzcDxJTWVtb3J5PiAmbWVtKSA6CiAgICAgICAgIE1lZGlhQnVmZmVyKCh1aW50OF90ICopbWVtLT5wb2ludGVyKCkgKyBzaXplb2YoU2hhcmVkQ29udHJvbCksIG1lbS0+c2l6ZSgpKSB7CiAgICAgICAgIC8vIGRlbGVnYXRlIGFuZCBvdmVycmlkZSBtTWVtb3J5CiAgICAgICAgIG1NZW1vcnkgPSBtZW07CiAgICAgfQorI2VuZGlmCiAKICAgICAvLyBJZiBNZWRpYUJ1ZmZlckdyb3VwIGlzIHNldCwgZGVjcmVtZW50IHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQ7CiAgICAgLy8gaWYgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudCBkcm9wcyB0byAwLCByZXR1cm4gdGhlIGJ1ZmZlciB0byB0aGUKQEAgLTgwLDExICs4MSw2IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgc2V0T2JzZXJ2ZXIoTWVkaWFCdWZmZXJPYnNlcnZlciAqZ3JvdXApOwogCi0gICAgLy8gUmV0dXJucyBhIGNsb25lIG9mIHRoaXMgTWVkaWFCdWZmZXIgaW5jcmVhc2luZyBpdHMgcmVmZXJlbmNlIGNvdW50LgotICAgIC8vIFRoZSBjbG9uZSByZWZlcmVuY2VzIHRoZSBzYW1lIGRhdGEgYnV0IGhhcyBpdHMgb3duIHJhbmdlIGFuZAotICAgIC8vIE1ldGFEYXRhLgotICAgIHZpcnR1YWwgTWVkaWFCdWZmZXJCYXNlICpjbG9uZSgpOwotCiAgICAgLy8gc3VtIG9mIGxvY2FsUmVmY291bnQoKSBhbmQgcmVtb3RlUmVmY291bnQoKQogICAgIC8vIFJlc3VsdCBzaG91bGQgYmUgdHJlYXRlZCBhcyBhcHByb3hpbWF0ZSB1bmxlc3MgdGhlIHJlc3VsdCBwcmVjbHVkZXMgY29uY3VycmVudCBhY2Nlc3Nlcy4KICAgICB2aXJ0dWFsIGludCByZWZjb3VudCgpIGNvbnN0IHsKQEAgLTk3LDE3ICs5MywyNiBAQAogICAgIH0KIAogICAgIHZpcnR1YWwgaW50IHJlbW90ZVJlZmNvdW50KCkgY29uc3QgeworI2lmbmRlZiBOT19JTUVNT1JZCiAgICAgICAgIGlmIChtTWVtb3J5LmdldCgpID09IG51bGxwdHIgfHwgbU1lbW9yeS0+cG9pbnRlcigpID09IG51bGxwdHIpIHJldHVybiAwOwogICAgICAgICBpbnQzMl90IHJlbW90ZVJlZmNvdW50ID0KICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFNoYXJlZENvbnRyb2wgKj4obU1lbW9yeS0+cG9pbnRlcigpKS0+Z2V0UmVtb3RlUmVmY291bnQoKTsKICAgICAgICAgLy8gU2FuaXR5IGNoZWNrIHNvIHRoYXQgcmVtb3RlUmVmQ291bnQoKSBpcyBub24tbmVnYXRpdmUuCiAgICAgICAgIHJldHVybiByZW1vdGVSZWZjb3VudCA+PSAwID8gcmVtb3RlUmVmY291bnQgOiAwOyAvLyBkbyBub3QgYWxsb3cgY29ycnVwdGVkIGRhdGEuCisjZWxzZQorICAgICAgICByZXR1cm4gMDsKKyNlbmRpZgogICAgIH0KIAogICAgIC8vIHJldHVybnMgb2xkIHZhbHVlCiAgICAgaW50IGFkZFJlbW90ZVJlZmNvdW50KGludDMyX3QgdmFsdWUpIHsKKyNpZm5kZWYgTk9fSU1FTU9SWQogICAgICAgICBpZiAobU1lbW9yeS5nZXQoKSA9PSBudWxscHRyIHx8IG1NZW1vcnktPnBvaW50ZXIoKSA9PSBudWxscHRyKSByZXR1cm4gMDsKICAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U2hhcmVkQ29udHJvbCAqPihtTWVtb3J5LT5wb2ludGVyKCkpLT5hZGRSZW1vdGVSZWZjb3VudCh2YWx1ZSk7CisjZWxzZQorICAgICAgICAodm9pZCkgdmFsdWU7CisgICAgICAgIHJldHVybiAwOworI2VuZGlmCiAgICAgfQogCiAgICAgYm9vbCBpc0RlYWRPYmplY3QoKSBjb25zdCB7CkBAIC0xMTUsOCArMTIwLDEzIEBACiAgICAgfQogCiAgICAgc3RhdGljIGJvb2wgaXNEZWFkT2JqZWN0KGNvbnN0IHNwPElNZW1vcnk+ICZtZW1vcnkpIHsKKyNpZm5kZWYgTk9fSU1FTU9SWQogICAgICAgICBpZiAobWVtb3J5LmdldCgpID09IG51bGxwdHIgfHwgbWVtb3J5LT5wb2ludGVyKCkgPT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOwogICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTaGFyZWRDb250cm9sICo+KG1lbW9yeS0+cG9pbnRlcigpKS0+aXNEZWFkT2JqZWN0KCk7CisjZWxzZQorICAgICAgICAodm9pZCkgbWVtb3J5OworICAgICAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKICAgICB9CiAKICAgICAvLyBTdGlja3kgb24gZW5hYmxpbmcgb2Ygc2hhcmVkIG1lbW9yeSBNZWRpYUJ1ZmZlcnMuIEJ5IGRlZmF1bHQgd2UgZG9uJ3QgdXNlCkBAIC0xNTgsOCArMTY4LDYgQEAKIAogICAgIE1ldGFEYXRhQmFzZSogbU1ldGFEYXRhOwogCi0gICAgTWVkaWFCdWZmZXIgKm1PcmlnaW5hbDsKLQogICAgIHN0YXRpYyBzdGQ6OmF0b21pY19pbnRfbGVhc3QzMl90IG1Vc2VTaGFyZWRNZW1vcnk7CiAKICAgICBNZWRpYUJ1ZmZlcihjb25zdCBNZWRpYUJ1ZmZlciAmKTsKQEAgLTIxMSw3ICsyMTksMTEgQEAKICAgICB9OwogCiAgICAgaW5saW5lIFNoYXJlZENvbnRyb2wgKmdldFNoYXJlZENvbnRyb2woKSBjb25zdCB7CisjaWZuZGVmIE5PX0lNRU1PUlkKICAgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFNoYXJlZENvbnRyb2wgKj4obU1lbW9yeS0+cG9pbnRlcigpKTsKKyNlbHNlCisgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyNlbmRpZgogICAgICB9CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaAppbmRleCA2YzhkOTRhLi5lMmNiZmM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmgKQEAgLTE4LDYgKzE4LDEwIEBACiAKICNkZWZpbmUgTUVESUFfQlVGRkVSX0JBU0VfSF8KIAorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIE1lZGlhQnVmZmVyQmFzZTsKQEAgLTY2LDE3ICs3MCw2NSBAQAogCiAgICAgdmlydHVhbCB2b2lkIHNldE9ic2VydmVyKE1lZGlhQnVmZmVyT2JzZXJ2ZXIgKmdyb3VwKSA9IDA7CiAKLSAgICAvLyBSZXR1cm5zIGEgY2xvbmUgb2YgdGhpcyBNZWRpYUJ1ZmZlckJhc2UgaW5jcmVhc2luZyBpdHMgcmVmZXJlbmNlCi0gICAgLy8gY291bnQuIFRoZSBjbG9uZSByZWZlcmVuY2VzIHRoZSBzYW1lIGRhdGEgYnV0IGhhcyBpdHMgb3duIHJhbmdlIGFuZAotICAgIC8vIE1ldGFEYXRhLgotICAgIHZpcnR1YWwgTWVkaWFCdWZmZXJCYXNlICpjbG9uZSgpID0gMDsKLQogICAgIHZpcnR1YWwgaW50IHJlZmNvdW50KCkgY29uc3QgPSAwOwogCiAgICAgdmlydHVhbCBpbnQgbG9jYWxSZWZjb3VudCgpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIGludCByZW1vdGVSZWZjb3VudCgpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgfk1lZGlhQnVmZmVyQmFzZSgpIHt9OworICAgIHZpcnR1YWwgfk1lZGlhQnVmZmVyQmFzZSgpIHsKKyAgICAgICAgZGVsZXRlIG1XcmFwcGVyOworICAgICAgICBkZWxldGUgbUZvcm1hdDsKKyAgICB9OworCisgICAgQ01lZGlhQnVmZmVyICp3cmFwKCkgeworICAgICAgICBpZiAobVdyYXBwZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBtV3JhcHBlcjsKKyAgICAgICAgfQorICAgICAgICBtV3JhcHBlciA9IG5ldyBDTWVkaWFCdWZmZXI7CisgICAgICAgIG1XcmFwcGVyLT5oYW5kbGUgPSB0aGlzOworCisgICAgICAgIG1XcmFwcGVyLT5yZWxlYXNlID0gW10odm9pZCAqaGFuZGxlKSAtPiB2b2lkIHsKKyAgICAgICAgICAgICgoTWVkaWFCdWZmZXJCYXNlKiloYW5kbGUpLT5yZWxlYXNlKCk7CisgICAgICAgIH07CisKKyAgICAgICAgbVdyYXBwZXItPmRhdGEgPSBbXSh2b2lkICpoYW5kbGUpIC0+IHZvaWQgKiB7CisgICAgICAgICAgICByZXR1cm4gKChNZWRpYUJ1ZmZlckJhc2UqKWhhbmRsZSktPmRhdGEoKTsKKyAgICAgICAgfTsKKworICAgICAgICBtV3JhcHBlci0+c2l6ZSA9IFtdKHZvaWQgKmhhbmRsZSkgLT4gc2l6ZV90IHsKKyAgICAgICAgICAgIHJldHVybiAoKE1lZGlhQnVmZmVyQmFzZSopaGFuZGxlKS0+c2l6ZSgpOworICAgICAgICB9OworCisgICAgICAgIG1XcmFwcGVyLT5yYW5nZV9vZmZzZXQgPSBbXSh2b2lkICpoYW5kbGUpIC0+IHNpemVfdCB7CisgICAgICAgICAgICByZXR1cm4gKChNZWRpYUJ1ZmZlckJhc2UqKWhhbmRsZSktPnJhbmdlX29mZnNldCgpOworICAgICAgICB9OworCisgICAgICAgIG1XcmFwcGVyLT5yYW5nZV9sZW5ndGggPSBbXSh2b2lkICpoYW5kbGUpIC0+IHNpemVfdCB7CisgICAgICAgICAgICByZXR1cm4gKChNZWRpYUJ1ZmZlckJhc2UqKWhhbmRsZSktPnJhbmdlX2xlbmd0aCgpOworICAgICAgICB9OworCisgICAgICAgIG1XcmFwcGVyLT5zZXRfcmFuZ2UgPSBbXSh2b2lkICpoYW5kbGUsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpIC0+IHZvaWQgeworICAgICAgICAgICAgcmV0dXJuICgoTWVkaWFCdWZmZXJCYXNlKiloYW5kbGUpLT5zZXRfcmFuZ2Uob2Zmc2V0LCBsZW5ndGgpOworICAgICAgICB9OworCisgICAgICAgIG1XcmFwcGVyLT5tZXRhX2RhdGEgPSBbXSh2b2lkICpoYW5kbGUpIC0+IEFNZWRpYUZvcm1hdCogeworICAgICAgICAgICAgaWYgKCgoTWVkaWFCdWZmZXJCYXNlKiloYW5kbGUpLT5tRm9ybWF0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgKChNZWRpYUJ1ZmZlckJhc2UqKWhhbmRsZSktPm1Gb3JtYXQgPSBBTWVkaWFGb3JtYXRfZnJvbU1zZygmbXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAoKE1lZGlhQnVmZmVyQmFzZSopaGFuZGxlKS0+bUZvcm1hdDsKKyAgICAgICAgfTsKKworICAgICAgICByZXR1cm4gbVdyYXBwZXI7CisgICAgfQorcHJvdGVjdGVkOgorICAgIE1lZGlhQnVmZmVyQmFzZSgpIHsKKyAgICAgICAgbVdyYXBwZXIgPSBudWxscHRyOworICAgICAgICBtRm9ybWF0ID0gbnVsbHB0cjsKKyAgICB9Citwcml2YXRlOgorICAgIENNZWRpYUJ1ZmZlciAqbVdyYXBwZXI7CisgICAgQU1lZGlhRm9ybWF0ICptRm9ybWF0OwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKaW5kZXggNzVkNWRmNy4uYTE2MjExNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKKysrIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKQEAgLTIwLDYgKzIwLDggQEAKIAogI2luY2x1ZGUgPGxpc3Q+CiAKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3JQcml2Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgpAQCAtNTcsMTIgKzU5LDU0IEBACiAgICAgLy8gSWYgYnVmZmVyIGlzIG51bGxwdHIsIGhhdmUgYWNxdWlyZV9idWZmZXIoKSBjaGVjayBmb3IgcmVtb3RlIHJlbGVhc2UuCiAgICAgdmlydHVhbCB2b2lkIHNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKTsKIAorICAgIENNZWRpYUJ1ZmZlckdyb3VwICp3cmFwKCkgeworICAgICAgICBpZiAobVdyYXBwZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBtV3JhcHBlcjsKKyAgICAgICAgfQorCisgICAgICAgIG1XcmFwcGVyID0gbmV3IENNZWRpYUJ1ZmZlckdyb3VwOworICAgICAgICBtV3JhcHBlci0+aGFuZGxlID0gdGhpczsKKworICAgICAgICBtV3JhcHBlci0+YWRkX2J1ZmZlciA9IFtdKHZvaWQgKmhhbmRsZSwgc2l6ZV90IHNpemUpIC0+IHZvaWQgeworICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpidWYgPSBNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZShzaXplKTsKKyAgICAgICAgICAgICgoTWVkaWFCdWZmZXJHcm91cCopaGFuZGxlKS0+YWRkX2J1ZmZlcihidWYpOworICAgICAgICB9OworCisgICAgICAgIG1XcmFwcGVyLT5pbml0ID0gW10odm9pZCAqaGFuZGxlLAorICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJzLCBzaXplX3QgYnVmZmVyX3NpemUsIHNpemVfdCBncm93dGhMaW1pdCkgLT4gYm9vbCB7CisgICAgICAgICAgICAoKE1lZGlhQnVmZmVyR3JvdXAqKWhhbmRsZSktPmluaXQoYnVmZmVycywgYnVmZmVyX3NpemUsIGdyb3d0aExpbWl0KTsKKyAgICAgICAgICAvLyAgKChNZWRpYUJ1ZmZlckdyb3VwKiloYW5kbGUpLT5tV3JhcHBlci0+aW5pdCA9IG51bGxwdHI7IC8vIGVuZm9yY2UgY2FsbC1vbmNlCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfTsKKworICAgICAgICBtV3JhcHBlci0+YWNxdWlyZV9idWZmZXIgPSBbXSh2b2lkICpoYW5kbGUsCisgICAgICAgICAgICAgICAgQ01lZGlhQnVmZmVyICoqYnVmLCBib29sIG5vbkJsb2NraW5nLCBzaXplX3QgcmVxdWVzdGVkU2l6ZSkgLT4gbWVkaWFfc3RhdHVzX3QgeworICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICphY3F1aXJlZEJ1ZiA9IG51bGxwdHI7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSAoKE1lZGlhQnVmZmVyR3JvdXAqKWhhbmRsZSktPmFjcXVpcmVfYnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAmYWNxdWlyZWRCdWYsIG5vbkJsb2NraW5nLCByZXF1ZXN0ZWRTaXplKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0sgJiYgYWNxdWlyZWRCdWYgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICpidWYgPSBhY3F1aXJlZEJ1Zi0+d3JhcCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqYnVmID0gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IoZXJyKTsKKyAgICAgICAgfTsKKworICAgICAgICBtV3JhcHBlci0+aGFzX2J1ZmZlcnMgPSBbXSh2b2lkICpoYW5kbGUpIC0+IGJvb2wgeworICAgICAgICAgICAgcmV0dXJuICgoTWVkaWFCdWZmZXJHcm91cCopaGFuZGxlKS0+aGFzX2J1ZmZlcnMoKTsKKyAgICAgICAgfTsKKworICAgICAgICByZXR1cm4gbVdyYXBwZXI7CisgICAgfQorCiBwcml2YXRlOgorICAgIENNZWRpYUJ1ZmZlckdyb3VwICptV3JhcHBlcjsKICAgICBzdHJ1Y3QgSW50ZXJuYWxEYXRhOwogICAgIEludGVybmFsRGF0YSAqbUludGVybmFsOwogCiAgICAgTWVkaWFCdWZmZXJHcm91cChjb25zdCBNZWRpYUJ1ZmZlckdyb3VwICYpOwogICAgIE1lZGlhQnVmZmVyR3JvdXAgJm9wZXJhdG9yPShjb25zdCBNZWRpYUJ1ZmZlckdyb3VwICYpOworICAgIHZvaWQgaW5pdChzaXplX3QgYnVmZmVycywgc2l6ZV90IGJ1ZmZlcl9zaXplLCBzaXplX3QgZ3Jvd3RoTGltaXQpOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oCmluZGV4IDNlNGU4NmMuLmI5OWMxNGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaApAQCAtNjgsNyArNjgsNiBAQAogICAgIGtLZXlPcHVzU2Vla1ByZVJvbGwgICA9ICdvc3ByJywgIC8vIHVpbnQ2NF90IChzZWVrIHByZXJvbGwgaW4gbnMpCiAgICAga0tleUZsYWNNZXRhZGF0YSAgICAgID0gJ2ZsTWQnLCAgLy8gcmF3IGRhdGEKICAgICBrS2V5VnA5Q29kZWNQcml2YXRlICAgPSAndnA5cCcsICAvLyByYXcgZGF0YSAodnA5IGNzZCBpbmZvcm1hdGlvbikKLSAgICBrS2V5V2FudHNOQUxGcmFnbWVudHMgPSAnTkFMZicsCiAgICAga0tleUlzU3luY0ZyYW1lICAgICAgID0gJ3N5bmMnLCAgLy8gaW50MzJfdCAoYm9vbCkKICAgICBrS2V5SXNDb2RlY0NvbmZpZyAgICAgPSAnY29uZicsICAvLyBpbnQzMl90IChib29sKQogICAgIGtLZXlJc011eGVyRGF0YSAgICAgICA9ICdtdXhkJywgIC8vIGludDMyX3QgKGJvb2wpCkBAIC05MCw3ICs4OSw2IEBACiAgICAga0tleU1heEhlaWdodCAgICAgICAgID0gJ21heEgnLAogICAgIGtLZXlUaHVtYm5haWxUaW1lICAgICA9ICd0aGJUJywgIC8vIGludDY0X3QgKHVzZWNzKQogICAgIGtLZXlUcmFja0lEICAgICAgICAgICA9ICd0cklEJywKLSAgICBrS2V5SXNEUk0gICAgICAgICAgICAgPSAnaWRybScsICAvLyBpbnQzMl90IChib29sKQogICAgIGtLZXlFbmNvZGVyRGVsYXkgICAgICA9ICdlbmNkJywgIC8vIGludDMyX3QgKGZyYW1lcykKICAgICBrS2V5RW5jb2RlclBhZGRpbmcgICAgPSAnZW5jcCcsICAvLyBpbnQzMl90IChmcmFtZXMpCiAKQEAgLTEwMiw3ICsxMDAsNiBAQAogICAgIGtLZXlUaXRsZSAgICAgICAgICAgICA9ICd0aXRsJywgIC8vIGNzdHJpbmcKICAgICBrS2V5WWVhciAgICAgICAgICAgICAgPSAneWVhcicsICAvLyBjc3RyaW5nCiAgICAga0tleUFsYnVtQXJ0ICAgICAgICAgID0gJ2FsYkEnLCAgLy8gY29tcHJlc3NlZCBpbWFnZSBkYXRhCi0gICAga0tleUFsYnVtQXJ0TUlNRSAgICAgID0gJ2FsQU0nLCAgLy8gY3N0cmluZwogICAgIGtLZXlBdXRob3IgICAgICAgICAgICA9ICdhdXRoJywgIC8vIGNzdHJpbmcKICAgICBrS2V5Q0RUcmFja051bWJlciAgICAgPSAnY2R0cicsICAvLyBjc3RyaW5nCiAgICAga0tleURpc2NOdW1iZXIgICAgICAgID0gJ2RudW0nLCAgLy8gY3N0cmluZwpAQCAtMTgyLDYgKzE3OSw3IEBACiAgICAga0tleVBzc2ggICAgICAgICAgICAgID0gJ3Bzc2gnLCAgLy8gcmF3IGRhdGEKICAgICBrS2V5Q0FTeXN0ZW1JRCAgICAgICAgPSAnY2FpZCcsICAvLyBpbnQzMl90CiAgICAga0tleUNBU2Vzc2lvbklEICAgICAgID0gJ3NlaWQnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5Q0FQcml2YXRlRGF0YSAgICAgPSAnY2FkYycsICAvLyByYXcgZGF0YQogCiAgICAga0tleUVuY3J5cHRlZEJ5dGVCbG9jayA9ICdjYmxrJywgIC8vIHVpbnQ4X3QKICAgICBrS2V5U2tpcEJ5dGVCbG9jayAgICAgPSAnc2JsaycsICAvLyB1aW50OF90CkBAIC0xOTksMTEgKzE5Nyw5IEBACiAgICAgLy8gTVBFRyB1c2VyIGRhdGEgb2Zmc2V0cwogICAgIGtLZXlNcGVnVXNlckRhdGEgICAgICA9ICdtcHVkJywgLy8gc2l6ZV90W10KIAotICAgIC8vIFNpemUgb2YgTkFMVSBsZW5ndGggaW4gbWt2L21wNAotICAgIGtLZXlOYWxMZW5ndGhTaXplICAgICA9ICduYWxzJywgLy8gaW50MzJfdAotCiAgICAgLy8gSERSIHJlbGF0ZWQKICAgICBrS2V5SGRyU3RhdGljSW5mbyAgICA9ICdoZHJTJywgLy8gSERSU3RhdGljSW5mbworICAgIGtLZXlIZHIxMFBsdXNJbmZvICAgID0gJ2hkckQnLCAvLyByYXcgZGF0YQogCiAgICAgLy8gY29sb3IgYXNwZWN0cwogICAgIGtLZXlDb2xvclJhbmdlICAgICAgID0gJ2NSbmcnLCAvLyBpbnQzMl90LCBjb2xvciByYW5nZSwgdmFsdWUgZGVmaW5lZCBieSBDb2xvckFzcGVjdHMuUmFuZ2UKQEAgLTIyNiwxMSArMjIyLDEzIEBACiAgICAga0tleUV4aWZPZmZzZXQgICAgICAgPSAnZXhvZicsIC8vIGludDY0X3QsIEV4aWYgZGF0YSBvZmZzZXQKICAgICBrS2V5RXhpZlNpemUgICAgICAgICA9ICdleHN6JywgLy8gaW50NjRfdCwgRXhpZiBkYXRhIHNpemUKICAgICBrS2V5SXNFeGlmICAgICAgICAgICA9ICdleGlmJywgLy8gYm9vbCAoaW50MzJfdCkgYnVmZmVyIGNvbnRhaW5zIGV4aWYgZGF0YSBibG9jawotCiAgICAga0tleVBjbUJpZ0VuZGlhbiAgICAgPSAncGNtYicsIC8vIGJvb2wgKGludDMyX3QpCiAKICAgICAvLyBLZXkgZm9yIEFMQUMgTWFnaWMgQ29va2llCiAgICAga0tleUFsYWNNYWdpY0Nvb2tpZSAgPSAnYWxtYycsIC8vIHJhdyBkYXRhCisKKyAgICAvLyBBQy00IEF1ZGlvUHJlc2VudGF0aW9uSW5mbworICAgIGtLZXlBdWRpb1ByZXNlbnRhdGlvbkluZm8gPSAnYXVkUCcsICAvLyByYXcgZGF0YQogfTsKIAogZW51bSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9BbmRyb2lkLmJwCmluZGV4IDBhMzQyYjguLmUxODhlNTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9BbmRyb2lkLmJwCkBAIC02LDE1ICs2LDE0IEBACiAgICAgc3JjczogWwogICAgICAgICAiSU1lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAiLAogICAgICAgICAiTWVkaWFBbmFseXRpY3NJdGVtLmNwcCIsCisgICAgICAgICJNZWRpYU1ldHJpY3MuY3BwIiwKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCkBAIC0zMiw0ICszMSwxMyBAQAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCiAgICAgfSwKKworICAgIC8vIGVudW1lcmF0ZSB0aGUgc3RhYmxlIGludGVyZmFjZQorLy8gdGhpcyB3b3VsZCBtZWFuIG5vYm9keSBjYW4gdXNlIHRoZSBDKysgaW50ZXJmYWNlLiBoYXZlIHRvIHJld29yayBzb21lIHRoaW5ncy4KKy8vICBzdHViczogeworLy8gICAgICBzeW1ib2xfZmlsZTogImxpYm1lZGlhbWV0cmljcy5tYXAudHh0IiwKKy8vICAgICAgdmVyc2lvbnM6IFsKKy8vICAgICAgICAgICIxIiAsCisvLyAgICAgIF0KKy8vICB9LAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL01lZGlhQW5hbHl0aWNzSXRlbS5jcHAgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFBbmFseXRpY3NJdGVtLmNwcAppbmRleCAxMzVjOWI2Li40NDhlMmQ5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFBbmFseXRpY3NJdGVtLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFBbmFseXRpY3NJdGVtLmNwcApAQCAtNDc4LDcgKzQ3OCw3IEBACiAvLyBjYWxsZXIgcmVzcG9uc2libGUgZm9yIHRoZSByZXR1cm5lZCBzdHJpbmcKIGJvb2wgTWVkaWFBbmFseXRpY3NJdGVtOjpnZXRDU3RyaW5nKE1lZGlhQW5hbHl0aWNzSXRlbTo6QXR0ciBuYW1lLCBjaGFyICoqdmFsdWUpIHsKICAgICBQcm9wICpwcm9wID0gZmluZFByb3AobmFtZSk7Ci0gICAgaWYgKHByb3AgPT0gTlVMTCB8fCBwcm9wLT5tVHlwZSAhPSBrVHlwZURvdWJsZSkgeworICAgIGlmIChwcm9wID09IE5VTEwgfHwgcHJvcC0+bVR5cGUgIT0ga1R5cGVDU3RyaW5nKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKQEAgLTQ4Nyw2ICs0ODcsMTggQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorYm9vbCBNZWRpYUFuYWx5dGljc0l0ZW06OmdldFN0cmluZyhNZWRpYUFuYWx5dGljc0l0ZW06OkF0dHIgbmFtZSwgc3RkOjpzdHJpbmcgKnZhbHVlKSB7CisgICAgUHJvcCAqcHJvcCA9IGZpbmRQcm9wKG5hbWUpOworICAgIGlmIChwcm9wID09IE5VTEwgfHwgcHJvcC0+bVR5cGUgIT0ga1R5cGVDU3RyaW5nKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgLy8gc3RkOjpzdHJpbmcgbWFrZXMgYSBjb3B5IGZvciB1cworICAgICAgICAqdmFsdWUgPSBwcm9wLT51LkNTdHJpbmdWYWx1ZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKIC8vIHJlbW92ZSBpbmRpY2F0ZWQga2V5cyBhbmQgdGhlaXIgdmFsdWVzCiAvLyByZXR1cm4gdmFsdWUgaXMgIyBrZXlzIHJlbW92ZWQKIGludDMyX3QgTWVkaWFBbmFseXRpY3NJdGVtOjpmaWx0ZXIoaW50IG4sIE1lZGlhQW5hbHl0aWNzSXRlbTo6QXR0ciBhdHRyc1tdKSB7CkBAIC03MjYsNiArNzM4LDE1IEBACiB9CiAKIAorY29uc3QgY2hhciAqTWVkaWFBbmFseXRpY3NJdGVtOjp0b0NTdHJpbmcoKSB7CisgICByZXR1cm4gdG9DU3RyaW5nKFBST1RPX0xBU1QpOworfQorCitjb25zdCBjaGFyICogTWVkaWFBbmFseXRpY3NJdGVtOjp0b0NTdHJpbmcoaW50IHZlcnNpb24pIHsKKyAgICBzdGQ6OnN0cmluZyB2YWwgPSB0b1N0cmluZyh2ZXJzaW9uKTsKKyAgICByZXR1cm4gc3RyZHVwKHZhbC5jX3N0cigpKTsKK30KKwogc3RkOjpzdHJpbmcgTWVkaWFBbmFseXRpY3NJdGVtOjp0b1N0cmluZygpIHsKICAgIHJldHVybiB0b1N0cmluZyhQUk9UT19MQVNUKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9NZWRpYU1ldHJpY3MuY3BwIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL01lZGlhTWV0cmljcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIwOGFhNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9NZWRpYU1ldHJpY3MuY3BwCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNZWRpYU1ldHJpY3MiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFNZXRyaWNzLmg+CisKKy8vCisvLyBwcm92aWRlIGEgQy1pc2ggaW50ZXJmYWNlIHRoYXQgaXMgZWFzaWVyIHRvIHN0YWJpbGl6ZSB0aGFuIHRoZSBleGlzdGluZyBDKysKKy8vIGludGVyZmFjZQorLy8KKy8vIEFMTCBmdW5jdGlvbnMgcmV0dXJuaW5nIGEgY2hhciAqIGdpdmUgcmVzcG9uc2liaWxpdHkgZm9yIHRoZSBhbGxvY2F0ZWQgYnVmZmVyCisvLyB0byB0aGUgY2FsbGVyLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIHRvIGNhbGwgZnJlZSgpIG9uIHRoYXQgcG9pbnRlci4KKy8vCisKKy8vIG1hbmFnZSB0aGUgb3ZlcmFsbCByZWNvcmQKK21lZGlhbWV0cmljc19oYW5kbGVfdCBtZWRpYW1ldHJpY3NfY3JlYXRlKG1lZGlhbWV0cmljc2tleV90IGtleSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IG5ldyBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0oa2V5KTsKKyAgICByZXR1cm4gKG1lZGlhbWV0cmljc19oYW5kbGVfdCkgaXRlbTsKK30KKwordm9pZCBtZWRpYW1ldHJpY3NfZGVsZXRlKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSByZXR1cm47CisgICAgZGVsZXRlIGl0ZW07Cit9CisKK21lZGlhbWV0cmljc2tleV90IG1lZGlhbWV0cmljc19nZXRLZXkobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIHJldHVybiBzdHJkdXAoaXRlbS0+Z2V0S2V5KCkuY19zdHIoKSk7Cit9CisKKy8vIG51cGxheWVyLCBldCBhbCB1c2UgaXQgd2hlbiBhY3RpbmcgYXMgcHJveGllcwordm9pZCBtZWRpYW1ldHJpY3Nfc2V0VWlkKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIHVpZF90IHVpZCkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPnNldFVpZCh1aWQpOworfQorCisvLyBzZXQgYXR0cmlidXRlcworLy8KKwordm9pZCBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmFsdWUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSAhPSBOVUxMKSBpdGVtLT5zZXRJbnQzMihhdHRyLCB2YWx1ZSk7Cit9CisKK3ZvaWQgbWVkaWFtZXRyaWNzX3NldEludDY0KG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHZhbHVlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gIT0gTlVMTCkgaXRlbS0+c2V0SW50NjQoYXR0ciwgdmFsdWUpOworfQorCit2b2lkIG1lZGlhbWV0cmljc19zZXREb3VibGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsdWUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSAhPSBOVUxMKSBpdGVtLT5zZXREb3VibGUoYXR0ciwgdmFsdWUpOworfQorCit2b2lkIG1lZGlhbWV0cmljc19zZXRSYXRlKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY291bnQsIGludDY0X3QgZHVyYXRpb24pIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSAhPSBOVUxMKSBpdGVtLT5zZXRSYXRlKGF0dHIsIGNvdW50LCBkdXJhdGlvbik7Cit9CisKK3ZvaWQgbWVkaWFtZXRyaWNzX3NldENTdHJpbmcobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPnNldENTdHJpbmcoYXR0ciwgdmFsdWUpOworfQorCisvLyBmdXNlZCBnZXQvYWRkL3NldDsgaWYgYXR0ciB3YXNuJ3QgdGhlcmUsIGl0J3MgYSBzaW1wbGUgc2V0LgorLy8KKwordm9pZCBtZWRpYW1ldHJpY3NfYWRkSW50MzIobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmFsdWUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSAhPSBOVUxMKSBpdGVtLT5hZGRJbnQzMihhdHRyLCB2YWx1ZSk7Cit9CisKK3ZvaWQgbWVkaWFtZXRyaWNzX2FkZEludDY0KG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHZhbHVlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gIT0gTlVMTCkgaXRlbS0+YWRkSW50NjQoYXR0ciwgdmFsdWUpOworfQorCit2b2lkIG1lZGlhbWV0cmljc19hZGREb3VibGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsdWUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSAhPSBOVUxMKSBpdGVtLT5hZGREb3VibGUoYXR0ciwgdmFsdWUpOworfQorCit2b2lkIG1lZGlhbWV0cmljc19hZGRSYXRlKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY291bnQsIGludDY0X3QgZHVyYXRpb24pIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSAhPSBOVUxMKSBpdGVtLT5hZGRSYXRlKGF0dHIsIGNvdW50LCBkdXJhdGlvbik7Cit9CisKKy8vIGZpbmQgJiBleHRyYWN0IHZhbHVlcworLy8gcmV0dXJuIGluZGljYXRlcyB3aGV0aGVyIGF0dHIgZXhpc3RzIChhbmQgdGh1cyB3aGV0aGVyIHZhbHVlIGZpbGxlZCBpbikKKy8vIE5VTEwgcGFyYW1ldGVyIHZhbHVlIHN1cHByZXNzZXMgc3RvcmFnZSBvZiB2YWx1ZS4KKy8vCisKK2Jvb2wgbWVkaWFtZXRyaWNzX2dldEludDMyKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICogdmFsdWUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGl0ZW0tPmdldEludDMyKGF0dHIsIHZhbHVlKTsKK30KKworYm9vbCBtZWRpYW1ldHJpY3NfZ2V0SW50NjQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKiB2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gaXRlbS0+Z2V0SW50NjQoYXR0ciwgdmFsdWUpOworfQorCitib29sIG1lZGlhbWV0cmljc19nZXREb3VibGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgKnZhbHVlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBpdGVtLT5nZXREb3VibGUoYXR0ciwgdmFsdWUpOworfQorCitib29sIG1lZGlhbWV0cmljc19nZXRSYXRlKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKiBjb3VudCwgaW50NjRfdCAqIGR1cmF0aW9uLCBkb3VibGUgKnJhdGUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGl0ZW0tPmdldFJhdGUoYXR0ciwgY291bnQsIGR1cmF0aW9uLCByYXRlKTsKK30KKworLy8gTkI6IGNhbGxlciBvd25zIHRoZSBzdHJpbmcgdGhhdCBjb21lcyBiYWNrLCBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZyBpdAorYm9vbCBtZWRpYW1ldHJpY3NfZ2V0Q1N0cmluZyhtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKip2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiBpdGVtLT5nZXRDU3RyaW5nKGF0dHIsIHZhbHVlKTsKK30KKworLy8gdG8gcmVsZWFzZSBzdHJpbmdzIHJldHVybmVkIHZpYSBnZXRDU3RyaW5nKCkKK3ZvaWQgbWVkaWFtZXRyaWNzX2ZyZWVDU3RyaW5nKGNoYXIgKnZhbHVlKSB7CisgICAgZnJlZSh2YWx1ZSk7Cit9CisKK2Jvb2wgbWVkaWFtZXRyaWNzX3NlbGZSZWNvcmQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gaXRlbS0+c2VsZnJlY29yZCgpOworfQorCisKK2NvbnN0IGNoYXIgKm1lZGlhbWV0cmljc19yZWFkYWJsZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuICIiOworICAgIHJldHVybiBpdGVtLT50b0NTdHJpbmcoKTsKK30KKworaW50MzJfdCBtZWRpYW1ldHJpY3NfY291bnQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybiAwOworICAgIHJldHVybiBpdGVtLT5jb3VudCgpOworfQorCitib29sIG1lZGlhbWV0cmljc19pc0VuYWJsZWQoKSB7CisgICAgLy8gc3RhdGljLCBzbyBkb2Vzbid0IG5lZWQgYW4gaW5zdGFuY2UKKyAgICByZXR1cm4gYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtOjppc0VuYWJsZWQoKTsKK30KKworI2lmIDAKKy8vIGRvIG5vdCBleHBvc2UgdGhpcyBhcyBpcy4KKy8vIG5lZWQgdG8gcmV2aXNpdCAob3IgcmVkZWZpbmUpIGhvdyB0aGUgYW5kcm9pZDo6UGFyY2VsIHBhcmFtZXRlciBpcyBoYW5kbGVkCisvLyBzbyB0aGF0IGl0IG1lZXRzIHRoZSBzdGFibGUtQVBJIGNyaXRlcmlhIGZvciB1cGRhdGVhYmxlIGNvbXBvbmVudHMuCisvLworaW50MzJfdCBtZWRpYW1ldHJpY3Nfd3JpdGVUb1BhcmNlbChtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhbmRyb2lkOjpQYXJjZWwgKnBhcmNlbCkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gaXRlbS0+d3JpdGVUb1BhcmNlbChwYXJjZWwpOworfQorI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFBbmFseXRpY3NJdGVtLmggYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9NZWRpYUFuYWx5dGljc0l0ZW0uaAppbmRleCAyNjNjZGU3Li5iOTljZDkxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9NZWRpYUFuYWx5dGljc0l0ZW0uaAorKysgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9NZWRpYUFuYWx5dGljc0l0ZW0uaApAQCAtMTM0LDYgKzEzNCw3IEBACiAgICAgICAgIGJvb2wgZ2V0UmF0ZShBdHRyLCBpbnQ2NF90ICpjb3VudCwgaW50NjRfdCAqZHVyYXRpb24sIGRvdWJsZSAqcmF0ZSk7CiAgICAgICAgIC8vIENhbGxlciBvd25zIHRoZSByZXR1cm5lZCBzdHJpbmcKICAgICAgICAgYm9vbCBnZXRDU3RyaW5nKEF0dHIsIGNoYXIgKip2YWx1ZSk7CisgICAgICAgIGJvb2wgZ2V0U3RyaW5nKEF0dHIsIHN0ZDo6c3RyaW5nICp2YWx1ZSk7CiAKICAgICAgICAgLy8gcGFyYW1ldGVyIGluZGljYXRlcyB3aGV0aGVyIHRvIGNsb3NlIGFueSBleGlzdGluZyBvcGVuCiAgICAgICAgIC8vIHJlY29yZCB3aXRoIHNhbWUga2V5IGJlZm9yZSBlc3RhYmxpc2hpbmcgYSBuZXcgcmVjb3JkCkBAIC0xNzYsNiArMTc3LDggQEAKIAogICAgICAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpOwogICAgICAgICBzdGQ6OnN0cmluZyB0b1N0cmluZyhpbnQgdmVyc2lvbik7CisgICAgICAgIGNvbnN0IGNoYXIgKnRvQ1N0cmluZygpOworICAgICAgICBjb25zdCBjaGFyICp0b0NTdHJpbmcoaW50IHZlcnNpb24pOwogCiAgICAgICAgIC8vIGFyZSB3ZSBjb2xsZWN0aW5nIGFuYWx5dGljcyBkYXRhCiAgICAgICAgIHN0YXRpYyBib29sIGlzRW5hYmxlZCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFNZXRyaWNzLmggYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9NZWRpYU1ldHJpY3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDJmMzUyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFNZXRyaWNzLmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9NRURJQU1FVFJJQ1NfSAorI2RlZmluZSBBTkRST0lEX01FRElBX01FRElBTUVUUklDU19ICisKKy8vCisvLyBkZWZpbmUgYSBDIGludGVyZmFjZSB0byB0aGUgbWVkaWEgbWV0cmljcyBmdW5jdGlvbmFsaXR5CisvLworLy8gQWxsIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBhIGNoYXIgKiBvciBjb25zdCBjaGFyICogYWxzbyBnaXZlIHJlc3BvbnNpYmlsaXR5CisvLyBmb3IgdGhhdCBzdHJpbmcgdG8gdGhlIGNhbGxlci4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyBmcmVlKCkKKy8vIG9uIHRoYXQgcG9pbnRlciB3aGVuIGRvbmUgdXNpbmcgdGhlIHZhbHVlLgorCitfX0JFR0lOX0RFQ0xTCisKKy8vIGludGVybmFsbHkgcmUtY2FzdCB0byB0aGUgYmVoaW5kLXRoZS1zY2VuZXMgQysrIGNsYXNzIGluc3RhbmNlCit0eXBlZGVmIGludDY0X3QgbWVkaWFtZXRyaWNzX2hhbmRsZV90OwordHlwZWRlZiBjb25zdCBjaGFyICptZWRpYW1ldHJpY3NrZXlfdDsKK3R5cGVkZWYgY29uc3QgY2hhciAqYXR0cl90OworCittZWRpYW1ldHJpY3NfaGFuZGxlX3QgbWVkaWFtZXRyaWNzX2NyZWF0ZShtZWRpYW1ldHJpY3NrZXlfdCBrZXkpOwordm9pZCBtZWRpYW1ldHJpY3NfZGVsZXRlKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUpOworCittZWRpYW1ldHJpY3NrZXlfdCBtZWRpYW1ldHJpY3NfZ2V0S2V5KG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUpOworCisKKy8vIHNldAordm9pZCBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZhbHVlKTsKK3ZvaWQgbWVkaWFtZXRyaWNzX3NldEludDY0KG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB2YWx1ZSk7Cit2b2lkIG1lZGlhbWV0cmljc19zZXREb3VibGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbHVlKTsKK3ZvaWQgbWVkaWFtZXRyaWNzX3NldFJhdGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY291bnQsIGludDY0X3QgZHVyYXRpb24pOwordm9pZCBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogdmFsdWUpOworCisvLyBmdXNlZCBnZXQvYWRkL3NldDsgaWYgYXR0ciB3YXNuJ3QgdGhlcmUsIGl0J3MgYSBzaW1wbGUgc2V0LgorLy8gdGhlc2UgZG8gbm90IHByb3ZpZGUgYXRvbWljaXR5IG9yIG11dHVhbCBleGNsdXNpb24sIG9ubHkgc2ltcGxlciBjb2RlIHNlcXVlbmNlcy4KK3ZvaWQgbWVkaWFtZXRyaWNzX2FkZEludDMyKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2YWx1ZSk7Cit2b2lkIG1lZGlhbWV0cmljc19hZGRJbnQ2NChtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdmFsdWUpOwordm9pZCBtZWRpYW1ldHJpY3NfYWRkRG91YmxlKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZSk7Cit2b2lkIG1lZGlhbWV0cmljc19hZGRSYXRlKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGNvdW50LCBpbnQ2NF90IGR1cmF0aW9uKTsKKworLy8gZmluZCAmIGV4dHJhY3QgdmFsdWVzCisvLyByZXR1cm4gaW5kaWNhdGVzIHdoZXRoZXIgYXR0ciBleGlzdHMgKGFuZCB0aHVzIHdoZXRoZXIgdmFsdWUgZmlsbGVkIGluKQorLy8gTlVMTCBwYXJhbWV0ZXIgdmFsdWUgc3VwcHJlc3NlcyBzdG9yYWdlIG9mIHZhbHVlLgorYm9vbCBtZWRpYW1ldHJpY3NfZ2V0SW50MzIobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICogdmFsdWUpOworYm9vbCBtZWRpYW1ldHJpY3NfZ2V0SW50NjQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICogdmFsdWUpOworYm9vbCBtZWRpYW1ldHJpY3NfZ2V0RG91YmxlKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqdmFsdWUpOworYm9vbCBtZWRpYW1ldHJpY3NfZ2V0UmF0ZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqIGNvdW50LCBpbnQ2NF90ICogZHVyYXRpb24sIGRvdWJsZSAqcmF0ZSk7Citib29sIG1lZGlhbWV0cmljc19nZXRDU3RyaW5nKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKip2YWx1ZSk7CisvLyB0byByZWxlYXNlIHN0cmluZ3MgcmV0dXJuZWQgdmlhIGdldENTdHJpbmcoKQordm9pZCBtZWRpYW1ldHJpY3NfZnJlZUNTdHJpbmcoY2hhciAqdmFsdWUpOworCisvLyAjIG9mIGF0dHJpYnV0ZXMgc2V0IHdpdGhpbiB0aGlzIHJlY29yZC4KK2ludDMyX3QgbWVkaWFtZXRyaWNzX2NvdW50KG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUpOworCitib29sIG1lZGlhbWV0cmljc19zZWxmUmVjb3JkKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUpOworCitjb25zdCBjaGFyICptZWRpYW1ldHJpY3NfcmVhZGFibGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSk7Cit2b2lkIG1lZGlhbWV0cmljc19zZXRVaWQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgdWlkX3QgdWlkKTsKK2Jvb2wgbWVkaWFtZXRyaWNzX2lzRW5hYmxlZCgpOworCisjaWYgMAorLy8gZG8gbm90IGV4cG9zZSB0aGlzIGFzIGlzLgorLy8gbmVlZCB0byByZXZpc2l0IChvciByZWRlZmluZSkgaG93IHRoZSBhbmRyb2lkOjpQYXJjZWwgcGFyYW1ldGVyIGlzIGhhbmRsZWQKKy8vIHNvIHRoYXQgaXQgbWVldHMgdGhlIHN0YWJsZS1BUEkgY3JpdGVyaWEgZm9yIHVwZGF0ZWFibGUgY29tcG9uZW50cy4KKy8vCitpbnQzMl90IG1lZGlhbWV0cmljc193cml0ZVRvUGFyY2VsKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGFuZHJvaWQ6OlBhcmNlbCAqcGFyY2VsKTsKKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0FuZHJvaWQuYnAKaW5kZXggY2QyN2JkMS4uMzhmNDJkYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0FuZHJvaWQuYnAKQEAgLTQsMTEgKzQsMTAgQEAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKIH0KIAotY2NfbGlicmFyeSB7CitjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYm1lZGlhcGxheWVyMiIsCiAKICAgICBzcmNzOiBbCi0gICAgICAgICJKQXVkaW9UcmFjay5jcHAiLAogICAgICAgICAiTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQuY3BwIiwKICAgICAgICAgIm1lZGlhcGxheWVyMi5jcHAiLAogICAgIF0sCkBAIC0xNywyNiArMTYsMjUgQEAKICAgICAgICAgImxpYmFuZHJvaWRfcnVudGltZSIsCiAgICAgICAgICJsaWJhdWRpb2NsaWVudCIsCiAgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliYmluZGVyX25kayIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGliZ3VpIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJtZWRpYV9vbXgiLAotICAgICAgICAibGlibWVkaWFfcGxheWVyMl91dGlsIiwKICAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidWkiLAogICAgICAgICAibGlidXRpbHMiLAogCiAgICAgICAgICJsaWJjcnlwdG8iLAotICAgICAgICAibGlibWVkaWFkcm0iLAogICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKICAgICAgICAgImxpYm1lZGlhbmRrIiwKKyAgICAgICAgImxpYm1lZGlhbmRrX3V0aWxzIiwKICAgICAgICAgImxpYm1lZGlhdXRpbHMiLAogICAgICAgICAibGlibWVtdW5yZWFjaGFibGUiLAogICAgICAgICAibGlibmF0aXZld2luZG93IiwKICAgICAgICAgImxpYnBvd2VybWFuYWdlciIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9odHRwbGl2ZSIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9wbGF5ZXIyIiwKICAgICBdLAogCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwpAQCAtNDksMTEgKzQ3LDIwIEBACiAgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCiAgICAgXSwKIAorICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9iYXNlL2NvcmUvam5pIiwKKyAgICBdLAorCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJtZWRpYXBsYXllcjItcHJvdG9zIiwKKyAgICAgICAgImxpYm1lZGlhX3BsYXllcjJfdXRpbCIsCisgICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9udXBsYXllcjIiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfcGxheWVyMiIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9ydHNwIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3RpbWVkdGV4dCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF90aW1lZHRleHQyIiwKKyAgICAgICAgImxpYm1lZGlhMl9qbmlfY29yZSIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKQEAgLTc0LDMgKzgxLDUyIEBACiAgICAgICAgIGNmaTogdHJ1ZSwKICAgICB9LAogfQorCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGlibWVkaWEyX2puaV9jb3JlIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkphdmFWTUhlbHBlci5jcHAiLAorICAgICAgICAiSkF1ZGlvVHJhY2suY3BwIiwKKyAgICAgICAgIkpNZWRpYTJIVFRQU2VydmljZS5jcHAiLAorICAgICAgICAiSk1lZGlhMkhUVFBDb25uZWN0aW9uLmNwcCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXJfaGVhZGVycyIsCisgICAgICAgICJsaWJuYXRpdmVoZWxwZXJfaGVhZGVyX29ubHkiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmRsIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhL2luY2x1ZGUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9iYXNlL2NvcmUvam5pIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgZGlhZzogeworICAgICAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICB9LAorICAgIH0sCisKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9KQXVkaW9UcmFjay5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suY3BwCmluZGV4IGFjMGNjNTcuLmEwMWFmYTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9KQXVkaW9UcmFjay5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmNwcApAQCAtMjEsMjcgKzIxLDI4IEBACiAjaW5jbHVkZSAibWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmgiCiAKICNpbmNsdWRlIDxhbmRyb2lkX21lZGlhX0F1ZGlvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIFRPRE86IFN0b3JlIEphdmEgY2xhc3MvbWV0aG9kSUQgYXMgYSBtZW1iZXIgdmFyaWFibGUgaW4gdGhlIGNsYXNzLgogLy8gVE9ETzogQWRkIE5VTEwgJiYgRXhjZXB0aW9uIGNoZWNrcyBhZnRlciBldmVyeSBKTkkgY2FsbC4KIEpBdWRpb1RyYWNrOjpKQXVkaW9UcmFjayggICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDwgVXNhZ2VzIG9mIHRoZSBhcmd1bWVudHMgYXJlIGJlbG93ID4KLSAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLCAgICAgICAgICAgICAgIC8vIEF1ZGlvQXVkaW9BdHRyaWJ1dGVzCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdWRpb0Zvcm1hdCAmJiBidWZmZXJTaXplSW5CeXRlcwogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW9Gb3JtYXQgJiYgYnVmZmVyU2l6ZUluQnl0ZXMKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssICAgICAgICAgICAgIC8vIEF1ZGlvRm9ybWF0ICYmIGJ1ZmZlclNpemVJbkJ5dGVzCiAgICAgICAgIGNhbGxiYWNrX3QgY2JmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPZmZsb2FkCiAgICAgICAgIHZvaWQqIHVzZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPZmZsb2FkCiAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidWZmZXJTaXplSW5CeXRlcwotICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLCAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW9UcmFjawotICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzLCAgICAgICAgLy8gQXVkaW9BdHRyaWJ1dGVzCisgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdWRpb1RyYWNrCisgICAgICAgIGNvbnN0IGpvYmplY3QgYXR0cmlidXRlcywgICAgICAgICAgICAgICAgICAgICAvLyBBdWRpb0F0dHJpYnV0ZXMKICAgICAgICAgZmxvYXQgbWF4UmVxdWlyZWRTcGVlZCkgeyAgICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlclNpemVJbkJ5dGVzCiAKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisKICAgICBqY2xhc3MgakF1ZGlvVHJhY2tDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrIik7Ci0gICAgbUF1ZGlvVHJhY2tDbHMgPSAoamNsYXNzKSBlbnYtPk5ld0dsb2JhbFJlZihqQXVkaW9UcmFja0Nscyk7CisgICAgbUF1ZGlvVHJhY2tDbHMgPSByZWludGVycHJldF9jYXN0PGpjbGFzcz4oZW52LT5OZXdHbG9iYWxSZWYoakF1ZGlvVHJhY2tDbHMpKTsKKyAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGpBdWRpb1RyYWNrQ2xzKTsKIAogICAgIG1heFJlcXVpcmVkU3BlZWQgPSBzdGQ6Om1pbihzdGQ6Om1heChtYXhSZXF1aXJlZFNwZWVkLCAxLjBmKSwgQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUFYKTsKIApAQCAtNjQsMTAgKzY1LDE5IEBACiAgICAgam1ldGhvZElEIGpCdWlsZGVyQ3RvciA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICI8aW5pdD4iLCAiKClWIik7CiAgICAgam9iamVjdCBqQnVpbGRlck9iaiA9IGVudi0+TmV3T2JqZWN0KGpCdWlsZGVyQ2xzLCBqQnVpbGRlckN0b3IpOwogCi0gICAgam1ldGhvZElEIGpTZXRBdWRpb0F0dHJpYnV0ZXMgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAic2V0QXVkaW9BdHRyaWJ1dGVzIiwKLSAgICAgICAgICAgICIoTGFuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzOylMYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrJEJ1aWxkZXI7Iik7Ci0gICAgakJ1aWxkZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJPYmosIGpTZXRBdWRpb0F0dHJpYnV0ZXMsCi0gICAgICAgICAgICBKQXVkaW9BdHRyaWJ1dGVzOjpjcmVhdGVBdWRpb0F0dHJpYnV0ZXNPYmooZW52LCBwQXR0cmlidXRlcywgc3RyZWFtVHlwZSkpOworICAgIHsKKyAgICAgICAgc3A8Sk9iamVjdEhvbGRlcj4gYXVkaW9BdHRyaWJ1dGVzT2JqOworICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBOVUxMKSB7CisgICAgICAgICAgICBhdWRpb0F0dHJpYnV0ZXNPYmogPSBuZXcgSk9iamVjdEhvbGRlcihhdHRyaWJ1dGVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF1ZGlvQXR0cmlidXRlc09iaiA9IG5ldyBKT2JqZWN0SG9sZGVyKAorICAgICAgICAgICAgICAgICAgICBKQXVkaW9BdHRyaWJ1dGVzOjpjcmVhdGVBdWRpb0F0dHJpYnV0ZXNPYmooZW52LCBOVUxMKSk7CisgICAgICAgIH0KKyAgICAgICAgam1ldGhvZElEIGpTZXRBdWRpb0F0dHJpYnV0ZXMgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAic2V0QXVkaW9BdHRyaWJ1dGVzIiwKKyAgICAgICAgICAgICAgICAiKExhbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlczspTGFuZHJvaWQvbWVkaWEvQXVkaW9UcmFjayRCdWlsZGVyOyIpOworICAgICAgICBqQnVpbGRlck9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlck9iaiwKKyAgICAgICAgICAgICAgICBqU2V0QXVkaW9BdHRyaWJ1dGVzLCBhdWRpb0F0dHJpYnV0ZXNPYmotPmdldEpPYmplY3QoKSk7CisgICAgfQogCiAgICAgam1ldGhvZElEIGpTZXRBdWRpb0Zvcm1hdCA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJzZXRBdWRpb0Zvcm1hdCIsCiAgICAgICAgICAgICAiKExhbmRyb2lkL21lZGlhL0F1ZGlvRm9ybWF0OylMYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrJEJ1aWxkZXI7Iik7CkBAIC05Miw2ICsxMDIsNyBAQAogICAgICAgICBqQnVpbGRlck9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlck9iaiwgalNldFNlc3Npb25JZCwgc2Vzc2lvbklkKTsKICAgICB9CiAKKyAgICBtRmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOwogICAgIGlmIChjYmYgIT0gTlVMTCkgewogICAgICAgICBqbWV0aG9kSUQgalNldE9mZmxvYWRlZFBsYXliYWNrID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgInNldE9mZmxvYWRlZFBsYXliYWNrIiwKICAgICAgICAgICAgICAgICAiKFopTGFuZHJvaWQvbWVkaWEvQXVkaW9UcmFjayRCdWlsZGVyOyIpOwpAQCAtMTAwLDcgKzExMSw5IEBACiAgICAgfQogCiAgICAgam1ldGhvZElEIGpCdWlsZCA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJidWlsZCIsICIoKUxhbmRyb2lkL21lZGlhL0F1ZGlvVHJhY2s7Iik7Ci0gICAgbUF1ZGlvVHJhY2tPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJPYmosIGpCdWlsZCk7CisgICAgam9iamVjdCBqQXVkaW9UcmFja09iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlck9iaiwgakJ1aWxkKTsKKyAgICBtQXVkaW9UcmFja09iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8am9iamVjdD4oZW52LT5OZXdHbG9iYWxSZWYoakF1ZGlvVHJhY2tPYmopKTsKKyAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGpCdWlsZGVyT2JqKTsKIAogICAgIGlmIChjYmYgIT0gTlVMTCkgewogICAgICAgICAvLyBTZXQgb2ZmbG9hZCBtb2RlIGNhbGxiYWNrCkBAIC0xMTYsMTkgKzEyOSwyMCBAQAogfQogCiBKQXVkaW9UcmFjazo6fkpBdWRpb1RyYWNrKCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtQXVkaW9UcmFja0Nscyk7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobUF1ZGlvVHJhY2tPYmopOwogfQogCiBzaXplX3QgSkF1ZGlvVHJhY2s6OmZyYW1lQ291bnQoKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqR2V0QnVmZmVyU2l6ZUluRnJhbWVzID0gZW52LT5HZXRNZXRob2RJRCgKICAgICAgICAgICAgIG1BdWRpb1RyYWNrQ2xzLCAiZ2V0QnVmZmVyU2l6ZUluRnJhbWVzIiwgIigpSSIpOwogICAgIHJldHVybiBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRCdWZmZXJTaXplSW5GcmFtZXMpOwogfQogCiBzaXplX3QgSkF1ZGlvVHJhY2s6OmNoYW5uZWxDb3VudCgpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpHZXRDaGFubmVsQ291bnQgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiZ2V0Q2hhbm5lbENvdW50IiwgIigpSSIpOwogICAgIHJldHVybiBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRDaGFubmVsQ291bnQpOwogfQpAQCAtMTQzLDcgKzE1Nyw3IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqR2V0UGxheWJhY2tIZWFkUG9zaXRpb24gPSBlbnYtPkdldE1ldGhvZElEKAogICAgICAgICAgICAgbUF1ZGlvVHJhY2tDbHMsICJnZXRQbGF5YmFja0hlYWRQb3NpdGlvbiIsICIoKUkiKTsKICAgICAqcG9zaXRpb24gPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRQbGF5YmFja0hlYWRQb3NpdGlvbik7CkBAIC0xNTEsMjEgKzE2NSwyMSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotYm9vbCBKQXVkaW9UcmFjazo6Z2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKK3N0YXR1c190IEpBdWRpb1RyYWNrOjpnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKIAogICAgIGpjbGFzcyBqQXVkaW9UaW1lU3RhbXBDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9BdWRpb1RpbWVzdGFtcCIpOwogICAgIGpvYmplY3QgakF1ZGlvVGltZVN0YW1wT2JqID0gZW52LT5BbGxvY09iamVjdChqQXVkaW9UaW1lU3RhbXBDbHMpOwogCi0gICAgamZpZWxkSUQgakZyYW1lUG9zaXRpb24gPSBlbnYtPkdldEZpZWxkSUQoakF1ZGlvVGltZVN0YW1wQ2xzLCAiZnJhbWVQb3NpdGlvbiIsICJMIik7Ci0gICAgamZpZWxkSUQgak5hbm9UaW1lID0gZW52LT5HZXRGaWVsZElEKGpBdWRpb1RpbWVTdGFtcENscywgIm5hbm9UaW1lIiwgIkwiKTsKKyAgICBqZmllbGRJRCBqRnJhbWVQb3NpdGlvbiA9IGVudi0+R2V0RmllbGRJRChqQXVkaW9UaW1lU3RhbXBDbHMsICJmcmFtZVBvc2l0aW9uIiwgIkoiKTsKKyAgICBqZmllbGRJRCBqTmFub1RpbWUgPSBlbnYtPkdldEZpZWxkSUQoakF1ZGlvVGltZVN0YW1wQ2xzLCAibmFub1RpbWUiLCAiSiIpOwogCiAgICAgam1ldGhvZElEIGpHZXRUaW1lc3RhbXAgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLAotICAgICAgICAgICAgImdldFRpbWVzdGFtcCIsICIoTGFuZHJvaWQvbWVkaWEvQXVkaW9UaW1lc3RhbXApQiIpOworICAgICAgICAgICAgImdldFRpbWVzdGFtcCIsICIoTGFuZHJvaWQvbWVkaWEvQXVkaW9UaW1lc3RhbXA7KVoiKTsKICAgICBib29sIHN1Y2Nlc3MgPSBlbnYtPkNhbGxCb29sZWFuTWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0VGltZXN0YW1wLCBqQXVkaW9UaW1lU3RhbXBPYmopOwogCiAgICAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogCiAgICAgbG9uZyBsb25nIGZyYW1lUG9zaXRpb24gPSBlbnYtPkdldExvbmdGaWVsZChqQXVkaW9UaW1lU3RhbXBPYmosIGpGcmFtZVBvc2l0aW9uKTsKQEAgLTE3OCw3ICsxOTIsNyBAQAogICAgIHRpbWVzdGFtcC5tVGltZSA9IHRzOwogICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gPSAodWludDMyX3QpIGZyYW1lUG9zaXRpb247CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IEpBdWRpb1RyYWNrOjpnZXRUaW1lc3RhbXAoRXh0ZW5kZWRUaW1lc3RhbXAgKnRpbWVzdGFtcCBfX3VudXNlZCkgewpAQCAtMTg5LDcgKzIwMyw3IEBACiBzdGF0dXNfdCBKQXVkaW9UcmFjazo6c2V0UGxheWJhY2tSYXRlKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZwbGF5YmFja1JhdGUpIHsKICAgICAvLyBUT0RPOiBleGlzdGluZyBuYXRpdmUgQXVkaW9UcmFjayByZXR1cm5zIElOVkFMSURfT1BFUkFUSU9OIG9uIG9mZmxvYWQvZGlyZWN0L2Zhc3QgdHJhY2tzLgogICAgIC8vIFNob3VsZCB3ZSBkbyB0aGUgc2FtZSB0aGluZz8KLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAKICAgICBqY2xhc3MgalBsYXliYWNrUGFyYW1zQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvUGxheWJhY2tQYXJhbXMiKTsKICAgICBqbWV0aG9kSUQgalBsYXliYWNrUGFyYW1zQ3RvciA9IGVudi0+R2V0TWV0aG9kSUQoalBsYXliYWNrUGFyYW1zQ2xzLCAiPGluaXQ+IiwgIigpViIpOwpAQCAtMjI0LDcgKzIzOCw3IEBACiB9CiAKIGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlIEpBdWRpb1RyYWNrOjpnZXRQbGF5YmFja1JhdGUoKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogCiAgICAgam1ldGhvZElEIGpHZXRQbGF5YmFja1BhcmFtcyA9IGVudi0+R2V0TWV0aG9kSUQoCiAgICAgICAgICAgICBtQXVkaW9UcmFja0NscywgImdldFBsYXliYWNrUGFyYW1zIiwgIigpTGFuZHJvaWQvbWVkaWEvUGxheWJhY2tQYXJhbXM7Iik7CkBAIC0yNjYsNyArMjgwLDcgQEAKICAgICAgICAgcmV0dXJuIG1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXR1cyhCQURfVkFMVUUpOwogICAgIH0KIAotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKIAogICAgIGptZXRob2RJRCBqQ3JlYXRlVm9sdW1lU2hhcGVyID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgImNyZWF0ZVZvbHVtZVNoYXBlciIsCiAgICAgICAgICAgICAiKExhbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlciRDb25maWd1cmF0aW9uOylMYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXI7Iik7CkBAIC0yODIsNyArMjk2LDcgQEAKIH0KIAogc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnNldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCBsZXZlbCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgalNldEF1eEVmZmVjdFNlbmRMZXZlbCA9IGVudi0+R2V0TWV0aG9kSUQoCiAgICAgICAgICAgICBtQXVkaW9UcmFja0NscywgInNldEF1eEVmZmVjdFNlbmRMZXZlbCIsICIoRilJIik7CiAgICAgaW50IHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgalNldEF1eEVmZmVjdFNlbmRMZXZlbCwgbGV2ZWwpOwpAQCAtMjkwLDE0ICszMDQsMTQgQEAKIH0KIAogc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OmF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpBdHRhY2hBdXhFZmZlY3QgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiYXR0YWNoQXV4RWZmZWN0IiwgIihJKUkiKTsKICAgICBpbnQgcmVzdWx0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqQXR0YWNoQXV4RWZmZWN0LCBlZmZlY3RJZCk7CiAgICAgcmV0dXJuIGphdmFUb05hdGl2ZVN0YXR1cyhyZXN1bHQpOwogfQogCiBzdGF0dXNfdCBKQXVkaW9UcmFjazo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIC8vIFRPRE86IEphdmEgc2V0U3RlcmVvVm9sdW1lIGlzIGRlcHJlY2F0ZWQuIERvIHdlIHJlYWxseSBuZWVkIHRoaXMgbWV0aG9kPwogICAgIGptZXRob2RJRCBqU2V0U3RlcmVvVm9sdW1lID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgInNldFN0ZXJlb1ZvbHVtZSIsICIoRkYpSSIpOwogICAgIGludCByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpTZXRTdGVyZW9Wb2x1bWUsIGxlZnQsIHJpZ2h0KTsKQEAgLTMwNSwxNCArMzE5LDE0IEBACiB9CiAKIHN0YXR1c190IEpBdWRpb1RyYWNrOjpzZXRWb2x1bWUoZmxvYXQgdm9sdW1lKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqU2V0Vm9sdW1lID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgInNldFZvbHVtZSIsICIoRilJIik7CiAgICAgaW50IHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgalNldFZvbHVtZSwgdm9sdW1lKTsKICAgICByZXR1cm4gamF2YVRvTmF0aXZlU3RhdHVzKHJlc3VsdCk7CiB9CiAKIHN0YXR1c190IEpBdWRpb1RyYWNrOjpzdGFydCgpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpQbGF5ID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgInBsYXkiLCAiKClWIik7CiAgICAgLy8gVE9ETzogU2hvdWxkIHdlIGNhdGNoIHRoZSBKYXZhIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBmcm9tIHBsYXkoKT8KICAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqUGxheSk7CkBAIC0zMjQsNyArMzM4LDcgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgamJ5dGVBcnJheSBqQXVkaW9EYXRhID0gZW52LT5OZXdCeXRlQXJyYXkoc2l6ZSk7CiAgICAgZW52LT5TZXRCeXRlQXJyYXlSZWdpb24oakF1ZGlvRGF0YSwgMCwgc2l6ZSwgKGpieXRlICopIGJ1ZmZlcik7CiAKQEAgLTM1Myw3ICszNjcsNyBAQAogfQogCiB2b2lkIEpBdWRpb1RyYWNrOjpzdG9wKCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgalN0b3AgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAic3RvcCIsICIoKVYiKTsKICAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqU3RvcCk7CiAgICAgLy8gVE9ETzogU2hvdWxkIHdlIGNhdGNoIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbj8KQEAgLTM2NSwyMCArMzc5LDIwIEBACiB9CiAKIHZvaWQgSkF1ZGlvVHJhY2s6OmZsdXNoKCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgakZsdXNoID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgImZsdXNoIiwgIigpViIpOwogICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpGbHVzaCk7CiB9CiAKIHZvaWQgSkF1ZGlvVHJhY2s6OnBhdXNlKCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgalBhdXNlID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgInBhdXNlIiwgIigpViIpOwogICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpQYXVzZSk7CiAgICAgLy8gVE9ETzogU2hvdWxkIHdlIGNhdGNoIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbj8KIH0KIAogYm9vbCBKQXVkaW9UcmFjazo6aXNQbGF5aW5nKCkgY29uc3QgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgakdldFBsYXlTdGF0ZSA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJnZXRQbGF5U3RhdGUiLCAiKClJIik7CiAgICAgaW50IGN1cnJlbnRQbGF5U3RhdGUgPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRQbGF5U3RhdGUpOwogCkBAIC0zOTMsNyArNDA3LDcgQEAKIH0KIAogdWludDMyX3QgSkF1ZGlvVHJhY2s6OmdldFNhbXBsZVJhdGUoKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqR2V0U2FtcGxlUmF0ZSA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJnZXRTYW1wbGVSYXRlIiwgIigpSSIpOwogICAgIHJldHVybiBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRTYW1wbGVSYXRlKTsKIH0KQEAgLTQwMyw3ICs0MTcsNyBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgakdldEJ1ZmZlclNpemVJbkZyYW1lcyA9IGVudi0+R2V0TWV0aG9kSUQoCiAgICAgICAgICAgICBtQXVkaW9UcmFja0NscywgImdldEJ1ZmZlclNpemVJbkZyYW1lcyIsICIoKUkiKTsKICAgICBpbnQgYnVmZmVyU2l6ZUluRnJhbWVzID0gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0QnVmZmVyU2l6ZUluRnJhbWVzKTsKQEAgLTQxNywxMiArNDMxLDI2IEBACiB9CiAKIGF1ZGlvX2Zvcm1hdF90IEpBdWRpb1RyYWNrOjpmb3JtYXQoKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqR2V0QXVkaW9Gb3JtYXQgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiZ2V0QXVkaW9Gb3JtYXQiLCAiKClJIik7CiAgICAgaW50IGphdmFGb3JtYXQgPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRBdWRpb0Zvcm1hdCk7CiAgICAgcmV0dXJuIGF1ZGlvRm9ybWF0VG9OYXRpdmUoamF2YUZvcm1hdCk7CiB9CiAKK3NpemVfdCBKQXVkaW9UcmFjazo6ZnJhbWVTaXplKCkgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqbWV0aG9kSUQgakdldEZvcm1hdCA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsCisgICAgICAgICAgICAiZ2V0Rm9ybWF0IiwgIigpTGFuZHJvaWQvbWVkaWEvQXVkaW9Gb3JtYXQ7Iik7CisgICAgam9iamVjdCBqQXVkaW9Gb3JtYXRPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRGb3JtYXQpOworCisgICAgamNsYXNzIGpBdWRpb0Zvcm1hdENscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL0F1ZGlvRm9ybWF0Iik7CisgICAgam1ldGhvZElEIGpHZXRGcmFtZVNpemVJbkJ5dGVzID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIGpBdWRpb0Zvcm1hdENscywgImdldEZyYW1lU2l6ZUluQnl0ZXMiLCAiKClJIik7CisgICAgamludCBqYXZhRnJhbWVTaXplSW5CeXRlcyA9IGVudi0+Q2FsbEludE1ldGhvZChqQXVkaW9Gb3JtYXRPYmosIGpHZXRGcmFtZVNpemVJbkJ5dGVzKTsKKworICAgIHJldHVybiAoc2l6ZV90KWphdmFGcmFtZVNpemVJbkJ5dGVzOworfQorCiBzdGF0dXNfdCBKQXVkaW9UcmFjazo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpIGNvbnN0CiB7CiAgICAgU3RyaW5nOCByZXN1bHQ7CkBAIC00MzIsMTAgKzQ2MCw2IEBACiAgICAgLy8gVE9ETzogUmVtb3ZlIGxvZ3MgdGhhdCBpbmNsdWRlcyB1bmF2YWlsYWJsZSBpbmZvcm1hdGlvbiBmcm9tIGJlbG93LgogLy8gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBzdGF0dXMoJWQpLCBzdGF0ZSglZCksIHNlc3Npb24gSWQoJWQpLCBmbGFncyglI3gpXG4iLAogLy8gICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHVzLCBtU3RhdGUsIG1TZXNzaW9uSWQsIG1GbGFncyk7Ci0vLyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIHN0cmVhbSB0eXBlKCVkKSwgbGVmdCAtIHJpZ2h0IHZvbHVtZSglZiwgJWYpXG4iLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAobVN0cmVhbVR5cGUgPT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpID8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKCZtQXR0cmlidXRlcykgOiBtU3RyZWFtVHlwZSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgbVZvbHVtZVtBVURJT19JTlRFUkxFQVZFX0xFRlRdLCBtVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfUklHSFRdKTsKIC8vICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgZm9ybWF0KCUjeCksIGNoYW5uZWwgbWFzayglI3gpLCBjaGFubmVsIGNvdW50KCV1KVxuIiwKIC8vICAgICAgICAgICAgICAgICAgZm9ybWF0KCksIG1DaGFubmVsTWFzaywgY2hhbm5lbENvdW50KCkpOwogLy8gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBzYW1wbGUgcmF0ZSgldSksIG9yaWdpbmFsIHNhbXBsZSByYXRlKCV1KSwgc3BlZWQoJWYpXG4iLApAQCAtNDUzLDM4ICs0NzcsNDAgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLWF1ZGlvX3BvcnRfaGFuZGxlX3QgSkF1ZGlvVHJhY2s6OmdldFJvdXRlZERldmljZUlkKCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworam9iamVjdCBKQXVkaW9UcmFjazo6Z2V0Um91dGVkRGV2aWNlKCkgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgakdldFJvdXRlZERldmljZSA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJnZXRSb3V0ZWREZXZpY2UiLAogICAgICAgICAgICAgIigpTGFuZHJvaWQvbWVkaWEvQXVkaW9EZXZpY2VJbmZvOyIpOwotICAgIGpvYmplY3QgakF1ZGlvRGV2aWNlSW5mb09iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldFJvdXRlZERldmljZSk7Ci0gICAgaWYgKGVudi0+SXNTYW1lT2JqZWN0KGpBdWRpb0RldmljZUluZm9PYmosIE5VTEwpKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19QT1JUX0hBTkRMRV9OT05FOwotICAgIH0KLQotICAgIGpjbGFzcyBqQXVkaW9EZXZpY2VJbmZvQ2xzID0gZW52LT5GaW5kQ2xhc3MoIkxhbmRyb2lkL21lZGlhL0F1ZGlvRGV2aWNlSW5mbyIpOwotICAgIGptZXRob2RJRCBqR2V0SWQgPSBlbnYtPkdldE1ldGhvZElEKGpBdWRpb0RldmljZUluZm9DbHMsICJnZXRJZCIsICIoKUkiKTsKLSAgICBqaW50IHJvdXRlZERldmljZUlkID0gZW52LT5DYWxsSW50TWV0aG9kKGpBdWRpb0RldmljZUluZm9PYmosIGpHZXRJZCk7Ci0gICAgcmV0dXJuIHJvdXRlZERldmljZUlkOworICAgIHJldHVybiBlbnYtPkNhbGxPYmplY3RNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRSb3V0ZWREZXZpY2UpOwogfQogCi1hdWRpb19zZXNzaW9uX3QgSkF1ZGlvVHJhY2s6OmdldEF1ZGlvU2Vzc2lvbklkKCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworaW50MzJfdCBKQXVkaW9UcmFjazo6Z2V0QXVkaW9TZXNzaW9uSWQoKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqR2V0QXVkaW9TZXNzaW9uSWQgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiZ2V0QXVkaW9TZXNzaW9uSWQiLCAiKClJIik7CiAgICAgamludCBzZXNzaW9uSWQgPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRBdWRpb1Nlc3Npb25JZCk7Ci0gICAgcmV0dXJuIChhdWRpb19zZXNzaW9uX3QpIHNlc3Npb25JZDsKKyAgICByZXR1cm4gc2Vzc2lvbklkOwogfQogCi1zdGF0dXNfdCBKQXVkaW9UcmFjazo6c2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLSAgICBqY2xhc3Mgak1QMkltcGxDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXllcjJJbXBsIik7Ci0gICAgam1ldGhvZElEIGpTZXRBdWRpb091dHB1dERldmljZUJ5SWQgPSBlbnYtPkdldE1ldGhvZElEKAotICAgICAgICAgICAgak1QMkltcGxDbHMsICJzZXRBdWRpb091dHB1dERldmljZUJ5SWQiLCAiKExhbmRyb2lkL21lZGlhL0F1ZGlvVHJhY2s7SSlaIik7Ci0gICAgamJvb2xlYW4gcmVzdWx0ID0gZW52LT5DYWxsU3RhdGljQm9vbGVhbk1ldGhvZCgKLSAgICAgICAgICAgIGpNUDJJbXBsQ2xzLCBqU2V0QXVkaW9PdXRwdXREZXZpY2VCeUlkLCBtQXVkaW9UcmFja09iaiwgZGV2aWNlSWQpOworc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnNldFByZWZlcnJlZERldmljZShqb2JqZWN0IGRldmljZSkgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqbWV0aG9kSUQgalNldFByZWZlcnJlZERldmljZUlkID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgInNldFByZWZlcnJlZERldmljZSIsCisgICAgICAgICAgICAiKExhbmRyb2lkL21lZGlhL0F1ZGlvRGV2aWNlSW5mbzspWiIpOworICAgIGpib29sZWFuIHJlc3VsdCA9IGVudi0+Q2FsbEJvb2xlYW5NZXRob2QobUF1ZGlvVHJhY2tPYmosIGpTZXRQcmVmZXJyZWREZXZpY2VJZCwgZGV2aWNlKTsKICAgICByZXR1cm4gcmVzdWx0ID09IHRydWUgPyBOT19FUlJPUiA6IEJBRF9WQUxVRTsKIH0KIAorYXVkaW9fc3RyZWFtX3R5cGVfdCBKQXVkaW9UcmFjazo6Z2V0QXVkaW9TdHJlYW1UeXBlKCkgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqbWV0aG9kSUQgakdldEF1ZGlvQXR0cmlidXRlcyA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJnZXRBdWRpb0F0dHJpYnV0ZXMiLAorICAgICAgICAgICAgIigpTGFuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzOyIpOworICAgIGpvYmplY3QgakF1ZGlvQXR0cmlidXRlcyA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldEF1ZGlvQXR0cmlidXRlcyk7CisgICAgamNsYXNzIGpBdWRpb0F0dHJpYnV0ZXNDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMiKTsKKyAgICBqbWV0aG9kSUQgakdldFZvbHVtZUNvbnRyb2xTdHJlYW0gPSBlbnYtPkdldE1ldGhvZElEKGpBdWRpb0F0dHJpYnV0ZXNDbHMsCisgICAgICAgICAgICAiZ2V0Vm9sdW1lQ29udHJvbFN0cmVhbSIsICIoKUkiKTsKKyAgICBpbnQgamF2YUF1ZGlvU3RyZWFtVHlwZSA9IGVudi0+Q2FsbEludE1ldGhvZChqQXVkaW9BdHRyaWJ1dGVzLCBqR2V0Vm9sdW1lQ29udHJvbFN0cmVhbSk7CisgICAgcmV0dXJuIChhdWRpb19zdHJlYW1fdHlwZV90KWphdmFBdWRpb1N0cmVhbVR5cGU7Cit9CisKIHN0YXR1c190IEpBdWRpb1RyYWNrOjpwZW5kaW5nRHVyYXRpb24oaW50MzJfdCAqbXNlYykgewogICAgIGlmIChtc2VjID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTUyNiwxOCArNTUyLDg1IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBKQXVkaW9UcmFjazo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjaygKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjayBfX3VudXNlZCkgewotICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIGFmdGVyIGFwcHJvcHJpYXRlIEphdmEgQXVkaW9UcmFjayBtZXRob2QgaXMgYXZhaWxhYmxlLgorc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCBsaXN0ZW5lciwgam9iamVjdCBoYW5kbGVyKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGptZXRob2RJRCBqQWRkT25Sb3V0aW5nQ2hhbmdlZExpc3RlbmVyID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywKKyAgICAgICAgICAgICJhZGRPblJvdXRpbmdDaGFuZ2VkTGlzdGVuZXIiLAorICAgICAgICAgICAgIihMYW5kcm9pZC9tZWRpYS9BdWRpb1JvdXRpbmckT25Sb3V0aW5nQ2hhbmdlZExpc3RlbmVyO0xhbmRyb2lkL29zL0hhbmRsZXI7KVYiKTsKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqQWRkT25Sb3V0aW5nQ2hhbmdlZExpc3RlbmVyLCBsaXN0ZW5lciwgaGFuZGxlcik7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBKQXVkaW9UcmFjazo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjaygKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjayBfX3VudXNlZCkgewotICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIGFmdGVyIGFwcHJvcHJpYXRlIEphdmEgQXVkaW9UcmFjayBtZXRob2QgaXMgYXZhaWxhYmxlLgorc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCBsaXN0ZW5lcikgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqbWV0aG9kSUQgalJlbW92ZU9uUm91dGluZ0NoYW5nZWRMaXN0ZW5lciA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsCisgICAgICAgICAgICAicmVtb3ZlT25Sb3V0aW5nQ2hhbmdlZExpc3RlbmVyIiwKKyAgICAgICAgICAgICIoTGFuZHJvaWQvbWVkaWEvQXVkaW9Sb3V0aW5nJE9uUm91dGluZ0NoYW5nZWRMaXN0ZW5lcjspViIpOworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpSZW1vdmVPblJvdXRpbmdDaGFuZ2VkTGlzdGVuZXIsIGxpc3RlbmVyKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3ZvaWQgSkF1ZGlvVHJhY2s6OnJlZ2lzdGVyUm91dGluZ0RlbGVnYXRlcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGpvYmplY3QsIGpvYmplY3Q+PiYgcm91dGluZ0RlbGVnYXRlcykgeworICAgIGZvciAoc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGpvYmplY3QsIGpvYmplY3Q+Pjo6aXRlcmF0b3IgaXQgPSByb3V0aW5nRGVsZWdhdGVzLmJlZ2luKCk7CisgICAgICAgICAgICBpdCAhPSByb3V0aW5nRGVsZWdhdGVzLmVuZCgpOyBpdCsrKSB7CisgICAgICAgIGFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soaXQtPnNlY29uZCwgZ2V0SGFuZGxlcihpdC0+c2Vjb25kKSk7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8gICAgICAgICAgICAgICAgU3RhdGljIG1ldGhvZHMgYmVnaW4gICAgICAgICAgICAgICAgICAgLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitqb2JqZWN0IEpBdWRpb1RyYWNrOjpnZXRMaXN0ZW5lcihjb25zdCBqb2JqZWN0IHJvdXRpbmdEZWxlZ2F0ZU9iaikgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqY2xhc3MgalJvdXRpbmdEZWxlZ2F0ZUNscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL1JvdXRpbmdEZWxlZ2F0ZSIpOworICAgIGptZXRob2RJRCBqR2V0TGlzdGVuZXIgPSBlbnYtPkdldE1ldGhvZElEKGpSb3V0aW5nRGVsZWdhdGVDbHMsCisgICAgICAgICAgICAiZ2V0TGlzdGVuZXIiLCAiKClMYW5kcm9pZC9tZWRpYS9BdWRpb1JvdXRpbmckT25Sb3V0aW5nQ2hhbmdlZExpc3RlbmVyOyIpOworICAgIHJldHVybiBlbnYtPkNhbGxPYmplY3RNZXRob2Qocm91dGluZ0RlbGVnYXRlT2JqLCBqR2V0TGlzdGVuZXIpOworfQorCitqb2JqZWN0IEpBdWRpb1RyYWNrOjpnZXRIYW5kbGVyKGNvbnN0IGpvYmplY3Qgcm91dGluZ0RlbGVnYXRlT2JqKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGpjbGFzcyBqUm91dGluZ0RlbGVnYXRlQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvUm91dGluZ0RlbGVnYXRlIik7CisgICAgam1ldGhvZElEIGpHZXRIYW5kbGVyID0gZW52LT5HZXRNZXRob2RJRChqUm91dGluZ0RlbGVnYXRlQ2xzLAorICAgICAgICAiZ2V0SGFuZGxlciIsICIoKUxhbmRyb2lkL29zL0hhbmRsZXI7Iik7CisgICAgcmV0dXJuIGVudi0+Q2FsbE9iamVjdE1ldGhvZChyb3V0aW5nRGVsZWdhdGVPYmosIGpHZXRIYW5kbGVyKTsKK30KKworam9iamVjdCBKQXVkaW9UcmFjazo6YWRkR2xvYmFsUmVmKGNvbnN0IGpvYmplY3Qgb2JqKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGpvYmplY3Q+KGVudi0+TmV3R2xvYmFsUmVmKG9iaikpOworfQorCitzdGF0dXNfdCBKQXVkaW9UcmFjazo6cmVtb3ZlR2xvYmFsUmVmKGNvbnN0IGpvYmplY3Qgb2JqKSB7CisgICAgaWYgKG9iaiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihvYmopOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworam9iamVjdCBKQXVkaW9UcmFjazo6ZmluZEJ5S2V5KHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxqb2JqZWN0LCBqb2JqZWN0Pj4mIG1wLCBjb25zdCBqb2JqZWN0IGtleSkgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxqb2JqZWN0LCBqb2JqZWN0Pj46Oml0ZXJhdG9yIGl0ID0gbXAuYmVnaW4oKTsgaXQgIT0gbXAuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgaWYgKGVudi0+SXNTYW1lT2JqZWN0KGl0LT5maXJzdCwga2V5KSkgeworICAgICAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3ZvaWQgSkF1ZGlvVHJhY2s6OmVyYXNlQnlLZXkoc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGpvYmplY3QsIGpvYmplY3Q+PiYgbXAsIGNvbnN0IGpvYmplY3Qga2V5KSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGZvciAoc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGpvYmplY3QsIGpvYmplY3Q+Pjo6aXRlcmF0b3IgaXQgPSBtcC5iZWdpbigpOyBpdCAhPSBtcC5lbmQoKTsgaXQrKykgeworICAgICAgICBpZiAoZW52LT5Jc1NhbWVPYmplY3QoaXQtPmZpcnN0LCBrZXkpKSB7CisgICAgICAgICAgICBtcC5lcmFzZShpdCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vLyAgICAgICAgICAgICAgICBQcml2YXRlIG1ldGhvZCBiZWdpbnMgICAgICAgICAgICAgICAgICAvLy8KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTU1MCw3ICs2NDMsNyBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAKICAgICAvLyBSZWZlcmVuY2VkICJhbmRyb2lkX21lZGlhX1ZvbHVtZVNoYXBlci5oIi4KICAgICBqZmxvYXRBcnJheSB4YXJyYXkgPSBudWxscHRyOwpAQCAtNTk1LDcgKzY4OCw3IEBACiBqb2JqZWN0IEpBdWRpb1RyYWNrOjpjcmVhdGVWb2x1bWVTaGFwZXJPcGVyYXRpb25PYmooCiAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbikgewogCi0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogCiAgICAgamNsYXNzIGpCdWlsZGVyQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyJE9wZXJhdGlvbiRCdWlsZGVyIik7CiAgICAgam1ldGhvZElEIGpCdWlsZGVyQ3RvciA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICI8aW5pdD4iLCAiKClWIik7CkBAIC02NDcsMTUgKzc0MCwxNSBAQAogfQogCiBqb2JqZWN0IEpBdWRpb1RyYWNrOjpjcmVhdGVTdHJlYW1FdmVudENhbGxiYWNrKGNhbGxiYWNrX3QgY2JmLCB2b2lkKiB1c2VyKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7Ci0gICAgamNsYXNzIGpDYWxsYmFja0NscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL01lZGlhUGxheWVyMkltcGwkU3RyZWFtRXZlbnRDYWxsYmFjayIpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqY2xhc3MgakNhbGxiYWNrQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvTWVkaWFQbGF5ZXIyJFN0cmVhbUV2ZW50Q2FsbGJhY2siKTsKICAgICBqbWV0aG9kSUQgakNhbGxiYWNrQ3RvciA9IGVudi0+R2V0TWV0aG9kSUQoakNhbGxiYWNrQ2xzLCAiPGluaXQ+IiwgIihKSkopViIpOwogICAgIGpvYmplY3QgakNhbGxiYWNrT2JqID0gZW52LT5OZXdPYmplY3QoakNhbGxiYWNrQ2xzLCBqQ2FsbGJhY2tDdG9yLCB0aGlzLCBjYmYsIHVzZXIpOwogICAgIHJldHVybiBqQ2FsbGJhY2tPYmo7CiB9CiAKIGpvYmplY3QgSkF1ZGlvVHJhY2s6OmNyZWF0ZUNhbGxiYWNrRXhlY3V0b3IoKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGpjbGFzcyBqRXhlY3V0b3JzQ2xzID0gZW52LT5GaW5kQ2xhc3MoImphdmEvdXRpbC9jb25jdXJyZW50L0V4ZWN1dG9ycyIpOwogICAgIGptZXRob2RJRCBqTmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IgPSBlbnYtPkdldFN0YXRpY01ldGhvZElEKGpFeGVjdXRvcnNDbHMsCiAgICAgICAgICAgICAibmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IiLCAiKClMamF2YS91dGlsL2NvbmN1cnJlbnQvRXhlY3V0b3JTZXJ2aWNlOyIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQQ29ubmVjdGlvbi5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBDb25uZWN0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjY0YTdmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQQ29ubmVjdGlvbi5jcHAKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiSk1lZGlhMkhUVFBDb25uZWN0aW9uIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KTWVkaWEySFRUUENvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG5hdGl2ZWhlbHBlci9TY29wZWRMb2NhbFJlZi5oPgorCisjaW5jbHVkZSAibG9nL2xvZy5oIgorI2luY2x1ZGUgImpuaS5oIgorI2luY2x1ZGUgPG5hdGl2ZWhlbHBlci9KTklIZWxwLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IHNpemVfdCBrQnVmZmVyU2l6ZSA9IDMyNzY4OworCitKTWVkaWEySFRUUENvbm5lY3Rpb246OkpNZWRpYTJIVFRQQ29ubmVjdGlvbihKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KSB7CisgICAgbU1lZGlhMkhUVFBDb25uZWN0aW9uT2JqID0gZW52LT5OZXdHbG9iYWxSZWYodGhpeik7CisgICAgQ0hFQ0sobU1lZGlhMkhUVFBDb25uZWN0aW9uT2JqICE9IE5VTEwpOworCisgICAgU2NvcGVkTG9jYWxSZWY8amNsYXNzPiBtZWRpYTJIVFRQQ29ubmVjdGlvbkNsYXNzKAorICAgICAgICAgICAgZW52LCBlbnYtPkdldE9iamVjdENsYXNzKG1NZWRpYTJIVFRQQ29ubmVjdGlvbk9iaikpOworICAgIENIRUNLKG1lZGlhMkhUVFBDb25uZWN0aW9uQ2xhc3MuZ2V0KCkgIT0gTlVMTCk7CisKKyAgICBtQ29ubmVjdE1ldGhvZCA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBtZWRpYTJIVFRQQ29ubmVjdGlvbkNsYXNzLmdldCgpLAorICAgICAgICAgICAgImNvbm5lY3QiLAorICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspWiIpOworICAgIENIRUNLKG1Db25uZWN0TWV0aG9kICE9IE5VTEwpOworCisgICAgbURpc2Nvbm5lY3RNZXRob2QgPSBlbnYtPkdldE1ldGhvZElEKAorICAgICAgICAgICAgbWVkaWEySFRUUENvbm5lY3Rpb25DbGFzcy5nZXQoKSwKKyAgICAgICAgICAgICJkaXNjb25uZWN0IiwKKyAgICAgICAgICAgICIoKVYiKTsKKyAgICBDSEVDSyhtRGlzY29ubmVjdE1ldGhvZCAhPSBOVUxMKTsKKworICAgIG1SZWFkQXRNZXRob2QgPSBlbnYtPkdldE1ldGhvZElEKAorICAgICAgICAgICAgbWVkaWEySFRUUENvbm5lY3Rpb25DbGFzcy5nZXQoKSwKKyAgICAgICAgICAgICJyZWFkQXQiLAorICAgICAgICAgICAgIihKW0JJKUkiKTsKKyAgICBDSEVDSyhtUmVhZEF0TWV0aG9kICE9IE5VTEwpOworCisgICAgbUdldFNpemVNZXRob2QgPSBlbnYtPkdldE1ldGhvZElEKAorICAgICAgICAgICAgbWVkaWEySFRUUENvbm5lY3Rpb25DbGFzcy5nZXQoKSwKKyAgICAgICAgICAgICJnZXRTaXplIiwKKyAgICAgICAgICAgICIoKUoiKTsKKyAgICBDSEVDSyhtR2V0U2l6ZU1ldGhvZCAhPSBOVUxMKTsKKworICAgIG1HZXRNSU1FVHlwZU1ldGhvZCA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBtZWRpYTJIVFRQQ29ubmVjdGlvbkNsYXNzLmdldCgpLAorICAgICAgICAgICAgImdldE1JTUVUeXBlIiwKKyAgICAgICAgICAgICIoKUxqYXZhL2xhbmcvU3RyaW5nOyIpOworICAgIENIRUNLKG1HZXRNSU1FVHlwZU1ldGhvZCAhPSBOVUxMKTsKKworICAgIG1HZXRVcmlNZXRob2QgPSBlbnYtPkdldE1ldGhvZElEKAorICAgICAgICAgICAgbWVkaWEySFRUUENvbm5lY3Rpb25DbGFzcy5nZXQoKSwKKyAgICAgICAgICAgICJnZXRVcmkiLAorICAgICAgICAgICAgIigpTGphdmEvbGFuZy9TdHJpbmc7Iik7CisgICAgQ0hFQ0sobUdldFVyaU1ldGhvZCAhPSBOVUxMKTsKKworICAgIFNjb3BlZExvY2FsUmVmPGpieXRlQXJyYXk+IHRtcCgKKyAgICAgICAgZW52LCBlbnYtPk5ld0J5dGVBcnJheShrQnVmZmVyU2l6ZSkpOworICAgIG1CeXRlQXJyYXlPYmogPSAoamJ5dGVBcnJheSllbnYtPk5ld0dsb2JhbFJlZih0bXAuZ2V0KCkpOworICAgIENIRUNLKG1CeXRlQXJyYXlPYmogIT0gTlVMTCk7Cit9CisKK0pNZWRpYTJIVFRQQ29ubmVjdGlvbjo6fkpNZWRpYTJIVFRQQ29ubmVjdGlvbigpIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobU1lZGlhMkhUVFBDb25uZWN0aW9uT2JqKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtQnl0ZUFycmF5T2JqKTsKK30KKworYm9vbCBKTWVkaWEySFRUUENvbm5lY3Rpb246OmNvbm5lY3QoCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKKyAgICBTdHJpbmc4IHRtcCgiIik7CisgICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlYWRlcnMtPnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICB0bXAuYXBwZW5kKGhlYWRlcnMtPmtleUF0KGkpKTsKKyAgICAgICAgICAgIHRtcC5hcHBlbmQoU3RyaW5nOCgiOiAiKSk7CisgICAgICAgICAgICB0bXAuYXBwZW5kKGhlYWRlcnMtPnZhbHVlQXQoaSkpOworICAgICAgICAgICAgdG1wLmFwcGVuZChTdHJpbmc4KCJcclxuIikpOworICAgICAgICB9CisgICAgfQorCisgICAgSk5JRW52KiBlbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGpzdHJpbmcganVyaSA9IGVudi0+TmV3U3RyaW5nVVRGKHVyaSk7CisgICAganN0cmluZyBqaGVhZGVycyA9IGVudi0+TmV3U3RyaW5nVVRGKHRtcC5zdHJpbmcoKSk7CisKKyAgICBqYm9vbGVhbiByZXQgPQorICAgICAgICBlbnYtPkNhbGxCb29sZWFuTWV0aG9kKG1NZWRpYTJIVFRQQ29ubmVjdGlvbk9iaiwgbUNvbm5lY3RNZXRob2QsIGp1cmksIGpoZWFkZXJzKTsKKworICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoanVyaSk7CisgICAgZW52LT5EZWxldGVMb2NhbFJlZihqaGVhZGVycyk7CisKKyAgICByZXR1cm4gKGJvb2wpcmV0OworfQorCit2b2lkIEpNZWRpYTJIVFRQQ29ubmVjdGlvbjo6ZGlzY29ubmVjdCgpIHsKKyAgICBKTklFbnYqIGVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtTWVkaWEySFRUUENvbm5lY3Rpb25PYmosIG1EaXNjb25uZWN0TWV0aG9kKTsKK30KKworc3NpemVfdCBKTWVkaWEySFRUUENvbm5lY3Rpb246OnJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBKTklFbnYqIGVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisKKyAgICBpZiAoc2l6ZSA+IGtCdWZmZXJTaXplKSB7CisgICAgICAgIHNpemUgPSBrQnVmZmVyU2l6ZTsKKyAgICB9CisKKyAgICBqaW50IG4gPSBlbnYtPkNhbGxJbnRNZXRob2QoCisgICAgICAgICAgICBtTWVkaWEySFRUUENvbm5lY3Rpb25PYmosIG1SZWFkQXRNZXRob2QsIChqbG9uZylvZmZzZXQsIG1CeXRlQXJyYXlPYmosIChqaW50KXNpemUpOworCisgICAgaWYgKG4gPiAwKSB7CisgICAgICAgIGVudi0+R2V0Qnl0ZUFycmF5UmVnaW9uKAorICAgICAgICAgICAgICAgIG1CeXRlQXJyYXlPYmosCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBuLAorICAgICAgICAgICAgICAgIChqYnl0ZSAqKWRhdGEpOworICAgIH0KKworICAgIHJldHVybiBuOworfQorCitvZmY2NF90IEpNZWRpYTJIVFRQQ29ubmVjdGlvbjo6Z2V0U2l6ZSgpIHsKKyAgICBKTklFbnYqIGVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgcmV0dXJuIChvZmY2NF90KShlbnYtPkNhbGxMb25nTWV0aG9kKG1NZWRpYTJIVFRQQ29ubmVjdGlvbk9iaiwgbUdldFNpemVNZXRob2QpKTsKK30KKworc3RhdHVzX3QgSk1lZGlhMkhUVFBDb25uZWN0aW9uOjpnZXRNSU1FVHlwZShTdHJpbmc4ICptaW1lVHlwZSkgeworICAgIEpOSUVudiogZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqc3RyaW5nIGptaW1lID0gKGpzdHJpbmcpZW52LT5DYWxsT2JqZWN0TWV0aG9kKG1NZWRpYTJIVFRQQ29ubmVjdGlvbk9iaiwgbUdldE1JTUVUeXBlTWV0aG9kKTsKKyAgICBqYm9vbGVhbiBmbGFnID0gZW52LT5FeGNlcHRpb25DaGVjaygpOworICAgIGlmIChmbGFnKSB7CisgICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgY29uc3QgY2hhciAqc3RyID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhqbWltZSwgMCk7CisgICAgaWYgKHN0ciAhPSBOVUxMKSB7CisgICAgICAgICptaW1lVHlwZSA9IFN0cmluZzgoc3RyKTsKKyAgICB9IGVsc2UgeworICAgICAgICAqbWltZVR5cGUgPSAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIjsKKyAgICB9CisgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoam1pbWUsIHN0cik7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBKTWVkaWEySFRUUENvbm5lY3Rpb246OmdldFVyaShTdHJpbmc4ICp1cmkpIHsKKyAgICBKTklFbnYqIGVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAganN0cmluZyBqdXJpID0gKGpzdHJpbmcpZW52LT5DYWxsT2JqZWN0TWV0aG9kKG1NZWRpYTJIVFRQQ29ubmVjdGlvbk9iaiwgbUdldFVyaU1ldGhvZCk7CisgICAgamJvb2xlYW4gZmxhZyA9IGVudi0+RXhjZXB0aW9uQ2hlY2soKTsKKyAgICBpZiAoZmxhZykgeworICAgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGNvbnN0IGNoYXIgKnN0ciA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoanVyaSwgMCk7CisgICAgKnVyaSA9IFN0cmluZzgoc3RyKTsKKyAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqdXJpLCBzdHIpOworICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9KTWVkaWEySFRUUFNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQU2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY0YzE1ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9KTWVkaWEySFRUUFNlcnZpY2UuY3BwCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiSk1lZGlhMkhUVFBTZXJ2aWNlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8am5pLmg+CisKKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KTWVkaWEySFRUUENvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorCisjaW5jbHVkZSA8bmF0aXZlaGVscGVyL0pOSUhlbHAuaD4KKyNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvU2NvcGVkTG9jYWxSZWYuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitKTWVkaWEySFRUUFNlcnZpY2U6OkpNZWRpYTJIVFRQU2VydmljZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KSB7CisgICAgbU1lZGlhMkhUVFBTZXJ2aWNlT2JqID0gZW52LT5OZXdHbG9iYWxSZWYodGhpeik7CisgICAgQ0hFQ0sobU1lZGlhMkhUVFBTZXJ2aWNlT2JqICE9IE5VTEwpOworCisgICAgU2NvcGVkTG9jYWxSZWY8amNsYXNzPiBtZWRpYTJIVFRQU2VydmljZUNsYXNzKGVudiwgZW52LT5HZXRPYmplY3RDbGFzcyhtTWVkaWEySFRUUFNlcnZpY2VPYmopKTsKKyAgICBDSEVDSyhtZWRpYTJIVFRQU2VydmljZUNsYXNzLmdldCgpICE9IE5VTEwpOworCisgICAgbU1ha2VIVFRQQ29ubmVjdGlvbk1ldGhvZCA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBtZWRpYTJIVFRQU2VydmljZUNsYXNzLmdldCgpLAorICAgICAgICAgICAgIm1ha2VIVFRQQ29ubmVjdGlvbiIsCisgICAgICAgICAgICAiKClMYW5kcm9pZC9tZWRpYS9NZWRpYTJIVFRQQ29ubmVjdGlvbjsiKTsKKyAgICBDSEVDSyhtTWFrZUhUVFBDb25uZWN0aW9uTWV0aG9kICE9IE5VTEwpOworfQorCitKTWVkaWEySFRUUFNlcnZpY2U6On5KTWVkaWEySFRUUFNlcnZpY2UoKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1NZWRpYTJIVFRQU2VydmljZU9iaik7Cit9CisKK3NwPE1lZGlhSFRUUENvbm5lY3Rpb24+IEpNZWRpYTJIVFRQU2VydmljZTo6bWFrZUhUVFBDb25uZWN0aW9uKCkgeworICAgIEpOSUVudiogZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqb2JqZWN0IG1lZGlhMkhUVFBDb25uZWN0aW9uT2JqID0KKyAgICAgICAgZW52LT5DYWxsT2JqZWN0TWV0aG9kKG1NZWRpYTJIVFRQU2VydmljZU9iaiwgbU1ha2VIVFRQQ29ubmVjdGlvbk1ldGhvZCk7CisKKyAgICByZXR1cm4gbmV3IEpNZWRpYTJIVFRQQ29ubmVjdGlvbihlbnYsIG1lZGlhMkhUVFBDb25uZWN0aW9uT2JqKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9KYXZhVk1IZWxwZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBhYWE3ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9KYXZhVk1IZWxwZXIuY3BwCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiSmF2YVZNSGVscGVyIgorCisjaW5jbHVkZSAibWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHN0YXRpYworc3RkOjphdG9taWM8SmF2YVZNICo+IEphdmFWTUhlbHBlcjo6c0phdmFWTShOVUxMKTsKKworLy8gc3RhdGljCitKTklFbnYgKkphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCkgeworICAgIEpOSUVudiAqZW52OworICAgIEphdmFWTSAqdm0gPSBzSmF2YVZNLmxvYWQoKTsKKyAgICBDSEVDSyh2bSAhPSBOVUxMKTsKKworICAgIGlmICh2bS0+R2V0RW52KCh2b2lkICoqKSZlbnYsIEpOSV9WRVJTSU9OXzFfNCkgIT0gSk5JX09LKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBlbnY7Cit9CisKKy8vIHN0YXRpYwordm9pZCBKYXZhVk1IZWxwZXI6OnNldEphdmFWTShKYXZhVk0gKnZtKSB7CisgICAgc0phdmFWTS5zdG9yZSh2bSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkF1ZGlvT3V0cHV0LmNwcAppbmRleCBhOGUxZDFmLi45OGEzZTc1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5jcHAKQEAgLTIzLDcgKzIzLDYgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAKIG5hbWVzcGFjZSB7CkBAIC00NCwzMSArNDMsMjggQEAKICAgICBTdHJpbmc4IHJlc3VsdDsKIAogICAgIHJlc3VsdC5hcHBlbmQoIiBNZWRpYVBsYXllcjJBdWRpb091dHB1dFxuIik7Ci0gICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIHN0cmVhbSB0eXBlKCVkKSwgbGVmdCAtIHJpZ2h0IHZvbHVtZSglZiwgJWYpXG4iLAotICAgICAgICAgICAgbVN0cmVhbVR5cGUsIG1MZWZ0Vm9sdW1lLCBtUmlnaHRWb2x1bWUpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiICB2b2x1bWUoJWYpXG4iLCBtVm9sdW1lKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIG1zZWMgcGVyIGZyYW1lKCVmKSwgbGF0ZW5jeSAoJWQpXG4iLAotICAgICAgICAgICAgbU1zZWNzUGVyRnJhbWUsIChtVHJhY2sgIT0gMCkgPyBtVHJhY2stPmxhdGVuY3koKSA6IC0xKTsKKyAgICAgICAgICAgIG1Nc2Vjc1BlckZyYW1lLCAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpID8gbUpBdWRpb1RyYWNrLT5sYXRlbmN5KCkgOiAtMSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiICBhdXggZWZmZWN0IGlkKCVkKSwgc2VuZCBsZXZlbCAoJWYpXG4iLAogICAgICAgICAgICAgbUF1eEVmZmVjdElkLCBtU2VuZExldmVsKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAKICAgICA6OndyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICBtVHJhY2stPmR1bXAoZmQsIGFyZ3MpOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtSkF1ZGlvVHJhY2stPmR1bXAoZmQsIGFyZ3MpOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLU1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpNZWRpYVBsYXllcjJBdWRpb091dHB1dChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLCB1aWRfdCB1aWQsIGludCBwaWQsCi0gICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogYXR0ciwgY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBkZXZpY2VDYWxsYmFjaykKLSAgICA6IG1DYWxsYmFjayhOVUxMKSwKLSAgICAgIG1DYWxsYmFja0Nvb2tpZShOVUxMKSwKLSAgICAgIG1DYWxsYmFja0RhdGEoTlVMTCksCi0gICAgICBtU3RyZWFtVHlwZShBVURJT19TVFJFQU1fTVVTSUMpLAotICAgICAgbUxlZnRWb2x1bWUoMS4wKSwKLSAgICAgIG1SaWdodFZvbHVtZSgxLjApLAorTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6Ok1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KGludDMyX3Qgc2Vzc2lvbklkLCB1aWRfdCB1aWQsIGludCBwaWQsCisgICAgICAgIGNvbnN0IGpvYmplY3QgYXR0cmlidXRlcykKKyAgICA6IG1DYWxsYmFjayhudWxscHRyKSwKKyAgICAgIG1DYWxsYmFja0Nvb2tpZShudWxscHRyKSwKKyAgICAgIG1DYWxsYmFja0RhdGEobnVsbHB0ciksCisgICAgICBtVm9sdW1lKDEuMCksCiAgICAgICBtUGxheWJhY2tSYXRlKEFVRElPX1BMQVlCQUNLX1JBVEVfREVGQVVMVCksCiAgICAgICBtU2FtcGxlUmF0ZUh6KDApLAogICAgICAgbU1zZWNzUGVyRnJhbWUoMCksCkBAIC03OCwyOCArNzQsMjIgQEAKICAgICAgIG1QaWQocGlkKSwKICAgICAgIG1TZW5kTGV2ZWwoMC4wKSwKICAgICAgIG1BdXhFZmZlY3RJZCgwKSwKLSAgICAgIG1GbGFncyhBVURJT19PVVRQVVRfRkxBR19OT05FKSwKLSAgICAgIG1TZWxlY3RlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLAotICAgICAgbVJvdXRlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLAotICAgICAgbURldmljZUNhbGxiYWNrRW5hYmxlZChmYWxzZSksCi0gICAgICBtRGV2aWNlQ2FsbGJhY2soZGV2aWNlQ2FsbGJhY2spIHsKKyAgICAgIG1GbGFncyhBVURJT19PVVRQVVRfRkxBR19OT05FKSB7CiAgICAgQUxPR1YoIk1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KCVkKSIsIHNlc3Npb25JZCk7Ci0gICAgaWYgKGF0dHIgIT0gTlVMTCkgewotICAgICAgICBtQXR0cmlidXRlcyA9IChhdWRpb19hdHRyaWJ1dGVzX3QgKikgY2FsbG9jKDEsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgaWYgKG1BdHRyaWJ1dGVzICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1lbWNweShtQXR0cmlidXRlcywgYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgICAgICAgICAgbVN0cmVhbVR5cGUgPSBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKGF0dHIpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUF0dHJpYnV0ZXMgPSBOVUxMOworCisgICAgaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbHB0cikgeworICAgICAgICBtQXR0cmlidXRlcyA9IG5ldyBKT2JqZWN0SG9sZGVyKGF0dHJpYnV0ZXMpOwogICAgIH0KIAogICAgIHNldE1pbkJ1ZmZlckNvdW50KCk7CisgICAgbVJvdXRpbmdEZWxlZ2F0ZXMuY2xlYXIoKTsKIH0KIAogTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6On5NZWRpYVBsYXllcjJBdWRpb091dHB1dCgpIHsKKyAgICBmb3IgKGF1dG8gcm91dGluZ0RlbGVnYXRlIDogbVJvdXRpbmdEZWxlZ2F0ZXMpIHsKKyAgICAgICAgSkF1ZGlvVHJhY2s6OnJlbW92ZUdsb2JhbFJlZihyb3V0aW5nRGVsZWdhdGUuc2Vjb25kKTsKKyAgICB9CiAgICAgY2xvc2UoKTsKLSAgICBmcmVlKG1BdHRyaWJ1dGVzKTsKICAgICBkZWxldGUgbUNhbGxiYWNrRGF0YTsKIH0KIApAQCAtMTI2LDMxICsxMTYsMzEgQEAKIAogc3NpemVfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6YnVmZmVyU2l6ZSgpIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICByZXR1cm4gbVRyYWNrLT5mcmFtZUNvdW50KCkgKiBtRnJhbWVTaXplOworICAgIHJldHVybiBtSkF1ZGlvVHJhY2stPmZyYW1lQ291bnQoKSAqIG1GcmFtZVNpemU7CiB9CiAKIHNzaXplX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmZyYW1lQ291bnQoKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgcmV0dXJuIG1UcmFjay0+ZnJhbWVDb3VudCgpOworICAgIHJldHVybiBtSkF1ZGlvVHJhY2stPmZyYW1lQ291bnQoKTsKIH0KIAogc3NpemVfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Y2hhbm5lbENvdW50KCkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIHJldHVybiBtVHJhY2stPmNoYW5uZWxDb3VudCgpOworICAgIHJldHVybiBtSkF1ZGlvVHJhY2stPmNoYW5uZWxDb3VudCgpOwogfQogCiBzc2l6ZV90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpmcmFtZVNpemUoKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgcmV0dXJuIG1GcmFtZVNpemU7CkBAIC0xNTgsMTAgKzE0OCwxMCBAQAogCiB1aW50MzJfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6bGF0ZW5jeSAoKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgcmV0dXJuIG1UcmFjay0+bGF0ZW5jeSgpOworICAgIHJldHVybiBtSkF1ZGlvVHJhY2stPmxhdGVuY3koKTsKIH0KIAogZmxvYXQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6Om1zZWNzUGVyRnJhbWUoKSBjb25zdCB7CkBAIC0xNzEsMTggKzE2MSwxOCBAQAogCiBzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0UG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgcmV0dXJuIG1UcmFjay0+Z2V0UG9zaXRpb24ocG9zaXRpb24pOworICAgIHJldHVybiBtSkF1ZGlvVHJhY2stPmdldFBvc2l0aW9uKHBvc2l0aW9uKTsKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCAmdHMpIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICByZXR1cm4gbVRyYWNrLT5nZXRUaW1lc3RhbXAodHMpOworICAgIHJldHVybiBtSkF1ZGlvVHJhY2stPmdldFRpbWVzdGFtcCh0cyk7CiB9CiAKIC8vIFRPRE86IFJlbW92ZSB1bm5lY2Vzc2FyeSBjYWxscyB0byBnZXRQbGF5ZWRPdXREdXJhdGlvblVzKCkKQEAgLTE5NSw3ICsxODUsNyBAQAogLy8gQ2FsY3VsYXRlIGR1cmF0aW9uIG9mIHBsYXllZCBzYW1wbGVzIGlmIHBsYXllZCBhdCBub3JtYWwgcmF0ZSAoaS5lLiwgMS4wKS4KIGludDY0X3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFBsYXllZE91dER1cmF0aW9uVXMoaW50NjRfdCBub3dVcykgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDAgfHwgbVNhbXBsZVJhdGVIeiA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyIHx8IG1TYW1wbGVSYXRlSHogPT0gMCkgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKQEAgLTIwMywyMiArMTkzLDE4IEBACiAgICAgaW50NjRfdCBudW1GcmFtZXNQbGF5ZWRBdFVzOwogICAgIEF1ZGlvVGltZXN0YW1wIHRzOwogCi0gICAgc3RhdHVzX3QgcmVzID0gbVRyYWNrLT5nZXRUaW1lc3RhbXAodHMpOworICAgIHN0YXR1c190IHJlcyA9IG1KQXVkaW9UcmFjay0+Z2V0VGltZXN0YW1wKHRzKTsKKwogICAgIGlmIChyZXMgPT0gT0spIHsgICAgICAgICAgICAgICAgIC8vIGNhc2UgMTogbWl4aW5nIGF1ZGlvIHRyYWNrcyBhbmQgb2ZmbG9hZGVkIHRyYWNrcy4KICAgICAgICAgbnVtRnJhbWVzUGxheWVkID0gdHMubVBvc2l0aW9uOwogICAgICAgICBudW1GcmFtZXNQbGF5ZWRBdFVzID0gdHMubVRpbWUudHZfc2VjICogMTAwMDAwMExMICsgdHMubVRpbWUudHZfbnNlYyAvIDEwMDA7CiAgICAgICAgIC8vQUxPR0QoImdldFRpbWVzdGFtcDogT0sgJWQgJWxsZCIsIG51bUZyYW1lc1BsYXllZCwgKGxvbmcgbG9uZyludW1GcmFtZXNQbGF5ZWRBdFVzKTsKLSAgICB9IGVsc2UgaWYgKHJlcyA9PSBXT1VMRF9CTE9DSykgeyAvLyBjYXNlIDI6IHRyYW5zaXRvcnkgc3RhdGUgb24gc3RhcnQgb2YgYSBuZXcgdHJhY2sKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIDI6IHRyYW5zaXRvcnkgc3RhdGUgb24gc3RhcnQgb2YgYSBuZXcgdHJhY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIDM6IHRyYW5zaXRvcnkgYXQgbmV3IHRyYWNrIG9yIGF1ZGlvIGZhc3QgdHJhY2tzLgogICAgICAgICBudW1GcmFtZXNQbGF5ZWQgPSAwOwogICAgICAgICBudW1GcmFtZXNQbGF5ZWRBdFVzID0gbm93VXM7CiAgICAgICAgIC8vQUxPR0QoImdldFRpbWVzdGFtcDogV09VTERfQkxPQ0sgJWQgJWxsZCIsCiAgICAgICAgIC8vICAgICAgICBudW1GcmFtZXNQbGF5ZWQsIChsb25nIGxvbmcpbnVtRnJhbWVzUGxheWVkQXRVcyk7Ci0gICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSAzOiB0cmFuc2l0b3J5IGF0IG5ldyB0cmFjayBvciBhdWRpbyBmYXN0IHRyYWNrcy4KLSAgICAgICAgcmVzID0gbVRyYWNrLT5nZXRQb3NpdGlvbigmbnVtRnJhbWVzUGxheWVkKTsKLSAgICAgICAgQ0hFQ0tfRVEocmVzLCAoc3RhdHVzX3QpT0spOwotICAgICAgICBudW1GcmFtZXNQbGF5ZWRBdFVzID0gbm93VXM7Ci0gICAgICAgIG51bUZyYW1lc1BsYXllZEF0VXMgKz0gMTAwMExMICogbVRyYWNrLT5sYXRlbmN5KCkgLyAyOyAvKiBYWFggKi8KLSAgICAgICAgLy9BTE9HRCgiZ2V0UG9zaXRpb246ICV1ICVsbGQiLCBudW1GcmFtZXNQbGF5ZWQsIChsb25nIGxvbmcpbnVtRnJhbWVzUGxheWVkQXRVcyk7CiAgICAgfQogCiAgICAgLy8gQ0hFQ0tfRVEobnVtRnJhbWVzUGxheWVkICYgKDEgPDwgMzEpLCAwKTsgIC8vIGNhbid0IGJlIG5lZ2F0aXZlIHVudGlsIDEyLjQgaHJzLCB0ZXN0CkBAIC0yNDQsMTA4ICsyMzAsNTUgQEAKIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QgKmZyYW1lc3dyaXR0ZW4pIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBFeHRlbmRlZFRpbWVzdGFtcCBldHM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbVRyYWNrLT5nZXRUaW1lc3RhbXAoJmV0cyk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUpBdWRpb1RyYWNrLT5nZXRUaW1lc3RhbXAoJmV0cyk7CiAgICAgaWYgKHN0YXR1cyA9PSBPSyB8fCBzdGF0dXMgPT0gV09VTERfQkxPQ0spIHsKICAgICAgICAgKmZyYW1lc3dyaXR0ZW4gPSAodWludDMyX3QpZXRzLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fQ0xJRU5UXTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykgewordm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c2V0QXVkaW9BdHRyaWJ1dGVzKGNvbnN0IGpvYmplY3QgYXR0cmlidXRlcykgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtVHJhY2stPnNldFBhcmFtZXRlcnMoa2V5VmFsdWVQYWlycyk7CisgICAgbUF0dHJpYnV0ZXMgPSAoYXR0cmlidXRlcyA9PSBudWxscHRyKSA/IG51bGxwdHIgOiBuZXcgSk9iamVjdEhvbGRlcihhdHRyaWJ1dGVzKTsKIH0KIAotU3RyaW5nOCAgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cykgeworYXVkaW9fc3RyZWFtX3R5cGVfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0QXVkaW9TdHJlYW1UeXBlKCkgY29uc3QgeworICAgIEFMT0dWKCJnZXRBdWRpb1N0cmVhbVR5cGUiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmc4OjplbXB0eSgpOworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0RFRkFVTFQ7CiAgICAgfQotICAgIHJldHVybiBtVHJhY2stPmdldFBhcmFtZXRlcnMoa2V5cyk7Ci19Ci0KLXZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnNldEF1ZGlvQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKiBhdHRyaWJ1dGVzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChhdHRyaWJ1dGVzID09IE5VTEwpIHsKLSAgICAgICAgZnJlZShtQXR0cmlidXRlcyk7Ci0gICAgICAgIG1BdHRyaWJ1dGVzID0gTlVMTDsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAobUF0dHJpYnV0ZXMgPT0gTlVMTCkgewotICAgICAgICAgICAgbUF0dHJpYnV0ZXMgPSAoYXVkaW9fYXR0cmlidXRlc190ICopIGNhbGxvYygxLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtY3B5KG1BdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0gICAgICAgIG1TdHJlYW1UeXBlID0gYXVkaW9fYXR0cmlidXRlc190b19zdHJlYW1fdHlwZShhdHRyaWJ1dGVzKTsKLSAgICB9Ci19Ci0KLXZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnNldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgLy8gZG8gbm90IGFsbG93IGRpcmVjdCBzdHJlYW0gdHlwZSBtb2RpZmljYXRpb24gaWYgYXR0cmlidXRlcyBoYXZlIGJlZW4gc2V0Ci0gICAgaWYgKG1BdHRyaWJ1dGVzID09IE5VTEwpIHsKLSAgICAgICAgbVN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOwotICAgIH0KKyAgICByZXR1cm4gbUpBdWRpb1RyYWNrLT5nZXRBdWRpb1N0cmVhbVR5cGUoKTsKIH0KIAogdm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Y2xvc2VfbCgpIHsKLSAgICBtVHJhY2suY2xlYXIoKTsKKyAgICBtSkF1ZGlvVHJhY2suY2xlYXIoKTsKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6Om9wZW4oCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGludCBjaGFubmVsQ291bnQsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBidWZmZXJDb3VudCwKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICBBdWRpb0NhbGxiYWNrIGNiLCB2b2lkICpjb29raWUsCiAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8sCi0gICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QsCiAgICAgICAgIHVpbnQzMl90IHN1Z2dlc3RlZEZyYW1lQ291bnQpIHsKLSAgICBBTE9HVigib3BlbigldSwgJWQsIDB4JXgsIDB4JXgsICVkLCAlZCAweCV4KSIsIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCwgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgZm9ybWF0LCBidWZmZXJDb3VudCwgbVNlc3Npb25JZCwgZmxhZ3MpOworICAgIEFMT0dWKCJvcGVuKCV1LCAlZCwgMHgleCwgMHgleCwgJWQgMHgleCkiLCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQsIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgIGZvcm1hdCwgbVNlc3Npb25JZCwgZmxhZ3MpOwogCiAgICAgLy8gb2ZmbG9hZGluZyBpcyBvbmx5IHN1cHBvcnRlZCBpbiBjYWxsYmFjayBtb2RlIGZvciBub3cuCiAgICAgLy8gb2ZmbG9hZEluZm8gbXVzdCBiZSBwcmVzZW50IGlmIG9mZmxvYWQgZmxhZyBpcyBzZXQKICAgICBpZiAoKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApICYmCi0gICAgICAgICAgICAoKGNiID09IE5VTEwpIHx8IChvZmZsb2FkSW5mbyA9PSBOVUxMKSkpIHsKKyAgICAgICAgICAgICgoY2IgPT0gbnVsbHB0cikgfHwgKG9mZmxvYWRJbmZvID09IG51bGxwdHIpKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIC8vIGNvbXB1dGUgZnJhbWUgY291bnQgZm9yIHRoZSBBdWRpb1RyYWNrIGludGVybmFsIGJ1ZmZlcgotICAgIHNpemVfdCBmcmFtZUNvdW50OwotICAgIGlmICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwKSB7Ci0gICAgICAgIGZyYW1lQ291bnQgPSAwOyAvLyBBdWRpb1RyYWNrIHdpbGwgZ2V0IGZyYW1lIGNvdW50IGZyb20gQXVkaW9GbGluZ2VyCi0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gdHJ5IHRvIGVzdGltYXRlIHRoZSBidWZmZXIgcHJvY2Vzc2luZyBmZXRjaCBzaXplIGZyb20gQXVkaW9GbGluZ2VyLgotICAgICAgICAvLyBmcmFtZXNQZXJCdWZmZXIgaXMgYXBwcm94aW1hdGUgYW5kIGdlbmVyYWxseSBjb3JyZWN0LCBleGNlcHQgd2hlbiBpdCdzIG5vdCA6LSkuCi0gICAgICAgIHVpbnQzMl90IGFmU2FtcGxlUmF0ZTsKLSAgICAgICAgc2l6ZV90IGFmRnJhbWVDb3VudDsKLSAgICAgICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGcmFtZUNvdW50KCZhZkZyYW1lQ291bnQsIG1TdHJlYW1UeXBlKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRTYW1wbGluZ1JhdGUoJmFmU2FtcGxlUmF0ZSwgbVN0cmVhbVR5cGUpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgfQotICAgICAgICBjb25zdCBzaXplX3QgZnJhbWVzUGVyQnVmZmVyID0KLSAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNhbXBsZVJhdGUgKiBhZkZyYW1lQ291bnQgLyBhZlNhbXBsZVJhdGU7Ci0KLSAgICAgICAgaWYgKGJ1ZmZlckNvdW50ID09IDApIHsKLSAgICAgICAgICAgIC8vIHVzZSBzdWdnZXN0ZWRGcmFtZUNvdW50Ci0gICAgICAgICAgICBidWZmZXJDb3VudCA9IChzdWdnZXN0ZWRGcmFtZUNvdW50ICsgZnJhbWVzUGVyQnVmZmVyIC0gMSkgLyBmcmFtZXNQZXJCdWZmZXI7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ2hlY2sgYXJndW1lbnQgYnVmZmVyQ291bnQgYWdhaW5zdCB0aGUgbWluaW51bSBidWZmZXIgY291bnQKLSAgICAgICAgaWYgKGJ1ZmZlckNvdW50ICE9IDAgJiYgYnVmZmVyQ291bnQgPCBtTWluQnVmZmVyQ291bnQpIHsKLSAgICAgICAgICAgIEFMT0dWKCJidWZmZXJDb3VudCAoJWQpIGluY3JlYXNlZCB0byAlZCIsIGJ1ZmZlckNvdW50LCBtTWluQnVmZmVyQ291bnQpOwotICAgICAgICAgICAgYnVmZmVyQ291bnQgPSBtTWluQnVmZmVyQ291bnQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gaWYgZnJhbWVDb3VudCBpcyAwLCB0aGVuIEF1ZGlvVHJhY2sgd2lsbCBnZXQgZnJhbWUgY291bnQgZnJvbSBBdWRpb0ZsaW5nZXIKLSAgICAgICAgLy8gd2hpY2ggd2lsbCBiZSB0aGUgbWluaW11bSBzaXplIHBlcm1pdHRlZC4KLSAgICAgICAgZnJhbWVDb3VudCA9IGJ1ZmZlckNvdW50ICogZnJhbWVzUGVyQnVmZmVyOwotICAgIH0KKyAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudCA9CisgICAgICAgICAgICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwKSA/IDAgOiBzdWdnZXN0ZWRGcmFtZUNvdW50OwogCiAgICAgaWYgKGNoYW5uZWxNYXNrID09IENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUikgewogICAgICAgICBjaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChjaGFubmVsQ291bnQpOwpAQCAtMzU5LDMyICsyOTIsMjMgQEAKICAgICBtQ2FsbGJhY2sgPSBjYjsKICAgICBtQ2FsbGJhY2tDb29raWUgPSBjb29raWU7CiAKLSAgICBzcDxBdWRpb1RyYWNrPiB0OwotICAgIENhbGxiYWNrRGF0YSAqbmV3Y2JkID0gTlVMTDsKKyAgICBzcDxKQXVkaW9UcmFjaz4galQ7CisgICAgQ2FsbGJhY2tEYXRhICpuZXdjYmQgPSBudWxscHRyOwogCi0gICAgQUxPR1YoImNyZWF0aW5nIG5ldyBBdWRpb1RyYWNrIik7CisgICAgQUxPR1YoImNyZWF0aW5nIG5ldyBKQXVkaW9UcmFjayIpOwogCi0gICAgaWYgKG1DYWxsYmFjayAhPSBOVUxMKSB7CisgICAgaWYgKG1DYWxsYmFjayAhPSBudWxscHRyKSB7CiAgICAgICAgIG5ld2NiZCA9IG5ldyBDYWxsYmFja0RhdGEodGhpcyk7Ci0gICAgICAgIHQgPSBuZXcgQXVkaW9UcmFjaygKLSAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgICAgIENhbGxiYWNrV3JhcHBlciwKLSAgICAgICAgICAgICAgICBuZXdjYmQsCi0gICAgICAgICAgICAgICAgMCwgIC8vIG5vdGlmaWNhdGlvbiBmcmFtZXMKLSAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLAotICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2s6OlRSQU5TRkVSX0NBTExCQUNLLAotICAgICAgICAgICAgICAgIG9mZmxvYWRJbmZvLAotICAgICAgICAgICAgICAgIG1VaWQsCi0gICAgICAgICAgICAgICAgbVBpZCwKLSAgICAgICAgICAgICAgICBtQXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICBkb05vdFJlY29ubmVjdCwKLSAgICAgICAgICAgICAgICAxLjBmLCAgLy8gZGVmYXVsdCB2YWx1ZSBmb3IgbWF4UmVxdWlyZWRTcGVlZAotICAgICAgICAgICAgICAgIG1TZWxlY3RlZERldmljZUlkKTsKKyAgICAgICAgalQgPSBuZXcgSkF1ZGlvVHJhY2soCisgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgIENhbGxiYWNrV3JhcHBlciwKKyAgICAgICAgICAgICAgICAgbmV3Y2JkLAorICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICBtQXR0cmlidXRlcyAhPSBudWxscHRyID8gbUF0dHJpYnV0ZXMtPmdldEpPYmplY3QoKSA6IG51bGxwdHIsCisgICAgICAgICAgICAgICAgIDEuMGYpOyAgLy8gZGVmYXVsdCB2YWx1ZSBmb3IgbWF4UmVxdWlyZWRTcGVlZAogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIFRPRE86IER1ZSB0byBidWZmZXIgbWVtb3J5IGNvbmNlcm5zLCB3ZSB1c2UgYSBtYXggdGFyZ2V0IHBsYXliYWNrIHNwZWVkCiAgICAgICAgIC8vIGJhc2VkIG9uIG1QbGF5YmFja1JhdGUgYXQgdGhlIHRpbWUgb2Ygb3BlbiAoaW5zdGVhZCBvZiBrTWF4UmVxdWlyZWRTcGVlZCksCkBAIC0zOTQsNzMgKzMxOCw2MiBAQAogICAgICAgICBBTE9HV19JRih0YXJnZXRTcGVlZCAhPSBtUGxheWJhY2tSYXRlLm1TcGVlZCwKICAgICAgICAgICAgICAgICAidHJhY2sgdGFyZ2V0IHNwZWVkOiVmIGNsYW1wZWQgZnJvbSBwbGF5YmFjayBzcGVlZDolZiIsCiAgICAgICAgICAgICAgICAgdGFyZ2V0U3BlZWQsIG1QbGF5YmFja1JhdGUubVNwZWVkKTsKLSAgICAgICAgdCA9IG5ldyBBdWRpb1RyYWNrKAotICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgZm9ybWF0LAotICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgTlVMTCwgLy8gY2FsbGJhY2sKLSAgICAgICAgICAgICAgICBOVUxMLCAvLyB1c2VyIGRhdGEKLSAgICAgICAgICAgICAgICAwLCAvLyBub3RpZmljYXRpb24gZnJhbWVzCi0gICAgICAgICAgICAgICAgbVNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICBBdWRpb1RyYWNrOjpUUkFOU0ZFUl9ERUZBVUxULAotICAgICAgICAgICAgICAgIE5VTEwsIC8vIG9mZmxvYWQgaW5mbwotICAgICAgICAgICAgICAgIG1VaWQsCi0gICAgICAgICAgICAgICAgbVBpZCwKLSAgICAgICAgICAgICAgICBtQXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICBkb05vdFJlY29ubmVjdCwKLSAgICAgICAgICAgICAgICB0YXJnZXRTcGVlZCwKLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWREZXZpY2VJZCk7CisgICAgICAgIGpUID0gbmV3IEpBdWRpb1RyYWNrKAorICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICBtQXR0cmlidXRlcyAhPSBudWxscHRyID8gbUF0dHJpYnV0ZXMtPmdldEpPYmplY3QoKSA6IG51bGxwdHIsCisgICAgICAgICAgICAgICAgIHRhcmdldFNwZWVkKTsKICAgICB9CiAKLSAgICBpZiAoKHQgPT0gMCkgfHwgKHQtPmluaXRDaGVjaygpICE9IE5PX0VSUk9SKSkgeworICAgIGlmIChqVCA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gY3JlYXRlIGF1ZGlvIHRyYWNrIik7CiAgICAgICAgIGRlbGV0ZSBuZXdjYmQ7CiAgICAgICAgIC8vIHQgZ29lcyBvdXQgb2Ygc2NvcGUsIHNvIHJlZmVyZW5jZSBjb3VudCBkcm9wcyB0byB6ZXJvCiAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIHN1Y2Nlc3NmdWwgQXVkaW9UcmFjayBpbml0aWFsaXphdGlvbiBpbXBsaWVzIGEgbGVnYWN5IHN0cmVhbSB0eXBlIHdhcyBnZW5lcmF0ZWQKLSAgICAgICAgLy8gZnJvbSB0aGUgYXVkaW8gYXR0cmlidXRlcwotICAgICAgICBtU3RyZWFtVHlwZSA9IHQtPnN0cmVhbVR5cGUoKTsKICAgICB9CiAKLSAgICBDSEVDSygodCAhPSBOVUxMKSAmJiAoKG1DYWxsYmFjayA9PSBOVUxMKSB8fCAobmV3Y2JkICE9IE5VTEwpKSk7CisgICAgQ0hFQ0soKGpUICE9IG51bGxwdHIpICYmICgobUNhbGxiYWNrID09IG51bGxwdHIpIHx8IChuZXdjYmQgIT0gbnVsbHB0cikpKTsKIAogICAgIG1DYWxsYmFja0RhdGEgPSBuZXdjYmQ7CiAgICAgQUxPR1YoInNldFZvbHVtZSIpOwotICAgIHQtPnNldFZvbHVtZShtTGVmdFZvbHVtZSwgbVJpZ2h0Vm9sdW1lKTsKKyAgICBqVC0+c2V0Vm9sdW1lKG1Wb2x1bWUpOwogCiAgICAgbVNhbXBsZVJhdGVIeiA9IHNhbXBsZVJhdGU7CiAgICAgbUZsYWdzID0gZmxhZ3M7CiAgICAgbU1zZWNzUGVyRnJhbWUgPSAxRTNmIC8gKG1QbGF5YmFja1JhdGUubVNwZWVkICogc2FtcGxlUmF0ZSk7Ci0gICAgbUZyYW1lU2l6ZSA9IHQtPmZyYW1lU2l6ZSgpOwotICAgIG1UcmFjayA9IHQ7CisgICAgbUZyYW1lU2l6ZSA9IGpULT5mcmFtZVNpemUoKTsKKyAgICBtSkF1ZGlvVHJhY2sgPSBqVDsKIAogICAgIHJldHVybiB1cGRhdGVUcmFja19sKCk7CiB9CiAKIHN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0Ojp1cGRhdGVUcmFja19sKCkgewotICAgIGlmIChtVHJhY2sgPT0gTlVMTCkgeworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogCiAgICAgc3RhdHVzX3QgcmVzID0gTk9fRVJST1I7CiAgICAgLy8gTm90ZSBzb21lIG91dHB1dCBkZXZpY2VzIG1heSBnaXZlIHVzIGEgZGlyZWN0IHRyYWNrIGV2ZW4gdGhvdWdoIHdlIGRvbid0IHNwZWNpZnkgaXQuCiAgICAgLy8gRXhhbXBsZTogTGluZSBhcHBsaWNhdGlvbiBiLzE3NDU5OTgyLgotICAgIGlmICgobVRyYWNrLT5nZXRGbGFncygpCisgICAgaWYgKChtSkF1ZGlvVHJhY2stPmdldEZsYWdzKCkKICAgICAgICAgICAgICYgKEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpKSA9PSAwKSB7Ci0gICAgICAgIHJlcyA9IG1UcmFjay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1JhdGUpOworICAgICAgICByZXMgPSBtSkF1ZGlvVHJhY2stPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tSYXRlKTsKICAgICAgICAgaWYgKHJlcyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgbVRyYWNrLT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobVNlbmRMZXZlbCk7Ci0gICAgICAgICAgICByZXMgPSBtVHJhY2stPmF0dGFjaEF1eEVmZmVjdChtQXV4RWZmZWN0SWQpOworICAgICAgICAgICAgbUpBdWRpb1RyYWNrLT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobVNlbmRMZXZlbCk7CisgICAgICAgICAgICByZXMgPSBtSkF1ZGlvVHJhY2stPmF0dGFjaEF1eEVmZmVjdChtQXV4RWZmZWN0SWQpOwogICAgICAgICB9CiAgICAgfQotICAgIG1UcmFjay0+c2V0T3V0cHV0RGV2aWNlKG1TZWxlY3RlZERldmljZUlkKTsKLSAgICBpZiAobURldmljZUNhbGxiYWNrRW5hYmxlZCkgewotICAgICAgICBtVHJhY2stPmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrLnByb21vdGUoKSk7CisgICAgaWYgKG1QcmVmZXJyZWREZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICBtSkF1ZGlvVHJhY2stPnNldFByZWZlcnJlZERldmljZShtUHJlZmVycmVkRGV2aWNlLT5nZXRKT2JqZWN0KCkpOwogICAgIH0KKworICAgIG1KQXVkaW9UcmFjay0+cmVnaXN0ZXJSb3V0aW5nRGVsZWdhdGVzKG1Sb3V0aW5nRGVsZWdhdGVzKTsKKwogICAgIEFMT0dWKCJ1cGRhdGVUcmFja19sKCkgRE9ORSBzdGF0dXMgJWQiLCByZXMpOwogICAgIHJldHVybiByZXM7CiB9CkBAIC00NjgsMTMgKzM4MSwxMyBAQAogc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnN0YXJ0KCkgewogICAgIEFMT0dWKCJzdGFydCIpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobUNhbGxiYWNrRGF0YSAhPSBOVUxMKSB7CisgICAgaWYgKG1DYWxsYmFja0RhdGEgIT0gbnVsbHB0cikgewogICAgICAgICBtQ2FsbGJhY2tEYXRhLT5lbmRUcmFja1N3aXRjaCgpOwogICAgIH0KLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgbVRyYWNrLT5zZXRWb2x1bWUobUxlZnRWb2x1bWUsIG1SaWdodFZvbHVtZSk7Ci0gICAgICAgIG1UcmFjay0+c2V0QXV4RWZmZWN0U2VuZExldmVsKG1TZW5kTGV2ZWwpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtVHJhY2stPnN0YXJ0KCk7CisgICAgaWYgKG1KQXVkaW9UcmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1KQXVkaW9UcmFjay0+c2V0Vm9sdW1lKG1Wb2x1bWUpOworICAgICAgICBtSkF1ZGlvVHJhY2stPnNldEF1eEVmZmVjdFNlbmRMZXZlbChtU2VuZExldmVsKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUpBdWRpb1RyYWNrLT5zdGFydCgpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTQ4MiwxMSArMzk1LDExIEBACiAKIHNzaXplX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OndyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYmxvY2tpbmcpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihtQ2FsbGJhY2sgIT0gTlVMTCwgIkRvbid0IGNhbGwgd3JpdGUgaWYgc3VwcGx5aW5nIGEgY2FsbGJhY2suIik7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtQ2FsbGJhY2sgIT0gbnVsbHB0ciwgIkRvbid0IGNhbGwgd3JpdGUgaWYgc3VwcGx5aW5nIGEgY2FsbGJhY2suIik7CiAKICAgICAvL0FMT0dWKCJ3cml0ZSglcCwgJXUpIiwgYnVmZmVyLCBzaXplKTsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1UcmFjay0+d3JpdGUoYnVmZmVyLCBzaXplLCBibG9ja2luZyk7CisgICAgaWYgKG1KQXVkaW9UcmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBtSkF1ZGlvVHJhY2stPndyaXRlKGJ1ZmZlciwgc2l6ZSwgYmxvY2tpbmcpOwogICAgIH0KICAgICByZXR1cm4gTk9fSU5JVDsKIH0KQEAgLTQ5NCw0NSArNDA3LDQ0IEBACiB2b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzdG9wKCkgewogICAgIEFMT0dWKCJzdG9wIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICBtVHJhY2stPnN0b3AoKTsKKyAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUpBdWRpb1RyYWNrLT5zdG9wKCk7CiAgICAgfQogfQogCiB2b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpmbHVzaCgpIHsKICAgICBBTE9HVigiZmx1c2giKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIG1UcmFjay0+Zmx1c2goKTsKKyAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUpBdWRpb1RyYWNrLT5mbHVzaCgpOwogICAgIH0KIH0KIAogdm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6cGF1c2UoKSB7CiAgICAgQUxPR1YoInBhdXNlIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICBtVHJhY2stPnBhdXNlKCk7CisgICAgaWYgKG1KQXVkaW9UcmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1KQXVkaW9UcmFjay0+cGF1c2UoKTsKICAgICB9CiB9CiAKIHZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmNsb3NlKCkgewogICAgIEFMT0dWKCJjbG9zZSIpOwotICAgIHNwPEF1ZGlvVHJhY2s+IHRyYWNrOworICAgIHNwPEpBdWRpb1RyYWNrPiB0cmFjazsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICAgICAgdHJhY2sgPSBtVHJhY2s7Ci0gICAgICAgIGNsb3NlX2woKTsgLy8gY2xlYXJzIG1UcmFjaworICAgICAgICB0cmFjayA9IG1KQXVkaW9UcmFjazsKKyAgICAgICAgY2xvc2VfbCgpOyAvLyBjbGVhcnMgbUpBdWRpb1RyYWNrCiAgICAgfQogICAgIC8vIGRlc3RydWN0aW9uIG9mIHRoZSB0cmFjayBvY2N1cnMgb3V0c2lkZSBvZiBtdXRleC4KIH0KIAotdm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7Ci0gICAgQUxPR1YoInNldFZvbHVtZSglZiwgJWYpIiwgbGVmdCwgcmlnaHQpOwordm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIEFMT0dWKCJzZXRWb2x1bWUoJWYpIiwgdm9sdW1lKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgbUxlZnRWb2x1bWUgPSBsZWZ0OwotICAgIG1SaWdodFZvbHVtZSA9IHJpZ2h0OwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICBtVHJhY2stPnNldFZvbHVtZShsZWZ0LCByaWdodCk7CisgICAgbVZvbHVtZSA9IHZvbHVtZTsKKyAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUpBdWRpb1RyYWNrLT5zZXRWb2x1bWUodm9sdW1lKTsKICAgICB9CiB9CiAKQEAgLTU0MCwxMiArNDUyLDEyIEBACiAgICAgQUxPR1YoInNldFBsYXliYWNrUmF0ZSglZiAlZiAlZCAlZCkiLAogICAgICAgICAgICAgICAgIHJhdGUubVNwZWVkLCByYXRlLm1QaXRjaCwgcmF0ZS5tRmFsbGJhY2tNb2RlLCByYXRlLm1TdHJldGNoTW9kZSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gMCkgewogICAgICAgICAvLyByZW1lbWJlciByYXRlIHNvIHRoYXQgd2UgY2FuIHNldCBpdCB3aGVuIHRoZSB0cmFjayBpcyBvcGVuZWQKICAgICAgICAgbVBsYXliYWNrUmF0ZSA9IHJhdGU7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9Ci0gICAgc3RhdHVzX3QgcmVzID0gbVRyYWNrLT5zZXRQbGF5YmFja1JhdGUocmF0ZSk7CisgICAgc3RhdHVzX3QgcmVzID0gbUpBdWRpb1RyYWNrLT5zZXRQbGF5YmFja1JhdGUocmF0ZSk7CiAgICAgaWYgKHJlcyAhPSBOT19FUlJPUikgewogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KQEAgLTU1OSwxMiArNDcxLDEyIEBACiB9CiAKIHN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRQbGF5YmFja1JhdGUoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUpIHsKLSAgICBBTE9HVigic2V0UGxheWJhY2tSYXRlIik7CisgICAgQUxPR1YoImdldFBsYXliYWNrUmF0ZSIpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IDApIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgICpyYXRlID0gbVRyYWNrLT5nZXRQbGF5YmFja1JhdGUoKTsKKyAgICAqcmF0ZSA9IG1KQXVkaW9UcmFjay0+Z2V0UGxheWJhY2tSYXRlKCk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCkBAIC01NzIsOCArNDg0LDggQEAKICAgICBBTE9HVigic2V0QXV4RWZmZWN0U2VuZExldmVsKCVmKSIsIGxldmVsKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgbVNlbmRMZXZlbCA9IGxldmVsOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICByZXR1cm4gbVRyYWNrLT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobGV2ZWwpOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbUpBdWRpb1RyYWNrLT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobGV2ZWwpOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC01ODIsNDQgKzQ5NCw1OSBAQAogICAgIEFMT0dWKCJhdHRhY2hBdXhFZmZlY3QoJWQpIiwgZWZmZWN0SWQpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBtQXV4RWZmZWN0SWQgPSBlZmZlY3RJZDsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1UcmFjay0+YXR0YWNoQXV4RWZmZWN0KGVmZmVjdElkKTsKKyAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+YXR0YWNoQXV4RWZmZWN0KGVmZmVjdElkKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIHsKLSAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCVkKSIsIGRldmljZUlkKTsKK3N0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRQcmVmZXJyZWREZXZpY2Uoam9iamVjdCBkZXZpY2UpIHsKKyAgICBBTE9HVigic2V0UHJlZmVycmVkRGV2aWNlIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIG1TZWxlY3RlZERldmljZUlkID0gZGV2aWNlSWQ7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtVHJhY2stPnNldE91dHB1dERldmljZShkZXZpY2VJZCk7CisgICAgc3RhdHVzX3QgcmV0ID0gTk9fRVJST1I7CisgICAgaWYgKG1KQXVkaW9UcmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIHJldCA9IG1KQXVkaW9UcmFjay0+c2V0UHJlZmVycmVkRGV2aWNlKGRldmljZSk7CisgICAgfQorICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgbVByZWZlcnJlZERldmljZSA9IG5ldyBKT2JqZWN0SG9sZGVyKGRldmljZSk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2pvYmplY3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFJvdXRlZERldmljZSgpIHsKKyAgICBBTE9HVigiZ2V0Um91dGVkRGV2aWNlIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbUpBdWRpb1RyYWNrLT5nZXRSb3V0ZWREZXZpY2UoKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjphZGRBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3QgalJvdXRpbmdEZWxlZ2F0ZSkgeworICAgIEFMT0dWKCJhZGRBdWRpb0RldmljZUNhbGxiYWNrIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGpvYmplY3QgbGlzdGVuZXIgPSBKQXVkaW9UcmFjazo6Z2V0TGlzdGVuZXIoalJvdXRpbmdEZWxlZ2F0ZSk7CisgICAgaWYgKG1KQXVkaW9UcmFjayAhPSBudWxscHRyICYmCisgICAgICAgIEpBdWRpb1RyYWNrOjpmaW5kQnlLZXkobVJvdXRpbmdEZWxlZ2F0ZXMsIGxpc3RlbmVyKSA9PSBudWxscHRyKSB7CisgICAgICAgIGpvYmplY3QgaGFuZGxlciA9IEpBdWRpb1RyYWNrOjpnZXRIYW5kbGVyKGpSb3V0aW5nRGVsZWdhdGUpOworICAgICAgICBqb2JqZWN0IHJvdXRpbmdEZWxlZ2F0ZSA9IEpBdWRpb1RyYWNrOjphZGRHbG9iYWxSZWYoalJvdXRpbmdEZWxlZ2F0ZSk7CisgICAgICAgIG1Sb3V0aW5nRGVsZWdhdGVzLnB1c2hfYmFjayhzdGQ6OnBhaXI8am9iamVjdCwgam9iamVjdD4obGlzdGVuZXIsIHJvdXRpbmdEZWxlZ2F0ZSkpOworICAgICAgICByZXR1cm4gbUpBdWRpb1RyYWNrLT5hZGRBdWRpb0RldmljZUNhbGxiYWNrKHJvdXRpbmdEZWxlZ2F0ZSwgaGFuZGxlcik7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFJvdXRlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QqIGRldmljZUlkKSB7Ci0gICAgQUxPR1YoImdldFJvdXRlZERldmljZUlkIik7CitzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IGxpc3RlbmVyKSB7CisgICAgQUxPR1YoInJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2siKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIG1Sb3V0ZWREZXZpY2VJZCA9IG1UcmFjay0+Z2V0Um91dGVkRGV2aWNlSWQoKTsKLSAgICB9Ci0gICAgKmRldmljZUlkID0gbVJvdXRlZERldmljZUlkOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKSB7Ci0gICAgQUxPR1YoImVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2ssICVkIiwgZW5hYmxlZCk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIG1EZXZpY2VDYWxsYmFja0VuYWJsZWQgPSBlbmFibGVkOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgICAgIGlmIChlbmFibGVkKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBtVHJhY2stPmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrLnByb21vdGUoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBtVHJhY2stPnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrLnByb21vdGUoKSk7CisgICAgam9iamVjdCByb3V0aW5nRGVsZWdhdGUgPSBudWxscHRyOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0ciAmJgorICAgICAgICAocm91dGluZ0RlbGVnYXRlID0gSkF1ZGlvVHJhY2s6OmZpbmRCeUtleShtUm91dGluZ0RlbGVnYXRlcywgbGlzdGVuZXIpKSAhPSBudWxscHRyKSB7CisgICAgICAgIG1KQXVkaW9UcmFjay0+cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhyb3V0aW5nRGVsZWdhdGUpOworICAgICAgICBKQXVkaW9UcmFjazo6ZXJhc2VCeUtleShtUm91dGluZ0RlbGVnYXRlcywgbGlzdGVuZXIpOworICAgICAgICBpZiAoSkF1ZGlvVHJhY2s6OnJlbW92ZUdsb2JhbFJlZihyb3V0aW5nRGVsZWdhdGUpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTYzMiwyMSArNTU5LDIxIEBACiAgICAgLy8gbG9jayB0byBlbnN1cmUgd2UgYXJlbid0IGNhdWdodCBpbiB0aGUgbWlkZGxlIG9mIGEgdHJhY2sgc3dpdGNoLgogICAgIGRhdGEtPmxvY2soKTsKICAgICBNZWRpYVBsYXllcjJBdWRpb091dHB1dCAqbWUgPSBkYXRhLT5nZXRPdXRwdXQoKTsKLSAgICBBdWRpb1RyYWNrOjpCdWZmZXIgKmJ1ZmZlciA9IChBdWRpb1RyYWNrOjpCdWZmZXIgKilpbmZvOwotICAgIGlmIChtZSA9PSBOVUxMKSB7CisgICAgSkF1ZGlvVHJhY2s6OkJ1ZmZlciAqYnVmZmVyID0gKEpBdWRpb1RyYWNrOjpCdWZmZXIgKilpbmZvOworICAgIGlmIChtZSA9PSBudWxscHRyKSB7CiAgICAgICAgIC8vIG5vIG91dHB1dCBzZXQsIGxpa2VseSBiZWNhdXNlIHRoZSB0cmFjayB3YXMgc2NoZWR1bGVkIHRvIGJlIHJldXNlZAogICAgICAgICAvLyBieSBhbm90aGVyIHBsYXllciwgYnV0IHRoZSBmb3JtYXQgdHVybmVkIG91dCB0byBiZSBpbmNvbXBhdGlibGUuCiAgICAgICAgIGRhdGEtPnVubG9jaygpOwotICAgICAgICBpZiAoYnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGJ1ZmZlci0+c2l6ZSA9IDA7CisgICAgICAgIGlmIChidWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgYnVmZmVyLT5tU2l6ZSA9IDA7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIHN3aXRjaChldmVudCkgewotICAgIGNhc2UgQXVkaW9UcmFjazo6RVZFTlRfTU9SRV9EQVRBOiB7CisgICAgY2FzZSBKQXVkaW9UcmFjazo6RVZFTlRfTU9SRV9EQVRBOiB7CiAgICAgICAgIHNpemVfdCBhY3R1YWxTaXplID0gKCptZS0+bUNhbGxiYWNrKSgKLSAgICAgICAgICAgICAgICBtZSwgYnVmZmVyLT5yYXcsIGJ1ZmZlci0+c2l6ZSwgbWUtPm1DYWxsYmFja0Nvb2tpZSwKKyAgICAgICAgICAgICAgICBtZSwgYnVmZmVyLT5tRGF0YSwgYnVmZmVyLT5tU2l6ZSwgbWUtPm1DYWxsYmFja0Nvb2tpZSwKICAgICAgICAgICAgICAgICBDQl9FVkVOVF9GSUxMX0JVRkZFUik7CiAKICAgICAgICAgLy8gTG9nIHdoZW4gbm8gZGF0YSBpcyByZXR1cm5lZCBmcm9tIHRoZSBjYWxsYmFjay4KQEAgLTY1OCwyNSArNTg1LDI1IEBACiAgICAgICAgIC8vIFRoaXMgaXMgYSBiZW5pZ24gYnVzeS13YWl0LCB3aXRoIHRoZSBuZXh0IGRhdGEgcmVxdWVzdCBnZW5lcmF0ZWQgMTAgbXMgb3IgbW9yZSBsYXRlcjsKICAgICAgICAgLy8gbmV2ZXJ0aGVsZXNzIGZvciBwb3dlciByZWFzb25zLCB3ZSBkb24ndCB3YW50IHRvIHNlZSB0b28gbWFueSBvZiB0aGVzZS4KIAotICAgICAgICBBTE9HVl9JRihhY3R1YWxTaXplID09IDAgJiYgYnVmZmVyLT5zaXplID4gMCwgImNhbGxiYWNrd3JhcHBlcjogZW1wdHkgYnVmZmVyIHJldHVybmVkIik7CisgICAgICAgIEFMT0dWX0lGKGFjdHVhbFNpemUgPT0gMCAmJiBidWZmZXItPm1TaXplID4gMCwgImNhbGxiYWNrd3JhcHBlcjogZW1wdHkgYnVmZmVyIHJldHVybmVkIik7CiAKLSAgICAgICAgYnVmZmVyLT5zaXplID0gYWN0dWFsU2l6ZTsKKyAgICAgICAgYnVmZmVyLT5tU2l6ZSA9IGFjdHVhbFNpemU7CiAgICAgICAgIH0gYnJlYWs7CiAKLSAgICBjYXNlIEF1ZGlvVHJhY2s6OkVWRU5UX1NUUkVBTV9FTkQ6CisgICAgY2FzZSBKQXVkaW9UcmFjazo6RVZFTlRfU1RSRUFNX0VORDoKICAgICAgICAgLy8gY3VycmVudGx5IG9ubHkgb2NjdXJzIGZvciBvZmZsb2FkZWQgY2FsbGJhY2tzCiAgICAgICAgIEFMT0dWKCJjYWxsYmFja3dyYXBwZXI6IGRlbGl2ZXIgRVZFTlRfU1RSRUFNX0VORCIpOwotICAgICAgICAoKm1lLT5tQ2FsbGJhY2spKG1lLCBOVUxMIC8qIGJ1ZmZlciAqLywgMCAvKiBzaXplICovLAorICAgICAgICAoKm1lLT5tQ2FsbGJhY2spKG1lLCBudWxscHRyIC8qIGJ1ZmZlciAqLywgMCAvKiBzaXplICovLAogICAgICAgICAgICAgICAgIG1lLT5tQ2FsbGJhY2tDb29raWUsIENCX0VWRU5UX1NUUkVBTV9FTkQpOwogICAgICAgICBicmVhazsKIAotICAgIGNhc2UgQXVkaW9UcmFjazo6RVZFTlRfTkVXX0lBVURJT1RSQUNLIDoKKyAgICBjYXNlIEpBdWRpb1RyYWNrOjpFVkVOVF9ORVdfSUFVRElPVFJBQ0sgOgogICAgICAgICBBTE9HVigiY2FsbGJhY2t3cmFwcGVyOiBkZWxpdmVyIEVWRU5UX1RFQVJfRE9XTiIpOwotICAgICAgICAoKm1lLT5tQ2FsbGJhY2spKG1lLCAgTlVMTCAvKiBidWZmZXIgKi8sIDAgLyogc2l6ZSAqLywKKyAgICAgICAgKCptZS0+bUNhbGxiYWNrKShtZSwgIG51bGxwdHIgLyogYnVmZmVyICovLCAwIC8qIHNpemUgKi8sCiAgICAgICAgICAgICAgICAgbWUtPm1DYWxsYmFja0Nvb2tpZSwgQ0JfRVZFTlRfVEVBUl9ET1dOKTsKICAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIEF1ZGlvVHJhY2s6OkVWRU5UX1VOREVSUlVOOgorICAgIGNhc2UgSkF1ZGlvVHJhY2s6OkVWRU5UX1VOREVSUlVOOgogICAgICAgICAvLyBUaGlzIG9jY3VycyB3aGVuIHRoZXJlIGlzIG5vIGRhdGEgYXZhaWxhYmxlLCB0eXBpY2FsbHkKICAgICAgICAgLy8gd2hlbiB0aGVyZSBpcyBhIGZhaWx1cmUgdG8gc3VwcGx5IGRhdGEgdG8gdGhlIEF1ZGlvVHJhY2suICBJdCBjYW4gYWxzbwogICAgICAgICAvLyBvY2N1ciBpbiBub24tb2ZmbG9hZGVkIG1vZGUgd2hlbiB0aGUgYXVkaW8gZGV2aWNlIGNvbWVzIG91dCBvZiBzdGFuZGJ5LgpAQCAtNjk2LDI5ICs2MjMsMzEgQEAKICAgICBkYXRhLT51bmxvY2soKTsKIH0KIAotYXVkaW9fc2Vzc2lvbl90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRTZXNzaW9uSWQoKSBjb25zdAoteworaW50MzJfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0U2Vzc2lvbklkKCkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICByZXR1cm4gbVNlc3Npb25JZDsKIH0KIAotdWludDMyX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFNhbXBsZVJhdGUoKSBjb25zdAotewordm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c2V0U2Vzc2lvbklkKGNvbnN0IGludDMyX3Qgc2Vzc2lvbklkKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIG1UcmFjay0+Z2V0U2FtcGxlUmF0ZSgpOworICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CiB9CiAKLWludDY0X3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldEJ1ZmZlckR1cmF0aW9uSW5VcygpIGNvbnN0Ci17Cit1aW50MzJfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0U2FtcGxlUmF0ZSgpIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gbUpBdWRpb1RyYWNrLT5nZXRTYW1wbGVSYXRlKCk7Cit9CisKK2ludDY0X3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldEJ1ZmZlckR1cmF0aW9uSW5VcygpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSAwKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBpbnQ2NF90IGR1cmF0aW9uOwotICAgIGlmIChtVHJhY2stPmdldEJ1ZmZlckR1cmF0aW9uSW5VcygmZHVyYXRpb24pICE9IE9LKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjay0+Z2V0QnVmZmVyRHVyYXRpb25JblVzKCZkdXJhdGlvbikgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIHJldHVybiBkdXJhdGlvbjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KQXVkaW9UcmFjay5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmgKaW5kZXggMzAxODI1Yi4uODdkYzg4OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmgKQEAgLTE3LDE5ICsxNywyMSBAQAogI2lmbmRlZiBBTkRST0lEX0pBVURJT1RSQUNLX0gKICNkZWZpbmUgQU5EUk9JRF9KQVVESU9UUkFDS19ICiAKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8dXRpbGl0eT4KICNpbmNsdWRlIDxqbmkuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvVm9sdW1lU2hhcGVyLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSk9iamVjdEhvbGRlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVGltZXN0YW1wLmg+ICAgLy8gSXQgaGFzIGRlcGVuZGVuY3kgb24gYXVkaW8uaC9FcnJvcnMuaCwgYnV0IGRvZXNuJ3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGUgdGhlbSBpbiBpdC4gVGhlcmVmb3JlIGl0IGlzIGluY2x1ZGVkIGhlcmUgYXQgbGFzdC4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBKQXVkaW9UcmFjayB7CitjbGFzcyBKQXVkaW9UcmFjayA6IHB1YmxpYyBSZWZCYXNlIHsKIHB1YmxpYzoKIAogICAgIC8qIEV2ZW50cyB1c2VkIGJ5IEF1ZGlvVHJhY2sgY2FsbGJhY2sgZnVuY3Rpb24gKGNhbGxiYWNrX3QpLgpAQCAtMzcsNiArMzksOCBAQAogICAgICAqLwogICAgIGVudW0gZXZlbnRfdHlwZSB7CiAgICAgICAgIEVWRU5UX01PUkVfREFUQSA9IDAsICAgICAgICAvLyBSZXF1ZXN0IHRvIHdyaXRlIG1vcmUgZGF0YSB0byBidWZmZXIuCisgICAgICAgIEVWRU5UX1VOREVSUlVOID0gMSwgICAgICAgICAvLyBCdWZmZXIgdW5kZXJydW4gb2NjdXJyZWQuIFRoaXMgd2lsbCBub3Qgb2NjdXIgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF0aWMgdHJhY2tzLgogICAgICAgICBFVkVOVF9ORVdfSUFVRElPVFJBQ0sgPSA2LCAgLy8gSUF1ZGlvVHJhY2sgd2FzIHJlLWNyZWF0ZWQsIGVpdGhlciBkdWUgdG8gcmUtcm91dGluZyBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZvbHVudGFyeSBpbnZhbGlkYXRpb24gYnkgbWVkaWFzZXJ2ZXIsIG9yIG1lZGlhc2VydmVyIGNyYXNoLgogICAgICAgICBFVkVOVF9TVFJFQU1fRU5EID0gNywgICAgICAgLy8gU2VudCBhZnRlciBhbGwgdGhlIGJ1ZmZlcnMgcXVldWVkIGluIEFGIGFuZCBIVyBhcmUgcGxheWVkCkBAIC0xMDQsMTUgKzEwOCwxNCBAQAogICAgICAqCiAgICAgICogVE9ETzogUmV2aXZlIHJlbW92ZWQgYXJndW1lbnRzIGFmdGVyIG9mZmxvYWQgbW9kZSBpcyBzdXBwb3J0ZWQuCiAgICAgICovCi0gICAgSkF1ZGlvVHJhY2soYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgSkF1ZGlvVHJhY2sodWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCiAgICAgICAgICAgICAgICAgdm9pZCogdXNlciwKICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCA9IDAsCi0gICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCAgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAotICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBOVUxMLAorICAgICAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkICA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCisgICAgICAgICAgICAgICAgY29uc3Qgam9iamVjdCBwQXR0cmlidXRlcyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgZmxvYXQgbWF4UmVxdWlyZWRTcGVlZCA9IDEuMGYpOwogCiAgICAgLyoKQEAgLTE1OCwxMCArMTYxLDEwIEBACiAgICAgICogQ2F1dGlvbjogY2FsbGluZyB0aGlzIG1ldGhvZCB0b28gb2Z0ZW4gbWF5IGJlIGluZWZmaWNpZW50OwogICAgICAqIGlmIHlvdSBuZWVkIGEgaGlnaCByZXNvbHV0aW9uIG1hcHBpbmcgYmV0d2VlbiBmcmFtZSBwb3NpdGlvbiBhbmQgcHJlc2VudGF0aW9uIHRpbWUsCiAgICAgICogY29uc2lkZXIgaW1wbGVtZW50aW5nIHRoYXQgYXQgYXBwbGljYXRpb24gbGV2ZWwsIGJhc2VkIG9uIHRoZSBsb3cgcmVzb2x1dGlvbiB0aW1lc3RhbXBzLgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aW1lc3RhbXAgaXMgdmFsaWQuCi0gICAgICogVGhlIHRpbWVzdGFtcCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkIG9uIHJldHVybiwgaWYgZmFsc2UgaXMgcmV0dXJuZWQuCisgICAgICogUmV0dXJucyBOT19FUlJPUiBpZiB0aW1lc3RhbXAgaXMgdmFsaWQuCisgICAgICogICAgICAgICBOT19JTklUIGlmIGZpbmRzIGVycm9yLCBhbmQgdGltZXN0YW1wIHBhcmFtZXRlciB3aWxsIGJlIHVuZGVmaW5lZCBvbiByZXR1cm4uCiAgICAgICovCi0gICAgYm9vbCBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCk7CisgICAgc3RhdHVzX3QgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApOwogCiAgICAgLy8gVE9ETzogVGhpcyBkb2MgaXMganVzdCBjb3BpZWQgZnJvbSBBdWRpb1RyYWNrLmguIFJldmlzZSBpdCBhZnRlciBpbXBsZW1lbmF0aW9uLgogICAgIC8qIFJldHVybiB0aGUgZXh0ZW5kZWQgdGltZXN0YW1wLCB3aXRoIGFkZGl0aW9uYWwgdGltZWJhc2UgaW5mbyBhbmQgaW1wcm92ZWQgZHJhaW4gYmVoYXZpb3IuCkBAIC0zMjQsMzcgKzMyNyw0MyBAQAogCiAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KCk7CiAKKyAgICBzaXplX3QgZnJhbWVTaXplKCk7CisKICAgICAvKgogICAgICAqIER1bXBzIHRoZSBzdGF0ZSBvZiBhbiBhdWRpbyB0cmFjay4KICAgICAgKiBOb3QgYSBnZW5lcmFsLXB1cnBvc2UgQVBJOyBpbnRlbmRlZCBvbmx5IGZvciB1c2UgYnkgbWVkaWEgcGxheWVyIHNlcnZpY2UgdG8gZHVtcCBpdHMgdHJhY2tzLgogICAgICAqLwogICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdDsKIAotICAgIC8qIFJldHVybnMgdGhlIElEIG9mIHRoZSBhdWRpbyBkZXZpY2UgYWN0dWFsbHkgdXNlZCBieSB0aGUgb3V0cHV0IHRvIHdoaWNoIHRoaXMgQXVkaW9UcmFjayBpcwotICAgICAqIGF0dGFjaGVkLiBXaGVuIHRoZSBBdWRpb1RyYWNrIGlzIGluYWN0aXZlLCBpdCB3aWxsIHJldHVybiBBVURJT19QT1JUX0hBTkRMRV9OT05FLgorICAgIC8qIFJldHVybnMgdGhlIEF1ZGlvRGV2aWNlSW5mbyB1c2VkIGJ5IHRoZSBvdXRwdXQgdG8gd2hpY2ggdGhpcyBBdWRpb1RyYWNrIGlzCisgICAgICogYXR0YWNoZWQuCiAgICAgICovCi0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRSb3V0ZWREZXZpY2VJZCgpOworICAgIGpvYmplY3QgZ2V0Um91dGVkRGV2aWNlKCk7CiAKICAgICAvKiBSZXR1cm5zIHRoZSBJRCBvZiB0aGUgYXVkaW8gc2Vzc2lvbiB0aGlzIEF1ZGlvVHJhY2sgYmVsb25ncyB0by4gKi8KLSAgICBhdWRpb19zZXNzaW9uX3QgZ2V0QXVkaW9TZXNzaW9uSWQoKTsKKyAgICBpbnQzMl90IGdldEF1ZGlvU2Vzc2lvbklkKCk7CiAKLSAgICAvKiBTZWxlY3RzIHRoZSBhdWRpbyBkZXZpY2UgdG8gdXNlIGZvciBvdXRwdXQgb2YgdGhpcyBBdWRpb1RyYWNrLiBBIHZhbHVlIG9mCi0gICAgICogQVVESU9fUE9SVF9IQU5ETEVfTk9ORSBpbmRpY2F0ZXMgZGVmYXVsdCByb3V0aW5nLgorICAgIC8qIFNldHMgdGhlIHByZWZlcnJlZCBhdWRpbyBkZXZpY2UgdG8gdXNlIGZvciBvdXRwdXQgb2YgdGhpcyBBdWRpb1RyYWNrLgogICAgICAqCiAgICAgICogUGFyYW1ldGVyczoKLSAgICAgKiAgVGhlIGRldmljZSBJRCBvZiB0aGUgc2VsZWN0ZWQgZGV2aWNlIChhcyByZXR1cm5lZCBieSB0aGUgQXVkaW9EZXZpY2VzTWFuYWdlciBBUEkpLgorICAgICAqIERldmljZTogYW4gQXVkaW9EZXZpY2VJbmZvIG9iamVjdC4KICAgICAgKgogICAgICAqIFJldHVybmVkIHZhbHVlOgogICAgICAqICAtIE5PX0VSUk9SOiBzdWNjZXNzZnVsIG9wZXJhdGlvbgotICAgICAqICAtIEJBRF9WQUxVRTogZmFpbGVkIHRvIGZpbmQgdGhlIHZhbGlkIG91dHB1dCBkZXZpY2Ugd2l0aCBnaXZlbiBkZXZpY2UgSWQuCisgICAgICogIC0gQkFEX1ZBTFVFOiBmYWlsZWQgdG8gc2V0IHRoZSBkZXZpY2UKICAgICAgKi8KLSAgICBzdGF0dXNfdCBzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7CisgICAgc3RhdHVzX3Qgc2V0UHJlZmVycmVkRGV2aWNlKGpvYmplY3QgZGV2aWNlKTsKIAogICAgIC8vIFRPRE86IEFkZCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1Qgd2hlbiBpdCBpcyBwb3NzaWJsZSB0byBjaGVjay4KICAgICAvLyBUT0RPOiBBZGQgQVVESU9fRkxBR19IV19BVl9TWU5DIHdoZW4gaXQgaXMgcG9zc2libGUgdG8gY2hlY2suCiAgICAgLyogUmV0dXJucyB0aGUgZmxhZ3MgKi8KICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBnZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIG1GbGFnczsgfQogCisgICAgLyogV2UgZG9uJ3Qga2VlcCBzdHJlYW0gdHlwZSBoZXJlLAorICAgICAqIGluc3RlYWQsIHdlIGtlZXAgYXR0cmlidXRlcyBhbmQgY2FsbCBnZXRWb2x1bWVDb250cm9sU3RyZWFtKCkgdG8gZ2V0IHN0cmVhbSB0eXBlCisgICAgICovCisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRBdWRpb1N0cmVhbVR5cGUoKTsKKwogICAgIC8qIE9idGFpbiB0aGUgcGVuZGluZyBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgZm9yIHBsYXliYWNrIG9mIHB1cmUgUENNIGRhdGEgcmVtYWluaW5nIGluCiAgICAgICogQXVkaW9UcmFjay4KICAgICAgKgpAQCAtMzY5LDI3ICszNzgsNjggQEAKICAgICAgKiBSZXBsYWNlcyBhbnkgcHJldmlvdXNseSBpbnN0YWxsZWQgY2FsbGJhY2suCiAgICAgICoKICAgICAgKiBQYXJhbWV0ZXJzOgotICAgICAqCi0gICAgICogY2FsbGJhY2s6IFRoZSBjYWxsYmFjayBpbnRlcmZhY2UKKyAgICAgKiBMaXN0ZW5lcjogdGhlIGxpc3RlbmVyIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIHJlcm91dGluZyBldmVudHMuCisgICAgICogSGFuZGxlcjogdGhlIGhhbmRsZXIgdG8gaGFuZGxlciB0aGUgcmVyb3V0aW5nIGV2ZW50cy4KICAgICAgKgogICAgICAqIFJldHVybnMgTk9fRVJST1IgaWYgc3VjY2Vzc2Z1bC4KLSAgICAgKiAgICAgICAgIElOVkFMSURfT1BFUkFUSU9OIGlmIHRoZSBzYW1lIGNhbGxiYWNrIGlzIGFscmVhZHkgaW5zdGFsbGVkLgotICAgICAqICAgICAgICAgTk9fSU5JVCBvciBQUkVNSVNTSU9OX0RFTklFRCBpZiBBdWRpb0ZsaW5nZXIgc2VydmljZSBpcyBub3QgcmVhY2hhYmxlCi0gICAgICogICAgICAgICBCQURfVkFMVUUgaWYgdGhlIGNhbGxiYWNrIGlzIE5VTEwKKyAgICAgKiAgICAgICAgIChUT0RPKSBJTlZBTElEX09QRVJBVElPTiBpZiB0aGUgc2FtZSBjYWxsYmFjayBpcyBhbHJlYWR5IGluc3RhbGxlZC4KKyAgICAgKiAgICAgICAgIChUT0RPKSBOT19JTklUIG9yIFBSRU1JU1NJT05fREVOSUVEIGlmIEF1ZGlvRmxpbmdlciBzZXJ2aWNlIGlzIG5vdCByZWFjaGFibGUKKyAgICAgKiAgICAgICAgIChUT0RPKSBCQURfVkFMVUUgaWYgdGhlIGNhbGxiYWNrIGlzIE5VTEwKICAgICAgKi8KLSAgICBzdGF0dXNfdCBhZGRBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spOworICAgIHN0YXR1c190IGFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCBsaXN0ZW5lciwgam9iamVjdCByZCk7CiAKICAgICAvKiBSZW1vdmVzIGFuIEF1ZGlvRGV2aWNlQ2FsbGJhY2suCiAgICAgICoKICAgICAgKiBQYXJhbWV0ZXJzOgotICAgICAqCi0gICAgICogY2FsbGJhY2s6IFRoZSBjYWxsYmFjayBpbnRlcmZhY2UKKyAgICAgKiBMaXN0ZW5lcjogdGhlIGxpc3RlbmVyIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIHJlcm91dGluZyBldmVudHMuCiAgICAgICoKICAgICAgKiBSZXR1cm5zIE5PX0VSUk9SIGlmIHN1Y2Nlc3NmdWwuCi0gICAgICogICAgICAgICBJTlZBTElEX09QRVJBVElPTiBpZiB0aGUgY2FsbGJhY2sgaXMgbm90IGluc3RhbGxlZAotICAgICAqICAgICAgICAgQkFEX1ZBTFVFIGlmIHRoZSBjYWxsYmFjayBpcyBOVUxMCisgICAgICogICAgICAgICAoVE9ETykgSU5WQUxJRF9PUEVSQVRJT04gaWYgdGhlIGNhbGxiYWNrIGlzIG5vdCBpbnN0YWxsZWQKKyAgICAgKiAgICAgICAgIChUT0RPKSBCQURfVkFMVUUgaWYgdGhlIGNhbGxiYWNrIGlzIE5VTEwKICAgICAgKi8KLSAgICBzdGF0dXNfdCByZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spOworICAgIHN0YXR1c190IHJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCBsaXN0ZW5lcik7CisKKyAgICAvKiBSZWdpc3RlciBhbGwgYmFja2VkLXVwIHJvdXRpbmcgZGVsZWdhdGVzLgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiByb3V0aW5nRGVsZWdhdGVzOiBiYWNrZWQtdXAgcm91dGluZyBkZWxlZ2F0ZXMKKyAgICAgKgorICAgICAqLworICAgIHZvaWQgcmVnaXN0ZXJSb3V0aW5nRGVsZWdhdGVzKHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxqb2JqZWN0LCBqb2JqZWN0Pj4mIHJvdXRpbmdEZWxlZ2F0ZXMpOworCisgICAgLyogZ2V0IGxpc3RlbmVyIGZyb20gUm91dGluZ0RlbGVnYXRlIG9iamVjdAorICAgICAqLworICAgIHN0YXRpYyBqb2JqZWN0IGdldExpc3RlbmVyKGNvbnN0IGpvYmplY3Qgcm91dGluZ0RlbGVnYXRlT2JqKTsKKworICAgIC8qIGdldCBoYW5kbGVyIGZyb20gUm91dGluZ0RlbGVnYXRlIG9iamVjdAorICAgICAqLworICAgIHN0YXRpYyBqb2JqZWN0IGdldEhhbmRsZXIoY29uc3Qgam9iamVjdCByb3V0aW5nRGVsZWdhdGVPYmopOworCisgICAgLyogY29udmVydCBsb2NhbCByZWZlcmVuY2UgdG8gZ2xvYmFsIHJlZmVyZW5jZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgam9iamVjdCBhZGRHbG9iYWxSZWYoY29uc3Qgam9iamVjdCBvYmopOworCisgICAgLyogZXJhc2UgZ2xvYmFsIHJlZmVyZW5jZS4KKyAgICAgKgorICAgICAqIFJldHVybnMgTk9fRVJST1IgaWYgc3VjY2VlZHMKKyAgICAgKiAgICAgICAgIEJBRF9WQUxVRSBpZiBvYmogaXMgTlVMTAorICAgICAqLworICAgIHN0YXRpYyBzdGF0dXNfdCByZW1vdmVHbG9iYWxSZWYoY29uc3Qgam9iamVjdCBvYmopOworCisgICAgLyoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqIG1hcCBhbmQga2V5CisgICAgICoKKyAgICAgKiBSZXR1cm5zIHZhbHVlIGlmIGtleSBpcyBpbiB0aGUgbWFwCisgICAgICogICAgICAgICBudWxscHRyIGlmIGtleSBpcyBub3QgaW4gdGhlIG1hcAorICAgICAqLworICAgIHN0YXRpYyBqb2JqZWN0IGZpbmRCeUtleShzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8am9iamVjdCwgam9iamVjdD4+JiBtcCwgY29uc3Qgam9iamVjdCBrZXkpOworCisgICAgLyoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqIG1hcCBhbmQga2V5CisgICAgICovCisgICAgc3RhdGljIHZvaWQgZXJhc2VCeUtleShzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8am9iamVjdCwgam9iamVjdD4+JiBtcCwgY29uc3Qgam9iamVjdCBrZXkpOwogCiBwcml2YXRlOgogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG1GbGFnczsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KTWVkaWEySFRUUENvbm5lY3Rpb24uaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KTWVkaWEySFRUUENvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWY3ZjgzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQQ29ubmVjdGlvbi5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0pfTUVESUEyX0hUVFBfQ09OTkVDVElPTl9IXworI2RlZmluZSBfSl9NRURJQTJfSFRUUF9DT05ORUNUSU9OX0hfCisKKyNpbmNsdWRlICJqbmkuaCIKKworI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUENvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEpNZWRpYTJIVFRQQ29ubmVjdGlvbiA6IHB1YmxpYyBNZWRpYUhUVFBDb25uZWN0aW9uIHsKKyAgICBKTWVkaWEySFRUUENvbm5lY3Rpb24oSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeik7CisKKyAgICB2aXJ0dWFsIGJvb2wgY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBvZmY2NF90IGdldFNpemUoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1JTUVUeXBlKFN0cmluZzggKm1pbWVUeXBlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFVyaShTdHJpbmc4ICp1cmkpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+Sk1lZGlhMkhUVFBDb25uZWN0aW9uKCk7CisKK3ByaXZhdGU6CisgICAgam9iamVjdCBtTWVkaWEySFRUUENvbm5lY3Rpb25PYmo7CisgICAgam1ldGhvZElEIG1Db25uZWN0TWV0aG9kOworICAgIGptZXRob2RJRCBtRGlzY29ubmVjdE1ldGhvZDsKKyAgICBqbWV0aG9kSUQgbVJlYWRBdE1ldGhvZDsKKyAgICBqbWV0aG9kSUQgbUdldFNpemVNZXRob2Q7CisgICAgam1ldGhvZElEIG1HZXRNSU1FVHlwZU1ldGhvZDsKKyAgICBqbWV0aG9kSUQgbUdldFVyaU1ldGhvZDsKKworICAgIGpieXRlQXJyYXkgbUJ5dGVBcnJheU9iajsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEpNZWRpYTJIVFRQQ29ubmVjdGlvbik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIF9KX01FRElBMl9IVFRQX0NPTk5FQ1RJT05fSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KTWVkaWEySFRUUFNlcnZpY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KTWVkaWEySFRUUFNlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjYxYTdmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQU2VydmljZS5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0pfTUVESUEyX0hUVFBfU0VSVklDRV9IXworI2RlZmluZSBfSl9NRURJQTJfSFRUUF9TRVJWSUNFX0hfCisKKyNpbmNsdWRlIDxqbmkuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgSk1lZGlhMkhUVFBTZXJ2aWNlIDogcHVibGljIE1lZGlhSFRUUFNlcnZpY2UgeworICAgIEpNZWRpYTJIVFRQU2VydmljZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KTsKKworICAgIHZpcnR1YWwgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gbWFrZUhUVFBDb25uZWN0aW9uKCkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5KTWVkaWEySFRUUFNlcnZpY2UoKTsKKworcHJpdmF0ZToKKyAgICBqb2JqZWN0IG1NZWRpYTJIVFRQU2VydmljZU9iajsKKworICAgIGptZXRob2RJRCBtTWFrZUhUVFBDb25uZWN0aW9uTWV0aG9kOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSk1lZGlhMkhUVFBTZXJ2aWNlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gX0pfTUVESUEyX0hUVFBfU0VSVklDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pPYmplY3RIb2xkZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KT2JqZWN0SG9sZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNkOGI0MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KT2JqZWN0SG9sZGVyLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBKT0JKRUNUX0hPTERFUl9IXworCisjZGVmaW5lIEpPQkpFQ1RfSE9MREVSX0hfCisKKyNpbmNsdWRlICJqbmkuaCIKKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIEhlbHBlciBjbGFzcyBmb3IgbWFuYWdpbmcgZ2xvYmFsIHJlZmVyZW5jZSBvZiBqb2JqZWN0Lgorc3RydWN0IEpPYmplY3RIb2xkZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgSk9iamVjdEhvbGRlcihqb2JqZWN0IG9iaikgeworICAgICAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgICAgIG1KT2JqZWN0ID0gcmVpbnRlcnByZXRfY2FzdDxqb2JqZWN0PihlbnYtPk5ld0dsb2JhbFJlZihvYmopKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5KT2JqZWN0SG9sZGVyKCkgeworICAgICAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1KT2JqZWN0KTsKKyAgICB9CisKKyAgICBqb2JqZWN0IGdldEpPYmplY3QoKSB7IHJldHVybiBtSk9iamVjdDsgfQorCitwcml2YXRlOgorICAgIGpvYmplY3QgbUpPYmplY3Q7Cit9OworCit9ICAvLyIgYW5kcm9pZAorCisjZW5kaWYgIC8vIEpPQkpFQ1RfSE9MREVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwOTFiNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KYXZhVk1IZWxwZXIuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEpBVkFfVk1fSEVMUEVSX0hfCisKKyNkZWZpbmUgSkFWQV9WTV9IRUxQRVJfSF8KKworI2luY2x1ZGUgImpuaS5oIgorCisjaW5jbHVkZSA8YXRvbWljPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBKYXZhVk1IZWxwZXIgeworICAgIHN0YXRpYyBKTklFbnYgKmdldEpOSUVudigpOworICAgIHN0YXRpYyB2b2lkIHNldEphdmFWTShKYXZhVk0gKnZtKTsKKworcHJpdmF0ZToKKyAgICAvLyBPbmNlIGEgdmFsaWQgSmF2YVZNIGhhcyBiZWVuIHNldCwgaXQgc2hvdWxkIG5ldmVyIGJlIHJlc2V0IG9yIGNoYW5nZWQuCisgICAgLy8gSG93ZXZlciwgYXMgaXQgbWF5IGJlIGFjY2Vzc2VkIGZyb20gbXVsdGlwbGUgdGhyZWFkcywgYWNjZXNzIG5lZWRzIHRvIGJlCisgICAgLy8gc3luY2hyb25pemVkLgorICAgIHN0YXRpYyBzdGQ6OmF0b21pYzxKYXZhVk0gKj4gc0phdmFWTTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gSkFWQV9WTV9IRUxQRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkF1ZGlvT3V0cHV0LmgKaW5kZXggNWQ1YjhlNC4uYmRhNGY2MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkF1ZGlvT3V0cHV0LmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkF1ZGlvT3V0cHV0LmgKQEAgLTE5LDEwICsxOSwxNiBAQAogI2RlZmluZSBBTkRST0lEX01FRElBUExBWUVSMkFVRElPT1VUUFVUX0gKIAogI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSk9iamVjdEhvbGRlci5oPgogCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAorI2luY2x1ZGUgImpuaS5oIgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIEF1ZGlvVHJhY2s7CkBAIC0zMiwxNSArMzgsMTQgQEAKICAgICBjbGFzcyBDYWxsYmFja0RhdGE7CiAKIHB1YmxpYzoKLSAgICBNZWRpYVBsYXllcjJBdWRpb091dHB1dChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KGludDMyX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqIGF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBkZXZpY2VDYWxsYmFjayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgam9iamVjdCBhdHRyaWJ1dGVzKTsKICAgICB2aXJ0dWFsIH5NZWRpYVBsYXllcjJBdWRpb091dHB1dCgpOwogCiAgICAgdmlydHVhbCBib29sIHJlYWR5KCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVRyYWNrICE9IDA7CisgICAgICAgIHJldHVybiBtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cjsKICAgICB9CiAgICAgdmlydHVhbCBzc2l6ZV90IGJ1ZmZlclNpemUoKSBjb25zdDsKICAgICB2aXJ0dWFsIHNzaXplX3QgZnJhbWVDb3VudCgpIGNvbnN0OwpAQCAtNTIsMTcgKzU3LDE3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAgJnRzKSBjb25zdDsKICAgICB2aXJ0dWFsIGludDY0X3QgZ2V0UGxheWVkT3V0RHVyYXRpb25VcyhpbnQ2NF90IG5vd1VzKSBjb25zdDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QgKmZyYW1lc3dyaXR0ZW4pIGNvbnN0OwotICAgIHZpcnR1YWwgYXVkaW9fc2Vzc2lvbl90IGdldFNlc3Npb25JZCgpIGNvbnN0OworICAgIHZpcnR1YWwgaW50MzJfdCBnZXRTZXNzaW9uSWQoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0U2Vzc2lvbklkKGNvbnN0IGludDMyX3QgaWQpOwogICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0OwogICAgIHZpcnR1YWwgaW50NjRfdCBnZXRCdWZmZXJEdXJhdGlvbkluVXMoKSBjb25zdDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbigKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGludCBjaGFubmVsQ291bnQsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgYnVmZmVyQ291bnQsCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICBBdWRpb0NhbGxiYWNrIGNiLCB2b2lkICpjb29raWUsCiAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCiAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMLAotICAgICAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCA9IGZhbHNlLAogICAgICAgICAgICAgdWludDMyX3Qgc3VnZ2VzdGVkRnJhbWVDb3VudCA9IDApOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwpAQCAtNzEsMTMgKzc2LDEwIEBACiAgICAgdmlydHVhbCB2b2lkIGZsdXNoKCk7CiAgICAgdmlydHVhbCB2b2lkIHBhdXNlKCk7CiAgICAgdmlydHVhbCB2b2lkIGNsb3NlKCk7Ci0gICAgdm9pZCBzZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKTsKLSAgICB2aXJ0dWFsIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0QXVkaW9TdHJlYW1UeXBlKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVN0cmVhbVR5cGU7Ci0gICAgfQotICAgIHZvaWQgc2V0QXVkaW9BdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqIGF0dHJpYnV0ZXMpOworICAgIHZvaWQgc2V0QXVkaW9BdHRyaWJ1dGVzKGNvbnN0IGpvYmplY3QgYXR0cmlidXRlcyk7CisgICAgdmlydHVhbCBhdWRpb19zdHJlYW1fdHlwZV90IGdldEF1ZGlvU3RyZWFtVHlwZSgpIGNvbnN0OwogCi0gICAgdm9pZCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOworICAgIHZvaWQgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUmIHJhdGUpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGxheWJhY2tSYXRlKEF1ZGlvUGxheWJhY2tSYXRlKiByYXRlIC8qIG5vbm51bGwgKi8pOwogCkBAIC05MiwxMyArOTQsMTEgQEAKICAgICAgICAgLy8gVE9ETzogcmV0dXJuIGNvcnJlY3QgdmFsdWUuCiAgICAgICAgIC8vcmV0dXJuIG1OZXh0T3V0cHV0ID09IE5VTEw7CiAgICAgfQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKLSAgICB2aXJ0dWFsIFN0cmluZzggZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKLQogICAgIC8vIEF1ZGlvUm91dGluZwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Um91dGVkRGV2aWNlSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCogZGV2aWNlSWQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJlZmVycmVkRGV2aWNlKGpvYmplY3QgZGV2aWNlKTsKKyAgICB2aXJ0dWFsIGpvYmplY3QgZ2V0Um91dGVkRGV2aWNlKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3Qgcm91dGluZ0RlbGVnYXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCBsaXN0ZW5lcik7CiAKIHByaXZhdGU6CiAgICAgc3RhdGljIHZvaWQgc2V0TWluQnVmZmVyQ291bnQoKTsKQEAgLTEwNywyOSArMTA3LDI1IEBACiAgICAgdm9pZCBjbG9zZV9sKCk7CiAgICAgc3RhdHVzX3QgdXBkYXRlVHJhY2tfbCgpOwogCi0gICAgc3A8QXVkaW9UcmFjaz4gICAgICAgICAgbVRyYWNrOworICAgIHNwPEpBdWRpb1RyYWNrPiAgICAgICAgIG1KQXVkaW9UcmFjazsKICAgICBBdWRpb0NhbGxiYWNrICAgICAgICAgICBtQ2FsbGJhY2s7CiAgICAgdm9pZCAqICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrQ29va2llOwogICAgIENhbGxiYWNrRGF0YSAqICAgICAgICAgIG1DYWxsYmFja0RhdGE7Ci0gICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAgICAgbVN0cmVhbVR5cGU7Ci0gICAgYXVkaW9fYXR0cmlidXRlc190ICogICAgbUF0dHJpYnV0ZXM7Ci0gICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbUxlZnRWb2x1bWU7Ci0gICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbVJpZ2h0Vm9sdW1lOworICAgIHNwPEpPYmplY3RIb2xkZXI+ICAgICAgIG1BdHRyaWJ1dGVzOworICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1Wb2x1bWU7CiAgICAgQXVkaW9QbGF5YmFja1JhdGUgICAgICAgbVBsYXliYWNrUmF0ZTsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZUh6OyAvLyBzYW1wbGUgcmF0ZSBvZiB0aGUgY29udGVudCwgYXMgc2V0IGluIG9wZW4oKQogICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1Nc2Vjc1BlckZyYW1lOwogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZVNpemU7Ci0gICAgYXVkaW9fc2Vzc2lvbl90ICAgICAgICAgbVNlc3Npb25JZDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkOwogICAgIHVpZF90ICAgICAgICAgICAgICAgICAgIG1VaWQ7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbVBpZDsKICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtU2VuZExldmVsOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1BdXhFZmZlY3RJZDsKICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAgICBtRmxhZ3M7Ci0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgbVNlbGVjdGVkRGV2aWNlSWQ7Ci0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgbVJvdXRlZERldmljZUlkOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VDYWxsYmFja0VuYWJsZWQ7Ci0gICAgd3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+ICAgICAgICBtRGV2aWNlQ2FsbGJhY2s7CisgICAgc3A8Sk9iamVjdEhvbGRlcj4gICAgICAgbVByZWZlcnJlZERldmljZTsKICAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICBtTG9jazsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8am9iamVjdCwgam9iamVjdD4+IG1Sb3V0aW5nRGVsZWdhdGVzOyAvLyA8bGlzdGVuZXIsIHJvdXRpbmdEZWxlZ2F0ZT4KIAogICAgIC8vIHN0YXRpYyB2YXJpYWJsZXMgYmVsb3cgbm90IHByb3RlY3RlZCBieSBtdXRleAogICAgIHN0YXRpYyBib29sICAgICAgICAgICAgIG1Jc09uRW11bGF0b3I7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIySW50ZXJmYWNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIySW50ZXJmYWNlLmgKaW5kZXggMDJiZjg5MS4uMGM4ZDAxNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkludGVyZmFjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJJbnRlcmZhY2UuaApAQCAtMjMsMTYgKzIzLDIxIEBACiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxqbmkuaD4KIAogI2luY2x1ZGUgPG1lZGlhL0FWU3luY1NldHRpbmdzLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVGltZXN0YW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZXRhZGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KICNpbmNsdWRlIDxtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyVHlwZXMuaD4KIAorI2luY2x1ZGUgImpuaS5oIgorI2luY2x1ZGUgIm1lZGlhcGxheWVyMi5wYi5oIgorCit1c2luZyBhbmRyb2lkOjptZWRpYTo6TWVkaWFQbGF5ZXIyUHJvdG86OlBsYXllck1lc3NhZ2U7CisKIC8vIEZ3ZCBkZWNsIHRvIG1ha2Ugc3VyZSBldmVyeW9uZSBhZ3JlZXMgdGhhdCB0aGUgc2NvcGUgb2Ygc3RydWN0IHNvY2thZGRyX2luIGlzCiAvLyBnbG9iYWwsIGFuZCBub3QgaW4gYW5kcm9pZDo6CiBzdHJ1Y3Qgc29ja2FkZHJfaW47CkBAIC00Myw3ICs0OCw2IEBACiBjbGFzcyBQYXJjZWw7CiBzdHJ1Y3QgQU5hdGl2ZVdpbmRvd1dyYXBwZXI7CiAKLSNkZWZpbmUgREVGQVVMVF9BVURJT1NJTktfQlVGRkVSQ09VTlQgNAogI2RlZmluZSBERUZBVUxUX0FVRElPU0lOS19CVUZGRVJTSVpFIDEyMDAKICNkZWZpbmUgREVGQVVMVF9BVURJT1NJTktfU0FNUExFUkFURSA0NDEwMAogCkBAIC01Niw3ICs2MCw4IEBACiBjbGFzcyBNZWRpYVBsYXllcjJJbnRlcmZhY2VMaXN0ZW5lcjogcHVibGljIFJlZkJhc2UKIHsKIHB1YmxpYzoKLSAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICpvYmopID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwKKyAgICAgICAgICAgY29uc3QgUGxheWVyTWVzc2FnZSAqb2JqKSA9IDA7CiB9OwogCiBjbGFzcyBNZWRpYVBsYXllcjJJbnRlcmZhY2UgOiBwdWJsaWMgQUhhbmRsZXIgewpAQCAtODgsNyArOTMsNyBAQAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCAmdHMpIGNvbnN0ID0gMDsKICAgICAgICAgdmlydHVhbCBpbnQ2NF90IGdldFBsYXllZE91dER1cmF0aW9uVXMoaW50NjRfdCBub3dVcykgY29uc3QgPSAwOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QgKmZyYW1lc3dyaXR0ZW4pIGNvbnN0ID0gMDsKLSAgICAgICAgdmlydHVhbCBhdWRpb19zZXNzaW9uX3QgZ2V0U2Vzc2lvbklkKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIGludDMyX3QgZ2V0U2Vzc2lvbklkKCkgY29uc3QgPSAwOwogICAgICAgICB2aXJ0dWFsIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0QXVkaW9TdHJlYW1UeXBlKCkgY29uc3QgPSAwOwogICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFNhbXBsZVJhdGUoKSBjb25zdCA9IDA7CiAgICAgICAgIHZpcnR1YWwgaW50NjRfdCBnZXRCdWZmZXJEdXJhdGlvbkluVXMoKSBjb25zdCA9IDA7CkBAIC05OCwxMiArMTAzLDEwIEBACiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbigKICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCBpbnQgY2hhbm5lbENvdW50LCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQ9QVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCi0gICAgICAgICAgICAgICAgaW50IGJ1ZmZlckNvdW50PURFRkFVTFRfQVVESU9TSU5LX0JVRkZFUkNPVU5ULAogICAgICAgICAgICAgICAgIEF1ZGlvQ2FsbGJhY2sgY2IgPSBOVUxMLAogICAgICAgICAgICAgICAgIHZvaWQgKmNvb2tpZSA9IE5VTEwsCiAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAogICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwsCi0gICAgICAgICAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCA9IGZhbHNlLAogICAgICAgICAgICAgICAgIHVpbnQzMl90IHN1Z2dlc3RlZEZyYW1lQ291bnQgPSAwKSA9IDA7CiAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpID0gMDsKQEAgLTEzOSw5ICsxNDIsMTAgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIEF1ZGlvUm91dGluZwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldE91dHB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90KiBkZXZpY2VJZCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFByZWZlcnJlZERldmljZShqb2JqZWN0IGRldmljZSk7CisgICAgICAgIHZpcnR1YWwgam9iamVjdCAgICAgZ2V0Um91dGVkRGV2aWNlKCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgYWRkQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IHJvdXRpbmdEZWxlZ2F0ZSk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IGxpc3RlbmVyKTsKICAgICB9OwogCiAgICAgTWVkaWFQbGF5ZXIySW50ZXJmYWNlKCkgOiBtTGlzdGVuZXIoTlVMTCkgeyB9CkBAIC0xNzEsNyArMTc1LDYgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZUFzeW5jKCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKSA9IDA7CiAgICAgdmlydHVhbCBib29sIGlzUGxheWluZygpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUmIHJhdGUpIHsKQEAgLTIxOCwyNiArMjIxLDE0IEBACiAgICAgLy8gICAgICAgICAgICAgICAgZGF0YSBzZW50IGJ5IHRoZSBqYXZhIGxheWVyLgogICAgIC8vIEBwYXJhbVtvdXRdIHJlcGx5IFBhcmNlbCB0byBob2xkIHRoZSByZXBseSBkYXRhLiBDYW5ub3QgYmUgbnVsbC4KICAgICAvLyBAcmV0dXJuIE9LIGlmIHRoZSBjYWxsIHdhcyBzdWNjZXNzZnVsLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW52b2tlKGNvbnN0IFBhcmNlbCYgcmVxdWVzdCwgUGFyY2VsICpyZXBseSkgPSAwOwotCi0gICAgLy8gVGhlIENsaWVudCBpbiB0aGUgTWV0YWRhdGFQbGF5ZXJTZXJ2aWNlIGNhbGxzIHRoaXMgbWV0aG9kIG9uCi0gICAgLy8gdGhlIG5hdGl2ZSBwbGF5ZXIgdG8gcmV0cmlldmUgYWxsIG9yIGEgc3Vic2V0IG9mIG1ldGFkYXRhLgotICAgIC8vCi0gICAgLy8gQHBhcmFtIGlkcyBTb3J0ZWRMaXN0IG9mIG1ldGFkYXRhIElEIHRvIGJlIGZldGNoLiBJZiBlbXB0eSwgYWxsCi0gICAgLy8gICAgICAgICAgICB0aGUga25vd24gbWV0YWRhdGEgc2hvdWxkIGJlIHJldHVybmVkLgotICAgIC8vIEBwYXJhbVtpbm91dF0gcmVjb3JkcyBQYXJjZWwgd2hlcmUgdGhlIHBsYXllciBhcHBlbmRzIGl0cyBtZXRhZGF0YS4KLSAgICAvLyBAcmV0dXJuIE9LIGlmIHRoZSBjYWxsIHdhcyBzdWNjZXNzZnVsLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YWRhdGEoY29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXImIC8qIGlkcyAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogLyogcmVjb3JkcyAqLykgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGludm9rZShjb25zdCBQbGF5ZXJNZXNzYWdlICZyZXF1ZXN0LCBQbGF5ZXJNZXNzYWdlICpyZXBseSkgPSAwOwogCiAgICAgdm9pZCBzZXRMaXN0ZW5lcihjb25zdCBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2VMaXN0ZW5lcj4gJmxpc3RlbmVyKSB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTGlzdGVuZXJMb2NrKTsKICAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CiAgICAgfQogCi0gICAgdm9pZCBzZW5kRXZlbnQoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDE9MCwgaW50IGV4dDI9MCwgY29uc3QgUGFyY2VsICpvYmo9TlVMTCkgeworICAgIHZvaWQgc2VuZEV2ZW50KGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxPTAsIGludCBleHQyPTAsIGNvbnN0IFBsYXllck1lc3NhZ2UgKm9iaj1OVUxMKSB7CiAgICAgICAgIHNwPE1lZGlhUGxheWVyMkludGVyZmFjZUxpc3RlbmVyPiBsaXN0ZW5lcjsKICAgICAgICAgewogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1MaXN0ZW5lckxvY2spOwpAQCAtMjU2LDExICsyNDcsMTEgQEAKICAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICYgLyogbXNnICovKSBvdmVycmlkZSB7IH0KIAogICAgIC8vIE1vZHVsYXIgRFJNCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgLyogdXVpZCAqL1sxNl0sCisgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlRHJtKGludDY0X3QgLypzcmNJZCovLCBjb25zdCB1aW50OF90IC8qIHV1aWQgKi9bMTZdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIC8qIGRybVNlc3Npb25JZCAqLykgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZURybSgpIHsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VEcm0oaW50NjRfdCAvKnNyY0lkKi8pIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMlR5cGVzLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyVHlwZXMuaAppbmRleCAzOTA1YjU1Li4yNDMwMjg5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyVHlwZXMuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyVHlwZXMuaApAQCAtMzQsOCArMzQsNyBAQAogICAgIE1FRElBMl9TRVRfVklERU9fU0laRSAgICA9IDUsCiAgICAgTUVESUEyX1NUQVJURUQgICAgICAgICAgID0gNiwKICAgICBNRURJQTJfUEFVU0VEICAgICAgICAgICAgPSA3LAotICAgIE1FRElBMl9TVE9QUEVEICAgICAgICAgICA9IDgsCi0gICAgTUVESUEyX1NLSVBQRUQgICAgICAgICAgID0gOSwKKyAgICBNRURJQTJfU0tJUFBFRCAgICAgICAgICAgPSA4LAogICAgIE1FRElBMl9OT1RJRllfVElNRSAgICAgICA9IDk4LAogICAgIE1FRElBMl9USU1FRF9URVhUICAgICAgICA9IDk5LAogICAgIE1FRElBMl9FUlJPUiAgICAgICAgICAgICA9IDEwMCwKQEAgLTQzLDcgKzQyLDYgQEAKICAgICBNRURJQTJfU1VCVElUTEVfREFUQSAgICAgPSAyMDEsCiAgICAgTUVESUEyX01FVEFfREFUQSAgICAgICAgID0gMjAyLAogICAgIE1FRElBMl9EUk1fSU5GTyAgICAgICAgICA9IDIxMCwKLSAgICBNRURJQTJfQVVESU9fUk9VVElOR19DSEFOR0VEID0gMTAwMDAsCiB9OwogCiAvLyBHZW5lcmljIGVycm9yIGNvZGVzIGZvciB0aGUgbWVkaWEgcGxheWVyIGZyYW1ld29yay4gIEVycm9ycyBhcmUgZmF0YWwsIHRoZQpAQCAtOTYsMTcgKzk0LDIwIEBACiBlbnVtIG1lZGlhMl9pbmZvX3R5cGUgewogICAgIC8vIDB4eAogICAgIE1FRElBMl9JTkZPX1VOS05PV04gPSAxLAotICAgIC8vIFRoZSBwbGF5ZXIgd2FzIHN0YXJ0ZWQgYmVjYXVzZSBpdCB3YXMgdXNlZCBhcyB0aGUgbmV4dCBwbGF5ZXIgZm9yIGFub3RoZXIKLSAgICAvLyBwbGF5ZXIsIHdoaWNoIGp1c3QgY29tcGxldGVkIHBsYXliYWNrCi0gICAgTUVESUEyX0lORk9fU1RBUlRFRF9BU19ORVhUID0gMiwKKyAgICAvLyBUaGUgcGxheWVyIGp1c3Qgc3RhcnRlZCB0aGUgcGxheWJhY2sgb2YgdGhpcyBkYXRhIHNvdXJjZS4KKyAgICBNRURJQTJfSU5GT19EQVRBX1NPVVJDRV9TVEFSVCA9IDIsCiAgICAgLy8gVGhlIHBsYXllciBqdXN0IHB1c2hlZCB0aGUgdmVyeSBmaXJzdCB2aWRlbyBmcmFtZSBmb3IgcmVuZGVyaW5nCiAgICAgTUVESUEyX0lORk9fVklERU9fUkVOREVSSU5HX1NUQVJUID0gMywKICAgICAvLyBUaGUgcGxheWVyIGp1c3QgcHVzaGVkIHRoZSB2ZXJ5IGZpcnN0IGF1ZGlvIGZyYW1lIGZvciByZW5kZXJpbmcKICAgICBNRURJQTJfSU5GT19BVURJT19SRU5ERVJJTkdfU1RBUlQgPSA0LAogICAgIC8vIFRoZSBwbGF5ZXIganVzdCBjb21wbGV0ZWQgdGhlIHBsYXliYWNrIG9mIHRoaXMgZGF0YSBzb3VyY2UKLSAgICBNRURJQTJfSU5GT19QTEFZQkFDS19DT01QTEVURSA9IDUsCi0gICAgLy8gVGhlIHBsYXllciBqdXN0IGNvbXBsZXRlZCB0aGUgcGxheWJhY2sgb2YgdGhlIGZ1bGwgcGxheSBsaXN0Ci0gICAgTUVESUEyX0lORk9fUExBWUxJU1RfRU5EID0gNiwKKyAgICBNRURJQTJfSU5GT19EQVRBX1NPVVJDRV9FTkQgPSA1LAorICAgIC8vIFRoZSBwbGF5ZXIganVzdCBjb21wbGV0ZWQgdGhlIHBsYXliYWNrIG9mIGFsbCBkYXRhIHNvdXJjZXMuCisgICAgLy8gQnV0IHRoaXMgaXMgbm90IHZpc2libGUgaW4gbmF0aXZlIGNvZGUuIEp1c3Qga2VlcCB0aGlzIGVudHJ5IGZvciBjb21wbGV0ZW5lc3MuCisgICAgTUVESUEyX0lORk9fREFUQV9TT1VSQ0VfTElTVF9FTkQgPSA2LAorICAgIC8vIFRoZSBwbGF5ZXIganVzdCBjb21wbGV0ZWQgYW4gaXRlcmF0aW9uIG9mIHBsYXliYWNrIGxvb3AuIFRoaXMgZXZlbnQgaXMgc2VudCBvbmx5IHdoZW4KKyAgICAvLyBsb29waW5nIGlzIGVuYWJsZWQuCisgICAgTUVESUEyX0lORk9fREFUQV9TT1VSQ0VfUkVQRUFUID0gNywKIAogICAgIC8vMXh4CiAgICAgLy8gVGhlIHBsYXllciBqdXN0IHByZXBhcmVkIGEgZGF0YSBzb3VyY2UuCkBAIC0xNTAsMTEgKzE1MSwxMSBAQAogCiAvLyBEbyBub3QgY2hhbmdlIHRoZXNlIHZhbHVlcyB3aXRob3V0IHVwZGF0aW5nIHRoZWlyIGNvdW50ZXJwYXJ0cyBpbiBNZWRpYVBsYXllcjIuamF2YQogZW51bSBtZWRpYXBsYXllcjJfc3RhdGVzIHsKLSAgICBNRURJQVBMQVlFUjJfU1RBVEVfSURMRSAgICAgICAgID0gMSwKLSAgICBNRURJQVBMQVlFUjJfU1RBVEVfUFJFUEFSRUQgICAgID0gMiwKLSAgICBNRURJQVBMQVlFUjJfU1RBVEVfUExBWUlORyAgICAgID0gMywKLSAgICBNRURJQVBMQVlFUjJfU1RBVEVfUEFVU0VEICAgICAgID0gNCwKLSAgICBNRURJQVBMQVlFUjJfU1RBVEVfRVJST1IgICAgICAgID0gNSwKKyAgICBNRURJQVBMQVlFUjJfU1RBVEVfSURMRSAgICAgICAgID0gMTAwMSwKKyAgICBNRURJQVBMQVlFUjJfU1RBVEVfUFJFUEFSRUQgICAgID0gMTAwMiwKKyAgICBNRURJQVBMQVlFUjJfU1RBVEVfUEFVU0VEICAgICAgID0gMTAwMywKKyAgICBNRURJQVBMQVlFUjJfU1RBVEVfUExBWUlORyAgICAgID0gMTAwNCwKKyAgICBNRURJQVBMQVlFUjJfU1RBVEVfRVJST1IgICAgICAgID0gMTAwNSwKIH07CiAKIGVudW0gbWVkaWFfcGxheWVyMl9pbnRlcm5hbF9zdGF0ZXMgewpAQCAtMTY1LDggKzE2Niw3IEBACiAgICAgTUVESUFfUExBWUVSMl9QUkVQQVJFRCAgICAgICAgICAgPSAxIDw8IDMsCiAgICAgTUVESUFfUExBWUVSMl9TVEFSVEVEICAgICAgICAgICAgPSAxIDw8IDQsCiAgICAgTUVESUFfUExBWUVSMl9QQVVTRUQgICAgICAgICAgICAgPSAxIDw8IDUsCi0gICAgTUVESUFfUExBWUVSMl9TVE9QUEVEICAgICAgICAgICAgPSAxIDw8IDYsCi0gICAgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSAgPSAxIDw8IDcKKyAgICBNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFICA9IDEgPDwgNgogfTsKIAogLy8gS2VlcCBLRVlfUEFSQU1FVEVSXyogaW4gc3luYyB3aXRoIE1lZGlhUGxheWVyMi5qYXZhLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL21lZGlhcGxheWVyMi5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL21lZGlhcGxheWVyMi5oCmluZGV4IGQ1ODYxOTIuLjc4ODY1YzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9tZWRpYXBsYXllcjIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvbWVkaWFwbGF5ZXIyLmgKQEAgLTIwLDExICsyMCwxMiBAQAogI2luY2x1ZGUgPG1lZGlhL0FWU3luY1NldHRpbmdzLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KICNpbmNsdWRlIDxtZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5oPgotI2luY2x1ZGUgPG1lZGlhL01ldGFkYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXJfY29tbW9uLmg+CiAjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJUeXBlcy5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KT2JqZWN0SG9sZGVyLmg+CiAKKyNpbmNsdWRlIDxqbmkuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KQEAgLTMyLDYgKzMzLDggQEAKICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8tYmFzZS5oPgogCisjaW5jbHVkZSAiam5pLmgiCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFOYXRpdmVXaW5kb3dXcmFwcGVyOwpAQCAtNDIsNyArNDUsOCBAQAogY2xhc3MgTWVkaWFQbGF5ZXIyTGlzdGVuZXI6IHZpcnR1YWwgcHVibGljIFJlZkJhc2UKIHsKIHB1YmxpYzoKLSAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICpvYmopID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwKKyAgICAgICAgICAgIGNvbnN0IFBsYXllck1lc3NhZ2UgKm9iaiA9IE5VTEwpID0gMDsKIH07CiAKIGNsYXNzIE1lZGlhUGxheWVyMiA6IHB1YmxpYyBNZWRpYVBsYXllcjJJbnRlcmZhY2VMaXN0ZW5lcgpAQCAtNTAsNyArNTQsNyBAQAogcHVibGljOgogICAgIH5NZWRpYVBsYXllcjIoKTsKIAotICAgIHN0YXRpYyBzcDxNZWRpYVBsYXllcjI+IENyZWF0ZSgpOworICAgIHN0YXRpYyBzcDxNZWRpYVBsYXllcjI+IENyZWF0ZShpbnQzMl90IHNlc3Npb25JZCwgam9iamVjdCBjb250ZXh0KTsKICAgICBzdGF0aWMgc3RhdHVzX3QgRHVtcEFsbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgZGlzY29ubmVjdCgpOwpAQCAtNjUsMTAgKzY5LDkgQEAKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBwcmVwYXJlQXN5bmMoKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzdGFydCgpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHN0b3AoKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBwYXVzZSgpOwogICAgICAgICAgICAgYm9vbCAgICAgICAgICAgIGlzUGxheWluZygpOwotICAgICAgICAgICAgbWVkaWFwbGF5ZXIyX3N0YXRlcyBnZXRNZWRpYVBsYXllcjJTdGF0ZSgpOworICAgICAgICAgICAgbWVkaWFwbGF5ZXIyX3N0YXRlcyBnZXRTdGF0ZSgpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUmIHJhdGUpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUqIHJhdGUgLyogbm9ubnVsbCAqLyk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzJiBzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpOwpAQCAtODIsNjAgKzg1LDUyIEBACiAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBub3RpZnlBdChpbnQ2NF90IG1lZGlhVGltZVVzKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbXNlYyk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0RHVyYXRpb24oaW50NjRfdCAqbXNlYyk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0RHVyYXRpb24oaW50NjRfdCBzcmNJZCwgaW50NjRfdCAqbXNlYyk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcmVzZXQoKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCB0eXBlKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCAqdHlwZSk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0TG9vcGluZyhpbnQgbG9vcCk7CiAgICAgICAgICAgICBib29sICAgICAgICAgICAgaXNMb29waW5nKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0Vm9sdW1lKGZsb2F0IGxlZnRWb2x1bWUsIGZsb2F0IHJpZ2h0Vm9sdW1lKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lKTsKICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwgKm9iaiA9IE5VTEwpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGludm9rZShjb25zdCBQYXJjZWwmIHJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldE1ldGFkYXRhRmlsdGVyKGNvbnN0IFBhcmNlbCYgZmlsdGVyKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRNZXRhZGF0YShib29sIHVwZGF0ZV9vbmx5LCBib29sIGFwcGx5X2ZpbHRlciwgUGFyY2VsICptZXRhZGF0YSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0QXVkaW9TZXNzaW9uSWQoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCk7Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgZ2V0QXVkaW9TZXNzaW9uSWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGxheWVyTWVzc2FnZSAqb2JqID0gTlVMTCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgaW52b2tlKGNvbnN0IFBsYXllck1lc3NhZ2UgJnJlcXVlc3QsIFBsYXllck1lc3NhZ2UgKnJlcGx5KTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRBdWRpb1Nlc3Npb25JZChpbnQzMl90IHNlc3Npb25JZCk7CisgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgZ2V0QXVkaW9TZXNzaW9uSWQoKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoZmxvYXQgbGV2ZWwpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwmIHJlcXVlc3QpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldEF1ZGlvQXR0cmlidXRlcyhjb25zdCBqb2JqZWN0IGF0dHJpYnV0ZXMpOworICAgICAgICAgICAgam9iamVjdCAgICAgICAgIGdldEF1ZGlvQXR0cmlidXRlcygpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwqIHJlcGx5KTsKIAogICAgICAgICAgICAgLy8gTW9kdWxhciBEUk0KLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgZHJtU2Vzc2lvbklkKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICByZWxlYXNlRHJtKCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcHJlcGFyZURybShpbnQ2NF90IHNyY0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgZHJtU2Vzc2lvbklkKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICByZWxlYXNlRHJtKGludDY0X3Qgc3JjSWQpOwogICAgICAgICAgICAgLy8gQXVkaW9Sb3V0aW5nCi0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpOwotICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRSb3V0ZWREZXZpY2VJZCgpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRQcmVmZXJyZWREZXZpY2Uoam9iamVjdCBkZXZpY2UpOworICAgICAgICAgICAgam9iamVjdCAgICAgICAgIGdldFJvdXRlZERldmljZSgpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCByb3V0aW5nRGVsZWdhdGUpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCBsaXN0ZW5lcik7CiAKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKIHByaXZhdGU6Ci0gICAgTWVkaWFQbGF5ZXIyKCk7CisgICAgTWVkaWFQbGF5ZXIyKGludDMyX3Qgc2Vzc2lvbklkLCBqb2JqZWN0IGNvbnRleHQpOwogICAgIGJvb2wgaW5pdCgpOwogCi0gICAgLy8gQHBhcmFtIHR5cGUgT2YgdGhlIG1ldGFkYXRhIHRvIGJlIHRlc3RlZC4KLSAgICAvLyBAcmV0dXJuIHRydWUgaWYgdGhlIG1ldGFkYXRhIHNob3VsZCBiZSBkcm9wcGVkIGFjY29yZGluZyB0bwotICAgIC8vICAgICAgICAgICAgICB0aGUgZmlsdGVycy4KLSAgICBib29sIHNob3VsZERyb3BNZXRhZGF0YShtZWRpYTo6TWV0YWRhdGE6OlR5cGUgdHlwZSkgY29uc3Q7Ci0KLSAgICAvLyBBZGQgYSBuZXcgZWxlbWVudCB0byB0aGUgc2V0IG9mIG1ldGFkYXRhIHVwZGF0ZWQuIE5vb3AgaWYKLSAgICAvLyB0aGUgZWxlbWVudCBleGlzdHMgYWxyZWFkeS4KLSAgICAvLyBAcGFyYW0gdHlwZSBPZiB0aGUgbWV0YWRhdGEgdG8gYmUgcmVjb3JkZWQuCi0gICAgdm9pZCBhZGROZXdNZXRhZGF0YVVwZGF0ZShtZWRpYTo6TWV0YWRhdGE6OlR5cGUgdHlwZSk7Ci0KICAgICAvLyBEaXNjb25uZWN0IGZyb20gdGhlIGN1cnJlbnRseSBjb25uZWN0ZWQgQU5hdGl2ZVdpbmRvdy4KICAgICB2b2lkIGRpc2Nvbm5lY3ROYXRpdmVXaW5kb3dfbCgpOwogCi0gICAgc3RhdHVzX3Qgc2V0QXVkaW9BdHRyaWJ1dGVzX2woY29uc3QgUGFyY2VsICZyZXF1ZXN0KTsKKyAgICBzdGF0dXNfdCBzZXRBdWRpb0F0dHJpYnV0ZXNfbChjb25zdCBqb2JqZWN0IGF0dHJpYnV0ZXMpOwogCiAgICAgdm9pZCBjbGVhcl9sKCk7CiAgICAgc3RhdHVzX3Qgc2Vla1RvX2woaW50NjRfdCBtc2VjLCBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlKTsKICAgICBzdGF0dXNfdCBwcmVwYXJlQXN5bmNfbCgpOwogICAgIHN0YXR1c190IGdldER1cmF0aW9uX2woaW50NjRfdCAqbXNlYyk7CiAgICAgc3RhdHVzX3QgcmVzZXRfbCgpOwotICAgIHN0YXR1c190IGNoZWNrU3RhdGVGb3JLZXlTZXRfbChpbnQga2V5KTsKKyAgICBzdGF0dXNfdCBjaGVja1N0YXRlX2woKTsKIAogICAgIHBpZF90ICAgICAgICAgICAgICAgICAgICAgICBtUGlkOwogICAgIHVpZF90ICAgICAgICAgICAgICAgICAgICAgICBtVWlkOwpAQCAtMTUyLDI3ICsxNDcsMTUgQEAKICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgbVNlZWtQb3NpdGlvbjsKICAgICBNZWRpYVBsYXllcjJTZWVrTW9kZSAgICAgICAgbVNlZWtNb2RlOwogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgICAgICAgICBtU3RyZWFtVHlwZTsKLSAgICBQYXJjZWwqICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbDsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUxvb3A7Ci0gICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgIG1MZWZ0Vm9sdW1lOwotICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICBtUmlnaHRWb2x1bWU7CisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWU7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb1dpZHRoOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9IZWlnaHQ7Ci0gICAgYXVkaW9fc2Vzc2lvbl90ICAgICAgICAgICAgIG1BdWRpb1Nlc3Npb25JZDsKLSAgICBhdWRpb19hdHRyaWJ1dGVzX3QgKiAgICAgICAgbUF1ZGlvQXR0cmlidXRlczsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvU2Vzc2lvbklkOworICAgIHNwPEpPYmplY3RIb2xkZXI+ICAgICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzOworICAgIHNwPEpPYmplY3RIb2xkZXI+ICAgICAgICAgICBtQ29udGV4dDsKICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgbVNlbmRMZXZlbDsKLQogICAgIHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiAgICBtQ29ubmVjdGVkV2luZG93OwotCi0gICAgLy8gTWV0YWRhdGEgZmlsdGVycy4KLSAgICBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciBtTWV0YWRhdGFBbGxvdzsgIC8vIHByb3RlY3RlZCBieSBtTG9jawotICAgIG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyIG1NZXRhZGF0YURyb3A7ICAvLyBwcm90ZWN0ZWQgYnkgbUxvY2sKLQotICAgIC8vIE1ldGFkYXRhIHVwZGF0ZWQuIEZvciBlYWNoIE1FRElBX0lORk9fTUVUQURBVEFfVVBEQVRFCi0gICAgLy8gbm90aWZpY2F0aW9uIHdlIHRyeSB0byB1cGRhdGUgbU1ldGFkYXRhVXBkYXRlZCB3aGljaCBpcyBhCi0gICAgLy8gc2V0OiBubyBkdXBsaWNhdGUuCi0gICAgLy8gZ2V0TWV0YWRhdGEgY2xlYXJzIHRoaXMgc2V0LgotICAgIG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyIG1NZXRhZGF0YVVwZGF0ZWQ7ICAvLyBwcm90ZWN0ZWQgYnkgbUxvY2sKIH07CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbWVkaWFwbGF5ZXIyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9tZWRpYXBsYXllcjIuY3BwCmluZGV4IGU1NTY3ZGMuLmY3NTM4MGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9tZWRpYXBsYXllcjIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9tZWRpYXBsYXllcjIuY3BwCkBAIC0xOCwxNCArMTgsMTEgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTWVkaWFQbGF5ZXIyTmF0aXZlIgogCi0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZURlc2MuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9NZW1vcnlMZWFrVHJhY2tVdGlsLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWV0YWRhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtXcmFwcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuaD4KQEAgLTUzLDE2OSArNTAsNiBAQAogY29uc3QgaW50IGtEdW1wTG9ja1JldHJpZXMgPSA1MDsKIGNvbnN0IGludCBrRHVtcExvY2tTbGVlcFVzID0gMjAwMDA7CiAKLS8vIE1heCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgZmlsdGVyLgotY29uc3QgaW50IGtNYXhGaWx0ZXJTaXplID0gNjQ7ICAvLyBJIHB1bGxlZCB0aGF0IG91dCBvZiB0aGluIGFpci4KLQotLy8gRklYTUU6IE1vdmUgYWxsIHRoZSBtZXRhZGF0YSByZWxhdGVkIGZ1bmN0aW9uIGluIHRoZSBNZXRhZGF0YS5jcHAKLQotLy8gVW5tYXJzaGFsbCBhIGZpbHRlciBmcm9tIGEgUGFyY2VsLgotLy8gRmlsdGVyIGZvcm1hdCBpbiBhIHBhcmNlbDoKLS8vCi0vLyAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCi0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gfCAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIGVudHJpZXMgKG4pICAgICAgICAgICAgICAgICAgIHwKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLyB8ICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSB0eXBlIDEgICAgICAgICAgICAgICAgICAgICAgICAgfAotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhIHR5cGUgMiAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gIC4uLi4KLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLyB8ICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSB0eXBlIG4gICAgICAgICAgICAgICAgICAgICAgICAgfAotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vCi0vLyBAcGFyYW0gcCBQYXJjZWwgdGhhdCBzaG91bGQgc3RhcnQgd2l0aCBhIGZpbHRlci4KLS8vIEBwYXJhbVtvdXRdIGZpbHRlciBPbiBleGl0IGNvbnRhaW5zIHRoZSBsaXN0IG9mIG1ldGFkYXRhIHR5cGUgdG8gYmUKLS8vICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZC4KLS8vIEBwYXJhbVtvdXRdIHN0YXR1cyBPbiBleGl0IGNvbnRhaW5zIHRoZSBzdGF0dXMgY29kZSB0byBiZSByZXR1cm5lZC4KLS8vIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGFyY2VsIHN0YXJ0cyB3aXRoIGEgdmFsaWQgZmlsdGVyLgotYm9vbCB1bm1hcnNoYWxsRmlsdGVyKGNvbnN0IFBhcmNlbCYgcCwKLSAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciAqZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpIHsKLSAgICBpbnQzMl90IHZhbDsKLSAgICBpZiAocC5yZWFkSW50MzIoJnZhbCkgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZWFkIGZpbHRlcidzIGxlbmd0aCIpOwotICAgICAgICAqc3RhdHVzID0gTk9UX0VOT1VHSF9EQVRBOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKHZhbCA+IGtNYXhGaWx0ZXJTaXplIHx8IHZhbCA8IDApIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgZmlsdGVyIGxlbiAlZCIsIHZhbCk7Ci0gICAgICAgICpzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjb25zdCBzaXplX3QgbnVtID0gdmFsOwotCi0gICAgZmlsdGVyLT5jbGVhcigpOwotICAgIGZpbHRlci0+c2V0Q2FwYWNpdHkobnVtKTsKLQotICAgIHNpemVfdCBzaXplID0gbnVtICogc2l6ZW9mKG1lZGlhOjpNZXRhZGF0YTo6VHlwZSk7Ci0KLQotICAgIGlmIChwLmRhdGFBdmFpbCgpIDwgc2l6ZSkgewotICAgICAgICBBTE9HRSgiRmlsdGVyIHRvbyBzaG9ydCBleHBlY3RlZCAlenUgYnV0IGdvdCAlenUiLCBzaXplLCBwLmRhdGFBdmFpbCgpKTsKLSAgICAgICAgKnN0YXR1cyA9IE5PVF9FTk9VR0hfREFUQTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6VHlwZSAqZGF0YSA9Ci0gICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6VHlwZSo+KHAucmVhZElucGxhY2Uoc2l6ZSkpOwotCi0gICAgaWYgKE5VTEwgPT0gZGF0YSkgewotICAgICAgICBBTE9HRSgiRmlsdGVyIGhhZCBubyBkYXRhIik7Ci0gICAgICAgICpzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBUaGUgc3RsIGltcGwgb2YgdmVjdG9yIHdvdWxkIGJlIG1vcmUgZWZmaWNpZW50IGhlcmUKLSAgICAvLyBiZWNhdXNlIGl0IGRlZ2VuZXJhdGVzIGludG8gYSBtZW1jcHkgb24gcG9kIHR5cGVzLiBUcnkgdG8KLSAgICAvLyByZXBsYWNlIGxhdGVyIG9yIHVzZSBzdGw6OnNldC4KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bTsgKytpKSB7Ci0gICAgICAgIGZpbHRlci0+YWRkKCpkYXRhKTsKLSAgICAgICAgKytkYXRhOwotICAgIH0KLSAgICAqc3RhdHVzID0gT0s7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIEBwYXJhbSBmaWx0ZXIgT2YgbWV0YWRhdGEgdHlwZS4KLS8vIEBwYXJhbSB2YWwgVG8gYmUgc2VhcmNoZWQuCi0vLyBAcmV0dXJuIHRydWUgaWYgYSBtYXRjaCB3YXMgZm91bmQuCi1ib29sIGZpbmRNZXRhZGF0YShjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgZmlsdGVyLCBjb25zdCBpbnQzMl90IHZhbCkgewotICAgIC8vIERlYWwgd2l0aCBlbXB0eSBhbmQgQU5ZIHJpZ2h0IGF3YXkKLSAgICBpZiAoZmlsdGVyLmlzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChmaWx0ZXJbMF0gPT0gbWVkaWE6Ok1ldGFkYXRhOjprQW55KSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmaWx0ZXIuaW5kZXhPZih2YWwpID49IDA7Ci19Ci0KLS8vIG1hcnNoYWxsaW5nIHRhZyBpbmRpY2F0aW5nIGZsYXR0ZW5lZCB1dGYxNiB0YWdzCi0vLyBrZWVwIGluIHN5bmMgd2l0aCBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlcy5qYXZhCi1jb25zdCBpbnQzMl90IGtBdWRpb0F0dHJpYnV0ZXNNYXJzaGFsbFRhZ0ZsYXR0ZW5UYWdzID0gMTsKLQotLy8gQXVkaW8gYXR0cmlidXRlcyBmb3JtYXQgaW4gYSBwYXJjZWw6Ci0vLwotLy8gIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gfCAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLyB8ICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gfCAgICAgICAgICAgICAgICAgICAgICAga0F1ZGlvQXR0cmlidXRlc01hcnNoYWxsVGFnRmxhdHRlblRhZ3MgIHwgLy8gaWdub3JlIHRhZ3MgaWYgbm90IGZvdW5kCi0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gfCAgICAgICAgICAgICAgICAgICAgICAgZmxhdHRlbmVkIHRhZ3MgaW4gVVRGMTYgICAgICAgICAgICAgICAgIHwKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8KLS8vIEBwYXJhbSBwIFBhcmNlbCB0aGF0IGNvbnRhaW5zIGF1ZGlvIGF0dHJpYnV0ZXMuCi0vLyBAcGFyYW1bb3V0XSBhdHRyaWJ1dGVzIE9uIGV4aXQgcG9pbnRzIHRvIGFuIGluaXRpYWxpemVkIGF1ZGlvX2F0dHJpYnV0ZXNfdCBzdHJ1Y3R1cmUKLS8vIEBwYXJhbVtvdXRdIHN0YXR1cyBPbiBleGl0IGNvbnRhaW5zIHRoZSBzdGF0dXMgY29kZSB0byBiZSByZXR1cm5lZC4KLXZvaWQgdW5tYXJzaGFsbEF1ZGlvQXR0cmlidXRlcyhjb25zdCBQYXJjZWwmIHBhcmNlbCwgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzKSB7Ci0gICAgYXR0cmlidXRlcy0+dXNhZ2UgPSAoYXVkaW9fdXNhZ2VfdCkgcGFyY2VsLnJlYWRJbnQzMigpOwotICAgIGF0dHJpYnV0ZXMtPmNvbnRlbnRfdHlwZSA9IChhdWRpb19jb250ZW50X3R5cGVfdCkgcGFyY2VsLnJlYWRJbnQzMigpOwotICAgIGF0dHJpYnV0ZXMtPnNvdXJjZSA9IChhdWRpb19zb3VyY2VfdCkgcGFyY2VsLnJlYWRJbnQzMigpOwotICAgIGF0dHJpYnV0ZXMtPmZsYWdzID0gKGF1ZGlvX2ZsYWdzX21hc2tfdCkgcGFyY2VsLnJlYWRJbnQzMigpOwotICAgIGNvbnN0IGJvb2wgaGFzRmxhdHRlbmVkVGFnID0gKHBhcmNlbC5yZWFkSW50MzIoKSA9PSBrQXVkaW9BdHRyaWJ1dGVzTWFyc2hhbGxUYWdGbGF0dGVuVGFncyk7Ci0gICAgaWYgKGhhc0ZsYXR0ZW5lZFRhZykgewotICAgICAgICAvLyB0aGUgdGFncyBhcmUgVVRGMTYsIGNvbnZlcnQgdG8gVVRGOAotICAgICAgICBTdHJpbmcxNiB0YWdzID0gcGFyY2VsLnJlYWRTdHJpbmcxNigpOwotICAgICAgICBzc2l6ZV90IHJlYWxUYWdTaXplID0gdXRmMTZfdG9fdXRmOF9sZW5ndGgodGFncy5zdHJpbmcoKSwgdGFncy5zaXplKCkpOwotICAgICAgICBpZiAocmVhbFRhZ1NpemUgPD0gMCkgewotICAgICAgICAgICAgc3RyY3B5KGF0dHJpYnV0ZXMtPnRhZ3MsICIiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGNvcHkgdGhlIGZsYXR0ZW5lZCBzdHJpbmcgaW50byB0aGUgYXR0cmlidXRlcyBhcyB0aGUgZGVzdGluYXRpb24gZm9yIHRoZSBjb252ZXJzaW9uOgotICAgICAgICAgICAgLy8gY29weWluZyBhcnJheSBzaXplIC0xLCBhcnJheSBmb3IgdGFncyB3YXMgY2FsbG9jJ2QsIG5vIG5lZWQgdG8gTlVMTC10ZXJtaW5hdGUgaXQKLSAgICAgICAgICAgIHNpemVfdCB0YWdTaXplID0gcmVhbFRhZ1NpemUgPiBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSAxID8KLSAgICAgICAgICAgICAgICAgICAgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0gMSA6IHJlYWxUYWdTaXplOwotICAgICAgICAgICAgdXRmMTZfdG9fdXRmOCh0YWdzLnN0cmluZygpLCB0YWdTaXplLCBhdHRyaWJ1dGVzLT50YWdzLAotICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXR0cmlidXRlcy0+dGFncykgLyBzaXplb2YoYXR0cmlidXRlcy0+dGFnc1swXSkpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoInVubWFyc2hhbGxBdWRpb0F0dHJpYnV0ZXMoKSByZWNlaXZlZCB1bmZsYXR0ZW5lZCB0YWdzLCBpZ25vcmluZyB0YWcgdmFsdWVzIik7Ci0gICAgICAgIHN0cmNweShhdHRyaWJ1dGVzLT50YWdzLCAiIik7Ci0gICAgfQotfQotCi1jbGFzcyBBdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcjogcHVibGljIEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrIHsKLXB1YmxpYzoKLSAgICBBdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcihjb25zdCBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U+JiBsaXN0ZW5lcikKLSAgICAgICAgOiBtTGlzdGVuZXIobGlzdGVuZXIpIHsgfQotCi0gICAgfkF1ZGlvRGV2aWNlVXBkYXRlZE5vdGlmaWVyKCkgeyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb0RldmljZVVwZGF0ZShhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIG92ZXJyaWRlIHsKLSAgICAgICAgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlPiBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBsaXN0ZW5lci0+c2VuZEV2ZW50KDAsIE1FRElBMl9BVURJT19ST1VUSU5HX0NIQU5HRUQsIGF1ZGlvSW8sIGRldmljZUlkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dXKCJsaXN0ZW5lciBmb3IgcHJvY2VzcyAlZCBkZWF0aCBpcyBnb25lIiwgTUVESUEyX0FVRElPX1JPVVRJTkdfQ0hBTkdFRCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgd3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlPiBtTGlzdGVuZXI7Ci19OwotCiBjbGFzcyBwcm94eUxpc3RlbmVyIDogcHVibGljIE1lZGlhUGxheWVyMkludGVyZmFjZUxpc3RlbmVyIHsKIHB1YmxpYzoKICAgICBwcm94eUxpc3RlbmVyKGNvbnN0IHdwPE1lZGlhUGxheWVyMj4gJnBsYXllcikKQEAgLTIyMyw3ICs1Nyw4IEBACiAKICAgICB+cHJveHlMaXN0ZW5lcigpIHsgfTsKIAotICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikgb3ZlcnJpZGUgeworICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLAorICAgICAgICAgICAgY29uc3QgUGxheWVyTWVzc2FnZSAqb2JqKSBvdmVycmlkZSB7CiAgICAgICAgIHNwPE1lZGlhUGxheWVyMj4gcGxheWVyID0gbVBsYXllci5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChwbGF5ZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgcGxheWVyLT5ub3RpZnkoc3JjSWQsIG1zZywgZXh0MSwgZXh0Miwgb2JqKTsKQEAgLTI2NSwxMTQgKzEwMCwxMTAgQEAKICAgICBTdHJpbmc4IHJlc3VsdDsKICAgICBTb3J0ZWRWZWN0b3I8IHNwPE1lZGlhUGxheWVyMj4gPiBwbGF5ZXJzOyAvL3RvIHNlcmlhbGlzZSB0aGUgbXV0ZXggdW5sb2NrICYgY2xpZW50IGRlc3RydWN0aW9uLgogCi0gICAgaWYgKGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIikpID09IGZhbHNlKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlBlcm1pc3Npb24gRGVuaWFsOiBjYW4ndCBkdW1wIE1lZGlhUGxheWVyMlxuIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKHNSZWNvcmRMb2NrKTsKKyAgICAgICAgZW5zdXJlSW5pdF9sKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwLCBuID0gc1BsYXllcnMtPnNpemUoKTsgaSA8IG47ICsraSkgeworICAgICAgICAgICAgc3A8TWVkaWFQbGF5ZXIyPiBwID0gKCpzUGxheWVycylbaV0ucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKHAgIT0gMCkgeworICAgICAgICAgICAgICAgIHAtPmR1bXAoZmQsIGFyZ3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGxheWVycy5hZGQocCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXN1bHQuYXBwZW5kKCIgRmlsZXMgb3BlbmVkIGFuZC9vciBtYXBwZWQ6XG4iKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9tYXBzIiwgZ2V0cGlkKCkpOworICAgIEZJTEUgKmYgPSBmb3BlbihidWZmZXIsICJyIik7CisgICAgaWYgKGYpIHsKKyAgICAgICAgd2hpbGUgKCFmZW9mKGYpKSB7CisgICAgICAgICAgICBmZ2V0cyhidWZmZXIsIFNJWkUsIGYpOworICAgICAgICAgICAgaWYgKHN0cnN0cihidWZmZXIsICIgL3N0b3JhZ2UvIikgfHwKKyAgICAgICAgICAgICAgICBzdHJzdHIoYnVmZmVyLCAiIC9zeXN0ZW0vc291bmRzLyIpIHx8CisgICAgICAgICAgICAgICAgc3Ryc3RyKGJ1ZmZlciwgIiAvZGF0YS8iKSB8fAorICAgICAgICAgICAgICAgIHN0cnN0cihidWZmZXIsICIgL3N5c3RlbS9tZWRpYS8iKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgIik7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZjbG9zZShmKTsKICAgICB9IGVsc2UgewotICAgICAgICB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhzUmVjb3JkTG9jayk7Ci0gICAgICAgICAgICBlbnN1cmVJbml0X2woKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBuID0gc1BsYXllcnMtPnNpemUoKTsgaSA8IG47ICsraSkgewotICAgICAgICAgICAgICAgIHNwPE1lZGlhUGxheWVyMj4gcCA9ICgqc1BsYXllcnMpW2ldLnByb21vdGUoKTsKLSAgICAgICAgICAgICAgICBpZiAocCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHAtPmR1bXAoZmQsIGFyZ3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwbGF5ZXJzLmFkZChwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICByZXN1bHQuYXBwZW5kKCJjb3VsZG4ndCBvcGVuICIpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgfQogCi0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiBGaWxlcyBvcGVuZWQgYW5kL29yIG1hcHBlZDpcbiIpOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9tYXBzIiwgZ2V0cGlkKCkpOwotICAgICAgICBGSUxFICpmID0gZm9wZW4oYnVmZmVyLCAiciIpOwotICAgICAgICBpZiAoZikgewotICAgICAgICAgICAgd2hpbGUgKCFmZW9mKGYpKSB7Ci0gICAgICAgICAgICAgICAgZmdldHMoYnVmZmVyLCBTSVpFLCBmKTsKLSAgICAgICAgICAgICAgICBpZiAoc3Ryc3RyKGJ1ZmZlciwgIiAvc3RvcmFnZS8iKSB8fAotICAgICAgICAgICAgICAgICAgICBzdHJzdHIoYnVmZmVyLCAiIC9zeXN0ZW0vc291bmRzLyIpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHN0cnN0cihidWZmZXIsICIgL2RhdGEvIikgfHwKLSAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGJ1ZmZlciwgIiAvc3lzdGVtL21lZGlhLyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgIik7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmY2xvc2UoZik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJjb3VsZG4ndCBvcGVuICIpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi9wcm9jLyVkL2ZkIiwgZ2V0cGlkKCkpOwotICAgICAgICBESVIgKmQgPSBvcGVuZGlyKGJ1ZmZlcik7Ci0gICAgICAgIGlmIChkKSB7Ci0gICAgICAgICAgICBzdHJ1Y3QgZGlyZW50ICplbnQ7Ci0gICAgICAgICAgICB3aGlsZSgoZW50ID0gcmVhZGRpcihkKSkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGlmIChzdHJjbXAoZW50LT5kX25hbWUsIi4iKSAmJiBzdHJjbXAoZW50LT5kX25hbWUsIi4uIikpIHsKLSAgICAgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiL3Byb2MvJWQvZmQvJXMiLCBnZXRwaWQoKSwgZW50LT5kX25hbWUpOwotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3RhdCBzOwotICAgICAgICAgICAgICAgICAgICBpZiAobHN0YXQoYnVmZmVyLCAmcykgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzLnN0X21vZGUgJiBTX0lGTVQpID09IFNfSUZMTkspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGxpbmt0b1syNTZdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4gPSByZWFkbGluayhidWZmZXIsIGxpbmt0bywgc2l6ZW9mKGxpbmt0bykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxlbiA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobGVuID4gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rdG9bMjUyXSA9ICcuJzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0b1syNTNdID0gJy4nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3RvWzI1NF0gPSAnLic7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rdG9bMjU1XSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rdG9bbGVuXSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cnN0cihsaW5rdG8sICIvc3RvcmFnZS8iKSA9PSBsaW5rdG8gfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0cihsaW5rdG8sICIvc3lzdGVtL3NvdW5kcy8iKSA9PSBsaW5rdG8gfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0cihsaW5rdG8sICIvZGF0YS8iKSA9PSBsaW5rdG8gfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0cihsaW5rdG8sICIvc3lzdGVtL21lZGlhLyIpID09IGxpbmt0bykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAtPiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobGlua3RvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9mZCIsIGdldHBpZCgpKTsKKyAgICBESVIgKmQgPSBvcGVuZGlyKGJ1ZmZlcik7CisgICAgaWYgKGQpIHsKKyAgICAgICAgc3RydWN0IGRpcmVudCAqZW50OworICAgICAgICB3aGlsZSgoZW50ID0gcmVhZGRpcihkKSkgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKHN0cmNtcChlbnQtPmRfbmFtZSwiLiIpICYmIHN0cmNtcChlbnQtPmRfbmFtZSwiLi4iKSkgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi9wcm9jLyVkL2ZkLyVzIiwgZ2V0cGlkKCksIGVudC0+ZF9uYW1lKTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3RhdCBzOworICAgICAgICAgICAgICAgIGlmIChsc3RhdChidWZmZXIsICZzKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgocy5zdF9tb2RlICYgU19JRk1UKSA9PSBTX0lGTE5LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGxpbmt0b1syNTZdOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiA9IHJlYWRsaW5rKGJ1ZmZlciwgbGlua3RvLCBzaXplb2YobGlua3RvKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihsZW4gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobGVuID4gMjU1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0b1syNTJdID0gJy4nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rdG9bMjUzXSA9ICcuJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3RvWzI1NF0gPSAnLic7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0b1syNTVdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rdG9bbGVuXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgIHVuZXhwZWN0ZWQgdHlwZSBmb3IgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cnN0cihsaW5rdG8sICIvc3RvcmFnZS8iKSA9PSBsaW5rdG8gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGxpbmt0bywgIi9zeXN0ZW0vc291bmRzLyIpID09IGxpbmt0byB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJzdHIobGlua3RvLCAiL2RhdGEvIikgPT0gbGlua3RvIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0cihsaW5rdG8sICIvc3lzdGVtL21lZGlhLyIpID09IGxpbmt0bykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgICIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAtPiAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChsaW5rdG8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgdW5leHBlY3RlZCB0eXBlIGZvciAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbG9zZWRpcihkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoImNvdWxkbid0IG9wZW4gIik7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwogICAgICAgICB9CisgICAgICAgIGNsb3NlZGlyKGQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoImNvdWxkbid0IG9wZW4gIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICB9CiAKLSAgICAgICAgZ0xvb3BlclJvc3Rlci5kdW1wKGZkLCBhcmdzKTsKKyAgICBnTG9vcGVyUm9zdGVyLmR1bXAoZmQsIGFyZ3MpOwogCi0gICAgICAgIGJvb2wgZHVtcE1lbSA9IGZhbHNlOwotICAgICAgICBib29sIHVucmVhY2hhYmxlTWVtb3J5ID0gZmFsc2U7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJncy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKGFyZ3NbaV0gPT0gU3RyaW5nMTYoIi1tIikpIHsKLSAgICAgICAgICAgICAgICBkdW1wTWVtID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXSA9PSBTdHJpbmcxNigiLS11bnJlYWNoYWJsZSIpKSB7Ci0gICAgICAgICAgICAgICAgdW5yZWFjaGFibGVNZW1vcnkgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChkdW1wTWVtKSB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbkR1bXBpbmcgbWVtb3J5OlxuIik7Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZyBzID0gZHVtcE1lbW9yeUFkZHJlc3NlcygxMDAgLyogbGltaXQgKi8pOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChzLmNfc3RyKCksIHMuc2l6ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodW5yZWFjaGFibGVNZW1vcnkpIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuRHVtcGluZyB1bnJlYWNoYWJsZSBtZW1vcnk6XG4iKTsKLSAgICAgICAgICAgIC8vIFRPRE8gLSBzaG91bGQgbGltaXQgYmUgYW4gYXJndW1lbnQgcGFyYW1ldGVyPwotICAgICAgICAgICAgLy8gVE9ETzogZW5hYmxlIEdldFVucmVhY2hhYmxlTWVtb3J5U3RyaW5nIGlmIGl0J3MgcGFydCBvZiBzdGFibGUgQVBJCi0gICAgICAgICAgICAvL3N0ZDo6c3RyaW5nIHMgPSBHZXRVbnJlYWNoYWJsZU1lbW9yeVN0cmluZyh0cnVlIC8qIGNvbnRlbnRzICovLCAxMDAwMCAvKiBsaW1pdCAqLyk7Ci0gICAgICAgICAgICAvL3Jlc3VsdC5hcHBlbmQocy5jX3N0cigpLCBzLnNpemUoKSk7CisgICAgYm9vbCBkdW1wTWVtID0gZmFsc2U7CisgICAgYm9vbCB1bnJlYWNoYWJsZU1lbW9yeSA9IGZhbHNlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJncy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoYXJnc1tpXSA9PSBTdHJpbmcxNigiLW0iKSkgeworICAgICAgICAgICAgZHVtcE1lbSA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXSA9PSBTdHJpbmcxNigiLS11bnJlYWNoYWJsZSIpKSB7CisgICAgICAgICAgICB1bnJlYWNoYWJsZU1lbW9yeSA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CisgICAgaWYgKGR1bXBNZW0pIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG5EdW1waW5nIG1lbW9yeTpcbiIpOworICAgICAgICBzdGQ6OnN0cmluZyBzID0gZHVtcE1lbW9yeUFkZHJlc3NlcygxMDAgLyogbGltaXQgKi8pOworICAgICAgICByZXN1bHQuYXBwZW5kKHMuY19zdHIoKSwgcy5zaXplKCkpOworICAgIH0KKyAgICBpZiAodW5yZWFjaGFibGVNZW1vcnkpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG5EdW1waW5nIHVucmVhY2hhYmxlIG1lbW9yeTpcbiIpOworICAgICAgICAvLyBUT0RPIC0gc2hvdWxkIGxpbWl0IGJlIGFuIGFyZ3VtZW50IHBhcmFtZXRlcj8KKyAgICAgICAgLy8gVE9ETzogZW5hYmxlIEdldFVucmVhY2hhYmxlTWVtb3J5U3RyaW5nIGlmIGl0J3MgcGFydCBvZiBzdGFibGUgQVBJCisgICAgICAgIC8vc3RkOjpzdHJpbmcgcyA9IEdldFVucmVhY2hhYmxlTWVtb3J5U3RyaW5nKHRydWUgLyogY29udGVudHMgKi8sIDEwMDAwIC8qIGxpbWl0ICovKTsKKyAgICAgICAgLy9yZXN1bHQuYXBwZW5kKHMuY19zdHIoKSwgcy5zaXplKCkpOworICAgIH0KKwogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTM4MCw4ICsyMTEsOCBAQAogfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQogCiAvL3N0YXRpYwotc3A8TWVkaWFQbGF5ZXIyPiBNZWRpYVBsYXllcjI6OkNyZWF0ZSgpIHsKLSAgICBzcDxNZWRpYVBsYXllcjI+IHBsYXllciA9IG5ldyBNZWRpYVBsYXllcjIoKTsKK3NwPE1lZGlhUGxheWVyMj4gTWVkaWFQbGF5ZXIyOjpDcmVhdGUoaW50MzJfdCBzZXNzaW9uSWQsIGpvYmplY3QgY29udGV4dCkgeworICAgIHNwPE1lZGlhUGxheWVyMj4gcGxheWVyID0gbmV3IE1lZGlhUGxheWVyMihzZXNzaW9uSWQsIGNvbnRleHQpOwogCiAgICAgaWYgKCFwbGF5ZXItPmluaXQoKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTM5OCw0NCArMjI5LDM0IEBACiAgICAgcmV0dXJuIGR1bXBQbGF5ZXJzKGZkLCBhcmdzKTsKIH0KIAotTWVkaWFQbGF5ZXIyOjpNZWRpYVBsYXllcjIoKSB7CitNZWRpYVBsYXllcjI6Ok1lZGlhUGxheWVyMihpbnQzMl90IHNlc3Npb25JZCwgam9iamVjdCBjb250ZXh0KSB7CiAgICAgQUxPR1YoImNvbnN0cnVjdG9yIik7CiAgICAgbVNyY0lkID0gMDsKICAgICBtTG9ja1RocmVhZElkID0gMDsKICAgICBtTGlzdGVuZXIgPSBOVUxMOwogICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX01VU0lDOwotICAgIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgPSBOVUxMOworICAgIG1BdWRpb0F0dHJpYnV0ZXMgPSBOVUxMOworICAgIG1Db250ZXh0ID0gbmV3IEpPYmplY3RIb2xkZXIoY29udGV4dCk7CiAgICAgbUN1cnJlbnRQb3NpdGlvbiA9IC0xOwogICAgIG1DdXJyZW50U2Vla01vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DOwogICAgIG1TZWVrUG9zaXRpb24gPSAtMTsKICAgICBtU2Vla01vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DOwogICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX0lETEU7CiAgICAgbUxvb3AgPSBmYWxzZTsKLSAgICBtTGVmdFZvbHVtZSA9IG1SaWdodFZvbHVtZSA9IDEuMDsKKyAgICBtVm9sdW1lID0gMS4wOwogICAgIG1WaWRlb1dpZHRoID0gbVZpZGVvSGVpZ2h0ID0gMDsKLSAgICBtQXVkaW9TZXNzaW9uSWQgPSAoYXVkaW9fc2Vzc2lvbl90KSBBdWRpb1N5c3RlbTo6bmV3QXVkaW9VbmlxdWVJZChBVURJT19VTklRVUVfSURfVVNFX1NFU1NJT04pOwotICAgIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQobUF1ZGlvU2Vzc2lvbklkLCAtMSk7CiAgICAgbVNlbmRMZXZlbCA9IDA7CiAKLSAgICAvLyBUT0RPOiBnZXQgcGlkIGFuZCB1aWQgZnJvbSBKQVZBCi0gICAgbVBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKLSAgICBtVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworICAgIG1QaWQgPSBBSUJpbmRlcl9nZXRDYWxsaW5nUGlkKCk7CisgICAgbVVpZCA9IEFJQmluZGVyX2dldENhbGxpbmdVaWQoKTsKIAotICAgIG1BdWRpb0F0dHJpYnV0ZXMgPSBOVUxMOworICAgIG1BdWRpb091dHB1dCA9IG5ldyBNZWRpYVBsYXllcjJBdWRpb091dHB1dChzZXNzaW9uSWQsIG1VaWQsIG1QaWQsIE5VTEwgLyphdHRyaWJ1dGVzKi8pOwogfQogCiBNZWRpYVBsYXllcjI6On5NZWRpYVBsYXllcjIoKSB7CiAgICAgQUxPR1YoImRlc3RydWN0b3IiKTsKLSAgICBpZiAobUF1ZGlvQXR0cmlidXRlc1BhcmNlbCAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsOwotICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsID0gTlVMTDsKLSAgICB9Ci0gICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtQXVkaW9TZXNzaW9uSWQsIC0xKTsKICAgICBkaXNjb25uZWN0KCk7CiAgICAgcmVtb3ZlUGxheWVyKHRoaXMpOwotICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzICE9IE5VTEwpIHsKLSAgICAgICAgZnJlZShtQXVkaW9BdHRyaWJ1dGVzKTsKLSAgICB9CiB9CiAKIGJvb2wgTWVkaWFQbGF5ZXIyOjppbml0KCkgewpAQCAtNDkzLDE5ICszMTQsMjggQEAKICAgICBpZiAoZHNkID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CisgICAgLy8gTWljcm9zZWNvbmQgaXMgdXNlZCBpbiBOdVBsYXllcjIuCisgICAgaWYgKGRzZC0+bVN0YXJ0UG9zaXRpb25NcyA+IERhdGFTb3VyY2VEZXNjOjprTWF4VGltZU1zKSB7CisgICAgICAgIGRzZC0+bVN0YXJ0UG9zaXRpb25NcyA9IERhdGFTb3VyY2VEZXNjOjprTWF4VGltZU1zOworICAgICAgICBBTE9HVygic2V0RGF0YVNvdXJjZSwgc3RhcnQgcG9pc3Rpb24gY2xhbXBlZCB0byAlbGxkIG1zIiwgKGxvbmcgbG9uZylkc2QtPm1TdGFydFBvc2l0aW9uTXMpOworICAgIH0KKyAgICBpZiAoZHNkLT5tRW5kUG9zaXRpb25NcyA+IERhdGFTb3VyY2VEZXNjOjprTWF4VGltZU1zKSB7CisgICAgICAgIGRzZC0+bUVuZFBvc2l0aW9uTXMgPSBEYXRhU291cmNlRGVzYzo6a01heFRpbWVNczsKKyAgICAgICAgQUxPR1coInNldERhdGFTb3VyY2UsIGVuZCBwb2lzdGlvbiBjbGFtcGVkIHRvICVsbGQgbXMiLCAobG9uZyBsb25nKWRzZC0+bVN0YXJ0UG9zaXRpb25Ncyk7CisgICAgfQogICAgIEFMT0dWKCJzZXREYXRhU291cmNlIHR5cGUoJWQpLCBzcmNJZCglbGxkKSIsIGRzZC0+bVR5cGUsIChsb25nIGxvbmcpZHNkLT5tSWQpOwogCiAgICAgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlPiBvbGRQbGF5ZXI7CiAKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAgICAgaWYgKCEoKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX0lETEUpCiAgICAgICAgICAgICAgIHx8IG1DdXJyZW50U3RhdGUgPT0gTUVESUFfUExBWUVSMl9TVEFURV9FUlJPUikpIHsKICAgICAgICAgICAgIEFMT0dFKCJzZXREYXRhU291cmNlIGNhbGxlZCBpbiB3cm9uZyBzdGF0ZSAlZCIsIG1DdXJyZW50U3RhdGUpOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9CiAKLSAgICAgICAgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlPiBwbGF5ZXIgPSBuZXcgTnVQbGF5ZXIyRHJpdmVyKG1QaWQsIG1VaWQpOworICAgICAgICBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U+IHBsYXllciA9IG5ldyBOdVBsYXllcjJEcml2ZXIobVBpZCwgbVVpZCwgbUNvbnRleHQpOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBwbGF5ZXItPmluaXRDaGVjaygpOwogICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBwbGF5ZXIgb2JqZWN0LCBpbml0Q2hlY2sgZmFpbGVkKCVkKSIsIGVycik7CkBAIC01MTUsOCArMzQ1LDYgQEAKICAgICAgICAgY2xlYXJfbCgpOwogCiAgICAgICAgIHBsYXllci0+c2V0TGlzdGVuZXIobmV3IHByb3h5TGlzdGVuZXIodGhpcykpOwotICAgICAgICBtQXVkaW9PdXRwdXQgPSBuZXcgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQobUF1ZGlvU2Vzc2lvbklkLCBtVWlkLAotICAgICAgICAgICAgICAgIG1QaWQsIG1BdWRpb0F0dHJpYnV0ZXMsIG5ldyBBdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcihwbGF5ZXIpKTsKICAgICAgICAgcGxheWVyLT5zZXRBdWRpb1NpbmsobUF1ZGlvT3V0cHV0KTsKIAogICAgICAgICBlcnIgPSBwbGF5ZXItPnNldERhdGFTb3VyY2UoZHNkKTsKQEAgLTU2NSw3OSArMzkzLDE4IEBACiAgICAgcmV0dXJuIG1QbGF5ZXItPnBsYXlOZXh0RGF0YVNvdXJjZShzcmNJZCk7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyMjo6aW52b2tlKGNvbnN0IFBhcmNlbCYgcmVxdWVzdCwgUGFyY2VsICpyZXBseSkgeworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjppbnZva2UoY29uc3QgUGxheWVyTWVzc2FnZSAmcmVxdWVzdCwgUGxheWVyTWVzc2FnZSAqcmVwbHkpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGNvbnN0IGJvb2wgaGFzQmVlbkluaXRpYWxpemVkID0KICAgICAgICAgICAgIChtQ3VycmVudFN0YXRlICE9IE1FRElBX1BMQVlFUjJfU1RBVEVfRVJST1IpICYmCiAgICAgICAgICAgICAoKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX0lETEUpICE9IE1FRElBX1BMQVlFUjJfSURMRSk7CiAgICAgaWYgKChtUGxheWVyID09IE5VTEwpIHx8ICFoYXNCZWVuSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgQUxPR0UoImludm9rZSBmYWlsZWQ6IHdyb25nIHN0YXRlICVYLCBtUGxheWVyKCVwKSIsIG1DdXJyZW50U3RhdGUsIG1QbGF5ZXIuZ2V0KCkpOworICAgICAgICBBTE9HRSgiaW52b2tlKCkgZmFpbGVkOiB3cm9uZyBzdGF0ZSAlWCwgbVBsYXllciglcCkiLCBtQ3VycmVudFN0YXRlLCBtUGxheWVyLmdldCgpKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBBTE9HVigiaW52b2tlICV6dSIsIHJlcXVlc3QuZGF0YVNpemUoKSk7CiAgICAgcmV0dXJuIG1QbGF5ZXItPmludm9rZShyZXF1ZXN0LCByZXBseSk7CiB9CiAKLS8vIFRoaXMgY2FsbCBkb2Vzbid0IG5lZWQgdG8gYWNjZXNzIHRoZSBuYXRpdmUgcGxheWVyLgotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRNZXRhZGF0YUZpbHRlcihjb25zdCBQYXJjZWwmIGZpbHRlcikgewotICAgIEFMT0dEKCJzZXRNZXRhZGF0YUZpbHRlciIpOwotCi0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyIGFsbG93LCBkcm9wOwotCi0gICAgaWYgKHVubWFyc2hhbGxGaWx0ZXIoZmlsdGVyLCAmYWxsb3csICZzdGF0dXMpICYmCi0gICAgICAgIHVubWFyc2hhbGxGaWx0ZXIoZmlsdGVyLCAmZHJvcCwgJnN0YXR1cykpIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotCi0gICAgICAgIG1NZXRhZGF0YUFsbG93ID0gYWxsb3c7Ci0gICAgICAgIG1NZXRhZGF0YURyb3AgPSBkcm9wOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OmdldE1ldGFkYXRhKGJvb2wgdXBkYXRlX29ubHksIGJvb2wgLyogYXBwbHlfZmlsdGVyICovLCBQYXJjZWwgKnJlcGx5KSB7Ci0gICAgQUxPR0QoImdldE1ldGFkYXRhIik7Ci0gICAgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlPiBwbGF5ZXI7Ci0gICAgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXIgaWRzOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICB7Ci0gICAgICAgIGlmIChtUGxheWVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICB9Ci0KLSAgICAgICAgcGxheWVyID0gbVBsYXllcjsKLSAgICAgICAgLy8gUGxhY2Vob2xkZXIgZm9yIHRoZSByZXR1cm4gY29kZSwgdXBkYXRlZCBieSB0aGUgY2FsbGVyLgotICAgICAgICByZXBseS0+d3JpdGVJbnQzMigtMSk7Ci0KLSAgICAgICAgLy8gV2UgZG9uJ3QgYmxvY2sgbm90aWZpY2F0aW9ucyB3aGlsZSB3ZSBmZXRjaCB0aGUgZGF0YS4gV2UgY2xlYXIKLSAgICAgICAgLy8gbU1ldGFkYXRhVXBkYXRlZCBmaXJzdCBzbyB3ZSBkb24ndCBsb3NlIG5vdGlmaWNhdGlvbnMgaGFwcGVuaW5nCi0gICAgICAgIC8vIGR1cmluZyB0aGUgcmVzdCBvZiB0aGlzIGNhbGwuCi0gICAgICAgIGlmICh1cGRhdGVfb25seSkgewotICAgICAgICAgICAgaWRzID0gbU1ldGFkYXRhVXBkYXRlZDsKLSAgICAgICAgfQotICAgICAgICBtTWV0YWRhdGFVcGRhdGVkLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgbWVkaWE6Ok1ldGFkYXRhIG1ldGFkYXRhKHJlcGx5KTsKLQotICAgIG1ldGFkYXRhLmFwcGVuZEhlYWRlcigpOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHBsYXllci0+Z2V0TWV0YWRhdGEoaWRzLCByZXBseSk7Ci0KLSAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgIG1ldGFkYXRhLnJlc2V0UGFyY2VsKCk7Ci0gICAgICAgIEFMT0dFKCJnZXRNZXRhZGF0YSBmYWlsZWQgJWQiLCBzdGF0dXMpOwotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIC8vIEZJWE1FOiBlbWVudCBmaWx0ZXJpbmcgb24gdGhlIHJlc3VsdC4gTm90IGNyaXRpY2FsIHNpbmNlCi0gICAgLy8gZmlsdGVyaW5nIHRha2VzIHBsYWNlIG9uIHRoZSB1cGRhdGUgbm90aWZpY2F0aW9ucyBhbHJlYWR5LiBUaGlzCi0gICAgLy8gd291bGQgYmUgd2hlbiBhbGwgdGhlIG1ldGFkYXRhIGFyZSBmZXRjaCBhbmQgYSBmaWx0ZXIgaXMgc2V0LgotCi0gICAgLy8gRXZlcnl0aGluZyBpcyBmaW5lLCB1cGRhdGUgdGhlIG1ldGFkYXRhIGxlbmd0aC4KLSAgICBtZXRhZGF0YS51cGRhdGVMZW5ndGgoKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KIHZvaWQgTWVkaWFQbGF5ZXIyOjpkaXNjb25uZWN0TmF0aXZlV2luZG93X2woKSB7CiAgICAgaWYgKG1Db25uZWN0ZWRXaW5kb3cgIT0gTlVMTCAmJiBtQ29ubmVjdGVkV2luZG93LT5nZXRBTmF0aXZlV2luZG93KCkgIT0gTlVMTCkgewogICAgICAgICBzdGF0dXNfdCBlcnIgPSBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KApAQCAtNzI3LDIyICs0OTQsOSBAQAogICAgIHJldHVybiBtUGxheWVyLT5zZXRCdWZmZXJpbmdTZXR0aW5ncyhidWZmZXJpbmcpOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldEF1ZGlvQXR0cmlidXRlc19sKGNvbnN0IFBhcmNlbCAmcGFyY2VsKSB7Ci0gICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXMgIT0gTlVMTCkgewotICAgICAgICBmcmVlKG1BdWRpb0F0dHJpYnV0ZXMpOwotICAgIH0KLSAgICBtQXVkaW9BdHRyaWJ1dGVzID0gKGF1ZGlvX2F0dHJpYnV0ZXNfdCAqKSBjYWxsb2MoMSwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0gICAgdW5tYXJzaGFsbEF1ZGlvQXR0cmlidXRlcyhwYXJjZWwsIG1BdWRpb0F0dHJpYnV0ZXMpOwotCi0gICAgQUxPR1YoInNldEF1ZGlvQXR0cmlidXRlc19sKCkgdXNhZ2U9JWQgY29udGVudD0lZCBmbGFncz0weCV4IHRhZ3M9JXMiLAotICAgICAgICAgICAgbUF1ZGlvQXR0cmlidXRlcy0+dXNhZ2UsIG1BdWRpb0F0dHJpYnV0ZXMtPmNvbnRlbnRfdHlwZSwgbUF1ZGlvQXR0cmlidXRlcy0+ZmxhZ3MsCi0gICAgICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzLT50YWdzKTsKLQotICAgIGlmIChtQXVkaW9PdXRwdXQgIT0gMCkgewotICAgICAgICBtQXVkaW9PdXRwdXQtPnNldEF1ZGlvQXR0cmlidXRlcyhtQXVkaW9BdHRyaWJ1dGVzKTsKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0QXVkaW9BdHRyaWJ1dGVzX2woY29uc3Qgam9iamVjdCBhdHRyaWJ1dGVzKSB7CisgICAgaWYgKG1BdWRpb091dHB1dCAhPSBOVUxMKSB7CisgICAgICAgIG1BdWRpb091dHB1dC0+c2V0QXVkaW9BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC03NTAsMTQgKzUwNCwxMiBAQAogc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpwcmVwYXJlQXN5bmMoKSB7CiAgICAgQUxPR1YoInByZXBhcmVBc3luYyIpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKChtUGxheWVyICE9IDApICYmIChtQ3VycmVudFN0YXRlICYgKE1FRElBX1BMQVlFUjJfSU5JVElBTElaRUQgfCBNRURJQV9QTEFZRVIyX1NUT1BQRUQpKSkgewotICAgICAgICBpZiAobUF1ZGlvQXR0cmlidXRlc1BhcmNlbCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXRBdWRpb0F0dHJpYnV0ZXNfbCgqbUF1ZGlvQXR0cmlidXRlc1BhcmNlbCk7CisgICAgaWYgKChtUGxheWVyICE9IDApICYmIChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9JTklUSUFMSVpFRCkpIHsKKyAgICAgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXMgIT0gTlVMTCkgeworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0QXVkaW9BdHRyaWJ1dGVzX2wobUF1ZGlvQXR0cmlidXRlcy0+Z2V0Sk9iamVjdCgpKTsKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1BdWRpb091dHB1dCAhPSAwKSB7Ci0gICAgICAgICAgICBtQXVkaW9PdXRwdXQtPnNldEF1ZGlvU3RyZWFtVHlwZShtU3RyZWFtVHlwZSk7CiAgICAgICAgIH0KICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfUFJFUEFSSU5HOwogICAgICAgICByZXR1cm4gbVBsYXllci0+cHJlcGFyZUFzeW5jKCk7CkBAIC03ODEsNyArNTMzLDcgQEAKICAgICAgICAgbVBsYXllci0+c2V0TG9vcGluZyhtTG9vcCk7CiAKICAgICAgICAgaWYgKG1BdWRpb091dHB1dCAhPSAwKSB7Ci0gICAgICAgICAgICBtQXVkaW9PdXRwdXQtPnNldFZvbHVtZShtTGVmdFZvbHVtZSwgbVJpZ2h0Vm9sdW1lKTsKKyAgICAgICAgICAgIG1BdWRpb091dHB1dC0+c2V0Vm9sdW1lKG1Wb2x1bWUpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1BdWRpb091dHB1dCAhPSAwKSB7CkBAIC04MDYsMzAgKzU1OCwxMiBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyMjo6c3RvcCgpIHsKLSAgICBBTE9HVigic3RvcCIpOwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX1NUT1BQRUQpIHJldHVybiBOT19FUlJPUjsKLSAgICBpZiAoIChtUGxheWVyICE9IDApICYmICggbUN1cnJlbnRTdGF0ZSAmICggTUVESUFfUExBWUVSMl9TVEFSVEVEIHwgTUVESUFfUExBWUVSMl9QUkVQQVJFRCB8Ci0gICAgICAgICAgICAgICAgICAgIE1FRElBX1BMQVlFUjJfUEFVU0VEIHwgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSApICkgKSB7Ci0gICAgICAgIHN0YXR1c190IHJldCA9IG1QbGF5ZXItPnN0b3AoKTsKLSAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfU1RBVEVfRVJST1I7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9TVE9QUEVEOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIEFMT0dFKCJzdG9wIGNhbGxlZCBpbiBzdGF0ZSAlZCwgbVBsYXllciglcCkiLCBtQ3VycmVudFN0YXRlLCBtUGxheWVyLmdldCgpKTsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KIHN0YXR1c190IE1lZGlhUGxheWVyMjo6cGF1c2UoKSB7CiAgICAgQUxPR1YoInBhdXNlIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobUN1cnJlbnRTdGF0ZSAmIChNRURJQV9QTEFZRVIyX1BBVVNFRHxNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFKSkKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIGlmICgobVBsYXllciAhPSAwKSAmJiAobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfU1RBUlRFRCkpIHsKKyAgICBpZiAoKG1QbGF5ZXIgIT0gMCkgJiYgKG1DdXJyZW50U3RhdGUgJiAoTUVESUFfUExBWUVSMl9TVEFSVEVEIHwgTUVESUFfUExBWUVSMl9QUkVQQVJFRCkpKSB7CiAgICAgICAgIHN0YXR1c190IHJldCA9IG1QbGF5ZXItPnBhdXNlKCk7CiAgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1NUQVRFX0VSUk9SOwpAQCAtODYwLDcgKzU5NCw3IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1tZWRpYXBsYXllcjJfc3RhdGVzIE1lZGlhUGxheWVyMjo6Z2V0TWVkaWFQbGF5ZXIyU3RhdGUoKSB7CittZWRpYXBsYXllcjJfc3RhdGVzIE1lZGlhUGxheWVyMjo6Z2V0U3RhdGUoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfU1RBVEVfRVJST1IpIHsKICAgICAgICAgcmV0dXJuIE1FRElBUExBWUVSMl9TVEFURV9FUlJPUjsKQEAgLTg3Myw4ICs2MDcsNyBAQAogICAgIGlmIChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9TVEFSVEVEKSB7CiAgICAgICAgIHJldHVybiBNRURJQVBMQVlFUjJfU1RBVEVfUExBWUlORzsKICAgICB9Ci0gICAgaWYgKG1DdXJyZW50U3RhdGUKLSAgICAgICAgJiAoTUVESUFfUExBWUVSMl9QQVVTRUQgfCBNRURJQV9QTEFZRVIyX1NUT1BQRUQgfCBNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFKSkgeworICAgIGlmIChtQ3VycmVudFN0YXRlICYgKE1FRElBX1BMQVlFUjJfUEFVU0VEIHwgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSkpIHsKICAgICAgICAgcmV0dXJuIE1FRElBUExBWUVSMl9TVEFURV9QQVVTRUQ7CiAgICAgfQogICAgIC8vIG5vdyBvbmx5IG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX1BSRVBBUkVEIGlzIHRydWUKQEAgLTg5MCw3ICs2MjMsNyBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtUGxheWVyID09IDAgfHwgKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX1NUT1BQRUQpKSB7CisgICAgaWYgKG1QbGF5ZXIgPT0gMCkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCkBAIC05NzgsMTEgKzcxMSwxOCBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyMjo6Z2V0RHVyYXRpb24oaW50NjRfdCAqbXNlYykgeworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpnZXREdXJhdGlvbihpbnQ2NF90IHNyY0lkLCBpbnQ2NF90ICptc2VjKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAvLyBUT0RPOiBjYWNoZSBkdXJhdGlvbiBmb3IgY3VycmVudFNyY0lkIGFuZCBuZXh0U3JjSWQsIGFuZCByZXR1cm4gY29ycmVjdAorICAgIC8vIHZhbHVlIGZvciBuZXh0U3JjSWQuCisgICAgaWYgKHNyY0lkICE9IG1TcmNJZCkgeworICAgICAgICAqbXNlYyA9IC0xOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCiAgICAgQUxPR1YoImdldER1cmF0aW9uX2wiKTsKICAgICBib29sIGlzVmFsaWRTdGF0ZSA9IChtQ3VycmVudFN0YXRlICYgKE1FRElBX1BMQVlFUjJfUFJFUEFSRUQgfCBNRURJQV9QTEFZRVIyX1NUQVJURUQgfAotICAgICAgICAgICAgTUVESUFfUExBWUVSMl9QQVVTRUQgfCBNRURJQV9QTEFZRVIyX1NUT1BQRUQgfCBNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFKSk7CisgICAgICAgICAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUpKTsKICAgICBpZiAobVBsYXllciA9PSAwIHx8ICFpc1ZhbGlkU3RhdGUpIHsKICAgICAgICAgQUxPR0UoIkF0dGVtcHQgdG8gY2FsbCBnZXREdXJhdGlvbiBpbiB3cm9uZyBzdGF0ZTogbVBsYXllcj0lcCwgbUN1cnJlbnRTdGF0ZT0ldSIsCiAgICAgICAgICAgICAgICAgbVBsYXllci5nZXQoKSwgbUN1cnJlbnRTdGF0ZSk7CkBAIC0xMTM4LDE4ICs4NzgsMTcgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0Vm9sdW1lKGZsb2F0IGxlZnRWb2x1bWUsIGZsb2F0IHJpZ2h0Vm9sdW1lKSB7Ci0gICAgQUxPR1YoIk1lZGlhUGxheWVyMjo6c2V0Vm9sdW1lKCVmLCAlZikiLCBsZWZ0Vm9sdW1lLCByaWdodFZvbHVtZSk7CitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldFZvbHVtZShmbG9hdCB2b2x1bWUpIHsKKyAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpzZXRWb2x1bWUoJWYpIiwgdm9sdW1lKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1MZWZ0Vm9sdW1lID0gbGVmdFZvbHVtZTsKLSAgICBtUmlnaHRWb2x1bWUgPSByaWdodFZvbHVtZTsKKyAgICBtVm9sdW1lID0gdm9sdW1lOwogICAgIGlmIChtQXVkaW9PdXRwdXQgIT0gMCkgewotICAgICAgICBtQXVkaW9PdXRwdXQtPnNldFZvbHVtZShsZWZ0Vm9sdW1lLCByaWdodFZvbHVtZSk7CisgICAgICAgIG1BdWRpb091dHB1dC0+c2V0Vm9sdW1lKHZvbHVtZSk7CiAgICAgfQogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRBdWRpb1Nlc3Npb25JZChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKSB7CitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldEF1ZGlvU2Vzc2lvbklkKGludDMyX3Qgc2Vzc2lvbklkKSB7CiAgICAgQUxPR1YoIk1lZGlhUGxheWVyMjo6c2V0QXVkaW9TZXNzaW9uSWQoJWQpIiwgc2Vzc2lvbklkKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmICghKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX0lETEUpKSB7CkBAIC0xMTU5LDE3ICs4OTgsMTggQEAKICAgICBpZiAoc2Vzc2lvbklkIDwgMCkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBpZiAoc2Vzc2lvbklkICE9IG1BdWRpb1Nlc3Npb25JZCkgewotICAgICAgICBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKHNlc3Npb25JZCwgLTEpOwotICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKG1BdWRpb1Nlc3Npb25JZCwgLTEpOwotICAgICAgICBtQXVkaW9TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgaWYgKG1BdWRpb091dHB1dCAhPSBOVUxMICYmIHNlc3Npb25JZCAhPSBtQXVkaW9PdXRwdXQtPmdldFNlc3Npb25JZCgpKSB7CisgICAgICAgIG1BdWRpb091dHB1dC0+c2V0U2Vzc2lvbklkKHNlc3Npb25JZCk7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotYXVkaW9fc2Vzc2lvbl90IE1lZGlhUGxheWVyMjo6Z2V0QXVkaW9TZXNzaW9uSWQoKSB7CitpbnQzMl90IE1lZGlhUGxheWVyMjo6Z2V0QXVkaW9TZXNzaW9uSWQoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbUF1ZGlvU2Vzc2lvbklkOworICAgIGlmIChtQXVkaW9PdXRwdXQgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gbUF1ZGlvT3V0cHV0LT5nZXRTZXNzaW9uSWQoKTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0QXV4RWZmZWN0U2VuZExldmVsKGZsb2F0IGxldmVsKSB7CkBAIC0xMTk2LDY3ICs5MzYsMzcgQEAKIH0KIAogLy8gYWx3YXlzIGNhbGwgd2l0aCBsb2NrIGhlbGQKLXN0YXR1c190IE1lZGlhUGxheWVyMjo6Y2hlY2tTdGF0ZUZvcktleVNldF9sKGludCBrZXkpIHsKLSAgICBzd2l0Y2goa2V5KSB7Ci0gICAgY2FzZSBNRURJQTJfS0VZX1BBUkFNRVRFUl9BVURJT19BVFRSSUJVVEVTOgotICAgICAgICBpZiAobUN1cnJlbnRTdGF0ZSAmICggTUVESUFfUExBWUVSMl9QUkVQQVJFRCB8IE1FRElBX1BMQVlFUjJfU1RBUlRFRCB8Ci0gICAgICAgICAgICAgICAgTUVESUFfUExBWUVSMl9QQVVTRUQgfCBNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFKSApIHsKLSAgICAgICAgICAgIC8vIENhbid0IGNoYW5nZSB0aGUgYXVkaW8gYXR0cmlidXRlcyBhZnRlciBwcmVwYXJlCi0gICAgICAgICAgICBBTE9HRSgidHJ5aW5nIHRvIHNldCBhdWRpbyBhdHRyaWJ1dGVzIGNhbGxlZCBpbiBzdGF0ZSAlZCIsIG1DdXJyZW50U3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIC8vIHBhcmFtZXRlciBkb2Vzbid0IHJlcXVpcmUgcGxheWVyIHN0YXRlIGNoZWNrCi0gICAgICAgIGJyZWFrOworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpjaGVja1N0YXRlX2woKSB7CisgICAgaWYgKG1DdXJyZW50U3RhdGUgJiAoIE1FRElBX1BMQVlFUjJfUFJFUEFSRUQgfCBNRURJQV9QTEFZRVIyX1NUQVJURUQgfAorICAgICAgICAgICAgTUVESUFfUExBWUVSMl9QQVVTRUQgfCBNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFKSApIHsKKyAgICAgICAgLy8gQ2FuJ3QgY2hhbmdlIHRoZSBhdWRpbyBhdHRyaWJ1dGVzIGFmdGVyIHByZXBhcmUKKyAgICAgICAgQUxPR0UoInRyeWluZyB0byBzZXQgYXVkaW8gYXR0cmlidXRlcyBjYWxsZWQgaW4gc3RhdGUgJWQiLCBtQ3VycmVudFN0YXRlKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCYgcmVxdWVzdCkgewotICAgIEFMT0dWKCJNZWRpYVBsYXllcjI6OnNldFBhcmFtZXRlciglZCkiLCBrZXkpOworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRBdWRpb0F0dHJpYnV0ZXMoY29uc3Qgam9iamVjdCBhdHRyaWJ1dGVzKSB7CisgICAgQUxPR1YoIk1lZGlhUGxheWVyMjo6c2V0QXVkaW9BdHRyaWJ1dGVzIik7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAoY2hlY2tTdGF0ZUZvcktleVNldF9sKGtleSkgIT0gT0spIHsKKyAgICBpZiAoY2hlY2tTdGF0ZV9sKCkgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9Ci0gICAgc3dpdGNoIChrZXkpIHsKLSAgICBjYXNlIE1FRElBMl9LRVlfUEFSQU1FVEVSX0FVRElPX0FUVFJJQlVURVM6Ci0gICAgICAgIC8vIHNhdmUgdGhlIG1hcnNoYWxsZWQgYXVkaW8gYXR0cmlidXRlcwotICAgICAgICBpZiAobUF1ZGlvQXR0cmlidXRlc1BhcmNlbCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBkZWxldGUgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbDsKLSAgICAgICAgfQotICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsID0gbmV3IFBhcmNlbCgpOwotICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsLT5hcHBlbmRGcm9tKCZyZXF1ZXN0LCAwLCByZXF1ZXN0LmRhdGFTaXplKCkpOwotICAgICAgICBzdGF0dXMgPSBzZXRBdWRpb0F0dHJpYnV0ZXNfbChyZXF1ZXN0KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBBTE9HVl9JRihtUGxheWVyID09IE5VTEwsICJzZXRQYXJhbWV0ZXI6IG5vIGFjdGl2ZSBwbGF5ZXIiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKG1QbGF5ZXIgIT0gTlVMTCkgewotICAgICAgICBzdGF0dXMgPSBtUGxheWVyLT5zZXRQYXJhbWV0ZXIoa2V5LCByZXF1ZXN0KTsKLSAgICB9CisgICAgbUF1ZGlvQXR0cmlidXRlcyA9IG5ldyBKT2JqZWN0SG9sZGVyKGF0dHJpYnV0ZXMpOworICAgIHN0YXR1cyA9IHNldEF1ZGlvQXR0cmlidXRlc19sKGF0dHJpYnV0ZXMpOwogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKK2pvYmplY3QgTWVkaWFQbGF5ZXIyOjpnZXRBdWRpb0F0dHJpYnV0ZXMoKSB7CisgICAgQUxPR1YoIk1lZGlhUGxheWVyMjo6Z2V0QXVkaW9BdHRyaWJ1dGVzKSIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb0F0dHJpYnV0ZXMgIT0gTlVMTCA/IG1BdWRpb0F0dHJpYnV0ZXMtPmdldEpPYmplY3QoKSA6IE5VTEw7Cit9CisKIHN0YXR1c190IE1lZGlhUGxheWVyMjo6Z2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpIHsKICAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpnZXRQYXJhbWV0ZXIoJWQpIiwga2V5KTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChrZXkgPT0gTUVESUEyX0tFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUykgewotICAgICAgICBpZiAocmVwbHkgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUF1ZGlvQXR0cmlidXRlc1BhcmNlbCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICByZXBseS0+YXBwZW5kRnJvbShtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsLCAwLCBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsLT5kYXRhU2l6ZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCiAgICAgaWYgKG1QbGF5ZXIgPT0gTlVMTCkgewogICAgICAgICBBTE9HVigiZ2V0UGFyYW1ldGVyOiBubyBhY3RpdmUgcGxheWVyIik7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTEyNjksNDQgKzk3OSwxMCBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLWJvb2wgTWVkaWFQbGF5ZXIyOjpzaG91bGREcm9wTWV0YWRhdGEobWVkaWE6Ok1ldGFkYXRhOjpUeXBlIGNvZGUpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0KLSAgICBpZiAoZmluZE1ldGFkYXRhKG1NZXRhZGF0YURyb3AsIGNvZGUpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGlmIChtTWV0YWRhdGFBbGxvdy5pc0VtcHR5KCkgfHwgZmluZE1ldGFkYXRhKG1NZXRhZGF0YUFsbG93LCBjb2RlKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQotCi0KLXZvaWQgTWVkaWFQbGF5ZXIyOjphZGROZXdNZXRhZGF0YVVwZGF0ZShtZWRpYTo6TWV0YWRhdGE6OlR5cGUgbWV0YWRhdGFfdHlwZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobU1ldGFkYXRhVXBkYXRlZC5pbmRleE9mKG1ldGFkYXRhX3R5cGUpIDwgMCkgewotICAgICAgICBtTWV0YWRhdGFVcGRhdGVkLmFkZChtZXRhZGF0YV90eXBlKTsKLSAgICB9Ci19Ci0KLXZvaWQgTWVkaWFQbGF5ZXIyOjpub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikgewordm9pZCBNZWRpYVBsYXllcjI6Om5vdGlmeShpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBsYXllck1lc3NhZ2UgKm9iaikgewogICAgIEFMT0dWKCJtZXNzYWdlIHJlY2VpdmVkIHNyY0lkPSVsbGQsIG1zZz0lZCwgZXh0MT0lZCwgZXh0Mj0lZCIsCiAgICAgICAgICAgKGxvbmcgbG9uZylzcmNJZCwgbXNnLCBleHQxLCBleHQyKTsKIAotICAgIGlmIChNRURJQTJfSU5GTyA9PSBtc2cgJiYgTUVESUEyX0lORk9fTUVUQURBVEFfVVBEQVRFID09IGV4dDEpIHsKLSAgICAgICAgY29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpUeXBlIG1ldGFkYXRhX3R5cGUgPSBleHQyOwotCi0gICAgICAgIGlmKHNob3VsZERyb3BNZXRhZGF0YShtZXRhZGF0YV90eXBlKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVXBkYXRlIHRoZSBsaXN0IG9mIG1ldGFkYXRhIHRoYXQgaGF2ZSBjaGFuZ2VkLiBnZXRNZXRhZGF0YQotICAgICAgICAvLyBhbHNvIGFjY2VzcyBtTWV0YWRhdGFVcGRhdGVkIGFuZCBjbGVhcnMgaXQuCi0gICAgICAgIGFkZE5ld01ldGFkYXRhVXBkYXRlKG1ldGFkYXRhX3R5cGUpOwotICAgIH0KLQogICAgIGJvb2wgc2VuZCA9IHRydWU7CiAgICAgYm9vbCBsb2NrZWQgPSBmYWxzZTsKIApAQCAtMTQxOCw3ICsxMDk0LDggQEAKIH0KIAogLy8gTW9kdWxhciBEUk0KLXN0YXR1c190IE1lZGlhUGxheWVyMjo6cHJlcGFyZURybShjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4mIGRybVNlc3Npb25JZCkgeworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpwcmVwYXJlRHJtKAorICAgICAgICBpbnQ2NF90IHNyY0lkLCBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4mIGRybVNlc3Npb25JZCkgewogICAgIC8vIFRPRE8gY2hhbmdlIHRvIEFMT0dWCiAgICAgQUxPR0QoInByZXBhcmVEcm06IHV1aWQ6ICVwICBkcm1TZXNzaW9uSWQ6ICVwKCV6dSkiLCB1dWlkLAogICAgICAgICAgICAgZHJtU2Vzc2lvbklkLmFycmF5KCksIGRybVNlc3Npb25JZC5zaXplKCkpOwpAQCAtMTQ0Miw3ICsxMTE5LDcgQEAKICAgICB9CiAKICAgICAvLyBQYXNzaW5nIGRvd24gdG8gbWVkaWFzZXJ2ZXIgbWFpbmx5IGZvciBjcmVhdGluZyB0aGUgY3J5cHRvCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBsYXllci0+cHJlcGFyZURybSh1dWlkLCBkcm1TZXNzaW9uSWQpOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1QbGF5ZXItPnByZXBhcmVEcm0oc3JjSWQsIHV1aWQsIGRybVNlc3Npb25JZCk7CiAgICAgQUxPR0VfSUYoc3RhdHVzICE9IE9LLCAicHJlcGFyZURybTogRmFpbGVkIGF0IG1lZGlhc2VydmVyIHdpdGggcmV0OiAlZCIsIHN0YXR1cyk7CiAKICAgICAvLyBUT0RPIGNoYW5nZSB0byBBTE9HVgpAQCAtMTQ1MSw3ICsxMTI4LDcgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnJlbGVhc2VEcm0oKSB7CitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnJlbGVhc2VEcm0oaW50NjRfdCBzcmNJZCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1QbGF5ZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTE0NjYsNyArMTE0Myw3IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUGxheWVyLT5yZWxlYXNlRHJtKCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBsYXllci0+cmVsZWFzZURybShzcmNJZCk7CiAgICAgLy8gVE9ETyBjaGFuZ2UgdG8gQUxPR1YKICAgICBBTE9HRCgicmVsZWFzZURybTogbWVkaWFzZXJ2ZXI6OnJlbGVhc2VEcm0gcmV0OiAlZCIsIHN0YXR1cyk7CiAgICAgaWYgKHN0YXR1cyAhPSBPSykgewpAQCAtMTQ3OSwzNiArMTE1Niw0MCBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIHsKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0UHJlZmVycmVkRGV2aWNlKGpvYmplY3QgZGV2aWNlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobUF1ZGlvT3V0cHV0ID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoInNldE91dHB1dERldmljZTogYXVkaW8gc2luayBub3QgaW5pdCIpOworICAgICAgICBBTE9HVigic2V0UHJlZmVycmVkRGV2aWNlOiBhdWRpbyBzaW5rIG5vdCBpbml0Iik7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICByZXR1cm4gbUF1ZGlvT3V0cHV0LT5zZXRPdXRwdXREZXZpY2UoZGV2aWNlSWQpOworICAgIHJldHVybiBtQXVkaW9PdXRwdXQtPnNldFByZWZlcnJlZERldmljZShkZXZpY2UpOwogfQogCi1hdWRpb19wb3J0X2hhbmRsZV90IE1lZGlhUGxheWVyMjo6Z2V0Um91dGVkRGV2aWNlSWQoKSB7Citqb2JqZWN0IE1lZGlhUGxheWVyMjo6Z2V0Um91dGVkRGV2aWNlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1BdWRpb091dHB1dCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJnZXRSb3V0ZWREZXZpY2VJZDogYXVkaW8gc2luayBub3QgaW5pdCIpOwotICAgICAgICByZXR1cm4gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICAgICAgQUxPR1YoImdldFJvdXRlZERldmljZTogYXVkaW8gc2luayBub3QgaW5pdCIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9Ci0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZDsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9PdXRwdXQtPmdldFJvdXRlZERldmljZUlkKCZkZXZpY2VJZCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKLSAgICB9Ci0gICAgcmV0dXJuIGRldmljZUlkOworICAgIHJldHVybiBtQXVkaW9PdXRwdXQtPmdldFJvdXRlZERldmljZSgpOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OmVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKSB7CitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCByb3V0aW5nRGVsZWdhdGUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtQXVkaW9PdXRwdXQgPT0gTlVMTCkgewogICAgICAgICBBTE9HVigiYWRkQXVkaW9EZXZpY2VDYWxsYmFjazogcGxheWVyIG5vdCBpbml0Iik7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICByZXR1cm4gbUF1ZGlvT3V0cHV0LT5lbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGVuYWJsZWQpOworICAgIHJldHVybiBtQXVkaW9PdXRwdXQtPmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2socm91dGluZ0RlbGVnYXRlKTsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3QgbGlzdGVuZXIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtQXVkaW9PdXRwdXQgPT0gTlVMTCkgeworICAgICAgICBBTE9HVigiYWRkQXVkaW9EZXZpY2VDYWxsYmFjazogcGxheWVyIG5vdCBpbml0Iik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUF1ZGlvT3V0cHV0LT5yZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGxpc3RlbmVyKTsKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9BbmRyb2lkLmJwCmluZGV4IDliM2FhZDIuLjcxY2Q1MGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0FuZHJvaWQuYnAKQEAgLTEsNiArMSw3IEBACiBjY19saWJyYXJ5X3N0YXRpYyB7CiAKICAgICBzcmNzOiBbCisgICAgICAgICJKTWVkaWFQbGF5ZXIyVXRpbHMuY3BwIiwKICAgICAgICAgIkpXYWtlTG9jay5jcHAiLAogICAgICAgICAiR2VuZXJpY1NvdXJjZTIuY3BwIiwKICAgICAgICAgIkhUVFBMaXZlU291cmNlMi5jcHAiLApAQCAtMjgsNiArMjksOCBAQAogICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzIiwKICAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcCIsCiAgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dCIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL25kayIsCisgICAgICAgICJmcmFtZXdvcmtzL2Jhc2UvY29yZS9qbmkiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKQEAgLTQ4LDEzICs1MSwxNSBAQAogICAgICAgICAibGlidWkiLAogICAgICAgICAibGliZ3VpIiwKICAgICAgICAgImxpYm1lZGlhIiwKLSAgICAgICAgImxpYm1lZGlhZHJtIiwKICAgICAgICAgImxpYm1lZGlhbmRrIiwKKyAgICAgICAgImxpYm1lZGlhbmRrX3V0aWxzIiwKICAgICAgICAgImxpYnBvd2VybWFuYWdlciIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAorICAgICAgICAibGlibWVkaWFwbGF5ZXIyLXByb3RvcyIsCisgICAgICAgICJsaWJtZWRpYTJfam5pX2NvcmUiLAogICAgIF0sCiAKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbnVwbGF5ZXIyIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvR2VuZXJpY1NvdXJjZTIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9HZW5lcmljU291cmNlMi5jcHAKaW5kZXggMTk2YjEwMy4uOTU1MjU4MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9HZW5lcmljU291cmNlMi5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9HZW5lcmljU291cmNlMi5jcHAKQEAgLTIxLDMwICsyMSwxOSBAQAogI2luY2x1ZGUgIk51UGxheWVyMkRybS5oIgogCiAjaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUJ1ZmZlckhvbGRlci5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL05ka1dyYXBwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNsb2NrLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9OZGtVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+Ci0jaW5jbHVkZSAiLi4vLi4vbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCIKLSNpbmNsdWRlICIuLi8uLi9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtODksOCArNzgsNiBAQAogdm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpyZXNldERhdGFTb3VyY2UoKSB7CiAgICAgQUxPR1YoInJlc2V0RGF0YVNvdXJjZSIpOwogCi0gICAgbUhUVFBTZXJ2aWNlLmNsZWFyKCk7Ci0gICAgbUh0dHBTb3VyY2UuY2xlYXIoKTsKICAgICBtRGlzY29ubmVjdGVkID0gZmFsc2U7CiAgICAgbVVyaS5jbGVhcigpOwogICAgIG1VcmlIZWFkZXJzLmNsZWFyKCk7CkBAIC0xMTAsNyArOTcsNiBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpzZXREYXRhU291cmNlKAotICAgICAgICBjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtMTE4LDcgKzEwNCw2IEBACiAKICAgICByZXNldERhdGFTb3VyY2UoKTsKIAotICAgIG1IVFRQU2VydmljZSA9IGh0dHBTZXJ2aWNlOwogICAgIG1VcmkgPSB1cmw7CiAKICAgICBpZiAoaGVhZGVycykgewpAQCAtMTUxLDcgKzEzNiw3IEBACiAgICAgQUxPR1YoInNldERhdGFTb3VyY2UgKHNvdXJjZTogJXApIiwgc291cmNlLmdldCgpKTsKIAogICAgIHJlc2V0RGF0YVNvdXJjZSgpOwotICAgIG1EYXRhU291cmNlID0gc291cmNlOworICAgIG1EYXRhU291cmNlV3JhcHBlciA9IG5ldyBBTWVkaWFEYXRhU291cmNlV3JhcHBlcihzb3VyY2UpOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMTYyLDI0ICsxNDcsMjEgQEAKIAogc3RhdHVzX3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6aW5pdEZyb21EYXRhU291cmNlKCkgewogICAgIG1FeHRyYWN0b3IgPSBuZXcgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcihBTWVkaWFFeHRyYWN0b3JfbmV3KCkpOwotICAgIENIRUNLKG1EYXRhU291cmNlICE9IE5VTEwgfHwgbUZkICE9IC0xKTsKLSAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0gbURhdGFTb3VyY2U7CisgICAgQ0hFQ0sobUZkID49MCB8fCBtRGF0YVNvdXJjZVdyYXBwZXIgIT0gTlVMTCk7CisgICAgc3A8QU1lZGlhRGF0YVNvdXJjZVdyYXBwZXI+IGFTb3VyY2VXcmFwcGVyID0gbURhdGFTb3VyY2VXcmFwcGVyOwogICAgIGNvbnN0IGludCBmZCA9IG1GZDsKLSAgICBjb25zdCBpbnQ2NF90IG9mZnNldCA9IG1PZmZzZXQ7Ci0gICAgY29uc3QgaW50NjRfdCBsZW5ndGggPSBtTGVuZ3RoOwogCiAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgLy8gVGhpcyBtaWdodCB0YWtlIGxvbmcgdGltZSBpZiBkYXRhIHNvdXJjZSBpcyBub3QgcmVsaWFibGUuCiAgICAgc3RhdHVzX3QgZXJyOwotICAgIGlmIChkYXRhU291cmNlICE9IG51bGxwdHIpIHsKLSAgICAgICAgbURhdGFTb3VyY2VXcmFwcGVyID0gbmV3IEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKGRhdGFTb3VyY2UpOwotICAgICAgICBlcnIgPSBtRXh0cmFjdG9yLT5zZXREYXRhU291cmNlKG1EYXRhU291cmNlV3JhcHBlci0+Z2V0QU1lZGlhRGF0YVNvdXJjZSgpKTsKKyAgICBpZiAoYVNvdXJjZVdyYXBwZXIgIT0gTlVMTCkgeworICAgICAgICBlcnIgPSBtRXh0cmFjdG9yLT5zZXREYXRhU291cmNlKGFTb3VyY2VXcmFwcGVyLT5nZXRBTWVkaWFEYXRhU291cmNlKCkpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGVyciA9IG1FeHRyYWN0b3ItPnNldERhdGFTb3VyY2UoZmQsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgZXJyID0gbUV4dHJhY3Rvci0+c2V0RGF0YVNvdXJjZShmZCwgbU9mZnNldCwgbUxlbmd0aCk7CiAgICAgfQogCiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBBTE9HRSgiaW5pdEZyb21EYXRhU291cmNlLCBmYWlsZWQgdG8gY3JlYXRlIGRhdGEgc291cmNlISIpOworICAgICAgICBBTE9HRSgiaW5pdEZyb21EYXRhU291cmNlLCBmYWlsZWQgdG8gc2V0IGV4dHJhY3RvciBkYXRhIHNvdXJjZSEiKTsKICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CkBAIC0xOTEsMTAgKzE3Myw4IEBACiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAotICAgIG1Mb2NrLmxvY2soKTsKLSAgICBtRmQgPSAtMTsKLSAgICBtRGF0YVNvdXJjZSA9IGRhdGFTb3VyY2U7CiAgICAgbUZpbGVNZXRhID0gY29udmVydE1lZGlhRm9ybWF0V3JhcHBlclRvTWV0YURhdGEobUV4dHJhY3Rvci0+Z2V0Rm9ybWF0KCkpOworICAgIG1Mb2NrLmxvY2soKTsKICAgICBpZiAobUZpbGVNZXRhICE9IE5VTEwpIHsKICAgICAgICAgaW50NjRfdCBkdXJhdGlvbjsKICAgICAgICAgaWYgKG1GaWxlTWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uKSkgewpAQCAtMjE1LDEwICsxOTUsMTAgQEAKICAgICAgICAgfQogCiAgICAgICAgIHNwPEFNZWRpYUV4dHJhY3RvcldyYXBwZXI+IHRyYWNrRXh0cmFjdG9yID0gbmV3IEFNZWRpYUV4dHJhY3RvcldyYXBwZXIoQU1lZGlhRXh0cmFjdG9yX25ldygpKTsKLSAgICAgICAgaWYgKG1EYXRhU291cmNlV3JhcHBlciAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBlcnIgPSB0cmFja0V4dHJhY3Rvci0+c2V0RGF0YVNvdXJjZShtRGF0YVNvdXJjZVdyYXBwZXItPmdldEFNZWRpYURhdGFTb3VyY2UoKSk7CisgICAgICAgIGlmIChhU291cmNlV3JhcHBlciAhPSBOVUxMKSB7CisgICAgICAgICAgICB0cmFja0V4dHJhY3Rvci0+c2V0RGF0YVNvdXJjZShhU291cmNlV3JhcHBlci0+Z2V0QU1lZGlhRGF0YVNvdXJjZSgpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVyciA9IHRyYWNrRXh0cmFjdG9yLT5zZXREYXRhU291cmNlKGZkLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICAgICAgICB0cmFja0V4dHJhY3Rvci0+c2V0RGF0YVNvdXJjZShmZCwgbU9mZnNldCwgbUxlbmd0aCk7CiAgICAgICAgIH0KIAogICAgICAgICBjb25zdCBjaGFyICptaW1lOwpAQCAtMzMwLDE5ICszMTAsMTkgQEAKICAgICAgICAgbUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIoaWQoKSk7CiAgICAgICAgIG1Mb29wZXItPnN0b3AoKTsKICAgICB9Ci0gICAgaWYgKG1EYXRhU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgbURhdGFTb3VyY2UtPmNsb3NlKCk7CisgICAgaWYgKG1EYXRhU291cmNlV3JhcHBlciAhPSBOVUxMKSB7CisgICAgICAgIG1EYXRhU291cmNlV3JhcHBlci0+Y2xvc2UoKTsKICAgICB9CiAgICAgcmVzZXREYXRhU291cmNlKCk7CiB9CiAKLXZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6cHJlcGFyZUFzeW5jKCkgewordm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpwcmVwYXJlQXN5bmMoaW50NjRfdCBzdGFydFRpbWVVcykgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQUxPR1YoInByZXBhcmVBc3luYzogKGxvb3BlcjogJWQpIiwgKG1Mb29wZXIgIT0gTlVMTCkpOwogCiAgICAgaWYgKG1Mb29wZXIgPT0gTlVMTCkgewogICAgICAgICBtTG9vcGVyID0gbmV3IEFMb29wZXI7Ci0gICAgICAgIG1Mb29wZXItPnNldE5hbWUoImdlbmVyaWMiKTsKKyAgICAgICAgbUxvb3Blci0+c2V0TmFtZSgiZ2VuZXJpYzIiKTsKICAgICAgICAgbUxvb3Blci0+c3RhcnQoZmFsc2UsIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLwogICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAgLyogY2FuQ2FsbEphdmEgKi8KICAgICAgICAgICAgICAgICAgICAgICAgUFJJT1JJVFlfREVGQVVMVCk7CkBAIC0zNTEsNTkgKzMzMSw0NSBAQAogICAgIH0KIAogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQcmVwYXJlQXN5bmMsIHRoaXMpOworICAgIG1zZy0+c2V0SW50NjQoInN0YXJ0VGltZVVzIiwgc3RhcnRUaW1lVXMpOworCiAgICAgbXNnLT5wb3N0KCk7CiB9CiAKLXZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6b25QcmVwYXJlQXN5bmMoKSB7Ci0gICAgQUxPR1YoIm9uUHJlcGFyZUFzeW5jOiBtRGF0YVNvdXJjZTogJWQiLCAobURhdGFTb3VyY2UgIT0gTlVMTCkpOwordm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpvblByZXBhcmVBc3luYyhpbnQ2NF90IHN0YXJ0VGltZVVzKSB7CisgICAgQUxPR1YoIm9uUHJlcGFyZUFzeW5jOiBtRmQgJWQgbVVyaSAlcyBtRGF0YVNvdXJjZVdyYXBwZXI6ICVwIiwKKyAgICAgICAgICAgIG1GZCwgbVVyaS5jX3N0cigpLCBtRGF0YVNvdXJjZVdyYXBwZXIuZ2V0KCkpOwogCi0gICAgLy8gZGVsYXllZCBkYXRhIHNvdXJjZSBjcmVhdGlvbgotICAgIGlmIChtRGF0YVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIC8vIHNldCB0byBmYWxzZSBmaXJzdCwgaWYgdGhlIGV4dHJhY3RvcgotICAgICAgICAvLyBjb21lcyBiYWNrIGFzIHNlY3VyZSwgc2V0IGl0IHRvIHRydWUgdGhlbi4KLSAgICAgICAgbUlzU2VjdXJlID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKCFtVXJpLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVyaSA9IG1VcmkuY19zdHIoKTsKLSAgICAgICAgICAgIFN0cmluZzggY29udGVudFR5cGU7Ci0KLSAgICAgICAgICAgIGlmICghc3RybmNhc2VjbXAoImh0dHA6Ly8iLCB1cmksIDcpIHx8ICFzdHJuY2FzZWNtcCgiaHR0cHM6Ly8iLCB1cmksIDgpKSB7Ci0gICAgICAgICAgICAgICAgbUh0dHBTb3VyY2UgPSBEYXRhU291cmNlRmFjdG9yeTo6Q3JlYXRlTWVkaWFIVFRQKG1IVFRQU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1IdHRwU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgaHR0cCBzb3VyY2UhIik7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChVTktOT1dOX0VSUk9SKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAvLyBUaGlzIG1pZ2h0IHRha2UgbG9uZyB0aW1lIGlmIGNvbm5lY3Rpb24gaGFzIHNvbWUgaXNzdWUuCi0gICAgICAgICAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0gRGF0YVNvdXJjZUZhY3Rvcnk6OkNyZWF0ZUZyb21VUkkoCi0gICAgICAgICAgICAgICAgICAgbUhUVFBTZXJ2aWNlLCB1cmksICZtVXJpSGVhZGVycywgJmNvbnRlbnRUeXBlLAotICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUVFBCYXNlICo+KG1IdHRwU291cmNlLmdldCgpKSk7Ci0gICAgICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgICAgICAgICBpZiAoIW1EaXNjb25uZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZSA9IGRhdGFTb3VyY2U7Ci0gICAgICAgICAgICB9CisgICAgaWYgKCFtVXJpLmVtcHR5KCkpIHsKKyAgICAgICAgY29uc3QgY2hhciogdXJpID0gbVVyaS5jX3N0cigpOworICAgICAgICBzaXplX3QgbnVtaGVhZGVycyA9IG1VcmlIZWFkZXJzLnNpemUoKTsKKyAgICAgICAgY29uc3QgY2hhciAqKmtleV92YWx1ZXMgPSBudW1oZWFkZXJzID8gbmV3IGNvbnN0IGNoYXIgKltudW1oZWFkZXJzICogMl0gOiBOVUxMOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bWhlYWRlcnM7ICsraSkgeworICAgICAgICAgICAga2V5X3ZhbHVlc1tpICogMl0gPSBtVXJpSGVhZGVycy5rZXlBdChpKS5jX3N0cigpOworICAgICAgICAgICAga2V5X3ZhbHVlc1tpICogMiArIDFdID0gIG1VcmlIZWFkZXJzLnZhbHVlQXQoaSkuY19zdHIoKTsKICAgICAgICAgfQotCi0gICAgICAgIGlmIChtRmQgPT0gLTEgJiYgbURhdGFTb3VyY2UgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgZGF0YSBzb3VyY2UhIik7Ci0gICAgICAgICAgICBub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoVU5LTk9XTl9FUlJPUik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgIEFNZWRpYURhdGFTb3VyY2UgKmFTb3VyY2UgPSBBTWVkaWFEYXRhU291cmNlX25ld1VyaSh1cmksIG51bWhlYWRlcnMsIGtleV92YWx1ZXMpOworICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgIG1EYXRhU291cmNlV3JhcHBlciA9IGFTb3VyY2UgPyBuZXcgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoYVNvdXJjZSkgOiBOVUxMOworICAgICAgICBkZWxldGVbXSBrZXlfdmFsdWVzOworICAgICAgICAvLyBGb3IgY2FjaGVkIHN0cmVhbWluZyBjYXNlcywgd2UgbmVlZCB0byB3YWl0IGZvciBlbm91Z2gKKyAgICAgICAgLy8gYnVmZmVyaW5nIGJlZm9yZSByZXBvcnRpbmcgcHJlcGFyZWQuCisgICAgICAgIG1Jc1N0cmVhbWluZyA9ICFzdHJuY2FzZWNtcCgiaHR0cDovLyIsIHVyaSwgNykgfHwgIXN0cm5jYXNlY21wKCJodHRwczovLyIsIHVyaSwgOCk7CiAgICAgfQogCi0gICAgaWYgKG1EYXRhU291cmNlICE9IG51bGxwdHIgJiYgbURhdGFTb3VyY2UtPmZsYWdzKCkgJiBEYXRhU291cmNlOjprSXNDYWNoaW5nRGF0YVNvdXJjZSkgewotICAgICAgICBtQ2FjaGVkU291cmNlID0gc3RhdGljX2Nhc3Q8TnVDYWNoZWRTb3VyY2UyICo+KG1EYXRhU291cmNlLmdldCgpKTsKKyAgICBpZiAobURpc2Nvbm5lY3RlZCB8fCAobUZkIDwgMCAmJiBtRGF0YVNvdXJjZVdyYXBwZXIgPT0gTlVMTCkpIHsKKyAgICAgICAgQUxPR0UoIm1EaXNjb25uZWN0ZWQoJWQpIG9yIEZhaWxlZCB0byBjcmVhdGUgZGF0YSBzb3VyY2UhIiwgbURpc2Nvbm5lY3RlZCk7CisgICAgICAgIG5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChVTktOT1dOX0VSUk9SKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIC8vIEZvciBjYWNoZWQgc3RyZWFtaW5nIGNhc2VzLCB3ZSBuZWVkIHRvIHdhaXQgZm9yIGVub3VnaAotICAgIC8vIGJ1ZmZlcmluZyBiZWZvcmUgcmVwb3J0aW5nIHByZXBhcmVkLgotICAgIG1Jc1N0cmVhbWluZyA9IChtQ2FjaGVkU291cmNlICE9IE5VTEwpOwotCiAgICAgLy8gaW5pdCBleHRyYWN0b3IgZnJvbSBkYXRhIHNvdXJjZQogICAgIHN0YXR1c190IGVyciA9IGluaXRGcm9tRGF0YVNvdXJjZSgpOworICAgIGlmIChtRmQgPj0gMCkgeworICAgICAgICBjbG9zZShtRmQpOworICAgICAgICBtRmQgPSAtMTsKKyAgICB9CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdCBmcm9tIGRhdGEgc291cmNlISIpOwpAQCAtNDMwLDYgKzM5Niw3IEBACiAgICAgICAgICAgICBGTEFHX0NBTl9TRUVLX0ZPUldBUkQgfAogICAgICAgICAgICAgRkxBR19DQU5fU0VFSyk7CiAKKyAgICBkb1NlZWsoc3RhcnRUaW1lVXMsIE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX0NMT1NFU1QpOwogICAgIGZpbmlzaFByZXBhcmVBc3luYygpOwogCiAgICAgQUxPR1YoIm9uUHJlcGFyZUFzeW5jOiBEb25lIik7CkBAIC00MzksOCArNDA2LDggQEAKICAgICBBTE9HVigiZmluaXNoUHJlcGFyZUFzeW5jIik7CiAKICAgICBpZiAobUlzU3RyZWFtaW5nKSB7Ci0gICAgICAgIG1DYWNoZWRTb3VyY2UtPnJlc3VtZUZldGNoaW5nSWZOZWNlc3NhcnkoKTsKICAgICAgICAgbVByZXBhcmluZyA9IHRydWU7CisgICAgICAgICsrbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uOwogICAgICAgICBzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKTsKICAgICB9IGVsc2UgewogICAgICAgICBub3RpZnlQcmVwYXJlZCgpOwpAQCAtNDU3LDkgKzQyNCw3IEBACiAKIHZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6bm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKHN0YXR1c190IGVycikgewogICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgbURhdGFTb3VyY2UuY2xlYXIoKTsKLSAgICAgICAgbUNhY2hlZFNvdXJjZS5jbGVhcigpOwotICAgICAgICBtSHR0cFNvdXJjZS5jbGVhcigpOworICAgICAgICBtRGF0YVNvdXJjZVdyYXBwZXIuY2xlYXIoKTsKIAogICAgICAgICBtQml0cmF0ZSA9IC0xOwogICAgICAgICBtUHJldkJ1ZmZlclBlcmNlbnRhZ2UgPSAtMTsKQEAgLTQ5OSw1MyArNDY0LDI3IEBACiB9CiAKIHZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6ZGlzY29ubmVjdCgpIHsKLSAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlLCBodHRwU291cmNlOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgZGF0YVNvdXJjZSA9IG1EYXRhU291cmNlOwotICAgICAgICBodHRwU291cmNlID0gbUh0dHBTb3VyY2U7CiAgICAgICAgIG1EaXNjb25uZWN0ZWQgPSB0cnVlOwogICAgIH0KLQotICAgIGlmIChkYXRhU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgLy8gZGlzY29ubmVjdCBkYXRhIHNvdXJjZQotICAgICAgICBpZiAoZGF0YVNvdXJjZS0+ZmxhZ3MoKSAmIERhdGFTb3VyY2U6OmtJc0NhY2hpbmdEYXRhU291cmNlKSB7Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxOdUNhY2hlZFNvdXJjZTIgKj4oZGF0YVNvdXJjZS5nZXQoKSktPmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoaHR0cFNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIHN0YXRpY19jYXN0PEhUVFBCYXNlICo+KGh0dHBTb3VyY2UuZ2V0KCkpLT5kaXNjb25uZWN0KCk7CisgICAgaWYgKG1EYXRhU291cmNlV3JhcHBlciAhPSBOVUxMKSB7CisgICAgICAgIG1EYXRhU291cmNlV3JhcHBlci0+Y2xvc2UoKTsKICAgICB9Ci0KLSAgICBtRGF0YVNvdXJjZVdyYXBwZXIgPSBOVUxMOwotCiB9CiAKIHN0YXR1c190IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OmZlZWRNb3JlVFNEYXRhKCkgewogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpzZW5kQ2FjaGVTdGF0cygpIHsKLSAgICBpbnQzMl90IGticHMgPSAwOwotICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7Ci0KLSAgICBpZiAobUNhY2hlZFNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIGVyciA9IG1DYWNoZWRTb3VyY2UtPmdldEVzdGltYXRlZEJhbmR3aWR0aEticHMoJmticHMpOwotICAgIH0KLQotICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOwotICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRDYWNoZVN0YXRzKTsKLSAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiYmFuZHdpZHRoIiwga2Jwcyk7Ci0gICAgICAgIG5vdGlmeS0+cG9zdCgpOwotICAgIH0KLX0KLQogdm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgewogICAgICAgY2FzZSBrV2hhdFByZXBhcmVBc3luYzoKICAgICAgIHsKLSAgICAgICAgICBvblByZXBhcmVBc3luYygpOworICAgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lVXM7CisgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInN0YXJ0VGltZVVzIiwgJnN0YXJ0VGltZVVzKSk7CisgICAgICAgICAgb25QcmVwYXJlQXN5bmMoc3RhcnRUaW1lVXMpOwogICAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgY2FzZSBrV2hhdEZldGNoU3VidGl0bGVEYXRhOgpAQCAtODM1LDggKzc3NCw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodHJhY2stPm1QYWNrZXRzLT5nZXRBdmFpbGFibGVCdWZmZXJDb3VudCgmZmluYWxSZXN1bHQpIDwgMgogICAgICAgICAgICAgICAgICYmICFtU2VudFBhdXNlT25CdWZmZXJpbmcgJiYgIW1QcmVwYXJpbmcpIHsKLSAgICAgICAgICAgICAgICBtQ2FjaGVkU291cmNlLT5yZXN1bWVGZXRjaGluZ0lmTmVjZXNzYXJ5KCk7Ci0gICAgICAgICAgICAgICAgc2VuZENhY2hlU3RhdHMoKTsKICAgICAgICAgICAgICAgICBtU2VudFBhdXNlT25CdWZmZXJpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRQYXVzZU9uQnVmZmVyaW5nU3RhcnQpOwpAQCAtMTM0OSw2ICsxMjg2LDExIEBACiAgICAgICAgICAgICBtVmlkZW9UaW1lVXMgPSB0aW1lVXM7CiAgICAgICAgIH0KIAorICAgICAgICBzcDxBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyPiBjcnlwdEluZm8gPSBleHRyYWN0b3ItPmdldFNhbXBsZUNyeXB0b0luZm8oKTsKKyAgICAgICAgaWYgKGNyeXB0SW5mbyAhPSBOVUxMKSB7CisgICAgICAgICAgICBtZXRhLT5zZXRPYmplY3QoImNyeXB0SW5mbyIsIGNyeXB0SW5mbyk7CisgICAgICAgIH0KKwogICAgICAgICBxdWV1ZURpc2NvbnRpbnVpdHlJZk5lZWRlZChzZWVraW5nLCBmb3JtYXRDaGFuZ2UsIHRyYWNrVHlwZSwgdHJhY2spOwogCiAgICAgICAgIGlmIChudW1CdWZmZXJzID09IDAgJiYgYWN0dWFsVGltZVVzICE9IG51bGxwdHIpIHsKQEAgLTEzOTIsNyArMTMzNCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlQcmVwYXJlZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgbVByZXBhcmluZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VuZENhY2hlU3RhdHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1TZW50UGF1c2VPbkJ1ZmZlcmluZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0UmVzdW1lT25CdWZmZXJpbmdFbmQpOwpAQCAtMTQ0NCw0NyArMTM4NSwzMSBAQAogfQogCiB2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UG9sbEJ1ZmZlcmluZywgdGhpcyk7Ci0gICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1Qb2xsQnVmZmVyaW5nR2VuZXJhdGlvbik7Ci0gICAgLy8gRW5xdWlyZXMgYnVmZmVyaW5nIHN0YXR1cyBldmVyeSBzZWNvbmQuCi0gICAgbXNnLT5wb3N0KDEwMDAwMDBsbCk7CisgICAgaWYgKG1Jc1N0cmVhbWluZykgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UG9sbEJ1ZmZlcmluZywgdGhpcyk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb24pOworICAgICAgICAvLyBFbnF1aXJlcyBidWZmZXJpbmcgc3RhdHVzIGV2ZXJ5IHNlY29uZC4KKyAgICAgICAgbXNnLT5wb3N0KDEwMDAwMDBsbCk7CisgICAgfQogfQogCiB2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6Om9uUG9sbEJ1ZmZlcmluZygpIHsKLSAgICBzdGF0dXNfdCBmaW5hbFN0YXR1cyA9IFVOS05PV05fRVJST1I7CiAgICAgaW50NjRfdCBjYWNoZWREdXJhdGlvblVzID0gLTFsbDsKLSAgICBzc2l6ZV90IGNhY2hlZERhdGFSZW1haW5pbmcgPSAtMTsKIAotICAgIGlmIChtQ2FjaGVkU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgY2FjaGVkRGF0YVJlbWFpbmluZyA9IG1DYWNoZWRTb3VyY2UtPmFwcHJveERhdGFSZW1haW5pbmcoJmZpbmFsU3RhdHVzKTsKLQotICAgICAgICBpZiAoZmluYWxTdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgIG9mZjY0X3Qgc2l6ZTsKLSAgICAgICAgICAgIGludDY0X3QgYml0cmF0ZSA9IDBsbDsKLSAgICAgICAgICAgIGlmIChtRHVyYXRpb25VcyA+IDAgJiYgbUNhY2hlZFNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSkgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAvLyB8Yml0cmF0ZXwgdXNlcyBiaXRzL3NlY29uZCB1bml0LCB3aGlsZSBzaXplIGlzIG51bWJlciBvZiBieXRlcy4KLSAgICAgICAgICAgICAgICBiaXRyYXRlID0gc2l6ZSAqIDgwMDAwMDBsbCAvIG1EdXJhdGlvblVzOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtQml0cmF0ZSA+IDApIHsKLSAgICAgICAgICAgICAgICBiaXRyYXRlID0gbUJpdHJhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYml0cmF0ZSA+IDApIHsKLSAgICAgICAgICAgICAgICBjYWNoZWREdXJhdGlvblVzID0gY2FjaGVkRGF0YVJlbWFpbmluZyAqIDgwMDAwMDBsbCAvIGJpdHJhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICBzcDxBTWVkaWFFeHRyYWN0b3JXcmFwcGVyPiBleHRyYWN0b3I7CisgICAgaWYgKG1WaWRlb1RyYWNrLm1FeHRyYWN0b3IgIT0gTlVMTCkgeworICAgICAgICBleHRyYWN0b3IgPSBtVmlkZW9UcmFjay5tRXh0cmFjdG9yOworICAgIH0gZWxzZSBpZiAobUF1ZGlvVHJhY2subUV4dHJhY3RvciAhPSBOVUxMKSB7CisgICAgICAgIGV4dHJhY3RvciA9IG1BdWRpb1RyYWNrLm1FeHRyYWN0b3I7CiAgICAgfQogCi0gICAgaWYgKGZpbmFsU3RhdHVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dWKCJvblBvbGxCdWZmZXJpbmc6IEVPUyAoZmluYWxTdGF0dXMgPSAlZCkiLCBmaW5hbFN0YXR1cyk7Ci0KLSAgICAgICAgaWYgKGZpbmFsU3RhdHVzID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgICAgIG5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZSgxMDApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuOworICAgIGlmIChleHRyYWN0b3IgIT0gTlVMTCkgeworICAgICAgICBjYWNoZWREdXJhdGlvblVzID0gZXh0cmFjdG9yLT5nZXRDYWNoZWREdXJhdGlvbigpOwogICAgIH0KIAogICAgIGlmIChjYWNoZWREdXJhdGlvblVzID49IDBsbCkgewotICAgICAgICBpZiAobUR1cmF0aW9uVXMgPiAwbGwpIHsKKyAgICAgICAgc3NpemVfdCBzYW1wbGVTaXplID0gZXh0cmFjdG9yLT5nZXRTYW1wbGVTaXplKCk7CisgICAgICAgIGlmIChzYW1wbGVTaXplID49IDBsbCkgewogICAgICAgICAgICAgaW50NjRfdCBjYWNoZWRQb3NVcyA9IGdldExhc3RSZWFkUG9zaXRpb24oKSArIGNhY2hlZER1cmF0aW9uVXM7CiAgICAgICAgICAgICBpbnQgcGVyY2VudGFnZSA9IDEwMC4wICogY2FjaGVkUG9zVXMgLyBtRHVyYXRpb25VczsKICAgICAgICAgICAgIGlmIChwZXJjZW50YWdlID4gMTAwKSB7CkBAIC0xNDkyLDkgKzE0MTcsMTEgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbm90aWZ5QnVmZmVyaW5nVXBkYXRlKHBlcmNlbnRhZ2UpOworICAgICAgICAgICAgQUxPR1YoIm9uUG9sbEJ1ZmZlcmluZzogY2FjaGVkRHVyYXRpb25VcyAlLjFmIHNlYyIsIGNhY2hlZER1cmF0aW9uVXMgLyAxMDAwMDAwLjBmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZSgxMDApOworICAgICAgICAgICAgQUxPR1YoIm9uUG9sbEJ1ZmZlcmluZzogRU9TIik7CiAgICAgICAgIH0KLQotICAgICAgICBBTE9HVigib25Qb2xsQnVmZmVyaW5nOiBjYWNoZWREdXJhdGlvblVzICUuMWYgc2VjIiwgY2FjaGVkRHVyYXRpb25VcyAvIDEwMDAwMDAuMGYpOwogICAgIH0KIAogICAgIHNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpOwpAQCAtMTU5MSwxNSArMTUxOCwyMCBAQAogICAgICAgICByZXR1cm4gT0s7IC8vIHNvdXJjZSB3aXRob3V0IERSTSBpbmZvCiAgICAgfQogCi0gICAgc3A8QUJ1ZmZlcj4gZHJtSW5mb0J1ZmZlciA9IE51UGxheWVyMkRybTo6cmV0cmlldmVEcm1JbmZvKHBzc2hJbmZvKTsKLSAgICBBTE9HVigiY2hlY2tEcm1JbmZvOiBNRURJQV9EUk1fSU5GTyBQU1NIIGRybSBpbmZvIHNpemU6ICVkIiwgKGludClkcm1JbmZvQnVmZmVyLT5zaXplKCkpOworICAgIFBsYXllck1lc3NhZ2UgcGxheWVyTXNnOworICAgIHN0YXR1c190IHJldCA9IE51UGxheWVyMkRybTo6cmV0cmlldmVEcm1JbmZvKHBzc2hJbmZvLCAmcGxheWVyTXNnKTsKKyAgICBBTE9HVigiY2hlY2tEcm1JbmZvOiBNRURJQV9EUk1fSU5GTyBQU1NIIGRybSBpbmZvIHNpemU6ICVkIiwgKGludClwbGF5ZXJNc2cuQnl0ZVNpemUoKSk7CiAKLSAgICBpZiAoZHJtSW5mb0J1ZmZlci0+c2l6ZSgpID09IDApIHsKLSAgICAgICAgQUxPR0UoImNoZWNrRHJtSW5mbzogVW5leHBlY3RlZCBwYXJjZWwgc2l6ZTogMCIpOworICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImNoZWNrRHJtSW5mbzogZmFpbGVkIHRvIHJldHJpdmUgRHJtSW5mbyAlZCIsIHJldCk7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAotICAgIG5vdGlmeURybUluZm8oZHJtSW5mb0J1ZmZlcik7CisgICAgaW50IHNpemUgPSBwbGF5ZXJNc2cuQnl0ZVNpemUoKTsKKyAgICBzcDxBQnVmZmVyPiBkcm1JbmZvQnVmID0gbmV3IEFCdWZmZXIoc2l6ZSk7CisgICAgcGxheWVyTXNnLlNlcmlhbGl6ZVRvQXJyYXkoZHJtSW5mb0J1Zi0+ZGF0YSgpLCBzaXplKTsKKyAgICBkcm1JbmZvQnVmLT5zZXRSYW5nZSgwLCBzaXplKTsKKyAgICBub3RpZnlEcm1JbmZvKGRybUluZm9CdWYpOwogCiAgICAgcmV0dXJuIE9LOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9HZW5lcmljU291cmNlMi5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9HZW5lcmljU291cmNlMi5oCmluZGV4IDliYzUxODIuLmFkZTFhYTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvR2VuZXJpY1NvdXJjZTIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0dlbmVyaWNTb3VyY2UyLmgKQEAgLTM3LDExICszNyw5IEBACiBjbGFzcyBEYXRhU291cmNlOwogY2xhc3MgSURhdGFTb3VyY2U7CiBjbGFzcyBJTWVkaWFTb3VyY2U7Ci1zdHJ1Y3QgTWVkaWFIVFRQU2VydmljZTsKIHN0cnVjdCBNZWRpYVNvdXJjZTsKIGNsYXNzIE1lZGlhQnVmZmVyOwogc3RydWN0IE1lZGlhQ2xvY2s7Ci1zdHJ1Y3QgTnVDYWNoZWRTb3VyY2UyOwogCiBzdHJ1Y3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMiA6IHB1YmxpYyBOdVBsYXllcjI6OlNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE1lZGlhQnVmZmVyT2JzZXJ2ZXIgLy8gTW9kdWxhciBEUk0KQEAgLTUwLDcgKzQ4LDYgQEAKICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiAmbWVkaWFDbG9jayk7CiAKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKAotICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCkBAIC02Miw3ICs1OSw3IEBACiAgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUFzeW5jKCk7CisgICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYyhpbnQ2NF90IHN0YXJ0VGltZVVzKTsKIAogICAgIHZpcnR1YWwgdm9pZCBzdGFydCgpOwogICAgIHZpcnR1YWwgdm9pZCBzdG9wKCk7CkBAIC0xNTEsNyArMTQ4LDYgQEAKICAgICBib29sIG1Jc1N0cmVhbWluZzsKICAgICB1aWRfdCBtVUlEOwogICAgIGNvbnN0IHNwPE1lZGlhQ2xvY2s+IG1NZWRpYUNsb2NrOwotICAgIHNwPE1lZGlhSFRUUFNlcnZpY2U+IG1IVFRQU2VydmljZTsKICAgICBBU3RyaW5nIG1Vcmk7CiAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbVVyaUhlYWRlcnM7CiAgICAgaW50IG1GZDsKQEAgLTE1OSw5ICsxNTUsNiBAQAogICAgIGludDY0X3QgbUxlbmd0aDsKIAogICAgIGJvb2wgbURpc2Nvbm5lY3RlZDsKLSAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKLSAgICBzcDxOdUNhY2hlZFNvdXJjZTI+IG1DYWNoZWRTb3VyY2U7Ci0gICAgc3A8RGF0YVNvdXJjZT4gbUh0dHBTb3VyY2U7CiAgICAgc3A8TWV0YURhdGE+IG1GaWxlTWV0YTsKICAgICBzcDxBTWVkaWFEYXRhU291cmNlV3JhcHBlcj4gbURhdGFTb3VyY2VXcmFwcGVyOwogICAgIHNwPEFNZWRpYUV4dHJhY3RvcldyYXBwZXI+IG1FeHRyYWN0b3I7CkBAIC0xOTQsNyArMTg3LDcgQEAKICAgICB2b2lkIG9uU2Vlayhjb25zdCBzcDxBTWVzc2FnZT4mIG1zZyk7CiAgICAgc3RhdHVzX3QgZG9TZWVrKGludDY0X3Qgc2Vla1RpbWVVcywgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSk7CiAKLSAgICB2b2lkIG9uUHJlcGFyZUFzeW5jKCk7CisgICAgdm9pZCBvblByZXBhcmVBc3luYyhpbnQ2NF90IHN0YXJ0VGltZVVzKTsKIAogICAgIHZvaWQgZmV0Y2hUZXh0RGF0YSgKICAgICAgICAgICAgIHVpbnQzMl90IHdoYXQsIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSwKQEAgLTIzMiw4ICsyMjUsNiBAQAogICAgIHZvaWQgb25Qb2xsQnVmZmVyaW5nKCk7CiAgICAgdm9pZCBub3RpZnlCdWZmZXJpbmdVcGRhdGUoaW50MzJfdCBwZXJjZW50YWdlKTsKIAotICAgIHZvaWQgc2VuZENhY2hlU3RhdHMoKTsKLQogICAgIHNwPEFNZXNzYWdlPiBnZXRGb3JtYXRfbChib29sIGF1ZGlvKTsKICAgICBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0TWV0YV9sKGJvb2wgYXVkaW8pOwogICAgIGludDMyX3QgZ2V0RGF0YUdlbmVyYXRpb24obWVkaWFfdHJhY2tfdHlwZSB0eXBlKSBjb25zdDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSFRUUExpdmVTb3VyY2UyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSFRUUExpdmVTb3VyY2UyLmNwcAppbmRleCA4ZWRiY2JmLi5lNTM5MDBiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0hUVFBMaXZlU291cmNlMi5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9IVFRQTGl2ZVNvdXJjZTIuY3BwCkBAIC05OSwxMCArOTksMTEgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgTnVQbGF5ZXIyOjpIVFRQTGl2ZVNvdXJjZTI6OnByZXBhcmVBc3luYygpIHsKKy8vIFRPRE86IGZldGNoIGRhdGEgc3RhcnRpbmcgZnJvbSB8c3RhcnRUaW1lVXN8Cit2b2lkIE51UGxheWVyMjo6SFRUUExpdmVTb3VyY2UyOjpwcmVwYXJlQXN5bmMoaW50NjRfdCAvKiBzdGFydFRpbWVVcyAqLykgewogICAgIGlmIChtTGl2ZUxvb3BlciA9PSBOVUxMKSB7CiAgICAgICAgIG1MaXZlTG9vcGVyID0gbmV3IEFMb29wZXI7Ci0gICAgICAgIG1MaXZlTG9vcGVyLT5zZXROYW1lKCJodHRwIGxpdmUiKTsKKyAgICAgICAgbUxpdmVMb29wZXItPnNldE5hbWUoImh0dHAgbGl2ZTIiKTsKICAgICAgICAgbUxpdmVMb29wZXItPnN0YXJ0KGZhbHNlLCAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogY2FuQ2FsbEphdmEgKi8pOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0hUVFBMaXZlU291cmNlMi5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9IVFRQTGl2ZVNvdXJjZTIuaAppbmRleCA5N2QzNjUzLi44ZmM3MWUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0hUVFBMaXZlU291cmNlMi5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSFRUUExpdmVTb3VyY2UyLmgKQEAgLTM4LDcgKzM4LDcgQEAKICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUFzeW5jKGludDY0X3Qgc3RhcnRUaW1lVXMpOwogICAgIHZpcnR1YWwgdm9pZCBzdGFydCgpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZXF1ZXVlQWNjZXNzVW5pdChib29sIGF1ZGlvLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pNZWRpYVBsYXllcjJVdGlscy5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pNZWRpYVBsYXllcjJVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJkMjJiYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSk1lZGlhUGxheWVyMlV0aWxzLmNwcApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkpNZWRpYVBsYXllcjJVdGlscyIKKworI2luY2x1ZGUgIkpNZWRpYVBsYXllcjJVdGlscy5oIgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KYXZhVk1IZWxwZXIuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisjaW5jbHVkZSA8bmF0aXZlaGVscGVyL0pOSUhlbHAuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgImxvZy9sb2cuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3QgaW50NjRfdCBrT2ZmbG9hZE1pbkR1cmF0aW9uU2VjID0gNjA7CisKKy8vIHN0YXRpYworYm9vbCBKTWVkaWFQbGF5ZXIyVXRpbHM6OmlzT2ZmbG9hZGVkQXVkaW9QbGF5YmFja1N1cHBvcnRlZCgKKyAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLCBib29sIGhhc1ZpZGVvLCBib29sIGlzU3RyZWFtaW5nLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpCit7CisgICAgaWYgKGhhc1ZpZGVvIHx8IHN0cmVhbVR5cGUgIT0gQVVESU9fU1RSRUFNX01VU0lDKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBhdWRpb19vZmZsb2FkX2luZm9fdCBpbmZvID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKKyAgICBpZiAoT0sgIT0gZ2V0QXVkaW9PZmZsb2FkSW5mbyhtZXRhLCBoYXNWaWRlbywgaXNTdHJlYW1pbmcsIHN0cmVhbVR5cGUsICZpbmZvKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGluZm8uZHVyYXRpb25fdXMgPCBrT2ZmbG9hZE1pbkR1cmF0aW9uU2VjICogMTAwMDAwMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50MzJfdCBhdWRpb0Zvcm1hdCA9IGF1ZGlvRm9ybWF0RnJvbU5hdGl2ZShpbmZvLmZvcm1hdCk7CisgICAgaW50MzJfdCBjaGFubmVsTWFzayA9IG91dENoYW5uZWxNYXNrRnJvbU5hdGl2ZShpbmZvLmNoYW5uZWxfbWFzayk7CisgICAgaWYgKGF1ZGlvRm9ybWF0ID09IEVOQ09ESU5HX0lOVkFMSUQgfHwgY2hhbm5lbE1hc2sgPT0gQ0hBTk5FTF9JTlZBTElEKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBKTklFbnYqIGVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgamNsYXNzIGpNUDJVdGlsc0NscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL01lZGlhUGxheWVyMlV0aWxzIik7CisgICAgam1ldGhvZElEIGpTZXRBdWRpb091dHB1dERldmljZUJ5SWQgPSBlbnYtPkdldFN0YXRpY01ldGhvZElEKAorICAgICAgICAgICAgak1QMlV0aWxzQ2xzLCAiaXNPZmZsb2FkZWRBdWRpb1BsYXliYWNrU3VwcG9ydGVkIiwgIihJSUkpWiIpOworICAgIGpib29sZWFuIHJlc3VsdCA9IGVudi0+Q2FsbFN0YXRpY0Jvb2xlYW5NZXRob2QoCisgICAgICAgICAgICBqTVAyVXRpbHNDbHMsIGpTZXRBdWRpb091dHB1dERldmljZUJ5SWQsIGF1ZGlvRm9ybWF0LCBpbmZvLnNhbXBsZV9yYXRlLCBjaGFubmVsTWFzayk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSk1lZGlhUGxheWVyMlV0aWxzLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pNZWRpYVBsYXllcjJVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYmQ0M2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pNZWRpYVBsYXllcjJVdGlscy5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0pfTUVESUFQTEFZRVIyX1VUSUxTMl9IXworI2RlZmluZSBfSl9NRURJQVBMQVlFUjJfVVRJTFMyX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorCisjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSAiYW5kcm9pZF9tZWRpYV9BdWRpb0Zvcm1hdC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBKTWVkaWFQbGF5ZXIyVXRpbHMgeworICAgIHN0YXRpYyBib29sIGlzT2ZmbG9hZGVkQXVkaW9QbGF5YmFja1N1cHBvcnRlZCgKKyAgICAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSwgYm9vbCBoYXNWaWRlbywgYm9vbCBpc1N0cmVhbWluZywKKyAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIF9KX01FRElBUExBWUVSMl9VVElMUzJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSldha2VMb2NrLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSldha2VMb2NrLmNwcAppbmRleCBjOWExMDcxLi45ODNkNzdlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pXYWtlTG9jay5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KV2FrZUxvY2suY3BwCkBAIC0yMCw1NSArMjAsNTAgQEAKIAogI2luY2x1ZGUgIkpXYWtlTG9jay5oIgogCi0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8cG93ZXJtYW5hZ2VyL1Bvd2VyTWFuYWdlci5oPgotCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotLy9UT0RPOiB1c2UgSkFWQSBQb3dlck1hbmFnZXIsIGluc3RlYWQgb2YgYmluZGVyCi1KV2FrZUxvY2s6OkpXYWtlTG9jaygpIDoKLSAgICBtUG93ZXJNYW5hZ2VyKE5VTEwpLAotICAgIG1XYWtlTG9ja1Rva2VuKE5VTEwpLAorSldha2VMb2NrOjpKV2FrZUxvY2soY29uc3Qgc3A8Sk9iamVjdEhvbGRlcj4gJmNvbnRleHQpIDoKICAgICBtV2FrZUxvY2tDb3VudCgwKSwKLSAgICBtRGVhdGhSZWNpcGllbnQobmV3IFBNRGVhdGhSZWNpcGllbnQodGhpcykpIHt9CisgICAgbVdha2VMb2NrKE5VTEwpLAorICAgIG1Db250ZXh0KGNvbnRleHQpIHt9CiAKIEpXYWtlTG9jazo6fkpXYWtlTG9jaygpIHsKLSAgICBpZiAobVBvd2VyTWFuYWdlciAhPSBOVUxMKSB7Ci0gICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IElJbnRlcmZhY2U6OmFzQmluZGVyKG1Qb3dlck1hbmFnZXIpOwotICAgICAgICBiaW5kZXItPnVubGlua1RvRGVhdGgobURlYXRoUmVjaXBpZW50KTsKLSAgICB9Ci0gICAgY2xlYXJQb3dlck1hbmFnZXIoKTsKKyAgICBjbGVhckphdmFXYWtlTG9jaygpOwogfQogCiBib29sIEpXYWtlTG9jazo6YWNxdWlyZSgpIHsKICAgICBpZiAobVdha2VMb2NrQ291bnQgPT0gMCkgewotICAgICAgICBDSEVDSyhtV2FrZUxvY2tUb2tlbiA9PSBOVUxMKTsKLSAgICAgICAgaWYgKG1Qb3dlck1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgLy8gdXNlIGNoZWNrU2VydmljZSgpIHRvIGF2b2lkIGJsb2NraW5nIGlmIHBvd2VyIHNlcnZpY2UgaXMgbm90IHVwIHlldAotICAgICAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0KLSAgICAgICAgICAgICAgICBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+Y2hlY2tTZXJ2aWNlKFN0cmluZzE2KCJwb3dlciIpKTsKLSAgICAgICAgICAgIGlmIChiaW5kZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjb3VsZCBub3QgZ2V0IHRoZSBwb3dlciBtYW5hZ2VyIHNlcnZpY2UiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVBvd2VyTWFuYWdlciA9IGludGVyZmFjZV9jYXN0PElQb3dlck1hbmFnZXI+KGJpbmRlcik7Ci0gICAgICAgICAgICAgICAgYmluZGVyLT5saW5rVG9EZWF0aChtRGVhdGhSZWNpcGllbnQpOwotICAgICAgICAgICAgfQorICAgICAgICBpZiAobVdha2VMb2NrID09IE5VTEwpIHsKKyAgICAgICAgICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICAgICAgICAgIGpjbGFzcyBqQ29udGV4dENscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL2NvbnRlbnQvQ29udGV4dCIpOworICAgICAgICAgICAgamNsYXNzIGpQb3dlck1hbmFnZXJDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9vcy9Qb3dlck1hbmFnZXIiKTsKKworICAgICAgICAgICAgam1ldGhvZElEIGpHZXRTeXN0ZW1TZXJ2aWNlID0gZW52LT5HZXRNZXRob2RJRChqQ29udGV4dENscywKKyAgICAgICAgICAgICAgICAgICAgImdldFN5c3RlbVNlcnZpY2UiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL09iamVjdDsiKTsKKyAgICAgICAgICAgIGpvYmplY3QgamF2YVBvd2VyTWFuYWdlck9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChtQ29udGV4dC0+Z2V0Sk9iamVjdCgpLAorICAgICAgICAgICAgICAgICAgICBqR2V0U3lzdGVtU2VydmljZSwgZW52LT5OZXdTdHJpbmdVVEYoInBvd2VyIikpOworCisgICAgICAgICAgICBqZmllbGRJRCBqUEFSVElBTF9XQUtFX0xPQ0sgPSBlbnYtPkdldFN0YXRpY0ZpZWxkSUQoalBvd2VyTWFuYWdlckNscywKKyAgICAgICAgICAgICAgICAgICAgIlBBUlRJQUxfV0FLRV9MT0NLIiwgIkkiKTsKKyAgICAgICAgICAgIGppbnQgUEFSVElBTF9XQUtFX0xPQ0sgPSBlbnYtPkdldFN0YXRpY0ludEZpZWxkKGpQb3dlck1hbmFnZXJDbHMsIGpQQVJUSUFMX1dBS0VfTE9DSyk7CisKKyAgICAgICAgICAgIGptZXRob2RJRCBqTmV3V2FrZUxvY2sgPSBlbnYtPkdldE1ldGhvZElEKGpQb3dlck1hbmFnZXJDbHMsCisgICAgICAgICAgICAgICAgICAgICJuZXdXYWtlTG9jayIsICIoSUxqYXZhL2xhbmcvU3RyaW5nOylMYW5kcm9pZC9vcy9Qb3dlck1hbmFnZXIkV2FrZUxvY2s7Iik7CisgICAgICAgICAgICBqb2JqZWN0IGphdmFXYWtlTG9jayA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqYXZhUG93ZXJNYW5hZ2VyT2JqLAorICAgICAgICAgICAgICAgICAgICBqTmV3V2FrZUxvY2ssIFBBUlRJQUxfV0FLRV9MT0NLLCBlbnYtPk5ld1N0cmluZ1VURigiSldha2VMb2NrIikpOworICAgICAgICAgICAgbVdha2VMb2NrID0gbmV3IEpPYmplY3RIb2xkZXIoamF2YVdha2VMb2NrKTsKKyAgICAgICAgICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoamF2YVBvd2VyTWFuYWdlck9iaik7CisgICAgICAgICAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGphdmFXYWtlTG9jayk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1Qb3dlck1hbmFnZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gbmV3IEJCaW5kZXIoKTsKLSAgICAgICAgICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBvd2VyTWFuYWdlci0+YWNxdWlyZVdha2VMb2NrKAotICAgICAgICAgICAgICAgICAgICBQT1dFUk1BTkFHRVJfUEFSVElBTF9XQUtFX0xPQ0ssCi0gICAgICAgICAgICAgICAgICAgIGJpbmRlciwgU3RyaW5nMTYoIkpXYWtlTG9jayIpLCBTdHJpbmcxNigibWVkaWEiKSk7Ci0gICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBtV2FrZUxvY2tUb2tlbiA9IGJpbmRlcjsKLSAgICAgICAgICAgICAgICBtV2FrZUxvY2tDb3VudCsrOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQorICAgICAgICBpZiAobVdha2VMb2NrICE9IE5VTEwpIHsKKyAgICAgICAgICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICAgICAgICAgIGpjbGFzcyB3YWtlTG9ja0NscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL29zL1Bvd2VyTWFuYWdlciRXYWtlTG9jayIpOworICAgICAgICAgICAgam1ldGhvZElEIGpBY3F1aXJlID0gZW52LT5HZXRNZXRob2RJRCh3YWtlTG9ja0NscywgImFjcXVpcmUiLCAiKClWIik7CisgICAgICAgICAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1XYWtlTG9jay0+Z2V0Sk9iamVjdCgpLCBqQWNxdWlyZSk7CisgICAgICAgICAgICBtV2FrZUxvY2tDb3VudCsrOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBtV2FrZUxvY2tDb3VudCsrOwpAQCAtODYsMjUgKzgxLDE3IEBACiAgICAgICAgIG1XYWtlTG9ja0NvdW50ID0gMTsKICAgICB9CiAgICAgaWYgKC0tbVdha2VMb2NrQ291bnQgPT0gMCkgewotICAgICAgICBDSEVDSyhtV2FrZUxvY2tUb2tlbiAhPSBOVUxMKTsKLSAgICAgICAgaWYgKG1Qb3dlck1hbmFnZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLT5yZWxlYXNlV2FrZUxvY2sobVdha2VMb2NrVG9rZW4sIDAgLyogZmxhZ3MgKi8pOwotICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisgICAgICAgIGlmIChtV2FrZUxvY2sgIT0gTlVMTCkgeworICAgICAgICAgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgICAgICAgICAgamNsYXNzIHdha2VMb2NrQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvb3MvUG93ZXJNYW5hZ2VyJFdha2VMb2NrIik7CisgICAgICAgICAgICBqbWV0aG9kSUQgalJlbGVhc2UgPSBlbnYtPkdldE1ldGhvZElEKHdha2VMb2NrQ2xzLCAicmVsZWFzZSIsICIoKVYiKTsKKyAgICAgICAgICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobVdha2VMb2NrLT5nZXRKT2JqZWN0KCksIGpSZWxlYXNlKTsKICAgICAgICAgfQotICAgICAgICBtV2FrZUxvY2tUb2tlbi5jbGVhcigpOwogICAgIH0KIH0KIAotdm9pZCBKV2FrZUxvY2s6OmNsZWFyUG93ZXJNYW5hZ2VyKCkgewordm9pZCBKV2FrZUxvY2s6OmNsZWFySmF2YVdha2VMb2NrKCkgewogICAgIHJlbGVhc2UodHJ1ZSk7Ci0gICAgbVBvd2VyTWFuYWdlci5jbGVhcigpOwotfQotCi12b2lkIEpXYWtlTG9jazo6UE1EZWF0aFJlY2lwaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKSB7Ci0gICAgaWYgKG1XYWtlTG9jayAhPSBOVUxMKSB7Ci0gICAgICAgIG1XYWtlTG9jay0+Y2xlYXJQb3dlck1hbmFnZXIoKTsKLSAgICB9CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pXYWtlTG9jay5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KV2FrZUxvY2suaAppbmRleCBlYWNlODdlLi4zNmM1NDJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pXYWtlTG9jay5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSldha2VMb2NrLmgKQEAgLTE4LDcgKzE4LDcgQEAKICNkZWZpbmUgSl9XQUtFTE9DS19IXwogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPHBvd2VybWFuYWdlci9JUG93ZXJNYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0pPYmplY3RIb2xkZXIuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTI2LDcgKzI2LDcgQEAKIGNsYXNzIEpXYWtlTG9jayA6IHB1YmxpYyBSZWZCYXNlIHsKIAogcHVibGljOgotICAgIEpXYWtlTG9jaygpOworICAgIEpXYWtlTG9jayhjb25zdCBzcDxKT2JqZWN0SG9sZGVyPiAmY29udGV4dCk7CiAKICAgICAvLyBOT1RFOiBhY3F1aXJlIGFuZCByZWxlYXNlIGFyZSBub3QgdGhyZWFkIHNhZmUKIApAQCAtMzcsMjggKzM3LDExIEBACiAgICAgdmlydHVhbCB+Sldha2VMb2NrKCk7CiAKIHByaXZhdGU6Ci0gICAgc3A8SVBvd2VyTWFuYWdlcj4gbVBvd2VyTWFuYWdlcjsKLSAgICBzcDxJQmluZGVyPiAgICAgICBtV2FrZUxvY2tUb2tlbjsKLSAgICB1aW50MzJfdCAgICAgICAgICBtV2FrZUxvY2tDb3VudDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtV2FrZUxvY2tDb3VudDsKKyAgICBzcDxKT2JqZWN0SG9sZGVyPiAgICAgICBtV2FrZUxvY2s7CisgICAgY29uc3Qgc3A8Sk9iamVjdEhvbGRlcj4gbUNvbnRleHQ7CiAKLSAgICBjbGFzcyBQTURlYXRoUmVjaXBpZW50IDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIGV4cGxpY2l0IFBNRGVhdGhSZWNpcGllbnQoSldha2VMb2NrICp3YWtlTG9jaykgOiBtV2FrZUxvY2sod2FrZUxvY2spIHt9Ci0gICAgICAgIHZpcnR1YWwgflBNRGVhdGhSZWNpcGllbnQoKSB7fQotCi0gICAgICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8pOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgUE1EZWF0aFJlY2lwaWVudChjb25zdCBQTURlYXRoUmVjaXBpZW50Jik7Ci0gICAgICAgIFBNRGVhdGhSZWNpcGllbnQmIG9wZXJhdG9yPSAoY29uc3QgUE1EZWF0aFJlY2lwaWVudCYpOwotCi0gICAgICAgIEpXYWtlTG9jayAqbVdha2VMb2NrOwotICAgIH07Ci0KLSAgICBjb25zdCBzcDxQTURlYXRoUmVjaXBpZW50PiBtRGVhdGhSZWNpcGllbnQ7Ci0KLSAgICB2b2lkIGNsZWFyUG93ZXJNYW5hZ2VyKCk7CisgICAgdm9pZCBjbGVhckphdmFXYWtlTG9jaygpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSldha2VMb2NrKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMi5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMi5jcHAKaW5kZXggZGU0ZjM0ZS4uNWRhNmUyNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyLmNwcApAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgIk51UGxheWVyMi5oIgogCiAjaW5jbHVkZSAiSFRUUExpdmVTb3VyY2UyLmgiCisjaW5jbHVkZSAiSk1lZGlhUGxheWVyMlV0aWxzLmgiCiAjaW5jbHVkZSAiTnVQbGF5ZXIyQ0NEZWNvZGVyLmgiCiAjaW5jbHVkZSAiTnVQbGF5ZXIyRGVjb2Rlci5oIgogI2luY2x1ZGUgIk51UGxheWVyMkRlY29kZXJCYXNlLmgiCkBAIC0zMyw3ICszNCw3IEBACiAjaW5jbHVkZSAiTnVQbGF5ZXIyU291cmNlLmgiCiAjaW5jbHVkZSAiUlRTUFNvdXJjZTIuaCIKICNpbmNsdWRlICJHZW5lcmljU291cmNlMi5oIgotI2luY2x1ZGUgIlRleHREZXNjcmlwdGlvbnMuaCIKKyNpbmNsdWRlICJUZXh0RGVzY3JpcHRpb25zMi5oIgogCiAjaW5jbHVkZSAiQVRTUGFyc2VyLmgiCiAKQEAgLTIwOCwxNSArMjA5LDE2IEBACiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLU51UGxheWVyMjo6TnVQbGF5ZXIyKHBpZF90IHBpZCwgdWlkX3QgdWlkLCBjb25zdCBzcDxNZWRpYUNsb2NrPiAmbWVkaWFDbG9jaykKK051UGxheWVyMjo6TnVQbGF5ZXIyKAorICAgICAgICBwaWRfdCBwaWQsIHVpZF90IHVpZCwgY29uc3Qgc3A8TWVkaWFDbG9jaz4gJm1lZGlhQ2xvY2ssIGNvbnN0IHNwPEpPYmplY3RIb2xkZXI+ICZjb250ZXh0KQogICAgIDogbVBJRChwaWQpLAogICAgICAgbVVJRCh1aWQpLAogICAgICAgbU1lZGlhQ2xvY2sobWVkaWFDbG9jayksCi0gICAgICBtU291cmNlRmxhZ3MoMCksCiAgICAgICBtT2ZmbG9hZEF1ZGlvKGZhbHNlKSwKICAgICAgIG1BdWRpb0RlY29kZXJHZW5lcmF0aW9uKDApLAogICAgICAgbVZpZGVvRGVjb2RlckdlbmVyYXRpb24oMCksCiAgICAgICBtUmVuZGVyZXJHZW5lcmF0aW9uKDApLAorICAgICAgbUVPU01vbml0b3JHZW5lcmF0aW9uKDApLAogICAgICAgbUxhc3RTdGFydGVkUGxheWluZ1RpbWVOcygwKSwKICAgICAgIG1QcmV2aW91c1NlZWtUaW1lVXMoMCksCiAgICAgICBtQXVkaW9FT1MoZmFsc2UpLApAQCAtMjQwLDggKzI0Miw3IEBACiAgICAgICBtUGF1c2VkKGZhbHNlKSwKICAgICAgIG1QYXVzZWRCeUNsaWVudCh0cnVlKSwKICAgICAgIG1QYXVzZWRGb3JCdWZmZXJpbmcoZmFsc2UpLAotICAgICAgbUlzRHJtUHJvdGVjdGVkKGZhbHNlKSwKLSAgICAgIG1EYXRhU291cmNlVHlwZShEQVRBX1NPVVJDRV9UWVBFX05PTkUpIHsKKyAgICAgIG1Db250ZXh0KGNvbnRleHQpIHsKICAgICBDSEVDSyhtZWRpYUNsb2NrICE9IE5VTEwpOwogICAgIGNsZWFyRmx1c2hDb21wbGV0ZSgpOwogfQpAQCAtMzA5LDcgKzMxMCw3IEBACiAgICAgICAgICAgICAgICAgc3A8R2VuZXJpY1NvdXJjZTI+IGdlbmVyaWNTb3VyY2UgPQogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEdlbmVyaWNTb3VyY2UyKG5vdGlmeSwgbVVJRCwgbU1lZGlhQ2xvY2spOwogCi0gICAgICAgICAgICAgICAgZXJyID0gZ2VuZXJpY1NvdXJjZS0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgdXJsLCBoZWFkZXJzKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBnZW5lcmljU291cmNlLT5zZXREYXRhU291cmNlKHVybCwgaGVhZGVycyk7CiAKICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgICpzb3VyY2UgPSBnZW5lcmljU291cmNlOwpAQCAtMzkzLDExICszOTQsMTMgQEAKICAgICAvLyBOb3csIHNvdXJjZSAhPSBOVUxMLgogICAgICovCiAKLSAgICBtRGF0YVNvdXJjZVR5cGUgPSBkYXRhU291cmNlVHlwZTsKKyAgICBtQ3VycmVudFNvdXJjZUluZm8ubURhdGFTb3VyY2VUeXBlID0gZGF0YVNvdXJjZVR5cGU7CiAKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0RGF0YVNvdXJjZSwgdGhpcyk7CiAgICAgbXNnLT5zZXRPYmplY3QoInNvdXJjZSIsIHNvdXJjZSk7CiAgICAgbXNnLT5zZXRJbnQ2NCgic3JjSWQiLCBkc2QtPm1JZCk7CisgICAgbXNnLT5zZXRJbnQ2NCgic3RhcnRUaW1lVXMiLCBkc2QtPm1TdGFydFBvc2l0aW9uTXMgKiAxMDAwKTsKKyAgICBtc2ctPnNldEludDY0KCJlbmRUaW1lVXMiLCBkc2QtPm1FbmRQb3NpdGlvbk1zICogMTAwMCk7CiAgICAgbXNnLT5wb3N0KCk7CiB9CiAKQEAgLTQxNSwxMSArNDE4LDEzIEBACiAgICAgLy8gTm93LCBzb3VyY2UgIT0gTlVMTC4KICAgICAqLwogCi0gICAgbU5leHREYXRhU291cmNlVHlwZSA9IGRhdGFTb3VyY2VUeXBlOworICAgIG1OZXh0U291cmNlSW5mby5tRGF0YVNvdXJjZVR5cGUgPSBkYXRhU291cmNlVHlwZTsKIAogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQcmVwYXJlTmV4dERhdGFTb3VyY2UsIHRoaXMpOwogICAgIG1zZy0+c2V0T2JqZWN0KCJzb3VyY2UiLCBzb3VyY2UpOwogICAgIG1zZy0+c2V0SW50NjQoInNyY0lkIiwgZHNkLT5tSWQpOworICAgIG1zZy0+c2V0SW50NjQoInN0YXJ0VGltZVVzIiwgZHNkLT5tU3RhcnRQb3NpdGlvbk1zICogMTAwMCk7CisgICAgbXNnLT5zZXRJbnQ2NCgiZW5kVGltZVVzIiwgZHNkLT5tRW5kUG9zaXRpb25NcyAqIDEwMDApOwogICAgIG1zZy0+cG9zdCgpOwogfQogCkBAIC00ODcsNyArNDkyLDcgQEAKIHN0YXR1c190IE51UGxheWVyMjo6c2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcmF0ZSkgewogICAgIC8vIGRvIHNvbWUgY3Vyc29yeSB2YWxpZGF0aW9uIG9mIHRoZSBzZXR0aW5ncyBoZXJlLiBhdWRpbyBtb2RlcyBhcmUKICAgICAvLyBvbmx5IHZhbGlkYXRlZCB3aGVuIHNldCBvbiB0aGUgYXVkaW9zaW5rLgotICAgICBpZiAoKHJhdGUubVNwZWVkICE9IDAuZiAmJiByYXRlLm1TcGVlZCA8IEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01JTikKKyAgICAgaWYgKHJhdGUubVNwZWVkIDwgQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUlOCiAgICAgICAgICAgICB8fCByYXRlLm1TcGVlZCA+IEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01BWAogICAgICAgICAgICAgfHwgcmF0ZS5tUGl0Y2ggPCBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NSU4KICAgICAgICAgICAgIHx8IHJhdGUubVBpdGNoID4gQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUFYKSB7CkBAIC01NTQsNyArNTU5LDcgQEAKICAgICBzcDxTb3VyY2U+IHNvdXJjZTsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU291cmNlTG9jayk7Ci0gICAgICAgIHNvdXJjZSA9IG1Tb3VyY2U7CisgICAgICAgIHNvdXJjZSA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlOwogICAgIH0KIAogICAgIGlmIChzb3VyY2UgIT0gTlVMTCkgewpAQCAtNTg0LDkgKzU4OSwxMyBAQAogICAgIG1zZy0+cG9zdCgpOwogfQogCit2b2lkIE51UGxheWVyMjo6cmV3aW5kKCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZXdpbmQsIHRoaXMpOworICAgIG1zZy0+cG9zdCgpOworfQogCiB2b2lkIE51UGxheWVyMjo6d3JpdGVUcmFja0luZm8oCi0gICAgICAgIFBhcmNlbCogcmVwbHksIGNvbnN0IHNwPEFNZXNzYWdlPiYgZm9ybWF0KSBjb25zdCB7CisgICAgICAgIFBsYXllck1lc3NhZ2UqIHJlcGx5LCBjb25zdCBzcDxBTWVzc2FnZT4mIGZvcm1hdCkgY29uc3QgewogICAgIGlmIChmb3JtYXQgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiTlVMTCBmb3JtYXQiKTsKICAgICAgICAgcmV0dXJuOwpAQCAtNjE5LDEwICs2MjgsOSBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgcmVwbHktPndyaXRlSW50MzIoMik7IC8vIHdyaXRlIHNvbWV0aGluZyBub24temVybwotICAgIHJlcGx5LT53cml0ZUludDMyKHRyYWNrVHlwZSk7Ci0gICAgcmVwbHktPndyaXRlU3RyaW5nMTYoU3RyaW5nMTYobWltZS5jX3N0cigpKSk7Ci0gICAgcmVwbHktPndyaXRlU3RyaW5nMTYoU3RyaW5nMTYobGFuZy5jX3N0cigpKSk7CisgICAgcmVwbHktPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKHRyYWNrVHlwZSk7CisgICAgcmVwbHktPmFkZF92YWx1ZXMoKS0+c2V0X3N0cmluZ192YWx1ZShtaW1lLmNfc3RyKCkpOworICAgIHJlcGx5LT5hZGRfdmFsdWVzKCktPnNldF9zdHJpbmdfdmFsdWUobGFuZy5jX3N0cigpKTsKIAogICAgIGlmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSkgewogICAgICAgICBpbnQzMl90IGlzQXV0bywgaXNEZWZhdWx0LCBpc0ZvcmNlZDsKQEAgLTYzMCwyNyArNjM4LDMwIEBACiAgICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJkZWZhdWx0IiwgJmlzRGVmYXVsdCkpOwogICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigiZm9yY2VkIiwgJmlzRm9yY2VkKSk7CiAKLSAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNBdXRvKTsKLSAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNEZWZhdWx0KTsKLSAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNGb3JjZWQpOworICAgICAgICByZXBseS0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoaXNBdXRvKTsKKyAgICAgICAgcmVwbHktPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKGlzRGVmYXVsdCk7CisgICAgICAgIHJlcGx5LT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShpc0ZvcmNlZCk7CiAgICAgfQogfQogCiB2b2lkIE51UGxheWVyMjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKwogICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKICAgICAgICAgY2FzZSBrV2hhdFNldERhdGFTb3VyY2U6CiAgICAgICAgIHsKICAgICAgICAgICAgIEFMT0dWKCJrV2hhdFNldERhdGFTb3VyY2UiKTsKIAotICAgICAgICAgICAgQ0hFQ0sobVNvdXJjZSA9PSBOVUxMKTsKKyAgICAgICAgICAgIENIRUNLKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlID09IE5VTEwpOwogCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKICAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgic291cmNlIiwgJm9iaikpOwogICAgICAgICAgICAgaWYgKG9iaiAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Tb3VyY2VMb2NrKTsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3JjSWQiLCAmbVNyY0lkKSk7Ci0gICAgICAgICAgICAgICAgbVNvdXJjZSA9IHN0YXRpY19jYXN0PFNvdXJjZSAqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzcmNJZCIsICZtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkKSk7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInN0YXJ0VGltZVVzIiwgJm1DdXJyZW50U291cmNlSW5mby5tU3RhcnRUaW1lVXMpKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgiZW5kVGltZVVzIiwgJm1DdXJyZW50U291cmNlSW5mby5tRW5kVGltZVVzKSk7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgPSBzdGF0aWNfY2FzdDxTb3VyY2UgKj4ob2JqLmdldCgpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZXJyID0gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgICAgICAgICBBTE9HRSgia1doYXRTZXREYXRhU291cmNlLCBzb3VyY2Ugc2hvdWxkIG5vdCBiZSBOVUxMIik7CkBAIC02NTksNyArNjcwLDcgQEAKICAgICAgICAgICAgIENIRUNLKG1Ecml2ZXIgIT0gTlVMTCk7CiAgICAgICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwogICAgICAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlTZXREYXRhU291cmNlQ29tcGxldGVkKG1TcmNJZCwgZXJyKTsKKyAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVNldERhdGFTb3VyY2VDb21wbGV0ZWQobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgZXJyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC02NzMsOSArNjg0LDExIEBACiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInNvdXJjZSIsICZvYmopKTsKICAgICAgICAgICAgIGlmIChvYmogIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU291cmNlTG9jayk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInNyY0lkIiwgJm1OZXh0U3JjSWQpKTsKLSAgICAgICAgICAgICAgICBtTmV4dFNvdXJjZSA9IHN0YXRpY19jYXN0PFNvdXJjZSAqPihvYmouZ2V0KCkpOwotICAgICAgICAgICAgICAgIG1OZXh0U291cmNlLT5wcmVwYXJlQXN5bmMoKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3JjSWQiLCAmbU5leHRTb3VyY2VJbmZvLm1TcmNJZCkpOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzdGFydFRpbWVVcyIsICZtTmV4dFNvdXJjZUluZm8ubVN0YXJ0VGltZVVzKSk7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoImVuZFRpbWVVcyIsICZtTmV4dFNvdXJjZUluZm8ubUVuZFRpbWVVcykpOworICAgICAgICAgICAgICAgIG1OZXh0U291cmNlSW5mby5tU291cmNlID0gc3RhdGljX2Nhc3Q8U291cmNlICo+KG9iai5nZXQoKSk7CisgICAgICAgICAgICAgICAgbU5leHRTb3VyY2VJbmZvLm1Tb3VyY2UtPnByZXBhcmVBc3luYyhtTmV4dFNvdXJjZUluZm8ubVN0YXJ0VGltZVVzKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZXJyID0gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgICAgIH0KQEAgLTY4OCw3ICs3MDEsNyBAQAogICAgICAgICAgICAgQUxPR1YoImtXaGF0UGxheU5leHREYXRhU291cmNlIik7CiAgICAgICAgICAgICBpbnQ2NF90IHNyY0lkOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInNyY0lkIiwgJnNyY0lkKSk7Ci0gICAgICAgICAgICBpZiAoc3JjSWQgIT0gbU5leHRTcmNJZCkgeworICAgICAgICAgICAgaWYgKHNyY0lkICE9IG1OZXh0U291cmNlSW5mby5tU3JjSWQpIHsKICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihzcmNJZCwgTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgMCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQpAQCAtNzA5LDYgKzcyMiwyMiBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0RU9TTW9uaXRvcjoKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgICAgICAgICAgaW50MzJfdCByZWFzb247CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVhc29uIiwgJnJlYXNvbikpOworCisgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBtRU9TTW9uaXRvckdlbmVyYXRpb24gfHwgcmVhc29uICE9IE1lZGlhQ2xvY2s6OlRJTUVSX1JFQVNPTl9SRUFDSEVEKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7ICAvLyBzdGFsZSBvciByZXNldAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBTE9HVigia1doYXRFT1NNb25pdG9yIik7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfUExBWUJBQ0tfQ09NUExFVEUsIDAsIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIGtXaGF0R2V0QnVmZmVyaW5nU2V0dGluZ3M6CiAgICAgICAgIHsKICAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwpAQCAtNzE3LDggKzc0Niw4IEBACiAgICAgICAgICAgICBBTE9HVigia1doYXRHZXRCdWZmZXJpbmdTZXR0aW5ncyIpOwogICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MgYnVmZmVyaW5nOwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gbVNvdXJjZS0+Z2V0QnVmZmVyaW5nU2V0dGluZ3MoJmJ1ZmZlcmluZyk7CisgICAgICAgICAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGVyciA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRCdWZmZXJpbmdTZXR0aW5ncygmYnVmZmVyaW5nKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9CkBAIC03NDAsOCArNzY5LDggQEAKICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzIGJ1ZmZlcmluZzsKICAgICAgICAgICAgIHJlYWRGcm9tQU1lc3NhZ2UobXNnLCAmYnVmZmVyaW5nKTsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGVyciA9IG1Tb3VyY2UtPnNldEJ1ZmZlcmluZ1NldHRpbmdzKGJ1ZmZlcmluZyk7CisgICAgICAgICAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGVyciA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5zZXRCdWZmZXJpbmdTZXR0aW5ncyhidWZmZXJpbmcpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KQEAgLTc1NSw3ICs3ODQsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBBTE9HVigib25NZXNzYWdlUmVjZWl2ZWQga1doYXRQcmVwYXJlIik7CiAKLSAgICAgICAgICAgIG1Tb3VyY2UtPnByZXBhcmVBc3luYygpOworICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnByZXBhcmVBc3luYyhtQ3VycmVudFNvdXJjZUluZm8ubVN0YXJ0VGltZVVzKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTc2NCwxMiArNzkzLDE2IEBACiAgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAotICAgICAgICAgICAgUGFyY2VsKiByZXBseTsKKyAgICAgICAgICAgIGludDY0X3Qgc3JjSWQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3JjSWQiLCAoaW50NjRfdCopJnNyY0lkKSk7CisKKyAgICAgICAgICAgIFBsYXllck1lc3NhZ2UqIHJlcGx5OwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigicmVwbHkiLCAodm9pZCoqKSZyZXBseSkpOwogCisgICAgICAgICAgICAvLyBUT0RPOiB1c2UgY29ycmVjdCBzb3VyY2UgaW5mbyBiYXNlZCBvbiBzcmNJZC4KICAgICAgICAgICAgIHNpemVfdCBpbmJhbmRUcmFja3MgPSAwOwotICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGluYmFuZFRyYWNrcyA9IG1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKKyAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW5iYW5kVHJhY2tzID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc2l6ZV90IGNjVHJhY2tzID0gMDsKQEAgLTc3OCwxMSArODExLDExIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIHRvdGFsIHRyYWNrIGNvdW50Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpbmJhbmRUcmFja3MgKyBjY1RyYWNrcyk7CisgICAgICAgICAgICByZXBseS0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoaW5iYW5kVHJhY2tzICsgY2NUcmFja3MpOwogCiAgICAgICAgICAgICAvLyB3cml0ZSBpbmJhbmQgdHJhY2tzCiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluYmFuZFRyYWNrczsgKytpKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVUcmFja0luZm8ocmVwbHksIG1Tb3VyY2UtPmdldFRyYWNrSW5mbyhpKSk7CisgICAgICAgICAgICAgICAgd3JpdGVUcmFja0luZm8ocmVwbHksIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRUcmFja0luZm8oaSkpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyB3cml0ZSBDQyB0cmFjawpAQCAtNzk3LDIwICs4MzAsMzUgQEAKIAogICAgICAgICBjYXNlIGtXaGF0R2V0U2VsZWN0ZWRUcmFjazoKICAgICAgICAgeworICAgICAgICAgICAgaW50NjRfdCBzcmNJZDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzcmNJZCIsIChpbnQ2NF90Kikmc3JjSWQpKTsKKworICAgICAgICAgICAgaW50MzJfdCB0eXBlMzI7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigidHlwZSIsIChpbnQzMl90KikmdHlwZTMyKSk7CisgICAgICAgICAgICBtZWRpYV90cmFja190eXBlIHR5cGUgPSAobWVkaWFfdHJhY2tfdHlwZSl0eXBlMzI7CisKKyAgICAgICAgICAgIC8vIFRPRE86IHVzZSBjb3JyZWN0IHNvdXJjZSBpbmZvIGJhc2VkIG9uIHNyY0lkLgorICAgICAgICAgICAgc2l6ZV90IGluYmFuZFRyYWNrcyA9IDA7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHNzaXplX3Qgc2VsZWN0ZWRUcmFjayA9IC0xOworICAgICAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBlcnIgPSBPSzsKLQotICAgICAgICAgICAgICAgIGludDMyX3QgdHlwZTMyOwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ0eXBlIiwgKGludDMyX3QqKSZ0eXBlMzIpKTsKLSAgICAgICAgICAgICAgICBtZWRpYV90cmFja190eXBlIHR5cGUgPSAobWVkaWFfdHJhY2tfdHlwZSl0eXBlMzI7Ci0gICAgICAgICAgICAgICAgc3NpemVfdCBzZWxlY3RlZFRyYWNrID0gbVNvdXJjZS0+Z2V0U2VsZWN0ZWRUcmFjayh0eXBlKTsKLQotICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigicmVwbHkiLCAodm9pZCoqKSZyZXBseSkpOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlbGVjdGVkVHJhY2spOworICAgICAgICAgICAgICAgIGluYmFuZFRyYWNrcyA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRUcmFja0NvdW50KCk7CisgICAgICAgICAgICAgICAgc2VsZWN0ZWRUcmFjayA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRTZWxlY3RlZFRyYWNrKHR5cGUpOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAoc2VsZWN0ZWRUcmFjayA9PSAtMSAmJiBtQ0NEZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgICAgICBzZWxlY3RlZFRyYWNrID0gbUNDRGVjb2Rlci0+Z2V0U2VsZWN0ZWRUcmFjayh0eXBlKTsKKyAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRUcmFjayAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFRyYWNrICs9IGluYmFuZFRyYWNrczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFBsYXllck1lc3NhZ2UqIHJlcGx5OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigicmVwbHkiLCAodm9pZCoqKSZyZXBseSkpOworICAgICAgICAgICAgcmVwbHktPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKHNlbGVjdGVkVHJhY2spOworCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CiAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CiAKQEAgLTgyNSwxOCArODczLDIxIEBACiAgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAorICAgICAgICAgICAgaW50NjRfdCBzcmNJZDsKICAgICAgICAgICAgIHNpemVfdCB0cmFja0luZGV4OwogICAgICAgICAgICAgaW50MzJfdCBzZWxlY3Q7CiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzcmNJZCIsIChpbnQ2NF90Kikmc3JjSWQpKTsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFNpemUoInRyYWNrSW5kZXgiLCAmdHJhY2tJbmRleCkpOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInNlbGVjdCIsICZzZWxlY3QpKTsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CiAKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IElOVkFMSURfT1BFUkFUSU9OOwogCisgICAgICAgICAgICAvLyBUT0RPOiB1c2UgY29ycmVjdCBzb3VyY2UgaW5mbyBiYXNlZCBvbiBzcmNJZC4KICAgICAgICAgICAgIHNpemVfdCBpbmJhbmRUcmFja3MgPSAwOwotICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGluYmFuZFRyYWNrcyA9IG1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKKyAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW5iYW5kVHJhY2tzID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNpemVfdCBjY1RyYWNrcyA9IDA7CiAgICAgICAgICAgICBpZiAobUNDRGVjb2RlciAhPSBOVUxMKSB7CkBAIC04NDQsMTEgKzg5NSwxMSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAodHJhY2tJbmRleCA8IGluYmFuZFRyYWNrcykgewotICAgICAgICAgICAgICAgIGVyciA9IG1Tb3VyY2UtPnNlbGVjdFRyYWNrKHRyYWNrSW5kZXgsIHNlbGVjdCwgdGltZVVzKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+c2VsZWN0VHJhY2sodHJhY2tJbmRleCwgc2VsZWN0LCB0aW1lVXMpOwogCiAgICAgICAgICAgICAgICAgaWYgKCFzZWxlY3QgJiYgZXJyID09IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdHlwZTsKLSAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGluZm8gPSBtU291cmNlLT5nZXRUcmFja0luZm8odHJhY2tJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBpbmZvID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldFRyYWNrSW5mbyh0cmFja0luZGV4KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8gIT0gTlVMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGluZm8tPmZpbmRJbnQzMigidHlwZSIsICZ0eXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHR5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQpIHsKQEAgLTg4MSwxMCArOTMyLDEwIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICAgICAgICAgIGlmIChtRHJpdmVyICE9IE5VTEwgJiYgbVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LKSB7CisgICAgICAgICAgICBpZiAobURyaXZlciAhPSBOVUxMICYmIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXREdXJhdGlvbigmZHVyYXRpb25VcykgPT0gT0spIHsKICAgICAgICAgICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwogICAgICAgICAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeUR1cmF0aW9uKG1TcmNJZCwgZHVyYXRpb25Vcyk7CisgICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5RHVyYXRpb24obUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgZHVyYXRpb25Vcyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC05MDEsMTMgKzk1MiwxNSBAQAogCiAgICAgICAgICAgICBBTE9HRCgib25TZXRWaWRlb1N1cmZhY2UoJXAsICVzIHZpZGVvIGRlY29kZXIpIiwKICAgICAgICAgICAgICAgICAgICAgKG53dyA9PSBOVUxMID8gTlVMTCA6IG53dy0+Z2V0QU5hdGl2ZVdpbmRvdygpKSwKLSAgICAgICAgICAgICAgICAgICAgKG1Tb3VyY2UgIT0gTlVMTCAmJiBtU3RhcnRlZCAmJiBtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pICE9IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlICE9IE5VTEwgJiYgbVN0YXJ0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSAhPSBOVUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbVZpZGVvRGVjb2RlciAhPSBOVUxMKSA/ICJoYXZlIiA6ICJubyIpOwogCi0gICAgICAgICAgICAvLyBOZWVkIHRvIGNoZWNrIG1TdGFydGVkIGJlZm9yZSBjYWxsaW5nIG1Tb3VyY2UtPmdldEZvcm1hdCBiZWNhdXNlIE51UGxheWVyMiBtaWdodAotICAgICAgICAgICAgLy8gYmUgaW4gcHJlcGFyaW5nIHN0YXRlIGFuZCBpdCBjb3VsZCB0YWtlIGxvbmcgdGltZS4KLSAgICAgICAgICAgIC8vIFdoZW4gbVN0YXJ0ZWQgaXMgdHJ1ZSwgbVNvdXJjZSBtdXN0IGhhdmUgYmVlbiBzZXQuCi0gICAgICAgICAgICBpZiAobVNvdXJjZSA9PSBOVUxMIHx8ICFtU3RhcnRlZCB8fCBtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pID09IE5VTEwKKyAgICAgICAgICAgIC8vIE5lZWQgdG8gY2hlY2sgbVN0YXJ0ZWQgYmVmb3JlIGNhbGxpbmcgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdAorICAgICAgICAgICAgLy8gYmVjYXVzZSBOdVBsYXllcjIgbWlnaHQgYmUgaW4gcHJlcGFyaW5nIHN0YXRlIGFuZCBpdCBjb3VsZCB0YWtlIGxvbmcgdGltZS4KKyAgICAgICAgICAgIC8vIFdoZW4gbVN0YXJ0ZWQgaXMgdHJ1ZSwgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgbXVzdCBoYXZlIGJlZW4gc2V0LgorICAgICAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlID09IE5VTEwgfHwgIW1TdGFydGVkCisgICAgICAgICAgICAgICAgICAgIHx8IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pID09IE5VTEwKICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogbVZpZGVvRGVjb2RlcidzIG1OYXRpdmVXaW5kb3cgaXMgYWx3YXlzIG5vbi1udWxsCiAgICAgICAgICAgICAgICAgICAgIHx8IChtVmlkZW9EZWNvZGVyICE9IE5VTEwgJiYgbVZpZGVvRGVjb2Rlci0+c2V0VmlkZW9TdXJmYWNlKG53dykgPT0gT0spKSB7CiAgICAgICAgICAgICAgICAgcGVyZm9ybVNldFN1cmZhY2Uobnd3KTsKQEAgLTk3MSwxMCArMTAyNCwxMCBAQAogICAgICAgICAgICAgICAgICAgICBvblJlc3VtZSgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb25TdGFydCgpOworICAgICAgICAgICAgICAgIG9uU3RhcnQodHJ1ZSAvKiBwbGF5ICovKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1QYXVzZWRCeUNsaWVudCA9IGZhbHNlOwotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfU1RBUlRFRCwgMCwgMCk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfU1RBUlRFRCwgMCwgMCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC05ODgsOCArMTA0MSw3IEBACiAgICAgICAgICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAvLyBBdWRpb1NpbmsgYWxsb3dzIG9ubHkgMS5mIGFuZCAwLmYgZm9yIG9mZmxvYWQgbW9kZS4KICAgICAgICAgICAgICAgICAvLyBGb3Igb3RoZXIgc3BlZWQsIHN3aXRjaCB0byBub24tb2ZmbG9hZCBtb2RlLgotICAgICAgICAgICAgICAgIGlmIChtT2ZmbG9hZEF1ZGlvICYmICgocmF0ZS5tU3BlZWQgIT0gMC5mICYmIHJhdGUubVNwZWVkICE9IDEuZikKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IHJhdGUubVBpdGNoICE9IDEuZikpIHsKKyAgICAgICAgICAgICAgICBpZiAobU9mZmxvYWRBdWRpbyAmJiAocmF0ZS5tU3BlZWQgIT0gMS5mIHx8IHJhdGUubVBpdGNoICE9IDEuZikpIHsKICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjdXJyZW50UG9zaXRpb25VczsKICAgICAgICAgICAgICAgICAgICAgaWYgKGdldEN1cnJlbnRQb3NpdGlvbigmY3VycmVudFBvc2l0aW9uVXMpICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UG9zaXRpb25VcyA9IG1QcmV2aW91c1NlZWtUaW1lVXM7CkBAIC0xMDEyLDM2ICsxMDY0LDE1IEBACiAgICAgICAgICAgICAgICAgZXJyID0gbVJlbmRlcmVyLT5zZXRQbGF5YmFja1NldHRpbmdzKHJhdGUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgIGlmIChyYXRlLm1TcGVlZCA9PSAwLmYpIHsKLSAgICAgICAgICAgICAgICAgICAgb25QYXVzZSgpOwotICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9QQVVTRUQsIDAsIDApOwotICAgICAgICAgICAgICAgICAgICBtUGF1c2VkQnlDbGllbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIGFsbCBvdGhlciBzZXR0aW5ncyAodXNpbmcgbm9uLXBhdXNlZCBzcGVlZCkKLSAgICAgICAgICAgICAgICAgICAgLy8gc28gd2UgY2FuIHJlc3RvcmUgdGhlbSBvbiBzdGFydAotICAgICAgICAgICAgICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSBuZXdSYXRlID0gcmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgbmV3UmF0ZS5tU3BlZWQgPSBtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQ7Ci0gICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja1NldHRpbmdzID0gbmV3UmF0ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgeyAvKiByYXRlLm1TcGVlZCAhPSAwLmYgKi8KLSAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSByYXRlOwotICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCByZXN1bWUgeWV0IGlmIHRoZSBzb3VyY2UgaXMgc3RpbGwgYnVmZmVyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1QYXVzZWRGb3JCdWZmZXJpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblJlc3VtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1QcmVwYXJlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb25TdGFydCgpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSByYXRlOwogCi0gICAgICAgICAgICAgICAgICAgIG1QYXVzZWRCeUNsaWVudCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChtVmlkZW9EZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHBhcmFtcyA9IG5ldyBBTWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJwbGF5YmFjay1zcGVlZCIsIG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZCk7CisgICAgICAgICAgICAgICAgICAgIG1WaWRlb0RlY29kZXItPnNldFBhcmFtZXRlcnMocGFyYW1zKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChtVmlkZW9EZWNvZGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcGFyYW1zID0gbmV3IEFNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgicGxheWJhY2stc3BlZWQiLCBtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQpOwotICAgICAgICAgICAgICAgIG1WaWRlb0RlY29kZXItPnNldFBhcmFtZXRlcnMocGFyYW1zKTsKLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwogICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwogICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKQEAgLTEwNjEsOSArMTA5Miw2IEBACiAgICAgICAgICAgICAgICAgLy8gZ2V0IHBsYXliYWNrIHNldHRpbmdzIHVzZWQgYnkgcmVuZGVyZXIsIGFzIGl0IG1heSBiZQogICAgICAgICAgICAgICAgIC8vIHNsaWdodGx5IG9mZiBkdWUgdG8gYXVkaW9zaW5rIG5vdCB0YWtpbmcgc21hbGwgY2hhbmdlcy4KICAgICAgICAgICAgICAgICBtUGxheWJhY2tTZXR0aW5ncyA9IHJhdGU7Ci0gICAgICAgICAgICAgICAgaWYgKG1QYXVzZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmF0ZS5tU3BlZWQgPSAwLmY7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwogICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewpAQCAtMTE1NywyMSArMTE4NSwyMiBAQAogICAgICAgICAgICAgICAgICAgICAmJiAobUF1ZGlvRGVjb2RlciAhPSBOVUxMIHx8IG1WaWRlb0RlY29kZXIgIT0gTlVMTCkpIHsKICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3ZlIGZvdW5kIGFueXRoaW5nIHBsYXlhYmxlLgogCi0gICAgICAgICAgICAgICAgaWYgKG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKSB7CisgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikgewogICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZVBvbGxEdXJhdGlvbigpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3RhdHVzX3QgZXJyOwotICAgICAgICAgICAgaWYgKChlcnIgPSBtU291cmNlLT5mZWVkTW9yZVRTRGF0YSgpKSAhPSBPSykgeworICAgICAgICAgICAgaWYgKChlcnIgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+ZmVlZE1vcmVUU0RhdGEoKSkgIT0gT0spIHsKICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvRGVjb2RlciA9PSBOVUxMICYmIG1WaWRlb0RlY29kZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3QgY3VycmVudGx5IGRlY29kaW5nIGFueXRoaW5nIChubyBhdWRpbyBvcgogICAgICAgICAgICAgICAgICAgICAvLyB2aWRlbyB0cmFja3MgZm91bmQpIGFuZCB3ZSBqdXN0IHJhbiBvdXQgb2YgaW5wdXQgZGF0YS4KIAogICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1BMQVlCQUNLX0NPTVBMRVRFLCAwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9QTEFZQkFDS19DT01QTEVURSwgMCwgMCk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTEyNTMsMTAgKzEyODIsMTAgQEAKICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSk7CiAKICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gaW5wdXRGb3JtYXQgPQotICAgICAgICAgICAgICAgICAgICAgICAgbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pOwogCiAgICAgICAgICAgICAgICAgc2V0VmlkZW9TY2FsaW5nTW9kZShtVmlkZW9TY2FsaW5nTW9kZSk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlVmlkZW9TaXplKG1TcmNJZCwgaW5wdXRGb3JtYXQsIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgdXBkYXRlVmlkZW9TaXplKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIGlucHV0Rm9ybWF0LCBmb3JtYXQpOwogICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IERlY29kZXJCYXNlOjprV2hhdFNodXRkb3duQ29tcGxldGVkKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIiVzIHNodXRkb3duIGNvbXBsZXRlZCIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOwogICAgICAgICAgICAgICAgIGlmIChhdWRpbykgewpAQCAtMTMyMywyOCArMTM1MiwzOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoRmx1c2hJZlBvc3NpYmxlKCk7ICAvLyBTaG91bGQgbm90IG9jY3VyLgogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAvLyBGaW5pc2ggYW55d2F5cy4KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChhdWRpbykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1WaWRlb0RlY29kZXJFcnJvciB8fCBtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pID09IE5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbU5hdGl2ZVdpbmRvdyA9PSBOVUxMIHx8IG1OYXRpdmVXaW5kb3ctPmdldEFOYXRpdmVXaW5kb3coKSA9PSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVZpZGVvRGVjb2RlckVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pID09IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbU5hdGl2ZVdpbmRvdyA9PSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1OYXRpdmVXaW5kb3ctPmdldEFOYXRpdmVXaW5kb3coKSA9PSBOVUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1WaWRlb0RlY29kZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gYm90aCBhdWRpbyBhbmQgdmlkZW8gaGF2ZSBlcnJvciwgb3IgdGhpcyBzdHJlYW0gaGFzIG9ubHkgYXVkaW8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBoYXMgZXJyb3IsIG5vdGlmeSBjbGllbnQgb2YgZXJyb3IuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUEyX0VSUk9SX1VOS05PV04sIGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgYXVkaW8gdHJhY2sgaGFzIGVycm9yLiBWaWRlbyB0cmFjayBjb3VsZCBiZSBzdGlsbCBnb29kIHRvIHBsYXkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fUExBWV9BVURJT19FUlJPUiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUEyX0lORk9fUExBWV9BVURJT19FUlJPUiwgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0RlY29kZXJFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvRGVjb2RlckVycm9yIHx8IG1Tb3VyY2UtPmdldEZvcm1hdCh0cnVlIC8qIGF1ZGlvICovKSA9PSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvRGVjb2RlckVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXQodHJ1ZSAvKiBhdWRpbyAqLykgPT0gTlVMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtQXVkaW9TaW5rID09IE5VTEwgfHwgbUF1ZGlvRGVjb2RlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBib3RoIGF1ZGlvIGFuZCB2aWRlbyBoYXZlIGVycm9yLCBvciB0aGlzIHN0cmVhbSBoYXMgb25seSB2aWRlbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGhhcyBlcnJvciwgbm90aWZ5IGNsaWVudCBvZiBlcnJvci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQTJfRVJST1JfVU5LTk9XTiwgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSB2aWRlbyB0cmFjayBoYXMgZXJyb3IuIEF1ZGlvIHRyYWNrIGNvdWxkIGJlIHN0aWxsIGdvb2QgdG8gcGxheS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19QTEFZX1ZJREVPX0VSUk9SLCBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQTJfSU5GT19QTEFZX1ZJREVPX0VSUk9SLCBlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvRGVjb2RlckVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTM5NCwxMiArMTQzNCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIsIGZpbmFsUmVzdWx0KTsKIAogICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIGZpbmFsUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUEyX0VSUk9SX1VOS05PV04sIGZpbmFsUmVzdWx0KTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAoKG1BdWRpb0VPUyB8fCBtQXVkaW9EZWNvZGVyID09IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgICAgICAmJiAobVZpZGVvRU9TIHx8IG1WaWRlb0RlY29kZXIgPT0gTlVMTCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfUExBWUJBQ0tfQ09NUExFVEUsIDAsIDApOworICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfUExBWUJBQ0tfQ09NUExFVEUsIDAsIDApOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRGbHVzaENvbXBsZXRlKSB7CiAgICAgICAgICAgICAgICAgaW50MzJfdCBhdWRpbzsKQEAgLTE0MjAsMTAgKzE0NjEsMTEgQEAKICAgICAgICAgICAgICAgICBoYW5kbGVGbHVzaENvbXBsZXRlKGF1ZGlvLCBmYWxzZSAvKiBpc0RlY29kZXIgKi8pOwogICAgICAgICAgICAgICAgIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOwogICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IFJlbmRlcmVyOjprV2hhdFZpZGVvUmVuZGVyaW5nU3RhcnQpIHsKLSAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19WSURFT19SRU5ERVJJTkdfU1RBUlQsIDApOworICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBMl9JTkZPX1ZJREVPX1JFTkRFUklOR19TVEFSVCwgMCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gUmVuZGVyZXI6OmtXaGF0TWVkaWFSZW5kZXJpbmdTdGFydCkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJtZWRpYSByZW5kZXJpbmcgc3RhcnRlZCIpOwotICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1NUQVJURUQsIDAsIDApOworICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9TVEFSVEVELCAwLCAwKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRBdWRpb1RlYXJEb3duKSB7CiAgICAgICAgICAgICAgICAgaW50MzJfdCByZWFzb247CiAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJlYXNvbiIsICZyZWFzb24pKTsKQEAgLTE0NzYsNyArMTUxOCw3IEBACiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVyVXM7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZXJVcyIsICZ0aW1lclVzKSk7CiAKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX05PVElGWV9USU1FLCB0aW1lclVzLCAwKTsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9OT1RJRllfVElNRSwgdGltZXJVcywgMCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xNDk1LDIwICsxNTM3LDIwIEBACiAgICAgICAgICAgICBpZiAoIW1TdGFydGVkKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFtU291cmNlU3RhcnRlZCkgewogICAgICAgICAgICAgICAgICAgICBtU291cmNlU3RhcnRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5zdGFydCgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoc2Vla1RpbWVVcyA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybVNlZWsoc2Vla1RpbWVVcywgKE1lZGlhUGxheWVyMlNlZWtNb2RlKW1vZGUpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChuZWVkTm90aWZ5KSB7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmeURyaXZlclNlZWtDb21wbGV0ZShtU3JjSWQpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlEcml2ZXJTZWVrQ29tcGxldGUobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBzZWVrcyBjYW4gdGFrZSBhIHdoaWxlLCBzbyB3ZSBlc3NlbnRpYWxseSBwYXVzZWQKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1BBVVNFRCwgMCwgMCk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfUEFVU0VELCAwLCAwKTsKIAogICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCiAgICAgICAgICAgICAgICAgICAgIG5ldyBGbHVzaERlY29kZXJBY3Rpb24oRkxVU0hfQ01EX0ZMVVNIIC8qIGF1ZGlvICovLApAQCAtMTUyNywxMCArMTU2OSw0OSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0UmV3aW5kOgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HVigia1doYXRSZXdpbmQiKTsKKworICAgICAgICAgICAgaW50NjRfdCBzZWVrVGltZVVzID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1TdGFydFRpbWVVczsKKyAgICAgICAgICAgIGludDMyX3QgbW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX0NMT1NFU1Q7CisKKyAgICAgICAgICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1Tb3VyY2VTdGFydGVkKSB7CisgICAgICAgICAgICAgICAgICAgIG1Tb3VyY2VTdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBlcmZvcm1TZWVrKHNlZWtUaW1lVXMsIChNZWRpYVBsYXllcjJTZWVrTW9kZSltb2RlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc2Vla3MgY2FuIHRha2UgYSB3aGlsZSwgc28gd2UgZXNzZW50aWFsbHkgcGF1c2VkCisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfUEFVU0VELCAwLCAwKTsKKworICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgIG5ldyBGbHVzaERlY29kZXJBY3Rpb24oRkxVU0hfQ01EX0ZMVVNIIC8qIGF1ZGlvICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMVVNIX0NNRF9GTFVTSCAvKiB2aWRlbyAqLykpOworCisgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgbmV3IFNlZWtBY3Rpb24oc2Vla1RpbWVVcywgKE1lZGlhUGxheWVyMlNlZWtNb2RlKW1vZGUpKTsKKworICAgICAgICAgICAgLy8gQWZ0ZXIgYSBmbHVzaCB3aXRob3V0IHNodXRkb3duLCBkZWNvZGVyIGlzIHBhdXNlZC4KKyAgICAgICAgICAgIC8vIERvbid0IHJlc3VtZSBpdCB1bnRpbCBzb3VyY2Ugc2VlayBpcyBkb25lLCBvdGhlcndpc2UgaXQgY291bGQKKyAgICAgICAgICAgIC8vIHN0YXJ0IHB1bGxpbmcgc3RhbGUgZGF0YSB0b28gc29vbi4KKyAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICBuZXcgUmVzdW1lRGVjb2RlckFjdGlvbihmYWxzZSAvKiBuZWVkTm90aWZ5ICovKSk7CisKKyAgICAgICAgICAgIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBrV2hhdFBhdXNlOgogICAgICAgICB7CisgICAgICAgICAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgICAgICAgICAgb25TdGFydChmYWxzZSAvKiBwbGF5ICovKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG9uUGF1c2UoKTsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1BBVVNFRCwgMCwgMCk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfUEFVU0VELCAwLCAwKTsKICAgICAgICAgICAgIG1QYXVzZWRCeUNsaWVudCA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTU2MSw3ICsxNjQyLDcgQEAKIAogICAgICAgICBjYXNlIGtXaGF0UmVsZWFzZURybToKICAgICAgICAgewotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb25SZWxlYXNlRHJtKCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvblJlbGVhc2VEcm0obXNnKTsKIAogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwogICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJzdGF0dXMiLCBzdGF0dXMpOwpAQCAtMTU4Myw4ICsxNjY0LDggQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBtUGF1c2VkID0gZmFsc2U7Ci0gICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBtU291cmNlLT5yZXN1bWUoKTsKKyAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+cmVzdW1lKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1coInJlc3VtZSBjYWxsZWQgd2hlbiBzb3VyY2UgaXMgZ29uZSBvciBub3Qgc2V0Iik7CiAgICAgfQpAQCAtMTYwMiwxMiArMTY4MywxMiBAQAogICAgIHN0YXJ0UGxheWJhY2tUaW1lcigib25yZXN1bWUiKTsKIH0KIAotdm9pZCBOdVBsYXllcjI6Om9uU3RhcnQoKSB7Ci0gICAgQUxPR1YoIm9uU3RhcnQ6IG1DcnlwdG86ICVwIiwgbUNyeXB0by5nZXQoKSk7Cit2b2lkIE51UGxheWVyMjo6b25TdGFydChib29sIHBsYXkpIHsKKyAgICBBTE9HVigib25TdGFydDogbUNyeXB0bzogJXAiLCBtQ3VycmVudFNvdXJjZUluZm8ubUNyeXB0by5nZXQoKSk7CiAKICAgICBpZiAoIW1Tb3VyY2VTdGFydGVkKSB7CiAgICAgICAgIG1Tb3VyY2VTdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgbVNvdXJjZS0+c3RhcnQoKTsKKyAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnN0YXJ0KCk7CiAgICAgfQogCiAgICAgbU9mZmxvYWRBdWRpbyA9IGZhbHNlOwpAQCAtMTYxOCwyMiArMTY5OSwyMyBAQAogCiAgICAgdWludDMyX3QgZmxhZ3MgPSAwOwogCi0gICAgaWYgKG1Tb3VyY2UtPmlzUmVhbFRpbWUoKSkgeworICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+aXNSZWFsVGltZSgpKSB7CiAgICAgICAgIGZsYWdzIHw9IFJlbmRlcmVyOjpGTEFHX1JFQUxfVElNRTsKICAgICB9CiAKLSAgICBib29sIGhhc0F1ZGlvID0gKG1Tb3VyY2UtPmdldEZvcm1hdCh0cnVlIC8qIGF1ZGlvICovKSAhPSBOVUxMKTsKLSAgICBib29sIGhhc1ZpZGVvID0gKG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgIT0gTlVMTCk7CisgICAgYm9vbCBoYXNBdWRpbyA9IChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0KHRydWUgLyogYXVkaW8gKi8pICE9IE5VTEwpOworICAgIGJvb2wgaGFzVmlkZW8gPSAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgIT0gTlVMTCk7CiAgICAgaWYgKCFoYXNBdWRpbyAmJiAhaGFzVmlkZW8pIHsKICAgICAgICAgQUxPR0UoIm5vIG1ldGFkYXRhIGZvciBlaXRoZXIgYXVkaW8gb3IgdmlkZW8gc291cmNlIik7Ci0gICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnN0b3AoKTsKICAgICAgICAgbVNvdXJjZVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBFUlJPUl9NQUxGT1JNRUQpOworICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgIE1FRElBMl9FUlJPUl9VTktOT1dOLCBFUlJPUl9NQUxGT1JNRUQpOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIEFMT0dWX0lGKCFoYXNBdWRpbywgIm5vIG1ldGFkYXRhIGZvciBhdWRpbyBzb3VyY2UiKTsgIC8vIHZpZGVvIG9ubHkgc3RyZWFtCiAKLSAgICBzcDxNZXRhRGF0YT4gYXVkaW9NZXRhID0gbVNvdXJjZS0+Z2V0Rm9ybWF0TWV0YSh0cnVlIC8qIGF1ZGlvICovKTsKKyAgICBzcDxNZXRhRGF0YT4gYXVkaW9NZXRhID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdE1ldGEodHJ1ZSAvKiBhdWRpbyAqLyk7CiAKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7CiAgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCkgewpAQCAtMTY0MSwxMSArMTcyMywxMiBAQAogICAgIH0KIAogICAgIG1PZmZsb2FkQXVkaW8gPQotICAgICAgICBjYW5PZmZsb2FkU3RyZWFtKGF1ZGlvTWV0YSwgaGFzVmlkZW8sIG1Tb3VyY2UtPmlzU3RyZWFtaW5nKCksIHN0cmVhbVR5cGUpCisgICAgICAgIEpNZWRpYVBsYXllcjJVdGlsczo6aXNPZmZsb2FkZWRBdWRpb1BsYXliYWNrU3VwcG9ydGVkKAorICAgICAgICAgICAgICAgIGF1ZGlvTWV0YSwgaGFzVmlkZW8sIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5pc1N0cmVhbWluZygpLCBzdHJlYW1UeXBlKQogICAgICAgICAgICAgICAgICYmIChtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQgPT0gMS5mICYmIG1QbGF5YmFja1NldHRpbmdzLm1QaXRjaCA9PSAxLmYpOwogCiAgICAgLy8gTW9kdWxhciBEUk06IERpc2FibGluZyBhdWRpbyBvZmZsb2FkIGlmIHRoZSBzb3VyY2UgaXMgcHJvdGVjdGVkCi0gICAgaWYgKG1PZmZsb2FkQXVkaW8gJiYgbUlzRHJtUHJvdGVjdGVkKSB7CisgICAgaWYgKG1PZmZsb2FkQXVkaW8gJiYgbUN1cnJlbnRTb3VyY2VJbmZvLm1Jc0RybVByb3RlY3RlZCkgewogICAgICAgICBtT2ZmbG9hZEF1ZGlvID0gZmFsc2U7CiAgICAgICAgIEFMT0dWKCJvblN0YXJ0OiBEaXNhYmxpbmcgbU9mZmxvYWRBdWRpbyBub3cgdGhhdCB0aGUgc291cmNlIGlzIHByb3RlY3RlZC4iKTsKICAgICB9CkBAIC0xNjU3LDE3ICsxNzQwLDE3IEBACiAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFJlbmRlcmVyTm90aWZ5LCB0aGlzKTsKICAgICArK21SZW5kZXJlckdlbmVyYXRpb247CiAgICAgbm90aWZ5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1SZW5kZXJlckdlbmVyYXRpb24pOwotICAgIG1SZW5kZXJlciA9IG5ldyBSZW5kZXJlcihtQXVkaW9TaW5rLCBtTWVkaWFDbG9jaywgbm90aWZ5LCBmbGFncyk7CisgICAgbVJlbmRlcmVyID0gbmV3IFJlbmRlcmVyKG1BdWRpb1NpbmssIG1NZWRpYUNsb2NrLCBub3RpZnksIG1Db250ZXh0LCBmbGFncyk7CiAgICAgbVJlbmRlcmVyTG9vcGVyID0gbmV3IEFMb29wZXI7Ci0gICAgbVJlbmRlcmVyTG9vcGVyLT5zZXROYW1lKCJOdVBsYXllclJlbmRlcmVyIik7Ci0gICAgbVJlbmRlcmVyTG9vcGVyLT5zdGFydChmYWxzZSwgZmFsc2UsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOworICAgIG1SZW5kZXJlckxvb3Blci0+c2V0TmFtZSgiTnVQbGF5ZXIyUmVuZGVyZXIiKTsKKyAgICBtUmVuZGVyZXJMb29wZXItPnN0YXJ0KGZhbHNlLCB0cnVlLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKICAgICBtUmVuZGVyZXJMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtUmVuZGVyZXIpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gbVJlbmRlcmVyLT5zZXRQbGF5YmFja1NldHRpbmdzKG1QbGF5YmFja1NldHRpbmdzKTsKICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnN0b3AoKTsKICAgICAgICAgbVNvdXJjZVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBlcnIpOworICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBlcnIpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0xNjc2LDYgKzE3NTksMTIgQEAKICAgICAgICAgbVJlbmRlcmVyLT5zZXRWaWRlb0ZyYW1lUmF0ZShyYXRlKTsKICAgICB9CiAKKyAgICBhZGRFbmRUaW1lTW9uaXRvcigpOworICAgIC8vIFJlbmRlcmVyIGlzIGNyZWF0ZWQgaW4gcGF1c2VkIHN0YXRlLgorICAgIGlmIChwbGF5KSB7CisgICAgICAgIG1SZW5kZXJlci0+cmVzdW1lKCk7CisgICAgfQorCiAgICAgaWYgKG1WaWRlb0RlY29kZXIgIT0gTlVMTCkgewogICAgICAgICBtVmlkZW9EZWNvZGVyLT5zZXRSZW5kZXJlcihtUmVuZGVyZXIpOwogICAgIH0KQEAgLTE2ODQsMTAgKzE3NzMsMjMgQEAKICAgICB9CiAKICAgICBzdGFydFBsYXliYWNrVGltZXIoIm9uc3RhcnQiKTsKKyAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fREFUQV9TT1VSQ0VfU1RBUlQsIDApOwogCiAgICAgcG9zdFNjYW5Tb3VyY2VzKCk7CiB9CiAKK3ZvaWQgTnVQbGF5ZXIyOjphZGRFbmRUaW1lTW9uaXRvcigpIHsKKyAgICArK21FT1NNb25pdG9yR2VuZXJhdGlvbjsKKworICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubUVuZFRpbWVVcyA9PSBEYXRhU291cmNlRGVzYzo6a01heFRpbWVVcykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEVPU01vbml0b3IsIHRoaXMpOworICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtRU9TTW9uaXRvckdlbmVyYXRpb24pOworICAgIG1NZWRpYUNsb2NrLT5hZGRUaW1lcihtc2csIG1DdXJyZW50U291cmNlSW5mby5tRW5kVGltZVVzKTsKK30KKwogdm9pZCBOdVBsYXllcjI6OnN0YXJ0UGxheWJhY2tUaW1lcihjb25zdCBjaGFyICp3aGVyZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtUGxheWluZ1RpbWVMb2NrKTsKICAgICBpZiAobUxhc3RTdGFydGVkUGxheWluZ1RpbWVOcyA9PSAwKSB7CkBAIC0xNzA5LDcgKzE4MTEsNyBAQAogICAgICAgICAgICAgQUxPR1YoInN0b3BQbGF5YmFja1RpbWVyKCkgIGxvZyAgJTIwIiBQUklkNjQgIiIsIHBsYXllZCk7CiAKICAgICAgICAgICAgIGlmIChwbGF5ZWQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlNb3JlUGxheWluZ1RpbWVVcyhtU3JjSWQsIChwbGF5ZWQrNTAwKS8xMDAwKTsKKyAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeU1vcmVQbGF5aW5nVGltZVVzKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIChwbGF5ZWQrNTAwKS8xMDAwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zID0gMDsKQEAgLTE3MjcsNyArMTgyOSw4IEBACiB2b2lkIE51UGxheWVyMjo6c3RvcFJlYnVmZmVyaW5nVGltZXIoYm9vbCBleGl0aW5nUGxheWJhY2spIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVBsYXlpbmdUaW1lTG9jayk7CiAKLSAgICBBTE9HVigic3RvcFJlYnVmZmVyVGltZXIoKSAgdGltZSAlMjAiIFBSSWQ2NCAiIChleGl0aW5nICVkKSIsIG1MYXN0U3RhcnRlZFJlYnVmZmVyaW5nVGltZU5zLCBleGl0aW5nUGxheWJhY2spOworICAgIEFMT0dWKCJzdG9wUmVidWZmZXJUaW1lcigpICB0aW1lICUyMCIgUFJJZDY0ICIgKGV4aXRpbmcgJWQpIiwKKyAgICAgICAgICBtTGFzdFN0YXJ0ZWRSZWJ1ZmZlcmluZ1RpbWVOcywgZXhpdGluZ1BsYXliYWNrKTsKIAogICAgIGlmIChtTGFzdFN0YXJ0ZWRSZWJ1ZmZlcmluZ1RpbWVOcyAhPSAwKSB7CiAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CkBAIC0xNzM3LDkgKzE4NDAsMTAgQEAKICAgICAgICAgICAgIEFMT0dWKCJzdG9wUmVidWZmZXJpbmdUaW1lcigpICBsb2cgICUyMCIgUFJJZDY0ICIiLCByZWJ1ZmZlcmVkKTsKIAogICAgICAgICAgICAgaWYgKHJlYnVmZmVyZWQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlNb3JlUmVidWZmZXJpbmdUaW1lVXMobVNyY0lkLCAocmVidWZmZXJlZCs1MDApLzEwMDApOworICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5TW9yZVJlYnVmZmVyaW5nVGltZVVzKAorICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgKHJlYnVmZmVyZWQrNTAwKS8xMDAwKTsKICAgICAgICAgICAgICAgICBpZiAoZXhpdGluZ1BsYXliYWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5UmVidWZmZXJpbmdXaGVuRXhpdChtU3JjSWQsIHRydWUpOworICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVJlYnVmZmVyaW5nV2hlbkV4aXQobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xNzU1LDggKzE4NTksOCBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIG1QYXVzZWQgPSB0cnVlOwotICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgbVNvdXJjZS0+cGF1c2UoKTsKKyAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+cGF1c2UoKTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HVygicGF1c2UgY2FsbGVkIHdoZW4gc291cmNlIGlzIGdvbmUgb3Igbm90IHNldCIpOwogICAgIH0KQEAgLTE4NDYsNyArMTk1MCw3IEBACiAKICAgICBzdGF0dXNfdCBlcnIgPSBtUmVuZGVyZXItPm9wZW5BdWRpb1NpbmsoCiAgICAgICAgICAgICBmb3JtYXQsIHRydWUgLyogb2ZmbG9hZE9ubHkgKi8sIGhhc1ZpZGVvLAotICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJm1PZmZsb2FkQXVkaW8sIG1Tb3VyY2UtPmlzU3RyZWFtaW5nKCkpOworICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJm1PZmZsb2FkQXVkaW8sIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5pc1N0cmVhbWluZygpKTsKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIC8vIEFueSBmYWlsdXJlIHdlIHR1cm4gb2ZmIG1PZmZsb2FkQXVkaW8uCiAgICAgICAgIG1PZmZsb2FkQXVkaW8gPSBmYWxzZTsKQEAgLTE4OTksNyArMjAwMyw3IEBACiB9CiAKIHZvaWQgTnVQbGF5ZXIyOjpkZXRlcm1pbmVBdWRpb01vZGVDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZhdWRpb0Zvcm1hdCkgewotICAgIGlmIChtU291cmNlID09IE5VTEwgfHwgbUF1ZGlvU2luayA9PSBOVUxMKSB7CisgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlID09IE5VTEwgfHwgbUF1ZGlvU2luayA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTE5MDksMTYgKzIwMTMsMTYgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHNwPE1ldGFEYXRhPiBhdWRpb01ldGEgPSBtU291cmNlLT5nZXRGb3JtYXRNZXRhKHRydWUgLyogYXVkaW8gKi8pOwotICAgIHNwPEFNZXNzYWdlPiB2aWRlb0Zvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLyk7CisgICAgc3A8TWV0YURhdGE+IGF1ZGlvTWV0YSA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXRNZXRhKHRydWUgLyogYXVkaW8gKi8pOworICAgIHNwPEFNZXNzYWdlPiB2aWRlb0Zvcm1hdCA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pOwogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSA9IG1BdWRpb1NpbmstPmdldEF1ZGlvU3RyZWFtVHlwZSgpOwogICAgIGNvbnN0IGJvb2wgaGFzVmlkZW8gPSAodmlkZW9Gb3JtYXQgIT0gTlVMTCk7Ci0gICAgYm9vbCBjYW5PZmZsb2FkID0gY2FuT2ZmbG9hZFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvTWV0YSwgaGFzVmlkZW8sIG1Tb3VyY2UtPmlzU3RyZWFtaW5nKCksIHN0cmVhbVR5cGUpCisgICAgYm9vbCBjYW5PZmZsb2FkID0gSk1lZGlhUGxheWVyMlV0aWxzOjppc09mZmxvYWRlZEF1ZGlvUGxheWJhY2tTdXBwb3J0ZWQoCisgICAgICAgICAgICBhdWRpb01ldGEsIGhhc1ZpZGVvLCBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+aXNTdHJlYW1pbmcoKSwgc3RyZWFtVHlwZSkKICAgICAgICAgICAgICAgICAgICAgJiYgKG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZCA9PSAxLmYgJiYgbVBsYXliYWNrU2V0dGluZ3MubVBpdGNoID09IDEuZik7CiAKICAgICAvLyBNb2R1bGFyIERSTTogRGlzYWJsaW5nIGF1ZGlvIG9mZmxvYWQgaWYgdGhlIHNvdXJjZSBpcyBwcm90ZWN0ZWQKLSAgICBpZiAoY2FuT2ZmbG9hZCAmJiBtSXNEcm1Qcm90ZWN0ZWQpIHsKKyAgICBpZiAoY2FuT2ZmbG9hZCAmJiBtQ3VycmVudFNvdXJjZUluZm8ubUlzRHJtUHJvdGVjdGVkKSB7CiAgICAgICAgIGNhbk9mZmxvYWQgPSBmYWxzZTsKICAgICAgICAgQUxPR1YoImRldGVybWluZUF1ZGlvTW9kZUNoYW5nZTogRGlzYWJsaW5nIG1PZmZsb2FkQXVkaW8gYi9jIHRoZSBzb3VyY2UgaXMgcHJvdGVjdGVkLiIpOwogICAgIH0KQEAgLTE5NDUsNyArMjA0OSw3IEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KGF1ZGlvKTsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdChhdWRpbyk7CiAKICAgICBpZiAoZm9ybWF0ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CkBAIC0xOTY3LDExICsyMDcxLDExIEBACiAgICAgICAgICAgICBtQ0NEZWNvZGVyID0gbmV3IENDRGVjb2RlcihjY05vdGlmeSk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX1NFQ1VSRSkgeworICAgICAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19TRUNVUkUpIHsKICAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInNlY3VyZSIsIHRydWUpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19QUk9URUNURUQpIHsKKyAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfUFJPVEVDVEVEKSB7CiAgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJwcm90ZWN0ZWQiLCB0cnVlKTsKICAgICAgICAgfQogCkBAIC0xOTkwLDE2ICsyMDk0LDE2IEBACiAgICAgICAgICAgICBkZXRlcm1pbmVBdWRpb01vZGVDaGFuZ2UoZm9ybWF0KTsKICAgICAgICAgfQogICAgICAgICBpZiAobU9mZmxvYWRBdWRpbykgewotICAgICAgICAgICAgbVNvdXJjZS0+c2V0T2ZmbG9hZEF1ZGlvKHRydWUgLyogb2ZmbG9hZCAqLyk7CisgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+c2V0T2ZmbG9hZEF1ZGlvKHRydWUgLyogb2ZmbG9hZCAqLyk7CiAKLSAgICAgICAgICAgIGNvbnN0IGJvb2wgaGFzVmlkZW8gPSAobVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qYXVkaW8gKi8pICE9IE5VTEwpOworICAgICAgICAgICAgY29uc3QgYm9vbCBoYXNWaWRlbyA9IChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qYXVkaW8gKi8pICE9IE5VTEwpOwogICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiaGFzLXZpZGVvIiwgaGFzVmlkZW8pOwotICAgICAgICAgICAgKmRlY29kZXIgPSBuZXcgRGVjb2RlclBhc3NUaHJvdWdoKG5vdGlmeSwgbVNvdXJjZSwgbVJlbmRlcmVyKTsKKyAgICAgICAgICAgICpkZWNvZGVyID0gbmV3IERlY29kZXJQYXNzVGhyb3VnaChub3RpZnksIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLCBtUmVuZGVyZXIpOwogICAgICAgICAgICAgQUxPR1YoImluc3RhbnRpYXRlRGVjb2RlciBhdWRpbyBEZWNvZGVyUGFzc1Rocm91Z2ggIGhhc1ZpZGVvOiAlZCIsIGhhc1ZpZGVvKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Tb3VyY2UtPnNldE9mZmxvYWRBdWRpbyhmYWxzZSAvKiBvZmZsb2FkICovKTsKKyAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5zZXRPZmZsb2FkQXVkaW8oZmFsc2UgLyogb2ZmbG9hZCAqLyk7CiAKLSAgICAgICAgICAgICpkZWNvZGVyID0gbmV3IERlY29kZXIobm90aWZ5LCBtU291cmNlLCBtUElELCBtVUlELCBtUmVuZGVyZXIpOworICAgICAgICAgICAgKmRlY29kZXIgPSBuZXcgRGVjb2Rlcihub3RpZnksIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLCBtUElELCBtVUlELCBtUmVuZGVyZXIpOwogICAgICAgICAgICAgQUxPR1YoImluc3RhbnRpYXRlRGVjb2RlciBhdWRpbyBEZWNvZGVyIik7CiAgICAgICAgIH0KICAgICAgICAgbUF1ZGlvRGVjb2RlckVycm9yID0gZmFsc2U7CkBAIC0yMDA5LDcgKzIxMTMsOCBAQAogICAgICAgICBub3RpZnktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVZpZGVvRGVjb2RlckdlbmVyYXRpb24pOwogCiAgICAgICAgICpkZWNvZGVyID0gbmV3IERlY29kZXIoCi0gICAgICAgICAgICAgICAgbm90aWZ5LCBtU291cmNlLCBtUElELCBtVUlELCBtUmVuZGVyZXIsIG1OYXRpdmVXaW5kb3csIG1DQ0RlY29kZXIpOworICAgICAgICAgICAgICAgIG5vdGlmeSwgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UsIG1QSUQsIG1VSUQsIG1SZW5kZXJlciwgbU5hdGl2ZVdpbmRvdywKKyAgICAgICAgICAgICAgICBtQ0NEZWNvZGVyKTsKICAgICAgICAgbVZpZGVvRGVjb2RlckVycm9yID0gZmFsc2U7CiAKICAgICAgICAgLy8gZW5hYmxlIEZSQyBpZiBoaWdoLXF1YWxpdHkgQVYgc3luYyBpcyByZXF1ZXN0ZWQsIGV2ZW4gaWYgbm90CkBAIC0yMDI0LDEwICsyMTI5LDExIEBACiAgICAgKCpkZWNvZGVyKS0+aW5pdCgpOwogCiAgICAgLy8gTW9kdWxhciBEUk0KLSAgICBpZiAobUlzRHJtUHJvdGVjdGVkKSB7Ci0gICAgICAgIGZvcm1hdC0+c2V0T2JqZWN0KCJjcnlwdG8iLCBtQ3J5cHRvKTsKLSAgICAgICAgQUxPR1YoImluc3RhbnRpYXRlRGVjb2RlcjogbUNyeXB0bzogJXAgaXNTZWN1cmU6ICVkIiwgbUNyeXB0by5nZXQoKSwKLSAgICAgICAgICAgICAgICAobVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX1NFQ1VSRSkgIT0gMCk7CisgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tSXNEcm1Qcm90ZWN0ZWQpIHsKKyAgICAgICAgZm9ybWF0LT5zZXRPYmplY3QoImNyeXB0byIsIG1DdXJyZW50U291cmNlSW5mby5tQ3J5cHRvKTsKKyAgICAgICAgQUxPR1YoImluc3RhbnRpYXRlRGVjb2RlcjogbUNyeXB0bzogJXAgaXNTZWN1cmU6ICVkIiwKKyAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubUNyeXB0by5nZXQoKSwKKyAgICAgICAgICAgICAgICAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19TRUNVUkUpICE9IDApOwogICAgIH0KIAogICAgICgqZGVjb2RlciktPmNvbmZpZ3VyZShmb3JtYXQpOwpAQCAtMjE0Niw3ICsyMjUyLDggQEAKICAgICAgICAgICAgIGRpc3BsYXlIZWlnaHQpOwogfQogCi12b2lkIE51UGxheWVyMjo6bm90aWZ5TGlzdGVuZXIoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKmluKSB7Cit2b2lkIE51UGxheWVyMjo6bm90aWZ5TGlzdGVuZXIoCisgICAgICAgIGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGxheWVyTWVzc2FnZSAqaW4pIHsKICAgICBpZiAobURyaXZlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0yMjMwLDggKzIzMzcsOSBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXIyOjpnZXRUcmFja0luZm8oUGFyY2VsKiByZXBseSkgY29uc3Qgeworc3RhdHVzX3QgTnVQbGF5ZXIyOjpnZXRUcmFja0luZm8oaW50NjRfdCBzcmNJZCwgUGxheWVyTWVzc2FnZSogcmVwbHkpIGNvbnN0IHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0VHJhY2tJbmZvLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDY0KCJzcmNJZCIsIHNyY0lkKTsKICAgICBtc2ctPnNldFBvaW50ZXIoInJlcGx5IiwgcmVwbHkpOwogCiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwpAQCAtMjIzOSw5ICsyMzQ3LDEwIEBACiAgICAgcmV0dXJuIGVycjsKIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXIyOjpnZXRTZWxlY3RlZFRyYWNrKGludDMyX3QgdHlwZSwgUGFyY2VsKiByZXBseSkgY29uc3Qgeworc3RhdHVzX3QgTnVQbGF5ZXIyOjpnZXRTZWxlY3RlZFRyYWNrKGludDY0X3Qgc3JjSWQsIGludDMyX3QgdHlwZSwgUGxheWVyTWVzc2FnZSogcmVwbHkpIGNvbnN0IHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0U2VsZWN0ZWRUcmFjaywgdGhpcyk7CiAgICAgbXNnLT5zZXRQb2ludGVyKCJyZXBseSIsIHJlcGx5KTsKKyAgICBtc2ctPnNldEludDY0KCJzcmNJZCIsIHNyY0lkKTsKICAgICBtc2ctPnNldEludDMyKCJ0eXBlIiwgdHlwZSk7CiAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CkBAIC0yMjUyLDggKzIzNjEsOSBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKLXN0YXR1c190IE51UGxheWVyMjo6c2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0LCBpbnQ2NF90IHRpbWVVcykgeworc3RhdHVzX3QgTnVQbGF5ZXIyOjpzZWxlY3RUcmFjayhpbnQ2NF90IHNyY0lkLCBzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QsIGludDY0X3QgdGltZVVzKSB7CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbGVjdFRyYWNrLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDY0KCJzcmNJZCIsIHNyY0lkKTsKICAgICBtc2ctPnNldFNpemUoInRyYWNrSW5kZXgiLCB0cmFja0luZGV4KTsKICAgICBtc2ctPnNldEludDMyKCJzZWxlY3QiLCBzZWxlY3QpOwogICAgIG1zZy0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CkBAIC0yMjk0LDExICsyNDA0LDExIEBACiB9CiAKIHNwPE1ldGFEYXRhPiBOdVBsYXllcjI6OmdldEZpbGVNZXRhKCkgewotICAgIHJldHVybiBtU291cmNlLT5nZXRGaWxlRm9ybWF0TWV0YSgpOworICAgIHJldHVybiBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0RmlsZUZvcm1hdE1ldGEoKTsKIH0KIAogZmxvYXQgTnVQbGF5ZXIyOjpnZXRGcmFtZVJhdGUoKSB7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtU291cmNlLT5nZXRGb3JtYXRNZXRhKGZhbHNlIC8qIGF1ZGlvICovKTsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXRNZXRhKGZhbHNlIC8qIGF1ZGlvICovKTsKICAgICBpZiAobWV0YSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTIzNTYsMTYgKzI0NjYsMTYgQEAKICAgICBBTE9HVigicGVyZm9ybVNlZWsgc2Vla1RpbWVVcz0lbGxkIHVzICglLjJmIHNlY3MpLCBtb2RlPSVkIiwKICAgICAgICAgICAobG9uZyBsb25nKXNlZWtUaW1lVXMsIHNlZWtUaW1lVXMgLyAxRTYsIG1vZGUpOwogCi0gICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgeworICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgIC8vIFRoaXMgaGFwcGVucyB3aGVuIHJlc2V0IG9jY3VycyByaWdodCBiZWZvcmUgdGhlIGxvb3AgbW9kZQogICAgICAgICAvLyBhc3luY2hyb25vdXNseSBzZWVrcyB0byB0aGUgc3RhcnQgb2YgdGhlIHN0cmVhbS4KICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtQXVkaW9EZWNvZGVyICE9IE5VTEwgfHwgbVZpZGVvRGVjb2RlciAhPSBOVUxMLAotICAgICAgICAgICAgICAgICJtU291cmNlIGlzIE5VTEwgYW5kIGRlY29kZXJzIG5vdCBOVUxMIGF1ZGlvKCVwKSB2aWRlbyglcCkiLAorICAgICAgICAgICAgICAgICJtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSBpcyBOVUxMIGFuZCBkZWNvZGVycyBub3QgTlVMTCBhdWRpbyglcCkgdmlkZW8oJXApIiwKICAgICAgICAgICAgICAgICBtQXVkaW9EZWNvZGVyLmdldCgpLCBtVmlkZW9EZWNvZGVyLmdldCgpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBtUHJldmlvdXNTZWVrVGltZVVzID0gc2Vla1RpbWVVczsKLSAgICBtU291cmNlLT5zZWVrVG8oc2Vla1RpbWVVcywgbW9kZSk7CisgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnNlZWtUbyhzZWVrVGltZVVzLCBtb2RlKTsKICAgICArK21UaW1lZFRleHRHZW5lcmF0aW9uOwogCiAgICAgLy8gZXZlcnl0aGluZydzIGZsdXNoZWQsIGNvbnRpbnVlIHBsYXliYWNrLgpAQCAtMjQxMiwxNyArMjUyMiwxMyBAQAogICAgIG1SZW5kZXJlci5jbGVhcigpOwogICAgICsrbVJlbmRlcmVyR2VuZXJhdGlvbjsKIAotICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgbVNvdXJjZS0+c3RvcCgpOwotCi0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU291cmNlTG9jayk7Ci0gICAgICAgIG1Tb3VyY2UuY2xlYXIoKTsKLSAgICB9CisgICAgcmVzZXRTb3VyY2VJbmZvKG1DdXJyZW50U291cmNlSW5mbyk7CisgICAgcmVzZXRTb3VyY2VJbmZvKG1OZXh0U291cmNlSW5mbyk7CiAKICAgICBpZiAobURyaXZlciAhPSBOVUxMKSB7CiAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlSZXNldENvbXBsZXRlKG1TcmNJZCk7CisgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVJlc2V0Q29tcGxldGUobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI0MzEsMTQgKzI1MzcsNiBAQAogICAgIG1SZXNldHRpbmcgPSBmYWxzZTsKICAgICBtU291cmNlU3RhcnRlZCA9IGZhbHNlOwogCi0gICAgLy8gTW9kdWxhciBEUk0KLSAgICBpZiAobUNyeXB0byAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIGRlY29kZXJzIHdpbGwgYmUgZmx1c2hlZCBiZWZvcmUgdGhpcyBzbyB0aGVpciBtQ3J5cHRvIHdvdWxkIGdvIGF3YXkgb24gdGhlaXIgb3duCi0gICAgICAgIC8vIFRPRE8gY2hhbmdlIHRvIEFMT0dWCi0gICAgICAgIEFMT0dEKCJwZXJmb3JtUmVzZXQgbUNyeXB0bzogJXAiLCBtQ3J5cHRvLmdldCgpKTsKLSAgICAgICAgbUNyeXB0by5jbGVhcigpOwotICAgIH0KLSAgICBtSXNEcm1Qcm90ZWN0ZWQgPSBmYWxzZTsKIH0KIAogdm9pZCBOdVBsYXllcjI6OnBlcmZvcm1QbGF5TmV4dERhdGFTb3VyY2UoKSB7CkBAIC0yNDU3LDI1ICsyNTU1LDMxIEBACiAKICAgICArK21SZW5kZXJlckdlbmVyYXRpb247CiAKLSAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+c3RvcCgpOwogICAgIH0KIAogICAgIGxvbmcgcHJldmlvdXNTcmNJZDsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU291cmNlTG9jayk7Ci0gICAgICAgIG1Tb3VyY2UgPSBtTmV4dFNvdXJjZTsKLSAgICAgICAgbU5leHRTb3VyY2UgPSBOVUxMOwotICAgICAgICBwcmV2aW91c1NyY0lkID0gbVNyY0lkOwotICAgICAgICBtU3JjSWQgPSBtTmV4dFNyY0lkOwotICAgICAgICArK21OZXh0U3JjSWQ7ICAvLyB0byBkaXN0aW5ndWlzaCB0aGUgdHdvIHNvdXJjZXMuCisgICAgICAgIHByZXZpb3VzU3JjSWQgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkOworCisgICAgICAgIG1DdXJyZW50U291cmNlSW5mbyA9IG1OZXh0U291cmNlSW5mbzsKKyAgICAgICAgbU5leHRTb3VyY2VJbmZvID0gU291cmNlSW5mbygpOworICAgICAgICBtTmV4dFNvdXJjZUluZm8ubVNyY0lkID0gfm1DdXJyZW50U291cmNlSW5mby5tU3JjSWQ7ICAvLyB0byBkaXN0aW5ndWlzaCB0aGUgdHdvIHNvdXJjZXMuCiAgICAgfQogCiAgICAgaWYgKG1Ecml2ZXIgIT0gTlVMTCkgewogICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwogICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKHByZXZpb3VzU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19QTEFZQkFDS19DT01QTEVURSwgMCk7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19TVEFSVEVEX0FTX05FWFQsIDApOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIocHJldmlvdXNTcmNJZCwgTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX0RBVEFfU09VUkNFX0VORCwgMCk7CisKKyAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LKSB7CisgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlEdXJhdGlvbihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBkdXJhdGlvblVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fREFUQV9TT1VSQ0VfU1RBUlQsIDApOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yNDg0LDIyICsyNTg4LDE1IEBACiAgICAgbVJlc2V0dGluZyA9IGZhbHNlOwogICAgIG1Tb3VyY2VTdGFydGVkID0gZmFsc2U7CiAKLSAgICAvLyBNb2R1bGFyIERSTQotICAgIGlmIChtQ3J5cHRvICE9IE5VTEwpIHsKLSAgICAgICAgLy8gZGVjb2RlcnMgd2lsbCBiZSBmbHVzaGVkIGJlZm9yZSB0aGlzIHNvIHRoZWlyIG1DcnlwdG8gd291bGQgZ28gYXdheSBvbiB0aGVpciBvd24KLSAgICAgICAgLy8gVE9ETyBjaGFuZ2UgdG8gQUxPR1YKLSAgICAgICAgQUxPR0QoInBlcmZvcm1SZXNldCBtQ3J5cHRvOiAlcCIsIG1DcnlwdG8uZ2V0KCkpOwotICAgICAgICBtQ3J5cHRvLmNsZWFyKCk7Ci0gICAgfQotICAgIG1Jc0RybVByb3RlY3RlZCA9IGZhbHNlOworICAgIGFkZEVuZFRpbWVNb25pdG9yKCk7CiAKICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKICAgICAgICAgbVJlbmRlcmVyLT5yZXN1bWUoKTsKICAgICB9CiAKLSAgICBvblN0YXJ0KCk7CisgICAgb25TdGFydCh0cnVlIC8qIHBsYXkgKi8pOwogICAgIG1QYXVzZWRCeUNsaWVudCA9IGZhbHNlOwotICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1NUQVJURUQsIDAsIDApOworICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9TVEFSVEVELCAwLCAwKTsKIH0KIAogdm9pZCBOdVBsYXllcjI6OnBlcmZvcm1TY2FuU291cmNlcygpIHsKQEAgLTI1MjUsNyArMjYyMiw3IEBACiAgICAgaWYgKG1Ecml2ZXIgIT0gTlVMTCkgewogICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwogICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5U2V0U3VyZmFjZUNvbXBsZXRlKG1TcmNJZCk7CisgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVNldFN1cmZhY2VDb21wbGV0ZShtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTI1NTcsNyArMjY1NCw3IEBACiB2b2lkIE51UGxheWVyMjo6ZmluaXNoUmVzdW1lKCkgewogICAgIGlmIChtUmVzdW1lUGVuZGluZykgewogICAgICAgICBtUmVzdW1lUGVuZGluZyA9IGZhbHNlOwotICAgICAgICBub3RpZnlEcml2ZXJTZWVrQ29tcGxldGUobVNyY0lkKTsKKyAgICAgICAgbm90aWZ5RHJpdmVyU2Vla0NvbXBsZXRlKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQpOwogICAgIH0KIH0KIApAQCAtMjU3OSwzNiArMjY3Niw1MCBAQAogICAgIHN3aXRjaCAod2hhdCkgewogICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXRQcmVwYXJlZDoKICAgICAgICAgewotICAgICAgICAgICAgQUxPR1YoIk51UGxheWVyMjo6b25Tb3VyY2VOb3RpZnkgU291cmNlOjprV2hhdFByZXBhcmVkIHNvdXJjZTogJXAiLCBtU291cmNlLmdldCgpKTsKLSAgICAgICAgICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgc3RhbGUgbm90aWZpY2F0aW9uIGZyb20gYSBzb3VyY2UgdGhhdCB3YXMKLSAgICAgICAgICAgICAgICAvLyBhc3luY2hyb25vdXNseSBwcmVwYXJpbmcgd2hlbiB0aGUgY2xpZW50IGNhbGxlZCByZXNldCgpLgotICAgICAgICAgICAgICAgIC8vIFdlIGhhbmRsZWQgdGhlIHJlc2V0LCB0aGUgc291cmNlIGlzIGdvbmUuCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludDMyX3QgZXJyOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIC8vIHNodXQgZG93biBwb3RlbnRpYWwgc2VjdXJlIGNvZGVjcyBpbiBjYXNlIGNsaWVudCBuZXZlciBjYWxscyByZXNldAotICAgICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZsdXNoRGVjb2RlckFjdGlvbihGTFVTSF9DTURfU0hVVERPV04gLyogYXVkaW8gKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMVVNIX0NNRF9TSFVURE9XTiAvKiB2aWRlbyAqLykpOwotICAgICAgICAgICAgICAgIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVByZXBhcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKLSAgICAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIC8vIG5vdGlmeSBkdXJhdGlvbiBmaXJzdCwgc28gdGhhdCBpdCdzIGRlZmluaXRlbHkgc2V0IHdoZW4KLSAgICAgICAgICAgICAgICAvLyB0aGUgYXBwIHJlY2VpdmVkIHRoZSAicHJlcGFyZSBjb21wbGV0ZSIgY2FsbGJhY2suCi0gICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOwotICAgICAgICAgICAgICAgIGlmIChtU291cmNlLT5nZXREdXJhdGlvbigmZHVyYXRpb25VcykgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlEdXJhdGlvbihzcmNJZCwgZHVyYXRpb25Vcyk7CisgICAgICAgICAgICBBTE9HVigiTnVQbGF5ZXIyOjpvblNvdXJjZU5vdGlmeSBTb3VyY2U6OmtXaGF0UHJlcGFyZWQgc291cmNlOiVwLCBJZCglbGxkKSIsCisgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS5nZXQoKSwgKGxvbmcgbG9uZylzcmNJZCk7CisgICAgICAgICAgICBpZiAoc3JjSWQgPT0gbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCkgeworICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBzdGFsZSBub3RpZmljYXRpb24gZnJvbSBhIHNvdXJjZSB0aGF0IHdhcworICAgICAgICAgICAgICAgICAgICAvLyBhc3luY2hyb25vdXNseSBwcmVwYXJpbmcgd2hlbiB0aGUgY2xpZW50IGNhbGxlZCByZXNldCgpLgorICAgICAgICAgICAgICAgICAgICAvLyBXZSBoYW5kbGVkIHRoZSByZXNldCwgdGhlIHNvdXJjZSBpcyBnb25lLgorICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlQcmVwYXJlQ29tcGxldGVkKHNyY0lkLCBlcnIpOworCisgICAgICAgICAgICAgICAgaW50MzJfdCBlcnI7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2h1dCBkb3duIHBvdGVudGlhbCBzZWN1cmUgY29kZWNzIGluIGNhc2UgY2xpZW50IG5ldmVyIGNhbGxzIHJlc2V0CisgICAgICAgICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGbHVzaERlY29kZXJBY3Rpb24oRkxVU0hfQ01EX1NIVVRET1dOIC8qIGF1ZGlvICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxVU0hfQ01EX1NIVVRET1dOIC8qIHZpZGVvICovKSk7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtUHJlcGFyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmeSBkdXJhdGlvbiBmaXJzdCwgc28gdGhhdCBpdCdzIGRlZmluaXRlbHkgc2V0IHdoZW4KKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGFwcCByZWNlaXZlZCB0aGUgInByZXBhcmUgY29tcGxldGUiIGNhbGxiYWNrLgorICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeUR1cmF0aW9uKHNyY0lkLCBkdXJhdGlvblVzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVByZXBhcmVDb21wbGV0ZWQoc3JjSWQsIGVycik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChzcmNJZCA9PSBtTmV4dFNvdXJjZUluZm8ubVNyY0lkKSB7CisgICAgICAgICAgICAgICAgaWYgKG1OZXh0U291cmNlSW5mby5tU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAvLyBzdGFsZQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZXJyOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVByZXBhcmVDb21wbGV0ZWQoc3JjSWQsIGVycik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBicmVhazsKQEAgLTI2MTcsMTUgKzI3MjgsMTUgQEAKICAgICAgICAgLy8gTW9kdWxhciBEUk0KICAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0RHJtSW5mbzoKICAgICAgICAgewotICAgICAgICAgICAgUGFyY2VsIHBhcmNlbDsKKyAgICAgICAgICAgIFBsYXllck1lc3NhZ2UgcGxheWVyTXNnOwogICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gZHJtSW5mbzsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEJ1ZmZlcigiZHJtSW5mbyIsICZkcm1JbmZvKSk7Ci0gICAgICAgICAgICBwYXJjZWwuc2V0RGF0YShkcm1JbmZvLT5kYXRhKCksIGRybUluZm8tPnNpemUoKSk7CisgICAgICAgICAgICBwbGF5ZXJNc2cuUGFyc2VGcm9tQXJyYXkoZHJtSW5mby0+ZGF0YSgpLCBkcm1JbmZvLT5zaXplKCkpOwogCi0gICAgICAgICAgICBBTE9HVigib25Tb3VyY2VOb3RpZnkoKSBrV2hhdERybUluZm8gTUVESUEyX0RSTV9JTkZPIGRybUluZm86ICVwICBwYXJjZWwgc2l6ZTogJXp1IiwKLSAgICAgICAgICAgICAgICAgICAgZHJtSW5mby5nZXQoKSwgcGFyY2VsLmRhdGFTaXplKCkpOworICAgICAgICAgICAgQUxPR1YoIm9uU291cmNlTm90aWZ5KCkga1doYXREcm1JbmZvIE1FRElBMl9EUk1fSU5GTyBkcm1JbmZvOiAlcCAgcGxheWVyTXNnIHNpemU6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgZHJtSW5mby5nZXQoKSwgcGxheWVyTXNnLkJ5dGVTaXplKCkpOwogCi0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihzcmNJZCwgTUVESUEyX0RSTV9JTkZPLCAwIC8qIGV4dDEgKi8sIDAgLyogZXh0MiAqLywgJnBhcmNlbCk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihzcmNJZCwgTUVESUEyX0RSTV9JTkZPLCAwIC8qIGV4dDEgKi8sIDAgLyogZXh0MiAqLywgJnBsYXllck1zZyk7CiAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yNjU0LDE5ICsyNzY1LDI2IEBACiAgICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5TGlzdGVuZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19OT1RfU0VFS0FCTEUsIDApOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeUZsYWdzQ2hhbmdlZChzcmNJZCwgZmxhZ3MpOworICAgICAgICAgICAgICAgIGlmIChzcmNJZCA9PSBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkKSB7CisgICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5RmxhZ3NDaGFuZ2VkKHNyY0lkLCBmbGFncyk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoKG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKQotICAgICAgICAgICAgICAgICAgICAmJiAoIShmbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKSkpIHsKLSAgICAgICAgICAgICAgICBjYW5jZWxQb2xsRHVyYXRpb24oKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIShtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikKLSAgICAgICAgICAgICAgICAgICAgJiYgKGZsYWdzICYgU291cmNlOjpGTEFHX0RZTkFNSUNfRFVSQVRJT04pCi0gICAgICAgICAgICAgICAgICAgICYmIChtQXVkaW9EZWNvZGVyICE9IE5VTEwgfHwgbVZpZGVvRGVjb2RlciAhPSBOVUxMKSkgewotICAgICAgICAgICAgICAgIHNjaGVkdWxlUG9sbER1cmF0aW9uKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3JjSWQgPT0gbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCkgeworICAgICAgICAgICAgICAgIGlmICgobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCEoZmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhbmNlbFBvbGxEdXJhdGlvbigpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIShtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX0RZTkFNSUNfRFVSQVRJT04pCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoZmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChtQXVkaW9EZWNvZGVyICE9IE5VTEwgfHwgbVZpZGVvRGVjb2RlciAhPSBOVUxMKSkgeworICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZVBvbGxEdXJhdGlvbigpOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbVNvdXJjZUZsYWdzID0gZmxhZ3M7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2VGbGFncyA9IGZsYWdzOworICAgICAgICAgICAgfSBlbHNlIGlmIChzcmNJZCA9PSBtTmV4dFNvdXJjZUluZm8ubVNyY0lkKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGR1cmF0aW9uIHBvbGxpbmcgZm9yIG5leHQgc291cmNlLgorICAgICAgICAgICAgICAgIG1OZXh0U291cmNlSW5mby5tU291cmNlRmxhZ3MgPSBmbGFnczsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTI4MTcsOCArMjkzNSw4IEBACiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRCdWZmZXIoImJ1ZmZlciIsICZidWZmZXIpKTsKIAogICAgICAgICAgICAgc2l6ZV90IGluYmFuZFRyYWNrcyA9IDA7Ci0gICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaW5iYW5kVHJhY2tzID0gbVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOworICAgICAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbmJhbmRUcmFja3MgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzZW5kU3VidGl0bGVEYXRhKGJ1ZmZlciwgaW5iYW5kVHJhY2tzKTsKQEAgLTI4MjcsNyArMjk0NSw3IEBACiAKICAgICAgICAgY2FzZSBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6a1doYXRUcmFja0FkZGVkOgogICAgICAgICB7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19NRVRBREFUQV9VUERBVEUsIDApOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX01FVEFEQVRBX1VQREFURSwgMCk7CiAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yODQ2LDM1ICsyOTY0LDMxIEBACiAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwogICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoImR1cmF0aW9uVXMiLCAmZHVyYXRpb25VcykpOwogCi0gICAgUGFyY2VsIGluOwotICAgIGluLndyaXRlSW50MzIodHJhY2tJbmRleCArIGJhc2VJbmRleCk7Ci0gICAgaW4ud3JpdGVJbnQ2NCh0aW1lVXMpOwotICAgIGluLndyaXRlSW50NjQoZHVyYXRpb25Vcyk7Ci0gICAgaW4ud3JpdGVJbnQzMihidWZmZXItPnNpemUoKSk7Ci0gICAgaW4ud3JpdGVJbnQzMihidWZmZXItPnNpemUoKSk7Ci0gICAgaW4ud3JpdGUoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBQbGF5ZXJNZXNzYWdlIHBsYXllck1zZzsKKyAgICBwbGF5ZXJNc2cuYWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUodHJhY2tJbmRleCArIGJhc2VJbmRleCk7CisgICAgcGxheWVyTXNnLmFkZF92YWx1ZXMoKS0+c2V0X2ludDY0X3ZhbHVlKHRpbWVVcyk7CisgICAgcGxheWVyTXNnLmFkZF92YWx1ZXMoKS0+c2V0X2ludDY0X3ZhbHVlKGR1cmF0aW9uVXMpOworICAgIHBsYXllck1zZy5hZGRfdmFsdWVzKCktPnNldF9ieXRlc192YWx1ZShidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOwogCi0gICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfU1VCVElUTEVfREFUQSwgMCwgMCwgJmluKTsKKyAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfU1VCVElUTEVfREFUQSwgMCwgMCwgJnBsYXllck1zZyk7CiB9CiAKIHZvaWQgTnVQbGF5ZXIyOjpzZW5kVGltZWRNZXRhRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CiAgICAgaW50NjRfdCB0aW1lVXM7CiAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwogCi0gICAgUGFyY2VsIGluOwotICAgIGluLndyaXRlSW50NjQodGltZVVzKTsKLSAgICBpbi53cml0ZUludDMyKGJ1ZmZlci0+c2l6ZSgpKTsKLSAgICBpbi53cml0ZUludDMyKGJ1ZmZlci0+c2l6ZSgpKTsKLSAgICBpbi53cml0ZShidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOworICAgIFBsYXllck1lc3NhZ2UgcGxheWVyTXNnOworICAgIHBsYXllck1zZy5hZGRfdmFsdWVzKCktPnNldF9pbnQ2NF92YWx1ZSh0aW1lVXMpOworICAgIHBsYXllck1zZy5hZGRfdmFsdWVzKCktPnNldF9ieXRlc192YWx1ZShidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOwogCi0gICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfTUVUQV9EQVRBLCAwLCAwLCAmaW4pOworICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9NRVRBX0RBVEEsIDAsIDAsICZwbGF5ZXJNc2cpOwogfQogCiB2b2lkIE51UGxheWVyMjo6c2VuZFRpbWVkVGV4dERhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgewogICAgIGNvbnN0IHZvaWQgKmRhdGE7CiAgICAgc2l6ZV90IHNpemUgPSAwOwogICAgIGludDY0X3QgdGltZVVzOwotICAgIGludDMyX3QgZmxhZyA9IFRleHREZXNjcmlwdGlvbnM6OklOX0JBTkRfVEVYVF8zR1BQOworICAgIGludDMyX3QgZmxhZyA9IFRleHREZXNjcmlwdGlvbnMyOjpJTl9CQU5EX1RFWFRfM0dQUDsKIAogICAgIEFTdHJpbmcgbWltZTsKICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7CkBAIC0yODgzLDI4ICsyOTk3LDI4IEBACiAgICAgZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOwogICAgIHNpemUgPSBidWZmZXItPnNpemUoKTsKIAotICAgIFBhcmNlbCBwYXJjZWw7CisgICAgUGxheWVyTWVzc2FnZSBwbGF5ZXJNc2c7CiAgICAgaWYgKHNpemUgPiAwKSB7CiAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKICAgICAgICAgaW50MzJfdCBnbG9iYWwgPSAwOwogICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiZ2xvYmFsIiwgJmdsb2JhbCkgJiYgZ2xvYmFsKSB7Ci0gICAgICAgICAgICBmbGFnIHw9IFRleHREZXNjcmlwdGlvbnM6OkdMT0JBTF9ERVNDUklQVElPTlM7CisgICAgICAgICAgICBmbGFnIHw9IFRleHREZXNjcmlwdGlvbnMyOjpHTE9CQUxfREVTQ1JJUFRJT05TOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmxhZyB8PSBUZXh0RGVzY3JpcHRpb25zOjpMT0NBTF9ERVNDUklQVElPTlM7CisgICAgICAgICAgICBmbGFnIHw9IFRleHREZXNjcmlwdGlvbnMyOjpMT0NBTF9ERVNDUklQVElPTlM7CiAgICAgICAgIH0KLSAgICAgICAgVGV4dERlc2NyaXB0aW9uczo6Z2V0UGFyY2VsT2ZEZXNjcmlwdGlvbnMoCi0gICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilkYXRhLCBzaXplLCBmbGFnLCB0aW1lVXMgLyAxMDAwLCAmcGFyY2VsKTsKKyAgICAgICAgVGV4dERlc2NyaXB0aW9uczI6OmdldFBsYXllck1lc3NhZ2VPZkRlc2NyaXB0aW9ucygKKyAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWRhdGEsIHNpemUsIGZsYWcsIHRpbWVVcyAvIDEwMDAsICZwbGF5ZXJNc2cpOwogICAgIH0KIAotICAgIGlmICgocGFyY2VsLmRhdGFTaXplKCkgPiAwKSkgewotICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9USU1FRF9URVhULCAwLCAwLCAmcGFyY2VsKTsKKyAgICBpZiAocGxheWVyTXNnLnZhbHVlc19zaXplKCkgPiAwKSB7CisgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9USU1FRF9URVhULCAwLCAwLCAmcGxheWVyTXNnKTsKICAgICB9IGVsc2UgeyAgLy8gc2VuZCBhbiBlbXB0eSB0aW1lZCB0ZXh0Ci0gICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1RJTUVEX1RFWFQsIDAsIDApOworICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfVElNRURfVEVYVCwgMCwgMCk7CiAgICAgfQogfQogCiBjb25zdCBjaGFyICpOdVBsYXllcjI6OmdldERhdGFTb3VyY2VUeXBlKCkgewotICAgIHN3aXRjaCAobURhdGFTb3VyY2VUeXBlKSB7CisgICAgc3dpdGNoIChtQ3VycmVudFNvdXJjZUluZm8ubURhdGFTb3VyY2VUeXBlKSB7CiAgICAgICAgIGNhc2UgREFUQV9TT1VSQ0VfVFlQRV9IVFRQX0xJVkU6CiAgICAgICAgICAgICByZXR1cm4gIkhUVFBMaXZlIjsKIApAQCAtMjkyNiw4ICszMDQwLDM0IEBACiAgICAgfQogIH0KIAorTnVQbGF5ZXIyOjpTb3VyY2VJbmZvKiBOdVBsYXllcjI6OmdldFNvdXJjZUluZm9CeUlkSW5Nc2coY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpbnQ2NF90IHNyY0lkOworICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzcmNJZCIsICZzcmNJZCkpOworICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkID09IHNyY0lkKSB7CisgICAgICAgIHJldHVybiAmbUN1cnJlbnRTb3VyY2VJbmZvOworICAgIH0gZWxzZSBpZiAobU5leHRTb3VyY2VJbmZvLm1TcmNJZCA9PSBzcmNJZCkgeworICAgICAgICByZXR1cm4gJm1OZXh0U291cmNlSW5mbzsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpyZXNldFNvdXJjZUluZm8oTnVQbGF5ZXIyOjpTb3VyY2VJbmZvICZzcmNJbmZvKSB7CisgICAgaWYgKHNyY0luZm8ubVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIHNyY0luZm8ubVNvdXJjZS0+c3RvcCgpOworCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU291cmNlTG9jayk7CisgICAgICAgIHNyY0luZm8ubVNvdXJjZS5jbGVhcigpOworICAgIH0KKyAgICAvLyBNb2R1bGFyIERSTQorICAgIEFMT0dEKCJwZXJmb3JtUmVzZXQgbUNyeXB0bzogJXAiLCBzcmNJbmZvLm1DcnlwdG8uZ2V0KCkpOworICAgIHNyY0luZm8ubUNyeXB0by5jbGVhcigpOworICAgIHNyY0luZm8ubUlzRHJtUHJvdGVjdGVkID0gZmFsc2U7Cit9CisKIC8vIE1vZHVsYXIgRFJNIGJlZ2luCi1zdGF0dXNfdCBOdVBsYXllcjI6OnByZXBhcmVEcm0oY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZkcm1TZXNzaW9uSWQpCitzdGF0dXNfdCBOdVBsYXllcjI6OnByZXBhcmVEcm0oCisgICAgICAgIGludDY0X3Qgc3JjSWQsIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmZHJtU2Vzc2lvbklkKQogewogICAgIEFMT0dWKCJwcmVwYXJlRHJtICIpOwogCkBAIC0yOTM3LDYgKzMwNzcsNyBAQAogICAgIHVpbnQ4X3QgVVVJRFsxNl07CiAgICAgbWVtY3B5KFVVSUQsIHV1aWQsIHNpemVvZihVVUlEKSk7CiAgICAgVmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZCA9IGRybVNlc3Npb25JZDsKKyAgICBtc2ctPnNldEludDY0KCJzcmNJZCIsIHNyY0lkKTsKICAgICBtc2ctPnNldFBvaW50ZXIoInV1aWQiLCAodm9pZCopVVVJRCk7CiAgICAgbXNnLT5zZXRQb2ludGVyKCJkcm1TZXNzaW9uSWQiLCAodm9pZCopJnNlc3Npb25JZCk7CiAKQEAgLTI5NTMsMTEgKzMwOTQsMTIgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBOdVBsYXllcjI6OnJlbGVhc2VEcm0oKQorc3RhdHVzX3QgTnVQbGF5ZXIyOjpyZWxlYXNlRHJtKGludDY0X3Qgc3JjSWQpCiB7CiAgICAgQUxPR1YoInJlbGVhc2VEcm0gIik7CiAKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVsZWFzZURybSwgdGhpcyk7CisgICAgbXNnLT5zZXRJbnQ2NCgic3JjSWQiLCBzcmNJZCk7CiAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOwpAQCAtMjk3OCw4ICszMTIwLDE1IEBACiAgICAgQUxPR0QoIm9uUHJlcGFyZURybSAiKTsKIAogICAgIHN0YXR1c190IHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIm9uUHJlcGFyZURybTogTm8gc291cmNlLiBvblByZXBhcmVEcm0gZmFpbGVkIHdpdGggJWQuIiwgc3RhdHVzKTsKKyAgICBTb3VyY2VJbmZvICpzcmNJbmZvID0gZ2V0U291cmNlSW5mb0J5SWRJbk1zZyhtc2cpOworICAgIGlmIChzcmNJbmZvID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBpbnQ2NF90IHNyY0lkID0gc3JjSW5mby0+bVNyY0lkOworICAgIGlmIChzcmNJbmZvLT5tU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIm9uUHJlcGFyZURybTogc3JjSW5mbyglbGxkKSBObyBzb3VyY2UuIG9uUHJlcGFyZURybSBmYWlsZWQgd2l0aCAlZC4iLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpc3JjSWQsIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCkBAIC0yOTkxLDQyICszMTQwLDUwIEBACiAgICAgc3RhdHVzID0gT0s7CiAgICAgc3A8QU1lZGlhQ3J5cHRvV3JhcHBlcj4gY3J5cHRvID0gTlVMTDsKIAotICAgIHN0YXR1cyA9IG1Tb3VyY2UtPnByZXBhcmVEcm0odXVpZCwgKmRybVNlc3Npb25JZCwgJmNyeXB0byk7CisgICAgc3RhdHVzID0gc3JjSW5mby0+bVNvdXJjZS0+cHJlcGFyZURybSh1dWlkLCAqZHJtU2Vzc2lvbklkLCAmY3J5cHRvKTsKICAgICBpZiAoY3J5cHRvID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIm9uUHJlcGFyZURybTogbVNvdXJjZS0+cHJlcGFyZURybSBmYWlsZWQuIHN0YXR1czogJWQiLCBzdGF0dXMpOworICAgICAgICBBTE9HRSgib25QcmVwYXJlRHJtOiBzcmNJbmZvKCVsbGQpLm1Tb3VyY2UtPnByZXBhcmVEcm0gZmFpbGVkLiBzdGF0dXM6ICVkIiwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKXNyY0lkLCBzdGF0dXMpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KLSAgICBBTE9HVigib25QcmVwYXJlRHJtOiBtU291cmNlLT5wcmVwYXJlRHJtIHN1Y2NlZWRlZCIpOworICAgIEFMT0dWKCJvblByZXBhcmVEcm06IHNyY0luZm8oJWxsZCkubVNvdXJjZS0+cHJlcGFyZURybSBzdWNjZWVkZWQiLCAobG9uZyBsb25nKXNyY0lkKTsKIAotICAgIGlmIChtQ3J5cHRvICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIm9uUHJlcGFyZURybTogVW5leHBlY3RlZC4gQWxyZWFkeSBoYXZpbmcgbUNyeXB0bzogJXAiLCBtQ3J5cHRvLmdldCgpKTsKLSAgICAgICAgbUNyeXB0by5jbGVhcigpOworICAgIGlmIChzcmNJbmZvLT5tQ3J5cHRvICE9IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIm9uUHJlcGFyZURybTogc3JjSW5mbyglbGxkKSBVbmV4cGVjdGVkLiBBbHJlYWR5IGhhdmluZyBtQ3J5cHRvOiAlcCIsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzcmNJZCwgc3JjSW5mby0+bUNyeXB0by5nZXQoKSk7CisgICAgICAgIHNyY0luZm8tPm1DcnlwdG8uY2xlYXIoKTsKICAgICB9CiAKLSAgICBtQ3J5cHRvID0gY3J5cHRvOwotICAgIG1Jc0RybVByb3RlY3RlZCA9IHRydWU7CisgICAgc3JjSW5mby0+bUNyeXB0byA9IGNyeXB0bzsKKyAgICBzcmNJbmZvLT5tSXNEcm1Qcm90ZWN0ZWQgPSB0cnVlOwogICAgIC8vIFRPRE8gY2hhbmdlIHRvIEFMT0dWCi0gICAgQUxPR0QoIm9uUHJlcGFyZURybTogbUNyeXB0bzogJXAiLCBtQ3J5cHRvLmdldCgpKTsKKyAgICBBTE9HRCgib25QcmVwYXJlRHJtOiBtQ3J5cHRvOiAlcCIsIHNyY0luZm8tPm1DcnlwdG8uZ2V0KCkpOwogCiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXIyOjpvblJlbGVhc2VEcm0oKQorc3RhdHVzX3QgTnVQbGF5ZXIyOjpvblJlbGVhc2VEcm0oY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpCiB7CiAgICAgLy8gVE9ETyBjaGFuZ2UgdG8gQUxPR1YKICAgICBBTE9HRCgib25SZWxlYXNlRHJtICIpOwotCi0gICAgaWYgKCFtSXNEcm1Qcm90ZWN0ZWQpIHsKLSAgICAgICAgQUxPR1coIm9uUmVsZWFzZURybTogVW5leHBlY3RlZC4gbUlzRHJtUHJvdGVjdGVkIGlzIGFscmVhZHkgZmFsc2UuIik7CisgICAgU291cmNlSW5mbyAqc3JjSW5mbyA9IGdldFNvdXJjZUluZm9CeUlkSW5Nc2cobXNnKTs7CisgICAgaWYgKHNyY0luZm8gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgbUlzRHJtUHJvdGVjdGVkID0gZmFsc2U7CisgICAgaW50NjRfdCBzcmNJZCA9IHNyY0luZm8tPm1TcmNJZDsKKyAgICBpZiAoIXNyY0luZm8tPm1Jc0RybVByb3RlY3RlZCkgeworICAgICAgICBBTE9HVygib25SZWxlYXNlRHJtOiBzcmNJbmZvKCVsbGQpIFVuZXhwZWN0ZWQuIG1Jc0RybVByb3RlY3RlZCBpcyBhbHJlYWR5IGZhbHNlLiIsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzcmNJZCk7CisgICAgfQorCisgICAgc3JjSW5mby0+bUlzRHJtUHJvdGVjdGVkID0gZmFsc2U7CiAKICAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgaWYgKG1DcnlwdG8gIT0gTlVMTCkgeworICAgIGlmIChzcmNJbmZvLT5tQ3J5cHRvICE9IE5VTEwpIHsKICAgICAgICAgLy8gbm90aWZ5aW5nIHRoZSBzb3VyY2UgZmlyc3QgYmVmb3JlIHJlbW92aW5nIGNyeXB0byBmcm9tIGNvZGVjCi0gICAgICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1Tb3VyY2UtPnJlbGVhc2VEcm0oKTsKKyAgICAgICAgaWYgKHNyY0luZm8tPm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgc3JjSW5mby0+bVNvdXJjZS0+cmVsZWFzZURybSgpOwogICAgICAgICB9CiAKICAgICAgICAgc3RhdHVzPU9LOwpAQCAtMzA0Nyw5ICszMjA0LDkgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIFRPRE8gY2hhbmdlIHRvIEFMT0dWCi0gICAgICAgIEFMT0dEKCJvblJlbGVhc2VEcm06IG1DcnlwdG86ICVwIiwgbUNyeXB0by5nZXQoKSk7Ci0gICAgICAgIG1DcnlwdG8uY2xlYXIoKTsKLSAgICB9IGVsc2UgeyAgIC8vIG1DcnlwdG8gPT0gTlVMTAorICAgICAgICBBTE9HRCgib25SZWxlYXNlRHJtOiBtQ3J5cHRvOiAlcCIsIHNyY0luZm8tPm1DcnlwdG8uZ2V0KCkpOworICAgICAgICBzcmNJbmZvLT5tQ3J5cHRvLmNsZWFyKCk7CisgICAgfSBlbHNlIHsgICAvLyBzcmNJbmZvLT5tQ3J5cHRvID09IE5VTEwKICAgICAgICAgQUxPR0UoIm9uUmVsZWFzZURybTogVW5leHBlY3RlZC4gVGhlcmUgaXMgbm8gY3J5cHRvLiIpOwogICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CkBAIC0zMTExLDQgKzMyNjgsMjQgQEAKICAgICBUUkVTUEFTUygpOwogfQogCitOdVBsYXllcjI6OlNvdXJjZUluZm86OlNvdXJjZUluZm8oKQorICAgIDogbURhdGFTb3VyY2VUeXBlKERBVEFfU09VUkNFX1RZUEVfTk9ORSksCisgICAgICBtU3JjSWQoMCksCisgICAgICBtU291cmNlRmxhZ3MoMCksCisgICAgICBtU3RhcnRUaW1lVXMoMCksCisgICAgICBtRW5kVGltZVVzKERhdGFTb3VyY2VEZXNjOjprTWF4VGltZVVzKSB7Cit9CisKK051UGxheWVyMjo6U291cmNlSW5mbyAmIE51UGxheWVyMjo6U291cmNlSW5mbzo6b3BlcmF0b3I9KGNvbnN0IE51UGxheWVyMjo6U291cmNlSW5mbyAmb3RoZXIpIHsKKyAgICBtU291cmNlID0gb3RoZXIubVNvdXJjZTsKKyAgICBtQ3J5cHRvID0gb3RoZXIubUNyeXB0bzsKKyAgICBtRGF0YVNvdXJjZVR5cGUgPSAoREFUQV9TT1VSQ0VfVFlQRSlvdGhlci5tRGF0YVNvdXJjZVR5cGU7CisgICAgbVNyY0lkID0gb3RoZXIubVNyY0lkOworICAgIG1Tb3VyY2VGbGFncyA9IG90aGVyLm1Tb3VyY2VGbGFnczsKKyAgICBtU3RhcnRUaW1lVXMgPSBvdGhlci5tU3RhcnRUaW1lVXM7CisgICAgbUVuZFRpbWVVcyA9IG90aGVyLm1FbmRUaW1lVXM7CisgICAgbUlzRHJtUHJvdGVjdGVkID0gb3RoZXIubUlzRHJtUHJvdGVjdGVkOworICAgIHJldHVybiAqdGhpczsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMi5oCmluZGV4IDk2Zjg1ZjkuLjc5OGM3MjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjIuaApAQCAtMjIsNiArMjIsMTEgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CiAKICNpbmNsdWRlIDxtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0pPYmplY3RIb2xkZXIuaD4KKworI2luY2x1ZGUgIm1lZGlhcGxheWVyMi5wYi5oIgorCit1c2luZyBhbmRyb2lkOjptZWRpYTo6TWVkaWFQbGF5ZXIyUHJvdG86OlBsYXllck1lc3NhZ2U7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzgsNyArNDMsOCBAQAogc3RydWN0IE51UGxheWVyMkRyaXZlcjsKIAogc3RydWN0IE51UGxheWVyMiA6IHB1YmxpYyBBSGFuZGxlciB7Ci0gICAgZXhwbGljaXQgTnVQbGF5ZXIyKHBpZF90IHBpZCwgdWlkX3QgdWlkLCBjb25zdCBzcDxNZWRpYUNsb2NrPiAmbWVkaWFDbG9jayk7CisgICAgZXhwbGljaXQgTnVQbGF5ZXIyKHBpZF90IHBpZCwgdWlkX3QgdWlkLAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gJm1lZGlhQ2xvY2ssIGNvbnN0IHNwPEpPYmplY3RIb2xkZXI+ICZjb250ZXh0KTsKIAogICAgIHZvaWQgc2V0RHJpdmVyKGNvbnN0IHdwPE51UGxheWVyMkRyaXZlcj4gJmRyaXZlcik7CiAKQEAgLTc1LDExICs4MSwxMiBAQAogICAgICAgICAgICAgaW50NjRfdCBzZWVrVGltZVVzLAogICAgICAgICAgICAgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMsCiAgICAgICAgICAgICBib29sIG5lZWROb3RpZnkgPSBmYWxzZSk7CisgICAgdm9pZCByZXdpbmQoKTsKIAogICAgIHN0YXR1c190IHNldFZpZGVvU2NhbGluZ01vZGUoaW50MzJfdCBtb2RlKTsKLSAgICBzdGF0dXNfdCBnZXRUcmFja0luZm8oUGFyY2VsKiByZXBseSkgY29uc3Q7Ci0gICAgc3RhdHVzX3QgZ2V0U2VsZWN0ZWRUcmFjayhpbnQzMl90IHR5cGUsIFBhcmNlbCogcmVwbHkpIGNvbnN0OwotICAgIHN0YXR1c190IHNlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCwgaW50NjRfdCB0aW1lVXMpOworICAgIHN0YXR1c190IGdldFRyYWNrSW5mbyhpbnQ2NF90IHNyY0lkLCBQbGF5ZXJNZXNzYWdlKiByZXBseSkgY29uc3Q7CisgICAgc3RhdHVzX3QgZ2V0U2VsZWN0ZWRUcmFjayhpbnQ2NF90IHNyY0lkLCBpbnQzMl90IHR5cGUsIFBsYXllck1lc3NhZ2UqIHJlcGx5KSBjb25zdDsKKyAgICBzdGF0dXNfdCBzZWxlY3RUcmFjayhpbnQ2NF90IHNyY0lkLCBzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QsIGludDY0X3QgdGltZVVzKTsKICAgICBzdGF0dXNfdCBnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbWVkaWFVcyk7CiAgICAgdm9pZCBnZXRTdGF0cyhWZWN0b3I8c3A8QU1lc3NhZ2U+ID4gKm1UcmFja1N0YXRzKTsKIApAQCAtODcsOCArOTQsOCBAQAogICAgIGZsb2F0IGdldEZyYW1lUmF0ZSgpOwogCiAgICAgLy8gTW9kdWxhciBEUk0KLSAgICBzdGF0dXNfdCBwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmZHJtU2Vzc2lvbklkKTsKLSAgICBzdGF0dXNfdCByZWxlYXNlRHJtKCk7CisgICAgc3RhdHVzX3QgcHJlcGFyZURybShpbnQ2NF90IHNyY0lkLCBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJmRybVNlc3Npb25JZCk7CisgICAgc3RhdHVzX3QgcmVsZWFzZURybShpbnQ2NF90IHNyY0lkKTsKIAogICAgIGNvbnN0IGNoYXIgKmdldERhdGFTb3VyY2VUeXBlKCk7CiAKQEAgLTE1MCw2ICsxNTcsMzIgQEAKICAgICAgICAga1doYXRTZXRCdWZmZXJpbmdTZXR0aW5ncyAgICAgICA9ICdzQnVTJywKICAgICAgICAga1doYXRQcmVwYXJlRHJtICAgICAgICAgICAgICAgICA9ICdwRHJtJywKICAgICAgICAga1doYXRSZWxlYXNlRHJtICAgICAgICAgICAgICAgICA9ICdyRHJtJywKKyAgICAgICAga1doYXRSZXdpbmQgICAgICAgICAgICAgICAgICAgICA9ICdyZVdkJywKKyAgICAgICAga1doYXRFT1NNb25pdG9yICAgICAgICAgICAgICAgICA9ICdlb3NNJywKKyAgICB9OworCisgICAgdHlwZWRlZiBlbnVtIHsKKyAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9OT05FLAorICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX0hUVFBfTElWRSwKKyAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9SVFNQLAorICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX0dFTkVSSUNfVVJMLAorICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX0dFTkVSSUNfRkQsCisgICAgICAgIERBVEFfU09VUkNFX1RZUEVfTUVESUEsCisgICAgfSBEQVRBX1NPVVJDRV9UWVBFOworCisgICAgc3RydWN0IFNvdXJjZUluZm8geworICAgICAgICBTb3VyY2VJbmZvKCk7CisgICAgICAgIFNvdXJjZUluZm8gJm9wZXJhdG9yPShjb25zdCBTb3VyY2VJbmZvICYpOworCisgICAgICAgIHNwPFNvdXJjZT4gbVNvdXJjZTsKKyAgICAgICAgc3RkOjphdG9taWM8REFUQV9TT1VSQ0VfVFlQRT4gbURhdGFTb3VyY2VUeXBlOworICAgICAgICBpbnQ2NF90IG1TcmNJZDsKKyAgICAgICAgdWludDMyX3QgbVNvdXJjZUZsYWdzOworICAgICAgICBpbnQ2NF90IG1TdGFydFRpbWVVczsKKyAgICAgICAgaW50NjRfdCBtRW5kVGltZVVzOworICAgICAgICAvLyBNb2R1bGFyIERSTQorICAgICAgICBzcDxBTWVkaWFDcnlwdG9XcmFwcGVyPiBtQ3J5cHRvOworICAgICAgICBib29sIG1Jc0RybVByb3RlY3RlZCA9IGZhbHNlOwogICAgIH07CiAKICAgICB3cDxOdVBsYXllcjJEcml2ZXI+IG1Ecml2ZXI7CkBAIC0xNTcsMTIgKzE5MCw4IEBACiAgICAgdWlkX3QgbVVJRDsKICAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiBtTWVkaWFDbG9jazsKICAgICBNdXRleCBtU291cmNlTG9jazsgIC8vIGd1YXJkIHxtU291cmNlfC4KLSAgICBzcDxTb3VyY2U+IG1Tb3VyY2U7Ci0gICAgaW50NjRfdCBtU3JjSWQ7Ci0gICAgdWludDMyX3QgbVNvdXJjZUZsYWdzOwotICAgIHNwPFNvdXJjZT4gbU5leHRTb3VyY2U7Ci0gICAgaW50NjRfdCBtTmV4dFNyY0lkOwotICAgIHVpbnQzMl90IG1OZXh0U291cmNlRmxhZ3M7CisgICAgU291cmNlSW5mbyBtQ3VycmVudFNvdXJjZUluZm87CisgICAgU291cmNlSW5mbyBtTmV4dFNvdXJjZUluZm87CiAgICAgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+IG1OYXRpdmVXaW5kb3c7CiAgICAgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlOjpBdWRpb1Npbms+IG1BdWRpb1Npbms7CiAgICAgc3A8RGVjb2RlckJhc2U+IG1WaWRlb0RlY29kZXI7CkBAIC0xNzQsNiArMjAzLDcgQEAKICAgICBpbnQzMl90IG1BdWRpb0RlY29kZXJHZW5lcmF0aW9uOwogICAgIGludDMyX3QgbVZpZGVvRGVjb2RlckdlbmVyYXRpb247CiAgICAgaW50MzJfdCBtUmVuZGVyZXJHZW5lcmF0aW9uOworICAgIGludDMyX3QgbUVPU01vbml0b3JHZW5lcmF0aW9uOwogCiAgICAgTXV0ZXggbVBsYXlpbmdUaW1lTG9jazsKICAgICBpbnQ2NF90IG1MYXN0U3RhcnRlZFBsYXlpbmdUaW1lTnM7CkBAIC0yNDQsMjEgKzI3NCw4IEBACiAgICAgLy8gUGF1c2Ugc3RhdGUgYXMgcmVxdWVzdGVkIGJ5IHNvdXJjZSAoaW50ZXJuYWxseSkgZHVlIHRvIGJ1ZmZlcmluZwogICAgIGJvb2wgbVBhdXNlZEZvckJ1ZmZlcmluZzsKIAotICAgIC8vIE1vZHVsYXIgRFJNCi0gICAgc3A8QU1lZGlhQ3J5cHRvV3JhcHBlcj4gbUNyeXB0bzsKLSAgICBib29sIG1Jc0RybVByb3RlY3RlZDsKLQotICAgIHR5cGVkZWYgZW51bSB7Ci0gICAgICAgIERBVEFfU09VUkNFX1RZUEVfTk9ORSwKLSAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9IVFRQX0xJVkUsCi0gICAgICAgIERBVEFfU09VUkNFX1RZUEVfUlRTUCwKLSAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9HRU5FUklDX1VSTCwKLSAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9HRU5FUklDX0ZELAotICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX01FRElBLAotICAgIH0gREFUQV9TT1VSQ0VfVFlQRTsKLQotICAgIHN0ZDo6YXRvbWljPERBVEFfU09VUkNFX1RZUEU+IG1EYXRhU291cmNlVHlwZTsKLSAgICBzdGQ6OmF0b21pYzxEQVRBX1NPVVJDRV9UWVBFPiBtTmV4dERhdGFTb3VyY2VUeXBlOworICAgIC8vIFBhc3NlZCBmcm9tIEpBVkEKKyAgICBjb25zdCBzcDxKT2JqZWN0SG9sZGVyPiBtQ29udGV4dDsKIAogICAgIGlubGluZSBjb25zdCBzcDxEZWNvZGVyQmFzZT4gJmdldERlY29kZXIoYm9vbCBhdWRpbykgewogICAgICAgICByZXR1cm4gYXVkaW8gPyBtQXVkaW9EZWNvZGVyIDogbVZpZGVvRGVjb2RlcjsKQEAgLTI5MiwxMiArMzA5LDE0IEBACiAgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmlucHV0Rm9ybWF0LAogICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQgPSBOVUxMKTsKIAotICAgIHZvaWQgbm90aWZ5TGlzdGVuZXIoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKmluID0gTlVMTCk7CisgICAgdm9pZCBub3RpZnlMaXN0ZW5lcihpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBsYXllck1lc3NhZ2UgKmluID0gTlVMTCk7CisKKyAgICB2b2lkIGFkZEVuZFRpbWVNb25pdG9yKCk7CiAKICAgICB2b2lkIGhhbmRsZUZsdXNoQ29tcGxldGUoYm9vbCBhdWRpbywgYm9vbCBpc0RlY29kZXIpOwogICAgIHZvaWQgZmluaXNoRmx1c2hJZlBvc3NpYmxlKCk7CiAKLSAgICB2b2lkIG9uU3RhcnQoKTsKKyAgICB2b2lkIG9uU3RhcnQoYm9vbCBwbGF5KTsKICAgICB2b2lkIG9uUmVzdW1lKCk7CiAgICAgdm9pZCBvblBhdXNlKCk7CiAKQEAgLTMzMywxMCArMzUyLDEzIEBACiAgICAgdm9pZCBzZW5kVGltZWRNZXRhRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKICAgICB2b2lkIHNlbmRUaW1lZFRleHREYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwogCi0gICAgdm9pZCB3cml0ZVRyYWNrSW5mbyhQYXJjZWwqIHJlcGx5LCBjb25zdCBzcDxBTWVzc2FnZT4mIGZvcm1hdCkgY29uc3Q7CisgICAgdm9pZCB3cml0ZVRyYWNrSW5mbyhQbGF5ZXJNZXNzYWdlKiByZXBseSwgY29uc3Qgc3A8QU1lc3NhZ2U+JiBmb3JtYXQpIGNvbnN0OwogCiAgICAgc3RhdHVzX3Qgb25QcmVwYXJlRHJtKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLSAgICBzdGF0dXNfdCBvblJlbGVhc2VEcm0oKTsKKyAgICBzdGF0dXNfdCBvblJlbGVhc2VEcm0oY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCisgICAgU291cmNlSW5mbyogZ2V0U291cmNlSW5mb0J5SWRJbk1zZyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCByZXNldFNvdXJjZUluZm8oU291cmNlSW5mbyAmc3JjSW5mbyk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhOdVBsYXllcjIpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyQ0NEZWNvZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyQ0NEZWNvZGVyLmNwcAppbmRleCBhMjM1NDZhLi45OGMzNDAzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkNDRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJDQ0RlY29kZXIuY3BwCkBAIC0xOTksNiArMTk5LDE4IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzc2l6ZV90IE51UGxheWVyMjo6Q0NEZWNvZGVyOjpnZXRTZWxlY3RlZFRyYWNrKG1lZGlhX3RyYWNrX3R5cGUgdHlwZSkgY29uc3QgeworICAgIGlmIChtU2VsZWN0ZWRUcmFjayAhPSAtMSkgeworICAgICAgICBDQ1RyYWNrIHRyYWNrID0gbVRyYWNrc1ttU2VsZWN0ZWRUcmFja107CisgICAgICAgIGlmICh0cmFjay5tVHJhY2tUeXBlID09IGtUcmFja1R5cGVDRUE2MDggfHwgdHJhY2subVRyYWNrVHlwZSA9PSBrVHJhY2tUeXBlQ0VBNzA4KSB7CisgICAgICAgICAgICByZXR1cm4gKHR5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSA/IG1TZWxlY3RlZFRyYWNrIDogLTEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAodHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1VOS05PV04gPyBtU2VsZWN0ZWRUcmFjayA6IC0xKTsKKyAgICB9CisKKyAgICByZXR1cm4gLTE7Cit9CisKIGJvb2wgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OmlzU2VsZWN0ZWQoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1TZWxlY3RlZFRyYWNrID49IDAgJiYgbVNlbGVjdGVkVHJhY2sgPCAoaW50MzJfdClnZXRUcmFja0NvdW50KCk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkNDRGVjb2Rlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJDQ0RlY29kZXIuaAppbmRleCA1N2Q1ZWEyLi45NzgzNGQxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkNDRGVjb2Rlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyQ0NEZWNvZGVyLmgKQEAgLTM4LDYgKzM4LDcgQEAKICAgICBzaXplX3QgZ2V0VHJhY2tDb3VudCgpIGNvbnN0OwogICAgIHNwPEFNZXNzYWdlPiBnZXRUcmFja0luZm8oc2l6ZV90IGluZGV4KSBjb25zdDsKICAgICBzdGF0dXNfdCBzZWxlY3RUcmFjayhzaXplX3QgaW5kZXgsIGJvb2wgc2VsZWN0KTsKKyAgICBzc2l6ZV90IGdldFNlbGVjdGVkVHJhY2sobWVkaWFfdHJhY2tfdHlwZSB0eXBlKSBjb25zdDsKICAgICBib29sIGlzU2VsZWN0ZWQoKSBjb25zdDsKICAgICB2b2lkIGRlY29kZShjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCk7CiAgICAgdm9pZCBkaXNwbGF5KGludDY0X3QgdGltZVVzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXIuY3BwCmluZGV4IGY1NzE4ZTEuLmE1YmQ2MmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyLmNwcApAQCAtMTA4OCw2ICsxMDg4LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxNZWRpYUJ1ZmZlckhvbGRlcio+KGhvbGRlci5nZXQoKSktPm1lZGlhQnVmZmVyKCkgOiBudWxscHRyOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAobWVkaWFCdWYgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobWVkaWFCdWYtPnNpemUoKSA+IGNvZGVjQnVmZmVyLT5jYXBhY2l0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcihFUlJPUl9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EZXF1ZXVlZElucHV0QnVmZmVycy5wdXNoX2JhY2soYnVmZmVySXgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPnNldFJhbmdlKDAsIG1lZGlhQnVmLT5zaXplKCkpOwogICAgICAgICAgICAgICAgICAgICBtZW1jcHkoY29kZWNCdWZmZXItPmRhdGEoKSwgbWVkaWFCdWYtPmRhdGEoKSwgbWVkaWFCdWYtPnNpemUoKSk7CiAKQEAgLTExMDIsNiArMTEwOCwxMSBAQAogICAgICAgICAgICAgfSAvLyBidWZmZXItPmRhdGEoKQogICAgICAgICB9IC8vIG5lZWRzQ29weQogCisgICAgICAgIHNwPFJlZkJhc2U+IGNyeXB0SW5mb09iajsKKyAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kT2JqZWN0KCJjcnlwdEluZm8iLCAmY3J5cHRJbmZvT2JqKSkgeworICAgICAgICAgICAgY3J5cHRJbmZvID0gc3RhdGljX2Nhc3Q8QU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlciAqPihjcnlwdEluZm9PYmouZ2V0KCkpOworICAgICAgICB9CisKICAgICAgICAgc3RhdHVzX3QgZXJyOwogICAgICAgICBpZiAoY3J5cHRJbmZvICE9IE5VTEwpIHsKICAgICAgICAgICAgIGVyciA9IG1Db2RlYy0+cXVldWVTZWN1cmVJbnB1dEJ1ZmZlcigKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2RlckJhc2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyQmFzZS5jcHAKaW5kZXggODc5MzBjNy4uOTE0ZjI5ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyQmFzZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyQmFzZS5jcHAKQEAgLTM4LDcgKzM4LDcgQEAKICAgICAvLyBFdmVyeSBkZWNvZGVyIGhhcyBpdHMgb3duIGxvb3BlciBiZWNhdXNlIE1lZGlhQ29kZWMgb3BlcmF0aW9ucwogICAgIC8vIGFyZSBibG9ja2luZywgYnV0IE51UGxheWVyMiBuZWVkcyBhc3luY2hyb25vdXMgb3BlcmF0aW9ucy4KICAgICBtRGVjb2Rlckxvb3BlciA9IG5ldyBBTG9vcGVyOwotICAgIG1EZWNvZGVyTG9vcGVyLT5zZXROYW1lKCJOUERlY29kZXIiKTsKKyAgICBtRGVjb2Rlckxvb3Blci0+c2V0TmFtZSgiTlAyRGVjb2RlciIpOwogICAgIG1EZWNvZGVyTG9vcGVyLT5zdGFydChmYWxzZSwgLyogcnVuT25DYWxsaW5nVGhyZWFkICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsICAvKiBjYW5DYWxsSmF2YSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJpdmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJpdmVyLmNwcAppbmRleCAzOThjMjQ2Li41NmU5NDcxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRyaXZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcml2ZXIuY3BwCkBAIC0zNyw0NSArMzcsNDcgQEAKIAogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUFuYWx5dGljc1NlcnZpY2UuaD4KIAordXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDsKK3VzaW5nIGFuZHJvaWQ6Om1lZGlhOjpNZWRpYVBsYXllcjJQcm90bzo6VmFsdWU7CisKIHN0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrUmV0cmllcyA9IDUwOwogc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tTbGVlcFVzID0gMjAwMDA7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IFBhcmNlbFdyYXBwZXIgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgc3RhdGljIHNwPFBhcmNlbFdyYXBwZXI+IENyZWF0ZShjb25zdCBQYXJjZWwgKnApIHsKK3N0cnVjdCBQbGF5ZXJNZXNzYWdlV3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBzdGF0aWMgc3A8UGxheWVyTWVzc2FnZVdyYXBwZXI+IENyZWF0ZShjb25zdCBQbGF5ZXJNZXNzYWdlICpwKSB7CiAgICAgICAgIGlmIChwICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHNwPFBhcmNlbFdyYXBwZXI+IHB3ID0gbmV3IFBhcmNlbFdyYXBwZXIoKTsKLSAgICAgICAgICAgIGlmIChwdy0+YXBwZW5kRnJvbShwKSA9PSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBwdzsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPFBsYXllck1lc3NhZ2VXcmFwcGVyPiBwdyA9IG5ldyBQbGF5ZXJNZXNzYWdlV3JhcHBlcigpOworICAgICAgICAgICAgcHctPmNvcHlGcm9tKHApOworICAgICAgICAgICAgcmV0dXJuIHB3OwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIGNvbnN0IFBhcmNlbCAqZ2V0UGFyY2VsKCkgewotICAgICAgICByZXR1cm4gbVBhcmNlbDsKKyAgICBjb25zdCBQbGF5ZXJNZXNzYWdlICpnZXRQbGF5ZXJNZXNzYWdlKCkgeworICAgICAgICByZXR1cm4gbVBsYXllck1lc3NhZ2U7CiAgICAgfQogCiBwcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+UGFyY2VsV3JhcHBlcigpIHsKLSAgICAgICAgaWYgKG1QYXJjZWwgIT0gTlVMTCkgewotICAgICAgICAgICAgZGVsZXRlIG1QYXJjZWw7CisgICAgdmlydHVhbCB+UGxheWVyTWVzc2FnZVdyYXBwZXIoKSB7CisgICAgICAgIGlmIChtUGxheWVyTWVzc2FnZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBkZWxldGUgbVBsYXllck1lc3NhZ2U7CiAgICAgICAgIH0KICAgICB9CiAKIHByaXZhdGU6Ci0gICAgUGFyY2VsV3JhcHBlcigpCi0gICAgICAgIDogbVBhcmNlbChOVUxMKSB7IH0KKyAgICBQbGF5ZXJNZXNzYWdlV3JhcHBlcigpCisgICAgICAgIDogbVBsYXllck1lc3NhZ2UoTlVMTCkgeyB9CiAKLSAgICBzdGF0dXNfdCBhcHBlbmRGcm9tKGNvbnN0IFBhcmNlbCAqcCkgewotICAgICAgICBpZiAobVBhcmNlbCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtUGFyY2VsID0gbmV3IFBhcmNlbDsKKyAgICB2b2lkIGNvcHlGcm9tKGNvbnN0IFBsYXllck1lc3NhZ2UgKnApIHsKKyAgICAgICAgaWYgKG1QbGF5ZXJNZXNzYWdlID09IE5VTEwpIHsKKyAgICAgICAgICAgIG1QbGF5ZXJNZXNzYWdlID0gbmV3IFBsYXllck1lc3NhZ2U7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1QYXJjZWwtPmFwcGVuZEZyb20ocCwgMCAvKiBzdGFydCAqLywgcC0+ZGF0YVNpemUoKSk7CisgICAgICAgIG1QbGF5ZXJNZXNzYWdlLT5Db3B5RnJvbSgqcCk7CiAgICAgfQogCi0gICAgUGFyY2VsICptUGFyY2VsOworICAgIFBsYXllck1lc3NhZ2UgKm1QbGF5ZXJNZXNzYWdlOwogfTsKIAogLy8ga2V5IGZvciBtZWRpYSBzdGF0aXN0aWNzCkBAIC0xMDYsNyArMTA4LDcgQEAKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyUmVidWZmZXJpbmdBdEV4aXQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5yZWJ1ZmZlckV4aXQiOwogCiAKLU51UGxheWVyMkRyaXZlcjo6TnVQbGF5ZXIyRHJpdmVyKHBpZF90IHBpZCwgdWlkX3QgdWlkKQorTnVQbGF5ZXIyRHJpdmVyOjpOdVBsYXllcjJEcml2ZXIocGlkX3QgcGlkLCB1aWRfdCB1aWQsIGNvbnN0IHNwPEpPYmplY3RIb2xkZXI+ICZjb250ZXh0KQogICAgIDogbVN0YXRlKFNUQVRFX0lETEUpLAogICAgICAgbUFzeW5jUmVzdWx0KFVOS05PV05fRVJST1IpLAogICAgICAgbVNyY0lkKDApLApAQCAtMTIxLDcgKzEyMyw3IEBACiAgICAgICBtTG9vcGVyKG5ldyBBTG9vcGVyKSwKICAgICAgIG1OdVBsYXllcjJMb29wZXIobmV3IEFMb29wZXIpLAogICAgICAgbU1lZGlhQ2xvY2sobmV3IE1lZGlhQ2xvY2spLAotICAgICAgbVBsYXllcihuZXcgTnVQbGF5ZXIyKHBpZCwgdWlkLCBtTWVkaWFDbG9jaykpLAorICAgICAgbVBsYXllcihuZXcgTnVQbGF5ZXIyKHBpZCwgdWlkLCBtTWVkaWFDbG9jaywgY29udGV4dCkpLAogICAgICAgbVBsYXllckZsYWdzKDApLAogICAgICAgbUFuYWx5dGljc0l0ZW0oTlVMTCksCiAgICAgICBtQ2xpZW50VWlkKHVpZCksCkBAIC0yNzMsMTMgKzI3NSw2IEBACiAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9QUkVQQVJJTkc7CiAgICAgICAgICAgICBtUGxheWVyLT5wcmVwYXJlQXN5bmMoKTsKICAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEOgotICAgICAgICAgICAgLy8gdGhpcyBpcyByZWFsbHkganVzdCBwYXVzZWQuIGhhbmRsZSBhcyBzZWVrIHRvIHN0YXJ0Ci0gICAgICAgICAgICBtQXRFT1MgPSBmYWxzZTsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUklORzsKLSAgICAgICAgICAgIG1QbGF5ZXItPnNlZWtUb0FzeW5jKDAsIE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMgLyogbW9kZSAqLywKLSAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBuZWVkTm90aWZ5ICovKTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9OwpAQCAtMjk0LDcgKzI4OSw2IEBACiBzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnN0YXJ0X2woKSB7CiAgICAgc3dpdGNoIChtU3RhdGUpIHsKICAgICAgICAgY2FzZSBTVEFURV9QQVVTRUQ6Ci0gICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQ6CiAgICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSRUQ6CiAgICAgICAgIHsKICAgICAgICAgICAgIG1QbGF5ZXItPnN0YXJ0KCk7CkBAIC0zMDQsNyArMjk4LDcgQEAKICAgICAgICAgY2FzZSBTVEFURV9SVU5OSU5HOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAobUF0RU9TKSB7Ci0gICAgICAgICAgICAgICAgbVBsYXllci0+c2Vla1RvQXN5bmMoMCk7CisgICAgICAgICAgICAgICAgbVBsYXllci0+cmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgbUF0RU9TID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgbVBvc2l0aW9uVXMgPSAtMTsKICAgICAgICAgICAgIH0KQEAgLTMyMCwzNCArMzE0LDYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6c3RvcCgpIHsKLSAgICBBTE9HRCgic3RvcCglcCkiLCB0aGlzKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgc3dpdGNoIChtU3RhdGUpIHsKLSAgICAgICAgY2FzZSBTVEFURV9SVU5OSU5HOgotICAgICAgICAgICAgbVBsYXllci0+cGF1c2UoKTsKLSAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAotCi0gICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRDsKLSAgICAgICAgICAgIC8vbm90aWZ5TGlzdGVuZXJfbChNRURJQTJfU1RPUFBFRCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUkVEOgotICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRUQ6Ci0gICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HOgotICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVEOgotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCiBzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnBhdXNlKCkgewogICAgIEFMT0dEKCJwYXVzZSglcCkiLCB0aGlzKTsKICAgICAvLyBUaGUgTnVQbGF5ZXJSZW5kZXJlciBtYXkgZ2V0IGZsdXNoZWQgaWYgcGF1c2UgZm9yIGxvbmcgZW5vdWdoLCBlLmcuIHRoZSBwYXVzZSB0aW1lb3V0IHRlYXIKQEAgLTM2MSw5ICszMjcsOSBAQAogCiAgICAgc3dpdGNoIChtU3RhdGUpIHsKICAgICAgICAgY2FzZSBTVEFURV9QQVVTRUQ6Ci0gICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSRUQ6CiAgICAgICAgICAgICByZXR1cm4gT0s7CiAKKyAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJFRDoKICAgICAgICAgY2FzZSBTVEFURV9SVU5OSU5HOgogICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfUEFVU0VEOwogICAgICAgICAgICAgbVBsYXllci0+cGF1c2UoKTsKQEAgLTM4NiwxNSArMzUyLDYgQEAKICAgICAgICAgLy8gdHJ5IHRvIHVwZGF0ZSBwb3NpdGlvbgogICAgICAgICBpbnQ2NF90IHVudXNlZDsKICAgICAgICAgZ2V0Q3VycmVudFBvc2l0aW9uKCZ1bnVzZWQpOwotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgICAgICBpZiAocmF0ZS5tU3BlZWQgPT0gMC5mICYmIG1TdGF0ZSA9PSBTVEFURV9SVU5OSU5HKSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9QQVVTRUQ7Ci0gICAgICAgIH0gZWxzZSBpZiAocmF0ZS5tU3BlZWQgIT0gMC5mCi0gICAgICAgICAgICAgICAgJiYgKG1TdGF0ZSA9PSBTVEFURV9QQVVTRUQKLSAgICAgICAgICAgICAgICAgICAgfHwgbVN0YXRlID09IFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVECi0gICAgICAgICAgICAgICAgICAgIHx8IG1TdGF0ZSA9PSBTVEFURV9QUkVQQVJFRCkpIHsKLSAgICAgICAgICAgIGVyciA9IHN0YXJ0X2woKTsKLSAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZXJyOwogfQpAQCAtNDE5LDcgKzM3Niw2IEBACiAKICAgICBzd2l0Y2ggKG1TdGF0ZSkgewogICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUkVEOgotICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVEOgogICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDoKICAgICAgICAgY2FzZSBTVEFURV9SVU5OSU5HOgogICAgICAgICB7CkBAIC02MDEsMTAgKzU1Nyw2IEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBpZiAobVN0YXRlICE9IFNUQVRFX1NUT1BQRUQpIHsKLSAgICAgICAgLy8gbm90aWZ5TGlzdGVuZXJfbChNRURJQTJfU1RPUFBFRCk7Ci0gICAgfQotCiAgICAgbVN0YXRlID0gU1RBVEVfUkVTRVRfSU5fUFJPR1JFU1M7CiAgICAgbVBsYXllci0+cmVzZXRBc3luYygpOwogCkBAIC02MzMsNTAgKzU4NSw1MSBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjppbnZva2UoY29uc3QgUGFyY2VsICZyZXF1ZXN0LCBQYXJjZWwgKnJlcGx5KSB7Ci0gICAgaWYgKHJlcGx5ID09IE5VTEwpIHsKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6aW52b2tlKGNvbnN0IFBsYXllck1lc3NhZ2UgJnJlcXVlc3QsIFBsYXllck1lc3NhZ2UgKnJlc3BvbnNlKSB7CisgICAgaWYgKHJlc3BvbnNlID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoInJlcGx5IGlzIGEgTlVMTCBwb2ludGVyIik7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgaW50MzJfdCBtZXRob2RJZDsKLSAgICBzdGF0dXNfdCByZXQgPSByZXF1ZXN0LnJlYWRJbnQzMigmbWV0aG9kSWQpOwotICAgIGlmIChyZXQgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZXRyaWV2ZSB0aGUgcmVxdWVzdGVkIG1ldGhvZCB0byBpbnZva2UsIGVyciglZCkiLCByZXQpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KKyAgICBSZXBlYXRlZFB0ckZpZWxkPGNvbnN0IFZhbHVlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSByZXF1ZXN0LnZhbHVlcygpLmNiZWdpbigpOworICAgIGludDMyX3QgbWV0aG9kSWQgPSAoaXQrKyktPmludDMyX3ZhbHVlKCk7CiAKICAgICBzd2l0Y2ggKG1ldGhvZElkKSB7CiAgICAgICAgIGNhc2UgTUVESUFfUExBWUVSMl9JTlZPS0VfSURfU0VUX1ZJREVPX1NDQUxJTkdfTU9ERToKICAgICAgICAgewotICAgICAgICAgICAgaW50IG1vZGUgPSByZXF1ZXN0LnJlYWRJbnQzMigpOworICAgICAgICAgICAgaW50IG1vZGUgPSAoaXQrKyktPmludDMyX3ZhbHVlKCk7CiAgICAgICAgICAgICByZXR1cm4gbVBsYXllci0+c2V0VmlkZW9TY2FsaW5nTW9kZShtb2RlKTsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgTUVESUFfUExBWUVSMl9JTlZPS0VfSURfR0VUX1RSQUNLX0lORk86CiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5nZXRUcmFja0luZm8ocmVwbHkpOworICAgICAgICAgICAgaW50NjRfdCBzcmNJZCA9IChpdCsrKS0+aW50NjRfdmFsdWUoKTsKKyAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5nZXRUcmFja0luZm8oc3JjSWQsIHJlc3BvbnNlKTsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgTUVESUFfUExBWUVSMl9JTlZPS0VfSURfU0VMRUNUX1RSQUNLOgogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgdHJhY2tJbmRleCA9IHJlcXVlc3QucmVhZEludDMyKCk7CisgICAgICAgICAgICBpbnQ2NF90IHNyY0lkID0gKGl0KyspLT5pbnQ2NF92YWx1ZSgpOworICAgICAgICAgICAgaW50IHRyYWNrSW5kZXggPSAoaXQrKyktPmludDMyX3ZhbHVlKCk7CiAgICAgICAgICAgICBpbnQ2NF90IG1zZWMgPSAwOwogICAgICAgICAgICAgLy8gZ2V0Q3VycmVudFBvc2l0aW9uIHNob3VsZCBhbHdheXMgcmV0dXJuIE9LCiAgICAgICAgICAgICBnZXRDdXJyZW50UG9zaXRpb24oJm1zZWMpOwotICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnNlbGVjdFRyYWNrKHRyYWNrSW5kZXgsIHRydWUgLyogc2VsZWN0ICovLCBtc2VjICogMTAwMExMKTsKKyAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5zZWxlY3RUcmFjayhzcmNJZCwgdHJhY2tJbmRleCwgdHJ1ZSAvKiBzZWxlY3QgKi8sIG1zZWMgKiAxMDAwTEwpOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBNRURJQV9QTEFZRVIyX0lOVk9LRV9JRF9VTlNFTEVDVF9UUkFDSzoKICAgICAgICAgewotICAgICAgICAgICAgaW50IHRyYWNrSW5kZXggPSByZXF1ZXN0LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnNlbGVjdFRyYWNrKHRyYWNrSW5kZXgsIGZhbHNlIC8qIHNlbGVjdCAqLywgMHhkZWFkYmVlZiAvKiBub3QgdXNlZCAqLyk7CisgICAgICAgICAgICBpbnQ2NF90IHNyY0lkID0gKGl0KyspLT5pbnQ2NF92YWx1ZSgpOworICAgICAgICAgICAgaW50IHRyYWNrSW5kZXggPSAoaXQrKyktPmludDMyX3ZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gbVBsYXllci0+c2VsZWN0VHJhY2soCisgICAgICAgICAgICAgICAgICAgIHNyY0lkLCB0cmFja0luZGV4LCBmYWxzZSAvKiBzZWxlY3QgKi8sIDB4ZGVhZGJlZWYgLyogbm90IHVzZWQgKi8pOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBNRURJQV9QTEFZRVIyX0lOVk9LRV9JRF9HRVRfU0VMRUNURURfVFJBQ0s6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGludDMyX3QgdHlwZSA9IHJlcXVlc3QucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXllci0+Z2V0U2VsZWN0ZWRUcmFjayh0eXBlLCByZXBseSk7CisgICAgICAgICAgICBpbnQ2NF90IHNyY0lkID0gKGl0KyspLT5pbnQ2NF92YWx1ZSgpOworICAgICAgICAgICAgaW50MzJfdCB0eXBlID0gKGl0KyspLT5pbnQzMl92YWx1ZSgpOworICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPmdldFNlbGVjdGVkVHJhY2soc3JjSWQsIHR5cGUsIHJlc3BvbnNlKTsKICAgICAgICAgfQogCiAgICAgICAgIGRlZmF1bHQ6CkBAIC03MDksMzMgKzY2Miw2IEBACiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQogCi1zdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OmdldE1ldGFkYXRhKAotICAgICAgICBjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgLyogaWRzICovLCBQYXJjZWwgKnJlY29yZHMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgdXNpbmcgbWVkaWE6Ok1ldGFkYXRhOwotCi0gICAgTWV0YWRhdGEgbWV0YShyZWNvcmRzKTsKLQotICAgIG1ldGEuYXBwZW5kQm9vbCgKLSAgICAgICAgICAgIE1ldGFkYXRhOjprUGF1c2VBdmFpbGFibGUsCi0gICAgICAgICAgICBtUGxheWVyRmxhZ3MgJiBOdVBsYXllcjI6OlNvdXJjZTo6RkxBR19DQU5fUEFVU0UpOwotCi0gICAgbWV0YS5hcHBlbmRCb29sKAotICAgICAgICAgICAgTWV0YWRhdGE6OmtTZWVrQmFja3dhcmRBdmFpbGFibGUsCi0gICAgICAgICAgICBtUGxheWVyRmxhZ3MgJiBOdVBsYXllcjI6OlNvdXJjZTo6RkxBR19DQU5fU0VFS19CQUNLV0FSRCk7Ci0KLSAgICBtZXRhLmFwcGVuZEJvb2woCi0gICAgICAgICAgICBNZXRhZGF0YTo6a1NlZWtGb3J3YXJkQXZhaWxhYmxlLAotICAgICAgICAgICAgbVBsYXllckZsYWdzICYgTnVQbGF5ZXIyOjpTb3VyY2U6OkZMQUdfQ0FOX1NFRUtfRk9SV0FSRCk7Ci0KLSAgICBtZXRhLmFwcGVuZEJvb2woCi0gICAgICAgICAgICBNZXRhZGF0YTo6a1NlZWtBdmFpbGFibGUsCi0gICAgICAgICAgICBtUGxheWVyRmxhZ3MgJiBOdVBsYXllcjI6OlNvdXJjZTo6RkxBR19DQU5fU0VFSyk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KIHZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpub3RpZnlSZXNldENvbXBsZXRlKGludDY0X3QgLyogc3JjSWQgKi8pIHsKICAgICBBTE9HRCgibm90aWZ5UmVzZXRDb21wbGV0ZSglcCkiLCB0aGlzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwpAQCAtNzgwLDIwICs3MDYsNyBAQAogICAgIEFMT0dWKCJub3RpZnlTZWVrQ29tcGxldGUoJXApIiwgdGhpcyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBtU2Vla0luUHJvZ3Jlc3MgPSBmYWxzZTsKLSAgICBub3RpZnlTZWVrQ29tcGxldGVfbChzcmNJZCk7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpub3RpZnlTZWVrQ29tcGxldGVfbChpbnQ2NF90IHNyY0lkKSB7Ci0gICAgYm9vbCB3YXNTZWVraW5nID0gdHJ1ZTsKLSAgICBpZiAobVN0YXRlID09IFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUklORykgewotICAgICAgICB3YXNTZWVraW5nID0gZmFsc2U7Ci0gICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVEOwotICAgICAgICBtQ29uZGl0aW9uLmJyb2FkY2FzdCgpOwotICAgIH0gZWxzZSBpZiAobVN0YXRlID09IFNUQVRFX1NUT1BQRUQpIHsKLSAgICAgICAgLy8gbm8gbmVlZCB0byBub3RpZnkgbGlzdGVuZXIKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBub3RpZnlMaXN0ZW5lcl9sKHNyY0lkLCB3YXNTZWVraW5nID8gTUVESUEyX1NFRUtfQ09NUExFVEUgOiBNRURJQTJfUFJFUEFSRUQpOworICAgIG5vdGlmeUxpc3RlbmVyX2woc3JjSWQsIE1FRElBMl9TRUVLX0NPTVBMRVRFKTsKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpkdW1wKApAQCAtODg0LDEyICs3OTcsMTIgQEAKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJtZXNzYWdlSWQiLCAmbXNnSWQpKTsKICAgICAgICAgICAgIG1zZy0+ZmluZEludDMyKCJleHQxIiwgJmV4dDEpOwogICAgICAgICAgICAgbXNnLT5maW5kSW50MzIoImV4dDIiLCAmZXh0Mik7Ci0gICAgICAgICAgICBzcDxQYXJjZWxXcmFwcGVyPiBpbjsKKyAgICAgICAgICAgIHNwPFBsYXllck1lc3NhZ2VXcmFwcGVyPiBpbjsKICAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKLSAgICAgICAgICAgIGlmIChtc2ctPmZpbmRPYmplY3QoInBhcmNlbCIsICZvYmopICYmIG9iaiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaW4gPSBzdGF0aWNfY2FzdDxQYXJjZWxXcmFwcGVyICo+KG9iai5nZXQoKSk7CisgICAgICAgICAgICBpZiAobXNnLT5maW5kT2JqZWN0KCJvYmoiLCAmb2JqKSAmJiBvYmogIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGluID0gc3RhdGljX2Nhc3Q8UGxheWVyTWVzc2FnZVdyYXBwZXIgKj4ob2JqLmdldCgpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlbmRFdmVudChzcmNJZCwgbXNnSWQsIGV4dDEsIGV4dDIsIChpbiA9PSBOVUxMID8gTlVMTCA6IGluLT5nZXRQYXJjZWwoKSkpOworICAgICAgICAgICAgc2VuZEV2ZW50KHNyY0lkLCBtc2dJZCwgZXh0MSwgZXh0MiwgKGluID09IE5VTEwgPyBOVUxMIDogaW4tPmdldFBsYXllck1lc3NhZ2UoKSkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKQEAgLTg5OCwxNiArODExLDE2IEBACiB9CiAKIHZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpub3RpZnlMaXN0ZW5lcigKLSAgICAgICAgaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKmluKSB7CisgICAgICAgIGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGxheWVyTWVzc2FnZSAqaW4pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIG5vdGlmeUxpc3RlbmVyX2woc3JjSWQsIG1zZywgZXh0MSwgZXh0MiwgaW4pOwogfQogCiB2b2lkIE51UGxheWVyMkRyaXZlcjo6bm90aWZ5TGlzdGVuZXJfbCgKLSAgICAgICAgaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKmluKSB7CisgICAgICAgIGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGxheWVyTWVzc2FnZSAqaW4pIHsKICAgICBBTE9HRCgibm90aWZ5TGlzdGVuZXJfbCglcCksICglbGxkLCAlZCwgJWQsICVkLCAlZCksIGxvb3Agc2V0dGluZyglZCwgJWQpIiwKICAgICAgICAgICAgIHRoaXMsIChsb25nIGxvbmcpc3JjSWQsIG1zZywgZXh0MSwgZXh0MiwKLSAgICAgICAgICAgIChpbiA9PSBOVUxMID8gLTEgOiAoaW50KWluLT5kYXRhU2l6ZSgpKSwgbUF1dG9Mb29wLCBtTG9vcGluZyk7CisgICAgICAgICAgICAoaW4gPT0gTlVMTCA/IC0xIDogKGludClpbi0+Qnl0ZVNpemUoKSksIG1BdXRvTG9vcCwgbUxvb3BpbmcpOwogICAgIGlmIChzcmNJZCA9PSBtU3JjSWQpIHsKICAgICAgICAgc3dpdGNoIChtc2cpIHsKICAgICAgICAgICAgIGNhc2UgTUVESUEyX1BMQVlCQUNLX0NPTVBMRVRFOgpAQCAtOTI0LDEzICs4MzcsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAobUxvb3BpbmcgfHwgbUF1dG9Mb29wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGxheWVyLT5zZWVrVG9Bc3luYygwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5ZXItPnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSByZW5kZXJlciBoYXMgc3RvcHBlZCB0aGUgc2luayBhdCB0aGUgZW5kIGluIG9yZGVyIHRvIHBsYXkgb3V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxhc3QgbGl0dGxlIGJpdCBvZiBhdWRpby4gSW4gbG9vcGluZyBtb2RlLCB3ZSBuZWVkIHRvIHJlc3RhcnQgaXQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RhcnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHNlbmQgY29tcGxldGlvbiBldmVudCB3aGVuIGxvb3BpbmcKKworICAgICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdE5vdGlmeUxpc3RlbmVyLCB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50NjQoInNyY0lkIiwgc3JjSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigibWVzc2FnZUlkIiwgTUVESUEyX0lORk8pOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiZXh0MSIsIE1FRElBMl9JTkZPX0RBVEFfU09VUkNFX1JFUEVBVCk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3QuZGVidWcuc2Yuc3RhdHMiLCBmYWxzZSkpIHsKQEAgLTk2OSw3ICs4ODcsNyBAQAogICAgIG5vdGlmeS0+c2V0SW50MzIoIm1lc3NhZ2VJZCIsIG1zZyk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigiZXh0MSIsIGV4dDEpOwogICAgIG5vdGlmeS0+c2V0SW50MzIoImV4dDIiLCBleHQyKTsKLSAgICBub3RpZnktPnNldE9iamVjdCgicGFyY2VsIiwgUGFyY2VsV3JhcHBlcjo6Q3JlYXRlKGluKSk7CisgICAgbm90aWZ5LT5zZXRPYmplY3QoIm9iaiIsIFBsYXllck1lc3NhZ2VXcmFwcGVyOjpDcmVhdGUoKFBsYXllck1lc3NhZ2UqKWluKSk7CiAgICAgbm90aWZ5LT5wb3N0KCk7CiB9CiAKQEAgLTEwMzYsMjQgKzk1NCwyNSBAQAogfQogCiAvLyBNb2R1bGFyIERSTQotc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmZHJtU2Vzc2lvbklkKQorc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpwcmVwYXJlRHJtKAorICAgICAgICBpbnQ2NF90IHNyY0lkLCBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJmRybVNlc3Npb25JZCkKIHsKICAgICBBTE9HVigicHJlcGFyZURybSglcCkgc3RhdGU6ICVkIiwgdGhpcywgbVN0YXRlKTsKIAogICAgIC8vIGxlYXZpbmcgdGhlIHN0YXRlIHZlcmlmaWNhdGlvbiBmb3IgbWVkaWFwbGF5ZXIuY3BwCi0gICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+cHJlcGFyZURybSh1dWlkLCBkcm1TZXNzaW9uSWQpOworICAgIHN0YXR1c190IHJldCA9IG1QbGF5ZXItPnByZXBhcmVEcm0oc3JjSWQsIHV1aWQsIGRybVNlc3Npb25JZCk7CiAKICAgICBBTE9HVigicHJlcGFyZURybSByZXQ6ICVkIiwgcmV0KTsKIAogICAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6cmVsZWFzZURybSgpCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnJlbGVhc2VEcm0oaW50NjRfdCBzcmNJZCkKIHsKICAgICBBTE9HVigicmVsZWFzZURybSglcCkgc3RhdGU6ICVkIiwgdGhpcywgbVN0YXRlKTsKIAogICAgIC8vIGxlYXZpbmcgdGhlIHN0YXRlIHZlcmlmaWNhdGlvbiBmb3IgbWVkaWFwbGF5ZXIuY3BwCi0gICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+cmVsZWFzZURybSgpOworICAgIHN0YXR1c190IHJldCA9IG1QbGF5ZXItPnJlbGVhc2VEcm0oc3JjSWQpOwogCiAgICAgQUxPR1YoInJlbGVhc2VEcm0gcmV0OiAlZCIsIHJldCk7CiAKQEAgLTEwNzMsOSArOTkyLDYgQEAKICAgICAgICAgY2FzZSBTVEFURV9SVU5OSU5HOiBydmFsID0gIlJVTk5JTkciOyBicmVhazsKICAgICAgICAgY2FzZSBTVEFURV9QQVVTRUQ6IHJ2YWwgPSAiUEFVU0VEIjsgYnJlYWs7CiAgICAgICAgIGNhc2UgU1RBVEVfUkVTRVRfSU5fUFJPR1JFU1M6IHJ2YWwgPSAiUkVTRVRfSU5fUFJPR1JFU1MiOyBicmVhazsKLSAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEOiBydmFsID0gIlNUT1BQRUQiOyBicmVhazsKLSAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJJTkc6IHJ2YWwgPSAiU1RPUFBFRF9BTkRfUFJFUEFSSU5HIjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQ6IHJ2YWwgPSAiU1RPUFBFRF9BTkRfUFJFUEFSRUQiOyBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIC8vIHllcywgdGhpcyBidWZmZXIgaXMgc2hhcmVkIGFuZCB2dWxuZXJhYmxlIHRvIHJhY2VzCiAgICAgICAgICAgICBzbnByaW50ZihyYXdidWZmZXIsIHNpemVvZihyYXdidWZmZXIpLCAiJWQiLCBzdGF0ZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRyaXZlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcml2ZXIuaAppbmRleCA0ZGEyNTY2Li4wZWMzYTRiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRyaXZlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJpdmVyLmgKQEAgLTE4LDYgKzE4LDcgQEAKIAogI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSk9iamVjdEhvbGRlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTI2LDcgKzI3LDcgQEAKIHN0cnVjdCBOdVBsYXllcjI7CiAKIHN0cnVjdCBOdVBsYXllcjJEcml2ZXIgOiBwdWJsaWMgTWVkaWFQbGF5ZXIySW50ZXJmYWNlIHsKLSAgICBleHBsaWNpdCBOdVBsYXllcjJEcml2ZXIocGlkX3QgcGlkLCB1aWRfdCB1aWQpOworICAgIGV4cGxpY2l0IE51UGxheWVyMkRyaXZlcihwaWRfdCBwaWQsIHVpZF90IHVpZCwgY29uc3Qgc3A8Sk9iamVjdEhvbGRlcj4gJmNvbnRleHQpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBvdmVycmlkZTsKIApAQCAtNDAsMzEgKzQxLDI4IEBACiAgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVBc3luYygpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7Ci0gICAgdmlydHVhbCBib29sIGlzUGxheWluZygpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcmF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlICpyYXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN5bmNTZXR0aW5ncyhjb25zdCBBVlN5bmNTZXR0aW5ncyAmc3luYywgZmxvYXQgdmlkZW9GcHNIaW50KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN5bmNTZXR0aW5ncyhBVlN5bmNTZXR0aW5ncyAqc3luYywgZmxvYXQgKnZpZGVvRnBzKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVBc3luYygpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBib29sIGlzUGxheWluZygpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcmF0ZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlICpyYXRlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN5bmNTZXR0aW5ncyhjb25zdCBBVlN5bmNTZXR0aW5ncyAmc3luYywgZmxvYXQgdmlkZW9GcHNIaW50KSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN5bmNTZXR0aW5ncyhBVlN5bmNTZXR0aW5ncyAqc3luYywgZmxvYXQgKnZpZGVvRnBzKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNlZWtUbygKLSAgICAgICAgICAgIGludDY0X3QgbXNlYywgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q3VycmVudFBvc2l0aW9uKGludDY0X3QgKm1zZWMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RHVyYXRpb24oaW50NjRfdCAqbXNlYyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZXNldCgpOworICAgICAgICAgICAgaW50NjRfdCBtc2VjLAorICAgICAgICAgICAgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q3VycmVudFBvc2l0aW9uKGludDY0X3QgKm1zZWMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RHVyYXRpb24oaW50NjRfdCAqbXNlYykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZXNldCgpIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgbm90aWZ5QXQoaW50NjRfdCBtZWRpYVRpbWVVcykgb3ZlcnJpZGU7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMb29waW5nKGludCBsb29wKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGludm9rZShjb25zdCBQYXJjZWwgJnJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRBdWRpb1NpbmsoY29uc3Qgc3A8QXVkaW9TaW5rPiAmYXVkaW9TaW5rKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwgJnJlcXVlc3QpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TG9vcGluZyhpbnQgbG9vcCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBpbnZva2UoY29uc3QgUGxheWVyTWVzc2FnZSAmcmVxdWVzdCwgUGxheWVyTWVzc2FnZSAqcmVzcG9uc2UpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBzZXRBdWRpb1NpbmsoY29uc3Qgc3A8QXVkaW9TaW5rPiAmYXVkaW9TaW5rKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwgJnJlcXVlc3QpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhZGF0YSgKLSAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyJiBpZHMsIFBhcmNlbCAqcmVjb3Jkcyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdCBvdmVycmlkZTsKIAogICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgb3ZlcnJpZGU7CiAKQEAgLTc3LDE0ICs3NSwxNCBAQAogICAgIHZvaWQgbm90aWZ5TW9yZVJlYnVmZmVyaW5nVGltZVVzKGludDY0X3Qgc3JjSWQsIGludDY0X3QgdGltZVVzKTsKICAgICB2b2lkIG5vdGlmeVJlYnVmZmVyaW5nV2hlbkV4aXQoaW50NjRfdCBzcmNJZCwgYm9vbCBzdGF0dXMpOwogICAgIHZvaWQgbm90aWZ5U2Vla0NvbXBsZXRlKGludDY0X3Qgc3JjSWQpOwotICAgIHZvaWQgbm90aWZ5U2Vla0NvbXBsZXRlX2woaW50NjRfdCBzcmNJZCk7CiAgICAgdm9pZCBub3RpZnlMaXN0ZW5lcihpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSA9IDAsIGludCBleHQyID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCAqaW4gPSBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBsYXllck1lc3NhZ2UgKmluID0gTlVMTCk7CiAgICAgdm9pZCBub3RpZnlGbGFnc0NoYW5nZWQoaW50NjRfdCBzcmNJZCwgdWludDMyX3QgZmxhZ3MpOwogCiAgICAgLy8gTW9kdWxhciBEUk0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVEcm0oY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZkcm1TZXNzaW9uSWQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZURybSgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZURybSgKKyAgICAgICAgICAgIGludDY0X3Qgc3JjSWQsIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmZHJtU2Vzc2lvbklkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VEcm0oaW50NjRfdCBzcmNJZCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5OdVBsYXllcjJEcml2ZXIoKTsKQEAgLTk5LDkgKzk3LDYgQEAKICAgICAgICAgU1RBVEVfUlVOTklORywKICAgICAgICAgU1RBVEVfUEFVU0VELAogICAgICAgICBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUywKLSAgICAgICAgU1RBVEVfU1RPUFBFRCwgICAgICAgICAgICAgICAgICAvLyBlcXVpdmFsZW50IHRvIFBBVVNFRAotICAgICAgICBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJJTkcsICAgIC8vIGVxdWl2YWxlbnQgdG8gUEFVU0VELCBidXQgc2Vla2luZwotICAgICAgICBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRCwgICAgIC8vIGVxdWl2YWxlbnQgdG8gUEFVU0VELCBidXQgc2VlayBjb21wbGV0ZQogICAgIH07CiAKICAgICBzdGQ6OnN0cmluZyBzdGF0ZVN0cmluZyhTdGF0ZSBzdGF0ZSk7CkBAIC0xNDksNyArMTQ0LDcgQEAKIAogICAgIHN0YXR1c190IHN0YXJ0X2woKTsKICAgICB2b2lkIG5vdGlmeUxpc3RlbmVyX2woaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEgPSAwLCBpbnQgZXh0MiA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCAqaW4gPSBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGxheWVyTWVzc2FnZSAqaW4gPSBOVUxMKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE51UGxheWVyMkRyaXZlcik7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcm0uY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcm0uY3BwCmluZGV4IDBlMDk2YjAuLmY0MWE0MzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJtLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRybS5jcHAKQEAgLTEzMyw5ICsxMzMsOCBAQAogICAgIHJldHVybiBkcm1JbmZvQnVmZmVyOwogfQogCi1zcDxBQnVmZmVyPiBOdVBsYXllcjJEcm06OnJldHJpZXZlRHJtSW5mbyhQc3NoSW5mbyAqcHNzaEluZm8pCitzdGF0dXNfdCBOdVBsYXllcjJEcm06OnJldHJpZXZlRHJtSW5mbyhQc3NoSW5mbyAqcHNzaEluZm8sIFBsYXllck1lc3NhZ2UgKnBsYXllck1zZykKIHsKLQogICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBwc3NoLCBkcm1JbmZvOwogCiAgICAgLy8gMCkgR2VuZXJhdGUgUFNTSCBieXRlcwpAQCAtMTU0LDIyICsxNTMsMjAgQEAKICAgICAgICAgICAgIERybVVVSUQ6OmFycmF5VG9IZXgocHNzaFB0ciwgcHNzaFNpemUpLnN0cmluZygpKTsKIAogICAgIC8vIDEpIFdyaXRlIFBTU0ggYnl0ZXMKLSAgICBkcm1JbmZvLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPigmcHNzaFNpemUpLCBzaXplb2YocHNzaFNpemUpKTsKLSAgICBkcm1JbmZvLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPihwc3NoLnN0cigpLmNfc3RyKCkpLCBwc3NoU2l6ZSk7CisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9ieXRlc192YWx1ZSgKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPihwc3NoLnN0cigpLmNfc3RyKCkpLCBwc3NoU2l6ZSk7CiAKICAgICAvLyAyKSBXcml0ZSBzdXBwb3J0ZWREUk1zCiAgICAgdWludDMyX3QgbnVtZW50cmllcyA9IHBzc2hJbmZvLT5udW1lbnRyaWVzOwotICAgIGRybUluZm8ud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KCZudW1lbnRyaWVzKSwgc2l6ZW9mKG51bWVudHJpZXMpKTsKKyAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKG51bWVudHJpZXMpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtZW50cmllczsgaSsrKSB7CiAgICAgICAgIFBzc2hFbnRyeSAqZW50cnkgPSAmcHNzaEluZm8tPmVudHJpZXNbaV07Ci0gICAgICAgIGRybUluZm8ud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KCZlbnRyeS0+dXVpZCksIHNpemVvZihlbnRyeS0+dXVpZCkpOworICAgICAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2J5dGVzX3ZhbHVlKAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPigmZW50cnktPnV1aWQpLCBzaXplb2YoZW50cnktPnV1aWQpKTsKICAgICAgICAgQUxPR1YoInJldHJpZXZlRHJtSW5mbzogTUVESUFfRFJNX0lORk8gIHN1cHBvcnRlZFNjaGVtZVslenVdICVzIiwgaSwKICAgICAgICAgICAgICAgICBEcm1VVUlEOjphcnJheVRvSGV4KChjb25zdCB1aW50OF90KikmZW50cnktPnV1aWQsIHNpemVvZihBTWVkaWFVVUlEKSkuc3RyaW5nKCkpOwogICAgIH0KLQotICAgIHNwPEFCdWZmZXI+IGRybUluZm9CdWYgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoZHJtSW5mby5zdHIoKS5jX3N0cigpLCBkcm1JbmZvLnRlbGxwKCkpOwotICAgIGRybUluZm9CdWYtPnNldFJhbmdlKDAsIGRybUluZm8udGVsbHAoKSk7Ci0gICAgcmV0dXJuIGRybUluZm9CdWY7CisgICAgcmV0dXJuIE9LOwogfQogCiB9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJtLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRybS5oCmluZGV4IDk5ZDI0MTUuLjk2OGQxYmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJtLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcm0uaApAQCAtMjMsNiArMjMsMTAgQEAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKKyNpbmNsdWRlICJtZWRpYXBsYXllcjIucGIuaCIKKwordXNpbmcgYW5kcm9pZDo6bWVkaWE6Ok1lZGlhUGxheWVyMlByb3RvOjpQbGF5ZXJNZXNzYWdlOworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKICAgICBzdHJ1Y3QgRHJtVVVJRCB7CkBAIC04MCw3ICs4NCw3IEBACiAKICAgICBwdWJsaWM6CiAgICAgICAgIHN0YXRpYyBzcDxBQnVmZmVyPiByZXRyaWV2ZURybUluZm8oY29uc3Qgdm9pZCAqcHNzaCwgdWludDMyX3QgcHNzaHNpemUpOwotICAgICAgICBzdGF0aWMgc3A8QUJ1ZmZlcj4gcmV0cmlldmVEcm1JbmZvKFBzc2hJbmZvICopOworICAgICAgICBzdGF0aWMgc3RhdHVzX3QgcmV0cmlldmVEcm1JbmZvKFBzc2hJbmZvICosIFBsYXllck1lc3NhZ2UgKik7CiAKICAgICB9OyAgLy8gTnVQbGF5ZXIyRHJtCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyUmVuZGVyZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJSZW5kZXJlci5jcHAKaW5kZXggZmNjN2ZhNS4uM2JlN2UzNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJSZW5kZXJlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJSZW5kZXJlci5jcHAKQEAgLTMwLDcgKzMwLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIyLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgogCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KQEAgLTEwNiw2ICsxMDYsNyBAQAogICAgICAgICBjb25zdCBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U6OkF1ZGlvU2luaz4gJnNpbmssCiAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ2xvY2s+ICZtZWRpYUNsb2NrLAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgY29uc3Qgc3A8Sk9iamVjdEhvbGRlcj4gJmNvbnRleHQsCiAgICAgICAgIHVpbnQzMl90IGZsYWdzKQogICAgIDogbUF1ZGlvU2luayhzaW5rKSwKICAgICAgIG1Vc2VWaXJ0dWFsQXVkaW9TaW5rKGZhbHNlKSwKQEAgLTEzMSw3ICsxMzIsNyBAQAogICAgICAgbU5vdGlmeUNvbXBsZXRlQXVkaW8oZmFsc2UpLAogICAgICAgbU5vdGlmeUNvbXBsZXRlVmlkZW8oZmFsc2UpLAogICAgICAgbVN5bmNRdWV1ZXMoZmFsc2UpLAotICAgICAgbVBhdXNlZChmYWxzZSksCisgICAgICBtUGF1c2VkKHRydWUpLAogICAgICAgbVBhdXNlRHJhaW5BdWRpb0FsbG93ZWRVcygwKSwKICAgICAgIG1WaWRlb1NhbXBsZVJlY2VpdmVkKGZhbHNlKSwKICAgICAgIG1WaWRlb1JlbmRlcmluZ1N0YXJ0ZWQoZmFsc2UpLApAQCAtMTQ3LDEwICsxNDgsOSBAQAogICAgICAgbVRvdGFsQnVmZmVyc1F1ZXVlZCgwKSwKICAgICAgIG1MYXN0QXVkaW9CdWZmZXJEcmFpbmVkKDApLAogICAgICAgbVVzZUF1ZGlvQ2FsbGJhY2soZmFsc2UpLAotICAgICAgbVdha2VMb2NrKG5ldyBKV2FrZUxvY2soKSkgeworICAgICAgbVdha2VMb2NrKG5ldyBKV2FrZUxvY2soY29udGV4dCkpIHsKICAgICBDSEVDSyhtZWRpYUNsb2NrICE9IE5VTEwpOwotICAgIG1QbGF5YmFja1JhdGUgPSBtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQ7Ci0gICAgbU1lZGlhQ2xvY2stPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tSYXRlKTsKKyAgICBtTWVkaWFDbG9jay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZCk7CiB9CiAKIE51UGxheWVyMjo6UmVuZGVyZXI6On5SZW5kZXJlcigpIHsKQEAgLTIwNiwyNiArMjA2LDIwIEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyMjo6UmVuZGVyZXI6Om9uQ29uZmlnUGxheWJhY2soY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUgLyogc2FuaXRpemVkICovKSB7Ci0gICAgaWYgKHJhdGUubVNwZWVkID09IDAuZikgewotICAgICAgICBvblBhdXNlKCk7Ci0gICAgICAgIC8vIGRvbid0IGNhbGwgYXVkaW9zaW5rJ3Mgc2V0UGxheWJhY2tSYXRlIGlmIHBhdXNpbmcsIGFzIHBpdGNoIGRvZXMgbm90Ci0gICAgICAgIC8vIGhhdmUgdG8gY29ycmVzcG9uZCB0byB0aGUgYW55IG5vbi0wIHNwZWVkIChlLmcgb2xkIHNwZWVkKS4gS2VlcAotICAgICAgICAvLyBzZXR0aW5ncyBub25ldGhlbGVzcywgdXNpbmcgdGhlIG9sZCBzcGVlZCwgaW4gY2FzZSBhdWRpb3NpbmsgY2hhbmdlcy4KLSAgICAgICAgQXVkaW9QbGF5YmFja1JhdGUgbmV3UmF0ZSA9IHJhdGU7Ci0gICAgICAgIG5ld1JhdGUubVNwZWVkID0gbVBsYXliYWNrU2V0dGluZ3MubVNwZWVkOwotICAgICAgICBtUGxheWJhY2tTZXR0aW5ncyA9IG5ld1JhdGU7Ci0gICAgICAgIHJldHVybiBPSzsKKyAgICBpZiAocmF0ZS5tU3BlZWQgPD0gMC5mKSB7CisgICAgICAgIEFMT0dXKCJwbGF5YmFjayByYXRlIGNhbm5vdCBiZSAlZiIsIHJhdGUubVNwZWVkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBpZiAobUF1ZGlvU2luayAhPSBOVUxMICYmIG1BdWRpb1NpbmstPnJlYWR5KCkpIHsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvU2luay0+c2V0UGxheWJhY2tSYXRlKHJhdGUpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiZmFpbGVkIHRvIGdldCBwbGF5YmFjayByYXRlIGZyb20gYXVkaW8gc2luaywgZXJyKCVkKSIsIGVycik7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgfQogICAgIG1QbGF5YmFja1NldHRpbmdzID0gcmF0ZTsKLSAgICBtUGxheWJhY2tSYXRlID0gcmF0ZS5tU3BlZWQ7Ci0gICAgbU1lZGlhQ2xvY2stPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tSYXRlKTsKKyAgICBtTWVkaWFDbG9jay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZCk7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0yNDcsMTQgKzI0MSwxMiBAQAogICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQXVkaW9TaW5rLT5nZXRQbGF5YmFja1JhdGUocmF0ZSk7CiAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKICAgICAgICAgICAgIGlmICghaXNBdWRpb1BsYXliYWNrUmF0ZUVxdWFsKCpyYXRlLCBtUGxheWJhY2tTZXR0aW5ncykpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY29ycmVjdGluZyBtaXNtYXRjaCBpbiBpbnRlcm5hbC9leHRlcm5hbCBwbGF5YmFjayByYXRlIik7CisgICAgICAgICAgICAgICAgQUxPR1coImNvcnJlY3RpbmcgbWlzbWF0Y2ggaW4gaW50ZXJuYWwvZXh0ZXJuYWwgcGxheWJhY2sgcmF0ZSwgJWYgdnMgJWYiLAorICAgICAgICAgICAgICAgICAgICAgIHJhdGUtPm1TcGVlZCwgbVBsYXliYWNrU2V0dGluZ3MubVNwZWVkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIGdldCBwbGF5YmFjayBzZXR0aW5ncyB1c2VkIGJ5IGF1ZGlvc2luaywgYXMgaXQgbWF5IGJlCiAgICAgICAgICAgICAvLyBzbGlnaHRseSBvZmYgZHVlIHRvIGF1ZGlvc2luayBub3QgdGFraW5nIHNtYWxsIGNoYW5nZXMuCiAgICAgICAgICAgICBtUGxheWJhY2tTZXR0aW5ncyA9ICpyYXRlOwotICAgICAgICAgICAgaWYgKG1QYXVzZWQpIHsKLSAgICAgICAgICAgICAgICByYXRlLT5tU3BlZWQgPSAwLmY7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CkBAIC01NzYsOCArNTY4LDggQEAKICAgICAgICAgICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPQogICAgICAgICAgICAgICAgICAgICBtQXVkaW9TaW5rLT5tc2Vjc1BlckZyYW1lKCkKICAgICAgICAgICAgICAgICAgICAgICAgICogbnVtRnJhbWVzUGVuZGluZ1BsYXlvdXQgKiAxMDAwbGw7Ci0gICAgICAgICAgICAgICAgaWYgKG1QbGF5YmFja1JhdGUgPiAxLjBmKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGF5VXMgLz0gbVBsYXliYWNrUmF0ZTsKKyAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrU2V0dGluZ3MubVNwZWVkID4gMS4wZikgeworICAgICAgICAgICAgICAgICAgICBkZWxheVVzIC89IG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZDsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyBMZXQncyBnaXZlIGl0IG1vcmUgZGF0YSBhZnRlciBhYm91dCBoYWxmIHRoYXQgdGltZQpAQCAtMTQ2Nyw3ICsxNDU5LDcgQEAKIAogICAgIGlmIChtSGFzVmlkZW8pIHsKICAgICAgICAgaWYgKG1WaWRlb1NjaGVkdWxlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtVmlkZW9TY2hlZHVsZXIgPSBuZXcgVmlkZW9GcmFtZVNjaGVkdWxlcigpOworICAgICAgICAgICAgbVZpZGVvU2NoZWR1bGVyID0gbmV3IFZpZGVvRnJhbWVTY2hlZHVsZXIyKCk7CiAgICAgICAgICAgICBtVmlkZW9TY2hlZHVsZXItPmluaXQoKTsKICAgICAgICAgfQogICAgIH0KQEAgLTE1OTUsNiArMTU4Nyw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBub3RpZnlDb21wbGV0ZSA9IG1Ob3RpZnlDb21wbGV0ZVZpZGVvOwogICAgICAgICAgICAgbU5vdGlmeUNvbXBsZXRlVmlkZW8gPSBmYWxzZTsKKyAgICAgICAgICAgIG1WaWRlb1JlbmRlcmluZ1N0YXJ0ZWQgPSBmYWxzZTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIElmIHdlJ3JlIGN1cnJlbnRseSBzeW5jaW5nIHRoZSBxdWV1ZXMsIGkuZS4gZHJvcHBpbmcgYXVkaW8gd2hpbGUKQEAgLTE3OTUsNyArMTc4OCw3IEBACiAgICAgICAgICAgICBtQXVkaW9TaW5rLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrU2V0dGluZ3MpOwogICAgICAgICB9CiAKLSAgICAgICAgbU1lZGlhQ2xvY2stPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tSYXRlKTsKKyAgICAgICAgbU1lZGlhQ2xvY2stPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQpOwogCiAgICAgICAgIGlmICghbUF1ZGlvUXVldWUuZW1wdHkoKSkgewogICAgICAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZV9sKCk7CkBAIC0xODA5LDcgKzE4MDIsNyBAQAogCiB2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om9uU2V0VmlkZW9GcmFtZVJhdGUoZmxvYXQgZnBzKSB7CiAgICAgaWYgKG1WaWRlb1NjaGVkdWxlciA9PSBOVUxMKSB7Ci0gICAgICAgIG1WaWRlb1NjaGVkdWxlciA9IG5ldyBWaWRlb0ZyYW1lU2NoZWR1bGVyKCk7CisgICAgICAgIG1WaWRlb1NjaGVkdWxlciA9IG5ldyBWaWRlb0ZyYW1lU2NoZWR1bGVyMigpOwogICAgIH0KICAgICBtVmlkZW9TY2hlZHVsZXItPmluaXQoZnBzKTsKIH0KQEAgLTE4NzksNiArMTg3Miw3IEBACiAgICAgICAgIGJvb2wgaXNTdHJlYW1pbmcpIHsKICAgICBBTE9HVigib3BlbkF1ZGlvU2luazogb2ZmbG9hZE9ubHkoJWQpIG9mZmxvYWRpbmdBdWRpbyglZCkiLAogICAgICAgICAgICAgb2ZmbG9hZE9ubHksIG9mZmxvYWRpbmdBdWRpbygpKTsKKwogICAgIGJvb2wgYXVkaW9TaW5rQ2hhbmdlZCA9IGZhbHNlOwogCiAgICAgaW50MzJfdCBudW1DaGFubmVsczsKQEAgLTE5NTUsNyArMTk0OSw2IEBACiAgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAwIC8qIGJ1ZmZlckNvdW50IC0gdW51c2VkICovLAogICAgICAgICAgICAgICAgICAgICAmTnVQbGF5ZXIyOjpSZW5kZXJlcjo6QXVkaW9TaW5rQ2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgIHRoaXMsCiAgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdClvZmZsb2FkRmxhZ3MsCkBAIC0yMDI2LDEzICsyMDE5LDYgQEAKICAgICAgICAgY29uc3QgdWludDMyX3QgZnJhbWVDb3VudCA9CiAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzYW1wbGVSYXRlICogZ2V0QXVkaW9TaW5rUGNtTXNTZXR0aW5nKCkgLyAxMDAwOwogCi0gICAgICAgIC8vIFRoZSBkb05vdFJlY29ubmVjdCBtZWFucyBBdWRpb1Npbmsgd2lsbCBzaWduYWwgYmFjayBhbmQgbGV0IE51UGxheWVyMiB0byByZS1jb25zdHJ1Y3QKLSAgICAgICAgLy8gQXVkaW9TaW5rLiBXZSBkb24ndCB3YW50IHRoaXMgd2hlbiB0aGVyZSdzIHZpZGVvIGJlY2F1c2UgaXQgd2lsbCBjYXVzZSBhIHZpZGVvIHNlZWsgdG8KLSAgICAgICAgLy8gdGhlIHByZXZpb3VzIEkgZnJhbWUuIEJ1dCB3ZSBkbyB3YW50IHRoaXMgd2hlbiB0aGVyZSdzIG9ubHkgYXVkaW8gYmVjYXVzZSBpdCB3aWxsIGdpdmUKLSAgICAgICAgLy8gTnVQbGF5ZXIyIGEgY2hhbmNlIHRvIHN3aXRjaCBmcm9tIG5vbi1vZmZsb2FkIG1vZGUgdG8gb2ZmbG9hZCBtb2RlLgotICAgICAgICAvLyBTbyB3ZSBvbmx5IHNldCBkb05vdFJlY29ubmVjdCB3aGVuIHRoZXJlJ3Mgbm8gdmlkZW8uCi0gICAgICAgIGNvbnN0IGJvb2wgZG9Ob3RSZWNvbm5lY3QgPSAhaGFzVmlkZW87Ci0KICAgICAgICAgLy8gV2Ugc2hvdWxkIGFsd2F5cyBiZSBhYmxlIHRvIHNldCBvdXIgcGxheWJhY2sgc2V0dGluZ3MgaWYgdGhlIHNpbmsgaXMgY2xvc2VkLgogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1BdWRpb1NpbmstPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tTZXR0aW5ncykgIT0gT0ssCiAgICAgICAgICAgICAgICAgIm9uT3BlbkF1ZGlvU2luazogY2FuJ3Qgc2V0IHBsYXliYWNrIHJhdGUgb24gY2xvc2VkIHNpbmsiKTsKQEAgLTIwNDEsMTIgKzIwMjcsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdCljaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgYXVkaW9Gb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgIDAgLyogYnVmZmVyQ291bnQgLSB1bnVzZWQgKi8sCiAgICAgICAgICAgICAgICAgICAgIG1Vc2VBdWRpb0NhbGxiYWNrID8gJk51UGxheWVyMjo6UmVuZGVyZXI6OkF1ZGlvU2lua0NhbGxiYWNrIDogTlVMTCwKICAgICAgICAgICAgICAgICAgICAgbVVzZUF1ZGlvQ2FsbGJhY2sgPyB0aGlzIDogTlVMTCwKICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KXBjbUZsYWdzLAogICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICBkb05vdFJlY29ubmVjdCwKICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dXKCJvcGVuQXVkaW9TaW5rOiBub24gb2ZmbG9hZGVkIG9wZW4gZmFpbGVkIHN0YXR1czogJWQiLCBlcnIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJSZW5kZXJlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJSZW5kZXJlci5oCmluZGV4IDYyY2YwZDguLmQwNjVkZWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyUmVuZGVyZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlJlbmRlcmVyLmgKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CiAjaW5jbHVkZSA8bWVkaWEvQVZTeW5jU2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSk9iamVjdEhvbGRlci5oPgogCiAjaW5jbHVkZSAiTnVQbGF5ZXIyLmgiCiAKQEAgLTI4LDcgKzI5LDcgQEAKIGNsYXNzICBKV2FrZUxvY2s7CiBzdHJ1Y3QgTWVkaWFDbG9jazsKIGNsYXNzIE1lZGlhQ29kZWNCdWZmZXI7Ci1zdHJ1Y3QgVmlkZW9GcmFtZVNjaGVkdWxlcjsKK3N0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTsKIAogc3RydWN0IE51UGxheWVyMjo6UmVuZGVyZXIgOiBwdWJsaWMgQUhhbmRsZXIgewogICAgIGVudW0gRmxhZ3MgewpAQCAtMzgsNiArMzksNyBAQAogICAgIFJlbmRlcmVyKGNvbnN0IHNwPE1lZGlhUGxheWVyMkludGVyZmFjZTo6QXVkaW9TaW5rPiAmc2luaywKICAgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiAmbWVkaWFDbG9jaywKICAgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgICAgICBjb25zdCBzcDxKT2JqZWN0SG9sZGVyPiAmY29udGV4dCwKICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwogCiAgICAgc3RhdGljIHNpemVfdCBBdWRpb1NpbmtDYWxsYmFjaygKQEAgLTE1Niw3ICsxNTgsNyBAQAogICAgIExpc3Q8UXVldWVFbnRyeT4gbUF1ZGlvUXVldWU7CiAgICAgTGlzdDxRdWV1ZUVudHJ5PiBtVmlkZW9RdWV1ZTsKICAgICB1aW50MzJfdCBtTnVtRnJhbWVzV3JpdHRlbjsKLSAgICBzcDxWaWRlb0ZyYW1lU2NoZWR1bGVyPiBtVmlkZW9TY2hlZHVsZXI7CisgICAgc3A8VmlkZW9GcmFtZVNjaGVkdWxlckJhc2U+IG1WaWRlb1NjaGVkdWxlcjsKIAogICAgIGJvb2wgbURyYWluQXVkaW9RdWV1ZVBlbmRpbmc7CiAgICAgYm9vbCBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZzsKQEAgLTE2Nyw3ICsxNjksNiBAQAogICAgIGludDMyX3QgbUF1ZGlvRU9TR2VuZXJhdGlvbjsKIAogICAgIGNvbnN0IHNwPE1lZGlhQ2xvY2s+IG1NZWRpYUNsb2NrOwotICAgIGZsb2F0IG1QbGF5YmFja1JhdGU7IC8vIGF1ZGlvIHRyYWNrIHJhdGUKIAogICAgIEF1ZGlvUGxheWJhY2tSYXRlIG1QbGF5YmFja1NldHRpbmdzOwogICAgIEFWU3luY1NldHRpbmdzIG1TeW5jU2V0dGluZ3M7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJTb3VyY2UuaAppbmRleCA2NjIyMzVmLi45Mjk4YTk5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyU291cmNlLmgKQEAgLTY5LDcgKzY5LDcgQEAKICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYygpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUFzeW5jKGludDY0X3Qgc3RhcnRUaW1lVXMpID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZCBzdGFydCgpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgc3RvcCgpIHt9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL1JUU1BTb3VyY2UyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvUlRTUFNvdXJjZTIuY3BwCmluZGV4IDcwYmMwYTkuLmE3MDI2OWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvUlRTUFNvdXJjZTIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvUlRTUFNvdXJjZTIuY3BwCkBAIC05Niw3ICs5Niw4IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIE51UGxheWVyMjo6UlRTUFNvdXJjZTI6OnByZXBhcmVBc3luYygpIHsKKy8vIFRPRE86IGZldGNoIGRhdGEgc3RhcnRpbmcgZnJvbSB8c3RhcnRUaW1lVXN8Cit2b2lkIE51UGxheWVyMjo6UlRTUFNvdXJjZTI6OnByZXBhcmVBc3luYyhpbnQ2NF90IC8qIHN0YXJ0VGltZVVzICovKSB7CiAgICAgaWYgKG1Jc1NEUCAmJiBtSFRUUFNlcnZpY2UgPT0gTlVMTCkgewogICAgICAgICBub3RpZnlQcmVwYXJlZChCQURfVkFMVUUpOwogICAgICAgICByZXR1cm47CkBAIC0xMDQsNyArMTA1LDcgQEAKIAogICAgIGlmIChtTG9vcGVyID09IE5VTEwpIHsKICAgICAgICAgbUxvb3BlciA9IG5ldyBBTG9vcGVyOwotICAgICAgICBtTG9vcGVyLT5zZXROYW1lKCJydHNwIik7CisgICAgICAgIG1Mb29wZXItPnNldE5hbWUoInJ0c3AyIik7CiAgICAgICAgIG1Mb29wZXItPnN0YXJ0KCk7CiAKICAgICAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9SVFNQU291cmNlMi5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9SVFNQU291cmNlMi5oCmluZGV4IDcxMmMzZTUuLmU1ZjE3MTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvUlRTUFNvdXJjZTIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL1JUU1BTb3VyY2UyLmgKQEAgLTQzLDcgKzQzLDcgQEAKICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUFzeW5jKGludDY0X3Qgc3RhcnRUaW1lVXMpOwogICAgIHZpcnR1YWwgdm9pZCBzdGFydCgpOwogICAgIHZpcnR1YWwgdm9pZCBzdG9wKCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQuYnAKaW5kZXggNzQyMzZjYi4uNTE4NzlmZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQuYnAKQEAgLTI5LDYgKzI5LDcgQEAKICAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCiAgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKICAgICAgICAgImxpYm1lbXVucmVhY2hhYmxlIiwKKyAgICAgICAgImxpYm5ldGRfY2xpZW50IiwKICAgICAgICAgImxpYnBvd2VybWFuYWdlciIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcAppbmRleCA0MjA2NjQ3Li4zZmE4ZTNmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwCkBAIC01MzcsNCArNTM3LDEzIEBACiAgICAgfQogICAgIHJldHVybiBOT19JTklUOwogfQorCitzdGF0dXNfdCBNZWRpYVJlY29yZGVyQ2xpZW50OjpnZXRQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSB7CisgICAgQUxPR1YoImdldFBvcnRJZCIpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVJlY29yZGVyICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIG1SZWNvcmRlci0+Z2V0UG9ydElkKHBvcnRJZCk7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5oCmluZGV4IGQyZTY4MWYuLjMwM2NlZmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuaApAQCAtMTA5LDYgKzEwOSw3IEBACiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCk7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICBnZXRBY3RpdmVNaWNyb3Bob25lcygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgIGdldFBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpIG92ZXJyaWRlOwogCiBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyAgICAgICAgICAgTWVkaWFQbGF5ZXJTZXJ2aWNlOyAgLy8gZm9yIGFjY2Vzc2luZyBwcml2YXRlIGNvbnN0cnVjdG9yCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKaW5kZXggZTNhZTAyZS4uZjJhMzAzOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcApAQCAtNDYsNiArNDYsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09nZ1dyaXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1BlcnNpc3RlbnRTdXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFQcm9maWxlcy5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmg+CkBAIC05NDgsNiArOTQ5LDEwIEBACiAgICAgICAgICAgICBzdGF0dXMgPSBzZXR1cE1QRUcyVFNSZWNvcmRpbmcoKTsKICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9PR0c6CisgICAgICAgICAgICBzdGF0dXMgPSBzZXR1cE9nZ1JlY29yZGluZygpOworICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBvdXRwdXQgZmlsZSBmb3JtYXQ6ICVkIiwgbU91dHB1dEZvcm1hdCk7CiAgICAgICAgICAgICBzdGF0dXMgPSBVTktOT1dOX0VSUk9SOwpAQCAtMTAxMyw2ICsxMDE4LDcgQEAKICAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX0FBQ19BRFRTOgogICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfUlRQX0FWUDoKICAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX01QRUcyVFM6CisgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9PR0c6CiAgICAgICAgIHsKICAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwogICAgICAgICAgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IHN5c3RlbVRpbWUoKSAvIDEwMDA7CkBAIC0xMTEzLDYgKzExMTksOSBAQAogICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOwogICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiYWFjLXByb2ZpbGUiLCBPTVhfQVVESU9fQUFDT2JqZWN0RUxEKTsKICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0VOQ09ERVJfT1BVUzoKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUyk7CisgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR0UoIlVua25vd24gYXVkaW8gZW5jb2RlcjogJWQiLCBtQXVkaW9FbmNvZGVyKTsKQEAgLTExNjksNiArMTE3OCwxMyBAQAogICAgIHJldHVybiBzZXR1cFJhd0F1ZGlvUmVjb3JkaW5nKCk7CiB9CiAKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwT2dnUmVjb3JkaW5nKCkgeworICAgIENIRUNLX0VRKG1PdXRwdXRGb3JtYXQsIE9VVFBVVF9GT1JNQVRfT0dHKTsKKworICAgIG1Xcml0ZXIgPSBuZXcgT2dnV3JpdGVyKG1PdXRwdXRGZCk7CisgICAgcmV0dXJuIHNldHVwUmF3QXVkaW9SZWNvcmRpbmcoKTsKK30KKwogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBBTVJSZWNvcmRpbmcoKSB7CiAgICAgQ0hFQ0sobU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX0FNUl9OQiB8fAogICAgICAgICAgIG1PdXRwdXRGb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9BTVJfV0IpOwpAQCAtMTgxMyw2ICsxODI5LDcgQEAKICAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0FBQzoKICAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0hFX0FBQzoKICAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0FBQ19FTEQ6CisgICAgICAgIGNhc2UgQVVESU9fRU5DT0RFUl9PUFVTOgogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKQEAgLTE4NjMsMTkgKzE4ODAsMTggQEAKICAgICAgICAgbVRvdGFsQml0UmF0ZSArPSBtVmlkZW9CaXRSYXRlOwogICAgIH0KIAotICAgIGlmIChtT3V0cHV0Rm9ybWF0ICE9IE9VVFBVVF9GT1JNQVRfV0VCTSkgewotICAgICAgICAvLyBBdWRpbyBzb3VyY2UgaXMgYWRkZWQgYXQgdGhlIGVuZCBpZiBpdCBleGlzdHMuCi0gICAgICAgIC8vIFRoaXMgaGVscCBtYWtlIHN1cmUgdGhhdCB0aGUgInJlY29kaW5nIiBzb3VuZCBpcyBzdXBwcmVzc2VkIGZvcgotICAgICAgICAvLyBjYW1jb3JkZXIgYXBwbGljYXRpb25zIGluIHRoZSByZWNvcmRlZCBmaWxlcy4KLSAgICAgICAgLy8gVE9ETyBBdWRpbyBzb3VyY2UgaXMgY3VycmVudGx5IHVuc3VwcG9ydGVkIGZvciB3ZWJtIG91dHB1dDsgdm9yYmlzIGVuY29kZXIgbmVlZGVkLgotICAgICAgICAvLyBkaXNhYmxlIGF1ZGlvIGZvciB0aW1lIGxhcHNlIHJlY29yZGluZwotICAgICAgICBib29sIGRpc2FibGVBdWRpbyA9IG1DYXB0dXJlRnBzRW5hYmxlICYmIG1DYXB0dXJlRnBzIDwgbUZyYW1lUmF0ZTsKLSAgICAgICAgaWYgKCFkaXNhYmxlQXVkaW8gJiYgbUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9DTlQpIHsKLSAgICAgICAgICAgIGVyciA9IHNldHVwQXVkaW9FbmNvZGVyKHdyaXRlcik7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOwotICAgICAgICAgICAgbVRvdGFsQml0UmF0ZSArPSBtQXVkaW9CaXRSYXRlOwotICAgICAgICB9CisgICAgLy8gQXVkaW8gc291cmNlIGlzIGFkZGVkIGF0IHRoZSBlbmQgaWYgaXQgZXhpc3RzLgorICAgIC8vIFRoaXMgaGVscCBtYWtlIHN1cmUgdGhhdCB0aGUgInJlY29kaW5nIiBzb3VuZCBpcyBzdXBwcmVzc2VkIGZvcgorICAgIC8vIGNhbWNvcmRlciBhcHBsaWNhdGlvbnMgaW4gdGhlIHJlY29yZGVkIGZpbGVzLgorICAgIC8vIGRpc2FibGUgYXVkaW8gZm9yIHRpbWUgbGFwc2UgcmVjb3JkaW5nCisgICAgY29uc3QgYm9vbCBkaXNhYmxlQXVkaW8gPSBtQ2FwdHVyZUZwc0VuYWJsZSAmJiBtQ2FwdHVyZUZwcyA8IG1GcmFtZVJhdGU7CisgICAgaWYgKCFkaXNhYmxlQXVkaW8gJiYgbUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9DTlQpIHsKKyAgICAgICAgZXJyID0gc2V0dXBBdWRpb0VuY29kZXIod3JpdGVyKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKyAgICAgICAgbVRvdGFsQml0UmF0ZSArPSBtQXVkaW9CaXRSYXRlOworICAgIH0KIAorICAgIGlmIChtT3V0cHV0Rm9ybWF0ICE9IE9VVFBVVF9GT1JNQVRfV0VCTSkgewogICAgICAgICBpZiAobUNhcHR1cmVGcHNFbmFibGUpIHsKICAgICAgICAgICAgIG1wNHdyaXRlci0+c2V0Q2FwdHVyZVJhdGUobUNhcHR1cmVGcHMpOwogICAgICAgICB9CkBAIC0yMjM5LDYgKzIyNTUsMTIgQEAKICAgICByZXR1cm4gTk9fSU5JVDsKIH0KIAorc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6Z2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgY29uc3QgeworICAgIGlmIChtQXVkaW9Tb3VyY2VOb2RlICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1BdWRpb1NvdXJjZU5vZGUtPmdldFBvcnRJZChwb3J0SWQpOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6ZHVtcCgKICAgICAgICAgaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaAppbmRleCBmYWEyZTU5Li5hMjkyZTU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKQEAgLTc3LDcgKzc3LDcgQEAKICAgICB2aXJ0dWFsIHZvaWQgc2V0QXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKTsKLQorICAgICAgICAgICAgc3RhdHVzX3QgZ2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgY29uc3Qgb3ZlcnJpZGU7CiAKIHByaXZhdGU6CiAgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKQEAgLTE2Niw2ICsxNjYsNyBAQAogICAgIHZvaWQgc2V0dXBNUEVHNG9yV0VCTU1ldGFEYXRhKHNwPE1ldGFEYXRhPiAqbWV0YSk7CiAgICAgc3RhdHVzX3Qgc2V0dXBBTVJSZWNvcmRpbmcoKTsKICAgICBzdGF0dXNfdCBzZXR1cEFBQ1JlY29yZGluZygpOworICAgIHN0YXR1c190IHNldHVwT2dnUmVjb3JkaW5nKCk7CiAgICAgc3RhdHVzX3Qgc2V0dXBSYXdBdWRpb1JlY29yZGluZygpOwogICAgIHN0YXR1c190IHNldHVwUlRQUmVjb3JkaW5nKCk7CiAgICAgc3RhdHVzX3Qgc2V0dXBNUEVHMlRTUmVjb3JkaW5nKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5jcHAKaW5kZXggMDgwNzg5Ni4uMWU4NTgwNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmNwcApAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQnVmZmVySG9sZGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgpAQCAtMzgsNiArMzcsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgpAQCAtMTU0OSw2ICsxNTQ5LDE2IEBACiAgICAgICAgICAgICBub3RpZnlCdWZmZXJpbmdVcGRhdGUoMTAwKTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChtUHJlcGFyaW5nKSB7CisgICAgICAgICAgICBub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoZmluYWxTdGF0dXMpOworICAgICAgICAgICAgbVByZXBhcmluZyA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKG1TZW50UGF1c2VPbkJ1ZmZlcmluZykgeworICAgICAgICAgICAgc2VuZENhY2hlU3RhdHMoKTsKKyAgICAgICAgICAgIG1TZW50UGF1c2VPbkJ1ZmZlcmluZyA9IGZhbHNlOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0UmVzdW1lT25CdWZmZXJpbmdFbmQpOworICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAKaW5kZXggNGIwOWRkYS4uNWNmNmJiZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwCkBAIC02NTksMjAgKzY1OSwzMSBAQAogCiAgICAgICAgIGNhc2Uga1doYXRHZXRTZWxlY3RlZFRyYWNrOgogICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IHR5cGUzMjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ0eXBlIiwgKGludDMyX3QqKSZ0eXBlMzIpKTsKKyAgICAgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSA9IChtZWRpYV90cmFja190eXBlKXR5cGUzMjsKKworICAgICAgICAgICAgc2l6ZV90IGluYmFuZFRyYWNrcyA9IDA7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIHNzaXplX3Qgc2VsZWN0ZWRUcmFjayA9IC0xOwogICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGVyciA9IE9LOwotCi0gICAgICAgICAgICAgICAgaW50MzJfdCB0eXBlMzI7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInR5cGUiLCAoaW50MzJfdCopJnR5cGUzMikpOwotICAgICAgICAgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSA9IChtZWRpYV90cmFja190eXBlKXR5cGUzMjsKLSAgICAgICAgICAgICAgICBzc2l6ZV90IHNlbGVjdGVkVHJhY2sgPSBtU291cmNlLT5nZXRTZWxlY3RlZFRyYWNrKHR5cGUpOwotCi0gICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseTsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJyZXBseSIsICh2b2lkKiopJnJlcGx5KSk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2VsZWN0ZWRUcmFjayk7CisgICAgICAgICAgICAgICAgaW5iYW5kVHJhY2tzID0gbVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOworICAgICAgICAgICAgICAgIHNlbGVjdGVkVHJhY2sgPSBtU291cmNlLT5nZXRTZWxlY3RlZFRyYWNrKHR5cGUpOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAoc2VsZWN0ZWRUcmFjayA9PSAtMSAmJiBtQ0NEZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgICAgICBzZWxlY3RlZFRyYWNrID0gbUNDRGVjb2Rlci0+Z2V0U2VsZWN0ZWRUcmFjayh0eXBlKTsKKyAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRUcmFjayAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFRyYWNrICs9IGluYmFuZFRyYWNrczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFBhcmNlbCogcmVwbHk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJyZXBseSIsICh2b2lkKiopJnJlcGx5KSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZWxlY3RlZFRyYWNrKTsKKwogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwogICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmNwcAppbmRleCA3ZjQ3NzNiLi4wMTU2YWQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5jcHAKQEAgLTIwMCw2ICsyMDAsMTggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3NzaXplX3QgTnVQbGF5ZXI6OkNDRGVjb2Rlcjo6Z2V0U2VsZWN0ZWRUcmFjayhtZWRpYV90cmFja190eXBlIHR5cGUpIGNvbnN0IHsKKyAgICBpZiAobVNlbGVjdGVkVHJhY2sgIT0gLTEpIHsKKyAgICAgICAgQ0NUcmFjayB0cmFjayA9IG1UcmFja3NbbVNlbGVjdGVkVHJhY2tdOworICAgICAgICBpZiAodHJhY2subVRyYWNrVHlwZSA9PSBrVHJhY2tUeXBlQ0VBNjA4IHx8IHRyYWNrLm1UcmFja1R5cGUgPT0ga1RyYWNrVHlwZUNFQTcwOCkgeworICAgICAgICAgICAgcmV0dXJuICh0eXBlID09IE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUgPyBtU2VsZWN0ZWRUcmFjayA6IC0xKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHR5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9VTktOT1dOID8gbVNlbGVjdGVkVHJhY2sgOiAtMSk7CisgICAgfQorCisgICAgcmV0dXJuIC0xOworfQorCiBib29sIE51UGxheWVyOjpDQ0RlY29kZXI6OmlzU2VsZWN0ZWQoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1TZWxlY3RlZFRyYWNrID49IDAgJiYgbVNlbGVjdGVkVHJhY2sgPCAoaW50MzJfdClnZXRUcmFja0NvdW50KCk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5oCmluZGV4IGYzMTBmMzcuLjM3YjgyMzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5oCkBAIC0zOCw2ICszOCw3IEBACiAgICAgc2l6ZV90IGdldFRyYWNrQ291bnQoKSBjb25zdDsKICAgICBzcDxBTWVzc2FnZT4gZ2V0VHJhY2tJbmZvKHNpemVfdCBpbmRleCkgY29uc3Q7CiAgICAgc3RhdHVzX3Qgc2VsZWN0VHJhY2soc2l6ZV90IGluZGV4LCBib29sIHNlbGVjdCk7CisgICAgc3NpemVfdCBnZXRTZWxlY3RlZFRyYWNrKG1lZGlhX3RyYWNrX3R5cGUgdHlwZSkgY29uc3Q7CiAgICAgYm9vbCBpc1NlbGVjdGVkKCkgY29uc3Q7CiAgICAgdm9pZCBkZWNvZGUoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpOwogICAgIHZvaWQgZGlzcGxheShpbnQ2NF90IHRpbWVVcyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwCmluZGV4IDRhZDZlYWIuLmRmMWZmZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwCkBAIC0xMTAsNiArMTEwLDcgQEAKICAgICBtU3RhdHMtPnNldEludDY0KCJmcmFtZXMtdG90YWwiLCBtTnVtRnJhbWVzVG90YWwpOwogICAgIG1TdGF0cy0+c2V0SW50NjQoImZyYW1lcy1kcm9wcGVkLWlucHV0IiwgbU51bUlucHV0RnJhbWVzRHJvcHBlZCk7CiAgICAgbVN0YXRzLT5zZXRJbnQ2NCgiZnJhbWVzLWRyb3BwZWQtb3V0cHV0IiwgbU51bU91dHB1dEZyYW1lc0Ryb3BwZWQpOworICAgIG1TdGF0cy0+c2V0RmxvYXQoImZyYW1lLXJhdGUtdG90YWwiLCBtRnJhbWVSYXRlVG90YWwpOwogICAgIHJldHVybiBtU3RhdHM7CiB9CiAKQEAgLTEwNjksNiArMTA3MCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TWVkaWFCdWZmZXJIb2xkZXIqPihob2xkZXIuZ2V0KCkpLT5tZWRpYUJ1ZmZlcigpIDogbnVsbHB0cjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKG1lZGlhQnVmICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhQnVmLT5zaXplKCkgPiBjb2RlY0J1ZmZlci0+Y2FwYWNpdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoRVJST1JfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRGVxdWV1ZWRJbnB1dEJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlckl4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5zZXRSYW5nZSgwLCBtZWRpYUJ1Zi0+c2l6ZSgpKTsKICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGNvZGVjQnVmZmVyLT5kYXRhKCksIG1lZGlhQnVmLT5kYXRhKCksIG1lZGlhQnVmLT5zaXplKCkpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcAppbmRleCA4NzhiZDFlLi5iYTNlYmFhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKQEAgLTUzLDYgKzUzLDcgQEAKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVySGVpZ2h0ID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuaGVpZ2h0IjsKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRnJhbWVzID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZnJhbWVzIjsKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRnJhbWVzRHJvcHBlZCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmRyb3BwZWQiOworc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJGcmFtZVJhdGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5mcHMiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJBTWltZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmF1ZGlvLm1pbWUiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJBQ29kZWMgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5hdWRpby5jb2RlYyI7CiBzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckR1cmF0aW9uID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZHVyYXRpb25NcyI7CkBAIC01NzcsNiArNTc4LDEwIEBACiAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtQbGF5ZXJGcmFtZXMsIG51bUZyYW1lc1RvdGFsKTsKICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa1BsYXllckZyYW1lc0Ryb3BwZWQsIG51bUZyYW1lc0Ryb3BwZWQpOwogCisgICAgICAgICAgICAgICAgZmxvYXQgZnJhbWVSYXRlID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHMtPmZpbmRGbG9hdCgiZnJhbWUtcmF0ZS10b3RhbCIsICZmcmFtZVJhdGUpKSB7CisgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXREb3VibGUoa1BsYXllckZyYW1lUmF0ZSwgKGRvdWJsZSkgZnJhbWVSYXRlKTsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIH0gZWxzZSBpZiAobWltZS5zdGFydHNXaXRoKCJhdWRpby8iKSkgewogICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJBTWltZSwgbWltZS5jX3N0cigpKTsKQEAgLTYwMiw2ICs2MDcsNyBAQAogICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa1BsYXllclJlYnVmZmVyaW5nLCAobVJlYnVmZmVyaW5nVGltZVVzKzUwMCkvMTAwMCApOwogICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa1BsYXllclJlYnVmZmVyaW5nQ291bnQsIG1SZWJ1ZmZlcmluZ0V2ZW50cyk7CiAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUGxheWVyUmVidWZmZXJpbmdBdEV4aXQsIG1SZWJ1ZmZlcmluZ0F0RXhpdCk7CisKICAgICB9CiAKICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrUGxheWVyRGF0YVNvdXJjZVR5cGUsIG1QbGF5ZXItPmdldERhdGFTb3VyY2VUeXBlKCkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJtLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRybS5jcHAKaW5kZXggYmRlMDg2Mi4uOGQ4NzZkYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJtLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcm0uY3BwCkBAIC0yMzksOCArMjM5LDE0IEBACiAgICAgICAgIHNpemVfdCAqZW5jcnlwdGVkYnl0ZXMpCiB7CiAgICAgLy8gc2l6ZSBuZWVkZWQgdG8gc3RvcmUgYWxsIHRoZSBjcnlwdG8gZGF0YQotICAgIHNpemVfdCBjcnlwdG9zaXplID0gc2l6ZW9mKENyeXB0b0luZm8pICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSkgKiBudW1TdWJTYW1wbGVzOworICAgIHNpemVfdCBjcnlwdG9zaXplOworICAgIC8vIHNpemVvZihDcnlwdG9JbmZvKSArIHNpemVvZihDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSkgKiBudW1TdWJTYW1wbGVzOworICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KHNpemVvZihDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSksIG51bVN1YlNhbXBsZXMsICZjcnlwdG9zaXplKSB8fAorICAgICAgICAgICAgX19idWlsdGluX2FkZF9vdmVyZmxvdyhjcnlwdG9zaXplLCBzaXplb2YoQ3J5cHRvSW5mbyksICZjcnlwdG9zaXplKSkgeworICAgICAgICBBTE9HRSgiY3J5cHRvIHNpemUgb3ZlcmZsb3ciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCiAgICAgQ3J5cHRvSW5mbyAqcmV0ID0gKENyeXB0b0luZm8qKSBtYWxsb2MoY3J5cHRvc2l6ZSk7CiAgICAgaWYgKHJldCA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJjb3VsZG4ndCBhbGxvY2F0ZSAlenUgYnl0ZXMiLCBjcnlwdG9zaXplKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcAppbmRleCBiZTExNmUzLi5jOTkwYjJhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCkBAIC0yNiw2ICsyNiw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KQEAgLTg3LDYgKzg5LDIwIEBACiAvLyBzdGF0aWMKIGNvbnN0IGludDY0X3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjprTWluUG9zaXRpb25VcGRhdGVEZWxheVVzID0gMTAwMDAwbGw7CiAKK3N0YXRpYyBhdWRpb19mb3JtYXRfdCBjb25zdGV4cHIgYXVkaW9Gb3JtYXRGcm9tRW5jb2RpbmcoaW50MzJfdCBwY21FbmNvZGluZykgeworICAgIHN3aXRjaCAocGNtRW5jb2RpbmcpIHsKKyAgICBjYXNlIGtBdWRpb0VuY29kaW5nUGNtRmxvYXQ6CisgICAgICAgIHJldHVybiBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworICAgIGNhc2Uga0F1ZGlvRW5jb2RpbmdQY20xNmJpdDoKKyAgICAgICAgcmV0dXJuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIGNhc2Uga0F1ZGlvRW5jb2RpbmdQY204Yml0OgorICAgICAgICByZXR1cm4gQVVESU9fRk9STUFUX1BDTV84X0JJVDsgLy8gVE9ETzogZG8gd2Ugd2FudCB0byBzdXBwb3J0IHRoaXM/CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGVuY29kaW5nOiAlZCIsIF9fZnVuY19fLCBwY21FbmNvZGluZyk7CisgICAgICAgIHJldHVybiBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICB9Cit9CisKIE51UGxheWVyOjpSZW5kZXJlcjo6UmVuZGVyZXIoCiAgICAgICAgIGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiAmc2luaywKICAgICAgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gJm1lZGlhQ2xvY2ssCkBAIC0xODgzLDggKzE4OTksMTMgQEAKICAgICBpbnQzMl90IHNhbXBsZVJhdGU7CiAgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoInNhbXBsZS1yYXRlIiwgJnNhbXBsZVJhdGUpKTsKIAorICAgIC8vIHJlYWQgcGNtIGVuY29kaW5nIGZyb20gTWVkaWFDb2RlYyBvdXRwdXQgZm9ybWF0LCBpZiBhdmFpbGFibGUKKyAgICBpbnQzMl90IHBjbUVuY29kaW5nOworICAgIGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0ID0KKyAgICAgICAgICAgIGZvcm1hdC0+ZmluZEludDMyKEtFWV9QQ01fRU5DT0RJTkcsICZwY21FbmNvZGluZykgPworICAgICAgICAgICAgICAgICAgICBhdWRpb0Zvcm1hdEZyb21FbmNvZGluZyhwY21FbmNvZGluZykgOiBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKwogICAgIGlmIChvZmZsb2FkaW5nQXVkaW8oKSkgewotICAgICAgICBhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgICAgICBBU3RyaW5nIG1pbWU7CiAgICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7CiAgICAgICAgIHN0YXR1c190IGVyciA9IG1hcE1pbWVUb0F1ZGlvRm9ybWF0KGF1ZGlvRm9ybWF0LCBtaW1lLmNfc3RyKCkpOwpAQCAtMTk4Niw3ICsyMDA3LDcgQEAKICAgICAgICAgY29uc3QgUGNtSW5mbyBpbmZvID0gewogICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdCljaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpcGNtRmxhZ3MsCi0gICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIC8vIFRPRE86IGNoYW5nZSB0byBhdWRpb0Zvcm1hdAorICAgICAgICAgICAgICAgIGF1ZGlvRm9ybWF0LAogICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLAogICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUKICAgICAgICAgfTsKQEAgLTIwMjUsNyArMjA0Niw3IEBACiAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAorICAgICAgICAgICAgICAgICAgICBhdWRpb0Zvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgMCAvKiBidWZmZXJDb3VudCAtIHVudXNlZCAqLywKICAgICAgICAgICAgICAgICAgICAgbVVzZUF1ZGlvQ2FsbGJhY2sgPyAmTnVQbGF5ZXI6OlJlbmRlcmVyOjpBdWRpb1NpbmtDYWxsYmFjayA6IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgIG1Vc2VBdWRpb0NhbGxiYWNrID8gdGhpcyA6IE5VTEwsCkBAIC0yMDgzLDQgKzIxMDQsMyBAQAogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaAppbmRleCBhMDQ3OTc1Li5hNTIxZjYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmgKQEAgLTI4LDcgKzI4LDcgQEAKIGNsYXNzICBBV2FrZUxvY2s7CiBzdHJ1Y3QgTWVkaWFDbG9jazsKIGNsYXNzIE1lZGlhQ29kZWNCdWZmZXI7Ci1zdHJ1Y3QgVmlkZW9GcmFtZVNjaGVkdWxlcjsKK3N0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTsKIAogc3RydWN0IE51UGxheWVyOjpSZW5kZXJlciA6IHB1YmxpYyBBSGFuZGxlciB7CiAgICAgZW51bSBGbGFncyB7CkBAIC0xNTYsNyArMTU2LDcgQEAKICAgICBMaXN0PFF1ZXVlRW50cnk+IG1BdWRpb1F1ZXVlOwogICAgIExpc3Q8UXVldWVFbnRyeT4gbVZpZGVvUXVldWU7CiAgICAgdWludDMyX3QgbU51bUZyYW1lc1dyaXR0ZW47Ci0gICAgc3A8VmlkZW9GcmFtZVNjaGVkdWxlcj4gbVZpZGVvU2NoZWR1bGVyOworICAgIHNwPFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlPiBtVmlkZW9TY2hlZHVsZXI7CiAKICAgICBib29sIG1EcmFpbkF1ZGlvUXVldWVQZW5kaW5nOwogICAgIGJvb2wgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmc7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IGU4NmI2OGEuLjQ3NDlhOGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xMSw2ICsxMSw3IEBACiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMiIsCiAgICAgXSwKIAogICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibmJsb2cvQW5kcm9pZC5icAppbmRleCA3NGFhZjc3Li4xMTg4MzIwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmxvZy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm5ibG9nL0FuZHJvaWQuYnAKQEAgLTMsOSArMywxMyBAQAogICAgIG5hbWU6ICJsaWJuYmxvZyIsCiAKICAgICBzcmNzOiBbCi0gICAgICAgICJOQkxvZy5jcHAiLAorICAgICAgICAiRW50cnkuY3BwIiwKKyAgICAgICAgIk1lcmdlci5jcHAiLAogICAgICAgICAiUGVyZm9ybWFuY2VBbmFseXNpcy5jcHAiLAorICAgICAgICAiUmVhZGVyLmNwcCIsCiAgICAgICAgICJSZXBvcnRQZXJmb3JtYW5jZS5jcHAiLAorICAgICAgICAiVGltZWxpbmUuY3BwIiwKKyAgICAgICAgIldyaXRlci5jcHAiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwpAQCAtMTMsOSArMTcsMTQgQEAKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJqc29uY3BwIiwKKyAgICBdLAorCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1XYWxsIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL0VudHJ5LmNwcCBiL21lZGlhL2xpYm5ibG9nL0VudHJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODc1NjM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvRW50cnkuY3BwCkBAIC0wLDAgKzEsMjYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJOQkxvZyIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm8uaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FbnRyeS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0V2ZW50cy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgTkJMb2cgeworCitpbnQgRW50cnk6OmNvcHlFbnRyeURhdGFBdChzaXplX3Qgb2Zmc2V0KSBjb25zdAoreworICAgIC8vIEZJWE1FIFRoaXMgaXMgdG9vIHNsb3cKKyAgICBpZiAob2Zmc2V0ID09IDApIHsKKyAgICAgICAgcmV0dXJuIG1FdmVudDsKKyAgICB9IGVsc2UgaWYgKG9mZnNldCA9PSAxKSB7CisgICAgICAgIHJldHVybiBtTGVuZ3RoOworICAgIH0gZWxzZSBpZiAob2Zmc2V0IDwgKHNpemVfdCkgKG1MZW5ndGggKyAyKSkgeworICAgICAgICByZXR1cm4gKGludCkgKChjaGFyICopIG1EYXRhKVtvZmZzZXQgLSAyXTsKKyAgICB9IGVsc2UgaWYgKG9mZnNldCA9PSAoc2l6ZV90KSAobUxlbmd0aCArIDIpKSB7CisgICAgICAgIHJldHVybiBtTGVuZ3RoOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAwOyAgIC8vIEZJWE1FIGlzIHRoaXMgYW4gZXJyb3I/CisgICAgfQorfQorCitFbnRyeUl0ZXJhdG9yOjpFbnRyeUl0ZXJhdG9yKCkgICAvLyBEdW1teSBpbml0aWFsaXphdGlvbi4KKyAgICA6IG1QdHIobnVsbHB0cikKK3sKK30KKworRW50cnlJdGVyYXRvcjo6RW50cnlJdGVyYXRvcihjb25zdCB1aW50OF90ICplbnRyeSkKKyAgICA6IG1QdHIoZW50cnkpCit7Cit9CisKK0VudHJ5SXRlcmF0b3I6OkVudHJ5SXRlcmF0b3IoY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpCisgICAgOiBtUHRyKG90aGVyLm1QdHIpCit7Cit9CisKK2NvbnN0IGVudHJ5JiBFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvciooKSBjb25zdAoreworICAgIHJldHVybiAqKGVudHJ5KikgbVB0cjsKK30KKworY29uc3QgZW50cnkqIEVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yLT4oKSBjb25zdAoreworICAgIHJldHVybiAoZW50cnkqKSBtUHRyOworfQorCitFbnRyeUl0ZXJhdG9yJiBFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvcisrKCkKK3sKKyAgICBtUHRyICs9IG1QdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldICsgRW50cnk6OmtPdmVyaGVhZDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK0VudHJ5SXRlcmF0b3ImIEVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yLS0oKQoreworICAgIG1QdHIgLT0gbVB0cltFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0XSArIEVudHJ5OjprT3ZlcmhlYWQ7CisgICAgcmV0dXJuICp0aGlzOworfQorCitFbnRyeUl0ZXJhdG9yIEVudHJ5SXRlcmF0b3I6Om5leHQoKSBjb25zdAoreworICAgIEVudHJ5SXRlcmF0b3IgYXV4KCp0aGlzKTsKKyAgICByZXR1cm4gKythdXg7Cit9CisKK0VudHJ5SXRlcmF0b3IgRW50cnlJdGVyYXRvcjo6cHJldigpIGNvbnN0Cit7CisgICAgRW50cnlJdGVyYXRvciBhdXgoKnRoaXMpOworICAgIHJldHVybiAtLWF1eDsKK30KKworYm9vbCBFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvciE9KGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKSBjb25zdAoreworICAgIHJldHVybiBtUHRyICE9IG90aGVyLm1QdHI7Cit9CisKK2ludCBFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvci0oY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1QdHIgLSBvdGhlci5tUHRyOworfQorCitib29sIEVudHJ5SXRlcmF0b3I6Omhhc0NvbnNpc3RlbnRMZW5ndGgoKSBjb25zdAoreworICAgIHJldHVybiBtUHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSA9PSBtUHRyW21QdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldICsKKyAgICAgICAgRW50cnk6OmtPdmVyaGVhZCArIEVudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXRdOworfQorCit2b2lkIEVudHJ5SXRlcmF0b3I6OmNvcHlUbyhzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QpIGNvbnN0Cit7CisgICAgc2l6ZV90IGxlbmd0aCA9IG1QdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldICsgRW50cnk6OmtPdmVyaGVhZDsKKyAgICBkc3QtPndyaXRlKG1QdHIsIGxlbmd0aCk7Cit9CisKK3ZvaWQgRW50cnlJdGVyYXRvcjo6Y29weURhdGEodWludDhfdCAqZHN0KSBjb25zdAoreworICAgIG1lbWNweSgodm9pZCopIGRzdCwgbVB0ciArIG9mZnNldG9mKGVudHJ5LCBkYXRhKSwgbVB0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0pOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RkOjp1bmlxdWVfcHRyPEFic3RyYWN0RW50cnk+IEFic3RyYWN0RW50cnk6OmJ1aWxkRW50cnkoY29uc3QgdWludDhfdCAqcHRyKQoreworICAgIGlmIChwdHIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY29uc3QgdWludDhfdCB0eXBlID0gRW50cnlJdGVyYXRvcihwdHIpLT50eXBlOworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgRVZFTlRfRk1UX1NUQVJUOgorICAgICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxGb3JtYXRFbnRyeT4oRm9ybWF0RW50cnkocHRyKSk7CisgICAgY2FzZSBFVkVOVF9BVURJT19TVEFURToKKyAgICBjYXNlIEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUzoKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8SGlzdG9ncmFtRW50cnk+KEhpc3RvZ3JhbUVudHJ5KHB0cikpOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dXKCJUcmllZCB0byBjcmVhdGUgQWJzdHJhY3RFbnRyeSBvZiB0eXBlICVkIiwgdHlwZSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KK30KKworRW50cnlJdGVyYXRvciBGb3JtYXRFbnRyeTo6YmVnaW4oKSBjb25zdAoreworICAgIHJldHVybiBFbnRyeUl0ZXJhdG9yKG1FbnRyeSk7Cit9CisKK2NvbnN0IGNoYXIgKkZvcm1hdEVudHJ5Ojpmb3JtYXRTdHJpbmcoKSBjb25zdAoreworICAgIHJldHVybiAoY29uc3QgY2hhciopIG1FbnRyeSArIG9mZnNldG9mKGVudHJ5LCBkYXRhKTsKK30KKworc2l6ZV90IEZvcm1hdEVudHJ5Ojpmb3JtYXRTdHJpbmdMZW5ndGgoKSBjb25zdAoreworICAgIHJldHVybiBtRW50cnlbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldOworfQorCitFbnRyeUl0ZXJhdG9yIEZvcm1hdEVudHJ5OjphcmdzKCkgY29uc3QKK3sKKyAgICBhdXRvIGl0ID0gYmVnaW4oKTsKKyAgICArK2l0OyAvLyBza2lwIHN0YXJ0IGZtdAorICAgICsraXQ7IC8vIHNraXAgdGltZXN0YW1wCisgICAgKytpdDsgLy8gc2tpcCBoYXNoCisgICAgLy8gU2tpcCBhdXRob3IgaWYgcHJlc2VudAorICAgIGlmIChpdC0+dHlwZSA9PSBFVkVOVF9GTVRfQVVUSE9SKSB7CisgICAgICAgICsraXQ7CisgICAgfQorICAgIHJldHVybiBpdDsKK30KKworaW50NjRfdCBGb3JtYXRFbnRyeTo6dGltZXN0YW1wKCkgY29uc3QKK3sKKyAgICBhdXRvIGl0ID0gYmVnaW4oKTsKKyAgICArK2l0OyAvLyBza2lwIHN0YXJ0IGZtdAorICAgIHJldHVybiBpdC5wYXlsb2FkPGludDY0X3Q+KCk7Cit9CisKK2xvZ19oYXNoX3QgRm9ybWF0RW50cnk6Omhhc2goKSBjb25zdAoreworICAgIGF1dG8gaXQgPSBiZWdpbigpOworICAgICsraXQ7IC8vIHNraXAgc3RhcnQgZm10CisgICAgKytpdDsgLy8gc2tpcCB0aW1lc3RhbXAKKyAgICAvLyB1bmFsaWduZWQgNjQtYml0IHJlYWQgbm90IHN1cHBvcnRlZAorICAgIGxvZ19oYXNoX3QgaGFzaDsKKyAgICBtZW1jcHkoJmhhc2gsIGl0LT5kYXRhLCBzaXplb2YoaGFzaCkpOworICAgIHJldHVybiBoYXNoOworfQorCitpbnQgRm9ybWF0RW50cnk6OmF1dGhvcigpIGNvbnN0Cit7CisgICAgYXV0byBpdCA9IGJlZ2luKCk7CisgICAgKytpdDsgLy8gc2tpcCBzdGFydCBmbXQKKyAgICArK2l0OyAvLyBza2lwIHRpbWVzdGFtcAorICAgICsraXQ7IC8vIHNraXAgaGFzaAorICAgIC8vIGlmIHRoZXJlIGlzIGFuIGF1dGhvciBlbnRyeSwgcmV0dXJuIGl0LCByZXR1cm4gLTEgb3RoZXJ3aXNlCisgICAgcmV0dXJuIGl0LT50eXBlID09IEVWRU5UX0ZNVF9BVVRIT1IgPyBpdC5wYXlsb2FkPGludD4oKSA6IC0xOworfQorCitFbnRyeUl0ZXJhdG9yIEZvcm1hdEVudHJ5Ojpjb3B5V2l0aEF1dGhvcigKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LCBpbnQgYXV0aG9yKSBjb25zdAoreworICAgIGF1dG8gaXQgPSBiZWdpbigpOworICAgIGl0LmNvcHlUbyhkc3QpOyAgICAgLy8gY29weSBmbXQgc3RhcnQgZW50cnkKKyAgICAoKytpdCkuY29weVRvKGRzdCk7IC8vIGNvcHkgdGltZXN0YW1wCisgICAgKCsraXQpLmNvcHlUbyhkc3QpOyAvLyBjb3B5IGhhc2gKKyAgICAvLyBpbnNlcnQgYXV0aG9yIGVudHJ5CisgICAgc2l6ZV90IGF1dGhvckVudHJ5U2l6ZSA9IEVudHJ5OjprT3ZlcmhlYWQgKyBzaXplb2YoYXV0aG9yKTsKKyAgICB1aW50OF90IGF1dGhvckVudHJ5W2F1dGhvckVudHJ5U2l6ZV07CisgICAgYXV0aG9yRW50cnlbb2Zmc2V0b2YoZW50cnksIHR5cGUpXSA9IEVWRU5UX0ZNVF9BVVRIT1I7CisgICAgYXV0aG9yRW50cnlbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldID0KKyAgICAgICAgYXV0aG9yRW50cnlbYXV0aG9yRW50cnlTaXplICsgRW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldF0gPQorICAgICAgICBzaXplb2YoYXV0aG9yKTsKKyAgICAqKGludCopICgmYXV0aG9yRW50cnlbb2Zmc2V0b2YoZW50cnksIGRhdGEpXSkgPSBhdXRob3I7CisgICAgZHN0LT53cml0ZShhdXRob3JFbnRyeSwgYXV0aG9yRW50cnlTaXplKTsKKyAgICAvLyBjb3B5IHJlc3Qgb2YgZW50cmllcworICAgIHdoaWxlICgoKytpdCktPnR5cGUgIT0gRVZFTlRfRk1UX0VORCkgeworICAgICAgICBpdC5jb3B5VG8oZHN0KTsKKyAgICB9CisgICAgaXQuY29weVRvKGRzdCk7CisgICAgKytpdDsKKyAgICByZXR1cm4gaXQ7Cit9CisKK2ludDY0X3QgSGlzdG9ncmFtRW50cnk6OnRpbWVzdGFtcCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIEVudHJ5SXRlcmF0b3IobUVudHJ5KS5wYXlsb2FkPEhpc3RUc0VudHJ5PigpLnRzOworfQorCitsb2dfaGFzaF90IEhpc3RvZ3JhbUVudHJ5OjpoYXNoKCkgY29uc3QKK3sKKyAgICByZXR1cm4gRW50cnlJdGVyYXRvcihtRW50cnkpLnBheWxvYWQ8SGlzdFRzRW50cnk+KCkuaGFzaDsKK30KKworaW50IEhpc3RvZ3JhbUVudHJ5OjphdXRob3IoKSBjb25zdAoreworICAgIEVudHJ5SXRlcmF0b3IgaXQobUVudHJ5KTsKKyAgICByZXR1cm4gaXQtPmxlbmd0aCA9PSBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKQorICAgICAgICAgICAgPyBpdC5wYXlsb2FkPEhpc3RUc0VudHJ5V2l0aEF1dGhvcj4oKS5hdXRob3IgOiAtMTsKK30KKworRW50cnlJdGVyYXRvciBIaXN0b2dyYW1FbnRyeTo6Y29weVdpdGhBdXRob3IoCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwgaW50IGF1dGhvcikgY29uc3QKK3sKKyAgICAvLyBDdXJyZW50IGhpc3RvZ3JhbSBlbnRyeSBoYXMge3R5cGUsIGxlbmd0aCwgc3RydWN0IEhpc3RUc0VudHJ5LCBsZW5ndGh9LgorICAgIC8vIFdlIG5vdyB3YW50IHt0eXBlLCBsZW5ndGgsIHN0cnVjdCBIaXN0VHNFbnRyeVdpdGhBdXRob3IsIGxlbmd0aH0KKyAgICB1aW50OF90IGJ1ZmZlcltFbnRyeTo6a092ZXJoZWFkICsgc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcildOworICAgIC8vIENvcHkgY29udGVudCB1bnRpbCB0aGUgcG9pbnQgd2Ugd2FudCB0byBhZGQgdGhlIGF1dGhvcgorICAgIG1lbWNweShidWZmZXIsIG1FbnRyeSwgc2l6ZW9mKGVudHJ5KSArIHNpemVvZihIaXN0VHNFbnRyeSkpOworICAgIC8vIENvcHkgdGhlIGF1dGhvcgorICAgICooaW50KikgKGJ1ZmZlciArIHNpemVvZihlbnRyeSkgKyBzaXplb2YoSGlzdFRzRW50cnkpKSA9IGF1dGhvcjsKKyAgICAvLyBVcGRhdGUgbGVuZ3RocworICAgIGJ1ZmZlcltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gPSBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKTsKKyAgICBidWZmZXJbb2Zmc2V0b2YoZW50cnksIGRhdGEpICsgc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcikgKyBvZmZzZXRvZihlbmRpbmcsIGxlbmd0aCldCisgICAgICAgID0gc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcik7CisgICAgLy8gV3JpdGUgbmV3IGJ1ZmZlciBpbnRvIEZJRk8KKyAgICBkc3QtPndyaXRlKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICAgIHJldHVybiBFbnRyeUl0ZXJhdG9yKG1FbnRyeSkubmV4dCgpOworfQorCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL01lcmdlci5jcHAgYi9tZWRpYS9saWJuYmxvZy9NZXJnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZDZkNmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9NZXJnZXIuY3BwCkBAIC0wLDAgKzEsMzIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJOQkxvZyIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9maWZvLmg+CisjaW5jbHVkZSA8anNvbi9qc29uLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvTWVyZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVhZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvVGltZWxpbmUuaD4KKyNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9UaHJlYWQuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIE5CTG9nIHsKKworTWVyZ2VyOjpNZXJnZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk6CisgICAgICBtU2hhcmVkKChTaGFyZWQgKikgc2hhcmVkKSwKKyAgICAgIG1GaWZvKG1TaGFyZWQgIT0gTlVMTCA/CisgICAgICAgIG5ldyBhdWRpb191dGlsc19maWZvKHNpemUsIHNpemVvZih1aW50OF90KSwKKyAgICAgICAgICAgIG1TaGFyZWQtPm1CdWZmZXIsIG1TaGFyZWQtPm1SZWFyLCBOVUxMIC8qdGhyb3R0bGVzRnJvbnQqLykgOiBOVUxMKSwKKyAgICAgIG1GaWZvV3JpdGVyKG1GaWZvICE9IE5VTEwgPyBuZXcgYXVkaW9fdXRpbHNfZmlmb193cml0ZXIoKm1GaWZvKSA6IE5VTEwpCit7Cit9CisKK3ZvaWQgTWVyZ2VyOjphZGRSZWFkZXIoY29uc3Qgc3A8UmVhZGVyPiAmcmVhZGVyKQoreworICAgIC8vIEZJWE1FIFRoaXMgaXMgY2FsbGVkIGJ5IGJpbmRlciB0aHJlYWQgaW4gTWVkaWFMb2dTZXJ2aWNlOjpyZWdpc3RlcldyaXRlcgorICAgIC8vICAgICAgIGJ1dCB0aGUgYWNjZXNzIHRvIHNoYXJlZCB2YXJpYWJsZSBtUmVhZGVycyBpcyBub3QgeWV0IHByb3RlY3RlZCBieSBhIGxvY2suCisgICAgbVJlYWRlcnMucHVzaF9iYWNrKHJlYWRlcik7Cit9CisKKy8vIGl0ZW1zIHBsYWNlZCBpbiBwcmlvcml0eSBxdWV1ZSBkdXJpbmcgbWVyZ2UKKy8vIGNvbXBvc2VkIGJ5IGEgdGltZXN0YW1wIGFuZCB0aGUgaW5kZXggb2YgdGhlIHNuYXBzaG90IHdoZXJlIHRoZSB0aW1lc3RhbXAgY2FtZSBmcm9tCitzdHJ1Y3QgTWVyZ2VJdGVtCit7CisgICAgaW50NjRfdCB0czsKKyAgICBpbnQgaW5kZXg7CisgICAgTWVyZ2VJdGVtKGludDY0X3QgdHMsIGludCBpbmRleCk6IHRzKHRzKSwgaW5kZXgoaW5kZXgpIHt9Cit9OworCitib29sIG9wZXJhdG9yPihjb25zdCBzdHJ1Y3QgTWVyZ2VJdGVtICZpMSwgY29uc3Qgc3RydWN0IE1lcmdlSXRlbSAmaTIpCit7CisgICAgcmV0dXJuIGkxLnRzID4gaTIudHMgfHwgKGkxLnRzID09IGkyLnRzICYmIGkxLmluZGV4ID4gaTIuaW5kZXgpOworfQorCisvLyBNZXJnZSByZWdpc3RlcmVkIHJlYWRlcnMsIHNvcnRlZCBieSB0aW1lc3RhbXAsIGFuZCB3cml0ZSBkYXRhIHRvIGEgc2luZ2xlIEZJRk8gaW4gbG9jYWwgbWVtb3J5Cit2b2lkIE1lcmdlcjo6bWVyZ2UoKQoreworICAgIGlmICh0cnVlKSByZXR1cm47IC8vIE1lcmdpbmcgaXMgbm90IG5lY2Vzc2FyeSBhdCB0aGUgbW9tZW50LCBzbyB0aGlzIGlzIHRvIGRpc2FibGUgaXQKKyAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgYnlwYXNzIGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IG1lbWJlciB2YXJpYWJsZXMgbm90IGJlaW5nIHVzZWQuCisgICAgY29uc3QgaW50IG5Mb2dzID0gbVJlYWRlcnMuc2l6ZSgpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4+IHNuYXBzaG90cyhuTG9ncyk7CisgICAgc3RkOjp2ZWN0b3I8RW50cnlJdGVyYXRvcj4gb2Zmc2V0czsKKyAgICBvZmZzZXRzLnJlc2VydmUobkxvZ3MpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkxvZ3M7ICsraSkgeworICAgICAgICBzbmFwc2hvdHNbaV0gPSBtUmVhZGVyc1tpXS0+Z2V0U25hcHNob3QoKTsKKyAgICAgICAgb2Zmc2V0cy5wdXNoX2JhY2soc25hcHNob3RzW2ldLT5iZWdpbigpKTsKKyAgICB9CisgICAgLy8gaW5pdGlhbGl6ZSBvZmZzZXRzCisgICAgLy8gVE9ETyBjdXN0b20gaGVhcCBpbXBsZW1lbnRhdGlvbiBjb3VsZCBhbGxvdyB0byB1cGRhdGUgdG9wLCBpbXByb3ZpbmcgcGVyZm9ybWFuY2UKKyAgICAvLyBmb3IgYnVyc3R5IGJ1ZmZlcnMKKyAgICBzdGQ6OnByaW9yaXR5X3F1ZXVlPE1lcmdlSXRlbSwgc3RkOjp2ZWN0b3I8TWVyZ2VJdGVtPiwgc3RkOjpncmVhdGVyPE1lcmdlSXRlbT4+IHRpbWVzdGFtcHM7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuTG9nczsgKytpKQorICAgIHsKKyAgICAgICAgaWYgKG9mZnNldHNbaV0gIT0gc25hcHNob3RzW2ldLT5lbmQoKSkgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEFic3RyYWN0RW50cnk+IGFic3RyYWN0RW50cnkgPSBBYnN0cmFjdEVudHJ5OjpidWlsZEVudHJ5KG9mZnNldHNbaV0pOworICAgICAgICAgICAgaWYgKGFic3RyYWN0RW50cnkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGltZXN0YW1wcy5lbXBsYWNlKGFic3RyYWN0RW50cnktPnRpbWVzdGFtcCgpLCBpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHdoaWxlICghdGltZXN0YW1wcy5lbXB0eSgpKSB7CisgICAgICAgIGludCBpbmRleCA9IHRpbWVzdGFtcHMudG9wKCkuaW5kZXg7ICAgICAvLyBmaW5kIG1pbmltdW0gdGltZXN0YW1wCisgICAgICAgIC8vIGNvcHkgaXQgdG8gdGhlIGxvZywgaW5jcmVhc2luZyBvZmZzZXQKKyAgICAgICAgb2Zmc2V0c1tpbmRleF0gPSBBYnN0cmFjdEVudHJ5OjpidWlsZEVudHJ5KG9mZnNldHNbaW5kZXhdKS0+CisgICAgICAgICAgICBjb3B5V2l0aEF1dGhvcihtRmlmb1dyaXRlciwgaW5kZXgpOworICAgICAgICAvLyB1cGRhdGUgZGF0YSBzdHJ1Y3R1cmVzCisgICAgICAgIHRpbWVzdGFtcHMucG9wKCk7CisgICAgICAgIGlmIChvZmZzZXRzW2luZGV4XSAhPSBzbmFwc2hvdHNbaW5kZXhdLT5lbmQoKSkgeworICAgICAgICAgICAgaW50NjRfdCB0cyA9IEFic3RyYWN0RW50cnk6OmJ1aWxkRW50cnkob2Zmc2V0c1tpbmRleF0pLT50aW1lc3RhbXAoKTsKKyAgICAgICAgICAgIHRpbWVzdGFtcHMuZW1wbGFjZSh0cywgaW5kZXgpOworICAgICAgICB9CisgICAgfQorfQorCitjb25zdCBzdGQ6OnZlY3RvcjxzcDxSZWFkZXI+PiYgTWVyZ2VyOjpnZXRSZWFkZXJzKCkgY29uc3QKK3sKKyAgICAvL0F1dG9NdXRleCBfbChtTG9jayk7CisgICAgcmV0dXJuIG1SZWFkZXJzOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTWVyZ2VSZWFkZXI6Ok1lcmdlUmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUsIE1lcmdlciAmbWVyZ2VyKQorICAgIDogUmVhZGVyKHNoYXJlZCwgc2l6ZSwgIk1lcmdlUmVhZGVyIiksIG1SZWFkZXJzKG1lcmdlci5nZXRSZWFkZXJzKCkpCit7Cit9CisKKy8vIFRha2VzIHJhdyBjb250ZW50IG9mIHRoZSBsb2NhbCBtZXJnZXIgRklGTywgcHJvY2Vzc2VzIGxvZyBlbnRyaWVzLCBhbmQKKy8vIHdyaXRlcyB0aGUgZGF0YSB0byBhIG1hcCBvZiBjbGFzcyBQZXJmb3JtYW5jZUFuYWx5c2lzLCBiYXNlZCBvbiB0aGVpciB0aHJlYWQgSUQuCit2b2lkIE1lcmdlUmVhZGVyOjpwcm9jZXNzU25hcHNob3QoU25hcHNob3QgJnNuYXBzaG90LCBpbnQgYXV0aG9yKQoreworICAgIFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZURhdGEmIGRhdGEgPSBtVGhyZWFkUGVyZm9ybWFuY2VEYXRhW2F1dGhvcl07CisgICAgLy8gV2UgZG9uJ3QgZG8gImF1dG8gaXQiIGJlY2F1c2UgaXQgcmVkdWNlcyByZWFkYWJpbGl0eSBpbiB0aGlzIGNhc2UuCisgICAgZm9yIChFbnRyeUl0ZXJhdG9yIGl0ID0gc25hcHNob3QuYmVnaW4oKTsgaXQgIT0gc25hcHNob3QuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgc3dpdGNoIChpdC0+dHlwZSkgeworICAgICAgICBjYXNlIEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUzogeworICAgICAgICAgICAgY29uc3QgSGlzdFRzRW50cnkgcGF5bG9hZCA9IGl0LnBheWxvYWQ8SGlzdFRzRW50cnk+KCk7CisgICAgICAgICAgICAvLyBUT0RPOiBoYXNoIGZvciBoaXN0b2dyYW0gdHMgYW5kIGF1ZGlvIHN0YXRlIG5lZWQgdG8gbWF0Y2gKKyAgICAgICAgICAgIC8vIGFuZCBjb3JyZXNwb25kIHRvIGF1ZGlvIHByb2R1Y3Rpb24gc291cmNlIGZpbGUgbG9jYXRpb24KKyAgICAgICAgICAgIG1UaHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzW2F1dGhvcl1bMCAvKmhhc2gqL10ubG9nVHNFbnRyeShwYXlsb2FkLnRzKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9BVURJT19TVEFURTogeworICAgICAgICAgICAgbVRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXNbYXV0aG9yXVswIC8qaGFzaCovXS5oYW5kbGVTdGF0ZUNoYW5nZSgpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1RIUkVBRF9JTkZPOiB7CisgICAgICAgICAgICBjb25zdCB0aHJlYWRfaW5mb190IGluZm8gPSBpdC5wYXlsb2FkPHRocmVhZF9pbmZvX3Q+KCk7CisgICAgICAgICAgICBkYXRhLnRocmVhZEluZm8gPSBpbmZvOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1RIUkVBRF9QQVJBTVM6IHsKKyAgICAgICAgICAgIGNvbnN0IHRocmVhZF9wYXJhbXNfdCBwYXJhbXMgPSBpdC5wYXlsb2FkPHRocmVhZF9wYXJhbXNfdD4oKTsKKyAgICAgICAgICAgIGRhdGEudGhyZWFkUGFyYW1zID0gcGFyYW1zOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX0xBVEVOQ1k6IHsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBsYXRlbmN5TXMgPSBpdC5wYXlsb2FkPGRvdWJsZT4oKTsKKyAgICAgICAgICAgIGRhdGEubGF0ZW5jeUhpc3QuYWRkKGxhdGVuY3lNcyk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfV09SS19USU1FOiB7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IG1vbm90b25pY05zID0gaXQucGF5bG9hZDxpbnQ2NF90PigpOworICAgICAgICAgICAgY29uc3QgZG91YmxlIG1vbm90b25pY01zID0gbW9ub3RvbmljTnMgKiAxZS02OworICAgICAgICAgICAgZGF0YS53b3JrSGlzdC5hZGQobW9ub3RvbmljTXMpOworICAgICAgICAgICAgZGF0YS5hY3RpdmUgKz0gbW9ub3RvbmljTnM7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfV0FSTVVQX1RJTUU6IHsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSB0aW1lTXMgPSBpdC5wYXlsb2FkPGRvdWJsZT4oKTsKKyAgICAgICAgICAgIGRhdGEud2FybXVwSGlzdC5hZGQodGltZU1zKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9VTkRFUlJVTjogeworICAgICAgICAgICAgY29uc3QgaW50NjRfdCB0cyA9IGl0LnBheWxvYWQ8aW50NjRfdD4oKTsKKyAgICAgICAgICAgIGRhdGEudW5kZXJydW5zKys7CisgICAgICAgICAgICBkYXRhLnNuYXBzaG90cy5lbXBsYWNlX2Zyb250KEVWRU5UX1VOREVSUlVOLCB0cyk7CisgICAgICAgICAgICAvLyBUT0RPIGhhdmUgYSBkYXRhIHN0cnVjdHVyZSB0byBhdXRvbWF0aWNhbGx5IGhhbmRsZSByZXNpemluZworICAgICAgICAgICAgaWYgKGRhdGEuc25hcHNob3RzLnNpemUoKSA+IFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZURhdGE6OmtNYXhTbmFwc2hvdHNUb1N0b3JlKSB7CisgICAgICAgICAgICAgICAgZGF0YS5zbmFwc2hvdHMucG9wX2JhY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9PVkVSUlVOOiB7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRzID0gaXQucGF5bG9hZDxpbnQ2NF90PigpOworICAgICAgICAgICAgZGF0YS5vdmVycnVucysrOworICAgICAgICAgICAgZGF0YS5zbmFwc2hvdHMuZW1wbGFjZV9mcm9udChFVkVOVF9VTkRFUlJVTiwgdHMpOworICAgICAgICAgICAgLy8gVE9ETyBoYXZlIGEgZGF0YSBzdHJ1Y3R1cmUgdG8gYXV0b21hdGljYWxseSBoYW5kbGUgcmVzaXppbmcKKyAgICAgICAgICAgIGlmIChkYXRhLnNuYXBzaG90cy5zaXplKCkgPiBSZXBvcnRQZXJmb3JtYW5jZTo6UGVyZm9ybWFuY2VEYXRhOjprTWF4U25hcHNob3RzVG9TdG9yZSkgeworICAgICAgICAgICAgICAgIGRhdGEuc25hcHNob3RzLnBvcF9iYWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfUkVTRVJWRUQ6CisgICAgICAgIGNhc2UgRVZFTlRfVVBQRVJfQk9VTkQ6CisgICAgICAgICAgICBBTE9HVygid2FybmluZzogdW5leHBlY3RlZCBldmVudCAlZCIsIGl0LT50eXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTWVyZ2VSZWFkZXI6OmdldEFuZFByb2Nlc3NTbmFwc2hvdCgpCit7CisgICAgLy8gZ2V0IGEgc25hcHNob3Qgb2YgZWFjaCByZWFkZXIgYW5kIHByb2Nlc3MgdGhlbQorICAgIC8vIFRPRE8gaW5zZXJ0IGxvY2sgaGVyZQorICAgIGNvbnN0IHNpemVfdCBuTG9ncyA9IG1SZWFkZXJzLnNpemUoKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+PiBzbmFwc2hvdHMobkxvZ3MpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbkxvZ3M7IGkrKykgeworICAgICAgICBzbmFwc2hvdHNbaV0gPSBtUmVhZGVyc1tpXS0+Z2V0U25hcHNob3QoKTsKKyAgICB9CisgICAgLy8gVE9ETyB1bmxvY2sgbG9jayBoZXJlCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuTG9nczsgaSsrKSB7CisgICAgICAgIGlmIChzbmFwc2hvdHNbaV0gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcHJvY2Vzc1NuYXBzaG90KCooc25hcHNob3RzW2ldKSwgaSk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2hlY2tQdXNoVG9NZWRpYU1ldHJpY3MoKTsKK30KKwordm9pZCBNZXJnZVJlYWRlcjo6Y2hlY2tQdXNoVG9NZWRpYU1ldHJpY3MoKQoreworICAgIGNvbnN0IG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZSgpOworICAgIGZvciAoYXV0byYgaXRlbSA6IG1UaHJlYWRQZXJmb3JtYW5jZURhdGEpIHsKKyAgICAgICAgUmVwb3J0UGVyZm9ybWFuY2U6OlBlcmZvcm1hbmNlRGF0YSYgZGF0YSA9IGl0ZW0uc2Vjb25kOworICAgICAgICBpZiAobm93IC0gZGF0YS5zdGFydCA+PSBrUGVyaW9kaWNNZWRpYU1ldHJpY3NQdXNoKSB7CisgICAgICAgICAgICAodm9pZClSZXBvcnRQZXJmb3JtYW5jZTo6c2VuZFRvTWVkaWFNZXRyaWNzKGRhdGEpOworICAgICAgICAgICAgZGF0YS5yZXNldCgpOyAgIC8vIGRhdGEgaXMgcGVyc2lzdGVudCBwZXIgdGhyZWFkCisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTWVyZ2VSZWFkZXI6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQoreworICAgIC8vIFRPRE86IGFkZCBhIG11dGV4IGFyb3VuZCBtZWRpYS5sb2cgZHVtcAorICAgIC8vIE9wdGlvbnMgZm9yIGR1bXBzeXMKKyAgICBib29sIHBhID0gZmFsc2UsIGpzb24gPSBmYWxzZSwgcGxvdHMgPSBmYWxzZSwgcmV0cm8gPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmFyZyA6IGFyZ3MpIHsKKyAgICAgICAgaWYgKGFyZyA9PSBTdHJpbmcxNigiLS1wYSIpKSB7CisgICAgICAgICAgICBwYSA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnID09IFN0cmluZzE2KCItLWpzb24iKSkgeworICAgICAgICAgICAganNvbiA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnID09IFN0cmluZzE2KCItLXBsb3RzIikpIHsKKyAgICAgICAgICAgIHBsb3RzID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChhcmcgPT0gU3RyaW5nMTYoIi0tcmV0cm8iKSkgeworICAgICAgICAgICAgcmV0cm8gPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIGlmIChwYSkgeworICAgICAgICBSZXBvcnRQZXJmb3JtYW5jZTo6ZHVtcChmZCwgMCAvKmluZGVudCovLCBtVGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpcyk7CisgICAgfQorICAgIGlmIChqc29uKSB7CisgICAgICAgIFJlcG9ydFBlcmZvcm1hbmNlOjpkdW1wSnNvbihmZCwgbVRocmVhZFBlcmZvcm1hbmNlRGF0YSk7CisgICAgfQorICAgIGlmIChwbG90cykgeworICAgICAgICBSZXBvcnRQZXJmb3JtYW5jZTo6ZHVtcFBsb3RzKGZkLCBtVGhyZWFkUGVyZm9ybWFuY2VEYXRhKTsKKyAgICB9CisgICAgaWYgKHJldHJvKSB7CisgICAgICAgIFJlcG9ydFBlcmZvcm1hbmNlOjpkdW1wUmV0cm8oZmQsIG1UaHJlYWRQZXJmb3JtYW5jZURhdGEpOworICAgIH0KK30KKwordm9pZCBNZXJnZVJlYWRlcjo6aGFuZGxlQXV0aG9yKGNvbnN0IEFic3RyYWN0RW50cnkgJmVudHJ5LCBTdHJpbmc4ICpib2R5KQoreworICAgIGludCBhdXRob3IgPSBlbnRyeS5hdXRob3IoKTsKKyAgICBpZiAoYXV0aG9yID09IC0xKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gRklYTUUgTmVlZHMgYSBsb2NrCisgICAgY29uc3QgY2hhciogbmFtZSA9IG1SZWFkZXJzW2F1dGhvcl0tPm5hbWUoKS5jX3N0cigpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJXM6ICIsIG5hbWUpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTWVyZ2VUaHJlYWQ6Ok1lcmdlVGhyZWFkKE1lcmdlciAmbWVyZ2VyLCBNZXJnZVJlYWRlciAmbWVyZ2VSZWFkZXIpCisgICAgOiBtTWVyZ2VyKG1lcmdlciksCisgICAgICBtTWVyZ2VSZWFkZXIobWVyZ2VSZWFkZXIpLAorICAgICAgbVRpbWVvdXRVcygwKQoreworfQorCitNZXJnZVRocmVhZDo6fk1lcmdlVGhyZWFkKCkKK3sKKyAgICAvLyBzZXQgZXhpdCBmbGFnLCBzZXQgdGltZW91dCB0byAwIHRvIGZvcmNlIHRocmVhZExvb3AgdG8gZXhpdCBhbmQgd2FpdCBmb3IgdGhlIHRocmVhZCB0byBqb2luCisgICAgcmVxdWVzdEV4aXQoKTsKKyAgICBzZXRUaW1lb3V0VXMoMCk7CisgICAgam9pbigpOworfQorCitib29sIE1lcmdlVGhyZWFkOjp0aHJlYWRMb29wKCkKK3sKKyAgICBib29sIGRvTWVyZ2U7CisgICAgeworICAgICAgICBBdXRvTXV0ZXggX2wobU11dGV4KTsKKyAgICAgICAgLy8gSWYgbVRpbWVvdXRVcyBpcyBuZWdhdGl2ZSwgd2FpdCBvbiB0aGUgY29uZGl0aW9uIHZhcmlhYmxlIHVudGlsIGl0J3MgcG9zaXRpdmUuCisgICAgICAgIC8vIElmIGl0J3MgcG9zaXRpdmUsIG1lcmdlLiBUaGUgbWluaW11bSBwZXJpb2QgYmV0d2VlbiB3YWtpbmcgdGhlIGNvbmRpdGlvbiB2YXJpYWJsZQorICAgICAgICAvLyBpcyBoYW5kbGVkIGluIEF1ZGlvRmxpbmdlcjo6TWVkaWFMb2dOb3RpZmllcjo6dGhyZWFkTG9vcCgpLgorICAgICAgICBtQ29uZC53YWl0KG1NdXRleCk7CisgICAgICAgIGRvTWVyZ2UgPSBtVGltZW91dFVzID4gMDsKKyAgICAgICAgbVRpbWVvdXRVcyAtPSBrVGhyZWFkU2xlZXBQZXJpb2RVczsKKyAgICB9CisgICAgaWYgKGRvTWVyZ2UpIHsKKyAgICAgICAgLy8gTWVyZ2UgZGF0YSBmcm9tIGFsbCB0aGUgcmVhZGVycworICAgICAgICBtTWVyZ2VyLm1lcmdlKCk7CisgICAgICAgIC8vIFByb2Nlc3MgdGhlIGRhdGEgY29sbGVjdGVkIGJ5IG1NZXJnZXIgYW5kIHdyaXRlIGl0IHRvIFBlcmZvcm1hbmNlQW5hbHlzaXMKKyAgICAgICAgLy8gRklYTUU6IGRlY2lkZSB3aGV0aGVyIHRvIGNhbGwgZ2V0QW5kUHJvY2Vzc1NuYXBzaG90IGV2ZXJ5IHRpbWUKKyAgICAgICAgLy8gb3Igd2hldGhlciB0byBoYXZlIGEgc2VwYXJhdGUgdGhyZWFkIHRoYXQgY2FsbHMgaXQgd2l0aCBhIGxvd2VyIGZyZXF1ZW5jeQorICAgICAgICBtTWVyZ2VSZWFkZXIuZ2V0QW5kUHJvY2Vzc1NuYXBzaG90KCk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIE1lcmdlVGhyZWFkOjp3YWtldXAoKQoreworICAgIHNldFRpbWVvdXRVcyhrVGhyZWFkV2FrZXVwUGVyaW9kVXMpOworfQorCit2b2lkIE1lcmdlVGhyZWFkOjpzZXRUaW1lb3V0VXMoaW50IHRpbWUpCit7CisgICAgQXV0b011dGV4IF9sKG1NdXRleCk7CisgICAgbVRpbWVvdXRVcyA9IHRpbWU7CisgICAgbUNvbmQuc2lnbmFsKCk7Cit9CisKK30gICAvLyBuYW1lc3BhY2UgTkJMb2cKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvTkJMb2cuY3BwIGIvbWVkaWEvbGlibmJsb2cvTkJMb2cuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmZhM2UzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm5ibG9nL05CTG9nLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJOQkxvZyIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxjbGltaXRzPgotI2luY2x1ZGUgPGRlcXVlPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPG51bWVyaWM+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL3ByY3RsLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPG5ldz4KLSNpbmNsdWRlIDxhdWRpb191dGlscy9yb3VuZHVwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbmJsb2cvTkJMb2cuaD4KLSNpbmNsdWRlIDxtZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9DYWxsU3RhY2suaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLSNpbmNsdWRlIDxxdWV1ZT4KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWludCBOQkxvZzo6RW50cnk6OmNvcHlFbnRyeURhdGFBdChzaXplX3Qgb2Zmc2V0KSBjb25zdAotewotICAgIC8vIEZJWE1FIFRoaXMgaXMgdG9vIHNsb3cKLSAgICBpZiAob2Zmc2V0ID09IDApCi0gICAgICAgIHJldHVybiBtRXZlbnQ7Ci0gICAgZWxzZSBpZiAob2Zmc2V0ID09IDEpCi0gICAgICAgIHJldHVybiBtTGVuZ3RoOwotICAgIGVsc2UgaWYgKG9mZnNldCA8IChzaXplX3QpIChtTGVuZ3RoICsgMikpCi0gICAgICAgIHJldHVybiAoKGNoYXIgKikgbURhdGEpW29mZnNldCAtIDJdOwotICAgIGVsc2UgaWYgKG9mZnNldCA9PSAoc2l6ZV90KSAobUxlbmd0aCArIDIpKQotICAgICAgICByZXR1cm4gbUxlbmd0aDsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiAwOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLypzdGF0aWMqLwotc3RkOjp1bmlxdWVfcHRyPE5CTG9nOjpBYnN0cmFjdEVudHJ5PiBOQkxvZzo6QWJzdHJhY3RFbnRyeTo6YnVpbGRFbnRyeShjb25zdCB1aW50OF90ICpwdHIpIHsKLSAgICBjb25zdCB1aW50OF90IHR5cGUgPSBFbnRyeUl0ZXJhdG9yKHB0ciktPnR5cGU7Ci0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBFVkVOVF9TVEFSVF9GTVQ6Ci0gICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEZvcm1hdEVudHJ5PihGb3JtYXRFbnRyeShwdHIpKTsKLSAgICBjYXNlIEVWRU5UX0FVRElPX1NUQVRFOgotICAgIGNhc2UgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTOgotICAgICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxIaXN0b2dyYW1FbnRyeT4oSGlzdG9ncmFtRW50cnkocHRyKSk7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR1coIlRyaWVkIHRvIGNyZWF0ZSBBYnN0cmFjdEVudHJ5IG9mIHR5cGUgJWQiLCB0eXBlKTsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotfQotCi1OQkxvZzo6QWJzdHJhY3RFbnRyeTo6QWJzdHJhY3RFbnRyeShjb25zdCB1aW50OF90ICplbnRyeSkgOiBtRW50cnkoZW50cnkpIHsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yIE5CTG9nOjpGb3JtYXRFbnRyeTo6YmVnaW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIEVudHJ5SXRlcmF0b3IobUVudHJ5KTsKLX0KLQotY29uc3QgY2hhciAqTkJMb2c6OkZvcm1hdEVudHJ5Ojpmb3JtYXRTdHJpbmcoKSBjb25zdCB7Ci0gICAgcmV0dXJuIChjb25zdCBjaGFyKikgbUVudHJ5ICsgb2Zmc2V0b2YoZW50cnksIGRhdGEpOwotfQotCi1zaXplX3QgTkJMb2c6OkZvcm1hdEVudHJ5Ojpmb3JtYXRTdHJpbmdMZW5ndGgoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1FbnRyeVtvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV07Ci19Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yIE5CTG9nOjpGb3JtYXRFbnRyeTo6YXJncygpIGNvbnN0IHsKLSAgICBhdXRvIGl0ID0gYmVnaW4oKTsKLSAgICAvLyBza2lwIHN0YXJ0IGZtdAotICAgICsraXQ7Ci0gICAgLy8gc2tpcCB0aW1lc3RhbXAKLSAgICArK2l0OwotICAgIC8vIHNraXAgaGFzaAotICAgICsraXQ7Ci0gICAgLy8gU2tpcCBhdXRob3IgaWYgcHJlc2VudAotICAgIGlmIChpdC0+dHlwZSA9PSBFVkVOVF9BVVRIT1IpIHsKLSAgICAgICAgKytpdDsKLSAgICB9Ci0gICAgcmV0dXJuIGl0OwotfQotCi1pbnQ2NF90IE5CTG9nOjpGb3JtYXRFbnRyeTo6dGltZXN0YW1wKCkgY29uc3QgewotICAgIGF1dG8gaXQgPSBiZWdpbigpOwotICAgIC8vIHNraXAgc3RhcnQgZm10Ci0gICAgKytpdDsKLSAgICByZXR1cm4gaXQucGF5bG9hZDxpbnQ2NF90PigpOwotfQotCi1OQkxvZzo6bG9nX2hhc2hfdCBOQkxvZzo6Rm9ybWF0RW50cnk6Omhhc2goKSBjb25zdCB7Ci0gICAgYXV0byBpdCA9IGJlZ2luKCk7Ci0gICAgLy8gc2tpcCBzdGFydCBmbXQKLSAgICArK2l0OwotICAgIC8vIHNraXAgdGltZXN0YW1wCi0gICAgKytpdDsKLSAgICAvLyB1bmFsaWduZWQgNjQtYml0IHJlYWQgbm90IHN1cHBvcnRlZAotICAgIGxvZ19oYXNoX3QgaGFzaDsKLSAgICBtZW1jcHkoJmhhc2gsIGl0LT5kYXRhLCBzaXplb2YoaGFzaCkpOwotICAgIHJldHVybiBoYXNoOwotfQotCi1pbnQgTkJMb2c6OkZvcm1hdEVudHJ5OjphdXRob3IoKSBjb25zdCB7Ci0gICAgYXV0byBpdCA9IGJlZ2luKCk7Ci0gICAgLy8gc2tpcCBzdGFydCBmbXQKLSAgICArK2l0OwotICAgIC8vIHNraXAgdGltZXN0YW1wCi0gICAgKytpdDsKLSAgICAvLyBza2lwIGhhc2gKLSAgICArK2l0OwotICAgIC8vIGlmIHRoZXJlIGlzIGFuIGF1dGhvciBlbnRyeSwgcmV0dXJuIGl0LCByZXR1cm4gLTEgb3RoZXJ3aXNlCi0gICAgaWYgKGl0LT50eXBlID09IEVWRU5UX0FVVEhPUikgewotICAgICAgICByZXR1cm4gaXQucGF5bG9hZDxpbnQ+KCk7Ci0gICAgfQotICAgIHJldHVybiAtMTsKLX0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3IgTkJMb2c6OkZvcm1hdEVudHJ5Ojpjb3B5V2l0aEF1dGhvcigKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LCBpbnQgYXV0aG9yKSBjb25zdCB7Ci0gICAgYXV0byBpdCA9IGJlZ2luKCk7Ci0gICAgLy8gY29weSBmbXQgc3RhcnQgZW50cnkKLSAgICBpdC5jb3B5VG8oZHN0KTsKLSAgICAvLyBjb3B5IHRpbWVzdGFtcAotICAgICgrK2l0KS5jb3B5VG8oZHN0KTsgICAgLy8gY29weSBoYXNoCi0gICAgKCsraXQpLmNvcHlUbyhkc3QpOwotICAgIC8vIGluc2VydCBhdXRob3IgZW50cnkKLSAgICBzaXplX3QgYXV0aG9yRW50cnlTaXplID0gTkJMb2c6OkVudHJ5OjprT3ZlcmhlYWQgKyBzaXplb2YoYXV0aG9yKTsKLSAgICB1aW50OF90IGF1dGhvckVudHJ5W2F1dGhvckVudHJ5U2l6ZV07Ci0gICAgYXV0aG9yRW50cnlbb2Zmc2V0b2YoZW50cnksIHR5cGUpXSA9IEVWRU5UX0FVVEhPUjsKLSAgICBhdXRob3JFbnRyeVtvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gPQotICAgICAgICBhdXRob3JFbnRyeVthdXRob3JFbnRyeVNpemUgKyBOQkxvZzo6RW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldF0gPQotICAgICAgICBzaXplb2YoYXV0aG9yKTsKLSAgICAqKGludCopICgmYXV0aG9yRW50cnlbb2Zmc2V0b2YoZW50cnksIGRhdGEpXSkgPSBhdXRob3I7Ci0gICAgZHN0LT53cml0ZShhdXRob3JFbnRyeSwgYXV0aG9yRW50cnlTaXplKTsKLSAgICAvLyBjb3B5IHJlc3Qgb2YgZW50cmllcwotICAgIHdoaWxlICgoKytpdCktPnR5cGUgIT0gRVZFTlRfRU5EX0ZNVCkgewotICAgICAgICBpdC5jb3B5VG8oZHN0KTsKLSAgICB9Ci0gICAgaXQuY29weVRvKGRzdCk7Ci0gICAgKytpdDsKLSAgICByZXR1cm4gaXQ7Ci19Ci0KLXZvaWQgTkJMb2c6OkVudHJ5SXRlcmF0b3I6OmNvcHlUbyhzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QpIGNvbnN0IHsKLSAgICBzaXplX3QgbGVuZ3RoID0gcHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSArIE5CTG9nOjpFbnRyeTo6a092ZXJoZWFkOwotICAgIGRzdC0+d3JpdGUocHRyLCBsZW5ndGgpOwotfQotCi12b2lkIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpjb3B5RGF0YSh1aW50OF90ICpkc3QpIGNvbnN0IHsKLSAgICBtZW1jcHkoKHZvaWQqKSBkc3QsIHB0ciArIG9mZnNldG9mKGVudHJ5LCBkYXRhKSwgcHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSk7Ci19Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpFbnRyeUl0ZXJhdG9yKCkKLSAgICA6IHB0cihudWxscHRyKSB7fQotCi1OQkxvZzo6RW50cnlJdGVyYXRvcjo6RW50cnlJdGVyYXRvcihjb25zdCB1aW50OF90ICplbnRyeSkKLSAgICA6IHB0cihlbnRyeSkge30KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3I6OkVudHJ5SXRlcmF0b3IoY29uc3QgTkJMb2c6OkVudHJ5SXRlcmF0b3IgJm90aGVyKQotICAgIDogcHRyKG90aGVyLnB0cikge30KLQotY29uc3QgTkJMb2c6OmVudHJ5JiBOQkxvZzo6RW50cnlJdGVyYXRvcjo6b3BlcmF0b3IqKCkgY29uc3QgewotICAgIHJldHVybiAqKGVudHJ5KikgcHRyOwotfQotCi1jb25zdCBOQkxvZzo6ZW50cnkqIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvci0+KCkgY29uc3QgewotICAgIHJldHVybiAoZW50cnkqKSBwdHI7Ci19Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yJiBOQkxvZzo6RW50cnlJdGVyYXRvcjo6b3BlcmF0b3IrKygpIHsKLSAgICBwdHIgKz0gcHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSArIE5CTG9nOjpFbnRyeTo6a092ZXJoZWFkOwotICAgIHJldHVybiAqdGhpczsKLX0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3ImIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvci0tKCkgewotICAgIHB0ciAtPSBwdHJbTkJMb2c6OkVudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXRdICsgTkJMb2c6OkVudHJ5OjprT3ZlcmhlYWQ7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotCi1OQkxvZzo6RW50cnlJdGVyYXRvciBOQkxvZzo6RW50cnlJdGVyYXRvcjo6bmV4dCgpIGNvbnN0IHsKLSAgICBFbnRyeUl0ZXJhdG9yIGF1eCgqdGhpcyk7Ci0gICAgcmV0dXJuICsrYXV4OwotfQotCi1OQkxvZzo6RW50cnlJdGVyYXRvciBOQkxvZzo6RW50cnlJdGVyYXRvcjo6cHJldigpIGNvbnN0IHsKLSAgICBFbnRyeUl0ZXJhdG9yIGF1eCgqdGhpcyk7Ci0gICAgcmV0dXJuIC0tYXV4OwotfQotCi1pbnQgTkJMb2c6OkVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yLShjb25zdCBOQkxvZzo6RW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gcHRyIC0gb3RoZXIucHRyOwotfQotCi1ib29sIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvciE9KGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKSBjb25zdCB7Ci0gICAgcmV0dXJuIHB0ciAhPSBvdGhlci5wdHI7Ci19Ci0KLWJvb2wgTkJMb2c6OkVudHJ5SXRlcmF0b3I6Omhhc0NvbnNpc3RlbnRMZW5ndGgoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHB0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gPT0gcHRyW3B0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gKwotICAgICAgICBOQkxvZzo6RW50cnk6OmtPdmVyaGVhZCArIE5CTG9nOjpFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0XTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWludDY0X3QgTkJMb2c6Okhpc3RvZ3JhbUVudHJ5Ojp0aW1lc3RhbXAoKSBjb25zdCB7Ci0gICAgcmV0dXJuIEVudHJ5SXRlcmF0b3IobUVudHJ5KS5wYXlsb2FkPEhpc3RUc0VudHJ5PigpLnRzOwotfQotCi1OQkxvZzo6bG9nX2hhc2hfdCBOQkxvZzo6SGlzdG9ncmFtRW50cnk6Omhhc2goKSBjb25zdCB7Ci0gICAgcmV0dXJuIEVudHJ5SXRlcmF0b3IobUVudHJ5KS5wYXlsb2FkPEhpc3RUc0VudHJ5PigpLmhhc2g7Ci19Ci0KLWludCBOQkxvZzo6SGlzdG9ncmFtRW50cnk6OmF1dGhvcigpIGNvbnN0IHsKLSAgICBFbnRyeUl0ZXJhdG9yIGl0KG1FbnRyeSk7Ci0gICAgaWYgKGl0LT5sZW5ndGggPT0gc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcikpIHsKLSAgICAgICAgcmV0dXJuIGl0LnBheWxvYWQ8SGlzdFRzRW50cnlXaXRoQXV0aG9yPigpLmF1dGhvcjsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotfQotCi1OQkxvZzo6RW50cnlJdGVyYXRvciBOQkxvZzo6SGlzdG9ncmFtRW50cnk6OmNvcHlXaXRoQXV0aG9yKAotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QsIGludCBhdXRob3IpIGNvbnN0IHsKLSAgICAvLyBDdXJyZW50IGhpc3RvZ3JhbSBlbnRyeSBoYXMge3R5cGUsIGxlbmd0aCwgc3RydWN0IEhpc3RUc0VudHJ5LCBsZW5ndGh9LgotICAgIC8vIFdlIG5vdyB3YW50IHt0eXBlLCBsZW5ndGgsIHN0cnVjdCBIaXN0VHNFbnRyeVdpdGhBdXRob3IsIGxlbmd0aH0KLSAgICB1aW50OF90IGJ1ZmZlcltFbnRyeTo6a092ZXJoZWFkICsgc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcildOwotICAgIC8vIENvcHkgY29udGVudCB1bnRpbCB0aGUgcG9pbnQgd2Ugd2FudCB0byBhZGQgdGhlIGF1dGhvcgotICAgIG1lbWNweShidWZmZXIsIG1FbnRyeSwgc2l6ZW9mKGVudHJ5KSArIHNpemVvZihIaXN0VHNFbnRyeSkpOwotICAgIC8vIENvcHkgdGhlIGF1dGhvcgotICAgICooaW50KikgKGJ1ZmZlciArIHNpemVvZihlbnRyeSkgKyBzaXplb2YoSGlzdFRzRW50cnkpKSA9IGF1dGhvcjsKLSAgICAvLyBVcGRhdGUgbGVuZ3RocwotICAgIGJ1ZmZlcltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gPSBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKTsKLSAgICBidWZmZXJbb2Zmc2V0b2YoZW50cnksIGRhdGEpICsgc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcikgKyBvZmZzZXRvZihlbmRpbmcsIGxlbmd0aCldCi0gICAgICAgID0gc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcik7Ci0gICAgLy8gV3JpdGUgbmV3IGJ1ZmZlciBpbnRvIEZJRk8KLSAgICBkc3QtPndyaXRlKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwotICAgIHJldHVybiBFbnRyeUl0ZXJhdG9yKG1FbnRyeSkubmV4dCgpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIDAgICAvLyBGSVhNRSBzZWUgbm90ZSBpbiBOQkxvZy5oCi1OQkxvZzo6VGltZWxpbmU6OlRpbWVsaW5lKHNpemVfdCBzaXplLCB2b2lkICpzaGFyZWQpCi0gICAgOiBtU2l6ZShyb3VuZHVwKHNpemUpKSwgbU93bihzaGFyZWQgPT0gTlVMTCksCi0gICAgICBtU2hhcmVkKChTaGFyZWQgKikgKG1Pd24gPyBuZXcgY2hhcltzaGFyZWRTaXplKHNpemUpXSA6IHNoYXJlZCkpCi17Ci0gICAgbmV3IChtU2hhcmVkKSBTaGFyZWQ7Ci19Ci0KLU5CTG9nOjpUaW1lbGluZTo6flRpbWVsaW5lKCkKLXsKLSAgICBtU2hhcmVkLT5+U2hhcmVkKCk7Ci0gICAgaWYgKG1Pd24pIHsKLSAgICAgICAgZGVsZXRlW10gKGNoYXIgKikgbVNoYXJlZDsKLSAgICB9Ci19Ci0jZW5kaWYKLQotLypzdGF0aWMqLwotc2l6ZV90IE5CTG9nOjpUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplX3Qgc2l6ZSkKLXsKLSAgICAvLyBUT0RPIGZpZm8gbm93IHN1cHBvcnRzIG5vbi1wb3dlci1vZi0yIGJ1ZmZlciBzaXplcywgc28gY291bGQgcmVtb3ZlIHRoZSByb3VuZHVwCi0gICAgcmV0dXJuIHNpemVvZihTaGFyZWQpICsgcm91bmR1cChzaXplKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU5CTG9nOjpXcml0ZXI6OldyaXRlcigpCi0gICAgOiBtU2hhcmVkKE5VTEwpLCBtRmlmbyhOVUxMKSwgbUZpZm9Xcml0ZXIoTlVMTCksIG1FbmFibGVkKGZhbHNlKSwgbVBpZFRhZyhOVUxMKSwgbVBpZFRhZ1NpemUoMCkKLXsKLX0KLQotTkJMb2c6OldyaXRlcjo6V3JpdGVyKHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpCi0gICAgOiBtU2hhcmVkKChTaGFyZWQgKikgc2hhcmVkKSwKLSAgICAgIG1GaWZvKG1TaGFyZWQgIT0gTlVMTCA/Ci0gICAgICAgIG5ldyBhdWRpb191dGlsc19maWZvKHNpemUsIHNpemVvZih1aW50OF90KSwKLSAgICAgICAgICAgIG1TaGFyZWQtPm1CdWZmZXIsIG1TaGFyZWQtPm1SZWFyLCBOVUxMIC8qdGhyb3R0bGVzRnJvbnQqLykgOiBOVUxMKSwKLSAgICAgIG1GaWZvV3JpdGVyKG1GaWZvICE9IE5VTEwgPyBuZXcgYXVkaW9fdXRpbHNfZmlmb193cml0ZXIoKm1GaWZvKSA6IE5VTEwpLAotICAgICAgbUVuYWJsZWQobUZpZm9Xcml0ZXIgIT0gTlVMTCkKLXsKLSAgICAvLyBjYWNoaW5nIHBpZCBhbmQgcHJvY2VzcyBuYW1lCi0gICAgcGlkX3QgaWQgPSA6OmdldHBpZCgpOwotICAgIGNoYXIgcHJvY05hbWVbMTZdOwotICAgIGludCBzdGF0dXMgPSBwcmN0bChQUl9HRVRfTkFNRSwgcHJvY05hbWUpOwotICAgIGlmIChzdGF0dXMpIHsgIC8vIGVycm9yIGdldHRpbmcgcHJvY2VzcyBuYW1lCi0gICAgICAgIHByb2NOYW1lWzBdID0gJ1wwJzsKLSAgICB9Ci0gICAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbihwcm9jTmFtZSk7Ci0gICAgbVBpZFRhZ1NpemUgPSBsZW5ndGggKyBzaXplb2YocGlkX3QpOwotICAgIG1QaWRUYWcgPSBuZXcgY2hhclttUGlkVGFnU2l6ZV07Ci0gICAgbWVtY3B5KG1QaWRUYWcsICZpZCwgc2l6ZW9mKHBpZF90KSk7Ci0gICAgbWVtY3B5KG1QaWRUYWcgKyBzaXplb2YocGlkX3QpLCBwcm9jTmFtZSwgbGVuZ3RoKTsKLX0KLQotTkJMb2c6OldyaXRlcjo6V3JpdGVyKGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5LCBzaXplX3Qgc2l6ZSkKLSAgICA6IFdyaXRlcihpTWVtb3J5ICE9IDAgPyAoU2hhcmVkICopIGlNZW1vcnktPnBvaW50ZXIoKSA6IE5VTEwsIHNpemUpCi17Ci0gICAgbUlNZW1vcnkgPSBpTWVtb3J5OwotfQotCi1OQkxvZzo6V3JpdGVyOjp+V3JpdGVyKCkKLXsKLSAgICBkZWxldGUgbUZpZm9Xcml0ZXI7Ci0gICAgZGVsZXRlIG1GaWZvOwotICAgIGRlbGV0ZVtdIG1QaWRUYWc7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nKGNvbnN0IGNoYXIgKnN0cmluZykKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihzdHJpbmcgPT0gTlVMTCwgIkF0dGVtcHRlZCB0byBsb2cgTlVMTCBzdHJpbmciKTsKLSAgICBzaXplX3QgbGVuZ3RoID0gc3RybGVuKHN0cmluZyk7Ci0gICAgaWYgKGxlbmd0aCA+IEVudHJ5OjprTWF4TGVuZ3RoKSB7Ci0gICAgICAgIGxlbmd0aCA9IEVudHJ5OjprTWF4TGVuZ3RoOwotICAgIH0KLSAgICBsb2coRVZFTlRfU1RSSU5HLCBzdHJpbmcsIGxlbmd0aCk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nZihjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgdmFfbGlzdCBhcDsKLSAgICB2YV9zdGFydChhcCwgZm10KTsKLSAgICBXcml0ZXI6OmxvZ3ZmKGZtdCwgYXApOyAgICAgLy8gdGhlIFdyaXRlcjo6IGlzIG5lZWRlZCB0byBhdm9pZCB2aXJ0dWFsIGRpc3BhdGNoIGZvciBMb2NrZWRXcml0ZXIKLSAgICB2YV9lbmQoYXApOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ3ZmKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2hhciBidWZmZXJbRW50cnk6OmtNYXhMZW5ndGggKyAxIC8qTlVMKi9dOwotICAgIGludCBsZW5ndGggPSB2c25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgZm10LCBhcCk7Ci0gICAgaWYgKGxlbmd0aCA+PSAoaW50KSBzaXplb2YoYnVmZmVyKSkgewotICAgICAgICBsZW5ndGggPSBzaXplb2YoYnVmZmVyKSAtIDE7Ci0gICAgICAgIC8vIE5VTCB0ZXJtaW5hdGlvbiBpcyBub3QgcmVxdWlyZWQKLSAgICAgICAgLy8gYnVmZmVyW2xlbmd0aF0gPSAnXDAnOwotICAgIH0KLSAgICBpZiAobGVuZ3RoID49IDApIHsKLSAgICAgICAgbG9nKEVWRU5UX1NUUklORywgYnVmZmVyLCBsZW5ndGgpOwotICAgIH0KLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dUaW1lc3RhbXAoKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQ2NF90IHRzID0gZ2V0X21vbm90b25pY19ucygpOwotICAgIGlmICh0cyA+IDApIHsKLSAgICAgICAgbG9nKEVWRU5UX1RJTUVTVEFNUCwgJnRzLCBzaXplb2YodHMpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCB0aW1lc3RhbXAiKTsKLSAgICB9Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nVGltZXN0YW1wKGNvbnN0IGludDY0X3QgdHMpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGxvZyhFVkVOVF9USU1FU1RBTVAsICZ0cywgc2l6ZW9mKHRzKSk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nSW50ZWdlcihjb25zdCBpbnQgeCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbG9nKEVWRU5UX0lOVEVHRVIsICZ4LCBzaXplb2YoeCkpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0Zsb2F0KGNvbnN0IGZsb2F0IHgpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGxvZyhFVkVOVF9GTE9BVCwgJngsIHNpemVvZih4KSk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nUElEKCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbG9nKEVWRU5UX1BJRCwgbVBpZFRhZywgbVBpZFRhZ1NpemUpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ1N0YXJ0KGNvbnN0IGNoYXIgKmZtdCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbihmbXQpOwotICAgIGlmIChsZW5ndGggPiBFbnRyeTo6a01heExlbmd0aCkgewotICAgICAgICBsZW5ndGggPSBFbnRyeTo6a01heExlbmd0aDsKLSAgICB9Ci0gICAgbG9nKEVWRU5UX1NUQVJUX0ZNVCwgZm10LCBsZW5ndGgpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0VuZCgpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEVudHJ5IGVudHJ5ID0gRW50cnkoRVZFTlRfRU5EX0ZNVCwgTlVMTCwgMCk7Ci0gICAgbG9nKCZlbnRyeSwgdHJ1ZSk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nSGFzaChsb2dfaGFzaF90IGhhc2gpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGxvZyhFVkVOVF9IQVNILCAmaGFzaCwgc2l6ZW9mKGhhc2gpKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dFdmVudEhpc3RUcyhFdmVudCBldmVudCwgbG9nX2hhc2hfdCBoYXNoKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBIaXN0VHNFbnRyeSBkYXRhOwotICAgIGRhdGEuaGFzaCA9IGhhc2g7Ci0gICAgZGF0YS50cyA9IGdldF9tb25vdG9uaWNfbnMoKTsKLSAgICBpZiAoZGF0YS50cyA+IDApIHsKLSAgICAgICAgbG9nKGV2ZW50LCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCB0aW1lc3RhbXAiKTsKLSAgICB9Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nRm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgbG9nX2hhc2hfdCBoYXNoLCAuLi4pCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgdmFfbGlzdCBhcDsKLSAgICB2YV9zdGFydChhcCwgaGFzaCk7Ci0gICAgV3JpdGVyOjpsb2dWRm9ybWF0KGZtdCwgaGFzaCwgYXApOwotICAgIHZhX2VuZChhcCk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nVkZvcm1hdChjb25zdCBjaGFyICpmbXQsIGxvZ19oYXNoX3QgaGFzaCwgdmFfbGlzdCBhcmdwKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBXcml0ZXI6OmxvZ1N0YXJ0KGZtdCk7Ci0gICAgaW50IGk7Ci0gICAgZG91YmxlIGY7Ci0gICAgY2hhciogczsKLSAgICBpbnQ2NF90IHQ7Ci0gICAgV3JpdGVyOjpsb2dUaW1lc3RhbXAoKTsKLSAgICBXcml0ZXI6OmxvZ0hhc2goaGFzaCk7Ci0gICAgZm9yIChjb25zdCBjaGFyICpwID0gZm10OyAqcCAhPSAnXDAnOyBwKyspIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IG1vcmUgY29tcGxleCBmb3JtYXR0aW5nIHN1Y2ggYXMgJS4zZgotICAgICAgICBpZiAoKnAgIT0gJyUnKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2goKisrcCkgewotICAgICAgICBjYXNlICdzJzogLy8gc3RyaW5nCi0gICAgICAgICAgICBzID0gdmFfYXJnKGFyZ3AsIGNoYXIgKik7Ci0gICAgICAgICAgICBXcml0ZXI6OmxvZyhzKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ3QnOiAvLyB0aW1lc3RhbXAKLSAgICAgICAgICAgIHQgPSB2YV9hcmcoYXJncCwgaW50NjRfdCk7Ci0gICAgICAgICAgICBXcml0ZXI6OmxvZ1RpbWVzdGFtcCh0KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ2QnOiAvLyBpbnRlZ2VyCi0gICAgICAgICAgICBpID0gdmFfYXJnKGFyZ3AsIGludCk7Ci0gICAgICAgICAgICBXcml0ZXI6OmxvZ0ludGVnZXIoaSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdmJzogLy8gZmxvYXQKLSAgICAgICAgICAgIGYgPSB2YV9hcmcoYXJncCwgZG91YmxlKTsgLy8gZmxvYXQgYXJndW1lbnRzIGFyZSBwcm9tb3RlZCB0byBkb3VibGUgaW4gdmFyYXJnIGxpc3RzCi0gICAgICAgICAgICBXcml0ZXI6OmxvZ0Zsb2F0KChmbG9hdClmKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ3AnOiAvLyBwaWQKLSAgICAgICAgICAgIFdyaXRlcjo6bG9nUElEKCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvLyB0aGUgIiVcMCIgY2FzZSBmaW5pc2hlcyBwYXJzaW5nCi0gICAgICAgIGNhc2UgJ1wwJzoKLSAgICAgICAgICAgIC0tcDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJyUnOgotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dXKCJOQkxvZyBXcml0ZXIgcGFyc2VkIGludmFsaWQgZm9ybWF0IHNwZWNpZmllcjogJWMiLCAqcCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBXcml0ZXI6OmxvZ0VuZCgpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZyhFdmVudCBldmVudCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKGRhdGEgPT0gTlVMTCB8fCBsZW5ndGggPiBFbnRyeTo6a01heExlbmd0aCkgewotICAgICAgICAvLyBUT0RPIFBlcmhhcHMgaXQgbWFrZXMgc2Vuc2UgdG8gZGlzcGxheSB0cnVuY2F0ZWQgZGF0YSBvciBhdCBsZWFzdCBhCi0gICAgICAgIC8vICAgICAgbWVzc2FnZSB0aGF0IHRoZSBkYXRhIGlzIHRvbyBsb25nPyAgVGhlIGN1cnJlbnQgYmVoYXZpb3IgY2FuIGNyZWF0ZQotICAgICAgICAvLyAgICAgIGEgY29uZnVzaW9uIGZvciBhIHByb2dyYW1tZXIgZGVidWdnaW5nIHRoZWlyIGNvZGUuCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLy8gSWdub3JlIGlmIGludmFsaWQgZXZlbnQKLSAgICBpZiAoZXZlbnQgPT0gRVZFTlRfUkVTRVJWRUQgfHwgZXZlbnQgPj0gRVZFTlRfVVBQRVJfQk9VTkQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBFbnRyeSBldHIoZXZlbnQsIGRhdGEsIGxlbmd0aCk7Ci0gICAgbG9nKCZldHIsIHRydWUgLyp0cnVzdGVkKi8pOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZyhjb25zdCBOQkxvZzo6RW50cnkgKmV0ciwgYm9vbCB0cnVzdGVkKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoIXRydXN0ZWQpIHsKLSAgICAgICAgbG9nKGV0ci0+bUV2ZW50LCBldHItPm1EYXRhLCBldHItPm1MZW5ndGgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHNpemVfdCBuZWVkID0gZXRyLT5tTGVuZ3RoICsgRW50cnk6OmtPdmVyaGVhZDsgICAgLy8gbUV2ZW50LCBtTGVuZ3RoLCBkYXRhW21MZW5ndGhdLCBtTGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkID0gbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gRklGTwotCi0gICAgLy8gRklYTUUgb3B0aW1pemUgdGhpcyB1c2luZyBtZW1jcHkgZm9yIHRoZSBkYXRhIHBhcnQgb2YgdGhlIEVudHJ5LgotICAgIC8vIFRoZSBFbnRyeSBjb3VsZCBoYXZlIGEgbWV0aG9kIGNvcHlUbyhwdHIsIG9mZnNldCwgc2l6ZSkgdG8gb3B0aW1pemUgdGhlIGNvcHkuCi0gICAgLy8gY2hlY2tzIHNpemUgb2YgYSBzaW5nbGUgbG9nIEVudHJ5OiB0eXBlLCBsZW5ndGgsIGRhdGEgcG9pbnRlciBhbmQgZW5kaW5nCi0gICAgdWludDhfdCB0ZW1wW0VudHJ5OjprTWF4TGVuZ3RoICsgRW50cnk6OmtPdmVyaGVhZF07Ci0gICAgLy8gd3JpdGUgdGhpcyBkYXRhIHRvIHRlbXAgYXJyYXkKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5lZWQ7IGkrKykgewotICAgICAgICB0ZW1wW2ldID0gZXRyLT5jb3B5RW50cnlEYXRhQXQoaSk7Ci0gICAgfQotICAgIC8vIHdyaXRlIHRvIGNpcmN1bGFyIGJ1ZmZlcgotICAgIG1GaWZvV3JpdGVyLT53cml0ZSh0ZW1wLCBuZWVkKTsKLX0KLQotYm9vbCBOQkxvZzo6V3JpdGVyOjppc0VuYWJsZWQoKSBjb25zdAotewotICAgIHJldHVybiBtRW5hYmxlZDsKLX0KLQotYm9vbCBOQkxvZzo6V3JpdGVyOjpzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCkKLXsKLSAgICBib29sIG9sZCA9IG1FbmFibGVkOwotICAgIG1FbmFibGVkID0gZW5hYmxlZCAmJiBtU2hhcmVkICE9IE5VTEw7Ci0gICAgcmV0dXJuIG9sZDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU5CTG9nOjpMb2NrZWRXcml0ZXI6OkxvY2tlZFdyaXRlcigpCi0gICAgOiBXcml0ZXIoKQotewotfQotCi1OQkxvZzo6TG9ja2VkV3JpdGVyOjpMb2NrZWRXcml0ZXIodm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSkKLSAgICA6IFdyaXRlcihzaGFyZWQsIHNpemUpCi17Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nKGNvbnN0IGNoYXIgKnN0cmluZykKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nKHN0cmluZyk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nZihjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLSAgICAvLyBGSVhNRSBzaG91bGQgbm90IHRha2UgdGhlIGxvY2sgdW50aWwgYWZ0ZXIgZm9ybWF0dGluZyBpcyBkb25lCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICB2YV9saXN0IGFwOwotICAgIHZhX3N0YXJ0KGFwLCBmbXQpOwotICAgIFdyaXRlcjo6bG9ndmYoZm10LCBhcCk7Ci0gICAgdmFfZW5kKGFwKTsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2d2Zihjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApCi17Ci0gICAgLy8gRklYTUUgc2hvdWxkIG5vdCB0YWtlIHRoZSBsb2NrIHVudGlsIGFmdGVyIGZvcm1hdHRpbmcgaXMgZG9uZQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2d2ZihmbXQsIGFwKTsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dUaW1lc3RhbXAoKQotewotICAgIC8vIEZJWE1FIHNob3VsZCBub3QgdGFrZSB0aGUgbG9jayB1bnRpbCBhZnRlciB0aGUgY2xvY2tfZ2V0dGltZSgpIHN5c2NhbGwKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nVGltZXN0YW1wKCk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nVGltZXN0YW1wKGNvbnN0IGludDY0X3QgdHMpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZ1RpbWVzdGFtcCh0cyk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nSW50ZWdlcihjb25zdCBpbnQgeCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nSW50ZWdlcih4KTsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dGbG9hdChjb25zdCBmbG9hdCB4KQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2dGbG9hdCh4KTsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dQSUQoKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2dQSUQoKTsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dTdGFydChjb25zdCBjaGFyICpmbXQpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZ1N0YXJ0KGZtdCk7Ci19Ci0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dFbmQoKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2dFbmQoKTsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dIYXNoKGxvZ19oYXNoX3QgaGFzaCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nSGFzaChoYXNoKTsKLX0KLQotYm9vbCBOQkxvZzo6TG9ja2VkV3JpdGVyOjppc0VuYWJsZWQoKSBjb25zdAotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIFdyaXRlcjo6aXNFbmFibGVkKCk7Ci19Ci0KLWJvb2wgTkJMb2c6OkxvY2tlZFdyaXRlcjo6c2V0RW5hYmxlZChib29sIGVuYWJsZWQpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gV3JpdGVyOjpzZXRFbmFibGVkKGVuYWJsZWQpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY29uc3Qgc3RkOjpzZXQ8TkJMb2c6OkV2ZW50PiBOQkxvZzo6UmVhZGVyOjpzdGFydGluZ1R5cGVzIHtOQkxvZzo6RXZlbnQ6OkVWRU5UX1NUQVJUX0ZNVCwKLSAgICAgICAgTkJMb2c6OkV2ZW50OjpFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFMsCi0gICAgICAgIE5CTG9nOjpFdmVudDo6RVZFTlRfQVVESU9fU1RBVEV9OwotY29uc3Qgc3RkOjpzZXQ8TkJMb2c6OkV2ZW50PiBOQkxvZzo6UmVhZGVyOjplbmRpbmdUeXBlcyAgIHtOQkxvZzo6RXZlbnQ6OkVWRU5UX0VORF9GTVQsCi0gICAgICAgIE5CTG9nOjpFdmVudDo6RVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTLAotICAgICAgICBOQkxvZzo6RXZlbnQ6OkVWRU5UX0FVRElPX1NUQVRFfTsKLQotTkJMb2c6OlJlYWRlcjo6UmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpCi0gICAgOiBtRmQoLTEpLCBtSW5kZW50KDApLCBtTG9zdCgwKSwKLSAgICAgIG1TaGFyZWQoKC8qY29uc3QqLyBTaGFyZWQgKikgc2hhcmVkKSwgLyptSU1lbW9yeSovCi0gICAgICBtRmlmbyhtU2hhcmVkICE9IE5VTEwgPwotICAgICAgICBuZXcgYXVkaW9fdXRpbHNfZmlmbyhzaXplLCBzaXplb2YodWludDhfdCksCi0gICAgICAgICAgICBtU2hhcmVkLT5tQnVmZmVyLCBtU2hhcmVkLT5tUmVhciwgTlVMTCAvKnRocm90dGxlc0Zyb250Ki8pIDogTlVMTCksCi0gICAgICBtRmlmb1JlYWRlcihtRmlmbyAhPSBOVUxMID8gbmV3IGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyKCptRmlmbykgOiBOVUxMKQotewotfQotCi1OQkxvZzo6UmVhZGVyOjpSZWFkZXIoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnksIHNpemVfdCBzaXplKQotICAgIDogUmVhZGVyKGlNZW1vcnkgIT0gMCA/IChTaGFyZWQgKikgaU1lbW9yeS0+cG9pbnRlcigpIDogTlVMTCwgc2l6ZSkKLXsKLSAgICBtSU1lbW9yeSA9IGlNZW1vcnk7Ci19Ci0KLU5CTG9nOjpSZWFkZXI6On5SZWFkZXIoKQotewotICAgIGRlbGV0ZSBtRmlmb1JlYWRlcjsKLSAgICBkZWxldGUgbUZpZm87Ci19Ci0KLWNvbnN0IHVpbnQ4X3QgKk5CTG9nOjpSZWFkZXI6OmZpbmRMYXN0RW50cnlPZlR5cGVzKGNvbnN0IHVpbnQ4X3QgKmZyb250LCBjb25zdCB1aW50OF90ICpiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxFdmVudD4gJnR5cGVzKSB7Ci0gICAgd2hpbGUgKGJhY2sgKyBFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0ID49IGZyb250KSB7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnByZXYgPSBiYWNrIC0gYmFja1tFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0XSAtIEVudHJ5OjprT3ZlcmhlYWQ7Ci0gICAgICAgIGlmIChwcmV2IDwgZnJvbnQgfHwgcHJldiArIHByZXZbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRyeTo6a092ZXJoZWFkICE9IGJhY2spIHsKLQotICAgICAgICAgICAgLy8gcHJldiBwb2ludHMgdG8gYW4gb3V0IG9mIGxpbWl0cyBvciBpbmNvbnNpc3RlbnQgZW50cnkKLSAgICAgICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0eXBlcy5maW5kKChjb25zdCBFdmVudCkgcHJldltvZmZzZXRvZihlbnRyeSwgdHlwZSldKSAhPSB0eXBlcy5lbmQoKSkgewotICAgICAgICAgICAgcmV0dXJuIHByZXY7Ci0gICAgICAgIH0KLSAgICAgICAgYmFjayA9IHByZXY7Ci0gICAgfQotICAgIHJldHVybiBudWxscHRyOyAvLyBubyBlbnRyeSBmb3VuZAotfQotCi0vLyBDb3BpZXMgY29udGVudCBvZiBhIFJlYWRlciBGSUZPIGludG8gaXRzIFNuYXBzaG90Ci0vLyBUaGUgU25hcHNob3QgaGFzIHRoZSBzYW1lIHJhdyBkYXRhLCBidXQgcmVwcmVzZW50ZWQgYXMgYSBzZXF1ZW5jZSBvZiBlbnRyaWVzCi0vLyBhbmQgYW4gRW50cnlJdGVyYXRvciBtYWtpbmcgaXQgcG9zc2libGUgdG8gcHJvY2VzcyB0aGUgZGF0YS4KLXN0ZDo6dW5pcXVlX3B0cjxOQkxvZzo6UmVhZGVyOjpTbmFwc2hvdD4gTkJMb2c6OlJlYWRlcjo6Z2V0U25hcHNob3QoKQotewotICAgIGlmIChtRmlmb1JlYWRlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8TkJMb2c6OlJlYWRlcjo6U25hcHNob3Q+KG5ldyBTbmFwc2hvdCgpKTsKLSAgICB9Ci0gICAgLy8gbWFrZSBhIGNvcHkgdG8gYXZvaWQgcmFjZSBjb25kaXRpb24gd2l0aCB3cml0ZXIKLSAgICBzaXplX3QgY2FwYWNpdHkgPSBtRmlmby0+Y2FwYWNpdHkoKTsKLQotICAgIC8vIFRoaXMgZW11bGF0ZXMgdGhlIGJlaGF2aW91ciBvZiBhdWRpb191dGlsc19maWZvX3JlYWRlcjo6cmVhZCwgYnV0IHdpdGhvdXQgaW5jcmVtZW50aW5nIHRoZQotICAgIC8vIHJlYWRlciBpbmRleC4gVGhlIGluZGV4IGlzIGluY3JlbWVudGVkIGFmdGVyIGhhbmRsaW5nIGNvcnJ1cHRpb24sIHRvIGFmdGVyIHRoZSBsYXN0IGNvbXBsZXRlCi0gICAgLy8gZW50cnkgb2YgdGhlIGJ1ZmZlcgotICAgIHNpemVfdCBsb3N0OwotICAgIGF1ZGlvX3V0aWxzX2lvdmVjIGlvdmVjWzJdOwotICAgIHNzaXplX3QgYXZhaWxUb1JlYWQgPSBtRmlmb1JlYWRlci0+b2J0YWluKGlvdmVjLCBjYXBhY2l0eSwgTlVMTCAvKnRpbWVvdXQqLywgJmxvc3QpOwotICAgIGlmIChhdmFpbFRvUmVhZCA8PSAwKSB7Ci0gICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8TkJMb2c6OlJlYWRlcjo6U25hcHNob3Q+KG5ldyBTbmFwc2hvdCgpKTsKLSAgICB9Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IHNuYXBzaG90KG5ldyBTbmFwc2hvdChhdmFpbFRvUmVhZCkpOwotICAgIG1lbWNweShzbmFwc2hvdC0+bURhdGEsIChjb25zdCBjaGFyICopIG1GaWZvLT5idWZmZXIoKSArIGlvdmVjWzBdLm1PZmZzZXQsIGlvdmVjWzBdLm1MZW5ndGgpOwotICAgIGlmIChpb3ZlY1sxXS5tTGVuZ3RoID4gMCkgewotICAgICAgICBtZW1jcHkoc25hcHNob3QtPm1EYXRhICsgKGlvdmVjWzBdLm1MZW5ndGgpLAotICAgICAgICAgICAgKGNvbnN0IGNoYXIgKikgbUZpZm8tPmJ1ZmZlcigpICsgaW92ZWNbMV0ubU9mZnNldCwgaW92ZWNbMV0ubUxlbmd0aCk7Ci0gICAgfQotCi0gICAgLy8gSGFuZGxlIGNvcnJ1cHRlZCBidWZmZXIKLSAgICAvLyBQb3RlbnRpYWxseSwgYSBidWZmZXIgaGFzIGNvcnJ1cHRlZCBkYXRhIG9uIGJvdGggYmVnaW5uaW5nIChkdWUgdG8gb3ZlcmZsb3cpIGFuZCBlbmQKLSAgICAvLyAoZHVlIHRvIGluY29tcGxldGUgZm9ybWF0IGVudHJ5KS4gQnV0IGV2ZW4gaWYgdGhlIGVuZCBmb3JtYXQgZW50cnkgaXMgaW5jb21wbGV0ZSwKLSAgICAvLyBpdCBlbmRzIGluIGEgY29tcGxldGUgZW50cnkgKHdoaWNoIGlzIG5vdCBhbiBFTkRfRk1UKS4gU28gaXMgc2FmZSB0byB0cmF2ZXJzZSBiYWNrd2FyZHMuCi0gICAgLy8gVE9ETzogaGFuZGxlIGNsaWVudCBjb3JydXB0aW9uIChpbiB0aGUgbWlkZGxlIG9mIGEgYnVmZmVyKQotCi0gICAgY29uc3QgdWludDhfdCAqYmFjayA9IHNuYXBzaG90LT5tRGF0YSArIGF2YWlsVG9SZWFkOwotICAgIGNvbnN0IHVpbnQ4X3QgKmZyb250ID0gc25hcHNob3QtPm1EYXRhOwotCi0gICAgLy8gRmluZCBsYXN0IEVORF9GTVQuIDxiYWNrPiBpcyBzaXR0aW5nIG9uIGFuIGVudHJ5IHdoaWNoIG1pZ2h0IGJlIHRoZSBtaWRkbGUgb2YgYSBGb3JtYXRFbnRyeS4KLSAgICAvLyBXZSBnbyBiYWNrd2FyZHMgdW50aWwgd2UgZmluZCBhbiBFVkVOVF9FTkRfRk1ULgotICAgIGNvbnN0IHVpbnQ4X3QgKmxhc3RFbmQgPSBmaW5kTGFzdEVudHJ5T2ZUeXBlcyhmcm9udCwgYmFjaywgZW5kaW5nVHlwZXMpOwotICAgIGlmIChsYXN0RW5kID09IG51bGxwdHIpIHsKLSAgICAgICAgc25hcHNob3QtPm1FbmQgPSBzbmFwc2hvdC0+bUJlZ2luID0gRW50cnlJdGVyYXRvcihmcm9udCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gZW5kIG9mIHNuYXBzaG90IHBvaW50cyB0byBhZnRlciBsYXN0IEVORF9GTVQgZW50cnkKLSAgICAgICAgc25hcHNob3QtPm1FbmQgPSBFbnRyeUl0ZXJhdG9yKGxhc3RFbmQpLm5leHQoKTsKLSAgICAgICAgLy8gZmluZCBmaXJzdCBTVEFSVF9GTVQKLSAgICAgICAgY29uc3QgdWludDhfdCAqZmlyc3RTdGFydCA9IG51bGxwdHI7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZpcnN0U3RhcnRUbXAgPSBzbmFwc2hvdC0+bUVuZDsKLSAgICAgICAgd2hpbGUgKChmaXJzdFN0YXJ0VG1wID0gZmluZExhc3RFbnRyeU9mVHlwZXMoZnJvbnQsIGZpcnN0U3RhcnRUbXAsIHN0YXJ0aW5nVHlwZXMpKQotICAgICAgICAgICAgICAgICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGZpcnN0U3RhcnQgPSBmaXJzdFN0YXJ0VG1wOwotICAgICAgICB9Ci0gICAgICAgIC8vIGZpcnN0U3RhcnQgaXMgbnVsbCBpZiBubyBTVEFSVF9GTVQgZW50cnkgd2FzIGZvdW5kIGJlZm9yZSBsYXN0RW5kCi0gICAgICAgIGlmIChmaXJzdFN0YXJ0ID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHNuYXBzaG90LT5tQmVnaW4gPSBzbmFwc2hvdC0+bUVuZDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNuYXBzaG90LT5tQmVnaW4gPSBFbnRyeUl0ZXJhdG9yKGZpcnN0U3RhcnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gYWR2YW5jZSBmaWZvIHJlYWRlciBpbmRleCB0byBhZnRlciBsYXN0IGVudHJ5IHJlYWQuCi0gICAgbUZpZm9SZWFkZXItPnJlbGVhc2Uoc25hcHNob3QtPm1FbmQgLSBmcm9udCk7Ci0KLSAgICBzbmFwc2hvdC0+bUxvc3QgPSBsb3N0OwotICAgIHJldHVybiBzbmFwc2hvdDsKLQotfQotCi0vLyBUYWtlcyByYXcgY29udGVudCBvZiB0aGUgbG9jYWwgbWVyZ2VyIEZJRk8sIHByb2Nlc3NlcyBsb2cgZW50cmllcywgYW5kCi0vLyB3cml0ZXMgdGhlIGRhdGEgdG8gYSBtYXAgb2YgY2xhc3MgUGVyZm9ybWFuY2VBbmFseXNpcywgYmFzZWQgb24gdGhlaXIgdGhyZWFkIElELgotdm9pZCBOQkxvZzo6TWVyZ2VSZWFkZXI6OmdldEFuZFByb2Nlc3NTbmFwc2hvdChOQkxvZzo6UmVhZGVyOjpTbmFwc2hvdCAmc25hcHNob3QpCi17Ci0gICAgU3RyaW5nOCB0aW1lc3RhbXAsIGJvZHk7Ci0KLSAgICBmb3IgKGF1dG8gZW50cnkgPSBzbmFwc2hvdC5iZWdpbigpOyBlbnRyeSAhPSBzbmFwc2hvdC5lbmQoKTspIHsKLSAgICAgICAgc3dpdGNoIChlbnRyeS0+dHlwZSkgewotICAgICAgICBjYXNlIEVWRU5UX1NUQVJUX0ZNVDoKLSAgICAgICAgICAgIGVudHJ5ID0gaGFuZGxlRm9ybWF0KEZvcm1hdEVudHJ5KGVudHJ5KSwgJnRpbWVzdGFtcCwgJmJvZHkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTOiB7Ci0gICAgICAgICAgICBIaXN0VHNFbnRyeVdpdGhBdXRob3IgKmRhdGEgPSAoSGlzdFRzRW50cnlXaXRoQXV0aG9yICopIChlbnRyeS0+ZGF0YSk7Ci0gICAgICAgICAgICAvLyBUT0RPIFRoaXMgbWVtY3BpZXMgYXJlIGhlcmUgdG8gYXZvaWQgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3MgY3Jhc2guCi0gICAgICAgICAgICAvLyBUaGVyZSdzIHByb2JhYmx5IGEgbW9yZSBlZmZpY2llbnQgd2F5IHRvIGRvIGl0Ci0gICAgICAgICAgICBsb2dfaGFzaF90IGhhc2g7Ci0gICAgICAgICAgICBtZW1jcHkoJmhhc2gsICYoZGF0YS0+aGFzaCksIHNpemVvZihoYXNoKSk7Ci0gICAgICAgICAgICBpbnQ2NF90IHRzOwotICAgICAgICAgICAgbWVtY3B5KCZ0cywgJmRhdGEtPnRzLCBzaXplb2YodHMpKTsKLSAgICAgICAgICAgIC8vIFRPRE86IGhhc2ggZm9yIGhpc3RvZ3JhbSB0cyBhbmQgYXVkaW8gc3RhdGUgbmVlZCB0byBtYXRjaAotICAgICAgICAgICAgLy8gYW5kIGNvcnJlc3BvbmQgdG8gYXVkaW8gcHJvZHVjdGlvbiBzb3VyY2UgZmlsZSBsb2NhdGlvbgotICAgICAgICAgICAgbVRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXNbZGF0YS0+YXV0aG9yXVswIC8qaGFzaCovXS5sb2dUc0VudHJ5KHRzKTsKLSAgICAgICAgICAgICsrZW50cnk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEVWRU5UX0FVRElPX1NUQVRFOiB7Ci0gICAgICAgICAgICBIaXN0VHNFbnRyeVdpdGhBdXRob3IgKmRhdGEgPSAoSGlzdFRzRW50cnlXaXRoQXV0aG9yICopIChlbnRyeS0+ZGF0YSk7Ci0gICAgICAgICAgICAvLyBUT0RPIFRoaXMgbWVtY3BpZXMgYXJlIGhlcmUgdG8gYXZvaWQgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3MgY3Jhc2guCi0gICAgICAgICAgICAvLyBUaGVyZSdzIHByb2JhYmx5IGEgbW9yZSBlZmZpY2llbnQgd2F5IHRvIGRvIGl0Ci0gICAgICAgICAgICBsb2dfaGFzaF90IGhhc2g7Ci0gICAgICAgICAgICBtZW1jcHkoJmhhc2gsICYoZGF0YS0+aGFzaCksIHNpemVvZihoYXNoKSk7Ci0gICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgdHMgaWYgdW51c2VkCi0gICAgICAgICAgICBpbnQ2NF90IHRzOwotICAgICAgICAgICAgbWVtY3B5KCZ0cywgJmRhdGEtPnRzLCBzaXplb2YodHMpKTsKLSAgICAgICAgICAgIG1UaHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzW2RhdGEtPmF1dGhvcl1bMCAvKmhhc2gqL10uaGFuZGxlU3RhdGVDaGFuZ2UoKTsKLSAgICAgICAgICAgICsrZW50cnk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEVWRU5UX0VORF9GTVQ6Ci0gICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgid2FybmluZzogZ290IHRvIGVuZCBmb3JtYXQgZXZlbnQiKTsKLSAgICAgICAgICAgICsrZW50cnk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFVkVOVF9SRVNFUlZFRDoKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJ3YXJuaW5nOiB1bmV4cGVjdGVkIGV2ZW50ICVkIiwgZW50cnktPnR5cGUpOwotICAgICAgICAgICAgKytlbnRyeTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIC8vIEZJWE1FOiBkZWNpZGUgd2hldGhlciB0byBwcmludCB0aGUgd2FybmluZ3MgaGVyZSBvciBlbHNld2hlcmUKLSAgICBpZiAoIWJvZHkuaXNFbXB0eSgpKSB7Ci0gICAgICAgIGR1bXBMaW5lKHRpbWVzdGFtcCwgYm9keSk7Ci0gICAgfQotfQotCi12b2lkIE5CTG9nOjpNZXJnZVJlYWRlcjo6Z2V0QW5kUHJvY2Vzc1NuYXBzaG90KCkKLXsKLSAgICAvLyBnZXQgYSBzbmFwc2hvdCwgcHJvY2VzcyBpdAotICAgIHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4gc25hcCA9IGdldFNuYXBzaG90KCk7Ci0gICAgZ2V0QW5kUHJvY2Vzc1NuYXBzaG90KCpzbmFwKTsKLX0KLQotdm9pZCBOQkxvZzo6TWVyZ2VSZWFkZXI6OmR1bXAoaW50IGZkLCBpbnQgaW5kZW50KSB7Ci0gICAgLy8gVE9ETzogYWRkIGEgbXV0ZXggYXJvdW5kIG1lZGlhLmxvZyBkdW1wCi0gICAgUmVwb3J0UGVyZm9ybWFuY2U6OmR1bXAoZmQsIGluZGVudCwgbVRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXMpOwotfQotCi0vLyBXcml0ZXMgYSBzdHJpbmcgdG8gdGhlIGNvbnNvbGUKLXZvaWQgTkJMb2c6OlJlYWRlcjo6ZHVtcExpbmUoY29uc3QgU3RyaW5nOCAmdGltZXN0YW1wLCBTdHJpbmc4ICZib2R5KQotewotICAgIGlmIChtRmQgPj0gMCkgewotICAgICAgICBkcHJpbnRmKG1GZCwgIiUuKnMlcyAlc1xuIiwgbUluZGVudCwgIiIsIHRpbWVzdGFtcC5zdHJpbmcoKSwgYm9keS5zdHJpbmcoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0koIiUuKnMlcyAlcyIsIG1JbmRlbnQsICIiLCB0aW1lc3RhbXAuc3RyaW5nKCksIGJvZHkuc3RyaW5nKCkpOwotICAgIH0KLSAgICBib2R5LmNsZWFyKCk7Ci19Ci0KLWJvb2wgTkJMb2c6OlJlYWRlcjo6aXNJTWVtb3J5KGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5KSBjb25zdAotewotICAgIHJldHVybiBpTWVtb3J5ICE9IDAgJiYgbUlNZW1vcnkgIT0gMCAmJiBpTWVtb3J5LT5wb2ludGVyKCkgPT0gbUlNZW1vcnktPnBvaW50ZXIoKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgTkJMb2c6OmFwcGVuZFRpbWVzdGFtcChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKSB7Ci0gICAgaW50NjRfdCB0czsKLSAgICBtZW1jcHkoJnRzLCBkYXRhLCBzaXplb2YodHMpKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlslZC4lMDNkXSIsIChpbnQpICh0cyAvICgxMDAwICogMTAwMCAqIDEwMDApKSwKLSAgICAgICAgICAgICAgICAgICAgKGludCkgKCh0cyAvICgxMDAwICogMTAwMCkpICUgMTAwMCkpOwotfQotCi12b2lkIE5CTG9nOjphcHBlbmRJbnQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSkgewotICAgIGludCB4ID0gKigoaW50KikgZGF0YSk7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCI8JWQ+IiwgeCk7Ci19Ci0KLXZvaWQgTkJMb2c6OmFwcGVuZEZsb2F0KFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpIHsKLSAgICBmbG9hdCBmOwotICAgIG1lbWNweSgmZiwgZGF0YSwgc2l6ZW9mKGZsb2F0KSk7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCI8JWY+IiwgZik7Ci19Ci0KLXZvaWQgTkJMb2c6OmFwcGVuZFBJRChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3QgbGVuZ3RoKSB7Ci0gICAgcGlkX3QgaWQgPSAqKChwaWRfdCopIGRhdGEpOwotICAgIGNoYXIgKiBuYW1lID0gJigoY2hhciopIGRhdGEpW3NpemVvZihwaWRfdCldOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiPFBJRDogJWQsIG5hbWU6ICUuKnM+IiwgaWQsIChpbnQpIChsZW5ndGggLSBzaXplb2YocGlkX3QpKSwgbmFtZSk7Ci19Ci0KLVN0cmluZzggTkJMb2c6OmJ1ZmZlckR1bXAoY29uc3QgdWludDhfdCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKLXsKLSAgICBTdHJpbmc4IHN0cjsKLSAgICBzdHIuYXBwZW5kKCJbICIpOwotICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgICBzdHIuYXBwZW5kRm9ybWF0KCIlZCAiLCBidWZmZXJbaV0pOwotICAgIH0KLSAgICBzdHIuYXBwZW5kKCJdIik7Ci0gICAgcmV0dXJuIHN0cjsKLX0KLQotU3RyaW5nOCBOQkxvZzo6YnVmZmVyRHVtcChjb25zdCBFbnRyeUl0ZXJhdG9yICZpdCkKLXsKLSAgICByZXR1cm4gYnVmZmVyRHVtcChpdCwgaXQtPmxlbmd0aCArIEVudHJ5OjprT3ZlcmhlYWQpOwotfQotCi1OQkxvZzo6RW50cnlJdGVyYXRvciBOQkxvZzo6UmVhZGVyOjpoYW5kbGVGb3JtYXQoY29uc3QgRm9ybWF0RW50cnkgJmZtdEVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCAqdGltZXN0YW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCAqYm9keSkgewotICAgIC8vIGxvZyB0aW1lc3RhbXAKLSAgICBpbnQ2NF90IHRzID0gZm10RW50cnkudGltZXN0YW1wKCk7Ci0gICAgdGltZXN0YW1wLT5jbGVhcigpOwotICAgIHRpbWVzdGFtcC0+YXBwZW5kRm9ybWF0KCJbJWQuJTAzZF0iLCAoaW50KSAodHMgLyAoMTAwMCAqIDEwMDAgKiAxMDAwKSksCi0gICAgICAgICAgICAgICAgICAgIChpbnQpICgodHMgLyAoMTAwMCAqIDEwMDApKSAlIDEwMDApKTsKLQotICAgIC8vIGxvZyB1bmlxdWUgaGFzaAotICAgIGxvZ19oYXNoX3QgaGFzaCA9IGZtdEVudHJ5Lmhhc2goKTsKLSAgICAvLyBwcmludCBvbmx5IGxvd2VyIDE2Yml0IG9mIGhhc2ggYXMgaGV4IGFuZCBsaW5lIGFzIGludCB0byByZWR1Y2Ugc3BhbSBpbiB0aGUgbG9nCi0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLjRYLSVkICIsIChpbnQpKGhhc2ggPj4gMTYpICYgMHhGRkZGLCAoaW50KSBoYXNoICYgMHhGRkZGKTsKLQotICAgIC8vIGxvZyBhdXRob3IgKGlmIHByZXNlbnQpCi0gICAgaGFuZGxlQXV0aG9yKGZtdEVudHJ5LCBib2R5KTsKLQotICAgIC8vIGxvZyBzdHJpbmcKLSAgICBOQkxvZzo6RW50cnlJdGVyYXRvciBhcmcgPSBmbXRFbnRyeS5hcmdzKCk7Ci0KLSAgICBjb25zdCBjaGFyKiBmbXQgPSBmbXRFbnRyeS5mb3JtYXRTdHJpbmcoKTsKLSAgICBzaXplX3QgZm10X2xlbmd0aCA9IGZtdEVudHJ5LmZvcm1hdFN0cmluZ0xlbmd0aCgpOwotCi0gICAgZm9yIChzaXplX3QgZm10X29mZnNldCA9IDA7IGZtdF9vZmZzZXQgPCBmbXRfbGVuZ3RoOyArK2ZtdF9vZmZzZXQpIHsKLSAgICAgICAgaWYgKGZtdFtmbXRfb2Zmc2V0XSAhPSAnJScpIHsKLSAgICAgICAgICAgIGJvZHktPmFwcGVuZCgmZm10W2ZtdF9vZmZzZXRdLCAxKTsgLy8gVE9ETyBvcHRpbWl6ZSB0byB3cml0ZSBjb25zZWN1dGl2ZSBzdHJpbmdzIGF0IG9uY2UKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNhc2UgIiUlIiIKLSAgICAgICAgaWYgKGZtdFsrK2ZtdF9vZmZzZXRdID09ICclJykgewotICAgICAgICAgICAgYm9keS0+YXBwZW5kKCIlIik7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBjYXNlICIlXDAiCi0gICAgICAgIGlmIChmbXRfb2Zmc2V0ID09IGZtdF9sZW5ndGgpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgTkJMb2c6OkV2ZW50IGV2ZW50ID0gKE5CTG9nOjpFdmVudCkgYXJnLT50eXBlOwotICAgICAgICBzaXplX3QgbGVuZ3RoID0gYXJnLT5sZW5ndGg7Ci0KLSAgICAgICAgLy8gVE9ETyBjaGVjayBsZW5ndGggZm9yIGV2ZW50IHR5cGUgaXMgY29ycmVjdAotCi0gICAgICAgIGlmIChldmVudCA9PSBFVkVOVF9FTkRfRk1UKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCBtb3JlIGNvbXBsZXggZm9ybWF0dGluZyBzdWNoIGFzICUuM2YKLSAgICAgICAgY29uc3QgdWludDhfdCAqZGF0dW0gPSBhcmctPmRhdGE7IC8vIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZXZlbnQgYXJncwotICAgICAgICBzd2l0Y2goZm10W2ZtdF9vZmZzZXRdKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgJ3MnOiAvLyBzdHJpbmcKLSAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX1NUUklORywKLSAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3Igc3RyaW5nIHNwZWNpZmllcjogJWQiLCBldmVudCk7Ci0gICAgICAgICAgICBib2R5LT5hcHBlbmQoKGNvbnN0IGNoYXIqKSBkYXR1bSwgbGVuZ3RoKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ3QnOiAvLyB0aW1lc3RhbXAKLSAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX1RJTUVTVEFNUCwKLSAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3IgdGltZXN0YW1wIHNwZWNpZmllcjogJWQiLCBldmVudCk7Ci0gICAgICAgICAgICBhcHBlbmRUaW1lc3RhbXAoYm9keSwgZGF0dW0pOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnZCc6IC8vIGludGVnZXIKLSAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX0lOVEVHRVIsCi0gICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIGludGVnZXIgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKLSAgICAgICAgICAgIGFwcGVuZEludChib2R5LCBkYXR1bSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdmJzogLy8gZmxvYXQKLSAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX0ZMT0FULAotICAgICAgICAgICAgICAgICJOQkxvZyBSZWFkZXIgaW5jb21wYXRpYmxlIGV2ZW50IGZvciBmbG9hdCBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOwotICAgICAgICAgICAgYXBwZW5kRmxvYXQoYm9keSwgZGF0dW0pOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAncCc6IC8vIHBpZAotICAgICAgICAgICAgQUxPR1dfSUYoZXZlbnQgIT0gRVZFTlRfUElELAotICAgICAgICAgICAgICAgICJOQkxvZyBSZWFkZXIgaW5jb21wYXRpYmxlIGV2ZW50IGZvciBwaWQgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKLSAgICAgICAgICAgIGFwcGVuZFBJRChib2R5LCBkYXR1bSwgbGVuZ3RoKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVygiTkJMb2cgUmVhZGVyIGVuY291bnRlcmVkIHVua25vd24gY2hhcmFjdGVyICVjIiwgZm10W2ZtdF9vZmZzZXRdKTsKLSAgICAgICAgfQotICAgICAgICArK2FyZzsKLSAgICB9Ci0gICAgQUxPR1dfSUYoYXJnLT50eXBlICE9IEVWRU5UX0VORF9GTVQsICJFeHBlY3RlZCBlbmQgb2YgZm9ybWF0LCBnb3QgJWQiLCBhcmctPnR5cGUpOwotICAgICsrYXJnOwotICAgIHJldHVybiBhcmc7Ci19Ci0KLU5CTG9nOjpNZXJnZXI6Ok1lcmdlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKToKLSAgICAgIG1TaGFyZWQoKFNoYXJlZCAqKSBzaGFyZWQpLAotICAgICAgbUZpZm8obVNoYXJlZCAhPSBOVUxMID8KLSAgICAgICAgbmV3IGF1ZGlvX3V0aWxzX2ZpZm8oc2l6ZSwgc2l6ZW9mKHVpbnQ4X3QpLAotICAgICAgICAgICAgbVNoYXJlZC0+bUJ1ZmZlciwgbVNoYXJlZC0+bVJlYXIsIE5VTEwgLyp0aHJvdHRsZXNGcm9udCovKSA6IE5VTEwpLAotICAgICAgbUZpZm9Xcml0ZXIobUZpZm8gIT0gTlVMTCA/IG5ldyBhdWRpb191dGlsc19maWZvX3dyaXRlcigqbUZpZm8pIDogTlVMTCkKLSAgICAgIHt9Ci0KLXZvaWQgTkJMb2c6Ok1lcmdlcjo6YWRkUmVhZGVyKGNvbnN0IE5CTG9nOjpOYW1lZFJlYWRlciAmcmVhZGVyKSB7Ci0KLSAgICAvLyBGSVhNRSBUaGlzIGlzIGNhbGxlZCBieSBiaW5kZXIgdGhyZWFkIGluIE1lZGlhTG9nU2VydmljZTo6cmVnaXN0ZXJXcml0ZXIKLSAgICAvLyAgICAgICBidXQgdGhlIGFjY2VzcyB0byBzaGFyZWQgdmFyaWFibGUgbU5hbWVkUmVhZGVycyBpcyBub3QgeWV0IHByb3RlY3RlZCBieSBhIGxvY2suCi0gICAgbU5hbWVkUmVhZGVycy5wdXNoX2JhY2socmVhZGVyKTsKLX0KLQotLy8gaXRlbXMgcGxhY2VkIGluIHByaW9yaXR5IHF1ZXVlIGR1cmluZyBtZXJnZQotLy8gY29tcG9zZWQgYnkgYSB0aW1lc3RhbXAgYW5kIHRoZSBpbmRleCBvZiB0aGUgc25hcHNob3Qgd2hlcmUgdGhlIHRpbWVzdGFtcCBjYW1lIGZyb20KLXN0cnVjdCBNZXJnZUl0ZW0KLXsKLSAgICBpbnQ2NF90IHRzOwotICAgIGludCBpbmRleDsKLSAgICBNZXJnZUl0ZW0oaW50NjRfdCB0cywgaW50IGluZGV4KTogdHModHMpLCBpbmRleChpbmRleCkge30KLX07Ci0KLS8vIG9wZXJhdG9ycyBuZWVkZWQgZm9yIHByaW9yaXR5IHF1ZXVlIGluIG1lcmdlCi0vLyBib29sIG9wZXJhdG9yPihjb25zdCBpbnQ2NF90ICZ0MSwgY29uc3QgaW50NjRfdCAmdDIpIHsKLS8vICAgICByZXR1cm4gdDEudHZfc2VjID4gdDIudHZfc2VjIHx8ICh0MS50dl9zZWMgPT0gdDIudHZfc2VjICYmIHQxLnR2X25zZWMgPiB0Mi50dl9uc2VjKTsKLS8vIH0KLQotYm9vbCBvcGVyYXRvcj4oY29uc3Qgc3RydWN0IE1lcmdlSXRlbSAmaTEsIGNvbnN0IHN0cnVjdCBNZXJnZUl0ZW0gJmkyKSB7Ci0gICAgcmV0dXJuIGkxLnRzID4gaTIudHMgfHwgKGkxLnRzID09IGkyLnRzICYmIGkxLmluZGV4ID4gaTIuaW5kZXgpOwotfQotCi0vLyBNZXJnZSByZWdpc3RlcmVkIHJlYWRlcnMsIHNvcnRlZCBieSB0aW1lc3RhbXAsIGFuZCB3cml0ZSBkYXRhIHRvIGEgc2luZ2xlIEZJRk8gaW4gbG9jYWwgbWVtb3J5Ci12b2lkIE5CTG9nOjpNZXJnZXI6Om1lcmdlKCkgewotICAgIC8vIEZJWE1FIFRoaXMgaXMgY2FsbGVkIGJ5IG1lcmdlIHRocmVhZAotICAgIC8vICAgICAgIGJ1dCB0aGUgYWNjZXNzIHRvIHNoYXJlZCB2YXJpYWJsZSBtTmFtZWRSZWFkZXJzIGlzIG5vdCB5ZXQgcHJvdGVjdGVkIGJ5IGEgbG9jay4KLSAgICBpbnQgbkxvZ3MgPSBtTmFtZWRSZWFkZXJzLnNpemUoKTsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8TkJMb2c6OlJlYWRlcjo6U25hcHNob3Q+PiBzbmFwc2hvdHMobkxvZ3MpOwotICAgIHN0ZDo6dmVjdG9yPE5CTG9nOjpFbnRyeUl0ZXJhdG9yPiBvZmZzZXRzKG5Mb2dzKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Mb2dzOyArK2kpIHsKLSAgICAgICAgc25hcHNob3RzW2ldID0gbU5hbWVkUmVhZGVyc1tpXS5yZWFkZXIoKS0+Z2V0U25hcHNob3QoKTsKLSAgICAgICAgb2Zmc2V0c1tpXSA9IHNuYXBzaG90c1tpXS0+YmVnaW4oKTsKLSAgICB9Ci0gICAgLy8gaW5pdGlhbGl6ZSBvZmZzZXRzCi0gICAgLy8gVE9ETyBjdXN0b20gaGVhcCBpbXBsZW1lbnRhdGlvbiBjb3VsZCBhbGxvdyB0byB1cGRhdGUgdG9wLCBpbXByb3ZpbmcgcGVyZm9ybWFuY2UKLSAgICAvLyBmb3IgYnVyc3R5IGJ1ZmZlcnMKLSAgICBzdGQ6OnByaW9yaXR5X3F1ZXVlPE1lcmdlSXRlbSwgc3RkOjp2ZWN0b3I8TWVyZ2VJdGVtPiwgc3RkOjpncmVhdGVyPE1lcmdlSXRlbT4+IHRpbWVzdGFtcHM7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuTG9nczsgKytpKQotICAgIHsKLSAgICAgICAgaWYgKG9mZnNldHNbaV0gIT0gc25hcHNob3RzW2ldLT5lbmQoKSkgewotICAgICAgICAgICAgaW50NjRfdCB0cyA9IEFic3RyYWN0RW50cnk6OmJ1aWxkRW50cnkob2Zmc2V0c1tpXSktPnRpbWVzdGFtcCgpOwotICAgICAgICAgICAgdGltZXN0YW1wcy5lbXBsYWNlKHRzLCBpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHdoaWxlICghdGltZXN0YW1wcy5lbXB0eSgpKSB7Ci0gICAgICAgIC8vIGZpbmQgbWluaW11bSB0aW1lc3RhbXAKLSAgICAgICAgaW50IGluZGV4ID0gdGltZXN0YW1wcy50b3AoKS5pbmRleDsKLSAgICAgICAgLy8gY29weSBpdCB0byB0aGUgbG9nLCBpbmNyZWFzaW5nIG9mZnNldAotICAgICAgICBvZmZzZXRzW2luZGV4XSA9IEFic3RyYWN0RW50cnk6OmJ1aWxkRW50cnkob2Zmc2V0c1tpbmRleF0pLT5jb3B5V2l0aEF1dGhvcihtRmlmb1dyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotICAgICAgICAvLyB1cGRhdGUgZGF0YSBzdHJ1Y3R1cmVzCi0gICAgICAgIHRpbWVzdGFtcHMucG9wKCk7Ci0gICAgICAgIGlmIChvZmZzZXRzW2luZGV4XSAhPSBzbmFwc2hvdHNbaW5kZXhdLT5lbmQoKSkgewotICAgICAgICAgICAgaW50NjRfdCB0cyA9IEFic3RyYWN0RW50cnk6OmJ1aWxkRW50cnkob2Zmc2V0c1tpbmRleF0pLT50aW1lc3RhbXAoKTsKLSAgICAgICAgICAgIHRpbWVzdGFtcHMuZW1wbGFjZSh0cywgaW5kZXgpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1jb25zdCBzdGQ6OnZlY3RvcjxOQkxvZzo6TmFtZWRSZWFkZXI+JiBOQkxvZzo6TWVyZ2VyOjpnZXROYW1lZFJlYWRlcnMoKSBjb25zdCB7Ci0gICAgLy8gRklYTUUgVGhpcyBpcyByZXR1cm5pbmcgYSByZWZlcmVuY2UgdG8gYSBzaGFyZWQgdmFyaWFibGUgdGhhdCBuZWVkcyBhIGxvY2sKLSAgICByZXR1cm4gbU5hbWVkUmVhZGVyczsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU5CTG9nOjpNZXJnZVJlYWRlcjo6TWVyZ2VSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSwgTWVyZ2VyICZtZXJnZXIpCi0gICAgOiBSZWFkZXIoc2hhcmVkLCBzaXplKSwgbU5hbWVkUmVhZGVycyhtZXJnZXIuZ2V0TmFtZWRSZWFkZXJzKCkpIHt9Ci0KLXZvaWQgTkJMb2c6Ok1lcmdlUmVhZGVyOjpoYW5kbGVBdXRob3IoY29uc3QgTkJMb2c6OkFic3RyYWN0RW50cnkgJmVudHJ5LCBTdHJpbmc4ICpib2R5KSB7Ci0gICAgaW50IGF1dGhvciA9IGVudHJ5LmF1dGhvcigpOwotICAgIC8vIEZJWE1FIE5lZWRzIGEgbG9jawotICAgIGNvbnN0IGNoYXIqIG5hbWUgPSBtTmFtZWRSZWFkZXJzW2F1dGhvcl0ubmFtZSgpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJXM6ICIsIG5hbWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTkJMb2c6Ok1lcmdlVGhyZWFkOjpNZXJnZVRocmVhZChOQkxvZzo6TWVyZ2VyICZtZXJnZXIsIE5CTG9nOjpNZXJnZVJlYWRlciAmbWVyZ2VSZWFkZXIpCi0gICAgOiBtTWVyZ2VyKG1lcmdlciksCi0gICAgICBtTWVyZ2VSZWFkZXIobWVyZ2VSZWFkZXIpLAotICAgICAgbVRpbWVvdXRVcygwKSB7fQotCi1OQkxvZzo6TWVyZ2VUaHJlYWQ6On5NZXJnZVRocmVhZCgpIHsKLSAgICAvLyBzZXQgZXhpdCBmbGFnLCBzZXQgdGltZW91dCB0byAwIHRvIGZvcmNlIHRocmVhZExvb3AgdG8gZXhpdCBhbmQgd2FpdCBmb3IgdGhlIHRocmVhZCB0byBqb2luCi0gICAgcmVxdWVzdEV4aXQoKTsKLSAgICBzZXRUaW1lb3V0VXMoMCk7Ci0gICAgam9pbigpOwotfQotCi1ib29sIE5CTG9nOjpNZXJnZVRocmVhZDo6dGhyZWFkTG9vcCgpIHsKLSAgICBib29sIGRvTWVyZ2U7Ci0gICAgewotICAgICAgICBBdXRvTXV0ZXggX2wobU11dGV4KTsKLSAgICAgICAgLy8gSWYgbVRpbWVvdXRVcyBpcyBuZWdhdGl2ZSwgd2FpdCBvbiB0aGUgY29uZGl0aW9uIHZhcmlhYmxlIHVudGlsIGl0J3MgcG9zaXRpdmUuCi0gICAgICAgIC8vIElmIGl0J3MgcG9zaXRpdmUsIHdhaXQga1RocmVhZFNsZWVwUGVyaW9kVXMgYW5kIHRoZW4gbWVyZ2UKLSAgICAgICAgbnNlY3NfdCB3YWl0VGltZSA9IG1UaW1lb3V0VXMgPiAwID8ga1RocmVhZFNsZWVwUGVyaW9kVXMgKiAxMDAwIDogTExPTkdfTUFYOwotICAgICAgICBtQ29uZC53YWl0UmVsYXRpdmUobU11dGV4LCB3YWl0VGltZSk7Ci0gICAgICAgIGRvTWVyZ2UgPSBtVGltZW91dFVzID4gMDsKLSAgICAgICAgbVRpbWVvdXRVcyAtPSBrVGhyZWFkU2xlZXBQZXJpb2RVczsKLSAgICB9Ci0gICAgaWYgKGRvTWVyZ2UpIHsKLSAgICAgICAgLy8gTWVyZ2UgZGF0YSBmcm9tIGFsbCB0aGUgcmVhZGVycwotICAgICAgICBtTWVyZ2VyLm1lcmdlKCk7Ci0gICAgICAgIC8vIFByb2Nlc3MgdGhlIGRhdGEgY29sbGVjdGVkIGJ5IG1NZXJnZXIgYW5kIHdyaXRlIGl0IHRvIFBlcmZvcm1hbmNlQW5hbHlzaXMKLSAgICAgICAgLy8gRklYTUU6IGRlY2lkZSB3aGV0aGVyIHRvIGNhbGwgZ2V0QW5kUHJvY2Vzc1NuYXBzaG90IGV2ZXJ5IHRpbWUKLSAgICAgICAgLy8gb3Igd2hldGhlciB0byBoYXZlIGEgc2VwYXJhdGUgdGhyZWFkIHRoYXQgY2FsbHMgaXQgd2l0aCBhIGxvd2VyIGZyZXF1ZW5jeQotICAgICAgICBtTWVyZ2VSZWFkZXIuZ2V0QW5kUHJvY2Vzc1NuYXBzaG90KCk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIE5CTG9nOjpNZXJnZVRocmVhZDo6d2FrZXVwKCkgewotICAgIHNldFRpbWVvdXRVcyhrVGhyZWFkV2FrZXVwUGVyaW9kVXMpOwotfQotCi12b2lkIE5CTG9nOjpNZXJnZVRocmVhZDo6c2V0VGltZW91dFVzKGludCB0aW1lKSB7Ci0gICAgQXV0b011dGV4IF9sKG1NdXRleCk7Ci0gICAgbVRpbWVvdXRVcyA9IHRpbWU7Ci0gICAgbUNvbmQuc2lnbmFsKCk7Ci19Ci0KLX0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5jcHAgYi9tZWRpYS9saWJuYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmNwcAppbmRleCBmMDllOTNkLi5lOTFhNTExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmNwcAorKysgYi9tZWRpYS9saWJuYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmNwcApAQCAtMTcsMTMgKzE3LDE2IEBACiAKICNkZWZpbmUgTE9HX1RBRyAiUGVyZm9ybWFuY2VBbmFseXNpcyIKIC8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisvLyAjZGVmaW5lIFdSSVRFX1RPX0ZJTEUKIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxjbGltaXRzPgogI2luY2x1ZGUgPGRlcXVlPgotI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CiAjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPG51bWVyaWM+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPHN0ZGFyZy5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgpAQCAtMzIsMjAgKzM1LDEyNiBAQAogI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgogI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvTG9nUGxvdC5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3JvdW5kdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmxvZy9OQkxvZy5oPgogI2luY2x1ZGUgPG1lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KIAogI2luY2x1ZGUgPHF1ZXVlPgogI2luY2x1ZGUgPHV0aWxpdHk+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlIHsKIAordm9pZCBIaXN0b2dyYW06OmFkZChkb3VibGUgdmFsdWUpCit7CisgICAgaWYgKG1CaW5TaXplIDw9IDAgfHwgbUJpbnMuc2l6ZSgpIDwgMikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIFRPRE8gSGFuZGxlIGRvbWFpbiBhbmQgcmFuZ2UgZXJyb3IgZXhjZXB0aW9ucz8KKyAgICBjb25zdCBpbnQgdW5ib3VuZGVkSW5kZXggPSBscm91bmQoKHZhbHVlIC0gbUxvdykgLyBtQmluU2l6ZSkgKyAxOworICAgIC8vIHN0ZDo6Y2xhbXAgaXMgaW50cm9kdWNlZCBpbiBDKysxNworICAgIC8vY29uc3QgaW50IGluZGV4ID0gc3RkOjpjbGFtcCh1bmJvdW5kZWRJbmRleCwgMCwgKGludCkobUJpbnMuc2l6ZSgpIC0gMSkpOworICAgIGNvbnN0IGludCBpbmRleCA9IHN0ZDo6bWF4KDAsIHN0ZDo6bWluKChpbnQpKG1CaW5zLnNpemUoKSAtIDEpLCB1bmJvdW5kZWRJbmRleCkpOworICAgIG1CaW5zW2luZGV4XSsrOworICAgIG1Ub3RhbENvdW50Kys7Cit9CisKK3ZvaWQgSGlzdG9ncmFtOjpjbGVhcigpCit7CisgICAgc3RkOjpmaWxsKG1CaW5zLmJlZ2luKCksIG1CaW5zLmVuZCgpLCAwKTsKKyAgICBtVG90YWxDb3VudCA9IDA7Cit9CisKK3VpbnQ2NF90IEhpc3RvZ3JhbTo6dG90YWxDb3VudCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1Ub3RhbENvdW50OworfQorCitzdGQ6OnN0cmluZyBIaXN0b2dyYW06OnRvU3RyaW5nKCkgY29uc3QgeworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrRGl2aWRlciA9ICd8JzsKKyAgICBzcyA8PCBrVmVyc2lvbiA8PCAiLCIgPDwgbUJpblNpemUgPDwgIiwiIDw8IG1OdW1CaW5zIDw8ICIsIiA8PCBtTG93IDw8ICIseyI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQmlucy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobUJpbnNbaV0gIT0gMCkgeworICAgICAgICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICAgICAgICAgIHNzIDw8ICIsIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNzIDw8IHN0YXRpY19jYXN0PGludD4oaSkgLSAxIDw8IGtEaXZpZGVyIDw8IG1CaW5zW2ldOworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzcyA8PCAifSI7CisKKyAgICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK3N0ZDo6c3RyaW5nIEhpc3RvZ3JhbTo6YXNjaWlBcnRTdHJpbmcoc2l6ZV90IGluZGVudCkgY29uc3QgeworICAgIGlmICh0b3RhbENvdW50KCkgPT0gMCB8fCBtQmluU2l6ZSA8PSAwIHx8IG1CaW5zLnNpemUoKSA8IDIpIHsKKyAgICAgICAgcmV0dXJuICIiOworICAgIH0KKworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrTWFya2VyID0gJy0nOworICAgIC8vIE9uZSBpbmNyZW1lbnQgaXMgY29uc2lkZXJlZCBvbmUgc3RlcCBvZiBhIGJpbidzIGhlaWdodC4KKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWFya2Vyc1BlckluY3JlbWVudCA9IDI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01heEluY3JlbWVudHMgPSA2NCArIDE7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01heE51bWJlcldpZHRoID0gNzsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga01hcmtlcnMoa01hcmtlcnNQZXJJbmNyZW1lbnQgKiBrTWF4SW5jcmVtZW50cywga01hcmtlcik7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtTcGFjZXMoa01hcmtlcnNQZXJJbmNyZW1lbnQgKiBrTWF4SW5jcmVtZW50cywgJyAnKTsKKyAgICAvLyBnZXQgdGhlIGxhc3QgbiBjaGFyYWN0ZXJzIG9mIHMsIG9yIHRoZSB3aG9sZSBzdHJpbmcgaWYgaXQgaXMgc2hvcnRlcgorICAgIGF1dG8gZ2V0VGFpbCA9IFtdKGNvbnN0IHNpemVfdCBuLCBjb25zdCBzdGQ6OnN0cmluZyAmcykgeworICAgICAgICByZXR1cm4gcy5jX3N0cigpICsgcy5zaXplKCkgLSBzdGQ6Om1pbihuLCBzLnNpemUoKSk7CisgICAgfTsKKworICAgIC8vIFNpbmNlIHRvdGFsQ291bnQoKSA+IDAsIG1CaW5zIGlzIG5vdCBlbXB0eSBhbmQgbWF4Q291bnQgPiAwLgorICAgIGNvbnN0IHVuc2lnbmVkIG1heENvdW50ID0gKnN0ZDo6bWF4X2VsZW1lbnQobUJpbnMuYmVnaW4oKSwgbUJpbnMuZW5kKCkpOworICAgIGNvbnN0IHNpemVfdCBtYXhJbmNyZW1lbnRzID0gbG9nMihtYXhDb3VudCkgKyAxOworCisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisKKyAgICAvLyBOb24temVybyBiaW5zIG11c3QgZXhpc3QgYXQgdGhpcyBwb2ludCBiZWNhdXNlIHRvdGFsQ291bnQoKSA+IDAuCisgICAgc2l6ZV90IGZpcnN0Tm9uWmVyb0JpbiA9IDA7CisgICAgLy8gSWYgZmlyc3ROb25aZXJvQmluIHJlYWNoZXMgbUJpbnMuc2l6ZSgpIC0gMSwgdGhlbiBpdCBtdXN0IGJlIGEgbm9uemVybyBiaW4uCisgICAgZm9yICg7IGZpcnN0Tm9uWmVyb0JpbiA8IG1CaW5zLnNpemUoKSAtIDEgJiYgbUJpbnNbZmlyc3ROb25aZXJvQmluXSA9PSAwOyBmaXJzdE5vblplcm9CaW4rKykge30KKyAgICBjb25zdCBzaXplX3QgZmlyc3RCaW5Ub1ByaW50ID0gZmlyc3ROb25aZXJvQmluID09IDAgPyAwIDogZmlyc3ROb25aZXJvQmluIC0gMTsKKworICAgIHNpemVfdCBsYXN0Tm9uWmVyb0JpbiA9IG1CaW5zLnNpemUoKSAtIDE7CisgICAgLy8gSWYgbGFzdE5vblplcm9CaW4gcmVhY2hlcyAwLCB0aGVuIGl0IG11c3QgYmUgYSBub256ZXJvIGJpbi4KKyAgICBmb3IgKDsgbGFzdE5vblplcm9CaW4gPiAwICYmIG1CaW5zW2xhc3ROb25aZXJvQmluXSA9PSAwOyBsYXN0Tm9uWmVyb0Jpbi0tKSB7fQorICAgIGNvbnN0IHNpemVfdCBsYXN0QmluVG9QcmludCA9IGxhc3ROb25aZXJvQmluID09IG1CaW5zLnNpemUoKSAtIDEgPyBsYXN0Tm9uWmVyb0JpbgorICAgICAgICAgICAgOiBsYXN0Tm9uWmVyb0JpbiArIDE7CisKKyAgICBmb3IgKHNpemVfdCBiaW4gPSBmaXJzdEJpblRvUHJpbnQ7IGJpbiA8PSBsYXN0QmluVG9QcmludDsgYmluKyspIHsKKyAgICAgICAgc3MgPDwgc3RkOjpzZXR3KGluZGVudCArIGtNYXhOdW1iZXJXaWR0aCk7CisgICAgICAgIGlmIChiaW4gPT0gMCkgeworICAgICAgICAgICAgc3MgPDwgIjwiOworICAgICAgICB9IGVsc2UgaWYgKGJpbiA9PSBtQmlucy5zaXplKCkgLSAxKSB7CisgICAgICAgICAgICBzcyA8PCAiPiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcyA8PCBtTG93ICsgKGJpbiAtIDEpICogbUJpblNpemU7CisgICAgICAgIH0KKyAgICAgICAgc3MgPDwgIiB8IjsKKyAgICAgICAgc2l6ZV90IGluY3JlbWVudHMgPSAwOworICAgICAgICBjb25zdCB1aW50NjRfdCBiaW5Db3VudCA9IG1CaW5zW2Jpbl07CisgICAgICAgIGlmIChiaW5Db3VudCA+IDApIHsKKyAgICAgICAgICAgIGluY3JlbWVudHMgPSBsb2cyKGJpbkNvdW50KSArIDE7CisgICAgICAgICAgICBzcyA8PCBnZXRUYWlsKGluY3JlbWVudHMgKiBrTWFya2Vyc1BlckluY3JlbWVudCwga01hcmtlcnMpOworICAgICAgICB9CisgICAgICAgIHNzIDw8IGdldFRhaWwoKG1heEluY3JlbWVudHMgLSBpbmNyZW1lbnRzICsgMSkgKiBrTWFya2Vyc1BlckluY3JlbWVudCwga1NwYWNlcykKKyAgICAgICAgICAgICAgICA8PCBiaW5Db3VudCA8PCAiXG4iOworICAgIH0KKyAgICBzcyA8PCAiXG4iOworCisgICAgcmV0dXJuIHNzLnN0cigpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCiAvLyBHaXZlbiBhbiBhdWRpbyBwcm9jZXNzaW5nIHdha2V1cCB0aW1lc3RhbXAsIGJ1Y2tldHMgdGhlIHRpbWUgaW50ZXJ2YWwKIC8vIHNpbmNlIHRoZSBwcmV2aW91cyB0aW1lc3RhbXAgaW50byBhIGhpc3RvZ3JhbSwgc2VhcmNoZXMgZm9yCiAvLyBvdXRsaWVycywgYW5hbHl6ZXMgdGhlIG91dGxpZXIgc2VyaWVzIGZvciB1bmV4cGVjdGVkbHkKQEAgLTIwOCwyNyArMzE3LDYgQEAKICAgICByZXR1cm4gaXNPdXRsaWVyOwogfQogCi1zdGF0aWMgaW50IHdpZHRoT2YoaW50IHgpIHsKLSAgICBpbnQgd2lkdGggPSAwOwotICAgIGlmICh4IDwgMCkgewotICAgICAgICB3aWR0aCsrOwotICAgICAgICB4ID0geCA9PSBJTlRfTUlOID8gSU5UX01BWCA6IC14OwotICAgIH0KLSAgICAvLyBhc3NlcnQgKHggPj0gMCkKLSAgICBkbyB7Ci0gICAgICAgICsrd2lkdGg7Ci0gICAgICAgIHggLz0gMTA7Ci0gICAgfSB3aGlsZSAoeCA+IDApOwotICAgIHJldHVybiB3aWR0aDsKLX0KLQotLy8gY29tcHV0ZXMgdGhlIGNvbHVtbiB3aWR0aCByZXF1aXJlZCBmb3IgYSBzcGVjaWZpYyBoaXN0b2dyYW0gdmFsdWUKLWlubGluZSBpbnQgbnVtYmVyV2lkdGgoZG91YmxlIG51bWJlciwgaW50IGxlZnRQYWRkaW5nKSB7Ci0gICAgLy8gQWRkZWQgdmFsdWVzIGFjY291bnQgZm9yIHdoaXRlc3BhY2VzIG5lZWRlZCBhcm91bmQgbnVtYmVycywgYW5kIGZvciB0aGUKLSAgICAvLyBkb3QgYW5kIGRlY2ltYWwgZGlnaXQgbm90IGFjY291bnRlZCBmb3IgYnkgd2lkdGhPZgotICAgIHJldHVybiBzdGQ6Om1heChzdGQ6Om1heCh3aWR0aE9mKHN0YXRpY19jYXN0PGludD4obnVtYmVyKSkgKyAzLCAyKSwgbGVmdFBhZGRpbmcgKyAxKTsKLX0KLQogLy8gcm91bmRzIHZhbHVlIHRvIHByZWNpc2lvbiBiYXNlZCBvbiBsb2ctZGlzdGFuY2UgZnJvbSBtZWFuCiBfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiBpbmxpbmUgZG91YmxlIGxvZ1JvdW5kKGRvdWJsZSB4LCBkb3VibGUgbWVhbikgewpAQCAtMjU0LDcgKzM0Miw3IEBACiAvLyBvZiBQZXJmb3JtYW5jZUFuYWx5c2lzCiB2b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OnJlcG9ydFBlcmZvcm1hbmNlKFN0cmluZzggKmJvZHksIGludCBhdXRob3IsIGxvZ19oYXNoX3QgaGFzaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heEhlaWdodCkgewotICAgIGlmIChtSGlzdHMuZW1wdHkoKSkgeworICAgIGlmIChtSGlzdHMuZW1wdHkoKSB8fCBib2R5ID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMjczLDY5ICszNjEsMTYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIHVuZGVyc2NvcmVzIGFuZCBzcGFjZXMgbGVuZ3RoIGNvcnJlc3BvbmRzIHRvIG1heGltdW0gd2lkdGggb2YgaGlzdG9ncmFtCi0gICAgc3RhdGljIGNvbnN0IGludCBrTGVuID0gMjAwOwotICAgIHN0ZDo6c3RyaW5nIHVuZGVyc2NvcmVzKGtMZW4sICdfJyk7Ci0gICAgc3RkOjpzdHJpbmcgc3BhY2VzKGtMZW4sICcgJyk7Ci0KLSAgICBhdXRvIGl0ID0gYnVja2V0cy5iZWdpbigpOwotICAgIGRvdWJsZSBtYXhEZWx0YSA9IGl0LT5maXJzdDsKLSAgICBpbnQgbWF4Q291bnQgPSBpdC0+c2Vjb25kOwotICAgIC8vIENvbXB1dGUgbWF4aW11bSB2YWx1ZXMKLSAgICB3aGlsZSAoKytpdCAhPSBidWNrZXRzLmVuZCgpKSB7Ci0gICAgICAgIGlmIChpdC0+Zmlyc3QgPiBtYXhEZWx0YSkgewotICAgICAgICAgICAgbWF4RGVsdGEgPSBpdC0+Zmlyc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGl0LT5zZWNvbmQgPiBtYXhDb3VudCkgewotICAgICAgICAgICAgbWF4Q291bnQgPSBpdC0+c2Vjb25kOwotICAgICAgICB9Ci0gICAgfQotICAgIGludCBoZWlnaHQgPSBsb2cyKG1heENvdW50KSArIDE7IC8vIG1heENvdW50ID4gMCwgc2FmZSB0byBjYWxsIGxvZzIKLSAgICBjb25zdCBpbnQgbGVmdFBhZGRpbmcgPSB3aWR0aE9mKDEgPDwgaGVpZ2h0KTsKLSAgICBjb25zdCBpbnQgYnVja2V0V2lkdGggPSBudW1iZXJXaWR0aChtYXhEZWx0YSwgbGVmdFBhZGRpbmcpOwotICAgIGludCBzY2FsaW5nRmFjdG9yID0gMTsKLSAgICAvLyBzY2FsZSBkYXRhIGlmIGl0IGV4Y2VlZHMgbWF4aW11bSBoZWlnaHQKLSAgICBpZiAoaGVpZ2h0ID4gbWF4SGVpZ2h0KSB7Ci0gICAgICAgIHNjYWxpbmdGYWN0b3IgPSAoaGVpZ2h0ICsgbWF4SGVpZ2h0KSAvIG1heEhlaWdodDsKLSAgICAgICAgaGVpZ2h0IC89IHNjYWxpbmdGYWN0b3I7Ci0gICAgfQotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lKnMgJTMuMmYgJXMiLCBsZWZ0UGFkZGluZyArIDExLAotICAgICAgICAgICAgIk9jY3VycmVuY2VzIGluIiwgKGVsYXBzZWRNcyAvIGtNc1BlclNlYyksICJzZWNvbmRzIG9mIGF1ZGlvOiIpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lKnMlZCwgJWxsZCwgJWxsZFxuIiwgbGVmdFBhZGRpbmcgKyAxMSwKKyAgICBzdGF0aWMgY29uc3QgaW50IFNJWkUgPSAxMjg7CisgICAgY2hhciB0aXRsZVtTSVpFXTsKKyAgICBzbnByaW50Zih0aXRsZSwgc2l6ZW9mKHRpdGxlKSwgIlxuJXMgJTMuMmYgJXNcbiVzJWQsICVsbGQsICVsbGRcbiIsCisgICAgICAgICAgICAiT2NjdXJyZW5jZXMgaW4iLCAoZWxhcHNlZE1zIC8ga01zUGVyU2VjKSwgInNlY29uZHMgb2YgYXVkaW86IiwKICAgICAgICAgICAgICJUaHJlYWQsIGhhc2gsIHN0YXJ0aW5nIHRpbWVzdGFtcDogIiwgYXV0aG9yLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZyBsb25nIGludD4oaGFzaCksIHN0YXRpY19jYXN0PGxvbmcgbG9uZyBpbnQ+KHN0YXJ0aW5nVHMpKTsKLSAgICAvLyB3cml0ZSBoaXN0b2dyYW0gbGFiZWwgbGluZSB3aXRoIGJ1Y2tldCB2YWx1ZXMKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJXMiLCAiICIpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSpzIiwgbGVmdFBhZGRpbmcsICIgIik7Ci0gICAgZm9yIChhdXRvIGNvbnN0ICZ4IDogYnVja2V0cykgewotICAgICAgICBjb25zdCBpbnQgY29sV2lkdGggPSBudW1iZXJXaWR0aCh4LmZpcnN0LCBsZWZ0UGFkZGluZyk7Ci0gICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSpkIiwgY29sV2lkdGgsIHguc2Vjb25kKTsKLSAgICB9Ci0gICAgLy8gd3JpdGUgaGlzdG9ncmFtIGFzY2lpIGFydAotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lcyIsICIgIik7Ci0gICAgZm9yIChpbnQgcm93ID0gaGVpZ2h0ICogc2NhbGluZ0ZhY3Rvcjsgcm93ID49IDA7IHJvdyAtPSBzY2FsaW5nRmFjdG9yKSB7Ci0gICAgICAgIGNvbnN0IGludCB2YWx1ZSA9IDEgPDwgcm93OwotICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUuKnMiLCBsZWZ0UGFkZGluZywgc3BhY2VzLmNfc3RyKCkpOwotICAgICAgICBmb3IgKGF1dG8gY29uc3QgJnggOiBidWNrZXRzKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQgY29sV2lkdGggPSBudW1iZXJXaWR0aCh4LmZpcnN0LCBsZWZ0UGFkZGluZyk7Ci0gICAgICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUuKnMlcyIsIGNvbFdpZHRoIC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZXMuY19zdHIoKSwgeC5zZWNvbmQgPCB2YWx1ZSA/ICIgIiA6ICJ8Iik7Ci0gICAgICAgIH0KLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiVzIiwgIiAiKTsKLSAgICB9Ci0gICAgLy8gcHJpbnQgeC1heGlzCi0gICAgY29uc3QgaW50IGNvbHVtbnMgPSBzdGF0aWNfY2FzdDxpbnQ+KGJ1Y2tldHMuc2l6ZSgpKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqYyIsIGxlZnRQYWRkaW5nLCAnICcpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyIsIChjb2x1bW5zICsgMSkgKiBidWNrZXRXaWR0aCwgdW5kZXJzY29yZXMuY19zdHIoKSk7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiVzIiwgIiAiKTsKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4oaGFzaCksIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4oc3RhcnRpbmdUcykpOworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga0xhYmVsID0gIm1zIjsKIAotICAgIC8vIHdyaXRlIGZvb3RlciB3aXRoIGJ1Y2tldCBsYWJlbHMKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqcyIsIGxlZnRQYWRkaW5nLCAiICIpOwotICAgIGZvciAoYXV0byBjb25zdCAmeCA6IGJ1Y2tldHMpIHsKLSAgICAgICAgY29uc3QgaW50IGNvbFdpZHRoID0gbnVtYmVyV2lkdGgoeC5maXJzdCwgbGVmdFBhZGRpbmcpOwotICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqLipmIiwgY29sV2lkdGgsIDEsIHguZmlyc3QpOwotICAgIH0KLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUuKnMlcyIsIGJ1Y2tldFdpZHRoLCBzcGFjZXMuY19zdHIoKSwgIm1zXG4iKTsKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiVzIiwKKyAgICAgICAgICAgIGF1ZGlvX3V0aWxzX3Bsb3RfaGlzdG9ncmFtKGJ1Y2tldHMsIHRpdGxlLCBrTGFiZWwsIG1heEhlaWdodCkuY19zdHIoKSk7CiAKICAgICAvLyBOb3cgcmVwb3J0IGdsaXRjaGVzCiAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbnRpbWUgZWxhcHNlZCBiZXR3ZWVuIGdsaXRjaGVzIGFuZCBnbGl0Y2ggdGltZXN0YW1wczpcbiIpOwpAQCAtMzUwLDcgKzM4NSw5IEBACiAvLyB3cml0ZXMgc3VtbWFyeSBvZiBwZXJmb3JtYW5jZSBpbnRvIHNwZWNpZmllZCBmaWxlIGRlc2NyaXB0b3IKIHZvaWQgZHVtcChpbnQgZmQsIGludCBpbmRlbnQsIFBlcmZvcm1hbmNlQW5hbHlzaXNNYXAgJnRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXMpIHsKICAgICBTdHJpbmc4IGJvZHk7CisjaWZkZWYgV1JJVEVfVE9fRklMRQogICAgIGNvbnN0IGNoYXIqIGNvbnN0IGtEaXJlY3RvcnkgPSAiL2RhdGEvbWlzYy9hdWRpb3NlcnZlci8iOworI2VuZGlmCiAgICAgZm9yIChhdXRvICYgdGhyZWFkIDogdGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpcykgewogICAgICAgICBmb3IgKGF1dG8gJiBoYXNoOiB0aHJlYWQuc2Vjb25kKSB7CiAgICAgICAgICAgICBQZXJmb3JtYW5jZUFuYWx5c2lzJiBjdXJyID0gaGFzaC5zZWNvbmQ7CkBAIC0zNjAsOSArMzk3LDExIEBACiAgICAgICAgICAgICAgICAgZHVtcExpbmUoZmQsIGluZGVudCwgYm9keSk7CiAgICAgICAgICAgICAgICAgYm9keS5jbGVhcigpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gd3JpdGUgdG8gZmlsZQorI2lmZGVmIFdSSVRFX1RPX0ZJTEUKKyAgICAgICAgICAgIC8vIHdyaXRlIHRvIGZpbGUuIEVuYWJsZSBieSB1bmNvbW1lbnRpbmcgbWFjcm8gYXQgdG9wIG9mIGZpbGUuCiAgICAgICAgICAgICB3cml0ZVRvRmlsZShjdXJyLm1IaXN0cywgY3Vyci5tT3V0bGllckRhdGEsIGN1cnIubVBlYWtUaW1lc3RhbXBzLAogICAgICAgICAgICAgICAgICAgICAgICAga0RpcmVjdG9yeSwgZmFsc2UsIHRocmVhZC5maXJzdCwgaGFzaC5maXJzdCk7CisjZW5kaWYKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTM3NCw1ICs0MTMsNCBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZQotCiB9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL1JlYWRlci5jcHAgYi9tZWRpYS9saWJuYmxvZy9SZWFkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNTMwOTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9SZWFkZXIuY3BwCkBAIC0wLDAgKzEsNDM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJOQkxvZyIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm8uaD4KKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0VudHJ5Lmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRXZlbnRzLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVhZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvVGltZWxpbmUuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBOQkxvZyB7CisKK1JlYWRlcjo6UmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUsIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKQorICAgIDogbU5hbWUobmFtZSksCisgICAgICBtU2hhcmVkKCgvKmNvbnN0Ki8gU2hhcmVkICopIHNoYXJlZCksIC8qbUlNZW1vcnkqLworICAgICAgbUZpZm8obVNoYXJlZCAhPSBOVUxMID8KKyAgICAgICAgbmV3IGF1ZGlvX3V0aWxzX2ZpZm8oc2l6ZSwgc2l6ZW9mKHVpbnQ4X3QpLAorICAgICAgICAgICAgbVNoYXJlZC0+bUJ1ZmZlciwgbVNoYXJlZC0+bVJlYXIsIE5VTEwgLyp0aHJvdHRsZXNGcm9udCovKSA6IE5VTEwpLAorICAgICAgbUZpZm9SZWFkZXIobUZpZm8gIT0gTlVMTCA/IG5ldyBhdWRpb191dGlsc19maWZvX3JlYWRlcigqbUZpZm8pIDogTlVMTCkKK3sKK30KKworUmVhZGVyOjpSZWFkZXIoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnksIHNpemVfdCBzaXplLCBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkKKyAgICA6IFJlYWRlcihpTWVtb3J5ICE9IDAgPyAoU2hhcmVkICopIGlNZW1vcnktPnBvaW50ZXIoKSA6IE5VTEwsIHNpemUsIG5hbWUpCit7CisgICAgbUlNZW1vcnkgPSBpTWVtb3J5OworfQorCitSZWFkZXI6On5SZWFkZXIoKQoreworICAgIGRlbGV0ZSBtRmlmb1JlYWRlcjsKKyAgICBkZWxldGUgbUZpZm87Cit9CisKKy8vIENvcGllcyBjb250ZW50IG9mIGEgUmVhZGVyIEZJRk8gaW50byBpdHMgU25hcHNob3QKKy8vIFRoZSBTbmFwc2hvdCBoYXMgdGhlIHNhbWUgcmF3IGRhdGEsIGJ1dCByZXByZXNlbnRlZCBhcyBhIHNlcXVlbmNlIG9mIGVudHJpZXMKKy8vIGFuZCBhbiBFbnRyeUl0ZXJhdG9yIG1ha2luZyBpdCBwb3NzaWJsZSB0byBwcm9jZXNzIHRoZSBkYXRhLgorc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PiBSZWFkZXI6OmdldFNuYXBzaG90KGJvb2wgZmx1c2gpCit7CisgICAgaWYgKG1GaWZvUmVhZGVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4obmV3IFNuYXBzaG90KCkpOworICAgIH0KKworICAgIC8vIFRoaXMgZW11bGF0ZXMgdGhlIGJlaGF2aW91ciBvZiBhdWRpb191dGlsc19maWZvX3JlYWRlcjo6cmVhZCwgYnV0IHdpdGhvdXQgaW5jcmVtZW50aW5nIHRoZQorICAgIC8vIHJlYWRlciBpbmRleC4gVGhlIGluZGV4IGlzIGluY3JlbWVudGVkIGFmdGVyIGhhbmRsaW5nIGNvcnJ1cHRpb24sIHRvIGFmdGVyIHRoZSBsYXN0IGNvbXBsZXRlCisgICAgLy8gZW50cnkgb2YgdGhlIGJ1ZmZlcgorICAgIHNpemVfdCBsb3N0ID0gMDsKKyAgICBhdWRpb191dGlsc19pb3ZlYyBpb3ZlY1syXTsKKyAgICBjb25zdCBzaXplX3QgY2FwYWNpdHkgPSBtRmlmby0+Y2FwYWNpdHkoKTsKKyAgICBzc2l6ZV90IGF2YWlsVG9SZWFkOworICAgIC8vIEEgY2FsbCB0byBhdWRpb191dGlsc19maWZvX3JlYWRlcjo6b2J0YWluKCkgcGxhY2VzIHRoZSByZWFkIHBvaW50ZXIgb25lIGJ1ZmZlciBsZW5ndGgKKyAgICAvLyBiZWZvcmUgdGhlIHdyaXRlcidzIHBvaW50ZXIgKHNpbmNlIG1GaWZvUmVhZGVyIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIGZsdXNoPWZhbHNlKS4gVGhlCisgICAgLy8gZG8gd2hpbGUgbG9vcCBpcyBhbiBhdHRlbXB0IHRvIHJlYWQgYWxsIG9mIHRoZSBGSUZPJ3MgY29udGVudHMgcmVnYXJkbGVzcyBvZiBob3cgYmVoaW5kCisgICAgLy8gdGhlIHJlYWRlciBpcyB3aXRoIHJlc3BlY3QgdG8gdGhlIHdyaXRlci4gSG93ZXZlciwgdGhlIGZvbGxvd2luZyBzY2hlZHVsaW5nIHNlcXVlbmNlIGlzCisgICAgLy8gcG9zc2libGUgYW5kIGNhbiBsZWFkIHRvIGEgc3RhcnZhdGlvbiBzaXR1YXRpb246CisgICAgLy8gLSBXcml0ZXIgVDEgd3JpdGVzLCBvdmVycnVuIHdpdGggcmVzcGVjdCB0byBSZWFkZXIgVDIKKyAgICAvLyAtIFQyIGNhbGxzIG9idGFpbigpIGFuZCBnZXRzIEVPVkVSRkxPVywgVDIgcHRyIHBsYWNlZCBvbmUgYnVmZmVyIHNpemUgYmVoaW5kIFQxIHB0cgorICAgIC8vIC0gVDEgd3JpdGUsIG92ZXJydW4KKyAgICAvLyAtIFQyIG9idGFpbigpLCBFT1ZFUkZMT1cgKGFuZCBzbyBvbi4uLikKKyAgICAvLyBUbyBhZGRyZXNzIHRoaXMgaXNzdWUsIHdlIGxpbWl0IHRoZSBudW1iZXIgb2YgdHJpZXMgZm9yIHRoZSByZWFkZXIgdG8gY2F0Y2ggdXAgd2l0aAorICAgIC8vIHRoZSB3cml0ZXIuCisgICAgaW50IHRyaWVzID0gMDsKKyAgICBzaXplX3QgbG9zdFRlbXA7CisgICAgZG8geworICAgICAgICBhdmFpbFRvUmVhZCA9IG1GaWZvUmVhZGVyLT5vYnRhaW4oaW92ZWMsIGNhcGFjaXR5LCBOVUxMIC8qdGltZW91dCovLCAmbG9zdFRlbXApOworICAgICAgICBsb3N0ICs9IGxvc3RUZW1wOworICAgIH0gd2hpbGUgKGF2YWlsVG9SZWFkIDwgMCB8fCArK3RyaWVzIDw9IGtNYXhPYnRhaW5Ucmllcyk7CisKKyAgICBpZiAoYXZhaWxUb1JlYWQgPD0gMCkgeworICAgICAgICBBTE9HV19JRihhdmFpbFRvUmVhZCA8IDAsICJOQkxvZyBSZWFkZXIgJXMgZmFpbGVkIHRvIGNhdGNoIHVwIHdpdGggV3JpdGVyIiwgbU5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+KG5ldyBTbmFwc2hvdCgpKTsKKyAgICB9CisKKyAgICAvLyBDaGFuZ2UgdG8gI2lmIDEgZm9yIGRlYnVnZ2luZy4gVGhpcyBzdGF0ZW1lbnQgaXMgdXNlZnVsIGZvciBjaGVja2luZyBidWZmZXIgZnVsbG5lc3MgbGV2ZWxzCisgICAgLy8gKGFzIHNlZW4gYnkgcmVhZGVyKSBhbmQgaG93IG11Y2ggZGF0YSB3YXMgbG9zdC4gSWYgeW91IGZpbmQgdGhhdCB0aGUgZnVsbG5lc3MgbGV2ZWwgaXMKKyAgICAvLyBnZXR0aW5nIGNsb3NlIHRvIGZ1bGwsIG9yIHRoYXQgZGF0YSBsb3NzIGlzIGhhcHBlbmluZyB0byBvZnRlbiwgdGhlbiB5b3Ugc2hvdWxkCisgICAgLy8gcHJvYmFibHkgdHJ5IHNvbWUgb2YgdGhlIGZvbGxvd2luZzoKKyAgICAvLyAtIGxvZyBsZXNzIGRhdGEKKyAgICAvLyAtIGxvZyBsZXNzIG9mdGVuCisgICAgLy8gLSBpbmNyZWFzZSB0aGUgaW5pdGlhbCBzaGFyZWQgbWVtb3J5IGFsbG9jYXRpb24gZm9yIHRoZSBidWZmZXIKKyNpZiAwCisgICAgQUxPR0QoImdldFNuYXBzaG90IG5hbWU9JXMsIGF2YWlsVG9SZWFkPSV6ZCwgY2FwYWNpdHk9JXp1LCBmdWxsbmVzcz0lLjNmLCBsb3N0PSV6dSIsCisgICAgICAgICAgICBuYW1lKCkuY19zdHIoKSwgYXZhaWxUb1JlYWQsIGNhcGFjaXR5LCAoZG91YmxlKWF2YWlsVG9SZWFkIC8gKGRvdWJsZSljYXBhY2l0eSwgbG9zdCk7CisjZW5kaWYKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IHNuYXBzaG90KG5ldyBTbmFwc2hvdChhdmFpbFRvUmVhZCkpOworICAgIG1lbWNweShzbmFwc2hvdC0+bURhdGEsIChjb25zdCBjaGFyICopIG1GaWZvLT5idWZmZXIoKSArIGlvdmVjWzBdLm1PZmZzZXQsIGlvdmVjWzBdLm1MZW5ndGgpOworICAgIGlmIChpb3ZlY1sxXS5tTGVuZ3RoID4gMCkgeworICAgICAgICBtZW1jcHkoc25hcHNob3QtPm1EYXRhICsgKGlvdmVjWzBdLm1MZW5ndGgpLAorICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopIG1GaWZvLT5idWZmZXIoKSArIGlvdmVjWzFdLm1PZmZzZXQsIGlvdmVjWzFdLm1MZW5ndGgpOworICAgIH0KKworICAgIC8vIEhhbmRsZSBjb3JydXB0ZWQgYnVmZmVyCisgICAgLy8gUG90ZW50aWFsbHksIGEgYnVmZmVyIGhhcyBjb3JydXB0ZWQgZGF0YSBvbiBib3RoIGJlZ2lubmluZyAoZHVlIHRvIG92ZXJmbG93KSBhbmQgZW5kCisgICAgLy8gKGR1ZSB0byBpbmNvbXBsZXRlIGZvcm1hdCBlbnRyeSkuIEJ1dCBldmVuIGlmIHRoZSBlbmQgZm9ybWF0IGVudHJ5IGlzIGluY29tcGxldGUsCisgICAgLy8gaXQgZW5kcyBpbiBhIGNvbXBsZXRlIGVudHJ5ICh3aGljaCBpcyBub3QgYW4gRk1UX0VORCkuIFNvIGlzIHNhZmUgdG8gdHJhdmVyc2UgYmFja3dhcmRzLgorICAgIC8vIFRPRE86IGhhbmRsZSBjbGllbnQgY29ycnVwdGlvbiAoaW4gdGhlIG1pZGRsZSBvZiBhIGJ1ZmZlcikKKworICAgIGNvbnN0IHVpbnQ4X3QgKmJhY2sgPSBzbmFwc2hvdC0+bURhdGEgKyBhdmFpbFRvUmVhZDsKKyAgICBjb25zdCB1aW50OF90ICpmcm9udCA9IHNuYXBzaG90LT5tRGF0YTsKKworICAgIC8vIEZpbmQgbGFzdCBGTVRfRU5ELiA8YmFjaz4gaXMgc2l0dGluZyBvbiBhbiBlbnRyeSB3aGljaCBtaWdodCBiZSB0aGUgbWlkZGxlIG9mIGEgRm9ybWF0RW50cnkuCisgICAgLy8gV2UgZ28gYmFja3dhcmRzIHVudGlsIHdlIGZpbmQgYW4gRVZFTlRfRk1UX0VORC4KKyAgICBjb25zdCB1aW50OF90ICpsYXN0RW5kID0gZmluZExhc3RWYWxpZEVudHJ5KGZyb250LCBiYWNrLCBpbnZhbGlkRW5kVHlwZXMpOworICAgIGlmIChsYXN0RW5kID09IG51bGxwdHIpIHsKKyAgICAgICAgc25hcHNob3QtPm1FbmQgPSBzbmFwc2hvdC0+bUJlZ2luID0gRW50cnlJdGVyYXRvcihmcm9udCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gZW5kIG9mIHNuYXBzaG90IHBvaW50cyB0byBhZnRlciBsYXN0IEZNVF9FTkQgZW50cnkKKyAgICAgICAgc25hcHNob3QtPm1FbmQgPSBFbnRyeUl0ZXJhdG9yKGxhc3RFbmQpLm5leHQoKTsKKyAgICAgICAgLy8gZmluZCBmaXJzdCBGTVRfU1RBUlQKKyAgICAgICAgY29uc3QgdWludDhfdCAqZmlyc3RTdGFydCA9IG51bGxwdHI7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZpcnN0U3RhcnRUbXAgPSBzbmFwc2hvdC0+bUVuZDsKKyAgICAgICAgd2hpbGUgKChmaXJzdFN0YXJ0VG1wID0gZmluZExhc3RWYWxpZEVudHJ5KGZyb250LCBmaXJzdFN0YXJ0VG1wLCBpbnZhbGlkQmVnaW5UeXBlcykpCisgICAgICAgICAgICAgICAgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZmlyc3RTdGFydCA9IGZpcnN0U3RhcnRUbXA7CisgICAgICAgIH0KKyAgICAgICAgLy8gZmlyc3RTdGFydCBpcyBudWxsIGlmIG5vIEZNVF9TVEFSVCBlbnRyeSB3YXMgZm91bmQgYmVmb3JlIGxhc3RFbmQKKyAgICAgICAgaWYgKGZpcnN0U3RhcnQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgc25hcHNob3QtPm1CZWdpbiA9IHNuYXBzaG90LT5tRW5kOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc25hcHNob3QtPm1CZWdpbiA9IEVudHJ5SXRlcmF0b3IoZmlyc3RTdGFydCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBhZHZhbmNlIGZpZm8gcmVhZGVyIGluZGV4IHRvIGFmdGVyIGxhc3QgZW50cnkgcmVhZC4KKyAgICBpZiAoZmx1c2gpIHsKKyAgICAgICAgbUZpZm9SZWFkZXItPnJlbGVhc2Uoc25hcHNob3QtPm1FbmQgLSBmcm9udCk7CisgICAgfQorCisgICAgc25hcHNob3QtPm1Mb3N0ID0gbG9zdDsKKyAgICByZXR1cm4gc25hcHNob3Q7Cit9CisKK2Jvb2wgUmVhZGVyOjppc0lNZW1vcnkoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnkpIGNvbnN0Cit7CisgICAgcmV0dXJuIGlNZW1vcnkgIT0gMCAmJiBtSU1lbW9yeSAhPSAwICYmIGlNZW1vcnktPnBvaW50ZXIoKSA9PSBtSU1lbW9yeS0+cG9pbnRlcigpOworfQorCisvLyBXZSBtYWtlIGEgc2V0IG9mIHRoZSBpbnZhbGlkIHR5cGVzIHJhdGhlciB0aGFuIHRoZSB2YWxpZCB0eXBlcyB3aGVuIGFsaWduaW5nCisvLyBTbmFwc2hvdCBFbnRyeUl0ZXJhdG9ycyB0byB2YWxpZCBlbnRyaWVzIGR1cmluZyBsb2cgY29ycnVwdGlvbiBjaGVja2luZy4KKy8vIFRoaXMgaXMgZG9uZSBpbiBvcmRlciB0byBhdm9pZCB0aGUgbWFpbnRlbmFuY2Ugb3ZlcmhlYWQgb2YgYWRkaW5nIGEgbmV3IEV2ZW50CisvLyB0eXBlIHRvIHRoZSB0d28gc2V0cyBiZWxvdyB3aGVuZXZlciBhIG5ldyBFdmVudCB0eXBlIGlzIGNyZWF0ZWQsIGFzIGl0IGlzCisvLyB2ZXJ5IGxpa2VseSB0aGF0IG5ldyB0eXBlcyBhZGRlZCB3aWxsIGJlIHZhbGlkIHR5cGVzLgorLy8gQ3VycmVudGx5LCBpbnZhbGlkQmVnaW5UeXBlcyBhbmQgaW52YWxpZEVuZFR5cGVzIGFyZSB1c2VkIHRvIGhhbmRsZSB0aGUgc3BlY2lhbAorLy8gY2FzZSBvZiBhIEZvcm1hdCBFbnRyeSwgd2hpY2ggY29uc2lzdHMgb2YgYSB2YXJpYWJsZSBudW1iZXIgb2Ygc2ltcGxlIGxvZyBlbnRyaWVzLgorLy8gSWYgYSBuZXcgRXZlbnQgaXMgYWRkZWQgdGhhdCBjb25zaXN0cyBvZiBhIHZhcmlhYmxlIG51bWJlciBvZiBzaW1wbGUgbG9nIGVudHJpZXMsCisvLyB0aGVuIHRoZXNlIHNldHMgbmVlZCB0byBiZSB1cGRhdGVkLgorCisvLyBXZSB3YW50IHRoZSBiZWdpbm5pbmcgb2YgYSBTbmFwc2hvdCB0byBwb2ludCB0byBhbiBlbnRyeSB0aGF0IGlzIG5vdCBpbgorLy8gdGhlIG1pZGRsZSBvZiBhIGZvcm1hdHRlZCBlbnRyeSBhbmQgbm90IGFuIEZNVF9FTkQuCitjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8RXZlbnQ+IFJlYWRlcjo6aW52YWxpZEJlZ2luVHlwZXMgeworICAgIEVWRU5UX0ZNVF9BVVRIT1IsCisgICAgRVZFTlRfRk1UX0VORCwKKyAgICBFVkVOVF9GTVRfRkxPQVQsCisgICAgRVZFTlRfRk1UX0hBU0gsCisgICAgRVZFTlRfRk1UX0lOVEVHRVIsCisgICAgRVZFTlRfRk1UX1BJRCwKKyAgICBFVkVOVF9GTVRfU1RSSU5HLAorICAgIEVWRU5UX0ZNVF9USU1FU1RBTVAsCit9OworCisvLyBXZSB3YW50IHRoZSBlbmQgb2YgYSBTbmFwc2hvdCB0byBwb2ludCB0byBhbiBlbnRyeSB0aGF0IGlzIG5vdCBpbgorLy8gdGhlIG1pZGRsZSBvZiBhIGZvcm1hdHRlZCBlbnRyeSBhbmQgbm90IGEgRk1UX1NUQVJULgorY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PEV2ZW50PiBSZWFkZXI6OmludmFsaWRFbmRUeXBlcyB7CisgICAgRVZFTlRfRk1UX0FVVEhPUiwKKyAgICBFVkVOVF9GTVRfRkxPQVQsCisgICAgRVZFTlRfRk1UX0hBU0gsCisgICAgRVZFTlRfRk1UX0lOVEVHRVIsCisgICAgRVZFTlRfRk1UX1BJRCwKKyAgICBFVkVOVF9GTVRfU1RBUlQsCisgICAgRVZFTlRfRk1UX1NUUklORywKKyAgICBFVkVOVF9GTVRfVElNRVNUQU1QLAorfTsKKworY29uc3QgdWludDhfdCAqUmVhZGVyOjpmaW5kTGFzdFZhbGlkRW50cnkoY29uc3QgdWludDhfdCAqZnJvbnQsIGNvbnN0IHVpbnQ4X3QgKmJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8RXZlbnQ+ICZpbnZhbGlkVHlwZXMpIHsKKyAgICBpZiAoZnJvbnQgPT0gbnVsbHB0ciB8fCBiYWNrID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHdoaWxlIChiYWNrICsgRW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldCA+PSBmcm9udCkgeworICAgICAgICBjb25zdCB1aW50OF90ICpwcmV2ID0gYmFjayAtIGJhY2tbRW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldF0gLSBFbnRyeTo6a092ZXJoZWFkOworICAgICAgICBjb25zdCBFdmVudCB0eXBlID0gKGNvbnN0IEV2ZW50KXByZXZbb2Zmc2V0b2YoZW50cnksIHR5cGUpXTsKKyAgICAgICAgaWYgKHByZXYgPCBmcm9udAorICAgICAgICAgICAgICAgIHx8IHByZXYgKyBwcmV2W29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSArIEVudHJ5OjprT3ZlcmhlYWQgIT0gYmFjaworICAgICAgICAgICAgICAgIHx8IHR5cGUgPD0gRVZFTlRfUkVTRVJWRUQgfHwgdHlwZSA+PSBFVkVOVF9VUFBFUl9CT1VORCkgeworICAgICAgICAgICAgLy8gcHJldiBwb2ludHMgdG8gYW4gb3V0IG9mIGxpbWl0cyBvciBpbmNvbnNpc3RlbnQgZW50cnkKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIC8vIGlmIGludmFsaWRUeXBlcyBkb2VzIG5vdCBjb250YWluIHRoZSB0eXBlLCB0aGVuIHRoZSB0eXBlIGlzIHZhbGlkLgorICAgICAgICBpZiAoaW52YWxpZFR5cGVzLmZpbmQodHlwZSkgPT0gaW52YWxpZFR5cGVzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gcHJldjsKKyAgICAgICAgfQorICAgICAgICBiYWNrID0gcHJldjsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7IC8vIG5vIGVudHJ5IGZvdW5kCit9CisKKy8vIFRPRE8gZm9yIGZ1dHVyZSBjb21wYXRpYmlsaXR5LCB3b3VsZCBwcmVmZXIgdG8gaGF2ZSBhIGR1bXAoKSBnbyB0byBzdHJpbmcsIGFuZCB0aGVuIGdvCisvLyB0byBmZCBvbmx5IHdoZW4gaW52b2tlZCB0aHJvdWdoIGJpbmRlci4KK3ZvaWQgRHVtcFJlYWRlcjo6ZHVtcChpbnQgZmQsIHNpemVfdCBpbmRlbnQpCit7CisgICAgaWYgKGZkIDwgMCkgcmV0dXJuOworICAgIHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4gc25hcHNob3QgPSBnZXRTbmFwc2hvdChmYWxzZSAvKmZsdXNoKi8pOworICAgIGlmIChzbmFwc2hvdCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgU3RyaW5nOCB0aW1lc3RhbXAsIGJvZHk7CisKKyAgICAvLyBUT0RPIGFsbCBsb2dnZWQgdHlwZXMgc2hvdWxkIGhhdmUgYSBwcmludGFibGUgZm9ybWF0LgorICAgIC8vIFRPRE8gY2FuIHdlIG1ha2UgdGhlIHByaW50aW5nIGdlbmVyaWM/CisgICAgZm9yIChFbnRyeUl0ZXJhdG9yIGl0ID0gc25hcHNob3QtPmJlZ2luKCk7IGl0ICE9IHNuYXBzaG90LT5lbmQoKTsgKytpdCkgeworICAgICAgICBzd2l0Y2ggKGl0LT50eXBlKSB7CisgICAgICAgIGNhc2UgRVZFTlRfRk1UX1NUQVJUOgorICAgICAgICAgICAgaXQgPSBoYW5kbGVGb3JtYXQoRm9ybWF0RW50cnkoaXQpLCAmdGltZXN0YW1wLCAmYm9keSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9MQVRFTkNZOiB7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbGF0ZW5jeU1zID0gaXQucGF5bG9hZDxkb3VibGU+KCk7CisgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiRVZFTlRfTEFURU5DWSwlLjNmIiwgbGF0ZW5jeU1zKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9PVkVSUlVOOiB7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRzID0gaXQucGF5bG9hZDxpbnQ2NF90PigpOworICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIkVWRU5UX09WRVJSVU4sJWxsZCIsIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4odHMpKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9USFJFQURfSU5GTzogeworICAgICAgICAgICAgY29uc3QgdGhyZWFkX2luZm9fdCBpbmZvID0gaXQucGF5bG9hZDx0aHJlYWRfaW5mb190PigpOworICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIkVWRU5UX1RIUkVBRF9JTkZPLCVkLCVzIiwgc3RhdGljX2Nhc3Q8aW50PihpbmZvLmlkKSwKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkVHlwZVRvU3RyaW5nKGluZm8udHlwZSkpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1VOREVSUlVOOiB7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRzID0gaXQucGF5bG9hZDxpbnQ2NF90PigpOworICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIkVWRU5UX1VOREVSUlVOLCVsbGQiLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KHRzKSk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfV0FSTVVQX1RJTUU6IHsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSB0aW1lTXMgPSBpdC5wYXlsb2FkPGRvdWJsZT4oKTsKKyAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJFVkVOVF9XQVJNVVBfVElNRSwlLjNmIiwgdGltZU1zKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9XT1JLX1RJTUU6IHsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgbW9ub3RvbmljTnMgPSBpdC5wYXlsb2FkPGludDY0X3Q+KCk7CisgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiRVZFTlRfV09SS19USU1FLCVsbGQiLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KG1vbm90b25pY05zKSk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfVEhSRUFEX1BBUkFNUzogeworICAgICAgICAgICAgY29uc3QgdGhyZWFkX3BhcmFtc190IHBhcmFtcyA9IGl0LnBheWxvYWQ8dGhyZWFkX3BhcmFtc190PigpOworICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIkVWRU5UX1RIUkVBRF9QQVJBTVMsJXp1LCV1IiwgcGFyYW1zLmZyYW1lQ291bnQsIHBhcmFtcy5zYW1wbGVSYXRlKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9GTVRfRU5EOgorICAgICAgICBjYXNlIEVWRU5UX1JFU0VSVkVEOgorICAgICAgICBjYXNlIEVWRU5UX1VQUEVSX0JPVU5EOgorICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIndhcm5pbmc6IHVuZXhwZWN0ZWQgZXZlbnQgJWQiLCBpdC0+dHlwZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICghYm9keS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGRwcmludGYoZmQsICIlLipzJXMgJXNcbiIsIChpbnQpaW5kZW50LCAiIiwgdGltZXN0YW1wLnN0cmluZygpLCBib2R5LnN0cmluZygpKTsKKyAgICAgICAgICAgIGJvZHkuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICB0aW1lc3RhbXAuY2xlYXIoKTsKKyAgICB9Cit9CisKK0VudHJ5SXRlcmF0b3IgRHVtcFJlYWRlcjo6aGFuZGxlRm9ybWF0KGNvbnN0IEZvcm1hdEVudHJ5ICZmbXRFbnRyeSwKKyAgICAgICAgU3RyaW5nOCAqdGltZXN0YW1wLCBTdHJpbmc4ICpib2R5KQoreworICAgIC8vIGxvZyB0aW1lc3RhbXAKKyAgICBjb25zdCBpbnQ2NF90IHRzID0gZm10RW50cnkudGltZXN0YW1wKCk7CisgICAgdGltZXN0YW1wLT5jbGVhcigpOworICAgIHRpbWVzdGFtcC0+YXBwZW5kRm9ybWF0KCJbJWQuJTAzZF0iLCAoaW50KSAodHMgLyAoMTAwMCAqIDEwMDAgKiAxMDAwKSksCisgICAgICAgICAgICAgICAgICAgIChpbnQpICgodHMgLyAoMTAwMCAqIDEwMDApKSAlIDEwMDApKTsKKworICAgIC8vIGxvZyB1bmlxdWUgaGFzaAorICAgIGxvZ19oYXNoX3QgaGFzaCA9IGZtdEVudHJ5Lmhhc2goKTsKKyAgICAvLyBwcmludCBvbmx5IGxvd2VyIDE2Yml0IG9mIGhhc2ggYXMgaGV4IGFuZCBsaW5lIGFzIGludCB0byByZWR1Y2Ugc3BhbSBpbiB0aGUgbG9nCisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLjRYLSVkICIsIChpbnQpKGhhc2ggPj4gMTYpICYgMHhGRkZGLCAoaW50KSBoYXNoICYgMHhGRkZGKTsKKworICAgIC8vIGxvZyBhdXRob3IgKGlmIHByZXNlbnQpCisgICAgaGFuZGxlQXV0aG9yKGZtdEVudHJ5LCBib2R5KTsKKworICAgIC8vIGxvZyBzdHJpbmcKKyAgICBFbnRyeUl0ZXJhdG9yIGFyZyA9IGZtdEVudHJ5LmFyZ3MoKTsKKworICAgIGNvbnN0IGNoYXIqIGZtdCA9IGZtdEVudHJ5LmZvcm1hdFN0cmluZygpOworICAgIHNpemVfdCBmbXRfbGVuZ3RoID0gZm10RW50cnkuZm9ybWF0U3RyaW5nTGVuZ3RoKCk7CisKKyAgICBmb3IgKHNpemVfdCBmbXRfb2Zmc2V0ID0gMDsgZm10X29mZnNldCA8IGZtdF9sZW5ndGg7ICsrZm10X29mZnNldCkgeworICAgICAgICBpZiAoZm10W2ZtdF9vZmZzZXRdICE9ICclJykgeworICAgICAgICAgICAgYm9keS0+YXBwZW5kKCZmbXRbZm10X29mZnNldF0sIDEpOyAvLyBUT0RPIG9wdGltaXplIHRvIHdyaXRlIGNvbnNlY3V0aXZlIHN0cmluZ3MgYXQgb25jZQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2FzZSAiJSUiIgorICAgICAgICBpZiAoZm10WysrZm10X29mZnNldF0gPT0gJyUnKSB7CisgICAgICAgICAgICBib2R5LT5hcHBlbmQoIiUiKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIGNhc2UgIiVcMCIKKyAgICAgICAgaWYgKGZtdF9vZmZzZXQgPT0gZm10X2xlbmd0aCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBFdmVudCBldmVudCA9IChFdmVudCkgYXJnLT50eXBlOworICAgICAgICBzaXplX3QgbGVuZ3RoID0gYXJnLT5sZW5ndGg7CisKKyAgICAgICAgLy8gVE9ETyBjaGVjayBsZW5ndGggZm9yIGV2ZW50IHR5cGUgaXMgY29ycmVjdAorCisgICAgICAgIGlmIChldmVudCA9PSBFVkVOVF9GTVRfRU5EKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCBtb3JlIGNvbXBsZXggZm9ybWF0dGluZyBzdWNoIGFzICUuM2YKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0dW0gPSBhcmctPmRhdGE7IC8vIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZXZlbnQgYXJncworICAgICAgICBzd2l0Y2goZm10W2ZtdF9vZmZzZXRdKQorICAgICAgICB7CisgICAgICAgIGNhc2UgJ3MnOiAvLyBzdHJpbmcKKyAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX0ZNVF9TVFJJTkcsCisgICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIHN0cmluZyBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOworICAgICAgICAgICAgYm9keS0+YXBwZW5kKChjb25zdCBjaGFyKikgZGF0dW0sIGxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICd0JzogLy8gdGltZXN0YW1wCisgICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9GTVRfVElNRVNUQU1QLAorICAgICAgICAgICAgICAgICJOQkxvZyBSZWFkZXIgaW5jb21wYXRpYmxlIGV2ZW50IGZvciB0aW1lc3RhbXAgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKKyAgICAgICAgICAgIGFwcGVuZFRpbWVzdGFtcChib2R5LCBkYXR1bSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdkJzogLy8gaW50ZWdlcgorICAgICAgICAgICAgQUxPR1dfSUYoZXZlbnQgIT0gRVZFTlRfRk1UX0lOVEVHRVIsCisgICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIGludGVnZXIgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKKyAgICAgICAgICAgIGFwcGVuZEludChib2R5LCBkYXR1bSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdmJzogLy8gZmxvYXQKKyAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX0ZNVF9GTE9BVCwKKyAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3IgZmxvYXQgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKKyAgICAgICAgICAgIGFwcGVuZEZsb2F0KGJvZHksIGRhdHVtKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3AnOiAvLyBwaWQKKyAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX0ZNVF9QSUQsCisgICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIHBpZCBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOworICAgICAgICAgICAgYXBwZW5kUElEKGJvZHksIGRhdHVtLCBsZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJOQkxvZyBSZWFkZXIgZW5jb3VudGVyZWQgdW5rbm93biBjaGFyYWN0ZXIgJWMiLCBmbXRbZm10X29mZnNldF0pOworICAgICAgICB9CisgICAgICAgICsrYXJnOworICAgIH0KKyAgICBBTE9HV19JRihhcmctPnR5cGUgIT0gRVZFTlRfRk1UX0VORCwgIkV4cGVjdGVkIGVuZCBvZiBmb3JtYXQsIGdvdCAlZCIsIGFyZy0+dHlwZSk7CisgICAgcmV0dXJuIGFyZzsKK30KKwordm9pZCBEdW1wUmVhZGVyOjphcHBlbmRJbnQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSkKK3sKKyAgICBpZiAoYm9keSA9PSBudWxscHRyIHx8IGRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vaW50IHggPSAqKChpbnQqKSBkYXRhKTsKKyAgICBpbnQgeDsKKyAgICBtZW1jcHkoJngsIGRhdGEsIHNpemVvZih4KSk7CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCI8JWQ+IiwgeCk7Cit9CisKK3ZvaWQgRHVtcFJlYWRlcjo6YXBwZW5kRmxvYXQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSkKK3sKKyAgICBpZiAoYm9keSA9PSBudWxscHRyIHx8IGRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZsb2F0IGY7CisgICAgbWVtY3B5KCZmLCBkYXRhLCBzaXplb2YoZikpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiPCVmPiIsIGYpOworfQorCit2b2lkIER1bXBSZWFkZXI6OmFwcGVuZFBJRChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3QgbGVuZ3RoKQoreworICAgIGlmIChib2R5ID09IG51bGxwdHIgfHwgZGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcGlkX3QgaWQgPSAqKChwaWRfdCopIGRhdGEpOworICAgIGNoYXIgKiBuYW1lID0gJigoY2hhciopIGRhdGEpW3NpemVvZihwaWRfdCldOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiPFBJRDogJWQsIG5hbWU6ICUuKnM+IiwgaWQsIChpbnQpIChsZW5ndGggLSBzaXplb2YocGlkX3QpKSwgbmFtZSk7Cit9CisKK3ZvaWQgRHVtcFJlYWRlcjo6YXBwZW5kVGltZXN0YW1wKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpCit7CisgICAgaWYgKGJvZHkgPT0gbnVsbHB0ciB8fCBkYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQ2NF90IHRzOworICAgIG1lbWNweSgmdHMsIGRhdGEsIHNpemVvZih0cykpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiWyVkLiUwM2RdIiwgKGludCkgKHRzIC8gKDEwMDAgKiAxMDAwICogMTAwMCkpLAorICAgICAgICAgICAgICAgICAgICAoaW50KSAoKHRzIC8gKDEwMDAgKiAxMDAwKSkgJSAxMDAwKSk7Cit9CisKK1N0cmluZzggRHVtcFJlYWRlcjo6YnVmZmVyRHVtcChjb25zdCB1aW50OF90ICpidWZmZXIsIHNpemVfdCBzaXplKQoreworICAgIFN0cmluZzggc3RyOworICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gc3RyOworICAgIH0KKyAgICBzdHIuYXBwZW5kKCJbICIpOworICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgc3RyLmFwcGVuZEZvcm1hdCgiJWQgIiwgYnVmZmVyW2ldKTsKKyAgICB9CisgICAgc3RyLmFwcGVuZCgiXSIpOworICAgIHJldHVybiBzdHI7Cit9CisKK1N0cmluZzggRHVtcFJlYWRlcjo6YnVmZmVyRHVtcChjb25zdCBFbnRyeUl0ZXJhdG9yICZpdCkKK3sKKyAgICByZXR1cm4gYnVmZmVyRHVtcChpdCwgaXQtPmxlbmd0aCArIEVudHJ5OjprT3ZlcmhlYWQpOworfQorCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmNwcCBiL21lZGlhL2xpYm5ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmNwcAppbmRleCA4MjdlNzMxLi5mNjMyZTQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5jcHAKKysrIGIvbWVkaWEvbGlibmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuY3BwCkBAIC0xNSw5ICsxNSwxMSBAQAogICovCiAKICNkZWZpbmUgTE9HX1RBRyAiUmVwb3J0UGVyZm9ybWFuY2UiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKICNpbmNsdWRlIDxmc3RyZWFtPgogI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxxdWV1ZT4KICNpbmNsdWRlIDxzdGRhcmcuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KQEAgLTI3LDIzICsyOSwxOTUgQEAKICNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSA8bWVkaWEvbmJsb2cvTkJMb2cuaD4KKyNpbmNsdWRlIDxqc29uL2pzb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FdmVudHMuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlIHsKIAorc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxKc29uOjpWYWx1ZT4gZHVtcFRvSnNvbihjb25zdCBQZXJmb3JtYW5jZURhdGEmIGRhdGEpCit7CisgICAgc3RkOjp1bmlxdWVfcHRyPEpzb246OlZhbHVlPiByb290UHRyID0gc3RkOjptYWtlX3VuaXF1ZTxKc29uOjpWYWx1ZT4oSnNvbjo6b2JqZWN0VmFsdWUpOworICAgIEpzb246OlZhbHVlJiByb290ID0gKnJvb3RQdHI7CisgICAgcm9vdFsiaW9IYW5kbGUiXSA9IGRhdGEudGhyZWFkSW5mby5pZDsKKyAgICByb290WyJ0eXBlIl0gPSBOQkxvZzo6dGhyZWFkVHlwZVRvU3RyaW5nKGRhdGEudGhyZWFkSW5mby50eXBlKTsKKyAgICByb290WyJmcmFtZUNvdW50Il0gPSAoSnNvbjo6VmFsdWU6OkludClkYXRhLnRocmVhZFBhcmFtcy5mcmFtZUNvdW50OworICAgIHJvb3RbInNhbXBsZVJhdGUiXSA9IChKc29uOjpWYWx1ZTo6SW50KWRhdGEudGhyZWFkUGFyYW1zLnNhbXBsZVJhdGU7CisgICAgcm9vdFsid29ya01zSGlzdCJdID0gZGF0YS53b3JrSGlzdC50b1N0cmluZygpOworICAgIHJvb3RbImxhdGVuY3lNc0hpc3QiXSA9IGRhdGEubGF0ZW5jeUhpc3QudG9TdHJpbmcoKTsKKyAgICByb290WyJ3YXJtdXBNc0hpc3QiXSA9IGRhdGEud2FybXVwSGlzdC50b1N0cmluZygpOworICAgIHJvb3RbInVuZGVycnVucyJdID0gKEpzb246OlZhbHVlOjpJbnQ2NClkYXRhLnVuZGVycnVuczsKKyAgICByb290WyJvdmVycnVucyJdID0gKEpzb246OlZhbHVlOjpJbnQ2NClkYXRhLm92ZXJydW5zOworICAgIHJvb3RbImFjdGl2ZU1zIl0gPSAoSnNvbjo6VmFsdWU6OkludDY0KW5zMm1zKGRhdGEuYWN0aXZlKTsKKyAgICByb290WyJkdXJhdGlvbk1zIl0gPSAoSnNvbjo6VmFsdWU6OkludDY0KW5zMm1zKHN5c3RlbVRpbWUoKSAtIGRhdGEuc3RhcnQpOworICAgIHJldHVybiByb290UHRyOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgZHVtcEhpc3RvZ3JhbXNUb1N0cmluZyhjb25zdCBQZXJmb3JtYW5jZURhdGEmIGRhdGEpCit7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgc3MgPDwgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIjsKKyAgICBzcyA8PCAiVGhyZWFkIHR5cGU9IiA8PCBOQkxvZzo6dGhyZWFkVHlwZVRvU3RyaW5nKGRhdGEudGhyZWFkSW5mby50eXBlKQorICAgICAgICAgICAgPDwgIiBoYW5kbGU9IiA8PCBkYXRhLnRocmVhZEluZm8uaWQKKyAgICAgICAgICAgIDw8ICIgc2FtcGxlUmF0ZT0iIDw8IGRhdGEudGhyZWFkUGFyYW1zLnNhbXBsZVJhdGUKKyAgICAgICAgICAgIDw8ICIgZnJhbWVDb3VudD0iIDw8IGRhdGEudGhyZWFkUGFyYW1zLmZyYW1lQ291bnQgPDwgIlxuIjsKKyAgICBzcyA8PCAiICBUaHJlYWQgd29yayB0aW1lcyBpbiBtczpcbiIgPDwgZGF0YS53b3JrSGlzdC5hc2NpaUFydFN0cmluZyg0IC8qaW5kZW50Ki8pOworICAgIHNzIDw8ICIgIFRocmVhZCBsYXRlbmNpZXMgaW4gbXM6XG4iIDw8IGRhdGEubGF0ZW5jeUhpc3QuYXNjaWlBcnRTdHJpbmcoNCAvKmluZGVudCovKTsKKyAgICBzcyA8PCAiICBUaHJlYWQgd2FybXVwIHRpbWVzIGluIG1zOlxuIiA8PCBkYXRhLndhcm11cEhpc3QuYXNjaWlBcnRTdHJpbmcoNCAvKmluZGVudCovKTsKKyAgICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK3ZvaWQgZHVtcEpzb24oaW50IGZkLCBjb25zdCBzdGQ6Om1hcDxpbnQsIFBlcmZvcm1hbmNlRGF0YT4mIHRocmVhZERhdGFNYXApCit7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgSnNvbjo6VmFsdWUgcm9vdChKc29uOjphcnJheVZhbHVlKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0ZW0gOiB0aHJlYWREYXRhTWFwKSB7CisgICAgICAgIGNvbnN0IFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZURhdGEmIGRhdGEgPSBpdGVtLnNlY29uZDsKKyAgICAgICAgLy8gU2tpcCB0aHJlYWRzIHRoYXQgZG8gbm90IGhhdmUgcGVyZm9ybWFuY2UgZGF0YSByZWNvcmRlZCB5ZXQuCisgICAgICAgIGlmIChkYXRhLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxKc29uOjpWYWx1ZT4gZGF0YUpzb24gPSBSZXBvcnRQZXJmb3JtYW5jZTo6ZHVtcFRvSnNvbihkYXRhKTsKKyAgICAgICAgaWYgKGRhdGFKc29uID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgICgqZGF0YUpzb24pWyJ0aHJlYWROdW0iXSA9IGl0ZW0uZmlyc3Q7CisgICAgICAgIHJvb3QuYXBwZW5kKCpkYXRhSnNvbik7CisgICAgfQorICAgIEpzb246OlN0eWxlZFdyaXRlciB3cml0ZXI7CisgICAgc3RkOjpzdHJpbmcgcm9vdFN0ciA9IHdyaXRlci53cml0ZShyb290KTsKKyAgICB3cml0ZShmZCwgcm9vdFN0ci5jX3N0cigpLCByb290U3RyLnNpemUoKSk7Cit9CisKK3ZvaWQgZHVtcFBsb3RzKGludCBmZCwgY29uc3Qgc3RkOjptYXA8aW50LCBQZXJmb3JtYW5jZURhdGE+JiB0aHJlYWREYXRhTWFwKQoreworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byAmaXRlbSA6IHRocmVhZERhdGFNYXApIHsKKyAgICAgICAgY29uc3QgUmVwb3J0UGVyZm9ybWFuY2U6OlBlcmZvcm1hbmNlRGF0YSYgZGF0YSA9IGl0ZW0uc2Vjb25kOworICAgICAgICBpZiAoZGF0YS5lbXB0eSgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnN0cmluZyBoaXN0cyA9IFJlcG9ydFBlcmZvcm1hbmNlOjpkdW1wSGlzdG9ncmFtc1RvU3RyaW5nKGRhdGEpOworICAgICAgICB3cml0ZShmZCwgaGlzdHMuY19zdHIoKSwgaGlzdHMuc2l6ZSgpKTsKKyAgICB9Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBkdW1wUmV0cm9TdHJpbmcoY29uc3QgUGVyZm9ybWFuY2VEYXRhJiBkYXRhLCBpbnQ2NF90IG5vdykKK3sKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICBzcyA8PCBOQkxvZzo6dGhyZWFkVHlwZVRvU3RyaW5nKGRhdGEudGhyZWFkSW5mby50eXBlKSA8PCAiLCIgPDwgZGF0YS50aHJlYWRJbmZvLmlkIDw8ICJcbiI7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVtIDogZGF0YS5zbmFwc2hvdHMpIHsKKyAgICAgICAgLy8gVE9ETyB1c2UgYW4gZW51bSB0byBzdHJpbmcgY29udmVyc2lvbiBtZXRob2QuIE9uZSBnb29kIGlkZWE6CisgICAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMzgxNTcKKyAgICAgICAgaWYgKGl0ZW0uZmlyc3QgPT0gTkJMb2c6OkVWRU5UX1VOREVSUlVOKSB7CisgICAgICAgICAgICBzcyA8PCAiRVZFTlRfVU5ERVJSVU4sIjsKKyAgICAgICAgfSBlbHNlIGlmIChpdGVtLmZpcnN0ID09IE5CTG9nOjpFVkVOVF9PVkVSUlVOKSB7CisgICAgICAgICAgICBzcyA8PCAiRVZFTlRfT1ZFUlJVTiwiOworICAgICAgICB9CisgICAgICAgIHNzIDw8IG5vdyAtIGl0ZW0uc2Vjb25kIDw8ICJcbiI7CisgICAgfQorICAgIHNzIDw8ICJcbiI7CisgICAgcmV0dXJuIHNzLnN0cigpOworfQorCit2b2lkIGR1bXBSZXRybyhpbnQgZmQsIGNvbnN0IHN0ZDo6bWFwPGludCwgUGVyZm9ybWFuY2VEYXRhPiYgdGhyZWFkRGF0YU1hcCkKK3sKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZW0gOiB0aHJlYWREYXRhTWFwKSB7CisgICAgICAgIGNvbnN0IFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZURhdGEmIGRhdGEgPSBpdGVtLnNlY29uZDsKKyAgICAgICAgaWYgKGRhdGEuc25hcHNob3RzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHJldHJvU3RyID0gZHVtcFJldHJvU3RyaW5nKGRhdGEsIG5vdyk7CisgICAgICAgIHdyaXRlKGZkLCByZXRyb1N0ci5jX3N0cigpLCByZXRyb1N0ci5zaXplKCkpOworICAgIH0KK30KKworYm9vbCBzZW5kVG9NZWRpYU1ldHJpY3MoY29uc3QgUGVyZm9ybWFuY2VEYXRhJiBkYXRhKQoreworICAgIC8vIFNlZSBkb2N1bWVudGF0aW9uIGZvciB0aGVzZSBtZXRyaWNzIGhlcmU6CisgICAgLy8gZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMTEtLTZkeU9YVk9wYWNZUUxaaWFPWTVRVnRRalV5cU54MnpUOWNDekxLWUUvZWRpdD91c3A9c2hhcmluZworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrVGhyZWFkVHlwZVtdID0gImFuZHJvaWQubWVkaWEuYXVkaW90aHJlYWQudHlwZSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtUaHJlYWRGcmFtZUNvdW50W10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC5mcmFtZWNvdW50IjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZFNhbXBsZVJhdGVbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLnNhbXBsZXJhdGUiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrVGhyZWFkV29ya0hpc3RbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLndvcmtNcy5oaXN0IjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZExhdGVuY3lIaXN0W10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC5sYXRlbmN5TXMuaGlzdCI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtUaHJlYWRXYXJtdXBIaXN0W10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC53YXJtdXBNcy5oaXN0IjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZFVuZGVycnVuc1tdID0gImFuZHJvaWQubWVkaWEuYXVkaW90aHJlYWQudW5kZXJydW5zIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZE92ZXJydW5zW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC5vdmVycnVucyI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtUaHJlYWRBY3RpdmVbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLmFjdGl2ZU1zIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZER1cmF0aW9uW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC5kdXJhdGlvbk1zIjsKKworICAgIC8vIEN1cnJlbnRseSwgd2Ugb25seSBhbGxvdyBGYXN0TWl4ZXIgdGhyZWFkIGRhdGEgdG8gYmUgc2VudCB0byBNZWRpYSBNZXRyaWNzLgorICAgIGlmIChkYXRhLnRocmVhZEluZm8udHlwZSAhPSBOQkxvZzo6RkFTVE1JWEVSKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFBbmFseXRpY3NJdGVtPiBpdGVtKG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oImF1ZGlvdGhyZWFkIikpOworCisgICAgY29uc3QgSGlzdG9ncmFtICZ3b3JrSGlzdCA9IGRhdGEud29ya0hpc3Q7CisgICAgaWYgKHdvcmtIaXN0LnRvdGFsQ291bnQoKSA+IDApIHsKKyAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrVGhyZWFkV29ya0hpc3QsIHdvcmtIaXN0LnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgfQorCisgICAgY29uc3QgSGlzdG9ncmFtICZsYXRlbmN5SGlzdCA9IGRhdGEubGF0ZW5jeUhpc3Q7CisgICAgaWYgKGxhdGVuY3lIaXN0LnRvdGFsQ291bnQoKSA+IDApIHsKKyAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrVGhyZWFkTGF0ZW5jeUhpc3QsIGxhdGVuY3lIaXN0LnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgfQorCisgICAgY29uc3QgSGlzdG9ncmFtICZ3YXJtdXBIaXN0ID0gZGF0YS53YXJtdXBIaXN0OworICAgIGlmICh3YXJtdXBIaXN0LnRvdGFsQ291bnQoKSA+IDApIHsKKyAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrVGhyZWFkV2FybXVwSGlzdCwgd2FybXVwSGlzdC50b1N0cmluZygpLmNfc3RyKCkpOworICAgIH0KKworICAgIGlmIChkYXRhLnVuZGVycnVucyA+IDApIHsKKyAgICAgICAgaXRlbS0+c2V0SW50NjQoa1RocmVhZFVuZGVycnVucywgZGF0YS51bmRlcnJ1bnMpOworICAgIH0KKworICAgIGlmIChkYXRhLm92ZXJydW5zID4gMCkgeworICAgICAgICBpdGVtLT5zZXRJbnQ2NChrVGhyZWFkT3ZlcnJ1bnMsIGRhdGEub3ZlcnJ1bnMpOworICAgIH0KKworICAgIC8vIFNlbmQgdG8gTWVkaWEgTWV0cmljcyBpZiB0aGUgcmVjb3JkIGlzIG5vdCBlbXB0eS4KKyAgICAvLyBUaGUgdGhyZWFkIGFuZCB0aW1lIGluZm8gYXJlIGFkZGVkIGluc2lkZSB0aGUgaWYgc3RhdGVtZW50IGJlY2F1c2UKKyAgICAvLyB3ZSB3YW50IHRvIHNlbmQgdGhlbSBvbmx5IGlmIHRoZXJlIGFyZSBwZXJmb3JtYW5jZSBtZXRyaWNzIHRvIHNlbmQuCisgICAgaWYgKGl0ZW0tPmNvdW50KCkgPiAwKSB7CisgICAgICAgIC8vIEFkZCB0aHJlYWQgaW5mbyBmaWVsZHMuCisgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCB0eXBlU3RyaW5nID0gTkJMb2c6OnRocmVhZFR5cGVUb1N0cmluZyhkYXRhLnRocmVhZEluZm8udHlwZSk7CisgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa1RocmVhZFR5cGUsIHR5cGVTdHJpbmcpOworICAgICAgICBpdGVtLT5zZXRJbnQzMihrVGhyZWFkRnJhbWVDb3VudCwgZGF0YS50aHJlYWRQYXJhbXMuZnJhbWVDb3VudCk7CisgICAgICAgIGl0ZW0tPnNldEludDMyKGtUaHJlYWRTYW1wbGVSYXRlLCBkYXRhLnRocmVhZFBhcmFtcy5zYW1wbGVSYXRlKTsKKyAgICAgICAgLy8gQWRkIHRpbWUgaW5mbyBmaWVsZHMuCisgICAgICAgIGl0ZW0tPnNldEludDY0KGtUaHJlYWRBY3RpdmUsIGRhdGEuYWN0aXZlIC8gMTAwMDAwMCk7CisgICAgICAgIGl0ZW0tPnNldEludDY0KGtUaHJlYWREdXJhdGlvbiwgKHN5c3RlbVRpbWUoKSAtIGRhdGEuc3RhcnQpIC8gMTAwMDAwMCk7CisgICAgICAgIHJldHVybiBpdGVtLT5zZWxmcmVjb3JkKCk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLy8gVE9ETzogdXNlIGEgZnVuY3Rpb24gbGlrZSB0aGlzIHRvIGV4dHJhY3QgbG9naWMgZnJvbSB3cml0ZVRvRmlsZQogLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzkyNzk2MjAKIAogLy8gV3JpdGVzIG91dGxpZXIgaW50ZXJ2YWxzLCB0aW1lc3RhbXBzLCBhbmQgaGlzdG9ncmFtcyBzcGFubmluZyBsb25nIHRpbWUgaW50ZXJ2YWxzIHRvIGZpbGUuCiAvLyBUT0RPOiB3cml0ZSBkYXRhIGluIGJpbmFyeSBmb3JtYXQKLXZvaWQgd3JpdGVUb0ZpbGUoY29uc3Qgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dGltZXN0YW1wLCBIaXN0b2dyYW0+PiAmaGlzdHMsCit2b2lkIHdyaXRlVG9GaWxlKGNvbnN0IHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdD4+ICZoaXN0cywKICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8bXNJbnRlcnZhbCwgdGltZXN0YW1wPj4gJm91dGxpZXJEYXRhLAogICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmRlcXVlPHRpbWVzdGFtcD4gJnBlYWtUaW1lc3RhbXBzLAogICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogZGlyZWN0b3J5LCBib29sIGFwcGVuZCwgaW50IGF1dGhvciwgbG9nX2hhc2hfdCBoYXNoKSB7CkBAIC0xMjgsNiArMzAyLDUgQEAKICAgICBwZnMuY2xvc2UoKTsKIH0KIAotfSAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKLQorfSAgIC8vIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZQogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9UaW1lbGluZS5jcHAgYi9tZWRpYS9saWJuYmxvZy9UaW1lbGluZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA5YjAzYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL1RpbWVsaW5lLmNwcApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcm91bmR1cC5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1RpbWVsaW5lLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBOQkxvZyB7CisKKyNpZiAwICAgLy8gRklYTUUgc2VlIG5vdGUgaW4gVGltZWxpbmUuaAorTkJMb2c6OlRpbWVsaW5lOjpUaW1lbGluZShzaXplX3Qgc2l6ZSwgdm9pZCAqc2hhcmVkKQorICAgIDogbVNpemUocm91bmR1cChzaXplKSksIG1Pd24oc2hhcmVkID09IE5VTEwpLAorICAgICAgbVNoYXJlZCgoU2hhcmVkICopIChtT3duID8gbmV3IGNoYXJbc2hhcmVkU2l6ZShzaXplKV0gOiBzaGFyZWQpKQoreworICAgIG5ldyAobVNoYXJlZCkgU2hhcmVkOworfQorCitOQkxvZzo6VGltZWxpbmU6On5UaW1lbGluZSgpCit7CisgICAgbVNoYXJlZC0+flNoYXJlZCgpOworICAgIGlmIChtT3duKSB7CisgICAgICAgIGRlbGV0ZVtdIChjaGFyICopIG1TaGFyZWQ7CisgICAgfQorfQorI2VuZGlmCisKKy8qc3RhdGljKi8KK3NpemVfdCBUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplX3Qgc2l6ZSkKK3sKKyAgICAvLyBUT0RPIGZpZm8gbm93IHN1cHBvcnRzIG5vbi1wb3dlci1vZi0yIGJ1ZmZlciBzaXplcywgc28gY291bGQgcmVtb3ZlIHRoZSByb3VuZHVwCisgICAgcmV0dXJuIHNpemVvZihTaGFyZWQpICsgcm91bmR1cChzaXplKTsKK30KKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9Xcml0ZXIuY3BwIGIvbWVkaWEvbGlibmJsb2cvV3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTNiZDUyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvV3JpdGVyLmNwcApAQCAtMCwwICsxLDMyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTkJMb2ciCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm8uaD4KKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0VudHJ5Lmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRXZlbnRzLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvVGltZWxpbmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9Xcml0ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgTkJMb2cgeworCitXcml0ZXI6OldyaXRlcih2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKQorICAgIDogbVNoYXJlZCgoU2hhcmVkICopIHNoYXJlZCksCisgICAgICBtRmlmbyhtU2hhcmVkICE9IE5VTEwgPworICAgICAgICBuZXcgYXVkaW9fdXRpbHNfZmlmbyhzaXplLCBzaXplb2YodWludDhfdCksCisgICAgICAgICAgICBtU2hhcmVkLT5tQnVmZmVyLCBtU2hhcmVkLT5tUmVhciwgTlVMTCAvKnRocm90dGxlc0Zyb250Ki8pIDogTlVMTCksCisgICAgICBtRmlmb1dyaXRlcihtRmlmbyAhPSBOVUxMID8gbmV3IGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyKCptRmlmbykgOiBOVUxMKSwKKyAgICAgIG1FbmFibGVkKG1GaWZvV3JpdGVyICE9IE5VTEwpCit7CisgICAgLy8gY2FjaGluZyBwaWQgYW5kIHByb2Nlc3MgbmFtZQorICAgIHBpZF90IGlkID0gOjpnZXRwaWQoKTsKKyAgICBjaGFyIHByb2NOYW1lWzE2XTsKKyAgICBpbnQgc3RhdHVzID0gcHJjdGwoUFJfR0VUX05BTUUsIHByb2NOYW1lKTsKKyAgICBpZiAoc3RhdHVzKSB7ICAvLyBlcnJvciBnZXR0aW5nIHByb2Nlc3MgbmFtZQorICAgICAgICBwcm9jTmFtZVswXSA9ICdcMCc7CisgICAgfQorICAgIHNpemVfdCBsZW5ndGggPSBzdHJsZW4ocHJvY05hbWUpOworICAgIG1QaWRUYWdTaXplID0gbGVuZ3RoICsgc2l6ZW9mKHBpZF90KTsKKyAgICBtUGlkVGFnID0gbmV3IGNoYXJbbVBpZFRhZ1NpemVdOworICAgIG1lbWNweShtUGlkVGFnLCAmaWQsIHNpemVvZihwaWRfdCkpOworICAgIG1lbWNweShtUGlkVGFnICsgc2l6ZW9mKHBpZF90KSwgcHJvY05hbWUsIGxlbmd0aCk7Cit9CisKK1dyaXRlcjo6V3JpdGVyKGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5LCBzaXplX3Qgc2l6ZSkKKyAgICA6IFdyaXRlcihpTWVtb3J5ICE9IDAgPyAoU2hhcmVkICopIGlNZW1vcnktPnBvaW50ZXIoKSA6IE5VTEwsIHNpemUpCit7CisgICAgbUlNZW1vcnkgPSBpTWVtb3J5OworfQorCitXcml0ZXI6On5Xcml0ZXIoKQoreworICAgIGRlbGV0ZSBtRmlmb1dyaXRlcjsKKyAgICBkZWxldGUgbUZpZm87CisgICAgZGVsZXRlW10gbVBpZFRhZzsKK30KKwordm9pZCBXcml0ZXI6OmxvZyhjb25zdCBjaGFyICpzdHJpbmcpCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RyaW5nID09IE5VTEwsICJBdHRlbXB0ZWQgdG8gbG9nIE5VTEwgc3RyaW5nIik7CisgICAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbihzdHJpbmcpOworICAgIGlmIChsZW5ndGggPiBFbnRyeTo6a01heExlbmd0aCkgeworICAgICAgICBsZW5ndGggPSBFbnRyeTo6a01heExlbmd0aDsKKyAgICB9CisgICAgbG9nKEVWRU5UX1NUUklORywgc3RyaW5nLCBsZW5ndGgpOworfQorCit2b2lkIFdyaXRlcjo6bG9nZihjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydChhcCwgZm10KTsKKyAgICBXcml0ZXI6OmxvZ3ZmKGZtdCwgYXApOyAgICAgLy8gdGhlIFdyaXRlcjo6IGlzIG5lZWRlZCB0byBhdm9pZCB2aXJ0dWFsIGRpc3BhdGNoIGZvciBMb2NrZWRXcml0ZXIKKyAgICB2YV9lbmQoYXApOworfQorCit2b2lkIFdyaXRlcjo6bG9nVGltZXN0YW1wKCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RydWN0IHRpbWVzcGVjIHRzOworICAgIGlmICghY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0cykpIHsKKyAgICAgICAgbG9nKEVWRU5UX1RJTUVTVEFNUCwgJnRzLCBzaXplb2YodHMpKTsKKyAgICB9Cit9CisKK3ZvaWQgV3JpdGVyOjpsb2dGb3JtYXQoY29uc3QgY2hhciAqZm10LCBsb2dfaGFzaF90IGhhc2gsIC4uLikKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydChhcCwgaGFzaCk7CisgICAgV3JpdGVyOjpsb2dWRm9ybWF0KGZtdCwgaGFzaCwgYXApOworICAgIHZhX2VuZChhcCk7Cit9CisKK3ZvaWQgV3JpdGVyOjpsb2dFdmVudEhpc3RUcyhFdmVudCBldmVudCwgbG9nX2hhc2hfdCBoYXNoKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBIaXN0VHNFbnRyeSBkYXRhOworICAgIGRhdGEuaGFzaCA9IGhhc2g7CisgICAgZGF0YS50cyA9IHN5c3RlbVRpbWUoKTsKKyAgICBpZiAoZGF0YS50cyA+IDApIHsKKyAgICAgICAgbG9nKGV2ZW50LCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCB0aW1lc3RhbXAiKTsKKyAgICB9Cit9CisKK2Jvb2wgV3JpdGVyOjppc0VuYWJsZWQoKSBjb25zdAoreworICAgIHJldHVybiBtRW5hYmxlZDsKK30KKworYm9vbCBXcml0ZXI6OnNldEVuYWJsZWQoYm9vbCBlbmFibGVkKQoreworICAgIGJvb2wgb2xkID0gbUVuYWJsZWQ7CisgICAgbUVuYWJsZWQgPSBlbmFibGVkICYmIG1TaGFyZWQgIT0gTlVMTDsKKyAgICByZXR1cm4gb2xkOworfQorCit2b2lkIFdyaXRlcjo6bG9nKGNvbnN0IEVudHJ5ICZldHIsIGJvb2wgdHJ1c3RlZCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCF0cnVzdGVkKSB7CisgICAgICAgIGxvZyhldHIubUV2ZW50LCBldHIubURhdGEsIGV0ci5tTGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjb25zdCBzaXplX3QgbmVlZCA9IGV0ci5tTGVuZ3RoICsgRW50cnk6OmtPdmVyaGVhZDsgLy8gbUV2ZW50LCBtTGVuZ3RoLCBkYXRhW21MZW5ndGhdLCBtTGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgPSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byBGSUZPCisKKyAgICAvLyBGSVhNRSBvcHRpbWl6ZSB0aGlzIHVzaW5nIG1lbWNweSBmb3IgdGhlIGRhdGEgcGFydCBvZiB0aGUgRW50cnkuCisgICAgLy8gVGhlIEVudHJ5IGNvdWxkIGhhdmUgYSBtZXRob2QgY29weVRvKHB0ciwgb2Zmc2V0LCBzaXplKSB0byBvcHRpbWl6ZSB0aGUgY29weS4KKyAgICAvLyBjaGVja3Mgc2l6ZSBvZiBhIHNpbmdsZSBsb2cgRW50cnk6IHR5cGUsIGxlbmd0aCwgZGF0YSBwb2ludGVyIGFuZCBlbmRpbmcKKyAgICB1aW50OF90IHRlbXBbRW50cnk6OmtNYXhMZW5ndGggKyBFbnRyeTo6a092ZXJoZWFkXTsKKyAgICAvLyB3cml0ZSB0aGlzIGRhdGEgdG8gdGVtcCBhcnJheQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmVlZDsgaSsrKSB7CisgICAgICAgIHRlbXBbaV0gPSBldHIuY29weUVudHJ5RGF0YUF0KGkpOworICAgIH0KKyAgICAvLyB3cml0ZSB0byBjaXJjdWxhciBidWZmZXIKKyAgICBtRmlmb1dyaXRlci0+d3JpdGUodGVtcCwgbmVlZCk7Cit9CisKK3ZvaWQgV3JpdGVyOjpsb2coRXZlbnQgZXZlbnQsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChkYXRhID09IE5VTEwgfHwgbGVuZ3RoID4gRW50cnk6OmtNYXhMZW5ndGgpIHsKKyAgICAgICAgLy8gVE9ETyBQZXJoYXBzIGl0IG1ha2VzIHNlbnNlIHRvIGRpc3BsYXkgdHJ1bmNhdGVkIGRhdGEgb3IgYXQgbGVhc3QgYQorICAgICAgICAvLyAgICAgIG1lc3NhZ2UgdGhhdCB0aGUgZGF0YSBpcyB0b28gbG9uZz8gIFRoZSBjdXJyZW50IGJlaGF2aW9yIGNhbiBjcmVhdGUKKyAgICAgICAgLy8gICAgICBhIGNvbmZ1c2lvbiBmb3IgYSBwcm9ncmFtbWVyIGRlYnVnZ2luZyB0aGVpciBjb2RlLgorICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIElnbm9yZSBpZiBpbnZhbGlkIGV2ZW50CisgICAgaWYgKGV2ZW50ID09IEVWRU5UX1JFU0VSVkVEIHx8IGV2ZW50ID49IEVWRU5UX1VQUEVSX0JPVU5EKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgRW50cnkgZXRyKGV2ZW50LCBkYXRhLCBsZW5ndGgpOworICAgIGxvZyhldHIsIHRydWUgLyp0cnVzdGVkKi8pOworfQorCit2b2lkIFdyaXRlcjo6bG9ndmYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjaGFyIGJ1ZmZlcltFbnRyeTo6a01heExlbmd0aCArIDEgLypOVUwqL107CisgICAgaW50IGxlbmd0aCA9IHZzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCBmbXQsIGFwKTsKKyAgICBpZiAobGVuZ3RoID49IChpbnQpIHNpemVvZihidWZmZXIpKSB7CisgICAgICAgIGxlbmd0aCA9IHNpemVvZihidWZmZXIpIC0gMTsKKyAgICAgICAgLy8gTlVMIHRlcm1pbmF0aW9uIGlzIG5vdCByZXF1aXJlZAorICAgICAgICAvLyBidWZmZXJbbGVuZ3RoXSA9ICdcMCc7CisgICAgfQorICAgIGlmIChsZW5ndGggPj0gMCkgeworICAgICAgICBsb2coRVZFTlRfU1RSSU5HLCBidWZmZXIsIGxlbmd0aCk7CisgICAgfQorfQorCit2b2lkIFdyaXRlcjo6bG9nU3RhcnQoY29uc3QgY2hhciAqZm10KQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzaXplX3QgbGVuZ3RoID0gc3RybGVuKGZtdCk7CisgICAgaWYgKGxlbmd0aCA+IEVudHJ5OjprTWF4TGVuZ3RoKSB7CisgICAgICAgIGxlbmd0aCA9IEVudHJ5OjprTWF4TGVuZ3RoOworICAgIH0KKyAgICBsb2coRVZFTlRfRk1UX1NUQVJULCBmbXQsIGxlbmd0aCk7Cit9CisKK3ZvaWQgV3JpdGVyOjpsb2dUaW1lc3RhbXBGb3JtYXQoKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjb25zdCBuc2Vjc190IHRzID0gc3lzdGVtVGltZSgpOworICAgIGlmICh0cyA+IDApIHsKKyAgICAgICAgbG9nKEVWRU5UX0ZNVF9USU1FU1RBTVAsICZ0cywgc2l6ZW9mKHRzKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgdGltZXN0YW1wIik7CisgICAgfQorfQorCit2b2lkIFdyaXRlcjo6bG9nVkZvcm1hdChjb25zdCBjaGFyICpmbXQsIGxvZ19oYXNoX3QgaGFzaCwgdmFfbGlzdCBhcmdwKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBXcml0ZXI6OmxvZ1N0YXJ0KGZtdCk7CisgICAgaW50IGk7CisgICAgZG91YmxlIGQ7CisgICAgZmxvYXQgZjsKKyAgICBjaGFyKiBzOworICAgIHNpemVfdCBsZW5ndGg7CisgICAgaW50NjRfdCB0OworICAgIFdyaXRlcjo6bG9nVGltZXN0YW1wRm9ybWF0KCk7CisgICAgbG9nKEVWRU5UX0ZNVF9IQVNILCAmaGFzaCwgc2l6ZW9mKGhhc2gpKTsKKyAgICBmb3IgKGNvbnN0IGNoYXIgKnAgPSBmbXQ7ICpwICE9ICdcMCc7IHArKykgeworICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgbW9yZSBjb21wbGV4IGZvcm1hdHRpbmcgc3VjaCBhcyAlLjNmCisgICAgICAgIGlmICgqcCAhPSAnJScpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCgqKytwKSB7CisgICAgICAgIGNhc2UgJ3MnOiAvLyBzdHJpbmcKKyAgICAgICAgICAgIHMgPSB2YV9hcmcoYXJncCwgY2hhciAqKTsKKyAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihzKTsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPiBFbnRyeTo6a01heExlbmd0aCkgeworICAgICAgICAgICAgICAgIGxlbmd0aCA9IEVudHJ5OjprTWF4TGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nKEVWRU5UX0ZNVF9TVFJJTkcsIHMsIGxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICd0JzogLy8gdGltZXN0YW1wCisgICAgICAgICAgICB0ID0gdmFfYXJnKGFyZ3AsIGludDY0X3QpOworICAgICAgICAgICAgbG9nKEVWRU5UX0ZNVF9USU1FU1RBTVAsICZ0LCBzaXplb2YodCkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnZCc6IC8vIGludGVnZXIKKyAgICAgICAgICAgIGkgPSB2YV9hcmcoYXJncCwgaW50KTsKKyAgICAgICAgICAgIGxvZyhFVkVOVF9GTVRfSU5URUdFUiwgJmksIHNpemVvZihpKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdmJzogLy8gZmxvYXQKKyAgICAgICAgICAgIGQgPSB2YV9hcmcoYXJncCwgZG91YmxlKTsgLy8gZmxvYXQgYXJndW1lbnRzIGFyZSBwcm9tb3RlZCB0byBkb3VibGUgaW4gdmFyYXJnIGxpc3RzCisgICAgICAgICAgICBmID0gKGZsb2F0KWQ7CisgICAgICAgICAgICBsb2coRVZFTlRfRk1UX0ZMT0FULCAmZiwgc2l6ZW9mKGYpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3AnOiAvLyBwaWQKKyAgICAgICAgICAgIGxvZyhFVkVOVF9GTVRfUElELCBtUGlkVGFnLCBtUGlkVGFnU2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvLyB0aGUgIiVcMCIgY2FzZSBmaW5pc2hlcyBwYXJzaW5nCisgICAgICAgIGNhc2UgJ1wwJzoKKyAgICAgICAgICAgIC0tcDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJyUnOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJOQkxvZyBXcml0ZXIgcGFyc2VkIGludmFsaWQgZm9ybWF0IHNwZWNpZmllcjogJWMiLCAqcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBFbnRyeSBldHIoRVZFTlRfRk1UX0VORCwgbnVsbHB0ciwgMCk7CisgICAgbG9nKGV0ciwgdHJ1ZSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMb2NrZWRXcml0ZXI6OkxvY2tlZFdyaXRlcih2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKQorICAgIDogV3JpdGVyKHNoYXJlZCwgc2l6ZSkKK3sKK30KKworYm9vbCBMb2NrZWRXcml0ZXI6OmlzRW5hYmxlZCgpIGNvbnN0Cit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gV3JpdGVyOjppc0VuYWJsZWQoKTsKK30KKworYm9vbCBMb2NrZWRXcml0ZXI6OnNldEVuYWJsZWQoYm9vbCBlbmFibGVkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIFdyaXRlcjo6c2V0RW5hYmxlZChlbmFibGVkKTsKK30KKwordm9pZCBMb2NrZWRXcml0ZXI6OmxvZyhjb25zdCBFbnRyeSAmZW50cnksIGJvb2wgdHJ1c3RlZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgV3JpdGVyOjpsb2coZW50cnksIHRydXN0ZWQpOworfQorCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvRW50cnkuaCBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvRW50cnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2YwMGI2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9FbnRyeS5oCkBAIC0wLDAgKzEsMjMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX05CTE9HX0VOVFJZX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9OQkxPR19FTlRSWV9ICisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FdmVudHMuaD4KKworY2xhc3MgYXVkaW9fdXRpbHNfZmlmb193cml0ZXI7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBOQkxvZyB7CisKKy8vIGVudHJ5IHJlcHJlc2VudGF0aW9uIGluIG1lbW9yeQorc3RydWN0IGVudHJ5IHsKKyAgICBjb25zdCB1aW50OF90IHR5cGU7CisgICAgY29uc3QgdWludDhfdCBsZW5ndGg7CisgICAgY29uc3QgdWludDhfdCBkYXRhWzBdOworfTsKKworLy8gZW50cnkgdGFpbCByZXByZXNlbnRhdGlvbiAoYWZ0ZXIgZGF0YSkKK3N0cnVjdCBlbmRpbmcgeworICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgIHVpbnQ4X3QgbmV4dFswXTsKK307CisKKy8vIHJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIGxvZyBlbnRyeSBpbiBzaGFyZWQgbWVtb3J5CisvLyAgYnl0ZVswXSAgICAgICAgICAgICBtRXZlbnQKKy8vICBieXRlWzFdICAgICAgICAgICAgIG1MZW5ndGgKKy8vICBieXRlWzJdICAgICAgICAgICAgIG1EYXRhWzBdCisvLyAgLi4uCisvLyAgYnl0ZVsyK2ldICAgICAgICAgICBtRGF0YVtpXQorLy8gIC4uLgorLy8gIGJ5dGVbMittTGVuZ3RoLTFdICAgbURhdGFbbUxlbmd0aC0xXQorLy8gIGJ5dGVbMittTGVuZ3RoXSAgICAgZHVwbGljYXRlIGNvcHkgb2YgbUxlbmd0aCB0byBwZXJtaXQgcmV2ZXJzZSBzY2FuCisvLyAgYnl0ZVszK21MZW5ndGhdICAgICBzdGFydCBvZiBuZXh0IGxvZyBlbnRyeQorY2xhc3MgRW50cnkgeworcHVibGljOgorICAgIEVudHJ5KEV2ZW50IGV2ZW50LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKQorICAgICAgICA6IG1FdmVudChldmVudCksIG1MZW5ndGgobGVuZ3RoKSwgbURhdGEoZGF0YSkge30KKyAgICB+RW50cnkoKSB7fQorCisgICAgLy8gdXNlZCBkdXJpbmcgd3JpdGluZyB0byBmb3JtYXQgRW50cnkgaW5mb3JtYXRpb24gYXMgZm9sbG93czoKKyAgICAvLyBbdHlwZV1bbGVuZ3RoXVtkYXRhIC4uLiBdW2xlbmd0aF0KKyAgICBpbnQgICAgIGNvcHlFbnRyeURhdGFBdChzaXplX3Qgb2Zmc2V0KSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgV3JpdGVyOworICAgIEV2ZW50ICAgICAgIG1FdmVudDsgICAgIC8vIGV2ZW50IHR5cGUKKyAgICB1aW50OF90ICAgICBtTGVuZ3RoOyAgICAvLyBsZW5ndGggb2YgYWRkaXRpb25hbCBkYXRhLCAwIDw9IG1MZW5ndGggPD0ga01heExlbmd0aAorICAgIGNvbnN0IHZvaWQgKm1EYXRhOyAgICAgIC8vIGV2ZW50IHR5cGUtc3BlY2lmaWMgZGF0YQorICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heExlbmd0aCA9IDI1NTsKK3B1YmxpYzoKKyAgICAvLyBtRXZlbnQsIG1MZW5ndGgsIG1EYXRhWy4uLl0sIGR1cGxpY2F0ZSBtTGVuZ3RoCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrT3ZlcmhlYWQgPSBzaXplb2YoZW50cnkpICsgc2l6ZW9mKGVuZGluZyk7CisgICAgLy8gZW5kaW5kIGxlbmd0aCBvZiBwcmV2aW91cyBlbnRyeQorICAgIHN0YXRpYyBjb25zdCBzc2l6ZV90IGtQcmV2aW91c0xlbmd0aE9mZnNldCA9IC0gc2l6ZW9mKGVuZGluZykgKworICAgICAgICBvZmZzZXRvZihlbmRpbmcsIGxlbmd0aCk7Cit9OworCisvLyBlbnRyeSBpdGVyYXRvcgorY2xhc3MgRW50cnlJdGVyYXRvciB7CitwdWJsaWM6CisgICAgLy8gVXNlZCBmb3IgZHVtbXkgaW5pdGlhbGl6YXRpb24uIFBlcmZvcm1pbmcgb3BlcmF0aW9ucyBvbiBhIGRlZmF1bHQtY29uc3RydWN0ZWQKKyAgICAvLyBFbnRyeUl0ZXJhdG9yIG90aGVyIHRoYW4gYXNzaWduaW5nIGl0IHRvIGFub3RoZXIgdmFsaWQgRW50cnlJdGVyYXRvcgorICAgIC8vIGlzIHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgICBFbnRyeUl0ZXJhdG9yKCk7CisgICAgLy8gQ2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIGVudHJ5IGlzIG5vdCBudWxscHRyLgorICAgIC8vIFBhc3NpbmcgaW4gbnVsbHB0ciBjYW4gcmVzdWx0IGluIHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgICBleHBsaWNpdCBFbnRyeUl0ZXJhdG9yKGNvbnN0IHVpbnQ4X3QgKmVudHJ5KTsKKyAgICBFbnRyeUl0ZXJhdG9yKGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKTsKKworICAgIC8vIGRlcmVmZXJlbmNlIHVuZGVybHlpbmcgZW50cnkKKyAgICBjb25zdCBlbnRyeSYgICAgb3BlcmF0b3IqKCkgY29uc3Q7CisgICAgY29uc3QgZW50cnkqICAgIG9wZXJhdG9yLT4oKSBjb25zdDsKKyAgICAvLyBhZHZhbmNlIHRvIG5leHQgZW50cnkKKyAgICBFbnRyeUl0ZXJhdG9yJiAgb3BlcmF0b3IrKygpOyAvLyArK2kKKyAgICAvLyBiYWNrIHRvIHByZXZpb3VzIGVudHJ5CisgICAgRW50cnlJdGVyYXRvciYgIG9wZXJhdG9yLS0oKTsgLy8gLS1pCisgICAgLy8gcmV0dXJucyBhbiBFbnRyeUl0ZXJhdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5leHQgZW50cnkKKyAgICBFbnRyeUl0ZXJhdG9yICAgbmV4dCgpIGNvbnN0OworICAgIC8vIHJldHVybnMgYW4gRW50cnlJdGVyYXRvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcmV2aW91cyBlbnRyeQorICAgIEVudHJ5SXRlcmF0b3IgICBwcmV2KCkgY29uc3Q7CisgICAgYm9vbCAgICAgICAgICAgIG9wZXJhdG9yIT0oY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0OworICAgIGludCAgICAgICAgICAgICBvcGVyYXRvci0oY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0OworCisgICAgYm9vbCAgICAgICAgICAgIGhhc0NvbnNpc3RlbnRMZW5ndGgoKSBjb25zdDsKKyAgICB2b2lkICAgICAgICAgICAgY29weVRvKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCkgY29uc3Q7CisgICAgdm9pZCAgICAgICAgICAgIGNvcHlEYXRhKHVpbnQ4X3QgKmRzdCkgY29uc3Q7CisKKyAgICAvLyBtZW1jcHkgcHJlZmVycmVkIHRvIHJlaW50ZXJwcmV0X2Nhc3QgdG8gYXZvaWQgcG90ZW50aWFsbHkgdW5zdXBwb3J0ZWQKKyAgICAvLyB1bmFsaWduZWQgbWVtb3J5IGFjY2Vzcy4KKyNpZiAwCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgY29uc3QgVCYgcGF5bG9hZCgpIHsKKyAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFQgKj4obVB0ciArIG9mZnNldG9mKGVudHJ5LCBkYXRhKSk7CisgICAgfQorI2Vsc2UKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBUIHBheWxvYWQoKSBjb25zdCB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc190cml2aWFsbHlfY29weWFibGU8VD46OnZhbHVlCisgICAgICAgICAgICAgICAgJiYgIXN0ZDo6aXNfcG9pbnRlcjxUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgIk5CTG9nOjpFbnRyeUl0ZXJhdG9yIHBheWxvYWQgbXVzdCBiZSB0cml2aWFsbHkgY29weWFibGUsIG5vbi1wb2ludGVyIHR5cGUuIik7CisgICAgICAgIFQgcGF5bG9hZDsKKyAgICAgICAgbWVtY3B5KCZwYXlsb2FkLCBtUHRyICsgb2Zmc2V0b2YoZW50cnksIGRhdGEpLCBzaXplb2YocGF5bG9hZCkpOworICAgICAgICByZXR1cm4gcGF5bG9hZDsKKyAgICB9CisjZW5kaWYKKworICAgIGlubGluZSBvcGVyYXRvciBjb25zdCB1aW50OF90KigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1QdHI7CisgICAgfQorCitwcml2YXRlOgorICAgIGNvbnN0IHVpbnQ4X3QgICptUHRyOyAgIC8vIFNob3VsZCBub3QgYmUgbnVsbHB0ciBleGNlcHQgZm9yIGR1bW15IGluaXRpYWxpemF0aW9uCit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoZSBmb2xsb3dpbmcgY2xhc3NlcyBhcmUgdXNlZCBmb3IgbWVyZ2luZyBpbnRvIHRoZSBNZXJnZXIncyBidWZmZXIuCisKK2NsYXNzIEFic3RyYWN0RW50cnkgeworcHVibGljOgorICAgIHZpcnR1YWwgfkFic3RyYWN0RW50cnkoKSB7fQorCisgICAgLy8gYnVpbGQgY29uY3JldGUgZW50cnkgb2YgYXBwcm9wcmlhdGUgY2xhc3MgZnJvbSBwdHIuCisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxBYnN0cmFjdEVudHJ5PiBidWlsZEVudHJ5KGNvbnN0IHVpbnQ4X3QgKnB0cik7CisKKyAgICAvLyBnZXQgZm9ybWF0IGVudHJ5IHRpbWVzdGFtcAorICAgIHZpcnR1YWwgaW50NjRfdCAgICAgICB0aW1lc3RhbXAoKSBjb25zdCA9IDA7CisKKyAgICAvLyBnZXQgZm9ybWF0IGVudHJ5J3MgdW5pcXVlIGlkCisgICAgdmlydHVhbCBsb2dfaGFzaF90ICAgIGhhc2goKSBjb25zdCA9IDA7CisKKyAgICAvLyBlbnRyeSdzIGF1dGhvciBpbmRleCAoLTEgaWYgbm9uZSBwcmVzZW50KQorICAgIC8vIGEgTWVyZ2VyIGhhcyBhIHZlY3RvciBvZiBSZWFkZXJzLCBhdXRob3Igc2ltcGx5IHBvaW50cyB0byB0aGUgaW5kZXggb2YgdGhlCisgICAgLy8gUmVhZGVyIHRoYXQgb3JpZ2luYXRlZCB0aGUgZW50cnkKKyAgICAvLyBUT0RPIGNvbnNpZGVyIGNoYW5naW5nIHRvIHVpbnQzMl90CisgICAgdmlydHVhbCBpbnQgICAgICAgICAgIGF1dGhvcigpIGNvbnN0ID0gMDsKKworICAgIC8vIGNvcHkgZW50cnksIGFkZGluZyBhdXRob3IgYmVmb3JlIHRpbWVzdGFtcCwgcmV0dXJucyBpdGVyYXRvciB0byBlbmQgb2YgZW50cnkKKyAgICB2aXJ0dWFsIEVudHJ5SXRlcmF0b3IgY29weVdpdGhBdXRob3Ioc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXV0aG9yKSBjb25zdCA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBFbnRyeSBzdGFydGluZyBpbiB0aGUgZ2l2ZW4gcG9pbnRlciwgd2hpY2ggc2hhbGwgbm90IGJlIG51bGxwdHIuCisgICAgZXhwbGljaXQgQWJzdHJhY3RFbnRyeShjb25zdCB1aW50OF90ICplbnRyeSkgOiBtRW50cnkoZW50cnkpIHt9CisgICAgLy8gY29waWVzIG9yZGluYXJ5IGVudHJ5IGZyb20gc3JjIHRvIGRzdCwgYW5kIHJldHVybnMgbGVuZ3RoIG9mIGVudHJ5CisgICAgLy8gc2l6ZV90ICAgICAgY29weUVudHJ5KGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyICpkc3QsIGNvbnN0IGl0ZXJhdG9yICZpdCk7CisgICAgY29uc3QgdWludDhfdCAqIGNvbnN0IG1FbnRyeTsKK307CisKKy8vIEFQSSBmb3IgaGFuZGxpbmcgZm9ybWF0IGVudHJ5IG9wZXJhdGlvbnMKKworLy8gYSBmb3JtYXR0ZWQgZW50cnkgaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgorLy8gICAgKiBGTVRfU1RBUlQgZW50cnksIGNvbnRhaW5pbmcgdGhlIGZvcm1hdCBzdHJpbmcKKy8vICAgICogVElNRVNUQU1QIGVudHJ5CisvLyAgICAqIEhBU0ggZW50cnkKKy8vICAgICogYXV0aG9yIGVudHJ5IG9mIHRoZSB0aHJlYWQgdGhhdCBnZW5lcmF0ZWQgaXQgKG9wdGlvbmFsLCBwcmVzZW50IGluIG1lcmdlZCBsb2cpCisvLyAgICAqIGZvcm1hdCBhcmcxCisvLyAgICAqIGZvcm1hdCBhcmcyCisvLyAgICAqIC4uLgorLy8gICAgKiBGTVRfRU5EIGVudHJ5CitjbGFzcyBGb3JtYXRFbnRyeSA6IHB1YmxpYyBBYnN0cmFjdEVudHJ5IHsKK3B1YmxpYzoKKyAgICAvLyBleHBsaWNpdCBGb3JtYXRFbnRyeShjb25zdCBFbnRyeUl0ZXJhdG9yICZpdCk7CisgICAgZXhwbGljaXQgRm9ybWF0RW50cnkoY29uc3QgdWludDhfdCAqcHRyKSA6IEFic3RyYWN0RW50cnkocHRyKSB7fQorICAgIH5Gb3JtYXRFbnRyeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIEVudHJ5SXRlcmF0b3IgYmVnaW4oKSBjb25zdDsKKworICAgIC8vIEVudHJ5J3MgZm9ybWF0IHN0cmluZworICAgIGNvbnN0IGNoYXIqICAgZm9ybWF0U3RyaW5nKCkgY29uc3Q7CisKKyAgICAvLyBFbnJ0eSdzIGZvcm1hdCBzdHJpbmcgbGVuZ3RoCisgICAgc2l6ZV90ICAgICAgICBmb3JtYXRTdHJpbmdMZW5ndGgoKSBjb25zdDsKKworICAgIC8vIEZvcm1hdCBhcmd1bWVudHMgKGV4Y2x1ZGluZyBmb3JtYXQgc3RyaW5nLCB0aW1lc3RhbXAgYW5kIGF1dGhvcikKKyAgICBFbnRyeUl0ZXJhdG9yIGFyZ3MoKSBjb25zdDsKKworICAgIC8vIGdldCBmb3JtYXQgZW50cnkgdGltZXN0YW1wCisgICAgaW50NjRfdCAgICAgICB0aW1lc3RhbXAoKSBjb25zdCBvdmVycmlkZTsKKworICAgIC8vIGdldCBmb3JtYXQgZW50cnkncyB1bmlxdWUgaWQKKyAgICBsb2dfaGFzaF90ICAgIGhhc2goKSBjb25zdCBvdmVycmlkZTsKKworICAgIC8vIGVudHJ5J3MgYXV0aG9yIGluZGV4ICgtMSBpZiBub25lIHByZXNlbnQpCisgICAgLy8gYSBNZXJnZXIgaGFzIGEgdmVjdG9yIG9mIFJlYWRlcnMsIGF1dGhvciBzaW1wbHkgcG9pbnRzIHRvIHRoZSBpbmRleCBvZiB0aGUKKyAgICAvLyBSZWFkZXIgdGhhdCBvcmlnaW5hdGVkIHRoZSBlbnRyeQorICAgIGludCAgICAgICAgICAgYXV0aG9yKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLyBjb3B5IGVudHJ5LCBhZGRpbmcgYXV0aG9yIGJlZm9yZSB0aW1lc3RhbXAsIHJldHVybnMgc2l6ZSBvZiBvcmlnaW5hbCBlbnRyeQorICAgIEVudHJ5SXRlcmF0b3IgY29weVdpdGhBdXRob3Ioc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1dGhvcikgY29uc3Qgb3ZlcnJpZGU7Cit9OworCitjbGFzcyBIaXN0b2dyYW1FbnRyeSA6IHB1YmxpYyBBYnN0cmFjdEVudHJ5IHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBIaXN0b2dyYW1FbnRyeShjb25zdCB1aW50OF90ICpwdHIpIDogQWJzdHJhY3RFbnRyeShwdHIpIHt9CisgICAgfkhpc3RvZ3JhbUVudHJ5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgaW50NjRfdCAgICAgICB0aW1lc3RhbXAoKSBjb25zdCBvdmVycmlkZTsKKworICAgIGxvZ19oYXNoX3QgICAgaGFzaCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgaW50ICAgICAgICAgICBhdXRob3IoKSBjb25zdCBvdmVycmlkZTsKKworICAgIEVudHJ5SXRlcmF0b3IgY29weVdpdGhBdXRob3Ioc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1dGhvcikgY29uc3Qgb3ZlcnJpZGU7Cit9OworCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX05CTE9HX0VOVFJZX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvRXZlbnRzLmggYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL0V2ZW50cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYTRmZTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL0V2ZW50cy5oCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX05CTE9HX0VWRU5UU19ICisjZGVmaW5lIEFORFJPSURfTUVESUFfTkJMT0dfRVZFTlRTX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgTkJMb2cgeworCisvLyBUT0RPIGhhdmUgYSBjb21tZW50IHNvbWV3aGVyZSBleHBsYWluaW5nIHRoZSB3aG9sZSBwcm9jZXNzIGZvciBhZGRpbmcgYSBuZXcgRVZFTlRfCisKKy8vIE5CTG9nIEV2ZW50IHR5cGVzLiBUaGUgRXZlbnRzIGFyZSBuYW1lZCB0byBwcm92aWRlIGNvbnRleHR1YWwgbWVhbmluZyBmb3Igd2hhdCBpcyBsb2dnZWQuCisvLyBJZiBhZGRpbmcgYSBuZXcgc3RhbmRhbG9uZSBFdmVudCBoZXJlLCB1cGRhdGUgdGhlIGV2ZW50LXRvLXR5cGUgbWFwcGluZyBieSBhZGRpbmcgYQorLy8gTUFQX0VWRU5UX1RPX1RZUEUgc3RhdGVtZW50IGJlbG93LgorLy8gWFhYIE5vdGUgdGhhdCBhcyBvZiB0aGUgY3VycmVudCBkZXNpZ24sIEV2ZW50cyBzaG91bGQgbm90IGJlIHJlbnVtYmVyZWQgKGkuZS4gcmVvcmRlcmVkKQorLy8gaWYgdGhleSBldmVyIGxlYXZlIG1lbW9yeSAoZm9yIGV4YW1wbGUsIHdyaXR0ZW4gdG8gZmlsZSwgdXBsb2FkZWQgdG8gY2xvdWQsIGV0Yy4pLgorLy8gVE9ETyBtYWtlIHNvbWUgc29ydCBvZiBpbnRlcmZhY2UgdG8ga2VlcCB0aGVzZSAiY29udHJhY3QiIGNvbnN0YW50cy4KK2VudW0gRXZlbnQgOiB1aW50OF90IHsKKyAgICBFVkVOVF9SRVNFUlZFRCwKKyAgICBFVkVOVF9TVFJJTkcsICAgICAgICAgICAgICAgLy8gQVNDSUkgc3RyaW5nLCBub3QgTlVMLXRlcm1pbmF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogbWFrZSB0aW1lc3RhbXAgb3B0aW9uYWwKKyAgICBFVkVOVF9USU1FU1RBTVAsICAgICAgICAgICAgLy8gY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMpCisKKyAgICAvLyBUeXBlcyBmb3IgRm9ybWF0IEVudHJ5LCBpLmUuIGZvcm1hdHRlZCBlbnRyeQorICAgIEVWRU5UX0ZNVF9TVEFSVCwgICAgICAgICAgICAvLyBsb2dGb3JtYXQgc3RhcnQgZXZlbnQ6IGVudHJ5IGluY2x1ZGVzIGZvcm1hdCBzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvbGxvd2luZyBlbnRyaWVzIGNvbnRhaW4gZm9ybWF0IGFyZ3VtZW50cworICAgIC8vIGZvcm1hdCBhcmd1bWVudHMKKyAgICBFVkVOVF9GTVRfQVVUSE9SLCAgICAgICAgICAgLy8gYXV0aG9yIGluZGV4IChwcmVzZW50IGluIG1lcmdlZCBsb2dzKSB0cmFja3MgZW50cnkncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmlnaW5hbCBsb2cKKyAgICBFVkVOVF9GTVRfRkxPQVQsICAgICAgICAgICAgLy8gZmxvYXRpbmcgcG9pbnQgdmFsdWUgZW50cnkKKyAgICBFVkVOVF9GTVRfSEFTSCwgICAgICAgICAgICAgLy8gdW5pcXVlIEhBU0ggb2YgbG9nIG9yaWdpbiwgb3JpZ2luYXRlcyBmcm9tIGhhc2ggb2YgZmlsZSBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBsaW5lIG51bWJlcgorICAgIEVWRU5UX0ZNVF9JTlRFR0VSLCAgICAgICAgICAvLyBpbnRlZ2VyIHZhbHVlIGVudHJ5CisgICAgRVZFTlRfRk1UX1BJRCwgICAgICAgICAgICAgIC8vIHByb2Nlc3MgSUQgYW5kIHByb2Nlc3MgbmFtZQorICAgIEVWRU5UX0ZNVF9TVFJJTkcsICAgICAgICAgICAvLyBzdHJpbmcgdmFsdWUgZW50cnkKKyAgICBFVkVOVF9GTVRfVElNRVNUQU1QLCAgICAgICAgLy8gdGltZXN0YW1wIHZhbHVlIGVudHJ5CisgICAgLy8gZW5kIG9mIGZvcm1hdCBhcmd1bWVudHMKKyAgICBFVkVOVF9GTVRfRU5ELCAgICAgICAgICAgICAgLy8gZW5kIG9mIGxvZ0Zvcm1hdCBhcmd1bWVudCBsaXN0CisKKyAgICAvLyBUeXBlcyBmb3Igd2FrZXVwIHRpbWVzdGFtcCBoaXN0b2dyYW1zCisgICAgRVZFTlRfQVVESU9fU1RBVEUsICAgICAgICAgIC8vIGF1ZGlvIG9uL29mZiBldmVudDogbG9nZ2VkIG9uIEZhc3RNaXhlcjo6b25TdGF0ZUNoYW5nZSBjYWxsCisgICAgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTLCAgIC8vIHNpbmdsZSBkYXR1bSBmb3IgdGltZXN0YW1wIGhpc3RvZ3JhbQorCisgICAgLy8gVHlwZXMgcmVwcmVzZW50aW5nIGF1ZGlvIHBlcmZvcm1hbmNlIG1ldHJpY3MKKyAgICBFVkVOVF9MQVRFTkNZLCAgICAgICAgICAgICAgLy8gZGlmZmVyZW5jZSBiZXR3ZWVuIGZyYW1lcyBwcmVzZW50ZWQgYnkgSEFMIGFuZCBmcmFtZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdHRlbiB0byBIQUwgb3V0cHV0IHNpbmssIGRpdmlkZWQgYnkgc2FtcGxlIHJhdGUuCisgICAgRVZFTlRfT1ZFUlJVTiwgICAgICAgICAgICAgIC8vIHByZWRpY3RlZCB0aHJlYWQgb3ZlcnJ1biBldmVudCB0aW1lc3RhbXAKKyAgICBFVkVOVF9USFJFQURfSU5GTywgICAgICAgICAgLy8gc2VlIHRocmVhZF9pbmZvX3QgYmVsb3cKKyAgICBFVkVOVF9VTkRFUlJVTiwgICAgICAgICAgICAgLy8gcHJlZGljdGVkIHRocmVhZCB1bmRlcnJ1biBldmVudCB0aW1lc3RhbXAKKyAgICBFVkVOVF9XQVJNVVBfVElNRSwgICAgICAgICAgLy8gdGhyZWFkIHdhcm11cCB0aW1lCisgICAgRVZFTlRfV09SS19USU1FLCAgICAgICAgICAgIC8vIHRoZSB0aW1lIGEgdGhyZWFkIHRha2VzIHRvIGRvIHdvcmssIGUuZy4gcmVhZCwgd3JpdGUsIGV0Yy4KKyAgICBFVkVOVF9USFJFQURfUEFSQU1TLCAgICAgICAgLy8gc2VlIHRocmVhZF9wYXJhbXNfdCBiZWxvdworCisgICAgRVZFTlRfVVBQRVJfQk9VTkQsICAgICAgICAgIC8vIHRvIGNoZWNrIGZvciBpbnZhbGlkIGV2ZW50cworfTsKKworLy8gTkJMb2cgY3VzdG9tLWRlZmluZWQgc3RydWN0cy4gU29tZSBOQkxvZyBFdmVudCB0eXBlcyBtYXAgdG8gdGhlc2Ugc3RydWN0cy4KKwordXNpbmcgbG9nX2hhc2hfdCA9IHVpbnQ2NF90OworCisvLyB1c2VkIGZvciBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFMgKG5vdCBtYXBwZWQpCitzdHJ1Y3QgSGlzdFRzRW50cnkgeworICAgIGxvZ19oYXNoX3QgaGFzaDsKKyAgICBpbnQ2NF90IHRzOworfTsgLy9UT0RPIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvLyB1c2VkIGZvciBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFMgKG5vdCBtYXBwZWQpCitzdHJ1Y3QgSGlzdFRzRW50cnlXaXRoQXV0aG9yIHsKKyAgICBsb2dfaGFzaF90IGhhc2g7CisgICAgaW50NjRfdCB0czsKKyAgICBpbnQgYXV0aG9yOworfTsgLy9UT0RPIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitlbnVtIFRocmVhZFR5cGUgeworICAgIFVOS05PV04sCisgICAgTUlYRVIsCisgICAgQ0FQVFVSRSwKKyAgICBGQVNUTUlYRVIsCisgICAgRkFTVENBUFRVUkUsCit9OworCitpbmxpbmUgY29uc3QgY2hhciAqdGhyZWFkVHlwZVRvU3RyaW5nKFRocmVhZFR5cGUgdHlwZSkgeworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgTUlYRVI6CisgICAgICAgIHJldHVybiAiTUlYRVIiOworICAgIGNhc2UgQ0FQVFVSRToKKyAgICAgICAgcmV0dXJuICJDQVBUVVJFIjsKKyAgICBjYXNlIEZBU1RNSVhFUjoKKyAgICAgICAgcmV0dXJuICJGQVNUTUlYRVIiOworICAgIGNhc2UgRkFTVENBUFRVUkU6CisgICAgICAgIHJldHVybiAiRkFTVENBUFRVUkUiOworICAgIGNhc2UgVU5LTk9XTjoKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gIlVOS05PV04iOworICAgIH0KK30KKworLy8gbWFwcGVkIGZyb20gRVZFTlRfVEhSRUFEX0lORk8KKy8vIFRoZXNlIGZpZWxkcyBhbHdheXMgc3RheSB0aGUgc2FtZSB0aHJvdWdob3V0IGEgdGhyZWFkJ3MgbGlmZXRpbWUgYW5kCisvLyBzaG91bGQgb25seSBuZWVkIHRvIGJlIGxvZ2dlZCBvbmNlIHVwb24gdGhyZWFkIGluaXRpYWxpemF0aW9uLgorLy8gVGhlcmUgaXMgY3VycmVudGx5IG5vIHJlY292ZXJ5IG1lY2hhbmlzbSBpZiB0aGUgbG9nIGV2ZW50IGNvcnJlc3BvbmRpbmcKKy8vIHRvIHRoaXMgdHlwZSBpcyBsb3N0LgorLy8gVE9ETyBhZGQgdGhpcyBpbmZvcm1hdGlvbiB3aGVuIGFkZGluZyBhIHJlYWRlciB0byBNZWRpYUxvZ1NlcnZpY2U/CitzdHJ1Y3QgdGhyZWFkX2luZm9fdCB7CisgICAgYXVkaW9faW9faGFuZGxlX3QgaWQgPSAtMTsgICAgICAvLyBUaHJlYWQgSS9PIGhhbmRsZQorICAgIFRocmVhZFR5cGUgdHlwZSA9IFVOS05PV047ICAgICAgLy8gU2VlIGVudW0gVGhyZWFkVHlwZSBhYm92ZQorfTsKKworLy8gbWFwcGVkIGZyb20gRVZFTlRfVEhSRUFEX1BBUkFNUworLy8gVGhlc2UgZmllbGRzIGFyZSBub3QgbmVjZXNzYXJpbHkgY29uc3RhbnQgdGhyb3VnaG91dCBhIHRocmVhZCdzIGxpZmV0aW1lIGFuZAorLy8gY2FuIGJlIGxvZ2dlZCB3aGVuZXZlciBhIHRocmVhZCByZWNlaXZlcyBuZXcgY29uZmlndXJhdGlvbnMgb3IgcGFyYW1ldGVycy4KK3N0cnVjdCB0aHJlYWRfcGFyYW1zX3QgeworICAgIHNpemVfdCBmcmFtZUNvdW50ID0gMDsgICAgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBwZXIgcmVhZCBvciB3cml0ZSBidWZmZXIKKyAgICB1bnNpZ25lZCBzYW1wbGVSYXRlID0gMDsgICAgICAgIC8vIGluIGZyYW1lcyBwZXIgc2Vjb25kCit9OworCit0ZW1wbGF0ZSA8RXZlbnQgRT4gc3RydWN0IGdldF9tYXBwZWQ7CisjZGVmaW5lIE1BUF9FVkVOVF9UT19UWVBFKEUsIFQpIFwKK3RlbXBsYXRlPD4gc3RydWN0IGdldF9tYXBwZWQ8RT4geyBcCisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZTxUPjo6dmFsdWUgXAorICAgICAgICAgICAgJiYgIXN0ZDo6aXNfcG9pbnRlcjxUPjo6dmFsdWUsIFwKKyAgICAgICAgICAgICJOQkxvZzo6RXZlbnQgbXVzdCBtYXAgdG8gdHJpdmlhbGx5IGNvcHlhYmxlLCBub24tcG9pbnRlciB0eXBlLiIpOyBcCisgICAgdHlwZWRlZiBUIHR5cGU7IFwKK30KKworLy8gTWFwcyBhbiBOQkxvZyBFdmVudCB0eXBlIHRvIGEgQysrIFBPRCB0eXBlLgorTUFQX0VWRU5UX1RPX1RZUEUoRVZFTlRfTEFURU5DWSwgZG91YmxlKTsKK01BUF9FVkVOVF9UT19UWVBFKEVWRU5UX09WRVJSVU4sIGludDY0X3QpOworTUFQX0VWRU5UX1RPX1RZUEUoRVZFTlRfVEhSRUFEX0lORk8sIHRocmVhZF9pbmZvX3QpOworTUFQX0VWRU5UX1RPX1RZUEUoRVZFTlRfVU5ERVJSVU4sIGludDY0X3QpOworTUFQX0VWRU5UX1RPX1RZUEUoRVZFTlRfV0FSTVVQX1RJTUUsIGRvdWJsZSk7CitNQVBfRVZFTlRfVE9fVFlQRShFVkVOVF9XT1JLX1RJTUUsIGludDY0X3QpOworTUFQX0VWRU5UX1RPX1RZUEUoRVZFTlRfVEhSRUFEX1BBUkFNUywgdGhyZWFkX3BhcmFtc190KTsKKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9OQkxPR19FVkVOVFNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9NZXJnZXIuaCBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvTWVyZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RhODUyMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvTWVyZ2VyLmgKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfTkJMT0dfTUVSR0VSX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9OQkxPR19NRVJHRVJfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm8uaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVhZGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvQ29uZGl0aW9uLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVGhyZWFkLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgU3RyaW5nMTY7CitjbGFzcyBTdHJpbmc4OworCituYW1lc3BhY2UgTkJMb2cgeworCitzdHJ1Y3QgU2hhcmVkOworCisvLyBUT0RPIHVwZGF0ZSBjb21tZW50cyB0byByZWZsZWN0IGN1cnJlbnQgZnVuY3Rpb25hbGl0aWVzCisKKy8vIFRoaXMgY2xhc3MgaXMgdXNlZCB0byByZWFkIGRhdGEgZnJvbSBlYWNoIHRocmVhZCdzIGluZGl2aWR1YWwgRklGTyBpbiBzaGFyZWQgbWVtb3J5CisvLyBhbmQgd3JpdGUgaXQgdG8gYSBzaW5nbGUgRklGTyBpbiBsb2NhbCBtZW1vcnkuCitjbGFzcyBNZXJnZXIgOiBwdWJsaWMgUmVmQmFzZSB7CitwdWJsaWM6CisgICAgTWVyZ2VyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOworCisgICAgfk1lcmdlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZvaWQgYWRkUmVhZGVyKGNvbnN0IHNwPE5CTG9nOjpSZWFkZXI+ICZyZWFkZXIpOworICAgIC8vIFRPRE8gYWRkIHJlbW92ZVJlYWRlcgorICAgIHZvaWQgbWVyZ2UoKTsKKworICAgIC8vIEZJWE1FIFRoaXMgaXMgcmV0dXJuaW5nIGEgcmVmZXJlbmNlIHRvIGEgc2hhcmVkIHZhcmlhYmxlIHRoYXQgbmVlZHMgYSBsb2NrCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8UmVhZGVyPj4mIGdldFJlYWRlcnMoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICAvLyB2ZWN0b3Igb2YgdGhlIHJlYWRlcnMgdGhlIG1lcmdlciBpcyBzdXBwb3NlZCB0byBtZXJnZSBmcm9tLgorICAgIC8vIGV2ZXJ5IHJlYWRlciByZWFkcyBmcm9tIGEgd3JpdGVyJ3MgYnVmZmVyCisgICAgLy8gRklYTUUgTmVlZHMgdG8gYmUgcHJvdGVjdGVkIGJ5IGEgbG9jaworICAgIHN0ZDo6dmVjdG9yPHNwPFJlYWRlcj4+IG1SZWFkZXJzOworCisgICAgU2hhcmVkICogY29uc3QgbVNoYXJlZDsgLy8gcmF3IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeQorICAgIHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvPiBtRmlmbzsgLy8gRklGTyBpdHNlbGYKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+IG1GaWZvV3JpdGVyOyAvLyB1c2VkIHRvIHdyaXRlIHRvIEZJRk8KK307CisKKy8vIFRoaXMgY2xhc3MgaGFzIGEgcG9pbnRlciB0byB0aGUgRklGTyBpbiBsb2NhbCBtZW1vcnkgd2hpY2ggc3RvcmVzIHRoZSBtZXJnZWQKKy8vIGRhdGEgY29sbGVjdGVkIGJ5IE5CTG9nOjpNZXJnZXIgZnJvbSBhbGwgUmVhZGVycy4gSXQgaXMgdXNlZCB0byBwcm9jZXNzCisvLyB0aGlzIGRhdGEgYW5kIHdyaXRlIHRoZSByZXN1bHQgdG8gUGVyZm9ybWFuY2VBbmFseXNpcy4KK2NsYXNzIE1lcmdlUmVhZGVyIDogcHVibGljIFJlYWRlciB7CitwdWJsaWM6CisgICAgTWVyZ2VSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSwgTWVyZ2VyICZtZXJnZXIpOworCisgICAgLy8gcHJvY2VzcyBhIHBhcnRpY3VsYXIgc25hcHNob3Qgb2YgdGhlIHJlYWRlcgorICAgIHZvaWQgcHJvY2Vzc1NuYXBzaG90KFNuYXBzaG90ICZzbmFwLCBpbnQgYXV0aG9yKTsKKworICAgIC8vIGNhbGwgZ2V0U25hcHNob3Qgb2YgdGhlIGNvbnRlbnQgb2YgdGhlIHJlYWRlcidzIGJ1ZmZlciBhbmQgcHJvY2VzcyB0aGUgZGF0YQorICAgIHZvaWQgZ2V0QW5kUHJvY2Vzc1NuYXBzaG90KCk7CisKKyAgICAvLyBjaGVjayBmb3IgcGVyaW9kaWMgcHVzaCBvZiBwZXJmb3JtYW5jZSBkYXRhIHRvIG1lZGlhIG1ldHJpY3MsIGFuZCBwZXJmb3JtCisgICAgLy8gdGhlIHNlbmQgaWYgaXQgaXMgdGltZSB0byBkbyBzby4KKyAgICB2b2lkIGNoZWNrUHVzaFRvTWVkaWFNZXRyaWNzKCk7CisKKyAgICB2b2lkIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKworcHJpdmF0ZToKKyAgICAvLyBGSVhNRSBOZWVkcyB0byBiZSBwcm90ZWN0ZWQgYnkgYSBsb2NrLAorICAgIC8vICAgICAgIGJlY2F1c2UgZXZlbiB0aG91Z2ggb3VyIHVzZSBvZiBpdCBpcyByZWFkLW9ubHkgdGhlcmUgbWF5IGJlIGFzeW5jaHJvbm91cyB1cGRhdGVzCisgICAgLy8gVGhlIG9iamVjdCBpcyBvd25lZCBieSB0aGUgTWVyZ2VyIGNsYXNzLgorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFJlYWRlcj4+JiBtUmVhZGVyczsKKworICAgIC8vIGFuYWx5emVzLCBjb21wcmVzc2VzIGFuZCBzdG9yZXMgdGhlIG1lcmdlZCBkYXRhCisgICAgLy8gY29udGFpbnMgYSBzZXBhcmF0ZSBpbnN0YW5jZSBmb3IgZXZlcnkgYXV0aG9yICh0aHJlYWQpLCBhbmQgZm9yIGV2ZXJ5IHNvdXJjZSBmaWxlCisgICAgLy8gbG9jYXRpb24gd2l0aGluIGVhY2ggYXV0aG9yCisgICAgUmVwb3J0UGVyZm9ybWFuY2U6OlBlcmZvcm1hbmNlQW5hbHlzaXNNYXAgbVRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXM7CisKKyAgICAvLyBjb21wcmVzc2VzIGFuZCBzdG9yZXMgYXVkaW8gcGVyZm9ybWFuY2UgZGF0YSBmcm9tIGVhY2ggdGhyZWFkJ3MgYnVmZmVycy4KKyAgICAvLyBmaXJzdCBwYXJhbWV0ZXIgaXMgYXV0aG9yLCBpLmUuIHRocmVhZCBpbmRleC4KKyAgICBzdGQ6Om1hcDxpbnQsIFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZURhdGE+IG1UaHJlYWRQZXJmb3JtYW5jZURhdGE7CisKKyAgICAvLyBob3cgb2Z0ZW4gdG8gcHVzaCBkYXRhIHRvIE1lZGlhIE1ldHJpY3MKKyAgICBzdGF0aWMgY29uc3RleHByIG5zZWNzX3Qga1BlcmlvZGljTWVkaWFNZXRyaWNzUHVzaCA9IHMybnMoKG5zZWNzX3QpMiAqIDYwICogNjApOyAvLyAyIGhvdXJzCisKKyAgICAvLyBoYW5kbGUgYXV0aG9yIGVudHJ5IGJ5IGxvb2tpbmcgdXAgdGhlIGF1dGhvcidzIG5hbWUgYW5kIGFwcGVuZGluZyBpdCB0byB0aGUgYm9keQorICAgIC8vIHJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSBmbXRFbnRyeQorICAgIHZvaWQgaGFuZGxlQXV0aG9yKGNvbnN0IEFic3RyYWN0RW50cnkgJmZtdEVudHJ5LCBTdHJpbmc4ICpib2R5KTsKK307CisKKy8vIE1lcmdlVGhyZWFkIGlzIGEgdGhyZWFkIHRoYXQgY29udGFpbnMgYSBNZXJnZXIuIEl0IHdvcmtzIGFzIGEgcmV0cmlnZ2VyYWJsZSBvbmUtc2hvdDoKKy8vIHdoZW4gdHJpZ2dlcmVkLCBpdCBhd2FrZXMgZm9yIGEgbGFwc2Ugb2YgdGltZSwgZHVyaW5nIHdoaWNoIGl0IHBlcmlvZGljYWxseSBtZXJnZXM7IGlmCisvLyByZXRyaWdnZXJlZCwgdGhlIHRpbWVvdXQgaXMgcmVzZXQuCisvLyBUaGUgdGhyZWFkIGlzIHRyaWdnZXJlZCBvbiBBdWRpb0ZsaW5nZXIgYmluZGVyIGFjdGl2aXR5LgorY2xhc3MgTWVyZ2VUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKK3B1YmxpYzoKKyAgICBNZXJnZVRocmVhZChNZXJnZXIgJm1lcmdlciwgTWVyZ2VSZWFkZXIgJm1lcmdlUmVhZGVyKTsKKyAgICB+TWVyZ2VUaHJlYWQoKSBvdmVycmlkZTsKKworICAgIC8vIFJlc2V0IHRpbWVvdXQgYW5kIGFjdGl2YXRlIHRocmVhZCB0byBtZXJnZSBwZXJpb2RpY2FsbHkgaWYgaXQncyBpZGxlCisgICAgdm9pZCB3YWtldXAoKTsKKworICAgIC8vIFNldCB0aW1lb3V0IHBlcmlvZCB1bnRpbCB0aGUgbWVyZ2luZyB0aHJlYWQgZ29lcyBpZGxlIGFnYWluCisgICAgdm9pZCBzZXRUaW1lb3V0VXMoaW50IHRpbWUpOworCitwcml2YXRlOgorICAgIGJvb2wgdGhyZWFkTG9vcCgpIG92ZXJyaWRlOworCisgICAgLy8gdGhlIG1lcmdlciB3aG8gYWN0dWFsbHkgZG9lcyB0aGUgd29yayBvZiBtZXJnaW5nIHRoZSBsb2dzCisgICAgTWVyZ2VyJiAgICAgIG1NZXJnZXI7CisKKyAgICAvLyB0aGUgbWVyZ2VyZWFkZXIgdXNlZCB0byBwcm9jZXNzIGRhdGEgbWVyZ2VkIGJ5IG1NZXJnZXIKKyAgICBNZXJnZVJlYWRlciYgbU1lcmdlUmVhZGVyOworCisgICAgLy8gbXV0ZXggZm9yIHRoZSBjb25kaXRpb24gdmFyaWFibGUKKyAgICBNdXRleCAgICAgICAgbU11dGV4OworCisgICAgLy8gY29uZGl0aW9uIHZhcmlhYmxlIHRvIGFjdGl2YXRlIG1lcmdpbmcgb24gdGltZW91dCA+PSAwCisgICAgQ29uZGl0aW9uICAgIG1Db25kOworCisgICAgLy8gdGltZSBsZWZ0IHVudGlsIHRoZSB0aHJlYWQgYmxvY2tzIGFnYWluIChpbiBtaWNyb3NlY29uZHMpCisgICAgaW50ICAgICAgICAgIG1UaW1lb3V0VXM7CisKKyAgICAvLyBtZXJnaW5nIHBlcmlvZCB3aGVuIHRoZSB0aHJlYWQgaXMgYXdha2UKKyAgICBzdGF0aWMgY29uc3QgaW50ICBrVGhyZWFkU2xlZXBQZXJpb2RVcyA9IDEwMDAwMDAgLyoxcyovOworCisgICAgLy8gaW5pdGlhbCB0aW1lb3V0IHZhbHVlIHdoZW4gdHJpZ2dlcmVkCisgICAgc3RhdGljIGNvbnN0IGludCAga1RocmVhZFdha2V1cFBlcmlvZFVzID0gMzAwMDAwMCAvKjNzKi87Cit9OworCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX05CTE9HX01FUkdFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL05CTG9nLmggYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL05CTG9nLmgKaW5kZXggZmI2ZjE3OS4uZmQ3MzUzOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9OQkxvZy5oCisrKyBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvTkJMb2cuaApAQCAtMTksNTk1ICsxOSwxMCBAQAogI2lmbmRlZiBBTkRST0lEX01FRElBX05CTE9HX0gKICNkZWZpbmUgQU5EUk9JRF9NRURJQV9OQkxPR19ICiAKLSNpbmNsdWRlIDxkZXF1ZT4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm8uaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPG1lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oPgotI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFN0cmluZzg7Ci0KLWNsYXNzIE5CTG9nIHsKLQotcHVibGljOgotCi0gICAgdXNpbmcgbG9nX2hhc2hfdCA9IFJlcG9ydFBlcmZvcm1hbmNlOjpsb2dfaGFzaF90OwotCi0gICAgLy8gRklYTUUgRXZlcnl0aGluZyBuZWVkZWQgZm9yIGNsaWVudCAod3JpdGVyIEFQSSBhbmQgcmVnaXN0cmF0aW9uKSBzaG91bGQgYmUgaXNvbGF0ZWQKLSAgICAvLyAgICAgICBmcm9tIHRoZSByZXN0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbi4KLSAgICBjbGFzcyBXcml0ZXI7Ci0gICAgY2xhc3MgUmVhZGVyOwotCi0gICAgZW51bSBFdmVudCA6IHVpbnQ4X3QgewotICAgICAgICBFVkVOVF9SRVNFUlZFRCwKLSAgICAgICAgRVZFTlRfU1RSSU5HLCAgICAgICAgICAgICAgIC8vIEFTQ0lJIHN0cmluZywgbm90IE5VTC10ZXJtaW5hdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBtYWtlIHRpbWVzdGFtcCBvcHRpb25hbAotICAgICAgICBFVkVOVF9USU1FU1RBTVAsICAgICAgICAgICAgLy8gY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMpCi0gICAgICAgIEVWRU5UX0lOVEVHRVIsICAgICAgICAgICAgICAvLyBpbnRlZ2VyIHZhbHVlIGVudHJ5Ci0gICAgICAgIEVWRU5UX0ZMT0FULCAgICAgICAgICAgICAgICAvLyBmbG9hdGluZyBwb2ludCB2YWx1ZSBlbnRyeQotICAgICAgICBFVkVOVF9QSUQsICAgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBJRCBhbmQgcHJvY2VzcyBuYW1lCi0gICAgICAgIEVWRU5UX0FVVEhPUiwgICAgICAgICAgICAgICAvLyBhdXRob3IgaW5kZXggKHByZXNlbnQgaW4gbWVyZ2VkIGxvZ3MpIHRyYWNrcyBlbnRyeSdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmlnaW5hbCBsb2cKLSAgICAgICAgRVZFTlRfU1RBUlRfRk1ULCAgICAgICAgICAgIC8vIGxvZ0Zvcm1hdCBzdGFydCBldmVudDogZW50cnkgaW5jbHVkZXMgZm9ybWF0IHN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvbGxvd2luZyBlbnRyaWVzIGNvbnRhaW4gZm9ybWF0IGFyZ3VtZW50cwotICAgICAgICBFVkVOVF9IQVNILCAgICAgICAgICAgICAgICAgLy8gdW5pcXVlIEhBU0ggb2YgbG9nIG9yaWdpbiwgb3JpZ2luYXRlcyBmcm9tIGhhc2ggb2YgZmlsZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgbGluZSBudW1iZXIKLSAgICAgICAgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTLCAgIC8vIHNpbmdsZSBkYXR1bSBmb3IgdGltZXN0YW1wIGhpc3RvZ3JhbQotICAgICAgICBFVkVOVF9BVURJT19TVEFURSwgICAgICAgICAgLy8gYXVkaW8gb24vb2ZmIGV2ZW50OiBsb2dnZWQgb24gRmFzdE1peGVyOjpvblN0YXRlQ2hhbmdlIGNhbGwKLSAgICAgICAgRVZFTlRfRU5EX0ZNVCwgICAgICAgICAgICAgIC8vIGVuZCBvZiBsb2dGb3JtYXQgYXJndW1lbnQgbGlzdAotCi0gICAgICAgIEVWRU5UX1VQUEVSX0JPVU5ELCAgICAgICAgICAvLyB0byBjaGVjayBmb3IgaW52YWxpZCBldmVudHMKLSAgICB9OwotCi1wcml2YXRlOgotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gQVBJIGZvciBoYW5kbGluZyBmb3JtYXQgZW50cnkgb3BlcmF0aW9ucwotCi0gICAgLy8gYSBmb3JtYXR0ZWQgZW50cnkgaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgotICAgIC8vICAgICogU1RBUlRfRk1UIGVudHJ5LCBjb250YWluaW5nIHRoZSBmb3JtYXQgc3RyaW5nCi0gICAgLy8gICAgKiBUSU1FU1RBTVAgZW50cnkKLSAgICAvLyAgICAqIEhBU0ggZW50cnkKLSAgICAvLyAgICAqIGF1dGhvciBlbnRyeSBvZiB0aGUgdGhyZWFkIHRoYXQgZ2VuZXJhdGVkIGl0IChvcHRpb25hbCwgcHJlc2VudCBpbiBtZXJnZWQgbG9nKQotICAgIC8vICAgICogZm9ybWF0IGFyZzEKLSAgICAvLyAgICAqIGZvcm1hdCBhcmcyCi0gICAgLy8gICAgKiAuLi4KLSAgICAvLyAgICAqIEVORF9GTVQgZW50cnkKLQotICAgIC8vIGVudHJ5IHJlcHJlc2VudGF0aW9uIGluIG1lbW9yeQotICAgIHN0cnVjdCBlbnRyeSB7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgdHlwZTsKLSAgICAgICAgY29uc3QgdWludDhfdCBsZW5ndGg7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgZGF0YVswXTsKLSAgICB9OwotCi0gICAgLy8gZW50cnkgdGFpbCByZXByZXNlbnRhdGlvbiAoYWZ0ZXIgZGF0YSkKLSAgICBzdHJ1Y3QgZW5kaW5nIHsKLSAgICAgICAgdWludDhfdCBsZW5ndGg7Ci0gICAgICAgIHVpbnQ4X3QgbmV4dFswXTsKLSAgICB9OwotCi0gICAgLy8gZW50cnkgaXRlcmF0b3IKLSAgICBjbGFzcyBFbnRyeUl0ZXJhdG9yIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIEVudHJ5SXRlcmF0b3IoKTsKLSAgICAgICAgZXhwbGljaXQgRW50cnlJdGVyYXRvcihjb25zdCB1aW50OF90ICplbnRyeSk7Ci0gICAgICAgIEVudHJ5SXRlcmF0b3IoY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpOwotCi0gICAgICAgIC8vIGRlcmVmZXJlbmNlIHVuZGVybHlpbmcgZW50cnkKLSAgICAgICAgY29uc3QgZW50cnkmICAgIG9wZXJhdG9yKigpIGNvbnN0OwotICAgICAgICBjb25zdCBlbnRyeSogICAgb3BlcmF0b3ItPigpIGNvbnN0OwotICAgICAgICAvLyBhZHZhbmNlIHRvIG5leHQgZW50cnkKLSAgICAgICAgRW50cnlJdGVyYXRvciYgICAgICAgb3BlcmF0b3IrKygpOyAvLyArK2kKLSAgICAgICAgLy8gYmFjayB0byBwcmV2aW91cyBlbnRyeQotICAgICAgICBFbnRyeUl0ZXJhdG9yJiAgICAgICBvcGVyYXRvci0tKCk7IC8vIC0taQotICAgICAgICBFbnRyeUl0ZXJhdG9yICAgICAgICBuZXh0KCkgY29uc3Q7Ci0gICAgICAgIEVudHJ5SXRlcmF0b3IgICAgICAgIHByZXYoKSBjb25zdDsKLSAgICAgICAgYm9vbCAgICAgICAgICAgIG9wZXJhdG9yIT0oY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0OwotICAgICAgICBpbnQgICAgICAgICAgICAgb3BlcmF0b3ItKGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKSBjb25zdDsKLQotICAgICAgICBib29sICAgICAgICAgICAgaGFzQ29uc2lzdGVudExlbmd0aCgpIGNvbnN0OwotICAgICAgICB2b2lkICAgICAgICAgICAgY29weVRvKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCkgY29uc3Q7Ci0gICAgICAgIHZvaWQgICAgICAgICAgICBjb3B5RGF0YSh1aW50OF90ICpkc3QpIGNvbnN0OwotCi0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgICAgIGlubGluZSBjb25zdCBUJiBwYXlsb2FkKCkgewotICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFQgKj4ocHRyICsgb2Zmc2V0b2YoZW50cnksIGRhdGEpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlubGluZSBvcGVyYXRvciBjb25zdCB1aW50OF90KigpIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiBwdHI7Ci0gICAgICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgICpwdHI7Ci0gICAgfTsKLQotICAgIGNsYXNzIEFic3RyYWN0RW50cnkgewotICAgIHB1YmxpYzoKLQotICAgICAgICAvLyBFbnRyeSBzdGFydGluZyBpbiB0aGUgZ2l2ZW4gcG9pbnRlcgotICAgICAgICBleHBsaWNpdCBBYnN0cmFjdEVudHJ5KGNvbnN0IHVpbnQ4X3QgKmVudHJ5KTsKLSAgICAgICAgdmlydHVhbCB+QWJzdHJhY3RFbnRyeSgpIHt9Ci0KLSAgICAgICAgLy8gYnVpbGQgY29uY3JldGUgZW50cnkgb2YgYXBwcm9wcmlhdGUgY2xhc3MgZnJvbSBwb2ludGVyCi0gICAgICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QWJzdHJhY3RFbnRyeT4gYnVpbGRFbnRyeShjb25zdCB1aW50OF90ICpwdHIpOwotCi0gICAgICAgIC8vIGdldCBmb3JtYXQgZW50cnkgdGltZXN0YW1wCi0gICAgICAgIHZpcnR1YWwgaW50NjRfdCAgICAgIHRpbWVzdGFtcCgpIGNvbnN0ID0gMDsKLQotICAgICAgICAvLyBnZXQgZm9ybWF0IGVudHJ5J3MgdW5pcXVlIGlkCi0gICAgICAgIHZpcnR1YWwgbG9nX2hhc2hfdCAgIGhhc2goKSBjb25zdCA9IDA7Ci0KLSAgICAgICAgLy8gZW50cnkncyBhdXRob3IgaW5kZXggKC0xIGlmIG5vbmUgcHJlc2VudCkKLSAgICAgICAgLy8gYSBNZXJnZXIgaGFzIGEgdmVjdG9yIG9mIFJlYWRlcnMsIGF1dGhvciBzaW1wbHkgcG9pbnRzIHRvIHRoZSBpbmRleCBvZiB0aGUKLSAgICAgICAgLy8gUmVhZGVyIHRoYXQgb3JpZ2luYXRlZCB0aGUgZW50cnkKLSAgICAgICAgLy8gVE9ETyBjb25zaWRlciBjaGFuZ2luZyB0byB1aW50MzJfdAotICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgICBhdXRob3IoKSBjb25zdCA9IDA7Ci0KLSAgICAgICAgLy8gY29weSBlbnRyeSwgYWRkaW5nIGF1dGhvciBiZWZvcmUgdGltZXN0YW1wLCByZXR1cm5zIGl0ZXJhdG9yIHRvIGVuZCBvZiBlbnRyeQotICAgICAgICB2aXJ0dWFsIEVudHJ5SXRlcmF0b3IgICAgY29weVdpdGhBdXRob3Ioc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1dGhvcikgY29uc3QgPSAwOwotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICAvLyBjb3BpZXMgb3JkaW5hcnkgZW50cnkgZnJvbSBzcmMgdG8gZHN0LCBhbmQgcmV0dXJucyBsZW5ndGggb2YgZW50cnkKLSAgICAgICAgLy8gc2l6ZV90ICAgICAgY29weUVudHJ5KGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyICpkc3QsIGNvbnN0IGl0ZXJhdG9yICZpdCk7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgICptRW50cnk7Ci0gICAgfTsKLQotICAgIGNsYXNzIEZvcm1hdEVudHJ5IDogcHVibGljIEFic3RyYWN0RW50cnkgewotICAgIHB1YmxpYzoKLSAgICAgICAgLy8gZXhwbGljaXQgRm9ybWF0RW50cnkoY29uc3QgRW50cnlJdGVyYXRvciAmaXQpOwotICAgICAgICBleHBsaWNpdCBGb3JtYXRFbnRyeShjb25zdCB1aW50OF90ICpwdHIpIDogQWJzdHJhY3RFbnRyeShwdHIpIHt9Ci0gICAgICAgIHZpcnR1YWwgfkZvcm1hdEVudHJ5KCkge30KLQotICAgICAgICBFbnRyeUl0ZXJhdG9yIGJlZ2luKCkgY29uc3Q7Ci0KLSAgICAgICAgLy8gRW50cnkncyBmb3JtYXQgc3RyaW5nCi0gICAgICAgIGNvbnN0ICAgY2hhciogZm9ybWF0U3RyaW5nKCkgY29uc3Q7Ci0KLSAgICAgICAgLy8gRW5ydHkncyBmb3JtYXQgc3RyaW5nIGxlbmd0aAotICAgICAgICBzaXplX3QgICAgICBmb3JtYXRTdHJpbmdMZW5ndGgoKSBjb25zdDsKLQotICAgICAgICAvLyBGb3JtYXQgYXJndW1lbnRzIChleGNsdWRpbmcgZm9ybWF0IHN0cmluZywgdGltZXN0YW1wIGFuZCBhdXRob3IpCi0gICAgICAgIEVudHJ5SXRlcmF0b3IgICAgYXJncygpIGNvbnN0OwotCi0gICAgICAgIC8vIGdldCBmb3JtYXQgZW50cnkgdGltZXN0YW1wCi0gICAgICAgIHZpcnR1YWwgaW50NjRfdCAgICAgdGltZXN0YW1wKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICAgICAgLy8gZ2V0IGZvcm1hdCBlbnRyeSdzIHVuaXF1ZSBpZAotICAgICAgICB2aXJ0dWFsIGxvZ19oYXNoX3QgIGhhc2goKSBjb25zdCBvdmVycmlkZTsKLQotICAgICAgICAvLyBlbnRyeSdzIGF1dGhvciBpbmRleCAoLTEgaWYgbm9uZSBwcmVzZW50KQotICAgICAgICAvLyBhIE1lcmdlciBoYXMgYSB2ZWN0b3Igb2YgUmVhZGVycywgYXV0aG9yIHNpbXBseSBwb2ludHMgdG8gdGhlIGluZGV4IG9mIHRoZQotICAgICAgICAvLyBSZWFkZXIgdGhhdCBvcmlnaW5hdGVkIHRoZSBlbnRyeQotICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgIGF1dGhvcigpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgICAgIC8vIGNvcHkgZW50cnksIGFkZGluZyBhdXRob3IgYmVmb3JlIHRpbWVzdGFtcCwgcmV0dXJucyBzaXplIG9mIG9yaWdpbmFsIGVudHJ5Ci0gICAgICAgIHZpcnR1YWwgRW50cnlJdGVyYXRvciAgICBjb3B5V2l0aEF1dGhvcihzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXV0aG9yKSBjb25zdCBvdmVycmlkZTsKLQotICAgIH07Ci0KLSAgICBjbGFzcyBIaXN0b2dyYW1FbnRyeSA6IHB1YmxpYyBBYnN0cmFjdEVudHJ5IHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIGV4cGxpY2l0IEhpc3RvZ3JhbUVudHJ5KGNvbnN0IHVpbnQ4X3QgKnB0cikgOiBBYnN0cmFjdEVudHJ5KHB0cikgewotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgfkhpc3RvZ3JhbUVudHJ5KCkge30KLQotICAgICAgICB2aXJ0dWFsIGludDY0X3QgICAgIHRpbWVzdGFtcCgpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgICAgIHZpcnR1YWwgbG9nX2hhc2hfdCAgaGFzaCgpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgICAgIHZpcnR1YWwgaW50ICAgICAgICAgYXV0aG9yKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICAgICAgdmlydHVhbCBFbnRyeUl0ZXJhdG9yICAgIGNvcHlXaXRoQXV0aG9yKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdXRob3IpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgfTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gcmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgbG9nIGVudHJ5IGluIHByaXZhdGUgbWVtb3J5Ci0gICAgc3RydWN0IEVudHJ5IHsKLSAgICAgICAgRW50cnkoRXZlbnQgZXZlbnQsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpCi0gICAgICAgICAgICA6IG1FdmVudChldmVudCksIG1MZW5ndGgobGVuZ3RoKSwgbURhdGEoZGF0YSkgeyB9Ci0gICAgICAgIC8qdmlydHVhbCovIH5FbnRyeSgpIHsgfQotCi0gICAgICAgIC8vIHVzZWQgZHVyaW5nIHdyaXRpbmcgdG8gZm9ybWF0IEVudHJ5IGluZm9ybWF0aW9uIGFzIGZvbGxvd3M6Ci0gICAgICAgIC8vIFt0eXBlXVtsZW5ndGhdW2RhdGEgLi4uIF1bbGVuZ3RoXQotICAgICAgICBpbnQgICAgIGNvcHlFbnRyeURhdGFBdChzaXplX3Qgb2Zmc2V0KSBjb25zdDsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGZyaWVuZCBjbGFzcyBXcml0ZXI7Ci0gICAgICAgIEV2ZW50ICAgICAgIG1FdmVudDsgICAgIC8vIGV2ZW50IHR5cGUKLSAgICAgICAgdWludDhfdCAgICAgbUxlbmd0aDsgICAgLy8gbGVuZ3RoIG9mIGFkZGl0aW9uYWwgZGF0YSwgMCA8PSBtTGVuZ3RoIDw9IGtNYXhMZW5ndGgKLSAgICAgICAgY29uc3Qgdm9pZCAqbURhdGE7ICAgICAgLy8gZXZlbnQgdHlwZS1zcGVjaWZpYyBkYXRhCi0gICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heExlbmd0aCA9IDI1NTsKLSAgICBwdWJsaWM6Ci0gICAgICAgIC8vIG1FdmVudCwgbUxlbmd0aCwgbURhdGFbLi4uXSwgZHVwbGljYXRlIG1MZW5ndGgKLSAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrT3ZlcmhlYWQgPSBzaXplb2YoZW50cnkpICsgc2l6ZW9mKGVuZGluZyk7Ci0gICAgICAgIC8vIGVuZGluZCBsZW5ndGggb2YgcHJldmlvdXMgZW50cnkKLSAgICAgICAgc3RhdGljIGNvbnN0IHNzaXplX3Qga1ByZXZpb3VzTGVuZ3RoT2Zmc2V0ID0gLSBzaXplb2YoZW5kaW5nKSArCi0gICAgICAgICAgICBvZmZzZXRvZihlbmRpbmcsIGxlbmd0aCk7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBIaXN0VHNFbnRyeSB7Ci0gICAgICAgIGxvZ19oYXNoX3QgaGFzaDsKLSAgICAgICAgaW50NjRfdCB0czsKLSAgICB9OyAvL1RPRE8gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSAgICBzdHJ1Y3QgSGlzdFRzRW50cnlXaXRoQXV0aG9yIHsKLSAgICAgICAgbG9nX2hhc2hfdCBoYXNoOwotICAgICAgICBpbnQ2NF90IHRzOwotICAgICAgICBpbnQgYXV0aG9yOwotICAgIH07IC8vVE9ETyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotICAgIHN0cnVjdCBIaXN0SW50RW50cnkgewotICAgICAgICBsb2dfaGFzaF90IGhhc2g7Ci0gICAgICAgIGludCB2YWx1ZTsKLSAgICB9OyAvL1RPRE8gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSAgICAvLyByZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBsb2cgZW50cnkgaW4gc2hhcmVkIG1lbW9yeQotICAgIC8vICBieXRlWzBdICAgICAgICAgICAgIG1FdmVudAotICAgIC8vICBieXRlWzFdICAgICAgICAgICAgIG1MZW5ndGgKLSAgICAvLyAgYnl0ZVsyXSAgICAgICAgICAgICBtRGF0YVswXQotICAgIC8vICAuLi4KLSAgICAvLyAgYnl0ZVsyK2ldICAgICAgICAgICBtRGF0YVtpXQotICAgIC8vICAuLi4KLSAgICAvLyAgYnl0ZVsyK21MZW5ndGgtMV0gICBtRGF0YVttTGVuZ3RoLTFdCi0gICAgLy8gIGJ5dGVbMittTGVuZ3RoXSAgICAgZHVwbGljYXRlIGNvcHkgb2YgbUxlbmd0aCB0byBwZXJtaXQgcmV2ZXJzZSBzY2FuCi0gICAgLy8gIGJ5dGVbMyttTGVuZ3RoXSAgICAgc3RhcnQgb2YgbmV4dCBsb2cgZW50cnkKLQotICAgIHN0YXRpYyB2b2lkICAgIGFwcGVuZEludChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKTsKLSAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRGbG9hdChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKTsKLSAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRQSUQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7Ci0gICAgc3RhdGljIHZvaWQgICAgYXBwZW5kVGltZXN0YW1wKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpOwotICAgIHN0YXRpYyBzaXplX3QgIGZtdEVudHJ5TGVuZ3RoKGNvbnN0IHVpbnQ4X3QgKmRhdGEpOwotICAgIHN0YXRpYyBTdHJpbmc4IGJ1ZmZlckR1bXAoY29uc3QgdWludDhfdCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7Ci0gICAgc3RhdGljIFN0cmluZzggYnVmZmVyRHVtcChjb25zdCBFbnRyeUl0ZXJhdG9yICZpdCk7Ci1wdWJsaWM6Ci0KLSAgICAvLyBMb2NhdGVkIGluIHNoYXJlZCBtZW1vcnksIG11c3QgYmUgUE9ELgotICAgIC8vIEV4YWN0bHkgb25lIHByb2Nlc3MgbXVzdCBleHBsaWNpdGx5IGNhbGwgdGhlIGNvbnN0cnVjdG9yIG9yIHVzZSBwbGFjZW1lbnQgbmV3LgotICAgIC8vIFNpbmNlIHRoaXMgaXMgYSBQT0QsIHRoZSBkZXN0cnVjdG9yIGlzIGVtcHR5IGFuZCB1bm5lY2Vzc2FyeSB0byBjYWxsIGl0IGV4cGxpY2l0bHkuCi0gICAgc3RydWN0IFNoYXJlZCB7Ci0gICAgICAgIFNoYXJlZCgpIC8qIG1SZWFyIGluaXRpYWxpemVkIHZpYSBkZWZhdWx0IGNvbnN0cnVjdG9yICovIHsgfQotICAgICAgICAvKnZpcnR1YWwqLyB+U2hhcmVkKCkgeyB9Ci0KLSAgICAgICAgYXVkaW9fdXRpbHNfZmlmb19pbmRleCAgbVJlYXI7ICAvLyBpbmRleCBvbmUgYnl0ZSBwYXN0IHRoZSBlbmQgb2YgbW9zdCByZWNlbnQgRW50cnkKLSAgICAgICAgY2hhciAgICBtQnVmZmVyWzBdOyAgICAgICAgICAgICAvLyBjaXJjdWxhciBidWZmZXIgZm9yIGVudHJpZXMKLSAgICB9OwotCi1wdWJsaWM6Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIEZJWE1FIFRpbWVsaW5lIHdhcyBpbnRlbmRlZCB0byB3cmFwIFdyaXRlciBhbmQgUmVhZGVyLCBidXQgaXNuJ3QgYWN0dWFsbHkgdXNlZCB5ZXQuCi0gICAgLy8gRm9yIG5vdyBpdCBpcyBqdXN0IGEgbmFtZXNwYWNlIGZvciBzaGFyZWRTaXplKCkuCi0gICAgY2xhc3MgVGltZWxpbmUgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgcHVibGljOgotI2lmIDAKLSAgICAgICAgVGltZWxpbmUoc2l6ZV90IHNpemUsIHZvaWQgKnNoYXJlZCA9IE5VTEwpOwotICAgICAgICB2aXJ0dWFsIH5UaW1lbGluZSgpOwotI2VuZGlmCi0KLSAgICAgICAgLy8gSW5wdXQgcGFyYW1ldGVyICdzaXplJyBpcyB0aGUgZGVzaXJlZCBzaXplIG9mIHRoZSB0aW1lbGluZSBpbiBieXRlIHVuaXRzLgotICAgICAgICAvLyBSZXR1cm5zIHRoZSBzaXplIHJvdW5kZWQgdXAgdG8gYSBwb3dlci1vZi0yLCBwbHVzIHRoZSBjb25zdGFudCBzaXplIG92ZXJoZWFkIGZvciBpbmRpY2VzLgotICAgICAgICBzdGF0aWMgc2l6ZV90IHNoYXJlZFNpemUoc2l6ZV90IHNpemUpOwotCi0jaWYgMAotICAgIHByaXZhdGU6Ci0gICAgICAgIGZyaWVuZCBjbGFzcyAgICBXcml0ZXI7Ci0gICAgICAgIGZyaWVuZCBjbGFzcyAgICBSZWFkZXI7Ci0KLSAgICAgICAgY29uc3Qgc2l6ZV90ICAgIG1TaXplOyAgICAgIC8vIGNpcmN1bGFyIGJ1ZmZlciBzaXplIGluIGJ5dGVzLCBtdXN0IGJlIGEgcG93ZXIgb2YgMgotICAgICAgICBib29sICAgICAgICAgICAgbU93bjsgICAgICAgLy8gd2hldGhlciBJIG93biB0aGUgbWVtb3J5IGF0IG1TaGFyZWQKLSAgICAgICAgU2hhcmVkKiBjb25zdCAgIG1TaGFyZWQ7ICAgIC8vIHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeQotI2VuZGlmCi0gICAgfTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gV3JpdGVyIGlzIHRocmVhZC1zYWZlIHdpdGggcmVzcGVjdCB0byBSZWFkZXIsIGJ1dCBub3Qgd2l0aCByZXNwZWN0IHRvIG11bHRpcGxlIHRocmVhZHMKLSAgICAvLyBjYWxsaW5nIFdyaXRlciBtZXRob2RzLiAgSWYgeW91IG5lZWQgbXVsdGktdGhyZWFkIHNhZmV0eSBmb3Igd3JpdGluZywgdXNlIExvY2tlZFdyaXRlci4KLSAgICBjbGFzcyBXcml0ZXIgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgcHVibGljOgotICAgICAgICBXcml0ZXIoKTsgICAgICAgICAgICAgICAgICAgLy8gZHVtbXkgbm9wIGltcGxlbWVudGF0aW9uIHdpdGhvdXQgc2hhcmVkIG1lbW9yeQotCi0gICAgICAgIC8vIElucHV0IHBhcmFtZXRlciAnc2l6ZScgaXMgdGhlIGRlc2lyZWQgc2l6ZSBvZiB0aGUgdGltZWxpbmUgaW4gYnl0ZSB1bml0cy4KLSAgICAgICAgLy8gVGhlIHNpemUgb2YgdGhlIHNoYXJlZCBtZW1vcnkgbXVzdCBiZSBhdCBsZWFzdCBUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplKS4KLSAgICAgICAgV3JpdGVyKHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOwotICAgICAgICBXcml0ZXIoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnksIHNpemVfdCBzaXplKTsKLQotICAgICAgICB2aXJ0dWFsIH5Xcml0ZXIoKTsKLQotICAgICAgICAvLyBGSVhNRSBuZWVkcyBjb21tZW50cywgYW5kIHNvbWUgc2hvdWxkIGJlIHByaXZhdGUKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZyhjb25zdCBjaGFyICpzdHJpbmcpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nZihjb25zdCBjaGFyICpmbXQsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9ndmYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ1RpbWVzdGFtcCgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nVGltZXN0YW1wKGNvbnN0IGludDY0X3QgdHMpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nSW50ZWdlcihjb25zdCBpbnQgeCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dGbG9hdChjb25zdCBmbG9hdCB4KTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ1BJRCgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nRm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgbG9nX2hhc2hfdCBoYXNoLCAuLi4pOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nVkZvcm1hdChjb25zdCBjaGFyICpmbXQsIGxvZ19oYXNoX3QgaGFzaCwgdmFfbGlzdCBhcCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dTdGFydChjb25zdCBjaGFyICpmbXQpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nRW5kKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dIYXNoKGxvZ19oYXNoX3QgaGFzaCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dFdmVudEhpc3RUcyhFdmVudCBldmVudCwgbG9nX2hhc2hfdCBoYXNoKTsKLQotICAgICAgICB2aXJ0dWFsIGJvb2wgICAgaXNFbmFibGVkKCkgY29uc3Q7Ci0KLSAgICAgICAgLy8gcmV0dXJuIHZhbHVlIGZvciBhbGwgb2YgdGhlc2UgaXMgdGhlIHByZXZpb3VzIGlzRW5hYmxlZCgpCi0gICAgICAgIHZpcnR1YWwgYm9vbCAgICBzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCk7ICAgLy8gYnV0IHdvbid0IGVuYWJsZSBpZiBubyBzaGFyZWQgbWVtb3J5Ci0gICAgICAgIGJvb2wgICAgZW5hYmxlKCkgICAgeyByZXR1cm4gc2V0RW5hYmxlZCh0cnVlKTsgfQotICAgICAgICBib29sICAgIGRpc2FibGUoKSAgIHsgcmV0dXJuIHNldEVuYWJsZWQoZmFsc2UpOyB9Ci0KLSAgICAgICAgc3A8SU1lbW9yeT4gICAgIGdldElNZW1vcnkoKSBjb25zdCAgeyByZXR1cm4gbUlNZW1vcnk7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIC8vIDAgPD0gbGVuZ3RoIDw9IGtNYXhMZW5ndGgKLSAgICAgICAgLy8gd3JpdGVzIGEgc2luZ2xlIEVudHJ5IHRvIHRoZSBGSUZPCi0gICAgICAgIHZvaWQgICAgbG9nKEV2ZW50IGV2ZW50LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKTsKLSAgICAgICAgLy8gY2hlY2tzIHZhbGlkaXR5IG9mIGFuIGV2ZW50IGJlZm9yZSBjYWxsaW5nIGxvZyBhYm92ZSB0aGlzIG9uZQotICAgICAgICB2b2lkICAgIGxvZyhjb25zdCBFbnRyeSAqZW50cnksIGJvb2wgdHJ1c3RlZCA9IGZhbHNlKTsKLQotICAgICAgICBTaGFyZWQqIGNvbnN0ICAgbVNoYXJlZDsgICAgLy8gcmF3IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeQotICAgICAgICBzcDxJTWVtb3J5PiAgICAgbUlNZW1vcnk7ICAgLy8gcmVmLWNvdW50ZWQgdmVyc2lvbiwgaW5pdGlhbGl6ZWQgaW4gY29uc3RydWN0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGVuIGNvbnN0Ci0gICAgICAgIGF1ZGlvX3V0aWxzX2ZpZm8gKiBjb25zdCBtRmlmbzsgICAgICAgICAgICAgICAgIC8vIEZJRk8gaXRzZWxmLCBub24tTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmxlc3MgY29uc3RydWN0b3IgZmFpbHMKLSAgICAgICAgYXVkaW9fdXRpbHNfZmlmb193cml0ZXIgKiBjb25zdCBtRmlmb1dyaXRlcjsgICAgLy8gdXNlZCB0byB3cml0ZSB0byBGSUZPLCBub24tTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmxlc3MgZHVtbXkgY29uc3RydWN0b3IgdXNlZAotICAgICAgICBib29sICAgICAgICAgICAgbUVuYWJsZWQ7ICAgLy8gd2hldGhlciB0byBhY3R1YWxseSBsb2cKLQotICAgICAgICAvLyBjYWNoZWQgcGlkIGFuZCBwcm9jZXNzIG5hbWUgdG8gdXNlIGluICVwIGZvcm1hdCBzcGVjaWZpZXIKLSAgICAgICAgLy8gdG90YWwgdGFnIGxlbmd0aCBpcyBtUGlkVGFnU2l6ZSBhbmQgcHJvY2VzcyBuYW1lIGlzIG5vdCB6ZXJvIHRlcm1pbmF0ZWQKLSAgICAgICAgY2hhciAgICptUGlkVGFnOwotICAgICAgICBzaXplX3QgIG1QaWRUYWdTaXplOwotICAgIH07Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIFNpbWlsYXIgdG8gV3JpdGVyLCBidXQgc2FmZSBmb3IgbXVsdGlwbGUgdGhyZWFkcyB0byBjYWxsIGNvbmN1cnJlbnRseQotICAgIGNsYXNzIExvY2tlZFdyaXRlciA6IHB1YmxpYyBXcml0ZXIgewotICAgIHB1YmxpYzoKLSAgICAgICAgTG9ja2VkV3JpdGVyKCk7Ci0gICAgICAgIExvY2tlZFdyaXRlcih2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKTsKLQotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nKGNvbnN0IGNoYXIgKnN0cmluZyk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2d2Zihjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nVGltZXN0YW1wKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dUaW1lc3RhbXAoY29uc3QgaW50NjRfdCB0cyk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dJbnRlZ2VyKGNvbnN0IGludCB4KTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ0Zsb2F0KGNvbnN0IGZsb2F0IHgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nUElEKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dTdGFydChjb25zdCBjaGFyICpmbXQpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nRW5kKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dIYXNoKGxvZ19oYXNoX3QgaGFzaCk7Ci0KLSAgICAgICAgdmlydHVhbCBib29sICAgIGlzRW5hYmxlZCgpIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIGJvb2wgICAgc2V0RW5hYmxlZChib29sIGVuYWJsZWQpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgbXV0YWJsZSBNdXRleCAgIG1Mb2NrOwotICAgIH07Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIGNsYXNzIFJlYWRlciA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIC8vIEEgc25hcHNob3Qgb2YgYSByZWFkZXJzIGJ1ZmZlcgotICAgICAgICAvLyBUaGlzIGlzIHJhdyBkYXRhLiBObyBhbmFseXNpcyBoYXMgYmVlbiBkb25lIG9uIGl0Ci0gICAgICAgIGNsYXNzIFNuYXBzaG90IHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgU25hcHNob3QoKSA6IG1EYXRhKE5VTEwpLCBtTG9zdCgwKSB7fQotCi0gICAgICAgICAgICBTbmFwc2hvdChzaXplX3QgYnVmZmVyU2l6ZSkgOiBtRGF0YShuZXcgdWludDhfdFtidWZmZXJTaXplXSkge30KLQotICAgICAgICAgICAgflNuYXBzaG90KCkgeyBkZWxldGVbXSBtRGF0YTsgfQotCi0gICAgICAgICAgICAvLyBjb3B5IG9mIHRoZSBidWZmZXIKLSAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEoKSBjb25zdCB7IHJldHVybiBtRGF0YTsgfQotCi0gICAgICAgICAgICAvLyBhbW91bnQgb2YgZGF0YSBsb3N0IChnaXZlbiBieSBhdWRpb191dGlsc19maWZvX3JlYWRlcikKLSAgICAgICAgICAgIHNpemVfdCAgIGxvc3QoKSBjb25zdCB7IHJldHVybiBtTG9zdDsgfQotCi0gICAgICAgICAgICAvLyBpdGVyYXRvciB0byBiZWdpbm5pbmcgb2YgcmVhZGFibGUgc2VnbWVudCBvZiBzbmFwc2hvdAotICAgICAgICAgICAgLy8gZGF0YSBiZXR3ZWVuIGJlZ2luIGFuZCBlbmQgaGFzIHZhbGlkIGVudHJpZXMKLSAgICAgICAgICAgIEVudHJ5SXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBtQmVnaW47IH0KLQotICAgICAgICAgICAgLy8gaXRlcmF0b3IgdG8gZW5kIG9mIHJlYWRhYmxlIHNlZ21lbnQgb2Ygc25hcHNob3QKLSAgICAgICAgICAgIEVudHJ5SXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gbUVuZDsgfQotCi0gICAgICAgIHByaXZhdGU6Ci0gICAgICAgICAgICBmcmllbmQgY2xhc3MgTWVyZ2VSZWFkZXI7Ci0gICAgICAgICAgICBmcmllbmQgY2xhc3MgUmVhZGVyOwotICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICAgKm1EYXRhOwotICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgIG1Mb3N0OwotICAgICAgICAgICAgRW50cnlJdGVyYXRvciBtQmVnaW47Ci0gICAgICAgICAgICBFbnRyeUl0ZXJhdG9yIG1FbmQ7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gSW5wdXQgcGFyYW1ldGVyICdzaXplJyBpcyB0aGUgZGVzaXJlZCBzaXplIG9mIHRoZSB0aW1lbGluZSBpbiBieXRlIHVuaXRzLgotICAgICAgICAvLyBUaGUgc2l6ZSBvZiB0aGUgc2hhcmVkIG1lbW9yeSBtdXN0IGJlIGF0IGxlYXN0IFRpbWVsaW5lOjpzaGFyZWRTaXplKHNpemUpLgotICAgICAgICBSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk7Ci0gICAgICAgIFJlYWRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUpOwotCi0gICAgICAgIHZpcnR1YWwgflJlYWRlcigpOwotCi0gICAgICAgIC8vIGdldCBzbmFwc2hvdCBvZiByZWFkZXJzIGZpZm8gYnVmZmVyLCBlZmZlY3RpdmVseSBjb25zdW1pbmcgdGhlIGJ1ZmZlcgotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IGdldFNuYXBzaG90KCk7Ci0KLSAgICAgICAgYm9vbCAgICAgaXNJTWVtb3J5KGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5KSBjb25zdDsKLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgLy8gcHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBwZXJmb3JtYW5jZSB0byB0aGUgY29uc29sZQotICAgICAgICB2b2lkICAgIGR1bXBMaW5lKGNvbnN0IFN0cmluZzgmIHRpbWVzdGFtcCwgU3RyaW5nOCYgYm9keSk7Ci0gICAgICAgIEVudHJ5SXRlcmF0b3IgICBoYW5kbGVGb3JtYXQoY29uc3QgRm9ybWF0RW50cnkgJmZtdEVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggKnRpbWVzdGFtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4ICpib2R5KTsKLSAgICAgICAgaW50IG1GZDsgICAgICAgICAgICAgICAgLy8gZmlsZSBkZXNjcmlwdG9yCi0gICAgICAgIGludCBtSW5kZW50OyAgICAgICAgICAgIC8vIGluZGVudGF0aW9uIGxldmVsCi0gICAgICAgIGludCBtTG9zdDsgICAgICAgICAgICAgIC8vIGJ5dGVzIG9mIGRhdGEgbG9zdCBiZWZvcmUgYnVmZmVyIHdhcyByZWFkCi0KLSAgICBwcml2YXRlOgotICAgICAgICBzdGF0aWMgY29uc3Qgc3RkOjpzZXQ8RXZlbnQ+IHN0YXJ0aW5nVHlwZXM7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBzdGQ6OnNldDxFdmVudD4gZW5kaW5nVHlwZXM7Ci0KLSAgICAgICAgLy8gZGVjbGFyZWQgYXMgY29uc3QgYmVjYXVzZSBhdWRpb191dGlsc19maWZvKCkgY29uc3RydWN0b3IKLSAgICAgICAgc3A8SU1lbW9yeT4gbUlNZW1vcnk7ICAgICAgIC8vIHJlZi1jb3VudGVkIHZlcnNpb24sIGFzc2lnbmVkIG9ubHkgaW4gY29uc3RydWN0b3IKLQotICAgICAgICAvKmNvbnN0Ki8gU2hhcmVkKiBjb25zdCBtU2hhcmVkOyAgICAvLyByYXcgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5LCBhY3R1YWxseSBjb25zdCBidXQgbm90Ci0gICAgICAgIGF1ZGlvX3V0aWxzX2ZpZm8gKiBjb25zdCBtRmlmbzsgICAgICAgICAgICAgICAgIC8vIEZJRk8gaXRzZWxmLAotICAgICAgICAvLyBub24tTlVMTCB1bmxlc3MgY29uc3RydWN0b3IgZmFpbHMKLSAgICAgICAgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIgKiBjb25zdCBtRmlmb1JlYWRlcjsgICAgLy8gdXNlZCB0byByZWFkIGZyb20gRklGTywKLSAgICAgICAgLy8gbm9uLU5VTEwgdW5sZXNzIGNvbnN0cnVjdG9yIGZhaWxzCi0KLSAgICAgICAgLy8gU2VhcmNoZXMgZm9yIHRoZSBsYXN0IGVudHJ5IG9mIHR5cGUgPHR5cGU+IGluIHRoZSByYW5nZSBbZnJvbnQsIGJhY2spCi0gICAgICAgIC8vIGJhY2sgaGFzIHRvIGJlIGVudHJ5LWFsaWduZWQuIFJldHVybnMgbnVsbHB0ciBpZiBub25lIGVuY29udW50ZXJlZC4KLSAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgKmZpbmRMYXN0RW50cnlPZlR5cGVzKGNvbnN0IHVpbnQ4X3QgKmZyb250LCBjb25zdCB1aW50OF90ICpiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8RXZlbnQ+ICZ0eXBlcyk7Ci0KLSAgICAgICAgLy8gZHVtbXkgbWV0aG9kIGZvciBoYW5kbGluZyBhYnNlbnQgYXV0aG9yIGVudHJ5Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBoYW5kbGVBdXRob3IoY29uc3QgQWJzdHJhY3RFbnRyeSYgLypmbXRFbnRyeSovLCBTdHJpbmc4KiAvKmJvZHkqLykge30KLSAgICB9OwotCi0gICAgLy8gV3JhcHBlciBmb3IgYSByZWFkZXIgd2l0aCBhIG5hbWUuIENvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgcmVhZGVyIGFuZCBhIHBvaW50ZXIgdG8gdGhlIG5hbWUKLSAgICBjbGFzcyBOYW1lZFJlYWRlciB7Ci0gICAgcHVibGljOgotICAgICAgICBOYW1lZFJlYWRlcigpIHsgbU5hbWVbMF0gPSAnXDAnOyB9IC8vIGZvciBWZWN0b3IKLSAgICAgICAgTmFtZWRSZWFkZXIoY29uc3Qgc3A8TkJMb2c6OlJlYWRlcj4mIHJlYWRlciwgY29uc3QgY2hhciAqbmFtZSkgOgotICAgICAgICAgICAgbVJlYWRlcihyZWFkZXIpCi0gICAgICAgICAgICB7IHN0cmxjcHkobU5hbWUsIG5hbWUsIHNpemVvZihtTmFtZSkpOyB9Ci0gICAgICAgIH5OYW1lZFJlYWRlcigpIHsgfQotICAgICAgICBjb25zdCBzcDxOQkxvZzo6UmVhZGVyPiYgIHJlYWRlcigpIGNvbnN0IHsgcmV0dXJuIG1SZWFkZXI7IH0KLSAgICAgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICBuYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIHNwPE5CTG9nOjpSZWFkZXI+ICAgbVJlYWRlcjsKLSAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4TmFtZSA9IDMyOwotICAgICAgICBjaGFyICAgICAgICAgICAgICAgIG1OYW1lW2tNYXhOYW1lXTsKLSAgICB9OwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvLyBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcmVhZCBkYXRhIGZyb20gZWFjaCB0aHJlYWQncyBpbmRpdmlkdWFsIEZJRk8gaW4gc2hhcmVkIG1lbW9yeQotICAgIC8vIGFuZCB3cml0ZSBpdCB0byBhIHNpbmdsZSBGSUZPIGluIGxvY2FsIG1lbW9yeS4KLSAgICBjbGFzcyBNZXJnZXIgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgcHVibGljOgotICAgICAgICBNZXJnZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICAgICAgdmlydHVhbCB+TWVyZ2VyKCkge30KLQotICAgICAgICB2b2lkIGFkZFJlYWRlcihjb25zdCBOYW1lZFJlYWRlciAmcmVhZGVyKTsKLSAgICAgICAgLy8gVE9ETyBhZGQgcmVtb3ZlUmVhZGVyCi0gICAgICAgIHZvaWQgbWVyZ2UoKTsKLQotICAgICAgICAvLyBGSVhNRSBUaGlzIGlzIHJldHVybmluZyBhIHJlZmVyZW5jZSB0byBhIHNoYXJlZCB2YXJpYWJsZSB0aGF0IG5lZWRzIGEgbG9jawotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxOYW1lZFJlYWRlcj4mIGdldE5hbWVkUmVhZGVycygpIGNvbnN0OwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgLy8gdmVjdG9yIG9mIHRoZSByZWFkZXJzIHRoZSBtZXJnZXIgaXMgc3VwcG9zZWQgdG8gbWVyZ2UgZnJvbS4KLSAgICAgICAgLy8gZXZlcnkgcmVhZGVyIHJlYWRzIGZyb20gYSB3cml0ZXIncyBidWZmZXIKLSAgICAgICAgLy8gRklYTUUgTmVlZHMgdG8gYmUgcHJvdGVjdGVkIGJ5IGEgbG9jawotICAgICAgICBzdGQ6OnZlY3RvcjxOYW1lZFJlYWRlcj4gbU5hbWVkUmVhZGVyczsKLQotICAgICAgICBTaGFyZWQgKiBjb25zdCBtU2hhcmVkOyAvLyByYXcgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvPiBtRmlmbzsgLy8gRklGTyBpdHNlbGYKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiBtRmlmb1dyaXRlcjsgLy8gdXNlZCB0byB3cml0ZSB0byBGSUZPCi0gICAgfTsKLQotICAgIC8vIFRoaXMgY2xhc3MgaGFzIGEgcG9pbnRlciB0byB0aGUgRklGTyBpbiBsb2NhbCBtZW1vcnkgd2hpY2ggc3RvcmVzIHRoZSBtZXJnZWQKLSAgICAvLyBkYXRhIGNvbGxlY3RlZCBieSBOQkxvZzo6TWVyZ2VyIGZyb20gYWxsIE5hbWVkUmVhZGVycy4gSXQgaXMgdXNlZCB0byBwcm9jZXNzCi0gICAgLy8gdGhpcyBkYXRhIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIFBlcmZvcm1hbmNlQW5hbHlzaXMuCi0gICAgY2xhc3MgTWVyZ2VSZWFkZXIgOiBwdWJsaWMgUmVhZGVyIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIE1lcmdlUmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUsIE1lcmdlciAmbWVyZ2VyKTsKLQotICAgICAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgaW5kZW50ID0gMCk7Ci0gICAgICAgIC8vIHByb2Nlc3MgYSBwYXJ0aWN1bGFyIHNuYXBzaG90IG9mIHRoZSByZWFkZXIKLSAgICAgICAgdm9pZCBnZXRBbmRQcm9jZXNzU25hcHNob3QoU25hcHNob3QgJiBzbmFwKTsKLSAgICAgICAgLy8gY2FsbCBnZXRTbmFwc2hvdCBvZiB0aGUgY29udGVudCBvZiB0aGUgcmVhZGVyJ3MgYnVmZmVyIGFuZCBwcm9jZXNzIHRoZSBkYXRhCi0gICAgICAgIHZvaWQgZ2V0QW5kUHJvY2Vzc1NuYXBzaG90KCk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICAvLyBGSVhNRSBOZWVkcyB0byBiZSBwcm90ZWN0ZWQgYnkgYSBsb2NrLAotICAgICAgICAvLyAgICAgICBiZWNhdXNlIGV2ZW4gdGhvdWdoIG91ciB1c2Ugb2YgaXQgaXMgcmVhZC1vbmx5IHRoZXJlIG1heSBiZSBhc3luY2hyb25vdXMgdXBkYXRlcwotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxOYW1lZFJlYWRlcj4mIG1OYW1lZFJlYWRlcnM7Ci0KLSAgICAgICAgLy8gYW5hbHl6ZXMsIGNvbXByZXNzZXMgYW5kIHN0b3JlcyB0aGUgbWVyZ2VkIGRhdGEKLSAgICAgICAgLy8gY29udGFpbnMgYSBzZXBhcmF0ZSBpbnN0YW5jZSBmb3IgZXZlcnkgYXV0aG9yICh0aHJlYWQpLCBhbmQgZm9yIGV2ZXJ5IHNvdXJjZSBmaWxlCi0gICAgICAgIC8vIGxvY2F0aW9uIHdpdGhpbiBlYWNoIGF1dGhvcgotICAgICAgICBSZXBvcnRQZXJmb3JtYW5jZTo6UGVyZm9ybWFuY2VBbmFseXNpc01hcCBtVGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpczsKLQotICAgICAgICAvLyBoYW5kbGUgYXV0aG9yIGVudHJ5IGJ5IGxvb2tpbmcgdXAgdGhlIGF1dGhvcidzIG5hbWUgYW5kIGFwcGVuZGluZyBpdCB0byB0aGUgYm9keQotICAgICAgICAvLyByZXR1cm5zIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gZm10RW50cnkKLSAgICAgICAgdm9pZCBoYW5kbGVBdXRob3IoY29uc3QgQWJzdHJhY3RFbnRyeSAmZm10RW50cnksIFN0cmluZzggKmJvZHkpOwotICAgIH07Ci0KLSAgICAvLyBNZXJnZVRocmVhZCBpcyBhIHRocmVhZCB0aGF0IGNvbnRhaW5zIGEgTWVyZ2VyLiBJdCB3b3JrcyBhcyBhIHJldHJpZ2dlcmFibGUgb25lLXNob3Q6Ci0gICAgLy8gd2hlbiB0cmlnZ2VyZWQsIGl0IGF3YWtlcyBmb3IgYSBsYXBzZSBvZiB0aW1lLCBkdXJpbmcgd2hpY2ggaXQgcGVyaW9kaWNhbGx5IG1lcmdlczsgaWYKLSAgICAvLyByZXRyaWdnZXJlZCwgdGhlIHRpbWVvdXQgaXMgcmVzZXQuCi0gICAgLy8gVGhlIHRocmVhZCBpcyB0cmlnZ2VyZWQgb24gQXVkaW9GbGluZ2VyIGJpbmRlciBhY3Rpdml0eS4KLSAgICBjbGFzcyBNZXJnZVRocmVhZCA6IHB1YmxpYyBUaHJlYWQgewotICAgIHB1YmxpYzoKLSAgICAgICAgTWVyZ2VUaHJlYWQoTWVyZ2VyICZtZXJnZXIsIE1lcmdlUmVhZGVyICZtZXJnZVJlYWRlcik7Ci0gICAgICAgIHZpcnR1YWwgfk1lcmdlVGhyZWFkKCkgb3ZlcnJpZGU7Ci0KLSAgICAgICAgLy8gUmVzZXQgdGltZW91dCBhbmQgYWN0aXZhdGUgdGhyZWFkIHRvIG1lcmdlIHBlcmlvZGljYWxseSBpZiBpdCdzIGlkbGUKLSAgICAgICAgdm9pZCB3YWtldXAoKTsKLQotICAgICAgICAvLyBTZXQgdGltZW91dCBwZXJpb2QgdW50aWwgdGhlIG1lcmdpbmcgdGhyZWFkIGdvZXMgaWRsZSBhZ2FpbgotICAgICAgICB2b2lkIHNldFRpbWVvdXRVcyhpbnQgdGltZSk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpIG92ZXJyaWRlOwotCi0gICAgICAgIC8vIHRoZSBtZXJnZXIgd2hvIGFjdHVhbGx5IGRvZXMgdGhlIHdvcmsgb2YgbWVyZ2luZyB0aGUgbG9ncwotICAgICAgICBNZXJnZXImICAgICBtTWVyZ2VyOwotCi0gICAgICAgIC8vIHRoZSBtZXJnZXJlYWRlciB1c2VkIHRvIHByb2Nlc3MgZGF0YSBtZXJnZWQgYnkgbU1lcmdlcgotICAgICAgICBNZXJnZVJlYWRlciYgbU1lcmdlUmVhZGVyOwotCi0gICAgICAgIC8vIG11dGV4IGZvciB0aGUgY29uZGl0aW9uIHZhcmlhYmxlCi0gICAgICAgIE11dGV4ICAgICAgIG1NdXRleDsKLQotICAgICAgICAvLyBjb25kaXRpb24gdmFyaWFibGUgdG8gYWN0aXZhdGUgbWVyZ2luZyBvbiB0aW1lb3V0ID49IDAKLSAgICAgICAgQ29uZGl0aW9uICAgbUNvbmQ7Ci0KLSAgICAgICAgLy8gdGltZSBsZWZ0IHVudGlsIHRoZSB0aHJlYWQgYmxvY2tzIGFnYWluIChpbiBtaWNyb3NlY29uZHMpCi0gICAgICAgIGludCAgICAgICAgIG1UaW1lb3V0VXM7Ci0KLSAgICAgICAgLy8gbWVyZ2luZyBwZXJpb2Qgd2hlbiB0aGUgdGhyZWFkIGlzIGF3YWtlCi0gICAgICAgIHN0YXRpYyBjb25zdCBpbnQgIGtUaHJlYWRTbGVlcFBlcmlvZFVzID0gMTAwMDAwMCAvKjFzKi87Ci0KLSAgICAgICAgLy8gaW5pdGlhbCB0aW1lb3V0IHZhbHVlIHdoZW4gdHJpZ2dlcmVkCi0gICAgICAgIHN0YXRpYyBjb25zdCBpbnQgIGtUaHJlYWRXYWtldXBQZXJpb2RVcyA9IDMwMDAwMDAgLyozcyovOwotICAgIH07Ci0KLX07ICAvLyBjbGFzcyBOQkxvZwotCi0vLyBUT0RPIHB1dCBzb21ld2hlcmUgZWxzZQotc3RhdGljIGlubGluZSBpbnQ2NF90IGdldF9tb25vdG9uaWNfbnMoKSB7Ci0gICAgdGltZXNwZWMgdHM7Ci0gICAgaWYgKGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHMpID09IDApIHsKLSAgICAgICAgcmV0dXJuICh1aW50NjRfdCkgdHMudHZfc2VjICogMTAwMCAqIDEwMDAgKiAxMDAwICsgdHMudHZfbnNlYzsKLSAgICB9Ci0gICAgcmV0dXJuIDA7IC8vIHNob3VsZCBub3QgaGFwcGVuLgotfQotCi19ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FbnRyeS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0V2ZW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1JlYWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1RpbWVsaW5lLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvV3JpdGVyLmg+CiAKICNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9OQkxPR19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaCBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oCmluZGV4IGRkZmU5ZDYuLmQ3YzE2YjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oCisrKyBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oCkBAIC0xOSwxNCArMTksMTc2IEBACiAKICNpbmNsdWRlIDxkZXF1ZT4KICNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8dmVjdG9yPgogCisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRXZlbnRzLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitjbGFzcyBTdHJpbmc4OworCiBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UgewogCisvLyBUT0RPIG1ha2UgdGhpcyBhIHRlbXBsYXRlZCBjbGFzcyBhbmQgcHV0IGl0IGluIGEgc2VwYXJhdGUgZmlsZS4KKy8vIFRoZSB0ZW1wbGF0ZWQgcGFyYW1ldGVycyB3b3VsZCBiZSBiaW4gc2l6ZSBhbmQgbG93IGxpbWl0LgorLyoKKyAqIEhpc3RvZ3JhbSBwcm92aWRlcyBhIHdheSB0byBzdG9yZSBudW1lcmljIGRhdGEgaW4gaGlzdG9ncmFtIGZvcm1hdCBhbmQgcmVhZCBpdCBhcyBhIHNlcmlhbGl6ZWQKKyAqIHN0cmluZy4gVGhlIHRlcm1zICJiaW4iIGFuZCAiYnVja2V0IiBhcmUgdXNlZCBpbnRlcmNoYW5nZWFibHkuCisgKgorICogVGhpcyBjbGFzcyBpcyBub3QgdGhyZWFkLXNhZmUuCisgKi8KK2NsYXNzIEhpc3RvZ3JhbSB7CitwdWJsaWM6CisgICAgc3RydWN0IENvbmZpZyB7CisgICAgICAgIGNvbnN0IGRvdWJsZSBiaW5TaXplOyAgIC8vIFRPRE8gdGVtcGxhdGUgdHlwZQorICAgICAgICBjb25zdCBzaXplX3QgbnVtQmluczsKKyAgICAgICAgY29uc3QgZG91YmxlIGxvdzsgICAgICAgLy8gVE9ETyB0ZW1wbGF0ZSB0eXBlCisgICAgfTsKKworICAgIC8vIEhpc3RvZ3JhbXMgYXJlIGNvbnN0cnVjdGVkIHdpdGggZml4ZWQgY29uZmlndXJhdGlvbiBudW1iZXJzLiBEeW5hbWljIGNvbmZpZ3VyYXRpb24gYmFzZWQKKyAgICAvLyB0aGUgZGF0YSBpcyBwb3NzaWJsZSBidXQgY29tcGxleCBiZWNhdXNlCisgICAgLy8gLSBkYXRhIHBvaW50cyBhcmUgYWRkZWQgb25lIGJ5IG9uZSwgbm90IHByb2Nlc3NlZCBhcyBhIGJhdGNoLgorICAgIC8vIC0gSGlzdG9ncmFtcyB3aXRoIGRpZmZlcmVudCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlIHRyaWNreSB0byBhZ2dyZWdhdGUsIGFuZCB0aGV5CisgICAgLy8gICB3aWxsIG5lZWQgdG8gYmUgYWdncmVnYXRlZCBhdCB0aGUgTWVkaWEgTWV0cmljcyBjbG91ZCBzaWRlLgorICAgIC8vIC0gbm90IHByb3ZpZGluZyBsaW1pdHMgdGhlb3JldGljYWxseSBhbGxvd3MgZm9yIGluZmluaXRlIG51bWJlciBvZiBidWNrZXRzLgorCisgICAgLyoqCisgICAgICogXGJyaWVmIENyZWF0ZXMgYSBIaXN0b2dyYW0gb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtIGJpblNpemUgdGhlIHdpZHRoIG9mIGVhY2ggYmluIG9mIHRoZSBoaXN0b2dyYW0sIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAuCisgICAgICogICAgICAgICAgICAgICAgVW5pdHMgYXJlIHdoYXRldmVyIGRhdGEgdGhlIGNhbGxlciBkZWNpZGVzIHRvIHN0b3JlLgorICAgICAqIFxwYXJhbSBudW1CaW5zIHRoZSBudW1iZXIgb2YgYmlucyBkZXNpcmVkIGluIHRoZSBoaXN0b2dyYW0gcmFuZ2UsIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAuCisgICAgICogXHBhcmFtIGxvdyAgICAgdGhlIGxvd2VyIGJvdW5kIG9mIHRoZSBoaXN0b2dyYW0gYnVja2V0IHZhbHVlcy4KKyAgICAgKiAgICAgICAgICAgICAgICBVbml0cyBhcmUgd2hhdGV2ZXIgZGF0YSB0aGUgY2FsbGVyIGRlY2lkZXMgdG8gc3RvcmUuCisgICAgICogICAgICAgICAgICAgICAgTm90ZSB0aGF0IHRoZSB1cHBlciBib3VuZCBjYW4gYmUgY2FsY3VsYXRlZCBieSB0aGUgZm9sbG93aW5nOgorICAgICAqICAgICAgICAgICAgICAgICAgdXBwZXIgPSBsb3dlciArIGJpblNpemUgKiBudW1CaW5zLgorICAgICAqLworICAgIEhpc3RvZ3JhbShkb3VibGUgYmluU2l6ZSwgc2l6ZV90IG51bUJpbnMsIGRvdWJsZSBsb3cgPSAwLikKKyAgICAgICAgOiBtQmluU2l6ZShiaW5TaXplKSwgbU51bUJpbnMobnVtQmlucyksIG1Mb3cobG93KSwgbUJpbnMobU51bUJpbnMgKyAyKSB7fQorCisgICAgSGlzdG9ncmFtKGNvbnN0IENvbmZpZyAmYykKKyAgICAgICAgOiBIaXN0b2dyYW0oYy5iaW5TaXplLCBjLm51bUJpbnMsIGMubG93KSB7fQorCisgICAgLyoqCisgICAgICogXGJyaWVmIEFkZCBhIGRhdGEgcG9pbnQgdG8gdGhlIGhpc3RvZ3JhbS4gVGhlIHZhbHVlIG9mIHRoZSBkYXRhIHBvaW50CisgICAgICogICAgICAgIGlzIHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgdGhlIGJpbiBzaXplIChiZWZvcmUgYWNjb3VudGluZworICAgICAqICAgICAgICBmb3IgdGhlIGxvd2VyIGJvdW5kIG9mZnNldCwgd2hpY2ggbWF5IG5vdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBiaW4gc2l6ZSkuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBkYXRhIHBvaW50IHRvIGFkZC4KKyAgICAgKi8KKyAgICB2b2lkIGFkZChkb3VibGUgdmFsdWUpOworCisgICAgLyoqCisgICAgICogXGJyaWVmIFJlbW92ZXMgYWxsIGRhdGEgcG9pbnRzIGZyb20gdGhlIGhpc3RvZ3JhbS4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyKCk7CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGRhdGEgcG9pbnRzIGFkZGVkIHRvIHRoZSBoaXN0b2dyYW0uCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgZGF0YSBwb2ludHMgaW4gdGhlIGhpc3RvZ3JhbS4KKyAgICAgKi8KKyAgICB1aW50NjRfdCB0b3RhbENvdW50KCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgU2VyaWFsaXplcyB0aGUgaGlzdG9ncmFtIGludG8gYSBzdHJpbmcuIFRoZSBmb3JtYXQgaXMgY2hvc2VuIHRvIGJlIGNvbXBhdGlibGUgd2l0aAorICAgICAqICAgICAgICB0aGUgaGlzdG9ncmFtIHJlcHJlc2VudGF0aW9uIHRvIHNlbmQgdG8gdGhlIE1lZGlhIE1ldHJpY3Mgc2VydmljZS4KKyAgICAgKgorICAgICAqICAgICAgICBUaGUgc3RyaW5nIGlzIGFzIGZvbGxvd3M6CisgICAgICogICAgICAgICAgYmluU2l6ZSxudW1CaW5zLGxvdyx7LTF8bG93Q291bnQsLi4uLGJpbkluZGV4fGNvdW50LC4uLixudW1CaW5zfGhpZ2hDb3VudH0KKyAgICAgKgorICAgICAqICAgICAgICAtIGJpbkluZGV4IGlzIGFuIGludGVnZXIgd2l0aCAwIDw9IGJpbkluZGV4IDwgbnVtQmlucy4KKyAgICAgKiAgICAgICAgLSBjb3VudCBpcyB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHRoZSAocm91bmRlZCkgdmFsdWUKKyAgICAgKiAgICAgICAgICBsb3cgKyBiaW5TaXplICogYnVja2V0SW5kZXguCisgICAgICogICAgICAgIC0gbG93Q291bnQgaXMgdGhlIG51bWJlciBvZiAocm91bmRlZCkgdmFsdWVzIGxlc3MgdGhhbiBsb3cuCisgICAgICogICAgICAgIC0gaGlnaENvdW50IGlzIHRoZSBudW1iZXIgb2YgKHJvdW5kZWQpIHZhbHVlcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8KKyAgICAgKiAgICAgICAgICBsb3cgKyBiaW5TaXplICogbnVtQmlucy4KKyAgICAgKiAgICAgICAgLSBhIGJpbkluZGV4IG1heSBiZSBza2lwcGVkIGlmIGl0cyBjb3VudCBpcyAwLgorICAgICAqCisgICAgICogXHJldHVybiB0aGUgaGlzdG9ncmFtIHNlcmlhbGl6ZWQgYXMgYSBzdHJpbmcuCisgICAgICovCisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKKworICAgIC8vIERyYXcgbG9nIHNjYWxlIHNpZGV3YXlzIGhpc3RvZ3JhbSBhcyBBU0NJSSBhcnQgYW5kIHN0b3JlIGFzIGEgc3RkOjpzdHJpbmcuCisgICAgLy8gRW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGlmIHRvdGFsQ291bnQoKSA9PSAwLgorICAgIHN0ZDo6c3RyaW5nIGFzY2lpQXJ0U3RyaW5nKHNpemVfdCBpbmRlbnQgPSAwKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICAvLyBIaXN0b2dyYW0gdmVyc2lvbiBudW1iZXIuCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga1ZlcnNpb24gPSAxOworCisgICAgY29uc3QgZG91YmxlIG1CaW5TaXplOyAgICAgICAgICAvLyBTaXplIG9mIGVhY2ggYnVja2V0CisgICAgY29uc3Qgc2l6ZV90IG1OdW1CaW5zOyAgICAgICAgICAvLyBOdW1iZXIgb2YgYnVja2V0cyBpbiByYW5nZSAoZXhjbHVkZXMgbG93IGFuZCBoaWdoKQorICAgIGNvbnN0IGRvdWJsZSBtTG93OyAgICAgICAgICAgICAgLy8gTG93ZXIgYm91bmQgb2YgdmFsdWVzCisKKyAgICAvLyBEYXRhIHN0cnVjdHVyZSB0byBzdG9yZSB0aGUgYWN0dWFsIGhpc3RvZ3JhbS4gQ291bnRzIG9mIGJpbiB2YWx1ZXMgbGVzcyB0aGFuIG1Mb3cKKyAgICAvLyBhcmUgc3RvcmVkIGluIG1CaW5zWzBdLiBCaW4gaW5kZXggaSBjb3JyZXNwb25kcyB0byBtQmluc1tpKzFdLiBDb3VudHMgb2YgYmluIHZhbHVlcworICAgIC8vID49IGhpZ2ggYXJlIHN0b3JlZCBpbiBtQmluc1ttTnVtQmlucyArIDFdLgorICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBtQmluczsKKworICAgIHVpbnQ2NF90IG1Ub3RhbENvdW50ID0gMDsgICAgICAgLy8gVG90YWwgbnVtYmVyIG9mIHZhbHVlcyByZWNvcmRlZAorfTsKKworLy8gVGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcyBjbGFzcyBQZXJmb3JtYW5jZUFuYWx5c2lzLCBidXQgUGVyZm9ybWFuY2VBbmFseXNpcworLy8gYWxzbyBkb2VzIHNvbWUgYWRkaXRpb25hbCBhbmFseXppbmcgb2YgZGF0YSwgd2hpbGUgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzdHJ1Y3QgaXMKKy8vIHRvIGhvbGQgZGF0YS4KK3N0cnVjdCBQZXJmb3JtYW5jZURhdGEgeworICAgIC8vIFRPRE8gdGhlIEhpc3RvZ3JhbTo6Q29uZmlnIG51bWJlcnMgYmVsb3cgYXJlIGZvciBGYXN0TWl4ZXIuCisgICAgLy8gU3BlY2lmeSBkaWZmZXJlbnQgbnVtYmVycyBmb3Igb3RoZXIgdGhyZWFkIHR5cGVzLgorCisgICAgLy8gVmFsdWVzIGJhc2VkIG9uIG1VbmRlcnJ1bk5zIGFuZCBtT3ZlcnJ1bk5zIGluIEZhc3RNaXhlci5jcHAgZm9yIGZyYW1lQ291bnQgPSAxOTIKKyAgICAvLyBhbmQgbVNhbXBsZVJhdGUgPSA0ODAwMCwgd2hpY2ggY29ycmVzcG9uZCB0byAyIGFuZCA3IHNlY29uZHMuCisgICAgc3RhdGljIGNvbnN0ZXhwciBIaXN0b2dyYW06OkNvbmZpZyBrV29ya0NvbmZpZyA9IHsgMC4yNSwgMjAsIDIufTsKKworICAgIC8vIFZhbHVlcyBiYXNlZCBvbiB0cmlhbCBhbmQgZXJyb3IgbG9nZ2luZy4gTmVlZCBhIGJldHRlciB3YXkgdG8gZGV0ZXJtaW5lCisgICAgLy8gYmluIHNpemUgYW5kIGxvd2VyL3VwcGVyIGxpbWl0cy4KKyAgICBzdGF0aWMgY29uc3RleHByIEhpc3RvZ3JhbTo6Q29uZmlnIGtMYXRlbmN5Q29uZmlnID0geyAyLiwgMTAsIDEwLn07CisKKyAgICAvLyBWYWx1ZXMgYmFzZWQgb24gdHJpYWwgYW5kIGVycm9yIGxvZ2dpbmcuIE5lZWQgYSBiZXR0ZXIgd2F5IHRvIGRldGVybWluZQorICAgIC8vIGJpbiBzaXplIGFuZCBsb3dlci91cHBlciBsaW1pdHMuCisgICAgc3RhdGljIGNvbnN0ZXhwciBIaXN0b2dyYW06OkNvbmZpZyBrV2FybXVwQ29uZmlnID0geyA1LiwgMTAsIDEwLn07CisKKyAgICBOQkxvZzo6dGhyZWFkX2luZm9fdCB0aHJlYWRJbmZve307CisgICAgTkJMb2c6OnRocmVhZF9wYXJhbXNfdCB0aHJlYWRQYXJhbXN7fTsKKworICAgIC8vIFBlcmZvcm1hbmNlIERhdGEKKyAgICBIaXN0b2dyYW0gd29ya0hpc3R7a1dvcmtDb25maWd9OworICAgIEhpc3RvZ3JhbSBsYXRlbmN5SGlzdHtrTGF0ZW5jeUNvbmZpZ307CisgICAgSGlzdG9ncmFtIHdhcm11cEhpc3R7a1dhcm11cENvbmZpZ307CisgICAgaW50NjRfdCB1bmRlcnJ1bnMgPSAwOworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNYXhTbmFwc2hvdHNUb1N0b3JlID0gMjU2OworICAgIHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPE5CTG9nOjpFdmVudCwgaW50NjRfdCAvKnRpbWVzdGFtcCovPj4gc25hcHNob3RzOworICAgIGludDY0X3Qgb3ZlcnJ1bnMgPSAwOworICAgIG5zZWNzX3QgYWN0aXZlID0gMDsKKyAgICBuc2Vjc190IHN0YXJ0e3N5c3RlbVRpbWUoKX07CisKKyAgICAvLyBSZXNldCB0aGUgcGVyZm9ybWFuY2UgZGF0YS4gVGhpcyBkb2VzIG5vdCByZXByZXNlbnQgYSB0aHJlYWQgc3RhdGUgY2hhbmdlLgorICAgIC8vIFRocmVhZCBpbmZvIGlzIG5vdCByZXNldCBoZXJlIGJlY2F1c2UgdGhlIGRhdGEgaXMgbWVhbnQgdG8gYmUgYSBjb250aW51YXRpb24gb2YgdGhlIHRocmVhZAorICAgIC8vIHRoYXQgc3RydWN0IFBlcmZvcm1hbmNlRGF0YSBpcyBhc3NvY2lhdGVkIHdpdGguCisgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgd29ya0hpc3QuY2xlYXIoKTsKKyAgICAgICAgbGF0ZW5jeUhpc3QuY2xlYXIoKTsKKyAgICAgICAgd2FybXVwSGlzdC5jbGVhcigpOworICAgICAgICB1bmRlcnJ1bnMgPSAwOworICAgICAgICBvdmVycnVucyA9IDA7CisgICAgICAgIGFjdGl2ZSA9IDA7CisgICAgICAgIHN0YXJ0ID0gc3lzdGVtVGltZSgpOworICAgIH0KKworICAgIC8vIFJldHVybiB0cnVlIGlmIHBlcmZvcm1hbmNlIGRhdGEgaGFzIG5vdCBiZWVuIHJlY29yZGVkIHlldCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGJvb2wgZW1wdHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiB3b3JrSGlzdC50b3RhbENvdW50KCkgPT0gMCAmJiBsYXRlbmN5SGlzdC50b3RhbENvdW50KCkgPT0gMAorICAgICAgICAgICAgICAgICYmIHdhcm11cEhpc3QudG90YWxDb3VudCgpID09IDAgJiYgdW5kZXJydW5zID09IDAgJiYgb3ZlcnJ1bnMgPT0gMAorICAgICAgICAgICAgICAgICYmIGFjdGl2ZSA9PSAwOworICAgIH0KK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKIGNsYXNzIFBlcmZvcm1hbmNlQW5hbHlzaXM7CiAKIC8vIGEgbWFwIG9mIFBlcmZvcm1hbmNlQW5hbHlzaXMgaW5zdGFuY2VzCkBAIC04MCw3ICsyNDIsNyBAQAogICAgIHN0ZDo6ZGVxdWU8dGltZXN0YW1wPiBtUGVha1RpbWVzdGFtcHM7CiAKICAgICAvLyBzdG9yZXMgYnVmZmVyIHBlcmlvZCBoaXN0b2dyYW1zIHdpdGggdGltZXN0YW1wIG9mIGZpcnN0IHNhbXBsZQotICAgIHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdG9ncmFtPj4gbUhpc3RzOworICAgIHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdD4+IG1IaXN0czsKIAogICAgIC8vIFBhcmFtZXRlcnMgdXNlZCB3aGVuIGRldGVjdGluZyBvdXRsaWVycwogICAgIHN0cnVjdCBCdWZmZXJQZXJpb2QgewpAQCAtMTE5LDggKzI4MSw3IEBACiB2b2lkIGR1bXAoaW50IGZkLCBpbnQgaW5kZW50LCBQZXJmb3JtYW5jZUFuYWx5c2lzTWFwICZ0aHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzKTsKIHZvaWQgZHVtcExpbmUoaW50IGZkLCBpbnQgaW5kZW50LCBjb25zdCBTdHJpbmc4ICZib2R5KTsKIAotfSAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKLQorfSAgIC8vIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZQogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9QRVJGT1JNQU5DRUFOQUxZU0lTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUmVhZGVyLmggYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1JlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0OTVlOGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1JlYWRlci5oCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX05CTE9HX1JFQURFUl9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfTkJMT0dfUkVBREVSX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKworI2luY2x1ZGUgPG1lZGlhL25ibG9nL0VudHJ5Lmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRXZlbnRzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCitjbGFzcyBhdWRpb191dGlsc19maWZvOworY2xhc3MgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXI7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSU1lbW9yeTsKK2NsYXNzIFN0cmluZzg7CisKK25hbWVzcGFjZSBOQkxvZyB7CisKK3N0cnVjdCBTaGFyZWQ7CisKKy8vIE5CTG9nIFJlYWRlciBBUEkKKworY2xhc3MgU25hcHNob3Q7ICAgICAvLyBGb3J3YXJkIGRlY2xhcmF0aW9uIG5lZWRlZCBmb3IgUmVhZGVyOjpnZXRTbmFwc2hvdCgpCisKK2NsYXNzIFJlYWRlciA6IHB1YmxpYyBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICAvLyBJbnB1dCBwYXJhbWV0ZXIgJ3NpemUnIGlzIHRoZSBkZXNpcmVkIHNpemUgb2YgdGhlIHRpbWVsaW5lIGluIGJ5dGUgdW5pdHMuCisgICAgLy8gVGhlIHNpemUgb2YgdGhlIHNoYXJlZCBtZW1vcnkgbXVzdCBiZSBhdCBsZWFzdCBUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplKS4KKyAgICBSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSwgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpOworICAgIFJlYWRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUsIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKTsKKyAgICB+UmVhZGVyKCkgb3ZlcnJpZGU7CisKKyAgICAvLyBnZXQgc25hcHNob3Qgb2YgcmVhZGVycyBmaWZvIGJ1ZmZlciwgZWZmZWN0aXZlbHkgY29uc3VtaW5nIHRoZSBidWZmZXIKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IGdldFNuYXBzaG90KGJvb2wgZmx1c2ggPSB0cnVlKTsKKyAgICBib29sICAgICBpc0lNZW1vcnkoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnkpIGNvbnN0OworICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KKworcHJpdmF0ZToKKyAgICAvLyBBbW91bnQgb2YgdHJpZXMgZm9yIHJlYWRlciB0byBjYXRjaCB1cCB3aXRoIHdyaXRlciBpbiBnZXRTbmFwc2hvdCgpLgorICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtNYXhPYnRhaW5UcmllcyA9IDM7CisKKyAgICAvLyBpbnZhbGlkQmVnaW5UeXBlcyBhbmQgaW52YWxpZEVuZFR5cGVzIGFyZSB1c2VkIHRvIGFsaWduIHRoZSBTbmFwc2hvdDo6YmVnaW4oKSBhbmQKKyAgICAvLyBTbmFwc2hvdDo6ZW5kKCkgRW50cnlJdGVyYXRvcnMgdG8gdmFsaWQgZW50cmllcy4KKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PEV2ZW50PiBpbnZhbGlkQmVnaW5UeXBlczsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PEV2ZW50PiBpbnZhbGlkRW5kVHlwZXM7CisKKyAgICAvLyBkZWNsYXJlZCBhcyBjb25zdCBiZWNhdXNlIGF1ZGlvX3V0aWxzX2ZpZm8oKSBjb25zdHJ1Y3RvcgorICAgIHNwPElNZW1vcnk+IG1JTWVtb3J5OyAgICAgICAvLyByZWYtY291bnRlZCB2ZXJzaW9uLCBhc3NpZ25lZCBvbmx5IGluIGNvbnN0cnVjdG9yCisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBtTmFtZTsgICAgICAgICAgICAvLyBuYW1lIG9mIHJlYWRlciAoYWN0dWFsbHkgbmFtZSBvZiB3cml0ZXIpCisgICAgLypjb25zdCovIFNoYXJlZCogY29uc3QgbVNoYXJlZDsgICAgLy8gcmF3IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeSwgYWN0dWFsbHkgY29uc3QgYnV0IG5vdAorICAgIGF1ZGlvX3V0aWxzX2ZpZm8gKiBjb25zdCBtRmlmbzsgICAgICAgICAgICAgICAgIC8vIEZJRk8gaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vbi1OVUxMIHVubGVzcyBjb25zdHJ1Y3RvciBmYWlscworICAgIGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyICogY29uc3QgbUZpZm9SZWFkZXI7ICAgIC8vIHVzZWQgdG8gcmVhZCBmcm9tIEZJRk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uLU5VTEwgdW5sZXNzIGNvbnN0cnVjdG9yIGZhaWxzCisKKyAgICAvLyBTZWFyY2hlcyBmb3IgdGhlIGxhc3QgdmFsaWQgZW50cnkgaW4gdGhlIHJhbmdlIFtmcm9udCwgYmFjaykKKyAgICAvLyBiYWNrIGhhcyB0byBiZSBlbnRyeS1hbGlnbmVkLiBSZXR1cm5zIG51bGxwdHIgaWYgbm9uZSBlbmNvbnVudGVyZWQuCisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgKmZpbmRMYXN0VmFsaWRFbnRyeShjb25zdCB1aW50OF90ICpmcm9udCwgY29uc3QgdWludDhfdCAqYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PEV2ZW50PiAmaW52YWxpZFR5cGVzKTsKK307CisKKy8vIEEgc25hcHNob3Qgb2YgYSByZWFkZXJzIGJ1ZmZlcgorLy8gVGhpcyBpcyByYXcgZGF0YS4gTm8gYW5hbHlzaXMgaGFzIGJlZW4gZG9uZSBvbiBpdAorY2xhc3MgU25hcHNob3QgeworcHVibGljOgorICAgIH5TbmFwc2hvdCgpIHsgZGVsZXRlW10gbURhdGE7IH0KKworICAgIC8vIGFtb3VudCBvZiBkYXRhIGxvc3QgKGdpdmVuIGJ5IGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyKQorICAgIHNpemVfdCBsb3N0KCkgY29uc3QgeyByZXR1cm4gbUxvc3Q7IH0KKworICAgIC8vIGl0ZXJhdG9yIHRvIGJlZ2lubmluZyBvZiByZWFkYWJsZSBzZWdtZW50IG9mIHNuYXBzaG90CisgICAgLy8gZGF0YSBiZXR3ZWVuIGJlZ2luIGFuZCBlbmQgaGFzIHZhbGlkIGVudHJpZXMKKyAgICBFbnRyeUl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gbUJlZ2luOyB9CisKKyAgICAvLyBpdGVyYXRvciB0byBlbmQgb2YgcmVhZGFibGUgc2VnbWVudCBvZiBzbmFwc2hvdAorICAgIEVudHJ5SXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gbUVuZDsgfQorCitwcml2YXRlOgorICAgIFNuYXBzaG90KCkgPSBkZWZhdWx0OworICAgIGV4cGxpY2l0IFNuYXBzaG90KHNpemVfdCBidWZmZXJTaXplKSA6IG1EYXRhKG5ldyB1aW50OF90W2J1ZmZlclNpemVdKSB7fQorICAgIGZyaWVuZCBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IFJlYWRlcjo6Z2V0U25hcHNob3QoYm9vbCBmbHVzaCk7CisKKyAgICB1aW50OF90ICogY29uc3QgICAgICAgbURhdGEgPSBudWxscHRyOworICAgIHNpemVfdCAgICAgICAgICAgICAgICBtTG9zdCA9IDA7CisgICAgRW50cnlJdGVyYXRvciAgICAgICAgIG1CZWdpbjsKKyAgICBFbnRyeUl0ZXJhdG9yICAgICAgICAgbUVuZDsKK307CisKKy8vIFRPRE8gbW92ZSB0aGlzIHRvIE1lZGlhTG9nU2VydmljZT8KK2NsYXNzIER1bXBSZWFkZXIgOiBwdWJsaWMgTkJMb2c6OlJlYWRlciB7CitwdWJsaWM6CisgICAgRHVtcFJlYWRlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplLCBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkKKyAgICAgICAgOiBSZWFkZXIoc2hhcmVkLCBzaXplLCBuYW1lKSB7fQorICAgIER1bXBSZWFkZXIoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnksIHNpemVfdCBzaXplLCBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkKKyAgICAgICAgOiBSZWFkZXIoaU1lbW9yeSwgc2l6ZSwgbmFtZSkge30KKyAgICB2b2lkIGR1bXAoaW50IGZkLCBzaXplX3QgaW5kZW50ID0gMCk7Citwcml2YXRlOgorICAgIHZvaWQgaGFuZGxlQXV0aG9yKGNvbnN0IEFic3RyYWN0RW50cnkmIGZtdEVudHJ5IF9fdW51c2VkLCBTdHJpbmc4KiBib2R5IF9fdW51c2VkKSB7fQorICAgIEVudHJ5SXRlcmF0b3IgaGFuZGxlRm9ybWF0KGNvbnN0IEZvcm1hdEVudHJ5ICZmbXRFbnRyeSwgU3RyaW5nOCAqdGltZXN0YW1wLCBTdHJpbmc4ICpib2R5KTsKKworICAgIHN0YXRpYyB2b2lkICAgIGFwcGVuZEludChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKTsKKyAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRGbG9hdChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKTsKKyAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRQSUQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7CisgICAgc3RhdGljIHZvaWQgICAgYXBwZW5kVGltZXN0YW1wKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpOworCisgICAgLy8gVGhlIGJ1ZmZlckR1bXAgZnVuY3Rpb25zIGFyZSB1c2VkIGZvciBkZWJ1Z2dpbmcgb25seS4KKyAgICBzdGF0aWMgU3RyaW5nOCBidWZmZXJEdW1wKGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOworICAgIHN0YXRpYyBTdHJpbmc4IGJ1ZmZlckR1bXAoY29uc3QgRW50cnlJdGVyYXRvciAmaXQpOworfTsKKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9OQkxPR19SRUFERVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oCmluZGV4IGVjMDg0MmYuLjY0YTU3MDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaAorKysgYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmgKQEAgLTIyLDE5ICsyMiwzMyBAQAogI2luY2x1ZGUgPHZlY3Rvcj4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBUaGUgU3RyaW5nOCBjbGFzcyBpcyB1c2VkIGJ5IHJlcG9ydFBlcmZvcm1hbmNlIGZ1bmN0aW9uCi1jbGFzcyBTdHJpbmc4OwotCiBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UgewogCitzdHJ1Y3QgUGVyZm9ybWFuY2VEYXRhOworCisvLyBEdW1wcyBwZXJmb3JtYW5jZSBkYXRhIGluIGEgSlNPTiBmb3JtYXQuCit2b2lkIGR1bXBKc29uKGludCBmZCwgY29uc3Qgc3RkOjptYXA8aW50LCBQZXJmb3JtYW5jZURhdGE+JiB0aHJlYWREYXRhTWFwKTsKKworLy9EdW1wcyBwZXJmb3JtYW5jZSBkYXRhIGFzIHZpc3VhbGl6ZWQgcGxvdHMuCit2b2lkIGR1bXBQbG90cyhpbnQgZmQsIGNvbnN0IHN0ZDo6bWFwPGludCwgUGVyZm9ybWFuY2VEYXRhPiYgdGhyZWFkRGF0YU1hcCk7CisKKy8vIER1bXBzIHNuYXBzaG90cyBhdCBpbXBvcnRhbnQgZXZlbnRzIGluIHRoZSBwYXN0Lgordm9pZCBkdW1wUmV0cm8oaW50IGZkLCBjb25zdCBzdGQ6Om1hcDxpbnQsIFBlcmZvcm1hbmNlRGF0YT4mIHRocmVhZERhdGFNYXApOworCisvLyBTZW5kIG9uZSB0aHJlYWQncyBkYXRhIHRvIG1lZGlhIG1ldHJpY3MsIGlmIHRoZSBwZXJmb3JtYW5jZSBkYXRhIGlzIG5vbnRyaXZpYWwgKGkuZS4gbm90CisvLyBhbGwgemVybyB2YWx1ZXMpLiBSZXR1cm4gdHJ1ZSBpZiBkYXRhIHdhcyBzZW50LCBmYWxzZSBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIHdyaXRlCisvLyBvciBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB3cml0aW5nLgorYm9vbCBzZW5kVG9NZWRpYU1ldHJpY3MoY29uc3QgUGVyZm9ybWFuY2VEYXRhJiBkYXRhKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogY29uc3RleHByIGludCBrTXNQZXJTZWMgPSAxMDAwOwogY29uc3RleHByIGludCBrU2VjUGVyTWluID0gNjA7CiAKIGNvbnN0ZXhwciBpbnQga0ppZmZ5UGVyTXMgPSAxMDsgLy8gdGltZSB1bml0IGZvciBoaXN0b2dyYW0gYXMgYSBtdWx0aXBsZSBvZiBtaWxsaXNlY29uZHMKIAogLy8gc3RvcmVzIGEgaGlzdG9ncmFtOiBrZXk6IG9ic2VydmVkIGJ1ZmZlciBwZXJpb2QgKG11bHRpcGxlIG9mIGppZmZ5KS4gdmFsdWU6IGNvdW50Ci11c2luZyBIaXN0b2dyYW0gPSBzdGQ6Om1hcDxpbnQsIGludD47Cit1c2luZyBIaXN0ID0gc3RkOjptYXA8aW50LCBpbnQ+OwogCiB1c2luZyBtc0ludGVydmFsID0gZG91YmxlOwogdXNpbmcgamlmZnlJbnRlcnZhbCA9IGRvdWJsZTsKQEAgLTU3LDEzICs3MSwxMiBAQAogfQogCiAvLyBXcml0ZXMgb3V0bGllciBpbnRlcnZhbHMsIHRpbWVzdGFtcHMsIHBlYWtzIHRpbWVzdGFtcHMsIGFuZCBoaXN0b2dyYW1zIHRvIGEgZmlsZS4KLXZvaWQgd3JpdGVUb0ZpbGUoY29uc3Qgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dGltZXN0YW1wLCBIaXN0b2dyYW0+PiAmaGlzdHMsCit2b2lkIHdyaXRlVG9GaWxlKGNvbnN0IHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdD4+ICZoaXN0cywKICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8bXNJbnRlcnZhbCwgdGltZXN0YW1wPj4gJm91dGxpZXJEYXRhLAogICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmRlcXVlPHRpbWVzdGFtcD4gJnBlYWtUaW1lc3RhbXBzLAogICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoga0RpcmVjdG9yeSwgYm9vbCBhcHBlbmQsIGludCBhdXRob3IsIGxvZ19oYXNoX3QgaGFzaCk7CiAKLX0gLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCi0KK30gICAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfUkVQT1JUUEVSRk9STUFOQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9UaW1lbGluZS5oIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9UaW1lbGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZjBjZmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1RpbWVsaW5lLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9OQkxPR19USU1FTElORV9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfTkJMT0dfVElNRUxJTkVfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9maWZvX2luZGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgTkJMb2cgeworCisvLyBMb2NhdGVkIGluIHNoYXJlZCBtZW1vcnksIG11c3QgYmUgUE9ELgorLy8gRXhhY3RseSBvbmUgcHJvY2VzcyBtdXN0IGV4cGxpY2l0bHkgY2FsbCB0aGUgY29uc3RydWN0b3Igb3IgdXNlIHBsYWNlbWVudCBuZXcuCisvLyBTaW5jZSB0aGlzIGlzIGEgUE9ELCB0aGUgZGVzdHJ1Y3RvciBpcyBlbXB0eSBhbmQgdW5uZWNlc3NhcnkgdG8gY2FsbCBpdCBleHBsaWNpdGx5Lgorc3RydWN0IFNoYXJlZCB7CisgICAgU2hhcmVkKCkgLyogbVJlYXIgaW5pdGlhbGl6ZWQgdmlhIGRlZmF1bHQgY29uc3RydWN0b3IgKi8ge30KKyAgICB+U2hhcmVkKCkge30KKworICAgIGF1ZGlvX3V0aWxzX2ZpZm9faW5kZXggIG1SZWFyOyAgLy8gaW5kZXggb25lIGJ5dGUgcGFzdCB0aGUgZW5kIG9mIG1vc3QgcmVjZW50IEVudHJ5CisgICAgY2hhciAgICBtQnVmZmVyWzBdOyAgICAgICAgICAgICAvLyBjaXJjdWxhciBidWZmZXIgZm9yIGVudHJpZXMKK307CisKKy8vIEZJWE1FIFRpbWVsaW5lIHdhcyBpbnRlbmRlZCB0byB3cmFwIFdyaXRlciBhbmQgUmVhZGVyLCBidXQgaXNuJ3QgYWN0dWFsbHkgdXNlZCB5ZXQuCisvLyBGb3Igbm93IGl0IGlzIGp1c3QgYSBuYW1lc3BhY2UgZm9yIHNoYXJlZFNpemUoKS4KK2NsYXNzIFRpbWVsaW5lIDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorI2lmIDAKKyAgICBUaW1lbGluZShzaXplX3Qgc2l6ZSwgdm9pZCAqc2hhcmVkID0gTlVMTCk7CisgICAgdmlydHVhbCB+VGltZWxpbmUoKTsKKyNlbmRpZgorCisgICAgLy8gSW5wdXQgcGFyYW1ldGVyICdzaXplJyBpcyB0aGUgZGVzaXJlZCBzaXplIG9mIHRoZSB0aW1lbGluZSBpbiBieXRlIHVuaXRzLgorICAgIC8vIFJldHVybnMgdGhlIHNpemUgcm91bmRlZCB1cCB0byBhIHBvd2VyLW9mLTIsIHBsdXMgdGhlIGNvbnN0YW50IHNpemUgb3ZlcmhlYWQgZm9yIGluZGljZXMuCisgICAgc3RhdGljIHNpemVfdCBzaGFyZWRTaXplKHNpemVfdCBzaXplKTsKKworI2lmIDAKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzICAgIFdyaXRlcjsKKyAgICBmcmllbmQgY2xhc3MgICAgUmVhZGVyOworCisgICAgY29uc3Qgc2l6ZV90ICAgIG1TaXplOyAgICAgIC8vIGNpcmN1bGFyIGJ1ZmZlciBzaXplIGluIGJ5dGVzLCBtdXN0IGJlIGEgcG93ZXIgb2YgMgorICAgIGJvb2wgICAgICAgICAgICBtT3duOyAgICAgICAvLyB3aGV0aGVyIEkgb3duIHRoZSBtZW1vcnkgYXQgbVNoYXJlZAorICAgIFNoYXJlZCogY29uc3QgICBtU2hhcmVkOyAgICAvLyBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnkKKyNlbmRpZgorfTsKKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9OQkxPR19USU1FTElORV9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1dyaXRlci5oIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9Xcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmNkMzk2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9Xcml0ZXIuaApAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9OQkxPR19XUklURVJfSAorI2RlZmluZSBBTkRST0lEX01FRElBX05CTE9HX1dSSVRFUl9ICisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRXZlbnRzLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK2NsYXNzIGF1ZGlvX3V0aWxzX2ZpZm87CitjbGFzcyBhdWRpb191dGlsc19maWZvX3dyaXRlcjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJTWVtb3J5OworCituYW1lc3BhY2UgTkJMb2cgeworCitjbGFzcyBFbnRyeTsKK3N0cnVjdCBTaGFyZWQ7CisKKy8vIE5CTG9nIFdyaXRlciBJbnRlcmZhY2UKKworLy8gV3JpdGVyIGlzIHRocmVhZC1zYWZlIHdpdGggcmVzcGVjdCB0byBSZWFkZXIsIGJ1dCBub3Qgd2l0aCByZXNwZWN0IHRvIG11bHRpcGxlIHRocmVhZHMKKy8vIGNhbGxpbmcgV3JpdGVyIG1ldGhvZHMuICBJZiB5b3UgbmVlZCBtdWx0aS10aHJlYWQgc2FmZXR5IGZvciB3cml0aW5nLCB1c2UgTG9ja2VkV3JpdGVyLgorY2xhc3MgV3JpdGVyIDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorICAgIFdyaXRlcigpID0gZGVmYXVsdDsgICAgICAgICAvLyBkdW1teSBub3AgaW1wbGVtZW50YXRpb24gd2l0aG91dCBzaGFyZWQgbWVtb3J5CisKKyAgICAvLyBJbnB1dCBwYXJhbWV0ZXIgJ3NpemUnIGlzIHRoZSBkZXNpcmVkIHNpemUgb2YgdGhlIHRpbWVsaW5lIGluIGJ5dGUgdW5pdHMuCisgICAgLy8gVGhlIHNpemUgb2YgdGhlIHNoYXJlZCBtZW1vcnkgbXVzdCBiZSBhdCBsZWFzdCBUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplKS4KKyAgICBXcml0ZXIodm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk7CisgICAgV3JpdGVyKGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5LCBzaXplX3Qgc2l6ZSk7CisKKyAgICB+V3JpdGVyKCkgb3ZlcnJpZGU7CisKKyAgICAvLyBGSVhNRSBuZWVkcyBjb21tZW50cywgYW5kIHNvbWUgc2hvdWxkIGJlIHByaXZhdGUKKyAgICB2b2lkICAgIGxvZyhjb25zdCBjaGFyICpzdHJpbmcpOworICAgIHZvaWQgICAgbG9nZihjb25zdCBjaGFyICpmbXQsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworICAgIHZvaWQgICAgbG9nVGltZXN0YW1wKCk7CisgICAgdm9pZCAgICBsb2dGb3JtYXQoY29uc3QgY2hhciAqZm10LCBsb2dfaGFzaF90IGhhc2gsIC4uLik7CisgICAgdm9pZCAgICBsb2dFdmVudEhpc3RUcyhFdmVudCBldmVudCwgbG9nX2hhc2hfdCBoYXNoKTsKKworICAgIC8vIExvZyBkYXRhIHJlbGF0ZWQgdG8gRXZlbnQgRS4gU2VlIHRoZSBldmVudC10by10eXBlIG1hcHBpbmcgZm9yIHRoZSB0eXBlIG9mIGRhdGEKKyAgICAvLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBldmVudC4gRm9yIGV4YW1wbGUsIGlmIHlvdSBzZWUgYSBtYXBwaW5nIHN0YXRlbWVudDoKKyAgICAvLyAgICAgTUFQX1RZUEVfVE9fRVZFTlQoRSwgVCk7CisgICAgLy8gdGhlbiB0aGUgdXNhZ2Ugb2YgdGhpcyBtZXRob2Qgd291bGQgYmU6CisgICAgLy8gICAgIFQgZGF0YSA9IGRvQ29tcHV0YXRpb24oKTsKKyAgICAvLyAgICAgdGxOQkxvZ1dyaXRlci0+bG9nPE5CTG9nOjpFPihkYXRhKTsKKyAgICB0ZW1wbGF0ZTxFdmVudCBFPgorICAgIHZvaWQgICAgbG9nKHR5cGVuYW1lIGdldF9tYXBwZWQ8RT46OnR5cGUgZGF0YSkgeworICAgICAgICBsb2coRSwgJmRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sICAgIGlzRW5hYmxlZCgpIGNvbnN0OworCisgICAgLy8gcmV0dXJuIHZhbHVlIGZvciBhbGwgb2YgdGhlc2UgaXMgdGhlIHByZXZpb3VzIGlzRW5hYmxlZCgpCisgICAgdmlydHVhbCBib29sICAgIHNldEVuYWJsZWQoYm9vbCBlbmFibGVkKTsgICAvLyBidXQgd29uJ3QgZW5hYmxlIGlmIG5vIHNoYXJlZCBtZW1vcnkKKyAgICBib29sICAgICAgICAgICAgZW5hYmxlKCkgIHsgcmV0dXJuIHNldEVuYWJsZWQodHJ1ZSk7IH0KKyAgICBib29sICAgICAgICAgICAgZGlzYWJsZSgpIHsgcmV0dXJuIHNldEVuYWJsZWQoZmFsc2UpOyB9CisKKyAgICBzcDxJTWVtb3J5PiAgICAgZ2V0SU1lbW9yeSgpIGNvbnN0IHsgcmV0dXJuIG1JTWVtb3J5OyB9CisKKyAgICAvLyBQdWJsaWMgbG9nZ2luZyBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGFsd2F5cyB1c2Ugb25lIG9mIHRoZQorICAgIC8vIHR3byBsb2coKSBmdW5jdGlvbiBjYWxscyBiZWxvdyB0byB3cml0ZSB0byBzaGFyZWQgbWVtb3J5LgorcHJvdGVjdGVkOgorICAgIC8vIFdyaXRlcyBhIHNpbmdsZSBFbnRyeSB0byB0aGUgRklGTyBpZiB0aGUgd3JpdGVyIGlzIGVuYWJsZWQuCisgICAgLy8gVGhpcyBpcyBwcm90ZWN0ZWQgYW5kIHZpcnR1YWwgYmVjYXVzZSBMb2NrZWRXcml0ZXIgdXNlcyBhIGxvY2sgdG8gcHJvdGVjdAorICAgIC8vIHdyaXRpbmcgdG8gdGhlIEZJRk8gYmVmb3JlIHdyaXRpbmcgdG8gdGhpcyBmdW5jdGlvbi4KKyAgICB2aXJ0dWFsIHZvaWQgbG9nKGNvbnN0IEVudHJ5ICZlbnRyeSwgYm9vbCB0cnVzdGVkID0gZmFsc2UpOworCitwcml2YXRlOgorICAgIC8vIDAgPD0gbGVuZ3RoIDw9IGtNYXhMZW5ndGgKKyAgICAvLyBMb2cgYSBzaW5nbGUgRW50cnkgd2l0aCBjb3JyZXNwb25kaW5nIGV2ZW50LCBkYXRhLCBhbmQgbGVuZ3RoLgorICAgIHZvaWQgICAgbG9nKEV2ZW50IGV2ZW50LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKTsKKworICAgIHZvaWQgICAgbG9ndmYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKTsKKworICAgIC8vIGhlbHBlciBmdW5jdGlvbnMgZm9yIGxvZ2dpbmcgcGFydHMgb2YgYSBmb3JtYXR0ZWQgZW50cnkKKyAgICB2b2lkICAgIGxvZ1N0YXJ0KGNvbnN0IGNoYXIgKmZtdCk7CisgICAgdm9pZCAgICBsb2dUaW1lc3RhbXBGb3JtYXQoKTsKKyAgICB2b2lkICAgIGxvZ1ZGb3JtYXQoY29uc3QgY2hhciAqZm10LCBsb2dfaGFzaF90IGhhc2gsIHZhX2xpc3QgYXApOworCisgICAgU2hhcmVkKiBjb25zdCAgIG1TaGFyZWR7fTsgICAgICAgICAgLy8gcmF3IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeQorICAgIHNwPElNZW1vcnk+ICAgICBtSU1lbW9yeXt9OyAgICAgICAgIC8vIHJlZi1jb3VudGVkIHZlcnNpb24sIGluaXRpYWxpemVkIGluIGNvbnN0cnVjdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZW4gY29uc3QKKyAgICBhdWRpb191dGlsc19maWZvICogY29uc3QgbUZpZm97fTsgICAgICAgICAgICAgICAvLyBGSUZPIGl0c2VsZiwgbm9uLU5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmxlc3MgY29uc3RydWN0b3IgZmFpbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBkdW1teSBjb25zdHJ1Y3RvciB1c2VkCisgICAgYXVkaW9fdXRpbHNfZmlmb193cml0ZXIgKiBjb25zdCBtRmlmb1dyaXRlcnt9OyAgLy8gdXNlZCB0byB3cml0ZSB0byBGSUZPLCBub24tTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVubGVzcyBkdW1teSBjb25zdHJ1Y3RvciB1c2VkCisgICAgYm9vbCAgICAgICAgICAgIG1FbmFibGVkID0gZmFsc2U7ICAgLy8gd2hldGhlciB0byBhY3R1YWxseSBsb2cKKworICAgIC8vIGNhY2hlZCBwaWQgYW5kIHByb2Nlc3MgbmFtZSB0byB1c2UgaW4gJXAgZm9ybWF0IHNwZWNpZmllcgorICAgIC8vIHRvdGFsIHRhZyBsZW5ndGggaXMgbVBpZFRhZ1NpemUgYW5kIHByb2Nlc3MgbmFtZSBpcyBub3QgemVybyB0ZXJtaW5hdGVkCisgICAgY2hhciAgICptUGlkVGFne307CisgICAgc2l6ZV90ICBtUGlkVGFnU2l6ZSA9IDA7Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gU2ltaWxhciB0byBXcml0ZXIsIGJ1dCBzYWZlIGZvciBtdWx0aXBsZSB0aHJlYWRzIHRvIGNhbGwgY29uY3VycmVudGx5CitjbGFzcyBMb2NrZWRXcml0ZXIgOiBwdWJsaWMgV3JpdGVyIHsKK3B1YmxpYzoKKyAgICBMb2NrZWRXcml0ZXIoKSA9IGRlZmF1bHQ7CisgICAgTG9ja2VkV3JpdGVyKHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOworCisgICAgYm9vbCAgICBpc0VuYWJsZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sICAgIHNldEVuYWJsZWQoYm9vbCBlbmFibGVkKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICAvLyBMb2NrIG5lZWRzIHRvIGJlIG9idGFpbmVkIGJlZm9yZSB3cml0aW5nIHRvIEZJRk8uCisgICAgdm9pZCBsb2coY29uc3QgRW50cnkgJmVudHJ5LCBib29sIHRydXN0ZWQgPSBmYWxzZSkgb3ZlcnJpZGU7CisKKyAgICBtdXRhYmxlIE11dGV4ICAgbUxvY2s7Cit9OworCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX05CTE9HX1dSSVRFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcAppbmRleCA5MmU3MmI5Li4yZWE1Mjg2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKQEAgLTU3Niw2ICs1NzYsNyBAQAogICAgICAgbVR1bm5lbGVkKGZhbHNlKSwKICAgICAgIG1EZXNjcmliZUNvbG9yQXNwZWN0c0luZGV4KChPTVhfSU5ERVhUWVBFKTApLAogICAgICAgbURlc2NyaWJlSERSU3RhdGljSW5mb0luZGV4KChPTVhfSU5ERVhUWVBFKTApLAorICAgICAgbURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4KChPTVhfSU5ERVhUWVBFKTApLAogICAgICAgbVN0YXRlR2VuZXJhdGlvbigwKSwKICAgICAgIG1WZW5kb3JFeHRlbnNpb25zU3RhdHVzKGtFeHRlbnNpb25zVW5jaGVja2VkKSB7CiAgICAgbWVtc2V0KCZtTGFzdEhEUlN0YXRpY0luZm8sIDAsIHNpemVvZihtTGFzdEhEUlN0YXRpY0luZm8pKTsKQEAgLTE3NDgsMjkgKzE3NDksMzIgQEAKICAgICB9CiAKICAgICBpbnQzMl90IHN0b3JlTWV0YTsKLSAgICBpZiAoZW5jb2RlcgotICAgICAgICAgICAgJiYgbXNnLT5maW5kSW50MzIoImFuZHJvaWQuX2lucHV0LW1ldGFkYXRhLWJ1ZmZlci10eXBlIiwgJnN0b3JlTWV0YSkKLSAgICAgICAgICAgICYmIHN0b3JlTWV0YSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlSW52YWxpZCkgewotICAgICAgICBJT01YOjpQb3J0TW9kZSBtb2RlOwotICAgICAgICBpZiAoc3RvcmVNZXRhID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVOYXRpdmVIYW5kbGVTb3VyY2UpIHsKLSAgICAgICAgICAgIG1vZGUgPSBJT01YOjprUG9ydE1vZGVEeW5hbWljTmF0aXZlSGFuZGxlOwotICAgICAgICB9IGVsc2UgaWYgKHN0b3JlTWV0YSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyIHx8Ci0gICAgICAgICAgICAgICAgc3RvcmVNZXRhID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlKSB7Ci0gICAgICAgICAgICBtb2RlID0gSU9NWDo6a1BvcnRNb2RlRHluYW1pY0FOV0J1ZmZlcjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgaWYgKGVuY29kZXIpIHsKKyAgICAgICAgSU9NWDo6UG9ydE1vZGUgbW9kZSA9IElPTVg6OmtQb3J0TW9kZVByZXNldEJ5dGVCdWZmZXI7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiYW5kcm9pZC5faW5wdXQtbWV0YWRhdGEtYnVmZmVyLXR5cGUiLCAmc3RvcmVNZXRhKQorICAgICAgICAgICAgICAgICYmIHN0b3JlTWV0YSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlSW52YWxpZCkgeworICAgICAgICAgICAgaWYgKHN0b3JlTWV0YSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlTmF0aXZlSGFuZGxlU291cmNlKSB7CisgICAgICAgICAgICAgICAgbW9kZSA9IElPTVg6OmtQb3J0TW9kZUR5bmFtaWNOYXRpdmVIYW5kbGU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0b3JlTWV0YSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyIHx8CisgICAgICAgICAgICAgICAgICAgIHN0b3JlTWV0YSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSkgeworICAgICAgICAgICAgICAgIG1vZGUgPSBJT01YOjprUG9ydE1vZGVEeW5hbWljQU5XQnVmZmVyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVyciA9IHNldFBvcnRNb2RlKGtQb3J0SW5kZXhJbnB1dCwgbW9kZSk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KIAotICAgICAgICB1aW50MzJfdCB1c2FnZUJpdHM7Ci0gICAgICAgIGlmIChtT01YTm9kZS0+Z2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQ29uc3VtZXJVc2FnZUJpdHMsCi0gICAgICAgICAgICAgICAgJnVzYWdlQml0cywgc2l6ZW9mKHVzYWdlQml0cykpID09IE9LKSB7Ci0gICAgICAgICAgICBpbnB1dEZvcm1hdC0+c2V0SW50MzIoCi0gICAgICAgICAgICAgICAgICAgICJ1c2luZy1zdy1yZWFkLW9mdGVuIiwgISEodXNhZ2VCaXRzICYgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOKSk7CisgICAgICAgIGlmIChtb2RlICE9IElPTVg6OmtQb3J0TW9kZVByZXNldEJ5dGVCdWZmZXIpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHVzYWdlQml0czsKKyAgICAgICAgICAgIGlmIChtT01YTm9kZS0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUNvbnN1bWVyVXNhZ2VCaXRzLAorICAgICAgICAgICAgICAgICAgICAmdXNhZ2VCaXRzLCBzaXplb2YodXNhZ2VCaXRzKSkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBpbnB1dEZvcm1hdC0+c2V0SW50MzIoCisgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmctc3ctcmVhZC1vZnRlbiIsICEhKHVzYWdlQml0cyAmIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTikpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0yMTc5LDcgKzIxODMsOCBAQAogICAgICAgICAgICAgZXJyID0gc2V0dXBHNzExQ29kZWMoZW5jb2Rlciwgc2FtcGxlUmF0ZSwgbnVtQ2hhbm5lbHMpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKSkgewotICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzID0gMCwgc2FtcGxlUmF0ZSA9IDAsIGNvbXByZXNzaW9uTGV2ZWwgPSAtMTsKKyAgICAgICAgLy8gbnVtQ2hhbm5lbHMgbmVlZHMgdG8gYmUgc2V0IHRvIHByb3Blcmx5IGNvbW11bmljYXRlIFBDTSB2YWx1ZXMuCisgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHMgPSAyLCBzYW1wbGVSYXRlID0gNDQxMDAsIGNvbXByZXNzaW9uTGV2ZWwgPSAtMTsKICAgICAgICAgaWYgKGVuY29kZXIgJiYKICAgICAgICAgICAgICAgICAoIW1zZy0+ZmluZEludDMyKCJjaGFubmVsLWNvdW50IiwgJm51bUNoYW5uZWxzKQogICAgICAgICAgICAgICAgICAgICAgICAgfHwgIW1zZy0+ZmluZEludDMyKCJzYW1wbGUtcmF0ZSIsICZzYW1wbGVSYXRlKSkpIHsKQEAgLTIyMDUsNyArMjIxMCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgZXJyID0gc2V0dXBGbGFjQ29kZWMoCi0gICAgICAgICAgICAgICAgICAgIGVuY29kZXIsIG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlLCBjb21wcmVzc2lvbkxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlciwgbnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGUsIGNvbXByZXNzaW9uTGV2ZWwsIHBjbUVuY29kaW5nKTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkgewogICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlOwpAQCAtMjIzNCw2ICsyMjM5LDE1IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBlcnIgPSBzZXR1cEVBQzNDb2RlYyhlbmNvZGVyLCBudW1DaGFubmVscywgc2FtcGxlUmF0ZSk7CiAgICAgICAgIH0KKyAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQzQpKSB7CisgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHM7CisgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiY2hhbm5lbC1jb3VudCIsICZudW1DaGFubmVscykKKyAgICAgICAgICAgICAgICB8fCAhbXNnLT5maW5kSW50MzIoInNhbXBsZS1yYXRlIiwgJnNhbXBsZVJhdGUpKSB7CisgICAgICAgICAgICBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVyciA9IHNldHVwQUM0Q29kZWMoZW5jb2RlciwgbnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGUpOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtMjMwNywxMiArMjMyMSwxNiBAQAogICAgICAgICAgICAgKHZvaWQpbUlucHV0Rm9ybWF0LT5maW5kSW50MzIoInBjbS1lbmNvZGluZyIsIChpbnQzMl90KikmY29kZWNQY21FbmNvZGluZyk7CiAgICAgICAgICAgICBtQ29udmVydGVyW2tQb3J0SW5kZXhJbnB1dF0gPSBBdWRpb0NvbnZlcnRlcjo6Q3JlYXRlKHBjbUVuY29kaW5nLCBjb2RlY1BjbUVuY29kaW5nKTsKICAgICAgICAgICAgIGlmIChtQ29udmVydGVyW2tQb3J0SW5kZXhJbnB1dF0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dEKCIlczogZW5jb2RlciAlcyBpbnB1dCBmb3JtYXQgcGNtIGVuY29kaW5nIGNvbnZlcnRlciBmcm9tICVkIHRvICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBwY21FbmNvZGluZywgY29kZWNQY21FbmNvZGluZyk7CiAgICAgICAgICAgICAgICAgbUlucHV0Rm9ybWF0LT5zZXRJbnQzMigicGNtLWVuY29kaW5nIiwgcGNtRW5jb2RpbmcpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgKHZvaWQpbU91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJwY20tZW5jb2RpbmciLCAoaW50MzJfdCopJmNvZGVjUGNtRW5jb2RpbmcpOwogICAgICAgICAgICAgbUNvbnZlcnRlcltrUG9ydEluZGV4T3V0cHV0XSA9IEF1ZGlvQ29udmVydGVyOjpDcmVhdGUoY29kZWNQY21FbmNvZGluZywgcGNtRW5jb2RpbmcpOwogICAgICAgICAgICAgaWYgKG1Db252ZXJ0ZXJba1BvcnRJbmRleE91dHB1dF0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dEKCIlczogZGVjb2RlciAlcyBvdXRwdXQgZm9ybWF0IHBjbSBlbmNvZGluZyBjb252ZXJ0ZXIgZnJvbSAlZCB0byAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgY29kZWNQY21FbmNvZGluZywgcGNtRW5jb2RpbmcpOwogICAgICAgICAgICAgICAgIG1PdXRwdXRGb3JtYXQtPnNldEludDMyKCJwY20tZW5jb2RpbmciLCBwY21FbmNvZGluZyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIzNDUsNiArMjM2MywxNyBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKK3N0YXR1c190IEFDb2RlYzo6c2V0QXVkaW9QcmVzZW50YXRpb24oaW50MzJfdCBwcmVzZW50YXRpb25JZCwgaW50MzJfdCBwcm9ncmFtSWQpIHsKKyAgICBPTVhfQVVESU9fQ09ORklHX0FORFJPSURfQVVESU9QUkVTRU5UQVRJT04gY29uZmlnOworICAgIEluaXRPTVhQYXJhbXMoJmNvbmZpZyk7CisgICAgY29uZmlnLm5QcmVzZW50YXRpb25JZCA9IChPTVhfUzMyKXByZXNlbnRhdGlvbklkOworICAgIGNvbmZpZy5uUHJvZ3JhbUlkID0gKE9NWF9TMzIpcHJvZ3JhbUlkOworICAgIHN0YXR1c190IGVyciA9IG1PTVhOb2RlLT5zZXRDb25maWcoCisgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhDb25maWdBdWRpb1ByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICZjb25maWcsIHNpemVvZihjb25maWcpKTsKKyAgICByZXR1cm4gZXJyOworfQorCiBzdGF0dXNfdCBBQ29kZWM6OnNldFByaW9yaXR5KGludDMyX3QgcHJpb3JpdHkpIHsKICAgICBpZiAocHJpb3JpdHkgPCAwKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC0yODkwLDYgKzI5MTksMzggQEAKICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkRWFjMywgJmRlZiwgc2l6ZW9mKGRlZikpOwogfQogCitzdGF0dXNfdCBBQ29kZWM6OnNldHVwQUM0Q29kZWMoCisgICAgICAgIGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlKSB7CisgICAgc3RhdHVzX3QgZXJyID0gc2V0dXBSYXdBdWRpb0Zvcm1hdCgKKyAgICAgICAgICAgIGVuY29kZXIgPyBrUG9ydEluZGV4SW5wdXQgOiBrUG9ydEluZGV4T3V0cHV0LCBzYW1wbGVSYXRlLCBudW1DaGFubmVscyk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKGVuY29kZXIpIHsKKyAgICAgICAgQUxPR1coIkFDNCBlbmNvZGluZyBpcyBub3Qgc3VwcG9ydGVkLiIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgT01YX0FVRElPX1BBUkFNX0FORFJPSURfQUM0VFlQRSBkZWY7CisgICAgSW5pdE9NWFBhcmFtcygmZGVmKTsKKyAgICBkZWYublBvcnRJbmRleCA9IGtQb3J0SW5kZXhJbnB1dDsKKworICAgIGVyciA9IG1PTVhOb2RlLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZEFjNCwgJmRlZiwgc2l6ZW9mKGRlZikpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGRlZi5uQ2hhbm5lbHMgPSBudW1DaGFubmVsczsKKyAgICBkZWYublNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOworCisgICAgcmV0dXJuIG1PTVhOb2RlLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZEFjNCwgJmRlZiwgc2l6ZW9mKGRlZikpOworfQorCiBzdGF0aWMgT01YX0FVRElPX0FNUkJBTkRNT0RFVFlQRSBwaWNrTW9kZUZyb21CaXRSYXRlKAogICAgICAgICBib29sIGlzQU1SV0IsIGludDMyX3QgYnBzKSB7CiAgICAgaWYgKGlzQU1SV0IpIHsKQEAgLTI5NzMsOCArMzAzNCw4IEBACiB9CiAKIHN0YXR1c190IEFDb2RlYzo6c2V0dXBGbGFjQ29kZWMoCi0gICAgICAgIGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IGNvbXByZXNzaW9uTGV2ZWwpIHsKLQorICAgICAgICBib29sIGVuY29kZXIsIGludDMyX3QgbnVtQ2hhbm5lbHMsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBjb21wcmVzc2lvbkxldmVsLAorICAgICAgICBBdWRpb0VuY29kaW5nIGVuY29kaW5nKSB7CiAgICAgaWYgKGVuY29kZXIpIHsKICAgICAgICAgT01YX0FVRElPX1BBUkFNX0ZMQUNUWVBFIGRlZjsKICAgICAgICAgSW5pdE9NWFBhcmFtcygmZGVmKTsKQEAgLTI5OTcsNyArMzA1OCw4IEBACiAgICAgcmV0dXJuIHNldHVwUmF3QXVkaW9Gb3JtYXQoCiAgICAgICAgICAgICBlbmNvZGVyID8ga1BvcnRJbmRleElucHV0IDoga1BvcnRJbmRleE91dHB1dCwKICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICBudW1DaGFubmVscyk7CisgICAgICAgICAgICBudW1DaGFubmVscywKKyAgICAgICAgICAgIGVuY29kaW5nKTsKIH0KIAogc3RhdHVzX3QgQUNvZGVjOjpzZXR1cFJhd0F1ZGlvRm9ybWF0KApAQCAtMzA1NSw2ICszMTE3LDcgQEAKICAgICBwY21QYXJhbXMuZVBDTU1vZGUgPSBPTVhfQVVESU9fUENNTW9kZUxpbmVhcjsKIAogICAgIGlmIChnZXRPTVhDaGFubmVsTWFwcGluZyhudW1DaGFubmVscywgcGNtUGFyYW1zLmVDaGFubmVsTWFwcGluZykgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBpbmNvcnJlY3QgbnVtQ2hhbm5lbHM6ICVkIiwgX19mdW5jX18sIG51bUNoYW5uZWxzKTsKICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgfQogCkBAIC0zNzEwLDggKzM3NzMsMTcgQEAKICAgICAgICAgICAgICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguZGVzY3JpYmVIRFJTdGF0aWNJbmZvIiwgJm1EZXNjcmliZUhEUlN0YXRpY0luZm9JbmRleCk7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICBtRGVzY3JpYmVIRFJTdGF0aWNJbmZvSW5kZXggPSAoT01YX0lOREVYVFlQRSkwOworICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KLSAgICByZXR1cm4gZXJyOworCisgICAgZXJyID0gbU9NWE5vZGUtPmdldEV4dGVuc2lvbkluZGV4KAorICAgICAgICAgICAgICAgICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguZGVzY3JpYmVIRFIxMFBsdXNJbmZvIiwgJm1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleCk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBtRGVzY3JpYmVIRFIxMFBsdXNJbmZvSW5kZXggPSAoT01YX0lOREVYVFlQRSkwOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgQUNvZGVjOjpzZXRIRFJTdGF0aWNJbmZvKGNvbnN0IERlc2NyaWJlSERSU3RhdGljSW5mb1BhcmFtcyAmcGFyYW1zKSB7CkBAIC00MzU2LDggKzQ0MjgsOCBAQAogICAgICAgICBoMjY0dHlwZS5uQkZyYW1lcyA9IG1MYXRlbmN5ID09IDAgPyAxIDogc3RkOjptaW4oMVUsIG1MYXRlbmN5IC0gMSk7CiAKICAgICAgICAgLy8gZGlzYWJsZSBCLWZyYW1lcyB1bnRpbCBNUEVHNFdyaXRlciBjYW4gZ3VhcmFudGVlIGZpbmFsaXppbmcgZmlsZXMgd2l0aCBCLWZyYW1lcwotICAgICAgICBoMjY0dHlwZS5uUmVmRnJhbWVzID0gMTsKLSAgICAgICAgaDI2NHR5cGUubkJGcmFtZXMgPSAwOworICAgICAgICAvLyBoMjY0dHlwZS5uUmVmRnJhbWVzID0gMTsKKyAgICAgICAgLy8gaDI2NHR5cGUubkJGcmFtZXMgPSAwOwogCiAgICAgICAgIGgyNjR0eXBlLm5QRnJhbWVzID0gc2V0UEZyYW1lc1NwYWNpbmcoaUZyYW1lSW50ZXJ2YWwsIGZyYW1lUmF0ZSwgaDI2NHR5cGUubkJGcmFtZXMpOwogICAgICAgICBoMjY0dHlwZS5uQWxsb3dlZFBpY3R1cmVUeXBlcyA9CkBAIC01MjQzLDYgKzUzMTUsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgY2FzZSBPTVhfQVVESU9fQ29kaW5nQW5kcm9pZEFDNDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9BTkRST0lEX0FDNFRZUEUgcGFyYW1zOworICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOworICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IHBvcnRJbmRleDsKKworICAgICAgICAgICAgICAgICAgICBlcnIgPSBtT01YTm9kZS0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkQWM0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMsIHNpemVvZihwYXJhbXMpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0KTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIHBhcmFtcy5uQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIHBhcmFtcy5uU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIGNhc2UgT01YX0FVRElPX0NvZGluZ0FuZHJvaWRPUFVTOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FORFJPSURfT1BVU1RZUEUgcGFyYW1zOwpAQCAtNTMyMyw2ICs1NDE0LDcwIEBACiAgICAgcmV0dXJuIGdldFZlbmRvclBhcmFtZXRlcnMocG9ydEluZGV4LCBub3RpZnkpOwogfQogCitEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMqIEFDb2RlYzo6Z2V0SERSMTBQbHVzSW5mbyhzaXplX3QgcGFyYW1TaXplVXNlZCkgeworICAgIGlmIChtRGVzY3JpYmVIRFIxMFBsdXNJbmZvSW5kZXggPT0gMCkgeworICAgICAgICBBTE9HRSgiZ2V0SERSMTBQbHVzSW5mbzogZG9lcyBub3Qgc3VwcG9ydCBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMiKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgc2l6ZV90IG5ld1NpemUgPSBzaXplb2YoRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zKSAtIDEgKworICAgICAgICAgICAgKChwYXJhbVNpemVVc2VkID4gMCkgPyBwYXJhbVNpemVVc2VkIDogNTEyKTsKKyAgICBpZiAobUhkcjEwUGx1c1NjcmF0Y2hCdWZmZXIgPT0gbnVsbHB0cgorICAgICAgICAgICAgfHwgbmV3U2l6ZSA+IG1IZHIxMFBsdXNTY3JhdGNoQnVmZmVyLT5zaXplKCkpIHsKKyAgICAgICAgbUhkcjEwUGx1c1NjcmF0Y2hCdWZmZXIgPSBuZXcgQUJ1ZmZlcihuZXdTaXplKTsKKyAgICB9CisgICAgRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zICpjb25maWcgPQorICAgICAgICAgICAgKERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyAqKW1IZHIxMFBsdXNTY3JhdGNoQnVmZmVyLT5kYXRhKCk7CisgICAgSW5pdE9NWFBhcmFtcyhjb25maWcpOworICAgIGNvbmZpZy0+blNpemUgPSBtSGRyMTBQbHVzU2NyYXRjaEJ1ZmZlci0+c2l6ZSgpOworICAgIGNvbmZpZy0+blBvcnRJbmRleCA9IDE7CisgICAgc2l6ZV90IHBhcmFtU2l6ZSA9IGNvbmZpZy0+blNpemUgLSBzaXplb2YoRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zKSArIDE7CisgICAgY29uZmlnLT5uUGFyYW1TaXplID0gcGFyYW1TaXplOworICAgIGNvbmZpZy0+blBhcmFtU2l6ZVVzZWQgPSAwOworICAgIHN0YXR1c190IGVyciA9IG1PTVhOb2RlLT5nZXRDb25maWcoCisgICAgICAgICAgICAoT01YX0lOREVYVFlQRSltRGVzY3JpYmVIRFIxMFBsdXNJbmZvSW5kZXgsCisgICAgICAgICAgICBjb25maWcsIGNvbmZpZy0+blNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBnZXQgRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zIChlcnIgJWQpIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGlmIChjb25maWctPm5QYXJhbVNpemUgIT0gcGFyYW1TaXplKSB7CisgICAgICAgIEFMT0dFKCJEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgYWx0ZXJzIG5QYXJhbVNpemU6ICV1IHZzICV6dSIsCisgICAgICAgICAgICAgICAgY29uZmlnLT5uUGFyYW1TaXplLCBwYXJhbVNpemUpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKHBhcmFtU2l6ZVVzZWQgPiAwICYmIGNvbmZpZy0+blBhcmFtU2l6ZVVzZWQgIT0gcGFyYW1TaXplVXNlZCkgeworICAgICAgICBBTE9HRSgiRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zIHJldHVybnMgd3JvbmcgblBhcmFtU2l6ZVVzZWQ6ICV1IHZzICV6dSIsCisgICAgICAgICAgICAgICAgY29uZmlnLT5uUGFyYW1TaXplVXNlZCwgcGFyYW1TaXplVXNlZCk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gY29uZmlnOworfQorCit2b2lkIEFDb2RlYzo6b25Db25maWdVcGRhdGUoT01YX0lOREVYVFlQRSBjb25maWdJbmRleCkgeworICAgIGlmIChtRGVzY3JpYmVIRFIxMFBsdXNJbmZvSW5kZXggPT0gMAorICAgICAgICAgICAgfHwgY29uZmlnSW5kZXggIT0gbURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4KSB7CisgICAgICAgIC8vIG1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleCBpcyB0aGUgb25seSB1cGRhdGUgd2UgcmVjb2duaXplIG5vdworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zICpjb25maWcgPSBnZXRIRFIxMFBsdXNJbmZvKCk7CisgICAgaWYgKGNvbmZpZyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGNvbmZpZy0+blBhcmFtU2l6ZVVzZWQgPiBjb25maWctPm5QYXJhbVNpemUpIHsKKyAgICAgICAgLy8gdHJ5IGFnYWluIHdpdGggdGhlIHNpemUgc3BlY2lmaWVkCisgICAgICAgIGNvbmZpZyA9IGdldEhEUjEwUGx1c0luZm8oY29uZmlnLT5uUGFyYW1TaXplVXNlZCk7CisgICAgICAgIGlmIChjb25maWcgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgbU91dHB1dEZvcm1hdCA9IG1PdXRwdXRGb3JtYXQtPmR1cCgpOyAvLyB0cmlnZ2VyIGFuIG91dHB1dCBmb3JtYXQgY2hhbmdlZCBldmVudAorICAgIG1PdXRwdXRGb3JtYXQtPnNldEJ1ZmZlcigiaGRyMTAtcGx1cy1pbmZvIiwKKyAgICAgICAgICAgIEFCdWZmZXI6OkNyZWF0ZUFzQ29weShjb25maWctPm5WYWx1ZSwgY29uZmlnLT5uUGFyYW1TaXplVXNlZCkpOworfQorCiB2b2lkIEFDb2RlYzo6b25EYXRhU3BhY2VDaGFuZ2VkKGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY29uc3QgQ29sb3JBc3BlY3RzICZhc3BlY3RzKSB7CiAgICAgLy8gYXNwZWN0cyBhcmUgbm9ybWFsbHkgY29tbXVuaWNhdGVkIGluIENvbG9yQXNwZWN0cwogICAgIGludDMyX3QgcmFuZ2UsIHN0YW5kYXJkLCB0cmFuc2ZlcjsKQEAgLTU1NTgsNiArNTcxMywxMSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0Q2hlY2tJZlN0dWNrOiB7CisgICAgICAgICAgICBBTE9HVigiTm8tb3AgYnkgZGVmYXVsdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTYyNTgsNiArNjQxOCwxNSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgc3A8QUJ1ZmZlcj4gaGRyMTBQbHVzSW5mbzsKKyAgICAgICAgaWYgKGJ1ZmZlci0+Zm9ybWF0KCktPmZpbmRCdWZmZXIoImhkcjEwLXBsdXMtaW5mbyIsICZoZHIxMFBsdXNJbmZvKQorICAgICAgICAgICAgICAgICYmIGhkcjEwUGx1c0luZm8gIT0gbnVsbHB0ciAmJiBoZHIxMFBsdXNJbmZvLT5zaXplKCkgPiAwCisgICAgICAgICAgICAgICAgJiYgaGRyMTBQbHVzSW5mbyAhPSBtQ29kZWMtPm1MYXN0SGRyMTBQbHVzQnVmZmVyKSB7CisgICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2hkcjEwX3BsdXNfbWV0YWRhdGEobUNvZGVjLT5tTmF0aXZlV2luZG93LmdldCgpLAorICAgICAgICAgICAgICAgICAgICBoZHIxMFBsdXNJbmZvLT5zaXplKCksIGhkcjEwUGx1c0luZm8tPmRhdGEoKSk7CisgICAgICAgICAgICBtQ29kZWMtPm1MYXN0SGRyMTBQbHVzQnVmZmVyID0gaGRyMTBQbHVzSW5mbzsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIHNhdmUgYnVmZmVycyBzZW50IHRvIHRoZSBzdXJmYWNlIHNvIHdlIGNhbiBnZXQgcmVuZGVyIHRpbWUgd2hlbiB0aGV5IHJldHVybgogICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzID0gLTE7CiAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZtZWRpYVRpbWVVcyk7CkBAIC03Mzg0LDEyICs3NTUzLDU3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpbnQzMl90IHByZXNlbnRhdGlvbklkID0gLTE7CisgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKCJhdWRpby1wcmVzZW50YXRpb24tcHJlc2VudGF0aW9uLWlkIiwgJnByZXNlbnRhdGlvbklkKSkgeworICAgICAgICBpbnQzMl90IHByb2dyYW1JZCA9IC0xOworICAgICAgICBwYXJhbXMtPmZpbmRJbnQzMigiYXVkaW8tcHJlc2VudGF0aW9uLXByb2dyYW0taWQiLCAmcHJvZ3JhbUlkKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0QXVkaW9QcmVzZW50YXRpb24ocHJlc2VudGF0aW9uSWQsIHByb2dyYW1JZCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dJKCJbJXNdIGZhaWxlZCBzZXRBdWRpb1ByZXNlbnRhdGlvbi4gRmFpbHVyZSBpcyBmaW5lIHNpbmNlIHRoaXMga2V5IGlzIG9wdGlvbmFsIiwKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGhkcjEwUGx1c0luZm87CisgICAgaWYgKHBhcmFtcy0+ZmluZEJ1ZmZlcigiaGRyMTAtcGx1cy1pbmZvIiwgJmhkcjEwUGx1c0luZm8pCisgICAgICAgICAgICAmJiBoZHIxMFBsdXNJbmZvICE9IG51bGxwdHIgJiYgaGRyMTBQbHVzSW5mby0+c2l6ZSgpID4gMCkgeworICAgICAgICAodm9pZClzZXRIZHIxMFBsdXNJbmZvKGhkcjEwUGx1c0luZm8pOworICAgIH0KKwogICAgIC8vIElnbm9yZSBlcnJvcnMgYXMgZmFpbHVyZSBpcyBleHBlY3RlZCBmb3IgY29kZWNzIHRoYXQgYXJlbid0IHZpZGVvIGVuY29kZXJzLgogICAgICh2b2lkKWNvbmZpZ3VyZVRlbXBvcmFsTGF5ZXJzKHBhcmFtcywgZmFsc2UgLyogaW5Db25maWd1cmUgKi8sIG1PdXRwdXRGb3JtYXQpOwogCiAgICAgcmV0dXJuIHNldFZlbmRvclBhcmFtZXRlcnMocGFyYW1zKTsKIH0KIAorc3RhdHVzX3QgQUNvZGVjOjpzZXRIZHIxMFBsdXNJbmZvKGNvbnN0IHNwPEFCdWZmZXI+ICZoZHIxMFBsdXNJbmZvKSB7CisgICAgaWYgKG1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJzZXRIZHIxMFBsdXNJbmZvOiBkb2VzIG5vdCBzdXBwb3J0IERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyIpOworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorICAgIHNpemVfdCBuZXdTaXplID0gc2l6ZW9mKERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcykgKyBoZHIxMFBsdXNJbmZvLT5zaXplKCkgLSAxOworICAgIGlmIChtSGRyMTBQbHVzU2NyYXRjaEJ1ZmZlciA9PSBudWxscHRyIHx8CisgICAgICAgICAgICBuZXdTaXplID4gbUhkcjEwUGx1c1NjcmF0Y2hCdWZmZXItPnNpemUoKSkgeworICAgICAgICBtSGRyMTBQbHVzU2NyYXRjaEJ1ZmZlciA9IG5ldyBBQnVmZmVyKG5ld1NpemUpOworICAgIH0KKyAgICBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgKmNvbmZpZyA9CisgICAgICAgICAgICAoRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zICopbUhkcjEwUGx1c1NjcmF0Y2hCdWZmZXItPmRhdGEoKTsKKyAgICBJbml0T01YUGFyYW1zKGNvbmZpZyk7CisgICAgY29uZmlnLT5uUG9ydEluZGV4ID0gMDsKKyAgICBjb25maWctPm5TaXplID0gbmV3U2l6ZTsKKyAgICBjb25maWctPm5QYXJhbVNpemUgPSBoZHIxMFBsdXNJbmZvLT5zaXplKCk7CisgICAgY29uZmlnLT5uUGFyYW1TaXplVXNlZCA9IGhkcjEwUGx1c0luZm8tPnNpemUoKTsKKyAgICBtZW1jcHkoY29uZmlnLT5uVmFsdWUsIGhkcjEwUGx1c0luZm8tPmRhdGEoKSwgaGRyMTBQbHVzSW5mby0+c2l6ZSgpKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtT01YTm9kZS0+c2V0Q29uZmlnKAorICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpbURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4LAorICAgICAgICAgICAgY29uZmlnLCBjb25maWctPm5TaXplKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gc2V0IERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyAoZXJyICVkKSIsIGVycik7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwogLy8gUmVtb3ZlcyB0cmFpbGluZyB0YWdzIG1hdGNoaW5nIHx0YWd8IGZyb20gfGtleXwgKGUuZy4gYSBzZXR0aW5ncyBuYW1lKS4gfG1pbkxlbmd0aHwgc3BlY2lmaWVzCiAvLyB0aGUgbWluaW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBrZWVwIGluIHxrZXl8IChldmVuIGlmIGl0IGhhcyB0cmFpbGluZyB0YWdzKS4KIC8vIChVc2VkIHRvIHJlbW92ZSB0cmFpbGluZyAndmFsdWUnIHRhZ3MgaW4gc2V0dGluZ3MgbmFtZXMsIGUuZy4gdG8gbm9ybWFsaXplCkBAIC03ODExLDYgKzgwMjUsMTUgQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfRXZlbnRDb25maWdVcGRhdGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0VRKGRhdGExLCAoT01YX1UzMilrUG9ydEluZGV4T3V0cHV0KTsKKworICAgICAgICAgICAgbUNvZGVjLT5vbkNvbmZpZ1VwZGF0ZSgoT01YX0lOREVYVFlQRSlkYXRhMik7CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfRXZlbnRCdWZmZXJGbGFnOgogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTc4NzUsNiArODA5OCwxOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0Q2hlY2tJZlN0dWNrOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb24gPSAwOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gPT0gbUNvZGVjLT5tU3RhdGVHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIFRJTUVEX09VVCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgaGFuZGxlZCA9IEJhc2VTdGF0ZTo6b25NZXNzYWdlUmVjZWl2ZWQobXNnKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNzg4Niw2ICs4MTIxLDExIEBACiB2b2lkIEFDb2RlYzo6T3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlZFN0YXRlOjpzdGF0ZUVudGVyZWQoKSB7CiAgICAgQUxPR1YoIlslc10gTm93IGhhbmRsaW5nIG91dHB1dCBwb3J0IHNldHRpbmdzIGNoYW5nZSIsCiAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCkpOworCisgICAgLy8gSWYgd2UgaGF2ZW4ndCB0cmFuc2l0aW9uZWQgYWZ0ZXIgMyBzZWNvbmRzLCB3ZSdyZSBwcm9iYWJseSBzdHVjay4KKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKEFDb2RlYzo6a1doYXRDaGVja0lmU3R1Y2ssIG1Db2RlYyk7CisgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1Db2RlYy0+bVN0YXRlR2VuZXJhdGlvbik7CisgICAgbXNnLT5wb3N0KDMwMDAwMDApOwogfQogCiBib29sIEFDb2RlYzo6T3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlZFN0YXRlOjpvbk9NWEZyYW1lUmVuZGVyZWQoCkBAIC04MTQ4LDYgKzgzODgsMTEgQEAKICAgICBBTE9HVigiWyVzXSBOb3cgRmx1c2hpbmciLCBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCkpOwogCiAgICAgbUZsdXNoQ29tcGxldGVba1BvcnRJbmRleElucHV0XSA9IG1GbHVzaENvbXBsZXRlW2tQb3J0SW5kZXhPdXRwdXRdID0gZmFsc2U7CisKKyAgICAvLyBJZiB3ZSBoYXZlbid0IHRyYW5zaXRpb25lZCBhZnRlciAzIHNlY29uZHMsIHdlJ3JlIHByb2JhYmx5IHN0dWNrLgorICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoQUNvZGVjOjprV2hhdENoZWNrSWZTdHVjaywgbUNvZGVjKTsKKyAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUNvZGVjLT5tU3RhdGVHZW5lcmF0aW9uKTsKKyAgICBtc2ctPnBvc3QoMzAwMDAwMCk7CiB9CiAKIGJvb2wgQUNvZGVjOjpGbHVzaGluZ1N0YXRlOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewpAQCAtODE2Miw2ICs4NDA3LDcgQEAKICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUNvZGVjLT5tU3RhdGVHZW5lcmF0aW9uKTsKICAgICAgICAgICAgICAgICBtc2ctPnBvc3QoMzAwMDAwMCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTgxODIsNiArODQyOCwxOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0Q2hlY2tJZlN0dWNrOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb24gPSAwOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gPT0gbUNvZGVjLT5tU3RhdGVHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIFRJTUVEX09VVCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgaGFuZGxlZCA9IEJhc2VTdGF0ZTo6b25NZXNzYWdlUmVjZWl2ZWQobXNnKTsKICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWNCdWZmZXJDaGFubmVsLmNwcAppbmRleCA3MTBhZTY4Li4yNjZhMjQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWNCdWZmZXJDaGFubmVsLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWNCdWZmZXJDaGFubmVsLmNwcApAQCAtMTI5LDYgKzEyOSw3IEBACiAgICAgICAgIHNlY3VyZUhhbmRsZSA9IHN0YXRpY19jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihzZWN1cmVEYXRhLT5nZXREZXN0aW5hdGlvblBvaW50ZXIoKSk7CiAgICAgfQogICAgIHNzaXplX3QgcmVzdWx0ID0gLTE7CisgICAgc3NpemVfdCBjb2RlY0RhdGFPZmZzZXQgPSAwOwogICAgIGlmIChtQ3J5cHRvICE9IE5VTEwpIHsKICAgICAgICAgSUNyeXB0bzo6RGVzdGluYXRpb25CdWZmZXIgZGVzdGluYXRpb247CiAgICAgICAgIGlmIChzZWN1cmUpIHsKQEAgLTE4MCw5ICsxODEsMTYgQEAKIAogICAgICAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKICAgICAgICAgaGlkbF9zdHJpbmcgZGV0YWlsZWRFcnJvcjsKKyAgICAgICAgU2NyYW1ibGluZ0NvbnRyb2wgc2N0cmwgPSBTY3JhbWJsaW5nQ29udHJvbDo6VU5TQ1JBTUJMRUQ7CisKKyAgICAgICAgaWYgKGtleSAhPSBOVUxMKSB7CisgICAgICAgICAgICBzY3RybCA9IChTY3JhbWJsaW5nQ29udHJvbClrZXlbMF07CisgICAgICAgICAgICAvLyBBZGp1c3QgZm9yIHRoZSBQRVMgb2Zmc2V0CisgICAgICAgICAgICBjb2RlY0RhdGFPZmZzZXQgPSBrZXlbMl0gfCAoa2V5WzNdIDw8IDgpOworICAgICAgICB9CiAKICAgICAgICAgYXV0byByZXR1cm5Wb2lkID0gbURlc2NyYW1ibGVyLT5kZXNjcmFtYmxlKAotICAgICAgICAgICAgICAgIGtleSAhPSBOVUxMID8gKFNjcmFtYmxpbmdDb250cm9sKWtleVswXSA6IFNjcmFtYmxpbmdDb250cm9sOjpVTlNDUkFNQkxFRCwKKyAgICAgICAgICAgICAgICBzY3RybCwKICAgICAgICAgICAgICAgICBoaWRsU3ViU2FtcGxlcywKICAgICAgICAgICAgICAgICBzcmNCdWZmZXIsCiAgICAgICAgICAgICAgICAgMCwKQEAgLTIwMiw2ICsyMTAsMTEgQEAKICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKHJlc3VsdCA8IGNvZGVjRGF0YU9mZnNldCkgeworICAgICAgICAgICAgQUxPR0QoImludmFsaWQgY29kZWMgZGF0YSBvZmZzZXQ6ICV6ZCwgcmVzdWx0ICV6ZCIsIGNvZGVjRGF0YU9mZnNldCwgcmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKwogICAgICAgICBBTE9HVigiZGVzY3JhbWJsZSBzdWNjZWVkZWQsICV6ZCBieXRlcyIsIHJlc3VsdCk7CiAKICAgICAgICAgaWYgKGRzdEJ1ZmZlci50eXBlID09IEJ1ZmZlclR5cGU6OlNIQVJFRF9NRU1PUlkpIHsKQEAgLTIxMCw3ICsyMjMsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaXQtPm1Db2RlY0J1ZmZlci0+c2V0UmFuZ2UoMCwgcmVzdWx0KTsKKyAgICBpdC0+bUNvZGVjQnVmZmVyLT5zZXRSYW5nZShjb2RlY0RhdGFPZmZzZXQsIHJlc3VsdCAtIGNvZGVjRGF0YU9mZnNldCk7CiAKICAgICAvLyBDb3B5IG1ldGFkYXRhIGZyb20gY2xpZW50IHRvIGNvZGVjIGJ1ZmZlci4KICAgICBpdC0+bUNvZGVjQnVmZmVyLT5tZXRhKCktPmNsZWFyKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4OWI4YjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcApAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0FTdGF0ZTo6QVN0YXRlKGNvbnN0IHNwPEFTdGF0ZT4gJnBhcmVudFN0YXRlKQorICAgIDogbVBhcmVudFN0YXRlKHBhcmVudFN0YXRlKSB7Cit9CisKK0FTdGF0ZTo6fkFTdGF0ZSgpIHsKK30KKworc3A8QVN0YXRlPiBBU3RhdGU6OnBhcmVudFN0YXRlKCkgeworICAgIHJldHVybiBtUGFyZW50U3RhdGU7Cit9CisKK3ZvaWQgQVN0YXRlOjpzdGF0ZUVudGVyZWQoKSB7Cit9CisKK3ZvaWQgQVN0YXRlOjpzdGF0ZUV4aXRlZCgpIHsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTo6QUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZSgpIHsKK30KKworQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTo6fkFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUoKSB7Cit9CisKK3ZvaWQgQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTo6aGFuZGxlTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHNwPEFTdGF0ZT4gc2F2ZSA9IG1TdGF0ZTsKKworICAgIHNwPEFTdGF0ZT4gY3VyID0gbVN0YXRlOworICAgIHdoaWxlIChjdXIgIT0gTlVMTCAmJiAhY3VyLT5vbk1lc3NhZ2VSZWNlaXZlZChtc2cpKSB7CisgICAgICAgIC8vIElmIHlvdSBjbGFpbSBub3QgdG8gaGF2ZSBoYW5kbGVkIHRoZSBtZXNzYWdlIHlvdSBzaG91bGRuJ3QKKyAgICAgICAgLy8gaGF2ZSBjYWxsZWQgc2V0U3RhdGUuLi4KKyAgICAgICAgQ0hFQ0soc2F2ZSA9PSBtU3RhdGUpOworCisgICAgICAgIGN1ciA9IGN1ci0+cGFyZW50U3RhdGUoKTsKKyAgICB9CisKKyAgICBpZiAoY3VyICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dXKCJXYXJuaW5nIG1lc3NhZ2UgJXMgdW5oYW5kbGVkIGluIHJvb3Qgc3RhdGUuIiwKKyAgICAgICAgIG1zZy0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKK30KKwordm9pZCBBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lOjpjaGFuZ2VTdGF0ZShjb25zdCBzcDxBU3RhdGU+ICZzdGF0ZSkgeworICAgIGlmIChzdGF0ZSA9PSBtU3RhdGUpIHsKKyAgICAgICAgLy8gUXVpY2sgZXhpdCBmb3IgdGhlIGVhc3kgY2FzZS4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFZlY3RvcjxzcDxBU3RhdGU+ID4gQTsKKyAgICBzcDxBU3RhdGU+IGN1ciA9IG1TdGF0ZTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIEEucHVzaChjdXIpOworICAgICAgICBpZiAoY3VyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGN1ciA9IGN1ci0+cGFyZW50U3RhdGUoKTsKKyAgICB9CisKKyAgICBWZWN0b3I8c3A8QVN0YXRlPiA+IEI7CisgICAgY3VyID0gc3RhdGU7CisgICAgZm9yICg7OykgeworICAgICAgICBCLnB1c2goY3VyKTsKKyAgICAgICAgaWYgKGN1ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjdXIgPSBjdXItPnBhcmVudFN0YXRlKCk7CisgICAgfQorCisgICAgLy8gUmVtb3ZlIHRoZSBjb21tb24gdGFpbC4KKyAgICB3aGlsZSAoQS5zaXplKCkgPiAwICYmIEIuc2l6ZSgpID4gMCAmJiBBLnRvcCgpID09IEIudG9wKCkpIHsKKyAgICAgICAgQS5wb3AoKTsKKyAgICAgICAgQi5wb3AoKTsKKyAgICB9CisKKyAgICBtU3RhdGUgPSBzdGF0ZTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQS5zaXplKCk7ICsraSkgeworICAgICAgICBBLmVkaXRJdGVtQXQoaSktPnN0YXRlRXhpdGVkKCk7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IEIuc2l6ZSgpOyBpID4gMDspIHsKKyAgICAgICAgaS0tOworICAgICAgICBCLmVkaXRJdGVtQXQoaSktPnN0YXRlRW50ZXJlZCgpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwCmluZGV4IGJjNzU2OWYuLjI0OWYyYTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icApAQCAtMzksNyArMzksNyBAQAogICAgICAgICBjZmk6IHRydWUsCiAgICAgfSwKIAotICAgIHNoYXJlZF9saWJzOiBbImxpYm1lZGlhIl0sCisgICAgc2hhcmVkX2xpYnM6IFsibGlibWVkaWEiLCAibGlibWVkaWFuZGsiXSwKIH0KIAogY2NfbGlicmFyeV9zaGFyZWQgewpAQCAtNzcsMTYgKzc3LDE2IEBACiAgICAgfSwKIH0KIAotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0IiwKIAogICAgIHNyY3M6IFsKKyAgICAgICAgIkFBQ1dyaXRlci5jcHAiLAogICAgICAgICAiQUNvZGVjLmNwcCIsCiAgICAgICAgICJBQ29kZWNCdWZmZXJDaGFubmVsLmNwcCIsCi0gICAgICAgICJBQUNXcml0ZXIuY3BwIiwKKyAgICAgICAgIkFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuY3BwIiwKICAgICAgICAgIkFNUldyaXRlci5jcHAiLAogICAgICAgICAiQXVkaW9QbGF5ZXIuY3BwIiwKLSAgICAgICAgIkF1ZGlvUHJlc2VudGF0aW9uSW5mby5jcHAiLAogICAgICAgICAiQXVkaW9Tb3VyY2UuY3BwIiwKICAgICAgICAgIkJ1ZmZlckltcGwuY3BwIiwKICAgICAgICAgIkNhbGxiYWNrRGF0YVNvdXJjZS5jcHAiLApAQCAtOTYsNiArOTYsNyBAQAogICAgICAgICAiRGF0YUNvbnZlcnRlci5jcHAiLAogICAgICAgICAiRGF0YVNvdXJjZUZhY3RvcnkuY3BwIiwKICAgICAgICAgIkRhdGFVUklTb3VyY2UuY3BwIiwKKyAgICAgICAgIkNsZWFyRmlsZVNvdXJjZS5jcHAiLAogICAgICAgICAiRmlsZVNvdXJjZS5jcHAiLAogICAgICAgICAiRnJhbWVEZWNvZGVyLmNwcCIsCiAgICAgICAgICJIVFRQQmFzZS5jcHAiLApAQCAtMTEwLDEyICsxMTEsMTYgQEAKICAgICAgICAgIk1lZGlhQ29kZWNMaXN0LmNwcCIsCiAgICAgICAgICJNZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5jcHAiLAogICAgICAgICAiTWVkaWFDb2RlY1NvdXJjZS5jcHAiLAorICAgICAgICAiTWVkaWFFeHRyYWN0b3IuY3BwIiwKICAgICAgICAgIk1lZGlhRXh0cmFjdG9yRmFjdG9yeS5jcHAiLAogICAgICAgICAiTWVkaWFTeW5jLmNwcCIsCisgICAgICAgICJNZWRpYVRyYWNrLmNwcCIsCisgICAgICAgICJodHRwL0NsZWFyTWVkaWFIVFRQLmNwcCIsCiAgICAgICAgICJodHRwL01lZGlhSFRUUC5jcHAiLAogICAgICAgICAiTWVkaWFNdXhlci5jcHAiLAogICAgICAgICAiTnVDYWNoZWRTb3VyY2UyLmNwcCIsCiAgICAgICAgICJOdU1lZGlhRXh0cmFjdG9yLmNwcCIsCisgICAgICAgICJPZ2dXcml0ZXIuY3BwIiwKICAgICAgICAgIk9NWENsaWVudC5jcHAiLAogICAgICAgICAiT214SW5mb0J1aWxkZXIuY3BwIiwKICAgICAgICAgIlJlbW90ZU1lZGlhRXh0cmFjdG9yLmNwcCIsCkBAIC0xMjgsMTggKzEzMywxOSBAQAogICAgICAgICAiU3VyZmFjZVV0aWxzLmNwcCIsCiAgICAgICAgICJVdGlscy5jcHAiLAogICAgICAgICAiVGhyb3R0bGVkU291cmNlLmNwcCIsCisgICAgICAgICJWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZS5jcHAiLAogICAgICAgICAiVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJkbCIsCiAgICAgICAgICJsaWJkcm1mcmFtZXdvcmsiLAogICAgICAgICAibGliZ3VpIiwKLSAgICAgICAgImxpYmlvbiIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlibWVkaWEiLAogICAgICAgICAibGlibWVkaWFfb214IiwKQEAgLTE0NywxNCArMTUzLDEzIEBACiAgICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCiAgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAogICAgICAgICAibGlibWVkaWF1dGlscyIsCi0gICAgICAgICJsaWJuZXRkX2NsaWVudCIsCiAgICAgICAgICJsaWJ1aSIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfY29kZWNiYXNlIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214X3V0aWxzIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9vcHVzX2NvbW1vbiIsCiAgICAgICAgICJsaWJSU2NwcCIsCiAgICAgICAgICJsaWJoaWRsYWxsb2NhdG9ydXRpbHMiLAogICAgICAgICAibGliaGlkbGJhc2UiLApAQCAtMTYzLDggKzE2OCw2IEBACiAgICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmFsbG9jYXRvckAyLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5tYXBwZXJAMi4wIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKQEAgLTE3NCwxMiArMTc3LDE4IEBACiAgICAgICAgICJsaWJzdGFnZWZyaWdodF93ZWJtIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3RpbWVkdGV4dCIsCiAgICAgICAgICJsaWJ2cHgiLAorICAgICAgICAibGlib2dnIiwKICAgICAgICAgImxpYndlYm0iLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZXNkcyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9pZDMiLAogICAgICAgICAibGliRkxBQyIsCiAgICAgXSwKIAorICAgIGhlYWRlcl9saWJzOlsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlcl9oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKKyAgICBdLAorCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwogICAgICAgICAibGlibWVkaWEiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLApAQCAtMjE0LDU4ICsyMjMsMzQgQEAKICAgICB9LAogfQogCi1jY19saWJyYXJ5IHsKK2NjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfcGxheWVyMiIsCiAKICAgICBzcmNzOiBbCi0gICAgICAgICJDYWxsYmFja0RhdGFTb3VyY2UuY3BwIiwKLSAgICAgICAgIkNhbGxiYWNrTWVkaWFTb3VyY2UuY3BwIiwKLSAgICAgICAgIkRhdGFTb3VyY2VGYWN0b3J5LmNwcCIsCisgICAgICAgICJDbGVhckZpbGVTb3VyY2UuY3BwIiwKICAgICAgICAgIkRhdGFVUklTb3VyY2UuY3BwIiwKLSAgICAgICAgIkZpbGVTb3VyY2UuY3BwIiwKICAgICAgICAgIkhUVFBCYXNlLmNwcCIsCiAgICAgICAgICJIZXZjVXRpbHMuY3BwIiwKLSAgICAgICAgIkludGVyZmFjZVV0aWxzLmNwcCIsCiAgICAgICAgICJNZWRpYUNsb2NrLmNwcCIsCi0gICAgICAgICJNZWRpYUV4dHJhY3RvckZhY3RvcnkuY3BwIiwKICAgICAgICAgIk5ka1V0aWxzLmNwcCIsCi0gICAgICAgICJOdUNhY2hlZFNvdXJjZTIuY3BwIiwKLSAgICAgICAgIlJlbW90ZU1lZGlhRXh0cmFjdG9yLmNwcCIsCi0gICAgICAgICJSZW1vdGVNZWRpYVNvdXJjZS5jcHAiLAogICAgICAgICAiVXRpbHMuY3BwIiwKLSAgICAgICAgIlZpZGVvRnJhbWVTY2hlZHVsZXIuY3BwIiwKLSAgICAgICAgImh0dHAvTWVkaWFIVFRQLmNwcCIsCisgICAgICAgICJWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZS5jcHAiLAorICAgICAgICAiVmlkZW9GcmFtZVNjaGVkdWxlcjIuY3BwIiwKKyAgICAgICAgImh0dHAvQ2xlYXJNZWRpYUhUVFAuY3BwIiwKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGliZHJtZnJhbWV3b3JrIiwKICAgICAgICAgImxpYmd1aSIsCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFfcGxheWVyMl91dGlsIiwKLSAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKLSAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCi0gICAgICAgICJsaWJtZWRpYXV0aWxzIiwKICAgICAgICAgImxpYm5ldGRfY2xpZW50IiwKLSAgICAgICAgImxpYnVpIiwKICAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnppcGFyY2hpdmUiLAorICAgICAgICAibGliYW5kcm9pZCIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9lc2RzIiwKLSAgICBdLAotCi0gICAgaGVhZGVyX2xpYnM6WwotICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAotICAgIF0sCi0KLSAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCiAgICAgICAgICJsaWJtZWRpYV9wbGF5ZXIyX3V0aWwiLAorICAgICAgICAibGlibWVkaWEyX2puaV9jb3JlIiwKICAgICBdLAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCmluZGV4IGE2ZjBhMGIuLjE5OWI1N2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1BsYXllci5jcHAKQEAgLTExOCw2ICsxMTgsMTMgQEAKICAgICB9CiAKICAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisKKyAgICBpZiAoZm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIk5vIG1ldGFkYXRhIGIvMTE4NjIwODcxIik7CisgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTE4NjIwODcxIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCiAgICAgY29uc3QgY2hhciAqbWltZTsKICAgICBib29sIHN1Y2Nlc3MgPSBmb3JtYXQtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOwogICAgIENIRUNLKHN1Y2Nlc3MpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QcmVzZW50YXRpb25JbmZvLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUHJlc2VudGF0aW9uSW5mby5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZTE4NTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QcmVzZW50YXRpb25JbmZvLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyAjZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJBdWRpb1ByZXNlbnRhdGlvbkluZm8iCi0KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1ByZXNlbnRhdGlvbkluZm8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1BdWRpb1ByZXNlbnRhdGlvbkluZm86OkF1ZGlvUHJlc2VudGF0aW9uSW5mbygpIHsKLX0KLQotQXVkaW9QcmVzZW50YXRpb25JbmZvOjp+QXVkaW9QcmVzZW50YXRpb25JbmZvKCkgewotICAgIG1QcmVzZW50YXRpb25zLmNsZWFyKCk7Ci19Ci0KLXZvaWQgQXVkaW9QcmVzZW50YXRpb25JbmZvOjphZGRQcmVzZW50YXRpb24oc3A8QXVkaW9QcmVzZW50YXRpb24+IHByZXNlbnRhdGlvbikgewotICAgIG1QcmVzZW50YXRpb25zLnB1c2gocHJlc2VudGF0aW9uKTsKLX0KLQotc2l6ZV90IEF1ZGlvUHJlc2VudGF0aW9uSW5mbzo6Y291bnRQcmVzZW50YXRpb25zKCkgY29uc3QgewotICAgIHJldHVybiBtUHJlc2VudGF0aW9ucy5zaXplKCk7Ci19Ci0KLS8vIFJldHVybnMgYW4gQXVkaW9QcmVzZW50YXRpb24gZm9yIHRoZSBnaXZlbiB2YWxpZCBpbmRleAotLy8gaW5kZXggbXVzdCBiZSA+PTAgYW5kIDwgY291bnRQcmVzZW50YXRpb25zKCkKLWNvbnN0IHNwPEF1ZGlvUHJlc2VudGF0aW9uPiBBdWRpb1ByZXNlbnRhdGlvbkluZm86OmdldFByZXNlbnRhdGlvbihzaXplX3QgaW5kZXgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVByZXNlbnRhdGlvbnNbaW5kZXhdOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuY3BwCmluZGV4IDJhZTMyMTguLjlkZTFlMjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5jcHAKQEAgLTUwNiw0ICs1MDYsMTEgQEAKICAgICByZXR1cm4gTk9fSU5JVDsKIH0KIAorc3RhdHVzX3QgQXVkaW9Tb3VyY2U6OmdldFBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpIGNvbnN0IHsKKyAgICBpZiAobVJlY29yZCAhPSAwKSB7CisgICAgICAgICpwb3J0SWQgPSBtUmVjb3JkLT5nZXRQb3J0SWQoKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DbGVhckZpbGVTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2xlYXJGaWxlU291cmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2EyY2I3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2xlYXJGaWxlU291cmNlLmNwcApAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2xlYXJGaWxlU291cmNlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DbGVhckZpbGVTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitDbGVhckZpbGVTb3VyY2U6OkNsZWFyRmlsZVNvdXJjZShjb25zdCBjaGFyICpmaWxlbmFtZSkKKyAgICA6IG1GZCgtMSksCisgICAgICBtT2Zmc2V0KDApLAorICAgICAgbUxlbmd0aCgtMSksCisgICAgICBtTmFtZSgiPG51bGw+IikgeworCisgICAgaWYgKGZpbGVuYW1lKSB7CisgICAgICAgIG1OYW1lID0gU3RyaW5nODo6Zm9ybWF0KCJGaWxlU291cmNlKCVzKSIsIGZpbGVuYW1lKTsKKyAgICB9CisgICAgQUxPR1YoIiVzIiwgZmlsZW5hbWUpOworICAgIG1GZCA9IG9wZW4oZmlsZW5hbWUsIE9fTEFSR0VGSUxFIHwgT19SRE9OTFkpOworCisgICAgaWYgKG1GZCA+PSAwKSB7CisgICAgICAgIG1MZW5ndGggPSBsc2VlazY0KG1GZCwgMCwgU0VFS19FTkQpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb3BlbiBmaWxlICclcycuICglcykiLCBmaWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICB9Cit9CisKK0NsZWFyRmlsZVNvdXJjZTo6Q2xlYXJGaWxlU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKQorICAgIDogbUZkKGZkKSwKKyAgICAgIG1PZmZzZXQob2Zmc2V0KSwKKyAgICAgIG1MZW5ndGgobGVuZ3RoKSwKKyAgICAgIG1OYW1lKCI8bnVsbD4iKSB7CisgICAgQUxPR1YoImZkPSVkICglcyksIG9mZnNldD0lbGxkLCBsZW5ndGg9JWxsZCIsCisgICAgICAgICAgICBmZCwgbmFtZUZvckZkKGZkKS5jX3N0cigpLCAobG9uZyBsb25nKSBvZmZzZXQsIChsb25nIGxvbmcpIGxlbmd0aCk7CisKKyAgICBpZiAobU9mZnNldCA8IDApIHsKKyAgICAgICAgbU9mZnNldCA9IDA7CisgICAgfQorICAgIGlmIChtTGVuZ3RoIDwgMCkgeworICAgICAgICBtTGVuZ3RoID0gMDsKKyAgICB9CisgICAgaWYgKG1MZW5ndGggPiBJTlQ2NF9NQVggLSBtT2Zmc2V0KSB7CisgICAgICAgIG1MZW5ndGggPSBJTlQ2NF9NQVggLSBtT2Zmc2V0OworICAgIH0KKyAgICBzdHJ1Y3Qgc3RhdCBzOworICAgIGlmIChmc3RhdChmZCwgJnMpID09IDApIHsKKyAgICAgICAgaWYgKG1PZmZzZXQgPiBzLnN0X3NpemUpIHsKKyAgICAgICAgICAgIG1PZmZzZXQgPSBzLnN0X3NpemU7CisgICAgICAgICAgICBtTGVuZ3RoID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAobU9mZnNldCArIG1MZW5ndGggPiBzLnN0X3NpemUpIHsKKyAgICAgICAgICAgIG1MZW5ndGggPSBzLnN0X3NpemUgLSBtT2Zmc2V0OworICAgICAgICB9CisgICAgfQorICAgIGlmIChtT2Zmc2V0ICE9IG9mZnNldCB8fCBtTGVuZ3RoICE9IGxlbmd0aCkgeworICAgICAgICBBTE9HVygib2Zmc2V0L2xlbmd0aCBhZGp1c3RlZCBmcm9tICVsbGQvJWxsZCB0byAlbGxkLyVsbGQiLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIG9mZnNldCwgKGxvbmcgbG9uZykgbGVuZ3RoLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIG1PZmZzZXQsIChsb25nIGxvbmcpIG1MZW5ndGgpOworICAgIH0KKworICAgIG1OYW1lID0gU3RyaW5nODo6Zm9ybWF0KAorICAgICAgICAgICAgIkZpbGVTb3VyY2UoZmQoJXMpLCAlbGxkLCAlbGxkKSIsCisgICAgICAgICAgICBuYW1lRm9yRmQoZmQpLmNfc3RyKCksCisgICAgICAgICAgICAobG9uZyBsb25nKSBtT2Zmc2V0LAorICAgICAgICAgICAgKGxvbmcgbG9uZykgbUxlbmd0aCk7CisKK30KKworQ2xlYXJGaWxlU291cmNlOjp+Q2xlYXJGaWxlU291cmNlKCkgeworICAgIGlmIChtRmQgPj0gMCkgeworICAgICAgICA6OmNsb3NlKG1GZCk7CisgICAgICAgIG1GZCA9IC0xOworICAgIH0KK30KKworc3RhdHVzX3QgQ2xlYXJGaWxlU291cmNlOjppbml0Q2hlY2soKSBjb25zdCB7CisgICAgcmV0dXJuIG1GZCA+PSAwID8gT0sgOiBOT19JTklUOworfQorCitzc2l6ZV90IENsZWFyRmlsZVNvdXJjZTo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChtRmQgPCAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKG1MZW5ndGggPj0gMCkgeworICAgICAgICBpZiAob2Zmc2V0ID49IG1MZW5ndGgpIHsKKyAgICAgICAgICAgIHJldHVybiAwOyAgLy8gcmVhZCBiZXlvbmQgRU9GLgorICAgICAgICB9CisgICAgICAgIHVpbnQ2NF90IG51bUF2YWlsYWJsZSA9IG1MZW5ndGggLSBvZmZzZXQ7CisgICAgICAgIGlmICgodWludDY0X3Qpc2l6ZSA+IG51bUF2YWlsYWJsZSkgeworICAgICAgICAgICAgc2l6ZSA9IG51bUF2YWlsYWJsZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVhZEF0X2wob2Zmc2V0LCBkYXRhLCBzaXplKTsKK30KKworc3NpemVfdCBDbGVhckZpbGVTb3VyY2U6OnJlYWRBdF9sKG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIG9mZjY0X3QgcmVzdWx0ID0gbHNlZWs2NChtRmQsIG9mZnNldCArIG1PZmZzZXQsIFNFRUtfU0VUKTsKKyAgICBpZiAocmVzdWx0ID09IC0xKSB7CisgICAgICAgIEFMT0dFKCJzZWVrIHRvICVsbGQgZmFpbGVkIiwgKGxvbmcgbG9uZykob2Zmc2V0ICsgbU9mZnNldCkpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gOjpyZWFkKG1GZCwgZGF0YSwgc2l6ZSk7Cit9CisKK3N0YXR1c190IENsZWFyRmlsZVNvdXJjZTo6Z2V0U2l6ZShvZmY2NF90ICpzaXplKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtRmQgPCAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgICpzaXplID0gbUxlbmd0aDsKKworICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5jcHAKaW5kZXggZWVmNTMxNC4uYWVlN2ZkOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5jcHAKQEAgLTIyLDkwICsyMiwyOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBGaWxlU291cmNlOjpGaWxlU291cmNlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotICAgIDogbUZkKC0xKSwKLSAgICAgIG1PZmZzZXQoMCksCi0gICAgICBtTGVuZ3RoKC0xKSwKLSAgICAgIG1OYW1lKCI8bnVsbD4iKSwKKyAgICA6IENsZWFyRmlsZVNvdXJjZShmaWxlbmFtZSksCiAgICAgICBtRGVjcnlwdEhhbmRsZShOVUxMKSwKICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50KE5VTEwpLAogICAgICAgbURybUJ1Zk9mZnNldCgwKSwKICAgICAgIG1Ecm1CdWZTaXplKDApLAogICAgICAgbURybUJ1ZihOVUxMKXsKLQotICAgIGlmIChmaWxlbmFtZSkgewotICAgICAgICBtTmFtZSA9IFN0cmluZzg6OmZvcm1hdCgiRmlsZVNvdXJjZSglcykiLCBmaWxlbmFtZSk7Ci0gICAgfQotICAgIEFMT0dWKCIlcyIsIGZpbGVuYW1lKTsKLSAgICBtRmQgPSBvcGVuKGZpbGVuYW1lLCBPX0xBUkdFRklMRSB8IE9fUkRPTkxZKTsKLQotICAgIGlmIChtRmQgPj0gMCkgewotICAgICAgICBtTGVuZ3RoID0gbHNlZWs2NChtRmQsIDAsIFNFRUtfRU5EKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9wZW4gZmlsZSAnJXMnLiAoJXMpIiwgZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgfQogfQogCiBGaWxlU291cmNlOjpGaWxlU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKQotICAgIDogbUZkKGZkKSwKLSAgICAgIG1PZmZzZXQob2Zmc2V0KSwKLSAgICAgIG1MZW5ndGgobGVuZ3RoKSwKLSAgICAgIG1OYW1lKCI8bnVsbD4iKSwKKyAgICA6IENsZWFyRmlsZVNvdXJjZShmZCwgb2Zmc2V0LCBsZW5ndGgpLAogICAgICAgbURlY3J5cHRIYW5kbGUoTlVMTCksCiAgICAgICBtRHJtTWFuYWdlckNsaWVudChOVUxMKSwKICAgICAgIG1Ecm1CdWZPZmZzZXQoMCksCiAgICAgICBtRHJtQnVmU2l6ZSgwKSwKICAgICAgIG1Ecm1CdWYoTlVMTCkgewotICAgIEFMT0dWKCJmZD0lZCAoJXMpLCBvZmZzZXQ9JWxsZCwgbGVuZ3RoPSVsbGQiLAotICAgICAgICAgICAgZmQsIG5hbWVGb3JGZChmZCkuY19zdHIoKSwgKGxvbmcgbG9uZykgb2Zmc2V0LCAobG9uZyBsb25nKSBsZW5ndGgpOwotCi0gICAgaWYgKG1PZmZzZXQgPCAwKSB7Ci0gICAgICAgIG1PZmZzZXQgPSAwOwotICAgIH0KLSAgICBpZiAobUxlbmd0aCA8IDApIHsKLSAgICAgICAgbUxlbmd0aCA9IDA7Ci0gICAgfQotICAgIGlmIChtTGVuZ3RoID4gSU5UNjRfTUFYIC0gbU9mZnNldCkgewotICAgICAgICBtTGVuZ3RoID0gSU5UNjRfTUFYIC0gbU9mZnNldDsKLSAgICB9Ci0gICAgc3RydWN0IHN0YXQgczsKLSAgICBpZiAoZnN0YXQoZmQsICZzKSA9PSAwKSB7Ci0gICAgICAgIGlmIChtT2Zmc2V0ID4gcy5zdF9zaXplKSB7Ci0gICAgICAgICAgICBtT2Zmc2V0ID0gcy5zdF9zaXplOwotICAgICAgICAgICAgbUxlbmd0aCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1PZmZzZXQgKyBtTGVuZ3RoID4gcy5zdF9zaXplKSB7Ci0gICAgICAgICAgICBtTGVuZ3RoID0gcy5zdF9zaXplIC0gbU9mZnNldDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobU9mZnNldCAhPSBvZmZzZXQgfHwgbUxlbmd0aCAhPSBsZW5ndGgpIHsKLSAgICAgICAgQUxPR1coIm9mZnNldC9sZW5ndGggYWRqdXN0ZWQgZnJvbSAlbGxkLyVsbGQgdG8gJWxsZC8lbGxkIiwKLSAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBvZmZzZXQsIChsb25nIGxvbmcpIGxlbmd0aCwKLSAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBtT2Zmc2V0LCAobG9uZyBsb25nKSBtTGVuZ3RoKTsKLSAgICB9Ci0KLSAgICBtTmFtZSA9IFN0cmluZzg6OmZvcm1hdCgKLSAgICAgICAgICAgICJGaWxlU291cmNlKGZkKCVzKSwgJWxsZCwgJWxsZCkiLAotICAgICAgICAgICAgbmFtZUZvckZkKGZkKS5jX3N0cigpLAotICAgICAgICAgICAgKGxvbmcgbG9uZykgbU9mZnNldCwKLSAgICAgICAgICAgIChsb25nIGxvbmcpIG1MZW5ndGgpOwotCiB9CiAKIEZpbGVTb3VyY2U6On5GaWxlU291cmNlKCkgewotICAgIGlmIChtRmQgPj0gMCkgewotICAgICAgICA6OmNsb3NlKG1GZCk7Ci0gICAgICAgIG1GZCA9IC0xOwotICAgIH0KLQogICAgIGlmIChtRHJtQnVmICE9IE5VTEwpIHsKICAgICAgICAgZGVsZXRlW10gbURybUJ1ZjsKICAgICAgICAgbURybUJ1ZiA9IE5VTEw7CkBAIC0xMjQsMTAgKzYyLDYgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IEZpbGVTb3VyY2U6OmluaXRDaGVjaygpIGNvbnN0IHsKLSAgICByZXR1cm4gbUZkID49IDAgPyBPSyA6IE5PX0lOSVQ7Ci19Ci0KIHNzaXplX3QgRmlsZVNvdXJjZTo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewogICAgIGlmIChtRmQgPCAwKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwpAQCAtMTQ3LDMwICs4MSwxMiBAQAogCiAgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwgJiYgRGVjcnlwdEFwaVR5cGU6OkNPTlRBSU5FUl9CQVNFRAogICAgICAgICAgICAgPT0gbURlY3J5cHRIYW5kbGUtPmRlY3J5cHRBcGlUeXBlKSB7Ci0gICAgICAgIHJldHVybiByZWFkQXREUk0ob2Zmc2V0LCBkYXRhLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIHJlYWRBdERSTV9sKG9mZnNldCwgZGF0YSwgc2l6ZSk7CiAgICB9IGVsc2UgewotICAgICAgICBvZmY2NF90IHJlc3VsdCA9IGxzZWVrNjQobUZkLCBvZmZzZXQgKyBtT2Zmc2V0LCBTRUVLX1NFVCk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKLSAgICAgICAgICAgIEFMT0dFKCJzZWVrIHRvICVsbGQgZmFpbGVkIiwgKGxvbmcgbG9uZykob2Zmc2V0ICsgbU9mZnNldCkpOwotICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gOjpyZWFkKG1GZCwgZGF0YSwgc2l6ZSk7CisgICAgICAgIHJldHVybiByZWFkQXRfbChvZmZzZXQsIGRhdGEsIHNpemUpOwogICAgIH0KIH0KIAotc3RhdHVzX3QgRmlsZVNvdXJjZTo6Z2V0U2l6ZShvZmY2NF90ICpzaXplKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtRmQgPCAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLQotICAgICpzaXplID0gbUxlbmd0aDsKLQotICAgIHJldHVybiBPSzsKLX0KLQogc3A8RGVjcnlwdEhhbmRsZT4gRmlsZVNvdXJjZTo6RHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciAqbWltZSkgewogICAgIGlmIChnZXR1aWQoKSA9PSBBSURfTUVESUFfRVgpIHJldHVybiBudWxscHRyOyAvLyBubyBEUk0gaW4gbWVkaWEgZXh0cmFjdG9yCiAgICAgaWYgKG1Ecm1NYW5hZ2VyQ2xpZW50ID09IE5VTEwpIHsKQEAgLTE5NCw3ICsxMTAsNyBAQAogICAgIHJldHVybiBtRGVjcnlwdEhhbmRsZTsKIH0KIAotc3NpemVfdCBGaWxlU291cmNlOjpyZWFkQXREUk0ob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Citzc2l6ZV90IEZpbGVTb3VyY2U6OnJlYWRBdERSTV9sKG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewogICAgIHNpemVfdCBEUk1fQ0FDSEVfU0laRSA9IDEwMjQ7CiAgICAgaWYgKG1Ecm1CdWYgPT0gTlVMTCkgewogICAgICAgICBtRHJtQnVmID0gbmV3IHVuc2lnbmVkIGNoYXJbRFJNX0NBQ0hFX1NJWkVdOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVEZWNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lRGVjb2Rlci5jcHAKaW5kZXggNmU5NDUxNy4uYzYyYzA1YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZURlY29kZXIuY3BwCkBAIC01MDEsOSArNTAxLDE1IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCi0gICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OwotICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkpOwotICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSk7CisgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHNyY0Zvcm1hdDsKKyAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkgfHwKKyAgICAgICAgICAgICFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkgfHwKKyAgICAgICAgICAgICFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigic3RyaWRlIiwgJnN0cmlkZSkgfHwKKyAgICAgICAgICAgICFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJnNyY0Zvcm1hdCkpIHsKKyAgICAgICAgQUxPR0UoImZvcm1hdCBtaXNzaW5nIGRpbWVuc2lvbiBvciBjb2xvcjogJXMiLAorICAgICAgICAgICAgICAgIG91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CiAKICAgICBpbnQzMl90IGNyb3BfbGVmdCwgY3JvcF90b3AsIGNyb3BfcmlnaHQsIGNyb3BfYm90dG9tOwogICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kUmVjdCgiY3JvcCIsICZjcm9wX2xlZnQsICZjcm9wX3RvcCwgJmNyb3BfcmlnaHQsICZjcm9wX2JvdHRvbSkpIHsKQEAgLTUyMiwxOSArNTI4LDI3IEBACiAgICAgYWRkRnJhbWUoZnJhbWVNZW0pOwogICAgIFZpZGVvRnJhbWUqIGZyYW1lID0gc3RhdGljX2Nhc3Q8VmlkZW9GcmFtZSo+KGZyYW1lTWVtLT5wb2ludGVyKCkpOwogCi0gICAgaW50MzJfdCBzcmNGb3JtYXQ7Ci0gICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZzcmNGb3JtYXQpKTsKLQogICAgIENvbG9yQ29udmVydGVyIGNvbnZlcnRlcigoT01YX0NPTE9SX0ZPUk1BVFRZUEUpc3JjRm9ybWF0LCBkc3RGb3JtYXQoKSk7CiAKKyAgICB1aW50MzJfdCBzdGFuZGFyZCwgcmFuZ2UsIHRyYW5zZmVyOworICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLXN0YW5kYXJkIiwgKGludDMyX3QqKSZzdGFuZGFyZCkpIHsKKyAgICAgICAgc3RhbmRhcmQgPSAwOworICAgIH0KKyAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1yYW5nZSIsIChpbnQzMl90KikmcmFuZ2UpKSB7CisgICAgICAgIHJhbmdlID0gMDsKKyAgICB9CisgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItdHJhbnNmZXIiLCAoaW50MzJfdCopJnRyYW5zZmVyKSkgeworICAgICAgICB0cmFuc2ZlciA9IDA7CisgICAgfQorICAgIGNvbnZlcnRlci5zZXRTcmNDb2xvclNwYWNlKHN0YW5kYXJkLCByYW5nZSwgdHJhbnNmZXIpOworCiAgICAgaWYgKGNvbnZlcnRlci5pc1ZhbGlkKCkpIHsKICAgICAgICAgY29udmVydGVyLmNvbnZlcnQoCiAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKil2aWRlb0ZyYW1lQnVmZmVyLT5kYXRhKCksCi0gICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgY3JvcF9sZWZ0LCBjcm9wX3RvcCwgY3JvcF9yaWdodCwgY3JvcF9ib3R0b20sCiAgICAgICAgICAgICAgICAgZnJhbWUtPmdldEZsYXR0ZW5lZERhdGEoKSwKLSAgICAgICAgICAgICAgICBmcmFtZS0+bVdpZHRoLAotICAgICAgICAgICAgICAgIGZyYW1lLT5tSGVpZ2h0LAorICAgICAgICAgICAgICAgIGZyYW1lLT5tV2lkdGgsIGZyYW1lLT5tSGVpZ2h0LCBmcmFtZS0+bVJvd0J5dGVzLAogICAgICAgICAgICAgICAgIGNyb3BfbGVmdCwgY3JvcF90b3AsIGNyb3BfcmlnaHQsIGNyb3BfYm90dG9tKTsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KQEAgLTY4MSw5ICs2OTUsMTAgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKLSAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGU7CiAgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSk7CiAgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKTsKKyAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigic3RyaWRlIiwgJnN0cmlkZSkpOwogCiAgICAgaWYgKG1GcmFtZSA9PSBOVUxMKSB7CiAgICAgICAgIHNwPElNZW1vcnk+IGZyYW1lTWVtID0gYWxsb2NWaWRlb0ZyYW1lKApAQCAtNjk4LDYgKzcxMywxOCBAQAogCiAgICAgQ29sb3JDb252ZXJ0ZXIgY29udmVydGVyKChPTVhfQ09MT1JfRk9STUFUVFlQRSlzcmNGb3JtYXQsIGRzdEZvcm1hdCgpKTsKIAorICAgIHVpbnQzMl90IHN0YW5kYXJkLCByYW5nZSwgdHJhbnNmZXI7CisgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3Itc3RhbmRhcmQiLCAoaW50MzJfdCopJnN0YW5kYXJkKSkgeworICAgICAgICBzdGFuZGFyZCA9IDA7CisgICAgfQorICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLXJhbmdlIiwgKGludDMyX3QqKSZyYW5nZSkpIHsKKyAgICAgICAgcmFuZ2UgPSAwOworICAgIH0KKyAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci10cmFuc2ZlciIsIChpbnQzMl90KikmdHJhbnNmZXIpKSB7CisgICAgICAgIHRyYW5zZmVyID0gMDsKKyAgICB9CisgICAgY29udmVydGVyLnNldFNyY0NvbG9yU3BhY2Uoc3RhbmRhcmQsIHJhbmdlLCB0cmFuc2Zlcik7CisKICAgICBpbnQzMl90IGRzdExlZnQsIGRzdFRvcCwgZHN0UmlnaHQsIGRzdEJvdHRvbTsKICAgICBkc3RMZWZ0ID0gbVRpbGVzRGVjb2RlZCAlIG1HcmlkQ29scyAqIHdpZHRoOwogICAgIGRzdFRvcCA9IG1UaWxlc0RlY29kZWQgLyBtR3JpZENvbHMgKiBoZWlnaHQ7CkBAIC03MjcsMTEgKzc1NCwxMCBAQAogICAgIGlmIChjb252ZXJ0ZXIuaXNWYWxpZCgpKSB7CiAgICAgICAgIGNvbnZlcnRlci5jb252ZXJ0KAogICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopdmlkZW9GcmFtZUJ1ZmZlci0+ZGF0YSgpLAotICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgc3RyaWRlLAogICAgICAgICAgICAgICAgIGNyb3BfbGVmdCwgY3JvcF90b3AsIGNyb3BfcmlnaHQsIGNyb3BfYm90dG9tLAogICAgICAgICAgICAgICAgIG1GcmFtZS0+Z2V0RmxhdHRlbmVkRGF0YSgpLAotICAgICAgICAgICAgICAgIG1GcmFtZS0+bVdpZHRoLAotICAgICAgICAgICAgICAgIG1GcmFtZS0+bUhlaWdodCwKKyAgICAgICAgICAgICAgICBtRnJhbWUtPm1XaWR0aCwgbUZyYW1lLT5tSGVpZ2h0LCBtRnJhbWUtPm1Sb3dCeXRlcywKICAgICAgICAgICAgICAgICBkc3RMZWZ0LCBkc3RUb3AsIGRzdFJpZ2h0LCBkc3RCb3R0b20pOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUEJhc2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUEJhc2UuY3BwCmluZGV4IDBmMjQzMjkuLmQxMThlOGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBCYXNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQQmFzZS5jcHAKQEAgLTI2LDggKzI2LDYgQEAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGN1dGlscy9xdGFndWlkLmg+CiAKLSNpbmNsdWRlIDxOZXRkQ2xpZW50Lmg+Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogSFRUUEJhc2U6OkhUVFBCYXNlKCkKQEAgLTExNCwzMCArMTEyLDQgQEAKICAgICBtTWF4QmFuZHdpZHRoSGlzdG9yeUl0ZW1zID0gbnVtSGlzdG9yeUl0ZW1zOwogfQogCi0vLyBzdGF0aWMKLXZvaWQgSFRUUEJhc2U6OlJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQgc29ja2ZkLCB1aWRfdCB1aWQsIHVpbnQzMl90IGtUYWcpIHsKLSAgICBpbnQgcmVzID0gcXRhZ3VpZF90YWdTb2NrZXQoc29ja2ZkLCBrVGFnLCB1aWQpOwotICAgIGlmIChyZXMgIT0gMCkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRhZ2dpbmcgc29ja2V0ICVkIGZvciB1aWQgJWQgKE15IFVJRD0lZCkiLCBzb2NrZmQsIHVpZCwgZ2V0ZXVpZCgpKTsKLSAgICB9Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcoaW50IHNvY2tmZCkgewotICAgIGludCByZXMgPSBxdGFndWlkX3VudGFnU29ja2V0KHNvY2tmZCk7Ci0gICAgaWYgKHJlcyAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdW50YWdnaW5nIHNvY2tldCAlZCAoTXkgVUlEPSVkKSIsIHNvY2tmZCwgZ2V0ZXVpZCgpKTsKLSAgICB9Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQgc29ja2ZkLCB1aWRfdCB1aWQpIHsKLSAgICBzZXROZXR3b3JrRm9yVXNlcih1aWQsIHNvY2tmZCk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQpIHsKLSAgICBSZWdpc3RlclNvY2tldFVzZXJNYXJrKHNvY2tmZCwgZ2V0ZXVpZCgpKTsKLX0KLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcAppbmRleCA2ZmYzZDc4Li5iNDVlYjAzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCkBAIC0xMzcsNiArMTM3LDggQEAKIAogcHJpdmF0ZToKICAgICBlbnVtIHsKKyAgICAgICAgLy8gVE9ETzogbmVlZCB0byBpbmNyZWFzZSB0aGlzIGNvbnNpZGVyaW5nIHRoZSBidWcKKyAgICAgICAgLy8gYWJvdXQgY2FtZXJhIGFwcCBub3Qgc2VuZGluZyB2aWRlbyBmcmFtZXMgY29udGludW91c2x5PwogICAgICAgICBrTWF4Q3R0c09mZnNldFRpbWVVcyA9IDEwMDAwMDBMTCwgIC8vIDEgc2Vjb25kCiAgICAgICAgIGtTYW1wbGVBcnJheVNpemUgPSAxMDAwLAogICAgIH07CkBAIC0zMTcsNiArMzE5LDcgQEAKICAgICBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAxPiAqbVN0c3NUYWJsZUVudHJpZXM7CiAgICAgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMj4gKm1TdHRzVGFibGVFbnRyaWVzOwogICAgIExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDI+ICptQ3R0c1RhYmxlRW50cmllczsKKyAgICBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAzPiAqbUVsc3RUYWJsZUVudHJpZXM7IC8vIDNjb2x1bW5zOiBzZWdEdXJhdGlvbiwgbWVkaWFUaW1lLCBtZWRpYVJhdGUKIAogICAgIGludDY0X3QgbU1pbkN0dHNPZmZzZXRUaW1lVXM7CiAgICAgaW50NjRfdCBtTWluQ3R0c09mZnNldFRpY2tzOwpAQCAtNDE2LDYgKzQxOSw4IEBACiAgICAgLy8gRHVyYXRpb24gaXMgdGltZSBzY2FsZSBiYXNlZAogICAgIHZvaWQgYWRkT25lU3R0c1RhYmxlRW50cnkoc2l6ZV90IHNhbXBsZUNvdW50LCBpbnQzMl90IHRpbWVzY2FsZWREdXIpOwogICAgIHZvaWQgYWRkT25lQ3R0c1RhYmxlRW50cnkoc2l6ZV90IHNhbXBsZUNvdW50LCBpbnQzMl90IHRpbWVzY2FsZWREdXIpOworICAgIHZvaWQgYWRkT25lRWxzdFRhYmxlRW50cnkodWludDMyX3Qgc2VnbWVudER1cmF0aW9uLCBpbnQzMl90IG1lZGlhVGltZSwKKyAgICAgICAgaW50MTZfdCBtZWRpYVJhdGUsIGludDE2X3QgbWVkaWFSYXRlRnJhY3Rpb24pOwogCiAgICAgYm9vbCBpc1RyYWNrTWFsRm9ybWVkKCkgY29uc3Q7CiAgICAgdm9pZCBzZW5kVHJhY2tTdW1tYXJ5KGJvb2wgaGFzTXVsdGlwbGVUcmFja3MpOwpAQCAtNDQ4LDYgKzQ1Myw3IEBACiAgICAgdm9pZCB3cml0ZVZpZGVvRm91ckNDQm94KCk7CiAgICAgdm9pZCB3cml0ZU1ldGFkYXRhRm91ckNDQm94KCk7CiAgICAgdm9pZCB3cml0ZVN0YmxCb3goYm9vbCB1c2UzMkJpdE9mZnNldCk7CisgICAgdm9pZCB3cml0ZUVkdHNCb3goKTsKIAogICAgIFRyYWNrKGNvbnN0IFRyYWNrICYpOwogICAgIFRyYWNrICZvcGVyYXRvcj0oY29uc3QgVHJhY2sgJik7CkBAIC00ODMsNiArNDg5LDcgQEAKIAogICAgIG1TdGFydFRpbWVzdGFtcFVzID0gLTFsbDsKICAgICBtU3RhcnRUaW1lT2Zmc2V0TXMgPSAtMTsKKyAgICBtU3RhcnRUaW1lT2Zmc2V0QkZyYW1lc1VzID0gMDsKICAgICBtUGF1c2VkID0gZmFsc2U7CiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKICAgICBtV3JpdGVyVGhyZWFkU3RhcnRlZCA9IGZhbHNlOwpAQCAtMTI3Miw2ICsxMjc5LDEwIEBACiAgICAgLy8gQWRqdXN0IHRoZSBnbG9iYWwgc3RhcnQgdGltZS4KICAgICBtU3RhcnRUaW1lc3RhbXBVcyArPSBtaW5DdHRzT2Zmc2V0VGltZVVzIC0ga01heEN0dHNPZmZzZXRUaW1lVXM7CiAKKyAgICAvLyBBZGQgbVN0YXJ0VGltZU9mZnNldEJGcmFtZXNVcygtdmUgb3IgemVybykgdG8gdGhlIGR1cmF0aW9uIG9mIGZpcnN0IGVudHJ5IGluIFNUVFMuCisgICAgbVN0YXJ0VGltZU9mZnNldEJGcmFtZXNVcyA9IG1pbkN0dHNPZmZzZXRUaW1lVXMgLSBrTWF4Q3R0c09mZnNldFRpbWVVczsKKyAgICBBTE9HVigibVN0YXJ0VGltZU9mZnNldEJGcmFtZXNVcyA6JSIgUFJJZDMyLCBtU3RhcnRUaW1lT2Zmc2V0QkZyYW1lc1VzKTsKKwogICAgIGZvciAoTGlzdDxUcmFjayAqPjo6aXRlcmF0b3IgaXQgPSBtVHJhY2tzLmJlZ2luKCk7CiAgICAgICAgIGl0ICE9IG1UcmFja3MuZW5kKCk7ICsraXQpIHsKICAgICAgICAgaWYgKCEoKml0KS0+aXNIZWljKCkpIHsKQEAgLTE3NDcsNiArMTc1OCwxMSBAQAogICAgIHJldHVybiBtU3RhcnRUaW1lc3RhbXBVczsKIH0KIAoraW50MzJfdCBNUEVHNFdyaXRlcjo6Z2V0U3RhcnRUaW1lT2Zmc2V0QkZyYW1lc1VzKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1TdGFydFRpbWVPZmZzZXRCRnJhbWVzVXM7Cit9CisKIHNpemVfdCBNUEVHNFdyaXRlcjo6bnVtVHJhY2tzKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7CiAgICAgcmV0dXJuIG1UcmFja3Muc2l6ZSgpOwpAQCAtMTc3Niw2ICsxNzkyLDcgQEAKICAgICAgIG1TdHNzVGFibGVFbnRyaWVzKG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAxPigxMDAwKSksCiAgICAgICBtU3R0c1RhYmxlRW50cmllcyhuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMj4oMTAwMCkpLAogICAgICAgbUN0dHNUYWJsZUVudHJpZXMobmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDI+KDEwMDApKSwKKyAgICAgIG1FbHN0VGFibGVFbnRyaWVzKG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAzPigzKSksIC8vIFJlc2VydmUgMyByb3dzLCBhIHJvdyBoYXMgMyBpdGVtcwogICAgICAgbU1pbkN0dHNPZmZzZXRUaW1lVXMoMCksCiAgICAgICBtTWluQ3R0c09mZnNldFRpY2tzKDApLAogICAgICAgbU1heEN0dHNPZmZzZXRUaWNrcygwKSwKQEAgLTE4NDIsNDYgKzE4NTksNDggQEAKIAogLy8gQ2xlYXIgYWxsIHRoZSBpbnRlcm5hbCBzdGF0ZXMgZXhjZXB0IHRoZSBDU0QgZGF0YS4KIHZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjpyZXNldEludGVybmFsKCkgewotICAgICAgbURvbmUgPSBmYWxzZTsKLSAgICAgIG1QYXVzZWQgPSBmYWxzZTsKLSAgICAgIG1SZXN1bWVkID0gZmFsc2U7Ci0gICAgICBtU3RhcnRlZCA9IGZhbHNlOwotICAgICAgbUdvdFN0YXJ0S2V5RnJhbWUgPSBmYWxzZTsKLSAgICAgIG1Jc01hbGZvcm1lZCA9IGZhbHNlOwotICAgICAgbVRyYWNrRHVyYXRpb25VcyA9IDA7Ci0gICAgICBtRXN0aW1hdGVkVHJhY2tTaXplQnl0ZXMgPSAwOwotICAgICAgbVNhbXBsZXNIYXZlU2FtZVNpemUgPSAwOwotICAgICAgaWYgKG1TdHN6VGFibGVFbnRyaWVzICE9IE5VTEwpIHsKLSAgICAgICAgIGRlbGV0ZSBtU3RzelRhYmxlRW50cmllczsKLSAgICAgICAgIG1TdHN6VGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDE+KDEwMDApOwotICAgICAgfQotCi0gICAgICBpZiAobVN0Y29UYWJsZUVudHJpZXMgIT0gTlVMTCkgewotICAgICAgICAgZGVsZXRlIG1TdGNvVGFibGVFbnRyaWVzOwotICAgICAgICAgbVN0Y29UYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMT4oMTAwMCk7Ci0gICAgICB9Ci0gICAgICBpZiAobUNvNjRUYWJsZUVudHJpZXMgIT0gTlVMTCkgewotICAgICAgICAgZGVsZXRlIG1DbzY0VGFibGVFbnRyaWVzOwotICAgICAgICAgbUNvNjRUYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczxvZmY2NF90LCAxPigxMDAwKTsKLSAgICAgIH0KLQotICAgICAgaWYgKG1TdHNjVGFibGVFbnRyaWVzICE9IE5VTEwpIHsKLSAgICAgICAgIGRlbGV0ZSBtU3RzY1RhYmxlRW50cmllczsKLSAgICAgICAgIG1TdHNjVGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDM+KDEwMDApOwotICAgICAgfQotICAgICAgaWYgKG1TdHNzVGFibGVFbnRyaWVzICE9IE5VTEwpIHsKLSAgICAgICAgIGRlbGV0ZSBtU3Rzc1RhYmxlRW50cmllczsKLSAgICAgICAgIG1TdHNzVGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDE+KDEwMDApOwotICAgICAgfQotICAgICAgaWYgKG1TdHRzVGFibGVFbnRyaWVzICE9IE5VTEwpIHsKLSAgICAgICAgIGRlbGV0ZSBtU3R0c1RhYmxlRW50cmllczsKLSAgICAgICAgIG1TdHRzVGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDI+KDEwMDApOwotICAgICAgfQotICAgICAgaWYgKG1DdHRzVGFibGVFbnRyaWVzICE9IE5VTEwpIHsKLSAgICAgICAgIGRlbGV0ZSBtQ3R0c1RhYmxlRW50cmllczsKLSAgICAgICAgIG1DdHRzVGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDI+KDEwMDApOwotICAgICAgfQotICAgICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKKyAgICBtRG9uZSA9IGZhbHNlOworICAgIG1QYXVzZWQgPSBmYWxzZTsKKyAgICBtUmVzdW1lZCA9IGZhbHNlOworICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgbUdvdFN0YXJ0S2V5RnJhbWUgPSBmYWxzZTsKKyAgICBtSXNNYWxmb3JtZWQgPSBmYWxzZTsKKyAgICBtVHJhY2tEdXJhdGlvblVzID0gMDsKKyAgICBtRXN0aW1hdGVkVHJhY2tTaXplQnl0ZXMgPSAwOworICAgIG1TYW1wbGVzSGF2ZVNhbWVTaXplID0gMDsKKyAgICBpZiAobVN0c3pUYWJsZUVudHJpZXMgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbVN0c3pUYWJsZUVudHJpZXM7CisgICAgICAgIG1TdHN6VGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDE+KDEwMDApOworICAgIH0KKyAgICBpZiAobVN0Y29UYWJsZUVudHJpZXMgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbVN0Y29UYWJsZUVudHJpZXM7CisgICAgICAgIG1TdGNvVGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDE+KDEwMDApOworICAgIH0KKyAgICBpZiAobUNvNjRUYWJsZUVudHJpZXMgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbUNvNjRUYWJsZUVudHJpZXM7CisgICAgICAgIG1DbzY0VGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8b2ZmNjRfdCwgMT4oMTAwMCk7CisgICAgfQorICAgIGlmIChtU3RzY1RhYmxlRW50cmllcyAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtU3RzY1RhYmxlRW50cmllczsKKyAgICAgICAgbVN0c2NUYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMz4oMTAwMCk7CisgICAgfQorICAgIGlmIChtU3Rzc1RhYmxlRW50cmllcyAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtU3Rzc1RhYmxlRW50cmllczsKKyAgICAgICAgbVN0c3NUYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMT4oMTAwMCk7CisgICAgfQorICAgIGlmIChtU3R0c1RhYmxlRW50cmllcyAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtU3R0c1RhYmxlRW50cmllczsKKyAgICAgICAgbVN0dHNUYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMj4oMTAwMCk7CisgICAgfQorICAgIGlmIChtQ3R0c1RhYmxlRW50cmllcyAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtQ3R0c1RhYmxlRW50cmllczsKKyAgICAgICAgbUN0dHNUYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMj4oMTAwMCk7CisgICAgfQorICAgIGlmIChtRWxzdFRhYmxlRW50cmllcyAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtRWxzdFRhYmxlRW50cmllczsKKyAgICAgICAgbUVsc3RUYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMz4oMyk7CisgICAgfQorICAgIG1SZWFjaGVkRU9TID0gZmFsc2U7CiB9CiAKIHZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp1cGRhdGVUcmFja1NpemVFc3RpbWF0ZSgpIHsKQEAgLTE5MDAsNiArMTkxOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3Rzc1RhYmxlRW50cmllcy0+Y291bnQoKSAqIDQgKyAgIC8vIHN0c3MgYm94IHNpemUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHRzVGFibGVFbnRyaWVzLT5jb3VudCgpICogOCArICAgLy8gc3R0cyBib3ggc2l6ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN0dHNUYWJsZUVudHJpZXMtPmNvdW50KCkgKiA4ICsgICAvLyBjdHRzIGJveCBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWxzdFRhYmxlRW50cmllcy0+Y291bnQoKSAqIDEyICsgICAvLyBlbHN0IGJveCBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGNvQm94U2l6ZUJ5dGVzICsgICAgICAgICAgIC8vIHN0Y28gYm94IHNpemUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0c3pCb3hTaXplQnl0ZXM7ICAgICAgICAgICAgLy8gc3RzeiBib3ggc2l6ZQogICAgIH0KQEAgLTE5MzYsNiArMTk1NiwxNiBAQAogICAgIG1DdHRzVGFibGVFbnRyaWVzLT5hZGQoaHRvbmwoZHVyYXRpb24pKTsKIH0KIAordm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OmFkZE9uZUVsc3RUYWJsZUVudHJ5KAorICAgIHVpbnQzMl90IHNlZ21lbnREdXJhdGlvbiwgaW50MzJfdCBtZWRpYVRpbWUsIGludDE2X3QgbWVkaWFSYXRlLCBpbnQxNl90IG1lZGlhUmF0ZUZyYWN0aW9uKSB7CisgICAgQUxPR1YoInNlZ21lbnREdXJhdGlvbjoldSwgbWVkaWFUaW1lOiVkIiwgc2VnbWVudER1cmF0aW9uLCBtZWRpYVRpbWUpOworICAgIEFMT0dWKCJtZWRpYVJhdGUgOiUiIFBSSWQxNiAiLCBtZWRpYVJhdGVGcmFjdGlvbiA6JSIgUFJJZDE2ICIsIE9yZWQgJXUiLCBtZWRpYVJhdGUsCisgICAgICAgIG1lZGlhUmF0ZUZyYWN0aW9uLCAoKCgodWludDMyX3QpbWVkaWFSYXRlKSA8PCAxNikgfCAoKHVpbnQzMl90KW1lZGlhUmF0ZUZyYWN0aW9uKSkpOworICAgIG1FbHN0VGFibGVFbnRyaWVzLT5hZGQoaHRvbmwoc2VnbWVudER1cmF0aW9uKSk7CisgICAgbUVsc3RUYWJsZUVudHJpZXMtPmFkZChodG9ubChtZWRpYVRpbWUpKTsKKyAgICBtRWxzdFRhYmxlRW50cmllcy0+YWRkKGh0b25sKCgoKHVpbnQzMl90KW1lZGlhUmF0ZSkgPDwgMTYpIHwgKHVpbnQzMl90KW1lZGlhUmF0ZUZyYWN0aW9uKSk7Cit9CisKIHN0YXR1c190IE1QRUc0V3JpdGVyOjpzZXROZXh0RmQoaW50IGZkKSB7CiAgICAgQUxPR1YoImFkZE5leHRGZCIpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKQEAgLTIxNzMsNiArMjIwMyw3IEBACiAgICAgZGVsZXRlIG1TdHRzVGFibGVFbnRyaWVzOwogICAgIGRlbGV0ZSBtU3Rzc1RhYmxlRW50cmllczsKICAgICBkZWxldGUgbUN0dHNUYWJsZUVudHJpZXM7CisgICAgZGVsZXRlIG1FbHN0VGFibGVFbnRyaWVzOwogCiAgICAgbVN0c3pUYWJsZUVudHJpZXMgPSBOVUxMOwogICAgIG1TdGNvVGFibGVFbnRyaWVzID0gTlVMTDsKQEAgLTIxODEsNiArMjIxMiw3IEBACiAgICAgbVN0dHNUYWJsZUVudHJpZXMgPSBOVUxMOwogICAgIG1TdHNzVGFibGVFbnRyaWVzID0gTlVMTDsKICAgICBtQ3R0c1RhYmxlRW50cmllcyA9IE5VTEw7CisgICAgbUVsc3RUYWJsZUVudHJpZXMgPSBOVUxMOwogCiAgICAgaWYgKG1Db2RlY1NwZWNpZmljRGF0YSAhPSBOVUxMKSB7CiAgICAgICAgIGZyZWUobUNvZGVjU3BlY2lmaWNEYXRhKTsKQEAgLTM2MTIsNiArMzY0NCw3IEBACiAgICAgdWludDMyX3Qgbm93ID0gZ2V0TXBlZzRUaW1lKCk7CiAgICAgbU93bmVyLT5iZWdpbkJveCgidHJhayIpOwogICAgICAgICB3cml0ZVRraGRCb3gobm93KTsKKyAgICAgICAgd3JpdGVFZHRzQm94KCk7CiAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goIm1kaWEiKTsKICAgICAgICAgICAgIHdyaXRlTWRoZEJveChub3cpOwogICAgICAgICAgICAgd3JpdGVIZGxyQm94KCk7CkBAIC0zNjc0LDYgKzM3MDcsMjkgQEAKICAgICAgICAgVFJFU1BBU1MoKTsKICAgICB9CiAgICAgbU93bmVyLT5iZWdpbkJveChmb3VyY2MpOyAgICAvLyBUZXh0TWV0YURhdGFTYW1wbGVFbnRyeQorCisgICAgLy8gIEhBQ0sgdG8gbWFrZSB0aGUgbWV0YWRhdGEgdHJhY2sgY29tcGxpYW50IHdpdGggdGhlIElTTyBzdGFuZGFyZC4KKyAgICAvLworICAgIC8vICBNZXRhZGF0YSB0cmFjayBpcyBhZGRlZCBmcm9tIEFQSSAyNiBhbmQgdGhlIG9yaWdpbmFsIGltcGxlbWVudGF0aW9uIGRvZXMgbm90CisgICAgLy8gIGZ1bGx5IGZvbGxvd2VkIHRoZSBUZXh0TWV0YURhdGFTYW1wbGVFbnRyeSBzcGVjaWZpZWQgaW4gSVNPL0lFQyAxNDQ5Ni0xMi0yMDE1CisgICAgLy8gIGluIHRoYXQgb25seSB0aGUgbWltZV9mb3JtYXQgaXMgd3JpdHRlbiBvdXQuIGNvbnRlbnRfZW5jb2RpbmcgYW5kCisgICAgLy8gIGRhdGFfcmVmZXJlbmNlX2luZGV4IGhhdmUgbm90IGJlZW4gd3JpdHRlbiBvdXQuIFRoaXMgbGVhZHMgdG8gdGhlIGZhaWx1cmUKKyAgICAvLyAgd2hlbiBzb21lIE1QNCBwYXJzZXIgdHJpZXMgdG8gcGFyc2UgdGhlIG1ldGFkYXRhIHRyYWNrIGFjY29yZGluZyB0byB0aGUKKyAgICAvLyAgc3RhbmRhcmQuIFRoZSBoYWNrIGhlcmUgd2lsbCBtYWtlIHRoZSBtZXRhZGF0YSB0cmFjayBjb21wbGlhbnQgd2l0aCB0aGUKKyAgICAvLyAgc3RhbmRhcmQgd2hpbGUgc3RpbGwgbWFpbnRhaW5pbmcgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIFRoaXMgd291bGQgZW5hYmxlCisgICAgLy8gIEFuZHJvaWQgdmVyc2lvbnMgYmVmb3JlIEFQSSAyOSB0byBiZSBhYmxlIHRvIHJlYWQgb3V0IHRoZSBzdGFuZGFyZCBjb21wbGlhbnQKKyAgICAvLyAgTWV0YWRhdGEgdHJhY2sgZ2VuZXJhdGVkIHdpdGggQW5kcm9pZCBBUEkgMjkgYW5kIHVwd2FyZC4gVGhlIHRyaWNrIGlzIGJhc2VkCisgICAgLy8gIG9uIHRoZSBmYWN0IHRoYXQgdGhlIE1ldGFkYXRhIHRyYWNrIG11c3Qgc3RhcnQgd2l0aCBwcmVmaXgg4oCcYXBwbGljYXRpb24v4oCdIGFuZAorICAgIC8vICB0aG9zZSBtaXNzaW5nIGZpZWxkcyBhcmUgbm90IHVzZWQgaW4gQW5kcm9pZCdzIE1ldGFkYXRhIHRyYWNrLiBCeSB3cml0dGluZworICAgIC8vICBvdXQgdGhlIG1pbWVfZm9ybWF0IHR3aWNlLCB0aGUgZmlyc3QgbWltZV9mb3JtYXQgd2lsbCBiZSB1c2VkIHRvIGZpbGwgb3V0IHRoZQorICAgIC8vICBtaXNzaW5nIHJlc2VydmVkLCBkYXRhX3JlZmVyZW5jZV9pbmRleCBhbmQgY29udGVudCBlbmNvZGluZyBmaWVsZHMuIE9uIHRoZQorICAgIC8vICBwYXJzZXIgc2lkZSwgdGhlIGV4dHJhY3RlciBiZWZvcmUgQVBJIDI5ICB3aWxsIHJlYWQgb3V0IHRoZSBmaXJzdCBtaW1lX2Zvcm1hdAorICAgIC8vICBjb3JyZWN0bHkgYW5kIGRyb3AgdGhlIHNlY29uZCBtaW1lX2Zvcm1hdC4gVGhlIGV4dHJhY3RvciBmcm9tIEFQSSAyOSB3aWxsCisgICAgLy8gIGNoZWNrIGlmIHRoZSByZXNlcnZlZCwgZGF0YV9yZWZlcmVuY2VfaW5kZXggYW5kIGNvbnRlbnQgZW5jb2RpbmcgYXJlIGZpbGxlZAorICAgIC8vICB3aXRoIOKAnGFwcGxpY2F0aW9u4oCdIHRvIGRldGVjdCBpZiB0aGlzIGlzIGEgc3RhbmRhcmQgY29tcGxpYW50IG1ldGFkYXRhIHRyYWNrCisgICAgLy8gIGFuZCByZWFkIG91dCB0aGUgZGF0YSBhY2NvcmRpbmdseS4KKyAgICBtT3duZXItPndyaXRlQ1N0cmluZyhtaW1lKTsKKwogICAgIG1Pd25lci0+d3JpdGVDU3RyaW5nKG1pbWUpOyAgLy8gbWV0YWRhdGEgbWltZV9mb3JtYXQKICAgICBtT3duZXItPmVuZEJveCgpOyAvLyBtZXR0CiB9CkBAIC0zOTU5LDYgKzQwMTUsMzMgQEAKICAgICBtT3duZXItPmVuZEJveCgpOwogfQogCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVFZHRzQm94KCl7CisgICAgQUxPR1YoIiVzIDogZ2V0U3RhcnRUaW1lT2Zmc2V0VGltZVVzIG9mIHRyYWNrOiUiIFBSSWQ2NCAiIHVzIiwgZ2V0VHJhY2tUeXBlKCksCisgICAgICAgIGdldFN0YXJ0VGltZU9mZnNldFRpbWVVcygpKTsKKworICAgIC8vIFByZXBvbmUgdmlkZW8gcGxheWJhY2suCisgICAgaWYgKG1NaW5DdHRzT2Zmc2V0VGlja3MgIT0gbU1heEN0dHNPZmZzZXRUaWNrcykgeworICAgICAgICBpbnQzMl90IG12aGRUaW1lU2NhbGUgPSBtT3duZXItPmdldFRpbWVTY2FsZSgpOworICAgICAgICB1aW50MzJfdCB0a2hkRHVyYXRpb24gPSAobVRyYWNrRHVyYXRpb25VcyAqIG12aGRUaW1lU2NhbGUgKyA1RTUpIC8gMUU2OworICAgICAgICBpbnQ2NF90IG1lZGlhVGltZSA9ICgoa01heEN0dHNPZmZzZXRUaW1lVXMgLSBnZXRNaW5DdHRzT2Zmc2V0VGltZVVzKCkpCisgICAgICAgICAgICAqIG1UaW1lU2NhbGUgKyA1RTUpIC8gMUU2OworICAgICAgICBpZiAodGtoZER1cmF0aW9uID4gMCAmJiBtZWRpYVRpbWUgPiAwKSB7CisgICAgICAgICAgICBhZGRPbmVFbHN0VGFibGVFbnRyeSh0a2hkRHVyYXRpb24sIG1lZGlhVGltZSwgMSwgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobUVsc3RUYWJsZUVudHJpZXMtPmNvdW50KCkgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbU93bmVyLT5iZWdpbkJveCgiZWR0cyIpOworICAgICAgICBtT3duZXItPmJlZ2luQm94KCJlbHN0Iik7CisgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7IC8vIHZlcnNpb249MCwgZmxhZ3M9MAorICAgICAgICAgICAgbUVsc3RUYWJsZUVudHJpZXMtPndyaXRlKG1Pd25lcik7CisgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7IC8vIGVsc3Q7CisgICAgbU93bmVyLT5lbmRCb3goKTsgLy8gZWR0cworfQorCiB2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVNZGhkQm94KHVpbnQzMl90IG5vdykgewogICAgIGludDY0X3QgdHJha0R1cmF0aW9uVXMgPSBnZXREdXJhdGlvblVzKCk7CiAgICAgaW50NjRfdCBtZGhkRHVyYXRpb24gPSAodHJha0R1cmF0aW9uVXMgKiBtVGltZVNjYWxlICsgNUU1KSAvIDFFNjsKQEAgLTQwOTUsNyArNDE3OCw5IEBACiAgICAgICAgIHVpbnQzMl90IGR1cmF0aW9uOwogICAgICAgICBDSEVDSyhtU3R0c1RhYmxlRW50cmllcy0+Z2V0KGR1cmF0aW9uLCAxKSk7CiAgICAgICAgIGR1cmF0aW9uID0gaHRvbmwoZHVyYXRpb24pOyAgLy8gQmFjayB0byBob3N0IGJ5dGUgb3JkZXIKLSAgICAgICAgbVN0dHNUYWJsZUVudHJpZXMtPnNldChodG9ubChkdXJhdGlvbiArIGdldFN0YXJ0VGltZU9mZnNldFNjYWxlZFRpbWUoKSksIDEpOworICAgICAgICBpbnQzMl90IHN0YXJ0VGltZU9mZnNldFNjYWxlZCA9ICgoKGdldFN0YXJ0VGltZU9mZnNldFRpbWVVcygpICsKKyAgICAgICAgICAgIG1Pd25lci0+Z2V0U3RhcnRUaW1lT2Zmc2V0QkZyYW1lc1VzKCkpICogbVRpbWVTY2FsZSkgKyA1MDAwMDBMTCkgLyAxMDAwMDAwTEw7CisgICAgICAgIG1TdHRzVGFibGVFbnRyaWVzLT5zZXQoaHRvbmwoKGludDMyX3QpZHVyYXRpb24gKyBzdGFydFRpbWVPZmZzZXRTY2FsZWQpLCAxKTsKICAgICB9CiAgICAgbVN0dHNUYWJsZUVudHJpZXMtPndyaXRlKG1Pd25lcik7CiAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIHN0dHMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAKaW5kZXggMTIwYzg2NC4uYmQ5ZTJiYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAKQEAgLTIxOTcsNiArMjE5NywxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gaGRyMTBQbHVzSW5mbzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobU91dHB1dEZvcm1hdC0+ZmluZEJ1ZmZlcigiaGRyMTAtcGx1cy1pbmZvIiwgJmhkcjEwUGx1c0luZm8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBoZHIxMFBsdXNJbmZvICE9IG51bGxwdHIgJiYgaGRyMTBQbHVzSW5mby0+c2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2hkcjEwX3BsdXNfbWV0YWRhdGEobVN1cmZhY2UuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGRyMTBQbHVzSW5mby0+c2l6ZSgpLCBoZHIxMFBsdXNJbmZvLT5kYXRhKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaW1lLnN0YXJ0c1dpdGhJZ25vcmVDYXNlKCJ2aWRlby8iKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU29mdFJlbmRlcmVyID0gbmV3IFNvZnR3YXJlUmVuZGVyZXIobVN1cmZhY2UsIG1Sb3RhdGlvbkRlZ3JlZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTI2NzQsNyArMjY4MSw3IEBACiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiZGVxdWV1ZU91dHB1dEJ1ZmZlciBjYW4ndCBiZSB1c2VkIGluIGFzeW5jIG1vZGUiKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZGVxdWV1ZUlucHV0QnVmZmVyIGNhbid0IGJlIHVzZWQgaW4gYXN5bmMgbW9kZSIpOwogICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUxMTkzMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmNwcApAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYUV4dHJhY3RvciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2Lmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvclByaXYuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNZWRpYUV4dHJhY3Rvcjo6TWVkaWFFeHRyYWN0b3IoKSB7CisgICAgaWYgKCFMT0dfTkRFQlVHKSB7CisgICAgICAgIHVpZF90IHVpZCA9IGdldHVpZCgpOworICAgICAgICBzdHJ1Y3QgcGFzc3dkICpwdyA9IGdldHB3dWlkKHVpZCk7CisgICAgICAgIEFMT0dWKCJleHRyYWN0b3IgY3JlYXRlZCBpbiB1aWQ6ICVkICglcykiLCBnZXR1aWQoKSwgcHctPnB3X25hbWUpOworICAgIH0KK30KKworTWVkaWFFeHRyYWN0b3I6On5NZWRpYUV4dHJhY3RvcigpIHt9CisKK3VpbnQzMl90IE1lZGlhRXh0cmFjdG9yOjpmbGFncygpIGNvbnN0IHsKKyAgICByZXR1cm4gQ0FOX1NFRUtfQkFDS1dBUkQgfCBDQU5fU0VFS19GT1JXQVJEIHwgQ0FOX1BBVVNFIHwgQ0FOX1NFRUs7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitNZWRpYUV4dHJhY3RvckNVbndyYXBwZXI6Ok1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcihDTWVkaWFFeHRyYWN0b3IgKnBsdWdpbikgeworICAgIHRoaXMtPnBsdWdpbiA9IHBsdWdpbjsKK30KKworTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyOjp+TWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyKCkgeworICAgIHBsdWdpbi0+ZnJlZShwbHVnaW4tPmRhdGEpOworICAgIGZyZWUocGx1Z2luKTsKK30KKworc2l6ZV90IE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcjo6Y291bnRUcmFja3MoKSB7CisgICAgcmV0dXJuIHBsdWdpbi0+Y291bnRUcmFja3MocGx1Z2luLT5kYXRhKTsKK30KKworTWVkaWFUcmFjayAqTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKKyAgICByZXR1cm4gbmV3IE1lZGlhVHJhY2tDVW53cmFwcGVyKHBsdWdpbi0+Z2V0VHJhY2socGx1Z2luLT5kYXRhLCBpbmRleCkpOworfQorCitzdGF0dXNfdCBNZWRpYUV4dHJhY3RvckNVbndyYXBwZXI6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncykgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICBBTWVkaWFGb3JtYXQgKmZvcm1hdCA9ICBBTWVkaWFGb3JtYXRfZnJvbU1zZygmbXNnKTsKKyAgICBtZWRpYV9zdGF0dXNfdCByZXQgPSBwbHVnaW4tPmdldFRyYWNrTWV0YURhdGEocGx1Z2luLT5kYXRhLCBmb3JtYXQsIGluZGV4LCBmbGFncyk7CisgICAgc3A8TWV0YURhdGE+IG5ld01ldGEgPSBuZXcgTWV0YURhdGEoKTsKKyAgICBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGEobXNnLCBuZXdNZXRhKTsKKyAgICBkZWxldGUgZm9ybWF0OworICAgIG1ldGEgPSAqbmV3TWV0YTsKKyAgICByZXR1cm4gcmV2ZXJzZV90cmFuc2xhdGVfZXJyb3IocmV0KTsKK30KKworc3RhdHVzX3QgTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCk7CisgICAgQU1lZGlhRm9ybWF0ICpmb3JtYXQgPSAgQU1lZGlhRm9ybWF0X2Zyb21Nc2coJm1zZyk7CisgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0gcGx1Z2luLT5nZXRNZXRhRGF0YShwbHVnaW4tPmRhdGEsIGZvcm1hdCk7CisgICAgc3A8TWV0YURhdGE+IG5ld01ldGEgPSBuZXcgTWV0YURhdGEoKTsKKyAgICBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGEobXNnLCBuZXdNZXRhKTsKKyAgICBkZWxldGUgZm9ybWF0OworICAgIG1ldGEgPSAqbmV3TWV0YTsKKyAgICByZXR1cm4gcmV2ZXJzZV90cmFuc2xhdGVfZXJyb3IocmV0KTsKK30KKworY29uc3QgY2hhciAqIE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcjo6bmFtZSgpIHsKKyAgICByZXR1cm4gcGx1Z2luLT5uYW1lKHBsdWdpbi0+ZGF0YSk7Cit9CisKK3VpbnQzMl90IE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcjo6ZmxhZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIHBsdWdpbi0+ZmxhZ3MocGx1Z2luLT5kYXRhKTsKK30KKworc3RhdHVzX3QgTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyOjpzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiBjYXNUb2tlbiwgc2l6ZV90IHNpemUpIHsKKyAgICByZXR1cm4gcGx1Z2luLT5zZXRNZWRpYUNhcyhwbHVnaW4tPmRhdGEsIGNhc1Rva2VuLCBzaXplKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuY3BwCmluZGV4IGIwYmYyNjkuLjg2NDAyY2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcApAQCAtMTgsMTcgKzE4LDE5IEBACiAjZGVmaW5lIExPR19UQUcgIk1lZGlhRXh0cmFjdG9yRmFjdG9yeSIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQvZGxleHQuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNhY2hlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5oPgorI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHppcGFyY2hpdmUvemlwX2FyY2hpdmUuaD4KQEAgLTM2LDYgKzM4LDIzIEBACiAjaW5jbHVkZSA8ZGlyZW50Lmg+CiAjaW5jbHVkZSA8ZGxmY24uaD4KIAorLy8gQ29waWVkIGZyb20gR3JhcGhpY3NFbnYuY3BwCisvLyBUT0RPKGIvMzcwNDkzMTkpIEdldCB0aGlzIGZyb20gYSBoZWFkZXIgb25jZSBvbmUgZXhpc3RzCitleHRlcm4gIkMiIHsKKyAgYW5kcm9pZF9uYW1lc3BhY2VfdCogYW5kcm9pZF9jcmVhdGVfbmFtZXNwYWNlKGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBsZF9saWJyYXJ5X3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkZWZhdWx0X2xpYnJhcnlfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwZXJtaXR0ZWRfd2hlbl9pc29sYXRlZF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9uYW1lc3BhY2VfdCogcGFyZW50KTsKKyAgYm9vbCBhbmRyb2lkX2xpbmtfbmFtZXNwYWNlcyhhbmRyb2lkX25hbWVzcGFjZV90KiBmcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfbmFtZXNwYWNlX3QqIHRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHNoYXJlZF9saWJzX3NvbmFtZXMpOworICBlbnVtIHsKKyAgICAgQU5EUk9JRF9OQU1FU1BBQ0VfVFlQRV9JU09MQVRFRCA9IDEsCisgIH07Cit9CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gc3RhdGljCkBAIC03NiwyNSArOTUsMzEgQEAKICAgICBzb3VyY2UtPkRybUluaXRpYWxpemF0aW9uKG51bGxwdHIgLyogbWltZSAqLyk7CiAKICAgICB2b2lkICptZXRhID0gbnVsbHB0cjsKLSAgICBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgY3JlYXRvciA9IE5VTEw7Ci0gICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyBmcmVlTWV0YSA9IG51bGxwdHI7CisgICAgdm9pZCAqY3JlYXRvciA9IE5VTEw7CisgICAgRnJlZU1ldGFGdW5jIGZyZWVNZXRhID0gbnVsbHB0cjsKICAgICBmbG9hdCBjb25maWRlbmNlOwogICAgIHNwPEV4dHJhY3RvclBsdWdpbj4gcGx1Z2luOwotICAgIGNyZWF0b3IgPSBzbmlmZihzb3VyY2UuZ2V0KCksICZjb25maWRlbmNlLCAmbWV0YSwgJmZyZWVNZXRhLCBwbHVnaW4pOworICAgIHVpbnQzMl90IGNyZWF0b3JWZXJzaW9uID0gMDsKKyAgICBjcmVhdG9yID0gc25pZmYoc291cmNlLCAmY29uZmlkZW5jZSwgJm1ldGEsICZmcmVlTWV0YSwgcGx1Z2luLCAmY3JlYXRvclZlcnNpb24pOwogICAgIGlmICghY3JlYXRvcikgewogICAgICAgICBBTE9HVigiRkFJTEVEIHRvIGF1dG9kZXRlY3QgbWVkaWEgY29udGVudC4iKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgTWVkaWFFeHRyYWN0b3IgKnJldCA9IGNyZWF0b3Ioc291cmNlLmdldCgpLCBtZXRhKTsKLSAgICBpZiAobWV0YSAhPSBudWxscHRyICYmIGZyZWVNZXRhICE9IG51bGxwdHIpIHsKLSAgICAgICAgZnJlZU1ldGEobWV0YSk7CisgICAgTWVkaWFFeHRyYWN0b3IgKmV4ID0gbnVsbHB0cjsKKyAgICBpZiAoY3JlYXRvclZlcnNpb24gPT0gRVhUUkFDVE9SREVGX1ZFUlNJT05fTkRLX1YxIHx8CisgICAgICAgICAgICBjcmVhdG9yVmVyc2lvbiA9PSBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjIpIHsKKyAgICAgICAgQ01lZGlhRXh0cmFjdG9yICpyZXQgPSAoKENyZWF0b3JGdW5jKWNyZWF0b3IpKHNvdXJjZS0+d3JhcCgpLCBtZXRhKTsKKyAgICAgICAgaWYgKG1ldGEgIT0gbnVsbHB0ciAmJiBmcmVlTWV0YSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBmcmVlTWV0YShtZXRhKTsKKyAgICAgICAgfQorICAgICAgICBleCA9IHJldCAhPSBudWxscHRyID8gbmV3IE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcihyZXQpIDogbnVsbHB0cjsKICAgICB9CiAKICAgICBBTE9HVigiQ3JlYXRlZCBhbiBleHRyYWN0b3IgJyVzJyB3aXRoIGNvbmZpZGVuY2UgJS4yZiIsCi0gICAgICAgICByZXQgIT0gbnVsbHB0ciA/IHJldC0+bmFtZSgpIDogIjxudWxsPiIsIGNvbmZpZGVuY2UpOworICAgICAgICAgZXggIT0gbnVsbHB0ciA/IGV4LT5uYW1lKCkgOiAiPG51bGw+IiwgY29uZmlkZW5jZSk7CiAKLSAgICByZXR1cm4gQ3JlYXRlSU1lZGlhRXh0cmFjdG9yRnJvbU1lZGlhRXh0cmFjdG9yKHJldCwgc291cmNlLCBwbHVnaW4pOworICAgIHJldHVybiBDcmVhdGVJTWVkaWFFeHRyYWN0b3JGcm9tTWVkaWFFeHRyYWN0b3IoZXgsIHNvdXJjZSwgcGx1Z2luKTsKIH0KIAogLy9zdGF0aWMKQEAgLTEwNSwxNCArMTMwLDE0IEBACiB9CiAKIHN0cnVjdCBFeHRyYWN0b3JQbHVnaW4gOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBkZWY7CisgICAgRXh0cmFjdG9yRGVmIGRlZjsKICAgICB2b2lkICpsaWJIYW5kbGU7CiAgICAgU3RyaW5nOCBsaWJQYXRoOwogICAgIFN0cmluZzggdXVpZFN0cmluZzsKIAotICAgIEV4dHJhY3RvclBsdWdpbihNZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIGRlZmluaXRpb24sIHZvaWQgKmhhbmRsZSwgU3RyaW5nOCAmcGF0aCkKKyAgICBFeHRyYWN0b3JQbHVnaW4oRXh0cmFjdG9yRGVmIGRlZmluaXRpb24sIHZvaWQgKmhhbmRsZSwgU3RyaW5nOCAmcGF0aCkKICAgICAgICAgOiBkZWYoZGVmaW5pdGlvbiksIGxpYkhhbmRsZShoYW5kbGUpLCBsaWJQYXRoKHBhdGgpIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YgTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZjo6ZXh0cmFjdG9yX3V1aWQ7IGkrKykgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZiBFeHRyYWN0b3JEZWY6OmV4dHJhY3Rvcl91dWlkOyBpKyspIHsKICAgICAgICAgICAgIHV1aWRTdHJpbmcuYXBwZW5kRm9ybWF0KCIlMDJ4IiwgZGVmLmV4dHJhY3Rvcl91dWlkLmJbaV0pOwogICAgICAgICB9CiAgICAgfQpAQCAtMTI1LDE3ICsxNTAsMjUgQEAKIH07CiAKIE11dGV4IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Z1BsdWdpbk11dGV4Owotc3RkOjpzaGFyZWRfcHRyPExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4+IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Z1BsdWdpbnM7CitzdGQ6OnNoYXJlZF9wdHI8c3RkOjpsaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+PiBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OmdQbHVnaW5zOwogYm9vbCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OmdQbHVnaW5zUmVnaXN0ZXJlZCA9IGZhbHNlOworYm9vbCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OmdJZ25vcmVWZXJzaW9uID0gZmFsc2U7CitzdGQ6OnN0cmluZyBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OmdMaW5rZWRMaWJyYXJpZXM7CiAKIC8vIHN0YXRpYwotTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6c25pZmYoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlLCB2b2lkICoqbWV0YSwKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqZnJlZU1ldGEsIHNwPEV4dHJhY3RvclBsdWdpbj4gJnBsdWdpbikgewordm9pZCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OlNldExpbmtlZExpYnJhcmllcyhjb25zdCBzdGQ6OnN0cmluZyYgbGlua2VkTGlicmFyaWVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKGdQbHVnaW5NdXRleCk7CisgICAgZ0xpbmtlZExpYnJhcmllcyA9IGxpbmtlZExpYnJhcmllczsKK30KKworLy8gc3RhdGljCit2b2lkICpNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OnNuaWZmKAorICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsCisgICAgICAgIEZyZWVNZXRhRnVuYyAqZnJlZU1ldGEsIHNwPEV4dHJhY3RvclBsdWdpbj4gJnBsdWdpbiwgdWludDMyX3QgKmNyZWF0b3JWZXJzaW9uKSB7CiAgICAgKmNvbmZpZGVuY2UgPSAwLjBmOwogICAgICptZXRhID0gbnVsbHB0cjsKIAotICAgIHN0ZDo6c2hhcmVkX3B0cjxMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+PiBwbHVnaW5zOworICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4+IHBsdWdpbnM7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soZ1BsdWdpbk11dGV4KTsKICAgICAgICAgaWYgKCFnUGx1Z2luc1JlZ2lzdGVyZWQpIHsKQEAgLTE0NCwxMyArMTc3LDIzIEBACiAgICAgICAgIHBsdWdpbnMgPSBnUGx1Z2luczsKICAgICB9CiAKLSAgICBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgY3VyQ3JlYXRvciA9IE5VTEw7Ci0gICAgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIGJlc3RDcmVhdG9yID0gTlVMTDsKKyAgICB2b2lkICpiZXN0Q3JlYXRvciA9IE5VTEw7CiAgICAgZm9yIChhdXRvIGl0ID0gcGx1Z2lucy0+YmVnaW4oKTsgaXQgIT0gcGx1Z2lucy0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgQUxPR1YoInNuaWZmaW5nICVzIiwgKCppdCktPmRlZi5leHRyYWN0b3JfbmFtZSk7CiAgICAgICAgIGZsb2F0IG5ld0NvbmZpZGVuY2U7CiAgICAgICAgIHZvaWQgKm5ld01ldGEgPSBudWxscHRyOwotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jIG5ld0ZyZWVNZXRhID0gbnVsbHB0cjsKLSAgICAgICAgaWYgKChjdXJDcmVhdG9yID0gKCppdCktPmRlZi5zbmlmZihzb3VyY2UsICZuZXdDb25maWRlbmNlLCAmbmV3TWV0YSwgJm5ld0ZyZWVNZXRhKSkpIHsKKyAgICAgICAgRnJlZU1ldGFGdW5jIG5ld0ZyZWVNZXRhID0gbnVsbHB0cjsKKworICAgICAgICB2b2lkICpjdXJDcmVhdG9yID0gTlVMTDsKKyAgICAgICAgaWYgKCgqaXQpLT5kZWYuZGVmX3ZlcnNpb24gPT0gRVhUUkFDVE9SREVGX1ZFUlNJT05fTkRLX1YxKSB7CisgICAgICAgICAgICBjdXJDcmVhdG9yID0gKHZvaWQqKSAoKml0KS0+ZGVmLnUudjIuc25pZmYoCisgICAgICAgICAgICAgICAgICAgIHNvdXJjZS0+d3JhcCgpLCAmbmV3Q29uZmlkZW5jZSwgJm5ld01ldGEsICZuZXdGcmVlTWV0YSk7CisgICAgICAgIH0gZWxzZSBpZiAoKCppdCktPmRlZi5kZWZfdmVyc2lvbiA9PSBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjIpIHsKKyAgICAgICAgICAgIGN1ckNyZWF0b3IgPSAodm9pZCopICgqaXQpLT5kZWYudS52My5zbmlmZigKKyAgICAgICAgICAgICAgICAgICAgc291cmNlLT53cmFwKCksICZuZXdDb25maWRlbmNlLCAmbmV3TWV0YSwgJm5ld0ZyZWVNZXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjdXJDcmVhdG9yKSB7CiAgICAgICAgICAgICBpZiAobmV3Q29uZmlkZW5jZSA+ICpjb25maWRlbmNlKSB7CiAgICAgICAgICAgICAgICAgKmNvbmZpZGVuY2UgPSBuZXdDb25maWRlbmNlOwogICAgICAgICAgICAgICAgIGlmICgqbWV0YSAhPSBudWxscHRyICYmICpmcmVlTWV0YSAhPSBudWxscHRyKSB7CkBAIC0xNjAsNiArMjAzLDcgQEAKICAgICAgICAgICAgICAgICAqZnJlZU1ldGEgPSBuZXdGcmVlTWV0YTsKICAgICAgICAgICAgICAgICBwbHVnaW4gPSAqaXQ7CiAgICAgICAgICAgICAgICAgYmVzdENyZWF0b3IgPSBjdXJDcmVhdG9yOworICAgICAgICAgICAgICAgICpjcmVhdG9yVmVyc2lvbiA9ICgqaXQpLT5kZWYuZGVmX3ZlcnNpb247CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChuZXdNZXRhICE9IG51bGxwdHIgJiYgbmV3RnJlZU1ldGEgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgICAgICBuZXdGcmVlTWV0YShuZXdNZXRhKTsKQEAgLTE3MywxMCArMjE3LDEwIEBACiAKIC8vIHN0YXRpYwogdm9pZCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OlJlZ2lzdGVyRXh0cmFjdG9yKGNvbnN0IHNwPEV4dHJhY3RvclBsdWdpbj4gJnBsdWdpbiwKLSAgICAgICAgTGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCkgeworICAgICAgICBzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpIHsKICAgICAvLyBzYW5pdHkgY2hlY2sgY2hlY2sgc3RydWN0IHZlcnNpb24sIHV1aWQsIG5hbWUKLSAgICBpZiAocGx1Z2luLT5kZWYuZGVmX3ZlcnNpb24gPT0gMAotICAgICAgICAgICAgfHwgcGx1Z2luLT5kZWYuZGVmX3ZlcnNpb24gPiBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04pIHsKKyAgICBpZiAocGx1Z2luLT5kZWYuZGVmX3ZlcnNpb24gIT0gRVhUUkFDVE9SREVGX1ZFUlNJT05fTkRLX1YxICYmCisgICAgICAgICAgICBwbHVnaW4tPmRlZi5kZWZfdmVyc2lvbiAhPSBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjIpIHsKICAgICAgICAgQUxPR0UoImRvbid0IHVuZGVyc3RhbmQgZXh0cmFjdG9yIGZvcm1hdCAldSwgaWdub3JpbmcuIiwgcGx1Z2luLT5kZWYuZGVmX3ZlcnNpb24pOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTkyLDcgKzIzNiw3IEBACiAgICAgZm9yIChhdXRvIGl0ID0gcGx1Z2luTGlzdC5iZWdpbigpOyBpdCAhPSBwbHVnaW5MaXN0LmVuZCgpOyArK2l0KSB7CiAgICAgICAgIGlmIChtZW1jbXAoJigoKml0KS0+ZGVmLmV4dHJhY3Rvcl91dWlkKSwgJnBsdWdpbi0+ZGVmLmV4dHJhY3Rvcl91dWlkLCAxNikgPT0gMCkgewogICAgICAgICAgICAgLy8gdGhlcmUncyBhbHJlYWR5IGFuIGV4dHJhY3RvciB3aXRoIHRoZSBzYW1lIHV1aWQKLSAgICAgICAgICAgIGlmICgoKml0KS0+ZGVmLmV4dHJhY3Rvcl92ZXJzaW9uIDwgcGx1Z2luLT5kZWYuZXh0cmFjdG9yX3ZlcnNpb24pIHsKKyAgICAgICAgICAgIGlmIChnSWdub3JlVmVyc2lvbiB8fCAoKml0KS0+ZGVmLmV4dHJhY3Rvcl92ZXJzaW9uIDwgcGx1Z2luLT5kZWYuZXh0cmFjdG9yX3ZlcnNpb24pIHsKICAgICAgICAgICAgICAgICAvLyB0aGlzIG9uZSBpcyBuZXdlciwgcmVwbGFjZSB0aGUgb2xkIG9uZQogICAgICAgICAgICAgICAgIEFMT0dXKCJyZXBsYWNpbmcgZXh0cmFjdG9yICclcycgdmVyc2lvbiAldSB3aXRoIHZlcnNpb24gJXUiLAogICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLT5kZWYuZXh0cmFjdG9yX25hbWUsCkBAIC0yMTUsNyArMjU5LDcgQEAKIAogLy9zdGF0aWMKIHZvaWQgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpSZWdpc3RlckV4dHJhY3RvcnNJbkFwaygKLSAgICAgICAgY29uc3QgY2hhciAqYXBrUGF0aCwgTGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCkgeworICAgICAgICBjb25zdCBjaGFyICphcGtQYXRoLCBzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpIHsKICAgICBBTE9HVigic2VhcmNoIGZvciBwbHVnaW5zIGF0ICVzIiwgYXBrUGF0aCk7CiAgICAgWmlwQXJjaGl2ZUhhbmRsZSB6aXBIYW5kbGU7CiAgICAgaW50MzJfdCByZXQgPSBPcGVuQXJjaGl2ZShhcGtQYXRoLCAmemlwSGFuZGxlKTsKQEAgLTIzNyw4ICsyODEsOCBAQAogICAgICAgICAgICAgICAgIC8vIHdpdGhpbiB0aGUgYXBrIGluc3RlYWQgb2Ygc3lzdGVtIGxpYnJhcmllcyBhbHJlYWR5IGxvYWRlZC4KICAgICAgICAgICAgICAgICB2b2lkICpsaWJIYW5kbGUgPSBkbG9wZW4obGliUGF0aC5zdHJpbmcoKSwgUlRMRF9OT1cgfCBSVExEX0xPQ0FMKTsKICAgICAgICAgICAgICAgICBpZiAobGliSGFuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpHZXRFeHRyYWN0b3JEZWYgZ2V0RGVmID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNZWRpYUV4dHJhY3Rvcjo6R2V0RXh0cmFjdG9yRGVmKSBkbHN5bShsaWJIYW5kbGUsICJHRVRFWFRSQUNUT1JERUYiKTsKKyAgICAgICAgICAgICAgICAgICAgR2V0RXh0cmFjdG9yRGVmIGdldERlZiA9CisgICAgICAgICAgICAgICAgICAgICAgICAoR2V0RXh0cmFjdG9yRGVmKSBkbHN5bShsaWJIYW5kbGUsICJHRVRFWFRSQUNUT1JERUYiKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGdldERlZikgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInJlZ2lzdGVyaW5nIHNuaWZmZXIgZm9yICVzIiwgbGliUGF0aC5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlckV4dHJhY3RvcigKQEAgLTI2MywxNyArMzA3LDIwIEBACiAKIC8vc3RhdGljCiB2b2lkIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6UmVnaXN0ZXJFeHRyYWN0b3JzSW5TeXN0ZW0oCi0gICAgICAgIGNvbnN0IGNoYXIgKmxpYkRpclBhdGgsIExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpIHsKKyAgICAgICAgY29uc3QgY2hhciAqbGliRGlyUGF0aCwgc3RkOjpsaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KSB7CiAgICAgQUxPR1YoInNlYXJjaCBmb3IgcGx1Z2lucyBhdCAlcyIsIGxpYkRpclBhdGgpOwogICAgIERJUiAqbGliRGlyID0gb3BlbmRpcihsaWJEaXJQYXRoKTsKICAgICBpZiAobGliRGlyKSB7CiAgICAgICAgIHN0cnVjdCBkaXJlbnQqIGxpYkVudHJ5OwogICAgICAgICB3aGlsZSAoKGxpYkVudHJ5ID0gcmVhZGRpcihsaWJEaXIpKSkgeworICAgICAgICAgICAgaWYgKGxpYkVudHJ5LT5kX25hbWVbMF0gPT0gJy4nKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBTdHJpbmc4IGxpYlBhdGggPSBTdHJpbmc4KGxpYkRpclBhdGgpICsgIi8iICsgbGliRW50cnktPmRfbmFtZTsKICAgICAgICAgICAgIHZvaWQgKmxpYkhhbmRsZSA9IGRsb3BlbihsaWJQYXRoLnN0cmluZygpLCBSVExEX05PVyB8IFJUTERfTE9DQUwpOwogICAgICAgICAgICAgaWYgKGxpYkhhbmRsZSkgewotICAgICAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpHZXRFeHRyYWN0b3JEZWYgZ2V0RGVmID0KLSAgICAgICAgICAgICAgICAgICAgKE1lZGlhRXh0cmFjdG9yOjpHZXRFeHRyYWN0b3JEZWYpIGRsc3ltKGxpYkhhbmRsZSwgIkdFVEVYVFJBQ1RPUkRFRiIpOworICAgICAgICAgICAgICAgIEdldEV4dHJhY3RvckRlZiBnZXREZWYgPQorICAgICAgICAgICAgICAgICAgICAoR2V0RXh0cmFjdG9yRGVmKSBkbHN5bShsaWJIYW5kbGUsICJHRVRFWFRSQUNUT1JERUYiKTsKICAgICAgICAgICAgICAgICBpZiAoZ2V0RGVmKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJyZWdpc3RlcmluZyBzbmlmZmVyIGZvciAlcyIsIGxpYlBhdGguc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICBSZWdpc3RlckV4dHJhY3RvcigKQEAgLTI5Myw2ICszNDAsNjggQEAKICAgICB9CiB9CiAKKy8vc3RhdGljCit2b2lkIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6UmVnaXN0ZXJFeHRyYWN0b3JzSW5BcGV4KAorICAgICAgICBjb25zdCBjaGFyICpsaWJEaXJQYXRoLCBzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpIHsKKyAgICBBTE9HVigic2VhcmNoIGZvciBwbHVnaW5zIGF0ICVzIiwgbGliRGlyUGF0aCk7CisgICAgQUxPR1YoImxpbmtlZCBsaWJzICVzIiwgZ0xpbmtlZExpYnJhcmllcy5jX3N0cigpKTsKKworICAgIGFuZHJvaWRfbmFtZXNwYWNlX3QgKmV4dHJhY3Rvck5zID0gYW5kcm9pZF9jcmVhdGVfbmFtZXNwYWNlKCJleHRyYWN0b3IiLAorICAgICAgICAgICAgbnVsbHB0ciwgIC8vIGxkX2xpYnJhcnlfcGF0aAorICAgICAgICAgICAgbGliRGlyUGF0aCwKKyAgICAgICAgICAgIEFORFJPSURfTkFNRVNQQUNFX1RZUEVfSVNPTEFURUQsCisgICAgICAgICAgICBudWxscHRyLCAgLy8gcGVybWl0dGVkX3doZW5faXNvbGF0ZWRfcGF0aAorICAgICAgICAgICAgbnVsbHB0cik7IC8vIHBhcmVudAorICAgIGlmICghYW5kcm9pZF9saW5rX25hbWVzcGFjZXMoZXh0cmFjdG9yTnMsIG51bGxwdHIsIGdMaW5rZWRMaWJyYXJpZXMuY19zdHIoKSkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBsaW5rIG5hbWVzcGFjZS4gRmFpbGVkIHRvIGxvYWQgZXh0cmFjdG9yIHBsdWctaW5zIGluIGFwZXguIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY29uc3QgYW5kcm9pZF9kbGV4dGluZm8gZGxleHRpbmZvID0geworICAgICAgICAuZmxhZ3MgPSBBTkRST0lEX0RMRVhUX1VTRV9OQU1FU1BBQ0UsCisgICAgICAgIC5saWJyYXJ5X25hbWVzcGFjZSA9IGV4dHJhY3Rvck5zLAorICAgIH07CisKKyAgICBESVIgKmxpYkRpciA9IG9wZW5kaXIobGliRGlyUGF0aCk7CisgICAgaWYgKGxpYkRpcikgeworICAgICAgICBzdHJ1Y3QgZGlyZW50KiBsaWJFbnRyeTsKKyAgICAgICAgd2hpbGUgKChsaWJFbnRyeSA9IHJlYWRkaXIobGliRGlyKSkpIHsKKyAgICAgICAgICAgIGlmIChsaWJFbnRyeS0+ZF9uYW1lWzBdID09ICcuJykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nOCBsaWJQYXRoID0gU3RyaW5nOChsaWJEaXJQYXRoKSArICIvIiArIGxpYkVudHJ5LT5kX25hbWU7CisgICAgICAgICAgICBpZiAoIWxpYlBhdGguY29udGFpbnMoImV4dHJhY3Rvci5zbyIpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2b2lkICpsaWJIYW5kbGUgPSBhbmRyb2lkX2Rsb3Blbl9leHQoCisgICAgICAgICAgICAgICAgICAgIGxpYlBhdGguc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgIFJUTERfTk9XIHwgUlRMRF9MT0NBTCwgJmRsZXh0aW5mbyk7CisgICAgICAgICAgICBpZiAobGliSGFuZGxlKSB7CisgICAgICAgICAgICAgICAgR2V0RXh0cmFjdG9yRGVmIGdldERlZiA9CisgICAgICAgICAgICAgICAgICAgIChHZXRFeHRyYWN0b3JEZWYpIGRsc3ltKGxpYkhhbmRsZSwgIkdFVEVYVFJBQ1RPUkRFRiIpOworICAgICAgICAgICAgICAgIGlmIChnZXREZWYpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoInJlZ2lzdGVyaW5nIHNuaWZmZXIgZm9yICVzIiwgbGliUGF0aC5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyRXh0cmFjdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFeHRyYWN0b3JQbHVnaW4oZ2V0RGVmKCksIGxpYkhhbmRsZSwgbGliUGF0aCksIHBsdWdpbkxpc3QpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBkb2VzIG5vdCBjb250YWluIHNuaWZmZXIiLCBsaWJQYXRoLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgZGxjbG9zZShsaWJIYW5kbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coImNvdWxkbid0IGRsb3BlbiglcykgJXMiLCBsaWJQYXRoLnN0cmluZygpLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNsb3NlZGlyKGxpYkRpcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoImNvdWxkbid0IG9wZW5kaXIoJXMpIiwgbGliRGlyUGF0aCk7CisgICAgfQorfQorCitzdGF0aWMgYm9vbCBjb21wYXJlRnVuYyhjb25zdCBzcDxFeHRyYWN0b3JQbHVnaW4+JiBmaXJzdCwgY29uc3Qgc3A8RXh0cmFjdG9yUGx1Z2luPiYgc2Vjb25kKSB7CisgICAgcmV0dXJuIHN0cmNtcChmaXJzdC0+ZGVmLmV4dHJhY3Rvcl9uYW1lLCBzZWNvbmQtPmRlZi5leHRyYWN0b3JfbmFtZSkgPCAwOworfQorCitzdGF0aWMgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBnU3VwcG9ydGVkRXh0ZW5zaW9uczsKKwogLy8gc3RhdGljCiB2b2lkIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6VXBkYXRlRXh0cmFjdG9ycyhjb25zdCBjaGFyICpuZXdVcGRhdGVBcGtQYXRoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKGdQbHVnaW5NdXRleCk7CkBAIC0zMDMsNyArNDEyLDE1IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBzdGQ6OnNoYXJlZF9wdHI8TGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+Pj4gbmV3TGlzdChuZXcgTGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PigpKTsKKyAgICBnSWdub3JlVmVyc2lvbiA9IHByb3BlcnR5X2dldF9ib29sKCJkZWJ1Zy5leHRyYWN0b3IuaWdub3JlX3ZlcnNpb24iLCBmYWxzZSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjpsaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+PiBuZXdMaXN0KG5ldyBzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4oKSk7CisKKyAgICBSZWdpc3RlckV4dHJhY3RvcnNJbkFwZXgoIi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhL2xpYiIKKyNpZmRlZiBfX0xQNjRfXworICAgICAgICAgICAgIjY0IgorI2VuZGlmCisgICAgICAgICAgICAsICpuZXdMaXN0KTsKIAogICAgIFJlZ2lzdGVyRXh0cmFjdG9yc0luU3lzdGVtKCIvc3lzdGVtL2xpYiIKICNpZmRlZiBfX0xQNjRfXwpAQCAtMzE1LDEwICs0MzIsMzkgQEAKICAgICAgICAgUmVnaXN0ZXJFeHRyYWN0b3JzSW5BcGsobmV3VXBkYXRlQXBrUGF0aCwgKm5ld0xpc3QpOwogICAgIH0KIAorICAgIG5ld0xpc3QtPnNvcnQoY29tcGFyZUZ1bmMpOwogICAgIGdQbHVnaW5zID0gbmV3TGlzdDsKKworICAgIGZvciAoYXV0byBpdCA9IGdQbHVnaW5zLT5iZWdpbigpOyBpdCAhPSBnUGx1Z2lucy0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKCgqaXQpLT5kZWYuZGVmX3ZlcnNpb24gPT0gRVhUUkFDVE9SREVGX1ZFUlNJT05fTkRLX1YyKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDs7IGkrKykgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4dCA9ICgqaXQpLT5kZWYudS52My5zdXBwb3J0ZWRfdHlwZXNbaV07CisgICAgICAgICAgICAgICAgaWYgKGV4dCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnU3VwcG9ydGVkRXh0ZW5zaW9ucy5pbnNlcnQoc3RkOjpzdHJpbmcoZXh0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBnUGx1Z2luc1JlZ2lzdGVyZWQgPSB0cnVlOwogfQogCisvLyBzdGF0aWMKK3N0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpnZXRTdXBwb3J0ZWRUeXBlcygpIHsKKyAgICBpZiAoZ2V0dWlkKCkgPT0gQUlEX01FRElBX0VYKSB7CisgICAgICAgIHJldHVybiBnU3VwcG9ydGVkRXh0ZW5zaW9uczsKKyAgICB9CisgICAgQUxPR1YoImdldCBzZXJ2aWNlIG1hbmFnZXIiKTsKKyAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEuZXh0cmFjdG9yIikpOworCisgICAgaWYgKGJpbmRlciAhPSAwKSB7CisgICAgICAgIHNwPElNZWRpYUV4dHJhY3RvclNlcnZpY2U+IG1lZGlhRXhTZXJ2aWNlKGludGVyZmFjZV9jYXN0PElNZWRpYUV4dHJhY3RvclNlcnZpY2U+KGJpbmRlcikpOworICAgICAgICByZXR1cm4gbWVkaWFFeFNlcnZpY2UtPmdldFN1cHBvcnRlZFR5cGVzKCk7CisgICAgfQorICAgIHJldHVybiBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+KCk7Cit9CisKIHN0YXR1c190IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKGdQbHVnaW5NdXRleCk7CiAgICAgU3RyaW5nOCBvdXQ7CkBAIC0zMzUsMTIgKzQ4MSwyNSBAQAogICAgICAgICBvdXQuYXBwZW5kKCJBdmFpbGFibGUgZXh0cmFjdG9yczpcbiIpOwogICAgICAgICBpZiAoZ1BsdWdpbnNSZWdpc3RlcmVkKSB7CiAgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBnUGx1Z2lucy0+YmVnaW4oKTsgaXQgIT0gZ1BsdWdpbnMtPmVuZCgpOyArK2l0KSB7Ci0gICAgICAgICAgICAgICAgb3V0LmFwcGVuZEZvcm1hdCgiICAlMjVzOiB1dWlkKCVzKSwgdmVyc2lvbigldSksIHBhdGgoJXMpXG4iLAorICAgICAgICAgICAgICAgIG91dC5hcHBlbmRGb3JtYXQoIiAgJTI1czogcGx1Z2luX3ZlcnNpb24oJWQpLCB1dWlkKCVzKSwgdmVyc2lvbigldSksIHBhdGgoJXMpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICgqaXQpLT5kZWYuZXh0cmFjdG9yX25hbWUsCisgICAgICAgICAgICAgICAgICAgICgqaXQpLT5kZWYuZGVmX3ZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAoKml0KS0+dXVpZFN0cmluZy5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgICAgICAgKCppdCktPmRlZi5leHRyYWN0b3JfdmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICgqaXQpLT5saWJQYXRoLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGlmICgoKml0KS0+ZGVmLmRlZl92ZXJzaW9uID09IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX05ES19WMikgeworICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCIsIHN1cHBvcnRzOiAiKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1pbWUgPSAoKml0KS0+ZGVmLnUudjMuc3VwcG9ydGVkX3R5cGVzW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pbWUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZEZvcm1hdCgiJXMgIiwgbWltZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiXG4iKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dC5hcHBlbmQoIlxuIik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBvdXQuYXBwZW5kKCIgIChubyBwbHVnaW5zIHJlZ2lzdGVyZWQpXG4iKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYU11eGVyLmNwcAppbmRleCA5OGY1OWI1Li45YmEyYWRkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYU11eGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYU11eGVyLmNwcApAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09nZ1dyaXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTUyLDYgKzUzLDggQEAKICAgICAgICAgbVdyaXRlciA9IG5ldyBNUEVHNFdyaXRlcihmZCk7CiAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9XRUJNKSB7CiAgICAgICAgIG1Xcml0ZXIgPSBuZXcgV2VibVdyaXRlcihmZCk7CisgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9PR0cpIHsKKyAgICAgICAgbVdyaXRlciA9IG5ldyBPZ2dXcml0ZXIoZmQpOwogICAgIH0KIAogICAgIGlmIChtV3JpdGVyICE9IE5VTEwpIHsKQEAgLTU5LDYgKzYyLDggQEAKICAgICAgICAgaWYgKGZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX0hFSUYpIHsKICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUga2V5IHVzZXMgcmVjb3JkZXIgZmlsZSB0eXBlcy4KICAgICAgICAgICAgIG1GaWxlTWV0YS0+c2V0SW50MzIoa0tleUZpbGVUeXBlLCBvdXRwdXRfZm9ybWF0OjpPVVRQVVRfRk9STUFUX0hFSUYpOworICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX09HRykgeworICAgICAgICAgICAgbUZpbGVNZXRhLT5zZXRJbnQzMihrS2V5RmlsZVR5cGUsIG91dHB1dF9mb3JtYXQ6Ok9VVFBVVF9GT1JNQVRfT0dHKTsKICAgICAgICAgfQogICAgICAgICBtU3RhdGUgPSBJTklUSUFMSVpFRDsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVRyYWNrLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhVHJhY2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNTg0OTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVRyYWNrLmNwcApAQCAtMCwwICsxLDE4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtdXRleD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvclByaXYuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNZWRpYVRyYWNrOjpNZWRpYVRyYWNrKCkge30KKworTWVkaWFUcmFjazo6fk1lZGlhVHJhY2soKSB7fQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpzZXROb25CbG9ja2luZygpIHsKKyAgICBtTm9uQmxvY2tpbmcgPSB0cnVlOworfQorCit2b2lkIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpjbGVhck5vbkJsb2NraW5nKCkgeworICAgIG1Ob25CbG9ja2luZyA9IGZhbHNlOworfQorCitib29sIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpnZXROb25CbG9ja2luZygpIGNvbnN0IHsKKyAgICByZXR1cm4gbU5vbkJsb2NraW5nOworfQorCit2b2lkIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpzZXRTZWVrVG8oaW50NjRfdCB0aW1lX3VzLCBTZWVrTW9kZSBtb2RlKSB7CisgICAgbU9wdGlvbnMgfD0ga1NlZWtUb19PcHRpb247CisgICAgbVNlZWtUaW1lVXMgPSB0aW1lX3VzOworICAgIG1TZWVrTW9kZSA9IG1vZGU7Cit9CisKK2Jvb2wgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OmdldFNlZWtUbygKKyAgICAgICAgaW50NjRfdCAqdGltZV91cywgU2Vla01vZGUgKm1vZGUpIGNvbnN0IHsKKyAgICAqdGltZV91cyA9IG1TZWVrVGltZVVzOworICAgICptb2RlID0gbVNlZWtNb2RlOworICAgIHJldHVybiAobU9wdGlvbnMgJiBrU2Vla1RvX09wdGlvbikgIT0gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0gdW53cmFwcGVyIC0tLS0tLS0tLS0tLS0tLSAqLworCitNZWRpYVRyYWNrQ1Vud3JhcHBlcjo6TWVkaWFUcmFja0NVbndyYXBwZXIoQ01lZGlhVHJhY2sgKmNtZWRpYXRyYWNrKSB7CisgICAgd3JhcHBlciA9IGNtZWRpYXRyYWNrOworICAgIGJ1ZmZlckdyb3VwID0gbnVsbHB0cjsKK30KKworTWVkaWFUcmFja0NVbndyYXBwZXI6On5NZWRpYVRyYWNrQ1Vud3JhcHBlcigpIHsKKyAgICB3cmFwcGVyLT5mcmVlKHdyYXBwZXItPmRhdGEpOworICAgIGZyZWUod3JhcHBlcik7CisgICAgZGVsZXRlIGJ1ZmZlckdyb3VwOworfQorCitzdGF0dXNfdCBNZWRpYVRyYWNrQ1Vud3JhcHBlcjo6c3RhcnQoKSB7CisgICAgaWYgKGJ1ZmZlckdyb3VwID09IG51bGxwdHIpIHsKKyAgICAgICAgYnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cCgpOworICAgIH0KKyAgICByZXR1cm4gcmV2ZXJzZV90cmFuc2xhdGVfZXJyb3Iod3JhcHBlci0+c3RhcnQod3JhcHBlci0+ZGF0YSwgYnVmZmVyR3JvdXAtPndyYXAoKSkpOworfQorCitzdGF0dXNfdCBNZWRpYVRyYWNrQ1Vud3JhcHBlcjo6c3RvcCgpIHsKKyAgICByZXR1cm4gcmV2ZXJzZV90cmFuc2xhdGVfZXJyb3Iod3JhcHBlci0+c3RvcCh3cmFwcGVyLT5kYXRhKSk7Cit9CisKK3N0YXR1c190IE1lZGlhVHJhY2tDVW53cmFwcGVyOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlJiBmb3JtYXQpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCk7CisgICAgQU1lZGlhRm9ybWF0ICp0bXBGb3JtYXQgPSAgQU1lZGlhRm9ybWF0X2Zyb21Nc2coJm1zZyk7CisgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0gd3JhcHBlci0+Z2V0Rm9ybWF0KHdyYXBwZXItPmRhdGEsIHRtcEZvcm1hdCk7CisgICAgc3A8TWV0YURhdGE+IG5ld01ldGEgPSBuZXcgTWV0YURhdGEoKTsKKyAgICBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGEobXNnLCBuZXdNZXRhKTsKKyAgICBkZWxldGUgdG1wRm9ybWF0OworICAgIGZvcm1hdCA9ICpuZXdNZXRhOworICAgIHJldHVybiByZXZlcnNlX3RyYW5zbGF0ZV9lcnJvcihyZXQpOworfQorCitzdGF0dXNfdCBNZWRpYVRyYWNrQ1Vud3JhcHBlcjo6cmVhZChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisKKyAgICB1aW50MzJfdCBvcHRzID0gMDsKKworICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldE5vbkJsb2NraW5nKCkpIHsKKyAgICAgICAgb3B0cyB8PSBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpOT05CTE9DS0lORzsKKyAgICB9CisKKyAgICBpbnQ2NF90IHNlZWtQb3NpdGlvbiA9IDA7CisgICAgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlIHNlZWtNb2RlOworICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1Bvc2l0aW9uLCAmc2Vla01vZGUpKSB7CisgICAgICAgIG9wdHMgfD0gU0VFSzsKKyAgICAgICAgb3B0cyB8PSAodWludDMyX3QpIHNlZWtNb2RlOworICAgIH0KKyAgICBDTWVkaWFCdWZmZXIgKmJ1ZiA9IG51bGxwdHI7CisgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0gd3JhcHBlci0+cmVhZCh3cmFwcGVyLT5kYXRhLCAmYnVmLCBvcHRzLCBzZWVrUG9zaXRpb24pOworICAgIGlmIChyZXQgPT0gQU1FRElBX09LICYmIGJ1ZiAhPSBudWxscHRyKSB7CisgICAgICAgICpidWZmZXIgPSAoTWVkaWFCdWZmZXJCYXNlKilidWYtPmhhbmRsZTsKKyAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhID0gKCpidWZmZXIpLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmb3JtYXQgPSBidWYtPm1ldGFfZGF0YShidWYtPmhhbmRsZSk7CisgICAgICAgIC8vIG9ubHkgY29udmVydCB0aGUga2V5cyB3ZSdyZSBhY3R1YWxseSBleHBlY3RpbmcsIGFzIGRvaW5nCisgICAgICAgIC8vIHRoZSBmdWxsIGNvbnZlcnRNZXNzYWdlVG9NZXRhZGF0YSgpIGZvciBldmVyeSBidWZmZXIgaXMKKyAgICAgICAgLy8gdG9vIGV4cGVuc2l2ZQorICAgICAgICBpbnQ2NF90IHZhbDY0OworICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50NjQoInRpbWVVcyIsICZ2YWw2NCkpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50NjQoa0tleVRpbWUsIHZhbDY0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50NjQoImR1cmF0aW9uVXMiLCAmdmFsNjQpKSB7CisgICAgICAgICAgICBtZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgdmFsNjQpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQ2NCgidGFyZ2V0LXRpbWUiLCAmdmFsNjQpKSB7CisgICAgICAgICAgICBtZXRhLnNldEludDY0KGtLZXlUYXJnZXRUaW1lLCB2YWw2NCk7CisgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCB2YWwzMjsKKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDMyKCJpcy1zeW5jLWZyYW1lIiwgJnZhbDMyKSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIHZhbDMyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50MzIoInRlbXBvcmFsLWxheWVyLWlkIiwgJnZhbDMyKSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5VGVtcG9yYWxMYXllcklkLCB2YWwzMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDMyKCJ0ZW1wb3JhbC1sYXllci1jb3VudCIsICZ2YWwzMikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleVRlbXBvcmFsTGF5ZXJDb3VudCwgdmFsMzIpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQzMigiY3J5cHRvLWRlZmF1bHQtaXYtc2l6ZSIsICZ2YWwzMikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleUNyeXB0b0RlZmF1bHRJVlNpemUsIHZhbDMyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50MzIoImNyeXB0by1tb2RlIiwgJnZhbDMyKSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgdmFsMzIpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQzMigiY3J5cHRvLWVuY3J5cHRlZC1ieXRlLWJsb2NrIiwgJnZhbDMyKSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5RW5jcnlwdGVkQnl0ZUJsb2NrLCB2YWwzMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDMyKCJjcnlwdG8tc2tpcC1ieXRlLWJsb2NrIiwgJnZhbDMyKSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5U2tpcEJ5dGVCbG9jaywgdmFsMzIpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQzMigidmFsaWQtc2FtcGxlcyIsICZ2YWwzMikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleVZhbGlkU2FtcGxlcywgdmFsMzIpOworICAgICAgICB9CisgICAgICAgIHNwPEFCdWZmZXI+IHZhbGJ1ZjsKKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEJ1ZmZlcigiY3J5cHRvLXBsYWluLXNpemVzIiwgJnZhbGJ1ZikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5UGxhaW5TaXplcywKKyAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFCYXNlOjpUeXBlOjpUWVBFX05PTkUsIHZhbGJ1Zi0+ZGF0YSgpLCB2YWxidWYtPnNpemUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEJ1ZmZlcigiY3J5cHRvLWVuY3J5cHRlZC1zaXplcyIsICZ2YWxidWYpKSB7CisgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleUVuY3J5cHRlZFNpemVzLAorICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUJhc2U6OlR5cGU6OlRZUEVfTk9ORSwgdmFsYnVmLT5kYXRhKCksIHZhbGJ1Zi0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kQnVmZmVyKCJjcnlwdG8ta2V5IiwgJnZhbGJ1ZikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvS2V5LAorICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUJhc2U6OlR5cGU6OlRZUEVfTk9ORSwgdmFsYnVmLT5kYXRhKCksIHZhbGJ1Zi0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kQnVmZmVyKCJjcnlwdG8taXYiLCAmdmFsYnVmKSkgeworICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlDcnlwdG9JViwKKyAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFCYXNlOjpUeXBlOjpUWVBFX05PTkUsIHZhbGJ1Zi0+ZGF0YSgpLCB2YWxidWYtPnNpemUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEJ1ZmZlcigic2VpIiwgJnZhbGJ1ZikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5U0VJLAorICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUJhc2U6OlR5cGU6OlRZUEVfTk9ORSwgdmFsYnVmLT5kYXRhKCksIHZhbGJ1Zi0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgICpidWZmZXIgPSBudWxscHRyOworICAgIH0KKworICAgIHJldHVybiByZXZlcnNlX3RyYW5zbGF0ZV9lcnJvcihyZXQpOworfQorCitib29sIE1lZGlhVHJhY2tDVW53cmFwcGVyOjpzdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCkgeworICAgIHJldHVybiB3cmFwcGVyLT5zdXBwb3J0c05vbkJsb2NraW5nUmVhZCh3cmFwcGVyLT5kYXRhKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5jcHAKaW5kZXggMDRmNmFkZS4uZGJjMjg3ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5jcHAKQEAgLTE2LDE1ICsxNiwyNSBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk1ldGFEYXRhVXRpbHMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGJvb2wgTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSwgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoZGF0YSA9PSBudWxscHRyIHx8IHNpemUgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCiAgICAgaW50MzJfdCB3aWR0aDsKICAgICBpbnQzMl90IGhlaWdodDsKICAgICBpbnQzMl90IHNhcldpZHRoOwpAQCAtNDYsMjEgKzU2LDg2IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAobWV0YSA9PSBudWxscHRyIHx8IGRhdGEgPT0gbnVsbHB0ciB8fCBzaXplID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludDMyX3Qgd2lkdGg7CisgICAgaW50MzJfdCBoZWlnaHQ7CisgICAgaW50MzJfdCBzYXJXaWR0aDsKKyAgICBpbnQzMl90IHNhckhlaWdodDsKKyAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gbmV3IEFCdWZmZXIoKHZvaWQqKWRhdGEsICBzaXplKTsKKyAgICBzcDxBQnVmZmVyPiBjc2QgPSBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoYWNjZXNzVW5pdCwgJndpZHRoLCAmaGVpZ2h0LCAmc2FyV2lkdGgsICZzYXJIZWlnaHQpOworICAgIGlmIChjc2QgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworCisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF9BVkMsIGNzZC0+ZGF0YSgpLCBjc2QtPnNpemUoKSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsIHdpZHRoKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsIGhlaWdodCk7CisgICAgaWYgKHNhcldpZHRoID4gMCAmJiBzYXJIZWlnaHQgPiAwKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBUl9XSURUSCwgc2FyV2lkdGgpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQVJfSEVJR0hULCBzYXJIZWlnaHQpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoTWV0YURhdGFCYXNlICZtZXRhLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChkYXRhID09IG51bGxwdHIgfHwgc2l6ZSA8IDcpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEFCaXRSZWFkZXIgYml0cyhkYXRhLCBzaXplKTsKKworICAgIC8vIGFkdHNfZml4ZWRfaGVhZGVyCisKKyAgICBpZiAoYml0cy5nZXRCaXRzKDEyKSAhPSAweGZmZnUpIHsKKyAgICAgICAgQUxPR0UoIldyb25nIGF0ZHNfZml4ZWRfaGVhZGVyIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBiaXRzLnNraXBCaXRzKDQpOyAgLy8gSUQsIGxheWVyLCBwcm90ZWN0aW9uX2Fic2VudAorCisgICAgdW5zaWduZWQgcHJvZmlsZSA9IGJpdHMuZ2V0Qml0cygyKTsKKyAgICBpZiAocHJvZmlsZSA9PSAzdSkgeworICAgICAgICBBTE9HRSgicHJvZmlsZSBzaG91bGQgbm90IGJlIDMiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB1bnNpZ25lZCBzYW1wbGluZ19mcmVxX2luZGV4ID0gYml0cy5nZXRCaXRzKDQpOworICAgIGJpdHMuZ2V0Qml0cygxKTsgIC8vIHByaXZhdGVfYml0CisgICAgdW5zaWduZWQgY2hhbm5lbF9jb25maWd1cmF0aW9uID0gYml0cy5nZXRCaXRzKDMpOworICAgIGlmIChjaGFubmVsX2NvbmZpZ3VyYXRpb24gPT0gMHUpIHsKKyAgICAgICAgQUxPR0UoImNoYW5uZWxfY29uZmlnIHNob3VsZCBub3QgYmUgMCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgICAgICBtZXRhLCBwcm9maWxlLCBzYW1wbGluZ19mcmVxX2luZGV4LCBjaGFubmVsX2NvbmZpZ3VyYXRpb24pKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtZXRhLnNldEludDMyKGtLZXlJc0FEVFMsIHRydWUpOworICAgIHJldHVybiB0cnVlOworfQorCiBib29sIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAotICAgICAgICB1bnNpZ25lZCBwcm9maWxlLCB1bnNpZ25lZCBzYW1wbGluZ19mcmVxX2luZGV4LAotICAgICAgICB1bnNpZ25lZCBjaGFubmVsX2NvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgdWludDhfdCAqY3NkLCAvKiBvdXQgKi8KKyAgICAgICAgc2l6ZV90ICplc2RzX3NpemUsIC8qIGluL291dCAqLworICAgICAgICB1bnNpZ25lZCBwcm9maWxlLCAvKiBpbiAqLworICAgICAgICB1bnNpZ25lZCBzYW1wbGluZ19mcmVxX2luZGV4LCAvKiBpbiAqLworICAgICAgICB1bnNpZ25lZCBjaGFubmVsX2NvbmZpZ3VyYXRpb24sIC8qIGluICovCisgICAgICAgIGludDMyX3QgKnNhbXBsaW5nX3JhdGUgLyogb3V0ICovCispIHsKICAgICBpZihzYW1wbGluZ19mcmVxX2luZGV4ID4gMTF1KSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgaW50MzJfdCBzYW1wbGVSYXRlOwotICAgIGludDMyX3QgY2hhbm5lbENvdW50OwogICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtTYW1wbGluZ0ZyZXFbXSA9IHsKICAgICAgICAgOTYwMDAsIDg4MjAwLCA2NDAwMCwgNDgwMDAsIDQ0MTAwLCAzMjAwMCwgMjQwMDAsIDIyMDUwLAogICAgICAgICAxNjAwMCwgMTIwMDAsIDExMDI1LCA4MDAwCiAgICAgfTsKLSAgICBzYW1wbGVSYXRlID0ga1NhbXBsaW5nRnJlcVtzYW1wbGluZ19mcmVxX2luZGV4XTsKLSAgICBjaGFubmVsQ291bnQgPSBjaGFubmVsX2NvbmZpZ3VyYXRpb247CisgICAgKnNhbXBsaW5nX3JhdGUgPSBrU2FtcGxpbmdGcmVxW3NhbXBsaW5nX2ZyZXFfaW5kZXhdOwogCiAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1N0YXRpY0VTRFNbXSA9IHsKICAgICAgICAgMHgwMywgMjIsCkBAIC04Myw3ICsxNTgsOSBAQAogICAgIH07CiAKICAgICBzaXplX3QgY3NkU2l6ZSA9IHNpemVvZihrU3RhdGljRVNEUykgKyAyOwotICAgIHVpbnQ4X3QgKmNzZCA9IG5ldyB1aW50OF90W2NzZFNpemVdOworICAgIGlmIChjc2RTaXplID4gKmVzZHNfc2l6ZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogICAgIG1lbWNweShjc2QsIGtTdGF0aWNFU0RTLCBzaXplb2Yoa1N0YXRpY0VTRFMpKTsKIAogICAgIGNzZFtzaXplb2Yoa1N0YXRpY0VTRFMpXSA9CkBAIC05MiwxNCArMTY5LDE5OCBAQAogICAgIGNzZFtzaXplb2Yoa1N0YXRpY0VTRFMpICsgMV0gPQogICAgICAgICAoKHNhbXBsaW5nX2ZyZXFfaW5kZXggPDwgNykgJiAweDgwKSB8IChjaGFubmVsX2NvbmZpZ3VyYXRpb24gPDwgMyk7CiAKKyAgICAqZXNkc19zaXplID0gY3NkU2l6ZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCB1bnNpZ25lZCBwcm9maWxlLCB1bnNpZ25lZCBzYW1wbGluZ19mcmVxX2luZGV4LAorICAgICAgICB1bnNpZ25lZCBjaGFubmVsX2NvbmZpZ3VyYXRpb24pIHsKKworICAgIGlmKHNhbXBsaW5nX2ZyZXFfaW5kZXggPiAxMXUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVpbnQ4X3QgY3NkWzJdOworICAgIGNzZFswXSA9ICgocHJvZmlsZSArIDEpIDw8IDMpIHwgKHNhbXBsaW5nX2ZyZXFfaW5kZXggPj4gMSk7CisgICAgY3NkWzFdID0gKChzYW1wbGluZ19mcmVxX2luZGV4IDw8IDcpICYgMHg4MCkgfCAoY2hhbm5lbF9jb25maWd1cmF0aW9uIDw8IDMpOworCisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga1NhbXBsaW5nRnJlcVtdID0geworICAgICAgICA5NjAwMCwgODgyMDAsIDY0MDAwLCA0ODAwMCwgNDQxMDAsIDMyMDAwLCAyNDAwMCwgMjIwNTAsCisgICAgICAgIDE2MDAwLCAxMjAwMCwgMTEwMjUsIDgwMDAKKyAgICB9OworICAgIGludDMyX3Qgc2FtcGxlUmF0ZSA9IGtTYW1wbGluZ0ZyZXFbc2FtcGxpbmdfZnJlcV9pbmRleF07CisKKyAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIGNzZCwgc2l6ZW9mKGNzZCkpOworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBzYW1wbGVSYXRlKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBjaGFubmVsX2NvbmZpZ3VyYXRpb24pOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKAorICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgIHVuc2lnbmVkIHByb2ZpbGUsIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXgsCisgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbikgeworCisgICAgdWludDhfdCBjc2RbMjRdOworICAgIHNpemVfdCBjc2RTaXplID0gc2l6ZW9mKGNzZCk7CisgICAgaW50MzJfdCBzYW1wbGVSYXRlOworCisgICAgaWYgKCFNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoY3NkLCAmY3NkU2l6ZSwgcHJvZmlsZSwgc2FtcGxpbmdfZnJlcV9pbmRleCwKKyAgICAgICAgICAgIGNoYW5uZWxfY29uZmlndXJhdGlvbiwgJnNhbXBsZVJhdGUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOwogCiAgICAgbWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7Ci0gICAgbWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBjaGFubmVsQ291bnQpOwotCisgICAgbWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBjaGFubmVsX2NvbmZpZ3VyYXRpb24pOwogICAgIG1ldGEuc2V0RGF0YShrS2V5RVNEUywgMCwgY3NkLCBjc2RTaXplKTsKLSAgICBkZWxldGUgW10gY3NkOwogICAgIHJldHVybiB0cnVlOwogfQogCisKK3N0YXRpYyB2b2lkIGV4dHJhY3RBbGJ1bUFydCgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmaWxlTWV0YSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiZXh0cmFjdEFsYnVtQXJ0IGZyb20gJyVzJyIsIChjb25zdCBjaGFyICopZGF0YSk7CisKKyAgICBzaXplX3QgaW5MZW4gPSBzdHJubGVuKChjb25zdCBjaGFyICopZGF0YSwgc2l6ZSk7CisgICAgc2l6ZV90IGZsYWNTaXplID0gaW5MZW4gLyA0ICogMzsKKyAgICB1aW50OF90ICpmbGFjID0gbmV3IHVpbnQ4X3RbZmxhY1NpemVdOworICAgIGlmICghZGVjb2RlQmFzZTY0KGZsYWMsICZmbGFjU2l6ZSwgKGNvbnN0IGNoYXIqKWRhdGEpKSB7CisgICAgICAgIEFMT0dFKCJtYWxmb3JtZWQgYmFzZTY0IGVuY29kZWQgZGF0YS4iKTsKKyAgICAgICAgZGVsZXRlW10gZmxhYzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dWKCJnb3QgZmxhYyBvZiBzaXplICV6dSIsIGZsYWNTaXplKTsKKworICAgIHVpbnQzMl90IHBpY1R5cGU7CisgICAgdWludDMyX3QgdHlwZUxlbjsKKyAgICB1aW50MzJfdCBkZXNjTGVuOworICAgIHVpbnQzMl90IGRhdGFMZW47CisgICAgY2hhciB0eXBlWzEyOF07CisKKyAgICBpZiAoZmxhY1NpemUgPCA4KSB7CisgICAgICAgIGRlbGV0ZVtdIGZsYWM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwaWNUeXBlID0gVTMyX0FUKGZsYWMpOworCisgICAgaWYgKHBpY1R5cGUgIT0gMykgeworICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIGZyb250IGNvdmVyLgorICAgICAgICBkZWxldGVbXSBmbGFjOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdHlwZUxlbiA9IFUzMl9BVCgmZmxhY1s0XSk7CisgICAgaWYgKHR5cGVMZW4gPiBzaXplb2YodHlwZSkgLSAxKSB7CisgICAgICAgIGRlbGV0ZVtdIGZsYWM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyB3ZSd2ZSBhbHJlYWR5IGNoZWNrZWQgYWJvdmUgdGhhdCBmbGFjU2l6ZSA+PSA4CisgICAgaWYgKGZsYWNTaXplIC0gOCA8IHR5cGVMZW4pIHsKKyAgICAgICAgZGVsZXRlW10gZmxhYzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1lbWNweSh0eXBlLCAmZmxhY1s4XSwgdHlwZUxlbik7CisgICAgdHlwZVt0eXBlTGVuXSA9ICdcMCc7CisKKyAgICBBTE9HVigicGljVHlwZSA9ICVkLCB0eXBlID0gJyVzJyIsIHBpY1R5cGUsIHR5cGUpOworCisgICAgaWYgKCFzdHJjbXAodHlwZSwgIi0tPiIpKSB7CisgICAgICAgIC8vIFRoaXMgaXMgbm90IGlubGluZSBjb3ZlciBhcnQsIGJ1dCBhbiBleHRlcm5hbCB1cmwgaW5zdGVhZC4KKyAgICAgICAgZGVsZXRlW10gZmxhYzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChmbGFjU2l6ZSA8IDMyIHx8IGZsYWNTaXplIC0gMzIgPCB0eXBlTGVuKSB7CisgICAgICAgIGRlbGV0ZVtdIGZsYWM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkZXNjTGVuID0gVTMyX0FUKCZmbGFjWzggKyB0eXBlTGVuXSk7CisgICAgaWYgKGZsYWNTaXplIC0gMzIgLSB0eXBlTGVuIDwgZGVzY0xlbikgeworICAgICAgICBkZWxldGVbXSBmbGFjOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZGF0YUxlbiA9IFUzMl9BVCgmZmxhY1s4ICsgdHlwZUxlbiArIDQgKyBkZXNjTGVuICsgMTZdKTsKKworICAgIC8vIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZCBhYm92ZSB0aGF0IChmbGFjU2l6ZSAtIDMyIC0gdHlwZUxlbiAtIGRlc2NMZW4pID49IDAKKyAgICBpZiAoZmxhY1NpemUgLSAzMiAtIHR5cGVMZW4gLSBkZXNjTGVuIDwgZGF0YUxlbikgeworICAgICAgICBkZWxldGVbXSBmbGFjOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1YoImdvdCBpbWFnZSBkYXRhLCAlenUgdHJhaWxpbmcgYnl0ZXMiLAorICAgICAgICAgZmxhY1NpemUgLSAzMiAtIHR5cGVMZW4gLSBkZXNjTGVuIC0gZGF0YUxlbik7CisKKyAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKGZpbGVNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJULAorICAgICAgICAgICAgJmZsYWNbOCArIHR5cGVMZW4gKyA0ICsgZGVzY0xlbiArIDIwXSwgZGF0YUxlbik7CisKKyAgICBkZWxldGVbXSBmbGFjOworfQorCit2b2lkIHBhcnNlVm9yYmlzQ29tbWVudCgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmaWxlTWV0YSwgY29uc3QgY2hhciAqY29tbWVudCwgc2l6ZV90IGNvbW1lbnRMZW5ndGgpIHsKKyAgICAvLyBIYXB0aWMgdGFnIGlzIG9ubHkga2VwdCBoZXJlIGFzIGl0IHdpbGwgb25seSBiZSB1c2VkIGluIGV4dHJhY3RvciB0byBnZW5lcmF0ZSBjaGFubmVsIG1hc2suCisgICAgY29uc3QgY2hhciogY29uc3QgaGFwdGljID0gImhhcHRpYyI7CisgICAgc3RydWN0IHsKKyAgICAgICAgY29uc3QgY2hhciAqY29uc3QgbVRhZzsKKyAgICAgICAgY29uc3QgY2hhciAqbUtleTsKKyAgICB9IGtNYXBbXSA9IHsKKyAgICAgICAgeyAiVElUTEUiLCBBTUVESUFGT1JNQVRfS0VZX1RJVExFIH0sCisgICAgICAgIHsgIkFSVElTVCIsIEFNRURJQUZPUk1BVF9LRVlfQVJUSVNUIH0sCisgICAgICAgIHsgIkFMQlVNQVJUSVNUIiwgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVElTVCB9LAorICAgICAgICB7ICJBTEJVTSBBUlRJU1QiLCBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUSVNUIH0sCisgICAgICAgIHsgIkNPTVBJTEFUSU9OIiwgQU1FRElBRk9STUFUX0tFWV9DT01QSUxBVElPTiB9LAorICAgICAgICB7ICJBTEJVTSIsIEFNRURJQUZPUk1BVF9LRVlfQUxCVU0gfSwKKyAgICAgICAgeyAiQ09NUE9TRVIiLCBBTUVESUFGT1JNQVRfS0VZX0NPTVBPU0VSIH0sCisgICAgICAgIHsgIkdFTlJFIiwgQU1FRElBRk9STUFUX0tFWV9HRU5SRSB9LAorICAgICAgICB7ICJBVVRIT1IiLCBBTUVESUFGT1JNQVRfS0VZX0FVVEhPUiB9LAorICAgICAgICB7ICJUUkFDS05VTUJFUiIsIEFNRURJQUZPUk1BVF9LRVlfQ0RUUkFDS05VTUJFUiB9LAorICAgICAgICB7ICJESVNDTlVNQkVSIiwgQU1FRElBRk9STUFUX0tFWV9ESVNDTlVNQkVSIH0sCisgICAgICAgIHsgIkRBVEUiLCBBTUVESUFGT1JNQVRfS0VZX0RBVEUgfSwKKyAgICAgICAgeyAiWUVBUiIsIEFNRURJQUZPUk1BVF9LRVlfWUVBUiB9LAorICAgICAgICB7ICJMWVJJQ0lTVCIsIEFNRURJQUZPUk1BVF9LRVlfTFlSSUNJU1QgfSwKKyAgICAgICAgeyAiTUVUQURBVEFfQkxPQ0tfUElDVFVSRSIsIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlQgfSwKKyAgICAgICAgeyAiQU5EUk9JRF9MT09QIiwgQU1FRElBRk9STUFUX0tFWV9MT09QIH0sCisgICAgICAgIHsgIkFORFJPSURfSEFQVElDIiwgaGFwdGljIH0sCisgICAgfTsKKworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHNpemVvZihrTWFwKSAvIHNpemVvZihrTWFwWzBdKTsgKytqKSB7CisgICAgICAgICAgICBzaXplX3QgdGFnTGVuID0gc3RybGVuKGtNYXBbal0ubVRhZyk7CisgICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKGtNYXBbal0ubVRhZywgY29tbWVudCwgdGFnTGVuKQorICAgICAgICAgICAgICAgICAgICAmJiBjb21tZW50W3RhZ0xlbl0gPT0gJz0nKSB7CisgICAgICAgICAgICAgICAgaWYgKGtNYXBbal0ubUtleSA9PSBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUKSB7CisgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RBbGJ1bUFydCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tbWVudFt0YWdMZW4gKyAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50TGVuZ3RoIC0gdGFnTGVuIC0gMSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrTWFwW2pdLm1LZXkgPT0gQU1FRElBRk9STUFUX0tFWV9MT09QKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcCgmY29tbWVudFt0YWdMZW4gKyAxXSwgInRydWUiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGZpbGVNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0xPT1AsIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrTWFwW2pdLm1LZXkgPT0gaGFwdGljKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKmVuZDsKKyAgICAgICAgICAgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaGFwdGljQ2hhbm5lbENvdW50ID0gc3RydG9sKCZjb21tZW50W3RhZ0xlbiArIDFdLCAmZW5kLCAxMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnJubyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoZmlsZU1ldGEsIGhhcHRpYywgaGFwdGljQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJFcnJvciglZCkgd2hlbiBwYXJzaW5nIGhhcHRpYyBjaGFubmVsIGNvdW50IiwgZXJybm8pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhmaWxlTWV0YSwga01hcFtqXS5tS2V5LCAmY29tbWVudFt0YWdMZW4gKyAxXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwCmluZGV4IDE4ZjRiMTIuLjcwMjVhZjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcApAQCAtMjU2LDYgKzI1NiwxMCBAQAogICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKIH0KIAordm9pZCBOdUNhY2hlZFNvdXJjZTI6OmNsb3NlKCkgeworICAgIGRpc2Nvbm5lY3QoKTsKK30KKwogdm9pZCBOdUNhY2hlZFNvdXJjZTI6OmRpc2Nvbm5lY3QoKSB7CiAgICAgaWYgKG1Tb3VyY2UtPmZsYWdzKCkgJiBrSXNIVFRQQmFzZWRTb3VyY2UpIHsKICAgICAgICAgQUxPR1YoImRpc2Nvbm5lY3RpbmcgSFRUUEJhc2VkU291cmNlIik7CkBAIC01NjcsMTIgKzU3MSwxOSBAQAogICAgIHJldHVybiBtQ2FjaGVPZmZzZXQgKyBtQ2FjaGUtPnRvdGFsU2l6ZSgpOwogfQogCi1zaXplX3QgTnVDYWNoZWRTb3VyY2UyOjphcHByb3hEYXRhUmVtYWluaW5nKHN0YXR1c190ICpmaW5hbFN0YXR1cykgY29uc3Qgeworc3RhdHVzX3QgTnVDYWNoZWRTb3VyY2UyOjpnZXRBdmFpbGFibGVTaXplKG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90ICpzaXplKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICByZXR1cm4gYXBwcm94RGF0YVJlbWFpbmluZ19sKGZpbmFsU3RhdHVzKTsKKyAgICBzdGF0dXNfdCBmaW5hbFN0YXR1cyA9IFVOS05PV05fRVJST1I7CisgICAgKnNpemUgPSBhcHByb3hEYXRhUmVtYWluaW5nX2wob2Zmc2V0LCAmZmluYWxTdGF0dXMpOworICAgIHJldHVybiBmaW5hbFN0YXR1czsKIH0KIAotc2l6ZV90IE51Q2FjaGVkU291cmNlMjo6YXBwcm94RGF0YVJlbWFpbmluZ19sKHN0YXR1c190ICpmaW5hbFN0YXR1cykgY29uc3Qgeworc2l6ZV90IE51Q2FjaGVkU291cmNlMjo6YXBwcm94RGF0YVJlbWFpbmluZyhzdGF0dXNfdCAqZmluYWxTdGF0dXMpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHJldHVybiBhcHByb3hEYXRhUmVtYWluaW5nX2wobUxhc3RBY2Nlc3NQb3MsIGZpbmFsU3RhdHVzKTsKK30KKworc2l6ZV90IE51Q2FjaGVkU291cmNlMjo6YXBwcm94RGF0YVJlbWFpbmluZ19sKG9mZjY0X3Qgb2Zmc2V0LCBzdGF0dXNfdCAqZmluYWxTdGF0dXMpIGNvbnN0IHsKICAgICAqZmluYWxTdGF0dXMgPSBtRmluYWxTdGF0dXM7CiAKICAgICBpZiAobUZpbmFsU3RhdHVzICE9IE9LICYmIG1OdW1SZXRyaWVzTGVmdCA+IDApIHsKQEAgLTU4MCw5ICs1OTEsMTAgQEAKICAgICAgICAgKmZpbmFsU3RhdHVzID0gT0s7CiAgICAgfQogCisgICAgb2Zmc2V0ID0gb2Zmc2V0ID49IDAgPyBvZmZzZXQgOiBtTGFzdEFjY2Vzc1BvczsKICAgICBvZmY2NF90IGxhc3RCeXRlUG9zQ2FjaGVkID0gbUNhY2hlT2Zmc2V0ICsgbUNhY2hlLT50b3RhbFNpemUoKTsKLSAgICBpZiAobUxhc3RBY2Nlc3NQb3MgPCBsYXN0Qnl0ZVBvc0NhY2hlZCkgewotICAgICAgICByZXR1cm4gbGFzdEJ5dGVQb3NDYWNoZWQgLSBtTGFzdEFjY2Vzc1BvczsKKyAgICBpZiAob2Zmc2V0IDwgbGFzdEJ5dGVQb3NDYWNoZWQpIHsKKyAgICAgICAgcmV0dXJuIGxhc3RCeXRlUG9zQ2FjaGVkIC0gb2Zmc2V0OwogICAgIH0KICAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5jcHAKaW5kZXggNGE3ZDZjYS4uZjUxNzhkZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5jcHAKQEAgLTIxLDEwICsyMSw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oPgogCiAjaW5jbHVkZSAiaW5jbHVkZS9FU0RTLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCIKIAogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTM0LDYgKzMyLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CkBAIC0yMDUsMTUgKzIwNCw2IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIE51TWVkaWFFeHRyYWN0b3I6OmRpc2Nvbm5lY3QoKSB7Ci0gICAgaWYgKG1EYXRhU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgLy8gZGlzY29ubmVjdCBkYXRhIHNvdXJjZQotICAgICAgICBpZiAobURhdGFTb3VyY2UtPmZsYWdzKCkgJiBEYXRhU291cmNlOjprSXNDYWNoaW5nRGF0YVNvdXJjZSkgewotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TnVDYWNoZWRTb3VyY2UyICo+KG1EYXRhU291cmNlLmdldCgpKS0+ZGlzY29ubmVjdCgpOwotICAgICAgICB9Ci0gICAgfQotfQotCiBzdGF0dXNfdCBOdU1lZGlhRXh0cmFjdG9yOjp1cGRhdGVEdXJhdGlvbkFuZEJpdHJhdGUoKSB7CiAgICAgaWYgKG1JbXBsLT5jb3VudFRyYWNrcygpID4ga01heFRyYWNrQ291bnQpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwpAQCAtNzkwLDE2ICs3ODAsMTIgQEAKICAgICAgICAgaW50NjRfdCAqZHVyYXRpb25VcywgYm9vbCAqZW9zKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAorICAgIG9mZjY0X3QgY2FjaGVkRGF0YVJlbWFpbmluZyA9IC0xOworICAgIHN0YXR1c190IGZpbmFsU3RhdHVzID0gbURhdGFTb3VyY2UtPmdldEF2YWlsYWJsZVNpemUoLTEsICZjYWNoZWREYXRhUmVtYWluaW5nKTsKKwogICAgIGludDY0X3QgYml0cmF0ZTsKLSAgICBpZiAoKG1EYXRhU291cmNlLT5mbGFncygpICYgRGF0YVNvdXJjZTo6a0lzQ2FjaGluZ0RhdGFTb3VyY2UpCisgICAgaWYgKGNhY2hlZERhdGFSZW1haW5pbmcgPj0gMAogICAgICAgICAgICAgJiYgZ2V0VG90YWxCaXRyYXRlKCZiaXRyYXRlKSkgewotICAgICAgICBzcDxOdUNhY2hlZFNvdXJjZTI+IGNhY2hlZFNvdXJjZSA9Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxOdUNhY2hlZFNvdXJjZTIgKj4obURhdGFTb3VyY2UuZ2V0KCkpOwotCi0gICAgICAgIHN0YXR1c190IGZpbmFsU3RhdHVzOwotICAgICAgICBzaXplX3QgY2FjaGVkRGF0YVJlbWFpbmluZyA9Ci0gICAgICAgICAgICBjYWNoZWRTb3VyY2UtPmFwcHJveERhdGFSZW1haW5pbmcoJmZpbmFsU3RhdHVzKTsKLQogICAgICAgICAqZHVyYXRpb25VcyA9IGNhY2hlZERhdGFSZW1haW5pbmcgKiA4MDAwMDAwbGwgLyBiaXRyYXRlOwogICAgICAgICAqZW9zID0gKGZpbmFsU3RhdHVzICE9IE9LKTsKICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC04MDgsNCArNzk0LDMyIEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCisvLyBSZXR1cm4gT0sgaWYgd2UgaGF2ZSByZWNlaXZlZCBhbiBhdWRpbyBwcmVzZW50YXRpb24gaW5mby4KKy8vIFJldHVybiBFUlJPUl9VTlNVUFBPUlRFRCBpZiB0aGUgdHJhY2sgaGFzIG5vIGF1ZGlvIHByZXNlbnRhdGlvbi4KKy8vIFJldHVybiBJTlZBTElEX09QRVJBVElPTiBpZiBhdWRpbyBwcmVzZW50YXRpb24gbWV0YWRhdGEgdmVyc2lvbiBkb2VzIG5vdCBtYXRjaC4KK3N0YXR1c190IE51TWVkaWFFeHRyYWN0b3I6OmdldEF1ZGlvUHJlc2VudGF0aW9ucygKKyAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXgsIEF1ZGlvUHJlc2VudGF0aW9uQ29sbGVjdGlvbiAqcHJlc2VudGF0aW9ucykgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUltcGwgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAodHJhY2tJbmRleCA+PSBtSW1wbC0+Y291bnRUcmFja3MoKSkgeworICAgICAgICByZXR1cm4gLUVSQU5HRTsKKyAgICB9CisKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1JbXBsLT5nZXRUcmFja01ldGFEYXRhKHRyYWNrSW5kZXgpOworCisgICAgdWludDMyX3QgdHlwZTsKKyAgICBjb25zdCB2b2lkICpkYXRhOworICAgIHNpemVfdCBzaXplOworICAgIGlmIChtZXRhICE9IE5VTEwgJiYgbWV0YS0+ZmluZERhdGEoa0tleUF1ZGlvUHJlc2VudGF0aW9uSW5mbywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgc3RkOjppc3RyaW5nc3RyZWFtIGluU3RyZWFtKHN0ZDo6c3RyaW5nKHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihkYXRhKSwgc2l6ZSkpOworICAgICAgICByZXR1cm4gZGVzZXJpYWxpemVBdWRpb1ByZXNlbnRhdGlvbnMoJmluU3RyZWFtLCBwcmVzZW50YXRpb25zKTsKKyAgICB9CisgICAgQUxPR0UoIlNvdXJjZSBkb2VzIG5vdCBjb250YWluIGFueSBhdWRpbyBwcmVzZW50YXRpb24iKTsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnV3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDU1YzU2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnV3JpdGVyLmNwcApAQCAtMCwwICsxLDM5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT2dnV3JpdGVyIgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL21lZGlhcmVjb3JkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PZ2dXcml0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgIk9wdXNIZWFkZXIuaCIKKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSA8b2dnL29nZy5oPgorfQorCisvLyBzdG9yZSB0aGUgaW50MzIgdmFsdWUgaW4gbGl0dGxlLWVuZGlhbiBvcmRlci4KK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZWludChjaGFyICpidWYsIGludCBiYXNlLCBpbnQzMl90IHZhbCkgeworICAgIGJ1ZltiYXNlICsgM10gPSAoKHZhbCkgPj4gMjQpICYgMHhmZjsKKyAgICBidWZbYmFzZSArIDJdID0gKCh2YWwpID4+IDE2KSAmIDB4ZmY7CisgICAgYnVmW2Jhc2UgKyAxXSA9ICgodmFsKSA+PiA4KSAmIDB4ZmY7CisgICAgYnVmW2Jhc2VdID0gKHZhbCkmMHhmZjsKK30KKworLy8gbGlua2FnZSBiZXR3ZWVuIG91ciBoZWFkZXIgT2dnU3RyZWFtU3RhdGUgYW5kIHRoZSB1bmRlcmx5aW5nIG9nZ19zdHJlYW1fc3RhdGUKKy8vIHNvIHRoYXQgY29uc3VtZXJzIG9mIG91ciBpbnRlcmZhY2UgZG8gbm90IHJlcXVpcmUgdGhlIG9nZyBoZWFkZXJzIHRoZW1zZWx2ZXMuCitzdHJ1Y3QgT2dnU3RyZWFtU3RhdGUgOiBwdWJsaWMgb2dnX3N0cmVhbV9zdGF0ZSB7fTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitPZ2dXcml0ZXI6Ok9nZ1dyaXRlcihpbnQgZmQpCisgICAgICA6IG1GZChkdXAoZmQpKSwKKyAgICAgICAgbUluaXRDaGVjayhtRmQgPCAwID8gTk9fSU5JVCA6IE9LKSB7CisgICAgLy8gZW1wdHkKK30KKworT2dnV3JpdGVyOjp+T2dnV3JpdGVyKCkgeworICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICByZXNldCgpOworICAgIH0KKworICAgIGlmIChtRmQgIT0gLTEpIHsKKyAgICAgICAgY2xvc2UobUZkKTsKKyAgICAgICAgbUZkID0gLTE7CisgICAgfQorCisgICAgZnJlZShtT3MpOworfQorCitzdGF0dXNfdCBPZ2dXcml0ZXI6OmluaXRDaGVjaygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUluaXRDaGVjazsKK30KKworc3RhdHVzX3QgT2dnV3JpdGVyOjphZGRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+JiBzb3VyY2UpIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIC8vIFN1cHBvcnQgaXMgbGltaXRlZCB0byBzaW5nbGUgdHJhY2sgb2YgT3B1cyBhdWRpby4KKyAgICBjb25zdCBjaGFyKiBtaW1lOworICAgIHNvdXJjZS0+Z2V0Rm9ybWF0KCktPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOworICAgIGNvbnN0IGNoYXIqIG9wdXMgPSBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTOworICAgIGlmIChzdHJuY2FzZWNtcChtaW1lLCBvcHVzLCBzdHJsZW4ob3B1cykpKSB7CisgICAgICAgIEFMT0dFKCJUcmFjayAoJXMpIG90aGVyIHRoYW4gJXMgaXMgbm90IHN1cHBvcnRlZCIsIG1pbWUsIG9wdXMpOworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgbU9zID0gKE9nZ1N0cmVhbVN0YXRlKikgbWFsbG9jKHNpemVvZihvZ2dfc3RyZWFtX3N0YXRlKSk7CisgICAgaWYgKG9nZ19zdHJlYW1faW5pdCgob2dnX3N0cmVhbV9zdGF0ZSopbU9zLCByYW5kKCkpID09IC0xKSB7CisgICAgICAgIEFMT0dFKCJvZ2cgc3RyZWFtIGluaXQgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIC8vIFdyaXRlIE9nZyBoZWFkZXJzLgorICAgIGludDMyX3QgbkNoYW5uZWxzID0gMDsKKyAgICBpZiAoIXNvdXJjZS0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmbkNoYW5uZWxzKSkgeworICAgICAgICBBTE9HRSgiTWlzc2luZyBmb3JtYXQga2V5cyBmb3IgYXVkaW8gdHJhY2siKTsKKyAgICAgICAgc291cmNlLT5nZXRGb3JtYXQoKS0+ZHVtcFRvTG9nKCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHNvdXJjZS0+Z2V0Rm9ybWF0KCktPmR1bXBUb0xvZygpOworCisgICAgaW50MzJfdCBzYW1wbGVSYXRlID0gMDsKKyAgICBpZiAoIXNvdXJjZS0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZVJhdGUpKSB7CisgICAgICAgIEFMT0dFKCJNaXNzaW5nIGZvcm1hdCBrZXkgZm9yIHNhbXBsZSByYXRlIik7CisgICAgICAgIHNvdXJjZS0+Z2V0Rm9ybWF0KCktPmR1bXBUb0xvZygpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBtU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisKKyAgICBPcHVzSGVhZGVyIGhlYWRlcjsKKyAgICBoZWFkZXIuY2hhbm5lbHMgPSBuQ2hhbm5lbHM7CisgICAgaGVhZGVyLm51bV9zdHJlYW1zID0gbkNoYW5uZWxzOworICAgIGhlYWRlci5udW1fY291cGxlZCA9IDA7CisgICAgaGVhZGVyLmNoYW5uZWxfbWFwcGluZyA9ICgobkNoYW5uZWxzID4gOCkgPyAyNTUgOiAobkNoYW5uZWxzID4gMikpOworICAgIGhlYWRlci5nYWluX2RiID0gMDsKKyAgICBoZWFkZXIuc2tpcF9zYW1wbGVzID0gMDsKKworICAgIC8vIGhlYWRlcnMgYXJlIDIxLWJ5dGVzICsgc29tZXRoaW5nIGRyaXZlbiBieSBjaGFubmVsIGNvdW50CisgICAgLy8gZXhwZWN0IG51bWJlcnMgaW4gdGhlIGxvdyAzMCdzIGhlcmUuIFdyaXRlT3B1c0hlYWRlcigpIHdpbGwgdGVsbCB1cworICAgIC8vIGlmIHRoaW5ncyBhcmUgYmFkLgorICAgIHVuc2lnbmVkIGNoYXIgaGVhZGVyX2RhdGFbMTAwXTsKKyAgICBvZ2dfcGFja2V0IG9wOworICAgIG9nZ19wYWdlIG9nOworCisgICAgY29uc3QgaW50IHBhY2tldF9zaXplID0gV3JpdGVPcHVzSGVhZGVyKGhlYWRlciwgbVNhbXBsZVJhdGUsICh1aW50OF90KiloZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhlYWRlcl9kYXRhKSk7CisKKyAgICBpZiAocGFja2V0X3NpemUgPCAwKSB7CisgICAgICAgIEFMT0dFKCJvcHVzIGhlYWRlciB3cml0aW5nIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgb3AucGFja2V0ID0gaGVhZGVyX2RhdGE7CisgICAgb3AuYnl0ZXMgPSBwYWNrZXRfc2l6ZTsKKyAgICBvcC5iX29fcyA9IDE7CisgICAgb3AuZV9vX3MgPSAwOworICAgIG9wLmdyYW51bGVwb3MgPSAwOworICAgIG9wLnBhY2tldG5vID0gMDsKKyAgICBvZ2dfc3RyZWFtX3BhY2tldGluKChvZ2dfc3RyZWFtX3N0YXRlKiltT3MsICZvcCk7CisKKyAgICBpbnQgcmV0OworICAgIHdoaWxlICgocmV0ID0gb2dnX3N0cmVhbV9mbHVzaCgob2dnX3N0cmVhbV9zdGF0ZSopbU9zLCAmb2cpKSkgeworICAgICAgICBpZiAoIXJldCkgYnJlYWs7CisgICAgICAgIHdyaXRlKG1GZCwgb2cuaGVhZGVyLCBvZy5oZWFkZXJfbGVuKTsKKyAgICAgICAgd3JpdGUobUZkLCBvZy5ib2R5LCBvZy5ib2R5X2xlbik7CisgICAgfQorCisKKyAgICBjb25zdCBjaGFyKiB2ZW5kb3Jfc3RyaW5nID0gImxpYm9wdXMiOworICAgIGNvbnN0IGludCB2ZW5kb3JfbGVuZ3RoID0gc3RybGVuKHZlbmRvcl9zdHJpbmcpOworICAgIGludCB1c2VyX2NvbW1lbnRfbGlzdF9sZW5ndGggPSAwOworCisgICAgY29uc3QgaW50IGNvbW1lbnRzX2xlbmd0aCA9IDggKyA0ICsgdmVuZG9yX2xlbmd0aCArIDQgKyB1c2VyX2NvbW1lbnRfbGlzdF9sZW5ndGg7CisgICAgY2hhciogY29tbWVudHMgPSAoY2hhciopbWFsbG9jKGNvbW1lbnRzX2xlbmd0aCk7CisgICAgaWYgKGNvbW1lbnRzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBhbGxvY2F0ZSBvZ2cgY29tbWVudCBidWZmZXIiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIG1lbWNweShjb21tZW50cywgIk9wdXNUYWdzIiwgOCk7CisgICAgd3JpdGVpbnQoY29tbWVudHMsIDgsIHZlbmRvcl9sZW5ndGgpOworICAgIG1lbWNweShjb21tZW50cyArIDEyLCB2ZW5kb3Jfc3RyaW5nLCB2ZW5kb3JfbGVuZ3RoKTsKKyAgICB3cml0ZWludChjb21tZW50cywgMTIgKyB2ZW5kb3JfbGVuZ3RoLCB1c2VyX2NvbW1lbnRfbGlzdF9sZW5ndGgpOworCisgICAgb3AucGFja2V0ID0gKHVuc2lnbmVkIGNoYXIqKWNvbW1lbnRzOworICAgIG9wLmJ5dGVzID0gY29tbWVudHNfbGVuZ3RoOworICAgIG9wLmJfb19zID0gMDsKKyAgICBvcC5lX29fcyA9IDA7CisgICAgb3AuZ3JhbnVsZXBvcyA9IDA7CisgICAgb3AucGFja2V0bm8gPSAxOworICAgIG9nZ19zdHJlYW1fcGFja2V0aW4oKG9nZ19zdHJlYW1fc3RhdGUqKW1PcywgJm9wKTsKKworICAgIHdoaWxlICgocmV0ID0gb2dnX3N0cmVhbV9mbHVzaCgob2dnX3N0cmVhbV9zdGF0ZSopbU9zLCAmb2cpKSkgeworICAgICAgICBpZiAoIXJldCkgYnJlYWs7CisgICAgICAgIHdyaXRlKG1GZCwgb2cuaGVhZGVyLCBvZy5oZWFkZXJfbGVuKTsKKyAgICAgICAgd3JpdGUobUZkLCBvZy5ib2R5LCBvZy5ib2R5X2xlbik7CisgICAgfQorCisgICAgbVNvdXJjZSA9IHNvdXJjZTsKKyAgICBmcmVlKGNvbW1lbnRzKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE9nZ1dyaXRlcjo6c3RhcnQoTWV0YURhdGEqIC8qIHBhcmFtcyAqLykgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaWYgKG1TdGFydGVkICYmIG1QYXVzZWQpIHsKKyAgICAgICAgbVBhdXNlZCA9IGZhbHNlOworICAgICAgICBtUmVzdW1lZCA9IHRydWU7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIC8vIEFscmVhZHkgc3RhcnRlZCwgZG9lcyBub3RoaW5nCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5zdGFydCgpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHB0aHJlYWRfYXR0cl90IGF0dHI7CisgICAgcHRocmVhZF9hdHRyX2luaXQoJmF0dHIpOworICAgIHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmYXR0ciwgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUpOworCisgICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKKyAgICBtRG9uZSA9IGZhbHNlOworCisgICAgcHRocmVhZF9jcmVhdGUoJm1UaHJlYWQsICZhdHRyLCBUaHJlYWRXcmFwcGVyLCB0aGlzKTsKKyAgICBwdGhyZWFkX2F0dHJfZGVzdHJveSgmYXR0cik7CisKKyAgICBtU3RhcnRlZCA9IHRydWU7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE9nZ1dyaXRlcjo6cGF1c2UoKSB7CisgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIG1QYXVzZWQgPSB0cnVlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgT2dnV3JpdGVyOjpyZXNldCgpIHsKKyAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBtRG9uZSA9IHRydWU7CisKKyAgICB2b2lkKiBkdW1teTsKKyAgICBwdGhyZWFkX2pvaW4obVRocmVhZCwgJmR1bW15KTsKKworICAgIHN0YXR1c190IGVyciA9IHN0YXRpY19jYXN0PHN0YXR1c190PihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oZHVtbXkpKTsKKyAgICB7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSyAmJiAoc3RhdHVzICE9IE9LICYmIHN0YXR1cyAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSkgeworICAgICAgICAgICAgZXJyID0gc3RhdHVzOworICAgICAgICB9CisgICAgfQorCisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICByZXR1cm4gZXJyOworfQorCitib29sIE9nZ1dyaXRlcjo6ZXhjZWVkc0ZpbGVTaXplTGltaXQoKSB7CisgICAgaWYgKG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBtRXN0aW1hdGVkU2l6ZUJ5dGVzID4gbU1heEZpbGVTaXplTGltaXRCeXRlczsKK30KKworYm9vbCBPZ2dXcml0ZXI6OmV4Y2VlZHNGaWxlRHVyYXRpb25MaW1pdCgpIHsKKyAgICBpZiAobU1heEZpbGVEdXJhdGlvbkxpbWl0VXMgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBtRXN0aW1hdGVkRHVyYXRpb25VcyA+IG1NYXhGaWxlRHVyYXRpb25MaW1pdFVzOworfQorCisvLyBzdGF0aWMKK3ZvaWQqIE9nZ1dyaXRlcjo6VGhyZWFkV3JhcHBlcih2b2lkKiBtZSkgeworICAgIHJldHVybiAodm9pZCopKHVpbnRwdHJfdCkgc3RhdGljX2Nhc3Q8T2dnV3JpdGVyKj4obWUpLT50aHJlYWRGdW5jKCk7Cit9CisKK3N0YXR1c190IE9nZ1dyaXRlcjo6dGhyZWFkRnVuYygpIHsKKyAgICBtRXN0aW1hdGVkRHVyYXRpb25VcyA9IDA7CisgICAgbUVzdGltYXRlZFNpemVCeXRlcyA9IDA7CisgICAgYm9vbCBzdG9wcGVkUHJlbWF0dXJlbHkgPSB0cnVlOworICAgIGludDY0X3QgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzID0gMDsKKyAgICBpbnQ2NF90IG1heFRpbWVzdGFtcFVzID0gMDsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKworICAgIHByY3RsKFBSX1NFVF9OQU1FLCAodW5zaWduZWQgbG9uZykiT2dnV3JpdGVyIiwgMCwgMCwgMCk7CisKKyAgICB3aGlsZSAoIW1Eb25lKSB7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSogYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgZXJyID0gbVNvdXJjZS0+cmVhZCgmYnVmZmVyKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiZmFpbGVkIHRvIHJlYWQgbmV4dCBidWZmZXIiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1QYXVzZWQpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG1Fc3RpbWF0ZWRTaXplQnl0ZXMgKz0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgaWYgKGV4Y2VlZHNGaWxlU2l6ZUxpbWl0KCkpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG5vdGlmeShNRURJQV9SRUNPUkRFUl9FVkVOVF9JTkZPLCBNRURJQV9SRUNPUkRFUl9JTkZPX01BWF9GSUxFU0laRV9SRUFDSEVELCAwKTsKKyAgICAgICAgICAgIEFMT0dXKCJlc3RpbWF0ZWQgc2l6ZSglIiBQUklkNjQgIikgZXhjZWVkcyBsaW1pdCAoJSIgUFJJZDY0ICIpIiwKKyAgICAgICAgICAgICAgICAgIG1Fc3RpbWF0ZWRTaXplQnl0ZXMsIG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVczsKKyAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lc3RhbXBVcykpOworICAgICAgICBpZiAodGltZXN0YW1wVXMgPiBtRXN0aW1hdGVkRHVyYXRpb25VcykgeworICAgICAgICAgICAgbUVzdGltYXRlZER1cmF0aW9uVXMgPSB0aW1lc3RhbXBVczsKKyAgICAgICAgfQorICAgICAgICBpZiAobVJlc3VtZWQpIHsKKyAgICAgICAgICAgIHByZXZpb3VzUGF1c2VkRHVyYXRpb25VcyArPSAodGltZXN0YW1wVXMgLSBtYXhUaW1lc3RhbXBVcyAtIDIwMDAwKTsKKyAgICAgICAgICAgIG1SZXN1bWVkID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB0aW1lc3RhbXBVcyAtPSBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXM7CisKKyAgICAgICAgQUxPR1YoInRpbWUgc3RhbXA6ICUiIFBSSWQ2NCAiLCBwcmV2aW91cyBwYXVzZWQgZHVyYXRpb246ICUiIFBSSWQ2NCwgdGltZXN0YW1wVXMsCisgICAgICAgICAgICAgIHByZXZpb3VzUGF1c2VkRHVyYXRpb25Vcyk7CisgICAgICAgIGlmICh0aW1lc3RhbXBVcyA+IG1heFRpbWVzdGFtcFVzKSB7CisgICAgICAgICAgICBtYXhUaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGV4Y2VlZHNGaWxlRHVyYXRpb25MaW1pdCgpKSB7CisgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICBub3RpZnkoTUVESUFfUkVDT1JERVJfRVZFTlRfSU5GTywgTUVESUFfUkVDT1JERVJfSU5GT19NQVhfRFVSQVRJT05fUkVBQ0hFRCwgMCk7CisgICAgICAgICAgICBBTE9HVygiZXN0aW1hdGVkIGR1cmF0aW9uKCUiIFBSSWQ2NCAiIHVzKSBleGNlZWRzIGxpbWl0KCUiIFBSSWQ2NCAiIHVzKSIsCisgICAgICAgICAgICAgICAgICBtRXN0aW1hdGVkRHVyYXRpb25VcywgbU1heEZpbGVEdXJhdGlvbkxpbWl0VXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBvZ2dfcGFja2V0IG9wOworICAgICAgICBvZ2dfcGFnZSBvZzsKKyAgICAgICAgb3AucGFja2V0ID0gKHVpbnQ4X3QqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKKyAgICAgICAgb3AuYnl0ZXMgPSAobG9uZylidWZmZXItPnJhbmdlX2xlbmd0aCgpOworICAgICAgICBvcC5iX29fcyA9IDA7CisgICAgICAgIG9wLmVfb19zID0gbVJlYWNoZWRFT1MgPyAxIDogMDsKKyAgICAgICAgLy8gZ3JhbnVsZXBvcyBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIFBDTSBhdWRpbyBzYW1wbGVzIEAgNDgga0h6LCB1cCB0byBhbmQKKyAgICAgICAgLy8gaW5jbHVkaW5nIHRoZSBjdXJyZW50IHBhY2tldC4KKyAgICAgICAgb2dnX2ludDY0X3QgZ3JhbnVsZXBvcyA9ICg0ODAwMCAqIG1Fc3RpbWF0ZWREdXJhdGlvblVzKSAvIDEwMDAwMDA7CisgICAgICAgIG9wLmdyYW51bGVwb3MgPSBncmFudWxlcG9zOworCisgICAgICAgIC8vIEhlYWRlcnMgYXJlIGF0IHBhY2tldHMgMCBhbmQgMS4KKyAgICAgICAgb3AucGFja2V0bm8gPSAyICsgKG9nZ19pbnQzMl90KW1DdXJyZW50UGFja2V0SWQrKzsKKyAgICAgICAgb2dnX3N0cmVhbV9wYWNrZXRpbigob2dnX3N0cmVhbV9zdGF0ZSopbU9zLCAmb3ApOworICAgICAgICBzaXplX3QgbiA9IDA7CisKKyAgICAgICAgd2hpbGUgKG9nZ19zdHJlYW1fZmx1c2goKG9nZ19zdHJlYW1fc3RhdGUqKW1PcywgJm9nKSA+IDApIHsKKyAgICAgICAgICAgIHdyaXRlKG1GZCwgb2cuaGVhZGVyLCBvZy5oZWFkZXJfbGVuKTsKKyAgICAgICAgICAgIHdyaXRlKG1GZCwgb2cuYm9keSwgb2cuYm9keV9sZW4pOworICAgICAgICAgICAgbiA9IG4gKyBvZy5oZWFkZXJfbGVuICsgb2cuYm9keV9sZW47CisgICAgICAgIH0KKworICAgICAgICBpZiAobiA8IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGVyciA9IEVSUk9SX0lPOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN0b3BwZWRQcmVtYXR1cmVseSA9IGZhbHNlOworCisgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICBidWZmZXIgPSBudWxscHRyOworICAgIH0KKworICAgIC8vIGVuZCBvZiBzdHJlYW0gaXMgYW4gb2sgdGhpbmcKKyAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgZXJyID0gT0s7CisgICAgfQorCisgICAgaWYgKGVyciA9PSBPSyAmJiBzdG9wcGVkUHJlbWF0dXJlbHkpIHsKKyAgICAgICAgZXJyID0gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGNsb3NlKG1GZCk7CisgICAgbUZkID0gLTE7CisgICAgbVJlYWNoZWRFT1MgPSB0cnVlOworCisgICAgcmV0dXJuIGVycjsKK30KKworYm9vbCBPZ2dXcml0ZXI6OnJlYWNoZWRFT1MoKSB7CisgICAgcmV0dXJuIG1SZWFjaGVkRU9TOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuY3BwCmluZGV4IGQwN2FmZWMuLmRiMzFhZjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5jcHAKQEAgLTI1LDI1ICsyNSwyOSBAQAogICAgICAgICBNZWRpYVRyYWNrICpzb3VyY2UsCiAgICAgICAgIGNvbnN0IHNwPFJlZkJhc2U+ICZwbHVnaW4pCiAgICAgOiBtRXh0cmFjdG9yKGV4dHJhY3RvciksCi0gICAgICBtU291cmNlKHNvdXJjZSksCisgICAgICBtVHJhY2soc291cmNlKSwKICAgICAgIG1FeHRyYWN0b3JQbHVnaW4ocGx1Z2luKSB7fQogCiBSZW1vdGVNZWRpYVNvdXJjZTo6flJlbW90ZU1lZGlhU291cmNlKCkgewotICAgIGRlbGV0ZSBtU291cmNlOworICAgIGRlbGV0ZSBtVHJhY2s7CiAgICAgbUV4dHJhY3RvclBsdWdpbiA9IG51bGxwdHI7CiB9CiAKIHN0YXR1c190IFJlbW90ZU1lZGlhU291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7Ci0gICAgcmV0dXJuIG1Tb3VyY2UtPnN0YXJ0KHBhcmFtcyk7CisgICAgaWYgKHBhcmFtcykgeworICAgICAgICBBTE9HVygiZHJvcHBpbmcgc3RhcnQgcGFyYW1ldGVyczoiKTsKKyAgICAgICAgcGFyYW1zLT5kdW1wVG9Mb2coKTsKKyAgICB9CisgICAgcmV0dXJuIG1UcmFjay0+c3RhcnQoKTsKIH0KIAogc3RhdHVzX3QgUmVtb3RlTWVkaWFTb3VyY2U6OnN0b3AoKSB7Ci0gICAgcmV0dXJuIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICByZXR1cm4gbVRyYWNrLT5zdG9wKCk7CiB9CiAKIHNwPE1ldGFEYXRhPiBSZW1vdGVNZWRpYVNvdXJjZTo6Z2V0Rm9ybWF0KCkgewogICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhKCk7Ci0gICAgaWYgKG1Tb3VyY2UtPmdldEZvcm1hdCgqbWV0YS5nZXQoKSkgPT0gT0spIHsKKyAgICBpZiAobVRyYWNrLT5nZXRGb3JtYXQoKm1ldGEuZ2V0KCkpID09IE9LKSB7CiAgICAgICAgIHJldHVybiBtZXRhOwogICAgIH0KICAgICByZXR1cm4gbnVsbHB0cjsKQEAgLTUxLDcgKzU1LDExIEBACiAKIHN0YXR1c190IFJlbW90ZU1lZGlhU291cmNlOjpyZWFkKAogICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotICAgIHJldHVybiBtU291cmNlLT5yZWFkKGJ1ZmZlciwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMqPihvcHRpb25zKSk7CisgICAgcmV0dXJuIG1UcmFjay0+cmVhZChidWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zKj4ob3B0aW9ucykpOworfQorCitib29sIFJlbW90ZU1lZGlhU291cmNlOjpzdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCkgeworICAgIHJldHVybiBtVHJhY2stPnN1cHBvcnROb25ibG9ja2luZ1JlYWQoKTsKIH0KIAogc3RhdHVzX3QgUmVtb3RlTWVkaWFTb3VyY2U6OnBhdXNlKCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuY3BwCmluZGV4IDQwNGM1MzcuLmJhYmRjN2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NpbXBsZURlY29kaW5nU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TaW1wbGVEZWNvZGluZ1NvdXJjZS5jcHAKQEAgLTM3LDYgKzM3LDcgQEAKIAogY29uc3QgaW50NjRfdCBrVGltZW91dFdhaXRGb3JPdXRwdXRVcyA9IDUwMDAwMDsgLy8gMC41IHNlY29uZHMKIGNvbnN0IGludDY0X3Qga1RpbWVvdXRXYWl0Rm9ySW5wdXRVcyA9IDUwMDA7IC8vIDUgbWlsbGlzZWNvbmRzCitjb25zdCBpbnQga1RpbWVvdXRNYXhSZXRyaWVzID0gMjA7CiAKIC8vc3RhdGljCiBzcDxTaW1wbGVEZWNvZGluZ1NvdXJjZT4gU2ltcGxlRGVjb2RpbmdTb3VyY2U6OkNyZWF0ZSgKQEAgLTI0Miw3ICsyNDMsNyBAQAogICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICB9CiAKLSAgICBmb3IgKGludCByZXRyaWVzID0gMDsgKytyZXRyaWVzOyApIHsKKyAgICBmb3IgKGludCByZXRyaWVzID0gMDsgcmV0cmllcyA8IGtUaW1lb3V0TWF4UmV0cmllczsgKytyZXRyaWVzKSB7CiAgICAgICAgIC8vIElmIHdlIGZpbGwgYWxsIGF2YWlsYWJsZSBpbnB1dCBidWZmZXJzLCB3ZSBzaG91bGQgZXhwZWN0IHRoYXQKICAgICAgICAgLy8gdGhlIGNvZGVjIHByb2R1Y2VzIGF0IGxlYXN0IG9uZSBvdXRwdXQgYnVmZmVyLiBBbHNvLCB0aGUgY29kZWMKICAgICAgICAgLy8gc2hvdWxkIHByb2R1Y2UgYW4gb3V0cHV0IGJ1ZmZlciBpbiBhdCBtb3N0IDEgc2Vjb25kcy4gUmV0cnkgYQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwCmluZGV4IDE3MTg3YTguLjc0YjczNDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5oPgogCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KQEAgLTM0LDI1ICszNSwxNiBAQAogCiBTdGFnZWZyaWdodE1lZGlhU2Nhbm5lcjo6flN0YWdlZnJpZ2h0TWVkaWFTY2FubmVyKCkge30KIAotc3RhdGljIGJvb2wgRmlsZUhhc0FjY2VwdGFibGVFeHRlbnNpb24oY29uc3QgY2hhciAqZXh0ZW5zaW9uKSB7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmtWYWxpZEV4dGVuc2lvbnNbXSA9IHsKLSAgICAgICAgIi5tcDMiLCAiLm1wNCIsICIubTRhIiwgIi4zZ3AiLCAiLjNncHAiLCAiLjNnMiIsICIuM2dwcDIiLAotICAgICAgICAiLm1wZWciLCAiLm9nZyIsICIubWlkIiwgIi5zbWYiLCAiLmlteSIsICIud21hIiwgIi5hYWMiLAotICAgICAgICAiLndhdiIsICIuYW1yIiwgIi5taWRpIiwgIi54bWYiLCAiLnJ0dHRsIiwgIi5ydHgiLCAiLm90YSIsCi0gICAgICAgICIubWt2IiwgIi5ta2EiLCAiLndlYm0iLCAiLnRzIiwgIi5mbCIsICIuZmxhYyIsICIubXhtZiIsCi0gICAgICAgICIuYXZpIiwgIi5tcGVnIiwgIi5tcGciLCAiLmF3YiIsICIubXBnYSIsICIubW92IiwKLSAgICAgICAgIi5tNHYiLCAiLm9nYSIsICIubTRyIgotICAgIH07Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTnVtVmFsaWRFeHRlbnNpb25zID0KLSAgICAgICAgc2l6ZW9mKGtWYWxpZEV4dGVuc2lvbnMpIC8gc2l6ZW9mKGtWYWxpZEV4dGVuc2lvbnNbMF0pOworc3RhdGljIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gZ1N1cHBvcnRlZEV4dGVuc2lvbnM7CiAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1WYWxpZEV4dGVuc2lvbnM7ICsraSkgewotICAgICAgICBpZiAoIXN0cmNhc2VjbXAoZXh0ZW5zaW9uLCBrVmFsaWRFeHRlbnNpb25zW2ldKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KK3N0YXRpYyBib29sIEZpbGVIYXNBY2NlcHRhYmxlRXh0ZW5zaW9uKGNvbnN0IGNoYXIgKmV4dGVuc2lvbikgeworCisgICAgaWYgKGdTdXBwb3J0ZWRFeHRlbnNpb25zLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gZ2V0IHRoZSBsaXN0IGZyb20gdGhlIHNlcnZpY2UKKyAgICAgICAgZ1N1cHBvcnRlZEV4dGVuc2lvbnMgPSBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OmdldFN1cHBvcnRlZFR5cGVzKCk7CiAgICAgfQogCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiAgZ1N1cHBvcnRlZEV4dGVuc2lvbnMuY291bnQoc3RkOjpzdHJpbmcoZXh0ZW5zaW9uICsgMSkpICE9IDA7CiB9CiAKIE1lZGlhU2NhblJlc3VsdCBTdGFnZWZyaWdodE1lZGlhU2Nhbm5lcjo6cHJvY2Vzc0ZpbGUoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCmluZGV4IDg0YTY0MWYuLmYzNGQ1NGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgpAQCAtMjc1LDEyICsyNzYsNiBAQAogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAKLSAgICBpbnQzMl90IGRybSA9IDA7Ci0gICAgaWYgKGZpbGVNZXRhLT5maW5kSW50MzIoa0tleUlzRFJNLCAmZHJtKSAmJiBkcm0gIT0gMCkgewotICAgICAgICBBTE9HRSgiZnJhbWUgZ3JhYiBub3QgYWxsb3dlZC4iKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9VTktOT1dOOwotICAgIH0KLQogICAgIHNpemVfdCBuID0gbUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKICAgICBzaXplX3QgaTsKICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CkBAIC0zNDIsMTUgKzMzNywxNSBAQAogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXRjaGluZ0NvZGVjcy5zaXplKCk7ICsraSkgewogICAgICAgICBjb25zdCBBU3RyaW5nICZjb21wb25lbnROYW1lID0gbWF0Y2hpbmdDb2RlY3NbaV07Ci0gICAgICAgIFZpZGVvRnJhbWVEZWNvZGVyIGRlY29kZXIoY29tcG9uZW50TmFtZSwgdHJhY2tNZXRhLCBzb3VyY2UpOwotICAgICAgICBpZiAoZGVjb2Rlci5pbml0KHRpbWVVcywgbnVtRnJhbWVzLCBvcHRpb24sIGNvbG9yRm9ybWF0KSA9PSBPSykgeworICAgICAgICBzcDxWaWRlb0ZyYW1lRGVjb2Rlcj4gZGVjb2RlciA9IG5ldyBWaWRlb0ZyYW1lRGVjb2Rlcihjb21wb25lbnROYW1lLCB0cmFja01ldGEsIHNvdXJjZSk7CisgICAgICAgIGlmIChkZWNvZGVyLT5pbml0KHRpbWVVcywgbnVtRnJhbWVzLCBvcHRpb24sIGNvbG9yRm9ybWF0KSA9PSBPSykgewogICAgICAgICAgICAgaWYgKG91dEZyYW1lICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqb3V0RnJhbWUgPSBkZWNvZGVyLmV4dHJhY3RGcmFtZSgpOworICAgICAgICAgICAgICAgICpvdXRGcmFtZSA9IGRlY29kZXItPmV4dHJhY3RGcmFtZSgpOwogICAgICAgICAgICAgICAgIGlmICgqb3V0RnJhbWUgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChvdXRGcmFtZXMgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGRlY29kZXIuZXh0cmFjdEZyYW1lcyhvdXRGcmFtZXMpOworICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGRlY29kZXItPmV4dHJhY3RGcmFtZXMob3V0RnJhbWVzKTsKICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodFBsdWdpbkxvYWRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodFBsdWdpbkxvYWRlci5jcHAKaW5kZXggNTE5ZTg3MC4uYjkwNjQ5YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmNwcApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBMT0dfVEFHICJTdGFnZWZyaWdodFBsdWdpbkxvYWRlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8ZGxmY24uaD4KIAogI2luY2x1ZGUgIlN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmgiCkBAIC0yNyw5ICsyOCwxNyBAQAogLyogc3RhdGljICovIE11dGV4IFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyOjpzTXV0ZXg7CiAvKiBzdGF0aWMgKi8gc3RkOjp1bmlxdWVfcHRyPFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyPiBTdGFnZWZyaWdodFBsdWdpbkxvYWRlcjo6c0luc3RhbmNlOwogCi1TdGFnZWZyaWdodFBsdWdpbkxvYWRlcjo6U3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIoY29uc3QgY2hhciAqbGliUGF0aCkKLSAgICA6IG1DcmVhdGVDb2RlYyhudWxscHRyKSwKLSAgICAgIG1DcmVhdGVCdWlsZGVyKG51bGxwdHIpIHsKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworY29uc3RleHByIGNvbnN0IGNoYXIga0NDb2RlY1BsdWdpblBhdGhbXSA9ICJsaWJzZnBsdWdpbl9jY29kZWMuc28iOworCit9ICAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCitTdGFnZWZyaWdodFBsdWdpbkxvYWRlcjo6U3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIoY29uc3QgY2hhciAqbGliUGF0aCkgeworICAgIGlmIChhbmRyb2lkOjpiYXNlOjpHZXRJbnRQcm9wZXJ0eSgiZGVidWcubWVkaWEuY29kZWMyIiwgMCkgPT0gMCkgeworICAgICAgICBBTE9HRCgiQ0NvZGVjIGlzIGRpc2FibGVkLiIpOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIG1MaWJIYW5kbGUgPSBkbG9wZW4obGliUGF0aCwgUlRMRF9OT1cgfCBSVExEX05PREVMRVRFKTsKICAgICBpZiAobUxpYkhhbmRsZSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gbG9hZCBsaWJyYXJ5OiAlcyAoJXMpIiwgbGliUGF0aCwgZGxlcnJvcigpKTsKQEAgLTQ2LDcgKzU1LDcgQEAKICAgICB9CiAgICAgbUNyZWF0ZUlucHV0U3VyZmFjZSA9IChDb2RlY0Jhc2U6OkNyZWF0ZUlucHV0U3VyZmFjZUZ1bmMpZGxzeW0oCiAgICAgICAgICAgICBtTGliSGFuZGxlLCAiQ3JlYXRlSW5wdXRTdXJmYWNlIik7Ci0gICAgaWYgKG1DcmVhdGVCdWlsZGVyID09IG51bGxwdHIpIHsKKyAgICBpZiAobUNyZWF0ZUlucHV0U3VyZmFjZSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gZmluZCBzeW1ib2w6IENyZWF0ZUlucHV0U3VyZmFjZSAoJXMpIiwgZGxlcnJvcigpKTsKICAgICB9CiB9CkBAIC04Nyw3ICs5Niw3IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHNNdXRleCk7CiAgICAgaWYgKCFzSW5zdGFuY2UpIHsKICAgICAgICAgQUxPR1YoIkxvYWRpbmcgbGlicmFyeSIpOwotICAgICAgICBzSW5zdGFuY2UucmVzZXQobmV3IFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyKCJsaWJzdGFnZWZyaWdodF9jY29kZWMuc28iKSk7CisgICAgICAgIHNJbnN0YW5jZS5yZXNldChuZXcgU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIoa0NDb2RlY1BsdWdpblBhdGgpKTsKICAgICB9CiAgICAgcmV0dXJuIHNJbnN0YW5jZTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodFBsdWdpbkxvYWRlci5oCmluZGV4IDk5OWQzMGMuLjc4ZWZmYmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIuaApAQCAtNDAsMTAgKzQwLDEwIEBACiAgICAgc3RhdGljIE11dGV4IHNNdXRleDsKICAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyPiBzSW5zdGFuY2U7CiAKLSAgICB2b2lkICptTGliSGFuZGxlOwotICAgIENvZGVjQmFzZTo6Q3JlYXRlQ29kZWNGdW5jIG1DcmVhdGVDb2RlYzsKLSAgICBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlOjpDcmVhdGVCdWlsZGVyRnVuYyBtQ3JlYXRlQnVpbGRlcjsKLSAgICBDb2RlY0Jhc2U6OkNyZWF0ZUlucHV0U3VyZmFjZUZ1bmMgbUNyZWF0ZUlucHV0U3VyZmFjZTsKKyAgICB2b2lkICptTGliSGFuZGxle251bGxwdHJ9OworICAgIENvZGVjQmFzZTo6Q3JlYXRlQ29kZWNGdW5jIG1DcmVhdGVDb2RlY3tudWxscHRyfTsKKyAgICBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlOjpDcmVhdGVCdWlsZGVyRnVuYyBtQ3JlYXRlQnVpbGRlcntudWxscHRyfTsKKyAgICBDb2RlY0Jhc2U6OkNyZWF0ZUlucHV0U3VyZmFjZUZ1bmMgbUNyZWF0ZUlucHV0U3VyZmFjZXtudWxscHRyfTsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9URVNUX01BUFBJTkcgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY4MThlYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDEyIEBACit7CisgICJwb3N0c3VibWl0IjogWworICAgIHsKKyAgICAgICJuYW1lIjogIkN0c01lZGlhVGVzdENhc2VzIiwKKyAgICAgICJvcHRpb25zIjogWworICAgICAgICB7CisgICAgICAgICAgImluY2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVxdWlyZXNEZXZpY2UiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9CisgIF0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcAppbmRleCBjNzU3OWJjLi4xNjNjZDA1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCkBAIC03NCw3ICs3NCw3IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlQ29sb3JBc3BlY3RzKGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSwgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKK3N0YXRpYyB2b2lkIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZUNvbG9yQXNwZWN0cyhjb25zdCBNZXRhRGF0YUJhc2UgKm1ldGEsIHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgLy8gMCB2YWx1ZXMgYXJlIHVuc3BlY2lmaWVkCiAgICAgaW50MzJfdCByYW5nZSA9IDA7CiAgICAgaW50MzJfdCBwcmltYXJpZXMgPSAwOwpAQCAtMTE5LDcgKzExOSw4IEBACiAgICAgfQogCiAgICAgLy8gaWYgdXNlci9jb250YWluZXIgc3VwcGxpZWQgSERSIHN0YXRpYyBpbmZvIHdpdGhvdXQgdHJhbnNmZXIgc2V0LCBhc3N1bWUgdHJ1ZQotICAgIGlmIChmb3JtYXQtPmNvbnRhaW5zKCJoZHItc3RhdGljLWluZm8iKSAmJiAhZm9ybWF0LT5jb250YWlucygiY29sb3ItdHJhbnNmZXIiKSkgeworICAgIGlmICgoZm9ybWF0LT5jb250YWlucygiaGRyLXN0YXRpYy1pbmZvIikgfHwgZm9ybWF0LT5jb250YWlucygiaGRyMTAtcGx1cy1pbmZvIikpCisgICAgICAgICAgICAmJiAhZm9ybWF0LT5jb250YWlucygiY29sb3ItdHJhbnNmZXIiKSkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgLy8gb3RoZXJ3aXNlLCB2ZXJpZnkgdGhhdCBhbiBIRFIgdHJhbnNmZXIgZnVuY3Rpb24gaXMgc2V0CkBAIC01NjgsOCArNTY5LDE2MiBAQAogICAgIH0KIH0KIAorCitzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGNvbnN0IGNoYXIgKiwgdWludDMyX3Q+PiBzdHJpbmdNYXBwaW5ncyB7CisgICAgeworICAgICAgICB7ICJhbGJ1bSIsIGtLZXlBbGJ1bSB9LAorICAgICAgICB7ICJhbGJ1bWFydGlzdCIsIGtLZXlBbGJ1bUFydGlzdCB9LAorICAgICAgICB7ICJhcnRpc3QiLCBrS2V5QXJ0aXN0IH0sCisgICAgICAgIHsgImF1dGhvciIsIGtLZXlBdXRob3IgfSwKKyAgICAgICAgeyAiY2R0cmFja251bSIsIGtLZXlDRFRyYWNrTnVtYmVyIH0sCisgICAgICAgIHsgImNvbXBpbGF0aW9uIiwga0tleUNvbXBpbGF0aW9uIH0sCisgICAgICAgIHsgImNvbXBvc2VyIiwga0tleUNvbXBvc2VyIH0sCisgICAgICAgIHsgImRhdGUiLCBrS2V5RGF0ZSB9LAorICAgICAgICB7ICJkaXNjbnVtIiwga0tleURpc2NOdW1iZXIgfSwKKyAgICAgICAgeyAiZ2VucmUiLCBrS2V5R2VucmUgfSwKKyAgICAgICAgeyAibG9jYXRpb24iLCBrS2V5TG9jYXRpb24gfSwKKyAgICAgICAgeyAibHlyaWNpc3QiLCBrS2V5V3JpdGVyIH0sCisgICAgICAgIHsgInRpdGxlIiwga0tleVRpdGxlIH0sCisgICAgICAgIHsgInllYXIiLCBrS2V5WWVhciB9LAorICAgIH0KK307CisKK3N0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgY2hhciAqLCB1aW50MzJfdD4+IGZsb2F0TWFwcGluZ3MgeworICAgIHsKKyAgICAgICAgeyAiY2FwdHVyZS1yYXRlIiwga0tleUNhcHR1cmVGcmFtZXJhdGUgfSwKKyAgICB9Cit9OworCitzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGNvbnN0IGNoYXIgKiwgdWludDMyX3Q+PiBpbnQ2NE1hcHBpbmdzIHsKKyAgICB7CisgICAgICAgIHsgImV4aWYtb2Zmc2V0Iiwga0tleUV4aWZPZmZzZXQgfSwKKyAgICAgICAgeyAiZXhpZi1zaXplIiwga0tleUV4aWZTaXplIH0sCisgICAgICAgIHsgInRhcmdldC10aW1lIiwga0tleVRhcmdldFRpbWUgfSwKKyAgICAgICAgeyAidGh1bWJuYWlsLXRpbWUiLCBrS2V5VGh1bWJuYWlsVGltZSB9LAorICAgICAgICB7ICJ0aW1lVXMiLCBrS2V5VGltZSB9LAorICAgICAgICB7ICJkdXJhdGlvblVzIiwga0tleUR1cmF0aW9uIH0sCisgICAgfQorfTsKKworc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxjb25zdCBjaGFyICosIHVpbnQzMl90Pj4gaW50MzJNYXBwaW5ncyB7CisgICAgeworICAgICAgICB7ICJsb29wIiwga0tleUF1dG9Mb29wIH0sCisgICAgICAgIHsgInRpbWUtc2NhbGUiLCBrS2V5VGltZVNjYWxlIH0sCisgICAgICAgIHsgImNyeXB0by1tb2RlIiwga0tleUNyeXB0b01vZGUgfSwKKyAgICAgICAgeyAiY3J5cHRvLWRlZmF1bHQtaXYtc2l6ZSIsIGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplIH0sCisgICAgICAgIHsgImNyeXB0by1lbmNyeXB0ZWQtYnl0ZS1ibG9jayIsIGtLZXlFbmNyeXB0ZWRCeXRlQmxvY2sgfSwKKyAgICAgICAgeyAiY3J5cHRvLXNraXAtYnl0ZS1ibG9jayIsIGtLZXlTa2lwQnl0ZUJsb2NrIH0sCisgICAgICAgIHsgImZyYW1lLWNvdW50Iiwga0tleUZyYW1lQ291bnQgfSwKKyAgICAgICAgeyAibWF4LWJpdHJhdGUiLCBrS2V5TWF4Qml0UmF0ZSB9LAorICAgICAgICB7ICJwY20tYmlnLWVuZGlhbiIsIGtLZXlQY21CaWdFbmRpYW4gfSwKKyAgICAgICAgeyAidGVtcG9yYWwtbGF5ZXItY291bnQiLCBrS2V5VGVtcG9yYWxMYXllckNvdW50IH0sCisgICAgICAgIHsgInRlbXBvcmFsLWxheWVyLWlkIiwga0tleVRlbXBvcmFsTGF5ZXJJZCB9LAorICAgICAgICB7ICJ0aHVtYm5haWwtd2lkdGgiLCBrS2V5VGh1bWJuYWlsV2lkdGggfSwKKyAgICAgICAgeyAidGh1bWJuYWlsLWhlaWdodCIsIGtLZXlUaHVtYm5haWxIZWlnaHQgfSwKKyAgICAgICAgeyAidmFsaWQtc2FtcGxlcyIsIGtLZXlWYWxpZFNhbXBsZXMgfSwKKyAgICB9Cit9OworCitzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGNvbnN0IGNoYXIgKiwgdWludDMyX3Q+PiBidWZmZXJNYXBwaW5ncyB7CisgICAgeworICAgICAgICB7ICJhbGJ1bWFydCIsIGtLZXlBbGJ1bUFydCB9LAorICAgICAgICB7ICJhdWRpby1wcmVzZW50YXRpb24taW5mbyIsIGtLZXlBdWRpb1ByZXNlbnRhdGlvbkluZm8gfSwKKyAgICAgICAgeyAicHNzaCIsIGtLZXlQc3NoIH0sCisgICAgICAgIHsgImNyeXB0by1pdiIsIGtLZXlDcnlwdG9JViB9LAorICAgICAgICB7ICJjcnlwdG8ta2V5Iiwga0tleUNyeXB0b0tleSB9LAorICAgICAgICB7ICJjcnlwdG8tZW5jcnlwdGVkLXNpemVzIiwga0tleUVuY3J5cHRlZFNpemVzIH0sCisgICAgICAgIHsgImNyeXB0by1wbGFpbi1zaXplcyIsIGtLZXlQbGFpblNpemVzIH0sCisgICAgICAgIHsgImljYy1wcm9maWxlIiwga0tleUljY1Byb2ZpbGUgfSwKKyAgICAgICAgeyAic2VpIiwga0tleVNFSSB9LAorICAgICAgICB7ICJ0ZXh0LWZvcm1hdC1kYXRhIiwga0tleVRleHRGb3JtYXREYXRhIH0sCisgICAgfQorfTsKKwordm9pZCBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGFGcm9tTWFwcGluZ3MoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIHNwPE1ldGFEYXRhPiAmbWV0YSkgeworICAgIGZvciAoYXV0byBlbGVtIDogc3RyaW5nTWFwcGluZ3MpIHsKKyAgICAgICAgQVN0cmluZyB2YWx1ZTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZFN0cmluZyhlbGVtLmZpcnN0LCAmdmFsdWUpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXRDU3RyaW5nKGVsZW0uc2Vjb25kLCB2YWx1ZS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byBlbGVtIDogZmxvYXRNYXBwaW5ncykgeworICAgICAgICBmbG9hdCB2YWx1ZTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEZsb2F0KGVsZW0uZmlyc3QsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldEZsb2F0KGVsZW0uc2Vjb25kLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGF1dG8gZWxlbSA6IGludDY0TWFwcGluZ3MpIHsKKyAgICAgICAgaW50NjRfdCB2YWx1ZTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDY0KGVsZW0uZmlyc3QsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDY0KGVsZW0uc2Vjb25kLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGF1dG8gZWxlbSA6IGludDMyTWFwcGluZ3MpIHsKKyAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKGVsZW0uZmlyc3QsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGVsZW0uc2Vjb25kLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGF1dG8gZWxlbSA6IGJ1ZmZlck1hcHBpbmdzKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IHZhbHVlOworICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKGVsZW0uZmlyc3QsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoZWxlbS5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhQmFzZTo6VHlwZTo6VFlQRV9OT05FLCB2YWx1ZS0+ZGF0YSgpLCB2YWx1ZS0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2VGcm9tTWFwcGluZ3MoY29uc3QgTWV0YURhdGFCYXNlICptZXRhLCBzcDxBTWVzc2FnZT4gZm9ybWF0KSB7CisgICAgZm9yIChhdXRvIGVsZW0gOiBzdHJpbmdNYXBwaW5ncykgeworICAgICAgICBjb25zdCBjaGFyICp2YWx1ZTsKKyAgICAgICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGVsZW0uc2Vjb25kLCAmdmFsdWUpKSB7CisgICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZyhlbGVtLmZpcnN0LCB2YWx1ZSwgc3RybGVuKHZhbHVlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGF1dG8gZWxlbSA6IGZsb2F0TWFwcGluZ3MpIHsKKyAgICAgICAgZmxvYXQgdmFsdWU7CisgICAgICAgIGlmIChtZXRhLT5maW5kRmxvYXQoZWxlbS5zZWNvbmQsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0RmxvYXQoZWxlbS5maXJzdCwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIGVsZW0gOiBpbnQ2NE1hcHBpbmdzKSB7CisgICAgICAgIGludDY0X3QgdmFsdWU7CisgICAgICAgIGlmIChtZXRhLT5maW5kSW50NjQoZWxlbS5zZWNvbmQsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50NjQoZWxlbS5maXJzdCwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIGVsZW0gOiBpbnQzMk1hcHBpbmdzKSB7CisgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoZWxlbS5zZWNvbmQsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoZWxlbS5maXJzdCwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIGVsZW0gOiBidWZmZXJNYXBwaW5ncykgeworICAgICAgICB1aW50MzJfdCB0eXBlOworICAgICAgICBjb25zdCB2b2lkKiBkYXRhOworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgaWYgKG1ldGEtPmZpbmREYXRhKGVsZW0uc2Vjb25kLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KGRhdGEsIHNpemUpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRCdWZmZXIoZWxlbS5maXJzdCwgYnVmKTsKKyAgICAgICAgfQorICAgIH0KK30KKwogc3RhdHVzX3QgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKAogICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsIHNwPEFNZXNzYWdlPiAqZm9ybWF0KSB7CisgICAgcmV0dXJuIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShtZXRhLmdldCgpLCBmb3JtYXQpOworfQorCitzdGF0dXNfdCBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UoCisgICAgICAgIGNvbnN0IE1ldGFEYXRhQmFzZSAqbWV0YSwgc3A8QU1lc3NhZ2U+ICpmb3JtYXQpIHsKIAogICAgIGZvcm1hdC0+Y2xlYXIoKTsKIApAQCAtNTg2LDYgKzc0MSw4IEBACiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZTsKICAgICBtc2ctPnNldFN0cmluZygibWltZSIsIG1pbWUpOwogCisgICAgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlRnJvbU1hcHBpbmdzKG1ldGEsIG1zZyk7CisKICAgICB1aW50MzJfdCB0eXBlOwogICAgIGNvbnN0IHZvaWQgKmRhdGE7CiAgICAgc2l6ZV90IHNpemU7CkBAIC01OTksNiArNzU2LDE2IEBACiAgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7CiAgICAgfQogCisgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlDQVByaXZhdGVEYXRhLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgQUJ1ZmZlcihzaXplKTsKKyAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBOVUxMIHx8IGJ1ZmZlci0+YmFzZSgpID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKworICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY2EtcHJpdmF0ZS1kYXRhIiwgYnVmZmVyKTsKKyAgICAgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpLCBkYXRhLCBzaXplKTsKKyAgICB9CisKICAgICBpbnQzMl90IHN5c3RlbUlkOwogICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUNBU3lzdGVtSUQsICZzeXN0ZW1JZCkpIHsKICAgICAgICAgbXNnLT5zZXRJbnQzMigiY2Etc3lzdGVtLWlkIiwgc3lzdGVtSWQpOwpAQCAtNzEyLDYgKzg3OSwxNiBAQAogICAgICAgICAgICAgQ29sb3JVdGlsczo6c2V0SERSU3RhdGljSW5mb0ludG9Gb3JtYXQoKihIRFJTdGF0aWNJbmZvKilkYXRhLCBtc2cpOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlIZHIxMFBsdXNJbmZvLCAmdHlwZSwgJmRhdGEsICZzaXplKQorICAgICAgICAgICAgICAgICYmIHNpemUgPiAwKSB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgQUJ1ZmZlcihzaXplKTsKKyAgICAgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gTlVMTCB8fCBidWZmZXItPmJhc2UoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICBtc2ctPnNldEJ1ZmZlcigiaGRyMTAtcGx1cy1pbmZvIiwgYnVmZmVyKTsKKyAgICAgICAgfQorCiAgICAgICAgIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZUNvbG9yQXNwZWN0cyhtZXRhLCBtc2cpOwogICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKCJhdWRpby8iLCBtaW1lLCA2KSkgewogICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlOwpAQCAtNzIzLDYgKzkwMCwxMSBAQAogICAgICAgICBtc2ctPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgbnVtQ2hhbm5lbHMpOwogICAgICAgICBtc2ctPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIHNhbXBsZVJhdGUpOwogCisgICAgICAgIGludDMyX3QgYml0c1BlclNhbXBsZTsKKyAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5Qml0c1BlclNhbXBsZSwgJmJpdHNQZXJTYW1wbGUpKSB7CisgICAgICAgICAgICBtc2ctPnNldEludDMyKCJiaXRzLXBlci1zYW1wbGUiLCBiaXRzUGVyU2FtcGxlKTsKKyAgICAgICAgfQorCiAgICAgICAgIGludDMyX3QgY2hhbm5lbE1hc2s7CiAgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxNYXNrLCAmY2hhbm5lbE1hc2spKSB7CiAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJjaGFubmVsLW1hc2siLCBjaGFubmVsTWFzayk7CkBAIC0xMDQ4LDcgKzEyMzAsNyBAQAogICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoIm1heC1iaXRyYXRlIiwgKGludDMyX3QpbWF4Qml0cmF0ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1ldGEtPmZpbmREYXRhKGtUeXBlRDI2MywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICB9IGVsc2UgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlEMjYzLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewogICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CiAgICAgICAgIHBhcnNlSDI2M1Byb2ZpbGVMZXZlbEZyb21EMjYzKHB0ciwgc2l6ZSwgbXNnKTsKICAgICB9IGVsc2UgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlWb3JiaXNJbmZvLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewpAQCAtMTE0OCwxMyArMTMzMCw2IEBACiAgICAgICAgIG1zZy0+c2V0QnVmZmVyKCJjc2QtMCIsIGJ1ZmZlcik7CiAgICAgfQogCi0gICAgLy8gVE9ETyBleHBvc2UgImNyeXB0by1rZXkiL2tLZXlDcnlwdG9LZXkgdGhyb3VnaCBwdWJsaWMgYXBpCi0gICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlDcnlwdG9LZXksICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSBBQnVmZmVyKHNpemUpOwotICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY3J5cHRvLWtleSIsIGJ1ZmZlcik7Ci0gICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7Ci0gICAgfQotCiAgICAgKmZvcm1hdCA9IG1zZzsKIAogICAgIHJldHVybiBPSzsKQEAgLTEzNTMsNiArMTUyOCwyMSBAQAogICAgICAgICBBTE9HVygiZGlkIG5vdCBmaW5kIG1pbWUgdHlwZSIpOwogICAgIH0KIAorICAgIGNvbnZlcnRNZXNzYWdlVG9NZXRhRGF0YUZyb21NYXBwaW5ncyhtc2csIG1ldGEpOworCisgICAgaW50MzJfdCBzeXN0ZW1JZDsKKyAgICBpZiAobXNnLT5maW5kSW50MzIoImNhLXN5c3RlbS1pZCIsICZzeXN0ZW1JZCkpIHsKKyAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNBU3lzdGVtSUQsIHN5c3RlbUlkKTsKKworICAgICAgICBzcDxBQnVmZmVyPiBjYVNlc3Npb25JZCwgY2FQdnREYXRhOworICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKCJjYS1zZXNzaW9uLWlkIiwgJmNhU2Vzc2lvbklkKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5Q0FTZXNzaW9uSUQsIDAsIGNhU2Vzc2lvbklkLT5kYXRhKCksIGNhU2Vzc2lvbklkLT5zaXplKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoImNhLXByaXZhdGUtZGF0YSIsICZjYVB2dERhdGEpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlDQVByaXZhdGVEYXRhLCAwLCBjYVB2dERhdGEtPmRhdGEoKSwgY2FQdnREYXRhLT5zaXplKCkpOworICAgICAgICB9CisgICAgfQorCiAgICAgaW50NjRfdCBkdXJhdGlvblVzOwogICAgIGlmIChtc2ctPmZpbmRJbnQ2NCgiZHVyYXRpb25VcyIsICZkdXJhdGlvblVzKSkgewogICAgICAgICBtZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOwpAQCAtMTM4NCw3ICsxNTc0LDcgQEAKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOwogICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dXKCJkaWQgbm90IGZpbmQgd2lkdGggYW5kL29yIGhlaWdodCIpOworICAgICAgICAgICAgQUxPR1YoImRpZCBub3QgZmluZCB3aWR0aCBhbmQvb3IgaGVpZ2h0Iik7CiAgICAgICAgIH0KIAogICAgICAgICBpbnQzMl90IHNhcldpZHRoLCBzYXJIZWlnaHQ7CkBAIC0xNDQ3LDYgKzE2MzcsMTIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIHNwPEFCdWZmZXI+IGhkcjEwUGx1c0luZm87CisgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoImhkcjEwLXBsdXMtaW5mbyIsICZoZHIxMFBsdXNJbmZvKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5SGRyMTBQbHVzSW5mbywgMCwKKyAgICAgICAgICAgICAgICAgICAgaGRyMTBQbHVzSW5mby0+ZGF0YSgpLCBoZHIxMFBsdXNJbmZvLT5zaXplKCkpOworICAgICAgICB9CisKICAgICAgICAgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhQ29sb3JBc3BlY3RzKG1zZywgbWV0YSk7CiAKICAgICAgICAgQVN0cmluZyB0c1NjaGVtYTsKQEAgLTE0NzEsNiArMTY2NywxMCBAQAogICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoInNhbXBsZS1yYXRlIiwgJnNhbXBsZVJhdGUpKSB7CiAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CiAgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBiaXRzUGVyU2FtcGxlOworICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImJpdHMtcGVyLXNhbXBsZSIsICZiaXRzUGVyU2FtcGxlKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUJpdHNQZXJTYW1wbGUsIGJpdHNQZXJTYW1wbGUpOworICAgICAgICB9CiAgICAgICAgIGludDMyX3QgY2hhbm5lbE1hc2s7CiAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiY2hhbm5lbC1tYXNrIiwgJmNoYW5uZWxNYXNrKSkgewogICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxNYXNrLCBjaGFubmVsTWFzayk7CkBAIC0xNTI5LDE5ICsxNzI5LDE5IEBACiAgICAgICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKCJjc2QtMSIsICZjc2QxKSkgewogICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNoYXI+IGF2Y2MoY3NkMHNpemUgKyBjc2QxLT5zaXplKCkgKyAxMDI0KTsKICAgICAgICAgICAgICAgICBzaXplX3Qgb3V0c2l6ZSA9IHJlYXNzZW1ibGVBVkNDKGNzZDAsIGNzZDEsIGF2Y2MuZGF0YSgpKTsKLSAgICAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlBVkNDLCBrS2V5QVZDQywgYXZjYy5kYXRhKCksIG91dHNpemUpOworICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUFWQ0MsIGtUeXBlQVZDQywgYXZjYy5kYXRhKCksIG91dHNpemUpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDIHx8IG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpIHsKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNoYXI+IGVzZHMoY3NkMHNpemUgKyAzMSk7CiAgICAgICAgICAgICAvLyBUaGUgd3JpdHRlbiBFU0RTIGlzIGFjdHVhbGx5IGZvciBhbiBhdWRpbyBzdHJlYW0sIGJ1dCBpdCdzIGVub3VnaAogICAgICAgICAgICAgLy8gZm9yIHRyYW5zcG9ydGluZyB0aGUgQ1NEIHRvIG11eGVycy4KICAgICAgICAgICAgIHJlYXNzZW1ibGVFU0RTKGNzZDAsIGVzZHMuZGF0YSgpKTsKLSAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUVTRFMsIGtLZXlFU0RTLCBlc2RzLmRhdGEoKSwgZXNkcy5zaXplKCkpOworICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5RVNEUywga1R5cGVFU0RTLCBlc2RzLmRhdGEoKSwgZXNkcy5zaXplKCkpOwogICAgICAgICB9IGVsc2UgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQyB8fAogICAgICAgICAgICAgICAgICAgIG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDKSB7CiAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBodmNjKGNzZDBzaXplICsgMTAyNCk7CiAgICAgICAgICAgICBzaXplX3Qgb3V0c2l6ZSA9IHJlYXNzZW1ibGVIVkNDKGNzZDAsIGh2Y2MuZGF0YSgpLCBodmNjLnNpemUoKSwgNCk7Ci0gICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlIVkNDLCBrS2V5SFZDQywgaHZjYy5kYXRhKCksIG91dHNpemUpOworICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5SFZDQywga1R5cGVIVkNDLCBodmNjLmRhdGEoKSwgb3V0c2l6ZSk7CiAgICAgICAgIH0gZWxzZSBpZiAobWltZSA9PSBNRURJQV9NSU1FVFlQRV9WSURFT19WUDkpIHsKICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleVZwOUNvZGVjUHJpdmF0ZSwgMCwgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOwogICAgICAgICB9IGVsc2UgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUykgewpAQCAtMTU2MCwxMSArMTc2MCwxNyBAQAogICAgICAgICB9IGVsc2UgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfQVVESU9fQUxBQykgewogICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5QWxhY01hZ2ljQ29va2llLCAwLCBjc2QwLT5kYXRhKCksIGNzZDAtPnNpemUoKSk7CiAgICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQzMl90IHRpbWVTY2FsZTsKLSAgICBpZiAobXNnLT5maW5kSW50MzIoInRpbWUtc2NhbGUiLCAmdGltZVNjYWxlKSkgewotICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VGltZVNjYWxlLCB0aW1lU2NhbGUpOworICAgIH0gZWxzZSBpZiAobWltZSA9PSBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMgJiYgbXNnLT5maW5kQnVmZmVyKCJjc2QtYXZjIiwgJmNzZDApKSB7CisgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUFWQ0MsIGtUeXBlQVZDQywgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOworICAgIH0gZWxzZSBpZiAoKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQyB8fCBtaW1lID09IE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQykKKyAgICAgICAgICAgICYmIG1zZy0+ZmluZEJ1ZmZlcigiY3NkLWhldmMiLCAmY3NkMCkpIHsKKyAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5SFZDQywga1R5cGVIVkNDLCBjc2QwLT5kYXRhKCksIGNzZDAtPnNpemUoKSk7CisgICAgfSBlbHNlIGlmIChtc2ctPmZpbmRCdWZmZXIoImVzZHMiLCAmY3NkMCkpIHsKKyAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5RVNEUywga1R5cGVFU0RTLCBjc2QwLT5kYXRhKCksIGNzZDAtPnNpemUoKSk7CisgICAgfSBlbHNlIGlmIChtc2ctPmZpbmRCdWZmZXIoIm1wZWcyLXN0cmVhbS1oZWFkZXIiLCAmY3NkMCkpIHsKKyAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5U3RyZWFtSGVhZGVyLCAnbWRhdCcsIGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpKTsKKyAgICB9IGVsc2UgaWYgKG1zZy0+ZmluZEJ1ZmZlcigiZDI2MyIsICZjc2QwKSkgeworICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlEMjYzLCBrVHlwZUQyNjMsIGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpKTsKICAgICB9CiAKICAgICAvLyBYWFggVE9ETyBhZGQgd2hhdGV2ZXIgb3RoZXIga2V5cyB0aGVyZSBhcmUKQEAgLTE2NDAsNiArMTg0Niw5IEBACiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMsICAgICAgQVVESU9fRk9STUFUX1ZPUkJJUyB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUywgICAgICAgIEFVRElPX0ZPUk1BVF9PUFVTfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FDMywgICAgICAgICBBVURJT19GT1JNQVRfQUMzfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0VBQzMsICAgICAgICBBVURJT19GT1JNQVRfRV9BQzN9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDM19KT0MsICAgIEFVRElPX0ZPUk1BVF9FX0FDM19KT0N9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0LCAgICAgICAgIEFVRElPX0ZPUk1BVF9BQzR9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQywgICAgICAgIEFVRElPX0ZPUk1BVF9GTEFDfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FMQUMsICAgICAgICBBVURJT19GT1JNQVRfQUxBQyB9LAogICAgIHsgMCwgQVVESU9fRk9STUFUX0lOVkFMSUQgfQpAQCAtMTY5Myw0MyArMTkwMiw0MyBAQAogICAgIHJldHVybjsKIH0KIAotYm9vbCBjYW5PZmZsb2FkU3RyZWFtKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSwgYm9vbCBoYXNWaWRlbywKLSAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU3RyZWFtaW5nLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpCitzdGF0dXNfdCBnZXRBdWRpb09mZmxvYWRJbmZvKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSwgYm9vbCBoYXNWaWRlbywKKyAgICAgICAgYm9vbCBpc1N0cmVhbWluZywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLCBhdWRpb19vZmZsb2FkX2luZm9fdCAqaW5mbykKIHsKICAgICBjb25zdCBjaGFyICptaW1lOwogICAgIGlmIChtZXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CiAKLSAgICBhdWRpb19vZmZsb2FkX2luZm9fdCBpbmZvID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKKyAgICAoKmluZm8pID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKIAotICAgIGluZm8uZm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7Ci0gICAgaWYgKG1hcE1pbWVUb0F1ZGlvRm9ybWF0KGluZm8uZm9ybWF0LCBtaW1lKSAhPSBPSykgeworICAgIGluZm8tPmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOworICAgIGlmIChtYXBNaW1lVG9BdWRpb0Zvcm1hdChpbmZvLT5mb3JtYXQsIG1pbWUpICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIgQ291bGRuJ3QgbWFwIG1pbWUgdHlwZSBcIiVzXCIgdG8gYSB2YWxpZCBBdWRpb1N5c3RlbTo6YXVkaW9fZm9ybWF0ICEiLCBtaW1lKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJNaW1lIHR5cGUgXCIlc1wiIG1hcHBlZCB0byBhdWRpb19mb3JtYXQgJWQiLCBtaW1lLCBpbmZvLmZvcm1hdCk7CisgICAgICAgIEFMT0dWKCJNaW1lIHR5cGUgXCIlc1wiIG1hcHBlZCB0byBhdWRpb19mb3JtYXQgJWQiLCBtaW1lLCBpbmZvLT5mb3JtYXQpOwogICAgIH0KIAotICAgIGlmIChBVURJT19GT1JNQVRfSU5WQUxJRCA9PSBpbmZvLmZvcm1hdCkgeworICAgIGlmIChBVURJT19GT1JNQVRfSU5WQUxJRCA9PSBpbmZvLT5mb3JtYXQpIHsKICAgICAgICAgLy8gY2FuJ3Qgb2ZmbG9hZCBpZiB3ZSBkb24ndCBrbm93IHdoYXQgdGhlIHNvdXJjZSBmb3JtYXQgaXMKICAgICAgICAgQUxPR0UoIm1pbWUgdHlwZSBcIiVzXCIgbm90IGEga25vd24gYXVkaW8gZm9ybWF0IiwgbWltZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICAvLyBSZWRlZmluZSBhYWMgZm9ybWF0IGFjY29yZGluZyB0byBpdHMgcHJvZmlsZQogICAgIC8vIE9mZmxvYWRpbmcgZGVwZW5kcyBvbiBhdWRpbyBEU1AgY2FwYWJpbGl0aWVzLgogICAgIGludDMyX3QgYWFjYW90ID0gLTE7CiAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5QUFDQU9ULCAmYWFjYW90KSkgewotICAgICAgICBtYXBBQUNQcm9maWxlVG9BdWRpb0Zvcm1hdChpbmZvLmZvcm1hdCwoT01YX0FVRElPX0FBQ1BST0ZJTEVUWVBFKSBhYWNhb3QpOworICAgICAgICBtYXBBQUNQcm9maWxlVG9BdWRpb0Zvcm1hdChpbmZvLT5mb3JtYXQsKE9NWF9BVURJT19BQUNQUk9GSUxFVFlQRSkgYWFjYW90KTsKICAgICB9CiAKICAgICBpbnQzMl90IHNyYXRlID0gLTE7CiAgICAgaWYgKCFtZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzcmF0ZSkpIHsKICAgICAgICAgQUxPR1YoInRyYWNrIG9mIHR5cGUgJyVzJyBkb2VzIG5vdCBwdWJsaXNoIHNhbXBsZSByYXRlIiwgbWltZSk7CiAgICAgfQotICAgIGluZm8uc2FtcGxlX3JhdGUgPSBzcmF0ZTsKKyAgICBpbmZvLT5zYW1wbGVfcmF0ZSA9IHNyYXRlOwogCiAgICAgaW50MzJfdCBjbWFzayA9IDA7CiAgICAgaWYgKCFtZXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxNYXNrLCAmY21hc2spIHx8IGNtYXNrID09IENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUikgewpAQCAtMTc0MywyNSArMTk1MiwzNCBAQAogICAgICAgICAgICAgY21hc2sgPSBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQoY2hhbm5lbENvdW50KTsKICAgICAgICAgfQogICAgIH0KLSAgICBpbmZvLmNoYW5uZWxfbWFzayA9IGNtYXNrOworICAgIGluZm8tPmNoYW5uZWxfbWFzayA9IGNtYXNrOwogCiAgICAgaW50NjRfdCBkdXJhdGlvbiA9IDA7CiAgICAgaWYgKCFtZXRhLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb24pKSB7CiAgICAgICAgIEFMT0dWKCJ0cmFjayBvZiB0eXBlICclcycgZG9lcyBub3QgcHVibGlzaCBkdXJhdGlvbiIsIG1pbWUpOwogICAgIH0KLSAgICBpbmZvLmR1cmF0aW9uX3VzID0gZHVyYXRpb247CisgICAgaW5mby0+ZHVyYXRpb25fdXMgPSBkdXJhdGlvbjsKIAogICAgIGludDMyX3QgYnJhdGUgPSAtMTsKICAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJmJyYXRlKSkgewogICAgICAgICBBTE9HVigidHJhY2sgb2YgdHlwZSAnJXMnIGRvZXMgbm90IHB1Ymxpc2ggYml0cmF0ZSIsIG1pbWUpOwogICAgIH0KLSAgICBpbmZvLmJpdF9yYXRlID0gYnJhdGU7CisgICAgaW5mby0+Yml0X3JhdGUgPSBicmF0ZTsKIAogCi0gICAgaW5mby5zdHJlYW1fdHlwZSA9IHN0cmVhbVR5cGU7Ci0gICAgaW5mby5oYXNfdmlkZW8gPSBoYXNWaWRlbzsKLSAgICBpbmZvLmlzX3N0cmVhbWluZyA9IGlzU3RyZWFtaW5nOworICAgIGluZm8tPnN0cmVhbV90eXBlID0gc3RyZWFtVHlwZTsKKyAgICBpbmZvLT5oYXNfdmlkZW8gPSBoYXNWaWRlbzsKKyAgICBpbmZvLT5pc19zdHJlYW1pbmcgPSBpc1N0cmVhbWluZzsKKyAgICByZXR1cm4gT0s7Cit9CiAKK2Jvb2wgY2FuT2ZmbG9hZFN0cmVhbShjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEsIGJvb2wgaGFzVmlkZW8sCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1N0cmVhbWluZywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKQoreworICAgIGF1ZGlvX29mZmxvYWRfaW5mb190IGluZm8gPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOworICAgIGlmIChPSyAhPSBnZXRBdWRpb09mZmxvYWRJbmZvKG1ldGEsIGhhc1ZpZGVvLCBpc1N0cmVhbWluZywgc3RyZWFtVHlwZSwgJmluZm8pKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAgICAgLy8gQ2hlY2sgaWYgb2ZmbG9hZCBpcyBwb3NzaWJsZSBmb3IgZ2l2ZW4gZm9ybWF0LCBzdHJlYW0gdHlwZSwgc2FtcGxlIHJhdGUsCiAgICAgLy8gYml0IHJhdGUsIGR1cmF0aW9uLCB2aWRlbyBhbmQgc3RyZWFtaW5nCiAgICAgcmV0dXJuIEF1ZGlvU3lzdGVtOjppc09mZmxvYWRTdXBwb3J0ZWQoaW5mbyk7CkBAIC0xOTMxLDQgKzIxNDksMyBAQAogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIuY3BwCmluZGV4IDkwMjBmYzEuLjRlNWI1ZTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTksOCArMTksNyBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfVklERU8KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgotCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogCiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGd1aS9JU3VyZmFjZUNvbXBvc2VyLmg+CkBAIC0zMiwzMjEgKzMxLDE0IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RhdGljIGNvbnN0IG5zZWNzX3Qga05hbm9zSW4xcyA9IDEwMDAwMDAwMDA7Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci1zdGF0aWMgaW50IGNvbXBhcmUoY29uc3QgVCAqbGhzLCBjb25zdCBUICpyaHMpIHsKLSAgICBpZiAoKmxocyA8ICpyaHMpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0gZWxzZSBpZiAoKmxocyA+ICpyaHMpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLXN0YXRpYyBjb25zdCBzaXplX3Qga01pblNhbXBsZXNUb1N0YXJ0UHJpbWUgPSAzOwotc3RhdGljIGNvbnN0IHNpemVfdCBrTWluU2FtcGxlc1RvU3RvcFByaW1lID0gVmlkZW9GcmFtZVNjaGVkdWxlcjo6a0hpc3RvcnlTaXplOwotc3RhdGljIGNvbnN0IHNpemVfdCBrTWluU2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QgPSAzOwotc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4U2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QgPSBWaWRlb0ZyYW1lU2NoZWR1bGVyOjprSGlzdG9yeVNpemU7Ci0KLXN0YXRpYyBjb25zdCBzaXplX3Qga1ByZWNpc2lvbiA9IDEyOwotc3RhdGljIGNvbnN0IGludDY0X3Qga0Vycm9yVGhyZXNob2xkID0gKDEgPDwgKGtQcmVjaXNpb24gKiAyKSkgLyAxMDsKLXN0YXRpYyBjb25zdCBpbnQ2NF90IGtNdWx0aXBsZXNUaHJlc2hvbGREaXYgPSA0OyAgICAgICAgICAgIC8vIDI1JQotc3RhdGljIGNvbnN0IGludDY0X3Qga1JlRml0VGhyZXNob2xkRGl2ID0gMTAwOyAgICAgICAgICAgICAgLy8gMSUKLXN0YXRpYyBjb25zdCBuc2Vjc190IGtNYXhBbGxvd2VkRnJhbWVTa2lwID0ga05hbm9zSW4xczsgICAgIC8vIDEgc2VjCi1zdGF0aWMgY29uc3QgbnNlY3NfdCBrTWluUGVyaW9kID0ga05hbm9zSW4xcyAvIDEyMDsgICAgICAgICAvLyAxMjBIegotc3RhdGljIGNvbnN0IG5zZWNzX3Qga1JlZml0UmVmcmVzaFBlcmlvZCA9IDEwICoga05hbm9zSW4xczsgLy8gMTAgc2VjCi0KLVZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6UExMKCkKLSAgICA6IG1QZXJpb2QoLTEpLAotICAgICAgbVBoYXNlKDApLAotICAgICAgbVByaW1lZChmYWxzZSksCi0gICAgICBtU2FtcGxlc1VzZWRGb3JQcmltaW5nKDApLAotICAgICAgbUxhc3RUaW1lKC0xKSwKLSAgICAgIG1OdW1TYW1wbGVzKDApIHsKLX0KLQotdm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpQTEw6OnJlc2V0KGZsb2F0IGZwcykgewotICAgIC8vdGVzdCgpOwotCi0gICAgbVNhbXBsZXNVc2VkRm9yUHJpbWluZyA9IDA7Ci0gICAgbUxhc3RUaW1lID0gLTE7Ci0KLSAgICAvLyBzZXQgdXAgb3IgcmVzZXQgdmlkZW8gUExMCi0gICAgaWYgKGZwcyA8PSAwLmYpIHsKLSAgICAgICAgbVBlcmlvZCA9IC0xOwotICAgICAgICBtUHJpbWVkID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoInJlc2V0IGF0ICUuMWYgZnBzIiwgZnBzKTsKLSAgICAgICAgbVBlcmlvZCA9IChuc2Vjc190KSgxZTkgLyBmcHMgKyAwLjUpOwotICAgICAgICBtUHJpbWVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXN0YXJ0KCk7Ci19Ci0KLS8vIHJlc2V0IFBMTCBidXQga2VlcCBwcmV2aW91cyBwZXJpb2QgZXN0aW1hdGUKLXZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjpyZXN0YXJ0KCkgewotICAgIG1OdW1TYW1wbGVzID0gMDsKLSAgICBtUGhhc2UgPSAtMTsKLX0KLQotI2lmIDAKLQotdm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpQTEw6OnRlc3QoKSB7Ci0gICAgbnNlY3NfdCBwZXJpb2QgPSBrTmFub3NJbjFzIC8gNjA7Ci0gICAgbVRpbWVzWzBdID0gMDsKLSAgICBtVGltZXNbMV0gPSBwZXJpb2Q7Ci0gICAgbVRpbWVzWzJdID0gcGVyaW9kICogMzsKLSAgICBtVGltZXNbM10gPSBwZXJpb2QgKiA0OwotICAgIG1UaW1lc1s0XSA9IHBlcmlvZCAqIDc7Ci0gICAgbVRpbWVzWzVdID0gcGVyaW9kICogODsKLSAgICBtVGltZXNbNl0gPSBwZXJpb2QgKiAxMDsKLSAgICBtVGltZXNbN10gPSBwZXJpb2QgKiAxMjsKLSAgICBtTnVtU2FtcGxlcyA9IDg7Ci0gICAgaW50NjRfdCBhLCBiLCBlcnI7Ci0gICAgZml0KDAsIHBlcmlvZCAqIDEyIC8gNywgOCwgJmEsICZiLCAmZXJyKTsKLSAgICAvLyBhID0gMC44KDUpKwotICAgIC8vIGIgPSAtMC4xNDA5NygyKSsKLSAgICAvLyBlcnIgPSAwLjI3NTA1NzgoNzAzKSsKLSAgICBBTE9HRCgiYT0lbGxkICglLjZmKSwgYj0lbGxkICglLjZmKSwgZXJyPSVsbGQgKCUuNmYpIiwKLSAgICAgICAgICAgIChsb25nIGxvbmcpYSwgKGEgLyAoZmxvYXQpKDEgPDwga1ByZWNpc2lvbikpLAotICAgICAgICAgICAgKGxvbmcgbG9uZyliLCAoYiAvIChmbG9hdCkoMSA8PCBrUHJlY2lzaW9uKSksCi0gICAgICAgICAgICAobG9uZyBsb25nKWVyciwgKGVyciAvIChmbG9hdCkoMSA8PCAoa1ByZWNpc2lvbiAqIDIpKSkpOwotfQotCi0jZW5kaWYKLQotYm9vbCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpQTEw6OmZpdCgKLSAgICAgICAgbnNlY3NfdCBwaGFzZSwgbnNlY3NfdCBwZXJpb2QsIHNpemVfdCBudW1TYW1wbGVzVG9Vc2UsCi0gICAgICAgIGludDY0X3QgKmEsIGludDY0X3QgKmIsIGludDY0X3QgKmVycikgewotICAgIGlmIChudW1TYW1wbGVzVG9Vc2UgPiBtTnVtU2FtcGxlcykgewotICAgICAgICBudW1TYW1wbGVzVG9Vc2UgPSBtTnVtU2FtcGxlczsKLSAgICB9Ci0KLSAgICBpZiAoKHBlcmlvZCA+PiBrUHJlY2lzaW9uKSA9PSAwICkgewotICAgICAgICBBTE9HVygiUGVyaW9kIGlzIDAsIG9yIGFmdGVyIGluY2x1ZGluZyBwcmVjaXNpb24gaXMgMCAtIHdvdWxkIGNhdXNlIGRpdjAsIHJldHVybmluZyIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaW50NjRfdCBzdW1YID0gMDsKLSAgICBpbnQ2NF90IHN1bVhYID0gMDsKLSAgICBpbnQ2NF90IHN1bVhZID0gMDsKLSAgICBpbnQ2NF90IHN1bVlZID0gMDsKLSAgICBpbnQ2NF90IHN1bVkgPSAwOwotCi0gICAgaW50NjRfdCB4ID0gMDsgLy8geCB1c3VhbGx5IGlzIGluIFswLi5udW1TYW1wbGVzVG9Vc2UpCi0gICAgbnNlY3NfdCBsYXN0VGltZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVNhbXBsZXNUb1VzZTsgaSsrKSB7Ci0gICAgICAgIHNpemVfdCBpeCA9IChtTnVtU2FtcGxlcyAtIG51bVNhbXBsZXNUb1VzZSArIGkpICUga0hpc3RvcnlTaXplOwotICAgICAgICBuc2Vjc190IHRpbWUgPSBtVGltZXNbaXhdOwotICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgIHggKz0gZGl2Um91bmQodGltZSAtIGxhc3RUaW1lLCBwZXJpb2QpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHkgaXMgdXN1YWxseSBpbiBbLW51bVNhbXBsZXNUb1VzZS4ubnVtU2FtcGxlc1RvVXNlK2tSZWZpdFJlZnJlc2hQZXJpb2Qva01pblBlcmlvZCkgPDwga1ByZWNpc2lvbgotICAgICAgICAvLyAgIGlkZWFsbHkgaW4gWzAuLm51bVNhbXBsZXNUb1VzZSksIGJ1dCBzaGlmdGVkIGJ5IC1udW1TYW1wbGVzVG9Vc2UgZHVyaW5nCi0gICAgICAgIC8vICAgcHJpbWluZywgYW5kIHBvc3NpYmx5IHNoaWZ0ZWQgYnkgdXAgdG8ga1JlZml0UmVmcmVzaFBlcmlvZC9rTWluUGVyaW9kCi0gICAgICAgIC8vICAgd2hpbGUgd2UgYXJlIG5vdCByZWZpdHRpbmcuCi0gICAgICAgIGludDY0X3QgeSA9IGRpdlJvdW5kKHRpbWUgLSBwaGFzZSwgcGVyaW9kID4+IGtQcmVjaXNpb24pOwotICAgICAgICBzdW1YICs9IHg7Ci0gICAgICAgIHN1bVkgKz0geTsKLSAgICAgICAgc3VtWFggKz0geCAqIHg7Ci0gICAgICAgIHN1bVhZICs9IHggKiB5OwotICAgICAgICBzdW1ZWSArPSB5ICogeTsKLSAgICAgICAgbGFzdFRpbWUgPSB0aW1lOwotICAgIH0KLQotICAgIGludDY0X3QgZGl2ICAgPSAoaW50NjRfdCludW1TYW1wbGVzVG9Vc2UgKiBzdW1YWCAtIHN1bVggKiBzdW1YOwotICAgIGlmIChkaXYgPT0gMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaW50NjRfdCBhX25vbSA9IChpbnQ2NF90KW51bVNhbXBsZXNUb1VzZSAqIHN1bVhZIC0gc3VtWCAqIHN1bVk7Ci0gICAgaW50NjRfdCBiX25vbSA9IHN1bVhYICogc3VtWSAgICAgICAgICAgIC0gc3VtWCAqIHN1bVhZOwotICAgICphID0gZGl2Um91bmQoYV9ub20sIGRpdik7Ci0gICAgKmIgPSBkaXZSb3VuZChiX25vbSwgZGl2KTsKLSAgICAvLyBkb24ndCB1c2UgYSBhbmQgYiBkaXJlY3RseSBhcyB0aGUgcm91bmRpbmcgZXJyb3IgaXMgc2lnbmlmaWNhbnQKLSAgICAqZXJyID0gc3VtWVkgLSBkaXZSb3VuZChhX25vbSAqIHN1bVhZICsgYl9ub20gKiBzdW1ZLCBkaXYpOwotICAgIEFMT0dWKCJmaXR0aW5nWyV6dV0gYT0lbGxkICglLjZmKSwgYj0lbGxkICglLjZmKSwgZXJyPSVsbGQgKCUuNmYpIiwKLSAgICAgICAgICAgIG51bVNhbXBsZXNUb1VzZSwKLSAgICAgICAgICAgIChsb25nIGxvbmcpKmEsICAgKCphIC8gKGZsb2F0KSgxIDw8IGtQcmVjaXNpb24pKSwKLSAgICAgICAgICAgIChsb25nIGxvbmcpKmIsICAgKCpiIC8gKGZsb2F0KSgxIDw8IGtQcmVjaXNpb24pKSwKLSAgICAgICAgICAgIChsb25nIGxvbmcpKmVyciwgKCplcnIgLyAoZmxvYXQpKDEgPDwgKGtQcmVjaXNpb24gKiAyKSkpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpQTEw6OnByaW1lKHNpemVfdCBudW1TYW1wbGVzVG9Vc2UpIHsKLSAgICBpZiAobnVtU2FtcGxlc1RvVXNlID4gbU51bVNhbXBsZXMpIHsKLSAgICAgICAgbnVtU2FtcGxlc1RvVXNlID0gbU51bVNhbXBsZXM7Ci0gICAgfQotICAgIENIRUNLKG51bVNhbXBsZXNUb1VzZSA+PSAzKTsgIC8vIG11c3QgaGF2ZSBhdCBsZWFzdCAzIHNhbXBsZXMKLQotICAgIC8vIGVzdGltYXRlIHZpZGVvIGZyYW1lcmF0ZSBmcm9tIGRlbHRhcyBiZXR3ZWVuIHRpbWVzdGFtcHMsIGFuZAotICAgIC8vIDJuZCBvcmRlciBkZWx0YXMKLSAgICBWZWN0b3I8bnNlY3NfdD4gZGVsdGFzOwotICAgIG5zZWNzX3QgbGFzdFRpbWUsIGZpcnN0VGltZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVNhbXBsZXNUb1VzZTsgKytpKSB7Ci0gICAgICAgIHNpemVfdCBpbmRleCA9IChtTnVtU2FtcGxlcyAtIG51bVNhbXBsZXNUb1VzZSArIGkpICUga0hpc3RvcnlTaXplOwotICAgICAgICBuc2Vjc190IHRpbWUgPSBtVGltZXNbaW5kZXhdOwotICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgIGlmICh0aW1lIC0gbGFzdFRpbWUgPiBrTWluUGVyaW9kKSB7Ci0gICAgICAgICAgICAgICAgLy9BTE9HVigiZGVsdGE6ICVsbGQiLCAobG9uZyBsb25nKSh0aW1lIC0gbGFzdFRpbWUpKTsKLSAgICAgICAgICAgICAgICBkZWx0YXMucHVzaCh0aW1lIC0gbGFzdFRpbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmlyc3RUaW1lID0gdGltZTsKLSAgICAgICAgfQotICAgICAgICBsYXN0VGltZSA9IHRpbWU7Ci0gICAgfQotICAgIGRlbHRhcy5zb3J0KGNvbXBhcmU8bnNlY3NfdD4pOwotICAgIHNpemVfdCBudW1EZWx0YXMgPSBkZWx0YXMuc2l6ZSgpOwotICAgIGlmIChudW1EZWx0YXMgPiAxKSB7Ci0gICAgICAgIG5zZWNzX3QgZGVsdGFNaW5MaW1pdCA9IG1heChkZWx0YXNbMF0gLyBrTXVsdGlwbGVzVGhyZXNob2xkRGl2LCBrTWluUGVyaW9kKTsKLSAgICAgICAgbnNlY3NfdCBkZWx0YU1heExpbWl0ID0gZGVsdGFzW251bURlbHRhcyAvIDJdICoga011bHRpcGxlc1RocmVzaG9sZERpdjsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IG51bURlbHRhcyAvIDIgKyAxOyBpIDwgbnVtRGVsdGFzOyArK2kpIHsKLSAgICAgICAgICAgIGlmIChkZWx0YXNbaV0gPiBkZWx0YU1heExpbWl0KSB7Ci0gICAgICAgICAgICAgICAgZGVsdGFzLnJlc2l6ZShpKTsKLSAgICAgICAgICAgICAgICBudW1EZWx0YXMgPSBpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbnVtRGVsdGFzOyArK2kpIHsKLSAgICAgICAgICAgIG5zZWNzX3QgZGVsdGEybmQgPSBkZWx0YXNbaV0gLSBkZWx0YXNbaSAtIDFdOwotICAgICAgICAgICAgaWYgKGRlbHRhMm5kID49IGRlbHRhTWluTGltaXQpIHsKLSAgICAgICAgICAgICAgICAvL0FMT0dWKCJkZWx0YTI6ICVsbGQiLCAobG9uZyBsb25nKShkZWx0YTJuZCkpOwotICAgICAgICAgICAgICAgIGRlbHRhcy5wdXNoKGRlbHRhMm5kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIHVzZSB0aGUgb25lIHRoYXQgeWllbGRzIHRoZSBiZXN0IG1hdGNoCi0gICAgaW50NjRfdCBiZXN0U2NvcmU7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZWx0YXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgbnNlY3NfdCBkZWx0YSA9IGRlbHRhc1tpXTsKLSAgICAgICAgaW50NjRfdCBzY29yZSA9IDA7Ci0jaWYgMQotICAgICAgICAvLyBzaW1wbGVzdCBzY29yZTogbnVtYmVyIG9mIGRlbHRhcyB0aGF0IGFyZSBuZWFyIG11bHRpcGxlcwotICAgICAgICBzaXplX3QgbWF0Y2hlcyA9IDA7Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgZGVsdGFzLnNpemUoKTsgKytqKSB7Ci0gICAgICAgICAgICBuc2Vjc190IGVyciA9IHBlcmlvZGljRXJyb3IoZGVsdGFzW2pdLCBkZWx0YSk7Ci0gICAgICAgICAgICBpZiAoZXJyIDwgZGVsdGEgLyBrTXVsdGlwbGVzVGhyZXNob2xkRGl2KSB7Ci0gICAgICAgICAgICAgICAgKyttYXRjaGVzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHNjb3JlID0gbWF0Y2hlczsKLSNpZiAwCi0gICAgICAgIC8vIGNvdWxkIGJlIHdlaWdoZWQgYnkgdGhlICgxIC0gbm9ybWFsaXplZCBlcnJvcikKLSAgICAgICAgaWYgKG51bVNhbXBsZXNUb1VzZSA+PSBrTWluU2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QpIHsKLSAgICAgICAgICAgIGludDY0X3QgYSwgYiwgZXJyOwotICAgICAgICAgICAgZml0KGZpcnN0VGltZSwgZGVsdGEsIG51bVNhbXBsZXNUb1VzZSwgJmEsICZiLCAmZXJyKTsKLSAgICAgICAgICAgIGVyciA9ICgxIDw8ICgyICoga1ByZWNpc2lvbikpIC0gZXJyOwotICAgICAgICAgICAgc2NvcmUgKj0gbWF4KDAsIGVycik7Ci0gICAgICAgIH0KLSNlbmRpZgotI2Vsc2UKLSAgICAgICAgLy8gb3IgdXNlIHRoZSBlcnJvciBhcyBhIG5lZ2F0aXZlIHNjb3JlCi0gICAgICAgIGlmIChudW1TYW1wbGVzVG9Vc2UgPj0ga01pblNhbXBsZXNUb0VzdGltYXRlUGVyaW9kKSB7Ci0gICAgICAgICAgICBpbnQ2NF90IGEsIGIsIGVycjsKLSAgICAgICAgICAgIGZpdChmaXJzdFRpbWUsIGRlbHRhLCBudW1TYW1wbGVzVG9Vc2UsICZhLCAmYiwgJmVycik7Ci0gICAgICAgICAgICBzY29yZSA9IC1kZWx0YSAqIGVycjsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIGlmIChpID09IDAgfHwgc2NvcmUgPiBiZXN0U2NvcmUpIHsKLSAgICAgICAgICAgIGJlc3RTY29yZSA9IHNjb3JlOwotICAgICAgICAgICAgbVBlcmlvZCA9IGRlbHRhOwotICAgICAgICAgICAgbVBoYXNlID0gZmlyc3RUaW1lOwotICAgICAgICB9Ci0gICAgfQotICAgIEFMT0dWKCJwcmltaW5nWyV6dV0gcGhhc2U6JWxsZCBwZXJpb2Q6JWxsZCIsCi0gICAgICAgICAgICBudW1TYW1wbGVzVG9Vc2UsIChsb25nIGxvbmcpbVBoYXNlLCAobG9uZyBsb25nKW1QZXJpb2QpOwotfQotCi1uc2Vjc190IFZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6YWRkU2FtcGxlKG5zZWNzX3QgdGltZSkgewotICAgIGlmIChtTGFzdFRpbWUgPj0gMAotICAgICAgICAgICAgLy8gaWYgdGltZSBnb2VzIGJhY2t3YXJkLCBvciB3ZSBza2lwcGVkIHJlbmRlcmluZwotICAgICAgICAgICAgJiYgKHRpbWUgPiBtTGFzdFRpbWUgKyBrTWF4QWxsb3dlZEZyYW1lU2tpcCB8fCB0aW1lIDwgbUxhc3RUaW1lKSkgewotICAgICAgICByZXN0YXJ0KCk7Ci0gICAgfQotCi0gICAgbUxhc3RUaW1lID0gdGltZTsKLSAgICBtVGltZXNbbU51bVNhbXBsZXMgJSBrSGlzdG9yeVNpemVdID0gdGltZTsKLSAgICArK21OdW1TYW1wbGVzOwotCi0gICAgYm9vbCBkb0ZpdCA9IHRpbWUgPiBtUmVmaXRBdDsKLSAgICBpZiAoKG1QZXJpb2QgPD0gMCB8fCAhbVByaW1lZCkgJiYgbU51bVNhbXBsZXMgPj0ga01pblNhbXBsZXNUb1N0YXJ0UHJpbWUpIHsKLSAgICAgICAgcHJpbWUoa01pblNhbXBsZXNUb1N0b3BQcmltZSk7Ci0gICAgICAgICsrbVNhbXBsZXNVc2VkRm9yUHJpbWluZzsKLSAgICAgICAgZG9GaXQgPSB0cnVlOwotICAgIH0KLSAgICBpZiAobVBlcmlvZCA+IDAgJiYgbU51bVNhbXBsZXMgPj0ga01pblNhbXBsZXNUb0VzdGltYXRlUGVyaW9kKSB7Ci0gICAgICAgIGlmIChtUGhhc2UgPCAwKSB7Ci0gICAgICAgICAgICAvLyBpbml0aWFsaXplIHBoYXNlIHRvIHRoZSBjdXJyZW50IHJlbmRlciB0aW1lCi0gICAgICAgICAgICBtUGhhc2UgPSB0aW1lOwotICAgICAgICAgICAgZG9GaXQgPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKCFkb0ZpdCkgewotICAgICAgICAgICAgaW50NjRfdCBlcnIgPSBwZXJpb2RpY0Vycm9yKHRpbWUgLSBtUGhhc2UsIG1QZXJpb2QpOwotICAgICAgICAgICAgZG9GaXQgPSBlcnIgPiBtUGVyaW9kIC8ga1JlRml0VGhyZXNob2xkRGl2OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRvRml0KSB7Ci0gICAgICAgICAgICBpbnQ2NF90IGEsIGIsIGVycjsKLSAgICAgICAgICAgIGlmICghZml0KG1QaGFzZSwgbVBlcmlvZCwga01heFNhbXBsZXNUb0VzdGltYXRlUGVyaW9kLCAmYSwgJmIsICZlcnIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gc2FtcGxlcyBhcmUgbm90IHN1aXRhYmxlIGZvciBmaXR0aW5nLiAgdGhpcyBtZWFucyB0aGV5IGFyZQotICAgICAgICAgICAgICAgIC8vIGFsc28gbm90IHN1aXRhYmxlIGZvciBwcmltaW5nLgotICAgICAgICAgICAgICAgIEFMT0dWKCJjb3VsZCBub3QgZml0IC0ga2VlcGluZyBvbGQgcGVyaW9kOiVsbGQiLCAobG9uZyBsb25nKW1QZXJpb2QpOwotICAgICAgICAgICAgICAgIHJldHVybiBtUGVyaW9kOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtUmVmaXRBdCA9IHRpbWUgKyBrUmVmaXRSZWZyZXNoUGVyaW9kOwotCi0gICAgICAgICAgICBtUGhhc2UgKz0gKG1QZXJpb2QgKiBiKSA+PiBrUHJlY2lzaW9uOwotICAgICAgICAgICAgbVBlcmlvZCA9IChtUGVyaW9kICogYSkgPj4ga1ByZWNpc2lvbjsKLSAgICAgICAgICAgIEFMT0dWKCJuZXcgcGhhc2U6JWxsZCBwZXJpb2Q6JWxsZCIsIChsb25nIGxvbmcpbVBoYXNlLCAobG9uZyBsb25nKW1QZXJpb2QpOwotCi0gICAgICAgICAgICBpZiAoZXJyIDwga0Vycm9yVGhyZXNob2xkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtUHJpbWVkICYmIG1TYW1wbGVzVXNlZEZvclByaW1pbmcgPj0ga01pblNhbXBsZXNUb1N0b3BQcmltZSkgewotICAgICAgICAgICAgICAgICAgICBtUHJpbWVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1QcmltZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBtU2FtcGxlc1VzZWRGb3JQcmltaW5nID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbVBlcmlvZDsKLX0KLQotbnNlY3NfdCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpQTEw6OmdldFBlcmlvZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVByaW1lZCA/IG1QZXJpb2QgOiAwOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lIFNjaGVkdWxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLXN0YXRpYyBjb25zdCBuc2Vjc190IGtEZWZhdWx0VnN5bmNQZXJpb2QgPSBrTmFub3NJbjFzIC8gNjA7ICAvLyA2MEh6Ci1zdGF0aWMgY29uc3QgbnNlY3NfdCBrVnN5bmNSZWZyZXNoUGVyaW9kID0ga05hbm9zSW4xczsgICAgICAgLy8gMSBzZWMKLQotVmlkZW9GcmFtZVNjaGVkdWxlcjo6VmlkZW9GcmFtZVNjaGVkdWxlcigpCi0gICAgOiBtVnN5bmNUaW1lKDApLAotICAgICAgbVZzeW5jUGVyaW9kKDApLAotICAgICAgbVZzeW5jUmVmcmVzaEF0KDApLAotICAgICAgbUxhc3RWc3luY1RpbWUoLTEpLAotICAgICAgbVRpbWVDb3JyZWN0aW9uKDApIHsKK1ZpZGVvRnJhbWVTY2hlZHVsZXI6OlZpZGVvRnJhbWVTY2hlZHVsZXIoKSA6IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlKCkgewogfQogCiB2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXI6OnVwZGF0ZVZzeW5jKCkgewogICAgIG1Wc3luY1JlZnJlc2hBdCA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKSArIGtWc3luY1JlZnJlc2hQZXJpb2Q7Ci0gICAgbVZzeW5jUGVyaW9kID0gMDsKICAgICBtVnN5bmNUaW1lID0gMDsKKyAgICBtVnN5bmNQZXJpb2QgPSAwOwogCi0gICAgLy8gVE9ETzogc2NoZWR1bGUgZnJhbWVzIGZvciB0aGUgZGVzdGluYXRpb24gc3VyZmFjZQotICAgIC8vIEZvciBub3csIHN1cmZhY2UgZmxpbmdlciBvbmx5IHNjaGVkdWxlcyBmcmFtZXMgb24gdGhlIHByaW1hcnkgZGlzcGxheQogICAgIGlmIChtQ29tcG9zZXIgPT0gTlVMTCkgewogICAgICAgICBTdHJpbmcxNiBuYW1lKCJTdXJmYWNlRmxpbmdlciIpOwogICAgICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CkBAIC0zNjgsMTM2ICs2MCw2IEBACiAgICAgfQogfQogCi12b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXI6OmluaXQoZmxvYXQgdmlkZW9GcHMpIHsKLSAgICB1cGRhdGVWc3luYygpOwotCi0gICAgbUxhc3RWc3luY1RpbWUgPSAtMTsKLSAgICBtVGltZUNvcnJlY3Rpb24gPSAwOwotCi0gICAgbVBsbC5yZXNldCh2aWRlb0Zwcyk7Ci19Ci0KLXZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6cmVzdGFydCgpIHsKLSAgICBtTGFzdFZzeW5jVGltZSA9IC0xOwotICAgIG1UaW1lQ29ycmVjdGlvbiA9IDA7Ci0KLSAgICBtUGxsLnJlc3RhcnQoKTsKLX0KLQotbnNlY3NfdCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpnZXRWc3luY1BlcmlvZCgpIHsKLSAgICBpZiAobVZzeW5jUGVyaW9kID4gMCkgewotICAgICAgICByZXR1cm4gbVZzeW5jUGVyaW9kOwotICAgIH0KLSAgICByZXR1cm4ga0RlZmF1bHRWc3luY1BlcmlvZDsKLX0KLQotZmxvYXQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6Z2V0RnJhbWVSYXRlKCkgewotICAgIG5zZWNzX3QgdmlkZW9QZXJpb2QgPSBtUGxsLmdldFBlcmlvZCgpOwotICAgIGlmICh2aWRlb1BlcmlvZCA+IDApIHsKLSAgICAgICAgcmV0dXJuIDFlOSAvIHZpZGVvUGVyaW9kOwotICAgIH0KLSAgICByZXR1cm4gMC5mOwotfQotCi1uc2Vjc190IFZpZGVvRnJhbWVTY2hlZHVsZXI6OnNjaGVkdWxlKG5zZWNzX3QgcmVuZGVyVGltZSkgewotICAgIG5zZWNzX3Qgb3JpZ1JlbmRlclRpbWUgPSByZW5kZXJUaW1lOwotCi0gICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgaWYgKG5vdyA+PSBtVnN5bmNSZWZyZXNoQXQpIHsKLSAgICAgICAgdXBkYXRlVnN5bmMoKTsKLSAgICB9Ci0KLSAgICAvLyB3aXRob3V0IFZTWU5DIGluZm8sIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8KLSAgICBpZiAobVZzeW5jUGVyaW9kID09IDApIHsKLSAgICAgICAgQUxPR1YoIm5vIHZzeW5jOiByZW5kZXI9JWxsZCIsIChsb25nIGxvbmcpcmVuZGVyVGltZSk7Ci0gICAgICAgIHJldHVybiByZW5kZXJUaW1lOwotICAgIH0KLQotICAgIC8vIGVuc3VyZSB2c3luYyB0aW1lIGlzIHdlbGwgYmVmb3JlIChjb3JyZWN0ZWQpIHJlbmRlciB0aW1lCi0gICAgaWYgKG1Wc3luY1RpbWUgPiByZW5kZXJUaW1lIC0gNCAqIG1Wc3luY1BlcmlvZCkgewotICAgICAgICBtVnN5bmNUaW1lIC09Ci0gICAgICAgICAgICAoKG1Wc3luY1RpbWUgLSByZW5kZXJUaW1lKSAvIG1Wc3luY1BlcmlvZCArIDUpICogbVZzeW5jUGVyaW9kOwotICAgIH0KLQotICAgIC8vIFZpZGVvIHByZXNlbnRhdGlvbiB0YWtlcyBwbGFjZSBhdCB0aGUgVlNZTkMgX2FmdGVyXyByZW5kZXJUaW1lLiAgQWRqdXN0IHJlbmRlclRpbWUKLSAgICAvLyBzbyB0aGlzIGVmZmVjdGl2ZWx5IGJlY29tZXMgYSByb3VuZGluZyBvcGVyYXRpb24gKHRvIHRoZSBfY2xvc2VzdF8gVlNZTkMuKQotICAgIHJlbmRlclRpbWUgLT0gbVZzeW5jUGVyaW9kIC8gMjsKLQotICAgIGNvbnN0IG5zZWNzX3QgdmlkZW9QZXJpb2QgPSBtUGxsLmFkZFNhbXBsZShvcmlnUmVuZGVyVGltZSk7Ci0gICAgaWYgKHZpZGVvUGVyaW9kID4gMCkgewotICAgICAgICAvLyBTbW9vdGggb3V0IHJlbmRlcmluZwotICAgICAgICBzaXplX3QgTiA9IDEyOwotICAgICAgICBuc2Vjc190IGZpdmVTaXh0aERldiA9Ci0gICAgICAgICAgICBhYnMoKCh2aWRlb1BlcmlvZCAqIDUgKyBtVnN5bmNQZXJpb2QpICUgKG1Wc3luY1BlcmlvZCAqIDYpKSAtIG1Wc3luY1BlcmlvZCkKLSAgICAgICAgICAgICAgICAgICAgLyAobVZzeW5jUGVyaW9kIC8gMTAwKTsKLSAgICAgICAgLy8gdXNlIDIwIHNhbXBsZXMgaWYgd2UgYXJlIGRvaW5nIDU6NiByYXRpbyArLSAxJSAoZS5nLiBwbGF5aW5nIDUwSHogb24gNjBIeikKLSAgICAgICAgaWYgKGZpdmVTaXh0aERldiA8IDEyKSB7ICAvKiAxMiUgLyA2ID0gMiUgKi8KLSAgICAgICAgICAgIE4gPSAyMDsKLSAgICAgICAgfQotCi0gICAgICAgIG5zZWNzX3Qgb2Zmc2V0ID0gMDsKLSAgICAgICAgbnNlY3NfdCBlZGdlUmVtYWluZGVyID0gMDsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPD0gTjsgaSsrKSB7Ci0gICAgICAgICAgICBvZmZzZXQgKz0KLSAgICAgICAgICAgICAgICAocmVuZGVyVGltZSArIG1UaW1lQ29ycmVjdGlvbiArIHZpZGVvUGVyaW9kICogaSAtIG1Wc3luY1RpbWUpICUgbVZzeW5jUGVyaW9kOwotICAgICAgICAgICAgZWRnZVJlbWFpbmRlciArPSAodmlkZW9QZXJpb2QgKiBpKSAlIG1Wc3luY1BlcmlvZDsKLSAgICAgICAgfQotICAgICAgICBtVGltZUNvcnJlY3Rpb24gKz0gbVZzeW5jUGVyaW9kIC8gMiAtIG9mZnNldCAvIChuc2Vjc190KU47Ci0gICAgICAgIHJlbmRlclRpbWUgKz0gbVRpbWVDb3JyZWN0aW9uOwotICAgICAgICBuc2Vjc190IGNvcnJlY3Rpb25MaW1pdCA9IG1Wc3luY1BlcmlvZCAqIDMgLyA1OwotICAgICAgICBlZGdlUmVtYWluZGVyID0gYWJzKGVkZ2VSZW1haW5kZXIgLyAobnNlY3NfdClOIC0gbVZzeW5jUGVyaW9kIC8gMik7Ci0gICAgICAgIGlmIChlZGdlUmVtYWluZGVyIDw9IG1Wc3luY1BlcmlvZCAvIDMpIHsKLSAgICAgICAgICAgIGNvcnJlY3Rpb25MaW1pdCAvPSAyOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZXN0aW1hdGUgaG93IG1hbnkgVlNZTkNzIGEgZnJhbWUgd2lsbCBzcGVuZCBvbiB0aGUgZGlzcGxheQotICAgICAgICBuc2Vjc190IG5leHRWc3luY1RpbWUgPQotICAgICAgICAgICAgcmVuZGVyVGltZSArIG1Wc3luY1BlcmlvZCAtICgocmVuZGVyVGltZSAtIG1Wc3luY1RpbWUpICUgbVZzeW5jUGVyaW9kKTsKLSAgICAgICAgaWYgKG1MYXN0VnN5bmNUaW1lID49IDApIHsKLSAgICAgICAgICAgIHNpemVfdCBtaW5Wc3luY3NQZXJGcmFtZSA9IHZpZGVvUGVyaW9kIC8gbVZzeW5jUGVyaW9kOwotICAgICAgICAgICAgc2l6ZV90IHZzeW5jc0Zvckxhc3RGcmFtZSA9IGRpdlJvdW5kKG5leHRWc3luY1RpbWUgLSBtTGFzdFZzeW5jVGltZSwgbVZzeW5jUGVyaW9kKTsKLSAgICAgICAgICAgIGJvb2wgdnN5bmNzUGVyRnJhbWVBcmVOZWFybHlDb25zdGFudCA9Ci0gICAgICAgICAgICAgICAgcGVyaW9kaWNFcnJvcih2aWRlb1BlcmlvZCwgbVZzeW5jUGVyaW9kKSAvIChtVnN5bmNQZXJpb2QgLyAyMCkgPT0gMDsKLQotICAgICAgICAgICAgaWYgKG1UaW1lQ29ycmVjdGlvbiA+IGNvcnJlY3Rpb25MaW1pdCAmJgotICAgICAgICAgICAgICAgICAgICAodnN5bmNzUGVyRnJhbWVBcmVOZWFybHlDb25zdGFudCB8fCB2c3luY3NGb3JMYXN0RnJhbWUgPiBtaW5Wc3luY3NQZXJGcmFtZSkpIHsKLSAgICAgICAgICAgICAgICAvLyByZW1vdmUgYSBWU1lOQwotICAgICAgICAgICAgICAgIG1UaW1lQ29ycmVjdGlvbiAtPSBtVnN5bmNQZXJpb2QgLyAyOwotICAgICAgICAgICAgICAgIHJlbmRlclRpbWUgLT0gbVZzeW5jUGVyaW9kIC8gMjsKLSAgICAgICAgICAgICAgICBuZXh0VnN5bmNUaW1lIC09IG1Wc3luY1BlcmlvZDsKLSAgICAgICAgICAgICAgICBpZiAodnN5bmNzRm9yTGFzdEZyYW1lID4gMCkKLSAgICAgICAgICAgICAgICAgICAgLS12c3luY3NGb3JMYXN0RnJhbWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1UaW1lQ29ycmVjdGlvbiA8IC1jb3JyZWN0aW9uTGltaXQgJiYKLSAgICAgICAgICAgICAgICAgICAgKHZzeW5jc1BlckZyYW1lQXJlTmVhcmx5Q29uc3RhbnQgfHwgdnN5bmNzRm9yTGFzdEZyYW1lID09IG1pblZzeW5jc1BlckZyYW1lKSkgewotICAgICAgICAgICAgICAgIC8vIGFkZCBhIFZTWU5DCi0gICAgICAgICAgICAgICAgbVRpbWVDb3JyZWN0aW9uICs9IG1Wc3luY1BlcmlvZCAvIDI7Ci0gICAgICAgICAgICAgICAgcmVuZGVyVGltZSArPSBtVnN5bmNQZXJpb2QgLyAyOwotICAgICAgICAgICAgICAgIG5leHRWc3luY1RpbWUgKz0gbVZzeW5jUGVyaW9kOwotICAgICAgICAgICAgICAgIGlmICh2c3luY3NGb3JMYXN0RnJhbWUgPCBVTE9OR19NQVgpCi0gICAgICAgICAgICAgICAgICAgICsrdnN5bmNzRm9yTGFzdEZyYW1lOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtVGltZUNvcnJlY3Rpb24gPCAtY29ycmVjdGlvbkxpbWl0ICogMgotICAgICAgICAgICAgICAgICAgICB8fCBtVGltZUNvcnJlY3Rpb24gPiBjb3JyZWN0aW9uTGltaXQgKiAyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNvcnJlY3Rpb24gYmV5b25kIGxpbWl0OiAlbGxkIHZzICVsbGQgKHZzeW5jcyBmb3IgbGFzdCBmcmFtZTogJXp1LCBtaW46ICV6dSkiCi0gICAgICAgICAgICAgICAgICAgICAgICAiIHJlc3RhcnRpbmcuIHJlbmRlcj0lbGxkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbVRpbWVDb3JyZWN0aW9uLCAobG9uZyBsb25nKWNvcnJlY3Rpb25MaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZzeW5jc0Zvckxhc3RGcmFtZSwgbWluVnN5bmNzUGVyRnJhbWUsIChsb25nIGxvbmcpb3JpZ1JlbmRlclRpbWUpOwotICAgICAgICAgICAgICAgIHJlc3RhcnQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ1JlbmRlclRpbWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFUUkFDRV9JTlQoIkZSQU1FX1ZTWU5DUyIsIHZzeW5jc0Zvckxhc3RGcmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUxhc3RWc3luY1RpbWUgPSBuZXh0VnN5bmNUaW1lOwotICAgIH0KLQotICAgIC8vIGFsaWduIHJlbmRlcnRpbWUgdG8gdGhlIGNlbnRlciBiZXR3ZWVuIFZTWU5DIGVkZ2VzCi0gICAgcmVuZGVyVGltZSAtPSAocmVuZGVyVGltZSAtIG1Wc3luY1RpbWUpICUgbVZzeW5jUGVyaW9kOwotICAgIHJlbmRlclRpbWUgKz0gbVZzeW5jUGVyaW9kIC8gMjsKLSAgICBBTE9HVigiYWRqdXN0aW5nIHJlbmRlcjogJWxsZCA9PiAlbGxkIiwgKGxvbmcgbG9uZylvcmlnUmVuZGVyVGltZSwgKGxvbmcgbG9uZylyZW5kZXJUaW1lKTsKLSAgICBBVFJBQ0VfSU5UKCJGUkFNRV9GTElQX0lOKG1zKSIsIChyZW5kZXJUaW1lIC0gbm93KSAvIDEwMDAwMDApOwotICAgIHJldHVybiByZW5kZXJUaW1lOwotfQotCiB2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXI6OnJlbGVhc2UoKSB7CiAgICAgbUNvbXBvc2VyLmNsZWFyKCk7CiB9CkBAIC01MDcsNCArNjksMyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDJhZTdkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlcjIuY3BwCkBAIC0wLDAgKzEsMjg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJWaWRlb0ZyYW1lU2NoZWR1bGVyMiIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX1ZJREVPCisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9UaHJlYWQuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGpuaS5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvY2hvcmVvZ3JhcGhlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlcjIuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIHZvaWQgZ2V0VnN5bmNPZmZzZXQobG9uZyogYXBwVnN5bmNPZmZzZXRQdHIsIGxvbmcqIHNmVnN5bmNPZmZzZXRQdHIpOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVnN5bmNUcmFja2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK2NsYXNzIFZzeW5jVHJhY2tlciA6IHB1YmxpYyBSZWZCYXNleworcHVibGljOgorICAgIFZzeW5jVHJhY2tlcigpOworICAgIH5Wc3luY1RyYWNrZXIoKSB7fQorICAgIGxvbmcgZ2V0VnN5bmNQZXJpb2QoKTsKKyAgICBsb25nIGdldFZzeW5jVGltZShsb25nIHBlcmlvZE9mZnNldCk7CisgICAgdm9pZCBhZGRTYW1wbGUobG9uZyB0aW1lc3RhbXApOworCitwcml2YXRlOgorICAgIHN0YXRpYyBjb25zdCBpbnQga01heFNhbXBsZXMgPSAzMjsKKyAgICBzdGF0aWMgY29uc3QgaW50IGtNaW5TYW1wbGVzRm9yVXBkYXRlID0gNjsKKyAgICBpbnQgbU51bVNhbXBsZXM7CisgICAgaW50IG1GaXJzdFNhbXBsZTsKKyAgICBsb25nIG1SZWZlcmVuY2VUaW1lOworICAgIGxvbmcgbVBoYXNlOworICAgIGxvbmcgbVBlcmlvZDsKKyAgICBsb25nIG1UaW1lc3RhbXBTYW1wbGVzW2tNYXhTYW1wbGVzXTsKKyAgICBNdXRleCBtTG9jazsKKworICAgIHZvaWQgdXBkYXRlTW9kZWxMb2NrZWQoKTsKK307CisKK1ZzeW5jVHJhY2tlcjo6VnN5bmNUcmFja2VyKCkKKyAgICA6IG1OdW1TYW1wbGVzKDApLAorICAgICAgbUZpcnN0U2FtcGxlKDApLAorICAgICAgbVJlZmVyZW5jZVRpbWUoMCksCisgICAgICBtUGhhc2UoMCksCisgICAgICBtUGVyaW9kKDApIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtNYXhTYW1wbGVzOyBpKyspIHsKKyAgICAgICAgbVRpbWVzdGFtcFNhbXBsZXNbaV0gPSAwOworICAgIH0KK30KKworbG9uZyBWc3luY1RyYWNrZXI6OmdldFZzeW5jUGVyaW9kKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBkYXRhTG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1QZXJpb2Q7Cit9CisKK2xvbmcgVnN5bmNUcmFja2VyOjpnZXRWc3luY1RpbWUobG9uZyBwZXJpb2RPZmZzZXQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgZGF0YUxvY2sobUxvY2spOworICAgIGNvbnN0IGxvbmcgbm93ID0gc3lzdGVtVGltZSgpOworICAgIGxvbmcgcGhhc2UgPSBtUmVmZXJlbmNlVGltZSArIG1QaGFzZTsKKyAgICByZXR1cm4gKCgobm93IC0gcGhhc2UpIC8gbVBlcmlvZCkgKyBwZXJpb2RPZmZzZXQgKyAxKSAqIG1QZXJpb2QgKyBwaGFzZTsKK30KKwordm9pZCBWc3luY1RyYWNrZXI6OmFkZFNhbXBsZShsb25nIHRpbWVzdGFtcCkgeworICAgIE11dGV4OjpBdXRvbG9jayBkYXRhTG9jayhtTG9jayk7CisgICAgaWYgKG1OdW1TYW1wbGVzID09IDApIHsKKyAgICAgICAgbVBoYXNlID0gMDsKKyAgICAgICAgbVJlZmVyZW5jZVRpbWUgPSB0aW1lc3RhbXA7CisgICAgfQorICAgIGludCBpZHggPSAobUZpcnN0U2FtcGxlICsgbU51bVNhbXBsZXMpICUga01heFNhbXBsZXM7CisgICAgbVRpbWVzdGFtcFNhbXBsZXNbaWR4XSA9IHRpbWVzdGFtcDsKKyAgICBpZiAobU51bVNhbXBsZXMgPCBrTWF4U2FtcGxlcykgeworICAgICAgICBtTnVtU2FtcGxlcysrOworICAgIH0gZWxzZSB7CisgICAgICAgIG1GaXJzdFNhbXBsZSA9IChtRmlyc3RTYW1wbGUgKyAxKSAlIGtNYXhTYW1wbGVzOworICAgIH0KKyAgICB1cGRhdGVNb2RlbExvY2tlZCgpOworfQorCit2b2lkIFZzeW5jVHJhY2tlcjo6dXBkYXRlTW9kZWxMb2NrZWQoKSB7CisgICAgaWYgKG1OdW1TYW1wbGVzIDwga01pblNhbXBsZXNGb3JVcGRhdGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBsb25nIGR1cmF0aW9uU3VtID0gMDsKKyAgICBsb25nIG1pbkR1cmF0aW9uID0gTE9OR19NQVg7CisgICAgbG9uZyBtYXhEdXJhdGlvbiA9IDA7CisKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IG1OdW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgaW50IGlkeCA9IChtRmlyc3RTYW1wbGUgKyBpKSAlIGtNYXhTYW1wbGVzOworICAgICAgICBpbnQgcHJldiA9IChpZHggKyBrTWF4U2FtcGxlcyAtIDEpICUga01heFNhbXBsZXM7CisgICAgICAgIGxvbmcgZHVyYXRpb24gPSBtVGltZXN0YW1wU2FtcGxlc1tpZHhdIC0gbVRpbWVzdGFtcFNhbXBsZXNbcHJldl07CisgICAgICAgIGR1cmF0aW9uU3VtICs9IGR1cmF0aW9uOworICAgICAgICBtaW5EdXJhdGlvbiA9IG1pbihtaW5EdXJhdGlvbiwgZHVyYXRpb24pOworICAgICAgICBtYXhEdXJhdGlvbiA9IG1heChtYXhEdXJhdGlvbiwgZHVyYXRpb24pOworICAgIH0KKworICAgIGR1cmF0aW9uU3VtIC09IChtaW5EdXJhdGlvbiArIG1heER1cmF0aW9uKTsKKyAgICBtUGVyaW9kID0gZHVyYXRpb25TdW0gLyAobU51bVNhbXBsZXMgLSAzKTsKKworICAgIGRvdWJsZSBzYW1wbGVBdmdYID0gMC4wOworICAgIGRvdWJsZSBzYW1wbGVBdmdZID0gMC4wOworICAgIGRvdWJsZSBzY2FsZSA9IDIuMCAqIE1fUEkgLyAoZG91YmxlKSBtUGVyaW9kOworCisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBtTnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgIGludCBpZHggPSAobUZpcnN0U2FtcGxlICsgaSkgJSBrTWF4U2FtcGxlczsKKyAgICAgICAgbG9uZyBzYW1wbGUgPSBtVGltZXN0YW1wU2FtcGxlc1tpZHhdIC0gbVJlZmVyZW5jZVRpbWU7CisgICAgICAgIGRvdWJsZSBzYW1wbGVQaGFzZSA9IChkb3VibGUpIChzYW1wbGUgJSBtUGVyaW9kKSAqIHNjYWxlOworICAgICAgICBzYW1wbGVBdmdYICs9IGNvcyhzYW1wbGVQaGFzZSk7CisgICAgICAgIHNhbXBsZUF2Z1kgKz0gc2luKHNhbXBsZVBoYXNlKTsKKyAgICB9CisKKyAgICBzYW1wbGVBdmdYIC89IChkb3VibGUpIG1OdW1TYW1wbGVzIC0gMS4wOworICAgIHNhbXBsZUF2Z1kgLz0gKGRvdWJsZSkgbU51bVNhbXBsZXMgLSAxLjA7CisgICAgbVBoYXNlID0gKGxvbmcpIChhdGFuMihzYW1wbGVBdmdZLCBzYW1wbGVBdmdYKSAvIHNjYWxlKTsKK30KKworc3RhdGljIHZvaWQgZnJhbWVDYWxsYmFjayhsb25nIGZyYW1lVGltZU5hbm9zLCB2b2lkKiBkYXRhKSB7CisgICAgaWYgKGRhdGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPFZzeW5jVHJhY2tlcj4gdnN5bmNUcmFja2VyKHN0YXRpY19jYXN0PFZzeW5jVHJhY2tlcio+KGRhdGEpKTsKKyAgICB2c3luY1RyYWNrZXItPmFkZFNhbXBsZShmcmFtZVRpbWVOYW5vcyk7CisgICAgQUNob3Jlb2dyYXBoZXJfcG9zdEZyYW1lQ2FsbGJhY2soQUNob3Jlb2dyYXBoZXJfZ2V0SW5zdGFuY2UoKSwKKyAgICAgICAgICAgIGZyYW1lQ2FsbGJhY2ssIHN0YXRpY19jYXN0PHZvaWQqPih2c3luY1RyYWNrZXIuZ2V0KCkpKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKTkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdGF0aWMgdm9pZCBnZXRWc3luY09mZnNldChsb25nKiBhcHBWc3luY09mZnNldFB0ciwgbG9uZyogc2ZWc3luY09mZnNldFB0cikgeworICAgIHN0YXRpYyBjb25zdCBsb25nIGtPbmVNaWxsaXNlY0luTmFub3NlYyA9IDEwMDAwMDA7CisgICAgc3RhdGljIGNvbnN0IGxvbmcga09uZVNlY0luTmFub3NlYyA9IGtPbmVNaWxsaXNlY0luTmFub3NlYyAqIDEwMDA7CisKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgamNsYXNzIGpEaXNwbGF5TWFuYWdlckdsb2JhbENscyA9IGVudi0+RmluZENsYXNzKAorICAgICAgICAgICAgImFuZHJvaWQvaGFyZHdhcmUvZGlzcGxheS9EaXNwbGF5TWFuYWdlckdsb2JhbCIpOworICAgIGpjbGFzcyBqRGlzcGxheUNscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL3ZpZXcvRGlzcGxheSIpOworCisgICAgam1ldGhvZElEIGpHZXRJbnN0YW5jZSA9IGVudi0+R2V0U3RhdGljTWV0aG9kSUQoakRpc3BsYXlNYW5hZ2VyR2xvYmFsQ2xzLAorICAgICAgICAgICAgImdldEluc3RhbmNlIiwgIigpTGFuZHJvaWQvaGFyZHdhcmUvZGlzcGxheS9EaXNwbGF5TWFuYWdlckdsb2JhbDsiKTsKKyAgICBqb2JqZWN0IGphdmFEaXNwbGF5TWFuYWdlckdsb2JhbE9iaiA9IGVudi0+Q2FsbFN0YXRpY09iamVjdE1ldGhvZCgKKyAgICAgICAgICAgIGpEaXNwbGF5TWFuYWdlckdsb2JhbENscywgakdldEluc3RhbmNlKTsKKworICAgIGpmaWVsZElEIGpERUZBVUxUX0RJU1BMQVkgPSBlbnYtPkdldFN0YXRpY0ZpZWxkSUQoakRpc3BsYXlDbHMsICJERUZBVUxUX0RJU1BMQVkiLCAiSSIpOworICAgIGppbnQgREVGQVVMVF9ESVNQTEFZID0gZW52LT5HZXRTdGF0aWNJbnRGaWVsZChqRGlzcGxheUNscywgakRFRkFVTFRfRElTUExBWSk7CisKKyAgICBqbWV0aG9kSUQgamdldFJlYWxEaXNwbGF5ID0gZW52LT5HZXRNZXRob2RJRChqRGlzcGxheU1hbmFnZXJHbG9iYWxDbHMsCisgICAgICAgICAgICAiZ2V0UmVhbERpc3BsYXkiLCAiKEkpTGFuZHJvaWQvdmlldy9EaXNwbGF5OyIpOworICAgIGpvYmplY3QgamF2YURpc3BsYXlPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoCisgICAgICAgICAgICBqYXZhRGlzcGxheU1hbmFnZXJHbG9iYWxPYmosIGpnZXRSZWFsRGlzcGxheSwgREVGQVVMVF9ESVNQTEFZKTsKKworICAgIGptZXRob2RJRCBqR2V0UmVmcmVzaFJhdGUgPSBlbnYtPkdldE1ldGhvZElEKGpEaXNwbGF5Q2xzLCAiZ2V0UmVmcmVzaFJhdGUiLCAiKClGIik7CisgICAgamZsb2F0IGphdmFSZWZyZXNoUmF0ZSA9IGVudi0+Q2FsbEZsb2F0TWV0aG9kKGphdmFEaXNwbGF5T2JqLCBqR2V0UmVmcmVzaFJhdGUpOworICAgIGxvbmcgdnN5bmNQZXJpb2QgPSAobG9uZykgKGtPbmVTZWNJbk5hbm9zZWMgLyAoZmxvYXQpIGphdmFSZWZyZXNoUmF0ZSk7CisKKyAgICBqbWV0aG9kSUQgakdldEFwcFZzeW5jT2Zmc2V0TmFub3MgPSBlbnYtPkdldE1ldGhvZElEKAorICAgICAgICAgICAgakRpc3BsYXlDbHMsICJnZXRBcHBWc3luY09mZnNldE5hbm9zIiwgIigpSiIpOworICAgIGpsb25nIGphdmFBcHBWc3luY09mZnNldCA9IGVudi0+Q2FsbExvbmdNZXRob2QoamF2YURpc3BsYXlPYmosIGpHZXRBcHBWc3luY09mZnNldE5hbm9zKTsKKyAgICAqYXBwVnN5bmNPZmZzZXRQdHIgPSAobG9uZykgamF2YUFwcFZzeW5jT2Zmc2V0OworCisgICAgam1ldGhvZElEIGpHZXRQcmVzZW50YXRpb25EZWFkbGluZU5hbm9zID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIGpEaXNwbGF5Q2xzLCAiZ2V0UHJlc2VudGF0aW9uRGVhZGxpbmVOYW5vcyIsICIoKUoiKTsKKyAgICBqbG9uZyBqYXZhUHJlc2VudGF0aW9uRGVhZGxpbmUgPSBlbnYtPkNhbGxMb25nTWV0aG9kKAorICAgICAgICAgICAgamF2YURpc3BsYXlPYmosIGpHZXRQcmVzZW50YXRpb25EZWFkbGluZU5hbm9zKTsKKworICAgICpzZlZzeW5jT2Zmc2V0UHRyID0gdnN5bmNQZXJpb2QgLSAoKGxvbmcpIGphdmFQcmVzZW50YXRpb25EZWFkbGluZSAtIGtPbmVNaWxsaXNlY0luTmFub3NlYyk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hvcmVvZ3JhcGhlciBUaHJlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RydWN0IENob3Jlb2dyYXBoZXJUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKKyAgICBDaG9yZW9ncmFwaGVyVGhyZWFkKGJvb2wgY2FuQ2FsbEphdmEpOworICAgIHN0YXR1c190IGluaXQodm9pZCogZGF0YSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkeVRvUnVuKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkNob3Jlb2dyYXBoZXJUaHJlYWQoKSB7fQorCitwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENob3Jlb2dyYXBoZXJUaHJlYWQpOworICAgIHZvaWQqIG1EYXRhOworfTsKKworQ2hvcmVvZ3JhcGhlclRocmVhZDo6Q2hvcmVvZ3JhcGhlclRocmVhZChib29sIGNhbkNhbGxKYXZhKSA6IFRocmVhZChjYW5DYWxsSmF2YSkgeworfQorCitzdGF0dXNfdCBDaG9yZW9ncmFwaGVyVGhyZWFkOjppbml0KHZvaWQqIGRhdGEpIHsKKyAgICBpZiAoZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBtRGF0YSA9IGRhdGE7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDaG9yZW9ncmFwaGVyVGhyZWFkOjpyZWFkeVRvUnVuKCkgeworICAgIEFMb29wZXJfcHJlcGFyZShBTE9PUEVSX1BSRVBBUkVfQUxMT1dfTk9OX0NBTExCQUNLUyk7CisgICAgaWYgKEFDaG9yZW9ncmFwaGVyX2dldEluc3RhbmNlKCkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgQUNob3Jlb2dyYXBoZXJfcG9zdEZyYW1lQ2FsbGJhY2soQUNob3Jlb2dyYXBoZXJfZ2V0SW5zdGFuY2UoKSwgZnJhbWVDYWxsYmFjaywgbURhdGEpOworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBDaG9yZW9ncmFwaGVyVGhyZWFkOjp0aHJlYWRMb29wKCkgeworICAgIEFMb29wZXJfcG9sbE9uY2UoLTEsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpOworICAgIHJldHVybiB0cnVlOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lIFNjaGVkdWxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK1ZpZGVvRnJhbWVTY2hlZHVsZXIyOjpWaWRlb0ZyYW1lU2NoZWR1bGVyMigpIDogVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UoKSB7CisKKyAgICBnZXRWc3luY09mZnNldCgmbUFwcFZzeW5jT2Zmc2V0LCAmbVNmVnN5bmNPZmZzZXQpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIHRocmVhZExvY2sobUxvY2spOworICAgIG1DaG9yZW9ncmFwaGVyVGhyZWFkID0gbmV3IENob3Jlb2dyYXBoZXJUaHJlYWQodHJ1ZSk7CisKKyAgICBtVnN5bmNUcmFja2VyID0gbmV3IFZzeW5jVHJhY2tlcigpOworICAgIGlmIChtQ2hvcmVvZ3JhcGhlclRocmVhZC0+aW5pdChzdGF0aWNfY2FzdDx2b2lkKj4obVZzeW5jVHJhY2tlci5nZXQoKSkpICE9IE9LKSB7CisgICAgICAgIG1DaG9yZW9ncmFwaGVyVGhyZWFkLmNsZWFyKCk7CisgICAgfQorICAgIGlmIChtQ2hvcmVvZ3JhcGhlclRocmVhZCAhPSBOVUxMICYmIG1DaG9yZW9ncmFwaGVyVGhyZWFkLT5ydW4oIkNob3Jlb2dyYXBoZXIiKSAhPSBPSykgeworICAgICAgICBtQ2hvcmVvZ3JhcGhlclRocmVhZC5jbGVhcigpOworICAgIH0KK30KKwordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyMjo6dXBkYXRlVnN5bmMoKSB7CisgICAgbVZzeW5jVGltZSA9IDA7CisgICAgbVZzeW5jUGVyaW9kID0gMDsKKworICAgIGlmIChtVnN5bmNUcmFja2VyICE9IE5VTEwpIHsKKyAgICAgICAgbVZzeW5jUGVyaW9kID0gbVZzeW5jVHJhY2tlci0+Z2V0VnN5bmNQZXJpb2QoKTsKKyAgICAgICAgbVZzeW5jVGltZSA9IG1Wc3luY1RyYWNrZXItPmdldFZzeW5jVGltZShtU2ZWc3luY09mZnNldCAtIG1BcHBWc3luY09mZnNldCk7CisgICAgfQorICAgIG1Wc3luY1JlZnJlc2hBdCA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKSArIGtWc3luY1JlZnJlc2hQZXJpb2Q7Cit9CisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjI6OnJlbGVhc2UoKSB7CisgICAgLy8gRG8gbm90IGNoYW5nZSBvcmRlcgorICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIHRocmVhZExvY2sobUxvY2spOworICAgICAgICBtQ2hvcmVvZ3JhcGhlclRocmVhZC0+cmVxdWVzdEV4aXRBbmRXYWl0KCk7CisgICAgICAgIG1DaG9yZW9ncmFwaGVyVGhyZWFkLmNsZWFyKCk7CisgICAgfQorCisgICAgbVZzeW5jVHJhY2tlci5jbGVhcigpOworfQorCitWaWRlb0ZyYW1lU2NoZWR1bGVyMjo6flZpZGVvRnJhbWVTY2hlZHVsZXIyKCkgeworICAgIHJlbGVhc2UoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MTA3ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZS5jcHAKQEAgLTAsMCArMSw0NjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfVklERU8KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordGVtcGxhdGU8Y2xhc3MgVD4KK3N0YXRpYyBpbnQgY29tcGFyZShjb25zdCBUICpsaHMsIGNvbnN0IFQgKnJocykgeworICAgIGlmICgqbGhzIDwgKnJocykgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIGlmICgqbGhzID4gKnJocykgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUExMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RhdGljIGNvbnN0IHNpemVfdCBrTWluU2FtcGxlc1RvU3RhcnRQcmltZSA9IDM7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtNaW5TYW1wbGVzVG9TdG9wUHJpbWUgPSBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6a0hpc3RvcnlTaXplOworc3RhdGljIGNvbnN0IHNpemVfdCBrTWluU2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QgPSAzOworc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4U2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QgPSBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6a0hpc3RvcnlTaXplOworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtQcmVjaXNpb24gPSAxMjsKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtFcnJvclRocmVzaG9sZCA9ICgxIDw8IChrUHJlY2lzaW9uICogMikpIC8gMTA7CitzdGF0aWMgY29uc3QgaW50NjRfdCBrTXVsdGlwbGVzVGhyZXNob2xkRGl2ID0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMjUlCitzdGF0aWMgY29uc3QgaW50NjRfdCBrUmVGaXRUaHJlc2hvbGREaXYgPSAxMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMSUKK3N0YXRpYyBjb25zdCBuc2Vjc190IGtNYXhBbGxvd2VkRnJhbWVTa2lwID0gVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OmtOYW5vc0luMXM7ICAgICAvLyAxIHNlYworc3RhdGljIGNvbnN0IG5zZWNzX3Qga01pblBlcmlvZCA9IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjprTmFub3NJbjFzIC8gMTIwOyAgICAgICAgIC8vIDEyMEh6CitzdGF0aWMgY29uc3QgbnNlY3NfdCBrUmVmaXRSZWZyZXNoUGVyaW9kID0gMTAgKiBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6a05hbm9zSW4xczsgLy8gMTAgc2VjCisKK1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpQTEw6OlBMTCgpCisgICAgOiBtUGVyaW9kKC0xKSwKKyAgICAgIG1QaGFzZSgwKSwKKyAgICAgIG1QcmltZWQoZmFsc2UpLAorICAgICAgbVNhbXBsZXNVc2VkRm9yUHJpbWluZygwKSwKKyAgICAgIG1MYXN0VGltZSgtMSksCisgICAgICBtTnVtU2FtcGxlcygwKSB7Cit9CisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OlBMTDo6cmVzZXQoZmxvYXQgZnBzKSB7CisgICAgLy90ZXN0KCk7CisKKyAgICBtU2FtcGxlc1VzZWRGb3JQcmltaW5nID0gMDsKKyAgICBtTGFzdFRpbWUgPSAtMTsKKworICAgIC8vIHNldCB1cCBvciByZXNldCB2aWRlbyBQTEwKKyAgICBpZiAoZnBzIDw9IDAuZikgeworICAgICAgICBtUGVyaW9kID0gLTE7CisgICAgICAgIG1QcmltZWQgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigicmVzZXQgYXQgJS4xZiBmcHMiLCBmcHMpOworICAgICAgICBtUGVyaW9kID0gKG5zZWNzX3QpKDFlOSAvIGZwcyArIDAuNSk7CisgICAgICAgIG1QcmltZWQgPSB0cnVlOworICAgIH0KKworICAgIHJlc3RhcnQoKTsKK30KKworLy8gcmVzZXQgUExMIGJ1dCBrZWVwIHByZXZpb3VzIHBlcmlvZCBlc3RpbWF0ZQordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6UExMOjpyZXN0YXJ0KCkgeworICAgIG1OdW1TYW1wbGVzID0gMDsKKyAgICBtUGhhc2UgPSAtMTsKK30KKworI2lmIDAKKwordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6UExMOjp0ZXN0KCkgeworICAgIG5zZWNzX3QgcGVyaW9kID0gVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OmtOYW5vc0luMXMgLyA2MDsKKyAgICBtVGltZXNbMF0gPSAwOworICAgIG1UaW1lc1sxXSA9IHBlcmlvZDsKKyAgICBtVGltZXNbMl0gPSBwZXJpb2QgKiAzOworICAgIG1UaW1lc1szXSA9IHBlcmlvZCAqIDQ7CisgICAgbVRpbWVzWzRdID0gcGVyaW9kICogNzsKKyAgICBtVGltZXNbNV0gPSBwZXJpb2QgKiA4OworICAgIG1UaW1lc1s2XSA9IHBlcmlvZCAqIDEwOworICAgIG1UaW1lc1s3XSA9IHBlcmlvZCAqIDEyOworICAgIG1OdW1TYW1wbGVzID0gODsKKyAgICBpbnQ2NF90IGEsIGIsIGVycjsKKyAgICBmaXQoMCwgcGVyaW9kICogMTIgLyA3LCA4LCAmYSwgJmIsICZlcnIpOworICAgIC8vIGEgPSAwLjgoNSkrCisgICAgLy8gYiA9IC0wLjE0MDk3KDIpKworICAgIC8vIGVyciA9IDAuMjc1MDU3OCg3MDMpKworICAgIEFMT0dEKCJhPSVsbGQgKCUuNmYpLCBiPSVsbGQgKCUuNmYpLCBlcnI9JWxsZCAoJS42ZikiLAorICAgICAgICAgICAgKGxvbmcgbG9uZylhLCAoYSAvIChmbG9hdCkoMSA8PCBrUHJlY2lzaW9uKSksCisgICAgICAgICAgICAobG9uZyBsb25nKWIsIChiIC8gKGZsb2F0KSgxIDw8IGtQcmVjaXNpb24pKSwKKyAgICAgICAgICAgIChsb25nIGxvbmcpZXJyLCAoZXJyIC8gKGZsb2F0KSgxIDw8IChrUHJlY2lzaW9uICogMikpKSk7Cit9CisKKyNlbmRpZgorCitib29sIFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpQTEw6OmZpdCgKKyAgICAgICAgbnNlY3NfdCBwaGFzZSwgbnNlY3NfdCBwZXJpb2QsIHNpemVfdCBudW1TYW1wbGVzVG9Vc2UsCisgICAgICAgIGludDY0X3QgKmEsIGludDY0X3QgKmIsIGludDY0X3QgKmVycikgeworICAgIGlmIChudW1TYW1wbGVzVG9Vc2UgPiBtTnVtU2FtcGxlcykgeworICAgICAgICBudW1TYW1wbGVzVG9Vc2UgPSBtTnVtU2FtcGxlczsKKyAgICB9CisKKyAgICBpZiAoKHBlcmlvZCA+PiBrUHJlY2lzaW9uKSA9PSAwICkgeworICAgICAgICBBTE9HVygiUGVyaW9kIGlzIDAsIG9yIGFmdGVyIGluY2x1ZGluZyBwcmVjaXNpb24gaXMgMCAtIHdvdWxkIGNhdXNlIGRpdjAsIHJldHVybmluZyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50NjRfdCBzdW1YID0gMDsKKyAgICBpbnQ2NF90IHN1bVhYID0gMDsKKyAgICBpbnQ2NF90IHN1bVhZID0gMDsKKyAgICBpbnQ2NF90IHN1bVlZID0gMDsKKyAgICBpbnQ2NF90IHN1bVkgPSAwOworCisgICAgaW50NjRfdCB4ID0gMDsgLy8geCB1c3VhbGx5IGlzIGluIFswLi5udW1TYW1wbGVzVG9Vc2UpCisgICAgbnNlY3NfdCBsYXN0VGltZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVNhbXBsZXNUb1VzZTsgaSsrKSB7CisgICAgICAgIHNpemVfdCBpeCA9IChtTnVtU2FtcGxlcyAtIG51bVNhbXBsZXNUb1VzZSArIGkpICUga0hpc3RvcnlTaXplOworICAgICAgICBuc2Vjc190IHRpbWUgPSBtVGltZXNbaXhdOworICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgIHggKz0gZGl2Um91bmQodGltZSAtIGxhc3RUaW1lLCBwZXJpb2QpOworICAgICAgICB9CisgICAgICAgIC8vIHkgaXMgdXN1YWxseSBpbiBbLW51bVNhbXBsZXNUb1VzZS4ubnVtU2FtcGxlc1RvVXNlK2tSZWZpdFJlZnJlc2hQZXJpb2Qva01pblBlcmlvZCkgPDwga1ByZWNpc2lvbgorICAgICAgICAvLyAgIGlkZWFsbHkgaW4gWzAuLm51bVNhbXBsZXNUb1VzZSksIGJ1dCBzaGlmdGVkIGJ5IC1udW1TYW1wbGVzVG9Vc2UgZHVyaW5nCisgICAgICAgIC8vICAgcHJpbWluZywgYW5kIHBvc3NpYmx5IHNoaWZ0ZWQgYnkgdXAgdG8ga1JlZml0UmVmcmVzaFBlcmlvZC9rTWluUGVyaW9kCisgICAgICAgIC8vICAgd2hpbGUgd2UgYXJlIG5vdCByZWZpdHRpbmcuCisgICAgICAgIGludDY0X3QgeSA9IGRpdlJvdW5kKHRpbWUgLSBwaGFzZSwgcGVyaW9kID4+IGtQcmVjaXNpb24pOworICAgICAgICBzdW1YICs9IHg7CisgICAgICAgIHN1bVkgKz0geTsKKyAgICAgICAgc3VtWFggKz0geCAqIHg7CisgICAgICAgIHN1bVhZICs9IHggKiB5OworICAgICAgICBzdW1ZWSArPSB5ICogeTsKKyAgICAgICAgbGFzdFRpbWUgPSB0aW1lOworICAgIH0KKworICAgIGludDY0X3QgZGl2ICAgPSAoaW50NjRfdCludW1TYW1wbGVzVG9Vc2UgKiBzdW1YWCAtIHN1bVggKiBzdW1YOworICAgIGlmIChkaXYgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50NjRfdCBhX25vbSA9IChpbnQ2NF90KW51bVNhbXBsZXNUb1VzZSAqIHN1bVhZIC0gc3VtWCAqIHN1bVk7CisgICAgaW50NjRfdCBiX25vbSA9IHN1bVhYICogc3VtWSAgICAgICAgICAgIC0gc3VtWCAqIHN1bVhZOworICAgICphID0gZGl2Um91bmQoYV9ub20sIGRpdik7CisgICAgKmIgPSBkaXZSb3VuZChiX25vbSwgZGl2KTsKKyAgICAvLyBkb24ndCB1c2UgYSBhbmQgYiBkaXJlY3RseSBhcyB0aGUgcm91bmRpbmcgZXJyb3IgaXMgc2lnbmlmaWNhbnQKKyAgICAqZXJyID0gc3VtWVkgLSBkaXZSb3VuZChhX25vbSAqIHN1bVhZICsgYl9ub20gKiBzdW1ZLCBkaXYpOworICAgIEFMT0dWKCJmaXR0aW5nWyV6dV0gYT0lbGxkICglLjZmKSwgYj0lbGxkICglLjZmKSwgZXJyPSVsbGQgKCUuNmYpIiwKKyAgICAgICAgICAgIG51bVNhbXBsZXNUb1VzZSwKKyAgICAgICAgICAgIChsb25nIGxvbmcpKmEsICAgKCphIC8gKGZsb2F0KSgxIDw8IGtQcmVjaXNpb24pKSwKKyAgICAgICAgICAgIChsb25nIGxvbmcpKmIsICAgKCpiIC8gKGZsb2F0KSgxIDw8IGtQcmVjaXNpb24pKSwKKyAgICAgICAgICAgIChsb25nIGxvbmcpKmVyciwgKCplcnIgLyAoZmxvYXQpKDEgPDwgKGtQcmVjaXNpb24gKiAyKSkpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6UExMOjpwcmltZShzaXplX3QgbnVtU2FtcGxlc1RvVXNlKSB7CisgICAgaWYgKG51bVNhbXBsZXNUb1VzZSA+IG1OdW1TYW1wbGVzKSB7CisgICAgICAgIG51bVNhbXBsZXNUb1VzZSA9IG1OdW1TYW1wbGVzOworICAgIH0KKyAgICBDSEVDSyhudW1TYW1wbGVzVG9Vc2UgPj0gMyk7ICAvLyBtdXN0IGhhdmUgYXQgbGVhc3QgMyBzYW1wbGVzCisKKyAgICAvLyBlc3RpbWF0ZSB2aWRlbyBmcmFtZXJhdGUgZnJvbSBkZWx0YXMgYmV0d2VlbiB0aW1lc3RhbXBzLCBhbmQKKyAgICAvLyAybmQgb3JkZXIgZGVsdGFzCisgICAgVmVjdG9yPG5zZWNzX3Q+IGRlbHRhczsKKyAgICBuc2Vjc190IGxhc3RUaW1lLCBmaXJzdFRpbWU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzVG9Vc2U7ICsraSkgeworICAgICAgICBzaXplX3QgaW5kZXggPSAobU51bVNhbXBsZXMgLSBudW1TYW1wbGVzVG9Vc2UgKyBpKSAlIGtIaXN0b3J5U2l6ZTsKKyAgICAgICAgbnNlY3NfdCB0aW1lID0gbVRpbWVzW2luZGV4XTsKKyAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICBpZiAodGltZSAtIGxhc3RUaW1lID4ga01pblBlcmlvZCkgeworICAgICAgICAgICAgICAgIC8vQUxPR1YoImRlbHRhOiAlbGxkIiwgKGxvbmcgbG9uZykodGltZSAtIGxhc3RUaW1lKSk7CisgICAgICAgICAgICAgICAgZGVsdGFzLnB1c2godGltZSAtIGxhc3RUaW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpcnN0VGltZSA9IHRpbWU7CisgICAgICAgIH0KKyAgICAgICAgbGFzdFRpbWUgPSB0aW1lOworICAgIH0KKyAgICBkZWx0YXMuc29ydChjb21wYXJlPG5zZWNzX3Q+KTsKKyAgICBzaXplX3QgbnVtRGVsdGFzID0gZGVsdGFzLnNpemUoKTsKKyAgICBpZiAobnVtRGVsdGFzID4gMSkgeworICAgICAgICBuc2Vjc190IGRlbHRhTWluTGltaXQgPSBtYXgoZGVsdGFzWzBdIC8ga011bHRpcGxlc1RocmVzaG9sZERpdiwga01pblBlcmlvZCk7CisgICAgICAgIG5zZWNzX3QgZGVsdGFNYXhMaW1pdCA9IGRlbHRhc1tudW1EZWx0YXMgLyAyXSAqIGtNdWx0aXBsZXNUaHJlc2hvbGREaXY7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSBudW1EZWx0YXMgLyAyICsgMTsgaSA8IG51bURlbHRhczsgKytpKSB7CisgICAgICAgICAgICBpZiAoZGVsdGFzW2ldID4gZGVsdGFNYXhMaW1pdCkgeworICAgICAgICAgICAgICAgIGRlbHRhcy5yZXNpemUoaSk7CisgICAgICAgICAgICAgICAgbnVtRGVsdGFzID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IG51bURlbHRhczsgKytpKSB7CisgICAgICAgICAgICBuc2Vjc190IGRlbHRhMm5kID0gZGVsdGFzW2ldIC0gZGVsdGFzW2kgLSAxXTsKKyAgICAgICAgICAgIGlmIChkZWx0YTJuZCA+PSBkZWx0YU1pbkxpbWl0KSB7CisgICAgICAgICAgICAgICAgLy9BTE9HVigiZGVsdGEyOiAlbGxkIiwgKGxvbmcgbG9uZykoZGVsdGEybmQpKTsKKyAgICAgICAgICAgICAgICBkZWx0YXMucHVzaChkZWx0YTJuZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB1c2UgdGhlIG9uZSB0aGF0IHlpZWxkcyB0aGUgYmVzdCBtYXRjaAorICAgIGludDY0X3QgYmVzdFNjb3JlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGVsdGFzLnNpemUoKTsgKytpKSB7CisgICAgICAgIG5zZWNzX3QgZGVsdGEgPSBkZWx0YXNbaV07CisgICAgICAgIGludDY0X3Qgc2NvcmUgPSAwOworI2lmIDEKKyAgICAgICAgLy8gc2ltcGxlc3Qgc2NvcmU6IG51bWJlciBvZiBkZWx0YXMgdGhhdCBhcmUgbmVhciBtdWx0aXBsZXMKKyAgICAgICAgc2l6ZV90IG1hdGNoZXMgPSAwOworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGRlbHRhcy5zaXplKCk7ICsraikgeworICAgICAgICAgICAgbnNlY3NfdCBlcnIgPSBwZXJpb2RpY0Vycm9yKGRlbHRhc1tqXSwgZGVsdGEpOworICAgICAgICAgICAgaWYgKGVyciA8IGRlbHRhIC8ga011bHRpcGxlc1RocmVzaG9sZERpdikgeworICAgICAgICAgICAgICAgICsrbWF0Y2hlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzY29yZSA9IG1hdGNoZXM7CisjaWYgMAorICAgICAgICAvLyBjb3VsZCBiZSB3ZWlnaGVkIGJ5IHRoZSAoMSAtIG5vcm1hbGl6ZWQgZXJyb3IpCisgICAgICAgIGlmIChudW1TYW1wbGVzVG9Vc2UgPj0ga01pblNhbXBsZXNUb0VzdGltYXRlUGVyaW9kKSB7CisgICAgICAgICAgICBpbnQ2NF90IGEsIGIsIGVycjsKKyAgICAgICAgICAgIGZpdChmaXJzdFRpbWUsIGRlbHRhLCBudW1TYW1wbGVzVG9Vc2UsICZhLCAmYiwgJmVycik7CisgICAgICAgICAgICBlcnIgPSAoMSA8PCAoMiAqIGtQcmVjaXNpb24pKSAtIGVycjsKKyAgICAgICAgICAgIHNjb3JlICo9IG1heCgwLCBlcnIpOworICAgICAgICB9CisjZW5kaWYKKyNlbHNlCisgICAgICAgIC8vIG9yIHVzZSB0aGUgZXJyb3IgYXMgYSBuZWdhdGl2ZSBzY29yZQorICAgICAgICBpZiAobnVtU2FtcGxlc1RvVXNlID49IGtNaW5TYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCkgeworICAgICAgICAgICAgaW50NjRfdCBhLCBiLCBlcnI7CisgICAgICAgICAgICBmaXQoZmlyc3RUaW1lLCBkZWx0YSwgbnVtU2FtcGxlc1RvVXNlLCAmYSwgJmIsICZlcnIpOworICAgICAgICAgICAgc2NvcmUgPSAtZGVsdGEgKiBlcnI7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBpZiAoaSA9PSAwIHx8IHNjb3JlID4gYmVzdFNjb3JlKSB7CisgICAgICAgICAgICBiZXN0U2NvcmUgPSBzY29yZTsKKyAgICAgICAgICAgIG1QZXJpb2QgPSBkZWx0YTsKKyAgICAgICAgICAgIG1QaGFzZSA9IGZpcnN0VGltZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigicHJpbWluZ1slenVdIHBoYXNlOiVsbGQgcGVyaW9kOiVsbGQiLAorICAgICAgICAgICAgbnVtU2FtcGxlc1RvVXNlLCAobG9uZyBsb25nKW1QaGFzZSwgKGxvbmcgbG9uZyltUGVyaW9kKTsKK30KKworbnNlY3NfdCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6UExMOjphZGRTYW1wbGUobnNlY3NfdCB0aW1lKSB7CisgICAgaWYgKG1MYXN0VGltZSA+PSAwCisgICAgICAgICAgICAvLyBpZiB0aW1lIGdvZXMgYmFja3dhcmQsIG9yIHdlIHNraXBwZWQgcmVuZGVyaW5nCisgICAgICAgICAgICAmJiAodGltZSA+IG1MYXN0VGltZSArIGtNYXhBbGxvd2VkRnJhbWVTa2lwIHx8IHRpbWUgPCBtTGFzdFRpbWUpKSB7CisgICAgICAgIHJlc3RhcnQoKTsKKyAgICB9CisKKyAgICBtTGFzdFRpbWUgPSB0aW1lOworICAgIG1UaW1lc1ttTnVtU2FtcGxlcyAlIGtIaXN0b3J5U2l6ZV0gPSB0aW1lOworICAgICsrbU51bVNhbXBsZXM7CisKKyAgICBib29sIGRvRml0ID0gdGltZSA+IG1SZWZpdEF0OworICAgIGlmICgobVBlcmlvZCA8PSAwIHx8ICFtUHJpbWVkKSAmJiBtTnVtU2FtcGxlcyA+PSBrTWluU2FtcGxlc1RvU3RhcnRQcmltZSkgeworICAgICAgICBwcmltZShrTWluU2FtcGxlc1RvU3RvcFByaW1lKTsKKyAgICAgICAgKyttU2FtcGxlc1VzZWRGb3JQcmltaW5nOworICAgICAgICBkb0ZpdCA9IHRydWU7CisgICAgfQorICAgIGlmIChtUGVyaW9kID4gMCAmJiBtTnVtU2FtcGxlcyA+PSBrTWluU2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QpIHsKKyAgICAgICAgaWYgKG1QaGFzZSA8IDApIHsKKyAgICAgICAgICAgIC8vIGluaXRpYWxpemUgcGhhc2UgdG8gdGhlIGN1cnJlbnQgcmVuZGVyIHRpbWUKKyAgICAgICAgICAgIG1QaGFzZSA9IHRpbWU7CisgICAgICAgICAgICBkb0ZpdCA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoIWRvRml0KSB7CisgICAgICAgICAgICBpbnQ2NF90IGVyciA9IHBlcmlvZGljRXJyb3IodGltZSAtIG1QaGFzZSwgbVBlcmlvZCk7CisgICAgICAgICAgICBkb0ZpdCA9IGVyciA+IG1QZXJpb2QgLyBrUmVGaXRUaHJlc2hvbGREaXY7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZG9GaXQpIHsKKyAgICAgICAgICAgIGludDY0X3QgYSwgYiwgZXJyOworICAgICAgICAgICAgaWYgKCFmaXQobVBoYXNlLCBtUGVyaW9kLCBrTWF4U2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QsICZhLCAmYiwgJmVycikpIHsKKyAgICAgICAgICAgICAgICAvLyBzYW1wbGVzIGFyZSBub3Qgc3VpdGFibGUgZm9yIGZpdHRpbmcuICB0aGlzIG1lYW5zIHRoZXkgYXJlCisgICAgICAgICAgICAgICAgLy8gYWxzbyBub3Qgc3VpdGFibGUgZm9yIHByaW1pbmcuCisgICAgICAgICAgICAgICAgQUxPR1YoImNvdWxkIG5vdCBmaXQgLSBrZWVwaW5nIG9sZCBwZXJpb2Q6JWxsZCIsIChsb25nIGxvbmcpbVBlcmlvZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1QZXJpb2Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1SZWZpdEF0ID0gdGltZSArIGtSZWZpdFJlZnJlc2hQZXJpb2Q7CisKKyAgICAgICAgICAgIG1QaGFzZSArPSAobVBlcmlvZCAqIGIpID4+IGtQcmVjaXNpb247CisgICAgICAgICAgICBtUGVyaW9kID0gKG1QZXJpb2QgKiBhKSA+PiBrUHJlY2lzaW9uOworICAgICAgICAgICAgQUxPR1YoIm5ldyBwaGFzZTolbGxkIHBlcmlvZDolbGxkIiwgKGxvbmcgbG9uZyltUGhhc2UsIChsb25nIGxvbmcpbVBlcmlvZCk7CisKKyAgICAgICAgICAgIGlmIChlcnIgPCBrRXJyb3JUaHJlc2hvbGQpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1QcmltZWQgJiYgbVNhbXBsZXNVc2VkRm9yUHJpbWluZyA+PSBrTWluU2FtcGxlc1RvU3RvcFByaW1lKSB7CisgICAgICAgICAgICAgICAgICAgIG1QcmltZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVByaW1lZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1TYW1wbGVzVXNlZEZvclByaW1pbmcgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtUGVyaW9kOworfQorCituc2Vjc190IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpQTEw6OmdldFBlcmlvZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVByaW1lZCA/IG1QZXJpb2QgOiAwOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lIFNjaGVkdWxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSgpCisgICAgOiBtVnN5bmNUaW1lKDApLAorICAgICAgbVZzeW5jUGVyaW9kKDApLAorICAgICAgbVZzeW5jUmVmcmVzaEF0KDApLAorICAgICAgbUxhc3RWc3luY1RpbWUoLTEpLAorICAgICAgbVRpbWVDb3JyZWN0aW9uKDApIHsKK30KKwordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6aW5pdChmbG9hdCB2aWRlb0ZwcykgeworICAgIHVwZGF0ZVZzeW5jKCk7CisKKyAgICBtTGFzdFZzeW5jVGltZSA9IC0xOworICAgIG1UaW1lQ29ycmVjdGlvbiA9IDA7CisKKyAgICBtUGxsLnJlc2V0KHZpZGVvRnBzKTsKK30KKwordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6cmVzdGFydCgpIHsKKyAgICBtTGFzdFZzeW5jVGltZSA9IC0xOworICAgIG1UaW1lQ29ycmVjdGlvbiA9IDA7CisKKyAgICBtUGxsLnJlc3RhcnQoKTsKK30KKworbnNlY3NfdCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6Z2V0VnN5bmNQZXJpb2QoKSB7CisgICAgaWYgKG1Wc3luY1BlcmlvZCA+IDApIHsKKyAgICAgICAgcmV0dXJuIG1Wc3luY1BlcmlvZDsKKyAgICB9CisgICAgcmV0dXJuIGtEZWZhdWx0VnN5bmNQZXJpb2Q7Cit9CisKK2Zsb2F0IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpnZXRGcmFtZVJhdGUoKSB7CisgICAgbnNlY3NfdCB2aWRlb1BlcmlvZCA9IG1QbGwuZ2V0UGVyaW9kKCk7CisgICAgaWYgKHZpZGVvUGVyaW9kID4gMCkgeworICAgICAgICByZXR1cm4gMWU5IC8gdmlkZW9QZXJpb2Q7CisgICAgfQorICAgIHJldHVybiAwLmY7Cit9CisKK25zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OnNjaGVkdWxlKG5zZWNzX3QgcmVuZGVyVGltZSkgeworICAgIG5zZWNzX3Qgb3JpZ1JlbmRlclRpbWUgPSByZW5kZXJUaW1lOworCisgICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7CisgICAgaWYgKG5vdyA+PSBtVnN5bmNSZWZyZXNoQXQpIHsKKyAgICAgICAgdXBkYXRlVnN5bmMoKTsKKyAgICB9CisKKyAgICAvLyB3aXRob3V0IFZTWU5DIGluZm8sIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8KKyAgICBpZiAobVZzeW5jUGVyaW9kID09IDApIHsKKyAgICAgICAgQUxPR1YoIm5vIHZzeW5jOiByZW5kZXI9JWxsZCIsIChsb25nIGxvbmcpcmVuZGVyVGltZSk7CisgICAgICAgIHJldHVybiByZW5kZXJUaW1lOworICAgIH0KKworICAgIC8vIGVuc3VyZSB2c3luYyB0aW1lIGlzIHdlbGwgYmVmb3JlIChjb3JyZWN0ZWQpIHJlbmRlciB0aW1lCisgICAgaWYgKG1Wc3luY1RpbWUgPiByZW5kZXJUaW1lIC0gNCAqIG1Wc3luY1BlcmlvZCkgeworICAgICAgICBtVnN5bmNUaW1lIC09CisgICAgICAgICAgICAoKG1Wc3luY1RpbWUgLSByZW5kZXJUaW1lKSAvIG1Wc3luY1BlcmlvZCArIDUpICogbVZzeW5jUGVyaW9kOworICAgIH0KKworICAgIC8vIFZpZGVvIHByZXNlbnRhdGlvbiB0YWtlcyBwbGFjZSBhdCB0aGUgVlNZTkMgX2FmdGVyXyByZW5kZXJUaW1lLiAgQWRqdXN0IHJlbmRlclRpbWUKKyAgICAvLyBzbyB0aGlzIGVmZmVjdGl2ZWx5IGJlY29tZXMgYSByb3VuZGluZyBvcGVyYXRpb24gKHRvIHRoZSBfY2xvc2VzdF8gVlNZTkMuKQorICAgIHJlbmRlclRpbWUgLT0gbVZzeW5jUGVyaW9kIC8gMjsKKworICAgIGNvbnN0IG5zZWNzX3QgdmlkZW9QZXJpb2QgPSBtUGxsLmFkZFNhbXBsZShvcmlnUmVuZGVyVGltZSk7CisgICAgaWYgKHZpZGVvUGVyaW9kID4gMCkgeworICAgICAgICAvLyBTbW9vdGggb3V0IHJlbmRlcmluZworICAgICAgICBzaXplX3QgTiA9IDEyOworICAgICAgICBuc2Vjc190IGZpdmVTaXh0aERldiA9CisgICAgICAgICAgICBhYnMoKCh2aWRlb1BlcmlvZCAqIDUgKyBtVnN5bmNQZXJpb2QpICUgKG1Wc3luY1BlcmlvZCAqIDYpKSAtIG1Wc3luY1BlcmlvZCkKKyAgICAgICAgICAgICAgICAgICAgLyAobVZzeW5jUGVyaW9kIC8gMTAwKTsKKyAgICAgICAgLy8gdXNlIDIwIHNhbXBsZXMgaWYgd2UgYXJlIGRvaW5nIDU6NiByYXRpbyArLSAxJSAoZS5nLiBwbGF5aW5nIDUwSHogb24gNjBIeikKKyAgICAgICAgaWYgKGZpdmVTaXh0aERldiA8IDEyKSB7ICAvKiAxMiUgLyA2ID0gMiUgKi8KKyAgICAgICAgICAgIE4gPSAyMDsKKyAgICAgICAgfQorCisgICAgICAgIG5zZWNzX3Qgb2Zmc2V0ID0gMDsKKyAgICAgICAgbnNlY3NfdCBlZGdlUmVtYWluZGVyID0gMDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPD0gTjsgaSsrKSB7CisgICAgICAgICAgICBvZmZzZXQgKz0KKyAgICAgICAgICAgICAgICAocmVuZGVyVGltZSArIG1UaW1lQ29ycmVjdGlvbiArIHZpZGVvUGVyaW9kICogaSAtIG1Wc3luY1RpbWUpICUgbVZzeW5jUGVyaW9kOworICAgICAgICAgICAgZWRnZVJlbWFpbmRlciArPSAodmlkZW9QZXJpb2QgKiBpKSAlIG1Wc3luY1BlcmlvZDsKKyAgICAgICAgfQorICAgICAgICBtVGltZUNvcnJlY3Rpb24gKz0gbVZzeW5jUGVyaW9kIC8gMiAtIG9mZnNldCAvIChuc2Vjc190KU47CisgICAgICAgIHJlbmRlclRpbWUgKz0gbVRpbWVDb3JyZWN0aW9uOworICAgICAgICBuc2Vjc190IGNvcnJlY3Rpb25MaW1pdCA9IG1Wc3luY1BlcmlvZCAqIDMgLyA1OworICAgICAgICBlZGdlUmVtYWluZGVyID0gYWJzKGVkZ2VSZW1haW5kZXIgLyAobnNlY3NfdClOIC0gbVZzeW5jUGVyaW9kIC8gMik7CisgICAgICAgIGlmIChlZGdlUmVtYWluZGVyIDw9IG1Wc3luY1BlcmlvZCAvIDMpIHsKKyAgICAgICAgICAgIGNvcnJlY3Rpb25MaW1pdCAvPSAyOworICAgICAgICB9CisKKyAgICAgICAgLy8gZXN0aW1hdGUgaG93IG1hbnkgVlNZTkNzIGEgZnJhbWUgd2lsbCBzcGVuZCBvbiB0aGUgZGlzcGxheQorICAgICAgICBuc2Vjc190IG5leHRWc3luY1RpbWUgPQorICAgICAgICAgICAgcmVuZGVyVGltZSArIG1Wc3luY1BlcmlvZCAtICgocmVuZGVyVGltZSAtIG1Wc3luY1RpbWUpICUgbVZzeW5jUGVyaW9kKTsKKyAgICAgICAgaWYgKG1MYXN0VnN5bmNUaW1lID49IDApIHsKKyAgICAgICAgICAgIHNpemVfdCBtaW5Wc3luY3NQZXJGcmFtZSA9IHZpZGVvUGVyaW9kIC8gbVZzeW5jUGVyaW9kOworICAgICAgICAgICAgc2l6ZV90IHZzeW5jc0Zvckxhc3RGcmFtZSA9IGRpdlJvdW5kKG5leHRWc3luY1RpbWUgLSBtTGFzdFZzeW5jVGltZSwgbVZzeW5jUGVyaW9kKTsKKyAgICAgICAgICAgIGJvb2wgdnN5bmNzUGVyRnJhbWVBcmVOZWFybHlDb25zdGFudCA9CisgICAgICAgICAgICAgICAgcGVyaW9kaWNFcnJvcih2aWRlb1BlcmlvZCwgbVZzeW5jUGVyaW9kKSAvIChtVnN5bmNQZXJpb2QgLyAyMCkgPT0gMDsKKworICAgICAgICAgICAgaWYgKG1UaW1lQ29ycmVjdGlvbiA+IGNvcnJlY3Rpb25MaW1pdCAmJgorICAgICAgICAgICAgICAgICAgICAodnN5bmNzUGVyRnJhbWVBcmVOZWFybHlDb25zdGFudCB8fCB2c3luY3NGb3JMYXN0RnJhbWUgPiBtaW5Wc3luY3NQZXJGcmFtZSkpIHsKKyAgICAgICAgICAgICAgICAvLyByZW1vdmUgYSBWU1lOQworICAgICAgICAgICAgICAgIG1UaW1lQ29ycmVjdGlvbiAtPSBtVnN5bmNQZXJpb2QgLyAyOworICAgICAgICAgICAgICAgIHJlbmRlclRpbWUgLT0gbVZzeW5jUGVyaW9kIC8gMjsKKyAgICAgICAgICAgICAgICBuZXh0VnN5bmNUaW1lIC09IG1Wc3luY1BlcmlvZDsKKyAgICAgICAgICAgICAgICBpZiAodnN5bmNzRm9yTGFzdEZyYW1lID4gMCkKKyAgICAgICAgICAgICAgICAgICAgLS12c3luY3NGb3JMYXN0RnJhbWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1UaW1lQ29ycmVjdGlvbiA8IC1jb3JyZWN0aW9uTGltaXQgJiYKKyAgICAgICAgICAgICAgICAgICAgKHZzeW5jc1BlckZyYW1lQXJlTmVhcmx5Q29uc3RhbnQgfHwgdnN5bmNzRm9yTGFzdEZyYW1lID09IG1pblZzeW5jc1BlckZyYW1lKSkgeworICAgICAgICAgICAgICAgIC8vIGFkZCBhIFZTWU5DCisgICAgICAgICAgICAgICAgbVRpbWVDb3JyZWN0aW9uICs9IG1Wc3luY1BlcmlvZCAvIDI7CisgICAgICAgICAgICAgICAgcmVuZGVyVGltZSArPSBtVnN5bmNQZXJpb2QgLyAyOworICAgICAgICAgICAgICAgIG5leHRWc3luY1RpbWUgKz0gbVZzeW5jUGVyaW9kOworICAgICAgICAgICAgICAgIGlmICh2c3luY3NGb3JMYXN0RnJhbWUgPCBVTE9OR19NQVgpCisgICAgICAgICAgICAgICAgICAgICsrdnN5bmNzRm9yTGFzdEZyYW1lOworICAgICAgICAgICAgfSBlbHNlIGlmIChtVGltZUNvcnJlY3Rpb24gPCAtY29ycmVjdGlvbkxpbWl0ICogMgorICAgICAgICAgICAgICAgICAgICB8fCBtVGltZUNvcnJlY3Rpb24gPiBjb3JyZWN0aW9uTGltaXQgKiAyKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImNvcnJlY3Rpb24gYmV5b25kIGxpbWl0OiAlbGxkIHZzICVsbGQgKHZzeW5jcyBmb3IgbGFzdCBmcmFtZTogJXp1LCBtaW46ICV6dSkiCisgICAgICAgICAgICAgICAgICAgICAgICAiIHJlc3RhcnRpbmcuIHJlbmRlcj0lbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbVRpbWVDb3JyZWN0aW9uLCAobG9uZyBsb25nKWNvcnJlY3Rpb25MaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZzeW5jc0Zvckxhc3RGcmFtZSwgbWluVnN5bmNzUGVyRnJhbWUsIChsb25nIGxvbmcpb3JpZ1JlbmRlclRpbWUpOworICAgICAgICAgICAgICAgIHJlc3RhcnQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ1JlbmRlclRpbWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFUUkFDRV9JTlQoIkZSQU1FX1ZTWU5DUyIsIHZzeW5jc0Zvckxhc3RGcmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgbUxhc3RWc3luY1RpbWUgPSBuZXh0VnN5bmNUaW1lOworICAgIH0KKworICAgIC8vIGFsaWduIHJlbmRlcnRpbWUgdG8gdGhlIGNlbnRlciBiZXR3ZWVuIFZTWU5DIGVkZ2VzCisgICAgcmVuZGVyVGltZSAtPSAocmVuZGVyVGltZSAtIG1Wc3luY1RpbWUpICUgbVZzeW5jUGVyaW9kOworICAgIHJlbmRlclRpbWUgKz0gbVZzeW5jUGVyaW9kIC8gMjsKKyAgICBBTE9HVigiYWRqdXN0aW5nIHJlbmRlcjogJWxsZCA9PiAlbGxkIiwgKGxvbmcgbG9uZylvcmlnUmVuZGVyVGltZSwgKGxvbmcgbG9uZylyZW5kZXJUaW1lKTsKKyAgICBBVFJBQ0VfSU5UKCJGUkFNRV9GTElQX0lOKG1zKSIsIChyZW5kZXJUaW1lIC0gbm93KSAvIDEwMDAwMDApOworICAgIHJldHVybiByZW5kZXJUaW1lOworfQorCitWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6flZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlKCkge30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0FuZHJvaWQuYnAKaW5kZXggZGI4NjIxOC4uMjE4ZmUxNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9BbmRyb2lkLmJwCkBAIC00LDcgKzQsNyBAQAogICAgIHZuZGs6IHsKICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICB9LAotCisgICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLAogICAgIHNyY3M6IFsKICAgICAgICAgIkNvbnZlcnNpb24uY3BwIiwKICAgICAgICAgIkZyYW1lRHJvcHBlci5jcHAiLApAQCAtMjUsNyArMjUsNiBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmd1aSIsCkBAIC0zOCw4ICszNyw2IEBACiAgICAgICAgICJsaWJ1dGlscyIsCiAKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKLQotICAgICAgICAibGlibmF0aXZld2luZG93IiwgLy8gVE9ETyhiLzYyOTIzNDc5KTogdXNlIGhlYWRlciBsaWJyYXJ5CiAgICAgXSwKIAogICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0NvbnZlcnNpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29udmVyc2lvbi5jcHAKaW5kZXggZmZlZDAwNS4uOTFkN2M3NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29udmVyc2lvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29udmVyc2lvbi5jcHAKQEAgLTk4LDYgKzk4LDE3IEBACiAgKi8KIAogLyoqCisgKiBcYnJpZWYgQ29udmVydCBgUmV0dXJuPHZvaWQ+YCB0byBgc3RhdHVzX3RgLiBUaGlzIGlzIGZvciBsZWdhY3kgYmluZGVyIGNhbGxzLgorICoKKyAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBSZXR1cm48dm9pZD5gLgorICogXHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBgc3RhdHVzX3RgLgorICovCisvLyBjb252ZXJ0OiBSZXR1cm48dm9pZD4gLT4gc3RhdHVzX3QKK3N0YXR1c190IHRvU3RhdHVzVChSZXR1cm48dm9pZD4gY29uc3QmIHQpIHsKKyAgICByZXR1cm4gdC5pc09rKCkgPyBPSyA6ICh0LmlzRGVhZE9iamVjdCgpID8gREVBRF9PQkpFQ1QgOiBVTktOT1dOX0VSUk9SKTsKK30KKworLyoqCiAgKiBcYnJpZWYgQ29udmVydCBgUmV0dXJuPHZvaWQ+YCB0byBgYmluZGVyOjpTdGF0dXNgLgogICoKICAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBSZXR1cm48dm9pZD5gLgpAQCAtMTA3LDIyICsxMTgsMTEgQEAKIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgdG9CaW5kZXJTdGF0dXMoCiAgICAgICAgIFJldHVybjx2b2lkPiBjb25zdCYgdCkgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZSgKLSAgICAgICAgICAgIHQuaXNPaygpID8gT0sgOiBVTktOT1dOX0VSUk9SLAorICAgICAgICAgICAgdG9TdGF0dXNUKHQpLAogICAgICAgICAgICAgdC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwogfQogCiAvKioKLSAqIFxicmllZiBDb252ZXJ0IGBSZXR1cm48dm9pZD5gIHRvIGBzdGF0dXNfdGAuIFRoaXMgaXMgZm9yIGxlZ2FjeSBiaW5kZXIgY2FsbHMuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYFJldHVybjx2b2lkPmAuCi0gKiBccmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIGBzdGF0dXNfdGAuCi0gKi8KLS8vIGNvbnZlcnQ6IFJldHVybjx2b2lkPiAtPiBzdGF0dXNfdAotc3RhdHVzX3QgdG9TdGF0dXNUKFJldHVybjx2b2lkPiBjb25zdCYgdCkgewotICAgIHJldHVybiB0LmlzT2soKSA/IE9LIDogVU5LTk9XTl9FUlJPUjsKLX0KLQotLyoqCiAgKiBcYnJpZWYgV3JhcCBgbmF0aXZlX2hhbmRsZV90KmAgaW4gYGhpZGxfaGFuZGxlYC4KICAqCiAgKiBccGFyYW1baW5dIG5oIFRoZSBzb3VyY2UgYG5hdGl2ZV9oYW5kbGVfdCpgLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmNwcAppbmRleCBkZDAzZDM4Li44YzFkYTc2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmNwcApAQCAtNzY3LDcgKzc2Nyw3IEBACiAgICAgICAgICAgICBkb3VibGUgbkZyYW1lcyA9ICh0aW1lVXMgLSBtUHJldkNhcHR1cmVVcykgKiBtQ2FwdHVyZUZwcyAvIDEwMDAwMDA7CiAgICAgICAgICAgICBpZiAobkZyYW1lcyA8IDAuNSAtIGtUaW1lc3RhbXBGbHVjdHVhdGlvbikgewogICAgICAgICAgICAgICAgIC8vIHNraXAgdGhpcyBmcmFtZSBhcyBpdCdzIHRvbyBjbG9zZSB0byBwcmV2aW91cyBjYXB0dXJlCi0gICAgICAgICAgICAgICAgQUxPR1YoInNraXBwaW5nIGZyYW1lLCB0aW1lVXMgJWxsZCIsIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4odGltZVVzKSk7CisgICAgICAgICAgICAgICAgQUxPR0QoInNraXBwaW5nIGZyYW1lLCB0aW1lVXMgJWxsZCIsIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4odGltZVVzKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG5GcmFtZXMgPD0gMS4wKSB7CkBAIC0xMTA2LDYgKzExMDYsMTQgQEAKICAgICAgICAgY29uc3VtZXJVc2FnZSB8PSBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVI7CiAgICAgICAgIG1Db25zdW1lci0+c2V0Q29uc3VtZXJVc2FnZUJpdHMoY29uc3VtZXJVc2FnZSk7CiAKKyAgICAgICAgLy8gU2V0IGltcGwuIGRlZmluZWQgZm9ybWF0IGFzIGRlZmF1bHQuIERlcGVuZGluZyBvbiB0aGUgdXNhZ2UgZmxhZ3MKKyAgICAgICAgLy8gdGhlIGRldmljZS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiB3aWxsIGRlcml2ZSB0aGUgZXhhY3QgZm9ybWF0LgorICAgICAgICBlcnIgPSBtQ29uc3VtZXItPnNldERlZmF1bHRCdWZmZXJGb3JtYXQoSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEKTsKKyAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjb25maWd1cmUgc3VyZmFjZSBkZWZhdWx0IGZvcm1hdCByZXQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKwogICAgICAgICAvLyBTZXRzIHRoZSBkZWZhdWx0IGJ1ZmZlciBkYXRhIHNwYWNlCiAgICAgICAgIEFMT0dEKCJzZXR0aW5nIGRhdGFzcGFjZTogJSN4LCBhY3F1aXJlZD0lZCIsIGRhdGFTcGFjZSwgbU51bU91dHN0YW5kaW5nQWNxdWlyZXMpOwogICAgICAgICBtQ29uc3VtZXItPnNldERlZmF1bHRCdWZmZXJEYXRhU3BhY2UoKGFuZHJvaWRfZGF0YXNwYWNlKWRhdGFTcGFjZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmNwcAppbmRleCAzNzlkNDFlLi5lMGYyNjgzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5jcHAKQEAgLTEwNTgsOCArMTA1OCw4IEBACiAgICAgfQogfQogCi1PTVhfRVJST1JUWVBFIFNvZnRBVkM6OnNldENvbmZpZygKLSAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBfcGFyYW1zKSB7CitPTVhfRVJST1JUWVBFIFNvZnRBVkM6OmludGVybmFsU2V0Q29uZmlnKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIF9wYXJhbXMsIGJvb2wgKmZyYW1lQ29uZmlnKSB7CiAgICAgc3dpdGNoICgoaW50KWluZGV4KSB7CiAgICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnVmlkZW9JbnRyYVZPUFJlZnJlc2g6CiAgICAgICAgIHsKQEAgLTExMjUsNyArMTEyNSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OnNldENvbmZpZyhpbmRleCwgX3BhcmFtcyk7CisgICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxTZXRDb25maWcoaW5kZXgsIF9wYXJhbXMsIGZyYW1lQ29uZmlnKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmgKaW5kZXggYTQzY2RmMS4uODI1M2I3ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmgKQEAgLTIxOSw4ICsyMTksOCBAQAogICAgIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRCaXRyYXRlUGFyYW1zKAogICAgICAgICBjb25zdCBPTVhfVklERU9fUEFSQU1fQklUUkFURVRZUEUgKmJpdHJhdGUpOwogCi0gICAgT01YX0VSUk9SVFlQRSBzZXRDb25maWcoCi0gICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgX3BhcmFtcyk7CisgICAgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldENvbmZpZygKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBfcGFyYW1zLCBib29sICpmcmFtZUNvbmZpZyk7CiAKICAgICBPTVhfRVJST1JUWVBFIGdldENvbmZpZygKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBfcGFyYW1zKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL0FuZHJvaWQuYnAKaW5kZXggMTY3NGNiMi4uM2Q0YTQ0ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL0FuZHJvaWQuYnAKQEAgLTI5LDcgKzI5LDYgQEAKICAgICB9LAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZmxhY2RlYyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmNwcAppbmRleCA0ZGIwMDYwLi44NDJhN2NlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmNwcApAQCAtODksMTIgKzg5LDEyIEBACiAgICAgZGVmLmVEaXIgPSBPTVhfRGlyT3V0cHV0OwogICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtT3V0cHV0QnVmZmVyczsKICAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gZGVmLm5CdWZmZXJDb3VudE1pbjsKLSAgICBkZWYubkJ1ZmZlclNpemUgPSA0MDk2ICogRkxBQ0RlY29kZXI6OmtNYXhDaGFubmVsczsKKyAgICBkZWYubkJ1ZmZlclNpemUgPSBrTnVtU2FtcGxlc1BlckZyYW1lICogRkxBQ0RlY29kZXI6OmtNYXhDaGFubmVscyAqIHNpemVvZihmbG9hdCk7CiAgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CiAgICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CiAgICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpbkF1ZGlvOwogICAgIGRlZi5iQnVmZmVyc0NvbnRpZ3VvdXMgPSBPTVhfRkFMU0U7Ci0gICAgZGVmLm5CdWZmZXJBbGlnbm1lbnQgPSAyOworICAgIGRlZi5uQnVmZmVyQWxpZ25tZW50ID0gc2l6ZW9mKGZsb2F0KTsKIAogICAgIGRlZi5mb3JtYXQuYXVkaW8uY01JTUVUeXBlID0gY29uc3RfY2FzdDxjaGFyICo+KCJhdWRpby9yYXciKTsKICAgICBkZWYuZm9ybWF0LmF1ZGlvLnBOYXRpdmVSZW5kZXIgPSBOVUxMOwpAQCAtMTczLDcgKzE3Myw3IEBACiAgICAgICAgICAgICAgICAgZmxhY1BhcmFtcy0+bkNoYW5uZWxzID0gbVN0cmVhbUluZm8uY2hhbm5lbHM7CiAgICAgICAgICAgICAgICAgZmxhY1BhcmFtcy0+blNhbXBsZVJhdGUgPSBtU3RyZWFtSW5mby5zYW1wbGVfcmF0ZTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmxhY1BhcmFtcy0+bkNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgICAgICBmbGFjUGFyYW1zLT5uQ2hhbm5lbHMgPSAyOwogICAgICAgICAgICAgICAgIGZsYWNQYXJhbXMtPm5TYW1wbGVSYXRlID0gNDQxMDA7CiAgICAgICAgICAgICB9CiAKQEAgLTE5NSwxMCArMTk1LDEwIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBvcnRJbmRleDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcGNtUGFyYW1zLT5lTnVtRGF0YSA9IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkOworICAgICAgICAgICAgcGNtUGFyYW1zLT5lTnVtRGF0YSA9IG1OdW1lcmljYWxEYXRhOwogICAgICAgICAgICAgcGNtUGFyYW1zLT5lRW5kaWFuID0gT01YX0VuZGlhbkJpZzsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+YkludGVybGVhdmVkID0gT01YX1RSVUU7Ci0gICAgICAgICAgICBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPSAxNjsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSA9IG1CaXRzUGVyU2FtcGxlOwogICAgICAgICAgICAgcGNtUGFyYW1zLT5lUENNTW9kZSA9IE9NWF9BVURJT19QQ01Nb2RlTGluZWFyOwogICAgICAgICAgICAgcGNtUGFyYW1zLT5lQ2hhbm5lbE1hcHBpbmdbMF0gPSBPTVhfQVVESU9fQ2hhbm5lbExGOwogICAgICAgICAgICAgcGNtUGFyYW1zLT5lQ2hhbm5lbE1hcHBpbmdbMV0gPSBPTVhfQVVESU9fQ2hhbm5lbFJGOwpAQCAtMjExLDcgKzIxMSw3IEBACiAgICAgICAgICAgICAgICAgcGNtUGFyYW1zLT5uQ2hhbm5lbHMgPSBtU3RyZWFtSW5mby5jaGFubmVsczsKICAgICAgICAgICAgICAgICBwY21QYXJhbXMtPm5TYW1wbGluZ1JhdGUgPSBtU3RyZWFtSW5mby5zYW1wbGVfcmF0ZTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcGNtUGFyYW1zLT5uQ2hhbm5lbHMgPSAxOworICAgICAgICAgICAgICAgIHBjbVBhcmFtcy0+bkNoYW5uZWxzID0gMjsKICAgICAgICAgICAgICAgICBwY21QYXJhbXMtPm5TYW1wbGluZ1JhdGUgPSA0NDEwMDsKICAgICAgICAgICAgIH0KIApAQCAtMjgxLDYgKzI4MSwxOSBAQAogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmIChwY21QYXJhbXMtPmVOdW1EYXRhID09IE9NWF9OdW1lcmljYWxEYXRhRmxvYXQgJiYgcGNtUGFyYW1zLT5uQml0UGVyU2FtcGxlID09IDMyKSB7CisgICAgICAgICAgICAgICAgbU51bWVyaWNhbERhdGEgPSBPTVhfTnVtZXJpY2FsRGF0YUZsb2F0OworICAgICAgICAgICAgICAgIG1CaXRzUGVyU2FtcGxlID0gMzI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBjbVBhcmFtcy0+ZU51bURhdGEgPT0gT01YX051bWVyaWNhbERhdGFTaWduZWQKKyAgICAgICAgICAgICAgICAgICAgICYmIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSA9PSAxNikgeworICAgICAgICAgICAgICAgIG1OdW1lcmljYWxEYXRhID0gT01YX051bWVyaWNhbERhdGFTaWduZWQ7CisgICAgICAgICAgICAgICAgbUJpdHNQZXJTYW1wbGUgPSAxNjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgZU51bURhdGEgJWQsIG5CaXRzUGVyU2FtcGxlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZU51bURhdGEsIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIApAQCAtMzAxLDExICszMTQsMTMgQEAKICAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoMCk7CiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZSgxKTsKIAorICAgIGNvbnN0IGJvb2wgb3V0cHV0RmxvYXQgPSBtTnVtZXJpY2FsRGF0YSA9PSBPTVhfTnVtZXJpY2FsRGF0YUZsb2F0OworCiAgICAgQUxPR1YoIm9uUXVldWVGaWxsZWQgJWQvJWQ6IiwgaW5RdWV1ZS5lbXB0eSgpLCBvdXRRdWV1ZS5lbXB0eSgpKTsKICAgICB3aGlsZSAoKCFpblF1ZXVlLmVtcHR5KCkgfHwgbVNhd0lucHV0RU9TKSAmJiAhb3V0UXVldWUuZW1wdHkoKSAmJiAhbUZpbmlzaGVkRGVjb2RlcikgewogICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CiAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOwotICAgICAgICBpbnQxNl90ICpvdXRCdWZmZXIgPSByZWludGVycHJldF9jYXN0PGludDE2X3QgKj4ob3V0SGVhZGVyLT5wQnVmZmVyICsgb3V0SGVhZGVyLT5uT2Zmc2V0KTsKKyAgICAgICAgdm9pZCAqb3V0QnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkICo+KG91dEhlYWRlci0+cEJ1ZmZlciArIG91dEhlYWRlci0+bk9mZnNldCk7CiAgICAgICAgIHNpemVfdCBvdXRCdWZmZXJTaXplID0gb3V0SGVhZGVyLT5uQWxsb2NMZW4gLSBvdXRIZWFkZXItPm5PZmZzZXQ7CiAgICAgICAgIGludDY0X3QgdGltZVN0YW1wID0gMDsKIApAQCAtMzc0LDcgKzM4OSw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHN0YXR1c190IGRlY29kZXJFcnIgPSBtRkxBQ0RlY29kZXItPmRlY29kZU9uZUZyYW1lKAotICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgsIG91dEJ1ZmZlciwgJm91dEJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgsIG91dEJ1ZmZlciwgJm91dEJ1ZmZlclNpemUsIG91dHB1dEZsb2F0KTsKICAgICAgICAgICAgIGlmIChkZWNvZGVyRXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIm9uUXVldWVGaWxsZWQ6IEZMQUNEZWNvZGVyIGRlY29kZU9uZUZyYW1lIHJldHVybnMgZXJyb3IgJWQiLCBkZWNvZGVyRXJyKTsKICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwpAQCAtMzkzLDcgKzQwOCw5IEBACiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAobVNhd0lucHV0RU9TKSB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBkZWNvZGVyRXJyID0gbUZMQUNEZWNvZGVyLT5kZWNvZGVPbmVGcmFtZShOVUxMLCAwLCBvdXRCdWZmZXIsICZvdXRCdWZmZXJTaXplKTsKKyAgICAgICAgICAgIHN0YXR1c190IGRlY29kZXJFcnIgPSBtRkxBQ0RlY29kZXItPmRlY29kZU9uZUZyYW1lKAorICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIGluQnVmZmVyICovLCAwIC8qIGluQnVmZmVyTGVuICovLAorICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXIsICZvdXRCdWZmZXJTaXplLCBvdXRwdXRGbG9hdCk7CiAgICAgICAgICAgICBtRmluaXNoZWREZWNvZGVyID0gdHJ1ZTsKICAgICAgICAgICAgIGlmIChkZWNvZGVyRXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIm9uUXVldWVGaWxsZWQ6IEZMQUNEZWNvZGVyIGZpbmlzaCByZXR1cm5zIGVycm9yICVkIiwgZGVjb2RlckVycik7CkBAIC00NTYsNyArNDczLDggQEAKICAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19FTkFCTEVEOwogICAgICAgICAgICAgUG9ydEluZm8gKmluZm8gPSBlZGl0UG9ydEluZm8oMSAvKiBwb3J0SW5kZXggKi8pOwogICAgICAgICAgICAgaWYgKCFpbmZvLT5tRGVmLmJFbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgaW5mby0+bURlZi5uQnVmZmVyU2l6ZSA9IG1TdHJlYW1JbmZvLm1heF9ibG9ja3NpemUgKiBtU3RyZWFtSW5mby5jaGFubmVscyAqIDI7CisgICAgICAgICAgICAgICAgaW5mby0+bURlZi5uQnVmZmVyU2l6ZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtSW5mby5tYXhfYmxvY2tzaXplICogbVN0cmVhbUluZm8uY2hhbm5lbHMgKiBzaXplb2YoZmxvYXQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuaAppbmRleCBiNjNmN2FkLi5iYTAyMDc0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5oCkBAIC00NSwxMCArNDUsMTQgQEAKICAgICB2aXJ0dWFsIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOwogCiBwcml2YXRlOgorICAgIHN0YXRpYyBjb25zdGV4cHIgdW5zaWduZWQgaW50IGtOdW1TYW1wbGVzUGVyRnJhbWUgPSAyMDQ4OyAvLyBhZGp1c3RlZCBiYXNlZCBvbiBzdHJlYW0uCisKICAgICBlbnVtIHsKICAgICAgICAga051bUlucHV0QnVmZmVycyAgID0gNCwKICAgICAgICAga051bU91dHB1dEJ1ZmZlcnMgID0gNCwKICAgICB9OworICAgIE9NWF9OVU1FUklDQUxEQVRBVFlQRSBtTnVtZXJpY2FsRGF0YSA9IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkOworICAgIE9NWF9VMzIgbUJpdHNQZXJTYW1wbGUgPSAxNjsKIAogICAgIEZMQUNEZWNvZGVyICptRkxBQ0RlY29kZXI7CiAgICAgRkxBQ19fU3RyZWFtTWV0YWRhdGFfU3RyZWFtSW5mbyBtU3RyZWFtSW5mbzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL0FuZHJvaWQuYnAKaW5kZXggOWI2OTZkYS4uYjMyYWIwOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL0FuZHJvaWQuYnAKQEAgLTI4LDcgKzI4LDEwIEBACiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbImxpYmJhc2VfaGVhZGVycyJdLAotICAgIHN0YXRpY19saWJzOiBbImxpYkZMQUMiXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJGTEFDIiwKKyAgICBdLAogCiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfZmxhY2VuYyIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5jcHAKaW5kZXggOTU1ZjIxMS4uM2FkZDAwNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5jcHAKQEAgLTIwLDcgKzIwLDcgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgIlNvZnRGbGFjRW5jb2Rlci5oIgotCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAKQEAgLTc1LDcgKzc1LDkgQEAKICAgICB9CiAKICAgICBpZiAoIW1TaWduYWxsZWRFcnJvcikgeyAvLyBubyB1c2UgYWxsb2NhdGluZyBpbnB1dCBidWZmZXIgaWYgd2UgaGFkIGFuIGVycm9yIGFib3ZlCi0gICAgICAgIG1JbnB1dEJ1ZmZlclBjbTMyID0gKEZMQUNfX2ludDMyKikgbWFsbG9jKHNpemVvZihGTEFDX19pbnQzMikgKiAyICoga01heE51bVNhbXBsZXNQZXJGcmFtZSk7CisgICAgICAgIC8vIDJ4IHRoZSBwY20xNiBzYW1wbGVzIGNhbiBleGlzdCB3aXRoIHRoZSBzYW1lIHNpemUgYXMgcGNtRmxvYXQgc2FtcGxlcy4KKyAgICAgICAgbUlucHV0QnVmZmVyUGNtMzIgPSAoRkxBQ19faW50MzIqKSBtYWxsb2MoCisgICAgICAgICAgICAgICAgc2l6ZW9mKEZMQUNfX2ludDMyKSAqIGtOdW1TYW1wbGVzUGVyRnJhbWUgKiBrTWF4Q2hhbm5lbHMgKiAyKTsKICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlclBjbTMyID09IE5VTEwpIHsKICAgICAgICAgICAgIEFMT0dFKCJTb2Z0RmxhY0VuY29kZXI6OlNvZnRGbGFjRW5jb2RlcihuYW1lPSVzKSBlcnJvciBhbGxvY2F0aW5nIGludGVybmFsIGlucHV0IGJ1ZmZlciIsIG5hbWUpOwogICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKQEAgLTExNSwxNCArMTE3LDE0IEBACiAgICAgLy8gY29uZmlndXJlIGlucHV0IHBvcnQgb2YgdGhlIGVuY29kZXIKICAgICBkZWYublBvcnRJbmRleCA9IDA7CiAgICAgZGVmLmVEaXIgPSBPTVhfRGlySW5wdXQ7Ci0gICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1CdWZmZXJzOy8vIFRPRE8gdmVyaWZ5IHRoYXQgMSBpcyBlbm91Z2gKKyAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7CiAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47CiAgICAgZGVmLm5CdWZmZXJTaXplID0ga01heElucHV0QnVmZmVyU2l6ZTsKICAgICBkZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKICAgICBkZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKICAgICBkZWYuZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluQXVkaW87CiAgICAgZGVmLmJCdWZmZXJzQ29udGlndW91cyA9IE9NWF9GQUxTRTsKLSAgICBkZWYubkJ1ZmZlckFsaWdubWVudCA9IDI7CisgICAgZGVmLm5CdWZmZXJBbGlnbm1lbnQgPSBzaXplb2YoZmxvYXQpOwogCiAgICAgZGVmLmZvcm1hdC5hdWRpby5jTUlNRVR5cGUgPSBjb25zdF9jYXN0PGNoYXIgKj4oImF1ZGlvL3JhdyIpOwogICAgIGRlZi5mb3JtYXQuYXVkaW8ucE5hdGl2ZVJlbmRlciA9IE5VTEw7CkBAIC0xMzQsNyArMTM2LDcgQEAKICAgICAvLyBjb25maWd1cmUgb3V0cHV0IHBvcnQgb2YgdGhlIGVuY29kZXIKICAgICBkZWYublBvcnRJbmRleCA9IDE7CiAgICAgZGVmLmVEaXIgPSBPTVhfRGlyT3V0cHV0OwotICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtQnVmZmVyczsvLyBUT0RPIHZlcmlmeSB0aGF0IDEgaXMgZW5vdWdoCisgICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1CdWZmZXJzOwogICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOwogICAgIGRlZi5uQnVmZmVyU2l6ZSA9IGtNYXhPdXRwdXRCdWZmZXJTaXplOwogICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOwpAQCAtMTkzLDEwICsxOTUsMTAgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBwY21QYXJhbXMtPmVOdW1EYXRhID0gT01YX051bWVyaWNhbERhdGFTaWduZWQ7CisgICAgICAgICAgICBwY21QYXJhbXMtPmVOdW1EYXRhID0gbU51bWVyaWNhbERhdGE7CiAgICAgICAgICAgICBwY21QYXJhbXMtPmVFbmRpYW4gPSBPTVhfRW5kaWFuQmlnOwogICAgICAgICAgICAgcGNtUGFyYW1zLT5iSW50ZXJsZWF2ZWQgPSBPTVhfVFJVRTsKLSAgICAgICAgICAgIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSA9IDE2OworICAgICAgICAgICAgcGNtUGFyYW1zLT5uQml0UGVyU2FtcGxlID0gbUJpdHNQZXJTYW1wbGU7CiAgICAgICAgICAgICBwY21QYXJhbXMtPmVQQ01Nb2RlID0gT01YX0FVRElPX1BDTU1vZGVMaW5lYXI7CiAgICAgICAgICAgICBwY21QYXJhbXMtPmVDaGFubmVsTWFwcGluZ1swXSA9IE9NWF9BVURJT19DaGFubmVsTEY7CiAgICAgICAgICAgICBwY21QYXJhbXMtPmVDaGFubmVsTWFwcGluZ1sxXSA9IE9NWF9BVURJT19DaGFubmVsUkY7CkBAIC0yNzAsMTIgKzI3MiwyNiBAQAogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChwY21QYXJhbXMtPm5DaGFubmVscyA8IDEgfHwgcGNtUGFyYW1zLT5uQ2hhbm5lbHMgPiAyKSB7CisgICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5uQ2hhbm5lbHMgPCAxIHx8IHBjbVBhcmFtcy0+bkNoYW5uZWxzID4ga01heENoYW5uZWxzKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbU51bUNoYW5uZWxzID0gcGNtUGFyYW1zLT5uQ2hhbm5lbHM7CiAgICAgICAgICAgICBtU2FtcGxlUmF0ZSA9IHBjbVBhcmFtcy0+blNhbXBsaW5nUmF0ZTsKKworICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+ZU51bURhdGEgPT0gT01YX051bWVyaWNhbERhdGFGbG9hdCAmJiBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPT0gMzIpIHsKKyAgICAgICAgICAgICAgICBtTnVtZXJpY2FsRGF0YSA9IE9NWF9OdW1lcmljYWxEYXRhRmxvYXQ7CisgICAgICAgICAgICAgICAgbUJpdHNQZXJTYW1wbGUgPSAzMjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGNtUGFyYW1zLT5lTnVtRGF0YSA9PSBPTVhfTnVtZXJpY2FsRGF0YVNpZ25lZAorICAgICAgICAgICAgICAgICAgICAgJiYgcGNtUGFyYW1zLT5uQml0UGVyU2FtcGxlID09IDE2KSB7CisgICAgICAgICAgICAgICAgbU51bWVyaWNhbERhdGEgPSBPTVhfTnVtZXJpY2FsRGF0YVNpZ25lZDsKKyAgICAgICAgICAgICAgICBtQml0c1BlclNhbXBsZSA9IDE2OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgZU51bURhdGEgJWQsIG5CaXRzUGVyU2FtcGxlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwY21QYXJhbXMtPmVOdW1EYXRhLCBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUpOworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIEFMT0dWKCJ3aWxsIGVuY29kZSAlZCBjaGFubmVscyBhdCAlZEh6IiwgbU51bUNoYW5uZWxzLCBtU2FtcGxlUmF0ZSk7CiAKICAgICAgICAgICAgIHJldHVybiBjb25maWd1cmVFbmNvZGVyKCk7CkBAIC0zNTYsNiArMzcyLDEwIEBACiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDApOwogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoMSk7CiAKKyAgICBjb25zdCBib29sIGlucHV0RmxvYXQgPSBtTnVtZXJpY2FsRGF0YSA9PSBPTVhfTnVtZXJpY2FsRGF0YUZsb2F0OworICAgIGNvbnN0IHNpemVfdCBzYW1wbGVTaXplID0gaW5wdXRGbG9hdCA/IHNpemVvZihmbG9hdCkgOiBzaXplb2YoaW50MTZfdCk7CisgICAgY29uc3Qgc2l6ZV90IGZyYW1lU2l6ZSA9IHNhbXBsZVNpemUgKiBtTnVtQ2hhbm5lbHM7CisKICAgICBGTEFDX19ib29sIG9rID0gdHJ1ZTsKIAogICAgIHdoaWxlICgoIWluUXVldWUuZW1wdHkoKSB8fCBtU2F3SW5wdXRFT1MpICYmICFvdXRRdWV1ZS5lbXB0eSgpICYmICFtU2VudE91dHB1dEVPUykgewpAQCAtMzgxLDEzICs0MDEsMjEgQEAKICAgICAgICAgICAgIG1FbmNvZGVyUmV0dXJuZWROYkJ5dGVzID0gMDsKICAgICAgICAgICAgIG1DdXJyZW50SW5wdXRUaW1lU3RhbXAgPSBpbkhlYWRlci0+blRpbWVTdGFtcDsKIAotICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgbmJJbnB1dEZyYW1lcyA9IGluSGVhZGVyLT5uRmlsbGVkTGVuIC8gKDIgKiBtTnVtQ2hhbm5lbHMpOwotICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgbmJJbnB1dFNhbXBsZXMgPSBpbkhlYWRlci0+bkZpbGxlZExlbiAvIDI7Ci0gICAgICAgICAgICBjb25zdCBPTVhfUzE2ICogY29uc3QgcGNtMTYgPSByZWludGVycHJldF9jYXN0PE9NWF9TMTYgKj4oaW5IZWFkZXItPnBCdWZmZXIpOworICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgbmJJbnB1dEZyYW1lcyA9IGluSGVhZGVyLT5uRmlsbGVkTGVuIC8gZnJhbWVTaXplOworICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgbmJJbnB1dFNhbXBsZXMgPSBpbkhlYWRlci0+bkZpbGxlZExlbiAvIHNhbXBsZVNpemU7CiAKLSAgICAgICAgICAgIENIRUNLX0xFKG5iSW5wdXRTYW1wbGVzLCAyICoga01heE51bVNhbXBsZXNQZXJGcmFtZSk7Ci0gICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGk9MCA7IGkgPCBuYklucHV0U2FtcGxlcyA7IGkrKykgewotICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlclBjbTMyW2ldID0gKEZMQUNfX2ludDMyKSBwY20xNltpXTsKKyAgICAgICAgICAgIGlmIChpbnB1dEZsb2F0KSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfTEUobmJJbnB1dFNhbXBsZXMsIGtOdW1TYW1wbGVzUGVyRnJhbWUgKiBrTWF4Q2hhbm5lbHMpOworICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICogY29uc3QgcGNtRmxvYXQgPSByZWludGVycHJldF9jYXN0PGZsb2F0ICo+KGluSGVhZGVyLT5wQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgbWVtY3B5X3RvX3E4XzIzX2Zyb21fZmxvYXRfd2l0aF9jbGFtcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXJQY20zMiwgcGNtRmxvYXQsIG5iSW5wdXRTYW1wbGVzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gbm90ZSBuYklucHV0U2FtcGxlcyBtYXkgYmUgMnggYXMgbGFyZ2UgZm9yIHBjbTE2IGRhdGEuCisgICAgICAgICAgICAgICAgQ0hFQ0tfTEUobmJJbnB1dFNhbXBsZXMsIGtOdW1TYW1wbGVzUGVyRnJhbWUgKiBrTWF4Q2hhbm5lbHMgKiAyKTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICogY29uc3QgcGNtMTYgPSByZWludGVycHJldF9jYXN0PGludDE2X3QgKj4oaW5IZWFkZXItPnBCdWZmZXIpOworICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuYklucHV0U2FtcGxlczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlclBjbTMyW2ldID0gKEZMQUNfX2ludDMyKSBwY20xNltpXTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigiIGFib3V0IHRvIGVuY29kZSAldSBzYW1wbGVzIHBlciBjaGFubmVsIiwgbmJJbnB1dEZyYW1lcyk7CiAgICAgICAgICAgICBvayA9IEZMQUNfX3N0cmVhbV9lbmNvZGVyX3Byb2Nlc3NfaW50ZXJsZWF2ZWQoCkBAIC01MjYsMTAgKzU1NCwxMiBAQAogICAgICAgICByZXR1cm4gT01YX0Vycm9ySW52YWxpZFN0YXRlOwogICAgIH0KIAorICAgIGNvbnN0IGJvb2wgaW5wdXRGbG9hdCA9IG1OdW1lcmljYWxEYXRhID09IE9NWF9OdW1lcmljYWxEYXRhRmxvYXQ7CisgICAgY29uc3QgaW50IGNvZGVjQml0c1BlclNhbXBsZSA9IGlucHV0RmxvYXQgPyAyNCA6IDE2OwogICAgIEZMQUNfX2Jvb2wgb2sgPSB0cnVlOwogICAgIG9rID0gb2sgJiYgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X2NoYW5uZWxzKG1GbGFjU3RyZWFtRW5jb2RlciwgbU51bUNoYW5uZWxzKTsKICAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9zYW1wbGVfcmF0ZShtRmxhY1N0cmVhbUVuY29kZXIsIG1TYW1wbGVSYXRlKTsKLSAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9iaXRzX3Blcl9zYW1wbGUobUZsYWNTdHJlYW1FbmNvZGVyLCAxNik7CisgICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfYml0c19wZXJfc2FtcGxlKG1GbGFjU3RyZWFtRW5jb2RlciwgY29kZWNCaXRzUGVyU2FtcGxlKTsKICAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9jb21wcmVzc2lvbl9sZXZlbChtRmxhY1N0cmVhbUVuY29kZXIsCiAgICAgICAgICAgICAodW5zaWduZWQpbUNvbXByZXNzaW9uTGV2ZWwpOwogICAgIG9rID0gb2sgJiYgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X3ZlcmlmeShtRmxhY1N0cmVhbUVuY29kZXIsIGZhbHNlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuaAppbmRleCA2NGE2YjFlLi43MjJmYzEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5oCkBAIC00NSw4ICs0NSwxMCBAQAogCiBwcml2YXRlOgogICAgIGNvbnN0IHVuc2lnbmVkIGludCBrTnVtQnVmZmVycyA9IDI7Ci0gICAgY29uc3QgdW5zaWduZWQgaW50IGtNYXhOdW1TYW1wbGVzUGVyRnJhbWUgPSAxMTUyOwotICAgIGNvbnN0IHVuc2lnbmVkIGludCBrTWF4SW5wdXRCdWZmZXJTaXplID0ga01heE51bVNhbXBsZXNQZXJGcmFtZSAqIHNpemVvZihpbnQxNl90KSAqIDI7CisgICAgc3RhdGljIGNvbnN0ZXhwciB1bnNpZ25lZCBpbnQga01heENoYW5uZWxzID0gMjsKKyAgICBzdGF0aWMgY29uc3RleHByIHVuc2lnbmVkIGludCBrTnVtU2FtcGxlc1BlckZyYW1lID0gMTE1MjsKKyAgICBzdGF0aWMgY29uc3RleHByIHVuc2lnbmVkIGludCBrTWF4SW5wdXRCdWZmZXJTaXplID0KKyAgICAgICAgICAgIGtOdW1TYW1wbGVzUGVyRnJhbWUgKiBrTWF4Q2hhbm5lbHMgKiBzaXplb2YoZmxvYXQpOwogICAgIGNvbnN0IHVuc2lnbmVkIGludCBrTWF4T3V0cHV0QnVmZmVyU2l6ZSA9IDY1NTM2OyAgICAvL1RPRE8gY2hlY2sgaWYgdGhpcyBjYW4gYmUgcmVkdWNlZAogCiAgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CkBAIC01NCw2ICs1Niw4IEBACiAgICAgT01YX1UzMiBtTnVtQ2hhbm5lbHM7CiAgICAgT01YX1UzMiBtU2FtcGxlUmF0ZTsKICAgICBPTVhfVTMyIG1Db21wcmVzc2lvbkxldmVsOworICAgIE9NWF9OVU1FUklDQUxEQVRBVFlQRSBtTnVtZXJpY2FsRGF0YSA9IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkOworICAgIE9NWF9VMzIgbUJpdHNQZXJTYW1wbGUgPSAxNjsKIAogICAgIC8vIHNob3VsZCB0aGUgZGF0YSByZWNlaXZlZCBieSB0aGUgY2FsbGJhY2sgYmUgd3JpdHRlbiB0byB0aGUgb3V0cHV0IHBvcnQKICAgICBib29sICAgICAgICBtRW5jb2RlcldyaXRlRGF0YTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2Jsb2NrX2lkY3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYmxvY2tfaWRjdC5jcHAKaW5kZXggYTc1NDgzYS4uM2QxMDA4NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYmxvY2tfaWRjdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYmxvY2tfaWRjdC5jcHAKQEAgLTYxNyw2ICs2MTcsNyBAQAogICAgIHJldHVybjsKIH0KIAorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQogdm9pZCBpZGN0cm93X2ludHJhKAogICAgIGludDE2ICpibGssIFBJWEVMICpjb21wLCBpbnQgd2lkdGgKICkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3B2ZGVjX2FwaS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wdmRlY19hcGkuY3BwCmluZGV4IDc1Y2E4NDYuLjljMGZjZmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3B2ZGVjX2FwaS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHZkZWNfYXBpLmNwcApAQCAtMTg2LDggKzE4Niw4IEBACiAjaWZkZWYgREVDX0lOVEVSTkFMX01FTU9SWV9PUFQKICAgICAgICAgICAgICAgICB2aWRlby0+dm9sW2lkeF0gPSBJTUVNX3ZvbFtpZHhdOwogICAgICAgICAgICAgICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSBzaXplb2YoVm9sKTsKLSAgICAgICAgICAgICAgICBvc2NsX21lbXNldCh2aWRlby0+dm9sW2lkeF0sIDAsIHNpemVvZihWb2wpKTsKICAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnZvbFtpZHhdID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgICAgICAgICAgICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPnZvbFtpZHhdLCAwLCBzaXplb2YoVm9sKSk7CiAgICAgICAgICAgICAgICAgc3RyZWFtID0gSU1FTV9CaXRzdHJlYW1EZWNWaWRlbzsKICNlbHNlCiAgICAgICAgICAgICAgICAgdmlkZW8tPnZvbFtpZHhdID0gKFZvbCAqKSBvc2NsX21hbGxvYyhzaXplb2YoVm9sKSk7CkBAIC0yMTMsNiArMjEzLDcgQEAKICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpbnQzMiBidWZmZXJfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgb3NjbF9tZW1zZXQoc3RyZWFtLCAwLCBzaXplb2YoQml0c3RyZWFtRGVjVmlkZW8pKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKChidWZmZXJfc2l6ZSA9IEJpdHN0cmVhbU9wZW4oc3RyZWFtLCBpZHgpKSA8IDApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1wNGRlY19sb2coIkluaXRWaWRlb0RlY29kZXIoKTogQ2FuJ3QgYWxsb2NhdGUgYml0c3RyZWFtIGJ1ZmZlci5cbiIpOwpAQCAtMzM5LDI3ICszNDAsMzMgQEAKICNpZmRlZiBERUNfSU5URVJOQUxfTUVNT1JZX09QVAogICAgIHZpZGVvLT5jdXJyVm9wLT55Q2hhbiA9IElNRU1fY3VyclZvcF95Q2hhbjsgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgVk9QIE9LQSAzLzIvMSovCiAgICAgaWYgKHZpZGVvLT5jdXJyVm9wLT55Q2hhbiA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICB2aWRlby0+Y3VyclZvcC0+dUNoYW4gPSB2aWRlby0+Y3VyclZvcC0+eUNoYW4gKyBzaXplOwotICAgIHZpZGVvLT5jdXJyVm9wLT52Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgIGVsc2UgeworICAgICAgICB2aWRlby0+Y3VyclZvcC0+dUNoYW4gPSB2aWRlby0+Y3VyclZvcC0+eUNoYW4gKyBzaXplOworICAgICAgICB2aWRlby0+Y3VyclZvcC0+dkNoYW4gPSB2aWRlby0+Y3VyclZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICB9CiAKICAgICB2aWRlby0+cHJldlZvcC0+eUNoYW4gPSBJTUVNX3ByZXZWb3BfeUNoYW47IC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgYWxsIFZPUCBPS0EgMy8yLzEqLwogICAgIGlmICh2aWRlby0+cHJldlZvcC0+eUNoYW4gPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgdmlkZW8tPnByZXZWb3AtPnVDaGFuID0gdmlkZW8tPnByZXZWb3AtPnlDaGFuICsgc2l6ZTsKLSAgICB2aWRlby0+cHJldlZvcC0+dkNoYW4gPSB2aWRlby0+cHJldlZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICBlbHNlIHsKKyAgICAgICAgdmlkZW8tPnByZXZWb3AtPnVDaGFuID0gdmlkZW8tPnByZXZWb3AtPnlDaGFuICsgc2l6ZTsKKyAgICAgICAgdmlkZW8tPnByZXZWb3AtPnZDaGFuID0gdmlkZW8tPnByZXZWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgfQogI2Vsc2UKICAgICBpZiAoc2l6ZSA+IElOVDMyX01BWCAvIDMpIHsKICAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOwogICAgIH0KICAgICB2aWRlby0+Y3VyclZvcC0+eUNoYW4gPSAoUElYRUwgKikgb3NjbF9tYWxsb2Moc2l6ZSAqIDMgLyAyKTsgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgVk9QIE9LQSAzLzIvMSovCiAgICAgaWYgKHZpZGVvLT5jdXJyVm9wLT55Q2hhbiA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLQotICAgIHZpZGVvLT5jdXJyVm9wLT51Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT55Q2hhbiArIHNpemU7Ci0gICAgdmlkZW8tPmN1cnJWb3AtPnZDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgZWxzZSB7CisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT51Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT55Q2hhbiArIHNpemU7CisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT52Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgIH0KICAgICB2aWRlby0+cHJldlZvcC0+eUNoYW4gPSAoUElYRUwgKikgb3NjbF9tYWxsb2Moc2l6ZSAqIDMgLyAyKTsgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgVk9QIE9LQSAzLzIvMSovCiAgICAgaWYgKHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLQotICAgIHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiA9IHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiArIHNpemU7Ci0gICAgdmlkZW8tPnByZXZWb3AtPnZDaGFuID0gdmlkZW8tPnByZXZWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgZWxzZSB7CisgICAgICAgIHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiA9IHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiArIHNpemU7CisgICAgICAgIHZpZGVvLT5wcmV2Vm9wLT52Q2hhbiA9IHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgIH0KICNlbmRpZgogICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoc2l6ZSAqIDMpOwogI2VuZGlmICAgLy8gTUVNT1JZX1BPT0wKQEAgLTM4Myw4ICszOTAsMTAgQEAKIAogICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT55Q2hhbiA9IChQSVhFTCAqKSBvc2NsX21hbGxvYyhzaXplICogMyAvIDIpOyAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCBWT1AgT0tBIDMvMi8xKi8KICAgICAgICAgICAgIGlmICh2aWRlby0+cHJldkVuaGNWb3AtPnlDaGFuID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT51Q2hhbiA9IHZpZGVvLT5wcmV2RW5oY1ZvcC0+eUNoYW4gKyBzaXplOwotICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT52Q2hhbiA9IHZpZGVvLT5wcmV2RW5oY1ZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oY1ZvcC0+dUNoYW4gPSB2aWRlby0+cHJldkVuaGNWb3AtPnlDaGFuICsgc2l6ZTsKKyAgICAgICAgICAgICAgICB2aWRlby0+cHJldkVuaGNWb3AtPnZDaGFuID0gdmlkZW8tPnByZXZFbmhjVm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9ICgzICogc2l6ZSAvIDIpOwogI2VuZGlmCiAgICAgICAgIH0KQEAgLTQzMSwxMCArNDQwLDEyIEBACiAjZWxzZQogICAgIHZpZGVvLT5zbGljZU5vID0gKHVpbnQ4ICopIG9zY2xfbWFsbG9jKG5Ub3RhbE1CKTsKICAgICBpZiAodmlkZW8tPnNsaWNlTm8gPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+c2xpY2VObywgMCwgblRvdGFsTUIpOwogICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSBuVG90YWxNQjsKIAogICAgIHZpZGVvLT5hY1ByZWRGbGFnID0gKHVpbnQ4ICopIG9zY2xfbWFsbG9jKG5Ub3RhbE1CICogc2l6ZW9mKHVpbnQ4KSk7CiAgICAgaWYgKHZpZGVvLT5hY1ByZWRGbGFnID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPmFjUHJlZEZsYWcsIDAsIG5Ub3RhbE1CICogc2l6ZW9mKHVpbnQ4KSk7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChuVG90YWxNQik7CiAKICAgICBpZiAoKHNpemVfdCluVG90YWxNQiA+IFNJWkVfTUFYIC8gc2l6ZW9mKHR5cGVEQ1N0b3JlKSkgewpAQCAtNDQyLDYgKzQ1Myw3IEBACiAgICAgfQogICAgIHZpZGVvLT5wcmVkREMgPSAodHlwZURDU3RvcmUgKikgb3NjbF9tYWxsb2MoblRvdGFsTUIgKiBzaXplb2YodHlwZURDU3RvcmUpKTsKICAgICBpZiAodmlkZW8tPnByZWREQyA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG9zY2xfbWVtc2V0KHZpZGVvLT5wcmVkREMsIDAsIG5Ub3RhbE1CICogc2l6ZW9mKHR5cGVEQ1N0b3JlKSk7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChuVG90YWxNQiAqIHNpemVvZih0eXBlRENTdG9yZSkpOwogCiAgICAgaWYgKG5NQlBlclJvdyA+IElOVDMyX01BWCAtIDEKQEAgLTQ1MCw2ICs0NjIsNyBAQAogICAgIH0KICAgICB2aWRlby0+cHJlZERDQUNfY29sID0gKHR5cGVEQ0FDU3RvcmUgKikgb3NjbF9tYWxsb2MoKG5NQlBlclJvdyArIDEpICogc2l6ZW9mKHR5cGVEQ0FDU3RvcmUpKTsKICAgICBpZiAodmlkZW8tPnByZWREQ0FDX2NvbCA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG9zY2xfbWVtc2V0KHZpZGVvLT5wcmVkRENBQ19jb2wsIDAsIChuTUJQZXJSb3cgKyAxKSAqIHNpemVvZih0eXBlRENBQ1N0b3JlKSk7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9ICgobk1CUGVyUm93ICsgMSkgKiBzaXplb2YodHlwZURDQUNTdG9yZSkpOwogCiAgICAgLyogZWxlbWVudCB6ZXJvIHdpbGwgYmUgdXNlZCBmb3Igc3RvcmluZyB2ZXJ0aWNhbCAoY29sKSBBQyBjb2VmZmljaWVudHMgKi8KQEAgLTQ1OSw5ICs0NzIsMTEgQEAKICAgICAvKiBBbGxvY2F0aW5nIEhlYWRlckluZm8gc3RydWN0dXJlICYgUXVhbnRpemVyIGFycmF5ICovCiAgICAgdmlkZW8tPmhlYWRlckluZm8uTW9kZSA9ICh1aW50OCAqKSBvc2NsX21hbGxvYyhuVG90YWxNQik7CiAgICAgaWYgKHZpZGVvLT5oZWFkZXJJbmZvLk1vZGUgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+aGVhZGVySW5mby5Nb2RlLCAwLCBuVG90YWxNQik7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IG5Ub3RhbE1COwogICAgIHZpZGVvLT5oZWFkZXJJbmZvLkNCUCA9ICh1aW50OCAqKSBvc2NsX21hbGxvYyhuVG90YWxNQik7CiAgICAgaWYgKHZpZGVvLT5oZWFkZXJJbmZvLkNCUCA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG9zY2xfbWVtc2V0ICh2aWRlby0+aGVhZGVySW5mby5DQlAsIDAsIG5Ub3RhbE1CKTsKICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gblRvdGFsTUI7CiAKICAgICBpZiAoKHNpemVfdCluVG90YWxNQiA+IFNJWkVfTUFYIC8gc2l6ZW9mKGludDE2KSkgewpAQCAtNDY5LDYgKzQ4NCw3IEBACiAgICAgfQogICAgIHZpZGVvLT5RUE1CID0gKGludDE2ICopIG9zY2xfbWFsbG9jKG5Ub3RhbE1CICogc2l6ZW9mKGludDE2KSk7CiAgICAgaWYgKHZpZGVvLT5RUE1CID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2UgbWVtc2V0KHZpZGVvLT5RUE1CLCAweDAsIG5Ub3RhbE1CICogc2l6ZW9mKGludDE2KSk7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChuVG90YWxNQiAqIHNpemVvZihpbnQpKTsKIAogICAgIC8qIEFsbG9jYXRpbmcgbWFjcm9ibG9jayBzcGFjZSAqLwpAQCAtNDg5LDggKzUwNSwxMCBAQAogICAgIH0KICAgICB2aWRlby0+bW90WCA9IChNT1QgKikgb3NjbF9tYWxsb2Moc2l6ZW9mKE1PVCkgKiA0ICogblRvdGFsTUIpOwogICAgIGlmICh2aWRlby0+bW90WCA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG1lbXNldCh2aWRlby0+bW90WCwgMCwgc2l6ZW9mKE1PVCkgKiA0ICogblRvdGFsTUIpOwogICAgIHZpZGVvLT5tb3RZID0gKE1PVCAqKSBvc2NsX21hbGxvYyhzaXplb2YoTU9UKSAqIDQgKiBuVG90YWxNQik7CiAgICAgaWYgKHZpZGVvLT5tb3RZID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2UgbWVtc2V0KHZpZGVvLT5tb3RZLCAwLCBzaXplb2YoTU9UKSAqIDQgKiBuVG90YWxNQik7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChzaXplb2YoTU9UKSAqIDggKiBuVG90YWxNQik7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaAppbmRleCAwMGYyZGQzLi43MWUxMTcwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaApAQCAtMTcsNyArMTcsNiBAQAogI2lmbmRlZiBTT0ZUX01QRUc0X0VOQ09ERVJfSF8KICNkZWZpbmUgU09GVF9NUEVHNF9FTkNPREVSX0hfCiAKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oPgogI2luY2x1ZGUgIm1wNGVuY19hcGkuaCIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3JhdGVfY29udHJvbC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9yYXRlX2NvbnRyb2wuY3BwCmluZGV4IDUzMTQ5YzEuLmVjYzMyMTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3JhdGVfY29udHJvbC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvcmF0ZV9jb250cm9sLmNwcApAQCAtMzc3LDE1ICszNzcsMTUgQEAKIC8qICBJbi9vdXQgICA6IE5yLCBCLCBSciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFJldHVybiAgIDogVm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIElucHV0IGFyZ3VtZW50ICJ2aWRlbyIgaXMgZ3VhcmFudGVlZCBub24tbnVsbCBieSBjYWxsZXIgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKLQogUFZfU1RBVFVTIFJDX1VwZGF0ZUJ1ZmZlcihWaWRlb0VuY0RhdGEgKnZpZGVvLCBJbnQgY3VyckxheWVyLCBJbnQgbnVtX3NraXApCiB7CiAgICAgcmF0ZUNvbnRyb2wgKnJjICA9IHZpZGVvLT5yY1tjdXJyTGF5ZXJdOwogICAgIE11bHRpUGFzcyAgICpwTVAgPSB2aWRlby0+cE1QW2N1cnJMYXllcl07CiAKLSAgICBpZiAodmlkZW8gPT0gTlVMTCB8fCByYyA9PSBOVUxMIHx8IHBNUCA9PSBOVUxMKQorICAgIGlmIChyYyA9PSBOVUxMIHx8IHBNUCA9PSBOVUxMKQogICAgICAgICByZXR1cm4gUFZfRkFJTDsKIAogICAgIHJjLT5WQlZfZnVsbG5lc3MgICAtPSAoSW50KShyYy0+Yml0cmF0ZSAvIHJjLT5mcmFtZXJhdGUgKiBudW1fc2tpcCk7IC8vcmNbY3VyckxheWVyXS0+UnA7CkBAIC01MjQsNiArNTI0LDcgQEAKIC8qICBJbi9vdXQgICA6IHJjLT5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgUmV0dXJuICAgOiBWb2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIElucHV0IGFyZ3VtZW50ICJpbnB1dCIgaXMgZ3VhcmFudGVlZCBub24tbnVsbCBieSBjYWxsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCiB2b2lkIHRhcmdldEJpdENhbGN1bGF0aW9uKHZvaWQgKmlucHV0KQpAQCAtNTM3LDcgKzUzOCw3IEBACiAgICAgSW50IGRpZmZfY291bnRlcl9CVHNyYywgZGlmZl9jb3VudGVyX0JUZHN0LCBwcmV2X2NvdW50ZXJfZGlmZiwgY3Vycl9jb3VudGVyX2RpZmYsIGJvdW5kOwogICAgIC8qIEJUID0gQml0IFRyYW5zZmVyLCBmb3IgcE1QLT5jb3VudGVyX0JUc3JjLCBwTVAtPmNvdW50ZXJfQlRkc3QgKi8KIAotICAgIGlmICh2aWRlbyA9PSBOVUxMIHx8IGN1cnJWb2wgPT0gTlVMTCB8fCBwTVAgPT0gTlVMTCB8fCByYyA9PSBOVUxMKQorICAgIGlmIChjdXJyVm9sID09IE5VTEwgfHwgcE1QID09IE5VTEwgfHwgcmMgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuOwogCiAgICAgLyogc29tZSBzdHVmZiBhYm91dCBmcmFtZSBkcm9wcGluZyByZW1haW5lZCBoZXJlIHRvIGJlIGRvbmUgYmVjYXVzZSBwTVAgY2Fubm90IGJlIGluc2VydGVkIGludG8gdXBkYXRlUmF0ZUNvbnRyb2woKSovCkBAIC02OTMsNiArNjk0LDcgQEAKIC8qICBJbi9vdXQgICA6IHJjLT5UIGFuZCByYy0+UWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgUmV0dXJuICAgOiBWb2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbnB1dCBhcmd1bWVudCAiaW5wdXQiIGlzIGd1YXJhbnRlZWQgbm9uLW51bGwgYnkgY2FsbGVyICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCiAvKiBNYWQgYmFzZWQgdmFyaWFibGUgYml0IGFsbG9jYXRpb24gKyBRUCBjYWxjdWxhdGlvbiB3aXRoIGEgbmV3IHF1YWRyYXRpYyBtZXRob2QgKi8KQEAgLTcwOCw3ICs3MTAsNyBAQAogICAgIGZsb2F0IGN1cnJfbWFkLCBwcmV2X21hZCwgY3Vycl9SRCwgcHJldl9SRCwgYXZlcmFnZV9tYWQsIGF2ZXJfUVA7CiAKIAotICAgIGlmICh2aWRlbyA9PSBOVUxMIHx8IGN1cnJWb2wgPT0gTlVMTCB8fCBwTVAgPT0gTlVMTCB8fCByYyA9PSBOVUxMKQorICAgIGlmIChjdXJyVm9sID09IE5VTEwgfHwgcE1QID09IE5VTEwgfHwgcmMgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuOwogCiAgICAgLyogTWFkIGJhc2VkIHZhcmlhYmxlIGJpdCBhbGxvY2F0aW9uICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcAppbmRleCAyMzY0Njg0Li5jZDk4NGYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAKQEAgLTExNCw3ICsxMTQsNyBAQAogICAgIG1Db25maWctPmNyY0VuYWJsZWQgPSBmYWxzZTsKIAogICAgIHVpbnQzMl90IG1lbVJlcXVpcmVtZW50cyA9IHB2bXAzX2RlY29kZXJNZW1SZXF1aXJlbWVudHMoKTsKLSAgICBtRGVjb2RlckJ1ZiA9IG1hbGxvYyhtZW1SZXF1aXJlbWVudHMpOworICAgIG1EZWNvZGVyQnVmID0gY2FsbG9jKDEsIG1lbVJlcXVpcmVtZW50cyk7CiAKICAgICBwdm1wM19Jbml0RGVjb2RlcihtQ29uZmlnLCBtRGVjb2RlckJ1Zik7CiAgICAgbUlzRmlyc3QgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvQW5kcm9pZC5icAppbmRleCAzZGY0ZDRjLi5jNjU1NTQ0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvQW5kcm9pZC5icApAQCAtMSw5ICsxLDYgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9tcGVnMmRlYyIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICB2bmRrOiB7Ci0gICAgICAgIGVuYWJsZWQ6IHRydWUsCi0gICAgfSwKIAogICAgIHN0YXRpY19saWJzOiBbImxpYm1wZWcyZGVjIl0sCiAgICAgc3JjczogWyJTb2Z0TVBFRzIuY3BwIl0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwCmluZGV4IDhkNWYzZTcuLjBmMmZmMTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwCkBAIC0zMyw2ICszMyw3IEBACiAgICAgeyBPTVhfVklERU9fVlA5UHJvZmlsZTAsIE9NWF9WSURFT19WUDlMZXZlbDUgfSwKICAgICB7IE9NWF9WSURFT19WUDlQcm9maWxlMiwgT01YX1ZJREVPX1ZQOUxldmVsNSB9LAogICAgIHsgT01YX1ZJREVPX1ZQOVByb2ZpbGUySERSLCBPTVhfVklERU9fVlA5TGV2ZWw1IH0sCisgICAgeyBPTVhfVklERU9fVlA5UHJvZmlsZTJIRFIxMFBsdXMsIE9NWF9WSURFT19WUDlMZXZlbDUgfSwKIH07CiAKIFNvZnRWUFg6OlNvZnRWUFgoCkBAIC04NCw2ICs4NSwxMCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCitib29sIFNvZnRWUFg6OnN1cHBvcnREZXNjcmliZUhkcjEwUGx1c0luZm8oKSB7CisgICAgcmV0dXJuIHRydWU7Cit9CisKIHN0YXR1c190IFNvZnRWUFg6OmluaXREZWNvZGVyKCkgewogICAgIG1DdHggPSBuZXcgdnB4X2NvZGVjX2N0eF90OwogICAgIHZweF9jb2RlY19lcnJfdCB2cHhfZXJyOwpAQCAtMTY3LDcgKzE3MiwxMiBAQAogICAgICAgICBvdXRIZWFkZXItPm5PZmZzZXQgPSAwOwogICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IDA7CiAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IChvdXRwdXRCdWZmZXJXaWR0aCgpICogb3V0cHV0QnVmZmVySGVpZ2h0KCkgKiBicHAgKiAzKSAvIDI7Ci0gICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9ICooT01YX1RJQ0tTICopbUltZy0+dXNlcl9wcml2OworICAgICAgICBQcml2SW5mbyAqcHJpdkluZm8gPSAoUHJpdkluZm8gKiltSW1nLT51c2VyX3ByaXY7CisgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IHByaXZJbmZvLT5tVGltZVN0YW1wOworICAgICAgICBpZiAocHJpdkluZm8tPm1IZHIxMFBsdXNJbmZvICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHF1ZXVlT3V0cHV0RnJhbWVDb25maWcocHJpdkluZm8tPm1IZHIxMFBsdXNJbmZvKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChvdXRwdXRCdWZmZXJTYWZlKG91dEhlYWRlcikpIHsKICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IG91dEhlYWRlci0+cEJ1ZmZlcjsKICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1kgPSAoY29uc3QgdWludDhfdCAqKW1JbWctPnBsYW5lc1tWUFhfUExBTkVfWV07CkBAIC0yNzUsNyArMjg1LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBtVGltZVN0YW1wc1ttVGltZVN0YW1wSWR4XSA9IGluSGVhZGVyLT5uVGltZVN0YW1wOworICAgICAgICBtUHJpdkluZm9bbVRpbWVTdGFtcElkeF0ubVRpbWVTdGFtcCA9IGluSGVhZGVyLT5uVGltZVN0YW1wOworCisgICAgICAgIGlmIChpbkluZm8tPm1GcmFtZUNvbmZpZykgeworICAgICAgICAgICAgbVByaXZJbmZvW21UaW1lU3RhbXBJZHhdLm1IZHIxMFBsdXNJbmZvID0gZGVxdWV1ZUlucHV0RnJhbWVDb25maWcoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Qcml2SW5mb1ttVGltZVN0YW1wSWR4XS5tSGRyMTBQbHVzSW5mby5jbGVhcigpOworICAgICAgICB9CiAKICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKICAgICAgICAgICAgIG1FT1NTdGF0dXMgPSBJTlBVVF9FT1NfU0VFTjsKQEAgLTI4NSw3ICszMDEsNyBAQAogICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPiAwKSB7CiAgICAgICAgICAgICB2cHhfY29kZWNfZXJyX3QgZXJyID0gdnB4X2NvZGVjX2RlY29kZSgKICAgICAgICAgICAgICAgICAgICAgKHZweF9jb2RlY19jdHhfdCAqKW1DdHgsIGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uRmlsbGVkTGVuLCAmbVRpbWVTdGFtcHNbbVRpbWVTdGFtcElkeF0sIDApOworICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiwgJm1Qcml2SW5mb1ttVGltZVN0YW1wSWR4XSwgMCk7CiAgICAgICAgICAgICBpZiAoZXJyID09IFZQWF9DT0RFQ19PSykgewogICAgICAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaAppbmRleCBiNjJiNTI2Li4wYWE4ZTljIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5oCkBAIC0yNiw2ICsyNiw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RydWN0IEFCdWZmZXI7CisKIHN0cnVjdCBTb2Z0VlBYIDogcHVibGljIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQgewogICAgIFNvZnRWUFgoY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbXBvbmVudFJvbGUsCkBAIC00MSw2ICs0Myw3IEBACiAgICAgdmlydHVhbCB2b2lkIG9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKICAgICB2aXJ0dWFsIHZvaWQgb25SZXNldCgpOwogICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0RGVzY3JpYmVIZHJTdGF0aWNJbmZvKCk7CisgICAgdmlydHVhbCBib29sIHN1cHBvcnREZXNjcmliZUhkcjEwUGx1c0luZm8oKTsKIAogcHJpdmF0ZToKICAgICBlbnVtIHsKQEAgLTYwLDcgKzYzLDExIEBACiAKICAgICB2b2lkICptQ3R4OwogICAgIGJvb2wgbUZyYW1lUGFyYWxsZWxNb2RlOyAgLy8gRnJhbWUgcGFyYWxsZWwgaXMgb25seSBzdXBwb3J0ZWQgYnkgVlA5IGRlY29kZXIuCi0gICAgT01YX1RJQ0tTIG1UaW1lU3RhbXBzW2tOdW1CdWZmZXJzXTsKKyAgICBzdHJ1Y3QgUHJpdkluZm8geworICAgICAgICBPTVhfVElDS1MgbVRpbWVTdGFtcDsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gbUhkcjEwUGx1c0luZm87CisgICAgfTsKKyAgICBQcml2SW5mbyBtUHJpdkluZm9ba051bUJ1ZmZlcnNdOwogICAgIHVpbnQ4X3QgbVRpbWVTdGFtcElkeDsKICAgICB2cHhfaW1hZ2VfdCAqbUltZzsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuY3BwCmluZGV4IDJkZmJhMTMuLmQwY2IwNzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5jcHAKQEAgLTQwMSw4ICs0MDEsOCBAQAogICAgIH0KIH0KIAotT01YX0VSUk9SVFlQRSBTb2Z0VlBYRW5jb2Rlcjo6c2V0Q29uZmlnKAotICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIF9wYXJhbXMpIHsKK09NWF9FUlJPUlRZUEUgU29mdFZQWEVuY29kZXI6OmludGVybmFsU2V0Q29uZmlnKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIF9wYXJhbXMsIGJvb2wgKmZyYW1lQ29uZmlnKSB7CiAgICAgc3dpdGNoIChpbmRleCkgewogICAgICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ1ZpZGVvSW50cmFWT1BSZWZyZXNoOgogICAgICAgICB7CkBAIC00NDIsNyArNDQyLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6c2V0Q29uZmlnKGluZGV4LCBfcGFyYW1zKTsKKyAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbFNldENvbmZpZyhpbmRleCwgX3BhcmFtcywgZnJhbWVDb25maWcpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmgKaW5kZXggZGQ4NmQzNi4uMjYzZDEzNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5oCkBAIC04NCw4ICs4NCw4IEBACiAgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbSk7CiAKLSAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgc2V0Q29uZmlnKAotICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpOworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldENvbmZpZygKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zLCBib29sICpmcmFtZUNvbmZpZyk7CiAKICAgICAvLyBPTVggY2FsbGJhY2sgd2hlbiBidWZmZXJzIGF2YWlsYWJsZQogICAgIC8vIE5vdGUgdGhhdCBib3RoIGFuIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcAppbmRleCA4MTMwMDRiLi5jNmRjMzI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAKQEAgLTQzMCw4ICs0MzAsMTcgQEAKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmIChzaXplIDwgc2l6ZW9mKGludDY0X3QpKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIDJuZCBhbmQgM3JkIGlucHV0IGJ1ZmZlciBhcmUgZXhwZWN0ZWQgdG8gY29udGFpbgorICAgICAgICAgICAgICAgIC8vICBhbiBpbnQ2NF90IChzZWUgYmVsb3cpLCBzbyBtYWtlIHN1cmUgd2UgZ2V0IGF0IGxlYXN0CisgICAgICAgICAgICAgICAgLy8gIHRoYXQgbXVjaC4gVGhlIGZpcnN0IGlucHV0IGJ1ZmZlciBtdXN0IGNvbnRhaW4gMTkgYnl0ZXMsCisgICAgICAgICAgICAgICAgLy8gIGJ1dCB0aGF0IGlzIGNoZWNrZWQgYWxyZWFkeS4KKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMCkgewotICAgICAgICAgICAgICAgIENIRUNLKG1IZWFkZXIgPT0gTlVMTCk7CisgICAgICAgICAgICAgICAgZGVsZXRlIG1IZWFkZXI7CiAgICAgICAgICAgICAgICAgbUhlYWRlciA9IG5ldyBPcHVzSGVhZGVyKCk7CiAgICAgICAgICAgICAgICAgbWVtc2V0KG1IZWFkZXIsIDAsIHNpemVvZigqbUhlYWRlcikpOwogICAgICAgICAgICAgICAgIGlmICghUGFyc2VPcHVzSGVhZGVyKGRhdGEsIHNpemUsIG1IZWFkZXIpKSB7CkBAIC00NTIsNiArNDYxLDkgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzID0gT1BVU19JTlZBTElEX1NUQVRFOworICAgICAgICAgICAgICAgIGlmIChtRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9kZXN0cm95KG1EZWNvZGVyKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbURlY29kZXIgPSBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3JlYXRlKGtSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLT5jaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+bnVtX3N0cmVhbXMsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9Tb2Z0WEFBQy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9Tb2Z0WEFBQy5jcHAKaW5kZXggMDZiMTViMy4uMWQ3OTJmZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvU29mdFhBQUMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL1NvZnRYQUFDLmNwcApAQCAtNzksNyArNzksNyBAQAogCiBzdGF0aWMgY29uc3QgT01YX1UzMiBrU3VwcG9ydGVkUHJvZmlsZXNbXSA9IHsKICAgICBPTVhfQVVESU9fQUFDT2JqZWN0TEMsIE9NWF9BVURJT19BQUNPYmplY3RIRSwgIE9NWF9BVURJT19BQUNPYmplY3RIRV9QUywKLSAgICBPTVhfQVVESU9fQUFDT2JqZWN0TEQsIE9NWF9BVURJT19BQUNPYmplY3RFTEQsCisgICAgT01YX0FVRElPX0FBQ09iamVjdExELCBPTVhfQVVESU9fQUFDT2JqZWN0RUxELCBPTVhfQVVESU9fQUFDT2JqZWN0WEhFCiB9OwogCiBTb2Z0WEFBQzo6U29mdFhBQUMoY29uc3QgY2hhciogbmFtZSwgY29uc3QgT01YX0NBTExCQUNLVFlQRSogY2FsbGJhY2tzLCBPTVhfUFRSIGFwcERhdGEsCkBAIC0xMTAsMTUgKzExMCwyMiBAQAogCiB7CiAgICAgaW5pdFBvcnRzKCk7Ci0gICAgQ0hFQ0tfRVEoaW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKKyAgICBtTWVtb3J5VmVjLmNsZWFyKCk7CisgICAgbURyY01lbW9yeVZlYy5jbGVhcigpOworCisgICAgQ0hFQ0tfRVEoaW5pdERlY29kZXIoKSwgSUFfTk9fRVJST1IpOwogfQogCiBTb2Z0WEFBQzo6flNvZnRYQUFDKCkgewotICAgIGludCBlcnJDb2RlID0gZGVJbml0WEFBQ0RlY29kZXIoKTsKLSAgICBpZiAoMCAhPSBlcnJDb2RlKSB7Ci0gICAgICAgIEFMT0dFKCJkZUluaXRYQUFDRGVjb2RlcigpIGZhaWxlZCAlZCIsIGVyckNvZGUpOworICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IGRlSW5pdFhBQUNEZWNvZGVyKCk7CisgICAgaWYgKElBX05PX0VSUk9SICE9IGVycl9jb2RlKSB7CisgICAgICAgIEFMT0dFKCJkZUluaXRYQUFDRGVjb2RlcigpIGZhaWxlZCAlZCIsIGVycl9jb2RlKTsKICAgICB9CiAKKyAgICBlcnJfY29kZSA9IGRlSW5pdE1QRUdERERyYygpOworICAgIGlmIChJQV9OT19FUlJPUiAhPSBlcnJfY29kZSkgeworICAgICAgICBBTE9HRSgiZGVJbml0TVBFR0RERHJjKCkgZmFpbGVkICVkIiwgZXJyX2NvZGUpOworICAgIH0KICAgICBtSXNDb2RlY0luaXRpYWxpemVkID0gZmFsc2U7CiAgICAgbUlzQ29kZWNDb25maWdGbHVzaFJlcXVpcmVkID0gZmFsc2U7CiB9CkBAIC0xNjQsMzYgKzE3MSwxNiBAQAogICAgIGFkZFBvcnQoZGVmKTsKIH0KIAotc3RhdHVzX3QgU29mdFhBQUM6OmluaXREZWNvZGVyKCkgewotICAgIHN0YXR1c190IHN0YXR1cyA9IFVOS05PV05fRVJST1I7Ci0KK0lBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6aW5pdERlY29kZXIoKSB7CiAgICAgaW50IHVpX2RyY192YWw7CiAgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CiAgICAgaW50IGxvb3AgPSAwOwogCiAgICAgZXJyX2NvZGUgPSBpbml0WEFBQ0RlY29kZXIoKTsKICAgICBpZiAoZXJyX2NvZGUgIT0gSUFfTk9fRVJST1IpIHsKLSAgICAgICAgaWYgKE5VTEwgPT0gbVhoZWFhY0NvZGVjSGFuZGxlKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQUFDIGRlY29kZXIgaGFuZGxlIGlzIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTlVMTCA9PSBtTXBlZ0REcmNIYW5kbGUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJNUEVHLUQgRFJDIGRlY29kZXIgaGFuZGxlIGlzIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGxvb3AgPSAxOyBsb29wIDwgbU1hbGxvY0NvdW50OyBsb29wKyspIHsKLSAgICAgICAgICAgIGlmIChtTWVtb3J5QXJyYXlbbG9vcF0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IgJWRcbiIsIGxvb3ApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEFMT0dFKCJpbml0WEFBQ0RlY29kZXIgRmFpbGVkIik7Ci0KLSAgICAgICAgZm9yIChsb29wID0gMDsgbG9vcCA8IG1NYWxsb2NDb3VudDsgbG9vcCsrKSB7Ci0gICAgICAgICAgICBpZiAobU1lbW9yeUFycmF5W2xvb3BdKSBmcmVlKG1NZW1vcnlBcnJheVtsb29wXSk7Ci0gICAgICAgIH0KLSAgICAgICAgbU1hbGxvY0NvdW50ID0gMDsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9IGVsc2UgewotICAgICAgICBzdGF0dXMgPSBPSzsKKyAgICAgICAgQUxPR0UoImluaXRYQUFDRGVjb2RlciBmYWlsZWQgd2l0aCBlcnJvciAlZCIsIGVycl9jb2RlKTsKKyAgICAgICAgZGVJbml0WEFBQ0RlY29kZXIoKTsKKyAgICAgICAgcmV0dXJuIGVycl9jb2RlOwogICAgIH0KIAogICAgIG1FbmRPZklucHV0ID0gZmFsc2U7CkBAIC0yNzQsNyArMjYxLDcgQEAKICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19EUkNfRUZGRUNUX1RZUEUiKTsKIAogI2VuZGlmCi0gICAgcmV0dXJuIHN0YXR1czsKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7CiB9CiAKIE9NWF9FUlJPUlRZUEUgU29mdFhBQUM6OmludGVybmFsR2V0UGFyYW1ldGVyKE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CkBAIC01NDcsOSArNTM0LDYgQEAKICAgICAvKiBzYW1wbGUgY3VycmVudGx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgIGlmIChtSXNDb2RlY0luaXRpYWxpemVkKSB7CiAgICAgICAgIG51bU91dEJ5dGVzID0gbU91dHB1dEZyYW1lTGVuZ3RoICogKG1QY21XZFN6IC8gOCkgKiBtTnVtQ2hhbm5lbHM7Ci0gICAgICAgIGlmICgobVBjbVdkU3ogLyA4KSAhPSAyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiWEFBQyBhc3N1bWVzIDIgYnl0ZXMgcGVyIHNhbXBsZSEgbVBjbVdkU3ogJWQiLCBtUGNtV2RTeik7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICB3aGlsZSAoKCFpblF1ZXVlLmVtcHR5KCkgfHwgbUVuZE9mSW5wdXQpICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7CkBAIC01NjksOCArNTUzLDggQEAKICAgICAgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aCA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOwogCiAgICAgICAgICAgICAgICAgLyogR0EgaGVhZGVyIGNvbmZpZ3VyYXRpb24gc2VudCB0byBEZWNvZGVyISAqLwotICAgICAgICAgICAgICAgIGludCBlcnJfY29kZSA9IGNvbmZpZ1hBQUNEZWNvZGVyKGluQnVmZmVyLCBpbkJ1ZmZlckxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKDAgIT0gZXJyX2NvZGUpIHsKKyAgICAgICAgICAgICAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBjb25maWdYQUFDRGVjb2RlcihpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChJQV9OT19FUlJPUiAhPSBlcnJfY29kZSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygiY29uZmlnWEFBQ0RlY29kZXIgZXJyX2NvZGUgPSAlZCIsIGVycl9jb2RlKTsKICAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIGVycl9jb2RlLCBOVUxMKTsKQEAgLTY4Miw4ICs2NjYsOCBAQAogICAgICAgICAgICAgLyogd2hpY2ggc2hvdWxkIGluaXRpYWxpemUgdGhlIGNvZGVjLiBPbmNlIHRoaXMgc3RhdGUgaXMgcmVhY2hlZCwgY2FsbCB0aGUgICovCiAgICAgICAgICAgICAvKiBkZWNvZGVYQUFDU3RyZWFtIEFQSSB3aXRoIHNhbWUgZnJhbWUgdG8gZGVjb2RlISAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICBpZiAoIW1Jc0NvZGVjSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgICAgICBpbnQgZXJyX2NvZGUgPSBjb25maWdYQUFDRGVjb2RlcihpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgpOwotICAgICAgICAgICAgICAgIGlmICgwICE9IGVycl9jb2RlKSB7CisgICAgICAgICAgICAgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gY29uZmlnWEFBQ0RlY29kZXIoaW5CdWZmZXIsIGluQnVmZmVyTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoSUFfTk9fRVJST1IgIT0gZXJyX2NvZGUpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNvbmZpZ1hBQUNEZWNvZGVyIEZhaWxlZCAyIGVycl9jb2RlID0gJWQiLCBlcnJfY29kZSk7CiAgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCBlcnJfY29kZSwgTlVMTCk7CkBAIC04NDUsNyArODI5LDcgQEAKICAgICB9CiB9CiAKLWludCBTb2Z0WEFBQzo6Y29uZmlnZmx1c2hEZWNvZGUoKSB7CitJQV9FUlJPUkNPREUgU29mdFhBQUM6OmNvbmZpZ2ZsdXNoRGVjb2RlKCkgewogICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZTsKICAgICBVV09SRDMyIHVpX2luaXRfZG9uZTsKICAgICB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCA9IDgyMDM7CkBAIC04NzEsMTYgKzg1NSwxMyBAQAogICAgICAgICAgICAgIkZvdW5kIENvZGVjIHdpdGggYmVsb3cgY29uZmlnLS0tXG5zYW1wRnJlcSAlZFxubnVtQ2hhbm5lbHMgJWRcbnBjbVdkU3ogIgogICAgICAgICAgICAgIiVkXG5jaGFubmVsTWFzayAlZFxub3V0cHV0RnJhbWVMZW5ndGggJWQiLAogICAgICAgICAgICAgbVNhbXBGcmVxLCBtTnVtQ2hhbm5lbHMsIG1QY21XZFN6LCBtQ2hhbm5lbE1hc2ssIG1PdXRwdXRGcmFtZUxlbmd0aCk7Ci0gICAgICAgIGlmIChtTnVtQ2hhbm5lbHMgPiBNQVhfQ0hBTk5FTF9DT1VOVCkgewotICAgICAgICAgICAgQUxPR0UoIiBObyBvZiBjaGFubmVscyBhcmUgbW9yZSB0aGFuIG1heCBjaGFubmVsc1xuIik7Ci0gICAgICAgICAgICBtSXNDb2RlY0luaXRpYWxpemVkID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgbUlzQ29kZWNJbml0aWFsaXplZCA9IHRydWU7CisKKyAgICAgICAgbUlzQ29kZWNJbml0aWFsaXplZCA9IHRydWU7CiAgICAgfQotICAgIHJldHVybiBlcnJfY29kZTsKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7CiB9Ci1pbnQgU29mdFhBQUM6OmRyYWluRGVjb2RlcigpIHsKLSAgICByZXR1cm4gMDsKK0lBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6ZHJhaW5EZWNvZGVyKCkgeworICAgIHJldHVybiBJQV9OT19FUlJPUjsKIH0KIAogdm9pZCBTb2Z0WEFBQzo6b25SZXNldCgpIHsKQEAgLTkyMSw3ICs5MDIsNyBAQAogICAgIH0KIH0KIAotaW50IFNvZnRYQUFDOjppbml0WEFBQ0RlY29kZXIoKSB7CitJQV9FUlJPUkNPREUgU29mdFhBQUM6OmluaXRYQUFDRGVjb2RlcigpIHsKICAgICBMT09QSURYIGk7CiAKICAgICAvKiBFcnJvciBjb2RlICovCkBAIC05MzksMTEgKzkyMCwxMSBAQAogICAgIFVXT1JEMzIgdWlfcHJvY19tZW1fdGFic19zaXplOwogICAgIC8qIEFQSSBzaXplICovCiAgICAgVVdPUkQzMiBwdWlfYXBpX3NpemU7CisgICAgcFZPSUQgcHZfYWxsb2NfcHRyOwogCiAgICAgbUlucHV0QnVmZmVyU2l6ZSA9IDA7CiAgICAgbUlucHV0QnVmZmVyID0gMDsKICAgICBtT3V0cHV0QnVmZmVyID0gMDsKLSAgICBtTWFsbG9jQ291bnQgPSAwOwogCiAgICAgLyogUHJvY2VzcyBzdHJ1Y3QgaW5pdGluZyBlbmQgKi8KICAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC05NTQsMjAgKzkzNSwxMyBAQAogICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShOVUxMLCBJQV9BUElfQ01EX0dFVF9BUElfU0laRSwgMCwgJnB1aV9hcGlfc2l6ZSk7CiAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfQVBJX1NJWkUiKTsKIAotICAgIGlmIChtTWFsbG9jQ291bnQgPT0gTUFYX01FTV9BTExPQ1MpIHsKLSAgICAgICAgQUxPR0UoIm1NZW1vcnlBcnJheSBpcyBmdWxsIik7Ci0gICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKLSAgICB9Ci0KICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIEFQSSAqLwotICAgIG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID0gbWVtYWxpZ24oNCwgcHVpX2FwaV9zaXplKTsKLSAgICBpZiAobU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPT0gTlVMTCkgeworICAgIG1YaGVhYWNDb2RlY0hhbmRsZSA9IG1lbWFsaWduKDQsIHB1aV9hcGlfc2l6ZSk7CisgICAgaWYgKG1YaGVhYWNDb2RlY0hhbmRsZSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJtYWxsb2MgZm9yIHB1aV9hcGlfc2l6ZSArIDQgPj4gJWQgRmFpbGVkIiwgcHVpX2FwaV9zaXplICsgNCk7CiAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKICAgICB9Ci0gICAgLyogU2V0IEFQSSBvYmplY3Qgd2l0aCB0aGUgbWVtb3J5IGFsbG9jYXRlZCAqLwotICAgIG1YaGVhYWNDb2RlY0hhbmRsZSA9IChwVk9JRCkoKFdPUkQ4KiltTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSk7Ci0gICAgbU1hbGxvY0NvdW50Kys7CisgICAgbU1lbW9yeVZlYy5wdXNoKG1YaGVhYWNDb2RlY0hhbmRsZSk7CiAKICAgICAvKiBTZXQgdGhlIGNvbmZpZyBwYXJhbXMgdG8gZGVmYXVsdCB2YWx1ZXMgKi8KICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0lOSVQsCkBAIC05NzksMjMgKzk1MywxNiBAQAogCiAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfQVBJX1NJWkUiKTsKIAotICAgIGlmIChtTWFsbG9jQ291bnQgPT0gTUFYX01FTV9BTExPQ1MpIHsKLSAgICAgICAgQUxPR0UoIm1NZW1vcnlBcnJheSBpcyBmdWxsIik7Ci0gICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKLSAgICB9Ci0KICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIEFQSSAqLwotICAgIG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID0gbWVtYWxpZ24oNCwgcHVpX2FwaV9zaXplKTsKKyAgICBtTXBlZ0REcmNIYW5kbGUgPSBtZW1hbGlnbig0LCBwdWlfYXBpX3NpemUpOwogCi0gICAgaWYgKG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID09IE5VTEwpIHsKKyAgICBpZiAobU1wZWdERHJjSGFuZGxlID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIm1hbGxvYyBmb3IgZHJjIGFwaSBzdHJ1Y3R1cmUgRmFpbGVkIik7CiAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKICAgICB9Ci0gICAgbWVtc2V0KG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdLCAwLCBwdWlfYXBpX3NpemUpOworICAgIG1NZW1vcnlWZWMucHVzaChtTXBlZ0REcmNIYW5kbGUpOwogCi0gICAgLyogU2V0IEFQSSBvYmplY3Qgd2l0aCB0aGUgbWVtb3J5IGFsbG9jYXRlZCAqLwotICAgIG1NcGVnRERyY0hhbmRsZSA9IChwVk9JRCkoKFdPUkQ4KiltTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSk7Ci0gICAgbU1hbGxvY0NvdW50Kys7CisgICAgbWVtc2V0KG1NcGVnRERyY0hhbmRsZSwgMCwgcHVpX2FwaV9zaXplKTsKIAogICAgIC8qIFNldCB0aGUgY29uZmlnIHBhcmFtcyB0byBkZWZhdWx0IHZhbHVlcyAqLwogICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0lOSVQsCkBAIC0xMDIxLDIzICs5ODgsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX3Byb2NfbWVtX3RhYnNfc2l6ZSk7CiAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNVEFCU19TSVpFIik7CiAKLSAgICBpZiAobU1hbGxvY0NvdW50ID09IE1BWF9NRU1fQUxMT0NTKSB7Ci0gICAgICAgIEFMT0dFKCJtTWVtb3J5QXJyYXkgaXMgZnVsbCIpOwotICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7Ci0gICAgfQotCi0gICAgbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPSBtZW1hbGlnbig0LCB1aV9wcm9jX21lbV90YWJzX3NpemUpOwotICAgIGlmIChtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9PSBOVUxMKSB7CisgICAgcHZfYWxsb2NfcHRyID0gbWVtYWxpZ24oNCwgdWlfcHJvY19tZW1fdGFic19zaXplKTsKKyAgICBpZiAocHZfYWxsb2NfcHRyID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIk1hbGxvYyBmb3Igc2l6ZSAodWlfcHJvY19tZW1fdGFic19zaXplICsgNCkgPSAlZCBmYWlsZWQhIiwKICAgICAgICAgICAgICAgdWlfcHJvY19tZW1fdGFic19zaXplICsgNCk7CiAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKICAgICB9Ci0gICAgbU1hbGxvY0NvdW50Kys7Ci0gICAgLyogU2V0IHBvaW50ZXIgZm9yIHByb2Nlc3MgbWVtb3J5IHRhYmxlcyAgICAqLwotICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTVRBQlNfUFRSLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFZPSUQpKChXT1JEOCopbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudCAtIDFdKSk7Ci0gICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfTUVNVEFCU19QVFIiKTsKKyAgICBtTWVtb3J5VmVjLnB1c2gocHZfYWxsb2NfcHRyKTsKIAorICAgIC8qIFNldCBwb2ludGVyIGZvciBwcm9jZXNzIG1lbW9yeSB0YWJsZXMgICAgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9NRU1UQUJTX1BUUiwgMCwgcHZfYWxsb2NfcHRyKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1UQUJTX1BUUiIpOwogCiAgICAgLyogaW5pdGlhbGl6ZSB0aGUgQVBJLCBwb3N0IGNvbmZpZywgZmlsbCBtZW1vcnkgdGFibGVzICAqLwogICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKQEAgLTEwNjYsMTcgKzEwMjcsMTIgQEAKICAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fVFlQRSwgaSwgJnVpX3R5cGUpOwogICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19UWVBFIik7CiAKLSAgICAgICAgaWYgKG1NYWxsb2NDb3VudCA9PSBNQVhfTUVNX0FMTE9DUykgewotICAgICAgICAgICAgQUxPR0UoIm1NZW1vcnlBcnJheSBpcyBmdWxsIik7Ci0gICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPSBtZW1hbGlnbih1aV9hbGlnbm1lbnQsIHVpX3NpemUpOwotICAgICAgICBpZiAobU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPT0gTlVMTCkgeworICAgICAgICBwdl9hbGxvY19wdHIgPSBtZW1hbGlnbih1aV9hbGlnbm1lbnQsIHVpX3NpemUpOworICAgICAgICBpZiAocHZfYWxsb2NfcHRyID09IE5VTEwpIHsKICAgICAgICAgICAgIEFMT0dFKCJNYWxsb2MgZm9yIHNpemUgKHVpX3NpemUgKyB1aV9hbGlnbm1lbnQpID0gJWQgZmFpbGVkISIsIHVpX3NpemUgKyB1aV9hbGlnbm1lbnQpOwogICAgICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwogICAgICAgICB9Ci0gICAgICAgIHB2X2FsbG9jX3B0ciA9IChwVk9JRCkoKFdPUkQ4KiltTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSk7Ci0gICAgICAgIG1NYWxsb2NDb3VudCsrOworICAgICAgICBtTWVtb3J5VmVjLnB1c2gocHZfYWxsb2NfcHRyKTsKIAogICAgICAgICAvKiBTZXQgdGhlIGJ1ZmZlciBwb2ludGVyICovCiAgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTV9QVFIsIGksIHB2X2FsbG9jX3B0cik7CkBAIC0xMDk1LDcgKzEwNTEsNyBAQAogICAgIHJldHVybiBJQV9OT19FUlJPUjsKIH0KIAotaW50IFNvZnRYQUFDOjpjb25maWdYQUFDRGVjb2Rlcih1aW50OF90KiBpbkJ1ZmZlciwgdWludDMyX3QgaW5CdWZmZXJMZW5ndGgpIHsKK0lBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6Y29uZmlnWEFBQ0RlY29kZXIodWludDhfdCogaW5CdWZmZXIsIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoKSB7CiAgICAgVVdPUkQzMiB1aV9pbml0X2RvbmU7CiAgICAgaW50MzJfdCBpX2J5dGVzX2NvbnN1bWVkOwogCkBAIC0xMTU0LDEzICsxMTEwLDczIEBACiAKICAgICByZXR1cm4gSUFfTk9fRVJST1I7CiB9Ci1pbnQgU29mdFhBQUM6OmNvbmZpZ01QRUdERHJjKCkgeworSUFfRVJST1JDT0RFIFNvZnRYQUFDOjppbml0TVBFR0RERHJjKCkgeworICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IElBX05PX0VSUk9SOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IChXT1JEMzIpMjsgaSsrKSB7CisgICAgICAgIFdPUkQzMiB1aV9zaXplLCB1aV9hbGlnbm1lbnQsIHVpX3R5cGU7CisgICAgICAgIHBWT0lEIHB2X2FsbG9jX3B0cjsKKworICAgICAgICAvKiBHZXQgbWVtb3J5IHNpemUgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfR0VUX01FTV9JTkZPX1NJWkUsIGksICZ1aV9zaXplKTsKKworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19TSVpFIik7CisKKyAgICAgICAgLyogR2V0IG1lbW9yeSBhbGlnbm1lbnQgKi8KKyAgICAgICAgZXJyX2NvZGUgPQorICAgICAgICAgICAgaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19BTElHTk1FTlQsIGksICZ1aV9hbGlnbm1lbnQpOworCisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX0FMSUdOTUVOVCIpOworCisgICAgICAgIC8qIEdldCBtZW1vcnkgdHlwZSAqLworICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fVFlQRSwgaSwgJnVpX3R5cGUpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19UWVBFIik7CisKKyAgICAgICAgcHZfYWxsb2NfcHRyID0gbWVtYWxpZ24oNCwgdWlfc2l6ZSk7CisgICAgICAgIGlmIChwdl9hbGxvY19wdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIiBDYW5ub3QgY3JlYXRlIHJlcXVlc3RlZCBtZW1vcnkgICVkIiwgdWlfc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgbURyY01lbW9yeVZlYy5wdXNoKHB2X2FsbG9jX3B0cik7CisKKyAgICAgICAgLyogU2V0IHRoZSBidWZmZXIgcG9pbnRlciAqLworICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiwgaSwgcHZfYWxsb2NfcHRyKTsKKworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1fUFRSIik7CisgICAgfQorCisgICAgV09SRDMyIHVpX3NpemU7CisgICAgdWlfc2l6ZSA9IDgxOTIgKiAyOworCisgICAgbURyY0luQnVmID0gKGludDhfdCopbWVtYWxpZ24oNCwgdWlfc2l6ZSk7CisgICAgaWYgKG1EcmNJbkJ1ZiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIgQ2Fubm90IGNyZWF0ZSByZXF1ZXN0ZWQgbWVtb3J5ICAlZCIsIHVpX3NpemUpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorICAgIG1EcmNNZW1vcnlWZWMucHVzaChtRHJjSW5CdWYpOworCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTV9QVFIsIDIsIG1EcmNJbkJ1Zik7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiIpOworCisgICAgbURyY091dEJ1ZiA9IChpbnQ4X3QqKW1lbWFsaWduKDQsIHVpX3NpemUpOworICAgIGlmIChtRHJjT3V0QnVmID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiBDYW5ub3QgY3JlYXRlIHJlcXVlc3RlZCBtZW1vcnkgICVkIiwgdWlfc2l6ZSk7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CisgICAgbURyY01lbW9yeVZlYy5wdXNoKG1EcmNPdXRCdWYpOworCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTV9QVFIsIDMsIG1EcmNPdXRCdWYpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTV9QVFIiKTsKKworICAgIHJldHVybiBJQV9OT19FUlJPUjsKK30KK0lBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6Y29uZmlnTVBFR0REcmMoKSB7CiAgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CiAgICAgaW50IGlfZWZmZWN0X3R5cGU7CiAgICAgaW50IGlfbG91ZF9ub3JtOwogICAgIGludCBpX3RhcmdldF9sb3VkbmVzczsKICAgICB1bnNpZ25lZCBpbnQgaV9zYnJfbW9kZTsKLSAgICBpbnQgbl9tZW1zOwogICAgIGludCBpOwogCiAjaWZkZWYgRU5BQkxFX01QRUdfRF9EUkMKQEAgLTEyMTcsNzggKzEyMzMsMTYgQEAKIAogICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9DTURfVFlQRV9JTklUX0FQSV9QT1NUX0NPTkZJR19QQVJBTVMiKTsKIAotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKFdPUkQzMikyOyBpKyspIHsKLSAgICAgICAgICAgIFdPUkQzMiB1aV9zaXplLCB1aV9hbGlnbm1lbnQsIHVpX3R5cGU7Ci0gICAgICAgICAgICBwVk9JRCBwdl9hbGxvY19wdHI7CisgICAgICAgIC8qIEZyZWUgYW55IG1lbW9yeSB0aGF0IGlzIGFsbG9jYXRlZCBmb3IgTVBFRyBEIERyYyBzbyBmYXIgKi8KKyAgICAgICAgZGVJbml0TVBFR0RERHJjKCk7CiAKLSAgICAgICAgICAgIC8qIEdldCBtZW1vcnkgc2l6ZSAqLwotICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfR0VUX01FTV9JTkZPX1NJWkUsIGksICZ1aV9zaXplKTsKLQotICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fU0laRSIpOwotCi0gICAgICAgICAgICAvKiBHZXQgbWVtb3J5IGFsaWdubWVudCAqLwotICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfR0VUX01FTV9JTkZPX0FMSUdOTUVOVCwgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2FsaWdubWVudCk7Ci0KLSAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX0FMSUdOTUVOVCIpOwotCi0gICAgICAgICAgICAvKiBHZXQgbWVtb3J5IHR5cGUgKi8KLSAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19UWVBFLCBpLCAmdWlfdHlwZSk7Ci0gICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19UWVBFIik7Ci0gICAgICAgICAgICBpZiAobU1hbGxvY0NvdW50ID09IE1BWF9NRU1fQUxMT0NTKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIm1NZW1vcnlBcnJheSBpcyBmdWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9IG1lbWFsaWduKDQsIHVpX3NpemUpOwotICAgICAgICAgICAgaWYgKG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiIENhbm5vdCBjcmVhdGUgcmVxdWVzdGVkIG1lbW9yeSAgJWQiLCB1aV9zaXplKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdl9hbGxvY19wdHIgPSAocFZPSUQpKChXT1JEOCopbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0pOwotICAgICAgICAgICAgbU1hbGxvY0NvdW50Kys7Ci0KLSAgICAgICAgICAgIC8qIFNldCB0aGUgYnVmZmVyIHBvaW50ZXIgKi8KLSAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9NRU1fUFRSLCBpLCBwdl9hbGxvY19wdHIpOwotCi0gICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1fUFRSIik7CisgICAgICAgIGVycl9jb2RlID0gaW5pdE1QRUdERERyYygpOworICAgICAgICBpZiAoZXJyX2NvZGUgIT0gSUFfTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJpbml0TVBFR0RERHJjIGZhaWxlZCB3aXRoIGVycm9yICVkIiwgZXJyX2NvZGUpOworICAgICAgICAgICAgZGVJbml0TVBFR0RERHJjKCk7CisgICAgICAgICAgICByZXR1cm4gZXJyX2NvZGU7CiAgICAgICAgIH0KLSAgICAgICAgewotICAgICAgICAgICAgV09SRDMyIHVpX3NpemU7Ci0gICAgICAgICAgICB1aV9zaXplID0gODE5MiAqIDI7Ci0gICAgICAgICAgICBpZiAobU1hbGxvY0NvdW50ID09IE1BWF9NRU1fQUxMT0NTKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIm1NZW1vcnlBcnJheSBpcyBmdWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwotICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9IG1lbWFsaWduKDQsIHVpX3NpemUpOwotICAgICAgICAgICAgaWYgKG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiIENhbm5vdCBjcmVhdGUgcmVxdWVzdGVkIG1lbW9yeSAgJWQiLCB1aV9zaXplKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1EcmNJbkJ1ZiA9IChpbnQ4X3QqKW1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdOwotICAgICAgICAgICAgbU1hbGxvY0NvdW50Kys7Ci0gICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiwgMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptT3V0cHV0QnVmZmVyKi8gbURyY0luQnVmKTsKLSAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTV9QVFIiKTsKLQotICAgICAgICAgICAgaWYgKG1NYWxsb2NDb3VudCA9PSBNQVhfTUVNX0FMTE9DUykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJtTWVtb3J5QXJyYXkgaXMgZnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID0gbWVtYWxpZ24oNCwgdWlfc2l6ZSk7Ci0gICAgICAgICAgICBpZiAobU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIgQ2Fubm90IGNyZWF0ZSByZXF1ZXN0ZWQgbWVtb3J5ICAlZCIsIHVpX3NpemUpOwotICAgICAgICAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbURyY091dEJ1ZiA9IChpbnQ4X3QqKW1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdOwotICAgICAgICAgICAgbU1hbGxvY0NvdW50Kys7Ci0gICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiwgMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptT3V0cHV0QnVmZmVyKi8gbURyY091dEJ1Zik7Ci0gICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1fUFRSIik7Ci0gICAgICAgIH0KICAgICAgICAgLyogRFJDIGJ1ZmZlcnMKICAgICAgICAgICAgIGJ1ZlswXSAtIGNvbnRhaW5zIGV4dGVuc2lvbiBlbGVtZW50IHBheSBsb2FkIGxvdWRuZXNzIHJlbGF0ZWQKICAgICAgICAgICAgIGJ1ZlsxXSAtIGNvbnRhaW5zIGV4dGVuc2lvbiBlbGVtZW50IHBheSBsb2FkKi8KQEAgLTE0MjMsMTAgKzEzNzcsMTAgQEAKICAgICB9CiAjZW5kaWYKIAotICAgIHJldHVybiBlcnJfY29kZTsKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7CiB9Ci1pbnQgU29mdFhBQUM6OmRlY29kZVhBQUNTdHJlYW0odWludDhfdCogaW5CdWZmZXIsIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoLCBpbnQzMl90KiBieXRlc0NvbnN1bWVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIG91dEJ5dGVzKSB7CitJQV9FUlJPUkNPREUgU29mdFhBQUM6OmRlY29kZVhBQUNTdHJlYW0odWludDhfdCogaW5CdWZmZXIsIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGJ5dGVzQ29uc3VtZWQsIGludDMyX3QqIG91dEJ5dGVzKSB7CiAgICAgaWYgKG1JbnB1dEJ1ZmZlclNpemUgPCBpbkJ1ZmZlckxlbmd0aCkgewogICAgICAgICBBTE9HRSgiQ2Fubm90IGNvbmZpZyBBQUMsIGlucHV0IGJ1ZmZlciBzaXplICVkIDwgaW5CdWZmZXJMZW5ndGggJWQiLCBtSW5wdXRCdWZmZXJTaXplLAogICAgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aCk7CkBAIC0xNTE2LDI0ICsxNDcwLDMzIEBACiAgICAgICAgIG1lbWNweShtT3V0cHV0QnVmZmVyLCBtRHJjT3V0QnVmLCAqb3V0Qnl0ZXMpOwogICAgIH0KICNlbmRpZgotICAgIHJldHVybiBlcnJfY29kZTsKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7CiB9CiAKLWludCBTb2Z0WEFBQzo6ZGVJbml0WEFBQ0RlY29kZXIoKSB7CitJQV9FUlJPUkNPREUgU29mdFhBQUM6OmRlSW5pdFhBQUNEZWNvZGVyKCkgewogICAgIEFMT0dJKCJkZUluaXRYQUFDRGVjb2RlciIpOwogCiAgICAgLyogVGVsbCB0aGF0IHRoZSBpbnB1dCBpcyBvdmVyIGluIHRoaXMgYnVmZmVyICovCiAgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfSU5QVVRfT1ZFUiwgMCwgTlVMTCk7Ci0gICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9JTlBVVF9PVkVSIik7CiAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1NYWxsb2NDb3VudDsgaSsrKSB7Ci0gICAgICAgIGlmIChtTWVtb3J5QXJyYXlbaV0pIGZyZWUobU1lbW9yeUFycmF5W2ldKTsKKyAgICAvKiBJcnJlc3BlY3RpdmUgb2YgZXJyb3IgcmV0dXJuZWQgaW4gSUFfQVBJX0NNRF9JTlBVVF9PVkVSLCBmcmVlIGFsbG9jYXRlZCBtZW1vcnkgKi8KKyAgICBmb3IgKHZvaWQqIGJ1ZiA6IG1NZW1vcnlWZWMpIHsKKyAgICAgICAgZnJlZShidWYpOwogICAgIH0KLSAgICBtTWFsbG9jQ291bnQgPSAwOwotCisgICAgbU1lbW9yeVZlYy5jbGVhcigpOwogICAgIHJldHVybiBlcnJfY29kZTsKIH0KIAorSUFfRVJST1JDT0RFIFNvZnRYQUFDOjpkZUluaXRNUEVHREREcmMoKSB7CisgICAgQUxPR0koImRlSW5pdE1QRUdERERyYyIpOworCisgICAgZm9yICh2b2lkKiBidWYgOiBtRHJjTWVtb3J5VmVjKSB7CisgICAgICAgIGZyZWUoYnVmKTsKKyAgICB9CisgICAgbURyY01lbW9yeVZlYy5jbGVhcigpOworICAgIHJldHVybiBJQV9OT19FUlJPUjsKK30KKwogSUFfRVJST1JDT0RFIFNvZnRYQUFDOjpnZXRYQUFDU3RyZWFtSW5mbygpIHsKICAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBJQV9OT19FUlJPUjsKIApAQCAtMTU0NiwxMSArMTUwOSwxOSBAQAogICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX05VTV9DSEFOTkVMUywgJm1OdW1DaGFubmVscyk7CiAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX05VTV9DSEFOTkVMUyIpOworICAgIGlmIChtTnVtQ2hhbm5lbHMgPiBNQVhfQ0hBTk5FTF9DT1VOVCkgeworICAgICAgICBBTE9HRSgiIE5vIG9mIGNoYW5uZWxzIGFyZSBtb3JlIHRoYW4gbWF4IGNoYW5uZWxzXG4iKTsKKyAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KIAogICAgIC8qIFBDTSB3b3JkIHNpemUgKi8KICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9QQ01fV0RTWiwgJm1QY21XZFN6KTsKICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fUENNX1dEU1oiKTsKKyAgICBpZiAoKG1QY21XZFN6IC8gOCkgIT0gMikgeworICAgICAgICBBTE9HRSgiSW52YWxpZCBOdW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZTogJWQsIEV4cGVjdGVkIGlzIDIiLCBtUGNtV2RTeik7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CiAKICAgICAvKiBjaGFubmVsIG1hc2sgdG8gdGVsbCB0aGUgYXJyYW5nZW1lbnQgb2YgY2hhbm5lbHMgaW4gYml0IHN0cmVhbSAqLwogICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL1NvZnRYQUFDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9Tb2Z0WEFBQy5oCmluZGV4IDYxNzYwODIuLmE2MmE3OTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL1NvZnRYQUFDLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvU29mdFhBQUMuaApAQCAtMzMsOCArMzMsNiBAQAogI2luY2x1ZGUgImltcGRfYXBpY21kX3N0YW5kYXJkcy5oIgogI2luY2x1ZGUgImltcGRfZHJjX2NvbmZpZ19wYXJhbXMuaCIKIAotI2RlZmluZSBNQVhfTUVNX0FMTE9DUyAxMDAKLQogZXh0ZXJuICJDIiBJQV9FUlJPUkNPREUgaXhoZWFhY2RfZGVjX2FwaShwVk9JRCBwX2lhX21vZHVsZV9vYmosIFdPUkQzMiBpX2NtZCwgV09SRDMyIGlfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVk9JRCBwdl92YWx1ZSk7CiBleHRlcm4gIkMiIElBX0VSUk9SQ09ERSBpYV9kcmNfZGVjX2FwaShwVk9JRCBwX2lhX21vZHVsZV9vYmosIFdPUkQzMiBpX2NtZCwgV09SRDMyIGlfaWR4LApAQCAtODAsMTggKzc4LDE5IEBACiAgICAgZW51bSB7IE5PTkUsIEFXQUlUSU5HX0RJU0FCTEVELCBBV0FJVElOR19FTkFCTEVEIH0gbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZTsKIAogICAgIHZvaWQgaW5pdFBvcnRzKCk7Ci0gICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBJQV9FUlJPUkNPREUgaW5pdERlY29kZXIoKTsKICAgICBib29sIGlzQ29uZmlndXJlZCgpIGNvbnN0OwotICAgIGludCBkcmFpbkRlY29kZXIoKTsKLSAgICBpbnQgaW5pdFhBQUNEZWNvZGVyKCk7Ci0gICAgaW50IGRlSW5pdFhBQUNEZWNvZGVyKCk7CisgICAgSUFfRVJST1JDT0RFIGRyYWluRGVjb2RlcigpOworICAgIElBX0VSUk9SQ09ERSBpbml0WEFBQ0RlY29kZXIoKTsKKyAgICBJQV9FUlJPUkNPREUgZGVJbml0WEFBQ0RlY29kZXIoKTsKKyAgICBJQV9FUlJPUkNPREUgaW5pdE1QRUdERERyYygpOworICAgIElBX0VSUk9SQ09ERSBkZUluaXRNUEVHREREcmMoKTsKKyAgICBJQV9FUlJPUkNPREUgY29uZmlnWEFBQ0RlY29kZXIodWludDhfdCogaW5CdWZmZXIsIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoKTsKKyAgICBJQV9FUlJPUkNPREUgY29uZmlnTVBFR0REcmMoKTsKKyAgICBJQV9FUlJPUkNPREUgZGVjb2RlWEFBQ1N0cmVhbSh1aW50OF90KiBpbkJ1ZmZlciwgdWludDMyX3QgaW5CdWZmZXJMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogYnl0ZXNDb25zdW1lZCwgaW50MzJfdCogb3V0Qnl0ZXMpOwogCi0gICAgaW50IGNvbmZpZ1hBQUNEZWNvZGVyKHVpbnQ4X3QqIGluQnVmZmVyLCB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCk7Ci0gICAgaW50IGNvbmZpZ01QRUdERHJjKCk7Ci0gICAgaW50IGRlY29kZVhBQUNTdHJlYW0odWludDhfdCogaW5CdWZmZXIsIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoLCBpbnQzMl90KiBieXRlc0NvbnN1bWVkLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIG91dEJ5dGVzKTsKLQotICAgIGludCBjb25maWdmbHVzaERlY29kZSgpOworICAgIElBX0VSUk9SQ09ERSBjb25maWdmbHVzaERlY29kZSgpOwogICAgIElBX0VSUk9SQ09ERSBnZXRYQUFDU3RyZWFtSW5mbygpOwogICAgIElBX0VSUk9SQ09ERSBzZXRYQUFDRFJDSW5mbyhpbnQzMl90IGRyY0N1dCwgaW50MzJfdCBkcmNCb29zdCwgaW50MzJfdCBkcmNSZWZMZXZlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkcmNIZWF2eUNvbXByZXNzaW9uCkBAIC0xMjAsOSArMTE5LDggQEAKICAgICBpbnQ4X3QqIG1EcmNPdXRCdWY7CiAgICAgaW50MzJfdCBtTXBlZ0REUkNQcmVzZW50OwogICAgIGludDMyX3QgbURSQ0ZsYWc7Ci0KLSAgICB2b2lkKiBtTWVtb3J5QXJyYXlbTUFYX01FTV9BTExPQ1NdOwotICAgIGludDMyX3QgbU1hbGxvY0NvdW50OworICAgIFZlY3Rvcjx2b2lkKj4gbU1lbW9yeVZlYzsKKyAgICBWZWN0b3I8dm9pZCo+IG1EcmNNZW1vcnlWZWM7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTb2Z0WEFBQyk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0NvbG9yQ29udmVydGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAKaW5kZXggNzBmNTJjMy4uZDEzNmQ5ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0NvbG9yQ29udmVydGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwCkBAIC0yMSwxMCArMjEsMTMgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogCiAjaW5jbHVkZSAibGlieXV2L2NvbnZlcnRfZnJvbS5oIgorI2luY2x1ZGUgImxpYnl1di9jb252ZXJ0X2FyZ2IuaCIKKyNpbmNsdWRlICJsaWJ5dXYvcGxhbmFyX2Z1bmN0aW9ucy5oIgogI2luY2x1ZGUgImxpYnl1di92aWRlb19jb21tb24uaCIKICNpbmNsdWRlIDxmdW5jdGlvbmFsPgogI2luY2x1ZGUgPHN5cy90aW1lLmg+CkBAIC00NSwxMCArNDgsMjggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdGF0aWMgYm9vbCBpc1JHQihPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvckZvcm1hdCkgeworICAgIHJldHVybiBjb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjUKKyAgICAgICAgICAgIHx8IGNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQzMkJpdFJHQkE4ODg4CisgICAgICAgICAgICB8fCBjb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4ODsKK30KKworYm9vbCBDb2xvckNvbnZlcnRlcjo6Q29sb3JTcGFjZTo6aXNCdDcwOSgpIHsKKyAgICByZXR1cm4gKG1TdGFuZGFyZCA9PSBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZEJUNzA5KTsKK30KKworCitib29sIENvbG9yQ29udmVydGVyOjpDb2xvclNwYWNlOjppc0pwZWcoKSB7CisgICAgcmV0dXJuICgobVN0YW5kYXJkID09IENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkQlQ2MDFfNjI1KQorICAgICAgICAgICAgfHwgKG1TdGFuZGFyZCA9PSBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZEJUNjAxXzUyNSkpCisgICAgICAgICAgICAmJiAobVJhbmdlID09IENvbG9yVXRpbHM6OmtDb2xvclJhbmdlRnVsbCk7Cit9CisKIENvbG9yQ29udmVydGVyOjpDb2xvckNvbnZlcnRlcigKICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZnJvbSwgT01YX0NPTE9SX0ZPUk1BVFRZUEUgdG8pCiAgICAgOiBtU3JjRm9ybWF0KGZyb20pLAogICAgICAgbURzdEZvcm1hdCh0byksCisgICAgICBtU3JjQ29sb3JTcGFjZSh7MCwgMCwgMH0pLAogICAgICAgbUNsaXAoTlVMTCkgewogfQogCkBAIC03MSwyNCArOTIsNDYgQEAKIAogICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRDYllDclk6CiAgICAgICAgIGNhc2UgT01YX1FDT01fQ09MT1JfRm9ybWF0WVZVNDIwU2VtaVBsYW5hcjoKLSAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKICAgICAgICAgY2FzZSBPTVhfVElfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjoKICAgICAgICAgICAgIHJldHVybiBtRHN0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NTsKIAorICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorI2lmZGVmIFVTRV9MSUJZVVYKKyAgICAgICAgICAgIHJldHVybiBtRHN0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NQorICAgICAgICAgICAgICAgICAgICB8fCBtRHN0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQzMkJpdFJHQkE4ODg4OworI2Vsc2UKKyAgICAgICAgICAgIHJldHVybiBtRHN0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NTsKKyNlbmRpZgorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogfQogCiBib29sIENvbG9yQ29udmVydGVyOjppc0RzdFJHQigpIGNvbnN0IHsKLSAgICByZXR1cm4gbURzdEZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjUKLSAgICAgICAgICAgIHx8IG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODgKLSAgICAgICAgICAgIHx8IG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyYml0QkdSQTg4ODg7CisgICAgcmV0dXJuIGlzUkdCKG1Ec3RGb3JtYXQpOwogfQogCit2b2lkIENvbG9yQ29udmVydGVyOjpzZXRTcmNDb2xvclNwYWNlKAorICAgICAgICB1aW50MzJfdCBzdGFuZGFyZCwgdWludDMyX3QgcmFuZ2UsIHVpbnQzMl90IHRyYW5zZmVyKSB7CisgICAgaWYgKGlzUkdCKG1TcmNGb3JtYXQpKSB7CisgICAgICAgIEFMT0dXKCJDYW4ndCBzZXQgY29sb3Igc3BhY2Ugb24gUkdCIHNvdXJjZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1TcmNDb2xvclNwYWNlLm1TdGFuZGFyZCA9IHN0YW5kYXJkOworICAgIG1TcmNDb2xvclNwYWNlLm1SYW5nZSA9IHJhbmdlOworICAgIG1TcmNDb2xvclNwYWNlLm1UcmFuc2ZlciA9IHRyYW5zZmVyOworfQorCisvKgorICogSWYgc3RyaWRlIGlzIG5vbi16ZXJvLCBjbGllbnQncyBzdHJpZGUgd2lsbCBiZSB1c2VkLiBGb3IgcGxhbmFyCisgKiBvciBzZW1pLXBsYW5hciBZVVYgZm9ybWF0cywgc3RyaWRlIG11c3QgYmUgZXZlbiBudW1iZXJzLgorICogSWYgc3RyaWRlIGlzIHplcm8sIGl0IHdpbGwgYmUgY2FsY3VsYXRlZCBiYXNlZCBvbiB3aWR0aCBhbmQgYnBwCisgKiBvZiB0aGUgZm9ybWF0LCBhc3N1bWluZyBubyBwYWRkaW5nIG9uIHRoZSByaWdodCBlZGdlLgorICovCiBDb2xvckNvbnZlcnRlcjo6Qml0bWFwUGFyYW1zOjpCaXRtYXBQYXJhbXMoCiAgICAgICAgIHZvaWQgKmJpdHMsCi0gICAgICAgIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwKKyAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LCBzaXplX3Qgc3RyaWRlLAogICAgICAgICBzaXplX3QgY3JvcExlZnQsIHNpemVfdCBjcm9wVG9wLAogICAgICAgICBzaXplX3QgY3JvcFJpZ2h0LCBzaXplX3QgY3JvcEJvdHRvbSwKICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGcm9tYXQpCkBAIC0xMDIsNiArMTQ1LDggQEAKICAgICAgIG1Dcm9wQm90dG9tKGNyb3BCb3R0b20pIHsKICAgICBzd2l0Y2gobUNvbG9yRm9ybWF0KSB7CiAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjU6CisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyMTY6CisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0Q2JZQ3JZOgogICAgICAgICBtQnBwID0gMjsKICAgICAgICAgbVN0cmlkZSA9IDIgKiBtV2lkdGg7CiAgICAgICAgIGJyZWFrOwpAQCAtMTEzLDEzICsxNTgsNyBAQAogICAgICAgICBtU3RyaWRlID0gNCAqIG1XaWR0aDsKICAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIxNjoKLSAgICAgICAgbUJwcCA9IDI7Ci0gICAgICAgIG1TdHJpZGUgPSAyICogbVdpZHRoOwotICAgICAgICBicmVhazsKLQogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKLSAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRDYllDclk6CiAgICAgY2FzZSBPTVhfUUNPTV9DT0xPUl9Gb3JtYXRZVlU0MjBTZW1pUGxhbmFyOgogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CiAgICAgY2FzZSBPTVhfVElfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjoKQEAgLTEzMyw2ICsxNzIsMTAgQEAKICAgICAgICAgbVN0cmlkZSA9IG1XaWR0aDsKICAgICAgICAgYnJlYWs7CiAgICAgfQorICAgIC8vIHVzZSBjbGllbnQncyBzdHJpZGUgaWYgaXQncyBzcGVjaWZpZWQuCisgICAgaWYgKHN0cmlkZSAhPSAwKSB7CisgICAgICAgIG1TdHJpZGUgPSBzdHJpZGU7CisgICAgfQogfQogCiBzaXplX3QgQ29sb3JDb252ZXJ0ZXI6OkJpdG1hcFBhcmFtczo6Y3JvcFdpZHRoKCkgY29uc3QgewpAQCAtMTQ1LDIxICsxODgsMjEgQEAKIAogc3RhdHVzX3QgQ29sb3JDb252ZXJ0ZXI6OmNvbnZlcnQoCiAgICAgICAgIGNvbnN0IHZvaWQgKnNyY0JpdHMsCi0gICAgICAgIHNpemVfdCBzcmNXaWR0aCwgc2l6ZV90IHNyY0hlaWdodCwKKyAgICAgICAgc2l6ZV90IHNyY1dpZHRoLCBzaXplX3Qgc3JjSGVpZ2h0LCBzaXplX3Qgc3JjU3RyaWRlLAogICAgICAgICBzaXplX3Qgc3JjQ3JvcExlZnQsIHNpemVfdCBzcmNDcm9wVG9wLAogICAgICAgICBzaXplX3Qgc3JjQ3JvcFJpZ2h0LCBzaXplX3Qgc3JjQ3JvcEJvdHRvbSwKICAgICAgICAgdm9pZCAqZHN0Qml0cywKLSAgICAgICAgc2l6ZV90IGRzdFdpZHRoLCBzaXplX3QgZHN0SGVpZ2h0LAorICAgICAgICBzaXplX3QgZHN0V2lkdGgsIHNpemVfdCBkc3RIZWlnaHQsIHNpemVfdCBkc3RTdHJpZGUsCiAgICAgICAgIHNpemVfdCBkc3RDcm9wTGVmdCwgc2l6ZV90IGRzdENyb3BUb3AsCiAgICAgICAgIHNpemVfdCBkc3RDcm9wUmlnaHQsIHNpemVfdCBkc3RDcm9wQm90dG9tKSB7CiAgICAgQml0bWFwUGFyYW1zIHNyYygKICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dm9pZCAqPihzcmNCaXRzKSwKLSAgICAgICAgICAgIHNyY1dpZHRoLCBzcmNIZWlnaHQsCisgICAgICAgICAgICBzcmNXaWR0aCwgc3JjSGVpZ2h0LCBzcmNTdHJpZGUsCiAgICAgICAgICAgICBzcmNDcm9wTGVmdCwgc3JjQ3JvcFRvcCwgc3JjQ3JvcFJpZ2h0LCBzcmNDcm9wQm90dG9tLCBtU3JjRm9ybWF0KTsKIAogICAgIEJpdG1hcFBhcmFtcyBkc3QoCiAgICAgICAgICAgICBkc3RCaXRzLAotICAgICAgICAgICAgZHN0V2lkdGgsIGRzdEhlaWdodCwKKyAgICAgICAgICAgIGRzdFdpZHRoLCBkc3RIZWlnaHQsIGRzdFN0cmlkZSwKICAgICAgICAgICAgIGRzdENyb3BMZWZ0LCBkc3RDcm9wVG9wLCBkc3RDcm9wUmlnaHQsIGRzdENyb3BCb3R0b20sIG1Ec3RGb3JtYXQpOwogCiAgICAgaWYgKCEoKHNyYy5tQ3JvcExlZnQgJiAxKSA9PSAwCkBAIC0yMDEsNyArMjQ0LDExIEBACiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorI2lmZGVmIFVTRV9MSUJZVVYKKyAgICAgICAgICAgIGVyciA9IGNvbnZlcnRZVVY0MjBTZW1pUGxhbmFyVXNlTGliWVVWKHNyYywgZHN0KTsKKyNlbHNlCiAgICAgICAgICAgICBlcnIgPSBjb252ZXJ0WVVWNDIwU2VtaVBsYW5hcihzcmMsIGRzdCk7CisjZW5kaWYKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgT01YX1RJX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6CkBAIC0yNzYsNiArMzIzLDEzIEBACiAgICAgcmV0dXJuIE9LOwogfQogCisjZGVmaW5lIERFQ0xBUkVfWVVWMlJHQkZVTkMoZnVuYywgcmdiKSBpbnQgKCpmdW5jKSggICAgIFwKKyAgICAgICAgY29uc3QgdWludDgqLCBpbnQsIGNvbnN0IHVpbnQ4KiwgaW50LCAgICAgICAgICAgXAorICAgICAgICBjb25zdCB1aW50OCosIGludCwgdWludDgqLCBpbnQsIGludCwgaW50KSAgICAgICBcCisgICAgICAgID0gbVNyY0NvbG9yU3BhY2UuaXNCdDcwOSgpID8gbGlieXV2OjpINDIwVG8jI3JnYiBcCisgICAgICAgIDogbVNyY0NvbG9yU3BhY2UuaXNKcGVnKCkgPyBsaWJ5dXY6Oko0MjBUbyMjcmdiICBcCisgICAgICAgIDogbGlieXV2OjpJNDIwVG8jI3JnYgorCiBzdGF0dXNfdCBDb2xvckNvbnZlcnRlcjo6Y29udmVydFlVVjQyMFBsYW5hclVzZUxpYllVVigKICAgICAgICAgY29uc3QgQml0bWFwUGFyYW1zICZzcmMsIGNvbnN0IEJpdG1hcFBhcmFtcyAmZHN0KSB7CiAgICAgdWludDhfdCAqZHN0X3B0ciA9ICh1aW50OF90ICopZHN0Lm1CaXRzCkBAIC0yOTMsMTkgKzM0NywyOCBAQAogCiAgICAgc3dpdGNoIChtRHN0Rm9ybWF0KSB7CiAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjU6Ci0gICAgICAgIGxpYnl1djo6STQyMFRvUkdCNTY1KHNyY195LCBzcmMubVN0cmlkZSwgc3JjX3UsIHNyYy5tU3RyaWRlIC8gMiwgc3JjX3YsIHNyYy5tU3RyaWRlIC8gMiwKKyAgICB7CisgICAgICAgIERFQ0xBUkVfWVVWMlJHQkZVTkMoZnVuYywgUkdCNTY1KTsKKyAgICAgICAgKCpmdW5jKShzcmNfeSwgc3JjLm1TdHJpZGUsIHNyY191LCBzcmMubVN0cmlkZSAvIDIsIHNyY192LCBzcmMubVN0cmlkZSAvIDIsCiAgICAgICAgICAgICAgICAgKHVpbnQ4ICopZHN0X3B0ciwgZHN0Lm1TdHJpZGUsIHNyYy5jcm9wV2lkdGgoKSwgc3JjLmNyb3BIZWlnaHQoKSk7CiAgICAgICAgIGJyZWFrOworICAgIH0KIAogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODg6Ci0gICAgICAgIGxpYnl1djo6Q29udmVydEZyb21JNDIwKHNyY195LCBzcmMubVN0cmlkZSwgc3JjX3UsIHNyYy5tU3RyaWRlIC8gMiwgc3JjX3YsIHNyYy5tU3RyaWRlIC8gMiwKLSAgICAgICAgICAgICAgICAodWludDggKilkc3RfcHRyLCBkc3QubVN0cmlkZSwgc3JjLmNyb3BXaWR0aCgpLCBzcmMuY3JvcEhlaWdodCgpLCBsaWJ5dXY6OkZPVVJDQ19BQkdSKTsKKyAgICB7CisgICAgICAgIERFQ0xBUkVfWVVWMlJHQkZVTkMoZnVuYywgQUJHUik7CisgICAgICAgICgqZnVuYykoc3JjX3ksIHNyYy5tU3RyaWRlLCBzcmNfdSwgc3JjLm1TdHJpZGUgLyAyLCBzcmNfdiwgc3JjLm1TdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICh1aW50OCAqKWRzdF9wdHIsIGRzdC5tU3RyaWRlLCBzcmMuY3JvcFdpZHRoKCksIHNyYy5jcm9wSGVpZ2h0KCkpOwogICAgICAgICBicmVhazsKKyAgICB9CiAKICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4OgotICAgICAgICBsaWJ5dXY6OkNvbnZlcnRGcm9tSTQyMChzcmNfeSwgc3JjLm1TdHJpZGUsIHNyY191LCBzcmMubVN0cmlkZSAvIDIsIHNyY192LCBzcmMubVN0cmlkZSAvIDIsCi0gICAgICAgICAgICAgICAgKHVpbnQ4ICopZHN0X3B0ciwgZHN0Lm1TdHJpZGUsIHNyYy5jcm9wV2lkdGgoKSwgc3JjLmNyb3BIZWlnaHQoKSwgbGlieXV2OjpGT1VSQ0NfQVJHQik7CisgICAgeworICAgICAgICBERUNMQVJFX1lVVjJSR0JGVU5DKGZ1bmMsIEFSR0IpOworICAgICAgICAoKmZ1bmMpKHNyY195LCBzcmMubVN0cmlkZSwgc3JjX3UsIHNyYy5tU3RyaWRlIC8gMiwgc3JjX3YsIHNyYy5tU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAodWludDggKilkc3RfcHRyLCBkc3QubVN0cmlkZSwgc3JjLmNyb3BXaWR0aCgpLCBzcmMuY3JvcEhlaWdodCgpKTsKICAgICAgICAgYnJlYWs7CisgICAgfQogCiAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwpAQCAtMzE0LDYgKzM3NywzNiBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ29sb3JDb252ZXJ0ZXI6OmNvbnZlcnRZVVY0MjBTZW1pUGxhbmFyVXNlTGliWVVWKAorICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpIHsKKyAgICB1aW50OF90ICpkc3RfcHRyID0gKHVpbnQ4X3QgKilkc3QubUJpdHMKKyAgICAgICAgKyBkc3QubUNyb3BUb3AgKiBkc3QubVN0cmlkZSArIGRzdC5tQ3JvcExlZnQgKiBkc3QubUJwcDsKKworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195ID0KKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmMubUJpdHMgKyBzcmMubUNyb3BUb3AgKiBzcmMubVN0cmlkZSArIHNyYy5tQ3JvcExlZnQ7CisKKyAgICBjb25zdCB1aW50OF90ICpzcmNfdSA9CisgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1TdHJpZGUgKiBzcmMubUhlaWdodAorICAgICAgICArIChzcmMubUNyb3BUb3AgLyAyKSAqIHNyYy5tU3RyaWRlICsgc3JjLm1Dcm9wTGVmdDsKKworICAgIHN3aXRjaCAobURzdEZvcm1hdCkgeworICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1OgorICAgICAgICBsaWJ5dXY6Ok5WMTJUb1JHQjU2NShzcmNfeSwgc3JjLm1TdHJpZGUsIHNyY191LCBzcmMubVN0cmlkZSwgKHVpbnQ4ICopZHN0X3B0ciwKKyAgICAgICAgICAgICAgICBkc3QubVN0cmlkZSwgc3JjLmNyb3BXaWR0aCgpLCBzcmMuY3JvcEhlaWdodCgpKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQzMkJpdFJHQkE4ODg4OgorICAgICAgICBsaWJ5dXY6Ok5WMTJUb0FSR0Ioc3JjX3ksIHNyYy5tU3RyaWRlLCBzcmNfdSwgc3JjLm1TdHJpZGUsICh1aW50OCAqKWRzdF9wdHIsCisgICAgICAgICAgICAgICAgZHN0Lm1TdHJpZGUsIHNyYy5jcm9wV2lkdGgoKSwgc3JjLmNyb3BIZWlnaHQoKSk7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgfQorCisgICByZXR1cm4gT0s7Cit9CisKIHN0ZDo6ZnVuY3Rpb248dm9pZCAodm9pZCAqLCB2b2lkICosIHZvaWQgKiwgc2l6ZV90LAogICAgICAgICAgICAgICAgICAgICBzaWduZWQgKiwgc2lnbmVkICosIHNpZ25lZCAqLCBzaWduZWQgKik+CiBnZXRSZWFkRnJvbVNyYyhPTVhfQ09MT1JfRk9STUFUVFlQRSBzcmNGb3JtYXQpIHsKQEAgLTc5MywxNSArODg2LDE1IEBACiAKICAgICB1aW50OF90ICprQWRqdXN0ZWRDbGlwID0gaW5pdENsaXAoKTsKIAotICAgIHVpbnQxNl90ICpkc3RfcHRyID0gKHVpbnQxNl90ICopZHN0Lm1CaXRzCi0gICAgICAgICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1XaWR0aCArIGRzdC5tQ3JvcExlZnQ7CisgICAgdWludDE2X3QgKmRzdF9wdHIgPSAodWludDE2X3QgKikoKHVpbnQ4X3QgKikKKyAgICAgICAgICAgIGRzdC5tQml0cyArIGRzdC5tQ3JvcFRvcCAqIGRzdC5tU3RyaWRlICsgZHN0Lm1Dcm9wTGVmdCAqIGRzdC5tQnBwKTsKIAogICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195ID0KLSAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmMubUJpdHMgKyBzcmMubUNyb3BUb3AgKiBzcmMubVdpZHRoICsgc3JjLm1Dcm9wTGVmdDsKKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmMubUJpdHMgKyBzcmMubUNyb3BUb3AgKiBzcmMubVN0cmlkZSArIHNyYy5tQ3JvcExlZnQ7CiAKICAgICBjb25zdCB1aW50OF90ICpzcmNfdSA9Ci0gICAgICAgIChjb25zdCB1aW50OF90ICopc3JjX3kgKyBzcmMubVdpZHRoICogc3JjLm1IZWlnaHQKLSAgICAgICAgKyBzcmMubUNyb3BUb3AgKiBzcmMubVdpZHRoICsgc3JjLm1Dcm9wTGVmdDsKKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmMubUJpdHMgKyBzcmMubUhlaWdodCAqIHNyYy5tU3RyaWRlICsKKyAgICAgICAgKHNyYy5tQ3JvcFRvcCAvIDIpICogc3JjLm1TdHJpZGUgKyBzcmMubUNyb3BMZWZ0OwogCiAgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBzcmMuY3JvcEhlaWdodCgpOyArK3kpIHsKICAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCBzcmMuY3JvcFdpZHRoKCk7IHggKz0gMikgewpAQCAtODQzLDEzICs5MzYsMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHNyY195ICs9IHNyYy5tV2lkdGg7CisgICAgICAgIHNyY195ICs9IHNyYy5tU3RyaWRlOwogCiAgICAgICAgIGlmICh5ICYgMSkgewotICAgICAgICAgICAgc3JjX3UgKz0gc3JjLm1XaWR0aDsKKyAgICAgICAgICAgIHNyY191ICs9IHNyYy5tU3RyaWRlOwogICAgICAgICB9CiAKLSAgICAgICAgZHN0X3B0ciArPSBkc3QubVdpZHRoOworICAgICAgICBkc3RfcHRyID0gKHVpbnQxNl90KikoKHVpbnQ4X3QqKWRzdF9wdHIgKyBkc3QubVN0cmlkZSk7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwCmluZGV4IDY1N2EwNWIuLjM1OWRmM2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAKQEAgLTQ0LDYgKzQ0LDcgQEAKICAgICAgIG1OYXRpdmVXaW5kb3cobmF0aXZlV2luZG93KSwKICAgICAgIG1XaWR0aCgwKSwKICAgICAgIG1IZWlnaHQoMCksCisgICAgICBtU3RyaWRlKDApLAogICAgICAgbUNyb3BMZWZ0KDApLAogICAgICAgbUNyb3BUb3AoMCksCiAgICAgICBtQ3JvcFJpZ2h0KDApLApAQCAtNjcsOSArNjgsMTAgQEAKICAgICBpbnQzMl90IGNvbG9yRm9ybWF0TmV3OwogICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmY29sb3JGb3JtYXROZXcpKTsKIAotICAgIGludDMyX3Qgd2lkdGhOZXcsIGhlaWdodE5ldzsKLSAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigic3RyaWRlIiwgJndpZHRoTmV3KSk7CisgICAgaW50MzJfdCB3aWR0aE5ldywgaGVpZ2h0TmV3LCBzdHJpZGVOZXc7CisgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoTmV3KSk7CiAgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoInNsaWNlLWhlaWdodCIsICZoZWlnaHROZXcpKTsKKyAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigic3RyaWRlIiwgJnN0cmlkZU5ldykpOwogCiAgICAgaW50MzJfdCBjcm9wTGVmdE5ldywgY3JvcFRvcE5ldywgY3JvcFJpZ2h0TmV3LCBjcm9wQm90dG9tTmV3OwogICAgIGlmICghZm9ybWF0LT5maW5kUmVjdCgKQEAgLTEwNiw2ICsxMDgsNyBAQAogICAgIG1Db2xvckZvcm1hdCA9IHN0YXRpY19jYXN0PE9NWF9DT0xPUl9GT1JNQVRUWVBFPihjb2xvckZvcm1hdE5ldyk7CiAgICAgbVdpZHRoID0gd2lkdGhOZXc7CiAgICAgbUhlaWdodCA9IGhlaWdodE5ldzsKKyAgICBtU3RyaWRlID0gc3RyaWRlTmV3OwogICAgIG1Dcm9wTGVmdCA9IGNyb3BMZWZ0TmV3OwogICAgIG1Dcm9wVG9wID0gY3JvcFRvcE5ldzsKICAgICBtQ3JvcFJpZ2h0ID0gY3JvcFJpZ2h0TmV3OwpAQCAtMjc2LDIwICsyNzksMTUgQEAKICAgICBpZiAobUNvbnZlcnRlcikgewogICAgICAgICBtQ29udmVydGVyLT5jb252ZXJ0KAogICAgICAgICAgICAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0LAorICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCwgbVN0cmlkZSwKICAgICAgICAgICAgICAgICBtQ3JvcExlZnQsIG1Dcm9wVG9wLCBtQ3JvcFJpZ2h0LCBtQ3JvcEJvdHRvbSwKICAgICAgICAgICAgICAgICBkc3QsCi0gICAgICAgICAgICAgICAgYnVmLT5zdHJpZGUsIGJ1Zi0+aGVpZ2h0LAorICAgICAgICAgICAgICAgIGJ1Zi0+c3RyaWRlLCBidWYtPmhlaWdodCwgMCwKICAgICAgICAgICAgICAgICAwLCAwLCBtQ3JvcFdpZHRoIC0gMSwgbUNyb3BIZWlnaHQgLSAxKTsKICAgICB9IGVsc2UgaWYgKG1Db2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKSB7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195ID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOwotICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfdSA9Ci0gICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgbVdpZHRoICogbUhlaWdodDsKLSAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3YgPSBzcmNfdSArIChtV2lkdGggLyAyICogbUhlaWdodCAvIDIpOwotCi0gICAgICAgIHNyY195ICs9bUNyb3BMZWZ0ICsgbUNyb3BUb3AgKiBtV2lkdGg7Ci0gICAgICAgIHNyY191ICs9KG1Dcm9wTGVmdCArIG1Dcm9wVG9wICogbVdpZHRoIC8gMikvMjsKLSAgICAgICAgc3JjX3YgKz0obUNyb3BMZWZ0ICsgbUNyb3BUb3AgKiBtV2lkdGggLyAyKS8yOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9IChjb25zdCB1aW50OF90ICopZGF0YSArIG1Dcm9wVG9wICogbVN0cmlkZSArIG1Dcm9wTGVmdDsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3UgPSAoY29uc3QgdWludDhfdCAqKWRhdGEgKyBtU3RyaWRlICogbUhlaWdodCArIG1Dcm9wVG9wICogbVN0cmlkZSAvIDQ7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY192ID0gKGNvbnN0IHVpbnQ4X3QgKilzcmNfdSArIG1TdHJpZGUgKiBtSGVpZ2h0IC8gNDsKIAogICAgICAgICB1aW50OF90ICpkc3RfeSA9ICh1aW50OF90ICopZHN0OwogICAgICAgICBzaXplX3QgZHN0X3lfc2l6ZSA9IGJ1Zi0+c3RyaWRlICogYnVmLT5oZWlnaHQ7CkBAIC0zMDUsNyArMzAzLDcgQEAKICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBtQ3JvcEhlaWdodDsgKyt5KSB7CiAgICAgICAgICAgICBtZW1jcHkoZHN0X3ksIHNyY195LCBtQ3JvcFdpZHRoKTsKIAotICAgICAgICAgICAgc3JjX3kgKz0gbVdpZHRoOworICAgICAgICAgICAgc3JjX3kgKz0gbVN0cmlkZTsKICAgICAgICAgICAgIGRzdF95ICs9IGJ1Zi0+c3RyaWRlOwogICAgICAgICB9CiAKQEAgLTMxMywxOSArMzExLDE1IEBACiAgICAgICAgICAgICBtZW1jcHkoZHN0X3UsIHNyY191LCAobUNyb3BXaWR0aCArIDEpIC8gMik7CiAgICAgICAgICAgICBtZW1jcHkoZHN0X3YsIHNyY192LCAobUNyb3BXaWR0aCArIDEpIC8gMik7CiAKLSAgICAgICAgICAgIHNyY191ICs9IG1XaWR0aCAvIDI7Ci0gICAgICAgICAgICBzcmNfdiArPSBtV2lkdGggLyAyOworICAgICAgICAgICAgc3JjX3UgKz0gbVN0cmlkZSAvIDI7CisgICAgICAgICAgICBzcmNfdiArPSBtU3RyaWRlIC8gMjsKICAgICAgICAgICAgIGRzdF91ICs9IGRzdF9jX3N0cmlkZTsKICAgICAgICAgICAgIGRzdF92ICs9IGRzdF9jX3N0cmlkZTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAobUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIxNikgewotICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjX3kgPSAoY29uc3QgdWludDE2X3QgKilkYXRhOwotICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjX3UgPSAoY29uc3QgdWludDE2X3QgKilkYXRhICsgbVdpZHRoICogbUhlaWdodDsKLSAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY192ID0gc3JjX3UgKyAobVdpZHRoIC8gMiAqIG1IZWlnaHQgLyAyKTsKLQotICAgICAgICBzcmNfeSArPSBtQ3JvcExlZnQgKyBtQ3JvcFRvcCAqIG1XaWR0aDsKLSAgICAgICAgc3JjX3UgKz0gKG1Dcm9wTGVmdCArIG1Dcm9wVG9wICogbVdpZHRoIC8gMikgLyAyOwotICAgICAgICBzcmNfdiArPSAobUNyb3BMZWZ0ICsgbUNyb3BUb3AgKiBtV2lkdGggLyAyKSAvIDI7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195ID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgbUNyb3BUb3AgKiBtU3RyaWRlICsgbUNyb3BMZWZ0ICogMjsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3UgPSAoY29uc3QgdWludDhfdCAqKWRhdGEgKyBtU3RyaWRlICogbUhlaWdodCArIG1Dcm9wVG9wICogbVN0cmlkZSAvIDQ7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY192ID0gKGNvbnN0IHVpbnQ4X3QgKilzcmNfdSArIG1TdHJpZGUgKiBtSGVpZ2h0IC8gNDsKIAogICAgICAgICB1aW50OF90ICpkc3RfeSA9ICh1aW50OF90ICopZHN0OwogICAgICAgICBzaXplX3QgZHN0X3lfc2l6ZSA9IGJ1Zi0+c3RyaWRlICogYnVmLT5oZWlnaHQ7CkBAIC0zNDAsMjEgKzMzNCwyMSBAQAogCiAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgbUNyb3BIZWlnaHQ7ICsreSkgewogICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBtQ3JvcFdpZHRoOyArK3gpIHsKLSAgICAgICAgICAgICAgICBkc3RfeVt4XSA9ICh1aW50OF90KShzcmNfeVt4XSA+PiAyKTsKKyAgICAgICAgICAgICAgICBkc3RfeVt4XSA9ICh1aW50OF90KSgoKHVpbnQxNl90ICopc3JjX3kpW3hdID4+IDIpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzcmNfeSArPSBtV2lkdGg7CisgICAgICAgICAgICBzcmNfeSArPSBtU3RyaWRlOwogICAgICAgICAgICAgZHN0X3kgKz0gYnVmLT5zdHJpZGU7CiAgICAgICAgIH0KIAogICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IChtQ3JvcEhlaWdodCArIDEpIC8gMjsgKyt5KSB7CiAgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IChtQ3JvcFdpZHRoICsgMSkgLyAyOyArK3gpIHsKLSAgICAgICAgICAgICAgICBkc3RfdVt4XSA9ICh1aW50OF90KShzcmNfdVt4XSA+PiAyKTsKLSAgICAgICAgICAgICAgICBkc3Rfdlt4XSA9ICh1aW50OF90KShzcmNfdlt4XSA+PiAyKTsKKyAgICAgICAgICAgICAgICBkc3RfdVt4XSA9ICh1aW50OF90KSgoKHVpbnQxNl90ICopc3JjX3UpW3hdID4+IDIpOworICAgICAgICAgICAgICAgIGRzdF92W3hdID0gKHVpbnQ4X3QpKCgodWludDE2X3QgKilzcmNfdilbeF0gPj4gMik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHNyY191ICs9IG1XaWR0aCAvIDI7Ci0gICAgICAgICAgICBzcmNfdiArPSBtV2lkdGggLyAyOworICAgICAgICAgICAgc3JjX3UgKz0gbVN0cmlkZSAvIDI7CisgICAgICAgICAgICBzcmNfdiArPSBtU3RyaWRlIC8gMjsKICAgICAgICAgICAgIGRzdF91ICs9IGRzdF9jX3N0cmlkZTsKICAgICAgICAgICAgIGRzdF92ICs9IGRzdF9jX3N0cmlkZTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0FuZHJvaWQuYnAKaW5kZXggNmJmYWIxNi4uMzA3YzliMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9BbmRyb2lkLmJwCkBAIC0yNywxNyArMjcsMjEgQEAKICAgICB9LAogCiAgICAgc3RhdGljOiB7Ci0gICAgICAgIHdob2xlX3N0YXRpY19saWJzOiBbImxpYkZMQUMiXSwKKyAgICAgICAgd2hvbGVfc3RhdGljX2xpYnM6IFsKKyAgICAgICAgICAgICJsaWJGTEFDIiwKKyAgICAgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgXSwKICAgICB9LAogCiAgICAgc2hhcmVkOiB7Ci0gICAgICAgIHN0YXRpY19saWJzOiBbImxpYkZMQUMiXSwKKyAgICAgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgICAgICJsaWJGTEFDIiwKKyAgICAgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgXSwKICAgICB9LAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogICAgIGhlYWRlcl9saWJzOiBbImxpYm1lZGlhX2hlYWRlcnMiXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmNwcAppbmRleCBkZmRjNDFjLi5jZWYwYmM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9GTEFDRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuY3BwCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlICJGTEFDRGVjb2Rlci5oIgogCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPiAvLyBmbG9hdF9mcm9tX2kzMgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CkBAIC0xMTcsMTA0ICsxMTgsNDMgQEAKICAgICBtRXJyb3JTdGF0dXMgPSBzdGF0dXM7CiB9CiAKLS8vIENvcHkgc2FtcGxlcyBmcm9tIEZMQUMgbmF0aXZlIDMyLWJpdCBub24taW50ZXJsZWF2ZWQgdG8gMTYtYml0IGludGVybGVhdmVkLgorLy8gQ29weSBzYW1wbGVzIGZyb20gRkxBQyBuYXRpdmUgMzItYml0IG5vbi1pbnRlcmxlYXZlZCB0byAxNi1iaXQgc2lnbmVkCisvLyBvciAzMi1iaXQgZmxvYXQgaW50ZXJsZWF2ZWQuCisvLyBUT0RPOiBDb25zaWRlciBtb3ZpbmcgdG8gYXVkaW9fdXRpbHMuICBTZWUgc2ltaWxhciBjb2RlIGF0IEZMQUNFeHRyYWN0b3IuY3BwCiAvLyBUaGVzZSBhcmUgY2FuZGlkYXRlcyBmb3Igb3B0aW1pemF0aW9uIGlmIG5lZWRlZC4KLXN0YXRpYyB2b2lkIGNvcHlNb25vOCgKLSAgICAgICAgaW50MTZfdCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ0RlY29kZXI6OmtNYXhDaGFubmVsc10sCitzdGF0aWMgdm9pZCBjb3B5VG8xNlNpZ25lZCgKKyAgICAgICAgc2hvcnQgKmRzdCwKKyAgICAgICAgY29uc3QgaW50ICpjb25zdCAqc3JjLAogICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldIDw8IDg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5U3RlcmVvOCgKLSAgICAgICAgaW50MTZfdCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ0RlY29kZXI6OmtNYXhDaGFubmVsc10sCi0gICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPDwgODsKLSAgICAgICAgKmRzdCsrID0gc3JjWzFdW2ldIDw8IDg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5TXVsdGlDaDgoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgbkNoYW5uZWxzKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7Ci0gICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV0gPDwgODsKKyAgICAgICAgdW5zaWduZWQgbkNoYW5uZWxzLAorICAgICAgICB1bnNpZ25lZCBiaXRzUGVyU2FtcGxlKSB7CisgICAgY29uc3QgaW50IGxlZnRTaGlmdCA9IDE2IC0gKGludCliaXRzUGVyU2FtcGxlOyAvLyBjYXN0IHRvIGludCB0byBwcmV2ZW50IHVuc2lnbmVkIG92ZXJmbG93LgorICAgIGlmIChsZWZ0U2hpZnQgPj0gMCkgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgeworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gc3JjW2NdW2ldIDw8IGxlZnRTaGlmdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGludCByaWdodFNoaWZ0ID0gLWxlZnRTaGlmdDsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBuQ2hhbm5lbHM7ICsrYykgeworICAgICAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXSA+PiByaWdodFNoaWZ0OworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjb3B5TW9ubzE2KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDRGVjb2Rlcjo6a01heENoYW5uZWxzXSwKK3N0YXRpYyB2b2lkIGNvcHlUb0Zsb2F0KAorICAgICAgICBmbG9hdCAqZHN0LAorICAgICAgICBjb25zdCBpbnQgKmNvbnN0ICpzcmMsCiAgICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV07Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5U3RlcmVvMTYoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldOwotICAgICAgICAqZHN0KysgPSBzcmNbMV1baV07Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5TXVsdGlDaDE2KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDRGVjb2Rlcjo6a01heENoYW5uZWxzXSwKLSAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIG5DaGFubmVscykgeworICAgICAgICB1bnNpZ25lZCBuQ2hhbm5lbHMsCisgICAgICAgIHVuc2lnbmVkIGJpdHNQZXJTYW1wbGUpIHsKKyAgICBjb25zdCB1bnNpZ25lZCBsZWZ0U2hpZnQgPSAzMiAtIGJpdHNQZXJTYW1wbGU7CiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKICAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7Ci0gICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV07Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIFRPRE86IDI0LWJpdCB2ZXJzaW9ucyBzaG91bGQgZG8gZGl0aGVyaW5nIG9yIG5vaXNlLXNoYXBpbmcsIGhlcmUgb3IgaW4gQXVkaW9GbGluZ2VyCi1zdGF0aWMgdm9pZCBjb3B5TW9ubzI0KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDRGVjb2Rlcjo6a01heENoYW5uZWxzXSwKLSAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXSA+PiA4OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weVN0ZXJlbzI0KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDRGVjb2Rlcjo6a01heENoYW5uZWxzXSwKLSAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXSA+PiA4OwotICAgICAgICAqZHN0KysgPSBzcmNbMV1baV0gPj4gODsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlNdWx0aUNoMjQoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgbkNoYW5uZWxzKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7Ci0gICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV0gPj4gODsKKyAgICAgICAgICAgICpkc3QrKyA9IGZsb2F0X2Zyb21faTMyKHNyY1tjXVtpXSA8PCBsZWZ0U2hpZnQpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMjM4LDggKzE3OCw3IEBACiAgICAgICBtU3RyZWFtSW5mb1ZhbGlkKGZhbHNlKSwKICAgICAgIG1Xcml0ZVJlcXVlc3RlZChmYWxzZSksCiAgICAgICBtV3JpdGVDb21wbGV0ZWQoZmFsc2UpLAotICAgICAgbUVycm9yU3RhdHVzKChGTEFDX19TdHJlYW1EZWNvZGVyRXJyb3JTdGF0dXMpIC0xKSwKLSAgICAgIG1Db3B5KG51bGxwdHIpIHsKKyAgICAgIG1FcnJvclN0YXR1cygoRkxBQ19fU3RyZWFtRGVjb2RlckVycm9yU3RhdHVzKSAtMSkgewogICAgIEFMT0dWKCJjdG9yOiIpOwogICAgIG1lbXNldCgmbVN0cmVhbUluZm8sIDAsIHNpemVvZihtU3RyZWFtSW5mbykpOwogICAgIG1lbXNldCgmbVdyaXRlSGVhZGVyLCAwLCBzaXplb2YobVdyaXRlSGVhZGVyKSk7CkBAIC0zNzksNiArMzE4LDcgQEAKICAgICAgICAgY2FzZSA4OgogICAgICAgICBjYXNlIDE2OgogICAgICAgICBjYXNlIDI0OgorICAgICAgICBjYXNlIDMyOiAvLyBnZW5lcmFsbHkgcmFyZSwgYnV0IGlzIHN1cHBvcnRlZCBpbiB0aGUgZnJhbWV3b3JrCiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgpAQCAtMzg3LDMxICszMjcsNiBAQAogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKLSAgICAvLyBjb25maWd1cmUgdGhlIGFwcHJvcHJpYXRlIGNvcHkgZnVuY3Rpb24sIGRlZmF1bHRpbmcgdG8gdHJlc3Bhc3MKLSAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKLSAgICAgICAgdW5zaWduZWQgbUNoYW5uZWxzOwotICAgICAgICB1bnNpZ25lZCBtQml0c1BlclNhbXBsZTsKLSAgICAgICAgdm9pZCAoKm1Db3B5KShpbnQxNl90ICpkc3QsIGNvbnN0IGludCAqIHNyY1trTWF4Q2hhbm5lbHNdLAotICAgICAgICAgICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpOwotICAgIH0gdGFibGVbXSA9IHsKLSAgICAgICAgeyAxLCAgOCwgY29weU1vbm84ICAgICB9LAotICAgICAgICB7IDIsICA4LCBjb3B5U3RlcmVvOCAgIH0sCi0gICAgICAgIHsgOCwgIDgsIGNvcHlNdWx0aUNoOCAgfSwKLSAgICAgICAgeyAxLCAxNiwgY29weU1vbm8xNiAgICB9LAotICAgICAgICB7IDIsIDE2LCBjb3B5U3RlcmVvMTYgIH0sCi0gICAgICAgIHsgOCwgMTYsIGNvcHlNdWx0aUNoMTYgfSwKLSAgICAgICAgeyAxLCAyNCwgY29weU1vbm8yNCAgICB9LAotICAgICAgICB7IDIsIDI0LCBjb3B5U3RlcmVvMjQgIH0sCi0gICAgICAgIHsgOCwgMjQsIGNvcHlNdWx0aUNoMjQgfSwKLSAgICB9OwotICAgIGZvciAoY29uc3QgYXV0byAmZW50cnkgOiB0YWJsZSkgewotICAgICAgICBpZiAoZW50cnkubUNoYW5uZWxzID49IGdldENoYW5uZWxzKCkgJiYKLSAgICAgICAgICAgICAgICBlbnRyeS5tQml0c1BlclNhbXBsZSA9PSBnZXRCaXRzUGVyU2FtcGxlKCkpIHsKLSAgICAgICAgICAgIG1Db3B5ID0gZW50cnkubUNvcHk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQogICAgIC8vIE5vdyB3ZSBoYXZlIGFsbCBtZXRhZGF0YSBibG9ja3MuCiAgICAgbUJ1ZmZlclBvcyA9IDA7CiAgICAgbUJ1ZmZlckRhdGFTaXplID0gMDsKQEAgLTQyMCw3ICszMzUsNyBAQAogfQogCiBzdGF0dXNfdCBGTEFDRGVjb2Rlcjo6ZGVjb2RlT25lRnJhbWUoY29uc3QgdWludDhfdCAqaW5CdWZmZXIsIHNpemVfdCBpbkJ1ZmZlckxlbiwKLSAgICAgICAgaW50MTZfdCAqb3V0QnVmZmVyLCBzaXplX3QgKm91dEJ1ZmZlckxlbikgeworICAgICAgICB2b2lkICpvdXRCdWZmZXIsIHNpemVfdCAqb3V0QnVmZmVyTGVuLCBib29sIG91dHB1dEZsb2F0KSB7CiAgICAgQUxPR1YoImRlY29kZU9uZUZyYW1lOiBpbnB1dCBzaXplKCV6dSkiLCBpbkJ1ZmZlckxlbik7CiAKICAgICBpZiAoIW1TdHJlYW1JbmZvVmFsaWQpIHsKQEAgLTQ2OSwyMSArMzg0LDMzIEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCi0gICAgc2l6ZV90IGJ1ZmZlclNpemUgPSBibG9ja3NpemUgKiBnZXRDaGFubmVscygpICogc2l6ZW9mKGludDE2X3QpOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYW5uZWxzID0gZ2V0Q2hhbm5lbHMoKTsKKyAgICBjb25zdCBzaXplX3Qgc2FtcGxlU2l6ZSA9IG91dHB1dEZsb2F0ID8gc2l6ZW9mKGZsb2F0KSA6IHNpemVvZihpbnQxNl90KTsKKyAgICBjb25zdCBzaXplX3QgZnJhbWVTaXplID0gY2hhbm5lbHMgKiBzYW1wbGVTaXplOworICAgIHNpemVfdCBidWZmZXJTaXplID0gYmxvY2tzaXplICogZnJhbWVTaXplOwogICAgIGlmIChidWZmZXJTaXplID4gKm91dEJ1ZmZlckxlbikgewogICAgICAgICBBTE9HVygiZGVjb2RlT25lRnJhbWU6IG91dHB1dCBidWZmZXIgaG9sZHMgb25seSBwYXJ0aWFsIGZyYW1lICV6dTolenUiLAogICAgICAgICAgICAgICAgICpvdXRCdWZmZXJMZW4sIGJ1ZmZlclNpemUpOwotICAgICAgICBibG9ja3NpemUgPSAqb3V0QnVmZmVyTGVuIC8gKGdldENoYW5uZWxzKCkgKiBzaXplb2YoaW50MTZfdCkpOwotICAgICAgICBidWZmZXJTaXplID0gYmxvY2tzaXplICogZ2V0Q2hhbm5lbHMoKSAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgYmxvY2tzaXplID0gKm91dEJ1ZmZlckxlbiAvIGZyYW1lU2l6ZTsKKyAgICAgICAgYnVmZmVyU2l6ZSA9IGJsb2Nrc2l6ZSAqIGZyYW1lU2l6ZTsKICAgICB9CiAKLSAgICBpZiAobUNvcHkgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiZGVjb2RlT25lRnJhbWU6IGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkOiBjaGFubmVscyglZCksIEJpdHNQZXJTYW1wbGUoJWQpIiwKLSAgICAgICAgICAgICAgICBnZXRDaGFubmVscygpLCBnZXRCaXRzUGVyU2FtcGxlKCkpOwotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQogICAgIC8vIGNvcHkgUENNIGZyb20gRkxBQyB3cml0ZSBidWZmZXIgdG8gb3V0cHV0IGJ1ZmZlciwgd2l0aCBpbnRlcmxlYXZpbmcKLSAgICAoKm1Db3B5KShvdXRCdWZmZXIsIG1Xcml0ZUJ1ZmZlciwgYmxvY2tzaXplLCBnZXRDaGFubmVscygpKTsKKworICAgIGNvbnN0IHVuc2lnbmVkIGJpdHNQZXJTYW1wbGUgPSBnZXRCaXRzUGVyU2FtcGxlKCk7CisgICAgaWYgKG91dHB1dEZsb2F0KSB7CisgICAgICAgIGNvcHlUb0Zsb2F0KHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPihvdXRCdWZmZXIpLAorICAgICAgICAgICAgICAgICAgICBtV3JpdGVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgIGJsb2Nrc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgIGJpdHNQZXJTYW1wbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvcHlUbzE2U2lnbmVkKHJlaW50ZXJwcmV0X2Nhc3Q8c2hvcnQqPihvdXRCdWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICBtV3JpdGVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgIGJpdHNQZXJTYW1wbGUpOworICAgIH0KICAgICAqb3V0QnVmZmVyTGVuID0gYnVmZmVyU2l6ZTsKICAgICByZXR1cm4gT0s7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9GTEFDRGVjb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuaAppbmRleCBhZjQxOWEyLi42OTRmY2NiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9GTEFDRGVjb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmgKQEAgLTQxLDcgKzQxLDcgQEAKIAogICAgIHN0YXR1c190IHBhcnNlTWV0YWRhdGEoY29uc3QgdWludDhfdCAqaW5CdWZmZXIsIHNpemVfdCBpbkJ1ZmZlckxlbik7CiAgICAgc3RhdHVzX3QgZGVjb2RlT25lRnJhbWUoY29uc3QgdWludDhfdCAqaW5CdWZmZXIsIHNpemVfdCBpbkJ1ZmZlckxlbiwKLSAgICAgICAgICAgIGludDE2X3QgKm91dEJ1ZmZlciwgc2l6ZV90ICpvdXRCdWZmZXJMZW4pOworICAgICAgICAgICAgdm9pZCAqb3V0QnVmZmVyLCBzaXplX3QgKm91dEJ1ZmZlckxlbiwgYm9vbCBvdXRwdXRGbG9hdCA9IGZhbHNlKTsKICAgICB2b2lkIGZsdXNoKCk7CiAgICAgdmlydHVhbCB+RkxBQ0RlY29kZXIoKTsKIApAQCAtODksOCArODksNiBAQAogICAgIC8vIG1vc3QgcmVjZW50IGVycm9yIHJlcG9ydGVkIGJ5IGxpYkZMQUMgZGVjb2RlcgogICAgIEZMQUNfX1N0cmVhbURlY29kZXJFcnJvclN0YXR1cyBtRXJyb3JTdGF0dXM7CiAKLSAgICB2b2lkICgqbUNvcHkpKGludDE2X3QgKmRzdCwgY29uc3QgaW50ICpzcmNba01heENoYW5uZWxzXSwgdW5zaWduZWQgblNhbXBsZXMsIHVuc2lnbmVkIG5DaGFubmVscyk7Ci0KICAgICBzdGF0dXNfdCBpbml0KCk7CiAKICAgICAvLyBGTEFDIHN0cmVhbSBkZWNvZGVyIGNhbGxiYWNrcyBhcyBDKysgaW5zdGFuY2UgbWV0aG9kcwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MzdmNjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1BU3RhdGU6OkFTdGF0ZShjb25zdCBzcDxBU3RhdGU+ICZwYXJlbnRTdGF0ZSkKLSAgICA6IG1QYXJlbnRTdGF0ZShwYXJlbnRTdGF0ZSkgewotfQotCi1BU3RhdGU6On5BU3RhdGUoKSB7Ci19Ci0KLXNwPEFTdGF0ZT4gQVN0YXRlOjpwYXJlbnRTdGF0ZSgpIHsKLSAgICByZXR1cm4gbVBhcmVudFN0YXRlOwotfQotCi12b2lkIEFTdGF0ZTo6c3RhdGVFbnRlcmVkKCkgewotfQotCi12b2lkIEFTdGF0ZTo6c3RhdGVFeGl0ZWQoKSB7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLUFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6OkFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUoKSB7Ci19Ci0KLUFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6On5BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lKCkgewotfQotCi12b2lkIEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6OmhhbmRsZU1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBzcDxBU3RhdGU+IHNhdmUgPSBtU3RhdGU7Ci0KLSAgICBzcDxBU3RhdGU+IGN1ciA9IG1TdGF0ZTsKLSAgICB3aGlsZSAoY3VyICE9IE5VTEwgJiYgIWN1ci0+b25NZXNzYWdlUmVjZWl2ZWQobXNnKSkgewotICAgICAgICAvLyBJZiB5b3UgY2xhaW0gbm90IHRvIGhhdmUgaGFuZGxlZCB0aGUgbWVzc2FnZSB5b3Ugc2hvdWxkbid0Ci0gICAgICAgIC8vIGhhdmUgY2FsbGVkIHNldFN0YXRlLi4uCi0gICAgICAgIENIRUNLKHNhdmUgPT0gbVN0YXRlKTsKLQotICAgICAgICBjdXIgPSBjdXItPnBhcmVudFN0YXRlKCk7Ci0gICAgfQotCi0gICAgaWYgKGN1ciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBTE9HVygiV2FybmluZyBtZXNzYWdlICVzIHVuaGFuZGxlZCBpbiByb290IHN0YXRlLiIsCi0gICAgICAgICBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7Ci19Ci0KLXZvaWQgQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTo6Y2hhbmdlU3RhdGUoY29uc3Qgc3A8QVN0YXRlPiAmc3RhdGUpIHsKLSAgICBpZiAoc3RhdGUgPT0gbVN0YXRlKSB7Ci0gICAgICAgIC8vIFF1aWNrIGV4aXQgZm9yIHRoZSBlYXN5IGNhc2UuCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBWZWN0b3I8c3A8QVN0YXRlPiA+IEE7Ci0gICAgc3A8QVN0YXRlPiBjdXIgPSBtU3RhdGU7Ci0gICAgZm9yICg7OykgewotICAgICAgICBBLnB1c2goY3VyKTsKLSAgICAgICAgaWYgKGN1ciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjdXIgPSBjdXItPnBhcmVudFN0YXRlKCk7Ci0gICAgfQotCi0gICAgVmVjdG9yPHNwPEFTdGF0ZT4gPiBCOwotICAgIGN1ciA9IHN0YXRlOwotICAgIGZvciAoOzspIHsKLSAgICAgICAgQi5wdXNoKGN1cik7Ci0gICAgICAgIGlmIChjdXIgPT0gTlVMTCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY3VyID0gY3VyLT5wYXJlbnRTdGF0ZSgpOwotICAgIH0KLQotICAgIC8vIFJlbW92ZSB0aGUgY29tbW9uIHRhaWwuCi0gICAgd2hpbGUgKEEuc2l6ZSgpID4gMCAmJiBCLnNpemUoKSA+IDAgJiYgQS50b3AoKSA9PSBCLnRvcCgpKSB7Ci0gICAgICAgIEEucG9wKCk7Ci0gICAgICAgIEIucG9wKCk7Ci0gICAgfQotCi0gICAgbVN0YXRlID0gc3RhdGU7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEEuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgQS5lZGl0SXRlbUF0KGkpLT5zdGF0ZUV4aXRlZCgpOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSBCLnNpemUoKTsgaSA+IDA7KSB7Ci0gICAgICAgIGktLTsKLSAgICAgICAgQi5lZGl0SXRlbUF0KGkpLT5zdGF0ZUVudGVyZWQoKTsKLSAgICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmNwcAppbmRleCA5OTIxNjM2Li43NjhjYmQ2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5jcHAKQEAgLTE3MCw3ICsxNzAsOSBAQAogCiAgICAgaW50NjRfdCB3aGVuVXM7CiAgICAgaWYgKGRlbGF5VXMgPiAwKSB7Ci0gICAgICAgIHdoZW5VcyA9IEdldE5vd1VzKCkgKyBkZWxheVVzOworICAgICAgICBpbnQ2NF90IG5vd1VzID0gR2V0Tm93VXMoKTsKKyAgICAgICAgd2hlblVzID0gKGRlbGF5VXMgPiBJTlQ2NF9NQVggLSBub3dVcyA/IElOVDY0X01BWCA6IG5vd1VzICsgZGVsYXlVcyk7CisKICAgICB9IGVsc2UgewogICAgICAgICB3aGVuVXMgPSBHZXROb3dVcygpOwogICAgIH0KQEAgLTIwOCw2ICsyMTAsOSBAQAogCiAgICAgICAgIGlmICh3aGVuVXMgPiBub3dVcykgewogICAgICAgICAgICAgaW50NjRfdCBkZWxheVVzID0gd2hlblVzIC0gbm93VXM7CisgICAgICAgICAgICBpZiAoZGVsYXlVcyA+IElOVDY0X01BWCAvIDEwMDApIHsKKyAgICAgICAgICAgICAgICBkZWxheVVzID0gSU5UNjRfTUFYIC8gMTAwMDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1RdWV1ZUNoYW5nZWRDb25kaXRpb24ud2FpdFJlbGF0aXZlKG1Mb2NrLCBkZWxheVVzICogMTAwMGxsKTsKIAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FOZXR3b3JrU2Vzc2lvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FOZXR3b3JrU2Vzc2lvbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZmRjMzcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIk5ldHdvcmtTZXNzaW9uIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQU5ldHdvcmtTZXNzaW9uLmgiCi0jaW5jbHVkZSAiUGFyc2VkTWVzc2FnZS5oIgotCi0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxsaW51eC90Y3AuaD4KLSNpbmNsdWRlIDxuZXQvaWYuaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyBjb25zdCBzaXplX3Qga01heFVEUFNpemUgPSAxNTAwOwotc3RhdGljIGNvbnN0IGludDMyX3Qga01heFVEUFJldHJpZXMgPSAyMDA7Ci0KLXN0cnVjdCBBTmV0d29ya1Nlc3Npb246Ok5ldHdvcmtUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKLSAgICBleHBsaWNpdCBOZXR3b3JrVGhyZWFkKEFOZXR3b3JrU2Vzc2lvbiAqc2Vzc2lvbik7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5OZXR3b3JrVGhyZWFkKCk7Ci0KLXByaXZhdGU6Ci0gICAgQU5ldHdvcmtTZXNzaW9uICptU2Vzc2lvbjsKLQotICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhOZXR3b3JrVGhyZWFkKTsKLX07Ci0KLXN0cnVjdCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb24gOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgZW51bSBNb2RlIHsKLSAgICAgICAgTU9ERV9SVFNQLAotICAgICAgICBNT0RFX0RBVEFHUkFNLAotICAgICAgICBNT0RFX1dFQlNPQ0tFVCwKLSAgICB9OwotCi0gICAgZW51bSBTdGF0ZSB7Ci0gICAgICAgIENPTk5FQ1RJTkcsCi0gICAgICAgIENPTk5FQ1RFRCwKLSAgICAgICAgTElTVEVOSU5HX1JUU1AsCi0gICAgICAgIExJU1RFTklOR19UQ1BfREdSQU1TLAotICAgICAgICBEQVRBR1JBTSwKLSAgICB9OwotCi0gICAgU2Vzc2lvbihpbnQzMl90IHNlc3Npb25JRCwKLSAgICAgICAgICAgIFN0YXRlIHN0YXRlLAotICAgICAgICAgICAgaW50IHMsCi0gICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7Ci0KLSAgICBpbnQzMl90IHNlc3Npb25JRCgpIGNvbnN0OwotICAgIGludCBzb2NrZXQoKSBjb25zdDsKLSAgICBzcDxBTWVzc2FnZT4gZ2V0Tm90aWZpY2F0aW9uTWVzc2FnZSgpIGNvbnN0OwotCi0gICAgYm9vbCBpc1JUU1BTZXJ2ZXIoKSBjb25zdDsKLSAgICBib29sIGlzVENQRGF0YWdyYW1TZXJ2ZXIoKSBjb25zdDsKLQotICAgIGJvb2wgd2FudHNUb1JlYWQoKTsKLSAgICBib29sIHdhbnRzVG9Xcml0ZSgpOwotCi0gICAgc3RhdHVzX3QgcmVhZE1vcmUoKTsKLSAgICBzdGF0dXNfdCB3cml0ZU1vcmUoKTsKLQotICAgIHN0YXR1c190IHNlbmRSZXF1ZXN0KAotICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc3NpemVfdCBzaXplLCBib29sIHRpbWVWYWxpZCwgaW50NjRfdCB0aW1lVXMpOwotCi0gICAgdm9pZCBzZXRNb2RlKE1vZGUgbW9kZSk7Ci0KLSAgICBzdGF0dXNfdCBzd2l0Y2hUb1dlYlNvY2tldE1vZGUoKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgflNlc3Npb24oKTsKLQotcHJpdmF0ZToKLSAgICBlbnVtIHsKLSAgICAgICAgRlJBR01FTlRfRkxBR19USU1FX1ZBTElEID0gMSwKLSAgICB9OwotICAgIHN0cnVjdCBGcmFnbWVudCB7Ci0gICAgICAgIHVpbnQzMl90IG1GbGFnczsKLSAgICAgICAgaW50NjRfdCBtVGltZVVzOwotICAgICAgICBzcDxBQnVmZmVyPiBtQnVmZmVyOwotICAgIH07Ci0KLSAgICBpbnQzMl90IG1TZXNzaW9uSUQ7Ci0gICAgU3RhdGUgbVN0YXRlOwotICAgIE1vZGUgbU1vZGU7Ci0gICAgaW50IG1Tb2NrZXQ7Ci0gICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7Ci0gICAgYm9vbCBtU2F3UmVjZWl2ZUZhaWx1cmUsIG1TYXdTZW5kRmFpbHVyZTsKLSAgICBpbnQzMl90IG1VRFBSZXRyaWVzOwotCi0gICAgTGlzdDxGcmFnbWVudD4gbU91dEZyYWdtZW50czsKLQotICAgIEFTdHJpbmcgbUluQnVmZmVyOwotCi0gICAgaW50NjRfdCBtTGFzdFN0YWxsUmVwb3J0VXM7Ci0KLSAgICB2b2lkIG5vdGlmeUVycm9yKGJvb2wgc2VuZCwgc3RhdHVzX3QgZXJyLCBjb25zdCBjaGFyICpkZXRhaWwpOwotICAgIHZvaWQgbm90aWZ5KE5vdGlmaWNhdGlvblJlYXNvbiByZWFzb24pOwotCi0gICAgdm9pZCBkdW1wRnJhZ21lbnRTdGF0cyhjb25zdCBGcmFnbWVudCAmZnJhZyk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTZXNzaW9uKTsKLX07Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1BTmV0d29ya1Nlc3Npb246Ok5ldHdvcmtUaHJlYWQ6Ok5ldHdvcmtUaHJlYWQoQU5ldHdvcmtTZXNzaW9uICpzZXNzaW9uKQotICAgIDogbVNlc3Npb24oc2Vzc2lvbikgewotfQotCi1BTmV0d29ya1Nlc3Npb246Ok5ldHdvcmtUaHJlYWQ6On5OZXR3b3JrVGhyZWFkKCkgewotfQotCi1ib29sIEFOZXR3b3JrU2Vzc2lvbjo6TmV0d29ya1RocmVhZDo6dGhyZWFkTG9vcCgpIHsKLSAgICBtU2Vzc2lvbi0+dGhyZWFkTG9vcCgpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLUFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6U2Vzc2lvbigKLSAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsCi0gICAgICAgIFN0YXRlIHN0YXRlLAotICAgICAgICBpbnQgcywKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCi0gICAgOiBtU2Vzc2lvbklEKHNlc3Npb25JRCksCi0gICAgICBtU3RhdGUoc3RhdGUpLAotICAgICAgbU1vZGUoTU9ERV9EQVRBR1JBTSksCi0gICAgICBtU29ja2V0KHMpLAotICAgICAgbU5vdGlmeShub3RpZnkpLAotICAgICAgbVNhd1JlY2VpdmVGYWlsdXJlKGZhbHNlKSwKLSAgICAgIG1TYXdTZW5kRmFpbHVyZShmYWxzZSksCi0gICAgICBtVURQUmV0cmllcyhrTWF4VURQUmV0cmllcyksCi0gICAgICBtTGFzdFN0YWxsUmVwb3J0VXMoLTFsbCkgewotICAgIGlmIChtU3RhdGUgPT0gQ09OTkVDVEVEKSB7Ci0gICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBsb2NhbEFkZHI7Ci0gICAgICAgIHNvY2tsZW5fdCBsb2NhbEFkZHJMZW4gPSBzaXplb2YobG9jYWxBZGRyKTsKLQotICAgICAgICBpbnQgcmVzID0gZ2V0c29ja25hbWUoCi0gICAgICAgICAgICAgICAgbVNvY2tldCwgKHN0cnVjdCBzb2NrYWRkciAqKSZsb2NhbEFkZHIsICZsb2NhbEFkZHJMZW4pOwotICAgICAgICBDSEVDS19HRShyZXMsIDApOwotCi0gICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiByZW1vdGVBZGRyOwotICAgICAgICBzb2NrbGVuX3QgcmVtb3RlQWRkckxlbiA9IHNpemVvZihyZW1vdGVBZGRyKTsKLQotICAgICAgICByZXMgPSBnZXRwZWVybmFtZSgKLSAgICAgICAgICAgICAgICBtU29ja2V0LCAoc3RydWN0IHNvY2thZGRyICopJnJlbW90ZUFkZHIsICZyZW1vdGVBZGRyTGVuKTsKLSAgICAgICAgQ0hFQ0tfR0UocmVzLCAwKTsKLQotICAgICAgICBpbl9hZGRyX3QgYWRkciA9IG50b2hsKGxvY2FsQWRkci5zaW5fYWRkci5zX2FkZHIpOwotICAgICAgICBBU3RyaW5nIGxvY2FsQWRkclN0cmluZyA9IEFTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgIiVkLiVkLiVkLiVkIiwKLSAgICAgICAgICAgICAgICAoYWRkciA+PiAyNCksCi0gICAgICAgICAgICAgICAgKGFkZHIgPj4gMTYpICYgMHhmZiwKLSAgICAgICAgICAgICAgICAoYWRkciA+PiA4KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgYWRkciAmIDB4ZmYpOwotCi0gICAgICAgIGFkZHIgPSBudG9obChyZW1vdGVBZGRyLnNpbl9hZGRyLnNfYWRkcik7Ci0gICAgICAgIEFTdHJpbmcgcmVtb3RlQWRkclN0cmluZyA9IEFTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgIiVkLiVkLiVkLiVkIiwKLSAgICAgICAgICAgICAgICAoYWRkciA+PiAyNCksCi0gICAgICAgICAgICAgICAgKGFkZHIgPj4gMTYpICYgMHhmZiwKLSAgICAgICAgICAgICAgICAoYWRkciA+PiA4KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgYWRkciAmIDB4ZmYpOwotCi0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgbXNnLT5zZXRJbnQzMigic2Vzc2lvbklEIiwgbVNlc3Npb25JRCk7Ci0gICAgICAgIG1zZy0+c2V0SW50MzIoInJlYXNvbiIsIGtXaGF0Q2xpZW50Q29ubmVjdGVkKTsKLSAgICAgICAgbXNnLT5zZXRTdHJpbmcoInNlcnZlci1pcCIsIGxvY2FsQWRkclN0cmluZy5jX3N0cigpKTsKLSAgICAgICAgbXNnLT5zZXRJbnQzMigic2VydmVyLXBvcnQiLCBudG9ocyhsb2NhbEFkZHIuc2luX3BvcnQpKTsKLSAgICAgICAgbXNnLT5zZXRTdHJpbmcoImNsaWVudC1pcCIsIHJlbW90ZUFkZHJTdHJpbmcuY19zdHIoKSk7Ci0gICAgICAgIG1zZy0+c2V0SW50MzIoImNsaWVudC1wb3J0IiwgbnRvaHMocmVtb3RlQWRkci5zaW5fcG9ydCkpOwotICAgICAgICBtc2ctPnBvc3QoKTsKLSAgICB9Ci19Ci0KLUFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6flNlc3Npb24oKSB7Ci0gICAgQUxPR1YoIlNlc3Npb24gJWQgZ29uZSIsIG1TZXNzaW9uSUQpOwotCi0gICAgY2xvc2UobVNvY2tldCk7Ci0gICAgbVNvY2tldCA9IC0xOwotfQotCi1pbnQzMl90IEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6c2Vzc2lvbklEKCkgY29uc3QgewotICAgIHJldHVybiBtU2Vzc2lvbklEOwotfQotCi1pbnQgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpzb2NrZXQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Tb2NrZXQ7Ci19Ci0KLXZvaWQgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpzZXRNb2RlKE1vZGUgbW9kZSkgewotICAgIG1Nb2RlID0gbW9kZTsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpzd2l0Y2hUb1dlYlNvY2tldE1vZGUoKSB7Ci0gICAgaWYgKG1TdGF0ZSAhPSBDT05ORUNURUQgfHwgbU1vZGUgIT0gTU9ERV9SVFNQKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBtTW9kZSA9IE1PREVfV0VCU09DS0VUOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zcDxBTWVzc2FnZT4gQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpnZXROb3RpZmljYXRpb25NZXNzYWdlKCkgY29uc3QgewotICAgIHJldHVybiBtTm90aWZ5OwotfQotCi1ib29sIEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6aXNSVFNQU2VydmVyKCkgY29uc3QgewotICAgIHJldHVybiBtU3RhdGUgPT0gTElTVEVOSU5HX1JUU1A7Ci19Ci0KLWJvb2wgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjppc1RDUERhdGFncmFtU2VydmVyKCkgY29uc3QgewotICAgIHJldHVybiBtU3RhdGUgPT0gTElTVEVOSU5HX1RDUF9ER1JBTVM7Ci19Ci0KLWJvb2wgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjp3YW50c1RvUmVhZCgpIHsKLSAgICByZXR1cm4gIW1TYXdSZWNlaXZlRmFpbHVyZSAmJiBtU3RhdGUgIT0gQ09OTkVDVElORzsKLX0KLQotYm9vbCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OndhbnRzVG9Xcml0ZSgpIHsKLSAgICByZXR1cm4gIW1TYXdTZW5kRmFpbHVyZQotICAgICAgICAmJiAobVN0YXRlID09IENPTk5FQ1RJTkcKLSAgICAgICAgICAgIHx8IChtU3RhdGUgPT0gQ09OTkVDVEVEICYmICFtT3V0RnJhZ21lbnRzLmVtcHR5KCkpCi0gICAgICAgICAgICB8fCAobVN0YXRlID09IERBVEFHUkFNICYmICFtT3V0RnJhZ21lbnRzLmVtcHR5KCkpKTsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpyZWFkTW9yZSgpIHsKLSAgICBpZiAobVN0YXRlID09IERBVEFHUkFNKSB7Ci0gICAgICAgIENIRUNLX0VRKG1Nb2RlLCBNT0RFX0RBVEFHUkFNKTsKLQotICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZiA9IG5ldyBBQnVmZmVyKGtNYXhVRFBTaXplKTsKLQotICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luIHJlbW90ZUFkZHI7Ci0gICAgICAgICAgICBzb2NrbGVuX3QgcmVtb3RlQWRkckxlbiA9IHNpemVvZihyZW1vdGVBZGRyKTsKLQotICAgICAgICAgICAgc3NpemVfdCBuOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIG4gPSByZWN2ZnJvbSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Tb2NrZXQsIGJ1Zi0+ZGF0YSgpLCBidWYtPmNhcGFjaXR5KCksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHNvY2thZGRyICopJnJlbW90ZUFkZHIsICZyZW1vdGVBZGRyTGVuKTsKLSAgICAgICAgICAgIH0gd2hpbGUgKG4gPCAwICYmIGVycm5vID09IEVJTlRSKTsKLQotICAgICAgICAgICAgZXJyID0gT0s7Ci0gICAgICAgICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG4gPT0gMCkgewotICAgICAgICAgICAgICAgIGVyciA9IC1FQ09OTlJFU0VUOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWYtPnNldFJhbmdlKDAsIG4pOwotCi0gICAgICAgICAgICAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0gICAgICAgICAgICAgICAgYnVmLT5tZXRhKCktPnNldEludDY0KCJhcnJpdmFsVGltZVVzIiwgbm93VXMpOwotCi0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNlc3Npb25JRCIsIG1TZXNzaW9uSUQpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInJlYXNvbiIsIGtXaGF0RGF0YWdyYW0pOwotCi0gICAgICAgICAgICAgICAgdWludDMyX3QgaXAgPSBudG9obChyZW1vdGVBZGRyLnNpbl9hZGRyLnNfYWRkcik7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAiZnJvbUFkZHIiLAotICAgICAgICAgICAgICAgICAgICAgICAgQVN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXUuJXUuJXUuJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwID4+IDI0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpcCA+PiAxNikgJiAweGZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpcCA+PiA4KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXAgJiAweGZmKS5jX3N0cigpKTsKLQotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImZyb21Qb3J0IiwgbnRvaHMocmVtb3RlQWRkci5zaW5fcG9ydCkpOwotCi0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRCdWZmZXIoImRhdGEiLCBidWYpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlIChlcnIgPT0gT0spOwotCi0gICAgICAgIGlmIChlcnIgPT0gLUVBR0FJTikgewotICAgICAgICAgICAgZXJyID0gT0s7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBpZiAoIW1VRFBSZXRyaWVzKSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoZmFsc2UgLyogc2VuZCAqLywgZXJyLCAiUmVjdmZyb20gZmFpbGVkLiIpOwotICAgICAgICAgICAgICAgIG1TYXdSZWNlaXZlRmFpbHVyZSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1VRFBSZXRyaWVzLS07Ci0gICAgICAgICAgICAgICAgQUxPR0UoIlJlY3Zmcm9tIGZhaWxlZCwgJWQvJWQgcmV0cmllcyBsZWZ0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1VRFBSZXRyaWVzLCBrTWF4VURQUmV0cmllcyk7Ci0gICAgICAgICAgICAgICAgZXJyID0gT0s7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtVURQUmV0cmllcyA9IGtNYXhVRFBSZXRyaWVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBjaGFyIHRtcFs1MTJdOwotICAgIHNzaXplX3QgbjsKLSAgICBkbyB7Ci0gICAgICAgIG4gPSByZWN2KG1Tb2NrZXQsIHRtcCwgc2l6ZW9mKHRtcCksIDApOwotICAgIH0gd2hpbGUgKG4gPCAwICYmIGVycm5vID09IEVJTlRSKTsKLQotICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgaWYgKG4gPiAwKSB7Ci0gICAgICAgIG1JbkJ1ZmZlci5hcHBlbmQodG1wLCBuKTsKLQotI2lmIDAKLSAgICAgICAgQUxPR0koImluOiIpOwotICAgICAgICBoZXhkdW1wKHRtcCwgbik7Ci0jZW5kaWYKLSAgICB9IGVsc2UgaWYgKG4gPCAwKSB7Ci0gICAgICAgIGVyciA9IC1lcnJubzsKLSAgICB9IGVsc2UgewotICAgICAgICBlcnIgPSAtRUNPTk5SRVNFVDsKLSAgICB9Ci0KLSAgICBpZiAobU1vZGUgPT0gTU9ERV9EQVRBR1JBTSkgewotICAgICAgICAvLyBUQ1Agc3RyZWFtIGNhcnJ5aW5nIDE2LWJpdCBsZW5ndGgtcHJlZml4ZWQgZGF0YWdyYW1zLgotCi0gICAgICAgIHdoaWxlIChtSW5CdWZmZXIuc2l6ZSgpID49IDIpIHsKLSAgICAgICAgICAgIHNpemVfdCBwYWNrZXRTaXplID0gVTE2X0FUKChjb25zdCB1aW50OF90ICopbUluQnVmZmVyLmNfc3RyKCkpOwotCi0gICAgICAgICAgICBpZiAobUluQnVmZmVyLnNpemUoKSA8IHBhY2tldFNpemUgKyAyKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNwPEFCdWZmZXI+IHBhY2tldCA9IG5ldyBBQnVmZmVyKHBhY2tldFNpemUpOwotICAgICAgICAgICAgbWVtY3B5KHBhY2tldC0+ZGF0YSgpLCBtSW5CdWZmZXIuY19zdHIoKSArIDIsIHBhY2tldFNpemUpOwotCi0gICAgICAgICAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLSAgICAgICAgICAgIHBhY2tldC0+bWV0YSgpLT5zZXRJbnQ2NCgiYXJyaXZhbFRpbWVVcyIsIG5vd1VzKTsKLQotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2Vzc2lvbklEIiwgbVNlc3Npb25JRCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJyZWFzb24iLCBrV2hhdERhdGFncmFtKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJkYXRhIiwgcGFja2V0KTsKLSAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwotCi0gICAgICAgICAgICBtSW5CdWZmZXIuZXJhc2UoMCwgcGFja2V0U2l6ZSArIDIpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtTW9kZSA9PSBNT0RFX1JUU1ApIHsKLSAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgc2l6ZV90IGxlbmd0aDsKLQotICAgICAgICAgICAgaWYgKG1JbkJ1ZmZlci5zaXplKCkgPiAwICYmIG1JbkJ1ZmZlci5jX3N0cigpWzBdID09ICckJykgewotICAgICAgICAgICAgICAgIGlmIChtSW5CdWZmZXIuc2l6ZSgpIDwgNCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsZW5ndGggPSBVMTZfQVQoKGNvbnN0IHVpbnQ4X3QgKiltSW5CdWZmZXIuY19zdHIoKSArIDIpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1JbkJ1ZmZlci5zaXplKCkgPCA0ICsgbGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzZXNzaW9uSUQiLCBtU2Vzc2lvbklEKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJyZWFzb24iLCBrV2hhdEJpbmFyeURhdGEpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImNoYW5uZWwiLCBtSW5CdWZmZXIuY19zdHIoKVsxXSk7Ci0KLSAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBkYXRhID0gbmV3IEFCdWZmZXIobGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoZGF0YS0+ZGF0YSgpLCBtSW5CdWZmZXIuY19zdHIoKSArIDQsIGxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLSAgICAgICAgICAgICAgICBkYXRhLT5tZXRhKCktPnNldEludDY0KCJhcnJpdmFsVGltZVVzIiwgbm93VXMpOwotCi0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRCdWZmZXIoImRhdGEiLCBkYXRhKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKLQotICAgICAgICAgICAgICAgIG1JbkJ1ZmZlci5lcmFzZSgwLCA0ICsgbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3A8UGFyc2VkTWVzc2FnZT4gbXNnID0KLSAgICAgICAgICAgICAgICBQYXJzZWRNZXNzYWdlOjpQYXJzZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbkJ1ZmZlci5jX3N0cigpLCBtSW5CdWZmZXIuc2l6ZSgpLCBlcnIgIT0gT0ssICZsZW5ndGgpOwotCi0gICAgICAgICAgICBpZiAobXNnID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2Vzc2lvbklEIiwgbVNlc3Npb25JRCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJyZWFzb24iLCBrV2hhdERhdGEpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRPYmplY3QoImRhdGEiLCBtc2cpOwotICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0KLSNpZiAxCi0gICAgICAgICAgICAvLyBYWFggVGhlIChvbGQpIGRvbmdsZSBzZW5kcyB0aGUgd3JvbmcgY29udGVudCBsZW5ndGggaGVhZGVyIG9uIGEKLSAgICAgICAgICAgIC8vIFNFVF9QQVJBTUVURVIgcmVxdWVzdCB0aGF0IHNpZ25hbHMgYSAid2ZkX2lkcl9yZXF1ZXN0Ii4KLSAgICAgICAgICAgIC8vICgxNyBpbnN0ZWFkIG9mIDE5KS4KLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbnRlbnQgPSBtc2ctPmdldENvbnRlbnQoKTsKLSAgICAgICAgICAgIGlmIChjb250ZW50Ci0gICAgICAgICAgICAgICAgICAgICYmICFtZW1jbXAoY29udGVudCwgIndmZF9pZHJfcmVxdWVzdFxyXG4iLCAxNykKLSAgICAgICAgICAgICAgICAgICAgJiYgbGVuZ3RoID49IDE5Ci0gICAgICAgICAgICAgICAgICAgICYmIG1JbkJ1ZmZlci5jX3N0cigpW2xlbmd0aF0gPT0gJ1xyJwotICAgICAgICAgICAgICAgICAgICAmJiBtSW5CdWZmZXIuY19zdHIoKVtsZW5ndGggKyAxXSA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoICs9IDI7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICAgICAgbUluQnVmZmVyLmVyYXNlKDAsIGxlbmd0aCk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIENIRUNLX0VRKG1Nb2RlLCBNT0RFX1dFQlNPQ0tFVCk7Ci0KLSAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IChjb25zdCB1aW50OF90ICopbUluQnVmZmVyLmNfc3RyKCk7Ci0gICAgICAgIC8vIGhleGR1bXAoZGF0YSwgbUluQnVmZmVyLnNpemUoKSk7Ci0KLSAgICAgICAgd2hpbGUgKG1JbkJ1ZmZlci5zaXplKCkgPj0gMikgewotICAgICAgICAgICAgc2l6ZV90IG9mZnNldCA9IDI7Ci0KLSAgICAgICAgICAgIHVpbnQ2NF90IHBheWxvYWRMZW4gPSBkYXRhWzFdICYgMHg3ZjsKLSAgICAgICAgICAgIGlmIChwYXlsb2FkTGVuID09IDEyNikgewotICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgKyAyID4gbUluQnVmZmVyLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwYXlsb2FkTGVuID0gVTE2X0FUKCZkYXRhW29mZnNldF0pOwotICAgICAgICAgICAgICAgIG9mZnNldCArPSAyOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwYXlsb2FkTGVuID09IDEyNykgewotICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgKyA4ID4gbUluQnVmZmVyLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwYXlsb2FkTGVuID0gVTY0X0FUKCZkYXRhW29mZnNldF0pOwotICAgICAgICAgICAgICAgIG9mZnNldCArPSA4OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1aW50MzJfdCBtYXNrID0gMDsKLSAgICAgICAgICAgIGlmIChkYXRhWzFdICYgMHg4MCkgewotICAgICAgICAgICAgICAgIC8vIE1BU0s9PTEKLSAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ICsgNCA+IG1JbkJ1ZmZlci5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbWFzayA9IFUzMl9BVCgmZGF0YVtvZmZzZXRdKTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBheWxvYWRMZW4gPiBtSW5CdWZmZXIuc2l6ZSgpIHx8IG9mZnNldCA+IG1JbkJ1ZmZlci5zaXplKCkgLSBwYXlsb2FkTGVuKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFdlIGhhdmUgdGhlIGZ1bGwgbWVzc2FnZS4KLQotICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gcGFja2V0ID0gbmV3IEFCdWZmZXIocGF5bG9hZExlbik7Ci0gICAgICAgICAgICBtZW1jcHkocGFja2V0LT5kYXRhKCksICZkYXRhW29mZnNldF0sIHBheWxvYWRMZW4pOwotCi0gICAgICAgICAgICBpZiAobWFzayAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXlsb2FkTGVuOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFja2V0LT5kYXRhKClbaV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtvZmZzZXQgKyBpXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gKChtYXNrID4+ICg4ICogKDMgLSAoaSAlIDQpKSkpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzZXNzaW9uSUQiLCBtU2Vzc2lvbklEKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInJlYXNvbiIsIGtXaGF0V2ViU29ja2V0TWVzc2FnZSk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEJ1ZmZlcigiZGF0YSIsIHBhY2tldCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJoZWFkZXJCeXRlIiwgZGF0YVswXSk7Ci0gICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKLQotICAgICAgICAgICAgbUluQnVmZmVyLmVyYXNlKDAsIG9mZnNldCArIHBheWxvYWRMZW4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBub3RpZnlFcnJvcihmYWxzZSAvKiBzZW5kICovLCBlcnIsICJSZWN2IGZhaWxlZC4iKTsKLSAgICAgICAgbVNhd1JlY2VpdmVGYWlsdXJlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi12b2lkIEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6ZHVtcEZyYWdtZW50U3RhdHMoY29uc3QgRnJhZ21lbnQgJiAvKiBmcmFnICovKSB7Ci0jaWYgMAotICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotICAgIGludDY0X3QgZGVsYXlNcyA9IChub3dVcyAtIGZyYWcubVRpbWVVcykgLyAxMDAwbGw7Ci0KLSAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWluRGVsYXlNcyA9IDA7Ci0gICAgc3RhdGljIGNvbnN0IGludDY0X3Qga01heERlbGF5TXMgPSAzMDA7Ci0KLSAgICBjb25zdCBjaGFyICprUGF0dGVybiA9ICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIjsKLSAgICBzaXplX3Qga1BhdHRlcm5TaXplID0gc3RybGVuKGtQYXR0ZXJuKTsKLQotICAgIGludCBuID0gKGtQYXR0ZXJuU2l6ZSAqIChkZWxheU1zIC0ga01pbkRlbGF5TXMpKQotICAgICAgICAgICAgICAgIC8gKGtNYXhEZWxheU1zIC0ga01pbkRlbGF5TXMpOwotCi0gICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgIG4gPSAwOwotICAgIH0gZWxzZSBpZiAoKHNpemVfdCluID4ga1BhdHRlcm5TaXplKSB7Ci0gICAgICAgIG4gPSBrUGF0dGVyblNpemU7Ci0gICAgfQotCi0gICAgQUxPR0koIlslbGxkXTogKCU0bGxkIG1zKSAlc1xuIiwKLSAgICAgICAgICBmcmFnLm1UaW1lVXMgLyAxMDAwLAotICAgICAgICAgIGRlbGF5TXMsCi0gICAgICAgICAga1BhdHRlcm4gKyBrUGF0dGVyblNpemUgLSBuKTsKLSNlbmRpZgotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OndyaXRlTW9yZSgpIHsKLSAgICBpZiAobVN0YXRlID09IERBVEFHUkFNKSB7Ci0gICAgICAgIENIRUNLKCFtT3V0RnJhZ21lbnRzLmVtcHR5KCkpOwotCi0gICAgICAgIHN0YXR1c190IGVycjsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgY29uc3QgRnJhZ21lbnQgJmZyYWcgPSAqbU91dEZyYWdtZW50cy5iZWdpbigpOwotICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmRhdGFncmFtID0gZnJhZy5tQnVmZmVyOwotCi0gICAgICAgICAgICBpbnQgbjsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBuID0gc2VuZChtU29ja2V0LCBkYXRhZ3JhbS0+ZGF0YSgpLCBkYXRhZ3JhbS0+c2l6ZSgpLCAwKTsKLSAgICAgICAgICAgIH0gd2hpbGUgKG4gPCAwICYmIGVycm5vID09IEVJTlRSKTsKLQotICAgICAgICAgICAgZXJyID0gT0s7Ci0KLSAgICAgICAgICAgIGlmIChuID4gMCkgewotICAgICAgICAgICAgICAgIGlmIChmcmFnLm1GbGFncyAmIEZSQUdNRU5UX0ZMQUdfVElNRV9WQUxJRCkgewotICAgICAgICAgICAgICAgICAgICBkdW1wRnJhZ21lbnRTdGF0cyhmcmFnKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtT3V0RnJhZ21lbnRzLmVyYXNlKG1PdXRGcmFnbWVudHMuYmVnaW4oKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG4gPCAwKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gLWVycm5vOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuID09IDApIHsKLSAgICAgICAgICAgICAgICBlcnIgPSAtRUNPTk5SRVNFVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAoZXJyID09IE9LICYmICFtT3V0RnJhZ21lbnRzLmVtcHR5KCkpOwotCi0gICAgICAgIGlmIChlcnIgPT0gLUVBR0FJTikgewotICAgICAgICAgICAgaWYgKCFtT3V0RnJhZ21lbnRzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HSSgiJXp1IGRhdGFncmFtcyByZW1haW4gcXVldWVkLiIsIG1PdXRGcmFnbWVudHMuc2l6ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVyciA9IE9LOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgaWYgKCFtVURQUmV0cmllcykgewotICAgICAgICAgICAgICAgIG5vdGlmeUVycm9yKHRydWUgLyogc2VuZCAqLywgZXJyLCAiU2VuZCBkYXRhZ3JhbSBmYWlsZWQuIik7Ci0gICAgICAgICAgICAgICAgbVNhd1NlbmRGYWlsdXJlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVVEUFJldHJpZXMtLTsKLSAgICAgICAgICAgICAgICBBTE9HRSgiU2VuZCBkYXRhZ3JhbSBmYWlsZWQsICVkLyVkIHJldHJpZXMgbGVmdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtVURQUmV0cmllcywga01heFVEUFJldHJpZXMpOwotICAgICAgICAgICAgICAgIGVyciA9IE9LOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVVEUFJldHJpZXMgPSBrTWF4VURQUmV0cmllczsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKG1TdGF0ZSA9PSBDT05ORUNUSU5HKSB7Ci0gICAgICAgIGludCBlcnI7Ci0gICAgICAgIHNvY2tsZW5fdCBvcHRpb25MZW4gPSBzaXplb2YoZXJyKTsKLSAgICAgICAgQ0hFQ0tfRVEoZ2V0c29ja29wdChtU29ja2V0LCBTT0xfU09DS0VULCBTT19FUlJPUiwgJmVyciwgJm9wdGlvbkxlbiksIDApOwotICAgICAgICBDSEVDS19FUShvcHRpb25MZW4sIChzb2NrbGVuX3Qpc2l6ZW9mKGVycikpOwotCi0gICAgICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICAgICAgbm90aWZ5RXJyb3Ioa1doYXRFcnJvciwgLWVyciwgIkNvbm5lY3Rpb24gZmFpbGVkIik7Ci0gICAgICAgICAgICBtU2F3U2VuZEZhaWx1cmUgPSB0cnVlOwotCi0gICAgICAgICAgICByZXR1cm4gLWVycjsKLSAgICAgICAgfQotCi0gICAgICAgIG1TdGF0ZSA9IENPTk5FQ1RFRDsKLSAgICAgICAgbm90aWZ5KGtXaGF0Q29ubmVjdGVkKTsKLQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgQ0hFQ0tfRVEobVN0YXRlLCBDT05ORUNURUQpOwotICAgIENIRUNLKCFtT3V0RnJhZ21lbnRzLmVtcHR5KCkpOwotCi0gICAgc3NpemVfdCBuID0gLTE7Ci0gICAgd2hpbGUgKCFtT3V0RnJhZ21lbnRzLmVtcHR5KCkpIHsKLSAgICAgICAgY29uc3QgRnJhZ21lbnQgJmZyYWcgPSAqbU91dEZyYWdtZW50cy5iZWdpbigpOwotCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIG4gPSBzZW5kKG1Tb2NrZXQsIGZyYWcubUJ1ZmZlci0+ZGF0YSgpLCBmcmFnLm1CdWZmZXItPnNpemUoKSwgMCk7Ci0gICAgICAgIH0gd2hpbGUgKG4gPCAwICYmIGVycm5vID09IEVJTlRSKTsKLQotICAgICAgICBpZiAobiA8PSAwKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGZyYWcubUJ1ZmZlci0+c2V0UmFuZ2UoCi0gICAgICAgICAgICAgICAgZnJhZy5tQnVmZmVyLT5vZmZzZXQoKSArIG4sIGZyYWcubUJ1ZmZlci0+c2l6ZSgpIC0gbik7Ci0KLSAgICAgICAgaWYgKGZyYWcubUJ1ZmZlci0+c2l6ZSgpID4gMCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZnJhZy5tRmxhZ3MgJiBGUkFHTUVOVF9GTEFHX1RJTUVfVkFMSUQpIHsKLSAgICAgICAgICAgIGR1bXBGcmFnbWVudFN0YXRzKGZyYWcpOwotICAgICAgICB9Ci0KLSAgICAgICAgbU91dEZyYWdtZW50cy5lcmFzZShtT3V0RnJhZ21lbnRzLmJlZ2luKCkpOwotICAgIH0KLQotICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgIGVyciA9IC1lcnJubzsKLSAgICB9IGVsc2UgaWYgKG4gPT0gMCkgewotICAgICAgICBlcnIgPSAtRUNPTk5SRVNFVDsKLSAgICB9Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIG5vdGlmeUVycm9yKHRydWUgLyogc2VuZCAqLywgZXJyLCAiU2VuZCBmYWlsZWQuIik7Ci0gICAgICAgIG1TYXdTZW5kRmFpbHVyZSA9IHRydWU7Ci0gICAgfQotCi0jaWYgMAotICAgIGludCBudW1CeXRlc1F1ZXVlZDsKLSAgICBpbnQgcmVzID0gaW9jdGwobVNvY2tldCwgU0lPQ09VVFEsICZudW1CeXRlc1F1ZXVlZCk7Ci0gICAgaWYgKHJlcyA9PSAwICYmIG51bUJ5dGVzUXVldWVkID4gNTAgKiAxMDI0KSB7Ci0gICAgICAgIGlmIChudW1CeXRlc1F1ZXVlZCA+IDQwOTYwMCkgewotICAgICAgICAgICAgQUxPR1coIiEhISBudW1CeXRlc1F1ZXVlZCA9ICVkIiwgbnVtQnl0ZXNRdWV1ZWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0KLSAgICAgICAgaWYgKG1MYXN0U3RhbGxSZXBvcnRVcyA8IDBsbAotICAgICAgICAgICAgICAgIHx8IG5vd1VzID4gbUxhc3RTdGFsbFJlcG9ydFVzICsgMTAwMDAwbGwpIHsKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoInNlc3Npb25JRCIsIG1TZXNzaW9uSUQpOwotICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigicmVhc29uIiwga1doYXROZXR3b3JrU3RhbGwpOwotICAgICAgICAgICAgbXNnLT5zZXRTaXplKCJudW1CeXRlc1F1ZXVlZCIsIG51bUJ5dGVzUXVldWVkKTsKLSAgICAgICAgICAgIG1zZy0+cG9zdCgpOwotCi0gICAgICAgICAgICBtTGFzdFN0YWxsUmVwb3J0VXMgPSBub3dVczsKLSAgICAgICAgfQotICAgIH0KLSNlbmRpZgotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpzZW5kUmVxdWVzdCgKLSAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc3NpemVfdCBzaXplLCBib29sIHRpbWVWYWxpZCwgaW50NjRfdCB0aW1lVXMpIHsKLSAgICBDSEVDSyhtU3RhdGUgPT0gQ09OTkVDVEVEIHx8IG1TdGF0ZSA9PSBEQVRBR1JBTSk7Ci0KLSAgICBpZiAoc2l6ZSA8IDApIHsKLSAgICAgICAgc2l6ZSA9IHN0cmxlbigoY29uc3QgY2hhciAqKWRhdGEpOwotICAgIH0KLQotICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKLQotICAgIGlmIChtU3RhdGUgPT0gQ09OTkVDVEVEICYmIG1Nb2RlID09IE1PREVfREFUQUdSQU0pIHsKLSAgICAgICAgQ0hFQ0tfTEUoc2l6ZSwgNjU1MzUpOwotCi0gICAgICAgIGJ1ZmZlciA9IG5ldyBBQnVmZmVyKHNpemUgKyAyKTsKLSAgICAgICAgYnVmZmVyLT5kYXRhKClbMF0gPSBzaXplID4+IDg7Ci0gICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzFdID0gc2l6ZSAmIDB4ZmY7Ci0gICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSArIDIsIGRhdGEsIHNpemUpOwotICAgIH0gZWxzZSBpZiAobVN0YXRlID09IENPTk5FQ1RFRCAmJiBtTW9kZSA9PSBNT0RFX1dFQlNPQ0tFVCkgewotICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBrVXNlTWFzayA9IGZhbHNlOyAgLy8gQ2hyb21pdW0gZG9lc24ndCBsaWtlIGl0LgotCi0gICAgICAgIHNpemVfdCBudW1IZWFkZXJCeXRlcyA9IDIgKyAoa1VzZU1hc2sgPyA0IDogMCk7Ci0gICAgICAgIGlmIChzaXplID4gNjU1MzUpIHsKLSAgICAgICAgICAgIG51bUhlYWRlckJ5dGVzICs9IDg7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA+IDEyNSkgewotICAgICAgICAgICAgbnVtSGVhZGVyQnl0ZXMgKz0gMjsKLSAgICAgICAgfQotCi0gICAgICAgIGJ1ZmZlciA9IG5ldyBBQnVmZmVyKG51bUhlYWRlckJ5dGVzICsgc2l6ZSk7Ci0gICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzBdID0gMHg4MTsgIC8vIEZJTj09MSB8IG9wY29kZT0xICh0ZXh0KQotICAgICAgICBidWZmZXItPmRhdGEoKVsxXSA9IGtVc2VNYXNrID8gMHg4MCA6IDB4MDA7Ci0KLSAgICAgICAgaWYgKHNpemUgPiA2NTUzNSkgewotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbMV0gfD0gMTI3OwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbMl0gPSAweDAwOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbM10gPSAweDAwOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbNF0gPSAweDAwOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbNV0gPSAweDAwOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbNl0gPSAoc2l6ZSA+PiAyNCkgJiAweGZmOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbN10gPSAoc2l6ZSA+PiAxNikgJiAweGZmOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbOF0gPSAoc2l6ZSA+PiA4KSAmIDB4ZmY7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVs5XSA9IHNpemUgJiAweGZmOwotICAgICAgICB9IGVsc2UgaWYgKHNpemUgPiAxMjUpIHsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzFdIHw9IDEyNjsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzJdID0gKHNpemUgPj4gOCkgJiAweGZmOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbM10gPSBzaXplICYgMHhmZjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzFdIHw9IHNpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoa1VzZU1hc2spIHsKLSAgICAgICAgICAgIHVpbnQzMl90IG1hc2sgPSByYW5kKCk7Ci0KLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpW251bUhlYWRlckJ5dGVzIC0gNF0gPSAobWFzayA+PiAyNCkgJiAweGZmOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbbnVtSGVhZGVyQnl0ZXMgLSAzXSA9IChtYXNrID4+IDE2KSAmIDB4ZmY7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVtudW1IZWFkZXJCeXRlcyAtIDJdID0gKG1hc2sgPj4gOCkgJiAweGZmOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbbnVtSGVhZGVyQnl0ZXMgLSAxXSA9IG1hc2sgJiAweGZmOwotCi0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IChzaXplX3Qpc2l6ZTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbbnVtSGVhZGVyQnl0ZXMgKyBpXSA9Ci0gICAgICAgICAgICAgICAgICAgICgoY29uc3QgdWludDhfdCAqKWRhdGEpW2ldCi0gICAgICAgICAgICAgICAgICAgICAgICBeICgobWFzayA+PiAoOCAqICgzIC0gKGkgJSA0KSkpKSAmIDB4ZmYpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpICsgbnVtSGVhZGVyQnl0ZXMsIGRhdGEsIHNpemUpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYnVmZmVyID0gbmV3IEFCdWZmZXIoc2l6ZSk7Ci0gICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7Ci0gICAgfQotCi0gICAgRnJhZ21lbnQgZnJhZzsKLQotICAgIGZyYWcubUZsYWdzID0gMDsKLSAgICBpZiAodGltZVZhbGlkKSB7Ci0gICAgICAgIGZyYWcubUZsYWdzID0gRlJBR01FTlRfRkxBR19USU1FX1ZBTElEOwotICAgICAgICBmcmFnLm1UaW1lVXMgPSB0aW1lVXM7Ci0gICAgfQotCi0gICAgZnJhZy5tQnVmZmVyID0gYnVmZmVyOwotCi0gICAgbU91dEZyYWdtZW50cy5wdXNoX2JhY2soZnJhZyk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpub3RpZnlFcnJvcigKLSAgICAgICAgYm9vbCBzZW5kLCBzdGF0dXNfdCBlcnIsIGNvbnN0IGNoYXIgKmRldGFpbCkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICBtc2ctPnNldEludDMyKCJzZXNzaW9uSUQiLCBtU2Vzc2lvbklEKTsKLSAgICBtc2ctPnNldEludDMyKCJyZWFzb24iLCBrV2hhdEVycm9yKTsKLSAgICBtc2ctPnNldEludDMyKCJzZW5kIiwgc2VuZCk7Ci0gICAgbXNnLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKLSAgICBtc2ctPnNldFN0cmluZygiZGV0YWlsIiwgZGV0YWlsKTsKLSAgICBtc2ctPnBvc3QoKTsKLX0KLQotdm9pZCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246Om5vdGlmeShOb3RpZmljYXRpb25SZWFzb24gcmVhc29uKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnktPmR1cCgpOwotICAgIG1zZy0+c2V0SW50MzIoInNlc3Npb25JRCIsIG1TZXNzaW9uSUQpOwotICAgIG1zZy0+c2V0SW50MzIoInJlYXNvbiIsIHJlYXNvbik7Ci0gICAgbXNnLT5wb3N0KCk7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLUFOZXR3b3JrU2Vzc2lvbjo6QU5ldHdvcmtTZXNzaW9uKCkKLSAgICA6IG1OZXh0U2Vzc2lvbklEKDEpIHsKLSAgICBtUGlwZUZkWzBdID0gbVBpcGVGZFsxXSA9IC0xOwotfQotCi1BTmV0d29ya1Nlc3Npb246On5BTmV0d29ya1Nlc3Npb24oKSB7Ci0gICAgc3RvcCgpOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OnN0YXJ0KCkgewotICAgIGlmIChtVGhyZWFkICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIGludCByZXMgPSBwaXBlKG1QaXBlRmQpOwotICAgIGlmIChyZXMgIT0gMCkgewotICAgICAgICBtUGlwZUZkWzBdID0gbVBpcGVGZFsxXSA9IC0xOwotICAgICAgICByZXR1cm4gLWVycm5vOwotICAgIH0KLQotICAgIG1UaHJlYWQgPSBuZXcgTmV0d29ya1RocmVhZCh0aGlzKTsKLQotICAgIHN0YXR1c190IGVyciA9IG1UaHJlYWQtPnJ1bigiQU5ldHdvcmtTZXNzaW9uIiwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIG1UaHJlYWQuY2xlYXIoKTsKLQotICAgICAgICBjbG9zZShtUGlwZUZkWzBdKTsKLSAgICAgICAgY2xvc2UobVBpcGVGZFsxXSk7Ci0gICAgICAgIG1QaXBlRmRbMF0gPSBtUGlwZUZkWzFdID0gLTE7Ci0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6c3RvcCgpIHsKLSAgICBpZiAobVRocmVhZCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBtVGhyZWFkLT5yZXF1ZXN0RXhpdCgpOwotICAgIGludGVycnVwdCgpOwotICAgIG1UaHJlYWQtPnJlcXVlc3RFeGl0QW5kV2FpdCgpOwotCi0gICAgbVRocmVhZC5jbGVhcigpOwotCi0gICAgY2xvc2UobVBpcGVGZFswXSk7Ci0gICAgY2xvc2UobVBpcGVGZFsxXSk7Ci0gICAgbVBpcGVGZFswXSA9IG1QaXBlRmRbMV0gPSAtMTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpjcmVhdGVSVFNQQ2xpZW50KAotICAgICAgICBjb25zdCBjaGFyICpob3N0LCB1bnNpZ25lZCBwb3J0LCBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgaW50MzJfdCAqc2Vzc2lvbklEKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZUNsaWVudE9yU2VydmVyKAotICAgICAgICAgICAga01vZGVDcmVhdGVSVFNQQ2xpZW50LAotICAgICAgICAgICAgTlVMTCAvKiBhZGRyICovLAotICAgICAgICAgICAgMCAvKiBwb3J0ICovLAotICAgICAgICAgICAgaG9zdCwKLSAgICAgICAgICAgIHBvcnQsCi0gICAgICAgICAgICBub3RpZnksCi0gICAgICAgICAgICBzZXNzaW9uSUQpOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OmNyZWF0ZVJUU1BTZXJ2ZXIoCi0gICAgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICZhZGRyLCB1bnNpZ25lZCBwb3J0LAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgaW50MzJfdCAqc2Vzc2lvbklEKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZUNsaWVudE9yU2VydmVyKAotICAgICAgICAgICAga01vZGVDcmVhdGVSVFNQU2VydmVyLAotICAgICAgICAgICAgJmFkZHIsCi0gICAgICAgICAgICBwb3J0LAotICAgICAgICAgICAgTlVMTCAvKiByZW1vdGVIb3N0ICovLAotICAgICAgICAgICAgMCAvKiByZW1vdGVQb3J0ICovLAotICAgICAgICAgICAgbm90aWZ5LAotICAgICAgICAgICAgc2Vzc2lvbklEKTsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpjcmVhdGVVRFBTZXNzaW9uKAotICAgICAgICB1bnNpZ25lZCBsb2NhbFBvcnQsIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBpbnQzMl90ICpzZXNzaW9uSUQpIHsKLSAgICByZXR1cm4gY3JlYXRlVURQU2Vzc2lvbihsb2NhbFBvcnQsIE5VTEwsIDAsIG5vdGlmeSwgc2Vzc2lvbklEKTsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpjcmVhdGVVRFBTZXNzaW9uKAotICAgICAgICB1bnNpZ25lZCBsb2NhbFBvcnQsCi0gICAgICAgIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsCi0gICAgICAgIHVuc2lnbmVkIHJlbW90ZVBvcnQsCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICBpbnQzMl90ICpzZXNzaW9uSUQpIHsKLSAgICByZXR1cm4gY3JlYXRlQ2xpZW50T3JTZXJ2ZXIoCi0gICAgICAgICAgICBrTW9kZUNyZWF0ZVVEUFNlc3Npb24sCi0gICAgICAgICAgICBOVUxMIC8qIGFkZHIgKi8sCi0gICAgICAgICAgICBsb2NhbFBvcnQsCi0gICAgICAgICAgICByZW1vdGVIb3N0LAotICAgICAgICAgICAgcmVtb3RlUG9ydCwKLSAgICAgICAgICAgIG5vdGlmeSwKLSAgICAgICAgICAgIHNlc3Npb25JRCk7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6Y3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uKAotICAgICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAmYWRkciwgdW5zaWduZWQgcG9ydCwKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIGludDMyX3QgKnNlc3Npb25JRCkgewotICAgIHJldHVybiBjcmVhdGVDbGllbnRPclNlcnZlcigKLSAgICAgICAgICAgIGtNb2RlQ3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uUGFzc2l2ZSwKLSAgICAgICAgICAgICZhZGRyLAotICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgICAgIE5VTEwgLyogcmVtb3RlSG9zdCAqLywKLSAgICAgICAgICAgIDAgLyogcmVtb3RlUG9ydCAqLywKLSAgICAgICAgICAgIG5vdGlmeSwKLSAgICAgICAgICAgIHNlc3Npb25JRCk7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6Y3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uKAotICAgICAgICB1bnNpZ25lZCBsb2NhbFBvcnQsCi0gICAgICAgIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsCi0gICAgICAgIHVuc2lnbmVkIHJlbW90ZVBvcnQsCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICBpbnQzMl90ICpzZXNzaW9uSUQpIHsKLSAgICByZXR1cm4gY3JlYXRlQ2xpZW50T3JTZXJ2ZXIoCi0gICAgICAgICAgICBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbkFjdGl2ZSwKLSAgICAgICAgICAgIE5VTEwgLyogYWRkciAqLywKLSAgICAgICAgICAgIGxvY2FsUG9ydCwKLSAgICAgICAgICAgIHJlbW90ZUhvc3QsCi0gICAgICAgICAgICByZW1vdGVQb3J0LAotICAgICAgICAgICAgbm90aWZ5LAotICAgICAgICAgICAgc2Vzc2lvbklEKTsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpkZXN0cm95U2Vzc2lvbihpbnQzMl90IHNlc3Npb25JRCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBzc2l6ZV90IGluZGV4ID0gbVNlc3Npb25zLmluZGV4T2ZLZXkoc2Vzc2lvbklEKTsKLQotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuIC1FTk9FTlQ7Ci0gICAgfQotCi0gICAgbVNlc3Npb25zLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwotCi0gICAgaW50ZXJydXB0KCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpNYWtlU29ja2V0Tm9uQmxvY2tpbmcoaW50IHMpIHsKLSAgICBpbnQgZmxhZ3MgPSBmY250bChzLCBGX0dFVEZMLCAwKTsKLSAgICBpZiAoZmxhZ3MgPCAwKSB7Ci0gICAgICAgIGZsYWdzID0gMDsKLSAgICB9Ci0KLSAgICBpbnQgcmVzID0gZmNudGwocywgRl9TRVRGTCwgZmxhZ3MgfCBPX05PTkJMT0NLKTsKLSAgICBpZiAocmVzIDwgMCkgewotICAgICAgICByZXR1cm4gLWVycm5vOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpjcmVhdGVDbGllbnRPclNlcnZlcigKLSAgICAgICAgTW9kZSBtb2RlLAotICAgICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAqbG9jYWxBZGRyLAotICAgICAgICB1bnNpZ25lZCBwb3J0LAotICAgICAgICBjb25zdCBjaGFyICpyZW1vdGVIb3N0LAotICAgICAgICB1bnNpZ25lZCByZW1vdGVQb3J0LAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgaW50MzJfdCAqc2Vzc2lvbklEKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgICpzZXNzaW9uSUQgPSAwOwotICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgIGludCBzLCByZXM7Ci0gICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbjsKLQotICAgIHMgPSBzb2NrZXQoCi0gICAgICAgICAgICBBRl9JTkVULAotICAgICAgICAgICAgKG1vZGUgPT0ga01vZGVDcmVhdGVVRFBTZXNzaW9uKSA/IFNPQ0tfREdSQU0gOiBTT0NLX1NUUkVBTSwKLSAgICAgICAgICAgIDApOwotCi0gICAgaWYgKHMgPCAwKSB7Ci0gICAgICAgIGVyciA9IC1lcnJubzsKLSAgICAgICAgZ290byBiYWlsOwotICAgIH0KLQotICAgIGlmIChtb2RlID09IGtNb2RlQ3JlYXRlUlRTUFNlcnZlcgotICAgICAgICAgICAgfHwgbW9kZSA9PSBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvblBhc3NpdmUpIHsKLSAgICAgICAgY29uc3QgaW50IHllcyA9IDE7Ci0gICAgICAgIHJlcyA9IHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmeWVzLCBzaXplb2YoeWVzKSk7Ci0KLSAgICAgICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgICAgIGVyciA9IC1lcnJubzsKLSAgICAgICAgICAgIGdvdG8gYmFpbDI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobW9kZSA9PSBrTW9kZUNyZWF0ZVVEUFNlc3Npb24pIHsKLSAgICAgICAgaW50IHNpemUgPSAyNTYgKiAxMDI0OwotCi0gICAgICAgIHJlcyA9IHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fUkNWQlVGLCAmc2l6ZSwgc2l6ZW9mKHNpemUpKTsKLQotICAgICAgICBpZiAocmVzIDwgMCkgewotICAgICAgICAgICAgZXJyID0gLWVycm5vOwotICAgICAgICAgICAgZ290byBiYWlsMjsKLSAgICAgICAgfQotCi0gICAgICAgIHJlcyA9IHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fU05EQlVGLCAmc2l6ZSwgc2l6ZW9mKHNpemUpKTsKLQotICAgICAgICBpZiAocmVzIDwgMCkgewotICAgICAgICAgICAgZXJyID0gLWVycm5vOwotICAgICAgICAgICAgZ290byBiYWlsMjsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobW9kZSA9PSBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbkFjdGl2ZSkgewotICAgICAgICBpbnQgZmxhZyA9IDE7Ci0gICAgICAgIHJlcyA9IHNldHNvY2tvcHQocywgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCAmZmxhZywgc2l6ZW9mKGZsYWcpKTsKLQotICAgICAgICBpZiAocmVzIDwgMCkgewotICAgICAgICAgICAgZXJyID0gLWVycm5vOwotICAgICAgICAgICAgZ290byBiYWlsMjsKLSAgICAgICAgfQotCi0gICAgICAgIGludCB0b3MgPSAyMjQ7ICAvLyBWT0lDRQotICAgICAgICByZXMgPSBzZXRzb2Nrb3B0KHMsIElQUFJPVE9fSVAsIElQX1RPUywgJnRvcywgc2l6ZW9mKHRvcykpOwotCi0gICAgICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgICAgICAgICBnb3RvIGJhaWwyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZXJyID0gTWFrZVNvY2tldE5vbkJsb2NraW5nKHMpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBnb3RvIGJhaWwyOwotICAgIH0KLQotICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOwotICAgIG1lbXNldChhZGRyLnNpbl96ZXJvLCAwLCBzaXplb2YoYWRkci5zaW5femVybykpOwotICAgIGFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0KLSAgICBpZiAobW9kZSA9PSBrTW9kZUNyZWF0ZVJUU1BDbGllbnQKLSAgICAgICAgICAgIHx8IG1vZGUgPT0ga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25BY3RpdmUpIHsKLSAgICAgICAgc3RydWN0IGhvc3RlbnQgKmVudD0gZ2V0aG9zdGJ5bmFtZShyZW1vdGVIb3N0KTsKLSAgICAgICAgaWYgKGVudCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBlcnIgPSAtaF9lcnJubzsKLSAgICAgICAgICAgIGdvdG8gYmFpbDI7Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRyLnNpbl9hZGRyLnNfYWRkciA9ICooaW5fYWRkcl90ICopZW50LT5oX2FkZHI7Ci0gICAgICAgIGFkZHIuc2luX3BvcnQgPSBodG9ucyhyZW1vdGVQb3J0KTsKLSAgICB9IGVsc2UgaWYgKGxvY2FsQWRkciAhPSBOVUxMKSB7Ci0gICAgICAgIGFkZHIuc2luX2FkZHIgPSAqbG9jYWxBZGRyOwotICAgICAgICBhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYWRkci5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfQU5ZKTsKLSAgICAgICAgYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOwotICAgIH0KLQotICAgIGlmIChtb2RlID09IGtNb2RlQ3JlYXRlUlRTUENsaWVudAotICAgICAgICAgICAgfHwgbW9kZSA9PSBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbkFjdGl2ZSkgewotICAgICAgICBpbl9hZGRyX3QgeCA9IG50b2hsKGFkZHIuc2luX2FkZHIuc19hZGRyKTsKLSAgICAgICAgQUxPR0koImNvbm5lY3Rpbmcgc29ja2V0ICVkIHRvICVkLiVkLiVkLiVkOiVkIiwKLSAgICAgICAgICAgICAgcywKLSAgICAgICAgICAgICAgKHggPj4gMjQpLAotICAgICAgICAgICAgICAoeCA+PiAxNikgJiAweGZmLAotICAgICAgICAgICAgICAoeCA+PiA4KSAmIDB4ZmYsCi0gICAgICAgICAgICAgIHggJiAweGZmLAotICAgICAgICAgICAgICBudG9ocyhhZGRyLnNpbl9wb3J0KSk7Ci0KLSAgICAgICAgcmVzID0gY29ubmVjdChzLCAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSk7Ci0KLSAgICAgICAgQ0hFQ0tfTFQocmVzLCAwKTsKLSAgICAgICAgaWYgKGVycm5vID09IEVJTlBST0dSRVNTKSB7Ci0gICAgICAgICAgICByZXMgPSAwOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmVzID0gYmluZChzLCAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSk7Ci0KLSAgICAgICAgaWYgKHJlcyA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAobW9kZSA9PSBrTW9kZUNyZWF0ZVJUU1BTZXJ2ZXIKLSAgICAgICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvblBhc3NpdmUpIHsKLSAgICAgICAgICAgICAgICByZXMgPSBsaXN0ZW4ocywgNCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIENIRUNLX0VRKG1vZGUsIGtNb2RlQ3JlYXRlVURQU2Vzc2lvbik7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVtb3RlSG9zdCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiByZW1vdGVBZGRyOwotICAgICAgICAgICAgICAgICAgICBtZW1zZXQocmVtb3RlQWRkci5zaW5femVybywgMCwgc2l6ZW9mKHJlbW90ZUFkZHIuc2luX3plcm8pKTsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3RlQWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3RlQWRkci5zaW5fcG9ydCA9IGh0b25zKHJlbW90ZVBvcnQpOwotCi0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBob3N0ZW50ICplbnQ9IGdldGhvc3RieW5hbWUocmVtb3RlSG9zdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbnQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gLWhfZXJybm87Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGJhaWwyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVtb3RlQWRkci5zaW5fYWRkci5zX2FkZHIgPSAqKGluX2FkZHJfdCAqKWVudC0+aF9hZGRyOwotCi0gICAgICAgICAgICAgICAgICAgIHJlcyA9IGNvbm5lY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopJnJlbW90ZUFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHJlbW90ZUFkZHIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocmVzIDwgMCkgewotICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgICAgIGdvdG8gYmFpbDI7Ci0gICAgfQotCi0gICAgU2Vzc2lvbjo6U3RhdGUgc3RhdGU7Ci0gICAgc3dpdGNoIChtb2RlKSB7Ci0gICAgICAgIGNhc2Uga01vZGVDcmVhdGVSVFNQQ2xpZW50OgotICAgICAgICAgICAgc3RhdGUgPSBTZXNzaW9uOjpDT05ORUNUSU5HOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbkFjdGl2ZToKLSAgICAgICAgICAgIHN0YXRlID0gU2Vzc2lvbjo6Q09OTkVDVElORzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Uga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25QYXNzaXZlOgotICAgICAgICAgICAgc3RhdGUgPSBTZXNzaW9uOjpMSVNURU5JTkdfVENQX0RHUkFNUzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Uga01vZGVDcmVhdGVSVFNQU2VydmVyOgotICAgICAgICAgICAgc3RhdGUgPSBTZXNzaW9uOjpMSVNURU5JTkdfUlRTUDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBDSEVDS19FUShtb2RlLCBrTW9kZUNyZWF0ZVVEUFNlc3Npb24pOwotICAgICAgICAgICAgc3RhdGUgPSBTZXNzaW9uOjpEQVRBR1JBTTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHNlc3Npb24gPSBuZXcgU2Vzc2lvbigKLSAgICAgICAgICAgIG1OZXh0U2Vzc2lvbklEKyssCi0gICAgICAgICAgICBzdGF0ZSwKLSAgICAgICAgICAgIHMsCi0gICAgICAgICAgICBub3RpZnkpOwotCi0gICAgaWYgKG1vZGUgPT0ga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25BY3RpdmUpIHsKLSAgICAgICAgc2Vzc2lvbi0+c2V0TW9kZShTZXNzaW9uOjpNT0RFX0RBVEFHUkFNKTsKLSAgICB9IGVsc2UgaWYgKG1vZGUgPT0ga01vZGVDcmVhdGVSVFNQQ2xpZW50KSB7Ci0gICAgICAgIHNlc3Npb24tPnNldE1vZGUoU2Vzc2lvbjo6TU9ERV9SVFNQKTsKLSAgICB9Ci0KLSAgICBtU2Vzc2lvbnMuYWRkKHNlc3Npb24tPnNlc3Npb25JRCgpLCBzZXNzaW9uKTsKLQotICAgIGludGVycnVwdCgpOwotCi0gICAgKnNlc3Npb25JRCA9IHNlc3Npb24tPnNlc3Npb25JRCgpOwotCi0gICAgZ290byBiYWlsOwotCi1iYWlsMjoKLSAgICBjbG9zZShzKTsKLSAgICBzID0gLTE7Ci0KLWJhaWw6Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpjb25uZWN0VURQU2Vzc2lvbigKLSAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsIHVuc2lnbmVkIHJlbW90ZVBvcnQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgc3NpemVfdCBpbmRleCA9IG1TZXNzaW9ucy5pbmRleE9mS2V5KHNlc3Npb25JRCk7Ci0KLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiAtRU5PRU5UOwotICAgIH0KLQotICAgIGNvbnN0IHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbnMudmFsdWVBdChpbmRleCk7Ci0gICAgaW50IHMgPSBzZXNzaW9uLT5zb2NrZXQoKTsKLQotICAgIHN0cnVjdCBzb2NrYWRkcl9pbiByZW1vdGVBZGRyOwotICAgIG1lbXNldChyZW1vdGVBZGRyLnNpbl96ZXJvLCAwLCBzaXplb2YocmVtb3RlQWRkci5zaW5femVybykpOwotICAgIHJlbW90ZUFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgcmVtb3RlQWRkci5zaW5fcG9ydCA9IGh0b25zKHJlbW90ZVBvcnQpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgc3RydWN0IGhvc3RlbnQgKmVudCA9IGdldGhvc3RieW5hbWUocmVtb3RlSG9zdCk7Ci0gICAgaWYgKGVudCA9PSBOVUxMKSB7Ci0gICAgICAgIGVyciA9IC1oX2Vycm5vOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlbW90ZUFkZHIuc2luX2FkZHIuc19hZGRyID0gKihpbl9hZGRyX3QgKillbnQtPmhfYWRkcjsKLQotICAgICAgICBpbnQgcmVzID0gY29ubmVjdCgKLSAgICAgICAgICAgICAgICBzLAotICAgICAgICAgICAgICAgIChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikmcmVtb3RlQWRkciwKLSAgICAgICAgICAgICAgICBzaXplb2YocmVtb3RlQWRkcikpOwotCi0gICAgICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OnNlbmRSZXF1ZXN0KAotICAgICAgICBpbnQzMl90IHNlc3Npb25JRCwgY29uc3Qgdm9pZCAqZGF0YSwgc3NpemVfdCBzaXplLAotICAgICAgICBib29sIHRpbWVWYWxpZCwgaW50NjRfdCB0aW1lVXMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgc3NpemVfdCBpbmRleCA9IG1TZXNzaW9ucy5pbmRleE9mS2V5KHNlc3Npb25JRCk7Ci0KLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiAtRU5PRU5UOwotICAgIH0KLQotICAgIGNvbnN0IHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbnMudmFsdWVBdChpbmRleCk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBzZXNzaW9uLT5zZW5kUmVxdWVzdChkYXRhLCBzaXplLCB0aW1lVmFsaWQsIHRpbWVVcyk7Ci0KLSAgICBpbnRlcnJ1cHQoKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6c3dpdGNoVG9XZWJTb2NrZXRNb2RlKGludDMyX3Qgc2Vzc2lvbklEKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtU2Vzc2lvbnMuaW5kZXhPZktleShzZXNzaW9uSUQpOwotCi0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICB9Ci0KLSAgICBjb25zdCBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25zLnZhbHVlQXQoaW5kZXgpOwotICAgIHJldHVybiBzZXNzaW9uLT5zd2l0Y2hUb1dlYlNvY2tldE1vZGUoKTsKLX0KLQotdm9pZCBBTmV0d29ya1Nlc3Npb246OmludGVycnVwdCgpIHsKLSAgICBzdGF0aWMgY29uc3QgY2hhciBkdW1teSA9IDA7Ci0KLSAgICBzc2l6ZV90IG47Ci0gICAgZG8gewotICAgICAgICBuID0gd3JpdGUobVBpcGVGZFsxXSwgJmR1bW15LCAxKTsKLSAgICB9IHdoaWxlIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0KLSAgICBpZiAobiA8IDApIHsKLSAgICAgICAgQUxPR1coIkVycm9yIHdyaXRpbmcgdG8gcGlwZSAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICB9Ci19Ci0KLXZvaWQgQU5ldHdvcmtTZXNzaW9uOjp0aHJlYWRMb29wKCkgewotICAgIGZkX3NldCBycywgd3M7Ci0gICAgRkRfWkVSTygmcnMpOwotICAgIEZEX1pFUk8oJndzKTsKLQotICAgIEZEX1NFVChtUGlwZUZkWzBdLCAmcnMpOwotICAgIGludCBtYXhGZCA9IG1QaXBlRmRbMF07Ci0KLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2Vzc2lvbnMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGNvbnN0IHNwPFNlc3Npb24+ICZzZXNzaW9uID0gbVNlc3Npb25zLnZhbHVlQXQoaSk7Ci0KLSAgICAgICAgICAgIGludCBzID0gc2Vzc2lvbi0+c29ja2V0KCk7Ci0KLSAgICAgICAgICAgIGlmIChzIDwgMCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc2Vzc2lvbi0+d2FudHNUb1JlYWQoKSkgewotICAgICAgICAgICAgICAgIEZEX1NFVChzLCAmcnMpOwotICAgICAgICAgICAgICAgIGlmIChzID4gbWF4RmQpIHsKLSAgICAgICAgICAgICAgICAgICAgbWF4RmQgPSBzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHNlc3Npb24tPndhbnRzVG9Xcml0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgRkRfU0VUKHMsICZ3cyk7Ci0gICAgICAgICAgICAgICAgaWYgKHMgPiBtYXhGZCkgewotICAgICAgICAgICAgICAgICAgICBtYXhGZCA9IHM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50IHJlcyA9IHNlbGVjdChtYXhGZCArIDEsICZycywgJndzLCBOVUxMLCBOVUxMIC8qIHR2ICovKTsKLQotICAgIGlmIChyZXMgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBBTE9HRSgic2VsZWN0IGZhaWxlZCB3LyBlcnJvciAlZCAoJXMpIiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoRkRfSVNTRVQobVBpcGVGZFswXSwgJnJzKSkgewotICAgICAgICBjaGFyIGM7Ci0gICAgICAgIHNzaXplX3QgbjsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgbiA9IHJlYWQobVBpcGVGZFswXSwgJmMsIDEpOwotICAgICAgICB9IHdoaWxlIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0KLSAgICAgICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiRXJyb3IgcmVhZGluZyBmcm9tIHBpcGUgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAtLXJlczsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAgICAgTGlzdDxzcDxTZXNzaW9uPiA+IHNlc3Npb25zVG9BZGQ7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IG1TZXNzaW9ucy5zaXplKCk7IHJlcyA+IDAgJiYgaSA+IDA7KSB7Ci0gICAgICAgICAgICBpLS07Ci0gICAgICAgICAgICBjb25zdCBzcDxTZXNzaW9uPiAmc2Vzc2lvbiA9IG1TZXNzaW9ucy52YWx1ZUF0KGkpOwotCi0gICAgICAgICAgICBpbnQgcyA9IHNlc3Npb24tPnNvY2tldCgpOwotCi0gICAgICAgICAgICBpZiAocyA8IDApIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKEZEX0lTU0VUKHMsICZycykgfHwgRkRfSVNTRVQocywgJndzKSkgewotICAgICAgICAgICAgICAgIC0tcmVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoRkRfSVNTRVQocywgJnJzKSkgewotICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uLT5pc1JUU1BTZXJ2ZXIoKSB8fCBzZXNzaW9uLT5pc1RDUERhdGFncmFtU2VydmVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luIHJlbW90ZUFkZHI7Ci0gICAgICAgICAgICAgICAgICAgIHNvY2tsZW5fdCByZW1vdGVBZGRyTGVuID0gc2l6ZW9mKHJlbW90ZUFkZHIpOwotCi0gICAgICAgICAgICAgICAgICAgIGludCBjbGllbnRTb2NrZXQgPSBhY2NlcHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcywgKHN0cnVjdCBzb2NrYWRkciAqKSZyZW1vdGVBZGRyLCAmcmVtb3RlQWRkckxlbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWVudFNvY2tldCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBNYWtlU29ja2V0Tm9uQmxvY2tpbmcoY2xpZW50U29ja2V0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gbWFrZSBjbGllbnQgc29ja2V0IG5vbiBibG9ja2luZywgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdy8gZXJyb3IgJWQgKCVzKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLCBzdHJlcnJvcigtZXJyKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZShjbGllbnRTb2NrZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFNvY2tldCA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9hZGRyX3QgYWRkciA9IG50b2hsKHJlbW90ZUFkZHIuc2luX2FkZHIuc19hZGRyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJpbmNvbWluZyBjb25uZWN0aW9uIGZyb20gJWQuJWQuJWQuJWQ6JWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoc29ja2V0ICVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFkZHIgPj4gMjQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGRyID4+IDE2KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFkZHIgPj4gOCkgJiAweGZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIgJiAweGZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50b2hzKHJlbW90ZUFkZHIuc2luX3BvcnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFNvY2tldCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxTZXNzaW9uPiBjbGllbnRTZXNzaW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNlc3Npb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5leHRTZXNzaW9uSUQrKywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uOjpDT05ORUNURUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50U29ja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPmdldE5vdGlmaWNhdGlvbk1lc3NhZ2UoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRTZXNzaW9uLT5zZXRNb2RlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+aXNSVFNQU2VydmVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFNlc3Npb246Ok1PREVfUlRTUAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU2Vzc2lvbjo6TU9ERV9EQVRBR1JBTSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uc1RvQWRkLnB1c2hfYmFjayhjbGllbnRTZXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJhY2NlcHQgcmV0dXJuZWQgZXJyb3IgJWQgKCVzKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHNlc3Npb24tPnJlYWRNb3JlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJyZWFkTW9yZSBvbiBzb2NrZXQgJWQgZmFpbGVkIHcvIGVycm9yICVkICglcykiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcywgZXJyLCBzdHJlcnJvcigtZXJyKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChGRF9JU1NFVChzLCAmd3MpKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gc2Vzc2lvbi0+d3JpdGVNb3JlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgid3JpdGVNb3JlIG9uIHNvY2tldCAlZCBmYWlsZWQgdy8gZXJyb3IgJWQgKCVzKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHMsIGVyciwgc3RyZXJyb3IoLWVycikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlICghc2Vzc2lvbnNUb0FkZC5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gKnNlc3Npb25zVG9BZGQuYmVnaW4oKTsKLSAgICAgICAgICAgIHNlc3Npb25zVG9BZGQuZXJhc2Uoc2Vzc2lvbnNUb0FkZC5iZWdpbigpKTsKLQotICAgICAgICAgICAgbVNlc3Npb25zLmFkZChzZXNzaW9uLT5zZXNzaW9uSUQoKSwgc2Vzc2lvbik7Ci0KLSAgICAgICAgICAgIEFMT0dJKCJhZGRlZCBjbGllbnRTZXNzaW9uICVkIiwgc2Vzc2lvbi0+c2Vzc2lvbklEKCkpOwotICAgICAgICB9Ci0gICAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwCmluZGV4IDI5Y2YxZWQuLmRjZjFhYjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKQEAgLTU2LDE4ICs1NiwxNiBAQAogICAgICAgICAiQUJ1ZmZlci5jcHAiLAogICAgICAgICAiQURlYnVnLmNwcCIsCiAgICAgICAgICJBSGFuZGxlci5jcHAiLAotICAgICAgICAiQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAiLAogICAgICAgICAiQUxvb3Blci5jcHAiLAogICAgICAgICAiQUxvb3BlclJvc3Rlci5jcHAiLAogICAgICAgICAiQU1lc3NhZ2UuY3BwIiwKLSAgICAgICAgIkFOZXR3b3JrU2Vzc2lvbi5jcHAiLAogICAgICAgICAiQVN0cmluZy5jcHAiLAogICAgICAgICAiQVN0cmluZ1V0aWxzLmNwcCIsCisgICAgICAgICJBdWRpb1ByZXNlbnRhdGlvbkluZm8uY3BwIiwKICAgICAgICAgIkJ5dGVVdGlscy5jcHAiLAogICAgICAgICAiQ29sb3JVdGlscy5jcHAiLAogICAgICAgICAiTWVkaWFEZWZzLmNwcCIsCiAgICAgICAgICJNZWRpYUtleXMuY3BwIiwKLSAgICAgICAgIlBhcnNlZE1lc3NhZ2UuY3BwIiwKICAgICAgICAgImF2Y191dGlscy5jcHAiLAogICAgICAgICAiYmFzZTY0LmNwcCIsCiAgICAgICAgICJoZXhkdW1wLmNwcCIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI4ZTk2OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQXVkaW9QcmVzZW50YXRpb25JbmZvLmNwcApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvUHJlc2VudGF0aW9uSW5mbyIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgIkF1ZGlvUHJlc2VudGF0aW9uSW5mby5oIgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordm9pZCBzZXJpYWxpemVBdWRpb1ByZXNlbnRhdGlvbnMoY29uc3QgQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uJiBwcmVzZW50YXRpb25zLAorICAgICAgICBzdGQ6Om9zdHJlYW0qIHNlcmlhbGl6ZWRPdXRwdXQpIHsKKyAgICB1aW50MzJfdCBudW1QcmVzZW50YXRpb25zID0gcHJlc2VudGF0aW9ucy5zaXplKCk7CisgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJm51bVByZXNlbnRhdGlvbnMpLCBzaXplb2YobnVtUHJlc2VudGF0aW9ucykpOworICAgIGZvciAoY29uc3QgYXV0byYgYXAgOiBwcmVzZW50YXRpb25zKSB7CisgICAgICAgIGlmIChhcC5tVmVyc2lvbiA9PSBQUkVTRU5UQVRJT05fVkVSU0lPTl8xKSB7CisgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmFwLm1WZXJzaW9uKSksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcC5tVmVyc2lvbikpOworICAgICAgICAgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZhcC5tUHJlc2VudGF0aW9uSWQpKSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwLm1QcmVzZW50YXRpb25JZCkpOworICAgICAgICAgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZhcC5tUHJvZ3JhbUlkKSksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcC5tUHJvZ3JhbUlkKSk7CisKKyAgICAgICAgICAgIHVpbnQzMl90IG51bUxhYmVscyA9IGFwLm1MYWJlbHMuc2l6ZSgpOworICAgICAgICAgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZudW1MYWJlbHMpKSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG51bUxhYmVscykpOworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBsYWJlbCA6IGFwLm1MYWJlbHMpIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBsYWJlbEtleVNpemUgPSBsYWJlbC5maXJzdC5zaXplKCk7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUoCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIqPihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmbGFiZWxLZXlTaXplKSksCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobGFiZWxLZXlTaXplKSk7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUobGFiZWwuZmlyc3QuY19zdHIoKSwgbGFiZWxLZXlTaXplKTsKKworICAgICAgICAgICAgICAgIHVpbnQzMl90IGxhYmVsVmFsU2l6ZSA9IGxhYmVsLnNlY29uZC5zaXplKCk7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUoCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIqPihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmbGFiZWxWYWxTaXplKSksCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobGFiZWxWYWxTaXplKSk7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUobGFiZWwuc2Vjb25kLmNfc3RyKCksIGxhYmVsVmFsU2l6ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQzMl90IGxhbmdTaXplID0gYXAubUxhbmd1YWdlLnNpemUoKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIqPihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmbGFuZ1NpemUpKSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGxhbmdTaXplKSk7CisgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZShhcC5tTGFuZ3VhZ2UuY19zdHIoKSwgbGFuZ1NpemUpOworCisgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmFwLm1NYXN0ZXJpbmdJbmRpY2F0aW9uKSksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcC5tTWFzdGVyaW5nSW5kaWNhdGlvbikpOworICAgICAgICAgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZhcC5tQXVkaW9EZXNjcmlwdGlvbkF2YWlsYWJsZSkpLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXAubUF1ZGlvRGVzY3JpcHRpb25BdmFpbGFibGUpKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIqPihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmYXAubVNwb2tlblN1YnRpdGxlc0F2YWlsYWJsZSkpLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXAubVNwb2tlblN1YnRpdGxlc0F2YWlsYWJsZSkpOworICAgICAgICAgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZhcC5tRGlhbG9ndWVFbmhhbmNlbWVudEF2YWlsYWJsZSkpLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXAubURpYWxvZ3VlRW5oYW5jZW1lbnRBdmFpbGFibGUpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdHVzX3QgZGVzZXJpYWxpemVBdWRpb1ByZXNlbnRhdGlvbnMoc3RkOjppc3RyZWFtKiBzZXJpYWxpemVkSW5wdXQsCisgICAgICAgIEF1ZGlvUHJlc2VudGF0aW9uQ29sbGVjdGlvbiAqcHJlc2VudGF0aW9ucykgeworICAgIHVpbnQzMl90IG51bVByZXNlbnRhdGlvbnM7CisgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZudW1QcmVzZW50YXRpb25zKSwgc2l6ZW9mKG51bVByZXNlbnRhdGlvbnMpKTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtUHJlc2VudGF0aW9uczsgKytpKSB7CisgICAgICAgIHVpbnQzMl90IHZlcnNpb247CisgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmdmVyc2lvbiksIHNpemVvZih2ZXJzaW9uKSk7CisgICAgICAgIGlmICh2ZXJzaW9uID09IFBSRVNFTlRBVElPTl9WRVJTSU9OXzEpIHsKKyAgICAgICAgICAgIEF1ZGlvUHJlc2VudGF0aW9uVjEgYXA7CisgICAgICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQoCisgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZhcC5tUHJlc2VudGF0aW9uSWQpLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXAubVByZXNlbnRhdGlvbklkKSk7CisgICAgICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmFwLm1Qcm9ncmFtSWQpLCBzaXplb2YoYXAubVByb2dyYW1JZCkpOworCisgICAgICAgICAgICB1aW50MzJfdCBudW1MYWJlbHM7CisgICAgICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJm51bUxhYmVscyksIHNpemVvZihudW1MYWJlbHMpKTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBudW1MYWJlbHM7ICsraikgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGxhYmVsS2V5U2l6ZTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmxhYmVsS2V5U2l6ZSksIHNpemVvZihsYWJlbEtleVNpemUpKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxjaGFyPiBsYWJlbEtleShsYWJlbEtleVNpemUpOworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChsYWJlbEtleS5kYXRhKCksIGxhYmVsS2V5U2l6ZSk7CisKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBsYWJlbFZhbFNpemU7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZsYWJlbFZhbFNpemUpLCBzaXplb2YobGFiZWxWYWxTaXplKSk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y2hhcj4gbGFiZWxWYWwobGFiZWxWYWxTaXplKTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQobGFiZWxWYWwuZGF0YSgpLCBsYWJlbFZhbFNpemUpOworICAgICAgICAgICAgICAgIGFwLm1MYWJlbHMuZW1wbGFjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGxhYmVsS2V5LmRhdGEoKSksIGxhYmVsS2V5U2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNoYXIqPihsYWJlbFZhbC5kYXRhKCkpLCBsYWJlbFZhbFNpemUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVpbnQzMl90IGxhbmd1YWdlU2l6ZTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmbGFuZ3VhZ2VTaXplKSwgc2l6ZW9mKGxhbmd1YWdlU2l6ZSkpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y2hhcj4gbGFuZ3VhZ2UobGFuZ3VhZ2VTaXplKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChsYW5ndWFnZS5kYXRhKCksIGxhbmd1YWdlU2l6ZSk7CisgICAgICAgICAgICBhcC5tTGFuZ3VhZ2UgPSBzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNoYXIqPihsYW5ndWFnZS5kYXRhKCkpLCBsYW5ndWFnZVNpemUpOworICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZhcC5tTWFzdGVyaW5nSW5kaWNhdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXAubU1hc3RlcmluZ0luZGljYXRpb24pKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmYXAubUF1ZGlvRGVzY3JpcHRpb25BdmFpbGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwLm1BdWRpb0Rlc2NyaXB0aW9uQXZhaWxhYmxlKSk7CisgICAgICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmFwLm1TcG9rZW5TdWJ0aXRsZXNBdmFpbGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwLm1TcG9rZW5TdWJ0aXRsZXNBdmFpbGFibGUpKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmYXAubURpYWxvZ3VlRW5oYW5jZW1lbnRBdmFpbGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwLm1EaWFsb2d1ZUVuaGFuY2VtZW50QXZhaWxhYmxlKSk7CisgICAgICAgICAgICBwcmVzZW50YXRpb25zLT5wdXNoX2JhY2soc3RkOjptb3ZlKGFwKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiQXVkaW8gcHJlc2VudGF0aW9uIGluZm8gdmVyc2lvbiBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5jcHAKaW5kZXggYzRlYWEyNy4uMDcwZTMyNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29rdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zNDIsNiArMzQzLDE0IEBACiAgICAgYXNwZWN0cy5tUmFuZ2UgPSBmdWxsUmFuZ2UgPyBDb2xvckFzcGVjdHM6OlJhbmdlRnVsbCA6IENvbG9yQXNwZWN0czo6UmFuZ2VMaW1pdGVkOwogfQogCit2b2lkIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb1BsYXRmb3JtQXNwZWN0cygKKyAgICAgICAgaW50MzJfdCBwcmltYXJpZXMsIGludDMyX3QgaW50cmFuc2ZlciwgaW50MzJfdCBjb2VmZnMsIGJvb2wgZnVsbFJhbmdlLAorICAgICAgICBpbnQzMl90ICpyYW5nZSwgaW50MzJfdCAqc3RhbmRhcmQsIGludDMyX3QgKm91dHRyYW5zZmVyKSB7CisgICAgQ29sb3JBc3BlY3RzIGFzcGVjdHM7CisgICAgY29udmVydElzb0NvbG9yQXNwZWN0c1RvQ29kZWNBc3BlY3RzKHByaW1hcmllcywgaW50cmFuc2ZlciwgY29lZmZzLCBmdWxsUmFuZ2UsIGFzcGVjdHMpOworICAgIGNvbnZlcnRDb2RlY0NvbG9yQXNwZWN0c1RvUGxhdGZvcm1Bc3BlY3RzKGFzcGVjdHMsIHJhbmdlLCBzdGFuZGFyZCwgb3V0dHJhbnNmZXIpOworfQorCiAvLyBzdGF0aWMKIENvbG9yQXNwZWN0cyBDb2xvclV0aWxzOjp1bnBhY2tUb0NvbG9yQXNwZWN0cyh1aW50MzJfdCBwYWNrZWQpIHsKICAgICBDb2xvckFzcGVjdHMgYXNwZWN0czsKQEAgLTY4NCw2ICs2OTMsMTMgQEAKICAgICAgICAgICAgIHRyYW5zZmVyLCBhc1N0cmluZygoQ29sb3JUcmFuc2Zlcil0cmFuc2ZlcikpOwogfQogCisKKy8vIHN0YXRpYwordm9pZCBDb2xvclV0aWxzOjpzZXRIRFJTdGF0aWNJbmZvSW50b0FNZWRpYUZvcm1hdCgKKyAgICAgICAgY29uc3QgSERSU3RhdGljSW5mbyAmaW5mbywgQU1lZGlhRm9ybWF0ICpmb3JtYXQpIHsKKyAgICBzZXRIRFJTdGF0aWNJbmZvSW50b0Zvcm1hdChpbmZvLCBmb3JtYXQtPm1Gb3JtYXQpOworfQorCiAvLyBzdGF0aWMKIHZvaWQgQ29sb3JVdGlsczo6c2V0SERSU3RhdGljSW5mb0ludG9Gb3JtYXQoCiAgICAgICAgIGNvbnN0IEhEUlN0YXRpY0luZm8gJmluZm8sIHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5jcHAKaW5kZXggZTVhODVlOS4uOWQxZWMxZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmNwcApAQCAtMjMsNiArMjMsNyBAQAogCiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19WUDggPSAidmlkZW8veC12bmQub24yLnZwOCI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19WUDkgPSAidmlkZW8veC12bmQub24yLnZwOSI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19BVjEgPSAidmlkZW8vYXYwMSI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19BVkMgPSAidmlkZW8vYXZjIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMgPSAidmlkZW8vaGV2YyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCA9ICJ2aWRlby9tcDR2LWVzIjsKQEAgLTUwLDEyICs1MSwxNCBAQAogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVNHU00gPSAiYXVkaW8vZ3NtIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FDMyA9ICJhdWRpby9hYzMiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMyA9ICJhdWRpby9lYWMzIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0VBQzNfSk9DID0gImF1ZGlvL2VhYzMtam9jIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FDNCA9ICJhdWRpby9hYzQiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fU0NSQU1CTEVEID0gImF1ZGlvL3NjcmFtYmxlZCI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BTEFDID0gImF1ZGlvL2FsYWMiOwogCiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzQgPSAidmlkZW8vbXA0IjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9XQVYgPSAiYXVkaW8veC13YXYiOwotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX09HRyA9ICJhcHBsaWNhdGlvbi9vZ2ciOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX09HRyA9ICJhdWRpby9vZ2ciOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01BVFJPU0tBID0gInZpZGVvL3gtbWF0cm9za2EiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyVFMgPSAidmlkZW8vbXAydHMiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX0FWSSA9ICJ2aWRlby9hdmkiOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9QYXJzZWRNZXNzYWdlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vUGFyc2VkTWVzc2FnZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OWM5YWQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9QYXJzZWRNZXNzYWdlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiUGFyc2VkTWVzc2FnZS5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIHN0YXRpYwotc3A8UGFyc2VkTWVzc2FnZT4gUGFyc2VkTWVzc2FnZTo6UGFyc2UoCi0gICAgICAgIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBzaXplLCBib29sIG5vTW9yZURhdGEsIHNpemVfdCAqbGVuZ3RoKSB7Ci0gICAgc3A8UGFyc2VkTWVzc2FnZT4gbXNnID0gbmV3IFBhcnNlZE1lc3NhZ2U7Ci0gICAgc3NpemVfdCByZXMgPSBtc2ctPnBhcnNlKGRhdGEsIHNpemUsIG5vTW9yZURhdGEpOwotCi0gICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgKmxlbmd0aCA9IDA7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgICpsZW5ndGggPSByZXM7Ci0gICAgcmV0dXJuIG1zZzsKLX0KLQotUGFyc2VkTWVzc2FnZTo6UGFyc2VkTWVzc2FnZSgpIHsKLX0KLQotUGFyc2VkTWVzc2FnZTo6flBhcnNlZE1lc3NhZ2UoKSB7Ci19Ci0KLWJvb2wgUGFyc2VkTWVzc2FnZTo6ZmluZFN0cmluZyhjb25zdCBjaGFyICpuYW1lLCBBU3RyaW5nICp2YWx1ZSkgY29uc3QgewotICAgIEFTdHJpbmcga2V5ID0gbmFtZTsKLSAgICBrZXkudG9sb3dlcigpOwotCi0gICAgc3NpemVfdCBpbmRleCA9IG1EaWN0LmluZGV4T2ZLZXkoa2V5KTsKLQotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgdmFsdWUtPmNsZWFyKCk7Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgICp2YWx1ZSA9IG1EaWN0LnZhbHVlQXQoaW5kZXgpOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFBhcnNlZE1lc3NhZ2U6OmZpbmRJbnQzMihjb25zdCBjaGFyICpuYW1lLCBpbnQzMl90ICp2YWx1ZSkgY29uc3QgewotICAgIEFTdHJpbmcgc3RyaW5nVmFsdWU7Ci0KLSAgICBpZiAoIWZpbmRTdHJpbmcobmFtZSwgJnN0cmluZ1ZhbHVlKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY2hhciAqZW5kOwotICAgICp2YWx1ZSA9IHN0cnRvbChzdHJpbmdWYWx1ZS5jX3N0cigpLCAmZW5kLCAxMCk7Ci0KLSAgICBpZiAoZW5kID09IHN0cmluZ1ZhbHVlLmNfc3RyKCkgfHwgKmVuZCAhPSAnXDAnKSB7Ci0gICAgICAgICp2YWx1ZSA9IDA7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotY29uc3QgY2hhciAqUGFyc2VkTWVzc2FnZTo6Z2V0Q29udGVudCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUNvbnRlbnQuY19zdHIoKTsKLX0KLQotc3NpemVfdCBQYXJzZWRNZXNzYWdlOjpwYXJzZShjb25zdCBjaGFyICpkYXRhLCBzaXplX3Qgc2l6ZSwgYm9vbCBub01vcmVEYXRhKSB7Ci0gICAgaWYgKHNpemUgPT0gMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgc3NpemVfdCBsYXN0RGljdEluZGV4ID0gLTE7Ci0KLSAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKLSAgICBib29sIGhlYWRlcnNDb21wbGV0ZSA9IGZhbHNlOwotICAgIHdoaWxlIChvZmZzZXQgPCBzaXplKSB7Ci0gICAgICAgIHNpemVfdCBsaW5lRW5kT2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgICB3aGlsZSAobGluZUVuZE9mZnNldCArIDEgPCBzaXplCi0gICAgICAgICAgICAgICAgJiYgKGRhdGFbbGluZUVuZE9mZnNldF0gIT0gJ1xyJwotICAgICAgICAgICAgICAgICAgICAgICAgfHwgZGF0YVtsaW5lRW5kT2Zmc2V0ICsgMV0gIT0gJ1xuJykpIHsKLSAgICAgICAgICAgICsrbGluZUVuZE9mZnNldDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsaW5lRW5kT2Zmc2V0ICsgMSA+PSBzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBBU3RyaW5nIGxpbmUoJmRhdGFbb2Zmc2V0XSwgbGluZUVuZE9mZnNldCAtIG9mZnNldCk7Ci0KLSAgICAgICAgaWYgKG9mZnNldCA9PSAwKSB7Ci0gICAgICAgICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciB0aGUgcmVxdWVzdC9zdGF0dXMgbGluZS4KLQotICAgICAgICAgICAgbURpY3QuYWRkKEFTdHJpbmcoIl8iKSwgbGluZSk7Ci0gICAgICAgICAgICBvZmZzZXQgPSBsaW5lRW5kT2Zmc2V0ICsgMjsKLQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGluZUVuZE9mZnNldCA9PSBvZmZzZXQpIHsKLSAgICAgICAgICAgIC8vIEFuIGVtcHR5IGxpbmUgc2VwYXJhdGVzIGhlYWRlcnMgZnJvbSBib2R5LgotICAgICAgICAgICAgaGVhZGVyc0NvbXBsZXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIG9mZnNldCArPSAyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGluZS5jX3N0cigpWzBdID09ICcgJyB8fCBsaW5lLmNfc3RyKClbMF0gPT0gJ1x0JykgewotICAgICAgICAgICAgLy8gU3VwcG9ydCBmb3IgZm9sZGVkIGhlYWRlciB2YWx1ZXMuCi0KLSAgICAgICAgICAgIGlmIChsYXN0RGljdEluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgaXQncyBtYWxmb3JtZWQgc2luY2UgdGhlIGZpcnN0IGhlYWRlciBsaW5lCi0gICAgICAgICAgICAgICAgLy8gY2Fubm90IGNvbnRpbnVlIGFueXRoaW5nLi4uCi0KLSAgICAgICAgICAgICAgICBBU3RyaW5nICZ2YWx1ZSA9IG1EaWN0LmVkaXRWYWx1ZUF0KGxhc3REaWN0SW5kZXgpOwotICAgICAgICAgICAgICAgIHZhbHVlLmFwcGVuZChsaW5lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb2Zmc2V0ID0gbGluZUVuZE9mZnNldCArIDI7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHNzaXplX3QgY29sb25Qb3MgPSBsaW5lLmZpbmQoIjoiKTsKLSAgICAgICAgaWYgKGNvbG9uUG9zID49IDApIHsKLSAgICAgICAgICAgIEFTdHJpbmcga2V5KGxpbmUsIDAsIGNvbG9uUG9zKTsKLSAgICAgICAgICAgIGtleS50cmltKCk7Ci0gICAgICAgICAgICBrZXkudG9sb3dlcigpOwotCi0gICAgICAgICAgICBsaW5lLmVyYXNlKDAsIGNvbG9uUG9zICsgMSk7Ci0KLSAgICAgICAgICAgIGxhc3REaWN0SW5kZXggPSBtRGljdC5hZGQoa2V5LCBsaW5lKTsKLSAgICAgICAgfQotCi0gICAgICAgIG9mZnNldCA9IGxpbmVFbmRPZmZzZXQgKyAyOwotICAgIH0KLQotICAgIGlmICghaGVhZGVyc0NvbXBsZXRlICYmICghbm9Nb3JlRGF0YSB8fCBvZmZzZXQgPT0gMCkpIHsKLSAgICAgICAgLy8gV2UgZWl0aGVyIHNhdyB0aGUgZW1wdHkgbGluZSBzZXBhcmF0aW5nIGhlYWRlcnMgZnJvbSBib2R5Ci0gICAgICAgIC8vIG9yIHdlIHNhdyBhdCBsZWFzdCB0aGUgc3RhdHVzIGxpbmUgYW5kIGtub3cgdGhhdCBubyBtb3JlIGRhdGEKLSAgICAgICAgLy8gaXMgZ29pbmcgdG8gZm9sbG93LgotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRGljdC5zaXplKCk7ICsraSkgewotICAgICAgICBtRGljdC5lZGl0VmFsdWVBdChpKS50cmltKCk7Ci0gICAgfQotCi0gICAgaW50MzJfdCBjb250ZW50TGVuZ3RoOwotICAgIGlmICghZmluZEludDMyKCJjb250ZW50LWxlbmd0aCIsICZjb250ZW50TGVuZ3RoKSB8fCBjb250ZW50TGVuZ3RoIDwgMCkgewotICAgICAgICBjb250ZW50TGVuZ3RoID0gMDsKLSAgICB9Ci0KLSAgICBzaXplX3QgdG90YWxMZW5ndGggPSBvZmZzZXQgKyBjb250ZW50TGVuZ3RoOwotCi0gICAgaWYgKHNpemUgPCB0b3RhbExlbmd0aCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgbUNvbnRlbnQuc2V0VG8oJmRhdGFbb2Zmc2V0XSwgY29udGVudExlbmd0aCk7Ci0KLSAgICByZXR1cm4gdG90YWxMZW5ndGg7Ci19Ci0KLWJvb2wgUGFyc2VkTWVzc2FnZTo6Z2V0UmVxdWVzdEZpZWxkKHNpemVfdCBpbmRleCwgQVN0cmluZyAqZmllbGQpIGNvbnN0IHsKLSAgICBBU3RyaW5nIGxpbmU7Ci0gICAgQ0hFQ0soZmluZFN0cmluZygiXyIsICZsaW5lKSk7Ci0KLSAgICBzaXplX3QgcHJldk9mZnNldCA9IDA7Ci0gICAgc2l6ZV90IG9mZnNldCA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPD0gaW5kZXg7ICsraSkgewotICAgICAgICBpZiAob2Zmc2V0ID49IGxpbmUuc2l6ZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBzc2l6ZV90IHNwYWNlUG9zID0gbGluZS5maW5kKCIgIiwgb2Zmc2V0KTsKLQotICAgICAgICBpZiAoc3BhY2VQb3MgPCAwKSB7Ci0gICAgICAgICAgICBzcGFjZVBvcyA9IGxpbmUuc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJldk9mZnNldCA9IG9mZnNldDsKLSAgICAgICAgb2Zmc2V0ID0gc3BhY2VQb3MgKyAxOwotICAgIH0KLQotICAgIGZpZWxkLT5zZXRUbyhsaW5lLCBwcmV2T2Zmc2V0LCBvZmZzZXQgLSBwcmV2T2Zmc2V0IC0gMSk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBQYXJzZWRNZXNzYWdlOjpnZXRTdGF0dXNDb2RlKGludDMyX3QgKnN0YXR1c0NvZGUpIGNvbnN0IHsKLSAgICBBU3RyaW5nIHN0YXR1c0NvZGVTdHJpbmc7Ci0gICAgaWYgKCFnZXRSZXF1ZXN0RmllbGQoMSwgJnN0YXR1c0NvZGVTdHJpbmcpKSB7Ci0gICAgICAgICpzdGF0dXNDb2RlID0gMDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGNoYXIgKmVuZDsKLSAgICAqc3RhdHVzQ29kZSA9IHN0cnRvbChzdGF0dXNDb2RlU3RyaW5nLmNfc3RyKCksICZlbmQsIDEwKTsKLQotICAgIGlmICgqZW5kICE9ICdcMCcgfHwgZW5kID09IHN0YXR1c0NvZGVTdHJpbmcuY19zdHIoKQotICAgICAgICAgICAgfHwgKCpzdGF0dXNDb2RlKSA8IDEwMCB8fCAoKnN0YXR1c0NvZGUpID4gOTk5KSB7Ci0gICAgICAgICpzdGF0dXNDb2RlID0gMDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1BU3RyaW5nIFBhcnNlZE1lc3NhZ2U6OmRlYnVnU3RyaW5nKCkgY29uc3QgewotICAgIEFTdHJpbmcgbGluZTsKLSAgICBDSEVDSyhmaW5kU3RyaW5nKCJfIiwgJmxpbmUpKTsKLQotICAgIGxpbmUuYXBwZW5kKCJcbiIpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRGljdC5zaXplKCk7ICsraSkgewotICAgICAgICBjb25zdCBBU3RyaW5nICZrZXkgPSBtRGljdC5rZXlBdChpKTsKLSAgICAgICAgY29uc3QgQVN0cmluZyAmdmFsdWUgPSBtRGljdC52YWx1ZUF0KGkpOwotCi0gICAgICAgIGlmIChrZXkgPT0gQVN0cmluZygiXyIpKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGxpbmUuYXBwZW5kKGtleSk7Ci0gICAgICAgIGxpbmUuYXBwZW5kKCI6ICIpOwotICAgICAgICBsaW5lLmFwcGVuZCh2YWx1ZSk7Ci0gICAgICAgIGxpbmUuYXBwZW5kKCJcbiIpOwotICAgIH0KLQotICAgIGxpbmUuYXBwZW5kKCJcbiIpOwotICAgIGxpbmUuYXBwZW5kKG1Db250ZW50KTsKLQotICAgIHJldHVybiBsaW5lOwotfQotCi0vLyBzdGF0aWMKLWJvb2wgUGFyc2VkTWVzc2FnZTo6R2V0QXR0cmlidXRlKAotICAgICAgICBjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICprZXksIEFTdHJpbmcgKnZhbHVlKSB7Ci0gICAgdmFsdWUtPmNsZWFyKCk7Ci0KLSAgICBzaXplX3Qga2V5TGVuID0gc3RybGVuKGtleSk7Ci0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIHdoaWxlIChpc3NwYWNlKCpzKSkgewotICAgICAgICAgICAgKytzOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgY2hhciAqY29sb25Qb3MgPSBzdHJjaHIocywgJzsnKTsKLQotICAgICAgICBzaXplX3QgbGVuID0KLSAgICAgICAgICAgIChjb2xvblBvcyA9PSBOVUxMKSA/IHN0cmxlbihzKSA6IGNvbG9uUG9zIC0gczsKLQotICAgICAgICBpZiAobGVuID49IGtleUxlbiArIDEgJiYgc1trZXlMZW5dID09ICc9JyAmJiAhc3RybmNtcChzLCBrZXksIGtleUxlbikpIHsKLSAgICAgICAgICAgIHZhbHVlLT5zZXRUbygmc1trZXlMZW4gKyAxXSwgbGVuIC0ga2V5TGVuIC0gMSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb2xvblBvcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBzID0gY29sb25Qb3MgKyAxOwotICAgIH0KLX0KLQotLy8gc3RhdGljCi1ib29sIFBhcnNlZE1lc3NhZ2U6OkdldEludDMyQXR0cmlidXRlKAotICAgICAgICBjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICprZXksIGludDMyX3QgKnZhbHVlKSB7Ci0gICAgQVN0cmluZyBzdHJpbmdWYWx1ZTsKLSAgICBpZiAoIUdldEF0dHJpYnV0ZShzLCBrZXksICZzdHJpbmdWYWx1ZSkpIHsKLSAgICAgICAgKnZhbHVlID0gMDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGNoYXIgKmVuZDsKLSAgICAqdmFsdWUgPSBzdHJ0b2woc3RyaW5nVmFsdWUuY19zdHIoKSwgJmVuZCwgMTApOwotCi0gICAgaWYgKGVuZCA9PSBzdHJpbmdWYWx1ZS5jX3N0cigpIHx8ICplbmQgIT0gJ1wwJykgewotICAgICAgICAqdmFsdWUgPSAwOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmNwcAppbmRleCA4ZjMyNTgyLi44MzRiODhmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuY3BwCkBAIC0yOCwxNCArMjgsMzEgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCisgICAgc2l6ZV90IGJ1ZlNpemUgPSBuIC8gNCAqIDM7CisgICAgc3A8QUJ1ZmZlcj4gYnVmID0gbmV3IEFCdWZmZXIoYnVmU2l6ZSk7CisKKyAgICBpZiAoZGVjb2RlQmFzZTY0KGJ1Zi0+ZGF0YSgpLCAmYnVmU2l6ZSwgcy5jX3N0cigpKSkgeworICAgICAgICBidWYtPnNldFJhbmdlKDAsIGJ1ZlNpemUpOworICAgICAgICByZXR1cm4gYnVmOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworYm9vbCBkZWNvZGVCYXNlNjQodWludDhfdCAqb3V0LCBzaXplX3QgKmluT3V0QnVmU2l6ZSwgY29uc3QgY2hhciogcykgeworICAgIHNpemVfdCBuID0gc3RybGVuKHMpOworCisgICAgaWYgKChuICUgNCkgIT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCiAgICAgc2l6ZV90IHBhZGRpbmcgPSAwOwotICAgIGlmIChuID49IDEgJiYgcy5jX3N0cigpW24gLSAxXSA9PSAnPScpIHsKKyAgICBpZiAobiA+PSAxICYmIHNbbiAtIDFdID09ICc9JykgewogICAgICAgICBwYWRkaW5nID0gMTsKIAotICAgICAgICBpZiAobiA+PSAyICYmIHMuY19zdHIoKVtuIC0gMl0gPT0gJz0nKSB7CisgICAgICAgIGlmIChuID49IDIgJiYgc1tuIC0gMl0gPT0gJz0nKSB7CiAgICAgICAgICAgICBwYWRkaW5nID0gMjsKIAotICAgICAgICAgICAgaWYgKG4gPj0gMyAmJiBzLmNfc3RyKClbbiAtIDNdID09ICc9JykgeworICAgICAgICAgICAgaWYgKG4gPj0gMyAmJiBzW24gLSAzXSA9PSAnPScpIHsKICAgICAgICAgICAgICAgICBwYWRkaW5nID0gMzsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDUsMTUgKzYyLDEzIEBACiAgICAgLy8gYWxyZWFkeSBtYWRlIHN1cmUgdGhhdCBuICUgNCA9PSAwLgogICAgIHNpemVfdCBvdXRMZW4gPSAobiAvIDQpICogMyAtIHBhZGRpbmc7CiAKLSAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihvdXRMZW4pOwotICAgIHVpbnQ4X3QgKm91dCA9IGJ1ZmZlci0+ZGF0YSgpOwotICAgIGlmIChvdXQgPT0gTlVMTCB8fCBidWZmZXItPnNpemUoKSA8IG91dExlbikgewotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAob3V0ID09IE5VTEwgfHwgKmluT3V0QnVmU2l6ZSA8IG91dExlbikgeworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHNpemVfdCBqID0gMDsKICAgICB1aW50MzJfdCBhY2N1bSA9IDA7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgY2hhciBjID0gcy5jX3N0cigpW2ldOworICAgICAgICBjaGFyIGMgPSBzW2ldOwogICAgICAgICB1bnNpZ25lZCB2YWx1ZTsKICAgICAgICAgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB7CiAgICAgICAgICAgICB2YWx1ZSA9IGMgLSAnQSc7CkBAIC02NiwxMCArODEsMTAgQEAKICAgICAgICAgfSBlbHNlIGlmIChjID09ICcvJyB8fCBjID09ICdfJykgewogICAgICAgICAgICAgdmFsdWUgPSA2MzsKICAgICAgICAgfSBlbHNlIGlmIChjICE9ICc9JykgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoaSA8IG4gLSBwYWRkaW5nKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB2YWx1ZSA9IDA7CkBAIC04Niw3ICsxMDEsOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICAqaW5PdXRCdWZTaXplID0gajsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogc3RhdGljIGNoYXIgZW5jb2RlNkJpdCh1bnNpZ25lZCB4KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FOZXR3b3JrU2Vzc2lvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDNlYmFhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FOZXR3b3JrU2Vzc2lvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQV9ORVRXT1JLX1NFU1NJT05fSF8KLQotI2RlZmluZSBBX05FVFdPUktfU0VTU0lPTl9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgotCi0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBBTWVzc2FnZTsKLQotLy8gSGVscGVyIGNsYXNzIHRvIG1hbmFnZSBhIG51bWJlciBvZiBsaXZlIHNvY2tldHMgKGRhdGFncmFtIGFuZCBzdHJlYW0tYmFzZWQpCi0vLyBvbiBhIHNpbmdsZSB0aHJlYWQuIENsaWVudHMgYXJlIG5vdGlmaWVkIGFib3V0IGFjdGl2aXR5IHRocm91Z2ggQU1lc3NhZ2VzLgotc3RydWN0IEFOZXR3b3JrU2Vzc2lvbiA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBBTmV0d29ya1Nlc3Npb24oKTsKLQotICAgIHN0YXR1c190IHN0YXJ0KCk7Ci0gICAgc3RhdHVzX3Qgc3RvcCgpOwotCi0gICAgc3RhdHVzX3QgY3JlYXRlUlRTUENsaWVudCgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIHVuc2lnbmVkIHBvcnQsIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICAgICAgaW50MzJfdCAqc2Vzc2lvbklEKTsKLQotICAgIHN0YXR1c190IGNyZWF0ZVJUU1BTZXJ2ZXIoCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAmYWRkciwgdW5zaWduZWQgcG9ydCwKLSAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBpbnQzMl90ICpzZXNzaW9uSUQpOwotCi0gICAgc3RhdHVzX3QgY3JlYXRlVURQU2Vzc2lvbigKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvY2FsUG9ydCwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIGludDMyX3QgKnNlc3Npb25JRCk7Ci0KLSAgICBzdGF0dXNfdCBjcmVhdGVVRFBTZXNzaW9uKAotICAgICAgICAgICAgdW5zaWduZWQgbG9jYWxQb3J0LAotICAgICAgICAgICAgY29uc3QgY2hhciAqcmVtb3RlSG9zdCwKLSAgICAgICAgICAgIHVuc2lnbmVkIHJlbW90ZVBvcnQsCi0gICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgICAgIGludDMyX3QgKnNlc3Npb25JRCk7Ci0KLSAgICBzdGF0dXNfdCBjb25uZWN0VURQU2Vzc2lvbigKLSAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklELCBjb25zdCBjaGFyICpyZW1vdGVIb3N0LCB1bnNpZ25lZCByZW1vdGVQb3J0KTsKLQotICAgIC8vIHBhc3NpdmUKLSAgICBzdGF0dXNfdCBjcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb24oCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAmYWRkciwgdW5zaWduZWQgcG9ydCwKLSAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBpbnQzMl90ICpzZXNzaW9uSUQpOwotCi0gICAgLy8gYWN0aXZlCi0gICAgc3RhdHVzX3QgY3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uKAotICAgICAgICAgICAgdW5zaWduZWQgbG9jYWxQb3J0LAotICAgICAgICAgICAgY29uc3QgY2hhciAqcmVtb3RlSG9zdCwKLSAgICAgICAgICAgIHVuc2lnbmVkIHJlbW90ZVBvcnQsCi0gICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgICAgIGludDMyX3QgKnNlc3Npb25JRCk7Ci0KLSAgICBzdGF0dXNfdCBkZXN0cm95U2Vzc2lvbihpbnQzMl90IHNlc3Npb25JRCk7Ci0KLSAgICBzdGF0dXNfdCBzZW5kUmVxdWVzdCgKLSAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklELCBjb25zdCB2b2lkICpkYXRhLCBzc2l6ZV90IHNpemUgPSAtMSwKLSAgICAgICAgICAgIGJvb2wgdGltZVZhbGlkID0gZmFsc2UsIGludDY0X3QgdGltZVVzID0gLTFsbCk7Ci0KLSAgICBzdGF0dXNfdCBzd2l0Y2hUb1dlYlNvY2tldE1vZGUoaW50MzJfdCBzZXNzaW9uSUQpOwotCi0gICAgZW51bSBOb3RpZmljYXRpb25SZWFzb24gewotICAgICAgICBrV2hhdEVycm9yLAotICAgICAgICBrV2hhdENvbm5lY3RlZCwKLSAgICAgICAga1doYXRDbGllbnRDb25uZWN0ZWQsCi0gICAgICAgIGtXaGF0RGF0YSwKLSAgICAgICAga1doYXREYXRhZ3JhbSwKLSAgICAgICAga1doYXRCaW5hcnlEYXRhLAotICAgICAgICBrV2hhdFdlYlNvY2tldE1lc3NhZ2UsCi0gICAgICAgIGtXaGF0TmV0d29ya1N0YWxsLAotICAgIH07Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5BTmV0d29ya1Nlc3Npb24oKTsKLQotcHJpdmF0ZToKLSAgICBzdHJ1Y3QgTmV0d29ya1RocmVhZDsKLSAgICBzdHJ1Y3QgU2Vzc2lvbjsKLQotICAgIE11dGV4IG1Mb2NrOwotICAgIHNwPFRocmVhZD4gbVRocmVhZDsKLQotICAgIGludDMyX3QgbU5leHRTZXNzaW9uSUQ7Ci0KLSAgICBpbnQgbVBpcGVGZFsyXTsKLQotICAgIEtleWVkVmVjdG9yPGludDMyX3QsIHNwPFNlc3Npb24+ID4gbVNlc3Npb25zOwotCi0gICAgZW51bSBNb2RlIHsKLSAgICAgICAga01vZGVDcmVhdGVVRFBTZXNzaW9uLAotICAgICAgICBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvblBhc3NpdmUsCi0gICAgICAgIGtNb2RlQ3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uQWN0aXZlLAotICAgICAgICBrTW9kZUNyZWF0ZVJUU1BTZXJ2ZXIsCi0gICAgICAgIGtNb2RlQ3JlYXRlUlRTUENsaWVudCwKLSAgICB9OwotICAgIHN0YXR1c190IGNyZWF0ZUNsaWVudE9yU2VydmVyKAotICAgICAgICAgICAgTW9kZSBtb2RlLAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgKmFkZHIsCi0gICAgICAgICAgICB1bnNpZ25lZCBwb3J0LAotICAgICAgICAgICAgY29uc3QgY2hhciAqcmVtb3RlSG9zdCwKLSAgICAgICAgICAgIHVuc2lnbmVkIHJlbW90ZVBvcnQsCi0gICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgICAgIGludDMyX3QgKnNlc3Npb25JRCk7Ci0KLSAgICB2b2lkIHRocmVhZExvb3AoKTsKLSAgICB2b2lkIGludGVycnVwdCgpOwotCi0gICAgc3RhdGljIHN0YXR1c190IE1ha2VTb2NrZXROb25CbG9ja2luZyhpbnQgcyk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBTmV0d29ya1Nlc3Npb24pOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBBX05FVFdPUktfU0VTU0lPTl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQXVkaW9QcmVzZW50YXRpb25JbmZvLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BdWRpb1ByZXNlbnRhdGlvbkluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmQ0ZDlmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQXVkaW9QcmVzZW50YXRpb25JbmZvLmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQVVESU9fUFJFU0VOVEFUSU9OX0lORk9fSF8KKyNkZWZpbmUgQVVESU9fUFJFU0VOVEFUSU9OX0lORk9fSF8KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2VudW0gQXVkaW9QcmVzZW50YXRpb25WZXJzaW9uIHsKKyAgICBQUkVTRU5UQVRJT05fVkVSU0lPTl9VTkRFRklORUQgPSAwLAorICAgIFBSRVNFTlRBVElPTl9WRVJTSU9OXzEsCit9OworCitlbnVtIE1hc3RlcmluZ0luZGljYXRpb24geworICAgIE1BU1RFUklOR19OT1RfSU5ESUNBVEVELAorICAgIE1BU1RFUkVEX0ZPUl9TVEVSRU8sCisgICAgTUFTVEVSRURfRk9SX1NVUlJPVU5ELAorICAgIE1BU1RFUkVEX0ZPUl8zRCwKKyAgICBNQVNURVJFRF9GT1JfSEVBRFBIT05FLAorfTsKKworc3RydWN0IEF1ZGlvUHJlc2VudGF0aW9uIHsKKyAgICB1aW50MzJfdCBtVmVyc2lvbiA9IFBSRVNFTlRBVElPTl9WRVJTSU9OX1VOREVGSU5FRDsKKyAgICBpbnQzMl90IG1QcmVzZW50YXRpb25JZCA9IC0xOworICAgIGludDMyX3QgbVByb2dyYW1JZCA9IC0xOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gbUxhYmVsczsKKyAgICBzdGQ6OnN0cmluZyBtTGFuZ3VhZ2U7CisgICAgTWFzdGVyaW5nSW5kaWNhdGlvbiBtTWFzdGVyaW5nSW5kaWNhdGlvbiA9IE1BU1RFUklOR19OT1RfSU5ESUNBVEVEOworICAgIGJvb2wgbUF1ZGlvRGVzY3JpcHRpb25BdmFpbGFibGUgPSBmYWxzZTsKKyAgICBib29sIG1TcG9rZW5TdWJ0aXRsZXNBdmFpbGFibGUgPSBmYWxzZTsKKyAgICBib29sIG1EaWFsb2d1ZUVuaGFuY2VtZW50QXZhaWxhYmxlID0gZmFsc2U7Cit9OworCitzdHJ1Y3QgQXVkaW9QcmVzZW50YXRpb25WMSA6IHB1YmxpYyBBdWRpb1ByZXNlbnRhdGlvbiB7CisgICAgQXVkaW9QcmVzZW50YXRpb25WMSgpIHsKKyAgICAgICAgbVZlcnNpb24gPSBQUkVTRU5UQVRJT05fVkVSU0lPTl8xOworICAgIH0KK307CisKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8QXVkaW9QcmVzZW50YXRpb24+IEF1ZGlvUHJlc2VudGF0aW9uQ29sbGVjdGlvbjsKKwordm9pZCBzZXJpYWxpemVBdWRpb1ByZXNlbnRhdGlvbnMoY29uc3QgQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uJiBwcmVzZW50YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0qIHNlcmlhbGl6ZWRPdXRwdXQpOworc3RhdHVzX3QgZGVzZXJpYWxpemVBdWRpb1ByZXNlbnRhdGlvbnMoc3RkOjppc3RyZWFtKiBzZXJpYWxpemVkSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb24gKnByZXNlbnRhdGlvbnMpOworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBVURJT19QUkVTRU5UQVRJT05fSU5GT19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oCmluZGV4IGQ2Yzc2OGQuLmNkMGFmMmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmgKQEAgLTI3LDYgKzI3LDggQEAKICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgogI2luY2x1ZGUgPHN5c3RlbS9ncmFwaGljcy5oPgogCitzdHJ1Y3QgQU1lZGlhRm9ybWF0OworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBDb2xvclV0aWxzIHsKQEAgLTEzNSw2ICsxMzcsOSBAQAogICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRJc29Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cygKICAgICAgICAgICAgIGludDMyX3QgcHJpbWFyaWVzLCBpbnQzMl90IHRyYW5zZmVyLCBpbnQzMl90IGNvZWZmcywgYm9vbCBmdWxsUmFuZ2UsCiAgICAgICAgICAgICBDb2xvckFzcGVjdHMgJmFzcGVjdHMpOworICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRJc29Db2xvckFzcGVjdHNUb1BsYXRmb3JtQXNwZWN0cygKKyAgICAgICAgaW50MzJfdCBwcmltYXJpZXMsIGludDMyX3QgaXNvdHJhbnNmZXIsIGludDMyX3QgY29lZmZzLCBib29sIGZ1bGxSYW5nZSwKKyAgICAgICAgaW50MzJfdCAqcmFuZ2UsIGludDMyX3QgKnN0YW5kYXJkLCBpbnQzMl90ICp0cmFuc2Zlcik7CiAKICAgICAvLyB1bnBhY2sgYSB1aW50MzJfdCB0byBhIGZ1bGwgQ29sb3JBc3BlY3RzIHN0cnVjdAogICAgIHN0YXRpYyBDb2xvckFzcGVjdHMgdW5wYWNrVG9Db2xvckFzcGVjdHModWludDMyX3QgcGFja2VkKTsKQEAgLTE4MCw2ICsxODUsOCBAQAogCiAgICAgLy8gd3JpdGVzIHxpbmZvfCBpbnRvIGZvcm1hdC4KICAgICBzdGF0aWMgdm9pZCBzZXRIRFJTdGF0aWNJbmZvSW50b0Zvcm1hdChjb25zdCBIRFJTdGF0aWNJbmZvICZpbmZvLCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CisgICAgLy8gd3JpdGVzIHxpbmZvfCBpbnRvIGZvcm1hdC4KKyAgICBzdGF0aWMgdm9pZCBzZXRIRFJTdGF0aWNJbmZvSW50b0FNZWRpYUZvcm1hdChjb25zdCBIRFJTdGF0aWNJbmZvICZpbmZvLCBBTWVkaWFGb3JtYXQgKmZvcm1hdCk7CiB9OwogCiBpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nKGFuZHJvaWQ6OkNvbG9yVXRpbHM6OkNvbG9yU3RhbmRhcmQgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaAppbmRleCA1ODc1OGJjLi5lNjg4NTJkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaApAQCAtMjUsNiArMjUsNyBAQAogCiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fVlA4OwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOTsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19BVjE7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fQVZDOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkM7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQ7CkBAIC01Miw2ICs1Myw4IEBACiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVNHU007CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUMzOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0VBQzM7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDM19KT0M7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0OwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1NDUkFNQkxFRDsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BTEFDOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9QYXJzZWRNZXNzYWdlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9QYXJzZWRNZXNzYWdlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNDNhOTMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vUGFyc2VkTWVzc2FnZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBFbmNhcHN1bGF0ZXMgYW4gIkhUVFAvUlRTUCBzdHlsZSIgcmVzcG9uc2UsIGkuZS4gYSBzdGF0dXMgbGluZSwKLS8vIGtleS92YWx1ZSBwYWlycyBtYWtpbmcgdXAgdGhlIGhlYWRlcnMgYW5kIGFuIG9wdGlvbmFsIGJvZHkvY29udGVudC4KLXN0cnVjdCBQYXJzZWRNZXNzYWdlIDogcHVibGljIFJlZkJhc2UgewotICAgIHN0YXRpYyBzcDxQYXJzZWRNZXNzYWdlPiBQYXJzZSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBzaXplLCBib29sIG5vTW9yZURhdGEsIHNpemVfdCAqbGVuZ3RoKTsKLQotICAgIGJvb2wgZmluZFN0cmluZyhjb25zdCBjaGFyICpuYW1lLCBBU3RyaW5nICp2YWx1ZSkgY29uc3Q7Ci0gICAgYm9vbCBmaW5kSW50MzIoY29uc3QgY2hhciAqbmFtZSwgaW50MzJfdCAqdmFsdWUpIGNvbnN0OwotCi0gICAgY29uc3QgY2hhciAqZ2V0Q29udGVudCgpIGNvbnN0OwotCi0gICAgYm9vbCBnZXRSZXF1ZXN0RmllbGQoc2l6ZV90IGluZGV4LCBBU3RyaW5nICpmaWVsZCkgY29uc3Q7Ci0gICAgYm9vbCBnZXRTdGF0dXNDb2RlKGludDMyX3QgKnN0YXR1c0NvZGUpIGNvbnN0OwotCi0gICAgQVN0cmluZyBkZWJ1Z1N0cmluZygpIGNvbnN0OwotCi0gICAgc3RhdGljIGJvb2wgR2V0QXR0cmlidXRlKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmtleSwgQVN0cmluZyAqdmFsdWUpOwotCi0gICAgc3RhdGljIGJvb2wgR2V0SW50MzJBdHRyaWJ1dGUoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICprZXksIGludDMyX3QgKnZhbHVlKTsKLQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+UGFyc2VkTWVzc2FnZSgpOwotCi1wcml2YXRlOgotICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIEFTdHJpbmc+IG1EaWN0OwotICAgIEFTdHJpbmcgbUNvbnRlbnQ7Ci0KLSAgICBQYXJzZWRNZXNzYWdlKCk7Ci0KLSAgICBzc2l6ZV90IHBhcnNlKGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBzaXplLCBib29sIG5vTW9yZURhdGEpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUGFyc2VkTWVzc2FnZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaAppbmRleCBhYmM5NWUwLi42MGZiOWZmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaApAQCAtMjYsNiArMjYsOSBAQAogc3RydWN0IEFTdHJpbmc7CiAKIHNwPEFCdWZmZXI+IGRlY29kZUJhc2U2NChjb25zdCBBU3RyaW5nICZzKTsKKworYm9vbCBkZWNvZGVCYXNlNjQodWludDhfdCAqb3V0LCBzaXplX3QgKmluT3V0QnVmU2l6ZSwgY29uc3QgY2hhciogcyk7CisKIHZvaWQgZW5jb2RlQmFzZTY0KGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBBU3RyaW5nICpvdXQpOwogCiB2b2lkIGVuY29kZUJhc2U2NFVybChjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgQVN0cmluZyAqb3V0KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvQ2xlYXJNZWRpYUhUVFAuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9DbGVhck1lZGlhSFRUUC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU1N2M4YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvQ2xlYXJNZWRpYUhUVFAuY3BwCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDbGVhck1lZGlhSFRUUCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyTWVkaWFIVFRQLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBDb25uZWN0aW9uLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQ2xlYXJNZWRpYUhUVFA6OkNsZWFyTWVkaWFIVFRQKGNvbnN0IHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+ICZjb25uKQorICAgIDogbUluaXRDaGVjaygoY29ubiAhPSBOVUxMKSA/IE9LIDogTk9fSU5JVCksCisgICAgICBtSFRUUENvbm5lY3Rpb24oY29ubiksCisgICAgICBtQ2FjaGVkU2l6ZVZhbGlkKGZhbHNlKSwKKyAgICAgIG1DYWNoZWRTaXplKDBsbCkgeworfQorCitDbGVhck1lZGlhSFRUUDo6fkNsZWFyTWVkaWFIVFRQKCkgeworfQorCitzdGF0dXNfdCBDbGVhck1lZGlhSFRUUDo6Y29ubmVjdCgKKyAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKKyAgICAgICAgb2ZmNjRfdCAvKiBvZmZzZXQgKi8pIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBleHRIZWFkZXJzOworICAgIGlmIChoZWFkZXJzICE9IE5VTEwpIHsKKyAgICAgICAgZXh0SGVhZGVycyA9ICpoZWFkZXJzOworICAgIH0KKworICAgIGlmIChleHRIZWFkZXJzLmluZGV4T2ZLZXkoU3RyaW5nOCgiVXNlci1BZ2VudCIpKSA8IDApIHsKKyAgICAgICAgZXh0SGVhZGVycy5hZGQoU3RyaW5nOCgiVXNlci1BZ2VudCIpLCBTdHJpbmc4KE1ha2VVc2VyQWdlbnQoKS5jX3N0cigpKSk7CisgICAgfQorCisgICAgbUxhc3RVUkkgPSB1cmk7CisgICAgLy8gcmVjb25uZWN0KCkgY2FsbHMgd2l0aCB1cmkgPT0gb2xkIG1MYXN0VVJJLmNfc3RyKCksIHdoaWNoIGdldHMgemFwcGVkCisgICAgLy8gYXMgcGFydCBvZiB0aGUgYWJvdmUgYXNzaWdubWVudC4gRW5zdXJlIG5vIGFjY2lkZW50YWwgbGF0ZXIgdXNlLgorICAgIHVyaSA9IE5VTEw7CisKKyAgICBib29sIHN1Y2Nlc3MgPSBtSFRUUENvbm5lY3Rpb24tPmNvbm5lY3QobUxhc3RVUkkuY19zdHIoKSwgJmV4dEhlYWRlcnMpOworCisgICAgbUxhc3RIZWFkZXJzID0gZXh0SGVhZGVyczsKKworICAgIG1DYWNoZWRTaXplVmFsaWQgPSBmYWxzZTsKKworICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgIEFTdHJpbmcgc2FuaXRpemVkID0gdXJpRGVidWdTdHJpbmcobUxhc3RVUkkpOworICAgICAgICBtTmFtZSA9IFN0cmluZzg6OmZvcm1hdCgiQ2xlYXJNZWRpYUhUVFAoJXMpIiwgc2FuaXRpemVkLmNfc3RyKCkpOworICAgIH0KKworICAgIHJldHVybiBzdWNjZXNzID8gT0sgOiBVTktOT1dOX0VSUk9SOworfQorCit2b2lkIENsZWFyTWVkaWFIVFRQOjpjbG9zZSgpIHsKKyAgICBkaXNjb25uZWN0KCk7Cit9CisKK3ZvaWQgQ2xlYXJNZWRpYUhUVFA6OmRpc2Nvbm5lY3QoKSB7CisgICAgbU5hbWUgPSBTdHJpbmc4KCJDbGVhck1lZGlhSFRUUCg8ZGlzY29ubmVjdGVkPikiKTsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUhUVFBDb25uZWN0aW9uLT5kaXNjb25uZWN0KCk7Cit9CisKK3N0YXR1c190IENsZWFyTWVkaWFIVFRQOjppbml0Q2hlY2soKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Cit9CisKK3NzaXplX3QgQ2xlYXJNZWRpYUhUVFA6OnJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKworICAgIHNpemVfdCBudW1CeXRlc1JlYWQgPSAwOworICAgIHdoaWxlIChudW1CeXRlc1JlYWQgPCBzaXplKSB7CisgICAgICAgIHNpemVfdCBjb3B5ID0gc2l6ZSAtIG51bUJ5dGVzUmVhZDsKKworICAgICAgICBpZiAoY29weSA+IDY0ICogMTAyNCkgeworICAgICAgICAgICAgLy8gbGltaXQgdGhlIGJ1ZmZlciBzaXplcyB0cmFuc2ZlcnJlZCBhY3Jvc3MgYmluZGVyIGJvdW5kYXJpZXMKKyAgICAgICAgICAgIC8vIHRvIGF2b2lkIHNwdXJpb3VzIHRyYW5zYWN0aW9uIGZhaWx1cmVzLgorICAgICAgICAgICAgY29weSA9IDY0ICogMTAyNDsKKyAgICAgICAgfQorCisgICAgICAgIHNzaXplX3QgbiA9IG1IVFRQQ29ubmVjdGlvbi0+cmVhZEF0KAorICAgICAgICAgICAgICAgIG9mZnNldCArIG51bUJ5dGVzUmVhZCwgKHVpbnQ4X3QgKilkYXRhICsgbnVtQnl0ZXNSZWFkLCBjb3B5KTsKKworICAgICAgICBpZiAobiA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBuOworICAgICAgICB9IGVsc2UgaWYgKG4gPT0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBudW1CeXRlc1JlYWQgKz0gbjsKKyAgICB9CisKKyAgICBpbnQ2NF90IGRlbGF5VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRUaW1lVXM7CisKKyAgICBhZGRCYW5kd2lkdGhNZWFzdXJlbWVudChudW1CeXRlc1JlYWQsIGRlbGF5VXMpOworCisgICAgcmV0dXJuIG51bUJ5dGVzUmVhZDsKK30KKworc3RhdHVzX3QgQ2xlYXJNZWRpYUhUVFA6OmdldFNpemUob2ZmNjRfdCAqc2l6ZSkgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIC8vIENhY2hpbmcgdGhlIHJldHVybmVkIHNpemUgc28gdGhhdCBpdCBzdGF5cyB2YWxpZCBldmVuIGFmdGVyIGEKKyAgICAvLyBkaXNjb25uZWN0LiBOdUNhY2hlZFNvdXJjZTIgcmVsaWVzIG9uIHRoaXMuCisKKyAgICBpZiAoIW1DYWNoZWRTaXplVmFsaWQpIHsKKyAgICAgICAgbUNhY2hlZFNpemUgPSBtSFRUUENvbm5lY3Rpb24tPmdldFNpemUoKTsKKyAgICAgICAgbUNhY2hlZFNpemVWYWxpZCA9IHRydWU7CisgICAgfQorCisgICAgKnNpemUgPSBtQ2FjaGVkU2l6ZTsKKworICAgIHJldHVybiAqc2l6ZSA8IDAgPyAqc2l6ZSA6IHN0YXRpY19jYXN0PHN0YXR1c190PihPSyk7Cit9CisKK3VpbnQzMl90IENsZWFyTWVkaWFIVFRQOjpmbGFncygpIHsKKyAgICByZXR1cm4ga1dhbnRzUHJlZmV0Y2hpbmcgfCBrSXNIVFRQQmFzZWRTb3VyY2U7Cit9CisKK3N0YXR1c190IENsZWFyTWVkaWFIVFRQOjpyZWNvbm5lY3RBdE9mZnNldChvZmY2NF90IG9mZnNldCkgeworICAgIHJldHVybiBjb25uZWN0KG1MYXN0VVJJLmNfc3RyKCksICZtTGFzdEhlYWRlcnMsIG9mZnNldCk7Cit9CisKKworU3RyaW5nOCBDbGVhck1lZGlhSFRUUDo6Z2V0VXJpKCkgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBTdHJpbmc4OjplbXB0eSgpOworICAgIH0KKworICAgIFN0cmluZzggdXJpOworICAgIGlmIChPSyA9PSBtSFRUUENvbm5lY3Rpb24tPmdldFVyaSgmdXJpKSkgeworICAgICAgICByZXR1cm4gdXJpOworICAgIH0KKyAgICByZXR1cm4gU3RyaW5nOChtTGFzdFVSSS5jX3N0cigpKTsKK30KKworU3RyaW5nOCBDbGVhck1lZGlhSFRUUDo6Z2V0TUlNRVR5cGUoKSBjb25zdCB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzgoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOworICAgIH0KKworICAgIFN0cmluZzggbWltZVR5cGU7CisgICAgc3RhdHVzX3QgZXJyID0gbUhUVFBDb25uZWN0aW9uLT5nZXRNSU1FVHlwZSgmbWltZVR5cGUpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gU3RyaW5nOCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisgICAgfQorCisgICAgcmV0dXJuIG1pbWVUeXBlOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9NZWRpYUhUVFAuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9NZWRpYUhUVFAuY3BwCmluZGV4IDdjOTI0N2UuLjBmYmEzZGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvTWVkaWFIVFRQLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL01lZGlhSFRUUC5jcHAKQEAgLTMwLDEwICszMCw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIE1lZGlhSFRUUDo6TWVkaWFIVFRQKGNvbnN0IHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+ICZjb25uKQotICAgIDogbUluaXRDaGVjaygoY29ubiAhPSBOVUxMKSA/IE9LIDogTk9fSU5JVCksCi0gICAgICBtSFRUUENvbm5lY3Rpb24oY29ubiksCi0gICAgICBtQ2FjaGVkU2l6ZVZhbGlkKGZhbHNlKSwKLSAgICAgIG1DYWNoZWRTaXplKDBsbCksCisgICAgOiBDbGVhck1lZGlhSFRUUChjb25uKSwKICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50KE5VTEwpIHsKIH0KIApAQCAtNDEsMTE3ICszOCw2IEBACiAgICAgY2xlYXJEUk1TdGF0ZV9sKCk7CiB9CiAKLXN0YXR1c190IE1lZGlhSFRUUDo6Y29ubmVjdCgKLSAgICAgICAgY29uc3QgY2hhciAqdXJpLAotICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKLSAgICAgICAgb2ZmNjRfdCAvKiBvZmZzZXQgKi8pIHsKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9Ci0KLSAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBleHRIZWFkZXJzOwotICAgIGlmIChoZWFkZXJzICE9IE5VTEwpIHsKLSAgICAgICAgZXh0SGVhZGVycyA9ICpoZWFkZXJzOwotICAgIH0KLQotICAgIGlmIChleHRIZWFkZXJzLmluZGV4T2ZLZXkoU3RyaW5nOCgiVXNlci1BZ2VudCIpKSA8IDApIHsKLSAgICAgICAgZXh0SGVhZGVycy5hZGQoU3RyaW5nOCgiVXNlci1BZ2VudCIpLCBTdHJpbmc4KE1ha2VVc2VyQWdlbnQoKS5jX3N0cigpKSk7Ci0gICAgfQotCi0gICAgbUxhc3RVUkkgPSB1cmk7Ci0gICAgLy8gcmVjb25uZWN0KCkgY2FsbHMgd2l0aCB1cmkgPT0gb2xkIG1MYXN0VVJJLmNfc3RyKCksIHdoaWNoIGdldHMgemFwcGVkCi0gICAgLy8gYXMgcGFydCBvZiB0aGUgYWJvdmUgYXNzaWdubWVudC4gRW5zdXJlIG5vIGFjY2lkZW50YWwgbGF0ZXIgdXNlLgotICAgIHVyaSA9IE5VTEw7Ci0KLSAgICBib29sIHN1Y2Nlc3MgPSBtSFRUUENvbm5lY3Rpb24tPmNvbm5lY3QobUxhc3RVUkkuY19zdHIoKSwgJmV4dEhlYWRlcnMpOwotCi0gICAgbUxhc3RIZWFkZXJzID0gZXh0SGVhZGVyczsKLQotICAgIG1DYWNoZWRTaXplVmFsaWQgPSBmYWxzZTsKLQotICAgIGlmIChzdWNjZXNzKSB7Ci0gICAgICAgIEFTdHJpbmcgc2FuaXRpemVkID0gdXJpRGVidWdTdHJpbmcobUxhc3RVUkkpOwotICAgICAgICBtTmFtZSA9IFN0cmluZzg6OmZvcm1hdCgiTWVkaWFIVFRQKCVzKSIsIHNhbml0aXplZC5jX3N0cigpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3VjY2VzcyA/IE9LIDogVU5LTk9XTl9FUlJPUjsKLX0KLQotdm9pZCBNZWRpYUhUVFA6OmRpc2Nvbm5lY3QoKSB7Ci0gICAgbU5hbWUgPSBTdHJpbmc4KCJNZWRpYUhUVFAoPGRpc2Nvbm5lY3RlZD4pIik7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1IVFRQQ29ubmVjdGlvbi0+ZGlzY29ubmVjdCgpOwotfQotCi1zdGF0dXNfdCBNZWRpYUhUVFA6OmluaXRDaGVjaygpIGNvbnN0IHsKLSAgICByZXR1cm4gbUluaXRDaGVjazsKLX0KLQotc3NpemVfdCBNZWRpYUhUVFA6OnJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLQotICAgIHNpemVfdCBudW1CeXRlc1JlYWQgPSAwOwotICAgIHdoaWxlIChudW1CeXRlc1JlYWQgPCBzaXplKSB7Ci0gICAgICAgIHNpemVfdCBjb3B5ID0gc2l6ZSAtIG51bUJ5dGVzUmVhZDsKLQotICAgICAgICBpZiAoY29weSA+IDY0ICogMTAyNCkgewotICAgICAgICAgICAgLy8gbGltaXQgdGhlIGJ1ZmZlciBzaXplcyB0cmFuc2ZlcnJlZCBhY3Jvc3MgYmluZGVyIGJvdW5kYXJpZXMKLSAgICAgICAgICAgIC8vIHRvIGF2b2lkIHNwdXJpb3VzIHRyYW5zYWN0aW9uIGZhaWx1cmVzLgotICAgICAgICAgICAgY29weSA9IDY0ICogMTAyNDsKLSAgICAgICAgfQotCi0gICAgICAgIHNzaXplX3QgbiA9IG1IVFRQQ29ubmVjdGlvbi0+cmVhZEF0KAotICAgICAgICAgICAgICAgIG9mZnNldCArIG51bUJ5dGVzUmVhZCwgKHVpbnQ4X3QgKilkYXRhICsgbnVtQnl0ZXNSZWFkLCBjb3B5KTsKLQotICAgICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBuOwotICAgICAgICB9IGVsc2UgaWYgKG4gPT0gMCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBudW1CeXRlc1JlYWQgKz0gbjsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IGRlbGF5VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRUaW1lVXM7Ci0KLSAgICBhZGRCYW5kd2lkdGhNZWFzdXJlbWVudChudW1CeXRlc1JlYWQsIGRlbGF5VXMpOwotCi0gICAgcmV0dXJuIG51bUJ5dGVzUmVhZDsKLX0KLQotc3RhdHVzX3QgTWVkaWFIVFRQOjpnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9Ci0KLSAgICAvLyBDYWNoaW5nIHRoZSByZXR1cm5lZCBzaXplIHNvIHRoYXQgaXQgc3RheXMgdmFsaWQgZXZlbiBhZnRlciBhCi0gICAgLy8gZGlzY29ubmVjdC4gTnVDYWNoZWRTb3VyY2UyIHJlbGllcyBvbiB0aGlzLgotCi0gICAgaWYgKCFtQ2FjaGVkU2l6ZVZhbGlkKSB7Ci0gICAgICAgIG1DYWNoZWRTaXplID0gbUhUVFBDb25uZWN0aW9uLT5nZXRTaXplKCk7Ci0gICAgICAgIG1DYWNoZWRTaXplVmFsaWQgPSB0cnVlOwotICAgIH0KLQotICAgICpzaXplID0gbUNhY2hlZFNpemU7Ci0KLSAgICByZXR1cm4gKnNpemUgPCAwID8gKnNpemUgOiBzdGF0aWNfY2FzdDxzdGF0dXNfdD4oT0spOwotfQotCi11aW50MzJfdCBNZWRpYUhUVFA6OmZsYWdzKCkgewotICAgIHJldHVybiBrV2FudHNQcmVmZXRjaGluZyB8IGtJc0hUVFBCYXNlZFNvdXJjZTsKLX0KLQotc3RhdHVzX3QgTWVkaWFIVFRQOjpyZWNvbm5lY3RBdE9mZnNldChvZmY2NF90IG9mZnNldCkgewotICAgIHJldHVybiBjb25uZWN0KG1MYXN0VVJJLmNfc3RyKCksICZtTGFzdEhlYWRlcnMsIG9mZnNldCk7Ci19Ci0KIC8vIERSTS4uLgogCiBzcDxEZWNyeXB0SGFuZGxlPiBNZWRpYUhUVFA6OkRybUluaXRpYWxpemF0aW9uKGNvbnN0IGNoYXIqIG1pbWUpIHsKQEAgLTE3NiwzMyArNjIsNiBAQAogICAgIHJldHVybiBtRGVjcnlwdEhhbmRsZTsKIH0KIAotU3RyaW5nOCBNZWRpYUhUVFA6OmdldFVyaSgpIHsKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gU3RyaW5nODo6ZW1wdHkoKTsKLSAgICB9Ci0KLSAgICBTdHJpbmc4IHVyaTsKLSAgICBpZiAoT0sgPT0gbUhUVFBDb25uZWN0aW9uLT5nZXRVcmkoJnVyaSkpIHsKLSAgICAgICAgcmV0dXJuIHVyaTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0cmluZzgobUxhc3RVUkkuY19zdHIoKSk7Ci19Ci0KLVN0cmluZzggTWVkaWFIVFRQOjpnZXRNSU1FVHlwZSgpIGNvbnN0IHsKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gU3RyaW5nOCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7Ci0gICAgfQotCi0gICAgU3RyaW5nOCBtaW1lVHlwZTsKLSAgICBzdGF0dXNfdCBlcnIgPSBtSFRUUENvbm5lY3Rpb24tPmdldE1JTUVUeXBlKCZtaW1lVHlwZSk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbWltZVR5cGU7Ci19Ci0KIHZvaWQgTWVkaWFIVFRQOjpjbGVhckRSTVN0YXRlX2woKSB7CiAgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKICAgICAgICAgLy8gVG8gcmVsZWFzZSBtRGVjcnlwdEhhbmRsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQuYnAKaW5kZXggOTA1M2Q2Mi4uYzRhMDcyYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLmJwCkBAIC0yOSwxOCArMjksMTkgQEAKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmNyeXB0byIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlibWVkaWEiLAogICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGlibWVkaWFuZGsiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJoaWRsYWxsb2NhdG9ydXRpbHMiLAogICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaGlkbG1lbW9yeSIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhc0AxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXMubmF0aXZlQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9IVFRQRG93bmxvYWRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9IVFRQRG93bmxvYWRlci5jcHAKaW5kZXggNzI2MDRlMy4uNTkyNjVmZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvSFRUUERvd25sb2FkZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0hUVFBEb3dubG9hZGVyLmNwcApAQCAtMjYsOCArMjYsOCBAQAogI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DbGVhck1lZGlhSFRUUC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyRmlsZVNvdXJjZS5oPgogI2luY2x1ZGUgPG9wZW5zc2wvYWVzLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9tZDUuaD4KICNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgpAQCAtMzgsNyArMzgsNyBAQAogSFRUUERvd25sb2FkZXI6OkhUVFBEb3dubG9hZGVyKAogICAgICAgICBjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICZoZWFkZXJzKSA6Ci0gICAgbUhUVFBEYXRhU291cmNlKG5ldyBNZWRpYUhUVFAoaHR0cFNlcnZpY2UtPm1ha2VIVFRQQ29ubmVjdGlvbigpKSksCisgICAgbUhUVFBEYXRhU291cmNlKG5ldyBDbGVhck1lZGlhSFRUUChodHRwU2VydmljZS0+bWFrZUhUVFBDb25uZWN0aW9uKCkpKSwKICAgICBtRXh0cmFIZWFkZXJzKGhlYWRlcnMpLAogICAgIG1EaXNjb25uZWN0aW5nKGZhbHNlKSB7CiB9CkBAIC05MSw3ICs5MSw3IEBACiAKICAgICBpZiAocmVjb25uZWN0KSB7CiAgICAgICAgIGlmICghc3RybmNhc2VjbXAodXJsLCAiZmlsZTovLyIsIDcpKSB7Ci0gICAgICAgICAgICBtRGF0YVNvdXJjZSA9IG5ldyBGaWxlU291cmNlKHVybCArIDcpOworICAgICAgICAgICAgbURhdGFTb3VyY2UgPSBuZXcgQ2xlYXJGaWxlU291cmNlKHVybCArIDcpOwogICAgICAgICB9IGVsc2UgaWYgKHN0cm5jYXNlY21wKHVybCwgImh0dHA6Ly8iLCA3KQogICAgICAgICAgICAgICAgICYmIHN0cm5jYXNlY21wKHVybCwgImh0dHBzOi8vIiwgOCkpIHsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwCmluZGV4IDhhYjMzZjcuLmQwNmQ5ZjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcApAQCAtMTM5MSw2ICsxMzkxLDcgQEAKICAgICAgICAgY2FzZSAnUURNQyc6CiAgICAgICAgIGNhc2UgJ3VsYXcnOgogICAgICAgICBjYXNlICd2ZHZhJzoKKyAgICAgICAgY2FzZSAnYWMtNCc6CiAgICAgICAgICAgICByZXR1cm4gIXN0cmNtcCgiYXVkaW8iLCB0eXBlKTsKIAogICAgICAgICBjYXNlICdhdmMxJzoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAKaW5kZXggZjlmOGEzZC4uNzE1MWQwNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAKQEAgLTMsNiArMywxMCBAQAogCiAgICAgc3JjczogWyJJRDMuY3BwIl0sCiAKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgIF0sCisKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVdhbGwiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvSUQzLmNwcAppbmRleCBhMGE2MmY0Li5iNDg5MTgzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvSUQzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvSUQzLmNwcApAQCAtMjEsNiArMjEsOCBAQAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvSUQzLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CkBAIC01Niw2ICs1OCw1NSBAQAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lbW9yeVNvdXJjZSk7CiB9OwogCitjbGFzcyBEYXRhU291cmNlVW53cmFwcGVyIDogcHVibGljIERhdGFTb3VyY2VCYXNlIHsKKworcHVibGljOgorICAgIGV4cGxpY2l0IERhdGFTb3VyY2VVbndyYXBwZXIoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlaGVscGVyKSB7CisgICAgICAgIG1Tb3VyY2UgPSBzb3VyY2VoZWxwZXI7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3QgeyByZXR1cm4gT0s7IH0KKworICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLCBvciAtMSBvbiBmYWlsdXJlLiBJdCdzIG5vdCBhbiBlcnJvciBpZgorICAgIC8vIHRoaXMgcmV0dXJucyB6ZXJvOyBpdCBqdXN0IG1lYW5zIHRoZSBnaXZlbiBvZmZzZXQgaXMgZXF1YWwgdG8sIG9yCisgICAgLy8gYmV5b25kLCB0aGUgZW5kIG9mIHRoZSBzb3VyY2UuCisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPnJlYWRBdChvZmZzZXQsIGRhdGEsIHNpemUpOworICAgIH0KKworICAgIC8vIE1heSByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPmdldFNpemUoc2l6ZSk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGdldFVyaShjaGFyICogLyp1cmlTdHJpbmcqLywgc2l6ZV90IC8qYnVmZmVyU2l6ZSovKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSB7fTsKK3ByaXZhdGU6CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbVNvdXJjZTsKK307CisKKworSUQzOjpJRDMoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlaGVscGVyLCBib29sIGlnbm9yZVYxLCBvZmY2NF90IG9mZnNldCkKKyAgICA6IG1Jc1ZhbGlkKGZhbHNlKSwKKyAgICAgIG1EYXRhKE5VTEwpLAorICAgICAgbVNpemUoMCksCisgICAgICBtRmlyc3RGcmFtZU9mZnNldCgwKSwKKyAgICAgIG1WZXJzaW9uKElEM19VTktOT1dOKSwKKyAgICAgIG1SYXdTaXplKDApIHsKKyAgICBEYXRhU291cmNlVW53cmFwcGVyIHNvdXJjZShzb3VyY2VoZWxwZXIpOworICAgIG1Jc1ZhbGlkID0gcGFyc2VWMigmc291cmNlLCBvZmZzZXQpOworCisgICAgaWYgKCFtSXNWYWxpZCAmJiAhaWdub3JlVjEpIHsKKyAgICAgICAgbUlzVmFsaWQgPSBwYXJzZVYxKCZzb3VyY2UpOworICAgIH0KK30KKwogSUQzOjpJRDMoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgYm9vbCBpZ25vcmVWMSwgb2ZmNjRfdCBvZmZzZXQpCiAgICAgOiBtSXNWYWxpZChmYWxzZSksCiAgICAgICBtRGF0YShOVUxMKSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaAppbmRleCBhOTI0MTk3Li44YjIwMTg3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oCkBAIC01MSwxMiArNTEsNiBAQAogCiAgICAgdmlydHVhbCB2b2lkIHNldEJhbmR3aWR0aEhpc3RvcnlTaXplKHNpemVfdCBudW1IaXN0b3J5SXRlbXMpOwogCi0gICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQsIHVpZF90IHVpZCwgdWludDMyX3Qga1RhZyk7Ci0gICAgc3RhdGljIHZvaWQgVW5SZWdpc3RlclNvY2tldFVzZXJUYWcoaW50IHNvY2tmZCk7Ci0KLSAgICBzdGF0aWMgdm9pZCBSZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQsIHVpZF90IHVpZCk7Ci0gICAgc3RhdGljIHZvaWQgVW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQpOwotCiAgICAgdmlydHVhbCBTdHJpbmc4IHRvU3RyaW5nKCkgewogICAgICAgICByZXR1cm4gbU5hbWU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9JRDMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSUQzLmgKaW5kZXggN2MyMzkxZS4uNWU0MzNlYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9JRDMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0lEMy5oCkBAIC0yNCw2ICsyNCw3IEBACiAKIGNsYXNzIERhdGFTb3VyY2VCYXNlOwogY2xhc3MgU3RyaW5nODsKK2NsYXNzIERhdGFTb3VyY2VIZWxwZXI7CiAKIHN0cnVjdCBJRDMgewogICAgIGVudW0gVmVyc2lvbiB7CkBAIC0zNSw2ICszNiw3IEBACiAgICAgICAgIElEM19WMl80LAogICAgIH07CiAKKyAgICBleHBsaWNpdCBJRDMoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBib29sIGlnbm9yZVYxID0gZmFsc2UsIG9mZjY0X3Qgb2Zmc2V0ID0gMCk7CiAgICAgZXhwbGljaXQgSUQzKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGJvb2wgaWdub3JlVjEgPSBmYWxzZSwgb2ZmNjRfdCBvZmZzZXQgPSAwKTsKICAgICBJRDMoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUsIGJvb2wgaWdub3JlVjEgPSBmYWxzZSk7CiAgICAgfklEMygpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgKaW5kZXggZjQzOWExYy4uNTk2ZWZiOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oCkBAIC0zNyw2ICszNyw4IEBACiAKICAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiAKKyAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKTsKKwogICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7CkBAIC01MSw2ICs1Myw4IEBACiAgICAgICAgIHJldHVybiBtTmFtZTsKICAgICB9CiAKKyAgICBzdGF0dXNfdCBnZXRBdmFpbGFibGVTaXplKG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90ICpzaXplKTsKKwogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogICAgIHNpemVfdCBjYWNoZWRTaXplKCk7CkBAIC0xMzUsNyArMTM5LDcgQEAKICAgICBzc2l6ZV90IHJlYWRJbnRlcm5hbChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwogICAgIHN0YXR1c190IHNlZWtJbnRlcm5hbF9sKG9mZjY0X3Qgb2Zmc2V0KTsKIAotICAgIHNpemVfdCBhcHByb3hEYXRhUmVtYWluaW5nX2woc3RhdHVzX3QgKmZpbmFsU3RhdHVzKSBjb25zdDsKKyAgICBzaXplX3QgYXBwcm94RGF0YVJlbWFpbmluZ19sKG9mZjY0X3Qgb2Zmc2V0LCBzdGF0dXNfdCAqZmluYWxTdGF0dXMpIGNvbnN0OwogCiAgICAgdm9pZCByZXN0YXJ0UHJlZmV0Y2hlcklmTmVjZXNzYXJ5X2woCiAgICAgICAgICAgICBib29sIGlnbm9yZUxvd1dhdGVyVGhyZXNob2xkID0gZmFsc2UsIGJvb2wgZm9yY2UgPSBmYWxzZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCmluZGV4IGMyODY1MTYuLjY0ZGNhNGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCkBAIC01MSw3ICs1MSw3IEBACiAgICAgQ29sb3JDb252ZXJ0ZXIgKm1Db252ZXJ0ZXI7CiAgICAgWVVWTW9kZSBtWVVWTW9kZTsKICAgICBzcDxBTmF0aXZlV2luZG93PiBtTmF0aXZlV2luZG93OwotICAgIGludDMyX3QgbVdpZHRoLCBtSGVpZ2h0OworICAgIGludDMyX3QgbVdpZHRoLCBtSGVpZ2h0LCBtU3RyaWRlOwogICAgIGludDMyX3QgbUNyb3BMZWZ0LCBtQ3JvcFRvcCwgbUNyb3BSaWdodCwgbUNyb3BCb3R0b207CiAgICAgaW50MzJfdCBtQ3JvcFdpZHRoLCBtQ3JvcEhlaWdodDsKICAgICBpbnQzMl90IG1Sb3RhdGlvbkRlZ3JlZXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCmluZGV4IDFhNDRlMWYuLmM1MDY3N2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCkBAIC0yNiw3ICsyNiw2IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIERhdGFTb3VyY2U7Ci1jbGFzcyBNZWRpYUV4dHJhY3RvcjsKIHN0cnVjdCBJbWFnZURlY29kZXI7CiBzdHJ1Y3QgRnJhbWVSZWN0OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaAppbmRleCA5N2QxNWE3Li45ZDQ2ZDJkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmgKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9NZXRhZGF0YUJ1ZmZlclR5cGUuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjSW5mby5oPgogI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRnJhbWVSZW5kZXJUcmFja2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CkBAIC0xMzcsNiArMTM3LDcgQEAKICAgICAgICAga1doYXRPTVhEaWVkICAgICAgICAgICAgICAgICA9ICdPTVhkJywKICAgICAgICAga1doYXRSZWxlYXNlQ29kZWNJbnN0YW5jZSAgICA9ICdyZWxDJywKICAgICAgICAga1doYXRGb3JjZVN0YXRlVHJhbnNpdGlvbiAgICA9ICdmc3R0JywKKyAgICAgICAga1doYXRDaGVja0lmU3R1Y2sgICAgICAgICAgICA9ICdDc3RrJywKICAgICB9OwogCiAgICAgZW51bSB7CkBAIC0yMzYsNiArMjM3LDggQEAKICAgICBhbmRyb2lkX25hdGl2ZV9yZWN0X3QgbUxhc3ROYXRpdmVXaW5kb3dDcm9wOwogICAgIGludDMyX3QgbUxhc3ROYXRpdmVXaW5kb3dEYXRhU3BhY2U7CiAgICAgSERSU3RhdGljSW5mbyBtTGFzdEhEUlN0YXRpY0luZm87CisgICAgc3A8QUJ1ZmZlcj4gbUhkcjEwUGx1c1NjcmF0Y2hCdWZmZXI7CisgICAgc3A8QUJ1ZmZlcj4gbUxhc3RIZHIxMFBsdXNCdWZmZXI7CiAgICAgc3A8QU1lc3NhZ2U+IG1Db25maWdGb3JtYXQ7CiAgICAgc3A8QU1lc3NhZ2U+IG1JbnB1dEZvcm1hdDsKICAgICBzcDxBTWVzc2FnZT4gbU91dHB1dEZvcm1hdDsKQEAgLTI4OSw2ICsyOTIsNyBAQAogCiAgICAgT01YX0lOREVYVFlQRSBtRGVzY3JpYmVDb2xvckFzcGVjdHNJbmRleDsKICAgICBPTVhfSU5ERVhUWVBFIG1EZXNjcmliZUhEUlN0YXRpY0luZm9JbmRleDsKKyAgICBPTVhfSU5ERVhUWVBFIG1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleDsKIAogICAgIHN0ZDo6c2hhcmVkX3B0cjxBQ29kZWNCdWZmZXJDaGFubmVsPiBtQnVmZmVyQ2hhbm5lbDsKIApAQCAtNDIzLDYgKzQyNywxMSBAQAogICAgIC8vIHVuc3BlY2lmaWVkIHZhbHVlcy4KICAgICB2b2lkIG9uRGF0YVNwYWNlQ2hhbmdlZChhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNvbnN0IENvbG9yQXNwZWN0cyAmYXNwZWN0cyk7CiAKKyAgICAvLyBub3RpZmllcyB0aGUgY29kZWMgdGhhdCB0aGUgY29uZmlnIHdpdGggfGNvbmZpZ0luZGV4fCBoYXMgY2hhbmdlZCwgdGhlIHZhbHVlCisgICAgLy8gY2FuIGJlIHF1ZXJpZWQgYnkgT01YIGdldENvbmZpZywgYW5kIHRoZSBjb25maWcgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIG5leHQKKyAgICAvLyBvdXRwdXQgYnVmZmVyIG5vdGlmaWVkIGFmdGVyIHRoaXMgY2FsbGJhY2suCisgICAgdm9pZCBvbkNvbmZpZ1VwZGF0ZShPTVhfSU5ERVhUWVBFIGNvbmZpZ0luZGV4KTsKKwogICAgIC8vIGdldHMgaW5kZXggb3Igc2V0cyBpdCB0byAwIG9uIGVycm9yLiBSZXR1cm5zIGVycm9yIGZyb20gY29kZWMuCiAgICAgc3RhdHVzX3QgaW5pdERlc2NyaWJlSERSU3RhdGljSW5mb0luZGV4KCk7CiAKQEAgLTQzNCwxMiArNDQzLDIyIEBACiAgICAgLy8gc2V0cyB8cGFyYW1zfC4gUmV0dXJucyB0aGUgY29kZWMgZXJyb3IuCiAgICAgc3RhdHVzX3Qgc2V0SERSU3RhdGljSW5mbyhjb25zdCBEZXNjcmliZUhEUlN0YXRpY0luZm9QYXJhbXMgJnBhcmFtcyk7CiAKKyAgICAvLyBzZXRzIHxoZHIxMFBsdXNJbmZvfC4gUmV0dXJucyB0aGUgY29kZWMgZXJyb3IuCisgICAgc3RhdHVzX3Qgc2V0SGRyMTBQbHVzSW5mbyhjb25zdCBzcDxBQnVmZmVyPiAmaGRyMTBQbHVzSW5mbyk7CisKICAgICAvLyBnZXRzIHxwYXJhbXN8LiBSZXR1cm5zIHRoZSBjb2RlYyBlcnJvci4KICAgICBzdGF0dXNfdCBnZXRIRFJTdGF0aWNJbmZvKERlc2NyaWJlSERSU3RhdGljSW5mb1BhcmFtcyAmcGFyYW1zKTsKIAogICAgIC8vIGdldHMgSERSIHN0YXRpYyBpbmZvcm1hdGlvbiBmb3IgdGhlIHZpZGVvIGVuY29kZXIvZGVjb2RlciBwb3J0IGFuZCBzZXRzIHRoZW0gaW50byB8Zm9ybWF0fC4KICAgICBzdGF0dXNfdCBnZXRIRFJTdGF0aWNJbmZvRm9yVmlkZW9Db2RlYyhPTVhfVTMyIHBvcnRJbmRleCwgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOwogCisgICAgLy8gZ2V0cyBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgcGFyYW1zLiBJZiB8cGFyYW1TaXplVXNlZHwgaXMgemVybywgaXQncworICAgIC8vIHBvc3NpYmxlIHRoYXQgdGhlIHJldHVybmVkIERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyBvbmx5IGhhcyB0aGUKKyAgICAvLyBuUGFyYW1TaXplVXNlZCBmaWVsZCB1cGRhdGVkLCBiZWNhdXNlIHRoZSBzaXplIG9mIHRoZSBzdG9yYWdlIGlzIGluc3VmZmljaWVudC4KKyAgICAvLyBJbiB0aGlzIGNhc2UsIGdldEhEUjEwUGx1c0luZm8oKSBzaG91bGQgYmUgY2FsbGVkIGFnYWluIHdpdGggfHBhcmFtU2l6ZVVzZWR8CisgICAgLy8gc3BlY2lmaWVkIHRvIHRoZSBwcmV2aW91cyByZXR1cm5lZCB2YWx1ZS4KKyAgICBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMqIGdldEhEUjEwUGx1c0luZm8oc2l6ZV90IHBhcmFtU2l6ZVVzZWQgPSAwKTsKKwogICAgIHR5cGVkZWYgc3RydWN0IGRyY1BhcmFtcyB7CiAgICAgICAgIGludDMyX3QgZHJjQ3V0OwogICAgICAgICBpbnQzMl90IGRyY0Jvb3N0OwpAQCAtNDYwLDYgKzQ3OSw4IEBACiAKICAgICBzdGF0dXNfdCBzZXR1cEVBQzNDb2RlYyhib29sIGVuY29kZXIsIGludDMyX3QgbnVtQ2hhbm5lbHMsIGludDMyX3Qgc2FtcGxlUmF0ZSk7CiAKKyAgICBzdGF0dXNfdCBzZXR1cEFDNENvZGVjKGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlKTsKKwogICAgIHN0YXR1c190IHNlbGVjdEF1ZGlvUG9ydEZvcm1hdCgKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQVVESU9fQ09ESU5HVFlQRSBkZXNpcmVkRm9ybWF0KTsKIApAQCAtNDY3LDcgKzQ4OCw4IEBACiAgICAgc3RhdHVzX3Qgc2V0dXBHNzExQ29kZWMoYm9vbCBlbmNvZGVyLCBpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgbnVtQ2hhbm5lbHMpOwogCiAgICAgc3RhdHVzX3Qgc2V0dXBGbGFjQ29kZWMoCi0gICAgICAgICAgICBib29sIGVuY29kZXIsIGludDMyX3QgbnVtQ2hhbm5lbHMsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBjb21wcmVzc2lvbkxldmVsKTsKKyAgICAgICAgICAgIGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IGNvbXByZXNzaW9uTGV2ZWwsCisgICAgICAgICAgICBBdWRpb0VuY29kaW5nIGVuY29kaW5nKTsKIAogICAgIHN0YXR1c190IHNldHVwUmF3QXVkaW9Gb3JtYXQoCiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IG51bUNoYW5uZWxzLApAQCAtNDc2LDYgKzQ5OCw3IEBACiAgICAgc3RhdHVzX3Qgc2V0UHJpb3JpdHkoaW50MzJfdCBwcmlvcml0eSk7CiAgICAgc3RhdHVzX3Qgc2V0TGF0ZW5jeSh1aW50MzJfdCBsYXRlbmN5KTsKICAgICBzdGF0dXNfdCBnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KTsKKyAgICBzdGF0dXNfdCBzZXRBdWRpb1ByZXNlbnRhdGlvbihpbnQzMl90IHByZXNlbnRhdGlvbklkLCBpbnQzMl90IHByb2dyYW1JZCk7CiAgICAgc3RhdHVzX3Qgc2V0T3BlcmF0aW5nUmF0ZShmbG9hdCByYXRlRmxvYXQsIGJvb2wgaXNWaWRlbyk7CiAgICAgc3RhdHVzX3QgZ2V0SW50cmFSZWZyZXNoUGVyaW9kKHVpbnQzMl90ICppbnRyYVJlZnJlc2hQZXJpb2QpOwogICAgIHN0YXR1c190IHNldEludHJhUmVmcmVzaFBlcmlvZCh1aW50MzJfdCBpbnRyYVJlZnJlc2hQZXJpb2QsIGJvb2wgaW5Db25maWd1cmUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaAppbmRleCAyMDZkMzIyLi5iMGUzMmQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oCkBAIC02OSw2ICs2OSw3IEBACiAKICAgICBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcyk7CiAKKyAgICBzdGF0dXNfdCBnZXRQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSBjb25zdDsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkF1ZGlvU291cmNlKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyRmlsZVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DbGVhckZpbGVTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTgzNzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DbGVhckZpbGVTb3VyY2UuaApAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUl9GSUxFX1NPVVJDRV9IXworCisjZGVmaW5lIENMRUFSX0ZJTEVfU09VUkNFX0hfCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIENsZWFyRmlsZVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlIHsKK3B1YmxpYzoKKyAgICBDbGVhckZpbGVTb3VyY2UoY29uc3QgY2hhciAqZmlsZW5hbWUpOworICAgIC8vIENsZWFyRmlsZVNvdXJjZSB0YWtlcyBvd25lcnNoaXAgYW5kIHdpbGwgY2xvc2UgdGhlIGZkCisgICAgQ2xlYXJGaWxlU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgeworICAgICAgICByZXR1cm4ga0lzTG9jYWxGaWxlU291cmNlOworICAgIH0KKworICAgIHZpcnR1YWwgU3RyaW5nOCB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIG1OYW1lOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkNsZWFyRmlsZVNvdXJjZSgpOworICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXRfbChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgaW50IG1GZDsKKyAgICBpbnQ2NF90IG1PZmZzZXQ7CisgICAgaW50NjRfdCBtTGVuZ3RoOworICAgIE11dGV4IG1Mb2NrOworCitwcml2YXRlOgorICAgIFN0cmluZzggbU5hbWU7CisKKyAgICBDbGVhckZpbGVTb3VyY2UoY29uc3QgQ2xlYXJGaWxlU291cmNlICYpOworICAgIENsZWFyRmlsZVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IENsZWFyRmlsZVNvdXJjZSAmKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ0xFQVJfRklMRV9TT1VSQ0VfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DbGVhck1lZGlhSFRUUC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DbGVhck1lZGlhSFRUUC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyOTA3YTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyTWVkaWFIVFRQLmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0xFQVJfTUVESUFfSFRUUF9IXworCisjZGVmaW5lIENMRUFSX01FRElBX0hUVFBfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorCisjaW5jbHVkZSAiaW5jbHVkZS9IVFRQQmFzZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBNZWRpYUhUVFBDb25uZWN0aW9uOworCitzdHJ1Y3QgQ2xlYXJNZWRpYUhUVFAgOiBwdWJsaWMgSFRUUEJhc2UgeworICAgIENsZWFyTWVkaWFIVFRQKGNvbnN0IHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+ICZjb25uKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAorICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQpOworCisgICAgdmlydHVhbCB2b2lkIGNsb3NlKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKKworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVjb25uZWN0QXRPZmZzZXQob2ZmNjRfdCBvZmZzZXQpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+Q2xlYXJNZWRpYUhUVFAoKTsKKworICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRVcmkoKTsKKyAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdDsKKworICAgIEFTdHJpbmcgbUxhc3RVUkk7CisKK3ByaXZhdGU6CisgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKKyAgICBzcDxNZWRpYUhUVFBDb25uZWN0aW9uPiBtSFRUUENvbm5lY3Rpb247CisKKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtTGFzdEhlYWRlcnM7CisKKyAgICBib29sIG1DYWNoZWRTaXplVmFsaWQ7CisgICAgb2ZmNjRfdCBtQ2FjaGVkU2l6ZTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENsZWFyTWVkaWFIVFRQKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ0xFQVJfTUVESUFfSFRUUF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oCmluZGV4IDViMzU0M2QuLjc1YjBkOGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmgKQEAgLTM1LDIxICszNSwzMiBAQAogCiAgICAgYm9vbCBpc0RzdFJHQigpIGNvbnN0OwogCisgICAgdm9pZCBzZXRTcmNDb2xvclNwYWNlKHVpbnQzMl90IHN0YW5kYXJkLCB1aW50MzJfdCByYW5nZSwgdWludDMyX3QgdHJhbnNmZXIpOworCiAgICAgc3RhdHVzX3QgY29udmVydCgKICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnNyY0JpdHMsCi0gICAgICAgICAgICBzaXplX3Qgc3JjV2lkdGgsIHNpemVfdCBzcmNIZWlnaHQsCisgICAgICAgICAgICBzaXplX3Qgc3JjV2lkdGgsIHNpemVfdCBzcmNIZWlnaHQsIHNpemVfdCBzcmNTdHJpZGUsCiAgICAgICAgICAgICBzaXplX3Qgc3JjQ3JvcExlZnQsIHNpemVfdCBzcmNDcm9wVG9wLAogICAgICAgICAgICAgc2l6ZV90IHNyY0Nyb3BSaWdodCwgc2l6ZV90IHNyY0Nyb3BCb3R0b20sCiAgICAgICAgICAgICB2b2lkICpkc3RCaXRzLAotICAgICAgICAgICAgc2l6ZV90IGRzdFdpZHRoLCBzaXplX3QgZHN0SGVpZ2h0LAorICAgICAgICAgICAgc2l6ZV90IGRzdFdpZHRoLCBzaXplX3QgZHN0SGVpZ2h0LCBzaXplX3QgZHN0U3RyaWRlLAogICAgICAgICAgICAgc2l6ZV90IGRzdENyb3BMZWZ0LCBzaXplX3QgZHN0Q3JvcFRvcCwKICAgICAgICAgICAgIHNpemVfdCBkc3RDcm9wUmlnaHQsIHNpemVfdCBkc3RDcm9wQm90dG9tKTsKIAogcHJpdmF0ZToKKyAgICBzdHJ1Y3QgQ29sb3JTcGFjZSB7CisgICAgICAgIHVpbnQzMl90IG1TdGFuZGFyZDsKKyAgICAgICAgdWludDMyX3QgbVJhbmdlOworICAgICAgICB1aW50MzJfdCBtVHJhbnNmZXI7CisKKyAgICAgICAgYm9vbCBpc0J0NzA5KCk7CisgICAgICAgIGJvb2wgaXNKcGVnKCk7CisgICAgfTsKKwogICAgIHN0cnVjdCBCaXRtYXBQYXJhbXMgewogICAgICAgICBCaXRtYXBQYXJhbXMoCiAgICAgICAgICAgICAgICAgdm9pZCAqYml0cywKLSAgICAgICAgICAgICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsCisgICAgICAgICAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LCBzaXplX3Qgc3RyaWRlLAogICAgICAgICAgICAgICAgIHNpemVfdCBjcm9wTGVmdCwgc2l6ZV90IGNyb3BUb3AsCiAgICAgICAgICAgICAgICAgc2l6ZV90IGNyb3BSaWdodCwgc2l6ZV90IGNyb3BCb3R0b20sCiAgICAgICAgICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGcm9tYXQpOwpAQCAtNjUsNiArNzYsNyBAQAogICAgIH07CiAKICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBtU3JjRm9ybWF0LCBtRHN0Rm9ybWF0OworICAgIENvbG9yU3BhY2UgbVNyY0NvbG9yU3BhY2U7CiAgICAgdWludDhfdCAqbUNsaXA7CiAKICAgICB1aW50OF90ICppbml0Q2xpcCgpOwpAQCAtNzgsNiArOTAsOSBAQAogICAgIHN0YXR1c190IGNvbnZlcnRZVVY0MjBQbGFuYXJVc2VMaWJZVVYoCiAgICAgICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpOwogCisgICAgc3RhdHVzX3QgY29udmVydFlVVjQyMFNlbWlQbGFuYXJVc2VMaWJZVVYoCisgICAgICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpOworCiAgICAgc3RhdHVzX3QgY29udmVydFlVVjQyMFBsYW5hcjE2KAogICAgICAgICAgICAgY29uc3QgQml0bWFwUGFyYW1zICZzcmMsIGNvbnN0IEJpdG1hcFBhcmFtcyAmZHN0KTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaAppbmRleCA4NjA0ODkwLi5iNjEwZWVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaApAQCAtMjAsNDcgKzIwLDI5IEBACiAKICNpbmNsdWRlIDxzdGRpby5oPgogCi0jaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyRmlsZVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogI2luY2x1ZGUgPGRybS9Ecm1NYW5hZ2VyQ2xpZW50Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgRmlsZVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlIHsKK2NsYXNzIEZpbGVTb3VyY2UgOiBwdWJsaWMgQ2xlYXJGaWxlU291cmNlIHsKIHB1YmxpYzoKICAgICBGaWxlU291cmNlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKICAgICAvLyBGaWxlU291cmNlIHRha2VzIG93bmVyc2hpcCBhbmQgd2lsbCBjbG9zZSB0aGUgZmQKICAgICBGaWxlU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7Ci0KICAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7Ci0KLSAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgewotICAgICAgICByZXR1cm4ga0lzTG9jYWxGaWxlU291cmNlOwotICAgIH0KLQogICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gRHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciAqbWltZSk7CiAKLSAgICB2aXJ0dWFsIFN0cmluZzggdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBtTmFtZTsKLSAgICB9Ci0KICAgICBzdGF0aWMgYm9vbCByZXF1aXJlc0RybShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCwgY29uc3QgY2hhciAqbWltZSk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5GaWxlU291cmNlKCk7CiAKIHByaXZhdGU6Ci0gICAgaW50IG1GZDsKLSAgICBpbnQ2NF90IG1PZmZzZXQ7Ci0gICAgaW50NjRfdCBtTGVuZ3RoOwotICAgIE11dGV4IG1Mb2NrOwotICAgIFN0cmluZzggbU5hbWU7Ci0KICAgICAvKmZvciBEUk0qLwogICAgIHNwPERlY3J5cHRIYW5kbGU+IG1EZWNyeXB0SGFuZGxlOwogICAgIERybU1hbmFnZXJDbGllbnQgKm1Ecm1NYW5hZ2VyQ2xpZW50OwpAQCAtNjgsNyArNTAsNyBAQAogICAgIHNzaXplX3QgbURybUJ1ZlNpemU7CiAgICAgdW5zaWduZWQgY2hhciAqbURybUJ1ZjsKIAotICAgIHNzaXplX3QgcmVhZEF0RFJNKG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgc3NpemVfdCByZWFkQXREUk1fbChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwogCiAgICAgRmlsZVNvdXJjZShjb25zdCBGaWxlU291cmNlICYpOwogICAgIEZpbGVTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBGaWxlU291cmNlICYpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oCmluZGV4IGYwZWJkNDguLmI4M2E5NTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmgKQEAgLTE4LDcgKzE4LDYgQEAKICNkZWZpbmUgSU5URVJGQUNFX1VUSUxTX0hfCiAKICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmgKaW5kZXggZjE4OTQwZC4uMWFiZWY4YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaApAQCAtMTEwLDYgKzExMCw3IEBACiAgICAgdWludDMyX3QgbUludGVybGVhdmVEdXJhdGlvblVzOwogICAgIGludDMyX3QgbVRpbWVTY2FsZTsKICAgICBpbnQ2NF90IG1TdGFydFRpbWVzdGFtcFVzOworICAgIGludDMyX3QgbVN0YXJ0VGltZU9mZnNldEJGcmFtZXNVczsgLy8gU3RhcnQgdGltZSBvZmZzZXQgd2hlbiBCIEZyYW1lcyBhcmUgcHJlc2VudAogICAgIGludCBtTGF0aXR1ZGV4MTAwMDA7CiAgICAgaW50IG1Mb25naXR1ZGV4MTAwMDA7CiAgICAgYm9vbCBtQXJlR2VvVGFnc0F2YWlsYWJsZTsKQEAgLTEyOSw2ICsxMzAsNyBAQAogCiAgICAgdm9pZCBzZXRTdGFydFRpbWVzdGFtcFVzKGludDY0X3QgdGltZVVzKTsKICAgICBpbnQ2NF90IGdldFN0YXJ0VGltZXN0YW1wVXMoKTsgIC8vIE5vdCBjb25zdAorICAgIGludDMyX3QgZ2V0U3RhcnRUaW1lT2Zmc2V0QkZyYW1lc1VzKCk7CiAgICAgc3RhdHVzX3Qgc3RhcnRUcmFja3MoTWV0YURhdGEgKnBhcmFtcyk7CiAgICAgc2l6ZV90IG51bVRyYWNrcygpOwogICAgIGludDY0X3QgZXN0aW1hdGVNb292Qm94U2l6ZShpbnQzMl90IGJpdFJhdGUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaAppbmRleCAzZWY0YzBlLi45ODRjMjNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaApAQCAtMTM1LDYgKzEzNSw4IEBACiBjb25zdGV4cHIgaW50MzJfdCBWUDlQcm9maWxlMyA9IDB4MDg7CiBjb25zdGV4cHIgaW50MzJfdCBWUDlQcm9maWxlMkhEUiA9IDB4MTAwMDsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUzSERSID0gMHgyMDAwOworY29uc3RleHByIGludDMyX3QgVlA5UHJvZmlsZTJIRFIxMFBsdXMgPSAweDQwMDA7Citjb25zdGV4cHIgaW50MzJfdCBWUDlQcm9maWxlM0hEUjEwUGx1cyA9IDB4ODAwMDsKIAogY29uc3RleHByIGludDMyX3QgVlA5TGV2ZWwxICA9IDB4MTsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOUxldmVsMTEgPSAweDI7CkBAIC0xNTEsMTAgKzE1Myw0MCBAQAogY29uc3RleHByIGludDMyX3QgVlA5TGV2ZWw2MSA9IDB4MTAwMDsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOUxldmVsNjIgPSAweDIwMDA7CiAKK2NvbnN0ZXhwciBpbnQzMl90IEFWMVByb2ZpbGUwID0gMHgwMTsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMVByb2ZpbGUxID0gMHgwMjsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMVByb2ZpbGUyID0gMHgwNDsKKworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWwyICA9IDB4MTsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsMjEgPSAweDI7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDIyID0gMHg0OworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWwyMyA9IDB4ODsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsMyAgPSAweDEwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWwzMSA9IDB4MjA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDMyID0gMHg0MDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsMzMgPSAweDgwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWw0ICA9IDB4MTAwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWw0MSA9IDB4MjAwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWw0MiA9IDB4NDAwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWw0MyA9IDB4ODAwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWw1ICA9IDB4MTAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNTEgPSAweDIwMDA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDUyID0gMHg0MDAwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWw1MyA9IDB4ODAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNiAgPSAweDEwMDAwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWw2MSA9IDB4MjAwMDA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDYyID0gMHg0MDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNjMgPSAweDgwMDAwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWw3ICA9IDB4MTAwMDAwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWw3MSA9IDB4MjAwMDAwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWw3MiA9IDB4NDAwMDAwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWw3MyA9IDB4ODAwMDAwOworCiBjb25zdGV4cHIgaW50MzJfdCBIRVZDUHJvZmlsZU1haW4gICAgICAgID0gMHgwMTsKIGNvbnN0ZXhwciBpbnQzMl90IEhFVkNQcm9maWxlTWFpbjEwICAgICAgPSAweDAyOwogY29uc3RleHByIGludDMyX3QgSEVWQ1Byb2ZpbGVNYWluU3RpbGwgICA9IDB4MDQ7CiBjb25zdGV4cHIgaW50MzJfdCBIRVZDUHJvZmlsZU1haW4xMEhEUjEwID0gMHgxMDAwOworY29uc3RleHByIGludDMyX3QgSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMFBsdXMgPSAweDIwMDA7CiAKIGNvbnN0ZXhwciBpbnQzMl90IEhFVkNNYWluVGllckxldmVsMSAgPSAweDE7CiBjb25zdGV4cHIgaW50MzJfdCBIRVZDSGlnaFRpZXJMZXZlbDEgID0gMHgyOwpAQCAtMjcwLDYgKzMwMiw3IEBACiAvLyBmcm9tIE1lZGlhRm9ybWF0LmphdmEKIGNvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX1ZJREVPX1ZQOFtdID0gInZpZGVvL3gtdm5kLm9uMi52cDgiOwogY29uc3RleHByIGNoYXIgTUlNRVRZUEVfVklERU9fVlA5W10gPSAidmlkZW8veC12bmQub24yLnZwOSI7Citjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9WSURFT19BVjFbXSA9ICJ2aWRlby9hdjAxIjsKIGNvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX1ZJREVPX0FWQ1tdID0gInZpZGVvL2F2YyI7CiBjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9WSURFT19IRVZDW10gPSAidmlkZW8vaGV2YyI7CiBjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9WSURFT19NUEVHNFtdID0gInZpZGVvL21wNHYtZXMiOwpAQCAtMzI3LDYgKzM2MCw3IEBACiBjb25zdGV4cHIgY2hhciBLRVlfQklUUkFURV9NT0RFW10gPSAiYml0cmF0ZS1tb2RlIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9DQV9TRVNTSU9OX0lEW10gPSAiY2Etc2Vzc2lvbi1pZCI7CiBjb25zdGV4cHIgY2hhciBLRVlfQ0FfU1lTVEVNX0lEW10gPSAiY2Etc3lzdGVtLWlkIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9DQV9QUklWQVRFX0RBVEFbXSA9ICJjYS1wcml2YXRlLWRhdGEiOwogY29uc3RleHByIGNoYXIgS0VZX0NBUFRVUkVfUkFURVtdID0gImNhcHR1cmUtcmF0ZSI7CiBjb25zdGV4cHIgY2hhciBLRVlfQ0hBTk5FTF9DT1VOVFtdID0gImNoYW5uZWwtY291bnQiOwogY29uc3RleHByIGNoYXIgS0VZX0NIQU5ORUxfTUFTS1tdID0gImNoYW5uZWwtbWFzayI7CkBAIC0zNDIsNiArMzc2LDcgQEAKIGNvbnN0ZXhwciBjaGFyIEtFWV9HUklEX0NPTFVNTlNbXSA9ICJncmlkLWNvbHMiOwogY29uc3RleHByIGNoYXIgS0VZX0dSSURfUk9XU1tdID0gImdyaWQtcm93cyI7CiBjb25zdGV4cHIgY2hhciBLRVlfSERSX1NUQVRJQ19JTkZPW10gPSAiaGRyLXN0YXRpYy1pbmZvIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9IRFIxMF9QTFVTX0lORk9bXSA9ICJoZHIxMC1wbHVzLWluZm8iOwogY29uc3RleHByIGNoYXIgS0VZX0hFSUdIVFtdID0gImhlaWdodCI7CiBjb25zdGV4cHIgY2hhciBLRVlfSV9GUkFNRV9JTlRFUlZBTFtdID0gImktZnJhbWUtaW50ZXJ2YWwiOwogY29uc3RleHByIGNoYXIgS0VZX0lOVFJBX1JFRlJFU0hfUEVSSU9EW10gPSAiaW50cmEtcmVmcmVzaC1wZXJpb2QiOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZjE4ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0VYVFJBQ1RPUl9IXworCisjZGVmaW5lIE1FRElBX0VYVFJBQ1RPUl9IXworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIERhdGFTb3VyY2VCYXNlOworY2xhc3MgTWV0YURhdGFCYXNlOworc3RydWN0IE1lZGlhVHJhY2s7CisKKworY2xhc3MgRXh0cmFjdG9yQWxsb2NUcmFja2VyIHsKK3B1YmxpYzoKKyAgICBFeHRyYWN0b3JBbGxvY1RyYWNrZXIoKSB7CisgICAgICAgIEFMT0dEKCJleHRyYWN0b3IgYWxsb2NhdGVkOiAlcCIsIHRoaXMpOworICAgIH0KKyAgICB2aXJ0dWFsIH5FeHRyYWN0b3JBbGxvY1RyYWNrZXIoKSB7CisgICAgICAgIEFMT0dEKCJleHRyYWN0b3IgZnJlZWQ6ICVwIiwgdGhpcyk7CisgICAgfQorfTsKKworY2xhc3MgTWVkaWFFeHRyYWN0b3IKKy8vIDogcHVibGljIEV4dHJhY3RvckFsbG9jVHJhY2tlcgoreworcHVibGljOgorICAgIHZpcnR1YWwgfk1lZGlhRXh0cmFjdG9yKCk7CisgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKSA9IDA7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpID0gMDsKKworICAgIGVudW0gR2V0VHJhY2tNZXRhRGF0YUZsYWdzIHsKKyAgICAgICAga0luY2x1ZGVFeHRlbnNpdmVNZXRhRGF0YSA9IDEKKyAgICB9OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgICAgIE1ldGFEYXRhQmFzZSYgbWV0YSwKKyAgICAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MgPSAwKSA9IDA7CisKKyAgICAvLyBSZXR1cm4gY29udGFpbmVyIHNwZWNpZmljIG1ldGEtZGF0YS4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KKyAgICAvLyByZXR1cm5zIGFuIGVtcHR5IG1ldGFkYXRhIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSkgPSAwOworCisgICAgZW51bSBGbGFncyB7CisgICAgICAgIENBTl9TRUVLX0JBQ0tXQVJEICA9IDEsICAvLyB0aGUgInNlZWsgMTBzZWNzIGJhY2sgYnV0dG9uIgorICAgICAgICBDQU5fU0VFS19GT1JXQVJEICAgPSAyLCAgLy8gdGhlICJzZWVrIDEwc2VjcyBmb3J3YXJkIGJ1dHRvbiIKKyAgICAgICAgQ0FOX1BBVVNFICAgICAgICAgID0gNCwKKyAgICAgICAgQ0FOX1NFRUsgICAgICAgICAgID0gOCwgIC8vIHRoZSAic2VlayBiYXIiCisgICAgfTsKKworICAgIC8vIElmIHN1YmNsYXNzZXMgZG8gX25vdF8gb3ZlcnJpZGUgdGhpcywgdGhlIGRlZmF1bHQgaXMKKyAgICAvLyBDQU5fU0VFS19CQUNLV0FSRCB8IENBTl9TRUVLX0ZPUldBUkQgfCBDQU5fU0VFSyB8IENBTl9QQVVTRQorICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgdWludDhfdCogLypjYXNUb2tlbiovLCBzaXplX3QgLypzaXplKi8pIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiPHVuc3BlY2lmaWVkPiI7IH0KKworcHJvdGVjdGVkOgorICAgIE1lZGlhRXh0cmFjdG9yKCk7CisKK3ByaXZhdGU6CisgICAgTWVkaWFFeHRyYWN0b3IoY29uc3QgTWVkaWFFeHRyYWN0b3IgJik7CisgICAgTWVkaWFFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBNZWRpYUV4dHJhY3RvciAmKTsKK307CisKK2NsYXNzIE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyKENNZWRpYUV4dHJhY3RvciAqcGx1Z2luKTsKKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOworICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzID0gMCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKTsKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiBjYXNUb2tlbiwgc2l6ZV90IHNpemUpOworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcigpOworcHJpdmF0ZToKKyAgICBDTWVkaWFFeHRyYWN0b3IgKnBsdWdpbjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfRVhUUkFDVE9SX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaAppbmRleCBmYjlmNWJkLi5iYTY2MzFjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmgKQEAgLTE5LDEwICsxOSw5IEBACiAjZGVmaW5lIE1FRElBX0VYVFJBQ1RPUl9GQUNUT1JZX0hfCiAKICNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CiAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zNywyMiArMzYsMjggQEAKICAgICAgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUgPSBOVUxMKTsKICAgICBzdGF0aWMgdm9pZCBMb2FkUGx1Z2lucyhjb25zdCA6OnN0ZDo6c3RyaW5nJiBhcGtQYXRoKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworICAgIHN0YXRpYyBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IGdldFN1cHBvcnRlZFR5cGVzKCk7CisgICAgc3RhdGljIHZvaWQgU2V0TGlua2VkTGlicmFyaWVzKGNvbnN0IHN0ZDo6c3RyaW5nJiBsaW5rZWRMaWJyYXJpZXMpOwogCiBwcml2YXRlOgogICAgIHN0YXRpYyBNdXRleCBnUGx1Z2luTXV0ZXg7Ci0gICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+PiBnUGx1Z2luczsKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6bGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+Pj4gZ1BsdWdpbnM7CiAgICAgc3RhdGljIGJvb2wgZ1BsdWdpbnNSZWdpc3RlcmVkOworICAgIHN0YXRpYyBib29sIGdJZ25vcmVWZXJzaW9uOworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnTGlua2VkTGlicmFyaWVzOwogCiAgICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJFeHRyYWN0b3JzSW5BcGsoCi0gICAgICAgICAgICBjb25zdCBjaGFyICphcGtQYXRoLCBMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFwa1BhdGgsIHN0ZDo6bGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCk7CiAgICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJFeHRyYWN0b3JzSW5TeXN0ZW0oCi0gICAgICAgICAgICBjb25zdCBjaGFyICpsaWJEaXJQYXRoLCBMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxpYkRpclBhdGgsIHN0ZDo6bGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCk7CisgICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJFeHRyYWN0b3JzSW5BcGV4KAorICAgICAgICAgICAgY29uc3QgY2hhciAqbGliRGlyUGF0aCwgc3RkOjpsaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KTsKICAgICBzdGF0aWMgdm9pZCBSZWdpc3RlckV4dHJhY3RvcigKLSAgICAgICAgICAgIGNvbnN0IHNwPEV4dHJhY3RvclBsdWdpbj4gJnBsdWdpbiwgTGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCk7CisgICAgICAgICAgICBjb25zdCBzcDxFeHRyYWN0b3JQbHVnaW4+ICZwbHVnaW4sIHN0ZDo6bGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCk7CiAKLSAgICBzdGF0aWMgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIHNuaWZmKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKmZyZWVNZXRhLAotICAgICAgICAgICAgc3A8RXh0cmFjdG9yUGx1Z2luPiAmcGx1Z2luKTsKKyAgICBzdGF0aWMgdm9pZCAqc25pZmYoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwKKyAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLCB2b2lkICoqbWV0YSwgRnJlZU1ldGFGdW5jICpmcmVlTWV0YSwKKyAgICAgICAgICAgIHNwPEV4dHJhY3RvclBsdWdpbj4gJnBsdWdpbiwgdWludDMyX3QgKmNyZWF0b3JWZXJzaW9uKTsKIAogICAgIHN0YXRpYyB2b2lkIFVwZGF0ZUV4dHJhY3RvcnMoY29uc3QgY2hhciAqbmV3VXBkYXRlQXBrUGF0aCk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmgKaW5kZXggZmUwZTYxMy4uYWNhYTZjNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oCkBAIC0xOSw1MCArMTksMjEgQEAKICNkZWZpbmUgTUVESUFfSFRUUF9IXwogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJpbmNsdWRlL0hUVFBCYXNlLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJNZWRpYUhUVFAuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgTWVkaWFIVFRQQ29ubmVjdGlvbjsKIAotc3RydWN0IE1lZGlhSFRUUCA6IHB1YmxpYyBIVFRQQmFzZSB7CitzdHJ1Y3QgTWVkaWFIVFRQIDogcHVibGljIENsZWFyTWVkaWFIVFRQIHsKICAgICBNZWRpYUhUVFAoY29uc3Qgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gJmNvbm4pOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0KAotICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAotICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgICAgICBvZmY2NF90IG9mZnNldCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKLQotICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKLQotICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVjb25uZWN0QXRPZmZzZXQob2ZmNjRfdCBvZmZzZXQpOwotCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TWVkaWFIVFRQKCk7CiAKICAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IERybUluaXRpYWxpemF0aW9uKGNvbnN0IGNoYXIqIG1pbWUpOwotICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRVcmkoKTsKLSAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdDsKIAogcHJpdmF0ZToKLSAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwotICAgIHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+IG1IVFRQQ29ubmVjdGlvbjsKLQotICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1MYXN0SGVhZGVyczsKLSAgICBBU3RyaW5nIG1MYXN0VVJJOwotCi0gICAgYm9vbCBtQ2FjaGVkU2l6ZVZhbGlkOwotICAgIG9mZjY0X3QgbUNhY2hlZFNpemU7Ci0KICAgICBzcDxEZWNyeXB0SGFuZGxlPiBtRGVjcnlwdEhhbmRsZTsKICAgICBEcm1NYW5hZ2VyQ2xpZW50ICptRHJtTWFuYWdlckNsaWVudDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuaAppbmRleCA2NmY0ZDcyLi42OWQ2Y2RlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuaApAQCAtNDksNiArNDksNyBAQAogICAgICAgICBPVVRQVVRfRk9STUFUX1dFQk0gICAgICAgID0gMSwKICAgICAgICAgT1VUUFVUX0ZPUk1BVF9USFJFRV9HUFAgICA9IDIsCiAgICAgICAgIE9VVFBVVF9GT1JNQVRfSEVJRiAgICAgICAgPSAzLAorICAgICAgICBPVVRQVVRfRk9STUFUX09HRyAgICAgICAgID0gNCwKICAgICAgICAgT1VUUFVUX0ZPUk1BVF9MSVNUX0VORCAvLyBtdXN0IGJlIGxhc3QgLSB1c2VkIHRvIHZhbGlkYXRlIGZvcm1hdCB0eXBlCiAgICAgfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaAppbmRleCBkNWE4MDgwLi5kY2FmMjdmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaApAQCAtMjAsMTMgKzIwLDI0IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogCitzdHJ1Y3QgQU1lZGlhRm9ybWF0OworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBQnVmZmVyOwogYm9vbCBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoTWV0YURhdGFCYXNlICZtZXRhLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7Citib29sIE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKworYm9vbCBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoTWV0YURhdGFCYXNlICZtZXRhLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiBib29sIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEsIHVuc2lnbmVkIHByb2ZpbGUsIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXgsCiAgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbik7CiAKK2Jvb2wgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgdW5zaWduZWQgcHJvZmlsZSwgdW5zaWduZWQgc2FtcGxpbmdfZnJlcV9pbmRleCwKKyAgICAgICAgdW5zaWduZWQgY2hhbm5lbF9jb25maWd1cmF0aW9uKTsKKwordm9pZCBwYXJzZVZvcmJpc0NvbW1lbnQoCisgICAgICAgIEFNZWRpYUZvcm1hdCAqZmlsZU1ldGEsIGNvbnN0IGNoYXIgKmNvbW1lbnQsIHNpemVfdCBjb21tZW50TGVuZ3RoKTsKKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBNRVRBX0RBVEFfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmgKaW5kZXggNTRhNzA5NS4uOGRjOGQzOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmgKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaXN0PgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQXVkaW9QcmVzZW50YXRpb25JbmZvLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KQEAgLTY0LDggKzY1LDYgQEAKIAogICAgIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IEhJbnRlcmZhY2VUb2tlbiAmY2FzVG9rZW4pOwogCi0gICAgdm9pZCBkaXNjb25uZWN0KCk7Ci0KICAgICBzaXplX3QgY291bnRUcmFja3MoKSBjb25zdDsKICAgICBzdGF0dXNfdCBnZXRUcmFja0Zvcm1hdChzaXplX3QgaW5kZXgsIHNwPEFNZXNzYWdlPiAqZm9ybWF0LCB1aW50MzJfdCBmbGFncyA9IDApIGNvbnN0OwogCkBAIC05Nyw2ICs5Niw5IEBACiAKICAgICBib29sIGdldENhY2hlZER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMsIGJvb2wgKmVvcykgY29uc3Q7CiAKKyAgICBzdGF0dXNfdCBnZXRBdWRpb1ByZXNlbnRhdGlvbnMoc2l6ZV90IHRyYWNrSWR4LAorICAgICAgICAgICAgQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uICpwcmVzZW50YXRpb25zKSBjb25zdDsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk51TWVkaWFFeHRyYWN0b3IoKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PZ2dXcml0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT2dnV3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM4MzdjZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT2dnV3JpdGVyLmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgT0dHX1dSSVRFUl9IXworCisjZGVmaW5lIE9HR19XUklURVJfSF8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVdyaXRlci5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKworc3RydWN0IE9nZ1N0cmVhbVN0YXRlOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBPZ2dXcml0ZXIgOiBwdWJsaWMgTWVkaWFXcml0ZXIgeworICAgIE9nZ1dyaXRlcihpbnQgZmQpOworCisgICAgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4mIHNvdXJjZSk7CisgICAgdmlydHVhbCBib29sIHJlYWNoZWRFT1MoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhKiBwYXJhbXMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSB7IHJldHVybiByZXNldCgpOyB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOworCitwcm90ZWN0ZWQ6CisgICAgfk9nZ1dyaXRlcigpOworCitwcml2YXRlOgorICAgIGludCBtRmQ7CisgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKKyAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKKyAgICBib29sIG1TdGFydGVkID0gZmFsc2U7CisgICAgdm9sYXRpbGUgYm9vbCBtUGF1c2VkID0gZmFsc2U7CisgICAgdm9sYXRpbGUgYm9vbCBtUmVzdW1lZCA9IGZhbHNlOworICAgIHZvbGF0aWxlIGJvb2wgbURvbmU7CisgICAgdm9sYXRpbGUgYm9vbCBtUmVhY2hlZEVPUzsKKyAgICBwdGhyZWFkX3QgbVRocmVhZDsKKyAgICBpbnQ2NF90IG1TYW1wbGVSYXRlOworICAgIGludDY0X3QgbUVzdGltYXRlZFNpemVCeXRlczsKKyAgICBpbnQ2NF90IG1Fc3RpbWF0ZWREdXJhdGlvblVzOworCisgICAgc3RhdGljIHZvaWQqIFRocmVhZFdyYXBwZXIodm9pZCopOworICAgIHN0YXR1c190IHRocmVhZEZ1bmMoKTsKKyAgICBib29sIGV4Y2VlZHNGaWxlU2l6ZUxpbWl0KCk7CisgICAgYm9vbCBleGNlZWRzRmlsZUR1cmF0aW9uTGltaXQoKTsKKyAgICBzdGF0dXNfdCByZXNldCgpOworCisgICAgaW50MzJfdCBtQ3VycmVudFBhY2tldElkOworICAgIE9nZ1N0cmVhbVN0YXRlKiBtT3MgPSBudWxscHRyOworCisgICAgT2dnV3JpdGVyKGNvbnN0IE9nZ1dyaXRlciYpOworICAgIE9nZ1dyaXRlciYgb3BlcmF0b3I9KGNvbnN0IE9nZ1dyaXRlciYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBPR0dfV1JJVEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmgKaW5kZXggNTA5ZTY2OS4uOTkyNTExNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFFeHRyYWN0b3IuaApAQCAtMTgsNyArMTgsNyBAQAogI2RlZmluZSBSRU1PVEVfTUVESUFfRVhUUkFDVE9SX0hfCiAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhU291cmNlLmgKaW5kZXggMWQ3MjBhZi4uMDNkMzg2OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuaApAQCAtMzcsMTIgKzM3LDEzIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAogICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLAogICAgICAgICAgICAgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBib29sIHN1cHBvcnROb25ibG9ja2luZ1JlYWQoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdG9wVGltZVVzKGludDY0X3Qgc3RvcFRpbWVVcyk7CiAKIHByaXZhdGU6CiAgICAgc3A8UmVtb3RlTWVkaWFFeHRyYWN0b3I+IG1FeHRyYWN0b3I7Ci0gICAgTWVkaWFUcmFjayAqbVNvdXJjZTsKKyAgICBNZWRpYVRyYWNrICptVHJhY2s7CiAgICAgc3A8UmVmQmFzZT4gbUV4dHJhY3RvclBsdWdpbjsKIAogICAgIGV4cGxpY2l0IFJlbW90ZU1lZGlhU291cmNlKApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oCmluZGV4IDZhMjhlMGIuLmU4ZTBhMTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmgKQEAgLTMwLDYgKzMwLDggQEAKIAogc3RydWN0IEFNZXNzYWdlOwogc3RhdHVzX3QgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKAorICAgICAgICBjb25zdCBNZXRhRGF0YUJhc2UgKm1ldGEsIHNwPEFNZXNzYWdlPiAqZm9ybWF0KTsKK3N0YXR1c190IGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZSgKICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhLCBzcDxBTWVzc2FnZT4gKmZvcm1hdCk7CiB2b2lkIGNvbnZlcnRNZXNzYWdlVG9NZXRhRGF0YSgKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIHNwPE1ldGFEYXRhPiAmbWV0YSk7CkBAIC01MCw2ICs1MiwxMCBAQAogLy8gU2VuZCBpbmZvcm1hdGlvbiBmcm9tIE1ldGFEYXRhIHRvIHRoZSBIQUwgdmlhIEF1ZGlvU2luawogc3RhdHVzX3Qgc2VuZE1ldGFEYXRhVG9IYWwoc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+JiBzaW5rLCBjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEpOwogCisvLyBSZXR1cm4gfGF1ZGlvX29mZmxvYWRfaW5mb190fCBmaWxsZWQgZnJvbSBnaXZlbiBtZXRhZGF0YQorc3RhdHVzX3QgZ2V0QXVkaW9PZmZsb2FkSW5mbyhjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEsIGJvb2wgaGFzVmlkZW8sCisgICAgICAgIGJvb2wgaXNTdHJlYW1pbmcsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKmluZm8pOworCiAvLyBDaGVjayB3aGV0aGVyIHRoZSBzdHJlYW0gZGVmaW5lZCBieSBtZXRhIGNhbiBiZSBvZmZsb2FkZWQgdG8gaGFyZHdhcmUKIGJvb2wgY2FuT2ZmbG9hZFN0cmVhbShjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEsIGJvb2wgaGFzVmlkZW8sCiAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1N0cmVhbWluZywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmgKaW5kZXggOWQ5N2RmZC4uZmNmY2JlYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMTQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNyw4NyArMTcsMjQgQEAKICNpZm5kZWYgVklERU9fRlJBTUVfU0NIRURVTEVSX0hfCiAjZGVmaW5lIFZJREVPX0ZSQU1FX1NDSEVEVUxFUl9IXwogCi0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgSVN1cmZhY2VDb21wb3NlcjsKIAotc3RydWN0IFZpZGVvRnJhbWVTY2hlZHVsZXIgOiBwdWJsaWMgUmVmQmFzZSB7CitzdHJ1Y3QgVmlkZW9GcmFtZVNjaGVkdWxlciA6IHB1YmxpYyBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSB7CiAgICAgVmlkZW9GcmFtZVNjaGVkdWxlcigpOwotCi0gICAgLy8gKHJlKWluaXRpYWxpemUgc2NoZWR1bGVyCi0gICAgdm9pZCBpbml0KGZsb2F0IHZpZGVvRnBzID0gLTEpOwotICAgIC8vIHVzZSBpbiBjYXNlIG9mIHZpZGVvIHJlbmRlci10aW1lIGRpc2NvbnRpbnVpdHksIGUuZy4gc2VlawotICAgIHZvaWQgcmVzdGFydCgpOwotICAgIC8vIGdldCBhZGp1c3RlZCBuYW5vdGltZSBmb3IgYSB2aWRlbyBmcmFtZSByZW5kZXIgYXQgcmVuZGVyVGltZQotICAgIG5zZWNzX3Qgc2NoZWR1bGUobnNlY3NfdCByZW5kZXJUaW1lKTsKLQotICAgIC8vIHJldHVybnMgdGhlIHZzeW5jIHBlcmlvZCBmb3IgdGhlIG1haW4gZGlzcGxheQotICAgIG5zZWNzX3QgZ2V0VnN5bmNQZXJpb2QoKTsKLQotICAgIC8vIHJldHVybnMgdGhlIGN1cnJlbnQgZnJhbWVzLXBlci1zZWNvbmQsIG9yIDAuZiBpZiBub3QgcHJpbWVkCi0gICAgZmxvYXQgZ2V0RnJhbWVSYXRlKCk7Ci0KLSAgICB2b2lkIHJlbGVhc2UoKTsKLQotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0hpc3RvcnlTaXplID0gODsKKyAgICB2b2lkIHJlbGVhc2UoKSBvdmVycmlkZTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgflZpZGVvRnJhbWVTY2hlZHVsZXIoKTsKIAogcHJpdmF0ZToKLSAgICBzdHJ1Y3QgUExMIHsKLSAgICAgICAgUExMKCk7Ci0KLSAgICAgICAgLy8gcmVzZXQgUExMIHRvIG5ldyBQTEwKLSAgICAgICAgdm9pZCByZXNldChmbG9hdCBmcHMgPSAtMSk7Ci0gICAgICAgIC8vIGtlZXAgY3VycmVudCBlc3RpbWF0ZSwgYnV0IHJlc3RhcnQgcGhhc2UKLSAgICAgICAgdm9pZCByZXN0YXJ0KCk7Ci0gICAgICAgIC8vIHJldHVybnMgcGVyaW9kIG9yIDAgaWYgbm90IHlldCBwcmltZWQKLSAgICAgICAgbnNlY3NfdCBhZGRTYW1wbGUobnNlY3NfdCB0aW1lKTsKLSAgICAgICAgbnNlY3NfdCBnZXRQZXJpb2QoKSBjb25zdDsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIG5zZWNzX3QgbVBlcmlvZDsKLSAgICAgICAgbnNlY3NfdCBtUGhhc2U7Ci0KLSAgICAgICAgYm9vbCAgICBtUHJpbWVkOyAgICAgICAgLy8gaGF2ZSBhbiBlc3RpbWF0ZSBmb3IgdGhlIHBlcmlvZAotICAgICAgICBzaXplX3QgIG1TYW1wbGVzVXNlZEZvclByaW1pbmc7Ci0KLSAgICAgICAgbnNlY3NfdCBtTGFzdFRpbWU7ICAgICAgLy8gbGFzdCBpbnB1dCB0aW1lCi0gICAgICAgIG5zZWNzX3QgbVJlZml0QXQ7ICAgICAgIC8vIG5leHQgaW5wdXQgdGltZSB0byBmaXQgYXQKLQotICAgICAgICBzaXplX3QgIG1OdW1TYW1wbGVzOyAgICAvLyBjYW4gZ28gcGFzdCBrSGlzdG9yeVNpemUKLSAgICAgICAgbnNlY3NfdCBtVGltZXNba0hpc3RvcnlTaXplXTsKLQotICAgICAgICB2b2lkIHRlc3QoKTsKLSAgICAgICAgLy8gcmV0dXJucyB3aGV0aGVyIGZpdCB3YXMgc3VjY2Vzc2Z1bAotICAgICAgICBib29sIGZpdChuc2Vjc190IHBoYXNlLCBuc2Vjc190IHBlcmlvZCwgc2l6ZV90IG51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgaW50NjRfdCAqYSwgaW50NjRfdCAqYiwgaW50NjRfdCAqZXJyKTsKLSAgICAgICAgdm9pZCBwcmltZShzaXplX3QgbnVtU2FtcGxlcyk7Ci0gICAgfTsKLQotICAgIHZvaWQgdXBkYXRlVnN5bmMoKTsKLQotICAgIG5zZWNzX3QgbVZzeW5jVGltZTsgICAgICAgIC8vIHZzeW5jIHRpbWluZyBmcm9tIGRpc3BsYXkKLSAgICBuc2Vjc190IG1Wc3luY1BlcmlvZDsKLSAgICBuc2Vjc190IG1Wc3luY1JlZnJlc2hBdDsgICAvLyBuZXh0IHRpbWUgdG8gcmVmcmVzaCB0aW1pbmcgaW5mbwotCi0gICAgbnNlY3NfdCBtTGFzdFZzeW5jVGltZTsgICAgLy8gZXN0aW1hdGVkIHZzeW5jIHRpbWUgZm9yIGxhc3QgZnJhbWUKLSAgICBuc2Vjc190IG1UaW1lQ29ycmVjdGlvbjsgICAvLyBydW5uaW5nIGFkanVzdG1lbnQKLQotICAgIFBMTCBtUGxsOyAgICAgICAgICAgICAgICAgIC8vIFBMTCBmb3IgdmlkZW8gZnJhbWUgcmF0ZSBiYXNlZCBvbiByZW5kZXIgdGltZQotCisgICAgdm9pZCB1cGRhdGVWc3luYygpIG92ZXJyaWRlOwogICAgIHNwPElTdXJmYWNlQ29tcG9zZXI+IG1Db21wb3NlcjsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFZpZGVvRnJhbWVTY2hlZHVsZXIpOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBWSURFT19GUkFNRV9TQ0hFRFVMRVJfSF8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyMi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOTExY2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIyLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBWSURFT19GUkFNRV9TQ0hFRFVMRVJfMl9IXworI2RlZmluZSBWSURFT19GUkFNRV9TQ0hFRFVMRVJfMl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBWc3luY1RyYWNrZXI7CitzdHJ1Y3QgQ2hvcmVvZ3JhcGhlclRocmVhZDsKKworc3RydWN0IFZpZGVvRnJhbWVTY2hlZHVsZXIyIDogcHVibGljIFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlIHsKKyAgICBWaWRlb0ZyYW1lU2NoZWR1bGVyMigpOworICAgIHZvaWQgcmVsZWFzZSgpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+VmlkZW9GcmFtZVNjaGVkdWxlcjIoKTsKKworcHJpdmF0ZToKKyAgICB2b2lkIHVwZGF0ZVZzeW5jKCkgb3ZlcnJpZGU7CisKKyAgICBsb25nIG1BcHBWc3luY09mZnNldDsKKyAgICBsb25nIG1TZlZzeW5jT2Zmc2V0OworICAgIHNwPFZzeW5jVHJhY2tlcj4gbVZzeW5jVHJhY2tlcjsKKyAgICBzcDxDaG9yZW9ncmFwaGVyVGhyZWFkPiBtQ2hvcmVvZ3JhcGhlclRocmVhZDsKKyAgICBNdXRleCBtTG9jazsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gVklERU9fRlJBTUVfU0NIRURVTEVSXzJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjVmNzE2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZS5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFZJREVPX0ZSQU1FX1NDSEVEVUxFUl9CQVNFX0hfCisjZGVmaW5lIFZJREVPX0ZSQU1FX1NDSEVEVUxFUl9CQVNFX0hfCisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlIDogcHVibGljIFJlZkJhc2UgeworICAgIFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlKCk7CisKKyAgICAvLyAocmUpaW5pdGlhbGl6ZSBzY2hlZHVsZXIKKyAgICB2b2lkIGluaXQoZmxvYXQgdmlkZW9GcHMgPSAtMSk7CisgICAgLy8gdXNlIGluIGNhc2Ugb2YgdmlkZW8gcmVuZGVyLXRpbWUgZGlzY29udGludWl0eSwgZS5nLiBzZWVrCisgICAgdm9pZCByZXN0YXJ0KCk7CisgICAgLy8gZ2V0IGFkanVzdGVkIG5hbm90aW1lIGZvciBhIHZpZGVvIGZyYW1lIHJlbmRlciBhdCByZW5kZXJUaW1lCisgICAgbnNlY3NfdCBzY2hlZHVsZShuc2Vjc190IHJlbmRlclRpbWUpOworCisgICAgLy8gcmV0dXJucyB0aGUgdnN5bmMgcGVyaW9kIGZvciB0aGUgbWFpbiBkaXNwbGF5CisgICAgbnNlY3NfdCBnZXRWc3luY1BlcmlvZCgpOworCisgICAgLy8gcmV0dXJucyB0aGUgY3VycmVudCBmcmFtZXMtcGVyLXNlY29uZCwgb3IgMC5mIGlmIG5vdCBwcmltZWQKKyAgICBmbG9hdCBnZXRGcmFtZVJhdGUoKTsKKworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCkgPSAwOworCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrSGlzdG9yeVNpemUgPSA4OworICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtOYW5vc0luMXMgPSAxMDAwMDAwMDAwOworICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtEZWZhdWx0VnN5bmNQZXJpb2QgPSBrTmFub3NJbjFzIC8gNjA7ICAvLyA2MEh6CisgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga1ZzeW5jUmVmcmVzaFBlcmlvZCA9IGtOYW5vc0luMXM7ICAgICAgIC8vIDEgc2VjCisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5WaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSgpOworCisgICAgbnNlY3NfdCBtVnN5bmNUaW1lOyAgICAgICAgLy8gdnN5bmMgdGltaW5nIGZyb20gZGlzcGxheQorICAgIG5zZWNzX3QgbVZzeW5jUGVyaW9kOworICAgIG5zZWNzX3QgbVZzeW5jUmVmcmVzaEF0OyAgIC8vIG5leHQgdGltZSB0byByZWZyZXNoIHRpbWluZyBpbmZvCisKK3ByaXZhdGU6CisgICAgc3RydWN0IFBMTCB7CisgICAgICAgIFBMTCgpOworCisgICAgICAgIC8vIHJlc2V0IFBMTCB0byBuZXcgUExMCisgICAgICAgIHZvaWQgcmVzZXQoZmxvYXQgZnBzID0gLTEpOworICAgICAgICAvLyBrZWVwIGN1cnJlbnQgZXN0aW1hdGUsIGJ1dCByZXN0YXJ0IHBoYXNlCisgICAgICAgIHZvaWQgcmVzdGFydCgpOworICAgICAgICAvLyByZXR1cm5zIHBlcmlvZCBvciAwIGlmIG5vdCB5ZXQgcHJpbWVkCisgICAgICAgIG5zZWNzX3QgYWRkU2FtcGxlKG5zZWNzX3QgdGltZSk7CisgICAgICAgIG5zZWNzX3QgZ2V0UGVyaW9kKCkgY29uc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgICBuc2Vjc190IG1QZXJpb2Q7CisgICAgICAgIG5zZWNzX3QgbVBoYXNlOworCisgICAgICAgIGJvb2wgICAgbVByaW1lZDsgICAgICAgIC8vIGhhdmUgYW4gZXN0aW1hdGUgZm9yIHRoZSBwZXJpb2QKKyAgICAgICAgc2l6ZV90ICBtU2FtcGxlc1VzZWRGb3JQcmltaW5nOworCisgICAgICAgIG5zZWNzX3QgbUxhc3RUaW1lOyAgICAgIC8vIGxhc3QgaW5wdXQgdGltZQorICAgICAgICBuc2Vjc190IG1SZWZpdEF0OyAgICAgICAvLyBuZXh0IGlucHV0IHRpbWUgdG8gZml0IGF0CisKKyAgICAgICAgc2l6ZV90ICBtTnVtU2FtcGxlczsgICAgLy8gY2FuIGdvIHBhc3Qga0hpc3RvcnlTaXplCisgICAgICAgIG5zZWNzX3QgbVRpbWVzW2tIaXN0b3J5U2l6ZV07CisKKyAgICAgICAgdm9pZCB0ZXN0KCk7CisgICAgICAgIC8vIHJldHVybnMgd2hldGhlciBmaXQgd2FzIHN1Y2Nlc3NmdWwKKyAgICAgICAgYm9vbCBmaXQobnNlY3NfdCBwaGFzZSwgbnNlY3NfdCBwZXJpb2QsIHNpemVfdCBudW1TYW1wbGVzLAorICAgICAgICAgICAgICAgIGludDY0X3QgKmEsIGludDY0X3QgKmIsIGludDY0X3QgKmVycik7CisgICAgICAgIHZvaWQgcHJpbWUoc2l6ZV90IG51bVNhbXBsZXMpOworICAgIH07CisKKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlVnN5bmMoKSA9IDA7CisKKyAgICBuc2Vjc190IG1MYXN0VnN5bmNUaW1lOyAgICAvLyBlc3RpbWF0ZWQgdnN5bmMgdGltZSBmb3IgbGFzdCBmcmFtZQorICAgIG5zZWNzX3QgbVRpbWVDb3JyZWN0aW9uOyAgIC8vIHJ1bm5pbmcgYWRqdXN0bWVudAorICAgIFBMTCBtUGxsOyAgICAgICAgICAgICAgICAgIC8vIFBMTCBmb3IgdmlkZW8gZnJhbWUgcmF0ZSBiYXNlZCBvbiByZW5kZXIgdGltZQorCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBWSURFT19GUkFNRV9TQ0hFRFVMRVJfQkFTRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwCmluZGV4IDVjYzUwOTMuLjM0NWY4NWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKQEAgLTIzLDEwICsyMywxMCBAQAogI2luY2x1ZGUgIkVTUXVldWUuaCIKIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzL25hdGl2ZS8xLjAvSURlc2NyYW1ibGVyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL2FsbG9jYXRvci8xLjAvSUFsbG9jYXRvci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tZW1vcnkvMS4wL0lNZW1vcnkuaD4KICNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgotI2luY2x1ZGUgPGhpZGxtZW1vcnkvRnJhbWV3b3JrVXRpbHMuaD4KKyNpbmNsdWRlIDxoaWRsbWVtb3J5L21hcHBpbmcuaD4KICNpbmNsdWRlIDxtZWRpYS9jYXMvRGVzY3JhbWJsZXJBUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KQEAgLTQ2LDEyICs0NiwxMyBAQAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLXVzaW5nIGhhcmR3YXJlOjpmcm9tSGVhcDsKIHVzaW5nIGhhcmR3YXJlOjpoaWRsX3N0cmluZzsKIHVzaW5nIGhhcmR3YXJlOjpoaWRsX3ZlYzsKLXVzaW5nIGhhcmR3YXJlOjpIaWRsTWVtb3J5OwordXNpbmcgaGFyZHdhcmU6OmhpZGxfbWVtb3J5OwogdXNpbmcgbmFtZXNwYWNlIGhhcmR3YXJlOjpjYXM6OlYxXzA7CiB1c2luZyBuYW1lc3BhY2UgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOwordHlwZWRlZiBoaWRsOjphbGxvY2F0b3I6OlYxXzA6OklBbGxvY2F0b3IgVEFsbG9jYXRvcjsKK3R5cGVkZWYgaGlkbDo6bWVtb3J5OjpWMV8wOjpJTWVtb3J5IFRNZW1vcnk7CiAKIC8vIEkgd2FudCB0aGUgZXhwcmVzc2lvbiAieSIgZXZhbHVhdGVkIGV2ZW4gaWYgdmVyYm9zZSBsb2dnaW5nIGlzIG9mZi4KICNkZWZpbmUgTVlfTE9HVih4LCB5KSBcCkBAIC0xMTcsMTUgKzExOCwxMiBAQAogICAgIHZvaWQgc2lnbmFsTmV3U2FtcGxlQWVzS2V5KGNvbnN0IHNwPEFNZXNzYWdlPiAma2V5SXRlbSk7CiAKIHByaXZhdGU6Ci0gICAgc3RydWN0IFN0cmVhbUluZm8gewotICAgICAgICB1bnNpZ25lZCBtVHlwZTsKLSAgICAgICAgdW5zaWduZWQgbVBJRDsKLSAgICAgICAgaW50MzJfdCBtQ0FTeXN0ZW1JZDsKLSAgICB9OwogCiAgICAgQVRTUGFyc2VyICptUGFyc2VyOwogICAgIHVuc2lnbmVkIG1Qcm9ncmFtTnVtYmVyOwogICAgIHVuc2lnbmVkIG1Qcm9ncmFtTWFwUElEOworICAgIHVpbnQzMl90IG1QTVRWZXJzaW9uOworICAgIHVpbnQzMl90IG1QTVRfQ1JDOwogICAgIEtleWVkVmVjdG9yPHVuc2lnbmVkLCBzcDxTdHJlYW0+ID4gbVN0cmVhbXM7CiAgICAgYm9vbCBtRmlyc3RQVFNWYWxpZDsKICAgICB1aW50NjRfdCBtRmlyc3RQVFM7CkBAIC0xNDIsMTUgKzE0MCwxNSBAQAogfTsKIAogc3RydWN0IEFUU1BhcnNlcjo6U3RyZWFtIDogcHVibGljIFJlZkJhc2UgewotICAgIFN0cmVhbShQcm9ncmFtICpwcm9ncmFtLAotICAgICAgICAgICB1bnNpZ25lZCBlbGVtZW50YXJ5UElELAotICAgICAgICAgICB1bnNpZ25lZCBzdHJlYW1UeXBlLAotICAgICAgICAgICB1bnNpZ25lZCBQQ1JfUElELAotICAgICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9JRCk7CisgICAgU3RyZWFtKFByb2dyYW0gKnByb2dyYW0sIHVuc2lnbmVkIFBDUl9QSUQsIGNvbnN0IFN0cmVhbUluZm8gJmluZm8pOwogCiAgICAgdW5zaWduZWQgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1TdHJlYW1UeXBlOyB9CisgICAgdW5zaWduZWQgdHlwZUV4dCgpIGNvbnN0IHsgcmV0dXJuIG1TdHJlYW1UeXBlRXh0OyB9CiAgICAgdW5zaWduZWQgcGlkKCkgY29uc3QgeyByZXR1cm4gbUVsZW1lbnRhcnlQSUQ7IH0KICAgICB2b2lkIHNldFBJRCh1bnNpZ25lZCBwaWQpIHsgbUVsZW1lbnRhcnlQSUQgPSBwaWQ7IH0KKyAgICB2b2lkIHNldEF1ZGlvUHJlc2VudGF0aW9ucyhBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb24gYXVkaW9QcmVzZW50YXRpb25zKSB7CisgICAgICAgIG1BdWRpb1ByZXNlbnRhdGlvbnMgPSBhdWRpb1ByZXNlbnRhdGlvbnM7CisgICAgfQogCiAgICAgdm9pZCBzZXRDYXNJbmZvKAogICAgICAgICAgICAgaW50MzJfdCBzeXN0ZW1JZCwKQEAgLTE5NCw2ICsxOTIsNyBAQAogICAgIFByb2dyYW0gKm1Qcm9ncmFtOwogICAgIHVuc2lnbmVkIG1FbGVtZW50YXJ5UElEOwogICAgIHVuc2lnbmVkIG1TdHJlYW1UeXBlOworICAgIHVuc2lnbmVkIG1TdHJlYW1UeXBlRXh0OwogICAgIHVuc2lnbmVkIG1QQ1JfUElEOwogICAgIGludDMyX3QgbUV4cGVjdGVkQ29udGludWl0eUNvdW50ZXI7CiAKQEAgLTIxMCwxMyArMjA5LDEzIEBACiAgICAgYm9vbCBtU2NyYW1ibGVkOwogICAgIGJvb2wgbVNhbXBsZUVuY3J5cHRlZDsKICAgICBzcDxBTWVzc2FnZT4gbVNhbXBsZUFlc0tleUl0ZW07Ci0gICAgc3A8SU1lbW9yeT4gbU1lbTsKLSAgICBzcDxNZW1vcnlEZWFsZXI+IG1EZWFsZXI7Ci0gICAgc3A8SGlkbE1lbW9yeT4gbUhpZGxNZW1vcnk7CisgICAgc3A8VE1lbW9yeT4gbUhpZGxNZW1vcnk7CisgICAgc3A8VEFsbG9jYXRvcj4gbUhpZGxBbGxvY2F0b3I7CiAgICAgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpTaGFyZWRCdWZmZXIgbURlc2NyYW1ibGVyU3JjQnVmZmVyOwogICAgIHNwPEFCdWZmZXI+IG1EZXNjcmFtYmxlZEJ1ZmZlcjsKICAgICBMaXN0PFN1YlNhbXBsZUluZm8+IG1TdWJTYW1wbGVzOwogICAgIHNwPElEZXNjcmFtYmxlcj4gbURlc2NyYW1ibGVyOworICAgIEF1ZGlvUHJlc2VudGF0aW9uQ29sbGVjdGlvbiBtQXVkaW9QcmVzZW50YXRpb25zOwogCiAgICAgLy8gRmx1c2ggYWNjdW11bGF0ZWQgcGF5bG9hZCBpZiBuZWNlc3NhcnkgLS0tIGkuZS4gYXQgRU9TIG9yIGF0IHRoZSBzdGFydCBvZgogICAgIC8vIGFub3RoZXIgcGF5bG9hZC4gZXZlbnQgaXMgc2V0IGlmIHRoZSBmbHVzaGVkIHBheWxvYWQgaXMgUEVTIHdpdGggYSBzeW5jCkBAIC0yOTksNiArMjk4LDggQEAKICAgICA6IG1QYXJzZXIocGFyc2VyKSwKICAgICAgIG1Qcm9ncmFtTnVtYmVyKHByb2dyYW1OdW1iZXIpLAogICAgICAgbVByb2dyYW1NYXBQSUQocHJvZ3JhbU1hcFBJRCksCisgICAgICBtUE1UVmVyc2lvbigweGZmZmZmZmZmKSwKKyAgICAgIG1QTVRfQ1JDKDB4ZmZmZmZmZmYpLAogICAgICAgbUZpcnN0UFRTVmFsaWQoZmFsc2UpLAogICAgICAgbUZpcnN0UFRTKDApLAogICAgICAgbUxhc3RSZWNvdmVyZWRQVFMobGFzdFJlY292ZXJlZFBUUykgewpAQCAtNDQ3LDcgKzQ0OCw3IEBACiAgICAgICAgIGlmIChkZXNjcmlwdG9yX2xlbmd0aCA+IGluZm9MZW5ndGgpIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGlmIChkZXNjcmlwdG9yX3RhZyA9PSA5ICYmIGRlc2NyaXB0b3JfbGVuZ3RoID49IDQpIHsKKyAgICAgICAgaWYgKGRlc2NyaXB0b3JfdGFnID09IERFU0NSSVBUT1JfQ0EgJiYgZGVzY3JpcHRvcl9sZW5ndGggPj0gNCkgewogICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgY2FEZXNjcmlwdG9yLT5tU3lzdGVtSUQgPSBici0+Z2V0Qml0cygxNik7CiAgICAgICAgICAgICBjYURlc2NyaXB0b3ItPm1QSUQgPSBici0+Z2V0Qml0cygxNikgJiAweDFmZmY7CkBAIC00ODYsNyArNDg3LDEzIEBACiAKICAgICBNWV9MT0dWKCIgIHByb2dyYW1fbnVtYmVyID0gJXUiLCBici0+Z2V0Qml0cygxNikpOwogICAgIE1ZX0xPR1YoIiAgcmVzZXJ2ZWQgPSAldSIsIGJyLT5nZXRCaXRzKDIpKTsKLSAgICBNWV9MT0dWKCIgIHZlcnNpb25fbnVtYmVyID0gJXUiLCBici0+Z2V0Qml0cyg1KSk7CisgICAgYm9vbCBhdWRpb1ByZXNlbnRhdGlvbnNDaGFuZ2VkID0gZmFsc2U7CisgICAgdW5zaWduZWQgcG10VmVyc2lvbiA9IGJyLT5nZXRCaXRzKDUpOworICAgIGlmIChwbXRWZXJzaW9uICE9IG1QTVRWZXJzaW9uKSB7CisgICAgICAgIGF1ZGlvUHJlc2VudGF0aW9uc0NoYW5nZWQgPSB0cnVlOworICAgICAgICBtUE1UVmVyc2lvbiA9IHBtdFZlcnNpb247CisgICAgfQorICAgIE1ZX0xPR1YoIiAgdmVyc2lvbl9udW1iZXIgPSAldSIsIHBtdFZlcnNpb24pOwogICAgIE1ZX0xPR1YoIiAgY3VycmVudF9uZXh0X2luZGljYXRvciA9ICV1IiwgYnItPmdldEJpdHMoMSkpOwogICAgIE1ZX0xPR1YoIiAgc2VjdGlvbl9udW1iZXIgPSAldSIsIGJyLT5nZXRCaXRzKDgpKTsKICAgICBNWV9MT0dWKCIgIGxhc3Rfc2VjdGlvbl9udW1iZXIgPSAldSIsIGJyLT5nZXRCaXRzKDgpKTsKQEAgLTUxMyw0MyArNTIwLDE2NiBAQAogICAgIC8vIGluZm9CeXRlc1JlbWFpbmluZyBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbWFrZSB1cCB0aGUKICAgICAvLyB2YXJpYWJsZSBsZW5ndGggc2VjdGlvbiBvZiBFU19pbmZvcy4gSXQgZG9lcyBub3QgaW5jbHVkZSB0aGUKICAgICAvLyBmaW5hbCBDUkMuCi0gICAgc2l6ZV90IGluZm9CeXRlc1JlbWFpbmluZyA9IHNlY3Rpb25fbGVuZ3RoIC0gOSAtIHByb2dyYW1faW5mb19sZW5ndGggLSA0OworICAgIGludDMyX3QgaW5mb0J5dGVzUmVtYWluaW5nID0gc2VjdGlvbl9sZW5ndGggLSA5IC0gcHJvZ3JhbV9pbmZvX2xlbmd0aCAtIDQ7CiAKICAgICB3aGlsZSAoaW5mb0J5dGVzUmVtYWluaW5nID49IDUpIHsKLQotICAgICAgICB1bnNpZ25lZCBzdHJlYW1UeXBlID0gYnItPmdldEJpdHMoOCk7Ci0gICAgICAgIEFMT0dWKCIgICAgc3RyZWFtX3R5cGUgPSAweCUwMngiLCBzdHJlYW1UeXBlKTsKLQorICAgICAgICBTdHJlYW1JbmZvIGluZm87CisgICAgICAgIGluZm8ubVR5cGUgPSBici0+Z2V0Qml0cyg4KTsKKyAgICAgICAgQUxPR1YoIiAgICBzdHJlYW1fdHlwZSA9IDB4JTAyeCIsIGluZm8ubVR5cGUpOwogICAgICAgICBNWV9MT0dWKCIgICAgcmVzZXJ2ZWQgPSAldSIsIGJyLT5nZXRCaXRzKDMpKTsKIAotICAgICAgICB1bnNpZ25lZCBlbGVtZW50YXJ5UElEID0gYnItPmdldEJpdHMoMTMpOwotICAgICAgICBBTE9HVigiICAgIGVsZW1lbnRhcnlfUElEID0gMHglMDR4IiwgZWxlbWVudGFyeVBJRCk7CisgICAgICAgIGluZm8ubVBJRCA9IGJyLT5nZXRCaXRzKDEzKTsKKyAgICAgICAgQUxPR1YoIiAgICBlbGVtZW50YXJ5X1BJRCA9IDB4JTA0eCIsIGluZm8ubVBJRCk7CiAKICAgICAgICAgTVlfTE9HVigiICAgIHJlc2VydmVkID0gJXUiLCBici0+Z2V0Qml0cyg0KSk7CiAKICAgICAgICAgdW5zaWduZWQgRVNfaW5mb19sZW5ndGggPSBici0+Z2V0Qml0cygxMik7CiAgICAgICAgIEFMT0dWKCIgICAgRVNfaW5mb19sZW5ndGggPSAldSIsIEVTX2luZm9fbGVuZ3RoKTsKKyAgICAgICAgaW5mb0J5dGVzUmVtYWluaW5nIC09IDUgKyBFU19pbmZvX2xlbmd0aDsKIAogICAgICAgICBDQURlc2NyaXB0b3Igc3RyZWFtQ0E7Ci0gICAgICAgIGJvb2wgaGFzU3RyZWFtQ0EgPSBmaW5kQ0FEZXNjcmlwdG9yKGJyLCBFU19pbmZvX2xlbmd0aCwgJnN0cmVhbUNBKTsKKyAgICAgICAgaW5mby5tVHlwZUV4dCA9IEVYVF9ERVNDUklQVE9SX0RWQl9SRVNFUlZFRF9NQVg7CisKKyAgICAgICAgaW5mby5tQXVkaW9QcmVzZW50YXRpb25zLmNsZWFyKCk7CisgICAgICAgIGJvb2wgaGFzU3RyZWFtQ0EgPSBmYWxzZTsKKyAgICAgICAgd2hpbGUgKEVTX2luZm9fbGVuZ3RoID4gMiAmJiBpbmZvQnl0ZXNSZW1haW5pbmcgPj0gMCkgeworICAgICAgICAgICAgdW5zaWduZWQgZGVzY3JpcHRvcl90YWcgPSBici0+Z2V0Qml0cyg4KTsKKyAgICAgICAgICAgIEFMT0dWKCIgICAgICB0YWcgPSAweCUwMngiLCBkZXNjcmlwdG9yX3RhZyk7CisKKyAgICAgICAgICAgIHVuc2lnbmVkIGRlc2NyaXB0b3JfbGVuZ3RoID0gYnItPmdldEJpdHMoOCk7CisgICAgICAgICAgICBBTE9HVigiICAgICAgbGVuID0gJXUiLCBkZXNjcmlwdG9yX2xlbmd0aCk7CisKKyAgICAgICAgICAgIEVTX2luZm9fbGVuZ3RoIC09IDI7CisgICAgICAgICAgICBpZiAoZGVzY3JpcHRvcl9sZW5ndGggPiBFU19pbmZvX2xlbmd0aCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZGVzY3JpcHRvcl90YWcgPT0gREVTQ1JJUFRPUl9DQSAmJiBkZXNjcmlwdG9yX2xlbmd0aCA+PSA0KSB7CisgICAgICAgICAgICAgICAgaGFzU3RyZWFtQ0EgPSB0cnVlOworICAgICAgICAgICAgICAgIHN0cmVhbUNBLm1TeXN0ZW1JRCA9IGJyLT5nZXRCaXRzKDE2KTsKKyAgICAgICAgICAgICAgICBzdHJlYW1DQS5tUElEID0gYnItPmdldEJpdHMoMTYpICYgMHgxZmZmOworICAgICAgICAgICAgICAgIEVTX2luZm9fbGVuZ3RoIC09IGRlc2NyaXB0b3JfbGVuZ3RoOworICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfbGVuZ3RoIC09IDQ7CisgICAgICAgICAgICAgICAgc3RyZWFtQ0EubVByaXZhdGVEYXRhLmFzc2lnbihici0+ZGF0YSgpLCBici0+ZGF0YSgpICsgZGVzY3JpcHRvcl9sZW5ndGgpOworICAgICAgICAgICAgICAgIGJyLT5za2lwQml0cyhkZXNjcmlwdG9yX2xlbmd0aCAqIDgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpbmZvLm1UeXBlID09IFNUUkVBTVRZUEVfUEVTX1BSSVZBVEVfREFUQSAmJgorICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3RhZyA9PSBERVNDUklQVE9SX0RWQl9FWFRFTlNJT04gJiYgZGVzY3JpcHRvcl9sZW5ndGggPj0gMSkgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGRlc2NUYWdFeHQgPSBici0+Z2V0Qml0cyg4KTsKKyAgICAgICAgICAgICAgICBBTE9HVigiICAgICAgdGFnX2V4dCA9IDB4JTAyeCIsIGRlc2NUYWdFeHQpOworICAgICAgICAgICAgICAgIEVTX2luZm9fbGVuZ3RoIC09IGRlc2NyaXB0b3JfbGVuZ3RoOworICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfbGVuZ3RoLS07CisgICAgICAgICAgICAgICAgLy8gVGhlIEFDNCBkZXNjcmlwdG9yIGlzIHVzZWQgaW4gdGhlIFBTSSBQTVQgdG8gaWRlbnRpZnkgc3RyZWFtcyB3aGljaCBjYXJyeSBBQzQKKyAgICAgICAgICAgICAgICAvLyBhdWRpby4KKyAgICAgICAgICAgICAgICBpZiAoZGVzY1RhZ0V4dCA9PSBFWFRfREVTQ1JJUFRPUl9EVkJfQUM0KSB7CisgICAgICAgICAgICAgICAgICAgIGluZm8ubVR5cGVFeHQgPSBFWFRfREVTQ1JJUFRPUl9EVkJfQUM0OworICAgICAgICAgICAgICAgICAgICBici0+c2tpcEJpdHMoZGVzY3JpcHRvcl9sZW5ndGggKiA4KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRlc2NUYWdFeHQgPT0gRVhUX0RFU0NSSVBUT1JfRFZCX0FVRElPX1BSRVNFTEVDVElPTiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl9sZW5ndGggPj0gMSkgeworICAgICAgICAgICAgICAgICAgICAvLyBEVkIgQmx1ZUJvb2sgQTAzOCBUYWJsZSAxMTAKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtX3ByZXNlbGVjdGlvbnMgPSBici0+Z2V0Qml0cyg1KTsKKyAgICAgICAgICAgICAgICAgICAgYnItPnNraXBCaXRzKDMpOyAgLy8gcmVzZXJ2ZWQKKyAgICAgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bV9wcmVzZWxlY3Rpb25zOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChici0+bnVtQml0c0xlZnQoKSA8IDE2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk5vdCBlbm91Z2ggZGF0YSBsZWZ0IGluIGJpdHJlYWRlciEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9QcmVzZW50YXRpb25WMSBhcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwLm1QcmVzZW50YXRpb25JZCA9IGJyLT5nZXRCaXRzKDUpOyAgLy8gcHJlc2VsZWN0aW9uX2lkCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF1ZGlvX3JlbmRlcmluZ19pbmRpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBhcC5tTWFzdGVyaW5nSW5kaWNhdGlvbiA9IHN0YXRpY19jYXN0PE1hc3RlcmluZ0luZGljYXRpb24+KGJyLT5nZXRCaXRzKDMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwLm1BdWRpb0Rlc2NyaXB0aW9uQXZhaWxhYmxlID0gKGJyLT5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgYXAubVNwb2tlblN1YnRpdGxlc0F2YWlsYWJsZSA9IChici0+Z2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwLm1EaWFsb2d1ZUVuaGFuY2VtZW50QXZhaWxhYmxlID0gKGJyLT5nZXRCaXRzKDEpID09IDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGludGVyYWN0aXZpdHlfZW5hYmxlZCA9IChici0+Z2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ZX0xPR1YoIiAgICAgIGludGVyYWN0aXZpdHlfZW5hYmxlZCA9ICVkIiwgaW50ZXJhY3Rpdml0eV9lbmFibGVkKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsYW5ndWFnZV9jb2RlX3ByZXNlbnQgPSAoYnItPmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRleHRfbGFiZWxfcHJlc2VudCA9IChici0+Z2V0Qml0cygxKSA9PSAxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtdWx0aV9zdHJlYW1faW5mb19wcmVzZW50ID0gKGJyLT5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmdXR1cmVfZXh0ZW5zaW9uID0gKGJyLT5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmd1YWdlX2NvZGVfcHJlc2VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChici0+bnVtQml0c0xlZnQoKSA8IDI0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGRhdGEgbGVmdCBpbiBiaXRyZWFkZXIhIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgbGFuZ3VhZ2VbNF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VbMF0gPSBici0+Z2V0Qml0cyg4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZVsxXSA9IGJyLT5nZXRCaXRzKDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlWzJdID0gYnItPmdldEJpdHMoOCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VbM10gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwLm1MYW5ndWFnZSA9IFN0cmluZzgobGFuZ3VhZ2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG1hcHMgdGhlIHByZXNlbnRhdGlvbiBpZCB0byB0aGUgbWVzc2FnZSBpZCBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVYVF9ERVNDUklQVE9SX0RWQl9NRVNTQUdFIHNvIHRoYXQgd2UgY2FuIGdldCB0aGUgcHJlc2VudGF0aW9uIGxhYmVsLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHRfbGFiZWxfcHJlc2VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChici0+bnVtQml0c0xlZnQoKSA8IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk5vdCBlbm91Z2ggZGF0YSBsZWZ0IGluIGJpdHJlYWRlciEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbWVzc2FnZV9pZCA9IGJyLT5nZXRCaXRzKDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ZX0xPR1YoIiAgICAgIG1lc3NhZ2VfaWQgPSAldSIsIG1lc3NhZ2VfaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXVsdGlfc3RyZWFtX2luZm9fcHJlc2VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChici0+bnVtQml0c0xlZnQoKSA8IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk5vdCBlbm91Z2ggZGF0YSBsZWZ0IGluIGJpdHJlYWRlciEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtX2F1eF9jb21wb25lbnRzID0gYnItPmdldEJpdHMoMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnItPnNraXBCaXRzKDUpOyAgLy8gcmVzZXJ2ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnItPm51bUJpdHNMZWZ0KCkgPCAobnVtX2F1eF9jb21wb25lbnRzICogOCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk5vdCBlbm91Z2ggZGF0YSBsZWZ0IGluIGJpdHJlYWRlciEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnItPnNraXBCaXRzKG51bV9hdXhfY29tcG9uZW50cyAqIDgpOyAgLy8gY29tcG9uZW50X3RhZworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ1dHVyZV9leHRlbnNpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnItPm51bUJpdHNMZWZ0KCkgPCA4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyLT5za2lwQml0cygzKTsgIC8vIHJlc2VydmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZnV0dXJlX2V4dGVuc2lvbl9sZW5ndGggPSBici0+Z2V0Qml0cyg1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnItPm51bUJpdHNMZWZ0KCkgPCAoZnV0dXJlX2V4dGVuc2lvbl9sZW5ndGggKiA4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTm90IGVub3VnaCBkYXRhIGxlZnQgaW4gYml0cmVhZGVyISIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBici0+c2tpcEJpdHMoZnV0dXJlX2V4dGVuc2lvbl9sZW5ndGggKiA4KTsgIC8vIGZ1dHVyZV9leHRlbnNpb25fYnl0ZQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5tQXVkaW9QcmVzZW50YXRpb25zLnB1c2hfYmFjayhzdGQ6Om1vdmUoYXApKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJyLT5za2lwQml0cyhkZXNjcmlwdG9yX2xlbmd0aCAqIDgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRVNfaW5mb19sZW5ndGggLT0gZGVzY3JpcHRvcl9sZW5ndGg7CisgICAgICAgICAgICAgICAgYnItPnNraXBCaXRzKGRlc2NyaXB0b3JfbGVuZ3RoICogOCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgaWYgKGhhc1N0cmVhbUNBICYmICFtUGFyc2VyLT5tQ2FzTWFuYWdlci0+YWRkU3RyZWFtKAotICAgICAgICAgICAgICAgIG1Qcm9ncmFtTnVtYmVyLCBlbGVtZW50YXJ5UElELCBzdHJlYW1DQSkpIHsKKyAgICAgICAgICAgICAgICBtUHJvZ3JhbU51bWJlciwgaW5mby5tUElELCBzdHJlYW1DQSkpIHsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KLSAgICAgICAgU3RyZWFtSW5mbyBpbmZvOwotICAgICAgICBpbmZvLm1UeXBlID0gc3RyZWFtVHlwZTsKLSAgICAgICAgaW5mby5tUElEID0gZWxlbWVudGFyeVBJRDsKLSAgICAgICAgaW5mby5tQ0FTeXN0ZW1JZCA9IGhhc1Byb2dyYW1DQSA/IHByb2dyYW1DQS5tU3lzdGVtSUQgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzU3RyZWFtQ0EgPyBzdHJlYW1DQS5tU3lzdGVtSUQgIDogLTE7Ci0gICAgICAgIGluZm9zLnB1c2goaW5mbyk7CisgICAgICAgIGlmIChoYXNQcm9ncmFtQ0EpIHsKKyAgICAgICAgICAgIGluZm8ubUNBRGVzY3JpcHRvciA9IHByb2dyYW1DQTsKKyAgICAgICAgfSBlbHNlIGlmIChoYXNTdHJlYW1DQSkgeworICAgICAgICAgICAgaW5mby5tQ0FEZXNjcmlwdG9yID0gc3RyZWFtQ0E7CisgICAgICAgIH0KIAotICAgICAgICBpbmZvQnl0ZXNSZW1haW5pbmcgLT0gNSArIEVTX2luZm9fbGVuZ3RoOworICAgICAgICBpbmZvcy5wdXNoKGluZm8pOwogICAgIH0KIAogICAgIGlmIChpbmZvQnl0ZXNSZW1haW5pbmcgIT0gMCkgewogICAgICAgICBBTE9HVygiU2VjdGlvbiBkYXRhIHJlbWFpbnMgdW5jb25zdW1lZCIpOwogICAgIH0KLSAgICBNWV9MT0dWKCIgIENSQyA9IDB4JTA4eCIsIGJyLT5nZXRCaXRzKDMyKSk7CisgICAgdW5zaWduZWQgY3JjID0gYnItPmdldEJpdHMoMzIpOworICAgIGlmIChjcmMgIT0gbVBNVF9DUkMpIHsKKyAgICAgICAgYXVkaW9QcmVzZW50YXRpb25zQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIG1QTVRfQ1JDID0gY3JjOworICAgIH0KKyAgICBNWV9MT0dWKCIgIENSQyA9IDB4JTA4eCIsIGNyYyk7CiAKICAgICBib29sIFBJRHNDaGFuZ2VkID0gZmFsc2U7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmZvcy5zaXplKCk7ICsraSkgewpAQCAtNjAxLDE2ICs3MzEsMTkgQEAKICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1TdHJlYW1zLmluZGV4T2ZLZXkoaW5mby5tUElEKTsKIAogICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICBzcDxTdHJlYW0+IHN0cmVhbSA9IG5ldyBTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgIHRoaXMsIGluZm8ubVBJRCwgaW5mby5tVHlwZSwgUENSX1BJRCwgaW5mby5tQ0FTeXN0ZW1JZCk7CisgICAgICAgICAgICBzcDxTdHJlYW0+IHN0cmVhbSA9IG5ldyBTdHJlYW0odGhpcywgUENSX1BJRCwgaW5mbyk7CiAKICAgICAgICAgICAgIGlmIChtU2FtcGxlQWVzS2V5SXRlbSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgc3RyZWFtLT5zaWduYWxOZXdTYW1wbGVBZXNLZXkobVNhbXBsZUFlc0tleUl0ZW0pOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpc0FkZGluZ1NjcmFtYmxlZFN0cmVhbSB8PSBpbmZvLm1DQVN5c3RlbUlkID49IDA7CisgICAgICAgICAgICBpc0FkZGluZ1NjcmFtYmxlZFN0cmVhbSB8PSBpbmZvLm1DQURlc2NyaXB0b3IubVN5c3RlbUlEID49IDA7CiAgICAgICAgICAgICBtU3RyZWFtcy5hZGQoaW5mby5tUElELCBzdHJlYW0pOwogICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGluZGV4ID49IDAgJiYgbVN0cmVhbXMuZWRpdFZhbHVlQXQoaW5kZXgpLT5pc0F1ZGlvKCkKKyAgICAgICAgICAgICAgICAgJiYgYXVkaW9QcmVzZW50YXRpb25zQ2hhbmdlZCkgeworICAgICAgICAgICAgbVN0cmVhbXMuZWRpdFZhbHVlQXQoaW5kZXgpLT5zZXRBdWRpb1ByZXNlbnRhdGlvbnMoaW5mby5tQXVkaW9QcmVzZW50YXRpb25zKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChpc0FkZGluZ1NjcmFtYmxlZFN0cmVhbSkgewpAQCAtNzE3LDM0ICs4NTAsMzMgQEAKIHN0YXRpYyBjb25zdCBzaXplX3Qga0luaXRpYWxTdHJlYW1CdWZmZXJTaXplID0gMTkyICogMTAyNDsKIAogQVRTUGFyc2VyOjpTdHJlYW06OlN0cmVhbSgKLSAgICAgICAgUHJvZ3JhbSAqcHJvZ3JhbSwKLSAgICAgICAgdW5zaWduZWQgZWxlbWVudGFyeVBJRCwKLSAgICAgICAgdW5zaWduZWQgc3RyZWFtVHlwZSwKLSAgICAgICAgdW5zaWduZWQgUENSX1BJRCwKLSAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1fSUQpCisgICAgICAgIFByb2dyYW0gKnByb2dyYW0sIHVuc2lnbmVkIFBDUl9QSUQsIGNvbnN0IFN0cmVhbUluZm8gJmluZm8pCiAgICAgOiBtUHJvZ3JhbShwcm9ncmFtKSwKLSAgICAgIG1FbGVtZW50YXJ5UElEKGVsZW1lbnRhcnlQSUQpLAotICAgICAgbVN0cmVhbVR5cGUoc3RyZWFtVHlwZSksCisgICAgICBtRWxlbWVudGFyeVBJRChpbmZvLm1QSUQpLAorICAgICAgbVN0cmVhbVR5cGUoaW5mby5tVHlwZSksCisgICAgICBtU3RyZWFtVHlwZUV4dChpbmZvLm1UeXBlRXh0KSwKICAgICAgIG1QQ1JfUElEKFBDUl9QSUQpLAogICAgICAgbUV4cGVjdGVkQ29udGludWl0eUNvdW50ZXIoLTEpLAogICAgICAgbVBheWxvYWRTdGFydGVkKGZhbHNlKSwKICAgICAgIG1FT1NSZWFjaGVkKGZhbHNlKSwKICAgICAgIG1QcmV2UFRTKDApLAogICAgICAgbVF1ZXVlKE5VTEwpLAotICAgICAgbVNjcmFtYmxlZChDQV9zeXN0ZW1fSUQgPj0gMCkgewotCisgICAgICBtU2NyYW1ibGVkKGluZm8ubUNBRGVzY3JpcHRvci5tU3lzdGVtSUQgPj0gMCksCisgICAgICBtQXVkaW9QcmVzZW50YXRpb25zKGluZm8ubUF1ZGlvUHJlc2VudGF0aW9ucykgewogICAgIG1TYW1wbGVFbmNyeXB0ZWQgPQogICAgICAgICAgICAgbVN0cmVhbVR5cGUgPT0gU1RSRUFNVFlQRV9IMjY0X0VOQ1JZUFRFRCB8fAogICAgICAgICAgICAgbVN0cmVhbVR5cGUgPT0gU1RSRUFNVFlQRV9BQUNfRU5DUllQVEVEICB8fAogICAgICAgICAgICAgbVN0cmVhbVR5cGUgPT0gU1RSRUFNVFlQRV9BQzNfRU5DUllQVEVEOwogCiAgICAgQUxPR1YoIm5ldyBzdHJlYW0gUElEIDB4JTAyeCwgdHlwZSAweCUwMngsIHNjcmFtYmxlZCAlZCwgU2FtcGxlRW5jcnlwdGVkOiAlZCIsCi0gICAgICAgICAgICBlbGVtZW50YXJ5UElELCBzdHJlYW1UeXBlLCBtU2NyYW1ibGVkLCBtU2FtcGxlRW5jcnlwdGVkKTsKKyAgICAgICAgICAgIGluZm8ubVBJRCwgaW5mby5tVHlwZSwgbVNjcmFtYmxlZCwgbVNhbXBsZUVuY3J5cHRlZCk7CiAKLSAgICB1aW50MzJfdCBmbGFncyA9Ci0gICAgICAgICAgICAoaXNWaWRlbygpICYmIG1TY3JhbWJsZWQpID8gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjprRmxhZ19TY3JhbWJsZWREYXRhIDoKLSAgICAgICAgICAgIChtU2FtcGxlRW5jcnlwdGVkKSA/IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6a0ZsYWdfU2FtcGxlRW5jcnlwdGVkRGF0YSA6Ci0gICAgICAgICAgICAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpZiAoKChpc1ZpZGVvKCkgfHwgaXNBdWRpbygpKSAmJiBtU2NyYW1ibGVkKSkgeworICAgICAgICBmbGFncyA9IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6a0ZsYWdfU2NyYW1ibGVkRGF0YTsKKyAgICB9IGVsc2UgaWYgKG1TYW1wbGVFbmNyeXB0ZWQpIHsKKyAgICAgICAgZmxhZ3MgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmtGbGFnX1NhbXBsZUVuY3J5cHRlZERhdGE7CisgICAgfQogCiAgICAgRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpNb2RlIG1vZGUgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OklOVkFMSUQ7CiAKQEAgLTc4MSwxMyArOTEzLDIzIEBACiAgICAgICAgICAgICBtb2RlID0gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpBQzM7CiAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICBjYXNlIFNUUkVBTVRZUEVfRUFDMzoKKyAgICAgICAgICAgIG1vZGUgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OkVBQzM7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNUUkVBTVRZUEVfUEVTX1BSSVZBVEVfREFUQToKKyAgICAgICAgICAgIGlmIChtU3RyZWFtVHlwZUV4dCA9PSBFWFRfREVTQ1JJUFRPUl9EVkJfQUM0KSB7CisgICAgICAgICAgICAgICAgbW9kZSA9IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6QUM0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgY2FzZSBTVFJFQU1UWVBFX01FVEFEQVRBOgogICAgICAgICAgICAgbW9kZSA9IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6TUVUQURBVEE7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR0UoInN0cmVhbSBQSUQgMHglMDJ4IGhhcyBpbnZhbGlkIHN0cmVhbSB0eXBlIDB4JTAyeCIsCi0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRhcnlQSUQsIHN0cmVhbVR5cGUpOworICAgICAgICAgICAgICAgICAgICBpbmZvLm1QSUQsIGluZm8ubVR5cGUpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtODA3LDcgKzk0OSwxMyBAQAogICAgICAgICAgICAgICAgICAgICBpc0F1ZGlvKCkgPyBNRURJQV9NSU1FVFlQRV9BVURJT19TQ1JBTUJMRUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTUVESUFfTUlNRVRZUEVfVklERU9fU0NSQU1CTEVEKTsKICAgICAgICAgICAgIC8vIGZvciBNZWRpYUV4dHJhY3Rvci5DYXNJbmZvCi0gICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5Q0FTeXN0ZW1JRCwgQ0Ffc3lzdGVtX0lEKTsKKyAgICAgICAgICAgIGNvbnN0IENBRGVzY3JpcHRvciAmZGVzY3JpcHRvciA9IGluZm8ubUNBRGVzY3JpcHRvcjsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlDQVN5c3RlbUlELCBkZXNjcmlwdG9yLm1TeXN0ZW1JRCk7CisKKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUNBUHJpdmF0ZURhdGEsIDAsCisgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IubVByaXZhdGVEYXRhLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5tUHJpdmF0ZURhdGEuc2l6ZSgpKTsKKwogICAgICAgICAgICAgbVNvdXJjZSA9IG5ldyBBbm90aGVyUGFja2V0U291cmNlKG1ldGEpOwogICAgICAgICB9CiAgICAgfQpAQCAtODI3LDE2ICs5NzUsNDMgQEAKICAgICAgICAgICAgIG1CdWZmZXIgPT0gTlVMTCA/IDAgOiBtQnVmZmVyLT5jYXBhY2l0eSgpLCBuZWVkZWRTaXplLCBtU2NyYW1ibGVkKTsKIAogICAgIHNwPEFCdWZmZXI+IG5ld0J1ZmZlciwgbmV3U2NyYW1ibGVkQnVmZmVyOwotICAgIHNwPElNZW1vcnk+IG5ld01lbTsKLSAgICBzcDxNZW1vcnlEZWFsZXI+IG5ld0RlYWxlcjsKKyAgICBzcDxUTWVtb3J5PiBuZXdNZW07CiAgICAgaWYgKG1TY3JhbWJsZWQpIHsKLSAgICAgICAgc2l6ZV90IGFsaWdubWVudCA9IE1lbW9yeURlYWxlcjo6Z2V0QWxsb2NhdGlvbkFsaWdubWVudCgpOwotICAgICAgICBuZWVkZWRTaXplID0gKG5lZWRlZFNpemUgKyAoYWxpZ25tZW50IC0gMSkpICYgfihhbGlnbm1lbnQgLSAxKTsKLSAgICAgICAgLy8gQWxpZ24gdG8gbXVsdGlwbGVzIG9mIDY0Sy4KLSAgICAgICAgbmVlZGVkU2l6ZSA9IChuZWVkZWRTaXplICsgNjU1MzUpICYgfjY1NTM1OwotICAgICAgICBuZXdEZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKG5lZWRlZFNpemUsICJBVFNQYXJzZXIiKTsKLSAgICAgICAgbmV3TWVtID0gbmV3RGVhbGVyLT5hbGxvY2F0ZShuZWVkZWRTaXplKTsKLSAgICAgICAgbmV3U2NyYW1ibGVkQnVmZmVyID0gbmV3IEFCdWZmZXIobmV3TWVtLT5wb2ludGVyKCksIG5ld01lbS0+c2l6ZSgpKTsKKyAgICAgICAgaWYgKG1IaWRsQWxsb2NhdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1IaWRsQWxsb2NhdG9yID0gVEFsbG9jYXRvcjo6Z2V0U2VydmljZSgiYXNobWVtIik7CisgICAgICAgICAgICBpZiAobUhpZGxBbGxvY2F0b3IgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJbc3RyZWFtICVkXSBjYW4ndCBnZXQgaGlkbCBhbGxvY2F0b3IiLCBtRWxlbWVudGFyeVBJRCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaGlkbF9tZW1vcnkgaGlkbE1lbVRva2VuOworICAgICAgICBib29sIHN1Y2Nlc3M7CisgICAgICAgIGF1dG8gdHJhbnNTdGF0dXMgPSBtSGlkbEFsbG9jYXRvci0+YWxsb2NhdGUoCisgICAgICAgICAgICAgICAgbmVlZGVkU2l6ZSwKKyAgICAgICAgICAgICAgICBbJnN1Y2Nlc3MsICZoaWRsTWVtVG9rZW5dKAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzLAorICAgICAgICAgICAgICAgICAgICAgICAgaGlkbF9tZW1vcnkgY29uc3QmIG0pIHsKKyAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHM7CisgICAgICAgICAgICAgICAgICAgIGhpZGxNZW1Ub2tlbiA9IG07CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJbc3RyZWFtICVkXSBoaWRsIGFsbG9jYXRvciBmYWlsZWQgYXQgdGhlIHRyYW5zcG9ydDogJXMiLAorICAgICAgICAgICAgICAgICAgICBtRWxlbWVudGFyeVBJRCwgdHJhbnNTdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJbc3RyZWFtICVkXSBoaWRsIGFsbG9jYXRvciBmYWlsZWQiLCBtRWxlbWVudGFyeVBJRCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgbmV3TWVtID0gbWFwTWVtb3J5KGhpZGxNZW1Ub2tlbik7CisgICAgICAgIGlmIChuZXdNZW0gPT0gbnVsbHB0ciB8fCBuZXdNZW0tPmdldFBvaW50ZXIoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiW3N0cmVhbSAlZF0gaGlkbCBmYWlsZWQgdG8gbWFwIG1lbW9yeSIsIG1FbGVtZW50YXJ5UElEKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIG5ld1NjcmFtYmxlZEJ1ZmZlciA9IG5ldyBBQnVmZmVyKG5ld01lbS0+Z2V0UG9pbnRlcigpLCBuZXdNZW0tPmdldFNpemUoKSk7CiAKICAgICAgICAgaWYgKG1EZXNjcmFtYmxlZEJ1ZmZlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBtZW1jcHkobmV3U2NyYW1ibGVkQnVmZmVyLT5kYXRhKCksCkBAIC04NDUsMjQgKzEwMjAsMTUgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG5ld1NjcmFtYmxlZEJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CiAgICAgICAgIH0KLSAgICAgICAgbU1lbSA9IG5ld01lbTsKLSAgICAgICAgbURlYWxlciA9IG5ld0RlYWxlcjsKKyAgICAgICAgbUhpZGxNZW1vcnkgPSBuZXdNZW07CiAgICAgICAgIG1EZXNjcmFtYmxlZEJ1ZmZlciA9IG5ld1NjcmFtYmxlZEJ1ZmZlcjsKIAotICAgICAgICBzc2l6ZV90IG9mZnNldDsKLSAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwID0gbmV3TWVtLT5nZXRNZW1vcnkoJm9mZnNldCwgJnNpemUpOwotICAgICAgICBpZiAoaGVhcCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KKyAgICAgICAgbURlc2NyYW1ibGVyU3JjQnVmZmVyLmhlYXBCYXNlID0gaGlkbE1lbVRva2VuOworICAgICAgICBtRGVzY3JhbWJsZXJTcmNCdWZmZXIub2Zmc2V0ID0gMFVMTDsKKyAgICAgICAgbURlc2NyYW1ibGVyU3JjQnVmZmVyLnNpemUgPSAgKHVpbnQ2NF90KW5lZWRlZFNpemU7CiAKLSAgICAgICAgbUhpZGxNZW1vcnkgPSBmcm9tSGVhcChoZWFwKTsKLSAgICAgICAgbURlc2NyYW1ibGVyU3JjQnVmZmVyLmhlYXBCYXNlID0gKm1IaWRsTWVtb3J5OwotICAgICAgICBtRGVzY3JhbWJsZXJTcmNCdWZmZXIub2Zmc2V0ID0gKHVpbnQ2NF90KSBvZmZzZXQ7Ci0gICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlci5zaXplID0gKHVpbnQ2NF90KSBzaXplOwotCi0gICAgICAgIEFMT0dEKCJbc3RyZWFtICVkXSBjcmVhdGVkIHNoYXJlZCBidWZmZXIgZm9yIGRlc2NyYW1ibGluZywgb2Zmc2V0ICV6ZCwgc2l6ZSAlenUiLAotICAgICAgICAgICAgICAgIG1FbGVtZW50YXJ5UElELCBvZmZzZXQsIHNpemUpOworICAgICAgICBBTE9HRCgiW3N0cmVhbSAlZF0gY3JlYXRlZCBzaGFyZWQgYnVmZmVyIGZvciBkZXNjcmFtYmxpbmcsIHNpemUgJXp1IiwKKyAgICAgICAgICAgICAgICBtRWxlbWVudGFyeVBJRCwgbmVlZGVkU2l6ZSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gQWxpZ24gdG8gbXVsdGlwbGVzIG9mIDY0Sy4KICAgICAgICAgbmVlZGVkU2l6ZSA9IChuZWVkZWRTaXplICsgNjU1MzUpICYgfjY1NTM1OwpAQCAtOTg2LDkgKzExNTIsMTIgQEAKICAgICAgICAgY2FzZSBTVFJFQU1UWVBFX01QRUcyX0FVRElPX0FEVFM6CiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9MUENNX0FDMzoKICAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0FDMzoKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0VBQzM6CiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9BQUNfRU5DUllQVEVEOgogICAgICAgICBjYXNlIFNUUkVBTVRZUEVfQUMzX0VOQ1JZUFRFRDoKICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIFNUUkVBTVRZUEVfUEVTX1BSSVZBVEVfREFUQToKKyAgICAgICAgICAgIHJldHVybiBtU3RyZWFtVHlwZUV4dCA9PSBFWFRfREVTQ1JJUFRPUl9EVkJfQUM0OwogCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xMzQ3LDcgKzE1MTYsNyBAQAogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKLSAgICBpZiAobURlc2NyYW1ibGVkQnVmZmVyID09IE5VTEwgfHwgbU1lbSA9PSBOVUxMKSB7CisgICAgaWYgKG1EZXNjcmFtYmxlZEJ1ZmZlciA9PSBOVUxMIHx8IG1IaWRsTWVtb3J5ID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoInJlY2VpdmVkIHNjcmFtYmxlZCBwYWNrZXRzIHdpdGhvdXQgc2hhcmVkIG1lbW9yeSEiKTsKIAogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKQEAgLTEzOTUsNyArMTU2NCw3IEBACiAgICAgLy8gUGVyZm9ybSB0aGUgMXN0IHBhc3MgZGVzY3JhbWJsaW5nIGlmIG5lZWRlZAogICAgIGlmIChkZXNjcmFtYmxlQnl0ZXMgPiAwKSB7CiAgICAgICAgIG1lbWNweShtRGVzY3JhbWJsZWRCdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+ZGF0YSgpLCBkZXNjcmFtYmxlQnl0ZXMpOwotICAgICAgICBtRGVzY3JhbWJsZWRCdWZmZXItPnNldFJhbmdlKDAsIGRlc2NyYW1ibGVCeXRlcyk7CisgICAgICAgIG1EZXNjcmFtYmxlZEJ1ZmZlci0+c2V0UmFuZ2UoMCwgbUJ1ZmZlci0+c2l6ZSgpKTsKIAogICAgICAgICBoaWRsX3ZlYzxTdWJTYW1wbGU+IHN1YlNhbXBsZXM7CiAgICAgICAgIHN1YlNhbXBsZXMucmVzaXplKGRlc2NyYW1ibGVTdWJTYW1wbGVzKTsKQEAgLTE0MTIsMTAgKzE1ODEsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgdWludDY0X3Qgc3JjT2Zmc2V0ID0gMCwgZHN0T2Zmc2V0ID0gMDsKLSAgICAgICAgLy8gSWYgc2NyYW1ibGVkIGF0IFBFUy1sZXZlbCwgUEVTIGhlYWRlciBzaG91bGQgYmUgc2tpcHBlZAorICAgICAgICAvLyBJZiBzY3JhbWJsZWQgYXQgUEVTLWxldmVsLCBQRVMgaGVhZGVyIGlzIGluIHRoZSBjbGVhcgogICAgICAgICBpZiAocGVzU2NyYW1ibGluZ0NvbnRyb2wgIT0gMCkgewotICAgICAgICAgICAgc3JjT2Zmc2V0ID0gZHN0T2Zmc2V0ID0gcGVzT2Zmc2V0OworICAgICAgICAgICAgc3ViU2FtcGxlc1swXS5udW1CeXRlc09mQ2xlYXJEYXRhID0gcGVzT2Zmc2V0OwogICAgICAgICAgICAgc3ViU2FtcGxlc1swXS5udW1CeXRlc09mRW5jcnlwdGVkRGF0YSAtPSBwZXNPZmZzZXQ7CiAgICAgICAgIH0KIApAQCAtMTQzMSw5ICsxNTk5LDkgQEAKICAgICAgICAgICAgICAgICAoU2NyYW1ibGluZ0NvbnRyb2wpIHNjdHJsLAogICAgICAgICAgICAgICAgIHN1YlNhbXBsZXMsCiAgICAgICAgICAgICAgICAgbURlc2NyYW1ibGVyU3JjQnVmZmVyLAotICAgICAgICAgICAgICAgIHNyY09mZnNldCwKKyAgICAgICAgICAgICAgICAwIC8qc3JjT2Zmc2V0Ki8sCiAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAotICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICAgICAgICAgICAgICAwIC8qZHN0T2Zmc2V0Ki8sCiAgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZieXRlc1dyaXR0ZW4sICZkZXRhaWxlZEVycm9yXSAoCiAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgX3N0YXR1cywgdWludDMyX3QgX2J5dGVzV3JpdHRlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBfZGV0YWlsZWRFcnJvcikgewpAQCAtMTQ0MiwxNyArMTYxMCwyOSBAQAogICAgICAgICAgICAgICAgICAgICBkZXRhaWxlZEVycm9yID0gX2RldGFpbGVkRXJyb3I7CiAgICAgICAgICAgICAgICAgfSk7CiAKLSAgICAgICAgaWYgKCFyZXR1cm5Wb2lkLmlzT2soKSkgewotICAgICAgICAgICAgQUxPR0UoIltzdHJlYW0gJWRdIGRlc2NyYW1ibGUgZmFpbGVkLCB0cmFucz0lcyIsCi0gICAgICAgICAgICAgICAgICAgIG1FbGVtZW50YXJ5UElELCByZXR1cm5Wb2lkLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIGlmICghcmV0dXJuVm9pZC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJbc3RyZWFtICVkXSBkZXNjcmFtYmxlIGZhaWxlZCwgdHJhbnM9JXMsIHN0YXR1cz0lZCIsCisgICAgICAgICAgICAgICAgICAgIG1FbGVtZW50YXJ5UElELCByZXR1cm5Wb2lkLmRlc2NyaXB0aW9uKCkuY19zdHIoKSwgc3RhdHVzKTsKICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICB9CiAKICAgICAgICAgQUxPR1YoIltzdHJlYW0gJWRdIGRlc2NyYW1ibGUgc3VjY2VlZGVkLCAlZCBieXRlcyIsCiAgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIGJ5dGVzV3JpdHRlbik7Ci0gICAgICAgIG1lbWNweShtQnVmZmVyLT5kYXRhKCksIG1EZXNjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpLCBkZXNjcmFtYmxlQnl0ZXMpOworCisgICAgICAgIC8vIFNldCBkZXNjcmFtYmxlQnl0ZXMgdG8gdGhlIHJldHVybmVkIHJlc3VsdC4KKyAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgbWlnaHQgYmUgc21hbGxlciB0aGFuIHRoZSB0b3RhbCBsZW5ndGggb2YgaW5wdXQgZGF0YS4KKyAgICAgICAgLy8gKGVnLiB3aGVuIHdlJ3JlIGRlc2NyYW1ibGluZyB0aGUgUEVTIGhlYWRlciBwb3J0aW9uIG9mIGEgc2VjdXJlIHN0cmVhbSwKKyAgICAgICAgLy8gdGhlIHBsdWdpbiBtaWdodCBjdXQgaXQgb2ZmIHJpZ2h0IGFmdGVyIHRoZSBQRVMgaGVhZGVyLikKKyAgICAgICAgZGVzY3JhbWJsZUJ5dGVzID0gYnl0ZXNXcml0dGVuOwogICAgIH0KIAorICAgIC8vIHxidWZmZXJ8IHBvaW50cyB0byB0aGUgYnVmZmVyIGZyb20gd2hpY2ggd2UnZCBwYXJzZSB0aGUgUEVTIGhlYWRlci4KKyAgICAvLyBXaGVuIHRoZSBvdXRwdXQgc3RyZWFtIGlzIHNjcmFtYmxlZCwgaXQgcG9pbnRzIHRvIG1EZXNjcmFtYmxlZEJ1ZmZlcgorICAgIC8vICh1bmxlc3MgYWxsIHBhY2tldHMgaW4gdGhpcyBQRVMgYXJlIGFjdHVhbGx5IGNsZWFyLCBpbiB3aGljaCBjYXNlLAorICAgIC8vIGl0IHBvaW50cyB0byBtQnVmZmVyIHNpbmNlIHdlIG5ldmVyIGNvcGllZCBpbnRvIG1EZXNjcmFtYmxlZEJ1ZmZlcikuCisgICAgLy8gV2hlbiB0aGUgb3V0cHV0IHN0cmVhbSBpcyBjbGVhciwgaXQgcG9pbnRzIHRvIG1CdWZmZXIsIGFuZCB3ZSdsbAorICAgIC8vIGNvcHkgYWxsIGRlc2NyYW1ibGVkIGRhdGEgYmFjayB0byBtQnVmZmVyLgorICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG1CdWZmZXI7CiAgICAgaWYgKG1RdWV1ZS0+aXNTY3JhbWJsZWQoKSkgewogICAgICAgICAvLyBRdWV1ZSBzdWJTYW1wbGUgaW5mbyBmb3Igc2NyYW1ibGVkIHF1ZXVlCiAgICAgICAgIHNwPEFCdWZmZXI+IGNsZWFyU2l6ZXNCdWZmZXIgPSBuZXcgQUJ1ZmZlcihtU3ViU2FtcGxlcy5zaXplKCkgKiA0KTsKQEAgLTE0NjQsOCArMTY0NCw3IEBACiAgICAgICAgIGZvciAoYXV0byBpdCA9IG1TdWJTYW1wbGVzLmJlZ2luKCk7CiAgICAgICAgICAgICAgICAgaXQgIT0gbVN1YlNhbXBsZXMuZW5kKCk7IGl0KyssIGkrKykgewogICAgICAgICAgICAgaWYgKChpdC0+dHJhbnNwb3J0X3NjcmFtYmxpbmdfbW9kZSA9PSAwCi0gICAgICAgICAgICAgICAgICAgICYmIHBlc1NjcmFtYmxpbmdDb250cm9sID09IDApCi0gICAgICAgICAgICAgICAgICAgIHx8IGkgPCBkZXNjcmFtYmxlU3ViU2FtcGxlcykgeworICAgICAgICAgICAgICAgICAgICAmJiBwZXNTY3JhbWJsaW5nQ29udHJvbCA9PSAwKSkgewogICAgICAgICAgICAgICAgIGNsZWFyU2l6ZVB0cltpXSA9IGl0LT5zdWJTYW1wbGVTaXplOwogICAgICAgICAgICAgICAgIGVuY1NpemVQdHJbaV0gPSAwOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTE0NzQsMTQgKzE2NTMsMjkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlzU3luYyB8PSBpdC0+cmFuZG9tX2FjY2Vzc19pbmRpY2F0b3I7CiAgICAgICAgIH0KKworICAgICAgICAvLyBJZiBzY3JhbWJsZWQgYXQgUEVTLWxldmVsLCBQRVMgaGVhZGVyIGlzIGluIHRoZSBjbGVhcgorICAgICAgICBpZiAocGVzU2NyYW1ibGluZ0NvbnRyb2wgIT0gMCkgeworICAgICAgICAgICAgY2xlYXJTaXplUHRyWzBdID0gcGVzT2Zmc2V0OworICAgICAgICAgICAgZW5jU2l6ZVB0clswXSAtPSBwZXNPZmZzZXQ7CisgICAgICAgIH0KICAgICAgICAgLy8gUGFzcyB0aGUgb3JpZ2luYWwgVFMgc3Vic2FtcGxlIHNpemUgbm93LiBUaGUgUEVTIGhlYWRlciBhZGp1c3QKICAgICAgICAgLy8gd2lsbCBiZSBhcHBsaWVkIHdoZW4gdGhlIHNjcmFtYmxlZCBBVSBpcyBkZXF1ZXVlZC4KKyAgICAgICAgLy8gTm90ZSB0aGF0IGlmIGRlc2NyYW1ibGVCeXRlcyBpcyAwLCBpdCBtZWFucyB0aGlzIFBFUyBjb250YWlucyBvbmx5CisgICAgICAgIC8vIGFsbCB0cyBwYWNrZXRzLCBsZWFkaW5nQ2xlYXJCeXRlcyBpcyBlbnRpcmUgYnVmZmVyIHNpemUuCiAgICAgICAgIG1RdWV1ZS0+YXBwZW5kU2NyYW1ibGVkRGF0YSgKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSwgc2N0cmwsCi0gICAgICAgICAgICAgICAgaXNTeW5jLCBjbGVhclNpemVzQnVmZmVyLCBlbmNTaXplc0J1ZmZlcik7CisgICAgICAgICAgICAgICAgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCksCisgICAgICAgICAgICAgICAgKGRlc2NyYW1ibGVCeXRlcyA+IDApID8gZGVzY3JhbWJsZUJ5dGVzIDogbUJ1ZmZlci0+c2l6ZSgpLAorICAgICAgICAgICAgICAgIHNjdHJsLCBpc1N5bmMsIGNsZWFyU2l6ZXNCdWZmZXIsIGVuY1NpemVzQnVmZmVyKTsKKworICAgICAgICBpZiAoZGVzY3JhbWJsZUJ5dGVzID4gMCkgeworICAgICAgICAgICAgYnVmZmVyID0gbURlc2NyYW1ibGVkQnVmZmVyOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtY3B5KG1CdWZmZXItPmRhdGEoKSwgbURlc2NyYW1ibGVkQnVmZmVyLT5kYXRhKCksIGRlc2NyYW1ibGVCeXRlcyk7CiAgICAgfQogCi0gICAgQUJpdFJlYWRlciBicihtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSk7CisgICAgQUJpdFJlYWRlciBicihidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOwogICAgIHN0YXR1c190IGVyciA9IHBhcnNlUEVTKCZiciwgZXZlbnQpOwogCiAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtMTU2NSw2ICsxNzU5LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbVNvdXJjZSA9IG5ldyBBbm90aGVyUGFja2V0U291cmNlKG1ldGEpOwogICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKKyAgICAgICAgICAgICAgICBtU291cmNlLT5jb252ZXJ0QXVkaW9QcmVzZW50YXRpb25JbmZvVG9NZXRhZGF0YShtQXVkaW9QcmVzZW50YXRpb25zKTsKICAgICAgICAgICAgICAgICBBTE9HVigib25QYXlsb2FkRGF0YTogY3JlYXRlZCBBbm90aGVyUGFja2V0U291cmNlIFBJRCAweCUwOHggb2YgdHlwZSAweCUwMngiLAogICAgICAgICAgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIG1TdHJlYW1UeXBlKTsKICAgICAgICAgICAgIH0KQEAgLTE1NzcsNiArMTc3Miw3IEBACiAgICAgICAgICAgICAgICAgbVNvdXJjZS0+c2V0Rm9ybWF0KG1RdWV1ZS0+Z2V0Rm9ybWF0KCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOworICAgICAgICAgICAgbVNvdXJjZS0+Y29udmVydEF1ZGlvUHJlc2VudGF0aW9uSW5mb1RvTWV0YWRhdGEobUF1ZGlvUHJlc2VudGF0aW9ucyk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBFdmVyeSBhY2Nlc3MgdW5pdCBoYXMgYSBwZXNTdGFydE9mZnNldCBxdWV1ZWQgaW4gfG1QZXNTdGFydE9mZnNldHN8LgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKaW5kZXggNDVjYTA2Yi4uMGZmMmQ3ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQXVkaW9QcmVzZW50YXRpb25JbmZvLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CkBAIC0xNDIsNiArMTQzLDcgQEAKICAgICAgICAgU1RSRUFNVFlQRV9NUEVHMl9WSURFTyAgICAgICAgICA9IDB4MDIsCiAgICAgICAgIFNUUkVBTVRZUEVfTVBFRzFfQVVESU8gICAgICAgICAgPSAweDAzLAogICAgICAgICBTVFJFQU1UWVBFX01QRUcyX0FVRElPICAgICAgICAgID0gMHgwNCwKKyAgICAgICAgU1RSRUFNVFlQRV9QRVNfUFJJVkFURV9EQVRBICAgICA9IDB4MDYsCiAgICAgICAgIFNUUkVBTVRZUEVfTVBFRzJfQVVESU9fQURUUyAgICAgPSAweDBmLAogICAgICAgICBTVFJFQU1UWVBFX01QRUc0X1ZJREVPICAgICAgICAgID0gMHgxMCwKICAgICAgICAgU1RSRUFNVFlQRV9NRVRBREFUQSAgICAgICAgICAgICA9IDB4MTUsCkBAIC0xNTMsNiArMTU1LDcgQEAKICAgICAgICAgLy8gU3RyZWFtIHR5cGUgMHg4MyBpcyBub24tc3RhbmRhcmQsCiAgICAgICAgIC8vIGl0IGNvdWxkIGJlIExQQ00gb3IgVHJ1ZUhEIEFDMwogICAgICAgICBTVFJFQU1UWVBFX0xQQ01fQUMzICAgICAgICAgICAgID0gMHg4MywKKyAgICAgICAgU1RSRUFNVFlQRV9FQUMzICAgICAgICAgICAgICAgICA9IDB4ODcsCiAKICAgICAgICAgLy9TYW1wbGUgRW5jcnlwdGVkIHR5cGVzCiAgICAgICAgIFNUUkVBTVRZUEVfSDI2NF9FTkNSWVBURUQgICAgICAgPSAweERCLApAQCAtMTYwLDYgKzE2MywyMSBAQAogICAgICAgICBTVFJFQU1UWVBFX0FDM19FTkNSWVBURUQgICAgICAgID0gMHhDMSwKICAgICB9OwogCisgICAgZW51bSB7CisgICAgICAgIC8vIEZyb20gSVNPL0lFQyAxMzgxOC0xOiAyMDA3IChFKSwgVGFibGUgMi00NQorICAgICAgICBERVNDUklQVE9SX0NBICAgICAgICAgICAgICAgICAgID0gMHgwOSwKKworICAgICAgICAvLyBEVkIgQmx1ZUJvb2sgQTAzOCBUYWJsZSAxMgorICAgICAgICBERVNDUklQVE9SX0RWQl9FWFRFTlNJT04gICAgICAgID0gMHg3RiwKKyAgICB9OworCisgICAgLy8gRFZCIEJsdWVCb29rIEEwMzggVGFibGUgMTA5CisgICAgZW51bSB7CisgICAgICAgIEVYVF9ERVNDUklQVE9SX0RWQl9BQzQgICAgICAgICAgICAgICAgICA9IDB4MTUsCisgICAgICAgIEVYVF9ERVNDUklQVE9SX0RWQl9BVURJT19QUkVTRUxFQ1RJT04gICA9IDB4MTksCisgICAgICAgIEVYVF9ERVNDUklQVE9SX0RWQl9SRVNFUlZFRF9NQVggICAgICAgICA9IDB4N0YsCisgICAgfTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFUU1BhcnNlcigpOwogCkBAIC0xNjksMTEgKzE4NywyMCBAQAogICAgIHN0cnVjdCBQU0lTZWN0aW9uOwogICAgIHN0cnVjdCBDYXNNYW5hZ2VyOwogICAgIHN0cnVjdCBDQURlc2NyaXB0b3IgewotICAgICAgICBpbnQzMl90IG1TeXN0ZW1JRDsKKyAgICAgICAgQ0FEZXNjcmlwdG9yKCkgOiBtUElEKDApLCBtU3lzdGVtSUQoLTEpIHt9CiAgICAgICAgIHVuc2lnbmVkIG1QSUQ7CisgICAgICAgIGludDMyX3QgbVN5c3RlbUlEOwogICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtUHJpdmF0ZURhdGE7CiAgICAgfTsKIAorICAgIHN0cnVjdCBTdHJlYW1JbmZvIHsKKyAgICAgICAgdW5zaWduZWQgbVR5cGU7CisgICAgICAgIHVuc2lnbmVkIG1UeXBlRXh0OworICAgICAgICB1bnNpZ25lZCBtUElEOworICAgICAgICBDQURlc2NyaXB0b3IgbUNBRGVzY3JpcHRvcjsKKyAgICAgICAgQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uIG1BdWRpb1ByZXNlbnRhdGlvbnM7CisgICAgfTsKKwogICAgIHNwPENhc01hbmFnZXI+IG1DYXNNYW5hZ2VyOwogCiAgICAgdWludDMyX3QgbUZsYWdzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwCmluZGV4IGY5ZGNiYzkuLmE1MDdiOTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAKQEAgLTMwLDkgKzMwLDE0IEBACiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmNyeXB0byIsCiAgICAgICAgICJsaWJtZWRpYSIsCi0gICAgICAgICJsaWJoaWRsYWxsb2NhdG9ydXRpbHMiLAorICAgICAgICAibGliaGlkbG1lbW9yeSIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKICAgICBdLAogCiAgICAgd2hvbGVfc3RhdGljX2xpYnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuY3BwCmluZGV4IGVjZTA2OTIuLmUyYzUwMzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmNwcApAQCAtMjI2LDYgKzIyNiw3IEBACiAgICAgICAgIGludDMyX3QgY3J5cHRvTW9kZTsKICAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImNyeXB0b01vZGUiLCAmY3J5cHRvTW9kZSkpIHsKICAgICAgICAgICAgIGludDMyX3QgY3J5cHRvS2V5OworICAgICAgICAgICAgaW50MzJfdCBwZXNPZmZzZXQ7CiAgICAgICAgICAgICBzcDxBQnVmZmVyPiBjbGVhckJ5dGVzQnVmZmVyLCBlbmNCeXRlc0J1ZmZlcjsKIAogICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiY3J5cHRvS2V5IiwgJmNyeXB0b0tleSkpOwpAQCAtMjMzLDYgKzIzNCw4IEBACiAgICAgICAgICAgICAgICAgICAgICYmIGNsZWFyQnl0ZXNCdWZmZXIgIT0gTlVMTCk7CiAgICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEJ1ZmZlcigiZW5jQnl0ZXMiLCAmZW5jQnl0ZXNCdWZmZXIpCiAgICAgICAgICAgICAgICAgICAgICYmIGVuY0J5dGVzQnVmZmVyICE9IE5VTEwpOworICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigicGVzT2Zmc2V0IiwgJnBlc09mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHBlc09mZnNldCA+PSAwKSAmJiAocGVzT2Zmc2V0IDwgNjU1MzYpKTsKIAogICAgICAgICAgICAgYnVmbWV0YS5zZXRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgY3J5cHRvTW9kZSk7CiAKQEAgLTI0MCw2ICsyNDMsMTEgQEAKICAgICAgICAgICAgIGJ1Zm1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvSVYsIDAsIGFycmF5LCAxNik7CiAKICAgICAgICAgICAgIGFycmF5WzBdID0gKHVpbnQ4X3QpIChjcnlwdG9LZXkgJiAweGZmKTsKKyAgICAgICAgICAgIC8vIGFycmF5WzFdIGNvbnRhaW5zIFBFUyBoZWFkZXIgZmxhZywgd2hpY2ggd2UgZG9uJ3QgdXNlLgorICAgICAgICAgICAgLy8gYXJyYXlbMn4zXSBjb250YWluIHRoZSBQRVMgb2Zmc2V0LgorICAgICAgICAgICAgYXJyYXlbMl0gPSAodWludDhfdCkgKHBlc09mZnNldCAmIDB4ZmYpOworICAgICAgICAgICAgYXJyYXlbM10gPSAodWludDhfdCkgKChwZXNPZmZzZXQgPj4gOCkgJiAweGZmKTsKKwogICAgICAgICAgICAgYnVmbWV0YS5zZXREYXRhKGtLZXlDcnlwdG9LZXksIDAsIGFycmF5LCAxNik7CiAKICAgICAgICAgICAgIGJ1Zm1ldGEuc2V0RGF0YShrS2V5UGxhaW5TaXplcywgMCwKQEAgLTY4OSw0ICs2OTcsMjMgQEAKICAgICByZXR1cm4gZmlyc3RNZXRhOwogfQogCit2b2lkIEFub3RoZXJQYWNrZXRTb3VyY2U6OmNvbnZlcnRBdWRpb1ByZXNlbnRhdGlvbkluZm9Ub01ldGFkYXRhKAorICAgICAgICBjb25zdCBBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb24mIHByZXNlbnRhdGlvbnMpIHsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IGdldEZvcm1hdCgpOworICAgIGlmIChtZXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAocHJlc2VudGF0aW9ucy5lbXB0eSgpKSB7CisgICAgICAgIC8vIENsZWFyIGF1ZGlvIHByZXNlbnRhdGlvbiBpbmZvIGluIG1ldGFkYXRhLgorICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICBtZXRhLT5yZW1vdmUoa0tleUF1ZGlvUHJlc2VudGF0aW9uSW5mbyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dFN0cmVhbShzdGQ6Omlvczo6b3V0KTsKKyAgICAgICAgc2VyaWFsaXplQXVkaW9QcmVzZW50YXRpb25zKHByZXNlbnRhdGlvbnMsICZvdXRTdHJlYW0pOworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlBdWRpb1ByZXNlbnRhdGlvbkluZm8sIE1ldGFEYXRhOjpUWVBFX05PTkUsCisgICAgICAgICAgICAgICAgb3V0U3RyZWFtLnN0cigpLmRhdGEoKSwgb3V0U3RyZWFtLnN0cigpLnNpemUoKSk7CisgICAgfQorfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaAppbmRleCBmNGE2YWNiLi41N2E2YzMzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaApAQCAtODUsNiArODUsOCBAQAogICAgIHZvaWQgdHJpbUJ1ZmZlcnNBZnRlck1ldGEoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtZXRhKTsKICAgICBzcDxBTWVzc2FnZT4gdHJpbUJ1ZmZlcnNCZWZvcmVNZXRhKGNvbnN0IHNwPEFNZXNzYWdlPiAmbWV0YSk7CiAKKyAgICB2b2lkIGNvbnZlcnRBdWRpb1ByZXNlbnRhdGlvbkluZm9Ub01ldGFkYXRhKGNvbnN0IEF1ZGlvUHJlc2VudGF0aW9uQ29sbGVjdGlvbiAmcHJlc2VudGF0aW9ucyk7CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5Bbm90aGVyUGFja2V0U291cmNlKCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwCmluZGV4IDBmYTlmY2IuLmZiOGI5ZmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcApAQCAtODYsNiArODYsMjEgQEAKICAgICBtQ2FzU2Vzc2lvbklkID0gc2Vzc2lvbklkOwogfQogCitzdGF0aWMgaW50MzJfdCByZWFkVmFyaWFibGVCaXRzKEFCaXRSZWFkZXIgJmJpdHMsIGludDMyX3QgbmJpdHMpIHsKKyAgICBpbnQzMl90IHZhbHVlID0gMDsKKyAgICBpbnQzMl90IG1vcmVfYml0cyA9IDE7CisKKyAgICB3aGlsZSAobW9yZV9iaXRzKSB7CisgICAgICAgIHZhbHVlICs9IGJpdHMuZ2V0Qml0cyhuYml0cyk7CisgICAgICAgIG1vcmVfYml0cyA9IGJpdHMuZ2V0Qml0cygxKTsKKyAgICAgICAgaWYgKCFtb3JlX2JpdHMpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgdmFsdWUrKzsKKyAgICAgICAgdmFsdWUgPDw9IG5iaXRzOworICAgIH0KKyAgICByZXR1cm4gdmFsdWU7Cit9CisKIC8vIFBhcnNlIEFDMyBoZWFkZXIgYXNzdW1pbmcgdGhlIGN1cnJlbnQgcHRyIGlzIHN0YXJ0IHBvc2l0aW9uIG9mIHN5bmNmcmFtZSwKIC8vIHVwZGF0ZSBtZXRhZGF0YSBvbmx5IGFwcGxpY2FibGUsIGFuZCByZXR1cm4gdGhlIHBheWxvYWQgc2l6ZQogc3RhdGljIHVuc2lnbmVkIHBhcnNlQUMzU3luY0ZyYW1lKApAQCAtMTk1LDggKzIxMCwxNTMgQEAKICAgICByZXR1cm4gcGF5bG9hZFNpemU7CiB9CiAKLXN0YXRpYyBib29sIElzU2VlbWluZ2x5VmFsaWRBQzNIZWFkZXIoY29uc3QgdWludDhfdCAqcHRyLCBzaXplX3Qgc2l6ZSkgewotICAgIHJldHVybiBwYXJzZUFDM1N5bmNGcmFtZShwdHIsIHNpemUsIE5VTEwpID4gMDsKKy8vIFBhcnNlIEVBQzMgaGVhZGVyIGFzc3VtaW5nIHRoZSBjdXJyZW50IHB0ciBpcyBzdGFydCBwb3NpdGlvbiBvZiBzeW5jZnJhbWUsCisvLyB1cGRhdGUgbWV0YWRhdGEgb25seSBhcHBsaWNhYmxlLCBhbmQgcmV0dXJuIHRoZSBwYXlsb2FkIHNpemUKKy8vIEFUU0MgQS81MjoyMDEyIEUyLjMuMQorc3RhdGljIHVuc2lnbmVkIHBhcnNlRUFDM1N5bmNGcmFtZSgKKyAgICBjb25zdCB1aW50OF90ICpwdHIsIHNpemVfdCBzaXplLCBzcDxNZXRhRGF0YT4gKm1ldGFEYXRhKSB7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYW5uZWxDb3VudFRhYmxlW10gPSB7MiwgMSwgMiwgMywgMywgNCwgNCwgNX07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsaW5nUmF0ZVRhYmxlW10gPSB7NDgwMDAsIDQ0MTAwLCAzMjAwMH07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsaW5nUmF0ZVRhYmxlMltdID0gezI0MDAwLCAyMjA1MCwgMTYwMDB9OworCisgICAgQUJpdFJlYWRlciBiaXRzKHB0ciwgc2l6ZSk7CisgICAgaWYgKGJpdHMubnVtQml0c0xlZnQoKSA8IDE2KSB7CisgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGJpdHMgbGVmdCBmb3IgZnVydGhlciBwYXJzaW5nIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoYml0cy5nZXRCaXRzKDE2KSAhPSAweDBCNzcpIHsKKyAgICAgICAgQUxPR0UoIk5vIHZhbGlkIHN5bmMgd29yZCBpbiBFQUMzIGhlYWRlciIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyB3ZSBwYXJzZSB1cCB0byBic2lkIHNvIHRoZXJlIG5lZWRzIHRvIGJlIGF0IGxlYXN0IHRoYXQgbWFueSBiaXRzCisgICAgaWYgKGJpdHMubnVtQml0c0xlZnQoKSA8IDIgKyAzICsgMTEgKyAyICsgMiArIDMgKyAxICsgNSkgeworICAgICAgICBBTE9HRSgiTm90IGVub3VnaCBiaXRzIGxlZnQgZm9yIGZ1cnRoZXIgcGFyc2luZyIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBzdHJtdHlwID0gYml0cy5nZXRCaXRzKDIpOworICAgIGlmIChzdHJtdHlwID09IDMpIHsKKyAgICAgICAgQUxPR0UoIkluY29ycmVjdCBzdHJtdHlwIGluIEVBQzMgaGVhZGVyIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHVuc2lnbmVkIHN1YnN0cmVhbWlkID0gYml0cy5nZXRCaXRzKDMpOworICAgIC8vIG9ubHkgdGhlIGZpcnN0IGluZGVwZW5kZW50IHN0cmVhbSBpcyBzdXBwb3J0ZWQKKyAgICBpZiAoKHN0cm10eXAgPT0gMCB8fCBzdHJtdHlwID09IDIpICYmIHN1YnN0cmVhbWlkICE9IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgdW5zaWduZWQgZnJtc2l6ID0gYml0cy5nZXRCaXRzKDExKTsKKyAgICB1bnNpZ25lZCBmc2NvZCA9IGJpdHMuZ2V0Qml0cygyKTsKKworICAgIHVuc2lnbmVkIHNhbXBsaW5nUmF0ZSA9IDA7CisgICAgaWYgKGZzY29kID09IDB4MykgeworICAgICAgICB1bnNpZ25lZCBmc2NvZDIgPSBiaXRzLmdldEJpdHMoMik7CisgICAgICAgIGlmIChmc2NvZDIgPT0gMykgeworICAgICAgICAgICAgQUxPR1coIkluY29ycmVjdCBmc2NvZDIgaW4gRUFDMyBoZWFkZXIiKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZVRhYmxlMltmc2NvZDJdOworICAgIH0gZWxzZSB7CisgICAgICAgIHNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZVRhYmxlW2ZzY29kXTsKKyAgICAgICAgdW5zaWduZWQgbnVtYmxrc2NvZCBfX3VudXNlZCA9IGJpdHMuZ2V0Qml0cygyKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBhY21vZCA9IGJpdHMuZ2V0Qml0cygzKTsKKyAgICB1bnNpZ25lZCBsZmVvbiA9IGJpdHMuZ2V0Qml0cygxKTsKKyAgICB1bnNpZ25lZCBic2lkID0gYml0cy5nZXRCaXRzKDUpOworICAgIGlmIChic2lkIDwgMTEgfHwgYnNpZCA+IDE2KSB7CisgICAgICAgIEFMT0dXKCJJbmNvcnJlY3QgYnNpZCBpbiBFQUMzIGhlYWRlci4gQ291bGQgYmUgQUMtMyBvciBzb21lIHVua25vd24gRUFDMyBmb3JtYXQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gd2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCB0aGUgZmlyc3QgaW5kZXBlbmRhbnQgc3RyZWFtCisgICAgaWYgKG1ldGFEYXRhICE9IE5VTEwgJiYgKHN0cm10eXAgPT0gMCB8fCBzdHJtdHlwID09IDIpKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudFRhYmxlW2FjbW9kXSArIGxmZW9uOworICAgICAgICBBTE9HVigiRUFDMyBjaGFubmVsQ291bnQgPSAlZCIsIGNoYW5uZWxDb3VudCk7CisgICAgICAgIEFMT0dWKCJFQUMzIHNhbXBsaW5nUmF0ZSA9ICVkIiwgc2FtcGxpbmdSYXRlKTsKKyAgICAgICAgKCptZXRhRGF0YSktPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzKTsKKyAgICAgICAgKCptZXRhRGF0YSktPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGNoYW5uZWxDb3VudCk7CisgICAgICAgICgqbWV0YURhdGEpLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxpbmdSYXRlKTsKKyAgICAgICAgKCptZXRhRGF0YSktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgfQorCisgICAgdW5zaWduZWQgcGF5bG9hZFNpemUgPSBmcm1zaXogKyAxOworICAgIHBheWxvYWRTaXplIDw8PSAxOyAgLy8gY29udmVydCBmcm9tIDE2LWJpdCB3b3JkcyB0byBieXRlcworCisgICAgcmV0dXJuIHBheWxvYWRTaXplOworfQorCisvLyBQYXJzZSBBQzQgaGVhZGVyIGFzc3VtaW5nIHRoZSBjdXJyZW50IHB0ciBpcyBzdGFydCBwb3NpdGlvbiBvZiBzeW5jZnJhbWUKKy8vIGFuZCB1cGRhdGUgZnJhbWVTaXplIGFuZCBtZXRhZGF0YS4KK3N0YXRpYyBzdGF0dXNfdCBwYXJzZUFDNFN5bmNGcmFtZSgKKyAgICAgICAgY29uc3QgdWludDhfdCAqcHRyLCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgJmZyYW1lU2l6ZSwgc3A8TWV0YURhdGE+ICptZXRhRGF0YSkgeworICAgIC8vIEVUU0kgVFMgMTAzIDE5MC0yIFYxLjEuMSAoMjAxNS0wOSksIEFubmV4IEMKKyAgICAvLyBUaGUgc3luY193b3JkIGNhbiBiZSBlaXRoZXIgMHhBQzQwIG9yIDB4QUM0MS4KKyAgICBzdGF0aWMgY29uc3QgaW50IGtTeW5jV29yZEFDNDAgPSAweEFDNDA7CisgICAgc3RhdGljIGNvbnN0IGludCBrU3luY1dvcmRBQzQxID0gMHhBQzQxOworCisgICAgc2l6ZV90IGhlYWRlclNpemUgPSAwOworICAgIEFCaXRSZWFkZXIgYml0cyhwdHIsIHNpemUpOworICAgIGludDMyX3Qgc3luY1dvcmQgPSBiaXRzLmdldEJpdHMoMTYpOworICAgIGlmICgoc3luY1dvcmQgIT0ga1N5bmNXb3JkQUM0MCkgJiYgKHN5bmNXb3JkICE9IGtTeW5jV29yZEFDNDEpKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIHN5bmN3b3JkIGluIEFDNCBoZWFkZXIiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgaGVhZGVyU2l6ZSArPSAyOworCisgICAgZnJhbWVTaXplID0gYml0cy5nZXRCaXRzKDE2KTsKKyAgICBoZWFkZXJTaXplICs9IDI7CisgICAgaWYgKGZyYW1lU2l6ZSA9PSAweEZGRkYpIHsKKyAgICAgICAgZnJhbWVTaXplID0gYml0cy5nZXRCaXRzKDI0KTsKKyAgICAgICAgaGVhZGVyU2l6ZSArPSAzOworICAgIH0KKworICAgIGlmIChmcmFtZVNpemUgPT0gMCkgeworICAgICAgICBBTE9HRSgiSW52YWxpZCBmcmFtZSBzaXplIGluIEFDNCBoZWFkZXIiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgZnJhbWVTaXplICs9IGhlYWRlclNpemU7CisgICAgLy8gSWYgdGhlIHN5bmNfd29yZCBpcyAweEFDNDEsIGEgY3JjX3dvcmQgaXMgYWxzbyB0cmFuc21pdHRlZC4KKyAgICBpZiAoc3luY1dvcmQgPT0ga1N5bmNXb3JkQUM0MSkgeworICAgICAgICBmcmFtZVNpemUgKz0gMjsgLy8gY3JjX3dvcmQKKyAgICB9CisgICAgQUxPR1YoIkFDNCBmcmFtZVNpemUgPSAldSIsIGZyYW1lU2l6ZSk7CisKKyAgICAvLyBFVFNJIFRTIDEwMyAxOTAtMiBWMS4xLjEgNi4yLjEuMQorICAgIHVpbnQzMl90IGJpdHN0cmVhbVZlcnNpb24gPSBiaXRzLmdldEJpdHMoMik7CisgICAgaWYgKGJpdHN0cmVhbVZlcnNpb24gPT0gMykgeworICAgICAgICBiaXRzdHJlYW1WZXJzaW9uICs9IHJlYWRWYXJpYWJsZUJpdHMoYml0cywgMik7CisgICAgfQorCisgICAgYml0cy5za2lwQml0cygxMCk7IC8vIFNlcXVlbmNlIENvdW50ZXIKKworICAgIHVpbnQzMl90IGJXYWl0RnJhbWVzID0gYml0cy5nZXRCaXRzKDEpOworICAgIGlmIChiV2FpdEZyYW1lcykgeworICAgICAgICB1aW50MzJfdCB3YWl0RnJhbWVzID0gYml0cy5nZXRCaXRzKDMpOworICAgICAgICBpZiAod2FpdEZyYW1lcyA+IDApIHsKKyAgICAgICAgICAgIGJpdHMuc2tpcEJpdHMoMik7IC8vIGJyX2NvZGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBFVFNJIFRTIDEwMyAxOTAgVjEuMS4xIFRhYmxlIDgyCisgICAgYm9vbCBmc0luZGV4ID0gYml0cy5nZXRCaXRzKDEpOworICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IGZzSW5kZXggPyA0ODAwMCA6IDQ0MTAwOworCisgICAgaWYgKG1ldGFEYXRhICE9IE5VTEwpIHsKKyAgICAgICAgQUxPR1YoImRlcXVldWVBY2Nlc3NVbml0QUM0IFNldHRpbmcgbUZvcm1hdCIpOworICAgICAgICAoKm1ldGFEYXRhKS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FDNCk7CisgICAgICAgICgqbWV0YURhdGEpLT5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgICAgICAvLyBbRklYTUVdIEFDNCBjaGFubmVsIGNvdW50IGlzIGRlZmluZWQgcGVyIHByZXNlbnRhdGlvbi4gUHJvdmlkZSBhIGRlZmF1bHQgY2hhbm5lbCBjb3VudAorICAgICAgICAvLyBhcyBzdGVyZW8gZm9yIHRoZSBlbnRpcmUgc3RyZWFtLgorICAgICAgICAoKm1ldGFEYXRhKS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgMik7CisgICAgICAgICgqbWV0YURhdGEpLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxpbmdSYXRlKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0aWMgc3RhdHVzX3QgSXNTZWVtaW5nbHlWYWxpZEFDNEhlYWRlcihjb25zdCB1aW50OF90ICpwdHIsIHNpemVfdCBzaXplLCB1bnNpZ25lZCAmZnJhbWVTaXplKSB7CisgICAgcmV0dXJuIHBhcnNlQUM0U3luY0ZyYW1lKHB0ciwgc2l6ZSwgZnJhbWVTaXplLCBOVUxMKTsKIH0KIAogc3RhdGljIGJvb2wgSXNTZWVtaW5nbHlWYWxpZEFEVFNIZWFkZXIoCkBAIC0yNzksNyArNDM5LDggQEAKICAgICAgICAgQUxPR0UoImFwcGVuZGluZyBkYXRhIGFmdGVyIEVPUyIpOwogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KLSAgICBpZiAobUJ1ZmZlciA9PSBOVUxMIHx8IG1CdWZmZXItPnNpemUoKSA9PSAwKSB7CisKKyAgICBpZiAoIWlzU2NyYW1ibGVkKCkgJiYgKG1CdWZmZXIgPT0gTlVMTCB8fCBtQnVmZmVyLT5zaXplKCkgPT0gMCkpIHsKICAgICAgICAgc3dpdGNoIChtTW9kZSkgewogICAgICAgICAgICAgY2FzZSBIMjY0OgogICAgICAgICAgICAgY2FzZSBNUEVHX1ZJREVPOgpAQCAtMzkwLDEyICs1NTEsMTkgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgY2FzZSBBQzM6CisgICAgICAgICAgICBjYXNlIEVBQzM6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdWludDhfdCAqcHRyID0gKHVpbnQ4X3QgKilkYXRhOwogCiAgICAgICAgICAgICAgICAgc3NpemVfdCBzdGFydE9mZnNldCA9IC0xOwogICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChJc1NlZW1pbmdseVZhbGlkQUMzSGVhZGVyKCZwdHJbaV0sIHNpemUgLSBpKSkgeworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBwYXlsb2FkU2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChtTW9kZSA9PSBBQzMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRTaXplID0gcGFyc2VBQzNTeW5jRnJhbWUoJnB0cltpXSwgc2l6ZSAtIGksIE5VTEwpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1Nb2RlID09IEVBQzMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRTaXplID0gcGFyc2VFQUMzU3luY0ZyYW1lKCZwdHJbaV0sIHNpemUgLSBpLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocGF5bG9hZFNpemUgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydE9mZnNldCA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNDA2LDcgKzU3NCw3IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0T2Zmc2V0ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HSSgiZm91bmQgc29tZXRoaW5nIHJlc2VtYmxpbmcgYW4gQUMzIHN5bmN3b3JkIGF0ICIKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koImZvdW5kIHNvbWV0aGluZyByZXNlbWJsaW5nIGFuIChFKUFDMyBzeW5jd29yZCBhdCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJvZmZzZXQgJXpkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQpOwogICAgICAgICAgICAgICAgIH0KQEAgLTQxNiw2ICs1ODQsNDMgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgY2FzZSBBQzQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCAqcHRyID0gKHVpbnQ4X3QgKilkYXRhOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZyYW1lU2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgc3NpemVfdCBzdGFydE9mZnNldCA9IC0xOworCisgICAgICAgICAgICAgICAgLy8gQSB2YWxpZCBBQzQgc3RyZWFtIHNob3VsZCBoYXZlIG1pbmltdW0gb2YgNyBieXRlcyBpbiBpdHMgYnVmZmVyLgorICAgICAgICAgICAgICAgIC8vIChTeW5jIGhlYWRlciA0IGJ5dGVzICsgQUM0IHRvYyAzIGJ5dGVzKQorICAgICAgICAgICAgICAgIGlmIChzaXplIDwgNykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoSXNTZWVtaW5nbHlWYWxpZEFDNEhlYWRlcigmcHRyW2ldLCBzaXplIC0gaSwgZnJhbWVTaXplKSA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQgPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnRPZmZzZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0T2Zmc2V0ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HSSgiZm91bmQgc29tZXRoaW5nIHJlc2VtYmxpbmcgYW4gQUM0IHN5bmN3b3JkIGF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mZnNldCAlemQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydE9mZnNldCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChmcmFtZVNpemUgIT0gc2l6ZSAtIHN0YXJ0T2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBQzQgZnJhbWUgc2l6ZSBpcyAldSBieXRlcywgd2hpbGUgdGhlIGJ1ZmZlciBzaXplIGlzICV6ZCBieXRlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVNpemUsIHNpemUgLSBzdGFydE9mZnNldCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGF0YSA9ICZwdHJbc3RhcnRPZmZzZXRdOworICAgICAgICAgICAgICAgIHNpemUgLT0gc3RhcnRPZmZzZXQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGNhc2UgTVBFR19BVURJTzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB1aW50OF90ICpwdHIgPSAodWludDhfdCAqKWRhdGE7CkBAIC00OTQsNiArNjk5LDcgQEAKIAogdm9pZCBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmFwcGVuZFNjcmFtYmxlZERhdGEoCiAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLAorICAgICAgICBzaXplX3QgbGVhZGluZ0NsZWFyQnl0ZXMsCiAgICAgICAgIGludDMyX3Qga2V5SWQsIGJvb2wgaXNTeW5jLAogICAgICAgICBzcDxBQnVmZmVyPiBjbGVhclNpemVzLCBzcDxBQnVmZmVyPiBlbmNTaXplcykgewogICAgIGlmICghaXNTY3JhbWJsZWQoKSkgewpAQCAtNTIxLDYgKzcyNyw3IEBACiAKICAgICBTY3JhbWJsZWRSYW5nZUluZm8gc2NyYW1ibGVkSW5mbzsKICAgICBzY3JhbWJsZWRJbmZvLm1MZW5ndGggPSBzaXplOworICAgIHNjcmFtYmxlZEluZm8ubUxlYWRpbmdDbGVhckJ5dGVzID0gbGVhZGluZ0NsZWFyQnl0ZXM7CiAgICAgc2NyYW1ibGVkSW5mby5tS2V5SWQgPSBrZXlJZDsKICAgICBzY3JhbWJsZWRJbmZvLm1Jc1N5bmMgPSBpc1N5bmM7CiAgICAgc2NyYW1ibGVkSW5mby5tQ2xlYXJTaXplcyA9IGNsZWFyU2l6ZXM7CkBAIC01MzMsNyArNzQwLDYgQEAKIAogc3A8QUJ1ZmZlcj4gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpkZXF1ZXVlU2NyYW1ibGVkQWNjZXNzVW5pdCgpIHsKICAgICBzaXplX3QgbmV4dFNjYW4gPSBtQnVmZmVyLT5zaXplKCk7Ci0gICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CiAgICAgaW50MzJfdCBwZXNPZmZzZXQgPSAwLCBwZXNTY3JhbWJsaW5nQ29udHJvbCA9IDA7CiAgICAgaW50NjRfdCB0aW1lVXMgPSBmZXRjaFRpbWVzdGFtcChuZXh0U2NhbiwgJnBlc09mZnNldCwgJnBlc1NjcmFtYmxpbmdDb250cm9sKTsKICAgICBpZiAodGltZVVzIDwgMGxsKSB7CkBAIC01NDQsNiArNzUwLDcgQEAKICAgICAvLyByZXR1cm4gc2NyYW1ibGVkIHVuaXQKICAgICBpbnQzMl90IGtleUlkID0gcGVzU2NyYW1ibGluZ0NvbnRyb2wsIGlzU3luYyA9IDAsIHNjcmFtYmxlZExlbmd0aCA9IDA7CiAgICAgc3A8QUJ1ZmZlcj4gY2xlYXJTaXplcywgZW5jU2l6ZXM7CisgICAgc2l6ZV90IGxlYWRpbmdDbGVhckJ5dGVzOwogICAgIHdoaWxlIChtU2NyYW1ibGVkUmFuZ2VJbmZvcy5zaXplKCkgPiBtUmFuZ2VJbmZvcy5zaXplKCkpIHsKICAgICAgICAgYXV0byBpdCA9IG1TY3JhbWJsZWRSYW5nZUluZm9zLmJlZ2luKCk7CiAgICAgICAgIEFMT0dWKCJbc3RyZWFtICVkXSBmZXRjaGluZyBzY3JhbWJsZWQgcmFuZ2U6IHNpemU9JXp1IiwgbU1vZGUsIGl0LT5tTGVuZ3RoKTsKQEAgLTU2MSw2ICs3NjgsNyBAQAogICAgICAgICBjbGVhclNpemVzID0gaXQtPm1DbGVhclNpemVzOwogICAgICAgICBlbmNTaXplcyA9IGl0LT5tRW5jU2l6ZXM7CiAgICAgICAgIGlzU3luYyA9IGl0LT5tSXNTeW5jOworICAgICAgICBsZWFkaW5nQ2xlYXJCeXRlcyA9IGl0LT5tTGVhZGluZ0NsZWFyQnl0ZXM7CiAgICAgICAgIG1TY3JhbWJsZWRSYW5nZUluZm9zLmVyYXNlKGl0KTsKICAgICB9CiAgICAgaWYgKHNjcmFtYmxlZExlbmd0aCA9PSAwKSB7CkBAIC01NjgsMjYgKzc3Niw3NCBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICAvLyBza2lwIHRoZSBQRVMgaGVhZGVyLCBhbmQgY29weSB0aGUgcmVzdCBpbnRvIHNjcmFtYmxlZCBhY2Nlc3MgdW5pdAotICAgIHNwPEFCdWZmZXI+IHNjcmFtYmxlZEFjY2Vzc1VuaXQgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoCi0gICAgICAgICAgICBtU2NyYW1ibGVkQnVmZmVyLT5kYXRhKCkgKyBwZXNPZmZzZXQsCi0gICAgICAgICAgICBzY3JhbWJsZWRMZW5ndGggLSBwZXNPZmZzZXQpOwotCi0gICAgLy8gZml4IHVwIGZpcnN0IHNhbXBsZSBzaXplIGFmdGVyIHNraXBwaW5nIHRoZSBQRVMgaGVhZGVyCi0gICAgaWYgKHBlc09mZnNldCA+IDApIHsKLSAgICAgICAgaW50MzJfdCAmZmlyc3RDbGVhclNpemUgPSAqKGludDMyX3QqKWNsZWFyU2l6ZXMtPmRhdGEoKTsKLSAgICAgICAgaW50MzJfdCAmZmlyc3RFbmNTaXplID0gKihpbnQzMl90KillbmNTaXplcy0+ZGF0YSgpOwotICAgICAgICAvLyBDdXQgYXdheSB0aGUgUEVTIGhlYWRlcgotICAgICAgICBpZiAoZmlyc3RDbGVhclNpemUgPj0gcGVzT2Zmc2V0KSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGlzIGZvciBUUy1sZXZlbCBzY3JhbWJsaW5nLCB3ZSBkZXNjcmFtYmxlZCB0aGUgZmlyc3QKLSAgICAgICAgICAgIC8vIChvciBpdCB3YXMgY2xlYXIgdG8gYmVnaW4gd2l0aCkKLSAgICAgICAgICAgIGZpcnN0Q2xlYXJTaXplIC09IHBlc09mZnNldDsKLSAgICAgICAgfSBlbHNlIGlmIChmaXJzdEVuY1NpemUgPj0gcGVzT2Zmc2V0KSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGJlIFBFUy1sZXZlbCBzY3JhbWJsaW5nCi0gICAgICAgICAgICBmaXJzdEVuY1NpemUgLT0gcGVzT2Zmc2V0OwotICAgICAgICB9CisgICAgLy8gUmV0cmlldmUgdGhlIGxlYWRpbmcgY2xlYXIgYnl0ZXMgaW5mbywgYW5kIHVzZSBpdCB0byBzZXQgdGhlIGNsZWFyCisgICAgLy8gcmFuZ2Ugb24gbUJ1ZmZlci4gTm90ZSB0aGF0IHRoZSBsZWFkaW5nIGNsZWFyIGJ5dGVzIGluY2x1ZGVzIHRoZQorICAgIC8vIFBFUyBoZWFkZXIgcG9ydGlvbiwgd2hpbGUgbUJ1ZmZlciBkb2Vzbid0LgorICAgIGlmICgoaW50MzJfdClsZWFkaW5nQ2xlYXJCeXRlcyA+IHBlc09mZnNldCkgeworICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBsZWFkaW5nQ2xlYXJCeXRlcyAtIHBlc09mZnNldCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CiAgICAgfQogCisgICAgLy8gVHJ5IHRvIHBhcnNlIGZvcm1hdHMsIGFuZCBpZiB1bmF2YWlsYWJsZSBzZXQgdXAgYSBkdW1teSBmb3JtYXQuCisgICAgLy8gT25seSBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgbW9kZXMgZm9yIHNjcmFtYmxlZCBjb250ZW50IGZvciBub3cuCisgICAgLy8gKHdpbGwgYmUgZXhwYW5kZWQgbGF0ZXIpLgorICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgbUZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKKyAgICAgICAgc3dpdGNoIChtTW9kZSkgeworICAgICAgICAgICAgY2FzZSBIMjY0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgKm1Gb3JtYXQsIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HSSgiQ3JlYXRpbmcgZHVtbXkgQVZDIGZvcm1hdCBmb3Igc2NyYW1ibGVkIGNvbnRlbnQiKTsKKworICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICAgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVdpZHRoLCAxMjgwKTsKKyAgICAgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUhlaWdodCwgNzIwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFBQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIU1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICptRm9ybWF0LCBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koIkNyZWF0aW5nIGR1bW15IEFBQyBmb3JtYXQgZm9yIHNjcmFtYmxlZCBjb250ZW50Iik7CisKKyAgICAgICAgICAgICAgICAgICAgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKCptRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLypwcm9maWxlKi8sIDcgLypzYW1wbGluZ19mcmVxX2luZGV4Ki8sIDEgLypjaGFubmVsX2NvbmZpZyovKTsKKyAgICAgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUlzQURUUywgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIE1QRUdfVklERU86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQUxPR0koIkNyZWF0aW5nIGR1bW15IE1QRUcgZm9ybWF0IGZvciBzY3JhbWJsZWQgY29udGVudCIpOworCisgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKTsKKyAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5V2lkdGgsIDEyODApOworICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlIZWlnaHQsIDcyMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFMT0dFKCJVbmtub3duIG1vZGUgZm9yIHNjcmFtYmxlZCBjb250ZW50Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBmb3IgTWVkaWFFeHRyYWN0b3IuQ2FzSW5mbworICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5Q0FTeXN0ZW1JRCwgbUNBU3lzdGVtSWQpOworICAgICAgICBtRm9ybWF0LT5zZXREYXRhKGtLZXlDQVNlc3Npb25JRCwKKyAgICAgICAgICAgICAgICAwLCBtQ2FzU2Vzc2lvbklkLmRhdGEoKSwgbUNhc1Nlc3Npb25JZC5zaXplKCkpOworICAgIH0KKworICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIDApOworCisgICAgLy8gY29weSBpbnRvIHNjcmFtYmxlZCBhY2Nlc3MgdW5pdAorICAgIHNwPEFCdWZmZXI+IHNjcmFtYmxlZEFjY2Vzc1VuaXQgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoCisgICAgICAgICAgICBtU2NyYW1ibGVkQnVmZmVyLT5kYXRhKCksIHNjcmFtYmxlZExlbmd0aCk7CisKICAgICBzY3JhbWJsZWRBY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwogICAgIGlmIChpc1N5bmMpIHsKICAgICAgICAgc2NyYW1ibGVkQWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiaXNTeW5jIiwgMSk7CkBAIC02MDAsNiArODU2LDcgQEAKICAgICBzY3JhbWJsZWRBY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDMyKCJjcnlwdG9LZXkiLCBrZXlJZCk7CiAgICAgc2NyYW1ibGVkQWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRCdWZmZXIoImNsZWFyQnl0ZXMiLCBjbGVhclNpemVzKTsKICAgICBzY3JhbWJsZWRBY2Nlc3NVbml0LT5tZXRhKCktPnNldEJ1ZmZlcigiZW5jQnl0ZXMiLCBlbmNTaXplcyk7CisgICAgc2NyYW1ibGVkQWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigicGVzT2Zmc2V0IiwgcGVzT2Zmc2V0KTsKIAogICAgIG1lbW1vdmUobVNjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpLAogICAgICAgICAgICAgbVNjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpICsgc2NyYW1ibGVkTGVuZ3RoLApAQCAtNjE0LDcgKzg3MSwxMSBAQAogfQogCiBzcDxBQnVmZmVyPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmRlcXVldWVBY2Nlc3NVbml0KCkgewotICAgIGlmICgobUZsYWdzICYga0ZsYWdfQWxpZ25lZERhdGEpICYmIG1Nb2RlID09IEgyNjQgJiYgIWlzU2NyYW1ibGVkKCkpIHsKKyAgICBpZiAoaXNTY3JhbWJsZWQoKSkgeworICAgICAgICByZXR1cm4gZGVxdWV1ZVNjcmFtYmxlZEFjY2Vzc1VuaXQoKTsKKyAgICB9CisKKyAgICBpZiAoKG1GbGFncyAmIGtGbGFnX0FsaWduZWREYXRhKSAmJiBtTW9kZSA9PSBIMjY0KSB7CiAgICAgICAgIGlmIChtUmFuZ2VJbmZvcy5lbXB0eSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQpAQCAtNjQ4LDcgKzkwOSwxMCBAQAogICAgICAgICBjYXNlIEFBQzoKICAgICAgICAgICAgIHJldHVybiBkZXF1ZXVlQWNjZXNzVW5pdEFBQygpOwogICAgICAgICBjYXNlIEFDMzoKLSAgICAgICAgICAgIHJldHVybiBkZXF1ZXVlQWNjZXNzVW5pdEFDMygpOworICAgICAgICBjYXNlIEVBQzM6CisgICAgICAgICAgICByZXR1cm4gZGVxdWV1ZUFjY2Vzc1VuaXRFQUMzKCk7CisgICAgICAgIGNhc2UgQUM0OgorICAgICAgICAgICAgcmV0dXJuIGRlcXVldWVBY2Nlc3NVbml0QUM0KCk7CiAgICAgICAgIGNhc2UgTVBFR19WSURFTzoKICAgICAgICAgICAgIHJldHVybiBkZXF1ZXVlQWNjZXNzVW5pdE1QRUdWaWRlbygpOwogICAgICAgICBjYXNlIE1QRUc0X1ZJREVPOgpAQCAtNjY2LDM0ICs5MzAsMzggQEAKICAgICB9CiB9CiAKLXNwPEFCdWZmZXI+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZGVxdWV1ZUFjY2Vzc1VuaXRBQzMoKSB7CitzcDxBQnVmZmVyPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmRlcXVldWVBY2Nlc3NVbml0RUFDMygpIHsKICAgICB1bnNpZ25lZCBzeW5jU3RhcnRQb3MgPSAwOyAgLy8gaW4gYnl0ZXMKICAgICB1bnNpZ25lZCBwYXlsb2FkU2l6ZSA9IDA7CiAgICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKIAotICAgIEFMT0dWKCJkZXF1ZXVlQWNjZXNzVW5pdF9BQzNbJWRdOiBtQnVmZmVyICVwKCV6dSkiLCBtQVVJbmRleCwgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpOworICAgIEFMT0dWKCJkZXF1ZXVlQWNjZXNzVW5pdEVBQzNbJWRdOiBtQnVmZmVyICVwKCV6dSkiLCBtQVVJbmRleCwKKyAgICAgICAgICAgIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKTsKIAogICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgIGlmIChzeW5jU3RhcnRQb3MgKyAyID49IG1CdWZmZXItPnNpemUoKSkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KIAotICAgICAgICBwYXlsb2FkU2l6ZSA9IHBhcnNlQUMzU3luY0ZyYW1lKAotICAgICAgICAgICAgICAgIG1CdWZmZXItPmRhdGEoKSArIHN5bmNTdGFydFBvcywKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5zaXplKCkgLSBzeW5jU3RhcnRQb3MsCi0gICAgICAgICAgICAgICAgJmZvcm1hdCk7CisgICAgICAgIHVpbnQ4X3QgKnB0ciA9IG1CdWZmZXItPmRhdGEoKSArIHN5bmNTdGFydFBvczsKKyAgICAgICAgc2l6ZV90IHNpemUgPSBtQnVmZmVyLT5zaXplKCkgLSBzeW5jU3RhcnRQb3M7CisgICAgICAgIGlmIChtTW9kZSA9PSBBQzMpIHsKKyAgICAgICAgICAgIHBheWxvYWRTaXplID0gcGFyc2VBQzNTeW5jRnJhbWUocHRyLCBzaXplLCAmZm9ybWF0KTsKKyAgICAgICAgfSBlbHNlIGlmIChtTW9kZSA9PSBFQUMzKSB7CisgICAgICAgICAgICBwYXlsb2FkU2l6ZSA9IHBhcnNlRUFDM1N5bmNGcmFtZShwdHIsIHNpemUsICZmb3JtYXQpOworICAgICAgICB9CiAgICAgICAgIGlmIChwYXlsb2FkU2l6ZSA+IDApIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgQUxPR1YoImRlcXVldWVBY2Nlc3NVbml0X0FDM1slZF06IHN5bmNTdGFydFBvcyAldSBwYXlsb2FkU2l6ZSAldSIsCisgICAgICAgIEFMT0dWKCJkZXF1ZXVlQWNjZXNzVW5pdEVBQzNbJWRdOiBzeW5jU3RhcnRQb3MgJXUgcGF5bG9hZFNpemUgJXUiLAogICAgICAgICAgICAgICAgIG1BVUluZGV4LCBzeW5jU3RhcnRQb3MsIHBheWxvYWRTaXplKTsKIAogICAgICAgICArK3N5bmNTdGFydFBvczsKICAgICB9CiAKICAgICBpZiAobUJ1ZmZlci0+c2l6ZSgpIDwgc3luY1N0YXJ0UG9zICsgcGF5bG9hZFNpemUpIHsKLSAgICAgICAgQUxPR1YoIk5vdCBlbm91Z2ggYnVmZmVyIHNpemUgZm9yIEFDMyIpOworICAgICAgICBBTE9HVigiTm90IGVub3VnaCBidWZmZXIgc2l6ZSBmb3IgRS9BQzMiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC03MDEsNyArOTY5LDYgQEAKICAgICAgICAgbUZvcm1hdCA9IGZvcm1hdDsKICAgICB9CiAKLQogICAgIGludDY0X3QgdGltZVVzID0gZmV0Y2hUaW1lc3RhbXAoc3luY1N0YXJ0UG9zICsgcGF5bG9hZFNpemUpOwogICAgIGlmICh0aW1lVXMgPCAwbGwpIHsKICAgICAgICAgQUxPR0UoIm5lZ2F0aXZlIHRpbWVVcyIpOwpAQCAtNzEwLDcgKzk3NywxMiBAQAogCiAgICAgLy8gTm90IGRlY3J5cHRpbmcgaWYga2V5IGluZm8gbm90IGF2YWlsYWJsZSAoZS5nLiwgc2Nhbm5lci9leHRyYWN0b3IgcGFyc2luZyB0cyBmaWxlcykKICAgICBpZiAobVNhbXBsZURlY3J5cHRvciAhPSBOVUxMKSB7Ci0gICAgICAgIG1TYW1wbGVEZWNyeXB0b3ItPnByb2Nlc3NBQzMobUJ1ZmZlci0+ZGF0YSgpICsgc3luY1N0YXJ0UG9zLCBwYXlsb2FkU2l6ZSk7CisgICAgICAgIGlmIChtTW9kZSA9PSBBQzMpIHsKKyAgICAgICAgICAgIG1TYW1wbGVEZWNyeXB0b3ItPnByb2Nlc3NBQzMobUJ1ZmZlci0+ZGF0YSgpICsgc3luY1N0YXJ0UG9zLCBwYXlsb2FkU2l6ZSk7CisgICAgICAgIH0gZWxzZSBpZiAobU1vZGUgPT0gRUFDMykgeworICAgICAgICAgICAgQUxPR0UoIkVBQzMgQVUgaXMgZW5jcnlwdGVkIGFuZCBkZWNyeXB0aW9uIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAgICAgfQogICAgIG1BVUluZGV4Kys7CiAKQEAgLTczMCw2ICsxMDAyLDY5IEBACiAgICAgcmV0dXJuIGFjY2Vzc1VuaXQ7CiB9CiAKK3NwPEFCdWZmZXI+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZGVxdWV1ZUFjY2Vzc1VuaXRBQzQoKSB7CisgICAgdW5zaWduZWQgc3luY1N0YXJ0UG9zID0gMDsKKyAgICB1bnNpZ25lZCBwYXlsb2FkU2l6ZSA9IDA7CisgICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKKyAgICBBTE9HVigiZGVxdWV1ZUFjY2Vzc1VuaXRfQUM0WyVkXTogbUJ1ZmZlciAlcCglenUpIiwgbUFVSW5kZXgsIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKTsKKworICAgIC8vIEEgdmFsaWQgQUM0IHN0cmVhbSBzaG91bGQgaGF2ZSBtaW5pbXVtIG9mIDcgYnl0ZXMgaW4gaXRzIGJ1ZmZlci4KKyAgICAvLyAoU3luYyBoZWFkZXIgNCBieXRlcyArIEFDNCB0b2MgMyBieXRlcykKKyAgICBpZiAobUJ1ZmZlci0+c2l6ZSgpIDwgNykgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAoc3luY1N0YXJ0UG9zICsgMiA+PSBtQnVmZmVyLT5zaXplKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyc2VBQzRTeW5jRnJhbWUoCisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPmRhdGEoKSArIHN5bmNTdGFydFBvcywKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+c2l6ZSgpIC0gc3luY1N0YXJ0UG9zLAorICAgICAgICAgICAgICAgICAgICBwYXlsb2FkU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgJmZvcm1hdCk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoImRlcXVldWVBY2Nlc3NVbml0X0FDNFslZF06IHN5bmNTdGFydFBvcyAldSBwYXlsb2FkU2l6ZSAldSIsCisgICAgICAgICAgICAgICAgbUFVSW5kZXgsIHN5bmNTdGFydFBvcywgcGF5bG9hZFNpemUpOworCisgICAgICAgICsrc3luY1N0YXJ0UG9zOworICAgIH0KKworICAgIGlmIChtQnVmZmVyLT5zaXplKCkgPCBzeW5jU3RhcnRQb3MgKyBwYXlsb2FkU2l6ZSkgeworICAgICAgICBBTE9HVigiTm90IGVub3VnaCBidWZmZXIgc2l6ZSBmb3IgQUM0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgbUZvcm1hdCA9IGZvcm1hdDsKKyAgICB9CisKKyAgICBpbnQ2NF90IHRpbWVVcyA9IGZldGNoVGltZXN0YW1wKHN5bmNTdGFydFBvcyArIHBheWxvYWRTaXplKTsKKyAgICBpZiAodGltZVVzIDwgMGxsKSB7CisgICAgICAgIEFMT0dFKCJuZWdhdGl2ZSB0aW1lVXMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1BVUluZGV4Kys7CisKKyAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gbmV3IEFCdWZmZXIoc3luY1N0YXJ0UG9zICsgcGF5bG9hZFNpemUpOworICAgIG1lbWNweShhY2Nlc3NVbml0LT5kYXRhKCksIG1CdWZmZXItPmRhdGEoKSwgc3luY1N0YXJ0UG9zICsgcGF5bG9hZFNpemUpOworCisgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKKyAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDMyKCJpc1N5bmMiLCAxKTsKKworICAgIG1lbW1vdmUoCisgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCksCisgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCkgKyBzeW5jU3RhcnRQb3MgKyBwYXlsb2FkU2l6ZSwKKyAgICAgICAgICAgIG1CdWZmZXItPnNpemUoKSAtIHN5bmNTdGFydFBvcyAtIHBheWxvYWRTaXplKTsKKworICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIG1CdWZmZXItPnNpemUoKSAtIHN5bmNTdGFydFBvcyAtIHBheWxvYWRTaXplKTsKKyAgICByZXR1cm4gYWNjZXNzVW5pdDsKK30KKwogc3A8QUJ1ZmZlcj4gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpkZXF1ZXVlQWNjZXNzVW5pdFBDTUF1ZGlvKCkgewogICAgIGlmIChtQnVmZmVyLT5zaXplKCkgPCA0KSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtODUxLDI1ICsxMTg2LDExIEBACiAgICAgICAgIGJvb2wgcHJvdGVjdGlvbl9hYnNlbnQgPSBiaXRzLmdldEJpdHMoMSkgIT0gMDsKIAogICAgICAgICBpZiAobUZvcm1hdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBwcm9maWxlID0gYml0cy5nZXRCaXRzKDIpOwotICAgICAgICAgICAgaWYgKHByb2ZpbGUgPT0gM3UpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgicHJvZmlsZSBzaG91bGQgbm90IGJlIDMiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXggPSBiaXRzLmdldEJpdHMoNCk7Ci0gICAgICAgICAgICBiaXRzLmdldEJpdHMoMSk7ICAvLyBwcml2YXRlX2JpdAotICAgICAgICAgICAgdW5zaWduZWQgY2hhbm5lbF9jb25maWd1cmF0aW9uID0gYml0cy5nZXRCaXRzKDMpOwotICAgICAgICAgICAgaWYgKGNoYW5uZWxfY29uZmlndXJhdGlvbiA9PSAwdSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJjaGFubmVsX2NvbmZpZyBzaG91bGQgbm90IGJlIDAiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJpdHMuc2tpcEJpdHMoMik7ICAvLyBvcmlnaW5hbF9jb3B5LCBob21lCi0KICAgICAgICAgICAgIG1Gb3JtYXQgPSBuZXcgTWV0YURhdGE7Ci0gICAgICAgICAgICBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoKm1Gb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgIHByb2ZpbGUsIHNhbXBsaW5nX2ZyZXFfaW5kZXgsIGNoYW5uZWxfY29uZmlndXJhdGlvbik7Ci0KLSAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlJc0FEVFMsIHRydWUpOworICAgICAgICAgICAgaWYgKCFNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgICAgICAgICAgICAgICptRm9ybWF0LCBtQnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQsIG1CdWZmZXItPnNpemUoKSAtIG9mZnNldCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlOwogICAgICAgICAgICAgaW50MzJfdCBudW1DaGFubmVsczsKQEAgLTg4NCwxMiArMTIwNSwxMiBAQAogCiAgICAgICAgICAgICBBTE9HSSgiZm91bmQgQUFDIGNvZGVjIGNvbmZpZyAoJWQgSHosICVkIGNoYW5uZWxzKSIsCiAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIG51bUNoYW5uZWxzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHByb2ZpbGVfT2JqZWN0VHlwZSwgc2FtcGxpbmdfZnJlcXVlbmN5X2luZGV4LCBwcml2YXRlX2JpdHMsCi0gICAgICAgICAgICAvLyBjaGFubmVsX2NvbmZpZ3VyYXRpb24sIG9yaWdpbmFsX2NvcHksIGhvbWUKLSAgICAgICAgICAgIGJpdHMuc2tpcEJpdHMoMTIpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gcHJvZmlsZV9PYmplY3RUeXBlLCBzYW1wbGluZ19mcmVxdWVuY3lfaW5kZXgsIHByaXZhdGVfYml0cywKKyAgICAgICAgLy8gY2hhbm5lbF9jb25maWd1cmF0aW9uLCBvcmlnaW5hbF9jb3B5LCBob21lCisgICAgICAgIGJpdHMuc2tpcEJpdHMoMTIpOworCiAgICAgICAgIC8vIGFkdHNfdmFyaWFibGVfaGVhZGVyCiAKICAgICAgICAgLy8gY29weXJpZ2h0X2lkZW50aWZpY2F0aW9uX2JpdCwgY29weXJpZ2h0X2lkZW50aWZpY2F0aW9uX3N0YXJ0CkBAIC0xMDA0LDI3ICsxMzI1LDYgQEAKIH0KIAogc3A8QUJ1ZmZlcj4gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpkZXF1ZXVlQWNjZXNzVW5pdEgyNjQoKSB7Ci0gICAgaWYgKGlzU2NyYW1ibGVkKCkpIHsKLSAgICAgICAgaWYgKG1CdWZmZXIgPT0gTlVMTCB8fCBtQnVmZmVyLT5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Gb3JtYXQgPT0gTlVMTCkgewotICAgICAgICAgICAgbUZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKLSAgICAgICAgICAgIGlmICghTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKCptRm9ybWF0LCBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiQ3JlYXRpbmcgZHVtbXkgQVZDIGZvcm1hdCBmb3Igc2NyYW1ibGVkIGNvbnRlbnQiKTsKLSAgICAgICAgICAgICAgICBtRm9ybWF0ID0gbmV3IE1ldGFEYXRhOwotICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOwotICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlXaWR0aCwgMTI4MCk7Ci0gICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUhlaWdodCwgNzIwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGZvciBNZWRpYUV4dHJhY3Rvci5DYXNJbmZvCi0gICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5Q0FTeXN0ZW1JRCwgbUNBU3lzdGVtSWQpOwotICAgICAgICAgICAgbUZvcm1hdC0+c2V0RGF0YShrS2V5Q0FTZXNzaW9uSUQsIDAsCi0gICAgICAgICAgICAgICAgICAgIG1DYXNTZXNzaW9uSWQuZGF0YSgpLCBtQ2FzU2Vzc2lvbklkLnNpemUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlcXVldWVTY3JhbWJsZWRBY2Nlc3NVbml0KCk7Ci0gICAgfQotCiAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IG1CdWZmZXItPmRhdGEoKTsKIAogICAgIHNpemVfdCBzaXplID0gbUJ1ZmZlci0+c2l6ZSgpOwpAQCAtMTMyNCwyNSArMTYyNCw2IEBACiB9CiAKIHNwPEFCdWZmZXI+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZGVxdWV1ZUFjY2Vzc1VuaXRNUEVHVmlkZW8oKSB7Ci0gICAgaWYgKGlzU2NyYW1ibGVkKCkpIHsKLSAgICAgICAgaWYgKG1CdWZmZXIgPT0gTlVMTCB8fCBtQnVmZmVyLT5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Gb3JtYXQgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0koIkNyZWF0aW5nIGR1bW15IE1QRUcgZm9ybWF0IGZvciBzY3JhbWJsZWQgY29udGVudCIpOwotICAgICAgICAgICAgbUZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKLSAgICAgICAgICAgIG1Gb3JtYXQtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMik7Ci0gICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5V2lkdGgsIDEyODApOwotICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUhlaWdodCwgNzIwKTsKLQotICAgICAgICAgICAgLy8gZm9yIE1lZGlhRXh0cmFjdG9yLkNhc0luZm8KLSAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlDQVN5c3RlbUlELCBtQ0FTeXN0ZW1JZCk7Ci0gICAgICAgICAgICBtRm9ybWF0LT5zZXREYXRhKGtLZXlDQVNlc3Npb25JRCwgMCwKLSAgICAgICAgICAgICAgICAgICAgbUNhc1Nlc3Npb25JZC5kYXRhKCksIG1DYXNTZXNzaW9uSWQuc2l6ZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVxdWV1ZVNjcmFtYmxlZEFjY2Vzc1VuaXQoKTsKLSAgICB9Ci0KICAgICBjb25zdCB1aW50OF90ICpkYXRhID0gbUJ1ZmZlci0+ZGF0YSgpOwogICAgIHNpemVfdCBzaXplID0gbUJ1ZmZlci0+c2l6ZSgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oCmluZGV4IGZmY2I1MDIuLjMyMjdmNDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oCkBAIC0zOCw2ICszOCw4IEBACiAgICAgICAgIEgyNjQsCiAgICAgICAgIEFBQywKICAgICAgICAgQUMzLAorICAgICAgICBFQUMzLAorICAgICAgICBBQzQsCiAgICAgICAgIE1QRUdfQVVESU8sCiAgICAgICAgIE1QRUdfVklERU8sCiAgICAgICAgIE1QRUc0X1ZJREVPLApAQCAtNTksNiArNjEsNyBAQAogCiAgICAgdm9pZCBhcHBlbmRTY3JhbWJsZWREYXRhKAogICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICBzaXplX3QgbGVhZGluZ0NsZWFyQnl0ZXMsCiAgICAgICAgICAgICBpbnQzMl90IGtleUlkLCBib29sIGlzU3luYywKICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGNsZWFyU2l6ZXMsIHNwPEFCdWZmZXI+IGVuY1NpemVzKTsKIApAQCAtODQsOCArODcsOCBAQAogICAgIH07CiAKICAgICBzdHJ1Y3QgU2NyYW1ibGVkUmFuZ2VJbmZvIHsKLSAgICAgICAgLy9pbnQ2NF90IG1UaW1lc3RhbXBVczsKICAgICAgICAgc2l6ZV90IG1MZW5ndGg7CisgICAgICAgIHNpemVfdCBtTGVhZGluZ0NsZWFyQnl0ZXM7CiAgICAgICAgIGludDMyX3QgbUtleUlkOwogICAgICAgICBpbnQzMl90IG1Jc1N5bmM7CiAgICAgICAgIHNwPEFCdWZmZXI+IG1DbGVhclNpemVzOwpAQCAtMTE1LDcgKzExOCw4IEBACiAKICAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdEgyNjQoKTsKICAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdEFBQygpOwotICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0QUMzKCk7CisgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRFQUMzKCk7CisgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRBQzQoKTsKICAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdE1QRUdBdWRpbygpOwogICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0TVBFR1ZpZGVvKCk7CiAgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRNUEVHNFZpZGVvKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLmJwCmluZGV4IDhhNzZkZTMuLjM2MmI3ZjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLmJwCkBAIC01Myw3ICs1Myw2IEBACiAgICAgICAgICJsaWJoaWRsYmFzZSIsCiAgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKICAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAotICAgICAgICAibGlibmF0aXZld2luZG93IiwgLy8gVE9ETyhiLzYyOTIzNDc5KTogdXNlIGhlYWRlciBsaWJyYXJ5CiAgICAgICAgICJsaWJ2bmRrc3VwcG9ydCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5jcHAKaW5kZXggOWVkNGE5OS4uMWI4NDkzYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuY3BwCkBAIC0xNTAsNiArMTUwLDggQEAKICAgICAgICAgICAgICJ2aWRlb19kZWNvZGVyLnZwOCIsICJ2aWRlb19lbmNvZGVyLnZwOCIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19WUDksCiAgICAgICAgICAgICAidmlkZW9fZGVjb2Rlci52cDkiLCAidmlkZW9fZW5jb2Rlci52cDkiIH0sCisgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVYxLAorICAgICAgICAgICAgInZpZGVvX2RlY29kZXIuYXYxIiwgInZpZGVvX2VuY29kZXIuYXYxIiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX1JBVywKICAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLnJhdyIsICJhdWRpb19lbmNvZGVyLnJhdyIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04sCkBAIC0xNjQsNiArMTY2LDEwIEBACiAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5hYzMiLCAiYXVkaW9fZW5jb2Rlci5hYzMiIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMywKICAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLmVhYzMiLCAiYXVkaW9fZW5jb2Rlci5lYWMzIiB9LAorICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0VBQzNfSk9DLAorICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIuZWFjM19qb2MiLCAiYXVkaW9fZW5jb2Rlci5lYWMzX2pvYyIgfSwKKyAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BQzQsCisgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5hYzQiLCAiYXVkaW9fZW5jb2Rlci5hYzQiIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDLAogICAgICAgICAgICAgImltYWdlX2RlY29kZXIuaGVpYyIsICJpbWFnZV9lbmNvZGVyLmhlaWMiIH0sCiAgICAgfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcAppbmRleCA1NWFmZTA0Li5kZGI0NTlmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuY3BwCkBAIC0zNCw3ICszNCw4IEBACiAgICAgICBtTG9vcGVyKG5ldyBBTG9vcGVyKSwKICAgICAgIG1IYW5kbGVyKG5ldyBBSGFuZGxlclJlZmxlY3RvcjxTaW1wbGVTb2Z0T01YQ29tcG9uZW50Pih0aGlzKSksCiAgICAgICBtU3RhdGUoT01YX1N0YXRlTG9hZGVkKSwKLSAgICAgIG1UYXJnZXRTdGF0ZShPTVhfU3RhdGVMb2FkZWQpIHsKKyAgICAgIG1UYXJnZXRTdGF0ZShPTVhfU3RhdGVMb2FkZWQpLAorICAgICAgbUZyYW1lQ29uZmlnKGZhbHNlKSB7CiAgICAgbUxvb3Blci0+c2V0TmFtZShuYW1lKTsKICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXIpOwogCkBAIC0yMDQsNiArMjA1LDIxIEBACiAgICAgfQogfQogCitPTVhfRVJST1JUWVBFIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmludGVybmFsU2V0Q29uZmlnKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcywgYm9vbCAqZnJhbWVDb25maWcpIHsKKyAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworfQorCitPTVhfRVJST1JUWVBFIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OnNldENvbmZpZygKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpIHsKKyAgICBib29sIGZyYW1lQ29uZmlnID0gbUZyYW1lQ29uZmlnOworICAgIE9NWF9FUlJPUlRZUEUgZXJyID0gaW50ZXJuYWxTZXRDb25maWcoaW5kZXgsIHBhcmFtcywgJmZyYW1lQ29uZmlnKTsKKyAgICBpZiAoZXJyID09IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgbUZyYW1lQ29uZmlnID0gZnJhbWVDb25maWc7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKIE9NWF9FUlJPUlRZUEUgU2ltcGxlU29mdE9NWENvbXBvbmVudDo6dXNlQnVmZmVyKAogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKmhlYWRlciwKICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsCkBAIC0zMzYsNiArMzUyLDEwIEBACiAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXIpIHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RW1wdHlUaGlzQnVmZmVyLCBtSGFuZGxlcik7CiAgICAgbXNnLT5zZXRQb2ludGVyKCJoZWFkZXIiLCBidWZmZXIpOworICAgIGlmIChtRnJhbWVDb25maWcpIHsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigiZnJhbWUtY29uZmlnIiwgbUZyYW1lQ29uZmlnKTsKKyAgICAgICAgbUZyYW1lQ29uZmlnID0gZmFsc2U7CisgICAgfQogICAgIG1zZy0+cG9zdCgpOwogCiAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CkBAIC0zNzgsNiArMzk4LDEwIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXI7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJoZWFkZXIiLCAodm9pZCAqKikmaGVhZGVyKSk7CisgICAgICAgICAgICBpbnQzMl90IGZyYW1lQ29uZmlnOworICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiZnJhbWUtY29uZmlnIiwgJmZyYW1lQ29uZmlnKSkgeworICAgICAgICAgICAgICAgIGZyYW1lQ29uZmlnID0gMDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQ0hFQ0sobVN0YXRlID09IE9NWF9TdGF0ZUV4ZWN1dGluZyAmJiBtVGFyZ2V0U3RhdGUgPT0gbVN0YXRlKTsKIApAQCAtMzkzLDYgKzQxNyw3IEBACiAgICAgICAgICAgICAgICAgICAgIENIRUNLKCFidWZmZXItPm1Pd25lZEJ5VXMpOwogCiAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+bU93bmVkQnlVcyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+bUZyYW1lQ29uZmlnID0gKGJvb2wpZnJhbWVDb25maWc7CiAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soKG1zZ1R5cGUgPT0ga1doYXRFbXB0eVRoaXNCdWZmZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBwb3J0LT5tRGVmLmVEaXIgPT0gT01YX0RpcklucHV0KQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwCmluZGV4IDkzNWRjMzQuLmU4NTNkYTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5jcHAKQEAgLTE1NCwxMiArMTU0LDEyIEBACiAgICAgb3V0RGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBvdXRwdXRCdWZmZXJXaWR0aCgpOwogICAgIG91dERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG91dHB1dEJ1ZmZlckhlaWdodCgpOwogICAgIG91dERlZi0+Zm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IG1PdXRwdXRGb3JtYXQ7Ci0gICAgb3V0RGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSA9IG91dERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOwogICAgIG91dERlZi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IG91dERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKIAogICAgIGludDMyX3QgYnBwID0gKG1PdXRwdXRGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjE2KSA/IDIgOiAxOworICAgIG91dERlZi0+Zm9ybWF0LnZpZGVvLm5TdHJpZGUgPSBvdXREZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCAqIGJwcDsKICAgICBvdXREZWYtPm5CdWZmZXJTaXplID0KLSAgICAgICAgKG91dERlZi0+Zm9ybWF0LnZpZGVvLm5TdHJpZGUgKiBvdXREZWYtPmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgKiBicHAgKiAzKSAvIDI7CisgICAgICAgICAgICAob3V0RGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSAqIG91dERlZi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCAqIDMpIC8gMjsKIAogICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKmluRGVmID0gJmVkaXRQb3J0SW5mbyhrSW5wdXRQb3J0SW5kZXgpLT5tRGVmOwogICAgIGluRGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7CkBAIC01MDIsNyArNTAyLDggQEAKICAgICAgICAgICAgIC8vIFRoZXNlIHZhbHVlcyB3ZXJlIGNob3NlbiB0byBwcmV2ZW50IGludGVnZXIgb3ZlcmZsb3dzIGZ1cnRoZXIgZG93biB0aGUgbGluZSwgYW5kIGRvCiAgICAgICAgICAgICAvLyBub3QgaW5kaWNhdGUgc3VwcG9ydCBmb3IgMzJreDMyayB2aWRlby4KICAgICAgICAgICAgIGlmIChuZXdXaWR0aCA+IDMyNzY4IHx8IG5ld0hlaWdodCA+IDMyNzY4Ci0gICAgICAgICAgICAgICAgICAgIHx8IHZpZGVvX2RlZi0+blN0cmlkZSA+IDMyNzY4IHx8IHZpZGVvX2RlZi0+blNsaWNlSGVpZ2h0ID4gMzI3NjgpIHsKKyAgICAgICAgICAgICAgICAgICAgfHwgdmlkZW9fZGVmLT5uU3RyaWRlID4gMzI3NjggfHwgdmlkZW9fZGVmLT5uU3RyaWRlIDwgLTMyNzY4CisgICAgICAgICAgICAgICAgICAgIHx8IHZpZGVvX2RlZi0+blNsaWNlSGVpZ2h0ID4gMzI3NjgpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiYi8yMjg4NTQyMSIpOwogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CiAgICAgICAgICAgICB9CkBAIC02MDEsMTMgKzYwMiw0MCBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtEZXNjcmliZUhkcjEwUGx1c0luZm9JbmRleDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFzdXBwb3J0RGVzY3JpYmVIZHIxMFBsdXNJbmZvKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1IZHIxMFBsdXNPdXRwdXRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBhdXRvIGl0ID0gbUhkcjEwUGx1c091dHB1dHMuYmVnaW4oKTsKKworICAgICAgICAgICAgICAgIGF1dG8gaW5mbyA9ICgqaXQpLmdldCgpOworCisgICAgICAgICAgICAgICAgRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zKiBvdXRQYXJhbXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgKERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyAqKXBhcmFtczsKKworICAgICAgICAgICAgICAgIG91dFBhcmFtcy0+blBhcmFtU2l6ZVVzZWQgPSBpbmZvLT5zaXplKCk7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgYnVmZmVyIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgZG9lcyBub3QgaGF2ZSBlbm91Z2gKKyAgICAgICAgICAgICAgICAvLyBzdG9yYWdlLCByZXR1cm4gdGhlIHNpemUgb25seSBhbmQgZG8gbm90IHJlbW92ZSB0aGUgcGFyYW0geWV0LgorICAgICAgICAgICAgICAgIGlmIChvdXRQYXJhbXMtPm5QYXJhbVNpemUgPj0gaW5mby0+c2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShvdXRQYXJhbXMtPm5WYWx1ZSwgaW5mby0+ZGF0YSgpLCBpbmZvLT5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICBtSGRyMTBQbHVzT3V0cHV0cy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVyZmxvdzsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKICAgICB9CiB9CiAKLU9NWF9FUlJPUlRZUEUgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6c2V0Q29uZmlnKAotICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcyl7CitPTVhfRVJST1JUWVBFIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OmludGVybmFsU2V0Q29uZmlnKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcywgYm9vbCAqZnJhbWVDb25maWcpewogICAgIHN3aXRjaCAoKGludClpbmRleCkgewogICAgICAgICBjYXNlIGtEZXNjcmliZUNvbG9yQXNwZWN0c0luZGV4OgogICAgICAgICB7CkBAIC02NTcsMTEgKzY4NSw1NSBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtEZXNjcmliZUhkcjEwUGx1c0luZm9JbmRleDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFzdXBwb3J0RGVzY3JpYmVIZHIxMFBsdXNJbmZvKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uc3QgRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zKiBpblBhcmFtcyA9CisgICAgICAgICAgICAgICAgICAgIChEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICgqZnJhbWVDb25maWcpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgcmVxdWVzdCB0byBhcHBlbmQgdG8gdGhlIGN1cnJlbnQgZnJhbWUgY29uZmlnIHNldC4KKyAgICAgICAgICAgICAgICAvLyBGb3Igbm93LCB3ZSBvbmx5IHN1cHBvcnQga0Rlc2NyaWJlSGRyMTBQbHVzSW5mb0luZGV4LCB3aGljaAorICAgICAgICAgICAgICAgIC8vIHdlIHNpbXBseSByZXBsYWNlIHdpdGggdGhlIGxhc3Qgc2V0IHZhbHVlLgorICAgICAgICAgICAgICAgIGlmIChtSGRyMTBQbHVzSW5wdXRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgKigtLW1IZHIxMFBsdXNJbnB1dHMuZW5kKCkpID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGFyYW1zLT5uVmFsdWUsIGluUGFyYW1zLT5uUGFyYW1TaXplVXNlZCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIklnbm9yaW5nIGtEZXNjcmliZUhkcjEwUGx1c0luZm9JbmRleDogYXBwZW5kIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJhbWUgY29uZmlnIHdoaWxlIG5vIGZyYW1lIGNvbmZpZyBpcyBwcmVzZW50Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgZnJhbWUgY29uZmlnLCBzZXR0aW5nICpmcmFtZUNvbmZpZyB0byB0cnVlIHNvIHRoYXQKKyAgICAgICAgICAgICAgICAvLyB0aGUgY2xpZW50IG1hcmtzIHRoZSBuZXh0IHF1ZXVlZCBpbnB1dCBmcmFtZSB0byBhcHBseSBpdC4KKyAgICAgICAgICAgICAgICAqZnJhbWVDb25maWcgPSB0cnVlOworICAgICAgICAgICAgICAgIG1IZHIxMFBsdXNJbnB1dHMucHVzaF9iYWNrKEFCdWZmZXI6OkNyZWF0ZUFzQ29weSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGluUGFyYW1zLT5uVmFsdWUsIGluUGFyYW1zLT5uUGFyYW1TaXplVXNlZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CiAgICAgfQogfQogCitzcDxBQnVmZmVyPiBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpkZXF1ZXVlSW5wdXRGcmFtZUNvbmZpZygpIHsKKyAgICBhdXRvIGl0ID0gbUhkcjEwUGx1c0lucHV0cy5iZWdpbigpOworICAgIHNwPEFCdWZmZXI+IGluZm8gPSAqaXQ7CisgICAgbUhkcjEwUGx1c0lucHV0cy5lcmFzZShpdCk7CisgICAgcmV0dXJuIGluZm87Cit9CisKK3ZvaWQgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6cXVldWVPdXRwdXRGcmFtZUNvbmZpZyhjb25zdCBzcDxBQnVmZmVyPiAmaW5mbykgeworICAgIG1IZHIxMFBsdXNPdXRwdXRzLnB1c2hfYmFjayhpbmZvKTsKKyAgICBub3RpZnkoT01YX0V2ZW50Q29uZmlnVXBkYXRlLAorICAgICAgICAgICBrT3V0cHV0UG9ydEluZGV4LAorICAgICAgICAgICBrRGVzY3JpYmVIZHIxMFBsdXNJbmZvSW5kZXgsCisgICAgICAgICAgIE5VTEwpOworfQogCiBPTVhfRVJST1JUWVBFIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OmdldEV4dGVuc2lvbkluZGV4KAogICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBPTVhfSU5ERVhUWVBFICppbmRleCkgewpAQCAtNjc2LDYgKzc0OCwxMCBAQAogICAgICAgICAgICAgJiYgc3VwcG9ydERlc2NyaWJlSGRyU3RhdGljSW5mbygpKSB7CiAgICAgICAgICooaW50MzJfdCopaW5kZXggPSBrRGVzY3JpYmVIZHJTdGF0aWNJbmZvSW5kZXg7CiAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LmRlc2NyaWJlSERSMTBQbHVzSW5mbyIpCisgICAgICAgICAgICAmJiBzdXBwb3J0RGVzY3JpYmVIZHIxMFBsdXNJbmZvKCkpIHsKKyAgICAgICAgKihpbnQzMl90KilpbmRleCA9IGtEZXNjcmliZUhkcjEwUGx1c0luZm9JbmRleDsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgfQogCiAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmdldEV4dGVuc2lvbkluZGV4KG5hbWUsIGluZGV4KTsKQEAgLTY5Myw2ICs3NjksMTAgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK2Jvb2wgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6c3VwcG9ydERlc2NyaWJlSGRyMTBQbHVzSW5mbygpIHsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIHZvaWQgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6b25SZXNldCgpIHsKICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gTk9ORTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmgKaW5kZXggYTlmY2U1NS4uMGYyMjlmNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmgKQEAgLTE5MCw3ICsxOTAsMTIgQEAKICAqLwogLy8gY29udmVydDogU3RhdHVzIC0+IHN0YXR1c190CiBpbmxpbmUgc3RhdHVzX3QgdG9TdGF0dXNUKFJldHVybjxTdGF0dXM+IGNvbnN0JiB0KSB7Ci0gICAgcmV0dXJuIHQuaXNPaygpID8gdG9TdGF0dXNUKHN0YXRpY19jYXN0PFN0YXR1cz4odCkpIDogVU5LTk9XTl9FUlJPUjsKKyAgICBpZiAodC5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIHRvU3RhdHVzVChzdGF0aWNfY2FzdDxTdGF0dXM+KHQpKTsKKyAgICB9IGVsc2UgaWYgKHQuaXNEZWFkT2JqZWN0KCkpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaAppbmRleCAxZDFmMmJkLi42YmJlZGRhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgIlNvZnRPTVhDb21wb25lbnQuaCIKIAorI2luY2x1ZGUgPGF0b21pYz4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyUmVmbGVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KQEAgLTI4LDYgKzI5LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFMb29wZXI7CitzdHJ1Y3QgQUJ1ZmZlcjsKIAogc3RydWN0IENvZGVjUHJvZmlsZUxldmVsIHsKICAgICBPTVhfVTMyIG1Qcm9maWxlOwpAQCAtNDksNiArNTEsNyBAQAogICAgIHN0cnVjdCBCdWZmZXJJbmZvIHsKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm1IZWFkZXI7CiAgICAgICAgIGJvb2wgbU93bmVkQnlVczsKKyAgICAgICAgYm9vbCBtRnJhbWVDb25maWc7CiAgICAgfTsKIAogICAgIHN0cnVjdCBQb3J0SW5mbyB7CkBAIC03Niw2ICs3OSw5IEBACiAgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpOwogCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0Q29uZmlnKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMsIGJvb2wgKmZyYW1lQ29uZmlnKTsKKwogICAgIHZpcnR1YWwgdm9pZCBvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKICAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmdldFBvcnRRdWV1ZShPTVhfVTMyIHBvcnRJbmRleCk7CiAKQEAgLTEwMSw2ICsxMDcsNyBAQAogICAgIE9NWF9TVEFURVRZUEUgbVRhcmdldFN0YXRlOwogCiAgICAgVmVjdG9yPFBvcnRJbmZvPiBtUG9ydHM7CisgICAgc3RkOjphdG9taWNfYm9vbCBtRnJhbWVDb25maWc7CiAKICAgICBib29sIGlzU2V0UGFyYW1ldGVyQWxsb3dlZCgKICAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKSBjb25zdDsKQEAgLTExNCw2ICsxMjEsOSBAQAogICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBzZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcyk7CiAKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgc2V0Q29uZmlnKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpOworCiAgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIHVzZUJ1ZmZlcigKICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICoqYnVmZmVyLAogICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaAppbmRleCA1NmZjNjkxLi4zYjM4MWNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmgKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKIAorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXJSZWZsZWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CkBAIC0yOCw2ICsyOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDgsNiArNTAsNyBAQAogICAgIGVudW0gewogICAgICAgICBrRGVzY3JpYmVDb2xvckFzcGVjdHNJbmRleCA9IGtQcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFja0luZGV4ICsgMSwKICAgICAgICAga0Rlc2NyaWJlSGRyU3RhdGljSW5mb0luZGV4ID0ga1ByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrSW5kZXggKyAyLAorICAgICAgICBrRGVzY3JpYmVIZHIxMFBsdXNJbmZvSW5kZXggPSBrUHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2tJbmRleCArIDMsCiAgICAgfTsKIAogICAgIGVudW0gewpAQCAtNjgsOCArNzEsOCBAQAogICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRDb25maWcoCiAgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcyk7CiAKLSAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgc2V0Q29uZmlnKAotICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpOworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldENvbmZpZygKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zLCBib29sICpmcmFtZUNvbmZpZyk7CiAKICAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgZ2V0RXh0ZW5zaW9uSW5kZXgoCiAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBPTVhfSU5ERVhUWVBFICppbmRleCk7CkBAIC04MCw2ICs4Myw4IEBACiAKICAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydERlc2NyaWJlSGRyU3RhdGljSW5mbygpOwogCisgICAgdmlydHVhbCBib29sIHN1cHBvcnREZXNjcmliZUhkcjEwUGx1c0luZm8oKTsKKwogICAgIC8vIFRoaXMgZnVuY3Rpb24gc2V0cyBib3RoIG1pbmltdW0gYnVmZmVyIGNvdW50IGFuZCBhY3R1YWwgYnVmZmVyIGNvdW50IG9mCiAgICAgLy8gaW5wdXQgcG9ydCB0byBiZSB8bnVtSW5wdXRCdWZmZXJzfC4gSXQgd2lsbCBhbHNvIHNldCBib3RoIG1pbmltdW0gYnVmZmVyCiAgICAgLy8gY291bnQgYW5kIGFjdHVhbCBidWZmZXIgY291bnQgb2Ygb3V0cHV0IHBvcnQgdG8gYmUgfG51bU91dHB1dEJ1ZmZlcnN8LgpAQCAtMTY2LDYgKzE3MSw5IEBACiAgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGR1bXAgdGhlIENvbG9yQXNwZWN0cy4KICAgICB2b2lkIGR1bXBDb2xvckFzcGVjdHMoY29uc3QgQ29sb3JBc3BlY3RzICZjb2xvckFzcGVjdHMpOwogCisgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUlucHV0RnJhbWVDb25maWcoKTsKKyAgICB2b2lkIHF1ZXVlT3V0cHV0RnJhbWVDb25maWcoY29uc3Qgc3A8QUJ1ZmZlcj4gJmluZm8pOworCiBwcml2YXRlOgogICAgIHVpbnQzMl90IG1NaW5JbnB1dEJ1ZmZlclNpemU7CiAgICAgdWludDMyX3QgbU1pbkNvbXByZXNzaW9uUmF0aW87CkBAIC0xNzQsNiArMTgyLDkgQEAKICAgICBPTVhfVklERU9fQ09ESU5HVFlQRSBtQ29kaW5nVHlwZTsKICAgICBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCAqbVByb2ZpbGVMZXZlbHM7CiAgICAgc2l6ZV90IG1OdW1Qcm9maWxlTGV2ZWxzOworICAgIHR5cGVkZWYgTGlzdDxzcDxBQnVmZmVyPiA+IEhkcjEwUGx1c0luZm9MaXN0OworICAgIEhkcjEwUGx1c0luZm9MaXN0IG1IZHIxMFBsdXNJbnB1dHM7CisgICAgSGRyMTBQbHVzSW5mb0xpc3QgbUhkcjEwUGx1c091dHB1dHM7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50KTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IGVmMzY5ODIuLjMxYmM4MzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLmJwCkBAIC0yOSw2ICsyOSw3IEBACiAKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAKaW5kZXggMTVhNzY1NS4uYzJmMTA3MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcApAQCAtMjksNyArMjksNiBAQAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL09NWEJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vcHVzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vcHVzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUwODZlYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29wdXMvQW5kcm9pZC5icApAQCAtMCwwICsxLDIxIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X29wdXNfY29tbW9uIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisKKyAgICBzcmNzOiBbIk9wdXNIZWFkZXIuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWyJsaWJsb2ciXSwKKworICAgIGNmbGFnczogWyItV2Vycm9yIl0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBpbnRlZ2VyX292ZXJmbG93OiB0cnVlLAorICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIGludGVnZXJfb3ZlcmZsb3c6IHRydWUsCisgICAgICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vcHVzL09wdXNIZWFkZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb3B1cy9PcHVzSGVhZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGE0NjBjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb3B1cy9PcHVzSGVhZGVyLmNwcApAQCAtMCwwICsxLDE4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU29mdE9wdXMiCisKKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSAiT3B1c0hlYWRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIE9wdXMgdXNlcyBWb3JiaXMgY2hhbm5lbCBtYXBwaW5nLCBhbmQgVm9yYmlzIGNoYW5uZWwgbWFwcGluZyBzcGVjaWZpZXMKKy8vIG1hcHBpbmdzIGZvciB1cCB0byA4IGNoYW5uZWxzLiBUaGlzIGluZm9ybWF0aW9uIGlzIHBhcnQgb2YgdGhlIFZvcmJpcyBJCisvLyBTcGVjaWZpY2F0aW9uOgorLy8gaHR0cDovL3d3dy54aXBoLm9yZy92b3JiaXMvZG9jL1ZvcmJpc19JX3NwZWMuaHRtbAorY29uc3RleHByIGludCBrTWF4Q2hhbm5lbHMgPSA4OworCitjb25zdGV4cHIgdWludDhfdCBrT3B1c0NoYW5uZWxNYXBba01heENoYW5uZWxzXVtrTWF4Q2hhbm5lbHNdID0geworICAgICAgICB7MH0sCisgICAgICAgIHswLCAxfSwKKyAgICAgICAgezAsIDIsIDF9LAorICAgICAgICB7MCwgMSwgMiwgM30sCisgICAgICAgIHswLCA0LCAxLCAyLCAzfSwKKyAgICAgICAgezAsIDQsIDEsIDIsIDMsIDV9LAorICAgICAgICB7MCwgNCwgMSwgMiwgMywgNSwgNn0sCisgICAgICAgIHswLCA2LCAxLCAyLCAzLCA0LCA1LCA3fSwKK307CisKKy8vIE9wdXMgYWx3YXlzIGhhcyBhIDQ4a0h6IG91dHB1dCByYXRlLiBUaGlzIGlzIHRydWUgZm9yIGFsbCBPcHVzLCBub3QganVzdCB0aGlzCisvLyBpbXBsZW1lbnRhdGlvbi4KK2NvbnN0ZXhwciBpbnQga1JhdGUgPSA0ODAwMDsKKy8vIFNpemUgb2YgdGhlIE9wdXMgaGVhZGVyIGV4Y2x1ZGluZyBvcHRpb25hbCBtYXBwaW5nIGluZm9ybWF0aW9uLgorY29uc3RleHByIHNpemVfdCBrT3B1c0hlYWRlclNpemUgPSAxOTsKKy8vIE9mZnNldCB0byBtYWdpYyBzdHJpbmcgdGhhdCBzdGFydHMgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyTGFiZWxPZmZzZXQgPSAwOworLy8gT2Zmc2V0IHRvIE9wdXMgdmVyc2lvbiBpbiB0aGUgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyVmVyc2lvbk9mZnNldCA9IDg7CisvLyBPZmZzZXQgdG8gdGhlIGNoYW5uZWwgY291bnQgYnl0ZSBpbiB0aGUgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyQ2hhbm5lbHNPZmZzZXQgPSA5OworLy8gT2Zmc2V0IHRvIHRoZSBwcmUtc2tpcCB2YWx1ZSBpbiB0aGUgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyU2tpcFNhbXBsZXNPZmZzZXQgPSAxMDsKKy8vIE9mZnNldCB0byBzYW1wbGUgcmF0ZSBpbiB0aGUgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyU2FtcGxlUmF0ZU9mZnNldCA9IDEyOworLy8gT2Zmc2V0IHRvIHRoZSBnYWluIHZhbHVlIGluIHRoZSBPcHVzIGhlYWRlci4KK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJHYWluT2Zmc2V0ID0gMTY7CisvLyBPZmZzZXQgdG8gdGhlIGNoYW5uZWwgbWFwcGluZyBieXRlIGluIHRoZSBPcHVzIGhlYWRlci4KK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJDaGFubmVsTWFwcGluZ09mZnNldCA9IDE4OworLy8gT3B1cyBIZWFkZXIgY29udGFpbnMgYSBzdHJlYW0gbWFwLiBUaGUgbWFwcGluZyB2YWx1ZXMgYXJlIGluIHRoZSBoZWFkZXIKKy8vIGJleW9uZCB0aGUgYWx3YXlzIHByZXNlbnQgfGtPcHVzSGVhZGVyU2l6ZXwgYnl0ZXMgb2YgZGF0YS4gVGhlIG1hcHBpbmcKKy8vIGRhdGEgY29udGFpbnMgc3RyZWFtIGNvdW50LCBjb3VwbGluZyBpbmZvcm1hdGlvbiwgYW5kIHBlciBjaGFubmVsIG1hcHBpbmcKKy8vIHZhbHVlczoKKy8vICAgLSBCeXRlIDA6IE51bWJlciBvZiBzdHJlYW1zLgorLy8gICAtIEJ5dGUgMTogTnVtYmVyIGNvdXBsZWQuCisvLyAgIC0gQnl0ZSAyOiBTdGFydGluZyBhdCBieXRlIDIgYXJlIHxoZWFkZXItPmNoYW5uZWxzfCB1aW50OCBtYXBwaW5nCisvLyAgICAgICAgICAgICB2YWx1ZXMuCisvLyBPZmZzZXQgdG8gdGhlIG51bWJlciBvZiBzdHJlYW1zIGluIHRoZSBPcHVzIGhlYWRlci4KK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJOdW1TdHJlYW1zT2Zmc2V0ID0gMTk7CisvLyBPZmZzZXQgdG8gdGhlIG51bWJlciBvZiBzdHJlYW1zIHRoYXQgYXJlIGNvdXBsZWQgaW4gdGhlIE9wdXMgaGVhZGVyLgorY29uc3RleHByIHNpemVfdCBrT3B1c0hlYWRlck51bUNvdXBsZWRTdHJlYW1zT2Zmc2V0ID0gMjA7CisvLyBPZmZzZXQgdG8gdGhlIHN0cmVhbSB0byBjaGFubmVsIG1hcHBpbmcgaW4gdGhlIE9wdXMgaGVhZGVyLgorY29uc3RleHByIHNpemVfdCBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCA9IDIxOworLy8gTWF4aW11bSBwYWNrZXQgc2l6ZSB1c2VkIGluIFhpcGgncyBvcHVzZGVjLgorY29uc3RleHByIGludCBrTWF4T3B1c091dHB1dFBhY2tldFNpemVTYW1wbGVzID0gOTYwICogNjsKKworLy8gRGVmYXVsdCBhdWRpbyBvdXRwdXQgY2hhbm5lbCBsYXlvdXQuIFVzZWQgdG8gaW5pdGlhbGl6ZSB8c3RyZWFtX21hcHwgaW4KKy8vIE9wdXNIZWFkZXIsIGFuZCBwYXNzZWQgdG8gb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2NyZWF0ZSgpIHdoZW4gdGhlIGhlYWRlcgorLy8gZG9lcyBub3QgY29udGFpbiBtYXBwaW5nIGluZm9ybWF0aW9uLiBUaGUgdmFsdWVzIGFyZSB2YWxpZCBvbmx5IGZvciBtb25vIGFuZAorLy8gc3RlcmVvIG91dHB1dDogT3B1cyBzdHJlYW1zIHdpdGggbW9yZSB0aGFuIDIgY2hhbm5lbHMgcmVxdWlyZSBhIHN0cmVhbSBtYXAuCitjb25zdGV4cHIgaW50IGtNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0ID0gMjsKK2NvbnN0ZXhwciB1aW50OF90IGtEZWZhdWx0T3B1c0NoYW5uZWxMYXlvdXRba01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXRdID0gezAsIDF9OworCitzdGF0aWMgdWludDE2X3QgUmVhZExFMTYoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwgdWludDMyX3QgcmVhZF9vZmZzZXQpIHsKKyAgICAvLyBjaGVjayB3aGV0aGVyIHRoZSAybmQgYnl0ZSBpcyB3aXRoaW4gdGhlIGJ1ZmZlcgorICAgIGlmIChyZWFkX29mZnNldCArIDEgPj0gZGF0YV9zaXplKSByZXR1cm4gMDsKKyAgICB1aW50MTZfdCB2YWw7CisgICAgdmFsID0gZGF0YVtyZWFkX29mZnNldF07CisgICAgdmFsIHw9IGRhdGFbcmVhZF9vZmZzZXQgKyAxXSA8PCA4OworICAgIHJldHVybiB2YWw7Cit9CisKKy8vIFBhcnNlcyBPcHVzIEhlYWRlci4gSGVhZGVyIHNwZWM6IGh0dHA6Ly93aWtpLnhpcGgub3JnL09nZ09wdXMjSURfSGVhZGVyCitib29sIFBhcnNlT3B1c0hlYWRlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLCBPcHVzSGVhZGVyKiBoZWFkZXIpIHsKKyAgICBpZiAoZGF0YV9zaXplIDwga09wdXNIZWFkZXJTaXplKSB7CisgICAgICAgIEFMT0dWKCJIZWFkZXIgc2l6ZSBpcyB0b28gc21hbGwuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaGVhZGVyLT5jaGFubmVscyA9IGRhdGFba09wdXNIZWFkZXJDaGFubmVsc09mZnNldF07CisKKyAgICBpZiAoaGVhZGVyLT5jaGFubmVscyA8IDEgfHwgaGVhZGVyLT5jaGFubmVscyA+IGtNYXhDaGFubmVscykgeworICAgICAgICBBTE9HVigiSW52YWxpZCBIZWFkZXIsIGJhZCBjaGFubmVsIGNvdW50OiAlZCIsIGhlYWRlci0+Y2hhbm5lbHMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGhlYWRlci0+c2tpcF9zYW1wbGVzID0gUmVhZExFMTYoZGF0YSwgZGF0YV9zaXplLCBrT3B1c0hlYWRlclNraXBTYW1wbGVzT2Zmc2V0KTsKKyAgICBoZWFkZXItPmdhaW5fZGIgPSBzdGF0aWNfY2FzdDxpbnQxNl90PihSZWFkTEUxNihkYXRhLCBkYXRhX3NpemUsIGtPcHVzSGVhZGVyR2Fpbk9mZnNldCkpOworICAgIGhlYWRlci0+Y2hhbm5lbF9tYXBwaW5nID0gZGF0YVtrT3B1c0hlYWRlckNoYW5uZWxNYXBwaW5nT2Zmc2V0XTsKKyAgICBpZiAoIWhlYWRlci0+Y2hhbm5lbF9tYXBwaW5nKSB7CisgICAgICAgIGlmIChoZWFkZXItPmNoYW5uZWxzID4ga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQpIHsKKyAgICAgICAgICAgIEFMT0dWKCJJbnZhbGlkIEhlYWRlciwgbWlzc2luZyBzdHJlYW0gbWFwLiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGhlYWRlci0+bnVtX3N0cmVhbXMgPSAxOworICAgICAgICBoZWFkZXItPm51bV9jb3VwbGVkID0gaGVhZGVyLT5jaGFubmVscyA+IDE7CisgICAgICAgIGhlYWRlci0+c3RyZWFtX21hcFswXSA9IDA7CisgICAgICAgIGhlYWRlci0+c3RyZWFtX21hcFsxXSA9IDE7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoZGF0YV9zaXplIDwga09wdXNIZWFkZXJTdHJlYW1NYXBPZmZzZXQgKyBoZWFkZXItPmNoYW5uZWxzKSB7CisgICAgICAgIEFMT0dWKCJJbnZhbGlkIHN0cmVhbSBtYXA7IGluc3VmZmljaWVudCBkYXRhIGZvciBjdXJyZW50IGNoYW5uZWwgIgorICAgICAgICAgICAgICAiY291bnQ6ICVkIiwKKyAgICAgICAgICAgICAgaGVhZGVyLT5jaGFubmVscyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaGVhZGVyLT5udW1fc3RyZWFtcyA9IGRhdGFba09wdXNIZWFkZXJOdW1TdHJlYW1zT2Zmc2V0XTsKKyAgICBoZWFkZXItPm51bV9jb3VwbGVkID0gZGF0YVtrT3B1c0hlYWRlck51bUNvdXBsZWRTdHJlYW1zT2Zmc2V0XTsKKyAgICBpZiAoaGVhZGVyLT5udW1fc3RyZWFtcyArIGhlYWRlci0+bnVtX2NvdXBsZWQgIT0gaGVhZGVyLT5jaGFubmVscykgeworICAgICAgICBBTE9HVigiSW5jb25zaXN0ZW50IGNoYW5uZWwgbWFwcGluZy4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlci0+Y2hhbm5lbHM7ICsraSkKKyAgICAgICAgaGVhZGVyLT5zdHJlYW1fbWFwW2ldID0gZGF0YVtrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGldOworICAgIHJldHVybiB0cnVlOworfQorCitpbnQgV3JpdGVPcHVzSGVhZGVyKGNvbnN0IE9wdXNIZWFkZXIgJmhlYWRlciwgaW50IGlucHV0X3NhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXRwdXQsIHNpemVfdCBvdXRwdXRfc2l6ZSkgeworICAgIC8vIFNlZSBodHRwczovL3dpa2kueGlwaC5vcmcvT2dnT3B1cyNJRF9IZWFkZXIuCisgICAgY29uc3Qgc2l6ZV90IHRvdGFsX3NpemUgPSBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGhlYWRlci5jaGFubmVsczsKKyAgICBpZiAob3V0cHV0X3NpemUgPCB0b3RhbF9zaXplKSB7CisgICAgICAgIEFMT0dFKCJPdXRwdXQgYnVmZmVyIHRvbyBzbWFsbCBmb3IgaGVhZGVyLiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8gZW5zdXJlIGVudGlyZSBoZWFkZXIgaXMgY2xlYXJlZCwgZXZlbiB0aG91Z2ggd2Ugb3ZlcndyaXRlIG11Y2ggb2YgaXQgYmVsb3cKKyAgICBtZW1zZXQob3V0cHV0LCAwLCBvdXRwdXRfc2l6ZSk7CisKKyAgICAvLyBTZXQgbWFnaWMgc2lnbmF0dXJlLgorICAgIG1lbWNweShvdXRwdXQgKyBrT3B1c0hlYWRlckxhYmVsT2Zmc2V0LCAiT3B1c0hlYWQiLCA4KTsKKyAgICAvLyBTZXQgT3B1cyB2ZXJzaW9uLgorICAgIG91dHB1dFtrT3B1c0hlYWRlclZlcnNpb25PZmZzZXRdID0gMTsKKyAgICAvLyBTZXQgY2hhbm5lbCBjb3VudC4KKyAgICBvdXRwdXRba09wdXNIZWFkZXJDaGFubmVsc09mZnNldF0gPSAodWludDhfdCloZWFkZXIuY2hhbm5lbHM7CisgICAgLy8gU2V0IHByZS1za2lwCisgICAgbWVtY3B5KG91dHB1dCArIGtPcHVzSGVhZGVyU2tpcFNhbXBsZXNPZmZzZXQsICZoZWFkZXIuc2tpcF9zYW1wbGVzLCBzaXplb2YodWludDE2X3QpKTsKKyAgICAvLyBTZXQgb3JpZ2luYWwgaW5wdXQgc2FtcGxlIHJhdGUgaW4gSHouCisgICAgbWVtY3B5KG91dHB1dCArIGtPcHVzSGVhZGVyU2FtcGxlUmF0ZU9mZnNldCwgJmlucHV0X3NhbXBsZV9yYXRlLCBzaXplb2YodWludDMyX3QpKTsKKyAgICAvLyBTZXQgb3V0cHV0IGdhaW4gaW4gZEIuCisgICAgbWVtY3B5KG91dHB1dCArIGtPcHVzSGVhZGVyR2Fpbk9mZnNldCwgJmhlYWRlci5nYWluX2RiLCBzaXplb2YodWludDE2X3QpKTsKKworICAgIGlmIChoZWFkZXIuY2hhbm5lbHMgPiAyKSB7CisgICAgICAgIC8vIFNldCBjaGFubmVsIG1hcHBpbmcKKyAgICAgICAgb3V0cHV0W2tPcHVzSGVhZGVyQ2hhbm5lbE1hcHBpbmdPZmZzZXRdID0gMTsKKyAgICAgICAgLy8gQXNzdW1pbmcgbm8gY291cGxlZCBzdHJlYW1zLiBUaGlzIHNob3VsZCBhY3R1YWxseSBiZQorICAgICAgICAvLyBjaGFubmVscygpIC0gfGNvdXBsZWRfc3RyZWFtc3wuCisgICAgICAgIG91dHB1dFtrT3B1c0hlYWRlck51bVN0cmVhbXNPZmZzZXRdID0gaGVhZGVyLmNoYW5uZWxzOworICAgICAgICBvdXRwdXRba09wdXNIZWFkZXJOdW1Db3VwbGVkU3RyZWFtc09mZnNldF0gPSAwOworCisgICAgICAgIC8vIFNldCB0aGUgYWN0dWFsIHN0cmVhbSBtYXAuCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVhZGVyLmNoYW5uZWxzOyArK2kpIHsKKyAgICAgICAgICAgIG91dHB1dFtrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGldID0ga09wdXNDaGFubmVsTWFwW2hlYWRlci5jaGFubmVscyAtIDFdW2ldOworICAgICAgICB9CisgICAgICAgIHJldHVybiBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGhlYWRlci5jaGFubmVscyArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0cHV0W2tPcHVzSGVhZGVyQ2hhbm5lbE1hcHBpbmdPZmZzZXRdID0gMDsKKyAgICAgICAgcmV0dXJuIGtPcHVzSGVhZGVyQ2hhbm5lbE1hcHBpbmdPZmZzZXQgKyAxOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29wdXMvaW5jbHVkZS9PcHVzSGVhZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vcHVzL2luY2x1ZGUvT3B1c0hlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Zjc5Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vcHVzL2luY2x1ZGUvT3B1c0hlYWRlci5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogVGhlIE9wdXMgc3BlY2lmaWNhdGlvbiBpcyBwYXJ0IG9mIElFVEYgUkZDIDY3MTY6CisgKiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2NzE2CisgKi8KKworI2lmbmRlZiBPUFVTX0hFQURFUl9IXworI2RlZmluZSBPUFVTX0hFQURFUl9IXworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBPcHVzSGVhZGVyIHsKKyAgICBpbnQgY2hhbm5lbHM7CisgICAgaW50IGNoYW5uZWxfbWFwcGluZzsKKyAgICBpbnQgbnVtX3N0cmVhbXM7CisgICAgaW50IG51bV9jb3VwbGVkOworICAgIGludDE2X3QgZ2Fpbl9kYjsKKyAgICBpbnQgc2tpcF9zYW1wbGVzOworICAgIHVpbnQ4X3Qgc3RyZWFtX21hcFs4XTsKK307CisKK2Jvb2wgUGFyc2VPcHVzSGVhZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsIE9wdXNIZWFkZXIqIGhlYWRlcik7CitpbnQgV3JpdGVPcHVzSGVhZGVyKGNvbnN0IE9wdXNIZWFkZXIgJmhlYWRlciwgaW50IGlucHV0X3NhbXBsZV9yYXRlLCB1aW50OF90KiBvdXRwdXQsIHNpemVfdCBvdXRwdXRfc2l6ZSk7Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE9QVVNfSEVBREVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKaW5kZXggNTYyMGNmOC4uMzNjMWMxOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcApAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiQVJUU1BDb25uZWN0aW9uLmgiCisjaW5jbHVkZSAiTmV0d29ya1V0aWxzLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtNTksOCArNjAsOCBAQAogICAgIGlmIChtU29ja2V0ID49IDApIHsKICAgICAgICAgQUxPR0UoIkNvbm5lY3Rpb24gaXMgc3RpbGwgb3BlbiwgY2xvc2luZyB0aGUgc29ja2V0LiIpOwogICAgICAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCk7Ci0gICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQpOworICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKKyAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQpOwogICAgICAgICB9CiAgICAgICAgIGNsb3NlKG1Tb2NrZXQpOwogICAgICAgICBtU29ja2V0ID0gLTE7CkBAIC0yMTQsOCArMjE1LDggQEAKIAogICAgIGlmIChtU3RhdGUgIT0gRElTQ09OTkVDVEVEKSB7CiAgICAgICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CisgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQpOworICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CiAgICAgICAgIH0KICAgICAgICAgY2xvc2UobVNvY2tldCk7CiAgICAgICAgIG1Tb2NrZXQgPSAtMTsKQEAgLTI2Niw5ICsyNjcsOSBAQAogICAgIG1Tb2NrZXQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOwogCiAgICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQsIG1VSUQsCisgICAgICAgIE5ldHdvcmtVdGlsczo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQsIG1VSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSoodWludDMyX3QqKSAiUlRTUCIpOwotICAgICAgICBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhtU29ja2V0LCBtVUlEKTsKKyAgICAgICAgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQsIG1VSUQpOwogICAgIH0KIAogICAgIE1ha2VTb2NrZXRCbG9ja2luZyhtU29ja2V0LCBmYWxzZSk7CkBAIC0yOTcsOCArMjk4LDggQEAKICAgICAgICAgbVN0YXRlID0gRElTQ09OTkVDVEVEOwogCiAgICAgICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CisgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQpOworICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CiAgICAgICAgIH0KICAgICAgICAgY2xvc2UobVNvY2tldCk7CiAgICAgICAgIG1Tb2NrZXQgPSAtMTsKQEAgLTMxNSw4ICszMTYsOCBAQAogCiB2b2lkIEFSVFNQQ29ubmVjdGlvbjo6cGVyZm9ybURpc2Nvbm5lY3QoKSB7CiAgICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCk7Ci0gICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CisgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCk7CisgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQpOwogICAgIH0KICAgICBjbG9zZShtU29ja2V0KTsKICAgICBtU29ja2V0ID0gLTE7CkBAIC0zODksOCArMzkwLDggQEAKIAogICAgICAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7CiAgICAgICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CisgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQpOworICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CiAgICAgICAgIH0KICAgICAgICAgY2xvc2UobVNvY2tldCk7CiAgICAgICAgIG1Tb2NrZXQgPSAtMTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5icAppbmRleCA1OTUxZGRmLi45YmM5Yzg5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsNSBAQAotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9ydHNwIiwKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfcnRzcF9kZWZhdWx0cyIsCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJBQU1SQXNzZW1ibGVyLmNwcCIsCkBAIC00OSw2ICs0OSwyMSBAQAogICAgIH0sCiB9CiAKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfcnRzcCIsCisKKyAgICBzcmNzOiBbIk5ldHdvcmtVdGlscy5jcHAiXSwKKyAgICBoZWFkZXJfbGliczogWyJsaWJuZXRkX2NsaWVudF9oZWFkZXJzIl0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfcnRzcF9kZWZhdWx0cyJdLAorfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3J0c3BfcGxheWVyMiIsCisKKyAgICBzcmNzOiBbIk5ldHdvcmtVdGlsc0ZvckFwcFByb2MuY3BwIl0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfcnRzcF9kZWZhdWx0cyJdLAorfQorCiAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogY2NfdGVzdCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaAppbmRleCBkMTgzNTE2Li41ZDk5M2RiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlICJBUlRQQ29ubmVjdGlvbi5oIgogI2luY2x1ZGUgIkFSVFNQQ29ubmVjdGlvbi5oIgogI2luY2x1ZGUgIkFTZXNzaW9uRGVzY3JpcHRpb24uaCIKKyNpbmNsdWRlICJOZXR3b3JrVXRpbHMuaCIKIAogI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KQEAgLTc1NywxMCArNzU4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRyYWNrLT5tVXNpbmdJbnRlcmxlYXZlZFRDUCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSB0YWcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyh0cmFjay0+bVJUUFNvY2tldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsodHJhY2stPm1SVFBTb2NrZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcodHJhY2stPm1SVENQU29ja2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayh0cmFjay0+bVJUQ1BTb2NrZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKHRyYWNrLT5tUlRQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsodHJhY2stPm1SVFBTb2NrZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKHRyYWNrLT5tUlRDUFNvY2tldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKHRyYWNrLT5tUlRDUFNvY2tldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UodHJhY2stPm1SVFBTb2NrZXQpOwpAQCAtODg2LDEwICs4ODcsMTAgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIHRhZwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRQU29ja2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKGluZm8tPm1SVFBTb2NrZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRDUFNvY2tldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRDUFNvY2tldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGluZm8tPm1SVENQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRDUFNvY2tldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKGluZm8tPm1SVFBTb2NrZXQpOwpAQCAtMTY2NSwxMiArMTY2NiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAmaW5mby0+bVJUUFNvY2tldCwgJmluZm8tPm1SVENQU29ja2V0LCAmcnRwUG9ydCk7CiAKICAgICAgICAgICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgICAgICAgICBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGluZm8tPm1SVFBTb2NrZXQsIG1VSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKih1aW50MzJfdCopICJSVFBfIik7Ci0gICAgICAgICAgICAgICAgSFRUUEJhc2U6OlJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRDUFNvY2tldCwgbVVJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkqKHVpbnQzMl90KikgIlJUUF8iKTsKLSAgICAgICAgICAgICAgICBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRQU29ja2V0LCBtVUlEKTsKLSAgICAgICAgICAgICAgICBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRDUFNvY2tldCwgbVVJRCk7CisgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJUYWcoaW5mby0+bVJUUFNvY2tldCwgbVVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkqKHVpbnQzMl90KikgIlJUUF8iKTsKKyAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRDUFNvY2tldCwgbVVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkqKHVpbnQzMl90KikgIlJUUF8iKTsKKyAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW5mby0+bVJUUFNvY2tldCwgbVVJRCk7CisgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJNYXJrKGluZm8tPm1SVENQU29ja2V0LCBtVUlEKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlRyYW5zcG9ydDogUlRQL0FWUC9VRFA7dW5pY2FzdDtjbGllbnRfcG9ydD0iKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzM2Yjc4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuY3BwCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk5ldHdvcmtVdGlscyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIk5ldHdvcmtVdGlscy5oIgorI2luY2x1ZGUgPGN1dGlscy9xdGFndWlkLmg+CisjaW5jbHVkZSA8TmV0ZENsaWVudC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHN0YXRpYwordm9pZCBOZXR3b3JrVXRpbHM6OlJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQgc29ja2ZkLCB1aWRfdCB1aWQsIHVpbnQzMl90IGtUYWcpIHsKKyAgICBpbnQgcmVzID0gcXRhZ3VpZF90YWdTb2NrZXQoc29ja2ZkLCBrVGFnLCB1aWQpOworICAgIGlmIChyZXMgIT0gMCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRhZ2dpbmcgc29ja2V0ICVkIGZvciB1aWQgJWQgKE15IFVJRD0lZCkiLCBzb2NrZmQsIHVpZCwgZ2V0ZXVpZCgpKTsKKyAgICB9Cit9CisKKy8vIHN0YXRpYwordm9pZCBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQpIHsKKyAgICBpbnQgcmVzID0gcXRhZ3VpZF91bnRhZ1NvY2tldChzb2NrZmQpOworICAgIGlmIChyZXMgIT0gMCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHVudGFnZ2luZyBzb2NrZXQgJWQgKE15IFVJRD0lZCkiLCBzb2NrZmQsIGdldGV1aWQoKSk7CisgICAgfQorfQorCisvLyBzdGF0aWMKK3ZvaWQgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQsIHVpZF90IHVpZCkgeworICAgIHNldE5ldHdvcmtGb3JVc2VyKHVpZCwgc29ja2ZkKTsKK30KKworLy8gc3RhdGljCit2b2lkIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQpIHsKKyAgICBSZWdpc3RlclNvY2tldFVzZXJNYXJrKHNvY2tmZCwgZ2V0ZXVpZCgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNWVlNDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE5FVFdPUktfVVRJTFNfSF8KKyNkZWZpbmUgTkVUV09SS19VVElMU19IXworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBOZXR3b3JrVXRpbHMgeworICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQgc29ja2ZkLCB1aWRfdCB1aWQsIHVpbnQzMl90IGtUYWcpOworICAgIHN0YXRpYyB2b2lkIFVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQpOworCisgICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQgc29ja2ZkLCB1aWRfdCB1aWQpOworICAgIHN0YXRpYyB2b2lkIFVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQgc29ja2ZkKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTkVUV09SS19VVElMU19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHNGb3JBcHBQcm9jLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzRm9yQXBwUHJvYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYyMTU5YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzRm9yQXBwUHJvYy5jcHAKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTmV0d29ya1V0aWxzIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiTmV0d29ya1V0aWxzLmgiCisKKy8vIE5ldHdvcmtVdGlscyBpbXBsZW1lbnRhdGlvbiBmb3IgYXBwbGljYXRpb24gcHJvY2Vzcy4KK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gc3RhdGljCit2b2lkIE5ldHdvcmtVdGlsczo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCwgdWlkX3QsIHVpbnQzMl90KSB7CisgICAgLy8gTm8gb3AuIEZyYW1ld29yayBhbHJlYWR5IGhhbmRsZXMgdGhlIGRhdGEgdXNhZ2UgYmlsbGluZyBmb3IgYXBwbGljYXRpb25zLgorfQorCisvLyBzdGF0aWMKK3ZvaWQgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQpIHsKKyAgICAvLyBObyBvcC4KK30KKworLy8gc3RhdGljCit2b2lkIE5ldHdvcmtVdGlsczo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQsIHVpZF90KSB7CisgICAgLy8gTm8gb3AuIEZyYW1ld29yayBhbHJlYWR5IGhhbmRsZXMgdGhlIGRhdGEgdXNhZ2UgYmlsbGluZyBmb3IgYXBwbGljYXRpb25zLgorfQorCisvLyBzdGF0aWMKK3ZvaWQgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW50KSB7CisgICAgLy8gTm8gb3AuCit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAKaW5kZXggZDQ1OWNiZC4uNjY1ZDUxYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcApAQCAtMjQsNyArMjQsNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DbGVhck1lZGlhSFRUUC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KQEAgLTQxLDcgKzQxLDcgQEAKICAgICAgIG1GbGFncyhmbGFncyksCiAgICAgICBtTmV0TG9vcGVyKG5ldyBBTG9vcGVyKSwKICAgICAgIG1DYW5jZWxsZWQoZmFsc2UpLAotICAgICAgbUhUVFBEYXRhU291cmNlKG5ldyBNZWRpYUhUVFAoaHR0cFNlcnZpY2UtPm1ha2VIVFRQQ29ubmVjdGlvbigpKSkgeworICAgICAgbUhUVFBEYXRhU291cmNlKG5ldyBDbGVhck1lZGlhSFRUUChodHRwU2VydmljZS0+bWFrZUhUVFBDb25uZWN0aW9uKCkpKSB7CiAgICAgbU5ldExvb3Blci0+c2V0TmFtZSgic2RwIG5ldCIpOwogICAgIG1OZXRMb29wZXItPnN0YXJ0KGZhbHNlIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLywKICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBjYW5DYWxsSmF2YSAqLywKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQuYnAKaW5kZXggYTRlODg5ZC4uOTdlMWVjNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQuYnAKQEAgLTIyLDMgKzIyLDM2IEBACiAKICAgICBzaGFyZWRfbGliczogWyJsaWJtZWRpYSJdLAogfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3RpbWVkdGV4dDIiLAorCisgICAgc3JjczogWyJUZXh0RGVzY3JpcHRpb25zMi5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJtZWRpYXBsYXllcjItcHJvdG9zIiwKKyAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgZGlhZzogeworICAgICAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICB9LAorICAgIH0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWyJsaWJtZWRpYSJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RleHREZXNjcmlwdGlvbnMyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ4ZWFjYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zMi5jcHAKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiVGV4dERlc2NyaXB0aW9uczIuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworVGV4dERlc2NyaXB0aW9uczI6OlRleHREZXNjcmlwdGlvbnMyKCkgeworfQorCitzdGF0dXNfdCBUZXh0RGVzY3JpcHRpb25zMjo6Z2V0UGxheWVyTWVzc2FnZU9mRGVzY3JpcHRpb25zKAorICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzc2l6ZV90IHNpemUsCisgICAgICAgIHVpbnQzMl90IGZsYWdzLCBpbnQgdGltZU1zLCBQbGF5ZXJNZXNzYWdlICpwbGF5ZXJNc2cpIHsKKyAgICBpZiAoZmxhZ3MgJiBJTl9CQU5EX1RFWFRfM0dQUCkgeworICAgICAgICBpZiAoZmxhZ3MgJiBHTE9CQUxfREVTQ1JJUFRJT05TKSB7CisgICAgICAgICAgICByZXR1cm4gZXh0cmFjdDNHUFBHbG9iYWxEZXNjcmlwdGlvbnMoZGF0YSwgc2l6ZSwgcGxheWVyTXNnKTsKKyAgICAgICAgfSBlbHNlIGlmIChmbGFncyAmIExPQ0FMX0RFU0NSSVBUSU9OUykgeworICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3QzR1BQTG9jYWxEZXNjcmlwdGlvbnMoZGF0YSwgc2l6ZSwgdGltZU1zLCBwbGF5ZXJNc2cpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChmbGFncyAmIE9VVF9PRl9CQU5EX1RFWFRfU1JUKSB7CisgICAgICAgIGlmIChmbGFncyAmIExPQ0FMX0RFU0NSSVBUSU9OUykgeworICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RTUlRMb2NhbERlc2NyaXB0aW9ucyhkYXRhLCBzaXplLCB0aW1lTXMsIHBsYXllck1zZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKKy8vIFBhcnNlIHRoZSBTUlQgdGV4dCBzYW1wbGUsIGFuZCBzdG9yZSB0aGUgdGltaW5nIGFuZCB0ZXh0IHNhbXBsZSBpbiBhIFBsYXllck1lc3NhZ2UuCisvLyBUaGUgUGxheWVyTWVzc2FnZSB3aWxsIGJlIHNlbnQgdG8gTWVkaWFQbGF5ZXIyLmphdmEgdGhyb3VnaCBldmVudCwgYW5kIHdpbGwgYmUKKy8vIHBhcnNlZCBpbiBUaW1lZFRleHQuamF2YS4KK3N0YXR1c190IFRleHREZXNjcmlwdGlvbnMyOjpleHRyYWN0U1JUTG9jYWxEZXNjcmlwdGlvbnMoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNzaXplX3Qgc2l6ZSwgaW50IHRpbWVNcywgUGxheWVyTWVzc2FnZSAqcGxheWVyTXNnKSB7CisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShLRVlfTE9DQUxfU0VUVElORyk7CisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShLRVlfU1RBUlRfVElNRSk7CisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZSh0aW1lTXMpOworCisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShLRVlfU1RSVUNUX1RFWFQpOworICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfYnl0ZXNfdmFsdWUoZGF0YSwgc2l6ZSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIEV4dHJhY3QgdGhlIGxvY2FsIDNHUFAgZGlzcGxheSBkZXNjcmlwdGlvbnMuIDNHUFAgbG9jYWwgZGVzY3JpcHRpb25zCisvLyBhcmUgYXBwZW5kZWQgdG8gdGhlIHRleHQgc2FtcGxlIGlmIGFueS4KK3N0YXR1c190IFRleHREZXNjcmlwdGlvbnMyOjpleHRyYWN0M0dQUExvY2FsRGVzY3JpcHRpb25zKAorICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzc2l6ZV90IHNpemUsCisgICAgICAgIGludCB0aW1lTXMsIFBsYXllck1lc3NhZ2UgKnBsYXllck1zZykgeworCisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShLRVlfTE9DQUxfU0VUVElORyk7CisKKyAgICAvLyB3cml0ZSBzdGFydCB0aW1lIHRvIGRpc3BsYXkgdGhpcyB0ZXh0IHNhbXBsZQorICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoS0VZX1NUQVJUX1RJTUUpOworICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUodGltZU1zKTsKKworICAgIGlmIChzaXplIDwgMikgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHNzaXplX3QgdGV4dExlbiA9ICgqZGF0YSkgPDwgOCB8ICgqKGRhdGEgKyAxKSk7CisKKyAgICBpZiAoc2l6ZSA8IHRleHRMZW4gKyAyKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICAvLyB3cml0ZSB0ZXh0IHNhbXBsZSBsZW5ndGggYW5kIHRleHQgc2FtcGxlIGl0c2VsZgorICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoS0VZX1NUUlVDVF9URVhUKTsKKyAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2J5dGVzX3ZhbHVlKGRhdGEgKyAyLCB0ZXh0TGVuKTsKKworICAgIGlmIChzaXplID4gdGV4dExlbiArIDIpIHsKKyAgICAgICAgZGF0YSArPSAodGV4dExlbiArIDIpOworICAgICAgICBzaXplIC09ICh0ZXh0TGVuICsgMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHdoaWxlIChzaXplID49IDgpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqdG1wRGF0YSA9IGRhdGE7CisgICAgICAgIHNzaXplX3QgY2h1bmtTaXplID0gVTMyX0FUKHRtcERhdGEpOyAgICAgIC8vIHNpemUgaW5jbHVkZXMgc2l6ZSBhbmQgdHlwZQorICAgICAgICB1aW50MzJfdCBjaHVua1R5cGUgPSBVMzJfQVQodG1wRGF0YSArIDQpOworCisgICAgICAgIGlmIChjaHVua1NpemUgPD0gOCB8fCBjaHVua1NpemUgPiBzaXplKSB7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgcmVtYWluaW5nID0gY2h1bmtTaXplIC0gODsKKworICAgICAgICB0bXBEYXRhICs9IDg7CisKKyAgICAgICAgc3dpdGNoKGNodW5rVHlwZSkgeworICAgICAgICAgICAgLy8gJ3Rib3gnIGJveCB0byBpbmRpY2F0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIHRleHQgd2l0aCB2YWx1ZXMKKyAgICAgICAgICAgIC8vIG9mIHRvcCwgbGVmdCwgYm90dG9tIGFuZCByaWdodAorICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAnYicsICdvJywgJ3gnKToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nIDwgOCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoS0VZX1NUUlVDVF9URVhUX1BPUyk7CisgICAgICAgICAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShVMTZfQVQodG1wRGF0YSkpOworICAgICAgICAgICAgICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoVTE2X0FUKHRtcERhdGEgKyAyKSk7CisgICAgICAgICAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShVMTZfQVQodG1wRGF0YSArIDQpKTsKKyAgICAgICAgICAgICAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKFUxNl9BVCh0bXBEYXRhICsgNikpOworCisgICAgICAgICAgICAgICAgdG1wRGF0YSArPSA4OworICAgICAgICAgICAgICAgIHJlbWFpbmluZyAtPSA4OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRhdGEgKz0gY2h1bmtTaXplOworICAgICAgICBzaXplIC09IGNodW5rU2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIFRvIGV4dHJhY3QgYm94ICd0eDNnJyBkZWZpbmVkIGluIDNHUFAgVFMgMjYuMjQ1LCBhbmQgc3RvcmUgaXQgaW4gYSBQbGF5ZXJNZXNzYWdlCitzdGF0dXNfdCBUZXh0RGVzY3JpcHRpb25zMjo6ZXh0cmFjdDNHUFBHbG9iYWxEZXNjcmlwdGlvbnMoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNzaXplX3Qgc2l6ZSwgUGxheWVyTWVzc2FnZSAqcGxheWVyTXNnKSB7CisKKyAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKEtFWV9HTE9CQUxfU0VUVElORyk7CisKKyAgICB3aGlsZSAoc2l6ZSA+PSA4KSB7CisgICAgICAgIHNzaXplX3QgY2h1bmtTaXplID0gVTMyX0FUKGRhdGEpOworICAgICAgICB1aW50MzJfdCBjaHVua1R5cGUgPSBVMzJfQVQoZGF0YSArIDQpOworICAgICAgICBjb25zdCB1aW50OF90ICp0bXBEYXRhID0gZGF0YTsKKyAgICAgICAgdG1wRGF0YSArPSA4OworICAgICAgICBzaXplX3QgcmVtYWluaW5nID0gc2l6ZSAtIDg7CisKKyAgICAgICAgaWYgKHNpemUgPCBjaHVua1NpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2goY2h1bmtUeXBlKSB7CisgICAgICAgICAgICBjYXNlIEZPVVJDQygndCcsICd4JywgJzMnLCAnZycpOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPCAxOCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFNraXAgRElTUExBWV9GTEFHUywgU1RSVUNUX0pVU1RJRklDQVRJT04sIGFuZCBCQUNLR1JPVU5EX0NPTE9SX1JHQkEKKyAgICAgICAgICAgICAgICB0bXBEYXRhICs9IDE4OworICAgICAgICAgICAgICAgIHJlbWFpbmluZyAtPSAxODsKKworICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPCA4KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShLRVlfU1RSVUNUX1RFWFRfUE9TKTsKKyAgICAgICAgICAgICAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKFUxNl9BVCh0bXBEYXRhKSk7CisgICAgICAgICAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShVMTZfQVQodG1wRGF0YSArIDIpKTsKKyAgICAgICAgICAgICAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKFUxNl9BVCh0bXBEYXRhICsgNCkpOworICAgICAgICAgICAgICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoVTE2X0FUKHRtcERhdGEgKyA2KSk7CisKKyAgICAgICAgICAgICAgICB0bXBEYXRhICs9IDg7CisgICAgICAgICAgICAgICAgcmVtYWluaW5nIC09IDE4OworICAgICAgICAgICAgICAgIC8vIElnbm9yZSByZW1haW5pbmcgZGF0YS4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkYXRhICs9IGNodW5rU2l6ZTsKKyAgICAgICAgc2l6ZSAtPSBjaHVua1NpemU7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RleHREZXNjcmlwdGlvbnMyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGV4dERlc2NyaXB0aW9uczIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzdkMmQwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RleHREZXNjcmlwdGlvbnMyLmgKQEAgLTAsMCArMSw4OCBAQAorIC8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRFWFRfREVTQ1JJUFRJT05TMl9IXworCisjZGVmaW5lIFRFWFRfREVTQ1JJUFRJT05TMl9IXworCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKworI2luY2x1ZGUgIm1lZGlhcGxheWVyMi5wYi5oIgorCit1c2luZyBhbmRyb2lkOjptZWRpYTo6TWVkaWFQbGF5ZXIyUHJvdG86OlBsYXllck1lc3NhZ2U7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgVGV4dERlc2NyaXB0aW9uczIgeworcHVibGljOgorICAgIGVudW0geworICAgICAgICBJTl9CQU5EX1RFWFRfM0dQUCAgICAgICAgICAgICA9IDB4MDEsCisgICAgICAgIE9VVF9PRl9CQU5EX1RFWFRfU1JUICAgICAgICAgID0gMHgwMiwKKworICAgICAgICBHTE9CQUxfREVTQ1JJUFRJT05TICAgICAgICAgICA9IDB4MTAwLAorICAgICAgICBMT0NBTF9ERVNDUklQVElPTlMgICAgICAgICAgICA9IDB4MjAwLAorICAgIH07CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0UGxheWVyTWVzc2FnZU9mRGVzY3JpcHRpb25zKAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc3NpemVfdCBzaXplLAorICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsIGludCB0aW1lTXMsIFBsYXllck1lc3NhZ2UgKnBsYXllck1zZyk7Citwcml2YXRlOgorICAgIFRleHREZXNjcmlwdGlvbnMyKCk7CisKKyAgICBlbnVtIHsKKyAgICAgICAgLy8gVGhlc2Uga2V5cyBtdXN0IGJlIGluIHN5bmMgd2l0aCB0aGUga2V5cyBpbiBUaW1lZFRleHQuamF2YQorICAgICAgICBLRVlfRElTUExBWV9GTEFHUyAgICAgICAgICAgICAgICAgPSAxLCAvLyBpbnQKKyAgICAgICAgS0VZX1NUWUxFX0ZMQUdTICAgICAgICAgICAgICAgICAgID0gMiwgLy8gaW50CisgICAgICAgIEtFWV9CQUNLR1JPVU5EX0NPTE9SX1JHQkEgICAgICAgICA9IDMsIC8vIGludAorICAgICAgICBLRVlfSElHSExJR0hUX0NPTE9SX1JHQkEgICAgICAgICAgPSA0LCAvLyBpbnQKKyAgICAgICAgS0VZX1NDUk9MTF9ERUxBWSAgICAgICAgICAgICAgICAgID0gNSwgLy8gaW50CisgICAgICAgIEtFWV9XUkFQX1RFWFQgICAgICAgICAgICAgICAgICAgICA9IDYsIC8vIGludAorICAgICAgICBLRVlfU1RBUlRfVElNRSAgICAgICAgICAgICAgICAgICAgPSA3LCAvLyBpbnQKKyAgICAgICAgS0VZX1NUUlVDVF9CTElOS0lOR19URVhUX0xJU1QgICAgID0gOCwgLy8gTGlzdDxDaGFyUG9zPgorICAgICAgICBLRVlfU1RSVUNUX0ZPTlRfTElTVCAgICAgICAgICAgICAgPSA5LCAvLyBMaXN0PEZvbnQ+CisgICAgICAgIEtFWV9TVFJVQ1RfSElHSExJR0hUX0xJU1QgICAgICAgICA9IDEwLCAvLyBMaXN0PENoYXJQb3M+CisgICAgICAgIEtFWV9TVFJVQ1RfSFlQRVJfVEVYVF9MSVNUICAgICAgICA9IDExLCAvLyBMaXN0PEh5cGVyVGV4dD4KKyAgICAgICAgS0VZX1NUUlVDVF9LQVJBT0tFX0xJU1QgICAgICAgICAgID0gMTIsIC8vIExpc3Q8S2FyYW9rZT4KKyAgICAgICAgS0VZX1NUUlVDVF9TVFlMRV9MSVNUICAgICAgICAgICAgID0gMTMsIC8vIExpc3Q8U3R5bGU+CisgICAgICAgIEtFWV9TVFJVQ1RfVEVYVF9QT1MgICAgICAgICAgICAgICA9IDE0LCAvLyBUZXh0UG9zCisgICAgICAgIEtFWV9TVFJVQ1RfSlVTVElGSUNBVElPTiAgICAgICAgICA9IDE1LCAvLyBKdXN0aWZpY2F0aW9uCisgICAgICAgIEtFWV9TVFJVQ1RfVEVYVCAgICAgICAgICAgICAgICAgICA9IDE2LCAvLyBUZXh0CisKKyAgICAgICAgS0VZX0dMT0JBTF9TRVRUSU5HICAgICAgICAgICAgICAgID0gMTAxLAorICAgICAgICBLRVlfTE9DQUxfU0VUVElORyAgICAgICAgICAgICAgICAgPSAxMDIsCisgICAgICAgIEtFWV9TVEFSVF9DSEFSICAgICAgICAgICAgICAgICAgICA9IDEwMywKKyAgICAgICAgS0VZX0VORF9DSEFSICAgICAgICAgICAgICAgICAgICAgID0gMTA0LAorICAgICAgICBLRVlfRk9OVF9JRCAgICAgICAgICAgICAgICAgICAgICAgPSAxMDUsCisgICAgICAgIEtFWV9GT05UX1NJWkUgICAgICAgICAgICAgICAgICAgICA9IDEwNiwKKyAgICAgICAgS0VZX1RFWFRfQ09MT1JfUkdCQSAgICAgICAgICAgICAgID0gMTA3LAorICAgIH07CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgZXh0cmFjdFNSVExvY2FsRGVzY3JpcHRpb25zKAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc3NpemVfdCBzaXplLAorICAgICAgICAgICAgaW50IHRpbWVNcywgUGxheWVyTWVzc2FnZSAqcGxheWVyTXNnKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgZXh0cmFjdDNHUFBHbG9iYWxEZXNjcmlwdGlvbnMoCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzc2l6ZV90IHNpemUsCisgICAgICAgICAgICBQbGF5ZXJNZXNzYWdlICpwbGF5ZXJNc2cpOworICAgIHN0YXRpYyBzdGF0dXNfdCBleHRyYWN0M0dQUExvY2FsRGVzY3JpcHRpb25zKAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc3NpemVfdCBzaXplLAorICAgICAgICAgICAgaW50IHRpbWVNcywgUGxheWVyTWVzc2FnZSAqcGxheWVyTXNnKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFRleHREZXNjcmlwdGlvbnMyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjZW5kaWYgIC8vIFRFWFRfREVTQ1JJUFRJT05TMl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9BbmRyb2lkLmJwCmluZGV4IDI2NmI2MTEuLjFmODQwYjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0FuZHJvaWQuYnAKQEAgLTI4LDcgKzI4LDEyIEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9vcHVzX2NvbW1vbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgIF0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuY3BwCmluZGV4IGE1MTIwYjkuLjRkNTA0ZTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuY3BwCkBAIC0zMDUsNiArMzA1LDcgQEAKIH0KIAogc3A8V2VibUVsZW1lbnQ+IFdlYm1FbGVtZW50OjpBdWRpb1RyYWNrRW50cnkoCisgICAgICAgIGNvbnN0IGNoYXIgKmNvZGVjLAogICAgICAgICBpbnQgY2hhbnMsCiAgICAgICAgIGRvdWJsZSByYXRlLAogICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmLApAQCAtMzIyLDcgKzMyMyw3IEBACiAgICAgICAgICAgICB1aWQsCiAgICAgICAgICAgICBsYWNpbmcsCiAgICAgICAgICAgICBsYW5nLAotICAgICAgICAgICAgIkFfVk9SQklTIiwKKyAgICAgICAgICAgIGNvZGVjLAogICAgICAgICAgICAga0F1ZGlvVHlwZSwKICAgICAgICAgICAgIHRyYWNrRW50cnlGaWVsZHMpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmgKaW5kZXggZmZiYmExYi4uYTk0YzIzZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRWxlbWVudC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuaApAQCAtNTAsNiArNTAsNyBAQAogICAgIHN0YXRpYyBzcDxXZWJtRWxlbWVudD4gU2VnbWVudEluZm8odWludDY0X3Qgc2NhbGUgPSAxMDAwMDAwLCBkb3VibGUgZHVyID0gMCk7CiAKICAgICBzdGF0aWMgc3A8V2VibUVsZW1lbnQ+IEF1ZGlvVHJhY2tFbnRyeSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvZGVjLAogICAgICAgICAgICAgaW50IGNoYW5zLAogICAgICAgICAgICAgZG91YmxlIHJhdGUsCiAgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibVdyaXRlci5jcHAKaW5kZXggNGQ3M2ViOC4uN2I0YjIzYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuY3BwCkBAIC0yMyw2ICsyMyw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorI2luY2x1ZGUgPE9wdXNIZWFkZXIuaD4KIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogCkBAIC0xMTIsNDYgKzExNCwxMDIgQEAKIC8vIHN0YXRpYwogc3A8V2VibUVsZW1lbnQ+IFdlYm1Xcml0ZXI6OmF1ZGlvVHJhY2soY29uc3Qgc3A8TWV0YURhdGE+JiBtZCkgewogICAgIGludDMyX3QgbkNoYW5uZWxzLCBzYW1wbGVyYXRlOwotICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgY29uc3Qgdm9pZCAqaGVhZGVyRGF0YTE7Ci0gICAgY29uc3QgY2hhciBoZWFkZXJEYXRhMltdID0geyAzLCAndicsICdvJywgJ3InLCAnYicsICdpJywgJ3MnLCA3LCAwLCAwLCAwLAotICAgICAgICAgICAgJ2EnLCAnbicsICdkJywgJ3InLCAnbycsICdpJywgJ2QnLCAwLCAwLCAwLCAwLCAxIH07Ci0gICAgY29uc3Qgdm9pZCAqaGVhZGVyRGF0YTM7Ci0gICAgc2l6ZV90IGhlYWRlclNpemUxLCBoZWFkZXJTaXplMiA9IHNpemVvZihoZWFkZXJEYXRhMiksIGhlYWRlclNpemUzOworICAgIGNvbnN0IGNoYXIqIG1pbWVUeXBlOwogCiAgICAgaWYgKCFtZC0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZuQ2hhbm5lbHMpCi0gICAgICAgICAgICB8fCAhbWQtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZXJhdGUpCi0gICAgICAgICAgICB8fCAhbWQtPmZpbmREYXRhKGtLZXlWb3JiaXNJbmZvLCAmdHlwZSwgJmhlYWRlckRhdGExLCAmaGVhZGVyU2l6ZTEpCi0gICAgICAgICAgICB8fCAhbWQtPmZpbmREYXRhKGtLZXlWb3JiaXNCb29rcywgJnR5cGUsICZoZWFkZXJEYXRhMywgJmhlYWRlclNpemUzKSkgeworICAgICAgICB8fCAhbWQtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZXJhdGUpCisgICAgICAgIHx8ICFtZC0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZVR5cGUpKSB7CiAgICAgICAgIEFMT0dFKCJNaXNzaW5nIGZvcm1hdCBrZXlzIGZvciBhdWRpbyB0cmFjayIpOwogICAgICAgICBtZC0+ZHVtcFRvTG9nKCk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIHNpemVfdCBjb2RlY1ByaXZhdGVTaXplID0gMTsKLSAgICBjb2RlY1ByaXZhdGVTaXplICs9IFhpcGhMYWNlQ29kZUxlbihoZWFkZXJTaXplMSk7Ci0gICAgY29kZWNQcml2YXRlU2l6ZSArPSBYaXBoTGFjZUNvZGVMZW4oaGVhZGVyU2l6ZTIpOwotICAgIGNvZGVjUHJpdmF0ZVNpemUgKz0gaGVhZGVyU2l6ZTEgKyBoZWFkZXJTaXplMiArIGhlYWRlclNpemUzOworICAgIGlmICghc3RybmNhc2VjbXAobWltZVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMsIHN0cmxlbihNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTKSkpIHsKKyAgICAgICAgLy8gT3B1cyBpbiBXZWJNIGlzIGEgd2VsbC1rbm93biwgeWV0IHVuZGVyLWRvY3VtZW50ZWQsIGZvcm1hdC4gVGhlIGNvZGVjIHByaXZhdGUgZGF0YQorICAgICAgICAvLyBvZiB0aGUgdHJhY2sgaXMgYW4gT3B1cyBPZ2cgaGVhZGVyIChodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzg0NSNzZWN0aW9uLTUuMSkKKyAgICAgICAgLy8gVGhlIG5hbWUgb2YgdGhlIHRyYWNrIGlzbid0IHN0YW5kYXJkaXplZCwgaXRzIHZhbHVlIHNob3VsZCBiZSAiQV9PUFVTIi4KKyAgICAgICAgT3B1c0hlYWRlciBoZWFkZXI7CisgICAgICAgIGhlYWRlci5jaGFubmVscyA9IG5DaGFubmVsczsKKyAgICAgICAgaGVhZGVyLm51bV9zdHJlYW1zID0gbkNoYW5uZWxzOworICAgICAgICBoZWFkZXIubnVtX2NvdXBsZWQgPSAwOworICAgICAgICAvLyAtIENoYW5uZWwgbWFwcGluZyBmYW1pbHkgKDggYml0cyB1bnNpZ25lZCkKKyAgICAgICAgLy8gIC0tICAwID0gb25lIHN0cmVhbTogbW9ubyBvciBMLFIgc3RlcmVvCisgICAgICAgIC8vICAtLSAgMSA9IGNoYW5uZWxzIGluIHZvcmJpcyBzcGVjIG9yZGVyOiBtb25vIG9yIEwsUiBzdGVyZW8gb3IgLi4uIG9yIEZMLEMsRlIsUkwsUlIsTEZFLCAuLi4KKyAgICAgICAgLy8gIC0tICAyLi4yNTQgPSByZXNlcnZlZCAodHJlYXQgYXMgMjU1KQorICAgICAgICAvLyAgLS0gIDI1NSA9IG5vIGRlZmluZWQgY2hhbm5lbCBtZWFuaW5nCisgICAgICAgIC8vCisgICAgICAgIC8vICBvdXIgaW1wbGVtZW50YXRpb24gZW5jb2RlczogIDAsIDEsIG9yIDI1NQorICAgICAgICBoZWFkZXIuY2hhbm5lbF9tYXBwaW5nID0gKChuQ2hhbm5lbHMgPiA4KSA/IDI1NSA6IChuQ2hhbm5lbHMgPiAyKSk7CisgICAgICAgIGhlYWRlci5nYWluX2RiID0gMDsKKyAgICAgICAgaGVhZGVyLnNraXBfc2FtcGxlcyA9IDA7CiAKLSAgICBvZmZfdCBvZmYgPSAwOwotICAgIHNwPEFCdWZmZXI+IGNvZGVjUHJpdmF0ZUJ1ZiA9IG5ldyBBQnVmZmVyKGNvZGVjUHJpdmF0ZVNpemUpOwotICAgIHVpbnQ4X3QgKmNvZGVjUHJpdmF0ZURhdGEgPSBjb2RlY1ByaXZhdGVCdWYtPmRhdGEoKTsKLSAgICBjb2RlY1ByaXZhdGVEYXRhW29mZisrXSA9IDI7CisgICAgICAgIC8vIGhlYWRlcnMgYXJlIDIxLWJ5dGVzICsgc29tZXRoaW5nIGRyaXZlbiBieSBjaGFubmVsIGNvdW50CisgICAgICAgIC8vIGV4cGVjdCBudW1iZXJzIGluIHRoZSBsb3cgMzAncyBoZXJlLiBXcml0ZU9wdXNIZWFkZXIoKSB3aWxsIHRlbGwgdXMKKyAgICAgICAgLy8gaWYgdGhpbmdzIGFyZSBiYWQuCisgICAgICAgIHVuc2lnbmVkIGNoYXIgaGVhZGVyX2RhdGFbMTAwXTsKKyAgICAgICAgaW50IGhlYWRlclNpemUgPSBXcml0ZU9wdXNIZWFkZXIoaGVhZGVyLCBzYW1wbGVyYXRlLCAodWludDhfdCopaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihoZWFkZXJfZGF0YSkpOwogCi0gICAgb2ZmICs9IFhpcGhMYWNlRW5jKGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlclNpemUxKTsKLSAgICBvZmYgKz0gWGlwaExhY2VFbmMoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyU2l6ZTIpOworICAgICAgICBpZiAoaGVhZGVyU2l6ZSA8IDApIHsKKyAgICAgICAgICAgIC8vIGRpZG4ndCBmaWxsIG91dCB0aGF0IGhlYWRlciBmb3Igc29tZSByZWFzb24KKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZ2VuZXJhdGUgT1BVUyBoZWFkZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKLSAgICBtZW1jcHkoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyRGF0YTEsIGhlYWRlclNpemUxKTsKLSAgICBvZmYgKz0gaGVhZGVyU2l6ZTE7Ci0gICAgbWVtY3B5KGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlckRhdGEyLCBoZWFkZXJTaXplMik7Ci0gICAgb2ZmICs9IGhlYWRlclNpemUyOwotICAgIG1lbWNweShjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJEYXRhMywgaGVhZGVyU2l6ZTMpOworICAgICAgICBzaXplX3QgY29kZWNQcml2YXRlU2l6ZSA9IDA7CisgICAgICAgIGNvZGVjUHJpdmF0ZVNpemUgKz0gaGVhZGVyU2l6ZTsKIAotICAgIHNwPFdlYm1FbGVtZW50PiBlbnRyeSA9IFdlYm1FbGVtZW50OjpBdWRpb1RyYWNrRW50cnkoCi0gICAgICAgICAgICBuQ2hhbm5lbHMsCi0gICAgICAgICAgICBzYW1wbGVyYXRlLAotICAgICAgICAgICAgY29kZWNQcml2YXRlQnVmKTsKLSAgICByZXR1cm4gZW50cnk7CisgICAgICAgIG9mZl90IG9mZiA9IDA7CisgICAgICAgIHNwPEFCdWZmZXI+IGNvZGVjUHJpdmF0ZUJ1ZiA9IG5ldyBBQnVmZmVyKGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICB1aW50OF90KiBjb2RlY1ByaXZhdGVEYXRhID0gY29kZWNQcml2YXRlQnVmLT5kYXRhKCk7CisKKyAgICAgICAgbWVtY3B5KGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsICh1aW50OF90KiloZWFkZXJfZGF0YSwgaGVhZGVyU2l6ZSk7CisgICAgICAgIHNwPFdlYm1FbGVtZW50PiBlbnRyeSA9CisgICAgICAgICAgICAgICAgV2VibUVsZW1lbnQ6OkF1ZGlvVHJhY2tFbnRyeSgiQV9PUFVTIiwgbkNoYW5uZWxzLCBzYW1wbGVyYXRlLCBjb2RlY1ByaXZhdGVCdWYpOworICAgICAgICByZXR1cm4gZW50cnk7CisgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAobWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpKSkgeworICAgICAgICB1aW50MzJfdCB0eXBlOworICAgICAgICBjb25zdCB2b2lkICpoZWFkZXJEYXRhMTsKKyAgICAgICAgY29uc3QgY2hhciBoZWFkZXJEYXRhMltdID0geyAzLCAndicsICdvJywgJ3InLCAnYicsICdpJywgJ3MnLCA3LCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICdhJywgJ24nLCAnZCcsICdyJywgJ28nLCAnaScsICdkJywgMCwgMCwgMCwgMCwgMSB9OworICAgICAgICBjb25zdCB2b2lkICpoZWFkZXJEYXRhMzsKKyAgICAgICAgc2l6ZV90IGhlYWRlclNpemUxLCBoZWFkZXJTaXplMiA9IHNpemVvZihoZWFkZXJEYXRhMiksIGhlYWRlclNpemUzOworCisgICAgICAgIGlmICghbWQtPmZpbmREYXRhKGtLZXlWb3JiaXNJbmZvLCAmdHlwZSwgJmhlYWRlckRhdGExLCAmaGVhZGVyU2l6ZTEpCisgICAgICAgICAgICB8fCAhbWQtPmZpbmREYXRhKGtLZXlWb3JiaXNCb29rcywgJnR5cGUsICZoZWFkZXJEYXRhMywgJmhlYWRlclNpemUzKSkgeworICAgICAgICAgICAgQUxPR0UoIk1pc3NpbmcgaGVhZGVyIGZvcm1hdCBrZXlzIGZvciB2b3JiaXMgdHJhY2siKTsKKyAgICAgICAgICAgIG1kLT5kdW1wVG9Mb2coKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IGNvZGVjUHJpdmF0ZVNpemUgPSAxOworICAgICAgICBjb2RlY1ByaXZhdGVTaXplICs9IFhpcGhMYWNlQ29kZUxlbihoZWFkZXJTaXplMSk7CisgICAgICAgIGNvZGVjUHJpdmF0ZVNpemUgKz0gWGlwaExhY2VDb2RlTGVuKGhlYWRlclNpemUyKTsKKyAgICAgICAgY29kZWNQcml2YXRlU2l6ZSArPSBoZWFkZXJTaXplMSArIGhlYWRlclNpemUyICsgaGVhZGVyU2l6ZTM7CisKKyAgICAgICAgb2ZmX3Qgb2ZmID0gMDsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gY29kZWNQcml2YXRlQnVmID0gbmV3IEFCdWZmZXIoY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgIHVpbnQ4X3QgKmNvZGVjUHJpdmF0ZURhdGEgPSBjb2RlY1ByaXZhdGVCdWYtPmRhdGEoKTsKKyAgICAgICAgY29kZWNQcml2YXRlRGF0YVtvZmYrK10gPSAyOworCisgICAgICAgIG9mZiArPSBYaXBoTGFjZUVuYyhjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJTaXplMSk7CisgICAgICAgIG9mZiArPSBYaXBoTGFjZUVuYyhjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJTaXplMik7CisKKyAgICAgICAgbWVtY3B5KGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlckRhdGExLCBoZWFkZXJTaXplMSk7CisgICAgICAgIG9mZiArPSBoZWFkZXJTaXplMTsKKyAgICAgICAgbWVtY3B5KGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlckRhdGEyLCBoZWFkZXJTaXplMik7CisgICAgICAgIG9mZiArPSBoZWFkZXJTaXplMjsKKyAgICAgICAgbWVtY3B5KGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlckRhdGEzLCBoZWFkZXJTaXplMyk7CisKKyAgICAgICAgc3A8V2VibUVsZW1lbnQ+IGVudHJ5ID0KKyAgICAgICAgICAgICAgICBXZWJtRWxlbWVudDo6QXVkaW9UcmFja0VudHJ5KCJBX1ZPUkJJUyIsIG5DaGFubmVscywgc2FtcGxlcmF0ZSwgY29kZWNQcml2YXRlQnVmKTsKKyAgICAgICAgcmV0dXJuIGVudHJ5OworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJUcmFjayAoJXMpIGlzIG5vdCBhIHN1cHBvcnRlZCBhdWRpbyBmb3JtYXQiLCBtaW1lVHlwZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogc2l6ZV90IFdlYm1Xcml0ZXI6Om51bVRyYWNrcygpIHsKQEAgLTM4MiwxNiArNDQwLDE4IEBACiAgICAgY29uc3QgY2hhciAqdnA4ID0gTUVESUFfTUlNRVRZUEVfVklERU9fVlA4OwogICAgIGNvbnN0IGNoYXIgKnZwOSA9IE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOTsKICAgICBjb25zdCBjaGFyICp2b3JiaXMgPSBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVM7CisgICAgY29uc3QgY2hhciogb3B1cyA9IE1FRElBX01JTUVUWVBFX0FVRElPX09QVVM7CiAKICAgICBzaXplX3Qgc3RyZWFtSW5kZXg7CiAgICAgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCB2cDgsIHN0cmxlbih2cDgpKSB8fAogICAgICAgICAhc3RybmNhc2VjbXAobWltZSwgdnA5LCBzdHJsZW4odnA5KSkpIHsKICAgICAgICAgc3RyZWFtSW5kZXggPSBrVmlkZW9JbmRleDsKLSAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCB2b3JiaXMsIHN0cmxlbih2b3JiaXMpKSkgeworICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKG1pbWUsIHZvcmJpcywgc3RybGVuKHZvcmJpcykpIHx8CisgICAgICAgICAgICAgICAhc3RybmNhc2VjbXAobWltZSwgb3B1cywgc3RybGVuKG9wdXMpKSkgewogICAgICAgICBzdHJlYW1JbmRleCA9IGtBdWRpb0luZGV4OwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJUcmFjayAoJXMpIG90aGVyIHRoYW4gJXMsICVzIG9yICVzIGlzIG5vdCBzdXBwb3J0ZWQiLAotICAgICAgICAgICAgICBtaW1lLCB2cDgsIHZwOSwgdm9yYmlzKTsKKyAgICAgICAgQUxPR0UoIlRyYWNrICglcykgb3RoZXIgdGhhbiAlcywgJXMsICVzLCBvciAlcyBpcyBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgbWltZSwgdnA4LCB2cDksIHZvcmJpcywgb3B1cyk7CiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAKaW5kZXggYjU1ZGJiMC4uYmViZmIzYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAKQEAgLTEsMyArMSw5IEBACitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXJfaGVhZGVycyIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXIiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRmZzSGFuZGxlLmNwcCBiL21lZGlhL210cC9NdHBGZnNIYW5kbGUuY3BwCmluZGV4IGYyNWZjNzEuLmFkM2MwNjggMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBGZnNIYW5kbGUuY3BwCisrKyBiL21lZGlhL210cC9NdHBGZnNIYW5kbGUuY3BwCkBAIC0yMTIsNyArMjEyLDYgQEAKICAgICB1aW50MTZfdCB2YWx1ZSA9IHNldHVwLT53VmFsdWU7CiAgICAgc3RkOjp2ZWN0b3I8Y2hhcj4gYnVmOwogICAgIGJ1Zi5yZXNpemUobGVuZ3RoKTsKLSAgICBpbnQgcmV0ID0gMDsKIAogICAgIGlmICghKHR5cGUgJiBVU0JfRElSX0lOKSkgewogICAgICAgICBpZiAoOjpyZWFkKG1Db250cm9sLCBidWYuZGF0YSgpLCBsZW5ndGgpICE9IGxlbmd0aCkgewpAQCAtMjI1LDggKzIyNCw4IEBACiAgICAgICAgIGNhc2UgTVRQX1JFUV9SRVNFVDoKICAgICAgICAgY2FzZSBNVFBfUkVRX0NBTkNFTDoKICAgICAgICAgICAgIGVycm5vID0gRUNBTkNFTEVEOwotICAgICAgICAgICAgcmV0ID0gLTE7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgLy8gICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTVRQX1JFUV9HRVRfREVWSUNFX1NUQVRVUzoKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgbXRwX2RldmljZV9zdGF0dXMpICsgNCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFNlcnZlci5jcHAgYi9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcAppbmRleCBjY2RkZDZlLi5jYThjYjc4IDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcAorKysgYi9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcApAQCAtOTksNiArOTksNyBAQAogICAgIE1UUF9FVkVOVF9TVE9SRV9BRERFRCwKICAgICBNVFBfRVZFTlRfU1RPUkVfUkVNT1ZFRCwKICAgICBNVFBfRVZFTlRfREVWSUNFX1BST1BfQ0hBTkdFRCwKKyAgICBNVFBfRVZFTlRfT0JKRUNUX0lORk9fQ0hBTkdFRCwKIH07CiAKIE10cFNlcnZlcjo6TXRwU2VydmVyKElNdHBEYXRhYmFzZSogZGF0YWJhc2UsIGludCBjb250cm9sRmQsIGJvb2wgcHRwLApAQCAtMjU5LDYgKzI2MCwxMSBAQAogICAgIHNlbmRFdmVudChNVFBfRVZFTlRfT0JKRUNUX1JFTU9WRUQsIGhhbmRsZSk7CiB9CiAKK3ZvaWQgTXRwU2VydmVyOjpzZW5kT2JqZWN0SW5mb0NoYW5nZWQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgeworICAgIEFMT0dWKCJzZW5kT2JqZWN0SW5mb0NoYW5nZWQgJWRcbiIsIGhhbmRsZSk7CisgICAgc2VuZEV2ZW50KE1UUF9FVkVOVF9PQkpFQ1RfSU5GT19DSEFOR0VELCBoYW5kbGUpOworfQorCiB2b2lkIE10cFNlcnZlcjo6c2VuZFN0b3JlQWRkZWQoTXRwU3RvcmFnZUlEIGlkKSB7CiAgICAgQUxPR1YoInNlbmRTdG9yZUFkZGVkICUwOFhcbiIsIGlkKTsKICAgICBzZW5kRXZlbnQoTVRQX0VWRU5UX1NUT1JFX0FEREVELCBpZCk7CkBAIC00NDIsNiArNDQ4LDkgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAorICAgIGlmIChyZXNwb25zZSAhPSBNVFBfUkVTUE9OU0VfT0spCisgICAgICBBTE9HVygiW01UUF0gZ290IHJlc3BvbnNlIDB4JVggaW4gY29tbWFuZCAlcyAoJXgpIiwgcmVzcG9uc2UsCisgICAgICAgICAgICBNdHBEZWJ1Zzo6Z2V0T3BlcmF0aW9uQ29kZU5hbWUob3BlcmF0aW9uKSwgb3BlcmF0aW9uKTsKICAgICBpZiAocmVzcG9uc2UgPT0gTVRQX1JFU1BPTlNFX1RSQU5TQUNUSU9OX0NBTkNFTExFRCkKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIG1SZXNwb25zZS5zZXRSZXNwb25zZUNvZGUocmVzcG9uc2UpOwpAQCAtNjUyLDggKzY2MSw4IEBACiAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKICAgICBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigyKTsKLSAgICBBTE9HVigiR2V0T2JqZWN0UHJvcFZhbHVlICVkICVzXG4iLCBoYW5kbGUsCi0gICAgICAgICAgICBNdHBEZWJ1Zzo6Z2V0T2JqZWN0UHJvcENvZGVOYW1lKHByb3BlcnR5KSk7CisgICAgQUxPR1YoIkdldE9iamVjdFByb3BWYWx1ZSAlZCAlcyAoMHglMDRYKVxuIiwgaGFuZGxlLAorICAgICAgICAgIE10cERlYnVnOjpnZXRPYmplY3RQcm9wQ29kZU5hbWUocHJvcGVydHkpLCBwcm9wZXJ0eSk7CiAKICAgICByZXR1cm4gbURhdGFiYXNlLT5nZXRPYmplY3RQcm9wZXJ0eVZhbHVlKGhhbmRsZSwgcHJvcGVydHksIG1EYXRhKTsKIH0KQEAgLTk0Niw3ICs5NTUsOCBAQAogICAgIGlmICghbURhdGEuZ2V0U3RyaW5nKG1vZGlmaWVkKSkgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX1BBUkFNRVRFUjsgICAgIC8vIGRhdGUgbW9kaWZpZWQKICAgICAvLyBrZXl3b3JkcyBmb2xsb3cKIAotICAgIEFMT0dWKCJuYW1lOiAlcyBmb3JtYXQ6ICUwNFhcbiIsIChjb25zdCBjaGFyICopbmFtZSwgZm9ybWF0KTsKKyAgICBBTE9HVigibmFtZTogJXMgZm9ybWF0OiAweCUwNFggKCVzKVxuIiwgKGNvbnN0IGNoYXIqKW5hbWUsIGZvcm1hdCwKKyAgICAgICAgICBNdHBEZWJ1Zzo6Z2V0Rm9ybWF0Q29kZU5hbWUoZm9ybWF0KSk7CiAgICAgdGltZV90IG1vZGlmaWVkVGltZTsKICAgICBpZiAoIXBhcnNlRGF0ZVRpbWUobW9kaWZpZWQsIG1vZGlmaWVkVGltZSkpCiAgICAgICAgIG1vZGlmaWVkVGltZSA9IDA7CkBAIC05NjcsOSArOTc3LDEwIEBACiAgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09CSkVDVF9UT09fTEFSR0U7CiAgICAgfQogCi0gICAgQUxPR0QoInBhdGg6ICVzIHBhcmVudDogJWQgc3RvcmFnZUlEOiAlMDhYIiwgKGNvbnN0IGNoYXIqKXBhdGgsIHBhcmVudCwgc3RvcmFnZUlEKTsKKyAgICBBTE9HVigicGF0aDogJXMgcGFyZW50OiAlZCBzdG9yYWdlSUQ6ICUwOFgiLCAoY29uc3QgY2hhciopcGF0aCwgcGFyZW50LCBzdG9yYWdlSUQpOwogICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSBtRGF0YWJhc2UtPmJlZ2luU2VuZE9iamVjdCgoY29uc3QgY2hhciopcGF0aCwgZm9ybWF0LAogICAgICAgICAgICAgcGFyZW50LCBzdG9yYWdlSUQpOworICAgIEFMT0dEKCJoYW5kbGU6ICVkLCBwYXJlbnQ6ICVkLCBzdG9yYWdlSUQ6ICUwOFgiLCBoYW5kbGUsIHBhcmVudCwgc3RvcmFnZUlEKTsKICAgICBpZiAoaGFuZGxlID09IGtJbnZhbGlkT2JqZWN0SGFuZGxlKSB7CiAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU2VydmVyLmggYi9tZWRpYS9tdHAvTXRwU2VydmVyLmgKaW5kZXggZjY5MzlkNy4uMWY4Nzk5ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFNlcnZlci5oCisrKyBiL21lZGlhL210cC9NdHBTZXJ2ZXIuaApAQCAtMTE1LDYgKzExNSw3IEBACiAKICAgICB2b2lkICAgICAgICAgICAgICAgIHNlbmRPYmplY3RBZGRlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKICAgICB2b2lkICAgICAgICAgICAgICAgIHNlbmRPYmplY3RSZW1vdmVkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgc2VuZE9iamVjdEluZm9DaGFuZ2VkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOwogICAgIHZvaWQgICAgICAgICAgICAgICAgc2VuZERldmljZVByb3BlcnR5Q2hhbmdlZChNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSk7CiAKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvQW5kcm9pZC5icCBiL21lZGlhL25kay9BbmRyb2lkLmJwCmluZGV4IGM3MGQ4MDcuLjczYmQyY2EgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9BbmRyb2lkLmJwCisrKyBiL21lZGlhL25kay9BbmRyb2lkLmJwCkBAIC0zMSw2ICszMSwxMyBAQAogICAgIGxpY2Vuc2U6ICJOT1RJQ0UiLAogfQogCisvLyBmb3IgdXNlIHdpdGggaGVhZGVyX2xpYnMKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogIm1lZGlhX25ka19oZWFkZXJzIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlibWVkaWFuZGsiLAogCkBAIC01NSw3ICs2Miw2IEBACiAKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1ERVhQT1JUPV9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoXCJkZWZhdWx0XCIpKSkiLAotCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1XYWxsIiwKICAgICBdLApAQCAtNjUsNiArNzEsOCBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGlibWVkaWEiLAogICAgICAgICAibGlibWVkaWFfb214IiwKQEAgLTczLDE0ICs4MSwxOCBAQAogICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJxdWV1ZV9oZWxwZXIiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJhbmRyb2lkIiwKICAgICAgICAgImxpYmFuZHJvaWRfcnVudGltZSIsCiAgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgICAibGliZ3VpIiwKICAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYm1lZGlhMl9qbmlfY29yZSIsCisgICAgICAgICJsaWJtZWRpYW5ka191dGlscyIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLApAQCAtMTAwLDUgKzExMiw2MyBAQAogbGxuZGtfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYm1lZGlhbmRrIiwKICAgICBzeW1ib2xfZmlsZTogImxpYm1lZGlhbmRrLm1hcC50eHQiLAotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJtZWRpYW5ka191dGlscyIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJOZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3MuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9uZGsvaW5jbHVkZSIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIkFJbWFnZVJlYWRlcldpbmRvd0hhbmRsZVRlc3QiLAorICAgIHNyY3M6IFsidGVzdHMvQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdC5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgICAibGlibmF0aXZld2luZG93IiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRF9fQU5EUk9JRF9WTkRLX18iLAorICAgIF0sCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL25kay8iLAorICAgIF0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXIuY3BwIGIvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyLmNwcAppbmRleCBiZTYzNWZmLi4xYTBjM2IxIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXIuY3BwCisrKyBiL21lZGlhL25kay9OZGtJbWFnZVJlYWRlci5jcHAKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvYW5kcm9pZF92aWV3X1N1cmZhY2UuaD4KICNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvYW5kcm9pZF9oYXJkd2FyZV9IYXJkd2FyZUJ1ZmZlci5oPgogI2luY2x1ZGUgPGdyYWxsb2N1c2FnZS9HcmFsbG9jVXNhZ2VDb252ZXJzaW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIApAQCAtNDMsNiArNDQsMTAgQEAKIGNvbnN0IGNoYXIqIEFJbWFnZVJlYWRlcjo6a0NvbnRleHRLZXkgICAgPSAiQ29udGV4dCI7CiBjb25zdCBjaGFyKiBBSW1hZ2VSZWFkZXI6OmtHcmFwaGljQnVmZmVyS2V5ID0gIkdyYXBoaWNCdWZmZXIiOwogCitzdGF0aWMgY29uc3RleHByIGludCBrV2luZG93SGFsVG9rZW5TaXplTWF4ID0gMjU2OworCitzdGF0aWMgbmF0aXZlX2hhbmRsZV90ICpjb252ZXJ0SGFsVG9rZW5Ub05hdGl2ZUhhbmRsZShjb25zdCBIYWxUb2tlbiAmaGFsVG9rZW4pOworCiBib29sCiBBSW1hZ2VSZWFkZXI6OmlzU3VwcG9ydGVkRm9ybWF0QW5kVXNhZ2UoaW50MzJfdCBmb3JtYXQsIHVpbnQ2NF90IHVzYWdlKSB7CiAgICAgLy8gQ2hlY2sgd2hldGhlciB1c2FnZSBoYXMgZWl0aGVyIENQVV9SRUFEX09GVEVOIG9yIENQVV9SRUFEIHNldC4gTm90ZSB0aGF0IGNoZWNrIGFnYWluc3QKQEAgLTYzLDYgKzY4LDcgQEAKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1JBVzEyOgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfREVQVEgxNjoKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX0RFUFRIX1BPSU5UX0NMT1VEOgorICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfWTg6CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1BSSVZBVEU6CiAgICAgICAgICAgICAvLyBGb3IgcHJpdmF0ZSBmb3JtYXQsIGNwdSB1c2FnZSBpcyBwcm9oaWJpdGVkLgpAQCAtODksNiArOTUsNyBAQAogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUkFXMTI6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9ERVBUSDE2OgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfREVQVEhfUE9JTlRfQ0xPVUQ6CisgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9ZODoKICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUFJJVkFURToKICAgICAgICAgICAgIHJldHVybiAwOwpAQCAtMzUwLDggKzM1NywxMCBAQAogICAgICAgICAgICAgICBpdCAhPSBtQWNxdWlyZWRJbWFnZXMuZW5kKCk7IGl0KyspIHsKICAgICAgICAgQUltYWdlKiBpbWFnZSA9ICppdDsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGltYWdlLT5tTG9jayk7Ci0gICAgICAgIHJlbGVhc2VJbWFnZUxvY2tlZChpbWFnZSwgLypyZWxlYXNlRmVuY2VGZCovLTEpOworICAgICAgICAvLyBEbyBub3QgYWx0ZXIgbUFjcXVpcmVkSW1hZ2VzIHdoaWxlIHdlIGFyZSBpdGVyYXRpbmcgb24gaXQKKyAgICAgICAgcmVsZWFzZUltYWdlTG9ja2VkKGltYWdlLCAvKnJlbGVhc2VGZW5jZUZkKi8tMSwgLypjbGVhckNhY2hlKi9mYWxzZSk7CiAgICAgfQorICAgIG1BY3F1aXJlZEltYWdlcy5jbGVhcigpOwogCiAgICAgLy8gRGVsZXRlIEJ1ZmZlciBJdGVtcwogICAgIGZvciAoYXV0byBpdCA9IG1CdWZmZXJzLmJlZ2luKCk7CkBAIC0zNjMsNiArMzcyLDE1IEBACiAgICAgICAgIG1CdWZmZXJJdGVtQ29uc3VtZXItPmFiYW5kb24oKTsKICAgICAgICAgbUJ1ZmZlckl0ZW1Db25zdW1lci0+c2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lcihudWxscHRyKTsKICAgICB9CisKKyAgICBpZiAobVdpbmRvd0hhbmRsZSAhPSBudWxscHRyKSB7CisgICAgICAgIGludCBzaXplID0gbVdpbmRvd0hhbmRsZS0+ZGF0YVswXTsKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gaGFsVG9rZW47CisgICAgICAgIGhhbFRva2VuLnNldFRvRXh0ZXJuYWwoCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oJm1XaW5kb3dIYW5kbGUtPmRhdGFbMV0pLCBzaXplKTsKKyAgICAgICAgZGVsZXRlSGFsVG9rZW4oaGFsVG9rZW4pOworICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShtV2luZG93SGFuZGxlKTsKKyAgICB9CiB9CiAKIG1lZGlhX3N0YXR1c190CkBAIC00ODEsNyArNDk5LDcgQEAKIH0KIAogdm9pZAotQUltYWdlUmVhZGVyOjpyZWxlYXNlSW1hZ2VMb2NrZWQoQUltYWdlKiBpbWFnZSwgaW50IHJlbGVhc2VGZW5jZUZkKSB7CitBSW1hZ2VSZWFkZXI6OnJlbGVhc2VJbWFnZUxvY2tlZChBSW1hZ2UqIGltYWdlLCBpbnQgcmVsZWFzZUZlbmNlRmQsIGJvb2wgY2xlYXJDYWNoZSkgewogICAgIEJ1ZmZlckl0ZW0qIGJ1ZmZlciA9IGltYWdlLT5tQnVmZmVyOwogICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgewogICAgICAgICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuLCBidXQgaXMgbm90IGZhdGFsCkBAIC01MDUsNiArNTIzLDEwIEBACiAgICAgaW1hZ2UtPm1Mb2NrZWRCdWZmZXIgPSBudWxscHRyOwogICAgIGltYWdlLT5tSXNDbG9zZWQgPSB0cnVlOwogCisgICAgaWYgKCFjbGVhckNhY2hlKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBib29sIGZvdW5kID0gZmFsc2U7CiAgICAgLy8gY2xlYW51cCBhY3F1aXJlZCBpbWFnZSBsaXN0CiAgICAgZm9yIChhdXRvIGl0ID0gbUFjcXVpcmVkSW1hZ2VzLmJlZ2luKCk7CkBAIC01MjIsNiArNTQ0LDI1IEBACiAgICAgfQogfQogCittZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXI6OmdldFdpbmRvd05hdGl2ZUhhbmRsZShuYXRpdmVfaGFuZGxlICoqaGFuZGxlKSB7CisgICAgaWYgKG1XaW5kb3dIYW5kbGUgIT0gbnVsbHB0cikgeworICAgICAgICAqaGFuZGxlID0gbVdpbmRvd0hhbmRsZTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9CisgICAgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gaGdicCA9CisgICAgICAgIG5ldyBUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPihtUHJvZHVjZXIpOworICAgIEhhbFRva2VuIGhhbFRva2VuOworICAgIGlmICghY3JlYXRlSGFsVG9rZW4oaGdicCwgJmhhbFRva2VuKSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CisgICAgfQorICAgIG1XaW5kb3dIYW5kbGUgPSBjb252ZXJ0SGFsVG9rZW5Ub05hdGl2ZUhhbmRsZShoYWxUb2tlbik7CisgICAgaWYgKCFtV2luZG93SGFuZGxlKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKKyAgICB9CisgICAgKmhhbmRsZSA9IG1XaW5kb3dIYW5kbGU7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKwogaW50CiBBSW1hZ2VSZWFkZXI6OmdldEJ1ZmZlcldpZHRoKEJ1ZmZlckl0ZW0qIGJ1ZmZlcikgewogICAgIGlmIChidWZmZXIgPT0gTlVMTCkgcmV0dXJuIC0xOwpAQCAtNTg1LDYgKzYyNiwzMyBAQAogICAgIH0KIH0KIAorc3RhdGljIG5hdGl2ZV9oYW5kbGVfdCAqY29udmVydEhhbFRva2VuVG9OYXRpdmVIYW5kbGUoCisgICAgICAgIGNvbnN0IEhhbFRva2VuICZoYWxUb2tlbikgeworICAgIC8vIFdlIGF0dGVtcHQgdG8gc3RvcmUgaGFsVG9rZW4gaW4gdGhlIGludHMgb2YgdGhlIG5hdGl2ZV9oYW5kbGVfdCBhZnRlciBpdHMKKyAgICAvLyBzaXplLiBUaGUgZmlyc3QgaW50IHN0b3JlcyB0aGUgc2l6ZSBvZiB0aGUgdG9rZW4uIFdlIHN0b3JlIHRoaXMgaW4gYW4gaW50CisgICAgLy8gdG8gYXZvaWQgYWxpZ25tZW50IGlzc3VlcyB3aGVyZSBzaXplX3QgYW5kIGludCBkbyBub3QgaGF2ZSB0aGUgc2FtZQorICAgIC8vIGFsaWdubWVudC4KKyAgICBzaXplX3QgbmhEYXRhQnl0ZVNpemUgPSBoYWxUb2tlbi5zaXplKCk7CisgICAgaWYgKG5oRGF0YUJ5dGVTaXplID4ga1dpbmRvd0hhbFRva2VuU2l6ZU1heCkgeworICAgICAgICAvLyBUaGUgc2l6ZSBvZiB0aGUgdG9rZW4gaXNuJ3QgcmVhc29uYWJsZS4uCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBzaXplX3QgbnVtSW50cyA9IGNlaWwobmhEYXRhQnl0ZVNpemUgLyBzaXplb2YoaW50KSkgKyAxOworCisgICAgLy8gV2UgZG9uJ3QgY2hlY2sgZm9yIG92ZXJmbG93LCB3aGV0aGVyIG51bUludHMgY2FuIGZpdCBpbiBhbiBpbnQsIHNpbmNlIHdlCisgICAgLy8gZXhwZWN0IGtXaW5kb3dIYWxUb2tlblNpemVNYXggdG8gYmUgYSByZWFzb25hYmxlIGxpbWl0LgorICAgIC8vIGNyZWF0ZSBhIG5hdGl2ZV9oYW5kbGVfdCB3aXRoIDAgbnVtRmRzIGFuZCBudW1JbnRzIG51bWJlciBvZiBpbnRzLgorICAgIG5hdGl2ZV9oYW5kbGVfdCAqbmggPQorICAgICAgICBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgwLCBudW1JbnRzKTsKKyAgICBpZiAoIW5oKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICAvLyBTdG9yZSB0aGUgc2l6ZSBvZiB0aGUgdG9rZW4gaW4gdGhlIGZpcnN0IGludC4KKyAgICBuaC0+ZGF0YVswXSA9IG5oRGF0YUJ5dGVTaXplOworICAgIG1lbWNweSgmKG5oLT5kYXRhWzFdKSwgaGFsVG9rZW4uZGF0YSgpLCBuaERhdGFCeXRlU2l6ZSk7CisgICAgcmV0dXJuIG5oOworfQorCiBFWFBPUlQKIG1lZGlhX3N0YXR1c190IEFJbWFnZVJlYWRlcl9uZXcoCiAgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IGZvcm1hdCwgaW50MzJfdCBtYXhJbWFnZXMsCkBAIC01OTQsNiArNjYyLDE5IEBACiAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfUkVBRF9PRlRFTiwgbWF4SW1hZ2VzLCByZWFkZXIpOwogfQogCitleHRlcm4gIkMiIHsKKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfZ2V0V2luZG93TmF0aXZlSGFuZGxlKAorICAgICAgICBBSW1hZ2VSZWFkZXIgKnJlYWRlciwgLypvdXQqL25hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSkgeworICAgIGlmIChyZWFkZXIgPT0gbnVsbHB0ciB8fCBoYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICByZXR1cm4gcmVhZGVyLT5nZXRXaW5kb3dOYXRpdmVIYW5kbGUoaGFuZGxlKTsKK30KKworfSAvL2V4dGVybiAiQyIKKwogRVhQT1JUCiBtZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfbmV3V2l0aFVzYWdlKAogICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCBmb3JtYXQsIHVpbnQ2NF90IHVzYWdlLApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyUHJpdi5oIGIvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyUHJpdi5oCmluZGV4IGJlZDhhMjEuLmUzMjhjYjEgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtJbWFnZVJlYWRlclByaXYuaAorKysgYi9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXJQcml2LmgKQEAgLTY5LDYgKzY5LDggQEAKICAgICBtZWRpYV9zdGF0dXNfdCBhY3F1aXJlTmV4dEltYWdlKC8qb3V0Ki9BSW1hZ2UqKiBpbWFnZSwgLypvdXQqL2ludCogZmVuY2VGZCk7CiAgICAgbWVkaWFfc3RhdHVzX3QgYWNxdWlyZUxhdGVzdEltYWdlKC8qb3V0Ki9BSW1hZ2UqKiBpbWFnZSwgLypvdXQqL2ludCogZmVuY2VGZCk7CiAKKyAgICBtZWRpYV9zdGF0dXNfdCBnZXRXaW5kb3dOYXRpdmVIYW5kbGUoLypvdXQqL25hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKICAgICBBTmF0aXZlV2luZG93KiBnZXRXaW5kb3coKSAgICBjb25zdCB7IHJldHVybiBtV2luZG93LmdldCgpOyB9OwogICAgIGludDMyX3QgICAgICAgIGdldFdpZHRoKCkgICAgIGNvbnN0IHsgcmV0dXJuIG1XaWR0aDsgfTsKICAgICBpbnQzMl90ICAgICAgICBnZXRIZWlnaHQoKSAgICBjb25zdCB7IHJldHVybiBtSGVpZ2h0OyB9OwpAQCAtODYsNyArODgsNyBAQAogICAgIG1lZGlhX3N0YXR1c190IGFjcXVpcmVJbWFnZUxvY2tlZCgvKm91dCovQUltYWdlKiogaW1hZ2UsIC8qb3V0Ki9pbnQqIGZlbmNlRmQpOwogCiAgICAgLy8gQ2FsbGVkIGJ5IEFJbWFnZS9+QUltYWdlUmVhZGVyIHRvIGNsb3NlIGltYWdlLiBDYWxsZXIgaXMgcmVzcG9uc2libGUgdG8gZ3JhYiBBSW1hZ2U6Om1Mb2NrCi0gICAgdm9pZCByZWxlYXNlSW1hZ2VMb2NrZWQoQUltYWdlKiBpbWFnZSwgaW50IHJlbGVhc2VGZW5jZUZkKTsKKyAgICB2b2lkIHJlbGVhc2VJbWFnZUxvY2tlZChBSW1hZ2UqIGltYWdlLCBpbnQgcmVsZWFzZUZlbmNlRmQsIGJvb2wgY2xlYXJDYWNoZSA9IHRydWUpOwogCiAgICAgc3RhdGljIGludCBnZXRCdWZmZXJXaWR0aChCdWZmZXJJdGVtKiBidWZmZXIpOwogICAgIHN0YXRpYyBpbnQgZ2V0QnVmZmVySGVpZ2h0KEJ1ZmZlckl0ZW0qIGJ1ZmZlcik7CkBAIC0xNjAsNiArMTYyLDcgQEAKICAgICBzcDxTdXJmYWNlPiAgICAgICAgICAgICAgICBtU3VyZmFjZTsKICAgICBzcDxCdWZmZXJJdGVtQ29uc3VtZXI+ICAgICBtQnVmZmVySXRlbUNvbnN1bWVyOwogICAgIHNwPEFOYXRpdmVXaW5kb3c+ICAgICAgICAgIG1XaW5kb3c7CisgICAgbmF0aXZlX2hhbmRsZV90KiAgICAgICAgICAgbVdpbmRvd0hhbmRsZSA9IG51bGxwdHI7CiAKICAgICBMaXN0PEFJbWFnZSo+ICAgICAgICAgICAgICBtQWNxdWlyZWRJbWFnZXM7CiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcAppbmRleCA0MjI4NWY4Li5jMjNmMTliIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFDb2RlYy5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhQ29kZWMuY3BwCkBAIC0yMSw4ICsyMSw4IEBACiAKICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUNvZGVjLmg+CiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgogI2luY2x1ZGUgIk5ka01lZGlhQ3J5cHRvUHJpdi5oIgotI2luY2x1ZGUgIk5ka01lZGlhRm9ybWF0UHJpdi5oIgogCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhQ3J5cHRvLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYUNyeXB0by5jcHAKaW5kZXggZDcxOTNjYS4uYjhhZjVmZiAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhQ3J5cHRvLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFDcnlwdG8uY3BwCkBAIC0yMCw3ICsyMCw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUNyeXB0by5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhQ29kZWMuaD4KLSNpbmNsdWRlICJOZGtNZWRpYUZvcm1hdFByaXYuaCIKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KIAogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2UuY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZS5jcHAKaW5kZXggOWQwMGU1ZS4uMWFiZWU5MyAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZS5jcHAKQEAgLTIzLDE2ICsyMywyMyBAQAogI2luY2x1ZGUgPGpuaS5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCisjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+CisjaW5jbHVkZSA8YW5kcm9pZF91dGlsX0JpbmRlci5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYURhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KTWVkaWEySFRUUFNlcnZpY2UuaD4KIAogI2luY2x1ZGUgIi4uLy4uL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaCIKICNpbmNsdWRlICIuLi8uLi9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIgorI2luY2x1ZGUgIk5ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrc1ByaXYuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKQEAgLTQxLDE0ICs0OCwyMCBAQAogICAgIEFNZWRpYURhdGFTb3VyY2VSZWFkQXQgcmVhZEF0OwogICAgIEFNZWRpYURhdGFTb3VyY2VHZXRTaXplIGdldFNpemU7CiAgICAgQU1lZGlhRGF0YVNvdXJjZUNsb3NlIGNsb3NlOworICAgIEFNZWRpYURhdGFTb3VyY2VHZXRBdmFpbGFibGVTaXplIGdldEF2YWlsYWJsZVNpemU7CisgICAgc3A8RGF0YVNvdXJjZT4gbUltcGw7CisgICAgdWludDMyX3QgbUZsYWdzOwogfTsKIAogTmRrRGF0YVNvdXJjZTo6TmRrRGF0YVNvdXJjZShBTWVkaWFEYXRhU291cmNlICpkYXRhU291cmNlKQogICAgIDogbURhdGFTb3VyY2UoQU1lZGlhRGF0YVNvdXJjZV9uZXcoKSkgewotICAgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRSZWFkQXQobURhdGFTb3VyY2UsIGRhdGFTb3VyY2UtPnJlYWRBdCk7Ci0gICAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldFNpemUobURhdGFTb3VyY2UsIGRhdGFTb3VyY2UtPmdldFNpemUpOwotICAgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRDbG9zZShtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+Y2xvc2UpOwotICAgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRVc2VyZGF0YShtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+dXNlcmRhdGEpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0UmVhZEF0KG1EYXRhU291cmNlLCBkYXRhU291cmNlLT5yZWFkQXQpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0U2l6ZShtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+Z2V0U2l6ZSk7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRDbG9zZShtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+Y2xvc2UpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0VXNlcmRhdGEobURhdGFTb3VyY2UsIGRhdGFTb3VyY2UtPnVzZXJkYXRhKTsKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldEF2YWlsYWJsZVNpemUobURhdGFTb3VyY2UsIGRhdGFTb3VyY2UtPmdldEF2YWlsYWJsZVNpemUpOworICAgIG1EYXRhU291cmNlLT5tSW1wbCA9IGRhdGFTb3VyY2UtPm1JbXBsOworICAgIG1EYXRhU291cmNlLT5tRmxhZ3MgPSBkYXRhU291cmNlLT5tRmxhZ3M7CiB9CiAKIE5ka0RhdGFTb3VyY2U6On5OZGtEYXRhU291cmNlKCkgewpAQCAtNTksOSArNzIsMTMgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3VpbnQzMl90IE5ka0RhdGFTb3VyY2U6OmZsYWdzKCkgeworICAgIHJldHVybiBtRGF0YVNvdXJjZS0+bUZsYWdzOworfQorCiBzc2l6ZV90IE5ka0RhdGFTb3VyY2U6OnJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7Ci0gICAgaWYgKG1EYXRhU291cmNlLT5nZXRTaXplID09IE5VTEwgfHwgbURhdGFTb3VyY2UtPnVzZXJkYXRhID09IE5VTEwpIHsKKyAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCA9PSBOVUxMIHx8IG1EYXRhU291cmNlLT51c2VyZGF0YSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgcmV0dXJuIG1EYXRhU291cmNlLT5yZWFkQXQobURhdGFTb3VyY2UtPnVzZXJkYXRhLCBvZmZzZXQsIGRhdGEsIHNpemUpOwpAQCAtOTIsNiArMTA5LDk1IEBACiAgICAgfQogfQogCitzdGF0dXNfdCBOZGtEYXRhU291cmNlOjpnZXRBdmFpbGFibGVTaXplKG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90ICpzaXplcHRyKSB7CisgICAgb2ZmNjRfdCBzaXplID0gLTE7CisgICAgaWYgKG1EYXRhU291cmNlLT5nZXRBdmFpbGFibGVTaXplICE9IE5VTEwKKyAgICAgICAgICAgICYmIG1EYXRhU291cmNlLT51c2VyZGF0YSAhPSBOVUxMCisgICAgICAgICAgICAmJiBzaXplcHRyICE9IE5VTEwpIHsKKyAgICAgICAgc2l6ZSA9IG1EYXRhU291cmNlLT5nZXRBdmFpbGFibGVTaXplKG1EYXRhU291cmNlLT51c2VyZGF0YSwgb2Zmc2V0KTsKKyAgICAgICAgKnNpemVwdHIgPSBzaXplOworICAgIH0KKyAgICByZXR1cm4gc2l6ZSA+PSAwID8gT0sgOiBVTktOT1dOX0VSUk9SOworfQorCitzdGF0aWMgc3A8TWVkaWFIVFRQU2VydmljZT4gY3JlYXRlTWVkaWFIdHRwU2VydmljZUZyb21KYXZhT2JqKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgaW50IHZlcnNpb24pIHsKKyAgICBpZiAob2JqID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHN3aXRjaCAodmVyc2lvbikgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhSFRUUFNlcnZpY2U+KGliaW5kZXJGb3JKYXZhT2JqZWN0KGVudiwgb2JqKSk7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHJldHVybiBuZXcgSk1lZGlhMkhUVFBTZXJ2aWNlKGVudiwgb2JqKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KK30KKworc3RhdGljIHNwPE1lZGlhSFRUUFNlcnZpY2U+IGNyZWF0ZU1lZGlhSHR0cFNlcnZpY2VUZW1wbGF0ZSgKKyAgICAgICAgSk5JRW52ICplbnYsCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgY29uc3QgY2hhciAqY2xhenosCisgICAgICAgIGNvbnN0IGNoYXIgKm1ldGhvZCwKKyAgICAgICAgY29uc3QgY2hhciAqc2lnbmF0dXJlLAorICAgICAgICBpbnQgdmVyc2lvbikgeworICAgIGpvYmplY3Qgc2VydmljZSA9IE5VTEw7CisgICAgaWYgKGVudiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJodHRwIHNlcnZpY2UgbXVzdCBiZSBjcmVhdGVkIGZyb20gSmF2YSB0aHJlYWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgamNsYXNzIG1lZGlhaHR0cGNsYXNzID0gZW52LT5GaW5kQ2xhc3MoY2xhenopOworICAgIGlmIChtZWRpYWh0dHBjbGFzcyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJjYW4ndCBmaW5kIE1lZGlhKDIpSHR0cFNlcnZpY2UiKTsKKyAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBqbWV0aG9kSUQgbWVkaWFIdHRwQ3JlYXRlTWV0aG9kID0gZW52LT5HZXRTdGF0aWNNZXRob2RJRChtZWRpYWh0dHBjbGFzcywgbWV0aG9kLCBzaWduYXR1cmUpOworICAgIGlmIChtZWRpYUh0dHBDcmVhdGVNZXRob2QgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiY2FuJ3QgZmluZCBtZXRob2QiKTsKKyAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBqc3RyaW5nIGp1cmkgPSBlbnYtPk5ld1N0cmluZ1VURih1cmkpOworCisgICAgc2VydmljZSA9IGVudi0+Q2FsbFN0YXRpY09iamVjdE1ldGhvZChtZWRpYWh0dHBjbGFzcywgbWVkaWFIdHRwQ3JlYXRlTWV0aG9kLCBqdXJpKTsKKyAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGp1cmkpOworCisgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgIHNwPE1lZGlhSFRUUFNlcnZpY2U+IGh0dHBTZXJ2aWNlID0gY3JlYXRlTWVkaWFIdHRwU2VydmljZUZyb21KYXZhT2JqKGVudiwgc2VydmljZSwgdmVyc2lvbik7CisgICAgcmV0dXJuIGh0dHBTZXJ2aWNlOworCit9CisKK3NwPE1lZGlhSFRUUFNlcnZpY2U+IGNyZWF0ZU1lZGlhSHR0cFNlcnZpY2UoY29uc3QgY2hhciAqdXJpLCBpbnQgdmVyc2lvbikgeworCisgICAgSk5JRW52ICplbnY7CisgICAgY29uc3QgY2hhciAqY2xhenosICptZXRob2QsICpzaWduYXR1cmU7CisKKyAgICBzd2l0Y2ggKHZlcnNpb24pIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgICAgICAgICAgY2xhenogPSAiYW5kcm9pZC9tZWRpYS9NZWRpYUhUVFBTZXJ2aWNlIjsKKyAgICAgICAgICAgIG1ldGhvZCA9ICJjcmVhdGVIdHRwU2VydmljZUJpbmRlcklmTmVjZXNzYXJ5IjsKKyAgICAgICAgICAgIHNpZ25hdHVyZSA9ICIoTGphdmEvbGFuZy9TdHJpbmc7KUxhbmRyb2lkL29zL0lCaW5kZXI7IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBlbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgICAgICAgICAgY2xhenogPSAiYW5kcm9pZC9tZWRpYS9NZWRpYTJIVFRQU2VydmljZSI7CisgICAgICAgICAgICBtZXRob2QgPSAiY3JlYXRlSFRUUFNlcnZpY2UiOworICAgICAgICAgICAgc2lnbmF0dXJlID0gIihMamF2YS9sYW5nL1N0cmluZzspTGFuZHJvaWQvbWVkaWEvTWVkaWEySFRUUFNlcnZpY2U7IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGNyZWF0ZU1lZGlhSHR0cFNlcnZpY2VUZW1wbGF0ZShlbnYsIHVyaSwgY2xhenosIG1ldGhvZCwgc2lnbmF0dXJlLCB2ZXJzaW9uKTsKKworfQorCiBleHRlcm4gIkMiIHsKIAogRVhQT1JUCkBAIC0xMDUsNiArMjExLDMyIEBACiB9CiAKIEVYUE9SVAorQU1lZGlhRGF0YVNvdXJjZSogQU1lZGlhRGF0YVNvdXJjZV9uZXdVcmkoCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgaW50IG51bWhlYWRlcnMsCisgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqa2V5X3ZhbHVlcykgeworCisgICAgc3A8TWVkaWFIVFRQU2VydmljZT4gc2VydmljZSA9IGNyZWF0ZU1lZGlhSHR0cFNlcnZpY2UodXJpLCAvKiB2ZXJzaW9uID0gKi8gMSk7CisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gaGVhZGVyczsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWhlYWRlcnM7ICsraSkgeworICAgICAgICBTdHJpbmc4IGtleTgoa2V5X3ZhbHVlc1tpICogMl0pOworICAgICAgICBTdHJpbmc4IHZhbHVlOChrZXlfdmFsdWVzW2kgKiAyICsgMV0pOworICAgICAgICBoZWFkZXJzLmFkZChrZXk4LCB2YWx1ZTgpOworICAgIH0KKworICAgIHNwPERhdGFTb3VyY2U+IHNvdXJjZSA9IERhdGFTb3VyY2VGYWN0b3J5OjpDcmVhdGVGcm9tVVJJKHNlcnZpY2UsIHVyaSwgJmhlYWRlcnMpOworICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiQU1lZGlhRGF0YVNvdXJjZV9uZXdVcmkgc291cmNlIGlzIG51bGwiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIEFMT0dJKCJBTWVkaWFEYXRhU291cmNlX25ld1VyaSBzb3VyY2UgJXMgZmxhZ3MgJXUiLCBzb3VyY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgc291cmNlLT5mbGFncygpKTsKKyAgICBBTWVkaWFEYXRhU291cmNlKiBhU291cmNlID0gY29udmVydERhdGFTb3VyY2VUb0FNZWRpYURhdGFTb3VyY2Uoc291cmNlKTsKKyAgICBhU291cmNlLT5tSW1wbCA9IHNvdXJjZTsKKyAgICBhU291cmNlLT5tRmxhZ3MgPSBzb3VyY2UtPmZsYWdzKCk7CisgICAgcmV0dXJuIGFTb3VyY2U7Cit9CisKK0VYUE9SVAogdm9pZCBBTWVkaWFEYXRhU291cmNlX2RlbGV0ZShBTWVkaWFEYXRhU291cmNlICptU291cmNlKSB7CiAgICAgQUxPR1YoImR0b3IiKTsKICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CkBAIC0xMzIsNSArMjY0LDE2IEBACiAgICAgbVNvdXJjZS0+Y2xvc2UgPSBjbG9zZTsKIH0KIAorRVhQT1JUCit2b2lkIEFNZWRpYURhdGFTb3VyY2VfY2xvc2UoQU1lZGlhRGF0YVNvdXJjZSAqbVNvdXJjZSkgeworICAgIHJldHVybiBtU291cmNlLT5jbG9zZShtU291cmNlLT51c2VyZGF0YSk7Cit9CisKK0VYUE9SVAordm9pZCBBTWVkaWFEYXRhU291cmNlX3NldEdldEF2YWlsYWJsZVNpemUoQU1lZGlhRGF0YVNvdXJjZSAqbVNvdXJjZSwKKyAgICAgICAgQU1lZGlhRGF0YVNvdXJjZUdldEF2YWlsYWJsZVNpemUgZ2V0QXZhaWxhYmxlU2l6ZSkgeworICAgIG1Tb3VyY2UtPmdldEF2YWlsYWJsZVNpemUgPSBnZXRBdmFpbGFibGVTaXplOworfQorCiB9IC8vIGV4dGVybiAiQyIKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrcy5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlQ2FsbGJhY2tzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmE1N2RhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrcy5jcHAKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJOZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3MiCisKKyNpbmNsdWRlICJOZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3NQcml2LmgiCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3JQcml2Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3NpemVfdCBEYXRhU291cmNlX2dldFNpemUodm9pZCAqdXNlcmRhdGEpIHsKKyAgICBEYXRhU291cmNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxEYXRhU291cmNlICo+KHVzZXJkYXRhKTsKKyAgICBvZmY2NF90IHNpemUgPSAtMTsKKyAgICBzb3VyY2UtPmdldFNpemUoJnNpemUpOworICAgIHJldHVybiBzaXplOworfQorCitzc2l6ZV90IERhdGFTb3VyY2VfcmVhZEF0KHZvaWQgKnVzZXJkYXRhLCBvZmY2NF90IG9mZnNldCwgdm9pZCAqIGJ1Ziwgc2l6ZV90IHNpemUpIHsKKyAgICBEYXRhU291cmNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxEYXRhU291cmNlICo+KHVzZXJkYXRhKTsKKyAgICByZXR1cm4gc291cmNlLT5yZWFkQXQob2Zmc2V0LCBidWYsIHNpemUpOworfQorCit2b2lkIERhdGFTb3VyY2VfY2xvc2Uodm9pZCAqdXNlcmRhdGEpIHsKKyAgICBEYXRhU291cmNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxEYXRhU291cmNlICo+KHVzZXJkYXRhKTsKKyAgICBzb3VyY2UtPmNsb3NlKCk7Cit9CisKK3NzaXplX3QgRGF0YVNvdXJjZV9nZXRBdmFpbGFibGVTaXplKHZvaWQgKnVzZXJkYXRhLCBvZmY2NF90IG9mZnNldCkgeworICAgIG9mZjY0X3Qgc2l6ZSA9IC0xOworICAgIERhdGFTb3VyY2UgKnNvdXJjZSA9IHN0YXRpY19jYXN0PERhdGFTb3VyY2UgKj4odXNlcmRhdGEpOworICAgIHNvdXJjZS0+Z2V0QXZhaWxhYmxlU2l6ZShvZmZzZXQsICZzaXplKTsKKyAgICByZXR1cm4gIHNpemU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlQ2FsbGJhY2tzUHJpdi5oIGIvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrc1ByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTAzMzA1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrc1ByaXYuaApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFfTUVESUFfREFUQV9TT1VSQ0VfQ0FMTEJBQ0tTX0gKKworI2RlZmluZSBBX01FRElBX0RBVEFfU09VUkNFX0NBTExCQUNLU19ICisKKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFEYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvci5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3NzaXplX3QgRGF0YVNvdXJjZV9nZXRTaXplKHZvaWQgKnVzZXJkYXRhKTsKKworc3NpemVfdCBEYXRhU291cmNlX3JlYWRBdCh2b2lkICp1c2VyZGF0YSwgb2ZmNjRfdCBvZmZzZXQsIHZvaWQgKiBidWYsIHNpemVfdCBzaXplKTsKKwordm9pZCBEYXRhU291cmNlX2Nsb3NlKHZvaWQgKnVzZXJkYXRhKTsKKworc3NpemVfdCBEYXRhU291cmNlX2dldEF2YWlsYWJsZVNpemUodm9pZCAqdXNlcmRhdGEsIG9mZjY0X3Qgb2Zmc2V0KTsKKworc3RhdGljIGlubGluZSBBTWVkaWFEYXRhU291cmNlKiBjb252ZXJ0RGF0YVNvdXJjZVRvQU1lZGlhRGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKSB7CisgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBBTWVkaWFEYXRhU291cmNlICptU291cmNlID0gQU1lZGlhRGF0YVNvdXJjZV9uZXcoKTsKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldFVzZXJkYXRhKG1Tb3VyY2UsIHNvdXJjZS5nZXQoKSk7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRSZWFkQXQobVNvdXJjZSwgRGF0YVNvdXJjZV9yZWFkQXQpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0U2l6ZShtU291cmNlLCBEYXRhU291cmNlX2dldFNpemUpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0Q2xvc2UobVNvdXJjZSwgRGF0YVNvdXJjZV9jbG9zZSk7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRBdmFpbGFibGVTaXplKG1Tb3VyY2UsIERhdGFTb3VyY2VfZ2V0QXZhaWxhYmxlU2l6ZSk7CisgICAgcmV0dXJuIG1Tb3VyY2U7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQV9NRURJQV9EQVRBX1NPVVJDRV9DQUxMQkFDS1NfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZVByaXYuaCBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VQcml2LmgKaW5kZXggZWE5Yzg2NS4uMTZmZjk3NCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZVByaXYuaAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlUHJpdi5oCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgpAQCAtNDMsMTEgKzQ0LDEzIEBACiAgICAgTmRrRGF0YVNvdXJjZShBTWVkaWFEYXRhU291cmNlICopOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCk7CiAgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICopOwogICAgIHZpcnR1YWwgU3RyaW5nOCB0b1N0cmluZygpOwogICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRNSU1FVHlwZSgpIGNvbnN0OwogICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXZhaWxhYmxlU2l6ZShvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCAqc2l6ZSk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5OZGtEYXRhU291cmNlKCk7CkBAIC01OSw1ICs2Miw3IEBACiAKIH07CiAKK3NwPE1lZGlhSFRUUFNlcnZpY2U+IGNyZWF0ZU1lZGlhSHR0cFNlcnZpY2UoY29uc3QgY2hhciAqdXJpLCBpbnQgdmVyc2lvbik7CisKICNlbmRpZiAvLyBfTkRLX01FRElBX0RBVEFTT1VSQ0VfUFJJVl9ICiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYURybS5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwCmluZGV4IDZkMTBmMWMuLjU1YWZiMzMgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYURybS5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcApAQCAtMTcsNiArMTcsOCBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJOZGtNZWRpYURybSIKIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYURybS5oPgogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KQEAgLTQwLDEwICs0MiwzMiBAQAogewogcHJpdmF0ZToKICAgICBBTWVkaWFEcm0gKm1PYmo7Ci0gICAgQU1lZGlhRHJtRXZlbnRMaXN0ZW5lciBtTGlzdGVuZXI7CisgICAgQU1lZGlhRHJtRXZlbnRMaXN0ZW5lciBtRXZlbnRMaXN0ZW5lcjsKKyAgICBBTWVkaWFEcm1FeHBpcmF0aW9uVXBkYXRlTGlzdGVuZXIgbUV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lcjsKKyAgICBBTWVkaWFEcm1LZXlzQ2hhbmdlTGlzdGVuZXIgbUtleXNDaGFuZ2VMaXN0ZW5lcjsKIAogcHVibGljOgotICAgIERybUxpc3RlbmVyKEFNZWRpYURybSAqb2JqLCBBTWVkaWFEcm1FdmVudExpc3RlbmVyIGxpc3RlbmVyKSA6IG1PYmoob2JqKSwgbUxpc3RlbmVyKGxpc3RlbmVyKSB7fQorICAgIERybUxpc3RlbmVyKEFNZWRpYURybSAqb2JqLCBBTWVkaWFEcm1FdmVudExpc3RlbmVyIGxpc3RlbmVyKSA6IG1PYmoob2JqKSwKKyAgICAgICAgICAgIG1FdmVudExpc3RlbmVyKGxpc3RlbmVyKSwgbUV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lcihOVUxMKSwgbUtleXNDaGFuZ2VMaXN0ZW5lcihOVUxMKSB7fQorCisgICAgRHJtTGlzdGVuZXIoQU1lZGlhRHJtICpvYmosIEFNZWRpYURybUV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lciBsaXN0ZW5lcikgOiBtT2JqKG9iaiksCisgICAgICAgICAgICBtRXZlbnRMaXN0ZW5lcihOVUxMKSwgbUV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lcihsaXN0ZW5lciksIG1LZXlzQ2hhbmdlTGlzdGVuZXIoTlVMTCkge30KKworICAgIERybUxpc3RlbmVyKEFNZWRpYURybSAqb2JqLCBBTWVkaWFEcm1LZXlzQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIDogbU9iaihvYmopLAorICAgICAgICAgICAgbUV2ZW50TGlzdGVuZXIoTlVMTCksIG1FeHBpcmF0aW9uVXBkYXRlTGlzdGVuZXIoTlVMTCksIG1LZXlzQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpIHt9CisKKyAgICB2b2lkIHNldEV2ZW50TGlzdGVuZXIoQU1lZGlhRHJtRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtRXZlbnRMaXN0ZW5lciA9IGxpc3RlbmVyOworICAgIH0KKworICAgIHZvaWQgc2V0RXhwaXJhdGlvblVwZGF0ZUxpc3RlbmVyKEFNZWRpYURybUV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtRXhwaXJhdGlvblVwZGF0ZUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgfQorCisgICAgdm9pZCBzZXRLZXlzQ2hhbmdlTGlzdGVuZXIoQU1lZGlhRHJtS2V5c0NoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIG1LZXlzQ2hhbmdlTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKICAgICB2b2lkIG5vdGlmeShEcm1QbHVnaW46OkV2ZW50VHlwZSBldmVudFR5cGUsIGludCBleHRyYSwgY29uc3QgUGFyY2VsICpvYmopOwogfTsKIApAQCAtNjIsMjcgKzg2LDc1IEBACiB9OwogCiB2b2lkIERybUxpc3RlbmVyOjpub3RpZnkoRHJtUGx1Z2luOjpFdmVudFR5cGUgZXZlbnRUeXBlLCBpbnQgZXh0cmEsIGNvbnN0IFBhcmNlbCAqb2JqKSB7Ci0gICAgaWYgKCFtTGlzdGVuZXIpIHsKKyAgICBpZiAoIW1FdmVudExpc3RlbmVyICYmICFtRXhwaXJhdGlvblVwZGF0ZUxpc3RlbmVyICYmICFtS2V5c0NoYW5nZUxpc3RlbmVyKSB7CisgICAgICAgIEFMT0dFKCJObyBsaXN0ZW5lcnMgYXJlIHNwZWNpZmllZCIpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgb2JqLT5zZXREYXRhUG9zaXRpb24oMCk7CisKICAgICBBTWVkaWFEcm1TZXNzaW9uSWQgc2Vzc2lvbklkID0ge05VTEwsIDB9OwogICAgIGludDMyX3Qgc2Vzc2lvbklkU2l6ZSA9IG9iai0+cmVhZEludDMyKCk7Ci0gICAgaWYgKHNlc3Npb25JZFNpemUpIHsKLSAgICAgICAgdWludDhfdCAqc2Vzc2lvbklkRGF0YSA9IG5ldyB1aW50OF90W3Nlc3Npb25JZFNpemVdOwotICAgICAgICBzZXNzaW9uSWQucHRyID0gc2Vzc2lvbklkRGF0YTsKLSAgICAgICAgc2Vzc2lvbklkLmxlbmd0aCA9IHNlc3Npb25JZFNpemU7Ci0gICAgICAgIG9iai0+cmVhZChzZXNzaW9uSWREYXRhLCBzZXNzaW9uSWQubGVuZ3RoKTsKKyAgICBpZiAoc2Vzc2lvbklkU2l6ZSA8PSAwKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIHNlc3Npb24gaWQgc2l6ZSIpOworICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaW50MzJfdCBkYXRhU2l6ZSA9IG9iai0+cmVhZEludDMyKCk7Ci0gICAgdWludDhfdCAqZGF0YSA9IE5VTEw7Ci0gICAgaWYgKGRhdGFTaXplKSB7Ci0gICAgICAgIGRhdGEgPSBuZXcgdWludDhfdFtkYXRhU2l6ZV07Ci0gICAgICAgIG9iai0+cmVhZChkYXRhLCBkYXRhU2l6ZSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gc2Vzc2lvbklkRGF0YShuZXcgdWludDhfdFtzZXNzaW9uSWRTaXplXSk7CisgICAgc2Vzc2lvbklkLnB0ciA9IHNlc3Npb25JZERhdGEuZ2V0KCk7CisgICAgc2Vzc2lvbklkLmxlbmd0aCA9IHNlc3Npb25JZFNpemU7CisgICAgc3RhdHVzX3QgZXJyID0gb2JqLT5yZWFkKHNlc3Npb25JZERhdGEuZ2V0KCksIHNlc3Npb25JZC5sZW5ndGgpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZWFkIHNlc3Npb24gaWQsIGVycm9yPSVkIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIC8vIHRyYW5zbGF0ZSBEcm1QbHVnaW4gZXZlbnQgdHlwZXMgaW50byB0aGVpciBOREsgZXF1aXZhbGVudHMKKyAgICBpZiAoRHJtUGx1Z2luOjprRHJtUGx1Z2luRXZlbnRFeHBpcmF0aW9uVXBkYXRlID09IGV2ZW50VHlwZSkgeworICAgICAgICBpbnQ2NF90IGV4cGlyeVRpbWVJbk1TID0gb2JqLT5yZWFkSW50NjQoKTsKKyAgICAgICAgaWYgKGV4cGlyeVRpbWVJbk1TID49IDApIHsKKyAgICAgICAgICAgICgqbUV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lcikobU9iaiwgJnNlc3Npb25JZCwgZXhwaXJ5VGltZUluTVMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZWFkIGV4cGlyeSB0aW1lLCBzdGF0dXM9JSIgUFJJZDY0ICIiLCBleHBpcnlUaW1lSW5NUyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAoRHJtUGx1Z2luOjprRHJtUGx1Z2luRXZlbnRLZXlzQ2hhbmdlID09IGV2ZW50VHlwZSkgeworICAgICAgICBpbnQzMl90IG51bUtleXMgPSAwOworICAgICAgICBlcnIgPSBvYmotPnJlYWRJbnQzMigmbnVtS2V5cyk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVhZCBudW1iZXIgb2Yga2V5cyBzdGF0dXMsIGVycm9yPSVkIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFZlY3RvcjxBTWVkaWFEcm1LZXlTdGF0dXM+IGtleXNTdGF0dXM7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+ID4gZGF0YVBvaW50ZXJzOworICAgICAgICBBTWVkaWFEcm1LZXlTdGF0dXMga2V5U3RhdHVzOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtS2V5czsgKytpKSB7CisgICAgICAgICAgICBrZXlTdGF0dXMua2V5SWQucHRyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGtleVN0YXR1cy5rZXlJZC5sZW5ndGggPSAwOworICAgICAgICAgICAgaW50MzJfdCBpZFNpemUgPSBvYmotPnJlYWRJbnQzMigpOworICAgICAgICAgICAgaWYgKGlkU2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBkYXRhKG5ldyB1aW50OF90W2lkU2l6ZV0pOworICAgICAgICAgICAgICAgIGVyciA9IG9iai0+cmVhZChkYXRhLmdldCgpLCBpZFNpemUpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZWFkIGtleSBkYXRhLCBlcnJvcj0lZCIsIGVycik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAga2V5U3RhdHVzLmtleUlkLnB0ciA9IGRhdGEuZ2V0KCk7CisgICAgICAgICAgICAgICAga2V5U3RhdHVzLmtleUlkLmxlbmd0aCA9IGlkU2l6ZTsKKyAgICAgICAgICAgICAgICBkYXRhUG9pbnRlcnMucHVzaF9iYWNrKHN0ZDo6bW92ZShkYXRhKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrZXlTdGF0dXMua2V5VHlwZSA9IHN0YXRpY19jYXN0PEFNZWRpYURybUtleVN0YXR1c1R5cGU+KG9iai0+cmVhZEludDMyKCkpOworICAgICAgICAgICAga2V5c1N0YXR1cy5wdXNoKGtleVN0YXR1cyk7CisgICAgICAgIH0KKworICAgICAgICBib29sIGhhc05ld1VzYWJsZUtleSA9IG9iai0+cmVhZEludDMyKCk7CisgICAgICAgICgqbUtleXNDaGFuZ2VMaXN0ZW5lcikobU9iaiwgJnNlc3Npb25JZCwga2V5c1N0YXR1cy5hcnJheSgpLCBudW1LZXlzLCBoYXNOZXdVc2FibGVLZXkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSGFuZGxlcyBBTWVkaWFEcm1FdmVudExpc3RlbmVyIGJlbG93OgorICAgIC8vICB0cmFuc2xhdGVzIERybVBsdWdpbiBldmVudCB0eXBlcyBpbnRvIHRoZWlyIE5ESyBlcXVpdmFsZW50cwogICAgIEFNZWRpYURybUV2ZW50VHlwZSBuZGtFdmVudFR5cGU7CiAgICAgc3dpdGNoKGV2ZW50VHlwZSkgewogICAgICAgICBjYXNlIERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50UHJvdmlzaW9uUmVxdWlyZWQ6CkBAIC05NywxOSArMTY5LDMwIEBACiAgICAgICAgIGNhc2UgRHJtUGx1Z2luOjprRHJtUGx1Z2luRXZlbnRWZW5kb3JEZWZpbmVkOgogICAgICAgICAgICAgbmRrRXZlbnRUeXBlID0gRVZFTlRfVkVORE9SX0RFRklORUQ7CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudFNlc3Npb25SZWNsYWltZWQ6CisgICAgICAgICAgICBuZGtFdmVudFR5cGUgPSBFVkVOVF9TRVNTSU9OX1JFQ0xBSU1FRDsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgZXZlbnQgRHJtUGx1Z2luOjpFdmVudFR5cGUgJWQsIGlnbm9yZWQiLCAoaW50KWV2ZW50VHlwZSk7Ci0gICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgKCptTGlzdGVuZXIpKG1PYmosICZzZXNzaW9uSWQsIG5ka0V2ZW50VHlwZSwgZXh0cmEsIGRhdGEsIGRhdGFTaXplKTsKLQotIGNsZWFudXA6Ci0gICAgZGVsZXRlIFtdIHNlc3Npb25JZC5wdHI7Ci0gICAgZGVsZXRlIFtdIGRhdGE7CisgICAgaW50MzJfdCBkYXRhU2l6ZSA9IG9iai0+cmVhZEludDMyKCk7CisgICAgdWludDhfdCAqZGF0YSA9IE5VTEw7CisgICAgaWYgKGRhdGFTaXplID4gMCkgeworICAgICAgICBkYXRhID0gbmV3IHVpbnQ4X3RbZGF0YVNpemVdOworICAgICAgICBlcnIgPSBvYmotPnJlYWQoZGF0YSwgZGF0YVNpemUpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAoKm1FdmVudExpc3RlbmVyKShtT2JqLCAmc2Vzc2lvbklkLCBuZGtFdmVudFR5cGUsIGV4dHJhLCBkYXRhLCBkYXRhU2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlYWQgZXZlbnQgZGF0YSwgZXJyb3I9JWQiLCBlcnIpOworICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBbXSBkYXRhOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJFcnJvciByZWFkaW5nIHBhcmNlbDogaW52YWxpZCBldmVudCBkYXRhIHNpemU9JWQiLCBkYXRhU2l6ZSk7CisgICAgfQogfQogCi0KIGV4dGVybiAiQyIgewogCiBzdGF0aWMgbWVkaWFfc3RhdHVzX3QgdHJhbnNsYXRlU3RhdHVzKHN0YXR1c190IHN0YXR1cykgewpAQCAtMTk4LDYgKzI4MSw4IEBACiBBTWVkaWFEcm0qIEFNZWRpYURybV9jcmVhdGVCeVVVSUQoY29uc3QgQU1lZGlhVVVJRCB1dWlkKSB7CiAgICAgQU1lZGlhRHJtICptT2JqID0gbmV3IEFNZWRpYURybSgpOwogICAgIG1PYmotPm1Ecm0gPSBDcmVhdGVEcm1Gcm9tVVVJRCh1dWlkKTsKKworICAgIG1PYmotPm1MaXN0ZW5lci5jbGVhcigpOwogICAgIHJldHVybiBtT2JqOwogfQogCkBAIC0yMTYsMTEgKzMwMSw0NyBAQAogICAgIGlmICghbU9iaiB8fCBtT2JqLT5tRHJtID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKICAgICB9Ci0gICAgbU9iai0+bUxpc3RlbmVyID0gbmV3IERybUxpc3RlbmVyKG1PYmosIGxpc3RlbmVyKTsKKworICAgIGlmIChtT2JqLT5tTGlzdGVuZXIuZ2V0KCkpIHsKKyAgICAgICAgbU9iai0+bUxpc3RlbmVyLT5zZXRFdmVudExpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtT2JqLT5tTGlzdGVuZXIgPSBuZXcgRHJtTGlzdGVuZXIobU9iaiwgbGlzdGVuZXIpOworICAgIH0KICAgICBtT2JqLT5tRHJtLT5zZXRMaXN0ZW5lcihtT2JqLT5tTGlzdGVuZXIpOwogICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3NldE9uRXhwaXJhdGlvblVwZGF0ZUxpc3RlbmVyKEFNZWRpYURybSAqbU9iaiwKKyAgICAgICAgQU1lZGlhRHJtRXhwaXJhdGlvblVwZGF0ZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgaWYgKCFtT2JqIHx8IG1PYmotPm1Ecm0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworICAgIH0KKworICAgIGlmIChtT2JqLT5tTGlzdGVuZXIuZ2V0KCkpIHsKKyAgICAgICAgbU9iai0+bUxpc3RlbmVyLT5zZXRFeHBpcmF0aW9uVXBkYXRlTGlzdGVuZXIobGlzdGVuZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1PYmotPm1MaXN0ZW5lciA9IG5ldyBEcm1MaXN0ZW5lcihtT2JqLCBsaXN0ZW5lcik7CisgICAgfQorICAgIG1PYmotPm1Ecm0tPnNldExpc3RlbmVyKG1PYmotPm1MaXN0ZW5lcik7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fc2V0T25LZXlzQ2hhbmdlTGlzdGVuZXIoQU1lZGlhRHJtICptT2JqLAorICAgICAgICBBTWVkaWFEcm1LZXlzQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICBpZiAoIW1PYmogfHwgbU9iai0+bURybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgfQorCisgICAgaWYgKG1PYmotPm1MaXN0ZW5lci5nZXQoKSkgeworICAgICAgICBtT2JqLT5tTGlzdGVuZXItPnNldEtleXNDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbU9iai0+bUxpc3RlbmVyID0gbmV3IERybUxpc3RlbmVyKG1PYmosIGxpc3RlbmVyKTsKKyAgICB9CisgICAgbU9iai0+bURybS0+c2V0TGlzdGVuZXIobU9iai0+bUxpc3RlbmVyKTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQogCiBzdGF0aWMgYm9vbCBmaW5kSWQoQU1lZGlhRHJtICptT2JqLCBjb25zdCBBTWVkaWFEcm1CeXRlQXJyYXkgJmlkLCBMaXN0PGlkdmVjX3Q+OjppdGVyYXRvciAmaXRlcikgewogICAgIGZvciAoaXRlciA9IG1PYmotPm1JZHMuYmVnaW4oKTsgaXRlciAhPSBtT2JqLT5tSWRzLmVuZCgpOyArK2l0ZXIpIHsKQEAgLTMwOSw2ICs0MzAsNyBAQAogICAgIH0KICAgICBTdHJpbmc4IGRlZmF1bHRVcmw7CiAgICAgRHJtUGx1Z2luOjpLZXlSZXF1ZXN0VHlwZSBrZXlSZXF1ZXN0VHlwZTsKKyAgICBtT2JqLT5tS2V5UmVxdWVzdC5jbGVhcigpOwogICAgIHN0YXR1c190IHN0YXR1cyA9IG1PYmotPm1Ecm0tPmdldEtleVJlcXVlc3QoKml0ZXIsIG1kSW5pdCwgU3RyaW5nOChtaW1lVHlwZSksCiAgICAgICAgICAgICBtZEtleVR5cGUsIG1kT3B0aW9uYWxQYXJhbWV0ZXJzLCBtT2JqLT5tS2V5UmVxdWVzdCwgZGVmYXVsdFVybCwKICAgICAgICAgICAgICZrZXlSZXF1ZXN0VHlwZSk7CkBAIC01NzYsNyArNjk4LDcgQEAKICAgICBWZWN0b3I8dWludDhfdD4gYnl0ZUFycmF5OwogICAgIGJ5dGVBcnJheS5hcHBlbmRBcnJheSh2YWx1ZSwgdmFsdWVTaXplKTsKIAotICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMobU9iai0+bURybS0+Z2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOChwcm9wZXJ0eU5hbWUpLAorICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMobU9iai0+bURybS0+c2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOChwcm9wZXJ0eU5hbWUpLAogICAgICAgICAgICAgICAgICAgICBieXRlQXJyYXkpKTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYUV4dHJhY3Rvci5jcHAKaW5kZXggYWM4MzdhMy4uZjY5N2JkMSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuY3BwCkBAIC0yMCw4ICsyMCw5IEBACiAKICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgogI2luY2x1ZGUgIk5ka01lZGlhRGF0YVNvdXJjZVByaXYuaCIKLSNpbmNsdWRlICJOZGtNZWRpYUZvcm1hdFByaXYuaCIKIAogCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KQEAgLTQwLDE5ICs0MSw2IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCi1zdGF0aWMgbWVkaWFfc3RhdHVzX3QgdHJhbnNsYXRlX2Vycm9yKHN0YXR1c190IGVycikgewotICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKLSAgICB9IGVsc2UgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICB9IGVsc2UgaWYgKGVyciA9PSBFUlJPUl9JTykgewotICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwotICAgIH0KLQotICAgIEFMT0dFKCJzZiBlcnJvciBjb2RlOiAlZCIsIGVycik7Ci0gICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwotfQotCiBzdHJ1Y3QgQU1lZGlhRXh0cmFjdG9yIHsKICAgICBzcDxOdU1lZGlhRXh0cmFjdG9yPiBtSW1wbDsKICAgICBzcDxBQnVmZmVyPiBtUHNzaEJ1ZjsKQEAgLTgyLDQ3ICs3MCwzNSBAQAogICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IobURhdGEtPm1JbXBsLT5zZXREYXRhU291cmNlKGZkLCBvZmZzZXQsIGxlbmd0aCkpOwogfQogCittZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZVdpdGhIZWFkZXJzKEFNZWRpYUV4dHJhY3RvciAqbURhdGEsCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgaW50IG51bWhlYWRlcnMsCisgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqa2V5cywKKyAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0ICp2YWx1ZXMpIHsKKworICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVzKSIsIHVyaSk7CisKKyAgICBzcDxNZWRpYUhUVFBTZXJ2aWNlPiBodHRwU2VydmljZSA9IGNyZWF0ZU1lZGlhSHR0cFNlcnZpY2UodXJpLCAvKiB2ZXJzaW9uID0gKi8gMSk7CisgICAgaWYgKGh0dHBTZXJ2aWNlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImNhbid0IGNyZWF0ZSBodHRwIHNlcnZpY2UiKTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBoZWFkZXJzOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtaGVhZGVyczsgKytpKSB7CisgICAgICAgIFN0cmluZzgga2V5OChrZXlzW2ldKTsKKyAgICAgICAgU3RyaW5nOCB2YWx1ZTgodmFsdWVzW2ldKTsKKyAgICAgICAgaGVhZGVycy5hZGQoa2V5OCwgdmFsdWU4KTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgZXJyID0gbURhdGEtPm1JbXBsLT5zZXREYXRhU291cmNlKGh0dHBTZXJ2aWNlLCB1cmksIG51bWhlYWRlcnMgPiAwID8gJmhlYWRlcnMgOiBOVUxMKTsKKyAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKGVycik7Cit9CisKIEVYUE9SVAogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2UoQU1lZGlhRXh0cmFjdG9yICptRGF0YSwgY29uc3QgY2hhciAqbG9jYXRpb24pIHsKLSAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcykiLCBsb2NhdGlvbik7Ci0gICAgLy8gVE9ETzogYWRkIGhlYWRlciBzdXBwb3J0Ci0KLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLSAgICBqb2JqZWN0IHNlcnZpY2UgPSBOVUxMOwotICAgIGlmIChlbnYgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgic2V0RGF0YVNvdXJjZShwYXRoKSBtdXN0IGJlIGNhbGxlZCBmcm9tIEphdmEgdGhyZWFkIik7Ci0gICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgamNsYXNzIG1lZGlhaHR0cGNsYXNzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvTWVkaWFIVFRQU2VydmljZSIpOwotICAgIGlmIChtZWRpYWh0dHBjbGFzcyA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJjYW4ndCBmaW5kIE1lZGlhSHR0cFNlcnZpY2UiKTsKLSAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOwotICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIGptZXRob2RJRCBtZWRpYUh0dHBDcmVhdGVNZXRob2QgPSBlbnYtPkdldFN0YXRpY01ldGhvZElEKG1lZGlhaHR0cGNsYXNzLAotICAgICAgICAgICAgImNyZWF0ZUh0dHBTZXJ2aWNlQmluZGVySWZOZWNlc3NhcnkiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylMYW5kcm9pZC9vcy9JQmluZGVyOyIpOwotICAgIGlmIChtZWRpYUh0dHBDcmVhdGVNZXRob2QgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiY2FuJ3QgZmluZCBtZXRob2QiKTsKLSAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOwotICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIGpzdHJpbmcgamxvYyA9IGVudi0+TmV3U3RyaW5nVVRGKGxvY2F0aW9uKTsKLQotICAgIHNlcnZpY2UgPSBlbnYtPkNhbGxTdGF0aWNPYmplY3RNZXRob2QobWVkaWFodHRwY2xhc3MsIG1lZGlhSHR0cENyZWF0ZU1ldGhvZCwgamxvYyk7Ci0gICAgZW52LT5EZWxldGVMb2NhbFJlZihqbG9jKTsKLQotICAgIHNwPElNZWRpYUhUVFBTZXJ2aWNlPiBodHRwU2VydmljZTsKLSAgICBpZiAoc2VydmljZSAhPSBOVUxMKSB7Ci0gICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IGliaW5kZXJGb3JKYXZhT2JqZWN0KGVudiwgc2VydmljZSk7Ci0gICAgICAgIGh0dHBTZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhSFRUUFNlcnZpY2U+KGJpbmRlcik7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyID0gbURhdGEtPm1JbXBsLT5zZXREYXRhU291cmNlKGh0dHBTZXJ2aWNlLCBsb2NhdGlvbiwgTlVMTCk7Ci0gICAgZW52LT5FeGNlcHRpb25DbGVhcigpOwotICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IoZXJyKTsKKyAgICByZXR1cm4gQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VXaXRoSGVhZGVycyhtRGF0YSwgbG9jYXRpb24sIDAsIE5VTEwsIE5VTEwpOwogfQogCiBFWFBPUlQKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdC5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXQuY3BwCmluZGV4IGYzMmI4M2UuLmZjYjcwNmQgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdC5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0LmNwcApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgogCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgpAQCAtMzIsMzEgKzMzLDggQEAKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKLXN0cnVjdCBBTWVkaWFGb3JtYXQgewotICAgIHNwPEFNZXNzYWdlPiBtRm9ybWF0OwotICAgIFN0cmluZzggbURlYnVnOwotICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1TdHJpbmdDYWNoZTsKLX07Ci0KIGV4dGVybiAiQyIgewogCi0vLyBwcml2YXRlIGZ1bmN0aW9ucyBmb3IgY29udmVyc2lvbiB0by9mcm9tIEFNZXNzYWdlCi1BTWVkaWFGb3JtYXQqIEFNZWRpYUZvcm1hdF9mcm9tTXNnKGNvbnN0IHZvaWQqIGRhdGEpIHsKLSAgICBBTE9HVigicHJpdmF0ZSBjdG9yIik7Ci0gICAgQU1lZGlhRm9ybWF0KiBtRGF0YSA9IG5ldyBBTWVkaWFGb3JtYXQoKTsKLSAgICBtRGF0YS0+bUZvcm1hdCA9ICooKHNwPEFNZXNzYWdlPiopZGF0YSk7Ci0gICAgaWYgKG1EYXRhLT5tRm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coImdvdCBOVUxMIGZvcm1hdCIpOwotICAgICAgICBtRGF0YS0+bUZvcm1hdCA9IG5ldyBBTWVzc2FnZTsKLSAgICB9Ci0gICAgcmV0dXJuIG1EYXRhOwotfQotCi12b2lkIEFNZWRpYUZvcm1hdF9nZXRGb3JtYXQoY29uc3QgQU1lZGlhRm9ybWF0KiBtRGF0YSwgdm9pZCogZGVzdCkgewotICAgICooKHNwPEFNZXNzYWdlPiopZGVzdCkgPSBtRGF0YS0+bUZvcm1hdDsKLX0KLQotCiAvKgogICogcHVibGljIGZ1bmN0aW9uIGZvbGxvdwogICovCkBAIC03NCw2ICs1MiwyMSBAQAogICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKK0VYUE9SVAordm9pZCBBTWVkaWFGb3JtYXRfY2xlYXIoQU1lZGlhRm9ybWF0ICpmb3JtYXQpIHsKKyAgICBmb3JtYXQtPm1Gb3JtYXQtPmNsZWFyKCk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRm9ybWF0X2NvcHkoQU1lZGlhRm9ybWF0ICp0bywgQU1lZGlhRm9ybWF0ICpmcm9tKSB7CisgICAgaWYgKCF0byB8fCAhZnJvbSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICB0by0+bUZvcm1hdC0+Y2xlYXIoKTsKKyAgICB0by0+bUZvcm1hdC0+ZXh0ZW5kKGZyb20tPm1Gb3JtYXQpOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKIAogRVhQT1JUCiBjb25zdCBjaGFyKiBBTWVkaWFGb3JtYXRfdG9TdHJpbmcoQU1lZGlhRm9ybWF0ICptRGF0YSkgewpAQCAtMjU2LDcgKzI0OSw3IEBACiB9CiAKIEVYUE9SVAotdm9pZCBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKEFNZWRpYUZvcm1hdCogZm9ybWF0LCBjb25zdCBjaGFyKiBuYW1lLCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgewordm9pZCBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKEFNZWRpYUZvcm1hdCogZm9ybWF0LCBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgewogICAgIC8vIHRoZSBBQnVmZmVyKHZvaWQqLCBzaXplX3QpIGNvbnN0cnVjdG9yIGRvZXNuJ3QgdGFrZSBvd25lcnNoaXAgb2YgdGhlIGRhdGEsIHNvIGNyZWF0ZQogICAgIC8vIGEgbmV3IGJ1ZmZlciBhbmQgY29weSB0aGUgZGF0YSBpbnRvIGl0CiAgICAgc3A8QUJ1ZmZlcj4gYnVmID0gbmV3IEFCdWZmZXIoc2l6ZSk7CkBAIC0yNzUsNjUgKzI2OCwxMTggQEAKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19NQVhfT1VUUFVUX0NIQU5ORUxfQ09VTlQgPSAiYWFjLW1heC1vdXRwdXQtY2hhbm5lbF9jb3VudCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfUFJPRklMRSA9ICJhYWMtcHJvZmlsZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfU0JSX01PREUgPSAiYWFjLXNici1tb2RlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FMQlVNID0gImFsYnVtIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUID0gImFsYnVtYXJ0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUSVNUID0gImFsYnVtYXJ0aXN0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FSVElTVCA9ICJhcnRpc3QiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX0lORk8gPSAiYXVkaW8tcHJlc2VudGF0aW9uLWluZm8iOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX1BSRVNFTlRBVElPTl9JRCA9CisgICAgICAgICJhdWRpby1wcmVzZW50YXRpb24tcHJlc2VudGF0aW9uLWlkIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9QUk9HUkFNX0lEID0gImF1ZGlvLXByZXNlbnRhdGlvbi1wcm9ncmFtLWlkIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1NFU1NJT05fSUQgPSAiYXVkaW8tc2Vzc2lvbi1pZCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BVVRIT1IgPSAiYXV0aG9yIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0JJVFJBVEVfTU9ERSA9ICJiaXRyYXRlLW1vZGUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUgPSAiYml0cmF0ZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUgPSAiYml0cy1wZXItc2FtcGxlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NBUFRVUkVfUkFURSA9ICJjYXB0dXJlLXJhdGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ0RUUkFDS05VTUJFUiA9ICJjZHRyYWNrbnVtIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQgPSAiY2hhbm5lbC1jb3VudCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX01BU0sgPSAiY2hhbm5lbC1tYXNrIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX0ZPUk1BVCA9ICJjb2xvci1mb3JtYXQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfUkFOR0UgPSAiY29sb3ItcmFuZ2UiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfU1RBTkRBUkQgPSAiY29sb3Itc3RhbmRhcmQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfVFJBTlNGRVIgPSAiY29sb3ItdHJhbnNmZXIiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09NUElMQVRJT04gPSAiY29tcGlsYXRpb24iOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09NUExFWElUWSA9ICJjb21wbGV4aXR5IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTVBPU0VSID0gImNvbXBvc2VyIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19ERUZBVUxUX0lWX1NJWkUgPSAiY3J5cHRvLWRlZmF1bHQtaXYtc2l6ZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX0JZVEVfQkxPQ0sgPSAiY3J5cHRvLWVuY3J5cHRlZC1ieXRlLWJsb2NrIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfU0laRVMgPSAiY3J5cHRvLWVuY3J5cHRlZC1zaXplcyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fSVYgPSAiY3J5cHRvLWl2IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVkgPSAiY3J5cHRvLWtleSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fTU9ERSA9ICJjcnlwdG8tbW9kZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fUExBSU5fU0laRVMgPSAiY3J5cHRvLXBsYWluLXNpemVzIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19TS0lQX0JZVEVfQkxPQ0sgPSAiY3J5cHRvLXNraXAtYnl0ZS1ibG9jayI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0QgPSAiY3NkIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF8wID0gImNzZC0wIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF8xID0gImNzZC0xIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF8yID0gImNzZC0yIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF9BVkMgPSAiY3NkLWF2YyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQyA9ICJjc2QtaGV2YyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9EMjYzID0gImQyNjMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfREFURSA9ICJkYXRlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RJU0NOVU1CRVIgPSAiZGlzY251bSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX0NST1AgPSAiY3JvcCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX0hFSUdIVCA9ICJkaXNwbGF5LWhlaWdodCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX1dJRFRIID0gImRpc3BsYXktd2lkdGgiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04gPSAiZHVyYXRpb25VcyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX0RFTEFZID0gImVuY29kZXItZGVsYXkiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9QQURESU5HID0gImVuY29kZXItcGFkZGluZyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FU0RTID0gImVzZHMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9PRkZTRVQgPSAiZXhpZi1vZmZzZXQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9TSVpFID0gImV4aWYtc2l6ZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9GTEFDX0NPTVBSRVNTSU9OX0xFVkVMID0gImZsYWMtY29tcHJlc3Npb24tbGV2ZWwiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfQ09VTlQgPSAiZnJhbWUtY291bnQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURSA9ICJmcmFtZS1yYXRlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0dFTlJFID0gImdlbnJlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0dSSURfQ09MVU1OUyA9ICJncmlkLWNvbHMiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfR1JJRF9ST1dTID0gImdyaWQtcm93cyI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9IRFJfU1RBVElDX0lORk8gPSAiaGRyLXN0YXRpYy1pbmZvIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0hEUjEwX1BMVVNfSU5GTyA9ICJoZHIxMC1wbHVzLWluZm8iOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hUID0gImhlaWdodCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JQ0NfUFJPRklMRSA9ICJpY2MtcHJvZmlsZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JTlRSQV9SRUZSRVNIX1BFUklPRCA9ICJpbnRyYS1yZWZyZXNoLXBlcmlvZCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19BRFRTID0gImlzLWFkdHMiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfQVVUT1NFTEVDVCA9ICJpcy1hdXRvc2VsZWN0IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX0RFRkFVTFQgPSAiaXMtZGVmYXVsdCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19GT1JDRURfU1VCVElUTEUgPSAiaXMtZm9yY2VkLXN1YnRpdGxlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUgPSAiaXMtc3luYy1mcmFtZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JX0ZSQU1FX0lOVEVSVkFMID0gImktZnJhbWUtaW50ZXJ2YWwiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTEFOR1VBR0UgPSAibGFuZ3VhZ2UiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTEFURU5DWSA9ICJsYXRlbmN5IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xFVkVMID0gImxldmVsIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xPQ0FUSU9OID0gImxvY2F0aW9uIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xPT1AgPSAibG9vcCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MWVJJQ0lTVCA9ICJseXJpY2lzdCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfQklUX1JBVEUgPSAibWF4LWJpdHJhdGUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX0hFSUdIVCA9ICJtYXgtaGVpZ2h0IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFID0gIm1heC1pbnB1dC1zaXplIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9XSURUSCA9ICJtYXgtd2lkdGgiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUlNRSA9ICJtaW1lIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01QRUdfVVNFUl9EQVRBID0gIm1wZWctdXNlci1kYXRhIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01QRUcyX1NUUkVBTV9IRUFERVIgPSAibXBlZzItc3RyZWFtLWhlYWRlciI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9PUEVSQVRJTkdfUkFURSA9ICJvcGVyYXRpbmctcmF0ZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QQ01fRU5DT0RJTkcgPSAicGNtLWVuY29kaW5nIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BSSU9SSVRZID0gInByaW9yaXR5IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BST0ZJTEUgPSAicHJvZmlsZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QQ01fQklHX0VORElBTiA9ICJwY20tYmlnLWVuZGlhbiI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QU1NIID0gInBzc2giOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUFVTSF9CTEFOS19CVUZGRVJTX09OX1NUT1AgPSAicHVzaC1ibGFuay1idWZmZXJzLW9uLXNodXRkb3duIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1JFUEVBVF9QUkVWSU9VU19GUkFNRV9BRlRFUiA9ICJyZXBlYXQtcHJldmlvdXMtZnJhbWUtYWZ0ZXIiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUk9UQVRJT04gPSAicm90YXRpb24tZGVncmVlcyI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSA9ICJzYW1wbGUtcmF0ZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TQVJfSEVJR0hUID0gInNhci1oZWlnaHQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0FSX1dJRFRIID0gInNhci13aWR0aCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TRUkgPSAic2VpIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NMSUNFX0hFSUdIVCA9ICJzbGljZS1oZWlnaHQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU1RSSURFID0gInN0cmlkZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9UQVJHRVRfVElNRSA9ICJ0YXJnZXQtdGltZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9DT1VOVCA9ICJ0ZW1wb3JhbC1sYXllci1jb3VudCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9JRCA9ICJ0ZW1wb3JhbC1sYXllci1pZCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUklORyA9ICJ0cy1zY2hlbWEiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEVYVF9GT1JNQVRfREFUQSA9ICJ0ZXh0LWZvcm1hdC1kYXRhIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9IRUlHSFQgPSAidGh1bWJuYWlsLWhlaWdodCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfVElNRSA9ICJ0aHVtYm5haWwtdGltZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfV0lEVEggPSAidGh1bWJuYWlsLXdpZHRoIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RJTEVfSEVJR0hUID0gInRpbGUtaGVpZ2h0IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RJTEVfV0lEVEggPSAidGlsZS13aWR0aCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USU1FX1VTID0gInRpbWVVcyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USVRMRSA9ICJ0aXRsZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9UUkFDS19JRCA9ICJ0cmFjay1pZCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9UUkFDS19JTkRFWCA9ICJ0cmFjay1pbmRleCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9WQUxJRF9TQU1QTEVTID0gInZhbGlkLXNhbXBsZXMiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfV0lEVEggPSAid2lkdGgiOwotCitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ZRUFSID0gInllYXIiOwogCiB9IC8vIGV4dGVybiAiQyIKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0UHJpdi5oIGIvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0UHJpdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmE2NTYzLi4wMDAwMDAwCi0tLSBhL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdFByaXYuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogVGhpcyBmaWxlIGRlZmluZXMgYW4gTkRLIEFQSS4KLSAqIERvIG5vdCByZW1vdmUgbWV0aG9kcy4KLSAqIERvIG5vdCBjaGFuZ2UgbWV0aG9kIHNpZ25hdHVyZXMuCi0gKiBEbyBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBjb25zdGFudHMuCi0gKiBEbyBub3QgY2hhbmdlIHRoZSBzaXplIG9mIGFueSBvZiB0aGUgY2xhc3NlcyBkZWZpbmVkIGluIGhlcmUuCi0gKiBEbyBub3QgcmVmZXJlbmNlIHR5cGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBOREsuCi0gKiBEbyBub3QgI2luY2x1ZGUgZmlsZXMgdGhhdCBhcmVuJ3QgcGFydCBvZiB0aGUgTkRLLgotICovCi0KLSNpZm5kZWYgX05ES19NRURJQV9GT1JNQVRfUFJJVl9ICi0jZGVmaW5lIF9OREtfTUVESUFfRk9STUFUX1BSSVZfSAotCi0jaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1BTWVkaWFGb3JtYXQqIEFNZWRpYUZvcm1hdF9mcm9tTXNnKHZvaWQqKTsKLXZvaWQgQU1lZGlhRm9ybWF0X2dldEZvcm1hdChjb25zdCBBTWVkaWFGb3JtYXQqIG1EYXRhLCB2b2lkKiBkZXN0KTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19IC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYgLy8gX05ES19NRURJQV9GT1JNQVRfUFJJVl9ICi0KZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYU11eGVyLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYU11eGVyLmNwcAppbmRleCBkZmZjNGQ3Li5lNzk5MjZkIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFNdXhlci5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhTXV4ZXIuY3BwCkBAIC0yMCw3ICsyMCw4IEBACiAKICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYU11eGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFDb2RlYy5oPgotI2luY2x1ZGUgIk5ka01lZGlhRm9ybWF0UHJpdi5oIgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3JQcml2Lmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2Lmg+CiAKIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgpAQCAtMzYsMTQgKzM3LDYgQEAKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKLXN0YXRpYyBtZWRpYV9zdGF0dXNfdCB0cmFuc2xhdGVfZXJyb3Ioc3RhdHVzX3QgZXJyKSB7Ci0gICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICByZXR1cm4gQU1FRElBX09LOwotICAgIH0KLSAgICBBTE9HRSgic2YgZXJyb3IgY29kZTogJWQiLCBlcnIpOwotICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKLX0KLQogc3RydWN0IEFNZWRpYU11eGVyIHsKICAgICBzcDxNZWRpYU11eGVyPiBtSW1wbDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2UuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlLmgKaW5kZXggZjkzNjExOC4uMTViMzQwYyAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2UuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZS5oCkBAIC00OTksNyArNDk5LDM0IEBACiAgICAgICogPHA+V2hlbiBhbiB7QGxpbmsgQUltYWdlfSBvZiB0aGlzIGZvcm1hdCBpcyBvYnRhaW5lZCBmcm9tIGFuIHtAbGluayBBSW1hZ2VSZWFkZXJ9IG9yCiAgICAgICoge0BsaW5rIEFJbWFnZV9nZXROdW1iZXJPZlBsYW5lcygpfSBtZXRob2Qgd2lsbCByZXR1cm4gemVyby48L3A+CiAgICAgICovCi0gICAgQUlNQUdFX0ZPUk1BVF9QUklWQVRFICAgICAgICAgICA9IDB4MjIKKyAgICBBSU1BR0VfRk9STUFUX1BSSVZBVEUgICAgICAgICAgID0gMHgyMiwKKworICAgIC8qKgorICAgICAqIEFuZHJvaWQgWTggZm9ybWF0LgorICAgICAqCisgICAgICogPHA+WTggaXMgYSBwbGFuYXIgZm9ybWF0IGNvbXByaXNlZCBvZiBhIFd4SCBZIHBsYW5lIG9ubHksIHdpdGggZWFjaCBwaXhlbAorICAgICAqIGJlaW5nIHJlcHJlc2VudGVkIGJ5IDggYml0cy48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIGZvcm1hdCBhc3N1bWVzCisgICAgICogPHVsPgorICAgICAqIDxsaT5hbiBldmVuIHdpZHRoPC9saT4KKyAgICAgKiA8bGk+YW4gZXZlbiBoZWlnaHQ8L2xpPgorICAgICAqIDxsaT5hIGhvcml6b250YWwgc3RyaWRlIG11bHRpcGxlIG9mIDE2IHBpeGVsczwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiA8cHJlPiBzaXplID0gc3RyaWRlICogaGVpZ2h0IDwvcHJlPgorICAgICAqCisgICAgICogPHA+Rm9yIGV4YW1wbGUsIHRoZSB7QGxpbmsgQUltYWdlfSBvYmplY3QgY2FuIHByb3ZpZGUgZGF0YQorICAgICAqIGluIHRoaXMgZm9ybWF0IGZyb20gYSB7QGxpbmsgQUNhbWVyYURldmljZX0gKGlmIHN1cHBvcnRlZCkgdGhyb3VnaCBhCisgICAgICoge0BsaW5rIEFJbWFnZVJlYWRlcn0gb2JqZWN0LiBUaGUgbnVtYmVyIG9mIHBsYW5lcyByZXR1cm5lZCBieQorICAgICAqIHtAbGluayBBSW1hZ2VfZ2V0TnVtYmVyT2ZQbGFuZXN9IHdpbGwgYWx3YXlzIGJlIDEuIFRoZSBwaXhlbCBzdHJpZGUgcmV0dXJuZWQgYnkKKyAgICAgKiB7QGxpbmsgQUltYWdlX2dldFBsYW5lUGl4ZWxTdHJpZGV9IHdpbGwgYWx3YXlzIGJlIDEsIGFuZCB0aGUKKyAgICAgKiB7QGxpbmsgQUltYWdlX2dldFBsYW5lUm93U3RyaWRlfSBkZXNjcmliZWQgdGhlIHZlcnRpY2FsIG5laWdoYm9yaW5nIHBpeGVsIGRpc3RhbmNlCisgICAgICogKGluIGJ5dGVzKSBiZXR3ZWVuIGFkamFjZW50IHJvd3MuPC9wPgorICAgICAqCisgICAgICovCisgICAgQUlNQUdFX0ZPUk1BVF9ZOCA9IDB4MjAyMDM4NTkKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2VSZWFkZXIuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlUmVhZGVyLmgKaW5kZXggNjhkZTE3Ni4uZTVkODYzYyAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2VSZWFkZXIuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZVJlYWRlci5oCkBAIC0zNyw2ICszNyw5IEBACiAjZGVmaW5lIF9OREtfSU1BR0VfUkVBREVSX0gKIAogI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2lmZGVmIF9fQU5EUk9JRF9WTkRLX18KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2VuZGlmCiAKICNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3cuaD4KICNpbmNsdWRlICJOZGtNZWRpYUVycm9yLmgiCkBAIC00NjEsNiArNDY0LDIzIEBACiBtZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfc2V0QnVmZmVyUmVtb3ZlZExpc3RlbmVyKAogICAgICAgICBBSW1hZ2VSZWFkZXIqIHJlYWRlciwgQUltYWdlUmVhZGVyX0J1ZmZlclJlbW92ZWRMaXN0ZW5lciogbGlzdGVuZXIpIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisvKgorICogR2V0IHRoZSBuYXRpdmVfaGFuZGxlX3QgY29ycmVzcG9uZGluZyB0byB0aGUgQU5hdGl2ZVdpbmRvdyBvd25lZCBieSB0aGUKKyAqIEFJbWFnZVJlYWRlciBwcm92aWRlZC4KKyAqCisgKiBAcGFyYW0gcmVhZGVyIFRoZSBpbWFnZSByZWFkZXIgb2YgaW50ZXJlc3QuCisgKiBAcGFyYW0gaGFuZGxlIFRoZSBvdXRwdXQgbmF0aXZlX2hhbmRsZV90LiBUaGlzIG5hdGl2ZSBoYW5kbGUgaXMgb3duZWQgYnkKKyAqICAgICAgICAgICAgICAgdGhpcyBpbWFnZSByZWFkZXIuCisgKgorICogQHJldHVybiBBTUVESUFfT0sgaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLgorICogICAgICAgICBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgaWYgcmVhZGVyIG9yIGhhbmRsZSBhcmUgTlVMTC4KKyAqICAgICAgICAgQU1FRElBX0VSUk9SX1VOS05PV04gaWYgc29tZSBvdGhlciBlcnJvciBpcyBlbmNvdW50ZXJlZC4KKyAqLworbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyX2dldFdpbmRvd05hdGl2ZUhhbmRsZSgKKyAgICBBSW1hZ2VSZWFkZXIgKnJlYWRlciwgLyogb3V0ICovbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKyNlbmRpZgorCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI2ICovCiAKIF9fRU5EX0RFQ0xTCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURhdGFTb3VyY2UuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oCmluZGV4IGVhNWJhMGMuLjE2YjFlYjMgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oCkBAIC00MywxNCArNDMsOSBAQAogLyoKICAqIEFNZWRpYURhdGFTb3VyY2UncyBjYWxsYmFja3Mgd2lsbCBiZSBpbnZva2VkIG9uIGFuIGltcGxlbWVudGF0aW9uLWRlZmluZWQgdGhyZWFkCiAgKiBvciB0aHJlYWQgcG9vbC4gTm8gZ3VhcmFudGVlcyBhcmUgcHJvdmlkZWQgYWJvdXQgd2hpY2ggdGhyZWFkKHMpIHdpbGwgYmUgdXNlZCBmb3IKLSAqIGNhbGxiYWNrcy4gSG93ZXZlciwgaXQgaXMgZ3VhcmFudGVlZCB0aGF0IEFNZWRpYURhdGFTb3VyY2UncyBjYWxsYmFja3Mgd2lsbCBvbmx5Ci0gKiBldmVyIGJlIGludm9rZWQgYnkgYSBzaW5nbGUgdGhyZWFkIGF0IGEgdGltZS4KLSAqCi0gKiBUaGVyZSB3aWxsIGJlIGEgdGhyZWFkIHN5bmNocm9uaXphdGlvbiBwb2ludCBiZXR3ZWVuIGVhY2ggY2FsbCB0byBlbnN1cmUgdGhhdAotICogbW9kaWZpY2F0aW9ucyB0byB0aGUgc3RhdGUgb2YgeW91ciBBTWVkaWFEYXRhU291cmNlIGFyZSB2aXNpYmxlIHRvIGZ1dHVyZQotICogY2FsbHMuIFRoaXMgbWVhbnMgeW91IGRvbid0IG5lZWQgdG8gZG8geW91ciBvd24gc3luY2hyb25pemF0aW9uIHVubGVzcyB5b3UncmUKLSAqIG1vZGlmeWluZyB0aGUgQU1lZGlhRGF0YVNvdXJjZSBmcm9tIGFub3RoZXIgdGhyZWFkIHdoaWxlIGl0J3MgYmVpbmcgdXNlZCBieSB0aGUKLSAqIGZyYW1ld29yay4KKyAqIGNhbGxiYWNrcy4gRm9yIGV4YW1wbGUsIHxjbG9zZXwgY2FuIGJlIGludm9rZWQgZnJvbSBhIGRpZmZlcmVudCB0aHJlYWQgdGhhbiB0aGUKKyAqIHRocmVhZCBpbnZva2luZyB8cmVhZEF0fC4gQXMgc3VjaCwgdGhlIEltcGxlbWVudGF0aW9ucyBvZiBBTWVkaWFEYXRhU291cmNlIGNhbGxiYWNrcworICogbXVzdCBiZSB0aHJlYWRzYWZlLgogICovCiAKIC8qKgpAQCAtNzQsOSArNjksMTkgQEAKIHR5cGVkZWYgc3NpemVfdCAoKkFNZWRpYURhdGFTb3VyY2VHZXRTaXplKSh2b2lkICp1c2VyZGF0YSk7CiAKIC8qKgotICogQ2FsbGVkIHRvIGNsb3NlIHRoZSBkYXRhIHNvdXJjZSBhbmQgcmVsZWFzZSBhc3NvY2lhdGVkIHJlc291cmNlcy4KLSAqIFRoZSBOREsgbWVkaWEgZnJhbWV3b3JrIGd1YXJhbnRlZXMgdGhhdCBhZnRlciB8Y2xvc2V8IGlzIGNhbGxlZAotICogbm8gZnV0dXJlIGNhbGxiYWNrcyB3aWxsIGJlIGludm9rZWQgb24gdGhlIGRhdGEgc291cmNlLgorICogQ2FsbGVkIHRvIGNsb3NlIHRoZSBkYXRhIHNvdXJjZSwgdW5ibG9jayByZWFkcywgYW5kIHJlbGVhc2UgYXNzb2NpYXRlZAorICogcmVzb3VyY2VzLgorICoKKyAqIFRoZSBOREsgbWVkaWEgZnJhbWV3b3JrIGd1YXJhbnRlZXMgdGhhdCBhZnRlciB0aGUgZmlyc3QgfGNsb3NlfCBpcworICogY2FsbGVkLCBubyBmdXR1cmUgY2FsbGJhY2tzIHdpbGwgYmUgaW52b2tlZCBvbiB0aGUgZGF0YSBzb3VyY2UgZXhjZXB0CisgKiBmb3IgfGNsb3NlfCBpdHNlbGYuCisgKgorICogQ2xvc2luZyBhIGRhdGEgc291cmNlIGFsbG93cyByZWFkQXQgY2FsbHMgdGhhdCB3ZXJlIGJsb2NrZWQgd2FpdGluZworICogZm9yIEkvTyBkYXRhIHRvIHJldHVybiBwcm9tcHRseS4KKyAqCisgKiBXaGVuIHVzaW5nIEFNZWRpYURhdGFTb3VyY2UgYXMgaW5wdXQgdG8gQU1lZGlhRXh0cmFjdG9yLCBjbG9zaW5nCisgKiBoYXMgdGhlIGVmZmVjdCBvZiB1bmJsb2NraW5nIHNsb3cgcmVhZHMgaW5zaWRlIG9mIHNldERhdGFTb3VyY2UKKyAqIGFuZCByZWFkU2FtcGxlRGF0YS4KICAqLwogdHlwZWRlZiB2b2lkICgqQU1lZGlhRGF0YVNvdXJjZUNsb3NlKSh2b2lkICp1c2VyZGF0YSk7CiAKQEAgLTg2LDYgKzkxLDM4IEBACiAgKi8KIEFNZWRpYURhdGFTb3VyY2UqIEFNZWRpYURhdGFTb3VyY2VfbmV3KCkgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAorI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOQorCisvKioKKyAqIENhbGxlZCB0byBnZXQgYW4gZXN0aW1hdGUgb2YgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSByZWFkIGZyb20gdGhpcyBkYXRhIHNvdXJjZQorICogc3RhcnRpbmcgYXQgfG9mZnNldHwgd2l0aG91dCBibG9ja2luZyBmb3IgSS9PLgorICoKKyAqIFJldHVybiAtMSB3aGVuIHN1Y2ggYW4gZXN0aW1hdGUgaXMgbm90IHBvc3NpYmxlLgorICovCit0eXBlZGVmIHNzaXplX3QgKCpBTWVkaWFEYXRhU291cmNlR2V0QXZhaWxhYmxlU2l6ZSkodm9pZCAqdXNlcmRhdGEsIG9mZjY0X3Qgb2Zmc2V0KTsKKworLyoqCisgKiBDcmVhdGUgbmV3IG1lZGlhIGRhdGEgc291cmNlLiBSZXR1cm5zIE5VTEwgaWYgbWVtb3J5IGFsbG9jYXRpb24KKyAqIGZvciB0aGUgbmV3IGRhdGEgc291cmNlIG9iamVjdCBmYWlscy4KKyAqCisgKiBTZXQgdGhlIHx1cml8IGZyb20gd2hpY2ggdGhlIGRhdGEgc291cmNlIHdpbGwgcmVhZCwKKyAqIHBsdXMgYWRkaXRpb25hbCBodHRwIGhlYWRlcnMgd2hlbiBpbml0aWF0aW5nIHRoZSByZXF1ZXN0LgorICoKKyAqIEhlYWRlcnMgd2lsbCBjb250YWluIGNvcnJlc3BvbmRpbmcgaXRlbXMgZnJvbSB8a2V5X3ZhbHVlc3wKKyAqIGluIHRoZSBmb2xsb3dpbmcgZmFzaGlvbjoKKyAqCisgKiBrZXlfdmFsdWVzWzBdOmtleV92YWx1ZXNbMV0KKyAqIGtleV92YWx1ZXNbMl06a2V5X3ZhbHVlc1szXQorICogLi4uCisgKiBrZXlfdmFsdWVzWyhudW1oZWFkZXJzIC0gMSkgKiAyXTprZXlfdmFsdWVzWyhudW1oZWFkZXJzIC0gMSkgKiAyICsgMV0KKyAqCisgKi8KK0FNZWRpYURhdGFTb3VyY2UqIEFNZWRpYURhdGFTb3VyY2VfbmV3VXJpKGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgaW50IG51bWhlYWRlcnMsCisgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqa2V5X3ZhbHVlcykgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworI2VuZGlmICAvKl9fQU5EUk9JRF9BUElfXyA+PSAyOSAqLworCiAvKioKICAqIERlbGV0ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBtZWRpYSBkYXRhIHNvdXJjZS4KICAqLwpAQCAtMTM3LDYgKzE3NCwzMCBAQAogCiAjZW5kaWYgIC8qX19BTkRST0lEX0FQSV9fID49IDI4ICovCiAKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjkKKworLyoqCisgKiBDbG9zZSB0aGUgZGF0YSBzb3VyY2UsIHVuYmxvY2sgcmVhZHMsIGFuZCByZWxlYXNlIGFzc29jaWF0ZWQgcmVzb3VyY2VzLgorICoKKyAqIFBsZWFzZSByZWZlciB0byB0aGUgZGVmaW5pdGlvbiBvZiBBTWVkaWFEYXRhU291cmNlQ2xvc2UgZm9yCisgKiBhZGRpdGlvbmFsIGRldGFpbHMuCisgKi8KK3ZvaWQgQU1lZGlhRGF0YVNvdXJjZV9jbG9zZShBTWVkaWFEYXRhU291cmNlKikgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworLyoqCisgKiBTZXQgYSBjdXN0b20gY2FsbGJhY2sgZm9yIHN1cHBseWluZyB0aGUgZXN0aW1hdGVkIG51bWJlciBvZiBieXRlcworICogdGhhdCBjYW4gYmUgcmVhZCBmcm9tIHRoaXMgZGF0YSBzb3VyY2Ugc3RhcnRpbmcgYXQgYW4gb2Zmc2V0IHdpdGhvdXQKKyAqIGJsb2NraW5nIGZvciBJL08uCisgKgorICogUGxlYXNlIHJlZmVyIHRvIHRoZSBkZWZpbml0aW9uIG9mIEFNZWRpYURhdGFTb3VyY2VHZXRBdmFpbGFibGVTaXplCisgKiBmb3IgYWRkaXRpb25hbCBkZXRhaWxzLgorICovCit2b2lkIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0QXZhaWxhYmxlU2l6ZSgKKyAgICAgICAgQU1lZGlhRGF0YVNvdXJjZSosCisgICAgICAgIEFNZWRpYURhdGFTb3VyY2VHZXRBdmFpbGFibGVTaXplKSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisjZW5kaWYgIC8qX19BTkRST0lEX0FQSV9fID49IDI5ICovCisKIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvLyBfTkRLX01FRElBX0RBVEFTT1VSQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFEcm0uaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRHJtLmgKaW5kZXggMDIwOTY4MS4uMmU0MzhkOSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFEcm0uaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURybS5oCkBAIC01Niw2ICs1Niw3IEBACiB0eXBlZGVmIEFNZWRpYURybUJ5dGVBcnJheSBBTWVkaWFEcm1TY29wZTsKIHR5cGVkZWYgQU1lZGlhRHJtQnl0ZUFycmF5IEFNZWRpYURybUtleVNldElkOwogdHlwZWRlZiBBTWVkaWFEcm1CeXRlQXJyYXkgQU1lZGlhRHJtU2VjdXJlU3RvcDsKK3R5cGVkZWYgQU1lZGlhRHJtQnl0ZUFycmF5IEFNZWRpYURybUtleUlkOwogCiB0eXBlZGVmIGVudW0gQU1lZGlhRHJtRXZlbnRUeXBlIHsKICAgICAvKioKQEAgLTgxLDEyICs4Miw4OSBAQAogICAgICAqIFRoaXMgZXZlbnQgbWF5IGluZGljYXRlIHNvbWUgc3BlY2lmaWMgdmVuZG9yLWRlZmluZWQgY29uZGl0aW9uLCBzZWUgeW91cgogICAgICAqIERSTSBwcm92aWRlciBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzCiAgICAgICovCi0gICAgRVZFTlRfVkVORE9SX0RFRklORUQgPSA0CisgICAgRVZFTlRfVkVORE9SX0RFRklORUQgPSA0LAorCisgICAgLyoqCisgICAgICogVGhpcyBldmVudCBpbmRpY2F0ZXMgdGhhdCBhIHNlc3Npb24gb3BlbmVkIGJ5IHRoZSBhcHAgaGFzIGJlZW4gcmVjbGFpbWVkCisgICAgICogYnkgdGhlIHJlc291cmNlIG1hbmFnZXIuCisgICAgICovCisgICAgRVZFTlRfU0VTU0lPTl9SRUNMQUlNRUQgPSA1LAogfSBBTWVkaWFEcm1FdmVudFR5cGU7CiAKK3R5cGVkZWYgZW51bSBBTWVkaWFEcm1LZXlUeXBlIHsKKyAgICAvKioKKyAgICAgKiBUaGlzIGtleSByZXF1ZXN0IHR5cGUgc3BlY2lmaWVzIHRoYXQgdGhlIGtleXMgd2lsbCBiZSBmb3Igb25saW5lIHVzZSwgdGhleSB3aWxsCisgICAgICogbm90IGJlIHNhdmVkIHRvIHRoZSBkZXZpY2UgZm9yIHN1YnNlcXVlbnQgdXNlIHdoZW4gdGhlIGRldmljZSBpcyBub3QgY29ubmVjdGVkCisgICAgICogdG8gYSBuZXR3b3JrLgorICAgICAqLworICAgIEtFWV9UWVBFX1NUUkVBTUlORyA9IDEsCisKKyAgICAvKioKKyAgICAgKiBUaGlzIGtleSByZXF1ZXN0IHR5cGUgc3BlY2lmaWVzIHRoYXQgdGhlIGtleXMgd2lsbCBiZSBmb3Igb2ZmbGluZSB1c2UsIHRoZXkKKyAgICAgKiB3aWxsIGJlIHNhdmVkIHRvIHRoZSBkZXZpY2UgZm9yIHVzZSB3aGVuIHRoZSBkZXZpY2UgaXMgbm90IGNvbm5lY3RlZCB0byBhIG5ldHdvcmsuCisgICAgICovCisgICAgS0VZX1RZUEVfT0ZGTElORSA9IDIsCisKKyAgICAvKioKKyAgICAgKiBUaGlzIGtleSByZXF1ZXN0IHR5cGUgc3BlY2lmaWVzIHRoYXQgcHJldmlvdXNseSBzYXZlZCBvZmZsaW5lIGtleXMgc2hvdWxkIGJlIHJlbGVhc2VkLgorICAgICAqLworICAgIEtFWV9UWVBFX1JFTEVBU0UgPSAzCit9IEFNZWRpYURybUtleVR5cGU7CisKKy8qKgorICogIERhdGEgdHlwZSBjb250YWluaW5nIHtrZXksIHZhbHVlfSBwYWlyCisgKi8KK3R5cGVkZWYgc3RydWN0IEFNZWRpYURybUtleVZhbHVlUGFpciB7CisgICAgY29uc3QgY2hhciAqbUtleTsKKyAgICBjb25zdCBjaGFyICptVmFsdWU7Cit9IEFNZWRpYURybUtleVZhbHVlOworCit0eXBlZGVmIGVudW0gQU1lZGlhS2V5U3RhdHVzVHlwZSB7CisgICAgLyoqCisgICAgICogVGhlIGtleSBpcyBjdXJyZW50bHkgdXNhYmxlIHRvIGRlY3J5cHQgbWVkaWEgZGF0YS4KKyAgICAgKi8KKyAgICBLRVlfU1RBVFVTX1RZUEVfVVNBQkxFLAorCisgICAgLyoqCisgICAgICogVGhlIGtleSBpcyBubyBsb25nZXIgdXNhYmxlIHRvIGRlY3J5cHQgbWVkaWEgZGF0YSBiZWNhdXNlIGl0cyBleHBpcmF0aW9uCisgICAgICogdGltZSBoYXMgcGFzc2VkLgorICAgICAqLworICAgIEtFWV9TVEFUVVNfVFlQRV9FWFBJUkVELAorCisgICAgLyoqCisgICAgICogVGhlIGtleSBpcyBub3QgY3VycmVudGx5IHVzYWJsZSB0byBkZWNyeXB0IG1lZGlhIGRhdGEgYmVjYXVzZSBpdHMgb3V0cHV0CisgICAgICogcmVxdWlyZW1lbnRzIGNhbm5vdCBjdXJyZW50bHkgYmUgbWV0LgorICAgICAqLworICAgIEtFWV9TVEFUVVNfVFlQRV9PVVRQVVROT1RBTExPV0VELAorCisgICAgLyoqCisgICAgICogVGhlIHN0YXR1cyBvZiB0aGUga2V5IGlzIG5vdCB5ZXQga25vd24gYW5kIGlzIGJlaW5nIGRldGVybWluZWQuCisgICAgICovCisgICAgS0VZX1NUQVRVU19UWVBFX1NUQVRVU1BFTkRJTkcsCisKKyAgICAvKioKKyAgICAgKiBUaGUga2V5IGlzIG5vdCBjdXJyZW50bHkgdXNhYmxlIHRvIGRlY3J5cHQgbWVkaWEgZGF0YSBiZWNhdXNlIG9mIGFuCisgICAgICogaW50ZXJuYWwgZXJyb3IgaW4gcHJvY2Vzc2luZyB1bnJlbGF0ZWQgdG8gaW5wdXQgcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBLRVlfU1RBVFVTX1RZUEVfSU5URVJOQUxFUlJPUiwKKworfSBBTWVkaWFEcm1LZXlTdGF0dXNUeXBlOworCit0eXBlZGVmIHN0cnVjdCBBTWVkaWFEcm1LZXlTdGF0dXMgeworICAgIEFNZWRpYURybUtleUlkIGtleUlkOworICAgIEFNZWRpYURybUtleVN0YXR1c1R5cGUga2V5VHlwZTsKK30gQU1lZGlhRHJtS2V5U3RhdHVzOworCiB0eXBlZGVmIHZvaWQgKCpBTWVkaWFEcm1FdmVudExpc3RlbmVyKShBTWVkaWFEcm0gKiwgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQsCiAgICAgICAgIEFNZWRpYURybUV2ZW50VHlwZSBldmVudFR5cGUsIGludCBleHRyYSwgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGRhdGFTaXplKTsKIAordHlwZWRlZiB2b2lkICgqQU1lZGlhRHJtRXhwaXJhdGlvblVwZGF0ZUxpc3RlbmVyKShBTWVkaWFEcm0gKiwKKyAgICAgICAgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQsIGludDY0X3QgZXhwaXJ5VGltZUluTVMpOworCit0eXBlZGVmIHZvaWQgKCpBTWVkaWFEcm1LZXlzQ2hhbmdlTGlzdGVuZXIpKEFNZWRpYURybSAqLAorICAgICAgICBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCwgY29uc3QgQU1lZGlhRHJtS2V5U3RhdHVzICprZXlTdGF0dXMsCisgICAgICAgIHNpemVfdCBudW1LZXlzLCBib29sIGhhc05ld1VzYWJsZUtleSk7CisKICNpZiBfX0FORFJPSURfQVBJX18gPj0gMjEKIAogLyoqCkBAIC0xMjAsNiArMTk4LDIyIEBACiAgICAgICAgIEFNZWRpYURybUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgorICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gYW4gZXhwaXJhdGlvbiB1cGRhdGUgZXZlbnQgb2NjdXJzCisgKgorICogbGlzdGVuZXIgaXMgdGhlIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBpbnZva2VkIG9uIGV2ZW50CisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9zZXRPbkV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lcihBTWVkaWFEcm0gKiwKKyAgICAgICAgQU1lZGlhRHJtRXhwaXJhdGlvblVwZGF0ZUxpc3RlbmVyIGxpc3RlbmVyKSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisvKioKKyAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIGEga2V5IHN0YXR1cyBjaGFuZ2UgZXZlbnQgb2NjdXJzCisgKgorICogbGlzdGVuZXIgaXMgdGhlIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBpbnZva2VkIG9uIGV2ZW50CisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9zZXRPbktleXNDaGFuZ2VMaXN0ZW5lcihBTWVkaWFEcm0gKiwKKyAgICAgICAgQU1lZGlhRHJtS2V5c0NoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisvKioKICAqIE9wZW4gYSBuZXcgc2Vzc2lvbiB3aXRoIHRoZSBNZWRpYURybSBvYmplY3QuICBBIHNlc3Npb24gSUQgaXMgcmV0dXJuZWQuCiAgKgogICogcmV0dXJucyBNRURJQURSTV9OT1RfUFJPVklTSU9ORURfRVJST1IgaWYgcHJvdmlzaW9uaW5nIGlzIG5lZWRlZApAQCAtMTM1LDM0ICsyMjksNiBAQAogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2Nsb3NlU2Vzc2lvbihBTWVkaWFEcm0gKiwKICAgICAgICAgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKLXR5cGVkZWYgZW51bSBBTWVkaWFEcm1LZXlUeXBlIHsKLSAgICAvKioKLSAgICAgKiBUaGlzIGtleSByZXF1ZXN0IHR5cGUgc3BlY2llcyB0aGF0IHRoZSBrZXlzIHdpbGwgYmUgZm9yIG9ubGluZSB1c2UsIHRoZXkgd2lsbAotICAgICAqIG5vdCBiZSBzYXZlZCB0byB0aGUgZGV2aWNlIGZvciBzdWJzZXF1ZW50IHVzZSB3aGVuIHRoZSBkZXZpY2UgaXMgbm90IGNvbm5lY3RlZAotICAgICAqIHRvIGEgbmV0d29yay4KLSAgICAgKi8KLSAgICBLRVlfVFlQRV9TVFJFQU1JTkcgPSAxLAotCi0gICAgLyoqCi0gICAgICogVGhpcyBrZXkgcmVxdWVzdCB0eXBlIHNwZWNpZmllcyB0aGF0IHRoZSBrZXlzIHdpbGwgYmUgZm9yIG9mZmxpbmUgdXNlLCB0aGV5Ci0gICAgICogd2lsbCBiZSBzYXZlZCB0byB0aGUgZGV2aWNlIGZvciB1c2Ugd2hlbiB0aGUgZGV2aWNlIGlzIG5vdCBjb25uZWN0ZWQgdG8gYSBuZXR3b3JrLgotICAgICAqLwotICAgIEtFWV9UWVBFX09GRkxJTkUgPSAyLAotCi0gICAgLyoqCi0gICAgICogVGhpcyBrZXkgcmVxdWVzdCB0eXBlIHNwZWNpZmllcyB0aGF0IHByZXZpb3VzbHkgc2F2ZWQgb2ZmbGluZSBrZXlzIHNob3VsZCBiZSByZWxlYXNlZC4KLSAgICAgKi8KLSAgICBLRVlfVFlQRV9SRUxFQVNFID0gMwotfSBBTWVkaWFEcm1LZXlUeXBlOwotCi0vKioKLSAqICBEYXRhIHR5cGUgY29udGFpbmluZyB7a2V5LCB2YWx1ZX0gcGFpcgotICovCi10eXBlZGVmIHN0cnVjdCBBTWVkaWFEcm1LZXlWYWx1ZVBhaXIgewotICAgIGNvbnN0IGNoYXIgKm1LZXk7Ci0gICAgY29uc3QgY2hhciAqbVZhbHVlOwotfSBBTWVkaWFEcm1LZXlWYWx1ZTsKLQogLyoqCiAgKiBBIGtleSByZXF1ZXN0L3Jlc3BvbnNlIGV4Y2hhbmdlIG9jY3VycyBiZXR3ZWVuIHRoZSBhcHAgYW5kIGEgbGljZW5zZSBzZXJ2ZXIKICAqIHRvIG9idGFpbiBvciByZWxlYXNlIGtleXMgdXNlZCB0byBkZWNyeXB0IGVuY3J5cHRlZCBjb250ZW50LgpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFcnJvci5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFcnJvci5oCmluZGV4IDc1ZjQ2MDUuLjJiZTFkNmUgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXJyb3IuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUVycm9yLmgKQEAgLTYzLDYgKzYzLDcgQEAKICAgICBBTUVESUFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT04gICAgID0gQU1FRElBX0VSUk9SX0JBU0UgLSA1LAogICAgIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNICAgICAgICAgPSBBTUVESUFfRVJST1JfQkFTRSAtIDYsCiAgICAgQU1FRElBX0VSUk9SX0lPICAgICAgICAgICAgICAgICAgICA9IEFNRURJQV9FUlJPUl9CQVNFIC0gNywKKyAgICBBTUVESUFfRVJST1JfV09VTERfQkxPQ0sgICAgICAgICAgID0gQU1FRElBX0VSUk9SX0JBU0UgLSA4LAogCiAgICAgQU1FRElBX0RSTV9FUlJPUl9CQVNFICAgICAgICAgICAgICA9IC0yMDAwMCwKICAgICBBTUVESUFfRFJNX05PVF9QUk9WSVNJT05FRCAgICAgICAgID0gQU1FRElBX0RSTV9FUlJPUl9CQVNFIC0gMSwKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oCmluZGV4IDZhMTc5NmYuLmUzZDlmZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaApAQCAtNzIsNyArNzIsNiBAQAogICovCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZShBTWVkaWFFeHRyYWN0b3IqLAogICAgICAgICBjb25zdCBjaGFyICpsb2NhdGlvbikgX19JTlRST0RVQ0VEX0lOKDIxKTsKLSAgICAgICAgLy8gVE9ETyBzdXBwb3J0IGhlYWRlcnMKIAogI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOAogCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdC5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXQuaAppbmRleCA1Zjc4MDRkLi4yNTUxMjI4IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdC5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0LmgKQEAgLTgzLDEzICs4Myw5IEBACiAvKioKICAqIFRoZSBwcm92aWRlZCBkYXRhIGlzIGNvcGllZCBpbnRvIHRoZSBmb3JtYXQuCiAgKi8KLXZvaWQgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyKiBuYW1lLCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgX19JTlRST0RVQ0VEX0lOKDIxKTsKK3ZvaWQgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogCi0KLS8qKgotICogWFhYIHNob3VsZCB0aGVzZSBiZSBpbnRzL2VudW1zIHRoYXQgd2UgbG9vayB1cCBpbiBhIHRhYmxlIGFzIG5lZWRlZD8KLSAqLwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX0RSQ19BVFRFTlVBVElPTl9GQUNUT1IgX19JTlRST0RVQ0VEX0lOKDI4KTsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19EUkNfQk9PU1RfRkFDVE9SIF9fSU5UUk9EVUNFRF9JTigyOCk7CiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfRFJDX0hFQVZZX0NPTVBSRVNTSU9OIF9fSU5UUk9EVUNFRF9JTigyOCk7CkBAIC0xNTYsNyArMTUyLDYgQEAKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lEIF9fSU5UUk9EVUNFRF9JTigyOCk7CiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9UUkFDS19JTkRFWCBfX0lOVFJPRFVDRURfSU4oMjgpOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfV0lEVEggX19JTlRST0RVQ0VEX0lOKDIxKTsKLQogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyMSAqLwogCiAjaWYgX19BTkRST0lEX0FQSV9fID49IDI4CkBAIC0xNzAsNiArMTY1LDcyIEBACiAgICAgICAgIGludDMyX3QgbGVmdCwgaW50MzJfdCB0b3AsIGludDMyX3QgcmlnaHQsIGludDMyX3QgYm90dG9tKSBfX0lOVFJPRFVDRURfSU4oMjgpOwogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOCAqLwogCisjaWYgX19BTkRST0lEX0FQSV9fID49IDI5CisvKioKKyAqIHJlbW92ZSBhbGwga2V5L3ZhbHVlIHBhaXJzIGZyb20gdGhlIGdpdmVuIEFNZWRpYUZvcm1hdAorICovCit2b2lkIEFNZWRpYUZvcm1hdF9jbGVhcihBTWVkaWFGb3JtYXQqKSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisvKioKKyAqIGNvcHkgb25lIEFNZWRpYUZvcm1hdCB0byBhbm90aGVyCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYUZvcm1hdF9jb3B5KEFNZWRpYUZvcm1hdCAqdG8sIEFNZWRpYUZvcm1hdCAqZnJvbSkgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUxCVU0gX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVElTVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVJUSVNUIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BVURJT19QUkVTRU5UQVRJT05fSU5GTyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX1BSRVNFTlRBVElPTl9JRCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX1BST0dSQU1fSUQgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVVEhPUiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQklUU19QRVJfU0FNUExFIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DRFRSQUNLTlVNQkVSIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT01QSUxBVElPTiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09NUE9TRVIgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19ERUZBVUxUX0lWX1NJWkUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfQllURV9CTE9DSyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9TSVpFUyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0lWIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fS0VZIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fTU9ERSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1BMQUlOX1NJWkVTIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fU0tJUF9CWVRFX0JMT0NLIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRDI2MyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfREFURSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRElTQ05VTUJFUiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9ERUxBWSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9QQURESU5HIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FU0RTIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FWElGX09GRlNFVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9TSVpFIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9GUkFNRV9DT1VOVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfR0VOUkUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lDQ19QUk9GSUxFIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MT0NBVElPTiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTE9PUCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTFlSSUNJU1QgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9CSVRfUkFURSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTVBFRzJfU1RSRUFNX0hFQURFUiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUENNX0JJR19FTkRJQU4gX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BTU0ggX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NBUl9IRUlHSFQgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NBUl9XSURUSCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0NPVU5UIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9URVhUX0ZPUk1BVF9EQVRBIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfSEVJR0hUIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfVElNRSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1dJRFRIIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USVRMRSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVkFMSURfU0FNUExFUyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfWUVBUiBfX0lOVFJPRFVDRURfSU4oMjkpOworCisjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI5ICovCisKIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvLyBfTkRLX01FRElBX0ZPUk1BVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvbGlibWVkaWFuZGsubWFwLnR4dCBiL21lZGlhL25kay9saWJtZWRpYW5kay5tYXAudHh0CmluZGV4IDE3M2U3YjQuLmM1MDA4NGUgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9saWJtZWRpYW5kay5tYXAudHh0CisrKyBiL21lZGlhL25kay9saWJtZWRpYW5kay5tYXAudHh0CkBAIC00LDYgKzQsNyBAQAogICAgIEFJbWFnZVJlYWRlcl9hY3F1aXJlTGF0ZXN0SW1hZ2VBc3luYzsgIyBpbnRyb2R1Y2VkPTI2CiAgICAgQUltYWdlUmVhZGVyX2FjcXVpcmVOZXh0SW1hZ2U7ICMgaW50cm9kdWNlZD0yNAogICAgIEFJbWFnZVJlYWRlcl9hY3F1aXJlTmV4dEltYWdlQXN5bmM7ICMgaW50cm9kdWNlZD0yNgorICAgIEFJbWFnZVJlYWRlcl9nZXRXaW5kb3dOYXRpdmVIYW5kbGU7ICN2bmRrCiAgICAgQUltYWdlUmVhZGVyX2RlbGV0ZTsgIyBpbnRyb2R1Y2VkPTI0CiAgICAgQUltYWdlUmVhZGVyX2dldEZvcm1hdDsgIyBpbnRyb2R1Y2VkPTI0CiAgICAgQUltYWdlUmVhZGVyX2dldEhlaWdodDsgIyBpbnRyb2R1Y2VkPTI0CkBAIC0zNCw2NCArMzUsMTE0IEBACiAgICAgQU1FRElBRk9STUFUX0tFWV9BQUNfTUFYX09VVFBVVF9DSEFOTkVMX0NPVU5UOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9BQUNfUFJPRklMRTsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfQUFDX1NCUl9NT0RFOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9BTEJVTTsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlQ7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUSVNUOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9BUlRJU1Q7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9JTkZPOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9BVURJT19TRVNTSU9OX0lEOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9BVVRIT1I7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0JJVFJBVEVfTU9ERTsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEU7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRTsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfQ0FQVFVSRV9SQVRFOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9DRFRSQUNLTlVNQkVSOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5UOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX01BU0s7ICMgdmFyIGludHJvZHVjZWQ9MjEKICAgICBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX0ZPUk1BVDsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfUkFOR0U7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1NUQU5EQVJEOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9UUkFOU0ZFUjsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ09NUElMQVRJT047ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0NPTVBMRVhJVFk7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NPTVBPU0VSOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fREVGQVVMVF9JVl9TSVpFOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX0JZVEVfQkxPQ0s7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfU0laRVM7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19JVjsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWTsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX01PREU7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19QTEFJTl9TSVpFUzsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1NLSVBfQllURV9CTE9DSzsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzE7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8yOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQzsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfRDI2MzsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfREFURTsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfRElTQ05VTUJFUjsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9DUk9QOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX0hFSUdIVDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9XSURUSDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT047ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfREVMQVk7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfUEFERElORzsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfRVNEUzsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9PRkZTRVQ7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0VYSUZfU0laRTsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfQ09VTlQ7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0ZMQUNfQ09NUFJFU1NJT05fTEVWRUw7ICMgdmFyIGludHJvZHVjZWQ9MjEKICAgICBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX1JBVEU7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX0dFTlJFOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9HUklEX0NPTFVNTlM7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0dSSURfUk9XUzsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfSERSX1NUQVRJQ19JTkZPOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQ7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX0lDQ19QUk9GSUxFOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9JTlRSQV9SRUZSRVNIX1BFUklPRDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfSVNfQURUUzsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfSVNfQVVUT1NFTEVDVDsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfSVNfREVGQVVMVDsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfSVNfRk9SQ0VEX1NVQlRJVExFOyAjIHZhciBpbnRyb2R1Y2VkPTIxCisgICAgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9JX0ZSQU1FX0lOVEVSVkFMOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9MQU5HVUFHRTsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfTEFURU5DWTsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfTEVWRUw7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX0xPQ0FUSU9OOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9MT09QOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9MWVJJQ0lTVDsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0JJVF9SQVRFOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfSEVJR0hUOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRTsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX1dJRFRIOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9NUEVHX1VTRVJfREFUQTsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfTVBFRzJfU1RSRUFNX0hFQURFUjsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfT1BFUkFUSU5HX1JBVEU7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX1BDTV9CSUdfRU5ESUFOOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9QQ01fRU5DT0RJTkc7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX1BSSU9SSVRZOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9QUk9GSUxFOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9QU1NIOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9QVVNIX0JMQU5LX0JVRkZFUlNfT05fU1RPUDsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfUkVQRUFUX1BSRVZJT1VTX0ZSQU1FX0FGVEVSOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9ST1RBVElPTjsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEU7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX1NBUl9IRUlHSFQ7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1NBUl9XSURUSDsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfU0VJOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9TTElDRV9IRUlHSFQ7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX1NUUklERTsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUU7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0NPVU5UOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9JRDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJJTkc7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RFWFRfRk9STUFUX0RBVEE7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9IRUlHSFQ7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9USU1FOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfV0lEVEg7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RJVExFOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9USUxFX0hFSUdIVDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfVElMRV9XSURUSDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUzsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSU5ERVg7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lEOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9WQUxJRF9TQU1QTEVTOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9XSURUSDsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfWUVBUjsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNZWRpYUNvZGVjQWN0aW9uQ29kZV9pc1JlY292ZXJhYmxlOyAjIGludHJvZHVjZWQ9MjgKICAgICBBTWVkaWFDb2RlY0FjdGlvbkNvZGVfaXNUcmFuc2llbnQ7ICMgaW50cm9kdWNlZD0yOAogICAgIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19kZWxldGU7CkBAIC0xNDIsNiArMTkzLDkgQEAKICAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldFNpemU7ICAjIGludHJvZHVjZWQ9MjgKICAgICBBTWVkaWFEYXRhU291cmNlX3NldFJlYWRBdDsgICAjIGludHJvZHVjZWQ9MjgKICAgICBBTWVkaWFEYXRhU291cmNlX3NldFVzZXJkYXRhOyAjIGludHJvZHVjZWQ9MjgKKyAgICBBTWVkaWFEYXRhU291cmNlX25ld1VyaTsgICAgICAjIGludHJvZHVjZWQ9MjkKKyAgICBBTWVkaWFEYXRhU291cmNlX2Nsb3NlOyAgICAgICAjIGludHJvZHVjZWQ9MjkKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldEF2YWlsYWJsZVNpemU7ICMgaW50cm9kdWNlZD0yOQogICAgIEFNZWRpYURybV9jbG9zZVNlc3Npb247CiAgICAgQU1lZGlhRHJtX2NyZWF0ZUJ5VVVJRDsKICAgICBBTWVkaWFEcm1fZGVjcnlwdDsKQEAgLTE2Myw2ICsyMTcsOCBAQAogICAgIEFNZWRpYURybV9zZXRPbkV2ZW50TGlzdGVuZXI7CiAgICAgQU1lZGlhRHJtX3NldFByb3BlcnR5Qnl0ZUFycmF5OwogICAgIEFNZWRpYURybV9zZXRQcm9wZXJ0eVN0cmluZzsKKyAgICBBTWVkaWFEcm1fc2V0T25FeHBpcmF0aW9uVXBkYXRlTGlzdGVuZXI7ICMgaW50cm9kdWNlZD0yOQorICAgIEFNZWRpYURybV9zZXRPbktleXNDaGFuZ2VMaXN0ZW5lcjsgIyBpbnRyb2R1Y2VkPTI5CiAgICAgQU1lZGlhRHJtX3NpZ247CiAgICAgQU1lZGlhRHJtX3ZlcmlmeTsKICAgICBBTWVkaWFFeHRyYWN0b3JfYWR2YW5jZTsKQEAgLTE4Niw2ICsyNDIsOCBAQAogICAgIEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlQ3VzdG9tOyAjIGludHJvZHVjZWQ9MjgKICAgICBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUZkOwogICAgIEFNZWRpYUV4dHJhY3Rvcl91bnNlbGVjdFRyYWNrOworICAgIEFNZWRpYUZvcm1hdF9jbGVhcjsgIyBpbnRyb2R1Y2VkPTI5CisgICAgQU1lZGlhRm9ybWF0X2NvcHk7ICMgaW50cm9kdWNlZD0yOQogICAgIEFNZWRpYUZvcm1hdF9kZWxldGU7CiAgICAgQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcjsKICAgICBBTWVkaWFGb3JtYXRfZ2V0RG91YmxlOyAjIGludHJvZHVjZWQ9MjgKZGlmZiAtLWdpdCBhL21lZGlhL25kay90ZXN0cy9BSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0LmNwcCBiL21lZGlhL25kay90ZXN0cy9BSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjBmZjY3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbmRrL3Rlc3RzL0FJbWFnZVJlYWRlcldpbmRvd0hhbmRsZVRlc3QuY3BwCkBAIC0wLDAgKzEsMTg1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtJbWFnZVJlYWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka0ltYWdlLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5oPgorI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8Z3VpL2J1ZmZlcnF1ZXVlLzEuMC9IMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxOZGtJbWFnZVJlYWRlclByaXYuaD4KKyNpbmNsdWRlIDx2bmRrL2hhcmR3YXJlX2J1ZmZlci5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjp1dGlsczo6SDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwordXNpbmcgYWltZzo6QUltYWdlUmVhZGVyX2dldEhHQlBGcm9tSGFuZGxlOworCit0eXBlZGVmIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgUXVldWVCdWZmZXJJbnB1dDsKK3R5cGVkZWYgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgUXVldWVCdWZmZXJPdXRwdXQ7CisKK3N0YXRpYyBjb25zdGV4cHIgdWludDY0X3Qga0ltYWdlQnVmZmVyVXNhZ2UgPQorICAgIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfV1JJVEVfT0ZURU47CitzdGF0aWMgY29uc3RleHByIGludCBrSW1hZ2VXaWR0aCA9IDY0MDsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtJbWFnZUhlaWdodCA9IDQ4MDsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtJbWFnZUZvcm1hdCA9IEFJTUFHRV9GT1JNQVRfUkdCQV84ODg4Oworc3RhdGljIGNvbnN0ZXhwciBpbnQga01heEltYWdlcyA9IDE7CisKK3N0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrUXVldWVCdWZmZXJJbnB1dFRpbWVTdGFtcCA9IDEzODQ4ODg2MTE7CitzdGF0aWMgY29uc3RleHByIGJvb2wga1F1ZXVlQnVmZmVySW5wdXRJc0F1dG9UaW1lU3RhbXAgPSBmYWxzZTsKK3N0YXRpYyBjb25zdGV4cHIgYW5kcm9pZF9kYXRhc3BhY2Uga1F1ZXVlQnVmZmVySW5wdXREYXRhc3BhY2UgPSBIQUxfREFUQVNQQUNFX1VOS05PV047CitzdGF0aWMgY29uc3QgUmVjdCBrUXVldWVCdWZmZXJJbnB1dFJlY3QgPSBSZWN0KGtJbWFnZVdpZHRoLCBrSW1hZ2VIZWlnaHQpOworc3RhdGljIGNvbnN0ZXhwciBpbnQga1F1ZXVlQnVmZmVySW5wdXRTY2FsaW5nTW9kZSA9IDA7CitzdGF0aWMgY29uc3RleHByIGludCBrUXVldWVCdWZmZXJJbnB1dFRyYW5zZm9ybSA9IDA7CitzdGF0aWMgY29uc3Qgc3A8RmVuY2U+IGtRdWV1ZUJ1ZmZlcklucHV0RmVuY2UgPSBGZW5jZTo6Tk9fRkVOQ0U7CisKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtPbkltYWdlQXZhaWxhYmxlV2FpdFVzID0gMTAwICogMTAwMDsKKworY2xhc3MgQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICAgcHVibGljOgorICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIEFJbWFnZVJlYWRlcl9uZXdXaXRoVXNhZ2Uoa0ltYWdlV2lkdGgsIGtJbWFnZUhlaWdodCwga0ltYWdlRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtJbWFnZUJ1ZmZlclVzYWdlICwga01heEltYWdlcywgJmltYWdlUmVhZGVyXyk7CisgICAgICAgIG1lZGlhX3N0YXR1c190IHJldCA9IEFNRURJQV9FUlJPUl9VTktOT1dOOworICAgICAgICBBU1NFUlRfTkUoaW1hZ2VSZWFkZXJfLCBudWxscHRyKTsKKyAgICAgICAgcmV0ID0gQUltYWdlUmVhZGVyX3NldEltYWdlTGlzdGVuZXIoaW1hZ2VSZWFkZXJfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VSZWFkZXJBdmFpbGFibGVDYl8pOworICAgICAgICBBU1NFUlRfRVEocmV0LCBBTUVESUFfT0spOworICAgICAgICByZXQgPSBBSW1hZ2VSZWFkZXJfc2V0QnVmZmVyUmVtb3ZlZExpc3RlbmVyKGltYWdlUmVhZGVyXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VSZWFkZXJEZXRhY2hlZENiXyk7CisgICAgICAgIEFTU0VSVF9FUShyZXQsIEFNRURJQV9PSyk7CisgICAgfQorICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChpbWFnZVJlYWRlcl8pIHsKKyAgICAgICAgICAgIEFJbWFnZVJlYWRlcl9kZWxldGUoaW1hZ2VSZWFkZXJfKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgSGFuZGxlSW1hZ2VBdmFpbGFibGUoKSB7CisgICAgICAgIEFJbWFnZSAqb3V0SW1hZ2UgPSBudWxscHRyOworICAgICAgICBtZWRpYV9zdGF0dXNfdCByZXQgPSBBTUVESUFfT0s7CisgICAgICAgIGF1dG8gaW1hZ2VEZWxldGVyID0gW10oQUltYWdlICppbWcpIHsgQUltYWdlX2RlbGV0ZShpbWcpOyB9OworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QUltYWdlLCBkZWNsdHlwZShpbWFnZURlbGV0ZXIpPiBpbWcobnVsbHB0ciwgaW1hZ2VEZWxldGVyKTsKKworICAgICAgICAvLyBUZXN0IHRoYXQgdGhlIGltYWdlIGNhbiBiZSBhY3F1aXJlZC4KKyAgICAgICAgcmV0ID0gQUltYWdlUmVhZGVyX2FjcXVpcmVOZXh0SW1hZ2UoaW1hZ2VSZWFkZXJfLCAmb3V0SW1hZ2UpOworICAgICAgICBBU1NFUlRfRVEocmV0LCBBTUVESUFfT0spOworICAgICAgICBpbWcucmVzZXQob3V0SW1hZ2UpOworICAgICAgICBBU1NFUlRfTkUoaW1nLCBudWxscHRyKTsKKworICAgICAgICAvLyBUZXN0IHRoYXQgd2UgY2FuIGdldCBhIGhhbmRsZSB0byB0aGUgaW1hZ2UncyBoYXJkd2FyZSBidWZmZXIgYW5kIGEKKyAgICAgICAgLy8gbmF0aXZlIGhhbmRsZSB0byBpdC4KKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyICpoYXJkd2FyZUJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIHJldCA9IEFJbWFnZV9nZXRIYXJkd2FyZUJ1ZmZlcihpbWcuZ2V0KCksICZoYXJkd2FyZUJ1ZmZlcik7CisgICAgICAgIEFTU0VSVF9FUShyZXQsIEFNRURJQV9PSyk7CisgICAgICAgIEFTU0VSVF9ORShoYXJkd2FyZUJ1ZmZlciwgbnVsbHB0cik7CisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmggPSBBSGFyZHdhcmVCdWZmZXJfZ2V0TmF0aXZlSGFuZGxlKGhhcmR3YXJlQnVmZmVyKTsKKyAgICAgICAgQVNTRVJUX05FKG5oLCBudWxscHRyKTsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKGltYWdlQXZhaWxhYmxlTXV0ZXhfKTsKKyAgICAgICAgaW1hZ2VBdmFpbGFibGVfID0gdHJ1ZTsKKyAgICAgICAgaW1hZ2VDb25kVmFyXy5ub3RpZnlfb25lKCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgb25JbWFnZUF2YWlsYWJsZSh2b2lkICpjb250ZXh0LCBBSW1hZ2VSZWFkZXIgKnJlYWRlcikgeworICAgICAgICAodm9pZClyZWFkZXI7CisgICAgICAgIEFJbWFnZVJlYWRlcldpbmRvd0hhbmRsZVRlc3QgKnRoaXNDb250ZXh0ID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdCAqPihjb250ZXh0KTsKKyAgICAgICAgdGhpc0NvbnRleHQtPkhhbmRsZUltYWdlQXZhaWxhYmxlKCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgb25CdWZmZXJSZW1vdmVkKHZvaWQgKiwgQUltYWdlUmVhZGVyICosIEFIYXJkd2FyZUJ1ZmZlciAqKSB7CisgICAgfQorCisgICAgQUltYWdlUmVhZGVyICppbWFnZVJlYWRlcl8gPSBudWxscHRyOworICAgIEFJbWFnZVJlYWRlcl9JbWFnZUxpc3RlbmVyIGltYWdlUmVhZGVyQXZhaWxhYmxlQ2Jfe3RoaXMsIG9uSW1hZ2VBdmFpbGFibGV9OworICAgIEFJbWFnZVJlYWRlcl9CdWZmZXJSZW1vdmVkTGlzdGVuZXIgaW1hZ2VSZWFkZXJEZXRhY2hlZENiX3t0aGlzLCBvbkJ1ZmZlclJlbW92ZWR9OworICAgIHN0ZDo6bXV0ZXggaW1hZ2VBdmFpbGFibGVNdXRleF87CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgaW1hZ2VDb25kVmFyXzsKKyAgICBib29sIGltYWdlQXZhaWxhYmxlXyA9IGZhbHNlOworfTsKKworc3RhdGljIHZvaWQgZmlsbFJHQkE4QnVmZmVyKHVpbnQ4X3QqIGJ1ZiwgaW50IHcsIGludCBoLCBpbnQgc3RyaWRlKSB7CisgICAgY29uc3Qgc2l6ZV90IFBJWEVMX1NJWkUgPSA0OworICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgICAgICBvZmZfdCBvZmZzZXQgPSAoeSAqIHN0cmlkZSArIHgpICogUElYRUxfU0laRTsKKyAgICAgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgNDsgYysrKSB7CisgICAgICAgICAgICAgICAgaW50IHBhcml0eVggPSAoeCAvICgxIDw8IChjKzIpKSkgJiAxOworICAgICAgICAgICAgICAgIGludCBwYXJpdHlZID0gKHkgLyAoMSA8PCAoYysyKSkpICYgMTsKKyAgICAgICAgICAgICAgICBidWZbb2Zmc2V0ICsgY10gPSAocGFyaXR5WCBeIHBhcml0eVkpID8gMjMxIDogMzU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK1RFU1RfRihBSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0LCBDcmVhdGVXaW5kb3dOYXRpdmVIYW5kbGUpIHsKKyAgICAvLyBDaGVjayB0aGF0IHdlIGNhbiBjcmVhdGUgYSBuYXRpdmVfaGFuZGxlX3QgY29ycmVzcG9uZGluZyB0byB0aGUKKyAgICAvLyBBSW1hZ2VSZWFkZXIuCisgICAgbmF0aXZlX2hhbmRsZV90ICpuaCA9IG51bGxwdHI7CisgICAgQUltYWdlUmVhZGVyX2dldFdpbmRvd05hdGl2ZUhhbmRsZShpbWFnZVJlYWRlcl8sICZuaCk7CisgICAgQVNTRVJUX05FKG5oLCBudWxscHRyKTsKKworICAgIC8vIENoZWNrIHRoYXQgdGhlcmUgYXJlIG9ubHkgaW50cyBpbiB0aGUgaGFuZGxlLgorICAgIEFTU0VSVF9FUShuaC0+bnVtRmRzLCAwKTsKKyAgICBBU1NFUlRfTkUobmgtPm51bUludHMsIDApOworCisgICAgLy8gQ2hlY2sgdGhhdCB0aGUgSEdCUCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIGhhbmRsZS4KKyAgICBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBoZ2JwID0gIEFJbWFnZVJlYWRlcl9nZXRIR0JQRnJvbUhhbmRsZShuaCk7CisgICAgQVNTRVJUX05FKGhnYnAsIG51bGxwdHIpOworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGlnYnAgPSBuZXcgSDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyKGhnYnApOworICAgIGludCBkZXF1ZXVlZFNsb3QgPSAtMTsKKyAgICBzcDxGZW5jZT4gZGVxdWV1ZWRGZW5jZTsKKyAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCBvdXRwdXQ7CisgICAgQVNTRVJUX0VRKE9LLCBpZ2JwLT5jb25uZWN0KG51bGxwdHIsIE5BVElWRV9XSU5ET1dfQVBJX0NQVSwgZmFsc2UsICZvdXRwdXQpKTsKKworICAgIC8vIFRlc3QgdGhhdCB3ZSBjYW4gZGVxdWV1ZSBhIGJ1ZmZlci4KKyAgICBBU1NFUlRfRVEoT0ssCisgICAgICAgICAgICAgIH5JR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpCVUZGRVJfTkVFRFNfUkVBTExPQ0FUSU9OICYKKyAgICAgICAgICAgICAgICAgICAgICAoaWdicC0+ZGVxdWV1ZUJ1ZmZlcigmZGVxdWV1ZWRTbG90LCAmZGVxdWV1ZWRGZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSW1hZ2VXaWR0aCwga0ltYWdlSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtJbWFnZUZvcm1hdCwga0ltYWdlQnVmZmVyVXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgbnVsbHB0cikpKTsKKyAgICBFWFBFQ1RfTEUoMCwgZGVxdWV1ZWRTbG90KTsKKyAgICBFWFBFQ1RfR1QoQnVmZmVyUXVldWU6Ok5VTV9CVUZGRVJfU0xPVFMsIGRlcXVldWVkU2xvdCk7CisKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBkZXF1ZXVlZEJ1ZmZlcjsKKyAgICBpZ2JwLT5yZXF1ZXN0QnVmZmVyKGRlcXVldWVkU2xvdCwgJmRlcXVldWVkQnVmZmVyKTsKKyAgICB1aW50OF90KiBpbWcgPSBudWxscHRyOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgZGVxdWV1ZWRCdWZmZXItPmxvY2soa0ltYWdlQnVmZmVyVXNhZ2UsICh2b2lkKiopKCZpbWcpKSk7CisKKyAgICAvLyBXcml0ZSBpbiBzb21lIGR1bW15IGltYWdlIGRhdGEuCisgICAgZmlsbFJHQkE4QnVmZmVyKGltZywgZGVxdWV1ZWRCdWZmZXItPmdldFdpZHRoKCksIGRlcXVldWVkQnVmZmVyLT5nZXRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgZGVxdWV1ZWRCdWZmZXItPmdldFN0cmlkZSgpKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIGRlcXVldWVkQnVmZmVyLT51bmxvY2soKSk7CisgICAgUXVldWVCdWZmZXJJbnB1dCBxdWV1ZUJ1ZmZlcklucHV0KGtRdWV1ZUJ1ZmZlcklucHV0VGltZVN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUXVldWVCdWZmZXJJbnB1dElzQXV0b1RpbWVTdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1F1ZXVlQnVmZmVySW5wdXREYXRhc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtRdWV1ZUJ1ZmZlcklucHV0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1F1ZXVlQnVmZmVySW5wdXRTY2FsaW5nTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1F1ZXVlQnVmZmVySW5wdXRUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtRdWV1ZUJ1ZmZlcklucHV0RmVuY2UpOworICAgIFF1ZXVlQnVmZmVyT3V0cHV0IHF1ZXVlQnVmZmVyT3V0cHV0OworICAgIEFTU0VSVF9FUShPSywgaWdicC0+cXVldWVCdWZmZXIoZGVxdWV1ZWRTbG90LCBxdWV1ZUJ1ZmZlcklucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1ZXVlQnVmZmVyT3V0cHV0KSk7CisgICAgLy8gd2FpdCB1bnRpbCB0aGUgb25JbWFnZUF2YWlsYWJsZSBjYWxsYmFjayBpcyBjYWxsZWQsIG9yIHRpbWVvdXQgY29tcGxldGVzLgorICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhpbWFnZUF2YWlsYWJsZU11dGV4Xyk7CisgICAgaW1hZ2VDb25kVmFyXy53YWl0X2Zvcihsb2NrLCBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzKGtPbkltYWdlQXZhaWxhYmxlV2FpdFVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aGlzXXsgcmV0dXJuIHRoaXMtPmltYWdlQXZhaWxhYmxlXzt9KTsKKyAgICBFWFBFQ1RfVFJVRShpbWFnZUF2YWlsYWJsZV8pIDw8ICAiVGltZWQgb3V0IHdhaXRpbmcgZm9yIGltYWdlIGRhdGEgdG8gYmUgaGFuZGxlZCFcbiI7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5jcHAgYi9tZWRpYS91dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk3YzM0MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL0FJbWFnZVJlYWRlclV0aWxzLmNwcApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGNtYXRoPgorCisjaW5jbHVkZSA8bWVkaWF1dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5oPgorI2luY2x1ZGUgPGhpZGwvSHlicmlkSW50ZXJmYWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaW1nIHsKKwordXNpbmcgaGFyZHdhcmU6OmhpZGxfdmVjOworCitzdGF0aWMgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gY29udmVydE5hdGl2ZUhhbmRsZVRvSEdCUCAoCisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKSB7CisgICAgLy8gUmVhZCB0aGUgc2l6ZSBvZiB0aGUgaGFsVG9rZW4gdmVjPHVpbnQ4X3Q+CisgICAgaGlkbF92ZWM8dWludDhfdD4gaGFsVG9rZW47CisgICAgaGFsVG9rZW4uc2V0VG9FeHRlcm5hbCgKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KGNvbnN0X2Nhc3Q8aW50ICo+KCYoaGFuZGxlLT5kYXRhWzFdKSkpLAorICAgICAgICBoYW5kbGUtPmRhdGFbMF0pOworICAgIHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGhnYnAgPQorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpjYXN0RnJvbShyZXRyaWV2ZUhhbEludGVyZmFjZShoYWxUb2tlbikpOworICAgIHJldHVybiBoZ2JwOworfQorCitzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBBSW1hZ2VSZWFkZXJfZ2V0SEdCUEZyb21IYW5kbGUoCisgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUpIHsKKyAgICBpZiAoaGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGlmIChoYW5kbGUtPm51bUZkcyAhPSAwICB8fAorICAgICAgICBoYW5kbGUtPm51bUludHMgPCBzdGQ6OmNlaWwoc2l6ZW9mKHNpemVfdCkgLyBzaXplb2YoaW50KSkpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBjb252ZXJ0TmF0aXZlSGFuZGxlVG9IR0JQKGhhbmRsZSk7Cit9CisKK30gLy9uYW1lc3BhY2UgYWltZworfSAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9BbmRyb2lkLmJwIGIvbWVkaWEvdXRpbHMvQW5kcm9pZC5icAppbmRleCBkNmRhZTViLi5hMTE2MDJiIDEwMDY0NAotLS0gYS9tZWRpYS91dGlscy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL3V0aWxzL0FuZHJvaWQuYnAKQEAgLTE2LDI1ICsxNiwzOSBAQAogICAgIG5hbWU6ICJsaWJtZWRpYXV0aWxzIiwKIAogICAgIHNyY3M6IFsKKyAgICAgICAgIkFJbWFnZVJlYWRlclV0aWxzLmNwcCIsCiAgICAgICAgICJCYXR0ZXJ5Tm90aWZpZXIuY3BwIiwKICAgICAgICAgIklTY2hlZHVsaW5nUG9saWN5U2VydmljZS5jcHAiLAogICAgICAgICAiTWVtb3J5TGVha1RyYWNrVXRpbC5jcHAiLAogICAgICAgICAiUHJvY2Vzc0luZm8uY3BwIiwKICAgICAgICAgIlNjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmNwcCIsCisgICAgICAgICJTZXJ2aWNlVXRpbGl0aWVzLmNwcCIsCisgICAgICAgICJUaW1lQ2hlY2suY3BwIiwKICAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYm1lbXVucmVhY2hhYmxlIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC50b2tlbkAxLjAtdXRpbHMiLAogICAgIF0sCiAKKyAgICBsb2d0YWdzOiBbIkV2ZW50TG9nVGFncy5sb2d0YWdzIl0sCisKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XYWxsIiwKICAgICAgICAgIi1XZXh0cmEiLAogICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKIAorICAgIHByb2R1Y3RfdmFyaWFibGVzOiB7CisgICAgICAgIHByb2R1Y3RfaXNfaW90OiB7CisgICAgICAgICAgICBjZmxhZ3M6IFsiLURUQVJHRVRfQU5EUk9JRF9USElOR1MiXSwKKyAgICAgICAgfSwKKyAgICB9LAorCiAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL0V2ZW50TG9nVGFncy5sb2d0YWdzIGIvbWVkaWEvdXRpbHMvRXZlbnRMb2dUYWdzLmxvZ3RhZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdmMGVhOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL0V2ZW50TG9nVGFncy5sb2d0YWdzCkBAIC0wLDAgKzEsNDEgQEAKKyMgVGhlIGVudHJpZXMgaW4gdGhpcyBmaWxlIG1hcCBhIHNwYXJzZSBzZXQgb2YgbG9nIHRhZyBudW1iZXJzIHRvIHRhZyBuYW1lcy4KKyMgVGhpcyBpcyBpbnN0YWxsZWQgb24gdGhlIGRldmljZSwgaW4gL3N5c3RlbS9ldGMsIGFuZCBwYXJzZWQgYnkgbG9nY2F0LgorIworIyBUYWcgbnVtYmVycyBhcmUgZGVjaW1hbCBpbnRlZ2VycywgZnJvbSAwIHRvIDJeMzEuICAoTGV0J3MgbGVhdmUgdGhlCisjIG5lZ2F0aXZlIHZhbHVlcyBhbG9uZSBmb3Igbm93LikKKyMKKyMgVGFnIG5hbWVzIGFyZSBvbmUgb3IgbW9yZSBBU0NJSSBsZXR0ZXJzIGFuZCBudW1iZXJzIG9yIHVuZGVyc2NvcmVzLCBpLmUuCisjICJbQS1aXVthLXpdWzAtOV1fIi4gIERvIG5vdCBpbmNsdWRlIHNwYWNlcyBvciBwdW5jdHVhdGlvbiAodGhlIGZvcm1lcgorIyBpbXBhY3RzIGxvZyByZWFkYWJpbGl0eSwgdGhlIGxhdHRlciBtYWtlcyByZWdleCBzZWFyY2hlcyBtb3JlIGFubm95aW5nKS4KKyMKKyMgVGFnIG51bWJlcnMgYW5kIG5hbWVzIGFyZSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4gIEJsYW5rIGxpbmVzIGFuZCBsaW5lcworIyBzdGFydGluZyB3aXRoICcjJyBhcmUgaWdub3JlZC4KKyMKKyMgT3B0aW9uYWxseSwgYWZ0ZXIgdGhlIHRhZyBuYW1lcyBjYW4gYmUgcHV0IGEgZGVzY3JpcHRpb24gZm9yIHRoZSB2YWx1ZShzKQorIyBvZiB0aGUgdGFnLiBEZXNjcmlwdGlvbiBhcmUgaW4gdGhlIGZvcm1hdAorIyAgICAoPG5hbWU+fGRhdGEgdHlwZVt8ZGF0YSB1bml0XSkKKyMgTXVsdGlwbGUgdmFsdWVzIGFyZSBzZXBhcmF0ZWQgYnkgY29tbWFzLgorIworIyBUaGUgZGF0YSB0eXBlIGlzIGEgbnVtYmVyIGZyb20gdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisjIDE6IGludAorIyAyOiBsb25nCisjIDM6IHN0cmluZworIyA0OiBsaXN0CisjCisjIFRoZSBkYXRhIHVuaXQgaXMgYSBudW1iZXIgdGFrZW4gZnJvbSB0aGUgZm9sbG93aW5nIGxpc3Q6CisjIDE6IE51bWJlciBvZiBvYmplY3RzCisjIDI6IE51bWJlciBvZiBieXRlcworIyAzOiBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzCisjIDQ6IE51bWJlciBvZiBhbGxvY2F0aW9ucworIyA1OiBJZAorIyA2OiBQZXJjZW50CisjIERlZmF1bHQgdmFsdWUgZm9yIGRhdGEgb2YgdHlwZSBpbnQvbG9uZyBpcyAyIChieXRlcykuCisjCisjIFNlZSBzeXN0ZW0vY29yZS9sb2djYXQvZXZlbnQubG9ndGFncyBmb3IgdGhlIG1hc3RlciBjb3B5IG9mIHRoZSB0YWdzLgorCisjIDYxMDAwIC0gNjExOTkgcmVzZXJ2ZWQgZm9yIGF1ZGlvc2VydmVyCisKKzYxMDAwIGF1ZGlvc2VydmVyX2JpbmRlcl90aW1lb3V0IChjb21tYW5kfDMpCisKKyMgTk9URSAtIHRoZSByYW5nZSAxMDAwMDAwLTIwMDAwMDAgaXMgcmVzZXJ2ZWQgZm9yIHBhcnRuZXJzIGFuZCBvdGhlcnMgd2hvCisjIHdhbnQgdG8gZGVmaW5lIHRoZWlyIG93biBsb2cgdGFncyB3aXRob3V0IGNvbmZsaWN0aW5nIHdpdGggdGhlIGNvcmUgcGxhdGZvcm0uCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmNwcCBiL21lZGlhL3V0aWxzL1NlcnZpY2VVdGlsaXRpZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNTRhZWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmNwcApAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiU2VydmljZVV0aWxpdGllcyIKKworI2luY2x1ZGUgPGJpbmRlci9BcHBPcHNNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGJpbmRlci9QZXJtaXNzaW9uQ2FjaGUuaD4KKyNpbmNsdWRlICJtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaCIKKworLyogV2hlbiBwZXJmb3JtaW5nIHBlcm1pc3Npb24gY2hlY2tzIHdlIGRvIG5vdCB1c2UgcGVybWlzc2lvbiBjYWNoZSBmb3IKKyAqIHJ1bnRpbWUgcGVybWlzc2lvbnMgKHByb3RlY3Rpb24gbGV2ZWwgZGFuZ2Vyb3VzKSBhcyB0aGV5IG1heSBjaGFuZ2UgYXQKKyAqIHJ1bnRpbWUuIEFsbCBvdGhlciBwZXJtaXNzaW9ucyAocHJvdGVjdGlvbiBsZXZlbCBub3JtYWwgYW5kIGRhbmdlcm91cykKKyAqIGNhbiBiZSBjYWNoZWQgYXMgdGhleSBuZXZlciBjaGFuZ2UuIE9mIGNvdXJzZSBhbGwgcGVybWlzc2lvbiBjaGVja2VkCisgKiBoZXJlIGFyZSBwbGF0Zm9ybSBkZWZpbmVkLgorICovCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IFN0cmluZzE2IHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKCJhbmRyb2lkLnBlcm1pc3Npb24uUkVDT1JEX0FVRElPIik7CisKK3N0YXRpYyBTdHJpbmcxNiByZXNvbHZlQ2FsbGluZ1BhY2thZ2UoUGVybWlzc2lvbkNvbnRyb2xsZXImIHBlcm1pc3Npb25Db250cm9sbGVyLAorICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgdWlkX3QgdWlkKSB7CisgICAgaWYgKG9wUGFja2FnZU5hbWUuc2l6ZSgpID4gMCkgeworICAgICAgICByZXR1cm4gb3BQYWNrYWdlTmFtZTsKKyAgICB9CisgICAgLy8gSW4gc29tZSBjYXNlcyB0aGUgY2FsbGluZyBjb2RlIGhhcyBubyBhY2Nlc3MgdG8gdGhlIHBhY2thZ2UgaXQgcnVucyB1bmRlci4KKyAgICAvLyBGb3IgZXhhbXBsZSwgY29kZSB1c2luZyB0aGUgd2lsaGVsbSBmcmFtZXdvcmsncyBPcGVuU0wtRVMgQVBJcy4gSW4gdGhpcworICAgIC8vIGNhc2Ugd2Ugd2lsbCBnZXQgdGhlIHBhY2thZ2VzIGZvciB0aGUgY2FsbGluZyBVSUQgYW5kIHBpY2sgdGhlIGZpcnN0IG9uZQorICAgIC8vIGZvciBhdHRyaWJ1dGluZyB0aGUgYXBwIG9wLiBUaGlzIHdpbGwgd29yayBjb3JyZWN0bHkgZm9yIHJ1bnRpbWUgcGVybWlzc2lvbnMKKyAgICAvLyBhcyBmb3IgbGVnYWN5IGFwcHMgd2Ugd2lsbCB0b2dnbGUgdGhlIGFwcCBvcCBmb3IgYWxsIHBhY2thZ2VzIGluIHRoZSBVSUQuCisgICAgLy8gVGhlIGNhdmVhdCBpcyB0aGF0IHRoZSBvcGVyYXRpb24gbWF5IGJlIGF0dHJpYnV0ZWQgdG8gdGhlIHdyb25nIHBhY2thZ2UgYW5kCisgICAgLy8gc3RhdHMgYmFzZWQgb24gYXBwIG9wcyBtYXkgYmUgc2xpZ2h0bHkgb2ZmLgorICAgIFZlY3RvcjxTdHJpbmcxNj4gcGFja2FnZXM7CisgICAgcGVybWlzc2lvbkNvbnRyb2xsZXIuZ2V0UGFja2FnZXNGb3JVaWQodWlkLCBwYWNrYWdlcyk7CisgICAgaWYgKHBhY2thZ2VzLmlzRW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiTm8gcGFja2FnZXMgZm9yIHVpZCAlZCIsIHVpZCk7CisgICAgICAgIHJldHVybiBvcFBhY2thZ2VOYW1lOyAvLyBlbXB0eSBzdHJpbmcKKyAgICB9CisgICAgcmV0dXJuIHBhY2thZ2VzWzBdOworfQorCitzdGF0aWMgYm9vbCBjaGVja1JlY29yZGluZ0ludGVybmFsKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsCisgICAgICAgIHVpZF90IHVpZCwgYm9vbCBzdGFydCkgeworICAgIC8vIE9rYXkgdG8gbm90IHRyYWNrIGluIGFwcCBvcHMgYXMgYXVkaW8gc2VydmVyIGlzIHVzIGFuZCBpZgorICAgIC8vIGRldmljZSBpcyByb290ZWQgc2VjdXJpdHkgbW9kZWwgaXMgY29uc2lkZXJlZCBjb21wcm9taXNlZC4KKyAgICBpZiAoaXNBdWRpb1NlcnZlck9yUm9vdFVpZCh1aWQpKSByZXR1cm4gdHJ1ZTsKKworICAgIC8vIFdlIHNwZWNpZnkgYSBwaWQgYW5kIHVpZCBoZXJlIGFzIG1lZGlhc2VydmVyIChha2EgTWVkaWFSZWNvcmRlciBvciBTdGFnZUZyaWdodFJlY29yZGVyKQorICAgIC8vIG1heSBvcGVuIGEgcmVjb3JkIHRyYWNrIG9uIGJlaGFsZiBvZiBhIGNsaWVudC4gIE5vdGUgdGhhdCBwaWQgbWF5IGJlIGEgdGlkLgorICAgIC8vIElNUE9SVEFOVDogRE9OJ1QgVVNFIFBlcm1pc3Npb25DYWNoZSAtIFJVTlRJTUUgUEVSTUlTU0lPTlMgQ0hBTkdFLgorICAgIFBlcm1pc3Npb25Db250cm9sbGVyIHBlcm1pc3Npb25Db250cm9sbGVyOworICAgIGNvbnN0IGJvb2wgb2sgPSBwZXJtaXNzaW9uQ29udHJvbGxlci5jaGVja1Blcm1pc3Npb24oc0FuZHJvaWRQZXJtaXNzaW9uUmVjb3JkQXVkaW8sIHBpZCwgdWlkKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzICVzIiwgU3RyaW5nOChzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbykuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBTdHJpbmcxNiByZXNvbHZlZE9wUGFja2FnZU5hbWUgPSByZXNvbHZlQ2FsbGluZ1BhY2thZ2UoCisgICAgICAgICAgICBwZXJtaXNzaW9uQ29udHJvbGxlciwgb3BQYWNrYWdlTmFtZSwgdWlkKTsKKyAgICBpZiAocmVzb2x2ZWRPcFBhY2thZ2VOYW1lLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBcHBPcHNNYW5hZ2VyIGFwcE9wczsKKyAgICBjb25zdCBpbnQzMl90IG9wID0gYXBwT3BzLnBlcm1pc3Npb25Ub09wQ29kZShzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbyk7CisgICAgaWYgKHN0YXJ0KSB7CisgICAgICAgIGlmIChhcHBPcHMuc3RhcnRPcE5vVGhyb3cob3AsIHVpZCwgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lLCAvKnN0YXJ0SWZNb2RlRGVmYXVsdCovIGZhbHNlKQorICAgICAgICAgICAgICAgICE9IEFwcE9wc01hbmFnZXI6Ok1PREVfQUxMT1dFRCkgeworICAgICAgICAgICAgQUxPR0UoIlJlcXVlc3QgZGVuaWVkIGJ5IGFwcCBvcDogJWQiLCBvcCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYXBwT3BzLm5vdGVPcChvcCwgdWlkLCByZXNvbHZlZE9wUGFja2FnZU5hbWUpICE9IEFwcE9wc01hbmFnZXI6Ok1PREVfQUxMT1dFRCkgeworICAgICAgICAgICAgQUxPR0UoIlJlcXVlc3QgZGVuaWVkIGJ5IGFwcCBvcDogJWQiLCBvcCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCByZWNvcmRpbmdBbGxvd2VkKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCkgeworICAgIHJldHVybiBjaGVja1JlY29yZGluZ0ludGVybmFsKG9wUGFja2FnZU5hbWUsIHBpZCwgdWlkLCAvKnN0YXJ0Ki8gZmFsc2UpOworfQorCitib29sIHN0YXJ0UmVjb3JkaW5nKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCkgeworICAgICByZXR1cm4gY2hlY2tSZWNvcmRpbmdJbnRlcm5hbChvcFBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgLypzdGFydCovIHRydWUpOworfQorCit2b2lkIGZpbmlzaFJlY29yZGluZyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgdWlkX3QgdWlkKSB7CisgICAgLy8gT2theSB0byBub3QgdHJhY2sgaW4gYXBwIG9wcyBhcyBhdWRpbyBzZXJ2ZXIgaXMgdXMgYW5kIGlmCisgICAgLy8gZGV2aWNlIGlzIHJvb3RlZCBzZWN1cml0eSBtb2RlbCBpcyBjb25zaWRlcmVkIGNvbXByb21pc2VkLgorICAgIGlmIChpc0F1ZGlvU2VydmVyT3JSb290VWlkKHVpZCkpIHJldHVybjsKKworICAgIFBlcm1pc3Npb25Db250cm9sbGVyIHBlcm1pc3Npb25Db250cm9sbGVyOworICAgIFN0cmluZzE2IHJlc29sdmVkT3BQYWNrYWdlTmFtZSA9IHJlc29sdmVDYWxsaW5nUGFja2FnZSgKKyAgICAgICAgICAgIHBlcm1pc3Npb25Db250cm9sbGVyLCBvcFBhY2thZ2VOYW1lLCB1aWQpOworICAgIGlmIChyZXNvbHZlZE9wUGFja2FnZU5hbWUuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFwcE9wc01hbmFnZXIgYXBwT3BzOworICAgIGNvbnN0IGludDMyX3Qgb3AgPSBhcHBPcHMucGVybWlzc2lvblRvT3BDb2RlKHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKTsKKyAgICBhcHBPcHMuZmluaXNoT3Aob3AsIHVpZCwgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lKTsKK30KKworYm9vbCBjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7CisgICAgaWYgKGlzQXVkaW9TZXJ2ZXJPclJvb3RVaWQodWlkKSkgcmV0dXJuIHRydWU7CisgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNDYXB0dXJlQXVkaW9PdXRwdXQoImFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX09VVFBVVCIpOworICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihzQ2FwdHVyZUF1ZGlvT3V0cHV0LCBwaWQsIHVpZCk7CisgICAgaWYgKCFvaykgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fT1VUUFVUIik7CisgICAgcmV0dXJuIG9rOworfQorCitib29sIGNhcHR1cmVIb3R3b3JkQWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCkgeworICAgIC8vIENBUFRVUkVfQVVESU9fSE9UV09SRCBwZXJtaXNzaW9uIGltcGxpZXMgUkVDT1JEX0FVRElPIHBlcm1pc3Npb24KKyAgICBib29sIG9rID0gcmVjb3JkaW5nQWxsb3dlZChTdHJpbmcxNigiIiksIHBpZCwgdWlkKTsKKworICAgIGlmIChvaykgeworICAgICAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0NhcHR1cmVIb3R3b3JkQWxsb3dlZCgiYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fSE9UV09SRCIpOworICAgICAgICAvLyBJTVBPUlRBTlQ6IFVzZSBQZXJtaXNzaW9uQ2FjaGUgLSBub3QgYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBub3QgY2hhbmdlLgorICAgICAgICBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzQ2FwdHVyZUhvdHdvcmRBbGxvd2VkKTsKKyAgICB9CisgICAgaWYgKCFvaykgQUxPR0UoImFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX0hPVFdPUkQiKTsKKyAgICByZXR1cm4gb2s7Cit9CisKK2Jvb2wgc2V0dGluZ3NBbGxvd2VkKCkgeworICAgIC8vIGdpdmVuIHRoaXMgaXMgYSBwZXJtaXNzaW9uIGNoZWNrLCBjb3VsZCB0aGlzIGJlIGlzQXVkaW9TZXJ2ZXJPclJvb3RVaWQoKT8KKyAgICBpZiAoaXNBdWRpb1NlcnZlclVpZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSByZXR1cm4gdHJ1ZTsKKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0F1ZGlvU2V0dGluZ3MoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fU0VUVElOR1MiKTsKKyAgICAvLyBJTVBPUlRBTlQ6IFVzZSBQZXJtaXNzaW9uQ2FjaGUgLSBub3QgYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBub3QgY2hhbmdlLgorICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc0F1ZGlvU2V0dGluZ3MpOworICAgIGlmICghb2spIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fU0VUVElOR1MiKTsKKyAgICByZXR1cm4gb2s7Cit9CisKK2Jvb2wgbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpIHsKKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc01vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fUk9VVElORyIpOworICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCisgICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzTW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCk7CisgICAgaWYgKCFvaykgQUxPR0UoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fUk9VVElORyIpOworICAgIHJldHVybiBvazsKK30KKworYm9vbCBtb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZCgpIHsKKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc01vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKAorICAgICAgICAgICAgImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfREVGQVVMVF9BVURJT19FRkZFQ1RTIik7CisgICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KKyAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNNb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZCk7CisKKyNpZmRlZiBUQVJHRVRfQU5EUk9JRF9USElOR1MKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIC8vIFVzZSBhIHNlY29uZGFyeSBwZXJtaXNzaW9uIG9uIEFuZHJvaWQgVGhpbmdzIHRvIGFsbG93IGEgbW9yZSBsZW5pZW50IGxldmVsIG9mIHByb3RlY3Rpb24uCisgICAgICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzTW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FuZHJvaWRUaGluZ3NBbGxvd2VkKAorICAgICAgICAgICAgICAgICJjb20uZ29vZ2xlLmFuZHJvaWQudGhpbmdzLnBlcm1pc3Npb24uTU9ESUZZX0RFRkFVTFRfQVVESU9fRUZGRUNUUyIpOworICAgICAgICBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbigKKyAgICAgICAgICAgICAgICBzTW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FuZHJvaWRUaGluZ3NBbGxvd2VkKTsKKyAgICB9CisgICAgaWYgKCFvaykgQUxPR0UoImNvbS5nb29nbGUuYW5kcm9pZC50aGluZ3MucGVybWlzc2lvbi5NT0RJRllfREVGQVVMVF9BVURJT19FRkZFQ1RTIik7CisjZWxzZQorICAgIGlmICghb2spIEFMT0dFKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0RFRkFVTFRfQVVESU9fRUZGRUNUUyIpOworI2VuZGlmCisgICAgcmV0dXJuIG9rOworfQorCitib29sIGR1bXBBbGxvd2VkKCkgeworICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzRHVtcCgiYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKTsKKyAgICAvLyBJTVBPUlRBTlQ6IFVzZSBQZXJtaXNzaW9uQ2FjaGUgLSBub3QgYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBub3QgY2hhbmdlLgorICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc0R1bXApOworICAgIC8vIGNvbnZlbnRpb24gaXMgZm9yIGNhbGxlciB0byBkdW1wIGFuIGVycm9yIG1lc3NhZ2UgdG8gZmQgaW5zdGVhZCBvZiBsb2dnaW5nIGhlcmUKKyAgICAvL2lmICghb2spIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5EVU1QIik7CisgICAgcmV0dXJuIG9rOworfQorCitib29sIG1vZGlmeVBob25lU3RhdGVBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7CisgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNNb2RpZnlQaG9uZVN0YXRlKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX1BIT05FX1NUQVRFIik7CisgICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKHNNb2RpZnlQaG9uZVN0YXRlLCBwaWQsIHVpZCk7CisgICAgaWYgKCFvaykgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9QSE9ORV9TVEFURSIpOworICAgIHJldHVybiBvazsKK30KKworc3RhdHVzX3QgY2hlY2tJTWVtb3J5KGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5KQoreworICAgIGlmIChpTWVtb3J5ID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzIGNoZWNrIGZhaWxlZDogTlVMTCBJTWVtb3J5IHBvaW50ZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwID0gaU1lbW9yeS0+Z2V0TWVtb3J5KCk7CisgICAgaWYgKGhlYXAgPT0gMCkgeworICAgICAgICBBTE9HRSgiJXMgY2hlY2sgZmFpbGVkOiBOVUxMIGhlYXAgcG9pbnRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgb2ZmX3Qgc2l6ZSA9IGxzZWVrKGhlYXAtPmdldEhlYXBJRCgpLCAwLCBTRUVLX0VORCk7CisgICAgbHNlZWsoaGVhcC0+Z2V0SGVhcElEKCksIDAsIFNFRUtfU0VUKTsKKworICAgIGlmIChpTWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCB8fCBzaXplIDwgKG9mZl90KWlNZW1vcnktPnNpemUoKSkgeworICAgICAgICBBTE9HRSgiJXMgY2hlY2sgZmFpbGVkOiBwb2ludGVyICVwIHNpemUgJXp1IGZkIHNpemUgJXUiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlNZW1vcnktPnBvaW50ZXIoKSwgaU1lbW9yeS0+c2l6ZSgpLCAodWludDMyX3Qpc2l6ZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9UaW1lQ2hlY2suY3BwIGIvbWVkaWEvdXRpbHMvVGltZUNoZWNrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWNmNGVmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvVGltZUNoZWNrLmNwcApAQCAtMCwwICsxLDkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvVGltZUNoZWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvRXZlbnRMb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKiBzdGF0aWMgKi8KK3NwPFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkPiBUaW1lQ2hlY2s6OmdldFRpbWVDaGVja1RocmVhZCgpCit7CisgICAgc3RhdGljIHNwPFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkPiBzVGltZUNoZWNrVGhyZWFkID0gbmV3IFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkKCk7CisgICAgcmV0dXJuIHNUaW1lQ2hlY2tUaHJlYWQ7Cit9CisKK1RpbWVDaGVjazo6VGltZUNoZWNrKGNvbnN0IGNoYXIgKnRhZywgdWludDMyX3QgdGltZW91dE1zKQorICAgIDogbUVuZFRpbWVOcyhnZXRUaW1lQ2hlY2tUaHJlYWQoKS0+c3RhcnRNb25pdG9yaW5nKHRhZywgdGltZW91dE1zKSkKK3sKK30KKworVGltZUNoZWNrOjp+VGltZUNoZWNrKCkgeworICAgIGdldFRpbWVDaGVja1RocmVhZCgpLT5zdG9wTW9uaXRvcmluZyhtRW5kVGltZU5zKTsKK30KKworVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6On5UaW1lQ2hlY2tUaHJlYWQoKQoreworICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOworICAgIHJlcXVlc3RFeGl0KCk7CisgICAgbU1vbml0b3JSZXF1ZXN0cy5jbGVhcigpOworICAgIG1Db25kLnNpZ25hbCgpOworfQorCituc2Vjc190IFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkOjpzdGFydE1vbml0b3JpbmcoY29uc3QgY2hhciAqdGFnLCB1aW50MzJfdCB0aW1lb3V0TXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobU11dGV4KTsKKyAgICBuc2Vjc190IGVuZFRpbWVOcyA9IHN5c3RlbVRpbWUoKSArIG1pbGxpc2Vjb25kcyh0aW1lb3V0TXMpOworICAgIGZvciAoOyBtTW9uaXRvclJlcXVlc3RzLmluZGV4T2ZLZXkoZW5kVGltZU5zKSA+PSAwOyArK2VuZFRpbWVOcyk7CisgICAgbU1vbml0b3JSZXF1ZXN0cy5hZGQoZW5kVGltZU5zLCB0YWcpOworICAgIG1Db25kLnNpZ25hbCgpOworICAgIHJldHVybiBlbmRUaW1lTnM7Cit9CisKK3ZvaWQgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6OnN0b3BNb25pdG9yaW5nKG5zZWNzX3QgZW5kVGltZU5zKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1NdXRleCk7CisgICAgbU1vbml0b3JSZXF1ZXN0cy5yZW1vdmVJdGVtKGVuZFRpbWVOcyk7CisgICAgbUNvbmQuc2lnbmFsKCk7Cit9CisKK2Jvb2wgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6OnRocmVhZExvb3AoKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IFRJTUVEX09VVDsKKyAgICBjb25zdCBjaGFyICp0YWc7CisgICAgeworICAgICAgICBBdXRvTXV0ZXggX2wobU11dGV4KTsKKworICAgICAgICBpZiAoZXhpdFBlbmRpbmcoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgbnNlY3NfdCBlbmRUaW1lTnMgPSBJTlQ2NF9NQVg7CisgICAgICAgIC8vIEtleWVkVmVjdG9yIG1Nb25pdG9yUmVxdWVzdHMgaXMgb3JkZXJlZCBzbyB0YWtlIGZpcnN0IGVudHJ5IGFzIG5leHQgdGltZW91dAorICAgICAgICBpZiAobU1vbml0b3JSZXF1ZXN0cy5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgZW5kVGltZU5zID0gbU1vbml0b3JSZXF1ZXN0cy5rZXlBdCgwKTsKKyAgICAgICAgICAgIHRhZyA9IG1Nb25pdG9yUmVxdWVzdHMudmFsdWVBdCgwKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IG5zZWNzX3Qgd2FpdFRpbWVOcyA9IGVuZFRpbWVOcyAtIHN5c3RlbVRpbWUoKTsKKyAgICAgICAgaWYgKHdhaXRUaW1lTnMgPiAwKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBtQ29uZC53YWl0UmVsYXRpdmUobU11dGV4LCB3YWl0VGltZU5zKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR19FVkVOVF9TVFJJTkcoTE9HVEFHX0FVRElPX0JJTkRFUl9USU1FT1VULCB0YWcpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJUaW1lQ2hlY2sgdGltZW91dCBmb3IgJXMiLCB0YWcpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5oIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL0FJbWFnZVJlYWRlclV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliZGUxZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFJTUFHRV9SRUFERVJfVVRJTFNfSAorI2RlZmluZSBBSU1BR0VfUkVBREVSX1VUSUxTX0gKKworI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9idWZmZXJxdWV1ZS8xLjAvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWltZyB7CisKK3VzaW5nIEhHcmFwaGljQnVmZmVyUHJvZHVjZXIgPSBoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworCisvLyBSZXRyaWV2ZXMgSEdyYXBoaWNCdWZmZXJQcm9kdWNlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBuYXRpdmVfaGFuZGxlX3QKKy8vIHByb3ZpZGVkICh0aGlzIG5hdGl2ZSBoYW5kbGUgTVVTVCBoYXZlIGJlZW4gb2J0YWluZWQgYnkgQUltYWdlUmVhZGVyX2dldFdpbmRvd05hdGl2ZUhhbmRsZSgpKS4KK3NwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IEFJbWFnZVJlYWRlcl9nZXRIR0JQRnJvbUhhbmRsZShjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSk7CisKK30vLyBuYW1lc3BhY2UgYWltZworfS8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvL0FJTUFHRV9SRUFERVJfVVRJTFNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL0V2ZW50TG9nLmggYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvRXZlbnRMb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTNkM2JkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL0V2ZW50TG9nLmgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIEFORFJPSURfQVVESU9fRVZFTlRfTE9HX0hfCisjZGVmaW5lIEFORFJPSURfQVVESU9fRVZFTlRfTE9HX0hfCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8ga2VlcCB2YWx1ZXMgaW4gc3luYyB3aXRoIGZyYW1ld29ya3MvYXYvbWVkaWEvdXRpbHMvRXZlbnRMb2dUYWdzLmxvZ3RhZ3MKK2VudW0geworICBMT0dUQUdfQVVESU9fQklOREVSX1RJTUVPVVQgPSA2MTAwMCwKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9BVURJT19FVkVOVF9MT0dfSF8KZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmggYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZjU0YzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPGJpbmRlci9QZXJtaXNzaW9uQ29udHJvbGxlci5oPgorI2luY2x1ZGUgPGN1dGlscy9tdWx0aXVzZXIuaD4KKyNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBBdWRpbyBwZXJtaXNzaW9uIHV0aWxpdGllcworCisvLyBVc2VkIGZvciBjYWxscyB0aGF0IHNob3VsZCBvcmlnaW5hdGUgZnJvbSBzeXN0ZW0gc2VydmljZXMuCisvLyBXZSBhbGxvdyB0aGF0IHNvbWUgc2VydmljZXMgbWlnaHQgaGF2ZSBzZXBhcmF0ZSBwcm9jZXNzZXMgdG8KKy8vIGhhbmRsZSBtdWx0aXBsZSB1c2VycywgZS5nLiB1MTBfc3lzdGVtLCB1MTBfYmx1ZXRvb3RoLCB1MTBfcmFkaW8uCitzdGF0aWMgaW5saW5lIGJvb2wgaXNTZXJ2aWNlVWlkKHVpZF90IHVpZCkgeworICAgIHJldHVybiBtdWx0aXVzZXJfZ2V0X2FwcF9pZCh1aWQpIDwgQUlEX0FQUF9TVEFSVDsKK30KKworLy8gVXNlZCBmb3IgY2FsbHMgdGhhdCBzaG91bGQgb3JpZ2luYXRlIGZyb20gYXVkaW9zZXJ2ZXIuCitzdGF0aWMgaW5saW5lIGJvb2wgaXNBdWRpb1NlcnZlclVpZCh1aWRfdCB1aWQpIHsKKyAgICByZXR1cm4gdWlkID09IEFJRF9BVURJT1NFUlZFUjsKK30KKworLy8gVXNlZCBmb3Igc29tZSBwZXJtaXNzaW9uIGNoZWNrcy4KKy8vIEFJRF9ST09UIGlzIE9LIGZvciBjb21tYW5kLWxpbmUgdGVzdHMuICBOYXRpdmUgYXVkaW9zZXJ2ZXIgYWx3YXlzIE9LLgorc3RhdGljIGlubGluZSBib29sIGlzQXVkaW9TZXJ2ZXJPclJvb3RVaWQodWlkX3QgdWlkKSB7CisgICAgcmV0dXJuIHVpZCA9PSBBSURfQVVESU9TRVJWRVIgfHwgdWlkID09IEFJRF9ST09UOworfQorCisvLyBVc2VkIGZvciBjYWxscyB0aGF0IHNob3VsZCBjb21lIGZyb20gc3lzdGVtIHNlcnZlciBvciBpbnRlcm5hbC4KKy8vIE5vdGU6IHN5c3RlbSBzZXJ2ZXIgaXMgbXVsdGlwcm9jZXNzIGZvciBtdWx0aXBsZSB1c2Vycy4gIGF1ZGlvc2VydmVyIGlzIG5vdC4KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0F1ZGlvU2VydmVyT3JTeXN0ZW1TZXJ2ZXJVaWQodWlkX3QgdWlkKSB7CisgICAgcmV0dXJuIG11bHRpdXNlcl9nZXRfYXBwX2lkKHVpZCkgPT0gQUlEX1NZU1RFTSB8fCB1aWQgPT0gQUlEX0FVRElPU0VSVkVSOworfQorCisvLyBNZWRpYXNlcnZlciBtYXkgZm9yd2FyZCB0aGUgY2xpZW50IFBJRCBhbmQgVUlEIGFzIHBhcnQgb2YgYSBiaW5kZXIgaW50ZXJmYWNlIGNhbGw7CisvLyBvdGhlcndpc2UgdGhlIGNhbGxpbmcgVUlEIG11c3QgYmUgZXF1YWwgdG8gdGhlIGNsaWVudCBVSUQuCitzdGF0aWMgaW5saW5lIGJvb2wgaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQodWlkX3QgdWlkKSB7CisgICAgc3dpdGNoICh1aWQpIHsKKyAgICBjYXNlIEFJRF9NRURJQToKKyAgICBjYXNlIEFJRF9BVURJT1NFUlZFUjoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworYm9vbCByZWNvcmRpbmdBbGxvd2VkKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCk7Citib29sIHN0YXJ0UmVjb3JkaW5nKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCk7Cit2b2lkIGZpbmlzaFJlY29yZGluZyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgdWlkX3QgdWlkKTsKK2Jvb2wgY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCk7Citib29sIGNhcHR1cmVIb3R3b3JkQWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCk7Citib29sIHNldHRpbmdzQWxsb3dlZCgpOworYm9vbCBtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCk7Citib29sIG1vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKCk7Citib29sIGR1bXBBbGxvd2VkKCk7Citib29sIG1vZGlmeVBob25lU3RhdGVBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKK3N0YXR1c190IGNoZWNrSU1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1RpbWVDaGVjay5oIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1RpbWVDaGVjay5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1RpbWVDaGVjay5oCnJlbmFtZSB0byBtZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvVGltZUNoZWNrLmgKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9BbmRyb2lkLm1rIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZjlkYzUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0jCi0jIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgVGhpcyBwYWNrYWdlIGlzIGV4Y2x1ZGVkIGZyb20gYnVpbGQgZm9yIG5vdyBzaW5jZSBBUElzIHVzaW5nIHRoaXMgYXBrIGJlY2FtZSBoaWRkZW4uCi0jCi0jTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotI2lmbmVxICgkKFRBUkdFVF9CVUlMRF9QREspLHRydWUpICMgQnVpbGQgTWVkaWFDb21wb25lbnRzIG9ubHkgaWYgdGhpcyBpcyBub3QgYSBQREsgYnVpbGQuICBNZWRpYUNvbXBvbmVudHMgd29uJ3QKLSMjIGJ1aWxkIGluIFBESyBidWlsZHMgYmVjYXVzZSBmcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhIGlzIG5vdCBhdmFpbGFibGUgYnV0Ci0jIyBJTWVkaWFTZXNzaW9uMi5haWRsIGFuZCBJTWVkaWFDb250cm9sbGVyMi5haWRsIGFyZSB1c2luZyBjbGFzc2VzIGZyb20KLSMjIGZyYW1ld29ya3MvYmFzZS9jb3JlL2phdmEuCi0jCi0jaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0jCi0jTE9DQUxfUEFDS0FHRV9OQU1FIDo9IE1lZGlhQ29tcG9uZW50cwotI0xPQ0FMX01PRFVMRV9PV05FUiA6PSBnb29nbGUKLSMKLSMjIFRPRE86IGNyZWF0ZSBhIHNlcGFyYXRlIGtleSBmb3IgdGhpcyBwYWNrYWdlLgotI0xPQ0FMX0NFUlRJRklDQVRFIDo9IHBsYXRmb3JtCi0jCi0jIyBUT0RPOiBVc2UgU3lzdGVtIFNESyBvbmNlIHB1YmxpYyBBUElzIGFyZSBhcHByb3ZlZAotIyMgTE9DQUxfU0RLX1ZFUlNJT04gOj0gc3lzdGVtX2N1cnJlbnQKLSNMT0NBTF9QUklWQVRFX1BMQVRGT1JNX0FQSVMgOj0gdHJ1ZQotIwotI0xPQ0FMX1NSQ19GSUxFUyA6PSBcCi0jICAgICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSBcCi0jICAgICQoY2FsbCBhbGwtSWFpZGwtZmlsZXMtdW5kZXIsIHNyYykKLSMKLSNMT0NBTF9QUk9HVUFSRF9GTEFHX0ZJTEVTIDo9IHByb2d1YXJkLmNmZwotIwotI0xPQ0FMX01VTFRJTElCIDo9IGZpcnN0Ci0jCi0jTE9DQUxfSkFWQV9MSUJSQVJJRVMgKz0gYW5kcm9pZC1zdXBwb3J0LWFubm90YXRpb25zCi0jCi0jIyBUbyBlbWJlZCBuYXRpdmUgbGlicmFyaWVzIGluIHBhY2thZ2UsIHVuY29tbWVudCB0aGUgbGluZXMgYmVsb3cuCi0jI0xPQ0FMX01PRFVMRV9UQUdTIDo9IHNhbXBsZXMKLSMjTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotIyMgICAgbGliYWFjZXh0cmFjdG9yIFwKLSMjICAgIGxpYmFtcmV4dHJhY3RvciBcCi0jIyAgICBsaWJmbGFjZXh0cmFjdG9yIFwKLSMjICAgIGxpYm1pZGlleHRyYWN0b3IgXAotIyMgICAgbGlibWt2ZXh0cmFjdG9yIFwKLSMjICAgIGxpYm1wM2V4dHJhY3RvciBcCi0jIyAgICBsaWJtcDRleHRyYWN0b3IgXAotIyMgICAgbGlibXBlZzJleHRyYWN0b3IgXAotIyMgICAgbGlib2dnZXh0cmFjdG9yIFwKLSMjICAgIGxpYndhdmV4dHJhY3RvciBcCi0jCi0jIyBUT0RPOiBSZW1vdmUgZGVwZW5kZW5jeSB3aXRoIG90aGVyIHN1cHBvcnQgbGlicmFyaWVzLgotI0xPQ0FMX1NUQVRJQ19BTkRST0lEX0xJQlJBUklFUyArPSBcCi0jICAgIGFuZHJvaWQtc3VwcG9ydC12NCBcCi0jICAgIGFuZHJvaWQtc3VwcG9ydC12Ny1hcHBjb21wYXQgXAotIyAgICBhbmRyb2lkLXN1cHBvcnQtdjctcGFsZXR0ZQotI0xPQ0FMX1VTRV9BQVBUMiA6PSB0cnVlCi0jCi0jaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCi0jCi0jZW5kaWYgICMgaWZuZXEgKCQoVEFSR0VUX0JVSUxEX1BESyksdHJ1ZSkKLSMKLSNpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9BbmRyb2lkTWFuaWZlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGZkY2ExLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgcGFja2FnZT0iY29tLmFuZHJvaWQubWVkaWEudXBkYXRlIgotICAgIGFuZHJvaWQ6dmVyc2lvbkNvZGU9IjEiCi0gICAgYW5kcm9pZDp2ZXJzaW9uTmFtZT0iMS4wIiA+Ci0KLSAgICA8YXBwbGljYXRpb24KLSAgICAgICAgYW5kcm9pZDpsYWJlbD0iTWVkaWEgQ29tcG9uZW50cyBVcGRhdGUiCi0gICAgICAgIGFuZHJvaWQ6bXVsdGlBcmNoPSJ0cnVlIgotICAgICAgICBhbmRyb2lkOmFsbG93QmFja3VwPSJmYWxzZSIKLSAgICAgICAgYW5kcm9pZDpoYXNDb2RlPSJmYWxzZSIKLSAgICAgICAgYW5kcm9pZDpleHRyYWN0TmF0aXZlTGlicz0iZmFsc2UiPgotICAgIDwvYXBwbGljYXRpb24+Ci0KLTwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9BbmRyb2lkLmJwIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODllYjc3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvQW5kcm9pZC5icApAQCAtMCwwICsxLDQxIEBACitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJtZWRpYV9haWRsIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJqYXZhL2FuZHJvaWQvbWVkaWEvKiovKi5haWRsIiwKKyAgICAgICAgImphdmEvYW5kcm9pZC9zZXJ2aWNlLyoqLyouYWlkbCIsCisgICAgXSwKKyAgICBleGNsdWRlX3NyY3M6IFsKKyAgICAgICAgLy8gRXhjbHVkZSB0aGVzZSBhaWRscyB0byBhdm9pZCBlcnJvcnMgc3VjaCBhcworICAgICAgICAvLyAiUmVmdXNpbmcgdG8gZ2VuZXJhdGUgY29kZSB3aXRoIHVuc3RydWN0dXJlZCBwYXJjZWxhYmxlcy4iCisgICAgICAgICJqYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFEZXNjcmlwdGlvbi5haWRsIiwKKyAgICAgICAgImphdmEvYW5kcm9pZC9tZWRpYS9NZWRpYU1ldGFkYXRhLmFpZGwiLAorICAgICAgICAvLyBUT0RPKGluc3VuKTogY2hlY2sgd2h5IE1lZGlhUGFyY2VsZWRMaXN0U2xpY2UuYWlkbCBzaG91bGQgYmUgYWRkZWQgaGVyZQorICAgICAgICAiamF2YS9hbmRyb2lkL21lZGlhL01lZGlhUGFyY2VsZWRMaXN0U2xpY2UuYWlkbCIsCisgICAgICAgICJqYXZhL2FuZHJvaWQvbWVkaWEvUmF0aW5nLmFpZGwiLAorICAgICAgICAiamF2YS9hbmRyb2lkL21lZGlhL2Jyb3dzZS9NZWRpYUJyb3dzZXIuYWlkbCIsCisgICAgICAgICJqYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9NZWRpYVNlc3Npb24uYWlkbCIsCisgICAgICAgICJqYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9QYXJjZWxhYmxlVm9sdW1lSW5mby5haWRsIiwKKyAgICAgICAgImphdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL1BsYXliYWNrU3RhdGUuYWlkbCIsCisgICAgXSwKK30KKworamF2YV9saWJyYXJ5IHsKKyAgICBuYW1lOiAibWVkaWEiLAorICAgIGluc3RhbGxhYmxlOiB0cnVlLAorICAgIHNka192ZXJzaW9uOiAic3lzdGVtX2N1cnJlbnQiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImphdmEvYW5kcm9pZC9tZWRpYS8qKi8qLmphdmEiLAorICAgICAgICAiamF2YS9hbmRyb2lkL3NlcnZpY2UvKiovKi5qYXZhIiwKKyAgICAgICAgIjptZWRpYV9haWRsIiwKKyAgICAgICAgIjpmcmFtZXdvcmstbWVkaWEtYW5ub3RhdGlvbi1zcmNzIiwKKyAgICBdLAorICAgIGFpZGw6IHsKKyAgICAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImphdmEiXSwKKyAgICAgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICAgICAiZnJhbWV3b3Jrcy9iYXNlL2NvcmUvamF2YSIsCisgICAgICAgICAgICAvLyBmb3IgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAKKyAgICAgICAgICAgIC8vIGZyb20gSU1lZGlhQnJvd3NlclNlcnZpY2VDYWxsYmFjaworICAgICAgICAgICAgImZyYW1ld29ya3MvYmFzZS9ncmFwaGljcy9qYXZhIiwKKyAgICAgICAgICAgIF0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9JUmVtb3RlVm9sdW1lQ29udHJvbGxlci5haWRsIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL0lSZW1vdGVWb2x1bWVDb250cm9sbGVyLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRhNGE0MgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9JUmVtb3RlVm9sdW1lQ29udHJvbGxlci5haWRsCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uSVNlc3Npb25Db250cm9sbGVyOworCisvKioKKyAqIEFJREwgZm9yIHRoZSBNZWRpYVNlc3Npb25TZXJ2aWNlIHRvIHJlcG9ydCBpbnRlcmVzdGluZyBldmVudHMgb24gcmVtb3RlIHBsYXliYWNrCisgKiB0byBhIHZvbHVtZSBjb250cm9sIGRpYWxvZy4gU2VlIGFsc28gSVZvbHVtZUNvbnRyb2xsZXIgZm9yIHRoZSBBdWRpb1NlcnZpY2UgaGFsZi4KKyAqIFRPRE8gYWRkIGluIGJldHRlciBzdXBwb3J0IGZvciBtdWx0aXBsZSByZW1vdGUgc2Vzc2lvbnMuCisgKiBAaGlkZQorICovCitvbmV3YXkgaW50ZXJmYWNlIElSZW1vdGVWb2x1bWVDb250cm9sbGVyIHsKKyAgICB2b2lkIHJlbW90ZVZvbHVtZUNoYW5nZWQoSVNlc3Npb25Db250cm9sbGVyIHNlc3Npb24sIGludCBmbGFncyk7CisgICAgLy8gc2V0cyB0aGUgZGVmYXVsdCBzZXNzaW9uIHRvIHVzZSB3aXRoIHRoZSBzbGlkZXIsIHJlcGxhY2VzIHJlbW90ZVNsaWRlclZpc2liaWxpdHkKKyAgICAvLyBvbiBJVm9sdW1lQ29udHJvbGxlcgorICAgIHZvaWQgdXBkYXRlUmVtb3RlQ29udHJvbGxlcihJU2Vzc2lvbkNvbnRyb2xsZXIgc2Vzc2lvbik7Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvSVNlc3Npb25Ub2tlbnNMaXN0ZW5lci5haWRsIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL0lTZXNzaW9uVG9rZW5zTGlzdGVuZXIuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODNhMTllCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL0lTZXNzaW9uVG9rZW5zTGlzdGVuZXIuYWlkbApAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworLyoqCisgKiBMaXN0ZW5zIGZvciBjaGFuZ2VzIHRvIHRoZSBsaXN0IG9mIHNlc3Npb24gdG9rZW5zLgorICogQGhpZGUKKyAqLworb25ld2F5IGludGVyZmFjZSBJU2Vzc2lvblRva2Vuc0xpc3RlbmVyIHsKKyAgICB2b2lkIG9uU2Vzc2lvblRva2Vuc0NoYW5nZWQoaW4gTGlzdDxCdW5kbGU+IHRva2Vucyk7Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFEZXNjcmlwdGlvbi5haWRsIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhRGVzY3JpcHRpb24uYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjkzNGY3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhRGVzY3JpcHRpb24uYWlkbApAQCAtMCwwICsxLDE4IEBACisvKiBDb3B5cmlnaHQgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitwYXJjZWxhYmxlIE1lZGlhRGVzY3JpcHRpb247CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFEZXNjcmlwdGlvbi5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhRGVzY3JpcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTA3OWU1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhRGVzY3JpcHRpb24uamF2YQpAQCAtMCwwICsxLDM4MyBAQAorcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYnJvd3NlLk1lZGlhQnJvd3NlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CisKKy8qKgorICogQSBzaW1wbGUgc2V0IG9mIG1ldGFkYXRhIGZvciBhIG1lZGlhIGl0ZW0gc3VpdGFibGUgZm9yIGRpc3BsYXkuIFRoaXMgY2FuIGJlCisgKiBjcmVhdGVkIHVzaW5nIHRoZSBCdWlsZGVyIG9yIHJldHJpZXZlZCBmcm9tIGV4aXN0aW5nIG1ldGFkYXRhIHVzaW5nCisgKiB7QGxpbmsgTWVkaWFNZXRhZGF0YSNnZXREZXNjcmlwdGlvbigpfS4KKyAqLworcHVibGljIGNsYXNzIE1lZGlhRGVzY3JpcHRpb24gaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICAvKioKKyAgICAgKiBBIHVuaXF1ZSBwZXJzaXN0ZW50IGlkIGZvciB0aGUgY29udGVudCBvciBudWxsLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1NZWRpYUlkOworICAgIC8qKgorICAgICAqIEEgcHJpbWFyeSB0aXRsZSBzdWl0YWJsZSBmb3IgZGlzcGxheSBvciBudWxsLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQ2hhclNlcXVlbmNlIG1UaXRsZTsKKyAgICAvKioKKyAgICAgKiBBIHN1YnRpdGxlIHN1aXRhYmxlIGZvciBkaXNwbGF5IG9yIG51bGwuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBDaGFyU2VxdWVuY2UgbVN1YnRpdGxlOworICAgIC8qKgorICAgICAqIEEgZGVzY3JpcHRpb24gc3VpdGFibGUgZm9yIGRpc3BsYXkgb3IgbnVsbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIENoYXJTZXF1ZW5jZSBtRGVzY3JpcHRpb247CisgICAgLyoqCisgICAgICogQSBiaXRtYXAgaWNvbiBzdWl0YWJsZSBmb3IgZGlzcGxheSBvciBudWxsLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1JY29uOworICAgIC8qKgorICAgICAqIEEgVXJpIGZvciBhbiBpY29uIHN1aXRhYmxlIGZvciBkaXNwbGF5IG9yIG51bGwuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBVcmkgbUljb25Vcmk7CisgICAgLyoqCisgICAgICogRXh0cmFzIGZvciBvcGFxdWUgdXNlIGJ5IGFwcHMvc3lzdGVtLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1FeHRyYXM7CisgICAgLyoqCisgICAgICogQSBVcmkgdG8gaWRlbnRpZnkgdGhpcyBjb250ZW50LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgVXJpIG1NZWRpYVVyaTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYXMgYSBsb25nIGV4dHJhIGZpZWxkIHRvIGluZGljYXRlIHRoZSBibHVldG9vdGggZm9sZGVyIHR5cGUgb2YgdGhlIG1lZGlhIGl0ZW0gYXMKKyAgICAgKiBzcGVjaWZpZWQgaW4gdGhlIHNlY3Rpb24gNi4xMC4yLjIgb2YgdGhlIEJsdWV0b290aCBBVlJDUCAxLjUuIFRoaXMgaXMgdmFsaWQgb25seSBmb3IKKyAgICAgKiB7QGxpbmsgTWVkaWFCcm93c2VyLk1lZGlhSXRlbX0gd2l0aCB7QGxpbmsgTWVkaWFCcm93c2VyLk1lZGlhSXRlbSNGTEFHX0JST1dTQUJMRX0uIFRoZSB2YWx1ZQorICAgICAqIHNob3VsZCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayAjQlRfRk9MREVSX1RZUEVfTUlYRUR9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNCVF9GT0xERVJfVFlQRV9USVRMRVN9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNCVF9GT0xERVJfVFlQRV9BTEJVTVN9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNCVF9GT0xERVJfVFlQRV9BUlRJU1RTfTwvbGk+CisgICAgICogPGxpPntAbGluayAjQlRfRk9MREVSX1RZUEVfR0VOUkVTfTwvbGk+CisgICAgICogPGxpPntAbGluayAjQlRfRk9MREVSX1RZUEVfUExBWUxJU1RTfTwvbGk+CisgICAgICogPGxpPntAbGluayAjQlRfRk9MREVSX1RZUEVfWUVBUlN9PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHNlZSAjZ2V0RXh0cmFzKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9CVF9GT0xERVJfVFlQRSA9ICJhbmRyb2lkLm1lZGlhLmV4dHJhLkJUX0ZPTERFUl9UWVBFIjsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIGZvbGRlciB0aGF0IGlzIHVua25vd24gb3IgY29udGFpbnMgbWVkaWEgZWxlbWVudHMgb2YgbWl4ZWQgdHlwZXMgYXMgc3BlY2lmaWVkIGluCisgICAgICogdGhlIHNlY3Rpb24gNi4xMC4yLjIgb2YgdGhlIEJsdWV0b290aCBBVlJDUCAxLjUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEJUX0ZPTERFUl9UWVBFX01JWEVEID0gMDsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIGZvbGRlciB0aGF0IGNvbnRhaW5zIG1lZGlhIGVsZW1lbnRzIG9ubHkgYXMgc3BlY2lmaWVkIGluIHRoZSBzZWN0aW9uIDYuMTAuMi4yIG9mCisgICAgICogdGhlIEJsdWV0b290aCBBVlJDUCAxLjUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEJUX0ZPTERFUl9UWVBFX1RJVExFUyA9IDE7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBmb2xkZXIgdGhhdCBjb250YWlucyBmb2xkZXJzIGNhdGVnb3JpemVkIGJ5IGFsYnVtIGFzIHNwZWNpZmllZCBpbiB0aGUgc2VjdGlvbgorICAgICAqIDYuMTAuMi4yIG9mIHRoZSBCbHVldG9vdGggQVZSQ1AgMS41LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBCVF9GT0xERVJfVFlQRV9BTEJVTVMgPSAyOworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgZm9sZGVyIHRoYXQgY29udGFpbnMgZm9sZGVycyBjYXRlZ29yaXplZCBieSBhcnRpc3QgYXMgc3BlY2lmaWVkIGluIHRoZSBzZWN0aW9uCisgICAgICogNi4xMC4yLjIgb2YgdGhlIEJsdWV0b290aCBBVlJDUCAxLjUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEJUX0ZPTERFUl9UWVBFX0FSVElTVFMgPSAzOworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgZm9sZGVyIHRoYXQgY29udGFpbnMgZm9sZGVycyBjYXRlZ29yaXplZCBieSBnZW5yZSBhcyBzcGVjaWZpZWQgaW4gdGhlIHNlY3Rpb24KKyAgICAgKiA2LjEwLjIuMiBvZiB0aGUgQmx1ZXRvb3RoIEFWUkNQIDEuNS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQlRfRk9MREVSX1RZUEVfR0VOUkVTID0gNDsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIGZvbGRlciB0aGF0IGNvbnRhaW5zIGZvbGRlcnMgY2F0ZWdvcml6ZWQgYnkgcGxheWxpc3QgYXMgc3BlY2lmaWVkIGluIHRoZSBzZWN0aW9uCisgICAgICogNi4xMC4yLjIgb2YgdGhlIEJsdWV0b290aCBBVlJDUCAxLjUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEJUX0ZPTERFUl9UWVBFX1BMQVlMSVNUUyA9IDU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBmb2xkZXIgdGhhdCBjb250YWlucyBmb2xkZXJzIGNhdGVnb3JpemVkIGJ5IHllYXIgYXMgc3BlY2lmaWVkIGluIHRoZSBzZWN0aW9uCisgICAgICogNi4xMC4yLjIgb2YgdGhlIEJsdWV0b290aCBBVlJDUCAxLjUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEJUX0ZPTERFUl9UWVBFX1lFQVJTID0gNjsKKworICAgIHByaXZhdGUgTWVkaWFEZXNjcmlwdGlvbihTdHJpbmcgbWVkaWFJZCwgQ2hhclNlcXVlbmNlIHRpdGxlLCBDaGFyU2VxdWVuY2Ugc3VidGl0bGUsCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgZGVzY3JpcHRpb24sIEJpdG1hcCBpY29uLCBVcmkgaWNvblVyaSwgQnVuZGxlIGV4dHJhcywgVXJpIG1lZGlhVXJpKSB7CisgICAgICAgIG1NZWRpYUlkID0gbWVkaWFJZDsKKyAgICAgICAgbVRpdGxlID0gdGl0bGU7CisgICAgICAgIG1TdWJ0aXRsZSA9IHN1YnRpdGxlOworICAgICAgICBtRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKyAgICAgICAgbUljb24gPSBpY29uOworICAgICAgICBtSWNvblVyaSA9IGljb25Vcmk7CisgICAgICAgIG1FeHRyYXMgPSBleHRyYXM7CisgICAgICAgIG1NZWRpYVVyaSA9IG1lZGlhVXJpOworICAgIH0KKworICAgIHByaXZhdGUgTWVkaWFEZXNjcmlwdGlvbihQYXJjZWwgaW4pIHsKKyAgICAgICAgbU1lZGlhSWQgPSBpbi5yZWFkU3RyaW5nKCk7CisgICAgICAgIG1UaXRsZSA9IFRleHRVdGlscy5DSEFSX1NFUVVFTkNFX0NSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbik7CisgICAgICAgIG1TdWJ0aXRsZSA9IFRleHRVdGlscy5DSEFSX1NFUVVFTkNFX0NSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbik7CisgICAgICAgIG1EZXNjcmlwdGlvbiA9IFRleHRVdGlscy5DSEFSX1NFUVVFTkNFX0NSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbik7CisgICAgICAgIG1JY29uID0gaW4ucmVhZFBhcmNlbGFibGUobnVsbCk7CisgICAgICAgIG1JY29uVXJpID0gaW4ucmVhZFBhcmNlbGFibGUobnVsbCk7CisgICAgICAgIG1FeHRyYXMgPSBpbi5yZWFkQnVuZGxlKCk7CisgICAgICAgIG1NZWRpYVVyaSA9IGluLnJlYWRQYXJjZWxhYmxlKG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1lZGlhIGlkIG9yIG51bGwuIFNlZQorICAgICAqIHtAbGluayBNZWRpYU1ldGFkYXRhI01FVEFEQVRBX0tFWV9NRURJQV9JRH0uCisgICAgICovCisgICAgcHVibGljIEBOdWxsYWJsZSBTdHJpbmcgZ2V0TWVkaWFJZCgpIHsKKyAgICAgICAgcmV0dXJuIG1NZWRpYUlkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB0aXRsZSBzdWl0YWJsZSBmb3IgZGlzcGxheSBvciBudWxsLgorICAgICAqCisgICAgICogQHJldHVybiBBIHRpdGxlIG9yIG51bGwuCisgICAgICovCisgICAgcHVibGljIEBOdWxsYWJsZSBDaGFyU2VxdWVuY2UgZ2V0VGl0bGUoKSB7CisgICAgICAgIHJldHVybiBtVGl0bGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHN1YnRpdGxlIHN1aXRhYmxlIGZvciBkaXNwbGF5IG9yIG51bGwuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgc3VidGl0bGUgb3IgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE51bGxhYmxlIENoYXJTZXF1ZW5jZSBnZXRTdWJ0aXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1TdWJ0aXRsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgZGVzY3JpcHRpb24gc3VpdGFibGUgZm9yIGRpc3BsYXkgb3IgbnVsbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQSBkZXNjcmlwdGlvbiBvciBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBATnVsbGFibGUgQ2hhclNlcXVlbmNlIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICByZXR1cm4gbURlc2NyaXB0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBiaXRtYXAgaWNvbiBzdWl0YWJsZSBmb3IgZGlzcGxheSBvciBudWxsLgorICAgICAqCisgICAgICogQHJldHVybiBBbiBpY29uIG9yIG51bGwuCisgICAgICovCisgICAgcHVibGljIEBOdWxsYWJsZSBCaXRtYXAgZ2V0SWNvbkJpdG1hcCgpIHsKKyAgICAgICAgcmV0dXJuIG1JY29uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBVcmkgZm9yIGFuIGljb24gc3VpdGFibGUgZm9yIGRpc3BsYXkgb3IgbnVsbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQW4gaWNvbiB1cmkgb3IgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE51bGxhYmxlIFVyaSBnZXRJY29uVXJpKCkgeworICAgICAgICByZXR1cm4gbUljb25Vcmk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbnkgZXh0cmFzIHRoYXQgd2VyZSBhZGRlZCB0byB0aGUgZGVzY3JpcHRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgYnVuZGxlIG9mIGV4dHJhcyBvciBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBATnVsbGFibGUgQnVuZGxlIGdldEV4dHJhcygpIHsKKyAgICAgICAgcmV0dXJuIG1FeHRyYXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIFVyaSByZXByZXNlbnRpbmcgdGhpcyBjb250ZW50IG9yIG51bGwuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgbWVkaWEgVXJpIG9yIG51bGwuCisgICAgICovCisgICAgcHVibGljIEBOdWxsYWJsZSBVcmkgZ2V0TWVkaWFVcmkoKSB7CisgICAgICAgIHJldHVybiBtTWVkaWFVcmk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtTWVkaWFJZCk7CisgICAgICAgIFRleHRVdGlscy53cml0ZVRvUGFyY2VsKG1UaXRsZSwgZGVzdCwgMCk7CisgICAgICAgIFRleHRVdGlscy53cml0ZVRvUGFyY2VsKG1TdWJ0aXRsZSwgZGVzdCwgMCk7CisgICAgICAgIFRleHRVdGlscy53cml0ZVRvUGFyY2VsKG1EZXNjcmlwdGlvbiwgZGVzdCwgMCk7CisgICAgICAgIGRlc3Qud3JpdGVQYXJjZWxhYmxlKG1JY29uLCBmbGFncyk7CisgICAgICAgIGRlc3Qud3JpdGVQYXJjZWxhYmxlKG1JY29uVXJpLCBmbGFncyk7CisgICAgICAgIGRlc3Qud3JpdGVCdW5kbGUobUV4dHJhcyk7CisgICAgICAgIGRlc3Qud3JpdGVQYXJjZWxhYmxlKG1NZWRpYVVyaSwgZmxhZ3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAobyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgTWVkaWFEZXNjcmlwdGlvbikpeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgTWVkaWFEZXNjcmlwdGlvbiBkID0gKE1lZGlhRGVzY3JpcHRpb24pIG87CisKKyAgICAgICAgaWYgKCFTdHJpbmcudmFsdWVPZihtVGl0bGUpLmVxdWFscyhTdHJpbmcudmFsdWVPZihkLm1UaXRsZSkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIVN0cmluZy52YWx1ZU9mKG1TdWJ0aXRsZSkuZXF1YWxzKFN0cmluZy52YWx1ZU9mKGQubVN1YnRpdGxlKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghU3RyaW5nLnZhbHVlT2YobURlc2NyaXB0aW9uKS5lcXVhbHMoU3RyaW5nLnZhbHVlT2YoZC5tRGVzY3JpcHRpb24pKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIG1UaXRsZSArICIsICIgKyBtU3VidGl0bGUgKyAiLCAiICsgbURlc2NyaXB0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPE1lZGlhRGVzY3JpcHRpb24+IENSRUFUT1IgPQorICAgICAgICAgICAgbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxNZWRpYURlc2NyaXB0aW9uPigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgTWVkaWFEZXNjcmlwdGlvbiBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhRGVzY3JpcHRpb24oaW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBNZWRpYURlc2NyaXB0aW9uW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYURlc2NyaXB0aW9uW3NpemVdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAvKioKKyAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgTWVkaWFEZXNjcmlwdGlvbn0gb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgeworICAgICAgICBwcml2YXRlIFN0cmluZyBtTWVkaWFJZDsKKyAgICAgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVRpdGxlOworICAgICAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtU3VidGl0bGU7CisgICAgICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1EZXNjcmlwdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBCaXRtYXAgbUljb247CisgICAgICAgIHByaXZhdGUgVXJpIG1JY29uVXJpOworICAgICAgICBwcml2YXRlIEJ1bmRsZSBtRXh0cmFzOworICAgICAgICBwcml2YXRlIFVyaSBtTWVkaWFVcmk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYW4gaW5pdGlhbGx5IGVtcHR5IGJ1aWxkZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlcigpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBtZWRpYSBpZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1lZGlhSWQgVGhlIHVuaXF1ZSBpZCBmb3IgdGhlIGl0ZW0gb3IgbnVsbC4KKyAgICAgICAgICogQHJldHVybiB0aGlzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRNZWRpYUlkKEBOdWxsYWJsZSBTdHJpbmcgbWVkaWFJZCkgeworICAgICAgICAgICAgbU1lZGlhSWQgPSBtZWRpYUlkOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgdGl0bGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0aXRsZSBBIHRpdGxlIHN1aXRhYmxlIGZvciBkaXNwbGF5IHRvIHRoZSB1c2VyIG9yIG51bGwuCisgICAgICAgICAqIEByZXR1cm4gdGhpcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0VGl0bGUoQE51bGxhYmxlIENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICAgICAgbVRpdGxlID0gdGl0bGU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBzdWJ0aXRsZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHN1YnRpdGxlIEEgc3VidGl0bGUgc3VpdGFibGUgZm9yIGRpc3BsYXkgdG8gdGhlIHVzZXIgb3IgbnVsbC4KKyAgICAgICAgICogQHJldHVybiB0aGlzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRTdWJ0aXRsZShATnVsbGFibGUgQ2hhclNlcXVlbmNlIHN1YnRpdGxlKSB7CisgICAgICAgICAgICBtU3VidGl0bGUgPSBzdWJ0aXRsZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIGRlc2NyaXB0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gQSBkZXNjcmlwdGlvbiBzdWl0YWJsZSBmb3IgZGlzcGxheSB0byB0aGUgdXNlciBvcgorICAgICAgICAgKiAgICAgICAgICAgIG51bGwuCisgICAgICAgICAqIEByZXR1cm4gdGhpcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RGVzY3JpcHRpb24oQE51bGxhYmxlIENoYXJTZXF1ZW5jZSBkZXNjcmlwdGlvbikgeworICAgICAgICAgICAgbURlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBpY29uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gaWNvbiBBIHtAbGluayBCaXRtYXB9IGljb24gc3VpdGFibGUgZm9yIGRpc3BsYXkgdG8gdGhlIHVzZXIgb3IKKyAgICAgICAgICogICAgICAgICAgICBudWxsLgorICAgICAgICAgKiBAcmV0dXJuIHRoaXMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEljb25CaXRtYXAoQE51bGxhYmxlIEJpdG1hcCBpY29uKSB7CisgICAgICAgICAgICBtSWNvbiA9IGljb247CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBpY29uIHVyaS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGljb25VcmkgQSB7QGxpbmsgVXJpfSBmb3IgYW4gaWNvbiBzdWl0YWJsZSBmb3IgZGlzcGxheSB0byB0aGUKKyAgICAgICAgICogICAgICAgICAgICB1c2VyIG9yIG51bGwuCisgICAgICAgICAqIEByZXR1cm4gdGhpcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0SWNvblVyaShATnVsbGFibGUgVXJpIGljb25VcmkpIHsKKyAgICAgICAgICAgIG1JY29uVXJpID0gaWNvblVyaTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgYSBidW5kbGUgb2YgZXh0cmFzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZXh0cmFzIFRoZSBleHRyYXMgdG8gaW5jbHVkZSB3aXRoIHRoaXMgZGVzY3JpcHRpb24gb3IgbnVsbC4KKyAgICAgICAgICogQHJldHVybiB0aGlzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRFeHRyYXMoQE51bGxhYmxlIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgIG1FeHRyYXMgPSBleHRyYXM7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBtZWRpYSB1cmkuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtZWRpYVVyaSBUaGUgY29udGVudCdzIHtAbGluayBVcml9IGZvciB0aGUgaXRlbSBvciBudWxsLgorICAgICAgICAgKiBAcmV0dXJuIHRoaXMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldE1lZGlhVXJpKEBOdWxsYWJsZSBVcmkgbWVkaWFVcmkpIHsKKyAgICAgICAgICAgIG1NZWRpYVVyaSA9IG1lZGlhVXJpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWVkaWFEZXNjcmlwdGlvbiBidWlsZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFEZXNjcmlwdGlvbihtTWVkaWFJZCwgbVRpdGxlLCBtU3VidGl0bGUsIG1EZXNjcmlwdGlvbiwgbUljb24sIG1JY29uVXJpLAorICAgICAgICAgICAgICAgICAgICBtRXh0cmFzLCBtTWVkaWFVcmkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhTWV0YWRhdGEuYWlkbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYU1ldGFkYXRhLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZlZTQ4MwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYU1ldGFkYXRhLmFpZGwKQEAgLTAsMCArMSwxOCBAQAorLyogQ29weXJpZ2h0IDIwMTQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworcGFyY2VsYWJsZSBNZWRpYU1ldGFkYXRhOwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhTWV0YWRhdGEuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYU1ldGFkYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRmZDIwYgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYU1ldGFkYXRhLmphdmEKQEAgLTAsMCArMSw5NDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlN0cmluZ0RlZjsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uVW5zdXBwb3J0ZWRBcHBVc2FnZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmJyb3dzZS5NZWRpYUJyb3dzZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhQ29udHJvbGxlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkFycmF5TWFwOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworCisvKioKKyAqIENvbnRhaW5zIG1ldGFkYXRhIGFib3V0IGFuIGl0ZW0sIHN1Y2ggYXMgdGhlIHRpdGxlLCBhcnRpc3QsIGV0Yy4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhTWV0YWRhdGEgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhTWV0YWRhdGEiOworCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBAU3RyaW5nRGVmKHByZWZpeCA9IHsgIk1FVEFEQVRBX0tFWV8iIH0sIHZhbHVlID0geworICAgICAgICAgICAgTUVUQURBVEFfS0VZX1RJVExFLAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FSVElTVCwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BTEJVTSwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BVVRIT1IsCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfV1JJVEVSLAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0NPTVBPU0VSLAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0NPTVBJTEFUSU9OLAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0RBVEUsCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfR0VOUkUsCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfQUxCVU1fQVJUSVNULAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FSVF9VUkksCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfQUxCVU1fQVJUX1VSSSwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9ESVNQTEFZX1RJVExFLAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0RJU1BMQVlfU1VCVElUTEUsCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfRElTUExBWV9ERVNDUklQVElPTiwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9ESVNQTEFZX0lDT05fVVJJLAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX01FRElBX0lELAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX01FRElBX1VSSSwKKyAgICB9KQorICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKKyAgICBwdWJsaWMgQGludGVyZmFjZSBUZXh0S2V5IHt9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIEBTdHJpbmdEZWYocHJlZml4ID0geyAiTUVUQURBVEFfS0VZXyIgfSwgdmFsdWUgPSB7CisgICAgICAgICAgICBNRVRBREFUQV9LRVlfRFVSQVRJT04sCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfWUVBUiwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9UUkFDS19OVU1CRVIsCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfTlVNX1RSQUNLUywKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9ESVNDX05VTUJFUiwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9CVF9GT0xERVJfVFlQRSwKKyAgICB9KQorICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKKyAgICBwdWJsaWMgQGludGVyZmFjZSBMb25nS2V5IHt9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIEBTdHJpbmdEZWYocHJlZml4ID0geyAiTUVUQURBVEFfS0VZXyIgfSwgdmFsdWUgPSB7CisgICAgICAgICAgICBNRVRBREFUQV9LRVlfQVJULAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FMQlVNX0FSVCwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9ESVNQTEFZX0lDT04sCisgICAgfSkKKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCisgICAgcHVibGljIEBpbnRlcmZhY2UgQml0bWFwS2V5IHt9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIEBTdHJpbmdEZWYocHJlZml4ID0geyAiTUVUQURBVEFfS0VZXyIgfSwgdmFsdWUgPSB7CisgICAgICAgICAgICBNRVRBREFUQV9LRVlfVVNFUl9SQVRJTkcsCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfUkFUSU5HLAorICAgIH0pCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQorICAgIHB1YmxpYyBAaW50ZXJmYWNlIFJhdGluZ0tleSB7fQorCisgICAgLyoqCisgICAgICogVGhlIHRpdGxlIG9mIHRoZSBtZWRpYS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9LRVlfVElUTEUgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5USVRMRSI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYXJ0aXN0IG9mIHRoZSBtZWRpYS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9LRVlfQVJUSVNUID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQVJUSVNUIjsKKworICAgIC8qKgorICAgICAqIFRoZSBkdXJhdGlvbiBvZiB0aGUgbWVkaWEgaW4gbXMuIEEgbmVnYXRpdmUgZHVyYXRpb24gaW5kaWNhdGVzIHRoYXQgdGhlCisgICAgICogZHVyYXRpb24gaXMgdW5rbm93biAob3IgaW5maW5pdGUpLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9EVVJBVElPTiA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkRVUkFUSU9OIjsKKworICAgIC8qKgorICAgICAqIFRoZSBhbGJ1bSB0aXRsZSBmb3IgdGhlIG1lZGlhLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9BTEJVTSA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkFMQlVNIjsKKworICAgIC8qKgorICAgICAqIFRoZSBhdXRob3Igb2YgdGhlIG1lZGlhLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9BVVRIT1IgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5BVVRIT1IiOworCisgICAgLyoqCisgICAgICogVGhlIHdyaXRlciBvZiB0aGUgbWVkaWEuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfS0VZX1dSSVRFUiA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLldSSVRFUiI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29tcG9zZXIgb2YgdGhlIG1lZGlhLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9DT01QT1NFUiA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkNPTVBPU0VSIjsKKworICAgIC8qKgorICAgICAqIFRoZSBjb21waWxhdGlvbiBzdGF0dXMgb2YgdGhlIG1lZGlhLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9DT01QSUxBVElPTiA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkNPTVBJTEFUSU9OIjsKKworICAgIC8qKgorICAgICAqIFRoZSBkYXRlIHRoZSBtZWRpYSB3YXMgY3JlYXRlZCBvciBwdWJsaXNoZWQuIFRoZSBmb3JtYXQgaXMgdW5zcGVjaWZpZWQKKyAgICAgKiBidXQgUkZDIDMzMzkgaXMgcmVjb21tZW5kZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfS0VZX0RBVEUgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5EQVRFIjsKKworICAgIC8qKgorICAgICAqIFRoZSB5ZWFyIHRoZSBtZWRpYSB3YXMgY3JlYXRlZCBvciBwdWJsaXNoZWQgYXMgYSBsb25nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9ZRUFSID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuWUVBUiI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZ2VucmUgb2YgdGhlIG1lZGlhLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9HRU5SRSA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkdFTlJFIjsKKworICAgIC8qKgorICAgICAqIFRoZSB0cmFjayBudW1iZXIgZm9yIHRoZSBtZWRpYS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9LRVlfVFJBQ0tfTlVNQkVSID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuVFJBQ0tfTlVNQkVSIjsKKworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2YgdHJhY2tzIGluIHRoZSBtZWRpYSdzIG9yaWdpbmFsIHNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9LRVlfTlVNX1RSQUNLUyA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLk5VTV9UUkFDS1MiOworCisgICAgLyoqCisgICAgICogVGhlIGRpc2MgbnVtYmVyIGZvciB0aGUgbWVkaWEncyBvcmlnaW5hbCBzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfS0VZX0RJU0NfTlVNQkVSID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuRElTQ19OVU1CRVIiOworCisgICAgLyoqCisgICAgICogVGhlIGFydGlzdCBmb3IgdGhlIGFsYnVtIG9mIHRoZSBtZWRpYSdzIG9yaWdpbmFsIHNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9LRVlfQUxCVU1fQVJUSVNUID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQUxCVU1fQVJUSVNUIjsKKworICAgIC8qKgorICAgICAqIFRoZSBhcnR3b3JrIGZvciB0aGUgbWVkaWEgYXMgYSB7QGxpbmsgQml0bWFwfS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgYXJ0d29yayBzaG91bGQgYmUgcmVsYXRpdmVseSBzbWFsbCBhbmQgbWF5IGJlIHNjYWxlZCBkb3duIGJ5IHRoZQorICAgICAqIHN5c3RlbSBpZiBpdCBpcyB0b28gbGFyZ2UuIEZvciBoaWdoZXIgcmVzb2x1dGlvbiBhcnR3b3JrCisgICAgICoge0BsaW5rICNNRVRBREFUQV9LRVlfQVJUX1VSSX0gc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9LRVlfQVJUID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQVJUIjsKKworICAgIC8qKgorICAgICAqIFRoZSBhcnR3b3JrIGZvciB0aGUgbWVkaWEgYXMgYSBVcmkgZm9ybWF0dGVkIFN0cmluZy4gVGhlIGFydHdvcmsgY2FuIGJlCisgICAgICogbG9hZGVkIHVzaW5nIGEgY29tYmluYXRpb24gb2Yge0BsaW5rIENvbnRlbnRSZXNvbHZlciNvcGVuSW5wdXRTdHJlYW19IGFuZAorICAgICAqIHtAbGluayBCaXRtYXBGYWN0b3J5I2RlY29kZVN0cmVhbX0uCisgICAgICogPHA+CisgICAgICogRm9yIHRoZSBiZXN0IHJlc3VsdHMsIFVyaXMgc2hvdWxkIHVzZSB0aGUgY29udGVudDovLyBzdHlsZSBhbmQgc3VwcG9ydAorICAgICAqIHtAbGluayBDb250ZW50UmVzb2x2ZXIjRVhUUkFfU0laRX0gZm9yIHJldHJpZXZpbmcgc2NhbGVkIGFydHdvcmsgdGhyb3VnaAorICAgICAqIHtAbGluayBDb250ZW50UmVzb2x2ZXIjb3BlblR5cGVkQXNzZXRGaWxlRGVzY3JpcHRvcihVcmksIFN0cmluZywgQnVuZGxlKX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfS0VZX0FSVF9VUkkgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5BUlRfVVJJIjsKKworICAgIC8qKgorICAgICAqIFRoZSBhcnR3b3JrIGZvciB0aGUgYWxidW0gb2YgdGhlIG1lZGlhJ3Mgb3JpZ2luYWwgc291cmNlIGFzIGEKKyAgICAgKiB7QGxpbmsgQml0bWFwfS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgYXJ0d29yayBzaG91bGQgYmUgcmVsYXRpdmVseSBzbWFsbCBhbmQgbWF5IGJlIHNjYWxlZCBkb3duIGJ5IHRoZQorICAgICAqIHN5c3RlbSBpZiBpdCBpcyB0b28gbGFyZ2UuIEZvciBoaWdoZXIgcmVzb2x1dGlvbiBhcnR3b3JrCisgICAgICoge0BsaW5rICNNRVRBREFUQV9LRVlfQUxCVU1fQVJUX1VSSX0gc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9LRVlfQUxCVU1fQVJUID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQUxCVU1fQVJUIjsKKworICAgIC8qKgorICAgICAqIFRoZSBhcnR3b3JrIGZvciB0aGUgYWxidW0gb2YgdGhlIG1lZGlhJ3Mgb3JpZ2luYWwgc291cmNlIGFzIGEgVXJpCisgICAgICogZm9ybWF0dGVkIFN0cmluZy4gVGhlIGFydHdvcmsgY2FuIGJlIGxvYWRlZCB1c2luZyBhIGNvbWJpbmF0aW9uIG9mCisgICAgICoge0BsaW5rIENvbnRlbnRSZXNvbHZlciNvcGVuSW5wdXRTdHJlYW19IGFuZAorICAgICAqIHtAbGluayBCaXRtYXBGYWN0b3J5I2RlY29kZVN0cmVhbX0uCisgICAgICogPHA+CisgICAgICogRm9yIHRoZSBiZXN0IHJlc3VsdHMsIFVyaXMgc2hvdWxkIHVzZSB0aGUgY29udGVudDovLyBzdHlsZSBhbmQgc3VwcG9ydAorICAgICAqIHtAbGluayBDb250ZW50UmVzb2x2ZXIjRVhUUkFfU0laRX0gZm9yIHJldHJpZXZpbmcgc2NhbGVkIGFydHdvcmsgdGhyb3VnaAorICAgICAqIHtAbGluayBDb250ZW50UmVzb2x2ZXIjb3BlblR5cGVkQXNzZXRGaWxlRGVzY3JpcHRvcihVcmksIFN0cmluZywgQnVuZGxlKX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfS0VZX0FMQlVNX0FSVF9VUkkgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5BTEJVTV9BUlRfVVJJIjsKKworICAgIC8qKgorICAgICAqIFRoZSB1c2VyJ3MgcmF0aW5nIGZvciB0aGUgbWVkaWEuCisgICAgICoKKyAgICAgKiBAc2VlIFJhdGluZworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9VU0VSX1JBVElORyA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLlVTRVJfUkFUSU5HIjsKKworICAgIC8qKgorICAgICAqIFRoZSBvdmVyYWxsIHJhdGluZyBmb3IgdGhlIG1lZGlhLgorICAgICAqCisgICAgICogQHNlZSBSYXRpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9LRVlfUkFUSU5HID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuUkFUSU5HIjsKKworICAgIC8qKgorICAgICAqIEEgdGl0bGUgdGhhdCBpcyBzdWl0YWJsZSBmb3IgZGlzcGxheSB0byB0aGUgdXNlci4gVGhpcyB3aWxsIGdlbmVyYWxseSBiZQorICAgICAqIHRoZSBzYW1lIGFzIHtAbGluayAjTUVUQURBVEFfS0VZX1RJVExFfSBidXQgbWF5IGRpZmZlciBmb3Igc29tZSBmb3JtYXRzLgorICAgICAqIFdoZW4gZGlzcGxheWluZyBtZWRpYSBkZXNjcmliZWQgYnkgdGhpcyBtZXRhZGF0YSB0aGlzIHNob3VsZCBiZSBwcmVmZXJyZWQKKyAgICAgKiBpZiBwcmVzZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9ESVNQTEFZX1RJVExFID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuRElTUExBWV9USVRMRSI7CisKKyAgICAvKioKKyAgICAgKiBBIHN1YnRpdGxlIHRoYXQgaXMgc3VpdGFibGUgZm9yIGRpc3BsYXkgdG8gdGhlIHVzZXIuIFdoZW4gZGlzcGxheWluZyBhCisgICAgICogc2Vjb25kIGxpbmUgZm9yIG1lZGlhIGRlc2NyaWJlZCBieSB0aGlzIG1ldGFkYXRhIHRoaXMgc2hvdWxkIGJlIHByZWZlcnJlZAorICAgICAqIHRvIG90aGVyIGZpZWxkcyBpZiBwcmVzZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9ESVNQTEFZX1NVQlRJVExFCisgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkRJU1BMQVlfU1VCVElUTEUiOworCisgICAgLyoqCisgICAgICogQSBkZXNjcmlwdGlvbiB0aGF0IGlzIHN1aXRhYmxlIGZvciBkaXNwbGF5IHRvIHRoZSB1c2VyLiBXaGVuIGRpc3BsYXlpbmcKKyAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGZvciBtZWRpYSBkZXNjcmliZWQgYnkgdGhpcyBtZXRhZGF0YSB0aGlzIHNob3VsZCBiZQorICAgICAqIHByZWZlcnJlZCB0byBvdGhlciBmaWVsZHMgaWYgcHJlc2VudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9LRVlfRElTUExBWV9ERVNDUklQVElPTgorICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5ESVNQTEFZX0RFU0NSSVBUSU9OIjsKKworICAgIC8qKgorICAgICAqIEFuIGljb24gb3IgdGh1bWJuYWlsIHRoYXQgaXMgc3VpdGFibGUgZm9yIGRpc3BsYXkgdG8gdGhlIHVzZXIuIFdoZW4KKyAgICAgKiBkaXNwbGF5aW5nIGFuIGljb24gZm9yIG1lZGlhIGRlc2NyaWJlZCBieSB0aGlzIG1ldGFkYXRhIHRoaXMgc2hvdWxkIGJlCisgICAgICogcHJlZmVycmVkIHRvIG90aGVyIGZpZWxkcyBpZiBwcmVzZW50LiBUaGlzIG11c3QgYmUgYSB7QGxpbmsgQml0bWFwfS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgaWNvbiBzaG91bGQgYmUgcmVsYXRpdmVseSBzbWFsbCBhbmQgbWF5IGJlIHNjYWxlZCBkb3duIGJ5IHRoZSBzeXN0ZW0KKyAgICAgKiBpZiBpdCBpcyB0b28gbGFyZ2UuIEZvciBoaWdoZXIgcmVzb2x1dGlvbiBhcnR3b3JrCisgICAgICoge0BsaW5rICNNRVRBREFUQV9LRVlfRElTUExBWV9JQ09OX1VSSX0gc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9LRVlfRElTUExBWV9JQ09OCisgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkRJU1BMQVlfSUNPTiI7CisKKyAgICAvKioKKyAgICAgKiBBIFVyaSBmb3JtYXR0ZWQgU3RyaW5nIGZvciBhbiBpY29uIG9yIHRodW1ibmFpbCB0aGF0IGlzIHN1aXRhYmxlIGZvcgorICAgICAqIGRpc3BsYXkgdG8gdGhlIHVzZXIuIFdoZW4gZGlzcGxheWluZyBtb3JlIGluZm9ybWF0aW9uIGZvciBtZWRpYSBkZXNjcmliZWQKKyAgICAgKiBieSB0aGlzIG1ldGFkYXRhIHRoZSBkaXNwbGF5IGRlc2NyaXB0aW9uIHNob3VsZCBiZSBwcmVmZXJyZWQgdG8gb3RoZXIKKyAgICAgKiBmaWVsZHMgd2hlbiBwcmVzZW50LiBUaGUgaWNvbiBjYW4gYmUgbG9hZGVkIHVzaW5nIGEgY29tYmluYXRpb24gb2YKKyAgICAgKiB7QGxpbmsgQ29udGVudFJlc29sdmVyI29wZW5JbnB1dFN0cmVhbX0gYW5kCisgICAgICoge0BsaW5rIEJpdG1hcEZhY3RvcnkjZGVjb2RlU3RyZWFtfS4KKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgdGhlIGJlc3QgcmVzdWx0cywgVXJpcyBzaG91bGQgdXNlIHRoZSBjb250ZW50Oi8vIHN0eWxlIGFuZCBzdXBwb3J0CisgICAgICoge0BsaW5rIENvbnRlbnRSZXNvbHZlciNFWFRSQV9TSVpFfSBmb3IgcmV0cmlldmluZyBzY2FsZWQgYXJ0d29yayB0aHJvdWdoCisgICAgICoge0BsaW5rIENvbnRlbnRSZXNvbHZlciNvcGVuVHlwZWRBc3NldEZpbGVEZXNjcmlwdG9yKFVyaSwgU3RyaW5nLCBCdW5kbGUpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9LRVlfRElTUExBWV9JQ09OX1VSSQorICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5ESVNQTEFZX0lDT05fVVJJIjsKKworICAgIC8qKgorICAgICAqIEEgU3RyaW5nIGtleSBmb3IgaWRlbnRpZnlpbmcgdGhlIGNvbnRlbnQuIFRoaXMgdmFsdWUgaXMgc3BlY2lmaWMgdG8gdGhlCisgICAgICogc2VydmljZSBwcm92aWRpbmcgdGhlIGNvbnRlbnQuIElmIHVzZWQsIHRoaXMgc2hvdWxkIGJlIGEgcGVyc2lzdGVudAorICAgICAqIHVuaXF1ZSBrZXkgZm9yIHRoZSB1bmRlcmx5aW5nIGNvbnRlbnQuIEl0IG1heSBiZSB1c2VkIHdpdGgKKyAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sbGVyLlRyYW5zcG9ydENvbnRyb2xzI3BsYXlGcm9tTWVkaWFJZChTdHJpbmcsIEJ1bmRsZSl9CisgICAgICogdG8gaW5pdGlhdGUgcGxheWJhY2sgd2hlbiBwcm92aWRlZCBieSBhIHtAbGluayBNZWRpYUJyb3dzZXJ9IGNvbm5lY3RlZCB0bworICAgICAqIHRoZSBzYW1lIGFwcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9LRVlfTUVESUFfSUQgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5NRURJQV9JRCI7CisKKyAgICAvKioKKyAgICAgKiBBIFVyaSBmb3JtYXR0ZWQgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY29udGVudC4gVGhpcyB2YWx1ZSBpcyBzcGVjaWZpYyB0byB0aGUKKyAgICAgKiBzZXJ2aWNlIHByb3ZpZGluZyB0aGUgY29udGVudC4gSXQgbWF5IGJlIHVzZWQgd2l0aAorICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xsZXIuVHJhbnNwb3J0Q29udHJvbHMjcGxheUZyb21VcmkoVXJpLCBCdW5kbGUpfQorICAgICAqIHRvIGluaXRpYXRlIHBsYXliYWNrIHdoZW4gcHJvdmlkZWQgYnkgYSB7QGxpbmsgTWVkaWFCcm93c2VyfSBjb25uZWN0ZWQgdG8KKyAgICAgKiB0aGUgc2FtZSBhcHAuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfS0VZX01FRElBX1VSSSA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLk1FRElBX1VSSSI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYmx1ZXRvb3RoIGZvbGRlciB0eXBlIG9mIHRoZSBtZWRpYSBzcGVjaWZpZWQgaW4gdGhlIHNlY3Rpb24gNi4xMC4yLjIgb2YgdGhlIEJsdWV0b290aAorICAgICAqIEFWUkNQIDEuNS4gSXQgc2hvdWxkIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rIE1lZGlhRGVzY3JpcHRpb24jQlRfRk9MREVSX1RZUEVfTUlYRUR9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIE1lZGlhRGVzY3JpcHRpb24jQlRfRk9MREVSX1RZUEVfVElUTEVTfTwvbGk+CisgICAgICogPGxpPntAbGluayBNZWRpYURlc2NyaXB0aW9uI0JUX0ZPTERFUl9UWVBFX0FMQlVNU308L2xpPgorICAgICAqIDxsaT57QGxpbmsgTWVkaWFEZXNjcmlwdGlvbiNCVF9GT0xERVJfVFlQRV9BUlRJU1RTfTwvbGk+CisgICAgICogPGxpPntAbGluayBNZWRpYURlc2NyaXB0aW9uI0JUX0ZPTERFUl9UWVBFX0dFTlJFU308L2xpPgorICAgICAqIDxsaT57QGxpbmsgTWVkaWFEZXNjcmlwdGlvbiNCVF9GT0xERVJfVFlQRV9QTEFZTElTVFN9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIE1lZGlhRGVzY3JpcHRpb24jQlRfRk9MREVSX1RZUEVfWUVBUlN9PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9CVF9GT0xERVJfVFlQRQorICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5CVF9GT0xERVJfVFlQRSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBAVGV4dEtleSBTdHJpbmdbXSBQUkVGRVJSRURfREVTQ1JJUFRJT05fT1JERVIgPSB7CisgICAgICAgICAgICBNRVRBREFUQV9LRVlfVElUTEUsCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfQVJUSVNULAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FMQlVNLAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FMQlVNX0FSVElTVCwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9XUklURVIsCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfQVVUSE9SLAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0NPTVBPU0VSCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEBCaXRtYXBLZXkgU3RyaW5nW10gUFJFRkVSUkVEX0JJVE1BUF9PUkRFUiA9IHsKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9ESVNQTEFZX0lDT04sCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfQVJULAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FMQlVNX0FSVAorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBAVGV4dEtleSBTdHJpbmdbXSBQUkVGRVJSRURfVVJJX09SREVSID0geworICAgICAgICAgICAgTUVUQURBVEFfS0VZX0RJU1BMQVlfSUNPTl9VUkksCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfQVJUX1VSSSwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BTEJVTV9BUlRfVVJJCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9UWVBFX0lOVkFMSUQgPSAtMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVUQURBVEFfVFlQRV9MT05HID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVUQURBVEFfVFlQRV9URVhUID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVUQURBVEFfVFlQRV9CSVRNQVAgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9UWVBFX1JBVElORyA9IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlNYXA8U3RyaW5nLCBJbnRlZ2VyPiBNRVRBREFUQV9LRVlTX1RZUEU7CisKKyAgICBzdGF0aWMgeworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUgPSBuZXcgQXJyYXlNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9USVRMRSwgTUVUQURBVEFfVFlQRV9URVhUKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQVJUSVNULCBNRVRBREFUQV9UWVBFX1RFWFQpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9EVVJBVElPTiwgTUVUQURBVEFfVFlQRV9MT05HKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQUxCVU0sIE1FVEFEQVRBX1RZUEVfVEVYVCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FVVEhPUiwgTUVUQURBVEFfVFlQRV9URVhUKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfV1JJVEVSLCBNRVRBREFUQV9UWVBFX1RFWFQpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9DT01QT1NFUiwgTUVUQURBVEFfVFlQRV9URVhUKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQ09NUElMQVRJT04sIE1FVEFEQVRBX1RZUEVfVEVYVCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RBVEUsIE1FVEFEQVRBX1RZUEVfVEVYVCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX1lFQVIsIE1FVEFEQVRBX1RZUEVfTE9ORyk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0dFTlJFLCBNRVRBREFUQV9UWVBFX1RFWFQpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9UUkFDS19OVU1CRVIsIE1FVEFEQVRBX1RZUEVfTE9ORyk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX05VTV9UUkFDS1MsIE1FVEFEQVRBX1RZUEVfTE9ORyk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU0NfTlVNQkVSLCBNRVRBREFUQV9UWVBFX0xPTkcpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BTEJVTV9BUlRJU1QsIE1FVEFEQVRBX1RZUEVfVEVYVCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FSVCwgTUVUQURBVEFfVFlQRV9CSVRNQVApOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BUlRfVVJJLCBNRVRBREFUQV9UWVBFX1RFWFQpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BTEJVTV9BUlQsIE1FVEFEQVRBX1RZUEVfQklUTUFQKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQUxCVU1fQVJUX1VSSSwgTUVUQURBVEFfVFlQRV9URVhUKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfVVNFUl9SQVRJTkcsIE1FVEFEQVRBX1RZUEVfUkFUSU5HKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfUkFUSU5HLCBNRVRBREFUQV9UWVBFX1JBVElORyk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU1BMQVlfVElUTEUsIE1FVEFEQVRBX1RZUEVfVEVYVCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU1BMQVlfU1VCVElUTEUsIE1FVEFEQVRBX1RZUEVfVEVYVCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU1BMQVlfREVTQ1JJUFRJT04sIE1FVEFEQVRBX1RZUEVfVEVYVCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU1BMQVlfSUNPTiwgTUVUQURBVEFfVFlQRV9CSVRNQVApOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9ESVNQTEFZX0lDT05fVVJJLCBNRVRBREFUQV9UWVBFX1RFWFQpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9CVF9GT0xERVJfVFlQRSwgTUVUQURBVEFfVFlQRV9MT05HKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfTUVESUFfSUQsIE1FVEFEQVRBX1RZUEVfVEVYVCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX01FRElBX1VSSSwgTUVUQURBVEFfVFlQRV9URVhUKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTcGFyc2VBcnJheTxTdHJpbmc+IEVESVRPUl9LRVlfTUFQUElORzsKKworICAgIHN0YXRpYyB7CisgICAgICAgIEVESVRPUl9LRVlfTUFQUElORyA9IG5ldyBTcGFyc2VBcnJheTxTdHJpbmc+KCk7CisgICAgICAgIEVESVRPUl9LRVlfTUFQUElORy5wdXQoTWVkaWFNZXRhZGF0YUVkaXRvci5CSVRNQVBfS0VZX0FSVFdPUkssIE1FVEFEQVRBX0tFWV9BUlQpOworICAgICAgICBFRElUT1JfS0VZX01BUFBJTkcucHV0KE1lZGlhTWV0YWRhdGFFZGl0b3IuUkFUSU5HX0tFWV9CWV9PVEhFUlMsIE1FVEFEQVRBX0tFWV9SQVRJTkcpOworICAgICAgICBFRElUT1JfS0VZX01BUFBJTkcucHV0KE1lZGlhTWV0YWRhdGFFZGl0b3IuUkFUSU5HX0tFWV9CWV9VU0VSLCBNRVRBREFUQV9LRVlfVVNFUl9SQVRJTkcpOworICAgICAgICBFRElUT1JfS0VZX01BUFBJTkcucHV0KE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX0FMQlVNLCBNRVRBREFUQV9LRVlfQUxCVU0pOworICAgICAgICBFRElUT1JfS0VZX01BUFBJTkcucHV0KE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX0FMQlVNQVJUSVNULAorICAgICAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BTEJVTV9BUlRJU1QpOworICAgICAgICBFRElUT1JfS0VZX01BUFBJTkcucHV0KE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX0FSVElTVCwgTUVUQURBVEFfS0VZX0FSVElTVCk7CisgICAgICAgIEVESVRPUl9LRVlfTUFQUElORy5wdXQoTWVkaWFNZXRhZGF0YVJldHJpZXZlci5NRVRBREFUQV9LRVlfQVVUSE9SLCBNRVRBREFUQV9LRVlfQVVUSE9SKTsKKyAgICAgICAgRURJVE9SX0tFWV9NQVBQSU5HLnB1dChNZWRpYU1ldGFkYXRhUmV0cmlldmVyLk1FVEFEQVRBX0tFWV9DRF9UUkFDS19OVU1CRVIsCisgICAgICAgICAgICAgICAgTUVUQURBVEFfS0VZX1RSQUNLX05VTUJFUik7CisgICAgICAgIEVESVRPUl9LRVlfTUFQUElORy5wdXQoTWVkaWFNZXRhZGF0YVJldHJpZXZlci5NRVRBREFUQV9LRVlfQ09NUE9TRVIsIE1FVEFEQVRBX0tFWV9DT01QT1NFUik7CisgICAgICAgIEVESVRPUl9LRVlfTUFQUElORy5wdXQoTWVkaWFNZXRhZGF0YVJldHJpZXZlci5NRVRBREFUQV9LRVlfQ09NUElMQVRJT04sCisgICAgICAgICAgICAgICAgTUVUQURBVEFfS0VZX0NPTVBJTEFUSU9OKTsKKyAgICAgICAgRURJVE9SX0tFWV9NQVBQSU5HLnB1dChNZWRpYU1ldGFkYXRhUmV0cmlldmVyLk1FVEFEQVRBX0tFWV9EQVRFLCBNRVRBREFUQV9LRVlfREFURSk7CisgICAgICAgIEVESVRPUl9LRVlfTUFQUElORy5wdXQoTWVkaWFNZXRhZGF0YVJldHJpZXZlci5NRVRBREFUQV9LRVlfRElTQ19OVU1CRVIsCisgICAgICAgICAgICAgICAgTUVUQURBVEFfS0VZX0RJU0NfTlVNQkVSKTsKKyAgICAgICAgRURJVE9SX0tFWV9NQVBQSU5HLnB1dChNZWRpYU1ldGFkYXRhUmV0cmlldmVyLk1FVEFEQVRBX0tFWV9EVVJBVElPTiwgTUVUQURBVEFfS0VZX0RVUkFUSU9OKTsKKyAgICAgICAgRURJVE9SX0tFWV9NQVBQSU5HLnB1dChNZWRpYU1ldGFkYXRhUmV0cmlldmVyLk1FVEFEQVRBX0tFWV9HRU5SRSwgTUVUQURBVEFfS0VZX0dFTlJFKTsKKyAgICAgICAgRURJVE9SX0tFWV9NQVBQSU5HLnB1dChNZWRpYU1ldGFkYXRhUmV0cmlldmVyLk1FVEFEQVRBX0tFWV9OVU1fVFJBQ0tTLAorICAgICAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9OVU1fVFJBQ0tTKTsKKyAgICAgICAgRURJVE9SX0tFWV9NQVBQSU5HLnB1dChNZWRpYU1ldGFkYXRhUmV0cmlldmVyLk1FVEFEQVRBX0tFWV9USVRMRSwgTUVUQURBVEFfS0VZX1RJVExFKTsKKyAgICAgICAgRURJVE9SX0tFWV9NQVBQSU5HLnB1dChNZWRpYU1ldGFkYXRhUmV0cmlldmVyLk1FVEFEQVRBX0tFWV9XUklURVIsIE1FVEFEQVRBX0tFWV9XUklURVIpOworICAgICAgICBFRElUT1JfS0VZX01BUFBJTkcucHV0KE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX1lFQVIsIE1FVEFEQVRBX0tFWV9ZRUFSKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOworICAgIHByaXZhdGUgTWVkaWFEZXNjcmlwdGlvbiBtRGVzY3JpcHRpb247CisKKyAgICBwcml2YXRlIE1lZGlhTWV0YWRhdGEoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZShidW5kbGUpOworICAgIH0KKworICAgIHByaXZhdGUgTWVkaWFNZXRhZGF0YShQYXJjZWwgaW4pIHsKKyAgICAgICAgbUJ1bmRsZSA9IGluLnJlYWRCdW5kbGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGtleSBpcyBjb250YWluZWQgaW4gdGhlIG1ldGFkYXRhCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IGEgU3RyaW5nIGtleQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUga2V5IGV4aXN0cyBpbiB0aGlzIG1ldGFkYXRhLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShTdHJpbmcga2V5KSB7CisgICAgICAgIHJldHVybiBtQnVuZGxlLmNvbnRhaW5zS2V5KGtleSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBrZXksIG9yIG51bGwgaWYgbm8gbWFwcGluZyBvZgorICAgICAqIHRoZSBkZXNpcmVkIHR5cGUgZXhpc3RzIGZvciB0aGUgZ2l2ZW4ga2V5IG9yIGEgbnVsbCB2YWx1ZSBpcyBleHBsaWNpdGx5CisgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgdGhlIHZhbHVlIGlzIHN0b3JlZCB1bmRlcgorICAgICAqIEByZXR1cm4gYSBDaGFyU2VxdWVuY2UgdmFsdWUsIG9yIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRleHQoQFRleHRLZXkgU3RyaW5nIGtleSkgeworICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRDaGFyU2VxdWVuY2Uoa2V5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0IHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4ga2V5IGFzIGEgU3RyaW5nLCBvciBudWxsCisgICAgICogaWYgbm8gbWFwcGluZyBvZiB0aGUgZGVzaXJlZCB0eXBlIGV4aXN0cyBmb3IgdGhlIGdpdmVuIGtleSBvciBhIG51bGwKKyAgICAgKiB2YWx1ZSBpcyBleHBsaWNpdGx5IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KKyAgICAgKiBjYWxsaW5nIHtAbGluayAjZ2V0VGV4dCBnZXRUZXh0KCkudG9TdHJpbmcoKX0gaWYgdGhlIHZhbHVlIGlzIG5vdCBudWxsLgorICAgICAqCisgICAgICogQHBhcmFtIGtleSBUaGUga2V5IHRoZSB2YWx1ZSBpcyBzdG9yZWQgdW5kZXIKKyAgICAgKiBAcmV0dXJuIGEgU3RyaW5nIHZhbHVlLCBvciBudWxsCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoQFRleHRLZXkgU3RyaW5nIGtleSkgeworICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCA9IGdldFRleHQoa2V5KTsKKyAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHRleHQudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGtleSwgb3IgMEwgaWYgbm8gbG9uZyBleGlzdHMKKyAgICAgKiBmb3IgdGhlIGdpdmVuIGtleS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSB0aGUgdmFsdWUgaXMgc3RvcmVkIHVuZGVyCisgICAgICogQHJldHVybiBhIGxvbmcgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRMb25nKEBMb25nS2V5IFN0cmluZyBrZXkpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0TG9uZyhrZXksIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB7QGxpbmsgUmF0aW5nfSBmb3IgdGhlIGdpdmVuIGtleSBvciBudWxsIGlmIG5vIHJhdGluZyBleGlzdHMKKyAgICAgKiBmb3IgdGhlIGdpdmVuIGtleS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSB0aGUgdmFsdWUgaXMgc3RvcmVkIHVuZGVyCisgICAgICogQHJldHVybiBBIHtAbGluayBSYXRpbmd9IG9yIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgUmF0aW5nIGdldFJhdGluZyhAUmF0aW5nS2V5IFN0cmluZyBrZXkpIHsKKyAgICAgICAgUmF0aW5nIHJhdGluZyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByYXRpbmcgPSBtQnVuZGxlLmdldFBhcmNlbGFibGUoa2V5KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZSwgdmFsdWUgd2FzIG5vdCBhIGJpdG1hcAorICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIHJldHJpZXZlIGEga2V5IGFzIFJhdGluZy4iLCBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmF0aW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB7QGxpbmsgQml0bWFwfSBmb3IgdGhlIGdpdmVuIGtleSBvciBudWxsIGlmIG5vIGJpdG1hcCBleGlzdHMKKyAgICAgKiBmb3IgdGhlIGdpdmVuIGtleS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSB0aGUgdmFsdWUgaXMgc3RvcmVkIHVuZGVyCisgICAgICogQHJldHVybiBBIHtAbGluayBCaXRtYXB9IG9yIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgQml0bWFwIGdldEJpdG1hcChAQml0bWFwS2V5IFN0cmluZyBrZXkpIHsKKyAgICAgICAgQml0bWFwIGJtcCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBibXAgPSBtQnVuZGxlLmdldFBhcmNlbGFibGUoa2V5KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZSwgdmFsdWUgd2FzIG5vdCBhIGJpdG1hcAorICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIHJldHJpZXZlIGEga2V5IGFzIEJpdG1hcC4iLCBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYm1wOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgIGRlc3Qud3JpdGVCdW5kbGUobUJ1bmRsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGZpZWxkcyBpbiB0aGlzIG1ldGFkYXRhLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGZpZWxkcyBpbiB0aGUgbWV0YWRhdGEuCisgICAgICovCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICByZXR1cm4gbUJ1bmRsZS5zaXplKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIFNldCBjb250YWluaW5nIHRoZSBTdHJpbmdzIHVzZWQgYXMga2V5cyBpbiB0aGlzIG1ldGFkYXRhLgorICAgICAqCisgICAgICogQHJldHVybiBhIFNldCBvZiBTdHJpbmcga2V5cworICAgICAqLworICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBrZXlTZXQoKSB7CisgICAgICAgIHJldHVybiBtQnVuZGxlLmtleVNldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzaW1wbGUgZGVzY3JpcHRpb24gb2YgdGhpcyBtZXRhZGF0YSBmb3IgZGlzcGxheSBwdXJwb3Nlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQSBzaW1wbGUgZGVzY3JpcHRpb24gb2YgdGhpcyBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vbk51bGwgTWVkaWFEZXNjcmlwdGlvbiBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgaWYgKG1EZXNjcmlwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbURlc2NyaXB0aW9uOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIG1lZGlhSWQgPSBnZXRTdHJpbmcoTUVUQURBVEFfS0VZX01FRElBX0lEKTsKKworICAgICAgICBDaGFyU2VxdWVuY2VbXSB0ZXh0ID0gbmV3IENoYXJTZXF1ZW5jZVszXTsKKyAgICAgICAgQml0bWFwIGljb24gPSBudWxsOworICAgICAgICBVcmkgaWNvblVyaSA9IG51bGw7CisKKyAgICAgICAgLy8gRmlyc3QgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGRpc3BsYXkgZGF0YSBpcyBzZXQgYWxyZWFkeQorICAgICAgICBDaGFyU2VxdWVuY2UgZGlzcGxheVRleHQgPSBnZXRUZXh0KE1FVEFEQVRBX0tFWV9ESVNQTEFZX1RJVExFKTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShkaXNwbGF5VGV4dCkpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZXkgaGF2ZSBhIGRpc3BsYXkgdGl0bGUgdXNlIG9ubHkgZGlzcGxheSBkYXRhLCBvdGhlcndpc2UgdXNlCisgICAgICAgICAgICAvLyBvdXIgYmVzdCBiZXRzCisgICAgICAgICAgICB0ZXh0WzBdID0gZGlzcGxheVRleHQ7CisgICAgICAgICAgICB0ZXh0WzFdID0gZ2V0VGV4dChNRVRBREFUQV9LRVlfRElTUExBWV9TVUJUSVRMRSk7CisgICAgICAgICAgICB0ZXh0WzJdID0gZ2V0VGV4dChNRVRBREFUQV9LRVlfRElTUExBWV9ERVNDUklQVElPTik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBVc2Ugd2hhdGV2ZXIgZmllbGRzIHdlIGNhbgorICAgICAgICAgICAgaW50IHRleHRJbmRleCA9IDA7CisgICAgICAgICAgICBpbnQga2V5SW5kZXggPSAwOworICAgICAgICAgICAgd2hpbGUgKHRleHRJbmRleCA8IHRleHQubGVuZ3RoICYmIGtleUluZGV4IDwgUFJFRkVSUkVEX0RFU0NSSVBUSU9OX09SREVSLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBuZXh0ID0gZ2V0VGV4dChQUkVGRVJSRURfREVTQ1JJUFRJT05fT1JERVJba2V5SW5kZXgrK10pOworICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobmV4dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRmlsbCBpbiB0aGUgbmV4dCBlbXB0eSBiaXQgb2YgdGV4dAorICAgICAgICAgICAgICAgICAgICB0ZXh0W3RleHRJbmRleCsrXSA9IG5leHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gR2V0IHRoZSBiZXN0IGFydCBiaXRtYXAgd2UgY2FuIGZpbmQKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQUkVGRVJSRURfQklUTUFQX09SREVSLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBCaXRtYXAgbmV4dCA9IGdldEJpdG1hcChQUkVGRVJSRURfQklUTUFQX09SREVSW2ldKTsKKyAgICAgICAgICAgIGlmIChuZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpY29uID0gbmV4dDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEdldCB0aGUgYmVzdCBVcmkgd2UgY2FuIGZpbmQKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQUkVGRVJSRURfVVJJX09SREVSLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgbmV4dCA9IGdldFN0cmluZyhQUkVGRVJSRURfVVJJX09SREVSW2ldKTsKKyAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobmV4dCkpIHsKKyAgICAgICAgICAgICAgICBpY29uVXJpID0gVXJpLnBhcnNlKG5leHQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgVXJpIG1lZGlhVXJpID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIG1lZGlhVXJpU3RyID0gZ2V0U3RyaW5nKE1FVEFEQVRBX0tFWV9NRURJQV9VUkkpOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KG1lZGlhVXJpU3RyKSkgeworICAgICAgICAgICAgbWVkaWFVcmkgPSBVcmkucGFyc2UobWVkaWFVcmlTdHIpOworICAgICAgICB9CisKKyAgICAgICAgTWVkaWFEZXNjcmlwdGlvbi5CdWlsZGVyIGJvYiA9IG5ldyBNZWRpYURlc2NyaXB0aW9uLkJ1aWxkZXIoKTsKKyAgICAgICAgYm9iLnNldE1lZGlhSWQobWVkaWFJZCk7CisgICAgICAgIGJvYi5zZXRUaXRsZSh0ZXh0WzBdKTsKKyAgICAgICAgYm9iLnNldFN1YnRpdGxlKHRleHRbMV0pOworICAgICAgICBib2Iuc2V0RGVzY3JpcHRpb24odGV4dFsyXSk7CisgICAgICAgIGJvYi5zZXRJY29uQml0bWFwKGljb24pOworICAgICAgICBib2Iuc2V0SWNvblVyaShpY29uVXJpKTsKKyAgICAgICAgYm9iLnNldE1lZGlhVXJpKG1lZGlhVXJpKTsKKyAgICAgICAgaWYgKG1CdW5kbGUuY29udGFpbnNLZXkoTUVUQURBVEFfS0VZX0JUX0ZPTERFUl9UWVBFKSkgeworICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgIGJ1bmRsZS5wdXRMb25nKE1lZGlhRGVzY3JpcHRpb24uRVhUUkFfQlRfRk9MREVSX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIGdldExvbmcoTUVUQURBVEFfS0VZX0JUX0ZPTERFUl9UWVBFKSk7CisgICAgICAgICAgICBib2Iuc2V0RXh0cmFzKGJ1bmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgbURlc2NyaXB0aW9uID0gYm9iLmJ1aWxkKCk7CisKKyAgICAgICAgcmV0dXJuIG1EZXNjcmlwdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgZm9yIGdldHRpbmcgdGhlIFN0cmluZyBrZXkgdXNlZCBieSB7QGxpbmsgTWVkaWFNZXRhZGF0YX0gZnJvbSB0aGUKKyAgICAgKiBpbnRlZ2VyIGtleSB0aGF0IHtAbGluayBNZWRpYU1ldGFkYXRhRWRpdG9yfSB1c2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGVkaXRvcktleSBUaGUga2V5IHVzZWQgYnkgdGhlIGVkaXRvcgorICAgICAqIEByZXR1cm4gVGhlIGtleSB1c2VkIGJ5IHRoaXMgY2xhc3Mgb3IgbnVsbCBpZiBubyBtYXBwaW5nIGV4aXN0cworICAgICAqIEBoaWRlCisgICAgICovCisgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRLZXlGcm9tTWV0YWRhdGFFZGl0b3JLZXkoaW50IGVkaXRvcktleSkgeworICAgICAgICByZXR1cm4gRURJVE9SX0tFWV9NQVBQSU5HLmdldChlZGl0b3JLZXksIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPE1lZGlhTWV0YWRhdGE+IENSRUFUT1IgPQorICAgICAgICAgICAgbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxNZWRpYU1ldGFkYXRhPigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YSBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhTWV0YWRhdGEoaW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYU1ldGFkYXRhW3NpemVdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlcyB0aGUgY29udGVudHMgb2YgdGhpcyBvYmplY3QgdG8gYW5vdGhlciBNZWRpYU1ldGFkYXRhIG9iamVjdC4gSXQKKyAgICAgKiBkb2VzIG5vdCBjb21wYXJlIEJpdG1hcHMgYW5kIFJhdGluZ3MgYXMgdGhlIG1lZGlhIHBsYXllciBjYW4gY2hvb3NlIHRvCisgICAgICogZm9yZ28gdGhlc2UgZmllbGRzIGRlcGVuZGluZyBvbiBob3cgeW91IHJldHJpZXZlIHRoZSBNZWRpYU1ldGFkYXRhLgorICAgICAqCisgICAgICogQHBhcmFtIG8gVGhlIE1ldGFkYXRhIG9iamVjdCB0byBjb21wYXJlIHRoaXMgb2JqZWN0IGFnYWluc3QKKyAgICAgKiBAcmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB0d28gb2JqZWN0cyBoYXZlIG1hdGNoaW5nIGZpZWxkcyAoZXhjbHVkaW5nCisgICAgICogQml0bWFwcyBhbmQgUmF0aW5ncykKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKG8gPT0gdGhpcykgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgTWVkaWFNZXRhZGF0YSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIE1lZGlhTWV0YWRhdGEgbSA9IChNZWRpYU1ldGFkYXRhKSBvOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUVUQURBVEFfS0VZU19UWVBFLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcga2V5ID0gTUVUQURBVEFfS0VZU19UWVBFLmtleUF0KGkpOworICAgICAgICAgICAgc3dpdGNoIChNRVRBREFUQV9LRVlTX1RZUEUudmFsdWVBdChpKSkgeworICAgICAgICAgICAgICAgIGNhc2UgTUVUQURBVEFfVFlQRV9URVhUOgorICAgICAgICAgICAgICAgICAgICBpZiAoIU9iamVjdHMuZXF1YWxzKGdldFN0cmluZyhrZXkpLCBtLmdldFN0cmluZyhrZXkpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTUVUQURBVEFfVFlQRV9MT05HOgorICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0TG9uZyhrZXkpICE9IG0uZ2V0TG9uZyhrZXkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIHJhdGluZ3MgYW5kIGJpdG1hcHMgd2hlbiBjb21wYXJpbmcKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaENvZGUgPSAxNzsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1FVEFEQVRBX0tFWVNfVFlQRS5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIGtleSA9IE1FVEFEQVRBX0tFWVNfVFlQRS5rZXlBdChpKTsKKyAgICAgICAgICAgIHN3aXRjaCAoTUVUQURBVEFfS0VZU19UWVBFLnZhbHVlQXQoaSkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1FVEFEQVRBX1RZUEVfVEVYVDoKKyAgICAgICAgICAgICAgICAgICAgaGFzaENvZGUgPSAzMSAqIGhhc2hDb2RlICsgT2JqZWN0cy5oYXNoKGdldFN0cmluZyhrZXkpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNRVRBREFUQV9UWVBFX0xPTkc6CisgICAgICAgICAgICAgICAgICAgIGhhc2hDb2RlID0gMzEgKiBoYXNoQ29kZSArIExvbmcuaGFzaENvZGUoZ2V0TG9uZyhrZXkpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIHJhdGluZ3MgYW5kIGJpdG1hcHMgd2hlbiBjb21wYXJpbmcKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaGFzaENvZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlIHRvIGJ1aWxkIE1lZGlhTWV0YWRhdGEgb2JqZWN0cy4gVGhlIHN5c3RlbSBkZWZpbmVkIG1ldGFkYXRhIGtleXMgbXVzdAorICAgICAqIHVzZSB0aGUgYXBwcm9wcmlhdGUgZGF0YSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1CdW5kbGU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhbiBlbXB0eSBCdWlsZGVyLiBBbnkgZmllbGQgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlCisgICAgICAgICAqIHtAbGluayBNZWRpYU1ldGFkYXRhfSBtdXN0IGJlIGFkZGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIoKSB7CisgICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIEJ1aWxkZXIgdXNpbmcgYSB7QGxpbmsgTWVkaWFNZXRhZGF0YX0gaW5zdGFuY2UgdG8gc2V0IHRoZQorICAgICAgICAgKiBpbml0aWFsIHZhbHVlcy4gQWxsIGZpZWxkcyBpbiB0aGUgc291cmNlIG1ldGFkYXRhIHdpbGwgYmUgaW5jbHVkZWQgaW4KKyAgICAgICAgICogdGhlIG5ldyBtZXRhZGF0YS4gRmllbGRzIGNhbiBiZSBvdmVyd3JpdHRlbiBieSBhZGRpbmcgdGhlIHNhbWUga2V5LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc291cmNlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlcihNZWRpYU1ldGFkYXRhIHNvdXJjZSkgeworICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoc291cmNlLm1CdW5kbGUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIEJ1aWxkZXIgdXNpbmcgYSB7QGxpbmsgTWVkaWFNZXRhZGF0YX0gaW5zdGFuY2UgdG8gc2V0CisgICAgICAgICAqIGluaXRpYWwgdmFsdWVzLCBidXQgcmVwbGFjZSBiaXRtYXBzIHdpdGggYSBzY2FsZWQgZG93biBjb3B5IGlmIHRoZXkKKyAgICAgICAgICogYXJlIGxhcmdlciB0aGFuIG1heEJpdG1hcFNpemUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzb3VyY2UgVGhlIG9yaWdpbmFsIG1ldGFkYXRhIHRvIGNvcHkuCisgICAgICAgICAqIEBwYXJhbSBtYXhCaXRtYXBTaXplIFRoZSBtYXhpbXVtIGhlaWdodC93aWR0aCBmb3IgYml0bWFwcyBjb250YWluZWQKKyAgICAgICAgICogICAgICAgICAgICBpbiB0aGUgbWV0YWRhdGEuCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlcihNZWRpYU1ldGFkYXRhIHNvdXJjZSwgaW50IG1heEJpdG1hcFNpemUpIHsKKyAgICAgICAgICAgIHRoaXMoc291cmNlKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IG1CdW5kbGUua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBtQnVuZGxlLmdldChrZXkpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlIGluc3RhbmNlb2YgQml0bWFwKSB7CisgICAgICAgICAgICAgICAgICAgIEJpdG1hcCBibXAgPSAoQml0bWFwKSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJtcC5nZXRIZWlnaHQoKSA+IG1heEJpdG1hcFNpemUgfHwgYm1wLmdldFdpZHRoKCkgPiBtYXhCaXRtYXBTaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdXRCaXRtYXAoa2V5LCBzY2FsZUJpdG1hcChibXAsIG1heEJpdG1hcFNpemUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBQdXQgYSBDaGFyU2VxdWVuY2UgdmFsdWUgaW50byB0aGUgbWV0YWRhdGEuIEN1c3RvbSBrZXlzIG1heSBiZSB1c2VkLAorICAgICAgICAgKiBidXQgaWYgdGhlIE1FVEFEQVRBX0tFWXMgZGVmaW5lZCBpbiB0aGlzIGNsYXNzIGFyZSB1c2VkIHRoZXkgbWF5IG9ubHkKKyAgICAgICAgICogYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgICAgICAqIDx1bD4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX1RJVExFfTwvbGk+CisgICAgICAgICAqIDxsaT57QGxpbmsgI01FVEFEQVRBX0tFWV9BUlRJU1R9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0FMQlVNfTwvbGk+CisgICAgICAgICAqIDxsaT57QGxpbmsgI01FVEFEQVRBX0tFWV9BVVRIT1J9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX1dSSVRFUn08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNNRVRBREFUQV9LRVlfQ09NUE9TRVJ9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0RBVEV9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0dFTlJFfTwvbGk+CisgICAgICAgICAqIDxsaT57QGxpbmsgI01FVEFEQVRBX0tFWV9BTEJVTV9BUlRJU1R9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0FSVF9VUkl9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0FMQlVNX0FSVF9VUkl9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0RJU1BMQVlfVElUTEV9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0RJU1BMQVlfU1VCVElUTEV9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0RJU1BMQVlfREVTQ1JJUFRJT059PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0RJU1BMQVlfSUNPTl9VUkl9PC9saT4KKyAgICAgICAgICogPC91bD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGtleSBUaGUga2V5IGZvciByZWZlcmVuY2luZyB0aGlzIHZhbHVlCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgQ2hhclNlcXVlbmNlIHZhbHVlIHRvIHN0b3JlCisgICAgICAgICAqIEByZXR1cm4gVGhlIEJ1aWxkZXIgdG8gYWxsb3cgY2hhaW5pbmcKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHB1dFRleHQoQFRleHRLZXkgU3RyaW5nIGtleSwgQ2hhclNlcXVlbmNlIHZhbHVlKSB7CisgICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmNvbnRhaW5zS2V5KGtleSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmdldChrZXkpICE9IE1FVEFEQVRBX1RZUEVfVEVYVCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgIiArIGtleQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBrZXkgY2Fubm90IGJlIHVzZWQgdG8gcHV0IGEgQ2hhclNlcXVlbmNlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJ1bmRsZS5wdXRDaGFyU2VxdWVuY2Uoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBQdXQgYSBTdHJpbmcgdmFsdWUgaW50byB0aGUgbWV0YWRhdGEuIEN1c3RvbSBrZXlzIG1heSBiZSB1c2VkLCBidXQgaWYKKyAgICAgICAgICogdGhlIE1FVEFEQVRBX0tFWXMgZGVmaW5lZCBpbiB0aGlzIGNsYXNzIGFyZSB1c2VkIHRoZXkgbWF5IG9ubHkgYmUgb25lCisgICAgICAgICAqIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgICAgICAqIDx1bD4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX1RJVExFfTwvbGk+CisgICAgICAgICAqIDxsaT57QGxpbmsgI01FVEFEQVRBX0tFWV9BUlRJU1R9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0FMQlVNfTwvbGk+CisgICAgICAgICAqIDxsaT57QGxpbmsgI01FVEFEQVRBX0tFWV9BVVRIT1J9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX1dSSVRFUn08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNNRVRBREFUQV9LRVlfQ09NUE9TRVJ9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0RBVEV9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0dFTlJFfTwvbGk+CisgICAgICAgICAqIDxsaT57QGxpbmsgI01FVEFEQVRBX0tFWV9BTEJVTV9BUlRJU1R9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0FSVF9VUkl9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0FMQlVNX0FSVF9VUkl9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0RJU1BMQVlfVElUTEV9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0RJU1BMQVlfU1VCVElUTEV9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0RJU1BMQVlfREVTQ1JJUFRJT059PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0RJU1BMQVlfSUNPTl9VUkl9PC9saT4KKyAgICAgICAgICogPC91bD4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFVyaXMgZm9yIGFydHdvcmsgc2hvdWxkIHVzZSB0aGUgY29udGVudDovLyBzdHlsZSBhbmQgc3VwcG9ydAorICAgICAgICAgKiB7QGxpbmsgQ29udGVudFJlc29sdmVyI0VYVFJBX1NJWkV9IGZvciByZXRyaWV2aW5nIHNjYWxlZCBhcnR3b3JrCisgICAgICAgICAqIHRocm91Z2gge0BsaW5rIENvbnRlbnRSZXNvbHZlciNvcGVuVHlwZWRBc3NldEZpbGVEZXNjcmlwdG9yKFVyaSwKKyAgICAgICAgICogU3RyaW5nLCBCdW5kbGUpfS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGtleSBUaGUga2V5IGZvciByZWZlcmVuY2luZyB0aGlzIHZhbHVlCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgU3RyaW5nIHZhbHVlIHRvIHN0b3JlCisgICAgICAgICAqIEByZXR1cm4gVGhlIEJ1aWxkZXIgdG8gYWxsb3cgY2hhaW5pbmcKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHB1dFN0cmluZyhAVGV4dEtleSBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgeworICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9URVhUKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSAiICsga2V5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGtleSBjYW5ub3QgYmUgdXNlZCB0byBwdXQgYSBTdHJpbmciKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQnVuZGxlLnB1dENoYXJTZXF1ZW5jZShrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFB1dCBhIGxvbmcgdmFsdWUgaW50byB0aGUgbWV0YWRhdGEuIEN1c3RvbSBrZXlzIG1heSBiZSB1c2VkLCBidXQgaWYKKyAgICAgICAgICogdGhlIE1FVEFEQVRBX0tFWXMgZGVmaW5lZCBpbiB0aGlzIGNsYXNzIGFyZSB1c2VkIHRoZXkgbWF5IG9ubHkgYmUgb25lCisgICAgICAgICAqIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgICAgICAqIDx1bD4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0RVUkFUSU9OfTwvbGk+CisgICAgICAgICAqIDxsaT57QGxpbmsgI01FVEFEQVRBX0tFWV9UUkFDS19OVU1CRVJ9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX05VTV9UUkFDS1N9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0RJU0NfTlVNQkVSfTwvbGk+CisgICAgICAgICAqIDxsaT57QGxpbmsgI01FVEFEQVRBX0tFWV9ZRUFSfTwvbGk+CisgICAgICAgICAqIDwvdWw+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgcmVmZXJlbmNpbmcgdGhpcyB2YWx1ZQorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGxvbmcgdmFsdWUgdG8gc3RvcmUKKyAgICAgICAgICogQHJldHVybiBUaGUgQnVpbGRlciB0byBhbGxvdyBjaGFpbmluZworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgcHV0TG9uZyhATG9uZ0tleSBTdHJpbmcga2V5LCBsb25nIHZhbHVlKSB7CisgICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmNvbnRhaW5zS2V5KGtleSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmdldChrZXkpICE9IE1FVEFEQVRBX1RZUEVfTE9ORykgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgIiArIGtleQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBrZXkgY2Fubm90IGJlIHVzZWQgdG8gcHV0IGEgbG9uZyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CdW5kbGUucHV0TG9uZyhrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFB1dCBhIHtAbGluayBSYXRpbmd9IGludG8gdGhlIG1ldGFkYXRhLiBDdXN0b20ga2V5cyBtYXkgYmUgdXNlZCwgYnV0CisgICAgICAgICAqIGlmIHRoZSBNRVRBREFUQV9LRVlzIGRlZmluZWQgaW4gdGhpcyBjbGFzcyBhcmUgdXNlZCB0aGV5IG1heSBvbmx5IGJlCisgICAgICAgICAqIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICAgICAgICAgKiA8dWw+CisgICAgICAgICAqIDxsaT57QGxpbmsgI01FVEFEQVRBX0tFWV9SQVRJTkd9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX1VTRVJfUkFUSU5HfTwvbGk+CisgICAgICAgICAqIDwvdWw+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgcmVmZXJlbmNpbmcgdGhpcyB2YWx1ZQorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIFJhdGluZyB2YWx1ZSB0byBzdG9yZQorICAgICAgICAgKiBAcmV0dXJuIFRoZSBCdWlsZGVyIHRvIGFsbG93IGNoYWluaW5nCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBwdXRSYXRpbmcoQFJhdGluZ0tleSBTdHJpbmcga2V5LCBSYXRpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgeworICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9SQVRJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIFJhdGluZyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CdW5kbGUucHV0UGFyY2VsYWJsZShrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFB1dCBhIHtAbGluayBCaXRtYXB9IGludG8gdGhlIG1ldGFkYXRhLiBDdXN0b20ga2V5cyBtYXkgYmUgdXNlZCwgYnV0CisgICAgICAgICAqIGlmIHRoZSBNRVRBREFUQV9LRVlzIGRlZmluZWQgaW4gdGhpcyBjbGFzcyBhcmUgdXNlZCB0aGV5IG1heSBvbmx5IGJlCisgICAgICAgICAqIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICAgICAgICAgKiA8dWw+CisgICAgICAgICAqIDxsaT57QGxpbmsgI01FVEFEQVRBX0tFWV9BUlR9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0FMQlVNX0FSVH08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNNRVRBREFUQV9LRVlfRElTUExBWV9JQ09OfTwvbGk+CisgICAgICAgICAqIDwvdWw+CisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBMYXJnZSBiaXRtYXBzIG1heSBiZSBzY2FsZWQgZG93biBieSB0aGUgc3lzdGVtIHdoZW4KKyAgICAgICAgICoge0BsaW5rIGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb24jc2V0TWV0YWRhdGF9IGlzIGNhbGxlZC4KKyAgICAgICAgICogVG8gcGFzcyBmdWxsIHJlc29sdXRpb24gaW1hZ2VzIHtAbGluayBVcmkgVXJpc30gc2hvdWxkIGJlIHVzZWQgd2l0aAorICAgICAgICAgKiB7QGxpbmsgI3B1dFN0cmluZ30uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgcmVmZXJlbmNpbmcgdGhpcyB2YWx1ZQorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIEJpdG1hcCB0byBzdG9yZQorICAgICAgICAgKiBAcmV0dXJuIFRoZSBCdWlsZGVyIHRvIGFsbG93IGNoYWluaW5nCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBwdXRCaXRtYXAoQEJpdG1hcEtleSBTdHJpbmcga2V5LCBCaXRtYXAgdmFsdWUpIHsKKyAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgeworICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9CSVRNQVApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIEJpdG1hcCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CdW5kbGUucHV0UGFyY2VsYWJsZShrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgTWVkaWFNZXRhZGF0YX0gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGZpZWxkcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBUaGUgbmV3IE1lZGlhTWV0YWRhdGEgaW5zdGFuY2UKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhIGJ1aWxkKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYU1ldGFkYXRhKG1CdW5kbGUpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBCaXRtYXAgc2NhbGVCaXRtYXAoQml0bWFwIGJtcCwgaW50IG1heFNpemUpIHsKKyAgICAgICAgICAgIGZsb2F0IG1heFNpemVGID0gbWF4U2l6ZTsKKyAgICAgICAgICAgIGZsb2F0IHdpZHRoU2NhbGUgPSBtYXhTaXplRiAvIGJtcC5nZXRXaWR0aCgpOworICAgICAgICAgICAgZmxvYXQgaGVpZ2h0U2NhbGUgPSBtYXhTaXplRiAvIGJtcC5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgIGZsb2F0IHNjYWxlID0gTWF0aC5taW4od2lkdGhTY2FsZSwgaGVpZ2h0U2NhbGUpOworICAgICAgICAgICAgaW50IGhlaWdodCA9IChpbnQpIChibXAuZ2V0SGVpZ2h0KCkgKiBzY2FsZSk7CisgICAgICAgICAgICBpbnQgd2lkdGggPSAoaW50KSAoYm1wLmdldFdpZHRoKCkgKiBzY2FsZSk7CisgICAgICAgICAgICByZXR1cm4gQml0bWFwLmNyZWF0ZVNjYWxlZEJpdG1hcChibXAsIHdpZHRoLCBoZWlnaHQsIHRydWUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhUGFyY2VsZWRMaXN0U2xpY2UuYWlkbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVBhcmNlbGVkTGlzdFNsaWNlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI4ZWE5YwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVBhcmNlbGVkTGlzdFNsaWNlLmFpZGwKQEAgLTAsMCArMSwxOSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqIEBoaWRlICovCitwYXJjZWxhYmxlIE1lZGlhUGFyY2VsZWRMaXN0U2xpY2U7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhUGFyY2VsZWRMaXN0U2xpY2UuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVBhcmNlbGVkTGlzdFNsaWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMzZmRiNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVBhcmNlbGVkTGlzdFNsaWNlLmphdmEKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5VbnN1cHBvcnRlZEFwcFVzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVHJhbnNmZXIgYSBsYXJnZSBsaXN0IG9mIG9iamVjdHMgYWNyb3NzIGFuIElQQy4gU3BsaXRzIGludG8gbXVsdGlwbGUgdHJhbnNhY3Rpb25zIGlmIG5lZWRlZC4KKyAqIE5vdGU6IE9ubHkgdXNlIGNsYXNzZXMgZGVjbGFyZWQgZmluYWwgaW4gb3JkZXIgdG8gYXZvaWQgc3ViY2xhc3NlcyBvdmVycmlkaW5nIHJlYWRpbmcvd3JpdGluZworICogcGFyY2VsIGxvZ2ljLgorICoKKyAqIFRPRE86IEFkZCB0ZXN0IGZvciBzZW5kaW5nIGxhcmdlIGRhdGEKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBNZWRpYVBhcmNlbGVkTGlzdFNsaWNlPFQgZXh0ZW5kcyBQYXJjZWxhYmxlPiBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFQYXJjZWxlZExpc3RTbGljZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9JUENfU0laRSA9IDY0ICogMTAyNDsgLy8gSUJpbmRlci5NQVhfSVBDX1NJWkUKKworICAgIGZpbmFsIExpc3Q8VD4gbUxpc3Q7CisKKyAgICBwdWJsaWMgTWVkaWFQYXJjZWxlZExpc3RTbGljZShMaXN0PFQ+IGxpc3QpIHsKKyAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGlzdCBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIG1MaXN0ID0gbGlzdDsKKyAgICB9CisKKyAgICBNZWRpYVBhcmNlbGVkTGlzdFNsaWNlKFBhcmNlbCBwKSB7CisgICAgICAgIGZpbmFsIGludCBpdGVtQ291bnQgPSBwLnJlYWRJbnQoKTsKKyAgICAgICAgbUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oaXRlbUNvdW50KTsKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJSZXRyaWV2aW5nICIgKyBpdGVtQ291bnQgKyAiIGl0ZW1zIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGl0ZW1Db3VudCA8PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIHdoaWxlIChpIDwgaXRlbUNvdW50KSB7CisgICAgICAgICAgICBpZiAocC5yZWFkSW50KCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBUIHBhcmNlbGFibGUgPSBwLnJlYWRQYXJjZWxhYmxlKG51bGwpOworICAgICAgICAgICAgbUxpc3QuYWRkKHBhcmNlbGFibGUpOworCisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWFkIGlubGluZSAjIiArIGkgKyAiOiAiICsgbUxpc3QuZ2V0KG1MaXN0LnNpemUoKSAtIDEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoaSA+PSBpdGVtQ291bnQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBJQmluZGVyIHJldHJpZXZlciA9IHAucmVhZFN0cm9uZ0JpbmRlcigpOworICAgICAgICB3aGlsZSAoaSA8IGl0ZW1Db3VudCkgeworICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVhZGluZyBtb3JlIEAiICsgaSArICIgb2YgIiArIGl0ZW1Db3VudCArICI6IHJldHJpZXZlcj0iICsgcmV0cmlldmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFBhcmNlbCBkYXRhID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICAgICAgUGFyY2VsIHJlcGx5ID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICAgICAgZGF0YS53cml0ZUludChpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0cmlldmVyLnRyYW5zYWN0KElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiwgZGF0YSwgcmVwbHksIDApOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsdXJlIHJldHJpZXZpbmcgYXJyYXk7IG9ubHkgcmVjZWl2ZWQgIiArIGkgKyAiIG9mICIgKyBpdGVtQ291bnQsIGUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChpIDwgaXRlbUNvdW50ICYmIHJlcGx5LnJlYWRJbnQoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVCBwYXJjZWxhYmxlID0gcmVwbHkucmVhZFBhcmNlbGFibGUobnVsbCk7CisgICAgICAgICAgICAgICAgbUxpc3QuYWRkKHBhcmNlbGFibGUpOworCisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJlYWQgZXh0cmEgIyIgKyBpICsgIjogIiArIG1MaXN0LmdldChtTGlzdC5zaXplKCkgLSAxKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgICAgIGRhdGEucmVjeWNsZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIExpc3Q8VD4gZ2V0TGlzdCgpIHsKKyAgICAgICAgcmV0dXJuIG1MaXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIHRoaXMgdG8gYW5vdGhlciBQYXJjZWwuIE5vdGUgdGhhdCB0aGlzIGRpc2NhcmRzIHRoZSBpbnRlcm5hbCBQYXJjZWwKKyAgICAgKiBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGFueW1vcmUuIFRoaXMgaXMgc28gd2UgY2FuIHBhc3MgdGhpcyB0byBhIEJpbmRlcgorICAgICAqIHdoZXJlIHdlIHdvbid0IGhhdmUgYSBjaGFuY2UgdG8gY2FsbCByZWN5Y2xlIG9uIHRoaXMuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgIGZpbmFsIGludCBpdGVtQ291bnQgPSBtTGlzdC5zaXplKCk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQoaXRlbUNvdW50KTsKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJXcml0aW5nICIgKyBpdGVtQ291bnQgKyAiIGl0ZW1zIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGl0ZW1Db3VudCA+IDApIHsKKyAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChpIDwgaXRlbUNvdW50ICYmIGRlc3QuZGF0YVNpemUoKSA8IE1BWF9JUENfU0laRSkgeworICAgICAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQoMSk7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBUIHBhcmNlbGFibGUgPSBtTGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgZGVzdC53cml0ZVBhcmNlbGFibGUocGFyY2VsYWJsZSwgZmxhZ3MpOworCisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIldyb3RlIGlubGluZSAjIiArIGkgKyAiOiAiICsgbUxpc3QuZ2V0KGkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgPCBpdGVtQ291bnQpIHsKKyAgICAgICAgICAgICAgICBkZXN0LndyaXRlSW50KDApOworICAgICAgICAgICAgICAgIEJpbmRlciByZXRyaWV2ZXIgPSBuZXcgQmluZGVyKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gb25UcmFuc2FjdChpbnQgY29kZSwgUGFyY2VsIGRhdGEsIFBhcmNlbCByZXBseSwgaW50IGZsYWdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgIT0gRklSU1RfQ0FMTF9UUkFOU0FDVElPTikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5vblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IGRhdGEucmVhZEludCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiV3JpdGluZyBtb3JlIEAiICsgaSArICIgb2YgIiArIGl0ZW1Db3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IGl0ZW1Db3VudCAmJiByZXBseS5kYXRhU2l6ZSgpIDwgTUFYX0lQQ19TSVpFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHkud3JpdGVJbnQoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUIHBhcmNlbGFibGUgPSBtTGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHkud3JpdGVQYXJjZWxhYmxlKHBhcmNlbGFibGUsIGZsYWdzKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJXcm90ZSBleHRyYSAjIiArIGkgKyAiOiAiICsgbUxpc3QuZ2V0KGkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBpdGVtQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQnJlYWtpbmcgQCIgKyBpICsgIiBvZiAiICsgaXRlbUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHkud3JpdGVJbnQoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkJyZWFraW5nIEAiICsgaSArICIgb2YgIiArIGl0ZW1Db3VudCArICI6IHJldHJpZXZlcj0iICsgcmV0cmlldmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVzdC53cml0ZVN0cm9uZ0JpbmRlcihyZXRyaWV2ZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICBpbnQgY29udGVudHMgPSAwOworICAgICAgICBmaW5hbCBMaXN0PFQ+IGxpc3QgPSBnZXRMaXN0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgY29udGVudHMgfD0gbGlzdC5nZXQoaSkuZGVzY3JpYmVDb250ZW50cygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb250ZW50czsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxNZWRpYVBhcmNlbGVkTGlzdFNsaWNlPiBDUkVBVE9SID0KKyAgICAgICAgICAgIG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8TWVkaWFQYXJjZWxlZExpc3RTbGljZT4oKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTWVkaWFQYXJjZWxlZExpc3RTbGljZSBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVBhcmNlbGVkTGlzdFNsaWNlKGluKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTWVkaWFQYXJjZWxlZExpc3RTbGljZVtdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhUGFyY2VsZWRMaXN0U2xpY2Vbc2l6ZV07CisgICAgICAgIH0KKyAgICB9OworfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL1JhdGluZy5haWRsIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL1JhdGluZy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYzMzNmEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvUmF0aW5nLmFpZGwKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworcGFyY2VsYWJsZSBSYXRpbmc7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvUmF0aW5nLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvUmF0aW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRkNTM2NAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9SYXRpbmcuamF2YQpAQCAtMCwwICsxLDMwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5JbnREZWY7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworCisvKioKKyAqIEEgY2xhc3MgdG8gZW5jYXBzdWxhdGUgcmF0aW5nIGluZm9ybWF0aW9uIHVzZWQgYXMgY29udGVudCBtZXRhZGF0YS4KKyAqIEEgcmF0aW5nIGlzIGRlZmluZWQgYnkgaXRzIHJhdGluZyBzdHlsZSAoc2VlIHtAbGluayAjUkFUSU5HX0hFQVJUfSwKKyAqIHtAbGluayAjUkFUSU5HX1RIVU1CX1VQX0RPV059LCB7QGxpbmsgI1JBVElOR18zX1NUQVJTfSwge0BsaW5rICNSQVRJTkdfNF9TVEFSU30sCisgKiB7QGxpbmsgI1JBVElOR181X1NUQVJTfSBvciB7QGxpbmsgI1JBVElOR19QRVJDRU5UQUdFfSkgYW5kIHRoZSBhY3R1YWwgcmF0aW5nIHZhbHVlICh3aGljaCBtYXkKKyAqIGJlIGRlZmluZWQgYXMgInVucmF0ZWQiKSwgYm90aCBvZiB3aGljaCBhcmUgZGVmaW5lZCB3aGVuIHRoZSByYXRpbmcgaW5zdGFuY2UgaXMgY29uc3RydWN0ZWQKKyAqIHRocm91Z2ggb25lIG9mIHRoZSBmYWN0b3J5IG1ldGhvZHMuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBSYXRpbmcgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHID0gIlJhdGluZyI7CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIEBJbnREZWYoe1JBVElOR19OT05FLCBSQVRJTkdfSEVBUlQsIFJBVElOR19USFVNQl9VUF9ET1dOLCBSQVRJTkdfM19TVEFSUywgUkFUSU5HXzRfU1RBUlMsCisgICAgICAgICAgICBSQVRJTkdfNV9TVEFSUywgUkFUSU5HX1BFUkNFTlRBR0V9KQorICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKKyAgICBwdWJsaWMgQGludGVyZmFjZSBTdHlsZSB7fQorCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBASW50RGVmKHtSQVRJTkdfM19TVEFSUywgUkFUSU5HXzRfU1RBUlMsIFJBVElOR181X1NUQVJTfSkKKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCisgICAgcHVibGljIEBpbnRlcmZhY2UgU3RhclN0eWxlIHt9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgYSByYXRpbmcgc3R5bGUgaXMgbm90IHN1cHBvcnRlZC4gQSBSYXRpbmcgd2lsbCBuZXZlciBoYXZlIHRoaXMKKyAgICAgKiB0eXBlLCBidXQgY2FuIGJlIHVzZWQgYnkgb3RoZXIgY2xhc3NlcyB0byBpbmRpY2F0ZSB0aGV5IGRvIG5vdCBzdXBwb3J0CisgICAgICogUmF0aW5nLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJBVElOR19OT05FID0gMDsKKworICAgIC8qKgorICAgICAqIEEgcmF0aW5nIHN0eWxlIHdpdGggYSBzaW5nbGUgZGVncmVlIG9mIHJhdGluZywgImhlYXJ0IiB2cyAibm8gaGVhcnQiLiBDYW4gYmUgdXNlZCB0bworICAgICAqIGluZGljYXRlIHRoZSBjb250ZW50IHJlZmVycmVkIHRvIGlzIGEgZmF2b3JpdGUgKG9yIG5vdCkuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUkFUSU5HX0hFQVJUID0gMTsKKworICAgIC8qKgorICAgICAqIEEgcmF0aW5nIHN0eWxlIGZvciAidGh1bWIgdXAiIHZzICJ0aHVtYiBkb3duIi4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBSQVRJTkdfVEhVTUJfVVBfRE9XTiA9IDI7CisKKyAgICAvKioKKyAgICAgKiBBIHJhdGluZyBzdHlsZSB3aXRoIDAgdG8gMyBzdGFycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBSQVRJTkdfM19TVEFSUyA9IDM7CisKKyAgICAvKioKKyAgICAgKiBBIHJhdGluZyBzdHlsZSB3aXRoIDAgdG8gNCBzdGFycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBSQVRJTkdfNF9TVEFSUyA9IDQ7CisKKyAgICAvKioKKyAgICAgKiBBIHJhdGluZyBzdHlsZSB3aXRoIDAgdG8gNSBzdGFycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBSQVRJTkdfNV9TVEFSUyA9IDU7CisKKyAgICAvKioKKyAgICAgKiBBIHJhdGluZyBzdHlsZSBleHByZXNzZWQgYXMgYSBwZXJjZW50YWdlLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJBVElOR19QRVJDRU5UQUdFID0gNjsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGZsb2F0IFJBVElOR19OT1RfUkFURUQgPSAtMS4wZjsKKworICAgIHByaXZhdGUgZmluYWwgaW50IG1SYXRpbmdTdHlsZTsKKworICAgIHByaXZhdGUgZmluYWwgZmxvYXQgbVJhdGluZ1ZhbHVlOworCisgICAgcHJpdmF0ZSBSYXRpbmcoQFN0eWxlIGludCByYXRpbmdTdHlsZSwgZmxvYXQgcmF0aW5nKSB7CisgICAgICAgIG1SYXRpbmdTdHlsZSA9IHJhdGluZ1N0eWxlOworICAgICAgICBtUmF0aW5nVmFsdWUgPSByYXRpbmc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJSYXRpbmc6c3R5bGU9IiArIG1SYXRpbmdTdHlsZSArICIgcmF0aW5nPSIKKyAgICAgICAgICAgICAgICArIChtUmF0aW5nVmFsdWUgPCAwLjBmID8gInVucmF0ZWQiIDogU3RyaW5nLnZhbHVlT2YobVJhdGluZ1ZhbHVlKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gbVJhdGluZ1N0eWxlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICBkZXN0LndyaXRlSW50KG1SYXRpbmdTdHlsZSk7CisgICAgICAgIGRlc3Qud3JpdGVGbG9hdChtUmF0aW5nVmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPFJhdGluZz4gQ1JFQVRPUgorICAgICAgICAgICAgPSBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPFJhdGluZz4oKSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZWJ1aWxkcyBhIFJhdGluZyBwcmV2aW91c2x5IHN0b3JlZCB3aXRoIHdyaXRlVG9QYXJjZWwoKS4KKyAgICAgICAgICogQHBhcmFtIHAgICAgUGFyY2VsIG9iamVjdCB0byByZWFkIHRoZSBSYXRpbmcgZnJvbQorICAgICAgICAgKiBAcmV0dXJuIGEgbmV3IFJhdGluZyBjcmVhdGVkIGZyb20gdGhlIGRhdGEgaW4gdGhlIHBhcmNlbAorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSYXRpbmcgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgcCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcocC5yZWFkSW50KCksIHAucmVhZEZsb2F0KCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSYXRpbmdbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmdbc2l6ZV07CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgUmF0aW5nIGluc3RhbmNlIHdpdGggbm8gcmF0aW5nLgorICAgICAqIENyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IFJhdGluZyBpbnN0YW5jZSB3aXRoIG5vIHJhdGluZyBrbm93biBmb3IgdGhlIGdpdmVuCisgICAgICogcmF0aW5nIHN0eWxlLgorICAgICAqIEBwYXJhbSByYXRpbmdTdHlsZSBvbmUgb2Yge0BsaW5rICNSQVRJTkdfSEVBUlR9LCB7QGxpbmsgI1JBVElOR19USFVNQl9VUF9ET1dOfSwKKyAgICAgKiAgICB7QGxpbmsgI1JBVElOR18zX1NUQVJTfSwge0BsaW5rICNSQVRJTkdfNF9TVEFSU30sIHtAbGluayAjUkFUSU5HXzVfU1RBUlN9LAorICAgICAqICAgIG9yIHtAbGluayAjUkFUSU5HX1BFUkNFTlRBR0V9LgorICAgICAqIEByZXR1cm4gbnVsbCBpZiBhbiBpbnZhbGlkIHJhdGluZyBzdHlsZSBpcyBwYXNzZWQsIGEgbmV3IFJhdGluZyBpbnN0YW5jZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBSYXRpbmcgbmV3VW5yYXRlZFJhdGluZyhAU3R5bGUgaW50IHJhdGluZ1N0eWxlKSB7CisgICAgICAgIHN3aXRjaChyYXRpbmdTdHlsZSkgeworICAgICAgICAgICAgY2FzZSBSQVRJTkdfSEVBUlQ6CisgICAgICAgICAgICBjYXNlIFJBVElOR19USFVNQl9VUF9ET1dOOgorICAgICAgICAgICAgY2FzZSBSQVRJTkdfM19TVEFSUzoKKyAgICAgICAgICAgIGNhc2UgUkFUSU5HXzRfU1RBUlM6CisgICAgICAgICAgICBjYXNlIFJBVElOR181X1NUQVJTOgorICAgICAgICAgICAgY2FzZSBSQVRJTkdfUEVSQ0VOVEFHRToKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJhdGluZyhyYXRpbmdTdHlsZSwgUkFUSU5HX05PVF9SQVRFRCk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgUmF0aW5nIGluc3RhbmNlIHdpdGggYSBoZWFydC1iYXNlZCByYXRpbmcuCisgICAgICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgUmF0aW5nIGluc3RhbmNlIHdpdGggYSByYXRpbmcgc3R5bGUgb2Yge0BsaW5rICNSQVRJTkdfSEVBUlR9LAorICAgICAqIGFuZCBhIGhlYXJ0LWJhc2VkIHJhdGluZy4KKyAgICAgKiBAcGFyYW0gaGFzSGVhcnQgdHJ1ZSBmb3IgYSAiaGVhcnQgc2VsZWN0ZWQiIHJhdGluZywgZmFsc2UgZm9yICJoZWFydCB1bnNlbGVjdGVkIi4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IFJhdGluZyBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFJhdGluZyBuZXdIZWFydFJhdGluZyhib29sZWFuIGhhc0hlYXJ0KSB7CisgICAgICAgIHJldHVybiBuZXcgUmF0aW5nKFJBVElOR19IRUFSVCwgaGFzSGVhcnQgPyAxLjBmIDogMC4wZik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgUmF0aW5nIGluc3RhbmNlIHdpdGggYSB0aHVtYi1iYXNlZCByYXRpbmcuCisgICAgICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgUmF0aW5nIGluc3RhbmNlIHdpdGggYSB7QGxpbmsgI1JBVElOR19USFVNQl9VUF9ET1dOfQorICAgICAqIHJhdGluZyBzdHlsZSwgYW5kIGEgInRodW1iIHVwIiBvciAidGh1bWIgZG93biIgcmF0aW5nLgorICAgICAqIEBwYXJhbSB0aHVtYklzVXAgdHJ1ZSBmb3IgYSAidGh1bWIgdXAiIHJhdGluZywgZmFsc2UgZm9yICJ0aHVtYiBkb3duIi4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IFJhdGluZyBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFJhdGluZyBuZXdUaHVtYlJhdGluZyhib29sZWFuIHRodW1iSXNVcCkgeworICAgICAgICByZXR1cm4gbmV3IFJhdGluZyhSQVRJTkdfVEhVTUJfVVBfRE9XTiwgdGh1bWJJc1VwID8gMS4wZiA6IDAuMGYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFJhdGluZyBpbnN0YW5jZSB3aXRoIGEgc3Rhci1iYXNlZCByYXRpbmcuCisgICAgICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgUmF0aW5nIGluc3RhbmNlIHdpdGggb25lIG9mIHRoZSBzdGFyLWJhc2UgcmF0aW5nIHN0eWxlcworICAgICAqIGFuZCB0aGUgZ2l2ZW4gaW50ZWdlciBvciBmcmFjdGlvbmFsIG51bWJlciBvZiBzdGFycy4gTm9uIGludGVnZXIgdmFsdWVzIGNhbiBmb3IgaW5zdGFuY2UKKyAgICAgKiBiZSB1c2VkIHRvIHJlcHJlc2VudCBhbiBhdmVyYWdlIHJhdGluZyB2YWx1ZSwgd2hpY2ggbWlnaHQgbm90IGJlIGFuIGludGVnZXIgbnVtYmVyIG9mIHN0YXJzLgorICAgICAqIEBwYXJhbSBzdGFyUmF0aW5nU3R5bGUgb25lIG9mIHtAbGluayAjUkFUSU5HXzNfU1RBUlN9LCB7QGxpbmsgI1JBVElOR180X1NUQVJTfSwKKyAgICAgKiAgICAge0BsaW5rICNSQVRJTkdfNV9TVEFSU30uCisgICAgICogQHBhcmFtIHN0YXJSYXRpbmcgYSBudW1iZXIgcmFuZ2luZyBmcm9tIDAuMGYgdG8gMy4wZiwgNC4wZiBvciA1LjBmIGFjY29yZGluZyB0bworICAgICAqICAgICB0aGUgcmF0aW5nIHN0eWxlLgorICAgICAqIEByZXR1cm4gbnVsbCBpZiB0aGUgcmF0aW5nIHN0eWxlIGlzIGludmFsaWQsIG9yIHRoZSByYXRpbmcgaXMgb3V0IG9mIHJhbmdlLAorICAgICAqICAgICBhIG5ldyBSYXRpbmcgaW5zdGFuY2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nIG5ld1N0YXJSYXRpbmcoQFN0YXJTdHlsZSBpbnQgc3RhclJhdGluZ1N0eWxlLCBmbG9hdCBzdGFyUmF0aW5nKSB7CisgICAgICAgIGZsb2F0IG1heFJhdGluZyA9IC0xLjBmOworICAgICAgICBzd2l0Y2goc3RhclJhdGluZ1N0eWxlKSB7CisgICAgICAgICAgICBjYXNlIFJBVElOR18zX1NUQVJTOgorICAgICAgICAgICAgICAgIG1heFJhdGluZyA9IDMuMGY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJBVElOR180X1NUQVJTOgorICAgICAgICAgICAgICAgIG1heFJhdGluZyA9IDQuMGY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJBVElOR181X1NUQVJTOgorICAgICAgICAgICAgICAgIG1heFJhdGluZyA9IDUuMGY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkludmFsaWQgcmF0aW5nIHN0eWxlICgiICsgc3RhclJhdGluZ1N0eWxlICsgIikgZm9yIGEgc3RhciByYXRpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGlmICgoc3RhclJhdGluZyA8IDAuMGYpIHx8IChzdGFyUmF0aW5nID4gbWF4UmF0aW5nKSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiVHJ5aW5nIHRvIHNldCBvdXQgb2YgcmFuZ2Ugc3Rhci1iYXNlZCByYXRpbmciKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgUmF0aW5nKHN0YXJSYXRpbmdTdHlsZSwgc3RhclJhdGluZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgUmF0aW5nIGluc3RhbmNlIHdpdGggYSBwZXJjZW50YWdlLWJhc2VkIHJhdGluZy4KKyAgICAgKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBSYXRpbmcgaW5zdGFuY2Ugd2l0aCBhIHtAbGluayAjUkFUSU5HX1BFUkNFTlRBR0V9CisgICAgICogcmF0aW5nIHN0eWxlLCBhbmQgYSByYXRpbmcgb2YgdGhlIGdpdmVuIHBlcmNlbnRhZ2UuCisgICAgICogQHBhcmFtIHBlcmNlbnQgdGhlIHZhbHVlIG9mIHRoZSByYXRpbmcKKyAgICAgKiBAcmV0dXJuIG51bGwgaWYgdGhlIHJhdGluZyBpcyBvdXQgb2YgcmFuZ2UsIGEgbmV3IFJhdGluZyBpbnN0YW5jZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBSYXRpbmcgbmV3UGVyY2VudGFnZVJhdGluZyhmbG9hdCBwZXJjZW50KSB7CisgICAgICAgIGlmICgocGVyY2VudCA8IDAuMGYpIHx8IChwZXJjZW50ID4gMTAwLjBmKSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiSW52YWxpZCBwZXJjZW50YWdlLWJhc2VkIHJhdGluZyB2YWx1ZSIpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJhdGluZyhSQVRJTkdfUEVSQ0VOVEFHRSwgcGVyY2VudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBpcyBhIHJhdGluZyB2YWx1ZSBhdmFpbGFibGUuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBpbnN0YW5jZSB3YXMgbm90IGNyZWF0ZWQgd2l0aCB7QGxpbmsgI25ld1VucmF0ZWRSYXRpbmcoaW50KX0uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNSYXRlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1SYXRpbmdWYWx1ZSA+PSAwLjBmOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmF0aW5nIHN0eWxlLgorICAgICAqIEByZXR1cm4gb25lIG9mIHtAbGluayAjUkFUSU5HX0hFQVJUfSwge0BsaW5rICNSQVRJTkdfVEhVTUJfVVBfRE9XTn0sCisgICAgICogICAge0BsaW5rICNSQVRJTkdfM19TVEFSU30sIHtAbGluayAjUkFUSU5HXzRfU1RBUlN9LCB7QGxpbmsgI1JBVElOR181X1NUQVJTfSwKKyAgICAgKiAgICBvciB7QGxpbmsgI1JBVElOR19QRVJDRU5UQUdFfS4KKyAgICAgKi8KKyAgICBAU3R5bGUKKyAgICBwdWJsaWMgaW50IGdldFJhdGluZ1N0eWxlKCkgeworICAgICAgICByZXR1cm4gbVJhdGluZ1N0eWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSByYXRpbmcgaXMgImhlYXJ0IHNlbGVjdGVkIi4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJhdGluZyBpcyAiaGVhcnQgc2VsZWN0ZWQiLCBmYWxzZSBpZiB0aGUgcmF0aW5nIGlzICJoZWFydCB1bnNlbGVjdGVkIiwKKyAgICAgKiAgICBpZiB0aGUgcmF0aW5nIHN0eWxlIGlzIG5vdCB7QGxpbmsgI1JBVElOR19IRUFSVH0gb3IgaWYgaXQgaXMgdW5yYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNIZWFydCgpIHsKKyAgICAgICAgaWYgKG1SYXRpbmdTdHlsZSAhPSBSQVRJTkdfSEVBUlQpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAobVJhdGluZ1ZhbHVlID09IDEuMGYpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIHJhdGluZyBpcyAidGh1bWIgdXAiLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmF0aW5nIGlzICJ0aHVtYiB1cCIsIGZhbHNlIGlmIHRoZSByYXRpbmcgaXMgInRodW1iIGRvd24iLAorICAgICAqICAgIGlmIHRoZSByYXRpbmcgc3R5bGUgaXMgbm90IHtAbGluayAjUkFUSU5HX1RIVU1CX1VQX0RPV059IG9yIGlmIGl0IGlzIHVucmF0ZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNUaHVtYlVwKCkgeworICAgICAgICBpZiAobVJhdGluZ1N0eWxlICE9IFJBVElOR19USFVNQl9VUF9ET1dOKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gKG1SYXRpbmdWYWx1ZSA9PSAxLjBmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc3Rhci1iYXNlZCByYXRpbmcgdmFsdWUuCisgICAgICogQHJldHVybiBhIHJhdGluZyB2YWx1ZSBncmVhdGVyIG9yIGVxdWFsIHRvIDAuMGYsIG9yIGEgbmVnYXRpdmUgdmFsdWUgaWYgdGhlIHJhdGluZyBzdHlsZSBpcworICAgICAqICAgIG5vdCBzdGFyLWJhc2VkLCBvciBpZiBpdCBpcyB1bnJhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRTdGFyUmF0aW5nKCkgeworICAgICAgICBzd2l0Y2ggKG1SYXRpbmdTdHlsZSkgeworICAgICAgICAgICAgY2FzZSBSQVRJTkdfM19TVEFSUzoKKyAgICAgICAgICAgIGNhc2UgUkFUSU5HXzRfU1RBUlM6CisgICAgICAgICAgICBjYXNlIFJBVElOR181X1NUQVJTOgorICAgICAgICAgICAgICAgIGlmIChpc1JhdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1SYXRpbmdWYWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiAtMS4wZjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcGVyY2VudGFnZS1iYXNlZCByYXRpbmcgdmFsdWUuCisgICAgICogQHJldHVybiBhIHJhdGluZyB2YWx1ZSBncmVhdGVyIG9yIGVxdWFsIHRvIDAuMGYsIG9yIGEgbmVnYXRpdmUgdmFsdWUgaWYgdGhlIHJhdGluZyBzdHlsZSBpcworICAgICAqICAgIG5vdCBwZXJjZW50YWdlLWJhc2VkLCBvciBpZiBpdCBpcyB1bnJhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRQZXJjZW50UmF0aW5nKCkgeworICAgICAgICBpZiAoKG1SYXRpbmdTdHlsZSAhPSBSQVRJTkdfUEVSQ0VOVEFHRSkgfHwgIWlzUmF0ZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIC0xLjBmOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG1SYXRpbmdWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9Wb2x1bWVQcm92aWRlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL1ZvbHVtZVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMwMTdjNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9Wb2x1bWVQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5JbnREZWY7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CisKKy8qKgorICogSGFuZGxlcyByZXF1ZXN0cyB0byBhZGp1c3Qgb3Igc2V0IHRoZSB2b2x1bWUgb24gYSBzZXNzaW9uLiBUaGlzIGlzIGFsc28gdXNlZAorICogdG8gcHVzaCB2b2x1bWUgdXBkYXRlcyBiYWNrIHRvIHRoZSBzZXNzaW9uLiBUaGUgcHJvdmlkZXIgbXVzdCBjYWxsCisgKiB7QGxpbmsgI3NldEN1cnJlbnRWb2x1bWUoaW50KX0gZWFjaCB0aW1lIHRoZSB2b2x1bWUgYmVpbmcgcHJvdmlkZWQgY2hhbmdlcy4KKyAqIDxwPgorICogWW91IGNhbiBzZXQgYSB2b2x1bWUgcHJvdmlkZXIgb24gYSBzZXNzaW9uIGJ5IGNhbGxpbmcKKyAqIHtAbGluayBNZWRpYVNlc3Npb24jc2V0UGxheWJhY2tUb1JlbW90ZX0uCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBWb2x1bWVQcm92aWRlciB7CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIEBJbnREZWYoe1ZPTFVNRV9DT05UUk9MX0ZJWEVELCBWT0xVTUVfQ09OVFJPTF9SRUxBVElWRSwgVk9MVU1FX0NPTlRST0xfQUJTT0xVVEV9KQorICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKKyAgICBwdWJsaWMgQGludGVyZmFjZSBDb250cm9sVHlwZSB7fQorCisgICAgLyoqCisgICAgICogVGhlIHZvbHVtZSBpcyBmaXhlZCBhbmQgY2FuIG5vdCBiZSBtb2RpZmllZC4gUmVxdWVzdHMgdG8gY2hhbmdlIHZvbHVtZQorICAgICAqIHNob3VsZCBiZSBpZ25vcmVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZPTFVNRV9DT05UUk9MX0ZJWEVEID0gMDsKKworICAgIC8qKgorICAgICAqIFRoZSB2b2x1bWUgY29udHJvbCB1c2VzIHJlbGF0aXZlIGFkanVzdG1lbnQgdmlhCisgICAgICoge0BsaW5rICNvbkFkanVzdFZvbHVtZShpbnQpfS4gQXR0ZW1wdHMgdG8gc2V0IHRoZSB2b2x1bWUgdG8gYSBzcGVjaWZpYworICAgICAqIHZhbHVlIHNob3VsZCBiZSBpZ25vcmVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZPTFVNRV9DT05UUk9MX1JFTEFUSVZFID0gMTsKKworICAgIC8qKgorICAgICAqIFRoZSB2b2x1bWUgY29udHJvbCB1c2VzIGFuIGFic29sdXRlIHZhbHVlLiBJdCBtYXkgYmUgYWRqdXN0ZWQgdXNpbmcKKyAgICAgKiB7QGxpbmsgI29uQWRqdXN0Vm9sdW1lKGludCl9IG9yIHNldCBkaXJlY3RseSB1c2luZworICAgICAqIHtAbGluayAjb25TZXRWb2x1bWVUbyhpbnQpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWT0xVTUVfQ09OVFJPTF9BQlNPTFVURSA9IDI7CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBtQ29udHJvbFR5cGU7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU1heFZvbHVtZTsKKyAgICBwcml2YXRlIGludCBtQ3VycmVudFZvbHVtZTsKKyAgICBwcml2YXRlIENhbGxiYWNrIG1DYWxsYmFjazsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyB2b2x1bWUgcHJvdmlkZXIgZm9yIGhhbmRsaW5nIHZvbHVtZSBldmVudHMuIFlvdSBtdXN0IHNwZWNpZnkKKyAgICAgKiB0aGUgdHlwZSBvZiB2b2x1bWUgY29udHJvbCwgdGhlIG1heGltdW0gdm9sdW1lIHRoYXQgY2FuIGJlIHVzZWQsIGFuZCB0aGUKKyAgICAgKiBjdXJyZW50IHZvbHVtZSBvbiB0aGUgb3V0cHV0LgorICAgICAqCisgICAgICogQHBhcmFtIHZvbHVtZUNvbnRyb2wgVGhlIG1ldGhvZCBmb3IgY29udHJvbGxpbmcgdm9sdW1lIHRoYXQgaXMgdXNlZCBieQorICAgICAqICAgICAgICAgICAgdGhpcyBwcm92aWRlci4KKyAgICAgKiBAcGFyYW0gbWF4Vm9sdW1lIFRoZSBtYXhpbXVtIGFsbG93ZWQgdm9sdW1lLgorICAgICAqIEBwYXJhbSBjdXJyZW50Vm9sdW1lIFRoZSBjdXJyZW50IHZvbHVtZSBvbiB0aGUgb3V0cHV0LgorICAgICAqLworICAgIHB1YmxpYyBWb2x1bWVQcm92aWRlcihAQ29udHJvbFR5cGUgaW50IHZvbHVtZUNvbnRyb2wsIGludCBtYXhWb2x1bWUsIGludCBjdXJyZW50Vm9sdW1lKSB7CisgICAgICAgIG1Db250cm9sVHlwZSA9IHZvbHVtZUNvbnRyb2w7CisgICAgICAgIG1NYXhWb2x1bWUgPSBtYXhWb2x1bWU7CisgICAgICAgIG1DdXJyZW50Vm9sdW1lID0gY3VycmVudFZvbHVtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZvbHVtZSBjb250cm9sIHR5cGUgdGhhdCB0aGlzIHZvbHVtZSBwcm92aWRlciB1c2VzLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgdm9sdW1lIGNvbnRyb2wgdHlwZSBmb3IgdGhpcyB2b2x1bWUgcHJvdmlkZXIKKyAgICAgKi8KKyAgICBAQ29udHJvbFR5cGUKKyAgICBwdWJsaWMgZmluYWwgaW50IGdldFZvbHVtZUNvbnRyb2woKSB7CisgICAgICAgIHJldHVybiBtQ29udHJvbFR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBtYXhpbXVtIHZvbHVtZSB0aGlzIHByb3ZpZGVyIGFsbG93cy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG1heCBhbGxvd2VkIHZvbHVtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IGdldE1heFZvbHVtZSgpIHsKKyAgICAgICAgcmV0dXJuIG1NYXhWb2x1bWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY3VycmVudCB2b2x1bWUuIFRoaXMgd2lsbCBiZSB0aGUgbGFzdCB2YWx1ZSBzZXQgYnkKKyAgICAgKiB7QGxpbmsgI3NldEN1cnJlbnRWb2x1bWUoaW50KX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHZvbHVtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IGdldEN1cnJlbnRWb2x1bWUoKSB7CisgICAgICAgIHJldHVybiBtQ3VycmVudFZvbHVtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgdGhlIHN5c3RlbSB0aGF0IHRoZSBjdXJyZW50IHZvbHVtZSBoYXMgYmVlbiBjaGFuZ2VkLiBUaGlzIG11c3QgYmUKKyAgICAgKiBjYWxsZWQgZXZlcnkgdGltZSB0aGUgdm9sdW1lIGNoYW5nZXMgdG8gZW5zdXJlIGl0IGlzIGRpc3BsYXllZCBwcm9wZXJseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjdXJyZW50Vm9sdW1lIFRoZSBjdXJyZW50IHZvbHVtZSBvbiB0aGUgb3V0cHV0LgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldEN1cnJlbnRWb2x1bWUoaW50IGN1cnJlbnRWb2x1bWUpIHsKKyAgICAgICAgbUN1cnJlbnRWb2x1bWUgPSBjdXJyZW50Vm9sdW1lOworICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DYWxsYmFjay5vblZvbHVtZUNoYW5nZWQodGhpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSB0byBoYW5kbGUgcmVxdWVzdHMgdG8gc2V0IHRoZSB2b2x1bWUgb2YgdGhlIGN1cnJlbnQgb3V0cHV0LgorICAgICAqIEFmdGVyIHRoZSB2b2x1bWUgaGFzIGJlZW4gbW9kaWZpZWQge0BsaW5rICNzZXRDdXJyZW50Vm9sdW1lfSBtdXN0IGJlCisgICAgICogY2FsbGVkIHRvIG5vdGlmeSB0aGUgc3lzdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIHZvbHVtZSBUaGUgdm9sdW1lIHRvIHNldCB0aGUgb3V0cHV0IHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uU2V0Vm9sdW1lVG8oaW50IHZvbHVtZSkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRvIGhhbmRsZSByZXF1ZXN0cyB0byBhZGp1c3QgdGhlIHZvbHVtZSBvZiB0aGUgY3VycmVudCBvdXRwdXQuCisgICAgICogRGlyZWN0aW9uIHdpbGwgYmUgb25lIG9mIHtAbGluayBBdWRpb01hbmFnZXIjQURKVVNUX0xPV0VSfSwKKyAgICAgKiB7QGxpbmsgQXVkaW9NYW5hZ2VyI0FESlVTVF9SQUlTRX0sIHtAbGluayBBdWRpb01hbmFnZXIjQURKVVNUX1NBTUV9LgorICAgICAqIEFmdGVyIHRoZSB2b2x1bWUgaGFzIGJlZW4gbW9kaWZpZWQge0BsaW5rICNzZXRDdXJyZW50Vm9sdW1lfSBtdXN0IGJlCisgICAgICogY2FsbGVkIHRvIG5vdGlmeSB0aGUgc3lzdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIGRpcmVjdGlvbiBUaGUgZGlyZWN0aW9uIHRvIGNoYW5nZSB0aGUgdm9sdW1lIGluLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQWRqdXN0Vm9sdW1lKGludCBkaXJlY3Rpb24pIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgY2FsbGJhY2sgdG8gcmVjZWl2ZSB2b2x1bWUgY2hhbmdlcy4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENhbGxiYWNrKENhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgIH0KKworICAgIC8qKgorICAgICAqIExpc3RlbnMgZm9yIGNoYW5nZXMgdG8gdGhlIHZvbHVtZS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ2FsbGJhY2sgeworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblZvbHVtZUNoYW5nZWQoVm9sdW1lUHJvdmlkZXIgdm9sdW1lUHJvdmlkZXIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9icm93c2UvTWVkaWFCcm93c2VyLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvYnJvd3NlL01lZGlhQnJvd3Nlci5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MmUwOTQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvYnJvd3NlL01lZGlhQnJvd3Nlci5haWRsCkBAIC0wLDAgKzEsMTggQEAKKy8qIENvcHlyaWdodCAyMDE0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEuYnJvd3NlOworCitwYXJjZWxhYmxlIE1lZGlhQnJvd3Nlci5NZWRpYUl0ZW07ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL2Jyb3dzZS9NZWRpYUJyb3dzZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9icm93c2UvTWVkaWFCcm93c2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFiMTRjNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9icm93c2UvTWVkaWFCcm93c2VyLmphdmEKQEAgLTAsMCArMSwxMTcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLmJyb3dzZTsKKworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5JbnREZWY7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFEZXNjcmlwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGFyY2VsZWRMaXN0U2xpY2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhQ29udHJvbGxlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uOworaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLm1lZGlhLklNZWRpYUJyb3dzZXJTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5tZWRpYS5JTWVkaWFCcm93c2VyU2VydmljZUNhbGxiYWNrczsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UubWVkaWEuTWVkaWFCcm93c2VyU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5BcnJheU1hcDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworCisvKioKKyAqIEJyb3dzZXMgbWVkaWEgY29udGVudCBvZmZlcmVkIGJ5IGEgbGluayBNZWRpYUJyb3dzZXJTZXJ2aWNlLgorICogPHA+CisgKiBUaGlzIG9iamVjdCBpcyBub3QgdGhyZWFkLXNhZmUuIEFsbCBjYWxscyBzaG91bGQgaGFwcGVuIG9uIHRoZSB0aHJlYWQgb24gd2hpY2ggdGhlIGJyb3dzZXIKKyAqIHdhcyBjb25zdHJ1Y3RlZC4KKyAqIDwvcD4KKyAqIDxoMz5TdGFuZGFyZCBFeHRyYSBEYXRhPC9oMz4KKyAqCisgKiA8cD5UaGVzZSBhcmUgdGhlIGN1cnJlbnQgc3RhbmRhcmQgZmllbGRzIHRoYXQgY2FuIGJlIHVzZWQgYXMgZXh0cmEgZGF0YSB2aWEKKyAqIHtAbGluayAjc3Vic2NyaWJlKFN0cmluZywgQnVuZGxlLCBTdWJzY3JpcHRpb25DYWxsYmFjayl9LAorICoge0BsaW5rICN1bnN1YnNjcmliZShTdHJpbmcsIFN1YnNjcmlwdGlvbkNhbGxiYWNrKX0sIGFuZAorICoge0BsaW5rIFN1YnNjcmlwdGlvbkNhbGxiYWNrI29uQ2hpbGRyZW5Mb2FkZWQoU3RyaW5nLCBMaXN0LCBCdW5kbGUpfS4KKyAqCisgKiA8dWw+CisgKiAgICAgPGxpPiB7QGxpbmsgI0VYVFJBX1BBR0V9CisgKiAgICAgPGxpPiB7QGxpbmsgI0VYVFJBX1BBR0VfU0laRX0KKyAqIDwvdWw+CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYUJyb3dzZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFCcm93c2VyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogVXNlZCBhcyBhbiBpbnQgZXh0cmEgZmllbGQgdG8gZGVub3RlIHRoZSBwYWdlIG51bWJlciB0byBzdWJzY3JpYmUuCisgICAgICogVGhlIHZhbHVlIG9mIHtAY29kZSBFWFRSQV9QQUdFfSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAuCisgICAgICoKKyAgICAgKiBAc2VlICNFWFRSQV9QQUdFX1NJWkUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QQUdFID0gImFuZHJvaWQubWVkaWEuYnJvd3NlLmV4dHJhLlBBR0UiOworCisgICAgLyoqCisgICAgICogVXNlZCBhcyBhbiBpbnQgZXh0cmEgZmllbGQgdG8gZGVub3RlIHRoZSBudW1iZXIgb2YgbWVkaWEgaXRlbXMgaW4gYSBwYWdlLgorICAgICAqIFRoZSB2YWx1ZSBvZiB7QGNvZGUgRVhUUkFfUEFHRV9TSVpFfSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEuCisgICAgICoKKyAgICAgKiBAc2VlICNFWFRSQV9QQUdFCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfUEFHRV9TSVpFID0gImFuZHJvaWQubWVkaWEuYnJvd3NlLmV4dHJhLlBBR0VfU0laRSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9TVEFURV9ESVNDT05ORUNUSU5HID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9TVEFURV9ESVNDT05ORUNURUQgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX1NUQVRFX0NPTk5FQ1RJTkcgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX1NUQVRFX0NPTk5FQ1RFRCA9IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RfU1RBVEVfU1VTUEVOREVEID0gNDsKKworICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIGZpbmFsIENvbXBvbmVudE5hbWUgbVNlcnZpY2VDb21wb25lbnQ7CisgICAgcHJpdmF0ZSBmaW5hbCBDb25uZWN0aW9uQ2FsbGJhY2sgbUNhbGxiYWNrOworICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1Sb290SGludHM7CisgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TWFwPFN0cmluZywgU3Vic2NyaXB0aW9uPiBtU3Vic2NyaXB0aW9ucyA9IG5ldyBBcnJheU1hcDw+KCk7CisKKyAgICBwcml2YXRlIHZvbGF0aWxlIGludCBtU3RhdGUgPSBDT05ORUNUX1NUQVRFX0RJU0NPTk5FQ1RFRDsKKyAgICBwcml2YXRlIHZvbGF0aWxlIFN0cmluZyBtUm9vdElkOworICAgIHByaXZhdGUgdm9sYXRpbGUgTWVkaWFTZXNzaW9uLlRva2VuIG1NZWRpYVNlc3Npb25Ub2tlbjsKKyAgICBwcml2YXRlIHZvbGF0aWxlIEJ1bmRsZSBtRXh0cmFzOworCisgICAgcHJpdmF0ZSBNZWRpYVNlcnZpY2VDb25uZWN0aW9uIG1TZXJ2aWNlQ29ubmVjdGlvbjsKKyAgICBwcml2YXRlIElNZWRpYUJyb3dzZXJTZXJ2aWNlIG1TZXJ2aWNlQmluZGVyOworICAgIHByaXZhdGUgSU1lZGlhQnJvd3NlclNlcnZpY2VDYWxsYmFja3MgbVNlcnZpY2VDYWxsYmFja3M7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbWVkaWEgYnJvd3NlciBmb3IgdGhlIHNwZWNpZmllZCBtZWRpYSBicm93c2VyIHNlcnZpY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dC4KKyAgICAgKiBAcGFyYW0gc2VydmljZUNvbXBvbmVudCBUaGUgY29tcG9uZW50IG5hbWUgb2YgdGhlIG1lZGlhIGJyb3dzZXIgc2VydmljZS4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNvbm5lY3Rpb24gY2FsbGJhY2suCisgICAgICogQHBhcmFtIHJvb3RIaW50cyBBbiBvcHRpb25hbCBidW5kbGUgb2Ygc2VydmljZS1zcGVjaWZpYyBhcmd1bWVudHMgdG8gc2VuZAorICAgICAqIHRvIHRoZSBtZWRpYSBicm93c2VyIHNlcnZpY2Ugd2hlbiBjb25uZWN0aW5nIGFuZCByZXRyaWV2aW5nIHRoZSByb290IGlkCisgICAgICogZm9yIGJyb3dzaW5nLCBvciBudWxsIGlmIG5vbmUuIFRoZSBjb250ZW50cyBvZiB0aGlzIGJ1bmRsZSBtYXkgYWZmZWN0CisgICAgICogdGhlIGluZm9ybWF0aW9uIHJldHVybmVkIHdoZW4gYnJvd3NpbmcuCisgICAgICogQHNlZSBhbmRyb2lkLnNlcnZpY2UubWVkaWEuTWVkaWFCcm93c2VyU2VydmljZS5Ccm93c2VyUm9vdCNFWFRSQV9SRUNFTlQKKyAgICAgKiBAc2VlIGFuZHJvaWQuc2VydmljZS5tZWRpYS5NZWRpYUJyb3dzZXJTZXJ2aWNlLkJyb3dzZXJSb290I0VYVFJBX09GRkxJTkUKKyAgICAgKiBAc2VlIGFuZHJvaWQuc2VydmljZS5tZWRpYS5NZWRpYUJyb3dzZXJTZXJ2aWNlLkJyb3dzZXJSb290I0VYVFJBX1NVR0dFU1RFRAorICAgICAqLworICAgIHB1YmxpYyBNZWRpYUJyb3dzZXIoQ29udGV4dCBjb250ZXh0LCBDb21wb25lbnROYW1lIHNlcnZpY2VDb21wb25lbnQsCisgICAgICAgICAgICBDb25uZWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2ssIEJ1bmRsZSByb290SGludHMpIHsKKyAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udGV4dCBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNlcnZpY2VDb21wb25lbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VydmljZSBjb21wb25lbnQgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb25uZWN0aW9uIGNhbGxiYWNrIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1TZXJ2aWNlQ29tcG9uZW50ID0gc2VydmljZUNvbXBvbmVudDsKKyAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgIG1Sb290SGludHMgPSByb290SGludHMgPT0gbnVsbCA/IG51bGwgOiBuZXcgQnVuZGxlKHJvb3RIaW50cyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29ubmVjdHMgdG8gdGhlIG1lZGlhIGJyb3dzZXIgc2VydmljZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY29ubmVjdGlvbiBjYWxsYmFjayBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yIHdpbGwgYmUgaW52b2tlZAorICAgICAqIHdoZW4gdGhlIGNvbm5lY3Rpb24gY29tcGxldGVzIG9yIGZhaWxzLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0KCkgeworICAgICAgICBpZiAobVN0YXRlICE9IENPTk5FQ1RfU1RBVEVfRElTQ09OTkVDVElORyAmJiBtU3RhdGUgIT0gQ09OTkVDVF9TVEFURV9ESVNDT05ORUNURUQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNvbm5lY3QoKSBjYWxsZWQgd2hpbGUgbmVpdGhlciBkaXNjb25uZWN0aW5nIG5vciAiCisgICAgICAgICAgICAgICAgICAgICsgImRpc2Nvbm5lY3RlZCAoc3RhdGU9IiArIGdldFN0YXRlTGFiZWwobVN0YXRlKSArICIpIik7CisgICAgICAgIH0KKworICAgICAgICBtU3RhdGUgPSBDT05ORUNUX1NUQVRFX0NPTk5FQ1RJTkc7CisgICAgICAgIG1IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBDT05ORUNUX1NUQVRFX0RJU0NPTk5FQ1RJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtU3RhdGUgPSBDT05ORUNUX1NUQVRFX0NPTk5FQ1RJTkc7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgZXh0cmEgY2hlY2suCisgICAgICAgICAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgICAgICAgICBpZiAobVNlcnZpY2VDb25uZWN0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJtU2VydmljZUNvbm5lY3Rpb24gc2hvdWxkIGJlIG51bGwuIEluc3RlYWQgaXQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyAiICsgbVNlcnZpY2VDb25uZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobVNlcnZpY2VCaW5kZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigibVNlcnZpY2VCaW5kZXIgc2hvdWxkIGJlIG51bGwuIEluc3RlYWQgaXQgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbVNlcnZpY2VCaW5kZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobVNlcnZpY2VDYWxsYmFja3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigibVNlcnZpY2VDYWxsYmFja3Mgc2hvdWxkIGJlIG51bGwuIEluc3RlYWQgaXQgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbVNlcnZpY2VDYWxsYmFja3MpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQnJvd3NlclNlcnZpY2UuU0VSVklDRV9JTlRFUkZBQ0UpOworICAgICAgICAgICAgICAgIGludGVudC5zZXRDb21wb25lbnQobVNlcnZpY2VDb21wb25lbnQpOworCisgICAgICAgICAgICAgICAgbVNlcnZpY2VDb25uZWN0aW9uID0gbmV3IE1lZGlhU2VydmljZUNvbm5lY3Rpb24oKTsKKworICAgICAgICAgICAgICAgIGJvb2xlYW4gYm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBib3VuZCA9IG1Db250ZXh0LmJpbmRTZXJ2aWNlKGludGVudCwgbVNlcnZpY2VDb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQuQklORF9BVVRPX0NSRUFURSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCBiaW5kaW5nIHRvIHNlcnZpY2UgIiArIG1TZXJ2aWNlQ29tcG9uZW50KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRlbGwgdGhlbSB0aGF0IGl0IGRpZG4ndCB3b3JrLgorICAgICAgICAgICAgICAgICAgICBmb3JjZUNsb3NlQ29ubmVjdGlvbigpOworICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25Db25uZWN0aW9uRmFpbGVkKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJjb25uZWN0Li4uIik7CisgICAgICAgICAgICAgICAgICAgIGR1bXAoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc2Nvbm5lY3RzIGZyb20gdGhlIG1lZGlhIGJyb3dzZXIgc2VydmljZS4KKyAgICAgKiBBZnRlciB0aGlzLCBubyBtb3JlIGNhbGxiYWNrcyB3aWxsIGJlIHJlY2VpdmVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoKSB7CisgICAgICAgIC8vIEl0J3Mgb2sgdG8gY2FsbCB0aGlzIGFueSBzdGF0ZSwgYmVjYXVzZSBhbGxvd2luZyB0aGlzIGxldHMgYXBwcyBub3QgaGF2ZQorICAgICAgICAvLyB0byBjaGVjayBpc0Nvbm5lY3RlZCgpIHVubmVjZXNzYXJpbHkuIFRoZXkgd29uJ3QgYXBwcmVjaWF0ZSB0aGUgZXh0cmEKKyAgICAgICAgLy8gYXNzZXJ0aW9ucyBmb3IgdGhpcy4gV2UgZG8gZXZlcnl0aGluZyB3ZSBjYW4gaGVyZSB0byBnbyBiYWNrIHRvIGEgc2FuZSBzdGF0ZS4KKyAgICAgICAgbVN0YXRlID0gQ09OTkVDVF9TVEFURV9ESVNDT05ORUNUSU5HOworICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIC8vIGNvbm5lY3QoKSBjb3VsZCBiZSBjYWxsZWQgYmVmb3JlIHRoaXMuIFRoZW4gd2Ugd2lsbCBkaXNjb25uZWN0IGFuZCByZWNvbm5lY3QuCisgICAgICAgICAgICAgICAgaWYgKG1TZXJ2aWNlQ2FsbGJhY2tzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlQmluZGVyLmRpc2Nvbm5lY3QobVNlcnZpY2VDYWxsYmFja3MpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBkaXNjb25uZWN0aW5nIGFueXdheS4gTG9nLCBqdXN0IGZvciBwb3N0ZXJpdHkgYnV0IGl0J3Mgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGJpZyBwcm9ibGVtLgorICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiUmVtb3RlRXhjZXB0aW9uIGR1cmluZyBjb25uZWN0IGZvciAiICsgbVNlcnZpY2VDb21wb25lbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBzdGF0ZSA9IG1TdGF0ZTsKKyAgICAgICAgICAgICAgICBmb3JjZUNsb3NlQ29ubmVjdGlvbigpOworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzdGF0ZSB3YXMgbm90IENPTk5FQ1RfU1RBVEVfRElTQ09OTkVDVElORywga2VlcCB0aGUgc3RhdGUgc28gdGhhdAorICAgICAgICAgICAgICAgIC8vIHRoZSBvcGVyYXRpb24gY2FtZSBhZnRlciBkaXNjb25uZWN0KCkgY2FuIGJlIGhhbmRsZWQgcHJvcGVybHkuCisgICAgICAgICAgICAgICAgaWYgKHN0YXRlICE9IENPTk5FQ1RfU1RBVEVfRElTQ09OTkVDVElORykgeworICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJkaXNjb25uZWN0Li4uIik7CisgICAgICAgICAgICAgICAgICAgIGR1bXAoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIE51bGwgb3V0IHRoZSB2YXJpYWJsZXMgYW5kIHVuYmluZCBmcm9tIHRoZSBzZXJ2aWNlLiBUaGlzIGRvZXNuJ3QgaW5jbHVkZQorICAgICAqIGNhbGxpbmcgZGlzY29ubmVjdCBvbiB0aGUgc2VydmljZSwgYmVjYXVzZSB3ZSBvbmx5IHRyeSB0byBkbyB0aGF0IGluIHRoZQorICAgICAqIGNsZWFuIHNodXRkb3duIGNhc2VzLgorICAgICAqIDxwPgorICAgICAqIEV2ZXJ5d2hlcmUgdGhhdCBjYWxscyB0aGlzIEVYQ0VQVCBmb3IgZGlzY29ubmVjdCgpIHNob3VsZCBmb2xsb3cgaXQgd2l0aAorICAgICAqIGEgY2FsbCB0byBtQ2FsbGJhY2sub25Db25uZWN0aW9uRmFpbGVkKCkuIERpc2Nvbm5lY3QgZG9lc24ndCBkbyB0aGF0IGNhbGxiYWNrCisgICAgICogZm9yIGEgY2xlYW4gc2h1dGRvd24sIGJ1dCBldmVyeXdoZXJlIGVsc2UgaXMgYSBkaXJ0eSBzaHV0ZG93biBhbmQgc2hvdWxkCisgICAgICogbm90aWZ5IHRoZSBhcHAuCisgICAgICogPHA+CisgICAgICogQWxzbywgbVN0YXRlIHNob3VsZCBiZSB1cGRhdGVkIHByb3Blcmx5LiBNb3N0bHkgaXQgc2hvdWxkIGJlIENPTk5FQ1RfU1RBVEVfRElBQ09OTkVDVEVECisgICAgICogZXhjZXB0IGZvciBkaXNjb25uZWN0KCkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGZvcmNlQ2xvc2VDb25uZWN0aW9uKCkgeworICAgICAgICBpZiAobVNlcnZpY2VDb25uZWN0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUNvbnRleHQudW5iaW5kU2VydmljZShtU2VydmljZUNvbm5lY3Rpb24pOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInVuYmluZFNlcnZpY2UgZmFpbGVkIiwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1TdGF0ZSA9IENPTk5FQ1RfU1RBVEVfRElTQ09OTkVDVEVEOworICAgICAgICBtU2VydmljZUNvbm5lY3Rpb24gPSBudWxsOworICAgICAgICBtU2VydmljZUJpbmRlciA9IG51bGw7CisgICAgICAgIG1TZXJ2aWNlQ2FsbGJhY2tzID0gbnVsbDsKKyAgICAgICAgbVJvb3RJZCA9IG51bGw7CisgICAgICAgIG1NZWRpYVNlc3Npb25Ub2tlbiA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBicm93c2VyIGlzIGNvbm5lY3RlZCB0byB0aGUgc2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1TdGF0ZSA9PSBDT05ORUNUX1NUQVRFX0NPTk5FQ1RFRDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBzZXJ2aWNlIGNvbXBvbmVudCB0aGF0IHRoZSBtZWRpYSBicm93c2VyIGlzIGNvbm5lY3RlZCB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vbk51bGwgQ29tcG9uZW50TmFtZSBnZXRTZXJ2aWNlQ29tcG9uZW50KCkgeworICAgICAgICBpZiAoIWlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImdldFNlcnZpY2VDb21wb25lbnQoKSBjYWxsZWQgd2hpbGUgbm90IGNvbm5lY3RlZCIgKworICAgICAgICAgICAgICAgICAgICAiIChzdGF0ZT0iICsgbVN0YXRlICsgIikiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVNlcnZpY2VDb21wb25lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgcm9vdCBpZC4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgdGhlIHJvb3QgaWQgbWF5IGJlY29tZSBpbnZhbGlkIG9yIGNoYW5nZSB3aGVuIHRoZQorICAgICAqIGJyb3dzZXIgaXMgZGlzY29ubmVjdGVkLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIG5vdCBjb25uZWN0ZWQuCisgICAgICovCisgICAgcHVibGljIEBOb25OdWxsIFN0cmluZyBnZXRSb290KCkgeworICAgICAgICBpZiAoIWlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImdldFJvb3QoKSBjYWxsZWQgd2hpbGUgbm90IGNvbm5lY3RlZCAoc3RhdGU9IgorICAgICAgICAgICAgICAgICAgICArIGdldFN0YXRlTGFiZWwobVN0YXRlKSArICIpIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Sb290SWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBhbnkgZXh0cmFzIGZvciB0aGUgbWVkaWEgc2VydmljZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIG5vdCBjb25uZWN0ZWQuCisgICAgICovCisgICAgcHVibGljIEBOdWxsYWJsZSBCdW5kbGUgZ2V0RXh0cmFzKCkgeworICAgICAgICBpZiAoIWlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImdldEV4dHJhcygpIGNhbGxlZCB3aGlsZSBub3QgY29ubmVjdGVkIChzdGF0ZT0iCisgICAgICAgICAgICAgICAgICAgICsgZ2V0U3RhdGVMYWJlbChtU3RhdGUpICsgIikiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUV4dHJhczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBtZWRpYSBzZXNzaW9uIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVkaWEgYnJvd3Nlci4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgdGhlIHNlc3Npb24gdG9rZW4gbWF5IGJlY29tZSBpbnZhbGlkIG9yIGNoYW5nZSB3aGVuIHRoZQorICAgICAqIGJyb3dzZXIgaXMgZGlzY29ubmVjdGVkLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHNlc3Npb24gdG9rZW4gZm9yIHRoZSBicm93c2VyLCBuZXZlciBudWxsLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgbm90IGNvbm5lY3RlZC4KKyAgICAgKi8KKyAgICAgcHVibGljIEBOb25OdWxsIE1lZGlhU2Vzc2lvbi5Ub2tlbiBnZXRTZXNzaW9uVG9rZW4oKSB7CisgICAgICAgIGlmICghaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZ2V0U2Vzc2lvblRva2VuKCkgY2FsbGVkIHdoaWxlIG5vdCBjb25uZWN0ZWQgKHN0YXRlPSIKKyAgICAgICAgICAgICAgICAgICAgKyBtU3RhdGUgKyAiKSIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtTWVkaWFTZXNzaW9uVG9rZW47CisgICAgfQorCisgICAgLyoqCisgICAgICogUXVlcmllcyBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1lZGlhIGl0ZW1zIHRoYXQgYXJlIGNvbnRhaW5lZCB3aXRoaW4KKyAgICAgKiB0aGUgc3BlY2lmaWVkIGlkIGFuZCBzdWJzY3JpYmVzIHRvIHJlY2VpdmUgdXBkYXRlcyB3aGVuIHRoZXkgY2hhbmdlLgorICAgICAqIDxwPgorICAgICAqIFRoZSBsaXN0IG9mIHN1YnNjcmlwdGlvbnMgaXMgbWFpbnRhaW5lZCBldmVuIHdoZW4gbm90IGNvbm5lY3RlZCBhbmQgaXMKKyAgICAgKiByZXN0b3JlZCBhZnRlciB0aGUgcmVjb25uZWN0aW9uLiBJdCBpcyBvayB0byBzdWJzY3JpYmUgd2hpbGUgbm90IGNvbm5lY3RlZAorICAgICAqIGJ1dCB0aGUgcmVzdWx0cyB3aWxsIG5vdCBiZSByZXR1cm5lZCB1bnRpbCB0aGUgY29ubmVjdGlvbiBjb21wbGV0ZXMuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBpZCBpcyBhbHJlYWR5IHN1YnNjcmliZWQgd2l0aCBhIGRpZmZlcmVudCBjYWxsYmFjayB0aGVuIHRoZSBuZXcKKyAgICAgKiBjYWxsYmFjayB3aWxsIHJlcGxhY2UgdGhlIHByZXZpb3VzIG9uZSBhbmQgdGhlIGNoaWxkIGRhdGEgd2lsbCBiZQorICAgICAqIHJlbG9hZGVkLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnRJZCBUaGUgaWQgb2YgdGhlIHBhcmVudCBtZWRpYSBpdGVtIHdob3NlIGxpc3Qgb2YgY2hpbGRyZW4KKyAgICAgKiAgICAgICAgICAgIHdpbGwgYmUgc3Vic2NyaWJlZC4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgdGhlIGxpc3Qgb2YgY2hpbGRyZW4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3Vic2NyaWJlKEBOb25OdWxsIFN0cmluZyBwYXJlbnRJZCwgQE5vbk51bGwgU3Vic2NyaXB0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgc3Vic2NyaWJlSW50ZXJuYWwocGFyZW50SWQsIG51bGwsIGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBRdWVyaWVzIHdpdGggc2VydmljZS1zcGVjaWZpYyBhcmd1bWVudHMgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtZWRpYSBpdGVtcworICAgICAqIHRoYXQgYXJlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHNwZWNpZmllZCBpZCBhbmQgc3Vic2NyaWJlcyB0byByZWNlaXZlIHVwZGF0ZXMKKyAgICAgKiB3aGVuIHRoZXkgY2hhbmdlLgorICAgICAqIDxwPgorICAgICAqIFRoZSBsaXN0IG9mIHN1YnNjcmlwdGlvbnMgaXMgbWFpbnRhaW5lZCBldmVuIHdoZW4gbm90IGNvbm5lY3RlZCBhbmQgaXMKKyAgICAgKiByZXN0b3JlZCBhZnRlciB0aGUgcmVjb25uZWN0aW9uLiBJdCBpcyBvayB0byBzdWJzY3JpYmUgd2hpbGUgbm90IGNvbm5lY3RlZAorICAgICAqIGJ1dCB0aGUgcmVzdWx0cyB3aWxsIG5vdCBiZSByZXR1cm5lZCB1bnRpbCB0aGUgY29ubmVjdGlvbiBjb21wbGV0ZXMuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBpZCBpcyBhbHJlYWR5IHN1YnNjcmliZWQgd2l0aCBhIGRpZmZlcmVudCBjYWxsYmFjayB0aGVuIHRoZSBuZXcKKyAgICAgKiBjYWxsYmFjayB3aWxsIHJlcGxhY2UgdGhlIHByZXZpb3VzIG9uZSBhbmQgdGhlIGNoaWxkIGRhdGEgd2lsbCBiZQorICAgICAqIHJlbG9hZGVkLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnRJZCBUaGUgaWQgb2YgdGhlIHBhcmVudCBtZWRpYSBpdGVtIHdob3NlIGxpc3Qgb2YgY2hpbGRyZW4KKyAgICAgKiAgICAgICAgICAgIHdpbGwgYmUgc3Vic2NyaWJlZC4KKyAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgYnVuZGxlIG9mIHNlcnZpY2Utc3BlY2lmaWMgYXJndW1lbnRzIHRvIHNlbmQgdG8gdGhlIG1lZGlhCisgICAgICogICAgICAgICAgICBicm93c2VyIHNlcnZpY2UuIFRoZSBjb250ZW50cyBvZiB0aGlzIGJ1bmRsZSBtYXkgYWZmZWN0IHRoZQorICAgICAqICAgICAgICAgICAgaW5mb3JtYXRpb24gcmV0dXJuZWQgd2hlbiBicm93c2luZy4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgdGhlIGxpc3Qgb2YgY2hpbGRyZW4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3Vic2NyaWJlKEBOb25OdWxsIFN0cmluZyBwYXJlbnRJZCwgQE5vbk51bGwgQnVuZGxlIG9wdGlvbnMsCisgICAgICAgICAgICBATm9uTnVsbCBTdWJzY3JpcHRpb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBpZiAob3B0aW9ucyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJvcHRpb25zIGNhbm5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgc3Vic2NyaWJlSW50ZXJuYWwocGFyZW50SWQsIG5ldyBCdW5kbGUob3B0aW9ucyksIGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbnN1YnNjcmliZXMgZm9yIGNoYW5nZXMgdG8gdGhlIGNoaWxkcmVuIG9mIHRoZSBzcGVjaWZpZWQgbWVkaWEgaWQuCisgICAgICogPHA+CisgICAgICogVGhlIHF1ZXJ5IGNhbGxiYWNrIHdpbGwgbm8gbG9uZ2VyIGJlIGludm9rZWQgZm9yIHJlc3VsdHMgYXNzb2NpYXRlZCB3aXRoCisgICAgICogdGhpcyBpZCBvbmNlIHRoaXMgbWV0aG9kIHJldHVybnMuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudElkIFRoZSBpZCBvZiB0aGUgcGFyZW50IG1lZGlhIGl0ZW0gd2hvc2UgbGlzdCBvZiBjaGlsZHJlbgorICAgICAqICAgICAgICAgICAgd2lsbCBiZSB1bnN1YnNjcmliZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5zdWJzY3JpYmUoQE5vbk51bGwgU3RyaW5nIHBhcmVudElkKSB7CisgICAgICAgIHVuc3Vic2NyaWJlSW50ZXJuYWwocGFyZW50SWQsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVuc3Vic2NyaWJlcyBmb3IgY2hhbmdlcyB0byB0aGUgY2hpbGRyZW4gb2YgdGhlIHNwZWNpZmllZCBtZWRpYSBpZCB0aHJvdWdoIGEgY2FsbGJhY2suCisgICAgICogPHA+CisgICAgICogVGhlIHF1ZXJ5IGNhbGxiYWNrIHdpbGwgbm8gbG9uZ2VyIGJlIGludm9rZWQgZm9yIHJlc3VsdHMgYXNzb2NpYXRlZCB3aXRoCisgICAgICogdGhpcyBpZCBvbmNlIHRoaXMgbWV0aG9kIHJldHVybnMuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudElkIFRoZSBpZCBvZiB0aGUgcGFyZW50IG1lZGlhIGl0ZW0gd2hvc2UgbGlzdCBvZiBjaGlsZHJlbgorICAgICAqICAgICAgICAgICAgd2lsbCBiZSB1bnN1YnNjcmliZWQuCisgICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgc2VudCB0byB0aGUgbWVkaWEgYnJvd3NlciBzZXJ2aWNlIHRvIHN1YnNjcmliZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bnN1YnNjcmliZShATm9uTnVsbCBTdHJpbmcgcGFyZW50SWQsIEBOb25OdWxsIFN1YnNjcmlwdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYWxsYmFjayBjYW5ub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHVuc3Vic2NyaWJlSW50ZXJuYWwocGFyZW50SWQsIGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgYSBzcGVjaWZpYyB7QGxpbmsgTWVkaWFJdGVtfSBmcm9tIHRoZSBjb25uZWN0ZWQgc2VydmljZS4gTm90CisgICAgICogYWxsIHNlcnZpY2VzIG1heSBzdXBwb3J0IHRoaXMsIHNvIGZhbGxpbmcgYmFjayB0byBzdWJzY3JpYmluZyB0byB0aGUKKyAgICAgKiBwYXJlbnQncyBpZCBzaG91bGQgYmUgdXNlZCB3aGVuIHVuYXZhaWxhYmxlLgorICAgICAqCisgICAgICogQHBhcmFtIG1lZGlhSWQgVGhlIGlkIG9mIHRoZSBpdGVtIHRvIHJldHJpZXZlLgorICAgICAqIEBwYXJhbSBjYiBUaGUgY2FsbGJhY2sgdG8gcmVjZWl2ZSB0aGUgcmVzdWx0IG9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGdldEl0ZW0oZmluYWwgQE5vbk51bGwgU3RyaW5nIG1lZGlhSWQsIEBOb25OdWxsIGZpbmFsIEl0ZW1DYWxsYmFjayBjYikgeworICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkobWVkaWFJZCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1lZGlhSWQgY2Fubm90IGJlIGVtcHR5LiIpOworICAgICAgICB9CisgICAgICAgIGlmIChjYiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYiBjYW5ub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVN0YXRlICE9IENPTk5FQ1RfU1RBVEVfQ09OTkVDVEVEKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJOb3QgY29ubmVjdGVkLCB1bmFibGUgdG8gcmV0cmlldmUgdGhlIE1lZGlhSXRlbS4iKTsKKyAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgY2Iub25FcnJvcihtZWRpYUlkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBSZXN1bHRSZWNlaXZlciByZWNlaXZlciA9IG5ldyBSZXN1bHRSZWNlaXZlcihtSGFuZGxlcikgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblJlY2VpdmVSZXN1bHQoaW50IHJlc3VsdENvZGUsIEJ1bmRsZSByZXN1bHREYXRhKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdENvZGUgIT0gMCB8fCByZXN1bHREYXRhID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFyZXN1bHREYXRhLmNvbnRhaW5zS2V5KE1lZGlhQnJvd3NlclNlcnZpY2UuS0VZX01FRElBX0lURU0pKSB7CisgICAgICAgICAgICAgICAgICAgIGNiLm9uRXJyb3IobWVkaWFJZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUGFyY2VsYWJsZSBpdGVtID0gcmVzdWx0RGF0YS5nZXRQYXJjZWxhYmxlKE1lZGlhQnJvd3NlclNlcnZpY2UuS0VZX01FRElBX0lURU0pOworICAgICAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwgJiYgIShpdGVtIGluc3RhbmNlb2YgTWVkaWFJdGVtKSkgeworICAgICAgICAgICAgICAgICAgICBjYi5vbkVycm9yKG1lZGlhSWQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNiLm9uSXRlbUxvYWRlZCgoTWVkaWFJdGVtKWl0ZW0pOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlcnZpY2VCaW5kZXIuZ2V0TWVkaWFJdGVtKG1lZGlhSWQsIHJlY2VpdmVyLCBtU2VydmljZUNhbGxiYWNrcyk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJSZW1vdGUgZXJyb3IgZ2V0dGluZyBtZWRpYSBpdGVtLiIpOworICAgICAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBjYi5vbkVycm9yKG1lZGlhSWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN1YnNjcmliZUludGVybmFsKFN0cmluZyBwYXJlbnRJZCwgQnVuZGxlIG9wdGlvbnMsIFN1YnNjcmlwdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIC8vIENoZWNrIGFyZ3VtZW50cy4KKyAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHBhcmVudElkKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFyZW50SWQgY2Fubm90IGJlIGVtcHR5LiIpOworICAgICAgICB9CisgICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYWxsYmFjayBjYW5ub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIC8vIFVwZGF0ZSBvciBjcmVhdGUgdGhlIHN1YnNjcmlwdGlvbi4KKyAgICAgICAgU3Vic2NyaXB0aW9uIHN1YiA9IG1TdWJzY3JpcHRpb25zLmdldChwYXJlbnRJZCk7CisgICAgICAgIGlmIChzdWIgPT0gbnVsbCkgeworICAgICAgICAgICAgc3ViID0gbmV3IFN1YnNjcmlwdGlvbigpOworICAgICAgICAgICAgbVN1YnNjcmlwdGlvbnMucHV0KHBhcmVudElkLCBzdWIpOworICAgICAgICB9CisgICAgICAgIHN1Yi5wdXRDYWxsYmFjayhtQ29udGV4dCwgb3B0aW9ucywgY2FsbGJhY2spOworCisgICAgICAgIC8vIElmIHdlIGFyZSBjb25uZWN0ZWQsIHRlbGwgdGhlIHNlcnZpY2UgdGhhdCB3ZSBhcmUgd2F0Y2hpbmcuIElmIHdlIGFyZW4ndCBjb25uZWN0ZWQsCisgICAgICAgIC8vIHRoZSBzZXJ2aWNlIHdpbGwgYmUgdG9sZCB3aGVuIHdlIGNvbm5lY3QuCisgICAgICAgIGlmIChpc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChvcHRpb25zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2VCaW5kZXIuYWRkU3Vic2NyaXB0aW9uRGVwcmVjYXRlZChwYXJlbnRJZCwgbVNlcnZpY2VDYWxsYmFja3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtU2VydmljZUJpbmRlci5hZGRTdWJzY3JpcHRpb24ocGFyZW50SWQsIGNhbGxiYWNrLm1Ub2tlbiwgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlQ2FsbGJhY2tzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgaXMgY3Jhc2hpbmcuIFdlIHdpbGwgZGlzY29ubmVjdCwgYW5kIHVwb24gcmVjb25uZWN0IHdlIHdpbGwKKyAgICAgICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IHJlcmVnaXN0ZXIuIFNvIG5vdGhpbmcgdG8gZG8gaGVyZS4KKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJhZGRTdWJzY3JpcHRpb24gZmFpbGVkIHdpdGggUmVtb3RlRXhjZXB0aW9uIHBhcmVudElkPSIgKyBwYXJlbnRJZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdW5zdWJzY3JpYmVJbnRlcm5hbChTdHJpbmcgcGFyZW50SWQsIFN1YnNjcmlwdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIC8vIENoZWNrIGFyZ3VtZW50cy4KKyAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHBhcmVudElkKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFyZW50SWQgY2Fubm90IGJlIGVtcHR5LiIpOworICAgICAgICB9CisKKyAgICAgICAgU3Vic2NyaXB0aW9uIHN1YiA9IG1TdWJzY3JpcHRpb25zLmdldChwYXJlbnRJZCk7CisgICAgICAgIGlmIChzdWIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIFRlbGwgdGhlIHNlcnZpY2UgaWYgbmVjZXNzYXJ5LgorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBtU2VydmljZUJpbmRlci5yZW1vdmVTdWJzY3JpcHRpb25EZXByZWNhdGVkKHBhcmVudElkLCBtU2VydmljZUNhbGxiYWNrcyk7CisgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlQmluZGVyLnJlbW92ZVN1YnNjcmlwdGlvbihwYXJlbnRJZCwgbnVsbCwgbVNlcnZpY2VDYWxsYmFja3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxTdWJzY3JpcHRpb25DYWxsYmFjaz4gY2FsbGJhY2tzID0gc3ViLmdldENhbGxiYWNrcygpOworICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8QnVuZGxlPiBvcHRpb25zTGlzdCA9IHN1Yi5nZXRPcHRpb25zTGlzdCgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBjYWxsYmFja3Muc2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrcy5nZXQoaSkgPT0gY2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2VCaW5kZXIucmVtb3ZlU3Vic2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50SWQsIGNhbGxiYWNrLm1Ub2tlbiwgbVNlcnZpY2VDYWxsYmFja3MpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNMaXN0LnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBQcm9jZXNzIGlzIGNyYXNoaW5nLiBXZSB3aWxsIGRpc2Nvbm5lY3QsIGFuZCB1cG9uIHJlY29ubmVjdCB3ZSB3aWxsCisgICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IHJlcmVnaXN0ZXIuIFNvIG5vdGhpbmcgdG8gZG8gaGVyZS4KKyAgICAgICAgICAgIExvZy5kKFRBRywgInJlbW92ZVN1YnNjcmlwdGlvbiBmYWlsZWQgd2l0aCBSZW1vdGVFeGNlcHRpb24gcGFyZW50SWQ9IiArIHBhcmVudElkKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdWIuaXNFbXB0eSgpIHx8IGNhbGxiYWNrID09IG51bGwpIHsKKyAgICAgICAgICAgIG1TdWJzY3JpcHRpb25zLnJlbW92ZShwYXJlbnRJZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3IgZGVidWdnaW5nLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTdGF0ZUxhYmVsKGludCBzdGF0ZSkgeworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgICAgICBjYXNlIENPTk5FQ1RfU1RBVEVfRElTQ09OTkVDVElORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gIkNPTk5FQ1RfU1RBVEVfRElTQ09OTkVDVElORyI7CisgICAgICAgICAgICBjYXNlIENPTk5FQ1RfU1RBVEVfRElTQ09OTkVDVEVEOgorICAgICAgICAgICAgICAgIHJldHVybiAiQ09OTkVDVF9TVEFURV9ESVNDT05ORUNURUQiOworICAgICAgICAgICAgY2FzZSBDT05ORUNUX1NUQVRFX0NPTk5FQ1RJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuICJDT05ORUNUX1NUQVRFX0NPTk5FQ1RJTkciOworICAgICAgICAgICAgY2FzZSBDT05ORUNUX1NUQVRFX0NPTk5FQ1RFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIkNPTk5FQ1RfU1RBVEVfQ09OTkVDVEVEIjsKKyAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9TVEFURV9TVVNQRU5ERUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJDT05ORUNUX1NUQVRFX1NVU1BFTkRFRCI7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiAiVU5LTk9XTi8iICsgc3RhdGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKGZpbmFsIElNZWRpYUJyb3dzZXJTZXJ2aWNlQ2FsbGJhY2tzIGNhbGxiYWNrLAorICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJvb3QsIGZpbmFsIE1lZGlhU2Vzc2lvbi5Ub2tlbiBzZXNzaW9uLCBmaW5hbCBCdW5kbGUgZXh0cmEpIHsKKyAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlcmUgaGFzbid0IGJlZW4gYSBkaXNjb25uZWN0IG9yIGEgZGlmZmVyZW50CisgICAgICAgICAgICAgICAgLy8gU2VydmljZUNvbm5lY3Rpb24uCisgICAgICAgICAgICAgICAgaWYgKCFpc0N1cnJlbnQoY2FsbGJhY2ssICJvbkNvbm5lY3QiKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIERvbid0IGFsbG93IHRoZW0gdG8gY2FsbCB1cyB0d2ljZS4KKyAgICAgICAgICAgICAgICBpZiAobVN0YXRlICE9IENPTk5FQ1RfU1RBVEVfQ09OTkVDVElORykgeworICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJvbkNvbm5lY3QgZnJvbSBzZXJ2aWNlIHdoaWxlIG1TdGF0ZT0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRTdGF0ZUxhYmVsKG1TdGF0ZSkgKyAiLi4uIGlnbm9yaW5nIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVJvb3RJZCA9IHJvb3Q7CisgICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvblRva2VuID0gc2Vzc2lvbjsKKyAgICAgICAgICAgICAgICBtRXh0cmFzID0gZXh0cmE7CisgICAgICAgICAgICAgICAgbVN0YXRlID0gQ09OTkVDVF9TVEFURV9DT05ORUNURUQ7CisKKyAgICAgICAgICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlNlcnZpY2VDYWxsYmFja3Mub25Db25uZWN0Li4uIik7CisgICAgICAgICAgICAgICAgICAgIGR1bXAoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uQ29ubmVjdGVkKCk7CisKKyAgICAgICAgICAgICAgICAvLyB3ZSBtYXkgcmVjZWl2ZSBzb21lIHN1YnNjcmlwdGlvbnMgYmVmb3JlIHdlIGFyZSBjb25uZWN0ZWQsIHNvIHJlLXN1YnNjcmliZQorICAgICAgICAgICAgICAgIC8vIGV2ZXJ5dGhpbmcgbm93CisgICAgICAgICAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIFN1YnNjcmlwdGlvbj4gc3Vic2NyaXB0aW9uRW50cnkgOiBtU3Vic2NyaXB0aW9ucy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpZCA9IHN1YnNjcmlwdGlvbkVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgICAgICAgICBTdWJzY3JpcHRpb24gc3ViID0gc3Vic2NyaXB0aW9uRW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgTGlzdDxTdWJzY3JpcHRpb25DYWxsYmFjaz4gY2FsbGJhY2tMaXN0ID0gc3ViLmdldENhbGxiYWNrcygpOworICAgICAgICAgICAgICAgICAgICBMaXN0PEJ1bmRsZT4gb3B0aW9uc0xpc3QgPSBzdWIuZ2V0T3B0aW9uc0xpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYWxsYmFja0xpc3Quc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2VCaW5kZXIuYWRkU3Vic2NyaXB0aW9uKGlkLCBjYWxsYmFja0xpc3QuZ2V0KGkpLm1Ub2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNMaXN0LmdldChpKSwgbVNlcnZpY2VDYWxsYmFja3MpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBpcyBjcmFzaGluZy4gV2Ugd2lsbCBkaXNjb25uZWN0LCBhbmQgdXBvbiByZWNvbm5lY3Qgd2Ugd2lsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgcmVyZWdpc3Rlci4gU28gbm90aGluZyB0byBkbyBoZXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImFkZFN1YnNjcmlwdGlvbiBmYWlsZWQgd2l0aCBSZW1vdGVFeGNlcHRpb24gcGFyZW50SWQ9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgdm9pZCBvbkNvbm5lY3Rpb25GYWlsZWQoZmluYWwgSU1lZGlhQnJvd3NlclNlcnZpY2VDYWxsYmFja3MgY2FsbGJhY2spIHsKKyAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJvbkNvbm5lY3RGYWlsZWQgZm9yICIgKyBtU2VydmljZUNvbXBvbmVudCk7CisKKyAgICAgICAgICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlcmUgaGFzbid0IGJlZW4gYSBkaXNjb25uZWN0IG9yIGEgZGlmZmVyZW50CisgICAgICAgICAgICAgICAgLy8gU2VydmljZUNvbm5lY3Rpb24uCisgICAgICAgICAgICAgICAgaWYgKCFpc0N1cnJlbnQoY2FsbGJhY2ssICJvbkNvbm5lY3RGYWlsZWQiKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIERvbid0IGFsbG93IHRoZW0gdG8gY2FsbCB1cyB0d2ljZS4KKyAgICAgICAgICAgICAgICBpZiAobVN0YXRlICE9IENPTk5FQ1RfU1RBVEVfQ09OTkVDVElORykgeworICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJvbkNvbm5lY3QgZnJvbSBzZXJ2aWNlIHdoaWxlIG1TdGF0ZT0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRTdGF0ZUxhYmVsKG1TdGF0ZSkgKyAiLi4uIGlnbm9yaW5nIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBDbGVhbiB1cAorICAgICAgICAgICAgICAgIGZvcmNlQ2xvc2VDb25uZWN0aW9uKCk7CisKKyAgICAgICAgICAgICAgICAvLyBUZWxsIHRoZSBhcHAuCisgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uQ29ubmVjdGlvbkZhaWxlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHZvaWQgb25Mb2FkQ2hpbGRyZW4oZmluYWwgSU1lZGlhQnJvd3NlclNlcnZpY2VDYWxsYmFja3MgY2FsbGJhY2ssCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFyZW50SWQsIGZpbmFsIE1lZGlhUGFyY2VsZWRMaXN0U2xpY2UgbGlzdCwgZmluYWwgQnVuZGxlIG9wdGlvbnMpIHsKKyAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZXJlIGhhc24ndCBiZWVuIGEgZGlzY29ubmVjdCBvciBhIGRpZmZlcmVudAorICAgICAgICAgICAgICAgIC8vIFNlcnZpY2VDb25uZWN0aW9uLgorICAgICAgICAgICAgICAgIGlmICghaXNDdXJyZW50KGNhbGxiYWNrLCAib25Mb2FkQ2hpbGRyZW4iKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvbkxvYWRDaGlsZHJlbiBmb3IgIiArIG1TZXJ2aWNlQ29tcG9uZW50ICsgIiBpZD0iICsgcGFyZW50SWQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIHN1YnNjcmlwdGlvbiBpcyBzdGlsbCBzdWJzY3JpYmVkLgorICAgICAgICAgICAgICAgIGZpbmFsIFN1YnNjcmlwdGlvbiBzdWJzY3JpcHRpb24gPSBtU3Vic2NyaXB0aW9ucy5nZXQocGFyZW50SWQpOworICAgICAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUZWxsIHRoZSBhcHAuCisgICAgICAgICAgICAgICAgICAgIFN1YnNjcmlwdGlvbkNhbGxiYWNrIHN1YnNjcmlwdGlvbkNhbGxiYWNrID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24uZ2V0Q2FsbGJhY2sobUNvbnRleHQsIG9wdGlvbnMpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9uQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNZWRpYUl0ZW0+IGRhdGEgPSBsaXN0ID09IG51bGwgPyBudWxsIDogbGlzdC5nZXRMaXN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25DYWxsYmFjay5vbkVycm9yKHBhcmVudElkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25DYWxsYmFjay5vbkNoaWxkcmVuTG9hZGVkKHBhcmVudElkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uQ2FsbGJhY2sub25FcnJvcihwYXJlbnRJZCwgb3B0aW9ucyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uQ2FsbGJhY2sub25DaGlsZHJlbkxvYWRlZChwYXJlbnRJZCwgZGF0YSwgb3B0aW9ucyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25Mb2FkQ2hpbGRyZW4gZm9yIGlkIHRoYXQgaXNuJ3Qgc3Vic2NyaWJlZCBpZD0iICsgcGFyZW50SWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYge0Bjb2RlIGNhbGxiYWNrfSBpcyB0aGUgY3VycmVudCBTZXJ2aWNlQ2FsbGJhY2tzLiBBbHNvIGxvZ3MgaWYgaXQncyBub3QuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzQ3VycmVudChJTWVkaWFCcm93c2VyU2VydmljZUNhbGxiYWNrcyBjYWxsYmFjaywgU3RyaW5nIGZ1bmNOYW1lKSB7CisgICAgICAgIGlmIChtU2VydmljZUNhbGxiYWNrcyAhPSBjYWxsYmFjayB8fCBtU3RhdGUgPT0gQ09OTkVDVF9TVEFURV9ESVNDT05ORUNUSU5HCisgICAgICAgICAgICAgICAgfHwgbVN0YXRlID09IENPTk5FQ1RfU1RBVEVfRElTQ09OTkVDVEVEKSB7CisgICAgICAgICAgICBpZiAobVN0YXRlICE9IENPTk5FQ1RfU1RBVEVfRElTQ09OTkVDVElORyAmJiBtU3RhdGUgIT0gQ09OTkVDVF9TVEFURV9ESVNDT05ORUNURUQpIHsKKyAgICAgICAgICAgICAgICBMb2cuaShUQUcsIGZ1bmNOYW1lICsgIiBmb3IgIiArIG1TZXJ2aWNlQ29tcG9uZW50ICsgIiB3aXRoIG1TZXJ2aWNlQ29ubmVjdGlvbj0iCisgICAgICAgICAgICAgICAgICAgICAgICArIG1TZXJ2aWNlQ2FsbGJhY2tzICsgIiB0aGlzPSIgKyB0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIFNlcnZpY2VDYWxsYmFja3MgZ2V0TmV3U2VydmljZUNhbGxiYWNrcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTZXJ2aWNlQ2FsbGJhY2tzKHRoaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvZyBpbnRlcm5hbCBzdGF0ZS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHZvaWQgZHVtcCgpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiTWVkaWFCcm93c2VyLi4uIik7CisgICAgICAgIExvZy5kKFRBRywgIiAgbVNlcnZpY2VDb21wb25lbnQ9IiArIG1TZXJ2aWNlQ29tcG9uZW50KTsKKyAgICAgICAgTG9nLmQoVEFHLCAiICBtQ2FsbGJhY2s9IiArIG1DYWxsYmFjayk7CisgICAgICAgIExvZy5kKFRBRywgIiAgbVJvb3RIaW50cz0iICsgbVJvb3RIaW50cyk7CisgICAgICAgIExvZy5kKFRBRywgIiAgbVN0YXRlPSIgKyBnZXRTdGF0ZUxhYmVsKG1TdGF0ZSkpOworICAgICAgICBMb2cuZChUQUcsICIgIG1TZXJ2aWNlQ29ubmVjdGlvbj0iICsgbVNlcnZpY2VDb25uZWN0aW9uKTsKKyAgICAgICAgTG9nLmQoVEFHLCAiICBtU2VydmljZUJpbmRlcj0iICsgbVNlcnZpY2VCaW5kZXIpOworICAgICAgICBMb2cuZChUQUcsICIgIG1TZXJ2aWNlQ2FsbGJhY2tzPSIgKyBtU2VydmljZUNhbGxiYWNrcyk7CisgICAgICAgIExvZy5kKFRBRywgIiAgbVJvb3RJZD0iICsgbVJvb3RJZCk7CisgICAgICAgIExvZy5kKFRBRywgIiAgbU1lZGlhU2Vzc2lvblRva2VuPSIgKyBtTWVkaWFTZXNzaW9uVG9rZW4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY2xhc3Mgd2l0aCBpbmZvcm1hdGlvbiBvbiBhIHNpbmdsZSBtZWRpYSBpdGVtIGZvciB1c2UgaW4gYnJvd3Npbmcvc2VhcmNoaW5nIG1lZGlhLgorICAgICAqIE1lZGlhSXRlbXMgYXJlIGFwcGxpY2F0aW9uIGRlcGVuZGVudCBzbyB3ZSBjYW5ub3QgZ3VhcmFudGVlIHRoYXQgdGhleSBjb250YWluIHRoZQorICAgICAqIHJpZ2h0IHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1lZGlhSXRlbSBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtRmxhZ3M7CisgICAgICAgIHByaXZhdGUgZmluYWwgTWVkaWFEZXNjcmlwdGlvbiBtRGVzY3JpcHRpb247CisKKyAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKKyAgICAgICAgQEludERlZihmbGFnPXRydWUsIHZhbHVlID0geyBGTEFHX0JST1dTQUJMRSwgRkxBR19QTEFZQUJMRSB9KQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBGbGFncyB7IH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRmxhZzogSW5kaWNhdGVzIHRoYXQgdGhlIGl0ZW0gaGFzIGNoaWxkcmVuIG9mIGl0cyBvd24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0JST1dTQUJMRSA9IDEgPDwgMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogRmxhZzogSW5kaWNhdGVzIHRoYXQgdGhlIGl0ZW0gaXMgcGxheWFibGUuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgaWQgb2YgdGhpcyBpdGVtIG1heSBiZSBwYXNzZWQgdG8KKyAgICAgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbGxlci5UcmFuc3BvcnRDb250cm9scyNwbGF5RnJvbU1lZGlhSWQoU3RyaW5nLCBCdW5kbGUpfQorICAgICAgICAgKiB0byBzdGFydCBwbGF5aW5nIGl0LgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BMQVlBQkxFID0gMSA8PCAxOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYSBuZXcgTWVkaWFJdGVtIGZvciB1c2UgaW4gYnJvd3NpbmcgbWVkaWEuCisgICAgICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIG1lZGlhLCB3aGljaCBtdXN0IGluY2x1ZGUgYQorICAgICAgICAgKiAgICAgICAgICAgIG1lZGlhIGlkLgorICAgICAgICAgKiBAcGFyYW0gZmxhZ3MgVGhlIGZsYWdzIGZvciB0aGlzIGl0ZW0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTWVkaWFJdGVtKEBOb25OdWxsIE1lZGlhRGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIEBGbGFncyBpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZGVzY3JpcHRpb24gY2Fubm90IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShkZXNjcmlwdGlvbi5nZXRNZWRpYUlkKCkpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZGVzY3JpcHRpb24gbXVzdCBoYXZlIGEgbm9uLWVtcHR5IG1lZGlhIGlkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRmxhZ3MgPSBmbGFnczsKKyAgICAgICAgICAgIG1EZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByaXZhdGUgY29uc3RydWN0b3IuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIE1lZGlhSXRlbShQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIG1GbGFncyA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIG1EZXNjcmlwdGlvbiA9IE1lZGlhRGVzY3JpcHRpb24uQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGluKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBvdXQsIGludCBmbGFncykgeworICAgICAgICAgICAgb3V0LndyaXRlSW50KG1GbGFncyk7CisgICAgICAgICAgICBtRGVzY3JpcHRpb24ud3JpdGVUb1BhcmNlbChvdXQsIGZsYWdzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJNZWRpYUl0ZW17Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoIm1GbGFncz0iKS5hcHBlbmQobUZsYWdzKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBtRGVzY3JpcHRpb249IikuYXBwZW5kKG1EZXNjcmlwdGlvbik7CisgICAgICAgICAgICBzYi5hcHBlbmQoJ30nKTsKKyAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8TWVkaWFJdGVtPiBDUkVBVE9SID0KKyAgICAgICAgICAgICAgICBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPE1lZGlhSXRlbT4oKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgTWVkaWFJdGVtIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhSXRlbShpbik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIE1lZGlhSXRlbVtdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhSXRlbVtzaXplXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIGZsYWdzIG9mIHRoZSBpdGVtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEBGbGFncyBpbnQgZ2V0RmxhZ3MoKSB7CisgICAgICAgICAgICByZXR1cm4gbUZsYWdzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGl0ZW0gaXMgYnJvd3NhYmxlLgorICAgICAgICAgKiBAc2VlICNGTEFHX0JST1dTQUJMRQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNCcm93c2FibGUoKSB7CisgICAgICAgICAgICByZXR1cm4gKG1GbGFncyAmIEZMQUdfQlJPV1NBQkxFKSAhPSAwOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGl0ZW0gaXMgcGxheWFibGUuCisgICAgICAgICAqIEBzZWUgI0ZMQUdfUExBWUFCTEUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUGxheWFibGUoKSB7CisgICAgICAgICAgICByZXR1cm4gKG1GbGFncyAmIEZMQUdfUExBWUFCTEUpICE9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIG1lZGlhLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEBOb25OdWxsIE1lZGlhRGVzY3JpcHRpb24gZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gbURlc2NyaXB0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIG1lZGlhIGlkIGluIHRoZSB7QGxpbmsgTWVkaWFEZXNjcmlwdGlvbn0gZm9yIHRoaXMgaXRlbS4KKyAgICAgICAgICogQHNlZSBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEjTUVUQURBVEFfS0VZX01FRElBX0lECisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQE51bGxhYmxlIFN0cmluZyBnZXRNZWRpYUlkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1EZXNjcmlwdGlvbi5nZXRNZWRpYUlkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFja3MgZm9yIGNvbm5lY3Rpb24gcmVsYXRlZCBldmVudHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb25uZWN0aW9uQ2FsbGJhY2sgeworICAgICAgICAvKioKKyAgICAgICAgICogSW52b2tlZCBhZnRlciB7QGxpbmsgTWVkaWFCcm93c2VyI2Nvbm5lY3QoKX0gd2hlbiB0aGUgcmVxdWVzdCBoYXMgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29ubmVjdGVkKCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEludm9rZWQgd2hlbiB0aGUgY2xpZW50IGlzIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBtZWRpYSBicm93c2VyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25Db25uZWN0aW9uU3VzcGVuZGVkKCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEludm9rZWQgd2hlbiB0aGUgY29ubmVjdGlvbiB0byB0aGUgbWVkaWEgYnJvd3NlciBmYWlsZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbm5lY3Rpb25GYWlsZWQoKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFja3MgZm9yIHN1YnNjcmlwdGlvbiByZWxhdGVkIGV2ZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFN1YnNjcmlwdGlvbkNhbGxiYWNrIHsKKyAgICAgICAgQmluZGVyIG1Ub2tlbjsKKworICAgICAgICBwdWJsaWMgU3Vic2NyaXB0aW9uQ2FsbGJhY2soKSB7CisgICAgICAgICAgICBtVG9rZW4gPSBuZXcgQmluZGVyKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIGxpc3Qgb2YgY2hpbGRyZW4gaXMgbG9hZGVkIG9yIHVwZGF0ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwYXJlbnRJZCBUaGUgbWVkaWEgaWQgb2YgdGhlIHBhcmVudCBtZWRpYSBpdGVtLgorICAgICAgICAgKiBAcGFyYW0gY2hpbGRyZW4gVGhlIGNoaWxkcmVuIHdoaWNoIHdlcmUgbG9hZGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25DaGlsZHJlbkxvYWRlZChATm9uTnVsbCBTdHJpbmcgcGFyZW50SWQsIEBOb25OdWxsIExpc3Q8TWVkaWFJdGVtPiBjaGlsZHJlbikgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBsaXN0IG9mIGNoaWxkcmVuIGlzIGxvYWRlZCBvciB1cGRhdGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcGFyZW50SWQgVGhlIG1lZGlhIGlkIG9mIHRoZSBwYXJlbnQgbWVkaWEgaXRlbS4KKyAgICAgICAgICogQHBhcmFtIGNoaWxkcmVuIFRoZSBjaGlsZHJlbiB3aGljaCB3ZXJlIGxvYWRlZC4KKyAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIGJ1bmRsZSBvZiBzZXJ2aWNlLXNwZWNpZmljIGFyZ3VtZW50cyBzZW50IHRvIHRoZSBtZWRpYQorICAgICAgICAgKiAgICAgICAgICAgIGJyb3dzZXIgc2VydmljZS4gVGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVuZGxlIG1heSBhZmZlY3QgdGhlCisgICAgICAgICAqICAgICAgICAgICAgaW5mb3JtYXRpb24gcmV0dXJuZWQgd2hlbiBicm93c2luZy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hpbGRyZW5Mb2FkZWQoQE5vbk51bGwgU3RyaW5nIHBhcmVudElkLCBATm9uTnVsbCBMaXN0PE1lZGlhSXRlbT4gY2hpbGRyZW4sCisgICAgICAgICAgICAgICAgQE5vbk51bGwgQnVuZGxlIG9wdGlvbnMpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgaWQgZG9lc24ndCBleGlzdCBvciBvdGhlciBlcnJvcnMgaW4gc3Vic2NyaWJpbmcuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBJZiB0aGlzIGlzIGNhbGxlZCwgdGhlIHN1YnNjcmlwdGlvbiByZW1haW5zIHVudGlsIHtAbGluayBNZWRpYUJyb3dzZXIjdW5zdWJzY3JpYmV9CisgICAgICAgICAqIGNhbGxlZCwgYmVjYXVzZSBzb21lIGVycm9ycyBtYXkgaGVhbCB0aGVtc2VsdmVzLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwYXJlbnRJZCBUaGUgbWVkaWEgaWQgb2YgdGhlIHBhcmVudCBtZWRpYSBpdGVtIHdob3NlIGNoaWxkcmVuIGNvdWxkCisgICAgICAgICAqICAgICAgICAgICAgbm90IGJlIGxvYWRlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoQE5vbk51bGwgU3RyaW5nIHBhcmVudElkKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIGlkIGRvZXNuJ3QgZXhpc3Qgb3Igb3RoZXIgZXJyb3JzIGluIHN1YnNjcmliaW5nLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogSWYgdGhpcyBpcyBjYWxsZWQsIHRoZSBzdWJzY3JpcHRpb24gcmVtYWlucyB1bnRpbCB7QGxpbmsgTWVkaWFCcm93c2VyI3Vuc3Vic2NyaWJlfQorICAgICAgICAgKiBjYWxsZWQsIGJlY2F1c2Ugc29tZSBlcnJvcnMgbWF5IGhlYWwgdGhlbXNlbHZlcy4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcGFyZW50SWQgVGhlIG1lZGlhIGlkIG9mIHRoZSBwYXJlbnQgbWVkaWEgaXRlbSB3aG9zZSBjaGlsZHJlbiBjb3VsZAorICAgICAgICAgKiAgICAgICAgICAgIG5vdCBiZSBsb2FkZWQuCisgICAgICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBidW5kbGUgb2Ygc2VydmljZS1zcGVjaWZpYyBhcmd1bWVudHMgc2VudCB0byB0aGUgbWVkaWEKKyAgICAgICAgICogICAgICAgICAgICBicm93c2VyIHNlcnZpY2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKEBOb25OdWxsIFN0cmluZyBwYXJlbnRJZCwgQE5vbk51bGwgQnVuZGxlIG9wdGlvbnMpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxiYWNrIGZvciByZWNlaXZpbmcgdGhlIHJlc3VsdCBvZiB7QGxpbmsgI2dldEl0ZW19LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgSXRlbUNhbGxiYWNrIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBpdGVtIGhhcyBiZWVuIHJldHVybmVkIGJ5IHRoZSBjb25uZWN0ZWQgc2VydmljZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gdGhhdCB3YXMgcmV0dXJuZWQgb3IgbnVsbCBpZiBpdCBkb2Vzbid0IGV4aXN0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25JdGVtTG9hZGVkKE1lZGlhSXRlbSBpdGVtKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHRoZXJlIHdhcyBhbiBlcnJvciByZXRyaWV2aW5nIGl0IG9yIHRoZSBjb25uZWN0ZWQgc2VydmljZSBkb2Vzbid0IHN1cHBvcnQKKyAgICAgICAgICoge0BsaW5rICNnZXRJdGVtfS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1lZGlhSWQgVGhlIG1lZGlhIGlkIG9mIHRoZSBtZWRpYSBpdGVtIHdoaWNoIGNvdWxkIG5vdCBiZSBsb2FkZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKEBOb25OdWxsIFN0cmluZyBtZWRpYUlkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXJ2aWNlQ29ubmVjdGlvbiB0byB0aGUgb3RoZXIgYXBwLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgTWVkaWFTZXJ2aWNlQ29ubmVjdGlvbiBpbXBsZW1lbnRzIFNlcnZpY2VDb25uZWN0aW9uIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZChmaW5hbCBDb21wb25lbnROYW1lIG5hbWUsIGZpbmFsIElCaW5kZXIgYmluZGVyKSB7CisgICAgICAgICAgICBwb3N0T3JSdW4obmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiTWVkaWFTZXJ2aWNlQ29ubmVjdGlvbi5vblNlcnZpY2VDb25uZWN0ZWQgbmFtZT0iICsgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYmluZGVyPSIgKyBiaW5kZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgZHVtcCgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGFyZSBzdGlsbCB0aGUgY3VycmVudCBjb25uZWN0aW9uLCBhbmQgdGhhdCB0aGV5IGhhdmVuJ3QgY2FsbGVkCisgICAgICAgICAgICAgICAgICAgIC8vIGRpc2Nvbm5lY3QoKS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0N1cnJlbnQoIm9uU2VydmljZUNvbm5lY3RlZCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBTYXZlIHRoZWlyIGJpbmRlcgorICAgICAgICAgICAgICAgICAgICBtU2VydmljZUJpbmRlciA9IElNZWRpYUJyb3dzZXJTZXJ2aWNlLlN0dWIuYXNJbnRlcmZhY2UoYmluZGVyKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBXZSBtYWtlIGEgbmV3IG1TZXJ2aWNlQ2FsbGJhY2tzIGVhY2ggdGltZSB3ZSBjb25uZWN0IHNvIHRoYXQgd2UgY2FuIGRyb3AKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVzcG9uc2VzIGZyb20gcHJldmlvdXMgY29ubmVjdGlvbnMuCisgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlQ2FsbGJhY2tzID0gZ2V0TmV3U2VydmljZUNhbGxiYWNrcygpOworICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBDT05ORUNUX1NUQVRFX0NPTk5FQ1RJTkc7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2FsbCBjb25uZWN0LCB3aGljaCBpcyBhc3luYy4gV2hlbiB3ZSBnZXQgYSByZXNwb25zZSBmcm9tIHRoYXQgd2Ugd2lsbAorICAgICAgICAgICAgICAgICAgICAvLyBzYXkgdGhhdCB3ZSdyZSBjb25uZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2VydmljZUNhbGxiYWNrcy5vbkNvbm5lY3QuLi4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtU2VydmljZUJpbmRlci5jb25uZWN0KG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIG1Sb290SGludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlQ2FsbGJhY2tzKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25uZWN0IGZhaWxlZCwgd2hpY2ggaXNuJ3QgZ29vZC4gQnV0IHRoZSBhdXRvLXJlY29ubmVjdCBvbiB0aGUgc2VydmljZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCB0YWtlIG92ZXIgYW5kIHdlIHdpbGwgY29tZSBiYWNrLiBXZSB3aWxsIGFsc28gZ2V0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25TZXJ2aWNlRGlzY29ubmVjdGVkLCB3aGljaCBoYXMgYWxsIHRoZSBjbGVhbnVwIGNvZGUuIFNvIGxldCB0aGF0IGRvCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlJlbW90ZUV4Y2VwdGlvbiBkdXJpbmcgY29ubmVjdCBmb3IgIiArIG1TZXJ2aWNlQ29tcG9uZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTZXJ2aWNlQ2FsbGJhY2tzLm9uQ29ubmVjdC4uLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1bXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChmaW5hbCBDb21wb25lbnROYW1lIG5hbWUpIHsKKyAgICAgICAgICAgIHBvc3RPclJ1bihuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJNZWRpYVNlcnZpY2VDb25uZWN0aW9uLm9uU2VydmljZURpc2Nvbm5lY3RlZCBuYW1lPSIgKyBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0aGlzPSIgKyB0aGlzICsgIiBtU2VydmljZUNvbm5lY3Rpb249IiArIG1TZXJ2aWNlQ29ubmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkdW1wKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgYXJlIHN0aWxsIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24sIGFuZCB0aGF0IHRoZXkgaGF2ZW4ndCBjYWxsZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gZGlzY29ubmVjdCgpLgorICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQ3VycmVudCgib25TZXJ2aWNlRGlzY29ubmVjdGVkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIG91dCB3aGF0IHdlIHNldCBpbiBvblNlcnZpY2VDb25uZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2VCaW5kZXIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBtU2VydmljZUNhbGxiYWNrcyA9IG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQW5kIHRlbGwgdGhlIGFwcCB0aGF0IGl0J3Mgc3VzcGVuZGVkLgorICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBDT05ORUNUX1NUQVRFX1NVU1BFTkRFRDsKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uQ29ubmVjdGlvblN1c3BlbmRlZCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHBvc3RPclJ1bihSdW5uYWJsZSByKSB7CisgICAgICAgICAgICBpZiAoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSA9PSBtSGFuZGxlci5nZXRMb29wZXIoKS5nZXRUaHJlYWQoKSkgeworICAgICAgICAgICAgICAgIHIucnVuKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnBvc3Qocik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRydWUgaWYgdGhpcyBpcyB0aGUgY3VycmVudCBTZXJ2aWNlQ29ubmVjdGlvbi4gQWxzbyBsb2dzIGlmIGl0J3Mgbm90LgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzQ3VycmVudChTdHJpbmcgZnVuY05hbWUpIHsKKyAgICAgICAgICAgIGlmIChtU2VydmljZUNvbm5lY3Rpb24gIT0gdGhpcyB8fCBtU3RhdGUgPT0gQ09OTkVDVF9TVEFURV9ESVNDT05ORUNUSU5HCisgICAgICAgICAgICAgICAgICAgIHx8IG1TdGF0ZSA9PSBDT05ORUNUX1NUQVRFX0RJU0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gQ09OTkVDVF9TVEFURV9ESVNDT05ORUNUSU5HICYmIG1TdGF0ZSAhPSBDT05ORUNUX1NUQVRFX0RJU0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBtU3RhdGUsIGJlY2F1c2Ugb3RoZXJ3aXNlIHRoaXMgbG9nIGlzIG5vaXN5LgorICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsIGZ1bmNOYW1lICsgIiBmb3IgIiArIG1TZXJ2aWNlQ29tcG9uZW50ICsgIiB3aXRoIG1TZXJ2aWNlQ29ubmVjdGlvbj0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtU2VydmljZUNvbm5lY3Rpb24gKyAiIHRoaXM9IiArIHRoaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxiYWNrcyBmcm9tIHRoZSBzZXJ2aWNlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNlcnZpY2VDYWxsYmFja3MgZXh0ZW5kcyBJTWVkaWFCcm93c2VyU2VydmljZUNhbGxiYWNrcy5TdHViIHsKKyAgICAgICAgcHJpdmF0ZSBXZWFrUmVmZXJlbmNlPE1lZGlhQnJvd3Nlcj4gbU1lZGlhQnJvd3NlcjsKKworICAgICAgICBwdWJsaWMgU2VydmljZUNhbGxiYWNrcyhNZWRpYUJyb3dzZXIgbWVkaWFCcm93c2VyKSB7CisgICAgICAgICAgICBtTWVkaWFCcm93c2VyID0gbmV3IFdlYWtSZWZlcmVuY2U8TWVkaWFCcm93c2VyPihtZWRpYUJyb3dzZXIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBvdGhlciBzaWRlIGhhcyBhY2tub3dsZWRnZWQgb3VyIGNvbm5lY3Rpb24uIFRoZSBwYXJhbWV0ZXJzIHRvIHRoaXMgZnVuY3Rpb24KKyAgICAgICAgICogYXJlIHRoZSBpbml0aWFsIGRhdGEgYXMgcmVxdWVzdGVkLgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29ubmVjdChTdHJpbmcgcm9vdCwgTWVkaWFTZXNzaW9uLlRva2VuIHNlc3Npb24sCisgICAgICAgICAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICAgICAgTWVkaWFCcm93c2VyIG1lZGlhQnJvd3NlciA9IG1NZWRpYUJyb3dzZXIuZ2V0KCk7CisgICAgICAgICAgICBpZiAobWVkaWFCcm93c2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtZWRpYUJyb3dzZXIub25TZXJ2aWNlQ29ubmVjdGVkKHRoaXMsIHJvb3QsIHNlc3Npb24sIGV4dHJhcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG90aGVyIHNpZGUgZG9lcyBub3QgbGlrZSB1cy4gVGVsbCB0aGUgYXBwIHZpYSBvbkNvbm5lY3Rpb25GYWlsZWQuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Db25uZWN0RmFpbGVkKCkgeworICAgICAgICAgICAgTWVkaWFCcm93c2VyIG1lZGlhQnJvd3NlciA9IG1NZWRpYUJyb3dzZXIuZ2V0KCk7CisgICAgICAgICAgICBpZiAobWVkaWFCcm93c2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtZWRpYUJyb3dzZXIub25Db25uZWN0aW9uRmFpbGVkKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uTG9hZENoaWxkcmVuKFN0cmluZyBwYXJlbnRJZCwgTWVkaWFQYXJjZWxlZExpc3RTbGljZSBsaXN0KSB7CisgICAgICAgICAgICBvbkxvYWRDaGlsZHJlbldpdGhPcHRpb25zKHBhcmVudElkLCBsaXN0LCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkxvYWRDaGlsZHJlbldpdGhPcHRpb25zKFN0cmluZyBwYXJlbnRJZCwgTWVkaWFQYXJjZWxlZExpc3RTbGljZSBsaXN0LAorICAgICAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBvcHRpb25zKSB7CisgICAgICAgICAgICBNZWRpYUJyb3dzZXIgbWVkaWFCcm93c2VyID0gbU1lZGlhQnJvd3Nlci5nZXQoKTsKKyAgICAgICAgICAgIGlmIChtZWRpYUJyb3dzZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1lZGlhQnJvd3Nlci5vbkxvYWRDaGlsZHJlbih0aGlzLCBwYXJlbnRJZCwgbGlzdCwgb3B0aW9ucyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdWJzY3JpcHRpb24geworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8U3Vic2NyaXB0aW9uQ2FsbGJhY2s+IG1DYWxsYmFja3M7CisgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxCdW5kbGU+IG1PcHRpb25zTGlzdDsKKworICAgICAgICBwdWJsaWMgU3Vic2NyaXB0aW9uKCkgeworICAgICAgICAgICAgbUNhbGxiYWNrcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgbU9wdGlvbnNMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworICAgICAgICAgICAgcmV0dXJuIG1DYWxsYmFja3MuaXNFbXB0eSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExpc3Q8QnVuZGxlPiBnZXRPcHRpb25zTGlzdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtT3B0aW9uc0xpc3Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTGlzdDxTdWJzY3JpcHRpb25DYWxsYmFjaz4gZ2V0Q2FsbGJhY2tzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1DYWxsYmFja3M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3Vic2NyaXB0aW9uQ2FsbGJhY2sgZ2V0Q2FsbGJhY2soQ29udGV4dCBjb250ZXh0LCBCdW5kbGUgb3B0aW9ucykgeworICAgICAgICAgICAgaWYgKG9wdGlvbnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0Q2xhc3NMb2FkZXIoY29udGV4dC5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU9wdGlvbnNMaXN0LnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKE1lZGlhQnJvd3NlclV0aWxzLmFyZVNhbWVPcHRpb25zKG1PcHRpb25zTGlzdC5nZXQoaSksIG9wdGlvbnMpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtQ2FsbGJhY2tzLmdldChpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHB1dENhbGxiYWNrKENvbnRleHQgY29udGV4dCwgQnVuZGxlIG9wdGlvbnMsIFN1YnNjcmlwdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBpZiAob3B0aW9ucyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3B0aW9ucy5zZXRDbGFzc0xvYWRlcihjb250ZXh0LmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtT3B0aW9uc0xpc3Quc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoTWVkaWFCcm93c2VyVXRpbHMuYXJlU2FtZU9wdGlvbnMobU9wdGlvbnNMaXN0LmdldChpKSwgb3B0aW9ucykpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrcy5zZXQoaSwgY2FsbGJhY2spOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNhbGxiYWNrcy5hZGQoY2FsbGJhY2spOworICAgICAgICAgICAgbU9wdGlvbnNMaXN0LmFkZChvcHRpb25zKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9icm93c2UvTWVkaWFCcm93c2VyVXRpbHMuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9icm93c2UvTWVkaWFCcm93c2VyVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTQzZTYwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL2Jyb3dzZS9NZWRpYUJyb3dzZXJVdGlscy5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEuYnJvd3NlOworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKKy8qKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIE1lZGlhQnJvd3NlclV0aWxzIHsKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gYXJlU2FtZU9wdGlvbnMoQnVuZGxlIG9wdGlvbnMxLCBCdW5kbGUgb3B0aW9uczIpIHsKKyAgICAgICAgaWYgKG9wdGlvbnMxID09IG9wdGlvbnMyKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zMSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gb3B0aW9uczIuZ2V0SW50KE1lZGlhQnJvd3Nlci5FWFRSQV9QQUdFLCAtMSkgPT0gLTEKKyAgICAgICAgICAgICAgICAgICAgJiYgb3B0aW9uczIuZ2V0SW50KE1lZGlhQnJvd3Nlci5FWFRSQV9QQUdFX1NJWkUsIC0xKSA9PSAtMTsKKyAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zMiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gb3B0aW9uczEuZ2V0SW50KE1lZGlhQnJvd3Nlci5FWFRSQV9QQUdFLCAtMSkgPT0gLTEKKyAgICAgICAgICAgICAgICAgICAgJiYgb3B0aW9uczEuZ2V0SW50KE1lZGlhQnJvd3Nlci5FWFRSQV9QQUdFX1NJWkUsIC0xKSA9PSAtMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBvcHRpb25zMS5nZXRJbnQoTWVkaWFCcm93c2VyLkVYVFJBX1BBR0UsIC0xKQorICAgICAgICAgICAgICAgICAgICA9PSBvcHRpb25zMi5nZXRJbnQoTWVkaWFCcm93c2VyLkVYVFJBX1BBR0UsIC0xKQorICAgICAgICAgICAgICAgICAgICAmJiBvcHRpb25zMS5nZXRJbnQoTWVkaWFCcm93c2VyLkVYVFJBX1BBR0VfU0laRSwgLTEpCisgICAgICAgICAgICAgICAgICAgID09IG9wdGlvbnMyLmdldEludChNZWRpYUJyb3dzZXIuRVhUUkFfUEFHRV9TSVpFLCAtMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzRHVwbGljYXRlZEl0ZW1zKEJ1bmRsZSBvcHRpb25zMSwgQnVuZGxlIG9wdGlvbnMyKSB7CisgICAgICAgIGludCBwYWdlMSA9IG9wdGlvbnMxID09IG51bGwgPyAtMSA6IG9wdGlvbnMxLmdldEludChNZWRpYUJyb3dzZXIuRVhUUkFfUEFHRSwgLTEpOworICAgICAgICBpbnQgcGFnZTIgPSBvcHRpb25zMiA9PSBudWxsID8gLTEgOiBvcHRpb25zMi5nZXRJbnQoTWVkaWFCcm93c2VyLkVYVFJBX1BBR0UsIC0xKTsKKyAgICAgICAgaW50IHBhZ2VTaXplMSA9IG9wdGlvbnMxID09IG51bGwgPyAtMSA6IG9wdGlvbnMxLmdldEludChNZWRpYUJyb3dzZXIuRVhUUkFfUEFHRV9TSVpFLCAtMSk7CisgICAgICAgIGludCBwYWdlU2l6ZTIgPSBvcHRpb25zMiA9PSBudWxsID8gLTEgOiBvcHRpb25zMi5nZXRJbnQoTWVkaWFCcm93c2VyLkVYVFJBX1BBR0VfU0laRSwgLTEpOworCisgICAgICAgIGludCBzdGFydEluZGV4MSwgc3RhcnRJbmRleDIsIGVuZEluZGV4MSwgZW5kSW5kZXgyOworICAgICAgICBpZiAocGFnZTEgPT0gLTEgfHwgcGFnZVNpemUxID09IC0xKSB7CisgICAgICAgICAgICBzdGFydEluZGV4MSA9IDA7CisgICAgICAgICAgICBlbmRJbmRleDEgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXJ0SW5kZXgxID0gcGFnZVNpemUxICogcGFnZTE7CisgICAgICAgICAgICBlbmRJbmRleDEgPSBzdGFydEluZGV4MSArIHBhZ2VTaXplMSAtIDE7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGFnZTIgPT0gLTEgfHwgcGFnZVNpemUyID09IC0xKSB7CisgICAgICAgICAgICBzdGFydEluZGV4MiA9IDA7CisgICAgICAgICAgICBlbmRJbmRleDIgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXJ0SW5kZXgyID0gcGFnZVNpemUyICogcGFnZTI7CisgICAgICAgICAgICBlbmRJbmRleDIgPSBzdGFydEluZGV4MiArIHBhZ2VTaXplMiAtIDE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RhcnRJbmRleDEgPD0gc3RhcnRJbmRleDIgJiYgc3RhcnRJbmRleDIgPD0gZW5kSW5kZXgxKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChzdGFydEluZGV4MSA8PSBlbmRJbmRleDIgJiYgZW5kSW5kZXgyIDw9IGVuZEluZGV4MSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL0lBY3RpdmVTZXNzaW9uc0xpc3RlbmVyLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9JQWN0aXZlU2Vzc2lvbnNMaXN0ZW5lci5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOWU0YmQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9JQWN0aXZlU2Vzc2lvbnNMaXN0ZW5lci5haWRsCkBAIC0wLDAgKzEsMjYgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS5zZXNzaW9uOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbjsKKworLyoqCisgKiBMaXN0ZW5zIGZvciBjaGFuZ2VzIHRvIHRoZSBsaXN0IG9mIGFjdGl2ZSBzZXNzaW9ucy4KKyAqIEBoaWRlCisgKi8KK29uZXdheSBpbnRlcmZhY2UgSUFjdGl2ZVNlc3Npb25zTGlzdGVuZXIgeworICAgIHZvaWQgb25BY3RpdmVTZXNzaW9uc0NoYW5nZWQoaW4gTGlzdDxNZWRpYVNlc3Npb24uVG9rZW4+IHNlc3Npb25zKTsKK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL0lDYWxsYmFjay5haWRsIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vSUNhbGxiYWNrLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIyYmZmYQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL0lDYWxsYmFjay5haWRsCkBAIC0wLDAgKzEsMzUgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS5zZXNzaW9uOworCitpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKKworLyoqCisgKiBAaGlkZQorICovCitvbmV3YXkgaW50ZXJmYWNlIElDYWxsYmFjayB7CisgICAgdm9pZCBvbk1lZGlhS2V5RXZlbnREaXNwYXRjaGVkVG9NZWRpYVNlc3Npb24oaW4gS2V5RXZlbnQgZXZlbnQsCisgICAgICAgICAgICBpbiBNZWRpYVNlc3Npb24uVG9rZW4gc2Vzc2lvblRva2VuKTsKKyAgICB2b2lkIG9uTWVkaWFLZXlFdmVudERpc3BhdGNoZWRUb01lZGlhQnV0dG9uUmVjZWl2ZXIoaW4gS2V5RXZlbnQgZXZlbnQsCisgICAgICAgICAgICBpbiBDb21wb25lbnROYW1lIG1lZGlhQnV0dG9uUmVjZWl2ZXIpOworCisgICAgdm9pZCBvbkFkZHJlc3NlZFBsYXllckNoYW5nZWRUb01lZGlhU2Vzc2lvbihpbiBNZWRpYVNlc3Npb24uVG9rZW4gc2Vzc2lvblRva2VuKTsKKyAgICB2b2lkIG9uQWRkcmVzc2VkUGxheWVyQ2hhbmdlZFRvTWVkaWFCdXR0b25SZWNlaXZlcihpbiBDb21wb25lbnROYW1lIG1lZGlhQnV0dG9uUmVjZWl2ZXIpOworfQorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9JT25NZWRpYUtleUxpc3RlbmVyLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9JT25NZWRpYUtleUxpc3RlbmVyLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE5OGVhMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL0lPbk1lZGlhS2V5TGlzdGVuZXIuYWlkbApAQCAtMCwwICsxLDI4IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEuc2Vzc2lvbjsKKworaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworCisvKioKKyAqIExpc3RlbmVyIHRvIGhhbmRsZSBtZWRpYSBrZXkuCisgKiBAaGlkZQorICovCitvbmV3YXkgaW50ZXJmYWNlIElPbk1lZGlhS2V5TGlzdGVuZXIgeworICAgIHZvaWQgb25NZWRpYUtleShpbiBLZXlFdmVudCBldmVudCwgaW4gUmVzdWx0UmVjZWl2ZXIgcmVzdWx0KTsKK30KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vSU9uVm9sdW1lS2V5TG9uZ1ByZXNzTGlzdGVuZXIuYWlkbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL0lPblZvbHVtZUtleUxvbmdQcmVzc0xpc3RlbmVyLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdiODM0NwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL0lPblZvbHVtZUtleUxvbmdQcmVzc0xpc3RlbmVyLmFpZGwKQEAgLTAsMCArMSwyNyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnNlc3Npb247CisKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CisKKy8qKgorICogTGlzdGVuZXIgdG8gaGFuZGxlIHZvbHVtZSBrZXkgbG9uZy1wcmVzcy4KKyAqIEBoaWRlCisgKi8KK29uZXdheSBpbnRlcmZhY2UgSU9uVm9sdW1lS2V5TG9uZ1ByZXNzTGlzdGVuZXIgeworICAgIHZvaWQgb25Wb2x1bWVLZXlMb25nUHJlc3MoaW4gS2V5RXZlbnQgZXZlbnQpOworfQorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9JU2Vzc2lvbi5haWRsIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vSVNlc3Npb24uYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGIxYzY0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vSVNlc3Npb24uYWlkbApAQCAtMCwwICsxLDU0IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEuc2Vzc2lvbjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CisvL2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGE7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBhcmNlbGVkTGlzdFNsaWNlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5JU2Vzc2lvbkNvbnRyb2xsZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOworCisvKioKKyAqIEludGVyZmFjZSB0byBhIE1lZGlhU2Vzc2lvbiBpbiB0aGUgc3lzdGVtLgorICogQGhpZGUKKyAqLworaW50ZXJmYWNlIElTZXNzaW9uIHsKKyAgICB2b2lkIHNlbmRFdmVudChTdHJpbmcgZXZlbnQsIGluIEJ1bmRsZSBkYXRhKTsKKyAgICBJU2Vzc2lvbkNvbnRyb2xsZXIgZ2V0Q29udHJvbGxlcigpOworICAgIHZvaWQgc2V0RmxhZ3MoaW50IGZsYWdzKTsKKyAgICB2b2lkIHNldEFjdGl2ZShib29sZWFuIGFjdGl2ZSk7CisgICAgdm9pZCBzZXRNZWRpYUJ1dHRvblJlY2VpdmVyKGluIFBlbmRpbmdJbnRlbnQgbWJyKTsKKyAgICB2b2lkIHNldExhdW5jaFBlbmRpbmdJbnRlbnQoaW4gUGVuZGluZ0ludGVudCBwaSk7CisgICAgdm9pZCBkZXN0cm95KCk7CisKKyAgICAvLyBUaGVzZSBjb21tYW5kcyBhcmUgZm9yIHRoZSBUcmFuc3BvcnRQZXJmb3JtZXIKKyAgICB2b2lkIHNldE1ldGFkYXRhKGluIE1lZGlhTWV0YWRhdGEgbWV0YWRhdGEsIGxvbmcgZHVyYXRpb24sIFN0cmluZyBtZXRhZGF0YURlc2NyaXB0aW9uKTsKKyAgICB2b2lkIHNldFBsYXliYWNrU3RhdGUoaW4gUGxheWJhY2tTdGF0ZSBzdGF0ZSk7CisgICAgdm9pZCBzZXRRdWV1ZShpbiBNZWRpYVBhcmNlbGVkTGlzdFNsaWNlIHF1ZXVlKTsKKyAgICB2b2lkIHNldFF1ZXVlVGl0bGUoQ2hhclNlcXVlbmNlIHRpdGxlKTsKKyAgICB2b2lkIHNldEV4dHJhcyhpbiBCdW5kbGUgZXh0cmFzKTsKKyAgICB2b2lkIHNldFJhdGluZ1R5cGUoaW50IHR5cGUpOworCisgICAgLy8gVGhlc2UgY29tbWFuZHMgcmVsYXRlIHRvIHZvbHVtZSBoYW5kbGluZworICAgIC8vVE9ETyhiLzExOTc1MTU5Mik6IERlY2lkZSBpZiBBdWRpb0F0dHJpYnV0ZXMgc2hvdWxkIGJlIHVwZGF0ZWQuCisgICAgLy92b2lkIHNldFBsYXliYWNrVG9Mb2NhbChpbiBBdWRpb0F0dHJpYnV0ZXMgYXR0cmlidXRlcyk7CisgICAgdm9pZCBzZXRQbGF5YmFja1RvUmVtb3RlKGludCBjb250cm9sLCBpbnQgbWF4KTsKKyAgICB2b2lkIHNldEN1cnJlbnRWb2x1bWUoaW50IGN1cnJlbnRWb2x1bWUpOworfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vSVNlc3Npb25DYWxsYmFjay5haWRsIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vSVNlc3Npb25DYWxsYmFjay5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNjMzOGQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9JU2Vzc2lvbkNhbGxiYWNrLmFpZGwKQEAgLTAsMCArMSw3MSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnNlc3Npb247CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQubWVkaWEuUmF0aW5nOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5JU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjazsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKKworLyoqCisgKiBAaGlkZQorICovCitvbmV3YXkgaW50ZXJmYWNlIElTZXNzaW9uQ2FsbGJhY2sgeworICAgIHZvaWQgb25Db21tYW5kKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLAorICAgICAgICAgICAgU3RyaW5nIGNvbW1hbmQsIGluIEJ1bmRsZSBhcmdzLCBpbiBSZXN1bHRSZWNlaXZlciBjYik7CisgICAgdm9pZCBvbk1lZGlhQnV0dG9uKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwgaW4gSW50ZW50IG1lZGlhQnV0dG9uSW50ZW50LAorICAgICAgICAgICAgaW50IHNlcXVlbmNlTnVtYmVyLCBpbiBSZXN1bHRSZWNlaXZlciBjYik7CisgICAgdm9pZCBvbk1lZGlhQnV0dG9uRnJvbUNvbnRyb2xsZXIoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLAorICAgICAgICAgICAgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLCBpbiBJbnRlbnQgbWVkaWFCdXR0b25JbnRlbnQpOworCisgICAgLy8gVGhlc2UgY2FsbGJhY2tzIGFyZSBmb3IgdGhlIFRyYW5zcG9ydFBlcmZvcm1lcgorICAgIHZvaWQgb25QcmVwYXJlKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyKTsKKyAgICB2b2lkIG9uUHJlcGFyZUZyb21NZWRpYUlkKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwKKyAgICAgICAgICAgIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwgU3RyaW5nIG1lZGlhSWQsIGluIEJ1bmRsZSBleHRyYXMpOworICAgIHZvaWQgb25QcmVwYXJlRnJvbVNlYXJjaChTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsCisgICAgICAgICAgICBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsIFN0cmluZyBxdWVyeSwgaW4gQnVuZGxlIGV4dHJhcyk7CisgICAgdm9pZCBvblByZXBhcmVGcm9tVXJpKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLAorICAgICAgICAgICAgaW4gVXJpIHVyaSwgaW4gQnVuZGxlIGV4dHJhcyk7CisgICAgdm9pZCBvblBsYXkoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIpOworICAgIHZvaWQgb25QbGF5RnJvbU1lZGlhSWQoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsCisgICAgICAgICAgICBTdHJpbmcgbWVkaWFJZCwgaW4gQnVuZGxlIGV4dHJhcyk7CisgICAgdm9pZCBvblBsYXlGcm9tU2VhcmNoKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLAorICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5LCBpbiBCdW5kbGUgZXh0cmFzKTsKKyAgICB2b2lkIG9uUGxheUZyb21VcmkoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsCisgICAgICAgICAgICBpbiBVcmkgdXJpLCBpbiBCdW5kbGUgZXh0cmFzKTsKKyAgICB2b2lkIG9uU2tpcFRvVHJhY2soU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsCisgICAgICAgICAgICBsb25nIGlkKTsKKyAgICB2b2lkIG9uUGF1c2UoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIpOworICAgIHZvaWQgb25TdG9wKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyKTsKKyAgICB2b2lkIG9uTmV4dChTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlcik7CisgICAgdm9pZCBvblByZXZpb3VzKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyKTsKKyAgICB2b2lkIG9uRmFzdEZvcndhcmQoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIpOworICAgIHZvaWQgb25SZXdpbmQoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIpOworICAgIHZvaWQgb25TZWVrVG8oU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsCisgICAgICAgICAgICBsb25nIHBvcyk7CisgICAgdm9pZCBvblJhdGUoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsCisgICAgICAgICAgICBpbiBSYXRpbmcgcmF0aW5nKTsKKyAgICB2b2lkIG9uQ3VzdG9tQWN0aW9uKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLAorICAgICAgICAgICAgU3RyaW5nIGFjdGlvbiwgaW4gQnVuZGxlIGFyZ3MpOworCisgICAgLy8gVGhlc2UgY2FsbGJhY2tzIGFyZSBmb3Igdm9sdW1lIGhhbmRsaW5nCisgICAgdm9pZCBvbkFkanVzdFZvbHVtZShTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwKKyAgICAgICAgICAgIGludCBkaXJlY3Rpb24pOworICAgIHZvaWQgb25TZXRWb2x1bWVUbyhTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsCisgICAgICAgICAgICBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsIGludCB2YWx1ZSk7Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9JU2Vzc2lvbkNvbnRyb2xsZXIuYWlkbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL0lTZXNzaW9uQ29udHJvbGxlci5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzM2IxMmYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9JU2Vzc2lvbkNvbnRyb2xsZXIuYWlkbApAQCAtMCwwICsxLDg4IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEuc2Vzc2lvbjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGE7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBhcmNlbGVkTGlzdFNsaWNlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuUmF0aW5nOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5JU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjazsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5QYXJjZWxhYmxlVm9sdW1lSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBJbnRlcmZhY2UgdG8gTWVkaWFTZXNzaW9uUmVjb3JkIGluIHRoZSBzeXN0ZW0uCisgKiBAaGlkZQorICovCitpbnRlcmZhY2UgSVNlc3Npb25Db250cm9sbGVyIHsKKyAgICB2b2lkIHNlbmRDb21tYW5kKFN0cmluZyBwYWNrYWdlTmFtZSwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLAorICAgICAgICAgICAgU3RyaW5nIGNvbW1hbmQsIGluIEJ1bmRsZSBhcmdzLCBpbiBSZXN1bHRSZWNlaXZlciBjYik7CisgICAgYm9vbGVhbiBzZW5kTWVkaWFCdXR0b24oU3RyaW5nIHBhY2thZ2VOYW1lLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsCisgICAgICAgICAgICBib29sZWFuIGFzU3lzdGVtU2VydmljZSwgaW4gS2V5RXZlbnQgbWVkaWFCdXR0b24pOworICAgIHZvaWQgcmVnaXN0ZXJDYWxsYmFja0xpc3RlbmVyKFN0cmluZyBwYWNrYWdlTmFtZSwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2IpOworICAgIHZvaWQgdW5yZWdpc3RlckNhbGxiYWNrTGlzdGVuZXIoSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2IpOworICAgIGJvb2xlYW4gaXNUcmFuc3BvcnRDb250cm9sRW5hYmxlZCgpOworICAgIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpOworICAgIFN0cmluZyBnZXRUYWcoKTsKKyAgICBQZW5kaW5nSW50ZW50IGdldExhdW5jaFBlbmRpbmdJbnRlbnQoKTsKKyAgICBsb25nIGdldEZsYWdzKCk7CisgICAgUGFyY2VsYWJsZVZvbHVtZUluZm8gZ2V0Vm9sdW1lQXR0cmlidXRlcygpOworICAgIHZvaWQgYWRqdXN0Vm9sdW1lKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIG9wUGFja2FnZU5hbWUsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwKKyAgICAgICAgICAgIGJvb2xlYW4gYXNTeXN0ZW1TZXJ2aWNlLCBpbnQgZGlyZWN0aW9uLCBpbnQgZmxhZ3MpOworICAgIHZvaWQgc2V0Vm9sdW1lVG8oU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgb3BQYWNrYWdlTmFtZSwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLAorICAgICAgICAgICAgaW50IHZhbHVlLCBpbnQgZmxhZ3MpOworCisgICAgLy8gVGhlc2UgY29tbWFuZHMgYXJlIGZvciB0aGUgVHJhbnNwb3J0Q29udHJvbHMKKyAgICB2b2lkIHByZXBhcmUoU3RyaW5nIHBhY2thZ2VOYW1lLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIpOworICAgIHZvaWQgcHJlcGFyZUZyb21NZWRpYUlkKFN0cmluZyBwYWNrYWdlTmFtZSwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLAorICAgICAgICAgICAgU3RyaW5nIG1lZGlhSWQsIGluIEJ1bmRsZSBleHRyYXMpOworICAgIHZvaWQgcHJlcGFyZUZyb21TZWFyY2goU3RyaW5nIHBhY2thZ2VOYW1lLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsCisgICAgICAgICAgICBTdHJpbmcgc3RyaW5nLCBpbiBCdW5kbGUgZXh0cmFzKTsKKyAgICB2b2lkIHByZXBhcmVGcm9tVXJpKFN0cmluZyBwYWNrYWdlTmFtZSwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLAorICAgICAgICAgICAgaW4gVXJpIHVyaSwgaW4gQnVuZGxlIGV4dHJhcyk7CisgICAgdm9pZCBwbGF5KFN0cmluZyBwYWNrYWdlTmFtZSwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyKTsKKyAgICB2b2lkIHBsYXlGcm9tTWVkaWFJZChTdHJpbmcgcGFja2FnZU5hbWUsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwKKyAgICAgICAgICAgIFN0cmluZyBtZWRpYUlkLCBpbiBCdW5kbGUgZXh0cmFzKTsKKyAgICB2b2lkIHBsYXlGcm9tU2VhcmNoKFN0cmluZyBwYWNrYWdlTmFtZSwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLAorICAgICAgICAgICAgU3RyaW5nIHN0cmluZywgaW4gQnVuZGxlIGV4dHJhcyk7CisgICAgdm9pZCBwbGF5RnJvbVVyaShTdHJpbmcgcGFja2FnZU5hbWUsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwKKyAgICAgICAgICAgIGluIFVyaSB1cmksIGluIEJ1bmRsZSBleHRyYXMpOworICAgIHZvaWQgc2tpcFRvUXVldWVJdGVtKFN0cmluZyBwYWNrYWdlTmFtZSwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLCBsb25nIGlkKTsKKyAgICB2b2lkIHBhdXNlKFN0cmluZyBwYWNrYWdlTmFtZSwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyKTsKKyAgICB2b2lkIHN0b3AoU3RyaW5nIHBhY2thZ2VOYW1lLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIpOworICAgIHZvaWQgbmV4dChTdHJpbmcgcGFja2FnZU5hbWUsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlcik7CisgICAgdm9pZCBwcmV2aW91cyhTdHJpbmcgcGFja2FnZU5hbWUsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlcik7CisgICAgdm9pZCBmYXN0Rm9yd2FyZChTdHJpbmcgcGFja2FnZU5hbWUsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlcik7CisgICAgdm9pZCByZXdpbmQoU3RyaW5nIHBhY2thZ2VOYW1lLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIpOworICAgIHZvaWQgc2Vla1RvKFN0cmluZyBwYWNrYWdlTmFtZSwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLCBsb25nIHBvcyk7CisgICAgdm9pZCByYXRlKFN0cmluZyBwYWNrYWdlTmFtZSwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLCBpbiBSYXRpbmcgcmF0aW5nKTsKKyAgICB2b2lkIHNlbmRDdXN0b21BY3Rpb24oU3RyaW5nIHBhY2thZ2VOYW1lLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsCisgICAgICAgICAgICBTdHJpbmcgYWN0aW9uLCBpbiBCdW5kbGUgYXJncyk7CisgICAgTWVkaWFNZXRhZGF0YSBnZXRNZXRhZGF0YSgpOworICAgIFBsYXliYWNrU3RhdGUgZ2V0UGxheWJhY2tTdGF0ZSgpOworICAgIE1lZGlhUGFyY2VsZWRMaXN0U2xpY2UgZ2V0UXVldWUoKTsKKyAgICBDaGFyU2VxdWVuY2UgZ2V0UXVldWVUaXRsZSgpOworICAgIEJ1bmRsZSBnZXRFeHRyYXMoKTsKKyAgICBpbnQgZ2V0UmF0aW5nVHlwZSgpOworfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2suYWlkbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL0lTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVjYzRmNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL0lTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrLmFpZGwKQEAgLTAsMCArMSwzOSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnNlc3Npb247CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGE7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBhcmNlbGVkTGlzdFNsaWNlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5QYXJjZWxhYmxlVm9sdW1lSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworCisvKioKKyAqIEBoaWRlCisgKi8KK29uZXdheSBpbnRlcmZhY2UgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgeworICAgIHZvaWQgb25FdmVudChTdHJpbmcgZXZlbnQsIGluIEJ1bmRsZSBleHRyYXMpOworICAgIHZvaWQgb25TZXNzaW9uRGVzdHJveWVkKCk7CisKKyAgICAvLyBUaGVzZSBjYWxsYmFja3MgYXJlIGZvciB0aGUgVHJhbnNwb3J0Q29udHJvbGxlcgorICAgIHZvaWQgb25QbGF5YmFja1N0YXRlQ2hhbmdlZChpbiBQbGF5YmFja1N0YXRlIHN0YXRlKTsKKyAgICB2b2lkIG9uTWV0YWRhdGFDaGFuZ2VkKGluIE1lZGlhTWV0YWRhdGEgbWV0YWRhdGEpOworICAgIHZvaWQgb25RdWV1ZUNoYW5nZWQoaW4gTWVkaWFQYXJjZWxlZExpc3RTbGljZSBxdWV1ZSk7CisgICAgdm9pZCBvblF1ZXVlVGl0bGVDaGFuZ2VkKENoYXJTZXF1ZW5jZSB0aXRsZSk7CisgICAgdm9pZCBvbkV4dHJhc0NoYW5nZWQoaW4gQnVuZGxlIGV4dHJhcyk7CisgICAgdm9pZCBvblZvbHVtZUluZm9DaGFuZ2VkKGluIFBhcmNlbGFibGVWb2x1bWVJbmZvIGluZm8pOworfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vSVNlc3Npb25NYW5hZ2VyLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9JU2Vzc2lvbk1hbmFnZXIuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmMyMjZmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vSVNlc3Npb25NYW5hZ2VyLmFpZGwKQEAgLTAsMCArMSw1OCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnNlc3Npb247CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLklSZW1vdGVWb2x1bWVDb250cm9sbGVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5JQWN0aXZlU2Vzc2lvbnNMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uSUNhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5JT25NZWRpYUtleUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5JT25Wb2x1bWVLZXlMb25nUHJlc3NMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uSVNlc3Npb247CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLklTZXNzaW9uQ2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworCisvKioKKyAqIEludGVyZmFjZSB0byB0aGUgTWVkaWFTZXNzaW9uTWFuYWdlclNlcnZpY2UKKyAqIEBoaWRlCisgKi8KK2ludGVyZmFjZSBJU2Vzc2lvbk1hbmFnZXIgeworICAgIElTZXNzaW9uIGNyZWF0ZVNlc3Npb24oU3RyaW5nIHBhY2thZ2VOYW1lLCBpbiBJU2Vzc2lvbkNhbGxiYWNrIGNiLCBTdHJpbmcgdGFnLCBpbnQgdXNlcklkKTsKKyAgICBMaXN0PElCaW5kZXI+IGdldFNlc3Npb25zKGluIENvbXBvbmVudE5hbWUgY29tcE5hbWUsIGludCB1c2VySWQpOworICAgIHZvaWQgZGlzcGF0Y2hNZWRpYUtleUV2ZW50KFN0cmluZyBwYWNrYWdlTmFtZSwgYm9vbGVhbiBhc1N5c3RlbVNlcnZpY2UsIGluIEtleUV2ZW50IGtleUV2ZW50LAorICAgICAgICAgICAgYm9vbGVhbiBuZWVkV2FrZUxvY2spOworICAgIHZvaWQgZGlzcGF0Y2hWb2x1bWVLZXlFdmVudChTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBvcFBhY2thZ2VOYW1lLCBib29sZWFuIGFzU3lzdGVtU2VydmljZSwKKyAgICAgICAgICAgIGluIEtleUV2ZW50IGtleUV2ZW50LCBpbnQgc3RyZWFtLCBib29sZWFuIG11c2ljT25seSk7CisgICAgdm9pZCBkaXNwYXRjaEFkanVzdFZvbHVtZShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBvcFBhY2thZ2VOYW1lLCBpbnQgc3VnZ2VzdGVkU3RyZWFtLAorICAgICAgICAgICAgaW50IGRlbHRhLCBpbnQgZmxhZ3MpOworICAgIHZvaWQgYWRkU2Vzc2lvbnNMaXN0ZW5lcihpbiBJQWN0aXZlU2Vzc2lvbnNMaXN0ZW5lciBsaXN0ZW5lciwgaW4gQ29tcG9uZW50TmFtZSBjb21wTmFtZSwKKyAgICAgICAgICAgIGludCB1c2VySWQpOworICAgIHZvaWQgcmVtb3ZlU2Vzc2lvbnNMaXN0ZW5lcihpbiBJQWN0aXZlU2Vzc2lvbnNMaXN0ZW5lciBsaXN0ZW5lcik7CisKKyAgICAvLyBUaGlzIGlzIGZvciB0aGUgc3lzdGVtIHZvbHVtZSBVSSBvbmx5CisgICAgdm9pZCBzZXRSZW1vdGVWb2x1bWVDb250cm9sbGVyKGluIElSZW1vdGVWb2x1bWVDb250cm9sbGVyIHJ2Yyk7CisKKyAgICAvLyBGb3IgUGhvbmVXaW5kb3dNYW5hZ2VyIHRvIHByZWNoZWNrIG1lZGlhIGtleXMKKyAgICBib29sZWFuIGlzR2xvYmFsUHJpb3JpdHlBY3RpdmUoKTsKKworICAgIHZvaWQgc2V0Q2FsbGJhY2soaW4gSUNhbGxiYWNrIGNhbGxiYWNrKTsKKyAgICB2b2lkIHNldE9uVm9sdW1lS2V5TG9uZ1ByZXNzTGlzdGVuZXIoaW4gSU9uVm9sdW1lS2V5TG9uZ1ByZXNzTGlzdGVuZXIgbGlzdGVuZXIpOworICAgIHZvaWQgc2V0T25NZWRpYUtleUxpc3RlbmVyKGluIElPbk1lZGlhS2V5TGlzdGVuZXIgbGlzdGVuZXIpOworCisgICAgLy8gTWVkaWFTZXNzaW9uMgorICAgIGJvb2xlYW4gaXNUcnVzdGVkKFN0cmluZyBjb250cm9sbGVyUGFja2FnZU5hbWUsIGludCBjb250cm9sbGVyUGlkLCBpbnQgY29udHJvbGxlclVpZCk7Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9NZWRpYUNvbnRyb2xsZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL01lZGlhQ29udHJvbGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NjgyYTgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9NZWRpYUNvbnRyb2xsZXIuamF2YQpAQCAtMCwwICsxLDExOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEuc2Vzc2lvbjsKKworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uVW5zdXBwb3J0ZWRBcHBVc2FnZTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGFyY2VsZWRMaXN0U2xpY2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5SYXRpbmc7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBBbGxvd3MgYW4gYXBwIHRvIGludGVyYWN0IHdpdGggYW4gb25nb2luZyBtZWRpYSBzZXNzaW9uLiBNZWRpYSBidXR0b25zIGFuZAorICogb3RoZXIgY29tbWFuZHMgY2FuIGJlIHNlbnQgdG8gdGhlIHNlc3Npb24uIEEgY2FsbGJhY2sgbWF5IGJlIHJlZ2lzdGVyZWQgdG8KKyAqIHJlY2VpdmUgdXBkYXRlcyBmcm9tIHRoZSBzZXNzaW9uLCBzdWNoIGFzIG1ldGFkYXRhIGFuZCBwbGF5IHN0YXRlIGNoYW5nZXMuCisgKiA8cD4KKyAqIEEgTWVkaWFDb250cm9sbGVyIGNhbiBiZSBjcmVhdGVkIHRocm91Z2gge0BsaW5rIE1lZGlhU2Vzc2lvbk1hbmFnZXJ9IGlmIHlvdQorICogaG9sZCB0aGUgImFuZHJvaWQucGVybWlzc2lvbi5NRURJQV9DT05URU5UX0NPTlRST0wiIHBlcm1pc3Npb24gb3IgYXJlIGFuCisgKiBlbmFibGVkIG5vdGlmaWNhdGlvbiBsaXN0ZW5lciBvciBieSBnZXR0aW5nIGEge0BsaW5rIE1lZGlhU2Vzc2lvbi5Ub2tlbn0KKyAqIGRpcmVjdGx5IGZyb20gdGhlIHNlc3Npb24gb3duZXIuCisgKiA8cD4KKyAqIE1lZGlhQ29udHJvbGxlciBvYmplY3RzIGFyZSB0aHJlYWQtc2FmZS4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhQ29udHJvbGxlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYUNvbnRyb2xsZXIiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19FVkVOVCA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19VUERBVEVfUExBWUJBQ0tfU1RBVEUgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVVBEQVRFX01FVEFEQVRBID0gMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1VQREFURV9WT0xVTUUgPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVVBEQVRFX1FVRVVFID0gNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1VQREFURV9RVUVVRV9USVRMRSA9IDY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19VUERBVEVfRVhUUkFTID0gNzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0RFU1RST1lFRCA9IDg7CisKKyAgICBwcml2YXRlIGZpbmFsIElTZXNzaW9uQ29udHJvbGxlciBtU2Vzc2lvbkJpbmRlcjsKKworICAgIHByaXZhdGUgZmluYWwgTWVkaWFTZXNzaW9uLlRva2VuIG1Ub2tlbjsKKyAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBmaW5hbCBDYWxsYmFja1N0dWIgbUNiU3R1YiA9IG5ldyBDYWxsYmFja1N0dWIodGhpcyk7CisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8TWVzc2FnZUhhbmRsZXI+IG1DYWxsYmFja3MgPSBuZXcgQXJyYXlMaXN0PE1lc3NhZ2VIYW5kbGVyPigpOworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOworCisgICAgcHJpdmF0ZSBib29sZWFuIG1DYlJlZ2lzdGVyZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIFN0cmluZyBtUGFja2FnZU5hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgbVRhZzsKKworICAgIHByaXZhdGUgZmluYWwgVHJhbnNwb3J0Q29udHJvbHMgbVRyYW5zcG9ydENvbnRyb2xzOworCisgICAgLyoqCisgICAgICogQ2FsbCBmb3IgY3JlYXRpbmcgYSBNZWRpYUNvbnRyb2xsZXIgZGlyZWN0bHkgZnJvbSBhIGJpbmRlci4gU2hvdWxkIG9ubHkKKyAgICAgKiBiZSB1c2VkIGJ5IGZyYW1ld29yayBjb2RlLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVkaWFDb250cm9sbGVyKENvbnRleHQgY29udGV4dCwgSVNlc3Npb25Db250cm9sbGVyIHNlc3Npb25CaW5kZXIpIHsKKyAgICAgICAgaWYgKHNlc3Npb25CaW5kZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2Vzc2lvbiB0b2tlbiBjYW5ub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvbnRleHQgY2Fubm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBtU2Vzc2lvbkJpbmRlciA9IHNlc3Npb25CaW5kZXI7CisgICAgICAgIG1UcmFuc3BvcnRDb250cm9scyA9IG5ldyBUcmFuc3BvcnRDb250cm9scygpOworICAgICAgICBtVG9rZW4gPSBuZXcgTWVkaWFTZXNzaW9uLlRva2VuKHNlc3Npb25CaW5kZXIpOworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IE1lZGlhQ29udHJvbGxlciBmcm9tIGEgc2Vzc2lvbidzIHRva2VuLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNhbGxlcidzIGNvbnRleHQuCisgICAgICogQHBhcmFtIHRva2VuIFRoZSB0b2tlbiBmb3IgdGhlIHNlc3Npb24uCisgICAgICovCisgICAgcHVibGljIE1lZGlhQ29udHJvbGxlcihATm9uTnVsbCBDb250ZXh0IGNvbnRleHQsIEBOb25OdWxsIE1lZGlhU2Vzc2lvbi5Ub2tlbiB0b2tlbikgeworICAgICAgICB0aGlzKGNvbnRleHQsIHRva2VuLmdldEJpbmRlcigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSB7QGxpbmsgVHJhbnNwb3J0Q29udHJvbHN9IGluc3RhbmNlIHRvIHNlbmQgdHJhbnNwb3J0IGFjdGlvbnMgdG8KKyAgICAgKiB0aGUgYXNzb2NpYXRlZCBzZXNzaW9uLgorICAgICAqCisgICAgICogQHJldHVybiBBIHRyYW5zcG9ydCBjb250cm9scyBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vbk51bGwgVHJhbnNwb3J0Q29udHJvbHMgZ2V0VHJhbnNwb3J0Q29udHJvbHMoKSB7CisgICAgICAgIHJldHVybiBtVHJhbnNwb3J0Q29udHJvbHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCB0aGUgc3BlY2lmaWVkIG1lZGlhIGJ1dHRvbiBldmVudCB0byB0aGUgc2Vzc2lvbi4gT25seSBtZWRpYSBrZXlzIGNhbgorICAgICAqIGJlIHNlbnQgYnkgdGhpcyBtZXRob2QsIG90aGVyIGtleXMgd2lsbCBiZSBpZ25vcmVkLgorICAgICAqCisgICAgICogQHBhcmFtIGtleUV2ZW50IFRoZSBtZWRpYSBidXR0b24gZXZlbnQgdG8gZGlzcGF0Y2guCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBldmVudCB3YXMgc2VudCB0byB0aGUgc2Vzc2lvbiwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoTWVkaWFCdXR0b25FdmVudChATm9uTnVsbCBLZXlFdmVudCBrZXlFdmVudCkgeworICAgICAgICByZXR1cm4gZGlzcGF0Y2hNZWRpYUJ1dHRvbkV2ZW50SW50ZXJuYWwoZmFsc2UsIGtleUV2ZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNwYXRjaGVzIHRoZSBtZWRpYSBidXR0b24gZXZlbnQgYXMgc3lzdGVtIHNlcnZpY2UgdG8gdGhlIHNlc3Npb24uCisgICAgICogPHA+CisgICAgICogU2hvdWxkIGJlIG9ubHkgY2FsbGVkIGJ5IHRoZSB7QGxpbmsgY29tLmFuZHJvaWQuaW50ZXJuYWwucG9saWN5LlBob25lV2luZG93fSB3aGVuIHRoZQorICAgICAqIGZvcmVncm91bmQgYWN0aXZpdHkgZGlkbid0IGNvbnN1bWUgdGhlIGtleSBmcm9tIHRoZSBoYXJkd2FyZSBkZXZpY2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGtleUV2ZW50IG1lZGlhIGtleSBldmVudAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBldmVudCB3YXMgc2VudCB0byB0aGUgc2Vzc2lvbiwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoTWVkaWFCdXR0b25FdmVudEFzU3lzdGVtU2VydmljZShATm9uTnVsbCBLZXlFdmVudCBrZXlFdmVudCkgeworICAgICAgICByZXR1cm4gZGlzcGF0Y2hNZWRpYUJ1dHRvbkV2ZW50SW50ZXJuYWwodHJ1ZSwga2V5RXZlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBkaXNwYXRjaE1lZGlhQnV0dG9uRXZlbnRJbnRlcm5hbChib29sZWFuIGFzU3lzdGVtU2VydmljZSwKKyAgICAgICAgICAgIEBOb25OdWxsIEtleUV2ZW50IGtleUV2ZW50KSB7CisgICAgICAgIGlmIChrZXlFdmVudCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJLZXlFdmVudCBtYXkgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUtleUV2ZW50LmlzTWVkaWFTZXNzaW9uS2V5KGtleUV2ZW50LmdldEtleUNvZGUoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXNzaW9uQmluZGVyLnNlbmRNZWRpYUJ1dHRvbihtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLCBtQ2JTdHViLAorICAgICAgICAgICAgICAgICAgICBhc1N5c3RlbVNlcnZpY2UsIGtleUV2ZW50KTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFN5c3RlbSBpcyBkZWFkLiA9KAorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNwYXRjaGVzIHRoZSB2b2x1bWUgYnV0dG9uIGV2ZW50IGFzIHN5c3RlbSBzZXJ2aWNlIHRvIHRoZSBzZXNzaW9uLgorICAgICAqIDxwPgorICAgICAqIFNob3VsZCBiZSBvbmx5IGNhbGxlZCBieSB0aGUge0BsaW5rIGNvbS5hbmRyb2lkLmludGVybmFsLnBvbGljeS5QaG9uZVdpbmRvd30gd2hlbiB0aGUKKyAgICAgKiBmb3JlZ3JvdW5kIGFjdGl2aXR5IGRpZG4ndCBjb25zdW1lIHRoZSBrZXkgZnJvbSB0aGUgaGFyZHdhcmUgZGV2aWNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXlFdmVudCB2b2x1bWUga2V5IGV2ZW50CisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaFZvbHVtZUJ1dHRvbkV2ZW50QXNTeXN0ZW1TZXJ2aWNlKEBOb25OdWxsIEtleUV2ZW50IGtleUV2ZW50KSB7CisgICAgICAgIHN3aXRjaCAoa2V5RXZlbnQuZ2V0QWN0aW9uKCkpIHsKKyAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuQUNUSU9OX0RPV046IHsKKyAgICAgICAgICAgICAgICBpbnQgZGlyZWN0aW9uID0gMDsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGtleUV2ZW50LmdldEtleUNvZGUoKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfVk9MVU1FX1VQOgorICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gQXVkaW9NYW5hZ2VyLkFESlVTVF9SQUlTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfVk9MVU1FX0RPV046CisgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBBdWRpb01hbmFnZXIuQURKVVNUX0xPV0VSOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfTVVURToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IEF1ZGlvTWFuYWdlci5BREpVU1RfVE9HR0xFX01VVEU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIuYWRqdXN0Vm9sdW1lKG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0T3BQYWNrYWdlTmFtZSgpLCBtQ2JTdHViLCB0cnVlLCBkaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NYW5hZ2VyLkZMQUdfU0hPV19VSSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciBjYWxsaW5nIGFkanVzdFZvbHVtZUJ5IiwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIEtleUV2ZW50LkFDVElPTl9VUDogeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBmbGFncyA9IEF1ZGlvTWFuYWdlci5GTEFHX1BMQVlfU09VTkQgfCBBdWRpb01hbmFnZXIuRkxBR19WSUJSQVRFCisgICAgICAgICAgICAgICAgICAgICAgICB8IEF1ZGlvTWFuYWdlci5GTEFHX0ZST01fS0VZOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyLmFkanVzdFZvbHVtZShtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldE9wUGFja2FnZU5hbWUoKSwgbUNiU3R1YiwgdHJ1ZSwgMCwgZmxhZ3MpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRXJyb3IgY2FsbGluZyBhZGp1c3RWb2x1bWVCeSIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY3VycmVudCBwbGF5YmFjayBzdGF0ZSBmb3IgdGhpcyBzZXNzaW9uLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCBQbGF5YmFja1N0YXRlIG9yIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgQE51bGxhYmxlIFBsYXliYWNrU3RhdGUgZ2V0UGxheWJhY2tTdGF0ZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtU2Vzc2lvbkJpbmRlci5nZXRQbGF5YmFja1N0YXRlKCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cud3RmKFRBRywgIkVycm9yIGNhbGxpbmcgZ2V0UGxheWJhY2tTdGF0ZS4iLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJyZW50IG1ldGFkYXRhIGZvciB0aGlzIHNlc3Npb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IE1lZGlhTWV0YWRhdGEgb3IgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEgZ2V0TWV0YWRhdGEoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlc3Npb25CaW5kZXIuZ2V0TWV0YWRhdGEoKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRXJyb3IgY2FsbGluZyBnZXRNZXRhZGF0YS4iLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJyZW50IHBsYXkgcXVldWUgZm9yIHRoaXMgc2Vzc2lvbiBpZiBvbmUgaXMgc2V0LiBJZiB5b3Ugb25seQorICAgICAqIGNhcmUgYWJvdXQgdGhlIGN1cnJlbnQgaXRlbSB7QGxpbmsgI2dldE1ldGFkYXRhKCl9IHNob3VsZCBiZSB1c2VkLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCBwbGF5IHF1ZXVlIG9yIG51bGwuCisgICAgICovCisgICAgcHVibGljIEBOdWxsYWJsZSBMaXN0PE1lZGlhU2Vzc2lvbi5RdWV1ZUl0ZW0+IGdldFF1ZXVlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWVkaWFQYXJjZWxlZExpc3RTbGljZSBxdWV1ZSA9IG1TZXNzaW9uQmluZGVyLmdldFF1ZXVlKCk7CisgICAgICAgICAgICBpZiAocXVldWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBxdWV1ZS5nZXRMaXN0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cud3RmKFRBRywgIkVycm9yIGNhbGxpbmcgZ2V0UXVldWUuIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBxdWV1ZSB0aXRsZSBmb3IgdGhpcyBzZXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBATnVsbGFibGUgQ2hhclNlcXVlbmNlIGdldFF1ZXVlVGl0bGUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlc3Npb25CaW5kZXIuZ2V0UXVldWVUaXRsZSgpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciBjYWxsaW5nIGdldFF1ZXVlVGl0bGUiLCBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGV4dHJhcyBmb3IgdGhpcyBzZXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBATnVsbGFibGUgQnVuZGxlIGdldEV4dHJhcygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtU2Vzc2lvbkJpbmRlci5nZXRFeHRyYXMoKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRXJyb3IgY2FsbGluZyBnZXRFeHRyYXMiLCBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHJhdGluZyB0eXBlIHN1cHBvcnRlZCBieSB0aGUgc2Vzc2lvbi4gT25lIG9mOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rIFJhdGluZyNSQVRJTkdfTk9ORX08L2xpPgorICAgICAqIDxsaT57QGxpbmsgUmF0aW5nI1JBVElOR19IRUFSVH08L2xpPgorICAgICAqIDxsaT57QGxpbmsgUmF0aW5nI1JBVElOR19USFVNQl9VUF9ET1dOfTwvbGk+CisgICAgICogPGxpPntAbGluayBSYXRpbmcjUkFUSU5HXzNfU1RBUlN9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIFJhdGluZyNSQVRJTkdfNF9TVEFSU308L2xpPgorICAgICAqIDxsaT57QGxpbmsgUmF0aW5nI1JBVElOR181X1NUQVJTfTwvbGk+CisgICAgICogPGxpPntAbGluayBSYXRpbmcjUkFUSU5HX1BFUkNFTlRBR0V9PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgc3VwcG9ydGVkIHJhdGluZyB0eXBlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRSYXRpbmdUeXBlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXNzaW9uQmluZGVyLmdldFJhdGluZ1R5cGUoKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRXJyb3IgY2FsbGluZyBnZXRSYXRpbmdUeXBlLiIsIGUpOworICAgICAgICAgICAgcmV0dXJuIFJhdGluZy5SQVRJTkdfTk9ORTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZmxhZ3MgZm9yIHRoaXMgc2Vzc2lvbi4gRmxhZ3MgYXJlIGRlZmluZWQgaW4ge0BsaW5rIE1lZGlhU2Vzc2lvbn0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHNldCBvZiBmbGFncyBmb3IgdGhlIHNlc3Npb24uCisgICAgICovCisgICAgcHVibGljIEBNZWRpYVNlc3Npb24uU2Vzc2lvbkZsYWdzIGxvbmcgZ2V0RmxhZ3MoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlc3Npb25CaW5kZXIuZ2V0RmxhZ3MoKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRXJyb3IgY2FsbGluZyBnZXRGbGFncy4iLCBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGN1cnJlbnQgcGxheWJhY2sgaW5mbyBmb3IgdGhpcyBzZXNzaW9uLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCBwbGF5YmFjayBpbmZvIG9yIG51bGwuCisgICAgICovCisgICAgcHVibGljIEBOdWxsYWJsZSBQbGF5YmFja0luZm8gZ2V0UGxheWJhY2tJbmZvKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgUGFyY2VsYWJsZVZvbHVtZUluZm8gcmVzdWx0ID0gbVNlc3Npb25CaW5kZXIuZ2V0Vm9sdW1lQXR0cmlidXRlcygpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBQbGF5YmFja0luZm8ocmVzdWx0LnZvbHVtZVR5cGUsIHJlc3VsdC5hdWRpb0F0dHJzLCByZXN1bHQuY29udHJvbFR5cGUsCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5tYXhWb2x1bWUsIHJlc3VsdC5jdXJyZW50Vm9sdW1lKTsKKworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciBjYWxsaW5nIGdldEF1ZGlvSW5mby4iLCBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYW4gaW50ZW50IGZvciBsYXVuY2hpbmcgVUkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2Vzc2lvbiBpZiBvbmUKKyAgICAgKiBleGlzdHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEge0BsaW5rIFBlbmRpbmdJbnRlbnR9IHRvIGxhdW5jaCBVSSBvciBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBATnVsbGFibGUgUGVuZGluZ0ludGVudCBnZXRTZXNzaW9uQWN0aXZpdHkoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlc3Npb25CaW5kZXIuZ2V0TGF1bmNoUGVuZGluZ0ludGVudCgpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciBjYWxsaW5nIGdldFBlbmRpbmdJbnRlbnQuIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB0b2tlbiBmb3IgdGhlIHNlc3Npb24gdGhpcyBpcyBjb25uZWN0ZWQgdG8uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB0b2tlbiBmb3IgdGhlIGNvbm5lY3RlZCBzZXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBATm9uTnVsbCBNZWRpYVNlc3Npb24uVG9rZW4gZ2V0U2Vzc2lvblRva2VuKCkgeworICAgICAgICByZXR1cm4gbVRva2VuOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdm9sdW1lIG9mIHRoZSBvdXRwdXQgdGhpcyBzZXNzaW9uIGlzIHBsYXlpbmcgb24uIFRoZSBjb21tYW5kIHdpbGwKKyAgICAgKiBiZSBpZ25vcmVkIGlmIGl0IGRvZXMgbm90IHN1cHBvcnQKKyAgICAgKiB7QGxpbmsgVm9sdW1lUHJvdmlkZXIjVk9MVU1FX0NPTlRST0xfQUJTT0xVVEV9LiBUaGUgZmxhZ3MgaW4KKyAgICAgKiB7QGxpbmsgQXVkaW9NYW5hZ2VyfSBtYXkgYmUgdXNlZCB0byBhZmZlY3QgdGhlIGhhbmRsaW5nLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0UGxheWJhY2tJbmZvKCkKKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldCBpdCB0bywgYmV0d2VlbiAwIGFuZCB0aGUgcmVwb3J0ZWQgbWF4LgorICAgICAqIEBwYXJhbSBmbGFncyBGbGFncyBmcm9tIHtAbGluayBBdWRpb01hbmFnZXJ9IHRvIGluY2x1ZGUgd2l0aCB0aGUgdm9sdW1lCisgICAgICogICAgICAgICAgICByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZvbHVtZVRvKGludCB2YWx1ZSwgaW50IGZsYWdzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlci5zZXRWb2x1bWVUbyhtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLCBtQ29udGV4dC5nZXRPcFBhY2thZ2VOYW1lKCksCisgICAgICAgICAgICAgICAgICAgIG1DYlN0dWIsIHZhbHVlLCBmbGFncyk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cud3RmKFRBRywgIkVycm9yIGNhbGxpbmcgc2V0Vm9sdW1lVG8uIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGp1c3QgdGhlIHZvbHVtZSBvZiB0aGUgb3V0cHV0IHRoaXMgc2Vzc2lvbiBpcyBwbGF5aW5nIG9uLiBUaGUgZGlyZWN0aW9uCisgICAgICogbXVzdCBiZSBvbmUgb2Yge0BsaW5rIEF1ZGlvTWFuYWdlciNBREpVU1RfTE9XRVJ9LAorICAgICAqIHtAbGluayBBdWRpb01hbmFnZXIjQURKVVNUX1JBSVNFfSwgb3Ige0BsaW5rIEF1ZGlvTWFuYWdlciNBREpVU1RfU0FNRX0uCisgICAgICogVGhlIGNvbW1hbmQgd2lsbCBiZSBpZ25vcmVkIGlmIHRoZSBzZXNzaW9uIGRvZXMgbm90IHN1cHBvcnQKKyAgICAgKiB7QGxpbmsgVm9sdW1lUHJvdmlkZXIjVk9MVU1FX0NPTlRST0xfUkVMQVRJVkV9IG9yCisgICAgICoge0BsaW5rIFZvbHVtZVByb3ZpZGVyI1ZPTFVNRV9DT05UUk9MX0FCU09MVVRFfS4gVGhlIGZsYWdzIGluCisgICAgICoge0BsaW5rIEF1ZGlvTWFuYWdlcn0gbWF5IGJlIHVzZWQgdG8gYWZmZWN0IHRoZSBoYW5kbGluZy4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldFBsYXliYWNrSW5mbygpCisgICAgICogQHBhcmFtIGRpcmVjdGlvbiBUaGUgZGlyZWN0aW9uIHRvIGFkanVzdCB0aGUgdm9sdW1lIGluLgorICAgICAqIEBwYXJhbSBmbGFncyBBbnkgZmxhZ3MgdG8gcGFzcyB3aXRoIHRoZSBjb21tYW5kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkanVzdFZvbHVtZShpbnQgZGlyZWN0aW9uLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyLmFkanVzdFZvbHVtZShtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLCBtQ29udGV4dC5nZXRPcFBhY2thZ2VOYW1lKCksCisgICAgICAgICAgICAgICAgICAgIG1DYlN0dWIsIGZhbHNlLCBkaXJlY3Rpb24sIGZsYWdzKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRXJyb3IgY2FsbGluZyBhZGp1c3RWb2x1bWVCeS4iLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIHJlY2VpdmUgdXBkYXRlcyBmcm9tIHRoZSBTZXNzaW9uLiBVcGRhdGVzIHdpbGwgYmUKKyAgICAgKiBwb3N0ZWQgb24gdGhlIGNhbGxlcidzIHRocmVhZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgb2JqZWN0LCBtdXN0IG5vdCBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FsbGJhY2soQE5vbk51bGwgQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgcmVnaXN0ZXJDYWxsYmFjayhjYWxsYmFjaywgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gcmVjZWl2ZSB1cGRhdGVzIGZyb20gdGhlIHNlc3Npb24uIFVwZGF0ZXMgd2lsbCBiZQorICAgICAqIHBvc3RlZCBvbiB0aGUgc3BlY2lmaWVkIGhhbmRsZXIncyB0aHJlYWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIG9iamVjdCwgbXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byBwb3N0IHVwZGF0ZXMgb24uIElmIG51bGwgdGhlIGNhbGxlcnMgdGhyZWFkCisgICAgICogICAgICAgICAgICB3aWxsIGJlIHVzZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJDYWxsYmFjayhATm9uTnVsbCBDYWxsYmFjayBjYWxsYmFjaywgQE51bGxhYmxlIEhhbmRsZXIgaGFuZGxlcikgeworICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmIChoYW5kbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIGhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOworICAgICAgICB9CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIGFkZENhbGxiYWNrTG9ja2VkKGNhbGxiYWNrLCBoYW5kbGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVucmVnaXN0ZXJzIHRoZSBzcGVjaWZpZWQgY2FsbGJhY2suIElmIGFuIHVwZGF0ZSBoYXMgYWxyZWFkeSBiZWVuIHBvc3RlZAorICAgICAqIHlvdSBtYXkgc3RpbGwgcmVjZWl2ZSBpdCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZW1vdmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckNhbGxiYWNrKEBOb25OdWxsIENhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYWxsYmFjayBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgcmVtb3ZlQ2FsbGJhY2tMb2NrZWQoY2FsbGJhY2spOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZHMgYSBnZW5lcmljIGNvbW1hbmQgdG8gdGhlIHNlc3Npb24uIEl0IGlzIHVwIHRvIHRoZSBzZXNzaW9uIGNyZWF0b3IKKyAgICAgKiB0byBkZWNpZGUgd2hhdCBjb21tYW5kcyBhbmQgcGFyYW1ldGVycyB0aGV5IHdpbGwgc3VwcG9ydC4gQXMgc3VjaCwKKyAgICAgKiBjb21tYW5kcyBzaG91bGQgb25seSBiZSBzZW50IHRvIHNlc3Npb25zIHRoYXQgdGhlIGNvbnRyb2xsZXIgb3ducy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21tYW5kIFRoZSBjb21tYW5kIHRvIHNlbmQKKyAgICAgKiBAcGFyYW0gYXJncyBBbnkgcGFyYW1ldGVycyB0byBpbmNsdWRlIHdpdGggdGhlIGNvbW1hbmQKKyAgICAgKiBAcGFyYW0gY2IgVGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgdGhlIHJlc3VsdCBvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbmRDb21tYW5kKEBOb25OdWxsIFN0cmluZyBjb21tYW5kLCBATnVsbGFibGUgQnVuZGxlIGFyZ3MsCisgICAgICAgICAgICBATnVsbGFibGUgUmVzdWx0UmVjZWl2ZXIgY2IpIHsKKyAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGNvbW1hbmQpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5Iik7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyLnNlbmRDb21tYW5kKG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIG1DYlN0dWIsIGNvbW1hbmQsIGFyZ3MsIGNiKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkRlYWQgb2JqZWN0IGluIHNlbmRDb21tYW5kLiIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzZXNzaW9uIG93bmVyJ3MgcGFja2FnZSBuYW1lLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgcGFja2FnZSBuYW1lIG9mIG9mIHRoZSBzZXNzaW9uIG93bmVyLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7CisgICAgICAgIGlmIChtUGFja2FnZU5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtUGFja2FnZU5hbWUgPSBtU2Vzc2lvbkJpbmRlci5nZXRQYWNrYWdlTmFtZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJEZWFkIG9iamVjdCBpbiBnZXRQYWNrYWdlTmFtZS4iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVBhY2thZ2VOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc2Vzc2lvbidzIHRhZyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgc2Vzc2lvbidzIHRhZy4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFnKCkgeworICAgICAgICBpZiAobVRhZyA9PSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1UYWcgPSBtU2Vzc2lvbkJpbmRlci5nZXRUYWcoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRGVhZCBvYmplY3QgaW4gZ2V0VGFnLiIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtVGFnOworICAgIH0KKworICAgIC8qCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBJU2Vzc2lvbkNvbnRyb2xsZXIgZ2V0U2Vzc2lvbkJpbmRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1TZXNzaW9uQmluZGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250cm9sc1NhbWVTZXNzaW9uKE1lZGlhQ29udHJvbGxlciBvdGhlcikgeworICAgICAgICBpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gbVNlc3Npb25CaW5kZXIuYXNCaW5kZXIoKSA9PSBvdGhlci5nZXRTZXNzaW9uQmluZGVyKCkuYXNCaW5kZXIoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkQ2FsbGJhY2tMb2NrZWQoQ2FsbGJhY2sgY2IsIEhhbmRsZXIgaGFuZGxlcikgeworICAgICAgICBpZiAoZ2V0SGFuZGxlckZvckNhbGxiYWNrTG9ja2VkKGNiKSAhPSBudWxsKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJDYWxsYmFjayBpcyBhbHJlYWR5IGFkZGVkLCBpZ25vcmluZyIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIE1lc3NhZ2VIYW5kbGVyIGhvbGRlciA9IG5ldyBNZXNzYWdlSGFuZGxlcihoYW5kbGVyLmdldExvb3BlcigpLCBjYik7CisgICAgICAgIG1DYWxsYmFja3MuYWRkKGhvbGRlcik7CisgICAgICAgIGhvbGRlci5tUmVnaXN0ZXJlZCA9IHRydWU7CisKKyAgICAgICAgaWYgKCFtQ2JSZWdpc3RlcmVkKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyLnJlZ2lzdGVyQ2FsbGJhY2tMaXN0ZW5lcihtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLCBtQ2JTdHViKTsKKyAgICAgICAgICAgICAgICBtQ2JSZWdpc3RlcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRGVhZCBvYmplY3QgaW4gcmVnaXN0ZXJDYWxsYmFjayIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHJlbW92ZUNhbGxiYWNrTG9ja2VkKENhbGxiYWNrIGNiKSB7CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gbUNhbGxiYWNrcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgTWVzc2FnZUhhbmRsZXIgaGFuZGxlciA9IG1DYWxsYmFja3MuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGNiID09IGhhbmRsZXIubUNhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrcy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7CisgICAgICAgICAgICAgICAgaGFuZGxlci5tUmVnaXN0ZXJlZCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtQ2JSZWdpc3RlcmVkICYmIG1DYWxsYmFja3Muc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIudW5yZWdpc3RlckNhbGxiYWNrTGlzdGVuZXIobUNiU3R1Yik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkRlYWQgb2JqZWN0IGluIHJlbW92ZUNhbGxiYWNrTG9ja2VkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2JSZWdpc3RlcmVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorCisgICAgcHJpdmF0ZSBNZXNzYWdlSGFuZGxlciBnZXRIYW5kbGVyRm9yQ2FsbGJhY2tMb2NrZWQoQ2FsbGJhY2sgY2IpIHsKKyAgICAgICAgaWYgKGNiID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbGxiYWNrIGNhbm5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IG1DYWxsYmFja3Muc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIE1lc3NhZ2VIYW5kbGVyIGhhbmRsZXIgPSBtQ2FsbGJhY2tzLmdldChpKTsKKyAgICAgICAgICAgIGlmIChjYiA9PSBoYW5kbGVyLm1DYWxsYmFjaykgeworICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgdm9pZCBwb3N0TWVzc2FnZShpbnQgd2hhdCwgT2JqZWN0IG9iaiwgQnVuZGxlIGRhdGEpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1DYWxsYmFja3Muc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2tzLmdldChpKS5wb3N0KHdoYXQsIG9iaiwgZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayBmb3IgcmVjZWl2aW5nIHVwZGF0ZXMgZnJvbSB0aGUgc2Vzc2lvbi4gQSBDYWxsYmFjayBjYW4gYmUKKyAgICAgKiByZWdpc3RlcmVkIHVzaW5nIHtAbGluayAjcmVnaXN0ZXJDYWxsYmFja30uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDYWxsYmFjayB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBPdmVycmlkZSB0byBoYW5kbGUgdGhlIHNlc3Npb24gYmVpbmcgZGVzdHJveWVkLiBUaGUgc2Vzc2lvbiBpcyBubworICAgICAgICAgKiBsb25nZXIgdmFsaWQgYWZ0ZXIgdGhpcyBjYWxsIGFuZCBjYWxscyB0byBpdCB3aWxsIGJlIGlnbm9yZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblNlc3Npb25EZXN0cm95ZWQoKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogT3ZlcnJpZGUgdG8gaGFuZGxlIGN1c3RvbSBldmVudHMgc2VudCBieSB0aGUgc2Vzc2lvbiBvd25lciB3aXRob3V0IGEKKyAgICAgICAgICogc3BlY2lmaWVkIGludGVyZmFjZS4gQ29udHJvbGxlcnMgc2hvdWxkIG9ubHkgaGFuZGxlIHRoZXNlIGZvcgorICAgICAgICAgKiBzZXNzaW9ucyB0aGV5IG93bi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCBmcm9tIHRoZSBzZXNzaW9uLgorICAgICAgICAgKiBAcGFyYW0gZXh0cmFzIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHRoZSBldmVudCwgbWF5IGJlIG51bGwuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblNlc3Npb25FdmVudChATm9uTnVsbCBTdHJpbmcgZXZlbnQsIEBOdWxsYWJsZSBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogT3ZlcnJpZGUgdG8gaGFuZGxlIGNoYW5nZXMgaW4gcGxheWJhY2sgc3RhdGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzdGF0ZSBUaGUgbmV3IHBsYXliYWNrIHN0YXRlIG9mIHRoZSBzZXNzaW9uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXliYWNrU3RhdGVDaGFuZ2VkKEBOdWxsYWJsZSBQbGF5YmFja1N0YXRlIHN0YXRlKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogT3ZlcnJpZGUgdG8gaGFuZGxlIGNoYW5nZXMgdG8gdGhlIGN1cnJlbnQgbWV0YWRhdGEuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YSBUaGUgY3VycmVudCBtZXRhZGF0YSBmb3IgdGhlIHNlc3Npb24gb3IgbnVsbCBpZiBub25lLgorICAgICAgICAgKiBAc2VlIE1lZGlhTWV0YWRhdGEKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uTWV0YWRhdGFDaGFuZ2VkKEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhIG1ldGFkYXRhKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogT3ZlcnJpZGUgdG8gaGFuZGxlIGNoYW5nZXMgdG8gaXRlbXMgaW4gdGhlIHF1ZXVlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcXVldWUgQSBsaXN0IG9mIGl0ZW1zIGluIHRoZSBjdXJyZW50IHBsYXkgcXVldWUuIEl0IHNob3VsZAorICAgICAgICAgKiAgICAgICAgICAgIGluY2x1ZGUgdGhlIGN1cnJlbnRseSBwbGF5aW5nIGl0ZW0gYXMgd2VsbCBhcyBwcmV2aW91cyBhbmQKKyAgICAgICAgICogICAgICAgICAgICB1cGNvbWluZyBpdGVtcyBpZiBhcHBsaWNhYmxlLgorICAgICAgICAgKiBAc2VlIE1lZGlhU2Vzc2lvbi5RdWV1ZUl0ZW0KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUXVldWVDaGFuZ2VkKEBOdWxsYWJsZSBMaXN0PE1lZGlhU2Vzc2lvbi5RdWV1ZUl0ZW0+IHF1ZXVlKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogT3ZlcnJpZGUgdG8gaGFuZGxlIGNoYW5nZXMgdG8gdGhlIHF1ZXVlIHRpdGxlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdGl0bGUgVGhlIHRpdGxlIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCBhbG9uZyB3aXRoIHRoZSBwbGF5IHF1ZXVlIHN1Y2ggYXMKKyAgICAgICAgICogICAgICAgICAgICAgICJOb3cgUGxheWluZyIuIE1heSBiZSBudWxsIGlmIHRoZXJlIGlzIG5vIHN1Y2ggdGl0bGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblF1ZXVlVGl0bGVDaGFuZ2VkKEBOdWxsYWJsZSBDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBPdmVycmlkZSB0byBoYW5kbGUgY2hhbmdlcyB0byB0aGUge0BsaW5rIE1lZGlhU2Vzc2lvbn0gZXh0cmFzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZXh0cmFzIFRoZSBleHRyYXMgdGhhdCBjYW4gaW5jbHVkZSBvdGhlciBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgICAgICAqICAgICAgICAgICAgICAge0BsaW5rIE1lZGlhU2Vzc2lvbn0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkV4dHJhc0NoYW5nZWQoQE51bGxhYmxlIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBPdmVycmlkZSB0byBoYW5kbGUgY2hhbmdlcyB0byB0aGUgYXVkaW8gaW5mby4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGluZm8gVGhlIGN1cnJlbnQgYXVkaW8gaW5mbyBmb3IgdGhpcyBzZXNzaW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25BdWRpb0luZm9DaGFuZ2VkKFBsYXliYWNrSW5mbyBpbmZvKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgZm9yIGNvbnRyb2xsaW5nIG1lZGlhIHBsYXliYWNrIG9uIGEgc2Vzc2lvbi4gVGhpcyBhbGxvd3MgYW4gYXBwCisgICAgICogdG8gc2VuZCBtZWRpYSB0cmFuc3BvcnQgY29tbWFuZHMgdG8gdGhlIHNlc3Npb24uCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGNsYXNzIFRyYW5zcG9ydENvbnRyb2xzIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJUcmFuc3BvcnRDb250cm9sbGVyIjsKKworICAgICAgICBwcml2YXRlIFRyYW5zcG9ydENvbnRyb2xzKCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlcXVlc3QgdGhhdCB0aGUgcGxheWVyIHByZXBhcmUgaXRzIHBsYXliYWNrLiBJbiBvdGhlciB3b3Jkcywgb3RoZXIgc2Vzc2lvbnMgY2FuIGNvbnRpbnVlCisgICAgICAgICAqIHRvIHBsYXkgZHVyaW5nIHRoZSBwcmVwYXJhdGlvbiBvZiB0aGlzIHNlc3Npb24uIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHNwZWVkIHVwIHRoZQorICAgICAgICAgKiBzdGFydCBvZiB0aGUgcGxheWJhY2suIE9uY2UgdGhlIHByZXBhcmF0aW9uIGlzIGRvbmUsIHRoZSBzZXNzaW9uIHdpbGwgY2hhbmdlIGl0cyBwbGF5YmFjaworICAgICAgICAgKiBzdGF0ZSB0byB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9QQVVTRUR9LiBBZnRlcndhcmRzLCB7QGxpbmsgI3BsYXl9IGNhbiBiZSBjYWxsZWQgdG8KKyAgICAgICAgICogc3RhcnQgcGxheWJhY2suCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBwcmVwYXJlKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlci5wcmVwYXJlKG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIG1DYlN0dWIpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cud3RmKFRBRywgIkVycm9yIGNhbGxpbmcgcHJlcGFyZS4iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXF1ZXN0IHRoYXQgdGhlIHBsYXllciBwcmVwYXJlIHBsYXliYWNrIGZvciBhIHNwZWNpZmljIG1lZGlhIGlkLiBJbiBvdGhlciB3b3Jkcywgb3RoZXIKKyAgICAgICAgICogc2Vzc2lvbnMgY2FuIGNvbnRpbnVlIHRvIHBsYXkgZHVyaW5nIHRoZSBwcmVwYXJhdGlvbiBvZiB0aGlzIHNlc3Npb24uIFRoaXMgbWV0aG9kIGNhbiBiZQorICAgICAgICAgKiB1c2VkIHRvIHNwZWVkIHVwIHRoZSBzdGFydCBvZiB0aGUgcGxheWJhY2suIE9uY2UgdGhlIHByZXBhcmF0aW9uIGlzIGRvbmUsIHRoZSBzZXNzaW9uCisgICAgICAgICAqIHdpbGwgY2hhbmdlIGl0cyBwbGF5YmFjayBzdGF0ZSB0byB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9QQVVTRUR9LiBBZnRlcndhcmRzLAorICAgICAgICAgKiB7QGxpbmsgI3BsYXl9IGNhbiBiZSBjYWxsZWQgdG8gc3RhcnQgcGxheWJhY2suIElmIHRoZSBwcmVwYXJhdGlvbiBpcyBub3QgbmVlZGVkLAorICAgICAgICAgKiB7QGxpbmsgI3BsYXlGcm9tTWVkaWFJZH0gY2FuIGJlIGRpcmVjdGx5IGNhbGxlZCB3aXRob3V0IHRoaXMgbWV0aG9kLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWVkaWFJZCBUaGUgaWQgb2YgdGhlIHJlcXVlc3RlZCBtZWRpYS4KKyAgICAgICAgICogQHBhcmFtIGV4dHJhcyBPcHRpb25hbCBleHRyYXMgdGhhdCBjYW4gaW5jbHVkZSBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVkaWEgaXRlbQorICAgICAgICAgKiAgICAgICAgICAgICAgIHRvIGJlIHByZXBhcmVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgcHJlcGFyZUZyb21NZWRpYUlkKFN0cmluZyBtZWRpYUlkLCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkobWVkaWFJZCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIllvdSBtdXN0IHNwZWNpZnkgYSBub24tZW1wdHkgU3RyaW5nIGZvciBwcmVwYXJlRnJvbU1lZGlhSWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyLnByZXBhcmVGcm9tTWVkaWFJZChtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLCBtQ2JTdHViLCBtZWRpYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciBjYWxsaW5nIHByZXBhcmUoIiArIG1lZGlhSWQgKyAiKS4iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXF1ZXN0IHRoYXQgdGhlIHBsYXllciBwcmVwYXJlIHBsYXliYWNrIGZvciBhIHNwZWNpZmljIHNlYXJjaCBxdWVyeS4gQW4gZW1wdHkgb3IgbnVsbAorICAgICAgICAgKiBxdWVyeSBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIHJlcXVlc3QgdG8gcHJlcGFyZSBhbnkgbXVzaWMuIEluIG90aGVyIHdvcmRzLCBvdGhlciBzZXNzaW9ucworICAgICAgICAgKiBjYW4gY29udGludWUgdG8gcGxheSBkdXJpbmcgdGhlIHByZXBhcmF0aW9uIG9mIHRoaXMgc2Vzc2lvbi4gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8KKyAgICAgICAgICogc3BlZWQgdXAgdGhlIHN0YXJ0IG9mIHRoZSBwbGF5YmFjay4gT25jZSB0aGUgcHJlcGFyYXRpb24gaXMgZG9uZSwgdGhlIHNlc3Npb24gd2lsbAorICAgICAgICAgKiBjaGFuZ2UgaXRzIHBsYXliYWNrIHN0YXRlIHRvIHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX1BBVVNFRH0uIEFmdGVyd2FyZHMsCisgICAgICAgICAqIHtAbGluayAjcGxheX0gY2FuIGJlIGNhbGxlZCB0byBzdGFydCBwbGF5YmFjay4gSWYgdGhlIHByZXBhcmF0aW9uIGlzIG5vdCBuZWVkZWQsCisgICAgICAgICAqIHtAbGluayAjcGxheUZyb21TZWFyY2h9IGNhbiBiZSBkaXJlY3RseSBjYWxsZWQgd2l0aG91dCB0aGlzIG1ldGhvZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHF1ZXJ5IFRoZSBzZWFyY2ggcXVlcnkuCisgICAgICAgICAqIEBwYXJhbSBleHRyYXMgT3B0aW9uYWwgZXh0cmFzIHRoYXQgY2FuIGluY2x1ZGUgZXh0cmEgaW5mb3JtYXRpb24KKyAgICAgICAgICogICAgICAgICAgICAgICBhYm91dCB0aGUgcXVlcnkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBwcmVwYXJlRnJvbVNlYXJjaChTdHJpbmcgcXVlcnksIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgIGlmIChxdWVyeSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0byByZW1haW4gY29tcGF0aWJsZSB3aXRoCisgICAgICAgICAgICAgICAgLy8gSU5URU5UX0FDVElPTl9NRURJQV9QTEFZX0ZST01fU0VBUkNICisgICAgICAgICAgICAgICAgcXVlcnkgPSAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIucHJlcGFyZUZyb21TZWFyY2gobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgbUNiU3R1YiwgcXVlcnksCisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYXMpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cud3RmKFRBRywgIkVycm9yIGNhbGxpbmcgcHJlcGFyZSgiICsgcXVlcnkgKyAiKS4iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXF1ZXN0IHRoYXQgdGhlIHBsYXllciBwcmVwYXJlIHBsYXliYWNrIGZvciBhIHNwZWNpZmljIHtAbGluayBVcml9LiBJbiBvdGhlciB3b3JkcywKKyAgICAgICAgICogb3RoZXIgc2Vzc2lvbnMgY2FuIGNvbnRpbnVlIHRvIHBsYXkgZHVyaW5nIHRoZSBwcmVwYXJhdGlvbiBvZiB0aGlzIHNlc3Npb24uIFRoaXMgbWV0aG9kCisgICAgICAgICAqIGNhbiBiZSB1c2VkIHRvIHNwZWVkIHVwIHRoZSBzdGFydCBvZiB0aGUgcGxheWJhY2suIE9uY2UgdGhlIHByZXBhcmF0aW9uIGlzIGRvbmUsIHRoZQorICAgICAgICAgKiBzZXNzaW9uIHdpbGwgY2hhbmdlIGl0cyBwbGF5YmFjayBzdGF0ZSB0byB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9QQVVTRUR9LiBBZnRlcndhcmRzLAorICAgICAgICAgKiB7QGxpbmsgI3BsYXl9IGNhbiBiZSBjYWxsZWQgdG8gc3RhcnQgcGxheWJhY2suIElmIHRoZSBwcmVwYXJhdGlvbiBpcyBub3QgbmVlZGVkLAorICAgICAgICAgKiB7QGxpbmsgI3BsYXlGcm9tVXJpfSBjYW4gYmUgZGlyZWN0bHkgY2FsbGVkIHdpdGhvdXQgdGhpcyBtZXRob2QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgcmVxdWVzdGVkIG1lZGlhLgorICAgICAgICAgKiBAcGFyYW0gZXh0cmFzIE9wdGlvbmFsIGV4dHJhcyB0aGF0IGNhbiBpbmNsdWRlIGV4dHJhIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtZWRpYSBpdGVtCisgICAgICAgICAqICAgICAgICAgICAgICAgdG8gYmUgcHJlcGFyZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBwcmVwYXJlRnJvbVVyaShVcmkgdXJpLCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgICAgICBpZiAodXJpID09IG51bGwgfHwgVXJpLkVNUFRZLmVxdWFscyh1cmkpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJZb3UgbXVzdCBzcGVjaWZ5IGEgbm9uLWVtcHR5IFVyaSBmb3IgcHJlcGFyZUZyb21VcmkuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyLnByZXBhcmVGcm9tVXJpKG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIG1DYlN0dWIsIHVyaSwgZXh0cmFzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciBjYWxsaW5nIHByZXBhcmUoIiArIHVyaSArICIpLiIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlcXVlc3QgdGhhdCB0aGUgcGxheWVyIHN0YXJ0IGl0cyBwbGF5YmFjayBhdCBpdHMgY3VycmVudCBwb3NpdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHBsYXkoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyLnBsYXkobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgbUNiU3R1Yik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRXJyb3IgY2FsbGluZyBwbGF5LiIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlcXVlc3QgdGhhdCB0aGUgcGxheWVyIHN0YXJ0IHBsYXliYWNrIGZvciBhIHNwZWNpZmljIG1lZGlhIGlkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWVkaWFJZCBUaGUgaWQgb2YgdGhlIHJlcXVlc3RlZCBtZWRpYS4KKyAgICAgICAgICogQHBhcmFtIGV4dHJhcyBPcHRpb25hbCBleHRyYXMgdGhhdCBjYW4gaW5jbHVkZSBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVkaWEgaXRlbQorICAgICAgICAgKiAgICAgICAgICAgICAgIHRvIGJlIHBsYXllZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHBsYXlGcm9tTWVkaWFJZChTdHJpbmcgbWVkaWFJZCwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KG1lZGlhSWQpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJZb3UgbXVzdCBzcGVjaWZ5IGEgbm9uLWVtcHR5IFN0cmluZyBmb3IgcGxheUZyb21NZWRpYUlkLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlci5wbGF5RnJvbU1lZGlhSWQobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgbUNiU3R1YiwgbWVkaWFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhcyk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRXJyb3IgY2FsbGluZyBwbGF5KCIgKyBtZWRpYUlkICsgIikuIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVxdWVzdCB0aGF0IHRoZSBwbGF5ZXIgc3RhcnQgcGxheWJhY2sgZm9yIGEgc3BlY2lmaWMgc2VhcmNoIHF1ZXJ5LgorICAgICAgICAgKiBBbiBlbXB0eSBvciBudWxsIHF1ZXJ5IHNob3VsZCBiZSB0cmVhdGVkIGFzIGEgcmVxdWVzdCB0byBwbGF5IGFueQorICAgICAgICAgKiBtdXNpYy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHF1ZXJ5IFRoZSBzZWFyY2ggcXVlcnkuCisgICAgICAgICAqIEBwYXJhbSBleHRyYXMgT3B0aW9uYWwgZXh0cmFzIHRoYXQgY2FuIGluY2x1ZGUgZXh0cmEgaW5mb3JtYXRpb24KKyAgICAgICAgICogICAgICAgICAgICAgICBhYm91dCB0aGUgcXVlcnkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBwbGF5RnJvbVNlYXJjaChTdHJpbmcgcXVlcnksIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgIGlmIChxdWVyeSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0byByZW1haW4gY29tcGF0aWJsZSB3aXRoCisgICAgICAgICAgICAgICAgLy8gSU5URU5UX0FDVElPTl9NRURJQV9QTEFZX0ZST01fU0VBUkNICisgICAgICAgICAgICAgICAgcXVlcnkgPSAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIucGxheUZyb21TZWFyY2gobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgbUNiU3R1YiwgcXVlcnksIGV4dHJhcyk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRXJyb3IgY2FsbGluZyBwbGF5KCIgKyBxdWVyeSArICIpLiIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlcXVlc3QgdGhhdCB0aGUgcGxheWVyIHN0YXJ0IHBsYXliYWNrIGZvciBhIHNwZWNpZmljIHtAbGluayBVcml9LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIHJlcXVlc3RlZCBtZWRpYS4KKyAgICAgICAgICogQHBhcmFtIGV4dHJhcyBPcHRpb25hbCBleHRyYXMgdGhhdCBjYW4gaW5jbHVkZSBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVkaWEgaXRlbQorICAgICAgICAgKiAgICAgICAgICAgICAgIHRvIGJlIHBsYXllZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHBsYXlGcm9tVXJpKFVyaSB1cmksIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgIGlmICh1cmkgPT0gbnVsbCB8fCBVcmkuRU1QVFkuZXF1YWxzKHVyaSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIllvdSBtdXN0IHNwZWNpZnkgYSBub24tZW1wdHkgVXJpIGZvciBwbGF5RnJvbVVyaS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIucGxheUZyb21VcmkobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgbUNiU3R1YiwgdXJpLCBleHRyYXMpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cud3RmKFRBRywgIkVycm9yIGNhbGxpbmcgcGxheSgiICsgdXJpICsgIikuIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUGxheSBhbiBpdGVtIHdpdGggYSBzcGVjaWZpYyBpZCBpbiB0aGUgcGxheSBxdWV1ZS4gSWYgeW91IHNwZWNpZnkgYW4KKyAgICAgICAgICogaWQgdGhhdCBpcyBub3QgaW4gdGhlIHBsYXkgcXVldWUsIHRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBza2lwVG9RdWV1ZUl0ZW0obG9uZyBpZCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlci5za2lwVG9RdWV1ZUl0ZW0obUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgbUNiU3R1YiwgaWQpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cud3RmKFRBRywgIkVycm9yIGNhbGxpbmcgc2tpcFRvSXRlbSgiICsgaWQgKyAiKS4iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXF1ZXN0IHRoYXQgdGhlIHBsYXllciBwYXVzZSBpdHMgcGxheWJhY2sgYW5kIHN0YXkgYXQgaXRzIGN1cnJlbnQKKyAgICAgICAgICogcG9zaXRpb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBwYXVzZSgpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIucGF1c2UobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgbUNiU3R1Yik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRXJyb3IgY2FsbGluZyBwYXVzZS4iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXF1ZXN0IHRoYXQgdGhlIHBsYXllciBzdG9wIGl0cyBwbGF5YmFjazsgaXQgbWF5IGNsZWFyIGl0cyBzdGF0ZSBpbgorICAgICAgICAgKiB3aGF0ZXZlciB3YXkgaXMgYXBwcm9wcmlhdGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlci5zdG9wKG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIG1DYlN0dWIpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cud3RmKFRBRywgIkVycm9yIGNhbGxpbmcgc3RvcC4iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBNb3ZlIHRvIGEgbmV3IGxvY2F0aW9uIGluIHRoZSBtZWRpYSBzdHJlYW0uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwb3MgUG9zaXRpb24gdG8gbW92ZSB0bywgaW4gbWlsbGlzZWNvbmRzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2Vla1RvKGxvbmcgcG9zKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyLnNlZWtUbyhtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLCBtQ2JTdHViLCBwb3MpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cud3RmKFRBRywgIkVycm9yIGNhbGxpbmcgc2Vla1RvLiIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN0YXJ0IGZhc3QgZm9yd2FyZGluZy4gSWYgcGxheWJhY2sgaXMgYWxyZWFkeSBmYXN0IGZvcndhcmRpbmcgdGhpcworICAgICAgICAgKiBtYXkgaW5jcmVhc2UgdGhlIHJhdGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBmYXN0Rm9yd2FyZCgpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIuZmFzdEZvcndhcmQobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgbUNiU3R1Yik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRXJyb3IgY2FsbGluZyBmYXN0Rm9yd2FyZC4iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTa2lwIHRvIHRoZSBuZXh0IGl0ZW0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBza2lwVG9OZXh0KCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlci5uZXh0KG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIG1DYlN0dWIpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cud3RmKFRBRywgIkVycm9yIGNhbGxpbmcgbmV4dC4iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTdGFydCByZXdpbmRpbmcuIElmIHBsYXliYWNrIGlzIGFscmVhZHkgcmV3aW5kaW5nIHRoaXMgbWF5IGluY3JlYXNlCisgICAgICAgICAqIHRoZSByYXRlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgcmV3aW5kKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlci5yZXdpbmQobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgbUNiU3R1Yik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRXJyb3IgY2FsbGluZyByZXdpbmQuIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2tpcCB0byB0aGUgcHJldmlvdXMgaXRlbS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNraXBUb1ByZXZpb3VzKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlci5wcmV2aW91cyhtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLCBtQ2JTdHViKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciBjYWxsaW5nIHByZXZpb3VzLiIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJhdGUgdGhlIGN1cnJlbnQgY29udGVudC4gVGhpcyB3aWxsIGNhdXNlIHRoZSByYXRpbmcgdG8gYmUgc2V0IGZvcgorICAgICAgICAgKiB0aGUgY3VycmVudCB1c2VyLiBUaGUgUmF0aW5nIHR5cGUgbXVzdCBtYXRjaCB0aGUgdHlwZSByZXR1cm5lZCBieQorICAgICAgICAgKiB7QGxpbmsgI2dldFJhdGluZ1R5cGUoKX0uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByYXRpbmcgVGhlIHJhdGluZyB0byBzZXQgZm9yIHRoZSBjdXJyZW50IGNvbnRlbnQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFJhdGluZyhSYXRpbmcgcmF0aW5nKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyLnJhdGUobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgbUNiU3R1YiwgcmF0aW5nKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciBjYWxsaW5nIHJhdGUuIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2VuZCBhIGN1c3RvbSBhY3Rpb24gYmFjayBmb3IgdGhlIHtAbGluayBNZWRpYVNlc3Npb259IHRvIHBlcmZvcm0uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjdXN0b21BY3Rpb24gVGhlIGFjdGlvbiB0byBwZXJmb3JtLgorICAgICAgICAgKiBAcGFyYW0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMgdG8gc3VwcGx5IHRvIHRoZSB7QGxpbmsgTWVkaWFTZXNzaW9ufSBmb3IgdGhpcworICAgICAgICAgKiAgICAgICAgICAgICBjdXN0b20gYWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2VuZEN1c3RvbUFjdGlvbihATm9uTnVsbCBQbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbiBjdXN0b21BY3Rpb24sCisgICAgICAgICAgICAgICAgQE51bGxhYmxlIEJ1bmRsZSBhcmdzKSB7CisgICAgICAgICAgICBpZiAoY3VzdG9tQWN0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDdXN0b21BY3Rpb24gY2Fubm90IGJlIG51bGwuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZW5kQ3VzdG9tQWN0aW9uKGN1c3RvbUFjdGlvbi5nZXRBY3Rpb24oKSwgYXJncyk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2VuZCB0aGUgaWQgYW5kIGFyZ3MgZnJvbSBhIGN1c3RvbSBhY3Rpb24gYmFjayBmb3IgdGhlIHtAbGluayBNZWRpYVNlc3Npb259IHRvIHBlcmZvcm0uCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgI3NlbmRDdXN0b21BY3Rpb24oUGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24gYWN0aW9uLCBCdW5kbGUgYXJncykKKyAgICAgICAgICogQHBhcmFtIGFjdGlvbiBUaGUgYWN0aW9uIGlkZW50aWZpZXIgb2YgdGhlIHtAbGluayBQbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbn0gYXMKKyAgICAgICAgICogICAgICAgICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIHtAbGluayBNZWRpYVNlc3Npb259LgorICAgICAgICAgKiBAcGFyYW0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMgdG8gc3VwcGx5IHRvIHRoZSB7QGxpbmsgTWVkaWFTZXNzaW9ufSBmb3IgdGhpcworICAgICAgICAgKiAgICAgICAgICAgICBjdXN0b20gYWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2VuZEN1c3RvbUFjdGlvbihATm9uTnVsbCBTdHJpbmcgYWN0aW9uLCBATnVsbGFibGUgQnVuZGxlIGFyZ3MpIHsKKyAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShhY3Rpb24pKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ3VzdG9tQWN0aW9uIGNhbm5vdCBiZSBudWxsLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlci5zZW5kQ3VzdG9tQWN0aW9uKG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIG1DYlN0dWIsIGFjdGlvbiwgYXJncyk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkRlYWQgb2JqZWN0IGluIHNlbmRDdXN0b21BY3Rpb24uIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIb2xkcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBwbGF5YmFjayBhbmQgaG93IGF1ZGlvIGlzIGhhbmRsZWQgZm9yCisgICAgICogdGhpcyBzZXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUGxheWJhY2tJbmZvIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzZXNzaW9uIHVzZXMgcmVtb3RlIHBsYXliYWNrLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfVFlQRV9SRU1PVEUgPSAyOworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHNlc3Npb24gdXNlcyBsb2NhbCBwbGF5YmFjay4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1RZUEVfTE9DQUwgPSAxOworCisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1Wb2x1bWVUeXBlOworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtVm9sdW1lQ29udHJvbDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU1heFZvbHVtZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUN1cnJlbnRWb2x1bWU7CisgICAgICAgIHByaXZhdGUgZmluYWwgQXVkaW9BdHRyaWJ1dGVzIG1BdWRpb0F0dHJzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFBsYXliYWNrSW5mbyhpbnQgdHlwZSwgQXVkaW9BdHRyaWJ1dGVzIGF0dHJzLCBpbnQgY29udHJvbCwgaW50IG1heCwgaW50IGN1cnJlbnQpIHsKKyAgICAgICAgICAgIG1Wb2x1bWVUeXBlID0gdHlwZTsKKyAgICAgICAgICAgIG1BdWRpb0F0dHJzID0gYXR0cnM7CisgICAgICAgICAgICBtVm9sdW1lQ29udHJvbCA9IGNvbnRyb2w7CisgICAgICAgICAgICBtTWF4Vm9sdW1lID0gbWF4OworICAgICAgICAgICAgbUN1cnJlbnRWb2x1bWUgPSBjdXJyZW50OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgdHlwZSBvZiBwbGF5YmFjayB3aGljaCBhZmZlY3RzIHZvbHVtZSBoYW5kbGluZy4gT25lIG9mOgorICAgICAgICAgKiA8dWw+CisgICAgICAgICAqIDxsaT57QGxpbmsgI1BMQVlCQUNLX1RZUEVfTE9DQUx9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjUExBWUJBQ0tfVFlQRV9SRU1PVEV9PC9saT4KKyAgICAgICAgICogPC91bD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBUaGUgdHlwZSBvZiBwbGF5YmFjayB0aGlzIHNlc3Npb24gaXMgdXNpbmcuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldFBsYXliYWNrVHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVm9sdW1lVHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGF1ZGlvIGF0dHJpYnV0ZXMgZm9yIHRoaXMgc2Vzc2lvbi4gVGhlIGF0dHJpYnV0ZXMgd2lsbCBhZmZlY3QKKyAgICAgICAgICogdm9sdW1lIGhhbmRsaW5nIGZvciB0aGUgc2Vzc2lvbi4gV2hlbiB0aGUgdm9sdW1lIHR5cGUgaXMKKyAgICAgICAgICoge0BsaW5rIFBsYXliYWNrSW5mbyNQTEFZQkFDS19UWVBFX1JFTU9URX0gdGhlc2UgbWF5IGJlIGlnbm9yZWQgYnkgdGhlCisgICAgICAgICAqIHJlbW90ZSB2b2x1bWUgaGFuZGxlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBUaGUgYXR0cmlidXRlcyBmb3IgdGhpcyBzZXNzaW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEF1ZGlvQXR0cmlidXRlcyBnZXRBdWRpb0F0dHJpYnV0ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbUF1ZGlvQXR0cnM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSB0eXBlIG9mIHZvbHVtZSBjb250cm9sIHRoYXQgY2FuIGJlIHVzZWQuIE9uZSBvZjoKKyAgICAgICAgICogPHVsPgorICAgICAgICAgKiA8bGk+e0BsaW5rIFZvbHVtZVByb3ZpZGVyI1ZPTFVNRV9DT05UUk9MX0FCU09MVVRFfTwvbGk+CisgICAgICAgICAqIDxsaT57QGxpbmsgVm9sdW1lUHJvdmlkZXIjVk9MVU1FX0NPTlRST0xfUkVMQVRJVkV9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayBWb2x1bWVQcm92aWRlciNWT0xVTUVfQ09OVFJPTF9GSVhFRH08L2xpPgorICAgICAgICAgKiA8L3VsPgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSB0eXBlIG9mIHZvbHVtZSBjb250cm9sIHRoYXQgbWF5IGJlIHVzZWQgd2l0aCB0aGlzCisgICAgICAgICAqICAgICAgICAgc2Vzc2lvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Vm9sdW1lQ29udHJvbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVm9sdW1lQ29udHJvbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIG1heGltdW0gdm9sdW1lIHRoYXQgbWF5IGJlIHNldCBmb3IgdGhpcyBzZXNzaW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBtYXhpbXVtIGFsbG93ZWQgdm9sdW1lIHdoZXJlIHRoaXMgc2Vzc2lvbiBpcyBwbGF5aW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRNYXhWb2x1bWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbU1heFZvbHVtZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGN1cnJlbnQgdm9sdW1lIGZvciB0aGlzIHNlc3Npb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgdm9sdW1lIHdoZXJlIHRoaXMgc2Vzc2lvbiBpcyBwbGF5aW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRDdXJyZW50Vm9sdW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG1DdXJyZW50Vm9sdW1lOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2xhc3MgQ2FsbGJhY2tTdHViIGV4dGVuZHMgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2suU3R1YiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxNZWRpYUNvbnRyb2xsZXI+IG1Db250cm9sbGVyOworCisgICAgICAgIHB1YmxpYyBDYWxsYmFja1N0dWIoTWVkaWFDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKKyAgICAgICAgICAgIG1Db250cm9sbGVyID0gbmV3IFdlYWtSZWZlcmVuY2U8TWVkaWFDb250cm9sbGVyPihjb250cm9sbGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblNlc3Npb25EZXN0cm95ZWQoKSB7CisgICAgICAgICAgICBNZWRpYUNvbnRyb2xsZXIgY29udHJvbGxlciA9IG1Db250cm9sbGVyLmdldCgpOworICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucG9zdE1lc3NhZ2UoTVNHX0RFU1RST1lFRCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25FdmVudChTdHJpbmcgZXZlbnQsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgIE1lZGlhQ29udHJvbGxlciBjb250cm9sbGVyID0gbUNvbnRyb2xsZXIuZ2V0KCk7CisgICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29udHJvbGxlci5wb3N0TWVzc2FnZShNU0dfRVZFTlQsIGV2ZW50LCBleHRyYXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWJhY2tTdGF0ZUNoYW5nZWQoUGxheWJhY2tTdGF0ZSBzdGF0ZSkgeworICAgICAgICAgICAgTWVkaWFDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBtQ29udHJvbGxlci5nZXQoKTsKKyAgICAgICAgICAgIGlmIChjb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250cm9sbGVyLnBvc3RNZXNzYWdlKE1TR19VUERBVEVfUExBWUJBQ0tfU1RBVEUsIHN0YXRlLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbk1ldGFkYXRhQ2hhbmdlZChNZWRpYU1ldGFkYXRhIG1ldGFkYXRhKSB7CisgICAgICAgICAgICBNZWRpYUNvbnRyb2xsZXIgY29udHJvbGxlciA9IG1Db250cm9sbGVyLmdldCgpOworICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucG9zdE1lc3NhZ2UoTVNHX1VQREFURV9NRVRBREFUQSwgbWV0YWRhdGEsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUXVldWVDaGFuZ2VkKE1lZGlhUGFyY2VsZWRMaXN0U2xpY2UgcGFyY2VsZWRRdWV1ZSkgeworICAgICAgICAgICAgTGlzdDxNZWRpYVNlc3Npb24uUXVldWVJdGVtPiBxdWV1ZSA9IHBhcmNlbGVkUXVldWUgPT0gbnVsbCA/IG51bGwgOiBwYXJjZWxlZFF1ZXVlCisgICAgICAgICAgICAgICAgICAgIC5nZXRMaXN0KCk7CisgICAgICAgICAgICBNZWRpYUNvbnRyb2xsZXIgY29udHJvbGxlciA9IG1Db250cm9sbGVyLmdldCgpOworICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucG9zdE1lc3NhZ2UoTVNHX1VQREFURV9RVUVVRSwgcXVldWUsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUXVldWVUaXRsZUNoYW5nZWQoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgICAgICBNZWRpYUNvbnRyb2xsZXIgY29udHJvbGxlciA9IG1Db250cm9sbGVyLmdldCgpOworICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucG9zdE1lc3NhZ2UoTVNHX1VQREFURV9RVUVVRV9USVRMRSwgdGl0bGUsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRXh0cmFzQ2hhbmdlZChCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgICAgICBNZWRpYUNvbnRyb2xsZXIgY29udHJvbGxlciA9IG1Db250cm9sbGVyLmdldCgpOworICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucG9zdE1lc3NhZ2UoTVNHX1VQREFURV9FWFRSQVMsIGV4dHJhcywgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVJbmZvQ2hhbmdlZChQYXJjZWxhYmxlVm9sdW1lSW5mbyBwdmkpIHsKKyAgICAgICAgICAgIE1lZGlhQ29udHJvbGxlciBjb250cm9sbGVyID0gbUNvbnRyb2xsZXIuZ2V0KCk7CisgICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgUGxheWJhY2tJbmZvIGluZm8gPSBuZXcgUGxheWJhY2tJbmZvKHB2aS52b2x1bWVUeXBlLCBwdmkuYXVkaW9BdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgIHB2aS5jb250cm9sVHlwZSwgcHZpLm1heFZvbHVtZSwgcHZpLmN1cnJlbnRWb2x1bWUpOworICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucG9zdE1lc3NhZ2UoTVNHX1VQREFURV9WT0xVTUUsIGluZm8sIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBjbGFzcyBNZXNzYWdlSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgeworICAgICAgICBwcml2YXRlIGZpbmFsIE1lZGlhQ29udHJvbGxlci5DYWxsYmFjayBtQ2FsbGJhY2s7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtUmVnaXN0ZXJlZCA9IGZhbHNlOworCisgICAgICAgIHB1YmxpYyBNZXNzYWdlSGFuZGxlcihMb29wZXIgbG9vcGVyLCBNZWRpYUNvbnRyb2xsZXIuQ2FsbGJhY2sgY2IpIHsKKyAgICAgICAgICAgIHN1cGVyKGxvb3Blcik7CisgICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBpZiAoIW1SZWdpc3RlcmVkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0VWRU5UOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25TZXNzaW9uRXZlbnQoKFN0cmluZykgbXNnLm9iaiwgbXNnLmdldERhdGEoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1VQREFURV9QTEFZQkFDS19TVEFURToKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uUGxheWJhY2tTdGF0ZUNoYW5nZWQoKFBsYXliYWNrU3RhdGUpIG1zZy5vYmopOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19VUERBVEVfTUVUQURBVEE6CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vbk1ldGFkYXRhQ2hhbmdlZCgoTWVkaWFNZXRhZGF0YSkgbXNnLm9iaik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1VQREFURV9RVUVVRToKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uUXVldWVDaGFuZ2VkKChMaXN0PE1lZGlhU2Vzc2lvbi5RdWV1ZUl0ZW0+KSBtc2cub2JqKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfVVBEQVRFX1FVRVVFX1RJVExFOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25RdWV1ZVRpdGxlQ2hhbmdlZCgoQ2hhclNlcXVlbmNlKSBtc2cub2JqKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfVVBEQVRFX0VYVFJBUzoKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uRXh0cmFzQ2hhbmdlZCgoQnVuZGxlKSBtc2cub2JqKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfVVBEQVRFX1ZPTFVNRToKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uQXVkaW9JbmZvQ2hhbmdlZCgoUGxheWJhY2tJbmZvKSBtc2cub2JqKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfREVTVFJPWUVEOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25TZXNzaW9uRGVzdHJveWVkKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcG9zdChpbnQgd2hhdCwgT2JqZWN0IG9iaiwgQnVuZGxlIGRhdGEpIHsKKyAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gb2J0YWluTWVzc2FnZSh3aGF0LCBvYmopOworICAgICAgICAgICAgbXNnLnNldEFzeW5jaHJvbm91cyh0cnVlKTsKKyAgICAgICAgICAgIG1zZy5zZXREYXRhKGRhdGEpOworICAgICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9NZWRpYVNlc3Npb24uYWlkbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL01lZGlhU2Vzc2lvbi5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NTdjZWYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9NZWRpYVNlc3Npb24uYWlkbApAQCAtMCwwICsxLDE5IEBACisvKiBDb3B5cmlnaHQgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnNlc3Npb247CisKK3BhcmNlbGFibGUgTWVkaWFTZXNzaW9uLlRva2VuOworcGFyY2VsYWJsZSBNZWRpYVNlc3Npb24uUXVldWVJdGVtOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL01lZGlhU2Vzc2lvbi5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vTWVkaWFTZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNlMTZhNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL01lZGlhU2Vzc2lvbi5qYXZhCkBAIC0wLDAgKzEsMTU3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS5zZXNzaW9uOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLkludERlZjsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlVuc3VwcG9ydGVkQXBwVXNhZ2U7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFEZXNjcmlwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGE7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBhcmNlbGVkTGlzdFNsaWNlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuUmF0aW5nOworaW1wb3J0IGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbk1hbmFnZXIuUmVtb3RlVXNlckluZm87CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Vc2VySGFuZGxlOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5tZWRpYS5NZWRpYUJyb3dzZXJTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuUGFpcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdDb25maWd1cmF0aW9uOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CisKKy8qKgorICogQWxsb3dzIGludGVyYWN0aW9uIHdpdGggbWVkaWEgY29udHJvbGxlcnMsIHZvbHVtZSBrZXlzLCBtZWRpYSBidXR0b25zLCBhbmQKKyAqIHRyYW5zcG9ydCBjb250cm9scy4KKyAqIDxwPgorICogQSBNZWRpYVNlc3Npb24gc2hvdWxkIGJlIGNyZWF0ZWQgd2hlbiBhbiBhcHAgd2FudHMgdG8gcHVibGlzaCBtZWRpYSBwbGF5YmFjaworICogaW5mb3JtYXRpb24gb3IgaGFuZGxlIG1lZGlhIGtleXMuIEluIGdlbmVyYWwgYW4gYXBwIG9ubHkgbmVlZHMgb25lIHNlc3Npb24KKyAqIGZvciBhbGwgcGxheWJhY2ssIHRob3VnaCBtdWx0aXBsZSBzZXNzaW9ucyBjYW4gYmUgY3JlYXRlZCB0byBwcm92aWRlIGZpbmVyCisgKiBncmFpbiBjb250cm9scyBvZiBtZWRpYS4KKyAqIDxwPgorICogT25jZSBhIHNlc3Npb24gaXMgY3JlYXRlZCB0aGUgb3duZXIgb2YgdGhlIHNlc3Npb24gbWF5IHBhc3MgaXRzCisgKiB7QGxpbmsgI2dldFNlc3Npb25Ub2tlbigpIHNlc3Npb24gdG9rZW59IHRvIG90aGVyIHByb2Nlc3NlcyB0byBhbGxvdyB0aGVtIHRvCisgKiBjcmVhdGUgYSB7QGxpbmsgTWVkaWFDb250cm9sbGVyfSB0byBpbnRlcmFjdCB3aXRoIHRoZSBzZXNzaW9uLgorICogPHA+CisgKiBUbyByZWNlaXZlIGNvbW1hbmRzLCBtZWRpYSBrZXlzLCBhbmQgb3RoZXIgZXZlbnRzIGEge0BsaW5rIENhbGxiYWNrfSBtdXN0IGJlCisgKiBzZXQgd2l0aCB7QGxpbmsgI3NldENhbGxiYWNrKENhbGxiYWNrKX0gYW5kIHtAbGluayAjc2V0QWN0aXZlKGJvb2xlYW4pCisgKiBzZXRBY3RpdmUodHJ1ZSl9IG11c3QgYmUgY2FsbGVkLgorICogPHA+CisgKiBXaGVuIGFuIGFwcCBpcyBmaW5pc2hlZCBwZXJmb3JtaW5nIHBsYXliYWNrIGl0IG11c3QgY2FsbCB7QGxpbmsgI3JlbGVhc2UoKX0KKyAqIHRvIGNsZWFuIHVwIHRoZSBzZXNzaW9uIGFuZCBub3RpZnkgYW55IGNvbnRyb2xsZXJzLgorICogPHA+CisgKiBNZWRpYVNlc3Npb24gb2JqZWN0cyBhcmUgdGhyZWFkIHNhZmUuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYVNlc3Npb24geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFTZXNzaW9uIjsKKworICAgIC8qKgorICAgICAqIFNldCB0aGlzIGZsYWcgb24gdGhlIHNlc3Npb24gdG8gaW5kaWNhdGUgdGhhdCBpdCBjYW4gaGFuZGxlIG1lZGlhIGJ1dHRvbgorICAgICAqIGV2ZW50cy4KKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIGZsYWcgaXMgbm8gbG9uZ2VyIHVzZWQuIEFsbCBtZWRpYSBzZXNzaW9ucyBhcmUgZXhwZWN0ZWQgdG8gaGFuZGxlIG1lZGlhCisgICAgICogYnV0dG9uIGV2ZW50cyBub3cuCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0hBTkRMRVNfTUVESUFfQlVUVE9OUyA9IDEgPDwgMDsKKworICAgIC8qKgorICAgICAqIFNldCB0aGlzIGZsYWcgb24gdGhlIHNlc3Npb24gdG8gaW5kaWNhdGUgdGhhdCBpdCBoYW5kbGVzIHRyYW5zcG9ydAorICAgICAqIGNvbnRyb2wgY29tbWFuZHMgdGhyb3VnaCBpdHMge0BsaW5rIENhbGxiYWNrfS4KKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIGZsYWcgaXMgbm8gbG9uZ2VyIHVzZWQuIEFsbCBtZWRpYSBzZXNzaW9ucyBhcmUgZXhwZWN0ZWQgdG8gaGFuZGxlIHRyYW5zcG9ydAorICAgICAqIGNvbnRyb2xzIG5vdy4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfSEFORExFU19UUkFOU1BPUlRfQ09OVFJPTFMgPSAxIDw8IDE7CisKKyAgICAvKioKKyAgICAgKiBTeXN0ZW0gb25seSBmbGFnIGZvciBhIHNlc3Npb24gdGhhdCBuZWVkcyB0byBoYXZlIHByaW9yaXR5IG92ZXIgYWxsIG90aGVyCisgICAgICogc2Vzc2lvbnMuIFRoaXMgZmxhZyBlbnN1cmVzIHRoaXMgc2Vzc2lvbiB3aWxsIHJlY2VpdmUgbWVkaWEgYnV0dG9uIGV2ZW50cworICAgICAqIHJlZ2FyZGxlc3Mgb2YgdGhlIGN1cnJlbnQgb3JkZXJpbmcgaW4gdGhlIHN5c3RlbS4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19FWENMVVNJVkVfR0xPQkFMX1BSSU9SSVRZID0gMSA8PCAxNjsKKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9VSUQgPSAtMTsKKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9QSUQgPSAtMTsKKworICAgIC8qKiBAaGlkZSAqLworICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKKyAgICBASW50RGVmKGZsYWcgPSB0cnVlLCB2YWx1ZSA9IHsKKyAgICAgICAgICAgIEZMQUdfSEFORExFU19NRURJQV9CVVRUT05TLAorICAgICAgICAgICAgRkxBR19IQU5ETEVTX1RSQU5TUE9SVF9DT05UUk9MUywKKyAgICAgICAgICAgIEZMQUdfRVhDTFVTSVZFX0dMT0JBTF9QUklPUklUWSB9KQorICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNlc3Npb25GbGFncyB7IH0KKworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgZmluYWwgaW50IG1NYXhCaXRtYXBTaXplOworCisgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNlc3Npb24uVG9rZW4gbVNlc3Npb25Ub2tlbjsKKyAgICBwcml2YXRlIGZpbmFsIE1lZGlhQ29udHJvbGxlciBtQ29udHJvbGxlcjsKKyAgICBwcml2YXRlIGZpbmFsIElTZXNzaW9uIG1CaW5kZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBDYWxsYmFja1N0dWIgbUNiU3R1YjsKKworICAgIC8vIERvIG5vdCBjaGFuZ2UgdGhlIG5hbWUgb2YgbUNhbGxiYWNrLiBTdXBwb3J0IGxpYiBhY2Nlc3NlcyB0aGlzIGJ5IHVzaW5nIHJlZmxlY3Rpb24uCisgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICBwcml2YXRlIENhbGxiYWNrTWVzc2FnZUhhbmRsZXIgbUNhbGxiYWNrOworICAgIHByaXZhdGUgVm9sdW1lUHJvdmlkZXIgbVZvbHVtZVByb3ZpZGVyOworICAgIHByaXZhdGUgUGxheWJhY2tTdGF0ZSBtUGxheWJhY2tTdGF0ZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtQWN0aXZlID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHNlc3Npb24uIFRoZSBzZXNzaW9uIHdpbGwgYXV0b21hdGljYWxseSBiZSByZWdpc3RlcmVkIHdpdGgKKyAgICAgKiB0aGUgc3lzdGVtIGJ1dCB3aWxsIG5vdCBiZSBwdWJsaXNoZWQgdW50aWwge0BsaW5rICNzZXRBY3RpdmUoYm9vbGVhbikKKyAgICAgKiBzZXRBY3RpdmUodHJ1ZSl9IGlzIGNhbGxlZC4gWW91IG11c3QgY2FsbCB7QGxpbmsgI3JlbGVhc2UoKX0gd2hlbgorICAgICAqIGZpbmlzaGVkIHdpdGggdGhlIHNlc3Npb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byB1c2UgdG8gY3JlYXRlIHRoZSBzZXNzaW9uLgorICAgICAqIEBwYXJhbSB0YWcgQSBzaG9ydCBuYW1lIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisgICAgICovCisgICAgcHVibGljIE1lZGlhU2Vzc2lvbihATm9uTnVsbCBDb250ZXh0IGNvbnRleHQsIEBOb25OdWxsIFN0cmluZyB0YWcpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCB0YWcsIFVzZXJIYW5kbGUubXlVc2VySWQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBzZXNzaW9uIGFzIHRoZSBzcGVjaWZpZWQgdXNlci4gVG8gY3JlYXRlIGEgc2Vzc2lvbiBhcyBhCisgICAgICogdXNlciBvdGhlciB0aGFuIHlvdXIgb3duIHlvdSBtdXN0IGhvbGQgdGhlCisgICAgICoge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNJTlRFUkFDVF9BQ1JPU1NfVVNFUlNfRlVMTH0KKyAgICAgKiBwZXJtaXNzaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gdXNlIHRvIGNyZWF0ZSB0aGUgc2Vzc2lvbi4KKyAgICAgKiBAcGFyYW0gdGFnIEEgc2hvcnQgbmFtZSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorICAgICAqIEBwYXJhbSB1c2VySWQgVGhlIHVzZXIgaWQgdG8gY3JlYXRlIHRoZSBzZXNzaW9uIGFzLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIE1lZGlhU2Vzc2lvbihATm9uTnVsbCBDb250ZXh0IGNvbnRleHQsIEBOb25OdWxsIFN0cmluZyB0YWcsIGludCB1c2VySWQpIHsKKyAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udGV4dCBjYW5ub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkodGFnKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGFnIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5Iik7CisgICAgICAgIH0KKyAgICAgICAgbU1heEJpdG1hcFNpemUgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKKyAgICAgICAgICAgICAgICBhbmRyb2lkLlIuZGltZW4uY29uZmlnX21lZGlhTWV0YWRhdGFCaXRtYXBNYXhTaXplKTsKKyAgICAgICAgbUNiU3R1YiA9IG5ldyBDYWxsYmFja1N0dWIodGhpcyk7CisgICAgICAgIE1lZGlhU2Vzc2lvbk1hbmFnZXIgbWFuYWdlciA9IChNZWRpYVNlc3Npb25NYW5hZ2VyKSBjb250ZXh0CisgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5NRURJQV9TRVNTSU9OX1NFUlZJQ0UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy9UT0RPKGIvMTE5NzQ5ODYyKTogUmVzb2x2ZSBoaWRkZW4gQVBJIHVzYWdlLiBNZWRpYVNlc3Npb01hbmFnZXIjY3JlYXRlU2Vzc2lvbgorICAgICAgICAgICAgLy9tQmluZGVyID0gbWFuYWdlci5jcmVhdGVTZXNzaW9uKG1DYlN0dWIsIHRhZywgdXNlcklkKTsKKyAgICAgICAgICAgIG1CaW5kZXIgPSBudWxsOyAgLy9UT0RPOiByZW1vdmUgdGhpcy4KKyAgICAgICAgICAgIG1TZXNzaW9uVG9rZW4gPSBuZXcgVG9rZW4obUJpbmRlci5nZXRDb250cm9sbGVyKCkpOworICAgICAgICAgICAgbUNvbnRyb2xsZXIgPSBuZXcgTWVkaWFDb250cm9sbGVyKGNvbnRleHQsIG1TZXNzaW9uVG9rZW4pOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlJlbW90ZSBlcnJvciBjcmVhdGluZyBzZXNzaW9uLiIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjYWxsYmFjayB0byByZWNlaXZlIHVwZGF0ZXMgZm9yIHRoZSBNZWRpYVNlc3Npb24uIFRoaXMgaW5jbHVkZXMKKyAgICAgKiBtZWRpYSBidXR0b24gZXZlbnRzIGFuZCB0cmFuc3BvcnQgY29udHJvbHMuIFRoZSBjYWxsZXIncyB0aHJlYWQgd2lsbCBiZQorICAgICAqIHVzZWQgdG8gcG9zdCB1cGRhdGVzLgorICAgICAqIDxwPgorICAgICAqIFNldCB0aGUgY2FsbGJhY2sgdG8gbnVsbCB0byBzdG9wIHJlY2VpdmluZyB1cGRhdGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYWxsYmFjayhATnVsbGFibGUgQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgc2V0Q2FsbGJhY2soY2FsbGJhY2ssIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2FsbGJhY2sgdG8gcmVjZWl2ZSB1cGRhdGVzIGZvciB0aGUgTWVkaWFTZXNzaW9uLiBUaGlzIGluY2x1ZGVzCisgICAgICogbWVkaWEgYnV0dG9uIGV2ZW50cyBhbmQgdHJhbnNwb3J0IGNvbnRyb2xzLgorICAgICAqIDxwPgorICAgICAqIFNldCB0aGUgY2FsbGJhY2sgdG8gbnVsbCB0byBzdG9wIHJlY2VpdmluZyB1cGRhdGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZWNlaXZlIHVwZGF0ZXMgb24uCisgICAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgdGhhdCBldmVudHMgc2hvdWxkIGJlIHBvc3RlZCBvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYWxsYmFjayhATnVsbGFibGUgQ2FsbGJhY2sgY2FsbGJhY2ssIEBOdWxsYWJsZSBIYW5kbGVyIGhhbmRsZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gV2UncmUgdXBkYXRpbmcgdGhlIGNhbGxiYWNrLCBjbGVhciB0aGUgc2Vzc2lvbiBmcm9tIHRoZSBvbGQgb25lLgorICAgICAgICAgICAgICAgIG1DYWxsYmFjay5tQ2FsbGJhY2subVNlc3Npb24gPSBudWxsOworICAgICAgICAgICAgICAgIG1DYWxsYmFjay5yZW1vdmVDYWxsYmFja3NBbmRNZXNzYWdlcyhudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrID0gbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGFuZGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYWxsYmFjay5tU2Vzc2lvbiA9IHRoaXM7CisgICAgICAgICAgICBDYWxsYmFja01lc3NhZ2VIYW5kbGVyIG1zZ0hhbmRsZXIgPSBuZXcgQ2FsbGJhY2tNZXNzYWdlSGFuZGxlcihoYW5kbGVyLmdldExvb3BlcigpLAorICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayk7CisgICAgICAgICAgICBtQ2FsbGJhY2sgPSBtc2dIYW5kbGVyOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGFuIGludGVudCBmb3IgbGF1bmNoaW5nIFVJIGZvciB0aGlzIFNlc3Npb24uIFRoaXMgY2FuIGJlIHVzZWQgYXMgYQorICAgICAqIHF1aWNrIGxpbmsgdG8gYW4gb25nb2luZyBtZWRpYSBzY3JlZW4uIFRoZSBpbnRlbnQgc2hvdWxkIGJlIGZvciBhbgorICAgICAqIGFjdGl2aXR5IHRoYXQgbWF5IGJlIHN0YXJ0ZWQgdXNpbmcge0BsaW5rIEFjdGl2aXR5I3N0YXJ0QWN0aXZpdHkoSW50ZW50KX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGkgVGhlIGludGVudCB0byBsYXVuY2ggdG8gc2hvdyBVSSBmb3IgdGhpcyBTZXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb25BY3Rpdml0eShATnVsbGFibGUgUGVuZGluZ0ludGVudCBwaSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJpbmRlci5zZXRMYXVuY2hQZW5kaW5nSW50ZW50KHBpKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRmFpbHVyZSBpbiBzZXRMYXVuY2hQZW5kaW5nSW50ZW50LiIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgcGVuZGluZyBpbnRlbnQgZm9yIHlvdXIgbWVkaWEgYnV0dG9uIHJlY2VpdmVyIHRvIGFsbG93IHJlc3RhcnRpbmcKKyAgICAgKiBwbGF5YmFjayBhZnRlciB0aGUgc2Vzc2lvbiBoYXMgYmVlbiBzdG9wcGVkLiBJZiB5b3VyIGFwcCBpcyBzdGFydGVkIGluCisgICAgICogdGhpcyB3YXkgYW4ge0BsaW5rIEludGVudCNBQ1RJT05fTUVESUFfQlVUVE9OfSBpbnRlbnQgd2lsbCBiZSBzZW50IHZpYQorICAgICAqIHRoZSBwZW5kaW5nIGludGVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYnIgVGhlIHtAbGluayBQZW5kaW5nSW50ZW50fSB0byBzZW5kIHRoZSBtZWRpYSBidXR0b24gZXZlbnQgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWVkaWFCdXR0b25SZWNlaXZlcihATnVsbGFibGUgUGVuZGluZ0ludGVudCBtYnIpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CaW5kZXIuc2V0TWVkaWFCdXR0b25SZWNlaXZlcihtYnIpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJGYWlsdXJlIGluIHNldE1lZGlhQnV0dG9uUmVjZWl2ZXIuIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYW55IGZsYWdzIGZvciB0aGUgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbGFncyBUaGUgZmxhZ3MgdG8gc2V0IGZvciB0aGlzIHNlc3Npb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmxhZ3MoQFNlc3Npb25GbGFncyBpbnQgZmxhZ3MpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CaW5kZXIuc2V0RmxhZ3MoZmxhZ3MpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJGYWlsdXJlIGluIHNldEZsYWdzLiIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhdHRyaWJ1dGVzIGZvciB0aGlzIHNlc3Npb24ncyBhdWRpby4gVGhpcyB3aWxsIGFmZmVjdCB0aGUKKyAgICAgKiBzeXN0ZW0ncyB2b2x1bWUgaGFuZGxpbmcgZm9yIHRoaXMgc2Vzc2lvbi4gSWYKKyAgICAgKiB7QGxpbmsgI3NldFBsYXliYWNrVG9SZW1vdGV9IHdhcyBwcmV2aW91c2x5IGNhbGxlZCBpdCB3aWxsIHN0b3AgcmVjZWl2aW5nCisgICAgICogdm9sdW1lIGNvbW1hbmRzIGFuZCB0aGUgc3lzdGVtIHdpbGwgYmVnaW4gc2VuZGluZyB2b2x1bWUgY2hhbmdlcyB0byB0aGUKKyAgICAgKiBhcHByb3ByaWF0ZSBzdHJlYW0uCisgICAgICogPHA+CisgICAgICogQnkgZGVmYXVsdCBzZXNzaW9ucyB1c2UgYXR0cmlidXRlcyBmb3IgbWVkaWEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBUaGUge0BsaW5rIEF1ZGlvQXR0cmlidXRlc30gZm9yIHRoaXMgc2Vzc2lvbidzIGF1ZGlvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBsYXliYWNrVG9Mb2NhbChBdWRpb0F0dHJpYnV0ZXMgYXR0cmlidXRlcykgeworICAgICAgICBpZiAoYXR0cmlidXRlcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBdHRyaWJ1dGVzIGNhbm5vdCBiZSBudWxsIGZvciBsb2NhbCBwbGF5YmFjay4iKTsKKyAgICAgICAgfQorICAgICAgICAvL1RPRE8oYi8xMTk3NTE1OTIpOiBEZWNpZGUgaWYgQXVkaW9BdHRyaWJ1dGVzIHNob3VsZCBiZSB1cGRhdGVkLgorICAgICAgICAvKgorICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJpbmRlci5zZXRQbGF5YmFja1RvTG9jYWwoYXR0cmlidXRlcyk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cud3RmKFRBRywgIkZhaWx1cmUgaW4gc2V0UGxheWJhY2tUb0xvY2FsLiIsIGUpOworICAgICAgICB9CisgICAgICAgICovCisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uZmlndXJlIHRoaXMgc2Vzc2lvbiB0byB1c2UgcmVtb3RlIHZvbHVtZSBoYW5kbGluZy4gVGhpcyBtdXN0IGJlIGNhbGxlZAorICAgICAqIHRvIHJlY2VpdmUgdm9sdW1lIGJ1dHRvbiBldmVudHMsIG90aGVyd2lzZSB0aGUgc3lzdGVtIHdpbGwgYWRqdXN0IHRoZQorICAgICAqIGFwcHJvcHJpYXRlIHN0cmVhbSB2b2x1bWUgZm9yIHRoaXMgc2Vzc2lvbi4gSWYKKyAgICAgKiB7QGxpbmsgI3NldFBsYXliYWNrVG9Mb2NhbH0gd2FzIHByZXZpb3VzbHkgY2FsbGVkIHRoZSBzeXN0ZW0gd2lsbCBzdG9wCisgICAgICogaGFuZGxpbmcgdm9sdW1lIGNoYW5nZXMgZm9yIHRoaXMgc2Vzc2lvbiBhbmQgcGFzcyB0aGVtIHRvIHRoZSB2b2x1bWUKKyAgICAgKiBwcm92aWRlciBpbnN0ZWFkLgorICAgICAqCisgICAgICogQHBhcmFtIHZvbHVtZVByb3ZpZGVyIFRoZSBwcm92aWRlciB0aGF0IHdpbGwgaGFuZGxlIHZvbHVtZSBjaGFuZ2VzLiBNYXkKKyAgICAgKiAgICAgICAgICAgIG5vdCBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBsYXliYWNrVG9SZW1vdGUoQE5vbk51bGwgVm9sdW1lUHJvdmlkZXIgdm9sdW1lUHJvdmlkZXIpIHsKKyAgICAgICAgaWYgKHZvbHVtZVByb3ZpZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInZvbHVtZVByb3ZpZGVyIG1heSBub3QgYmUgbnVsbCEiKTsKKyAgICAgICAgfQorICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBtVm9sdW1lUHJvdmlkZXIgPSB2b2x1bWVQcm92aWRlcjsKKyAgICAgICAgfQorICAgICAgICB2b2x1bWVQcm92aWRlci5zZXRDYWxsYmFjayhuZXcgVm9sdW1lUHJvdmlkZXIuQ2FsbGJhY2soKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lQ2hhbmdlZChWb2x1bWVQcm92aWRlciB2b2x1bWVQcm92aWRlcikgeworICAgICAgICAgICAgICAgIG5vdGlmeVJlbW90ZVZvbHVtZUNoYW5nZWQodm9sdW1lUHJvdmlkZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJpbmRlci5zZXRQbGF5YmFja1RvUmVtb3RlKHZvbHVtZVByb3ZpZGVyLmdldFZvbHVtZUNvbnRyb2woKSwKKyAgICAgICAgICAgICAgICAgICAgdm9sdW1lUHJvdmlkZXIuZ2V0TWF4Vm9sdW1lKCkpOworICAgICAgICAgICAgbUJpbmRlci5zZXRDdXJyZW50Vm9sdW1lKHZvbHVtZVByb3ZpZGVyLmdldEN1cnJlbnRWb2x1bWUoKSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cud3RmKFRBRywgIkZhaWx1cmUgaW4gc2V0UGxheWJhY2tUb1JlbW90ZS4iLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBpZiB0aGlzIHNlc3Npb24gaXMgY3VycmVudGx5IGFjdGl2ZSBhbmQgcmVhZHkgdG8gcmVjZWl2ZSBjb21tYW5kcy4gSWYKKyAgICAgKiBzZXQgdG8gZmFsc2UgeW91ciBzZXNzaW9uJ3MgY29udHJvbGxlciBtYXkgbm90IGJlIGRpc2NvdmVyYWJsZS4gWW91IG11c3QKKyAgICAgKiBzZXQgdGhlIHNlc3Npb24gdG8gYWN0aXZlIGJlZm9yZSBpdCBjYW4gc3RhcnQgcmVjZWl2aW5nIG1lZGlhIGJ1dHRvbgorICAgICAqIGV2ZW50cyBvciB0cmFuc3BvcnQgY29tbWFuZHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWN0aXZlIFdoZXRoZXIgdGhpcyBzZXNzaW9uIGlzIGFjdGl2ZSBvciBub3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWN0aXZlKGJvb2xlYW4gYWN0aXZlKSB7CisgICAgICAgIGlmIChtQWN0aXZlID09IGFjdGl2ZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQmluZGVyLnNldEFjdGl2ZShhY3RpdmUpOworICAgICAgICAgICAgbUFjdGl2ZSA9IGFjdGl2ZTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRmFpbHVyZSBpbiBzZXRBY3RpdmUuIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGN1cnJlbnQgYWN0aXZlIHN0YXRlIG9mIHRoaXMgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc2Vzc2lvbiBpcyBhY3RpdmUsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCBhIHByb3ByaWV0YXJ5IGV2ZW50IHRvIGFsbCBNZWRpYUNvbnRyb2xsZXJzIGxpc3RlbmluZyB0byB0aGlzCisgICAgICogU2Vzc2lvbi4gSXQncyB1cCB0byB0aGUgQ29udHJvbGxlci9TZXNzaW9uIG93bmVyIHRvIGRldGVybWluZSB0aGUgbWVhbmluZworICAgICAqIG9mIGFueSBldmVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHNlbmQKKyAgICAgKiBAcGFyYW0gZXh0cmFzIEFueSBleHRyYXMgaW5jbHVkZWQgd2l0aCB0aGUgZXZlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZW5kU2Vzc2lvbkV2ZW50KEBOb25OdWxsIFN0cmluZyBldmVudCwgQE51bGxhYmxlIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGV2ZW50KSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZXZlbnQgY2Fubm90IGJlIG51bGwgb3IgZW1wdHkiKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJpbmRlci5zZW5kRXZlbnQoZXZlbnQsIGV4dHJhcyk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cud3RmKFRBRywgIkVycm9yIHNlbmRpbmcgZXZlbnQiLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgd2hlbiBhbiBhcHAgaGFzIGZpbmlzaGVkIHBlcmZvcm1pbmcgcGxheWJhY2suIElmCisgICAgICogcGxheWJhY2sgaXMgZXhwZWN0ZWQgdG8gc3RhcnQgYWdhaW4gc2hvcnRseSB0aGUgc2Vzc2lvbiBjYW4gYmUgbGVmdCBvcGVuLAorICAgICAqIGJ1dCBpdCBtdXN0IGJlIHJlbGVhc2VkIGlmIHlvdXIgYWN0aXZpdHkgb3Igc2VydmljZSBpcyBiZWluZyBkZXN0cm95ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CaW5kZXIuZGVzdHJveSgpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciByZWxlYXNpbmcgc2Vzc2lvbjogIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSBhIHRva2VuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGJ5IGFwcHMgdG8gY3JlYXRlIGEKKyAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sbGVyfSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGlzIHNlc3Npb24uIFRoZSBvd25lciBvZgorICAgICAqIHRoZSBzZXNzaW9uIGlzIHJlc3BvbnNpYmxlIGZvciBkZWNpZGluZyBob3cgdG8gZGlzdHJpYnV0ZSB0aGVzZSB0b2tlbnMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgdG9rZW4gdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSBNZWRpYUNvbnRyb2xsZXIgZm9yIHRoaXMKKyAgICAgKiAgICAgICAgIHNlc3Npb24KKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vbk51bGwgVG9rZW4gZ2V0U2Vzc2lvblRva2VuKCkgeworICAgICAgICByZXR1cm4gbVNlc3Npb25Ub2tlbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBjb250cm9sbGVyIGZvciB0aGlzIHNlc3Npb24uIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYXZvaWQKKyAgICAgKiBoYXZpbmcgdG8gY2FjaGUgeW91ciBvd24gY29udHJvbGxlciBpbiBwcm9jZXNzLgorICAgICAqCisgICAgICogQHJldHVybiBBIGNvbnRyb2xsZXIgZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vbk51bGwgTWVkaWFDb250cm9sbGVyIGdldENvbnRyb2xsZXIoKSB7CisgICAgICAgIHJldHVybiBtQ29udHJvbGxlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGUgdGhlIGN1cnJlbnQgcGxheWJhY2sgc3RhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhdGUgVGhlIGN1cnJlbnQgc3RhdGUgb2YgcGxheWJhY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQbGF5YmFja1N0YXRlKEBOdWxsYWJsZSBQbGF5YmFja1N0YXRlIHN0YXRlKSB7CisgICAgICAgIG1QbGF5YmFja1N0YXRlID0gc3RhdGU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQmluZGVyLnNldFBsYXliYWNrU3RhdGUoc3RhdGUpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJEZWFkIG9iamVjdCBpbiBzZXRQbGF5YmFja1N0YXRlLiIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlIHRoZSBjdXJyZW50IG1ldGFkYXRhLiBOZXcgbWV0YWRhdGEgY2FuIGJlIGNyZWF0ZWQgdXNpbmcKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhLkJ1aWxkZXJ9LiBUaGlzIG9wZXJhdGlvbiBtYXkgdGFrZSB0aW1lIHByb3BvcnRpb25hbCB0bworICAgICAqIHRoZSBzaXplIG9mIHRoZSBiaXRtYXAgdG8gcmVwbGFjZSBsYXJnZSBiaXRtYXBzIHdpdGggYSBzY2FsZWQgZG93biBjb3B5LgorICAgICAqCisgICAgICogQHBhcmFtIG1ldGFkYXRhIFRoZSBuZXcgbWV0YWRhdGEKKyAgICAgKiBAc2VlIGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YS5CdWlsZGVyI3B1dEJpdG1hcAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1ldGFkYXRhKEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhIG1ldGFkYXRhKSB7CisgICAgICAgIGxvbmcgZHVyYXRpb24gPSAtMTsKKyAgICAgICAgaW50IGZpZWxkcyA9IDA7CisgICAgICAgIE1lZGlhRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBudWxsOworICAgICAgICBpZiAobWV0YWRhdGEgIT0gbnVsbCkgeworICAgICAgICAgICAgbWV0YWRhdGEgPSAobmV3IE1lZGlhTWV0YWRhdGEuQnVpbGRlcihtZXRhZGF0YSwgbU1heEJpdG1hcFNpemUpKS5idWlsZCgpOworICAgICAgICAgICAgaWYgKG1ldGFkYXRhLmNvbnRhaW5zS2V5KE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX0RVUkFUSU9OKSkgeworICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gbWV0YWRhdGEuZ2V0TG9uZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9EVVJBVElPTik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaWVsZHMgPSBtZXRhZGF0YS5zaXplKCk7CisgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IG1ldGFkYXRhLmdldERlc2NyaXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIG1ldGFkYXRhRGVzY3JpcHRpb24gPSAic2l6ZT0iICsgZmllbGRzICsgIiwgZGVzY3JpcHRpb249IiArIGRlc2NyaXB0aW9uOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQmluZGVyLnNldE1ldGFkYXRhKG1ldGFkYXRhLCBkdXJhdGlvbiwgbWV0YWRhdGFEZXNjcmlwdGlvbik7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cud3RmKFRBRywgIkRlYWQgb2JqZWN0IGluIHNldFBsYXliYWNrU3RhdGUuIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGUgdGhlIGxpc3Qgb2YgaXRlbXMgaW4gdGhlIHBsYXkgcXVldWUuIEl0IGlzIGFuIG9yZGVyZWQgbGlzdCBhbmQKKyAgICAgKiBzaG91bGQgY29udGFpbiB0aGUgY3VycmVudCBpdGVtLCBhbmQgcHJldmlvdXMgb3IgdXBjb21pbmcgaXRlbXMgaWYgdGhleQorICAgICAqIGV4aXN0LiBTcGVjaWZ5IG51bGwgaWYgdGhlcmUgaXMgbm8gY3VycmVudCBwbGF5IHF1ZXVlLgorICAgICAqIDxwPgorICAgICAqIFRoZSBxdWV1ZSBzaG91bGQgYmUgb2YgcmVhc29uYWJsZSBzaXplLiBJZiB0aGUgcGxheSBxdWV1ZSBpcyB1bmJvdW5kZWQKKyAgICAgKiB3aXRoaW4geW91ciBhcHAsIGl0IGlzIGJldHRlciB0byBzZW5kIGEgcmVhc29uYWJsZSBhbW91bnQgaW4gYSBzbGlkaW5nCisgICAgICogd2luZG93IGluc3RlYWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcXVldWUgQSBsaXN0IG9mIGl0ZW1zIGluIHRoZSBwbGF5IHF1ZXVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFF1ZXVlKEBOdWxsYWJsZSBMaXN0PFF1ZXVlSXRlbT4gcXVldWUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CaW5kZXIuc2V0UXVldWUocXVldWUgPT0gbnVsbCA/IG51bGwgOiBuZXcgTWVkaWFQYXJjZWxlZExpc3RTbGljZTxRdWV1ZUl0ZW0+KHF1ZXVlKSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cud3RmKCJEZWFkIG9iamVjdCBpbiBzZXRRdWV1ZS4iLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdGl0bGUgb2YgdGhlIHBsYXkgcXVldWUuIFRoZSBVSSBzaG91bGQgZGlzcGxheSB0aGlzIHRpdGxlIGFsb25nCisgICAgICogd2l0aCB0aGUgcGxheSBxdWV1ZSBpdHNlbGYuCisgICAgICogZS5nLiAiUGxheSBRdWV1ZSIsICJOb3cgUGxheWluZyIsIG9yIGFuIGFsYnVtIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGl0bGUgVGhlIHRpdGxlIG9mIHRoZSBwbGF5IHF1ZXVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFF1ZXVlVGl0bGUoQE51bGxhYmxlIENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJpbmRlci5zZXRRdWV1ZVRpdGxlKHRpdGxlKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53dGYoIkRlYWQgb2JqZWN0IGluIHNldFF1ZXVlVGl0bGUuIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHN0eWxlIG9mIHJhdGluZyB1c2VkIGJ5IHRoaXMgc2Vzc2lvbi4gQXBwcyB0cnlpbmcgdG8gc2V0IHRoZQorICAgICAqIHJhdGluZyBzaG91bGQgdXNlIHRoaXMgc3R5bGUuIE11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgUmF0aW5nI1JBVElOR19OT05FfTwvbGk+CisgICAgICogPGxpPntAbGluayBSYXRpbmcjUkFUSU5HXzNfU1RBUlN9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIFJhdGluZyNSQVRJTkdfNF9TVEFSU308L2xpPgorICAgICAqIDxsaT57QGxpbmsgUmF0aW5nI1JBVElOR181X1NUQVJTfTwvbGk+CisgICAgICogPGxpPntAbGluayBSYXRpbmcjUkFUSU5HX0hFQVJUfTwvbGk+CisgICAgICogPGxpPntAbGluayBSYXRpbmcjUkFUSU5HX1BFUkNFTlRBR0V9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIFJhdGluZyNSQVRJTkdfVEhVTUJfVVBfRE9XTn08L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmF0aW5nVHlwZShAUmF0aW5nLlN0eWxlIGludCB0eXBlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQmluZGVyLnNldFJhdGluZ1R5cGUodHlwZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBpbiBzZXRSYXRpbmdUeXBlLiIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHNvbWUgZXh0cmFzIHRoYXQgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUge0BsaW5rIE1lZGlhU2Vzc2lvbn0uIE5vIGFzc3VtcHRpb25zIHNob3VsZAorICAgICAqIGJlIG1hZGUgYXMgdG8gaG93IGEge0BsaW5rIE1lZGlhQ29udHJvbGxlcn0gd2lsbCBoYW5kbGUgdGhlc2UgZXh0cmFzLgorICAgICAqIEtleXMgc2hvdWxkIGJlIGZ1bGx5IHF1YWxpZmllZCAoZS5nLiBjb20uZXhhbXBsZS5NWV9FWFRSQSkgdG8gYXZvaWQgY29uZmxpY3RzLgorICAgICAqCisgICAgICogQHBhcmFtIGV4dHJhcyBUaGUgZXh0cmFzIGFzc29jaWF0ZWQgd2l0aCB0aGUge0BsaW5rIE1lZGlhU2Vzc2lvbn0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXh0cmFzKEBOdWxsYWJsZSBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQmluZGVyLnNldEV4dHJhcyhleHRyYXMpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnd0ZigiRGVhZCBvYmplY3QgaW4gc2V0RXh0cmFzLiIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY29udHJvbGxlciBpbmZvcm1hdGlvbiB3aG8gc2VudCB0aGUgY3VycmVudCByZXF1ZXN0LgorICAgICAqIDxwPgorICAgICAqIE5vdGU6IFRoaXMgaXMgb25seSB2YWxpZCB3aGlsZSBpbiBhIHJlcXVlc3QgY2FsbGJhY2ssIHN1Y2ggYXMge0BsaW5rIENhbGxiYWNrI29uUGxheX0uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb3V0c2lkZSBvZiB7QGxpbmsgQ2FsbGJhY2t9IG1ldGhvZHMuCisgICAgICogQHNlZSBNZWRpYVNlc3Npb25NYW5hZ2VyI2lzVHJ1c3RlZEZvck1lZGlhQ29udHJvbChSZW1vdGVVc2VySW5mbykKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgQE5vbk51bGwgUmVtb3RlVXNlckluZm8gZ2V0Q3VycmVudENvbnRyb2xsZXJJbmZvKCkgeworICAgICAgICBpZiAobUNhbGxiYWNrID09IG51bGwgfHwgbUNhbGxiYWNrLm1DdXJyZW50Q29udHJvbGxlckluZm8gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlRoaXMgc2hvdWxkIGJlIGNhbGxlZCBpbnNpZGUgb2YgTWVkaWFTZXNzaW9uLkNhbGxiYWNrIG1ldGhvZHMiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUNhbGxiYWNrLm1DdXJyZW50Q29udHJvbGxlckluZm87CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90aWZ5IHRoZSBzeXN0ZW0gdGhhdCB0aGUgcmVtb3RlIHZvbHVtZSBjaGFuZ2VkLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3ZpZGVyIFRoZSBwcm92aWRlciB0aGF0IGlzIGhhbmRsaW5nIHZvbHVtZSBjaGFuZ2VzLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgbm90aWZ5UmVtb3RlVm9sdW1lQ2hhbmdlZChWb2x1bWVQcm92aWRlciBwcm92aWRlcikgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBpZiAocHJvdmlkZXIgPT0gbnVsbCB8fCBwcm92aWRlciAhPSBtVm9sdW1lUHJvdmlkZXIpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJSZWNlaXZlZCB1cGRhdGUgZnJvbSBzdGFsZSB2b2x1bWUgcHJvdmlkZXIiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CaW5kZXIuc2V0Q3VycmVudFZvbHVtZShwcm92aWRlci5nZXRDdXJyZW50Vm9sdW1lKCkpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgaW4gbm90aWZ5Vm9sdW1lQ2hhbmdlZCIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0aGF0IHNlbnQgdGhlIGxhc3QgbWVkaWEgYnV0dG9uLCB0cmFuc3BvcnQgY29udHJvbCwgb3IKKyAgICAgKiBjb21tYW5kIGZyb20gY29udHJvbGxlcnMgYW5kIHRoZSBzeXN0ZW0uIFRoaXMgaXMgb25seSB2YWxpZCB3aGlsZSBpbiBhIHJlcXVlc3QgY2FsbGJhY2ssIHN1Y2gKKyAgICAgKiBhcyB7QGxpbmsgQ2FsbGJhY2sjb25QbGF5fS4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICBwdWJsaWMgU3RyaW5nIGdldENhbGxpbmdQYWNrYWdlKCkgeworICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwgJiYgbUNhbGxiYWNrLm1DdXJyZW50Q29udHJvbGxlckluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1DYWxsYmFjay5tQ3VycmVudENvbnRyb2xsZXJJbmZvLmdldFBhY2thZ2VOYW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoUHJlcGFyZShSZW1vdGVVc2VySW5mbyBjYWxsZXIpIHsKKyAgICAgICAgcG9zdFRvQ2FsbGJhY2soY2FsbGVyLCBDYWxsYmFja01lc3NhZ2VIYW5kbGVyLk1TR19QUkVQQVJFLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hQcmVwYXJlRnJvbU1lZGlhSWQoUmVtb3RlVXNlckluZm8gY2FsbGVyLCBTdHJpbmcgbWVkaWFJZCwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICBwb3N0VG9DYWxsYmFjayhjYWxsZXIsIENhbGxiYWNrTWVzc2FnZUhhbmRsZXIuTVNHX1BSRVBBUkVfTUVESUFfSUQsIG1lZGlhSWQsIGV4dHJhcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoUHJlcGFyZUZyb21TZWFyY2goUmVtb3RlVXNlckluZm8gY2FsbGVyLCBTdHJpbmcgcXVlcnksIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgcG9zdFRvQ2FsbGJhY2soY2FsbGVyLCBDYWxsYmFja01lc3NhZ2VIYW5kbGVyLk1TR19QUkVQQVJFX1NFQVJDSCwgcXVlcnksIGV4dHJhcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoUHJlcGFyZUZyb21VcmkoUmVtb3RlVXNlckluZm8gY2FsbGVyLCBVcmkgdXJpLCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIHBvc3RUb0NhbGxiYWNrKGNhbGxlciwgQ2FsbGJhY2tNZXNzYWdlSGFuZGxlci5NU0dfUFJFUEFSRV9VUkksIHVyaSwgZXh0cmFzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hQbGF5KFJlbW90ZVVzZXJJbmZvIGNhbGxlcikgeworICAgICAgICBwb3N0VG9DYWxsYmFjayhjYWxsZXIsIENhbGxiYWNrTWVzc2FnZUhhbmRsZXIuTVNHX1BMQVksIG51bGwsIG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkaXNwYXRjaFBsYXlGcm9tTWVkaWFJZChSZW1vdGVVc2VySW5mbyBjYWxsZXIsIFN0cmluZyBtZWRpYUlkLCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIHBvc3RUb0NhbGxiYWNrKGNhbGxlciwgQ2FsbGJhY2tNZXNzYWdlSGFuZGxlci5NU0dfUExBWV9NRURJQV9JRCwgbWVkaWFJZCwgZXh0cmFzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hQbGF5RnJvbVNlYXJjaChSZW1vdGVVc2VySW5mbyBjYWxsZXIsIFN0cmluZyBxdWVyeSwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICBwb3N0VG9DYWxsYmFjayhjYWxsZXIsIENhbGxiYWNrTWVzc2FnZUhhbmRsZXIuTVNHX1BMQVlfU0VBUkNILCBxdWVyeSwgZXh0cmFzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hQbGF5RnJvbVVyaShSZW1vdGVVc2VySW5mbyBjYWxsZXIsIFVyaSB1cmksIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgcG9zdFRvQ2FsbGJhY2soY2FsbGVyLCBDYWxsYmFja01lc3NhZ2VIYW5kbGVyLk1TR19QTEFZX1VSSSwgdXJpLCBleHRyYXMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkaXNwYXRjaFNraXBUb0l0ZW0oUmVtb3RlVXNlckluZm8gY2FsbGVyLCBsb25nIGlkKSB7CisgICAgICAgIHBvc3RUb0NhbGxiYWNrKGNhbGxlciwgQ2FsbGJhY2tNZXNzYWdlSGFuZGxlci5NU0dfU0tJUF9UT19JVEVNLCBpZCwgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoUGF1c2UoUmVtb3RlVXNlckluZm8gY2FsbGVyKSB7CisgICAgICAgIHBvc3RUb0NhbGxiYWNrKGNhbGxlciwgQ2FsbGJhY2tNZXNzYWdlSGFuZGxlci5NU0dfUEFVU0UsIG51bGwsIG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkaXNwYXRjaFN0b3AoUmVtb3RlVXNlckluZm8gY2FsbGVyKSB7CisgICAgICAgIHBvc3RUb0NhbGxiYWNrKGNhbGxlciwgQ2FsbGJhY2tNZXNzYWdlSGFuZGxlci5NU0dfU1RPUCwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoTmV4dChSZW1vdGVVc2VySW5mbyBjYWxsZXIpIHsKKyAgICAgICAgcG9zdFRvQ2FsbGJhY2soY2FsbGVyLCBDYWxsYmFja01lc3NhZ2VIYW5kbGVyLk1TR19ORVhULCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hQcmV2aW91cyhSZW1vdGVVc2VySW5mbyBjYWxsZXIpIHsKKyAgICAgICAgcG9zdFRvQ2FsbGJhY2soY2FsbGVyLCBDYWxsYmFja01lc3NhZ2VIYW5kbGVyLk1TR19QUkVWSU9VUywgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoRmFzdEZvcndhcmQoUmVtb3RlVXNlckluZm8gY2FsbGVyKSB7CisgICAgICAgIHBvc3RUb0NhbGxiYWNrKGNhbGxlciwgQ2FsbGJhY2tNZXNzYWdlSGFuZGxlci5NU0dfRkFTVF9GT1JXQVJELCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hSZXdpbmQoUmVtb3RlVXNlckluZm8gY2FsbGVyKSB7CisgICAgICAgIHBvc3RUb0NhbGxiYWNrKGNhbGxlciwgQ2FsbGJhY2tNZXNzYWdlSGFuZGxlci5NU0dfUkVXSU5ELCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hTZWVrVG8oUmVtb3RlVXNlckluZm8gY2FsbGVyLCBsb25nIHBvcykgeworICAgICAgICBwb3N0VG9DYWxsYmFjayhjYWxsZXIsIENhbGxiYWNrTWVzc2FnZUhhbmRsZXIuTVNHX1NFRUtfVE8sIHBvcywgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoUmF0ZShSZW1vdGVVc2VySW5mbyBjYWxsZXIsIFJhdGluZyByYXRpbmcpIHsKKyAgICAgICAgcG9zdFRvQ2FsbGJhY2soY2FsbGVyLCBDYWxsYmFja01lc3NhZ2VIYW5kbGVyLk1TR19SQVRFLCByYXRpbmcsIG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkaXNwYXRjaEN1c3RvbUFjdGlvbihSZW1vdGVVc2VySW5mbyBjYWxsZXIsIFN0cmluZyBhY3Rpb24sIEJ1bmRsZSBhcmdzKSB7CisgICAgICAgIHBvc3RUb0NhbGxiYWNrKGNhbGxlciwgQ2FsbGJhY2tNZXNzYWdlSGFuZGxlci5NU0dfQ1VTVE9NX0FDVElPTiwgYWN0aW9uLCBhcmdzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hNZWRpYUJ1dHRvbihSZW1vdGVVc2VySW5mbyBjYWxsZXIsIEludGVudCBtZWRpYUJ1dHRvbkludGVudCkgeworICAgICAgICBwb3N0VG9DYWxsYmFjayhjYWxsZXIsIENhbGxiYWNrTWVzc2FnZUhhbmRsZXIuTVNHX01FRElBX0JVVFRPTiwgbWVkaWFCdXR0b25JbnRlbnQsIG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkaXNwYXRjaE1lZGlhQnV0dG9uRGVsYXllZChSZW1vdGVVc2VySW5mbyBpbmZvLCBJbnRlbnQgbWVkaWFCdXR0b25JbnRlbnQsCisgICAgICAgICAgICBsb25nIGRlbGF5KSB7CisgICAgICAgIHBvc3RUb0NhbGxiYWNrRGVsYXllZChpbmZvLCBDYWxsYmFja01lc3NhZ2VIYW5kbGVyLk1TR19QTEFZX1BBVVNFX0tFWV9ET1VCTEVfVEFQX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgbWVkaWFCdXR0b25JbnRlbnQsIG51bGwsIGRlbGF5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hBZGp1c3RWb2x1bWUoUmVtb3RlVXNlckluZm8gY2FsbGVyLCBpbnQgZGlyZWN0aW9uKSB7CisgICAgICAgIHBvc3RUb0NhbGxiYWNrKGNhbGxlciwgQ2FsbGJhY2tNZXNzYWdlSGFuZGxlci5NU0dfQURKVVNUX1ZPTFVNRSwgZGlyZWN0aW9uLCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hTZXRWb2x1bWVUbyhSZW1vdGVVc2VySW5mbyBjYWxsZXIsIGludCB2b2x1bWUpIHsKKyAgICAgICAgcG9zdFRvQ2FsbGJhY2soY2FsbGVyLCBDYWxsYmFja01lc3NhZ2VIYW5kbGVyLk1TR19TRVRfVk9MVU1FLCB2b2x1bWUsIG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkaXNwYXRjaENvbW1hbmQoUmVtb3RlVXNlckluZm8gY2FsbGVyLCBTdHJpbmcgY29tbWFuZCwgQnVuZGxlIGFyZ3MsCisgICAgICAgICAgICBSZXN1bHRSZWNlaXZlciByZXN1bHRDYikgeworICAgICAgICBDb21tYW5kIGNtZCA9IG5ldyBDb21tYW5kKGNvbW1hbmQsIGFyZ3MsIHJlc3VsdENiKTsKKyAgICAgICAgcG9zdFRvQ2FsbGJhY2soY2FsbGVyLCBDYWxsYmFja01lc3NhZ2VIYW5kbGVyLk1TR19DT01NQU5ELCBjbWQsIG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwb3N0VG9DYWxsYmFjayhSZW1vdGVVc2VySW5mbyBjYWxsZXIsIGludCB3aGF0LCBPYmplY3Qgb2JqLCBCdW5kbGUgZGF0YSkgeworICAgICAgICBwb3N0VG9DYWxsYmFja0RlbGF5ZWQoY2FsbGVyLCB3aGF0LCBvYmosIGRhdGEsIDApOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwb3N0VG9DYWxsYmFja0RlbGF5ZWQoUmVtb3RlVXNlckluZm8gY2FsbGVyLCBpbnQgd2hhdCwgT2JqZWN0IG9iaiwgQnVuZGxlIGRhdGEsCisgICAgICAgICAgICBsb25nIGRlbGF5KSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1DYWxsYmFjay5wb3N0KGNhbGxlciwgd2hhdCwgb2JqLCBkYXRhLCBkZWxheSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGNvbnNpZGVyZWQgYW4gYWN0aXZlIHBsYXliYWNrIHN0YXRlLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBY3RpdmVTdGF0ZShpbnQgc3RhdGUpIHsKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBQbGF5YmFja1N0YXRlLlNUQVRFX0ZBU1RfRk9SV0FSRElORzoKKyAgICAgICAgICAgIGNhc2UgUGxheWJhY2tTdGF0ZS5TVEFURV9SRVdJTkRJTkc6CisgICAgICAgICAgICBjYXNlIFBsYXliYWNrU3RhdGUuU1RBVEVfU0tJUFBJTkdfVE9fUFJFVklPVVM6CisgICAgICAgICAgICBjYXNlIFBsYXliYWNrU3RhdGUuU1RBVEVfU0tJUFBJTkdfVE9fTkVYVDoKKyAgICAgICAgICAgIGNhc2UgUGxheWJhY2tTdGF0ZS5TVEFURV9CVUZGRVJJTkc6CisgICAgICAgICAgICBjYXNlIFBsYXliYWNrU3RhdGUuU1RBVEVfQ09OTkVDVElORzoKKyAgICAgICAgICAgIGNhc2UgUGxheWJhY2tTdGF0ZS5TVEFURV9QTEFZSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGFuIG9uZ29pbmcgc2Vzc2lvbi4gVGhpcyBtYXkgYmUgcGFzc2VkIHRvIGFwcHMgYnkgdGhlIHNlc3Npb24KKyAgICAgKiBvd25lciB0byBhbGxvdyB0aGVtIHRvIGNyZWF0ZSBhIHtAbGluayBNZWRpYUNvbnRyb2xsZXJ9IHRvIGNvbW11bmljYXRlIHdpdGgKKyAgICAgKiB0aGUgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFRva2VuIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisKKyAgICAgICAgcHJpdmF0ZSBJU2Vzc2lvbkNvbnRyb2xsZXIgbUJpbmRlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBUb2tlbihJU2Vzc2lvbkNvbnRyb2xsZXIgYmluZGVyKSB7CisgICAgICAgICAgICBtQmluZGVyID0gYmluZGVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICAgICAgZGVzdC53cml0ZVN0cm9uZ0JpbmRlcihtQmluZGVyLmFzQmluZGVyKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgcHJpbWUgPSAzMTsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSAxOworICAgICAgICAgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKG1CaW5kZXIgPT0gbnVsbCkgPyAwIDogbUJpbmRlci5hc0JpbmRlcigpLmhhc2hDb2RlKCkpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgaWYgKHRoaXMgPT0gb2JqKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIFRva2VuIG90aGVyID0gKFRva2VuKSBvYmo7CisgICAgICAgICAgICBpZiAobUJpbmRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKG90aGVyLm1CaW5kZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIGlmICghbUJpbmRlci5hc0JpbmRlcigpLmVxdWFscyhvdGhlci5tQmluZGVyLmFzQmluZGVyKCkpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgSVNlc3Npb25Db250cm9sbGVyIGdldEJpbmRlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBtQmluZGVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8VG9rZW4+IENSRUFUT1IKKyAgICAgICAgICAgICAgICA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8VG9rZW4+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgVG9rZW4gY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKElTZXNzaW9uQ29udHJvbGxlci5TdHViLmFzSW50ZXJmYWNlKGluLnJlYWRTdHJvbmdCaW5kZXIoKSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBUb2tlbltdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbltzaXplXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWNlaXZlcyBtZWRpYSBidXR0b25zLCB0cmFuc3BvcnQgY29udHJvbHMsIGFuZCBjb21tYW5kcyBmcm9tIGNvbnRyb2xsZXJzCisgICAgICogYW5kIHRoZSBzeXN0ZW0uIEEgY2FsbGJhY2sgbWF5IGJlIHNldCB1c2luZyB7QGxpbmsgI3NldENhbGxiYWNrfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIENhbGxiYWNrIHsKKworICAgICAgICBwcml2YXRlIE1lZGlhU2Vzc2lvbiBtU2Vzc2lvbjsKKyAgICAgICAgcHJpdmF0ZSBDYWxsYmFja01lc3NhZ2VIYW5kbGVyIG1IYW5kbGVyOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbU1lZGlhUGxheVBhdXNlS2V5UGVuZGluZzsKKworICAgICAgICBwdWJsaWMgQ2FsbGJhY2soKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBjb250cm9sbGVyIGhhcyBzZW50IGEgY29tbWFuZCB0byB0aGlzIHNlc3Npb24uCisgICAgICAgICAqIFRoZSBvd25lciBvZiB0aGUgc2Vzc2lvbiBtYXkgaGFuZGxlIGN1c3RvbSBjb21tYW5kcyBidXQgaXMgbm90CisgICAgICAgICAqIHJlcXVpcmVkIHRvLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29tbWFuZCBUaGUgY29tbWFuZCBuYW1lLgorICAgICAgICAgKiBAcGFyYW0gYXJncyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciB0aGUgY29tbWFuZCwgbWF5IGJlIG51bGwuCisgICAgICAgICAqIEBwYXJhbSBjYiBBIHJlc3VsdCByZWNlaXZlciB0byB3aGljaCBhIHJlc3VsdCBtYXkgYmUgc2VudCBieSB0aGUgY29tbWFuZCwgbWF5IGJlIG51bGwuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbW1hbmQoQE5vbk51bGwgU3RyaW5nIGNvbW1hbmQsIEBOdWxsYWJsZSBCdW5kbGUgYXJncywKKyAgICAgICAgICAgICAgICBATnVsbGFibGUgUmVzdWx0UmVjZWl2ZXIgY2IpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIGJ1dHRvbiBpcyBwcmVzc2VkIGFuZCB0aGlzIHNlc3Npb24gaGFzIHRoZQorICAgICAgICAgKiBoaWdoZXN0IHByaW9yaXR5IG9yIGEgY29udHJvbGxlciBzZW5kcyBhIG1lZGlhIGJ1dHRvbiBldmVudCB0byB0aGUKKyAgICAgICAgICogc2Vzc2lvbi4gVGhlIGRlZmF1bHQgYmVoYXZpb3Igd2lsbCBjYWxsIHRoZSByZWxldmFudCBtZXRob2QgaWYgdGhlCisgICAgICAgICAqIGFjdGlvbiBmb3IgaXQgd2FzIHNldC4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBpbnRlbnQgd2lsbCBiZSBvZiB0eXBlIHtAbGluayBJbnRlbnQjQUNUSU9OX01FRElBX0JVVFRPTn0gd2l0aCBhCisgICAgICAgICAqIEtleUV2ZW50IGluIHtAbGluayBJbnRlbnQjRVhUUkFfS0VZX0VWRU5UfQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWVkaWFCdXR0b25JbnRlbnQgYW4gaW50ZW50IGNvbnRhaW5pbmcgdGhlIEtleUV2ZW50IGFzIGFuCisgICAgICAgICAqICAgICAgICAgICAgZXh0cmEKKyAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBldmVudCB3YXMgaGFuZGxlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25NZWRpYUJ1dHRvbkV2ZW50KEBOb25OdWxsIEludGVudCBtZWRpYUJ1dHRvbkludGVudCkgeworICAgICAgICAgICAgaWYgKG1TZXNzaW9uICE9IG51bGwgJiYgbUhhbmRsZXIgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiBJbnRlbnQuQUNUSU9OX01FRElBX0JVVFRPTi5lcXVhbHMobWVkaWFCdXR0b25JbnRlbnQuZ2V0QWN0aW9uKCkpKSB7CisgICAgICAgICAgICAgICAgS2V5RXZlbnQga2UgPSBtZWRpYUJ1dHRvbkludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoSW50ZW50LkVYVFJBX0tFWV9FVkVOVCk7CisgICAgICAgICAgICAgICAgaWYgKGtlICE9IG51bGwgJiYga2UuZ2V0QWN0aW9uKCkgPT0gS2V5RXZlbnQuQUNUSU9OX0RPV04pIHsKKyAgICAgICAgICAgICAgICAgICAgUGxheWJhY2tTdGF0ZSBzdGF0ZSA9IG1TZXNzaW9uLm1QbGF5YmFja1N0YXRlOworICAgICAgICAgICAgICAgICAgICBsb25nIHZhbGlkQWN0aW9ucyA9IHN0YXRlID09IG51bGwgPyAwIDogc3RhdGUuZ2V0QWN0aW9ucygpOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGtlLmdldEtleUNvZGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX01FRElBX1BMQVlfUEFVU0U6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfSEVBRFNFVEhPT0s6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtlLmdldFJlcGVhdENvdW50KCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnNpZGVyIGxvbmctcHJlc3MgYXMgYSBzaW5nbGUgdGFwLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVNZWRpYVBsYXlQYXVzZUtleVNpbmdsZVRhcElmUGVuZGluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobU1lZGlhUGxheVBhdXNlS2V5UGVuZGluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zaWRlciBkb3VibGUgdGFwIGFzIHRoZSBuZXh0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhDYWxsYmFja01lc3NhZ2VIYW5kbGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLk1TR19QTEFZX1BBVVNFX0tFWV9ET1VCTEVfVEFQX1RJTUVPVVQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFQbGF5UGF1c2VLZXlQZW5kaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodmFsaWRBY3Rpb25zICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fU0tJUF9UT19ORVhUKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblNraXBUb05leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVBsYXlQYXVzZUtleVBlbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbi5kaXNwYXRjaE1lZGlhQnV0dG9uRGVsYXllZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbi5nZXRDdXJyZW50Q29udHJvbGxlckluZm8oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUJ1dHRvbkludGVudCwgVmlld0NvbmZpZ3VyYXRpb24uZ2V0RG91YmxlVGFwVGltZW91dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGFub3RoZXIga2V5IGlzIHByZXNzZWQgd2l0aGluIGRvdWJsZSB0YXAgdGltZW91dCwgY29uc2lkZXIgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVuZGluZyBwbGF5L3BhdXNlIGFzIGEgc2luZ2xlIHRhcCB0byBoYW5kbGUgbWVkaWEga2V5cyBpbiBvcmRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVNZWRpYVBsYXlQYXVzZUtleVNpbmdsZVRhcElmUGVuZGluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChrZS5nZXRLZXlDb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9NRURJQV9QTEFZOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodmFsaWRBY3Rpb25zICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUExBWSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblBsYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX01FRElBX1BBVVNFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodmFsaWRBY3Rpb25zICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUEFVU0UpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25QYXVzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfTUVESUFfTkVYVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHZhbGlkQWN0aW9ucyAmIFBsYXliYWNrU3RhdGUuQUNUSU9OX1NLSVBfVE9fTkVYVCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblNraXBUb05leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX01FRElBX1BSRVZJT1VTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodmFsaWRBY3Rpb25zICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fU0tJUF9UT19QUkVWSU9VUykgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblNraXBUb1ByZXZpb3VzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9NRURJQV9TVE9QOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodmFsaWRBY3Rpb25zICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fU1RPUCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblN0b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX01FRElBX0ZBU1RfRk9SV0FSRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHZhbGlkQWN0aW9ucyAmIFBsYXliYWNrU3RhdGUuQUNUSU9OX0ZBU1RfRk9SV0FSRCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkZhc3RGb3J3YXJkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9NRURJQV9SRVdJTkQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh2YWxpZEFjdGlvbnMgJiBQbGF5YmFja1N0YXRlLkFDVElPTl9SRVdJTkQpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25SZXdpbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZU1lZGlhUGxheVBhdXNlS2V5U2luZ2xlVGFwSWZQZW5kaW5nKCkgeworICAgICAgICAgICAgaWYgKCFtTWVkaWFQbGF5UGF1c2VLZXlQZW5kaW5nKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU1lZGlhUGxheVBhdXNlS2V5UGVuZGluZyA9IGZhbHNlOworICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoQ2FsbGJhY2tNZXNzYWdlSGFuZGxlci5NU0dfUExBWV9QQVVTRV9LRVlfRE9VQkxFX1RBUF9USU1FT1VUKTsKKyAgICAgICAgICAgIFBsYXliYWNrU3RhdGUgc3RhdGUgPSBtU2Vzc2lvbi5tUGxheWJhY2tTdGF0ZTsKKyAgICAgICAgICAgIGxvbmcgdmFsaWRBY3Rpb25zID0gc3RhdGUgPT0gbnVsbCA/IDAgOiBzdGF0ZS5nZXRBY3Rpb25zKCk7CisgICAgICAgICAgICBib29sZWFuIGlzUGxheWluZyA9IHN0YXRlICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgc3RhdGUuZ2V0U3RhdGUoKSA9PSBQbGF5YmFja1N0YXRlLlNUQVRFX1BMQVlJTkc7CisgICAgICAgICAgICBib29sZWFuIGNhblBsYXkgPSAodmFsaWRBY3Rpb25zICYgKFBsYXliYWNrU3RhdGUuQUNUSU9OX1BMQVlfUEFVU0UKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUExBWSkpICE9IDA7CisgICAgICAgICAgICBib29sZWFuIGNhblBhdXNlID0gKHZhbGlkQWN0aW9ucyAmIChQbGF5YmFja1N0YXRlLkFDVElPTl9QTEFZX1BBVVNFCisgICAgICAgICAgICAgICAgICAgICAgICB8IFBsYXliYWNrU3RhdGUuQUNUSU9OX1BBVVNFKSkgIT0gMDsKKyAgICAgICAgICAgIGlmIChpc1BsYXlpbmcgJiYgY2FuUGF1c2UpIHsKKyAgICAgICAgICAgICAgICBvblBhdXNlKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc1BsYXlpbmcgJiYgY2FuUGxheSkgeworICAgICAgICAgICAgICAgIG9uUGxheSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE92ZXJyaWRlIHRvIGhhbmRsZSByZXF1ZXN0cyB0byBwcmVwYXJlIHBsYXliYWNrLiBEdXJpbmcgdGhlIHByZXBhcmF0aW9uLCBhIHNlc3Npb24gc2hvdWxkCisgICAgICAgICAqIG5vdCBob2xkIGF1ZGlvIGZvY3VzIGluIG9yZGVyIHRvIGFsbG93IG90aGVyIHNlc3Npb25zIHBsYXkgc2VhbWxlc3NseS4gVGhlIHN0YXRlIG9mCisgICAgICAgICAqIHBsYXliYWNrIHNob3VsZCBiZSB1cGRhdGVkIHRvIHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX1BBVVNFRH0gYWZ0ZXIgdGhlIHByZXBhcmF0aW9uIGlzCisgICAgICAgICAqIGRvbmUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblByZXBhcmUoKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogT3ZlcnJpZGUgdG8gaGFuZGxlIHJlcXVlc3RzIHRvIHByZXBhcmUgZm9yIHBsYXlpbmcgYSBzcGVjaWZpYyBtZWRpYUlkIHRoYXQgd2FzIHByb3ZpZGVkCisgICAgICAgICAqIGJ5IHlvdXIgYXBwJ3Mge0BsaW5rIE1lZGlhQnJvd3NlclNlcnZpY2V9LiBEdXJpbmcgdGhlIHByZXBhcmF0aW9uLCBhIHNlc3Npb24gc2hvdWxkIG5vdAorICAgICAgICAgKiBob2xkIGF1ZGlvIGZvY3VzIGluIG9yZGVyIHRvIGFsbG93IG90aGVyIHNlc3Npb25zIHBsYXkgc2VhbWxlc3NseS4gVGhlIHN0YXRlIG9mIHBsYXliYWNrCisgICAgICAgICAqIHNob3VsZCBiZSB1cGRhdGVkIHRvIHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX1BBVVNFRH0gYWZ0ZXIgdGhlIHByZXBhcmF0aW9uIGlzIGRvbmUuCisgICAgICAgICAqIFRoZSBwbGF5YmFjayBvZiB0aGUgcHJlcGFyZWQgY29udGVudCBzaG91bGQgc3RhcnQgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mCisgICAgICAgICAqIHtAbGluayAjb25QbGF5fS4gT3ZlcnJpZGUge0BsaW5rICNvblBsYXlGcm9tTWVkaWFJZH0gdG8gaGFuZGxlIHJlcXVlc3RzIGZvciBzdGFydGluZworICAgICAgICAgKiBwbGF5YmFjayB3aXRob3V0IHByZXBhcmF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25QcmVwYXJlRnJvbU1lZGlhSWQoU3RyaW5nIG1lZGlhSWQsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBPdmVycmlkZSB0byBoYW5kbGUgcmVxdWVzdHMgdG8gcHJlcGFyZSBwbGF5YmFjayBmcm9tIGEgc2VhcmNoIHF1ZXJ5LiBBbiBlbXB0eSBxdWVyeQorICAgICAgICAgKiBpbmRpY2F0ZXMgdGhhdCB0aGUgYXBwIG1heSBwcmVwYXJlIGFueSBtdXNpYy4gVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBhdHRlbXB0IHRvIG1ha2UgYQorICAgICAgICAgKiBzbWFydCBjaG9pY2UgYWJvdXQgd2hhdCB0byBwbGF5LiBEdXJpbmcgdGhlIHByZXBhcmF0aW9uLCBhIHNlc3Npb24gc2hvdWxkIG5vdCBob2xkIGF1ZGlvCisgICAgICAgICAqIGZvY3VzIGluIG9yZGVyIHRvIGFsbG93IG90aGVyIHNlc3Npb25zIHBsYXkgc2VhbWxlc3NseS4gVGhlIHN0YXRlIG9mIHBsYXliYWNrIHNob3VsZCBiZQorICAgICAgICAgKiB1cGRhdGVkIHRvIHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX1BBVVNFRH0gYWZ0ZXIgdGhlIHByZXBhcmF0aW9uIGlzIGRvbmUuIFRoZSBwbGF5YmFjaworICAgICAgICAgKiBvZiB0aGUgcHJlcGFyZWQgY29udGVudCBzaG91bGQgc3RhcnQgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayAjb25QbGF5fS4gT3ZlcnJpZGUKKyAgICAgICAgICoge0BsaW5rICNvblBsYXlGcm9tU2VhcmNofSB0byBoYW5kbGUgcmVxdWVzdHMgZm9yIHN0YXJ0aW5nIHBsYXliYWNrIHdpdGhvdXQgcHJlcGFyYXRpb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblByZXBhcmVGcm9tU2VhcmNoKFN0cmluZyBxdWVyeSwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE92ZXJyaWRlIHRvIGhhbmRsZSByZXF1ZXN0cyB0byBwcmVwYXJlIGEgc3BlY2lmaWMgbWVkaWEgaXRlbSByZXByZXNlbnRlZCBieSBhIFVSSS4KKyAgICAgICAgICogRHVyaW5nIHRoZSBwcmVwYXJhdGlvbiwgYSBzZXNzaW9uIHNob3VsZCBub3QgaG9sZCBhdWRpbyBmb2N1cyBpbiBvcmRlciB0byBhbGxvdworICAgICAgICAgKiBvdGhlciBzZXNzaW9ucyBwbGF5IHNlYW1sZXNzbHkuIFRoZSBzdGF0ZSBvZiBwbGF5YmFjayBzaG91bGQgYmUgdXBkYXRlZCB0bworICAgICAgICAgKiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9QQVVTRUR9IGFmdGVyIHRoZSBwcmVwYXJhdGlvbiBpcyBkb25lLgorICAgICAgICAgKiBUaGUgcGxheWJhY2sgb2YgdGhlIHByZXBhcmVkIGNvbnRlbnQgc2hvdWxkIHN0YXJ0IGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZgorICAgICAgICAgKiB7QGxpbmsgI29uUGxheX0uIE92ZXJyaWRlIHtAbGluayAjb25QbGF5RnJvbVVyaX0gdG8gaGFuZGxlIHJlcXVlc3RzCisgICAgICAgICAqIGZvciBzdGFydGluZyBwbGF5YmFjayB3aXRob3V0IHByZXBhcmF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25QcmVwYXJlRnJvbVVyaShVcmkgdXJpLCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogT3ZlcnJpZGUgdG8gaGFuZGxlIHJlcXVlc3RzIHRvIGJlZ2luIHBsYXliYWNrLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25QbGF5KCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE92ZXJyaWRlIHRvIGhhbmRsZSByZXF1ZXN0cyB0byBiZWdpbiBwbGF5YmFjayBmcm9tIGEgc2VhcmNoIHF1ZXJ5LiBBbgorICAgICAgICAgKiBlbXB0eSBxdWVyeSBpbmRpY2F0ZXMgdGhhdCB0aGUgYXBwIG1heSBwbGF5IGFueSBtdXNpYy4gVGhlCisgICAgICAgICAqIGltcGxlbWVudGF0aW9uIHNob3VsZCBhdHRlbXB0IHRvIG1ha2UgYSBzbWFydCBjaG9pY2UgYWJvdXQgd2hhdCB0bworICAgICAgICAgKiBwbGF5LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25QbGF5RnJvbVNlYXJjaChTdHJpbmcgcXVlcnksIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBPdmVycmlkZSB0byBoYW5kbGUgcmVxdWVzdHMgdG8gcGxheSBhIHNwZWNpZmljIG1lZGlhSWQgdGhhdCB3YXMKKyAgICAgICAgICogcHJvdmlkZWQgYnkgeW91ciBhcHAncyB7QGxpbmsgTWVkaWFCcm93c2VyU2VydmljZX0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXlGcm9tTWVkaWFJZChTdHJpbmcgbWVkaWFJZCwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE92ZXJyaWRlIHRvIGhhbmRsZSByZXF1ZXN0cyB0byBwbGF5IGEgc3BlY2lmaWMgbWVkaWEgaXRlbSByZXByZXNlbnRlZCBieSBhIFVSSS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheUZyb21VcmkoVXJpIHVyaSwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE92ZXJyaWRlIHRvIGhhbmRsZSByZXF1ZXN0cyB0byBwbGF5IGFuIGl0ZW0gd2l0aCBhIGdpdmVuIGlkIGZyb20gdGhlCisgICAgICAgICAqIHBsYXkgcXVldWUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblNraXBUb1F1ZXVlSXRlbShsb25nIGlkKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogT3ZlcnJpZGUgdG8gaGFuZGxlIHJlcXVlc3RzIHRvIHBhdXNlIHBsYXliYWNrLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBPdmVycmlkZSB0byBoYW5kbGUgcmVxdWVzdHMgdG8gc2tpcCB0byB0aGUgbmV4dCBtZWRpYSBpdGVtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25Ta2lwVG9OZXh0KCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE92ZXJyaWRlIHRvIGhhbmRsZSByZXF1ZXN0cyB0byBza2lwIHRvIHRoZSBwcmV2aW91cyBtZWRpYSBpdGVtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25Ta2lwVG9QcmV2aW91cygpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBPdmVycmlkZSB0byBoYW5kbGUgcmVxdWVzdHMgdG8gZmFzdCBmb3J3YXJkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25GYXN0Rm9yd2FyZCgpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBPdmVycmlkZSB0byBoYW5kbGUgcmVxdWVzdHMgdG8gcmV3aW5kLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25SZXdpbmQoKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogT3ZlcnJpZGUgdG8gaGFuZGxlIHJlcXVlc3RzIHRvIHN0b3AgcGxheWJhY2suCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogT3ZlcnJpZGUgdG8gaGFuZGxlIHJlcXVlc3RzIHRvIHNlZWsgdG8gYSBzcGVjaWZpYyBwb3NpdGlvbiBpbiBtcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBvcyBOZXcgcG9zaXRpb24gdG8gbW92ZSB0bywgaW4gbWlsbGlzZWNvbmRzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25TZWVrVG8obG9uZyBwb3MpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBPdmVycmlkZSB0byBoYW5kbGUgdGhlIGl0ZW0gYmVpbmcgcmF0ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByYXRpbmcKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2V0UmF0aW5nKEBOb25OdWxsIFJhdGluZyByYXRpbmcpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIHtAbGluayBNZWRpYUNvbnRyb2xsZXJ9IHdhbnRzIGEge0BsaW5rIFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9ufSB0byBiZQorICAgICAgICAgKiBwZXJmb3JtZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhY3Rpb24gVGhlIGFjdGlvbiB0aGF0IHdhcyBvcmlnaW5hbGx5IHNlbnQgaW4gdGhlCisgICAgICAgICAqICAgICAgICAgICAgICAge0BsaW5rIFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9ufS4KKyAgICAgICAgICogQHBhcmFtIGV4dHJhcyBPcHRpb25hbCBleHRyYXMgc3BlY2lmaWVkIGJ5IHRoZSB7QGxpbmsgTWVkaWFDb250cm9sbGVyfS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ3VzdG9tQWN0aW9uKEBOb25OdWxsIFN0cmluZyBhY3Rpb24sIEBOdWxsYWJsZSBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2FsbGJhY2tTdHViIGV4dGVuZHMgSVNlc3Npb25DYWxsYmFjay5TdHViIHsKKyAgICAgICAgcHJpdmF0ZSBXZWFrUmVmZXJlbmNlPE1lZGlhU2Vzc2lvbj4gbU1lZGlhU2Vzc2lvbjsKKworICAgICAgICBwdWJsaWMgQ2FsbGJhY2tTdHViKE1lZGlhU2Vzc2lvbiBzZXNzaW9uKSB7CisgICAgICAgICAgICBtTWVkaWFTZXNzaW9uID0gbmV3IFdlYWtSZWZlcmVuY2U8PihzZXNzaW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFJlbW90ZVVzZXJJbmZvIGNyZWF0ZVJlbW90ZVVzZXJJbmZvKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwKKyAgICAgICAgICAgICAgICBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVtb3RlVXNlckluZm8ocGFja2FnZU5hbWUsIHBpZCwgdWlkLAorICAgICAgICAgICAgICAgICAgICBjYWxsZXIgIT0gbnVsbCA/IGNhbGxlci5hc0JpbmRlcigpIDogbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Db21tYW5kKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwKKyAgICAgICAgICAgICAgICBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsIFN0cmluZyBjb21tYW5kLCBCdW5kbGUgYXJncywgUmVzdWx0UmVjZWl2ZXIgY2IpIHsKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvbiBzZXNzaW9uID0gbU1lZGlhU2Vzc2lvbi5nZXQoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmRpc3BhdGNoQ29tbWFuZChjcmVhdGVSZW1vdGVVc2VySW5mbyhwYWNrYWdlTmFtZSwgcGlkLCB1aWQsIGNhbGxlciksCisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLCBhcmdzLCBjYik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25NZWRpYUJ1dHRvbihTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsIEludGVudCBtZWRpYUJ1dHRvbkludGVudCwKKyAgICAgICAgICAgICAgICBpbnQgc2VxdWVuY2VOdW1iZXIsIFJlc3VsdFJlY2VpdmVyIGNiKSB7CisgICAgICAgICAgICBNZWRpYVNlc3Npb24gc2Vzc2lvbiA9IG1NZWRpYVNlc3Npb24uZ2V0KCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5kaXNwYXRjaE1lZGlhQnV0dG9uKGNyZWF0ZVJlbW90ZVVzZXJJbmZvKHBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgbnVsbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFCdXR0b25JbnRlbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKGNiICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY2Iuc2VuZChzZXF1ZW5jZU51bWJlciwgbnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uTWVkaWFCdXR0b25Gcm9tQ29udHJvbGxlcihTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsCisgICAgICAgICAgICAgICAgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLCBJbnRlbnQgbWVkaWFCdXR0b25JbnRlbnQpIHsKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvbiBzZXNzaW9uID0gbU1lZGlhU2Vzc2lvbi5nZXQoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmRpc3BhdGNoTWVkaWFCdXR0b24oY3JlYXRlUmVtb3RlVXNlckluZm8ocGFja2FnZU5hbWUsIHBpZCwgdWlkLCBjYWxsZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFCdXR0b25JbnRlbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJlcGFyZShTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsCisgICAgICAgICAgICAgICAgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyKSB7CisgICAgICAgICAgICBNZWRpYVNlc3Npb24gc2Vzc2lvbiA9IG1NZWRpYVNlc3Npb24uZ2V0KCk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5kaXNwYXRjaFByZXBhcmUoY3JlYXRlUmVtb3RlVXNlckluZm8ocGFja2FnZU5hbWUsIHBpZCwgdWlkLCBjYWxsZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblByZXBhcmVGcm9tTWVkaWFJZChTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsCisgICAgICAgICAgICAgICAgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLCBTdHJpbmcgbWVkaWFJZCwKKyAgICAgICAgICAgICAgICBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgICAgICBNZWRpYVNlc3Npb24gc2Vzc2lvbiA9IG1NZWRpYVNlc3Npb24uZ2V0KCk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5kaXNwYXRjaFByZXBhcmVGcm9tTWVkaWFJZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVJlbW90ZVVzZXJJbmZvKHBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgY2FsbGVyKSwgbWVkaWFJZCwgZXh0cmFzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblByZXBhcmVGcm9tU2VhcmNoKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwKKyAgICAgICAgICAgICAgICBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsIFN0cmluZyBxdWVyeSwKKyAgICAgICAgICAgICAgICBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgICAgICBNZWRpYVNlc3Npb24gc2Vzc2lvbiA9IG1NZWRpYVNlc3Npb24uZ2V0KCk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5kaXNwYXRjaFByZXBhcmVGcm9tU2VhcmNoKAorICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlUmVtb3RlVXNlckluZm8ocGFja2FnZU5hbWUsIHBpZCwgdWlkLCBjYWxsZXIpLCBxdWVyeSwgZXh0cmFzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblByZXBhcmVGcm9tVXJpKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwKKyAgICAgICAgICAgICAgICBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsIFVyaSB1cmksIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvbiBzZXNzaW9uID0gbU1lZGlhU2Vzc2lvbi5nZXQoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmRpc3BhdGNoUHJlcGFyZUZyb21VcmkoY3JlYXRlUmVtb3RlVXNlckluZm8ocGFja2FnZU5hbWUsIHBpZCwgdWlkLCBjYWxsZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgdXJpLCBleHRyYXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheShTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsCisgICAgICAgICAgICAgICAgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyKSB7CisgICAgICAgICAgICBNZWRpYVNlc3Npb24gc2Vzc2lvbiA9IG1NZWRpYVNlc3Npb24uZ2V0KCk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5kaXNwYXRjaFBsYXkoY3JlYXRlUmVtb3RlVXNlckluZm8ocGFja2FnZU5hbWUsIHBpZCwgdWlkLCBjYWxsZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXlGcm9tTWVkaWFJZChTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsCisgICAgICAgICAgICAgICAgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLCBTdHJpbmcgbWVkaWFJZCwKKyAgICAgICAgICAgICAgICBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgICAgICBNZWRpYVNlc3Npb24gc2Vzc2lvbiA9IG1NZWRpYVNlc3Npb24uZ2V0KCk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5kaXNwYXRjaFBsYXlGcm9tTWVkaWFJZChjcmVhdGVSZW1vdGVVc2VySW5mbyhwYWNrYWdlTmFtZSwgcGlkLCB1aWQsIGNhbGxlciksCisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUlkLCBleHRyYXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheUZyb21TZWFyY2goU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLAorICAgICAgICAgICAgICAgIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwgU3RyaW5nIHF1ZXJ5LAorICAgICAgICAgICAgICAgIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvbiBzZXNzaW9uID0gbU1lZGlhU2Vzc2lvbi5nZXQoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmRpc3BhdGNoUGxheUZyb21TZWFyY2goY3JlYXRlUmVtb3RlVXNlckluZm8ocGFja2FnZU5hbWUsIHBpZCwgdWlkLCBjYWxsZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnksIGV4dHJhcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25QbGF5RnJvbVVyaShTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsCisgICAgICAgICAgICAgICAgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLCBVcmkgdXJpLCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgICAgICBNZWRpYVNlc3Npb24gc2Vzc2lvbiA9IG1NZWRpYVNlc3Npb24uZ2V0KCk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5kaXNwYXRjaFBsYXlGcm9tVXJpKGNyZWF0ZVJlbW90ZVVzZXJJbmZvKHBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgY2FsbGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVyaSwgZXh0cmFzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblNraXBUb1RyYWNrKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwKKyAgICAgICAgICAgICAgICBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsIGxvbmcgaWQpIHsKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvbiBzZXNzaW9uID0gbU1lZGlhU2Vzc2lvbi5nZXQoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmRpc3BhdGNoU2tpcFRvSXRlbShjcmVhdGVSZW1vdGVVc2VySW5mbyhwYWNrYWdlTmFtZSwgcGlkLCB1aWQsIGNhbGxlciksIGlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblBhdXNlKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwKKyAgICAgICAgICAgICAgICBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIpIHsKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvbiBzZXNzaW9uID0gbU1lZGlhU2Vzc2lvbi5nZXQoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmRpc3BhdGNoUGF1c2UoY3JlYXRlUmVtb3RlVXNlckluZm8ocGFja2FnZU5hbWUsIHBpZCwgdWlkLCBjYWxsZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblN0b3AoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLAorICAgICAgICAgICAgICAgIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlcikgeworICAgICAgICAgICAgTWVkaWFTZXNzaW9uIHNlc3Npb24gPSBtTWVkaWFTZXNzaW9uLmdldCgpOworICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlc3Npb24uZGlzcGF0Y2hTdG9wKGNyZWF0ZVJlbW90ZVVzZXJJbmZvKHBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgY2FsbGVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25OZXh0KFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwKKyAgICAgICAgICAgICAgICBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIpIHsKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvbiBzZXNzaW9uID0gbU1lZGlhU2Vzc2lvbi5nZXQoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmRpc3BhdGNoTmV4dChjcmVhdGVSZW1vdGVVc2VySW5mbyhwYWNrYWdlTmFtZSwgcGlkLCB1aWQsIGNhbGxlcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJldmlvdXMoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLAorICAgICAgICAgICAgICAgIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlcikgeworICAgICAgICAgICAgTWVkaWFTZXNzaW9uIHNlc3Npb24gPSBtTWVkaWFTZXNzaW9uLmdldCgpOworICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlc3Npb24uZGlzcGF0Y2hQcmV2aW91cyhjcmVhdGVSZW1vdGVVc2VySW5mbyhwYWNrYWdlTmFtZSwgcGlkLCB1aWQsIGNhbGxlcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRmFzdEZvcndhcmQoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLAorICAgICAgICAgICAgICAgIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlcikgeworICAgICAgICAgICAgTWVkaWFTZXNzaW9uIHNlc3Npb24gPSBtTWVkaWFTZXNzaW9uLmdldCgpOworICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlc3Npb24uZGlzcGF0Y2hGYXN0Rm9yd2FyZChjcmVhdGVSZW1vdGVVc2VySW5mbyhwYWNrYWdlTmFtZSwgcGlkLCB1aWQsIGNhbGxlcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmV3aW5kKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwKKyAgICAgICAgICAgICAgICBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIpIHsKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvbiBzZXNzaW9uID0gbU1lZGlhU2Vzc2lvbi5nZXQoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmRpc3BhdGNoUmV3aW5kKGNyZWF0ZVJlbW90ZVVzZXJJbmZvKHBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgY2FsbGVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TZWVrVG8oU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLAorICAgICAgICAgICAgICAgIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwgbG9uZyBwb3MpIHsKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvbiBzZXNzaW9uID0gbU1lZGlhU2Vzc2lvbi5nZXQoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmRpc3BhdGNoU2Vla1RvKGNyZWF0ZVJlbW90ZVVzZXJJbmZvKHBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgY2FsbGVyKSwgcG9zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJhdGUoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsCisgICAgICAgICAgICAgICAgUmF0aW5nIHJhdGluZykgeworICAgICAgICAgICAgTWVkaWFTZXNzaW9uIHNlc3Npb24gPSBtTWVkaWFTZXNzaW9uLmdldCgpOworICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlc3Npb24uZGlzcGF0Y2hSYXRlKGNyZWF0ZVJlbW90ZVVzZXJJbmZvKHBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgY2FsbGVyKSwgcmF0aW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkN1c3RvbUFjdGlvbihTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsCisgICAgICAgICAgICAgICAgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLCBTdHJpbmcgYWN0aW9uLCBCdW5kbGUgYXJncykgeworICAgICAgICAgICAgTWVkaWFTZXNzaW9uIHNlc3Npb24gPSBtTWVkaWFTZXNzaW9uLmdldCgpOworICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlc3Npb24uZGlzcGF0Y2hDdXN0b21BY3Rpb24oY3JlYXRlUmVtb3RlVXNlckluZm8ocGFja2FnZU5hbWUsIHBpZCwgdWlkLCBjYWxsZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLCBhcmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkFkanVzdFZvbHVtZShTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsCisgICAgICAgICAgICAgICAgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLCBpbnQgZGlyZWN0aW9uKSB7CisgICAgICAgICAgICBNZWRpYVNlc3Npb24gc2Vzc2lvbiA9IG1NZWRpYVNlc3Npb24uZ2V0KCk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5kaXNwYXRjaEFkanVzdFZvbHVtZShjcmVhdGVSZW1vdGVVc2VySW5mbyhwYWNrYWdlTmFtZSwgcGlkLCB1aWQsIGNhbGxlciksCisgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2V0Vm9sdW1lVG8oU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLAorICAgICAgICAgICAgICAgIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwgaW50IHZhbHVlKSB7CisgICAgICAgICAgICBNZWRpYVNlc3Npb24gc2Vzc2lvbiA9IG1NZWRpYVNlc3Npb24uZ2V0KCk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5kaXNwYXRjaFNldFZvbHVtZVRvKGNyZWF0ZVJlbW90ZVVzZXJJbmZvKHBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgY2FsbGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgc2luZ2xlIGl0ZW0gdGhhdCBpcyBwYXJ0IG9mIHRoZSBwbGF5IHF1ZXVlLiBJdCBjb250YWlucyBhIGRlc2NyaXB0aW9uCisgICAgICogb2YgdGhlIGl0ZW0gYW5kIGl0cyBpZCBpbiB0aGUgcXVldWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBRdWV1ZUl0ZW0gaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgaWQgaXMgcmVzZXJ2ZWQuIE5vIGl0ZW1zIGNhbiBiZSBleHBsaWNpdGx5IGFzc2lnbmVkIHRoaXMgaWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTktOT1dOX0lEID0gLTE7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYURlc2NyaXB0aW9uIG1EZXNjcmlwdGlvbjsKKyAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIG1JZDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgbmV3IHtAbGluayBNZWRpYVNlc3Npb24uUXVldWVJdGVtfS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSB7QGxpbmsgTWVkaWFEZXNjcmlwdGlvbn0gZm9yIHRoaXMgaXRlbS4KKyAgICAgICAgICogQHBhcmFtIGlkIEFuIGlkZW50aWZpZXIgZm9yIHRoaXMgaXRlbS4gSXQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZQorICAgICAgICAgKiAgICAgICAgICAgIHBsYXkgcXVldWUgYW5kIGNhbm5vdCBiZSB7QGxpbmsgI1VOS05PV05fSUR9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFF1ZXVlSXRlbShNZWRpYURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBsb25nIGlkKSB7CisgICAgICAgICAgICBpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkRlc2NyaXB0aW9uIGNhbm5vdCBiZSBudWxsLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlkID09IFVOS05PV05fSUQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJZCBjYW5ub3QgYmUgUXVldWVJdGVtLlVOS05PV05fSUQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1EZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICAgICAgICAgICAgbUlkID0gaWQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFF1ZXVlSXRlbShQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIG1EZXNjcmlwdGlvbiA9IE1lZGlhRGVzY3JpcHRpb24uQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGluKTsKKyAgICAgICAgICAgIG1JZCA9IGluLnJlYWRMb25nKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhpcyBpdGVtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE1lZGlhRGVzY3JpcHRpb24gZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gbURlc2NyaXB0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgcXVldWUgaWQgZm9yIHRoaXMgaXRlbS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBsb25nIGdldFF1ZXVlSWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUlkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICAgICAgbURlc2NyaXB0aW9uLndyaXRlVG9QYXJjZWwoZGVzdCwgZmxhZ3MpOworICAgICAgICAgICAgZGVzdC53cml0ZUxvbmcobUlkKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3JlYXRvcjxNZWRpYVNlc3Npb24uUXVldWVJdGVtPiBDUkVBVE9SID0KKyAgICAgICAgICAgICAgICBuZXcgQ3JlYXRvcjxNZWRpYVNlc3Npb24uUXVldWVJdGVtPigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgTWVkaWFTZXNzaW9uLlF1ZXVlSXRlbSBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb24uUXVldWVJdGVtKHApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBNZWRpYVNlc3Npb24uUXVldWVJdGVtW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbi5RdWV1ZUl0ZW1bc2l6ZV07CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIk1lZGlhU2Vzc2lvbi5RdWV1ZUl0ZW0geyIgKworICAgICAgICAgICAgICAgICAgICAiRGVzY3JpcHRpb249IiArIG1EZXNjcmlwdGlvbiArCisgICAgICAgICAgICAgICAgICAgICIsIElkPSIgKyBtSWQgKyAiIH0iOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIFF1ZXVlSXRlbSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIFF1ZXVlSXRlbSBpdGVtID0gKFF1ZXVlSXRlbSkgbzsKKyAgICAgICAgICAgIGlmIChtSWQgIT0gaXRlbS5tSWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghT2JqZWN0cy5lcXVhbHMobURlc2NyaXB0aW9uLCBpdGVtLm1EZXNjcmlwdGlvbikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgQ29tbWFuZCB7CisgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgY29tbWFuZDsKKyAgICAgICAgcHVibGljIGZpbmFsIEJ1bmRsZSBleHRyYXM7CisgICAgICAgIHB1YmxpYyBmaW5hbCBSZXN1bHRSZWNlaXZlciBzdHViOworCisgICAgICAgIHB1YmxpYyBDb21tYW5kKFN0cmluZyBjb21tYW5kLCBCdW5kbGUgZXh0cmFzLCBSZXN1bHRSZWNlaXZlciBzdHViKSB7CisgICAgICAgICAgICB0aGlzLmNvbW1hbmQgPSBjb21tYW5kOworICAgICAgICAgICAgdGhpcy5leHRyYXMgPSBleHRyYXM7CisgICAgICAgICAgICB0aGlzLnN0dWIgPSBzdHViOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBDYWxsYmFja01lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQ09NTUFORCA9IDE7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfTUVESUFfQlVUVE9OID0gMjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19QUkVQQVJFID0gMzsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19QUkVQQVJFX01FRElBX0lEID0gNDsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19QUkVQQVJFX1NFQVJDSCA9IDU7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfUFJFUEFSRV9VUkkgPSA2OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BMQVkgPSA3OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BMQVlfTUVESUFfSUQgPSA4OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BMQVlfU0VBUkNIID0gOTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19QTEFZX1VSSSA9IDEwOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1NLSVBfVE9fSVRFTSA9IDExOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BBVVNFID0gMTI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU1RPUCA9IDEzOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX05FWFQgPSAxNDsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19QUkVWSU9VUyA9IDE1OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0ZBU1RfRk9SV0FSRCA9IDE2OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JFV0lORCA9IDE3OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1NFRUtfVE8gPSAxODsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19SQVRFID0gMTk7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQ1VTVE9NX0FDVElPTiA9IDIwOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0FESlVTVF9WT0xVTUUgPSAyMTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19TRVRfVk9MVU1FID0gMjI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfUExBWV9QQVVTRV9LRVlfRE9VQkxFX1RBUF9USU1FT1VUID0gMjM7CisKKyAgICAgICAgcHJpdmF0ZSBNZWRpYVNlc3Npb24uQ2FsbGJhY2sgbUNhbGxiYWNrOworICAgICAgICBwcml2YXRlIFJlbW90ZVVzZXJJbmZvIG1DdXJyZW50Q29udHJvbGxlckluZm87CisKKyAgICAgICAgcHVibGljIENhbGxiYWNrTWVzc2FnZUhhbmRsZXIoTG9vcGVyIGxvb3BlciwgTWVkaWFTZXNzaW9uLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBzdXBlcihsb29wZXIpOworICAgICAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgICAgICBtQ2FsbGJhY2subUhhbmRsZXIgPSB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcG9zdChSZW1vdGVVc2VySW5mbyBjYWxsZXIsIGludCB3aGF0LCBPYmplY3Qgb2JqLCBCdW5kbGUgZGF0YSwgbG9uZyBkZWxheU1zKSB7CisgICAgICAgICAgICBQYWlyPFJlbW90ZVVzZXJJbmZvLCBPYmplY3Q+IG9ialdpdGhDYWxsZXIgPSBQYWlyLmNyZWF0ZShjYWxsZXIsIG9iaik7CisgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG9idGFpbk1lc3NhZ2Uod2hhdCwgb2JqV2l0aENhbGxlcik7CisgICAgICAgICAgICBtc2cuc2V0QXN5bmNocm9ub3VzKHRydWUpOworICAgICAgICAgICAgbXNnLnNldERhdGEoZGF0YSk7CisgICAgICAgICAgICBpZiAoZGVsYXlNcyA+IDApIHsKKyAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZURlbGF5ZWQobXNnLCBkZWxheU1zKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UobXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBtQ3VycmVudENvbnRyb2xsZXJJbmZvID0gKChQYWlyPFJlbW90ZVVzZXJJbmZvLCBPYmplY3Q+KSBtc2cub2JqKS5maXJzdDsKKworICAgICAgICAgICAgVm9sdW1lUHJvdmlkZXIgdnA7CisgICAgICAgICAgICBPYmplY3Qgb2JqID0gKChQYWlyPFJlbW90ZVVzZXJJbmZvLCBPYmplY3Q+KSBtc2cub2JqKS5zZWNvbmQ7CisKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19DT01NQU5EOgorICAgICAgICAgICAgICAgICAgICBDb21tYW5kIGNtZCA9IChDb21tYW5kKSBvYmo7CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vbkNvbW1hbmQoY21kLmNvbW1hbmQsIGNtZC5leHRyYXMsIGNtZC5zdHViKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfTUVESUFfQlVUVE9OOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25NZWRpYUJ1dHRvbkV2ZW50KChJbnRlbnQpIG9iaik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1BSRVBBUkU6CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vblByZXBhcmUoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfUFJFUEFSRV9NRURJQV9JRDoKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uUHJlcGFyZUZyb21NZWRpYUlkKChTdHJpbmcpIG9iaiwgbXNnLmdldERhdGEoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1BSRVBBUkVfU0VBUkNIOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25QcmVwYXJlRnJvbVNlYXJjaCgoU3RyaW5nKSBvYmosIG1zZy5nZXREYXRhKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19QUkVQQVJFX1VSSToKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uUHJlcGFyZUZyb21VcmkoKFVyaSkgb2JqLCBtc2cuZ2V0RGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfUExBWToKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uUGxheSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19QTEFZX01FRElBX0lEOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25QbGF5RnJvbU1lZGlhSWQoKFN0cmluZykgb2JqLCBtc2cuZ2V0RGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfUExBWV9TRUFSQ0g6CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vblBsYXlGcm9tU2VhcmNoKChTdHJpbmcpIG9iaiwgbXNnLmdldERhdGEoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1BMQVlfVVJJOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25QbGF5RnJvbVVyaSgoVXJpKSBvYmosIG1zZy5nZXREYXRhKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19TS0lQX1RPX0lURU06CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vblNraXBUb1F1ZXVlSXRlbSgoTG9uZykgb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfUEFVU0U6CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vblBhdXNlKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1NUT1A6CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vblN0b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfTkVYVDoKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uU2tpcFRvTmV4dCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19QUkVWSU9VUzoKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uU2tpcFRvUHJldmlvdXMoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfRkFTVF9GT1JXQVJEOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25GYXN0Rm9yd2FyZCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19SRVdJTkQ6CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vblJld2luZCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19TRUVLX1RPOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25TZWVrVG8oKExvbmcpIG9iaik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JBVEU6CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vblNldFJhdGluZygoUmF0aW5nKSBvYmopOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19DVVNUT01fQUNUSU9OOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25DdXN0b21BY3Rpb24oKFN0cmluZykgb2JqLCBtc2cuZ2V0RGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQURKVVNUX1ZPTFVNRToKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgICAgICAgICAgICAgdnAgPSBtVm9sdW1lUHJvdmlkZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHZwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZwLm9uQWRqdXN0Vm9sdW1lKChpbnQpIG9iaik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfU0VUX1ZPTFVNRToKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgICAgICAgICAgICAgdnAgPSBtVm9sdW1lUHJvdmlkZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHZwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZwLm9uU2V0Vm9sdW1lVG8oKGludCkgb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19QTEFZX1BBVVNFX0tFWV9ET1VCTEVfVEFQX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5oYW5kbGVNZWRpYVBsYXlQYXVzZUtleVNpbmdsZVRhcElmUGVuZGluZygpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DdXJyZW50Q29udHJvbGxlckluZm8gPSBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vUGFyY2VsYWJsZVZvbHVtZUluZm8uYWlkbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL1BhcmNlbGFibGVWb2x1bWVJbmZvLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQyNTBmMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL1BhcmNlbGFibGVWb2x1bWVJbmZvLmFpZGwKQEAgLTAsMCArMSwxOCBAQAorLyogQ29weXJpZ2h0IDIwMTQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS5zZXNzaW9uOworCitwYXJjZWxhYmxlIFBhcmNlbGFibGVWb2x1bWVJbmZvOwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vUGFyY2VsYWJsZVZvbHVtZUluZm8uamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL1BhcmNlbGFibGVWb2x1bWVJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU5Yzk3NQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL1BhcmNlbGFibGVWb2x1bWVJbmZvLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyogQ29weXJpZ2h0IDIwMTQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqKgorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqKgorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqKgorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEuc2Vzc2lvbjsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKKworLyoqCisgKiBDb252ZW5pZW5jZSBjbGFzcyBmb3IgcGFzc2luZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYXVkaW8gY29uZmlndXJhdGlvbiBvZiBhCisgKiBzZXNzaW9uLiBUaGUgcHVibGljIGltcGxlbWVudGF0aW9uIGlzIHtAbGluayBNZWRpYUNvbnRyb2xsZXIuUGxheWJhY2tJbmZvfS4KKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgUGFyY2VsYWJsZVZvbHVtZUluZm8gaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICBwdWJsaWMgaW50IHZvbHVtZVR5cGU7CisgICAgcHVibGljIEF1ZGlvQXR0cmlidXRlcyBhdWRpb0F0dHJzOworICAgIHB1YmxpYyBpbnQgY29udHJvbFR5cGU7CisgICAgcHVibGljIGludCBtYXhWb2x1bWU7CisgICAgcHVibGljIGludCBjdXJyZW50Vm9sdW1lOworCisgICAgcHVibGljIFBhcmNlbGFibGVWb2x1bWVJbmZvKGludCB2b2x1bWVUeXBlLCBBdWRpb0F0dHJpYnV0ZXMgYXVkaW9BdHRycywgaW50IGNvbnRyb2xUeXBlLAorICAgICAgICAgICAgaW50IG1heFZvbHVtZSwKKyAgICAgICAgICAgIGludCBjdXJyZW50Vm9sdW1lKSB7CisgICAgICAgIHRoaXMudm9sdW1lVHlwZSA9IHZvbHVtZVR5cGU7CisgICAgICAgIHRoaXMuYXVkaW9BdHRycyA9IGF1ZGlvQXR0cnM7CisgICAgICAgIHRoaXMuY29udHJvbFR5cGUgPSBjb250cm9sVHlwZTsKKyAgICAgICAgdGhpcy5tYXhWb2x1bWUgPSBtYXhWb2x1bWU7CisgICAgICAgIHRoaXMuY3VycmVudFZvbHVtZSA9IGN1cnJlbnRWb2x1bWU7CisgICAgfQorCisgICAgcHVibGljIFBhcmNlbGFibGVWb2x1bWVJbmZvKFBhcmNlbCBmcm9tKSB7CisgICAgICAgIHZvbHVtZVR5cGUgPSBmcm9tLnJlYWRJbnQoKTsKKyAgICAgICAgY29udHJvbFR5cGUgPSBmcm9tLnJlYWRJbnQoKTsKKyAgICAgICAgbWF4Vm9sdW1lID0gZnJvbS5yZWFkSW50KCk7CisgICAgICAgIGN1cnJlbnRWb2x1bWUgPSBmcm9tLnJlYWRJbnQoKTsKKyAgICAgICAgYXVkaW9BdHRycyA9IEF1ZGlvQXR0cmlidXRlcy5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoZnJvbSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgZGVzdC53cml0ZUludCh2b2x1bWVUeXBlKTsKKyAgICAgICAgZGVzdC53cml0ZUludChjb250cm9sVHlwZSk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobWF4Vm9sdW1lKTsKKyAgICAgICAgZGVzdC53cml0ZUludChjdXJyZW50Vm9sdW1lKTsKKyAgICAgICAgYXVkaW9BdHRycy53cml0ZVRvUGFyY2VsKGRlc3QsIGZsYWdzKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPFBhcmNlbGFibGVWb2x1bWVJbmZvPiBDUkVBVE9SCisgICAgICAgICAgICA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8UGFyY2VsYWJsZVZvbHVtZUluZm8+KCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFBhcmNlbGFibGVWb2x1bWVJbmZvIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFBhcmNlbGFibGVWb2x1bWVJbmZvKGluKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUGFyY2VsYWJsZVZvbHVtZUluZm9bXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXJjZWxhYmxlVm9sdW1lSW5mb1tzaXplXTsKKyAgICAgICAgfQorICAgIH07Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9QbGF5YmFja1N0YXRlLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9QbGF5YmFja1N0YXRlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg3NmViZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL1BsYXliYWNrU3RhdGUuYWlkbApAQCAtMCwwICsxLDE4IEBACisvKiBDb3B5cmlnaHQgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnNlc3Npb247CisKK3BhcmNlbGFibGUgUGxheWJhY2tTdGF0ZTsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL1BsYXliYWNrU3RhdGUuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL1BsYXliYWNrU3RhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDRmOWFmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vUGxheWJhY2tTdGF0ZS5qYXZhCkBAIC0wLDAgKzEsMTA4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQubWVkaWEuc2Vzc2lvbjsKKworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5EcmF3YWJsZVJlczsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uSW50RGVmOworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Mb25nRGVmOworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlJlbW90ZUNvbnRyb2xDbGllbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKKworLyoqCisgKiBQbGF5YmFjayBzdGF0ZSBmb3IgYSB7QGxpbmsgTWVkaWFTZXNzaW9ufS4gVGhpcyBpbmNsdWRlcyBhIHN0YXRlIGxpa2UKKyAqIHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX1BMQVlJTkd9LCB0aGUgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbiwKKyAqIGFuZCB0aGUgY3VycmVudCBjb250cm9sIGNhcGFiaWxpdGllcy4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFBsYXliYWNrU3RhdGUgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlBsYXliYWNrU3RhdGUiOworCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBATG9uZ0RlZihmbGFnPXRydWUsIHZhbHVlPXtBQ1RJT05fU1RPUCwgQUNUSU9OX1BBVVNFLCBBQ1RJT05fUExBWSwgQUNUSU9OX1JFV0lORCwKKyAgICAgICAgICAgIEFDVElPTl9TS0lQX1RPX1BSRVZJT1VTLCBBQ1RJT05fU0tJUF9UT19ORVhULCBBQ1RJT05fRkFTVF9GT1JXQVJELCBBQ1RJT05fU0VUX1JBVElORywKKyAgICAgICAgICAgIEFDVElPTl9TRUVLX1RPLCBBQ1RJT05fUExBWV9QQVVTRSwgQUNUSU9OX1BMQVlfRlJPTV9NRURJQV9JRCwgQUNUSU9OX1BMQVlfRlJPTV9TRUFSQ0gsCisgICAgICAgICAgICBBQ1RJT05fU0tJUF9UT19RVUVVRV9JVEVNLCBBQ1RJT05fUExBWV9GUk9NX1VSSSwgQUNUSU9OX1BSRVBBUkUsCisgICAgICAgICAgICBBQ1RJT05fUFJFUEFSRV9GUk9NX01FRElBX0lELCBBQ1RJT05fUFJFUEFSRV9GUk9NX1NFQVJDSCwgQUNUSU9OX1BSRVBBUkVfRlJPTV9VUkl9KQorICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKKyAgICBwdWJsaWMgQGludGVyZmFjZSBBY3Rpb25zIHt9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhpcyBzZXNzaW9uIHN1cHBvcnRzIHRoZSBzdG9wIGNvbW1hbmQuCisgICAgICoKKyAgICAgKiBAc2VlIEJ1aWxkZXIjc2V0QWN0aW9ucyhsb25nKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBBQ1RJT05fU1RPUCA9IDEgPDwgMDsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGlzIHNlc3Npb24gc3VwcG9ydHMgdGhlIHBhdXNlIGNvbW1hbmQuCisgICAgICoKKyAgICAgKiBAc2VlIEJ1aWxkZXIjc2V0QWN0aW9ucyhsb25nKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBBQ1RJT05fUEFVU0UgPSAxIDw8IDE7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhpcyBzZXNzaW9uIHN1cHBvcnRzIHRoZSBwbGF5IGNvbW1hbmQuCisgICAgICoKKyAgICAgKiBAc2VlIEJ1aWxkZXIjc2V0QWN0aW9ucyhsb25nKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBBQ1RJT05fUExBWSA9IDEgPDwgMjsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGlzIHNlc3Npb24gc3VwcG9ydHMgdGhlIHJld2luZCBjb21tYW5kLgorICAgICAqCisgICAgICogQHNlZSBCdWlsZGVyI3NldEFjdGlvbnMobG9uZykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQUNUSU9OX1JFV0lORCA9IDEgPDwgMzsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGlzIHNlc3Npb24gc3VwcG9ydHMgdGhlIHByZXZpb3VzIGNvbW1hbmQuCisgICAgICoKKyAgICAgKiBAc2VlIEJ1aWxkZXIjc2V0QWN0aW9ucyhsb25nKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBBQ1RJT05fU0tJUF9UT19QUkVWSU9VUyA9IDEgPDwgNDsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGlzIHNlc3Npb24gc3VwcG9ydHMgdGhlIG5leHQgY29tbWFuZC4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRBY3Rpb25zKGxvbmcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEFDVElPTl9TS0lQX1RPX05FWFQgPSAxIDw8IDU7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhpcyBzZXNzaW9uIHN1cHBvcnRzIHRoZSBmYXN0IGZvcndhcmQgY29tbWFuZC4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRBY3Rpb25zKGxvbmcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEFDVElPTl9GQVNUX0ZPUldBUkQgPSAxIDw8IDY7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhpcyBzZXNzaW9uIHN1cHBvcnRzIHRoZSBzZXQgcmF0aW5nIGNvbW1hbmQuCisgICAgICoKKyAgICAgKiBAc2VlIEJ1aWxkZXIjc2V0QWN0aW9ucyhsb25nKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBBQ1RJT05fU0VUX1JBVElORyA9IDEgPDwgNzsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGlzIHNlc3Npb24gc3VwcG9ydHMgdGhlIHNlZWsgdG8gY29tbWFuZC4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRBY3Rpb25zKGxvbmcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEFDVElPTl9TRUVLX1RPID0gMSA8PCA4OworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoaXMgc2Vzc2lvbiBzdXBwb3J0cyB0aGUgcGxheS9wYXVzZSB0b2dnbGUgY29tbWFuZC4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRBY3Rpb25zKGxvbmcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEFDVElPTl9QTEFZX1BBVVNFID0gMSA8PCA5OworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoaXMgc2Vzc2lvbiBzdXBwb3J0cyB0aGUgcGxheSBmcm9tIG1lZGlhIGlkIGNvbW1hbmQuCisgICAgICoKKyAgICAgKiBAc2VlIEJ1aWxkZXIjc2V0QWN0aW9ucyhsb25nKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBBQ1RJT05fUExBWV9GUk9NX01FRElBX0lEID0gMSA8PCAxMDsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGlzIHNlc3Npb24gc3VwcG9ydHMgdGhlIHBsYXkgZnJvbSBzZWFyY2ggY29tbWFuZC4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRBY3Rpb25zKGxvbmcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEFDVElPTl9QTEFZX0ZST01fU0VBUkNIID0gMSA8PCAxMTsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGlzIHNlc3Npb24gc3VwcG9ydHMgdGhlIHNraXAgdG8gcXVldWUgaXRlbSBjb21tYW5kLgorICAgICAqCisgICAgICogQHNlZSBCdWlsZGVyI3NldEFjdGlvbnMobG9uZykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQUNUSU9OX1NLSVBfVE9fUVVFVUVfSVRFTSA9IDEgPDwgMTI7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhpcyBzZXNzaW9uIHN1cHBvcnRzIHRoZSBwbGF5IGZyb20gVVJJIGNvbW1hbmQuCisgICAgICoKKyAgICAgKiBAc2VlIEJ1aWxkZXIjc2V0QWN0aW9ucyhsb25nKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBBQ1RJT05fUExBWV9GUk9NX1VSSSA9IDEgPDwgMTM7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhpcyBzZXNzaW9uIHN1cHBvcnRzIHRoZSBwcmVwYXJlIGNvbW1hbmQuCisgICAgICoKKyAgICAgKiBAc2VlIEJ1aWxkZXIjc2V0QWN0aW9ucyhsb25nKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBBQ1RJT05fUFJFUEFSRSA9IDEgPDwgMTQ7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhpcyBzZXNzaW9uIHN1cHBvcnRzIHRoZSBwcmVwYXJlIGZyb20gbWVkaWEgaWQgY29tbWFuZC4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRBY3Rpb25zKGxvbmcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEFDVElPTl9QUkVQQVJFX0ZST01fTUVESUFfSUQgPSAxIDw8IDE1OworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoaXMgc2Vzc2lvbiBzdXBwb3J0cyB0aGUgcHJlcGFyZSBmcm9tIHNlYXJjaCBjb21tYW5kLgorICAgICAqCisgICAgICogQHNlZSBCdWlsZGVyI3NldEFjdGlvbnMobG9uZykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQUNUSU9OX1BSRVBBUkVfRlJPTV9TRUFSQ0ggPSAxIDw8IDE2OworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoaXMgc2Vzc2lvbiBzdXBwb3J0cyB0aGUgcHJlcGFyZSBmcm9tIFVSSSBjb21tYW5kLgorICAgICAqCisgICAgICogQHNlZSBCdWlsZGVyI3NldEFjdGlvbnMobG9uZykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQUNUSU9OX1BSRVBBUkVfRlJPTV9VUkkgPSAxIDw8IDE3OworCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBASW50RGVmKHtTVEFURV9OT05FLCBTVEFURV9TVE9QUEVELCBTVEFURV9QQVVTRUQsIFNUQVRFX1BMQVlJTkcsIFNUQVRFX0ZBU1RfRk9SV0FSRElORywKKyAgICAgICAgICAgIFNUQVRFX1JFV0lORElORywgU1RBVEVfQlVGRkVSSU5HLCBTVEFURV9FUlJPUiwgU1RBVEVfQ09OTkVDVElORywKKyAgICAgICAgICAgIFNUQVRFX1NLSVBQSU5HX1RPX1BSRVZJT1VTLCBTVEFURV9TS0lQUElOR19UT19ORVhULCBTVEFURV9TS0lQUElOR19UT19RVUVVRV9JVEVNfSkKKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCisgICAgcHVibGljIEBpbnRlcmZhY2UgU3RhdGUge30KKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgcGxheWJhY2sgc3RhdGUgYW5kIGluZGljYXRlcyB0aGF0IG5vIG1lZGlhIGhhcyBiZWVuCisgICAgICogYWRkZWQgeWV0LCBvciB0aGUgcGVyZm9ybWVyIGhhcyBiZWVuIHJlc2V0IGFuZCBoYXMgbm8gY29udGVudCB0byBwbGF5LgorICAgICAqCisgICAgICogQHNlZSBCdWlsZGVyI3NldFN0YXRlKGludCwgbG9uZywgZmxvYXQpCisgICAgICogQHNlZSBCdWlsZGVyI3NldFN0YXRlKGludCwgbG9uZywgZmxvYXQsIGxvbmcpCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU1RBVEVfTk9ORSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTdGF0ZSBpbmRpY2F0aW5nIHRoaXMgaXRlbSBpcyBjdXJyZW50bHkgc3RvcHBlZC4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRTdGF0ZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNUQVRFX1NUT1BQRUQgPSAxOworCisgICAgLyoqCisgICAgICogU3RhdGUgaW5kaWNhdGluZyB0aGlzIGl0ZW0gaXMgY3VycmVudGx5IHBhdXNlZC4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRTdGF0ZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNUQVRFX1BBVVNFRCA9IDI7CisKKyAgICAvKioKKyAgICAgKiBTdGF0ZSBpbmRpY2F0aW5nIHRoaXMgaXRlbSBpcyBjdXJyZW50bHkgcGxheWluZy4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRTdGF0ZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNUQVRFX1BMQVlJTkcgPSAzOworCisgICAgLyoqCisgICAgICogU3RhdGUgaW5kaWNhdGluZyB0aGlzIGl0ZW0gaXMgY3VycmVudGx5IGZhc3QgZm9yd2FyZGluZy4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRTdGF0ZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNUQVRFX0ZBU1RfRk9SV0FSRElORyA9IDQ7CisKKyAgICAvKioKKyAgICAgKiBTdGF0ZSBpbmRpY2F0aW5nIHRoaXMgaXRlbSBpcyBjdXJyZW50bHkgcmV3aW5kaW5nLgorICAgICAqCisgICAgICogQHNlZSBCdWlsZGVyI3NldFN0YXRlCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU1RBVEVfUkVXSU5ESU5HID0gNTsKKworICAgIC8qKgorICAgICAqIFN0YXRlIGluZGljYXRpbmcgdGhpcyBpdGVtIGlzIGN1cnJlbnRseSBidWZmZXJpbmcgYW5kIHdpbGwgYmVnaW4gcGxheWluZworICAgICAqIHdoZW4gZW5vdWdoIGRhdGEgaGFzIGJ1ZmZlcmVkLgorICAgICAqCisgICAgICogQHNlZSBCdWlsZGVyI3NldFN0YXRlCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU1RBVEVfQlVGRkVSSU5HID0gNjsKKworICAgIC8qKgorICAgICAqIFN0YXRlIGluZGljYXRpbmcgdGhpcyBpdGVtIGlzIGN1cnJlbnRseSBpbiBhbiBlcnJvciBzdGF0ZS4gVGhlIGVycm9yCisgICAgICogbWVzc2FnZSBzaG91bGQgYWxzbyBiZSBzZXQgd2hlbiBlbnRlcmluZyB0aGlzIHN0YXRlLgorICAgICAqCisgICAgICogQHNlZSBCdWlsZGVyI3NldFN0YXRlCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU1RBVEVfRVJST1IgPSA3OworCisgICAgLyoqCisgICAgICogU3RhdGUgaW5kaWNhdGluZyB0aGUgY2xhc3MgZG9pbmcgcGxheWJhY2sgaXMgY3VycmVudGx5IGNvbm5lY3RpbmcgdG8gYQorICAgICAqIG5ldyBkZXN0aW5hdGlvbi4gIERlcGVuZGluZyBvbiB0aGUgaW1wbGVtZW50YXRpb24geW91IG1heSByZXR1cm4gdG8gdGhlIHByZXZpb3VzCisgICAgICogc3RhdGUgd2hlbiB0aGUgY29ubmVjdGlvbiBmaW5pc2hlcyBvciBlbnRlciB7QGxpbmsgI1NUQVRFX05PTkV9LgorICAgICAqIElmIHRoZSBjb25uZWN0aW9uIGZhaWxlZCB7QGxpbmsgI1NUQVRFX0VSUk9SfSBzaG91bGQgYmUgdXNlZC4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRTdGF0ZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNUQVRFX0NPTk5FQ1RJTkcgPSA4OworCisgICAgLyoqCisgICAgICogU3RhdGUgaW5kaWNhdGluZyB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBza2lwcGluZyB0byB0aGUgcHJldmlvdXMgaXRlbS4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRTdGF0ZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNUQVRFX1NLSVBQSU5HX1RPX1BSRVZJT1VTID0gOTsKKworICAgIC8qKgorICAgICAqIFN0YXRlIGluZGljYXRpbmcgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgc2tpcHBpbmcgdG8gdGhlIG5leHQgaXRlbS4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRTdGF0ZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNUQVRFX1NLSVBQSU5HX1RPX05FWFQgPSAxMDsKKworICAgIC8qKgorICAgICAqIFN0YXRlIGluZGljYXRpbmcgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgc2tpcHBpbmcgdG8gYSBzcGVjaWZpYyBpdGVtIGluCisgICAgICogdGhlIHF1ZXVlLgorICAgICAqCisgICAgICogQHNlZSBCdWlsZGVyI3NldFN0YXRlCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU1RBVEVfU0tJUFBJTkdfVE9fUVVFVUVfSVRFTSA9IDExOworCisgICAgLyoqCisgICAgICogVXNlIHRoaXMgdmFsdWUgZm9yIHRoZSBwb3NpdGlvbiB0byBpbmRpY2F0ZSB0aGUgcG9zaXRpb24gaXMgbm90IGtub3duLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbG9uZyBQTEFZQkFDS19QT1NJVElPTl9VTktOT1dOID0gLTE7CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBtU3RhdGU7CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIG1Qb3NpdGlvbjsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgbUJ1ZmZlcmVkUG9zaXRpb247CisgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdCBtU3BlZWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIG1BY3Rpb25zOworICAgIHByaXZhdGUgTGlzdDxQbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbj4gbUN1c3RvbUFjdGlvbnM7CisgICAgcHJpdmF0ZSBmaW5hbCBDaGFyU2VxdWVuY2UgbUVycm9yTWVzc2FnZTsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgbVVwZGF0ZVRpbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIG1BY3RpdmVJdGVtSWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUV4dHJhczsKKworICAgIHByaXZhdGUgUGxheWJhY2tTdGF0ZShpbnQgc3RhdGUsIGxvbmcgcG9zaXRpb24sIGxvbmcgdXBkYXRlVGltZSwgZmxvYXQgc3BlZWQsCisgICAgICAgICAgICBsb25nIGJ1ZmZlcmVkUG9zaXRpb24sIGxvbmcgdHJhbnNwb3J0Q29udHJvbHMsCisgICAgICAgICAgICBMaXN0PFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uPiBjdXN0b21BY3Rpb25zLCBsb25nIGFjdGl2ZUl0ZW1JZCwKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBlcnJvciwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICBtU3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgbVBvc2l0aW9uID0gcG9zaXRpb247CisgICAgICAgIG1TcGVlZCA9IHNwZWVkOworICAgICAgICBtVXBkYXRlVGltZSA9IHVwZGF0ZVRpbWU7CisgICAgICAgIG1CdWZmZXJlZFBvc2l0aW9uID0gYnVmZmVyZWRQb3NpdGlvbjsKKyAgICAgICAgbUFjdGlvbnMgPSB0cmFuc3BvcnRDb250cm9sczsKKyAgICAgICAgbUN1c3RvbUFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PD4oY3VzdG9tQWN0aW9ucyk7CisgICAgICAgIG1BY3RpdmVJdGVtSWQgPSBhY3RpdmVJdGVtSWQ7CisgICAgICAgIG1FcnJvck1lc3NhZ2UgPSBlcnJvcjsKKyAgICAgICAgbUV4dHJhcyA9IGV4dHJhczsKKyAgICB9CisKKyAgICBwcml2YXRlIFBsYXliYWNrU3RhdGUoUGFyY2VsIGluKSB7CisgICAgICAgIG1TdGF0ZSA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgbVBvc2l0aW9uID0gaW4ucmVhZExvbmcoKTsKKyAgICAgICAgbVNwZWVkID0gaW4ucmVhZEZsb2F0KCk7CisgICAgICAgIG1VcGRhdGVUaW1lID0gaW4ucmVhZExvbmcoKTsKKyAgICAgICAgbUJ1ZmZlcmVkUG9zaXRpb24gPSBpbi5yZWFkTG9uZygpOworICAgICAgICBtQWN0aW9ucyA9IGluLnJlYWRMb25nKCk7CisgICAgICAgIG1DdXN0b21BY3Rpb25zID0gaW4uY3JlYXRlVHlwZWRBcnJheUxpc3QoQ3VzdG9tQWN0aW9uLkNSRUFUT1IpOworICAgICAgICBtQWN0aXZlSXRlbUlkID0gaW4ucmVhZExvbmcoKTsKKyAgICAgICAgbUVycm9yTWVzc2FnZSA9IFRleHRVdGlscy5DSEFSX1NFUVVFTkNFX0NSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbik7CisgICAgICAgIG1FeHRyYXMgPSBpbi5yZWFkQnVuZGxlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBib2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiUGxheWJhY2tTdGF0ZSB7Iik7CisgICAgICAgIGJvYi5hcHBlbmQoInN0YXRlPSIpLmFwcGVuZChtU3RhdGUpOworICAgICAgICBib2IuYXBwZW5kKCIsIHBvc2l0aW9uPSIpLmFwcGVuZChtUG9zaXRpb24pOworICAgICAgICBib2IuYXBwZW5kKCIsIGJ1ZmZlcmVkIHBvc2l0aW9uPSIpLmFwcGVuZChtQnVmZmVyZWRQb3NpdGlvbik7CisgICAgICAgIGJvYi5hcHBlbmQoIiwgc3BlZWQ9IikuYXBwZW5kKG1TcGVlZCk7CisgICAgICAgIGJvYi5hcHBlbmQoIiwgdXBkYXRlZD0iKS5hcHBlbmQobVVwZGF0ZVRpbWUpOworICAgICAgICBib2IuYXBwZW5kKCIsIGFjdGlvbnM9IikuYXBwZW5kKG1BY3Rpb25zKTsKKyAgICAgICAgYm9iLmFwcGVuZCgiLCBjdXN0b20gYWN0aW9ucz0iKS5hcHBlbmQobUN1c3RvbUFjdGlvbnMpOworICAgICAgICBib2IuYXBwZW5kKCIsIGFjdGl2ZSBpdGVtIGlkPSIpLmFwcGVuZChtQWN0aXZlSXRlbUlkKTsKKyAgICAgICAgYm9iLmFwcGVuZCgiLCBlcnJvcj0iKS5hcHBlbmQobUVycm9yTWVzc2FnZSk7CisgICAgICAgIGJvYi5hcHBlbmQoIn0iKTsKKyAgICAgICAgcmV0dXJuIGJvYi50b1N0cmluZygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobVN0YXRlKTsKKyAgICAgICAgZGVzdC53cml0ZUxvbmcobVBvc2l0aW9uKTsKKyAgICAgICAgZGVzdC53cml0ZUZsb2F0KG1TcGVlZCk7CisgICAgICAgIGRlc3Qud3JpdGVMb25nKG1VcGRhdGVUaW1lKTsKKyAgICAgICAgZGVzdC53cml0ZUxvbmcobUJ1ZmZlcmVkUG9zaXRpb24pOworICAgICAgICBkZXN0LndyaXRlTG9uZyhtQWN0aW9ucyk7CisgICAgICAgIGRlc3Qud3JpdGVUeXBlZExpc3QobUN1c3RvbUFjdGlvbnMpOworICAgICAgICBkZXN0LndyaXRlTG9uZyhtQWN0aXZlSXRlbUlkKTsKKyAgICAgICAgVGV4dFV0aWxzLndyaXRlVG9QYXJjZWwobUVycm9yTWVzc2FnZSwgZGVzdCwgMCk7CisgICAgICAgIGRlc3Qud3JpdGVCdW5kbGUobUV4dHJhcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIHBsYXliYWNrLiBPbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9OT05FfTwvbGk+CisgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9TVE9QUEVEfTwvbGk+CisgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9QTEFZSU5HfTwvbGk+CisgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9QQVVTRUR9PC9saT4KKyAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX0ZBU1RfRk9SV0FSRElOR308L2xpPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfUkVXSU5ESU5HfTwvbGk+CisgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9CVUZGRVJJTkd9PC9saT4KKyAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX0VSUk9SfTwvbGk+CisgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9DT05ORUNUSU5HfTwvbGk+CisgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9TS0lQUElOR19UT19QUkVWSU9VU308L2xpPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfU0tJUFBJTkdfVE9fTkVYVH08L2xpPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfU0tJUFBJTkdfVE9fUVVFVUVfSVRFTX08L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgQFN0YXRlCisgICAgcHVibGljIGludCBnZXRTdGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1TdGF0ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24gaW4gbXMuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0UG9zaXRpb24oKSB7CisgICAgICAgIHJldHVybiBtUG9zaXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJyZW50IGJ1ZmZlcmVkIHBvc2l0aW9uIGluIG1zLiBUaGlzIGlzIHRoZSBmYXJ0aGVzdCBwbGF5YmFjaworICAgICAqIHBvaW50IHRoYXQgY2FuIGJlIHJlYWNoZWQgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiB1c2luZyBvbmx5IGJ1ZmZlcmVkCisgICAgICogY29udGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRCdWZmZXJlZFBvc2l0aW9uKCkgeworICAgICAgICByZXR1cm4gbUJ1ZmZlcmVkUG9zaXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJyZW50IHBsYXliYWNrIHNwZWVkIGFzIGEgbXVsdGlwbGUgb2Ygbm9ybWFsIHBsYXliYWNrLiBUaGlzCisgICAgICogc2hvdWxkIGJlIG5lZ2F0aXZlIHdoZW4gcmV3aW5kaW5nLiBBIHZhbHVlIG9mIDEgbWVhbnMgbm9ybWFsIHBsYXliYWNrIGFuZAorICAgICAqIDAgbWVhbnMgcGF1c2VkLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCBzcGVlZCBvZiBwbGF5YmFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0UGxheWJhY2tTcGVlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1TcGVlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGN1cnJlbnQgYWN0aW9ucyBhdmFpbGFibGUgb24gdGhpcyBzZXNzaW9uLiBUaGlzIHNob3VsZCB1c2UgYQorICAgICAqIGJpdG1hc2sgb2YgdGhlIGF2YWlsYWJsZSBhY3Rpb25zLgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9TS0lQX1RPX1BSRVZJT1VTfTwvbGk+CisgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNBQ1RJT05fUkVXSU5EfTwvbGk+CisgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNBQ1RJT05fUExBWX08L2xpPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1BBVVNFfTwvbGk+CisgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNBQ1RJT05fU1RPUH08L2xpPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX0ZBU1RfRk9SV0FSRH08L2xpPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1NLSVBfVE9fTkVYVH08L2xpPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1NFRUtfVE99PC9saT4KKyAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9TRVRfUkFUSU5HfTwvbGk+CisgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNBQ1RJT05fUExBWV9QQVVTRX08L2xpPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1BMQVlfRlJPTV9NRURJQV9JRH08L2xpPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1BMQVlfRlJPTV9TRUFSQ0h9PC9saT4KKyAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9TS0lQX1RPX1FVRVVFX0lURU19PC9saT4KKyAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9QTEFZX0ZST01fVVJJfTwvbGk+CisgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNBQ1RJT05fUFJFUEFSRX08L2xpPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1BSRVBBUkVfRlJPTV9NRURJQV9JRH08L2xpPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1BSRVBBUkVfRlJPTV9TRUFSQ0h9PC9saT4KKyAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9QUkVQQVJFX0ZST01fVVJJfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKi8KKyAgICBAQWN0aW9ucworICAgIHB1YmxpYyBsb25nIGdldEFjdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBtQWN0aW9uczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxpc3Qgb2YgY3VzdG9tIGFjdGlvbnMuCisgICAgICovCisgICAgcHVibGljIExpc3Q8UGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24+IGdldEN1c3RvbUFjdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBtQ3VzdG9tQWN0aW9uczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSB1c2VyIHJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuIFRoaXMgc2hvdWxkIGJlIHNldCB3aGVuIHRoZSBzdGF0ZSBpcworICAgICAqIHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX0VSUk9SfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldEVycm9yTWVzc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIG1FcnJvck1lc3NhZ2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBlbGFwc2VkIHJlYWwgdGltZSBhdCB3aGljaCBwb3NpdGlvbiB3YXMgbGFzdCB1cGRhdGVkLiBJZiB0aGUKKyAgICAgKiBwb3NpdGlvbiBoYXMgbmV2ZXIgYmVlbiBzZXQgdGhpcyB3aWxsIHJldHVybiAwOworICAgICAqCisgICAgICogQHJldHVybiBUaGUgbGFzdCB0aW1lIHRoZSBwb3NpdGlvbiB3YXMgdXBkYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRMYXN0UG9zaXRpb25VcGRhdGVUaW1lKCkgeworICAgICAgICByZXR1cm4gbVVwZGF0ZVRpbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBpZCBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBpdGVtIGluIHRoZSBxdWV1ZS4gSWYgdGhlcmUgaXMgbm8KKyAgICAgKiBxdWV1ZSBvciBhIHF1ZXVlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHNlc3Npb24gdGhpcyB3aWxsIGJlCisgICAgICoge0BsaW5rIE1lZGlhU2Vzc2lvbi5RdWV1ZUl0ZW0jVU5LTk9XTl9JRH0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBpZCBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBpdGVtIGluIHRoZSBxdWV1ZSBvcgorICAgICAqICAgICAgICAge0BsaW5rIE1lZGlhU2Vzc2lvbi5RdWV1ZUl0ZW0jVU5LTk9XTl9JRH0uCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0QWN0aXZlUXVldWVJdGVtSWQoKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZlSXRlbUlkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhbnkgY3VzdG9tIGV4dHJhcyB0aGF0IHdlcmUgc2V0IG9uIHRoaXMgcGxheWJhY2sgc3RhdGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBleHRyYXMgZm9yIHRoaXMgc3RhdGUgb3IgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE51bGxhYmxlIEJ1bmRsZSBnZXRFeHRyYXMoKSB7CisgICAgICAgIHJldHVybiBtRXh0cmFzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUge0BsaW5rIFBsYXliYWNrU3RhdGV9IHN0YXRlIGZvciB0aGUgZ2l2ZW4KKyAgICAgKiB7QGxpbmsgUmVtb3RlQ29udHJvbENsaWVudH0gc3RhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmNjU3RhdGUgVGhlIHN0YXRlIHVzZWQgYnkge0BsaW5rIFJlbW90ZUNvbnRyb2xDbGllbnR9LgorICAgICAqIEByZXR1cm4gVGhlIGVxdWl2YWxlbnQgc3RhdGUgdXNlZCBieSB7QGxpbmsgUGxheWJhY2tTdGF0ZX0uCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRTdGF0ZUZyb21SY2NTdGF0ZShpbnQgcmNjU3RhdGUpIHsKKyAgICAgICAgc3dpdGNoIChyY2NTdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBSZW1vdGVDb250cm9sQ2xpZW50LlBMQVlTVEFURV9CVUZGRVJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRFX0JVRkZFUklORzsKKyAgICAgICAgICAgIGNhc2UgUmVtb3RlQ29udHJvbENsaWVudC5QTEFZU1RBVEVfRVJST1I6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRFX0VSUk9SOworICAgICAgICAgICAgY2FzZSBSZW1vdGVDb250cm9sQ2xpZW50LlBMQVlTVEFURV9GQVNUX0ZPUldBUkRJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRFX0ZBU1RfRk9SV0FSRElORzsKKyAgICAgICAgICAgIC8vUmVtb3RlQ29udHJvbENsaWVudC5QTEFZU1RBVEVfTk9ORSBpcyBoaWRkZW4KKyAgICAgICAgICAgIGNhc2UgMDogIC8vUmVtb3RlQ29udHJvbENsaWVudC5QTEFZU1RBVEVfTk9ORToKKyAgICAgICAgICAgICAgICByZXR1cm4gU1RBVEVfTk9ORTsKKyAgICAgICAgICAgIGNhc2UgUmVtb3RlQ29udHJvbENsaWVudC5QTEFZU1RBVEVfUEFVU0VEOgorICAgICAgICAgICAgICAgIHJldHVybiBTVEFURV9QQVVTRUQ7CisgICAgICAgICAgICBjYXNlIFJlbW90ZUNvbnRyb2xDbGllbnQuUExBWVNUQVRFX1BMQVlJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRFX1BMQVlJTkc7CisgICAgICAgICAgICBjYXNlIFJlbW90ZUNvbnRyb2xDbGllbnQuUExBWVNUQVRFX1JFV0lORElORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gU1RBVEVfUkVXSU5ESU5HOworICAgICAgICAgICAgY2FzZSBSZW1vdGVDb250cm9sQ2xpZW50LlBMQVlTVEFURV9TS0lQUElOR19CQUNLV0FSRFM6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRFX1NLSVBQSU5HX1RPX1BSRVZJT1VTOworICAgICAgICAgICAgY2FzZSBSZW1vdGVDb250cm9sQ2xpZW50LlBMQVlTVEFURV9TS0lQUElOR19GT1JXQVJEUzoKKyAgICAgICAgICAgICAgICByZXR1cm4gU1RBVEVfU0tJUFBJTkdfVE9fTkVYVDsKKyAgICAgICAgICAgIGNhc2UgUmVtb3RlQ29udHJvbENsaWVudC5QTEFZU1RBVEVfU1RPUFBFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gU1RBVEVfU1RPUFBFRDsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB7QGxpbmsgUmVtb3RlQ29udHJvbENsaWVudH0gc3RhdGUgZm9yIHRoZSBnaXZlbgorICAgICAqIHtAbGluayBQbGF5YmFja1N0YXRlfSBzdGF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGF0ZSBUaGUgc3RhdGUgdXNlZCBieSB7QGxpbmsgUGxheWJhY2tTdGF0ZX0uCisgICAgICogQHJldHVybiBUaGUgZXF1aXZhbGVudCBzdGF0ZSB1c2VkIGJ5IHtAbGluayBSZW1vdGVDb250cm9sQ2xpZW50fS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFJjY1N0YXRlRnJvbVN0YXRlKGludCBzdGF0ZSkgeworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgICAgICBjYXNlIFNUQVRFX0JVRkZFUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVtb3RlQ29udHJvbENsaWVudC5QTEFZU1RBVEVfQlVGRkVSSU5HOworICAgICAgICAgICAgY2FzZSBTVEFURV9FUlJPUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVtb3RlQ29udHJvbENsaWVudC5QTEFZU1RBVEVfRVJST1I7CisgICAgICAgICAgICBjYXNlIFNUQVRFX0ZBU1RfRk9SV0FSRElORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVtb3RlQ29udHJvbENsaWVudC5QTEFZU1RBVEVfRkFTVF9GT1JXQVJESU5HOworICAgICAgICAgICAgY2FzZSBTVEFURV9OT05FOgorICAgICAgICAgICAgICAgIC8vUmVtb3RlQ29udHJvbENsaWVudC5QTEFZU1RBVEVfTk9ORSBpcyBoaWRkZW4KKyAgICAgICAgICAgICAgICByZXR1cm4gMDsgIC8vUmVtb3RlQ29udHJvbENsaWVudC5QTEFZU1RBVEVfTk9ORTsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgorICAgICAgICAgICAgICAgIHJldHVybiBSZW1vdGVDb250cm9sQ2xpZW50LlBMQVlTVEFURV9QQVVTRUQ7CisgICAgICAgICAgICBjYXNlIFNUQVRFX1BMQVlJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbW90ZUNvbnRyb2xDbGllbnQuUExBWVNUQVRFX1BMQVlJTkc7CisgICAgICAgICAgICBjYXNlIFNUQVRFX1JFV0lORElORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVtb3RlQ29udHJvbENsaWVudC5QTEFZU1RBVEVfUkVXSU5ESU5HOworICAgICAgICAgICAgY2FzZSBTVEFURV9TS0lQUElOR19UT19QUkVWSU9VUzoKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVtb3RlQ29udHJvbENsaWVudC5QTEFZU1RBVEVfU0tJUFBJTkdfQkFDS1dBUkRTOworICAgICAgICAgICAgY2FzZSBTVEFURV9TS0lQUElOR19UT19ORVhUOgorICAgICAgICAgICAgICAgIHJldHVybiBSZW1vdGVDb250cm9sQ2xpZW50LlBMQVlTVEFURV9TS0lQUElOR19GT1JXQVJEUzsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVtb3RlQ29udHJvbENsaWVudC5QTEFZU1RBVEVfU1RPUFBFRDsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0QWN0aW9uc0Zyb21SY2NDb250cm9sRmxhZ3MoaW50IHJjY0ZsYWdzKSB7CisgICAgICAgIGxvbmcgYWN0aW9ucyA9IDA7CisgICAgICAgIGxvbmcgZmxhZyA9IDE7CisgICAgICAgIHdoaWxlIChmbGFnIDw9IHJjY0ZsYWdzKSB7CisgICAgICAgICAgICBpZiAoKGZsYWcgJiByY2NGbGFncykgIT0gMCkgeworICAgICAgICAgICAgICAgIGFjdGlvbnMgfD0gZ2V0QWN0aW9uRm9yUmNjRmxhZygoaW50KSBmbGFnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZsYWcgPSBmbGFnIDw8IDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFjdGlvbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRSY2NDb250cm9sRmxhZ3NGcm9tQWN0aW9ucyhsb25nIGFjdGlvbnMpIHsKKyAgICAgICAgaW50IHJjY0ZsYWdzID0gMDsKKyAgICAgICAgbG9uZyBhY3Rpb24gPSAxOworICAgICAgICB3aGlsZSAoYWN0aW9uIDw9IGFjdGlvbnMgJiYgYWN0aW9uIDwgSW50ZWdlci5NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgIGlmICgoYWN0aW9uICYgYWN0aW9ucykgIT0gMCkgeworICAgICAgICAgICAgICAgIHJjY0ZsYWdzIHw9IGdldFJjY0ZsYWdGb3JBY3Rpb24oYWN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFjdGlvbiA9IGFjdGlvbiA8PCAxOworICAgICAgICB9CisgICAgICAgIHJldHVybiByY2NGbGFnczsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBsb25nIGdldEFjdGlvbkZvclJjY0ZsYWcoaW50IGZsYWcpIHsKKyAgICAgICAgc3dpdGNoIChmbGFnKSB7CisgICAgICAgICAgICBjYXNlIFJlbW90ZUNvbnRyb2xDbGllbnQuRkxBR19LRVlfTUVESUFfUFJFVklPVVM6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFDVElPTl9TS0lQX1RPX1BSRVZJT1VTOworICAgICAgICAgICAgY2FzZSBSZW1vdGVDb250cm9sQ2xpZW50LkZMQUdfS0VZX01FRElBX1JFV0lORDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNUSU9OX1JFV0lORDsKKyAgICAgICAgICAgIGNhc2UgUmVtb3RlQ29udHJvbENsaWVudC5GTEFHX0tFWV9NRURJQV9QTEFZOgorICAgICAgICAgICAgICAgIHJldHVybiBBQ1RJT05fUExBWTsKKyAgICAgICAgICAgIGNhc2UgUmVtb3RlQ29udHJvbENsaWVudC5GTEFHX0tFWV9NRURJQV9QTEFZX1BBVVNFOgorICAgICAgICAgICAgICAgIHJldHVybiBBQ1RJT05fUExBWV9QQVVTRTsKKyAgICAgICAgICAgIGNhc2UgUmVtb3RlQ29udHJvbENsaWVudC5GTEFHX0tFWV9NRURJQV9QQVVTRToKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNUSU9OX1BBVVNFOworICAgICAgICAgICAgY2FzZSBSZW1vdGVDb250cm9sQ2xpZW50LkZMQUdfS0VZX01FRElBX1NUT1A6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFDVElPTl9TVE9QOworICAgICAgICAgICAgY2FzZSBSZW1vdGVDb250cm9sQ2xpZW50LkZMQUdfS0VZX01FRElBX0ZBU1RfRk9SV0FSRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNUSU9OX0ZBU1RfRk9SV0FSRDsKKyAgICAgICAgICAgIGNhc2UgUmVtb3RlQ29udHJvbENsaWVudC5GTEFHX0tFWV9NRURJQV9ORVhUOgorICAgICAgICAgICAgICAgIHJldHVybiBBQ1RJT05fU0tJUF9UT19ORVhUOworICAgICAgICAgICAgY2FzZSBSZW1vdGVDb250cm9sQ2xpZW50LkZMQUdfS0VZX01FRElBX1BPU0lUSU9OX1VQREFURToKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNUSU9OX1NFRUtfVE87CisgICAgICAgICAgICBjYXNlIFJlbW90ZUNvbnRyb2xDbGllbnQuRkxBR19LRVlfTUVESUFfUkFUSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBBQ1RJT05fU0VUX1JBVElORzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0UmNjRmxhZ0ZvckFjdGlvbihsb25nIGFjdGlvbikgeworICAgICAgICAvLyBXZSBvbmx5IGNhcmUgYWJvdXQgdGhlIGxvd2VyIHNldCBvZiBhY3Rpb25zIHRoYXQgY2FuIG1hcCB0byByY2MKKyAgICAgICAgLy8gZmxhZ3MuCisgICAgICAgIGludCB0ZXN0QWN0aW9uID0gYWN0aW9uIDwgSW50ZWdlci5NQVhfVkFMVUUgPyAoaW50KSBhY3Rpb24gOiAwOworICAgICAgICBzd2l0Y2ggKHRlc3RBY3Rpb24pIHsKKyAgICAgICAgICAgIGNhc2UgKGludCkgQUNUSU9OX1NLSVBfVE9fUFJFVklPVVM6CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbW90ZUNvbnRyb2xDbGllbnQuRkxBR19LRVlfTUVESUFfUFJFVklPVVM7CisgICAgICAgICAgICBjYXNlIChpbnQpIEFDVElPTl9SRVdJTkQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbW90ZUNvbnRyb2xDbGllbnQuRkxBR19LRVlfTUVESUFfUkVXSU5EOworICAgICAgICAgICAgY2FzZSAoaW50KSBBQ1RJT05fUExBWToKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVtb3RlQ29udHJvbENsaWVudC5GTEFHX0tFWV9NRURJQV9QTEFZOworICAgICAgICAgICAgY2FzZSAoaW50KSBBQ1RJT05fUExBWV9QQVVTRToKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVtb3RlQ29udHJvbENsaWVudC5GTEFHX0tFWV9NRURJQV9QTEFZX1BBVVNFOworICAgICAgICAgICAgY2FzZSAoaW50KSBBQ1RJT05fUEFVU0U6CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbW90ZUNvbnRyb2xDbGllbnQuRkxBR19LRVlfTUVESUFfUEFVU0U7CisgICAgICAgICAgICBjYXNlIChpbnQpIEFDVElPTl9TVE9QOgorICAgICAgICAgICAgICAgIHJldHVybiBSZW1vdGVDb250cm9sQ2xpZW50LkZMQUdfS0VZX01FRElBX1NUT1A7CisgICAgICAgICAgICBjYXNlIChpbnQpIEFDVElPTl9GQVNUX0ZPUldBUkQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbW90ZUNvbnRyb2xDbGllbnQuRkxBR19LRVlfTUVESUFfRkFTVF9GT1JXQVJEOworICAgICAgICAgICAgY2FzZSAoaW50KSBBQ1RJT05fU0tJUF9UT19ORVhUOgorICAgICAgICAgICAgICAgIHJldHVybiBSZW1vdGVDb250cm9sQ2xpZW50LkZMQUdfS0VZX01FRElBX05FWFQ7CisgICAgICAgICAgICBjYXNlIChpbnQpIEFDVElPTl9TRUVLX1RPOgorICAgICAgICAgICAgICAgIHJldHVybiBSZW1vdGVDb250cm9sQ2xpZW50LkZMQUdfS0VZX01FRElBX1BPU0lUSU9OX1VQREFURTsKKyAgICAgICAgICAgIGNhc2UgKGludCkgQUNUSU9OX1NFVF9SQVRJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbW90ZUNvbnRyb2xDbGllbnQuRkxBR19LRVlfTUVESUFfUkFUSU5HOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPFBsYXliYWNrU3RhdGU+IENSRUFUT1IgPQorICAgICAgICAgICAgbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxQbGF5YmFja1N0YXRlPigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBQbGF5YmFja1N0YXRlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFBsYXliYWNrU3RhdGUoaW4pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBQbGF5YmFja1N0YXRlW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUGxheWJhY2tTdGF0ZVtzaXplXTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgUGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24gQ3VzdG9tQWN0aW9uc30gY2FuIGJlIHVzZWQgdG8gZXh0ZW5kIHRoZSBjYXBhYmlsaXRpZXMgb2YKKyAgICAgKiB0aGUgc3RhbmRhcmQgdHJhbnNwb3J0IGNvbnRyb2xzIGJ5IGV4cG9zaW5nIGFwcCBzcGVjaWZpYyBhY3Rpb25zIHRvCisgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbGxlciBNZWRpYUNvbnRyb2xsZXJzfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEN1c3RvbUFjdGlvbiBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQWN0aW9uOworICAgICAgICBwcml2YXRlIGZpbmFsIENoYXJTZXF1ZW5jZSBtTmFtZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUljb247CisgICAgICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1FeHRyYXM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVzZSB7QGxpbmsgUGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24uQnVpbGRlciNidWlsZCgpfS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgQ3VzdG9tQWN0aW9uKFN0cmluZyBhY3Rpb24sIENoYXJTZXF1ZW5jZSBuYW1lLCBpbnQgaWNvbiwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICAgICAgbUFjdGlvbiA9IGFjdGlvbjsKKyAgICAgICAgICAgIG1OYW1lID0gbmFtZTsKKyAgICAgICAgICAgIG1JY29uID0gaWNvbjsKKyAgICAgICAgICAgIG1FeHRyYXMgPSBleHRyYXM7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEN1c3RvbUFjdGlvbihQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIG1BY3Rpb24gPSBpbi5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBtTmFtZSA9IFRleHRVdGlscy5DSEFSX1NFUVVFTkNFX0NSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbik7CisgICAgICAgICAgICBtSWNvbiA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIG1FeHRyYXMgPSBpbi5yZWFkQnVuZGxlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1BY3Rpb24pOworICAgICAgICAgICAgVGV4dFV0aWxzLndyaXRlVG9QYXJjZWwobU5hbWUsIGRlc3QsIGZsYWdzKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQobUljb24pOworICAgICAgICAgICAgZGVzdC53cml0ZUJ1bmRsZShtRXh0cmFzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uPiBDUkVBVE9SCisgICAgICAgICAgICAgICAgPSBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uPigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24gY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgcCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24ocCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uW3NpemVdOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBhY3Rpb24gb2YgdGhlIHtAbGluayBDdXN0b21BY3Rpb259LgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBhY3Rpb24gb2YgdGhlIHtAbGluayBDdXN0b21BY3Rpb259LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRBY3Rpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gbUFjdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhpcyBhY3Rpb24uIGUuZy4gIkZhdm9yaXRlIgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBkaXNwbGF5IG5hbWUgb2YgdGhpcyB7QGxpbmsgQ3VzdG9tQWN0aW9ufS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBpZCBvZiB0aGUgaWNvbiBpbiB0aGUge0BsaW5rIE1lZGlhU2Vzc2lvbiBNZWRpYVNlc3Npb24nc30gcGFja2FnZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBUaGUgcmVzb3VyY2UgaWQgb2YgdGhlIGljb24gaW4gdGhlIHtAbGluayBNZWRpYVNlc3Npb24gTWVkaWFTZXNzaW9uJ3N9IHBhY2thZ2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldEljb24oKSB7CisgICAgICAgICAgICByZXR1cm4gbUljb247CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyBleHRyYXMgd2hpY2ggcHJvdmlkZSBhZGRpdGlvbmFsIGFwcGxpY2F0aW9uLXNwZWNpZmljIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICAgICAgICAgKiBhY3Rpb24sIG9yIG51bGwgaWYgbm9uZS4gVGhlc2UgYXJndW1lbnRzIGFyZSBtZWFudCB0byBiZSBjb25zdW1lZCBieSBhCisgICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xsZXJ9IGlmIGl0IGtub3dzIGhvdyB0byBoYW5kbGUgdGhlbS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBPcHRpb25hbCBhcmd1bWVudHMgZm9yIHRoZSB7QGxpbmsgQ3VzdG9tQWN0aW9ufS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1FeHRyYXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiQWN0aW9uOiIgKworICAgICAgICAgICAgICAgICAgICAibU5hbWU9JyIgKyBtTmFtZSArCisgICAgICAgICAgICAgICAgICAgICIsIG1JY29uPSIgKyBtSWNvbiArCisgICAgICAgICAgICAgICAgICAgICIsIG1FeHRyYXM9IiArIG1FeHRyYXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQnVpbGRlciBmb3Ige0BsaW5rIEN1c3RvbUFjdGlvbn0gb2JqZWN0cy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQWN0aW9uOworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBDaGFyU2VxdWVuY2UgbU5hbWU7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtSWNvbjsKKyAgICAgICAgICAgIHByaXZhdGUgQnVuZGxlIG1FeHRyYXM7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogQ3JlYXRlcyBhIHtAbGluayBDdXN0b21BY3Rpb259IGJ1aWxkZXIgd2l0aCB0aGUgaWQsIG5hbWUsIGFuZCBpY29uIHNldC4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBAcGFyYW0gYWN0aW9uIFRoZSBhY3Rpb24gb2YgdGhlIHtAbGluayBDdXN0b21BY3Rpb259LgorICAgICAgICAgICAgICogQHBhcmFtIG5hbWUgVGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUge0BsaW5rIEN1c3RvbUFjdGlvbn0uIFRoaXMgbmFtZSB3aWxsIGJlIGRpc3BsYXllZAorICAgICAgICAgICAgICogICAgICAgICAgICAgYWxvbmcgc2lkZSB0aGUgYWN0aW9uIGlmIHRoZSBVSSBzdXBwb3J0cyBpdC4KKyAgICAgICAgICAgICAqIEBwYXJhbSBpY29uIFRoZSBpY29uIHJlc291cmNlIGlkIG9mIHRoZSB7QGxpbmsgQ3VzdG9tQWN0aW9ufS4gVGhpcyByZXNvdXJjZSBpZAorICAgICAgICAgICAgICogICAgICAgICAgICAgbXVzdCBiZSBpbiB0aGUgc2FtZSBwYWNrYWdlIGFzIHRoZSB7QGxpbmsgTWVkaWFTZXNzaW9ufS4gSXQgd2lsbCBiZQorICAgICAgICAgICAgICogICAgICAgICAgICAgZGlzcGxheWVkIHdpdGggdGhlIGN1c3RvbSBhY3Rpb24gaWYgdGhlIFVJIHN1cHBvcnRzIGl0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgQnVpbGRlcihTdHJpbmcgYWN0aW9uLCBDaGFyU2VxdWVuY2UgbmFtZSwgQERyYXdhYmxlUmVzIGludCBpY29uKSB7CisgICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGFjdGlvbikpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWW91IG11c3Qgc3BlY2lmeSBhbiBhY3Rpb24gdG8gYnVpbGQgYSBDdXN0b21BY3Rpb24uIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZb3UgbXVzdCBzcGVjaWZ5IGEgbmFtZSB0byBidWlsZCBhIEN1c3RvbUFjdGlvbi4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGljb24gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZb3UgbXVzdCBzcGVjaWZ5IGFuIGljb24gcmVzb3VyY2UgaWQgdG8gYnVpbGQgYSBDdXN0b21BY3Rpb24uIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1BY3Rpb24gPSBhY3Rpb247CisgICAgICAgICAgICAgICAgbU5hbWUgPSBuYW1lOworICAgICAgICAgICAgICAgIG1JY29uID0gaWNvbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBTZXQgb3B0aW9uYWwgZXh0cmFzIGZvciB0aGUge0BsaW5rIEN1c3RvbUFjdGlvbn0uIFRoZXNlIGV4dHJhcyBhcmUgbWVhbnQgdG8gYmUKKyAgICAgICAgICAgICAqIGNvbnN1bWVkIGJ5IGEge0BsaW5rIE1lZGlhQ29udHJvbGxlcn0gaWYgaXQga25vd3MgaG93IHRvIGhhbmRsZSB0aGVtLgorICAgICAgICAgICAgICogS2V5cyBzaG91bGQgYmUgZnVsbHkgcXVhbGlmaWVkIChlLmcuICJjb20uZXhhbXBsZS5NWV9BUkciKSB0byBhdm9pZCBjb2xsaXNpb25zLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIEBwYXJhbSBleHRyYXMgT3B0aW9uYWwgZXh0cmFzIGZvciB0aGUge0BsaW5rIEN1c3RvbUFjdGlvbn0uCisgICAgICAgICAgICAgKiBAcmV0dXJuIHRoaXMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEV4dHJhcyhCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgICAgICAgICAgbUV4dHJhcyA9IGV4dHJhczsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBCdWlsZCBhbmQgcmV0dXJuIHRoZSB7QGxpbmsgQ3VzdG9tQWN0aW9ufSBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWVzLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIEByZXR1cm4gQSBuZXcge0BsaW5rIEN1c3RvbUFjdGlvbn0gaW5zdGFuY2UuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBDdXN0b21BY3Rpb24gYnVpbGQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDdXN0b21BY3Rpb24obUFjdGlvbiwgbU5hbWUsIG1JY29uLCBtRXh0cmFzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1aWxkZXIgZm9yIHtAbGluayBQbGF5YmFja1N0YXRlfSBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxQbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbj4gbUN1c3RvbUFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgICAgICBwcml2YXRlIGludCBtU3RhdGU7CisgICAgICAgIHByaXZhdGUgbG9uZyBtUG9zaXRpb247CisgICAgICAgIHByaXZhdGUgbG9uZyBtQnVmZmVyZWRQb3NpdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBtU3BlZWQ7CisgICAgICAgIHByaXZhdGUgbG9uZyBtQWN0aW9uczsKKyAgICAgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbUVycm9yTWVzc2FnZTsKKyAgICAgICAgcHJpdmF0ZSBsb25nIG1VcGRhdGVUaW1lOworICAgICAgICBwcml2YXRlIGxvbmcgbUFjdGl2ZUl0ZW1JZCA9IE1lZGlhU2Vzc2lvbi5RdWV1ZUl0ZW0uVU5LTk9XTl9JRDsKKyAgICAgICAgcHJpdmF0ZSBCdW5kbGUgbUV4dHJhczsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhbiBpbml0aWFsbHkgZW1wdHkgc3RhdGUgYnVpbGRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyKCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBidWlsZGVyIHdpdGggdGhlIHNhbWUgaW5pdGlhbCB2YWx1ZXMgYXMgdGhvc2UgaW4gdGhlIGZyb20KKyAgICAgICAgICogc3RhdGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBmcm9tIFRoZSBzdGF0ZSB0byB1c2UgZm9yIGluaXRpYWxpemluZyB0aGUgYnVpbGRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyKFBsYXliYWNrU3RhdGUgZnJvbSkgeworICAgICAgICAgICAgaWYgKGZyb20gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TdGF0ZSA9IGZyb20ubVN0YXRlOworICAgICAgICAgICAgbVBvc2l0aW9uID0gZnJvbS5tUG9zaXRpb247CisgICAgICAgICAgICBtQnVmZmVyZWRQb3NpdGlvbiA9IGZyb20ubUJ1ZmZlcmVkUG9zaXRpb247CisgICAgICAgICAgICBtU3BlZWQgPSBmcm9tLm1TcGVlZDsKKyAgICAgICAgICAgIG1BY3Rpb25zID0gZnJvbS5tQWN0aW9uczsKKyAgICAgICAgICAgIGlmIChmcm9tLm1DdXN0b21BY3Rpb25zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ3VzdG9tQWN0aW9ucy5hZGRBbGwoZnJvbS5tQ3VzdG9tQWN0aW9ucyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRXJyb3JNZXNzYWdlID0gZnJvbS5tRXJyb3JNZXNzYWdlOworICAgICAgICAgICAgbVVwZGF0ZVRpbWUgPSBmcm9tLm1VcGRhdGVUaW1lOworICAgICAgICAgICAgbUFjdGl2ZUl0ZW1JZCA9IGZyb20ubUFjdGl2ZUl0ZW1JZDsKKyAgICAgICAgICAgIG1FeHRyYXMgPSBmcm9tLm1FeHRyYXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIHBsYXliYWNrLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIHBvc2l0aW9uIG11c3QgYmUgaW4gbXMgYW5kIGluZGljYXRlcyB0aGUgY3VycmVudCBwbGF5YmFjaworICAgICAgICAgKiBwb3NpdGlvbiB3aXRoaW4gdGhlIGl0ZW0uIElmIHRoZSBwb3NpdGlvbiBpcyB1bmtub3duIHVzZQorICAgICAgICAgKiB7QGxpbmsgI1BMQVlCQUNLX1BPU0lUSU9OX1VOS05PV059LiBXaGVuIG5vdCB1c2luZyBhbiB1bmtub3duCisgICAgICAgICAqIHBvc2l0aW9uIHRoZSB0aW1lIGF0IHdoaWNoIHRoZSBwb3NpdGlvbiB3YXMgdXBkYXRlZCBtdXN0IGJlIHByb3ZpZGVkLgorICAgICAgICAgKiBJdCBpcyBva2F5IHRvIHVzZSB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lKCl9IGlmIHRoZQorICAgICAgICAgKiBjdXJyZW50IHBvc2l0aW9uIHdhcyBqdXN0IHJldHJpZXZlZC4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBzcGVlZCBpcyBhIG11bHRpcGxlIG9mIG5vcm1hbCBwbGF5YmFjayBhbmQgc2hvdWxkIGJlIDAgd2hlbgorICAgICAgICAgKiBwYXVzZWQgYW5kIG5lZ2F0aXZlIHdoZW4gcmV3aW5kaW5nLiBOb3JtYWwgcGxheWJhY2sgc3BlZWQgaXMgMS4wLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIHN0YXRlIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgICAgICAqIDx1bD4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9OT05FfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfU1RPUFBFRH08L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX1BMQVlJTkd9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9QQVVTRUR9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9GQVNUX0ZPUldBUkRJTkd9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9SRVdJTkRJTkd9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9CVUZGRVJJTkd9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9FUlJPUn08L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX0NPTk5FQ1RJTkd9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9TS0lQUElOR19UT19QUkVWSU9VU308L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX1NLSVBQSU5HX1RPX05FWFR9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9TS0lQUElOR19UT19RVUVVRV9JVEVNfTwvbGk+CisgICAgICAgICAqIDwvdWw+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzdGF0ZSBUaGUgY3VycmVudCBzdGF0ZSBvZiBwbGF5YmFjay4KKyAgICAgICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBpdGVtIGluIG1zLgorICAgICAgICAgKiBAcGFyYW0gcGxheWJhY2tTcGVlZCBUaGUgY3VycmVudCBzcGVlZCBvZiBwbGF5YmFjayBhcyBhIG11bHRpcGxlIG9mCisgICAgICAgICAqICAgICAgICAgICAgbm9ybWFsIHBsYXliYWNrLgorICAgICAgICAgKiBAcGFyYW0gdXBkYXRlVGltZSBUaGUgdGltZSBpbiB0aGUge0BsaW5rIFN5c3RlbUNsb2NrI2VsYXBzZWRSZWFsdGltZX0KKyAgICAgICAgICogICAgICAgICAgICB0aW1lYmFzZSB0aGF0IHRoZSBwb3NpdGlvbiB3YXMgdXBkYXRlZCBhdC4KKyAgICAgICAgICogQHJldHVybiB0aGlzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRTdGF0ZShAU3RhdGUgaW50IHN0YXRlLCBsb25nIHBvc2l0aW9uLCBmbG9hdCBwbGF5YmFja1NwZWVkLAorICAgICAgICAgICAgICAgIGxvbmcgdXBkYXRlVGltZSkgeworICAgICAgICAgICAgbVN0YXRlID0gc3RhdGU7CisgICAgICAgICAgICBtUG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICAgICAgICAgIG1VcGRhdGVUaW1lID0gdXBkYXRlVGltZTsKKyAgICAgICAgICAgIG1TcGVlZCA9IHBsYXliYWNrU3BlZWQ7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgcGxheWJhY2suCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgcG9zaXRpb24gbXVzdCBiZSBpbiBtcyBhbmQgaW5kaWNhdGVzIHRoZSBjdXJyZW50IHBsYXliYWNrCisgICAgICAgICAqIHBvc2l0aW9uIHdpdGhpbiB0aGUgaXRlbS4gSWYgdGhlIHBvc2l0aW9uIGlzIHVua25vd24gdXNlCisgICAgICAgICAqIHtAbGluayAjUExBWUJBQ0tfUE9TSVRJT05fVU5LTk9XTn0uIFRoZSB1cGRhdGUgdGltZSB3aWxsIGJlIHNldCB0bworICAgICAgICAgKiB0aGUgY3VycmVudCB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lKCl9LgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIHNwZWVkIGlzIGEgbXVsdGlwbGUgb2Ygbm9ybWFsIHBsYXliYWNrIGFuZCBzaG91bGQgYmUgMCB3aGVuCisgICAgICAgICAqIHBhdXNlZCBhbmQgbmVnYXRpdmUgd2hlbiByZXdpbmRpbmcuIE5vcm1hbCBwbGF5YmFjayBzcGVlZCBpcyAxLjAuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgc3RhdGUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAgICAgICAgICogPHVsPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX05PTkV9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9TVE9QUEVEfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfUExBWUlOR308L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX1BBVVNFRH08L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX0ZBU1RfRk9SV0FSRElOR308L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX1JFV0lORElOR308L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX0JVRkZFUklOR308L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX0VSUk9SfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfQ09OTkVDVElOR308L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX1NLSVBQSU5HX1RPX1BSRVZJT1VTfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfU0tJUFBJTkdfVE9fTkVYVH08L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX1NLSVBQSU5HX1RPX1FVRVVFX0lURU19PC9saT4KKyAgICAgICAgICogPC91bD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHN0YXRlIFRoZSBjdXJyZW50IHN0YXRlIG9mIHBsYXliYWNrLgorICAgICAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IGl0ZW0gaW4gbXMuCisgICAgICAgICAqIEBwYXJhbSBwbGF5YmFja1NwZWVkIFRoZSBjdXJyZW50IHNwZWVkIG9mIHBsYXliYWNrIGFzIGEgbXVsdGlwbGUgb2YKKyAgICAgICAgICogICAgICAgICAgICBub3JtYWwgcGxheWJhY2suCisgICAgICAgICAqIEByZXR1cm4gdGhpcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0U3RhdGUoQFN0YXRlIGludCBzdGF0ZSwgbG9uZyBwb3NpdGlvbiwgZmxvYXQgcGxheWJhY2tTcGVlZCkgeworICAgICAgICAgICAgcmV0dXJuIHNldFN0YXRlKHN0YXRlLCBwb3NpdGlvbiwgcGxheWJhY2tTcGVlZCwgU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgY3VycmVudCBhY3Rpb25zIGF2YWlsYWJsZSBvbiB0aGlzIHNlc3Npb24uIFRoaXMgc2hvdWxkIHVzZSBhCisgICAgICAgICAqIGJpdG1hc2sgb2YgcG9zc2libGUgYWN0aW9ucy4KKyAgICAgICAgICogPHVsPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9TS0lQX1RPX1BSRVZJT1VTfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1JFV0lORH08L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9QTEFZfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1BBVVNFfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1NUT1B9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNBQ1RJT05fRkFTVF9GT1JXQVJEfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1NLSVBfVE9fTkVYVH08L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9TRUVLX1RPfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1NFVF9SQVRJTkd9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNBQ1RJT05fUExBWV9QQVVTRX08L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9QTEFZX0ZST01fTUVESUFfSUR9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNBQ1RJT05fUExBWV9GUk9NX1NFQVJDSH08L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9TS0lQX1RPX1FVRVVFX0lURU19PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNBQ1RJT05fUExBWV9GUk9NX1VSSX08L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9QUkVQQVJFfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1BSRVBBUkVfRlJPTV9NRURJQV9JRH08L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9QUkVQQVJFX0ZST01fU0VBUkNIfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1BSRVBBUkVfRlJPTV9VUkl9PC9saT4KKyAgICAgICAgICogPC91bD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFjdGlvbnMgVGhlIHNldCBvZiBhY3Rpb25zIGFsbG93ZWQuCisgICAgICAgICAqIEByZXR1cm4gdGhpcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0QWN0aW9ucyhAQWN0aW9ucyBsb25nIGFjdGlvbnMpIHsKKyAgICAgICAgICAgIG1BY3Rpb25zID0gYWN0aW9uczsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBhIGN1c3RvbSBhY3Rpb24gdG8gdGhlIHBsYXliYWNrIHN0YXRlLiBBY3Rpb25zIGNhbiBiZSB1c2VkIHRvCisgICAgICAgICAqIGV4cG9zZSBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8ge0BsaW5rIE1lZGlhQ29udHJvbGxlcgorICAgICAgICAgKiBNZWRpYUNvbnRyb2xsZXJzfSBiZXlvbmQgd2hhdCBpcyBvZmZlcmVkIGJ5IHRoZSBzdGFuZGFyZCB0cmFuc3BvcnQKKyAgICAgICAgICogY29udHJvbHMuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBlLmcuIHN0YXJ0IGEgcmFkaW8gc3RhdGlvbiBiYXNlZCBvbiB0aGUgY3VycmVudCBpdGVtIG9yIHNraXAgYWhlYWQgYnkKKyAgICAgICAgICogMzAgc2Vjb25kcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFjdGlvbiBBbiBpZGVudGlmaWVyIGZvciB0aGlzIGFjdGlvbi4gSXQgY2FuIGJlIHNlbnQgYmFjayB0bworICAgICAgICAgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgTWVkaWFTZXNzaW9ufSB0aHJvdWdoCisgICAgICAgICAqICAgICAgICAgICAge0BsaW5rIE1lZGlhQ29udHJvbGxlci5UcmFuc3BvcnRDb250cm9scyNzZW5kQ3VzdG9tQWN0aW9uKFN0cmluZywgQnVuZGxlKX0uCisgICAgICAgICAqIEBwYXJhbSBuYW1lIFRoZSBkaXNwbGF5IG5hbWUgZm9yIHRoZSBhY3Rpb24uIElmIHRleHQgaXMgc2hvd24gd2l0aAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBhY3Rpb24gb3IgdXNlZCBmb3IgYWNjZXNzaWJpbGl0eSwgdGhpcyBpcyB3aGF0IHNob3VsZAorICAgICAgICAgKiAgICAgICAgICAgIGJlIHVzZWQuCisgICAgICAgICAqIEBwYXJhbSBpY29uIFRoZSByZXNvdXJjZSBhY3Rpb24gb2YgdGhlIGljb24gdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkCisgICAgICAgICAqICAgICAgICAgICAgZm9yIHRoZSBhY3Rpb24uIFRoZSByZXNvdXJjZSBzaG91bGQgYmUgaW4gdGhlIHBhY2thZ2Ugb2YKKyAgICAgICAgICogICAgICAgICAgICB0aGUge0BsaW5rIE1lZGlhU2Vzc2lvbn0uCisgICAgICAgICAqIEByZXR1cm4gdGhpcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkQ3VzdG9tQWN0aW9uKFN0cmluZyBhY3Rpb24sIFN0cmluZyBuYW1lLCBpbnQgaWNvbikgeworICAgICAgICAgICAgcmV0dXJuIGFkZEN1c3RvbUFjdGlvbihuZXcgUGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24oYWN0aW9uLCBuYW1lLCBpY29uLCBudWxsKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGEgY3VzdG9tIGFjdGlvbiB0byB0aGUgcGxheWJhY2sgc3RhdGUuIEFjdGlvbnMgY2FuIGJlIHVzZWQgdG8gZXhwb3NlIGFkZGl0aW9uYWwKKyAgICAgICAgICogZnVuY3Rpb25hbGl0eSB0byB7QGxpbmsgTWVkaWFDb250cm9sbGVyIE1lZGlhQ29udHJvbGxlcnN9IGJleW9uZCB3aGF0IGlzIG9mZmVyZWQgYnkgdGhlCisgICAgICAgICAqIHN0YW5kYXJkIHRyYW5zcG9ydCBjb250cm9scy4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIEFuIGV4YW1wbGUgb2YgYW4gYWN0aW9uIHdvdWxkIGJlIHRvIHN0YXJ0IGEgcmFkaW8gc3RhdGlvbiBiYXNlZCBvbiB0aGUgY3VycmVudCBpdGVtCisgICAgICAgICAqIG9yIHRvIHNraXAgYWhlYWQgYnkgMzAgc2Vjb25kcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGN1c3RvbUFjdGlvbiBUaGUgY3VzdG9tIGFjdGlvbiB0byBhZGQgdG8gdGhlIHtAbGluayBQbGF5YmFja1N0YXRlfS4KKyAgICAgICAgICogQHJldHVybiB0aGlzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRDdXN0b21BY3Rpb24oUGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24gY3VzdG9tQWN0aW9uKSB7CisgICAgICAgICAgICBpZiAoY3VzdG9tQWN0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIllvdSBtYXkgbm90IGFkZCBhIG51bGwgQ3VzdG9tQWN0aW9uIHRvIFBsYXliYWNrU3RhdGUuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ3VzdG9tQWN0aW9ucy5hZGQoY3VzdG9tQWN0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgY3VycmVudCBidWZmZXJlZCBwb3NpdGlvbiBpbiBtcy4gVGhpcyBpcyB0aGUgZmFydGhlc3QKKyAgICAgICAgICogcGxheWJhY2sgcG9pbnQgdGhhdCBjYW4gYmUgcmVhY2hlZCBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIHVzaW5nCisgICAgICAgICAqIG9ubHkgYnVmZmVyZWQgY29udGVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGJ1ZmZlcmVkUG9zaXRpb24gVGhlIHBvc2l0aW9uIGluIG1zIHRoYXQgcGxheWJhY2sgaXMgYnVmZmVyZWQKKyAgICAgICAgICogICAgICAgICAgICB0by4KKyAgICAgICAgICogQHJldHVybiB0aGlzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRCdWZmZXJlZFBvc2l0aW9uKGxvbmcgYnVmZmVyZWRQb3NpdGlvbikgeworICAgICAgICAgICAgbUJ1ZmZlcmVkUG9zaXRpb24gPSBidWZmZXJlZFBvc2l0aW9uOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBhY3RpdmUgaXRlbSBpbiB0aGUgcGxheSBxdWV1ZSBieSBzcGVjaWZ5aW5nIGl0cyBpZC4gVGhlCisgICAgICAgICAqIGRlZmF1bHQgdmFsdWUgaXMge0BsaW5rIE1lZGlhU2Vzc2lvbi5RdWV1ZUl0ZW0jVU5LTk9XTl9JRH0KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgYWN0aXZlIGl0ZW0uCisgICAgICAgICAqIEByZXR1cm4gdGhpcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0QWN0aXZlUXVldWVJdGVtSWQobG9uZyBpZCkgeworICAgICAgICAgICAgbUFjdGl2ZUl0ZW1JZCA9IGlkOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IGEgdXNlciByZWFkYWJsZSBlcnJvciBtZXNzYWdlLiBUaGlzIHNob3VsZCBiZSBzZXQgd2hlbiB0aGUgc3RhdGUKKyAgICAgICAgICogaXMge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfRVJST1J9LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZXJyb3IgVGhlIGVycm9yIG1lc3NhZ2UgZm9yIGRpc3BsYXkgdG8gdGhlIHVzZXIuCisgICAgICAgICAqIEByZXR1cm4gdGhpcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RXJyb3JNZXNzYWdlKENoYXJTZXF1ZW5jZSBlcnJvcikgeworICAgICAgICAgICAgbUVycm9yTWVzc2FnZSA9IGVycm9yOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IGFueSBjdXN0b20gZXh0cmFzIHRvIGJlIGluY2x1ZGVkIHdpdGggdGhlIHBsYXliYWNrIHN0YXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZXh0cmFzIFRoZSBleHRyYXMgdG8gaW5jbHVkZS4KKyAgICAgICAgICogQHJldHVybiB0aGlzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRFeHRyYXMoQnVuZGxlIGV4dHJhcykgeworICAgICAgICAgICAgbUV4dHJhcyA9IGV4dHJhczsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1aWxkIGFuZCByZXR1cm4gdGhlIHtAbGluayBQbGF5YmFja1N0YXRlfSBpbnN0YW5jZSB3aXRoIHRoZXNlCisgICAgICAgICAqIHZhbHVlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBBIG5ldyBzdGF0ZSBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBQbGF5YmFja1N0YXRlIGJ1aWxkKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBQbGF5YmFja1N0YXRlKG1TdGF0ZSwgbVBvc2l0aW9uLCBtVXBkYXRlVGltZSwgbVNwZWVkLCBtQnVmZmVyZWRQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgbUFjdGlvbnMsIG1DdXN0b21BY3Rpb25zLCBtQWN0aXZlSXRlbUlkLCBtRXJyb3JNZXNzYWdlLCBtRXh0cmFzKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9zZXJ2aWNlL21lZGlhL0lNZWRpYUJyb3dzZXJTZXJ2aWNlLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvc2VydmljZS9tZWRpYS9JTWVkaWFCcm93c2VyU2VydmljZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZjQxZjYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvc2VydmljZS9tZWRpYS9JTWVkaWFCcm93c2VyU2VydmljZS5haWRsCkBAIC0wLDAgKzEsMjcgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2aWNlLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5tZWRpYS5JTWVkaWFCcm93c2VyU2VydmljZUNhbGxiYWNrczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKKworLyoqCisgKiBNZWRpYSBBUEkgYWxsb3dzIGNsaWVudHMgdG8gYnJvd3NlIHRocm91Z2ggaGllcmFyY2h5IG9mIGEgdXNlcuKAmXMgbWVkaWEgY29sbGVjdGlvbiwKKyAqIHBsYXliYWNrIGEgc3BlY2lmaWMgbWVkaWEgZW50cnkgYW5kIGludGVyYWN0IHdpdGggdGhlIG5vdyBwbGF5aW5nIHF1ZXVlLgorICogQGhpZGUKKyAqLworb25ld2F5IGludGVyZmFjZSBJTWVkaWFCcm93c2VyU2VydmljZSB7CisgICAgdm9pZCBjb25uZWN0KFN0cmluZyBwa2csIGluIEJ1bmRsZSByb290SGludHMsIElNZWRpYUJyb3dzZXJTZXJ2aWNlQ2FsbGJhY2tzIGNhbGxiYWNrcyk7CisgICAgdm9pZCBkaXNjb25uZWN0KElNZWRpYUJyb3dzZXJTZXJ2aWNlQ2FsbGJhY2tzIGNhbGxiYWNrcyk7CisKKyAgICB2b2lkIGFkZFN1YnNjcmlwdGlvbkRlcHJlY2F0ZWQoU3RyaW5nIHVyaSwgSU1lZGlhQnJvd3NlclNlcnZpY2VDYWxsYmFja3MgY2FsbGJhY2tzKTsKKyAgICB2b2lkIHJlbW92ZVN1YnNjcmlwdGlvbkRlcHJlY2F0ZWQoU3RyaW5nIHVyaSwgSU1lZGlhQnJvd3NlclNlcnZpY2VDYWxsYmFja3MgY2FsbGJhY2tzKTsKKworICAgIHZvaWQgZ2V0TWVkaWFJdGVtKFN0cmluZyB1cmksIGluIFJlc3VsdFJlY2VpdmVyIGNiLCBJTWVkaWFCcm93c2VyU2VydmljZUNhbGxiYWNrcyBjYWxsYmFja3MpOworICAgIHZvaWQgYWRkU3Vic2NyaXB0aW9uKFN0cmluZyB1cmksIGluIElCaW5kZXIgdG9rZW4sIGluIEJ1bmRsZSBvcHRpb25zLAorICAgICAgICAgICAgSU1lZGlhQnJvd3NlclNlcnZpY2VDYWxsYmFja3MgY2FsbGJhY2tzKTsKKyAgICB2b2lkIHJlbW92ZVN1YnNjcmlwdGlvbihTdHJpbmcgdXJpLCBpbiBJQmluZGVyIHRva2VuLCBJTWVkaWFCcm93c2VyU2VydmljZUNhbGxiYWNrcyBjYWxsYmFja3MpOworfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL3NlcnZpY2UvbWVkaWEvSU1lZGlhQnJvd3NlclNlcnZpY2VDYWxsYmFja3MuYWlkbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9zZXJ2aWNlL21lZGlhL0lNZWRpYUJyb3dzZXJTZXJ2aWNlQ2FsbGJhY2tzLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRjNDgwZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9zZXJ2aWNlL21lZGlhL0lNZWRpYUJyb3dzZXJTZXJ2aWNlQ2FsbGJhY2tzLmFpZGwKQEAgLTAsMCArMSwyOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworcGFja2FnZSBhbmRyb2lkLnNlcnZpY2UubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGFyY2VsZWRMaXN0U2xpY2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworLyoqCisgKiBNZWRpYSBBUEkgYWxsb3dzIGNsaWVudHMgdG8gYnJvd3NlIHRocm91Z2ggaGllcmFyY2h5IG9mIGEgdXNlcuKAmXMgbWVkaWEgY29sbGVjdGlvbiwKKyAqIHBsYXliYWNrIGEgc3BlY2lmaWMgbWVkaWEgZW50cnkgYW5kIGludGVyYWN0IHdpdGggdGhlIG5vdyBwbGF5aW5nIHF1ZXVlLgorICogQGhpZGUKKyAqLworb25ld2F5IGludGVyZmFjZSBJTWVkaWFCcm93c2VyU2VydmljZUNhbGxiYWNrcyB7CisgICAgLyoqCisgICAgICogSW52b2tlZCB3aGVuIHRoZSBjb25uZWN0ZWQgaGFzIGJlZW4gZXN0YWJsaXNoZWQuCisgICAgICogQHBhcmFtIHJvb3QgVGhlIHJvb3QgbWVkaWEgaWQgZm9yIGJyb3dzaW5nLgorICAgICAqIEBwYXJhbSBzZXNzaW9uIFRoZSB7QGxpbmsgTWVkaWFTZXNzaW9uLlRva2VuIG1lZGlhIHNlc3Npb24gdG9rZW59IHRoYXQgY2FuIGJlIHVzZWQgdG8gY29udHJvbAorICAgICAqICAgICAgICAgdGhlIHBsYXliYWNrIG9mIHRoZSBtZWRpYSBhcHAuCisgICAgICogQHBhcmFtIGV4dHJhIEV4dHJhcyByZXR1cm5lZCBieSB0aGUgbWVkaWEgc2VydmljZS4KKyAgICAgKi8KKyAgICB2b2lkIG9uQ29ubmVjdChTdHJpbmcgcm9vdCwgaW4gTWVkaWFTZXNzaW9uLlRva2VuIHNlc3Npb24sIGluIEJ1bmRsZSBleHRyYXMpOworICAgIHZvaWQgb25Db25uZWN0RmFpbGVkKCk7CisgICAgdm9pZCBvbkxvYWRDaGlsZHJlbihTdHJpbmcgbWVkaWFJZCwgaW4gTWVkaWFQYXJjZWxlZExpc3RTbGljZSBsaXN0KTsKKyAgICB2b2lkIG9uTG9hZENoaWxkcmVuV2l0aE9wdGlvbnMoU3RyaW5nIG1lZGlhSWQsIGluIE1lZGlhUGFyY2VsZWRMaXN0U2xpY2UgbGlzdCwKKyAgICAgICAgICAgIGluIEJ1bmRsZSBvcHRpb25zKTsKK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9zZXJ2aWNlL21lZGlhL01lZGlhQnJvd3NlclNlcnZpY2UuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9zZXJ2aWNlL21lZGlhL01lZGlhQnJvd3NlclNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjZlYzM1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL3NlcnZpY2UvbWVkaWEvTWVkaWFCcm93c2VyU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsODU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlcnZpY2UubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uSW50RGVmOworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU2RrQ29uc3RhbnQ7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlNka0NvbnN0YW50LlNka0NvbnN0YW50VHlwZTsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uVW5zdXBwb3J0ZWRBcHBVc2FnZTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQYXJjZWxlZExpc3RTbGljZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmJyb3dzZS5NZWRpYUJyb3dzZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5icm93c2UuTWVkaWFCcm93c2VyVXRpbHM7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbk1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbk1hbmFnZXIuUmVtb3RlVXNlckluZm87CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLm1lZGlhLklNZWRpYUJyb3dzZXJTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5tZWRpYS5JTWVkaWFCcm93c2VyU2VydmljZUNhbGxiYWNrczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5BcnJheU1hcDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOworCitpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIG1lZGlhIGJyb3dzZXIgc2VydmljZXMuCisgKiA8cD4KKyAqIE1lZGlhIGJyb3dzZXIgc2VydmljZXMgZW5hYmxlIGFwcGxpY2F0aW9ucyB0byBicm93c2UgbWVkaWEgY29udGVudCBwcm92aWRlZCBieSBhbiBhcHBsaWNhdGlvbgorICogYW5kIGFzayB0aGUgYXBwbGljYXRpb24gdG8gc3RhcnQgcGxheWluZyBpdC4gVGhleSBtYXkgYWxzbyBiZSB1c2VkIHRvIGNvbnRyb2wgY29udGVudCB0aGF0CisgKiBpcyBhbHJlYWR5IHBsYXlpbmcgYnkgd2F5IG9mIGEge0BsaW5rIE1lZGlhU2Vzc2lvbn0uCisgKiA8L3A+CisgKgorICogVG8gZXh0ZW5kIHRoaXMgY2xhc3MsIHlvdSBtdXN0IGRlY2xhcmUgdGhlIHNlcnZpY2UgaW4geW91ciBtYW5pZmVzdCBmaWxlIHdpdGgKKyAqIGFuIGludGVudCBmaWx0ZXIgd2l0aCB0aGUge0BsaW5rICNTRVJWSUNFX0lOVEVSRkFDRX0gYWN0aW9uLgorICoKKyAqIEZvciBleGFtcGxlOgorICogPC9wPjxwcmU+CisgKiAmbHQ7c2VydmljZSBhbmRyb2lkOm5hbWU9Ii5NeU1lZGlhQnJvd3NlclNlcnZpY2UiCisgKiAgICAgICAgICBhbmRyb2lkOmxhYmVsPSImIzY0O3N0cmluZy9zZXJ2aWNlX25hbWUiID4KKyAqICAgICAmbHQ7aW50ZW50LWZpbHRlcj4KKyAqICAgICAgICAgJmx0O2FjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQubWVkaWEuYnJvd3NlLk1lZGlhQnJvd3NlclNlcnZpY2UiIC8+CisgKiAgICAgJmx0Oy9pbnRlbnQtZmlsdGVyPgorICogJmx0Oy9zZXJ2aWNlPgorICogPC9wcmU+CisgKgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWVkaWFCcm93c2VyU2VydmljZSBleHRlbmRzIFNlcnZpY2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFCcm93c2VyU2VydmljZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFRoZSB7QGxpbmsgSW50ZW50fSB0aGF0IG11c3QgYmUgZGVjbGFyZWQgYXMgaGFuZGxlZCBieSB0aGUgc2VydmljZS4KKyAgICAgKi8KKyAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLlNFUlZJQ0VfQUNUSU9OKQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfSU5URVJGQUNFID0gImFuZHJvaWQubWVkaWEuYnJvd3NlLk1lZGlhQnJvd3NlclNlcnZpY2UiOworCisgICAgLyoqCisgICAgICogQSBrZXkgZm9yIHBhc3NpbmcgdGhlIE1lZGlhSXRlbSB0byB0aGUgUmVzdWx0UmVjZWl2ZXIgaW4gZ2V0SXRlbS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX01FRElBX0lURU0gPSAibWVkaWFfaXRlbSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVTVUxUX0ZMQUdfT1BUSU9OX05PVF9IQU5ETEVEID0gMSA8PCAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNVTFRfRkxBR19PTl9MT0FEX0lURU1fTk9UX0lNUExFTUVOVEVEID0gMSA8PCAxOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFU1VMVF9FUlJPUiA9IC0xOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNVTFRfT0sgPSAwOworCisgICAgLyoqIEBoaWRlICovCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQorICAgIEBJbnREZWYoZmxhZz10cnVlLCB2YWx1ZSA9IHsgUkVTVUxUX0ZMQUdfT1BUSU9OX05PVF9IQU5ETEVELAorICAgICAgICAgICAgUkVTVUxUX0ZMQUdfT05fTE9BRF9JVEVNX05PVF9JTVBMRU1FTlRFRCB9KQorICAgIHByaXZhdGUgQGludGVyZmFjZSBSZXN1bHRGbGFncyB7IH0KKworICAgIHByaXZhdGUgZmluYWwgQXJyYXlNYXA8SUJpbmRlciwgQ29ubmVjdGlvblJlY29yZD4gbUNvbm5lY3Rpb25zID0gbmV3IEFycmF5TWFwPD4oKTsKKyAgICBwcml2YXRlIENvbm5lY3Rpb25SZWNvcmQgbUN1ckNvbm5lY3Rpb247CisgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKyAgICBwcml2YXRlIFNlcnZpY2VCaW5kZXIgbUJpbmRlcjsKKyAgICBNZWRpYVNlc3Npb24uVG9rZW4gbVNlc3Npb247CisKKyAgICAvKioKKyAgICAgKiBBbGwgdGhlIGluZm8gYWJvdXQgYSBjb25uZWN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgQ29ubmVjdGlvblJlY29yZCBpbXBsZW1lbnRzIElCaW5kZXIuRGVhdGhSZWNpcGllbnQgeworICAgICAgICBTdHJpbmcgcGtnOworICAgICAgICBpbnQgdWlkOworICAgICAgICBpbnQgcGlkOworICAgICAgICBCdW5kbGUgcm9vdEhpbnRzOworICAgICAgICBJTWVkaWFCcm93c2VyU2VydmljZUNhbGxiYWNrcyBjYWxsYmFja3M7CisgICAgICAgIEJyb3dzZXJSb290IHJvb3Q7CisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBMaXN0PFBhaXI8SUJpbmRlciwgQnVuZGxlPj4+IHN1YnNjcmlwdGlvbnMgPSBuZXcgSGFzaE1hcDw+KCk7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGJpbmRlckRpZWQoKSB7CisgICAgICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9ucy5yZW1vdmUoY2FsbGJhY2tzLmFzQmluZGVyKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGxldGlvbiBoYW5kbGVyIGZvciBhc3luY2hyb25vdXMgY2FsbGJhY2sgbWV0aG9kcyBpbiB7QGxpbmsgTWVkaWFCcm93c2VyU2VydmljZX0uCisgICAgICogPHA+CisgICAgICogRWFjaCBvZiB0aGUgbWV0aG9kcyB0aGF0IHRha2VzIG9uZSBvZiB0aGVzZSB0byBzZW5kIHRoZSByZXN1bHQgbXVzdCBjYWxsCisgICAgICoge0BsaW5rICNzZW5kUmVzdWx0fSB0byByZXNwb25kIHRvIHRoZSBjYWxsZXIgd2l0aCB0aGUgZ2l2ZW4gcmVzdWx0cy4gSWYgdGhvc2UKKyAgICAgKiBmdW5jdGlvbnMgcmV0dXJuIHdpdGhvdXQgY2FsbGluZyB7QGxpbmsgI3NlbmRSZXN1bHR9LCB0aGV5IG11c3QgaW5zdGVhZCBjYWxsCisgICAgICoge0BsaW5rICNkZXRhY2h9IGJlZm9yZSByZXR1cm5pbmcsIGFuZCB0aGVuIG1heSBjYWxsIHtAbGluayAjc2VuZFJlc3VsdH0gd2hlbgorICAgICAqIHRoZXkgYXJlIGRvbmUuIElmIG1vcmUgdGhhbiBvbmUgb2YgdGhvc2UgbWV0aG9kcyBpcyBjYWxsZWQsIGFuIGV4Y2VwdGlvbiB3aWxsCisgICAgICogYmUgdGhyb3duLgorICAgICAqCisgICAgICogQHNlZSAjb25Mb2FkQ2hpbGRyZW4KKyAgICAgKiBAc2VlICNvbkxvYWRJdGVtCisgICAgICovCisgICAgcHVibGljIGNsYXNzIFJlc3VsdDxUPiB7CisgICAgICAgIHByaXZhdGUgT2JqZWN0IG1EZWJ1ZzsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1EZXRhY2hDYWxsZWQ7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtU2VuZFJlc3VsdENhbGxlZDsKKyAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUZsYWdzOworCisgICAgICAgIFJlc3VsdChPYmplY3QgZGVidWcpIHsKKyAgICAgICAgICAgIG1EZWJ1ZyA9IGRlYnVnOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNlbmQgdGhlIHJlc3VsdCBiYWNrIHRvIHRoZSBjYWxsZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZW5kUmVzdWx0KFQgcmVzdWx0KSB7CisgICAgICAgICAgICBpZiAobVNlbmRSZXN1bHRDYWxsZWQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJzZW5kUmVzdWx0KCkgY2FsbGVkIHR3aWNlIGZvcjogIiArIG1EZWJ1Zyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU2VuZFJlc3VsdENhbGxlZCA9IHRydWU7CisgICAgICAgICAgICBvblJlc3VsdFNlbnQocmVzdWx0LCBtRmxhZ3MpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERldGFjaCB0aGlzIG1lc3NhZ2UgZnJvbSB0aGUgY3VycmVudCB0aHJlYWQgYW5kIGFsbG93IHRoZSB7QGxpbmsgI3NlbmRSZXN1bHR9CisgICAgICAgICAqIGNhbGwgdG8gaGFwcGVuIGxhdGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgZGV0YWNoKCkgeworICAgICAgICAgICAgaWYgKG1EZXRhY2hDYWxsZWQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkZXRhY2goKSBjYWxsZWQgd2hlbiBkZXRhY2goKSBoYWQgYWxyZWFkeSIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBiZWVuIGNhbGxlZCBmb3I6ICIgKyBtRGVidWcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1TZW5kUmVzdWx0Q2FsbGVkKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGV0YWNoKCkgY2FsbGVkIHdoZW4gc2VuZFJlc3VsdCgpIGhhZCBhbHJlYWR5IgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJlZW4gY2FsbGVkIGZvcjogIiArIG1EZWJ1Zyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRGV0YWNoQ2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gaXNEb25lKCkgeworICAgICAgICAgICAgcmV0dXJuIG1EZXRhY2hDYWxsZWQgfHwgbVNlbmRSZXN1bHRDYWxsZWQ7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldEZsYWdzKEBSZXN1bHRGbGFncyBpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIG1GbGFncyA9IGZsYWdzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSByZXN1bHQgaXMgc2VudCwgYWZ0ZXIgYXNzZXJ0aW9ucyBhYm91dCBub3QgYmVpbmcgY2FsbGVkIHR3aWNlCisgICAgICAgICAqIGhhdmUgaGFwcGVuZWQuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uUmVzdWx0U2VudChUIHJlc3VsdCwgQFJlc3VsdEZsYWdzIGludCBmbGFncykgeworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBTZXJ2aWNlQmluZGVyIGV4dGVuZHMgSU1lZGlhQnJvd3NlclNlcnZpY2UuU3R1YiB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjb25uZWN0KGZpbmFsIFN0cmluZyBwa2csIGZpbmFsIEJ1bmRsZSByb290SGludHMsCisgICAgICAgICAgICAgICAgZmluYWwgSU1lZGlhQnJvd3NlclNlcnZpY2VDYWxsYmFja3MgY2FsbGJhY2tzKSB7CisKKyAgICAgICAgICAgIGZpbmFsIGludCBwaWQgPSBCaW5kZXIuZ2V0Q2FsbGluZ1BpZCgpOworICAgICAgICAgICAgZmluYWwgaW50IHVpZCA9IEJpbmRlci5nZXRDYWxsaW5nVWlkKCk7CisgICAgICAgICAgICBpZiAoIWlzVmFsaWRQYWNrYWdlKHBrZywgdWlkKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBhY2thZ2UvdWlkIG1pc21hdGNoOiB1aWQ9IiArIHVpZAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHBhY2thZ2U9IiArIHBrZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUJpbmRlciBiID0gY2FsbGJhY2tzLmFzQmluZGVyKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIG91dCB0aGUgb2xkIHN1YnNjcmlwdGlvbnMuIFdlIGFyZSBnZXR0aW5nIG5ldyBvbmVzLgorICAgICAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25zLnJlbW92ZShiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29ubmVjdGlvblJlY29yZCBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb25SZWNvcmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ucGtnID0gcGtnOworICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5waWQgPSBwaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnVpZCA9IHVpZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ucm9vdEhpbnRzID0gcm9vdEhpbnRzOworICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5jYWxsYmFja3MgPSBjYWxsYmFja3M7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJDb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ucm9vdCA9IE1lZGlhQnJvd3NlclNlcnZpY2UudGhpcy5vbkdldFJvb3QocGtnLCB1aWQsIHJvb3RIaW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ3VyQ29ubmVjdGlvbiA9IG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXkgZGlkbid0IHJldHVybiBzb21ldGhpbmcsIGRvbid0IGFsbG93IHRoaXMgY2xpZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24ucm9vdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiTm8gcm9vdCBmb3IgY2xpZW50ICIgKyBwa2cgKyAiIGZyb20gc2VydmljZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3Mub25Db25uZWN0RmFpbGVkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbGxpbmcgb25Db25uZWN0RmFpbGVkKCkgZmFpbGVkLiBJZ25vcmluZy4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInBrZz0iICsgcGtnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9ucy5wdXQoYiwgY29ubmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIubGlua1RvRGVhdGgoY29ubmVjdGlvbiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3Mub25Db25uZWN0KGNvbm5lY3Rpb24ucm9vdC5nZXRSb290SWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb24sIGNvbm5lY3Rpb24ucm9vdC5nZXRFeHRyYXMoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2FsbGluZyBvbkNvbm5lY3QoKSBmYWlsZWQuIERyb3BwaW5nIGNsaWVudC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInBrZz0iICsgcGtnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25zLnJlbW92ZShiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBkaXNjb25uZWN0KGZpbmFsIElNZWRpYUJyb3dzZXJTZXJ2aWNlQ2FsbGJhY2tzIGNhbGxiYWNrcykgeworICAgICAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJQmluZGVyIGIgPSBjYWxsYmFja3MuYXNCaW5kZXIoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgb3V0IHRoZSBvbGQgc3Vic2NyaXB0aW9ucy4gV2UgYXJlIGdldHRpbmcgbmV3IG9uZXMuCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb25uZWN0aW9uUmVjb3JkIG9sZCA9IG1Db25uZWN0aW9ucy5yZW1vdmUoYik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkLmNhbGxiYWNrcy5hc0JpbmRlcigpLnVubGlua1RvRGVhdGgob2xkLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZFN1YnNjcmlwdGlvbkRlcHJlY2F0ZWQoU3RyaW5nIGlkLCBJTWVkaWFCcm93c2VyU2VydmljZUNhbGxiYWNrcyBjYWxsYmFja3MpIHsKKyAgICAgICAgICAgIC8vIGRvLW5vdGhpbmcKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBhZGRTdWJzY3JpcHRpb24oZmluYWwgU3RyaW5nIGlkLCBmaW5hbCBJQmluZGVyIHRva2VuLCBmaW5hbCBCdW5kbGUgb3B0aW9ucywKKyAgICAgICAgICAgICAgICBmaW5hbCBJTWVkaWFCcm93c2VyU2VydmljZUNhbGxiYWNrcyBjYWxsYmFja3MpIHsKKyAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUJpbmRlciBiID0gY2FsbGJhY2tzLmFzQmluZGVyKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgcmVjb3JkIGZvciB0aGUgY29ubmVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29ubmVjdGlvblJlY29yZCBjb25uZWN0aW9uID0gbUNvbm5lY3Rpb25zLmdldChiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25uZWN0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJhZGRTdWJzY3JpcHRpb24gZm9yIGNhbGxiYWNrIHRoYXQgaXNuJ3QgcmVnaXN0ZXJlZCBpZD0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFCcm93c2VyU2VydmljZS50aGlzLmFkZFN1YnNjcmlwdGlvbihpZCwgY29ubmVjdGlvbiwgdG9rZW4sIG9wdGlvbnMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlU3Vic2NyaXB0aW9uRGVwcmVjYXRlZChTdHJpbmcgaWQsIElNZWRpYUJyb3dzZXJTZXJ2aWNlQ2FsbGJhY2tzIGNhbGxiYWNrcykgeworICAgICAgICAgICAgLy8gZG8tbm90aGluZworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZVN1YnNjcmlwdGlvbihmaW5hbCBTdHJpbmcgaWQsIGZpbmFsIElCaW5kZXIgdG9rZW4sCisgICAgICAgICAgICAgICAgZmluYWwgSU1lZGlhQnJvd3NlclNlcnZpY2VDYWxsYmFja3MgY2FsbGJhY2tzKSB7CisgICAgICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIElCaW5kZXIgYiA9IGNhbGxiYWNrcy5hc0JpbmRlcigpOworCisgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25SZWNvcmQgY29ubmVjdGlvbiA9IG1Db25uZWN0aW9ucy5nZXQoYik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb25uZWN0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInJlbW92ZVN1YnNjcmlwdGlvbiBmb3IgY2FsbGJhY2sgdGhhdCBpc24ndCByZWdpc3RlcmVkIGlkPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFNZWRpYUJyb3dzZXJTZXJ2aWNlLnRoaXMucmVtb3ZlU3Vic2NyaXB0aW9uKGlkLCBjb25uZWN0aW9uLCB0b2tlbikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInJlbW92ZVN1YnNjcmlwdGlvbiBjYWxsZWQgZm9yICIgKyBpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgd2hpY2ggaXMgbm90IHN1YnNjcmliZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGdldE1lZGlhSXRlbShmaW5hbCBTdHJpbmcgbWVkaWFJZCwgZmluYWwgUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgZmluYWwgSU1lZGlhQnJvd3NlclNlcnZpY2VDYWxsYmFja3MgY2FsbGJhY2tzKSB7CisgICAgICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIElCaW5kZXIgYiA9IGNhbGxiYWNrcy5hc0JpbmRlcigpOworICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uUmVjb3JkIGNvbm5lY3Rpb24gPSBtQ29ubmVjdGlvbnMuZ2V0KGIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJnZXRNZWRpYUl0ZW0gZm9yIGNhbGxiYWNrIHRoYXQgaXNuJ3QgcmVnaXN0ZXJlZCBpZD0iICsgbWVkaWFJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcGVyZm9ybUxvYWRJdGVtKG1lZGlhSWQsIGNvbm5lY3Rpb24sIHJlY2VpdmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKCkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZSgpOworICAgICAgICBtQmluZGVyID0gbmV3IFNlcnZpY2VCaW5kZXIoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICBpZiAoU0VSVklDRV9JTlRFUkZBQ0UuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBtQmluZGVyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGR1bXAoRmlsZURlc2NyaXB0b3IgZmQsIFByaW50V3JpdGVyIHdyaXRlciwgU3RyaW5nW10gYXJncykgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB0byBnZXQgdGhlIHJvb3QgaW5mb3JtYXRpb24gZm9yIGJyb3dzaW5nIGJ5IGEgcGFydGljdWxhciBjbGllbnQuCisgICAgICogPHA+CisgICAgICogVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCB2ZXJpZnkgdGhhdCB0aGUgY2xpZW50IHBhY2thZ2UgaGFzIHBlcm1pc3Npb24KKyAgICAgKiB0byBhY2Nlc3MgYnJvd3NlIG1lZGlhIGluZm9ybWF0aW9uIGJlZm9yZSByZXR1cm5pbmcgdGhlIHJvb3QgaWQ7IGl0CisgICAgICogc2hvdWxkIHJldHVybiBudWxsIGlmIHRoZSBjbGllbnQgaXMgbm90IGFsbG93ZWQgdG8gYWNjZXNzIHRoaXMKKyAgICAgKiBpbmZvcm1hdGlvbi4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xpZW50UGFja2FnZU5hbWUgVGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gd2hpY2ggaXMKKyAgICAgKiAgICAgICAgICAgIHJlcXVlc3RpbmcgYWNjZXNzIHRvIGJyb3dzZSBtZWRpYS4KKyAgICAgKiBAcGFyYW0gY2xpZW50VWlkIFRoZSB1aWQgb2YgdGhlIGFwcGxpY2F0aW9uIHdoaWNoIGlzIHJlcXVlc3RpbmcgYWNjZXNzIHRvCisgICAgICogICAgICAgICAgICBicm93c2UgbWVkaWEuCisgICAgICogQHBhcmFtIHJvb3RIaW50cyBBbiBvcHRpb25hbCBidW5kbGUgb2Ygc2VydmljZS1zcGVjaWZpYyBhcmd1bWVudHMgdG8gc2VuZAorICAgICAqICAgICAgICAgICAgdG8gdGhlIG1lZGlhIGJyb3dzZXIgc2VydmljZSB3aGVuIGNvbm5lY3RpbmcgYW5kIHJldHJpZXZpbmcgdGhlCisgICAgICogICAgICAgICAgICByb290IGlkIGZvciBicm93c2luZywgb3IgbnVsbCBpZiBub25lLiBUaGUgY29udGVudHMgb2YgdGhpcworICAgICAqICAgICAgICAgICAgYnVuZGxlIG1heSBhZmZlY3QgdGhlIGluZm9ybWF0aW9uIHJldHVybmVkIHdoZW4gYnJvd3NpbmcuCisgICAgICogQHJldHVybiBUaGUge0BsaW5rIEJyb3dzZXJSb290fSBmb3IgYWNjZXNzaW5nIHRoaXMgYXBwJ3MgY29udGVudCBvciBudWxsLgorICAgICAqIEBzZWUgQnJvd3NlclJvb3QjRVhUUkFfUkVDRU5UCisgICAgICogQHNlZSBCcm93c2VyUm9vdCNFWFRSQV9PRkZMSU5FCisgICAgICogQHNlZSBCcm93c2VyUm9vdCNFWFRSQV9TVUdHRVNURUQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQE51bGxhYmxlIEJyb3dzZXJSb290IG9uR2V0Um9vdChATm9uTnVsbCBTdHJpbmcgY2xpZW50UGFja2FnZU5hbWUsCisgICAgICAgICAgICBpbnQgY2xpZW50VWlkLCBATnVsbGFibGUgQnVuZGxlIHJvb3RIaW50cyk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjaGlsZHJlbiBvZiBhIG1lZGlhIGl0ZW0uCisgICAgICogPHA+CisgICAgICogSW1wbGVtZW50YXRpb25zIG11c3QgY2FsbCB7QGxpbmsgUmVzdWx0I3NlbmRSZXN1bHQgcmVzdWx0LnNlbmRSZXN1bHR9CisgICAgICogd2l0aCB0aGUgbGlzdCBvZiBjaGlsZHJlbi4gSWYgbG9hZGluZyB0aGUgY2hpbGRyZW4gd2lsbCBiZSBhbiBleHBlbnNpdmUKKyAgICAgKiBvcGVyYXRpb24gdGhhdCBzaG91bGQgYmUgcGVyZm9ybWVkIG9uIGFub3RoZXIgdGhyZWFkLAorICAgICAqIHtAbGluayBSZXN1bHQjZGV0YWNoIHJlc3VsdC5kZXRhY2h9IG1heSBiZSBjYWxsZWQgYmVmb3JlIHJldHVybmluZyBmcm9tCisgICAgICogdGhpcyBmdW5jdGlvbiwgYW5kIHRoZW4ge0BsaW5rIFJlc3VsdCNzZW5kUmVzdWx0IHJlc3VsdC5zZW5kUmVzdWx0fQorICAgICAqIGNhbGxlZCB3aGVuIHRoZSBsb2FkaW5nIGlzIGNvbXBsZXRlLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBJbiBjYXNlIHRoZSBtZWRpYSBpdGVtIGRvZXMgbm90IGhhdmUgYW55IGNoaWxkcmVuLCBjYWxsIHtAbGluayBSZXN1bHQjc2VuZFJlc3VsdH0KKyAgICAgKiB3aXRoIGFuIGVtcHR5IGxpc3QuIFdoZW4gdGhlIGdpdmVuIHtAY29kZSBwYXJlbnRJZH0gaXMgaW52YWxpZCwgaW1wbGVtZW50YXRpb25zIG11c3QKKyAgICAgKiBjYWxsIHtAbGluayBSZXN1bHQjc2VuZFJlc3VsdCByZXN1bHQuc2VuZFJlc3VsdH0gd2l0aCB7QGNvZGUgbnVsbH0sIHdoaWNoIHdpbGwgaW52b2tlCisgICAgICoge0BsaW5rIE1lZGlhQnJvd3Nlci5TdWJzY3JpcHRpb25DYWxsYmFjayNvbkVycm9yfS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50SWQgVGhlIGlkIG9mIHRoZSBwYXJlbnQgbWVkaWEgaXRlbSB3aG9zZSBjaGlsZHJlbiBhcmUgdG8gYmUKKyAgICAgKiAgICAgICAgICAgIHF1ZXJpZWQuCisgICAgICogQHBhcmFtIHJlc3VsdCBUaGUgUmVzdWx0IHRvIHNlbmQgdGhlIGxpc3Qgb2YgY2hpbGRyZW4gdG8uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgb25Mb2FkQ2hpbGRyZW4oQE5vbk51bGwgU3RyaW5nIHBhcmVudElkLAorICAgICAgICAgICAgQE5vbk51bGwgUmVzdWx0PExpc3Q8TWVkaWFCcm93c2VyLk1lZGlhSXRlbT4+IHJlc3VsdCk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjaGlsZHJlbiBvZiBhIG1lZGlhIGl0ZW0uCisgICAgICogPHA+CisgICAgICogSW1wbGVtZW50YXRpb25zIG11c3QgY2FsbCB7QGxpbmsgUmVzdWx0I3NlbmRSZXN1bHQgcmVzdWx0LnNlbmRSZXN1bHR9CisgICAgICogd2l0aCB0aGUgbGlzdCBvZiBjaGlsZHJlbi4gSWYgbG9hZGluZyB0aGUgY2hpbGRyZW4gd2lsbCBiZSBhbiBleHBlbnNpdmUKKyAgICAgKiBvcGVyYXRpb24gdGhhdCBzaG91bGQgYmUgcGVyZm9ybWVkIG9uIGFub3RoZXIgdGhyZWFkLAorICAgICAqIHtAbGluayBSZXN1bHQjZGV0YWNoIHJlc3VsdC5kZXRhY2h9IG1heSBiZSBjYWxsZWQgYmVmb3JlIHJldHVybmluZyBmcm9tCisgICAgICogdGhpcyBmdW5jdGlvbiwgYW5kIHRoZW4ge0BsaW5rIFJlc3VsdCNzZW5kUmVzdWx0IHJlc3VsdC5zZW5kUmVzdWx0fQorICAgICAqIGNhbGxlZCB3aGVuIHRoZSBsb2FkaW5nIGlzIGNvbXBsZXRlLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBJbiBjYXNlIHRoZSBtZWRpYSBpdGVtIGRvZXMgbm90IGhhdmUgYW55IGNoaWxkcmVuLCBjYWxsIHtAbGluayBSZXN1bHQjc2VuZFJlc3VsdH0KKyAgICAgKiB3aXRoIGFuIGVtcHR5IGxpc3QuIFdoZW4gdGhlIGdpdmVuIHtAY29kZSBwYXJlbnRJZH0gaXMgaW52YWxpZCwgaW1wbGVtZW50YXRpb25zIG11c3QKKyAgICAgKiBjYWxsIHtAbGluayBSZXN1bHQjc2VuZFJlc3VsdCByZXN1bHQuc2VuZFJlc3VsdH0gd2l0aCB7QGNvZGUgbnVsbH0sIHdoaWNoIHdpbGwgaW52b2tlCisgICAgICoge0BsaW5rIE1lZGlhQnJvd3Nlci5TdWJzY3JpcHRpb25DYWxsYmFjayNvbkVycm9yfS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50SWQgVGhlIGlkIG9mIHRoZSBwYXJlbnQgbWVkaWEgaXRlbSB3aG9zZSBjaGlsZHJlbiBhcmUgdG8gYmUKKyAgICAgKiAgICAgICAgICAgIHF1ZXJpZWQuCisgICAgICogQHBhcmFtIHJlc3VsdCBUaGUgUmVzdWx0IHRvIHNlbmQgdGhlIGxpc3Qgb2YgY2hpbGRyZW4gdG8uCisgICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIGJ1bmRsZSBvZiBzZXJ2aWNlLXNwZWNpZmljIGFyZ3VtZW50cyBzZW50IGZyb20gdGhlIG1lZGlhCisgICAgICogICAgICAgICAgICBicm93c2VyLiBUaGUgaW5mb3JtYXRpb24gcmV0dXJuZWQgdGhyb3VnaCB0aGUgcmVzdWx0IHNob3VsZCBiZQorICAgICAqICAgICAgICAgICAgYWZmZWN0ZWQgYnkgdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVuZGxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uTG9hZENoaWxkcmVuKEBOb25OdWxsIFN0cmluZyBwYXJlbnRJZCwKKyAgICAgICAgICAgIEBOb25OdWxsIFJlc3VsdDxMaXN0PE1lZGlhQnJvd3Nlci5NZWRpYUl0ZW0+PiByZXN1bHQsIEBOb25OdWxsIEJ1bmRsZSBvcHRpb25zKSB7CisgICAgICAgIC8vIFRvIHN1cHBvcnQgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgd2hlbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgTWVkaWFCcm93c2VyU2VydmljZSBkb2Vzbid0CisgICAgICAgIC8vIG92ZXJyaWRlIG9uTG9hZENoaWxkcmVuKCkgd2l0aCBvcHRpb25zLCBvbkxvYWRDaGlsZHJlbigpIHdpdGhvdXQgb3B0aW9ucyB3aWxsIGJlIHVzZWQKKyAgICAgICAgLy8gaW5zdGVhZCwgYW5kIHRoZSBvcHRpb25zIHdpbGwgYmUgYXBwbGllZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgcmVzdWx0Lm9uUmVzdWx0U2VudCgpLgorICAgICAgICByZXN1bHQuc2V0RmxhZ3MoUkVTVUxUX0ZMQUdfT1BUSU9OX05PVF9IQU5ETEVEKTsKKyAgICAgICAgb25Mb2FkQ2hpbGRyZW4ocGFyZW50SWQsIHJlc3VsdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIG1lZGlhIGl0ZW0uCisgICAgICogPHA+CisgICAgICogSW1wbGVtZW50YXRpb25zIG11c3QgY2FsbCB7QGxpbmsgUmVzdWx0I3NlbmRSZXN1bHQgcmVzdWx0LnNlbmRSZXN1bHR9LiBJZgorICAgICAqIGxvYWRpbmcgdGhlIGl0ZW0gd2lsbCBiZSBhbiBleHBlbnNpdmUgb3BlcmF0aW9uIHtAbGluayBSZXN1bHQjZGV0YWNoCisgICAgICogcmVzdWx0LmRldGFjaH0gbWF5IGJlIGNhbGxlZCBiZWZvcmUgcmV0dXJuaW5nIGZyb20gdGhpcyBmdW5jdGlvbiwgYW5kCisgICAgICogdGhlbiB7QGxpbmsgUmVzdWx0I3NlbmRSZXN1bHQgcmVzdWx0LnNlbmRSZXN1bHR9IGNhbGxlZCB3aGVuIHRoZSBpdGVtIGhhcworICAgICAqIGJlZW4gbG9hZGVkLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBXaGVuIHRoZSBnaXZlbiB7QGNvZGUgaXRlbUlkfSBpcyBpbnZhbGlkLCBpbXBsZW1lbnRhdGlvbnMgbXVzdCBjYWxsCisgICAgICoge0BsaW5rIFJlc3VsdCNzZW5kUmVzdWx0IHJlc3VsdC5zZW5kUmVzdWx0fSB3aXRoIHtAY29kZSBudWxsfS4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gd2lsbCBpbnZva2Uge0BsaW5rIE1lZGlhQnJvd3Nlci5JdGVtQ2FsbGJhY2sjb25FcnJvcn0uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGl0ZW1JZCBUaGUgaWQgZm9yIHRoZSBzcGVjaWZpYworICAgICAqICAgICAgICAgICAge0BsaW5rIGFuZHJvaWQubWVkaWEuYnJvd3NlLk1lZGlhQnJvd3Nlci5NZWRpYUl0ZW19LgorICAgICAqIEBwYXJhbSByZXN1bHQgVGhlIFJlc3VsdCB0byBzZW5kIHRoZSBpdGVtIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uTG9hZEl0ZW0oU3RyaW5nIGl0ZW1JZCwgUmVzdWx0PE1lZGlhQnJvd3Nlci5NZWRpYUl0ZW0+IHJlc3VsdCkgeworICAgICAgICByZXN1bHQuc2V0RmxhZ3MoUkVTVUxUX0ZMQUdfT05fTE9BRF9JVEVNX05PVF9JTVBMRU1FTlRFRCk7CisgICAgICAgIHJlc3VsdC5zZW5kUmVzdWx0KG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGwgdG8gc2V0IHRoZSBtZWRpYSBzZXNzaW9uLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhcyBzb29uIGFzIHBvc3NpYmxlIGR1cmluZyB0aGUgc2VydmljZSdzIHN0YXJ0dXAuCisgICAgICogSXQgbWF5IG9ubHkgYmUgY2FsbGVkIG9uY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdG9rZW4gVGhlIHRva2VuIGZvciB0aGUgc2VydmljZSdzIHtAbGluayBNZWRpYVNlc3Npb259LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb25Ub2tlbihmaW5hbCBNZWRpYVNlc3Npb24uVG9rZW4gdG9rZW4pIHsKKyAgICAgICAgaWYgKHRva2VuID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlNlc3Npb24gdG9rZW4gbWF5IG5vdCBiZSBudWxsLiIpOworICAgICAgICB9CisgICAgICAgIGlmIChtU2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgc2Vzc2lvbiB0b2tlbiBoYXMgYWxyZWFkeSBiZWVuIHNldC4iKTsKKyAgICAgICAgfQorICAgICAgICBtU2Vzc2lvbiA9IHRva2VuOworICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIEl0ZXJhdG9yPENvbm5lY3Rpb25SZWNvcmQ+IGl0ZXIgPSBtQ29ubmVjdGlvbnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpeworICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uUmVjb3JkIGNvbm5lY3Rpb24gPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uY2FsbGJhY2tzLm9uQ29ubmVjdChjb25uZWN0aW9uLnJvb3QuZ2V0Um9vdElkKCksIHRva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnJvb3QuZ2V0RXh0cmFzKCkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ29ubmVjdGlvbiBmb3IgIiArIGNvbm5lY3Rpb24ucGtnICsgIiBpcyBubyBsb25nZXIgdmFsaWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpdGVyLnJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBzZXNzaW9uIHRva2VuLCBvciBudWxsIGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gY3JlYXRlZAorICAgICAqIG9yIGlmIGl0IGhhcyBiZWVuIGRlc3Ryb3llZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE51bGxhYmxlIE1lZGlhU2Vzc2lvbi5Ub2tlbiBnZXRTZXNzaW9uVG9rZW4oKSB7CisgICAgICAgIHJldHVybiBtU2Vzc2lvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSByb290IGhpbnRzIHNlbnQgZnJvbSB0aGUgY3VycmVudGx5IGNvbm5lY3RlZCB7QGxpbmsgTWVkaWFCcm93c2VyfS4KKyAgICAgKiBUaGUgcm9vdCBoaW50cyBhcmUgc2VydmljZS1zcGVjaWZpYyBhcmd1bWVudHMgaW5jbHVkZWQgaW4gYW4gb3B0aW9uYWwgYnVuZGxlIHNlbnQgdG8gdGhlCisgICAgICogbWVkaWEgYnJvd3NlciBzZXJ2aWNlIHdoZW4gY29ubmVjdGluZyBhbmQgcmV0cmlldmluZyB0aGUgcm9vdCBpZCBmb3IgYnJvd3NpbmcsIG9yIG51bGwgaWYKKyAgICAgKiBub25lLiBUaGUgY29udGVudHMgb2YgdGhpcyBidW5kbGUgbWF5IGFmZmVjdCB0aGUgaW5mb3JtYXRpb24gcmV0dXJuZWQgd2hlbiBicm93c2luZy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvdXRzaWRlIG9mIHtAbGluayAjb25HZXRSb290fSBvcgorICAgICAqICAgICAgICAgICAgIHtAbGluayAjb25Mb2FkQ2hpbGRyZW59IG9yIHtAbGluayAjb25Mb2FkSXRlbX0uCisgICAgICogQHNlZSBNZWRpYUJyb3dzZXJTZXJ2aWNlLkJyb3dzZXJSb290I0VYVFJBX1JFQ0VOVAorICAgICAqIEBzZWUgTWVkaWFCcm93c2VyU2VydmljZS5Ccm93c2VyUm9vdCNFWFRSQV9PRkZMSU5FCisgICAgICogQHNlZSBNZWRpYUJyb3dzZXJTZXJ2aWNlLkJyb3dzZXJSb290I0VYVFJBX1NVR0dFU1RFRAorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBCdW5kbGUgZ2V0QnJvd3NlclJvb3RIaW50cygpIHsKKyAgICAgICAgaWYgKG1DdXJDb25uZWN0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoaXMgc2hvdWxkIGJlIGNhbGxlZCBpbnNpZGUgb2Ygb25HZXRSb290IG9yIgorICAgICAgICAgICAgICAgICAgICArICIgb25Mb2FkQ2hpbGRyZW4gb3Igb25Mb2FkSXRlbSBtZXRob2RzIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1DdXJDb25uZWN0aW9uLnJvb3RIaW50cyA9PSBudWxsID8gbnVsbCA6IG5ldyBCdW5kbGUobUN1ckNvbm5lY3Rpb24ucm9vdEhpbnRzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBicm93c2VyIGluZm9ybWF0aW9uIHdobyBzZW50IHRoZSBjdXJyZW50IHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb3V0c2lkZSBvZiB7QGxpbmsgI29uR2V0Um9vdH0gb3IKKyAgICAgKiAgICAgICAgICAgICB7QGxpbmsgI29uTG9hZENoaWxkcmVufSBvciB7QGxpbmsgI29uTG9hZEl0ZW19LgorICAgICAqIEBzZWUgTWVkaWFTZXNzaW9uTWFuYWdlciNpc1RydXN0ZWRGb3JNZWRpYUNvbnRyb2woUmVtb3RlVXNlckluZm8pCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFJlbW90ZVVzZXJJbmZvIGdldEN1cnJlbnRCcm93c2VySW5mbygpIHsKKyAgICAgICAgaWYgKG1DdXJDb25uZWN0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoaXMgc2hvdWxkIGJlIGNhbGxlZCBpbnNpZGUgb2Ygb25HZXRSb290IG9yIgorICAgICAgICAgICAgICAgICAgICArICIgb25Mb2FkQ2hpbGRyZW4gb3Igb25Mb2FkSXRlbSBtZXRob2RzIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBSZW1vdGVVc2VySW5mbyhtQ3VyQ29ubmVjdGlvbi5wa2csIG1DdXJDb25uZWN0aW9uLnBpZCwgbUN1ckNvbm5lY3Rpb24udWlkLAorICAgICAgICAgICAgICAgIG1DdXJDb25uZWN0aW9uLmNhbGxiYWNrcy5hc0JpbmRlcigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3RpZmllcyBhbGwgY29ubmVjdGVkIG1lZGlhIGJyb3dzZXJzIHRoYXQgdGhlIGNoaWxkcmVuIG9mCisgICAgICogdGhlIHNwZWNpZmllZCBwYXJlbnQgaWQgaGF2ZSBjaGFuZ2VkIGluIHNvbWUgd2F5LgorICAgICAqIFRoaXMgd2lsbCBjYXVzZSBicm93c2VycyB0byBmZXRjaCBzdWJzY3JpYmVkIGNvbnRlbnQgYWdhaW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50SWQgVGhlIGlkIG9mIHRoZSBwYXJlbnQgbWVkaWEgaXRlbSB3aG9zZQorICAgICAqIGNoaWxkcmVuIGNoYW5nZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbm90aWZ5Q2hpbGRyZW5DaGFuZ2VkKEBOb25OdWxsIFN0cmluZyBwYXJlbnRJZCkgeworICAgICAgICBub3RpZnlDaGlsZHJlbkNoYW5nZWRJbnRlcm5hbChwYXJlbnRJZCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90aWZpZXMgYWxsIGNvbm5lY3RlZCBtZWRpYSBicm93c2VycyB0aGF0IHRoZSBjaGlsZHJlbiBvZgorICAgICAqIHRoZSBzcGVjaWZpZWQgcGFyZW50IGlkIGhhdmUgY2hhbmdlZCBpbiBzb21lIHdheS4KKyAgICAgKiBUaGlzIHdpbGwgY2F1c2UgYnJvd3NlcnMgdG8gZmV0Y2ggc3Vic2NyaWJlZCBjb250ZW50IGFnYWluLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudElkIFRoZSBpZCBvZiB0aGUgcGFyZW50IG1lZGlhIGl0ZW0gd2hvc2UKKyAgICAgKiAgICAgICAgICAgIGNoaWxkcmVuIGNoYW5nZWQuCisgICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIGJ1bmRsZSBvZiBzZXJ2aWNlLXNwZWNpZmljIGFyZ3VtZW50cyB0byBzZW5kCisgICAgICogICAgICAgICAgICB0byB0aGUgbWVkaWEgYnJvd3Nlci4gVGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVuZGxlIG1heQorICAgICAqICAgICAgICAgICAgY29udGFpbiB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNoYW5nZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGlsZHJlbkNoYW5nZWQoQE5vbk51bGwgU3RyaW5nIHBhcmVudElkLCBATm9uTnVsbCBCdW5kbGUgb3B0aW9ucykgeworICAgICAgICBpZiAob3B0aW9ucyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJvcHRpb25zIGNhbm5vdCBiZSBudWxsIGluIG5vdGlmeUNoaWxkcmVuQ2hhbmdlZCIpOworICAgICAgICB9CisgICAgICAgIG5vdGlmeUNoaWxkcmVuQ2hhbmdlZEludGVybmFsKHBhcmVudElkLCBvcHRpb25zKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbm90aWZ5Q2hpbGRyZW5DaGFuZ2VkSW50ZXJuYWwoZmluYWwgU3RyaW5nIHBhcmVudElkLCBmaW5hbCBCdW5kbGUgb3B0aW9ucykgeworICAgICAgICBpZiAocGFyZW50SWQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFyZW50SWQgY2Fubm90IGJlIG51bGwgaW4gbm90aWZ5Q2hpbGRyZW5DaGFuZ2VkIik7CisgICAgICAgIH0KKyAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBmb3IgKElCaW5kZXIgYmluZGVyIDogbUNvbm5lY3Rpb25zLmtleVNldCgpKSB7CisgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25SZWNvcmQgY29ubmVjdGlvbiA9IG1Db25uZWN0aW9ucy5nZXQoYmluZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgTGlzdDxQYWlyPElCaW5kZXIsIEJ1bmRsZT4+IGNhbGxiYWNrTGlzdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5zdWJzY3JpcHRpb25zLmdldChwYXJlbnRJZCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja0xpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChQYWlyPElCaW5kZXIsIEJ1bmRsZT4gY2FsbGJhY2sgOiBjYWxsYmFja0xpc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTWVkaWFCcm93c2VyVXRpbHMuaGFzRHVwbGljYXRlZEl0ZW1zKG9wdGlvbnMsIGNhbGxiYWNrLnNlY29uZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybUxvYWRDaGlsZHJlbihwYXJlbnRJZCwgY29ubmVjdGlvbiwgY2FsbGJhY2suc2Vjb25kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBwYWNrYWdlIGlzIG9uZSBvZiB0aGUgb25lcyB0aGF0IGlzIG93bmVkIGJ5IHRoZSB1aWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRQYWNrYWdlKFN0cmluZyBwa2csIGludCB1aWQpIHsKKyAgICAgICAgaWYgKHBrZyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgUGFja2FnZU1hbmFnZXIgcG0gPSBnZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBmaW5hbCBTdHJpbmdbXSBwYWNrYWdlcyA9IHBtLmdldFBhY2thZ2VzRm9yVWlkKHVpZCk7CisgICAgICAgIGZpbmFsIGludCBOID0gcGFja2FnZXMubGVuZ3RoOworICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICBpZiAocGFja2FnZXNbaV0uZXF1YWxzKHBrZykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2F2ZSB0aGUgc3Vic2NyaXB0aW9uIGFuZCBpZiBpdCBpcyBhIG5ldyBzdWJzY3JpcHRpb24gc2VuZCB0aGUgcmVzdWx0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkU3Vic2NyaXB0aW9uKFN0cmluZyBpZCwgQ29ubmVjdGlvblJlY29yZCBjb25uZWN0aW9uLCBJQmluZGVyIHRva2VuLAorICAgICAgICAgICAgQnVuZGxlIG9wdGlvbnMpIHsKKyAgICAgICAgLy8gU2F2ZSB0aGUgc3Vic2NyaXB0aW9uCisgICAgICAgIExpc3Q8UGFpcjxJQmluZGVyLCBCdW5kbGU+PiBjYWxsYmFja0xpc3QgPSBjb25uZWN0aW9uLnN1YnNjcmlwdGlvbnMuZ2V0KGlkKTsKKyAgICAgICAgaWYgKGNhbGxiYWNrTGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICBjYWxsYmFja0xpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKFBhaXI8SUJpbmRlciwgQnVuZGxlPiBjYWxsYmFjayA6IGNhbGxiYWNrTGlzdCkgeworICAgICAgICAgICAgaWYgKHRva2VuID09IGNhbGxiYWNrLmZpcnN0CisgICAgICAgICAgICAgICAgICAgICYmIE1lZGlhQnJvd3NlclV0aWxzLmFyZVNhbWVPcHRpb25zKG9wdGlvbnMsIGNhbGxiYWNrLnNlY29uZCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2FsbGJhY2tMaXN0LmFkZChuZXcgUGFpcjw+KHRva2VuLCBvcHRpb25zKSk7CisgICAgICAgIGNvbm5lY3Rpb24uc3Vic2NyaXB0aW9ucy5wdXQoaWQsIGNhbGxiYWNrTGlzdCk7CisgICAgICAgIC8vIHNlbmQgdGhlIHJlc3VsdHMKKyAgICAgICAgcGVyZm9ybUxvYWRDaGlsZHJlbihpZCwgY29ubmVjdGlvbiwgb3B0aW9ucyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBzdWJzY3JpcHRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHJlbW92ZVN1YnNjcmlwdGlvbihTdHJpbmcgaWQsIENvbm5lY3Rpb25SZWNvcmQgY29ubmVjdGlvbiwgSUJpbmRlciB0b2tlbikgeworICAgICAgICBpZiAodG9rZW4gPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24uc3Vic2NyaXB0aW9ucy5yZW1vdmUoaWQpICE9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiByZW1vdmVkID0gZmFsc2U7CisgICAgICAgIExpc3Q8UGFpcjxJQmluZGVyLCBCdW5kbGU+PiBjYWxsYmFja0xpc3QgPSBjb25uZWN0aW9uLnN1YnNjcmlwdGlvbnMuZ2V0KGlkKTsKKyAgICAgICAgaWYgKGNhbGxiYWNrTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBJdGVyYXRvcjxQYWlyPElCaW5kZXIsIEJ1bmRsZT4+IGl0ZXIgPSBjYWxsYmFja0xpc3QuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSl7CisgICAgICAgICAgICAgICAgaWYgKHRva2VuID09IGl0ZXIubmV4dCgpLmZpcnN0KSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpdGVyLnJlbW92ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjYWxsYmFja0xpc3Quc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnN1YnNjcmlwdGlvbnMucmVtb3ZlKGlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVtb3ZlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsIG9uTG9hZENoaWxkcmVuIGFuZCB0aGVuIHNlbmQgdGhlIHJlc3VsdHMgYmFjayB0byB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBDYWxsZXJzIG11c3QgbWFrZSBzdXJlIHRoYXQgdGhpcyBjb25uZWN0aW9uIGlzIHN0aWxsIGNvbm5lY3RlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGVyZm9ybUxvYWRDaGlsZHJlbihmaW5hbCBTdHJpbmcgcGFyZW50SWQsIGZpbmFsIENvbm5lY3Rpb25SZWNvcmQgY29ubmVjdGlvbiwKKyAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBvcHRpb25zKSB7CisgICAgICAgIGZpbmFsIFJlc3VsdDxMaXN0PE1lZGlhQnJvd3Nlci5NZWRpYUl0ZW0+PiByZXN1bHQKKyAgICAgICAgICAgICAgICA9IG5ldyBSZXN1bHQ8TGlzdDxNZWRpYUJyb3dzZXIuTWVkaWFJdGVtPj4ocGFyZW50SWQpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgdm9pZCBvblJlc3VsdFNlbnQoTGlzdDxNZWRpYUJyb3dzZXIuTWVkaWFJdGVtPiBsaXN0LCBAUmVzdWx0RmxhZ3MgaW50IGZsYWcpIHsKKyAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3Rpb25zLmdldChjb25uZWN0aW9uLmNhbGxiYWNrcy5hc0JpbmRlcigpKSAhPSBjb25uZWN0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIk5vdCBzZW5kaW5nIG9uTG9hZENoaWxkcmVuIHJlc3VsdCBmb3IgY29ubmVjdGlvbiB0aGF0IGhhcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJlZW4gZGlzY29ubmVjdGVkLiBwa2c9IiArIGNvbm5lY3Rpb24ucGtnICsgIiBpZD0iICsgcGFyZW50SWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBMaXN0PE1lZGlhQnJvd3Nlci5NZWRpYUl0ZW0+IGZpbHRlcmVkTGlzdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAoZmxhZyAmIFJFU1VMVF9GTEFHX09QVElPTl9OT1RfSEFORExFRCkgIT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgPyBhcHBseU9wdGlvbnMobGlzdCwgb3B0aW9ucykgOiBsaXN0OworICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhUGFyY2VsZWRMaXN0U2xpY2U8TWVkaWFCcm93c2VyLk1lZGlhSXRlbT4gcGxzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkTGlzdCA9PSBudWxsID8gbnVsbCA6IG5ldyBNZWRpYVBhcmNlbGVkTGlzdFNsaWNlPD4oZmlsdGVyZWRMaXN0KTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmNhbGxiYWNrcy5vbkxvYWRDaGlsZHJlbldpdGhPcHRpb25zKHBhcmVudElkLCBwbHMsIG9wdGlvbnMpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGUgb3RoZXIgc2lkZSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBjcmFzaGluZy4KKyAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2FsbGluZyBvbkxvYWRDaGlsZHJlbigpIGZhaWxlZCBmb3IgaWQ9IiArIHBhcmVudElkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHBhY2thZ2U9IiArIGNvbm5lY3Rpb24ucGtnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgbUN1ckNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICAgICAgICBpZiAob3B0aW9ucyA9PSBudWxsKSB7CisgICAgICAgICAgICBvbkxvYWRDaGlsZHJlbihwYXJlbnRJZCwgcmVzdWx0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9uTG9hZENoaWxkcmVuKHBhcmVudElkLCByZXN1bHQsIG9wdGlvbnMpOworICAgICAgICB9CisgICAgICAgIG1DdXJDb25uZWN0aW9uID0gbnVsbDsKKworICAgICAgICBpZiAoIXJlc3VsdC5pc0RvbmUoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigib25Mb2FkQ2hpbGRyZW4gbXVzdCBjYWxsIGRldGFjaCgpIG9yIHNlbmRSZXN1bHQoKSIKKyAgICAgICAgICAgICAgICAgICAgKyAiIGJlZm9yZSByZXR1cm5pbmcgZm9yIHBhY2thZ2U9IiArIGNvbm5lY3Rpb24ucGtnICsgIiBpZD0iICsgcGFyZW50SWQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PE1lZGlhQnJvd3Nlci5NZWRpYUl0ZW0+IGFwcGx5T3B0aW9ucyhMaXN0PE1lZGlhQnJvd3Nlci5NZWRpYUl0ZW0+IGxpc3QsCisgICAgICAgICAgICBmaW5hbCBCdW5kbGUgb3B0aW9ucykgeworICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpbnQgcGFnZSA9IG9wdGlvbnMuZ2V0SW50KE1lZGlhQnJvd3Nlci5FWFRSQV9QQUdFLCAtMSk7CisgICAgICAgIGludCBwYWdlU2l6ZSA9IG9wdGlvbnMuZ2V0SW50KE1lZGlhQnJvd3Nlci5FWFRSQV9QQUdFX1NJWkUsIC0xKTsKKyAgICAgICAgaWYgKHBhZ2UgPT0gLTEgJiYgcGFnZVNpemUgPT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiBsaXN0OworICAgICAgICB9CisgICAgICAgIGludCBmcm9tSW5kZXggPSBwYWdlU2l6ZSAqIHBhZ2U7CisgICAgICAgIGludCB0b0luZGV4ID0gZnJvbUluZGV4ICsgcGFnZVNpemU7CisgICAgICAgIGlmIChwYWdlIDwgMCB8fCBwYWdlU2l6ZSA8IDEgfHwgZnJvbUluZGV4ID49IGxpc3Quc2l6ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKKyAgICAgICAgfQorICAgICAgICBpZiAodG9JbmRleCA+IGxpc3Quc2l6ZSgpKSB7CisgICAgICAgICAgICB0b0luZGV4ID0gbGlzdC5zaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxpc3Quc3ViTGlzdChmcm9tSW5kZXgsIHRvSW5kZXgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwZXJmb3JtTG9hZEl0ZW0oU3RyaW5nIGl0ZW1JZCwgZmluYWwgQ29ubmVjdGlvblJlY29yZCBjb25uZWN0aW9uLAorICAgICAgICAgICAgZmluYWwgUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIpIHsKKyAgICAgICAgZmluYWwgUmVzdWx0PE1lZGlhQnJvd3Nlci5NZWRpYUl0ZW0+IHJlc3VsdCA9CisgICAgICAgICAgICAgICAgbmV3IFJlc3VsdDxNZWRpYUJyb3dzZXIuTWVkaWFJdGVtPihpdGVtSWQpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgdm9pZCBvblJlc3VsdFNlbnQoTWVkaWFCcm93c2VyLk1lZGlhSXRlbSBpdGVtLCBAUmVzdWx0RmxhZ3MgaW50IGZsYWcpIHsKKyAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3Rpb25zLmdldChjb25uZWN0aW9uLmNhbGxiYWNrcy5hc0JpbmRlcigpKSAhPSBjb25uZWN0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIk5vdCBzZW5kaW5nIG9uTG9hZEl0ZW0gcmVzdWx0IGZvciBjb25uZWN0aW9uIHRoYXQgaGFzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYmVlbiBkaXNjb25uZWN0ZWQuIHBrZz0iICsgY29ubmVjdGlvbi5wa2cgKyAiIGlkPSIgKyBpdGVtSWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChmbGFnICYgUkVTVUxUX0ZMQUdfT05fTE9BRF9JVEVNX05PVF9JTVBMRU1FTlRFRCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZWNlaXZlci5zZW5kKFJFU1VMVF9FUlJPUiwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgICAgICBidW5kbGUucHV0UGFyY2VsYWJsZShLRVlfTUVESUFfSVRFTSwgaXRlbSk7CisgICAgICAgICAgICAgICAgcmVjZWl2ZXIuc2VuZChSRVNVTFRfT0ssIGJ1bmRsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgbUN1ckNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICAgICAgICBvbkxvYWRJdGVtKGl0ZW1JZCwgcmVzdWx0KTsKKyAgICAgICAgbUN1ckNvbm5lY3Rpb24gPSBudWxsOworCisgICAgICAgIGlmICghcmVzdWx0LmlzRG9uZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJvbkxvYWRJdGVtIG11c3QgY2FsbCBkZXRhY2goKSBvciBzZW5kUmVzdWx0KCkiCisgICAgICAgICAgICAgICAgICAgICsgIiBiZWZvcmUgcmV0dXJuaW5nIGZvciBpZD0iICsgaXRlbUlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRhaW5zIGluZm9ybWF0aW9uIHRoYXQgdGhlIGJyb3dzZXIgc2VydmljZSBuZWVkcyB0byBzZW5kIHRvIHRoZSBjbGllbnQKKyAgICAgKiB3aGVuIGZpcnN0IGNvbm5lY3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJyb3dzZXJSb290IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBsb29rdXAga2V5IGZvciBhIGJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgYnJvd3NlciBzZXJ2aWNlIHNob3VsZCByZXR1cm4gYQorICAgICAgICAgKiBicm93c2VyIHJvb3QgZm9yIHJlY2VudGx5IHBsYXllZCBtZWRpYSBpdGVtcy4KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+V2hlbiBjcmVhdGluZyBhIG1lZGlhIGJyb3dzZXIgZm9yIGEgZ2l2ZW4gbWVkaWEgYnJvd3NlciBzZXJ2aWNlLCB0aGlzIGtleSBjYW4gYmUKKyAgICAgICAgICogc3VwcGxpZWQgYXMgYSByb290IGhpbnQgZm9yIHJldHJpZXZpbmcgbWVkaWEgaXRlbXMgdGhhdCBhcmUgcmVjZW50bHkgcGxheWVkLgorICAgICAgICAgKiBJZiB0aGUgbWVkaWEgYnJvd3NlciBzZXJ2aWNlIGNhbiBwcm92aWRlIHN1Y2ggbWVkaWEgaXRlbXMsIHRoZSBpbXBsZW1lbnRhdGlvbiBtdXN0IHJldHVybgorICAgICAgICAgKiB0aGUga2V5IGluIHRoZSByb290IGhpbnQgd2hlbiB7QGxpbmsgI29uR2V0Um9vdChTdHJpbmcsIGludCwgQnVuZGxlKX0gaXMgY2FsbGVkIGJhY2suCisgICAgICAgICAqCisgICAgICAgICAqIDxwPlRoZSByb290IGhpbnQgbWF5IGNvbnRhaW4gbXVsdGlwbGUga2V5cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSAjRVhUUkFfT0ZGTElORQorICAgICAgICAgKiBAc2VlICNFWFRSQV9TVUdHRVNURUQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1JFQ0VOVCA9ICJhbmRyb2lkLnNlcnZpY2UubWVkaWEuZXh0cmEuUkVDRU5UIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGxvb2t1cCBrZXkgZm9yIGEgYm9vbGVhbiB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBicm93c2VyIHNlcnZpY2Ugc2hvdWxkIHJldHVybiBhCisgICAgICAgICAqIGJyb3dzZXIgcm9vdCBmb3Igb2ZmbGluZSBtZWRpYSBpdGVtcy4KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+V2hlbiBjcmVhdGluZyBhIG1lZGlhIGJyb3dzZXIgZm9yIGEgZ2l2ZW4gbWVkaWEgYnJvd3NlciBzZXJ2aWNlLCB0aGlzIGtleSBjYW4gYmUKKyAgICAgICAgICogc3VwcGxpZWQgYXMgYSByb290IGhpbnQgZm9yIHJldHJpZXZpbmcgbWVkaWEgaXRlbXMgdGhhdCBhcmUgY2FuIGJlIHBsYXllZCB3aXRob3V0IGFuCisgICAgICAgICAqIGludGVybmV0IGNvbm5lY3Rpb24uCisgICAgICAgICAqIElmIHRoZSBtZWRpYSBicm93c2VyIHNlcnZpY2UgY2FuIHByb3ZpZGUgc3VjaCBtZWRpYSBpdGVtcywgdGhlIGltcGxlbWVudGF0aW9uIG11c3QgcmV0dXJuCisgICAgICAgICAqIHRoZSBrZXkgaW4gdGhlIHJvb3QgaGludCB3aGVuIHtAbGluayAjb25HZXRSb290KFN0cmluZywgaW50LCBCdW5kbGUpfSBpcyBjYWxsZWQgYmFjay4KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+VGhlIHJvb3QgaGludCBtYXkgY29udGFpbiBtdWx0aXBsZSBrZXlzLgorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlICNFWFRSQV9SRUNFTlQKKyAgICAgICAgICogQHNlZSAjRVhUUkFfU1VHR0VTVEVECisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9PRkZMSU5FID0gImFuZHJvaWQuc2VydmljZS5tZWRpYS5leHRyYS5PRkZMSU5FIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGxvb2t1cCBrZXkgZm9yIGEgYm9vbGVhbiB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBicm93c2VyIHNlcnZpY2Ugc2hvdWxkIHJldHVybiBhCisgICAgICAgICAqIGJyb3dzZXIgcm9vdCBmb3Igc3VnZ2VzdGVkIG1lZGlhIGl0ZW1zLgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5XaGVuIGNyZWF0aW5nIGEgbWVkaWEgYnJvd3NlciBmb3IgYSBnaXZlbiBtZWRpYSBicm93c2VyIHNlcnZpY2UsIHRoaXMga2V5IGNhbiBiZQorICAgICAgICAgKiBzdXBwbGllZCBhcyBhIHJvb3QgaGludCBmb3IgcmV0cmlldmluZyB0aGUgbWVkaWEgaXRlbXMgc3VnZ2VzdGVkIGJ5IHRoZSBtZWRpYSBicm93c2VyCisgICAgICAgICAqIHNlcnZpY2UuIFRoZSBsaXN0IG9mIG1lZGlhIGl0ZW1zIHBhc3NlZCBpbiB7QGxpbmsgYW5kcm9pZC5tZWRpYS5icm93c2UuTWVkaWFCcm93c2VyLlN1YnNjcmlwdGlvbkNhbGxiYWNrI29uQ2hpbGRyZW5Mb2FkZWQoU3RyaW5nLCBMaXN0KX0KKyAgICAgICAgICogaXMgY29uc2lkZXJlZCBvcmRlcmVkIGJ5IHJlbGV2YW5jZSwgZmlyc3QgYmVpbmcgdGhlIHRvcCBzdWdnZXN0aW9uLgorICAgICAgICAgKiBJZiB0aGUgbWVkaWEgYnJvd3NlciBzZXJ2aWNlIGNhbiBwcm92aWRlIHN1Y2ggbWVkaWEgaXRlbXMsIHRoZSBpbXBsZW1lbnRhdGlvbiBtdXN0IHJldHVybgorICAgICAgICAgKiB0aGUga2V5IGluIHRoZSByb290IGhpbnQgd2hlbiB7QGxpbmsgI29uR2V0Um9vdChTdHJpbmcsIGludCwgQnVuZGxlKX0gaXMgY2FsbGVkIGJhY2suCisgICAgICAgICAqCisgICAgICAgICAqIDxwPlRoZSByb290IGhpbnQgbWF5IGNvbnRhaW4gbXVsdGlwbGUga2V5cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSAjRVhUUkFfUkVDRU5UCisgICAgICAgICAqIEBzZWUgI0VYVFJBX09GRkxJTkUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NVR0dFU1RFRCA9ICJhbmRyb2lkLnNlcnZpY2UubWVkaWEuZXh0cmEuU1VHR0VTVEVEIjsKKworICAgICAgICBmaW5hbCBwcml2YXRlIFN0cmluZyBtUm9vdElkOworICAgICAgICBmaW5hbCBwcml2YXRlIEJ1bmRsZSBtRXh0cmFzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgYnJvd3NlciByb290LgorICAgICAgICAgKiBAcGFyYW0gcm9vdElkIFRoZSByb290IGlkIGZvciBicm93c2luZy4KKyAgICAgICAgICogQHBhcmFtIGV4dHJhcyBBbnkgZXh0cmFzIGFib3V0IHRoZSBicm93c2VyIHNlcnZpY2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnJvd3NlclJvb3QoQE5vbk51bGwgU3RyaW5nIHJvb3RJZCwgQE51bGxhYmxlIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgIGlmIChyb290SWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSByb290IGlkIGluIEJyb3dzZXJSb290IGNhbm5vdCBiZSBudWxsLiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJVc2UgbnVsbCBmb3IgQnJvd3NlclJvb3QgaW5zdGVhZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Sb290SWQgPSByb290SWQ7CisgICAgICAgICAgICBtRXh0cmFzID0gZXh0cmFzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIHJvb3QgaWQgZm9yIGJyb3dzaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRSb290SWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVJvb3RJZDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIGFueSBleHRyYXMgYWJvdXQgdGhlIGJyb3dzZXIgc2VydmljZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1FeHRyYXM7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcHJvZ3VhcmQuY2ZnIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Byb2d1YXJkLmNmZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdiZjczMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcHJvZ3VhcmQuY2ZnCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIEtlZXAgZW50cnkgcG9pbnQgZm9yIHVwZGF0YWJsZSBKYXZhIGNsYXNzZXMKLS1rZWVwIHB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpRmFjdG9yeSB7Ci0gICBwdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlGYWN0b3J5IGluaXRpYWxpemUoYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbyk7Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2ZkNTFmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2M4MjUyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjhkZGVhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTljZDc1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTkyYWQ0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjcwN2VhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzMyZDAwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzQ1ZWUzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMWQzNDEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNmI2NWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N1YnRpdGxlX2Rpc2FibGVkLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdWJ0aXRsZV9kaXNhYmxlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNTRmNjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N1YnRpdGxlX2Rpc2FibGVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdWJ0aXRsZV9lbmFibGVkLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdWJ0aXRsZV9lbmFibGVkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4ZmViZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3VidGl0bGVfZW5hYmxlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFkMzA1ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg3ZmRlNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzlkZjcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YzM0NGEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMDM0MjAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcyM2U0NTUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MGMyNWEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZmRiOWMxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODQ2YzEwOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMzYmY0ODQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM5MTFiNWMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NGVkNTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZjdlMGMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NTU4YTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYTFhODQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OWFlZDcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MDY4ZWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYzc3N2MuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMDg3OTUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FkMmM5Yy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAwMmFiNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3VidGl0bGVfZGlzYWJsZWQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N1YnRpdGxlX2Rpc2FibGVkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM1NGY2MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3VidGl0bGVfZGlzYWJsZWQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N1YnRpdGxlX2VuYWJsZWQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N1YnRpdGxlX2VuYWJsZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjhmZWJlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdWJ0aXRsZV9lbmFibGVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDQ2ZWE0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDc5MGM2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQwMWRjMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI0ZDU4Ni4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NiYjc3Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2NjOTg0NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIyNjE3ZTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNlZmVmM2MuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YTAwNDdjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2E1ZDZhMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODEzNDMxMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWM4OTlmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Nzc4ZTAwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTkyZmM1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzg4NGU2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjBhYzY1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTIxMDRmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTVjMDYyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTJkNDk1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMzkzMzYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYzVhNmMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZkZDIxNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI3YmRjZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2ZlNTc2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTVkNmFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYWRmYTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNWZlMGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVjNDhhNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQxZTkxMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTQyMThhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjMwZmFiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YWE5MDMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZTJmMjkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc4NzFlMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM1N2Y2My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDQxYjAxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGJiNjk0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZTEwMTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMzUyYzMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA1MzJlOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM2YmEzMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmEzYjVmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDRiYjIyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNTYxMjcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MTdhOWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJmNjMzZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE1MTgxMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTZhNTNjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzA1ZGNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZTRlYTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNjcyNGYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUzYjQxMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYxOGFiZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTgxMTMzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODBiMTkxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YWJhM2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMzRkNWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk5NTdiMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVkMzg0Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGM2Mjk3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGFiNjg0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZTdmNzUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYTNjYTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhZWNkZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI4ZDBiNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDBiZTNjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTRmMWJmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMThiNDYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YzJjMDAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThmYWU0NC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0YzI4OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWY5MzI3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWUxZjY5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNmZhZmQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMmJkODcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjczYTFmOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhjMTA2OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjJiODAzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGZiYTAyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1N2YyZDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZjU0NzguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk5NWFmMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUwYjdmMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZGQyMTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiN2JkY2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdmZTU3Ni4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE1ZDZhYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWFkZmEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjVmZTBiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YzQ4YTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MWU5MTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU0MjE4YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIzMGZhYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2FhOTAzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2UyZjI5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ODcxZTIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNTdmNjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA0MWIwMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiYjY5NC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGUxMDEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzM1MmMzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNTMyZTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNmJhMzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJhM2I1Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0YmIyMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzU3MGY0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWE0MDNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NDRiZmQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZDYwNDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUwZDU1OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNiYzQ4ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGQ4ZjhlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGI5MGU1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMjM0YTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZDQ1MmYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgxY2Y1YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBkMDhiNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmViM2YxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFlOGIzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMGZjMDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYTE2YWMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM1OThjYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ2ZDE2ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDcwNDU1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTZkYjEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMzgyOGEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhY2NjNzMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM4Y2VkOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQwMWI5ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTMxZGQzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWY3OGU0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YzJjZGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YzViZWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNhZDBkNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZhNTkyMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjg3ZTI1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzA2ZGI4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMjI1YmEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5Njk3ZGUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM3ZWMyMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE4NDBiZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDQ1ZTNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzM3YzY1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZGQyMTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiN2JkY2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGRjMTMyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTQ2MTdjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIzMDc3My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA1ZDdkNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIzOGQ1OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTQwMzQ5ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY2N2M0NjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdmY2ViZjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYTMyYTdhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDYyY2EzNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzEzMTI1Ni4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTMxZTFiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTk0NmEyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODVlODdmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWI0NDAxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWE3ZTAzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzYzNTM4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzQ1YzNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGEzYmE1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNWNhMTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYzE4M2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRiNjc5ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFjNjA1MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDgzOTE0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2MzY2FmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNDQ0Y2YuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDYzNzcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiZDFkYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJlNzEwOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWY1OTZiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjMyZTFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NjhlMDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMjBkZDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJlMzllNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVkYzE1Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGFlYmFmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWE2YTRmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YjkxY2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZjY2ZjkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFlYTM0Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUyZGUwNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjFhYTIxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzRiY2MwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NjZiMzUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NWE4ZmIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRlYjEzMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRhMmI2MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjgwYWE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTVlZmU0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMGNjMzEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWU2ZmMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg4MTZjOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0MjkzMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGQ1YjdmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDNhMGZlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMmE2NTUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZGViYzIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlNzhhNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EzZjk5MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2ZhZDllLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmRkOGQ0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MGZkNWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMGI1YzEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMWVmMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE3MTBkNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjFjMDgwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzRhYTIxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YTZiMzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZThmZTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdiODQwZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYyNDA1MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWMxOGMxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTk3NTNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMjkxYjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMWM2MTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUwNGE3MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdlMGE2MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2IxZjNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzU1MWVjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzODY2N2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYjgxODMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg5M2YxOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM1ZTE1Ni4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYjY3OWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYzYwNTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4MzkxNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNjM2NhZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzQ0NGNmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQ2Mzc3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYmQxZGEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZTcxMDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlmNTk2Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzMmUxYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTY4ZTA0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDIwZGQ5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZTM5ZTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZGMxNWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhhZWJhZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVhNmE0Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGI5MWNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWY2NmY5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZWEzNGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MmRlMDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIxYWEyMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM0YmNjMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmZmYTAxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmY3ZTU3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YWM0ZGMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYTg2ZjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMwMTA5MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM5NmYwZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTkwMDFiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjcxNTgxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlOTYyMDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNjk1MDAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdlMWJkNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RlOGYxOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjMyZTk1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWQ1ZDJlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MGQ1MjcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NjFhZTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhM2Y4NC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdkMTY2Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmU1MjdlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWIyYThlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMzdhZjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZjMxZWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBkOWY1Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY4ZWI3Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmEwZTE0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzQyNWUxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNzZlMTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMmYxZWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVmZGNkZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNlOWI4MTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI5ZTQ0My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ5Y2E4OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmM3NWQ1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2JkMjdjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYmIwYWMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNTE0YWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU3ZmU1Yy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZiMmMxMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGI2NzllLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWM2MDUxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRiMjEyMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlN2UzYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NjAxY2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OTI4ZDcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MmZkNzcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYxNzFhOGMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOGNiNmNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5Yzg4NjNkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTMzNTAzOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE2YTQ4NTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRjYTY3ODcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAwLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMzA1ZDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTM5NWQ0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDIucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBhNzI4Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAzLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZjBmNTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmE4MGQ5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDUucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA1LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVjMzkzOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA2LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMDI1MzYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA2LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNy5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTIyOGY0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDgucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA4LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0Mjc3ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA5LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wOS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NjViZmIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2M1ZDZiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTEucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzExLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJmNGFkNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzEyLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMzA2NDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzEyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMy5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTkzMjRlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzE0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg2MThmMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzE1LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xNS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMGQ3NzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzE1LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDAucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMGQ3NzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAxLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGI0ZTUwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMi5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJiNWYwMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDMucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNWM3NTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTVjN2ZhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA1LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMyODdlNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA1LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDYucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViN2QwY2YuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA3LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWZhNzJiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wOC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA4LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY1MGVlYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA4LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDkucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wOS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNDQzNTUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEwLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTg3N2MzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzExLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkyN2YwYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzExLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTIucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYjE5YmIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEzLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjU5MjFlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xNC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzE0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRiNzZiMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzE0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTUucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xNS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMzA1ZDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xNS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRhOTUyNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9jdXN0b21fcHJvZ3Jlc3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9jdXN0b21fcHJvZ3Jlc3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzMxYTZlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvY3VzdG9tX3Byb2dyZXNzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxsYXllci1saXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgPgotICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2JhY2tncm91bmQiPgotICAgICAgICA8c2hhcGUgYW5kcm9pZDpzaGFwZT0icmVjdGFuZ2xlIiA+Ci0gICAgICAgICAgICA8c29saWQgYW5kcm9pZDpjb2xvcj0iIzI2MDAwMDAwIiAvPgotICAgICAgICA8L3NoYXBlPgotICAgIDwvaXRlbT4KLSAgICA8aXRlbSBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9zZWNvbmRhcnlQcm9ncmVzcyI+Ci0gICAgICAgIDxjbGlwPgotICAgICAgICAgICAgPHNoYXBlIGFuZHJvaWQ6c2hhcGU9InJlY3RhbmdsZSIgPgotICAgICAgICAgICAgICAgIDxzb2xpZCBhbmRyb2lkOmNvbG9yPSIjNUNmZmZmZmYiIC8+Ci0gICAgICAgICAgICA8L3NoYXBlPgotICAgICAgICA8L2NsaXA+Ci0gICAgPC9pdGVtPgotICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3Byb2dyZXNzIj4KLSAgICAgICAgPGNsaXA+Ci0gICAgICAgICAgICA8c2hhcGUgYW5kcm9pZDpzaGFwZT0icmVjdGFuZ2xlIiA+Ci0gICAgICAgICAgICAgICAgPHNvbGlkIGFuZHJvaWQ6Y29sb3I9IiNmZmZmZmYiIC8+Ci0gICAgICAgICAgICA8L3NoYXBlPgotICAgICAgICA8L2NsaXA+Ci0gICAgPC9pdGVtPgotPC9sYXllci1saXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvY3VzdG9tX3Byb2dyZXNzX3RodW1iLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvY3VzdG9tX3Byb2dyZXNzX3RodW1iLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEzNTk3MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2N1c3RvbV9wcm9ncmVzc190aHVtYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08c2hhcGUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6c2hhcGU9Im92YWwiID4KLSAgICA8c29saWQgYW5kcm9pZDpjb2xvcj0iI2ZmZmZmZiIgLz4KLSAgICA8c2l6ZQotICAgICAgICBhbmRyb2lkOmhlaWdodD0iQGRpbWVuL21jdjJfY3VzdG9tX3Byb2dyZXNzX3RodW1iX3NpemUiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IkBkaW1lbi9tY3YyX2N1c3RvbV9wcm9ncmVzc190aHVtYl9zaXplIiAvPgotPC9zaGFwZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Fycm93X2JhY2sueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hcnJvd19iYWNrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI1ZjcxZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Fycm93X2JhY2sueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTIwLDExSDcuODNsNS41OSwtNS41OUwxMiw0bC04LDggOCw4IDEuNDEsLTEuNDFMNy44MywxM0gyMHYtMnoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfYXNwZWN0X3JhdGlvLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfYXNwZWN0X3JhdGlvLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYyMjhlNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2FzcGVjdF9yYXRpby54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTksMTJoLTJ2M2gtM3YyaDV2LTV6TTcsOWgzTDEwLDdMNSw3djVoMkw3LDl6TTIxLDNMMywzYy0xLjEsMCAtMiwwLjkgLTIsMnYxNGMwLDEuMSAwLjksMiAyLDJoMThjMS4xLDAgMiwtMC45IDIsLTJMMjMsNWMwLC0xLjEgLTAuOSwtMiAtMiwtMnpNMjEsMTkuMDFMMywxOS4wMUwzLDQuOTloMTh2MTQuMDJ6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2F1ZGlvdHJhY2sueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hdWRpb3RyYWNrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdjMTJiNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2F1ZGlvdHJhY2sueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTEyLDN2OS4yOGMtMC40NywtMC4xNyAtMC45NywtMC4yOCAtMS41LC0wLjI4QzguMDEsMTIgNiwxNC4wMSA2LDE2LjVTOC4wMSwyMSAxMC41LDIxYzIuMzEsMCA0LjIsLTEuNzUgNC40NSwtNEgxNVY2aDRWM2gtN3oiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGVjay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZWNrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJmNzIwYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZWNrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQiCi0gICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQiPgotCi0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTAgMGgyNHYyNEgweiIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTkgMTYuMkw0LjggMTJsLTEuNCAxLjRMOSAxOSAyMSA3bC0xLjQtMS40TDkgMTYuMnoiIC8+Ci08L3ZlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZXZyb25fbGVmdC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZXZyb25fbGVmdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMzZkMTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGV2cm9uX2xlZnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE1LjQxLDcuNDFMMTQsNmwtNiw2IDYsNiAxLjQxLC0xLjQxTDEwLjgzLDEyeiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGV2cm9uX3JpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfY2hldnJvbl9yaWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMmNlMDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGV2cm9uX3JpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMCw2TDguNTksNy40MSAxMy4xNywxMmwtNC41OCw0LjU5TDEwLDE4bDYsLTZ6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2RlZmF1bHRfYWxidW1faW1hZ2UueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19kZWZhdWx0X2FsYnVtX2ltYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNlZTY0My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2RlZmF1bHRfYWxidW1faW1hZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6d2lkdGg9IjUxMmRwIgotICAgIGFuZHJvaWQ6aGVpZ2h0PSI1MTJkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjUxMiIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSI1MTIiPgotCi0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiM2MTYxNjEiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0gMCAwIEggNTEyIFYgNTEyIEggMCBWIDAgWiIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iIzUyNTI1MiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTI1NiwxNTF2MTIzLjE0Yy02Ljg4LTQuMDItMTQuODItNi40OC0yMy4zMy02LjQ4IGMtMjUuNzgsMC00Ni42NywyMC44OC00Ni42Nyw0Ni42N2MwLDI1Ljc4LDIwLjg4LDQ2LjY3LDQ2LjY3LDQ2LjY3czQ2LjY3LTIwLjg4LDQ2LjY3LTQ2LjY3VjE5Ny42N0gzMjZWMTUxSDI1NnoiIC8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZm9yd2FyZF8zMC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2ZvcndhcmRfMzAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWZkZjE2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZm9yd2FyZF8zMC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPGdyb3VwPgotICAgICAgICA8Y2xpcC1wYXRoIGFuZHJvaWQ6cGF0aERhdGE9Ik0yNCwyNEgwVjBoMjR2MjR6IE0gMCwwIiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik05LjYgMTMuNWguNGMuMiAwIC40LC0uMS41LC0uMnMuMiwtLjIuMiwtLjR2LS4ycy0uMSwtLjEsLS4xLC0uMiwtLjEsLS4xLC0uMiwtLjFoLS41cy0uMS4xLC0uMi4xLC0uMS4xLC0uMS4ydi4yaC0xYzAsLS4yIDAsLS4zLjEsLS41cy4yLC0uMy4zLC0uNC4zLC0uMi40LC0uMi40LC0uMS41LC0uMWMuMiAwIC40IDAgLjYuMXMuMy4xLjUuMi4yLjIuMy40LjEuMy4xLjV2LjNzLS4xLjIsLS4xLjMsLS4xLjIsLS4yLjIsLS4yLjEsLS4zLjJjLjIuMS40LjIuNS40cy4yLjQuMi42YzAgLjIgMCAuNCwtLjEuNXMtLjIuMywtLjMuNCwtLjMuMiwtLjUuMiwtLjQuMSwtLjYuMWMtLjIgMCwtLjQgMCwtLjUsLS4xcy0uMywtLjEsLS41LC0uMiwtLjIsLS4yLC0uMywtLjQsLS4xLC0uNCwtLjEsLS42aC44di4ycy4xLjEuMS4yLjEuMS4yLjFoLjVzLjEsLS4xLjIsLS4xLjEsLS4xLjEsLS4ydi0uNXMtLjEsLS4xLC0uMSwtLjIsLS4xLC0uMSwtLjIsLS4xaC0uNnYtLjd6bTUuNy43YzAgLjMgMCAuNiwtLjEuOGwtLjMuNnMtLjMuMywtLjUuMywtLjQuMSwtLjYuMSwtLjQgMCwtLjYsLS4xLC0uMywtLjIsLS41LC0uMywtLjIsLS4zLC0uMywtLjYsLS4xLC0uNSwtLjEsLS44di0uN2MwLC0uMyAwLC0uNi4xLC0uOGwuMywtLjZzLjMsLS4zLjUsLS4zLjQsLS4xLjYsLS4xLjQgMCAuNi4xLjMuMi41LjMuMi4zLjMuNi4xLjUuMS44di43em0tLjksLS44di0uNXMtLjEsLS4yLC0uMSwtLjMsLS4xLC0uMSwtLjIsLS4yLC0uMiwtLjEsLS4zLC0uMSwtLjIgMCwtLjMuMWwtLjIuMnMtLjEuMiwtLjEuM3Yycy4xLjIuMS4zLjEuMS4yLjIuMi4xLjMuMS4yIDAgLjMsLS4xbC4yLC0uMnMuMSwtLjIuMSwtLjN2LTEuNXpNNCAxM2MwIDQuNCAzLjYgOCA4IDhzOCwtMy42IDgsLThoLTJjMCAzLjMsLTIuNyA2LC02IDZzLTYsLTIuNywtNiwtNiAyLjcsLTYgNiwtNnY0bDUsLTUsLTUsLTV2NGMtNC40IDAsLTggMy42LC04IDh6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotICAgIDwvZ3JvdXA+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZnVsbHNjcmVlbi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Z1bGxzY3JlZW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjRmNmJjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZnVsbHNjcmVlbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNNywxNEw1LDE0djVoNXYtMkw3LDE3di0zek01LDEwaDJMNyw3aDNMMTAsNUw1LDV2NXpNMTcsMTdoLTN2Mmg1di01aC0ydjN6TTE0LDV2MmgzdjNoMkwxOSw1aC01eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19mdWxsc2NyZWVuX2V4aXQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19mdWxsc2NyZWVuX2V4aXQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzIwNGUyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZnVsbHNjcmVlbl9leGl0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik01LDE2aDN2M2gydi01TDUsMTR2MnpNOCw4TDUsOHYyaDVMMTAsNUw4LDV2M3pNMTQsMTloMnYtM2gzdi0yaC01djV6TTE2LDhMMTYsNWgtMnY1aDVMMTksOGgtM3oiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfaGVscC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2hlbHAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDFkNzVkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfaGVscC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IgotICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0Ij4KLQotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wIDBoMjR2MjRIMHoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0xCi0xN2gtMnYtMmgydjJ6bTIuMDctNy43NWwtLjkgLjkyIEMxMy40NSAxMi45IDEzIDEzLjUgMTMgMTVoLTJ2LS41YzAtMS4xIC40NSAtMi4xCi0xLjE3LTIuODNsMS4yNC0xLjI2Yy4zNy0uMzYgLjU5IC0uODYgLjU5IC0xLjQxIDAtMS4xLS45LTItMi0ycy0yIC45LTIgMkg4YzAtMi4yMQotMS43OS00IDQtNHM0IDEuNzkgNCA0YzAgLjg4LS4zNiAxLjY4LS45MyAyLjI1eiIgLz4KLTwvdmVjdG9yPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfaGlnaF9xdWFsaXR5LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfaGlnaF9xdWFsaXR5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc2ZTIyZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2hpZ2hfcXVhbGl0eS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMzRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMzRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IgotICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0Ij4KLQotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wIDBoMjR2MjRIMHoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOSA0SDVjLTEuMTEgMC0yIDAuOS0yIDJ2MTJjMCAxLjEgMC44OSAyIDIgMmgxNGMxLjEgMCAyLTAuOSAyLTJWNmMwLTEuMS0wLjktMi0yLTJ6bS04IDExSDkuNXYtMmgtMnYySDZWOWgxLjV2Mi41aDJWOUgxMXY2em03LTFjMCAwLjU1LTAuNDUgMS0xIDFoLTAuNzV2MS41aC0xLjVWMTVIMTRjLTAuNTUgMC0xLTAuNDUtMS0xdi00YzAtMC41NSAwLjQ1IC0xIDEtMWgzYzAuNTUgMCAxIDAuNDUgMSAxdjR6bS0zLjUtMC41aDJ2LTNoLTJ2M3oiIC8+Ci08L3ZlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2xhdW5jaC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2xhdW5jaC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YWY2YWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19sYXVuY2gueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5LDE5SDVWNWg3VjNINWMtMS4xMSwwIC0yLDAuOSAtMiwydjE0YzAsMS4xIDAuODksMiAyLDJoMTRjMS4xLDAgMiwtMC45IDIsLTJ2LTdoLTJ2N3pNMTQsM3YyaDMuNTlsLTkuODMsOS44MyAxLjQxLDEuNDFMMTksNi40MVYxMGgyVjNoLTd6Ii8+Ci08L3ZlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX211dGUueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19tdXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYwYWFlYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX211dGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE2LjUsMTJjMCwtMS43NyAtMS4wMiwtMy4yOSAtMi41LC00LjAzdjIuMjFsMi40NSwyLjQ1YzAuMDMsLTAuMiAwLjA1LC0wLjQxIDAuMDUsLTAuNjN6TTE5LDEyYzAsMC45NCAtMC4yLDEuODIgLTAuNTQsMi42NGwxLjUxLDEuNTFDMjAuNjMsMTQuOTEgMjEsMTMuNSAyMSwxMmMwLC00LjI4IC0yLjk5LC03Ljg2IC03LC04Ljc3djIuMDZjMi44OSwwLjg2IDUsMy41NCA1LDYuNzF6TTQuMjcsM0wzLDQuMjcgNy43Myw5TDMsOXY2aDRsNSw1di02LjczbDQuMjUsNC4yNWMtMC42NywwLjUyIC0xLjQyLDAuOTMgLTIuMjUsMS4xOHYyLjA2YzEuMzgsLTAuMzEgMi42MywtMC45NSAzLjY5LC0xLjgxTDE5LjczLDIxIDIxLDE5LjczbC05LC05TDQuMjcsM3pNMTIsNEw5LjkxLDYuMDkgMTIsOC4xOEwxMiw0eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19wYXVzZV9jaXJjbGVfZmlsbGVkLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYmUyMjguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19wYXVzZV9jaXJjbGVfZmlsbGVkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMiwyQzYuNDgsMiAyLDYuNDggMiwxMnM0LjQ4LDEwIDEwLDEwIDEwLC00LjQ4IDEwLC0xMFMxNy41MiwyIDEyLDJ6TTExLDE2TDksMTZMOSw4aDJ2OHpNMTUsMTZoLTJMMTMsOGgydjh6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3BsYXlfY2lyY2xlX2ZpbGxlZC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3BsYXlfY2lyY2xlX2ZpbGxlZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMzlkZWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19wbGF5X2NpcmNsZV9maWxsZWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTEyLDJDNi40OCwyIDIsNi40OCAyLDEyczQuNDgsMTAgMTAsMTAgMTAsLTQuNDggMTAsLTEwUzE3LjUyLDIgMTIsMnpNMTAsMTYuNXYtOWw2LDQuNSAtNiw0LjV6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3JlcGxheV9jaXJjbGVfZmlsbGVkLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcmVwbGF5X2NpcmNsZV9maWxsZWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTZkNWQ5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcmVwbGF5X2NpcmNsZV9maWxsZWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCi0gICAgYW5kcm9pZDpoZWlnaHQ9IjQwZHAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNCI+Ci0KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCwwaDI0djI0SDBWMHoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbFR5cGU9ImV2ZW5PZGQiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMiwyQzYuNDgsMiwyLDYuNDgsMiwxMmMwLDUuNTIsNC40OCwxMCwxMCwxMGM1LjUyLDAsMTAtNC40OCwxMC0xMAotQzIyLDYuNDgsMTcuNTIsMiwxMiwyegotTTE4LDEyYzAsMy4zMS0yLjY5LDYtNiw2Yy0zLjMxLDAtNi0yLjY5LTYtNmgyYzAsMi4yMSwxLjc5LDQsNCw0czQtMS43OSw0LTRzLTEuNzktNC00LTR2M0w4LDdsNC00djMKLUMxNS4zMSw2LDE4LDguNjksMTgsMTJ6IiAvPgotPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19yZXdpbmRfMTAueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19yZXdpbmRfMTAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTU4NmI0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcmV3aW5kXzEwLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSI0MGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8Z3JvdXA+Ci0gICAgICAgIDxjbGlwLXBhdGggYW5kcm9pZDpwYXRoRGF0YT0iTTAsMGgyNHYyNEgwVjB6IE0gMCwwIiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMiA1VjFMNyA2bDUgNVY3YzMuMyAwIDYgMi43IDYgNnMtMi43IDYsLTYgNiwtNiwtMi43LC02LC02SDRjMCA0LjQgMy42IDggOCA4czgsLTMuNiA4LC04LC0zLjYsLTgsLTgsLTh6bS0xLjEgMTFIMTB2LTMuM0w5IDEzdi0uN2wxLjgsLS42aC4xVjE2em00LjMsLTEuOGMwIC4zIDAgLjYsLS4xLjhsLS4zLjZzLS4zLjMsLS41LjMsLS40LjEsLS42LjEsLS40IDAsLS42LC0uMSwtLjMsLS4yLC0uNSwtLjMsLS4yLC0uMywtLjMsLS42LC0uMSwtLjUsLS4xLC0uOHYtLjdjMCwtLjMgMCwtLjYuMSwtLjhsLjMsLS42cy4zLC0uMy41LC0uMy40LC0uMS42LC0uMS40IDAgLjYuMWMuMi4xLjMuMi41LjNzLjIuMy4zLjYuMS41LjEuOHYuN3ptLS45LC0uOHYtLjVzLS4xLC0uMiwtLjEsLS4zLC0uMSwtLjEsLS4yLC0uMiwtLjIsLS4xLC0uMywtLjEsLS4yIDAsLS4zLjFsLS4yLjJzLS4xLjIsLS4xLjN2MnMuMS4yLjEuMy4xLjEuMi4yLjIuMS4zLjEuMiAwIC4zLC0uMWwuMiwtLjJzLjEsLS4yLjEsLS4zdi0xLjV6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotICAgIDwvZ3JvdXA+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2QueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlY2I2ZDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IgotICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0Ij4KLQotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wLDBoMjR2MjRIMFYweiIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5LDNINUMzLjg5LDMsMywzLjksMyw1djE0YzAsMS4xLDAuODksMiwyLDJoMTRjMS4xLDAsMi0wLjksMi0yVjVDMjEsMy45LDIwLjEsMywxOSwzegotTTEzLDloNGMwLjU1LDAsMSwwLjQ1LDEsMXY0IGMwLDAuNTUtMC40NSwxLTEsMWgtNFY5egotTTkuNSwxMy41di0xSDdjLTAuNTUsMC0xLTAuNDUtMS0xVjEwYzAtMC41NSwwLjQ1LTEsMS0xaDNjMC41NSwwLDEsMC40NSwxLDF2MUg5LjV2LTAuNWgtMnYxSDEwCi1jMC41NSwwLDEsMC40NSwxLDFWMTRjMCwwLjU1LTAuNDUsMS0xLDFIN2MtMC41NSwwLTEtMC40NS0xLTF2LTFoMS41djAuNUg5LjV6Ci1NMTQuNSwxMy41aDJ2LTNoLTJWMTMuNXoiIC8+Ci08L3ZlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NldHRpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2V0dGluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTllY2MxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2V0dGluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5LjQzLDEyLjk4YzAuMDQsLTAuMzIgMC4wNywtMC42NCAwLjA3LC0wLjk4cy0wLjAzLC0wLjY2IC0wLjA3LC0wLjk4bDIuMTEsLTEuNjVjMC4xOSwtMC4xNSAwLjI0LC0wLjQyIDAuMTIsLTAuNjRsLTIsLTMuNDZjLTAuMTIsLTAuMjIgLTAuMzksLTAuMyAtMC42MSwtMC4yMmwtMi40OSwxYy0wLjUyLC0wLjQgLTEuMDgsLTAuNzMgLTEuNjksLTAuOThsLTAuMzgsLTIuNjVDMTQuNDYsMi4xOCAxNC4yNSwyIDE0LDJoLTRjLTAuMjUsMCAtMC40NiwwLjE4IC0wLjQ5LDAuNDJsLTAuMzgsMi42NWMtMC42MSwwLjI1IC0xLjE3LDAuNTkgLTEuNjksMC45OGwtMi40OSwtMWMtMC4yMywtMC4wOSAtMC40OSwwIC0wLjYxLDAuMjJsLTIsMy40NmMtMC4xMywwLjIyIC0wLjA3LDAuNDkgMC4xMiwwLjY0bDIuMTEsMS42NWMtMC4wNCwwLjMyIC0wLjA3LDAuNjUgLTAuMDcsMC45OHMwLjAzLDAuNjYgMC4wNywwLjk4bC0yLjExLDEuNjVjLTAuMTksMC4xNSAtMC4yNCwwLjQyIC0wLjEyLDAuNjRsMiwzLjQ2YzAuMTIsMC4yMiAwLjM5LDAuMyAwLjYxLDAuMjJsMi40OSwtMWMwLjUyLDAuNCAxLjA4LDAuNzMgMS42OSwwLjk4bDAuMzgsMi42NWMwLjAzLDAuMjQgMC4yNCwwLjQyIDAuNDksMC40Mmg0YzAuMjUsMCAwLjQ2LC0wLjE4IDAuNDksLTAuNDJsMC4zOCwtMi42NWMwLjYxLC0wLjI1IDEuMTcsLTAuNTkgMS42OSwtMC45OGwyLjQ5LDFjMC4yMywwLjA5IDAuNDksMCAwLjYxLC0wLjIybDIsLTMuNDZjMC4xMiwtMC4yMiAwLjA3LC0wLjQ5IC0wLjEyLC0wLjY0bC0yLjExLC0xLjY1ek0xMiwxNS41Yy0xLjkzLDAgLTMuNSwtMS41NyAtMy41LC0zLjVzMS41NywtMy41IDMuNSwtMy41IDMuNSwxLjU3IDMuNSwzLjUgLTEuNTcsMy41IC0zLjUsMy41eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19za2lwX25leHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19za2lwX25leHQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWYyODEyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2tpcF9uZXh0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik02LDE4bDguNSwtNkw2LDZ2MTJ6TTE2LDZ2MTJoMlY2aC0yeiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19za2lwX3ByZXZpb3VzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2tpcF9wcmV2aW91cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZGEzMTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19za2lwX3ByZXZpb3VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik02LDZoMnYxMkw2LDE4ek05LjUsMTJsOC41LDZMMTgsNnoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc3VidGl0bGVfb2ZmLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc3VidGl0bGVfb2ZmLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBhNzI3YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3N1YnRpdGxlX29mZi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IgotICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0Ij4KLQotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wLDBoMjR2MjRIMFYweiIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5LjUsNS41djEzaC0xNXYtMTNIMTkuNXogTTE5LDRINUMzLjg5LDQsMyw0LjksMyw2djEyYzAsMS4xLDAuODksMiwyLDJoMTRjMS4xLDAsMi0wLjksMi0yVjZDMjEsNC45LDIwLjEsNCwxOSw0TDE5LDR6IiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTEsMTFIOS41di0wLjVoLTJ2M2gyVjEzSDExdjFjMCwwLjU1LTAuNDUsMS0xLDFIN2MtMC41NSwwLTEtMC40NS0xLTF2LTRjMC0wLjU1LDAuNDUtMSwxLTFoM2MwLjU1LDAsMSwwLjQ1LDEsMVYxMXoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOCwxMWgtMS41di0wLjVoLTJ2M2gyVjEzSDE4djFjMCwwLjU1LTAuNDUsMS0xLDFoLTNjLTAuNTUsMC0xLTAuNDUtMS0xdi00YzAtMC41NSwwLjQ1LTEsMS0xaDNjMC41NSwwLDEsMC40NSwxLDFWMTF6IiAvPgotPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zdWJ0aXRsZV9vbi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3N1YnRpdGxlX29uLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M5MWMwNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3N1YnRpdGxlX29uLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQiCi0gICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQiPgotCi0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTAgMGgyNHYyNEgweiIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5IDRINWMtMS4xMSAwLTIgMC45LTIgMnYxMmMwIDEuMSAwLjg5IDIgMiAyaDE0YzEuMSAwIDItMC45IDItMlY2YzAtMS4xLTAuOS0yLTItMnptLTggN0g5LjV2LTAuNWgtMnYzaDJWMTNIMTF2MWMwIDAuNTUtMC40NSAxLTEgMUg3Yy0wLjU1IDAtMS0wLjQ1LTEtMXYtNGMwLTAuNTUgMC40NSAtMSAxLTFoM2MwLjU1IDAgMSAwLjQ1IDEgMXYxem03IDBoLTEuNXYtMC41aC0ydjNoMlYxM0gxOHYxYzAgMC41NS0wLjQ1IDEtMSAxaC0zYy0wLjU1IDAtMS0wLjQ1LTEtMXYtNGMwLTAuNTUgMC40NSAtMSAxLTFoM2MwLjU1IDAgMSAwLjQ1IDEgMXYxeiIgLz4KLTwvdmVjdG9yPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfdW5tdXRlLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfdW5tdXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRmYjJiOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3VubXV0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMyw5djZoNGw1LDVMMTIsNEw3LDlMMyw5ek0xNi41LDEyYzAsLTEuNzcgLTEuMDIsLTMuMjkgLTIuNSwtNC4wM3Y4LjA1YzEuNDgsLTAuNzMgMi41LC0yLjI1IDIuNSwtNC4wMnpNMTQsMy4yM3YyLjA2YzIuODksMC44NiA1LDMuNTQgNSw2Ljcxcy0yLjExLDUuODUgLTUsNi43MXYyLjA2YzQuMDEsLTAuOTEgNywtNC40OSA3LC04Ljc3cy0yLjk5LC03Ljg2IC03LC04Ljc3eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTBmZjEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RlZF9kYXJrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFuaW1hdGlvbi1saXN0Ci0gICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDpvbmVzaG90PSJ0cnVlIj4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLTwvYW5pbWF0aW9uLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0ZWRfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNmYzdmZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0ZWRfbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YW5pbWF0aW9uLWxpc3QKLSAgICAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOm9uZXNob3Q9InRydWUiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLTwvYW5pbWF0aW9uLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0aW5nX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVhZjdiMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0aW5nX2RhcmsueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YW5pbWF0aW9uLWxpc3QKLSAgICAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOm9uZXNob3Q9ImZhbHNlIj4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci08L2FuaW1hdGlvbi1saXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19saWdodC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0aW5nX2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNiNDE3MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0aW5nX2xpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFuaW1hdGlvbi1saXN0Ci0gICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDpvbmVzaG90PSJmYWxzZSI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLTwvYW5pbWF0aW9uLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjFkZmFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2RhcmsueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2RhcmsiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2FibGU9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19kYXJrIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrIiAvPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQzZDg0ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9saWdodC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0ZWRfbGlnaHQiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2FibGU9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19saWdodCIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodCIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0IiAvPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX2Nsb3NlX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfZGFyay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4OGM4YzcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfZGFyay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19kaWFsb2dfY2xvc2VfZGFyayIgLz4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19jbG9zZV9saWdodC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19jbG9zZV9saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNTBlMGYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbT4KLSAgICAgICAgPGJpdG1hcAotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19kaWFsb2dfY2xvc2VfbGlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmFscGhhPSIwLjg3IiAvPgotICAgIDwvaXRlbT4KLQotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX21hdGVyaWFsX2JhY2tncm91bmRfZGFyay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmM3ZWNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX21hdGVyaWFsX2JhY2tncm91bmRfZGFyay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gVGhpcyBpcyB0aGUgY29weSBvZiBAZHJhd2FibGUvYWJjX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2RhcmsgZXhjZXB0IGZvciBpbnNldAotICAgICB3aGljaCBpbmNsdWRlcyB1bm5lY2Vzc2FyeSBwYWRkaW5nLiAtLT4KLTxzaGFwZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6c2hhcGU9InJlY3RhbmdsZSI+Ci0gICAgPGNvcm5lcnMgYW5kcm9pZDpyYWRpdXM9IjJkcCIgLz4KLSAgICA8c29saWQgYW5kcm9pZDpjb2xvcj0iQGNvbG9yL2JhY2tncm91bmRfZmxvYXRpbmdfbWF0ZXJpYWxfZGFyayIgLz4KLTwvc2hhcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfbWF0ZXJpYWxfYmFja2dyb3VuZF9saWdodC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFiMjM1YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2xpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSBUaGlzIGlzIHRoZSBjb3B5IG9mIEBkcmF3YWJsZS9hYmNfZGlhbG9nX21hdGVyaWFsX2JhY2tncm91bmRfbGlnaHQgZXhjZXB0IGZvciBpbnNldAotICAgICB3aGljaCBpbmNsdWRlcyB1bm5lY2Vzc2FyeSBwYWRkaW5nLiAtLT4KLTxzaGFwZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6c2hhcGU9InJlY3RhbmdsZSI+Ci0gICAgPGNvcm5lcnMgYW5kcm9pZDpyYWRpdXM9IjJkcCIgLz4KLSAgICA8c29saWQgYW5kcm9pZDpjb2xvcj0iQGNvbG9yL2JhY2tncm91bmRfZmxvYXRpbmdfbWF0ZXJpYWxfbGlnaHQiIC8+Ci08L3NoYXBlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZ3JvdXBfY29sbGFwc2UueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9ncm91cF9jb2xsYXBzZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNzJiYzguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9ncm91cF9jb2xsYXBzZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhbmltYXRpb24tbGlzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6b25lc2hvdD0idHJ1ZSI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzAwIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDEiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wMiIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzAzIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDQiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wNSIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzA2IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDciIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wOCIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzA5IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMTAiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8xMSIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzEyIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMTMiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8xNCIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzE1IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLTwvYW5pbWF0aW9uLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2dyb3VwX2V4cGFuZC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2dyb3VwX2V4cGFuZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiM2ZkYjYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9ncm91cF9leHBhbmQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YW5pbWF0aW9uLWxpc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOm9uZXNob3Q9InRydWUiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDAiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDEiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDIiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDMiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDQiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDUiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDYiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDciIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDgiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDkiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMTAiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMTEiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMTIiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMTMiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMTQiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMTUiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotPC9hbmltYXRpb24tbGlzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfZGFyay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BhdXNlX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjIxOGE3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfZGFyay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tZWRpYV9wYXVzZV9kYXJrIiAvPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZDFmMDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9saWdodC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtPgotICAgICAgICA8Yml0bWFwCi0gICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX21lZGlhX3BhdXNlX2xpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDphbHBoYT0iMC44NyIgLz4KLSAgICA8L2l0ZW0+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDQ1YTMzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGxheV9kYXJrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21lZGlhX3BsYXlfZGFyayIgLz4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BsYXlfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFmYjdhNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BsYXlfbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbT4KLSAgICAgICAgPGJpdG1hcAotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19tZWRpYV9wbGF5X2xpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDphbHBoYT0iMC44NyIgLz4KLSAgICA8L2l0ZW0+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTEwOGE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9kYXJrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21lZGlhX3N0b3BfZGFyayIgLz4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3N0b3BfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJjNmNlOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3N0b3BfbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbT4KLSAgICAgICAgPGJpdG1hcAotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19tZWRpYV9zdG9wX2xpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDphbHBoYT0iMC44NyIgLz4KLSAgICA8L2l0ZW0+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGY0ZmQ2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19kYXJrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2F1ZGlvdHJhY2tfZGFyayIgLz4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX3ZvbF90eXBlX2F1ZGlvdHJhY2tfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM5ZGJjMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX3ZvbF90eXBlX2F1ZGlvdHJhY2tfbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbT4KLSAgICAgICAgPGJpdG1hcAotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19hdWRpb3RyYWNrX2xpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDphbHBoYT0iMC44NyIgLz4KLSAgICA8L2l0ZW0+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9pbnRlcnBvbGF0b3IvbXJfZmFzdF9vdXRfc2xvd19pbi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2ludGVycG9sYXRvci9tcl9mYXN0X291dF9zbG93X2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI2YTE3MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2ludGVycG9sYXRvci9tcl9mYXN0X291dF9zbG93X2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICAtLT4KLQotPHBhdGhJbnRlcnBvbGF0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6Y29udHJvbFgxPSIwLjQiCi0gICAgYW5kcm9pZDpjb250cm9sWTE9IjAiCi0gICAgYW5kcm9pZDpjb250cm9sWDI9IjAuMiIKLSAgICBhbmRyb2lkOmNvbnRyb2xZMj0iMSIvPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9pbnRlcnBvbGF0b3IvbXJfbGluZWFyX291dF9zbG93X2luLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvaW50ZXJwb2xhdG9yL21yX2xpbmVhcl9vdXRfc2xvd19pbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYmYyOTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9pbnRlcnBvbGF0b3IvbXJfbGluZWFyX291dF9zbG93X2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICAtLT4KLQotPHBhdGhJbnRlcnBvbGF0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6Y29udHJvbFgxPSIwIgotICAgIGFuZHJvaWQ6Y29udHJvbFkxPSIwIgotICAgIGFuZHJvaWQ6Y29udHJvbFgyPSIwLjIiCi0gICAgYW5kcm9pZDpjb250cm9sWTI9IjEiLz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX211c2ljLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX211c2ljLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U0ZDM2NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9tdXNpYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotCi0gICAgPFZpZXcKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZHAiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMC4yNSIvPgotCi0gICAgPEltYWdlVmlldwotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FsYnVtIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwLjUiCi0gICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJmaXRDZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfZGVmYXVsdF9hbGJ1bV9pbWFnZSIgLz4KLQotICAgIDxWaWV3Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRwIgotICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAuMjUiLz4KLTwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3NldHRpbmdzX2xpc3RfaXRlbS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9zZXR0aW5nc19saXN0X2l0ZW0ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTU2ZGNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3NldHRpbmdzX2xpc3RfaXRlbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19oZWlnaHQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBjb2xvci9ibGFja19vcGFjaXR5XzcwIj4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19oZWlnaHQiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KLQotICAgICAgICA8SW1hZ2VWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2ljb24iCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19pY29uX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW49IjhkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIiAvPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0IgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tYWluX3RleHQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc190ZXh0X2hlaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMmRwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IkBjb2xvci93aGl0ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX21haW5fdGV4dF9zaXplIi8+Ci0KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N1Yl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfdGV4dF9oZWlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL21haW5fdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMmRwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IkBjb2xvci93aGl0ZV9vcGFjaXR5XzcwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3Nfc3ViX3RleHRfc2l6ZSIvPgotICAgIDwvUmVsYXRpdmVMYXlvdXQ+Ci08L0xpbmVhckxheW91dD4KLQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfc3ViX3NldHRpbmdzX2xpc3RfaXRlbS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0N2E3Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGNvbG9yL2JsYWNrX29wYWNpdHlfNzAiPgotCi0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCIKLSAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgotCi0gICAgICAgIDxJbWFnZVZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2hlY2siCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19pY29uX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW49IjhkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19jaGVjayIvPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0IgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfdGV4dF9oZWlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjJkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3Ivd2hpdGUiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19tYWluX3RleHRfc2l6ZSIvPgotICAgIDwvUmVsYXRpdmVMYXlvdXQ+Ci08L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3RyYW5zcG9ydF9jb250cm9scy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF90cmFuc3BvcnRfY29udHJvbHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2E1OTU3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3RyYW5zcG9ydF9jb250cm9scy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSJAZGltZW4vbWN2Ml90cmFuc3BvcnRfY29udHJvbHNfcGFkZGluZyIKLSAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iQGRpbWVuL21jdjJfdHJhbnNwb3J0X2NvbnRyb2xzX3BhZGRpbmciCi0gICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJ2aXNpYmxlIj4KLQotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3ByZXYiIHN0eWxlPSJAc3R5bGUvRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QcmV2aW91cyIgLz4KLSAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9yZXciIHN0eWxlPSJAc3R5bGUvRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5SZXciIC8+Ci0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcGF1c2UiIHN0eWxlPSJAc3R5bGUvRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QYXVzZSIgLz4KLSAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9mZndkIiBzdHlsZT0iQHN0eWxlL0VtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uRmZ3ZCIgLz4KLSAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9uZXh0IiBzdHlsZT0iQHN0eWxlL0VtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uTmV4dCIgLz4KLTwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfbGFuZHNjYXBlX211c2ljLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfbGFuZHNjYXBlX211c2ljLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNlNzA1OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX2xhbmRzY2FwZV9tdXNpYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjQjMwMEZGMDAiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXVzaWNfaW1hZ2UiCi0gICAgICAgIHN0eWxlPSJAc3R5bGUvRnVsbE11c2ljTGFuZHNjYXBlLkltYWdlIj4KLQotICAgICAgICA8SW1hZ2VWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FsYnVtIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2Z1bGxfYWxidW1faW1hZ2VfbGFuZHNjYXBlX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfYWxidW1faW1hZ2VfbGFuZHNjYXBlX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX2RlZmF1bHRfYWxidW1faW1hZ2UiLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tdXNpY190ZXh0IgotICAgICAgICBzdHlsZT0iQHN0eWxlL0Z1bGxNdXNpY0xhbmRzY2FwZS5UZXh0Ij4KLQotICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGl0bGUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbWN2Ml9tdXNpY190aXRsZV91bmtub3duX3RleHQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyMHNwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9ImJvbGQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iI0ZGRkZGRiIgLz4KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FydGlzdCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9tY3YyX211c2ljX2FydGlzdF91bmtub3duX3RleHQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxNnNwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNCQkJCQkIiIC8+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci08L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3BvcnRyYWl0X211c2ljLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfcG9ydHJhaXRfbXVzaWMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWYxYmIzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfcG9ydHJhaXRfbXVzaWMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tdXNpY19pbWFnZSIKLSAgICAgICAgc3R5bGU9IkBzdHlsZS9GdWxsTXVzaWNQb3J0cmFpdC5JbWFnZSI+Ci0KLSAgICAgICAgPEltYWdlVmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hbGJ1bSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vbWN2Ml9mdWxsX2FsYnVtX2ltYWdlX3BvcnRyYWl0X3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfYWxidW1faW1hZ2VfcG9ydHJhaXRfc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfZGVmYXVsdF9hbGJ1bV9pbWFnZSIvPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL211c2ljX3RleHQiCi0gICAgICAgIHN0eWxlPSJAc3R5bGUvRnVsbE11c2ljUG9ydHJhaXQuVGV4dCI+Ci0KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2Z1bGxfYWxidW1faW1hZ2VfcG9ydHJhaXRfc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21jdjJfbXVzaWNfdGl0bGVfdW5rbm93bl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjBzcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJib2xkIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNGRkZGRkYiIC8+Ci0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hcnRpc3QiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZnVsbF9hbGJ1bV9pbWFnZV9wb3J0cmFpdF9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbWN2Ml9tdXNpY19hcnRpc3RfdW5rbm93bl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTZzcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjQkJCQkJCIiAvPgotICAgIDwvTGluZWFyTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9zZXR0aW5nc19saXN0X2l0ZW0ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9zZXR0aW5nc19saXN0X2l0ZW0ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTJlYTVlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaGVpZ2h0IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAY29sb3IvYmxhY2tfb3BhY2l0eV83MCI+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KLQotICAgICAgICA8SW1hZ2VWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2ljb24iCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19pY29uX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI4ZHAiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIvPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+Ci0KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21haW5fdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfdGV4dF9oZWlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyZHAiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3Ivd2hpdGUiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX21haW5fdGV4dF9zaXplIi8+Ci0KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N1Yl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc190ZXh0X2hlaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvbWFpbl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyZHAiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGNvbG9yL3doaXRlX29wYWNpdHlfNzAiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX3N1Yl90ZXh0X3NpemUiLz4KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3N1Yl9zZXR0aW5nc19saXN0X2l0ZW0ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkxMjhkMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3N1Yl9zZXR0aW5nc19saXN0X2l0ZW0ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBjb2xvci9ibGFja19vcGFjaXR5XzcwIj4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX2hlaWdodCIKLSAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgotCi0gICAgICAgIDxJbWFnZVZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2hlY2siCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19pY29uX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI4ZHAiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfY2hlY2siLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxSZWxhdGl2ZUxheW91dAotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaGVpZ2h0IgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc190ZXh0X2hlaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMmRwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IkBjb2xvci93aGl0ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfbWFpbl90ZXh0X3NpemUiLz4KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF90cmFuc3BvcnRfY29udHJvbHMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF90cmFuc3BvcnRfY29udHJvbHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTE0Nzg1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfdHJhbnNwb3J0X2NvbnRyb2xzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IkBkaW1lbi9tY3YyX3RyYW5zcG9ydF9jb250cm9sc19wYWRkaW5nIgotICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSJAZGltZW4vbWN2Ml90cmFuc3BvcnRfY29udHJvbHNfcGFkZGluZyIKLSAgICBhbmRyb2lkOnZpc2liaWxpdHk9InZpc2libGUiPgotCi0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcHJldiIgc3R5bGU9IkBzdHlsZS9GdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUHJldmlvdXMiIC8+Ci0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcmV3IiBzdHlsZT0iQHN0eWxlL0Z1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5SZXciIC8+Ci0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcGF1c2UiIHN0eWxlPSJAc3R5bGUvRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlBhdXNlIiAvPgotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2Zmd2QiIHN0eWxlPSJAc3R5bGUvRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLkZmd2QiIC8+Ci0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvbmV4dCIgc3R5bGU9IkBzdHlsZS9GdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uTmV4dCIgLz4KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbWVkaWFfY29udHJvbGxlci54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tZWRpYV9jb250cm9sbGVyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY1OGYwNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tZWRpYV9jb250cm9sbGVyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgotICAgIGFuZHJvaWQ6bGF5b3V0RGlyZWN0aW9uPSJsdHIiPgotCi0gICAgPFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGl0bGVfYmFyIgotICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBsYXlvdXQvdGl0bGVfYmFyX2dyYWRpZW50IgotICAgICAgICBzdHlsZT0iQHN0eWxlL1RpdGxlQmFyIj4KLQotICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlX2Jhcl9sZWZ0IgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgotCi0gICAgICAgICAgICA8SW1hZ2VCdXR0b24KLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2JhY2siCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpjbGlja2FibGU9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFN0YXJ0PSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjVkaXAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJ2aXNpYmxlIgotICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGl0bGVCYXJCdXR0b24uQmFjayIvPgotCi0gICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlX3RleHQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9ImVuZCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvUmlnaHRPZj0iQGlkL2JhY2siCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDptYXhMaW5lcz0iMSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI1ZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI1ZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE1c3AiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNGRkZGRkZGRiIvPgotICAgICAgICA8L0xpbmVhckxheW91dD4KLQotICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlX2Jhcl9yaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+Ci0KLSAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FkX2V4dGVybmFsX2xpbmsiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpjbGlja2FibGU9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjVkaXAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjEwZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIj4KLQotICAgICAgICAgICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FkX3RleHQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjVkaXAiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9NZWRpYUNvbnRyb2xWaWV3Ml9hZF90ZXh0IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxMHNwIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iI0ZGRkZGRkZGIiAvPgotCi0gICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWRfbGF1bmNoIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGl0bGVCYXJCdXR0b24uTGF1bmNoIiAvPgotICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICAgICAgICAgIDx2aWV3IGNsYXNzPSJjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5NZWRpYVJvdXRlQnV0dG9uIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2FzdCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb249IkBzdHJpbmcvbXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9UaXRsZUJhckJ1dHRvbiIgLz4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotCi0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NlbnRlcl92aWV3IgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21pbmltYWxfZXh0cmFfdmlldyIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0icmlnaHQiPgotCi0gICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9mdWxsc2NyZWVuIgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJyaWdodCIKLSAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvQm90dG9tQmFyQnV0dG9uLkZ1bGxTY3JlZW4iIC8+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8UmVsYXRpdmVMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9jdXN0b21fcHJvZ3Jlc3NfdGh1bWJfc2l6ZSI+Ci0KLSAgICAgICAgPFNlZWtCYXIKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvcHJvZ3Jlc3MiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9jdXN0b21fcHJvZ3Jlc3NfdGh1bWJfc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL21jdjJfc2Vla19iYXJfZGVzYyIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iMGRwIgotICAgICAgICAgICAgYW5kcm9pZDptYXhIZWlnaHQ9IkBkaW1lbi9tY3YyX2N1c3RvbV9wcm9ncmVzc19tYXhfc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSJAZGltZW4vbWN2Ml9jdXN0b21fcHJvZ3Jlc3NfbWF4X3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmVsZXZhdGlvbj0iMTBkcCIvPgotCi0gICAgICAgIDxWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3Byb2dyZXNzX2J1ZmZlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2J1ZmZlcl92aWV3X2hlaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50Qm90dG9tPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAY29sb3IvYm90dG9tX2Jhcl9iYWNrZ3JvdW5kIgotICAgICAgICAgICAgYW5kcm9pZDplbGV2YXRpb249IjBkcCIvPgotICAgIDwvUmVsYXRpdmVMYXlvdXQ+Ci0KLSAgICA8UmVsYXRpdmVMYXlvdXQKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ib3R0b21fYmFyIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjQ0ZHAiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGNvbG9yL2JvdHRvbV9iYXJfYmFja2dyb3VuZCI+Ci0KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ib3R0b21fYmFyX2xlZnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFN0YXJ0PSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiPgotCi0gICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FkX3NraXBfdGltZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjRkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxMnNwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjRkZGRkZGIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aW1lIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9SaWdodE9mPSJAaWQvYm90dG9tX2Jhcl9sZWZ0IgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTBkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMGRwIgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiID4KLQotICAgICAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aW1lX2N1cnJlbnQiCi0gICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9UaW1lVGV4dC5DdXJyZW50Ii8+Ci0gICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpbWVfaW50ZXJwdW5jdCIKLSAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1RpbWVUZXh0LkludGVycHVuY3QiLz4KLSAgICAgICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGltZV9lbmQiCi0gICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9UaW1lVGV4dC5FbmQiLz4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ib3R0b21fYmFyX3JpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRFbmQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InJpZ2h0Ij4KLQotICAgICAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYmFzaWNfY29udHJvbHMiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIiA+Ci0KLSAgICAgICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hZF9yZW1haW5pbmciCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTJzcCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNGRkZGRkYiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KLQotICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL211dGUiCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvQm90dG9tQmFyQnV0dG9uLk11dGUiIC8+Ci0gICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3VidGl0bGUiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJmaXRDZW50ZXIiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uQ0MiIC8+Ci0gICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZnVsbHNjcmVlbiIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uRnVsbFNjcmVlbiIvPgotICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL292ZXJmbG93X3JpZ2h0IgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0JvdHRvbUJhckJ1dHRvbi5PdmVyZmxvd1JpZ2h0Ii8+Ci0gICAgICAgICAgICA8L0xpbmVhckxheW91dD4KLQotICAgICAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZXh0cmFfY29udHJvbHMiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCI+Ci0KLSAgICAgICAgICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY3VzdG9tX2J1dHRvbnMiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgotCi0gICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdmlkZW9fcXVhbGl0eSIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uVmlkZW9RdWFsaXR5IiAvPgotICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NldHRpbmdzIgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0JvdHRvbUJhckJ1dHRvbi5TZXR0aW5ncyIgLz4KLSAgICAgICAgICAgICAgICA8SW1hZ2VCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9vdmVyZmxvd19sZWZ0IgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0JvdHRvbUJhckJ1dHRvbi5PdmVyZmxvd0xlZnQiLz4KLSAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgotICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9taW5pbWFsX3RyYW5zcG9ydF9jb250cm9scy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9taW5pbWFsX3RyYW5zcG9ydF9jb250cm9scy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMGM4MGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbWluaW1hbF90cmFuc3BvcnRfY29udHJvbHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgotCi0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcGF1c2UiIHN0eWxlPSJAc3R5bGUvTWluaW1hbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uIiAvPgotPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY2hvb3Nlcl9kaWFsb2cueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY2hvb3Nlcl9kaWFsb2cueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTg5ZTE2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2Nob29zZXJfZGlhbG9nLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLSAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9jaG9vc2VyX3RpdGxlIgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyNGRwIgotICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMjRkcCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSIyNGRwIgotICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbXJfY2hvb3Nlcl90aXRsZSIKLSAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgotICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgotICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuVGl0bGUiIC8+Ci0gICAgPExpc3RWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY2hvb3Nlcl9saXN0IgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOmRpdmlkZXI9IkBhbmRyb2lkOmNvbG9yL3RyYW5zcGFyZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOmRpdmlkZXJIZWlnaHQ9IjBkcCIgLz4KLSAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2VtcHR5IgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjQwZHAiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgotICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjkwZHAiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjE2ZHAiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxNmRwIgotICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiPgotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21yX2Nob29zZXJfc2VhcmNoaW5nIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlNlY29uZGFyeVRleHQiIC8+Ci0gICAgICAgIDxQcm9ncmVzc0JhciBhbmRyb2lkOmxheW91dF93aWR0aD0iMTUwZHAiCi0gICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aW5kZXRlcm1pbmF0ZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3Byb2dyZXNzQmFyU3R5bGVIb3Jpem9udGFsIiAvPgotICAgIDwvTGluZWFyTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jaG9vc2VyX2xpc3RfaXRlbS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jaG9vc2VyX2xpc3RfaXRlbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ODg3OWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY2hvb3Nlcl9saXN0X2l0ZW0ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9IjU2ZHAiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjI0ZHAiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIyNGRwIgotICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIgPgotCi0gICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2Nob29zZXJfcm91dGVfaWNvbiIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyNGRwIgotICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyNGRwIgotICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjI0ZHAiIC8+Ci0KLSAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxZHAiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIgPgotCi0gICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2Nob29zZXJfcm91dGVfbmFtZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMzJkcCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlByaW1hcnlUZXh0IiAvPgotCi0gICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2Nob29zZXJfcm91dGVfZGVzYyIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjRkcCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlNlY29uZGFyeVRleHQiIC8+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY29udHJvbGxlcl9tYXRlcmlhbF9kaWFsb2dfYi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jb250cm9sbGVyX21hdGVyaWFsX2RpYWxvZ19iLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMwNDQ3MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jb250cm9sbGVyX21hdGVyaWFsX2RpYWxvZ19iLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDppZD0iQCtpZC9tcl9leHBhbmRhYmxlX2FyZWEiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPgotICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9tcl9kaWFsb2dfYXJlYSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSI/YW5kcm9pZDphdHRyL2NvbG9yQmFja2dyb3VuZEZsb2F0aW5nIj4KLSAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL21yX3RpdGxlX2JhciIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMjRkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMmRwIgotICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgPgotICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfbmFtZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNzJkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJlbmQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlRpdGxlIiAvPgotICAgICAgICAgICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvbXJfY2xvc2UiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjQ4ZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0OGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9tcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSI/YXR0ci9tZWRpYVJvdXRlQ2xvc2VEcmF3YWJsZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9Ij9hbmRyb2lkOmF0dHIvc2VsZWN0YWJsZUl0ZW1CYWNrZ3JvdW5kQm9yZGVybGVzcyIgLz4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAK2lkL21yX2N1c3RvbV9jb250cm9sIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+Ci0gICAgICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAK2lkL21yX2RlZmF1bHRfY29udHJvbCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KLSAgICAgICAgICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9hcnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6YWRqdXN0Vmlld0JvdW5kcz0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0WFkiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSI/YW5kcm9pZDphdHRyL2NvbG9yUHJpbWFyeSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJ0b3AiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb249IkBzdHJpbmcvbXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgotICAgICAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3BsaXRNb3Rpb25FdmVudHM9ImZhbHNlIj4KLSAgICAgICAgICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbXJfbWVkaWFfbWFpbl9jb250cm9sIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSIxNmRwIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjE2ZHAiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iP2F0dHIvbWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSI+Ci0gICAgICAgICAgICAgICAgICAgIDxSZWxhdGl2ZUxheW91dAotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tcl9wbGF5YmFja19jb250cm9sIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMjRkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMmRwIiA+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9tcl9jb250cm9sX3BsYXliYWNrX2N0cmwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMmRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb249IkBzdHJpbmcvbXJfY29udHJvbGxlcl9wbGF5IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iP2FuZHJvaWQ6YXR0ci9zZWxlY3RhYmxlSXRlbUJhY2tncm91bmRCb3JkZXJsZXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9tcl9jb250cm9sX3RpdGxlX2NvbnRhaW5lciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvTGVmdE9mPSJAaWQvbXJfY29udHJvbF9wbGF5YmFja19jdHJsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY29udHJvbF90aXRsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5QcmltYXJ5VGV4dCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2NvbnRyb2xfc3VidGl0bGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuU2Vjb25kYXJ5VGV4dCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvUmVsYXRpdmVMYXlvdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY29udHJvbF9kaXZpZGVyIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXJfdm9sdW1lX2NvbnRyb2wiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI0OGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyNGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjEyZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNwbGl0TW90aW9uRXZlbnRzPSJmYWxzZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8SW1hZ2VWaWV3Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjI0ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyNGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSI/YXR0ci9tZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJjZW50ZXIiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2luY2UgZGlhbG9nJ3MgdG9wIGxheW91dCBtcl9leHBhbmRhYmxlX2FyZWEgaXMgY2xpY2thYmxlLCBpdCBwcm9wYWdhdGVzIHByZXNzZWQgc3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gaXRzIG5vbi1jbGlja2FibGUgY2hpbGRyZW4uIFNwZWNpZnkgYW5kcm9pZDpjbGlja2FibGU9InRydWUiIHRvIHByZXZlbnQgdm9sdW1lIHNsaWRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGhhdmluZyBmYWxzZSBwcmVzc2VkIHN0YXRlLiAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5NZWRpYVJvdXRlVm9sdW1lU2xpZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tcl92b2x1bWVfc2xpZGVyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9IjQ4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDptYXhIZWlnaHQ9IjQ4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL21yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5NZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21yX2dyb3VwX2V4cGFuZF9jb2xsYXBzZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iNDhkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjQ4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSIxMmRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iP2FuZHJvaWQ6YXR0ci9zZWxlY3RhYmxlSXRlbUJhY2tncm91bmRCb3JkZXJsZXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIvPgotICAgICAgICAgICAgICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICAgICAgICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICAgICAgICAgICAgICA8Y29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuT3ZlcmxheUxpc3RWaWV3Ci0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXJfdm9sdW1lX2dyb3VwX2xpc3QiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iQGRpbWVuL21yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfcGFkZGluZ190b3AiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2Nyb2xsYmFyU3R5bGU9Im91dHNpZGVPdmVybGF5IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNsaXBUb1BhZGRpbmc9ImZhbHNlIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3BsaXRNb3Rpb25FdmVudHM9ImZhbHNlIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSI/YXR0ci9tZWRpYVJvdXRlQ29udHJvbFBhbmVsVGhlbWVPdmVybGF5IiAvPgotICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgICAgIDwvRnJhbWVMYXlvdXQ+Ci0gICAgICAgIDxTY3JvbGxWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2J1dHRvblBhbmVsIgotICAgICAgICAgICAgc3R5bGU9Ij9hdHRyL2J1dHRvbkJhclN0eWxlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpmaWxsVmlld3BvcnQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOnNjcm9sbEluZGljYXRvcnM9InRvcHxib3R0b20iPgotICAgICAgICAgICAgPGFuZHJvaWQuc3VwcG9ydC52Ny53aWRnZXQuQnV0dG9uQmFyTGF5b3V0Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImJvdHRvbSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dERpcmVjdGlvbj0ibG9jYWxlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSI0ZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTJkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTJkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjRkcCI+Ci0gICAgICAgICAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9idXR0b24zIgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9idXR0b25CYXJOZXV0cmFsQnV0dG9uU3R5bGUiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGFuZHJvaWQuc3VwcG9ydC52NC53aWRnZXQuU3BhY2UKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zcGFjZXIiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZHAiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRwIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iaW52aXNpYmxlIi8+Ci0gICAgICAgICAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9idXR0b24yIgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9idXR0b25CYXJOZWdhdGl2ZUJ1dHRvblN0eWxlIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIvPgotICAgICAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvYnV0dG9uMSIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYnV0dG9uQmFyUG9zaXRpdmVCdXR0b25TdHlsZSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiLz4KLSAgICAgICAgICAgIDwvYW5kcm9pZC5zdXBwb3J0LnY3LndpZGdldC5CdXR0b25CYXJMYXlvdXQ+Ci0gICAgICAgIDwvU2Nyb2xsVmlldz4KLSAgICA8L0xpbmVhckxheW91dD4KLTwvRnJhbWVMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jb250cm9sbGVyX3ZvbHVtZV9pdGVtLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2NvbnRyb2xsZXJfdm9sdW1lX2l0ZW0ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODkwNThiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2NvbnRyb2xsZXJfdm9sdW1lX2l0ZW0ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+Ci0gICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL3ZvbHVtZV9pdGVtX2NvbnRhaW5lciIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9oZWlnaHQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyNGRwIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjYwZHAiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjhkcCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIiA+Ci0gICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX25hbWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuU2Vjb25kYXJ5VGV4dCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIgLz4KLSAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCI+Ci0gICAgICAgICAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfdm9sdW1lX2l0ZW1faWNvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faWNvbl9zaXplIgotICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faWNvbl9zaXplIgotICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjhkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJmaXRDZW50ZXIiCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSI/YXR0ci9tZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIiAvPgotICAgICAgICAgICAgPGFuZHJvaWQuc3VwcG9ydC52Ny5hcHAuTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXJfdm9sdW1lX3NsaWRlciIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0MGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI0MGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWF4SGVpZ2h0PSI0MGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL21yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgLz4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci08L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L3NldHRpbmdzX2xpc3QueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvc2V0dGluZ3NfbGlzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMzA1MzguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvc2V0dGluZ3NfbGlzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaXN0VmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX3dpZHRoIgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0IgotICAgIGFuZHJvaWQ6ZGl2aWRlcj0iQG51bGwiCi0gICAgYW5kcm9pZDpkaXZpZGVySGVpZ2h0PSIwZHAiPgotPC9MaXN0Vmlldz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC90aXRsZV9iYXJfZ3JhZGllbnQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvdGl0bGVfYmFyX2dyYWRpZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIxZmM2ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC90aXRsZV9iYXJfZ3JhZGllbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2hhcGUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6c2hhcGU9InJlY3RhbmdsZSI+Ci0gICAgPGdyYWRpZW50Ci0gICAgICAgIGFuZHJvaWQ6c3RhcnRDb2xvcj0iQGNvbG9yL3RpdGxlX2Jhcl9ncmFkaWVudF9zdGFydCIKLSAgICAgICAgYW5kcm9pZDplbmRDb2xvcj0iQGNvbG9yL3RpdGxlX2Jhcl9ncmFkaWVudF9lbmQiCi0gICAgICAgIGFuZHJvaWQ6YW5nbGU9Ii0yNzAiIC8+Ci08L3NoYXBlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWFmL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYWYvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MjMwYWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYWYvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3RlbHNlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJUb2VzdGVsbGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0LWtub3BwaWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJVaXRzYWFpLWtub3BwaWUuIE9udGtvcHBlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iVWl0c2FhaS1rbm9wcGllLiBLb3BwZWwgdGFucyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJVaXRzYWFpLWtub3BwaWUuIEdla29wcGVsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlNhYWkgdWl0IG5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iVmluZCB0YW5zIHRvZXN0ZWxsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJPbnRrb3BwZWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJIb3Ugb3AgdWl0c2FhaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iTWFhayB0b2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJTcGVlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iTGFhdCB3YWciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iVm91IHVpdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iVm91IGluIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1rdW5zd2VyayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJWb2x1bWVnbHllciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iR2VlbiBtZWRpYSBpcyBnZWtpZXMgbmllIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJHZWVuIGlubGlndGluZyBiZXNraWtiYWFyIG5pZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iU2FhaSB0YW5zIHNrZXJtIHVpdCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYW0vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hbS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlhMTkwMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hbS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLhiLXhiK3hi5PhibUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4YiY4Yij4Yiq4Yur4YuO4Ym9Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4YuoQ2FzdCDhiqDhi53hiKvhiK0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0IOGKoOGLneGIq+GIreGNoiDhjI3hipXhipnhipDhibUg4Ymw4YmL4Yit4Yyn4YiNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0IOGKoOGLneGIq+GIrSDhiaDhiJvhjIjhipPhipjhibUg4YiL4YutIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3Qg4Yqg4Yud4Yir4Yit4Y2iIOGJsOGMiOGKk+GKneGJt+GIjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0IOGKoOGLteGIreGMjSDhi4jhi7AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLhiJjhiKPhiKrhi6vhi47hib3hipUg4Ymg4Yib4YyN4YqY4Ym1IOGIi+GLrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLhjI3hipXhipnhipDhibUg4Yqg4YmL4Yit4YylIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQ2FzdCDhiJvhi7XhiKjhjI0g4Yqg4YmB4YidIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLhi53hjIsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLhiqDhjKvhi43hibUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuGIiOGKoOGNjeGJsyDhiqDhiYHhiJ0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLhiqDhiYHhiJ0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLhiqDhiLXhjYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuGIsOGJpeGIteGJpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuGLqOGKoOGIjeGJoOGInSDhiLXhipAt4Yyl4Ymg4YmlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuGJsOGKleGIuOGIq+GJs+GJvSDhi6jhi7XhiJ3hjYUg4YiY4YmG4Yyj4Yyg4Yiq4YurIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLhiJ3hipXhiJ0g4Yib4YiF4Yuw4Yio4YiY4Yio4YyDIOGKoOGIjeGJsOGImOGIqOGMoOGInSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4Yid4YqV4YidIOGImOGIqOGMgyDhiqDhi63hjIjhip3hiJ0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuGIm+GLqyDhjIjhjL3hipUg4Ymg4YiY4YuN4Yiw4Yu1IOGIi+GLrSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYXIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hci9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhmYjk3ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hci9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLYp9mE2YbYuNin2YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i2KfZhNij2KzZh9iy2KkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLYstixINin2YTYpdix2LPYp9mEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i2LLYsSDYp9mE2KXYsdiz2KfZhC4g2KrZhSDZgti32Lkg2KfZhNin2KrYtdin2YQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Itiy2LEg2KfZhNil2LHYs9in2YQuINis2KfYsdmNINin2YTYp9iq2LXYp9mEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Itiy2LEg2KfZhNil2LHYs9in2YQuINiq2YUg2KfZhNin2KrYtdin2YQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i2KXYsdiz2KfZhCDYpdmE2YkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLYrNin2LHZjSDYp9mE2KjYrdirINi52YYg2KPYrNmH2LLYqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLZgti32Lkg2KfZhNin2KrYtdin2YQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLYpdmK2YLYp9mBINin2YTYpdix2LPYp9mEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLYpdi62YTYp9mCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i2KrYtNi62YrZhCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i2KXZitmC2KfZgSDZhdik2YLYqiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Itil2YrZgtin2YEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLYqtmI2LPZiti5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLYqti12LrZitixIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i2LXZiNix2Kkg2KfZhNij2YTYqNmI2YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i2LTYsdmK2Lcg2KrZhdix2YrYsSDZhdiz2KrZiNmJINin2YTYtdmI2KoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItmE2YUg2YrYqtmFINin2K7YqtmK2KfYsSDYo9mKINmI2LPYp9im2LciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItmE2Kcg2KrYqtmI2YHYsSDYo9mKINmF2LnZhNmI2YXYp9iqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLYrNin2LHZjSDYpdix2LPYp9mEINin2YTYtNin2LTYqSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYXovc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hei9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNjNjBhYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hei9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iQ2loYXpsYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJZYXnEsW0gZMO8eW3JmXNpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iWWF5xLFtIGTDvHltyZlzaS4gQmHEn2xhbnTEsSBryZlzaWxkaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iWWF5xLFtIGTDvHltyZlzaS4gUW/Fn3VsdXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iWWF5xLFtIGTDvHltyZlzaS4gUW/Fn3VsZHUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQnVyYSB5YXnEsW1sYXnEsW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJDaWhhemxhciBheHRhcsSxbMSxciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJCYcSfbGFudMSxbsSxIGvJmXNpbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IllhecSxbcSxIGRheWFuZMSxcsSxbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iUWFwYWTEsW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJPeW5hZMSxbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iRHVyZHVydW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJEYXlhbmTEsXLEsW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJHZW5pxZ9syZluZGlyaW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlnEscSfY2FtbGHFn2TEsXLEsW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJvbSBpbmPJmXPJmW7JmXRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlPJmXMgaMmZcm1pIGRpeWlyY8mZeWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ikhlw6cgYmlyIG1lZGlhIHNlw6dpbG3JmXlpYiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4ixo9sw6dhdGFuIG3JmWx1bWF0IHlveGR1ciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRWtyYW4geWF5xLFtbGFuxLFyIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iK3NyK0xhdG4vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iK3NyK0xhdG4vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNWJkNmUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYitzcitMYXRuL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJVcmXEkWFqaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkR1Z21lIFByZWJhY2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJEdWdtZSBQcmViYWNpLiBWZXphIGplIHByZWtpbnV0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iRHVnbWUgUHJlYmFjaS4gUG92ZXp1amUgc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iRHVnbWUgUHJlYmFjaS4gUG92ZXphbiBqZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQcmViYWN1aiBuYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlByb25hbGHFvmVuamUgdXJlxJFhamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iUHJla2luaSB2ZXp1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iWmF1c3RhdmkgcHJlYmFjaXZhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJaYXR2b3JpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUHVzdGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXppcmFqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iWmF1c3RhdmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJQcm/FoWlyaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iU2t1cGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJPbW90IGFsYnVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJLbGl6YcSNIHphIGphxI1pbnUgenZ1a2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5lbWEgaXphYnJhbmloIG1lZGlqYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmlzdSBkb3N0dXBuZSBuaWtha3ZlIGluZm9ybWFjaWplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJQcmViYWN1amUgc2UgZWtyYW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJlL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYmUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMzkxYzEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYmUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i0KHRltGB0YLRjdC80LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i0J/RgNGL0LvQsNC00YsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtGL0ZYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtGL0ZYuINCQ0LTQutC70Y7Rh9Cw0L3QsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRi9GWLiDQhtC00LfQtSDQv9Cw0LTQutC70Y7Rh9GN0L3QvdC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0YvRli4g0J/QsNC00LrQu9GO0YfQsNC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0KLRgNCw0L3RgdC70ZbRgNCw0LLQsNGG0Ywg0L3QsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItCf0L7RiNGD0Log0L/RgNGL0LvQsNC0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItCQ0LTQu9GD0YfRi9GG0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQodC/0YvQvdGW0YbRjCDRgtGA0LDQvdGB0LvRj9GG0YvRjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JfQsNC60YDRi9GG0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQn9GA0LDQudCz0YDQsNGG0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCf0YDRi9C/0YvQvdGW0YbRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCh0L/Ri9C90ZbRhtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0KDQsNC30LPQsNGA0L3Rg9GG0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCX0LPQsNGA0L3Rg9GG0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQktC+0LrQu9Cw0LTQutCwINCw0LvRjNCx0L7QvNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCf0LDRntC30YPQvdC+0Log0LPRg9GH0L3QsNGB0YbRliI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0JzQtdC00YvRj9GE0LDQudC7INC90LUg0LLRi9Cx0YDQsNC90YsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItCG0L3RhNCw0YDQvNCw0YbRi9GPINCw0LTRgdGD0YLQvdGW0YfQsNC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQrdC60YDQsNC9INGC0YDQsNC90YHQu9GP0YbRi9GWIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iZy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJnL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjcxMmQ0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJnL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItCh0LjRgdGC0LXQvNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItCj0YHRgtGA0L7QudGB0YLQstCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0JHRg9GC0L7QvSDQt9CwINC/0YDQtdC00LDQstCw0L3QtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCR0YPRgtC+0L0g0LfQsCDQv9GA0LXQtNCw0LLQsNC90LUuINCS0YDRitC30LrQsNGC0LAg0LUg0L/RgNC10LrRgNCw0YLQtdC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCR0YPRgtC+0L0g0LfQsCDQv9GA0LXQtNCw0LLQsNC90LUuINCh0LLRitGA0LfQstCwINGB0LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i0JHRg9GC0L7QvSDQt9CwINC/0YDQtdC00LDQstCw0L3QtS4g0KPRgdGC0LDQvdC+0LLQtdC90LAg0LUg0LLRgNGK0LfQutCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCf0YDQtdC00LDQstCw0L3QtSDQutGK0LwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLQotGK0YDRgdGP0YIg0YHQtSDRg9GB0YLRgNC+0LnRgdGC0LLQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQn9GA0LXQutGA0LDRgtGP0LLQsNC90LUg0L3QsCDQstGA0YrQt9C60LDRgtCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0KHQv9C40YDQsNC90LUg0L3QsCDQv9GA0LXQtNCw0LLQsNC90LXRgtC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLQl9Cw0YLQstCw0YDRj9C90LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQn9GD0YHQutCw0L3QtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i0J/QvtGB0YLQsNCy0Y/QvdC1INC90LAg0L/QsNGD0LfQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCh0L/QuNGA0LDQvdC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0KDQsNC30LPRitCy0LDQvdC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQodCy0LjQstCw0L3QtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCe0LHQu9C+0LbQutCwINC90LAg0LDQu9Cx0YPQvNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCf0LvRitC30LPQsNGHINC30LAg0YHQuNC70LDRgtCwINC90LAg0LfQstGD0LrQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0J3Rj9C80LAg0LjQt9Cx0YDQsNC90LAg0LzRg9C70YLQuNC80LXQtNC40Y8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItCd0Y/QvNCwINC90LDQu9C40YfQvdCwINC40L3RhNC+0YDQvNCw0YbQuNGPIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQldC60YDQsNC90YrRgiDRgdC1INC/0YDQtdC00LDQstCwIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ibi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJuL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmY1OTMyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJuL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCmuOCmv+CmuOCnjeCmn+Cnh+CmriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgpqHgpr/gpq3gpr7gpofgprjgppfgp4HgprLgpr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+4KawIOCmrOCni+CmpOCmvuCmriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuCmleCmvuCmuOCnjeCmnyDgppXgprDgpr7gprAg4Kas4KeL4Kak4Ka+4Kau4Ke3IOCmuOCmguCmr+Cni+CmlyDgpqzgpr/gpprgp43gppvgpr/gpqjgp43gpqgg4Ka54Kav4Ka84KeH4Kab4KeHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+4KawIOCmrOCni+CmpOCmvuCmruCntyDgprjgpoLgpq/gp4vgppcg4KaV4Kaw4Ka+IOCmueCmmuCnjeCmm+CnhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+4KawIOCmrOCni+CmpOCmvuCmruCntyDgprjgpoLgpq/gp4HgppXgp43gpqQg4Ka54Kav4Ka84KeH4Kab4KeHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCmj+CmpOCnhyDgppXgpr7gprjgp43gpp8g4KaV4Kaw4KeB4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4Kah4Ka/4Kat4Ka+4KaH4Ka44KaX4KeB4Kay4Ka/4KaV4KeHIOCmluCni+CmgeCmnOCmviDgprngpprgp43gppvgp4ciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4Ka44KaC4Kav4KeL4KaXIOCmrOCmv+CmmuCnjeCmm+Cmv+CmqOCnjeCmqCDgppXgprDgp4HgpqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+IOCmrOCmqOCnjeCmpyDgppXgprDgp4HgpqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuCmrOCmqOCnjeCmpyDgppXgprDgp4HgpqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgpprgpr7gprLgpr7gpqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCmrOCmv+CmsOCmvuCmriDgpqbgpr/gpqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgpqXgpr7gpq7gpr7gpqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgpqzgpqHgprwg4KaV4Kaw4KeB4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgprjgppngp43gppXgp4Hgpprgpr/gpqQg4KaV4Kaw4KeB4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4KaF4KeN4Kav4Ka+4Kay4Kas4Ka+4KauIOCmtuCniOCmsuCmvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgpq3gprLgpr/gpongpq4g4Ka44KeN4Kay4Ka+4KaH4Kah4Ka+4KawIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgppXgp4vgpqjgp4sg4Kau4Ka/4Kah4Ka/4Kav4Ka84Ka+IOCmqOCmv+CmsOCnjeCmrOCmvuCmmuCmqCDgppXgprDgpr4g4Ka54Kav4Ka84Kao4Ka/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgppXgp4vgpqjgp4sg4Kak4Kal4KeN4KavIOCmieCmquCmsuCmrOCnjeCmpyDgpqjgp4fgpociPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCmuOCnjeCmleCnjeCmsOCngOCmqCDgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+IOCmueCmmuCnjeCmm+CnhyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYnMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1icy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzExYzc0Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1icy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVXJlxJFhamkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJEdWdtZSB6YSBlbWl0aXJhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iRHVnbWUgemEgZW1pdGlyYW5qZS4gVmV6YSBqZSBwcmVraW51dGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkR1Z21lIHphIGVtaXRpcmFuamUuIFBvdmV6aXZhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkR1Z21lIHphIGVtaXRpcmFuamUuIFBvdmV6YW5vIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkVtaXRpcmFuamUgbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJUcmHFvmVuamUgdXJlxJFhamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iUHJla2luaSB2ZXp1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iWmF1c3RhdmkgcHJlYmFjaXZhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJaYXR2b3JpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdWNpcmFqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXV6aXJhaiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlphdXN0YXZpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUHJvxaFpcmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNrdXBpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iT21vdCBhbGJ1bWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iS2xpemHEjSB6YSBqYcSNaW51IHp2dWthIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOaWplZGFuIG1lZGlqIG5pamUgb2RhYnJhbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmVtYSBkb3N0dXBuaWggaW5mb3JtYWNpamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlByZWJhY3VqZSBzZSBla3JhbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtY2Evc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1jYS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY4NWFjZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1jYS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXVzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQm90w7MgZFwnZW1ldHJlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w7MgRW1ldC4gRGVzY29ubmVjdGF0LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQm90w7MgRW1ldC4gU1wnZXN0w6AgY29ubmVjdGFudC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm90w7MgRW1ldC4gQ29ubmVjdGF0LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJFbWV0IGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJTXCdlc3RhbiBjZXJjYW50IGRpc3Bvc2l0aXVzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2Nvbm5lY3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQXR1cmEgbFwnZW1pc3Npw7MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlRhbmNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdWVpeCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUG9zYSBlbiBwYXVzYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkF0dXJhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRGVzcGxlZ2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlJlcGxlZ2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJJbWF0Z2UgZGUgbFwnw6BsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkNvbnRyb2wgbGxpc2NhbnQgZGUgdm9sdW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vIHNcJ2hhIHNlbGVjY2lvbmF0IGNhcCBmaXR4ZXIgbXVsdGltw6hkaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5vIGhpIGhhIGluZm9ybWFjacOzIGRpc3BvbmlibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVtaXNzacOzIGRlIHBhbnRhbGxhIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWNzL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWE4OTIwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWNzL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3TDqW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iWmHFmcOtemVuw60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJUbGHEjcOtdGtvIG9kZXPDrWzDoW7DrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlRsYcSNw610a28gb2Rlc8OtbMOhbsOtLiBPZHBvamVubyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iVGxhxI3DrXRrbyBvZGVzw61sw6Fuw60uIFDFmWlwb2pvdsOhbsOtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IlRsYcSNw610a28gb2Rlc8OtbMOhbsOtLiBQxZlpcG9qZW5vIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+Ik9kZXPDrWxhdCBkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkhsZWTDoW7DrSB6YcWZw616ZW7DrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJPZHBvaml0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iWmFzdGF2aXQgb2Rlc8OtbMOhbsOtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJaYXbFmcOtdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlDFmWVocsOhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUG96YXN0YXZpdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Ilphc3Rhdml0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUm96YmFsaXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNiYWxpdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Ik9iYWwgYWxiYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJQb3N1dm7DrWsgaGxhc2l0b3N0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmVieWxhIHZ5YnLDoW5hIMW+w6FkbsOhIG3DqWRpYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmVqc291IGvCoGRpc3BvemljaSDFvsOhZG7DqSBpbmZvcm1hY2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Ik9kZXPDrWzDoW7DrSBvYnNhaHUgb2JyYXpvdmt5Ijwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTdhNzkwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJFbmhlZGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdC1rbmFwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdC1rbmFwLiBGb3JiaW5kZWxzZW4gZXIgYWZicnVkdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdC1rbmFwLiBPcHJldHRlciBmb3JiaW5kZWxzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0LWtuYXAuIFRpbHNsdXR0ZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdCB0aWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJGaW5kZXIgZW5oZWRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJBZmJyeWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdG9wIG1lZCBhdCBjYXN0ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iTHVrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iQWZzcGlsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJTw6Z0IHDDpSBwYXVzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJVZHZpZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iU2tqdWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bWdyYWZpayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJMeWRzdHlya2Vza3lkZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkluZ2VuIG1lZGllciBlciBtYXJrZXJldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iRGVyIGVyIGluZ2VuIHRpbGfDpm5nZWxpZ2Ugb3BseXNuaW5nZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlNrw6ZybWVuIGNhc3RlcyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1kZS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZiZjU3Yy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1kZS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iR2Vyw6R0ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QtU3ltYm9sIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iU3RyZWFtaW5nLVNjaGFsdGZsw6RjaGUuIE5pY2h0IHZlcmJ1bmRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iU3RyZWFtaW5nLVNjaGFsdGZsw6RjaGUuIFZlcmJpbmR1bmcgd2lyZCBoZXJnZXN0ZWxsdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJTdHJlYW1pbmctU2NoYWx0ZmzDpGNoZS4gVmVyYnVuZGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlN0cmVhbWVuIGF1ZiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkdlcsOkdGUgd2VyZGVuIGdlc3VjaHQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlZlcmJpbmR1bmcgdHJlbm5lbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN0cmVhbWluZyBiZWVuZGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJTY2hsaWXDn2VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iV2llZGVyZ2ViZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNpZXJlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkJlZW5kZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJNYXhpbWllcmVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJNaW5pbWllcmVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1jb3ZlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJTY2hpZWJlcmVnbGVyIGbDvHIgZGllIExhdXRzdMOkcmtlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJLZWluZSBNZWRpZW4gYXVzZ2V3w6RobHQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IktlaW5lIEluZm9ybWF0aW9uZW4gdmVyZsO8Z2JhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQmlsZHNjaGlybSB3aXJkIGdlc3RyZWFtdC4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZWwvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MmY2OWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZWwvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4izqPPjc+Dz4TOt868zrEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4izqPPhc+DzrrOtc+Fzq3PgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Is6azr/Phc68z4DOryBDYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4izprOv8+FzrzPgM6vIM68zrXPhM6szrTOv8+DzrfPgi4gzpHPgM6/z4PPhc69zrTOrc64zrfOus61Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLOms6/z4XOvM+Azq8gzrzOtc+EzqzOtM6/z4POty4gzqPPjc69zrTOtc+Dzrcgz4POtSDOtc6+zq3Ou865zr7OtyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLOms6/z4XOvM+Azq8gzrzOtc+EzqzOtM6/z4POt8+CLiDOo8+Fzr3OtM6tzrjOt866zrUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4izpzOtc+EzqzOtM6/z4POtyDPg861Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4izpXPjc+BzrXPg863IM+Dz4XPg866zrXPhc+Ozr0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4izpHPgM6/z4PPjc69zrTOtc+DzrciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLOlM65zrHOus6/z4DOriDOvM61z4TOrM60zr/Pg863z4IiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Is6azrvOtc6vz4POuc68zr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLOkc69zrHPgM6xz4HOsc6zz4nOs86uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLOoM6xz43Pg863Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4izpTOuc6xzrrOv8+Azq4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLOkc69zqzPgM+Ez4XOvs63Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLOo8+NzrzPgM+Ez4XOvs63Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4izpXOvs+Oz4bPhc67zrvOvyDOrM67zrzPgM6/z4XOvCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLOoc+FzrjOvM65z4PPhM65zrrPjCDOrc69z4TOsc+DzrfPgiDOrs+Hzr/PhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4izpTOtc69IM6tz4fOv8+Fzr0gzrXPgM65zrvOtc6zzrXOryDOvM6tz4POsSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4izpTOtc69IM+Fz4DOrM+Bz4fOv8+Fzr0gzrTOuc6xzrjOrc+DzrnOvM61z4Igz4DOu863z4HOv8+Gzr/Pgc6vzrXPgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4izpzOtc+EzqzOtM6/z4POtyDOv864z4zOvc63z4IiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJBVS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJBVS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQzZjIxOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yQVUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRldmljZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0IGJ1dHRvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3QgYnV0dG9uLiBEaXNjb25uZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3QgYnV0dG9uLiBDb25uZWN0aW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3QgYnV0dG9uLiBDb25uZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdCB0byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkZpbmRpbmcgZGV2aWNlcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEaXNjb25uZWN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU3RvcCBjYXN0aW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJDbG9zZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlBsYXkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3RvcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4cGFuZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iQ29sbGFwc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bSBhcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVm9sdW1lIHNsaWRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTm8gbWVkaWEgc2VsZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5vIGluZm8gYXZhaWxhYmxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJDYXN0aW5nIHNjcmVlbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckNBL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckNBL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDNmMjE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJDQS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGV2aWNlcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QgYnV0dG9uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdCBidXR0b24uIERpc2Nvbm5lY3RlZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdCBidXR0b24uIENvbm5lY3RpbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdCBidXR0b24uIENvbm5lY3RlZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0IHRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iRmluZGluZyBkZXZpY2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRpc2Nvbm5lY3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdG9wIGNhc3RpbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkNsb3NlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUGxheSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXhwYW5kIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJDb2xsYXBzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtIGFydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJWb2x1bWUgc2xpZGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJObyBtZWRpYSBzZWxlY3RlZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTm8gaW5mbyBhdmFpbGFibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkNhc3Rpbmcgc2NyZWVuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yR0Ivc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yR0Ivc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkM2YyMTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckdCL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEZXZpY2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdCBidXR0b24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0IGJ1dHRvbi4gRGlzY29ubmVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGluZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3QgdG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJGaW5kaW5nIGRldmljZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGlzY29ubmVjdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN0b3AgY2FzdGluZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQ2xvc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQbGF5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJFeHBhbmQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNvbGxhcHNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW0gYXJ0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlZvbHVtZSBzbGlkZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vIG1lZGlhIHNlbGVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJObyBpbmZvIGF2YWlsYWJsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQ2FzdGluZyBzY3JlZW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJJTi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJJTi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQzZjIxOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1ySU4vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRldmljZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0IGJ1dHRvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3QgYnV0dG9uLiBEaXNjb25uZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3QgYnV0dG9uLiBDb25uZWN0aW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3QgYnV0dG9uLiBDb25uZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdCB0byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkZpbmRpbmcgZGV2aWNlcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEaXNjb25uZWN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU3RvcCBjYXN0aW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJDbG9zZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlBsYXkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3RvcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4cGFuZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iQ29sbGFwc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bSBhcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVm9sdW1lIHNsaWRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTm8gbWVkaWEgc2VsZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5vIGluZm8gYXZhaWxhYmxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJDYXN0aW5nIHNjcmVlbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tclhDL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tclhDL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODcwMDdlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJYQy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI/igI7igI7igI7igI7igI/igI/igI7igI7igI/igI7igI/igI7igI7igI/igI7igI7igI7igI/igI/igI/igI7igI7igI/igI7igI7igI7igI7igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI/igI/igI7igI/igI7igI/igI/igI/igI/igI7igI7igI7igI/igI5TeXN0ZW3igI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCORGV2aWNlc+KAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAj+KAj+KAjuKAj+KAjuKAj+KAjuKAjuKAj+KAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAjuKAjuKAjuKAj+KAj+KAjuKAj+KAj+KAj+KAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAj+KAjkNhc3QgYnV0dG9u4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCOQ2FzdCBidXR0b24uIERpc2Nvbm5lY3RlZOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCOQ2FzdCBidXR0b24uIENvbm5lY3RpbmfigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCP4oCOQ2FzdCBidXR0b24uIENvbm5lY3RlZOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI7igI/igI/igI/igI7igI/igI/igI7igI/igI/igI/igI/igI/igI/igI/igI/igI/igI7igI7igI/igI7igI/igI7igI/igI/igI7igI/igI7igI/igI/igI/igI7igI/igI/igI7igI/igI/igI/igI/igI7igI7igI/igI/igI/igI7igI7igI/igI7igI/igI/igI7igI7igI7igI/igI/igI7igI/igI/igI7igI/igI/igI7igI5DYXN0IHRv4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCORmluZGluZyBkZXZpY2Vz4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAjuKAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAjuKAjuKAj+KAjuKAjuKAjuKAj+KAjuKAj+KAj+KAjuKAjuKAjuKAj+KAjuKAj+KAjuKAjuKAj+KAj+KAjuKAjuKAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAjuKAjuKAjkRpc2Nvbm5lY3TigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI/igI/igI/igI7igI/igI7igI/igI/igI/igI7igI/igI/igI7igI/igI/igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI/igI/igI7igI/igI/igI/igI7igI/igI7igI/igI/igI/igI7igI7igI7igI/igI7igI7igI/igI/igI/igI/igI7igI7igI7igI/igI7igI/igI/igI/igI7igI/igI/igI/igI7igI/igI7igI5TdG9wIGNhc3RpbmfigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAj+KAjuKAjuKAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAj+KAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjkNsb3Nl4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCOUGxheeKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCOUGF1c2XigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI7igI7igI/igI7igI/igI7igI7igI7igI/igI/igI7igI/igI/igI7igI7igI/igI7igI/igI/igI7igI/igI7igI7igI7igI7igI/igI7igI/igI/igI7igI/igI7igI7igI7igI7igI/igI/igI7igI/igI/igI/igI/igI7igI7igI7igI/igI/igI7igI/igI/igI/igI/igI/igI7igI/igI/igI/igI7igI7igI7igI/igI/igI5TdG9w4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCORXhwYW5k4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI/igI7igI/igI/igI7igI/igI/igI/igI/igI/igI/igI7igI/igI7igI/igI7igI7igI/igI7igI7igI/igI/igI/igI/igI7igI/igI/igI7igI7igI/igI/igI7igI7igI7igI/igI/igI7igI/igI/igI7igI7igI/igI7igI7igI/igI/igI7igI/igI7igI/igI/igI/igI/igI/igI7igI7igI7igI/igI/igI/igI/igI7igI5Db2xsYXBzZeKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAjuKAjuKAj+KAjuKAj+KAjuKAj+KAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAj+KAjkFsYnVtIGFydOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI7igI/igI7igI7igI7igI7igI7igI/igI/igI7igI7igI7igI/igI/igI7igI/igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI/igI/igI7igI7igI7igI/igI7igI/igI/igI/igI/igI7igI/igI7igI/igI7igI7igI7igI/igI/igI/igI/igI/igI7igI7igI7igI7igI/igI7igI/igI7igI/igI7igI/igI/igI7igI/igI5Wb2x1bWUgc2xpZGVy4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI/igI/igI7igI/igI7igI/igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI/igI7igI7igI7igI/igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI7igI7igI/igI7igI/igI/igI7igI7igI/igI7igI7igI/igI/igI/igI7igI7igI/igI7igI7igI/igI/igI7igI/igI7igI/igI/igI7igI/igI5ObyBtZWRpYSBzZWxlY3RlZOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCOTm8gaW5mbyBhdmFpbGFibGXigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAj+KAj+KAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAj+KAjkNhc3Rpbmcgc2NyZWVu4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MWVhZDEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQm90w7NuIHBhcmEgdHJhbnNtaXRpciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdMOzbiBwYXJhIHRyYW5zbWl0aXIgKGRlc2NvbmVjdGFkbykiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOzbiBwYXJhIHRyYW5zbWl0aXIgKGNvbmVjdGFuZG8pIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJvdMOzbiBwYXJhIHRyYW5zbWl0aXIgKGNvbmVjdGFkbykiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJhbnNtaXRpciBhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iQnVzY2FuZG8gZGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2NvbmVjdGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iRGV0ZW5lciBsYSB0cmFuc21pc2nDs24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkNlcnJhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHVjaXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkRldGVuZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJNb3N0cmFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJPY3VsdGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iSW1hZ2VuIGRlbCDDoWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbCBkZXNsaXphbnRlIGRlbCB2b2x1bWVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJObyBzZSBzZWxlY2Npb27DsyBuaW5nw7puIGNvbnRlbmlkbyBtdWx0aW1lZGlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJTaW4gaW5mb3JtYWNpw7NuIGRpc3BvbmlibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlRyYW5zbWl0aWVuZG8gcGFudGFsbGEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNDMwMDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCb3TDs24gZGUgZW52aWFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w7NuIGRlIGVudmlhci4gRGVzY29uZWN0YWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCb3TDs24gZGUgZW52aWFyLiBDb25lY3RhbmRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJvdMOzbiBkZSBlbnZpYXIuIENvbmVjdGFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJFbnZpYXIgYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkJ1c2NhbmRvIGRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEZXNjb25lY3RhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkRldGVuZXIgZW52w61vIGRlIGNvbnRlbmlkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQ2VycmFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdWNpciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJEZXRlbmVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iTW9zdHJhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iT2N1bHRhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IlBvcnRhZGEgZGVsIMOhbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJDb250cm9sIGRlc2xpemFudGUgZGUgdm9sdW1lbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTm8gc2UgaGEgc2VsZWNjaW9uYWRvIG5pbmfDum4gbWVkaW8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5vIGhheSBpbmZvcm1hY2nDs24gZGlzcG9uaWJsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRW52aWFuZG8gcGFudGFsbGEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWV0L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXQvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MzIzNWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXQvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU8O8c3RlZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iU2VhZG1lZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IsOcbGVrYW5kZW51cHAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLDnGxla2FuZGVudXBwLiDDnGhlbmR1cyBvbiBrYXRrZXN0YXR1ZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iw5xsZWthbmRlbnVwcC4gw5xoZW5kYW1pbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iw5xsZWthbmRlbnVwcC4gw5xoZW5kYXR1ZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLDnGxla2FuZG1pbmUgc2VhZG1lc3NlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iU2VhZG1ldGUgb3RzaW1pbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iS2F0a2VzdGEgw7xoZW5kdXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJQZWF0YSDDvGxla2FuZG1pbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlN1bGdlbWluZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkVzaXRhbWluZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGVhdGFtaW5lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iUGVhdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJMYWllbmRhbWluZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iQWhlbmRhbWluZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtaSBrdWp1bmR1cyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJIZWxpdHVnZXZ1c2UgbGl1Z3VyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJNZWVkaWF0IHBvbGUgdmFsaXR1ZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iVGVhdmUgcHV1ZHViIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJFa3JhYW5pa3V2YSDDvGxla2FuZG1pbmUiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWV1L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYTE5ZTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJHYWlsdWFrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iSWdvcnJpIGJvdG9pYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Iklnb3J0emVrbyBib3RvaWEuIERlc2tvbmVrdGF0dXRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJJZ29ydHpla28gYm90b2lhLiBLb25la3RhdHplbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJJZ29ydHpla28gYm90b2lhLiBLb25la3RhdHV0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJJZ29ycmkgaG9uYToiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJHYWlsdWFrIGJpbGF0emVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2tvbmVrdGF0dSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlV0emkgaWdvcnR6ZWFyaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iSXR4aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkVycmVwcm9kdXppdHUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhdHUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJHZWxkaXR1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iWmFiYWxkdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iVG9sZXN0dSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtYXJlbiBhemFsYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJCb2x1bWVuYXJlbiBncmFkdWF0emFpbGVhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJFeiBkYSBoYXV0YXR1IG11bHRpbWVkaWEtZWR1a2lyaWsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkV6IGRhZ28gaW5mb3JtYXppb3JpayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iUGFudGFpbGEgaWdvcnR6ZW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZhL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZmEvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNmM3NzkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZmEvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i2LPbjNiz2KrZhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLYr9iz2Krar9in2YfigIzZh9inIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i2K/aqdmF2Ycg2KfYsdiz2KfZhCDZhdit2KrZiNinIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i2K/aqdmF2Ycg2YHYsdiz2KrYp9iv2YYuINin2LHYqtio2KfYtyDZgti32Lkg2LTYryI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i2K/aqdmF2Ycg2YHYsdiz2KrYp9iv2YYuINiv2LHYrdin2YQg2YXYsdiq2KjYt+KAjNiz2KfYstuMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Itiv2qnZhdmHINmB2LHYs9iq2KfYr9mGLiDZhdix2KrYqNi3INi02K8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i2KfYsdiz2KfZhCDZhdit2KrZiNinINio2YciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLZvtuM2K/YpyDaqdix2K/ZhiDYr9iz2Krar9in2YfigIzZh9inIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItmC2LfYuSDYp9ix2KrYqNin2LciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLYqtmI2YLZgSDYp9ix2LPYp9mEINmF2K3YqtmI2KciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Itio2LPYqtmGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i2b7Yrti0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLZhdqp2KsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLYqtmI2YLZgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Itio2LLYsdqvINqp2LHYr9mGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLaqdmI2obaqSDaqdix2K/ZhiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Iti52qnYsyDYsdmI24wg2KzZhNivINii2YTYqNmI2YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i2YTYutiy2YbYr9mHINmF24zYstin2YYg2LXYr9inIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLYsdiz2KfZhtmHINin2YbYqtiu2KfYqCDZhti02K/ZhyDYp9iz2KoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Itin2LfZhNin2LnYp9iqINiv2LEg2K/Ys9iq2LHYsyDZhtuM2LPYqiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i2K/Ysdit2KfZhCDZgdix2LPYqtin2K/ZhiDYtdmB2K3ZhyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZmkvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1maS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY4MzQzNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1maS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJKw6RyamVzdGVsbcOkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkxhaXR0ZWV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdC1wYWluaWtlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdC1wYWluaWtlLiBZaHRleXMga2F0a2Fpc3R1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0LXBhaW5pa2UuIFloZGlzdGV0w6TDpG4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdC1wYWluaWtlLiBZaGRpc3RldHR5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlN1b3JhdG9pc3RvbiBrb2hkZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkV0c2l0w6TDpG4gbGFpdHRlaXRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkthdGthaXNlIHlodGV5cyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkxvcGV0YSBzdW9yYXRvaXN0byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iU3VsamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJUb2lzdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+Iktlc2tleXTDpCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlB5c8OkeXTDpCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkxhYWplbm5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJUaWl2aXN0w6QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bWluIGthbnNpa3V2YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLDhMOkbmVudm9pbWFra3V1ZGVuIGxpdWt1c8Okw6RkaW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkVpIHZhbGl0dHVhIG1lZGlhYS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IlRpZXRvamEgZWkgb2xlIHNhYXRhdmlsbGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlN1b3JhdG9pc3RldGFhbiBuw6R5dHTDtsOkIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1mci1yQ0Evc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1mci1yQ0Evc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0Zjk4NGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZnItckNBL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3TDqG1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkFwcGFyZWlscyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdXRvbiBEaWZmdXNlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdXRvbiBEaWZmdXNlci4gRMOpY29ubmVjdMOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCb3V0b24gRGlmZnVzZXIuIENvbm5leGlvbiBlbiBjb3Vyc+KApiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCb3V0b24gRGlmZnVzZXIuIENvbm5lY3TDqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJEaWZmdXNlciBzdXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJSZWNoZXJjaGUgZFwnYXBwYXJlaWxzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlNlIGTDqWNvbm5lY3RlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkFycsOqdGVyIGxhIGRpZmZ1c2lvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iRmVybWVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iTGlyZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iSW50ZXJyb21wcmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJBcnLDqnRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkTDqXZlbG9wcGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSw6lkdWlyZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkltYWdlIGRlIGxcJ2FsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkN1cnNldXIgZGUgcsOpZ2xhZ2UgZHUgdm9sdW1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJBdWN1biBtw6lkaWEgc8OpbGVjdGlvbm7DqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iQXVjdW5lIGluZm9ybWF0aW9uIGRpc3BvbmlibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkRpZmZ1c2lvbiBkZSBsXCfDqWNyYW4gZW4gY291cnMiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYzMxMmYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdMOobWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iQXBwYXJlaWxzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iSWPDtG5lIENhc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJJY8O0bmUgQ2FzdC4gRMOpY29ubmVjdMOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJJY8O0bmUgQ2FzdC4gQ29ubmV4aW9u4oCmIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Ikljw7RuZSBDYXN0LiBDb25uZWN0w6kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdGVyIHN1ciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlJlY2hlcmNoZSBkXCdhcHBhcmVpbHPigKYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRMOpY29ubmVjdGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQXJyw6p0ZXIgbGEgZGlmZnVzaW9uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJGZXJtZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJMZWN0dXJlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkFycsOqdGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRMOpdmVsb3BwZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlLDqWR1aXJlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iSW1hZ2UgZGUgbFwnYWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ3Vyc2V1ciBkZSB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkF1Y3VuIG3DqWRpYSBzw6lsZWN0aW9ubsOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJBdWN1bmUgaW5mb3JtYXRpb24gZGlzcG9uaWJsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRGlmZnVzaW9uIGRlIGxcJ8OpY3JhbiBlbiBjb3Vyc+KApiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZ2wvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1nbC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIyYzM1NC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1nbC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOzbiBkZSBlbWl0aXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCb3TDs24gZGUgZW1pdGlyLiBEZXNjb25lY3RhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOzbiBkZSBlbWl0aXIuIENvbmVjdGFuZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm90w7NuIGRlIGVtaXRpci4gQ29uZWN0YWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkVtaXRpciBhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iQnVzY2FuZG8gZGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2NvbmVjdGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iRGV0ZXIgZW1pc2nDs24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlBlY2hhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHVjZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJEZXRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkFtcGxpYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNvbnRyYWVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iUG9ydGFkYSBkbyDDoWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbCBkZXNwcmF6YWJsZSBkbyB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vbiBzZSBzZWxlY2Npb25hcm9uIHJlY3Vyc29zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOb24gaGFpIGluZm9ybWFjacOzbiBkaXNwb8OxaWJsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRW1pc2nDs24gZGUgcGFudGFsbGEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWd1L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZ3Uvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZDVmM2YuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZ3Uvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4Kq44Kq/4Kq44KuN4Kqf4KquIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuCqieCqquCqleCqsOCqo+CriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuCqleCqvuCquOCrjeCqnyDgqpXgqrDgq4sg4Kqs4Kqf4KqoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4KqV4Kq+4Kq44KuN4KqfIOCqleCqsOCriyDgqqzgqp/gqqguIOCqoeCqv+CquOCrjeCqleCqqOCrh+CqleCrjeCqnyDgqpXgqrDgq43gqq/gq4HgqoIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuCqleCqvuCquOCrjeCqnyDgqpXgqrDgq4sg4Kqs4Kqf4KqoLiDgqpXgqqjgq4fgqpXgq43gqp8g4Kql4KqIIOCqsOCqueCrjeCqr+CrgeCqgiDgqpvgq4ciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4KqV4Kq+4Kq44KuN4KqfIOCqleCqsOCriyDgqqzgqp/gqqguIOCqleCqqOCrh+CqleCrjeCqnyDgqqXgqq/gq4HgqoIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4KqG4Kqo4Kq+IOCqquCqsCDgqpXgqr7gqrjgq43gqp8g4KqV4Kqw4KuLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4KqJ4Kqq4KqV4Kqw4Kqj4KuLIOCqtuCri+Cqp+CrgCDgqrDgqrngq43gqq/gqr7gqoIg4Kqb4KuA4KqPIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCqoeCqv+CquOCrjeCqleCqqOCrh+CqleCrjeCqnyDgqpXgqrDgq4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgqpXgqr7gqrjgq43gqp8g4KqV4Kqw4Kq14Kq+4Kqo4KuB4KqCIOCqsOCri+CqleCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4Kqs4KqC4KqnIOCqleCqsOCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCqmuCqsuCqvuCqteCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4Kql4KuL4Kqt4Kq+4Kq14KuLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Kqw4KuL4KqV4KuLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4Kq14Kq/4Kq44KuN4Kqk4KuD4KqkIOCqleCqsOCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4Kq44KqC4KqV4KuB4Kqa4Kq/4KqkIOCqleCqsOCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuCqhuCqsuCrjeCqrOCqriDgqpXgqrLgqr4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4Kq14KuJ4Kqy4KuN4Kqv4KuB4KquIOCquOCrjeCqsuCqvuCqh+CqoeCqsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4KqV4KuL4KqIIOCqruCrgOCqoeCqv+Cqr+CqviDgqqrgqrjgqoLgqqYg4KqV4Kqw4KuH4KqyIOCqqOCqpeCrgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4KqV4KuL4KqIIOCqruCqvuCqueCqv+CqpOCrgCDgqongqqrgqrLgqqzgq43gqqcg4Kqo4Kql4KuAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgqrjgq43gqpXgq43gqrDgq4Dgqqjgqqjgq4cg4KqV4Kq+4Kq44KuN4KqfIOCqleCqsOCrgCDgqrDgqrngq43gqq/gqr7gqoIg4Kqb4KuHIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oaS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWhpL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTUyYTU5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWhpL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCkuOCkv+CkuOCljeCkn+CkriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgpKHgpL/gpLXgpL7gpIfgpLgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgpJXgpL7gpLjgpY3gpJ8g4KSV4KSw4KWH4KSCIOCkrOCkn+CkqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuCkleCkvuCkuOCljeCknyDgpJXgpLDgpYfgpIIg4KSs4KSf4KSoLiDgpKHgpL/gpLjgpJXgpKjgpYfgpJXgpY3gpJ8g4KS54KWIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgpJXgpL7gpLjgpY3gpJ8g4KSV4KSw4KWH4KSCIOCkrOCkn+CkqC4g4KSV4KSo4KWH4KSV4KWN4KSfIOCkueCliyDgpLDgpLngpL4g4KS54KWIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuCkleCkvuCkuOCljeCknyDgpJXgpLDgpYfgpIIg4KSs4KSf4KSoLiDgpJXgpKjgpYfgpJXgpY3gpJ8g4KS54KWIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCkh+CkuCDgpKrgpLAg4KSV4KS+4KS44KWN4oCN4KSfIOCkleCksOClh+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCkoeCkv+CkteCkvuCkh+CkuCDgpKLgpYLgpILgpKIg4KSw4KS54KS+IOCkueCliCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgpKHgpL/gpLjgpJXgpKjgpYfgpJXgpY3gpJ8g4KSV4KSw4KWH4KSCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4KSV4KS+4KS44KWN4KSfIOCkleCksOCkqOCkviDgpKzgpILgpKYg4KSV4KSw4KWH4KSCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgpKzgpILgpKYg4KSV4KSw4KWH4KSCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4KSa4KSy4KS+4KSP4KSCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgpLDgpYvgpJXgpYfgpIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgpKzgpILgpKYg4KSV4KSw4KWH4KSCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4KS14KS/4KS44KWN4KSk4KS+4KSwIOCkleCksOClh+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4KSb4KWL4KSf4KS+IOCkleCksOClh+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuCkj+CksuCljeCkrOCkriDgpIbgpLDgpY3gpJ8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4KS14KWJ4KSy4KWN4KSv4KWC4KSuIOCkuOCljeCksuCkvuCkh+CkoeCksCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4KSV4KWL4KSIIOCkruClgOCkoeCkv+Ckr+CkviDgpJrgpK/gpKjgpL/gpKQg4KSo4KS54KWA4KSCIOCkueCliCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4KSV4KWL4KSIIOCknOCkvuCkqOCkleCkvuCksOClgCDgpK7gpYzgpJzgpYLgpKYg4KSo4KS54KWA4KSCIOCkueCliCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4KS44KWN4KSV4KWN4KSw4KWA4KSoIOCkleCkvuCkuOCljeCknyDgpLngpYsg4KSw4KS54KWAIOCkueCliCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oci9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M0M2VlNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oci9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTdXN0YXYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVXJlxJFhamkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJHdW1iIHphIGVtaXRpcmFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJHdW1iIHphIGVtaXRpcmFuamUuIFZlemEgcHJla2ludXRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJHdW1iIHphIGVtaXRpcmFuamUuIFBvdmV6aXZhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Ikd1bWIgemEgZW1pdGlyYW5qZS4gUG92ZXphbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJFbWl0aXJhbmplIG5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iVHJhxb5lbmplIHVyZcSRYWphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlByZWtpbmkgdmV6dSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlphdXN0YXZpIGVtaXRpcmFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlphdHZhcmFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZXByb2R1a2NpamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXppcmFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJaYXVzdGF2aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlByb8WhaXJpdmFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNhxb5pbWFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJOYXNsb3ZuaWNhIGFsYnVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJLbGl6YcSNIHphIGdsYXNub8SHdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmlqZSBvZGFicmFuIG5pamVkYW4gbWVkaWoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkluZm9ybWFjaWplIG5pc3UgZG9zdHVwbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVtaXRpcmFuamUgemFzbG9uYSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1odS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM2YmRmZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1odS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJSZW5kc3plciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJFc3prw7Z6w7ZrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iw4F0a8O8bGTDqXMgZ29tYiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IsOBdGvDvGxkw6lzIGdvbWIuIEthcGNzb2xhdCBib250dmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IsOBdGvDvGxkw6lzIGdvbWIuIENzYXRsYWtvesOhcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLDgXRrw7xsZMOpcyBnb21iLiBDc2F0bGFrb3p0YXR2YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLDgXRrw7xsZMOpcyBpZGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJFc3prw7Z6w7ZrIGtlcmVzw6lzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJMZXbDoWxhc3p0w6FzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iw4F0a8O8bGTDqXMgbGXDoWxsw610w6FzYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQmV6w6Fyw6FzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iTGVqw6F0c3rDoXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlN6w7xuZXRlbHRldMOpcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Ikxlw6FsbMOtdMOhcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IktpYm9udMOhcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iw5Zzc3plY3N1a8OhcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkxlbWV6Ym9yw610w7MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iSGFuZ2VyxZFzemFiw6FseXrDsyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmluY3MgbcOpZGlhIGtpdsOhbGFzenR2YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmluY3MgaW5mb3Jtw6FjacOzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJLw6lwZXJuecWRdGFydGFsb20gw6F0a8O8bGTDqXNlIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oeS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWh5L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWM4MmI3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWh5L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItWA1aHVtNWh1a/VodaA1aMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i1Y3VodaA1oTVpdaAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i1YDVpdW81aHWgNWx1aHVr9W01aHVtiDVr9W41bPVodWvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i1YDVpdW81aHWgNWx1aHVr9W01aHVtiDVr9W41bPVodWvOiDVjdWh1oDWhNW2INWh1bbVu9Wh1b/VvtWh1a4g1aciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItWA1aXVvNWh1oDVsdWh1a/VtNWh1bYg1a/VuNWz1aHVrzog1Y3VodaA1oTVqCDVr9Wh1brVodWv1oHVvtW41oLVtCDVpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLVgNWl1bzVodaA1bHVodWv1bTVodW2INWv1bjVs9Wh1a86INWN1aHWgNaE1agg1a/VodW61aHVr9aB1b7VodWuINWnIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItS41bbVv9aA1aXWhCDVvdWh1oDWhNWoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i1Y3VodaA1oTVpdaA1asg1bjWgNW41bbVuNaC1bQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i1LHVttW71aHVv9Wl1awiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLUtNWh1aTVodaA1aXWgdW21aXVrCDVsNWl1bzVodaA1bHVodWv1bjWgtW01agiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItWT1aHVr9Wl1awiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLVhtW+1aHVo9Wh1oDVr9Wl1awiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItS01aHVpNWh1oAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLUtNWh1aTVodaA1aXWgdW21aXVrCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItS41bbVpNWh1oDVsdWh1a/VpdWsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLUv9W41a7Vr9Wl1awiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLUsdWs1aLVuNW01asg1bfVodW61avVryI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLVgdWh1bXVttWrINW41oLVqtWj1bbVuNaC1anVtdWh1bYg1a/VodaA1aPVodW+1bjWgNWr1bkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItWE1aXVpNWr1aEg1obVodW11azVpdaAINW51aXVtiDVqNW21b/WgNW+1aXVrCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i1Y/VpdWy1aXVr9W41oLVqdW11bjWgtW21bbVpdaA1agg1bDVodW91aHVttWl1azVqyDVudWl1bYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItS31a/WgNWh1bbVqCDVsNWl1bzVodaA1bHVodWv1b7VuNaC1bQg1aciPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWluL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaW4vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMjc1MmUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaW4vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlBlcmFuZ2thdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IlRvbWJvbCBDYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iVG9tYm9sIENhc3QuIFRlcnB1dHVzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJUb21ib2wgQ2FzdC4gTWVuZ2h1YnVuZ2thbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJUb21ib2wgQ2FzdC4gVGVyaHVidW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlRyYW5zbWlzaWthbiBrZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Ik1lbmNhcmkgcGVyYW5na2F0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlB1dHVza2FuIHNhbWJ1bmdhbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkhlbnRpa2FuIGNhc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlR1dHVwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUHV0YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkplZGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJCZXJoZW50aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Ikx1YXNrYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNpdXRrYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJTYW1wdWwgYWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQmlsYWggZ2VzZXIgdm9sdW1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJUaWRhayBhZGEgbWVkaWEgeWFuZyBkaXBpbGloIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJUaWRhayBhZGEgaW5mbyB5YW5nIHRlcnNlZGlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJUcmFuc21pc2kgbGF5YXIiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWlzL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaXMvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMzVlYTYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaXMvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iS2VyZmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVMOma2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLDmnRzZW5kaW5nYXJobmFwcHVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iw5p0c2VuZGluZ2FyaG5hcHB1ci4gQWZ0ZW5ndCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iw5p0c2VuZGluZ2FyaG5hcHB1ci4gVGVuZ2lzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLDmnRzZW5kaW5nYXJobmFwcHVyLiBUZW5ndCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJTZW5kYSDDunQgw60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJMZWl0YcOwIGHDsCB0w6ZranVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkFmdGVuZ2phc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdMO2w7B2YSDDunRzZW5kaW5ndSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iTG9rYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlNwaWxhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJIbMOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3TDtsOwdmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJTdMOma2thIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJNaW5ua2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJQbMO2dHV1bXNsYWciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iSGxqw7PDsHN0eXJrc3NsZcOwaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iRW5naW5uIG1pw7BpbGwgdmFsaW5uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJFbmdhciB1cHBsw71zaW5nYXIgw60gYm/DsGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlNrasOhciBzZW5kdXIgw7p0Ijwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTZlM2FjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGlzcG9zaXRpdmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJQdWxzYW50ZSBUcmFzbWV0dGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJQdWxzYW50ZSBUcmFzbWV0dGkuIERpc2Nvbm5lc3NvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJQdWxzYW50ZSBUcmFzbWV0dGkuIENvbm5lc3Npb25lIGluIGNvcnNvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IlB1bHNhbnRlIFRyYXNtZXR0aS4gQ29ubmVzc28iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJhc21ldHRpIGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJSaWNlcmNhIGRpIGRpc3Bvc2l0aXZpIGluIGNvcnNvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlNjb2xsZWdhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iSW50ZXJyb21waSB0cmFzbWlzc2lvbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkNoaXVkaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJpcHJvZHVjaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJJbnRlcnJvbXBpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXNwYW5kaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iQ29tcHJpbWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJDb3BlcnRpbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iRGlzcG9zaXRpdm8gZGkgc2NvcnJpbWVudG8gZGVsIHZvbHVtZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmVzc3VuIGNvbnRlbnV0byBtdWx0aW1lZGlhbGUgc2VsZXppb25hdG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5lc3N1bmEgaW5mb3JtYXppb25lIGRpc3BvbmliaWxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJUcmFzbWlzc2lvbmUgZGVsbG8gc2NoZXJtbyBpbiBjb3JzbyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaXcvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pdy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUyYjBjZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pdy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLXntei16jXm9eqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Itee15vXqdeZ16jXmdedIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4oCP15zXl9em158g15TXpNei15zXqiBDYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4oCP15zXl9em158g15TXpNei15zXqiBDYXN0LiDXnteg15XXqtenIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLigI/XnNeX16bXnyDXlNek16LXnNeqIENhc3QuINee16rXl9eR16giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4oCP15zXl9em158g15TXpNei15zXqiBDYXN0LiDXnteX15XXkdeoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IteU16LXkdeo15Qg15DXnCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Itee15fXpNepINee15vXqdeZ16jXmdedIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Iteg16rXpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IteU16TXodenINeQ16og15TXlNei15HXqNeUIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLXodeS15XXqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IteU16TXotecIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLXlNep15TXlCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IteU16TXodenIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i15TXqNeX15EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Iteb15XXldelIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i16LXmNeZ16TXqiDXkNec15HXldedIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+Itee15fXldeV158g16LXldem157XlCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i15zXkCDXoNeR15fXqNeUINee15PXmdeUIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLXkNeZ158g157XmdeT16Ig15bXnteZ158iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IteU16LXkdeo16og157XodeaINee16rXkdem16LXqiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE0OTcyNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLjgrfjgrnjg4bjg6AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i56uv5pyrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i44Kt44Oj44K544OI44Ki44Kk44Kz44OzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i44Kt44Oj44K544OIIOOCouOCpOOCs+ODs+OAguaOpee2muino+mZpOa4iOOBvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i44Kt44Oj44K544OIIOOCouOCpOOCs+ODs+OAguaOpee2muS4rSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLjgq3jg6Pjgrnjg4gg44Ki44Kk44Kz44Oz44CC5o6l57aa5riI44G/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuOCreODo+OCueODiOOBmeOCi+ODh+ODkOOCpOOCuSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Iuerr+acq+OCkuaknOe0ouOBl+OBpuOBhOOBvuOBmSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLmjqXntprjgpLop6PpmaQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLjgq3jg6Pjgrnjg4jjgpLlgZzmraIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IumWieOBmOOCiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuWGjeeUnyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i5LiA5pmC5YGc5q2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i5YGc5q2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i5bGV6ZaLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLmipjjgorjgZ/jgZ/jgoAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLjgqLjg6vjg5Djg6DjgqLjg7zjg4giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i6Z+z6YeP44K544Op44Kk44OA44O8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLjg6Hjg4fjgqPjgqLjgYzpgbjmip7jgZXjgozjgabjgYTjgb7jgZvjgpMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuaDheWgseOBjOOBguOCiuOBvuOBm+OCkyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i55S76Z2i44KS44Kt44Oj44K544OI44GX44Gm44GE44G+44GZIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rYS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWthL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGEwODFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWthL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuGDoeGDmOGDoeGDouGDlOGDm+GDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLhg5vhg53hg6zhg6fhg53hg5Hhg5jhg5rhg53hg5Hhg5Thg5Hhg5giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLhg6Lhg6Dhg5Dhg5zhg6Hhg5rhg5jhg6Dhg5Thg5Hhg5jhg6Eg4YOm4YOY4YOa4YOQ4YOZ4YOYIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4YOi4YOg4YOQ4YOc4YOh4YOa4YOY4YOg4YOU4YOR4YOY4YOhIOGDpuGDmOGDmuGDkOGDmeGDmC4g4YOS4YOQ4YOX4YOY4YOo4YOj4YOa4YOYIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLhg6Lhg6Dhg5Dhg5zhg6Hhg5rhg5jhg6Dhg5Thg5Hhg5jhg6Eg4YOm4YOY4YOa4YOQ4YOZ4YOYLiDhg5vhg5jhg5vhg5Phg5jhg5zhg5Dhg6Dhg5Thg53hg5Hhg6Eg4YOT4YOQ4YOZ4YOQ4YOV4YOo4YOY4YOg4YOU4YOR4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuGDouGDoOGDkOGDnOGDoeGDmuGDmOGDoOGDlOGDkeGDmOGDoSDhg6bhg5jhg5rhg5Dhg5nhg5guIOGDk+GDkOGDmeGDkOGDleGDqOGDmOGDoOGDlOGDkeGDo+GDmuGDmCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLhg6Lhg6Dhg5Dhg5zhg6Hhg5rhg5jhg6Dhg5Thg5Hhg5A6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4YOb4YOd4YOs4YOn4YOd4YOR4YOY4YOa4YOd4YOR4YOU4YOR4YOY4YOhIOGDm+GDneGDq+GDmOGDlOGDkeGDkC4uLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLhg5nhg5Dhg5Xhg6jhg5jhg6Dhg5jhg6Eg4YOS4YOQ4YOs4YOn4YOV4YOU4YOi4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4YOi4YOg4YOQ4YOc4YOh4YOa4YOY4YOg4YOU4YOR4YOY4YOhIOGDqOGDlOGDrOGDp+GDleGDlOGDouGDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4YOT4YOQ4YOu4YOj4YOg4YOV4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4YOT4YOQ4YOZ4YOV4YOg4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLhg57hg5Dhg6Phg5bhg5AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLhg6jhg5Thg6zhg6fhg5Xhg5Thg6Lhg5AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLhg5Lhg5Dhg6jhg5rhg5AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuGDqeGDkOGDmeGDlOGDquGDleGDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuGDkOGDmuGDkeGDneGDm+GDmOGDoSDhg5Lhg5Dhg6Dhg5Thg5nhg5Dhg5zhg5giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4YOu4YOb4YOY4YOhIOGDoeGDmuGDkOGDmOGDk+GDlOGDoOGDmCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4YOb4YOU4YOT4YOY4YOQIOGDkOGDoOGDqeGDlOGDo+GDmuGDmCDhg5Dhg6Ag4YOQ4YOg4YOY4YOhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLhg5jhg5zhg6Thg53hg6Dhg5vhg5Dhg6rhg5jhg5Ag4YOQ4YOgIOGDkOGDoOGDmOGDoSDhg67hg5Thg5rhg5vhg5jhg6Hhg5Dhg6zhg5Xhg5Phg53hg5vhg5giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuGDm+GDmOGDm+GDk+GDmOGDnOGDkOGDoOGDlOGDneGDkeGDoSDhg5Thg5nhg6Dhg5Dhg5zhg5jhg6Eg4YOS4YOQ4YOT4YOQ4YOq4YOU4YOb4YOQIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ray9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtrL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGRjYmIzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtrL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItCW0q/QudC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItKa0rHRgNGL0LvSk9GL0LvQsNGAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0KLRgNCw0L3RgdC70Y/RhtC40Y/Qu9Cw0YMg0YLSr9C50LzQtdGB0ZYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJcItCi0YDQsNC90YHQu9GP0YbQuNGP0LvQsNGDXCIg0YLSr9C50LzQtdGB0ZYuINCQ0LbRi9GA0LDRgtGD0LvRiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iXCLQotGA0LDQvdGB0LvRj9GG0LjRj9C70LDRg1wiINGC0q/QudC80LXRgdGWLiDSmtC+0YHRi9C70YPQtNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Ilwi0KLRgNCw0L3RgdC70Y/RhtC40Y/Qu9Cw0YNcIiDRgtKv0LnQvNC10YHRli4g0prQvtGB0YvQu9C00YsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0JrQtdC70LXRgdGW0LPQtSDRgtGA0LDQvdGB0LvRj9GG0LjRj9C70LDRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItKa0rHRgNGL0LvSk9GL0LvQsNGA0LTRiyDRgtCw0LHRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQkNC20YvRgNCw0YLRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCi0YDQsNC90YHQu9GP0YbQuNGP0LvQsNGD0LTRiyDRgtC+0pvRgtCw0YLRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JbQsNCx0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQntC50L3QsNGC0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCa0ZbQtNGW0YDRgtGDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i0KLQvtKb0YLQsNGC0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQltCw0Y4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCW0LjRjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCQ0LvRjNCx0L7QvCDRiNC10LHQtdGA0ZYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0JTRi9Cx0YvRgSDQtNC10qPQs9C10LnRltC90ZbSoyDQttKv0LPRltGA0YLQutGW0YHRliI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0JXRiNCx0ZbRgCDRgtCw0YHRg9GI0Ysg0YLQsNKj0LTQsNC70LzQsNKT0LDQvSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i0prQvtC7INC20LXRgtGW0LzQtNGWINCw0pvQv9Cw0YDQsNGCINC20L7SmyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0K3QutGA0LDQvdC00Ysg0YLRgNCw0L3RgdC70Y/RhtC40Y/Qu9Cw0YMiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWttL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta20vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NDc4MGUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta20vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4Z6U4Z+S4Z6a4Z6W4Z+Q4Z6T4Z+S4Z6SIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuGep+GelOGegOGemuGejuGfjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuGelOGfiuGevOGej+Geu+GehOGegeGetuGenyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuGegeGetuGen+GelOGfiuGevOGej+Geu+GehOGfliDhnpThnrbhnpPhnoDhnrbhno/hn4vhnpXhn5Lhno/hnrbhnoXhn4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuGegeGetuGen+GelOGfiuGevOGej+Geu+GehOGfliDhnoDhn4bhnpbhnrvhnoThnpfhn5LhnofhnrbhnpThn4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4Z6B4Z624Z6f4Z6U4Z+K4Z684Z6P4Z674Z6E4Z+WIOGelOGetuGek+Gel+GfkuGeh+GetuGelOGfi+GeoOGevuGemSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLhnpThnonhn5LhnofhnrzhnpPhnpHhn4UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLhnoDhn4bhnpbhnrvhnoThnp/hn5Lhnpzhn4LhnoThnprhnoDhnqfhnpThnoDhnprhno7hn40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4Z6V4Z+S4Z6K4Z624Z6F4Z+LIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4Z6I4Z6U4Z+L4Z6X4Z+S4Z6H4Z624Z6U4Z+LIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLhnpThnrfhnpEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLhnoXhnrbhnoDhn4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuGeleGfkuGeouGetuGegCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuGeiOGelOGfiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuGeluGehOGfkuGemuGeuOGegCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4Z6U4Z6E4Z+S4Z6a4Z694Z6YIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4Z6f4Z+S4Z6T4Z624Z6K4Z+D4Z6f4Z634Z6b4Z+S4Z6U4Z+I4Z6i4Z624Z6b4Z+L4Z6U4Z+K4Z674Z6YIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuGemuGelOGetuGemuGegOGemOGfkuGemuGet+Gej+Gen+GfhuGeoeGfgeGehCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4Z6C4Z+S4Z6Y4Z624Z6T4Z6A4Z624Z6a4Z6H4Z+S4Z6a4Z6+4Z6f4Z6Y4Z+B4Z6M4Z+A4Z6R4Z+BIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLhnpjhnrfhnpPhnpjhnrbhnpPhnpbhn5Dhno/hn4zhnpjhnrbhnpPhnpHhn4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuGegOGfhuGeluGeu+GehOGegeGetuGen+GeouGfgeGegOGfkuGemuGehOGfiyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta24vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rbi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIzN2ZkZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rbi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgsrjgsr/gsrjgs43gsp/gsoIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4LK44LK+4LKn4LKo4LKX4LKz4LOBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4LKs4LK/4LKk4LON4LKk4LKw4LK/4LK44LOBIOCyrOCyn+CyqOCzjeKAjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuCyrOCyv+CypOCzjeCypOCysOCyv+CyuOCzgSDgsqzgsp/gsqjgs43igIwuIOCyuOCyguCyquCysOCzjeCylSDgspXgsqHgsr/gsqTgspfgs4rgsrPgsr/gsrjgsrLgsr7gspfgsr/gsqbgs4YiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuCyrOCyv+CypOCzjeCypOCysOCyv+CyuOCzgSDgsqzgsp/gsqjgs43igIwuIOCyuOCyguCyquCysOCzjeCyleCyv+CyuOCysuCyvuCyl+CzgeCypOCzjeCypOCyv+CypuCzhiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgsqzgsr/gsqTgs43gsqTgsrDgsr/gsrjgs4Eg4LKs4LKf4LKo4LON4oCMLiDgsrjgsoLgsqrgsrDgs43gspXgsr/gsqTgspfgs4rgsoLgsqHgsr/gsqbgs4YiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4LKH4LKm4LKV4LON4LKV4LOGIOCyrOCyv+CypOCzjeCypOCysOCyv+CyuOCyvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCyuOCyvuCyp+CyqOCyl+Cys+CyqOCzjeCyqOCzgSDgsrngs4HgsqHgs4HgspXgsrLgsr7gspfgs4HgsqTgs43gsqTgsr/gsqbgs4YiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4LK44LKC4LKq4LKw4LON4LKVIOCyleCyoeCyv+CypOCyl+CziuCys+Cyv+CyuOCzgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuCyrOCyv+CypOCzjeCypOCysOCyv+CyuOCzgeCyteCyv+CyleCzhiDgsqjgsr/gsrLgs43gsrLgsr/gsrjgsr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuCyruCzgeCymuCzjeCymuCzgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCyquCzjeCysuCzhyDgsq7gsr7gsqHgsr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCyteCyv+CysOCyvuCyriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCyqOCyv+CysuCzjeCysuCyv+CyuOCyvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCyteCyv+CyuOCzjeCypOCysOCyv+CyuOCzgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4LK44LKC4LKV4LOB4LKa4LK/4LK44LOBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4LKG4LKy4LON4LKs4LKu4LONIOCyleCysuCzhiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgsrXgsr7gsrLgs43gsq/gs4Lgsq7gs40g4LK44LON4LKy4LOI4LKh4LKw4LONIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgsq/gsr7gsrXgs4Hgsqbgs4cg4LKu4LK+4LKn4LON4LKv4LKuIOCyhuCyr+CzjeCyleCzhuCyruCyvuCyoeCysuCyvuCyl+Cyv+CysuCzjeCysiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4LKv4LK+4LK14LOB4LKm4LOHIOCyruCyvuCyueCyv+CypOCyvyDgsrLgsq3gs43gsq/gsrXgsr/gsrLgs43gsrIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCyquCysOCypuCzhuCyr+CyqOCzjeCyqOCzgSDgsqzgsr/gsqTgs43gsqTgsrDgsr/gsrjgsrLgsr7gspfgs4HgsqTgs43gsqTgsr/gsqbgs4YiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta28vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlODkzYTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta28vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i7Iuc7Iqk7YWcIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Iuq4sOq4sCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuyghOyGoSDrsoTtirwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLsoITshqEg67KE7Yq8LiDsl7DqsrAg7ZW07KCc65CoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLsoITshqEg67KE7Yq8LiDsl7DqsrAg7KSRIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuyghOyGoSDrsoTtirwuIOyXsOqysOuQqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLsoITshqHtlaAg6riw6riwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i6riw6riw66W8IOywvuuKlCDspJEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i7Jew6rKwIO2VtOygnCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuyghOyGoSDspJHsp4AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuuLq+q4sCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuyerOyDnSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i7J287Iuc7KSR7KeAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i7KSR7KeAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i7Y687LmY6riwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLsoJHquLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLslajrspTslYTtirgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i67O866WoIOyKrOudvOydtOuNlCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i7ISg7YOd7ZWcIOuvuOuUlOyWtCDsl4bsnYwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuygleuztOqwgCDsl4bsirXri4jri6QuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLtmZTrqbQg7KCE7IahIOykkSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta3kvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1reS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc4MTNhZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1reS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQotGD0YLRg9C8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItCi0q/Qt9C806nQutGC06nRgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCi0YvRiNC60Ysg0Y3QutGA0LDQvdCz0LAg0YfRi9Cz0LDRgNGD0YMg0LHQsNGB0LrRi9GH0YsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQotGL0YjQutGLINGN0LrRgNCw0L3Qs9CwINGH0YvQs9Cw0YDRg9GDINCx0LDRgdC60YvRh9GLLiDQotKv0LfQvNOp0Log0LDQttGL0YDQsNC/INGC0YPRgNCw0YIuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQotGL0YjQutGLINGN0LrRgNCw0L3Qs9CwINGH0YvQs9Cw0YDRg9GDINCx0LDRgdC60YvRh9GLLiDQotKv0LfQvNOp0Log0YLRg9GC0LDRiNGD0YPQtNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCi0YvRiNC60Ysg0Y3QutGA0LDQvdCz0LAg0YfRi9Cz0LDRgNGD0YMg0LHQsNGB0LrRi9GH0YsuINCi0q/Qt9C806nQuiDRgtGD0YLQsNGI0YvQvyDRgtGD0YDQsNGCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCi06nQvNOp0L3QutKv0LPTqSDRh9GL0LPQsNGA0YPRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItCi0q/Qt9C806nQutGC06nRgCDQuNC30LTQtdC70q/Sr9C006kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0JDQttGL0YDQsNGC0YPRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCi0YvRiNC6INGN0LrRgNCw0L3Qs9CwINGH0YvQs9Cw0YDQvdGDINGC0L7QutGC0L7RgtGD0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCW0LDQsdGD0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQntC50L3QvtGC0YPRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i0KLRi9C90LTRi9GA0YPRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCi0L7QutGC0L7RgtGD0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQltCw0LnRi9C/INC606nRgNGB06nRgtKv0q8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCW0YvQudGL0YjRgtGL0YDRg9GDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0JDQu9GM0LHQvtC8INC80YPQutCw0LHQsNGB0YsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0q7QvdC00q8g0LrQsNGC0YPRg9C70LDRgtGD0YPRh9GDINGB0YvQtNGL0YDQvNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLQkdC40YAg0LTQsCDQvNC10LTQuNCwINGE0LDQudC7INGC0LDQvdC00LDQu9Cz0LDQvSDQttC+0LoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItCt0Ycg0LzQsNCw0LvRi9C80LDRgiDQttC+0LoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItCi0YvRiNC60Ysg0Y3QutGA0LDQvdCz0LAg0YfRi9Cz0LDRgNGL0LvRg9GD0LTQsCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbGFuZC9kaW1lbnMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbGFuZC9kaW1lbnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWYxZTFkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWxhbmQvZGltZW5zLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLSAgICA8IS0tIE1lZGlhUm91dGVDb250cm9sbGVyJ3Mgdm9sdW1lIGdyb3VwIGxpc3QgLS0+Ci0gICAgPGVhdC1jb21tZW50IC8+Ci0gICAgPCEtLSBNYXhpbXVtIGhlaWdodCBvZiB2b2x1bWUgZ3JvdXAgbGlzdC4gLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfbWF4X2hlaWdodCI+MTMyZHA8L2RpbWVuPgotICAgIDwhLS0gSGVpZ2h0IG9mIHZvbHVtZSBncm91cCBpdGVtLiAtLT4KLSAgICA8ZGltZW4gbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2hlaWdodCI+NjFkcDwvZGltZW4+Ci0gICAgPCEtLSBTaXplIG9mIGFuIGl0ZW0ncyBpY29uLiAtLT4KLSAgICA8ZGltZW4gbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2ljb25fc2l6ZSI+MThkcDwvZGltZW4+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWxvL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbG8vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNzM3ZGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbG8vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4Lql4Lqw4Lqa4Lq74LqaIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuC6reC6uOC6m+C6sOC6geC6reC6mSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuC6m+C6uOC7iOC6oeKAi+C6hOC6suKAi+C6quKAi+C6l+C7jCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuC6m+C6uOC7iOC6oeC6quC6u+C7iOC6h+C6quC6seC6meC6jeC6suC6mS4g4LqV4Lqx4LqU4LqB4Lqy4LqZ4LuA4LqK4Lq34LuI4Lqt4Lqh4LqV4LuN4LuI4LuB4Lql4LuJ4LqnIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgupvgurjgu4jguqHguqrgurvgu4jguofguqrgurHgupnguo3gurLgupkuIOC6geC6s+C6peC6seC6h+C7gOC6iuC6t+C7iOC6reC6oeC6leC7jeC7iCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgupvgurjgu4jguqHguqrgurvgu4jguofguqrgurHgupnguo3gurLgupkuIOC7gOC6iuC6t+C7iOC6reC6oeC6leC7jeC7iOC7geC6peC7ieC6pyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLguqrgurvgu4jguofguqrgurHgupnguo3gurLgupnguqvgurIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLguoHgurPguqXgurHguofigIvguorguq3guoHigIvguqvgurLigIvguq3gurjigIvgupvgurDigIvguoHguq3gupkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4LqV4Lqx4LqU4LqB4Lqy4LqZ4LuA4LqK4Lq34LuI4Lqt4Lqh4LqV4LuN4LuIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4Lqi4Lq44LqU4LqB4Lqy4LqZ4Lqq4Lq74LuI4LqH4Lqq4Lqx4LqZ4LqN4Lqy4LqZIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgupvgurTgupQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLguqvgurzgurTgu4ngupkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuC6ouC6uOC6lOC6iuC6u+C7iOC6p+C6hOC6suC6pyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuC6ouC6uOC6lCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuC6guC6sOC6q+C6jeC6suC6jSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4Lqr4LqN4LuN4LuJ4Lql4Lq74LqHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4Luc4LuJ4Lqy4Lqb4Lq74LqB4Lqt4Lqw4Lql4Lqw4Lqa4LuN4LuJ4LqyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuC6leC6u+C6p+C6m+C6seC6muC6peC6sOC6lOC6seC6muC6quC6veC6hyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4Lqa4LuN4LuI4oCL4LuE4LqU4LuJ4oCL4LuA4Lql4Lq34Lqt4LqB4oCL4Lqh4Lq14oCL4LuA4LqU4LqN4oCL4LuD4LqU4oCL4LuE4Lqn4LuJIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLguprgu43gu4jigIvguqHgurXigIvguoLgu43gu4nigIvguqHgurngupkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuC6geC6suC6meC6quC6u+C7iOC6h+C6nuC6suC6muC7nOC7ieC6suC6iOC7jSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbHQvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sdC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYwMzZkMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sdC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IsSucmVuZ2luaWFpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iUGVyZGF2aW1vIG15Z3R1a2FzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iUGVyZGF2aW1vIG15Z3R1a2FzLiBBdHNpanVuZ3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJQZXJkYXZpbW8gbXlndHVrYXMuIFByaXNpanVuZ2lhbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iUGVyZGF2aW1vIG15Z3R1a2FzLiBQcmlzaWp1bmd0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQZXJkdW90aSDEryI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlJhbmRhbWkgxK9yZW5naW5pYWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iQXRqdW5ndGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdXN0YWJkeXRpIHBlcmRhdmltxIUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlXFvmRhcnl0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkxlaXN0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUHJpc3RhYmR5dGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdXN0YWJkeXRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iScWhc2tsZWlzdGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlN1dHJhdWt0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtbyB2aXLFoWVsaXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iR2Fyc3VtbyDFoWxpYXXFvmlrbGlzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOZXBhc2lyaW5rdGEgam9raWEgbWVkaWphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJJbmZvcm1hY2lqYSBuZXBhc2lla2lhbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlBlcmR1b2RhbWFzIGVrcmFuYXMiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWx2L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbHYvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NDA2M2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbHYvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdMSTbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iSWVyxKtjZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJBcHJhaWRlcyBwb2dhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQXByYWlkZXMgcG9nYS4gU2F2aWVub2p1bXMgcMSBcnRyYXVrdHMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkFwcmFpZGVzIHBvZ2EuIE5vdGllayBzYXZpZW5vanVtYSBpenZlaWRlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkFwcmFpZGVzIHBvZ2EuIFNhdmllbm9qdW1zIGl6dmVpZG90cyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJBcHJhaWTEq8WhYW5hIHV6IGllcsSrY2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJOb3RpZWsgaWVyxKvEjXUgbWVrbMSTxaFhbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iQXR2aWVub3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJBcHR1csSTdCBhcHJhaWRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJBaXp2xJNydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkF0c2thxYZvdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iQXB0dXLEk3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJBcHR1csSTdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Ikl6dsSTcnN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTYWvEvGF1dCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtYSB2xIFjacWGxaEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iU2thxLx1bWEgc2zEq2RuaXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5hdiBhdGxhc8SrdGkgbXVsdGl2aWRlcyBmYWlsaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmF2IHBpZWVqYW1hIGluZm9ybcSBY2lqYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iTm90aWVrIGVrcsSBbmEgYXByYWlkZSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbWsvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tay9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJkZWUzNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tay9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQodC40YHRgtC10LwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i0KPRgNC10LTQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCa0L7Qv9GH0LXRgtC+INC30LAgQ2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCa0L7Qv9GH0LUg0LfQsCBDYXN0LiDQmNGB0LrQu9GD0YfQtdC90L4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCa0L7Qv9GH0LUg0LfQsCBDYXN0LiDQodC1INC/0L7QstGA0LfRg9Cy0LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i0JrQvtC/0YfQtSDQt9CwIENhc3QuINCf0L7QstGA0LfQsNC90L4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0JXQvNC40YLRg9Cy0LDRmCDQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0KHQtSDQsdCw0YDQsNCw0YIg0YPRgNC10LTQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQmNGB0LrQu9GD0YfQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCh0L7Qv9GA0Lgg0LPQviDQtdC80LjRgtGD0LLQsNGa0LXRgtC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLQl9Cw0YLQstC+0YDQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+ItCg0LXQv9GA0L7QtNGD0YbQuNGA0LDRmCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i0J/QsNGD0LfQuNGA0LDRmCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCh0L7Qv9GA0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQn9GA0L7RiNC40YDQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0KHQvtCx0LXRgNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0JrQvtGA0LjRhtCwINC90LAg0LDQu9Cx0YPQvCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLQm9C40LfQs9Cw0Ycg0LfQsCDRmNCw0YfQuNC90LAg0L3QsCDQt9Cy0YPQuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0J3QtSDRgdC1INC40LfQsdGA0LDQvdC4INC80LXQtNC40YPQvNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQndC10LzQsCDQtNC+0YHRgtCw0L/QvdC4INC40L3RhNC+0YDQvNCw0YbQuNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQldC60YDQsNC90L7RgiDRgdC1INC10LzQuNGC0YPQstCwIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tbC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1sL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDkxNGI5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1sL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuC0uOC0v+C0uOC1jeC0seC1jeC0seC0giI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgtIngtKrgtJXgtLDgtKPgtJngtY3gtJngtb4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgtJ/gtL7gtKrgtY3gtKrgtYHgtJrgtYbgtK/gtY3gtK/gtYHgtJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgtJXgtL7gtLjgtY3gtLHgtY3gtLHgtY0g4LSs4LSf4LWN4LSf4LW6LiDgtLXgtL/gtJrgtY3gtJvgtYfgtKbgtL/gtJrgtY3gtJrgtYEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuC0leC0vuC0uOC1jeC0seC1jeC0seC1jSDgtKzgtJ/gtY3gtJ/gtbouIOC0leC0o+C0leC1jeKAjOC0seC1jeC0seC1geC0muC1huC0r+C1jeC0r+C1geC0qOC1jeC0qOC1gSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgtJXgtL7gtLjgtY3gtLHgtY3gtLHgtY0g4LSs4LSf4LWN4LSf4LW6LiDgtJXgtKPgtJXgtY3gtLHgtY3gtLHgtYHgtJrgtYbgtK/gtY3gtKTgtYEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4LSH4LSk4LS/4LSy4LWH4LSV4LWN4LSV4LWNIOC0leC0vuC0uOC1jeC0seC1jeC0seC1geC0muC1huC0r+C1jeC0r+C1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuC0ieC0quC0leC0sOC0o+C0meC1jeC0meC1viDgtJXgtKPgtY3gtJ/gtYbgtKTgtY3gtKTgtYHgtKjgtY3gtKjgtYEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4LS14LS/4LSa4LWN4LSb4LWH4LSm4LS/4LSV4LWN4LSV4LWB4LSVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4LSV4LS+4LS44LWN4LSx4LWN4LSx4LWB4LSa4LWG4LSv4LWN4LSv4LW9IOC0qOC0v+C1vOC0pOC1jeC0pOC1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4LSF4LS14LS44LS+4LSo4LS/4LSq4LWN4LSq4LS/4LSV4LWN4LSV4LWB4LSVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4LSq4LWN4LSy4LWHIOC0muC1huC0r+C1jeC0r+C1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4LSk4LW94LSV4LWN4LSV4LS+4LSy4LSCIOC0qOC0v+C1vOC0pOC1jeC0pOC1giI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuC0qOC0v+C0sOC1jeKAjeC0pOC1jeC0pOC1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuC0teC0v+C0leC0uOC0v+C0quC1jeC0quC0v+C0leC1jeC0leC1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4LSa4LWB4LSw4LWB4LSV4LWN4LSV4LWB4LSVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4LSG4LW94LSs4LSCIOC0huC1vOC0n+C1jeC0n+C1jSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgtLXgtYvgtLPgtL/gtK/gtIIg4LS44LWN4LSy4LWI4LSh4LW8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgtK7gtYDgtKHgtL/gtK/gtK/gtYrgtKjgtY3gtKjgtYHgtIIg4LSk4LS/4LSw4LSe4LWN4LSe4LWG4LSf4LWB4LSk4LWN4LSk4LS/4LSf4LWN4LSf4LS/4LSy4LWN4LSyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgtLXgtL/gtLXgtLDgtJngtY3gtJngtLPgtYrgtKjgtY3gtKjgtYHgtIIg4LSy4LSt4LWN4LSv4LSu4LSy4LWN4LSyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgtLjgtY3igIzgtJXgtY3gtLDgtYDgtbsg4LSV4LS+4LS44LWN4LSx4LWN4LSx4LWB4LSa4LWG4LSv4LWN4LSv4LWB4LSo4LWN4LSo4LWBIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tbi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1uL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjg3YzkyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1uL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItCh0LjRgdGC0LXQvCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQotOp0YXTqdOp0YDTqdC80LbSr9Kv0LQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLQlNCw0LzQttGD0YPQu9Cw0YUg0YLQvtCy0YfQu9GD0YPRgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCU0LDQvNC20YPRg9C70LDRhSDRgtC+0LLRh9C70YPRg9GALiDQodCw0LvRgdCw0L0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCU0LDQvNC20YPRg9C70LDRhSDRgtC+0LLRh9C70YPRg9GALiDQpdC+0LvQsdC+0LYg0LHQsNC50L3QsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLQlNCw0LzQttGD0YPQu9Cw0YUg0YLQvtCy0YfQu9GD0YPRgC4g0KXQvtC70LHQvtCz0LTRgdC+0L0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0JTQsNC80LbRg9GD0LvQsNGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0KLTqdGF06nTqdGA06nQvNC2INGF0LDQudC2INCx0LDQudC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0KHQsNC70LPQsNGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0JTQsNC80LbRg9GD0LvQsNGF0YvQsyDQt9C+0LPRgdC+0L7RhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0KXQsNCw0YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQotC+0LPQu9GD0YPQu9Cw0YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCi0q/RgCDQt9C+0LPRgdC+0L7RhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCX0L7Qs9GB0L7QvtGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0JTRjdC70LPRjdGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQpdGD0YDQsNCw0YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQptC+0LzQs9C40LnQvSDQt9GD0YDQsNCzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCU0YPRg9C90Ysg0YLSr9Cy0YjQuNC9INGC0LDQsNGA0YPRg9C70LDQs9GHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLQr9C80LDRgCDRhyDQvNC10LTQuNCwINGB0L7QvdCz0L7QvtCz0q/QuSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i0JzRjdC00Y3RjdC70Y3QuyDQsdCw0LnRhdCz0q/QuSDQsdCw0LnQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQlNGN0LvQs9GN0YbQuNC50LMg0LTQsNC80LbRg9GD0LvQtiDQsdCw0LnQvdCwIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tci9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1yL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmZiZWJiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1yL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCkuOCkv+CkuOCljeCkn+CkriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgpKHgpL/gpLXgpY3gpLngpL7gpIfgpLjgpYfgpLgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgpJXgpL7gpLjgpY3gpJ8g4KSs4KSf4KSjIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4KSV4KS+4KS44KWN4KSfIOCkrOCkn+Ckoy4g4KSh4KS/4KS44KWN4KSV4KSo4KWH4KSV4KWN4KSfIOCkleClh+CksuClhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4KSV4KS+4KS44KWN4KSfIOCkrOCkn+Ckoy4g4KSV4KSo4KWH4KSV4KWN4KSfIOCkleCksOCkpCDgpIbgpLngpYciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4KSV4KS+4KS44KWN4KSfIOCkrOCkn+Ckoy4g4KSV4KSo4KWH4KSV4KWN4KSfIOCkleClh+CksuClhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLgpK/gpL7gpLXgpLAg4KSV4KS+4KS44KWN4KSfIOCkleCksOCkviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCkoeCkv+CkteCljeCkueCkvuCkh+CkuOClh+CkuCDgpLbgpYvgpKfgpKQg4KSG4KS54KWHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCkoeCkv+CkuOCljeKAjeCkleCkqOClh+CkleCljeKAjeCknyDgpJXgpLDgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgpJXgpL7gpLjgpY3gpJ8g4KSV4KSw4KSj4KWHIOCkpeCkvuCkguCkrOCkteCkviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4KSs4KSC4KSmIOCkleCksOCkviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCkquCljeCksuClhyDgpJXgpLDgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCkteCkv+CksOCkvuCkriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCkpeCkvuCkguCkrOCkviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCkteCkv+CkuOCljeCkpOClg+CkpCDgpJXgpLDgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCkuOCkguCkleClgeCkmuCkv+CkpCDgpJXgpLDgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgpIXgpLLgpY3gpKzgpK4g4KSV4KSy4KS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCkteCljeCkueClieCksuCljeCkr+ClguCkriDgpLjgpY3gpLLgpL7gpK/gpKHgpLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuCkruClgOCkoeCkv+Ckr+CkviDgpKjgpL/gpLXgpKHgpLLgpL4g4KSo4KS+4KS54KWAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgpJXgpYvgpKPgpKTgpYDgpLngpYAg4KSu4KS+4KS54KS/4KSk4KWAIOCkieCkquCksuCkrOCljeCkpyDgpKjgpL7gpLngpYAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCkuOCljeCkleCljeCksOClgOCkqCDgpJXgpL7gpLjgpY3igI3gpJ8g4KSV4KSw4KSkIOCkhuCkueClhyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tcy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg1ZTQ4MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tcy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iUGVyYW50aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJ1dGFuZyBIYW50YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCdXRhbmcgaGFudGFyLiBTYW1idW5nYW4gZGlwdXR1c2thbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQnV0YW5nIGhhbnRhci4gTWVueWFtYnVuZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCdXRhbmcgaGFudGFyLiBEaXNhbWJ1bmdrYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iSGFudGFyIGtlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iTWVuY2FyaSBwZXJhbnRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlB1dHVza2FuIHNhbWJ1bmdhbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkJlcmhlbnRpIG1lbmdoYW50YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlR1dHVwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iTWFpbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iSmVkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkJlcmhlbnRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iS2VtYmFuZ2thbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iUnVudHVoa2FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iU2VuaSBhbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJQZWx1bmN1ciBrZWxhbnRhbmdhbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iVGlhZGEgbWVkaWEgZGlwaWxpaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTWFrbHVtYXQgdGlkYWsgdGVyc2VkaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Ik1lbmdoYW50YXIgc2tyaW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW15L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXkvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4M2Q4MDUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXkvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4YCF4YCU4YCF4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuGAheGAgOGAuuGAleGAheGAueGAheGAiuGAuuGAuOGAmeGAu+GArOGAuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuGAgOGArOGAheGAuuGAkOGAuuGAnOGAr+GAleGAuuGAm+GAlOGAuiDhgIHhgJzhgK/hgJDhgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLhgIDhgKzhgIXhgLrhgIHhgJzhgK/hgJDhgLrhgYsg4YCB4YC74YCt4YCQ4YC64YCG4YCA4YC64YCZ4YCR4YCs4YC44YCV4YCrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLhgIDhgKzhgIXhgLrhgIHhgJzhgK/hgJDhgLrhgYsg4YCB4YC74YCt4YCQ4YC64YCG4YCA4YC64YCU4YCx4YCe4YCK4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuGAgOGArOGAheGAuuGAgeGAnOGAr+GAkOGAuuGBiyDhgIHhgLvhgK3hgJDhgLrhgIbhgIDhgLrhgJHhgKzhgLjhgJ7hgIrhgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4YCA4YCs4YCF4YC64YCc4YCv4YCV4YC64YCb4YCU4YC6IOGAheGAgOGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuGAheGAgOGAuuGAleGAheGAueGAheGAiuGAuuGAuOGAmeGAu+GArOGAuCDhgJvhgL7hgKzhgJbhgL3hgLHhgIHhgLzhgIThgLrhgLgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4YCG4YCA4YC64YCe4YC94YCa4YC64YCZ4YC+4YCvIOGAluGAvOGAkOGAuuGAm+GAlOGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuGAgOGArOGAheGAuuGAnOGAr+GAleGAuuGAgeGAvOGAhOGAuuGAuCDhgJvhgJXhgLrhgJvhgJThgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuGAleGAreGAkOGAuuGAm+GAlOGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuGAluGAveGAhOGAt+GAuuGAm+GAlOGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4YCB4YCP4YCb4YCV4YC64YCb4YCU4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4YCb4YCV4YC64YCb4YCU4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4YCW4YC84YCU4YC34YC64YCB4YC74YCb4YCU4YC64YGDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLhgIHhgLHhgKvhgIDhgLrhgJ7hgK3hgJnhgLrhgLjhgJvhgJThgLouLi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLhgKHhgJrhgLrhgJzhgLrhgJjhgJnhgLrhgJXhgK/hgLYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4YCh4YCe4YC24YCh4YCQ4YCt4YCv4YC44YCh4YCA4YC74YCa4YC64YCB4YC74YCt4YCU4YC64YCe4YCK4YC34YC6IOGAhuGAnOGAreGAr+GAgOGAuuGAkuGAqyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4YCZ4YCK4YC64YCe4YCK4YC34YC64YCZ4YCu4YCS4YCu4YCZ4YC+IOGAmeGAm+GAveGAseGAuOGAgeGAu+GAmuGAuuGAkeGArOGAuOGAleGAqyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4YCh4YCB4YC74YCA4YC64YCh4YCc4YCA4YC6IOGAmeGAm+GAm+GAvuGAreGAlOGAreGAr+GAhOGAuuGAleGAqyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4YCQ4YCK4YC64YC44YCW4YC84YCQ4YC64YCb4YCx4YC4IOGAmeGAu+GAgOGAuuGAlOGAvuGArOGAleGAvOGAhOGAuiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY3NjRjOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRW5oZXRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QtaWtvbmV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdC1rbmFwcGVuLiBGcmFrb2JsZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3Qta25hcHBlbi4gS29ibGVyIHRpbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0LWtuYXBwZW4uIFRpbGtvYmxldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0IHRpbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlPDuGtlciBldHRlciBlbmhldGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IktvYmxlIGZyYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN0b3BwIGNhc3RpbmdlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iTHVrayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlNwaWxsIGF2Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJTZXR0IHDDpSBwYXVzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3BwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iVXR2aWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNranVsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1ncmFmaWtrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkdsaWRlYnJ5dGVyIGZvciB2b2x1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iRHUgaGFyIGlra2UgdmFsZ3Qgbm9lbiBtZWRpZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkluZ2VuIGluZm9ybWFzam9uIGVyIHRpbGdqZW5nZWxpZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQ2FzdGVyIHNramVybWVuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1uZS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5lL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmMyZTFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5lL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCkquCljeCksOCko+CkvuCksuClgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgpIngpKrgpJXgpLDgpKPgpLngpLDgpYIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0IOCkrOCkn+CkqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3Qg4KSs4KSf4KSo4KWkIOCknOCkoeCkvuCkqCDgpLXgpL/gpJrgpY3gpJvgpYfgpKYg4KSt4KSv4KWLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0IOCkrOCkn+CkqOClpCDgpJzgpKHgpL7gpKgg4KS54KWB4KSB4KSm4KWIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3Qg4KSs4KSf4KSo4KWkIOCknOCkoeCkvuCkqCDgpK3gpK/gpYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4KSv4KS44KSu4KS+IENhc3Qg4KSX4KSw4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4KSv4KSo4KWN4KSk4KWN4KSw4KS54KSw4KWCIOCkquCkpOCljeCkpOCkviDgpLLgpJfgpL7gpIngpIHgpKbgpYgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4KS14KS/4KSa4KWN4KSb4KWH4KSmIOCkl+CksOCljeCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ImNhc3Rpbmcg4KSw4KWL4KSV4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgpKzgpKjgpY3gpKYg4KSX4KSw4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4KSs4KSc4KS+4KSJ4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgpLDgpYvgpJXgpY3gpKjgpYHgpLngpYvgpLjgpY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgpLDgpYvgpJXgpY3gpKjgpYHgpLngpYvgpLjgpY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgpLXgpL/gpLjgpY3gpKTgpL7gpLAg4KSX4KSw4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgpLjgpILgpJXgpY3gpLfgpL/gpKrgpY3gpKQg4KSq4KS+4KSw4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4KSP4KSy4KWN4KSs4KSuIOCkhuCksOCljeCknyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgpK3gpYvgpLLgpY3gpK/gpYHgpK7gpJXgpYsg4KS44KWN4KSy4KS+4KSH4KSh4KSwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgpJXgpYHgpKjgpYgg4KSu4KS/4KSh4KS/4KSv4KS+IOCkmuCkr+CkqCDgpK3gpI/gpJXgpYsg4KSb4KWI4KSoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgpJzgpL7gpKjgpJXgpL7gpLDgpYAg4KSJ4KSq4KSy4KSs4KWN4KSnIOCkm+CliOCkqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4KS44KWN4KSV4KWN4KSw4KS/4KSoIGNhc3Qg4KSX4KSw4KWN4KSm4KWIIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWRmNjJkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iQXBwYXJhdGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdC1pY29vbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3QtaWNvb24uIFZlcmJpbmRpbmcgdmVyYnJva2VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0LWljb29uLiBWZXJiaW5kaW5nIG1ha2VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3QtaWNvb24uIFZlcmJvbmRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0ZW4gbmFhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkFwcGFyYXRlbiB6b2VrZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iTG9za29wcGVsZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJDYXN0ZW4gc3RvcHBlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iU2x1aXRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkFmc3BlbGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJPbmRlcmJyZWtlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3BwZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJVaXR2b3V3ZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNhbWVudm91d2VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1ob2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlZvbHVtZXNjaHVpZnJlZ2VsYWFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJHZWVuIG1lZGlhIGdlc2VsZWN0ZWVyZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iR2VlbiBpbmZvcm1hdGllIGJlc2NoaWtiYWFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJTY2hlcm0gY2FzdGVuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wYS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXBhL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjVkZjcxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXBhL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCouOCov+CouOCon+CoriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgqKHgqL/gqLXgqL7gqIjgqLjgqL7gqIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgqJXgqL7gqLjgqJ8g4Kis4Kif4KioIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4KiV4Ki+4Ki44KifIOCorOCon+CoqOClpCDgqKHgqL/gqLjgqJXgqKjgqYjgqJXgqJ8g4KiV4KmA4Kik4Ki+IOCol+Cov+CohiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4KiV4Ki+4Ki44KifIOCorOCon+CoqOClpCDgqJXgqKjgqYjgqJXgqJ8g4KiV4KmA4Kik4Ki+IOConOCoviDgqLDgqL/gqLngqL4g4Ki54KmIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuColeCovuCouOConyDgqKzgqJ/gqKjgpaQg4KiV4Kio4KmI4KiV4KifIOColeCpgOCopOCoviDgqJfgqL/gqIYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4KiP4Kil4KmHIOColeCovuCouOConyDgqJXgqLDgqYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgqKHgqYDgqLXgqL7gqIjgqLjgqL7gqIIg4Kio4KmC4KmwIOCosuCpseCoreCov+CohiDgqJzgqL4g4Kiw4Ki/4Ki54Ki+IOCoueCpiCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgqKHgqL/gqLjgqJXgqKjgqYjgqJXgqJ8g4KiV4Kiw4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4KiV4Ki+4Ki44KifIOColeCosOCoqOCoviDgqKzgqbDgqKYg4KiV4Kiw4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgqKzgqbDgqKYg4KiV4Kiw4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4Kiq4Kiy4KmHIOColeCosOCpiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4Kiw4KmL4KiV4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Kis4Kmw4KimIOColeCosOCpiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCoteCov+CouOCopOCovuCosCDgqJXgqLDgqYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCorOCpsOCopiDgqJXgqLDgqYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgqJDgqLLgqKzgqK4g4KiG4Kiw4KifIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCoteCpjOCosuCor+CpguCoriDgqLjgqLLgqL7gqIjgqKHgqLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuColeCpi+CoiCDgqLXgqYAg4Kiu4KmA4Kih4KmA4KiGIOCoqOCoueCpgOCogiDgqJrgqYHgqKPgqL/gqIYg4KiX4Ki/4KiGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgqJXgqYvgqIgg4Kic4Ki+4Kij4KiV4Ki+4Kiw4KmAIOCoieCoquCosuCorOCopyDgqKjgqLngqYDgqIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCouOColeCpjeCosOCpgOCoqCDgqJzgqYvgqZwg4Kiw4Ki/4Ki54Ki+IOCoueCpiCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc5MmE2ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVXJ6xIVkemVuaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJQcnp5Y2lzayBDYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iUHJ6eWNpc2sgUHJ6ZcWbbGlqIGVrcmFuLiBSb3rFgsSFY3pvbm8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IlByenljaXNrIFByemXFm2xpaiBla3Jhbi4gxYHEhWN6xJkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iUHJ6eWNpc2sgUHJ6ZcWbbGlqIGVrcmFuLiBQb8WCxIVjem9ubyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQcnplc3nFgmFqIG5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iWm5hamRvd2FuaWUgdXJ6xIVkemXFhCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJPZMWCxIVjeiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlphdHJ6eW1haiBwcnplc3nFgmFuaWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlphbWtuaWoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJPZHR3w7NyeiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iV3N0cnp5bWFqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iWmF0cnp5bWFqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUm96d2nFhCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iWndpxYQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJPa8WCYWRrYSBhbGJ1bXUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iU3V3YWsgZ8WCb8Wbbm/Fm2NpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOaWUgd3licmFubyBtdWx0aW1lZGnDs3ciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkJyYWsgaW5mb3JtYWNqaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iUHJ6ZXN5xYJhbSBla3JhbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQtckJSL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQtckJSL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2M2MTlkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0LXJCUi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOjbyBUcmFuc21pdGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w6NvIFwiVHJhbnNtaXRpclwiLiBEZXNjb25lY3RhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOjbyBcIlRyYW5zbWl0aXJcIi4gQ29uZWN0YW5kbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCb3TDo28gXCJUcmFuc21pdGlyXCIuIENvbmVjdGFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJUcmFuc21pdGlyIHBhcmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJMb2NhbGl6YW5kbyBkaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGVzY29uZWN0YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJJbnRlcnJvbXBlciB0cmFuc21pc3PDo28iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkZlY2hhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHV6aXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlBhcmFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXhwYW5kaXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlJlY29saGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQXJ0ZSBkbyDDoWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbGUgZGVzbGl6YW50ZSBkZSB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5lbmh1bWEgbcOtZGlhIHNlbGVjaW9uYWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOZW5odW1hIGluZm9ybWHDp8OjbyBkaXNwb27DrXZlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iVHJhbnNtaXRpbmRvIGEgdGVsYSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQtclBUL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQtclBUL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjBhNjFkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOjbyBUcmFuc21pdGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w6NvIFRyYW5zbWl0aXIuIERlc2xpZ2FkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQm90w6NvIFRyYW5zbWl0aXIuIEEgbGlnYXIuLi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm90w6NvIFRyYW5zbWl0aXIuIExpZ2FkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJUcmFuc21pdGlyIHBhcmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJBIGxvY2FsaXphciBkaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGVzYXNzb2NpYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJQYXJhciBhIHRyYW5zbWlzc8OjbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iRmVjaGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdXppciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iSW50ZXJyb21wZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJQYXJhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4cGFuZGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSZWR1emlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iSW1hZ2VtIGRvIMOhbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJDb250cm9sbyBkZSBkZXNsaXplIGRvIHZvbHVtZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmVuaHVtIHN1cG9ydGUgbXVsdGltw6lkaWEgc2VsZWNpb25hZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5lbmh1bWEgaW5mb3JtYcOnw6NvIGRpc3BvbsOtdmVsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJBIHRyYW5zbWl0aXIgbyBlY3LDoyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wdC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjNjE5ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wdC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOjbyBUcmFuc21pdGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w6NvIFwiVHJhbnNtaXRpclwiLiBEZXNjb25lY3RhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOjbyBcIlRyYW5zbWl0aXJcIi4gQ29uZWN0YW5kbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCb3TDo28gXCJUcmFuc21pdGlyXCIuIENvbmVjdGFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJUcmFuc21pdGlyIHBhcmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJMb2NhbGl6YW5kbyBkaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGVzY29uZWN0YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJJbnRlcnJvbXBlciB0cmFuc21pc3PDo28iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkZlY2hhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHV6aXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlBhcmFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXhwYW5kaXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlJlY29saGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQXJ0ZSBkbyDDoWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbGUgZGVzbGl6YW50ZSBkZSB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5lbmh1bWEgbcOtZGlhIHNlbGVjaW9uYWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOZW5odW1hIGluZm9ybWHDp8OjbyBkaXNwb27DrXZlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iVHJhbnNtaXRpbmRvIGEgdGVsYSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcm8vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1yby9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmViYjJmNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1yby9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGlzcG96aXRpdmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCdXRvbnVsIGRlIHByb2llY8ibaWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCdXRvbnVsIGRlIHByb2llY8ibaWUuIERlY29uZWN0YXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJ1dG9udWwgZGUgcHJvaWVjyJtpZS4gU2UgY29uZWN0ZWF6xIMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQnV0b251bCBkZSBwcm9pZWPIm2llLiBDb25lY3RhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQcm9pZWN0YcibaSBwZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlNlIGNhdXTEgyBkaXNwb3ppdGl2ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEZWNvbmVjdGHIm2ktdsSDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iTnUgbWFpIHByb2llY3RhyJtpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLDjm5jaGlkZcibaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlZGHIm2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IsOObnRyZXJ1cGXIm2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJPcHJpyJtpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXh0aW5kZcibaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iUmVzdHLDom5nZcibaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkdyYWZpY2EgYWxidW11bHVpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkdsaXNvciBwZW50cnUgdm9sdW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5pY2l1biBmaciZaWVyIG1lZGlhIHNlbGVjdGF0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOdSBzdW50IGRpc3BvbmliaWxlIGluZm9ybWHIm2lpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJTZSBwcm9pZWN0ZWF6xIMgZWNyYW51bCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M0NjJkMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQodC40YHRgtC10LzQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQo9GB0YLRgNC+0LnRgdGC0LLQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0LjQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0LjQuC4g0KPRgdGC0YDQvtC50YHRgtCy0L4g0L7RgtC60LvRjtGH0LXQvdC+LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbQuNC4LiDQo9GB0YLRgNC+0LnRgdGC0LLQviDQv9C+0LTQutC70Y7Rh9Cw0LXRgtGB0Y8uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0LjQuC4g0KPRgdGC0YDQvtC50YHRgtCy0L4g0L/QvtC00LrQu9GO0YfQtdC90L4uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCS0YvQsdC10YDQuNGC0LUg0YPRgdGC0YDQvtC50YHRgtCy0L4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLQn9C+0LjRgdC6INGD0YHRgtGA0L7QudGB0YLQsuKApiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQntGC0LrQu9GO0YfQuNGC0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQn9GA0LXQutGA0LDRgtC40YLRjCDRgtGA0LDQvdGB0LvRj9GG0LjRjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JfQsNC60YDRi9GC0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQktC+0YHQv9GA0L7QuNC30LLQtdGB0YLQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i0J/RgNC40L7RgdGC0LDQvdC+0LLQuNGC0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQntGB0YLQsNC90L7QstC40YLRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItCg0LDQt9Cy0LXRgNC90YPRgtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQodCy0LXRgNC90YPRgtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0J7QsdC70L7QttC60LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0KDQtdCz0YPQu9GP0YLQvtGAINCz0YDQvtC80LrQvtGB0YLQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0JzQtdC00LjQsNGE0LDQudC7INC90LUg0LLRi9Cx0YDQsNC9Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQlNCw0L3QvdGL0YUg0L3QtdGCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQn9C+0LTQutC70Y7Rh9C10L3QuNC1INC6INGD0LTQsNC70LXQvdC90L7QvNGDINC80L7QvdC40YLQvtGA0YMiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNpL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc2kvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NWNlNTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc2kvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4La04Lav4LeK4Law4Lat4LeS4La6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuC2i+C2tOC3j+C2guC2nCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuC3gOC3kuC2muC3j+C3gSDgtrbgt5zgtq3gt4rgtq3gtrgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgt4Dgt5Lgtprgt4/gt4Eg4La24Lec4Lat4LeK4Lat4La4LiDgt4Dgt5Lgt4PgtrHgt4rgtrDgt5Ig4Laa4La74LaxIOC2veC2r+C3kyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4LeA4LeS4Laa4LeP4LeBIOC2tuC3nOC2reC3iuC2reC2uCDgt4Pgtrjgt4rgtrbgtrHgt4rgtrAg4Laa4La74La44LeS4Lax4LeKIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuC3gOC3kuC2muC3j+C3gSDgtrbgt5zgtq3gt4rgtq3gtrgg4LeD4La44LeK4La24Lax4LeK4LawIOC2muC2u+C2sSDgtr3gtq/gt5MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4LeA4LeS4Laa4LeP4LeB4La6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4LaL4La04LeP4LaC4LacIOC3g+C3meC3gOC3k+C2uCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgt4Dgt5Lgt4PgtrHgt4rgtrDgt5Ig4Laa4La74Lax4LeK4LaxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4LeA4LeS4Laa4LeP4LeBIOC2muC3kuC2u+C3k+C2uCDgtrHgtq3gtrsg4Laa4La74Lax4LeK4LaxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgt4Dgt4PgtrHgt4rgtrEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgtrDgt4/gt4DgtrHgtrog4Laa4La74Lax4LeK4LaxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgt4Dgt5Lgtrvgt4/gtrgg4Lac4Lax4LeK4LeA4Lax4LeK4LaxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Lax4Lat4La7IOC2muC2u+C2seC3iuC2sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuC2r+C3kuC2nCDgt4Tgtrvgt5LgtrHgt4rgtrEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuC3hOC2muC3lOC3heC2seC3iuC2sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuC2h+C2veC3iuC2tuC2uCDgtprgtr3gt4/gt4AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4LeE4LasIOC2tOC2u+C3kuC2uOC3jyDgt4Pgt4rgtr3gtrrgt5LgtqngtrvgtroiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuC2uOC3j+C2sOC3iuKAjeC2uuC2uiDgtq3gt53gtrvgt48g4Lax4LeQ4LatIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgtr3gtrbgt48g4Lac4LatIOC3hOC3kOC2muC3kiDgtq3gt5zgtrvgtq3gt5Tgtrvgt5Qg4Lax4Lec4La44LeQ4LatIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgt4Dgt5Lgtprgt4/gt4Eg4Lat4LeS4La74La6Ijwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zay9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNrL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNThhYTExLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNrL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3TDqW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iWmFyaWFkZW5pYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IlRsYcSNaWRsbyBwcmVub3N1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iVGxhxI1pZGxvIHByZW5vc3UuIE9kcG9qZW7DqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iVGxhxI1pZGxvIHByZW5vc3UuIFByaXDDoWphIHNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IlRsYcSNaWRsbyBwcmVub3N1LiBQcmlwb2plbsOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlByZW5vcyBkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkjEvmFkYWrDuiBzYSB6YXJpYWRlbmlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Ik9kcG9qacWlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iWmFzdGF2acWlIHByZW7DocWhYW5pZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iWmF2cmllxaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQcmVocmHFpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUG96YXN0YXZpxaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJaYXN0YXZpxaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJSb3piYWxpxaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlpiYWxpxaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJPYnLDoXpvayBhbGJ1bXUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iUG9zw7p2YcSNIGhsYXNpdG9zdGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5pZSBzw7ogdnlicmFuw6kgxb5pYWRuZSBtw6lkacOhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOaWUgc8O6IGvCoGRpc3BvesOtY2lpIMW+aWFkbmUgaW5mb3Jtw6FjaWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlByZW7DocWhYSBzYSBvYnJhem92a2EiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNsL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc2wvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYTRjZTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc2wvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Ik5hcHJhdmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJHdW1iIHphIHByZWR2YWphbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iR3VtYiB6YSBwcmVkdmFqYW5qZS4gUG92ZXphdmEgamUgcHJla2luamVuYS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Ikd1bWIgemEgcHJlZHZhamFuamUuIFZ6cG9zdGF2bGphbmplIHBvdmV6YXZlLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJHdW1iIHphIHByZWR2YWphbmplLiBQb3ZlemF2YSBqZSB2enBvc3RhdmxqZW5hLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQcmVkdmFqYW5qZSBwcmVrOiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Iklza2FuamUgbmFwcmF2Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlByZWtpbmkgcG92ZXphdm8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJVc3RhdmkgcHJlZHZhamFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlphcHJpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUHJlZHZhamFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlphdXN0YXZpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iVXN0YXZpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUmF6xaFpcmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlN0cm5pIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iTmFzbG92bmljYSBhbGJ1bWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iRHJzbmlrIHphIGdsYXNub3N0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOaSBpemJyYW5lIHByZWRzdGF2bm9zdGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IlBvZGF0a2kgbmlzbyBuYSB2b2xqbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iUHJlZHZhamFuamUgemFzbG9uYSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Evc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zcS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE2ZTExMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zcS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1pIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlBhamlzamV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQnV0b25pIGkgdHJhbnNtZXRpbWl0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQnV0b25pIGkgdHJhbnNtZXRpbWl0LiBKZSBpIHNoa8OrcHV0dXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJ1dG9uaSBpIHRyYW5zbWV0aW1pdC4gUG8gbGlkaGV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJ1dG9uaSBpIHRyYW5zbWV0aW1pdC4gSmUgaSBsaWRodXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJhbnNtZXRvIHRlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iUG8ga8OrcmtvbiBwYWppc2plIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlNoa8OrcHV0ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Ik5kYWxvIHRyYW5zbWV0aW1pbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iTWJ5bGwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJMdWFqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXV6w6siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJOZGFsbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlpnamVyb2plIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJQYWxvc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJLb3BlcnRpbmEgZSBhbGJ1bWl0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlJyw6tzaHFpdMOrc2kgaSB2b2x1bWl0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOdWsgdSB6Z2pvZGggYXNuasOrIG1lZGlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOdWsgamVwZXQgYXNuasOrIGluZm9ybWFjaW9uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJQbyB0cmFuc21ldG9uIGVrcmFuaW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNyL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Ivc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYWJhZDUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Ivc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i0KHQuNGB0YLQtdC8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItCj0YDQtdGS0LDRmNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0JTRg9Cz0LzQtSDQn9GA0LXQsdCw0YbQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCU0YPQs9C80LUg0J/RgNC10LHQsNGG0LguINCS0LXQt9CwINGY0LUg0L/RgNC10LrQuNC90YPRgtCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQlNGD0LPQvNC1INCf0YDQtdCx0LDRhtC4LiDQn9C+0LLQtdC30YPRmNC1INGB0LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i0JTRg9Cz0LzQtSDQn9GA0LXQsdCw0YbQuC4g0J/QvtCy0LXQt9Cw0L0g0ZjQtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLQn9GA0LXQsdCw0YbRg9GYINC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLQn9GA0L7QvdCw0LvQsNC20LXRmtC1INGD0YDQtdGS0LDRmNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItCf0YDQtdC60LjQvdC4INCy0LXQt9GDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0JfQsNGD0YHRgtCw0LLQuCDQv9GA0LXQsdCw0YbQuNCy0LDRmtC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLQl9Cw0YLQstC+0YDQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+ItCf0YPRgdGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCf0LDRg9C30LjRgNCw0ZgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQl9Cw0YPRgdGC0LDQstC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0J/RgNC+0YjQuNGA0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCh0LrRg9C/0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQntC80L7RgiDQsNC70LHRg9C80LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0JrQu9C40LfQsNGHINC30LAg0ZjQsNGH0LjQvdGDINC30LLRg9C60LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCd0LXQvNCwINC40LfQsNCx0YDQsNC90LjRhSDQvNC10LTQuNGY0LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItCd0LjRgdGDINC00L7RgdGC0YPQv9C90LUg0L3QuNC60LDQutCy0LUg0LjQvdGE0L7RgNC80LDRhtC40ZjQtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0J/RgNC10LHQsNGG0YPRmNC1INGB0LUg0LXQutGA0LDQvSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Yvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E3ZDNlMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRW5oZXRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3Qta25hcHBlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3Qta25hcHBlbi4gRnLDpW5rb3BwbGFkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0LWtuYXBwZW4uIEFuc2x1dGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3Qta25hcHBlbi4gQW5zbHV0ZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdGEgdGlsbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkxldGFyIGVmdGVyIGVuaGV0ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iS29wcGxhIGZyw6VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU2x1dGEgY2FzdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlN0w6RuZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlNwZWxhIHVwcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJBdmJyeXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJVdMO2a2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IktvbXByaW1lcmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJTa2l2b21zbGFnIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlZvbHltcmVnbGFnZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iSW5nYSBtZWRpYSBoYXIgdmFsdHMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkRldCBmaW5ucyBpbmdlbiBpbmZvcm1hdGlvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iU2vDpHJtZW4gY2FzdGFzIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTYyY2IxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Ik1mdW1vIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlZpZmFhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iS2l0dWZlIGNoYSBrdXR1bWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJLaXR1ZmUgY2hhIGt1dHVtYS4gS2ltZW9uZG9sZXdhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJLaXR1ZmUgY2hhIGt1dHVtYS4gS2luYXVuZ2FuaXNoYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJLaXR1ZmUgY2hhIGt1dHVtYS4gS2ltZXVuZ2FuaXNod2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHVtYSBrd2VueWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJJbmF0YWZ1dGEgdmlmYWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iT25kb2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJBY2hhIGt1dHVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iRnVuZ2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJDaGV6YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iU2l0aXNoYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlNpbWFtaXNoYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlBhbnVhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJLdW5qYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IlNhbmFhIHlhIGFsYmFtdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJLaXRlbGV6aSBjaGEgc2F1dGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ikhha3VuYSBtYXVkaHVpIHlhbGl5b2NoYWd1bGl3YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iSGFrdW5hIG1hZWxlem8geWFsaXlvcGF0aWthbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkluYXR1bWEgc2tyaW5pIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdzYwMGRwL2RpbWVucy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdzYwMGRwL2RpbWVucy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNDIzNDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3c2MDBkcC9kaW1lbnMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cmVzb3VyY2VzPgotICAgIDwhLS0gVGhlIHBsYXRmb3JtJ3MgZGVzaXJlZCBmaXhlZCB3aWR0aCBmb3IgYSBkaWFsb2cgYWxvbmcgdGhlIG1ham9yIGF4aXMKLSAgICAgICAgICh0aGUgc2NyZWVuIGlzIGluIGxhbmRzY2FwZSkuIFRoaXMgbWF5IGJlIGVpdGhlciBhIGZyYWN0aW9uIG9yIGEgZGltZW5zaW9uLi0tPgotICAgIDxpdGVtIHR5cGU9ImRpbWVuIiBuYW1lPSJtcl9kaWFsb2dfZml4ZWRfd2lkdGhfbWFqb3IiPjYwJTwvaXRlbT4KLSAgICA8IS0tIFRoZSBwbGF0Zm9ybSdzIGRlc2lyZWQgZml4ZWQgd2lkdGggZm9yIGEgZGlhbG9nIGFsb25nIHRoZSBtaW5vciBheGlzCi0gICAgICAgICAodGhlIHNjcmVlbiBpcyBpbiBwb3J0cmFpdCkuIFRoaXMgbWF5IGJlIGVpdGhlciBhIGZyYWN0aW9uIG9yIGEgZGltZW5zaW9uLi0tPgotICAgIDxpdGVtIHR5cGU9ImRpbWVuIiBuYW1lPSJtcl9kaWFsb2dfZml4ZWRfd2lkdGhfbWlub3IiPjkwJTwvaXRlbT4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3c3MjBkcC9kaW1lbnMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3c3MjBkcC9kaW1lbnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzRhYjhkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3NzIwZHAvZGltZW5zLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLSAgICA8IS0tIFRoZSBwbGF0Zm9ybSdzIGRlc2lyZWQgZml4ZWQgd2lkdGggZm9yIGEgZGlhbG9nIGFsb25nIHRoZSBtYWpvciBheGlzCi0gICAgICAgICAodGhlIHNjcmVlbiBpcyBpbiBsYW5kc2NhcGUpLiBUaGlzIG1heSBiZSBlaXRoZXIgYSBmcmFjdGlvbiBvciBhIGRpbWVuc2lvbi4tLT4KLSAgICA8aXRlbSB0eXBlPSJkaW1lbiIgbmFtZT0ibXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21ham9yIj41MCU8L2l0ZW0+Ci0gICAgPCEtLSBUaGUgcGxhdGZvcm0ncyBkZXNpcmVkIGZpeGVkIHdpZHRoIGZvciBhIGRpYWxvZyBhbG9uZyB0aGUgbWlub3IgYXhpcwotICAgICAgICAgKHRoZSBzY3JlZW4gaXMgaW4gcG9ydHJhaXQpLiBUaGlzIG1heSBiZSBlaXRoZXIgYSBmcmFjdGlvbiBvciBhIGRpbWVuc2lvbi4tLT4KLSAgICA8aXRlbSB0eXBlPSJkaW1lbiIgbmFtZT0ibXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21pbm9yIj43MCU8L2l0ZW0+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRhL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGEvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxOTc4ZjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGEvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4K6a4K6/4K644K+N4K6f4K6u4K+NIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuCumuCuvuCupOCuqeCumeCvjeCuleCus+CvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuCupOCuv+CusOCviOCur+Cuv+Cun+CvgSDgrqrgrp/gr43grp/grqngr40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgroXgrqngr4Hgrqrgr43grqrgr4HgrqTgrrLgr40g4K6q4K+K4K6k4K+N4K6k4K6+4K6p4K+NLiDgrqTgr4HgrqPgr43grp/grr/grpXgr43grpXgrqrgr43grqrgrp/gr43grp/grqTgr4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuCuheCuqeCvgeCuquCvjeCuquCvgeCupOCusuCvjSDgrqrgr4rgrqTgr43grqTgrr7grqngr40uIOCuh+Cuo+CviOCuleCvjeCuleCuv+CuseCupOCvgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgroXgrqngr4Hgrqrgr43grqrgr4HgrqTgrrLgr40g4K6q4K+K4K6k4K+N4K6k4K6+4K6p4K+NLiDgrofgrqPgr4jgrpXgr43grpXgrqrgr43grqrgrp/gr43grp/grqTgr4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4K6H4K6k4K6x4K+N4K6V4K+BIOCuheCuqeCvgeCuquCvjeCuquCvgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCumuCuvuCupOCuqeCumeCvjeCuleCus+CviOCupOCvjSDgrqTgr4fgrp/gr4HgrpXgrr/grrHgrqTgr4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4K6k4K+K4K6f4K6w4K+N4K6q4K+I4K6k4K+NIOCupOCvgeCuo+CvjeCun+CuvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuCuheCuqeCvgeCuquCvjeCuquCvgeCuteCupOCviCDgrqjgrr/grrHgr4HgrqTgr43grqTgr4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuCuruCvguCun+CvgeCuruCvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCuh+Cur+CuleCvjeCuleCvgeCuruCvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4K6H4K6f4K+I4K6o4K6/4K6x4K+B4K6k4K+N4K6k4K+B4K6u4K+NIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4K6o4K6/4K6x4K+B4K6k4K+N4K6k4K+B4K614K6k4K6x4K+N4K6V4K6+4K6pIOCuquCviuCupOCvjeCupOCuvuCuqeCvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCuteCuv+CusOCuv+CuteCuvuCuleCvjeCuleCvgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4K6a4K+B4K6w4K+B4K6V4K+N4K6V4K+BIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4K6G4K6y4K+N4K6q4K6u4K+NIOCuhuCusOCvjeCun+CvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgrpLgrrLgrr/grq/grrPgrrXgr4Eg4K644K+N4K6y4K+I4K6f4K6w4K+NIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgrq7gr4Dgrp/grr/grq/grr4g4K6O4K6k4K+B4K614K+B4K6u4K+NIOCupOCvh+CusOCvjeCuqOCvjeCupOCvhuCun+CvgeCuleCvjeCuleCuquCvjeCuquCun+CuteCuv+CusuCvjeCusuCviCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4K6k4K6V4K614K6y4K+NIOCujuCupOCvgeCuteCvgeCuruCuv+CusuCvjeCusuCviCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4K6k4K6/4K6w4K+I4K6v4K+IIOCuheCuqeCvgeCuquCvjeCuquCvgeCuleCuv+CuseCvgOCusOCvjeCuleCus+CvjSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10ZS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QzMTJlMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10ZS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgsLjgsL/gsLjgsY3gsJ/gsK7gsY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4LCq4LCw4LC/4LCV4LCw4LC+4LCy4LGBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4LCq4LGN4LCw4LC44LC+4LCw4LCCIOCwmuCxh+Cwr+CwvyDgsKzgsJ/gsKjgsY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgsKrgsY3gsLDgsLjgsL7gsLAg4LCs4LCf4LCo4LGNLiDgsKHgsL/gsLjgsY3igIzgsJXgsKjgsYbgsJXgsY3gsJ/gsY0g4LCa4LGH4LCv4LCs4LCh4LC/4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgsKrgsY3gsLDgsLjgsL7gsLAg4LCs4LCf4LCo4LGNLiDgsJXgsKjgsYbgsJXgsY3gsJ/gsY0g4LCa4LGH4LC44LGN4LCk4LGL4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuCwquCxjeCwsOCwuOCwvuCwsCDgsKzgsJ/gsKjgsY0uIOCwleCwqOCxhuCwleCxjeCwn+CxjSDgsJrgsYfgsK/gsKzgsKHgsL/gsILgsKbgsL8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4LCm4LGA4LCo4LC/4LCV4LC/IOCwquCxjeCwsOCwuOCwvuCwsOCwgiDgsJrgsYfgsK/gsILgsKHgsL8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgsKrgsLDgsL/gsJXgsLDgsL7gsLLgsKjgsYEg4LCV4LCo4LGB4LCX4LGK4LCC4LCf4LGL4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCwoeCwv+CwuOCxjeKAjOCwleCwqOCxhuCwleCxjeCwn+CxjSDgsJrgsYfgsK/gsL8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgsKrgsY3gsLDgsLjgsL7gsLDgsL7gsKjgsY3gsKjgsL8g4LCG4LCq4LC/4LC14LGH4LCv4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgsK7gsYLgsLjgsL/gsLXgsYfgsLjgsY3gsKTgsYHgsILgsKbgsL8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgsKrgsY3gsLLgsYcg4LCa4LGH4LC44LGN4LCk4LGB4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgsKrgsL7gsJzgsY0g4LCa4LGH4LC44LGN4LCk4LGB4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4LCG4LCq4LC/4LC14LGH4LCv4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4LC14LC/4LC44LGN4LCk4LCw4LC/4LCC4LCq4LCc4LGH4LC44LGN4LCk4LGB4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgsJXgsYHgsKbgsL/gsLjgsY3gsKTgsYHgsILgsKbgsL8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgsIbgsLLgsY3gsKzgsK7gsY0g4LCG4LCw4LGN4LCf4LGNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCwteCwvuCwsuCxjeCwr+CxguCwruCxjSDgsLjgsY3gsLLgsK/gsL/gsKHgsLDgsY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuCwruCxgOCwoeCwv+Cwr+CwviDgsI/gsKbgsYAg4LCO4LCC4LCa4LGB4LCV4LGL4LCs4LCh4LCy4LGH4LCm4LGBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgsLjgsK7gsL7gsJrgsL7gsLDgsIIg4LCF4LCC4LCm4LGB4LCs4LC+4LCf4LGB4LCy4LGLIOCwsuCxh+CwpuCxgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4LC44LGN4LCV4LGN4LCw4LGA4LCo4LGN4oCM4LCo4LGBIOCwquCxjeCwsOCwuOCwvuCwsOCwgiDgsJrgsYfgsLjgsY3gsKTgsYvgsILgsKbgsL8iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRoL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGgvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYThhZTUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGgvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4Lij4Liw4Lia4LiaIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuC4reC4uOC4m+C4geC4o+C4k+C5jCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuC4m+C4uOC5iOC4oSBcIuC5geC4hOC4quC4leC5jFwiIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4Lib4Li44LmI4LihIFwi4LmB4LiE4Liq4LiV4LmMXCIg4Lii4LiB4LmA4Lil4Li04LiB4LiB4Liy4Lij4LmA4LiK4Li34LmI4Lit4Lih4LiV4LmI4LitIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLguJvguLjguYjguKEgXCLguYHguITguKrguJXguYxcIiDguIHguLPguKXguLHguIfguYDguIrguLfguYjguK3guKHguJXguYjguK0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4Lib4Li44LmI4LihIFwi4LmB4LiE4Liq4LiV4LmMXCIg4LmA4LiK4Li34LmI4Lit4Lih4LiV4LmI4Lit4LmB4Lil4LmJ4LinIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuC5geC4hOC4quC4leC5jOC5hOC4m+C4ouC4seC4hyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuC4geC4s+C4peC4seC4h+C4hOC5ieC4meC4q+C4suC4reC4uOC4m+C4geC4o+C4k+C5jCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLguKLguIHguYDguKXguLTguIHguIHguLLguKPguYDguIrguLfguYjguK3guKHguJXguYjguK0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLguKvguKLguLjguJTguYHguITguKrguJXguYwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuC4m+C4tOC4lCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuC5gOC4peC5iOC4mSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4Lir4Lii4Li44LiU4LiK4Lix4LmI4Lin4LiE4Lij4Liy4LinIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Lir4Lii4Li44LiUIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4LiC4Lii4Liy4LiiIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLguKLguLjguJoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLguJvguIHguK3guLHguKXguJrguLHguYnguKEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4LmB4LiW4Lia4LmA4Lil4Li34LmI4Lit4LiZ4Lib4Lij4Lix4Lia4Lij4Liw4LiU4Lix4Lia4LmA4Liq4Li14Lii4LiHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLguYTguKHguYjguYTguJTguYnguYDguKXguLfguK3guIHguKrguLfguYjguK3guYTguKfguYkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuC5hOC4oeC5iOC4oeC4teC4guC5ieC4reC4oeC4ueC4pSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4LiB4Liz4Lil4Lix4LiH4LmB4LiE4Liq4LiV4LmM4Lir4LiZ4LmJ4Liy4LiI4LitIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10bC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRsL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGJlM2QwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRsL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJNZ2EgRGV2aWNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQnV0dG9uIG5hIEktY2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJ1dHRvbiBuYSBJLWNhc3QuIE5hZGlza29uZWt0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQnV0dG9uIG5hIEktY2FzdC4gS3Vtb2tvbmVrdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQnV0dG9uIG5hIEktY2FzdC4gTmFrYWtvbmVrdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iSS1jYXN0IHNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iTmFnaGFoYW5hcCBuZyBtZ2EgZGV2aWNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IklkaXNrb25la3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iSWhpbnRvIGFuZyBwYWctY2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iSXNhcmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJJLXBsYXkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkktcGF1c2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJJaGludG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJQYWxhd2FraW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkktY29sbGFwc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bSBhcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iU2xpZGVyIG5nIHZvbHVtZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iV2FsYW5nIHBpbmlsaW5nIG1lZGlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJXYWxhbmcgYXZhaWxhYmxlIG5hIGltcG9ybWFzeW9uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJLaW5hLWNhc3QgYW5nIHNjcmVlbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10ci9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVmNjM5Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10ci9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iQ2loYXpsYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJZYXnEsW5sYSBkw7zEn21lc2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJZYXnEsW5sYSBkw7zEn21lc2kuIEJhxJ9sYW50xLEga2VzaWxkaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iWWF5xLFubGEgZMO8xJ9tZXNpLiBCYcSfbGFuxLF5b3IiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iWWF5xLFubGEgZMO8xJ9tZXNpLiBCYcSfbGFuZMSxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IsWedXJheWEgeWF5xLFubGE6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iQ2loYXpsYXIgYnVsdW51eW9yIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkJhxJ9sYW50xLF5xLEga2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iWWF5xLFuxLEgZHVyZHVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJLYXBhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+Ik95bmF0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJEdXJha2xhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkR1cmR1ciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkdlbmnFn2xldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iRGFyYWx0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxiw7xtIGthcGHEn8SxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlNlcyBkw7x6ZXlpIGtheWTEsXJtYSDDp3VidcSfdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTWVkeWEgc2XDp2lsbWVkaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iQmlsZ2kgeW9rIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJFa3JhbiB5YXnEsW5sYW7EsXlvciI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdWsvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ay9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNkMzY1ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ay9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQodC40YHRgtC10LzQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQn9GA0LjRgdGC0YDQvtGXIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRltGXIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRltGXLiDQktGW0LTigJnRlNC00L3QsNC90L4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0ZbRly4g0J/RltC04oCZ0ZTQtNC90LDQvdC90Y8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRltGXLiDQn9GW0LTigJnRlNC00L3QsNC90L4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0KLRgNCw0L3RgdC70Y7QstCw0YLQuCDQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0J/QvtGI0YPQuiDQv9GA0LjRgdGC0YDQvtGX0LIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0JLRltC00LrQu9GO0YfQuNGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQn9GA0LjQv9C40L3QuNGC0Lgg0YLRgNCw0L3RgdC70Y/RhtGW0Y4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCX0LDQutGA0LjRgtC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0JLRltC00YLQstC+0YDQuNGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCf0YDQuNC30YPQv9C40L3QuNGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQn9GA0LjQv9C40L3QuNGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQoNC+0LfQs9C+0YDQvdGD0YLQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0JfQs9C+0YDQvdGD0YLQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCe0LHQutC70LDQtNC40L3QutCwINCw0LvRjNCx0L7QvNGDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCf0L7QstC30YPQvdC+0Log0LPRg9GH0L3QvtGB0YLRliI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0JzQtdC00ZbQsC3RhNCw0LnQuyDQvdC1INCy0LjQsdGA0LDQvdC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQndC10LzQsNGUINC00LDQvdC40YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItCi0YDQsNC90YHQu9GP0YbRltGPINC10LrRgNCw0L3QsCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdXIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ci9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMyYzU5OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ci9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLYs9iz2bnZhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLYotmE2KfYqiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Itqp2KfYs9m5INqp2LHZhtuSINqp2Kcg2KjZudmGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i2qnYp9iz2bkg2qnYsdmG25Ig2qnYpyDYqNm52YbblCDYutuM2LEg2YXZhtiz2YTaqSDbgduSIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLaqdin2LPZuSDaqdix2YbbkiDaqdinINio2bnZhtuUINmF2YbYs9mE2qkg24HZiCDYsduB2Kcg24HbkiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLaqdin2LPZuSDaqdix2YbbkiDaqdinINio2bnZhtuUINmF2YbYs9mE2qkg24HbkiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLYp9izINmF24zauiDaqdin2LPZuSDaqdix24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Itii2YTYp9iqINiq2YTYp9i0INuB2Ygg2LHbgduSINuB24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLYutuM2LEg2YXZhtiz2YTaqSDaqdix24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Itqp2KfYs9m5INqp2LHZhtinINio2YbYryDaqdix24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i2KjZhtivINqp2LHbjNq6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i2obZhNin2KbbjNq6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLZhdmI2YLZiNmBINqp2LHbjNq6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i2LHZiNqp24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Itm+2r7bjNmE2KfYptuM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Itiz2qnbjNqR24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Itin2YTYqNmFINii2LHZuSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLZiNin2YTbjNmI2YUg2LPZhNin2KbbjNqI2LEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Itqp2YjYptuMINmF24zaiNuM2Kcg2YXZhtiq2K7YqCDZhtuB24zauiDbgduSIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLaqdmI2KbbjCDZhdi52YTZiNmF2KfYqiDYr9iz2KrbjNin2Kgg2YbbgduM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Itiz2qnYsduM2YYg2qnYp9iz2bkg24HZiCDYsduB24wg24HbkiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdXovc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ei9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhMDgxNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ei9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJUaXppbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJRdXJpbG1hbGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iVHJhbnNsYXRzaXlhIHR1Z21hc2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJUcmFuc2xhdHNpeWEgdHVnbWFzaS4gVXppbGRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJUcmFuc2xhdHNpeWEgdHVnbWFzaS4gVWxhbm1vcWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IlRyYW5zbGF0c2l5YSB0dWdtYXNpLiBVbGFuZGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iUXV5aWRhZ2lnYSB0cmFuc2xhdHNpeWEgcWlsaXNoOiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlF1cmlsbWFsYXJuaSB0b3Bpc2giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iVWxhbmlzaG5pIHV6aXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iVHJhbnNsYXRzaXlhbmkgdG/igJh4dGF0aXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJZb3Bpc2giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJCb3NobGFzaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iVG/igJh4dGF0aWIgdHVyaXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iVG/igJh4dGF0aXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iWW95aXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJZaWfigJhpc2giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJvbSBtdXFvdmFzaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJUb3Z1c2ggYmFsYW5kbGlnaSBzbGF5ZGVyaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTXVsdGltZWRpYSB0YW5sYW1hZ2FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJIZWNoIHFhbmRheSBtYeKAmWx1bW90IHlv4oCYcSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRWtyYW5uaSB0cmFuc2xhdHNpeWEgcWlsaXNoIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy12aS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXZpL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDk4Y2NhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXZpL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Ikjhu4cgdGjhu5FuZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJUaGnhur90IGLhu4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJOw7p0IHRydXnhu4FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iTsO6dCB0cnV54buBbi4gxJDDoyBuZ+G6r3Qga+G6v3QgbuG7kWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Ik7DunQgdHJ1eeG7gW4uIMSQYW5nIGvhur90IG7hu5FpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Ik7DunQgdHJ1eeG7gW4uIMSQw6Mga+G6v3QgbuG7kWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJ1eeG7gW4gdOG7m2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLEkGFuZyB0w6xtIHRoaeG6v3QgYuG7iyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJOZ+G6r3Qga+G6v3QgbuG7kWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJE4burbmcgdHJ1eeG7gW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IsSQw7NuZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlBow6F0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJU4bqhbSBk4burbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJE4burbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJN4bufIHLhu5luZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iVGh1IGfhu41uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4bqibmggYsOsYSBhbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJUaGFuaCB0csaw4bujdCDDom0gbMaw4bujbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Iktow7RuZyBjw7MgcGjGsMahbmcgdGnhu4duIG7DoG8gxJHGsOG7o2MgY2jhu41uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJLaMO0bmcgY8OzIHRow7RuZyB0aW4gbsOgbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4ixJBhbmcgdHJ1eeG7gW4gbcOgbiBow6xuaCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTIyZDAxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLns7vnu58iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i6K6+5aSHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i5oqV5bCE5oyJ6ZKuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i5oqV5bCE5oyJ6ZKu44CC5bey5pat5byA6L+e5o6lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLmipXlsITmjInpkq7jgILmraPlnKjov57mjqUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i5oqV5bCE5oyJ6ZKu44CC5bey6L+e5o6lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuaKleWwhOWIsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Iuato+WcqOafpeaJvuiuvuWkhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLmlq3lvIDov57mjqUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLlgZzmraLmipXlsIQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuWFs+mXrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuaSreaUviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i5pqC5YGcIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i5YGc5q2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i5bGV5byAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLmlLbotbciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLkuJPovpHlsIHpnaIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i6Z+z6YeP5ruR5Z2XIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLmnKrpgInmi6nku7vkvZXlqpLkvZMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuayoeacieS7u+S9leebuOWFs+S/oeaBryI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i5q2j5Zyo5oqV5bCE5bGP5bmVIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1ySEsvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1ySEsvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NmU1YzIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtckhLL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Iuezu+e1sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLoo53nva4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLmipXmlL7mjInpiJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLmipXmlL7mjInpiJXjgILlt7Lop6PpmaTpgKPmjqUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuaKleaUvuaMiemIleOAguato+WcqOmAo+aOpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLmipXmlL7mjInpiJXjgILlt7LpgKPmjqUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i5oqV5pS+6IezIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i5q2j5Zyo5bCL5om+6KOd572uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuS4reaWt+mAo+e3miI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuWBnOatouaKleaUviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i6Zec6ZaJIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i5pKt5pS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLmmqvlgZwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLlgZzmraIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLlsZXplosiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuaUtuWQiCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuWwiOi8r+WwgemdoiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLpn7Pph4/mu5Hmob8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuWwmuacqumBuOaTh+WqkumrlCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i5rKS5pyJ6Kmz57Sw6LOH5paZIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLmraPlnKjmipXmlL7onqLluZUiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNhZmRlMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i57O757WxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Iuijnee9riI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuaKleaUvuaMiemIlSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuaKleaUvuaMiemIle+8m+W3suS4reaWt+mAo+e3miI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i5oqV5pS+5oyJ6YiV77yb6YCj57ea5LitIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuaKleaUvuaMiemIle+8m+W3sumAo+e3miI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLmipXmlL7liLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLmraPlnKjlsIvmib7oo53nva4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i5Lit5pa36YCj57eaIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i5YGc5q2i5oqV5pS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLpl5zplokiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLmkq3mlL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+Iuaaq+WBnCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuWBnOatoiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuWxlemWiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i5pS25ZCIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i5bCI6Lyv5bCB6Z2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+Iumfs+mHj+a7keahvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i5pyq6YG45Y+W5Lu75L2V5aqS6auUIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLmspLmnInlj6/nlKjnmoTos4foqIoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Iuato+WcqOaKleaUvuieouW5lSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtenUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16dS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEwN2M0My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16dS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJJc2lzdGltdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJBbWFkaXZheWlzaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Iklua2lub2JobyB5ZS1DYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iSW5raW5vYmhvIHlva3VzYWthemEuIEt1bnFhbnl1bGl3ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iSW5raW5vYmhvIHlva3VzYWthemEuIEt1eWF4aHVueXdhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Iklua2lub2JobyB5b2t1c2FrYXphLiBLdXhodW55aXdlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlNha2F6YSBrdS0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJJdGhvbGEgYW1hZGl2YXlpc2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iTnFhbXVsYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Ik1pc2EgdWt1c2FrYXphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJWYWxhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iRGxhbGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+Ik1pc2EgaXNpa2hhc2hhbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJNaXNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iTndlYmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkdvcWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJVYnVjaWtvIGJlLWFsYmhhbXUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iSXNpbGF5aWRhIHNldm9sdW11Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJBeWlraG8gaW1pZGl5YSBla2hldGhpd2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkFsdWtobyB1bHdhemkgb2x1dGhvbGFrYWxheW8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IklzaWtyaW5pIHNva3VzYWthemEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2FycmF5cy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9hcnJheXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTg3MzIwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2FycmF5cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPGludGVnZXItYXJyYXkgbmFtZT0ic3BlZWRfbXVsdGlwbGllZF9ieV8xMDAiPgotICAgICAgICA8aXRlbT4yNTwvaXRlbT4KLSAgICAgICAgPGl0ZW0+NTA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjc1PC9pdGVtPgotICAgICAgICA8aXRlbT4xMDA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjEyNTwvaXRlbT4KLSAgICAgICAgPGl0ZW0+MTUwPC9pdGVtPgotICAgICAgICA8aXRlbT4yMDA8L2l0ZW0+Ci0gICAgPC9pbnRlZ2VyLWFycmF5PgotPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvYXR0cnMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvYXR0cnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzcyODViLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2F0dHJzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLSAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iTWVkaWFSb3V0ZUJ1dHRvbiI+Ci0gICAgICAgIDwhLS0gVGhpcyBkcmF3YWJsZSBpcyBhIHN0YXRlIGxpc3Qgd2hlcmUgdGhlICJjaGVja2VkIiBzdGF0ZQotICAgICAgICAgICAgIGluZGljYXRlcyBhY3RpdmUgbWVkaWEgcm91dGluZy4gIENoZWNrYWJsZSBpbmRpY2F0ZXMgY29ubmVjdGluZwotICAgICAgICAgICAgIGFuZCBub24tY2hlY2tlZCAvIG5vbi1jaGVja2FibGUgaW5kaWNhdGVzCi0gICAgICAgICAgICAgdGhhdCBtZWRpYSBpcyBwbGF5aW5nIHRvIHRoZSBsb2NhbCBkZXZpY2Ugb25seS4gLS0+Ci0gICAgICAgIDxhdHRyIG5hbWU9ImV4dGVybmFsUm91dGVFbmFibGVkRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgICAgICA8IS0tIFRpbnQgdG8gYXBwbHkgdG8gdGhlIG1lZGlhIHJvdXRlIGJ1dHRvbiAtLT4KLSAgICAgICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZUJ1dHRvblRpbnQiIGZvcm1hdD0iY29sb3IiIC8+Ci0KLSAgICAgICAgPGF0dHIgbmFtZT0iYW5kcm9pZDptaW5XaWR0aCIgLz4KLSAgICAgICAgPGF0dHIgbmFtZT0iYW5kcm9pZDptaW5IZWlnaHQiIC8+Ci0gICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KLQotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVCdXR0b25TdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZUNsb3NlRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVQbGF5RHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVQYXVzZURyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlU3RvcERyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlRGVmYXVsdEljb25EcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZVR2SWNvbkRyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlU3BlYWtlckljb25EcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZVNwZWFrZXJHcm91cEljb25EcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlVGhlbWUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9jb2xvcnMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvY29sb3JzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdiYzI5OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9jb2xvcnMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cmVzb3VyY2VzPgotICAgIDxjb2xvciBuYW1lPSJncmF5Ij4jODA4MDgwPC9jb2xvcj4KLSAgICA8Y29sb3IgbmFtZT0id2hpdGUiPiNmZmZmZmY8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJ3aGl0ZV9vcGFjaXR5XzcwIj4jQjNmZmZmZmY8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJibGFja19vcGFjaXR5XzcwIj4jQjMwMDAwMDA8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJ0aXRsZV9iYXJfZ3JhZGllbnRfc3RhcnQiPiM1MDAwMDAwMDwvY29sb3I+Ci0gICAgPGNvbG9yIG5hbWU9InRpdGxlX2Jhcl9ncmFkaWVudF9lbmQiPiMwMDAwMDAwMDwvY29sb3I+Ci0gICAgPGNvbG9yIG5hbWU9ImJvdHRvbV9iYXJfYmFja2dyb3VuZCI+IzQwMjAyMDIwPC9jb2xvcj4KLTwvcmVzb3VyY2VzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2RpbWVucy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9kaW1lbnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDdiMDIyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2RpbWVucy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPCEtLSBEaWFsb2cgc2l6ZSAtLT4KLSAgICA8ZWF0LWNvbW1lbnQgLz4KLSAgICA8IS0tIFRoZSBwbGF0Zm9ybSdzIGRlc2lyZWQgZml4ZWQgd2lkdGggZm9yIGEgZGlhbG9nIGFsb25nIHRoZSBtYWpvciBheGlzCi0gICAgICAgICAodGhlIHNjcmVlbiBpcyBpbiBsYW5kc2NhcGUpLiBUaGlzIG1heSBiZSBlaXRoZXIgYSBmcmFjdGlvbiBvciBhIGRpbWVuc2lvbi4tLT4KLSAgICA8ZGltZW4gbmFtZT0ibXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21ham9yIj4zMjBkcDwvZGltZW4+Ci0gICAgPCEtLSBUaGUgcGxhdGZvcm0ncyBkZXNpcmVkIGZpeGVkIHdpZHRoIGZvciBhIGRpYWxvZyBhbG9uZyB0aGUgbWlub3IgYXhpcwotICAgICAgICAgKHRoZSBzY3JlZW4gaXMgaW4gcG9ydHJhaXQpLiBUaGlzIG1heSBiZSBlaXRoZXIgYSBmcmFjdGlvbiBvciBhIGRpbWVuc2lvbi4tLT4KLSAgICA8ZGltZW4gbmFtZT0ibXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21pbm9yIj4zMjBkcDwvZGltZW4+Ci0KLSAgICA8IS0tIE1lZGlhUm91dGVDb250cm9sbGVyJ3Mgdm9sdW1lIGdyb3VwIGxpc3QgLS0+Ci0gICAgPGVhdC1jb21tZW50IC8+Ci0gICAgPCEtLSBNYXhpbXVtIGhlaWdodCBvZiB2b2x1bWUgZ3JvdXAgbGlzdC4gLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfbWF4X2hlaWdodCI+Mjg4ZHA8L2RpbWVuPgotICAgIDwhLS0gSGVpZ2h0IG9mIHZvbHVtZSBncm91cCBpdGVtLiAtLT4KLSAgICA8ZGltZW4gbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2hlaWdodCI+NjhkcDwvZGltZW4+Ci0gICAgPCEtLSBTaXplIG9mIGFuIGl0ZW0ncyBpY29uLiAtLT4KLSAgICA8ZGltZW4gbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2ljb25fc2l6ZSI+MjRkcDwvZGltZW4+Ci0KLSAgICA8ZGltZW4gbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9wYWRkaW5nX3RvcCI+MTZkcDwvZGltZW4+Ci0gICAgPCEtLSBHcm91cCBsaXN0IGV4cGFuZC9jb2xsYXBzZSBhbmltYXRpb24gZHVyYXRpb24uIC0tPgotICAgIDxpbnRlZ2VyIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfYW5pbWF0aW9uX2R1cmF0aW9uX21zIj40MDA8L2ludGVnZXI+Ci0gICAgPCEtLSBHcm91cCBsaXN0IGZhZGUgaW4gYW5pbWF0aW9uIGR1cmF0aW9uLiAtLT4KLSAgICA8aW50ZWdlciBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2ZhZGVfaW5fZHVyYXRpb25fbXMiPjQwMDwvaW50ZWdlcj4KLSAgICA8IS0tIEdyb3VwIGxpc3QgZmFkZSBvdXQgYW5pbWF0aW9uIGR1cmF0aW9uLiAtLT4KLSAgICA8aW50ZWdlciBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2ZhZGVfb3V0X2R1cmF0aW9uX21zIj4yMDA8L2ludGVnZXI+Ci0KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9lbWJlZGRlZF9zZXR0aW5nc193aWR0aCI+MTUwZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCI+MzZkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaWNvbl9zaXplIj4yMGRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9lbWJlZGRlZF9zZXR0aW5nc190ZXh0X2hlaWdodCI+MThkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZW1iZWRkZWRfc2V0dGluZ3NfbWFpbl90ZXh0X3NpemUiPjEyc3A8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2VtYmVkZGVkX3NldHRpbmdzX3N1Yl90ZXh0X3NpemUiPjEwc3A8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfc2V0dGluZ3Nfd2lkdGgiPjIyNWRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX3NldHRpbmdzX2hlaWdodCI+NTRkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZnVsbF9zZXR0aW5nc19pY29uX3NpemUiPjMwZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfc2V0dGluZ3NfdGV4dF9oZWlnaHQiPjI3ZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfc2V0dGluZ3NfbWFpbl90ZXh0X3NpemUiPjE2c3A8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfc2V0dGluZ3Nfc3ViX3RleHRfc2l6ZSI+MTNzcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfc2V0dGluZ3Nfb2Zmc2V0Ij44ZHA8L2RpbWVuPgotCi0gICAgPGRpbWVuIG5hbWU9Im1jdjJfdHJhbnNwb3J0X2NvbnRyb2xzX3BhZGRpbmciPjRkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfcGF1c2VfaWNvbl9zaXplIj4zNmRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX2ljb25fc2l6ZSI+MjhkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZW1iZWRkZWRfaWNvbl9zaXplIj4yNGRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9taW5pbWFsX2ljb25fc2l6ZSI+MjRkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfaWNvbl9tYXJnaW4iPjEwZHA8L2RpbWVuPgotCi0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZnVsbF9hbGJ1bV9pbWFnZV9wb3J0cmFpdF9zaXplIj4yMzJkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZnVsbF9hbGJ1bV9pbWFnZV9sYW5kc2NhcGVfc2l6ZSI+MTc2ZHA8L2RpbWVuPgotCi0gICAgPGRpbWVuIG5hbWU9Im1jdjJfY3VzdG9tX3Byb2dyZXNzX21heF9zaXplIj4yZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2N1c3RvbV9wcm9ncmVzc190aHVtYl9zaXplIj4xMmRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9idWZmZXJfdmlld19oZWlnaHQiPjVkcDwvZGltZW4+Ci0gICAgPCEtLSBUT0RPOiBhZGp1c3QgYm90dG9tIGJhciB2aWV3IC0tPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTk3YTNiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotCi0gICAgPCEtLSBOYW1lIGZvciB0aGUgZGVmYXVsdCBzeXN0ZW0gcm91dGUgcHJpb3IgdG8gSmVsbHliZWFuLiBbQ0hBUiBMSU1JVD0zMF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSI+U3lzdGVtPC9zdHJpbmc+Ci0KLSAgICA8IS0tIE5hbWUgZm9yIHRoZSB1c2VyIHJvdXRlIGNhdGVnb3J5IGNyZWF0ZWQgd2hlbiBwdWJsaXNoaW5nIHJvdXRlcyB0byB0aGUgc3lzdGVtIGluIEplbGx5YmVhbiBhbmQgYWJvdmUuIFtDSEFSIExJTUlUPTMwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSI+RGV2aWNlczwvc3RyaW5nPgotCi0gICAgPCEtLSBTdHJpbmcgdG8gYmUgc2hvd24gYXMgYSB0b29sdGlwIG9mIE1lZGlhUm91dGVCdXR0b24KLSAgICAgICAgQ2FzdCBpcyB0aGUgc3RhbmRhcmQgYW5kcm9pZCB2ZXJiIGZvciBzZW5kaW5nIGNvbnRlbnQgdG8gYSByZW1vdGUgZGV2aWNlLiBbQ0hBUiBMSU1JVD01MF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiI+Q2FzdCBidXR0b248L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBvZiBhIE1lZGlhUm91dGVCdXR0b24gZm9yIGFjY2Vzc2liaWxpdHkgc3VwcG9ydCB3aGVuIG5vIHJlbW90ZSBkZXZpY2UgaXMgY29ubmVjdGVkLgotICAgICAgICBDYXN0IGlzIHRoZSBzdGFuZGFyZCBhbmRyb2lkIHZlcmIgZm9yIHNlbmRpbmcgY29udGVudCB0byBhIHJlbW90ZSBkZXZpY2UuIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIj5DYXN0IGJ1dHRvbi4gRGlzY29ubmVjdGVkPC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gb2YgYSBNZWRpYVJvdXRlQnV0dG9uIGZvciBhY2Nlc3NpYmlsaXR5IHN1cHBvcnQgd2hpbGUgY29ubmVjdGluZyB0byBhIHJlbW90ZSBkZXZpY2UuCi0gICAgICAgIENhc3QgaXMgdGhlIHN0YW5kYXJkIGFuZHJvaWQgdmVyYiBmb3Igc2VuZGluZyBjb250ZW50IHRvIGEgcmVtb3RlIGRldmljZS4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIj5DYXN0IGJ1dHRvbi4gQ29ubmVjdGluZzwvc3RyaW5nPgotCi0gICAgPCEtLSBDb250ZW50IGRlc2NyaXB0aW9uIG9mIGEgTWVkaWFSb3V0ZUJ1dHRvbiBmb3IgYWNjZXNzaWJpbGl0eSBzdXBwb3J0IHdoZW4gYSByZW1vdGUgZGV2aWNlIGlzIGNvbm5lY3RlZC4KLSAgICAgICAgQ2FzdCBpcyB0aGUgc3RhbmRhcmQgYW5kcm9pZCB2ZXJiIGZvciBzZW5kaW5nIGNvbnRlbnQgdG8gYSByZW1vdGUgZGV2aWNlLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCI+Q2FzdCBidXR0b24uIENvbm5lY3RlZDwvc3RyaW5nPgotCi0gICAgPCEtLSBUaXRsZSBvZiB0aGUgbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cuIFtDSEFSIExJTUlUPTMwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiPkNhc3QgdG88L3N0cmluZz4KLQotICAgIDwhLS0gUGxhY2Vob2xkZXIgdGV4dCB0byBzaG93IHdoZW4gbm8gZGV2aWNlcyBoYXZlIGJlZW4gZm91bmQuIFtDSEFSIExJTUlUPTUwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIj5GaW5kaW5nIGRldmljZXM8L3N0cmluZz4KLQotICAgIDwhLS0gQnV0dG9uIHRvIGRpc2Nvbm5lY3QgZnJvbSBhIG1lZGlhIHJvdXRlLiAgW0NIQVIgTElNSVQ9MzBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0Ij5EaXNjb25uZWN0PC9zdHJpbmc+Ci0KLSAgICA8IS0tIEJ1dHRvbiB0byBzdG9wIHBsYXliYWNrIGFuZCBkaXNjb25uZWN0IGZyb20gYSBtZWRpYSByb3V0ZS4gW0NIQVIgTElNSVQ9MzBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciPlN0b3AgY2FzdGluZzwvc3RyaW5nPgotCi0gICAgPCEtLSBDb250ZW50IGRlc2NyaXB0aW9uIGZvciBhY2Nlc3NpYmlsaXR5IChub3Qgc2hvd24gb24gdGhlIHNjcmVlbik6IGRpYWxvZyBjbG9zZSBidXR0b24uIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiI+Q2xvc2U8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBtZWRpYSBwbGF5IGJ1dHRvbi4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiPlBsYXk8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBtZWRpYSBwYXVzZSBidXR0b24uIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSI+UGF1c2U8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBtZWRpYSBzdG9wIGJ1dHRvbi4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiPlN0b3A8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBncm91cCBleHBhbmQgYnV0dG9uLiBQcmVzc2luZyBidXR0b24gc2hvd3MgZ3JvdXAgbWVtYmVycyBvZiBhIHNlbGVjdGVkIHJvdXRlIGdyb3VwLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIj5FeHBhbmQ8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBncm91cCBjb2xsYXBzZSBidXR0b24uIFByZXNzaW5nIGJ1dHRvbiBoaWRlcyBncm91cCBtZW1iZXJzIG9mIGEgc2VsZWN0ZWQgcm91dGUgZ3JvdXAuIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCI+Q29sbGFwc2U8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBhbGJ1bSBhcnQgYnV0dG9uLiBDbGlja2luZyBvbiB0aGUgYWxidW0gYXJ0IHRha2VzIHVzZXIgdG8gYSBwcmVkZWZpbmVkIGFjdGl2aXR5IHBlciBtZWRpYSBhcHAuIFtDSEFSIExJTUlUPTUwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0Ij5BbGJ1bSBhcnQ8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiB2b2x1bWUgc2xpZGVyLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciI+Vm9sdW1lIHNsaWRlcjwvc3RyaW5nPgotCi0gICAgPCEtLSBQbGFjZWhvbGRlciB0ZXh0IHRvIHNob3cgd2hlbiBubyBtZWRpYSBoYXZlIGJlZW4gc2VsZWN0ZWQgZm9yIHBsYXliYWNrLiBbQ0hBUiBMSU1JVD01MF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIj5ObyBtZWRpYSBzZWxlY3RlZDwvc3RyaW5nPgotCi0gICAgPCEtLSBQbGFjZWhvbGRlciB0ZXh0IHRvIHNob3cgd2hlbiBubyB0aXRsZS9kZXNjcmlwdGlvbiBoYXZlIGJlZW4gZm91bmQgZm9yIGEgZ2l2ZW4gc29uZy92aWRlby4gW0NIQVIgTElNSVQ9NTBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSI+Tm8gaW5mbyBhdmFpbGFibGU8L3N0cmluZz4KLQotICAgIDwhLS0gUGxhY2Vob2xkZXIgdGV4dCBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXIgaXMgY3VycmVudGx5IGNhc3Rpbmcgc2NyZWVuLiBbQ0hBUiBMSU1JVD01MF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIj5DYXN0aW5nIHNjcmVlbjwvc3RyaW5nPgotCi0gICAgPCEtLSBUZXh0IGZvciBlcnJvciBhbGVydCB3aGVuIGEgdmlkZW8gY29udGFpbmVyIGlzIG5vdCB2YWxpZCBmb3IgcHJvZ3Jlc3NpdmUgZG93bmxvYWQvcGxheWJhY2suIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iVmlkZW9WaWV3Ml9lcnJvcl90ZXh0X2ludmFsaWRfcHJvZ3Jlc3NpdmVfcGxheWJhY2siPlRoaXMgdmlkZW8gaXNuXCd0IHZhbGlkIGZvciBzdHJlYW1pbmcgdG8gdGhpcyBkZXZpY2UuPC9zdHJpbmc+Ci0gICAgPCEtLSBUZXh0IGZvciBlcnJvciBhbGVydCB3aGVuIGEgdmlkZW8gY2Fubm90IGJlIHBsYXllZC4gSXQgY2FuIGJlIHVzZWQgYnkgYW55IGFwcC4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJWaWRlb1ZpZXcyX2Vycm9yX3RleHRfdW5rbm93biI+Q2FuXCd0IHBsYXkgdGhpcyB2aWRlby48L3N0cmluZz4KLSAgICA8IS0tIEJ1dHRvbiB0byBjbG9zZSBlcnJvciBhbGVydCB3aGVuIGEgdmlkZW8gY2Fubm90IGJlIHBsYXllZC4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJWaWRlb1ZpZXcyX2Vycm9yX2J1dHRvbiI+T0s8L3N0cmluZz4KLQotICAgIDwhLS0gVGV4dCBmb3IgZGlzcGxheWluZyBhZCBza2lwIHdhaXQgdGltZS4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9hZF9za2lwX3dhaXRfdGltZSI+Ci0gICAgICAgIFlvdSBjYW4gc2tpcCBBZCBpbiA8eGxpZmY6ZyBpZD0id2FpdF90aW1lIiBleGFtcGxlPSI1Ij4lMSRkPC94bGlmZjpnPnMKLSAgICA8L3N0cmluZz4KLSAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgYWQgdG90YWwgcmVtYWluaW5nIHRpbWUuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfYWRfcmVtYWluaW5nX3RpbWUiPgotICAgICAgICBBZCDCtyA8eGxpZmY6ZyBpZD0icmVtYWluaW5nX3RpbWUiIGV4YW1wbGU9IjE6MTUiPiUxJHM8L3hsaWZmOmc+IHJlbWFpbmluZwotICAgIDwvc3RyaW5nPgotICAgIDwhLS0gUGxhY2Vob2xkZXIgdGV4dCBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXIgY2FuIHByZXNzIHRoZSBidXR0b24gdG8gZ28gdG8gYW4gZXh0ZXJuYWwgd2Vic2l0ZS4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9hZF90ZXh0Ij5WaXNpdCBBZHZlcnRpc2VyPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9zdWJ0aXRsZV90ZXh0Ij5DbG9zZWQgY2FwdGlvbjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfc3VidGl0bGVfb2ZmX3RleHQiPk9mZjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfYXVkaW9fdHJhY2tfdGV4dCI+QXVkaW8gdHJhY2s8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX25vbmVfdGV4dCI+Tm9uZTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfdmlkZW9fcXVhbGl0eV90ZXh0Ij5WaWRlbyBxdWFsaXR5PC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml92aWRlb19xdWFsaXR5X2F1dG9fdGV4dCI+QXV0bzwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfaGVscF90ZXh0Ij5IZWxwICZhbXA7IGZlZWRiYWNrPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9wbGF5YmFja19zcGVlZF90ZXh0Ij5QbGF5YmFjayBzcGVlZDwvc3RyaW5nPgotICAgIDxzdHJpbmctYXJyYXkgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfcGxheWJhY2tfc3BlZWRzIj4KLSAgICAgICAgPGl0ZW0+MC4yNXg8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjAuNXg8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjAuNzV4PC9pdGVtPgotICAgICAgICA8aXRlbT5Ob3JtYWw8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjEuMjV4PC9pdGVtPgotICAgICAgICA8aXRlbT4xLjV4PC9pdGVtPgotICAgICAgICA8aXRlbT4yeDwvaXRlbT4KLSAgICA8L3N0cmluZy1hcnJheT4KLSAgICA8IS0tIFBsYWNlaG9sZGVyIHRleHQgZm9yIGRpc3BsYXlpbmcgdGltZS4gVXNlZCB0byBjYWxjdWxhdGUgd2hpY2ggc2l6ZSBsYXlvdXQgdG8gdXNlLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX3RpbWVfcGxhY2Vob2xkZXIiPjAwOjAwOjAwPC9zdHJpbmc+Ci0KLSAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgc3VidGl0bGUgdHJhY2sgbnVtYmVyLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX3N1YnRpdGxlX3RyYWNrX251bWJlcl90ZXh0Ij4KLSAgICAgICAgVHJhY2sgPHhsaWZmOmcgaWQ9InRyYWNrX251bWJlciIgZXhhbXBsZT0iMSI+JTEkczwveGxpZmY6Zz4KLSAgICA8L3N0cmluZz4KLSAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgYXVkaW8gdHJhY2sgbnVtYmVyLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX251bWJlcl90ZXh0Ij4KLSAgICAgICAgVHJhY2sgPHhsaWZmOmcgaWQ9ImF1ZGlvX251bWJlciIgZXhhbXBsZT0iMSI+JTEkczwveGxpZmY6Zz4KLSAgICA8L3N0cmluZz4KLSAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgdW5rbm93biBzb25nIHRpdGxlLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfbXVzaWNfdGl0bGVfdW5rbm93bl90ZXh0Ij5Tb25nIHRpdGxlIHVua25vd248L3N0cmluZz4KLSAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgdW5rbm93biBhcnRpc3QgbmFtZS4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX211c2ljX2FydGlzdF91bmtub3duX3RleHQiPkFydGlzdCB1bmtub3duPC9zdHJpbmc+Ci0KLSAgICA8IS0tQ29udGVudCBEZXNjcmlwdGlvbnMgLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX2JhY2tfYnV0dG9uX2Rlc2MiPkJhY2s8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfb3ZlcmZsb3dfbGVmdF9idXR0b25fZGVzYyI+U2VlIG1vcmUgYnV0dG9uczwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9vdmVyZmxvd19yaWdodF9idXR0b25fZGVzYyI+QmFjayB0byBwcmV2aW91cyBidXR0b24gbGlzdDwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9zZWVrX2Jhcl9kZXNjIj5QbGF5YmFjayBwcm9ncmVzczwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9zZXR0aW5nc19idXR0b25fZGVzYyI+U2V0dGluZ3M8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfdmlkZW9fcXVhbGl0eV9idXR0b25fZGVzYyI+VmlkZW8gUXVhbGl0eSBTZWxlY3Rpb248L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfY2NfaXNfb24iPlN1YnRpdGxlIGlzIG9uLiBDbGljayB0byBoaWRlIGl0Ljwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9jY19pc19vZmYiPlN1YnRpdGxlIGlzIG9mZi4gQ2xpY2sgdG8gc2hvdyBpdC48L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfcmVwbGF5X2J1dHRvbl9kZXNjIj5SZXBsYXk8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfcGxheV9idXR0b25fZGVzYyI+UGxheTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9wYXVzZV9idXR0b25fZGVzYyI+UGF1c2U8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfcHJldmlvdXNfYnV0dG9uX2Rlc2MiPlByZXZpb3VzIG1lZGlhPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX25leHRfYnV0dG9uX2Rlc2MiPk5leHQgbWVkaWE8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfcmV3aW5kX2J1dHRvbl9kZXNjIj5SZXdpbmQgYnkgMTAgc2Vjb25kczwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9mZndkX2J1dHRvbl9kZXNjIj5HbyBmb3J3YXJkIGJ5IDMwIHNlY29uZHM8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfbGF1bmNoX2J1dHRvbl9kZXNjIj5MYXVuY2ggTGluazwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9tdXRlZF9idXR0b25fZGVzYyI+TXV0ZWQuIENsaWNrIHRvIHVubXV0ZTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml91bm11dGVkX2J1dHRvbl9kZXNjIj5DbGljayB0byBNdXRlPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX2Z1bGxfc2NyZWVuX2J1dHRvbl9kZXNjIj5GdWxsIHNjcmVlbjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHlsZS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHlsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOWE4ZWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3R5bGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08cmVzb3VyY2VzPgotICAgIDxzdHlsZSBuYW1lPSJGdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24iPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBudWxsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9tYXJnaW4iPkBkaW1lbi9tY3YyX2ljb25fbWFyZ2luPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNjYWxlVHlwZSI+Zml0WFk8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUHJldmlvdXMiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3NraXBfcHJldmlvdXM8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9wcmV2aW91c19idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkZ1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5OZXh0Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19za2lwX25leHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9uZXh0X2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlBhdXNlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19wYXVzZV9jaXJjbGVfZmlsbGVkPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfcGF1c2VfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX3BhdXNlX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9wYXVzZV9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkZ1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5GZndkIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19mb3J3YXJkXzMwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZnVsbF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfZnVsbF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfZmZ3ZF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkZ1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5SZXciPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3Jld2luZF8xMDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX2Z1bGxfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2Z1bGxfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3Jld2luZF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkVtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24iPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBudWxsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9tYXJnaW4iPkBkaW1lbi9tY3YyX2ljb25fbWFyZ2luPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNjYWxlVHlwZSI+Zml0WFk8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJFbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlByZXZpb3VzIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19za2lwX3ByZXZpb3VzPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9wcmV2aW91c19idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkVtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uTmV4dCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfc2tpcF9uZXh0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9uZXh0X2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QYXVzZSI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX3BhdXNlX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9wYXVzZV9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfcGF1c2VfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJFbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLkZmd2QiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2ZvcndhcmRfMzA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9lbWJlZGRlZF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX2Zmd2RfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJFbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlJldyI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfcmV3aW5kXzEwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9yZXdpbmRfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJNaW5pbWFsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24iPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBudWxsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfcGF1c2VfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX3BhdXNlX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfbWFyZ2luIj5AZGltZW4vbWN2Ml9pY29uX21hcmdpbjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzY2FsZVR5cGUiPmZpdFhZPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3BhdXNlX2NpcmNsZV9maWxsZWQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfcGF1c2VfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaXRsZUJhciI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5tYXRjaF9wYXJlbnQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+NDZkcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nU3RhcnQiPjVkcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nRW5kIj41ZHA8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaXRsZUJhckJ1dHRvbiI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QG51bGw8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj4zNmRwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPjM2ZHA8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaXRsZUJhckJ1dHRvbi5CYWNrIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19hcnJvd19iYWNrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX2JhY2tfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaXRsZUJhckJ1dHRvbi5MYXVuY2giPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2xhdW5jaDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9sYXVuY2hfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaW1lVGV4dCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj53cmFwX2NvbnRlbnQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+d3JhcF9jb250ZW50PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdTdGFydCI+NGRwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdFbmQiPjRkcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPmJvbGQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE0c3A8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+Y2VudGVyPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGltZVRleHQuQ3VycmVudCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AY29sb3Ivd2hpdGU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dCI+QHN0cmluZy9NZWRpYUNvbnRyb2xWaWV3Ml90aW1lX3BsYWNlaG9sZGVyPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGltZVRleHQuSW50ZXJwdW5jdCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AY29sb3Ivd2hpdGVfb3BhY2l0eV83MDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Ij7CtzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRpbWVUZXh0LkVuZCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AY29sb3Ivd2hpdGVfb3BhY2l0eV83MDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Ij5Ac3RyaW5nL01lZGlhQ29udHJvbFZpZXcyX3RpbWVfcGxhY2Vob2xkZXI8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJCb3R0b21CYXJCdXR0b24iPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBudWxsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfbWFyZ2luIj5AZGltZW4vbWN2Ml9pY29uX21hcmdpbjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpncmF2aXR5Ij5jZW50ZXJfaG9yaXpvbnRhbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzY2FsZVR5cGUiPmZpdFhZPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iQm90dG9tQmFyQnV0dG9uLkNDIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19zdWJ0aXRsZV9vZmY8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfY2NfaXNfb2ZmPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iQm90dG9tQmFyQnV0dG9uLkZ1bGxTY3JlZW4iPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2Z1bGxzY3JlZW48L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfZnVsbF9zY3JlZW5fYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJCb3R0b21CYXJCdXR0b24uT3ZlcmZsb3dSaWdodCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfY2hldnJvbl9yaWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9vdmVyZmxvd19yaWdodF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbi5PdmVyZmxvd0xlZnQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2NoZXZyb25fbGVmdDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9vdmVyZmxvd19sZWZ0X2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iQm90dG9tQmFyQnV0dG9uLlNldHRpbmdzIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19zZXR0aW5nczwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9zZXR0aW5nc19idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbi5NdXRlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY191bm11dGU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfdW5tdXRlZF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbi5WaWRlb1F1YWxpdHkiPgotICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19oaWdoX3F1YWxpdHk8L2l0ZW0+Ci0gICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3ZpZGVvX3F1YWxpdHlfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsTXVzaWNQb3J0cmFpdCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+MGRwPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbE11c2ljUG9ydHJhaXQuSW1hZ2UiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+bWF0Y2hfcGFyZW50PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93ZWlnaHQiPjAuNjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpncmF2aXR5Ij5jZW50ZXI8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsTXVzaWNQb3J0cmFpdC5UZXh0Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPm1hdGNoX3BhcmVudDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2VpZ2h0Ij4wLjQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+dG9wfGNlbnRlcjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpvcmllbnRhdGlvbiI+dmVydGljYWw8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsTXVzaWNMYW5kc2NhcGUiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+MGRwPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbE11c2ljTGFuZHNjYXBlLkltYWdlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5tYXRjaF9wYXJlbnQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dlaWdodCI+MC4zNTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpncmF2aXR5Ij5jZW50ZXJ8cmlnaHQ8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsTXVzaWNMYW5kc2NhcGUuVGV4dCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+bWF0Y2hfcGFyZW50PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93ZWlnaHQiPjAuNjU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQiPjI0ZHA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+Y2VudGVyfGxlZnQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6b3JpZW50YXRpb24iPnZlcnRpY2FsPC9pdGVtPgotICAgIDwvc3R5bGU+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0eWxlcy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGU2OTAwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0eWxlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPHN0eWxlIG5hbWU9IldpZGdldC5NZWRpYVJvdXRlci5NZWRpYVJvdXRlQnV0dG9uIgotICAgICAgICAgICAgcGFyZW50PSJXaWRnZXQuQXBwQ29tcGF0LkFjdGlvbkJ1dHRvbiI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImV4dGVybmFsUm91dGVFbmFibGVkRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9idXR0b25fZGFyazwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IldpZGdldC5NZWRpYVJvdXRlci5MaWdodC5NZWRpYVJvdXRlQnV0dG9uIgotICAgICAgICAgICAgcGFyZW50PSJXaWRnZXQuQXBwQ29tcGF0LkxpZ2h0LkFjdGlvbkJ1dHRvbiI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImV4dGVybmFsUm91dGVFbmFibGVkRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9idXR0b25fbGlnaHQ8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5UaXRsZSIgcGFyZW50PSJUZXh0QXBwZWFyYW5jZS5BcHBDb21wYXQuVGl0bGUiIC8+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuUHJpbWFyeVRleHQiIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UuQXBwQ29tcGF0LlN1YmhlYWQiIC8+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuU2Vjb25kYXJ5VGV4dCIgcGFyZW50PSJUZXh0QXBwZWFyYW5jZS5BcHBDb21wYXQuQm9keTEiIC8+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N5bWJvbHMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3ltYm9scy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMGU4YzYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3ltYm9scy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotLyogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0tLT4KLTxyZXNvdXJjZXM+Ci0gICAgPCEtLWphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJjYyIgLz4KLSAgICA8amF2YS1zeW1ib2wgdHlwZT0iaWQiIG5hbWU9ImZmd2QiIC8+Ci0gICAgPGphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJtZWRpYWNvbnRyb2xsZXJfcHJvZ3Jlc3MiIC8+Ci0gICAgPGphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJuZXh0IiAvPgotICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0icGF1c2UiIC8+Ci0gICAgPGphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJwcmV2IiAvPgotICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0icmV3IiAvPgotICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0idGltZSIgLz4KLSAgICA8amF2YS1zeW1ib2wgdHlwZT0iaWQiIG5hbWU9InRpbWVfY3VycmVudCIgLy0tPgotPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvdGhlbWVzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3RoZW1lcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YTc1NGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvdGhlbWVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLQotICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5NZWRpYVJvdXRlciIgcGFyZW50PSJhbmRyb2lkOlRoZW1lLk1hdGVyaWFsIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dOb1RpdGxlIj50cnVlPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQnV0dG9uU3R5bGUiPkBzdHlsZS9XaWRnZXQuTWVkaWFSb3V0ZXIuTWVkaWFSb3V0ZUJ1dHRvbjwvaXRlbT4KLQotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQ2xvc2VEcmF3YWJsZSI+QGRyYXdhYmxlL21yX2RpYWxvZ19jbG9zZV9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlUGxheURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGxheV9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlUGF1c2VEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3BhdXNlX2Rhcms8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVTdG9wRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2Rhcms8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVBdWRpb1RyYWNrRHJhd2FibGUiPkBkcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2Rhcms8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVEZWZhdWx0SWNvbkRyYXdhYmxlIj5AZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlVHZJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY192b2xfdHlwZV90dl9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlU3BlYWtlckljb25EcmF3YWJsZSI+QGRyYXdhYmxlL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVNwZWFrZXJHcm91cEljb25EcmF3YWJsZSI+QGRyYXdhYmxlL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyazwvaXRlbT4KLQotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQ29udHJvbFBhbmVsVGhlbWVPdmVybGF5Ij5AbnVsbDwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRoZW1lLk1lZGlhUm91dGVyLkxpZ2h0Q29udHJvbFBhbmVsIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSI+QHN0eWxlL1RoZW1lT3ZlcmxheS5NZWRpYVJvdXRlci5MaWdodDwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRoZW1lLk1lZGlhUm91dGVyLkxpZ2h0IiBwYXJlbnQ9ImFuZHJvaWQ6VGhlbWUuTWF0ZXJpYWwuTGlnaHQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd05vVGl0bGUiPnRydWU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVCdXR0b25TdHlsZSI+QHN0eWxlL1dpZGdldC5NZWRpYVJvdXRlci5MaWdodC5NZWRpYVJvdXRlQnV0dG9uPC9pdGVtPgotCi0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVDbG9zZURyYXdhYmxlIj5AZHJhd2FibGUvbXJfZGlhbG9nX2Nsb3NlX2xpZ2h0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlUGxheURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGxheV9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBhdXNlRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVN0b3BEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3N0b3BfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVBdWRpb1RyYWNrRHJhd2FibGUiPkBkcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2xpZ2h0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlRGVmYXVsdEljb25EcmF3YWJsZSI+QGRyYXdhYmxlL2ljX21yX2J1dHRvbl9ncmV5PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlVHZJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY192b2xfdHlwZV90dl9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVNwZWFrZXJJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlU3BlYWtlckdyb3VwSWNvbkRyYXdhYmxlIj5AZHJhd2FibGUvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodDwvaXRlbT4KLQotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQ29udHJvbFBhbmVsVGhlbWVPdmVybGF5Ij5AbnVsbDwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRoZW1lLk1lZGlhUm91dGVyLkxpZ2h0LkRhcmtDb250cm9sUGFuZWwiPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQ29udHJvbFBhbmVsVGhlbWVPdmVybGF5Ij5Ac3R5bGUvVGhlbWVPdmVybGF5Lk1lZGlhUm91dGVyLkRhcms8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaGVtZU92ZXJsYXkuTWVkaWFSb3V0ZXIuRGFyayIgcGFyZW50PSJhbmRyb2lkOlRoZW1lLk1hdGVyaWFsIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBsYXlEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3BsYXlfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBhdXNlRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlU3RvcERyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIj5AZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19kYXJrPC9pdGVtPgotCi0gICAgPC9zdHlsZT4KLSAgICA8c3R5bGUgbmFtZT0iVGhlbWVPdmVybGF5Lk1lZGlhUm91dGVyLkxpZ2h0IiBwYXJlbnQ9ImFuZHJvaWQ6VGhlbWUuTWF0ZXJpYWwuTGlnaHQiPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlUGxheURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGxheV9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBhdXNlRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVN0b3BEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3N0b3BfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVBdWRpb1RyYWNrRHJhd2FibGUiPkBkcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2xpZ2h0PC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3J1bmN0cy5zaCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9ydW5jdHMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYjFhMWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3J1bmN0cy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0jIS9iaW4vYmFzaAotIyBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIFVzYWdlICcuIHJ1bmN0cy5zaCcKLQotZnVuY3Rpb24gX3J1bnRlc3RfY3RzX21lZGlhY29tcG9uZW50X3VzYWdlKCkgewotICBlY2hvICdydW50ZXN0LWN0cy1NZWRpYUNvbXBvbmVudHMgW29wdGlvbl06IEJ1aWxkLCBmbGFzaCBkZXZpY2UsJwotICBlY2hvICcgICAgICAgICAgICAgIGFuZCBydW4gc3Vic2V0IG9mIEN0c01lZGlhVGVzdENhc2VzIHRoYXQgTWVkaWFDb21wb25lbnRzIGNvdmVycy4nCi0gIGVjaG8gJyAgICAgICAgICAqV2FybmluZyogVGhpcyBieXBhc3NlcyBDVFMgc2V0dXAgKGUuZy4gZG93bmxvYWQgbWVkaWEgY29udGVudHMgZnJvbSBzZXJ2ZXIpJwotICBlY2hvICcgICAgICAgICAgRm9yIHJ1bm5pbmcgQ1RTIGluIG9mZmljaWFsIHdheSwgdXNlIGF0ZXN0IG9yIGN0cy10cmFkZWZlZCAnCi0gIGVjaG8gJyAgICAgLWh8LS1oZWxwOiBUaGlzIGhlbHAnCi0gIGVjaG8gJyAgICAgLS1za2lwOiBTa2lwIGJ1aWxkIGFuZCBmbGFzaC4gSnVzdCByZXJ1bi10ZXN0cycKLSAgZWNobyAnICAgICAtLW1pbjogT25seSByZWJ1aWxkIHRlc3RzIGFuZCB1cGRhdGFibGUgbGlicmFyeS4nCi0gIGVjaG8gJyAgICAgLS10ZXN0OiBPbmx5IHJlYnVpbGQgdGVzdHMnCi0gIGVjaG8gJyAgICAgLXMgW2RldmljZV9pZF06IFNwZWNpZnkgYSBkZXZpY2UgbmFtZSB0byBydW4gdGVzdCBhZ2FpbnN0LicKLSAgZWNobyAnICAgICAgICAgICAgICAgICAgICAgWW91IGNhbiBkZWZpbmUgJHtBREJIT1NUfSBpbnN0ZWFkLicKLSAgZWNobyAnICAgICAtciBbY291bnRdOiBSZXBlYXQgdGVzdHMgZm9yIGdpdmVuIGNvdW50LiBJdCB3aWxsIHN0b3Agd2hlbiBmYWlscy4nCi0gIGVjaG8gJyAgICAgLS1pZ25vcmU6IEtlZXAgcmVwZWF0aW5nIHRlc3RzIGV2ZW4gd2hlbiBpdCBmYWlscy4nCi0gIGVjaG8gJyAgICAgLXQgW3Rlc3RdOiBPbmx5IHJ1biB0aGUgc3BlY2lmaWMgdGVzdC4gQ2FuIGJlIGVpdGhlciBhIGNsYXNzIG9yIGEgbWV0aG9kLicKLX0KLQotZnVuY3Rpb24gcnVudGVzdC1jdHMtTWVkaWFDb21wb25lbnRzKCkgewotICAjIEVkaXQgaGVyZSBpZiB5b3Ugd2FudCB0byBzdXBwb3J0IG90aGVyIHRlc3RzLgotICAjIExpc3QgdXAgbGlicyBhbmQgYXBrcyBpbiB0aGUgbWVkaWFfYXBpIG5lZWRlZCBmb3IgdGVzdHMsIGFuZCBwbGFjZSB0ZXN0IHRhcmdldCBhdCB0aGUgbGFzdC4KLSAgbG9jYWwgVEVTVF9QQUNLQUdFX0RJUj0oImZyYW1ld29ya3MvYXYvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Rlc3QiKQotICBsb2NhbCBURVNUX1BBQ0tBR0U9KCJhbmRyb2lkLm1lZGlhLmN0cyIpCi0gIGxvY2FsIEJVSUxEX1RBUkdFVFM9KCJNZWRpYUNvbXBvbmVudHMiICJDdHNNZWRpYVRlc3RDYXNlcyIpCi0gICMgRG9uJ3QgaW5jbHVkZSBNZWRpYUNvbXBvbmVudHMgLS0gaWYgd2Ugc2ltcGx5IGluc3RhbGwgaXQsIHN5c3RlbSBzZXJ2ZXIKLSAgIyB3b3VsZG4ndCB1c2UgdGhlIGluc3RhbGxlZCBvbmUuCi0gIGxvY2FsIElOU1RBTExfVEFSR0VUUz0oIkN0c01lZGlhVGVzdENhc2VzIikKLSAgbG9jYWwgVEVTVF9SVU5ORVI9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCi0gIGxvY2FsIERFUEVOREVOQ0lFUz0oIm1vY2tpdG8tdGFyZ2V0LW1pbnVzLWp1bml0NCIgImFuZHJvaWQtc3VwcG9ydC10ZXN0IiAiY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCIpCi0gIGxvY2FsIERFRkFVTFRfVEVTVF9UQVJHRVQ9IiIKLSAgREVGQVVMVF9URVNUX1RBUkdFVCs9ImFuZHJvaWQubWVkaWEuY3RzLk1lZGlhQnJvd3NlcjJUZXN0IgotICBERUZBVUxUX1RFU1RfVEFSR0VUKz0iLGFuZHJvaWQubWVkaWEuY3RzLk1lZGlhQ29udHJvbGxlcjJUZXN0IgotICBERUZBVUxUX1RFU1RfVEFSR0VUKz0iLGFuZHJvaWQubWVkaWEuY3RzLk1lZGlhTWV0YWRhdGEyVGVzdCIKLSAgREVGQVVMVF9URVNUX1RBUkdFVCs9IixhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYVNlc3Npb24yVGVzdCIKLSAgREVGQVVMVF9URVNUX1RBUkdFVCs9IixhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYVNlc3Npb24yX1Blcm1pc3Npb25UZXN0IgotICBERUZBVUxUX1RFU1RfVEFSR0VUKz0iLGFuZHJvaWQubWVkaWEuY3RzLk1lZGlhU2Vzc2lvbk1hbmFnZXJfTWVkaWFTZXNzaW9uMlRlc3QiCi0gIERFRkFVTFRfVEVTVF9UQVJHRVQrPSIsYW5kcm9pZC5tZWRpYS5jdHMuU2Vzc2lvblRva2VuMlRlc3QiCi0gIGlmIFtbIC16ICIke0FORFJPSURfQlVJTERfVE9QfSIgXV07IHRoZW4KLSAgICBlY2hvICJOZWVkcyB0byBsdW5jaCBhIHRhcmdldCBmaXJzdCIKLSAgICByZXR1cm4KLSAgZmkKLQotICBsb2NhbCBvbGRfcGF0aD0ke09MRFBXRH0KLSAgd2hpbGUgdHJ1ZTsgZG8KLSAgICBsb2NhbCBPUFRJT05fU0tJUD0iZmFsc2UiCi0gICAgbG9jYWwgT1BUSU9OX01JTj0iZmFsc2UiCi0gICAgbG9jYWwgT1BUSU9OX1RFU1Q9ImZhbHNlIgotICAgIGxvY2FsIE9QVElPTl9SRVBFQVRfQ09VTlQ9IjEiCi0gICAgbG9jYWwgT1BUSU9OX0lHTk9SRT0iZmFsc2UiCi0gICAgbG9jYWwgT1BUSU9OX1RFU1RfVEFSR0VUPSIke0RFRkFVTFRfVEVTVF9UQVJHRVR9IgotICAgIGxvY2FsIGFkYmhvc3RfbG9jYWwKLSAgICB3aGlsZSAoKCAiJCMiICkpOyBkbwotICAgICAgY2FzZSAiJHsxfSIgaW4KLSAgICAgICAgLWh8LS1oZWxwKQotICAgICAgICAgIF9ydW50ZXN0X2N0c19tZWRpYWNvbXBvbmVudF91c2FnZQotICAgICAgICAgIHJldHVybgotICAgICAgICAgIDs7Ci0gICAgICAgIC0tc2tpcCkKLSAgICAgICAgICBPUFRJT05fU0tJUD0idHJ1ZSIKLSAgICAgICAgICA7OwotICAgICAgICAtLW1pbikKLSAgICAgICAgICBPUFRJT05fTUlOPSJ0cnVlIgotICAgICAgICAgIDs7Ci0gICAgICAgIC0tdGVzdCkKLSAgICAgICAgICBPUFRJT05fVEVTVD0idHJ1ZSIKLSAgICAgICAgICA7OwotICAgICAgICAtcykKLSAgICAgICAgICBzaGlmdAotICAgICAgICAgIGFkYmhvc3RfbG9jYWw9JHsxfQotICAgICAgICAgIDs7Ci0gICAgICAgIC1yKQotICAgICAgICAgIHNoaWZ0Ci0gICAgICAgICAgT1BUSU9OX1JFUEVBVF9DT1VOVD0iJHsxfSIKLSAgICAgICAgICA7OwotICAgICAgICAtLWlnbm9yZSkKLSAgICAgICAgICBPUFRJT05fSUdOT1JFPSJ0cnVlIgotICAgICAgICAgIDs7Ci0gICAgICAgIC10KQotICAgICAgICAgIHNoaWZ0Ci0gICAgICAgICAgT1BUSU9OX1RFU1RfVEFSR0VUPSIkezF9IgotICAgICAgZXNhYwotICAgICAgc2hpZnQKLSAgICBkb25lCi0KLSAgICAjIEJ1aWxkIGFkYiBjb21tYW5kLgotICAgIGxvY2FsIGFkYgotICAgIGlmIFtbIC16ICIke2FkYmhvc3RfbG9jYWx9IiBdXTsgdGhlbgotICAgICAgYWRiaG9zdF9sb2NhbD0ke0FEQkhPU1R9Ci0gICAgZmkKLSAgICBpZiBbWyAteiAiJHthZGJob3N0X2xvY2FsfSIgXV07IHRoZW4KLSAgICAgIGxvY2FsIGRldmljZV9jb3VudD0kKGFkYiBkZXZpY2VzIHwgc2VkICcvXltbOnNwYWNlOl1dKiQvZCcgfCB3YyAtbCkKLSAgICAgIGlmIFtbICIke2RldmljZV9jb3VudH0iICE9ICIyIiBdXTsgdGhlbgotICAgICAgICBlY2hvICJUb28gbWFueSBkZXZpY2VzLiBTcGVjaWZ5IGEgZGV2aWNlLiIgJiYgYnJlYWsKLSAgICAgIGZpCi0gICAgICBhZGI9ImFkYiIKLSAgICBlbHNlCi0gICAgICBhZGI9ImFkYiAtcyAke2FkYmhvc3RfbG9jYWx9IgotICAgIGZpCi0KLSAgICBsb2NhbCB0YXJnZXRfZGlyPSIke0FORFJPSURfQlVJTERfVE9QfS8ke1RFU1RfUEFDS0FHRV9ESVJ9IgotICAgICNsb2NhbCBURVNUX1BBQ0tBR0U9JChzZWQgLW4gJ3MvXi4qXGJwYWNrYWdlXGI9IlwoW2EtejAtOVwuXSpcKSIuKiQvXDEvcCcgJHt0YXJnZXRfZGlyfS9BbmRyb2lkTWFuaWZlc3QueG1sKQotCi0gICAgaWYgW1sgIiR7T1BUSU9OX1NLSVB9IiAhPSAidHJ1ZSIgXV07IHRoZW4KLSAgICAgICMgQnVpbGQgZGVwZW5kZW5jaWVzIGlmIG5lZWRlZC4KLSAgICAgIGxvY2FsIGRlcGVuZGVuY3kKLSAgICAgIGxvY2FsIGJ1aWxkX2RlcGVuZGVuY3k9IiIKLSAgICAgIGZvciBkZXBlbmRlbmN5IGluICR7REVQRU5ERU5DSUVTW0BdfTsgZG8KLSAgICAgICAgaWYgW1sgIiR7ZGVwZW5kZW5jeX0iID09ICJvdXQvIiogXV07IHRoZW4KLSAgICAgICAgICBpZiBbWyAhIC1mICR7QU5EUk9JRF9CVUlMRF9UT1B9LyR7ZGVwZW5kZW5jeX0gXV07IHRoZW4KLSAgICAgICAgICAgIGJ1aWxkX2RlcGVuZGVuY3k9InRydWUiCi0gICAgICAgICAgICBicmVhawotICAgICAgICAgIGZpCi0gICAgICAgIGVsc2UKLSAgICAgICAgICBpZiBbWyAiJChmaW5kICR7T1VUfSAtbmFtZSAke2RlcGVuZGVuY3l9X2ludGVybWVkaWF0ZXMgfCB3YyAtbCkiID09ICIwIiBdXTsgdGhlbgotICAgICAgICAgICAgYnVpbGRfZGVwZW5kZW5jeT0idHJ1ZSIKLSAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgZmkKLSAgICAgICAgZmkKLSAgICAgIGRvbmUKLSAgICAgIGlmIFtbICIke2J1aWxkX2RlcGVuZGVuY3l9IiA9PSAidHJ1ZSIgXV07IHRoZW4KLSAgICAgICAgZWNobyAiQnVpbGRpbmcgZGVwZW5kZW5jaWVzLiBXaWxsIG9ubHkgcHJpbnQgc3RkZXJyLiIKLSAgICAgICAgbSAke0RFUEVOREVOQ0lFU1tAXX0gLWogPiAvZGV2L251bGwKLSAgICAgIGZpCi0KLSAgICAgICMgQnVpbGQgdGVzdCBhcGsgYW5kIHJlcXVpcmVkIGFway4KLSAgICAgIGxvY2FsIGJ1aWxkX3RhcmdldHMKLSAgICAgIGlmIFtbICIke09QVElPTl9URVNUfSIgPT0gInRydWUiIF1dOyB0aGVuCi0gICAgICAgIGJ1aWxkX3RhcmdldHM9IiR7SU5TVEFMTF9UQVJHRVRTW0BdfSIKLSAgICAgIGVsaWYgW1sgIiR7T1BUSU9OX01JTn0iID09ICJ0cnVlIiBdXTsgdGhlbgotICAgICAgICBidWlsZF90YXJnZXRzPSIke0JVSUxEX1RBUkdFVFNbQF19IgotICAgICAgZWxzZQotICAgICAgICBidWlsZF90YXJnZXRzPSIke0JVSUxEX1RBUkdFVFNbQF19IGRyb2lkIgotICAgICAgZmkKLSAgICAgIG0gJHtidWlsZF90YXJnZXRzfSAtaiB8fCBicmVhawotCi0gICAgICBpZiBbWyAiJHtPUFRJT05fVEVTVH0iICE9ICJ0cnVlIiBdXTsgdGhlbgotICAgICAgICAjIEZsYXNoIG9ubHkgd2hlbiBuZWVkZWQKLSAgICAgICAgbG9jYWwgZGV2aWNlX2J1aWxkX3R5cGU9IiQoJHthZGJ9IHNoZWxsIGdldHByb3Agcm8uYnVpbGQudHlwZSkiCi0gICAgICAgIGlmIFtbICIke2RldmljZV9idWlsZF90eXBlfSIgPT0gInVzZXIiIF1dOyB0aGVuCi0gICAgICAgICAgIyBVc2VyIGJ1aWxkLiBDYW5ub3QgYWRiIHN5bmMKLSAgICAgICAgICAke2FkYn0gcmVib290IGJvb3Rsb2FkZXIKLSAgICAgICAgICBmYXN0Ym9vdCBmbGFzaGFsbAotICAgICAgICBlbHNlCi0gICAgICAgICAgJHthZGJ9IHJvb3QKLSAgICAgICAgICBsb2NhbCBkZXZpY2VfdmVyaXR5X21vZGU9IiQoJHthZGJ9IHNoZWxsIGdldHByb3Agcm8uYm9vdC52ZXJpdHltb2RlKSIKLSAgICAgICAgICBpZiBbWyAiJHtkZXZpY2VfdmVyaXR5X21vZGV9IiAhPSAiZGlzYWJsZWQiIF1dOyB0aGVuCi0gICAgICAgICAgICAke2FkYn0gZGlzYWJsZS12ZXJpdHkKLSAgICAgICAgICAgICR7YWRifSByZWJvb3QKLSAgICAgICAgICAgICR7YWRifSB3YWl0LWZvci1kZXZpY2UgfHwgYnJlYWsKLSAgICAgICAgICAgICR7YWRifSByb290Ci0gICAgICAgICAgZmkKLSAgICAgICAgICAke2FkYn0gcmVtb3VudAotICAgICAgICAgICR7YWRifSBzaGVsbCBzdG9wCi0gICAgICAgICAgJHthZGJ9IHNoZWxsIHNldHByb3AgbG9nLnRhZy5NZWRpYVNlc3Npb25TZXJ2aWNlIERFQlVHCi0gICAgICAgICAgJHthZGJ9IHN5bmMKLSAgICAgICAgICAke2FkYn0gc2hlbGwgc3RhcnQKLSAgICAgICAgZmkKLSAgICAgICAgJHthZGJ9IHdhaXQtZm9yLWRldmljZSB8fCBicmVhawotICAgICAgICAjIEVuc3VyZSBwYWNrYWdlIG1hbmFnZXIgaXMgbG9hZGVkLgotICAgICAgICAjIFRPRE8oamFld2FuKTogRmluZCBiZXR0ZXIgd2F5IHRvIHdhaXQKLSAgICAgICAgc2xlZXAgMTUKLSAgICAgIGZpCi0KLSAgICAgICMgSW5zdGFsbCBhcGtzCi0gICAgICBsb2NhbCBpbnN0YWxsX2ZhaWxlZD0iZmFsc2UiCi0gICAgICBmb3IgdGFyZ2V0IGluICR7SU5TVEFMTF9UQVJHRVRTW0BdfTsgZG8KLSAgICAgICAgbG9jYWwgYXBrX3BhdGg9JChmaW5kICR7T1VUfS9zeXN0ZW0gJHtPVVR9L2RhdGEgLW5hbWUgJHt0YXJnZXR9LmFwaykKLSAgICAgICAgbG9jYWwgYXBrX251bT0kKGZpbmQgJHtPVVR9L3N5c3RlbSAke09VVH0vZGF0YSAtbmFtZSAke3RhcmdldH0uYXBrIHwgd2MgLWwpCi0gICAgICAgIGlmIFtbICIke2Fwa19udW19IiAhPSAiMSIgXV07IHRoZW4KLSAgICAgICAgICBlY2hvICJDYW5ub3QgbG9jYXRlIGEgJHt0YXJnZXR9LmFway4gRm91bmQgJHthcGtfbnVtfSBhcGtzIiAmJiBicmVhawotICAgICAgICBmaQotICAgICAgICBlY2hvICJJbnN0YWxsaW5nICR7dGFyZ2V0fS5hcGsuIHBhdGg9JHthcGtfcGF0aH0iCi0gICAgICAgICR7YWRifSBpbnN0YWxsIC1yICR7YXBrX3BhdGh9Ci0gICAgICAgIGlmIFtbICIkez99IiAhPSAiMCIgXV07IHRoZW4KLSAgICAgICAgICBpbnN0YWxsX2ZhaWxlZD0idHJ1ZSIKLSAgICAgICAgICBicmVhawotICAgICAgICBmaQotICAgICAgZG9uZQotICAgICAgaWYgW1sgIiR7aW5zdGFsbF9mYWlsZWR9IiA9PSAidHJ1ZSIgXV07IHRoZW4KLSAgICAgICAgZWNobyAiRmFpbGVkIHRvIGluc3RhbGwuIFRlc3Qgd291bGRuJ3QgcnVuLiIKLSAgICAgICAgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLQotICAgIGxvY2FsIHRlc3RfdGFyZ2V0PSIiCi0gICAgaWYgW1sgLW4gIiR7T1BUSU9OX1RFU1RfVEFSR0VUfSIgXV07IHRoZW4KLSAgICAgIHRlc3RfdGFyZ2V0PSItZSBjbGFzcyAke09QVElPTl9URVNUX1RBUkdFVH0iCi0gICAgZmkKLQotICAgIGxvY2FsIGkKLSAgICBsb2NhbCB0bXBmaWxlPSQodGVtcGZpbGUpCi0gICAgZm9yICgoaT0xOyBpIDw9ICR7T1BUSU9OX1JFUEVBVF9DT1VOVH07IGkrKykpOyBkbwotICAgICAgZWNobyAiUnVuIHRlc3QgJHtpfS8ke09QVElPTl9SRVBFQVRfQ09VTlR9IgotICAgICAgJHthZGJ9IHNoZWxsIGFtIGluc3RydW1lbnQgJHt0ZXN0X3RhcmdldH0gLXcgJHtURVNUX1BBQ0tBR0V9LyR7VEVTVF9SVU5ORVJ9ID4mICR7dG1wZmlsZX0KLSAgICAgIGNhdCAke3RtcGZpbGV9Ci0gICAgICBpZiBbWyAiJHtPUFRJT05fSUdOT1JFfSIgIT0gInRydWUiIF1dOyB0aGVuCi0gICAgICAgIGlmIFtbIC1uICIkKGdyZXAgJHt0bXBmaWxlfSAtZSAnRkFJTFVSRVx8Y3Jhc2hlZCcpIiBdXTsgdGhlbgotICAgICAgICAgICMgYW0gaW5zdHJ1bWVudCBkb2Vzbid0IHJldHVybiBlcnJvciBjb2RlIHNvIG5lZWQgdG8gZ3JlcCByZXN1bHQgbWVzc2FnZSBpbnN0ZWFkCi0gICAgICAgICAgYnJlYWsKLSAgICAgICAgZmkKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIHJtICR7dG1wZmlsZX0KLSAgICBicmVhawotICBkb25lCi19Ci0KLWVjaG8gIkZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGFkZGVkIHRvIHlvdXIgZW52aXJvbm1lbnQ6IgotX3J1bnRlc3RfY3RzX21lZGlhY29tcG9uZW50X3VzYWdlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL0lNZWRpYUNvbnRyb2xsZXIyLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL0lNZWRpYUNvbnRyb2xsZXIyLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ODhiNzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9JTWVkaWFDb250cm9sbGVyMi5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLklNZWRpYVNlc3Npb24yOwotCi0vKioKLSAqIEludGVyZmFjZSBmcm9tIE1lZGlhU2Vzc2lvbjIgdG8gTWVkaWFDb250cm9sbGVyMi4KLSAqIDxwPgotICogS2VlcCB0aGlzIGludGVyZmFjZSBvbmV3YXkuIE90aGVyd2lzZSBhIG1hbGljaW91cyBhcHAgbWF5IGltcGxlbWVudCBmYWtlIHZlcnNpb24gb2YgdGhpcywKLSAqIGFuZCBob2xkcyBjYWxscyBmcm9tIHNlc3Npb24gdG8gbWFrZSBzZXNzaW9uIG93bmVyKHMpIGZyb3plbi4KLSAqLwotLy8gVE9ETyhqYWV3YW4pOiAoUG9zdCBQKSBIYW5kbGUgd2hlbiB0aGUgcGxheWxpc3QgYmVjb21lcyB0b28gaHVnZS4KLS8vICAgICAgICAgICAgICAgTm90ZSB0aGF0IFBhcmNlbGxlZFNsaWNlTGlzdCBpc24ndCBhIGdvb2QgaWRlYSBmb3IgdGhlIHB1cnBvc2UuIChzZWU6IGIvMzc0OTM2NzcpCi1vbmV3YXkgaW50ZXJmYWNlIElNZWRpYUNvbnRyb2xsZXIyIHsKLSAgICB2b2lkIG9uUGxheWVyU3RhdGVDaGFuZ2VkKGludCBzdGF0ZSk7Ci0gICAgdm9pZCBvblBvc2l0aW9uQ2hhbmdlZChsb25nIGV2ZW50VGltZU1zLCBsb25nIHBvc2l0aW9uTXMpOwotICAgIHZvaWQgb25QbGF5YmFja1NwZWVkQ2hhbmdlZChmbG9hdCBzcGVlZCk7Ci0gICAgdm9pZCBvbkJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VkKGxvbmcgYnVmZmVyZWRQb3NpdGlvbk1zKTsKLSAgICB2b2lkIG9uUGxheWxpc3RDaGFuZ2VkKGluIExpc3Q8QnVuZGxlPiBwbGF5bGlzdCwgaW4gQnVuZGxlIG1ldGFkYXRhKTsKLSAgICB2b2lkIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQoaW4gQnVuZGxlIG1ldGFkYXRhKTsKLSAgICB2b2lkIG9uUGxheWJhY2tJbmZvQ2hhbmdlZChpbiBCdW5kbGUgcGxheWJhY2tJbmZvKTsKLSAgICB2b2lkIG9uUmVwZWF0TW9kZUNoYW5nZWQoaW50IHJlcGVhdE1vZGUpOwotICAgIHZvaWQgb25TaHVmZmxlTW9kZUNoYW5nZWQoaW50IHNodWZmbGVNb2RlKTsKLSAgICB2b2lkIG9uRXJyb3IoaW50IGVycm9yQ29kZSwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0KLSAgICB2b2lkIG9uQ29ubmVjdGVkKElNZWRpYVNlc3Npb24yIHNlc3Npb25CaW5kZXIsIGluIEJ1bmRsZSBjb21tYW5kR3JvdXAsCi0gICAgICAgICAgICBpbnQgcGxheWVyU3RhdGUsIGxvbmcgcG9zaXRpb25FdmVudFRpbWVNcywgbG9uZyBwb3NpdGlvbk1zLCBmbG9hdCBwbGF5YmFja1NwZWVkLAotICAgICAgICAgICAgbG9uZyBidWZmZXJlZFBvc2l0aW9uTXMsIGluIEJ1bmRsZSBwbGF5YmFja0luZm8sIGludCByZXBlYXRNb2RlLCBpbnQgc2h1ZmZsZU1vZGUsCi0gICAgICAgICAgICBpbiBMaXN0PEJ1bmRsZT4gcGxheWxpc3QsIGluIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5KTsKLSAgICB2b2lkIG9uRGlzY29ubmVjdGVkKCk7Ci0KLSAgICB2b2lkIG9uQ3VzdG9tTGF5b3V0Q2hhbmdlZChpbiBMaXN0PEJ1bmRsZT4gY29tbWFuZEJ1dHRvbmxpc3QpOwotICAgIHZvaWQgb25BbGxvd2VkQ29tbWFuZHNDaGFuZ2VkKGluIEJ1bmRsZSBjb21tYW5kcyk7Ci0KLSAgICB2b2lkIG9uQ3VzdG9tQ29tbWFuZChpbiBCdW5kbGUgY29tbWFuZCwgaW4gQnVuZGxlIGFyZ3MsIGluIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKTsKLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBCcm93c2VyIHNlcGNpZmljCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIHZvaWQgb25HZXRMaWJyYXJ5Um9vdERvbmUoaW4gQnVuZGxlIHJvb3RIaW50cywgU3RyaW5nIHJvb3RNZWRpYUlkLCBpbiBCdW5kbGUgcm9vdEV4dHJhKTsKLSAgICB2b2lkIG9uR2V0SXRlbURvbmUoU3RyaW5nIG1lZGlhSWQsIGluIEJ1bmRsZSByZXN1bHQpOwotICAgIHZvaWQgb25DaGlsZHJlbkNoYW5nZWQoU3RyaW5nIHJvb3RNZWRpYUlkLCBpbnQgaXRlbUNvdW50LCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIG9uR2V0Q2hpbGRyZW5Eb25lKFN0cmluZyBwYXJlbnRJZCwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwgaW4gTGlzdDxCdW5kbGU+IHJlc3VsdCwKLSAgICAgICAgICAgIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgb25TZWFyY2hSZXN1bHRDaGFuZ2VkKFN0cmluZyBxdWVyeSwgaW50IGl0ZW1Db3VudCwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBvbkdldFNlYXJjaFJlc3VsdERvbmUoU3RyaW5nIHF1ZXJ5LCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLCBpbiBMaXN0PEJ1bmRsZT4gcmVzdWx0LAotICAgICAgICAgICAgaW4gQnVuZGxlIGV4dHJhcyk7Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL0lNZWRpYVNlc3Npb24yLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL0lNZWRpYVNlc3Npb24yLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NDQ2N2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9JTWVkaWFTZXNzaW9uMi5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuSU1lZGlhQ29udHJvbGxlcjI7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZyb20gTWVkaWFDb250cm9sbGVyMiB0byBNZWRpYVNlc3Npb24yLgotICogPHA+Ci0gKiBLZWVwIHRoaXMgaW50ZXJmYWNlIG9uZXdheS4gT3RoZXJ3aXNlIGEgbWFsaWNpb3VzIGFwcCBtYXkgaW1wbGVtZW50IGZha2UgdmVyc2lvbiBvZiB0aGlzLAotICogYW5kIGhvbGRzIGNhbGxzIGZyb20gc2Vzc2lvbiB0byBtYWtlIHNlc3Npb24gb3duZXIocykgZnJvemVuLgotICovCi0gLy8gVE9ETyhqYWV3YW4pOiAoUG9zdCBQKSBIYW5kbGUgd2hlbiB0aGUgcGxheWxpc3QgYmVjb21lcyB0b28gaHVnZS4KLSAvLyAgICAgICAgICAgICAgIE5vdGUgdGhhdCBQYXJjZWxsZWRTbGljZUxpc3QgaXNuJ3QgYSBnb29kIGlkZWEgZm9yIHRoZSBwdXJwb3NlLiAoc2VlOiBiLzM3NDkzNjc3KQotb25ld2F5IGludGVyZmFjZSBJTWVkaWFTZXNzaW9uMiB7Ci0gICAgLy8gVE9ETyhqYWV3YW4pOiBhZGQgb25Db21tYW5kKCkgdG8gc2VuZCBwcml2YXRlIGNvbW1hbmQKLQotICAgIC8vIFRPRE8oamFld2FuKTogKFBvc3QgUCkgV2UgbWF5IGNvbnNpZGVyIHRvIGFkZCBhbm90aGVyIGJpbmRlciBqdXN0IGZvciB0aGUgY29ubmVjdGlvbgotICAgIC8vICAgICAgICAgICAgICAgbm90IHRvIGV4cG9zZSBvdGhlciBtZXRob2RzIHRvIHRoZSBjb250cm9sbGVyIHdob3NlIGNvbm5lY3Rpb24gd2Fzbid0IGFjY2VwdGVkLgotICAgIC8vICAgICAgICAgICAgICAgQnV0IHRoaXMgd291bGQgYmUgZW5vdWdoIGZvciBub3cgYmVjYXVzZSBpdCdzIHRoZSBzYW1lIGFzIGV4aXN0aW5nCi0gICAgLy8gICAgICAgICAgICAgICBNZWRpYUJyb3dzZXIgYW5kIE1lZGlhQnJvd3NlclNlcnZpY2UuCi0gICAgdm9pZCBjb25uZWN0KElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIGNhbGxpbmdQYWNrYWdlKTsKLSAgICB2b2lkIHJlbGVhc2UoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyKTsKLQotICAgIHZvaWQgc2V0Vm9sdW1lVG8oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgdmFsdWUsIGludCBmbGFncyk7Ci0gICAgdm9pZCBhZGp1c3RWb2x1bWUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgZGlyZWN0aW9uLCBpbnQgZmxhZ3MpOwotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIHNlbmQgY29tbWFuZAotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICB2b2lkIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsCi0gICAgICAgICAgICBpbnQgY29tbWFuZENvZGUsIGluIEJ1bmRsZSBhcmdzKTsKLSAgICB2b2lkIHNlbmRDdXN0b21Db21tYW5kKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gQnVuZGxlIGNvbW1hbmQsIGluIEJ1bmRsZSBhcmdzLAotICAgICAgICAgICAgaW4gUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIpOwotCi0gICAgdm9pZCBwcmVwYXJlRnJvbVVyaShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGluIFVyaSB1cmksIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgcHJlcGFyZUZyb21TZWFyY2goSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcXVlcnksIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgcHJlcGFyZUZyb21NZWRpYUlkKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIG1lZGlhSWQsIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgcGxheUZyb21VcmkoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbiBVcmkgdXJpLCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHBsYXlGcm9tU2VhcmNoKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIHF1ZXJ5LCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHBsYXlGcm9tTWVkaWFJZChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBtZWRpYUlkLCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHNldFJhdGluZyhJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBtZWRpYUlkLCBpbiBCdW5kbGUgcmF0aW5nKTsKLQotICAgIHZvaWQgc2V0UGxheWxpc3QoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbiBMaXN0PEJ1bmRsZT4gcGxheWxpc3QsIGluIEJ1bmRsZSBtZXRhZGF0YSk7Ci0gICAgdm9pZCB1cGRhdGVQbGF5bGlzdE1ldGFkYXRhKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gQnVuZGxlIG1ldGFkYXRhKTsKLSAgICB2b2lkIGFkZFBsYXlsaXN0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBpbmRleCwgaW4gQnVuZGxlIG1lZGlhSXRlbSk7Ci0gICAgdm9pZCByZW1vdmVQbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbiBCdW5kbGUgbWVkaWFJdGVtKTsKLSAgICB2b2lkIHJlcGxhY2VQbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgaW5kZXgsIGluIEJ1bmRsZSBtZWRpYUl0ZW0pOwotICAgIHZvaWQgc2tpcFRvUGxheWxpc3RJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gQnVuZGxlIG1lZGlhSXRlbSk7Ci0gICAgdm9pZCBza2lwVG9QcmV2aW91c0l0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyKTsKLSAgICB2b2lkIHNraXBUb05leHRJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcik7Ci0gICAgdm9pZCBzZXRSZXBlYXRNb2RlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IHJlcGVhdE1vZGUpOwotICAgIHZvaWQgc2V0U2h1ZmZsZU1vZGUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgc2h1ZmZsZU1vZGUpOwotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIGxpYnJhcnkgc2VydmljZSBzcGVjaWZpYwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICB2b2lkIGdldExpYnJhcnlSb290KElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gQnVuZGxlIHJvb3RIaW50cyk7Ci0gICAgdm9pZCBnZXRJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIG1lZGlhSWQpOwotICAgIHZvaWQgZ2V0Q2hpbGRyZW4oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcGFyZW50SWQsIGludCBwYWdlLCBpbnQgcGFnZVNpemUsCi0gICAgICAgICAgICBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHNlYXJjaChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBxdWVyeSwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBnZXRTZWFyY2hSZXN1bHQoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcXVlcnksIGludCBwYWdlLCBpbnQgcGFnZVNpemUsCi0gICAgICAgICAgICBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHN1YnNjcmliZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBwYXJlbnRJZCwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCB1bnN1YnNjcmliZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBwYXJlbnRJZCk7Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQnJvd3NlcjJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQnJvd3NlcjJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MDkwOTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUJyb3dzZXIySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQnJvd3NlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUJyb3dzZXIyLkJyb3dzZXJDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUJyb3dzZXIyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYUJyb3dzZXIySW1wbCBleHRlbmRzIE1lZGlhQ29udHJvbGxlcjJJbXBsIGltcGxlbWVudHMgTWVkaWFCcm93c2VyMlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFCcm93c2VyMiI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsgLy8gVE9ETyhqYWV3YW4pOiBjaGFuZ2UuCi0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhQnJvd3NlcjIgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgTWVkaWFCcm93c2VyMi5Ccm93c2VyQ2FsbGJhY2sgbUNhbGxiYWNrOwotCi0gICAgcHVibGljIE1lZGlhQnJvd3NlcjJJbXBsKENvbnRleHQgY29udGV4dCwgTWVkaWFCcm93c2VyMiBpbnN0YW5jZSwgU2Vzc2lvblRva2VuMiB0b2tlbiwKLSAgICAgICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yLCBCcm93c2VyQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgaW5zdGFuY2UsIHRva2VuLCBleGVjdXRvciwgY2FsbGJhY2spOwotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlIE1lZGlhQnJvd3NlcjIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiAoTWVkaWFCcm93c2VyMikgc3VwZXIuZ2V0SW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBnZXRMaWJyYXJ5Um9vdF9pbXBsKEJ1bmRsZSByb290SGludHMpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcigpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLmdldExpYnJhcnlSb290KGdldENvbnRyb2xsZXJTdHViKCksIHJvb3RIaW50cyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlIGRpc2Nvbm5lY3QuCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdWJzY3JpYmVfaW1wbChTdHJpbmcgcGFyZW50SWQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmVudElkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVyKCk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc3Vic2NyaWJlKGdldENvbnRyb2xsZXJTdHViKCksIHBhcmVudElkLCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBkaXNjb25uZWN0LgotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdW5zdWJzY3JpYmVfaW1wbChTdHJpbmcgcGFyZW50SWQpIHsKLSAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmVudElkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVyKCk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIudW5zdWJzY3JpYmUoZ2V0Q29udHJvbGxlclN0dWIoKSwgcGFyZW50SWQpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBkaXNjb25uZWN0LgotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZ2V0SXRlbV9pbXBsKFN0cmluZyBtZWRpYUlkKSB7Ci0gICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1lZGlhSWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXIoKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5nZXRJdGVtKGdldENvbnRyb2xsZXJTdHViKCksIG1lZGlhSWQpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBkaXNjb25uZWN0LgotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZ2V0Q2hpbGRyZW5faW1wbChTdHJpbmcgcGFyZW50SWQsIGludCBwYWdlLCBpbnQgcGFnZVNpemUsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmVudElkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhZ2UgPCAxIHx8IHBhZ2VTaXplIDwgMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTmVpdGhlciBwYWdlIG5vciBwYWdlU2l6ZSBzaG91bGQgYmUgbGVzcyB0aGFuIDEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXIoKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5nZXRDaGlsZHJlbihnZXRDb250cm9sbGVyU3R1YigpLCBwYXJlbnRJZCwgcGFnZSwgcGFnZVNpemUsIGV4dHJhcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlIGRpc2Nvbm5lY3QuCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZWFyY2hfaW1wbChTdHJpbmcgcXVlcnksIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicXVlcnkgc2hvdWxkbid0IGJlIGVtcHR5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcigpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNlYXJjaChnZXRDb250cm9sbGVyU3R1YigpLCBxdWVyeSwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgZGlzY29ubmVjdC4KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGdldFNlYXJjaFJlc3VsdF9pbXBsKFN0cmluZyBxdWVyeSwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJxdWVyeSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGFnZSA8IDEgfHwgcGFnZVNpemUgPCAxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOZWl0aGVyIHBhZ2Ugbm9yIHBhZ2VTaXplIHNob3VsZCBiZSBsZXNzIHRoYW4gMSIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXIoKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5nZXRTZWFyY2hSZXN1bHQoZ2V0Q29udHJvbGxlclN0dWIoKSwgcXVlcnksIHBhZ2UsIHBhZ2VTaXplLCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBkaXNjb25uZWN0LgotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25HZXRMaWJyYXJ5Um9vdERvbmUoCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgcm9vdEhpbnRzLCBmaW5hbCBTdHJpbmcgcm9vdE1lZGlhSWQsIGZpbmFsIEJ1bmRsZSByb290RXh0cmEpIHsKLSAgICAgICAgZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uR2V0TGlicmFyeVJvb3REb25lKGdldEluc3RhbmNlKCksIHJvb3RIaW50cywgcm9vdE1lZGlhSWQsIHJvb3RFeHRyYSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uR2V0SXRlbURvbmUoU3RyaW5nIG1lZGlhSWQsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBnZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25HZXRJdGVtRG9uZShnZXRJbnN0YW5jZSgpLCBtZWRpYUlkLCBpdGVtKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25HZXRDaGlsZHJlbkRvbmUoU3RyaW5nIHBhcmVudElkLCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLCBMaXN0PE1lZGlhSXRlbTI+IHJlc3VsdCwKLSAgICAgICAgICAgIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uR2V0Q2hpbGRyZW5Eb25lKGdldEluc3RhbmNlKCksIHBhcmVudElkLCBwYWdlLCBwYWdlU2l6ZSwgcmVzdWx0LCBleHRyYXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblNlYXJjaFJlc3VsdENoYW5nZWQoU3RyaW5nIHF1ZXJ5LCBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblNlYXJjaFJlc3VsdENoYW5nZWQoZ2V0SW5zdGFuY2UoKSwgcXVlcnksIGl0ZW1Db3VudCwgZXh0cmFzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25HZXRTZWFyY2hSZXN1bHREb25lKFN0cmluZyBxdWVyeSwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwgTGlzdDxNZWRpYUl0ZW0yPiByZXN1bHQsCi0gICAgICAgICAgICBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkdldFNlYXJjaFJlc3VsdERvbmUoZ2V0SW5zdGFuY2UoKSwgcXVlcnksIHBhZ2UsIHBhZ2VTaXplLCByZXN1bHQsIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uQ2hpbGRyZW5DaGFuZ2VkKGZpbmFsIFN0cmluZyBwYXJlbnRJZCwgaW50IGl0ZW1Db3VudCwgZmluYWwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBnZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25DaGlsZHJlbkNoYW5nZWQoZ2V0SW5zdGFuY2UoKSwgcGFyZW50SWQsIGl0ZW1Db3VudCwgZXh0cmFzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUNvbnRyb2xsZXIySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUNvbnRyb2xsZXIySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDkzNjVhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFDb250cm9sbGVyMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VUX1ZPTFVNRTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX0FERF9JVEVNOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfUkVNT1ZFX0lURU07Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9SRVBMQUNFX0lURU07Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfTElTVDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9MSVNUX01FVEFEQVRBOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX1JFUEVBVF9NT0RFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX1NIVUZGTEVfTU9ERTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX01FRElBX0lEOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fU0VBUkNIOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fVVJJOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fTUVESUFfSUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9TRUFSQ0g7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9VUkk7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjIuQ29udHJvbGxlckNhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMi5QbGF5YmFja0luZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQuUmVwZWF0TW9kZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudC5TaHVmZmxlTW9kZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29tbWFuZEJ1dHRvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kR3JvdXAyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5SYXRpbmcyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUNvbnRyb2xsZXIyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlVzZXJIYW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uR3VhcmRlZEJ5OwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYUNvbnRyb2xsZXIySW1wbCBpbXBsZW1lbnRzIE1lZGlhQ29udHJvbGxlcjJQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYUNvbnRyb2xsZXIyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsgLy8gVE9ETyhqYWV3YW4pOiBDaGFuZ2UKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFDb250cm9sbGVyMiBtSW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYUNvbnRyb2xsZXIyU3R1YiBtQ29udHJvbGxlclN0dWI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXNzaW9uVG9rZW4yIG1Ub2tlbjsKLSAgICBwcml2YXRlIGZpbmFsIENvbnRyb2xsZXJDYWxsYmFjayBtQ2FsbGJhY2s7Ci0gICAgcHJpdmF0ZSBmaW5hbCBFeGVjdXRvciBtQ2FsbGJhY2tFeGVjdXRvcjsKLSAgICBwcml2YXRlIGZpbmFsIElCaW5kZXIuRGVhdGhSZWNpcGllbnQgbURlYXRoUmVjaXBpZW50OwotCi0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgU2Vzc2lvblNlcnZpY2VDb25uZWN0aW9uIG1TZXJ2aWNlQ29ubmVjdGlvbjsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc1JlbGVhc2VkOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIExpc3Q8TWVkaWFJdGVtMj4gbVBsYXlsaXN0OwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIE1lZGlhTWV0YWRhdGEyIG1QbGF5bGlzdE1ldGFkYXRhOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIEBSZXBlYXRNb2RlIGludCBtUmVwZWF0TW9kZTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBAU2h1ZmZsZU1vZGUgaW50IG1TaHVmZmxlTW9kZTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBpbnQgbVBsYXllclN0YXRlOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGxvbmcgbVBvc2l0aW9uRXZlbnRUaW1lTXM7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgbG9uZyBtUG9zaXRpb25NczsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBmbG9hdCBtUGxheWJhY2tTcGVlZDsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBsb25nIG1CdWZmZXJlZFBvc2l0aW9uTXM7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgUGxheWJhY2tJbmZvIG1QbGF5YmFja0luZm87Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgUGVuZGluZ0ludGVudCBtU2Vzc2lvbkFjdGl2aXR5OwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIFNlc3Npb25Db21tYW5kR3JvdXAyIG1BbGxvd2VkQ29tbWFuZHM7Ci0KLSAgICAvLyBBc3NpZ25tZW50IHNob3VsZCBiZSB1c2VkIHdpdGggdGhlIGxvY2sgaG9sZCwgYnV0IHNob3VsZCBiZSB1c2VkIHdpdGhvdXQgYSBsb2NrIHRvIHByZXZlbnQKLSAgICAvLyBwb3RlbnRpYWwgZGVhZGxvY2suCi0gICAgLy8gUG9zdGZpeCAtQmluZGVyIGlzIGFkZGVkIHRvIGV4cGxpY2l0bHkgc2hvdyB0aGF0IGl0J3MgcG90ZW50aWFsbHkgcmVtb3RlIHByb2Nlc3MgY2FsbC4KLSAgICAvLyBUZWNobmljYWxseSAtSW50ZXJmYWNlIGlzIG1vcmUgY29ycmVjdCwgYnV0IGl0IG1heSBtaXNyZWFkIHRoYXQgaXQncyBpbnRlcmZhY2UgKHZzIGNsYXNzKQotICAgIC8vIHNvIGxldCdzIGtlZXAgdGhpcyBwb3N0Zml4IHVudGlsIHdlIGZpbmQgYmV0dGVyIHBvc3RmaXguCi0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgdm9sYXRpbGUgSU1lZGlhU2Vzc2lvbjIgbVNlc3Npb25CaW5kZXI7Ci0KLSAgICAvLyBUT0RPKGphZXdhbik6IFJlcXVpcmUgc2Vzc2lvbiBhY3RpdmVuZXNzIGNoYW5nZWQgbGlzdGVuZXIsIGJlY2F1c2UgY29udHJvbGxlciBjYW4gYmUKLSAgICAvLyAgICAgICAgICAgICAgIGF2YWlsYWJsZSB3aGVuIHRoZSBzZXNzaW9uJ3MgcGxheWVyIGlzIG51bGwuCi0gICAgcHVibGljIE1lZGlhQ29udHJvbGxlcjJJbXBsKENvbnRleHQgY29udGV4dCwgTWVkaWFDb250cm9sbGVyMiBpbnN0YW5jZSwgU2Vzc2lvblRva2VuMiB0b2tlbiwKLSAgICAgICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yLCBDb250cm9sbGVyQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbnRleHQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodG9rZW4gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidG9rZW4gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXhlY3V0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZXhlY3V0b3Igc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIG1Db250cm9sbGVyU3R1YiA9IG5ldyBNZWRpYUNvbnRyb2xsZXIyU3R1Yih0aGlzKTsKLSAgICAgICAgbVRva2VuID0gdG9rZW47Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvciA9IGV4ZWN1dG9yOwotICAgICAgICBtRGVhdGhSZWNpcGllbnQgPSAoKSAtPiB7Ci0gICAgICAgICAgICBtSW5zdGFuY2UuY2xvc2UoKTsKLSAgICAgICAgfTsKLQotICAgICAgICBtU2Vzc2lvbkJpbmRlciA9IG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBNb3JlIHNhbml0eSBjaGVja3MuCi0gICAgICAgIGlmIChtVG9rZW4uZ2V0VHlwZSgpID09IFNlc3Npb25Ub2tlbjIuVFlQRV9TRVNTSU9OKSB7Ci0gICAgICAgICAgICAvLyBTZXNzaW9uCi0gICAgICAgICAgICBtU2VydmljZUNvbm5lY3Rpb24gPSBudWxsOwotICAgICAgICAgICAgY29ubmVjdFRvU2Vzc2lvbihTZXNzaW9uVG9rZW4ySW1wbC5mcm9tKG1Ub2tlbikuZ2V0U2Vzc2lvbkJpbmRlcigpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFNlc3Npb24gc2VydmljZQotICAgICAgICAgICAgaWYgKFByb2Nlc3MubXlVaWQoKSA9PSBQcm9jZXNzLlNZU1RFTV9VSUQpIHsKLSAgICAgICAgICAgICAgICAvLyBJdCdzIHN5c3RlbSBzZXJ2ZXIgKE1lZGlhU2Vzc2lvblNlcnZpY2UpIHRoYXQgd2FudHMgdG8gbW9uaXRvciBzZXNzaW9uLgotICAgICAgICAgICAgICAgIC8vIERvbid0IGJpbmQgaWYgYWJsZS4uCi0gICAgICAgICAgICAgICAgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gU2Vzc2lvblRva2VuMkltcGwuZnJvbShtVG9rZW4pLmdldFNlc3Npb25CaW5kZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGJpbmRlciBpbiB0aGUgc2Vzc2lvbiB0b2tlbiBpbnN0ZWFkIG9mIGJpbmQgYnkgaXRzIG93bi4KLSAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHNlcnZlciB3aWxsIGhvbGRzIHRoZSBiaW5kaW5nIHRvIHRoZSBzZXJ2aWNlICpmb3JldmVyKiBhbmQgc2VydmljZQotICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIG5ldmVyIHN0b3AuCi0gICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlQ29ubmVjdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGNvbm5lY3RUb1Nlc3Npb24oU2Vzc2lvblRva2VuMkltcGwuZnJvbShtVG9rZW4pLmdldFNlc3Npb25CaW5kZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNob3VsZCBoYXBwZW4gb25seSB3aGVuIHN5c3RlbSBzZXJ2ZXIgd2FudHMgdG8gZGlzcGF0Y2ggbWVkaWEga2V5IGV2ZW50cyB0bwotICAgICAgICAgICAgICAgICAgICAvLyBhIGRlYWQgc2VydmljZS4KLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU3lzdGVtIHNlcnZlciBiaW5kcyB0byBhIHNlc3Npb24gc2VydmljZS4gU2hvdWxkIHVuYmluZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHVzZS4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU2VydmljZUNvbm5lY3Rpb24gPSBuZXcgU2Vzc2lvblNlcnZpY2VDb25uZWN0aW9uKCk7Ci0gICAgICAgICAgICBjb25uZWN0VG9TZXJ2aWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY29ubmVjdFRvU2VydmljZSgpIHsKLSAgICAgICAgLy8gU2VydmljZS4gTmVlZHMgdG8gZ2V0IGZyZXNoIGJpbmRlciB3aGVuZXZlciBjb25uZWN0aW9uIGlzIG5lZWRlZC4KLSAgICAgICAgU2Vzc2lvblRva2VuMkltcGwgaW1wbCA9IFNlc3Npb25Ub2tlbjJJbXBsLmZyb20obVRva2VuKTsKLSAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFTZXNzaW9uU2VydmljZTIuU0VSVklDRV9JTlRFUkZBQ0UpOwotICAgICAgICBpbnRlbnQuc2V0Q2xhc3NOYW1lKG1Ub2tlbi5nZXRQYWNrYWdlTmFtZSgpLCBpbXBsLmdldFNlcnZpY2VOYW1lKCkpOwotCi0gICAgICAgIC8vIFVzZSBiaW5kU2VydmljZSgpIGluc3RlYWQgb2Ygc3RhcnRGb3JlZ3JvdW5kU2VydmljZSgpIHRvIHN0YXJ0IHNlc3Npb24gc2VydmljZSBmb3IgdGhyZWUKLSAgICAgICAgLy8gcmVhc29ucy4KLSAgICAgICAgLy8gMS4gUHJldmVudCBzZXNzaW9uIHNlcnZpY2Ugb3duZXIncyBzdG9wU2VsZigpIGZyb20gZGVzdHJveWluZyBzZXJ2aWNlLgotICAgICAgICAvLyAgICBXaXRoIHRoZSBzdGFydEZvcmVncm91bmRTZXJ2aWNlKCksIHNlcnZpY2UncyBjYWxsIG9mIHN0b3BTZWxmKCkgd2lsbCB0cmlnZ2VyIGltbWVkaWF0ZQotICAgICAgICAvLyAgICBvbkRlc3Ryb3koKSBjYWxscyBvbiB0aGUgbWFpbiB0aHJlYWQgZXZlbiB3aGVuIG9uQ29ubmVjdCgpIGlzIHJ1bm5pbmcgaW4gYW5vdGhlcgotICAgICAgICAvLyAgICB0aHJlYWQuCi0gICAgICAgIC8vIDIuIE1pbmltaXplIEFQSXMgZm9yIGRldmVsb3BlcnMgdG8gdGFrZSBjYXJlIGFib3V0LgotICAgICAgICAvLyAgICBXaXRoIGJpbmRTZXJ2aWNlKCksIGRldmVsb3BlcnMgb25seSBuZWVkIHRvIHRha2UgY2FyZSBhYm91dCBTZXJ2aWNlLm9uQmluZCgpCi0gICAgICAgIC8vICAgIGJ1dCBTZXJ2aWNlLm9uU3RhcnRDb21tYW5kKCkgc2hvdWxkIGJlIGFsc28gdGFrZW4gY2FyZSBhYm91dCB3aXRoIHRoZQotICAgICAgICAvLyAgICBzdGFydEZvcmVncm91bmRTZXJ2aWNlKCkuCi0gICAgICAgIC8vIDMuIEZ1dHVyZSBzdXBwb3J0IGZvciBVSS1sZXNzIHBsYXliYWNrCi0gICAgICAgIC8vICAgIElmIGEgc2VydmljZSB3YW50cyB0byBrZWVwIHJ1bm5pbmcsIGl0IHNob3VsZCBiZSBlaXRoZXIgZm9yZWdyb3VuZCBzZXJ2aWNlIG9yCi0gICAgICAgIC8vICAgIGJvdW5kZWQgc2VydmljZS4gQnV0IHRoZXJlIGhhZCBiZWVuIHJlcXVlc3QgZm9yIHRoZSBmZWF0dXJlIGZvciBzeXN0ZW0gYXBwcwotICAgICAgICAvLyAgICBhbmQgdXNpbmcgYmluZFNlcnZpY2UoKSB3aWxsIGJlIGJldHRlciBmaXQgd2l0aCBpdC4KLSAgICAgICAgYm9vbGVhbiByZXN1bHQ7Ci0gICAgICAgIGlmIChQcm9jZXNzLm15VWlkKCkgPT0gUHJvY2Vzcy5TWVNURU1fVUlEKSB7Ci0gICAgICAgICAgICAvLyBVc2UgYmluZFNlcnZpY2VBc1VzZXIoKSBmb3IgYmluZGluZyBmcm9tIHN5c3RlbSBzZXJ2aWNlIHRvIGF2b2lkIGZvbGxvd2luZyB3YXJuaW5nLgotICAgICAgICAgICAgLy8gQ29udGV4dEltcGw6IENhbGxpbmcgYSBtZXRob2QgaW4gdGhlIHN5c3RlbSBwcm9jZXNzIHdpdGhvdXQgYSBxdWFsaWZpZWQgdXNlcgotICAgICAgICAgICAgcmVzdWx0ID0gbUNvbnRleHQuYmluZFNlcnZpY2VBc1VzZXIoaW50ZW50LCBtU2VydmljZUNvbm5lY3Rpb24sIENvbnRleHQuQklORF9BVVRPX0NSRUFURSwKLSAgICAgICAgICAgICAgICAgICAgVXNlckhhbmRsZS5nZXRVc2VySGFuZGxlRm9yVWlkKG1Ub2tlbi5nZXRVaWQoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzdWx0ID0gbUNvbnRleHQuYmluZFNlcnZpY2UoaW50ZW50LCBtU2VydmljZUNvbm5lY3Rpb24sIENvbnRleHQuQklORF9BVVRPX0NSRUFURSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFyZXN1bHQpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgImJpbmQgdG8gIiArIG1Ub2tlbiArICIgZmFpbGVkIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImJpbmQgdG8gIiArIG1Ub2tlbiArICIgc3VjY2VzcyIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvbm5lY3RUb1Nlc3Npb24oSU1lZGlhU2Vzc2lvbjIgc2Vzc2lvbkJpbmRlcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2Vzc2lvbkJpbmRlci5jb25uZWN0KG1Db250cm9sbGVyU3R1YiwgbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdG8gY2FsbCBjb25uZWN0aW9uIHJlcXVlc3QuIEZyYW1ld29yayB3aWxsIHJldHJ5IgotICAgICAgICAgICAgICAgICAgICArICIgYXV0b21hdGljYWxseSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2xvc2VfaW1wbCgpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJyZWxlYXNlIGZyb20gIiArIG1Ub2tlbik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAobUlzUmVsZWFzZWQpIHsKLSAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IHJlLWVudGVyYW5jZSBmcm9tIHRoZSBDb250cm9sbGVyQ2FsbGJhY2sub25EaXNjb25uZWN0ZWQoKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Jc1JlbGVhc2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChtU2VydmljZUNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db250ZXh0LnVuYmluZFNlcnZpY2UobVNlcnZpY2VDb25uZWN0aW9uKTsKLSAgICAgICAgICAgICAgICBtU2VydmljZUNvbm5lY3Rpb24gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgICAgICBtU2Vzc2lvbkJpbmRlciA9IG51bGw7Ci0gICAgICAgICAgICBtQ29udHJvbGxlclN0dWIuZGVzdHJveSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuYXNCaW5kZXIoKS51bmxpbmtUb0RlYXRoKG1EZWF0aFJlY2lwaWVudCwgMCk7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnJlbGVhc2UobUNvbnRyb2xsZXJTdHViKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm8tb3AuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25EaXNjb25uZWN0ZWQobUluc3RhbmNlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgSU1lZGlhU2Vzc2lvbjIgZ2V0U2Vzc2lvbkJpbmRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9uQmluZGVyOwotICAgIH0KLQotICAgIE1lZGlhQ29udHJvbGxlcjJTdHViIGdldENvbnRyb2xsZXJTdHViKCkgewotICAgICAgICByZXR1cm4gbUNvbnRyb2xsZXJTdHViOwotICAgIH0KLQotICAgIEV4ZWN1dG9yIGdldENhbGxiYWNrRXhlY3V0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtQ2FsbGJhY2tFeGVjdXRvcjsKLSAgICB9Ci0KLSAgICBDb250ZXh0IGdldENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBtQ29udGV4dDsKLSAgICB9Ci0KLSAgICBNZWRpYUNvbnRyb2xsZXIyIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgIH0KLQotICAgIC8vIFJldHVybnMgc2Vzc2lvbiBiaW5kZXIgaWYgdGhlIGNvbnRyb2xsZXIgY2FuIHNlbmQgdGhlIGNvbW1hbmQuCi0gICAgSU1lZGlhU2Vzc2lvbjIgZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShpbnQgY29tbWFuZENvZGUpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKCFtQWxsb3dlZENvbW1hbmRzLmhhc0NvbW1hbmQoY29tbWFuZENvZGUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2Fubm90IHNlbmQgYmVjYXVzZSBpc24ndCBhbGxvd2VkIHRvLgotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbnRyb2xsZXIgaXNuJ3QgYWxsb3dlZCB0byBjYWxsIGNvbW1hbmQsIGNvbW1hbmRDb2RlPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgY29tbWFuZENvZGUpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogU2hvdWxkIHdlIGRvIHRoaXMgd2l0aCB0aGUgbG9jayBob2xkPwotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBtU2Vzc2lvbkJpbmRlcjsKLSAgICAgICAgaWYgKGJpbmRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBDYW5ub3Qgc2VuZCBiZWNhdXNlIGRpc2Nvbm5lY3RlZC4KLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXMgZGlzY29ubmVjdGVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJpbmRlcjsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm5zIHNlc3Npb24gYmluZGVyIGlmIHRoZSBjb250cm9sbGVyIGNhbiBzZW5kIHRoZSBjb21tYW5kLgotICAgIElNZWRpYVNlc3Npb24yIGdldFNlc3Npb25CaW5kZXJJZkFibGUoU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKCFtQWxsb3dlZENvbW1hbmRzLmhhc0NvbW1hbmQoY29tbWFuZCkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb250cm9sbGVyIGlzbid0IGFsbG93ZWQgdG8gY2FsbCBjb21tYW5kLCBjb21tYW5kPSIgKyBjb21tYW5kKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPKGphZXdhbik6IFNob3VsZCB3ZSBkbyB0aGlzIHdpdGggdGhlIGxvY2sgaG9sZD8KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgIGlmIChiaW5kZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gQ2Fubm90IHNlbmQgYmVjYXVzZSBkaXNjb25uZWN0ZWQuCi0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzIGRpc2Nvbm5lY3RlZCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiaW5kZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNlc3Npb25Ub2tlbjIgZ2V0U2Vzc2lvblRva2VuX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtVG9rZW47Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWRfaW1wbCgpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgIHJldHVybiBiaW5kZXIgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwbGF5X2ltcGwoKSB7Ci0gICAgICAgIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1BMQVkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBhdXNlX2ltcGwoKSB7Ci0gICAgICAgIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1BBVVNFKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdG9wX2ltcGwoKSB7Ci0gICAgICAgIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1NUT1ApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNraXBUb1BsYXlsaXN0SXRlbV9pbXBsKE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc2tpcFRvUGxheWxpc3RJdGVtKG1Db250cm9sbGVyU3R1YiwgaXRlbS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUHJldmlvdXNJdGVtX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNraXBUb1ByZXZpb3VzSXRlbShtQ29udHJvbGxlclN0dWIpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9OZXh0SXRlbV9pbXBsKCkgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBtU2Vzc2lvbkJpbmRlcjsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5za2lwVG9OZXh0SXRlbShtQ29udHJvbGxlclN0dWIpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKGludCBjb21tYW5kQ29kZSkgewotICAgICAgICBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoY29tbWFuZENvZGUsIG51bGwpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoaW50IGNvbW1hbmRDb2RlLCBCdW5kbGUgYXJncykgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBtU2Vzc2lvbkJpbmRlcjsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5zZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQobUNvbnRyb2xsZXJTdHViLCBjb21tYW5kQ29kZSwgYXJncyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBQZW5kaW5nSW50ZW50IGdldFNlc3Npb25BY3Rpdml0eV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVNlc3Npb25BY3Rpdml0eTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRWb2x1bWVUb19pbXBsKGludCB2YWx1ZSwgaW50IGZsYWdzKSB7Ci0gICAgICAgIC8vIFRPRE8oaGRtb29uKTogc2FuaXR5IGNoZWNrCi0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1NFVF9WT0xVTUUpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNldFZvbHVtZVRvKG1Db250cm9sbGVyU3R1YiwgdmFsdWUsIGZsYWdzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRqdXN0Vm9sdW1lX2ltcGwoaW50IGRpcmVjdGlvbiwgaW50IGZsYWdzKSB7Ci0gICAgICAgIC8vIFRPRE8oaGRtb29uKTogc2FuaXR5IGNoZWNrCi0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1NFVF9WT0xVTUUpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLmFkanVzdFZvbHVtZShtQ29udHJvbGxlclN0dWIsIGRpcmVjdGlvbiwgZmxhZ3MpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlRnJvbVVyaV9pbXBsKFVyaSB1cmksIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fVVJJKTsKLSAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1cmkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnByZXBhcmVGcm9tVXJpKG1Db250cm9sbGVyU3R1YiwgdXJpLCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZS4KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmVGcm9tU2VhcmNoX2ltcGwoU3RyaW5nIHF1ZXJ5LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoCi0gICAgICAgICAgICAgICAgQ09NTUFORF9DT0RFX1NFU1NJT05fUFJFUEFSRV9GUk9NX1NFQVJDSCk7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInF1ZXJ5IHNob3VsZG4ndCBiZSBlbXB0eSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIucHJlcGFyZUZyb21TZWFyY2gobUNvbnRyb2xsZXJTdHViLCBxdWVyeSwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlRnJvbU1lZGlhSWRfaW1wbChTdHJpbmcgbWVkaWFJZCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKAotICAgICAgICAgICAgICAgIENPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9NRURJQV9JRCk7Ci0gICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1lZGlhSWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnByZXBhcmVGcm9tTWVkaWFJZChtQ29udHJvbGxlclN0dWIsIG1lZGlhSWQsIGV4dHJhcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGxheUZyb21VcmlfaW1wbChVcmkgdXJpLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX1VSSSk7Ci0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidXJpIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5wbGF5RnJvbVVyaShtQ29udHJvbGxlclN0dWIsIHVyaSwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwbGF5RnJvbVNlYXJjaF9pbXBsKFN0cmluZyBxdWVyeSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9TRVNTSU9OX1BMQVlfRlJPTV9TRUFSQ0gpOwotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJxdWVyeSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnBsYXlGcm9tU2VhcmNoKG1Db250cm9sbGVyU3R1YiwgcXVlcnksIGV4dHJhcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGxheUZyb21NZWRpYUlkX2ltcGwoU3RyaW5nIG1lZGlhSWQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZSgKLSAgICAgICAgICAgICAgICBDT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fTUVESUFfSUQpOwotICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZWRpYUlkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5wbGF5RnJvbU1lZGlhSWQobUNvbnRyb2xsZXJTdHViLCBtZWRpYUlkLCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZS4KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFJhdGluZ19pbXBsKFN0cmluZyBtZWRpYUlkLCBSYXRpbmcyIHJhdGluZykgewotICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZWRpYUlkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJhdGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyYXRpbmcgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNldFJhdGluZyhtQ29udHJvbGxlclN0dWIsIG1lZGlhSWQsIHJhdGluZy50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZW5kQ3VzdG9tQ29tbWFuZF9pbXBsKFNlc3Npb25Db21tYW5kMiBjb21tYW5kLCBCdW5kbGUgYXJncywgUmVzdWx0UmVjZWl2ZXIgY2IpIHsKLSAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoY29tbWFuZCk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc2VuZEN1c3RvbUNvbW1hbmQobUNvbnRyb2xsZXJTdHViLCBjb21tYW5kLnRvQnVuZGxlKCksIGFyZ3MsIGNiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8TWVkaWFJdGVtMj4gZ2V0UGxheWxpc3RfaW1wbCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5bGlzdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFBsYXlsaXN0X2ltcGwoTGlzdDxNZWRpYUl0ZW0yPiBsaXN0LCBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsaXN0IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX0xJU1QpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIExpc3Q8QnVuZGxlPiBidW5kbGVMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBidW5kbGVMaXN0LmFkZChsaXN0LmdldChpKS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJ1bmRsZSBtZXRhZGF0YUJ1bmRsZSA9IChtZXRhZGF0YSA9PSBudWxsKSA/IG51bGwgOiBtZXRhZGF0YS50b0J1bmRsZSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc2V0UGxheWxpc3QobUNvbnRyb2xsZXJTdHViLCBidW5kbGVMaXN0LCBtZXRhZGF0YUJ1bmRsZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMiBnZXRQbGF5bGlzdE1ldGFkYXRhX2ltcGwoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWxpc3RNZXRhZGF0YTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVBsYXlsaXN0TWV0YWRhdGFfaW1wbChNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKAotICAgICAgICAgICAgICAgIENPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfTElTVF9NRVRBREFUQSk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgQnVuZGxlIG1ldGFkYXRhQnVuZGxlID0gKG1ldGFkYXRhID09IG51bGwpID8gbnVsbCA6IG1ldGFkYXRhLnRvQnVuZGxlKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci51cGRhdGVQbGF5bGlzdE1ldGFkYXRhKG1Db250cm9sbGVyU3R1YiwgbWV0YWRhdGFCdW5kbGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlX2ltcGwoKSB7Ci0gICAgICAgIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1BSRVBBUkUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGZhc3RGb3J3YXJkX2ltcGwoKSB7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogSW1wbGVtZW50IHRoaXMuIE5vdGUgdGhhdCBmYXN0IGZvcndhcmQgaXNuJ3QgYSB0cmFuc3BvcnQgY29tbWFuZCBhbnltb3JlCi0gICAgICAgIC8vc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKE1lZGlhU2Vzc2lvbjIuQ09NTUFORF9DT0RFX1NFU1NJT05fRkFTVF9GT1JXQVJEKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZXdpbmRfaW1wbCgpIHsKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBJbXBsZW1lbnQgdGhpcy4gTm90ZSB0aGF0IHJld2luZCBpc24ndCBhIHRyYW5zcG9ydCBjb21tYW5kIGFueW1vcmUKLSAgICAgICAgLy9zZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoTWVkaWFTZXNzaW9uMi5DT01NQU5EX0NPREVfU0VTU0lPTl9SRVdJTkQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNlZWtUb19pbXBsKGxvbmcgcG9zKSB7Ci0gICAgICAgIGlmIChwb3MgPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwb3NpdGlvbiBzaG91bGRuJ3QgYmUgbmVnYXRpdmUiKTsKLSAgICAgICAgfQotICAgICAgICBCdW5kbGUgYXJncyA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgYXJncy5wdXRMb25nKE1lZGlhU2Vzc2lvbjJTdHViLkFSR1VNRU5UX0tFWV9QT1NJVElPTiwgcG9zKTsKLSAgICAgICAgc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUJBQ0tfU0VFS19UTywgYXJncyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkUGxheWxpc3RJdGVtX2ltcGwoaW50IGluZGV4LCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW5kZXggc2hvdWxkbid0IGJlIG5lZ2F0aXZlIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1BMQVlMSVNUX0FERF9JVEVNKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5hZGRQbGF5bGlzdEl0ZW0obUNvbnRyb2xsZXJTdHViLCBpbmRleCwgaXRlbS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGxheWxpc3RJdGVtX2ltcGwoTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9QTEFZTElTVF9SRU1PVkVfSVRFTSk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIucmVtb3ZlUGxheWxpc3RJdGVtKG1Db250cm9sbGVyU3R1YiwgaXRlbS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVwbGFjZVBsYXlsaXN0SXRlbV9pbXBsKGludCBpbmRleCwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImluZGV4IHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9QTEFZTElTVF9SRVBMQUNFX0lURU0pOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnJlcGxhY2VQbGF5bGlzdEl0ZW0obUNvbnRyb2xsZXJTdHViLCBpbmRleCwgaXRlbS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRTaHVmZmxlTW9kZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVNodWZmbGVNb2RlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFNodWZmbGVNb2RlX2ltcGwoaW50IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoCi0gICAgICAgICAgICAgICAgQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9TSFVGRkxFX01PREUpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNldFNodWZmbGVNb2RlKG1Db250cm9sbGVyU3R1Yiwgc2h1ZmZsZU1vZGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFJlcGVhdE1vZGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1SZXBlYXRNb2RlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFJlcGVhdE1vZGVfaW1wbChpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfUkVQRUFUX01PREUpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNldFJlcGVhdE1vZGUobUNvbnRyb2xsZXJTdHViLCByZXBlYXRNb2RlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFBsYXliYWNrSW5mbyBnZXRQbGF5YmFja0luZm9faW1wbCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5YmFja0luZm87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFBsYXllclN0YXRlX2ltcGwoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWVyU3RhdGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRDdXJyZW50UG9zaXRpb25faW1wbCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbG9uZyB0aW1lRGlmZiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gbVBvc2l0aW9uRXZlbnRUaW1lTXM7Ci0gICAgICAgICAgICBsb25nIGV4cGVjdGVkUG9zaXRpb24gPSBtUG9zaXRpb25NcyArIChsb25nKSAobVBsYXliYWNrU3BlZWQgKiB0aW1lRGlmZik7Ci0gICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgZXhwZWN0ZWRQb3NpdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmxvYXQgZ2V0UGxheWJhY2tTcGVlZF9pbXBsKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXliYWNrU3BlZWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRCdWZmZXJlZFBvc2l0aW9uX2ltcGwoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtQnVmZmVyZWRQb3NpdGlvbk1zOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhSXRlbTIgZ2V0Q3VycmVudE1lZGlhSXRlbV9pbXBsKCkgewotICAgICAgICAvLyBUT0RPKGphZXdhbik6IEltcGxlbWVudAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hQbGF5ZXJTdGF0ZUNoYW5nZXMoZmluYWwgaW50IHN0YXRlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1QbGF5ZXJTdGF0ZSA9IHN0YXRlOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblBsYXllclN0YXRlQ2hhbmdlZChtSW5zdGFuY2UsIHN0YXRlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLy8gVE9ETyhqYWV3YW4pOiBSZW5hbWUgdG8gc2VlayBjb21wbGV0ZWQKLSAgICB2b2lkIHB1c2hQb3NpdGlvbkNoYW5nZXMoZmluYWwgbG9uZyBldmVudFRpbWVNcywgZmluYWwgbG9uZyBwb3NpdGlvbk1zKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1Qb3NpdGlvbkV2ZW50VGltZU1zID0gZXZlbnRUaW1lTXM7Ci0gICAgICAgICAgICBtUG9zaXRpb25NcyA9IHBvc2l0aW9uTXM7Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoIW1JbnN0YW5jZS5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNhbGxiYWNrLm9uU2Vla0NvbXBsZXRlZChtSW5zdGFuY2UsIHBvc2l0aW9uTXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hQbGF5YmFja1NwZWVkQ2hhbmdlcyhmaW5hbCBmbG9hdCBzcGVlZCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtUGxheWJhY2tTcGVlZCA9IHNwZWVkOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblBsYXliYWNrU3BlZWRDaGFuZ2VkKG1JbnN0YW5jZSwgc3BlZWQpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hCdWZmZXJlZFBvc2l0aW9uQ2hhbmdlcyhmaW5hbCBsb25nIGJ1ZmZlcmVkUG9zaXRpb25NcykgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtQnVmZmVyZWRQb3NpdGlvbk1zID0gYnVmZmVyZWRQb3NpdGlvbk1zOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogRml4IHRoaXMgLS0gaXQncyBub3cgYnVmZmVyZWQgc3RhdGUKLSAgICAgICAgICAgIC8vbUNhbGxiYWNrLm9uQnVmZmVyZWRQb3NpdGlvbkNoYW5nZWQobUluc3RhbmNlLCBidWZmZXJlZFBvc2l0aW9uTXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hQbGF5YmFja0luZm9DaGFuZ2VzKGZpbmFsIFBsYXliYWNrSW5mbyBpbmZvKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1QbGF5YmFja0luZm8gPSBpbmZvOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblBsYXliYWNrSW5mb0NoYW5nZWQobUluc3RhbmNlLCBpbmZvKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoUGxheWxpc3RDaGFuZ2VzKGZpbmFsIExpc3Q8TWVkaWFJdGVtMj4gcGxheWxpc3QsIGZpbmFsIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1QbGF5bGlzdCA9IHBsYXlsaXN0OwotICAgICAgICAgICAgbVBsYXlsaXN0TWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWQobUluc3RhbmNlLCBwbGF5bGlzdCwgbWV0YWRhdGEpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hQbGF5bGlzdE1ldGFkYXRhQ2hhbmdlcyhNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtUGxheWxpc3RNZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKG1JbnN0YW5jZSwgbWV0YWRhdGEpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hTaHVmZmxlTW9kZUNoYW5nZXMoaW50IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1TaHVmZmxlTW9kZSA9IHNodWZmbGVNb2RlOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblNodWZmbGVNb2RlQ2hhbmdlZChtSW5zdGFuY2UsIHNodWZmbGVNb2RlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoUmVwZWF0TW9kZUNoYW5nZXMoaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbVJlcGVhdE1vZGUgPSByZXBlYXRNb2RlOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJlcGVhdE1vZGVDaGFuZ2VkKG1JbnN0YW5jZSwgcmVwZWF0TW9kZSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgcHVzaEVycm9yKGludCBlcnJvckNvZGUsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoIW1JbnN0YW5jZS5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNhbGxiYWNrLm9uRXJyb3IobUluc3RhbmNlLCBlcnJvckNvZGUsIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vIFNob3VsZCBiZSB1c2VkIHdpdGhvdXQgYSBsb2NrIHRvIHByZXZlbnQgcG90ZW50aWFsIGRlYWRsb2NrLgotICAgIHZvaWQgb25Db25uZWN0ZWROb3RMb2NrZWQoSU1lZGlhU2Vzc2lvbjIgc2Vzc2lvbkJpbmRlciwKLSAgICAgICAgICAgIGZpbmFsIFNlc3Npb25Db21tYW5kR3JvdXAyIGFsbG93ZWRDb21tYW5kcywKLSAgICAgICAgICAgIGZpbmFsIGludCBwbGF5ZXJTdGF0ZSwKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgcG9zaXRpb25FdmVudFRpbWVNcywKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgcG9zaXRpb25NcywKLSAgICAgICAgICAgIGZpbmFsIGZsb2F0IHBsYXliYWNrU3BlZWQsCi0gICAgICAgICAgICBmaW5hbCBsb25nIGJ1ZmZlcmVkUG9zaXRpb25NcywKLSAgICAgICAgICAgIGZpbmFsIFBsYXliYWNrSW5mbyBpbmZvLAotICAgICAgICAgICAgZmluYWwgaW50IHJlcGVhdE1vZGUsCi0gICAgICAgICAgICBmaW5hbCBpbnQgc2h1ZmZsZU1vZGUsCi0gICAgICAgICAgICBmaW5hbCBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0LAotICAgICAgICAgICAgZmluYWwgUGVuZGluZ0ludGVudCBzZXNzaW9uQWN0aXZpdHkpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvbkNvbm5lY3RlZE5vdExvY2tlZCBzZXNzaW9uQmluZGVyPSIgKyBzZXNzaW9uQmluZGVyCi0gICAgICAgICAgICAgICAgICAgICsgIiwgYWxsb3dlZENvbW1hbmRzPSIgKyBhbGxvd2VkQ29tbWFuZHMpOwotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gY2xvc2UgPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uQmluZGVyID09IG51bGwgfHwgYWxsb3dlZENvbW1hbmRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBDb25uZWN0aW9uIHJlamVjdGVkLgotICAgICAgICAgICAgICAgIGNsb3NlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Jc1JlbGVhc2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1TZXNzaW9uQmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ2Fubm90IGJlIG5vdGlmaWVkIGFib3V0IHRoZSBjb25uZWN0aW9uIHJlc3VsdCBtYW55IHRpbWVzLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgUHJvYmFibHkgYSBidWcgb3IgbWFsaWNpb3VzIGFwcC4iKTsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2UgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1BbGxvd2VkQ29tbWFuZHMgPSBhbGxvd2VkQ29tbWFuZHM7Ci0gICAgICAgICAgICAgICAgbVBsYXllclN0YXRlID0gcGxheWVyU3RhdGU7Ci0gICAgICAgICAgICAgICAgbVBvc2l0aW9uRXZlbnRUaW1lTXMgPSBwb3NpdGlvbkV2ZW50VGltZU1zOwotICAgICAgICAgICAgICAgIG1Qb3NpdGlvbk1zID0gcG9zaXRpb25NczsKLSAgICAgICAgICAgICAgICBtUGxheWJhY2tTcGVlZCA9IHBsYXliYWNrU3BlZWQ7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlcmVkUG9zaXRpb25NcyA9IGJ1ZmZlcmVkUG9zaXRpb25NczsKLSAgICAgICAgICAgICAgICBtUGxheWJhY2tJbmZvID0gaW5mbzsKLSAgICAgICAgICAgICAgICBtUmVwZWF0TW9kZSA9IHJlcGVhdE1vZGU7Ci0gICAgICAgICAgICAgICAgbVNodWZmbGVNb2RlID0gc2h1ZmZsZU1vZGU7Ci0gICAgICAgICAgICAgICAgbVBsYXlsaXN0ID0gcGxheWxpc3Q7Ci0gICAgICAgICAgICAgICAgbVNlc3Npb25BY3Rpdml0eSA9IHNlc3Npb25BY3Rpdml0eTsKLSAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlciA9IHNlc3Npb25CaW5kZXI7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gZm9yIHRoZSBsb2NhbCBiaW5kZXIgaXMgbm8tb3AsCi0gICAgICAgICAgICAgICAgICAgIC8vIHNvIGNhbiBiZSB1c2VkIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgZGVhZGxvY2suCi0gICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyLmFzQmluZGVyKCkubGlua1RvRGVhdGgobURlYXRoUmVjaXBpZW50LCAwKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlNlc3Npb24gZGllZCB0b28gZWFybHkuIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2xvc2UgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBLZWVwIGNvbW1hbmRzIHRvIHByZXZlbnRzIGlsbGVnYWwgQVBJIGNhbGxzLgotICAgICAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICAgICAgLy8gTm90ZTogV2UgbWF5IHRyaWdnZXIgQ29udHJvbGxlckNhbGxiYWNrcyB3aXRoIHRoZSBpbml0aWFsIHZhbHVlcwotICAgICAgICAgICAgICAgIC8vIEJ1dCBpdCdzIGhhcmQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiB0aGUgY29udHJvbGxlciBjYWxsYmFja3MKLSAgICAgICAgICAgICAgICAvLyBPbmx5IG5vdGlmeSBhYm91dCB0aGUKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25Db25uZWN0ZWQobUluc3RhbmNlLCBhbGxvd2VkQ29tbWFuZHMpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoY2xvc2UpIHsKLSAgICAgICAgICAgICAgICAvLyBUcmljayB0byBjYWxsIHJlbGVhc2UoKSB3aXRob3V0IGhvbGRpbmcgdGhlIGxvY2ssIHRvIHByZXZlbnQgcG90ZW50aWFsIGRlYWRsb2NrCi0gICAgICAgICAgICAgICAgLy8gd2l0aCB0aGUgZGV2ZWxvcGVyJ3MgY3VzdG9tIGxvY2sgd2l0aGluIHRoZSBDb250cm9sbGVyQ2FsbGJhY2sub25EaXNjb25uZWN0ZWQoKS4KLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgb25DdXN0b21Db21tYW5kKGZpbmFsIFNlc3Npb25Db21tYW5kMiBjb21tYW5kLCBmaW5hbCBCdW5kbGUgYXJncywKLSAgICAgICAgICAgIGZpbmFsIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25DdXN0b21Db21tYW5kIGNtZD0iICsgY29tbWFuZCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IERvdWJsZSBjaGVjayBpZiB0aGUgY29udHJvbGxlciBleGlzdHMuCi0gICAgICAgICAgICBtQ2FsbGJhY2sub25DdXN0b21Db21tYW5kKG1JbnN0YW5jZSwgY29tbWFuZCwgYXJncywgcmVjZWl2ZXIpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIG9uQWxsb3dlZENvbW1hbmRzQ2hhbmdlZChmaW5hbCBTZXNzaW9uQ29tbWFuZEdyb3VwMiBjb21tYW5kcykgewotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQobUluc3RhbmNlLCBjb21tYW5kcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgb25DdXN0b21MYXlvdXRDaGFuZ2VkKGZpbmFsIExpc3Q8Q29tbWFuZEJ1dHRvbj4gbGF5b3V0KSB7Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uQ3VzdG9tTGF5b3V0Q2hhbmdlZChtSW5zdGFuY2UsIGxheW91dCk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgb24gdGhlIG1haW4gdGhyZWFkLgotICAgIHByaXZhdGUgY2xhc3MgU2Vzc2lvblNlcnZpY2VDb25uZWN0aW9uIGltcGxlbWVudHMgU2VydmljZUNvbm5lY3Rpb24gewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSwgSUJpbmRlciBzZXJ2aWNlKSB7Ci0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgaXQncyBhbHdheXMgbWFpbi10aHJlYWQuCi0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblNlcnZpY2VDb25uZWN0ZWQgIiArIG5hbWUgKyAiICIgKyB0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFNhbml0eSBjaGVjawotICAgICAgICAgICAgaWYgKCFtVG9rZW4uZ2V0UGFja2FnZU5hbWUoKS5lcXVhbHMobmFtZS5nZXRQYWNrYWdlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIExvZy53dGYoVEFHLCBuYW1lICsgIiB3YXMgY29ubmVjdGVkLCBidXQgZXhwZWN0ZWQgcGtnPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbVRva2VuLmdldFBhY2thZ2VOYW1lKCkgKyAiIHdpdGggaWQ9IiArIG1Ub2tlbi5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBzZXNzaW9uQmluZGVyID0gSU1lZGlhU2Vzc2lvbjIuU3R1Yi5hc0ludGVyZmFjZShzZXJ2aWNlKTsKLSAgICAgICAgICAgIGNvbm5lY3RUb1Nlc3Npb24oc2Vzc2lvbkJpbmRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSkgewotICAgICAgICAgICAgLy8gVGVtcG9yYWwgbG9zZSBvZiB0aGUgYmluZGluZyBiZWNhdXNlIG9mIHRoZSBzZXJ2aWNlIGNyYXNoLiBTeXN0ZW0gd2lsbCBhdXRvbWF0aWNhbGx5Ci0gICAgICAgICAgICAvLyByZWJpbmQsIHNvIGp1c3Qgbm8tb3AuCi0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJlYWxseT8gRWl0aGVyIGRpc2Nvbm5lY3QgY2xlYW5seSBvcgotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBzZXJ2aWNlICIgKyBuYW1lICsgIiBpcyBkaXNjb25uZWN0ZWQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25CaW5kaW5nRGllZChDb21wb25lbnROYW1lIG5hbWUpIHsKLSAgICAgICAgICAgIC8vIFBlcm1hbmVudCBsb3NlIG9mIHRoZSBiaW5kaW5nIGJlY2F1c2Ugb2YgdGhlIHNlcnZpY2UgcGFja2FnZSB1cGRhdGUgb3IgcmVtb3ZlZC4KLSAgICAgICAgICAgIC8vIFRoaXMgU2Vzc2lvblNlcnZpY2VSZWNvcmQgd2lsbCBiZSByZW1vdmVkIGFjY29yZGluZ2x5LCBidXQgZm9yZ2V0IHNlc3Npb24gYmluZGVyIGhlcmUKLSAgICAgICAgICAgIC8vIGZvciBzdXJlLgotICAgICAgICAgICAgbUluc3RhbmNlLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBsYXliYWNrSW5mb0ltcGwgaW1wbGVtZW50cyBQbGF5YmFja0luZm9Qcm92aWRlciB7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QTEFZQkFDS19UWVBFID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5wbGF5YmFja2luZm9faW1wbC5wbGF5YmFja190eXBlIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05UUk9MX1RZUEUgPQotICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLnBsYXliYWNraW5mb19pbXBsLmNvbnRyb2xfdHlwZSI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUFYX1ZPTFVNRSA9Ci0gICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEucGxheWJhY2tpbmZvX2ltcGwubWF4X3ZvbHVtZSI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ1VSUkVOVF9WT0xVTUUgPQotICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLnBsYXliYWNraW5mb19pbXBsLmN1cnJlbnRfdm9sdW1lIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BVURJT19BVFRSSUJVVEVTID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5wbGF5YmFja2luZm9faW1wbC5hdWRpb19hdHRycyI7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBQbGF5YmFja0luZm8gbUluc3RhbmNlOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1QbGF5YmFja1R5cGU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1Db250cm9sVHlwZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU1heFZvbHVtZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUN1cnJlbnRWb2x1bWU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQXVkaW9BdHRyaWJ1dGVzIG1BdWRpb0F0dHJzOwotCi0gICAgICAgIHByaXZhdGUgUGxheWJhY2tJbmZvSW1wbChpbnQgcGxheWJhY2tUeXBlLCBBdWRpb0F0dHJpYnV0ZXMgYXR0cnMsIGludCBjb250cm9sVHlwZSwKLSAgICAgICAgICAgICAgICBpbnQgbWF4LCBpbnQgY3VycmVudCkgewotICAgICAgICAgICAgbVBsYXliYWNrVHlwZSA9IHBsYXliYWNrVHlwZTsKLSAgICAgICAgICAgIG1BdWRpb0F0dHJzID0gYXR0cnM7Ci0gICAgICAgICAgICBtQ29udHJvbFR5cGUgPSBjb250cm9sVHlwZTsKLSAgICAgICAgICAgIG1NYXhWb2x1bWUgPSBtYXg7Ci0gICAgICAgICAgICBtQ3VycmVudFZvbHVtZSA9IGN1cnJlbnQ7Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBuZXcgUGxheWJhY2tJbmZvKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UGxheWJhY2tUeXBlX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXliYWNrVHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQXVkaW9BdHRyaWJ1dGVzIGdldEF1ZGlvQXR0cmlidXRlc19pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1BdWRpb0F0dHJzOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q29udHJvbFR5cGVfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbFR5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRNYXhWb2x1bWVfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtTWF4Vm9sdW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q3VycmVudFZvbHVtZV9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1DdXJyZW50Vm9sdW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgUGxheWJhY2tJbmZvIGdldEluc3RhbmNlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEJ1bmRsZSB0b0J1bmRsZSgpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBidW5kbGUucHV0SW50KEtFWV9QTEFZQkFDS19UWVBFLCBtUGxheWJhY2tUeXBlKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX0NPTlRST0xfVFlQRSwgbUNvbnRyb2xUeXBlKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX01BWF9WT0xVTUUsIG1NYXhWb2x1bWUpOwotICAgICAgICAgICAgYnVuZGxlLnB1dEludChLRVlfQ1VSUkVOVF9WT0xVTUUsIG1DdXJyZW50Vm9sdW1lKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRQYXJjZWxhYmxlKEtFWV9BVURJT19BVFRSSUJVVEVTLCBtQXVkaW9BdHRycyk7Ci0gICAgICAgICAgICByZXR1cm4gYnVuZGxlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIFBsYXliYWNrSW5mbyBjcmVhdGVQbGF5YmFja0luZm8oaW50IHBsYXliYWNrVHlwZSwgQXVkaW9BdHRyaWJ1dGVzIGF0dHJzLAotICAgICAgICAgICAgICAgIGludCBjb250cm9sVHlwZSwgaW50IG1heCwgaW50IGN1cnJlbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUGxheWJhY2tJbmZvSW1wbChwbGF5YmFja1R5cGUsIGF0dHJzLCBjb250cm9sVHlwZSwgbWF4LCBjdXJyZW50KQotICAgICAgICAgICAgICAgICAgICAuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBQbGF5YmFja0luZm8gZnJvbUJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIGludCB2b2x1bWVUeXBlID0gYnVuZGxlLmdldEludChLRVlfUExBWUJBQ0tfVFlQRSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgdm9sdW1lQ29udHJvbCA9IGJ1bmRsZS5nZXRJbnQoS0VZX0NPTlRST0xfVFlQRSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbWF4Vm9sdW1lID0gYnVuZGxlLmdldEludChLRVlfTUFYX1ZPTFVNRSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY3VycmVudFZvbHVtZSA9IGJ1bmRsZS5nZXRJbnQoS0VZX0NVUlJFTlRfVk9MVU1FKTsKLSAgICAgICAgICAgIGZpbmFsIEF1ZGlvQXR0cmlidXRlcyBhdHRycyA9IGJ1bmRsZS5nZXRQYXJjZWxhYmxlKEtFWV9BVURJT19BVFRSSUJVVEVTKTsKLQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVBsYXliYWNrSW5mbyh2b2x1bWVUeXBlLCBhdHRycywgdm9sdW1lQ29udHJvbCwgbWF4Vm9sdW1lLCBjdXJyZW50Vm9sdW1lKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFDb250cm9sbGVyMlN0dWIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFDb250cm9sbGVyMlN0dWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNmYzVkZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQ29udHJvbGxlcjJTdHViLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5Db21tYW5kQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmRHcm91cDI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIySW1wbC5QbGF5YmFja0luZm9JbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRCdXR0b25JbXBsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYUNvbnRyb2xsZXIyU3R1YiBleHRlbmRzIElNZWRpYUNvbnRyb2xsZXIyLlN0dWIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFDb250cm9sbGVyMlN0dWIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOyAvLyBUT0RPKGphZXdhbik6IENoYW5nZQotCi0gICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPE1lZGlhQ29udHJvbGxlcjJJbXBsPiBtQ29udHJvbGxlcjsKLQotICAgIE1lZGlhQ29udHJvbGxlcjJTdHViKE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgbUNvbnRyb2xsZXIgPSBuZXcgV2Vha1JlZmVyZW5jZTw+KGNvbnRyb2xsZXIpOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFDb250cm9sbGVyMkltcGwgZ2V0Q29udHJvbGxlcigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyID0gbUNvbnRyb2xsZXIuZ2V0KCk7Ci0gICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvbnRyb2xsZXIgaXMgcmVsZWFzZWQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29udHJvbGxlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhQnJvd3NlcjJJbXBsIGdldEJyb3dzZXIoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgaW5zdGFuY2VvZiBNZWRpYUJyb3dzZXIySW1wbCkgewotICAgICAgICAgICAgcmV0dXJuIChNZWRpYUJyb3dzZXIySW1wbCkgY29udHJvbGxlcjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgewotICAgICAgICBtQ29udHJvbGxlci5jbGVhcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUGxheWVyU3RhdGVDaGFuZ2VkKGludCBzdGF0ZSkgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIucHVzaFBsYXllclN0YXRlQ2hhbmdlcyhzdGF0ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25Qb3NpdGlvbkNoYW5nZWQobG9uZyBldmVudFRpbWVNcywgbG9uZyBwb3NpdGlvbk1zKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV2ZW50VGltZU1zIDwgMCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25Qb3NpdGlvbkNoYW5nZWQoKTogSWdub3JpbmcgbmVnYXRpdmUgZXZlbnRUaW1lTXMiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAocG9zaXRpb25NcyA8IDApIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uUG9zaXRpb25DaGFuZ2VkKCk6IElnbm9yaW5nIG5lZ2F0aXZlIHBvc2l0aW9uTXMiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLnB1c2hQb3NpdGlvbkNoYW5nZXMoZXZlbnRUaW1lTXMsIHBvc2l0aW9uTXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUGxheWJhY2tTcGVlZENoYW5nZWQoZmxvYXQgc3BlZWQpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLnB1c2hQbGF5YmFja1NwZWVkQ2hhbmdlcyhzcGVlZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25CdWZmZXJlZFBvc2l0aW9uQ2hhbmdlZChsb25nIGJ1ZmZlcmVkUG9zaXRpb25NcykgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChidWZmZXJlZFBvc2l0aW9uTXMgPCAwKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvbkJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VkKCk6IElnbm9yaW5nIG5lZ2F0aXZlIGJ1ZmZlcmVkUG9zaXRpb25NcyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIucHVzaEJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VzKGJ1ZmZlcmVkUG9zaXRpb25Ncyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25QbGF5bGlzdENoYW5nZWQoTGlzdDxCdW5kbGU+IHBsYXlsaXN0QnVuZGxlLCBCdW5kbGUgbWV0YWRhdGFCdW5kbGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAocGxheWxpc3RCdW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25QbGF5bGlzdENoYW5nZWQoKTogSWdub3JpbmcgbnVsbCBwbGF5bGlzdCBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIGZvciAoQnVuZGxlIGJ1bmRsZSA6IHBsYXlsaXN0QnVuZGxlKSB7Ci0gICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBNZWRpYUl0ZW0yLmZyb21CdW5kbGUoYnVuZGxlKTsKLSAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJvblBsYXlsaXN0Q2hhbmdlZCgpOiBJZ25vcmluZyBudWxsIGl0ZW0gaW4gcGxheWxpc3QiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcGxheWxpc3QuYWRkKGl0ZW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhID0gTWVkaWFNZXRhZGF0YTIuZnJvbUJ1bmRsZShtZXRhZGF0YUJ1bmRsZSk7Ci0gICAgICAgIGNvbnRyb2xsZXIucHVzaFBsYXlsaXN0Q2hhbmdlcyhwbGF5bGlzdCwgbWV0YWRhdGEpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQoQnVuZGxlIG1ldGFkYXRhQnVuZGxlKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEgPSBNZWRpYU1ldGFkYXRhMi5mcm9tQnVuZGxlKG1ldGFkYXRhQnVuZGxlKTsKLSAgICAgICAgY29udHJvbGxlci5wdXNoUGxheWxpc3RNZXRhZGF0YUNoYW5nZXMobWV0YWRhdGEpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUmVwZWF0TW9kZUNoYW5nZWQoaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLnB1c2hSZXBlYXRNb2RlQ2hhbmdlcyhyZXBlYXRNb2RlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblBsYXliYWNrSW5mb0NoYW5nZWQoQnVuZGxlIHBsYXliYWNrSW5mbykgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uUGxheWJhY2tJbmZvQ2hhbmdlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgTWVkaWFDb250cm9sbGVyMi5QbGF5YmFja0luZm8gaW5mbyA9IFBsYXliYWNrSW5mb0ltcGwuZnJvbUJ1bmRsZShwbGF5YmFja0luZm8pOwotICAgICAgICBpZiAoaW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvblBsYXliYWNrSW5mb0NoYW5nZWQoKTogSWdub3JpbmcgbnVsbCBwbGF5YmFja0luZm8iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLnB1c2hQbGF5YmFja0luZm9DaGFuZ2VzKGluZm8pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkKGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIucHVzaFNodWZmbGVNb2RlQ2hhbmdlcyhzaHVmZmxlTW9kZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25FcnJvcihpbnQgZXJyb3JDb2RlLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5wdXNoRXJyb3IoZXJyb3JDb2RlLCBleHRyYXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ29ubmVjdGVkKElNZWRpYVNlc3Npb24yIHNlc3Npb25CaW5kZXIsIEJ1bmRsZSBjb21tYW5kR3JvdXAsCi0gICAgICAgICAgICBpbnQgcGxheWVyU3RhdGUsIGxvbmcgcG9zaXRpb25FdmVudFRpbWVNcywgbG9uZyBwb3NpdGlvbk1zLCBmbG9hdCBwbGF5YmFja1NwZWVkLAotICAgICAgICAgICAgbG9uZyBidWZmZXJlZFBvc2l0aW9uTXMsIEJ1bmRsZSBwbGF5YmFja0luZm8sIGludCBzaHVmZmxlTW9kZSwgaW50IHJlcGVhdE1vZGUsCi0gICAgICAgICAgICBMaXN0PEJ1bmRsZT4gaXRlbUJ1bmRsZUxpc3QsIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5KSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXIgPSBtQ29udHJvbGxlci5nZXQoKTsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25Db25uZWN0ZWQgYWZ0ZXIgTWVkaWFDb250cm9sbGVyMi5jbG9zZSgpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gY29udHJvbGxlci5nZXRDb250ZXh0KCk7Ci0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gaXRlbUxpc3QgPSBudWxsOwotICAgICAgICBpZiAoaXRlbUJ1bmRsZUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgaXRlbUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUJ1bmRsZUxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBNZWRpYUl0ZW0yLmZyb21CdW5kbGUoaXRlbUJ1bmRsZUxpc3QuZ2V0KGkpKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGl0ZW1MaXN0LmFkZChpdGVtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5vbkNvbm5lY3RlZE5vdExvY2tlZChzZXNzaW9uQmluZGVyLAotICAgICAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyLmZyb21CdW5kbGUoY29tbWFuZEdyb3VwKSwKLSAgICAgICAgICAgICAgICBwbGF5ZXJTdGF0ZSwgcG9zaXRpb25FdmVudFRpbWVNcywgcG9zaXRpb25NcywgcGxheWJhY2tTcGVlZCwgYnVmZmVyZWRQb3NpdGlvbk1zLAotICAgICAgICAgICAgICAgIFBsYXliYWNrSW5mb0ltcGwuZnJvbUJ1bmRsZShwbGF5YmFja0luZm8pLCByZXBlYXRNb2RlLCBzaHVmZmxlTW9kZSwKLSAgICAgICAgICAgICAgICBpdGVtTGlzdCwgc2Vzc2lvbkFjdGl2aXR5KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRpc2Nvbm5lY3RlZCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlciA9IG1Db250cm9sbGVyLmdldCgpOwotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvbkRpc2Nvbm5lY3RlZCBhZnRlciBNZWRpYUNvbnRyb2xsZXIyLmNsb3NlKCkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLmdldEluc3RhbmNlKCkuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkN1c3RvbUxheW91dENoYW5nZWQoTGlzdDxCdW5kbGU+IGNvbW1hbmRCdXR0b25saXN0KSB7Ci0gICAgICAgIGlmIChjb21tYW5kQnV0dG9ubGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvbkN1c3RvbUxheW91dENoYW5nZWQoKTogSWdub3JpbmcgbnVsbCBjb21tYW5kQnV0dG9ubGlzdCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXZpc2l0IGhlcmUuIENvdWxkIGJlIGEgYnVnCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgTGlzdDxDb21tYW5kQnV0dG9uPiBsYXlvdXQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21tYW5kQnV0dG9ubGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgQ29tbWFuZEJ1dHRvbiBidXR0b24gPSBDb21tYW5kQnV0dG9uSW1wbC5mcm9tQnVuZGxlKGNvbW1hbmRCdXR0b25saXN0LmdldChpKSk7Ci0gICAgICAgICAgICBpZiAoYnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsYXlvdXQuYWRkKGJ1dHRvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5vbkN1c3RvbUxheW91dENoYW5nZWQobGF5b3V0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQoQnVuZGxlIGNvbW1hbmRzQnVuZGxlKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXZpc2l0IGhlcmUuIENvdWxkIGJlIGEgYnVnCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgU2Vzc2lvbkNvbW1hbmRHcm91cDIgY29tbWFuZHMgPSBTZXNzaW9uQ29tbWFuZEdyb3VwMi5mcm9tQnVuZGxlKGNvbW1hbmRzQnVuZGxlKTsKLSAgICAgICAgaWYgKGNvbW1hbmRzID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uQWxsb3dlZENvbW1hbmRzQ2hhbmdlZCgpOiBJZ25vcmluZyBudWxsIGNvbW1hbmRzIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5vbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQoY29tbWFuZHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ3VzdG9tQ29tbWFuZChCdW5kbGUgY29tbWFuZEJ1bmRsZSwgQnVuZGxlIGFyZ3MsIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQgPSBTZXNzaW9uQ29tbWFuZDIuZnJvbUJ1bmRsZShjb21tYW5kQnVuZGxlKTsKLSAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25DdXN0b21Db21tYW5kKCk6IElnbm9yaW5nIG51bGwgY29tbWFuZCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIub25DdXN0b21Db21tYW5kKGNvbW1hbmQsIGFyZ3MsIHJlY2VpdmVyKTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIE1lZGlhQnJvd3NlciBzcGVjaWZpYwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25HZXRMaWJyYXJ5Um9vdERvbmUoQnVuZGxlIHJvb3RIaW50cywgU3RyaW5nIHJvb3RNZWRpYUlkLCBCdW5kbGUgcm9vdEV4dHJhKQotICAgICAgICAgICAgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBNZWRpYUJyb3dzZXIySW1wbCBicm93c2VyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnJvd3NlciA9IGdldEJyb3dzZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChicm93c2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmV2aXNpdCBoZXJlLiBDb3VsZCBiZSBhIGJ1ZwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGJyb3dzZXIub25HZXRMaWJyYXJ5Um9vdERvbmUocm9vdEhpbnRzLCByb290TWVkaWFJZCwgcm9vdEV4dHJhKTsKLSAgICB9Ci0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uR2V0SXRlbURvbmUoU3RyaW5nIG1lZGlhSWQsIEJ1bmRsZSBpdGVtQnVuZGxlKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uR2V0SXRlbURvbmUoKTogSWdub3JpbmcgbnVsbCBtZWRpYUlkIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFCcm93c2VyMkltcGwgYnJvd3NlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJyb3dzZXIgPSBnZXRCcm93c2VyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnJvd3NlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBicm93c2VyLm9uR2V0SXRlbURvbmUobWVkaWFJZCwgTWVkaWFJdGVtMi5mcm9tQnVuZGxlKGl0ZW1CdW5kbGUpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkdldENoaWxkcmVuRG9uZShTdHJpbmcgcGFyZW50SWQsIGludCBwYWdlLCBpbnQgcGFnZVNpemUsCi0gICAgICAgICAgICBMaXN0PEJ1bmRsZT4gaXRlbUJ1bmRsZUxpc3QsIEJ1bmRsZSBleHRyYXMpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uR2V0Q2hpbGRyZW5Eb25lKCk6IElnbm9yaW5nIG51bGwgcGFyZW50SWQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYUJyb3dzZXIySW1wbCBicm93c2VyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnJvd3NlciA9IGdldEJyb3dzZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChicm93c2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmV2aXNpdCBoZXJlLiBDb3VsZCBiZSBhIGJ1ZwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiByZXN1bHQgPSBudWxsOwotICAgICAgICBpZiAoaXRlbUJ1bmRsZUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBmb3IgKEJ1bmRsZSBidW5kbGUgOiBpdGVtQnVuZGxlTGlzdCkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoTWVkaWFJdGVtMi5mcm9tQnVuZGxlKGJ1bmRsZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyb3dzZXIub25HZXRDaGlsZHJlbkRvbmUocGFyZW50SWQsIHBhZ2UsIHBhZ2VTaXplLCByZXN1bHQsIGV4dHJhcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TZWFyY2hSZXN1bHRDaGFuZ2VkKFN0cmluZyBxdWVyeSwgaW50IGl0ZW1Db3VudCwgQnVuZGxlIGV4dHJhcykKLSAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25TZWFyY2hSZXN1bHRDaGFuZ2VkKCk6IElnbm9yaW5nIGVtcHR5IHF1ZXJ5Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFCcm93c2VyMkltcGwgYnJvd3NlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJyb3dzZXIgPSBnZXRCcm93c2VyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnJvd3NlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBicm93c2VyLm9uU2VhcmNoUmVzdWx0Q2hhbmdlZChxdWVyeSwgaXRlbUNvdW50LCBleHRyYXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uR2V0U2VhcmNoUmVzdWx0RG9uZShTdHJpbmcgcXVlcnksIGludCBwYWdlLCBpbnQgcGFnZVNpemUsCi0gICAgICAgICAgICBMaXN0PEJ1bmRsZT4gaXRlbUJ1bmRsZUxpc3QsIEJ1bmRsZSBleHRyYXMpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25HZXRTZWFyY2hSZXN1bHREb25lKCk6IElnbm9yaW5nIGVtcHR5IHF1ZXJ5Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFCcm93c2VyMkltcGwgYnJvd3NlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJyb3dzZXIgPSBnZXRCcm93c2VyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnJvd3NlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgaWYgKGl0ZW1CdW5kbGVMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChCdW5kbGUgYnVuZGxlIDogaXRlbUJ1bmRsZUxpc3QpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKE1lZGlhSXRlbTIuZnJvbUJ1bmRsZShidW5kbGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicm93c2VyLm9uR2V0U2VhcmNoUmVzdWx0RG9uZShxdWVyeSwgcGFnZSwgcGFnZVNpemUsIHJlc3VsdCwgZXh0cmFzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkNoaWxkcmVuQ2hhbmdlZChTdHJpbmcgcGFyZW50SWQsIGludCBpdGVtQ291bnQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uQ2hpbGRyZW5DaGFuZ2VkKCk6IElnbm9yaW5nIG51bGwgcGFyZW50SWQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYUJyb3dzZXIySW1wbCBicm93c2VyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnJvd3NlciA9IGdldEJyb3dzZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChicm93c2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmV2aXNpdCBoZXJlLiBDb3VsZCBiZSBhIGJ1ZwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGJyb3dzZXIub25DaGlsZHJlbkNoYW5nZWQocGFyZW50SWQsIGl0ZW1Db3VudCwgZXh0cmFzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhSXRlbTJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhSXRlbTJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMGEwZjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUl0ZW0ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yLkZMQUdfQlJPV1NBQkxFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTIuRkxBR19QTEFZQUJMRTsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTIuQnVpbGRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTIuRmxhZ3M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUl0ZW0yUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5VVUlEOwotCi1wdWJsaWMgY2xhc3MgTWVkaWFJdGVtMkltcGwgaW1wbGVtZW50cyBNZWRpYUl0ZW0yUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfSUQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWl0ZW0yLmlkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0ZMQUdTID0gImFuZHJvaWQubWVkaWEubWVkaWFpdGVtMi5mbGFncyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NRVRBREFUQSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhaXRlbTIubWV0YWRhdGEiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVVVJRCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhaXRlbTIudXVpZCI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhSXRlbTIgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1JZDsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtRmxhZ3M7Ci0gICAgcHJpdmF0ZSBmaW5hbCBVVUlEIG1VVUlEOwotICAgIHByaXZhdGUgTWVkaWFNZXRhZGF0YTIgbU1ldGFkYXRhOwotICAgIHByaXZhdGUgRGF0YVNvdXJjZURlc2MgbURhdGFTb3VyY2VEZXNjOwotCi0gICAgLy8gRnJvbSB0aGUgcHVibGljIEFQSQotICAgIHB1YmxpYyBNZWRpYUl0ZW0ySW1wbChATm9uTnVsbCBTdHJpbmcgbWVkaWFJZCwgQE51bGxhYmxlIERhdGFTb3VyY2VEZXNjIGRzZCwKLSAgICAgICAgICAgIEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSwgQEZsYWdzIGludCBmbGFncykgewotICAgICAgICB0aGlzKG1lZGlhSWQsIGRzZCwgbWV0YWRhdGEsIGZsYWdzLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhSXRlbTJJbXBsKEBOb25OdWxsIFN0cmluZyBtZWRpYUlkLCBATnVsbGFibGUgRGF0YVNvdXJjZURlc2MgZHNkLAotICAgICAgICAgICAgQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhLCBARmxhZ3MgaW50IGZsYWdzLCBATnVsbGFibGUgVVVJRCB1dWlkKSB7Ci0gICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1lZGlhSWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWV0YWRhdGEgIT0gbnVsbCAmJiAhVGV4dFV0aWxzLmVxdWFscyhtZWRpYUlkLCBtZXRhZGF0YS5nZXRNZWRpYUlkKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZXRhZGF0YSdzIGlkIHNob3VsZCBiZSBtYXRjaGVkIHdpdGggdGhlIG1lZGlhaWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1JZCA9IG1lZGlhSWQ7Ci0gICAgICAgIG1EYXRhU291cmNlRGVzYyA9IGRzZDsKLSAgICAgICAgbU1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgICAgIG1GbGFncyA9IGZsYWdzOwotICAgICAgICBtVVVJRCA9ICh1dWlkID09IG51bGwpID8gVVVJRC5yYW5kb21VVUlEKCkgOiB1dWlkOwotCi0gICAgICAgIG1JbnN0YW5jZSA9IG5ldyBNZWRpYUl0ZW0yKHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFsc19pbXBsKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgTWVkaWFJdGVtMikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBNZWRpYUl0ZW0yIG90aGVyID0gKE1lZGlhSXRlbTIpIG9iajsKLSAgICAgICAgcmV0dXJuIG1VVUlELmVxdWFscygoKE1lZGlhSXRlbTJJbXBsKSBvdGhlci5nZXRQcm92aWRlcigpKS5tVVVJRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoaXMgb2JqZWN0IGFzIGEgYnVuZGxlIHRvIHNoYXJlIGJldHdlZW4gcHJvY2Vzc2VzLgotICAgICAqCi0gICAgICogQHJldHVybiBhIG5ldyBidW5kbGUgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIHRvQnVuZGxlX2ltcGwoKSB7Ci0gICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoS0VZX0lELCBtSWQpOwotICAgICAgICBidW5kbGUucHV0SW50KEtFWV9GTEFHUywgbUZsYWdzKTsKLSAgICAgICAgaWYgKG1NZXRhZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidW5kbGUucHV0QnVuZGxlKEtFWV9NRVRBREFUQSwgbU1ldGFkYXRhLnRvQnVuZGxlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoS0VZX1VVSUQsIG1VVUlELnRvU3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gYnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIE1lZGlhSXRlbTIgZnJvbSB0aGUge0BsaW5rIEJ1bmRsZX0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUgd2hpY2ggd2FzIHB1Ymxpc2hlZCBieSB7QGxpbmsgTWVkaWFJdGVtMiN0b0J1bmRsZSgpfS4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIE1lZGlhSXRlbTIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhSXRlbTIgZnJvbUJ1bmRsZV9pbXBsKEBOb25OdWxsIEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmcgdXVpZFN0cmluZyA9IGJ1bmRsZS5nZXRTdHJpbmcoS0VZX1VVSUQpOwotICAgICAgICByZXR1cm4gZnJvbUJ1bmRsZShidW5kbGUsIFVVSUQuZnJvbVN0cmluZyh1dWlkU3RyaW5nKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgTWVkaWFJdGVtMiBmcm9tIHRoZSB7QGxpbmsgQnVuZGxlfSB3aXRoIHRoZSBzcGVjaWZpZWQge0BsaW5rIFVVSUR9LgotICAgICAqIElmIHtAbGluayBVVUlEfQotICAgICAqIGNhbiBiZSBudWxsIGZvciBjcmVhdGluZyBuZXcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUgd2hpY2ggd2FzIHB1Ymxpc2hlZCBieSB7QGxpbmsgTWVkaWFJdGVtMiN0b0J1bmRsZSgpfS4KLSAgICAgKiBAcGFyYW0gdXVpZCBBIHtAbGluayBVVUlEfSB0byBvdmVycmlkZS4gQ2FuIGJlIHtAbGluayBudWxsfSBmb3Igb3ZlcnJpZGUuCi0gICAgICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBNZWRpYUl0ZW0yCi0gICAgICovCi0gICAgc3RhdGljIE1lZGlhSXRlbTIgZnJvbUJ1bmRsZShATm9uTnVsbCBCdW5kbGUgYnVuZGxlLCBATnVsbGFibGUgVVVJRCB1dWlkKSB7Ci0gICAgICAgIGlmIChidW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgU3RyaW5nIGlkID0gYnVuZGxlLmdldFN0cmluZyhLRVlfSUQpOwotICAgICAgICBmaW5hbCBCdW5kbGUgbWV0YWRhdGFCdW5kbGUgPSBidW5kbGUuZ2V0QnVuZGxlKEtFWV9NRVRBREFUQSk7Ci0gICAgICAgIGZpbmFsIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhID0gTWVkaWFNZXRhZGF0YTIuZnJvbUJ1bmRsZShtZXRhZGF0YUJ1bmRsZSk7Ci0gICAgICAgIGZpbmFsIGludCBmbGFncyA9IGJ1bmRsZS5nZXRJbnQoS0VZX0ZMQUdTKTsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUl0ZW0ySW1wbChpZCwgbnVsbCwgbWV0YWRhdGEsIGZsYWdzLCB1dWlkKS5nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFJdGVtMiBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiTWVkaWFJdGVtMnsiKTsKLSAgICAgICAgc2IuYXBwZW5kKCJtRmxhZ3M9IikuYXBwZW5kKG1GbGFncyk7Ci0gICAgICAgIHNiLmFwcGVuZCgiLCBtTWV0YWRhdGE9IikuYXBwZW5kKG1NZXRhZGF0YSk7Ci0gICAgICAgIHNiLmFwcGVuZCgnfScpOwotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQEZsYWdzIGludCBnZXRGbGFnc19pbXBsKCkgewotICAgICAgICByZXR1cm4gbUZsYWdzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQnJvd3NhYmxlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiAobUZsYWdzICYgRkxBR19CUk9XU0FCTEUpICE9IDA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNQbGF5YWJsZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gKG1GbGFncyAmIEZMQUdfUExBWUFCTEUpICE9IDA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YWRhdGFfaW1wbChATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgaWYgKG1ldGFkYXRhICE9IG51bGwgJiYgIVRleHRVdGlscy5lcXVhbHMobUlkLCBtZXRhZGF0YS5nZXRNZWRpYUlkKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZXRhZGF0YSdzIGlkIHNob3VsZCBiZSBtYXRjaGVkIHdpdGggdGhlIG1lZGlhSWQiKTsKLSAgICAgICAgfQotICAgICAgICBtTWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIGdldE1ldGFkYXRhX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtTWV0YWRhdGE7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBOb25OdWxsIFN0cmluZyBnZXRNZWRpYUlkX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtSWQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBOdWxsYWJsZSBEYXRhU291cmNlRGVzYyBnZXREYXRhU291cmNlRGVzY19pbXBsKCkgewotICAgICAgICByZXR1cm4gbURhdGFTb3VyY2VEZXNjOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlckltcGwgaW1wbGVtZW50cyBNZWRpYUl0ZW0yUHJvdmlkZXIuQnVpbGRlclByb3ZpZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBCdWlsZGVyIG1JbnN0YW5jZTsKLSAgICAgICAgcHJpdmF0ZSBARmxhZ3MgaW50IG1GbGFnczsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbU1lZGlhSWQ7Ci0gICAgICAgIHByaXZhdGUgTWVkaWFNZXRhZGF0YTIgbU1ldGFkYXRhOwotICAgICAgICBwcml2YXRlIERhdGFTb3VyY2VEZXNjIG1EYXRhU291cmNlRGVzYzsKLQotICAgICAgICBwdWJsaWMgQnVpbGRlckltcGwoQnVpbGRlciBpbnN0YW5jZSwgaW50IGZsYWdzKSB7Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgICAgIG1GbGFncyA9IGZsYWdzOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldE1lZGlhSWRfaW1wbChATnVsbGFibGUgU3RyaW5nIG1lZGlhSWQpIHsKLSAgICAgICAgICAgIG1NZWRpYUlkID0gbWVkaWFJZDsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0TWV0YWRhdGFfaW1wbChATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXREYXRhU291cmNlRGVzY19pbXBsKEBOdWxsYWJsZSBEYXRhU291cmNlRGVzYyBkYXRhU291cmNlRGVzYykgewotICAgICAgICAgICAgbURhdGFTb3VyY2VEZXNjID0gZGF0YVNvdXJjZURlc2M7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBNZWRpYUl0ZW0yIGJ1aWxkX2ltcGwoKSB7Ci0gICAgICAgICAgICBTdHJpbmcgaWQgPSAobU1ldGFkYXRhICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgID8gbU1ldGFkYXRhLmdldFN0cmluZyhNZWRpYU1ldGFkYXRhMi5NRVRBREFUQV9LRVlfTUVESUFfSUQpIDogbnVsbDsKLSAgICAgICAgICAgIGlmIChpZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gIFRPRE8oamFld2FuKTogRG91YmxlIGNoZWNrIGlmIGl0cyBzdWZmaWNpZW50IChlLmcuIFVzZSBVVUlEIGluc3RlYWQ/KQotICAgICAgICAgICAgICAgIGlkID0gKG1NZWRpYUlkICE9IG51bGwpID8gbU1lZGlhSWQgOiB0b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUl0ZW0ySW1wbChpZCwgbURhdGFTb3VyY2VEZXNjLCBtTWV0YWRhdGEsIG1GbGFncykuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFMaWJyYXJ5U2VydmljZTJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhTGlicmFyeVNlcnZpY2UySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjM0Y2Q0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFMaWJyYXJ5U2VydmljZTJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyLkxpYnJhcnlSb290OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTIuTWVkaWFMaWJyYXJ5U2Vzc2lvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyLk1lZGlhTGlicmFyeVNlc3Npb24uQnVpbGRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyLk1lZGlhTGlicmFyeVNlc3Npb24uTWVkaWFMaWJyYXJ5U2Vzc2lvbkNhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29udHJvbGxlckluZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFMaWJyYXJ5U2VydmljZTJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMkltcGwuQnVpbGRlckJhc2VJbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwgZXh0ZW5kcyBNZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwgaW1wbGVtZW50cwotICAgICAgICBNZWRpYUxpYnJhcnlTZXJ2aWNlMlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhU2Vzc2lvblNlcnZpY2UyIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIE1lZGlhTGlicmFyeVNlc3Npb24gbUxpYnJhcnlTZXNzaW9uOwotCi0gICAgcHVibGljIE1lZGlhTGlicmFyeVNlcnZpY2UySW1wbChNZWRpYUxpYnJhcnlTZXJ2aWNlMiBpbnN0YW5jZSkgewotICAgICAgICBzdXBlcihpbnN0YW5jZSk7Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlX2ltcGwoKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlX2ltcGwoKTsKLQotICAgICAgICAvLyBFZmZlY3RpdmVseSBmaW5hbAotICAgICAgICBNZWRpYVNlc3Npb24yIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgIGlmICghKHNlc3Npb24gaW5zdGFuY2VvZiBNZWRpYUxpYnJhcnlTZXNzaW9uKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4cGVjdGVkIE1lZGlhTGlicmFyeVNlc3Npb24sIGJ1dCByZXR1cm5lZCBNZWRpYVNlc3Npb24yIik7Ci0gICAgICAgIH0KLSAgICAgICAgbUxpYnJhcnlTZXNzaW9uID0gKE1lZGlhTGlicmFyeVNlc3Npb24pIGdldFNlc3Npb24oKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBpbnQgZ2V0U2Vzc2lvblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBTZXNzaW9uVG9rZW4yLlRZUEVfTElCUkFSWV9TRVJWSUNFOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwgZXh0ZW5kcyBNZWRpYVNlc3Npb24ySW1wbAotICAgICAgICAgICAgaW1wbGVtZW50cyBNZWRpYUxpYnJhcnlTZXNzaW9uUHJvdmlkZXIgewotICAgICAgICBwdWJsaWMgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwoQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIsIFN0cmluZyBpZCwgTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICAgICAgVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyLAotICAgICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5LCBFeGVjdXRvciBjYWxsYmFja0V4ZWN1dG9yLAotICAgICAgICAgICAgICAgIE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgcGxheWVyLCBpZCwgcGxheWxpc3RBZ2VudCwgdm9sdW1lUHJvdmlkZXIsIHNlc3Npb25BY3Rpdml0eSwKLSAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tFeGVjdXRvciwgY2FsbGJhY2spOwotICAgICAgICAgICAgLy8gRG9uJ3QgcHV0IGFueSBleHRyYSBpbml0aWFsaXphdGlvbiBoZXJlLiBIZXJlJ3MgdGhlIHJlYXNvbi4KLSAgICAgICAgICAgIC8vIFN5c3RlbSBzZXJ2aWNlIHdpbGwgcmVjb2duaXplIHRoaXMgc2Vzc2lvbiBpbnNpZGUgb2YgdGhlIHN1cGVyIGNvbnN0cnVjdG9yIGFuZCB3b3VsZAotICAgICAgICAgICAgLy8gY29ubmVjdCB0byB0aGlzIHNlc3Npb24gYXNzdW1pbmcgdGhhdCBpbml0aWFsaXphdGlvbiBpcyBmaW5pc2hlZC4gSG93ZXZlciwgaWYgYW55Ci0gICAgICAgICAgICAvLyBpbml0aWFsaXphdGlvbiBsb2dpYyBpcyBoZXJlLCBjYWxscyBmcm9tIHRoZSBzZXJ2ZXIgd291bGQgZmFpbC4KLSAgICAgICAgICAgIC8vIHNlZTogTWVkaWFTZXNzaW9uMlN0dWIjY29ubmVjdCgpCi0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgTWVkaWFMaWJyYXJ5U2Vzc2lvbiBjcmVhdGVJbnN0YW5jZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFMaWJyYXJ5U2Vzc2lvbih0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBNZWRpYUxpYnJhcnlTZXNzaW9uIGdldEluc3RhbmNlKCkgewotICAgICAgICAgICAgcmV0dXJuIChNZWRpYUxpYnJhcnlTZXNzaW9uKSBzdXBlci5nZXRJbnN0YW5jZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjayBnZXRDYWxsYmFjaygpIHsKLSAgICAgICAgICAgIHJldHVybiAoTWVkaWFMaWJyYXJ5U2Vzc2lvbkNhbGxiYWNrKSBzdXBlci5nZXRDYWxsYmFjaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoaWxkcmVuQ2hhbmdlZF9pbXBsKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIFN0cmluZyBwYXJlbnRJZCwKLSAgICAgICAgICAgICAgICBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udHJvbGxlciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJlbnRJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2V0U2Vzc2lvblN0dWIoKS5ub3RpZnlDaGlsZHJlbkNoYW5nZWROb3RMb2NrZWQoY29udHJvbGxlciwgcGFyZW50SWQsIGl0ZW1Db3VudCwKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGlsZHJlbkNoYW5nZWRfaW1wbChTdHJpbmcgcGFyZW50SWQsIGludCBpdGVtQ291bnQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFyZW50SWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdldFNlc3Npb25TdHViKCkubm90aWZ5Q2hpbGRyZW5DaGFuZ2VkTm90TG9ja2VkKHBhcmVudElkLCBpdGVtQ291bnQsIGV4dHJhcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5U2VhcmNoUmVzdWx0Q2hhbmdlZF9pbXBsKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIFN0cmluZyBxdWVyeSwKLSAgICAgICAgICAgICAgICBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udHJvbGxlciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInF1ZXJ5IHNob3VsZG4ndCBiZSBlbXB0eSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2V0U2Vzc2lvblN0dWIoKS5ub3RpZnlTZWFyY2hSZXN1bHRDaGFuZ2VkKGNvbnRyb2xsZXIsIHF1ZXJ5LCBpdGVtQ291bnQsIGV4dHJhcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXJJbXBsCi0gICAgICAgICAgICBleHRlbmRzIEJ1aWxkZXJCYXNlSW1wbDxNZWRpYUxpYnJhcnlTZXNzaW9uLCBNZWRpYUxpYnJhcnlTZXNzaW9uQ2FsbGJhY2s+IHsKLSAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKE1lZGlhTGlicmFyeVNlcnZpY2UyIHNlcnZpY2UsIEJ1aWxkZXIgaW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgRXhlY3V0b3IgY2FsbGJhY2tFeGVjdXRvciwgTWVkaWFMaWJyYXJ5U2Vzc2lvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBzdXBlcihzZXJ2aWNlKTsKLSAgICAgICAgICAgIHNldFNlc3Npb25DYWxsYmFja19pbXBsKGNhbGxiYWNrRXhlY3V0b3IsIGNhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgTWVkaWFMaWJyYXJ5U2Vzc2lvbiBidWlsZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUxpYnJhcnlTZXNzaW9uSW1wbChtQ29udGV4dCwgbVBsYXllciwgbUlkLCBtUGxheWxpc3RBZ2VudCwKLSAgICAgICAgICAgICAgICAgICAgbVZvbHVtZVByb3ZpZGVyLCBtU2Vzc2lvbkFjdGl2aXR5LCBtQ2FsbGJhY2tFeGVjdXRvciwgbUNhbGxiYWNrKS5nZXRJbnN0YW5jZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBMaWJyYXJ5Um9vdEltcGwgaW1wbGVtZW50cyBMaWJyYXJ5Um9vdFByb3ZpZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaWJyYXJ5Um9vdCBtSW5zdGFuY2U7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Sb290SWQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1FeHRyYXM7Ci0KLSAgICAgICAgcHVibGljIExpYnJhcnlSb290SW1wbChMaWJyYXJ5Um9vdCBpbnN0YW5jZSwgU3RyaW5nIHJvb3RJZCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgaWYgKHJvb3RJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm9vdElkIHNob3VsZG4ndCBiZSBudWxsLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICBtUm9vdElkID0gcm9vdElkOwotICAgICAgICAgICAgbUV4dHJhcyA9IGV4dHJhczsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJvb3RJZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Sb290SWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXNfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRXh0cmFzOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYU1ldGFkYXRhMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFNZXRhZGF0YTJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMWM1MzIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYU1ldGFkYXRhMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTIuKjsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTIuQml0bWFwS2V5OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTIuQnVpbGRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyLkxvbmdLZXk7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMi5SYXRpbmdLZXk7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMi5UZXh0S2V5OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuUmF0aW5nMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYU1ldGFkYXRhMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BcnJheU1hcDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotcHVibGljIGNsYXNzIE1lZGlhTWV0YWRhdGEySW1wbCBpbXBsZW1lbnRzIE1lZGlhTWV0YWRhdGEyUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFNZXRhZGF0YTIiOwotCi0gICAgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9UWVBFX0xPTkcgPSAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTUVUQURBVEFfVFlQRV9URVhUID0gMTsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX1RZUEVfQklUTUFQID0gMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX1RZUEVfUkFUSU5HID0gMzsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX1RZUEVfRkxPQVQgPSA0OwotICAgIHN0YXRpYyBmaW5hbCBBcnJheU1hcDxTdHJpbmcsIEludGVnZXI+IE1FVEFEQVRBX0tFWVNfVFlQRTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRSA9IG5ldyBBcnJheU1hcDxTdHJpbmcsIEludGVnZXI+KCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX1RJVExFLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BUlRJU1QsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RVUkFUSU9OLCBNRVRBREFUQV9UWVBFX0xPTkcpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BTEJVTSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQVVUSE9SLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9XUklURVIsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0NPTVBPU0VSLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9DT01QSUxBVElPTiwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfREFURSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfWUVBUiwgTUVUQURBVEFfVFlQRV9MT05HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfR0VOUkUsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX1RSQUNLX05VTUJFUiwgTUVUQURBVEFfVFlQRV9MT05HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfTlVNX1RSQUNLUywgTUVUQURBVEFfVFlQRV9MT05HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTQ19OVU1CRVIsIE1FVEFEQVRBX1RZUEVfTE9ORyk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FMQlVNX0FSVElTVCwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQVJULCBNRVRBREFUQV9UWVBFX0JJVE1BUCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FSVF9VUkksIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FMQlVNX0FSVCwgTUVUQURBVEFfVFlQRV9CSVRNQVApOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BTEJVTV9BUlRfVVJJLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9VU0VSX1JBVElORywgTUVUQURBVEFfVFlQRV9SQVRJTkcpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9SQVRJTkcsIE1FVEFEQVRBX1RZUEVfUkFUSU5HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTUExBWV9USVRMRSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTUExBWV9TVUJUSVRMRSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTUExBWV9ERVNDUklQVElPTiwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTUExBWV9JQ09OLCBNRVRBREFUQV9UWVBFX0JJVE1BUCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU1BMQVlfSUNPTl9VUkksIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX01FRElBX0lELCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9CVF9GT0xERVJfVFlQRSwgTUVUQURBVEFfVFlQRV9MT05HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfTUVESUFfVVJJLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BRFZFUlRJU0VNRU5ULCBNRVRBREFUQV9UWVBFX0xPTkcpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9ET1dOTE9BRF9TVEFUVVMsIE1FVEFEQVRBX1RZUEVfTE9ORyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQFRleHRLZXkKLSAgICBTdHJpbmdbXSBQUkVGRVJSRURfREVTQ1JJUFRJT05fT1JERVIgPSB7Ci0gICAgICAgICAgICBNRVRBREFUQV9LRVlfVElUTEUsCi0gICAgICAgICAgICBNRVRBREFUQV9LRVlfQVJUSVNULAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FMQlVNLAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FMQlVNX0FSVElTVCwKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9XUklURVIsCi0gICAgICAgICAgICBNRVRBREFUQV9LRVlfQVVUSE9SLAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0NPTVBPU0VSCi0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEBCaXRtYXBLZXkKLSAgICBTdHJpbmdbXSBQUkVGRVJSRURfQklUTUFQX09SREVSID0gewotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0RJU1BMQVlfSUNPTiwKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BUlQsCi0gICAgICAgICAgICBNRVRBREFUQV9LRVlfQUxCVU1fQVJUCi0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEBUZXh0S2V5Ci0gICAgU3RyaW5nW10gUFJFRkVSUkVEX1VSSV9PUkRFUiA9IHsKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9ESVNQTEFZX0lDT05fVVJJLAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FSVF9VUkksCi0gICAgICAgICAgICBNRVRBREFUQV9LRVlfQUxCVU1fQVJUX1VSSQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhTWV0YWRhdGEyIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotCi0gICAgcHVibGljIE1lZGlhTWV0YWRhdGEySW1wbChCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIG1JbnN0YW5jZSA9IG5ldyBNZWRpYU1ldGFkYXRhMih0aGlzKTsKLSAgICAgICAgbUJ1bmRsZSA9IGJ1bmRsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXlfaW1wbChTdHJpbmcga2V5KSB7Ci0gICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuY29udGFpbnNLZXkoa2V5KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRleHRfaW1wbChAVGV4dEtleSBTdHJpbmcga2V5KSB7Ci0gICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0Q2hhclNlcXVlbmNlKGtleSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBOdWxsYWJsZSBTdHJpbmcgZ2V0TWVkaWFJZF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlLmdldFN0cmluZyhNRVRBREFUQV9LRVlfTUVESUFfSUQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nX2ltcGwoQFRleHRLZXkgU3RyaW5nIGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gbUJ1bmRsZS5nZXRDaGFyU2VxdWVuY2Uoa2V5KTsKLSAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRleHQudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRMb25nX2ltcGwoQExvbmdLZXkgU3RyaW5nIGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldExvbmcoa2V5LCAwKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmF0aW5nMiBnZXRSYXRpbmdfaW1wbChAUmF0aW5nS2V5IFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPKGphZXdhbik6IEFkZCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0gICAgICAgIFJhdGluZzIgcmF0aW5nID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJhdGluZyA9IFJhdGluZzIuZnJvbUJ1bmRsZShtQnVuZGxlLmdldEJ1bmRsZShrZXkpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZSwgdmFsdWUgd2FzIG5vdCBhIHJhdGluZwotICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIHJldHJpZXZlIGEga2V5IGFzIFJhdGluZy4iLCBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmF0aW5nOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdF9pbXBsKEBGbG9hdEtleSBTdHJpbmcga2V5KSB7Ci0gICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0RmxvYXQoa2V5KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQml0bWFwIGdldEJpdG1hcF9pbXBsKEBCaXRtYXBLZXkgU3RyaW5nIGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIEJpdG1hcCBibXAgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYm1wID0gbUJ1bmRsZS5nZXRQYXJjZWxhYmxlKGtleSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUsIHZhbHVlIHdhcyBub3QgYSBiaXRtYXAKLSAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0byByZXRyaWV2ZSBhIGtleSBhcyBCaXRtYXAuIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJtcDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVuZGxlIGdldEV4dHJhc19pbXBsKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0QnVuZGxlKE1FVEFEQVRBX0tFWV9FWFRSQVMpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gaWdub3JlLCB2YWx1ZSB3YXMgbm90IGFuIGJ1bmRsZQotICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIHJldHJpZXZlIGFuIGV4dHJhIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBzaXplX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLnNpemUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2V0PFN0cmluZz4ga2V5U2V0X2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmtleVNldCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdW5kbGUgdG9CdW5kbGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZWRpYU1ldGFkYXRhMiBmcm9tQnVuZGxlX2ltcGwoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gKGJ1bmRsZSA9PSBudWxsKSA/IG51bGwgOiBuZXcgTWVkaWFNZXRhZGF0YTJJbXBsKGJ1bmRsZSkuZ2V0SW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXJJbXBsIGltcGxlbWVudHMgTWVkaWFNZXRhZGF0YTJQcm92aWRlci5CdWlsZGVyUHJvdmlkZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIE1lZGlhTWV0YWRhdGEyLkJ1aWxkZXIgbUluc3RhbmNlOwotICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotCi0gICAgICAgIHB1YmxpYyBCdWlsZGVySW1wbChNZWRpYU1ldGFkYXRhMi5CdWlsZGVyIGluc3RhbmNlKSB7Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQnVpbGRlckltcGwoTWVkaWFNZXRhZGF0YTIuQnVpbGRlciBpbnN0YW5jZSwgTWVkaWFNZXRhZGF0YTIgc291cmNlKSB7Ci0gICAgICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzb3VyY2Ugc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoc291cmNlLnRvQnVuZGxlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKGludCBtYXhCaXRtYXBTaXplKSB7Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBuZXcgTWVkaWFNZXRhZGF0YTIuQnVpbGRlcih0aGlzKTsKLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0KLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IG1CdW5kbGUua2V5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBtQnVuZGxlLmdldChrZXkpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJpdG1hcCkgewotICAgICAgICAgICAgICAgICAgICBCaXRtYXAgYm1wID0gKEJpdG1hcCkgdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChibXAuZ2V0SGVpZ2h0KCkgPiBtYXhCaXRtYXBTaXplIHx8IGJtcC5nZXRXaWR0aCgpID4gbWF4Qml0bWFwU2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnB1dEJpdG1hcChrZXksIHNjYWxlQml0bWFwKGJtcCwgbWF4Qml0bWFwU2l6ZSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHB1dFRleHRfaW1wbChAVGV4dEtleSBTdHJpbmcga2V5LCBDaGFyU2VxdWVuY2UgdmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5nZXQoa2V5KSAhPSBNRVRBREFUQV9UWVBFX1RFWFQpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIENoYXJTZXF1ZW5jZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdW5kbGUucHV0Q2hhclNlcXVlbmNlKGtleSwgdmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBwdXRTdHJpbmdfaW1wbChAVGV4dEtleSBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5nZXQoa2V5KSAhPSBNRVRBREFUQV9UWVBFX1RFWFQpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIFN0cmluZyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdW5kbGUucHV0Q2hhclNlcXVlbmNlKGtleSwgdmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBwdXRMb25nX2ltcGwoQExvbmdLZXkgU3RyaW5nIGtleSwgbG9uZyB2YWx1ZSkgewotICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmNvbnRhaW5zS2V5KGtleSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmdldChrZXkpICE9IE1FVEFEQVRBX1RZUEVfTE9ORykgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgIiArIGtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBrZXkgY2Fubm90IGJlIHVzZWQgdG8gcHV0IGEgbG9uZyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdW5kbGUucHV0TG9uZyhrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgcHV0UmF0aW5nX2ltcGwoQFJhdGluZ0tleSBTdHJpbmcga2V5LCBSYXRpbmcyIHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9SQVRJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIFJhdGluZyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdW5kbGUucHV0QnVuZGxlKGtleSwgdmFsdWUudG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHB1dEJpdG1hcF9pbXBsKEBCaXRtYXBLZXkgU3RyaW5nIGtleSwgQml0bWFwIHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9CSVRNQVApIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIEJpdG1hcCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdW5kbGUucHV0UGFyY2VsYWJsZShrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgcHV0RmxvYXRfaW1wbChARmxvYXRLZXkgU3RyaW5nIGtleSwgZmxvYXQgdmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5nZXQoa2V5KSAhPSBNRVRBREFUQV9UWVBFX0ZMT0FUKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSAiICsga2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGtleSBjYW5ub3QgYmUgdXNlZCB0byBwdXQgYSBmbG9hdCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdW5kbGUucHV0RmxvYXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEV4dHJhc19pbXBsKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0QnVuZGxlKE1FVEFEQVRBX0tFWV9FWFRSQVMsIGJ1bmRsZSk7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMiBidWlsZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYU1ldGFkYXRhMkltcGwobUJ1bmRsZSkuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgQml0bWFwIHNjYWxlQml0bWFwKEJpdG1hcCBibXAsIGludCBtYXhTaXplKSB7Ci0gICAgICAgICAgICBmbG9hdCBtYXhTaXplRiA9IG1heFNpemU7Ci0gICAgICAgICAgICBmbG9hdCB3aWR0aFNjYWxlID0gbWF4U2l6ZUYgLyBibXAuZ2V0V2lkdGgoKTsKLSAgICAgICAgICAgIGZsb2F0IGhlaWdodFNjYWxlID0gbWF4U2l6ZUYgLyBibXAuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgICAgICBmbG9hdCBzY2FsZSA9IE1hdGgubWluKHdpZHRoU2NhbGUsIGhlaWdodFNjYWxlKTsKLSAgICAgICAgICAgIGludCBoZWlnaHQgPSAoaW50KSAoYm1wLmdldEhlaWdodCgpICogc2NhbGUpOwotICAgICAgICAgICAgaW50IHdpZHRoID0gKGludCkgKGJtcC5nZXRXaWR0aCgpICogc2NhbGUpOwotICAgICAgICAgICAgcmV0dXJuIEJpdG1hcC5jcmVhdGVTY2FsZWRCaXRtYXAoYm1wLCB3aWR0aCwgaGVpZ2h0LCB0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXlsaXN0QWdlbnRJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhUGxheWxpc3RBZ2VudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZkNGUxYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhUGxheWxpc3RBZ2VudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLkNhbGxiYWNrRXhlY3V0b3I7Ci1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuRGF0YVNvdXJjZURlc2M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQuUGxheWxpc3RFdmVudENhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhUGxheWxpc3RBZ2VudFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BcnJheU1hcDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuR3VhcmRlZEJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYVBsYXlsaXN0QWdlbnRJbXBsIGltcGxlbWVudHMgTWVkaWFQbGF5bGlzdEFnZW50UHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFQbGF5bGlzdEFnZW50IjsKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IG1JbnN0YW5jZTsKLQotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TWFwPFBsYXlsaXN0RXZlbnRDYWxsYmFjaywgRXhlY3V0b3I+IG1DYWxsYmFja3MgPSBuZXcgQXJyYXlNYXA8PigpOwotCi0gICAgcHVibGljIE1lZGlhUGxheWxpc3RBZ2VudEltcGwoTWVkaWFQbGF5bGlzdEFnZW50IGluc3RhbmNlKSB7Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIGZpbmFsIHB1YmxpYyB2b2lkIHJlZ2lzdGVyUGxheWxpc3RFdmVudENhbGxiYWNrX2ltcGwoCi0gICAgICAgICAgICBATm9uTnVsbCBAQ2FsbGJhY2tFeGVjdXRvciBFeGVjdXRvciBleGVjdXRvciwgQE5vbk51bGwgUGxheWxpc3RFdmVudENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChleGVjdXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJleGVjdXRvciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYWxsYmFjayBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKG1DYWxsYmFja3MuZ2V0KGNhbGxiYWNrKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiY2FsbGJhY2sgaXMgYWxyZWFkeSBhZGRlZC4gSWdub3JpbmcuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNhbGxiYWNrcy5wdXQoY2FsbGJhY2ssIGV4ZWN1dG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIGZpbmFsIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJQbGF5bGlzdEV2ZW50Q2FsbGJhY2tfaW1wbCgKLSAgICAgICAgICAgIEBOb25OdWxsIFBsYXlsaXN0RXZlbnRDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2tzLnJlbW92ZShjYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBmaW5hbCBwdWJsaWMgdm9pZCBub3RpZnlQbGF5bGlzdENoYW5nZWRfaW1wbCgpIHsKLSAgICAgICAgQXJyYXlNYXA8UGxheWxpc3RFdmVudENhbGxiYWNrLCBFeGVjdXRvcj4gY2FsbGJhY2tzID0gZ2V0Q2FsbGJhY2tzKCk7Ci0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcGxheWxpc3Q9IG1JbnN0YW5jZS5nZXRQbGF5bGlzdCgpOwotICAgICAgICBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSA9IG1JbnN0YW5jZS5nZXRQbGF5bGlzdE1ldGFkYXRhKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FsbGJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgY2FsbGJhY2sgPSBjYWxsYmFja3Mua2V5QXQoaSk7Ci0gICAgICAgICAgICBmaW5hbCBFeGVjdXRvciBleGVjdXRvciA9IGNhbGxiYWNrcy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBjYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLCBwbGF5bGlzdCwgbWV0YWRhdGEpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIGZpbmFsIHB1YmxpYyB2b2lkIG5vdGlmeVBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkX2ltcGwoKSB7Ci0gICAgICAgIEFycmF5TWFwPFBsYXlsaXN0RXZlbnRDYWxsYmFjaywgRXhlY3V0b3I+IGNhbGxiYWNrcyA9IGdldENhbGxiYWNrcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbGxiYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZmluYWwgUGxheWxpc3RFdmVudENhbGxiYWNrIGNhbGxiYWNrID0gY2FsbGJhY2tzLmtleUF0KGkpOwotICAgICAgICAgICAgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3IgPSBjYWxsYmFja3MudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gY2FsbGJhY2sub25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLCBtSW5zdGFuY2UuZ2V0UGxheWxpc3RNZXRhZGF0YSgpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBmaW5hbCBwdWJsaWMgdm9pZCBub3RpZnlTaHVmZmxlTW9kZUNoYW5nZWRfaW1wbCgpIHsKLSAgICAgICAgQXJyYXlNYXA8UGxheWxpc3RFdmVudENhbGxiYWNrLCBFeGVjdXRvcj4gY2FsbGJhY2tzID0gZ2V0Q2FsbGJhY2tzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FsbGJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgY2FsbGJhY2sgPSBjYWxsYmFja3Mua2V5QXQoaSk7Ci0gICAgICAgICAgICBmaW5hbCBFeGVjdXRvciBleGVjdXRvciA9IGNhbGxiYWNrcy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBjYWxsYmFjay5vblNodWZmbGVNb2RlQ2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLCBtSW5zdGFuY2UuZ2V0U2h1ZmZsZU1vZGUoKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgZmluYWwgcHVibGljIHZvaWQgbm90aWZ5UmVwZWF0TW9kZUNoYW5nZWRfaW1wbCgpIHsKLSAgICAgICAgQXJyYXlNYXA8UGxheWxpc3RFdmVudENhbGxiYWNrLCBFeGVjdXRvcj4gY2FsbGJhY2tzID0gZ2V0Q2FsbGJhY2tzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FsbGJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgY2FsbGJhY2sgPSBjYWxsYmFja3Mua2V5QXQoaSk7Ci0gICAgICAgICAgICBmaW5hbCBFeGVjdXRvciBleGVjdXRvciA9IGNhbGxiYWNrcy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBjYWxsYmFjay5vblJlcGVhdE1vZGVDaGFuZ2VkKAotICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2UsIG1JbnN0YW5jZS5nZXRSZXBlYXRNb2RlKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBATnVsbGFibGUgTGlzdDxNZWRpYUl0ZW0yPiBnZXRQbGF5bGlzdF9pbXBsKCkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5bGlzdF9pbXBsKEBOb25OdWxsIExpc3Q8TWVkaWFJdGVtMj4gbGlzdCwKLSAgICAgICAgICAgIEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgZ2V0UGxheWxpc3RNZXRhZGF0YV9pbXBsKCkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5bGlzdE1ldGFkYXRhX2ltcGwoQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkUGxheWxpc3RJdGVtX2ltcGwoaW50IGluZGV4LCBATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQbGF5bGlzdEl0ZW1faW1wbChATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZXBsYWNlUGxheWxpc3RJdGVtX2ltcGwoaW50IGluZGV4LCBATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QbGF5bGlzdEl0ZW1faW1wbChATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QcmV2aW91c0l0ZW1faW1wbCgpIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9OZXh0SXRlbV9pbXBsKCkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0UmVwZWF0TW9kZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UmVwZWF0TW9kZV9pbXBsKGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRTaHVmZmxlTW9kZV9pbXBsKCkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgICAgICByZXR1cm4gTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9OT05FOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFNodWZmbGVNb2RlX2ltcGwoaW50IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBOdWxsYWJsZSBNZWRpYUl0ZW0yIGdldE1lZGlhSXRlbV9pbXBsKEBOb25OdWxsIERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICBpZiAoZHNkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImRzZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gaXRlbUxpc3QgPSBtSW5zdGFuY2UuZ2V0UGxheWxpc3QoKTsKLSAgICAgICAgaWYgKGl0ZW1MaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IGl0ZW1MaXN0LmdldChpKTsKLSAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwgJiYgaXRlbS5nZXREYXRhU291cmNlRGVzYygpID09IGRzZCkgewotICAgICAgICAgICAgICAgIHJldHVybiBpdGVtOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgQXJyYXlNYXA8UGxheWxpc3RFdmVudENhbGxiYWNrLCBFeGVjdXRvcj4gZ2V0Q2FsbGJhY2tzKCkgewotICAgICAgICBBcnJheU1hcDxQbGF5bGlzdEV2ZW50Q2FsbGJhY2ssIEV4ZWN1dG9yPiBjYWxsYmFja3MgPSBuZXcgQXJyYXlNYXA8PigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBjYWxsYmFja3MucHV0QWxsKG1DYWxsYmFja3MpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjYWxsYmFja3M7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb24ySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb24ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM2MDQyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfQ1VTVE9NOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVFlQRV9MSUJSQVJZX1NFUlZJQ0U7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMi5UWVBFX1NFU1NJT047Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMi5UWVBFX1NFU1NJT05fU0VSVklDRTsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRm9jdXNSZXF1ZXN0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuRGF0YVNvdXJjZURlc2M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMi5QbGF5YmFja0luZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZS5QbGF5ZXJFdmVudENhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlLlBsYXllclN0YXRlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50LlBsYXlsaXN0RXZlbnRDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkJ1aWxkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkNvbW1hbmRCdXR0b247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZEdyb3VwMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29udHJvbGxlckluZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLk9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLlNlc3Npb25DYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvblNlcnZpY2UyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVNlc3Npb24yUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5HdWFyZGVkQnk7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYVNlc3Npb24ySW1wbCBpbXBsZW1lbnRzIE1lZGlhU2Vzc2lvbjJQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVNlc3Npb24yIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsvL0xvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNlc3Npb24yIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUlkOwotICAgIHByaXZhdGUgZmluYWwgRXhlY3V0b3IgbUNhbGxiYWNrRXhlY3V0b3I7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXNzaW9uQ2FsbGJhY2sgbUNhbGxiYWNrOwotICAgIHByaXZhdGUgZmluYWwgTWVkaWFTZXNzaW9uMlN0dWIgbVNlc3Npb25TdHViOwotICAgIHByaXZhdGUgZmluYWwgU2Vzc2lvblRva2VuMiBtU2Vzc2lvblRva2VuOwotICAgIHByaXZhdGUgZmluYWwgQXVkaW9NYW5hZ2VyIG1BdWRpb01hbmFnZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQZW5kaW5nSW50ZW50IG1TZXNzaW9uQWN0aXZpdHk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQbGF5ZXJFdmVudENhbGxiYWNrIG1QbGF5ZXJFdmVudENhbGxiYWNrOwotICAgIHByaXZhdGUgZmluYWwgUGxheWxpc3RFdmVudENhbGxiYWNrIG1QbGF5bGlzdEV2ZW50Q2FsbGJhY2s7Ci0KLSAgICAvLyBtUGxheWVyIGlzIHNldCB0byBudWxsIHdoZW4gdGhlIHNlc3Npb24gaXMgY2xvc2VkLCBhbmQgd2Ugc2hvdWxkbid0IHRocm93IGFuIGV4Y2VwdGlvbgotICAgIC8vIG5vciBsZWF2ZSBsb2cgYWx3YXlzIGZvciB1c2luZyBtUGxheWVyIHdoZW4gaXQncyBudWxsLiBIZXJlJ3MgdGhlIHJlYXNvbi4KLSAgICAvLyBXaGVuIGEgTWVkaWFTZXNzaW9uMiBpcyBjbG9zZWQsIHRoZXJlIGNvdWxkIGJlIGEgcGVuZGVkIG9wZXJhdGlvbiBpbiB0aGUgc2Vzc2lvbiBjYWxsYmFjawotICAgIC8vIGV4ZWN1dG9yIHRoYXQgbWF5IHdhbnQgdG8gYWNjZXNzIHRoZSBwbGF5ZXIuIEhlcmUncyB0aGUgc2FtcGxlIGNvZGUgc25pcHBldCBmb3IgdGhhdC4KLSAgICAvLwotICAgIC8vICAgcHVibGljIHZvaWQgb25Gb28oKSB7Ci0gICAgLy8gICAgIGlmIChtUGxheWVyID09IG51bGwpIHJldHVybjsgLy8gZmlyc3QgY2hlY2sKLSAgICAvLyAgICAgbVNlc3Npb25DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dG9yKCgpIC0+IHsKLSAgICAvLyAgICAgICAvLyBFcnJvci4gU2Vzc2lvbiBtYXkgYmUgY2xvc2VkIGFuZCBtUGxheWVyIGNhbiBiZSBudWxsIGhlcmUuCi0gICAgLy8gICAgICAgbVBsYXllci5mb28oKTsKLSAgICAvLyAgICAgfSk7Ci0gICAgLy8gICB9Ci0gICAgLy8KLSAgICAvLyBCeSBhZGRpbmcgcHJvdGVjdGl2ZSBjb2RlLCB3ZSBjYW4gYWxzbyBwcm90ZWN0IEFQSXMgZnJvbSBiZWluZyBjYWxsZWQgYWZ0ZXIgdGhlIGNsb3NlKCkKLSAgICAvLwotICAgIC8vIFRPRE8oamFld2FuKTogU2hvdWxkIHdlIHB1dCB2b2xhdGlsZSBoZXJlPwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIE1lZGlhUGxheWVyQmFzZSBtUGxheWVyOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIE1lZGlhUGxheWxpc3RBZ2VudCBtUGxheWxpc3RBZ2VudDsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBTZXNzaW9uUGxheWxpc3RBZ2VudCBtU2Vzc2lvblBsYXlsaXN0QWdlbnQ7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgVm9sdW1lUHJvdmlkZXIyIG1Wb2x1bWVQcm92aWRlcjsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBQbGF5YmFja0luZm8gbVBsYXliYWNrSW5mbzsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyIG1Ec21IZWxwZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDYW4gYmUgb25seSBjYWxsZWQgYnkgdGhlIHtAbGluayBCdWlsZGVyI2J1aWxkKCl9LgotICAgICAqIEBwYXJhbSBjb250ZXh0Ci0gICAgICogQHBhcmFtIHBsYXllcgotICAgICAqIEBwYXJhbSBpZAotICAgICAqIEBwYXJhbSBwbGF5bGlzdEFnZW50Ci0gICAgICogQHBhcmFtIHZvbHVtZVByb3ZpZGVyCi0gICAgICogQHBhcmFtIHNlc3Npb25BY3Rpdml0eQotICAgICAqIEBwYXJhbSBjYWxsYmFja0V4ZWN1dG9yCi0gICAgICogQHBhcmFtIGNhbGxiYWNrCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvbjJJbXBsKENvbnRleHQgY29udGV4dCwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciwgU3RyaW5nIGlkLAotICAgICAgICAgICAgTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsIFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlciwKLSAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5LAotICAgICAgICAgICAgRXhlY3V0b3IgY2FsbGJhY2tFeGVjdXRvciwgU2Vzc2lvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogS2VlcCBvdGhlciBwYXJhbXMuCi0gICAgICAgIG1JbnN0YW5jZSA9IGNyZWF0ZUluc3RhbmNlKCk7Ci0KLSAgICAgICAgLy8gQXJndW1lbnQgY2hlY2tzIGFyZSBkb25lIGJ5IGJ1aWxkZXIgYWxyZWFkeS4KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSBmaW5hbHMgZmlyc3QuCi0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbUlkID0gaWQ7Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvciA9IGNhbGxiYWNrRXhlY3V0b3I7Ci0gICAgICAgIG1TZXNzaW9uQWN0aXZpdHkgPSBzZXNzaW9uQWN0aXZpdHk7Ci0gICAgICAgIG1TZXNzaW9uU3R1YiA9IG5ldyBNZWRpYVNlc3Npb24yU3R1Yih0aGlzKTsKLSAgICAgICAgbUF1ZGlvTWFuYWdlciA9IChBdWRpb01hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFVRElPX1NFUlZJQ0UpOwotICAgICAgICBtUGxheWVyRXZlbnRDYWxsYmFjayA9IG5ldyBNeVBsYXllckV2ZW50Q2FsbGJhY2sodGhpcyk7Ci0gICAgICAgIG1QbGF5bGlzdEV2ZW50Q2FsbGJhY2sgPSBuZXcgTXlQbGF5bGlzdEV2ZW50Q2FsbGJhY2sodGhpcyk7Ci0KLSAgICAgICAgLy8gSW5mZXIgdHlwZSBmcm9tIHRoZSBpZCBhbmQgcGFja2FnZSBuYW1lLgotICAgICAgICBTdHJpbmcgbGlicmFyeVNlcnZpY2UgPSBnZXRTZXJ2aWNlTmFtZShjb250ZXh0LCBNZWRpYUxpYnJhcnlTZXJ2aWNlMi5TRVJWSUNFX0lOVEVSRkFDRSwgaWQpOwotICAgICAgICBTdHJpbmcgc2Vzc2lvblNlcnZpY2UgPSBnZXRTZXJ2aWNlTmFtZShjb250ZXh0LCBNZWRpYVNlc3Npb25TZXJ2aWNlMi5TRVJWSUNFX0lOVEVSRkFDRSwgaWQpOwotICAgICAgICBpZiAoc2Vzc2lvblNlcnZpY2UgIT0gbnVsbCAmJiBsaWJyYXJ5U2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBbWJpZ3VvdXMgc2Vzc2lvbiB0eXBlLiBNdWx0aXBsZSIKLSAgICAgICAgICAgICAgICAgICAgKyAiIHNlc3Npb24gc2VydmljZXMgZGVmaW5lIHRoZSBzYW1lIGlkPSIgKyBpZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobGlicmFyeVNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbVNlc3Npb25Ub2tlbiA9IG5ldyBTZXNzaW9uVG9rZW4ySW1wbChQcm9jZXNzLm15VWlkKCksIFRZUEVfTElCUkFSWV9TRVJWSUNFLAotICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLCBsaWJyYXJ5U2VydmljZSwgaWQsIG1TZXNzaW9uU3R1YikuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfSBlbHNlIGlmIChzZXNzaW9uU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvblRva2VuID0gbmV3IFNlc3Npb25Ub2tlbjJJbXBsKFByb2Nlc3MubXlVaWQoKSwgVFlQRV9TRVNTSU9OX1NFUlZJQ0UsCi0gICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIHNlc3Npb25TZXJ2aWNlLCBpZCwgbVNlc3Npb25TdHViKS5nZXRJbnN0YW5jZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVNlc3Npb25Ub2tlbiA9IG5ldyBTZXNzaW9uVG9rZW4ySW1wbChQcm9jZXNzLm15VWlkKCksIFRZUEVfU0VTU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgbnVsbCwgaWQsIG1TZXNzaW9uU3R1YikuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHVwZGF0ZVBsYXllcihwbGF5ZXIsIHBsYXlsaXN0QWdlbnQsIHZvbHVtZVByb3ZpZGVyKTsKLQotICAgICAgICAvLyBBc2sgc2VydmVyIGZvciB0aGUgc2FuaXR5IGNoZWNrLCBhbmQgc3RhcnRzCi0gICAgICAgIC8vIFNhbml0eSBjaGVjayBmb3IgbWFraW5nIHNlc3Npb24gSUQgdW5pcXVlICdwZXIgcGFja2FnZScgY2Fubm90IGJlIGRvbmUgaW4gaGVyZS4KLSAgICAgICAgLy8gU2VydmVyIGNhbiBvbmx5IGtub3cgaWYgdGhlIHBhY2thZ2UgaGFzIGFub3RoZXIgcHJvY2VzcyBhbmQgaGFzIGFub3RoZXIgc2Vzc2lvbiB3aXRoIHRoZQotICAgICAgICAvLyBzYW1lIGlkLiBOb3RlIHRoYXQgJ0lEIGlzIHVuaXF1ZSBwZXIgcGFja2FnZScgaXMgaW1wb3J0YW50IGZvciBjb250cm9sbGVyIHRvIGRpc3Rpbmd1aXNoCi0gICAgICAgIC8vIGEgc2Vzc2lvbiBpbiBhbm90aGVyIHBhY2thZ2UuCi0gICAgICAgIE1lZGlhU2Vzc2lvbk1hbmFnZXIgbWFuYWdlciA9Ci0gICAgICAgICAgICAgICAgKE1lZGlhU2Vzc2lvbk1hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5NRURJQV9TRVNTSU9OX1NFUlZJQ0UpOwotICAgICAgICBpZiAoIW1hbmFnZXIuY3JlYXRlU2Vzc2lvbjIobVNlc3Npb25Ub2tlbikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlNlc3Npb24gd2l0aCB0aGUgc2FtZSBpZCBpcyBhbHJlYWR5IHVzZWQgYnkiCi0gICAgICAgICAgICAgICAgICAgICsgIiBhbm90aGVyIHByb2Nlc3MuIFVzZSBNZWRpYUNvbnRyb2xsZXIyIGluc3RlYWQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBNZWRpYVNlc3Npb24yIGNyZWF0ZUluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjIodGhpcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lKENvbnRleHQgY29udGV4dCwgU3RyaW5nIHNlcnZpY2VBY3Rpb24sIFN0cmluZyBpZCkgewotICAgICAgICBQYWNrYWdlTWFuYWdlciBtYW5hZ2VyID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOwotICAgICAgICBJbnRlbnQgc2VydmljZUludGVudCA9IG5ldyBJbnRlbnQoc2VydmljZUFjdGlvbik7Ci0gICAgICAgIHNlcnZpY2VJbnRlbnQuc2V0UGFja2FnZShjb250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICBMaXN0PFJlc29sdmVJbmZvPiBzZXJ2aWNlcyA9IG1hbmFnZXIucXVlcnlJbnRlbnRTZXJ2aWNlcyhzZXJ2aWNlSW50ZW50LAotICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLkdFVF9NRVRBX0RBVEEpOwotICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBudWxsOwotICAgICAgICBpZiAoc2VydmljZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlSWQgPSBTZXNzaW9uVG9rZW4ySW1wbC5nZXRTZXNzaW9uSWQoc2VydmljZXMuZ2V0KGkpKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VydmljZUlkICE9IG51bGwgJiYgVGV4dFV0aWxzLmVxdWFscyhpZCwgc2VydmljZUlkKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmljZXMuZ2V0KGkpLnNlcnZpY2VJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBbWJpZ3VvdXMgc2Vzc2lvbiB0eXBlLiBNdWx0aXBsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHNlc3Npb24gc2VydmljZXMgZGVmaW5lIHRoZSBzYW1lIGlkPSIgKyBpZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2VydmljZU5hbWUgPSBzZXJ2aWNlcy5nZXQoaSkuc2VydmljZUluZm8ubmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2VOYW1lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVBsYXllcl9pbXBsKEBOb25OdWxsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIsIE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LAotICAgICAgICAgICAgVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgZW5zdXJlQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICBpZiAocGxheWVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBsYXllciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVBsYXllcihwbGF5ZXIsIHBsYXlsaXN0QWdlbnQsIHZvbHVtZVByb3ZpZGVyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlUGxheWVyKE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCwKLSAgICAgICAgICAgIFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlcikgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXllckJhc2Ugb2xkUGxheWVyOwotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgb2xkQWdlbnQ7Ci0gICAgICAgIGZpbmFsIFBsYXliYWNrSW5mbyBpbmZvID0gY3JlYXRlUGxheWJhY2tJbmZvKHZvbHVtZVByb3ZpZGVyLCBwbGF5ZXIuZ2V0QXVkaW9BdHRyaWJ1dGVzKCkpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBvbGRQbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICAgICAgb2xkQWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgICAgIG1QbGF5ZXIgPSBwbGF5ZXI7Ci0gICAgICAgICAgICBpZiAoYWdlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZXNzaW9uUGxheWxpc3RBZ2VudCA9IG5ldyBTZXNzaW9uUGxheWxpc3RBZ2VudCh0aGlzLCBtUGxheWVyKTsKLSAgICAgICAgICAgICAgICBpZiAobURzbUhlbHBlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uUGxheWxpc3RBZ2VudC5zZXRPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyKG1Ec21IZWxwZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhZ2VudCA9IG1TZXNzaW9uUGxheWxpc3RBZ2VudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1QbGF5bGlzdEFnZW50ID0gYWdlbnQ7Ci0gICAgICAgICAgICBtVm9sdW1lUHJvdmlkZXIgPSB2b2x1bWVQcm92aWRlcjsKLSAgICAgICAgICAgIG1QbGF5YmFja0luZm8gPSBpbmZvOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gb2xkUGxheWVyKSB7Ci0gICAgICAgICAgICBwbGF5ZXIucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKG1DYWxsYmFja0V4ZWN1dG9yLCBtUGxheWVyRXZlbnRDYWxsYmFjayk7Ci0gICAgICAgICAgICBpZiAob2xkUGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBXYXJuaW5nOiBQb29ybHkgaW1wbGVtZW50IHBsYXllciBtYXkgaWdub3JlIHRoaXMKLSAgICAgICAgICAgICAgICBvbGRQbGF5ZXIudW5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2sobVBsYXllckV2ZW50Q2FsbGJhY2spOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChhZ2VudCAhPSBvbGRBZ2VudCkgewotICAgICAgICAgICAgYWdlbnQucmVnaXN0ZXJQbGF5bGlzdEV2ZW50Q2FsbGJhY2sobUNhbGxiYWNrRXhlY3V0b3IsIG1QbGF5bGlzdEV2ZW50Q2FsbGJhY2spOwotICAgICAgICAgICAgaWYgKG9sZEFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBXYXJuaW5nOiBQb29ybHkgaW1wbGVtZW50IHBsYXllciBtYXkgaWdub3JlIHRoaXMKLSAgICAgICAgICAgICAgICBvbGRBZ2VudC51bnJlZ2lzdGVyUGxheWxpc3RFdmVudENhbGxiYWNrKG1QbGF5bGlzdEV2ZW50Q2FsbGJhY2spOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9sZFBsYXllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5UGxheWJhY2tJbmZvQ2hhbmdlZChpbmZvKTsKLSAgICAgICAgICAgIG5vdGlmeVBsYXllclVwZGF0ZWROb3RMb2NrZWQob2xkUGxheWVyKTsKLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJlcGVhdCB0aGUgc2FtZSB0aGluZyBmb3IgdGhlIHBsYXlsaXN0IGFnZW50LgotICAgIH0KLQotICAgIHByaXZhdGUgUGxheWJhY2tJbmZvIGNyZWF0ZVBsYXliYWNrSW5mbyhWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIsIEF1ZGlvQXR0cmlidXRlcyBhdHRycykgewotICAgICAgICBQbGF5YmFja0luZm8gaW5mbzsKLSAgICAgICAgaWYgKHZvbHVtZVByb3ZpZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIGludCBzdHJlYW07Ci0gICAgICAgICAgICBpZiAoYXR0cnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0cmVhbSA9IEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0cmVhbSA9IGF0dHJzLmdldFZvbHVtZUNvbnRyb2xTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RyZWFtID09IEF1ZGlvTWFuYWdlci5VU0VfREVGQVVMVF9TVFJFQU1fVFlQRSkgewotICAgICAgICAgICAgICAgICAgICAvLyBJdCBtYXkgaGFwcGVuIGlmIHRoZSBBdWRpb0F0dHJpYnV0ZXMgZG9lc24ndCBoYXZlIHVzYWdlLgotICAgICAgICAgICAgICAgICAgICAvLyBDaGFuZ2UgaXQgdG8gdGhlIFNUUkVBTV9NVVNJQyBiZWNhdXNlIGl0J3Mgbm90IHN1cHBvcnRlZCBieSBhdWRpbyBtYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgIC8vIGZvciBxdWVyeWluZyB2b2x1bWUgbGV2ZWwuCi0gICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5mbyA9IE1lZGlhQ29udHJvbGxlcjJJbXBsLlBsYXliYWNrSW5mb0ltcGwuY3JlYXRlUGxheWJhY2tJbmZvKAotICAgICAgICAgICAgICAgICAgICBQbGF5YmFja0luZm8uUExBWUJBQ0tfVFlQRV9MT0NBTCwKLSAgICAgICAgICAgICAgICAgICAgYXR0cnMsCi0gICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuaXNWb2x1bWVGaXhlZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBWb2x1bWVQcm92aWRlcjIuVk9MVU1FX0NPTlRST0xfRklYRUQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFZvbHVtZVByb3ZpZGVyMi5WT0xVTUVfQ09OVFJPTF9BQlNPTFVURSwKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1NYXhWb2x1bWUoc3RyZWFtKSwKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1Wb2x1bWUoc3RyZWFtKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbmZvID0gTWVkaWFDb250cm9sbGVyMkltcGwuUGxheWJhY2tJbmZvSW1wbC5jcmVhdGVQbGF5YmFja0luZm8oCi0gICAgICAgICAgICAgICAgICAgIFBsYXliYWNrSW5mby5QTEFZQkFDS19UWVBFX1JFTU9URSAvKiBDb250cm9sVHlwZSAqLywKLSAgICAgICAgICAgICAgICAgICAgYXR0cnMsCi0gICAgICAgICAgICAgICAgICAgIHZvbHVtZVByb3ZpZGVyLmdldENvbnRyb2xUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgIHZvbHVtZVByb3ZpZGVyLmdldE1heFZvbHVtZSgpLAotICAgICAgICAgICAgICAgICAgICB2b2x1bWVQcm92aWRlci5nZXRDdXJyZW50Vm9sdW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbmZvOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNsb3NlX2ltcGwoKSB7Ci0gICAgICAgIC8vIFN0b3Agc3lzdGVtIHNlcnZpY2UgZnJvbSBsaXN0ZW5pbmcgdGhpcyBzZXNzaW9uIGZpcnN0LgotICAgICAgICBNZWRpYVNlc3Npb25NYW5hZ2VyIG1hbmFnZXIgPQotICAgICAgICAgICAgICAgIChNZWRpYVNlc3Npb25NYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTUVESUFfU0VTU0lPTl9TRVJWSUNFKTsKLSAgICAgICAgbWFuYWdlci5kZXN0cm95U2Vzc2lvbjIobVNlc3Npb25Ub2tlbik7Ci0KLSAgICAgICAgaWYgKG1TZXNzaW9uU3R1YiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJzZXNzaW9uIGlzIG5vdyB1bmF2YWlsYWJsZSwgaWQ9IiArIG1JZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnZhbGlkYXRlIHByZXZpb3VzbHkgcHVibGlzaGVkIHNlc3Npb24gc3R1Yi4KLSAgICAgICAgICAgIG1TZXNzaW9uU3R1Yi5kZXN0cm95Tm90TG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllcjsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50OwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICAgICAgbVBsYXllciA9IG51bGw7Ci0gICAgICAgICAgICBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICAgICAgbVBsYXlsaXN0QWdlbnQgPSBudWxsOwotICAgICAgICAgICAgbVNlc3Npb25QbGF5bGlzdEFnZW50ID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBsYXllci51bnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhtUGxheWVyRXZlbnRDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LnVucmVnaXN0ZXJQbGF5bGlzdEV2ZW50Q2FsbGJhY2sobVBsYXlsaXN0RXZlbnRDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFQbGF5ZXJCYXNlIGdldFBsYXllcl9pbXBsKCkgewotICAgICAgICByZXR1cm4gZ2V0UGxheWVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhUGxheWxpc3RBZ2VudCBnZXRQbGF5bGlzdEFnZW50X2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtUGxheWxpc3RBZ2VudDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVm9sdW1lUHJvdmlkZXIyIGdldFZvbHVtZVByb3ZpZGVyX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtVm9sdW1lUHJvdmlkZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNlc3Npb25Ub2tlbjIgZ2V0VG9rZW5faW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9uVG9rZW47Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8Q29udHJvbGxlckluZm8+IGdldENvbm5lY3RlZENvbnRyb2xsZXJzX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvblN0dWIuZ2V0Q29udHJvbGxlcnMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRBdWRpb0ZvY3VzUmVxdWVzdF9pbXBsKEF1ZGlvRm9jdXNSZXF1ZXN0IGFmcikgewotICAgICAgICAvLyBpbXBsZW1lbnQKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwbGF5X2ltcGwoKSB7Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcGxheWVyLnBsYXkoKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBhdXNlX2ltcGwoKSB7Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcGxheWVyLnBhdXNlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdG9wX2ltcGwoKSB7Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcGxheWVyLnJlc2V0KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QbGF5bGlzdEl0ZW1faW1wbChATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQuc2tpcFRvUGxheWxpc3RJdGVtKGl0ZW0pOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUHJldmlvdXNJdGVtX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQuc2tpcFRvUHJldmlvdXNJdGVtKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9OZXh0SXRlbV9pbXBsKCkgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LnNraXBUb05leHRJdGVtKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21MYXlvdXRfaW1wbChATm9uTnVsbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyLAotICAgICAgICAgICAgQE5vbk51bGwgTGlzdDxDb21tYW5kQnV0dG9uPiBsYXlvdXQpIHsKLSAgICAgICAgZW5zdXJlQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250cm9sbGVyIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxheW91dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsYXlvdXQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5Q3VzdG9tTGF5b3V0Tm90TG9ja2VkKGNvbnRyb2xsZXIsIGxheW91dCk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBUT0RPKGphZXdhbik6IEltcGxlbWVudCBmb2xsb3dzCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEFsbG93ZWRDb21tYW5kc19pbXBsKEBOb25OdWxsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsCi0gICAgICAgICAgICBATm9uTnVsbCBTZXNzaW9uQ29tbWFuZEdyb3VwMiBjb21tYW5kcykgewotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250cm9sbGVyIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbW1hbmRzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmRzIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgbVNlc3Npb25TdHViLnNldEFsbG93ZWRDb21tYW5kcyhjb250cm9sbGVyLCBjb21tYW5kcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2VuZEN1c3RvbUNvbW1hbmRfaW1wbChATm9uTnVsbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyLAotICAgICAgICAgICAgQE5vbk51bGwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQsIEJ1bmRsZSBhcmdzLCBSZXN1bHRSZWNlaXZlciByZWNlaXZlcikgewotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250cm9sbGVyIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIG1TZXNzaW9uU3R1Yi5zZW5kQ3VzdG9tQ29tbWFuZChjb250cm9sbGVyLCBjb21tYW5kLCBhcmdzLCByZWNlaXZlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2VuZEN1c3RvbUNvbW1hbmRfaW1wbChATm9uTnVsbCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCwgQnVuZGxlIGFyZ3MpIHsKLSAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIG1TZXNzaW9uU3R1Yi5zZW5kQ3VzdG9tQ29tbWFuZChjb21tYW5kLCBhcmdzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5bGlzdF9pbXBsKEBOb25OdWxsIExpc3Q8TWVkaWFJdGVtMj4gbGlzdCwgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGlzdCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC5zZXRQbGF5bGlzdChsaXN0LCBtZXRhZGF0YSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5bGlzdE1ldGFkYXRhX2ltcGwoTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC51cGRhdGVQbGF5bGlzdE1ldGFkYXRhKG1ldGFkYXRhKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZFBsYXlsaXN0SXRlbV9pbXBsKGludCBpbmRleCwgQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImluZGV4IHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LmFkZFBsYXlsaXN0SXRlbShpbmRleCwgaXRlbSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQbGF5bGlzdEl0ZW1faW1wbChATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKGl0ZW0pOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVwbGFjZVBsYXlsaXN0SXRlbV9pbXBsKGludCBpbmRleCwgQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImluZGV4IHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LnJlcGxhY2VQbGF5bGlzdEl0ZW0oaW5kZXgsIGl0ZW0pOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8TWVkaWFJdGVtMj4gZ2V0UGxheWxpc3RfaW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWdlbnQuZ2V0UGxheWxpc3QoKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTIgZ2V0UGxheWxpc3RNZXRhZGF0YV9pbXBsKCkgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBhZ2VudC5nZXRQbGF5bGlzdE1ldGFkYXRhKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhSXRlbTIgZ2V0Q3VycmVudFBsYXlsaXN0SXRlbV9pbXBsKCkgewotICAgICAgICAvLyBUT0RPKGphZXdhbik6IEltcGxlbWVudAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFJlcGVhdE1vZGVfaW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWdlbnQuZ2V0UmVwZWF0TW9kZSgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfTk9ORTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBlYXRNb2RlX2ltcGwoaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC5zZXRSZXBlYXRNb2RlKHJlcGVhdE1vZGUpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRTaHVmZmxlTW9kZV9pbXBsKCkgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBhZ2VudC5nZXRTaHVmZmxlTW9kZSgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX05PTkU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U2h1ZmZsZU1vZGVfaW1wbChpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC5zZXRTaHVmZmxlTW9kZShzaHVmZmxlTW9kZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlX2ltcGwoKSB7Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcGxheWVyLnByZXBhcmUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNlZWtUb19pbXBsKGxvbmcgcG9zKSB7Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcGxheWVyLnNlZWtUbyhwb3MpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBQbGF5ZXJTdGF0ZSBpbnQgZ2V0UGxheWVyU3RhdGVfaW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXIuZ2V0UGxheWVyU3RhdGUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTWVkaWFQbGF5ZXJCYXNlLlBMQVlFUl9TVEFURV9FUlJPUjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRDdXJyZW50UG9zaXRpb25faW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXIuZ2V0Q3VycmVudFBvc2l0aW9uKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE1lZGlhUGxheWVyQmFzZS5VTktOT1dOX1RJTUU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0QnVmZmVyZWRQb3NpdGlvbl9pbXBsKCkgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXllckJhc2UgcGxheWVyID0gbVBsYXllcjsKLSAgICAgICAgaWYgKHBsYXllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXllci5nZXRCdWZmZXJlZFBvc2l0aW9uKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE1lZGlhUGxheWVyQmFzZS5VTktOT1dOX1RJTUU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RXJyb3JfaW1wbChpbnQgZXJyb3JDb2RlLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG1TZXNzaW9uU3R1Yi5ub3RpZnlFcnJvcihlcnJvckNvZGUsIGV4dHJhcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0T25EYXRhU291cmNlTWlzc2luZ0hlbHBlcl9pbXBsKEBOb25OdWxsIE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIgaGVscGVyKSB7Ci0gICAgICAgIGlmIChoZWxwZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaGVscGVyIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbURzbUhlbHBlciA9IGhlbHBlcjsKLSAgICAgICAgICAgIGlmIChtU2Vzc2lvblBsYXlsaXN0QWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZXNzaW9uUGxheWxpc3RBZ2VudC5zZXRPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyKGhlbHBlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbGVhck9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXJfaW1wbCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbURzbUhlbHBlciA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobVNlc3Npb25QbGF5bGlzdEFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2Vzc2lvblBsYXlsaXN0QWdlbnQuY2xlYXJPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBQcm90ZWN0ZWQgb3IgcHJpdmF0ZSBtZXRob2RzCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAvLyBFbmZvcmNlcyBkZXZlbG9wZXJzIHRvIGNhbGwgYWxsIHRoZSBtZXRob2RzIG9uIHRoZSBpbml0aWFsbHkgZ2l2ZW4gdGhyZWFkCi0gICAgLy8gYmVjYXVzZSBjYWxscyBmcm9tIHRoZSBNZWRpYUNvbnRyb2xsZXIyIHdpbGwgYmUgcnVuIG9uIHRoZSB0aHJlYWQuCi0gICAgLy8gVE9ETyhqYWV3YW4pOiBTaG91bGQgd2UgYWxsb3cgY2FsbHMgZnJvbSB0aGUgbXVsdGlwbGUgdGhyZWFkPwotICAgIC8vICAgICAgICAgICAgICAgSSBwcmVmZXIgdGhpcyB3YXkgYmVjYXVzZSBhbGxvd2luZyBtdWx0aXBsZSB0aHJlYWQgbWF5IGNhc2UgdHJpY2t5IGlzc3VlIGxpa2UKLSAgICAvLyAgICAgICAgICAgICAgIGIvNjM0NDYzNjAuIElmIHRoZSB7QGxpbmsgI3NldFBsYXllcigpfSB3aXRoIHtAY29kZSBudWxsfSBjYW4gYmUgY2FsbGVkIGZyb20KLSAgICAvLyAgICAgICAgICAgICAgIGFub3RoZXIgdGhyZWFkLCB0cmFuc3BvcnQgY29udHJvbHMgY2FuIGJlIGNhbGxlZCBhZnRlciB0aGF0LgotICAgIC8vICAgICAgICAgICAgICAgVGhhdCdzIGJhc2ljYWxseSB0aGUgZGV2ZWxvcGVyJ3MgbWlzdGFrZSwgYnV0IHRoZXkgY2Fubm90IHVuZGVyc3RhbmQgd2hhdCdzCi0gICAgLy8gICAgICAgICAgICAgICBoYXBwZW5pbmcgYmVoaW5kIHVudGlsIHdlIHRlbGwgdGhlbSBzby4KLSAgICAvLyAgICAgICAgICAgICAgIElmIGVuZm9yY2luZyBjYWxsbGluZyB0aHJlYWQgZG9lc24ndCBsb29rIGdvb2QsIHdlIGNhbiBhbHRlcm5hdGl2ZWx5IHBpY2sKLSAgICAvLyAgICAgICAgICAgICAgIDEuIEFsbG93IGNhbGxzIGZyb20gcmFuZG9tIHRocmVhZHMgZm9yIGFsbCBtZXRob2RzLgotICAgIC8vICAgICAgICAgICAgICAgMi4gQWxsb3cgY2FsbHMgZnJvbSByYW5kb20gdGhyZWFkcyBmb3IgYWxsIG1ldGhvZHMsIGV4Y2VwdCBmb3IgdGhlCi0gICAgLy8gICAgICAgICAgICAgICAgICB7QGxpbmsgI3NldFBsYXllcigpfS4KLSAgICB2b2lkIGVuc3VyZUNhbGxpbmdUaHJlYWQoKSB7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogVW5jb21tZW50IG9yIHJlbW92ZQotICAgICAgICAvKgotICAgICAgICBpZiAobUhhbmRsZXIuZ2V0TG9vcGVyKCkgIT0gTG9vcGVyLm15TG9vcGVyKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlJ1biB0aGlzIG9uIHRoZSBnaXZlbiB0aHJlYWQiKTsKLSAgICAgICAgfSovCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeVBsYXlsaXN0Q2hhbmdlZE9uRXhlY3V0b3IoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IGxpc3QsIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGlmIChwbGF5bGlzdEFnZW50ICE9IG1QbGF5bGlzdEFnZW50KSB7Ci0gICAgICAgICAgICAvLyBJZ25vcmUgY2FsbHMgZnJvbSB0aGUgb2xkIGFnZW50LgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZChtSW5zdGFuY2UsIHBsYXlsaXN0QWdlbnQsIGxpc3QsIG1ldGFkYXRhKTsKLSAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVBsYXlsaXN0Q2hhbmdlZE5vdExvY2tlZChsaXN0LCBtZXRhZGF0YSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeVBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkT25FeGVjdXRvcihNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwKLSAgICAgICAgICAgIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGlmIChwbGF5bGlzdEFnZW50ICE9IG1QbGF5bGlzdEFnZW50KSB7Ci0gICAgICAgICAgICAvLyBJZ25vcmUgY2FsbHMgZnJvbSB0aGUgb2xkIGFnZW50LgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFjay5vblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKG1JbnN0YW5jZSwgcGxheWxpc3RBZ2VudCwgbWV0YWRhdGEpOwotICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5UGxheWxpc3RNZXRhZGF0YUNoYW5nZWROb3RMb2NrZWQobWV0YWRhdGEpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBub3RpZnlSZXBlYXRNb2RlQ2hhbmdlZE9uRXhlY3V0b3IoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICBpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICBpZiAocGxheWxpc3RBZ2VudCAhPSBtUGxheWxpc3RBZ2VudCkgewotICAgICAgICAgICAgLy8gSWdub3JlIGNhbGxzIGZyb20gdGhlIG9sZCBhZ2VudC4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZChtSW5zdGFuY2UsIHBsYXlsaXN0QWdlbnQsIHJlcGVhdE1vZGUpOwotICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5UmVwZWF0TW9kZUNoYW5nZWROb3RMb2NrZWQocmVwZWF0TW9kZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeVNodWZmbGVNb2RlQ2hhbmdlZE9uRXhlY3V0b3IoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICBpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgaWYgKHBsYXlsaXN0QWdlbnQgIT0gbVBsYXlsaXN0QWdlbnQpIHsKLSAgICAgICAgICAgIC8vIElnbm9yZSBjYWxscyBmcm9tIHRoZSBvbGQgYWdlbnQuCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrLm9uU2h1ZmZsZU1vZGVDaGFuZ2VkKG1JbnN0YW5jZSwgcGxheWxpc3RBZ2VudCwgc2h1ZmZsZU1vZGUpOwotICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5U2h1ZmZsZU1vZGVDaGFuZ2VkTm90TG9ja2VkKHNodWZmbGVNb2RlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5UGxheWVyVXBkYXRlZE5vdExvY2tlZChNZWRpYVBsYXllckJhc2Ugb2xkUGxheWVyKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICAvLyBUT0RPKGphZXdhbik6IChDYW4gYmUgcG9zdC1QKSBGaW5kIGJldHRlciB3YXkgZm9yIHBsYXllci5nZXRQbGF5ZXJTdGF0ZSgpIC8vCi0gICAgICAgIC8vICAgICAgICAgICAgICAgSW4gdGhlb3J5LCBTZXNzaW9uLmdldFhYWCgpIG1heSBub3QgYmUgdGhlIHNhbWUgYXMgUGxheWVyLmdldFhYWCgpCi0gICAgICAgIC8vICAgICAgICAgICAgICAgYW5kIHdlIHNob3VsZCBub3RpZnkgaW5mb3JtYXRpb24gb2YgdGhlIHNlc3Npb24uZ2V0WFhYKCkgaW5zdGVhZCBvZgotICAgICAgICAvLyAgICAgICAgICAgICAgIHBsYXllci5nZXRYWFgoKQotICAgICAgICAvLyBOb3RpZnkgdG8gY29udHJvbGxlcnMgYXMgd2VsbC4KLSAgICAgICAgZmluYWwgaW50IHN0YXRlID0gcGxheWVyLmdldFBsYXllclN0YXRlKCk7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBvbGRQbGF5ZXIuZ2V0UGxheWVyU3RhdGUoKSkgewotICAgICAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVBsYXllclN0YXRlQ2hhbmdlZE5vdExvY2tlZChzdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBsb25nIGN1cnJlbnRUaW1lTXMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgZmluYWwgbG9uZyBwb3NpdGlvbiA9IHBsYXllci5nZXRDdXJyZW50UG9zaXRpb24oKTsKLSAgICAgICAgaWYgKHBvc2l0aW9uICE9IG9sZFBsYXllci5nZXRDdXJyZW50UG9zaXRpb24oKSkgewotICAgICAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVBvc2l0aW9uQ2hhbmdlZE5vdExvY2tlZChjdXJyZW50VGltZU1zLCBwb3NpdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBmbG9hdCBzcGVlZCA9IHBsYXllci5nZXRQbGF5YmFja1NwZWVkKCk7Ci0gICAgICAgIGlmIChzcGVlZCAhPSBvbGRQbGF5ZXIuZ2V0UGxheWJhY2tTcGVlZCgpKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5UGxheWJhY2tTcGVlZENoYW5nZWROb3RMb2NrZWQoc3BlZWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgbG9uZyBidWZmZXJlZFBvc2l0aW9uID0gcGxheWVyLmdldEJ1ZmZlcmVkUG9zaXRpb24oKTsKLSAgICAgICAgaWYgKGJ1ZmZlcmVkUG9zaXRpb24gIT0gb2xkUGxheWVyLmdldEJ1ZmZlcmVkUG9zaXRpb24oKSkgewotICAgICAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeUJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VkTm90TG9ja2VkKGJ1ZmZlcmVkUG9zaXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQ29udGV4dCBnZXRDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gbUNvbnRleHQ7Ci0gICAgfQotCi0gICAgTWVkaWFTZXNzaW9uMiBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBNZWRpYVBsYXllckJhc2UgZ2V0UGxheWVyKCkgewotICAgICAgICByZXR1cm4gbVBsYXllcjsKLSAgICB9Ci0KLSAgICBNZWRpYVBsYXlsaXN0QWdlbnQgZ2V0UGxheWxpc3RBZ2VudCgpIHsKLSAgICAgICAgcmV0dXJuIG1QbGF5bGlzdEFnZW50OwotICAgIH0KLQotICAgIEV4ZWN1dG9yIGdldENhbGxiYWNrRXhlY3V0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtQ2FsbGJhY2tFeGVjdXRvcjsKLSAgICB9Ci0KLSAgICBTZXNzaW9uQ2FsbGJhY2sgZ2V0Q2FsbGJhY2soKSB7Ci0gICAgICAgIHJldHVybiBtQ2FsbGJhY2s7Ci0gICAgfQotCi0gICAgTWVkaWFTZXNzaW9uMlN0dWIgZ2V0U2Vzc2lvblN0dWIoKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvblN0dWI7Ci0gICAgfQotCi0gICAgVm9sdW1lUHJvdmlkZXIyIGdldFZvbHVtZVByb3ZpZGVyKCkgewotICAgICAgICByZXR1cm4gbVZvbHVtZVByb3ZpZGVyOwotICAgIH0KLQotICAgIFBsYXliYWNrSW5mbyBnZXRQbGF5YmFja0luZm8oKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWJhY2tJbmZvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgUGVuZGluZ0ludGVudCBnZXRTZXNzaW9uQWN0aXZpdHkoKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbkFjdGl2aXR5OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE15UGxheWVyRXZlbnRDYWxsYmFjayBleHRlbmRzIFBsYXllckV2ZW50Q2FsbGJhY2sgewotICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8TWVkaWFTZXNzaW9uMkltcGw+IG1TZXNzaW9uOwotCi0gICAgICAgIHByaXZhdGUgTXlQbGF5ZXJFdmVudENhbGxiYWNrKE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24pIHsKLSAgICAgICAgICAgIG1TZXNzaW9uID0gbmV3IFdlYWtSZWZlcmVuY2U8PihzZXNzaW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkN1cnJlbnREYXRhU291cmNlQ2hhbmdlZChNZWRpYVBsYXllckJhc2UgbXBiLCBEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgICAgIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsIHx8IGRzZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gZ2V0TWVkaWFJdGVtKHNlc3Npb24sIGRzZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkN1cnJlbnRNZWRpYUl0ZW1DaGFuZ2VkKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgbXBiLCBpdGVtKTsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIChqYWV3YW4pOiBOb3RpZnkgY29udHJvbGxlcnMgdGhyb3VnaCBhcHByb3ByaWF0ZSBjYWxsYmFjay4gKGIvNzQ1MDU5MzYpCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbk1lZGlhUHJlcGFyZWQoTWVkaWFQbGF5ZXJCYXNlIG1wYiwgRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgICAgICBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOwotICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCB8fCBkc2QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IGdldE1lZGlhSXRlbShzZXNzaW9uLCBkc2QpOwotICAgICAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25NZWRpYVByZXBhcmVkKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgbXBiLCBpdGVtKTsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIChqYWV3YW4pOiBOb3RpZnkgY29udHJvbGxlcnMgdGhyb3VnaCBhcHByb3ByaWF0ZSBjYWxsYmFjay4gKGIvNzQ1MDU5MzYpCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXllclN0YXRlQ2hhbmdlZChNZWRpYVBsYXllckJhc2UgbXBiLCBpbnQgc3RhdGUpIHsKLSAgICAgICAgICAgIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uUGxheWVyU3RhdGVDaGFuZ2VkKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgbXBiLCBzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRTZXNzaW9uU3R1YigpLm5vdGlmeVBsYXllclN0YXRlQ2hhbmdlZE5vdExvY2tlZChzdGF0ZSk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkJ1ZmZlcmluZ1N0YXRlQ2hhbmdlZChNZWRpYVBsYXllckJhc2UgbXBiLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCBzdGF0ZSkgewotICAgICAgICAgICAgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgfHwgZHNkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBnZXRNZWRpYUl0ZW0oc2Vzc2lvbiwgZHNkKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uQnVmZmVyaW5nU3RhdGVDaGFuZ2VkKAotICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBtcGIsIGl0ZW0sIHN0YXRlKTsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIChqYWV3YW4pOiBOb3RpZnkgY29udHJvbGxlcnMgdGhyb3VnaCBhcHByb3ByaWF0ZSBjYWxsYmFjay4gKGIvNzQ1MDU5MzYpCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uMkltcGwgZ2V0U2Vzc2lvbigpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBtU2Vzc2lvbi5nZXQoKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgJiYgREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTZXNzaW9uIGlzIGNsb3NlZCIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc2Vzc2lvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgTWVkaWFJdGVtMiBnZXRNZWRpYUl0ZW0oTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiwgRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgICAgICBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBzZXNzaW9uLmdldFBsYXlsaXN0QWdlbnQoKTsKLSAgICAgICAgICAgIGlmIChhZ2VudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlNlc3Npb24gaXMgY2xvc2VkIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBhZ2VudC5nZXRNZWRpYUl0ZW0oZHNkKTsKLSAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ291bGQgbm90IGZpbmQgbWF0Y2hpbmcgaXRlbSBmb3IgZHNkPSIgKyBkc2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGl0ZW07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNeVBsYXlsaXN0RXZlbnRDYWxsYmFjayBleHRlbmRzIFBsYXlsaXN0RXZlbnRDYWxsYmFjayB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxNZWRpYVNlc3Npb24ySW1wbD4gbVNlc3Npb247Ci0KLSAgICAgICAgcHJpdmF0ZSBNeVBsYXlsaXN0RXZlbnRDYWxsYmFjayhNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvbiA9IG5ldyBXZWFrUmVmZXJlbmNlPD4oc2Vzc2lvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25QbGF5bGlzdENoYW5nZWQoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsIExpc3Q8TWVkaWFJdGVtMj4gbGlzdCwKLSAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IG1TZXNzaW9uLmdldCgpOwotICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24ubm90aWZ5UGxheWxpc3RDaGFuZ2VkT25FeGVjdXRvcihwbGF5bGlzdEFnZW50LCBsaXN0LCBtZXRhZGF0YSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZChNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwKLSAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IG1TZXNzaW9uLmdldCgpOwotICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24ubm90aWZ5UGxheWxpc3RNZXRhZGF0YUNoYW5nZWRPbkV4ZWN1dG9yKHBsYXlsaXN0QWdlbnQsIG1ldGFkYXRhKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJlcGVhdE1vZGVDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IG1TZXNzaW9uLmdldCgpOwotICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24ubm90aWZ5UmVwZWF0TW9kZUNoYW5nZWRPbkV4ZWN1dG9yKHBsYXlsaXN0QWdlbnQsIHJlcGVhdE1vZGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBtU2Vzc2lvbi5nZXQoKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLm5vdGlmeVNodWZmbGVNb2RlQ2hhbmdlZE9uRXhlY3V0b3IocGxheWxpc3RBZ2VudCwgc2h1ZmZsZU1vZGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBDb21tYW5kSW1wbCBpbXBsZW1lbnRzIENvbW1hbmRQcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NTUFORF9DT0RFCi0gICAgICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5jb21tYW5kLmNvbW1hbmRfY29kZSI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NTUFORF9DVVNUT01fQ09NTUFORAotICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZC5jdXN0b21fY29tbWFuZCI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NTUFORF9FWFRSQVMKLSAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmQuZXh0cmFzIjsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIFNlc3Npb25Db21tYW5kMiBtSW5zdGFuY2U7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1Db21tYW5kQ29kZTsKLSAgICAgICAgLy8gTm9ubnVsbCBpZiBpdCdzIGN1c3RvbSBjb21tYW5kCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1DdXN0b21Db21tYW5kOwotICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtRXh0cmFzOwotCi0gICAgICAgIHB1YmxpYyBDb21tYW5kSW1wbChTZXNzaW9uQ29tbWFuZDIgaW5zdGFuY2UsIGludCBjb21tYW5kQ29kZSkgewotICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICBtQ29tbWFuZENvZGUgPSBjb21tYW5kQ29kZTsKLSAgICAgICAgICAgIG1DdXN0b21Db21tYW5kID0gbnVsbDsKLSAgICAgICAgICAgIG1FeHRyYXMgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENvbW1hbmRJbXBsKFNlc3Npb25Db21tYW5kMiBpbnN0YW5jZSwgQE5vbk51bGwgU3RyaW5nIGFjdGlvbiwKLSAgICAgICAgICAgICAgICBATnVsbGFibGUgQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYWN0aW9uIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgICAgIG1Db21tYW5kQ29kZSA9IENPTU1BTkRfQ09ERV9DVVNUT007Ci0gICAgICAgICAgICBtQ3VzdG9tQ29tbWFuZCA9IGFjdGlvbjsKLSAgICAgICAgICAgIG1FeHRyYXMgPSBleHRyYXM7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRDb21tYW5kQ29kZV9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db21tYW5kQ29kZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQE51bGxhYmxlIFN0cmluZyBnZXRDdXN0b21Db21tYW5kX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUN1c3RvbUNvbW1hbmQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEBOdWxsYWJsZSBCdW5kbGUgZ2V0RXh0cmFzX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUV4dHJhczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIGEgbmV3IEJ1bmRsZSBpbnN0YW5jZSBmcm9tIHRoZSBDb21tYW5kCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1bmRsZSB0b0J1bmRsZV9pbXBsKCkgewotICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX0NPTU1BTkRfQ09ERSwgbUNvbW1hbmRDb2RlKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoS0VZX0NPTU1BTkRfQ1VTVE9NX0NPTU1BTkQsIG1DdXN0b21Db21tYW5kKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRCdW5kbGUoS0VZX0NPTU1BTkRfRVhUUkFTLCBtRXh0cmFzKTsKLSAgICAgICAgICAgIHJldHVybiBidW5kbGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiBhIG5ldyBDb21tYW5kIGluc3RhbmNlIGZyb20gdGhlIEJ1bmRsZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBTZXNzaW9uQ29tbWFuZDIgZnJvbUJ1bmRsZV9pbXBsKEBOb25OdWxsIEJ1bmRsZSBjb21tYW5kKSB7Ci0gICAgICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGNvZGUgPSBjb21tYW5kLmdldEludChLRVlfQ09NTUFORF9DT0RFKTsKLSAgICAgICAgICAgIGlmIChjb2RlICE9IENPTU1BTkRfQ09ERV9DVVNUT00pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25Db21tYW5kMihjb2RlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGN1c3RvbUNvbW1hbmQgPSBjb21tYW5kLmdldFN0cmluZyhLRVlfQ09NTUFORF9DVVNUT01fQ09NTUFORCk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1c3RvbUNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uQ29tbWFuZDIoY3VzdG9tQ29tbWFuZCwgY29tbWFuZC5nZXRCdW5kbGUoS0VZX0NPTU1BTkRfRVhUUkFTKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzX2ltcGwoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgQ29tbWFuZEltcGwpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29tbWFuZEltcGwgb3RoZXIgPSAoQ29tbWFuZEltcGwpIG9iajsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogQ29tcGFyZSBDb21tYW5kcyB3aXRoIHRoZSBnZW5lcmF0ZWQgVVVJRCwgYXMgd2UncmUgZG9pbmcgZm9yIHRoZSBNSTIuCi0gICAgICAgICAgICByZXR1cm4gbUNvbW1hbmRDb2RlID09IG90aGVyLm1Db21tYW5kQ29kZQotICAgICAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuZXF1YWxzKG1DdXN0b21Db21tYW5kLCBvdGhlci5tQ3VzdG9tQ29tbWFuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBoYXNoQ29kZV9pbXBsKCkgewotICAgICAgICAgICAgZmluYWwgaW50IHByaW1lID0gMzE7Ci0gICAgICAgICAgICByZXR1cm4gKChtQ3VzdG9tQ29tbWFuZCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICA/IG1DdXN0b21Db21tYW5kLmhhc2hDb2RlKCkgOiAwKSAqIHByaW1lICsgbUNvbW1hbmRDb2RlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwcmVzZW50IHNldCBvZiB7QGxpbmsgU2Vzc2lvbkNvbW1hbmQyfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbW1hbmRHcm91cEltcGwgaW1wbGVtZW50cyBDb21tYW5kR3JvdXBQcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NTUFORFMgPQotICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLm1lZGlhc2Vzc2lvbjIuY29tbWFuZGdyb3VwLmNvbW1hbmRzIjsKLQotICAgICAgICAvLyBQcmVmaXggZm9yIGFsbCBjb21tYW5kIGNvZGVzCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfQ09NTUFORF9DT0RFID0gIkNPTU1BTkRfQ09ERV8iOwotCi0gICAgICAgIC8vIFByZWZpeCBmb3IgY29tbWFuZCBjb2RlcyB0aGF0IHdpbGwgYmUgc2VudCBkaXJlY3RseSB0byB0aGUgTWVkaWFQbGF5ZXJCYXNlCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfQ09NTUFORF9DT0RFX1BMQVlCQUNLID0gIkNPTU1BTkRfQ09ERV9QTEFZQkFDS18iOwotCi0gICAgICAgIC8vIFByZWZpeCBmb3IgY29tbWFuZCBjb2RlcyB0aGF0IHdpbGwgYmUgc2VudCBkaXJlY3RseSB0byB0aGUgTWVkaWFQbGF5bGlzdEFnZW50Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfQ09NTUFORF9DT0RFX1BMQVlMSVNUID0gIkNPTU1BTkRfQ09ERV9QTEFZTElTVF8iOwotCi0gICAgICAgIHByaXZhdGUgU2V0PFNlc3Npb25Db21tYW5kMj4gbUNvbW1hbmRzID0gbmV3IEhhc2hTZXQ8PigpOwotICAgICAgICBwcml2YXRlIGZpbmFsIFNlc3Npb25Db21tYW5kR3JvdXAyIG1JbnN0YW5jZTsKLQotICAgICAgICBwdWJsaWMgQ29tbWFuZEdyb3VwSW1wbChTZXNzaW9uQ29tbWFuZEdyb3VwMiBpbnN0YW5jZSwgT2JqZWN0IG90aGVyKSB7Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgICAgIGlmIChvdGhlciAhPSBudWxsICYmIG90aGVyIGluc3RhbmNlb2YgQ29tbWFuZEdyb3VwSW1wbCkgewotICAgICAgICAgICAgICAgIG1Db21tYW5kcy5hZGRBbGwoKChDb21tYW5kR3JvdXBJbXBsKSBvdGhlcikubUNvbW1hbmRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDb21tYW5kR3JvdXBJbXBsKCkgewotICAgICAgICAgICAgbUluc3RhbmNlID0gbmV3IFNlc3Npb25Db21tYW5kR3JvdXAyKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZENvbW1hbmRfaW1wbChATm9uTnVsbCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCkgewotICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Db21tYW5kcy5hZGQoY29tbWFuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgYWRkQWxsUHJlZGVmaW5lZENvbW1hbmRzX2ltcGwoKSB7Ci0gICAgICAgICAgICBhZGRDb21tYW5kc1dpdGhQcmVmaXgoUFJFRklYX0NPTU1BTkRfQ09ERSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGFkZEFsbFBsYXliYWNrQ29tbWFuZHMoKSB7Ci0gICAgICAgICAgICBhZGRDb21tYW5kc1dpdGhQcmVmaXgoUFJFRklYX0NPTU1BTkRfQ09ERV9QTEFZQkFDSyk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGFkZEFsbFBsYXlsaXN0Q29tbWFuZHMoKSB7Ci0gICAgICAgICAgICBhZGRDb21tYW5kc1dpdGhQcmVmaXgoUFJFRklYX0NPTU1BTkRfQ09ERV9QTEFZTElTVCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgYWRkQ29tbWFuZHNXaXRoUHJlZml4KFN0cmluZyBwcmVmaXgpIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogKENhbiBiZSBwb3N0LVApOiBEb24ndCB1c2UgcmVmbGVjdGlvbiBmb3IgdGhpcyBwdXJwb3NlLgotICAgICAgICAgICAgZmluYWwgRmllbGRbXSBmaWVsZHMgPSBNZWRpYVNlc3Npb24yLmNsYXNzLmdldEZpZWxkcygpOwotICAgICAgICAgICAgaWYgKGZpZWxkcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkc1tpXS5nZXROYW1lKCkuc3RhcnRzV2l0aChwcmVmaXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21tYW5kcy5hZGQobmV3IFNlc3Npb25Db21tYW5kMihmaWVsZHNbaV0uZ2V0SW50KG51bGwpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJVbmV4cGVjdGVkICIgKyBmaWVsZHNbaV0gKyAiIGluIE1lZGlhU2Vzc2lvbjIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVDb21tYW5kX2ltcGwoQE5vbk51bGwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQpIHsKLSAgICAgICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ29tbWFuZHMucmVtb3ZlKGNvbW1hbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0NvbW1hbmRfaW1wbChATm9uTnVsbCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCkgewotICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtQ29tbWFuZHMuY29udGFpbnMoY29tbWFuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzQ29tbWFuZF9pbXBsKGludCBjb2RlKSB7Ci0gICAgICAgICAgICBpZiAoY29kZSA9PSBDT01NQU5EX0NPREVfQ1VTVE9NKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVXNlIGhhc0NvbW1hbmQoQ29tbWFuZCkgZm9yIGN1c3RvbSBjb21tYW5kIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKFNlc3Npb25Db21tYW5kMiBjb21tYW5kIDogbUNvbW1hbmRzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbW1hbmQuZ2V0Q29tbWFuZENvZGUoKSA9PSBjb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU2V0PFNlc3Npb25Db21tYW5kMj4gZ2V0Q29tbWFuZHNfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDb21tYW5kcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNldDxTZXNzaW9uQ29tbWFuZDI+IGdldENvbW1hbmRzKCkgewotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChtQ29tbWFuZHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEByZXR1cm4gbmV3IGJ1bmRsZSBmcm9tIHRoZSBDb21tYW5kR3JvdXAKLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVuZGxlIHRvQnVuZGxlX2ltcGwoKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8QnVuZGxlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBmb3IgKFNlc3Npb25Db21tYW5kMiBjb21tYW5kIDogbUNvbW1hbmRzKSB7Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQoY29tbWFuZC50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBidW5kbGUucHV0UGFyY2VsYWJsZUFycmF5TGlzdChLRVlfQ09NTUFORFMsIGxpc3QpOwotICAgICAgICAgICAgcmV0dXJuIGJ1bmRsZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIG5ldyBpbnN0YW5jZSBvZiBDb21tYW5kR3JvdXAgZnJvbSB0aGUgYnVuZGxlCi0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIEBOdWxsYWJsZSBTZXNzaW9uQ29tbWFuZEdyb3VwMiBmcm9tQnVuZGxlX2ltcGwoQnVuZGxlIGNvbW1hbmRzKSB7Ci0gICAgICAgICAgICBpZiAoY29tbWFuZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGlzdDxQYXJjZWxhYmxlPiBsaXN0ID0gY29tbWFuZHMuZ2V0UGFyY2VsYWJsZUFycmF5TGlzdChLRVlfQ09NTUFORFMpOwotICAgICAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmRHcm91cDIgY29tbWFuZEdyb3VwID0gbmV3IFNlc3Npb25Db21tYW5kR3JvdXAyKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBQYXJjZWxhYmxlIHBhcmNlbGFibGUgPSBsaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoIShwYXJjZWxhYmxlIGluc3RhbmNlb2YgQnVuZGxlKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQnVuZGxlIGNvbW1hbmRCdW5kbGUgPSAoQnVuZGxlKSBwYXJjZWxhYmxlOwotICAgICAgICAgICAgICAgIFNlc3Npb25Db21tYW5kMiBjb21tYW5kID0gU2Vzc2lvbkNvbW1hbmQyLmZyb21CdW5kbGUoY29tbWFuZEJ1bmRsZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb21tYW5kR3JvdXAuYWRkQ29tbWFuZChjb21tYW5kKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY29tbWFuZEdyb3VwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb250cm9sbGVySW5mb0ltcGwgaW1wbGVtZW50cyBDb250cm9sbGVySW5mb1Byb3ZpZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb250cm9sbGVySW5mbyBtSW5zdGFuY2U7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1VaWQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1QYWNrYWdlTmFtZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc1RydXN0ZWQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgbUNvbnRyb2xsZXJCaW5kZXI7Ci0KLSAgICAgICAgcHVibGljIENvbnRyb2xsZXJJbmZvSW1wbChDb250ZXh0IGNvbnRleHQsIENvbnRyb2xsZXJJbmZvIGluc3RhbmNlLCBpbnQgdWlkLAotICAgICAgICAgICAgICAgIGludCBwaWQsIEBOb25OdWxsIFN0cmluZyBwYWNrYWdlTmFtZSwgQE5vbk51bGwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShwYWNrYWdlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYWNrYWdlTmFtZSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICBtVWlkID0gdWlkOwotICAgICAgICAgICAgbVBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7Ci0gICAgICAgICAgICBtQ29udHJvbGxlckJpbmRlciA9IGNhbGxiYWNrOwotICAgICAgICAgICAgTWVkaWFTZXNzaW9uTWFuYWdlciBtYW5hZ2VyID0KLSAgICAgICAgICAgICAgICAgIChNZWRpYVNlc3Npb25NYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5NRURJQV9TRVNTSU9OX1NFUlZJQ0UpOwotICAgICAgICAgICAgLy8gQXNrIHNlcnZlciB3aGV0aGVyIHRoZSBjb250cm9sbGVyIGlzIHRydXN0ZWQuCi0gICAgICAgICAgICAvLyBBcHAgY2Fubm90IGtub3cgdGhpcyBiZWNhdXNlIGFwcHMgY2Fubm90IHF1ZXJ5IGVuYWJsZWQgbm90aWZpY2F0aW9uIGxpc3RlbmVyIGZvcgotICAgICAgICAgICAgLy8gYW5vdGhlciBwYWNrYWdlLCBidXQgc3lzdGVtIHNlcnZlciBjYW4gZG8uCi0gICAgICAgICAgICBtSXNUcnVzdGVkID0gbWFuYWdlci5pc1RydXN0ZWRGb3JNZWRpYUNvbnRyb2woCi0gICAgICAgICAgICAgICAgICAgIG5ldyBNZWRpYVNlc3Npb25NYW5hZ2VyLlJlbW90ZVVzZXJJbmZvKHBhY2thZ2VOYW1lLCBwaWQsIHVpZCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWVfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUGFja2FnZU5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRVaWRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtVWlkOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzVHJ1c3RlZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Jc1RydXN0ZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBoYXNoQ29kZV9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyQmluZGVyLmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzX2ltcGwoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgQ29udHJvbGxlckluZm8pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGVxdWFscygoKENvbnRyb2xsZXJJbmZvKSBvYmopLmdldFByb3ZpZGVyKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmdfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiAiQ29udHJvbGxlckluZm8ge3BrZz0iICsgbVBhY2thZ2VOYW1lICsgIiwgdWlkPSIgKyBtVWlkICsgIiwgdHJ1c3RlZD0iCi0gICAgICAgICAgICAgICAgICAgICsgbUlzVHJ1c3RlZCArICJ9IjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyQmluZGVyLmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIENvbnRyb2xsZXJJbmZvSW1wbCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb250cm9sbGVySW5mb0ltcGwgb3RoZXIgPSAoQ29udHJvbGxlckluZm9JbXBsKSBvYmo7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbnRyb2xsZXJCaW5kZXIuYXNCaW5kZXIoKS5lcXVhbHMob3RoZXIubUNvbnRyb2xsZXJCaW5kZXIuYXNCaW5kZXIoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBDb250cm9sbGVySW5mbyBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBJQmluZGVyIGdldElkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyQmluZGVyLmFzQmluZGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBJTWVkaWFDb250cm9sbGVyMiBnZXRDb250cm9sbGVyQmluZGVyKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyQmluZGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIENvbnRyb2xsZXJJbmZvSW1wbCBmcm9tKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgICAgIHJldHVybiAoQ29udHJvbGxlckluZm9JbXBsKSBjb250cm9sbGVyLmdldFByb3ZpZGVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbW1hbmRCdXR0b25JbXBsIGltcGxlbWVudHMgQ29tbWFuZEJ1dHRvblByb3ZpZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT01NQU5ECi0gICAgICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5jb21tYW5kX2J1dHRvbi5jb21tYW5kIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9JQ09OX1JFU19JRAotICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZF9idXR0b24uaWNvbl9yZXNfaWQiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RJU1BMQVlfTkFNRQotICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZF9idXR0b24uZGlzcGxheV9uYW1lIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FWFRSQVMKLSAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmRfYnV0dG9uLmV4dHJhcyI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRU5BQkxFRAotICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZF9idXR0b24uZW5hYmxlZCI7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb21tYW5kQnV0dG9uIG1JbnN0YW5jZTsKLSAgICAgICAgcHJpdmF0ZSBTZXNzaW9uQ29tbWFuZDIgbUNvbW1hbmQ7Ci0gICAgICAgIHByaXZhdGUgaW50IG1JY29uUmVzSWQ7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1EaXNwbGF5TmFtZTsKLSAgICAgICAgcHJpdmF0ZSBCdW5kbGUgbUV4dHJhczsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVkOwotCi0gICAgICAgIHB1YmxpYyBDb21tYW5kQnV0dG9uSW1wbChATnVsbGFibGUgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQsIGludCBpY29uUmVzSWQsCi0gICAgICAgICAgICAgICAgQE51bGxhYmxlIFN0cmluZyBkaXNwbGF5TmFtZSwgQnVuZGxlIGV4dHJhcywgYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgICAgICBtQ29tbWFuZCA9IGNvbW1hbmQ7Ci0gICAgICAgICAgICBtSWNvblJlc0lkID0gaWNvblJlc0lkOwotICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7Ci0gICAgICAgICAgICBtRXh0cmFzID0gZXh0cmFzOwotICAgICAgICAgICAgbUVuYWJsZWQgPSBlbmFibGVkOwotICAgICAgICAgICAgbUluc3RhbmNlID0gbmV3IENvbW1hbmRCdXR0b24odGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEBOdWxsYWJsZQotICAgICAgICBTZXNzaW9uQ29tbWFuZDIgZ2V0Q29tbWFuZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db21tYW5kOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0SWNvblJlc0lkX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUljb25SZXNJZDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQE51bGxhYmxlIFN0cmluZyBnZXREaXNwbGF5TmFtZV9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5TmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQE51bGxhYmxlIEJ1bmRsZSBnZXRFeHRyYXNfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRXh0cmFzOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1FbmFibGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgQE5vbk51bGwgQnVuZGxlIHRvQnVuZGxlKCkgewotICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRCdW5kbGUoS0VZX0NPTU1BTkQsIG1Db21tYW5kLnRvQnVuZGxlKCkpOwotICAgICAgICAgICAgYnVuZGxlLnB1dEludChLRVlfSUNPTl9SRVNfSUQsIG1JY29uUmVzSWQpOwotICAgICAgICAgICAgYnVuZGxlLnB1dFN0cmluZyhLRVlfRElTUExBWV9OQU1FLCBtRGlzcGxheU5hbWUpOwotICAgICAgICAgICAgYnVuZGxlLnB1dEJ1bmRsZShLRVlfRVhUUkFTLCBtRXh0cmFzKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRCb29sZWFuKEtFWV9FTkFCTEVELCBtRW5hYmxlZCk7Ci0gICAgICAgICAgICByZXR1cm4gYnVuZGxlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIEBOdWxsYWJsZSBDb21tYW5kQnV0dG9uIGZyb21CdW5kbGUoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICAgICAgaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb21tYW5kQnV0dG9uLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBDb21tYW5kQnV0dG9uLkJ1aWxkZXIoKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0Q29tbWFuZChTZXNzaW9uQ29tbWFuZDIuZnJvbUJ1bmRsZShidW5kbGUuZ2V0QnVuZGxlKEtFWV9DT01NQU5EKSkpOwotICAgICAgICAgICAgYnVpbGRlci5zZXRJY29uUmVzSWQoYnVuZGxlLmdldEludChLRVlfSUNPTl9SRVNfSUQsIDApKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGlzcGxheU5hbWUoYnVuZGxlLmdldFN0cmluZyhLRVlfRElTUExBWV9OQU1FKSk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldEV4dHJhcyhidW5kbGUuZ2V0QnVuZGxlKEtFWV9FWFRSQVMpKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0RW5hYmxlZChidW5kbGUuZ2V0Qm9vbGVhbihLRVlfRU5BQkxFRCkpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBNYWxmb3JtZWQgb3IgdmVyc2lvbiBtaXNtYXRjaC4gUmV0dXJuIG51bGwgZm9yIG5vdy4KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgQ29tbWFuZEJ1dHRvbn0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXJJbXBsIGltcGxlbWVudHMgQ29tbWFuZEJ1dHRvblByb3ZpZGVyLkJ1aWxkZXJQcm92aWRlciB7Ci0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIENvbW1hbmRCdXR0b24uQnVpbGRlciBtSW5zdGFuY2U7Ci0gICAgICAgICAgICBwcml2YXRlIFNlc3Npb25Db21tYW5kMiBtQ29tbWFuZDsKLSAgICAgICAgICAgIHByaXZhdGUgaW50IG1JY29uUmVzSWQ7Ci0gICAgICAgICAgICBwcml2YXRlIFN0cmluZyBtRGlzcGxheU5hbWU7Ci0gICAgICAgICAgICBwcml2YXRlIEJ1bmRsZSBtRXh0cmFzOwotICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVkOwotCi0gICAgICAgICAgICBwdWJsaWMgQnVpbGRlckltcGwoQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIGluc3RhbmNlKSB7Ci0gICAgICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICAgICAgbUVuYWJsZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBDb21tYW5kQnV0dG9uLkJ1aWxkZXIgc2V0Q29tbWFuZF9pbXBsKFNlc3Npb25Db21tYW5kMiBjb21tYW5kKSB7Ci0gICAgICAgICAgICAgICAgbUNvbW1hbmQgPSBjb21tYW5kOwotICAgICAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIENvbW1hbmRCdXR0b24uQnVpbGRlciBzZXRJY29uUmVzSWRfaW1wbChpbnQgcmVzSWQpIHsKLSAgICAgICAgICAgICAgICBtSWNvblJlc0lkID0gcmVzSWQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIHNldERpc3BsYXlOYW1lX2ltcGwoU3RyaW5nIGRpc3BsYXlOYW1lKSB7Ci0gICAgICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIHNldEVuYWJsZWRfaW1wbChib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IGVuYWJsZWQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIHNldEV4dHJhc19pbXBsKEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgICAgICBtRXh0cmFzID0gZXh0cmFzOwotICAgICAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIENvbW1hbmRCdXR0b24gYnVpbGRfaW1wbCgpIHsKLSAgICAgICAgICAgICAgICBpZiAobUVuYWJsZWQgJiYgbUNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFbmFibGVkIGJ1dHRvbiBuZWVkcyBDb21tYW5kIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmb3IgY29udHJvbGxlciB0byBpbnZva2UgdGhlIGNvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1Db21tYW5kICE9IG51bGwgJiYgbUNvbW1hbmQuZ2V0Q29tbWFuZENvZGUoKSA9PSBDT01NQU5EX0NPREVfQ1VTVE9NCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAobUljb25SZXNJZCA9PSAwIHx8IFRleHRVdGlscy5pc0VtcHR5KG1EaXNwbGF5TmFtZSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkN1c3RvbSBjb21tYW5kcyBuZWVkcyBpY29uIGFuZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYW5kIG5hbWUgdG8gZGlzcGxheSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbW1hbmRCdXR0b25JbXBsKG1Db21tYW5kLCBtSWNvblJlc0lkLCBtRGlzcGxheU5hbWUsIG1FeHRyYXMsIG1FbmFibGVkKQotICAgICAgICAgICAgICAgICAgICAgICAgLm1JbnN0YW5jZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQnVpbGRlckJhc2VJbXBsPFQgZXh0ZW5kcyBNZWRpYVNlc3Npb24yLCBDIGV4dGVuZHMgU2Vzc2lvbkNhbGxiYWNrPgotICAgICAgICAgICAgaW1wbGVtZW50cyBCdWlsZGVyQmFzZVByb3ZpZGVyPFQsIEM+IHsKLSAgICAgICAgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICAgICAgTWVkaWFQbGF5ZXJCYXNlIG1QbGF5ZXI7Ci0gICAgICAgIFN0cmluZyBtSWQ7Ci0gICAgICAgIEV4ZWN1dG9yIG1DYWxsYmFja0V4ZWN1dG9yOwotICAgICAgICBDIG1DYWxsYmFjazsKLSAgICAgICAgTWVkaWFQbGF5bGlzdEFnZW50IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBWb2x1bWVQcm92aWRlcjIgbVZvbHVtZVByb3ZpZGVyOwotICAgICAgICBQZW5kaW5nSW50ZW50IG1TZXNzaW9uQWN0aXZpdHk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdG9yLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY29udGV4dCBhIGNvbnRleHQKLSAgICAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW55IHBhcmFtZXRlciBpcyBudWxsLCBvciB0aGUgcGxheWVyIGlzIGEKLSAgICAgICAgICogICAgICB7QGxpbmsgTWVkaWFTZXNzaW9uMn0gb3Ige0BsaW5rIE1lZGlhQ29udHJvbGxlcjJ9LgotICAgICAgICAgKi8KLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBBbHNvIG5lZWQgZXhlY3V0b3IKLSAgICAgICAgcHVibGljIEJ1aWxkZXJCYXNlSW1wbChATm9uTnVsbCBDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZXh0IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgICAgICAvLyBFbnN1cmUgbm9uLW51bGwKLSAgICAgICAgICAgIG1JZCA9ICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFBsYXllcl9pbXBsKEBOb25OdWxsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIpIHsKLSAgICAgICAgICAgIGlmIChwbGF5ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBsYXllciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVBsYXllciA9IHBsYXllcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQbGF5bGlzdEFnZW50X2ltcGwoQE5vbk51bGwgTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQpIHsKLSAgICAgICAgICAgIGlmIChwbGF5bGlzdEFnZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwbGF5bGlzdEFnZW50IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUGxheWxpc3RBZ2VudCA9IHBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0Vm9sdW1lUHJvdmlkZXJfaW1wbChWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIpIHsKLSAgICAgICAgICAgIG1Wb2x1bWVQcm92aWRlciA9IHZvbHVtZVByb3ZpZGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb25BY3Rpdml0eV9pbXBsKFBlbmRpbmdJbnRlbnQgcGkpIHsKLSAgICAgICAgICAgIG1TZXNzaW9uQWN0aXZpdHkgPSBwaTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRJZF9pbXBsKEBOb25OdWxsIFN0cmluZyBpZCkgewotICAgICAgICAgICAgaWYgKGlkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUlkID0gaWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvbkNhbGxiYWNrX2ltcGwoQE5vbk51bGwgRXhlY3V0b3IgZXhlY3V0b3IsIEBOb25OdWxsIEMgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGlmIChleGVjdXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZXhlY3V0b3Igc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yID0gZXhlY3V0b3I7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVCBidWlsZF9pbXBsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVySW1wbCBleHRlbmRzIEJ1aWxkZXJCYXNlSW1wbDxNZWRpYVNlc3Npb24yLCBTZXNzaW9uQ2FsbGJhY2s+IHsKLSAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKENvbnRleHQgY29udGV4dCwgQnVpbGRlciBpbnN0YW5jZSkgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE1lZGlhU2Vzc2lvbjIgYnVpbGRfaW1wbCgpIHsKLSAgICAgICAgICAgIGlmIChtQ2FsbGJhY2tFeGVjdXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IgPSBtQ29udGV4dC5nZXRNYWluRXhlY3V0b3IoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQ2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DYWxsYmFjayA9IG5ldyBTZXNzaW9uQ2FsbGJhY2soKSB7fTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uMkltcGwobUNvbnRleHQsIG1QbGF5ZXIsIG1JZCwgbVBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVQcm92aWRlciwgbVNlc3Npb25BY3Rpdml0eSwgbUNhbGxiYWNrRXhlY3V0b3IsIG1DYWxsYmFjaykuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uMlN0dWIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uMlN0dWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM2NTdkNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvbjJTdHViLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5MaWJyYXJ5Um9vdDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5Db21tYW5kQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmRHcm91cDI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkNvbnRyb2xsZXJJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuUmF0aW5nMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyMjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5EZWFkT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLkd1YXJkZWRCeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkFycmF5TWFwOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTJJbXBsLk1lZGlhTGlicmFyeVNlc3Npb25JbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRCdXR0b25JbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRHcm91cEltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMkltcGwuQ29udHJvbGxlckluZm9JbXBsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotcHVibGljIGNsYXNzIE1lZGlhU2Vzc2lvbjJTdHViIGV4dGVuZHMgSU1lZGlhU2Vzc2lvbjIuU3R1YiB7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1VNRU5UX0tFWV9QT1NJVElPTiA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmtleV9wb3NpdGlvbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdVTUVOVF9LRVlfSVRFTV9JTkRFWCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmtleV9pdGVtX2luZGV4IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1VNRU5UX0tFWV9QTEFZTElTVF9QQVJBTVMgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIua2V5X3BsYXlsaXN0X3BhcmFtcyI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhU2Vzc2lvbjJTdHViIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsgLy8gVE9ETyhqYWV3YW4pOiBSZW5hbWUuCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTcGFyc2VBcnJheTxTZXNzaW9uQ29tbWFuZDI+IHNDb21tYW5kc0Zvck9uQ29tbWFuZFJlcXVlc3QgPQotICAgICAgICAgICAgbmV3IFNwYXJzZUFycmF5PD4oKTsKLQotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwotICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxNZWRpYVNlc3Npb24ySW1wbD4gbVNlc3Npb247Ci0KLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheU1hcDxJQmluZGVyLCBDb250cm9sbGVySW5mbz4gbUNvbnRyb2xsZXJzID0gbmV3IEFycmF5TWFwPD4oKTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8SUJpbmRlcj4gbUNvbm5lY3RpbmdDb250cm9sbGVycyA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheU1hcDxDb250cm9sbGVySW5mbywgU2Vzc2lvbkNvbW1hbmRHcm91cDI+IG1BbGxvd2VkQ29tbWFuZEdyb3VwTWFwID0KLSAgICAgICAgICAgIG5ldyBBcnJheU1hcDw+KCk7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlNYXA8Q29udHJvbGxlckluZm8sIFNldDxTdHJpbmc+PiBtU3Vic2NyaXB0aW9ucyA9IG5ldyBBcnJheU1hcDw+KCk7Ci0KLSAgICBwdWJsaWMgTWVkaWFTZXNzaW9uMlN0dWIoTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbikgewotICAgICAgICBtU2Vzc2lvbiA9IG5ldyBXZWFrUmVmZXJlbmNlPD4oc2Vzc2lvbik7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChzQ29tbWFuZHNGb3JPbkNvbW1hbmRSZXF1ZXN0KSB7Ci0gICAgICAgICAgICBpZiAoc0NvbW1hbmRzRm9yT25Db21tYW5kUmVxdWVzdC5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIENvbW1hbmRHcm91cEltcGwgZ3JvdXAgPSBuZXcgQ29tbWFuZEdyb3VwSW1wbCgpOwotICAgICAgICAgICAgICAgIGdyb3VwLmFkZEFsbFBsYXliYWNrQ29tbWFuZHMoKTsKLSAgICAgICAgICAgICAgICBncm91cC5hZGRBbGxQbGF5bGlzdENvbW1hbmRzKCk7Ci0gICAgICAgICAgICAgICAgU2V0PFNlc3Npb25Db21tYW5kMj4gY29tbWFuZHMgPSBncm91cC5nZXRDb21tYW5kcygpOwotICAgICAgICAgICAgICAgIGZvciAoU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQgOiBjb21tYW5kcykgewotICAgICAgICAgICAgICAgICAgICBzQ29tbWFuZHNGb3JPbkNvbW1hbmRSZXF1ZXN0LmFwcGVuZChjb21tYW5kLmdldENvbW1hbmRDb2RlKCksIGNvbW1hbmQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3lOb3RMb2NrZWQoKSB7Ci0gICAgICAgIGZpbmFsIExpc3Q8Q29udHJvbGxlckluZm8+IGxpc3Q7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1TZXNzaW9uLmNsZWFyKCk7Ci0gICAgICAgICAgICBsaXN0ID0gZ2V0Q29udHJvbGxlcnMoKTsKLSAgICAgICAgICAgIG1Db250cm9sbGVycy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgSU1lZGlhQ29udHJvbGxlcjIgY29udHJvbGxlckJpbmRlciA9Ci0gICAgICAgICAgICAgICAgICAgICgoQ29udHJvbGxlckluZm9JbXBsKSBsaXN0LmdldChpKS5nZXRQcm92aWRlcigpKS5nZXRDb250cm9sbGVyQmluZGVyKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIFNob3VsZCBiZSB1c2VkIHdpdGhvdXQgYSBsb2NrIGhvbGQgdG8gcHJldmVudCBwb3RlbnRpYWwgZGVhZGxvY2suCi0gICAgICAgICAgICAgICAgY29udHJvbGxlckJpbmRlci5vbkRpc2Nvbm5lY3RlZCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBDb250cm9sbGVyIGlzIGdvbmUuIFNob3VsZCBiZSBmaW5lIGJlY2F1c2Ugd2UncmUgZGVzdHJveWluZy4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uMkltcGwgZ2V0U2Vzc2lvbigpIHsKLSAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IG1TZXNzaW9uLmdldCgpOwotICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsICYmIERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJTZXNzaW9uIGlzIGNsb3NlZCIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNlc3Npb247Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZWRpYUxpYnJhcnlTZXNzaW9uSW1wbCBnZXRMaWJyYXJ5U2Vzc2lvbigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOwotICAgICAgICBpZiAoIShzZXNzaW9uIGluc3RhbmNlb2YgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU2Vzc2lvbiBpc24ndCBhIGxpYnJhcnkgc2Vzc2lvbiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwpIHNlc3Npb247Ci0gICAgfQotCi0gICAgLy8gR2V0IGNvbnRyb2xsZXIgaWYgdGhlIGNvbW1hbmQgZnJvbSBjYWxsZXIgdG8gc2Vzc2lvbiBpcyBhYmxlIHRvIGJlIGhhbmRsZWQuCi0gICAgcHJpdmF0ZSBDb250cm9sbGVySW5mbyBnZXRDb250cm9sbGVySWZBYmxlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcikgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVySW5mbyA9IG1Db250cm9sbGVycy5nZXQoY2FsbGVyLmFzQmluZGVyKCkpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXJJbmZvID09IG51bGwgJiYgREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDb250cm9sbGVyIGlzIGRpc2Nvbm5lY3RlZCIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY29udHJvbGxlckluZm87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBHZXQgY29udHJvbGxlciBpZiB0aGUgY29tbWFuZCBmcm9tIGNhbGxlciB0byBzZXNzaW9uIGlzIGFibGUgdG8gYmUgaGFuZGxlZC4KLSAgICBwcml2YXRlIENvbnRyb2xsZXJJbmZvIGdldENvbnRyb2xsZXJJZkFibGUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgY29tbWFuZENvZGUpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlckluZm8gPSBnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlcik7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlckluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmRHcm91cDIgYWxsb3dlZENvbW1hbmRzID0gbUFsbG93ZWRDb21tYW5kR3JvdXBNYXAuZ2V0KGNvbnRyb2xsZXJJbmZvKTsKLSAgICAgICAgICAgIGlmIChhbGxvd2VkQ29tbWFuZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbnRyb2xsZXIgd2l0aCBudWxsIGFsbG93ZWQgY29tbWFuZHMuIElnbm9yaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWFsbG93ZWRDb21tYW5kcy5oYXNDb21tYW5kKGNvbW1hbmRDb2RlKSkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDb250cm9sbGVyIGlzbid0IGFsbG93ZWQgZm9yIGNvbW1hbmQgIiArIGNvbW1hbmRDb2RlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY29udHJvbGxlckluZm87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBHZXQgY29udHJvbGxlciBpZiB0aGUgY29tbWFuZCBmcm9tIGNhbGxlciB0byBzZXNzaW9uIGlzIGFibGUgdG8gYmUgaGFuZGxlZC4KLSAgICBwcml2YXRlIENvbnRyb2xsZXJJbmZvIGdldENvbnRyb2xsZXJJZkFibGUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVySW5mbyA9IGdldENvbnRyb2xsZXJJZkFibGUoY2FsbGVyKTsKLSAgICAgICAgICAgIGlmIChjb250cm9sbGVySW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTZXNzaW9uQ29tbWFuZEdyb3VwMiBhbGxvd2VkQ29tbWFuZHMgPSBtQWxsb3dlZENvbW1hbmRHcm91cE1hcC5nZXQoY29udHJvbGxlckluZm8pOwotICAgICAgICAgICAgaWYgKGFsbG93ZWRDb21tYW5kcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ29udHJvbGxlciB3aXRoIG51bGwgYWxsb3dlZCBjb21tYW5kcy4gSWdub3JpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghYWxsb3dlZENvbW1hbmRzLmhhc0NvbW1hbmQoY29tbWFuZCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ29udHJvbGxlciBpc24ndCBhbGxvd2VkIGZvciBjb21tYW5kICIgKyBjb21tYW5kKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY29udHJvbGxlckluZm87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYmluZGVyIGlmIHRoZSBzZXNzaW9uIGlzIGFibGUgdG8gc2VuZCBhIGNvbW1hbmQgdG8gdGhlIGNvbnRyb2xsZXIuCi0gICAgcHJpdmF0ZSBJTWVkaWFDb250cm9sbGVyMiBnZXRDb250cm9sbGVyQmluZGVySWZBYmxlKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgaWYgKGdldFNlc3Npb24oKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBnZXRTZXNzaW9uKCkgYWxyZWFkeSBsb2dnZWQgaWYgc2Vzc2lvbiBpcyBjbG9zZWQuCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mb0ltcGwgaW1wbCA9IENvbnRyb2xsZXJJbmZvSW1wbC5mcm9tKGNvbnRyb2xsZXIpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAobUNvbnRyb2xsZXJzLmdldChpbXBsLmdldElkKCkpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgfHwgbUNvbm5lY3RpbmdDb250cm9sbGVycy5jb250YWlucyhpbXBsLmdldElkKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGltcGwuZ2V0Q29udHJvbGxlckJpbmRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjb250cm9sbGVyICsgIiBpc24ndCBjb25uZWN0ZWQgbm9yIGNvbm5lY3RpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGJpbmRlciBpZiB0aGUgc2Vzc2lvbiBpcyBhYmxlIHRvIHNlbmQgYSBjb21tYW5kIHRvIHRoZSBjb250cm9sbGVyLgotICAgIHByaXZhdGUgSU1lZGlhQ29udHJvbGxlcjIgZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShDb250cm9sbGVySW5mbyBjb250cm9sbGVyLAotICAgICAgICAgICAgaW50IGNvbW1hbmRDb2RlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyIGFsbG93ZWRDb21tYW5kcyA9IG1BbGxvd2VkQ29tbWFuZEdyb3VwTWFwLmdldChjb250cm9sbGVyKTsKLSAgICAgICAgICAgIGlmIChhbGxvd2VkQ29tbWFuZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbnRyb2xsZXIgd2l0aCBudWxsIGFsbG93ZWQgY29tbWFuZHMuIElnbm9yaW5nIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWFsbG93ZWRDb21tYW5kcy5oYXNDb21tYW5kKGNvbW1hbmRDb2RlKSkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDb250cm9sbGVyIGlzbid0IGFsbG93ZWQgZm9yIGNvbW1hbmQgIiArIGNvbW1hbmRDb2RlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShjb250cm9sbGVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvbkNvbW1hbmQoQE5vbk51bGwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgY29tbWFuZENvZGUsCi0gICAgICAgICAgICBATm9uTnVsbCBTZXNzaW9uUnVubmFibGUgcnVubmFibGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLSAgICAgICAgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciA9IGdldENvbnRyb2xsZXJJZkFibGUoY2FsbGVyLCBjb21tYW5kQ29kZSk7Ci0gICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgfHwgY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoZ2V0Q29udHJvbGxlcklmQWJsZShjYWxsZXIsIGNvbW1hbmRDb2RlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQgPSBzQ29tbWFuZHNGb3JPbkNvbW1hbmRSZXF1ZXN0LmdldChjb21tYW5kQ29kZSk7Ci0gICAgICAgICAgICBpZiAoY29tbWFuZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBhY2NlcHRlZCA9IHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkNvbW1hbmRSZXF1ZXN0KHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIGNvbW1hbmQpOwotICAgICAgICAgICAgICAgIGlmICghYWNjZXB0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgcnVuIHJlamVjdGVkIGNvbW1hbmQuCi0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ29tbWFuZCAoY29kZT0iICsgY29tbWFuZENvZGUgKyAiKSBmcm9tICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb250cm9sbGVyICsgIiB3YXMgcmVqZWN0ZWQgYnkgIiArIHNlc3Npb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBydW5uYWJsZS5ydW4oc2Vzc2lvbiwgY29udHJvbGxlcik7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvbkJyb3dzZXJDb21tYW5kKEBOb25OdWxsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwKLSAgICAgICAgICAgIEBOb25OdWxsIExpYnJhcnlTZXNzaW9uUnVubmFibGUgcnVubmFibGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwgc2Vzc2lvbiA9IGdldExpYnJhcnlTZXNzaW9uKCk7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogQ29uc2lkZXIgY29tbWFuZCBjb2RlCi0gICAgICAgIGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlcik7Ci0gICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgfHwgY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IENvbnNpZGVyIGNvbW1hbmQgY29kZQotICAgICAgICAgICAgaWYgKGdldENvbnRyb2xsZXJJZkFibGUoY2FsbGVyKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcnVubmFibGUucnVuKHNlc3Npb24sIGNvbnRyb2xsZXIpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCBub3RpZnlBbGwoaW50IGNvbW1hbmRDb2RlLCBATm9uTnVsbCBOb3RpZnlSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICBMaXN0PENvbnRyb2xsZXJJbmZvPiBjb250cm9sbGVycyA9IGdldENvbnRyb2xsZXJzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbGxlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIG5vdGlmeUludGVybmFsKGNvbnRyb2xsZXJzLmdldChpKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShjb250cm9sbGVycy5nZXQoaSksIGNvbW1hbmRDb2RlKSwgcnVubmFibGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeUFsbChATm9uTnVsbCBOb3RpZnlSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICBMaXN0PENvbnRyb2xsZXJJbmZvPiBjb250cm9sbGVycyA9IGdldENvbnRyb2xsZXJzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbGxlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIG5vdGlmeUludGVybmFsKGNvbnRyb2xsZXJzLmdldChpKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShjb250cm9sbGVycy5nZXQoaSkpLCBydW5uYWJsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5KEBOb25OdWxsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIEBOb25OdWxsIE5vdGlmeVJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgIG5vdGlmeUludGVybmFsKGNvbnRyb2xsZXIsIGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoY29udHJvbGxlciksIHJ1bm5hYmxlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5KEBOb25OdWxsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIGludCBjb21tYW5kQ29kZSwKLSAgICAgICAgICAgIEBOb25OdWxsIE5vdGlmeVJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgIG5vdGlmeUludGVybmFsKGNvbnRyb2xsZXIsIGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoY29udHJvbGxlciwgY29tbWFuZENvZGUpLCBydW5uYWJsZSk7Ci0gICAgfQotCi0gICAgLy8gRG8gbm90IGNhbGwgdGhpcyBBUEkgZGlyZWN0bHkuIFVzZSBub3RpZnkoKSBpbnN0ZWFkLgotICAgIHByaXZhdGUgdm9pZCBub3RpZnlJbnRlcm5hbChATm9uTnVsbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyLAotICAgICAgICAgICAgQE5vbk51bGwgSU1lZGlhQ29udHJvbGxlcjIgaUNvbnRyb2xsZXIsIEBOb25OdWxsIE5vdGlmeVJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwgfHwgaUNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBydW5uYWJsZS5ydW4oY29udHJvbGxlciwgaUNvbnRyb2xsZXIpOwotICAgICAgICB9IGNhdGNoIChEZWFkT2JqZWN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY29udHJvbGxlci50b1N0cmluZygpICsgIiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvbkNvbnRyb2xsZXJDbG9zZWQoaUNvbnRyb2xsZXIpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gQ3VycmVudGx5IGl0J3MgVHJhbnNhY3Rpb25Ub29MYXJnZUV4Y2VwdGlvbiBvciBEZWFkU3lzdGVtRXhjZXB0aW9uLgotICAgICAgICAgICAgLy8gV2UnZCBiZXR0ZXIgdG8gbGVhdmUgbG9nIGZvciB0aG9zZSBjYXNlcyBiZWNhdXNlCi0gICAgICAgICAgICAvLyAgIC0gVHJhbnNhY3Rpb25Ub29MYXJnZUV4Y2VwdGlvbiBtZWFucyB0aGF0IHdlIG1heSBuZWVkIHRvIGZpeCBvdXIgY29kZS4KLSAgICAgICAgICAgIC8vICAgICAoZS5nLiBhZGQgcGFnaW5hdGlvbiBvciBzcGVjaWFsIHdheSB0byBkZWxpdmVyIEJpdG1hcCkKLSAgICAgICAgICAgIC8vICAgLSBEZWFkU3lzdGVtRXhjZXB0aW9uIG1lYW5zIHRoYXQgZXJyb3JzIGFyb3VuZCBpdCBjYW4gYmUgaWdub3JlZC4KLSAgICAgICAgICAgIExvZy53KFRBRywgIkV4Y2VwdGlvbiBpbiAiICsgY29udHJvbGxlci50b1N0cmluZygpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvbkNvbnRyb2xsZXJDbG9zZWQoSU1lZGlhQ29udHJvbGxlcjIgaUNvbnRyb2xsZXIpIHsKLSAgICAgICAgQ29udHJvbGxlckluZm8gY29udHJvbGxlcjsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgY29udHJvbGxlciA9IG1Db250cm9sbGVycy5yZW1vdmUoaUNvbnRyb2xsZXIuYXNCaW5kZXIoKSk7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJyZWxlYXNpbmcgIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVN1YnNjcmlwdGlvbnMucmVtb3ZlKGNvbnRyb2xsZXIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgfHwgY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25EaXNjb25uZWN0ZWQoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIEFJREwgbWV0aG9kcyBmb3Igc2Vzc2lvbiBvdmVycmlkZXMKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY29ubmVjdChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBjYWxsaW5nUGFja2FnZSkKLSAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLSAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IHNlc3Npb24uZ2V0Q29udGV4dCgpOwotICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVySW5mbyA9IG5ldyBDb250cm9sbGVySW5mbyhjb250ZXh0LAotICAgICAgICAgICAgICAgIEJpbmRlci5nZXRDYWxsaW5nVWlkKCksIEJpbmRlci5nZXRDYWxsaW5nUGlkKCksIGNhbGxpbmdQYWNrYWdlLCBjYWxsZXIpOwotICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmIChnZXRTZXNzaW9uKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICAvLyBLZWVwIGNvbm5lY3RpbmcgY29udHJvbGxlcnMuCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBoZWxwcyBzZXNzaW9ucyB0byBjYWxsIEFQSXMgaW4gdGhlIG9uQ29ubmVjdCgpIChlLmcuIHNldEN1c3RvbUxheW91dCgpKQotICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgcGVuZGluZyB0aGVtLgotICAgICAgICAgICAgICAgIG1Db25uZWN0aW5nQ29udHJvbGxlcnMuYWRkKENvbnRyb2xsZXJJbmZvSW1wbC5mcm9tKGNvbnRyb2xsZXJJbmZvKS5nZXRJZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyIGFsbG93ZWRDb21tYW5kcyA9IHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkNvbm5lY3QoCi0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgY29udHJvbGxlckluZm8pOwotICAgICAgICAgICAgLy8gRG9uJ3QgcmVqZWN0IGNvbm5lY3Rpb24gZm9yIHRoZSByZXF1ZXN0IGZyb20gdHJ1c3RlZCBhcHAuCi0gICAgICAgICAgICAvLyBPdGhlcndpc2Ugc2VydmVyIHdpbGwgZmFpbCB0byByZXRyaWV2ZSBzZXNzaW9uJ3MgaW5mb3JtYXRpb24gdG8gZGlzcGF0Y2gKLSAgICAgICAgICAgIC8vIG1lZGlhIGtleXMgdG8uCi0gICAgICAgICAgICBib29sZWFuIGFjY2VwdCA9IGFsbG93ZWRDb21tYW5kcyAhPSBudWxsIHx8IGNvbnRyb2xsZXJJbmZvLmlzVHJ1c3RlZCgpOwotICAgICAgICAgICAgaWYgKGFjY2VwdCkgewotICAgICAgICAgICAgICAgIENvbnRyb2xsZXJJbmZvSW1wbCBjb250cm9sbGVySW1wbCA9IENvbnRyb2xsZXJJbmZvSW1wbC5mcm9tKGNvbnRyb2xsZXJJbmZvKTsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQWNjZXB0aW5nIGNvbm5lY3Rpb24sIGNvbnRyb2xsZXJJbmZvPSIgKyBjb250cm9sbGVySW5mbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhbGxvd2VkQ29tbWFuZHM9IiArIGFsbG93ZWRDb21tYW5kcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhbGxvd2VkQ29tbWFuZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBGb3IgdHJ1c3RlZCBhcHBzLCBzZW5kIG5vbi1udWxsIGFsbG93ZWQgY29tbWFuZHMgdG8ga2VlcCBjb25uZWN0aW9uLgotICAgICAgICAgICAgICAgICAgICBhbGxvd2VkQ29tbWFuZHMgPSBuZXcgU2Vzc2lvbkNvbW1hbmRHcm91cDIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGluZ0NvbnRyb2xsZXJzLnJlbW92ZShjb250cm9sbGVySW1wbC5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXJzLnB1dChjb250cm9sbGVySW1wbC5nZXRJZCgpLCAgY29udHJvbGxlckluZm8pOwotICAgICAgICAgICAgICAgICAgICBtQWxsb3dlZENvbW1hbmRHcm91cE1hcC5wdXQoY29udHJvbGxlckluZm8sIGFsbG93ZWRDb21tYW5kcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIElmIGNvbm5lY3Rpb24gaXMgYWNjZXB0ZWQsIG5vdGlmeSB0aGUgY3VycmVudCBzdGF0ZSB0byB0aGUgY29udHJvbGxlci4KLSAgICAgICAgICAgICAgICAvLyBJdCdzIG5lZWRlZCBiZWNhdXNlIHdlIGNhbm5vdCBjYWxsIHN5bmNocm9ub3VzIGNhbGxzIGJldHdlZW4gc2Vzc2lvbi9jb250cm9sbGVyLgotICAgICAgICAgICAgICAgIC8vIE5vdGU6IFdlJ3JlIGRvaW5nIHRoaXMgYWZ0ZXIgdGhlIG9uQ29ubmVjdGlvbkNoYW5nZWQoKSwgYnV0IHRoZXJlJ3Mgbm8gZ3VhcmFudGVlCi0gICAgICAgICAgICAgICAgLy8gICAgICAgdGhhdCBldmVudHMgaGVyZSBhcmUgbm90aWZpZWQgYWZ0ZXIgdGhlIG9uQ29ubmVjdGVkKCkgYmVjYXVzZQotICAgICAgICAgICAgICAgIC8vICAgICAgIElNZWRpYUNvbnRyb2xsZXIyIGlzIG9uZXdheSAoaS5lLiBhc3luYyBjYWxsKSBhbmQgU3R1YiB3aWxsCi0gICAgICAgICAgICAgICAgLy8gICAgICAgdXNlIHRocmVhZCBwb2xsIGZvciBpbmNvbWluZyBjYWxscy4KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcGxheWVyU3RhdGUgPSBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0UGxheWVyU3RhdGUoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBsb25nIHBvc2l0aW9uRXZlbnRUaW1lTXMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBsb25nIHBvc2l0aW9uTXMgPSBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudFBvc2l0aW9uKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgcGxheWJhY2tTcGVlZCA9IHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5nZXRQbGF5YmFja1NwZWVkKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgbG9uZyBidWZmZXJlZFBvc2l0aW9uTXMgPSBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0QnVmZmVyZWRQb3NpdGlvbigpOwotICAgICAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBwbGF5YmFja0luZm9CdW5kbGUgPSAoKE1lZGlhQ29udHJvbGxlcjJJbXBsLlBsYXliYWNrSW5mb0ltcGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldFBsYXliYWNrSW5mbygpLmdldFByb3ZpZGVyKCkpLnRvQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJlcGVhdE1vZGUgPSBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0UmVwZWF0TW9kZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBzaHVmZmxlTW9kZSA9IHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5nZXRTaHVmZmxlTW9kZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5ID0gc2Vzc2lvbi5nZXRTZXNzaW9uQWN0aXZpdHkoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRDb21tYW5kcy5oYXNDb21tYW5kKFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfR0VUX0xJU1QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLmdldFBsYXlsaXN0KCkgOiBudWxsOwotICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8QnVuZGxlPiBwbGF5bGlzdEJ1bmRsZTsKLSAgICAgICAgICAgICAgICBpZiAocGxheWxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwbGF5bGlzdEJ1bmRsZSA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEZpbmQgYSB3YXkgdG8gYXZvaWQgY29uY3VycmVudCBtb2RpZmljYXRpb24gZXhjZXB0aW9uLgotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBsYXlsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYUl0ZW0yIGl0ZW0gPSBwbGF5bGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQnVuZGxlIGl0ZW1CdW5kbGUgPSBpdGVtLnRvQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1CdW5kbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5bGlzdEJ1bmRsZS5hZGQoaXRlbUJ1bmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGxheWxpc3RCdW5kbGUgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIERvdWJsZSBjaGVjayBpZiBzZXNzaW9uIGlzIHN0aWxsIHRoZXJlLCBiZWNhdXNlIGNsb3NlKCkgY2FuIGJlIGNhbGxlZCBpbiBhbm90aGVyCi0gICAgICAgICAgICAgICAgLy8gdGhyZWFkLgotICAgICAgICAgICAgICAgIGlmIChnZXRTZXNzaW9uKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxlci5vbkNvbm5lY3RlZChNZWRpYVNlc3Npb24yU3R1Yi50aGlzLCBhbGxvd2VkQ29tbWFuZHMudG9CdW5kbGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJTdGF0ZSwgcG9zaXRpb25FdmVudFRpbWVNcywgcG9zaXRpb25NcywgcGxheWJhY2tTcGVlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJlZFBvc2l0aW9uTXMsIHBsYXliYWNrSW5mb0J1bmRsZSwgcmVwZWF0TW9kZSwgc2h1ZmZsZU1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWxpc3RCdW5kbGUsIHNlc3Npb25BY3Rpdml0eSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ29udHJvbGxlciBtYXkgYmUgZGllZCBwcmVtYXR1cmVseS4KLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgaGVyZS4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3RpbmdDb250cm9sbGVycy5yZW1vdmUoQ29udHJvbGxlckluZm9JbXBsLmZyb20oY29udHJvbGxlckluZm8pLmdldElkKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVqZWN0aW5nIGNvbm5lY3Rpb24sIGNvbnRyb2xsZXJJbmZvPSIgKyBjb250cm9sbGVySW5mbyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxlci5vbkRpc2Nvbm5lY3RlZCgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENvbnRyb2xsZXIgbWF5IGJlIGRpZWQgcHJlbWF0dXJlbHkuCi0gICAgICAgICAgICAgICAgICAgIC8vIE5vdCBhbiBpc3N1ZSBiZWNhdXNlIHdlJ2xsIGlnbm9yZSBpdCBhbnl3YXkuCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG9uQ29udHJvbGxlckNsb3NlZChjYWxsZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFZvbHVtZVRvKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgaW50IHZhbHVlLCBmaW5hbCBpbnQgZmxhZ3MpCi0gICAgICAgICAgICB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VUX1ZPTFVNRSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIgPSBzZXNzaW9uLmdldFZvbHVtZVByb3ZpZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2b2x1bWVQcm92aWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFNldCBsb2NhbCBzdHJlYW0gdm9sdW1lCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVQcm92aWRlci5vblNldFZvbHVtZVRvKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkanVzdFZvbHVtZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBkaXJlY3Rpb24sIGludCBmbGFncykKLSAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVRfVk9MVU1FLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlciA9IHNlc3Npb24uZ2V0Vm9sdW1lUHJvdmlkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZvbHVtZVByb3ZpZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogQWRqdXN0IGxvY2FsIHN0cmVhbSB2b2x1bWUKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVByb3ZpZGVyLm9uQWRqdXN0Vm9sdW1lKGRpcmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLAotICAgICAgICAgICAgaW50IGNvbW1hbmRDb2RlLCBCdW5kbGUgYXJncykgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBjb21tYW5kQ29kZSwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIHN3aXRjaCAoY29tbWFuZENvZGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUJBQ0tfUExBWToKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnBsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1BBVVNFOgotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkucGF1c2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1NUT1A6Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19QUkVQQVJFOgotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkucHJlcGFyZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUJBQ0tfU0VFS19UTzoKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnNlZWtUbyhhcmdzLmdldExvbmcoQVJHVU1FTlRfS0VZX1BPU0lUSU9OKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmVzZW5kIHVua25vd24gKG5ldykgY29tbWFuZHMgdGhyb3VnaCB0aGUgY3VzdG9tIGNvbW1hbmQuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNlbmRDdXN0b21Db21tYW5kKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgQnVuZGxlIGNvbW1hbmRCdW5kbGUsCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgYXJncywgZmluYWwgUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIpIHsKLSAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLSAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFNlc3Npb25Db21tYW5kMiBjb21tYW5kID0gU2Vzc2lvbkNvbW1hbmQyLmZyb21CdW5kbGUoY29tbWFuZEJ1bmRsZSk7Ci0gICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgInNlbmRDdXN0b21Db21tYW5kKCk6IElnbm9yaW5nIG51bGwgY29tbWFuZCBmcm9tICIKLSAgICAgICAgICAgICAgICAgICAgKyBnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlcikpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlciwgY29tbWFuZCk7Ci0gICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmIChnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlciwgY29tbWFuZCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkN1c3RvbUNvbW1hbmQoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBjb21tYW5kLCBhcmdzLCByZWNlaXZlcik7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmVGcm9tVXJpKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgVXJpIHVyaSwKLSAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9VUkksCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJwcmVwYXJlRnJvbVVyaSgpOiBJZ25vcmluZyBudWxsIHVyaSBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QcmVwYXJlRnJvbVVyaShzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXIsIHVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYXMpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmVGcm9tU2VhcmNoKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIHF1ZXJ5LAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUFJFUEFSRV9GUk9NX1NFQVJDSCwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJwcmVwYXJlRnJvbVNlYXJjaCgpOiBJZ25vcmluZyBlbXB0eSBxdWVyeSBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QcmVwYXJlRnJvbVNlYXJjaChzZXNzaW9uLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgcXVlcnksIGV4dHJhcyk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZUZyb21NZWRpYUlkKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIG1lZGlhSWQsCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fTUVESUFfSUQsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJwcmVwYXJlRnJvbU1lZGlhSWQoKTogSWdub3JpbmcgbnVsbCBtZWRpYUlkIGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vblByZXBhcmVGcm9tTWVkaWFJZChzZXNzaW9uLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIG1lZGlhSWQsIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBsYXlGcm9tVXJpKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgVXJpIHVyaSwKLSAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BMQVlfRlJPTV9VUkksCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJwbGF5RnJvbVVyaSgpOiBJZ25vcmluZyBudWxsIHVyaSBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QbGF5RnJvbVVyaShzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXIsIHVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYXMpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBsYXlGcm9tU2VhcmNoKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIHF1ZXJ5LAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX1NFQVJDSCwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJwbGF5RnJvbVNlYXJjaCgpOiBJZ25vcmluZyBlbXB0eSBxdWVyeSBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QbGF5RnJvbVNlYXJjaChzZXNzaW9uLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgcXVlcnksIGV4dHJhcyk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGxheUZyb21NZWRpYUlkKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIG1lZGlhSWQsCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fTUVESUFfSUQsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAicGxheUZyb21NZWRpYUlkKCk6IElnbm9yaW5nIG51bGwgbWVkaWFJZCBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QbGF5RnJvbU1lZGlhSWQoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSWQsIGV4dHJhcyk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UmF0aW5nKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIG1lZGlhSWQsCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgcmF0aW5nQnVuZGxlKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9TRVRfUkFUSU5HLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNldFJhdGluZygpOiBJZ25vcmluZyBudWxsIG1lZGlhSWQgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJhdGluZ0J1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzZXRSYXRpbmcoKTogSWdub3JpbmcgbnVsbCByYXRpbmdCdW5kbGUgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgUmF0aW5nMiByYXRpbmcgPSBSYXRpbmcyLmZyb21CdW5kbGUocmF0aW5nQnVuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJhdGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmF0aW5nQnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzZXRSYXRpbmcoKTogSWdub3JpbmcgbnVsbCByYXRpbmcgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vblNldFJhdGluZyhzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXIsIG1lZGlhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0aW5nKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5bGlzdChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIExpc3Q8QnVuZGxlPiBwbGF5bGlzdCwKLSAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBtZXRhZGF0YSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9MSVNULCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKHBsYXlsaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzZXRQbGF5bGlzdCgpOiBJZ25vcmluZyBudWxsIHBsYXlsaXN0IGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwbGF5bGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIC8vIFJlY3JlYXRlcyBVVUlEIGluIHRoZSBwbGF5bGlzdAotICAgICAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IE1lZGlhSXRlbTJJbXBsLmZyb21CdW5kbGUocGxheWxpc3QuZ2V0KGkpLCBudWxsKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGl0ZW0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5zZXRQbGF5bGlzdChsaXN0LCBNZWRpYU1ldGFkYXRhMi5mcm9tQnVuZGxlKG1ldGFkYXRhKSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVBsYXlsaXN0TWV0YWRhdGEoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBCdW5kbGUgbWV0YWRhdGEpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfTElTVF9NRVRBREFUQSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnVwZGF0ZVBsYXlsaXN0TWV0YWRhdGEoTWVkaWFNZXRhZGF0YTIuZnJvbUJ1bmRsZShtZXRhZGF0YSkpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRQbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgaW5kZXgsIEJ1bmRsZSBtZWRpYUl0ZW0pIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9BRERfSVRFTSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICAvLyBSZXNldHMgdGhlIFVVSUQgZnJvbSB0aGUgaW5jb21pbmcgbWVkaWEgaWQsIHNvIGNvbnRyb2xsZXIgbWF5IHJldXNlIGEgbWVkaWEKLSAgICAgICAgICAgICAgICAgICAgLy8gaXRlbSBtdWx0aXBsZSB0aW1lcyBmb3IgYWRkUGxheWxpc3RJdGVtLgotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuYWRkUGxheWxpc3RJdGVtKGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhSXRlbTJJbXBsLmZyb21CdW5kbGUobWVkaWFJdGVtLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGxheWxpc3RJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgQnVuZGxlIG1lZGlhSXRlbSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1JFTU9WRV9JVEVNLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBNZWRpYUl0ZW0yLmZyb21CdW5kbGUobWVkaWFJdGVtKTsKLSAgICAgICAgICAgIC8vIE5vdGU6IE1lZGlhSXRlbTIgaGFzIGhpZGRlbiBVVUlEIHRvIGlkZW50aWZ5IGl0IGFjcm9zcyB0aGUgcHJvY2Vzc2VzLgotICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnJlbW92ZVBsYXlsaXN0SXRlbShpdGVtKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVwbGFjZVBsYXlsaXN0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBpbmRleCwgQnVuZGxlIG1lZGlhSXRlbSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1JFUExBQ0VfSVRFTSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICAvLyBSZXNldHMgdGhlIFVVSUQgZnJvbSB0aGUgaW5jb21pbmcgbWVkaWEgaWQsIHNvIGNvbnRyb2xsZXIgbWF5IHJldXNlIGEgbWVkaWEKLSAgICAgICAgICAgICAgICAgICAgLy8gaXRlbSBtdWx0aXBsZSB0aW1lcyBmb3IgcmVwbGFjZVBsYXlsaXN0SXRlbS4KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnJlcGxhY2VQbGF5bGlzdEl0ZW0oaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFJdGVtMkltcGwuZnJvbUJ1bmRsZShtZWRpYUl0ZW0sIG51bGwpKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBCdW5kbGUgbWVkaWFJdGVtKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0tJUF9UT19QTEFZTElTVF9JVEVNLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtZWRpYUl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2tpcFRvUGxheWxpc3RJdGVtKCk6IElnbm9yaW5nIG51bGwgbWVkaWFJdGVtIGZyb20gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IE1lZGlhSXRlbTIgaGFzIGhpZGRlbiBVVUlEIHRvIGlkZW50aWZ5IGl0IGFjcm9zcyB0aGUgcHJvY2Vzc2VzLgotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuc2tpcFRvUGxheWxpc3RJdGVtKE1lZGlhSXRlbTIuZnJvbUJ1bmRsZShtZWRpYUl0ZW0pKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QcmV2aW91c0l0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0tJUF9QUkVWX0lURU0sCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnNraXBUb1ByZXZpb3VzSXRlbSgpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNraXBUb05leHRJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcikgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NLSVBfTkVYVF9JVEVNLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5za2lwVG9OZXh0SXRlbSgpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFJlcGVhdE1vZGUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9SRVBFQVRfTU9ERSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuc2V0UmVwZWF0TW9kZShyZXBlYXRNb2RlKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTaHVmZmxlTW9kZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9TSFVGRkxFX01PREUsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnNldFNodWZmbGVNb2RlKHNodWZmbGVNb2RlKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gQUlETCBtZXRob2RzIGZvciBMaWJyYXJ5U2Vzc2lvbiBvdmVycmlkZXMKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBnZXRMaWJyYXJ5Um9vdChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIEJ1bmRsZSByb290SGludHMpCi0gICAgICAgICAgICB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG9uQnJvd3NlckNvbW1hbmQoY2FsbGVyLCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgZmluYWwgTGlicmFyeVJvb3Qgcm9vdCA9IHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkdldExpYnJhcnlSb290KHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgcm9vdEhpbnRzKTsKLSAgICAgICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgIGlDb250cm9sbGVyLm9uR2V0TGlicmFyeVJvb3REb25lKHJvb3RIaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QgPT0gbnVsbCA/IG51bGwgOiByb290LmdldFJvb3RJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgcm9vdCA9PSBudWxsID8gbnVsbCA6IHJvb3QuZ2V0RXh0cmFzKCkpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGdldEl0ZW0oZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgbWVkaWFJZCkKLSAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgb25Ccm93c2VyQ29tbWFuZChjYWxsZXIsIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm1lZGlhSWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgTWVkaWFJdGVtMiByZXN1bHQgPSBzZXNzaW9uLmdldENhbGxiYWNrKCkub25HZXRJdGVtKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgbWVkaWFJZCk7Ci0gICAgICAgICAgICBub3RpZnkoY29udHJvbGxlciwgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vbkdldEl0ZW1Eb25lKG1lZGlhSWQsIHJlc3VsdCA9PSBudWxsID8gbnVsbCA6IHJlc3VsdC50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBnZXRDaGlsZHJlbihmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBwYXJlbnRJZCwKLSAgICAgICAgICAgIGZpbmFsIGludCBwYWdlLCBmaW5hbCBpbnQgcGFnZVNpemUsIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgb25Ccm93c2VyQ29tbWFuZChjYWxsZXIsIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAocGFyZW50SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJwYXJlbnRJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGFnZSA8IDEgfHwgcGFnZVNpemUgPCAxKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIk5laXRoZXIgcGFnZSBub3IgcGFnZVNpemUgc2hvdWxkIGJlIGxlc3MgdGhhbiAxIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcmVzdWx0ID0gc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uR2V0Q2hpbGRyZW4oc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBwYXJlbnRJZCwgcGFnZSwgcGFnZVNpemUsIGV4dHJhcyk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LnNpemUoKSA+IHBhZ2VTaXplKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigib25HZXRDaGlsZHJlbigpIHNob3VsZG4ndCByZXR1cm4gbWVkaWEgaXRlbXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAibW9yZSB0aGFuIHBhZ2VTaXplLiByZXN1bHQuc2l6ZSgpPSIgKyByZXN1bHQuc2l6ZSgpICsgIiBwYWdlU2l6ZT0iCi0gICAgICAgICAgICAgICAgICAgICAgICArIHBhZ2VTaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIExpc3Q8QnVuZGxlPiBidW5kbGVMaXN0OwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVuZGxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgICAgIGZvciAoTWVkaWFJdGVtMiBpdGVtIDogcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QuYWRkKGl0ZW0gPT0gbnVsbCA/IG51bGwgOiBpdGVtLnRvQnVuZGxlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVuZGxlTGlzdCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBub3RpZnkoY29udHJvbGxlciwgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vbkdldENoaWxkcmVuRG9uZShwYXJlbnRJZCwgcGFnZSwgcGFnZVNpemUsIGJ1bmRsZUxpc3QsIGV4dHJhcyk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2VhcmNoKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIHF1ZXJ5LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG9uQnJvd3NlckNvbW1hbmQoY2FsbGVyLCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNlYXJjaCgpOiBJZ25vcmluZyBlbXB0eSBxdWVyeSBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25TZWFyY2goc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyLCBxdWVyeSwgZXh0cmFzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZ2V0U2VhcmNoUmVzdWx0KGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIHF1ZXJ5LAotICAgICAgICAgICAgZmluYWwgaW50IHBhZ2UsIGZpbmFsIGludCBwYWdlU2l6ZSwgZmluYWwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBvbkJyb3dzZXJDb21tYW5kKGNhbGxlciwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJnZXRTZWFyY2hSZXN1bHQoKTogSWdub3JpbmcgZW1wdHkgcXVlcnkgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhZ2UgPCAxIHx8IHBhZ2VTaXplIDwgMSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgImdldFNlYXJjaFJlc3VsdCgpOiBJZ25vcmluZyBuZWdhdGl2ZSBwYWdlIC8gcGFnZVNpemUuIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHBhZ2U9IiArIHBhZ2UgKyAiIHBhZ2VTaXplPSIgKyBwYWdlU2l6ZSArICIgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiByZXN1bHQgPSBzZXNzaW9uLmdldENhbGxiYWNrKCkub25HZXRTZWFyY2hSZXN1bHQoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBxdWVyeSwgcGFnZSwgcGFnZVNpemUsIGV4dHJhcyk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LnNpemUoKSA+IHBhZ2VTaXplKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigib25HZXRTZWFyY2hSZXN1bHQoKSBzaG91bGRuJ3QgcmV0dXJuIG1lZGlhICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIml0ZW1zIG1vcmUgdGhhbiBwYWdlU2l6ZS4gcmVzdWx0LnNpemUoKT0iICsgcmVzdWx0LnNpemUoKSArICIgcGFnZVNpemU9IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBwYWdlU2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PEJ1bmRsZT4gYnVuZGxlTGlzdDsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKE1lZGlhSXRlbTIgaXRlbSA6IHJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICBidW5kbGVMaXN0LmFkZChpdGVtID09IG51bGwgPyBudWxsIDogaXRlbS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25HZXRTZWFyY2hSZXN1bHREb25lKHF1ZXJ5LCBwYWdlLCBwYWdlU2l6ZSwgYnVuZGxlTGlzdCwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdWJzY3JpYmUoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgcGFyZW50SWQsCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgb3B0aW9uKSB7Ci0gICAgICAgIG9uQnJvd3NlckNvbW1hbmQoY2FsbGVyLCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzdWJzY3JpYmUoKTogSWdub3JpbmcgbnVsbCBwYXJlbnRJZCBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25TdWJzY3JpYmUoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBwYXJlbnRJZCwgb3B0aW9uKTsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiBzdWJzY3JpcHRpb24gPSBtU3Vic2NyaXB0aW9ucy5nZXQoY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbiA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICAgICAgICAgICAgICAgICAgbVN1YnNjcmlwdGlvbnMucHV0KGNvbnRyb2xsZXIsIHN1YnNjcmlwdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5hZGQocGFyZW50SWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1bnN1YnNjcmliZShmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBwYXJlbnRJZCkgewotICAgICAgICBvbkJyb3dzZXJDb21tYW5kKGNhbGxlciwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAidW5zdWJzY3JpYmUoKTogSWdub3JpbmcgbnVsbCBwYXJlbnRJZCBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25VbnN1YnNjcmliZShzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXIsIHBhcmVudElkKTsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICBtU3Vic2NyaXB0aW9ucy5yZW1vdmUoY29udHJvbGxlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBBUElzIGZvciBNZWRpYVNlc3Npb24ySW1wbAotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIC8vIFRPRE8oamFld2FuKTogKENhbiBiZSBQb3N0LVApIE5lZWQgYSB3YXkgdG8gZ2V0IGNvbnRyb2xsZXIgd2l0aCBwZXJtaXNzaW9ucwotICAgIHB1YmxpYyBMaXN0PENvbnRyb2xsZXJJbmZvPiBnZXRDb250cm9sbGVycygpIHsKLSAgICAgICAgQXJyYXlMaXN0PENvbnRyb2xsZXJJbmZvPiBjb250cm9sbGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Db250cm9sbGVycy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJzLmFkZChtQ29udHJvbGxlcnMudmFsdWVBdChpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXJzOwotICAgIH0KLQotICAgIC8vIFNob3VsZCBiZSB1c2VkIHdpdGhvdXQgYSBsb2NrIHRvIHByZXZlbnQgcG90ZW50aWFsIGRlYWRsb2NrLgotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVBsYXllclN0YXRlQ2hhbmdlZE5vdExvY2tlZChpbnQgc3RhdGUpIHsKLSAgICAgICAgbm90aWZ5QWxsKChjb250cm9sbGVyLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25QbGF5ZXJTdGF0ZUNoYW5nZWQoc3RhdGUpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPKGphZXdhbik6IFJlbmFtZQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVBvc2l0aW9uQ2hhbmdlZE5vdExvY2tlZChsb25nIGV2ZW50VGltZU1zLCBsb25nIHBvc2l0aW9uTXMpIHsKLSAgICAgICAgbm90aWZ5QWxsKChjb250cm9sbGVyLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25Qb3NpdGlvbkNoYW5nZWQoZXZlbnRUaW1lTXMsIHBvc2l0aW9uTXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlQbGF5YmFja1NwZWVkQ2hhbmdlZE5vdExvY2tlZChmbG9hdCBzcGVlZCkgewotICAgICAgICBub3RpZnlBbGwoKGNvbnRyb2xsZXIsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vblBsYXliYWNrU3BlZWRDaGFuZ2VkKHNwZWVkKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5QnVmZmVyZWRQb3NpdGlvbkNoYW5nZWROb3RMb2NrZWQobG9uZyBidWZmZXJlZFBvc2l0aW9uTXMpIHsKLSAgICAgICAgbm90aWZ5QWxsKChjb250cm9sbGVyLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25CdWZmZXJlZFBvc2l0aW9uQ2hhbmdlZChidWZmZXJlZFBvc2l0aW9uTXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlDdXN0b21MYXlvdXROb3RMb2NrZWQoQ29udHJvbGxlckluZm8gY29udHJvbGxlciwgTGlzdDxDb21tYW5kQnV0dG9uPiBsYXlvdXQpIHsKLSAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBMaXN0PEJ1bmRsZT4gbGF5b3V0QnVuZGxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYXlvdXQuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gKChDb21tYW5kQnV0dG9uSW1wbCkgbGF5b3V0LmdldChpKS5nZXRQcm92aWRlcigpKS50b0J1bmRsZSgpOwotICAgICAgICAgICAgICAgIGlmIChidW5kbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsYXlvdXRCdW5kbGVzLmFkZChidW5kbGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uQ3VzdG9tTGF5b3V0Q2hhbmdlZChsYXlvdXRCdW5kbGVzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5UGxheWxpc3RDaGFuZ2VkTm90TG9ja2VkKExpc3Q8TWVkaWFJdGVtMj4gcGxheWxpc3QsIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGZpbmFsIExpc3Q8QnVuZGxlPiBidW5kbGVMaXN0OwotICAgICAgICBpZiAocGxheWxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVuZGxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwbGF5bGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChwbGF5bGlzdC5nZXQoaSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gcGxheWxpc3QuZ2V0KGkpLnRvQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChidW5kbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlTGlzdC5hZGQoYnVuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ1bmRsZUxpc3QgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIEJ1bmRsZSBtZXRhZGF0YUJ1bmRsZSA9IChtZXRhZGF0YSA9PSBudWxsKSA/IG51bGwgOiBtZXRhZGF0YS50b0J1bmRsZSgpOwotICAgICAgICBub3RpZnlBbGwoKGNvbnRyb2xsZXIsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAoZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShjb250cm9sbGVyLAotICAgICAgICAgICAgICAgICAgICBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX0dFVF9MSVNUKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25QbGF5bGlzdENoYW5nZWQoYnVuZGxlTGlzdCwgbWV0YWRhdGFCdW5kbGUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChnZXRDb250cm9sbGVyQmluZGVySWZBYmxlKGNvbnRyb2xsZXIsCi0gICAgICAgICAgICAgICAgICAgIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfR0VUX0xJU1RfTUVUQURBVEEpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKG1ldGFkYXRhQnVuZGxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5UGxheWxpc3RNZXRhZGF0YUNoYW5nZWROb3RMb2NrZWQoTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgZmluYWwgQnVuZGxlIG1ldGFkYXRhQnVuZGxlID0gKG1ldGFkYXRhID09IG51bGwpID8gbnVsbCA6IG1ldGFkYXRhLnRvQnVuZGxlKCk7Ci0gICAgICAgIG5vdGlmeUFsbChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX0dFVF9MSVNUX01FVEFEQVRBLAotICAgICAgICAgICAgICAgICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGlDb250cm9sbGVyLm9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQobWV0YWRhdGFCdW5kbGUpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVJlcGVhdE1vZGVDaGFuZ2VkTm90TG9ja2VkKGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgIG5vdGlmeUFsbCgodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25SZXBlYXRNb2RlQ2hhbmdlZChyZXBlYXRNb2RlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5U2h1ZmZsZU1vZGVDaGFuZ2VkTm90TG9ja2VkKGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICBub3RpZnlBbGwoKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uU2h1ZmZsZU1vZGVDaGFuZ2VkKHNodWZmbGVNb2RlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5UGxheWJhY2tJbmZvQ2hhbmdlZChNZWRpYUNvbnRyb2xsZXIyLlBsYXliYWNrSW5mbyBwbGF5YmFja0luZm8pIHsKLSAgICAgICAgZmluYWwgQnVuZGxlIHBsYXliYWNrSW5mb0J1bmRsZSA9Ci0gICAgICAgICAgICAgICAgKChNZWRpYUNvbnRyb2xsZXIySW1wbC5QbGF5YmFja0luZm9JbXBsKSBwbGF5YmFja0luZm8uZ2V0UHJvdmlkZXIoKSkudG9CdW5kbGUoKTsKLSAgICAgICAgbm90aWZ5QWxsKCh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vblBsYXliYWNrSW5mb0NoYW5nZWQocGxheWJhY2tJbmZvQnVuZGxlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QWxsb3dlZENvbW1hbmRzKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIFNlc3Npb25Db21tYW5kR3JvdXAyIGNvbW1hbmRzKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1BbGxvd2VkQ29tbWFuZEdyb3VwTWFwLnB1dChjb250cm9sbGVyLCBjb21tYW5kcyk7Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQoY29tbWFuZHMudG9CdW5kbGUoKSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlbmRDdXN0b21Db21tYW5kKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIFNlc3Npb25Db21tYW5kMiBjb21tYW5kLCBCdW5kbGUgYXJncywKLSAgICAgICAgICAgIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKSB7Ci0gICAgICAgIGlmIChyZWNlaXZlciAhPSBudWxsICYmIGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ29udHJvbGxlciBzaG91bGRuJ3QgYmUgbnVsbCBpZiByZXN1bHQgcmVjZWl2ZXIgaXMiCi0gICAgICAgICAgICAgICAgICAgICsgIiBzcGVjaWZpZWQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBCdW5kbGUgY29tbWFuZEJ1bmRsZSA9IGNvbW1hbmQudG9CdW5kbGUoKTsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uQ3VzdG9tQ29tbWFuZChjb21tYW5kQnVuZGxlLCBhcmdzLCBudWxsKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VuZEN1c3RvbUNvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQsIEJ1bmRsZSBhcmdzKSB7Ci0gICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBCdW5kbGUgY29tbWFuZEJ1bmRsZSA9IGNvbW1hbmQudG9CdW5kbGUoKTsKLSAgICAgICAgbm90aWZ5QWxsKCh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vbkN1c3RvbUNvbW1hbmQoY29tbWFuZEJ1bmRsZSwgYXJncywgbnVsbCk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUVycm9yKGludCBlcnJvckNvZGUsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgbm90aWZ5QWxsKCh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vbkVycm9yKGVycm9yQ29kZSwgZXh0cmFzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIEFQSXMgZm9yIE1lZGlhTGlicmFyeVNlc3Npb25JbXBsCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5U2VhcmNoUmVzdWx0Q2hhbmdlZChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTdHJpbmcgcXVlcnksIGludCBpdGVtQ291bnQsCi0gICAgICAgICAgICBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25TZWFyY2hSZXN1bHRDaGFuZ2VkKHF1ZXJ5LCBpdGVtQ291bnQsIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoaWxkcmVuQ2hhbmdlZE5vdExvY2tlZChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTdHJpbmcgcGFyZW50SWQsCi0gICAgICAgICAgICBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKGlzU3Vic2NyaWJlZChjb250cm9sbGVyLCBwYXJlbnRJZCkpIHsKLSAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vbkNoaWxkcmVuQ2hhbmdlZChwYXJlbnRJZCwgaXRlbUNvdW50LCBleHRyYXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGlsZHJlbkNoYW5nZWROb3RMb2NrZWQoU3RyaW5nIHBhcmVudElkLCBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG5vdGlmeUFsbCgoY29udHJvbGxlciwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChpc1N1YnNjcmliZWQoY29udHJvbGxlciwgcGFyZW50SWQpKSB7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25DaGlsZHJlbkNoYW5nZWQocGFyZW50SWQsIGl0ZW1Db3VudCwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU3Vic2NyaWJlZChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTdHJpbmcgcGFyZW50SWQpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgU2V0PFN0cmluZz4gc3Vic2NyaXB0aW9ucyA9IG1TdWJzY3JpcHRpb25zLmdldChjb250cm9sbGVyKTsKLSAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb25zID09IG51bGwgfHwgIXN1YnNjcmlwdGlvbnMuY29udGFpbnMocGFyZW50SWQpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBNaXNjCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgQEZ1bmN0aW9uYWxJbnRlcmZhY2UKLSAgICBwcml2YXRlIGludGVyZmFjZSBTZXNzaW9uUnVubmFibGUgewotICAgICAgICB2b2lkIHJ1bihmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uLCBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyKTsKLSAgICB9Ci0KLSAgICBARnVuY3Rpb25hbEludGVyZmFjZQotICAgIHByaXZhdGUgaW50ZXJmYWNlIExpYnJhcnlTZXNzaW9uUnVubmFibGUgewotICAgICAgICB2b2lkIHJ1bihmaW5hbCBNZWRpYUxpYnJhcnlTZXNzaW9uSW1wbCBzZXNzaW9uLCBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyKTsKLSAgICB9Ci0KLSAgICBARnVuY3Rpb25hbEludGVyZmFjZQotICAgIHByaXZhdGUgaW50ZXJmYWNlIE5vdGlmeVJ1bm5hYmxlIHsKLSAgICAgICAgdm9pZCBydW4oZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciwKLSAgICAgICAgICAgICAgICBmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBpQ29udHJvbGxlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvblNlcnZpY2UySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMzZWI2NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvblNlcnZpY2UySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkNvbnRleHQuTk9USUZJQ0FUSU9OX1NFUlZJQ0U7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlLlBsYXllckV2ZW50Q2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMi5NZWRpYU5vdGlmaWNhdGlvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yLlRva2VuVHlwZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVNlc3Npb25TZXJ2aWNlMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5HdWFyZGVkQnk7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotLy8gVE9ETyhqYWV3YW4pOiBOZWVkIGEgdGVzdCBmb3Igc2Vzc2lvbiBzZXJ2aWNlIGl0c2VsZi4KLXB1YmxpYyBjbGFzcyBNZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwgaW1wbGVtZW50cyBNZWRpYVNlc3Npb25TZXJ2aWNlMlByb3ZpZGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTVBTZXNzaW9uU2VydmljZSI7IC8vIHRvIG1lZXQgMjMgY2hhciBsaW1pdCBpbiBMb2cgdGFnCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7IC8vIFRPRE8oamFld2FuKTogQ2hhbmdlIHRoaXMuIChiLzc0MDk0NjExKQotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNlc3Npb25TZXJ2aWNlMiBtSW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQbGF5ZXJFdmVudENhbGxiYWNrIG1DYWxsYmFjayA9IG5ldyBTZXNzaW9uU2VydmljZUV2ZW50Q2FsbGJhY2soKTsKLQotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIE5vdGlmaWNhdGlvbk1hbmFnZXIgbU5vdGlmaWNhdGlvbk1hbmFnZXI7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgSW50ZW50IG1TdGFydFNlbGZJbnRlbnQ7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzUnVubmluZ0ZvcmVncm91bmQ7Ci0gICAgcHJpdmF0ZSBNZWRpYVNlc3Npb24yIG1TZXNzaW9uOwotCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvblNlcnZpY2UySW1wbChNZWRpYVNlc3Npb25TZXJ2aWNlMiBpbnN0YW5jZSkgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIk1lZGlhU2Vzc2lvblNlcnZpY2UySW1wbCgiICsgaW5zdGFuY2UgKyAiKSIpOwotICAgICAgICB9Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYVNlc3Npb24yIGdldFNlc3Npb25faW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNlc3Npb24oKTsKLSAgICB9Ci0KLSAgICBNZWRpYVNlc3Npb24yIGdldFNlc3Npb24oKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtU2Vzc2lvbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYU5vdGlmaWNhdGlvbiBvblVwZGF0ZU5vdGlmaWNhdGlvbl9pbXBsKCkgewotICAgICAgICAvLyBQcm92aWRlIGRlZmF1bHQgbm90aWZpY2F0aW9uIFVJIGxhdGVyLgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZV9pbXBsKCkgewotICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlciA9IChOb3RpZmljYXRpb25NYW5hZ2VyKSBtSW5zdGFuY2UuZ2V0U3lzdGVtU2VydmljZSgKLSAgICAgICAgICAgICAgICBOT1RJRklDQVRJT05fU0VSVklDRSk7Ci0gICAgICAgIG1TdGFydFNlbGZJbnRlbnQgPSBuZXcgSW50ZW50KG1JbnN0YW5jZSwgbUluc3RhbmNlLmdldENsYXNzKCkpOwotCi0gICAgICAgIFNlc3Npb25Ub2tlbjIgdG9rZW4gPSBuZXcgU2Vzc2lvblRva2VuMihtSW5zdGFuY2UsIG1JbnN0YW5jZS5nZXRQYWNrYWdlTmFtZSgpLAotICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIGlmICh0b2tlbi5nZXRUeXBlKCkgIT0gZ2V0U2Vzc2lvblR5cGUoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4cGVjdGVkIHNlc3Npb24gc2VydmljZSwgYnV0IHdhcyAiICsgdG9rZW4uZ2V0VHlwZSgpKTsKLSAgICAgICAgfQotICAgICAgICBtU2Vzc2lvbiA9IG1JbnN0YW5jZS5vbkNyZWF0ZVNlc3Npb24odG9rZW4uZ2V0SWQoKSk7Ci0gICAgICAgIGlmIChtU2Vzc2lvbiA9PSBudWxsIHx8ICF0b2tlbi5nZXRJZCgpLmVxdWFscyhtU2Vzc2lvbi5nZXRUb2tlbigpLmdldElkKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXhwZWN0ZWQgc2Vzc2lvbiB3aXRoIGlkICIgKyB0b2tlbi5nZXRJZCgpCi0gICAgICAgICAgICAgICAgICAgICsgIiwgYnV0IGdvdCAiICsgbVNlc3Npb24pOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogVW5jb21tZW50IGhlcmUuCi0gICAgICAgIC8vIG1TZXNzaW9uLnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhtQ2FsbGJhY2ssIG1TZXNzaW9uLmdldEV4ZWN1dG9yKCkpOwotICAgIH0KLQotICAgIEBUb2tlblR5cGUgaW50IGdldFNlc3Npb25UeXBlKCkgewotICAgICAgICByZXR1cm4gU2Vzc2lvblRva2VuMi5UWVBFX1NFU1NJT05fU0VSVklDRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmRfaW1wbChJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIGlmIChNZWRpYVNlc3Npb25TZXJ2aWNlMi5TRVJWSUNFX0lOVEVSRkFDRS5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgewotICAgICAgICAgICAgcmV0dXJuICgoTWVkaWFTZXNzaW9uMkltcGwpIG1TZXNzaW9uLmdldFByb3ZpZGVyKCkpLmdldFNlc3Npb25TdHViKCkuYXNCaW5kZXIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlTm90aWZpY2F0aW9uKGludCBwbGF5ZXJTdGF0ZSkgewotICAgICAgICBNZWRpYU5vdGlmaWNhdGlvbiBtZWRpYU5vdGlmaWNhdGlvbiA9IG1JbnN0YW5jZS5vblVwZGF0ZU5vdGlmaWNhdGlvbigpOwotICAgICAgICBpZiAobWVkaWFOb3RpZmljYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaChwbGF5ZXJTdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXllckJhc2UuUExBWUVSX1NUQVRFX1BMQVlJTkc6Ci0gICAgICAgICAgICAgICAgaWYgKCFtSXNSdW5uaW5nRm9yZWdyb3VuZCkgewotICAgICAgICAgICAgICAgICAgICBtSXNSdW5uaW5nRm9yZWdyb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5zdGFydEZvcmVncm91bmRTZXJ2aWNlKG1TdGFydFNlbGZJbnRlbnQpOwotICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc3RhcnRGb3JlZ3JvdW5kKG1lZGlhTm90aWZpY2F0aW9uLmdldE5vdGlmaWNhdGlvbklkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFOb3RpZmljYXRpb24uZ2V0Tm90aWZpY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXllckJhc2UuUExBWUVSX1NUQVRFX0lETEU6Ci0gICAgICAgICAgICBjYXNlIE1lZGlhUGxheWVyQmFzZS5QTEFZRVJfU1RBVEVfRVJST1I6Ci0gICAgICAgICAgICAgICAgaWYgKG1Jc1J1bm5pbmdGb3JlZ3JvdW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Jc1J1bm5pbmdGb3JlZ3JvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5zdG9wRm9yZWdyb3VuZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5ub3RpZnkobWVkaWFOb3RpZmljYXRpb24uZ2V0Tm90aWZpY2F0aW9uSWQoKSwKLSAgICAgICAgICAgICAgICBtZWRpYU5vdGlmaWNhdGlvbi5nZXROb3RpZmljYXRpb24oKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBTZXNzaW9uU2VydmljZUV2ZW50Q2FsbGJhY2sgZXh0ZW5kcyBQbGF5ZXJFdmVudENhbGxiYWNrIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWVyU3RhdGVDaGFuZ2VkKE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIsIGludCBzdGF0ZSkgewotICAgICAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWVkaWFOb3RpZmljYXRpb25JbXBsIGltcGxlbWVudHMgTWVkaWFOb3RpZmljYXRpb25Qcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgaW50IG1Ob3RpZmljYXRpb25JZDsKLSAgICAgICAgcHJpdmF0ZSBOb3RpZmljYXRpb24gbU5vdGlmaWNhdGlvbjsKLQotICAgICAgICBwdWJsaWMgTWVkaWFOb3RpZmljYXRpb25JbXBsKE1lZGlhTm90aWZpY2F0aW9uIGluc3RhbmNlLCBpbnQgbm90aWZpY2F0aW9uSWQsCi0gICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm90aWZpY2F0aW9uIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTm90aWZpY2F0aW9uSWQgPSBub3RpZmljYXRpb25JZDsKLSAgICAgICAgICAgIG1Ob3RpZmljYXRpb24gPSBub3RpZmljYXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXROb3RpZmljYXRpb25JZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Ob3RpZmljYXRpb25JZDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgTm90aWZpY2F0aW9uIGdldE5vdGlmaWNhdGlvbl9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Ob3RpZmljYXRpb247Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1JhdGluZzJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1JhdGluZzJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NTgxMjkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9SYXRpbmcySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5SYXRpbmcyLio7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlJhdGluZzI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5SYXRpbmcyLlN0eWxlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlJhdGluZzJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS51dGlsLk9iamVjdHM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBSYXRpbmcySW1wbCBpbXBsZW1lbnRzIFJhdGluZzJQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJSYXRpbmcyIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU1RZTEUgPSAiYW5kcm9pZC5tZWRpYS5yYXRpbmcyLnN0eWxlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZBTFVFID0gImFuZHJvaWQubWVkaWEucmF0aW5nMi52YWx1ZSI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBmbG9hdCBSQVRJTkdfTk9UX1JBVEVEID0gLTEuMGY7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFJhdGluZzIgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgaW50IG1SYXRpbmdTdHlsZTsKLSAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1SYXRpbmdWYWx1ZTsKLQotICAgIHByaXZhdGUgUmF0aW5nMkltcGwoQFN0eWxlIGludCByYXRpbmdTdHlsZSwgZmxvYXQgcmF0aW5nKSB7Ci0gICAgICAgIG1SYXRpbmdTdHlsZSA9IHJhdGluZ1N0eWxlOwotICAgICAgICBtUmF0aW5nVmFsdWUgPSByYXRpbmc7Ci0gICAgICAgIG1JbnN0YW5jZSA9IG5ldyBSYXRpbmcyKHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmdfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuICJSYXRpbmcyOnN0eWxlPSIgKyBtUmF0aW5nU3R5bGUgKyAiIHJhdGluZz0iCi0gICAgICAgICAgICAgICAgKyAobVJhdGluZ1ZhbHVlIDwgMC4wZiA/ICJ1bnJhdGVkIiA6IFN0cmluZy52YWx1ZU9mKG1SYXRpbmdWYWx1ZSkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFsc19pbXBsKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgUmF0aW5nMikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBSYXRpbmcySW1wbCBvdGhlciA9IChSYXRpbmcySW1wbCkgKChSYXRpbmcyKSBvYmopLmdldFByb3ZpZGVyKCk7Ci0gICAgICAgIHJldHVybiBtUmF0aW5nU3R5bGUgPT0gb3RoZXIubVJhdGluZ1N0eWxlCi0gICAgICAgICAgICAgICAgJiYgbVJhdGluZ1ZhbHVlID09IG90aGVyLm1SYXRpbmdWYWx1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBPYmplY3RzLmhhc2gobVJhdGluZ1N0eWxlLCBtUmF0aW5nVmFsdWUpOwotICAgIH0KLQotICAgIFJhdGluZzIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSYXRpbmcyIGZyb21CdW5kbGVfaW1wbChCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIGlmIChidW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcySW1wbChidW5kbGUuZ2V0SW50KEtFWV9TVFlMRSksIGJ1bmRsZS5nZXRGbG9hdChLRVlfVkFMVUUpKS5nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBCdW5kbGUgdG9CdW5kbGVfaW1wbCgpIHsKLSAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgYnVuZGxlLnB1dEludChLRVlfU1RZTEUsIG1SYXRpbmdTdHlsZSk7Ci0gICAgICAgIGJ1bmRsZS5wdXRGbG9hdChLRVlfVkFMVUUsIG1SYXRpbmdWYWx1ZSk7Ci0gICAgICAgIHJldHVybiBidW5kbGU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSYXRpbmcyIG5ld1VucmF0ZWRSYXRpbmdfaW1wbChAU3R5bGUgaW50IHJhdGluZ1N0eWxlKSB7Ci0gICAgICAgIHN3aXRjaChyYXRpbmdTdHlsZSkgewotICAgICAgICAgICAgY2FzZSBSQVRJTkdfSEVBUlQ6Ci0gICAgICAgICAgICBjYXNlIFJBVElOR19USFVNQl9VUF9ET1dOOgotICAgICAgICAgICAgY2FzZSBSQVRJTkdfM19TVEFSUzoKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzRfU1RBUlM6Ci0gICAgICAgICAgICBjYXNlIFJBVElOR181X1NUQVJTOgotICAgICAgICAgICAgY2FzZSBSQVRJTkdfUEVSQ0VOVEFHRToKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJhdGluZzJJbXBsKHJhdGluZ1N0eWxlLCBSQVRJTkdfTk9UX1JBVEVEKS5nZXRJbnN0YW5jZSgpOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nMiBuZXdIZWFydFJhdGluZ19pbXBsKGJvb2xlYW4gaGFzSGVhcnQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcySW1wbChSQVRJTkdfSEVBUlQsIGhhc0hlYXJ0ID8gMS4wZiA6IDAuMGYpLmdldEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSYXRpbmcyIG5ld1RodW1iUmF0aW5nX2ltcGwoYm9vbGVhbiB0aHVtYklzVXApIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcySW1wbChSQVRJTkdfVEhVTUJfVVBfRE9XTiwgdGh1bWJJc1VwID8gMS4wZiA6IDAuMGYpLmdldEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSYXRpbmcyIG5ld1N0YXJSYXRpbmdfaW1wbChpbnQgc3RhclJhdGluZ1N0eWxlLCBmbG9hdCBzdGFyUmF0aW5nKSB7Ci0gICAgICAgIGZsb2F0IG1heFJhdGluZyA9IFJBVElOR19OT1RfUkFURUQ7Ci0gICAgICAgIHN3aXRjaChzdGFyUmF0aW5nU3R5bGUpIHsKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzNfU1RBUlM6Ci0gICAgICAgICAgICAgICAgbWF4UmF0aW5nID0gMy4wZjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzRfU1RBUlM6Ci0gICAgICAgICAgICAgICAgbWF4UmF0aW5nID0gNC4wZjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzVfU1RBUlM6Ci0gICAgICAgICAgICAgICAgbWF4UmF0aW5nID0gNS4wZjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiSW52YWxpZCByYXRpbmcgc3R5bGUgKCIgKyBzdGFyUmF0aW5nU3R5bGUgKyAiKSBmb3IgYSBzdGFyIHJhdGluZyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoc3RhclJhdGluZyA8IDAuMGYpIHx8IChzdGFyUmF0aW5nID4gbWF4UmF0aW5nKSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiVHJ5aW5nIHRvIHNldCBvdXQgb2YgcmFuZ2Ugc3Rhci1iYXNlZCByYXRpbmciKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgUmF0aW5nMkltcGwoc3RhclJhdGluZ1N0eWxlLCBzdGFyUmF0aW5nKS5nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nMiBuZXdQZXJjZW50YWdlUmF0aW5nX2ltcGwoZmxvYXQgcGVyY2VudCkgewotICAgICAgICBpZiAoKHBlcmNlbnQgPCAwLjBmKSB8fCAocGVyY2VudCA+IDEwMC4wZikpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkludmFsaWQgcGVyY2VudGFnZS1iYXNlZCByYXRpbmcgdmFsdWUiKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcySW1wbChSQVRJTkdfUEVSQ0VOVEFHRSwgcGVyY2VudCkuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzUmF0ZWRfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1SYXRpbmdWYWx1ZSA+PSAwLjBmOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0UmF0aW5nU3R5bGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1SYXRpbmdTdHlsZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNIZWFydF9pbXBsKCkgewotICAgICAgICBpZiAobVJhdGluZ1N0eWxlICE9IFJBVElOR19IRUFSVCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIChtUmF0aW5nVmFsdWUgPT0gMS4wZik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1RodW1iVXBfaW1wbCgpIHsKLSAgICAgICAgaWYgKG1SYXRpbmdTdHlsZSAhPSBSQVRJTkdfVEhVTUJfVVBfRE9XTikgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIChtUmF0aW5nVmFsdWUgPT0gMS4wZik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmxvYXQgZ2V0U3RhclJhdGluZ19pbXBsKCkgewotICAgICAgICBzd2l0Y2ggKG1SYXRpbmdTdHlsZSkgewotICAgICAgICAgICAgY2FzZSBSQVRJTkdfM19TVEFSUzoKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzRfU1RBUlM6Ci0gICAgICAgICAgICBjYXNlIFJBVElOR181X1NUQVJTOgotICAgICAgICAgICAgICAgIGlmIChtSW5zdGFuY2UuaXNSYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtUmF0aW5nVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gLTEuMGY7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmxvYXQgZ2V0UGVyY2VudFJhdGluZ19pbXBsKCkgewotICAgICAgICBpZiAoKG1SYXRpbmdTdHlsZSAhPSBSQVRJTkdfUEVSQ0VOVEFHRSkgfHwgIW1JbnN0YW5jZS5pc1JhdGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMS4wZjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBtUmF0aW5nVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1JvdXRlUGxheWVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1JvdXRlUGxheWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NTBkMzQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9Sb3V0ZVBsYXllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGU7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uUmVxdWlyZXNBcGk7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhSXRlbVN0YXR1czsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFTZXNzaW9uU3RhdHVzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuUmVtb3RlUGxheWJhY2tDbGllbnQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5SZW1vdGVQbGF5YmFja0NsaWVudC5JdGVtQWN0aW9uQ2FsbGJhY2s7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5SZW1vdGVQbGF5YmFja0NsaWVudC5TZXNzaW9uQWN0aW9uQ2FsbGJhY2s7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5SZW1vdGVQbGF5YmFja0NsaWVudC5TdGF0dXNDYWxsYmFjazsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLUBSZXF1aXJlc0FwaShhcGkgPSBCdWlsZC5WRVJTSU9OX0NPREVTLkxPTExJUE9QKQotcHVibGljIGNsYXNzIFJvdXRlUGxheWVyIGV4dGVuZHMgTWVkaWFTZXNzaW9uLkNhbGxiYWNrIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgUExBWUJBQ0tfQUNUSU9OUyA9IFBsYXliYWNrU3RhdGUuQUNUSU9OX1BBVVNFCi0gICAgICAgICAgICB8IFBsYXliYWNrU3RhdGUuQUNUSU9OX1BMQVkgfCBQbGF5YmFja1N0YXRlLkFDVElPTl9TRUVLX1RPCi0gICAgICAgICAgICB8IFBsYXliYWNrU3RhdGUuQUNUSU9OX0ZBU1RfRk9SV0FSRCB8IFBsYXliYWNrU3RhdGUuQUNUSU9OX1JFV0lORDsKLQotICAgIHByaXZhdGUgUmVtb3RlUGxheWJhY2tDbGllbnQgbUNsaWVudDsKLSAgICBwcml2YXRlIFN0cmluZyBtU2Vzc2lvbklkOwotICAgIHByaXZhdGUgU3RyaW5nIG1JdGVtSWQ7Ci0gICAgcHJpdmF0ZSBQbGF5ZXJFdmVudENhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHByaXZhdGUgU3RhdHVzQ2FsbGJhY2sgbVN0YXR1c0NhbGxiYWNrID0gbmV3IFN0YXR1c0NhbGxiYWNrKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25JdGVtU3RhdHVzQ2hhbmdlZChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cywKLSAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkLCBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgewotICAgICAgICAgICAgdXBkYXRlU2Vzc2lvblN0YXR1cyhzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgdXBkYXRlSXRlbVN0YXR1cyhpdGVtSWQsIGl0ZW1TdGF0dXMpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHB1YmxpYyBSb3V0ZVBsYXllcihDb250ZXh0IGNvbnRleHQsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICBtQ2xpZW50ID0gbmV3IFJlbW90ZVBsYXliYWNrQ2xpZW50KGNvbnRleHQsIHJvdXRlKTsKLSAgICAgICAgbUNsaWVudC5zZXRTdGF0dXNDYWxsYmFjayhtU3RhdHVzQ2FsbGJhY2spOwotICAgICAgICBtQ2xpZW50LnN0YXJ0U2Vzc2lvbihudWxsLCBuZXcgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTZXNzaW9uU3RhdHVzKHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUGxheSgpIHsKLSAgICAgICAgbUNsaWVudC5yZXN1bWUobnVsbCwgbmV3IFNlc3Npb25BY3Rpb25DYWxsYmFjaygpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU2Vzc2lvblN0YXR1cyhzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblBhdXNlKCkgewotICAgICAgICBtQ2xpZW50LnBhdXNlKG51bGwsIG5ldyBTZXNzaW9uQWN0aW9uQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cykgewotICAgICAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TZWVrVG8obG9uZyBwb3MpIHsKLSAgICAgICAgbUNsaWVudC5zZWVrKG1JdGVtSWQsIHBvcywgbnVsbCwgbmV3IEl0ZW1BY3Rpb25DYWxsYmFjaygpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkLCBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgewotICAgICAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVJdGVtU3RhdHVzKGl0ZW1JZCwgaXRlbVN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKLSAgICAgICAgbUNsaWVudC5zdG9wKG51bGwsIG5ldyBTZXNzaW9uQWN0aW9uQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cykgewotICAgICAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGxheWVyRXZlbnRDYWxsYmFjayhQbGF5ZXJFdmVudENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9wZW5WaWRlbyhEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgbUNsaWVudC5wbGF5KGRzZC5nZXRVcmkoKSwgInZpZGVvL21wNCIsIG51bGwsIDAsIG51bGwsIG5ldyBJdGVtQWN0aW9uQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTZXNzaW9uU3RhdHVzKHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlSXRlbVN0YXR1cyhpdGVtSWQsIGl0ZW1TdGF0dXMpOwotICAgICAgICAgICAgICAgIHBsYXlJbnRlcm5hbChkc2QuZ2V0VXJpKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotICAgICAgICBpZiAobUNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ2xpZW50LnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1DbGllbnQgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNhbGxiYWNrID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwbGF5SW50ZXJuYWwoVXJpIHVyaSkgewotICAgICAgICBtQ2xpZW50LnBsYXkodXJpLCAidmlkZW8vbXA0IiwgbnVsbCwgMCwgbnVsbCwgbmV3IEl0ZW1BY3Rpb25DYWxsYmFjaygpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkLCBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgewotICAgICAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVJdGVtU3RhdHVzKGl0ZW1JZCwgaXRlbVN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTZXNzaW9uU3RhdHVzKFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzKSB7Ci0gICAgICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUl0ZW1TdGF0dXMoU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgbUl0ZW1JZCA9IGl0ZW1JZDsKLSAgICAgICAgaWYgKGl0ZW1TdGF0dXMgPT0gbnVsbCB8fCBtQ2FsbGJhY2sgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgICBtQ2FsbGJhY2sub25QbGF5ZXJTdGF0ZUNoYW5nZWQoaXRlbVN0YXR1cyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBQbGF5ZXJFdmVudENhbGxiYWNrIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25QbGF5ZXJTdGF0ZUNoYW5nZWQoTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblBsYXlsaXN0QWdlbnQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblBsYXlsaXN0QWdlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM1NzBhYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25QbGF5bGlzdEFnZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlLlBsYXllckV2ZW50Q2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLk9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkFycmF5TWFwOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuR3VhcmRlZEJ5OwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRMb2NhbFJhbmRvbTsKLQotcHVibGljIGNsYXNzIFNlc3Npb25QbGF5bGlzdEFnZW50IGV4dGVuZHMgTWVkaWFQbGF5bGlzdEFnZW50IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNlc3Npb25QbGF5bGlzdEFnZW50IjsKLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBzdGF0aWMgZmluYWwgaW50IEVORF9PRl9QTEFZTElTVCA9IC0xOwotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTk9fVkFMSURfSVRFTVMgPSAtMjsKLQotICAgIHByaXZhdGUgZmluYWwgUGxheUl0ZW0gbUVvcFBsYXlJdGVtID0gbmV3IFBsYXlJdGVtKEVORF9PRl9QTEFZTElTVCwgbnVsbCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIG1TZXNzaW9uSW1wbDsKLSAgICBwcml2YXRlIGZpbmFsIE15UGxheWVyRXZlbnRDYWxsYmFjayBtUGxheWVyQ2FsbGJhY2s7Ci0KLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBNZWRpYVBsYXllckJhc2UgbVBsYXllcjsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyIG1Ec21IZWxwZXI7Ci0gICAgLy8gVE9ETzogQ2hlY2sgaWYgaGF2aW5nIHRoZSBzYW1lIGl0ZW0gaXMgb2theSAoYi83NDA5MDc0MSkKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8TWVkaWFJdGVtMj4gbVBsYXlsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgQXJyYXlMaXN0PE1lZGlhSXRlbTI+IG1TaHVmZmxlZExpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBNYXA8TWVkaWFJdGVtMiwgRGF0YVNvdXJjZURlc2M+IG1JdGVtRHNkTWFwID0gbmV3IEFycmF5TWFwPD4oKTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBNZWRpYU1ldGFkYXRhMiBtTWV0YWRhdGE7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgaW50IG1SZXBlYXRNb2RlOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGludCBtU2h1ZmZsZU1vZGU7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgUGxheUl0ZW0gbUN1cnJlbnQ7Ci0KLSAgICAvLyBDYWxsZWQgb24gc2Vzc2lvbiBjYWxsYmFjayBleGVjdXRvci4KLSAgICBwcml2YXRlIGNsYXNzIE15UGxheWVyRXZlbnRDYWxsYmFjayBleHRlbmRzIFBsYXllckV2ZW50Q2FsbGJhY2sgewotICAgICAgICBwdWJsaWMgdm9pZCBvbkN1cnJlbnREYXRhU291cmNlQ2hhbmdlZChATm9uTnVsbCBNZWRpYVBsYXllckJhc2UgbXBiLAotICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgICAgIGlmIChtUGxheWVyICE9IG1wYikgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICBpZiAoZHNkID09IG51bGwgJiYgbUN1cnJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudCA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKG1DdXJyZW50LnNodWZmbGVkSWR4LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBQbGF5SXRlbSB7Ci0gICAgICAgIGludCBzaHVmZmxlZElkeDsKLSAgICAgICAgRGF0YVNvdXJjZURlc2MgZHNkOwotICAgICAgICBNZWRpYUl0ZW0yIG1lZGlhSXRlbTsKLQotICAgICAgICBQbGF5SXRlbShpbnQgc2h1ZmZsZWRJZHgpIHsKLSAgICAgICAgICAgIHRoaXMoc2h1ZmZsZWRJZHgsIG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgUGxheUl0ZW0oaW50IHNodWZmbGVkSWR4LCBEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgICAgIHRoaXMuc2h1ZmZsZWRJZHggPSBzaHVmZmxlZElkeDsKLSAgICAgICAgICAgIGlmIChzaHVmZmxlZElkeCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tZWRpYUl0ZW0gPSBtU2h1ZmZsZWRMaXN0LmdldChzaHVmZmxlZElkeCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRzZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHNkID0gcmV0cmlldmVEYXRhU291cmNlRGVzY0xvY2tlZCh0aGlzLm1lZGlhSXRlbSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aGlzLmRzZCA9IGRzZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzVmFsaWQoKSB7Ci0gICAgICAgICAgICBpZiAodGhpcyA9PSBtRW9wUGxheUl0ZW0pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZWRpYUl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkc2QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzaHVmZmxlZElkeCA+PSBtU2h1ZmZsZWRMaXN0LnNpemUoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZWRpYUl0ZW0gIT0gbVNodWZmbGVkTGlzdC5nZXQoc2h1ZmZsZWRJZHgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1lZGlhSXRlbS5nZXREYXRhU291cmNlRGVzYygpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgIW1lZGlhSXRlbS5nZXREYXRhU291cmNlRGVzYygpLmVxdWFscyhkc2QpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU2Vzc2lvblBsYXlsaXN0QWdlbnQoQE5vbk51bGwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbkltcGwsCi0gICAgICAgICAgICBATm9uTnVsbCBNZWRpYVBsYXllckJhc2UgcGxheWVyKSB7Ci0gICAgICAgIGlmIChzZXNzaW9uSW1wbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZXNzaW9uSW1wbCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwbGF5ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGxheWVyIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgbVNlc3Npb25JbXBsID0gc2Vzc2lvbkltcGw7Ci0gICAgICAgIG1QbGF5ZXIgPSBwbGF5ZXI7Ci0gICAgICAgIG1QbGF5ZXJDYWxsYmFjayA9IG5ldyBNeVBsYXllckV2ZW50Q2FsbGJhY2soKTsKLSAgICAgICAgbVBsYXllci5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2sobVNlc3Npb25JbXBsLmdldENhbGxiYWNrRXhlY3V0b3IoKSwgbVBsYXllckNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5ZXIoQE5vbk51bGwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllcikgewotICAgICAgICBpZiAocGxheWVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBsYXllciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmIChwbGF5ZXIgPT0gbVBsYXllcikgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1QbGF5ZXIudW5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2sobVBsYXllckNhbGxiYWNrKTsKLSAgICAgICAgICAgIG1QbGF5ZXIgPSBwbGF5ZXI7Ci0gICAgICAgICAgICBtUGxheWVyLnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjaygKLSAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JbXBsLmdldENhbGxiYWNrRXhlY3V0b3IoKSwgbVBsYXllckNhbGxiYWNrKTsKLSAgICAgICAgICAgIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIoT25EYXRhU291cmNlTWlzc2luZ0hlbHBlciBoZWxwZXIpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbURzbUhlbHBlciA9IGhlbHBlcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyT25EYXRhU291cmNlTWlzc2luZ0hlbHBlcigpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbURzbUhlbHBlciA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQE51bGxhYmxlIExpc3Q8TWVkaWFJdGVtMj4gZ2V0UGxheWxpc3QoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG1QbGF5bGlzdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5bGlzdChATm9uTnVsbCBMaXN0PE1lZGlhSXRlbTI+IGxpc3QsIEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsaXN0IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtSXRlbURzZE1hcC5jbGVhcigpOwotCi0gICAgICAgICAgICBtUGxheWxpc3QuY2xlYXIoKTsKLSAgICAgICAgICAgIG1QbGF5bGlzdC5hZGRBbGwobGlzdCk7Ci0gICAgICAgICAgICBhcHBseVNodWZmbGVNb2RlTG9ja2VkKCk7Ci0KLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICAgICAgbUN1cnJlbnQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChFTkRfT0ZfUExBWUxJU1QsIDEpOwotICAgICAgICAgICAgdXBkYXRlUGxheWVyRGF0YVNvdXJjZUxvY2tlZCgpOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeVBsYXlsaXN0Q2hhbmdlZCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgZ2V0UGxheWxpc3RNZXRhZGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIG1NZXRhZGF0YTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5bGlzdE1ldGFkYXRhKEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAobWV0YWRhdGEgPT0gbU1ldGFkYXRhKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5UGxheWxpc3RNZXRhZGF0YUNoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRQbGF5bGlzdEl0ZW0oaW50IGluZGV4LCBATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGluZGV4ID0gY2xhbXAoaW5kZXgsIG1QbGF5bGlzdC5zaXplKCkpOwotICAgICAgICAgICAgaW50IHNodWZmbGVkSWR4ID0gaW5kZXg7Ci0gICAgICAgICAgICBtUGxheWxpc3QuYWRkKGluZGV4LCBpdGVtKTsKLSAgICAgICAgICAgIGlmIChtU2h1ZmZsZU1vZGUgPT0gTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgbVNodWZmbGVkTGlzdC5hZGQoaW5kZXgsIGl0ZW0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGl0ZW0gaW4gcmFuZG9tIHBvc2l0aW9uIG9mIG1TaHVmZmxlZExpc3QuCi0gICAgICAgICAgICAgICAgc2h1ZmZsZWRJZHggPSBUaHJlYWRMb2NhbFJhbmRvbS5jdXJyZW50KCkubmV4dEludChtU2h1ZmZsZWRMaXN0LnNpemUoKSArIDEpOwotICAgICAgICAgICAgICAgIG1TaHVmZmxlZExpc3QuYWRkKHNodWZmbGVkSWR4LCBpdGVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghaGFzVmFsaWRJdGVtKCkpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudCA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKEVORF9PRl9QTEFZTElTVCwgMSk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUGxheWVyRGF0YVNvdXJjZUxvY2tlZCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBub3RpZnlQbGF5bGlzdENoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQbGF5bGlzdEl0ZW0oQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAoIW1QbGF5bGlzdC5yZW1vdmUoaXRlbSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU2h1ZmZsZWRMaXN0LnJlbW92ZShpdGVtKTsKLSAgICAgICAgICAgIG1JdGVtRHNkTWFwLnJlbW92ZShpdGVtKTsKLSAgICAgICAgICAgIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCgpOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeVBsYXlsaXN0Q2hhbmdlZCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VQbGF5bGlzdEl0ZW0oaW50IGluZGV4LCBATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmIChtUGxheWxpc3Quc2l6ZSgpIDw9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbmRleCA9IGNsYW1wKGluZGV4LCBtUGxheWxpc3Quc2l6ZSgpIC0gMSk7Ci0gICAgICAgICAgICBpbnQgc2h1ZmZsZWRJZHggPSBtU2h1ZmZsZWRMaXN0LmluZGV4T2YobVBsYXlsaXN0LmdldChpbmRleCkpOwotICAgICAgICAgICAgbUl0ZW1Ec2RNYXAucmVtb3ZlKG1TaHVmZmxlZExpc3QuZ2V0KHNodWZmbGVkSWR4KSk7Ci0gICAgICAgICAgICBtU2h1ZmZsZWRMaXN0LnNldChzaHVmZmxlZElkeCwgaXRlbSk7Ci0gICAgICAgICAgICBtUGxheWxpc3Quc2V0KGluZGV4LCBpdGVtKTsKLSAgICAgICAgICAgIGlmICghaGFzVmFsaWRJdGVtKCkpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudCA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKEVORF9PRl9QTEFZTElTVCwgMSk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUGxheWVyRGF0YVNvdXJjZUxvY2tlZCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBub3RpZnlQbGF5bGlzdENoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QbGF5bGlzdEl0ZW0oQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAoIWhhc1ZhbGlkSXRlbSgpIHx8IGl0ZW0uZXF1YWxzKG1DdXJyZW50Lm1lZGlhSXRlbSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgc2h1ZmZsZWRJZHggPSBtU2h1ZmZsZWRMaXN0LmluZGV4T2YoaXRlbSk7Ci0gICAgICAgICAgICBpZiAoc2h1ZmZsZWRJZHggPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUN1cnJlbnQgPSBuZXcgUGxheUl0ZW0oc2h1ZmZsZWRJZHgpOwotICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QcmV2aW91c0l0ZW0oKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmICghaGFzVmFsaWRJdGVtKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQbGF5SXRlbSBwcmV2ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQobUN1cnJlbnQuc2h1ZmZsZWRJZHgsIC0xKTsKLSAgICAgICAgICAgIGlmIChwcmV2ICE9IG1Fb3BQbGF5SXRlbSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50ID0gcHJldjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCgpOwotICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9OZXh0SXRlbSgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKCFoYXNWYWxpZEl0ZW0oKSB8fCBtQ3VycmVudCA9PSBtRW9wUGxheUl0ZW0pIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQbGF5SXRlbSBuZXh0ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQobUN1cnJlbnQuc2h1ZmZsZWRJZHgsIDEpOwotICAgICAgICAgICAgaWYgKG5leHQgIT0gbUVvcFBsYXlJdGVtKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnQgPSBuZXh0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFJlcGVhdE1vZGUoKSB7Ci0gICAgICAgIHJldHVybiBtUmVwZWF0TW9kZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBlYXRNb2RlKGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgIGlmIChyZXBlYXRNb2RlIDwgTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkUKLSAgICAgICAgICAgICAgICB8fCByZXBlYXRNb2RlID4gTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0dST1VQKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKG1SZXBlYXRNb2RlID09IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUmVwZWF0TW9kZSA9IHJlcGVhdE1vZGU7Ci0gICAgICAgICAgICBzd2l0Y2ggKHJlcGVhdE1vZGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9PTkU6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudCAhPSBudWxsICYmIG1DdXJyZW50ICE9IG1Fb3BQbGF5SXRlbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXllci5sb29wQ3VycmVudCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9BTEw6Ci0gICAgICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfR1JPVVA6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudCA9PSBtRW9wUGxheUl0ZW0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQoRU5EX09GX1BMQVlMSVNULCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBwYXNzIHRocm91Z2gKLSAgICAgICAgICAgICAgICBjYXNlIE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FOgotICAgICAgICAgICAgICAgICAgICBtUGxheWVyLmxvb3BDdXJyZW50KGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5UmVwZWF0TW9kZUNoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFNodWZmbGVNb2RlKCkgewotICAgICAgICByZXR1cm4gbVNodWZmbGVNb2RlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFNodWZmbGVNb2RlKGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICBpZiAoc2h1ZmZsZU1vZGUgPCBNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX05PTkUKLSAgICAgICAgICAgICAgICB8fCBzaHVmZmxlTW9kZSA+IE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfR1JPVVApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAobVNodWZmbGVNb2RlID09IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNodWZmbGVNb2RlID0gc2h1ZmZsZU1vZGU7Ci0gICAgICAgICAgICBhcHBseVNodWZmbGVNb2RlTG9ja2VkKCk7Ci0gICAgICAgICAgICB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKTsKLSAgICAgICAgfQotICAgICAgICBub3RpZnlTaHVmZmxlTW9kZUNoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBpbnQgZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpIHsKLSAgICAgICAgcmV0dXJuIGhhc1ZhbGlkSXRlbSgpID8gbUN1cnJlbnQuc2h1ZmZsZWRJZHggOiBOT19WQUxJRF9JVEVNUzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzVmFsaWRJdGVtKCkgewotICAgICAgICByZXR1cm4gbUN1cnJlbnQgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIERhdGFTb3VyY2VEZXNjIHJldHJpZXZlRGF0YVNvdXJjZURlc2NMb2NrZWQoTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIERhdGFTb3VyY2VEZXNjIGRzZCA9IGl0ZW0uZ2V0RGF0YVNvdXJjZURlc2MoKTsKLSAgICAgICAgaWYgKGRzZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtSXRlbURzZE1hcC5wdXQoaXRlbSwgZHNkKTsKLSAgICAgICAgICAgIHJldHVybiBkc2Q7Ci0gICAgICAgIH0KLSAgICAgICAgZHNkID0gbUl0ZW1Ec2RNYXAuZ2V0KGl0ZW0pOwotICAgICAgICBpZiAoZHNkICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBkc2Q7Ci0gICAgICAgIH0KLSAgICAgICAgT25EYXRhU291cmNlTWlzc2luZ0hlbHBlciBoZWxwZXIgPSBtRHNtSGVscGVyOwotICAgICAgICBpZiAoaGVscGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IERvIG5vdCBjYWxsIG9uRGF0YVNvdXJjZU1pc3Npbmcgd2l0aCB0aGUgbG9jayAoYi83NDA5MDc0MSkuCi0gICAgICAgICAgICBkc2QgPSBoZWxwZXIub25EYXRhU291cmNlTWlzc2luZyhtU2Vzc2lvbkltcGwuZ2V0SW5zdGFuY2UoKSwgaXRlbSk7Ci0gICAgICAgICAgICBpZiAoZHNkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtSXRlbURzZE1hcC5wdXQoaXRlbSwgZHNkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZHNkOwotICAgIH0KLQotICAgIC8vIFRPRE86IGNvbnNpZGVyIHRvIGNhbGwgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkIGluc2lkZSAoYi83NDA5MDc0MSkKLSAgICBwcml2YXRlIFBsYXlJdGVtIGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKGludCBjdXJTaHVmZmxlZElkeCwgaW50IGRpcmVjdGlvbikgewotICAgICAgICBpbnQgc2l6ZSA9IG1QbGF5bGlzdC5zaXplKCk7Ci0gICAgICAgIGlmIChjdXJTaHVmZmxlZElkeCA9PSBFTkRfT0ZfUExBWUxJU1QpIHsKLSAgICAgICAgICAgIGN1clNodWZmbGVkSWR4ID0gKGRpcmVjdGlvbiA+IDApID8gLTEgOiBzaXplOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBjdXJTaHVmZmxlZElkeCArPSBkaXJlY3Rpb247Ci0gICAgICAgICAgICBpZiAoY3VyU2h1ZmZsZWRJZHggPCAwIHx8IGN1clNodWZmbGVkSWR4ID49IG1QbGF5bGlzdC5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobVJlcGVhdE1vZGUgPT0gUkVQRUFUX01PREVfTk9ORSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGkgPT0gc2l6ZSAtIDEpID8gbnVsbCA6IG1Fb3BQbGF5SXRlbTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjdXJTaHVmZmxlZElkeCA9IGN1clNodWZmbGVkSWR4IDwgMCA/IG1QbGF5bGlzdC5zaXplKCkgLSAxIDogMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBEYXRhU291cmNlRGVzYyBkc2QgPSByZXRyaWV2ZURhdGFTb3VyY2VEZXNjTG9ja2VkKG1TaHVmZmxlZExpc3QuZ2V0KGN1clNodWZmbGVkSWR4KSk7Ci0gICAgICAgICAgICBpZiAoZHNkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBsYXlJdGVtKGN1clNodWZmbGVkSWR4LCBkc2QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKSB7Ci0gICAgICAgIGlmICghaGFzVmFsaWRJdGVtKCkgfHwgbUN1cnJlbnQuaXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHNodWZmbGVkSWR4ID0gbVNodWZmbGVkTGlzdC5pbmRleE9mKG1DdXJyZW50Lm1lZGlhSXRlbSk7Ci0gICAgICAgIGlmIChzaHVmZmxlZElkeCA+PSAwKSB7Ci0gICAgICAgICAgICAvLyBBZGRlZCBhbiBpdGVtLgotICAgICAgICAgICAgbUN1cnJlbnQuc2h1ZmZsZWRJZHggPSBzaHVmZmxlZElkeDsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQ3VycmVudC5zaHVmZmxlZElkeCA+PSBtU2h1ZmZsZWRMaXN0LnNpemUoKSkgewotICAgICAgICAgICAgbUN1cnJlbnQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChtU2h1ZmZsZWRMaXN0LnNpemUoKSAtIDEsIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUN1cnJlbnQubWVkaWFJdGVtID0gbVNodWZmbGVkTGlzdC5nZXQobUN1cnJlbnQuc2h1ZmZsZWRJZHgpOwotICAgICAgICAgICAgaWYgKHJldHJpZXZlRGF0YVNvdXJjZURlc2NMb2NrZWQobUN1cnJlbnQubWVkaWFJdGVtKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChtQ3VycmVudC5zaHVmZmxlZElkeCwgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlUGxheWVyRGF0YVNvdXJjZUxvY2tlZCgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKSB7Ci0gICAgICAgIGlmIChtQ3VycmVudCA9PSBudWxsIHx8IG1DdXJyZW50ID09IG1Fb3BQbGF5SXRlbSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtUGxheWVyLmdldEN1cnJlbnREYXRhU291cmNlKCkgIT0gbUN1cnJlbnQuZHNkKSB7Ci0gICAgICAgICAgICBtUGxheWVyLnNldERhdGFTb3VyY2UobUN1cnJlbnQuZHNkKTsKLSAgICAgICAgICAgIG1QbGF5ZXIubG9vcEN1cnJlbnQobVJlcGVhdE1vZGUgPT0gTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX09ORSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETzogQ2FsbCBzZXROZXh0RGF0YVNvdXJjZSAoYi83NDA5MDc0MSkKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXBwbHlTaHVmZmxlTW9kZUxvY2tlZCgpIHsKLSAgICAgICAgbVNodWZmbGVkTGlzdC5jbGVhcigpOwotICAgICAgICBtU2h1ZmZsZWRMaXN0LmFkZEFsbChtUGxheWxpc3QpOwotICAgICAgICBpZiAobVNodWZmbGVNb2RlID09IE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfQUxMCi0gICAgICAgICAgICAgICAgfHwgbVNodWZmbGVNb2RlID09IE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfR1JPVVApIHsKLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnNodWZmbGUobVNodWZmbGVkTGlzdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBDbGFtcHMgdmFsdWUgdG8gWzAsIHNpemVdCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNsYW1wKGludCB2YWx1ZSwgaW50IHNpemUpIHsKLSAgICAgICAgaWYgKHZhbHVlIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICh2YWx1ZSA+IHNpemUpID8gc2l6ZSA6IHZhbHVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblRva2VuMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblRva2VuMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVjZjhjNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25Ub2tlbjJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVFlQRV9TRVNTSU9OOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVFlQRV9TRVNTSU9OX1NFUlZJQ0U7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMi5UWVBFX0xJQlJBUllfU0VSVklDRTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yLlRva2VuVHlwZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5TZXNzaW9uVG9rZW4yUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFNlc3Npb25Ub2tlbjJJbXBsIGltcGxlbWVudHMgU2Vzc2lvblRva2VuMlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1VJRCA9ICJhbmRyb2lkLm1lZGlhLnRva2VuLnVpZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9UWVBFID0gImFuZHJvaWQubWVkaWEudG9rZW4udHlwZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QQUNLQUdFX05BTUUgPSAiYW5kcm9pZC5tZWRpYS50b2tlbi5wYWNrYWdlX25hbWUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VSVklDRV9OQU1FID0gImFuZHJvaWQubWVkaWEudG9rZW4uc2VydmljZV9uYW1lIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0lEID0gImFuZHJvaWQubWVkaWEudG9rZW4uaWQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VTU0lPTl9CSU5ERVIgPSAiYW5kcm9pZC5tZWRpYS50b2tlbi5zZXNzaW9uX2JpbmRlciI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFNlc3Npb25Ub2tlbjIgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgaW50IG1VaWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBAVG9rZW5UeXBlIGludCBtVHlwZTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUGFja2FnZU5hbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVNlcnZpY2VOYW1lOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1JZDsKLSAgICBwcml2YXRlIGZpbmFsIElNZWRpYVNlc3Npb24yIG1TZXNzaW9uQmluZGVyOwotCi0gICAgLyoqCi0gICAgICogUHVibGljIGNvbnN0cnVjdG9yIGZvciB0aGUgbGVnYWN5IHN1cHBvcnQgKGkuZS4gYnJvd3NlciBjYW4gdHJ5IGNvbm5lY3RpbmcgdG8gYW55IGJyb3dzZXIKLSAgICAgKiBzZXJ2aWNlIGlmIGl0IGtub3dzIHRoZSBzZXJ2aWNlIG5hbWUpCi0gICAgICovCi0gICAgcHVibGljIFNlc3Npb25Ub2tlbjJJbXBsKENvbnRleHQgY29udGV4dCwgU2Vzc2lvblRva2VuMiBpbnN0YW5jZSwKLSAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHNlcnZpY2VOYW1lLCBpbnQgdWlkKSB7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShwYWNrYWdlTmFtZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhY2thZ2VOYW1lIHNob3VsZG4ndCBiZSBlbXB0eSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShzZXJ2aWNlTmFtZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlcnZpY2VOYW1lIHNob3VsZG4ndCBiZSBlbXB0eSIpOwotICAgICAgICB9Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICAvLyBDYWxjdWxhdGUgdWlkIGlmIGl0J3Mgbm90IHNwZWNpZmllZC4KLSAgICAgICAgZmluYWwgUGFja2FnZU1hbmFnZXIgbWFuYWdlciA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKLSAgICAgICAgaWYgKHVpZCA8IDApIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdWlkID0gbWFuYWdlci5nZXRQYWNrYWdlVWlkKHBhY2thZ2VOYW1lLCAwKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgcGFja2FnZSAiICsgcGFja2FnZU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1VaWQgPSB1aWQ7Ci0KLSAgICAgICAgLy8gSW5mZXIgaWQgYW5kIHR5cGUgZnJvbSBwYWNrYWdlIG5hbWUgYW5kIHNlcnZpY2UgbmFtZQotICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBtdWx0aS11c2VyLgotICAgICAgICBTdHJpbmcgaWQgPSBnZXRTZXNzaW9uSWRGcm9tU2VydmljZShtYW5hZ2VyLCBNZWRpYUxpYnJhcnlTZXJ2aWNlMi5TRVJWSUNFX0lOVEVSRkFDRSwKLSAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwgc2VydmljZU5hbWUpOwotICAgICAgICBpZiAoaWQgIT0gbnVsbCkgewotICAgICAgICAgICAgbUlkID0gaWQ7Ci0gICAgICAgICAgICBtVHlwZSA9IFRZUEVfTElCUkFSWV9TRVJWSUNFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gcmV0cnkgd2l0aCBzZXNzaW9uIHNlcnZpY2UKLSAgICAgICAgICAgIG1JZCA9IGdldFNlc3Npb25JZEZyb21TZXJ2aWNlKG1hbmFnZXIsIE1lZGlhU2Vzc2lvblNlcnZpY2UyLlNFUlZJQ0VfSU5URVJGQUNFLAotICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwgc2VydmljZU5hbWUpOwotICAgICAgICAgICAgbVR5cGUgPSBUWVBFX1NFU1NJT05fU0VSVklDRTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlcnZpY2UgIiArIHNlcnZpY2VOYW1lICsgIiBkb2Vzbid0IGltcGxlbWVudCIKLSAgICAgICAgICAgICAgICAgICAgKyAiIHNlc3Npb24gc2VydmljZSBub3IgbGlicmFyeSBzZXJ2aWNlLiBVc2Ugc2VydmljZSdzIGZ1bGwgbmFtZS4iKTsKLSAgICAgICAgfQotICAgICAgICBtUGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKLSAgICAgICAgbVNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7Ci0gICAgICAgIG1TZXNzaW9uQmluZGVyID0gbnVsbDsKLSAgICB9Ci0KLSAgICBTZXNzaW9uVG9rZW4ySW1wbChpbnQgdWlkLCBpbnQgdHlwZSwgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBpZCwKLSAgICAgICAgICAgIElNZWRpYVNlc3Npb24yIHNlc3Npb25CaW5kZXIpIHsKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBBZGQgc2FuaXR5IGNoZWNrIChiLzczODYzODY1KQotICAgICAgICBtVWlkID0gdWlkOwotICAgICAgICBtVHlwZSA9IHR5cGU7Ci0gICAgICAgIG1QYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOwotICAgICAgICBtU2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKLSAgICAgICAgbUlkID0gaWQ7Ci0gICAgICAgIG1TZXNzaW9uQmluZGVyID0gc2Vzc2lvbkJpbmRlcjsKLSAgICAgICAgbUluc3RhbmNlID0gbmV3IFNlc3Npb25Ub2tlbjIodGhpcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFNlc3Npb25JZEZyb21TZXJ2aWNlKFBhY2thZ2VNYW5hZ2VyIG1hbmFnZXIsIFN0cmluZyBzZXJ2aWNlSW50ZXJmYWNlLAotICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgc2VydmljZU5hbWUpIHsKLSAgICAgICAgSW50ZW50IHNlcnZpY2VJbnRlbnQgPSBuZXcgSW50ZW50KHNlcnZpY2VJbnRlcmZhY2UpOwotICAgICAgICBzZXJ2aWNlSW50ZW50LnNldFBhY2thZ2UocGFja2FnZU5hbWUpOwotICAgICAgICAvLyBVc2UgcXVlcnlJbnRlbnRTZXJ2aWNlcyB0byBmaW5kIHNlcnZpY2VzIHdpdGggTWVkaWFMaWJyYXJ5U2VydmljZTIuU0VSVklDRV9JTlRFUkZBQ0UuCi0gICAgICAgIC8vIFdlIGNhbm5vdCB1c2UgcmVzb2x2ZVNlcnZpY2Ugd2l0aCBpbnRlbnQgc3BlY2lmaWVkIGNsYXNzIG5hbWUsIGJlY2F1c2UgcmVzb2x2ZVNlcnZpY2UKLSAgICAgICAgLy8gaWdub3JlcyBhY3Rpb25zIGlmIEludGVudC5zZXRDbGFzc05hbWUoKSBpcyBzcGVjaWZpZWQuCi0gICAgICAgIExpc3Q8UmVzb2x2ZUluZm8+IGxpc3QgPSBtYW5hZ2VyLnF1ZXJ5SW50ZW50U2VydmljZXMoCi0gICAgICAgICAgICAgICAgc2VydmljZUludGVudCwgUGFja2FnZU1hbmFnZXIuR0VUX01FVEFfREFUQSk7Ci0gICAgICAgIGlmIChsaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIFJlc29sdmVJbmZvIHJlc29sdmVJbmZvID0gbGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc29sdmVJbmZvID09IG51bGwgfHwgcmVzb2x2ZUluZm8uc2VydmljZUluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5lcXVhbHMocmVzb2x2ZUluZm8uc2VydmljZUluZm8ubmFtZSwgc2VydmljZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRTZXNzaW9uSWQocmVzb2x2ZUluZm8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXNzaW9uSWQoUmVzb2x2ZUluZm8gcmVzb2x2ZUluZm8pIHsKLSAgICAgICAgaWYgKHJlc29sdmVJbmZvID09IG51bGwgfHwgcmVzb2x2ZUluZm8uc2VydmljZUluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gZWxzZSBpZiAocmVzb2x2ZUluZm8uc2VydmljZUluZm8ubWV0YURhdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVJbmZvLnNlcnZpY2VJbmZvLm1ldGFEYXRhLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFTZXNzaW9uU2VydmljZTIuU0VSVklDRV9NRVRBX0RBVEEsICIiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTZXNzaW9uVG9rZW4yIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1QYWNrYWdlTmFtZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFVpZF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVVpZDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldElkX2ltcCgpIHsKLSAgICAgICAgcmV0dXJuIG1JZDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFR5cGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1UeXBlOwotICAgIH0KLQotICAgIFN0cmluZyBnZXRTZXJ2aWNlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1TZXJ2aWNlTmFtZTsKLSAgICB9Ci0KLSAgICBJTWVkaWFTZXNzaW9uMiBnZXRTZXNzaW9uQmluZGVyKCkgewotICAgICAgICByZXR1cm4gbVNlc3Npb25CaW5kZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTZXNzaW9uVG9rZW4yIGZyb21CdW5kbGVfaW1wbChCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIGlmIChidW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgaW50IHVpZCA9IGJ1bmRsZS5nZXRJbnQoS0VZX1VJRCk7Ci0gICAgICAgIGZpbmFsIEBUb2tlblR5cGUgaW50IHR5cGUgPSBidW5kbGUuZ2V0SW50KEtFWV9UWVBFLCAtMSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwYWNrYWdlTmFtZSA9IGJ1bmRsZS5nZXRTdHJpbmcoS0VZX1BBQ0tBR0VfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBzZXJ2aWNlTmFtZSA9IGJ1bmRsZS5nZXRTdHJpbmcoS0VZX1NFUlZJQ0VfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IGJ1bmRsZS5nZXRTdHJpbmcoS0VZX0lEKTsKLSAgICAgICAgZmluYWwgSUJpbmRlciBzZXNzaW9uQmluZGVyID0gYnVuZGxlLmdldEJpbmRlcihLRVlfU0VTU0lPTl9CSU5ERVIpOwotCi0gICAgICAgIC8vIFNhbml0eSBjaGVjay4KLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFRZUEVfU0VTU0lPTjoKLSAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbkJpbmRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc2Vzc2lvbkJpbmRlciBmb3Igc2Vzc2lvbiwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJpbmRlcj0iICsgc2Vzc2lvbkJpbmRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUWVBFX1NFU1NJT05fU0VSVklDRToKLSAgICAgICAgICAgIGNhc2UgVFlQRV9MSUJSQVJZX1NFUlZJQ0U6Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHNlcnZpY2VOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTZXNzaW9uIHNlcnZpY2UgbmVlZHMgc2VydmljZSBuYW1lIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHR5cGUiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocGFja2FnZU5hbWUpIHx8IGlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBhY2thZ2UgbmFtZSBub3IgSUQgY2Fubm90IGJlIG51bGwuIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uVG9rZW4ySW1wbCh1aWQsIHR5cGUsIHBhY2thZ2VOYW1lLCBzZXJ2aWNlTmFtZSwgaWQsCi0gICAgICAgICAgICAgICAgc2Vzc2lvbkJpbmRlciAhPSBudWxsID8gSU1lZGlhU2Vzc2lvbjIuU3R1Yi5hc0ludGVyZmFjZShzZXNzaW9uQmluZGVyKSA6IG51bGwpCi0gICAgICAgICAgICAgICAgLmdldEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1bmRsZSB0b0J1bmRsZV9pbXBsKCkgewotICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICBidW5kbGUucHV0SW50KEtFWV9VSUQsIG1VaWQpOwotICAgICAgICBidW5kbGUucHV0U3RyaW5nKEtFWV9QQUNLQUdFX05BTUUsIG1QYWNrYWdlTmFtZSk7Ci0gICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoS0VZX1NFUlZJQ0VfTkFNRSwgbVNlcnZpY2VOYW1lKTsKLSAgICAgICAgYnVuZGxlLnB1dFN0cmluZyhLRVlfSUQsIG1JZCk7Ci0gICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX1RZUEUsIG1UeXBlKTsKLSAgICAgICAgYnVuZGxlLnB1dEJpbmRlcihLRVlfU0VTU0lPTl9CSU5ERVIsCi0gICAgICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIgIT0gbnVsbCA/IG1TZXNzaW9uQmluZGVyLmFzQmluZGVyKCkgOiBudWxsKTsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIGludCBwcmltZSA9IDMxOwotICAgICAgICByZXR1cm4gbVR5cGUKLSAgICAgICAgICAgICAgICArIHByaW1lICogKG1VaWQKLSAgICAgICAgICAgICAgICArIHByaW1lICogKG1QYWNrYWdlTmFtZS5oYXNoQ29kZSgpCi0gICAgICAgICAgICAgICAgKyBwcmltZSAqIChtSWQuaGFzaENvZGUoKQotICAgICAgICAgICAgICAgICsgcHJpbWUgKiAobVNlcnZpY2VOYW1lICE9IG51bGwgPyBtU2VydmljZU5hbWUuaGFzaENvZGUoKSA6IDApKSkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFsc19pbXBsKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgU2Vzc2lvblRva2VuMikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBTZXNzaW9uVG9rZW4ySW1wbCBvdGhlciA9IGZyb20oKFNlc3Npb25Ub2tlbjIpIG9iaik7Ci0gICAgICAgIHJldHVybiBtVWlkID09IG90aGVyLm1VaWQKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuZXF1YWxzKG1QYWNrYWdlTmFtZSwgb3RoZXIubVBhY2thZ2VOYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5lcXVhbHMobVNlcnZpY2VOYW1lLCBvdGhlci5tU2VydmljZU5hbWUpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmVxdWFscyhtSWQsIG90aGVyLm1JZCkKLSAgICAgICAgICAgICAgICAmJiBtVHlwZSA9PSBvdGhlci5tVHlwZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiAiU2Vzc2lvblRva2VuIHtwa2c9IiArIG1QYWNrYWdlTmFtZSArICIgaWQ9IiArIG1JZCArICIgdHlwZT0iICsgbVR5cGUKLSAgICAgICAgICAgICAgICArICIgc2VydmljZT0iICsgbVNlcnZpY2VOYW1lICsgIiBiaW5kZXI9IiArIG1TZXNzaW9uQmluZGVyICsgIn0iOwotICAgIH0KLQotICAgIHN0YXRpYyBTZXNzaW9uVG9rZW4ySW1wbCBmcm9tKFNlc3Npb25Ub2tlbjIgdG9rZW4pIHsKLSAgICAgICAgcmV0dXJuICgoU2Vzc2lvblRva2VuMkltcGwpIHRva2VuLmdldFByb3ZpZGVyKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvVm9sdW1lUHJvdmlkZXIySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9Wb2x1bWVQcm92aWRlcjJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMjJlMWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9Wb2x1bWVQcm92aWRlcjJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyMi5WT0xVTUVfQ09OVFJPTF9BQlNPTFVURTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjIuVk9MVU1FX0NPTlRST0xfRklYRUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIyLlZPTFVNRV9DT05UUk9MX1JFTEFUSVZFOwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVm9sdW1lUHJvdmlkZXIyUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBWb2x1bWVQcm92aWRlcjJJbXBsIGltcGxlbWVudHMgVm9sdW1lUHJvdmlkZXIyUHJvdmlkZXIgewotICAgIHByaXZhdGUgZmluYWwgVm9sdW1lUHJvdmlkZXIyIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtQ29udHJvbFR5cGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU1heFZvbHVtZTsKLQotICAgIHByaXZhdGUgaW50IG1DdXJyZW50Vm9sdW1lOwotICAgIHByaXZhdGUgQ2FsbGJhY2sgbUNhbGxiYWNrOwotCi0gICAgcHVibGljIFZvbHVtZVByb3ZpZGVyMkltcGwoVm9sdW1lUHJvdmlkZXIyIGluc3RhbmNlLAotICAgICAgICAgICAgQFZvbHVtZVByb3ZpZGVyMi5Db250cm9sVHlwZSBpbnQgY29udHJvbFR5cGUsIGludCBtYXhWb2x1bWUsIGludCBjdXJyZW50Vm9sdW1lKSB7Ci0gICAgICAgIGlmIChjb250cm9sVHlwZSAhPSBWT0xVTUVfQ09OVFJPTF9GSVhFRCAmJiBjb250cm9sVHlwZSAhPSBWT0xVTUVfQ09OVFJPTF9SRUxBVElWRQotICAgICAgICAgICAgICAgICYmIGNvbnRyb2xUeXBlICE9IFZPTFVNRV9DT05UUk9MX0FCU09MVVRFKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ3cm9uZyBjb250cm9sVHlwZSAiICsgY29udHJvbFR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtYXhWb2x1bWUgPCAwIHx8IGN1cnJlbnRWb2x1bWUgPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ2b2x1bWUgc2hvdWxkbid0IGJlIG5lZ2F0aXZlIgotICAgICAgICAgICAgICAgICAgICArICIsIG1heFZvbHVtZT0iICsgbWF4Vm9sdW1lICsgIiwgY3VycmVudFZvbHVtZT0iICsgY3VycmVudFZvbHVtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGN1cnJlbnRWb2x1bWUgPiBtYXhWb2x1bWUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImN1cnJlbnRWb2x1bWUgc2hvdWxkbid0IGJlIGdyZWF0ZXIgdGhhbiBtYXhWb2x1bWUiCi0gICAgICAgICAgICAgICAgICAgICsgIiwgbWF4Vm9sdW1lPSIgKyBtYXhWb2x1bWUgKyAiLCBjdXJyZW50Vm9sdW1lPSIgKyBjdXJyZW50Vm9sdW1lKTsKLSAgICAgICAgfQotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgbUNvbnRyb2xUeXBlID0gY29udHJvbFR5cGU7Ci0gICAgICAgIG1NYXhWb2x1bWUgPSBtYXhWb2x1bWU7Ci0gICAgICAgIG1DdXJyZW50Vm9sdW1lID0gY3VycmVudFZvbHVtZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldENvbnRyb2xUeXBlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtQ29udHJvbFR5cGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRNYXhWb2x1bWVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1NYXhWb2x1bWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRDdXJyZW50Vm9sdW1lX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtQ3VycmVudFZvbHVtZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50Vm9sdW1lX2ltcGwoaW50IGN1cnJlbnRWb2x1bWUpIHsKLSAgICAgICAgaWYgKGN1cnJlbnRWb2x1bWUgPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjdXJyZW50Vm9sdW1lIHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBjdXJyZW50Vm9sdW1lPSIgKyBjdXJyZW50Vm9sdW1lKTsKLSAgICAgICAgfQotICAgICAgICBtQ3VycmVudFZvbHVtZSA9IGN1cnJlbnRWb2x1bWU7Ci0gICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uVm9sdW1lQ2hhbmdlZChtSW5zdGFuY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGNhbGxiYWNrIHRvIHJlY2VpdmUgdm9sdW1lIGNoYW5nZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2FsbGJhY2soQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGlzdGVucyBmb3IgY2hhbmdlcyB0byB0aGUgdm9sdW1lLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ2FsbGJhY2sgewotICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblZvbHVtZUNoYW5nZWQoVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL0Nsb3NlZENhcHRpb25SZW5kZXJlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9DbG9zZWRDYXB0aW9uUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY3ZWVjOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL0Nsb3NlZENhcHRpb25SZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlR5cGVmYWNlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFGb3JtYXQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcjsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFBhaW50OwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5DaGFyYWN0ZXJTdHlsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuU3R5bGVTcGFuOwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5VbmRlcmxpbmVTcGFuOwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5VcGRhdGVBcHBlYXJhbmNlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkNhcHRpb25pbmdNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkNhcHRpb25pbmdNYW5hZ2VyLkNhcHRpb25TdHlsZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5DYXB0aW9uaW5nTWFuYWdlci5DYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8vIE5vdGU6IFRoaXMgaXMgZm9ya2VkIGZyb20gYW5kcm9pZC5tZWRpYS5DbG9zZWRDYXB0aW9uUmVuZGVyZXIgc2luY2UgUAotcHVibGljIGNsYXNzIENsb3NlZENhcHRpb25SZW5kZXJlciBleHRlbmRzIFN1YnRpdGxlQ29udHJvbGxlci5SZW5kZXJlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgQ2VhNjA4Q0NXaWRnZXQgbUNDV2lkZ2V0OwotCi0gICAgcHVibGljIENsb3NlZENhcHRpb25SZW5kZXJlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKE1lZGlhRm9ybWF0IGZvcm1hdCkgewotICAgICAgICBpZiAoZm9ybWF0LmNvbnRhaW5zS2V5KE1lZGlhRm9ybWF0LktFWV9NSU1FKSkgewotICAgICAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gZm9ybWF0LmdldFN0cmluZyhNZWRpYUZvcm1hdC5LRVlfTUlNRSk7Ci0gICAgICAgICAgICByZXR1cm4gTWVkaWFGb3JtYXQuTUlNRVRZUEVfVEVYVF9DRUFfNjA4LmVxdWFscyhtaW1lVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdWJ0aXRsZVRyYWNrIGNyZWF0ZVRyYWNrKE1lZGlhRm9ybWF0IGZvcm1hdCkgewotICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSBmb3JtYXQuZ2V0U3RyaW5nKE1lZGlhRm9ybWF0LktFWV9NSU1FKTsKLSAgICAgICAgaWYgKE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1RFWFRfQ0VBXzYwOC5lcXVhbHMobWltZVR5cGUpKSB7Ci0gICAgICAgICAgICBpZiAobUNDV2lkZ2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ0NXaWRnZXQgPSBuZXcgQ2VhNjA4Q0NXaWRnZXQobUNvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBDZWE2MDhDYXB0aW9uVHJhY2sobUNDV2lkZ2V0LCBmb3JtYXQpOwotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJObyBtYXRjaGluZyBmb3JtYXQ6ICIgKyBmb3JtYXQudG9TdHJpbmcoKSk7Ci0gICAgfQotfQotCi1jbGFzcyBDZWE2MDhDYXB0aW9uVHJhY2sgZXh0ZW5kcyBTdWJ0aXRsZVRyYWNrIHsKLSAgICBwcml2YXRlIGZpbmFsIENlYTYwOENDUGFyc2VyIG1DQ1BhcnNlcjsKLSAgICBwcml2YXRlIGZpbmFsIENlYTYwOENDV2lkZ2V0IG1SZW5kZXJpbmdXaWRnZXQ7Ci0KLSAgICBDZWE2MDhDYXB0aW9uVHJhY2soQ2VhNjA4Q0NXaWRnZXQgcmVuZGVyaW5nV2lkZ2V0LCBNZWRpYUZvcm1hdCBmb3JtYXQpIHsKLSAgICAgICAgc3VwZXIoZm9ybWF0KTsKLQotICAgICAgICBtUmVuZGVyaW5nV2lkZ2V0ID0gcmVuZGVyaW5nV2lkZ2V0OwotICAgICAgICBtQ0NQYXJzZXIgPSBuZXcgQ2VhNjA4Q0NQYXJzZXIobVJlbmRlcmluZ1dpZGdldCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EYXRhKGJ5dGVbXSBkYXRhLCBib29sZWFuIGVvcywgbG9uZyBydW5JRCkgewotICAgICAgICBtQ0NQYXJzZXIucGFyc2UoZGF0YSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlbmRlcmluZ1dpZGdldCBnZXRSZW5kZXJpbmdXaWRnZXQoKSB7Ci0gICAgICAgIHJldHVybiBtUmVuZGVyaW5nV2lkZ2V0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVZpZXcoVmVjdG9yPEN1ZT4gYWN0aXZlQ3VlcykgewotICAgICAgICAvLyBPdmVycmlkaW5nIHdpdGggTk8tT1AsIENDIHJlbmRlcmluZyBieS1wYXNzZXMgdGhpcwotICAgIH0KLX0KLQotLyoqCi0gKiBBYnN0cmFjdCB3aWRnZXQgY2xhc3MgdG8gcmVuZGVyIGEgY2xvc2VkIGNhcHRpb24gdHJhY2suCi0gKi8KLWFic3RyYWN0IGNsYXNzIENsb3NlZENhcHRpb25XaWRnZXQgZXh0ZW5kcyBWaWV3R3JvdXAgaW1wbGVtZW50cyBTdWJ0aXRsZVRyYWNrLlJlbmRlcmluZ1dpZGdldCB7Ci0KLSAgICBpbnRlcmZhY2UgQ2xvc2VkQ2FwdGlvbkxheW91dCB7Ci0gICAgICAgIHZvaWQgc2V0Q2FwdGlvblN0eWxlKENhcHRpb25TdHlsZSBjYXB0aW9uU3R5bGUpOwotICAgICAgICB2b2lkIHNldEZvbnRTY2FsZShmbG9hdCBzY2FsZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2FwdGlvblN0eWxlIERFRkFVTFRfQ0FQVElPTl9TVFlMRSA9IENhcHRpb25TdHlsZS5ERUZBVUxUOwotCi0gICAgLyoqIENhcHRpb25pbmcgbWFuYWdlciwgdXNlZCB0byBvYnRhaW4gYW5kIHRyYWNrIGNhcHRpb24gcHJvcGVydGllcy4gKi8KLSAgICBwcml2YXRlIGZpbmFsIENhcHRpb25pbmdNYW5hZ2VyIG1NYW5hZ2VyOwotCi0gICAgLyoqIEN1cnJlbnQgY2FwdGlvbiBzdHlsZS4gKi8KLSAgICBwcm90ZWN0ZWQgQ2FwdGlvblN0eWxlIG1DYXB0aW9uU3R5bGU7Ci0KLSAgICAvKiogQ2FsbGJhY2sgZm9yIHJlbmRlcmluZyBjaGFuZ2VzLiAqLwotICAgIHByb3RlY3RlZCBPbkNoYW5nZWRMaXN0ZW5lciBtTGlzdGVuZXI7Ci0KLSAgICAvKiogQ29uY3JldGUgbGF5b3V0IG9mIENDLiAqLwotICAgIHByb3RlY3RlZCBDbG9zZWRDYXB0aW9uTGF5b3V0IG1DbG9zZWRDYXB0aW9uTGF5b3V0OwotCi0gICAgLyoqIFdoZXRoZXIgYSBjYXB0aW9uIHN0eWxlIGNoYW5nZSBsaXN0ZW5lciBpcyByZWdpc3RlcmVkLiAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtSGFzQ2hhbmdlTGlzdGVuZXI7Ci0KLSAgICBwdWJsaWMgQ2xvc2VkQ2FwdGlvbldpZGdldChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xvc2VkQ2FwdGlvbldpZGdldChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xvc2VkQ2FwdGlvbldpZGdldChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xvc2VkQ2FwdGlvbldpZGdldChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwKLSAgICAgICAgICAgIGludCBkZWZTdHlsZVJlcykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCBkZWZTdHlsZVJlcyk7Ci0KLSAgICAgICAgLy8gQ2Fubm90IHJlbmRlciB0ZXh0IG92ZXIgdmlkZW8gd2hlbiBsYXllciB0eXBlIGlzIGhhcmR3YXJlLgotICAgICAgICBzZXRMYXllclR5cGUoVmlldy5MQVlFUl9UWVBFX1NPRlRXQVJFLCBudWxsKTsKLQotICAgICAgICBtTWFuYWdlciA9IChDYXB0aW9uaW5nTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ0FQVElPTklOR19TRVJWSUNFKTsKLSAgICAgICAgbUNhcHRpb25TdHlsZSA9IERFRkFVTFRfQ0FQVElPTl9TVFlMRS5hcHBseVN0eWxlKG1NYW5hZ2VyLmdldFVzZXJTdHlsZSgpKTsKLQotICAgICAgICBtQ2xvc2VkQ2FwdGlvbkxheW91dCA9IGNyZWF0ZUNhcHRpb25MYXlvdXQoY29udGV4dCk7Ci0gICAgICAgIG1DbG9zZWRDYXB0aW9uTGF5b3V0LnNldENhcHRpb25TdHlsZShtQ2FwdGlvblN0eWxlKTsKLSAgICAgICAgbUNsb3NlZENhcHRpb25MYXlvdXQuc2V0Rm9udFNjYWxlKG1NYW5hZ2VyLmdldEZvbnRTY2FsZSgpKTsKLSAgICAgICAgYWRkVmlldygoVmlld0dyb3VwKSBtQ2xvc2VkQ2FwdGlvbkxheW91dCwgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKLSAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKLQotICAgICAgICByZXF1ZXN0TGF5b3V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IENsb3NlZENhcHRpb25MYXlvdXQgY3JlYXRlQ2FwdGlvbkxheW91dChDb250ZXh0IGNvbnRleHQpOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0T25DaGFuZ2VkTGlzdGVuZXIoT25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgZmluYWwgaW50IHdpZHRoU3BlYyA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyh3aWR0aCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSk7Ci0gICAgICAgIGZpbmFsIGludCBoZWlnaHRTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGhlaWdodCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSk7Ci0KLSAgICAgICAgbWVhc3VyZSh3aWR0aFNwZWMsIGhlaWdodFNwZWMpOwotICAgICAgICBsYXlvdXQoMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLSAgICAgICAgaWYgKHZpc2libGUpIHsKLSAgICAgICAgICAgIHNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1hbmFnZUNoYW5nZUxpc3RlbmVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgewotICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKLQotICAgICAgICBtYW5hZ2VDaGFuZ2VMaXN0ZW5lcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgewotICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvdygpOwotCi0gICAgICAgIG1hbmFnZUNoYW5nZUxpc3RlbmVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgc3VwZXIub25NZWFzdXJlKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKLSAgICAgICAgKChWaWV3R3JvdXApIG1DbG9zZWRDYXB0aW9uTGF5b3V0KS5tZWFzdXJlKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkxheW91dChib29sZWFuIGNoYW5nZWQsIGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7Ci0gICAgICAgICgoVmlld0dyb3VwKSBtQ2xvc2VkQ2FwdGlvbkxheW91dCkubGF5b3V0KGwsIHQsIHIsIGIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hbmFnZXMgd2hldGhlciB0aGlzIHJlbmRlcmVyIGlzIGxpc3RlbmluZyBmb3IgY2FwdGlvbiBzdHlsZSBjaGFuZ2VzLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyIG1DYXB0aW9uaW5nTGlzdGVuZXIgPSBuZXcgQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Vc2VyU3R5bGVDaGFuZ2VkKENhcHRpb25TdHlsZSB1c2VyU3R5bGUpIHsKLSAgICAgICAgICAgIG1DYXB0aW9uU3R5bGUgPSBERUZBVUxUX0NBUFRJT05fU1RZTEUuYXBwbHlTdHlsZSh1c2VyU3R5bGUpOwotICAgICAgICAgICAgbUNsb3NlZENhcHRpb25MYXlvdXQuc2V0Q2FwdGlvblN0eWxlKG1DYXB0aW9uU3R5bGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRm9udFNjYWxlQ2hhbmdlZChmbG9hdCBmb250U2NhbGUpIHsKLSAgICAgICAgICAgIG1DbG9zZWRDYXB0aW9uTGF5b3V0LnNldEZvbnRTY2FsZShmb250U2NhbGUpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgdm9pZCBtYW5hZ2VDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBuZWVkc0xpc3RlbmVyID0gaXNBdHRhY2hlZFRvV2luZG93KCkgJiYgZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRTsKLSAgICAgICAgaWYgKG1IYXNDaGFuZ2VMaXN0ZW5lciAhPSBuZWVkc0xpc3RlbmVyKSB7Ci0gICAgICAgICAgICBtSGFzQ2hhbmdlTGlzdGVuZXIgPSBuZWVkc0xpc3RlbmVyOwotCi0gICAgICAgICAgICBpZiAobmVlZHNMaXN0ZW5lcikgewotICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmFkZENhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcihtQ2FwdGlvbmluZ0xpc3RlbmVyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbU1hbmFnZXIucmVtb3ZlQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKG1DYXB0aW9uaW5nTGlzdGVuZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi0vKioKLSAqIENDUGFyc2VyIHByb2Nlc3NlcyBDRUEtNjA4IGNsb3NlZCBjYXB0aW9uIGRhdGEuCi0gKgotICogSXQgY2FsbHMgYmFjayBpbnRvIE9uRGlzcGxheUNoYW5nZWRMaXN0ZW5lciB1cG9uCi0gKiBkaXNwbGF5IGNoYW5nZSB3aXRoIHN0eWxlZCB0ZXh0IGZvciByZW5kZXJpbmcuCi0gKgotICovCi1jbGFzcyBDZWE2MDhDQ1BhcnNlciB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1JPV1MgPSAxNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfQ09MUyA9IDMyOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDZWE2MDhDQ1BhcnNlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlZBTElEID0gLTE7Ci0KLSAgICAvLyBFSUEtQ0VBLTYwODogVGFibGUgNzAgLSBDb250cm9sIENvZGVzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJDTCA9IDB4MjA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJTICA9IDB4MjE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFPRiA9IDB4MjI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFPTiA9IDB4MjM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFUiA9IDB4MjQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVMiA9IDB4MjU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVMyA9IDB4MjY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVNCA9IDB4Mjc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZPTiA9IDB4Mjg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJEQyA9IDB4Mjk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRSICA9IDB4MmE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJURCA9IDB4MmI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVETSA9IDB4MmM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENSICA9IDB4MmQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOTSA9IDB4MmU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVPQyA9IDB4MmY7Ci0KLSAgICAvLyBUcmFuc3BhcmVudCBTcGFjZQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgVFMgPSAnXHUwMEEwJzsKLQotICAgIC8vIENhcHRpb25pbmcgTW9kZXMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9VTktOT1dOID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9QQUlOVF9PTiA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVfUk9MTF9VUCA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVfUE9QX09OID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9URVhUID0gNDsKLQotICAgIHByaXZhdGUgZmluYWwgRGlzcGxheUxpc3RlbmVyIG1MaXN0ZW5lcjsKLQotICAgIHByaXZhdGUgaW50IG1Nb2RlID0gTU9ERV9QQUlOVF9PTjsKLSAgICBwcml2YXRlIGludCBtUm9sbFVwU2l6ZSA9IDQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVByZXZDdHJsQ29kZSA9IElOVkFMSUQ7Ci0KLSAgICBwcml2YXRlIENDTWVtb3J5IG1EaXNwbGF5ID0gbmV3IENDTWVtb3J5KCk7Ci0gICAgcHJpdmF0ZSBDQ01lbW9yeSBtTm9uRGlzcGxheSA9IG5ldyBDQ01lbW9yeSgpOwotICAgIHByaXZhdGUgQ0NNZW1vcnkgbVRleHRNZW0gPSBuZXcgQ0NNZW1vcnkoKTsKLQotICAgIENlYTYwOENDUGFyc2VyKERpc3BsYXlMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwYXJzZShieXRlW10gZGF0YSkgewotICAgICAgICBDQ0RhdGFbXSBjY0RhdGEgPSBDQ0RhdGEuZnJvbUJ5dGVBcnJheShkYXRhKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNjRGF0YS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjY0RhdGFbaV0udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChoYW5kbGVDdHJsQ29kZShjY0RhdGFbaV0pCi0gICAgICAgICAgICAgICAgICAgIHx8IGhhbmRsZVRhYk9mZnNldHMoY2NEYXRhW2ldKQotICAgICAgICAgICAgICAgICAgICB8fCBoYW5kbGVQQUNDb2RlKGNjRGF0YVtpXSkKLSAgICAgICAgICAgICAgICAgICAgfHwgaGFuZGxlTWlkUm93Q29kZShjY0RhdGFbaV0pKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGhhbmRsZURpc3BsYXlhYmxlQ2hhcnMoY2NEYXRhW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGludGVyZmFjZSBEaXNwbGF5TGlzdGVuZXIgewotICAgICAgICB2b2lkIG9uRGlzcGxheUNoYW5nZWQoU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcltdIHN0eWxlZFRleHRzKTsKLSAgICAgICAgQ2FwdGlvblN0eWxlIGdldENhcHRpb25TdHlsZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ0NNZW1vcnkgZ2V0TWVtb3J5KCkgewotICAgICAgICAvLyBnZXQgdGhlIENDIG1lbW9yeSB0byBvcGVyYXRlIG9uIGZvciBjdXJyZW50IG1vZGUKLSAgICAgICAgc3dpdGNoIChtTW9kZSkgewotICAgICAgICBjYXNlIE1PREVfUE9QX09OOgotICAgICAgICAgICAgcmV0dXJuIG1Ob25EaXNwbGF5OwotICAgICAgICBjYXNlIE1PREVfVEVYVDoKLSAgICAgICAgICAgIC8vIFRPRE8oY2h6KTogc3VwcG9ydCBvbmx5IGNhcHRpb24gbW9kZSBmb3Igbm93LAotICAgICAgICAgICAgLy8gaW4gdGV4dCBtb2RlLCBkdW1wIGV2ZXJ5dGhpbmcgdG8gdGV4dCBtZW0uCi0gICAgICAgICAgICByZXR1cm4gbVRleHRNZW07Ci0gICAgICAgIGNhc2UgTU9ERV9QQUlOVF9PTjoKLSAgICAgICAgY2FzZSBNT0RFX1JPTExfVVA6Ci0gICAgICAgICAgICByZXR1cm4gbURpc3BsYXk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJ1bnJlY29naW5pemVkIG1vZGU6ICIgKyBtTW9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1EaXNwbGF5OwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVEaXNwbGF5YWJsZUNoYXJzKENDRGF0YSBjY0RhdGEpIHsKLSAgICAgICAgaWYgKCFjY0RhdGEuaXNEaXNwbGF5YWJsZUNoYXIoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRXh0ZW5kZWQgY2hhciBpbmNsdWRlcyAxIGF1dG9tYXRpYyBiYWNrc3BhY2UKLSAgICAgICAgaWYgKGNjRGF0YS5pc0V4dGVuZGVkQ2hhcigpKSB7Ci0gICAgICAgICAgICBnZXRNZW1vcnkoKS5icygpOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2V0TWVtb3J5KCkud3JpdGVUZXh0KGNjRGF0YS5nZXREaXNwbGF5VGV4dCgpKTsKLQotICAgICAgICBpZiAobU1vZGUgPT0gTU9ERV9QQUlOVF9PTiB8fCBtTW9kZSA9PSBNT0RFX1JPTExfVVApIHsKLSAgICAgICAgICAgIHVwZGF0ZURpc3BsYXkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVNaWRSb3dDb2RlKENDRGF0YSBjY0RhdGEpIHsKLSAgICAgICAgU3R5bGVDb2RlIG0gPSBjY0RhdGEuZ2V0TWlkUm93KCk7Ci0gICAgICAgIGlmIChtICE9IG51bGwpIHsKLSAgICAgICAgICAgIGdldE1lbW9yeSgpLndyaXRlTWlkUm93Q29kZShtKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlUEFDQ29kZShDQ0RhdGEgY2NEYXRhKSB7Ci0gICAgICAgIFBBQyBwYWMgPSBjY0RhdGEuZ2V0UEFDKCk7Ci0KLSAgICAgICAgaWYgKHBhYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobU1vZGUgPT0gTU9ERV9ST0xMX1VQKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TWVtb3J5KCkubW92ZUJhc2VsaW5lVG8ocGFjLmdldFJvdygpLCBtUm9sbFVwU2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnZXRNZW1vcnkoKS53cml0ZVBBQyhwYWMpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhbmRsZVRhYk9mZnNldHMoQ0NEYXRhIGNjRGF0YSkgewotICAgICAgICBpbnQgdGFicyA9IGNjRGF0YS5nZXRUYWJPZmZzZXQoKTsKLQotICAgICAgICBpZiAodGFicyA+IDApIHsKLSAgICAgICAgICAgIGdldE1lbW9yeSgpLnRhYih0YWJzKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVDdHJsQ29kZShDQ0RhdGEgY2NEYXRhKSB7Ci0gICAgICAgIGludCBjdHJsQ29kZSA9IGNjRGF0YS5nZXRDdHJsQ29kZSgpOwotCi0gICAgICAgIGlmIChtUHJldkN0cmxDb2RlICE9IElOVkFMSUQgJiYgbVByZXZDdHJsQ29kZSA9PSBjdHJsQ29kZSkgewotICAgICAgICAgICAgLy8gZGlzY2FyZCBkb3VibGUgY3RybCBjb2RlcyAoYnV0IGlmIHRoZXJlJ3MgYSAzcmQgb25lLCB3ZSBzdGlsbCB0YWtlIHRoYXQpCi0gICAgICAgICAgICBtUHJldkN0cmxDb2RlID0gSU5WQUxJRDsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoKGN0cmxDb2RlKSB7Ci0gICAgICAgIGNhc2UgUkNMOgotICAgICAgICAgICAgLy8gc2VsZWN0IHBvcC1vbiBzdHlsZQotICAgICAgICAgICAgbU1vZGUgPSBNT0RFX1BPUF9PTjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJTOgotICAgICAgICAgICAgZ2V0TWVtb3J5KCkuYnMoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERFUjoKLSAgICAgICAgICAgIGdldE1lbW9yeSgpLmRlcigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlUyOgotICAgICAgICBjYXNlIFJVMzoKLSAgICAgICAgY2FzZSBSVTQ6Ci0gICAgICAgICAgICBtUm9sbFVwU2l6ZSA9IChjdHJsQ29kZSAtIDB4MjMpOwotICAgICAgICAgICAgLy8gZXJhc2UgbWVtb3J5IGlmIGN1cnJlbnRseSBpbiBvdGhlciBzdHlsZQotICAgICAgICAgICAgaWYgKG1Nb2RlICE9IE1PREVfUk9MTF9VUCkgewotICAgICAgICAgICAgICAgIG1EaXNwbGF5LmVyYXNlKCk7Ci0gICAgICAgICAgICAgICAgbU5vbkRpc3BsYXkuZXJhc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHNlbGVjdCByb2xsLXVwIHN0eWxlCi0gICAgICAgICAgICBtTW9kZSA9IE1PREVfUk9MTF9VUDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZPTjoKLSAgICAgICAgICAgIExvZy5pKFRBRywgIkZsYXNoIE9uIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSREM6Ci0gICAgICAgICAgICAvLyBzZWxlY3QgcGFpbnQtb24gc3R5bGUKLSAgICAgICAgICAgIG1Nb2RlID0gTU9ERV9QQUlOVF9PTjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRSOgotICAgICAgICAgICAgbU1vZGUgPSBNT0RFX1RFWFQ7Ci0gICAgICAgICAgICBtVGV4dE1lbS5lcmFzZSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlREOgotICAgICAgICAgICAgbU1vZGUgPSBNT0RFX1RFWFQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFRE06Ci0gICAgICAgICAgICAvLyBlcmFzZSBkaXNwbGF5IG1lbW9yeQotICAgICAgICAgICAgbURpc3BsYXkuZXJhc2UoKTsKLSAgICAgICAgICAgIHVwZGF0ZURpc3BsYXkoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENSOgotICAgICAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfUk9MTF9VUCkgewotICAgICAgICAgICAgICAgIGdldE1lbW9yeSgpLnJvbGxVcChtUm9sbFVwU2l6ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGdldE1lbW9yeSgpLmNyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobU1vZGUgPT0gTU9ERV9ST0xMX1VQKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlRGlzcGxheSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRU5NOgotICAgICAgICAgICAgLy8gZXJhc2Ugbm9uLWRpc3BsYXkgbWVtb3J5Ci0gICAgICAgICAgICBtTm9uRGlzcGxheS5lcmFzZSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRU9DOgotICAgICAgICAgICAgLy8gc3dhcCBkaXNwbGF5L25vbi1kaXNwbGF5IG1lbW9yeQotICAgICAgICAgICAgc3dhcE1lbW9yeSgpOwotICAgICAgICAgICAgLy8gc3dpdGNoIHRvIHBvcC1vbiBzdHlsZQotICAgICAgICAgICAgbU1vZGUgPSBNT0RFX1BPUF9PTjsKLSAgICAgICAgICAgIHVwZGF0ZURpc3BsYXkoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIElOVkFMSUQ6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBtUHJldkN0cmxDb2RlID0gSU5WQUxJRDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIG1QcmV2Q3RybENvZGUgPSBjdHJsQ29kZTsKLQotICAgICAgICAvLyBoYW5kbGVkCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVEaXNwbGF5KCkgewotICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIENhcHRpb25TdHlsZSBjYXB0aW9uU3R5bGUgPSBtTGlzdGVuZXIuZ2V0Q2FwdGlvblN0eWxlKCk7Ci0gICAgICAgICAgICBtTGlzdGVuZXIub25EaXNwbGF5Q2hhbmdlZChtRGlzcGxheS5nZXRTdHlsZWRUZXh0KGNhcHRpb25TdHlsZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHN3YXBNZW1vcnkoKSB7Ci0gICAgICAgIENDTWVtb3J5IHRlbXAgPSBtRGlzcGxheTsKLSAgICAgICAgbURpc3BsYXkgPSBtTm9uRGlzcGxheTsKLSAgICAgICAgbU5vbkRpc3BsYXkgPSB0ZW1wOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0eWxlQ29kZSB7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfV0hJVEUgPSAwOwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX0dSRUVOID0gMTsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9CTFVFID0gMjsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9DWUFOID0gMzsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9SRUQgPSA0OwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX1lFTExPVyA9IDU7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfTUFHRU5UQSA9IDY7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfSU5WQUxJRCA9IDc7Ci0KLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBTVFlMRV9JVEFMSUNTICAgPSAweDAwMDAwMDAxOwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IFNUWUxFX1VOREVSTElORSA9IDB4MDAwMDAwMDI7Ci0KLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIG1Db2xvck1hcCA9IHsKLSAgICAgICAgICAgICJXSElURSIsICJHUkVFTiIsICJCTFVFIiwgIkNZQU4iLCAiUkVEIiwgIllFTExPVyIsICJNQUdFTlRBIiwgIklOVkFMSUQiCi0gICAgICAgIH07Ci0KLSAgICAgICAgZmluYWwgaW50IG1TdHlsZTsKLSAgICAgICAgZmluYWwgaW50IG1Db2xvcjsKLQotICAgICAgICBzdGF0aWMgU3R5bGVDb2RlIGZyb21CeXRlKGJ5dGUgZGF0YTIpIHsKLSAgICAgICAgICAgIGludCBzdHlsZSA9IDA7Ci0gICAgICAgICAgICBpbnQgY29sb3IgPSAoZGF0YTIgPj4gMSkgJiAweDc7Ci0KLSAgICAgICAgICAgIGlmICgoZGF0YTIgJiAweDEpICE9IDApIHsKLSAgICAgICAgICAgICAgICBzdHlsZSB8PSBTVFlMRV9VTkRFUkxJTkU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjb2xvciA9PSBDT0xPUl9JTlZBTElEKSB7Ci0gICAgICAgICAgICAgICAgLy8gV0hJVEUgSVRBTElDUwotICAgICAgICAgICAgICAgIGNvbG9yID0gQ09MT1JfV0hJVEU7Ci0gICAgICAgICAgICAgICAgc3R5bGUgfD0gU1RZTEVfSVRBTElDUzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHlsZUNvZGUoc3R5bGUsIGNvbG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0eWxlQ29kZShpbnQgc3R5bGUsIGludCBjb2xvcikgewotICAgICAgICAgICAgbVN0eWxlID0gc3R5bGU7Ci0gICAgICAgICAgICBtQ29sb3IgPSBjb2xvcjsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNJdGFsaWNzKCkgewotICAgICAgICAgICAgcmV0dXJuIChtU3R5bGUgJiBTVFlMRV9JVEFMSUNTKSAhPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc1VuZGVybGluZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAobVN0eWxlICYgU1RZTEVfVU5ERVJMSU5FKSAhPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdldENvbG9yKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db2xvcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzdHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgc3RyLmFwcGVuZCgieyIpOwotICAgICAgICAgICAgc3RyLmFwcGVuZChtQ29sb3JNYXBbbUNvbG9yXSk7Ci0gICAgICAgICAgICBpZiAoKG1TdHlsZSAmIFNUWUxFX0lUQUxJQ1MpICE9IDApIHsKLSAgICAgICAgICAgICAgICBzdHIuYXBwZW5kKCIsIElUQUxJQ1MiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgobVN0eWxlICYgU1RZTEVfVU5ERVJMSU5FKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgc3RyLmFwcGVuZCgiLCBVTkRFUkxJTkUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0ci5hcHBlbmQoIn0iKTsKLQotICAgICAgICAgICAgcmV0dXJuIHN0ci50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUEFDIGV4dGVuZHMgU3R5bGVDb2RlIHsKLSAgICAgICAgZmluYWwgaW50IG1Sb3c7Ci0gICAgICAgIGZpbmFsIGludCBtQ29sOwotCi0gICAgICAgIHN0YXRpYyBQQUMgZnJvbUJ5dGVzKGJ5dGUgZGF0YTEsIGJ5dGUgZGF0YTIpIHsKLSAgICAgICAgICAgIGludFtdIHJvd1RhYmxlID0gezExLCAxLCAzLCAxMiwgMTQsIDUsIDcsIDl9OwotICAgICAgICAgICAgaW50IHJvdyA9IHJvd1RhYmxlW2RhdGExICYgMHgwN10gKyAoKGRhdGEyICYgMHgyMCkgPj4gNSk7Ci0gICAgICAgICAgICBpbnQgc3R5bGUgPSAwOwotICAgICAgICAgICAgaWYgKChkYXRhMiAmIDEpICE9IDApIHsKLSAgICAgICAgICAgICAgICBzdHlsZSB8PSBTVFlMRV9VTkRFUkxJTkU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGRhdGEyICYgMHgxMCkgIT0gMCkgewotICAgICAgICAgICAgICAgIC8vIGluZGVudCBjb2RlCi0gICAgICAgICAgICAgICAgaW50IGluZGVudCA9IChkYXRhMiA+PiAxKSAmIDB4NzsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBBQyhyb3csIGluZGVudCAqIDQsIHN0eWxlLCBDT0xPUl9XSElURSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHN0eWxlIGNvZGUKLSAgICAgICAgICAgICAgICBpbnQgY29sb3IgPSAoZGF0YTIgPj4gMSkgJiAweDc7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY29sb3IgPT0gQ09MT1JfSU5WQUxJRCkgewotICAgICAgICAgICAgICAgICAgICAvLyBXSElURSBJVEFMSUNTCi0gICAgICAgICAgICAgICAgICAgIGNvbG9yID0gQ09MT1JfV0hJVEU7Ci0gICAgICAgICAgICAgICAgICAgIHN0eWxlIHw9IFNUWUxFX0lUQUxJQ1M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUEFDKHJvdywgLTEsIHN0eWxlLCBjb2xvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBQQUMoaW50IHJvdywgaW50IGNvbCwgaW50IHN0eWxlLCBpbnQgY29sb3IpIHsKLSAgICAgICAgICAgIHN1cGVyKHN0eWxlLCBjb2xvcik7Ci0gICAgICAgICAgICBtUm93ID0gcm93OwotICAgICAgICAgICAgbUNvbCA9IGNvbDsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNJbmRlbnRQQUMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1Db2wgPj0gMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZ2V0Um93KCkgewotICAgICAgICAgICAgcmV0dXJuIG1Sb3c7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZ2V0Q29sKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db2w7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJ7JWQsICVkfSwgJXMiLAotICAgICAgICAgICAgICAgICAgICBtUm93LCBtQ29sLCBzdXBlci50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE11dGFibGUgdmVyc2lvbiBvZiBCYWNrZ3JvdW5kU3BhbiB0byBmYWNpbGl0YXRlIHRleHQgcmVuZGVyaW5nIHdpdGggZWRnZSBzdHlsZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBNdXRhYmxlQmFja2dyb3VuZENvbG9yU3BhbiBleHRlbmRzIENoYXJhY3RlclN0eWxlCi0gICAgICAgICAgICBpbXBsZW1lbnRzIFVwZGF0ZUFwcGVhcmFuY2UgewotICAgICAgICBwcml2YXRlIGludCBtQ29sb3I7Ci0KLSAgICAgICAgcHVibGljIE11dGFibGVCYWNrZ3JvdW5kQ29sb3JTcGFuKGludCBjb2xvcikgewotICAgICAgICAgICAgbUNvbG9yID0gY29sb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoaW50IGNvbG9yKSB7Ci0gICAgICAgICAgICBtQ29sb3IgPSBjb2xvcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0QmFja2dyb3VuZENvbG9yKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db2xvcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVEcmF3U3RhdGUoVGV4dFBhaW50IGRzKSB7Ci0gICAgICAgICAgICBkcy5iZ0NvbG9yID0gbUNvbG9yOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ0NMaW5lQnVpbGRlciBrZWVwcyB0cmFjayBvZiBkaXNwbGF5YWJsZSBjaGFycywgYXMgd2VsbCBhcwotICAgICAqIE1pZFJvdyBzdHlsZXMgYW5kIFBBQ3MsIGZvciBhIHNpbmdsZSBsaW5lIG9mIENDIG1lbW9yeS4KLSAgICAgKgotICAgICAqIEl0IGdlbmVyYXRlcyBzdHlsZWQgdGV4dCB2aWEgZ2V0U3R5bGVkVGV4dCgpIG1ldGhvZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDQ0xpbmVCdWlsZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdCdWlsZGVyIG1EaXNwbGF5Q2hhcnM7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3R5bGVDb2RlW10gbU1pZFJvd1N0eWxlczsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHlsZUNvZGVbXSBtUEFDU3R5bGVzOwotCi0gICAgICAgIENDTGluZUJ1aWxkZXIoU3RyaW5nIHN0cikgewotICAgICAgICAgICAgbURpc3BsYXlDaGFycyA9IG5ldyBTdHJpbmdCdWlsZGVyKHN0cik7Ci0gICAgICAgICAgICBtTWlkUm93U3R5bGVzID0gbmV3IFN0eWxlQ29kZVttRGlzcGxheUNoYXJzLmxlbmd0aCgpXTsKLSAgICAgICAgICAgIG1QQUNTdHlsZXMgPSBuZXcgU3R5bGVDb2RlW21EaXNwbGF5Q2hhcnMubGVuZ3RoKCldOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRDaGFyQXQoaW50IGluZGV4LCBjaGFyIGNoKSB7Ci0gICAgICAgICAgICBtRGlzcGxheUNoYXJzLnNldENoYXJBdChpbmRleCwgY2gpOwotICAgICAgICAgICAgbU1pZFJvd1N0eWxlc1tpbmRleF0gPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRNaWRSb3dBdChpbnQgaW5kZXgsIFN0eWxlQ29kZSBtKSB7Ci0gICAgICAgICAgICBtRGlzcGxheUNoYXJzLnNldENoYXJBdChpbmRleCwgJyAnKTsKLSAgICAgICAgICAgIG1NaWRSb3dTdHlsZXNbaW5kZXhdID0gbTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2V0UEFDQXQoaW50IGluZGV4LCBQQUMgcGFjKSB7Ci0gICAgICAgICAgICBtUEFDU3R5bGVzW2luZGV4XSA9IHBhYzsKLSAgICAgICAgfQotCi0gICAgICAgIGNoYXIgY2hhckF0KGludCBpbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5Q2hhcnMuY2hhckF0KGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBsZW5ndGgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURpc3BsYXlDaGFycy5sZW5ndGgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYXBwbHlTdHlsZVNwYW4oCi0gICAgICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBzdHlsZWRUZXh0LAotICAgICAgICAgICAgICAgIFN0eWxlQ29kZSBzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgICAgIGlmIChzLmlzSXRhbGljcygpKSB7Ci0gICAgICAgICAgICAgICAgc3R5bGVkVGV4dC5zZXRTcGFuKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0eWxlU3BhbihhbmRyb2lkLmdyYXBoaWNzLlR5cGVmYWNlLklUQUxJQyksCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kLCBTcGFubmFibGUuU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzLmlzVW5kZXJsaW5lKCkpIHsKLSAgICAgICAgICAgICAgICBzdHlsZWRUZXh0LnNldFNwYW4oCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVW5kZXJsaW5lU3BhbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCwgU3Bhbm5hYmxlLlNQQU5fRVhDTFVTSVZFX0VYQ0xVU0lWRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIGdldFN0eWxlZFRleHQoQ2FwdGlvblN0eWxlIGNhcHRpb25TdHlsZSkgewotICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBzdHlsZWRUZXh0ID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIobURpc3BsYXlDaGFycyk7Ci0gICAgICAgICAgICBpbnQgc3RhcnQgPSAtMSwgbmV4dCA9IDA7Ci0gICAgICAgICAgICBpbnQgc3R5bGVTdGFydCA9IC0xOwotICAgICAgICAgICAgU3R5bGVDb2RlIGN1clN0eWxlID0gbnVsbDsKLSAgICAgICAgICAgIHdoaWxlIChuZXh0IDwgbURpc3BsYXlDaGFycy5sZW5ndGgoKSkgewotICAgICAgICAgICAgICAgIFN0eWxlQ29kZSBuZXdTdHlsZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKG1NaWRSb3dTdHlsZXNbbmV4dF0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSBtaWQtcm93IHN0eWxlIGNoYW5nZQotICAgICAgICAgICAgICAgICAgICBuZXdTdHlsZSA9IG1NaWRSb3dTdHlsZXNbbmV4dF07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUEFDU3R5bGVzW25leHRdICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgKHN0eWxlU3RhcnQgPCAwIHx8IHN0YXJ0IDwgMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gYXBwbHkgUEFDIHN0eWxlIGNoYW5nZSwgb25seSBpZjoKLSAgICAgICAgICAgICAgICAgICAgLy8gMS4gbm8gc3R5bGUgc2V0LCBvcgotICAgICAgICAgICAgICAgICAgICAvLyAyLiBzdHlsZSBzZXQsIGJ1dCBwcmV2IGNoYXIgaXMgbm9uZS1kaXNwbGF5YWJsZQotICAgICAgICAgICAgICAgICAgICBuZXdTdHlsZSA9IG1QQUNTdHlsZXNbbmV4dF07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChuZXdTdHlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1clN0eWxlID0gbmV3U3R5bGU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVN0YXJ0ID49IDAgJiYgc3RhcnQgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlTdHlsZVNwYW4oc3R5bGVkVGV4dCwgbmV3U3R5bGUsIHN0eWxlU3RhcnQsIG5leHQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHN0eWxlU3RhcnQgPSBuZXh0OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChtRGlzcGxheUNoYXJzLmNoYXJBdChuZXh0KSAhPSBUUykgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IG5leHQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGV4cGFuZGVkU3RhcnQgPSBtRGlzcGxheUNoYXJzLmNoYXJBdChzdGFydCkgPT0gJyAnID8gc3RhcnQgOiBzdGFydCAtIDE7Ci0gICAgICAgICAgICAgICAgICAgIGludCBleHBhbmRlZEVuZCA9IG1EaXNwbGF5Q2hhcnMuY2hhckF0KG5leHQgLSAxKSA9PSAnICcgPyBuZXh0IDogbmV4dCArIDE7Ci0gICAgICAgICAgICAgICAgICAgIHN0eWxlZFRleHQuc2V0U3BhbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTXV0YWJsZUJhY2tncm91bmRDb2xvclNwYW4oY2FwdGlvblN0eWxlLmJhY2tncm91bmRDb2xvciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kZWRTdGFydCwgZXhwYW5kZWRFbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Bhbm5hYmxlLlNQQU5fRVhDTFVTSVZFX0VYQ0xVU0lWRSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVN0YXJ0ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5U3R5bGVTcGFuKHN0eWxlZFRleHQsIGN1clN0eWxlLCBzdHlsZVN0YXJ0LCBleHBhbmRlZEVuZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmV4dCsrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc3R5bGVkVGV4dDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogQ0NNZW1vcnkgbW9kZWxzIGEgY29uc29sZS1zdHlsZSBkaXNwbGF5LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENDTWVtb3J5IHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUJsYW5rTGluZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDQ0xpbmVCdWlsZGVyW10gbUxpbmVzID0gbmV3IENDTGluZUJ1aWxkZXJbTUFYX1JPV1MgKyAyXTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVJvdzsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUNvbDsKLQotICAgICAgICBDQ01lbW9yeSgpIHsKLSAgICAgICAgICAgIGNoYXJbXSBibGFuayA9IG5ldyBjaGFyW01BWF9DT0xTICsgMl07Ci0gICAgICAgICAgICBBcnJheXMuZmlsbChibGFuaywgVFMpOwotICAgICAgICAgICAgbUJsYW5rTGluZSA9IG5ldyBTdHJpbmcoYmxhbmspOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBlcmFzZSgpIHsKLSAgICAgICAgICAgIC8vIGVyYXNlIGFsbCBsaW5lcwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTGluZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZXNbaV0gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVJvdyA9IE1BWF9ST1dTOwotICAgICAgICAgICAgbUNvbCA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGRlcigpIHsKLSAgICAgICAgICAgIGlmIChtTGluZXNbbVJvd10gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUNvbDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTGluZXNbbVJvd10uY2hhckF0KGkpICE9IFRTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gbUNvbDsgaiA8IG1MaW5lc1ttUm93XS5sZW5ndGgoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxpbmVzW2pdLnNldENoYXJBdChqLCBUUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUxpbmVzW21Sb3ddID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgdGFiKGludCB0YWJzKSB7Ci0gICAgICAgICAgICBtb3ZlQ3Vyc29yQnlDb2wodGFicyk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGJzKCkgewotICAgICAgICAgICAgbW92ZUN1cnNvckJ5Q29sKC0xKTsKLSAgICAgICAgICAgIGlmIChtTGluZXNbbVJvd10gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1MaW5lc1ttUm93XS5zZXRDaGFyQXQobUNvbCwgVFMpOwotICAgICAgICAgICAgICAgIGlmIChtQ29sID09IE1BWF9DT0xTIC0gMSkgewotICAgICAgICAgICAgICAgICAgICAvLyBTcGVjIHJlY29tbWVuZGF0aW9uOgotICAgICAgICAgICAgICAgICAgICAvLyBpZiBjdXJzb3Igd2FzIGF0IGNvbCAzMiwgbW92ZSBjdXJzb3IKLSAgICAgICAgICAgICAgICAgICAgLy8gYmFjayB0byBjb2wgMzEgYW5kIGVyYXNlIGJvdGggY29sIDMxJjMyCi0gICAgICAgICAgICAgICAgICAgIG1MaW5lc1ttUm93XS5zZXRDaGFyQXQoTUFYX0NPTFMsIFRTKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGNyKCkgewotICAgICAgICAgICAgbW92ZUN1cnNvclRvKG1Sb3cgKyAxLCAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgcm9sbFVwKGludCB3aW5kb3dTaXplKSB7Ci0gICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gbVJvdyAtIHdpbmRvd1NpemU7IGkrKykgewotICAgICAgICAgICAgICAgIG1MaW5lc1tpXSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgc3RhcnRSb3cgPSBtUm93IC0gd2luZG93U2l6ZSArIDE7Ci0gICAgICAgICAgICBpZiAoc3RhcnRSb3cgPCAxKSB7Ci0gICAgICAgICAgICAgICAgc3RhcnRSb3cgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpID0gc3RhcnRSb3c7IGkgPCBtUm93OyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZXNbaV0gPSBtTGluZXNbaSArIDFdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpID0gbVJvdzsgaSA8IG1MaW5lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIC8vIGNsZWFyIGJhc2Ugcm93Ci0gICAgICAgICAgICAgICAgbUxpbmVzW2ldID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gY29sIDEsIGluIGNhc2UgUEFDIGlzIG5vdCBzZW50Ci0gICAgICAgICAgICBtQ29sID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVUZXh0KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRleHQubGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGdldExpbmVCdWZmZXIobVJvdykuc2V0Q2hhckF0KG1Db2wsIHRleHQuY2hhckF0KGkpKTsKLSAgICAgICAgICAgICAgICBtb3ZlQ3Vyc29yQnlDb2woMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlTWlkUm93Q29kZShTdHlsZUNvZGUgbSkgewotICAgICAgICAgICAgZ2V0TGluZUJ1ZmZlcihtUm93KS5zZXRNaWRSb3dBdChtQ29sLCBtKTsKLSAgICAgICAgICAgIG1vdmVDdXJzb3JCeUNvbCgxKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVQQUMoUEFDIHBhYykgewotICAgICAgICAgICAgaWYgKHBhYy5pc0luZGVudFBBQygpKSB7Ci0gICAgICAgICAgICAgICAgbW92ZUN1cnNvclRvKHBhYy5nZXRSb3coKSwgcGFjLmdldENvbCgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbW92ZUN1cnNvclRvKHBhYy5nZXRSb3coKSwgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnZXRMaW5lQnVmZmVyKG1Sb3cpLnNldFBBQ0F0KG1Db2wsIHBhYyk7Ci0gICAgICAgIH0KLQotICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyW10gZ2V0U3R5bGVkVGV4dChDYXB0aW9uU3R5bGUgY2FwdGlvblN0eWxlKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8U3Bhbm5hYmxlU3RyaW5nQnVpbGRlcj4gcm93cyA9IG5ldyBBcnJheUxpc3Q8PihNQVhfUk9XUyk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBNQVhfUk9XUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcm93cy5hZGQobUxpbmVzW2ldICE9IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAgICAgbUxpbmVzW2ldLmdldFN0eWxlZFRleHQoY2FwdGlvblN0eWxlKSA6IG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJvd3MudG9BcnJheShuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcltNQVhfUk9XU10pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNsYW1wKGludCB4LCBpbnQgbWluLCBpbnQgbWF4KSB7Ci0gICAgICAgICAgICByZXR1cm4geCA8IG1pbiA/IG1pbiA6ICh4ID4gbWF4ID8gbWF4IDogeCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgbW92ZUN1cnNvclRvKGludCByb3csIGludCBjb2wpIHsKLSAgICAgICAgICAgIG1Sb3cgPSBjbGFtcChyb3csIDEsIE1BWF9ST1dTKTsKLSAgICAgICAgICAgIG1Db2wgPSBjbGFtcChjb2wsIDEsIE1BWF9DT0xTKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBtb3ZlQ3Vyc29yVG9Sb3coaW50IHJvdykgewotICAgICAgICAgICAgbVJvdyA9IGNsYW1wKHJvdywgMSwgTUFYX1JPV1MpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG1vdmVDdXJzb3JCeUNvbChpbnQgY29sKSB7Ci0gICAgICAgICAgICBtQ29sID0gY2xhbXAobUNvbCArIGNvbCwgMSwgTUFYX0NPTFMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG1vdmVCYXNlbGluZVRvKGludCBiYXNlUm93LCBpbnQgd2luZG93U2l6ZSkgewotICAgICAgICAgICAgaWYgKG1Sb3cgPT0gYmFzZVJvdykgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBhY3R1YWxXaW5kb3dTaXplID0gd2luZG93U2l6ZTsKLSAgICAgICAgICAgIGlmIChiYXNlUm93IDwgYWN0dWFsV2luZG93U2l6ZSkgewotICAgICAgICAgICAgICAgIGFjdHVhbFdpbmRvd1NpemUgPSBiYXNlUm93OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Sb3cgPCBhY3R1YWxXaW5kb3dTaXplKSB7Ci0gICAgICAgICAgICAgICAgYWN0dWFsV2luZG93U2l6ZSA9IG1Sb3c7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBpOwotICAgICAgICAgICAgaWYgKGJhc2VSb3cgPCBtUm93KSB7Ci0gICAgICAgICAgICAgICAgLy8gY29weSBmcm9tIGJvdHRvbSB0byB0b3Agcm93Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gYWN0dWFsV2luZG93U2l6ZSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MaW5lc1tiYXNlUm93IC0gaV0gPSBtTGluZXNbbVJvdyAtIGldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gY29weSBmcm9tIHRvcCB0byBib3R0b20gcm93Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFjdHVhbFdpbmRvd1NpemU7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBtTGluZXNbYmFzZVJvdyAtIGldID0gbUxpbmVzW21Sb3cgLSBpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBjbGVhciByZXN0IG9mIHRoZSByb3dzCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IGJhc2VSb3cgLSB3aW5kb3dTaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZXNbaV0gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpID0gYmFzZVJvdyArIDE7IGkgPCBtTGluZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZXNbaV0gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBDQ0xpbmVCdWlsZGVyIGdldExpbmVCdWZmZXIoaW50IHJvdykgewotICAgICAgICAgICAgaWYgKG1MaW5lc1tyb3ddID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtTGluZXNbcm93XSA9IG5ldyBDQ0xpbmVCdWlsZGVyKG1CbGFua0xpbmUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1MaW5lc1tyb3ddOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDQ0RhdGEgcGFyc2VzIHRoZSByYXcgQ0MgYnl0ZSBwYWlyIGludG8gZGlzcGxheWFibGUgY2hhcnMsCi0gICAgICogbWlzYyBjb250cm9sIGNvZGVzLCBNaWQtUm93IG9yIFByZWFtYmxlIEFkZHJlc3MgQ29kZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ0NEYXRhIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBieXRlIG1UeXBlOwotICAgICAgICBwcml2YXRlIGZpbmFsIGJ5dGUgbURhdGExOwotICAgICAgICBwcml2YXRlIGZpbmFsIGJ5dGUgbURhdGEyOwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIG1DdHJsQ29kZU1hcCA9IHsKLSAgICAgICAgICAgICJSQ0wiLCAiQlMiICwgIkFPRiIsICJBT04iLAotICAgICAgICAgICAgIkRFUiIsICJSVTIiLCAiUlUzIiwgIlJVNCIsCi0gICAgICAgICAgICAiRk9OIiwgIlJEQyIsICJUUiIgLCAiUlREIiwKLSAgICAgICAgICAgICJFRE0iLCAiQ1IiICwgIkVOTSIsICJFT0MiLAotICAgICAgICB9OwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIG1TcGVjaWFsQ2hhck1hcCA9IHsKLSAgICAgICAgICAgICJcdTAwQUUiLAotICAgICAgICAgICAgIlx1MDBCMCIsCi0gICAgICAgICAgICAiXHUwMEJEIiwKLSAgICAgICAgICAgICJcdTAwQkYiLAotICAgICAgICAgICAgIlx1MjEyMiIsCi0gICAgICAgICAgICAiXHUwMEEyIiwKLSAgICAgICAgICAgICJcdTAwQTMiLAotICAgICAgICAgICAgIlx1MjY2QSIsIC8vIEVpZ2h0aCBub3RlCi0gICAgICAgICAgICAiXHUwMEUwIiwKLSAgICAgICAgICAgICJcdTAwQTAiLCAvLyBUcmFuc3BhcmVudCBzcGFjZQotICAgICAgICAgICAgIlx1MDBFOCIsCi0gICAgICAgICAgICAiXHUwMEUyIiwKLSAgICAgICAgICAgICJcdTAwRUEiLAotICAgICAgICAgICAgIlx1MDBFRSIsCi0gICAgICAgICAgICAiXHUwMEY0IiwKLSAgICAgICAgICAgICJcdTAwRkIiLAotICAgICAgICB9OwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIG1TcGFuaXNoQ2hhck1hcCA9IHsKLSAgICAgICAgICAgIC8vIFNwYW5pc2ggYW5kIG1pc2MgY2hhcnMKLSAgICAgICAgICAgICJcdTAwQzEiLCAvLyBBCi0gICAgICAgICAgICAiXHUwMEM5IiwgLy8gRQotICAgICAgICAgICAgIlx1MDBEMyIsIC8vIEkKLSAgICAgICAgICAgICJcdTAwREEiLCAvLyBPCi0gICAgICAgICAgICAiXHUwMERDIiwgLy8gVQotICAgICAgICAgICAgIlx1MDBGQyIsIC8vIHUKLSAgICAgICAgICAgICJcdTIwMTgiLCAvLyBvcGVuaW5nIHNpbmdsZSBxdW90ZQotICAgICAgICAgICAgIlx1MDBBMSIsIC8vIGludmVydGVkIGV4Y2xhbWF0aW9uIG1hcmsKLSAgICAgICAgICAgICIqIiwKLSAgICAgICAgICAgICInIiwKLSAgICAgICAgICAgICJcdTIwMTQiLCAvLyBlbSBkYXNoCi0gICAgICAgICAgICAiXHUwMEE5IiwgLy8gQ29weXJpZ2h0Ci0gICAgICAgICAgICAiXHUyMTIwIiwgLy8gU2VydmljZW1hcmsKLSAgICAgICAgICAgICJcdTIwMjIiLCAvLyByb3VuZCBidWxsZXQKLSAgICAgICAgICAgICJcdTIwMUMiLCAvLyBvcGVuaW5nIGRvdWJsZSBxdW90ZQotICAgICAgICAgICAgIlx1MjAxRCIsIC8vIGNsb3NpbmcgZG91YmxlIHF1b3RlCi0gICAgICAgICAgICAvLyBGcmVuY2gKLSAgICAgICAgICAgICJcdTAwQzAiLAotICAgICAgICAgICAgIlx1MDBDMiIsCi0gICAgICAgICAgICAiXHUwMEM3IiwKLSAgICAgICAgICAgICJcdTAwQzgiLAotICAgICAgICAgICAgIlx1MDBDQSIsCi0gICAgICAgICAgICAiXHUwMENCIiwKLSAgICAgICAgICAgICJcdTAwRUIiLAotICAgICAgICAgICAgIlx1MDBDRSIsCi0gICAgICAgICAgICAiXHUwMENGIiwKLSAgICAgICAgICAgICJcdTAwRUYiLAotICAgICAgICAgICAgIlx1MDBENCIsCi0gICAgICAgICAgICAiXHUwMEQ5IiwKLSAgICAgICAgICAgICJcdTAwRjkiLAotICAgICAgICAgICAgIlx1MDBEQiIsCi0gICAgICAgICAgICAiXHUwMEFCIiwKLSAgICAgICAgICAgICJcdTAwQkIiCi0gICAgICAgIH07Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gbVByb3R1Z3Vlc2VDaGFyTWFwID0gewotICAgICAgICAgICAgLy8gUG9ydHVndWVzZQotICAgICAgICAgICAgIlx1MDBDMyIsCi0gICAgICAgICAgICAiXHUwMEUzIiwKLSAgICAgICAgICAgICJcdTAwQ0QiLAotICAgICAgICAgICAgIlx1MDBDQyIsCi0gICAgICAgICAgICAiXHUwMEVDIiwKLSAgICAgICAgICAgICJcdTAwRDIiLAotICAgICAgICAgICAgIlx1MDBGMiIsCi0gICAgICAgICAgICAiXHUwMEQ1IiwKLSAgICAgICAgICAgICJcdTAwRjUiLAotICAgICAgICAgICAgInsiLAotICAgICAgICAgICAgIn0iLAotICAgICAgICAgICAgIlxcIiwKLSAgICAgICAgICAgICJeIiwKLSAgICAgICAgICAgICJfIiwKLSAgICAgICAgICAgICJ8IiwKLSAgICAgICAgICAgICJ+IiwKLSAgICAgICAgICAgIC8vIEdlcm1hbiBhbmQgbWlzYyBjaGFycwotICAgICAgICAgICAgIlx1MDBDNCIsCi0gICAgICAgICAgICAiXHUwMEU0IiwKLSAgICAgICAgICAgICJcdTAwRDYiLAotICAgICAgICAgICAgIlx1MDBGNiIsCi0gICAgICAgICAgICAiXHUwMERGIiwKLSAgICAgICAgICAgICJcdTAwQTUiLAotICAgICAgICAgICAgIlx1MDBBNCIsCi0gICAgICAgICAgICAiXHUyNTAyIiwgLy8gdmVydGljYWwgYmFyCi0gICAgICAgICAgICAiXHUwMEM1IiwKLSAgICAgICAgICAgICJcdTAwRTUiLAotICAgICAgICAgICAgIlx1MDBEOCIsCi0gICAgICAgICAgICAiXHUwMEY4IiwKLSAgICAgICAgICAgICJcdTI1MEMiLCAvLyB0b3AtbGVmdCBjb3JuZXIKLSAgICAgICAgICAgICJcdTI1MTAiLCAvLyB0b3AtcmlnaHQgY29ybmVyCi0gICAgICAgICAgICAiXHUyNTE0IiwgLy8gbG93ZXItbGVmdCBjb3JuZXIKLSAgICAgICAgICAgICJcdTI1MTgiLCAvLyBsb3dlci1yaWdodCBjb3JuZXIKLSAgICAgICAgfTsKLQotICAgICAgICBzdGF0aWMgQ0NEYXRhW10gZnJvbUJ5dGVBcnJheShieXRlW10gZGF0YSkgewotICAgICAgICAgICAgQ0NEYXRhW10gY2NEYXRhID0gbmV3IENDRGF0YVtkYXRhLmxlbmd0aCAvIDNdOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNjRGF0YS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGNjRGF0YVtpXSA9IG5ldyBDQ0RhdGEoCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2kgKiAzXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbaSAqIDMgKyAxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbaSAqIDMgKyAyXSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBjY0RhdGE7Ci0gICAgICAgIH0KLQotICAgICAgICBDQ0RhdGEoYnl0ZSB0eXBlLCBieXRlIGRhdGExLCBieXRlIGRhdGEyKSB7Ci0gICAgICAgICAgICBtVHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICBtRGF0YTEgPSBkYXRhMTsKLSAgICAgICAgICAgIG1EYXRhMiA9IGRhdGEyOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdldEN0cmxDb2RlKCkgewotICAgICAgICAgICAgaWYgKChtRGF0YTEgPT0gMHgxNCB8fCBtRGF0YTEgPT0gMHgxYykKLSAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MjAgJiYgbURhdGEyIDw9IDB4MmYpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbURhdGEyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHlsZUNvZGUgZ2V0TWlkUm93KCkgewotICAgICAgICAgICAgLy8gb25seSBzdXBwb3J0IHN0YW5kYXJkIE1pZC1yb3cgY29kZXMsIGlnbm9yZQotICAgICAgICAgICAgLy8gb3B0aW9uYWwgYmFja2dyb3VuZC9mb3JlZ3JvdW5kIG1pZC1yb3cgY29kZXMKLSAgICAgICAgICAgIGlmICgobURhdGExID09IDB4MTEgfHwgbURhdGExID09IDB4MTkpCi0gICAgICAgICAgICAgICAgICAgICYmIG1EYXRhMiA+PSAweDIwICYmIG1EYXRhMiA8PSAweDJmKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0eWxlQ29kZS5mcm9tQnl0ZShtRGF0YTIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBQQUMgZ2V0UEFDKCkgewotICAgICAgICAgICAgaWYgKChtRGF0YTEgJiAweDcwKSA9PSAweDEwCi0gICAgICAgICAgICAgICAgICAgICYmIChtRGF0YTIgJiAweDQwKSA9PSAweDQwCi0gICAgICAgICAgICAgICAgICAgICYmICgobURhdGExICYgMHgwNykgIT0gMCB8fCAobURhdGEyICYgMHgyMCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUEFDLmZyb21CeXRlcyhtRGF0YTEsIG1EYXRhMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBnZXRUYWJPZmZzZXQoKSB7Ci0gICAgICAgICAgICBpZiAoKG1EYXRhMSA9PSAweDE3IHx8IG1EYXRhMSA9PSAweDFmKQotICAgICAgICAgICAgICAgICAgICAmJiBtRGF0YTIgPj0gMHgyMSAmJiBtRGF0YTIgPD0gMHgyMykgewotICAgICAgICAgICAgICAgIHJldHVybiBtRGF0YTIgJiAweDM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNEaXNwbGF5YWJsZUNoYXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNCYXNpY0NoYXIoKSB8fCBpc1NwZWNpYWxDaGFyKCkgfHwgaXNFeHRlbmRlZENoYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBnZXREaXNwbGF5VGV4dCgpIHsKLSAgICAgICAgICAgIFN0cmluZyBzdHIgPSBnZXRCYXNpY0NoYXJzKCk7Ci0KLSAgICAgICAgICAgIGlmIChzdHIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0ciA9ICBnZXRTcGVjaWFsQ2hhcigpOwotCi0gICAgICAgICAgICAgICAgaWYgKHN0ciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0ciA9IGdldEV4dGVuZGVkQ2hhcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHN0cjsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGN0cmxDb2RlVG9TdHJpbmcoaW50IGN0cmxDb2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUN0cmxDb2RlTWFwW2N0cmxDb2RlIC0gMHgyMF07Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNCYXNpY0NoYXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURhdGExID49IDB4MjAgJiYgbURhdGExIDw9IDB4N2Y7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNTcGVjaWFsQ2hhcigpIHsKLSAgICAgICAgICAgIHJldHVybiAoKG1EYXRhMSA9PSAweDExIHx8IG1EYXRhMSA9PSAweDE5KQotICAgICAgICAgICAgICAgICAgICAmJiBtRGF0YTIgPj0gMHgzMCAmJiBtRGF0YTIgPD0gMHgzZik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNFeHRlbmRlZENoYXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChtRGF0YTEgPT0gMHgxMiB8fCBtRGF0YTEgPT0gMHgxQQotICAgICAgICAgICAgICAgICAgICB8fCBtRGF0YTEgPT0gMHgxMyB8fCBtRGF0YTEgPT0gMHgxQikKLSAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MjAgJiYgbURhdGEyIDw9IDB4M2YpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBjaGFyIGdldEJhc2ljQ2hhcihieXRlIGRhdGEpIHsKLSAgICAgICAgICAgIGNoYXIgYzsKLSAgICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIG5vbi1BU0NJSSBvbmVzCi0gICAgICAgICAgICBzd2l0Y2ggKGRhdGEpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDB4MkE6IGMgPSAnXHUwMEUxJzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDVDOiBjID0gJ1x1MDBFOSc7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMHg1RTogYyA9ICdcdTAwRUQnOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDB4NUY6IGMgPSAnXHUwMEYzJzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDYwOiBjID0gJ1x1MDBGQSc7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMHg3QjogYyA9ICdcdTAwRTcnOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDB4N0M6IGMgPSAnXHUwMEY3JzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDdEOiBjID0gJ1x1MDBEMSc7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMHg3RTogYyA9ICdcdTAwRjEnOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDB4N0Y6IGMgPSAnXHUyNTg4JzsgYnJlYWs7IC8vIEZ1bGwgYmxvY2sKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBjID0gKGNoYXIpIGRhdGE7IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGM7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRCYXNpY0NoYXJzKCkgewotICAgICAgICAgICAgaWYgKG1EYXRhMSA+PSAweDIwICYmIG1EYXRhMSA8PSAweDdmKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoMik7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZ2V0QmFzaWNDaGFyKG1EYXRhMSkpOwotICAgICAgICAgICAgICAgIGlmIChtRGF0YTIgPj0gMHgyMCAmJiBtRGF0YTIgPD0gMHg3ZikgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChnZXRCYXNpY0NoYXIobURhdGEyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U3BlY2lhbENoYXIoKSB7Ci0gICAgICAgICAgICBpZiAoKG1EYXRhMSA9PSAweDExIHx8IG1EYXRhMSA9PSAweDE5KQotICAgICAgICAgICAgICAgICAgICAmJiBtRGF0YTIgPj0gMHgzMCAmJiBtRGF0YTIgPD0gMHgzZikgewotICAgICAgICAgICAgICAgIHJldHVybiBtU3BlY2lhbENoYXJNYXBbbURhdGEyIC0gMHgzMF07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RXh0ZW5kZWRDaGFyKCkgewotICAgICAgICAgICAgaWYgKChtRGF0YTEgPT0gMHgxMiB8fCBtRGF0YTEgPT0gMHgxQSkKLSAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MjAgJiYgbURhdGEyIDw9IDB4M2YpewotICAgICAgICAgICAgICAgIC8vIDEgU3BhbmlzaC9GcmVuY2ggY2hhcgotICAgICAgICAgICAgICAgIHJldHVybiBtU3BhbmlzaENoYXJNYXBbbURhdGEyIC0gMHgyMF07Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChtRGF0YTEgPT0gMHgxMyB8fCBtRGF0YTEgPT0gMHgxQikKLSAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MjAgJiYgbURhdGEyIDw9IDB4M2YpewotICAgICAgICAgICAgICAgIC8vIDEgUG9ydHVndWVzZS9HZXJtYW4vRGFuaXNoIGNoYXIKLSAgICAgICAgICAgICAgICByZXR1cm4gbVByb3R1Z3Vlc2VDaGFyTWFwW21EYXRhMiAtIDB4MjBdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgU3RyaW5nIHN0cjsKLQotICAgICAgICAgICAgaWYgKG1EYXRhMSA8IDB4MTAgJiYgbURhdGEyIDwgMHgxMCkgewotICAgICAgICAgICAgICAgIC8vIE51bGwgUGFkLCBpZ25vcmUKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiWyVkXU51bGw6ICUwMnggJTAyeCIsIG1UeXBlLCBtRGF0YTEsIG1EYXRhMik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBjdHJsQ29kZSA9IGdldEN0cmxDb2RlKCk7Ci0gICAgICAgICAgICBpZiAoY3RybENvZGUgIT0gSU5WQUxJRCkgewotICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbJWRdJXMiLCBtVHlwZSwgY3RybENvZGVUb1N0cmluZyhjdHJsQ29kZSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgdGFiT2Zmc2V0ID0gZ2V0VGFiT2Zmc2V0KCk7Ci0gICAgICAgICAgICBpZiAodGFiT2Zmc2V0ID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbJWRdVGFiJWQiLCBtVHlwZSwgdGFiT2Zmc2V0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgUEFDIHBhYyA9IGdldFBBQygpOwotICAgICAgICAgICAgaWYgKHBhYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlslZF1QQUM6ICVzIiwgbVR5cGUsIHBhYy50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3R5bGVDb2RlIG0gPSBnZXRNaWRSb3coKTsKLSAgICAgICAgICAgIGlmIChtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiWyVkXU1pZC1yb3c6ICVzIiwgbVR5cGUsIG0udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpc0Rpc3BsYXlhYmxlQ2hhcigpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlslZF1EaXNwbGF5YWJsZTogJXMgKCUwMnggJTAyeCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgbVR5cGUsIGdldERpc3BsYXlUZXh0KCksIG1EYXRhMSwgbURhdGEyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlslZF1JbnZhbGlkOiAlMDJ4ICUwMngiLCBtVHlwZSwgbURhdGExLCBtRGF0YTIpOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKioKLSAqIFdpZGdldCBjYXBhYmxlIG9mIHJlbmRlcmluZyBDRUEtNjA4IGNsb3NlZCBjYXB0aW9ucy4KLSAqLwotY2xhc3MgQ2VhNjA4Q0NXaWRnZXQgZXh0ZW5kcyBDbG9zZWRDYXB0aW9uV2lkZ2V0IGltcGxlbWVudHMgQ2VhNjA4Q0NQYXJzZXIuRGlzcGxheUxpc3RlbmVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZWN0IG1UZXh0Qm91bmRzID0gbmV3IFJlY3QoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbUR1bW15VGV4dCA9ICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0IjsKLQotICAgIHB1YmxpYyBDZWE2MDhDQ1dpZGdldChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2VhNjA4Q0NXaWRnZXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIENlYTYwOENDV2lkZ2V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGUsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBDZWE2MDhDQ1dpZGdldChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwKLSAgICAgICAgICAgIGludCBkZWZTdHlsZVJlcykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCBkZWZTdHlsZVJlcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENsb3NlZENhcHRpb25MYXlvdXQgY3JlYXRlQ2FwdGlvbkxheW91dChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDQ0xheW91dChjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRpc3BsYXlDaGFuZ2VkKFNwYW5uYWJsZVN0cmluZ0J1aWxkZXJbXSBzdHlsZWRUZXh0cykgewotICAgICAgICAoKENDTGF5b3V0KSBtQ2xvc2VkQ2FwdGlvbkxheW91dCkudXBkYXRlKHN0eWxlZFRleHRzKTsKLQotICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1MaXN0ZW5lci5vbkNoYW5nZWQodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2FwdGlvblN0eWxlIGdldENhcHRpb25TdHlsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1DYXB0aW9uU3R5bGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ0NMaW5lQm94IGV4dGVuZHMgVGV4dFZpZXcgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBGT05UX1BBRERJTkdfUkFUSU8gPSAwLjc1ZjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgRURHRV9PVVRMSU5FX1JBVElPID0gMC4xZjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgRURHRV9TSEFET1dfUkFUSU8gPSAwLjA1ZjsKLSAgICAgICAgcHJpdmF0ZSBmbG9hdCBtT3V0bGluZVdpZHRoOwotICAgICAgICBwcml2YXRlIGZsb2F0IG1TaGFkb3dSYWRpdXM7Ci0gICAgICAgIHByaXZhdGUgZmxvYXQgbVNoYWRvd09mZnNldDsKLQotICAgICAgICBwcml2YXRlIGludCBtVGV4dENvbG9yID0gQ29sb3IuV0hJVEU7Ci0gICAgICAgIHByaXZhdGUgaW50IG1CZ0NvbG9yID0gQ29sb3IuQkxBQ0s7Ci0gICAgICAgIHByaXZhdGUgaW50IG1FZGdlVHlwZSA9IENhcHRpb25TdHlsZS5FREdFX1RZUEVfTk9ORTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUVkZ2VDb2xvciA9IENvbG9yLlRSQU5TUEFSRU5UOwotCi0gICAgICAgIENDTGluZUJveChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICAgICAgc2V0R3Jhdml0eShHcmF2aXR5LkNFTlRFUik7Ci0gICAgICAgICAgICBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IuVFJBTlNQQVJFTlQpOwotICAgICAgICAgICAgc2V0VGV4dENvbG9yKENvbG9yLldISVRFKTsKLSAgICAgICAgICAgIHNldFR5cGVmYWNlKFR5cGVmYWNlLk1PTk9TUEFDRSk7Ci0gICAgICAgICAgICBzZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKLQotICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKTsKLQotICAgICAgICAgICAgLy8gZ2V0IHRoZSBkZWZhdWx0ICh3aWxsIGJlIHVwZGF0ZWQgbGF0ZXIgZHVyaW5nIG1lYXN1cmUpCi0gICAgICAgICAgICBtT3V0bGluZVdpZHRoID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5zdWJ0aXRsZV9vdXRsaW5lX3dpZHRoKTsKLSAgICAgICAgICAgIG1TaGFkb3dSYWRpdXMgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnN1YnRpdGxlX3NoYWRvd19yYWRpdXMpOwotICAgICAgICAgICAgbVNoYWRvd09mZnNldCA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuZGltZW4uc3VidGl0bGVfc2hhZG93X29mZnNldCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldENhcHRpb25TdHlsZShDYXB0aW9uU3R5bGUgY2FwdGlvblN0eWxlKSB7Ci0gICAgICAgICAgICBtVGV4dENvbG9yID0gY2FwdGlvblN0eWxlLmZvcmVncm91bmRDb2xvcjsKLSAgICAgICAgICAgIG1CZ0NvbG9yID0gY2FwdGlvblN0eWxlLmJhY2tncm91bmRDb2xvcjsKLSAgICAgICAgICAgIG1FZGdlVHlwZSA9IGNhcHRpb25TdHlsZS5lZGdlVHlwZTsKLSAgICAgICAgICAgIG1FZGdlQ29sb3IgPSBjYXB0aW9uU3R5bGUuZWRnZUNvbG9yOwotCi0gICAgICAgICAgICBzZXRUZXh0Q29sb3IobVRleHRDb2xvcik7Ci0gICAgICAgICAgICBpZiAobUVkZ2VUeXBlID09IENhcHRpb25TdHlsZS5FREdFX1RZUEVfRFJPUF9TSEFET1cpIHsKLSAgICAgICAgICAgICAgICBzZXRTaGFkb3dMYXllcihtU2hhZG93UmFkaXVzLCBtU2hhZG93T2Zmc2V0LCBtU2hhZG93T2Zmc2V0LCBtRWRnZUNvbG9yKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0U2hhZG93TGF5ZXIoMCwgMCwgMCwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgICAgIGZsb2F0IGZvbnRTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYykgKiBGT05UX1BBRERJTkdfUkFUSU87Ci0gICAgICAgICAgICBzZXRUZXh0U2l6ZShUeXBlZFZhbHVlLkNPTVBMRVhfVU5JVF9QWCwgZm9udFNpemUpOwotCi0gICAgICAgICAgICBtT3V0bGluZVdpZHRoID0gRURHRV9PVVRMSU5FX1JBVElPICogZm9udFNpemUgKyAxLjBmOwotICAgICAgICAgICAgbVNoYWRvd1JhZGl1cyA9IEVER0VfU0hBRE9XX1JBVElPICogZm9udFNpemUgKyAxLjBmOzsKLSAgICAgICAgICAgIG1TaGFkb3dPZmZzZXQgPSBtU2hhZG93UmFkaXVzOwotCi0gICAgICAgICAgICAvLyBzZXQgZm9udCBzY2FsZSBpbiB0aGUgWCBkaXJlY3Rpb24gdG8gbWF0Y2ggdGhlIHJlcXVpcmVkIHdpZHRoCi0gICAgICAgICAgICBzZXRTY2FsZVgoMS4wZik7Ci0gICAgICAgICAgICBnZXRQYWludCgpLmdldFRleHRCb3VuZHMobUR1bW15VGV4dCwgMCwgbUR1bW15VGV4dC5sZW5ndGgoKSwgbVRleHRCb3VuZHMpOwotICAgICAgICAgICAgZmxvYXQgYWN0dWFsVGV4dFdpZHRoID0gbVRleHRCb3VuZHMud2lkdGgoKTsKLSAgICAgICAgICAgIGZsb2F0IHJlcXVpcmVkVGV4dFdpZHRoID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZSh3aWR0aE1lYXN1cmVTcGVjKTsKLSAgICAgICAgICAgIHNldFNjYWxlWChyZXF1aXJlZFRleHRXaWR0aCAvIGFjdHVhbFRleHRXaWR0aCk7Ci0KLSAgICAgICAgICAgIHN1cGVyLm9uTWVhc3VyZSh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjKSB7Ci0gICAgICAgICAgICBpZiAobUVkZ2VUeXBlID09IENhcHRpb25TdHlsZS5FREdFX1RZUEVfVU5TUEVDSUZJRUQKLSAgICAgICAgICAgICAgICAgICAgfHwgbUVkZ2VUeXBlID09IENhcHRpb25TdHlsZS5FREdFX1RZUEVfTk9ORQotICAgICAgICAgICAgICAgICAgICB8fCBtRWRnZVR5cGUgPT0gQ2FwdGlvblN0eWxlLkVER0VfVFlQRV9EUk9QX1NIQURPVykgewotICAgICAgICAgICAgICAgIC8vIHRoZXNlIGVkZ2Ugc3R5bGVzIGRvbid0IHJlcXVpcmUgYSBzZWNvbmQgcGFzcwotICAgICAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtRWRnZVR5cGUgPT0gQ2FwdGlvblN0eWxlLkVER0VfVFlQRV9PVVRMSU5FKSB7Ci0gICAgICAgICAgICAgICAgZHJhd0VkZ2VPdXRsaW5lKGMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBSYWlzZWQgb3IgZGVwcmVzc2VkCi0gICAgICAgICAgICAgICAgZHJhd0VkZ2VSYWlzZWRPckRlcHJlc3NlZChjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBkcmF3RWRnZU91dGxpbmUoQ2FudmFzIGMpIHsKLSAgICAgICAgICAgIFRleHRQYWludCB0ZXh0UGFpbnQgPSBnZXRQYWludCgpOwotCi0gICAgICAgICAgICBQYWludC5TdHlsZSBwcmV2aW91c1N0eWxlID0gdGV4dFBhaW50LmdldFN0eWxlKCk7Ci0gICAgICAgICAgICBQYWludC5Kb2luIHByZXZpb3VzSm9pbiA9IHRleHRQYWludC5nZXRTdHJva2VKb2luKCk7Ci0gICAgICAgICAgICBmbG9hdCBwcmV2aW91c1dpZHRoID0gdGV4dFBhaW50LmdldFN0cm9rZVdpZHRoKCk7Ci0KLSAgICAgICAgICAgIHNldFRleHRDb2xvcihtRWRnZUNvbG9yKTsKLSAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHlsZShQYWludC5TdHlsZS5GSUxMX0FORF9TVFJPS0UpOwotICAgICAgICAgICAgdGV4dFBhaW50LnNldFN0cm9rZUpvaW4oUGFpbnQuSm9pbi5ST1VORCk7Ci0gICAgICAgICAgICB0ZXh0UGFpbnQuc2V0U3Ryb2tlV2lkdGgobU91dGxpbmVXaWR0aCk7Ci0KLSAgICAgICAgICAgIC8vIERyYXcgb3V0bGluZSBhbmQgYmFja2dyb3VuZCBvbmx5LgotICAgICAgICAgICAgc3VwZXIub25EcmF3KGMpOwotCi0gICAgICAgICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIHNldHRpbmdzLgotICAgICAgICAgICAgc2V0VGV4dENvbG9yKG1UZXh0Q29sb3IpOwotICAgICAgICAgICAgdGV4dFBhaW50LnNldFN0eWxlKHByZXZpb3VzU3R5bGUpOwotICAgICAgICAgICAgdGV4dFBhaW50LnNldFN0cm9rZUpvaW4ocHJldmlvdXNKb2luKTsKLSAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHJva2VXaWR0aChwcmV2aW91c1dpZHRoKTsKLQotICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBiYWNrZ3JvdW5kLgotICAgICAgICAgICAgc2V0QmFja2dyb3VuZFNwYW5zKENvbG9yLlRSQU5TUEFSRU5UKTsKLSAgICAgICAgICAgIC8vIERyYXcgZm9yZWdyb3VuZCBvbmx5LgotICAgICAgICAgICAgc3VwZXIub25EcmF3KGMpOwotICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgYmFja2dyb3VuZC4KLSAgICAgICAgICAgIHNldEJhY2tncm91bmRTcGFucyhtQmdDb2xvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZHJhd0VkZ2VSYWlzZWRPckRlcHJlc3NlZChDYW52YXMgYykgewotICAgICAgICAgICAgVGV4dFBhaW50IHRleHRQYWludCA9IGdldFBhaW50KCk7Ci0KLSAgICAgICAgICAgIFBhaW50LlN0eWxlIHByZXZpb3VzU3R5bGUgPSB0ZXh0UGFpbnQuZ2V0U3R5bGUoKTsKLSAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHlsZShQYWludC5TdHlsZS5GSUxMKTsKLQotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByYWlzZWQgPSBtRWRnZVR5cGUgPT0gQ2FwdGlvblN0eWxlLkVER0VfVFlQRV9SQUlTRUQ7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY29sb3JVcCA9IHJhaXNlZCA/IENvbG9yLldISVRFIDogbUVkZ2VDb2xvcjsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb2xvckRvd24gPSByYWlzZWQgPyBtRWRnZUNvbG9yIDogQ29sb3IuV0hJVEU7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCBvZmZzZXQgPSBtU2hhZG93UmFkaXVzIC8gMmY7Ci0KLSAgICAgICAgICAgIC8vIERyYXcgYmFja2dyb3VuZCBhbmQgdGV4dCB3aXRoIHNoYWRvdyB1cAotICAgICAgICAgICAgc2V0U2hhZG93TGF5ZXIobVNoYWRvd1JhZGl1cywgLW9mZnNldCwgLW9mZnNldCwgY29sb3JVcCk7Ci0gICAgICAgICAgICBzdXBlci5vbkRyYXcoYyk7Ci0KLSAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgYmFja2dyb3VuZC4KLSAgICAgICAgICAgIHNldEJhY2tncm91bmRTcGFucyhDb2xvci5UUkFOU1BBUkVOVCk7Ci0KLSAgICAgICAgICAgIC8vIERyYXcgdGV4dCB3aXRoIHNoYWRvdyBkb3duCi0gICAgICAgICAgICBzZXRTaGFkb3dMYXllcihtU2hhZG93UmFkaXVzLCArb2Zmc2V0LCArb2Zmc2V0LCBjb2xvckRvd24pOwotICAgICAgICAgICAgc3VwZXIub25EcmF3KGMpOwotCi0gICAgICAgICAgICAvLyBSZXN0b3JlIHNldHRpbmdzCi0gICAgICAgICAgICB0ZXh0UGFpbnQuc2V0U3R5bGUocHJldmlvdXNTdHlsZSk7Ci0KLSAgICAgICAgICAgIC8vIFJlc3RvcmUgdGhlIGJhY2tncm91bmQuCi0gICAgICAgICAgICBzZXRCYWNrZ3JvdW5kU3BhbnMobUJnQ29sb3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldEJhY2tncm91bmRTcGFucyhpbnQgY29sb3IpIHsKLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gZ2V0VGV4dCgpOwotICAgICAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTcGFubmFibGUpIHsKLSAgICAgICAgICAgICAgICBTcGFubmFibGUgc3Bhbm5hYmxlID0gKFNwYW5uYWJsZSkgdGV4dDsKLSAgICAgICAgICAgICAgICBDZWE2MDhDQ1BhcnNlci5NdXRhYmxlQmFja2dyb3VuZENvbG9yU3BhbltdIGJnU3BhbnMgPSBzcGFubmFibGUuZ2V0U3BhbnMoCi0gICAgICAgICAgICAgICAgICAgICAgICAwLCBzcGFubmFibGUubGVuZ3RoKCksIENlYTYwOENDUGFyc2VyLk11dGFibGVCYWNrZ3JvdW5kQ29sb3JTcGFuLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJnU3BhbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYmdTcGFuc1tpXS5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENDTGF5b3V0IGV4dGVuZHMgTGluZWFyTGF5b3V0IGltcGxlbWVudHMgQ2xvc2VkQ2FwdGlvbkxheW91dCB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfUk9XUyA9IENlYTYwOENDUGFyc2VyLk1BWF9ST1dTOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBTQUZFX0FSRUFfUkFUSU8gPSAwLjlmOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgQ0NMaW5lQm94W10gbUxpbmVCb3hlcyA9IG5ldyBDQ0xpbmVCb3hbTUFYX1JPV1NdOwotCi0gICAgICAgIENDTGF5b3V0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0gICAgICAgICAgICBzZXRHcmF2aXR5KEdyYXZpdHkuU1RBUlQpOwotICAgICAgICAgICAgc2V0T3JpZW50YXRpb24oTGluZWFyTGF5b3V0LlZFUlRJQ0FMKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1JPV1M7IGkrKykgewotICAgICAgICAgICAgICAgIG1MaW5lQm94ZXNbaV0gPSBuZXcgQ0NMaW5lQm94KGdldENvbnRleHQoKSk7Ci0gICAgICAgICAgICAgICAgYWRkVmlldyhtTGluZUJveGVzW2ldLCBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULCBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDYXB0aW9uU3R5bGUoQ2FwdGlvblN0eWxlIGNhcHRpb25TdHlsZSkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfUk9XUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVCb3hlc1tpXS5zZXRDYXB0aW9uU3R5bGUoY2FwdGlvblN0eWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRGb250U2NhbGUoZmxvYXQgZm9udFNjYWxlKSB7Ci0gICAgICAgICAgICAvLyBJZ25vcmVzIHRoZSBmb250IHNjYWxlIGNoYW5nZXMgb2YgdGhlIHN5c3RlbSB3aWRlIENDIHByZWZlcmVuY2UuCi0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHVwZGF0ZShTcGFubmFibGVTdHJpbmdCdWlsZGVyW10gdGV4dEJ1ZmZlcikgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfUk9XUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRleHRCdWZmZXJbaV0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtTGluZUJveGVzW2ldLnNldFRleHQodGV4dEJ1ZmZlcltpXSwgVGV4dFZpZXcuQnVmZmVyVHlwZS5TUEFOTkFCTEUpOwotICAgICAgICAgICAgICAgICAgICBtTGluZUJveGVzW2ldLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtTGluZUJveGVzW2ldLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgewotICAgICAgICAgICAgc3VwZXIub25NZWFzdXJlKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKLQotICAgICAgICAgICAgaW50IHNhZmVXaWR0aCA9IGdldE1lYXN1cmVkV2lkdGgoKTsKLSAgICAgICAgICAgIGludCBzYWZlSGVpZ2h0ID0gZ2V0TWVhc3VyZWRIZWlnaHQoKTsKLQotICAgICAgICAgICAgLy8gQ0VBLTYwOCBhc3N1bWVzIDQ6MyB2aWRlbwotICAgICAgICAgICAgaWYgKHNhZmVXaWR0aCAqIDMgPj0gc2FmZUhlaWdodCAqIDQpIHsKLSAgICAgICAgICAgICAgICBzYWZlV2lkdGggPSBzYWZlSGVpZ2h0ICogNCAvIDM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNhZmVIZWlnaHQgPSBzYWZlV2lkdGggKiAzIC8gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNhZmVXaWR0aCAqPSBTQUZFX0FSRUFfUkFUSU87Ci0gICAgICAgICAgICBzYWZlSGVpZ2h0ICo9IFNBRkVfQVJFQV9SQVRJTzsKLQotICAgICAgICAgICAgaW50IGxpbmVIZWlnaHQgPSBzYWZlSGVpZ2h0IC8gTUFYX1JPV1M7Ci0gICAgICAgICAgICBpbnQgbGluZUhlaWdodE1lYXN1cmVTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKAotICAgICAgICAgICAgICAgICAgICBsaW5lSGVpZ2h0LCBNZWFzdXJlU3BlYy5FWEFDVExZKTsKLSAgICAgICAgICAgIGludCBsaW5lV2lkdGhNZWFzdXJlU3BlYyA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygKLSAgICAgICAgICAgICAgICAgICAgc2FmZVdpZHRoLCBNZWFzdXJlU3BlYy5FWEFDVExZKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfUk9XUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVCb3hlc1tpXS5tZWFzdXJlKGxpbmVXaWR0aE1lYXN1cmVTcGVjLCBsaW5lSGVpZ2h0TWVhc3VyZVNwZWMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uTGF5b3V0KGJvb2xlYW4gY2hhbmdlZCwgaW50IGwsIGludCB0LCBpbnQgciwgaW50IGIpIHsKLSAgICAgICAgICAgIC8vIHNhZmUgY2FwdGlvbiBhcmVhCi0gICAgICAgICAgICBpbnQgdmlld1BvcnRXaWR0aCA9IHIgLSBsOwotICAgICAgICAgICAgaW50IHZpZXdQb3J0SGVpZ2h0ID0gYiAtIHQ7Ci0gICAgICAgICAgICBpbnQgc2FmZVdpZHRoLCBzYWZlSGVpZ2h0OwotICAgICAgICAgICAgLy8gQ0VBLTYwOCBhc3N1bWVzIDQ6MyB2aWRlbwotICAgICAgICAgICAgaWYgKHZpZXdQb3J0V2lkdGggKiAzID49IHZpZXdQb3J0SGVpZ2h0ICogNCkgewotICAgICAgICAgICAgICAgIHNhZmVXaWR0aCA9IHZpZXdQb3J0SGVpZ2h0ICogNCAvIDM7Ci0gICAgICAgICAgICAgICAgc2FmZUhlaWdodCA9IHZpZXdQb3J0SGVpZ2h0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzYWZlV2lkdGggPSB2aWV3UG9ydFdpZHRoOwotICAgICAgICAgICAgICAgIHNhZmVIZWlnaHQgPSB2aWV3UG9ydFdpZHRoICogMyAvIDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYWZlV2lkdGggKj0gU0FGRV9BUkVBX1JBVElPOwotICAgICAgICAgICAgc2FmZUhlaWdodCAqPSBTQUZFX0FSRUFfUkFUSU87Ci0gICAgICAgICAgICBpbnQgbGVmdCA9ICh2aWV3UG9ydFdpZHRoIC0gc2FmZVdpZHRoKSAvIDI7Ci0gICAgICAgICAgICBpbnQgdG9wID0gKHZpZXdQb3J0SGVpZ2h0IC0gc2FmZUhlaWdodCkgLyAyOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9ST1dTOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZUJveGVzW2ldLmxheW91dCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICB0b3AgKyBzYWZlSGVpZ2h0ICogaSAvIE1BWF9ST1dTLAotICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCArIHNhZmVXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvcCArIHNhZmVIZWlnaHQgKiAoaSArIDEpIC8gTUFYX1JPV1MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9NZWRpYVRpbWVQcm92aWRlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9NZWRpYVRpbWVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjM2ZDdmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvTWVkaWFUaW1lUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGU7Ci0KLS8vIE5vdGU6IFRoaXMgaXMganVzdCBjb3BpZWQgZnJvbSBhbmRyb2lkLm1lZGlhLk1lZGlhVGltZVByb3ZpZGVyLgotcHVibGljIGludGVyZmFjZSBNZWRpYVRpbWVQcm92aWRlciB7Ci0gICAgLy8gd2UgZG8gbm90IGFsbG93IG5lZ2F0aXZlIG1lZGlhIHRpbWUKLSAgICAvKioKLSAgICAgKiBQcmVzZW50YXRpb24gdGltZSB2YWx1ZSBpZiBubyB0aW1lZCBldmVudCBub3RpZmljYXRpb24gaXMgcmVxdWVzdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbG9uZyBOT19USU1FID0gLTE7Ci0KLSAgICAvKioKLSAgICAgKiBDYW5jZWxzIGFsbCBwcmV2aW91cyBub3RpZmljYXRpb24gcmVxdWVzdCBmcm9tIHRoaXMgbGlzdGVuZXIgaWYgYW55LiAgSXQKLSAgICAgKiByZWdpc3RlcnMgdGhlIGxpc3RlbmVyIHRvIGdldCBzZWVrIGFuZCBzdG9wIG5vdGlmaWNhdGlvbnMuICBJZiB0aW1lVXMgaXMKLSAgICAgKiBub3QgbmVnYXRpdmUsIGl0IGFsc28gcmVnaXN0ZXJzIHRoZSBsaXN0ZW5lciBmb3IgYSB0aW1lZCBldmVudAotICAgICAqIG5vdGlmaWNhdGlvbiB3aGVuIHRoZSBwcmVzZW50YXRpb24gdGltZSByZWFjaGVzIChiZWNvbWVzIGdyZWF0ZXIpIHRoYW4KLSAgICAgKiB0aGUgdmFsdWUgc3BlY2lmaWVkLiAgVGhpcyBoYXBwZW5zIGltbWVkaWF0ZWx5IGlmIHRoZSBjdXJyZW50IG1lZGlhIHRpbWUKLSAgICAgKiBpcyBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byB0aW1lVXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGltZVVzIHByZXNlbnRhdGlvbiB0aW1lIHRvIGdldCB0aW1lZCBldmVudCBjYWxsYmFjayBhdCAob3IKLSAgICAgKiAgICAgICAgICAgICAgIHtAbGluayAjTk9fVElNRX0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbm90aWZ5QXQobG9uZyB0aW1lVXMsIE9uTWVkaWFUaW1lTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0gICAgLyoqCi0gICAgICogQ2FuY2VscyBhbGwgcHJldmlvdXMgbm90aWZpY2F0aW9uIHJlcXVlc3QgZnJvbSB0aGlzIGxpc3RlbmVyIGlmIGFueS4gIEl0Ci0gICAgICogcmVnaXN0ZXJzIHRoZSBsaXN0ZW5lciB0byBnZXQgc2VlayBhbmQgc3RvcCBub3RpZmljYXRpb25zLiAgSWYgdGhlIG1lZGlhCi0gICAgICogaXMgc3RvcHBlZCwgdGhlIGxpc3RlbmVyIHdpbGwgaW1tZWRpYXRlbHkgcmVjZWl2ZSBhIHN0b3Agbm90aWZpY2F0aW9uLgotICAgICAqIE90aGVyd2lzZSwgaXQgd2lsbCByZWNlaXZlIGEgdGltZWQgZXZlbnQgbm90aWZpY2F0b24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2NoZWR1bGVVcGRhdGUoT25NZWRpYVRpbWVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLSAgICAvKioKLSAgICAgKiBDYW5jZWxzIGFsbCBwcmV2aW91cyBub3RpZmljYXRpb24gcmVxdWVzdCBmcm9tIHRoaXMgbGlzdGVuZXIgaWYgYW55LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNhbmNlbE5vdGlmaWNhdGlvbnMoT25NZWRpYVRpbWVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGN1cnJlbnQgcHJlc2VudGF0aW9uIHRpbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJlY2lzZSAgIFdoZXRoZXIgZ2V0dGluZyBhIHByZWNpc2UgdGltZSBpcyBpbXBvcnRhbnQuIFRoaXMgaXMKLSAgICAgKiAgICAgICAgICAgICAgICAgIG1vcmUgY29zdGx5LgotICAgICAqIEBwYXJhbSBtb25vdG9uaWMgV2hldGhlciByZXR1cm5lZCB0aW1lIHNob3VsZCBiZSBtb25vdG9uaWM6IHRoYXQgaXMsCi0gICAgICogICAgICAgICAgICAgICAgICBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGxhc3QgcmV0dXJuZWQgdGltZS4gIERvbid0Ci0gICAgICogICAgICAgICAgICAgICAgICBhbHdheXMgc2V0IHRoaXMgdG8gdHJ1ZS4gIEUuZy4gdGhpcyBoYXMgdW5kZXNpcmVkCi0gICAgICogICAgICAgICAgICAgICAgICBjb25zZXF1ZW5jZXMgaWYgdGhlIG1lZGlhIGlzIHNlZWtlZCBiZXR3ZWVuIGNhbGxzLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBtZWRpYSBpcyBub3QgaW5pdGlhbGl6ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRDdXJyZW50VGltZVVzKGJvb2xlYW4gcHJlY2lzZSwgYm9vbGVhbiBtb25vdG9uaWMpCi0gICAgICAgICAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCi0gICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgT25NZWRpYVRpbWVMaXN0ZW5lciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgcmVnaXN0ZXJlZCB0aW1lIHdhcyByZWFjaGVkIG5hdHVyYWxseS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHRpbWVVcyBjdXJyZW50IG1lZGlhIHRpbWUKLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgb25UaW1lZEV2ZW50KGxvbmcgdGltZVVzKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIG1lZGlhIHRpbWUgY2hhbmdlZCBkdWUgdG8gc2Vla2luZy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHRpbWVVcyBjdXJyZW50IG1lZGlhIHRpbWUKLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgb25TZWVrKGxvbmcgdGltZVVzKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHBsYXliYWNrIHN0b3BwZWQuICBUaGlzIGlzIG5vdCBjYWxsZWQgb24gcGF1c2UsIG9ubHkKLSAgICAgICAgICogb24gZnVsbCBzdG9wLCBhdCB3aGljaCBwb2ludCB0aGVyZSBpcyBubyBmdXJ0aGVyIGN1cnJlbnQgbWVkaWEgdGltZS4KLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgb25TdG9wKCk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL1N1YnRpdGxlQ29udHJvbGxlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9TdWJ0aXRsZUNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRkNTVkNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL1N1YnRpdGxlQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRm9ybWF0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyLlRyYWNrSW5mbzsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkNhcHRpb25pbmdNYW5hZ2VyOwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGUuU3VidGl0bGVUcmFjay5SZW5kZXJpbmdXaWRnZXQ7Ci0KLS8vIE5vdGU6IFRoaXMgaXMgZm9ya2VkIGZyb20gYW5kcm9pZC5tZWRpYS5TdWJ0aXRsZUNvbnRyb2xsZXIgc2luY2UgUAotLyoqCi0gKiBUaGUgc3VidGl0bGUgY29udHJvbGxlciBwcm92aWRlcyB0aGUgYXJjaGl0ZWN0dXJlIHRvIGRpc3BsYXkgc3VidGl0bGVzIGZvciBhCi0gKiBtZWRpYSBzb3VyY2UuICBJdCBhbGxvd3Mgc3BlY2lmeWluZyB3aGljaCB0cmFja3MgdG8gZGlzcGxheSwgb24gd2hpY2ggYW5jaG9yCi0gKiB0byBkaXNwbGF5IHRoZW0sIGFuZCBhbHNvIGFsbG93cyBhZGRpbmcgZXh0ZXJuYWwsIG91dC1vZi1iYW5kIHN1YnRpdGxlIHRyYWNrcy4KLSAqLwotcHVibGljIGNsYXNzIFN1YnRpdGxlQ29udHJvbGxlciB7Ci0gICAgcHJpdmF0ZSBNZWRpYVRpbWVQcm92aWRlciBtVGltZVByb3ZpZGVyOwotICAgIHByaXZhdGUgVmVjdG9yPFJlbmRlcmVyPiBtUmVuZGVyZXJzOwotICAgIHByaXZhdGUgVmVjdG9yPFN1YnRpdGxlVHJhY2s+IG1UcmFja3M7Ci0gICAgcHJpdmF0ZSBTdWJ0aXRsZVRyYWNrIG1TZWxlY3RlZFRyYWNrOwotICAgIHByaXZhdGUgYm9vbGVhbiBtU2hvd2luZzsKLSAgICBwcml2YXRlIENhcHRpb25pbmdNYW5hZ2VyIG1DYXB0aW9uaW5nTWFuYWdlcjsKLSAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0hBVF9TSE9XID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0hBVF9ISURFID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0hBVF9TRUxFQ1RfVFJBQ0sgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXSEFUX1NFTEVDVF9ERUZBVUxUX1RSQUNLID0gNDsKLQotICAgIHByaXZhdGUgZmluYWwgSGFuZGxlci5DYWxsYmFjayBtQ2FsbGJhY2sgPSBuZXcgSGFuZGxlci5DYWxsYmFjaygpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgIGNhc2UgV0hBVF9TSE9XOgotICAgICAgICAgICAgICAgIGRvU2hvdygpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgY2FzZSBXSEFUX0hJREU6Ci0gICAgICAgICAgICAgICAgZG9IaWRlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBjYXNlIFdIQVRfU0VMRUNUX1RSQUNLOgotICAgICAgICAgICAgICAgIGRvU2VsZWN0VHJhY2soKFN1YnRpdGxlVHJhY2spbXNnLm9iaik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBjYXNlIFdIQVRfU0VMRUNUX0RFRkFVTFRfVFJBQ0s6Ci0gICAgICAgICAgICAgICAgZG9TZWxlY3REZWZhdWx0VHJhY2soKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgQ2FwdGlvbmluZ01hbmFnZXIuQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyIG1DYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIgPQotICAgICAgICBuZXcgQ2FwdGlvbmluZ01hbmFnZXIuQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVuYWJsZWRDaGFuZ2VkKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICAgICAgICAgIHNlbGVjdERlZmF1bHRUcmFjaygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uTG9jYWxlQ2hhbmdlZChMb2NhbGUgbG9jYWxlKSB7Ci0gICAgICAgICAgICAgICAgc2VsZWN0RGVmYXVsdFRyYWNrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICBwdWJsaWMgU3VidGl0bGVDb250cm9sbGVyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBzdWJ0aXRsZSBjb250cm9sbGVyIGZvciBhIG1lZGlhIHBsYXliYWNrIG9iamVjdCB0aGF0IGltcGxlbWVudHMKLSAgICAgKiB0aGUgTWVkaWFUaW1lUHJvdmlkZXIgaW50ZXJmYWNlLgotICAgICAqCi0gICAgICogQHBhcmFtIHRpbWVQcm92aWRlcgotICAgICAqLwotICAgIHB1YmxpYyBTdWJ0aXRsZUNvbnRyb2xsZXIoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICBNZWRpYVRpbWVQcm92aWRlciB0aW1lUHJvdmlkZXIsCi0gICAgICAgICAgICBMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBtVGltZVByb3ZpZGVyID0gdGltZVByb3ZpZGVyOwotICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQotICAgICAgICBtUmVuZGVyZXJzID0gbmV3IFZlY3RvcjxSZW5kZXJlcj4oKTsKLSAgICAgICAgbVNob3dpbmcgPSBmYWxzZTsKLSAgICAgICAgbVRyYWNrcyA9IG5ldyBWZWN0b3I8U3VidGl0bGVUcmFjaz4oKTsKLSAgICAgICAgbUNhcHRpb25pbmdNYW5hZ2VyID0KLSAgICAgICAgICAgIChDYXB0aW9uaW5nTWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DQVBUSU9OSU5HX1NFUlZJQ0UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIG1DYXB0aW9uaW5nTWFuYWdlci5yZW1vdmVDYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgbUNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgICAgIHN1cGVyLmZpbmFsaXplKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgYXZhaWxhYmxlIHN1YnRpdGxlIHRyYWNrcyBmb3IgdGhpcyBtZWRpYS4gVGhlc2UgaW5jbHVkZQotICAgICAqIHRoZSB0cmFja3MgZm91bmQgYnkge0BsaW5rIE1lZGlhUGxheWVyfSBhcyB3ZWxsIGFzIGFueSB0cmFja3MgYWRkZWQKLSAgICAgKiBtYW51YWxseSB2aWEge0BsaW5rICNhZGRUcmFja30uCi0gICAgICovCi0gICAgcHVibGljIFN1YnRpdGxlVHJhY2tbXSBnZXRUcmFja3MoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtVHJhY2tzKSB7Ci0gICAgICAgICAgICBTdWJ0aXRsZVRyYWNrW10gdHJhY2tzID0gbmV3IFN1YnRpdGxlVHJhY2tbbVRyYWNrcy5zaXplKCldOwotICAgICAgICAgICAgbVRyYWNrcy50b0FycmF5KHRyYWNrcyk7Ci0gICAgICAgICAgICByZXR1cm4gdHJhY2tzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHN1YnRpdGxlIHRyYWNrCi0gICAgICovCi0gICAgcHVibGljIFN1YnRpdGxlVHJhY2sgZ2V0U2VsZWN0ZWRUcmFjaygpIHsKLSAgICAgICAgcmV0dXJuIG1TZWxlY3RlZFRyYWNrOwotICAgIH0KLQotICAgIHByaXZhdGUgUmVuZGVyaW5nV2lkZ2V0IGdldFJlbmRlcmluZ1dpZGdldCgpIHsKLSAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtU2VsZWN0ZWRUcmFjay5nZXRSZW5kZXJpbmdXaWRnZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWxlY3RzIGEgc3VidGl0bGUgdHJhY2suICBBcyBhIHJlc3VsdCwgdGhpcyB0cmFjayB3aWxsIHJlY2VpdmUKLSAgICAgKiBpbi1iYW5kIGRhdGEgZnJvbSB0aGUge0BsaW5rIE1lZGlhUGxheWVyfS4gIEhvd2V2ZXIsIHRoaXMgZG9lcwotICAgICAqIG5vdCBjaGFuZ2UgdGhlIHN1YnRpdGxlIHZpc2liaWxpdHkuCi0gICAgICoKLSAgICAgKiBTaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIGFuY2hvcidzIChVSSkgdGhyZWFkLiB7QHNlZSAjQW5jaG9yLmdldFN1YnRpdGxlTG9vcGVyfQotICAgICAqCi0gICAgICogQHBhcmFtIHRyYWNrIFRoZSBzdWJ0aXRsZSB0cmFjayB0byBzZWxlY3QuICBUaGlzIG11c3QgYmUgb25lIG9mIHRoZQotICAgICAqICAgICAgICAgICAgICB0cmFja3MgaW4ge0BsaW5rICNnZXRUcmFja3N9LgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdHJhY2sgd2FzIHN1Y2Nlc3NmdWxseSBzZWxlY3RlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3RUcmFjayhTdWJ0aXRsZVRyYWNrIHRyYWNrKSB7Ci0gICAgICAgIGlmICh0cmFjayAhPSBudWxsICYmICFtVHJhY2tzLmNvbnRhaW5zKHRyYWNrKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvY2Vzc09uQW5jaG9yKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoV0hBVF9TRUxFQ1RfVFJBQ0ssIHRyYWNrKSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb1NlbGVjdFRyYWNrKFN1YnRpdGxlVHJhY2sgdHJhY2spIHsKLSAgICAgICAgbVRyYWNrSXNFeHBsaWNpdCA9IHRydWU7Ci0gICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayA9PSB0cmFjaykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLmhpZGUoKTsKLSAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLnNldFRpbWVQcm92aWRlcihudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1TZWxlY3RlZFRyYWNrID0gdHJhY2s7Ci0gICAgICAgIGlmIChtQW5jaG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1BbmNob3Iuc2V0U3VidGl0bGVXaWRnZXQoZ2V0UmVuZGVyaW5nV2lkZ2V0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLnNldFRpbWVQcm92aWRlcihtVGltZVByb3ZpZGVyKTsKLSAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLnNob3coKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUxpc3RlbmVyLm9uU3VidGl0bGVUcmFja1NlbGVjdGVkKHRyYWNrKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgc3VidGl0bGUgdHJhY2sgYmFzZWQgb24gc3lzdGVtIHByZWZlcmVuY2VzLCBvciBudWxsLAotICAgICAqIGlmIG5vIHN1Y2ggdHJhY2sgZXhpc3RzIGluIHRoaXMgbWFuYWdlci4KLSAgICAgKgotICAgICAqIFN1cHBvcnRzIEhMUy1mbGFnczogQVVUT1NFTEVDVCwgRk9SQ0VEICYgREVGQVVMVC4KLSAgICAgKgotICAgICAqIDEuIElmIGNhcHRpb25pbmcgaXMgZGlzYWJsZWQsIG9ubHkgY29uc2lkZXIgRk9SQ0VEIHRyYWNrcy4gT3RoZXJ3aXNlLAotICAgICAqIGNvbnNpZGVyIGFsbCB0cmFja3MsIGJ1dCBwcmVmZXIgbm9uLUZPUkNFRCBvbmVzLgotICAgICAqIDIuIElmIHVzZXIgc2VsZWN0ZWQgIkRlZmF1bHQiIGNhcHRpb24gbGFuZ3VhZ2U6Ci0gICAgICogICBhLiBJZiB0aGVyZSBpcyBhIGNvbnNpZGVyZWQgdHJhY2sgd2l0aCBERUZBVUxUPXllcywgcmV0dXJucyB0aGF0IHRyYWNrCi0gICAgICogICAgICAoZmF2b3IgdGhlIGZpcnN0IG9uZSBpbiB0aGUgY3VycmVudCBsYW5ndWFnZSBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuCi0gICAgICogICAgICBvbmUgZGVmYXVsdCB0cmFja3MsIG9yIHRoZSBmaXJzdCBpbiBnZW5lcmFsIGlmIG5vbmUgb2YgdGhlbSBhcmUgaW4KLSAgICAgKiAgICAgIHRoZSBjdXJyZW50IGxhbmd1YWdlKS4KLSAgICAgKiAgIGIuIE90aGVyd2lzZSwgaWYgdGhlcmUgaXMgYSB0cmFjayB3aXRoIEFVVE9TRUxFQ1Q9eWVzIGluIHRoZSBjdXJyZW50Ci0gICAgICogICAgICBsYW5ndWFnZSwgcmV0dXJuIHRoYXQgb25lLgotICAgICAqICAgYy4gSWYgdGhlcmUgYXJlIG5vIGRlZmF1bHQgdHJhY2tzLCBhbmQgbm8gYXV0b3NlbGVjdGFibGUgdHJhY2tzIGluIHRoZQotICAgICAqICAgICAgY3VycmVudCBsYW5ndWFnZSwgcmV0dXJuIG51bGwuCi0gICAgICogMy4gSWYgdGhlcmUgaXMgYSB0cmFjayB3aXRoIHRoZSBjYXB0aW9uIGxhbmd1YWdlLCBzZWxlY3QgdGhhdCBvbmUuICBQcmVmZXIKLSAgICAgKiB0aGUgb25lIHdpdGggQVVUT1NFTEVDVD1uby4KLSAgICAgKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlc2UgZmxhZ3MgYXJlIERFRkFVTFQ9bm8sIEFVVE9TRUxFQ1Q9eWVzCi0gICAgICogYW5kIEZPUkNFRD1uby4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3VidGl0bGVUcmFjayBnZXREZWZhdWx0VHJhY2soKSB7Ci0gICAgICAgIFN1YnRpdGxlVHJhY2sgYmVzdFRyYWNrID0gbnVsbDsKLSAgICAgICAgaW50IGJlc3RTY29yZSA9IC0xOwotCi0gICAgICAgIExvY2FsZSBzZWxlY3RlZExvY2FsZSA9IG1DYXB0aW9uaW5nTWFuYWdlci5nZXRMb2NhbGUoKTsKLSAgICAgICAgTG9jYWxlIGxvY2FsZSA9IHNlbGVjdGVkTG9jYWxlOwotICAgICAgICBpZiAobG9jYWxlID09IG51bGwpIHsKLSAgICAgICAgICAgIGxvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiBzZWxlY3RGb3JjZWQgPSAhbUNhcHRpb25pbmdNYW5hZ2VyLmlzRW5hYmxlZCgpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVHJhY2tzKSB7Ci0gICAgICAgICAgICBmb3IgKFN1YnRpdGxlVHJhY2sgdHJhY2s6IG1UcmFja3MpIHsKLSAgICAgICAgICAgICAgICBNZWRpYUZvcm1hdCBmb3JtYXQgPSB0cmFjay5nZXRGb3JtYXQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbGFuZ3VhZ2UgPSBmb3JtYXQuZ2V0U3RyaW5nKE1lZGlhRm9ybWF0LktFWV9MQU5HVUFHRSk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBmb3JjZWQgPQotICAgICAgICAgICAgICAgICAgICBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfSVNfRk9SQ0VEX1NVQlRJVExFLCAwKSAhPSAwOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gYXV0b3NlbGVjdCA9Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9JU19BVVRPU0VMRUNULCAxKSAhPSAwOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNfZGVmYXVsdCA9Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9JU19ERUZBVUxULCAwKSAhPSAwOwotCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBsYW5ndWFnZU1hdGNoZXMgPQotICAgICAgICAgICAgICAgICAgICAobG9jYWxlID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxlLmdldExhbmd1YWdlKCkuZXF1YWxzKCIiKSB8fAotICAgICAgICAgICAgICAgICAgICBsb2NhbGUuZ2V0SVNPM0xhbmd1YWdlKCkuZXF1YWxzKGxhbmd1YWdlKSB8fAotICAgICAgICAgICAgICAgICAgICBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKS5lcXVhbHMobGFuZ3VhZ2UpKTsKLSAgICAgICAgICAgICAgICAvLyBpc19kZWZhdWx0IGlzIG1lYW5pbmdsZXNzIHVubGVzcyBjYXB0aW9uIGxhbmd1YWdlIGlzICdkZWZhdWx0JwotICAgICAgICAgICAgICAgIGludCBzY29yZSA9IChmb3JjZWQgPyAwIDogOCkgKwotICAgICAgICAgICAgICAgICAgICAoKChzZWxlY3RlZExvY2FsZSA9PSBudWxsKSAmJiBpc19kZWZhdWx0KSA/IDQgOiAwKSArCi0gICAgICAgICAgICAgICAgICAgIChhdXRvc2VsZWN0ID8gMCA6IDIpICsgKGxhbmd1YWdlTWF0Y2hlcyA/IDEgOiAwKTsKLQotICAgICAgICAgICAgICAgIGlmIChzZWxlY3RGb3JjZWQgJiYgIWZvcmNlZCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyB3ZSB0cmVhdCBudWxsIGxvY2FsZS9sYW5ndWFnZSBhcyBtYXRjaGluZyBhbnkgbGFuZ3VhZ2UKLSAgICAgICAgICAgICAgICBpZiAoKHNlbGVjdGVkTG9jYWxlID09IG51bGwgJiYgaXNfZGVmYXVsdCkgfHwKLSAgICAgICAgICAgICAgICAgICAgKGxhbmd1YWdlTWF0Y2hlcyAmJgotICAgICAgICAgICAgICAgICAgICAgKGF1dG9zZWxlY3QgfHwgZm9yY2VkIHx8IHNlbGVjdGVkTG9jYWxlICE9IG51bGwpKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcmUgPiBiZXN0U2NvcmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RTY29yZSA9IHNjb3JlOwotICAgICAgICAgICAgICAgICAgICAgICAgYmVzdFRyYWNrID0gdHJhY2s7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJlc3RUcmFjazsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbVRyYWNrSXNFeHBsaWNpdCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtVmlzaWJpbGl0eUlzRXhwbGljaXQgPSBmYWxzZTsKLQotICAgIC8qKiBzaG91bGQgYmUgY2FsbGVkIGZyb20gYW5jaG9yIHRocmVhZCAqLwotICAgIHB1YmxpYyB2b2lkIHNlbGVjdERlZmF1bHRUcmFjaygpIHsKLSAgICAgICAgcHJvY2Vzc09uQW5jaG9yKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoV0hBVF9TRUxFQ1RfREVGQVVMVF9UUkFDSykpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb1NlbGVjdERlZmF1bHRUcmFjaygpIHsKLSAgICAgICAgaWYgKG1UcmFja0lzRXhwbGljaXQpIHsKLSAgICAgICAgICAgIC8vIElmIHRyYWNrIHNlbGVjdGlvbiBpcyBleHBsaWNpdCwgYnV0IHZpc2liaWxpdHkKLSAgICAgICAgICAgIC8vIGlzIG5vdCwgaXQgZmFsbHMgYmFjayB0byB0aGUgY2FwdGlvbmluZyBzZXR0aW5nCi0gICAgICAgICAgICBpZiAoIW1WaXNpYmlsaXR5SXNFeHBsaWNpdCkgewotICAgICAgICAgICAgICAgIGlmIChtQ2FwdGlvbmluZ01hbmFnZXIuaXNFbmFibGVkKCkgfHwKLSAgICAgICAgICAgICAgICAgICAgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLmdldEZvcm1hdCgpLmdldEludGVnZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFGb3JtYXQuS0VZX0lTX0ZPUkNFRF9TVUJUSVRMRSwgMCkgIT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2hvdygpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVNlbGVjdGVkVHJhY2sgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbVNlbGVjdGVkVHJhY2suZ2V0VHJhY2tUeXBlKCkgPT0gVHJhY2tJbmZvLk1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgaGlkZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtVmlzaWJpbGl0eUlzRXhwbGljaXQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdlIGNhbiBoYXZlIGEgZGVmYXVsdCAoZm9yY2VkKSB0cmFjayBldmVuIGlmIGNhcHRpb25pbmcKLSAgICAgICAgLy8gaXMgbm90IGVuYWJsZWQuICBUaGlzIGlzIGhhbmRsZWQgYnkgZ2V0RGVmYXVsdFRyYWNrKCkuCi0gICAgICAgIC8vIFNob3cgdGhpcyB0cmFjayB1bmxlc3Mgc3VidGl0bGVzIHdlcmUgZXhwbGljaXRseSBoaWRkZW4uCi0gICAgICAgIFN1YnRpdGxlVHJhY2sgdHJhY2sgPSBnZXREZWZhdWx0VHJhY2soKTsKLSAgICAgICAgaWYgKHRyYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlbGVjdFRyYWNrKHRyYWNrKTsKLSAgICAgICAgICAgIG1UcmFja0lzRXhwbGljaXQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmICghbVZpc2liaWxpdHlJc0V4cGxpY2l0KSB7Ci0gICAgICAgICAgICAgICAgc2hvdygpOwotICAgICAgICAgICAgICAgIG1WaXNpYmlsaXR5SXNFeHBsaWNpdCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIG11c3QgYmUgY2FsbGVkIGZyb20gYW5jaG9yIHRocmVhZCAqLwotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgICBjaGVja0FuY2hvckxvb3BlcigpOwotICAgICAgICBoaWRlKCk7Ci0gICAgICAgIHNlbGVjdFRyYWNrKG51bGwpOwotICAgICAgICBtVHJhY2tzLmNsZWFyKCk7Ci0gICAgICAgIG1UcmFja0lzRXhwbGljaXQgPSBmYWxzZTsKLSAgICAgICAgbVZpc2liaWxpdHlJc0V4cGxpY2l0ID0gZmFsc2U7Ci0gICAgICAgIG1DYXB0aW9uaW5nTWFuYWdlci5yZW1vdmVDYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgbUNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIG5ldywgZXh0ZXJuYWwgc3VidGl0bGUgdHJhY2sgdG8gdGhlIG1hbmFnZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZm9ybWF0IHRoZSBmb3JtYXQgb2YgdGhlIHRyYWNrIHRoYXQgd2lsbCBpbmNsdWRlIGF0IGxlYXN0Ci0gICAgICogICAgICAgICAgICAgICB0aGUgTUlNRSB0eXBlIHtAbGluayBNZWRpYUZvcm1hdEBLRVlfTUlNRX0uCi0gICAgICogQHJldHVybiB0aGUgY3JlYXRlZCB7QGxpbmsgU3VidGl0bGVUcmFja30gb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIFN1YnRpdGxlVHJhY2sgYWRkVHJhY2soTWVkaWFGb3JtYXQgZm9ybWF0KSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtUmVuZGVyZXJzKSB7Ci0gICAgICAgICAgICBmb3IgKFJlbmRlcmVyIHJlbmRlcmVyOiBtUmVuZGVyZXJzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlbmRlcmVyLnN1cHBvcnRzKGZvcm1hdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3VidGl0bGVUcmFjayB0cmFjayA9IHJlbmRlcmVyLmNyZWF0ZVRyYWNrKGZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0cmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQobVRyYWNrcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVHJhY2tzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYXB0aW9uaW5nTWFuYWdlci5hZGRDYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja3MuYWRkKHRyYWNrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFjazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG93IHRoZSBzZWxlY3RlZCAob3IgZGVmYXVsdCkgc3VidGl0bGUgdHJhY2suCi0gICAgICoKLSAgICAgKiBTaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIGFuY2hvcidzIChVSSkgdGhyZWFkLiB7QHNlZSAjQW5jaG9yLmdldFN1YnRpdGxlTG9vcGVyfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNob3coKSB7Ci0gICAgICAgIHByb2Nlc3NPbkFuY2hvcihtSGFuZGxlci5vYnRhaW5NZXNzYWdlKFdIQVRfU0hPVykpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb1Nob3coKSB7Ci0gICAgICAgIG1TaG93aW5nID0gdHJ1ZTsKLSAgICAgICAgbVZpc2liaWxpdHlJc0V4cGxpY2l0ID0gdHJ1ZTsKLSAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLnNob3coKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhpZGUgdGhlIHNlbGVjdGVkIChvciBkZWZhdWx0KSBzdWJ0aXRsZSB0cmFjay4KLSAgICAgKgotICAgICAqIFNob3VsZCBiZSBjYWxsZWQgZnJvbSB0aGUgYW5jaG9yJ3MgKFVJKSB0aHJlYWQuIHtAc2VlICNBbmNob3IuZ2V0U3VidGl0bGVMb29wZXJ9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgaGlkZSgpIHsKLSAgICAgICAgcHJvY2Vzc09uQW5jaG9yKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoV0hBVF9ISURFKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvSGlkZSgpIHsKLSAgICAgICAgbVZpc2liaWxpdHlJc0V4cGxpY2l0ID0gdHJ1ZTsKLSAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLmhpZGUoKTsKLSAgICAgICAgfQotICAgICAgICBtU2hvd2luZyA9IGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZSBmb3Igc3VwcG9ydGluZyBhIHNpbmdsZSBvciBtdWx0aXBsZSBzdWJ0aXRsZSB0eXBlcyBpbiB7QGxpbmsKLSAgICAgKiBNZWRpYVBsYXllcn0uCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBSZW5kZXJlciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgYnkge0BsaW5rIE1lZGlhUGxheWVyfSdzIHtAbGluayBTdWJ0aXRsZUNvbnRyb2xsZXJ9IHdoZW4gYSBuZXcKLSAgICAgICAgICogc3VidGl0bGUgdHJhY2sgaXMgZGV0ZWN0ZWQsIHRvIHNlZSBpZiBpdCBzaG91bGQgdXNlIHRoaXMgb2JqZWN0IHRvCi0gICAgICAgICAqIHBhcnNlIGFuZCBkaXNwbGF5IHRoaXMgc3VidGl0bGUgdHJhY2suCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBmb3JtYXQgdGhlIGZvcm1hdCBvZiB0aGUgdHJhY2sgdGhhdCB3aWxsIGluY2x1ZGUgYXQgbGVhc3QKLSAgICAgICAgICogICAgICAgICAgICAgICB0aGUgTUlNRSB0eXBlIHtAbGluayBNZWRpYUZvcm1hdEBLRVlfTUlNRX0uCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgdHJhY2sgZm9ybWF0IGlzIHN1cHBvcnRlZCBieSB0aGlzCi0gICAgICAgICAqIHJlbmRlcmVyCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0cyhNZWRpYUZvcm1hdCBmb3JtYXQpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgYnkge0BsaW5rIE1lZGlhUGxheWVyfSdzIHtAbGluayBTdWJ0aXRsZUNvbnRyb2xsZXJ9IGZvciBlYWNoCi0gICAgICAgICAqIHN1YnRpdGxlIHRyYWNrIHRoYXQgd2FzIGRldGVjdGVkIGFuZCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBvYmplY3QgdG8KLSAgICAgICAgICogY3JlYXRlIGEge0BsaW5rIFN1YnRpdGxlVHJhY2t9IG9iamVjdC4gIFRoaXMgb2JqZWN0IHdpbGwgYmUgY3JlYXRlZAotICAgICAgICAgKiBmb3IgZWFjaCB0cmFjayB0aGF0IHdhcyBmb3VuZC4gIElmIHRoZSB0cmFjayBpcyBzZWxlY3RlZCBmb3IgZGlzcGxheSwKLSAgICAgICAgICogdGhpcyBvYmplY3Qgd2lsbCBiZSB1c2VkIHRvIHBhcnNlIGFuZCBkaXNwbGF5IHRoZSB0cmFjayBkYXRhLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZm9ybWF0IHRoZSBmb3JtYXQgb2YgdGhlIHRyYWNrIHRoYXQgd2lsbCBpbmNsdWRlIGF0IGxlYXN0Ci0gICAgICAgICAqICAgICAgICAgICAgICAgdGhlIE1JTUUgdHlwZSB7QGxpbmsgTWVkaWFGb3JtYXRAS0VZX01JTUV9LgotICAgICAgICAgKiBAcmV0dXJuIGEge0BsaW5rIFN1YnRpdGxlVHJhY2t9IG9iamVjdCB0aGF0IHdpbGwgYmUgdXNlZCB0byBwYXJzZQotICAgICAgICAgKiBhbmQgcmVuZGVyIHRoZSBzdWJ0aXRsZSB0cmFjay4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBhYnN0cmFjdCBTdWJ0aXRsZVRyYWNrIGNyZWF0ZVRyYWNrKE1lZGlhRm9ybWF0IGZvcm1hdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIHN1cHBvcnQgZm9yIGEgc3VidGl0bGUgZm9ybWF0IGluIHtAbGluayBNZWRpYVBsYXllcn0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVuZGVyZXIgYSB7QGxpbmsgU3VidGl0bGVDb250cm9sbGVyLlJlbmRlcmVyfSBvYmplY3QgdGhhdCBhZGRzCi0gICAgICogICAgICAgICAgICAgICAgIHN1cHBvcnQgZm9yIGEgc3VidGl0bGUgZm9ybWF0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyUmVuZGVyZXIoUmVuZGVyZXIgcmVuZGVyZXIpIHsKLSAgICAgICAgc3luY2hyb25pemVkKG1SZW5kZXJlcnMpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gaG93IHRvIGdldCBhdmFpbGFibGUgcmVuZGVyZXJzIGluIHRoZSBzeXN0ZW0KLSAgICAgICAgICAgIGlmICghbVJlbmRlcmVycy5jb250YWlucyhyZW5kZXJlcikpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIHNob3VsZCBhZGRlZCByZW5kZXJlcnMgb3ZlcnJpZGUgZXhpc3Rpbmcgb25lcyAodG8gYWxsb3cgcmVwbGFjaW5nPykKLSAgICAgICAgICAgICAgICBtUmVuZGVyZXJzLmFkZChyZW5kZXJlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNSZW5kZXJlckZvcihNZWRpYUZvcm1hdCBmb3JtYXQpIHsKLSAgICAgICAgc3luY2hyb25pemVkKG1SZW5kZXJlcnMpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gaG93IHRvIGdldCBhdmFpbGFibGUgcmVuZGVyZXJzIGluIHRoZSBzeXN0ZW0KLSAgICAgICAgICAgIGZvciAoUmVuZGVyZXIgcmVuZGVyZXI6IG1SZW5kZXJlcnMpIHsKLSAgICAgICAgICAgICAgICBpZiAocmVuZGVyZXIuc3VwcG9ydHMoZm9ybWF0KSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdWJ0aXRsZSBhbmNob3IsIGFuIG9iamVjdCB0aGF0IGlzIGFibGUgdG8gZGlzcGxheSBhIHN1YnRpdGxlIHJlbmRlcmVyLAotICAgICAqIGUuZy4gYSBWaWRlb1ZpZXcuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBBbmNob3IgewotICAgICAgICAvKioKLSAgICAgICAgICogQW5jaG9yIHNob3VsZCB1c2UgdGhlIHN1cHBsaWVkIHN1YnRpdGxlIHJlbmRlcmluZyB3aWRnZXQsIG9yCi0gICAgICAgICAqIG5vbmUgaWYgaXQgaXMgbnVsbC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFN1YnRpdGxlV2lkZ2V0KFJlbmRlcmluZ1dpZGdldCBzdWJ0aXRsZVdpZGdldCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuY2hvcnMgcHJvdmlkZSB0aGUgbG9vcGVyIG9uIHdoaWNoIGFsbCB0cmFjayB2aXNpYmlsaXR5IGNoYW5nZXMKLSAgICAgICAgICogKHRyYWNrLnNob3cvaGlkZSwgc2V0U3VidGl0bGVXaWRnZXQpIHdpbGwgdGFrZSBwbGFjZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBMb29wZXIgZ2V0U3VidGl0bGVMb29wZXIoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEFuY2hvciBtQW5jaG9yOwotCi0gICAgLyoqCi0gICAgICogIGNhbGxlZCBmcm9tIGFuY2hvcidzIGxvb3BlciAoaWYgYW55LCBib3RoIHdoZW4gdW5zZXR0aW5nIGFuZAotICAgICAqICBzZXR0aW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFuY2hvcihBbmNob3IgYW5jaG9yKSB7Ci0gICAgICAgIGlmIChtQW5jaG9yID09IGFuY2hvcikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1BbmNob3IgIT0gbnVsbCkgewotICAgICAgICAgICAgY2hlY2tBbmNob3JMb29wZXIoKTsKLSAgICAgICAgICAgIG1BbmNob3Iuc2V0U3VidGl0bGVXaWRnZXQobnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUFuY2hvciA9IGFuY2hvcjsKLSAgICAgICAgbUhhbmRsZXIgPSBudWxsOwotICAgICAgICBpZiAobUFuY2hvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKG1BbmNob3IuZ2V0U3VidGl0bGVMb29wZXIoKSwgbUNhbGxiYWNrKTsKLSAgICAgICAgICAgIGNoZWNrQW5jaG9yTG9vcGVyKCk7Ci0gICAgICAgICAgICBtQW5jaG9yLnNldFN1YnRpdGxlV2lkZ2V0KGdldFJlbmRlcmluZ1dpZGdldCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja0FuY2hvckxvb3BlcigpIHsKLSAgICAgICAgYXNzZXJ0IG1IYW5kbGVyICE9IG51bGwgOiAiU2hvdWxkIGhhdmUgYSBsb29wZXIgYWxyZWFkeSI7Ci0gICAgICAgIGFzc2VydCBMb29wZXIubXlMb29wZXIoKSA9PSBtSGFuZGxlci5nZXRMb29wZXIoKQotICAgICAgICAgICAgICAgIDogIk11c3QgYmUgY2FsbGVkIGZyb20gdGhlIGFuY2hvcidzIGxvb3BlciI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NPbkFuY2hvcihNZXNzYWdlIG0pIHsKLSAgICAgICAgYXNzZXJ0IG1IYW5kbGVyICE9IG51bGwgOiAiU2hvdWxkIGhhdmUgYSBsb29wZXIgYWxyZWFkeSI7Ci0gICAgICAgIGlmIChMb29wZXIubXlMb29wZXIoKSA9PSBtSGFuZGxlci5nZXRMb29wZXIoKSkgewotICAgICAgICAgICAgbUhhbmRsZXIuZGlzcGF0Y2hNZXNzYWdlKG0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50ZXJmYWNlIExpc3RlbmVyIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgc3VidGl0bGUgdHJhY2sgaGFzIGJlZW4gc2VsZWN0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB0cmFjayBzZWxlY3RlZCBzdWJ0aXRsZSB0cmFjayBvciBudWxsCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblN1YnRpdGxlVHJhY2tTZWxlY3RlZChTdWJ0aXRsZVRyYWNrIHRyYWNrKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3RlbmVyIG1MaXN0ZW5lcjsKLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvU3VidGl0bGVUcmFjay5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9TdWJ0aXRsZVRyYWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiOTA2NGEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9TdWJ0aXRsZVRyYWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZTsKLQotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFGb3JtYXQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjIuVHJhY2tJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU3VidGl0bGVEYXRhOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb25nU3BhcnNlQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vLyBOb3RlOiBUaGlzIGlzIGZvcmtlZCBmcm9tIGFuZHJvaWQubWVkaWEuU3VidGl0bGVUcmFjayBzaW5jZSBQCi0vKioKLSAqIEEgc3VidGl0bGUgdHJhY2sgYWJzdHJhY3QgYmFzZSBjbGFzcyB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciBwYXJzaW5nIGFuZCBkaXNwbGF5aW5nCi0gKiBhbiBpbnN0YW5jZSBvZiBhIHBhcnRpY3VsYXIgdHlwZSBvZiBzdWJ0aXRsZS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFN1YnRpdGxlVHJhY2sgaW1wbGVtZW50cyBNZWRpYVRpbWVQcm92aWRlci5Pbk1lZGlhVGltZUxpc3RlbmVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlN1YnRpdGxlVHJhY2siOwotICAgIHByaXZhdGUgbG9uZyBtTGFzdFVwZGF0ZVRpbWVNczsKLSAgICBwcml2YXRlIGxvbmcgbUxhc3RUaW1lTXM7Ci0KLSAgICBwcml2YXRlIFJ1bm5hYmxlIG1SdW5uYWJsZTsKLQotICAgIGZpbmFsIHByaXZhdGUgTG9uZ1NwYXJzZUFycmF5PFJ1bj4gbVJ1bnNCeUVuZFRpbWUgPSBuZXcgTG9uZ1NwYXJzZUFycmF5PFJ1bj4oKTsKLSAgICBmaW5hbCBwcml2YXRlIExvbmdTcGFyc2VBcnJheTxSdW4+IG1SdW5zQnlJRCA9IG5ldyBMb25nU3BhcnNlQXJyYXk8UnVuPigpOwotCi0gICAgcHJpdmF0ZSBDdWVMaXN0IG1DdWVzOwotICAgIGZpbmFsIHByaXZhdGUgVmVjdG9yPEN1ZT4gbUFjdGl2ZUN1ZXMgPSBuZXcgVmVjdG9yPEN1ZT4oKTsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtVmlzaWJsZTsKLQotICAgIHB1YmxpYyBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0KLSAgICBwcm90ZWN0ZWQgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7Ci0KLSAgICBwcml2YXRlIE1lZGlhRm9ybWF0IG1Gb3JtYXQ7Ci0KLSAgICBwdWJsaWMgU3VidGl0bGVUcmFjayhNZWRpYUZvcm1hdCBmb3JtYXQpIHsKLSAgICAgICAgbUZvcm1hdCA9IGZvcm1hdDsKLSAgICAgICAgbUN1ZXMgPSBuZXcgQ3VlTGlzdCgpOwotICAgICAgICBjbGVhckFjdGl2ZUN1ZXMoKTsKLSAgICAgICAgbUxhc3RUaW1lTXMgPSAtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgTWVkaWFGb3JtYXQgZ2V0Rm9ybWF0KCkgewotICAgICAgICByZXR1cm4gbUZvcm1hdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGxvbmcgbU5leHRTY2hlZHVsZWRUaW1lTXMgPSAtMTsKLQotICAgIHB1YmxpYyB2b2lkIG9uRGF0YShTdWJ0aXRsZURhdGEgZGF0YSkgewotICAgICAgICBsb25nIHJ1bklEID0gZGF0YS5nZXRTdGFydFRpbWVVcygpICsgMTsKLSAgICAgICAgb25EYXRhKGRhdGEuZ2V0RGF0YSgpLCB0cnVlIC8qIGVvcyAqLywgcnVuSUQpOwotICAgICAgICBzZXRSdW5EaXNjYXJkVGltZU1zKAotICAgICAgICAgICAgICAgIHJ1bklELAotICAgICAgICAgICAgICAgIChkYXRhLmdldFN0YXJ0VGltZVVzKCkgKyBkYXRhLmdldER1cmF0aW9uVXMoKSkgLyAxMDAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGVyZSBpcyBpbnB1dCBkYXRhIGZvciB0aGUgc3VidGl0bGUgdHJhY2suICBUaGUKLSAgICAgKiBjb21wbGV0ZSBzdWJ0aXRsZSBmb3IgYSB0cmFjayBjYW4gaW5jbHVkZSBtdWx0aXBsZSB3aG9sZSB1bml0cwotICAgICAqIChydW5zKS4gIEVhY2ggb2YgdGhlc2UgdW5pdHMgY2FuIGhhdmUgbXVsdGlwbGUgc2VjdGlvbnMuICBUaGUKLSAgICAgKiBjb250ZW50cyBvZiBhIHJ1biBhcmUgc3VibWl0dGVkIGluIHNlcXVlbnRpYWwgb3JkZXIsIHdpdGggZW9zCi0gICAgICogaW5kaWNhdGluZyB0aGUgbGFzdCBzZWN0aW9uIG9mIHRoZSBydW4uICBDYWxscyBmcm9tIGRpZmZlcmVudAotICAgICAqIHJ1bnMgbXVzdCBub3QgYmUgaW50ZXJtaXhlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkYXRhIHN1YnRpdGxlIGRhdGEgYnl0ZSBidWZmZXIKLSAgICAgKiBAcGFyYW0gZW9zIHRydWUgaWYgdGhpcyBpcyB0aGUgbGFzdCBzZWN0aW9uIG9mIHRoZSBydW4uCi0gICAgICogQHBhcmFtIHJ1bklEIG1vc3RseS11bmlxdWUgSUQgZm9yIHRoaXMgcnVuIG9mIGRhdGEuICBTdWJ0aXRsZSBjdWVzCi0gICAgICogICAgICAgICAgICAgIHdpdGggcnVuSUQgb2YgMCBhcmUgZGlzY2FyZGVkIGltbWVkaWF0ZWx5IGFmdGVyCi0gICAgICogICAgICAgICAgICAgIGRpc3BsYXkuICBDdWVzIHdpdGggcnVuSUQgb2YgfjAgYXJlIGRpc2NhcmRlZAotICAgICAqICAgICAgICAgICAgICBvbmx5IGF0IHRoZSBkZWxldGlvbiBvZiB0aGUgdHJhY2sgb2JqZWN0LiAgQ3VlcwotICAgICAqICAgICAgICAgICAgICB3aXRoIG90aGVyIHJ1bklELXMgYXJlIGRpc2NhcmRlZCBhdCB0aGUgZW5kIG9mIHRoZQotICAgICAqICAgICAgICAgICAgICBydW4sIHdoaWNoIGRlZmF1bHRzIHRvIHRoZSBsYXRlc3QgdGltZXN0YW1wIG9mCi0gICAgICogICAgICAgICAgICAgIGFueSBvZiBpdHMgY3VlcyAod2l0aCB0aGlzIHJ1bklEKS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvbkRhdGEoYnl0ZVtdIGRhdGEsIGJvb2xlYW4gZW9zLCBsb25nIHJ1bklEKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIGFkZGluZyB0aGUgc3VidGl0bGUgcmVuZGVyaW5nIHdpZGdldCB0byB0aGUgdmlldyBoaWVyYXJjaHksCi0gICAgICogYXMgd2VsbCBhcyB3aGVuIHNob3dpbmcgb3IgaGlkaW5nIHRoZSBzdWJ0aXRsZSB0cmFjaywgb3Igd2hlbiB0aGUgdmlkZW8KLSAgICAgKiBzdXJmYWNlIHBvc2l0aW9uIGhhcyBjaGFuZ2VkLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgd2lkZ2V0IHRoYXQgcmVuZGVycyB0aGlzIHN1YnRpdGxlIHRyYWNrLiBGb3IgbW9zdCByZW5kZXJlcnMKLSAgICAgKiAgICAgICAgIHRoZXJlIHNob3VsZCBiZSBhIHNpbmdsZSBzaGFyZWQgaW5zdGFuY2UgdGhhdCBpcyB1c2VkIGZvciBhbGwKLSAgICAgKiAgICAgICAgIHRyYWNrcyBzdXBwb3J0ZWQgYnkgdGhhdCByZW5kZXJlciwgYXMgYXQgbW9zdCBvbmUgc3VidGl0bGUgdHJhY2sKLSAgICAgKiAgICAgICAgIGlzIHZpc2libGUgYXQgb25lIHRpbWUuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFJlbmRlcmluZ1dpZGdldCBnZXRSZW5kZXJpbmdXaWRnZXQoKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBhY3RpdmUgY3VlcyBoYXZlIGNoYW5nZWQsIGFuZCB0aGUgY29udGVudHMgb2YgdGhlIHN1YnRpdGxlCi0gICAgICogdmlldyBzaG91bGQgYmUgdXBkYXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGVWaWV3KFZlY3RvcjxDdWU+IGFjdGl2ZUN1ZXMpOwotCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHVwZGF0ZUFjdGl2ZUN1ZXMoYm9vbGVhbiByZWJ1aWxkLCBsb25nIHRpbWVNcykgewotICAgICAgICAvLyBvdXQtb2Ytb3JkZXIgdGltZXMgbWVhbiBzZWVraW5nIG9yIG5ldyBhY3RpdmUgY3VlcyBiZWluZyBhZGRlZAotICAgICAgICAvLyAoZHVyaW5nIHRoZWlyIG93biB0aW1lc3BhbikKLSAgICAgICAgaWYgKHJlYnVpbGQgfHwgbUxhc3RVcGRhdGVUaW1lTXMgPiB0aW1lTXMpIHsKLSAgICAgICAgICAgIGNsZWFyQWN0aXZlQ3VlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yKEl0ZXJhdG9yPFBhaXI8TG9uZywgQ3VlPiA+IGl0ID0KLSAgICAgICAgICAgICAgICBtQ3Vlcy5lbnRyaWVzQmV0d2VlbihtTGFzdFVwZGF0ZVRpbWVNcywgdGltZU1zKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgUGFpcjxMb25nLCBDdWU+IGV2ZW50ID0gaXQubmV4dCgpOwotICAgICAgICAgICAgQ3VlIGN1ZSA9IGV2ZW50LnNlY29uZDsKLQotICAgICAgICAgICAgaWYgKGN1ZS5tRW5kVGltZU1zID09IGV2ZW50LmZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHBhc3QgY3VlcwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiUmVtb3ZpbmcgIiArIGN1ZSk7Ci0gICAgICAgICAgICAgICAgbUFjdGl2ZUN1ZXMucmVtb3ZlKGN1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1ZS5tUnVuSUQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpdC5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGN1ZS5tU3RhcnRUaW1lTXMgPT0gZXZlbnQuZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAvLyBhZGQgbmV3IGN1ZXMKLSAgICAgICAgICAgICAgICAvLyBUUklDS1k6IHRoaXMgd2lsbCBoYXBwZW4gaW4gc3RhcnQgb3JkZXIKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIkFkZGluZyAiICsgY3VlKTsKLSAgICAgICAgICAgICAgICBpZiAoY3VlLm1Jbm5lclRpbWVzTXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjdWUub25UaW1lKHRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1BY3RpdmVDdWVzLmFkZChjdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjdWUubUlubmVyVGltZXNNcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gY3VlIGlzIG1vZGlmaWVkCi0gICAgICAgICAgICAgICAgY3VlLm9uVGltZSh0aW1lTXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogY29tcGxldGUgYW55IHJ1bnMgKi8KLSAgICAgICAgd2hpbGUgKG1SdW5zQnlFbmRUaW1lLnNpemUoKSA+IDAgJiYKLSAgICAgICAgICAgICAgIG1SdW5zQnlFbmRUaW1lLmtleUF0KDApIDw9IHRpbWVNcykgewotICAgICAgICAgICAgcmVtb3ZlUnVuc0J5RW5kVGltZUluZGV4KDApOyAvLyByZW1vdmVzIGVsZW1lbnQKLSAgICAgICAgfQotICAgICAgICBtTGFzdFVwZGF0ZVRpbWVNcyA9IHRpbWVNczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVtb3ZlUnVuc0J5RW5kVGltZUluZGV4KGludCBpeCkgewotICAgICAgICBSdW4gcnVuID0gbVJ1bnNCeUVuZFRpbWUudmFsdWVBdChpeCk7Ci0gICAgICAgIHdoaWxlIChydW4gIT0gbnVsbCkgewotICAgICAgICAgICAgQ3VlIGN1ZSA9IHJ1bi5tRmlyc3RDdWU7Ci0gICAgICAgICAgICB3aGlsZSAoY3VlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ3Vlcy5yZW1vdmUoY3VlKTsKLSAgICAgICAgICAgICAgICBDdWUgbmV4dEN1ZSA9IGN1ZS5tTmV4dEluUnVuOwotICAgICAgICAgICAgICAgIGN1ZS5tTmV4dEluUnVuID0gbnVsbDsKLSAgICAgICAgICAgICAgICBjdWUgPSBuZXh0Q3VlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVJ1bnNCeUlELnJlbW92ZShydW4ubVJ1bklEKTsKLSAgICAgICAgICAgIFJ1biBuZXh0UnVuID0gcnVuLm1OZXh0UnVuQXRFbmRUaW1lTXM7Ci0gICAgICAgICAgICBydW4ubVByZXZSdW5BdEVuZFRpbWVNcyA9IG51bGw7Ci0gICAgICAgICAgICBydW4ubU5leHRSdW5BdEVuZFRpbWVNcyA9IG51bGw7Ci0gICAgICAgICAgICBydW4gPSBuZXh0UnVuOwotICAgICAgICB9Ci0gICAgICAgIG1SdW5zQnlFbmRUaW1lLnJlbW92ZUF0KGl4KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvKiByZW1vdmUgYWxsIGN1ZXMgKHVudGFuZ2xlIGFsbCBjcm9zcy1saW5rcykgKi8KLSAgICAgICAgaW50IHNpemUgPSBtUnVuc0J5RW5kVGltZS5zaXplKCk7Ci0gICAgICAgIGZvcihpbnQgaXggPSBzaXplIC0gMTsgaXggPj0gMDsgaXgtLSkgewotICAgICAgICAgICAgcmVtb3ZlUnVuc0J5RW5kVGltZUluZGV4KGl4KTsKLSAgICAgICAgfQotCi0gICAgICAgIHN1cGVyLmZpbmFsaXplKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCB0YWtlVGltZShsb25nIHRpbWVNcykgewotICAgICAgICBtTGFzdFRpbWVNcyA9IHRpbWVNczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgY2xlYXJBY3RpdmVDdWVzKCkgewotICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIkNsZWFyaW5nICIgKyBtQWN0aXZlQ3Vlcy5zaXplKCkgKyAiIGFjdGl2ZSBjdWVzIik7Ci0gICAgICAgIG1BY3RpdmVDdWVzLmNsZWFyKCk7Ci0gICAgICAgIG1MYXN0VXBkYXRlVGltZU1zID0gLTE7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2NoZWR1bGVUaW1lZEV2ZW50cygpIHsKLSAgICAgICAgLyogZ2V0IHRpbWVzIGZvciB0aGUgbmV4dCBldmVudCAqLwotICAgICAgICBpZiAobVRpbWVQcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTmV4dFNjaGVkdWxlZFRpbWVNcyA9IG1DdWVzLm5leHRUaW1lQWZ0ZXIobUxhc3RUaW1lTXMpOwotICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJzY2hlZCBAIiArIG1OZXh0U2NoZWR1bGVkVGltZU1zICsgIiBhZnRlciAiICsgbUxhc3RUaW1lTXMpOwotICAgICAgICAgICAgbVRpbWVQcm92aWRlci5ub3RpZnlBdCgKLSAgICAgICAgICAgICAgICAgICAgbU5leHRTY2hlZHVsZWRUaW1lTXMgPj0gMCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAobU5leHRTY2hlZHVsZWRUaW1lTXMgKiAxMDAwKSA6IE1lZGlhVGltZVByb3ZpZGVyLk5PX1RJTUUsCi0gICAgICAgICAgICAgICAgICAgIHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25UaW1lZEV2ZW50KGxvbmcgdGltZVVzKSB7Ci0gICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAib25UaW1lZEV2ZW50ICIgKyB0aW1lVXMpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIGxvbmcgdGltZU1zID0gdGltZVVzIC8gMTAwMDsKLSAgICAgICAgICAgIHVwZGF0ZUFjdGl2ZUN1ZXMoZmFsc2UsIHRpbWVNcyk7Ci0gICAgICAgICAgICB0YWtlVGltZSh0aW1lTXMpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVZpZXcobUFjdGl2ZUN1ZXMpOwotICAgICAgICBzY2hlZHVsZVRpbWVkRXZlbnRzKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TZWVrKGxvbmcgdGltZVVzKSB7Ci0gICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAib25TZWVrICIgKyB0aW1lVXMpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIGxvbmcgdGltZU1zID0gdGltZVVzIC8gMTAwMDsKLSAgICAgICAgICAgIHVwZGF0ZUFjdGl2ZUN1ZXModHJ1ZSwgdGltZU1zKTsKLSAgICAgICAgICAgIHRha2VUaW1lKHRpbWVNcyk7Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlVmlldyhtQWN0aXZlQ3Vlcyk7Ci0gICAgICAgIHNjaGVkdWxlVGltZWRFdmVudHMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJvblN0b3AiKTsKLSAgICAgICAgICAgIGNsZWFyQWN0aXZlQ3VlcygpOwotICAgICAgICAgICAgbUxhc3RUaW1lTXMgPSAtMTsKLSAgICAgICAgfQotICAgICAgICB1cGRhdGVWaWV3KG1BY3RpdmVDdWVzKTsKLSAgICAgICAgbU5leHRTY2hlZHVsZWRUaW1lTXMgPSAtMTsKLSAgICAgICAgbVRpbWVQcm92aWRlci5ub3RpZnlBdChNZWRpYVRpbWVQcm92aWRlci5OT19USU1FLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWVkaWFUaW1lUHJvdmlkZXIgbVRpbWVQcm92aWRlcjsKLQotICAgIHB1YmxpYyB2b2lkIHNob3coKSB7Ci0gICAgICAgIGlmIChtVmlzaWJsZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbVZpc2libGUgPSB0cnVlOwotICAgICAgICBSZW5kZXJpbmdXaWRnZXQgcmVuZGVyaW5nV2lkZ2V0ID0gZ2V0UmVuZGVyaW5nV2lkZ2V0KCk7Ci0gICAgICAgIGlmIChyZW5kZXJpbmdXaWRnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVuZGVyaW5nV2lkZ2V0LnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1UaW1lUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVRpbWVQcm92aWRlci5zY2hlZHVsZVVwZGF0ZSh0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGhpZGUoKSB7Ci0gICAgICAgIGlmICghbVZpc2libGUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtVGltZVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UaW1lUHJvdmlkZXIuY2FuY2VsTm90aWZpY2F0aW9ucyh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBSZW5kZXJpbmdXaWRnZXQgcmVuZGVyaW5nV2lkZ2V0ID0gZ2V0UmVuZGVyaW5nV2lkZ2V0KCk7Ci0gICAgICAgIGlmIChyZW5kZXJpbmdXaWRnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVuZGVyaW5nV2lkZ2V0LnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIG1WaXNpYmxlID0gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBib29sZWFuIGFkZEN1ZShDdWUgY3VlKSB7Ci0gICAgICAgIG1DdWVzLmFkZChjdWUpOwotCi0gICAgICAgIGlmIChjdWUubVJ1bklEICE9IDApIHsKLSAgICAgICAgICAgIFJ1biBydW4gPSBtUnVuc0J5SUQuZ2V0KGN1ZS5tUnVuSUQpOwotICAgICAgICAgICAgaWYgKHJ1biA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcnVuID0gbmV3IFJ1bigpOwotICAgICAgICAgICAgICAgIG1SdW5zQnlJRC5wdXQoY3VlLm1SdW5JRCwgcnVuKTsKLSAgICAgICAgICAgICAgICBydW4ubUVuZFRpbWVNcyA9IGN1ZS5tRW5kVGltZU1zOwotICAgICAgICAgICAgfSBlbHNlIGlmIChydW4ubUVuZFRpbWVNcyA8IGN1ZS5tRW5kVGltZU1zKSB7Ci0gICAgICAgICAgICAgICAgcnVuLm1FbmRUaW1lTXMgPSBjdWUubUVuZFRpbWVNczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbGluay11cCBjdWVzIGluIHRoZSBzYW1lIHJ1bgotICAgICAgICAgICAgY3VlLm1OZXh0SW5SdW4gPSBydW4ubUZpcnN0Q3VlOwotICAgICAgICAgICAgcnVuLm1GaXJzdEN1ZSA9IGN1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIGEgY3VlIGlzIGFkZGVkIHRoYXQgc2hvdWxkIGJlIHZpc2libGUsIG5lZWQgdG8gcmVmcmVzaCB2aWV3Ci0gICAgICAgIGxvbmcgbm93TXMgPSAtMTsKLSAgICAgICAgaWYgKG1UaW1lUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBub3dNcyA9IG1UaW1lUHJvdmlkZXIuZ2V0Q3VycmVudFRpbWVVcygKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIHByZWNpc2UgKi8sIHRydWUgLyogbW9ub3RvbmljICovKSAvIDEwMDA7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBhcyBpdCB3ZSBhcmUgbm90IHBsYXlpbmcKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAibVZpc2libGU9IiArIG1WaXNpYmxlICsgIiwgIiArCi0gICAgICAgICAgICAgICAgY3VlLm1TdGFydFRpbWVNcyArICIgPD0gIiArIG5vd01zICsgIiwgIiArCi0gICAgICAgICAgICAgICAgY3VlLm1FbmRUaW1lTXMgKyAiID49ICIgKyBtTGFzdFRpbWVNcyk7Ci0KLSAgICAgICAgaWYgKG1WaXNpYmxlICYmCi0gICAgICAgICAgICAgICAgY3VlLm1TdGFydFRpbWVNcyA8PSBub3dNcyAmJgotICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IHRydXN0IG5vd01zLCBzbyBjaGVjayBhbnkgY3VlIHNpbmNlIGxhc3QgY2FsbGJhY2sKLSAgICAgICAgICAgICAgICBjdWUubUVuZFRpbWVNcyA+PSBtTGFzdFRpbWVNcykgewotICAgICAgICAgICAgaWYgKG1SdW5uYWJsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1SdW5uYWJsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBTdWJ0aXRsZVRyYWNrIHRyYWNrID0gdGhpczsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgdGhlbk1zID0gbm93TXM7Ci0gICAgICAgICAgICBtUnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAvLyBldmVuIHdpdGggc3luY2hyb25pemVkLCBpdCBpcyBwb3NzaWJsZSB0aGF0IHdlIGFyZSBnb2luZwotICAgICAgICAgICAgICAgICAgICAvLyB0byBkbyBtdWx0aXBsZSB1cGRhdGVzIGFzIHRoZSBydW5uYWJsZSBjb3VsZCBiZSBhbHJlYWR5Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJ1bm5pbmcuCi0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodHJhY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SdW5uYWJsZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVBY3RpdmVDdWVzKHRydWUsIHRoZW5Ncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVWaWV3KG1BY3RpdmVDdWVzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAvLyBkZWxheSB1cGRhdGUgc28gd2UgZG9uJ3QgdXBkYXRlIHZpZXcgb24gZXZlcnkgY3VlLiAgVE9ETyB3aHkgMTA/Ci0gICAgICAgICAgICBpZiAobUhhbmRsZXIucG9zdERlbGF5ZWQobVJ1bm5hYmxlLCAxMCAvKiBkZWxheSAqLykpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInNjaGVkdWxpbmcgdXBkYXRlIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLncoVEFHLCAiZmFpbGVkIHRvIHNjaGVkdWxlIHN1YnRpdGxlIHZpZXcgdXBkYXRlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtVmlzaWJsZSAmJgotICAgICAgICAgICAgICAgIGN1ZS5tRW5kVGltZU1zID49IG1MYXN0VGltZU1zICYmCi0gICAgICAgICAgICAgICAgKGN1ZS5tU3RhcnRUaW1lTXMgPCBtTmV4dFNjaGVkdWxlZFRpbWVNcyB8fAotICAgICAgICAgICAgICAgICBtTmV4dFNjaGVkdWxlZFRpbWVNcyA8IDApKSB7Ci0gICAgICAgICAgICBzY2hlZHVsZVRpbWVkRXZlbnRzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFRpbWVQcm92aWRlcihNZWRpYVRpbWVQcm92aWRlciB0aW1lUHJvdmlkZXIpIHsKLSAgICAgICAgaWYgKG1UaW1lUHJvdmlkZXIgPT0gdGltZVByb3ZpZGVyKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1UaW1lUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVRpbWVQcm92aWRlci5jYW5jZWxOb3RpZmljYXRpb25zKHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIG1UaW1lUHJvdmlkZXIgPSB0aW1lUHJvdmlkZXI7Ci0gICAgICAgIGlmIChtVGltZVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UaW1lUHJvdmlkZXIuc2NoZWR1bGVVcGRhdGUodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHN0YXRpYyBjbGFzcyBDdWVMaXN0IHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDdWVMaXN0IjsKLSAgICAgICAgLy8gc2ltcGxpc3RpYywgaW5lZmZpY2llbnQgaW1wbGVtZW50YXRpb24KLSAgICAgICAgcHJpdmF0ZSBTb3J0ZWRNYXA8TG9uZywgVmVjdG9yPEN1ZT4gPiBtQ3VlczsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gYWRkRXZlbnQoQ3VlIGN1ZSwgbG9uZyB0aW1lTXMpIHsKLSAgICAgICAgICAgIFZlY3RvcjxDdWU+IGN1ZXMgPSBtQ3Vlcy5nZXQodGltZU1zKTsKLSAgICAgICAgICAgIGlmIChjdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjdWVzID0gbmV3IFZlY3RvcjxDdWU+KDIpOwotICAgICAgICAgICAgICAgIG1DdWVzLnB1dCh0aW1lTXMsIGN1ZXMpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjdWVzLmNvbnRhaW5zKGN1ZSkpIHsKLSAgICAgICAgICAgICAgICAvLyBkbyBub3QgZHVwbGljYXRlIGN1ZXMKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGN1ZXMuYWRkKGN1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCByZW1vdmVFdmVudChDdWUgY3VlLCBsb25nIHRpbWVNcykgewotICAgICAgICAgICAgVmVjdG9yPEN1ZT4gY3VlcyA9IG1DdWVzLmdldCh0aW1lTXMpOwotICAgICAgICAgICAgaWYgKGN1ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGN1ZXMucmVtb3ZlKGN1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1ZXMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUN1ZXMucmVtb3ZlKHRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkKEN1ZSBjdWUpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZSBub24tcG9zaXRpdmUtZHVyYXRpb24gY3VlcwotICAgICAgICAgICAgaWYgKGN1ZS5tU3RhcnRUaW1lTXMgPj0gY3VlLm1FbmRUaW1lTXMpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBpZiAoIWFkZEV2ZW50KGN1ZSwgY3VlLm1TdGFydFRpbWVNcykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxvbmcgbGFzdFRpbWVNcyA9IGN1ZS5tU3RhcnRUaW1lTXM7Ci0gICAgICAgICAgICBpZiAoY3VlLm1Jbm5lclRpbWVzTXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAobG9uZyB0aW1lTXM6IGN1ZS5tSW5uZXJUaW1lc01zKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0aW1lTXMgPiBsYXN0VGltZU1zICYmIHRpbWVNcyA8IGN1ZS5tRW5kVGltZU1zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRFdmVudChjdWUsIHRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0VGltZU1zID0gdGltZU1zOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhZGRFdmVudChjdWUsIGN1ZS5tRW5kVGltZU1zKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZShDdWUgY3VlKSB7Ci0gICAgICAgICAgICByZW1vdmVFdmVudChjdWUsIGN1ZS5tU3RhcnRUaW1lTXMpOwotICAgICAgICAgICAgaWYgKGN1ZS5tSW5uZXJUaW1lc01zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGxvbmcgdGltZU1zOiBjdWUubUlubmVyVGltZXNNcykgewotICAgICAgICAgICAgICAgICAgICByZW1vdmVFdmVudChjdWUsIHRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVtb3ZlRXZlbnQoY3VlLCBjdWUubUVuZFRpbWVNcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSXRlcmFibGU8UGFpcjxMb25nLCBDdWU+PiBlbnRyaWVzQmV0d2VlbigKLSAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGxhc3RUaW1lTXMsIGZpbmFsIGxvbmcgdGltZU1zKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEl0ZXJhYmxlPFBhaXI8TG9uZywgQ3VlPiA+KCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxQYWlyPExvbmcsIEN1ZT4gPiBpdGVyYXRvcigpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJzbGljZSAoIiArIGxhc3RUaW1lTXMgKyAiLCAiICsgdGltZU1zICsgIl09Iik7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVudHJ5SXRlcmF0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdWVzLnN1Yk1hcChsYXN0VGltZU1zICsgMSwgdGltZU1zICsgMSkpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVudHJ5SXRlcmF0b3IobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGxvbmcgbmV4dFRpbWVBZnRlcihsb25nIHRpbWVNcykgewotICAgICAgICAgICAgU29ydGVkTWFwPExvbmcsIFZlY3RvcjxDdWU+PiB0YWlsID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdGFpbCA9IG1DdWVzLnRhaWxNYXAodGltZU1zICsgMSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRhaWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFpbC5maXJzdEtleSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfSBjYXRjaChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjbGFzcyBFbnRyeUl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8UGFpcjxMb25nLCBDdWU+ID4gewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICAgICAgICAgIHJldHVybiAhbURvbmU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFBhaXI8TG9uZywgQ3VlPiBuZXh0KCkgewotICAgICAgICAgICAgICAgIGlmIChtRG9uZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigiIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1MYXN0RW50cnkgPSBuZXcgUGFpcjxMb25nLCBDdWU+KAotICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUaW1lTXMsIG1MaXN0SXRlcmF0b3IubmV4dCgpKTsKLSAgICAgICAgICAgICAgICBtTGFzdExpc3RJdGVyYXRvciA9IG1MaXN0SXRlcmF0b3I7Ci0gICAgICAgICAgICAgICAgaWYgKCFtTGlzdEl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBuZXh0S2V5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBtTGFzdEVudHJ5OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgICAgICAgICAvLyBvbmx5IGFsbG93IHJlbW92aW5nIGVuZCB0YWdzCi0gICAgICAgICAgICAgICAgaWYgKG1MYXN0TGlzdEl0ZXJhdG9yID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RW50cnkuc2Vjb25kLm1FbmRUaW1lTXMgIT0gbUxhc3RFbnRyeS5maXJzdCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCIiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyByZW1vdmUgZW5kLWN1ZQotICAgICAgICAgICAgICAgIG1MYXN0TGlzdEl0ZXJhdG9yLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIG1MYXN0TGlzdEl0ZXJhdG9yID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAobUN1ZXMuZ2V0KG1MYXN0RW50cnkuZmlyc3QpLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DdWVzLnJlbW92ZShtTGFzdEVudHJ5LmZpcnN0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyByZW1vdmUgcmVzdCBvZiB0aGUgY3VlcwotICAgICAgICAgICAgICAgIEN1ZSBjdWUgPSBtTGFzdEVudHJ5LnNlY29uZDsKLSAgICAgICAgICAgICAgICByZW1vdmVFdmVudChjdWUsIGN1ZS5tU3RhcnRUaW1lTXMpOwotICAgICAgICAgICAgICAgIGlmIChjdWUubUlubmVyVGltZXNNcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAobG9uZyB0aW1lTXM6IGN1ZS5tSW5uZXJUaW1lc01zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVFdmVudChjdWUsIHRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBFbnRyeUl0ZXJhdG9yKFNvcnRlZE1hcDxMb25nLCBWZWN0b3I8Q3VlPiA+IGN1ZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgY3VlcyArICIiKTsKLSAgICAgICAgICAgICAgICBtUmVtYWluaW5nQ3VlcyA9IGN1ZXM7Ci0gICAgICAgICAgICAgICAgbUxhc3RMaXN0SXRlcmF0b3IgPSBudWxsOwotICAgICAgICAgICAgICAgIG5leHRLZXkoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIG5leHRLZXkoKSB7Ci0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1SZW1haW5pbmdDdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigiIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRpbWVNcyA9IG1SZW1haW5pbmdDdWVzLmZpcnN0S2V5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTGlzdEl0ZXJhdG9yID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVtYWluaW5nQ3Vlcy5nZXQobUN1cnJlbnRUaW1lTXMpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZW1haW5pbmdDdWVzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0N1ZXMudGFpbE1hcChtQ3VycmVudFRpbWVNcyArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVtYWluaW5nQ3VlcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRG9uZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Eb25lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZW1haW5pbmdDdWVzID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MaXN0SXRlcmF0b3IgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAoIW1MaXN0SXRlcmF0b3IuaGFzTmV4dCgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSBsb25nIG1DdXJyZW50VGltZU1zOwotICAgICAgICAgICAgcHJpdmF0ZSBJdGVyYXRvcjxDdWU+IG1MaXN0SXRlcmF0b3I7Ci0gICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gbURvbmU7Ci0gICAgICAgICAgICBwcml2YXRlIFNvcnRlZE1hcDxMb25nLCBWZWN0b3I8Q3VlPiA+IG1SZW1haW5pbmdDdWVzOwotICAgICAgICAgICAgcHJpdmF0ZSBJdGVyYXRvcjxDdWU+IG1MYXN0TGlzdEl0ZXJhdG9yOwotICAgICAgICAgICAgcHJpdmF0ZSBQYWlyPExvbmcsQ3VlPiBtTGFzdEVudHJ5OwotICAgICAgICB9Ci0KLSAgICAgICAgQ3VlTGlzdCgpIHsKLSAgICAgICAgICAgIG1DdWVzID0gbmV3IFRyZWVNYXA8TG9uZywgVmVjdG9yPEN1ZT4+KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEN1ZSB7Ci0gICAgICAgIHB1YmxpYyBsb25nIG1TdGFydFRpbWVNczsKLSAgICAgICAgcHVibGljIGxvbmcgbUVuZFRpbWVNczsKLSAgICAgICAgcHVibGljIGxvbmdbXSBtSW5uZXJUaW1lc01zOwotICAgICAgICBwdWJsaWMgbG9uZyBtUnVuSUQ7Ci0KLSAgICAgICAgcHVibGljIEN1ZSBtTmV4dEluUnVuOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVGltZShsb25nIHRpbWVNcykgeyB9Ci0gICAgfQotCi0gICAgLyoqIHVwZGF0ZSBtUnVuc0J5RW5kVGltZSAod2l0aCBkZWZhdWx0IGVuZCB0aW1lKSAqLwotICAgIHByb3RlY3RlZCB2b2lkIGZpbmlzaGVkUnVuKGxvbmcgcnVuSUQpIHsKLSAgICAgICAgaWYgKHJ1bklEICE9IDAgJiYgcnVuSUQgIT0gfjApIHsKLSAgICAgICAgICAgIFJ1biBydW4gPSBtUnVuc0J5SUQuZ2V0KHJ1bklEKTsKLSAgICAgICAgICAgIGlmIChydW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJ1bi5zdG9yZUJ5RW5kVGltZU1zKG1SdW5zQnlFbmRUaW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiB1cGRhdGUgbVJ1bnNCeUVuZFRpbWUgd2l0aCBnaXZlbiBlbmQgdGltZSAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJ1bkRpc2NhcmRUaW1lTXMobG9uZyBydW5JRCwgbG9uZyB0aW1lTXMpIHsKLSAgICAgICAgaWYgKHJ1bklEICE9IDAgJiYgcnVuSUQgIT0gfjApIHsKLSAgICAgICAgICAgIFJ1biBydW4gPSBtUnVuc0J5SUQuZ2V0KHJ1bklEKTsKLSAgICAgICAgICAgIGlmIChydW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJ1bi5tRW5kVGltZU1zID0gdGltZU1zOwotICAgICAgICAgICAgICAgIHJ1bi5zdG9yZUJ5RW5kVGltZU1zKG1SdW5zQnlFbmRUaW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiB3aGV0aGVyIHRoaXMgaXMgYSB0ZXh0IHRyYWNrIHdobyBmaXJlcyBldmVudHMgaW5zdGVhZCBnZXR0aW5nIHJlbmRlcmVkICovCi0gICAgcHVibGljIGludCBnZXRUcmFja1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRSZW5kZXJpbmdXaWRnZXQoKSA9PSBudWxsCi0gICAgICAgICAgICAgICAgPyBUcmFja0luZm8uTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQKLSAgICAgICAgICAgICAgICA6IFRyYWNrSW5mby5NRURJQV9UUkFDS19UWVBFX1NVQlRJVExFOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUnVuIHsKLSAgICAgICAgcHVibGljIEN1ZSBtRmlyc3RDdWU7Ci0gICAgICAgIHB1YmxpYyBSdW4gbU5leHRSdW5BdEVuZFRpbWVNczsKLSAgICAgICAgcHVibGljIFJ1biBtUHJldlJ1bkF0RW5kVGltZU1zOwotICAgICAgICBwdWJsaWMgbG9uZyBtRW5kVGltZU1zID0gLTE7Ci0gICAgICAgIHB1YmxpYyBsb25nIG1SdW5JRCA9IDA7Ci0gICAgICAgIHByaXZhdGUgbG9uZyBtU3RvcmVkRW5kVGltZU1zID0gLTE7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc3RvcmVCeUVuZFRpbWVNcyhMb25nU3BhcnNlQXJyYXk8UnVuPiBydW5zQnlFbmRUaW1lKSB7Ci0gICAgICAgICAgICAvLyByZW1vdmUgb2xkIHZhbHVlIGlmIGFueQotICAgICAgICAgICAgaW50IGl4ID0gcnVuc0J5RW5kVGltZS5pbmRleE9mS2V5KG1TdG9yZWRFbmRUaW1lTXMpOwotICAgICAgICAgICAgaWYgKGl4ID49IDApIHsKLSAgICAgICAgICAgICAgICBpZiAobVByZXZSdW5BdEVuZFRpbWVNcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCh0aGlzID09IHJ1bnNCeUVuZFRpbWUudmFsdWVBdChpeCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAobU5leHRSdW5BdEVuZFRpbWVNcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBydW5zQnlFbmRUaW1lLnJlbW92ZUF0KGl4KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnNCeUVuZFRpbWUuc2V0VmFsdWVBdChpeCwgbU5leHRSdW5BdEVuZFRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVtb3ZlQXRFbmRUaW1lTXMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYWRkIG5ldyB2YWx1ZQotICAgICAgICAgICAgaWYgKG1FbmRUaW1lTXMgPj0gMCkgewotICAgICAgICAgICAgICAgIG1QcmV2UnVuQXRFbmRUaW1lTXMgPSBudWxsOwotICAgICAgICAgICAgICAgIG1OZXh0UnVuQXRFbmRUaW1lTXMgPSBydW5zQnlFbmRUaW1lLmdldChtRW5kVGltZU1zKTsKLSAgICAgICAgICAgICAgICBpZiAobU5leHRSdW5BdEVuZFRpbWVNcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1OZXh0UnVuQXRFbmRUaW1lTXMubVByZXZSdW5BdEVuZFRpbWVNcyA9IHRoaXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJ1bnNCeUVuZFRpbWUucHV0KG1FbmRUaW1lTXMsIHRoaXMpOwotICAgICAgICAgICAgICAgIG1TdG9yZWRFbmRUaW1lTXMgPSBtRW5kVGltZU1zOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlQXRFbmRUaW1lTXMoKSB7Ci0gICAgICAgICAgICBSdW4gcHJldiA9IG1QcmV2UnVuQXRFbmRUaW1lTXM7Ci0KLSAgICAgICAgICAgIGlmIChtUHJldlJ1bkF0RW5kVGltZU1zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUHJldlJ1bkF0RW5kVGltZU1zLm1OZXh0UnVuQXRFbmRUaW1lTXMgPSBtTmV4dFJ1bkF0RW5kVGltZU1zOwotICAgICAgICAgICAgICAgIG1QcmV2UnVuQXRFbmRUaW1lTXMgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1OZXh0UnVuQXRFbmRUaW1lTXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1OZXh0UnVuQXRFbmRUaW1lTXMubVByZXZSdW5BdEVuZFRpbWVNcyA9IHByZXY7Ci0gICAgICAgICAgICAgICAgbU5leHRSdW5BdEVuZFRpbWVNcyA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcmZhY2UgZm9yIHJlbmRlcmluZyBzdWJ0aXRsZXMgb250byBhIENhbnZhcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIFJlbmRlcmluZ1dpZGdldCB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSB3aWRnZXQncyBjYWxsYmFjaywgd2hpY2ggaXMgdXNlZCB0byBzZW5kIHVwZGF0ZXMgd2hlbiB0aGUKLSAgICAgICAgICogcmVuZGVyZWQgZGF0YSBoYXMgY2hhbmdlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIHVwZGF0ZSBjYWxsYmFjawotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0T25DaGFuZ2VkTGlzdGVuZXIoT25DaGFuZ2VkTGlzdGVuZXIgY2FsbGJhY2spOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSB3aWRnZXQncyBzaXplLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gd2lkdGggd2lkdGggaW4gcGl4ZWxzCi0gICAgICAgICAqIEBwYXJhbSBoZWlnaHQgaGVpZ2h0IGluIHBpeGVscwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIHdpZGdldCBzaG91bGQgZHJhdyBzdWJ0aXRsZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB2aXNpYmxlIHRydWUgaWYgc3VidGl0bGVzIHNob3VsZCBiZSBkcmF3biwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlbmRlcnMgc3VidGl0bGVzIG9udG8gYSB7QGxpbmsgQ2FudmFzfS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGMgY2FudmFzIG9uIHdoaWNoIHRvIHJlbmRlciBzdWJ0aXRsZXMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGMpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgd2lkZ2V0IGlzIGF0dGFjaGVkIHRvIGEgd2luZG93LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSB3aWRnZXQgaXMgZGV0YWNoZWQgZnJvbSBhIHdpbmRvdy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxiYWNrIHVzZWQgdG8gc2VuZCB1cGRhdGVzIGFib3V0IGNoYW5nZXMgdG8gcmVuZGVyaW5nIGRhdGEuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50ZXJmYWNlIE9uQ2hhbmdlZExpc3RlbmVyIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHJlbmRlcmluZyBkYXRhIGhhcyBjaGFuZ2VkLgotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqIEBwYXJhbSByZW5kZXJpbmdXaWRnZXQgdGhlIHdpZGdldCB3aG9zZSBkYXRhIGhhcyBjaGFuZ2VkCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlZChSZW5kZXJpbmdXaWRnZXQgcmVuZGVyaW5nV2lkZ2V0KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvdXBkYXRlL0FwaUZhY3RvcnkuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvdXBkYXRlL0FwaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdiZTU0OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3VwZGF0ZS9BcGlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUJyb3dzZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFCcm93c2VyMi5Ccm93c2VyQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMi5Db250cm9sbGVyQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5MaWJyYXJ5Um9vdDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyLk1lZGlhTGlicmFyeVNlc3Npb247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5NZWRpYUxpYnJhcnlTZXNzaW9uLk1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kR3JvdXAyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5Db250cm9sbGVySW5mbzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuU2Vzc2lvbkNhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMi5NZWRpYU5vdGlmaWNhdGlvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlJhdGluZzI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhQnJvd3NlcjJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUNvbnRyb2xWaWV3MlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhQ29udHJvbGxlcjJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUl0ZW0yUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFMaWJyYXJ5U2VydmljZTJQcm92aWRlci5MaWJyYXJ5Um9vdFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhTWV0YWRhdGEyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFQbGF5bGlzdEFnZW50UHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFTZXNzaW9uMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhU2Vzc2lvbjJQcm92aWRlci5CdWlsZGVyQmFzZVByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhU2Vzc2lvbjJQcm92aWRlci5Db21tYW5kQnV0dG9uUHJvdmlkZXIuQnVpbGRlclByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhU2Vzc2lvblNlcnZpY2UyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFTZXNzaW9uU2VydmljZTJQcm92aWRlci5NZWRpYU5vdGlmaWNhdGlvblByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlNlc3Npb25Ub2tlbjJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5TdGF0aWNQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5WaWRlb1ZpZXcyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVmlld0dyb3VwUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVm9sdW1lUHJvdmlkZXIyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JSW50ZXJmYWNlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTWVkaWFDb250cm9sVmlldzI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3MjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLklNZWRpYUNvbnRyb2xsZXIyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhQnJvd3NlcjJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwuTGlicmFyeVJvb3RJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnRJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvblNlcnZpY2UySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5SYXRpbmcySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4ySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLndpZGdldC5NZWRpYUNvbnRyb2xWaWV3MkltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQud2lkZ2V0LlZpZGVvVmlldzJJbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBcGlGYWN0b3J5IGltcGxlbWVudHMgU3RhdGljUHJvdmlkZXIgewotICAgIHByaXZhdGUgQXBpRmFjdG9yeSgpIHsgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdGF0aWNQcm92aWRlciBpbml0aWFsaXplKEFwcGxpY2F0aW9uSW5mbyB1cGRhdGFibGVJbmZvKSB7Ci0gICAgICAgIEFwaUhlbHBlci5pbml0aWFsaXplKHVwZGF0YWJsZUluZm8pOwotICAgICAgICByZXR1cm4gbmV3IEFwaUZhY3RvcnkoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFDb250cm9sbGVyMlByb3ZpZGVyIGNyZWF0ZU1lZGlhQ29udHJvbGxlcjIoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIE1lZGlhQ29udHJvbGxlcjIgaW5zdGFuY2UsIFNlc3Npb25Ub2tlbjIgdG9rZW4sCi0gICAgICAgICAgICBFeGVjdXRvciBleGVjdXRvciwgQ29udHJvbGxlckNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFDb250cm9sbGVyMkltcGwoY29udGV4dCwgaW5zdGFuY2UsIHRva2VuLCBleGVjdXRvciwgY2FsbGJhY2spOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYUJyb3dzZXIyUHJvdmlkZXIgY3JlYXRlTWVkaWFCcm93c2VyMihDb250ZXh0IGNvbnRleHQsIE1lZGlhQnJvd3NlcjIgaW5zdGFuY2UsCi0gICAgICAgICAgICBTZXNzaW9uVG9rZW4yIHRva2VuLCBFeGVjdXRvciBleGVjdXRvciwgQnJvd3NlckNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFCcm93c2VyMkltcGwoY29udGV4dCwgaW5zdGFuY2UsIHRva2VuLCBleGVjdXRvciwgY2FsbGJhY2spOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYVNlc3Npb24yUHJvdmlkZXIuQ29tbWFuZFByb3ZpZGVyIGNyZWF0ZU1lZGlhU2Vzc2lvbjJDb21tYW5kKAotICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmQyIGluc3RhbmNlLCBpbnQgY29tbWFuZENvZGUsIFN0cmluZyBhY3Rpb24sIEJ1bmRsZSBleHRyYSkgewotICAgICAgICBpZiAoYWN0aW9uID09IG51bGwgJiYgZXh0cmEgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb24ySW1wbC5Db21tYW5kSW1wbChpbnN0YW5jZSwgY29tbWFuZENvZGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEltcGwoaW5zdGFuY2UsIGFjdGlvbiwgZXh0cmEpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXNzaW9uQ29tbWFuZDIgZnJvbUJ1bmRsZV9NZWRpYVNlc3Npb24yQ29tbWFuZChCdW5kbGUgY29tbWFuZCkgewotICAgICAgICByZXR1cm4gTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEltcGwuZnJvbUJ1bmRsZV9pbXBsKGNvbW1hbmQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYVNlc3Npb24yUHJvdmlkZXIuQ29tbWFuZEdyb3VwUHJvdmlkZXIgY3JlYXRlTWVkaWFTZXNzaW9uMkNvbW1hbmRHcm91cCgKLSAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyIGluc3RhbmNlLCBTZXNzaW9uQ29tbWFuZEdyb3VwMiBvdGhlcikgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRHcm91cEltcGwoaW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgKG90aGVyID09IG51bGwpID8gbnVsbCA6IG90aGVyLmdldFByb3ZpZGVyKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXNzaW9uQ29tbWFuZEdyb3VwMiBmcm9tQnVuZGxlX01lZGlhU2Vzc2lvbjJDb21tYW5kR3JvdXAoQnVuZGxlIGNvbW1hbmRzKSB7Ci0gICAgICAgIHJldHVybiBNZWRpYVNlc3Npb24ySW1wbC5Db21tYW5kR3JvdXBJbXBsLmZyb21CdW5kbGVfaW1wbChjb21tYW5kcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvbjJQcm92aWRlci5Db250cm9sbGVySW5mb1Byb3ZpZGVyIGNyZWF0ZU1lZGlhU2Vzc2lvbjJDb250cm9sbGVySW5mbygKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgQ29udHJvbGxlckluZm8gaW5zdGFuY2UsIGludCB1aWQsIGludCBwaWQsIFN0cmluZyBwYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIElJbnRlcmZhY2UgY2FsbGJhY2spIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb24ySW1wbC5Db250cm9sbGVySW5mb0ltcGwoY29udGV4dCwKLSAgICAgICAgICAgICAgICBpbnN0YW5jZSwgdWlkLCBwaWQsIHBhY2thZ2VOYW1lLCAoSU1lZGlhQ29udHJvbGxlcjIpIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlclByb3ZpZGVyIGNyZWF0ZU1lZGlhU2Vzc2lvbjJDb21tYW5kQnV0dG9uQnVpbGRlcigKLSAgICAgICAgICAgIE1lZGlhU2Vzc2lvbjIuQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIGluc3RhbmNlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEJ1dHRvbkltcGwuQnVpbGRlckltcGwoaW5zdGFuY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBCdWlsZGVyQmFzZVByb3ZpZGVyPE1lZGlhU2Vzc2lvbjIsIFNlc3Npb25DYWxsYmFjaz4gY3JlYXRlTWVkaWFTZXNzaW9uMkJ1aWxkZXIoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIE1lZGlhU2Vzc2lvbjIuQnVpbGRlciBpbnN0YW5jZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjJJbXBsLkJ1aWxkZXJJbXBsKGNvbnRleHQsIGluc3RhbmNlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFTZXNzaW9uU2VydmljZTJQcm92aWRlciBjcmVhdGVNZWRpYVNlc3Npb25TZXJ2aWNlMihNZWRpYVNlc3Npb25TZXJ2aWNlMiBpbnN0YW5jZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvblNlcnZpY2UySW1wbChpbnN0YW5jZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhTm90aWZpY2F0aW9uUHJvdmlkZXIgY3JlYXRlTWVkaWFTZXNzaW9uU2VydmljZTJNZWRpYU5vdGlmaWNhdGlvbigKLSAgICAgICAgICAgIE1lZGlhTm90aWZpY2F0aW9uIGluc3RhbmNlLCBpbnQgbm90aWZpY2F0aW9uSWQsIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwuTWVkaWFOb3RpZmljYXRpb25JbXBsKAotICAgICAgICAgICAgICAgIGluc3RhbmNlLCBub3RpZmljYXRpb25JZCwgbm90aWZpY2F0aW9uKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFTZXNzaW9uU2VydmljZTJQcm92aWRlciBjcmVhdGVNZWRpYUxpYnJhcnlTZXJ2aWNlMihNZWRpYUxpYnJhcnlTZXJ2aWNlMiBpbnN0YW5jZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhTGlicmFyeVNlcnZpY2UySW1wbChpbnN0YW5jZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXJCYXNlUHJvdmlkZXI8TWVkaWFMaWJyYXJ5U2Vzc2lvbiwgTWVkaWFMaWJyYXJ5U2Vzc2lvbkNhbGxiYWNrPgotICAgICAgICBjcmVhdGVNZWRpYUxpYnJhcnlTZXJ2aWNlMkJ1aWxkZXIoTWVkaWFMaWJyYXJ5U2VydmljZTIgc2VydmljZSwKLSAgICAgICAgICAgIE1lZGlhTGlicmFyeVNlc3Npb24uQnVpbGRlciBpbnN0YW5jZSwgRXhlY3V0b3IgY2FsbGJhY2tFeGVjdXRvciwKLSAgICAgICAgICAgIE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhTGlicmFyeVNlcnZpY2UySW1wbC5CdWlsZGVySW1wbChzZXJ2aWNlLCBpbnN0YW5jZSwgY2FsbGJhY2tFeGVjdXRvciwKLSAgICAgICAgICAgICAgICBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpYnJhcnlSb290UHJvdmlkZXIgY3JlYXRlTWVkaWFMaWJyYXJ5U2VydmljZTJMaWJyYXJ5Um9vdCgKLSAgICAgICAgICAgIExpYnJhcnlSb290IGluc3RhbmNlLCBTdHJpbmcgcm9vdElkLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTGlicmFyeVJvb3RJbXBsKGluc3RhbmNlLCByb290SWQsIGV4dHJhcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhQ29udHJvbFZpZXcyUHJvdmlkZXIgY3JlYXRlTWVkaWFDb250cm9sVmlldzIoTWVkaWFDb250cm9sVmlldzIgaW5zdGFuY2UsCi0gICAgICAgICAgICBWaWV3R3JvdXBQcm92aWRlciBzdXBlclByb3ZpZGVyLCBWaWV3R3JvdXBQcm92aWRlciBwcml2YXRlUHJvdmlkZXIsCi0gICAgICAgICAgICBATnVsbGFibGUgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyLCBpbnQgZGVmU3R5bGVSZXMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUNvbnRyb2xWaWV3MkltcGwoaW5zdGFuY2UsIHN1cGVyUHJvdmlkZXIsIHByaXZhdGVQcm92aWRlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFZpZGVvVmlldzJQcm92aWRlciBjcmVhdGVWaWRlb1ZpZXcyKAotICAgICAgICAgICAgVmlkZW9WaWV3MiBpbnN0YW5jZSwgVmlld0dyb3VwUHJvdmlkZXIgc3VwZXJQcm92aWRlciwgVmlld0dyb3VwUHJvdmlkZXIgcHJpdmF0ZVByb3ZpZGVyLAotICAgICAgICAgICAgQE51bGxhYmxlIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVmlkZW9WaWV3MkltcGwoaW5zdGFuY2UsIHN1cGVyUHJvdmlkZXIsIHByaXZhdGVQcm92aWRlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNlc3Npb25Ub2tlbjJQcm92aWRlciBjcmVhdGVTZXNzaW9uVG9rZW4yKENvbnRleHQgY29udGV4dCwgU2Vzc2lvblRva2VuMiBpbnN0YW5jZSwKLSAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHNlcnZpY2VOYW1lLCBpbnQgdWlkKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2Vzc2lvblRva2VuMkltcGwoY29udGV4dCwgaW5zdGFuY2UsIHBhY2thZ2VOYW1lLCBzZXJ2aWNlTmFtZSwgdWlkKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2Vzc2lvblRva2VuMiBmcm9tQnVuZGxlX1Nlc3Npb25Ub2tlbjIoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gU2Vzc2lvblRva2VuMkltcGwuZnJvbUJ1bmRsZV9pbXBsKGJ1bmRsZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhSXRlbTJQcm92aWRlci5CdWlsZGVyUHJvdmlkZXIgY3JlYXRlTWVkaWFJdGVtMkJ1aWxkZXIoTWVkaWFJdGVtMi5CdWlsZGVyIGluc3RhbmNlLAotICAgICAgICAgICAgaW50IGZsYWdzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFJdGVtMkltcGwuQnVpbGRlckltcGwoaW5zdGFuY2UsIGZsYWdzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFJdGVtMiBmcm9tQnVuZGxlX01lZGlhSXRlbTIoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gTWVkaWFJdGVtMkltcGwuZnJvbUJ1bmRsZV9pbXBsKGJ1bmRsZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFZvbHVtZVByb3ZpZGVyMlByb3ZpZGVyIGNyZWF0ZVZvbHVtZVByb3ZpZGVyMihWb2x1bWVQcm92aWRlcjIgaW5zdGFuY2UsIGludCBjb250cm9sVHlwZSwKLSAgICAgICAgICAgIGludCBtYXhWb2x1bWUsIGludCBjdXJyZW50Vm9sdW1lKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVm9sdW1lUHJvdmlkZXIySW1wbChpbnN0YW5jZSwgY29udHJvbFR5cGUsIG1heFZvbHVtZSwgY3VycmVudFZvbHVtZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhTWV0YWRhdGEyIGZyb21CdW5kbGVfTWVkaWFNZXRhZGF0YTIoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gTWVkaWFNZXRhZGF0YTJJbXBsLmZyb21CdW5kbGVfaW1wbChidW5kbGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMlByb3ZpZGVyLkJ1aWxkZXJQcm92aWRlciBjcmVhdGVNZWRpYU1ldGFkYXRhMkJ1aWxkZXIoCi0gICAgICAgICAgICBNZWRpYU1ldGFkYXRhMi5CdWlsZGVyIGluc3RhbmNlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFNZXRhZGF0YTJJbXBsLkJ1aWxkZXJJbXBsKGluc3RhbmNlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTJQcm92aWRlci5CdWlsZGVyUHJvdmlkZXIgY3JlYXRlTWVkaWFNZXRhZGF0YTJCdWlsZGVyKAotICAgICAgICAgICAgTWVkaWFNZXRhZGF0YTIuQnVpbGRlciBpbnN0YW5jZSwgTWVkaWFNZXRhZGF0YTIgc291cmNlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFNZXRhZGF0YTJJbXBsLkJ1aWxkZXJJbXBsKGluc3RhbmNlLCBzb3VyY2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSYXRpbmcyIGZyb21CdW5kbGVfUmF0aW5nMihCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIHJldHVybiBSYXRpbmcySW1wbC5mcm9tQnVuZGxlX2ltcGwoYnVuZGxlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmF0aW5nMiBuZXdVbnJhdGVkUmF0aW5nX1JhdGluZzIoaW50IHJhdGluZ1N0eWxlKSB7Ci0gICAgICAgIHJldHVybiBSYXRpbmcySW1wbC5uZXdVbnJhdGVkUmF0aW5nX2ltcGwocmF0aW5nU3R5bGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSYXRpbmcyIG5ld0hlYXJ0UmF0aW5nX1JhdGluZzIoYm9vbGVhbiBoYXNIZWFydCkgewotICAgICAgICByZXR1cm4gUmF0aW5nMkltcGwubmV3SGVhcnRSYXRpbmdfaW1wbChoYXNIZWFydCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJhdGluZzIgbmV3VGh1bWJSYXRpbmdfUmF0aW5nMihib29sZWFuIHRodW1iSXNVcCkgewotICAgICAgICByZXR1cm4gUmF0aW5nMkltcGwubmV3VGh1bWJSYXRpbmdfaW1wbCh0aHVtYklzVXApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSYXRpbmcyIG5ld1N0YXJSYXRpbmdfUmF0aW5nMihpbnQgc3RhclJhdGluZ1N0eWxlLCBmbG9hdCBzdGFyUmF0aW5nKSB7Ci0gICAgICAgIHJldHVybiBSYXRpbmcySW1wbC5uZXdTdGFyUmF0aW5nX2ltcGwoc3RhclJhdGluZ1N0eWxlLCBzdGFyUmF0aW5nKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmF0aW5nMiBuZXdQZXJjZW50YWdlUmF0aW5nX1JhdGluZzIoZmxvYXQgcGVyY2VudCkgewotICAgICAgICByZXR1cm4gUmF0aW5nMkltcGwubmV3UGVyY2VudGFnZVJhdGluZ19pbXBsKHBlcmNlbnQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYVBsYXlsaXN0QWdlbnRQcm92aWRlciBjcmVhdGVNZWRpYVBsYXlsaXN0QWdlbnQoTWVkaWFQbGF5bGlzdEFnZW50IGluc3RhbmNlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFQbGF5bGlzdEFnZW50SW1wbChpbnN0YW5jZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS91cGRhdGUvQXBpSGVscGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3VwZGF0ZS9BcGlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ4YmI0OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3VwZGF0ZS9BcGlIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZTsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dFdyYXBwZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbzsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzLlRoZW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uR3VhcmRlZEJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC53aWRnZXQuU3BhY2U7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY3LndpZGdldC5CdXR0b25CYXJMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk1lZGlhUm91dGVCdXR0b247Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk1lZGlhUm91dGVWb2x1bWVTbGlkZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuT3ZlcmxheUxpc3RWaWV3OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQXBpSGVscGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBBcHBsaWNhdGlvbkluZm8gc1VwZGF0YWJsZUluZm87Ci0KLSAgICBAR3VhcmRlZEJ5KCJ0aGlzIikKLSAgICBwcml2YXRlIHN0YXRpYyBUaGVtZSBzTGliVGhlbWU7Ci0KLSAgICBwcml2YXRlIEFwaUhlbHBlcigpIHsgfQotCi0gICAgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZShBcHBsaWNhdGlvbkluZm8gdXBkYXRhYmxlSW5mbykgewotICAgICAgICBpZiAoc1VwZGF0YWJsZUluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW5pdGlhbGl6ZSBzaG91bGQgb25seSBiZSBjYWxsZWQgb25jZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc1VwZGF0YWJsZUluZm8gPSB1cGRhdGFibGVJbmZvOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VzIGdldExpYlJlc291cmNlcyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGdldExpYlRoZW1lKGNvbnRleHQpLmdldFJlc291cmNlcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGhlbWUgZ2V0TGliVGhlbWUoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChzTGliVGhlbWUgIT0gbnVsbCkgcmV0dXJuIHNMaWJUaGVtZTsKLQotICAgICAgICByZXR1cm4gZ2V0TGliVGhlbWVTeW5jaHJvbml6ZWQoY29udGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUaGVtZSBnZXRMaWJUaGVtZShDb250ZXh0IGNvbnRleHQsIGludCB0aGVtZUlkKSB7Ci0gICAgICAgIFRoZW1lIHRoZW1lID0gZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLm5ld1RoZW1lKCk7Ci0gICAgICAgIHRoZW1lLmFwcGx5U3R5bGUodGhlbWVJZCwgdHJ1ZSk7Ci0gICAgICAgIHJldHVybiB0aGVtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExheW91dEluZmxhdGVyIGdldExheW91dEluZmxhdGVyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gZ2V0TGF5b3V0SW5mbGF0ZXIoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYXlvdXRJbmZsYXRlciBnZXRMYXlvdXRJbmZsYXRlcihDb250ZXh0IGNvbnRleHQsIFRoZW1lIHRoZW1lKSB7Ci0gICAgICAgIGlmICh0aGVtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aGVtZSA9IGdldExpYlRoZW1lKGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETyAoYi83Mjk3NTk3Nik6IEF2b2lkIHRvIHVzZSBDb250ZXh0VGhlbWVXcmFwcGVyIHdpdGggYXBwIGNvbnRleHQgYW5kIGxpYiB0aGVtZS4KLSAgICAgICAgTGF5b3V0SW5mbGF0ZXIgbGF5b3V0SW5mbGF0ZXIgPSBMYXlvdXRJbmZsYXRlci5mcm9tKGNvbnRleHQpLmNsb25lSW5Db250ZXh0KAotICAgICAgICAgICAgICAgIG5ldyBDb250ZXh0VGhlbWVXcmFwcGVyKGNvbnRleHQsIHRoZW1lKSk7Ci0gICAgICAgIGxheW91dEluZmxhdGVyLnNldEZhY3RvcnkyKG5ldyBMYXlvdXRJbmZsYXRlci5GYWN0b3J5MigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KAotICAgICAgICAgICAgICAgICAgICBWaWV3IHBhcmVudCwgU3RyaW5nIG5hbWUsIENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKE1lZGlhUm91dGVCdXR0b24uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVCdXR0b24oY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoTWVkaWFSb3V0ZVZvbHVtZVNsaWRlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcihjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbihjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChPdmVybGF5TGlzdFZpZXcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE92ZXJsYXlMaXN0Vmlldyhjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChCdXR0b25CYXJMYXlvdXQuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1dHRvbkJhckxheW91dChjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChTcGFjZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3BhY2UoY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoU3RyaW5nIG5hbWUsIENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9uQ3JlYXRlVmlldyhudWxsLCBuYW1lLCBjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICByZXR1cm4gbGF5b3V0SW5mbGF0ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBWaWV3IGluZmxhdGVMaWJMYXlvdXQoQ29udGV4dCBjb250ZXh0LCBpbnQgbGliUmVzSWQpIHsKLSAgICAgICAgcmV0dXJuIGluZmxhdGVMaWJMYXlvdXQoY29udGV4dCwgZ2V0TGliVGhlbWUoY29udGV4dCksIGxpYlJlc0lkLCBudWxsLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBWaWV3IGluZmxhdGVMaWJMYXlvdXQoQ29udGV4dCBjb250ZXh0LCBUaGVtZSB0aGVtZSwgaW50IGxpYlJlc0lkKSB7Ci0gICAgICAgIHJldHVybiBpbmZsYXRlTGliTGF5b3V0KGNvbnRleHQsIHRoZW1lLCBsaWJSZXNJZCwgbnVsbCwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVmlldyBpbmZsYXRlTGliTGF5b3V0KENvbnRleHQgY29udGV4dCwgVGhlbWUgdGhlbWUsIGludCBsaWJSZXNJZCwKLSAgICAgICAgICAgIEBOdWxsYWJsZSBWaWV3R3JvdXAgcm9vdCwgYm9vbGVhbiBhdHRhY2hUb1Jvb3QpIHsKLSAgICAgICAgdHJ5IChYbWxSZXNvdXJjZVBhcnNlciBwYXJzZXIgPSBnZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0TGF5b3V0KGxpYlJlc0lkKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldExheW91dEluZmxhdGVyKGNvbnRleHQsIHRoZW1lKS5pbmZsYXRlKHBhcnNlciwgcm9vdCwgYXR0YWNoVG9Sb290KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBUaGVtZSBnZXRMaWJUaGVtZVN5bmNocm9uaXplZChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKHNMaWJUaGVtZSAhPSBudWxsKSByZXR1cm4gc0xpYlRoZW1lOwotCi0gICAgICAgIGlmIChzVXBkYXRhYmxlSW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbml0aWFsaXplIGhhc24ndCBiZWVuIGNhbGxlZCB5ZXQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gc0xpYlRoZW1lID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZXNGb3JBcHBsaWNhdGlvbihzVXBkYXRhYmxlSW5mbykubmV3VGhlbWUoKTsKLSAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwaTI0L21lZGlhL01lZGlhUm91dGVyQXBpMjQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcGkyNC9tZWRpYS9NZWRpYVJvdXRlckFwaTI0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNDZhZjYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwaTI0L21lZGlhL01lZGlhUm91dGVyQXBpMjQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotLy8gQEBSZXF1aXJlc0FwaSgyNCkKLWZpbmFsIGNsYXNzIE1lZGlhUm91dGVyQXBpMjQgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUm91dGVJbmZvIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0RGV2aWNlVHlwZShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXREZXZpY2VUeXBlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVBY3Rpb25Qcm92aWRlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlOGQ0Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVBY3Rpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnZpZXcuQWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLQotLyoqCi0gKiBUaGUgbWVkaWEgcm91dGUgYWN0aW9uIHByb3ZpZGVyIGRpc3BsYXlzIGEge0BsaW5rIE1lZGlhUm91dGVCdXR0b24gbWVkaWEgcm91dGUgYnV0dG9ufQotICogaW4gdGhlIGFwcGxpY2F0aW9uJ3Mge0BsaW5rIEFjdGlvbkJhcn0gdG8gYWxsb3cgdGhlIHVzZXIgdG8gc2VsZWN0IHJvdXRlcyBhbmQKLSAqIHRvIGNvbnRyb2wgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZS4KLSAqIDxwPgotICogVGhlIGFwcGxpY2F0aW9uIG11c3Qgc3BlY2lmeSB0aGUga2luZHMgb2Ygcm91dGVzIHRoYXQgdGhlIHVzZXIgc2hvdWxkIGJlIGFsbG93ZWQKLSAqIHRvIHNlbGVjdCBieSBzcGVjaWZ5aW5nIGEge0BsaW5rIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3Rvcn0gd2l0aCB0aGUKLSAqIHtAbGluayAjc2V0Um91dGVTZWxlY3Rvcn0gbWV0aG9kLgotICogPC9wPjxwPgotICogUmVmZXIgdG8ge0BsaW5rIE1lZGlhUm91dGVCdXR0b259IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBidXR0b24gdGhhdCB3aWxsCi0gKiBhcHBlYXIgaW4gdGhlIGFjdGlvbiBiYXIgbWVudS4gIE5vdGUgdGhhdCBpbnN0ZWFkIG9mIGRpc2FibGluZyB0aGUgYnV0dG9uCi0gKiB3aGVuIG5vIHJvdXRlcyBhcmUgYXZhaWxhYmxlLCB0aGUgYWN0aW9uIHByb3ZpZGVyIHdpbGwgaW5zdGVhZCBtYWtlIHRoZQotICogbWVudSBpdGVtIGludmlzaWJsZS4gIEluIHRoaXMgd2F5LCB0aGUgYnV0dG9uIHdpbGwgb25seSBiZSB2aXNpYmxlIHdoZW4gaXQKLSAqIGlzIHBvc3NpYmxlIGZvciB0aGUgdXNlciB0byBkaXNjb3ZlciBhbmQgc2VsZWN0IGEgbWF0Y2hpbmcgcm91dGUuCi0gKiA8L3A+Ci0gKgotICogPGgzPlByZXJlcXVpc2l0ZXM8L2gzPgotICogPHA+Ci0gKiBUbyB1c2UgdGhlIG1lZGlhIHJvdXRlIGFjdGlvbiBwcm92aWRlciwgdGhlIGFjdGl2aXR5IG11c3QgYmUgYSBzdWJjbGFzcyBvZgotICoge0BsaW5rIEFwcENvbXBhdEFjdGl2aXR5fSBmcm9tIHRoZSA8Y29kZT5hbmRyb2lkLnN1cHBvcnQudjcuYXBwY29tcGF0PC9jb2RlPgotICogc3VwcG9ydCBsaWJyYXJ5LiAgUmVmZXIgdG8gc3VwcG9ydCBsaWJyYXJ5IGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuCi0gKiA8L3A+Ci0gKgotICogPGgzPkV4YW1wbGU8L2gzPgotICogPHA+Ci0gKiA8L3A+PHA+Ci0gKiBUaGUgYXBwbGljYXRpb24gc2hvdWxkIGRlZmluZSBhIG1lbnUgcmVzb3VyY2UgdG8gaW5jbHVkZSB0aGUgcHJvdmlkZXIgaW4gdGhlCi0gKiBhY3Rpb24gYmFyIG9wdGlvbnMgbWVudS4gIE5vdGUgdGhhdCB0aGUgc3VwcG9ydCBsaWJyYXJ5IGFjdGlvbiBiYXIgdXNlcyBhdHRyaWJ1dGVzCi0gKiB0aGF0IGFyZSBkZWZpbmVkIGluIHRoZSBhcHBsaWNhdGlvbidzIHJlc291cmNlIG5hbWVzcGFjZSByYXRoZXIgdGhhbiB0aGUgZnJhbWV3b3JrJ3MKLSAqIHJlc291cmNlIG5hbWVzcGFjZSB0byBjb25maWd1cmUgZWFjaCBpdGVtLgotICogPC9wPjxwcmU+Ci0gKiAmbHQ7bWVudSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gKiAgICAgICAgIHhtbG5zOmFwcD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy1hdXRvIj4KLSAqICAgICAmbHQ7aXRlbSBhbmRyb2lkOmlkPSJAK2lkL21lZGlhX3JvdXRlX21lbnVfaXRlbSIKLSAqICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9tZWRpYV9yb3V0ZV9tZW51X3RpdGxlIgotICogICAgICAgICBhcHA6c2hvd0FzQWN0aW9uPSJhbHdheXMiCi0gKiAgICAgICAgIGFwcDphY3Rpb25Qcm92aWRlckNsYXNzPSJhbmRyb2lkLnN1cHBvcnQudjcuYXBwLk1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciIvPgotICogJmx0Oy9tZW51PgotICogPC9wcmU+PHA+Ci0gKiBUaGVuIGNvbmZpZ3VyZSB0aGUgbWVudSBhbmQgc2V0IHRoZSByb3V0ZSBzZWxlY3RvciBmb3IgdGhlIGNob29zZXIuCi0gKiA8L3A+PHByZT4KLSAqIHB1YmxpYyBjbGFzcyBNeUFjdGl2aXR5IGV4dGVuZHMgQXBwQ29tcGF0QWN0aXZpdHkgewotICogICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIgbVJvdXRlcjsKLSAqICAgICBwcml2YXRlIE1lZGlhUm91dGVyLkNhbGxiYWNrIG1DYWxsYmFjazsKLSAqICAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3I7Ci0gKgotICogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAqICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAqCi0gKiAgICAgICAgIG1Sb3V0ZXIgPSBNZWRpYXJvdXRlci5nZXRJbnN0YW5jZSh0aGlzKTsKLSAqICAgICAgICAgbVNlbGVjdG9yID0gbmV3IE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyKCkKLSAqICAgICAgICAgICAgICAgICAuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKQotICogICAgICAgICAgICAgICAgIC5hZGRDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSykKLSAqICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAqICAgICAgICAgbUNhbGxiYWNrID0gbmV3IE15Q2FsbGJhY2soKTsKLSAqICAgICB9Ci0gKgotICogICAgIC8vIEFkZCB0aGUgY2FsbGJhY2sgb24gc3RhcnQgdG8gdGVsbCB0aGUgbWVkaWEgcm91dGVyIHdoYXQga2luZHMgb2Ygcm91dGVzCi0gKiAgICAgLy8gdGhlIGFwcGxpY2F0aW9uIGlzIGludGVyZXN0ZWQgaW4gc28gdGhhdCBpdCBjYW4gdHJ5IHRvIGRpc2NvdmVyIHN1aXRhYmxlIG9uZXMuCi0gKiAgICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKLSAqICAgICAgICAgc3VwZXIub25TdGFydCgpOwotICoKLSAqICAgICAgICAgbWVkaWFSb3V0ZXIuYWRkQ2FsbGJhY2sobVNlbGVjdG9yLCBtQ2FsbGJhY2ssCi0gKiAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWSk7Ci0gKgotICogICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtZWRpYVJvdXRlci51cGRhdGVTZWxlY3RlZFJvdXRlKG1TZWxlY3Rvcik7Ci0gKiAgICAgICAgIC8vIGRvIHNvbWV0aGluZyB3aXRoIHRoZSByb3V0ZS4uLgotICogICAgIH0KLSAqCi0gKiAgICAgLy8gUmVtb3ZlIHRoZSBzZWxlY3RvciBvbiBzdG9wIHRvIHRlbGwgdGhlIG1lZGlhIHJvdXRlciB0aGF0IGl0IG5vIGxvbmdlcgotICogICAgIC8vIG5lZWRzIHRvIGludmVzdCBlZmZvcnQgdHJ5aW5nIHRvIGRpc2NvdmVyIHJvdXRlcyBvZiB0aGVzZSBraW5kcyBmb3Igbm93LgotICogICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKLSAqICAgICAgICAgc3VwZXIub25TdG9wKCk7Ci0gKgotICogICAgICAgICBtZWRpYVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICogICAgIH0KLSAqCi0gKiAgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKLSAqICAgICAgICAgc3VwZXIub25DcmVhdGVPcHRpb25zTWVudShtZW51KTsKLSAqCi0gKiAgICAgICAgIGdldE1lbnVJbmZsYXRlcigpLmluZmxhdGUoUi5tZW51LnNhbXBsZV9tZWRpYV9yb3V0ZXJfbWVudSwgbWVudSk7Ci0gKgotICogICAgICAgICBNZW51SXRlbSBtZWRpYVJvdXRlTWVudUl0ZW0gPSBtZW51LmZpbmRJdGVtKFIuaWQubWVkaWFfcm91dGVfbWVudV9pdGVtKTsKLSAqICAgICAgICAgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyIG1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciA9Ci0gKiAgICAgICAgICAgICAgICAgKE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlcilNZW51SXRlbUNvbXBhdC5nZXRBY3Rpb25Qcm92aWRlcihtZWRpYVJvdXRlTWVudUl0ZW0pOwotICogICAgICAgICBtZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIuc2V0Um91dGVTZWxlY3RvcihtU2VsZWN0b3IpOwotICogICAgICAgICByZXR1cm4gdHJ1ZTsKLSAqICAgICB9Ci0gKgotICogICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTXlDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVyLkNhbGxiYWNrIHsKLSAqICAgICAgICAgLy8gSW1wbGVtZW50IGNhbGxiYWNrIG1ldGhvZHMgYXMgbmVlZGVkLgotICogICAgIH0KLSAqIH0KLSAqIDwvcHJlPgotICoKLSAqIEBzZWUgI3NldFJvdXRlU2VsZWN0b3IKLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciBleHRlbmRzIEFjdGlvblByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyIG1Sb3V0ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlckNhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IG1EaWFsb2dGYWN0b3J5ID0gTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkuZ2V0RGVmYXVsdCgpOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZUJ1dHRvbiBtQnV0dG9uOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgYWN0aW9uIHByb3ZpZGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0KLSAgICAgICAgbVJvdXRlciA9IE1lZGlhUm91dGVyLmdldEluc3RhbmNlKGNvbnRleHQpOwotICAgICAgICBtQ2FsbGJhY2sgPSBuZXcgTWVkaWFSb3V0ZXJDYWxsYmFjayh0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdGhhdCB0aGUgdXNlciBjYW4KLSAgICAgKiBzZWxlY3QgdXNpbmcgdGhlIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2VsZWN0b3IsIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGdldFJvdXRlU2VsZWN0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuCi0gICAgICogc2VsZWN0IHVzaW5nIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IsIG11c3Qgbm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um91dGVTZWxlY3RvcihATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbVNlbGVjdG9yLmVxdWFscyhzZWxlY3RvcikpIHsKLSAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBjdXJyZW50bHkgaGF2ZSBubyB3YXkgb2Yga25vd2luZyB3aGV0aGVyIHRoZSBhY3Rpb24gcHJvdmlkZXIKLSAgICAgICAgICAgIC8vIGlzIHN0aWxsIG5lZWRlZCBieSB0aGUgVUkuICBVbmZvcnR1bmF0ZWx5IHRoaXMgbWVhbnMgdGhlIGFjdGlvbiBwcm92aWRlcgotICAgICAgICAgICAgLy8gbWF5IGxlYWsgY2FsbGJhY2tzIHVudGlsIGdhcmJhZ2UgY29sbGVjdGlvbiBvY2N1cnMuICBUaGlzIG1heSByZXN1bHQgaW4KLSAgICAgICAgICAgIC8vIG1lZGlhIHJvdXRlIHByb3ZpZGVycyBkb2luZyBtb3JlIHdvcmsgdGhhbiBuZWNlc3NhcnkgaW4gdGhlIHNob3J0IHRlcm0KLSAgICAgICAgICAgIC8vIHdoaWxlIHRyeWluZyB0byBkaXNjb3ZlciByb3V0ZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIG9mIGludGVyZXN0IHRvIHRoZQotICAgICAgICAgICAgLy8gYXBwbGljYXRpb24uICBUbyBzb2x2ZSB0aGlzIHByb2JsZW0sIHRoZSBhY3Rpb24gcHJvdmlkZXIgd2lsbCBuZWVkIHNvbWUKLSAgICAgICAgICAgIC8vIGluZGljYXRpb24gZnJvbSB0aGUgZnJhbWV3b3JrIHRoYXQgaXQgaXMgYmVpbmcgZGVzdHJveWVkLgotICAgICAgICAgICAgaWYgKCFtU2VsZWN0b3IuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFzZWxlY3Rvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVyLmFkZENhbGxiYWNrKHNlbGVjdG9yLCBtQ2FsbGJhY2spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNlbGVjdG9yID0gc2VsZWN0b3I7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKLQotICAgICAgICAgICAgaWYgKG1CdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1CdXR0b24uc2V0Um91dGVTZWxlY3RvcihzZWxlY3Rvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBkaWFsb2cgZmFjdG9yeSB0byB1c2Ugd2hlbiBzaG93aW5nIHRoZSByb3V0ZSBjaG9vc2VyCi0gICAgICogb3IgY29udHJvbGxlciBkaWFsb2cuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBkaWFsb2cgZmFjdG9yeSwgbmV2ZXIgbnVsbC4KLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSBnZXREaWFsb2dGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gbURpYWxvZ0ZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgZGlhbG9nIGZhY3RvcnkgdG8gdXNlIHdoZW4gc2hvd2luZyB0aGUgcm91dGUgY2hvb3NlcgotICAgICAqIG9yIGNvbnRyb2xsZXIgZGlhbG9nLgotICAgICAqCi0gICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIGRpYWxvZyBmYWN0b3J5LCBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERpYWxvZ0ZhY3RvcnkoQE5vbk51bGwgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmYWN0b3J5IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtRGlhbG9nRmFjdG9yeSAhPSBmYWN0b3J5KSB7Ci0gICAgICAgICAgICBtRGlhbG9nRmFjdG9yeSA9IGZhY3Rvcnk7Ci0KLSAgICAgICAgICAgIGlmIChtQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQnV0dG9uLnNldERpYWxvZ0ZhY3RvcnkoZmFjdG9yeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBhc3NvY2lhdGVkIG1lZGlhIHJvdXRlIGJ1dHRvbiwgb3IgbnVsbCBpZiBpdCBoYXMgbm90IHlldCBiZWVuIGNyZWF0ZWQuCi0gICAgICovCi0gICAgQE51bGxhYmxlCi0gICAgcHVibGljIE1lZGlhUm91dGVCdXR0b24gZ2V0TWVkaWFSb3V0ZUJ1dHRvbigpIHsKLSAgICAgICAgcmV0dXJuIG1CdXR0b247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlIG1lZGlhIHJvdXRlIGJ1dHRvbiBpcyBiZWluZyBjcmVhdGVkLgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSB0aGUgYnV0dG9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUJ1dHRvbiBvbkNyZWF0ZU1lZGlhUm91dGVCdXR0b24oKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZUJ1dHRvbihnZXRDb250ZXh0KCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIFZpZXcgb25DcmVhdGVBY3Rpb25WaWV3KCkgewotICAgICAgICBpZiAobUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJvbkNyZWF0ZUFjdGlvblZpZXc6IHRoaXMgQWN0aW9uUHJvdmlkZXIgaXMgYWxyZWFkeSBhc3NvY2lhdGVkICIgKwotICAgICAgICAgICAgICAgICAgICAid2l0aCBhIG1lbnUgaXRlbS4gRG9uJ3QgcmV1c2UgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyIGluc3RhbmNlcyEgIiArCi0gICAgICAgICAgICAgICAgICAgICJBYmFuZG9uaW5nIHRoZSBvbGQgbWVudSBpdGVtLi4uIik7Ci0gICAgICAgIH0KLQotICAgICAgICBtQnV0dG9uID0gb25DcmVhdGVNZWRpYVJvdXRlQnV0dG9uKCk7Ci0gICAgICAgIG1CdXR0b24uc2V0Q2hlYXRTaGVldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIG1CdXR0b24uc2V0Um91dGVTZWxlY3RvcihtU2VsZWN0b3IpOwotICAgICAgICBtQnV0dG9uLnNldERpYWxvZ0ZhY3RvcnkobURpYWxvZ0ZhY3RvcnkpOwotICAgICAgICBtQnV0dG9uLnNldExheW91dFBhcmFtcyhuZXcgVmlld0dyb3VwLkxheW91dFBhcmFtcygKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkpOwotICAgICAgICByZXR1cm4gbUJ1dHRvbjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblBlcmZvcm1EZWZhdWx0QWN0aW9uKCkgewotICAgICAgICBpZiAobUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUJ1dHRvbi5zaG93RGlhbG9nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG92ZXJyaWRlc0l0ZW1WaXNpYmlsaXR5KCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7Ci0gICAgICAgIHJldHVybiBtUm91dGVyLmlzUm91dGVBdmFpbGFibGUobVNlbGVjdG9yLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLkFWQUlMQUJJTElUWV9GTEFHX0lHTk9SRV9ERUZBVUxUX1JPVVRFKTsKLSAgICB9Ci0KLSAgICB2b2lkIHJlZnJlc2hSb3V0ZSgpIHsKLSAgICAgICAgcmVmcmVzaFZpc2liaWxpdHkoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgewotICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8TWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyPiBtUHJvdmlkZXJXZWFrOwotCi0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlckNhbGxiYWNrKE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciBwcm92aWRlcikgewotICAgICAgICAgICAgbVByb3ZpZGVyV2VhayA9IG5ldyBXZWFrUmVmZXJlbmNlPE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlcj4ocHJvdmlkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVBZGRlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUocm91dGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUocm91dGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUocm91dGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyQWRkZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Qcm92aWRlckluZm8gcHJvdmlkZXIpIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZShyb3V0ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJSZW1vdmVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUHJvdmlkZXJJbmZvIHByb3ZpZGVyKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUocm91dGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlByb3ZpZGVySW5mbyBwcm92aWRlcikgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKHJvdXRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcmVmcmVzaFJvdXRlKE1lZGlhUm91dGVyIHJvdXRlcikgewotICAgICAgICAgICAgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gbVByb3ZpZGVyV2Vhay5nZXQoKTsKLSAgICAgICAgICAgIGlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJvdmlkZXIucmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJvdXRlci5yZW1vdmVDYWxsYmFjayh0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUJ1dHRvbi5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQnV0dG9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZThhNjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQnV0dG9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dFdyYXBwZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db2xvclN0YXRlTGlzdDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5BbmltYXRpb25EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZUNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjcud2lkZ2V0LlRvb2x0aXBDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuU291bmRFZmZlY3RDb25zdGFudHM7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7Ci0KLS8qKgotICogVGhlIG1lZGlhIHJvdXRlIGJ1dHRvbiBhbGxvd3MgdGhlIHVzZXIgdG8gc2VsZWN0IHJvdXRlcyBhbmQgdG8gY29udHJvbCB0aGUKLSAqIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZS4KLSAqIDxwPgotICogVGhlIGFwcGxpY2F0aW9uIG11c3Qgc3BlY2lmeSB0aGUga2luZHMgb2Ygcm91dGVzIHRoYXQgdGhlIHVzZXIgc2hvdWxkIGJlIGFsbG93ZWQKLSAqIHRvIHNlbGVjdCBieSBzcGVjaWZ5aW5nIGEge0BsaW5rIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3Rvcn0gd2l0aCB0aGUKLSAqIHtAbGluayAjc2V0Um91dGVTZWxlY3Rvcn0gbWV0aG9kLgotICogPC9wPjxwPgotICogV2hlbiB0aGUgZGVmYXVsdCByb3V0ZSBpcyBzZWxlY3RlZCBvciB3aGVuIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUgZG9lcyBub3QKLSAqIG1hdGNoIHRoZSB7QGxpbmsgI2dldFJvdXRlU2VsZWN0b3IoKSBzZWxlY3Rvcn0sIHRoZSBidXR0b24gd2lsbCBhcHBlYXIgaW4KLSAqIGFuIGluYWN0aXZlIHN0YXRlIGluZGljYXRpbmcgdGhhdCB0aGUgYXBwbGljYXRpb24gaXMgbm90IGNvbm5lY3RlZCB0byBhCi0gKiByb3V0ZSBvZiB0aGUga2luZCB0aGF0IGl0IHdhbnRzIHRvIHVzZS4gIENsaWNraW5nIG9uIHRoZSBidXR0b24gb3BlbnMKLSAqIGEge0BsaW5rIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nfSB0byBhbGxvdyB0aGUgdXNlciB0byBzZWxlY3QgYSByb3V0ZS4KLSAqIElmIG5vIG5vbi1kZWZhdWx0IHJvdXRlcyBtYXRjaCB0aGUgc2VsZWN0b3IgYW5kIGl0IGlzIG5vdCBwb3NzaWJsZSBmb3IgYW4gYWN0aXZlCi0gKiBzY2FuIHRvIGRpc2NvdmVyIGFueSBtYXRjaGluZyByb3V0ZXMsIHRoZW4gdGhlIGJ1dHRvbiBpcyBkaXNhYmxlZCBhbmQgY2Fubm90Ci0gKiBiZSBjbGlja2VkLgotICogPC9wPjxwPgotICogV2hlbiBhIG5vbi1kZWZhdWx0IHJvdXRlIGlzIHNlbGVjdGVkIHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IsIHRoZSBidXR0b24gd2lsbAotICogYXBwZWFyIGluIGFuIGFjdGl2ZSBzdGF0ZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGlzIGNvbm5lY3RlZAotICogdG8gYSByb3V0ZSBvZiB0aGUga2luZCB0aGF0IGl0IHdhbnRzIHRvIHVzZS4gIFRoZSBidXR0b24gbWF5IGFsc28gYXBwZWFyCi0gKiBpbiBhbiBpbnRlcm1lZGlhcnkgY29ubmVjdGluZyBzdGF0ZSBpZiB0aGUgcm91dGUgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgY29ubmVjdGluZwotICogdG8gdGhlIGRlc3RpbmF0aW9uIGJ1dCBoYXMgbm90IHlldCBjb21wbGV0ZWQgZG9pbmcgc28uICBJbiBlaXRoZXIgY2FzZSwgY2xpY2tpbmcKLSAqIG9uIHRoZSBidXR0b24gb3BlbnMgYSB7QGxpbmsgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2d9IHRvIGFsbG93IHRoZSB1c2VyCi0gKiB0byBjb250cm9sIG9yIGRpc2Nvbm5lY3QgZnJvbSB0aGUgY3VycmVudCByb3V0ZS4KLSAqIDwvcD4KLSAqCi0gKiA8aDM+UHJlcmVxdWlzaXRlczwvaDM+Ci0gKiA8cD4KLSAqIFRvIHVzZSB0aGUgbWVkaWEgcm91dGUgYnV0dG9uLCB0aGUgYWN0aXZpdHkgbXVzdCBiZSBhIHN1YmNsYXNzIG9mCi0gKiB7QGxpbmsgRnJhZ21lbnRBY3Rpdml0eX0gZnJvbSB0aGUgPGNvZGU+YW5kcm9pZC5zdXBwb3J0LnY0PC9jb2RlPgotICogc3VwcG9ydCBsaWJyYXJ5LiAgUmVmZXIgdG8gc3VwcG9ydCBsaWJyYXJ5IGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuCi0gKiA8L3A+Ci0gKgotICogQHNlZSBNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIKLSAqIEBzZWUgI3NldFJvdXRlU2VsZWN0b3IKLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUm91dGVCdXR0b24gZXh0ZW5kcyBWaWV3IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVCdXR0b24iOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIT09TRVJfRlJBR01FTlRfVEFHID0KLSAgICAgICAgICAgICJhbmRyb2lkLnN1cHBvcnQudjcubWVkaWFyb3V0ZXI6TWVkaWFSb3V0ZUNob29zZXJEaWFsb2dGcmFnbWVudCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRST0xMRVJfRlJBR01FTlRfVEFHID0KLSAgICAgICAgICAgICJhbmRyb2lkLnN1cHBvcnQudjcubWVkaWFyb3V0ZXI6TWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudCI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyIG1Sb3V0ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlckNhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKLSAgICBwcml2YXRlIGludCBtUm91dGVDYWxsYmFja0ZsYWdzOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgbURpYWxvZ0ZhY3RvcnkgPSBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeS5nZXREZWZhdWx0KCk7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbUF0dGFjaGVkVG9XaW5kb3c7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTcGFyc2VBcnJheTxEcmF3YWJsZS5Db25zdGFudFN0YXRlPiBzUmVtb3RlSW5kaWNhdG9yQ2FjaGUgPQotICAgICAgICAgICAgbmV3IFNwYXJzZUFycmF5PD4oMik7Ci0gICAgcHJpdmF0ZSBSZW1vdGVJbmRpY2F0b3JMb2FkZXIgbVJlbW90ZUluZGljYXRvckxvYWRlcjsKLSAgICBwcml2YXRlIERyYXdhYmxlIG1SZW1vdGVJbmRpY2F0b3I7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1SZW1vdGVBY3RpdmU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc0Nvbm5lY3Rpbmc7Ci0KLSAgICBwcml2YXRlIENvbG9yU3RhdGVMaXN0IG1CdXR0b25UaW50OwotICAgIHByaXZhdGUgaW50IG1NaW5XaWR0aDsKLSAgICBwcml2YXRlIGludCBtTWluSGVpZ2h0OwotCi0gICAgLy8gVGhlIGNoZWNrZWQgc3RhdGUgaXMgdXNlZCB3aGVuIGNvbm5lY3RlZCB0byBhIHJlbW90ZSByb3V0ZS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBDSEVDS0VEX1NUQVRFX1NFVCA9IHsKLSAgICAgICAgYW5kcm9pZC5SLmF0dHIuc3RhdGVfY2hlY2tlZAotICAgIH07Ci0KLSAgICAvLyBUaGUgY2hlY2thYmxlIHN0YXRlIGlzIHVzZWQgd2hpbGUgY29ubmVjdGluZyB0byBhIHJlbW90ZSByb3V0ZS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBDSEVDS0FCTEVfU1RBVEVfU0VUID0gewotICAgICAgICBhbmRyb2lkLlIuYXR0ci5zdGF0ZV9jaGVja2FibGUKLSAgICB9OwotCi0gICAgcHVibGljIE1lZGlhUm91dGVCdXR0b24oQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhUm91dGVCdXR0b24oQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgUi5hdHRyLm1lZGlhUm91dGVCdXR0b25TdHlsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhUm91dGVCdXR0b24oQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIpIHsKLSAgICAgICAgc3VwZXIoTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5jcmVhdGVUaGVtZWRCdXR0b25Db250ZXh0KGNvbnRleHQpLCBhdHRycywgZGVmU3R5bGVBdHRyKTsKLSAgICAgICAgY29udGV4dCA9IGdldENvbnRleHQoKTsKLQotICAgICAgICBtUm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UoY29udGV4dCk7Ci0gICAgICAgIG1DYWxsYmFjayA9IG5ldyBNZWRpYVJvdXRlckNhbGxiYWNrKCk7Ci0KLSAgICAgICAgUmVzb3VyY2VzLlRoZW1lIHRoZW1lID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5uZXdUaGVtZSgpOwotICAgICAgICB0aGVtZS5hcHBseVN0eWxlKE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0Um91dGVyVGhlbWVJZChjb250ZXh0KSwgdHJ1ZSk7Ci0gICAgICAgIFR5cGVkQXJyYXkgYSA9IHRoZW1lLm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsCi0gICAgICAgICAgICAgICAgUi5zdHlsZWFibGUuTWVkaWFSb3V0ZUJ1dHRvbiwgZGVmU3R5bGVBdHRyLCAwKTsKLQotICAgICAgICBtQnV0dG9uVGludCA9IGEuZ2V0Q29sb3JTdGF0ZUxpc3QoUi5zdHlsZWFibGUuTWVkaWFSb3V0ZUJ1dHRvbl9tZWRpYVJvdXRlQnV0dG9uVGludCk7Ci0gICAgICAgIG1NaW5XaWR0aCA9IGEuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLk1lZGlhUm91dGVCdXR0b25fYW5kcm9pZF9taW5XaWR0aCwgMCk7Ci0gICAgICAgIG1NaW5IZWlnaHQgPSBhLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5NZWRpYVJvdXRlQnV0dG9uX2FuZHJvaWRfbWluSGVpZ2h0LCAwKTsKLSAgICAgICAgaW50IHJlbW90ZUluZGljYXRvclJlc0lkID0gYS5nZXRSZXNvdXJjZUlkKAotICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLk1lZGlhUm91dGVCdXR0b25fZXh0ZXJuYWxSb3V0ZUVuYWJsZWREcmF3YWJsZSwgMCk7Ci0gICAgICAgIGEucmVjeWNsZSgpOwotCi0gICAgICAgIGlmIChyZW1vdGVJbmRpY2F0b3JSZXNJZCAhPSAwKSB7Ci0gICAgICAgICAgICBEcmF3YWJsZS5Db25zdGFudFN0YXRlIHJlbW90ZUluZGljYXRvclN0YXRlID0KLSAgICAgICAgICAgICAgICAgICAgc1JlbW90ZUluZGljYXRvckNhY2hlLmdldChyZW1vdGVJbmRpY2F0b3JSZXNJZCk7Ci0gICAgICAgICAgICBpZiAocmVtb3RlSW5kaWNhdG9yU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNldFJlbW90ZUluZGljYXRvckRyYXdhYmxlKHJlbW90ZUluZGljYXRvclN0YXRlLm5ld0RyYXdhYmxlKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yTG9hZGVyID0gbmV3IFJlbW90ZUluZGljYXRvckxvYWRlcihyZW1vdGVJbmRpY2F0b3JSZXNJZCk7Ci0gICAgICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvckxvYWRlci5leGVjdXRlT25FeGVjdXRvcihBc3luY1Rhc2suVEhSRUFEX1BPT0xfRVhFQ1VUT1IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdXBkYXRlQ29udGVudERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIHNldENsaWNrYWJsZSh0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdGhhdCB0aGUgdXNlciBjYW4KLSAgICAgKiBzZWxlY3QgdXNpbmcgdGhlIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2VsZWN0b3IsIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGdldFJvdXRlU2VsZWN0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuCi0gICAgICogc2VsZWN0IHVzaW5nIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um91dGVTZWxlY3RvcihNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgc2V0Um91dGVTZWxlY3RvcihzZWxlY3RvciwgMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuCi0gICAgICogc2VsZWN0IHVzaW5nIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IuCi0gICAgICogQHBhcmFtIGZsYWdzIEZsYWdzIHRvIGNvbnRyb2wgdGhlIGJlaGF2aW9yIG9mIHRoZSBjYWxsYmFjay4gTWF5IGJlIHplcm8gb3IgYSBjb21iaW5hdGlvbiBvZgotICAgICAqICAgICAgICAgICAgICB7QGxpbmsgI01lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTn0gYW5kCi0gICAgICogICAgICAgICAgICAgIHtAbGluayAjTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UU30uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um91dGVTZWxlY3RvcihNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IsIGludCBmbGFncykgewotICAgICAgICBpZiAobVNlbGVjdG9yLmVxdWFscyhzZWxlY3RvcikgJiYgbVJvdXRlQ2FsbGJhY2tGbGFncyA9PSBmbGFncykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbVNlbGVjdG9yLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsIHx8IHNlbGVjdG9yLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbVNlbGVjdG9yID0gc2VsZWN0b3I7Ci0gICAgICAgIG1Sb3V0ZUNhbGxiYWNrRmxhZ3MgPSBmbGFnczsKLQotICAgICAgICBpZiAobUF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgIG1Sb3V0ZXIuYWRkQ2FsbGJhY2soc2VsZWN0b3IsIG1DYWxsYmFjaywgZmxhZ3MpOwotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBkaWFsb2cgZmFjdG9yeSB0byB1c2Ugd2hlbiBzaG93aW5nIHRoZSByb3V0ZSBjaG9vc2VyCi0gICAgICogb3IgY29udHJvbGxlciBkaWFsb2cuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBkaWFsb2cgZmFjdG9yeSwgbmV2ZXIgbnVsbC4KLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSBnZXREaWFsb2dGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gbURpYWxvZ0ZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgZGlhbG9nIGZhY3RvcnkgdG8gdXNlIHdoZW4gc2hvd2luZyB0aGUgcm91dGUgY2hvb3NlcgotICAgICAqIG9yIGNvbnRyb2xsZXIgZGlhbG9nLgotICAgICAqCi0gICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIGRpYWxvZyBmYWN0b3J5LCBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERpYWxvZ0ZhY3RvcnkoQE5vbk51bGwgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmYWN0b3J5IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1EaWFsb2dGYWN0b3J5ID0gZmFjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG93IHRoZSByb3V0ZSBjaG9vc2VyIG9yIGNvbnRyb2xsZXIgZGlhbG9nLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBkZWZhdWx0IHJvdXRlIGlzIHNlbGVjdGVkIG9yIGlmIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUgZG9lcwotICAgICAqIG5vdCBtYXRjaCB0aGUge0BsaW5rICNnZXRSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yfSwgdGhlbiBzaG93cyB0aGUgcm91dGUgY2hvb3NlciBkaWFsb2cuCi0gICAgICogT3RoZXJ3aXNlLCBzaG93cyB0aGUgcm91dGUgY29udHJvbGxlciBkaWFsb2cgdG8gb2ZmZXIgdGhlIHVzZXIKLSAgICAgKiBhIGNob2ljZSB0byBkaXNjb25uZWN0IGZyb20gdGhlIHJvdXRlIG9yIHBlcmZvcm0gb3RoZXIgY29udHJvbCBhY3Rpb25zCi0gICAgICogc3VjaCBhcyBzZXR0aW5nIHRoZSByb3V0ZSdzIHZvbHVtZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIGFwcGxpY2F0aW9uIGNhbiBjdXN0b21pemUgdGhlIGRpYWxvZ3MgYnkgY2FsbGluZyB7QGxpbmsgI3NldERpYWxvZ0ZhY3Rvcnl9Ci0gICAgICogdG8gcHJvdmlkZSBhIGN1c3RvbWl6ZWQgZGlhbG9nIGZhY3RvcnkuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBkaWFsb2cgd2FzIGFjdHVhbGx5IHNob3duLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIGFjdGl2aXR5IGlzIG5vdCBhIHN1YmNsYXNzIG9mCi0gICAgICoge0BsaW5rIEZyYWdtZW50QWN0aXZpdHl9LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNob3dEaWFsb2coKSB7Ci0gICAgICAgIGlmICghbUF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIEZyYWdtZW50TWFuYWdlciBmbSA9IGdldEFjdGl2aXR5KCkuZ2V0RnJhZ21lbnRNYW5hZ2VyKCk7Ci0gICAgICAgIGlmIChmbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgYWN0aXZpdHkgbXVzdCBiZSBhIHN1YmNsYXNzIG9mIEZyYWdtZW50QWN0aXZpdHkiKTsKLSAgICAgICAgfQotCi0gICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1Sb3V0ZXIuZ2V0U2VsZWN0ZWRSb3V0ZSgpOwotICAgICAgICBpZiAocm91dGUuaXNEZWZhdWx0T3JCbHVldG9vdGgoKSB8fCAhcm91dGUubWF0Y2hlc1NlbGVjdG9yKG1TZWxlY3RvcikpIHsKLSAgICAgICAgICAgIGlmIChmbS5maW5kRnJhZ21lbnRCeVRhZyhDSE9PU0VSX0ZSQUdNRU5UX1RBRykgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNob3dEaWFsb2coKTogUm91dGUgY2hvb3NlciBkaWFsb2cgYWxyZWFkeSBzaG93aW5nISIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQgZiA9Ci0gICAgICAgICAgICAgICAgICAgIG1EaWFsb2dGYWN0b3J5Lm9uQ3JlYXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50KCk7Ci0gICAgICAgICAgICBmLnNldFJvdXRlU2VsZWN0b3IobVNlbGVjdG9yKTsKLSAgICAgICAgICAgIGYuc2hvdyhmbSwgQ0hPT1NFUl9GUkFHTUVOVF9UQUcpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGZtLmZpbmRGcmFnbWVudEJ5VGFnKENPTlRST0xMRVJfRlJBR01FTlRfVEFHKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2hvd0RpYWxvZygpOiBSb3V0ZSBjb250cm9sbGVyIGRpYWxvZyBhbHJlYWR5IHNob3dpbmchIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudCBmID0KLSAgICAgICAgICAgICAgICAgICAgbURpYWxvZ0ZhY3Rvcnkub25DcmVhdGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQoKTsKLSAgICAgICAgICAgIGYuc2hvdyhmbSwgQ09OVFJPTExFUl9GUkFHTUVOVF9UQUcpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBBY3Rpdml0eSBnZXRBY3Rpdml0eSgpIHsKLSAgICAgICAgLy8gR3Jvc3Mgd2F5IG9mIHVud3JhcHBpbmcgdGhlIEFjdGl2aXR5IHNvIHdlIGNhbiBnZXQgdGhlIEZyYWdtZW50TWFuYWdlcgotICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7Ci0gICAgICAgIHdoaWxlIChjb250ZXh0IGluc3RhbmNlb2YgQ29udGV4dFdyYXBwZXIpIHsKLSAgICAgICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKEFjdGl2aXR5KWNvbnRleHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250ZXh0ID0gKChDb250ZXh0V3JhcHBlciljb250ZXh0KS5nZXRCYXNlQ29udGV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB0byBlbmFibGUgc2hvd2luZyBhIHRvYXN0IHdpdGggdGhlIGNvbnRlbnQgZGVzY3JpcHRvciBvZiB0aGUKLSAgICAgKiBidXR0b24gd2hlbiB0aGUgYnV0dG9uIGlzIGxvbmcgcHJlc3NlZC4KLSAgICAgKi8KLSAgICB2b2lkIHNldENoZWF0U2hlZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIFRvb2x0aXBDb21wYXQuc2V0VG9vbHRpcFRleHQodGhpcywgZW5hYmxlCi0gICAgICAgICAgICAgICAgPyBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGdldENvbnRleHQoKSkKLSAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZyhSLnN0cmluZy5tcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbikKLSAgICAgICAgICAgICAgICA6IG51bGwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1DbGljaygpIHsKLSAgICAgICAgLy8gU2VuZCB0aGUgYXBwcm9wcmlhdGUgYWNjZXNzaWJpbGl0eSBldmVudHMgYW5kIGNhbGwgbGlzdGVuZXJzCi0gICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IHN1cGVyLnBlcmZvcm1DbGljaygpOwotICAgICAgICBpZiAoIWhhbmRsZWQpIHsKLSAgICAgICAgICAgIHBsYXlTb3VuZEVmZmVjdChTb3VuZEVmZmVjdENvbnN0YW50cy5DTElDSyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNob3dEaWFsb2coKSB8fCBoYW5kbGVkOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBpbnRbXSBvbkNyZWF0ZURyYXdhYmxlU3RhdGUoaW50IGV4dHJhU3BhY2UpIHsKLSAgICAgICAgZmluYWwgaW50W10gZHJhd2FibGVTdGF0ZSA9IHN1cGVyLm9uQ3JlYXRlRHJhd2FibGVTdGF0ZShleHRyYVNwYWNlICsgMSk7Ci0KLSAgICAgICAgLy8gVGVjaG5pY2FsbHkgd2Ugc2hvdWxkIGJlIGhhbmRsaW5nIHRoaXMgbW9yZSBjb21wbGV0ZWx5LCBidXQgdGhlc2UKLSAgICAgICAgLy8gYXJlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgaGVyZS4gQ2hlY2thYmxlIGlzIHVzZWQgdG8gZXhwcmVzcyB0aGUgY29ubmVjdGluZwotICAgICAgICAvLyBkcmF3YWJsZSBzdGF0ZSBhbmQgaXQncyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBjaGVjayBmb3IgdGhlIHB1cnBvc2VzCi0gICAgICAgIC8vIG9mIHN0YXRlIHNlbGVjdGlvbiBoZXJlLgotICAgICAgICBpZiAobUlzQ29ubmVjdGluZykgewotICAgICAgICAgICAgbWVyZ2VEcmF3YWJsZVN0YXRlcyhkcmF3YWJsZVN0YXRlLCBDSEVDS0FCTEVfU1RBVEVfU0VUKTsKLSAgICAgICAgfSBlbHNlIGlmIChtUmVtb3RlQWN0aXZlKSB7Ci0gICAgICAgICAgICBtZXJnZURyYXdhYmxlU3RhdGVzKGRyYXdhYmxlU3RhdGUsIENIRUNLRURfU1RBVEVfU0VUKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZHJhd2FibGVTdGF0ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBkcmF3YWJsZVN0YXRlQ2hhbmdlZCgpIHsKLSAgICAgICAgc3VwZXIuZHJhd2FibGVTdGF0ZUNoYW5nZWQoKTsKLQotICAgICAgICBpZiAobVJlbW90ZUluZGljYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRbXSBteURyYXdhYmxlU3RhdGUgPSBnZXREcmF3YWJsZVN0YXRlKCk7Ci0gICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yLnNldFN0YXRlKG15RHJhd2FibGVTdGF0ZSk7Ci0gICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgZHJhd2FibGUgdG8gdXNlIGFzIHRoZSByZW1vdGUgcm91dGUgaW5kaWNhdG9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlbW90ZUluZGljYXRvckRyYXdhYmxlKERyYXdhYmxlIGQpIHsKLSAgICAgICAgaWYgKG1SZW1vdGVJbmRpY2F0b3JMb2FkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvckxvYWRlci5jYW5jZWwoZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvci5zZXRDYWxsYmFjayhudWxsKTsKLSAgICAgICAgICAgIHVuc2NoZWR1bGVEcmF3YWJsZShtUmVtb3RlSW5kaWNhdG9yKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobUJ1dHRvblRpbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGQgPSBEcmF3YWJsZUNvbXBhdC53cmFwKGQubXV0YXRlKCkpOwotICAgICAgICAgICAgICAgIERyYXdhYmxlQ29tcGF0LnNldFRpbnRMaXN0KGQsIG1CdXR0b25UaW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGQuc2V0Q2FsbGJhY2sodGhpcyk7Ci0gICAgICAgICAgICBkLnNldFN0YXRlKGdldERyYXdhYmxlU3RhdGUoKSk7Ci0gICAgICAgICAgICBkLnNldFZpc2libGUoZ2V0VmlzaWJpbGl0eSgpID09IFZJU0lCTEUsIGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBtUmVtb3RlSW5kaWNhdG9yID0gZDsKLQotICAgICAgICByZWZyZXNoRHJhd2FibGVTdGF0ZSgpOwotICAgICAgICBpZiAobUF0dGFjaGVkVG9XaW5kb3cgJiYgbVJlbW90ZUluZGljYXRvciAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgbVJlbW90ZUluZGljYXRvci5nZXRDdXJyZW50KCkgaW5zdGFuY2VvZiBBbmltYXRpb25EcmF3YWJsZSkgewotICAgICAgICAgICAgQW5pbWF0aW9uRHJhd2FibGUgY3VyRHJhd2FibGUgPSAoQW5pbWF0aW9uRHJhd2FibGUpIG1SZW1vdGVJbmRpY2F0b3IuZ2V0Q3VycmVudCgpOwotICAgICAgICAgICAgaWYgKG1Jc0Nvbm5lY3RpbmcpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWN1ckRyYXdhYmxlLmlzUnVubmluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1ckRyYXdhYmxlLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtUmVtb3RlQWN0aXZlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGN1ckRyYXdhYmxlLmlzUnVubmluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1ckRyYXdhYmxlLnN0b3AoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY3VyRHJhd2FibGUuc2VsZWN0RHJhd2FibGUoY3VyRHJhd2FibGUuZ2V0TnVtYmVyT2ZGcmFtZXMoKSAtIDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmVyaWZ5RHJhd2FibGUoRHJhd2FibGUgd2hvKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci52ZXJpZnlEcmF3YWJsZSh3aG8pIHx8IHdobyA9PSBtUmVtb3RlSW5kaWNhdG9yOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGp1bXBEcmF3YWJsZXNUb0N1cnJlbnRTdGF0ZSgpIHsKLSAgICAgICAgLy8gV2UgY2FuJ3QgY2FsbCBzdXBlciB0byBoYW5kbGUgdGhlIGJhY2tncm91bmQgc28gd2UgZG8gaXQgb3Vyc2VsdmVzLgotICAgICAgICAvL3N1cGVyLmp1bXBEcmF3YWJsZXNUb0N1cnJlbnRTdGF0ZSgpOwotICAgICAgICBpZiAoZ2V0QmFja2dyb3VuZCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIERyYXdhYmxlQ29tcGF0Lmp1bXBUb0N1cnJlbnRTdGF0ZShnZXRCYWNrZ3JvdW5kKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSGFuZGxlIG91ciBvd24gcmVtb3RlIGluZGljYXRvci4KLSAgICAgICAgaWYgKG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgRHJhd2FibGVDb21wYXQuanVtcFRvQ3VycmVudFN0YXRlKG1SZW1vdGVJbmRpY2F0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VmlzaWJpbGl0eShpbnQgdmlzaWJpbGl0eSkgewotICAgICAgICBzdXBlci5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotCi0gICAgICAgIGlmIChtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3Iuc2V0VmlzaWJsZShnZXRWaXNpYmlsaXR5KCkgPT0gVklTSUJMRSwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgewotICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKLQotICAgICAgICBtQXR0YWNoZWRUb1dpbmRvdyA9IHRydWU7Ci0gICAgICAgIGlmICghbVNlbGVjdG9yLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhtU2VsZWN0b3IsIG1DYWxsYmFjaywgbVJvdXRlQ2FsbGJhY2tGbGFncyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7Ci0gICAgICAgIG1BdHRhY2hlZFRvV2luZG93ID0gZmFsc2U7Ci0gICAgICAgIGlmICghbVNlbGVjdG9yLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICAgICAgICB9Ci0KLSAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgewotICAgICAgICBmaW5hbCBpbnQgd2lkdGhTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZSh3aWR0aE1lYXN1cmVTcGVjKTsKLSAgICAgICAgZmluYWwgaW50IGhlaWdodFNpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKGhlaWdodE1lYXN1cmVTcGVjKTsKLSAgICAgICAgZmluYWwgaW50IHdpZHRoTW9kZSA9IE1lYXN1cmVTcGVjLmdldE1vZGUod2lkdGhNZWFzdXJlU3BlYyk7Ci0gICAgICAgIGZpbmFsIGludCBoZWlnaHRNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZShoZWlnaHRNZWFzdXJlU3BlYyk7Ci0KLSAgICAgICAgZmluYWwgaW50IHdpZHRoID0gTWF0aC5tYXgobU1pbldpZHRoLCBtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwgPwotICAgICAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3IuZ2V0SW50cmluc2ljV2lkdGgoKSArIGdldFBhZGRpbmdMZWZ0KCkgKyBnZXRQYWRkaW5nUmlnaHQoKSA6IDApOwotICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gTWF0aC5tYXgobU1pbkhlaWdodCwgbVJlbW90ZUluZGljYXRvciAhPSBudWxsID8KLSAgICAgICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yLmdldEludHJpbnNpY0hlaWdodCgpICsgZ2V0UGFkZGluZ1RvcCgpICsgZ2V0UGFkZGluZ0JvdHRvbSgpIDogMCk7Ci0KLSAgICAgICAgaW50IG1lYXN1cmVkV2lkdGg7Ci0gICAgICAgIHN3aXRjaCAod2lkdGhNb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIE1lYXN1cmVTcGVjLkVYQUNUTFk6Ci0gICAgICAgICAgICAgICAgbWVhc3VyZWRXaWR0aCA9IHdpZHRoU2l6ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVhc3VyZVNwZWMuQVRfTU9TVDoKLSAgICAgICAgICAgICAgICBtZWFzdXJlZFdpZHRoID0gTWF0aC5taW4od2lkdGhTaXplLCB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgY2FzZSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRDoKLSAgICAgICAgICAgICAgICBtZWFzdXJlZFdpZHRoID0gd2lkdGg7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbWVhc3VyZWRIZWlnaHQ7Ci0gICAgICAgIHN3aXRjaCAoaGVpZ2h0TW9kZSkgewotICAgICAgICAgICAgY2FzZSBNZWFzdXJlU3BlYy5FWEFDVExZOgotICAgICAgICAgICAgICAgIG1lYXN1cmVkSGVpZ2h0ID0gaGVpZ2h0U2l6ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVhc3VyZVNwZWMuQVRfTU9TVDoKLSAgICAgICAgICAgICAgICBtZWFzdXJlZEhlaWdodCA9IE1hdGgubWluKGhlaWdodFNpemUsIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgY2FzZSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRDoKLSAgICAgICAgICAgICAgICBtZWFzdXJlZEhlaWdodCA9IGhlaWdodDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKG1lYXN1cmVkV2lkdGgsIG1lYXN1cmVkSGVpZ2h0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgewotICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKLQotICAgICAgICBpZiAobVJlbW90ZUluZGljYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbGVmdCA9IGdldFBhZGRpbmdMZWZ0KCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgcmlnaHQgPSBnZXRXaWR0aCgpIC0gZ2V0UGFkZGluZ1JpZ2h0KCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgdG9wID0gZ2V0UGFkZGluZ1RvcCgpOwotICAgICAgICAgICAgZmluYWwgaW50IGJvdHRvbSA9IGdldEhlaWdodCgpIC0gZ2V0UGFkZGluZ0JvdHRvbSgpOwotCi0gICAgICAgICAgICBmaW5hbCBpbnQgZHJhd1dpZHRoID0gbVJlbW90ZUluZGljYXRvci5nZXRJbnRyaW5zaWNXaWR0aCgpOwotICAgICAgICAgICAgZmluYWwgaW50IGRyYXdIZWlnaHQgPSBtUmVtb3RlSW5kaWNhdG9yLmdldEludHJpbnNpY0hlaWdodCgpOwotICAgICAgICAgICAgZmluYWwgaW50IGRyYXdMZWZ0ID0gbGVmdCArIChyaWdodCAtIGxlZnQgLSBkcmF3V2lkdGgpIC8gMjsKLSAgICAgICAgICAgIGZpbmFsIGludCBkcmF3VG9wID0gdG9wICsgKGJvdHRvbSAtIHRvcCAtIGRyYXdIZWlnaHQpIC8gMjsKLQotICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvci5zZXRCb3VuZHMoZHJhd0xlZnQsIGRyYXdUb3AsCi0gICAgICAgICAgICAgICAgICAgIGRyYXdMZWZ0ICsgZHJhd1dpZHRoLCBkcmF3VG9wICsgZHJhd0hlaWdodCk7Ci0gICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yLmRyYXcoY2FudmFzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgcmVmcmVzaFJvdXRlKCkgewotICAgICAgICBmaW5hbCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtUm91dGVyLmdldFNlbGVjdGVkUm91dGUoKTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBpc1JlbW90ZSA9ICFyb3V0ZS5pc0RlZmF1bHRPckJsdWV0b290aCgpICYmIHJvdXRlLm1hdGNoZXNTZWxlY3RvcihtU2VsZWN0b3IpOwotICAgICAgICBmaW5hbCBib29sZWFuIGlzQ29ubmVjdGluZyA9IGlzUmVtb3RlICYmIHJvdXRlLmlzQ29ubmVjdGluZygpOwotICAgICAgICBib29sZWFuIG5lZWRzUmVmcmVzaCA9IGZhbHNlOwotICAgICAgICBpZiAobVJlbW90ZUFjdGl2ZSAhPSBpc1JlbW90ZSkgewotICAgICAgICAgICAgbVJlbW90ZUFjdGl2ZSA9IGlzUmVtb3RlOwotICAgICAgICAgICAgbmVlZHNSZWZyZXNoID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUlzQ29ubmVjdGluZyAhPSBpc0Nvbm5lY3RpbmcpIHsKLSAgICAgICAgICAgIG1Jc0Nvbm5lY3RpbmcgPSBpc0Nvbm5lY3Rpbmc7Ci0gICAgICAgICAgICBuZWVkc1JlZnJlc2ggPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5lZWRzUmVmcmVzaCkgewotICAgICAgICAgICAgdXBkYXRlQ29udGVudERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICByZWZyZXNoRHJhd2FibGVTdGF0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQXR0YWNoZWRUb1dpbmRvdykgewotICAgICAgICAgICAgc2V0RW5hYmxlZChtUm91dGVyLmlzUm91dGVBdmFpbGFibGUobVNlbGVjdG9yLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5BVkFJTEFCSUxJVFlfRkxBR19JR05PUkVfREVGQVVMVF9ST1VURSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiBtUmVtb3RlSW5kaWNhdG9yLmdldEN1cnJlbnQoKSBpbnN0YW5jZW9mIEFuaW1hdGlvbkRyYXdhYmxlKSB7Ci0gICAgICAgICAgICBBbmltYXRpb25EcmF3YWJsZSBjdXJEcmF3YWJsZSA9IChBbmltYXRpb25EcmF3YWJsZSkgbVJlbW90ZUluZGljYXRvci5nZXRDdXJyZW50KCk7Ci0gICAgICAgICAgICBpZiAobUF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgICAgICBpZiAoKG5lZWRzUmVmcmVzaCB8fCBpc0Nvbm5lY3RpbmcpICYmICFjdXJEcmF3YWJsZS5pc1J1bm5pbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBjdXJEcmF3YWJsZS5zdGFydCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNSZW1vdGUgJiYgIWlzQ29ubmVjdGluZykgewotICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIHJvdXRlIGlzIGFscmVhZHkgY29ubmVjdGVkIGJlZm9yZSB0aGUgdmlldyBpcyBhdHRhY2hlZCwgc2hvdyB0aGUgbGFzdAotICAgICAgICAgICAgICAgIC8vIGZyYW1lIG9mIHRoZSBjb25uZWN0ZWQgYW5pbWF0aW9uIGltbWVkaWF0ZWx5LgotICAgICAgICAgICAgICAgIGlmIChjdXJEcmF3YWJsZS5pc1J1bm5pbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBjdXJEcmF3YWJsZS5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGN1ckRyYXdhYmxlLnNlbGVjdERyYXdhYmxlKGN1ckRyYXdhYmxlLmdldE51bWJlck9mRnJhbWVzKCkgLSAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVDb250ZW50RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIGludCByZXNJZDsKLSAgICAgICAgaWYgKG1Jc0Nvbm5lY3RpbmcpIHsKLSAgICAgICAgICAgIHJlc0lkID0gUi5zdHJpbmcubXJfY2FzdF9idXR0b25fY29ubmVjdGluZzsKLSAgICAgICAgfSBlbHNlIGlmIChtUmVtb3RlQWN0aXZlKSB7Ci0gICAgICAgICAgICByZXNJZCA9IFIuc3RyaW5nLm1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc0lkID0gUi5zdHJpbmcubXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkOwotICAgICAgICB9Ci0gICAgICAgIHNldENvbnRlbnREZXNjcmlwdGlvbihBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGdldENvbnRleHQoKSkuZ2V0U3RyaW5nKHJlc0lkKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgewotICAgICAgICBNZWRpYVJvdXRlckNhbGxiYWNrKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVBZGRlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlU2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuc2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckFkZGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUHJvdmlkZXJJbmZvIHByb3ZpZGVyKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlByb3ZpZGVySW5mbyBwcm92aWRlcikgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Qcm92aWRlckluZm8gcHJvdmlkZXIpIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBSZW1vdGVJbmRpY2F0b3JMb2FkZXIgZXh0ZW5kcyBBc3luY1Rhc2s8Vm9pZCwgVm9pZCwgRHJhd2FibGU+IHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVJlc0lkOwotCi0gICAgICAgIFJlbW90ZUluZGljYXRvckxvYWRlcihpbnQgcmVzSWQpIHsKLSAgICAgICAgICAgIG1SZXNJZCA9IHJlc0lkOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBEcmF3YWJsZSBkb0luQmFja2dyb3VuZChWb2lkLi4uIHBhcmFtcykgewotICAgICAgICAgICAgcmV0dXJuIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoZ2V0Q29udGV4dCgpKS5nZXREcmF3YWJsZShtUmVzSWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEV4ZWN1dGUoRHJhd2FibGUgcmVtb3RlSW5kaWNhdG9yKSB7Ci0gICAgICAgICAgICBjYWNoZUFuZFJlc2V0KHJlbW90ZUluZGljYXRvcik7Ci0gICAgICAgICAgICBzZXRSZW1vdGVJbmRpY2F0b3JEcmF3YWJsZShyZW1vdGVJbmRpY2F0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uQ2FuY2VsbGVkKERyYXdhYmxlIHJlbW90ZUluZGljYXRvcikgewotICAgICAgICAgICAgY2FjaGVBbmRSZXNldChyZW1vdGVJbmRpY2F0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNhY2hlQW5kUmVzZXQoRHJhd2FibGUgcmVtb3RlSW5kaWNhdG9yKSB7Ci0gICAgICAgICAgICBpZiAocmVtb3RlSW5kaWNhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzUmVtb3RlSW5kaWNhdG9yQ2FjaGUucHV0KG1SZXNJZCwgcmVtb3RlSW5kaWNhdG9yLmdldENvbnN0YW50U3RhdGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yTG9hZGVyID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNob29zZXJEaWFsb2cuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNob29zZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FjNjRkOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDaG9vc2VyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mby5DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8uQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY3LmFwcC5BcHBDb21wYXREaWFsb2c7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0VGhlbWVXcmFwcGVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwotaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSByb3V0ZSBjaG9vc2VyIGRpYWxvZyBmb3Ige0BsaW5rIE1lZGlhUm91dGVyfS4KLSAqIDxwPgotICogVGhpcyBkaWFsb2cgYWxsb3dzIHRoZSB1c2VyIHRvIGNob29zZSBhIHJvdXRlIHRoYXQgbWF0Y2hlcyBhIGdpdmVuIHNlbGVjdG9yLgotICogPC9wPgotICoKLSAqIEBzZWUgTWVkaWFSb3V0ZUJ1dHRvbgotICogQHNlZSBNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIKLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZyI7Ci0KLSAgICAvLyBEbyBub3QgdXBkYXRlIHRoZSByb3V0ZSBsaXN0IGltbWVkaWF0ZWx5IHRvIGF2b2lkIHVubmF0dXJhbCBkaWFsb2cgY2hhbmdlLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVVBEQVRFX1JPVVRFU19ERUxBWV9NUyA9IDMwMEw7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNU0dfVVBEQVRFX1JPVVRFUyA9IDE7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyIG1Sb3V0ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlckNhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHByaXZhdGUgVGV4dFZpZXcgbVRpdGxlVmlldzsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiBtUm91dGVzOwotICAgIHByaXZhdGUgUm91dGVBZGFwdGVyIG1BZGFwdGVyOwotICAgIHByaXZhdGUgTGlzdFZpZXcgbUxpc3RWaWV3OwotICAgIHByaXZhdGUgYm9vbGVhbiBtQXR0YWNoZWRUb1dpbmRvdzsKLSAgICBwcml2YXRlIGxvbmcgbUxhc3RVcGRhdGVUaW1lOwotICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU0dfVVBEQVRFX1JPVVRFUzoKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlUm91dGVzKChMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4pIG1lc3NhZ2Uub2JqKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHVibGljIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZyhDb250ZXh0IGNvbnRleHQsIGludCB0aGVtZSkgewotICAgICAgICAvLyBUT0RPIChiLzcyOTc1OTc2KTogQXZvaWQgdG8gdXNlIENvbnRleHRUaGVtZVdyYXBwZXIgd2l0aCBhcHAgY29udGV4dCBhbmQgbGliIHRoZW1lLgotICAgICAgICBzdXBlcihuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihjb250ZXh0LCBBcGlIZWxwZXIuZ2V0TGliVGhlbWUoY29udGV4dCwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldFJvdXRlclRoZW1lSWQoY29udGV4dCkpKSwgdGhlbWUpOwotICAgICAgICBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOwotCi0gICAgICAgIG1Sb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShjb250ZXh0KTsKLSAgICAgICAgbUNhbGxiYWNrID0gbmV3IE1lZGlhUm91dGVyQ2FsbGJhY2soKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdGhhdCB0aGUgdXNlciBjYW4gc2VsZWN0LgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2VsZWN0b3IsIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGdldFJvdXRlU2VsZWN0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuIHNlbGVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IsIG11c3Qgbm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um91dGVTZWxlY3RvcihATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbVNlbGVjdG9yLmVxdWFscyhzZWxlY3RvcikpIHsKLSAgICAgICAgICAgIG1TZWxlY3RvciA9IHNlbGVjdG9yOwotCi0gICAgICAgICAgICBpZiAobUF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVyLnJlbW92ZUNhbGxiYWNrKG1DYWxsYmFjayk7Ci0gICAgICAgICAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhzZWxlY3RvciwgbUNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVmcmVzaFJvdXRlcygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHRvIGZpbHRlciB0aGUgc2V0IG9mIHJvdXRlcyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbGlzdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpdGVyYXRlcyBvdmVyIGFsbCByb3V0ZXMgaW4gdGhlIHByb3ZpZGVkIGxpc3QgYW5kCi0gICAgICogcmVtb3ZlcyB0aG9zZSBmb3Igd2hpY2gge0BsaW5rICNvbkZpbHRlclJvdXRlfSByZXR1cm5zIGZhbHNlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSByb3V0ZXMgVGhlIGxpc3Qgb2Ygcm91dGVzIHRvIGZpbHRlciBpbi1wbGFjZSwgbmV2ZXIgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkZpbHRlclJvdXRlcyhATm9uTnVsbCBMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gcm91dGVzKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSByb3V0ZXMuc2l6ZSgpOyBpLS0gPiAwOyApIHsKLSAgICAgICAgICAgIGlmICghb25GaWx0ZXJSb3V0ZShyb3V0ZXMuZ2V0KGkpKSkgewotICAgICAgICAgICAgICAgIHJvdXRlcy5yZW1vdmUoaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbGlzdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRydWUgZm9yIGVuYWJsZWQgbm9uLWRlZmF1bHQgcm91dGVzIHRoYXQKLSAgICAgKiBtYXRjaCB0aGUgc2VsZWN0b3IuICBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBmaWx0ZXIgcm91dGVzCi0gICAgICogZGlmZmVyZW50bHkuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0byBjb25zaWRlciwgbmV2ZXIgbnVsbC4KLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvdXRlIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgY2hvb3NlciBkaWFsb2cuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gb25GaWx0ZXJSb3V0ZShATm9uTnVsbCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgcmV0dXJuICFyb3V0ZS5pc0RlZmF1bHRPckJsdWV0b290aCgpICYmIHJvdXRlLmlzRW5hYmxlZCgpCi0gICAgICAgICAgICAgICAgJiYgcm91dGUubWF0Y2hlc1NlbGVjdG9yKG1TZWxlY3Rvcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VGl0bGUoQ2hhclNlcXVlbmNlIHRpdGxlKSB7Ci0gICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dCh0aXRsZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VGl0bGUoaW50IHRpdGxlSWQpIHsKLSAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KHRpdGxlSWQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLQotICAgICAgICBzZXRDb250ZW50VmlldyhBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChnZXRDb250ZXh0KCksIEFwaUhlbHBlci5nZXRMaWJUaGVtZShnZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRSb3V0ZXJUaGVtZUlkKGdldENvbnRleHQoKSkpLAotICAgICAgICAgICAgICAgIFIubGF5b3V0Lm1yX2Nob29zZXJfZGlhbG9nKSk7Ci0KLSAgICAgICAgbVJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBtQWRhcHRlciA9IG5ldyBSb3V0ZUFkYXB0ZXIoZ2V0Q29udGV4dCgpLCBtUm91dGVzKTsKLSAgICAgICAgbUxpc3RWaWV3ID0gKExpc3RWaWV3KWZpbmRWaWV3QnlJZChSLmlkLm1yX2Nob29zZXJfbGlzdCk7Ci0gICAgICAgIG1MaXN0Vmlldy5zZXRBZGFwdGVyKG1BZGFwdGVyKTsKLSAgICAgICAgbUxpc3RWaWV3LnNldE9uSXRlbUNsaWNrTGlzdGVuZXIobUFkYXB0ZXIpOwotICAgICAgICBtTGlzdFZpZXcuc2V0RW1wdHlWaWV3KGZpbmRWaWV3QnlJZChhbmRyb2lkLlIuaWQuZW1wdHkpKTsKLSAgICAgICAgbVRpdGxlVmlldyA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2Nob29zZXJfdGl0bGUpOwotCi0gICAgICAgIHVwZGF0ZUxheW91dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHdpZHRoIG9mIHRoZSBkaWFsb2cuIEFsc28gY2FsbGVkIHdoZW4gY29uZmlndXJhdGlvbiBjaGFuZ2VzLgotICAgICAqLwotICAgIHZvaWQgdXBkYXRlTGF5b3V0KCkgewotICAgICAgICBnZXRXaW5kb3coKS5zZXRMYXlvdXQoTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5nZXREaWFsb2dXaWR0aChnZXRDb250ZXh0KCkpLAotICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3coKSB7Ci0gICAgICAgIHN1cGVyLm9uQXR0YWNoZWRUb1dpbmRvdygpOwotCi0gICAgICAgIG1BdHRhY2hlZFRvV2luZG93ID0gdHJ1ZTsKLSAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhtU2VsZWN0b3IsIG1DYWxsYmFjaywgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOKTsKLSAgICAgICAgcmVmcmVzaFJvdXRlcygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgewotICAgICAgICBtQXR0YWNoZWRUb1dpbmRvdyA9IGZhbHNlOwotICAgICAgICBtUm91dGVyLnJlbW92ZUNhbGxiYWNrKG1DYWxsYmFjayk7Ci0gICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19VUERBVEVfUk9VVEVTKTsKLQotICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvdygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZnJlc2hlcyB0aGUgbGlzdCBvZiByb3V0ZXMgdGhhdCBhcmUgc2hvd24gaW4gdGhlIGNob29zZXIgZGlhbG9nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZnJlc2hSb3V0ZXMoKSB7Ci0gICAgICAgIGlmIChtQXR0YWNoZWRUb1dpbmRvdykgewotICAgICAgICAgICAgQXJyYXlMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gcm91dGVzID0gbmV3IEFycmF5TGlzdDw+KG1Sb3V0ZXIuZ2V0Um91dGVzKCkpOwotICAgICAgICAgICAgb25GaWx0ZXJSb3V0ZXMocm91dGVzKTsKLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQocm91dGVzLCBSb3V0ZUNvbXBhcmF0b3Iuc0luc3RhbmNlKTsKLSAgICAgICAgICAgIGlmIChTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSAtIG1MYXN0VXBkYXRlVGltZSA+PSBVUERBVEVfUk9VVEVTX0RFTEFZX01TKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUm91dGVzKHJvdXRlcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19VUERBVEVfUk9VVEVTKTsKLSAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZUF0VGltZShtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19VUERBVEVfUk9VVEVTLCByb3V0ZXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RVcGRhdGVUaW1lICsgVVBEQVRFX1JPVVRFU19ERUxBWV9NUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHVwZGF0ZVJvdXRlcyhMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gcm91dGVzKSB7Ci0gICAgICAgIG1MYXN0VXBkYXRlVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICBtUm91dGVzLmNsZWFyKCk7Ci0gICAgICAgIG1Sb3V0ZXMuYWRkQWxsKHJvdXRlcyk7Ci0gICAgICAgIG1BZGFwdGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBSb3V0ZUFkYXB0ZXIgZXh0ZW5kcyBBcnJheUFkYXB0ZXI8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPgotICAgICAgICAgICAgaW1wbGVtZW50cyBMaXN0Vmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBEcmF3YWJsZSBtRGVmYXVsdEljb247Ci0gICAgICAgIHByaXZhdGUgZmluYWwgRHJhd2FibGUgbVR2SWNvbjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBEcmF3YWJsZSBtU3BlYWtlckljb247Ci0gICAgICAgIHByaXZhdGUgZmluYWwgRHJhd2FibGUgbVNwZWFrZXJHcm91cEljb247Ci0KLSAgICAgICAgcHVibGljIFJvdXRlQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIExpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiByb3V0ZXMpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIDAsIHJvdXRlcyk7Ci0KLSAgICAgICAgICAgIFR5cGVkQXJyYXkgc3R5bGVkQXR0cmlidXRlcyA9IEFwaUhlbHBlci5nZXRMaWJUaGVtZShjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldFJvdXRlclRoZW1lSWQoY29udGV4dCkpLm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGludFtdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5hdHRyLm1lZGlhUm91dGVEZWZhdWx0SWNvbkRyYXdhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmF0dHIubWVkaWFSb3V0ZVR2SWNvbkRyYXdhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmF0dHIubWVkaWFSb3V0ZVNwZWFrZXJJY29uRHJhd2FibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuYXR0ci5tZWRpYVJvdXRlU3BlYWtlckdyb3VwSWNvbkRyYXdhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIG1EZWZhdWx0SWNvbiA9IHN0eWxlZEF0dHJpYnV0ZXMuZ2V0RHJhd2FibGUoMCk7Ci0gICAgICAgICAgICBtVHZJY29uID0gc3R5bGVkQXR0cmlidXRlcy5nZXREcmF3YWJsZSgxKTsKLSAgICAgICAgICAgIG1TcGVha2VySWNvbiA9IHN0eWxlZEF0dHJpYnV0ZXMuZ2V0RHJhd2FibGUoMik7Ci0gICAgICAgICAgICBtU3BlYWtlckdyb3VwSWNvbiA9IHN0eWxlZEF0dHJpYnV0ZXMuZ2V0RHJhd2FibGUoMyk7Ci0gICAgICAgICAgICBzdHlsZWRBdHRyaWJ1dGVzLnJlY3ljbGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhcmVBbGxJdGVtc0VuYWJsZWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGdldEl0ZW0ocG9zaXRpb24pLmlzRW5hYmxlZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBWaWV3IHZpZXcgPSBjb252ZXJ0VmlldzsKLSAgICAgICAgICAgIGlmICh2aWV3ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2aWV3ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQoZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlRoZW1lKGdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRSb3V0ZXJUaGVtZUlkKGdldENvbnRleHQoKSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgUi5sYXlvdXQubXJfY2hvb3Nlcl9saXN0X2l0ZW0sIHBhcmVudCwgZmFsc2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBnZXRJdGVtKHBvc2l0aW9uKTsKLSAgICAgICAgICAgIFRleHRWaWV3IHRleHQxID0gKFRleHRWaWV3KSB2aWV3LmZpbmRWaWV3QnlJZChSLmlkLm1yX2Nob29zZXJfcm91dGVfbmFtZSk7Ci0gICAgICAgICAgICBUZXh0VmlldyB0ZXh0MiA9IChUZXh0Vmlldykgdmlldy5maW5kVmlld0J5SWQoUi5pZC5tcl9jaG9vc2VyX3JvdXRlX2Rlc2MpOwotICAgICAgICAgICAgdGV4dDEuc2V0VGV4dChyb3V0ZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gcm91dGUuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNDb25uZWN0ZWRPckNvbm5lY3RpbmcgPQotICAgICAgICAgICAgICAgICAgICByb3V0ZS5nZXRDb25uZWN0aW9uU3RhdGUoKSA9PSBDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHJvdXRlLmdldENvbm5lY3Rpb25TdGF0ZSgpID09IENPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElORzsKLSAgICAgICAgICAgIGlmIChpc0Nvbm5lY3RlZE9yQ29ubmVjdGluZyAmJiAhVGV4dFV0aWxzLmlzRW1wdHkoZGVzY3JpcHRpb24pKSB7Ci0gICAgICAgICAgICAgICAgdGV4dDEuc2V0R3Jhdml0eShHcmF2aXR5LkJPVFRPTSk7Ci0gICAgICAgICAgICAgICAgdGV4dDIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIHRleHQyLnNldFRleHQoZGVzY3JpcHRpb24pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0ZXh0MS5zZXRHcmF2aXR5KEdyYXZpdHkuQ0VOVEVSX1ZFUlRJQ0FMKTsKLSAgICAgICAgICAgICAgICB0ZXh0Mi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgdGV4dDIuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2aWV3LnNldEVuYWJsZWQocm91dGUuaXNFbmFibGVkKCkpOwotCi0gICAgICAgICAgICBJbWFnZVZpZXcgaWNvblZpZXcgPSAoSW1hZ2VWaWV3KSB2aWV3LmZpbmRWaWV3QnlJZChSLmlkLm1yX2Nob29zZXJfcm91dGVfaWNvbik7Ci0gICAgICAgICAgICBpZiAoaWNvblZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGljb25WaWV3LnNldEltYWdlRHJhd2FibGUoZ2V0SWNvbkRyYXdhYmxlKHJvdXRlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdmlldzsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DbGljayhBZGFwdGVyVmlldzw/PiBwYXJlbnQsIFZpZXcgdmlldywgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBnZXRJdGVtKHBvc2l0aW9uKTsKLSAgICAgICAgICAgIGlmIChyb3V0ZS5pc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIHJvdXRlLnNlbGVjdCgpOwotICAgICAgICAgICAgICAgIGRpc21pc3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgRHJhd2FibGUgZ2V0SWNvbkRyYXdhYmxlKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgVXJpIGljb25VcmkgPSByb3V0ZS5nZXRJY29uVXJpKCk7Ci0gICAgICAgICAgICBpZiAoaWNvblVyaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCkub3BlbklucHV0U3RyZWFtKGljb25VcmkpOwotICAgICAgICAgICAgICAgICAgICBEcmF3YWJsZSBkcmF3YWJsZSA9IERyYXdhYmxlLmNyZWF0ZUZyb21TdHJlYW0oaXMsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZHJhd2FibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRyYXdhYmxlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdG8gbG9hZCAiICsgaWNvblVyaSwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZhbGxzIGJhY2suCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGdldERlZmF1bHRJY29uRHJhd2FibGUocm91dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBEcmF3YWJsZSBnZXREZWZhdWx0SWNvbkRyYXdhYmxlKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgLy8gSWYgdGhlIHR5cGUgb2YgdGhlIHJlY2VpdmVyIGRldmljZSBpcyBzcGVjaWZpZWQsIHVzZSBpdC4KLSAgICAgICAgICAgIHN3aXRjaCAocm91dGUuZ2V0RGV2aWNlVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvLkRFVklDRV9UWVBFX1RWOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVR2SWNvbjsKLSAgICAgICAgICAgICAgICBjYXNlIE1lZGlhUm91dGVyLlJvdXRlSW5mby5ERVZJQ0VfVFlQRV9TUEVBS0VSOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVNwZWFrZXJJY29uOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBPdGhlcndpc2UsIG1ha2UgdGhlIGJlc3QgZ3Vlc3MgYmFzZWQgb24gb3RoZXIgcm91dGUgaW5mb3JtYXRpb24uCi0gICAgICAgICAgICBpZiAocm91dGUgaW5zdGFuY2VvZiBNZWRpYVJvdXRlci5Sb3V0ZUdyb3VwKSB7Ci0gICAgICAgICAgICAgICAgLy8gT25seSBzcGVha2VycyBjYW4gYmUgZ3JvdXBlZCBmb3Igbm93LgotICAgICAgICAgICAgICAgIHJldHVybiBtU3BlYWtlckdyb3VwSWNvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtRGVmYXVsdEljb247Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVyQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlci5DYWxsYmFjayB7Ci0gICAgICAgIE1lZGlhUm91dGVyQ2FsbGJhY2soKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUFkZGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGluZm8pIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVTZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgZGlzbWlzcygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3I8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUm91dGVDb21wYXJhdG9yIHNJbnN0YW5jZSA9IG5ldyBSb3V0ZUNvbXBhcmF0b3IoKTsKLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBjb21wYXJlKE1lZGlhUm91dGVyLlJvdXRlSW5mbyBsaHMsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByaHMpIHsKLSAgICAgICAgICAgIHJldHVybiBsaHMuZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UocmhzLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNob29zZXJEaWFsb2dGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWU2YjI5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNob29zZXJEaWFsb2dGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nRnJhZ21lbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7Ci0KLS8qKgotICogTWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cgZnJhZ21lbnQuCi0gKiA8cD4KLSAqIENyZWF0ZXMgYSB7QGxpbmsgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2d9LiAgVGhlIGFwcGxpY2F0aW9uIG1heSBzdWJjbGFzcwotICogdGhpcyBkaWFsb2cgZnJhZ21lbnQgdG8gY3VzdG9taXplIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQgZXh0ZW5kcyBEaWFsb2dGcmFnbWVudCB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfU0VMRUNUT1IgPSAic2VsZWN0b3IiOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZyBtRGlhbG9nOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvcjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZyBmcmFnbWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBBbGwgc3ViY2xhc3NlcyBvZiB0aGlzIGNsYXNzIG11c3QgYWxzbyBwb3NzZXNzIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQoKSB7Ci0gICAgICAgIHNldENhbmNlbGFibGUodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuIHNlbGVjdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNlbGVjdG9yLCBuZXZlciBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlU2VsZWN0b3IgZ2V0Um91dGVTZWxlY3RvcigpIHsKLSAgICAgICAgZW5zdXJlUm91dGVTZWxlY3RvcigpOwotICAgICAgICByZXR1cm4gbVNlbGVjdG9yOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbnN1cmVSb3V0ZVNlbGVjdG9yKCkgewotICAgICAgICBpZiAobVNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBhcmdzID0gZ2V0QXJndW1lbnRzKCk7Ci0gICAgICAgICAgICBpZiAoYXJncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLmZyb21CdW5kbGUoYXJncy5nZXRCdW5kbGUoQVJHVU1FTlRfU0VMRUNUT1IpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtU2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbiBzZWxlY3QuCi0gICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBmcmFnbWVudCBpcyBhZGRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBlbnN1cmVSb3V0ZVNlbGVjdG9yKCk7Ci0gICAgICAgIGlmICghbVNlbGVjdG9yLmVxdWFscyhzZWxlY3RvcikpIHsKLSAgICAgICAgICAgIG1TZWxlY3RvciA9IHNlbGVjdG9yOwotCi0gICAgICAgICAgICBCdW5kbGUgYXJncyA9IGdldEFyZ3VtZW50cygpOwotICAgICAgICAgICAgaWYgKGFyZ3MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFyZ3MgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcmdzLnB1dEJ1bmRsZShBUkdVTUVOVF9TRUxFQ1RPUiwgc2VsZWN0b3IuYXNCdW5kbGUoKSk7Ci0gICAgICAgICAgICBzZXRBcmd1bWVudHMoYXJncyk7Ci0KLSAgICAgICAgICAgIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nIGRpYWxvZyA9IChNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZylnZXREaWFsb2coKTsKLSAgICAgICAgICAgIGlmIChkaWFsb2cgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRpYWxvZy5zZXRSb3V0ZVNlbGVjdG9yKHNlbGVjdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBjaG9vc2VyIGRpYWxvZyBpcyBiZWluZyBjcmVhdGVkLgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSB0aGUgZGlhbG9nLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2cgb25DcmVhdGVDaG9vc2VyRGlhbG9nKAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2coY29udGV4dCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIERpYWxvZyBvbkNyZWF0ZURpYWxvZyhCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIG1EaWFsb2cgPSBvbkNyZWF0ZUNob29zZXJEaWFsb2coZ2V0Q29udGV4dCgpLCBzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICBtRGlhbG9nLnNldFJvdXRlU2VsZWN0b3IoZ2V0Um91dGVTZWxlY3RvcigpKTsKLSAgICAgICAgcmV0dXJuIG1EaWFsb2c7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgewotICAgICAgICBzdXBlci5vbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKG5ld0NvbmZpZyk7Ci0gICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1EaWFsb2cudXBkYXRlTGF5b3V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MGNmY2EuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGVDb21wYXQuQUNUSU9OX1BBVVNFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlQ29tcGF0LkFDVElPTl9QTEFZOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlQ29tcGF0LkFDVElPTl9QTEFZX1BBVVNFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlQ29tcGF0LkFDVElPTl9TVE9QOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2c7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuTWVkaWFEZXNjcmlwdGlvbkNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuTWVkaWFNZXRhZGF0YUNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5NZWRpYUNvbnRyb2xsZXJDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGVDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnV0aWwuT2JqZWN0c0NvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudENvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjcuZ3JhcGhpY3MuUGFsZXR0ZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5NZWFzdXJlU3BlYzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWxwaGFBbmltYXRpb247Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb247Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25TZXQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLlRyYW5zZm9ybWF0aW9uOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uVHJhbnNsYXRlQW5pbWF0aW9uOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VCdXR0b247Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5SZWxhdGl2ZUxheW91dDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVTZWxlY3RvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk92ZXJsYXlMaXN0Vmlldy5PdmVybGF5T2JqZWN0OwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIHJvdXRlIGNvbnRyb2xsZXIgZGlhbG9nIGZvciB7QGxpbmsgTWVkaWFSb3V0ZXJ9LgotICogPHA+Ci0gKiBUaGlzIGRpYWxvZyBhbGxvd3MgdGhlIHVzZXIgdG8gY29udHJvbCBvciBkaXNjb25uZWN0IGZyb20gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZS4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIE1lZGlhUm91dGVCdXR0b24KLSAqIEBzZWUgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZyBleHRlbmRzIEFsZXJ0RGlhbG9nIHsKLSAgICAvLyBUYWdzIHNob3VsZCBiZSBsZXNzIHRoYW4gMjQgY2hhcmFjdGVycyBsb25nIChzZWUgZG9jcyBmb3IgYW5kcm9pZC51dGlsLkxvZy5pc0xvZ2dhYmxlKCkpCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZUN0cmxEaWFsb2ciOwotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOwotCi0gICAgLy8gVGltZSB0byB3YWl0IGJlZm9yZSB1cGRhdGluZyB0aGUgdm9sdW1lIHdoZW4gdGhlIHVzZXIgbGV0cyBnbyBvZiB0aGUgc2VlayBiYXIKLSAgICAvLyB0byBhbGxvdyB0aGUgcm91dGUgcHJvdmlkZXIgdGltZSB0byBwcm9wYWdhdGUgdGhlIGNoYW5nZSBhbmQgcHVibGlzaCBhIG5ldwotICAgIC8vIHJvdXRlIGRlc2NyaXB0b3IuCi0gICAgc3RhdGljIGZpbmFsIGludCBWT0xVTUVfVVBEQVRFX0RFTEFZX01JTExJUyA9IDUwMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RJT05fVElNRU9VVF9NSUxMSVMgPSAoaW50KSBUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKDMwTCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVUVE9OX05FVVRSQUxfUkVTX0lEID0gYW5kcm9pZC5SLmlkLmJ1dHRvbjM7Ci0gICAgc3RhdGljIGZpbmFsIGludCBCVVRUT05fRElTQ09OTkVDVF9SRVNfSUQgPSBhbmRyb2lkLlIuaWQuYnV0dG9uMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IEJVVFRPTl9TVE9QX1JFU19JRCA9IGFuZHJvaWQuUi5pZC5idXR0b24xOwotCi0gICAgZmluYWwgTWVkaWFSb3V0ZXIgbVJvdXRlcjsKLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyQ2FsbGJhY2sgbUNhbGxiYWNrOwotICAgIGZpbmFsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBtUm91dGU7Ci0KLSAgICBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgYm9vbGVhbiBtQ3JlYXRlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUF0dGFjaGVkVG9XaW5kb3c7Ci0KLSAgICBwcml2YXRlIGludCBtRGlhbG9nQ29udGVudFdpZHRoOwotCi0gICAgcHJpdmF0ZSBWaWV3IG1DdXN0b21Db250cm9sVmlldzsKLQotICAgIHByaXZhdGUgQnV0dG9uIG1EaXNjb25uZWN0QnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIG1TdG9wQ2FzdGluZ0J1dHRvbjsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1QbGF5YmFja0NvbnRyb2xCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtQ2xvc2VCdXR0b247Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24gbUdyb3VwRXhwYW5kQ29sbGFwc2VCdXR0b247Ci0KLSAgICBwcml2YXRlIEZyYW1lTGF5b3V0IG1FeHBhbmRhYmxlQXJlYUxheW91dDsKLSAgICBwcml2YXRlIExpbmVhckxheW91dCBtRGlhbG9nQXJlYUxheW91dDsKLSAgICBGcmFtZUxheW91dCBtRGVmYXVsdENvbnRyb2xMYXlvdXQ7Ci0gICAgcHJpdmF0ZSBGcmFtZUxheW91dCBtQ3VzdG9tQ29udHJvbExheW91dDsKLSAgICBwcml2YXRlIEltYWdlVmlldyBtQXJ0VmlldzsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1UaXRsZVZpZXc7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtU3VidGl0bGVWaWV3OwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVJvdXRlTmFtZVRleHRWaWV3OwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Wb2x1bWVDb250cm9sRW5hYmxlZCA9IHRydWU7Ci0gICAgLy8gTGF5b3V0IGZvciBtZWRpYSBjb250cm9sbGVycyBpbmNsdWRpbmcgcGxheS9wYXVzZSBidXR0b24gYW5kIHRoZSBtYWluIHZvbHVtZSBzbGlkZXIuCi0gICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQ7Ci0gICAgcHJpdmF0ZSBSZWxhdGl2ZUxheW91dCBtUGxheWJhY2tDb250cm9sTGF5b3V0OwotICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1Wb2x1bWVDb250cm9sTGF5b3V0OwotICAgIHByaXZhdGUgVmlldyBtRGl2aWRlclZpZXc7Ci0KLSAgICBPdmVybGF5TGlzdFZpZXcgbVZvbHVtZUdyb3VwTGlzdDsKLSAgICBWb2x1bWVHcm91cEFkYXB0ZXIgbVZvbHVtZUdyb3VwQWRhcHRlcjsKLSAgICBwcml2YXRlIExpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiBtR3JvdXBNZW1iZXJSb3V0ZXM7Ci0gICAgU2V0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQ7Ci0gICAgcHJpdmF0ZSBTZXQ8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiBtR3JvdXBNZW1iZXJSb3V0ZXNSZW1vdmVkOwotICAgIFNldDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IG1Hcm91cE1lbWJlclJvdXRlc0FuaW1hdGluZ1dpdGhCaXRtYXA7Ci0gICAgU2Vla0JhciBtVm9sdW1lU2xpZGVyOwotICAgIFZvbHVtZUNoYW5nZUxpc3RlbmVyIG1Wb2x1bWVDaGFuZ2VMaXN0ZW5lcjsKLSAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gbVJvdXRlSW5Wb2x1bWVTbGlkZXJUb3VjaGVkOwotICAgIHByaXZhdGUgaW50IG1Wb2x1bWVHcm91cExpc3RJdGVtSWNvblNpemU7Ci0gICAgcHJpdmF0ZSBpbnQgbVZvbHVtZUdyb3VwTGlzdEl0ZW1IZWlnaHQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVZvbHVtZUdyb3VwTGlzdE1heEhlaWdodDsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtVm9sdW1lR3JvdXBMaXN0UGFkZGluZ1RvcDsKLSAgICBNYXA8TWVkaWFSb3V0ZXIuUm91dGVJbmZvLCBTZWVrQmFyPiBtVm9sdW1lU2xpZGVyTWFwOwotCi0gICAgTWVkaWFDb250cm9sbGVyQ29tcGF0IG1NZWRpYUNvbnRyb2xsZXI7Ci0gICAgTWVkaWFDb250cm9sbGVyQ2FsbGJhY2sgbUNvbnRyb2xsZXJDYWxsYmFjazsKLSAgICBQbGF5YmFja1N0YXRlQ29tcGF0IG1TdGF0ZTsKLSAgICBNZWRpYURlc2NyaXB0aW9uQ29tcGF0IG1EZXNjcmlwdGlvbjsKLQotICAgIEZldGNoQXJ0VGFzayBtRmV0Y2hBcnRUYXNrOwotICAgIEJpdG1hcCBtQXJ0SWNvbkJpdG1hcDsKLSAgICBVcmkgbUFydEljb25Vcmk7Ci0gICAgYm9vbGVhbiBtQXJ0SWNvbklzTG9hZGVkOwotICAgIEJpdG1hcCBtQXJ0SWNvbkxvYWRlZEJpdG1hcDsKLSAgICBpbnQgbUFydEljb25CYWNrZ3JvdW5kQ29sb3I7Ci0KLSAgICBib29sZWFuIG1IYXNQZW5kaW5nVXBkYXRlOwotICAgIGJvb2xlYW4gbVBlbmRpbmdVcGRhdGVBbmltYXRpb25OZWVkZWQ7Ci0KLSAgICBib29sZWFuIG1Jc0dyb3VwRXhwYW5kZWQ7Ci0gICAgYm9vbGVhbiBtSXNHcm91cExpc3RBbmltYXRpbmc7Ci0gICAgYm9vbGVhbiBtSXNHcm91cExpc3RBbmltYXRpb25QZW5kaW5nOwotICAgIGludCBtR3JvdXBMaXN0QW5pbWF0aW9uRHVyYXRpb25NczsKLSAgICBwcml2YXRlIGludCBtR3JvdXBMaXN0RmFkZUluRHVyYXRpb25NczsKLSAgICBwcml2YXRlIGludCBtR3JvdXBMaXN0RmFkZU91dER1cmF0aW9uTXM7Ci0KLSAgICBwcml2YXRlIEludGVycG9sYXRvciBtSW50ZXJwb2xhdG9yOwotICAgIHByaXZhdGUgSW50ZXJwb2xhdG9yIG1MaW5lYXJPdXRTbG93SW5JbnRlcnBvbGF0b3I7Ci0gICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUZhc3RPdXRTbG93SW5JbnRlcnBvbGF0b3I7Ci0gICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yOwotCi0gICAgZmluYWwgQWNjZXNzaWJpbGl0eU1hbmFnZXIgbUFjY2Vzc2liaWxpdHlNYW5hZ2VyOwotCi0gICAgUnVubmFibGUgbUdyb3VwTGlzdEZhZGVJbkFuaW1hdGlvbiA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIHN0YXJ0R3JvdXBMaXN0RmFkZUluQW5pbWF0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHVibGljIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZyhDb250ZXh0IGNvbnRleHQsIGludCB0aGVtZSkgewotICAgICAgICAvLyBUT0RPIChiLzcyOTc1OTc2KTogQXZvaWQgdG8gdXNlIENvbnRleHRUaGVtZVdyYXBwZXIgd2l0aCBhcHAgY29udGV4dCBhbmQgbGliIHRoZW1lLgotICAgICAgICBzdXBlcihuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihjb250ZXh0LCBBcGlIZWxwZXIuZ2V0TGliVGhlbWUoY29udGV4dCwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldFJvdXRlclRoZW1lSWQoY29udGV4dCkpKSwgdGhlbWUpOwotICAgICAgICBtQ29udGV4dCA9IGdldENvbnRleHQoKTsKLQotICAgICAgICBtQ29udHJvbGxlckNhbGxiYWNrID0gbmV3IE1lZGlhQ29udHJvbGxlckNhbGxiYWNrKCk7Ci0gICAgICAgIG1Sb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShtQ29udGV4dCk7Ci0gICAgICAgIG1DYWxsYmFjayA9IG5ldyBNZWRpYVJvdXRlckNhbGxiYWNrKCk7Ci0gICAgICAgIG1Sb3V0ZSA9IG1Sb3V0ZXIuZ2V0U2VsZWN0ZWRSb3V0ZSgpOwotICAgICAgICBzZXRNZWRpYVNlc3Npb24obVJvdXRlci5nZXRNZWRpYVNlc3Npb25Ub2tlbigpKTsKLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdFBhZGRpbmdUb3AgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLmRpbWVuLm1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfcGFkZGluZ190b3ApOwotICAgICAgICBtQWNjZXNzaWJpbGl0eU1hbmFnZXIgPQotICAgICAgICAgICAgICAgIChBY2Nlc3NpYmlsaXR5TWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFDQ0VTU0lCSUxJVFlfU0VSVklDRSk7Ci0gICAgICAgIG1MaW5lYXJPdXRTbG93SW5JbnRlcnBvbGF0b3IgPSBBbmltYXRpb25VdGlscy5sb2FkSW50ZXJwb2xhdG9yKAotICAgICAgICAgICAgICAgIG1Db250ZXh0LCBhbmRyb2lkLlIuaW50ZXJwb2xhdG9yLmxpbmVhcl9vdXRfc2xvd19pbik7Ci0gICAgICAgIG1GYXN0T3V0U2xvd0luSW50ZXJwb2xhdG9yID0gQW5pbWF0aW9uVXRpbHMubG9hZEludGVycG9sYXRvcigKLSAgICAgICAgICAgICAgICBtQ29udGV4dCwgYW5kcm9pZC5SLmludGVycG9sYXRvci5mYXN0X291dF9zbG93X2luKTsKLSAgICAgICAgbUFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yID0gbmV3IEFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcm91dGUgdGhhdCB0aGlzIGRpYWxvZyBpcyBjb250cm9sbGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGdldFJvdXRlKCkgewotICAgICAgICByZXR1cm4gbVJvdXRlOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIuUm91dGVHcm91cCBnZXRHcm91cCgpIHsKLSAgICAgICAgaWYgKG1Sb3V0ZSBpbnN0YW5jZW9mIE1lZGlhUm91dGVyLlJvdXRlR3JvdXApIHsKLSAgICAgICAgICAgIHJldHVybiAoTWVkaWFSb3V0ZXIuUm91dGVHcm91cCkgbVJvdXRlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb3ZpZGVzIHRoZSBzdWJjbGFzcyBhbiBvcHBvcnR1bml0eSB0byBjcmVhdGUgYSB2aWV3IHRoYXQgd2lsbCByZXBsYWNlIHRoZSBkZWZhdWx0IG1lZGlhCi0gICAgICogY29udHJvbHMgZm9yIHRoZSBjdXJyZW50bHkgcGxheWluZyBjb250ZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIHNhdmVkSW5zdGFuY2VTdGF0ZSBUaGUgZGlhbG9nJ3Mgc2F2ZWQgaW5zdGFuY2Ugc3RhdGUuCi0gICAgICogQHJldHVybiBUaGUgbWVkaWEgY29udHJvbCB2aWV3LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIFZpZXcgb25DcmVhdGVNZWRpYUNvbnRyb2xWaWV3KEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgY29udHJvbCB2aWV3IHRoYXQgd2FzIGNyZWF0ZWQgYnkge0BsaW5rICNvbkNyZWF0ZU1lZGlhQ29udHJvbFZpZXcoQnVuZGxlKX0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSBjb250cm9sIHZpZXcsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgVmlldyBnZXRNZWRpYUNvbnRyb2xWaWV3KCkgewotICAgICAgICByZXR1cm4gbUN1c3RvbUNvbnRyb2xWaWV3OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB0byBlbmFibGUgdGhlIHZvbHVtZSBzbGlkZXIgYW5kIHZvbHVtZSBjb250cm9sIHVzaW5nIHRoZSB2b2x1bWUga2V5cwotICAgICAqIHdoZW4gdGhlIHJvdXRlIHN1cHBvcnRzIGl0LgotICAgICAqIDxwPgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZvbHVtZUNvbnRyb2xFbmFibGVkKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIGlmIChtVm9sdW1lQ29udHJvbEVuYWJsZWQgIT0gZW5hYmxlKSB7Ci0gICAgICAgICAgICBtVm9sdW1lQ29udHJvbEVuYWJsZWQgPSBlbmFibGU7Ci0gICAgICAgICAgICBpZiAobUNyZWF0ZWQpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGUoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRvIGVuYWJsZSB0aGUgdm9sdW1lIHNsaWRlciBhbmQgdm9sdW1lIGNvbnRyb2wgdXNpbmcgdGhlIHZvbHVtZSBrZXlzCi0gICAgICogd2hlbiB0aGUgcm91dGUgc3VwcG9ydHMgaXQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWb2x1bWVDb250cm9sRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1Wb2x1bWVDb250cm9sRW5hYmxlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHNlc3Npb24gdG8gdXNlIGZvciBtZXRhZGF0YSBhbmQgdHJhbnNwb3J0IGNvbnRyb2xzLiBUaGUgZGlhbG9nCi0gICAgICogd2lsbCBsaXN0ZW4gdG8gY2hhbmdlcyBvbiB0aGlzIHNlc3Npb24gYW5kIHVwZGF0ZSB0aGUgVUkgYXV0b21hdGljYWxseSBpbgotICAgICAqIHJlc3BvbnNlIHRvIGNoYW5nZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2Vzc2lvblRva2VuIFRoZSB0b2tlbiBmb3IgdGhlIHNlc3Npb24gdG8gdXNlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRNZWRpYVNlc3Npb24oTWVkaWFTZXNzaW9uQ29tcGF0LlRva2VuIHNlc3Npb25Ub2tlbikgewotICAgICAgICBpZiAobU1lZGlhQ29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLnVucmVnaXN0ZXJDYWxsYmFjayhtQ29udHJvbGxlckNhbGxiYWNrKTsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZXNzaW9uVG9rZW4gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbUF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlciA9IG5ldyBNZWRpYUNvbnRyb2xsZXJDb21wYXQobUNvbnRleHQsIHNlc3Npb25Ub2tlbik7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBjcmVhdGluZyBtZWRpYSBjb250cm9sbGVyIGluIHNldE1lZGlhU2Vzc2lvbi4iLCBlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobU1lZGlhQ29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLnJlZ2lzdGVyQ2FsbGJhY2sobUNvbnRyb2xsZXJDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgTWVkaWFNZXRhZGF0YUNvbXBhdCBtZXRhZGF0YSA9IG1NZWRpYUNvbnRyb2xsZXIgPT0gbnVsbCA/IG51bGwKLSAgICAgICAgICAgICAgICA6IG1NZWRpYUNvbnRyb2xsZXIuZ2V0TWV0YWRhdGEoKTsKLSAgICAgICAgbURlc2NyaXB0aW9uID0gbWV0YWRhdGEgPT0gbnVsbCA/IG51bGwgOiBtZXRhZGF0YS5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICBtU3RhdGUgPSBtTWVkaWFDb250cm9sbGVyID09IG51bGwgPyBudWxsIDogbU1lZGlhQ29udHJvbGxlci5nZXRQbGF5YmFja1N0YXRlKCk7Ci0gICAgICAgIHVwZGF0ZUFydEljb25JZk5lZWRlZCgpOwotICAgICAgICB1cGRhdGUoZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNlc3Npb24gdG8gdXNlIGZvciBtZXRhZGF0YSBhbmQgdHJhbnNwb3J0IGNvbnRyb2xzLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgdG9rZW4gZm9yIHRoZSBzZXNzaW9uIHRvIHVzZSBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvbkNvbXBhdC5Ub2tlbiBnZXRNZWRpYVNlc3Npb24oKSB7Ci0gICAgICAgIHJldHVybiBtTWVkaWFDb250cm9sbGVyID09IG51bGwgPyBudWxsIDogbU1lZGlhQ29udHJvbGxlci5nZXRTZXNzaW9uVG9rZW4oKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0KLSAgICAgICAgZ2V0V2luZG93KCkuc2V0QmFja2dyb3VuZERyYXdhYmxlUmVzb3VyY2UoYW5kcm9pZC5SLmNvbG9yLnRyYW5zcGFyZW50KTsKLQotICAgICAgICBzZXRDb250ZW50VmlldyhBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChtQ29udGV4dCwKLSAgICAgICAgICAgICAgICBBcGlIZWxwZXIuZ2V0TGliVGhlbWUobUNvbnRleHQsIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0Um91dGVyVGhlbWVJZChtQ29udGV4dCkpLAotICAgICAgICAgICAgICAgIFIubGF5b3V0Lm1yX2NvbnRyb2xsZXJfbWF0ZXJpYWxfZGlhbG9nX2IpKTsKLQotICAgICAgICAvLyBSZW1vdmUgdGhlIG5ldXRyYWwgYnV0dG9uLgotICAgICAgICBmaW5kVmlld0J5SWQoQlVUVE9OX05FVVRSQUxfUkVTX0lEKS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0KLSAgICAgICAgQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBDbGlja0xpc3RlbmVyKCk7Ci0KLSAgICAgICAgbUV4cGFuZGFibGVBcmVhTGF5b3V0ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfZXhwYW5kYWJsZV9hcmVhKTsKLSAgICAgICAgbUV4cGFuZGFibGVBcmVhTGF5b3V0LnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgZGlzbWlzcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgbURpYWxvZ0FyZWFMYXlvdXQgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9kaWFsb2dfYXJlYSk7Ci0gICAgICAgIG1EaWFsb2dBcmVhTGF5b3V0LnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgLy8gRWF0IHVuaGFuZGxlZCB0b3VjaCBldmVudHMuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBpbnQgY29sb3IgPSBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldEJ1dHRvblRleHRDb2xvcihtQ29udGV4dCk7Ci0gICAgICAgIG1EaXNjb25uZWN0QnV0dG9uID0gZmluZFZpZXdCeUlkKEJVVFRPTl9ESVNDT05ORUNUX1JFU19JRCk7Ci0gICAgICAgIG1EaXNjb25uZWN0QnV0dG9uLnNldFRleHQoCi0gICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCkuZ2V0U3RyaW5nKFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCkpOwotICAgICAgICBtRGlzY29ubmVjdEJ1dHRvbi5zZXRUZXh0Q29sb3IoY29sb3IpOwotICAgICAgICBtRGlzY29ubmVjdEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobGlzdGVuZXIpOwotCi0gICAgICAgIG1TdG9wQ2FzdGluZ0J1dHRvbiA9IGZpbmRWaWV3QnlJZChCVVRUT05fU1RPUF9SRVNfSUQpOwotICAgICAgICBtU3RvcENhc3RpbmdCdXR0b24uc2V0VGV4dCgKLSAgICAgICAgICAgICAgICBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRTdHJpbmcoUi5zdHJpbmcubXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmcpKTsKLSAgICAgICAgbVN0b3BDYXN0aW5nQnV0dG9uLnNldFRleHRDb2xvcihjb2xvcik7Ci0gICAgICAgIG1TdG9wQ2FzdGluZ0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobGlzdGVuZXIpOwotCi0gICAgICAgIG1Sb3V0ZU5hbWVUZXh0VmlldyA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX25hbWUpOwotICAgICAgICBtQ2xvc2VCdXR0b24gPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9jbG9zZSk7Ci0gICAgICAgIG1DbG9zZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICBtQ3VzdG9tQ29udHJvbExheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2N1c3RvbV9jb250cm9sKTsKLSAgICAgICAgbURlZmF1bHRDb250cm9sTGF5b3V0ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfZGVmYXVsdF9jb250cm9sKTsKLQotICAgICAgICAvLyBTdGFydCB0aGUgc2Vzc2lvbiBhY3Rpdml0eSB3aGVuIGEgY29udGVudCBpdGVtIChhbGJ1bSBhcnQsIHRpdGxlIG9yIHN1YnRpdGxlKSBpcyBjbGlja2VkLgotICAgICAgICBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBvbkNsaWNrTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBQZW5kaW5nSW50ZW50IHBpID0gbU1lZGlhQ29udHJvbGxlci5nZXRTZXNzaW9uQWN0aXZpdHkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGkuc2VuZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc21pc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFBlbmRpbmdJbnRlbnQuQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgcGkgKyAiIHdhcyBub3Qgc2VudCwgaXQgaGFkIGJlZW4gY2FuY2VsZWQuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIG1BcnRWaWV3ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfYXJ0KTsKLSAgICAgICAgbUFydFZpZXcuc2V0T25DbGlja0xpc3RlbmVyKG9uQ2xpY2tMaXN0ZW5lcik7Ci0gICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLm1yX2NvbnRyb2xfdGl0bGVfY29udGFpbmVyKS5zZXRPbkNsaWNrTGlzdGVuZXIob25DbGlja0xpc3RlbmVyKTsKLQotICAgICAgICBtTWVkaWFNYWluQ29udHJvbExheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX21lZGlhX21haW5fY29udHJvbCk7Ci0gICAgICAgIG1EaXZpZGVyVmlldyA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2NvbnRyb2xfZGl2aWRlcik7Ci0KLSAgICAgICAgbVBsYXliYWNrQ29udHJvbExheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX3BsYXliYWNrX2NvbnRyb2wpOwotICAgICAgICBtVGl0bGVWaWV3ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfY29udHJvbF90aXRsZSk7Ci0gICAgICAgIG1TdWJ0aXRsZVZpZXcgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9jb250cm9sX3N1YnRpdGxlKTsKLSAgICAgICAgbVBsYXliYWNrQ29udHJvbEJ1dHRvbiA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2NvbnRyb2xfcGxheWJhY2tfY3RybCk7Ci0gICAgICAgIG1QbGF5YmFja0NvbnRyb2xCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKGxpc3RlbmVyKTsKLQotICAgICAgICBtVm9sdW1lQ29udHJvbExheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX3ZvbHVtZV9jb250cm9sKTsKLSAgICAgICAgbVZvbHVtZUNvbnRyb2xMYXlvdXQuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICBtVm9sdW1lU2xpZGVyID0gZmluZFZpZXdCeUlkKFIuaWQubXJfdm9sdW1lX3NsaWRlcik7Ci0gICAgICAgIG1Wb2x1bWVTbGlkZXIuc2V0VGFnKG1Sb3V0ZSk7Ci0gICAgICAgIG1Wb2x1bWVDaGFuZ2VMaXN0ZW5lciA9IG5ldyBWb2x1bWVDaGFuZ2VMaXN0ZW5lcigpOwotICAgICAgICBtVm9sdW1lU2xpZGVyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKG1Wb2x1bWVDaGFuZ2VMaXN0ZW5lcik7Ci0KLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX3ZvbHVtZV9ncm91cF9saXN0KTsKLSAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzID0gbmV3IEFycmF5TGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+KCk7Ci0gICAgICAgIG1Wb2x1bWVHcm91cEFkYXB0ZXIgPSBuZXcgVm9sdW1lR3JvdXBBZGFwdGVyKG1Wb2x1bWVHcm91cExpc3QuZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlcyk7Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3Quc2V0QWRhcHRlcihtVm9sdW1lR3JvdXBBZGFwdGVyKTsKLSAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzQW5pbWF0aW5nV2l0aEJpdG1hcCA9IG5ldyBIYXNoU2V0PD4oKTsKLQotICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLnNldE1lZGlhQ29udHJvbHNCYWNrZ3JvdW5kQ29sb3IobUNvbnRleHQsCi0gICAgICAgICAgICAgICAgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQsIG1Wb2x1bWVHcm91cExpc3QsIGdldEdyb3VwKCkgIT0gbnVsbCk7Ci0gICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuc2V0Vm9sdW1lU2xpZGVyQ29sb3IobUNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE1lZGlhUm91dGVWb2x1bWVTbGlkZXIpIG1Wb2x1bWVTbGlkZXIsIG1NZWRpYU1haW5Db250cm9sTGF5b3V0KTsKLSAgICAgICAgbVZvbHVtZVNsaWRlck1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgbVZvbHVtZVNsaWRlck1hcC5wdXQobVJvdXRlLCBtVm9sdW1lU2xpZGVyKTsKLQotICAgICAgICBtR3JvdXBFeHBhbmRDb2xsYXBzZUJ1dHRvbiA9Ci0gICAgICAgICAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQubXJfZ3JvdXBfZXhwYW5kX2NvbGxhcHNlKTsKLSAgICAgICAgbUdyb3VwRXhwYW5kQ29sbGFwc2VCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgICAgICBtSXNHcm91cEV4cGFuZGVkID0gIW1Jc0dyb3VwRXhwYW5kZWQ7Ci0gICAgICAgICAgICAgICAgaWYgKG1Jc0dyb3VwRXhwYW5kZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxvYWRJbnRlcnBvbGF0b3IoKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXRIZWlnaHQodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBsb2FkSW50ZXJwb2xhdG9yKCk7Ci0gICAgICAgIG1Hcm91cExpc3RBbmltYXRpb25EdXJhdGlvbk1zID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCkuZ2V0SW50ZWdlcigKLSAgICAgICAgICAgICAgICBSLmludGVnZXIubXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9hbmltYXRpb25fZHVyYXRpb25fbXMpOwotICAgICAgICBtR3JvdXBMaXN0RmFkZUluRHVyYXRpb25NcyA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldEludGVnZXIoCi0gICAgICAgICAgICAgICAgUi5pbnRlZ2VyLm1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfZmFkZV9pbl9kdXJhdGlvbl9tcyk7Ci0gICAgICAgIG1Hcm91cExpc3RGYWRlT3V0RHVyYXRpb25NcyA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldEludGVnZXIoCi0gICAgICAgICAgICAgICAgUi5pbnRlZ2VyLm1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfZmFkZV9vdXRfZHVyYXRpb25fbXMpOwotCi0gICAgICAgIG1DdXN0b21Db250cm9sVmlldyA9IG9uQ3JlYXRlTWVkaWFDb250cm9sVmlldyhzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICBpZiAobUN1c3RvbUNvbnRyb2xWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DdXN0b21Db250cm9sTGF5b3V0LmFkZFZpZXcobUN1c3RvbUNvbnRyb2xWaWV3KTsKLSAgICAgICAgICAgIG1DdXN0b21Db250cm9sTGF5b3V0LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgfQotICAgICAgICBtQ3JlYXRlZCA9IHRydWU7Ci0gICAgICAgIHVwZGF0ZUxheW91dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHdpZHRoIG9mIHRoZSBkaWFsb2cuIEFsc28gY2FsbGVkIHdoZW4gY29uZmlndXJhdGlvbiBjaGFuZ2VzLgotICAgICAqLwotICAgIHZvaWQgdXBkYXRlTGF5b3V0KCkgewotICAgICAgICBpbnQgd2lkdGggPSBNZWRpYVJvdXRlRGlhbG9nSGVscGVyLmdldERpYWxvZ1dpZHRoKG1Db250ZXh0KTsKLSAgICAgICAgZ2V0V2luZG93KCkuc2V0TGF5b3V0KHdpZHRoLCBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7Ci0KLSAgICAgICAgVmlldyBkZWNvclZpZXcgPSBnZXRXaW5kb3coKS5nZXREZWNvclZpZXcoKTsKLSAgICAgICAgbURpYWxvZ0NvbnRlbnRXaWR0aCA9IHdpZHRoIC0gZGVjb3JWaWV3LmdldFBhZGRpbmdMZWZ0KCkgLSBkZWNvclZpZXcuZ2V0UGFkZGluZ1JpZ2h0KCk7Ci0KLSAgICAgICAgUmVzb3VyY2VzIHJlcyA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpOwotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0SXRlbUljb25TaXplID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLmRpbWVuLm1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9pY29uX3NpemUpOwotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0SXRlbUhlaWdodCA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faGVpZ2h0KTsKLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdE1heEhlaWdodCA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X21heF9oZWlnaHQpOwotCi0gICAgICAgIC8vIEZldGNoIGFydCBpY29ucyBhZ2FpbiBmb3IgbGF5b3V0IGNoYW5nZXMgdG8gcmVzaXplIGl0IGFjY29yZGluZ2x5Ci0gICAgICAgIG1BcnRJY29uQml0bWFwID0gbnVsbDsKLSAgICAgICAgbUFydEljb25VcmkgPSBudWxsOwotICAgICAgICB1cGRhdGVBcnRJY29uSWZOZWVkZWQoKTsKLSAgICAgICAgdXBkYXRlKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3coKSB7Ci0gICAgICAgIHN1cGVyLm9uQXR0YWNoZWRUb1dpbmRvdygpOwotICAgICAgICBtQXR0YWNoZWRUb1dpbmRvdyA9IHRydWU7Ci0KLSAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFksIG1DYWxsYmFjaywKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTKTsKLSAgICAgICAgc2V0TWVkaWFTZXNzaW9uKG1Sb3V0ZXIuZ2V0TWVkaWFTZXNzaW9uVG9rZW4oKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7Ci0gICAgICAgIG1Sb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAgICAgICAgc2V0TWVkaWFTZXNzaW9uKG51bGwpOwotICAgICAgICBtQXR0YWNoZWRUb1dpbmRvdyA9IGZhbHNlOwotICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvdygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfRE9XTgotICAgICAgICAgICAgICAgIHx8IGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfVVApIHsKLSAgICAgICAgICAgIG1Sb3V0ZS5yZXF1ZXN0VXBkYXRlVm9sdW1lKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfRE9XTiA/IC0xIDogMSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIub25LZXlEb3duKGtleUNvZGUsIGV2ZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvbktleVVwKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgewotICAgICAgICBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1ZPTFVNRV9ET1dOCi0gICAgICAgICAgICAgICAgfHwga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1ZPTFVNRV9VUCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5VXAoa2V5Q29kZSwgZXZlbnQpOwotICAgIH0KLQotICAgIHZvaWQgdXBkYXRlKGJvb2xlYW4gYW5pbWF0ZSkgewotICAgICAgICAvLyBEZWZlciBkaWFsb2cgdXBkYXRlcyBpZiBhIHVzZXIgaXMgYWRqdXN0aW5nIGEgdm9sdW1lIGluIHRoZSBsaXN0Ci0gICAgICAgIGlmIChtUm91dGVJblZvbHVtZVNsaWRlclRvdWNoZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgbUhhc1BlbmRpbmdVcGRhdGUgPSB0cnVlOwotICAgICAgICAgICAgbVBlbmRpbmdVcGRhdGVBbmltYXRpb25OZWVkZWQgfD0gYW5pbWF0ZTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtSGFzUGVuZGluZ1VwZGF0ZSA9IGZhbHNlOwotICAgICAgICBtUGVuZGluZ1VwZGF0ZUFuaW1hdGlvbk5lZWRlZCA9IGZhbHNlOwotICAgICAgICBpZiAoIW1Sb3V0ZS5pc1NlbGVjdGVkKCkgfHwgbVJvdXRlLmlzRGVmYXVsdE9yQmx1ZXRvb3RoKCkpIHsKLSAgICAgICAgICAgIGRpc21pc3MoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1DcmVhdGVkKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtUm91dGVOYW1lVGV4dFZpZXcuc2V0VGV4dChtUm91dGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgbURpc2Nvbm5lY3RCdXR0b24uc2V0VmlzaWJpbGl0eShtUm91dGUuY2FuRGlzY29ubmVjdCgpID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKLSAgICAgICAgaWYgKG1DdXN0b21Db250cm9sVmlldyA9PSBudWxsICYmIG1BcnRJY29uSXNMb2FkZWQpIHsKLSAgICAgICAgICAgIGlmIChpc0JpdG1hcFJlY3ljbGVkKG1BcnRJY29uTG9hZGVkQml0bWFwKSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbid0IHNldCBhcnR3b3JrIGltYWdlIHdpdGggcmVjeWNsZWQgYml0bWFwOiAiICsgbUFydEljb25Mb2FkZWRCaXRtYXApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtQXJ0Vmlldy5zZXRJbWFnZUJpdG1hcChtQXJ0SWNvbkxvYWRlZEJpdG1hcCk7Ci0gICAgICAgICAgICAgICAgbUFydFZpZXcuc2V0QmFja2dyb3VuZENvbG9yKG1BcnRJY29uQmFja2dyb3VuZENvbG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsZWFyTG9hZGVkQml0bWFwKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlVm9sdW1lQ29udHJvbExheW91dCgpOwotICAgICAgICB1cGRhdGVQbGF5YmFja0NvbnRyb2xMYXlvdXQoKTsKLSAgICAgICAgdXBkYXRlTGF5b3V0SGVpZ2h0KGFuaW1hdGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0JpdG1hcFJlY3ljbGVkKEJpdG1hcCBiaXRtYXApIHsKLSAgICAgICAgcmV0dXJuIGJpdG1hcCAhPSBudWxsICYmIGJpdG1hcC5pc1JlY3ljbGVkKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNhblNob3dQbGF5YmFja0NvbnRyb2xMYXlvdXQoKSB7Ci0gICAgICAgIHJldHVybiBtQ3VzdG9tQ29udHJvbFZpZXcgPT0gbnVsbCAmJiAobURlc2NyaXB0aW9uICE9IG51bGwgfHwgbVN0YXRlICE9IG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGhlaWdodCBvZiBtYWluIG1lZGlhIGNvbnRyb2xsZXIgd2hpY2ggaW5jbHVkZXMgcGxheWJhY2sgY29udHJvbCBhbmQgbWFzdGVyCi0gICAgICogdm9sdW1lIGNvbnRyb2wuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgZ2V0TWFpbkNvbnRyb2xsZXJIZWlnaHQoYm9vbGVhbiBzaG93UGxheWJhY2tDb250cm9sKSB7Ci0gICAgICAgIGludCBoZWlnaHQgPSAwOwotICAgICAgICBpZiAoc2hvd1BsYXliYWNrQ29udHJvbCB8fCBtVm9sdW1lQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7Ci0gICAgICAgICAgICBoZWlnaHQgKz0gbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQuZ2V0UGFkZGluZ1RvcCgpCi0gICAgICAgICAgICAgICAgICAgICsgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQuZ2V0UGFkZGluZ0JvdHRvbSgpOwotICAgICAgICAgICAgaWYgKHNob3dQbGF5YmFja0NvbnRyb2wpIHsKLSAgICAgICAgICAgICAgICBoZWlnaHQgKz0gIG1QbGF5YmFja0NvbnRyb2xMYXlvdXQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtVm9sdW1lQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7Ci0gICAgICAgICAgICAgICAgaGVpZ2h0ICs9IG1Wb2x1bWVDb250cm9sTGF5b3V0LmdldE1lYXN1cmVkSGVpZ2h0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2hvd1BsYXliYWNrQ29udHJvbCAmJiBtVm9sdW1lQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7Ci0gICAgICAgICAgICAgICAgaGVpZ2h0ICs9IG1EaXZpZGVyVmlldy5nZXRNZWFzdXJlZEhlaWdodCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoZWlnaHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU1lZGlhQ29udHJvbFZpc2liaWxpdHkoYm9vbGVhbiBjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KSB7Ci0gICAgICAgIC8vIFRPRE86IFVwZGF0ZSB0aGUgdG9wIGFuZCBib3R0b20gcGFkZGluZyBvZiB0aGUgY29udHJvbCBsYXlvdXQgYWNjb3JkaW5nIHRvIHRoZSBkaXNwbGF5Ci0gICAgICAgIC8vIGhlaWdodC4KLSAgICAgICAgbURpdmlkZXJWaWV3LnNldFZpc2liaWxpdHkoKG1Wb2x1bWVDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUKLSAgICAgICAgICAgICAgICAmJiBjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0gICAgICAgIG1NZWRpYU1haW5Db250cm9sTGF5b3V0LnNldFZpc2liaWxpdHkoKG1Wb2x1bWVDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LkdPTkUKLSAgICAgICAgICAgICAgICAmJiAhY2FuU2hvd1BsYXliYWNrQ29udHJvbExheW91dCkgPyBWaWV3LkdPTkUgOiBWaWV3LlZJU0lCTEUpOwotICAgIH0KLQotICAgIHZvaWQgdXBkYXRlTGF5b3V0SGVpZ2h0KGZpbmFsIGJvb2xlYW4gYW5pbWF0ZSkgewotICAgICAgICAvLyBXZSBuZWVkIHRvIGRlZmVyIHRoZSB1cGRhdGUgdW50aWwgdGhlIGZpcnN0IGxheW91dCBoYXMgb2NjdXJyZWQsIGFzIHdlIGRvbid0IHlldCBrbm93IHRoZQotICAgICAgICAvLyBvdmVyYWxsIHZpc2libGUgZGlzcGxheSBzaXplIGluIHdoaWNoIHRoZSB3aW5kb3cgdGhpcyB2aWV3IGlzIGF0dGFjaGVkIHRvIGhhcyBiZWVuCi0gICAgICAgIC8vIHBvc2l0aW9uZWQgaW4uCi0gICAgICAgIG1EZWZhdWx0Q29udHJvbExheW91dC5yZXF1ZXN0TGF5b3V0KCk7Ci0gICAgICAgIFZpZXdUcmVlT2JzZXJ2ZXIgb2JzZXJ2ZXIgPSBtRGVmYXVsdENvbnRyb2xMYXlvdXQuZ2V0Vmlld1RyZWVPYnNlcnZlcigpOwotICAgICAgICBvYnNlcnZlci5hZGRPbkdsb2JhbExheW91dExpc3RlbmVyKG5ldyBWaWV3VHJlZU9ic2VydmVyLk9uR2xvYmFsTGF5b3V0TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uR2xvYmFsTGF5b3V0KCkgewotICAgICAgICAgICAgICAgIG1EZWZhdWx0Q29udHJvbExheW91dC5nZXRWaWV3VHJlZU9ic2VydmVyKCkucmVtb3ZlR2xvYmFsT25MYXlvdXRMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAgICAgICBpZiAobUlzR3JvdXBMaXN0QW5pbWF0aW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Jc0dyb3VwTGlzdEFuaW1hdGlvblBlbmRpbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUxheW91dEhlaWdodEludGVybmFsKGFuaW1hdGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgaGVpZ2h0IG9mIHZpZXdzIGFuZCBoaWRlIGFydHdvcmsgb3IgbWV0YWRhdGEgaWYgc3BhY2UgaXMgbGltaXRlZC4KLSAgICAgKi8KLSAgICB2b2lkIHVwZGF0ZUxheW91dEhlaWdodEludGVybmFsKGJvb2xlYW4gYW5pbWF0ZSkgewotICAgICAgICAvLyBNZWFzdXJlIHRoZSBzaXplIG9mIHdpZGdldHMgYW5kIGdldCB0aGUgaGVpZ2h0IG9mIG1haW4gY29tcG9uZW50cy4KLSAgICAgICAgaW50IG9sZEhlaWdodCA9IGdldExheW91dEhlaWdodChtTWVkaWFNYWluQ29udHJvbExheW91dCk7Ci0gICAgICAgIHNldExheW91dEhlaWdodChtTWVkaWFNYWluQ29udHJvbExheW91dCwgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpOwotICAgICAgICB1cGRhdGVNZWRpYUNvbnRyb2xWaXNpYmlsaXR5KGNhblNob3dQbGF5YmFja0NvbnRyb2xMYXlvdXQoKSk7Ci0gICAgICAgIFZpZXcgZGVjb3JWaWV3ID0gZ2V0V2luZG93KCkuZ2V0RGVjb3JWaWV3KCk7Ci0gICAgICAgIGRlY29yVmlldy5tZWFzdXJlKAotICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhnZXRXaW5kb3coKS5nZXRBdHRyaWJ1dGVzKCkud2lkdGgsIE1lYXN1cmVTcGVjLkVYQUNUTFkpLAotICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEKTsKLSAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KG1NZWRpYU1haW5Db250cm9sTGF5b3V0LCBvbGRIZWlnaHQpOwotICAgICAgICBpbnQgYXJ0Vmlld0hlaWdodCA9IDA7Ci0gICAgICAgIGlmIChtQ3VzdG9tQ29udHJvbFZpZXcgPT0gbnVsbCAmJiBtQXJ0Vmlldy5nZXREcmF3YWJsZSgpIGluc3RhbmNlb2YgQml0bWFwRHJhd2FibGUpIHsKLSAgICAgICAgICAgIEJpdG1hcCBhcnQgPSAoKEJpdG1hcERyYXdhYmxlKSBtQXJ0Vmlldy5nZXREcmF3YWJsZSgpKS5nZXRCaXRtYXAoKTsKLSAgICAgICAgICAgIGlmIChhcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFydFZpZXdIZWlnaHQgPSBnZXREZXNpcmVkQXJ0SGVpZ2h0KGFydC5nZXRXaWR0aCgpLCBhcnQuZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgIG1BcnRWaWV3LnNldFNjYWxlVHlwZShhcnQuZ2V0V2lkdGgoKSA+PSBhcnQuZ2V0SGVpZ2h0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgID8gSW1hZ2VWaWV3LlNjYWxlVHlwZS5GSVRfWFkgOiBJbWFnZVZpZXcuU2NhbGVUeXBlLkZJVF9DRU5URVIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludCBtYWluQ29udHJvbGxlckhlaWdodCA9IGdldE1haW5Db250cm9sbGVySGVpZ2h0KGNhblNob3dQbGF5YmFja0NvbnRyb2xMYXlvdXQoKSk7Ci0gICAgICAgIGludCB2b2x1bWVHcm91cExpc3RDb3VudCA9IG1Hcm91cE1lbWJlclJvdXRlcy5zaXplKCk7Ci0gICAgICAgIC8vIFNjYWxlIGRvd24gdm9sdW1lIGdyb3VwIGxpc3QgaXRlbXMgaW4gbGFuZHNjYXBlIG1vZGUuCi0gICAgICAgIGludCBleHBhbmRlZEdyb3VwTGlzdEhlaWdodCA9IGdldEdyb3VwKCkgPT0gbnVsbCA/IDAgOgotICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cExpc3RJdGVtSGVpZ2h0ICogZ2V0R3JvdXAoKS5nZXRSb3V0ZXMoKS5zaXplKCk7Ci0gICAgICAgIGlmICh2b2x1bWVHcm91cExpc3RDb3VudCA+IDApIHsKLSAgICAgICAgICAgIGV4cGFuZGVkR3JvdXBMaXN0SGVpZ2h0ICs9IG1Wb2x1bWVHcm91cExpc3RQYWRkaW5nVG9wOwotICAgICAgICB9Ci0gICAgICAgIGV4cGFuZGVkR3JvdXBMaXN0SGVpZ2h0ID0gTWF0aC5taW4oZXhwYW5kZWRHcm91cExpc3RIZWlnaHQsIG1Wb2x1bWVHcm91cExpc3RNYXhIZWlnaHQpOwotICAgICAgICBpbnQgdmlzaWJsZUdyb3VwTGlzdEhlaWdodCA9IG1Jc0dyb3VwRXhwYW5kZWQgPyBleHBhbmRlZEdyb3VwTGlzdEhlaWdodCA6IDA7Ci0KLSAgICAgICAgaW50IGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0ID0KLSAgICAgICAgICAgICAgICBNYXRoLm1heChhcnRWaWV3SGVpZ2h0LCB2aXNpYmxlR3JvdXBMaXN0SGVpZ2h0KSArIG1haW5Db250cm9sbGVySGVpZ2h0OwotICAgICAgICBSZWN0IHZpc2libGVSZWN0ID0gbmV3IFJlY3QoKTsKLSAgICAgICAgZGVjb3JWaWV3LmdldFdpbmRvd1Zpc2libGVEaXNwbGF5RnJhbWUodmlzaWJsZVJlY3QpOwotICAgICAgICAvLyBIZWlnaHQgb2Ygbm9uLWNvbnRyb2wgdmlld3MgaW4gZGVjb3Igdmlldy4KLSAgICAgICAgLy8gVGhpcyBpbmNsdWRlcyB0aXRsZSBiYXIsIGJ1dHRvbiBiYXIsIGFuZCBkaWFsb2cncyB2ZXJ0aWNhbCBwYWRkaW5nIHdoaWNoIHNob3VsZCBiZQotICAgICAgICAvLyBhbHdheXMgc2hvd24uCi0gICAgICAgIGludCBub25Db250cm9sVmlld0hlaWdodCA9IG1EaWFsb2dBcmVhTGF5b3V0LmdldE1lYXN1cmVkSGVpZ2h0KCkKLSAgICAgICAgICAgICAgICAtIG1EZWZhdWx0Q29udHJvbExheW91dC5nZXRNZWFzdXJlZEhlaWdodCgpOwotICAgICAgICAvLyBNYXhpbXVtIGFsbG93ZWQgaGVpZ2h0IGZvciBjb250cm9scyB0byBmaXQgc2NyZWVuLgotICAgICAgICBpbnQgbWF4aW11bUNvbnRyb2xWaWV3SGVpZ2h0ID0gdmlzaWJsZVJlY3QuaGVpZ2h0KCkgLSBub25Db250cm9sVmlld0hlaWdodDsKLQotICAgICAgICAvLyBTaG93IGFydHdvcmsgaWYgaXQgZml0cyB0aGUgc2NyZWVuLgotICAgICAgICBpZiAobUN1c3RvbUNvbnRyb2xWaWV3ID09IG51bGwgJiYgYXJ0Vmlld0hlaWdodCA+IDAKLSAgICAgICAgICAgICAgICAmJiBkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCA8PSBtYXhpbXVtQ29udHJvbFZpZXdIZWlnaHQpIHsKLSAgICAgICAgICAgIG1BcnRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIHNldExheW91dEhlaWdodChtQXJ0VmlldywgYXJ0Vmlld0hlaWdodCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZ2V0TGF5b3V0SGVpZ2h0KG1Wb2x1bWVHcm91cExpc3QpICsgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQuZ2V0TWVhc3VyZWRIZWlnaHQoKQotICAgICAgICAgICAgICAgICAgICA+PSBtRGVmYXVsdENvbnRyb2xMYXlvdXQuZ2V0TWVhc3VyZWRIZWlnaHQoKSkgewotICAgICAgICAgICAgICAgIG1BcnRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFydFZpZXdIZWlnaHQgPSAwOwotICAgICAgICAgICAgZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgPSB2aXNpYmxlR3JvdXBMaXN0SGVpZ2h0ICsgbWFpbkNvbnRyb2xsZXJIZWlnaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gU2hvdyB0aGUgcGxheWJhY2sgY29udHJvbCBpZiBpdCBmaXRzIHRoZSBzY3JlZW4uCi0gICAgICAgIGlmIChjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KCkKLSAgICAgICAgICAgICAgICAmJiBkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCA8PSBtYXhpbXVtQ29udHJvbFZpZXdIZWlnaHQpIHsKLSAgICAgICAgICAgIG1QbGF5YmFja0NvbnRyb2xMYXlvdXQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVBsYXliYWNrQ29udHJvbExheW91dC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlTWVkaWFDb250cm9sVmlzaWJpbGl0eShtUGxheWJhY2tDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpOwotICAgICAgICBtYWluQ29udHJvbGxlckhlaWdodCA9IGdldE1haW5Db250cm9sbGVySGVpZ2h0KAotICAgICAgICAgICAgICAgIG1QbGF5YmFja0NvbnRyb2xMYXlvdXQuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0ID0KLSAgICAgICAgICAgICAgICBNYXRoLm1heChhcnRWaWV3SGVpZ2h0LCB2aXNpYmxlR3JvdXBMaXN0SGVpZ2h0KSArIG1haW5Db250cm9sbGVySGVpZ2h0OwotCi0gICAgICAgIC8vIExpbWl0IHRoZSB2b2x1bWUgZ3JvdXAgbGlzdCBoZWlnaHQgdG8gZml0IHRoZSBzY3JlZW4uCi0gICAgICAgIGlmIChkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCA+IG1heGltdW1Db250cm9sVmlld0hlaWdodCkgewotICAgICAgICAgICAgdmlzaWJsZUdyb3VwTGlzdEhlaWdodCAtPSAoZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgLSBtYXhpbXVtQ29udHJvbFZpZXdIZWlnaHQpOwotICAgICAgICAgICAgZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgPSBtYXhpbXVtQ29udHJvbFZpZXdIZWlnaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVXBkYXRlIHRoZSBsYXlvdXRzIHdpdGggdGhlIGNvbXB1dGVkIGhlaWdodHMuCi0gICAgICAgIG1NZWRpYU1haW5Db250cm9sTGF5b3V0LmNsZWFyQW5pbWF0aW9uKCk7Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3QuY2xlYXJBbmltYXRpb24oKTsKLSAgICAgICAgbURlZmF1bHRDb250cm9sTGF5b3V0LmNsZWFyQW5pbWF0aW9uKCk7Ci0gICAgICAgIGlmIChhbmltYXRlKSB7Ci0gICAgICAgICAgICBhbmltYXRlTGF5b3V0SGVpZ2h0KG1NZWRpYU1haW5Db250cm9sTGF5b3V0LCBtYWluQ29udHJvbGxlckhlaWdodCk7Ci0gICAgICAgICAgICBhbmltYXRlTGF5b3V0SGVpZ2h0KG1Wb2x1bWVHcm91cExpc3QsIHZpc2libGVHcm91cExpc3RIZWlnaHQpOwotICAgICAgICAgICAgYW5pbWF0ZUxheW91dEhlaWdodChtRGVmYXVsdENvbnRyb2xMYXlvdXQsIGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldExheW91dEhlaWdodChtTWVkaWFNYWluQ29udHJvbExheW91dCwgbWFpbkNvbnRyb2xsZXJIZWlnaHQpOwotICAgICAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KG1Wb2x1bWVHcm91cExpc3QsIHZpc2libGVHcm91cExpc3RIZWlnaHQpOwotICAgICAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KG1EZWZhdWx0Q29udHJvbExheW91dCwgZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQpOwotICAgICAgICB9Ci0gICAgICAgIC8vIE1heGltaXplIHRoZSB3aW5kb3cgc2l6ZSB3aXRoIGEgdHJhbnNwYXJlbnQgbGF5b3V0IGluIGFkdmFuY2UgZm9yIHNtb290aCBhbmltYXRpb24uCi0gICAgICAgIHNldExheW91dEhlaWdodChtRXhwYW5kYWJsZUFyZWFMYXlvdXQsIHZpc2libGVSZWN0LmhlaWdodCgpKTsKLSAgICAgICAgcmVidWlsZFZvbHVtZUdyb3VwTGlzdChhbmltYXRlKTsKLSAgICB9Ci0KLSAgICB2b2lkIHVwZGF0ZVZvbHVtZUdyb3VwSXRlbUhlaWdodChWaWV3IGl0ZW0pIHsKLSAgICAgICAgTGluZWFyTGF5b3V0IGNvbnRhaW5lciA9IChMaW5lYXJMYXlvdXQpIGl0ZW0uZmluZFZpZXdCeUlkKFIuaWQudm9sdW1lX2l0ZW1fY29udGFpbmVyKTsKLSAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KGNvbnRhaW5lciwgbVZvbHVtZUdyb3VwTGlzdEl0ZW1IZWlnaHQpOwotICAgICAgICBWaWV3IGljb24gPSBpdGVtLmZpbmRWaWV3QnlJZChSLmlkLm1yX3ZvbHVtZV9pdGVtX2ljb24pOwotICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGxwID0gaWNvbi5nZXRMYXlvdXRQYXJhbXMoKTsKLSAgICAgICAgbHAud2lkdGggPSBtVm9sdW1lR3JvdXBMaXN0SXRlbUljb25TaXplOwotICAgICAgICBscC5oZWlnaHQgPSBtVm9sdW1lR3JvdXBMaXN0SXRlbUljb25TaXplOwotICAgICAgICBpY29uLnNldExheW91dFBhcmFtcyhscCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFuaW1hdGVMYXlvdXRIZWlnaHQoZmluYWwgVmlldyB2aWV3LCBpbnQgdGFyZ2V0SGVpZ2h0KSB7Ci0gICAgICAgIGZpbmFsIGludCBzdGFydFZhbHVlID0gZ2V0TGF5b3V0SGVpZ2h0KHZpZXcpOwotICAgICAgICBmaW5hbCBpbnQgZW5kVmFsdWUgPSB0YXJnZXRIZWlnaHQ7Ci0gICAgICAgIEFuaW1hdGlvbiBhbmltID0gbmV3IEFuaW1hdGlvbigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgYXBwbHlUcmFuc2Zvcm1hdGlvbihmbG9hdCBpbnRlcnBvbGF0ZWRUaW1lLCBUcmFuc2Zvcm1hdGlvbiB0KSB7Ci0gICAgICAgICAgICAgICAgaW50IGhlaWdodCA9IHN0YXJ0VmFsdWUgLSAoaW50KSAoKHN0YXJ0VmFsdWUgLSBlbmRWYWx1ZSkgKiBpbnRlcnBvbGF0ZWRUaW1lKTsKLSAgICAgICAgICAgICAgICBzZXRMYXlvdXRIZWlnaHQodmlldywgaGVpZ2h0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgYW5pbS5zZXREdXJhdGlvbihtR3JvdXBMaXN0QW5pbWF0aW9uRHVyYXRpb25Ncyk7Ci0gICAgICAgIGlmIChhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSAyMSkgewotICAgICAgICAgICAgYW5pbS5zZXRJbnRlcnBvbGF0b3IobUludGVycG9sYXRvcik7Ci0gICAgICAgIH0KLSAgICAgICAgdmlldy5zdGFydEFuaW1hdGlvbihhbmltKTsKLSAgICB9Ci0KLSAgICB2b2lkIGxvYWRJbnRlcnBvbGF0b3IoKSB7Ci0gICAgICAgIG1JbnRlcnBvbGF0b3IgPQotICAgICAgICAgICAgICAgIG1Jc0dyb3VwRXhwYW5kZWQgPyBtTGluZWFyT3V0U2xvd0luSW50ZXJwb2xhdG9yIDogbUZhc3RPdXRTbG93SW5JbnRlcnBvbGF0b3I7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVZvbHVtZUNvbnRyb2xMYXlvdXQoKSB7Ci0gICAgICAgIGlmIChpc1ZvbHVtZUNvbnRyb2xBdmFpbGFibGUobVJvdXRlKSkgewotICAgICAgICAgICAgaWYgKG1Wb2x1bWVDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LkdPTkUpIHsKLSAgICAgICAgICAgICAgICBtVm9sdW1lQ29udHJvbExheW91dC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZVNsaWRlci5zZXRNYXgobVJvdXRlLmdldFZvbHVtZU1heCgpKTsKLSAgICAgICAgICAgICAgICBtVm9sdW1lU2xpZGVyLnNldFByb2dyZXNzKG1Sb3V0ZS5nZXRWb2x1bWUoKSk7Ci0gICAgICAgICAgICAgICAgbUdyb3VwRXhwYW5kQ29sbGFwc2VCdXR0b24uc2V0VmlzaWJpbGl0eShnZXRHcm91cCgpID09IG51bGwgPyBWaWV3LkdPTkUKLSAgICAgICAgICAgICAgICAgICAgICAgIDogVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Wb2x1bWVDb250cm9sTGF5b3V0LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWJ1aWxkVm9sdW1lR3JvdXBMaXN0KGJvb2xlYW4gYW5pbWF0ZSkgewotICAgICAgICBMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gcm91dGVzID0gZ2V0R3JvdXAoKSA9PSBudWxsID8gbnVsbCA6IGdldEdyb3VwKCkuZ2V0Um91dGVzKCk7Ci0gICAgICAgIGlmIChyb3V0ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzLmNsZWFyKCk7Ci0gICAgICAgICAgICBtVm9sdW1lR3JvdXBBZGFwdGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5saXN0VW5vcmRlcmVkRXF1YWxzKG1Hcm91cE1lbWJlclJvdXRlcywgcm91dGVzKSkgewotICAgICAgICAgICAgbVZvbHVtZUdyb3VwQWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgSGFzaE1hcDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIFJlY3Q+IHByZXZpb3VzUm91dGVCb3VuZE1hcCA9IGFuaW1hdGUKLSAgICAgICAgICAgICAgICAgICAgPyBNZWRpYVJvdXRlRGlhbG9nSGVscGVyLmdldEl0ZW1Cb3VuZE1hcChtVm9sdW1lR3JvdXBMaXN0LCBtVm9sdW1lR3JvdXBBZGFwdGVyKQotICAgICAgICAgICAgICAgICAgICA6IG51bGw7Ci0gICAgICAgICAgICBIYXNoTWFwPE1lZGlhUm91dGVyLlJvdXRlSW5mbywgQml0bWFwRHJhd2FibGU+IHByZXZpb3VzUm91dGVCaXRtYXBNYXAgPSBhbmltYXRlCi0gICAgICAgICAgICAgICAgICAgID8gTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5nZXRJdGVtQml0bWFwTWFwKG1Db250ZXh0LCBtVm9sdW1lR3JvdXBMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cEFkYXB0ZXIpIDogbnVsbDsKLSAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkID0KLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5nZXRJdGVtc0FkZGVkKG1Hcm91cE1lbWJlclJvdXRlcywgcm91dGVzKTsKLSAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQgPSBNZWRpYVJvdXRlRGlhbG9nSGVscGVyLmdldEl0ZW1zUmVtb3ZlZChtR3JvdXBNZW1iZXJSb3V0ZXMsCi0gICAgICAgICAgICAgICAgICAgIHJvdXRlcyk7Ci0gICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXMuYWRkQWxsKDAsIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkKTsKLSAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlcy5yZW1vdmVBbGwobUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZCk7Ci0gICAgICAgICAgICBtVm9sdW1lR3JvdXBBZGFwdGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7Ci0gICAgICAgICAgICBpZiAoYW5pbWF0ZSAmJiBtSXNHcm91cEV4cGFuZGVkCi0gICAgICAgICAgICAgICAgICAgICYmIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLnNpemUoKSArIG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIGFuaW1hdGVHcm91cExpc3RJdGVtcyhwcmV2aW91c1JvdXRlQm91bmRNYXAsIHByZXZpb3VzUm91dGVCaXRtYXBNYXApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYW5pbWF0ZUdyb3VwTGlzdEl0ZW1zKGZpbmFsIE1hcDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIFJlY3Q+IHByZXZpb3VzUm91dGVCb3VuZE1hcCwKLSAgICAgICAgICAgIGZpbmFsIE1hcDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIEJpdG1hcERyYXdhYmxlPiBwcmV2aW91c1JvdXRlQml0bWFwTWFwKSB7Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3Quc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3QucmVxdWVzdExheW91dCgpOwotICAgICAgICBtSXNHcm91cExpc3RBbmltYXRpbmcgPSB0cnVlOwotICAgICAgICBWaWV3VHJlZU9ic2VydmVyIG9ic2VydmVyID0gbVZvbHVtZUdyb3VwTGlzdC5nZXRWaWV3VHJlZU9ic2VydmVyKCk7Ci0gICAgICAgIG9ic2VydmVyLmFkZE9uR2xvYmFsTGF5b3V0TGlzdGVuZXIobmV3IFZpZXdUcmVlT2JzZXJ2ZXIuT25HbG9iYWxMYXlvdXRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25HbG9iYWxMYXlvdXQoKSB7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5nZXRWaWV3VHJlZU9ic2VydmVyKCkucmVtb3ZlR2xvYmFsT25MYXlvdXRMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAgICAgICBhbmltYXRlR3JvdXBMaXN0SXRlbXNJbnRlcm5hbChwcmV2aW91c1JvdXRlQm91bmRNYXAsIHByZXZpb3VzUm91dGVCaXRtYXBNYXApOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIGFuaW1hdGVHcm91cExpc3RJdGVtc0ludGVybmFsKAotICAgICAgICAgICAgTWFwPE1lZGlhUm91dGVyLlJvdXRlSW5mbywgUmVjdD4gcHJldmlvdXNSb3V0ZUJvdW5kTWFwLAotICAgICAgICAgICAgTWFwPE1lZGlhUm91dGVyLlJvdXRlSW5mbywgQml0bWFwRHJhd2FibGU+IHByZXZpb3VzUm91dGVCaXRtYXBNYXApIHsKLSAgICAgICAgaWYgKG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkID09IG51bGwgfHwgbUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGdyb3VwU2l6ZURlbHRhID0gbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQuc2l6ZSgpIC0gbUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZC5zaXplKCk7Ci0gICAgICAgIGJvb2xlYW4gbGlzdGVuZXJSZWdpc3RlcmVkID0gZmFsc2U7Ci0gICAgICAgIEFuaW1hdGlvbi5BbmltYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBBbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoQW5pbWF0aW9uIGFuaW1hdGlvbikgewotICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cExpc3Quc3RhcnRBbmltYXRpb25BbGwoKTsKLSAgICAgICAgICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnBvc3REZWxheWVkKG1Hcm91cExpc3RGYWRlSW5BbmltYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBtR3JvdXBMaXN0QW5pbWF0aW9uRHVyYXRpb25Ncyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0aW9uIGFuaW1hdGlvbikgeyB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25SZXBlYXQoQW5pbWF0aW9uIGFuaW1hdGlvbikgeyB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gQW5pbWF0ZSB2aXNpYmxlIGl0ZW1zIGZyb20gcHJldmlvdXMgcG9zaXRpb25zIHRvIGN1cnJlbnQgcG9zaXRpb25zIGV4Y2VwdCByb3V0ZXMgYWRkZWQKLSAgICAgICAgLy8ganVzdCBiZWZvcmUuIEFkZGVkIHJvdXRlcyB3aWxsIHJlbWFpbiBoaWRkZW4gdW50aWwgdHJhbnNsYXRlIGFuaW1hdGlvbiBmaW5pc2hlcy4KLSAgICAgICAgaW50IGZpcnN0ID0gbVZvbHVtZUdyb3VwTGlzdC5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRDb3VudCgpOyArK2kpIHsKLSAgICAgICAgICAgIFZpZXcgdmlldyA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRBdChpKTsKLSAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IGZpcnN0ICsgaTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1Wb2x1bWVHcm91cEFkYXB0ZXIuZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBSZWN0IHByZXZpb3VzQm91bmRzID0gcHJldmlvdXNSb3V0ZUJvdW5kTWFwLmdldChyb3V0ZSk7Ci0gICAgICAgICAgICBpbnQgY3VycmVudFRvcCA9IHZpZXcuZ2V0VG9wKCk7Ci0gICAgICAgICAgICBpbnQgcHJldmlvdXNUb3AgPSBwcmV2aW91c0JvdW5kcyAhPSBudWxsID8gcHJldmlvdXNCb3VuZHMudG9wCi0gICAgICAgICAgICAgICAgICAgIDogKGN1cnJlbnRUb3AgKyBtVm9sdW1lR3JvdXBMaXN0SXRlbUhlaWdodCAqIGdyb3VwU2l6ZURlbHRhKTsKLSAgICAgICAgICAgIEFuaW1hdGlvblNldCBhbmltU2V0ID0gbmV3IEFuaW1hdGlvblNldCh0cnVlKTsKLSAgICAgICAgICAgIGlmIChtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCAhPSBudWxsICYmIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLmNvbnRhaW5zKHJvdXRlKSkgewotICAgICAgICAgICAgICAgIHByZXZpb3VzVG9wID0gY3VycmVudFRvcDsKLSAgICAgICAgICAgICAgICBBbmltYXRpb24gYWxwaGFBbmltID0gbmV3IEFscGhhQW5pbWF0aW9uKDAuMGYsIDAuMGYpOwotICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXREdXJhdGlvbihtR3JvdXBMaXN0RmFkZUluRHVyYXRpb25Ncyk7Ci0gICAgICAgICAgICAgICAgYW5pbVNldC5hZGRBbmltYXRpb24oYWxwaGFBbmltKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFuaW1hdGlvbiB0cmFuc2xhdGlvbkFuaW0gPSBuZXcgVHJhbnNsYXRlQW5pbWF0aW9uKDAsIDAsIHByZXZpb3VzVG9wIC0gY3VycmVudFRvcCwgMCk7Ci0gICAgICAgICAgICB0cmFuc2xhdGlvbkFuaW0uc2V0RHVyYXRpb24obUdyb3VwTGlzdEFuaW1hdGlvbkR1cmF0aW9uTXMpOwotICAgICAgICAgICAgYW5pbVNldC5hZGRBbmltYXRpb24odHJhbnNsYXRpb25BbmltKTsKLSAgICAgICAgICAgIGFuaW1TZXQuc2V0RmlsbEFmdGVyKHRydWUpOwotICAgICAgICAgICAgYW5pbVNldC5zZXRGaWxsRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIGFuaW1TZXQuc2V0SW50ZXJwb2xhdG9yKG1JbnRlcnBvbGF0b3IpOwotICAgICAgICAgICAgaWYgKCFsaXN0ZW5lclJlZ2lzdGVyZWQpIHsKLSAgICAgICAgICAgICAgICBsaXN0ZW5lclJlZ2lzdGVyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGFuaW1TZXQuc2V0QW5pbWF0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmlldy5jbGVhckFuaW1hdGlvbigpOwotICAgICAgICAgICAgdmlldy5zdGFydEFuaW1hdGlvbihhbmltU2V0KTsKLSAgICAgICAgICAgIHByZXZpb3VzUm91dGVCb3VuZE1hcC5yZW1vdmUocm91dGUpOwotICAgICAgICAgICAgcHJldmlvdXNSb3V0ZUJpdG1hcE1hcC5yZW1vdmUocm91dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgYSBtZW1iZXIgcm91dGUgZG9lc24ndCBleGlzdCBhbnkgbG9uZ2VyLCBpdCBjYW4gYmUgZWl0aGVyIHJlbW92ZWQgb3IgbW92ZWQgb3V0IG9mIHRoZQotICAgICAgICAvLyBMaXN0VmlldyBsYXlvdXQgYm91bmRhcnkuIEluIHRoaXMgY2FzZSwgdXNlIHRoZSBwcmV2aW91c2x5IGNhcHR1cmVkIGJpdG1hcHMgZm9yCi0gICAgICAgIC8vIGFuaW1hdGlvbi4KLSAgICAgICAgZm9yIChNYXAuRW50cnk8TWVkaWFSb3V0ZXIuUm91dGVJbmZvLCBCaXRtYXBEcmF3YWJsZT4gaXRlbQotICAgICAgICAgICAgICAgIDogcHJldmlvdXNSb3V0ZUJpdG1hcE1hcC5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBpdGVtLmdldEtleSgpOwotICAgICAgICAgICAgZmluYWwgQml0bWFwRHJhd2FibGUgYml0bWFwID0gaXRlbS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgZmluYWwgUmVjdCBib3VuZHMgPSBwcmV2aW91c1JvdXRlQm91bmRNYXAuZ2V0KHJvdXRlKTsKLSAgICAgICAgICAgIE92ZXJsYXlPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChtR3JvdXBNZW1iZXJSb3V0ZXNSZW1vdmVkLmNvbnRhaW5zKHJvdXRlKSkgewotICAgICAgICAgICAgICAgIG9iamVjdCA9IG5ldyBPdmVybGF5T2JqZWN0KGJpdG1hcCwgYm91bmRzKS5zZXRBbHBoYUFuaW1hdGlvbigxLjBmLCAwLjBmKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldER1cmF0aW9uKG1Hcm91cExpc3RGYWRlT3V0RHVyYXRpb25NcykKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbnRlcnBvbGF0b3IobUludGVycG9sYXRvcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludCBkZWx0YVkgPSBncm91cFNpemVEZWx0YSAqIG1Wb2x1bWVHcm91cExpc3RJdGVtSGVpZ2h0OwotICAgICAgICAgICAgICAgIG9iamVjdCA9IG5ldyBPdmVybGF5T2JqZWN0KGJpdG1hcCwgYm91bmRzKS5zZXRUcmFuc2xhdGVZQW5pbWF0aW9uKGRlbHRhWSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREdXJhdGlvbihtR3JvdXBMaXN0QW5pbWF0aW9uRHVyYXRpb25NcykKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbnRlcnBvbGF0b3IobUludGVycG9sYXRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBbmltYXRpb25FbmRMaXN0ZW5lcihuZXcgT3ZlcmxheU9iamVjdC5PbkFuaW1hdGlvbkVuZExpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNBbmltYXRpbmdXaXRoQml0bWFwLnJlbW92ZShyb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cEFkYXB0ZXIubm90aWZ5RGF0YVNldENoYW5nZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNBbmltYXRpbmdXaXRoQml0bWFwLmFkZChyb3V0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LmFkZE92ZXJsYXlPYmplY3Qob2JqZWN0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc3RhcnRHcm91cExpc3RGYWRlSW5BbmltYXRpb24oKSB7Ci0gICAgICAgIGNsZWFyR3JvdXBMaXN0QW5pbWF0aW9uKHRydWUpOwotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnJlcXVlc3RMYXlvdXQoKTsKLSAgICAgICAgVmlld1RyZWVPYnNlcnZlciBvYnNlcnZlciA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Vmlld1RyZWVPYnNlcnZlcigpOwotICAgICAgICBvYnNlcnZlci5hZGRPbkdsb2JhbExheW91dExpc3RlbmVyKG5ldyBWaWV3VHJlZU9ic2VydmVyLk9uR2xvYmFsTGF5b3V0TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uR2xvYmFsTGF5b3V0KCkgewotICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cExpc3QuZ2V0Vmlld1RyZWVPYnNlcnZlcigpLnJlbW92ZUdsb2JhbE9uTGF5b3V0TGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICAgICAgc3RhcnRHcm91cExpc3RGYWRlSW5BbmltYXRpb25JbnRlcm5hbCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHN0YXJ0R3JvdXBMaXN0RmFkZUluQW5pbWF0aW9uSW50ZXJuYWwoKSB7Ci0gICAgICAgIGlmIChtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCAhPSBudWxsICYmIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgICAgICBmYWRlSW5BZGRlZFJvdXRlcygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmluaXNoQW5pbWF0aW9uKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBmaW5pc2hBbmltYXRpb24oYm9vbGVhbiBhbmltYXRlKSB7Ci0gICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkID0gbnVsbDsKLSAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZCA9IG51bGw7Ci0gICAgICAgIG1Jc0dyb3VwTGlzdEFuaW1hdGluZyA9IGZhbHNlOwotICAgICAgICBpZiAobUlzR3JvdXBMaXN0QW5pbWF0aW9uUGVuZGluZykgewotICAgICAgICAgICAgbUlzR3JvdXBMaXN0QW5pbWF0aW9uUGVuZGluZyA9IGZhbHNlOwotICAgICAgICAgICAgdXBkYXRlTGF5b3V0SGVpZ2h0KGFuaW1hdGUpOwotICAgICAgICB9Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3Quc2V0RW5hYmxlZCh0cnVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZmFkZUluQWRkZWRSb3V0ZXMoKSB7Ci0gICAgICAgIEFuaW1hdGlvbi5BbmltYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBBbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoQW5pbWF0aW9uIGFuaW1hdGlvbikgeyB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0aW9uIGFuaW1hdGlvbikgewotICAgICAgICAgICAgICAgIGZpbmlzaEFuaW1hdGlvbih0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblJlcGVhdChBbmltYXRpb24gYW5pbWF0aW9uKSB7IH0KLSAgICAgICAgfTsKLSAgICAgICAgYm9vbGVhbiBsaXN0ZW5lclJlZ2lzdGVyZWQgPSBmYWxzZTsKLSAgICAgICAgaW50IGZpcnN0ID0gbVZvbHVtZUdyb3VwTGlzdC5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRDb3VudCgpOyArK2kpIHsKLSAgICAgICAgICAgIFZpZXcgdmlldyA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRBdChpKTsKLSAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IGZpcnN0ICsgaTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1Wb2x1bWVHcm91cEFkYXB0ZXIuZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBpZiAobUdyb3VwTWVtYmVyUm91dGVzQWRkZWQuY29udGFpbnMocm91dGUpKSB7Ci0gICAgICAgICAgICAgICAgQW5pbWF0aW9uIGFscGhhQW5pbSA9IG5ldyBBbHBoYUFuaW1hdGlvbigwLjBmLCAxLjBmKTsKLSAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0RHVyYXRpb24obUdyb3VwTGlzdEZhZGVJbkR1cmF0aW9uTXMpOwotICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXRGaWxsRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0RmlsbEFmdGVyKHRydWUpOwotICAgICAgICAgICAgICAgIGlmICghbGlzdGVuZXJSZWdpc3RlcmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyUmVnaXN0ZXJlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXRBbmltYXRpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHZpZXcuY2xlYXJBbmltYXRpb24oKTsKLSAgICAgICAgICAgICAgICB2aWV3LnN0YXJ0QW5pbWF0aW9uKGFscGhhQW5pbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGNsZWFyR3JvdXBMaXN0QW5pbWF0aW9uKGJvb2xlYW4gZXhjZXB0QWRkZWRSb3V0ZXMpIHsKLSAgICAgICAgaW50IGZpcnN0ID0gbVZvbHVtZUdyb3VwTGlzdC5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRDb3VudCgpOyArK2kpIHsKLSAgICAgICAgICAgIFZpZXcgdmlldyA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRBdChpKTsKLSAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IGZpcnN0ICsgaTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1Wb2x1bWVHcm91cEFkYXB0ZXIuZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBpZiAoZXhjZXB0QWRkZWRSb3V0ZXMgJiYgbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZC5jb250YWlucyhyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExpbmVhckxheW91dCBjb250YWluZXIgPSAoTGluZWFyTGF5b3V0KSB2aWV3LmZpbmRWaWV3QnlJZChSLmlkLnZvbHVtZV9pdGVtX2NvbnRhaW5lcik7Ci0gICAgICAgICAgICBjb250YWluZXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgQW5pbWF0aW9uU2V0IGFuaW1TZXQgPSBuZXcgQW5pbWF0aW9uU2V0KHRydWUpOwotICAgICAgICAgICAgQW5pbWF0aW9uIGFscGhhQW5pbSA9IG5ldyBBbHBoYUFuaW1hdGlvbigxLjBmLCAxLjBmKTsKLSAgICAgICAgICAgIGFscGhhQW5pbS5zZXREdXJhdGlvbigwKTsKLSAgICAgICAgICAgIGFuaW1TZXQuYWRkQW5pbWF0aW9uKGFscGhhQW5pbSk7Ci0gICAgICAgICAgICBBbmltYXRpb24gdHJhbnNsYXRpb25BbmltID0gbmV3IFRyYW5zbGF0ZUFuaW1hdGlvbigwLCAwLCAwLCAwKTsKLSAgICAgICAgICAgIHRyYW5zbGF0aW9uQW5pbS5zZXREdXJhdGlvbigwKTsKLSAgICAgICAgICAgIGFuaW1TZXQuc2V0RmlsbEFmdGVyKHRydWUpOwotICAgICAgICAgICAgYW5pbVNldC5zZXRGaWxsRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIHZpZXcuY2xlYXJBbmltYXRpb24oKTsKLSAgICAgICAgICAgIHZpZXcuc3RhcnRBbmltYXRpb24oYW5pbVNldCk7Ci0gICAgICAgIH0KLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5zdG9wQW5pbWF0aW9uQWxsKCk7Ci0gICAgICAgIGlmICghZXhjZXB0QWRkZWRSb3V0ZXMpIHsKLSAgICAgICAgICAgIGZpbmlzaEFuaW1hdGlvbihmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlUGxheWJhY2tDb250cm9sTGF5b3V0KCkgewotICAgICAgICBpZiAoY2FuU2hvd1BsYXliYWNrQ29udHJvbExheW91dCgpKSB7Ci0gICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUgPSBtRGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiBtRGVzY3JpcHRpb24uZ2V0VGl0bGUoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzVGl0bGUgPSAhVGV4dFV0aWxzLmlzRW1wdHkodGl0bGUpOwotCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2Ugc3VidGl0bGUgPSBtRGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiBtRGVzY3JpcHRpb24uZ2V0U3VidGl0bGUoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzU3VidGl0bGUgPSAhVGV4dFV0aWxzLmlzRW1wdHkoc3VidGl0bGUpOwotCi0gICAgICAgICAgICBib29sZWFuIHNob3dUaXRsZSA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbGVhbiBzaG93U3VidGl0bGUgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChtUm91dGUuZ2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKCkKLSAgICAgICAgICAgICAgICAgICAgIT0gTWVkaWFSb3V0ZXIuUm91dGVJbmZvLlBSRVNFTlRBVElPTl9ESVNQTEFZX0lEX05PTkUpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgdXNlciBpcyBjdXJyZW50bHkgY2FzdGluZyBzY3JlZW4uCi0gICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4pKTsKLSAgICAgICAgICAgICAgICBzaG93VGl0bGUgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gbnVsbCB8fCBtU3RhdGUuZ2V0U3RhdGUoKSA9PSBQbGF5YmFja1N0YXRlQ29tcGF0LlNUQVRFX05PTkUpIHsKLSAgICAgICAgICAgICAgICAvLyBTaG93ICJObyBtZWRpYSBzZWxlY3RlZCIgYXMgd2UgZG9uJ3QgeWV0IGtub3cgdGhlIHBsYXliYWNrIHN0YXRlLgotICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dChBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5tcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkKSk7Ci0gICAgICAgICAgICAgICAgc2hvd1RpdGxlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWhhc1RpdGxlICYmICFoYXNTdWJ0aXRsZSkgewotICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dChBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5tcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlKSk7Ci0gICAgICAgICAgICAgICAgc2hvd1RpdGxlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGhhc1RpdGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dCh0aXRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNob3dUaXRsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChoYXNTdWJ0aXRsZSkgewotICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFRleHQoc3VidGl0bGUpOwotICAgICAgICAgICAgICAgICAgICBzaG93U3VidGl0bGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VmlzaWJpbGl0eShzaG93VGl0bGUgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KHNob3dTdWJ0aXRsZSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0KLSAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNQbGF5aW5nID0gbVN0YXRlLmdldFN0YXRlKCkgPT0gUGxheWJhY2tTdGF0ZUNvbXBhdC5TVEFURV9CVUZGRVJJTkcKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1TdGF0ZS5nZXRTdGF0ZSgpID09IFBsYXliYWNrU3RhdGVDb21wYXQuU1RBVEVfUExBWUlORzsKLSAgICAgICAgICAgICAgICBDb250ZXh0IHBsYXliYWNrQ29udHJvbEJ1dHRvbkNvbnRleHQgPSBtUGxheWJhY2tDb250cm9sQnV0dG9uLmdldENvbnRleHQoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIHZpc2libGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIGludCBpY29uRHJhd2FibGVBdHRyID0gMDsKLSAgICAgICAgICAgICAgICBpbnQgaWNvbkRlc2NSZXNJZCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKGlzUGxheWluZyAmJiBpc1BhdXNlQWN0aW9uU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWNvbkRyYXdhYmxlQXR0ciA9IFIuYXR0ci5tZWRpYVJvdXRlUGF1c2VEcmF3YWJsZTsKLSAgICAgICAgICAgICAgICAgICAgaWNvbkRlc2NSZXNJZCA9IFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfcGF1c2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc1BsYXlpbmcgJiYgaXNTdG9wQWN0aW9uU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWNvbkRyYXdhYmxlQXR0ciA9IFIuYXR0ci5tZWRpYVJvdXRlU3RvcERyYXdhYmxlOwotICAgICAgICAgICAgICAgICAgICBpY29uRGVzY1Jlc0lkID0gUi5zdHJpbmcubXJfY29udHJvbGxlcl9zdG9wOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzUGxheWluZyAmJiBpc1BsYXlBY3Rpb25TdXBwb3J0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBpY29uRHJhd2FibGVBdHRyID0gUi5hdHRyLm1lZGlhUm91dGVQbGF5RHJhd2FibGU7Ci0gICAgICAgICAgICAgICAgICAgIGljb25EZXNjUmVzSWQgPSBSLnN0cmluZy5tcl9jb250cm9sbGVyX3BsYXk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdmlzaWJsZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUGxheWJhY2tDb250cm9sQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJsZSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgaWYgKHZpc2libGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrQ29udHJvbEJ1dHRvbi5zZXRJbWFnZVJlc291cmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0VGhlbWVSZXNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrQ29udHJvbEJ1dHRvbkNvbnRleHQsIGljb25EcmF3YWJsZUF0dHIpKTsKLSAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrQ29udHJvbEJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tDb250cm9sQnV0dG9uQ29udGV4dC5nZXRSZXNvdXJjZXMoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFRleHQoaWNvbkRlc2NSZXNJZCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1BsYXlBY3Rpb25TdXBwb3J0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAobVN0YXRlLmdldEFjdGlvbnMoKSAmIChBQ1RJT05fUExBWSB8IEFDVElPTl9QTEFZX1BBVVNFKSkgIT0gMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNQYXVzZUFjdGlvblN1cHBvcnRlZCgpIHsKLSAgICAgICAgcmV0dXJuIChtU3RhdGUuZ2V0QWN0aW9ucygpICYgKEFDVElPTl9QQVVTRSB8IEFDVElPTl9QTEFZX1BBVVNFKSkgIT0gMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTdG9wQWN0aW9uU3VwcG9ydGVkKCkgewotICAgICAgICByZXR1cm4gKG1TdGF0ZS5nZXRBY3Rpb25zKCkgJiBBQ1RJT05fU1RPUCkgIT0gMDsKLSAgICB9Ci0KLSAgICBib29sZWFuIGlzVm9sdW1lQ29udHJvbEF2YWlsYWJsZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgcmV0dXJuIG1Wb2x1bWVDb250cm9sRW5hYmxlZCAmJiByb3V0ZS5nZXRWb2x1bWVIYW5kbGluZygpCi0gICAgICAgICAgICAgICAgPT0gTWVkaWFSb3V0ZXIuUm91dGVJbmZvLlBMQVlCQUNLX1ZPTFVNRV9WQVJJQUJMRTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0TGF5b3V0SGVpZ2h0KFZpZXcgdmlldykgewotICAgICAgICByZXR1cm4gdmlldy5nZXRMYXlvdXRQYXJhbXMoKS5oZWlnaHQ7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgc2V0TGF5b3V0SGVpZ2h0KFZpZXcgdmlldywgaW50IGhlaWdodCkgewotICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGxwID0gdmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKLSAgICAgICAgbHAuaGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICB2aWV3LnNldExheW91dFBhcmFtcyhscCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB1cmlFcXVhbHMoVXJpIHVyaTEsIFVyaSB1cmkyKSB7Ci0gICAgICAgIGlmICh1cmkxICE9IG51bGwgJiYgdXJpMS5lcXVhbHModXJpMikpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKHVyaTEgPT0gbnVsbCAmJiB1cmkyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGRlc2lyZWQgYXJ0IGhlaWdodCB0byBmaXQgaW50byBjb250cm9sbGVyIGRpYWxvZy4KLSAgICAgKi8KLSAgICBpbnQgZ2V0RGVzaXJlZEFydEhlaWdodChpbnQgb3JpZ2luYWxXaWR0aCwgaW50IG9yaWdpbmFsSGVpZ2h0KSB7Ci0gICAgICAgIGlmIChvcmlnaW5hbFdpZHRoID49IG9yaWdpbmFsSGVpZ2h0KSB7Ci0gICAgICAgICAgICAvLyBGb3IgbGFuZHNjYXBlIGFydCwgZml0IHdpZHRoIHRvIGRpYWxvZyB3aWR0aC4KLSAgICAgICAgICAgIHJldHVybiAoaW50KSAoKGZsb2F0KSBtRGlhbG9nQ29udGVudFdpZHRoICogb3JpZ2luYWxIZWlnaHQgLyBvcmlnaW5hbFdpZHRoICsgMC41Zik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gRm9yIHBvcnRyYWl0IGFydCwgZml0IGhlaWdodCB0byAxNjo5IHJhdGlvIGNhc2UncyBoZWlnaHQuCi0gICAgICAgIHJldHVybiAoaW50KSAoKGZsb2F0KSBtRGlhbG9nQ29udGVudFdpZHRoICogOSAvIDE2ICsgMC41Zik7Ci0gICAgfQotCi0gICAgdm9pZCB1cGRhdGVBcnRJY29uSWZOZWVkZWQoKSB7Ci0gICAgICAgIGlmIChtQ3VzdG9tQ29udHJvbFZpZXcgIT0gbnVsbCB8fCAhaXNJY29uQ2hhbmdlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1GZXRjaEFydFRhc2sgIT0gbnVsbCkgewotICAgICAgICAgICAgbUZldGNoQXJ0VGFzay5jYW5jZWwodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUZldGNoQXJ0VGFzayA9IG5ldyBGZXRjaEFydFRhc2soKTsKLSAgICAgICAgbUZldGNoQXJ0VGFzay5leGVjdXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXIgdGhlIGJpdG1hcCBsb2FkZWQgYnkgRmV0Y2hBcnRUYXNrLiBXaWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgbG9hZGVkIGJpdG1hcHMgYXJlIGFwcGxpZWQKLSAgICAgKiB0byBhcnR3b3JrLCBvciBubyBsb25nZXIgdmFsaWQuCi0gICAgICovCi0gICAgdm9pZCBjbGVhckxvYWRlZEJpdG1hcCgpIHsKLSAgICAgICAgbUFydEljb25Jc0xvYWRlZCA9IGZhbHNlOwotICAgICAgICBtQXJ0SWNvbkxvYWRlZEJpdG1hcCA9IG51bGw7Ci0gICAgICAgIG1BcnRJY29uQmFja2dyb3VuZENvbG9yID0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYSBuZXcgYXJ0IGltYWdlIGlzIGRpZmZlcmVudCBmcm9tIGFuIG9yaWdpbmFsIGFydCBpbWFnZS4gQ29tcGFyZXMKLSAgICAgKiBCaXRtYXAgb2JqZWN0cyBmaXJzdCwgYW5kIHRoZW4gY29tcGFyZXMgVVJJcyBvbmx5IGlmIGJpdG1hcCBpcyB1bmNoYW5nZWQgd2l0aAotICAgICAqIGEgbnVsbCB2YWx1ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJY29uQ2hhbmdlZCgpIHsKLSAgICAgICAgQml0bWFwIG5ld0JpdG1hcCA9IG1EZXNjcmlwdGlvbiA9PSBudWxsID8gbnVsbCA6IG1EZXNjcmlwdGlvbi5nZXRJY29uQml0bWFwKCk7Ci0gICAgICAgIFVyaSBuZXdVcmkgPSBtRGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiBtRGVzY3JpcHRpb24uZ2V0SWNvblVyaSgpOwotICAgICAgICBCaXRtYXAgb2xkQml0bWFwID0gbUZldGNoQXJ0VGFzayA9PSBudWxsID8gbUFydEljb25CaXRtYXAgOiBtRmV0Y2hBcnRUYXNrLmdldEljb25CaXRtYXAoKTsKLSAgICAgICAgVXJpIG9sZFVyaSA9IG1GZXRjaEFydFRhc2sgPT0gbnVsbCA/IG1BcnRJY29uVXJpIDogbUZldGNoQXJ0VGFzay5nZXRJY29uVXJpKCk7Ci0gICAgICAgIGlmIChvbGRCaXRtYXAgIT0gbmV3Qml0bWFwKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChvbGRCaXRtYXAgPT0gbnVsbCAmJiAhdXJpRXF1YWxzKG9sZFVyaSwgbmV3VXJpKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVyLkNhbGxiYWNrIHsKLSAgICAgICAgTWVkaWFSb3V0ZXJDYWxsYmFjaygpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgdXBkYXRlKGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgdXBkYXRlKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVWb2x1bWVDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBTZWVrQmFyIHZvbHVtZVNsaWRlciA9IG1Wb2x1bWVTbGlkZXJNYXAuZ2V0KHJvdXRlKTsKLSAgICAgICAgICAgIGludCB2b2x1bWUgPSByb3V0ZS5nZXRWb2x1bWUoKTsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uUm91dGVWb2x1bWVDaGFuZ2VkKCksIHJvdXRlLmdldFZvbHVtZToiICsgdm9sdW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2b2x1bWVTbGlkZXIgIT0gbnVsbCAmJiBtUm91dGVJblZvbHVtZVNsaWRlclRvdWNoZWQgIT0gcm91dGUpIHsKLSAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0UHJvZ3Jlc3Modm9sdW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTWVkaWFDb250cm9sbGVyQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYUNvbnRyb2xsZXJDb21wYXQuQ2FsbGJhY2sgewotICAgICAgICBNZWRpYUNvbnRyb2xsZXJDYWxsYmFjaygpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblNlc3Npb25EZXN0cm95ZWQoKSB7Ci0gICAgICAgICAgICBpZiAobU1lZGlhQ29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci51bnJlZ2lzdGVyQ2FsbGJhY2sobUNvbnRyb2xsZXJDYWxsYmFjayk7Ci0gICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlciA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25QbGF5YmFja1N0YXRlQ2hhbmdlZChQbGF5YmFja1N0YXRlQ29tcGF0IHN0YXRlKSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBzdGF0ZTsKLSAgICAgICAgICAgIHVwZGF0ZShmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25NZXRhZGF0YUNoYW5nZWQoTWVkaWFNZXRhZGF0YUNvbXBhdCBtZXRhZGF0YSkgewotICAgICAgICAgICAgbURlc2NyaXB0aW9uID0gbWV0YWRhdGEgPT0gbnVsbCA/IG51bGwgOiBtZXRhZGF0YS5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgdXBkYXRlQXJ0SWNvbklmTmVlZGVkKCk7Ci0gICAgICAgICAgICB1cGRhdGUoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDbGlja0xpc3RlbmVyIGltcGxlbWVudHMgVmlldy5PbkNsaWNrTGlzdGVuZXIgewotICAgICAgICBDbGlja0xpc3RlbmVyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBpbnQgaWQgPSB2LmdldElkKCk7Ci0gICAgICAgICAgICBpZiAoaWQgPT0gQlVUVE9OX1NUT1BfUkVTX0lEIHx8IGlkID09IEJVVFRPTl9ESVNDT05ORUNUX1JFU19JRCkgewotICAgICAgICAgICAgICAgIGlmIChtUm91dGUuaXNTZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXIudW5zZWxlY3QoaWQgPT0gQlVUVE9OX1NUT1BfUkVTX0lEID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fU1RPUFBFRCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX0RJU0NPTk5FQ1RFRCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRpc21pc3MoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaWQgPT0gUi5pZC5tcl9jb250cm9sX3BsYXliYWNrX2N0cmwpIHsKLSAgICAgICAgICAgICAgICBpZiAobU1lZGlhQ29udHJvbGxlciAhPSBudWxsICYmIG1TdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNQbGF5aW5nID0gbVN0YXRlLmdldFN0YXRlKCkgPT0gUGxheWJhY2tTdGF0ZUNvbXBhdC5TVEFURV9QTEFZSU5HOwotICAgICAgICAgICAgICAgICAgICBpbnQgYWN0aW9uRGVzY1Jlc0lkID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzUGxheWluZyAmJiBpc1BhdXNlQWN0aW9uU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKS5wYXVzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uRGVzY1Jlc0lkID0gUi5zdHJpbmcubXJfY29udHJvbGxlcl9wYXVzZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc1BsYXlpbmcgJiYgaXNTdG9wQWN0aW9uU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKS5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25EZXNjUmVzSWQgPSBSLnN0cmluZy5tcl9jb250cm9sbGVyX3N0b3A7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzUGxheWluZyAmJiBpc1BsYXlBY3Rpb25TdXBwb3J0ZWQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCkucGxheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uRGVzY1Jlc0lkID0gUi5zdHJpbmcubXJfY29udHJvbGxlcl9wbGF5OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFubm91bmNlIHRoZSBhY3Rpb24gZm9yIGFjY2Vzc2liaWxpdHkuCi0gICAgICAgICAgICAgICAgICAgIGlmIChtQWNjZXNzaWJpbGl0eU1hbmFnZXIgIT0gbnVsbCAmJiBtQWNjZXNzaWJpbGl0eU1hbmFnZXIuaXNFbmFibGVkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBhY3Rpb25EZXNjUmVzSWQgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50Q29tcGF0LlRZUEVfQU5OT1VOQ0VNRU5UKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnNldFBhY2thZ2VOYW1lKG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc2V0Q2xhc3NOYW1lKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldFRleHQoKS5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldFN0cmluZyhhY3Rpb25EZXNjUmVzSWQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BY2Nlc3NpYmlsaXR5TWFuYWdlci5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaWQgPT0gUi5pZC5tcl9jbG9zZSkgewotICAgICAgICAgICAgICAgIGRpc21pc3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgVm9sdW1lQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBTZWVrQmFyLk9uU2Vla0JhckNoYW5nZUxpc3RlbmVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBSdW5uYWJsZSBtU3RvcFRyYWNraW5nVG91Y2ggPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBpZiAobVJvdXRlSW5Wb2x1bWVTbGlkZXJUb3VjaGVkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlSW5Wb2x1bWVTbGlkZXJUb3VjaGVkID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1IYXNQZW5kaW5nVXBkYXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUobVBlbmRpbmdVcGRhdGVBbmltYXRpb25OZWVkZWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIFZvbHVtZUNoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgewotICAgICAgICAgICAgaWYgKG1Sb3V0ZUluVm9sdW1lU2xpZGVyVG91Y2hlZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZVNsaWRlci5yZW1vdmVDYWxsYmFja3MobVN0b3BUcmFja2luZ1RvdWNoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Sb3V0ZUluVm9sdW1lU2xpZGVyVG91Y2hlZCA9IChNZWRpYVJvdXRlci5Sb3V0ZUluZm8pIHNlZWtCYXIuZ2V0VGFnKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TdG9wVHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKLSAgICAgICAgICAgIC8vIERlZmVyIHJlc2V0dGluZyBtVm9sdW1lU2xpZGVyVG91Y2hlZCB0byBhbGxvdyB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIKLSAgICAgICAgICAgIC8vIGEgbGl0dGxlIHRpbWUgdG8gc2V0dGxlIGludG8gaXRzIG5ldyBzdGF0ZSBhbmQgcHVibGlzaCB0aGUgZmluYWwKLSAgICAgICAgICAgIC8vIHZvbHVtZSB1cGRhdGUuCi0gICAgICAgICAgICBtVm9sdW1lU2xpZGVyLnBvc3REZWxheWVkKG1TdG9wVHJhY2tpbmdUb3VjaCwgVk9MVU1FX1VQREFURV9ERUxBWV9NSUxMSVMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvZ3Jlc3NDaGFuZ2VkKFNlZWtCYXIgc2Vla0JhciwgaW50IHByb2dyZXNzLCBib29sZWFuIGZyb21Vc2VyKSB7Ci0gICAgICAgICAgICBpZiAoZnJvbVVzZXIpIHsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSAoTWVkaWFSb3V0ZXIuUm91dGVJbmZvKSBzZWVrQmFyLmdldFRhZygpOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblByb2dyZXNzQ2hhbmdlZCgpOiBjYWxsaW5nICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJNZWRpYVJvdXRlci5Sb3V0ZUluZm8ucmVxdWVzdFNldFZvbHVtZSgiICsgcHJvZ3Jlc3MgKyAiKSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByb3V0ZS5yZXF1ZXN0U2V0Vm9sdW1lKHByb2dyZXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgVm9sdW1lR3JvdXBBZGFwdGVyIGV4dGVuZHMgQXJyYXlBZGFwdGVyPE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gewotICAgICAgICBmaW5hbCBmbG9hdCBtRGlzYWJsZWRBbHBoYTsKLQotICAgICAgICBwdWJsaWMgVm9sdW1lR3JvdXBBZGFwdGVyKENvbnRleHQgY29udGV4dCwgTGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IG9iamVjdHMpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIDAsIG9iamVjdHMpOwotICAgICAgICAgICAgbURpc2FibGVkQWxwaGEgPSBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldERpc2FibGVkQWxwaGEoY29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoZmluYWwgaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBWaWV3IHYgPSBjb252ZXJ0VmlldzsKLSAgICAgICAgICAgIGlmICh2ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2ID0gTGF5b3V0SW5mbGF0ZXIuZnJvbShwYXJlbnQuZ2V0Q29udGV4dCgpKS5pbmZsYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgUi5sYXlvdXQubXJfY29udHJvbGxlcl92b2x1bWVfaXRlbSwgcGFyZW50LCBmYWxzZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHVwZGF0ZVZvbHVtZUdyb3VwSXRlbUhlaWdodCh2KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBpZiAocm91dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNFbmFibGVkID0gcm91dGUuaXNFbmFibGVkKCk7Ci0KLSAgICAgICAgICAgICAgICBUZXh0VmlldyByb3V0ZU5hbWUgPSAoVGV4dFZpZXcpIHYuZmluZFZpZXdCeUlkKFIuaWQubXJfbmFtZSk7Ci0gICAgICAgICAgICAgICAgcm91dGVOYW1lLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLSAgICAgICAgICAgICAgICByb3V0ZU5hbWUuc2V0VGV4dChyb3V0ZS5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlciB2b2x1bWVTbGlkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE1lZGlhUm91dGVWb2x1bWVTbGlkZXIpIHYuZmluZFZpZXdCeUlkKFIuaWQubXJfdm9sdW1lX3NsaWRlcik7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5zZXRWb2x1bWVTbGlkZXJDb2xvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5nZXRDb250ZXh0KCksIHZvbHVtZVNsaWRlciwgbVZvbHVtZUdyb3VwTGlzdCk7Ci0gICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldFRhZyhyb3V0ZSk7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZVNsaWRlck1hcC5wdXQocm91dGUsIHZvbHVtZVNsaWRlcik7Ci0gICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldEhpZGVUaHVtYighaXNFbmFibGVkKTsKLSAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0RW5hYmxlZChpc0VuYWJsZWQpOwotICAgICAgICAgICAgICAgIGlmIChpc0VuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzVm9sdW1lQ29udHJvbEF2YWlsYWJsZShyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRNYXgocm91dGUuZ2V0Vm9sdW1lTWF4KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldFByb2dyZXNzKHJvdXRlLmdldFZvbHVtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcihtVm9sdW1lQ2hhbmdlTGlzdGVuZXIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldE1heCgxMDApOwotICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldFByb2dyZXNzKDEwMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBJbWFnZVZpZXcgdm9sdW1lSXRlbUljb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgKEltYWdlVmlldykgdi5maW5kVmlld0J5SWQoUi5pZC5tcl92b2x1bWVfaXRlbV9pY29uKTsKLSAgICAgICAgICAgICAgICB2b2x1bWVJdGVtSWNvbi5zZXRBbHBoYShpc0VuYWJsZWQgPyAweEZGIDogKGludCkgKDB4RkYgKiBtRGlzYWJsZWRBbHBoYSkpOwotCi0gICAgICAgICAgICAgICAgLy8gSWYgb3ZlcmxheSBiaXRtYXAgZXhpc3RzLCByZWFsIHZpZXcgc2hvdWxkIHJlbWFpbiBoaWRkZW4gdW50aWwKLSAgICAgICAgICAgICAgICAvLyB0aGUgYW5pbWF0aW9uIGVuZHMuCi0gICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0IGNvbnRhaW5lciA9IChMaW5lYXJMYXlvdXQpIHYuZmluZFZpZXdCeUlkKFIuaWQudm9sdW1lX2l0ZW1fY29udGFpbmVyKTsKLSAgICAgICAgICAgICAgICBjb250YWluZXIuc2V0VmlzaWJpbGl0eShtR3JvdXBNZW1iZXJSb3V0ZXNBbmltYXRpbmdXaXRoQml0bWFwLmNvbnRhaW5zKHJvdXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgPyBWaWV3LklOVklTSUJMRSA6IFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSb3V0ZXMgd2hpY2ggYXJlIGJlaW5nIGFkZGVkIHdpbGwgYmUgaW52aXNpYmxlIHVudGlsIGFuaW1hdGlvbiBlbmRzLgotICAgICAgICAgICAgICAgIGlmIChtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCAhPSBudWxsICYmIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLmNvbnRhaW5zKHJvdXRlKSkgewotICAgICAgICAgICAgICAgICAgICBBbmltYXRpb24gYWxwaGFBbmltID0gbmV3IEFscGhhQW5pbWF0aW9uKDAuMGYsIDAuMGYpOwotICAgICAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0RHVyYXRpb24oMCk7Ci0gICAgICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXRGaWxsRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgYWxwaGFBbmltLnNldEZpbGxBZnRlcih0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgdi5jbGVhckFuaW1hdGlvbigpOwotICAgICAgICAgICAgICAgICAgICB2LnN0YXJ0QW5pbWF0aW9uKGFscGhhQW5pbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHY7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIEZldGNoQXJ0VGFzayBleHRlbmRzIEFzeW5jVGFzazxWb2lkLCBWb2lkLCBCaXRtYXA+IHsKLSAgICAgICAgLy8gU2hvdyBhbmltYXRpb24gb25seSB3aGVuIGZldGNoaW5nIHRha2VzIGEgbG9uZyB0aW1lLgotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFNIT1dfQU5JTV9USU1FX1RIUkVTSE9MRF9NSUxMSVMgPSAxMjBMOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1JY29uQml0bWFwOwotICAgICAgICBwcml2YXRlIGZpbmFsIFVyaSBtSWNvblVyaTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUJhY2tncm91bmRDb2xvcjsKLSAgICAgICAgcHJpdmF0ZSBsb25nIG1TdGFydFRpbWVNaWxsaXM7Ci0KLSAgICAgICAgRmV0Y2hBcnRUYXNrKCkgewotICAgICAgICAgICAgQml0bWFwIGJpdG1hcCA9IG1EZXNjcmlwdGlvbiA9PSBudWxsID8gbnVsbCA6IG1EZXNjcmlwdGlvbi5nZXRJY29uQml0bWFwKCk7Ci0gICAgICAgICAgICBpZiAoaXNCaXRtYXBSZWN5Y2xlZChiaXRtYXApKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2FuJ3QgZmV0Y2ggdGhlIGdpdmVuIGFydCBiaXRtYXAgYmVjYXVzZSBpdCdzIGFscmVhZHkgcmVjeWNsZWQuIik7Ci0gICAgICAgICAgICAgICAgYml0bWFwID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1JY29uQml0bWFwID0gYml0bWFwOwotICAgICAgICAgICAgbUljb25VcmkgPSBtRGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiBtRGVzY3JpcHRpb24uZ2V0SWNvblVyaSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEJpdG1hcCBnZXRJY29uQml0bWFwKCkgewotICAgICAgICAgICAgcmV0dXJuIG1JY29uQml0bWFwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFVyaSBnZXRJY29uVXJpKCkgewotICAgICAgICAgICAgcmV0dXJuIG1JY29uVXJpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUHJlRXhlY3V0ZSgpIHsKLSAgICAgICAgICAgIG1TdGFydFRpbWVNaWxsaXMgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIGNsZWFyTG9hZGVkQml0bWFwKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIEJpdG1hcCBkb0luQmFja2dyb3VuZChWb2lkLi4uIGFyZykgewotICAgICAgICAgICAgQml0bWFwIGFydCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobUljb25CaXRtYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFydCA9IG1JY29uQml0bWFwOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtSWNvblVyaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKHN0cmVhbSA9IG9wZW5JbnB1dFN0cmVhbUJ5U2NoZW1lKG1JY29uVXJpKSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIG9wZW46ICIgKyBtSWNvblVyaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBRdWVyeSBhcnQgc2l6ZS4KLSAgICAgICAgICAgICAgICAgICAgQml0bWFwRmFjdG9yeS5PcHRpb25zIG9wdGlvbnMgPSBuZXcgQml0bWFwRmFjdG9yeS5PcHRpb25zKCk7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaW5KdXN0RGVjb2RlQm91bmRzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgQml0bWFwRmFjdG9yeS5kZWNvZGVTdHJlYW0oc3RyZWFtLCBudWxsLCBvcHRpb25zKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMub3V0V2lkdGggPT0gMCB8fCBvcHRpb25zLm91dEhlaWdodCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBSZXdpbmQgdGhlIHN0cmVhbSBpbiBvcmRlciB0byByZXN0YXJ0IGFydCBkZWNvZGluZy4KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5yZXNldCgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBGYWlsZWQgdG8gcmV3aW5kIHRoZSBzdHJlYW0sIHRyeSB0byByZW9wZW4gaXQuCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc3RyZWFtID0gb3BlbklucHV0U3RyZWFtQnlTY2hlbWUobUljb25VcmkpKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIG9wZW46ICIgKyBtSWNvblVyaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHJlcXVpcmVkIHNpemUgdG8gZGVjb2RlIHRoZSBhcnQgYW5kIHBvc3NpYmx5IHJlc2l6ZSBpdC4KLSAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5pbkp1c3REZWNvZGVCb3VuZHMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJlcUhlaWdodCA9IGdldERlc2lyZWRBcnRIZWlnaHQob3B0aW9ucy5vdXRXaWR0aCwgb3B0aW9ucy5vdXRIZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBpbnQgcmF0aW8gPSBvcHRpb25zLm91dEhlaWdodCAvIHJlcUhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5pblNhbXBsZVNpemUgPSBNYXRoLm1heCgxLCBJbnRlZ2VyLmhpZ2hlc3RPbmVCaXQocmF0aW8pKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ2FuY2VsbGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFydCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlU3RyZWFtKHN0cmVhbSwgbnVsbCwgb3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlVuYWJsZSB0byBvcGVuOiAiICsgbUljb25VcmksIGUpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpc0JpdG1hcFJlY3ljbGVkKGFydCkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW4ndCB1c2UgcmVjeWNsZWQgYml0bWFwOiAiICsgYXJ0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhcnQgIT0gbnVsbCAmJiBhcnQuZ2V0V2lkdGgoKSA8IGFydC5nZXRIZWlnaHQoKSkgewotICAgICAgICAgICAgICAgIC8vIFBvcnRyYWl0IGFydCByZXF1aXJlcyBkb21pbmFudCBjb2xvciBhcyBiYWNrZ3JvdW5kIGNvbG9yLgotICAgICAgICAgICAgICAgIFBhbGV0dGUgcGFsZXR0ZSA9IG5ldyBQYWxldHRlLkJ1aWxkZXIoYXJ0KS5tYXhpbXVtQ29sb3JDb3VudCgxKS5nZW5lcmF0ZSgpOwotICAgICAgICAgICAgICAgIG1CYWNrZ3JvdW5kQ29sb3IgPSBwYWxldHRlLmdldFN3YXRjaGVzKCkuaXNFbXB0eSgpCi0gICAgICAgICAgICAgICAgICAgICAgICA/IDAgOiBwYWxldHRlLmdldFN3YXRjaGVzKCkuZ2V0KDApLmdldFJnYigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGFydDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RFeGVjdXRlKEJpdG1hcCBhcnQpIHsKLSAgICAgICAgICAgIG1GZXRjaEFydFRhc2sgPSBudWxsOwotICAgICAgICAgICAgaWYgKCFPYmplY3RzQ29tcGF0LmVxdWFscyhtQXJ0SWNvbkJpdG1hcCwgbUljb25CaXRtYXApCi0gICAgICAgICAgICAgICAgICAgIHx8ICFPYmplY3RzQ29tcGF0LmVxdWFscyhtQXJ0SWNvblVyaSwgbUljb25VcmkpKSB7Ci0gICAgICAgICAgICAgICAgbUFydEljb25CaXRtYXAgPSBtSWNvbkJpdG1hcDsKLSAgICAgICAgICAgICAgICBtQXJ0SWNvbkxvYWRlZEJpdG1hcCA9IGFydDsKLSAgICAgICAgICAgICAgICBtQXJ0SWNvblVyaSA9IG1JY29uVXJpOwotICAgICAgICAgICAgICAgIG1BcnRJY29uQmFja2dyb3VuZENvbG9yID0gbUJhY2tncm91bmRDb2xvcjsKLSAgICAgICAgICAgICAgICBtQXJ0SWNvbklzTG9hZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBsb25nIGVsYXBzZWRUaW1lTWlsbGlzID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgLSBtU3RhcnRUaW1lTWlsbGlzOwotICAgICAgICAgICAgICAgIC8vIExvYWRlZCBiaXRtYXAgd2lsbCBiZSBhcHBsaWVkIG9uIHRoZSBuZXh0IHVwZGF0ZQotICAgICAgICAgICAgICAgIHVwZGF0ZShlbGFwc2VkVGltZU1pbGxpcyA+IFNIT1dfQU5JTV9USU1FX1RIUkVTSE9MRF9NSUxMSVMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBvcGVuSW5wdXRTdHJlYW1CeVNjaGVtZShVcmkgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgU3RyaW5nIHNjaGVtZSA9IHVyaS5nZXRTY2hlbWUoKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChDb250ZW50UmVzb2x2ZXIuU0NIRU1FX0FORFJPSURfUkVTT1VSQ0UuZXF1YWxzKHNjaGVtZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgQ29udGVudFJlc29sdmVyLlNDSEVNRV9DT05URU5ULmVxdWFscyhzY2hlbWUpCi0gICAgICAgICAgICAgICAgICAgIHx8IENvbnRlbnRSZXNvbHZlci5TQ0hFTUVfRklMRS5lcXVhbHMoc2NoZW1lKSkgewotICAgICAgICAgICAgICAgIHN0cmVhbSA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLm9wZW5JbnB1dFN0cmVhbSh1cmkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTCh1cmkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgVVJMQ29ubmVjdGlvbiBjb25uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgY29ubi5zZXRDb25uZWN0VGltZW91dChDT05ORUNUSU9OX1RJTUVPVVRfTUlMTElTKTsKLSAgICAgICAgICAgICAgICBjb25uLnNldFJlYWRUaW1lb3V0KENPTk5FQ1RJT05fVElNRU9VVF9NSUxMSVMpOwotICAgICAgICAgICAgICAgIHN0cmVhbSA9IGNvbm4uZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAoc3RyZWFtID09IG51bGwpID8gbnVsbCA6IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHN0cmVhbSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTVkNzRmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZzsKLWltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2dGcmFnbWVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci0KLS8qKgotICogTWVkaWEgcm91dGUgY29udHJvbGxlciBkaWFsb2cgZnJhZ21lbnQuCi0gKiA8cD4KLSAqIENyZWF0ZXMgYSB7QGxpbmsgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2d9LiAgVGhlIGFwcGxpY2F0aW9uIG1heSBzdWJjbGFzcwotICogdGhpcyBkaWFsb2cgZnJhZ21lbnQgdG8gY3VzdG9taXplIHRoZSBtZWRpYSByb3V0ZSBjb250cm9sbGVyIGRpYWxvZy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQgZXh0ZW5kcyBEaWFsb2dGcmFnbWVudCB7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZyBtRGlhbG9nOwotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBjb250cm9sbGVyIGRpYWxvZyBmcmFnbWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBBbGwgc3ViY2xhc3NlcyBvZiB0aGlzIGNsYXNzIG11c3QgYWxzbyBwb3NzZXNzIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQoKSB7Ci0gICAgICAgIHNldENhbmNlbGFibGUodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlIGNvbnRyb2xsZXIgZGlhbG9nIGlzIGJlaW5nIGNyZWF0ZWQuCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3VzdG9taXplIHRoZSBkaWFsb2cuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZyBvbkNyZWF0ZUNvbnRyb2xsZXJEaWFsb2coCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZyhjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRGlhbG9nIG9uQ3JlYXRlRGlhbG9nKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgbURpYWxvZyA9IG9uQ3JlYXRlQ29udHJvbGxlckRpYWxvZyhnZXRDb250ZXh0KCksIHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0gICAgICAgIHJldHVybiBtRGlhbG9nOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKLSAgICAgICAgc3VwZXIub25TdG9wKCk7Ci0gICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1EaWFsb2cuY2xlYXJHcm91cExpc3RBbmltYXRpb24oZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgewotICAgICAgICBzdXBlci5vbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKG5ld0NvbmZpZyk7Ci0gICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1EaWFsb2cudXBkYXRlTGF5b3V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVEaWFsb2dGYWN0b3J5LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVEaWFsb2dGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZWFmMzkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlhbG9nRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7Ci0KLS8qKgotICogVGhlIG1lZGlhIHJvdXRlIGRpYWxvZyBmYWN0b3J5IGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGUgbWVkaWEgcm91dGUKLSAqIGNob29zZXIgYW5kIGNvbnRyb2xsZXIgZGlhbG9ncyBhcyBuZWVkZWQuCi0gKiA8cD4KLSAqIFRoZSBhcHBsaWNhdGlvbiBjYW4gY3VzdG9taXplIHRoZSBkaWFsb2dzIGJ5IHByb3ZpZGluZyBhIHN1YmNsYXNzIG9mIHRoZQotICogZGlhbG9nIGZhY3RvcnkgdG8gdGhlIHtAbGluayBNZWRpYVJvdXRlQnV0dG9ufSB1c2luZyB0aGUKLSAqIHtAbGluayBNZWRpYVJvdXRlQnV0dG9uI3NldERpYWxvZ0ZhY3Rvcnkgc2V0RGlhbG9nRmFjdG9yeX0gbWV0aG9kLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IHNEZWZhdWx0ID0gbmV3IE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZGVmYXVsdCBtZWRpYSByb3V0ZSBkaWFsb2cgZmFjdG9yeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGVmYXVsdCBmYWN0b3J5IGluc3RhbmNlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZGVmYXVsdCBtZWRpYSByb3V0ZSBkaWFsb2cgZmFjdG9yeSwgbmV2ZXIgbnVsbC4KLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgZ2V0RGVmYXVsdCgpIHsKLSAgICAgICAgcmV0dXJuIHNEZWZhdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBjaG9vc2VyIGRpYWxvZyBpcyBiZWluZyBvcGVuZWQgYW5kIGl0IGlzIHRpbWUgdG8gY3JlYXRlIHRoZSBmcmFnbWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjcmVhdGUgYSBjdXN0b21pemVkIGZyYWdtZW50LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nIGZyYWdtZW50LCBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgcHVibGljIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQgb25DcmVhdGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2dGcmFnbWVudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBjb250cm9sbGVyIGRpYWxvZyBpcyBiZWluZyBvcGVuZWQgYW5kIGl0IGlzIHRpbWUgdG8gY3JlYXRlIHRoZSBmcmFnbWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjcmVhdGUgYSBjdXN0b21pemVkIGZyYWdtZW50LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIHJvdXRlIGNvbnRyb2xsZXIgZGlhbG9nIGZyYWdtZW50LCBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgcHVibGljIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQgb25DcmVhdGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlhbG9nSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYWJmN2IuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlhbG9nSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLlI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1maW5hbCBjbGFzcyBNZWRpYVJvdXRlRGlhbG9nSGVscGVyIHsKLSAgICAvKioKLSAgICAgKiBUaGUgZnJhbWV3b3JrIHNob3VsZCBzZXQgdGhlIGRpYWxvZyB3aWR0aCBwcm9wZXJseSwgYnV0IHNvbWVob3cgaXQgZG9lc24ndCB3b3JrLCBoZW5jZQotICAgICAqIGR1cGxpY2F0aW5nIGEgc2ltaWxhciBsb2dpYyBoZXJlIHRvIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgZGlhbG9nIHdpZHRoLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldERpYWxvZ1dpZHRoKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBEaXNwbGF5TWV0cmljcyBtZXRyaWNzID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5nZXREaXNwbGF5TWV0cmljcygpOwotICAgICAgICBib29sZWFuIGlzUG9ydHJhaXQgPSBtZXRyaWNzLndpZHRoUGl4ZWxzIDwgbWV0cmljcy5oZWlnaHRQaXhlbHM7Ci0KLSAgICAgICAgVHlwZWRWYWx1ZSB2YWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7Ci0gICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0VmFsdWUoaXNQb3J0cmFpdAotICAgICAgICAgICAgICAgID8gUi5kaW1lbi5tcl9kaWFsb2dfZml4ZWRfd2lkdGhfbWlub3IKLSAgICAgICAgICAgICAgICA6IFIuZGltZW4ubXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21ham9yLCB2YWx1ZSwgdHJ1ZSk7Ci0gICAgICAgIGlmICh2YWx1ZS50eXBlID09IFR5cGVkVmFsdWUuVFlQRV9ESU1FTlNJT04pIHsKLSAgICAgICAgICAgIHJldHVybiAoaW50KSB2YWx1ZS5nZXREaW1lbnNpb24obWV0cmljcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUudHlwZSA9PSBUeXBlZFZhbHVlLlRZUEVfRlJBQ1RJT04pIHsKLSAgICAgICAgICAgIHJldHVybiAoaW50KSB2YWx1ZS5nZXRGcmFjdGlvbihtZXRyaWNzLndpZHRoUGl4ZWxzLCBtZXRyaWNzLndpZHRoUGl4ZWxzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdHdvIGxpc3RzIHJlZ2FyZGxlc3Mgb2Ygb3JkZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdDEgQSBsaXN0Ci0gICAgICogQHBhcmFtIGxpc3QyIEEgbGlzdCB0byBiZSBjb21wYXJlZCB3aXRoIHtAY29kZSBsaXN0MX0KLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdHdvIGxpc3RzIGhhdmUgZXhhY3RseSBzYW1lIGl0ZW1zIHJlZ2FyZGxlc3Mgb2Ygb3JkZXIsIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIGxpc3RVbm9yZGVyZWRFcXVhbHMoTGlzdDxFPiBsaXN0MSwgTGlzdDxFPiBsaXN0MikgewotICAgICAgICBIYXNoU2V0PEU+IHNldDEgPSBuZXcgSGFzaFNldDw+KGxpc3QxKTsKLSAgICAgICAgSGFzaFNldDxFPiBzZXQyID0gbmV3IEhhc2hTZXQ8PihsaXN0Mik7Ci0gICAgICAgIHJldHVybiBzZXQxLmVxdWFscyhzZXQyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0d28gbGlzdHMgYW5kIHJldHVybnMgYSBzZXQgb2YgaXRlbXMgd2hpY2ggZXhpc3QKLSAgICAgKiBhZnRlci1saXN0IGJ1dCBiZWZvcmUtbGlzdCwgd2hpY2ggbWVhbnMgbmV3bHkgYWRkZWQgaXRlbXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmVmb3JlIEEgbGlzdAotICAgICAqIEBwYXJhbSBhZnRlciBBIGxpc3QgdG8gYmUgY29tcGFyZWQgd2l0aCB7QGNvZGUgYmVmb3JlfQotICAgICAqIEByZXR1cm4gQSBzZXQgb2YgaXRlbXMgd2hpY2ggY29udGFpbnMgbmV3bHkgYWRkZWQgaXRlbXMgd2hpbGUKLSAgICAgKiBjb21wYXJpbmcge0Bjb2RlIGFmdGVyfSB0byB7QGNvZGUgYmVmb3JlfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIDxFPiBTZXQ8RT4gZ2V0SXRlbXNBZGRlZChMaXN0PEU+IGJlZm9yZSwgTGlzdDxFPiBhZnRlcikgewotICAgICAgICBIYXNoU2V0PEU+IHNldCA9IG5ldyBIYXNoU2V0PD4oYWZ0ZXIpOwotICAgICAgICBzZXQucmVtb3ZlQWxsKGJlZm9yZSk7Ci0gICAgICAgIHJldHVybiBzZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdHdvIGxpc3RzIGFuZCByZXR1cm5zIGEgc2V0IG9mIGl0ZW1zIHdoaWNoIGV4aXN0Ci0gICAgICogYmVmb3JlLWxpc3QgYnV0IGFmdGVyLWxpc3QsIHdoaWNoIG1lYW5zIHJlbW92ZWQgaXRlbXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmVmb3JlIEEgbGlzdAotICAgICAqIEBwYXJhbSBhZnRlciBBIGxpc3QgdG8gYmUgY29tcGFyZWQgd2l0aCB7QGNvZGUgYmVmb3JlfQotICAgICAqIEByZXR1cm4gQSBzZXQgb2YgaXRlbXMgd2hpY2ggY29udGFpbnMgcmVtb3ZlZCBpdGVtcyB3aGlsZQotICAgICAqIGNvbXBhcmluZyB7QGNvZGUgYWZ0ZXJ9IHRvIHtAY29kZSBiZWZvcmV9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgPEU+IFNldDxFPiBnZXRJdGVtc1JlbW92ZWQoTGlzdDxFPiBiZWZvcmUsIExpc3Q8RT4gYWZ0ZXIpIHsKLSAgICAgICAgSGFzaFNldDxFPiBzZXQgPSBuZXcgSGFzaFNldDw+KGJlZm9yZSk7Ci0gICAgICAgIHNldC5yZW1vdmVBbGwoYWZ0ZXIpOwotICAgICAgICByZXR1cm4gc2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyBhbiBpdGVtLVJlY3QgbWFwIHdoaWNoIGluZGljYXRlcyB3aGVyZSBtZW1iZXIKLSAgICAgKiBpdGVtcyBhcmUgbG9jYXRlZCBpbiB0aGUgZ2l2ZW4gTGlzdFZpZXcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdFZpZXcgQSBsaXN0IHZpZXcKLSAgICAgKiBAcGFyYW0gYWRhcHRlciBBbiBhcnJheSBhZGFwdGVyIHdoaWNoIGNvbnRhaW5zIGFuIGFycmF5IG9mIGl0ZW1zLgotICAgICAqIEByZXR1cm4gQSBtYXAgb2YgaXRlbXMgYW5kIGJvdW5kcyBvZiB0aGVpciB2aWV3cyBsb2NhdGVkIGluIHRoZSBnaXZlbiBsaXN0IHZpZXcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8RT4gSGFzaE1hcDxFLCBSZWN0PiBnZXRJdGVtQm91bmRNYXAoTGlzdFZpZXcgbGlzdFZpZXcsCi0gICAgICAgICAgICBBcnJheUFkYXB0ZXI8RT4gYWRhcHRlcikgewotICAgICAgICBIYXNoTWFwPEUsIFJlY3Q+IGl0ZW1Cb3VuZE1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgaW50IGZpcnN0VmlzaWJsZVBvc2l0aW9uID0gbGlzdFZpZXcuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Vmlldy5nZXRDaGlsZENvdW50KCk7ICsraSkgewotICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gZmlyc3RWaXNpYmxlUG9zaXRpb24gKyBpOwotICAgICAgICAgICAgRSBpdGVtID0gYWRhcHRlci5nZXRJdGVtKHBvc2l0aW9uKTsKLSAgICAgICAgICAgIFZpZXcgdmlldyA9IGxpc3RWaWV3LmdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBpdGVtQm91bmRNYXAucHV0KGl0ZW0sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBSZWN0KHZpZXcuZ2V0TGVmdCgpLCB2aWV3LmdldFRvcCgpLCB2aWV3LmdldFJpZ2h0KCksIHZpZXcuZ2V0Qm90dG9tKCkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXRlbUJvdW5kTWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyBhbiBpdGVtLUJpdG1hcERyYXdhYmxlIG1hcCB3aGljaCBzdG9yZXMgc25hcHNob3RzCi0gICAgICogb2YgbWVtYmVyIGl0ZW1zIGluIHRoZSBnaXZlbiBMaXN0Vmlldy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0IEEgY29udGV4dAotICAgICAqIEBwYXJhbSBsaXN0VmlldyBBIGxpc3QgdmlldwotICAgICAqIEBwYXJhbSBhZGFwdGVyIEFuIGFycmF5IGFkYXB0ZXIgd2hpY2ggY29udGFpbnMgYW4gYXJyYXkgb2YgaXRlbXMuCi0gICAgICogQHJldHVybiBBIG1hcCBvZiBpdGVtcyBhbmQgc25hcHNob3RzIG9mIHRoZWlyIHZpZXdzIGluIHRoZSBnaXZlbiBsaXN0IHZpZXcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8RT4gSGFzaE1hcDxFLCBCaXRtYXBEcmF3YWJsZT4gZ2V0SXRlbUJpdG1hcE1hcChDb250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICBMaXN0VmlldyBsaXN0VmlldywgQXJyYXlBZGFwdGVyPEU+IGFkYXB0ZXIpIHsKLSAgICAgICAgSGFzaE1hcDxFLCBCaXRtYXBEcmF3YWJsZT4gaXRlbUJpdG1hcE1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgaW50IGZpcnN0VmlzaWJsZVBvc2l0aW9uID0gbGlzdFZpZXcuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Vmlldy5nZXRDaGlsZENvdW50KCk7ICsraSkgewotICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gZmlyc3RWaXNpYmxlUG9zaXRpb24gKyBpOwotICAgICAgICAgICAgRSBpdGVtID0gYWRhcHRlci5nZXRJdGVtKHBvc2l0aW9uKTsKLSAgICAgICAgICAgIFZpZXcgdmlldyA9IGxpc3RWaWV3LmdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBpdGVtQml0bWFwTWFwLnB1dChpdGVtLCBnZXRWaWV3Qml0bWFwKGNvbnRleHQsIHZpZXcpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXRlbUJpdG1hcE1hcDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBCaXRtYXBEcmF3YWJsZSBnZXRWaWV3Qml0bWFwKENvbnRleHQgY29udGV4dCwgVmlldyB2aWV3KSB7Ci0gICAgICAgIEJpdG1hcCBiaXRtYXAgPSBCaXRtYXAuY3JlYXRlQml0bWFwKHZpZXcuZ2V0V2lkdGgoKSwgdmlldy5nZXRIZWlnaHQoKSwKLSAgICAgICAgICAgICAgICBCaXRtYXAuQ29uZmlnLkFSR0JfODg4OCk7Ci0gICAgICAgIENhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKGJpdG1hcCk7Ci0gICAgICAgIHZpZXcuZHJhdyhjYW52YXMpOwotICAgICAgICByZXR1cm4gbmV3IEJpdG1hcERyYXdhYmxlKGNvbnRleHQuZ2V0UmVzb3VyY2VzKCksIGJpdG1hcCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZWUxMTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmFwcC5GcmFnbWVudDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7Ci0KLS8qKgotICogTWVkaWEgcm91dGUgZGlzY292ZXJ5IGZyYWdtZW50LgotICogPHA+Ci0gKiBUaGlzIGZyYWdtZW50IHRha2VzIGNhcmUgb2YgcmVnaXN0ZXJpbmcgYSBjYWxsYmFjayBmb3IgbWVkaWEgcm91dGUgZGlzY292ZXJ5Ci0gKiBkdXJpbmcgdGhlIHtAbGluayBGcmFnbWVudCNvblN0YXJ0IG9uU3RhcnQoKX0gcGhhc2UKLSAqIGFuZCByZW1vdmluZyBpdCBkdXJpbmcgdGhlIHtAbGluayBGcmFnbWVudCNvblN0b3Agb25TdG9wKCl9IHBoYXNlLgotICogPC9wPjxwPgotICogVGhlIGFwcGxpY2F0aW9uIG11c3Qgc3VwcGx5IGEgcm91dGUgc2VsZWN0b3IgdG8gc3BlY2lmeSB0aGUga2luZHMgb2Ygcm91dGVzCi0gKiB0byBkaXNjb3Zlci4gIFRoZSBhcHBsaWNhdGlvbiBtYXkgYWxzbyBvdmVycmlkZSB7QGxpbmsgI29uQ3JlYXRlQ2FsbGJhY2t9IHRvCi0gKiBwcm92aWRlIHRoZSB7QGxpbmsgTWVkaWFSb3V0ZXJ9IGNhbGxiYWNrIHRvIHJlZ2lzdGVyLgotICogPC9wPjxwPgotICogTm90ZSB0aGF0IHRoZSBkaXNjb3ZlcnkgY2FsbGJhY2sgbWFrZXMgdGhlIGFwcGxpY2F0aW9uIGJlIGNvbm5lY3RlZCB3aXRoIGFsbCB0aGUKLSAqIHtAbGluayBhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZSBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlc30KLSAqIHdoaWxlIGl0IGlzIHJlZ2lzdGVyZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfU0VMRUNUT1IgPSAic2VsZWN0b3IiOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlciBtUm91dGVyOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvcjsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVyLkNhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGVyIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlciBnZXRNZWRpYVJvdXRlcigpIHsKLSAgICAgICAgZW5zdXJlUm91dGVyKCk7Ci0gICAgICAgIHJldHVybiBtUm91dGVyOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbnN1cmVSb3V0ZXIoKSB7Ci0gICAgICAgIGlmIChtUm91dGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Sb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShnZXRDb250ZXh0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRvIGJlIGRpc2NvdmVyZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzZWxlY3RvciwgbmV2ZXIgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGdldFJvdXRlU2VsZWN0b3IoKSB7Ci0gICAgICAgIGVuc3VyZVJvdXRlU2VsZWN0b3IoKTsKLSAgICAgICAgcmV0dXJuIG1TZWxlY3RvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdG8gYmUgZGlzY292ZXJlZC4KLSAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhlIGZyYWdtZW50IGlzIGFkZGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBzZWxlY3RvciB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um91dGVTZWxlY3RvcihNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGVuc3VyZVJvdXRlU2VsZWN0b3IoKTsKLSAgICAgICAgaWYgKCFtU2VsZWN0b3IuZXF1YWxzKHNlbGVjdG9yKSkgewotICAgICAgICAgICAgbVNlbGVjdG9yID0gc2VsZWN0b3I7Ci0KLSAgICAgICAgICAgIEJ1bmRsZSBhcmdzID0gZ2V0QXJndW1lbnRzKCk7Ci0gICAgICAgICAgICBpZiAoYXJncyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXJncyA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFyZ3MucHV0QnVuZGxlKEFSR1VNRU5UX1NFTEVDVE9SLCBzZWxlY3Rvci5hc0J1bmRsZSgpKTsKLSAgICAgICAgICAgIHNldEFyZ3VtZW50cyhhcmdzKTsKLQotICAgICAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICAgICAgICAgICAgICAgIG1Sb3V0ZXIuYWRkQ2FsbGJhY2sobVNlbGVjdG9yLCBtQ2FsbGJhY2ssIG9uUHJlcGFyZUNhbGxiYWNrRmxhZ3MoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5zdXJlUm91dGVTZWxlY3RvcigpIHsKLSAgICAgICAgaWYgKG1TZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBCdW5kbGUgYXJncyA9IGdldEFyZ3VtZW50cygpOwotICAgICAgICAgICAgaWYgKGFyZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5mcm9tQnVuZGxlKGFyZ3MuZ2V0QnVuZGxlKEFSR1VNRU5UX1NFTEVDVE9SKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgdG8gY3JlYXRlIHRoZSB7QGxpbmsgYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLk1lZGlhUm91dGVyLkNhbGxiYWNrIGNhbGxiYWNrfQotICAgICAqIHRoYXQgd2lsbCBiZSByZWdpc3RlcmVkLgotICAgICAqIDxwPgotICAgICAqIFRoZSBkZWZhdWx0IGNhbGxiYWNrIGRvZXMgbm90aGluZy4gIFRoZSBhcHBsaWNhdGlvbiBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8KLSAgICAgKiBzdXBwbHkgaXRzIG93biBjYWxsYmFjay4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgY2FsbGJhY2ssIG9yIG51bGwgaWYgbm8gY2FsbGJhY2sgc2hvdWxkIGJlIHJlZ2lzdGVyZWQuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVyLkNhbGxiYWNrIG9uQ3JlYXRlQ2FsbGJhY2soKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZXIuQ2FsbGJhY2soKSB7IH07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHRvIHByZXBhcmUgdGhlIGNhbGxiYWNrIGZsYWdzIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4gdGhlCi0gICAgICoge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5NZWRpYVJvdXRlci5DYWxsYmFjayBjYWxsYmFja30gaXMgcmVnaXN0ZXJlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHtAbGluayBNZWRpYVJvdXRlciNDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBkZXNpcmVkIGNhbGxiYWNrIGZsYWdzLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgb25QcmVwYXJlQ2FsbGJhY2tGbGFncygpIHsKLSAgICAgICAgcmV0dXJuIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKLSAgICAgICAgc3VwZXIub25TdGFydCgpOwotCi0gICAgICAgIGVuc3VyZVJvdXRlU2VsZWN0b3IoKTsKLSAgICAgICAgZW5zdXJlUm91dGVyKCk7Ci0gICAgICAgIG1DYWxsYmFjayA9IG9uQ3JlYXRlQ2FsbGJhY2soKTsKLSAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUm91dGVyLmFkZENhbGxiYWNrKG1TZWxlY3RvciwgbUNhbGxiYWNrLCBvblByZXBhcmVDYWxsYmFja0ZsYWdzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdG9wKCkgewotICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Sb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAgICAgICAgICAgIG1DYWxsYmFjayA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBzdXBlci5vblN0b3AoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbi5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEwYTk1YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZkNvbG9yRmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQW5pbWF0aW9uRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmNvbnRlbnQuQ29udGV4dENvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlQnV0dG9uOwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLQotLyoqCi0gKiBDaGV2cm9uL0NhcmV0IGJ1dHRvbiB0byBleHBhbmQvY29sbGFwc2UgZ3JvdXAgdm9sdW1lIGxpc3Qgd2l0aCBhbmltYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24gZXh0ZW5kcyBJbWFnZUJ1dHRvbiB7Ci0gICAgZmluYWwgQW5pbWF0aW9uRHJhd2FibGUgbUV4cGFuZEFuaW1hdGlvbkRyYXdhYmxlOwotICAgIGZpbmFsIEFuaW1hdGlvbkRyYXdhYmxlIG1Db2xsYXBzZUFuaW1hdGlvbkRyYXdhYmxlOwotICAgIGZpbmFsIFN0cmluZyBtRXhwYW5kR3JvdXBEZXNjcmlwdGlvbjsKLSAgICBmaW5hbCBTdHJpbmcgbUNvbGxhcHNlR3JvdXBEZXNjcmlwdGlvbjsKLSAgICBib29sZWFuIG1Jc0dyb3VwRXhwYW5kZWQ7Ci0gICAgT25DbGlja0xpc3RlbmVyIG1MaXN0ZW5lcjsKLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24oQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIpOwotICAgICAgICBtRXhwYW5kQW5pbWF0aW9uRHJhd2FibGUgPSAoQW5pbWF0aW9uRHJhd2FibGUpCi0gICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5nZXREcmF3YWJsZShSLmRyYXdhYmxlLm1yX2dyb3VwX2V4cGFuZCk7Ci0gICAgICAgIG1Db2xsYXBzZUFuaW1hdGlvbkRyYXdhYmxlID0gKEFuaW1hdGlvbkRyYXdhYmxlKQotICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5tcl9ncm91cF9jb2xsYXBzZSk7Ci0KLSAgICAgICAgQ29sb3JGaWx0ZXIgZmlsdGVyID0gbmV3IFBvcnRlckR1ZmZDb2xvckZpbHRlcigKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldENvbnRyb2xsZXJDb2xvcihjb250ZXh0LCBkZWZTdHlsZUF0dHIpLAotICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5TUkNfSU4pOwotICAgICAgICBtRXhwYW5kQW5pbWF0aW9uRHJhd2FibGUuc2V0Q29sb3JGaWx0ZXIoZmlsdGVyKTsKLSAgICAgICAgbUNvbGxhcHNlQW5pbWF0aW9uRHJhd2FibGUuc2V0Q29sb3JGaWx0ZXIoZmlsdGVyKTsKLQotICAgICAgICBtRXhwYW5kR3JvdXBEZXNjcmlwdGlvbiA9Ci0gICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5nZXRTdHJpbmcoUi5zdHJpbmcubXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXApOwotICAgICAgICBtQ29sbGFwc2VHcm91cERlc2NyaXB0aW9uID0KLSAgICAgICAgICAgICAgICBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLmdldFN0cmluZyhSLnN0cmluZy5tcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwKTsKLQotICAgICAgICBzZXRJbWFnZURyYXdhYmxlKG1FeHBhbmRBbmltYXRpb25EcmF3YWJsZS5nZXRGcmFtZSgwKSk7Ci0gICAgICAgIHNldENvbnRlbnREZXNjcmlwdGlvbihtRXhwYW5kR3JvdXBEZXNjcmlwdGlvbik7Ci0KLSAgICAgICAgc3VwZXIuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2aWV3KSB7Ci0gICAgICAgICAgICAgICAgbUlzR3JvdXBFeHBhbmRlZCA9ICFtSXNHcm91cEV4cGFuZGVkOwotICAgICAgICAgICAgICAgIGlmIChtSXNHcm91cEV4cGFuZGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldEltYWdlRHJhd2FibGUobUV4cGFuZEFuaW1hdGlvbkRyYXdhYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgbUV4cGFuZEFuaW1hdGlvbkRyYXdhYmxlLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHNldENvbnRlbnREZXNjcmlwdGlvbihtQ29sbGFwc2VHcm91cERlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzZXRJbWFnZURyYXdhYmxlKG1Db2xsYXBzZUFuaW1hdGlvbkRyYXdhYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbGxhcHNlQW5pbWF0aW9uRHJhd2FibGUuc3RhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0Q29udGVudERlc2NyaXB0aW9uKG1FeHBhbmRHcm91cERlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lci5vbkNsaWNrKHZpZXcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0T25DbGlja0xpc3RlbmVyKE9uQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVWb2x1bWVTbGlkZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZVZvbHVtZVNsaWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDVkMjBlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZVZvbHVtZVNsaWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyOwotCi0vKioKLSAqIFZvbHVtZSBzbGlkZXIgd2l0aCBzaG93aW5nLCBoaWRpbmcsIGFuZCBhcHBseWluZyBhbHBoYSBzdXBwb3J0cyB0byB0aGUgdGh1bWIuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlVm9sdW1lU2xpZGVyIGV4dGVuZHMgU2Vla0JhciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlVm9sdW1lU2xpZGVyIjsKLQotICAgIHByaXZhdGUgZmluYWwgZmxvYXQgbURpc2FibGVkQWxwaGE7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbUhpZGVUaHVtYjsKLSAgICBwcml2YXRlIERyYXdhYmxlIG1UaHVtYjsKLSAgICBwcml2YXRlIGludCBtQ29sb3I7Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgIG1EaXNhYmxlZEFscGhhID0gTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXREaXNhYmxlZEFscGhhKGNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlVm9sdW1lU2xpZGVyKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIpOwotICAgICAgICBtRGlzYWJsZWRBbHBoYSA9IE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0RGlzYWJsZWRBbHBoYShjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBkcmF3YWJsZVN0YXRlQ2hhbmdlZCgpIHsKLSAgICAgICAgc3VwZXIuZHJhd2FibGVTdGF0ZUNoYW5nZWQoKTsKLSAgICAgICAgaW50IGFscGhhID0gaXNFbmFibGVkKCkgPyAweEZGIDogKGludCkgKDB4RkYgKiBtRGlzYWJsZWRBbHBoYSk7Ci0KLSAgICAgICAgLy8gVGhlIHRodW1iIGRyYXdhYmxlIGlzIGEgY29sbGVjdGlvbiBvZiBkcmF3YWJsZXMgYW5kIGl0cyBjdXJyZW50IGRyYXdhYmxlcyBhcmUgY2hhbmdlZCBwZXIKLSAgICAgICAgLy8gc3RhdGUuIEFwcGx5IHRoZSBjb2xvciBmaWx0ZXIgYW5kIGFscGhhIG9uIGV2ZXJ5IHN0YXRlIGNoYW5nZS4KLSAgICAgICAgaWYgKG1UaHVtYiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVGh1bWIuc2V0Q29sb3JGaWx0ZXIobUNvbG9yLCBQb3J0ZXJEdWZmLk1vZGUuU1JDX0lOKTsKLSAgICAgICAgICAgIG1UaHVtYi5zZXRBbHBoYShhbHBoYSk7Ci0gICAgICAgIH0KLQotICAgICAgICBnZXRQcm9ncmVzc0RyYXdhYmxlKCkuc2V0Q29sb3JGaWx0ZXIobUNvbG9yLCBQb3J0ZXJEdWZmLk1vZGUuU1JDX0lOKTsKLSAgICAgICAgZ2V0UHJvZ3Jlc3NEcmF3YWJsZSgpLnNldEFscGhhKGFscGhhKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRUaHVtYihEcmF3YWJsZSB0aHVtYikgewotICAgICAgICBtVGh1bWIgPSB0aHVtYjsKLSAgICAgICAgc3VwZXIuc2V0VGh1bWIobUhpZGVUaHVtYiA/IG51bGwgOiBtVGh1bWIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB0byBzaG93IG9yIGhpZGUgdGh1bWIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SGlkZVRodW1iKGJvb2xlYW4gaGlkZVRodW1iKSB7Ci0gICAgICAgIGlmIChtSGlkZVRodW1iID09IGhpZGVUaHVtYikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1IaWRlVGh1bWIgPSBoaWRlVGh1bWI7Ci0gICAgICAgIHN1cGVyLnNldFRodW1iKG1IaWRlVGh1bWIgPyBudWxsIDogbVRodW1iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2b2x1bWUgc2xpZGVyIGNvbG9yLiBUaGUgY2hhbmdlIHRha2VzIGVmZmVjdCBuZXh0IHRpbWUgZHJhd2FibGUgc3RhdGUgaXMgY2hhbmdlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgY29sb3IgY2Fubm90IGJlIHRyYW5zbHVjZW50LCBvdGhlcndpc2UgdGhlIHVuZGVybHlpbmcgcHJvZ3Jlc3MgYmFyIHdpbGwgYmUgc2VlbiB0aHJvdWdoCi0gICAgICogdGhlIHRodW1iLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb2xvcihpbnQgY29sb3IpIHsKLSAgICAgICAgaWYgKG1Db2xvciA9PSBjb2xvcikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChDb2xvci5hbHBoYShjb2xvcikgIT0gMHhGRikgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiVm9sdW1lIHNsaWRlciBjb2xvciBjYW5ub3QgYmUgdHJhbnNsdWNlbnQ6ICMiICsgSW50ZWdlci50b0hleFN0cmluZyhjb2xvcikpOwotICAgICAgICB9Ci0gICAgICAgIG1Db2xvciA9IGNvbG9yOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlclRoZW1lSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZjA0MmYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlclRoZW1lSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLkludERlZjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuZ3JhcGhpY3MuQ29sb3JVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKLQotZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgTUlOX0NPTlRSQVNUID0gMy4wZjsKLQotICAgIEBJbnREZWYoe0NPTE9SX0RBUktfT05fTElHSFRfQkFDS0dST1VORCwgQ09MT1JfV0hJVEVfT05fREFSS19CQUNLR1JPVU5EfSkKLSAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi0gICAgcHJpdmF0ZSBAaW50ZXJmYWNlIENvbnRyb2xsZXJDb2xvclR5cGUge30KLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfREFSS19PTl9MSUdIVF9CQUNLR1JPVU5EID0gMHhERTAwMDAwMDsgLyogT3BhY2l0eSBvZiA4NyUgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX1dISVRFX09OX0RBUktfQkFDS0dST1VORCA9IENvbG9yLldISVRFOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlclRoZW1lSGVscGVyKCkgewotICAgIH0KLQotICAgIHN0YXRpYyBDb250ZXh0IGNyZWF0ZVRoZW1lZEJ1dHRvbkNvbnRleHQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIC8vIEFwcGx5IGJhc2UgTWVkaWEgUm91dGVyIHRoZW1lLgotICAgICAgICBjb250ZXh0ID0gbmV3IENvbnRleHRUaGVtZVdyYXBwZXIoY29udGV4dCwgZ2V0Um91dGVyVGhlbWVJZChjb250ZXh0KSk7Ci0KLSAgICAgICAgLy8gQXBwbHkgY3VzdG9tIE1lZGlhIFJvdXRlciB0aGVtZS4KLSAgICAgICAgaW50IHN0eWxlID0gZ2V0VGhlbWVSZXNvdXJjZShjb250ZXh0LCBSLmF0dHIubWVkaWFSb3V0ZVRoZW1lKTsKLSAgICAgICAgaWYgKHN0eWxlICE9IDApIHsKLSAgICAgICAgICAgIGNvbnRleHQgPSBuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihjb250ZXh0LCBzdHlsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29udGV4dDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFRoZSBmb2xsb3dpbmcgdHdvIG1ldGhvZHMgYXJlIHRvIGJlIHVzZWQgaW4gY29uanVuY3Rpb24uIFRoZXkgc2hvdWxkIGJlIHVzZWQgdG8gcHJlcGFyZQotICAgICAqIHRoZSBjb250ZXh0IGFuZCB0aGVtZSBmb3IgYSBzdXBlciBjbGFzcyBjb25zdHJ1Y3RvciAodGhlIGxhdHRlciBtZXRob2QgcmVsaWVzIG9uIHRoZQotICAgICAqIGZvcm1lciBtZXRob2QgdG8gcHJvcGVybHkgcHJlcGFyZSB0aGUgY29udGV4dCk6Ci0gICAgICogICBzdXBlcihjb250ZXh0ID0gY3JlYXRlVGhlbWVkRGlhbG9nQ29udGV4dChjb250ZXh0LCB0aGVtZSksCi0gICAgICogICAgICAgICAgIGNyZWF0ZVRoZW1lZERpYWxvZ1N0eWxlKGNvbnRleHQpKTsKLSAgICAgKgotICAgICAqIEl0IHdpbGwgYXBwbHkgdGhlbWUgaW4gdGhlIGZvbGxvd2luZyBvcmRlciAoc3R5bGUgbG9va3VwcyB3aWxsIGJlIGRvbmUgaW4gcmV2ZXJzZSk6Ci0gICAgICogICAxKSBDdXJyZW50IHRoZW1lCi0gICAgICogICAyKSBTdXBwbGllZCB0aGVtZQotICAgICAqICAgMykgQmFzZSBNZWRpYSBSb3V0ZXIgdGhlbWUKLSAgICAgKiAgIDQpIEN1c3RvbSBNZWRpYSBSb3V0ZXIgdGhlbWUsIGlmIHByb3ZpZGVkCi0gICAgICovCi0gICAgc3RhdGljIENvbnRleHQgY3JlYXRlVGhlbWVkRGlhbG9nQ29udGV4dChDb250ZXh0IGNvbnRleHQsIGludCB0aGVtZSwgYm9vbGVhbiBhbGVydERpYWxvZykgewotICAgICAgICAvLyAxKSBDdXJyZW50IHRoZW1lIGlzIGFscmVhZHkgYXBwbGllZCB0byB0aGUgY29udGV4dAotCi0gICAgICAgIC8vIDIpIElmIG5vIHRoZW1lIGlzIHN1cHBsaWVkLCBsb29rIGl0IHVwIGZyb20gdGhlIGNvbnRleHQgKGRpYWxvZ1RoZW1lL2FsZXJ0RGlhbG9nVGhlbWUpCi0gICAgICAgIGlmICh0aGVtZSA9PSAwKSB7Ci0gICAgICAgICAgICB0aGVtZSA9IGdldFRoZW1lUmVzb3VyY2UoY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgIWFsZXJ0RGlhbG9nID8gYW5kcm9pZC5SLmF0dHIuZGlhbG9nVGhlbWUgOiBhbmRyb2lkLlIuYXR0ci5hbGVydERpYWxvZ1RoZW1lKTsKLSAgICAgICAgfQotICAgICAgICAvLyAgICBBcHBseSBpdAotICAgICAgICBjb250ZXh0ID0gbmV3IENvbnRleHRUaGVtZVdyYXBwZXIoY29udGV4dCwgdGhlbWUpOwotCi0gICAgICAgIC8vIDMpIElmIGEgY3VzdG9tIE1lZGlhIFJvdXRlciB0aGVtZSBpcyBwcm92aWRlZCB0aGVuIGFwcGx5IHRoZSBiYXNlIHRoZW1lCi0gICAgICAgIGlmIChnZXRUaGVtZVJlc291cmNlKGNvbnRleHQsIFIuYXR0ci5tZWRpYVJvdXRlVGhlbWUpICE9IDApIHsKLSAgICAgICAgICAgIGNvbnRleHQgPSBuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihjb250ZXh0LCBnZXRSb3V0ZXJUaGVtZUlkKGNvbnRleHQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb250ZXh0OwotICAgIH0KLSAgICAvLyBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBwcmV2aW91cyBtZXRob2QuCi0gICAgc3RhdGljIGludCBjcmVhdGVUaGVtZWREaWFsb2dTdHlsZShDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgLy8gNCkgQXBwbHkgdGhlIGN1c3RvbSBNZWRpYSBSb3V0ZXIgdGhlbWUKLSAgICAgICAgaW50IHRoZW1lID0gZ2V0VGhlbWVSZXNvdXJjZShjb250ZXh0LCBSLmF0dHIubWVkaWFSb3V0ZVRoZW1lKTsKLSAgICAgICAgaWYgKHRoZW1lID09IDApIHsKLSAgICAgICAgICAgIC8vIDMpIE5vIGN1c3RvbSBNZWRpYVJvdXRlciB0aGVtZSB3YXMgcHJvdmlkZWQgc28gYXBwbHkgdGhlIGJhc2UgdGhlbWUgaW5zdGVhZAotICAgICAgICAgICAgdGhlbWUgPSBnZXRSb3V0ZXJUaGVtZUlkKGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoZW1lOwotICAgIH0KLSAgICAvLyBFTkQuIFByZXZpb3VzIHR3byBtZXRob2RzIHNob3VsZCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uLgotCi0gICAgc3RhdGljIGludCBnZXRUaGVtZVJlc291cmNlKENvbnRleHQgY29udGV4dCwgaW50IGF0dHIpIHsKLSAgICAgICAgVHlwZWRWYWx1ZSB2YWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LmdldFRoZW1lKCkucmVzb2x2ZUF0dHJpYnV0ZShhdHRyLCB2YWx1ZSwgdHJ1ZSkgPyB2YWx1ZS5yZXNvdXJjZUlkIDogMDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgZmxvYXQgZ2V0RGlzYWJsZWRBbHBoYShDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgVHlwZWRWYWx1ZSB2YWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LmdldFRoZW1lKCkucmVzb2x2ZUF0dHJpYnV0ZShhbmRyb2lkLlIuYXR0ci5kaXNhYmxlZEFscGhhLCB2YWx1ZSwgdHJ1ZSkKLSAgICAgICAgICAgICAgICA/IHZhbHVlLmdldEZsb2F0KCkgOiAwLjVmOwotICAgIH0KLQotICAgIHN0YXRpYyBAQ29udHJvbGxlckNvbG9yVHlwZSBpbnQgZ2V0Q29udHJvbGxlckNvbG9yKENvbnRleHQgY29udGV4dCwgaW50IHN0eWxlKSB7Ci0gICAgICAgIGludCBwcmltYXJ5Q29sb3IgPSBnZXRUaGVtZUNvbG9yKGNvbnRleHQsIHN0eWxlLCBhbmRyb2lkLlIuYXR0ci5jb2xvclByaW1hcnkpOwotICAgICAgICBpZiAocHJpbWFyeUNvbG9yID09IDApIHsKLSAgICAgICAgICAgIHByaW1hcnlDb2xvciA9IGdldFRoZW1lQ29sb3IoY29udGV4dCwgc3R5bGUsIGFuZHJvaWQuUi5hdHRyLmNvbG9yUHJpbWFyeSk7Ci0gICAgICAgICAgICBpZiAocHJpbWFyeUNvbG9yID09IDApIHsKLSAgICAgICAgICAgICAgICBwcmltYXJ5Q29sb3IgPSAweEZGMDAwMDAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChDb2xvclV0aWxzLmNhbGN1bGF0ZUNvbnRyYXN0KENPTE9SX1dISVRFX09OX0RBUktfQkFDS0dST1VORCwgcHJpbWFyeUNvbG9yKQotICAgICAgICAgICAgICAgID49IE1JTl9DT05UUkFTVCkgewotICAgICAgICAgICAgcmV0dXJuIENPTE9SX1dISVRFX09OX0RBUktfQkFDS0dST1VORDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQ09MT1JfREFSS19PTl9MSUdIVF9CQUNLR1JPVU5EOwotICAgIH0KLQotICAgIHN0YXRpYyBpbnQgZ2V0QnV0dG9uVGV4dENvbG9yKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBpbnQgcHJpbWFyeUNvbG9yID0gZ2V0VGhlbWVDb2xvcihjb250ZXh0LCAwLCBhbmRyb2lkLlIuYXR0ci5jb2xvclByaW1hcnkpOwotICAgICAgICBpbnQgYmFja2dyb3VuZENvbG9yID0gZ2V0VGhlbWVDb2xvcihjb250ZXh0LCAwLCBhbmRyb2lkLlIuYXR0ci5jb2xvckJhY2tncm91bmQpOwotCi0gICAgICAgIGlmIChDb2xvclV0aWxzLmNhbGN1bGF0ZUNvbnRyYXN0KHByaW1hcnlDb2xvciwgYmFja2dyb3VuZENvbG9yKSA8IE1JTl9DT05UUkFTVCkgewotICAgICAgICAgICAgLy8gRGVmYXVsdCB0byBjb2xvckFjY2VudCBpZiB0aGUgY29udHJhc3QgcmF0aW8gaXMgbG93LgotICAgICAgICAgICAgcmV0dXJuIGdldFRoZW1lQ29sb3IoY29udGV4dCwgMCwgYW5kcm9pZC5SLmF0dHIuY29sb3JBY2NlbnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcmltYXJ5Q29sb3I7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgc2V0TWVkaWFDb250cm9sc0JhY2tncm91bmRDb2xvcigKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgVmlldyBtYWluQ29udHJvbHMsIFZpZXcgZ3JvdXBDb250cm9scywgYm9vbGVhbiBoYXNHcm91cCkgewotICAgICAgICBpbnQgcHJpbWFyeUNvbG9yID0gZ2V0VGhlbWVDb2xvcihjb250ZXh0LCAwLCBhbmRyb2lkLlIuYXR0ci5jb2xvclByaW1hcnkpOwotICAgICAgICBpbnQgcHJpbWFyeURhcmtDb2xvciA9IGdldFRoZW1lQ29sb3IoY29udGV4dCwgMCwgYW5kcm9pZC5SLmF0dHIuY29sb3JQcmltYXJ5RGFyayk7Ci0gICAgICAgIGlmIChoYXNHcm91cCAmJiBnZXRDb250cm9sbGVyQ29sb3IoY29udGV4dCwgMCkgPT0gQ09MT1JfREFSS19PTl9MSUdIVF9CQUNLR1JPVU5EKSB7Ci0gICAgICAgICAgICAvLyBJbnN0ZWFkIG9mIHNob3dpbmcgZGFyayBjb250cm9scyBpbiBhIHBvc3NpYmx5IGRhcmsgKGkuZS4gdGhlIHByaW1hcnkgZGFyayksIG1vZGVsCi0gICAgICAgICAgICAvLyB0aGUgd2hpdGUgZGlhbG9nIGFuZCB1c2UgdGhlIHByaW1hcnkgY29sb3IgZm9yIHRoZSBncm91cCBjb250cm9scy4KLSAgICAgICAgICAgIHByaW1hcnlEYXJrQ29sb3IgPSBwcmltYXJ5Q29sb3I7Ci0gICAgICAgICAgICBwcmltYXJ5Q29sb3IgPSBDb2xvci5XSElURTsKLSAgICAgICAgfQotICAgICAgICBtYWluQ29udHJvbHMuc2V0QmFja2dyb3VuZENvbG9yKHByaW1hcnlDb2xvcik7Ci0gICAgICAgIGdyb3VwQ29udHJvbHMuc2V0QmFja2dyb3VuZENvbG9yKHByaW1hcnlEYXJrQ29sb3IpOwotICAgICAgICAvLyBBbHNvIHN0b3JlIHRoZSBiYWNrZ3JvdW5kIGNvbG9ycyB0byB0aGUgdmlldyB0YWdzLiBUaGV5IGFyZSB1c2VkIGluCi0gICAgICAgIC8vIHNldFZvbHVtZVNsaWRlckNvbG9yKCkgYmVsb3cuCi0gICAgICAgIG1haW5Db250cm9scy5zZXRUYWcocHJpbWFyeUNvbG9yKTsKLSAgICAgICAgZ3JvdXBDb250cm9scy5zZXRUYWcocHJpbWFyeURhcmtDb2xvcik7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgc2V0Vm9sdW1lU2xpZGVyQ29sb3IoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIE1lZGlhUm91dGVWb2x1bWVTbGlkZXIgdm9sdW1lU2xpZGVyLCBWaWV3IGJhY2tncm91bmRWaWV3KSB7Ci0gICAgICAgIGludCBjb250cm9sbGVyQ29sb3IgPSBnZXRDb250cm9sbGVyQ29sb3IoY29udGV4dCwgMCk7Ci0gICAgICAgIGlmIChDb2xvci5hbHBoYShjb250cm9sbGVyQ29sb3IpICE9IDB4RkYpIHsKLSAgICAgICAgICAgIC8vIENvbXBvc2l0ZSB3aXRoIHRoZSBiYWNrZ3JvdW5kIGluIG9yZGVyIG5vdCB0byBzaG93IHRoZSB1bmRlcmx5aW5nIHByb2dyZXNzIGJhcgotICAgICAgICAgICAgLy8gdGhyb3VnaCB0aGUgdGh1bWIuCi0gICAgICAgICAgICBpbnQgYmFja2dyb3VuZENvbG9yID0gKGludCkgYmFja2dyb3VuZFZpZXcuZ2V0VGFnKCk7Ci0gICAgICAgICAgICBjb250cm9sbGVyQ29sb3IgPSBDb2xvclV0aWxzLmNvbXBvc2l0ZUNvbG9ycyhjb250cm9sbGVyQ29sb3IsIGJhY2tncm91bmRDb2xvcik7Ci0gICAgICAgIH0KLSAgICAgICAgdm9sdW1lU2xpZGVyLnNldENvbG9yKGNvbnRyb2xsZXJDb2xvcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xpZ2h0VGhlbWUoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFR5cGVkVmFsdWUgdmFsdWUgPSBuZXcgVHlwZWRWYWx1ZSgpOwotICAgICAgICAvLyBUT0RPKHN1bmdzb28pOiBTd2l0Y2ggdG8gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmlzTGlnaHRUaGVtZQotICAgICAgICByZXR1cm4gY29udGV4dC5nZXRUaGVtZSgpLnJlc29sdmVBdHRyaWJ1dGUoYW5kcm9pZC5zdXBwb3J0LnY3LmFwcGNvbXBhdC5SLmF0dHIuaXNMaWdodFRoZW1lLAotICAgICAgICAgICAgICAgIHZhbHVlLCB0cnVlKSAmJiB2YWx1ZS5kYXRhICE9IDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldFRoZW1lQ29sb3IoQ29udGV4dCBjb250ZXh0LCBpbnQgc3R5bGUsIGludCBhdHRyKSB7Ci0gICAgICAgIGlmIChzdHlsZSAhPSAwKSB7Ci0gICAgICAgICAgICBpbnRbXSBhdHRycyA9IHsgYXR0ciB9OwotICAgICAgICAgICAgVHlwZWRBcnJheSB0YSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhzdHlsZSwgYXR0cnMpOwotICAgICAgICAgICAgaW50IGNvbG9yID0gdGEuZ2V0Q29sb3IoMCwgMCk7Ci0gICAgICAgICAgICB0YS5yZWN5Y2xlKCk7Ci0gICAgICAgICAgICBpZiAoY29sb3IgIT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjb2xvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBUeXBlZFZhbHVlIHZhbHVlID0gbmV3IFR5cGVkVmFsdWUoKTsKLSAgICAgICAgY29udGV4dC5nZXRUaGVtZSgpLnJlc29sdmVBdHRyaWJ1dGUoYXR0ciwgdmFsdWUsIHRydWUpOwotICAgICAgICBpZiAodmFsdWUucmVzb3VyY2VJZCAhPSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRDb2xvcih2YWx1ZS5yZXNvdXJjZUlkKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWUuZGF0YTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgaW50IGdldFJvdXRlclRoZW1lSWQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGludCB0aGVtZUlkOwotICAgICAgICBpZiAoaXNMaWdodFRoZW1lKGNvbnRleHQpKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0Q29udHJvbGxlckNvbG9yKGNvbnRleHQsIDApID09IENPTE9SX0RBUktfT05fTElHSFRfQkFDS0dST1VORCkgewotICAgICAgICAgICAgICAgIHRoZW1lSWQgPSBSLnN0eWxlLlRoZW1lX01lZGlhUm91dGVyX0xpZ2h0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aGVtZUlkID0gUi5zdHlsZS5UaGVtZV9NZWRpYVJvdXRlcl9MaWdodF9EYXJrQ29udHJvbFBhbmVsOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGdldENvbnRyb2xsZXJDb2xvcihjb250ZXh0LCAwKSA9PSBDT0xPUl9EQVJLX09OX0xJR0hUX0JBQ0tHUk9VTkQpIHsKLSAgICAgICAgICAgICAgICB0aGVtZUlkID0gUi5zdHlsZS5UaGVtZV9NZWRpYVJvdXRlcl9MaWdodENvbnRyb2xQYW5lbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhlbWVJZCA9IFIuc3R5bGUuVGhlbWVfTWVkaWFSb3V0ZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoZW1lSWQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9PdmVybGF5TGlzdFZpZXcuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvT3ZlcmxheUxpc3RWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMGRlZTIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9PdmVybGF5TGlzdFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEEgTGlzdFZpZXcgd2hpY2ggaGFzIGFuIGFkZGl0aW9uYWwgb3ZlcmxheSBsYXllci4ge0BsaW5rIEJpdG1hcERyYXdhYmxlfQotICogY2FuIGJlIGFkZGVkIHRvIHRoZSBsYXllciBhbmQgY2FuIGJlIGFuaW1hdGVkLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgT3ZlcmxheUxpc3RWaWV3IGV4dGVuZHMgTGlzdFZpZXcgewotICAgIHByaXZhdGUgZmluYWwgTGlzdDxPdmVybGF5T2JqZWN0PiBtT3ZlcmxheU9iamVjdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQotICAgIHB1YmxpYyBPdmVybGF5TGlzdFZpZXcoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBPdmVybGF5TGlzdFZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBPdmVybGF5TGlzdFZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0cik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhbiBvYmplY3QgdG8gdGhlIG92ZXJsYXkgbGF5ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqZWN0IEFuIG9iamVjdCB0byBiZSBhZGRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRPdmVybGF5T2JqZWN0KE92ZXJsYXlPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIG1PdmVybGF5T2JqZWN0cy5hZGQob2JqZWN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydHMgYWxsIGFuaW1hdGlvbnMgb2Ygb2JqZWN0cyBpbiB0aGUgb3ZlcmxheSBsYXllci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydEFuaW1hdGlvbkFsbCgpIHsKLSAgICAgICAgZm9yIChPdmVybGF5T2JqZWN0IG9iamVjdCA6IG1PdmVybGF5T2JqZWN0cykgewotICAgICAgICAgICAgaWYgKCFvYmplY3QuaXNBbmltYXRpb25TdGFydGVkKCkpIHsKLSAgICAgICAgICAgICAgICBvYmplY3Quc3RhcnRBbmltYXRpb24oZ2V0RHJhd2luZ1RpbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdG9wcyBhbGwgYW5pbWF0aW9ucyBvZiBvYmplY3RzIGluIHRoZSBvdmVybGF5IGxheWVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0b3BBbmltYXRpb25BbGwoKSB7Ci0gICAgICAgIGZvciAoT3ZlcmxheU9iamVjdCBvYmplY3QgOiBtT3ZlcmxheU9iamVjdHMpIHsKLSAgICAgICAgICAgIG9iamVjdC5zdG9wQW5pbWF0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgewotICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKLSAgICAgICAgaWYgKG1PdmVybGF5T2JqZWN0cy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBJdGVyYXRvcjxPdmVybGF5T2JqZWN0PiBpdCA9IG1PdmVybGF5T2JqZWN0cy5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE92ZXJsYXlPYmplY3Qgb2JqZWN0ID0gaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIEJpdG1hcERyYXdhYmxlIGJpdG1hcCA9IG9iamVjdC5nZXRCaXRtYXBEcmF3YWJsZSgpOwotICAgICAgICAgICAgICAgIGlmIChiaXRtYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBiaXRtYXAuZHJhdyhjYW52YXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIW9iamVjdC51cGRhdGUoZ2V0RHJhd2luZ1RpbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgYW4gb2JqZWN0IHRvIGJlIHNob3duIGluIHRoZSBvdmVybGF5IGxheWVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgT3ZlcmxheU9iamVjdCB7Ci0gICAgICAgIHByaXZhdGUgQml0bWFwRHJhd2FibGUgbUJpdG1hcDsKLSAgICAgICAgcHJpdmF0ZSBmbG9hdCBtQ3VycmVudEFscGhhID0gMS4wZjsKLSAgICAgICAgcHJpdmF0ZSBSZWN0IG1DdXJyZW50Qm91bmRzOwotICAgICAgICBwcml2YXRlIEludGVycG9sYXRvciBtSW50ZXJwb2xhdG9yOwotICAgICAgICBwcml2YXRlIGxvbmcgbUR1cmF0aW9uOwotICAgICAgICBwcml2YXRlIFJlY3QgbVN0YXJ0UmVjdDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbURlbHRhWTsKLSAgICAgICAgcHJpdmF0ZSBmbG9hdCBtU3RhcnRBbHBoYSA9IDEuMGY7Ci0gICAgICAgIHByaXZhdGUgZmxvYXQgbUVuZEFscGhhID0gMS4wZjsKLSAgICAgICAgcHJpdmF0ZSBsb25nIG1TdGFydFRpbWU7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtSXNBbmltYXRpb25TdGFydGVkOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUlzQW5pbWF0aW9uRW5kZWQ7Ci0gICAgICAgIHByaXZhdGUgT25BbmltYXRpb25FbmRMaXN0ZW5lciBtTGlzdGVuZXI7Ci0KLSAgICAgICAgcHVibGljIE92ZXJsYXlPYmplY3QoQml0bWFwRHJhd2FibGUgYml0bWFwLCBSZWN0IHN0YXJ0UmVjdCkgewotICAgICAgICAgICAgbUJpdG1hcCA9IGJpdG1hcDsKLSAgICAgICAgICAgIG1TdGFydFJlY3QgPSBzdGFydFJlY3Q7Ci0gICAgICAgICAgICBtQ3VycmVudEJvdW5kcyA9IG5ldyBSZWN0KHN0YXJ0UmVjdCk7Ci0gICAgICAgICAgICBpZiAobUJpdG1hcCAhPSBudWxsICYmIG1DdXJyZW50Qm91bmRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQml0bWFwLnNldEFscGhhKChpbnQpIChtQ3VycmVudEFscGhhICogMjU1KSk7Ci0gICAgICAgICAgICAgICAgbUJpdG1hcC5zZXRCb3VuZHMobUN1cnJlbnRCb3VuZHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIGJpdG1hcCB0aGF0IHRoaXMgb2JqZWN0IHJlcHJlc2VudHMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gQml0bWFwRHJhd2FibGUgdGhhdCB0aGlzIG9iamVjdCBoYXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQml0bWFwRHJhd2FibGUgZ2V0Qml0bWFwRHJhd2FibGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUJpdG1hcDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBzdGFydGVkIHN0YXR1cyBvZiB0aGUgYW5pbWF0aW9uLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGFuaW1hdGlvbiBoYXMgc3RhcnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBbmltYXRpb25TdGFydGVkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Jc0FuaW1hdGlvblN0YXJ0ZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyBhbmltYXRpb24gZm9yIHZhcnlpbmcgYWxwaGEuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBzdGFydEFscGhhIFN0YXJ0aW5nIGFscGhhIHZhbHVlIGZvciB0aGUgYW5pbWF0aW9uLCB3aGVyZSAxLjAgbWVhbnMKLSAgICAgICAgICogZnVsbHkgb3BhcXVlIGFuZCAwLjAgbWVhbnMgZnVsbHkgdHJhbnNwYXJlbnQuCi0gICAgICAgICAqIEBwYXJhbSBlbmRBbHBoYSBFbmRpbmcgYWxwaGEgdmFsdWUgZm9yIHRoZSBhbmltYXRpb24uCi0gICAgICAgICAqIEByZXR1cm4gVGhpcyBPdmVybGF5T2JqZWN0IHRvIGFsbG93IGZvciBjaGFpbmluZyBvZiBjYWxscy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBPdmVybGF5T2JqZWN0IHNldEFscGhhQW5pbWF0aW9uKGZsb2F0IHN0YXJ0QWxwaGEsIGZsb2F0IGVuZEFscGhhKSB7Ci0gICAgICAgICAgICBtU3RhcnRBbHBoYSA9IHN0YXJ0QWxwaGE7Ci0gICAgICAgICAgICBtRW5kQWxwaGEgPSBlbmRBbHBoYTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgYW5pbWF0aW9uIGZvciBtb3Zpbmcgb2JqZWN0cyB2ZXJ0aWNhbGx5LgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGVsdGFZIERpc3RhbmNlIHRvIG1vdmUgaW4gcGl4ZWxzLgotICAgICAgICAgKiBAcmV0dXJuIFRoaXMgT3ZlcmxheU9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5pbmcgb2YgY2FsbHMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT3ZlcmxheU9iamVjdCBzZXRUcmFuc2xhdGVZQW5pbWF0aW9uKGludCBkZWx0YVkpIHsKLSAgICAgICAgICAgIG1EZWx0YVkgPSBkZWx0YVk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIGhvdyBsb25nIHRoZSBhbmltYXRpb24gd2lsbCBsYXN0LgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZHVyYXRpb24gRHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzCi0gICAgICAgICAqIEByZXR1cm4gVGhpcyBPdmVybGF5T2JqZWN0IHRvIGFsbG93IGZvciBjaGFpbmluZyBvZiBjYWxscy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBPdmVybGF5T2JqZWN0IHNldER1cmF0aW9uKGxvbmcgZHVyYXRpb24pIHsKLSAgICAgICAgICAgIG1EdXJhdGlvbiA9IGR1cmF0aW9uOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgYWNjZWxlcmF0aW9uIGN1cnZlIGZvciB0aGlzIGFuaW1hdGlvbi4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGludGVycG9sYXRvciBUaGUgaW50ZXJwb2xhdG9yIHdoaWNoIGRlZmluZXMgdGhlIGFjY2VsZXJhdGlvbiBjdXJ2ZQotICAgICAgICAgKiBAcmV0dXJuIFRoaXMgT3ZlcmxheU9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5pbmcgb2YgY2FsbHMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT3ZlcmxheU9iamVjdCBzZXRJbnRlcnBvbGF0b3IoSW50ZXJwb2xhdG9yIGludGVycG9sYXRvcikgewotICAgICAgICAgICAgbUludGVycG9sYXRvciA9IGludGVycG9sYXRvcjsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEJpbmRzIGFuIGFuaW1hdGlvbiBlbmQgbGlzdGVuZXIgdG8gdGhlIGFuaW1hdGlvbi4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBhbmltYXRpb24gZW5kIGxpc3RlbmVyIHRvIGJlIG5vdGlmaWVkLgotICAgICAgICAgKiBAcmV0dXJuIFRoaXMgT3ZlcmxheU9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5pbmcgb2YgY2FsbHMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT3ZlcmxheU9iamVjdCBzZXRBbmltYXRpb25FbmRMaXN0ZW5lcihPbkFuaW1hdGlvbkVuZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFN0YXJ0cyB0aGUgYW5pbWF0aW9uIGFuZCBzZXRzIHRoZSBzdGFydCB0aW1lLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gc3RhcnRUaW1lIFN0YXJ0IHRpbWUgdG8gYmUgc2V0IGluIE1pbGxpcwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnRBbmltYXRpb24obG9uZyBzdGFydFRpbWUpIHsKLSAgICAgICAgICAgIG1TdGFydFRpbWUgPSBzdGFydFRpbWU7Ci0gICAgICAgICAgICBtSXNBbmltYXRpb25TdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTdG9wcyB0aGUgYW5pbWF0aW9uLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc3RvcEFuaW1hdGlvbigpIHsKLSAgICAgICAgICAgIG1Jc0FuaW1hdGlvblN0YXJ0ZWQgPSB0cnVlOwotICAgICAgICAgICAgbUlzQW5pbWF0aW9uRW5kZWQgPSB0cnVlOwotICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uQW5pbWF0aW9uRW5kKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsY3VsYXRlcyBhbmQgdXBkYXRlcyBjdXJyZW50IGJvdW5kcyBhbmQgYWxwaGEgdmFsdWUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjdXJyZW50VGltZSBDdXJyZW50IHRpbWUuaW4gbWlsbGlzCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGUobG9uZyBjdXJyZW50VGltZSkgewotICAgICAgICAgICAgaWYgKG1Jc0FuaW1hdGlvbkVuZGVkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmxvYXQgbm9ybWFsaXplZFRpbWUgPSAoY3VycmVudFRpbWUgLSBtU3RhcnRUaW1lKSAvIChmbG9hdCkgbUR1cmF0aW9uOwotICAgICAgICAgICAgbm9ybWFsaXplZFRpbWUgPSBNYXRoLm1heCgwLjBmLCBNYXRoLm1pbigxLjBmLCBub3JtYWxpemVkVGltZSkpOwotICAgICAgICAgICAgaWYgKCFtSXNBbmltYXRpb25TdGFydGVkKSB7Ci0gICAgICAgICAgICAgICAgbm9ybWFsaXplZFRpbWUgPSAwLjBmOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmxvYXQgaW50ZXJwb2xhdGVkVGltZSA9IChtSW50ZXJwb2xhdG9yID09IG51bGwpID8gbm9ybWFsaXplZFRpbWUKLSAgICAgICAgICAgICAgICAgICAgOiBtSW50ZXJwb2xhdG9yLmdldEludGVycG9sYXRpb24obm9ybWFsaXplZFRpbWUpOwotICAgICAgICAgICAgaW50IGRlbHRhWSA9IChpbnQpIChtRGVsdGFZICogaW50ZXJwb2xhdGVkVGltZSk7Ci0gICAgICAgICAgICBtQ3VycmVudEJvdW5kcy50b3AgPSBtU3RhcnRSZWN0LnRvcCArIGRlbHRhWTsKLSAgICAgICAgICAgIG1DdXJyZW50Qm91bmRzLmJvdHRvbSA9IG1TdGFydFJlY3QuYm90dG9tICsgZGVsdGFZOwotICAgICAgICAgICAgbUN1cnJlbnRBbHBoYSA9IG1TdGFydEFscGhhICsgKG1FbmRBbHBoYSAtIG1TdGFydEFscGhhKSAqIGludGVycG9sYXRlZFRpbWU7Ci0gICAgICAgICAgICBpZiAobUJpdG1hcCAhPSBudWxsICYmIG1DdXJyZW50Qm91bmRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQml0bWFwLnNldEFscGhhKChpbnQpIChtQ3VycmVudEFscGhhICogMjU1KSk7Ci0gICAgICAgICAgICAgICAgbUJpdG1hcC5zZXRCb3VuZHMobUN1cnJlbnRCb3VuZHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Jc0FuaW1hdGlvblN0YXJ0ZWQgJiYgbm9ybWFsaXplZFRpbWUgPj0gMS4wZikgewotICAgICAgICAgICAgICAgIG1Jc0FuaW1hdGlvbkVuZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uQW5pbWF0aW9uRW5kKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuICFtSXNBbmltYXRpb25FbmRlZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBbiBhbmltYXRpb24gbGlzdGVuZXIgdGhhdCByZWNlaXZlcyBub3RpZmljYXRpb25zIHdoZW4gdGhlIGFuaW1hdGlvbiBlbmRzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludGVyZmFjZSBPbkFuaW1hdGlvbkVuZExpc3RlbmVyIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogTm90aWZpZXMgdGhlIGVuZCBvZiB0aGUgYW5pbWF0aW9uLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi1tcjEvTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9qZWxseWJlYW4tbXIxL01lZGlhUm91dGVySmVsbHliZWFuTXIxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NTM5YmQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi1tcjEvTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmRpc3BsYXkuRGlzcGxheU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uUmVxdWlyZXNBcGk7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi0vLyBAQFJlcXVpcmVzQXBpKDE3KQotZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEiOwotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlQ2FsbGJhY2soQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDYWxsYmFja1Byb3h5PENhbGxiYWNrPihjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSb3V0ZUluZm8gewotICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbmFibGVkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmlzRW5hYmxlZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBEaXNwbGF5IGdldFByZXNlbnRhdGlvbkRpc3BsYXkoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICAvLyBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mby5nZXRQcmVzZW50YXRpb25EaXNwbGF5KCkgd2FzCi0gICAgICAgICAgICAvLyBhZGRlZCBpbiBBUEkgMTcuIEhvd2V2ZXIsIHNvbWUgZmFjdG9yeSByZWxlYXNlcyBvZiBKQiBNUjEgbWlzc2VkIGl0LgotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0UHJlc2VudGF0aW9uRGlzcGxheSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXJyb3IgZXgpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgZ2V0IHByZXNlbnRhdGlvbiBkaXNwbGF5IGZvciB0aGUgcm91dGUuIiwgZXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVySmVsbHliZWFuLkNhbGxiYWNrIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVByZXNlbnRhdGlvbkRpc3BsYXlDaGFuZ2VkKE9iamVjdCByb3V0ZU9iaik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV29ya2Fyb3VuZCB0aGUgZmFjdCB0aGF0IHRoZSB2ZXJzaW9uIG9mIE1lZGlhUm91dGVyLmFkZENhbGxiYWNrKCkgdGhhdCBhY2NlcHRzIGEKLSAgICAgKiBmbGFnIHRvIHBlcmZvcm0gYW4gYWN0aXZlIHNjYW4gZG9lcyBub3QgZXhpc3QgaW4gSkIgTVIxIHNvIHdlIG5lZWQgdG8gZm9yY2UKLSAgICAgKiB3aWZpIGRpc3BsYXkgc2NhbnMgZGlyZWN0bHkgdGhyb3VnaCB0aGUgRGlzcGxheU1hbmFnZXIuCi0gICAgICogRG8gbm90IHVzZSBvbiBKQiBNUjIgYW5kIGFib3ZlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQWN0aXZlU2Nhbldvcmthcm91bmQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0gICAgICAgIC8vIFRpbWUgYmV0d2VlbiB3aWZpIGRpc3BsYXkgc2NhbnMgd2hlbiBhY3RpdmVseSBzY2FubmluZyBpbiBtaWxsaXNlY29uZHMuCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXSUZJX0RJU1BMQVlfU0NBTl9JTlRFUlZBTCA9IDE1MDAwOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgRGlzcGxheU1hbmFnZXIgbURpc3BsYXlNYW5hZ2VyOwotICAgICAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXI7Ci0gICAgICAgIHByaXZhdGUgTWV0aG9kIG1TY2FuV2lmaURpc3BsYXlzTWV0aG9kOwotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQWN0aXZlbHlTY2FubmluZ1dpZmlEaXNwbGF5czsKLQotICAgICAgICBwdWJsaWMgQWN0aXZlU2Nhbldvcmthcm91bmQoQ29udGV4dCBjb250ZXh0LCBIYW5kbGVyIGhhbmRsZXIpIHsKLSAgICAgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgIT0gMTcpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbURpc3BsYXlNYW5hZ2VyID0gKERpc3BsYXlNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5ESVNQTEFZX1NFUlZJQ0UpOwotICAgICAgICAgICAgbUhhbmRsZXIgPSBoYW5kbGVyOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtU2NhbldpZmlEaXNwbGF5c01ldGhvZCA9IERpc3BsYXlNYW5hZ2VyLmNsYXNzLmdldE1ldGhvZCgic2NhbldpZmlEaXNwbGF5cyIpOwotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVTY2FuUm91dGVUeXBlcyhpbnQgcm91dGVUeXBlcykgewotICAgICAgICAgICAgLy8gT24gSkIgTVIxLCB0aGVyZSBpcyBubyBBUEkgdG8gc2NhbiB3aWZpIGRpc3BsYXkgcm91dGVzLgotICAgICAgICAgICAgLy8gSW5zdGVhZCB3ZSBtdXN0IG1ha2UgYSBkaXJlY3QgY2FsbCBpbnRvIHRoZSBEaXNwbGF5TWFuYWdlciB0byBzY2FuCi0gICAgICAgICAgICAvLyB3aWZpIGRpc3BsYXlzIG9uIHRoaXMgdmVyc2lvbiBidXQgb25seSB3aGVuIGxpdmUgdmlkZW8gcm91dGVzIGFyZSByZXF1ZXN0ZWQuCi0gICAgICAgICAgICAvLyBTZWUgYWxzbyB0aGUgSmVsbHliZWFuTXIySW1wbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZC4KLSAgICAgICAgICAgIC8vIFRoaXMgd2FzIGZpeGVkIGluIEpCIE1SMiBieSBhZGRpbmcgYSBuZXcgb3ZlcmxvYWQgb2YgYWRkQ2FsbGJhY2soKSB0bwotICAgICAgICAgICAgLy8gZW5hYmxlIGFjdGl2ZSBzY2FubmluZyBvbiByZXF1ZXN0LgotICAgICAgICAgICAgaWYgKChyb3V0ZVR5cGVzICYgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9MSVZFX1ZJREVPKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtQWN0aXZlbHlTY2FubmluZ1dpZmlEaXNwbGF5cykgewotICAgICAgICAgICAgICAgICAgICBpZiAobVNjYW5XaWZpRGlzcGxheXNNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZWx5U2Nhbm5pbmdXaWZpRGlzcGxheXMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdCh0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBzY2FuIGZvciB3aWZpIGRpc3BsYXlzIGJlY2F1c2UgdGhlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiRGlzcGxheU1hbmFnZXIuc2NhbldpZmlEaXNwbGF5cygpIG1ldGhvZCBpcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm5vdCBhdmFpbGFibGUgb24gdGhpcyBkZXZpY2UuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChtQWN0aXZlbHlTY2FubmluZ1dpZmlEaXNwbGF5cykgewotICAgICAgICAgICAgICAgICAgICBtQWN0aXZlbHlTY2FubmluZ1dpZmlEaXNwbGF5cyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVDYWxsYmFja3ModGhpcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGlmIChtQWN0aXZlbHlTY2FubmluZ1dpZmlEaXNwbGF5cykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TY2FuV2lmaURpc3BsYXlzTWV0aG9kLmludm9rZShtRGlzcGxheU1hbmFnZXIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IHNjYW4gZm9yIHdpZmkgZGlzcGxheXMuIiwgZXgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IHNjYW4gZm9yIHdpZmkgZGlzcGxheXMuIiwgZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtSGFuZGxlci5wb3N0RGVsYXllZCh0aGlzLCBXSUZJX0RJU1BMQVlfU0NBTl9JTlRFUlZBTCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXb3JrYXJvdW5kIHRoZSBmYWN0IHRoYXQgdGhlIGlzQ29ubmVjdGluZygpIG1ldGhvZCBkb2VzIG5vdCBleGlzdCBpbiBKQiBNUjEuCi0gICAgICogRG8gbm90IHVzZSBvbiBKQiBNUjIgYW5kIGFib3ZlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgSXNDb25uZWN0aW5nV29ya2Fyb3VuZCB7Ci0gICAgICAgIHByaXZhdGUgTWV0aG9kIG1HZXRTdGF0dXNDb2RlTWV0aG9kOwotICAgICAgICBwcml2YXRlIGludCBtU3RhdHVzQ29ubmVjdGluZzsKLQotICAgICAgICBwdWJsaWMgSXNDb25uZWN0aW5nV29ya2Fyb3VuZCgpIHsKLSAgICAgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgIT0gMTcpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBGaWVsZCBzdGF0dXNDb25uZWN0aW5nRmllbGQgPQotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8uY2xhc3MuZ2V0RmllbGQoIlNUQVRVU19DT05ORUNUSU5HIik7Ci0gICAgICAgICAgICAgICAgbVN0YXR1c0Nvbm5lY3RpbmcgPSBzdGF0dXNDb25uZWN0aW5nRmllbGQuZ2V0SW50KG51bGwpOwotICAgICAgICAgICAgICAgIG1HZXRTdGF0dXNDb2RlTWV0aG9kID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvLmNsYXNzLmdldE1ldGhvZCgiZ2V0U3RhdHVzQ29kZSIpOwotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0aW5nKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPQotICAgICAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmo7Ci0KLSAgICAgICAgICAgIGlmIChtR2V0U3RhdHVzQ29kZU1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHN0YXR1c0NvZGUgPSAoSW50ZWdlciltR2V0U3RhdHVzQ29kZU1ldGhvZC5pbnZva2Uocm91dGUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzQ29kZSA9PSBtU3RhdHVzQ29ubmVjdGluZzsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQXNzdW1lIG5vdCBjb25uZWN0aW5nLgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIENhbGxiYWNrUHJveHk8VCBleHRlbmRzIENhbGxiYWNrPgotICAgICAgICAgICAgZXh0ZW5kcyBNZWRpYVJvdXRlckplbGx5YmVhbi5DYWxsYmFja1Byb3h5PFQ+IHsKLSAgICAgICAgcHVibGljIENhbGxiYWNrUHJveHkoVCBjYWxsYmFjaykgewotICAgICAgICAgICAgc3VwZXIoY2FsbGJhY2spOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVQcmVzZW50YXRpb25EaXNwbGF5Q2hhbmdlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUm91dGVQcmVzZW50YXRpb25EaXNwbGF5Q2hhbmdlZChyb3V0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuLW1yMi9NZWRpYVJvdXRlckplbGx5YmVhbk1yMi5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi1tcjIvTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEwMzU0OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuLW1yMi9NZWRpYVJvdXRlckplbGx5YmVhbk1yMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi0vLyBAQFJlcXVpcmVzQXBpKDE4KQotZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIgewotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldERlZmF1bHRSb3V0ZShPYmplY3Qgcm91dGVyT2JqKSB7Ci0gICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5nZXREZWZhdWx0Um91dGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkQ2FsbGJhY2soT2JqZWN0IHJvdXRlck9iaiwgaW50IHR5cGVzLCBPYmplY3QgY2FsbGJhY2tPYmosIGludCBmbGFncykgewotICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5hZGRDYWxsYmFjayh0eXBlcywKLSAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5DYWxsYmFjayljYWxsYmFja09iaiwgZmxhZ3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUm91dGVJbmZvIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBDaGFyU2VxdWVuY2UgZ2V0RGVzY3JpcHRpb24oT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Nvbm5lY3RpbmcoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuaXNDb25uZWN0aW5nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFVzZXJSb3V0ZUluZm8gewotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVzY3JpcHRpb24oT2JqZWN0IHJvdXRlT2JqLCBDaGFyU2VxdWVuY2UgZGVzY3JpcHRpb24pIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuL01lZGlhUm91dGVySmVsbHliZWFuLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuL01lZGlhUm91dGVySmVsbHliZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYjU5YjguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi9NZWRpYVJvdXRlckplbGx5YmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLy8gQEBSZXF1aXJlc0FwaSgxNikKLWZpbmFsIGNsYXNzIE1lZGlhUm91dGVySmVsbHliZWFuIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVySmVsbHliZWFuIjsKLQotICAgIC8vIGFuZHJvaWQubWVkaWEuQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCA9IDB4ODA7Ci0gICAgLy8gYW5kcm9pZC5tZWRpYS5BdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMgPSAweDEwMDsKLSAgICAvLyBhbmRyb2lkLm1lZGlhLkF1ZGlvU3lzdGVtLkRFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUiA9IDB4MjAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9PVVRfQkxVRVRPT1RIID0gMHg4MCB8IDB4MTAwIHwgMHgyMDA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBST1VURV9UWVBFX0xJVkVfQVVESU8gPSAweDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUk9VVEVfVFlQRV9MSVZFX1ZJREVPID0gMHgyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPVVRFX1RZUEVfVVNFUiA9IDB4MDA4MDAwMDA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTExfUk9VVEVfVFlQRVMgPQotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9MSVZFX0FVRElPCi0gICAgICAgICAgICB8IE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfTElWRV9WSURFTwotICAgICAgICAgICAgfCBNZWRpYVJvdXRlckplbGx5YmVhbi5ST1VURV9UWVBFX1VTRVI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRNZWRpYVJvdXRlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0Lk1FRElBX1JPVVRFUl9TRVJWSUNFKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJyYXd0eXBlcyIsICJ1bmNoZWNrZWQiIH0pCi0gICAgcHVibGljIHN0YXRpYyBMaXN0IGdldFJvdXRlcyhPYmplY3Qgcm91dGVyT2JqKSB7Ci0gICAgICAgIGZpbmFsIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyID0gKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqOwotICAgICAgICBmaW5hbCBpbnQgY291bnQgPSByb3V0ZXIuZ2V0Um91dGVDb3VudCgpOwotICAgICAgICBMaXN0IG91dCA9IG5ldyBBcnJheUxpc3QoY291bnQpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIG91dC5hZGQocm91dGVyLmdldFJvdXRlQXQoaSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvdXQ7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyAicmF3dHlwZXMiLCAidW5jaGVja2VkIiB9KQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRDYXRlZ29yaWVzKE9iamVjdCByb3V0ZXJPYmopIHsKLSAgICAgICAgZmluYWwgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIgPSAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmo7Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IHJvdXRlci5nZXRDYXRlZ29yeUNvdW50KCk7Ci0gICAgICAgIExpc3Qgb3V0ID0gbmV3IEFycmF5TGlzdChjb3VudCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgb3V0LmFkZChyb3V0ZXIuZ2V0Q2F0ZWdvcnlBdChpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG91dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRTZWxlY3RlZFJvdXRlKE9iamVjdCByb3V0ZXJPYmosIGludCB0eXBlKSB7Ci0gICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5nZXRTZWxlY3RlZFJvdXRlKHR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZWxlY3RSb3V0ZShPYmplY3Qgcm91dGVyT2JqLCBpbnQgdHlwZXMsIE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5zZWxlY3RSb3V0ZSh0eXBlcywKLSAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRDYWxsYmFjayhPYmplY3Qgcm91dGVyT2JqLCBpbnQgdHlwZXMsIE9iamVjdCBjYWxsYmFja09iaikgewotICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5hZGRDYWxsYmFjayh0eXBlcywKLSAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5DYWxsYmFjayljYWxsYmFja09iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUNhbGxiYWNrKE9iamVjdCByb3V0ZXJPYmosIE9iamVjdCBjYWxsYmFja09iaikgewotICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5yZW1vdmVDYWxsYmFjaygKLSAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5DYWxsYmFjayljYWxsYmFja09iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlUm91dGVDYXRlZ29yeShPYmplY3Qgcm91dGVyT2JqLAotICAgICAgICAgICAgU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNHcm91cGFibGUpIHsKLSAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmopLmNyZWF0ZVJvdXRlQ2F0ZWdvcnkobmFtZSwgaXNHcm91cGFibGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVVzZXJSb3V0ZShPYmplY3Qgcm91dGVyT2JqLCBPYmplY3QgY2F0ZWdvcnlPYmopIHsKLSAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmopLmNyZWF0ZVVzZXJSb3V0ZSgKLSAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUNhdGVnb3J5KWNhdGVnb3J5T2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkVXNlclJvdXRlKE9iamVjdCByb3V0ZXJPYmosIE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5hZGRVc2VyUm91dGUoCi0gICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVVzZXJSb3V0ZShPYmplY3Qgcm91dGVyT2JqLCBPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikucmVtb3ZlVXNlclJvdXRlKAotICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZUNhbGxiYWNrKENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ2FsbGJhY2tQcm94eTxDYWxsYmFjaz4oY2FsbGJhY2spOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVZvbHVtZUNhbGxiYWNrKFZvbHVtZUNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVm9sdW1lQ2FsbGJhY2tQcm94eTxWb2x1bWVDYWxsYmFjaz4oY2FsbGJhY2spOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sZWFuIGNoZWNrUm91dGVkVG9CbHVldG9vdGgoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBdWRpb01hbmFnZXIgYXVkaW9NYW5hZ2VyID0gKEF1ZGlvTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKAotICAgICAgICAgICAgICAgICAgICBDb250ZXh0LkFVRElPX1NFUlZJQ0UpOwotICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGF1ZGlvTWFuYWdlci5nZXRDbGFzcygpLmdldERlY2xhcmVkTWV0aG9kKAotICAgICAgICAgICAgICAgICAgICAiZ2V0RGV2aWNlc0ZvclN0cmVhbSIsIGludC5jbGFzcyk7Ci0gICAgICAgICAgICBpbnQgZGV2aWNlID0gKEludGVnZXIpIG1ldGhvZC5pbnZva2UoYXVkaW9NYW5hZ2VyLCBBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDKTsKLSAgICAgICAgICAgIHJldHVybiAoZGV2aWNlICYgREVWSUNFX09VVF9CTFVFVE9PVEgpICE9IDA7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlSW5mbyB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgQ2hhclNlcXVlbmNlIGdldE5hbWUoT2JqZWN0IHJvdXRlT2JqLCBDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXROYW1lKGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBDaGFyU2VxdWVuY2UgZ2V0U3RhdHVzKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFN0YXR1cygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0U3VwcG9ydGVkVHlwZXMoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0U3VwcG9ydGVkVHlwZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldENhdGVnb3J5KE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldENhdGVnb3J5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIERyYXdhYmxlIGdldEljb25EcmF3YWJsZShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRJY29uRHJhd2FibGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFBsYXliYWNrVHlwZShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRQbGF5YmFja1R5cGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFBsYXliYWNrU3RyZWFtKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFBsYXliYWNrU3RyZWFtKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRWb2x1bWUoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0Vm9sdW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRWb2x1bWVNYXgoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0Vm9sdW1lTWF4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRWb2x1bWVIYW5kbGluZyhPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRWb2x1bWVIYW5kbGluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0VGFnKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFRhZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFRhZyhPYmplY3Qgcm91dGVPYmosIE9iamVjdCB0YWcpIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLnNldFRhZyh0YWcpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcXVlc3RTZXRWb2x1bWUoT2JqZWN0IHJvdXRlT2JqLCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5yZXF1ZXN0U2V0Vm9sdW1lKHZvbHVtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVxdWVzdFVwZGF0ZVZvbHVtZShPYmplY3Qgcm91dGVPYmosIGludCBkaXJlY3Rpb24pIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLnJlcXVlc3RVcGRhdGVWb2x1bWUoZGlyZWN0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEdyb3VwKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldEdyb3VwKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNHcm91cChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiByb3V0ZU9iaiBpbnN0YW5jZW9mIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVHcm91cDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUm91dGVHcm91cCB7Ci0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInJhd3R5cGVzIiwgInVuY2hlY2tlZCIgfSkKLSAgICAgICAgcHVibGljIHN0YXRpYyBMaXN0IGdldEdyb3VwZWRSb3V0ZXMoT2JqZWN0IGdyb3VwT2JqKSB7Ci0gICAgICAgICAgICBmaW5hbCBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlR3JvdXAgZ3JvdXAgPQotICAgICAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUdyb3VwKWdyb3VwT2JqOwotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gZ3JvdXAuZ2V0Um91dGVDb3VudCgpOwotICAgICAgICAgICAgTGlzdCBvdXQgPSBuZXcgQXJyYXlMaXN0KGNvdW50KTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIG91dC5hZGQoZ3JvdXAuZ2V0Um91dGVBdChpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3V0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBVc2VyUm91dGVJbmZvIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldE5hbWUoT2JqZWN0IHJvdXRlT2JqLCBDaGFyU2VxdWVuY2UgbmFtZSkgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldE5hbWUobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0U3RhdHVzKE9iamVjdCByb3V0ZU9iaiwgQ2hhclNlcXVlbmNlIHN0YXR1cykgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFN0YXR1cyhzdGF0dXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEljb25EcmF3YWJsZShPYmplY3Qgcm91dGVPYmosIERyYXdhYmxlIGljb24pIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRJY29uRHJhd2FibGUoaWNvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UGxheWJhY2tUeXBlKE9iamVjdCByb3V0ZU9iaiwgaW50IHR5cGUpIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRQbGF5YmFja1R5cGUodHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UGxheWJhY2tTdHJlYW0oT2JqZWN0IHJvdXRlT2JqLCBpbnQgc3RyZWFtKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0UGxheWJhY2tTdHJlYW0oc3RyZWFtKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWb2x1bWUoT2JqZWN0IHJvdXRlT2JqLCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0Vm9sdW1lKHZvbHVtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Vm9sdW1lTWF4KE9iamVjdCByb3V0ZU9iaiwgaW50IHZvbHVtZU1heCkgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFZvbHVtZU1heCh2b2x1bWVNYXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZvbHVtZUhhbmRsaW5nKE9iamVjdCByb3V0ZU9iaiwgaW50IHZvbHVtZUhhbmRsaW5nKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0Vm9sdW1lSGFuZGxpbmcodm9sdW1lSGFuZGxpbmcpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZvbHVtZUNhbGxiYWNrKE9iamVjdCByb3V0ZU9iaiwgT2JqZWN0IHZvbHVtZUNhbGxiYWNrT2JqKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0Vm9sdW1lQ2FsbGJhY2soCi0gICAgICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlZvbHVtZUNhbGxiYWNrKXZvbHVtZUNhbGxiYWNrT2JqKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRSZW1vdGVDb250cm9sQ2xpZW50KE9iamVjdCByb3V0ZU9iaiwgT2JqZWN0IHJjY09iaikgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFJlbW90ZUNvbnRyb2xDbGllbnQoCi0gICAgICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLlJlbW90ZUNvbnRyb2xDbGllbnQpcmNjT2JqKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUm91dGVDYXRlZ29yeSB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgQ2hhclNlcXVlbmNlIGdldE5hbWUoT2JqZWN0IGNhdGVnb3J5T2JqLCBDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVDYXRlZ29yeSljYXRlZ29yeU9iaikuZ2V0TmFtZShjb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInJhd3R5cGVzIiwgInVuY2hlY2tlZCIgfSkKLSAgICAgICAgcHVibGljIHN0YXRpYyBMaXN0IGdldFJvdXRlcyhPYmplY3QgY2F0ZWdvcnlPYmopIHsKLSAgICAgICAgICAgIEFycmF5TGlzdCBvdXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVDYXRlZ29yeSljYXRlZ29yeU9iaikuZ2V0Um91dGVzKG91dCk7Ci0gICAgICAgICAgICByZXR1cm4gb3V0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0U3VwcG9ydGVkVHlwZXMoT2JqZWN0IGNhdGVnb3J5T2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlQ2F0ZWdvcnkpY2F0ZWdvcnlPYmopLmdldFN1cHBvcnRlZFR5cGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNHcm91cGFibGUoT2JqZWN0IGNhdGVnb3J5T2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlQ2F0ZWdvcnkpY2F0ZWdvcnlPYmopLmlzR3JvdXBhYmxlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBDYWxsYmFjayB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVTZWxlY3RlZChpbnQgdHlwZSwgT2JqZWN0IHJvdXRlT2JqKTsKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuc2VsZWN0ZWQoaW50IHR5cGUsIE9iamVjdCByb3V0ZU9iaik7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVBZGRlZChPYmplY3Qgcm91dGVPYmopOwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChPYmplY3Qgcm91dGVPYmopOwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChPYmplY3Qgcm91dGVPYmopOwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlR3JvdXBlZChPYmplY3Qgcm91dGVPYmosIE9iamVjdCBncm91cE9iaiwgaW50IGluZGV4KTsKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuZ3JvdXBlZChPYmplY3Qgcm91dGVPYmosIE9iamVjdCBncm91cE9iaik7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVWb2x1bWVDaGFuZ2VkKE9iamVjdCByb3V0ZU9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVm9sdW1lQ2FsbGJhY2sgewotICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVNldFJlcXVlc3QoT2JqZWN0IHJvdXRlT2JqLCBpbnQgdm9sdW1lKTsKLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVVcGRhdGVSZXF1ZXN0KE9iamVjdCByb3V0ZU9iaiwgaW50IGRpcmVjdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV29ya2Fyb3VuZCBmb3IgbGltaXRhdGlvbnMgb2Ygc2VsZWN0Um91dGUoKSBvbiBKQiBhbmQgSkIgTVIxLgotICAgICAqIERvIG5vdCB1c2Ugb24gSkIgTVIyIGFuZCBhYm92ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFNlbGVjdFJvdXRlV29ya2Fyb3VuZCB7Ci0gICAgICAgIHByaXZhdGUgTWV0aG9kIG1TZWxlY3RSb3V0ZUludE1ldGhvZDsKLQotICAgICAgICBwdWJsaWMgU2VsZWN0Um91dGVXb3JrYXJvdW5kKCkgewotICAgICAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA8IDE2IHx8IEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+IDE3KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RSb3V0ZUludE1ldGhvZCA9IGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuY2xhc3MuZ2V0TWV0aG9kKAotICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdFJvdXRlSW50IiwgaW50LmNsYXNzLCBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mby5jbGFzcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdFJvdXRlKE9iamVjdCByb3V0ZXJPYmosIGludCB0eXBlcywgT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciA9IChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iajsKLSAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0KLSAgICAgICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqOwotCi0gICAgICAgICAgICBpbnQgcm91dGVUeXBlcyA9IHJvdXRlLmdldFN1cHBvcnRlZFR5cGVzKCk7Ci0gICAgICAgICAgICBpZiAoKHJvdXRlVHlwZXMgJiBST1VURV9UWVBFX1VTRVIpID09IDApIHsKLSAgICAgICAgICAgICAgICAvLyBIYW5kbGUgbm9uLXVzZXIgcm91dGVzLgotICAgICAgICAgICAgICAgIC8vIE9uIEpCIGFuZCBKQiBNUjEsIHRoZSBzZWxlY3RSb3V0ZSgpIEFQSSBvbmx5IHN1cHBvcnRzIHByb2dyYW1tYXRpY2FsbHkKLSAgICAgICAgICAgICAgICAvLyBzZWxlY3RpbmcgdXNlciByb3V0ZXMuICBTbyBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlIGhpZGRlbiBzZWxlY3RSb3V0ZUludCgpCi0gICAgICAgICAgICAgICAgLy8gbWV0aG9kIG9uIHRoZXNlIHZlcnNpb25zIG9mIHRoZSBwbGF0Zm9ybS4KLSAgICAgICAgICAgICAgICAvLyBUaGlzIGxpbWl0YXRpb24gd2FzIHJlbW92ZWQgaW4gSkIgTVIyLgotICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0Um91dGVJbnRNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdFJvdXRlSW50TWV0aG9kLmludm9rZShyb3V0ZXIsIHR5cGVzLCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIHN1Y2Nlc3MhCi0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBwcm9ncmFtbWF0aWNhbGx5IHNlbGVjdCBub24tdXNlciByb3V0ZS4gICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiTWVkaWEgcm91dGluZyBtYXkgbm90IHdvcmsuIiwgZXgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgcHJvZ3JhbW1hdGljYWxseSBzZWxlY3Qgbm9uLXVzZXIgcm91dGUuICAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIk1lZGlhIHJvdXRpbmcgbWF5IG5vdCB3b3JrLiIsIGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBwcm9ncmFtbWF0aWNhbGx5IHNlbGVjdCBub24tdXNlciByb3V0ZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYmVjYXVzZSB0aGUgcGxhdGZvcm0gaXMgbWlzc2luZyB0aGUgc2VsZWN0Um91dGVJbnQoKSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibWV0aG9kLiAgTWVkaWEgcm91dGluZyBtYXkgbm90IHdvcmsuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBEZWZhdWx0IGhhbmRsaW5nLgotICAgICAgICAgICAgcm91dGVyLnNlbGVjdFJvdXRlKHR5cGVzLCByb3V0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXb3JrYXJvdW5kIHRoZSBmYWN0IHRoYXQgdGhlIGdldERlZmF1bHRSb3V0ZSgpIG1ldGhvZCBkb2VzIG5vdCBleGlzdCBpbiBKQiBhbmQgSkIgTVIxLgotICAgICAqIERvIG5vdCB1c2Ugb24gSkIgTVIyIGFuZCBhYm92ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQgewotICAgICAgICBwcml2YXRlIE1ldGhvZCBtR2V0U3lzdGVtQXVkaW9Sb3V0ZU1ldGhvZDsKLQotICAgICAgICBwdWJsaWMgR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZCgpIHsKLSAgICAgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPCAxNiB8fCBCdWlsZC5WRVJTSU9OLlNES19JTlQgPiAxNykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtR2V0U3lzdGVtQXVkaW9Sb3V0ZU1ldGhvZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLmNsYXNzLmdldE1ldGhvZCgiZ2V0U3lzdGVtQXVkaW9Sb3V0ZSIpOwotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRSb3V0ZShPYmplY3Qgcm91dGVyT2JqKSB7Ci0gICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciA9IChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iajsKLQotICAgICAgICAgICAgaWYgKG1HZXRTeXN0ZW1BdWRpb1JvdXRlTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUdldFN5c3RlbUF1ZGlvUm91dGVNZXRob2QuaW52b2tlKHJvdXRlcik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENvdWxkIG5vdCBmaW5kIHRoZSBtZXRob2Qgb3IgaXQgZG9lcyBub3Qgd29yay4KLSAgICAgICAgICAgIC8vIFJldHVybiB0aGUgZmlyc3Qgcm91dGUgYW5kIGhvcGUgZm9yIHRoZSBiZXN0LgotICAgICAgICAgICAgcmV0dXJuIHJvdXRlci5nZXRSb3V0ZUF0KDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIENhbGxiYWNrUHJveHk8VCBleHRlbmRzIENhbGxiYWNrPgotICAgICAgICAgICAgZXh0ZW5kcyBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLkNhbGxiYWNrIHsKLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIFQgbUNhbGxiYWNrOwotCi0gICAgICAgIHB1YmxpYyBDYWxsYmFja1Byb3h5KFQgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVTZWxlY3RlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKLSAgICAgICAgICAgICAgICBpbnQgdHlwZSwgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlU2VsZWN0ZWQodHlwZSwgcm91dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAotICAgICAgICAgICAgICAgIGludCB0eXBlLCBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUm91dGVVbnNlbGVjdGVkKHR5cGUsIHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQWRkZWQoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIsCi0gICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlQWRkZWQocm91dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVSZW1vdmVkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAotICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZVJlbW92ZWQocm91dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVDaGFuZ2VkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAotICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZUNoYW5nZWQocm91dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVHcm91cGVkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAotICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlLAotICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVHcm91cCBncm91cCwgaW50IGluZGV4KSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZUdyb3VwZWQocm91dGUsIGdyb3VwLCBpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuZ3JvdXBlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlR3JvdXAgZ3JvdXApIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlVW5ncm91cGVkKHJvdXRlLCBncm91cCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVZvbHVtZUNoYW5nZWQoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIsCi0gICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlVm9sdW1lQ2hhbmdlZChyb3V0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgVm9sdW1lQ2FsbGJhY2tQcm94eTxUIGV4dGVuZHMgVm9sdW1lQ2FsbGJhY2s+Ci0gICAgICAgICAgICBleHRlbmRzIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVm9sdW1lQ2FsbGJhY2sgewotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgVCBtQ2FsbGJhY2s7Ci0KLSAgICAgICAgcHVibGljIFZvbHVtZUNhbGxiYWNrUHJveHkoVCBjYWxsYmFjaykgewotICAgICAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVTZXRSZXF1ZXN0KGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlLAotICAgICAgICAgICAgICAgIGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblZvbHVtZVNldFJlcXVlc3Qocm91dGUsIHZvbHVtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVVcGRhdGVSZXF1ZXN0KGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlLAotICAgICAgICAgICAgICAgIGludCBkaXJlY3Rpb24pIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblZvbHVtZVVwZGF0ZVJlcXVlc3Qocm91dGUsIGRpcmVjdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFDb250cm9sSW50ZW50LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFDb250cm9sSW50ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkOWU3NzcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhQ29udHJvbEludGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotCi0vKioKLSAqIENvbnN0YW50cyBmb3IgbWVkaWEgY29udHJvbCBpbnRlbnRzLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGRlY2xhcmVzIGEgc2V0IG9mIHN0YW5kYXJkIG1lZGlhIGNvbnRyb2wgaW50ZW50IGNhdGVnb3JpZXMgYW5kIGFjdGlvbnMgdGhhdAotICogYXBwbGljYXRpb25zIGNhbiB1c2UgdG8gaWRlbnRpZnkgdGhlIGNhcGFiaWxpdGllcyBvZiBtZWRpYSByb3V0ZXMgYW5kIGNvbnRyb2wgdGhlbS4KLSAqIDwvcD4KLSAqCi0gKiA8aDM+TWVkaWEgY29udHJvbCBpbnRlbnQgY2F0ZWdvcmllczwvaDM+Ci0gKiA8cD4KLSAqIE1lZGlhIGNvbnRyb2wgaW50ZW50IGNhdGVnb3JpZXMgc3BlY2lmeSBtZWFucyBieSB3aGljaCBhcHBsaWNhdGlvbnMgY2FuCi0gKiBzZW5kIG1lZGlhIHRvIHRoZSBkZXN0aW5hdGlvbiBvZiBhIG1lZGlhIHJvdXRlLiAgQ2F0ZWdvcmllcyBhcmUgc29tZXRpbWVzIHJlZmVycmVkCi0gKiB0byBhcyBkZXNjcmliaW5nICJ0eXBlcyIgb3IgImtpbmRzIiBvZiByb3V0ZXMuCi0gKiA8L3A+PHA+Ci0gKiBGb3IgZXhhbXBsZSwgaWYgYSByb3V0ZSBzdXBwb3J0cyB0aGUge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrIGNhdGVnb3J5fSwKLSAqIHRoZW4gYW4gYXBwbGljYXRpb24gY2FuIGFzayBpdCB0byBwbGF5IG1lZGlhIHJlbW90ZWx5IGJ5IHNlbmRpbmcgYQotICoge0BsaW5rICNBQ1RJT05fUExBWSBwbGF5fSBvciB7QGxpbmsgI0FDVElPTl9FTlFVRVVFIGVucXVldWV9IGludGVudCB3aXRoIHRoZSBVcmkgb2YgdGhlCi0gKiBtZWRpYSBjb250ZW50IHRvIHBsYXkuICBTdWNoIGEgcm91dGUgbWF5IHRoZW4gYmUgcmVmZXJyZWQgdG8gYXMKLSAqIGEgInJlbW90ZSBwbGF5YmFjayByb3V0ZSIgYmVjYXVzZSBpdCBzdXBwb3J0cyByZW1vdGUgcGxheWJhY2sgcmVxdWVzdHMuICBJdCBpcyBjb21tb24KLSAqIGZvciBhIHJvdXRlIHRvIHN1cHBvcnQgbXVsdGlwbGUgY2F0ZWdvcmllcyBvZiByZXF1ZXN0cyBhdCB0aGUgc2FtZSB0aW1lLCBzdWNoIGFzCi0gKiBsaXZlIGF1ZGlvIGFuZCBsaXZlIHZpZGVvLgotICogPC9wPjxwPgotICogVGhlIGZvbGxvd2luZyBzdGFuZGFyZCByb3V0ZSBjYXRlZ29yaWVzIGFyZSBkZWZpbmVkLgotICogPC9wPjx1bD4KLSAqIDxsaT57QGxpbmsgI0NBVEVHT1JZX0xJVkVfQVVESU8gTGl2ZSBhdWRpb306IFRoZSByb3V0ZSBzdXBwb3J0cyBzdHJlYW1pbmcgbGl2ZSBhdWRpbwotICogZnJvbSB0aGUgZGV2aWNlIHRvIHRoZSBkZXN0aW5hdGlvbi4gIExpdmUgYXVkaW8gcm91dGVzIGluY2x1ZGUgbG9jYWwgc3BlYWtlcnMKLSAqIGFuZCBCbHVldG9vdGggaGVhZHNldHMuCi0gKiA8bGk+e0BsaW5rICNDQVRFR09SWV9MSVZFX1ZJREVPIExpdmUgdmlkZW99OiBUaGUgcm91dGUgc3VwcG9ydHMgc3RyZWFtaW5nIGxpdmUgdmlkZW8KLSAqIGZyb20gdGhlIGRldmljZSB0byB0aGUgZGVzdGluYXRpb24uICBMaXZlIHZpZGVvIHJvdXRlcyBpbmNsdWRlIGxvY2FsIGRpc3BsYXlzCi0gKiBhbmQgd2lyZWxlc3MgZGlzcGxheXMgdGhhdCBzdXBwb3J0IG1pcnJvcmluZyBhbmQKLSAqIHtAbGluayBhbmRyb2lkLmFwcC5QcmVzZW50YXRpb24gcHJlc2VudGF0aW9uc30uICBMaXZlIHZpZGVvIHJvdXRlcyB0eXBpY2FsbHkgYWxzbwotICogc3VwcG9ydCBsaXZlIGF1ZGlvIGNhcGFiaWxpdGllcy4KLSAqIDxsaT57QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyBSZW1vdGUgcGxheWJhY2t9OiBUaGUgcm91dGUgc3VwcG9ydHMgc2VuZGluZwotICogcmVtb3RlIHBsYXliYWNrIHJlcXVlc3RzIGZvciBtZWRpYSBjb250ZW50IHRvIHRoZSBkZXN0aW5hdGlvbi4gIFRoZSBjb250ZW50IHRvIGJlCi0gKiBwbGF5ZWQgaXMgaWRlbnRpZmllZCBieSBhIFVyaSBhbmQgbWltZS10eXBlLgotICogPC91bD48cD4KLSAqIE1lZGlhIHJvdXRlIHByb3ZpZGVycyBtYXkgZGVmaW5lIGN1c3RvbSBtZWRpYSBjb250cm9sIGludGVudCBjYXRlZ29yaWVzIG9mIHRoZWlyIG93biBpbgotICogYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIG9uZXMuICBDdXN0b20gY2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGEgdmFyaWV0eQotICogb2YgZmVhdHVyZXMgdG8gYXBwbGljYXRpb25zIHRoYXQgcmVjb2duaXplIGFuZCBrbm93IGhvdyB0byB1c2UgdGhlbS4gIEZvciBleGFtcGxlLAotICogYSBtZWRpYSByb3V0ZSBwcm92aWRlciBtaWdodCBkZWZpbmUgYSBjdXN0b20gY2F0ZWdvcnkgdG8gaW5kaWNhdGUgdGhhdCBpdHMgcm91dGVzCi0gKiBzdXBwb3J0IGEgc3BlY2lhbCBkZXZpY2Utc3BlY2lmaWMgY29udHJvbCBpbnRlcmZhY2UgaW4gYWRkaXRpb24gdG8gb3RoZXIKLSAqIHN0YW5kYXJkIGZlYXR1cmVzLgotICogPC9wPjxwPgotICogQXBwbGljYXRpb25zIGNhbiBkZXRlcm1pbmUgd2hpY2ggY2F0ZWdvcmllcyBhIHJvdXRlIHN1cHBvcnRzIGJ5IHVzaW5nIHRoZQotICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzdXBwb3J0c0NvbnRyb2xDYXRlZ29yeSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnl9Ci0gKiBvciB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI2dldENvbnRyb2xGaWx0ZXJzIE1lZGlhUm91dGVyLlJvdXRlSW5mby5nZXRDb250cm9sRmlsdGVyc30KLSAqIG1ldGhvZHMuICBBcHBsaWNhdGlvbnMgY2FuIGFsc28gc3BlY2lmeSB0aGUgdHlwZXMgb2Ygcm91dGVzIHRoYXQgdGhleSB3YW50IHRvIHVzZSBieQotICogY3JlYXRpbmcge0BsaW5rIE1lZGlhUm91dGVTZWxlY3RvciBtZWRpYSByb3V0ZSBzZWxlY3RvcnN9IHRoYXQgY29udGFpbiB0aGUgZGVzaXJlZAotICogY2F0ZWdvcmllcyBhbmQgYXJlIHVzZWQgdG8gZmlsdGVyIHJvdXRlcyBpbiBzZXZlcmFsIHBhcnRzIG9mIHRoZSBtZWRpYSByb3V0ZXIgQVBJLgotICogPC9wPgotICoKLSAqIDxoMz5NZWRpYSBjb250cm9sIGludGVudCBhY3Rpb25zPC9oMz4KLSAqIDxwPgotICogTWVkaWEgY29udHJvbCBpbnRlbnQgYWN0aW9ucyBzcGVjaWZ5IHBhcnRpY3VsYXIgZnVuY3Rpb25zIHRoYXQgYXBwbGljYXRpb25zCi0gKiBjYW4gYXNrIHRoZSBkZXN0aW5hdGlvbiBvZiBhIG1lZGlhIHJvdXRlIHRvIHBlcmZvcm0uICBNZWRpYSByb3V0ZSBjb250cm9sIHJlcXVlc3RzCi0gKiB0YWtlIHRoZSBmb3JtIG9mIGludGVudHMgaW4gYSBzaW1pbGFyIG1hbm5lciB0byBvdGhlciBpbnRlbnRzIHVzZWQgdG8gc3RhcnQgYWN0aXZpdGllcwotICogb3Igc2VuZCBicm9hZGNhc3RzLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBtZWRpYSBjb250cm9sIGludGVudHMgYXJlIGRpcmVjdGVkIHRvCi0gKiByb3V0ZXMgcmF0aGVyIHRoYW4gYWN0aXZpdHkgb3IgYnJvYWRjYXN0IHJlY2VpdmVyIGNvbXBvbmVudHMuCi0gKiA8L3A+PHA+Ci0gKiBFYWNoIG1lZGlhIHJvdXRlIGNvbnRyb2wgaW50ZW50IHNwZWNpZmllcyBhbiBhY3Rpb24sIGEgY2F0ZWdvcnkgYW5kIHNvbWUgbnVtYmVyIG9mIHBhcmFtZXRlcnMKLSAqIHRoYXQgYXJlIHN1cHBsaWVkIGFzIGV4dHJhcy4gIEFwcGxpY2F0aW9ucyBzZW5kIG1lZGlhIGNvbnRyb2wgcmVxdWVzdHMgdG8gcm91dGVzIHVzaW5nIHRoZQotICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QgTWVkaWFSb3V0ZXIuUm91dGVJbmZvLnNlbmRDb250cm9sUmVxdWVzdH0KLSAqIG1ldGhvZCBhbmQgcmVjZWl2ZSByZXN1bHRzIHZpYSBhIGNhbGxiYWNrLgotICogPC9wPjxwPgotICogQWxsIG1lZGlhIGNvbnRyb2wgaW50ZW50IGFjdGlvbnMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVkaWEgY29udHJvbCBpbnRlbnQgY2F0ZWdvcmllcwotICogdGhhdCBzdXBwb3J0IHRoZW0uICBUaHVzIG9ubHkgcmVtb3RlIHBsYXliYWNrIHJvdXRlcyBtYXkgcGVyZm9ybSByZW1vdGUgcGxheWJhY2sgYWN0aW9ucy4KLSAqIFRoZSBkb2N1bWVudGF0aW9uIG9mIGVhY2ggYWN0aW9uIHNwZWNpZmllcyB0aGUgY2F0ZWdvcnkgdG8gd2hpY2ggdGhlIGFjdGlvbiBiZWxvbmdzLAotICogdGhlIHBhcmFtZXRlcnMgaXQgcmVxdWlyZXMsIGFuZCB0aGUgcmVzdWx0cyBpdCByZXR1cm5zLgotICogPC9wPgotICoKLSAqIDxoMz5MaXZlIGF1ZGlvIGFuZCBsaXZlIHZpZGVvIHJvdXRlczwvaDM+Ci0gKiA8cD4KLSAqIHtAbGluayAjQ0FURUdPUllfTElWRV9BVURJTyBMaXZlIGF1ZGlvfSBhbmQge0BsaW5rICNDQVRFR09SWV9MSVZFX1ZJREVPIGxpdmUgdmlkZW99Ci0gKiByb3V0ZXMgcHJlc2VudCBtZWRpYSB1c2luZyBzdGFuZGFyZCBzeXN0ZW0gaW50ZXJmYWNlcyBzdWNoIGFzIGF1ZGlvIHN0cmVhbXMsCi0gKiB7QGxpbmsgYW5kcm9pZC5hcHAuUHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbnN9IG9yIGRpc3BsYXkgbWlycm9yaW5nLiAgVGhlc2Ugcm91dGVzIGFyZQotICogdGhlIGVhc2llc3QgdG8gdXNlIGJlY2F1c2UgYXBwbGljYXRpb25zIHNpbXBseSByZW5kZXIgY29udGVudCBsb2NhbGx5IG9uIHRoZSBkZXZpY2UKLSAqIGFuZCB0aGUgc3lzdGVtIHN0cmVhbXMgaXQgdG8gdGhlIHJvdXRlIGRlc3RpbmF0aW9uIGF1dG9tYXRpY2FsbHkuCi0gKiA8L3A+PHA+Ci0gKiBJbiBtb3N0IGNhc2VzLCBhcHBsaWNhdGlvbnMgY2FuIHN0cmVhbSBjb250ZW50IHRvIGxpdmUgYXVkaW8gYW5kIGxpdmUgdmlkZW8gcm91dGVzIGluCi0gKiB0aGUgc2FtZSB3YXkgdGhleSB3b3VsZCBwbGF5IHRoZSBjb250ZW50IGxvY2FsbHkgd2l0aG91dCBhbnkgbW9kaWZpY2F0aW9uLiAgSG93ZXZlciwKLSAqIGFwcGxpY2F0aW9ucyBtYXkgYWxzbyBiZSBhYmxlIHRvIHRha2UgYWR2YW50YWdlIG9mIG1vcmUgc29waGlzdGljYXRlZCBmZWF0dXJlcyBzdWNoCi0gKiBhcyBzZWNvbmQtc2NyZWVuIHByZXNlbnRhdGlvbiBBUElzIHRoYXQgYXJlIHBhcnRpY3VsYXIgdG8gdGhlc2Ugcm91dGVzLgotICogPC9wPgotICoKLSAqIDxoMz5SZW1vdGUgcGxheWJhY2sgcm91dGVzPC9oMz4KLSAqIDxwPgotICoge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgUmVtb3RlIHBsYXliYWNrfSByb3V0ZXMgcHJlc2VudCBtZWRpYSByZW1vdGVseQotICogYnkgcGxheWluZyBjb250ZW50IGZyb20gYSBVcmkuCi0gKiBUaGVzZSByb3V0ZXMgZGVzdGluYXRpb25zIHRha2UgcmVzcG9uc2liaWxpdHkgZm9yIGZldGNoaW5nIGFuZCByZW5kZXJpbmcgY29udGVudAotICogb24gdGhlaXIgb3duLiAgQXBwbGljYXRpb25zIGRvIG5vdCByZW5kZXIgdGhlIGNvbnRlbnQgdGhlbXNlbHZlczsgaW5zdGVhZCwgYXBwbGljYXRpb25zCi0gKiBzZW5kIGNvbnRyb2wgcmVxdWVzdHMgdG8gaW5pdGlhdGUgcGxheSwgcGF1c2UsIHJlc3VtZSwgb3Igc3RvcCBtZWRpYSBpdGVtcyBhbmQgcmVjZWl2ZQotICogc3RhdHVzIHVwZGF0ZXMgYXMgdGhleSBjaGFuZ2Ugc3RhdGUuCi0gKiA8L3A+Ci0gKgotICogPGg0PlNlc3Npb25zPC9oND4KLSAqIDxwPgotICogRWFjaCByZW1vdGUgbWVkaWEgcGxheWJhY2sgYWN0aW9uIGlzIGNvbmR1Y3RlZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGEgc2Vzc2lvbi4KLSAqIFNlc3Npb25zIGFyZSB1c2VkIHRvIHByZXZlbnQgYXBwbGljYXRpb25zIGZyb20gYWNjaWRlbnRhbGx5IGludGVyZmVyaW5nIHdpdGggb25lCi0gKiBhbm90aGVyIGJlY2F1c2UgYXQgbW9zdCBvbmUgc2Vzc2lvbiBjYW4gYmUgdmFsaWQgYXQgYSB0aW1lLgotICogPC9wPjxwPgotICogQSBzZXNzaW9uIGNhbiBiZSBjcmVhdGVkIHVzaW5nIHRoZSB7QGxpbmsgI0FDVElPTl9TVEFSVF9TRVNTSU9OIHN0YXJ0IHNlc3Npb24gYWN0aW9ufQotICogYW5kIHRlcm1pbmF0ZWQgdXNpbmcgdGhlIHtAbGluayAjQUNUSU9OX0VORF9TRVNTSU9OIGVuZCBzZXNzaW9uIGFjdGlvbn0gd2hlbiB0aGUKLSAqIHJvdXRlIHByb3ZpZGVzIGV4cGxpY2l0IHNlc3Npb24gbWFuYWdlbWVudCBmZWF0dXJlcy4KLSAqIDwvcD48cD4KLSAqIEV4cGxpY2l0IHNlc3Npb24gbWFuYWdlbWVudCB3YXMgYWRkZWQgaW4gYSBsYXRlciByZXZpc2lvbiBvZiB0aGUgcHJvdG9jb2wgc28gbm90Ci0gKiBhbGwgcm91dGVzIHN1cHBvcnQgaXQuICBJZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBleHBsaWNpdCBzZXNzaW9uIG1hbmFnZW1lbnQKLSAqIHRoZW4gaW1wbGljaXQgc2Vzc2lvbiBtYW5hZ2VtZW50IG1heSBzdGlsbCBiZSB1c2VkLiAgSW1wbGljaXQgc2Vzc2lvbiBtYW5hZ2VtZW50Ci0gKiByZWxpZXMgb24gdGhlIHVzZSBvZiB0aGUge0BsaW5rICNBQ1RJT05fUExBWSBwbGF5fSBhbmQge0BsaW5rICNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfQotICogYWN0aW9ucyB3aGljaCBoYXZlIHRoZSBzaWRlLWVmZmVjdCBvZiBjcmVhdGluZyBhIG5ldyBzZXNzaW9uIGlmIG5vbmUgaXMgcHJvdmlkZWQKLSAqIGFzIGFyZ3VtZW50LgotICogPC9wPjxwPgotICogV2hlbiBhIG5ldyBzZXNzaW9uIGlzIGNyZWF0ZWQsIHRoZSBwcmV2aW91cyBzZXNzaW9uIGlzIGludmFsaWRhdGVkIGFuZCBhbnkgb25nb2luZwotICogbWVkaWEgcGxheWJhY2sgaXMgc3RvcHBlZCBiZWZvcmUgdGhlIHJlcXVlc3RlZCBhY3Rpb24gaXMgcGVyZm9ybWVkLiAgQW55IGF0dGVtcHQKLSAqIHRvIHVzZSBhbiBpbnZhbGlkYXRlZCBzZXNzaW9uIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiAgKFByb3RvY29sIGltcGxlbWVudGF0aW9ucwotICogYXJlIGVuY291cmFnZWQgdG8gYWdncmVzc2l2ZWx5IGRpc2NhcmQgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGludmFsaWRhdGVkIHNlc3Npb25zCi0gKiBzaW5jZSBpdCBpcyBubyBsb25nZXIgb2YgdXNlLikKLSAqIDwvcD48cD4KLSAqIEVhY2ggc2Vzc2lvbiBpcyBpZGVudGlmaWVkIGJ5IGEgdW5pcXVlIHNlc3Npb24gaWQgdGhhdCBtYXkgYmUgdXNlZCB0byBjb250cm9sCi0gKiB0aGUgc2Vzc2lvbiB1c2luZyBhY3Rpb25zIHN1Y2ggYXMgcGF1c2UsIHJlc3VtZSwgc3RvcCBhbmQgZW5kIHNlc3Npb24uCi0gKiA8L3A+Ci0gKgotICogPGg0Pk1lZGlhIGl0ZW1zPC9oND4KLSAqIDxwPgotICogRWFjaCBzdWNjZXNzZnVsIHtAbGluayAjQUNUSU9OX1BMQVkgcGxheX0gb3Ige0BsaW5rICNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfSBhY3Rpb24KLSAqIHJldHVybnMgYSB1bmlxdWUgbWVkaWEgaXRlbSBpZCB0aGF0IGFuIGFwcGxpY2F0aW9uIGNhbiB1c2UgdG8gbW9uaXRvciBhbmQgY29udHJvbAotICogcGxheWJhY2suICBUaGUgbWVkaWEgaXRlbSBpZCBtYXkgYmUgcGFzc2VkIHRvIG90aGVyIGFjdGlvbnMgc3VjaCBhcwotICoge0BsaW5rICNBQ1RJT05fU0VFSyBzZWVrfSBvciB7QGxpbmsgI0FDVElPTl9HRVRfU1RBVFVTIGdldCBzdGF0dXN9LiAgSXQgd2lsbCBhbHNvIGFwcGVhcgotICogYXMgYSBwYXJhbWV0ZXIgaW4gc3RhdHVzIHVwZGF0ZSBicm9hZGNhc3RzIHRvIGlkZW50aWZ5IHRoZSBhc3NvY2lhdGVkIHBsYXliYWNrIHJlcXVlc3QuCi0gKiA8L3A+PHA+Ci0gKiBFYWNoIG1lZGlhIGl0ZW0gaXMgc2NvcGVkIHRvIHRoZSBzZXNzaW9uIGluIHdoaWNoIGl0IHdhcyBjcmVhdGVkLiAgVGhlcmVmb3JlIG1lZGlhIGl0ZW0KLSAqIGlkcyBhcmUgb25seSBldmVyIHVzZWQgdG9nZXRoZXIgd2l0aCBzZXNzaW9uIGlkcy4gIE1lZGlhIGl0ZW0gaWRzIGFyZSBtZWFuaW5nbGVzcwotICogb24gdGhlaXIgb3duLiAgV2hlbiB0aGUgc2Vzc2lvbiBpcyBpbnZhbGlkYXRlZCwgYWxsIG9mIGl0cyBtZWRpYSBpdGVtcyBhcmUgYWxzbwotICogaW52YWxpZGF0ZWQuCi0gKiA8L3A+Ci0gKgotICogPGg0PlRoZSBwbGF5YmFjayBxdWV1ZTwvaDQ+Ci0gKiA8cD4KLSAqIEVhY2ggc2Vzc2lvbiBoYXMgaXRzIG93biBwbGF5YmFjayBxdWV1ZSB0aGF0IGNvbnNpc3RzIG9mIHRoZSBtZWRpYSBpdGVtcyB0aGF0Ci0gKiBhcmUgcGVuZGluZywgcGxheWluZywgYnVmZmVyaW5nIG9yIHBhdXNlZC4gIEl0ZW1zIGFyZSBhZGRlZCB0byB0aGUgcXVldWUgd2hlbgotICogYSBwbGF5YmFjayByZXF1ZXN0IGlzIGlzc3VlZC4gIEl0ZW1zIGFyZSByZW1vdmVkIGZyb20gdGhlIHF1ZXVlIHdoZW4gdGhleSBhcmUgbm8KLSAqIGxvbmdlciBlbGlnaWJsZSBmb3IgcGxheWJhY2sgKGVudGVyIHRlcm1pbmFsIHN0YXRlcykuCi0gKiA8L3A+PHA+Ci0gKiBBcyBkZXNjcmliZWQgaW4gdGhlIHtAbGluayBNZWRpYUl0ZW1TdGF0dXN9IGNsYXNzLCBtZWRpYSBpdGVtcyBpbml0aWFsbHkKLSAqIHN0YXJ0IGluIGEgcGVuZGluZyBzdGF0ZSwgdHJhbnNpdGlvbiB0byB0aGUgcGxheWluZyAob3IgYnVmZmVyaW5nIG9yIHBhdXNlZCkgc3RhdGUKLSAqIGR1cmluZyBwbGF5YmFjaywgYW5kIGVuZCBpbiBhIGZpbmlzaGVkLCBjYW5jZWxlZCwgaW52YWxpZGF0ZWQgb3IgZXJyb3Igc3RhdGUuCi0gKiBPbmNlIHRoZSBjdXJyZW50IGl0ZW0gZW50ZXJzIGEgdGVybWluYWwgc3RhdGUsIHBsYXliYWNrIHByb2NlZWRzIG9uIHRvIHRoZQotICogbmV4dCBpdGVtLgotICogPC9wPjxwPgotICogVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBkZXRlcm1pbmUgd2hldGhlciB0aGUgcm91dGUgc3VwcG9ydHMgcXVldWluZyBieSBjaGVja2luZwotICogd2hldGhlciB0aGUge0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gYWN0aW9uIGlzIGRlY2xhcmVkIGluIHRoZSByb3V0ZSdzIGNvbnRyb2wgZmlsdGVyCi0gKiB1c2luZyB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3N1cHBvcnRzQ29udHJvbFJlcXVlc3QgUm91dGVJbmZvLnN1cHBvcnRzQ29udHJvbFJlcXVlc3R9LgotICogPC9wPjxwPgotICogSWYgdGhlIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IGFjdGlvbiBpcyBzdXBwb3J0ZWQgYnkgdGhlIHJvdXRlLCB0aGVuIHRoZSByb3V0ZSBwcm9taXNlcwotICogdG8gYWxsb3cgYXQgbGVhc3QgdHdvIGl0ZW1zIChwb3NzaWJseSBtb3JlKSB0byBiZSBlbnF1ZXVlZCBhdCBhIHRpbWUuICBFbnF1ZXVlZCBpdGVtcyBwbGF5Ci0gKiBiYWNrIHRvIGJhY2sgb25lIGFmdGVyIHRoZSBvdGhlciBhcyB0aGUgcHJldmlvdXMgaXRlbSBjb21wbGV0ZXMuICBJZGVhbGx5IHRoZXJlIHNob3VsZAotICogYmUgbm8gYXVkaWJsZSBwYXVzZSBiZXR3ZWVuIGl0ZW1zIGZvciBzdGFuZGFyZCBhdWRpbyBjb250ZW50IHR5cGVzLgotICogPC9wPjxwPgotICogSWYgdGhlIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IGFjdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSByb3V0ZSwgdGhlbiB0aGUgcXVldWUKLSAqIGVmZmVjdGl2ZWx5IGNvbnRhaW5zIGF0IG1vc3Qgb25lIGl0ZW0gYXQgYSB0aW1lLiAgRWFjaCBwbGF5IGFjdGlvbiBoYXMgdGhlIGVmZmVjdCBvZgotICogY2xlYXJpbmcgdGhlIHF1ZXVlIGFuZCByZXNldHRpbmcgaXRzIHN0YXRlIGJlZm9yZSB0aGUgbmV4dCBpdGVtIGlzIHBsYXllZC4KLSAqIDwvcD4KLSAqCi0gKiA8aDQ+SW1wYWN0IG9mIHBhdXNlLCByZXN1bWUsIHN0b3AgYW5kIHBsYXkgYWN0aW9ucyBvbiB0aGUgcGxheWJhY2sgcXVldWU8L2g0PgotICogPHA+Ci0gKiBUaGUgcGF1c2UsIHJlc3VtZSBhbmQgc3RvcCBhY3Rpb25zIGFmZmVjdCB0aGUgc2Vzc2lvbidzIHdob2xlIHF1ZXVlLiAgUGF1c2UgY2F1c2VzCi0gKiB0aGUgcGxheWJhY2sgcXVldWUgdG8gYmUgc3VzcGVuZGVkIG5vIG1hdHRlciB3aGljaCBpdGVtIGlzIGN1cnJlbnRseSBwbGF5aW5nLgotICogUmVzdW1lIHJldmVyc2VzIHRoZSBlZmZlY3RzIG9mIHBhdXNlLiAgU3RvcCBjbGVhcnMgdGhlIHF1ZXVlIGFuZCBhbHNvIHJlc2V0cwotICogdGhlIHBhdXNlIGZsYWcganVzdCBsaWtlIHJlc3VtZS4KLSAqIDwvcD48cD4KLSAqIEFzIGRlc2NyaWJlZCBlYXJsaWVyLCB0aGUgcGxheSBhY3Rpb24gaGFzIHRoZSBlZmZlY3Qgb2YgY2xlYXJpbmcgdGhlIHF1ZXVlCi0gKiBhbmQgY29tcGxldGVseSByZXNldHRpbmcgaXRzIHN0YXRlIChsaWtlIHRoZSBzdG9wIGFjdGlvbikgdGhlbiBlbnF1ZXVpbmcgYQotICogbmV3IG1lZGlhIGl0ZW0gdG8gYmUgcGxheWVkIGltbWVkaWF0ZWx5LiAgUGxheSBpcyB0aGVyZWZvcmUgZXF1aXZhbGVudAotICogdG8gc3RvcCBmb2xsb3dlZCBieSBhbiBhY3Rpb24gdG8gZW5xdWV1ZSBhbiBpdGVtLgotICogPC9wPjxwPgotICogVGhlIHBsYXkgYWN0aW9uIGlzIGFsc28gc3BlY2lhbCBpbiB0aGF0IGl0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBuZXcgc2Vzc2lvbnMuCi0gKiBBbiBhcHBsaWNhdGlvbiB3aXRoIHNpbXBsZSBuZWVkcyBtYXkgZmluZCB0aGF0IGl0IG9ubHkgbmVlZHMgdG8gdXNlIHBsYXkKLSAqIChhbmQgb2NjYXNpb25hbGx5IHN0b3ApIHRvIGNvbnRyb2wgcGxheWJhY2suCi0gKiA8L3A+Ci0gKgotICogPGg0PlJlc29sdmluZyBjb25mbGljdHMgYmV0d2VlbiBhcHBsaWNhdGlvbnM8L2g0PgotICogPHA+Ci0gKiBXaGVuIGFuIGFwcGxpY2F0aW9uIGhhcyBhIHZhbGlkIHNlc3Npb24sIGl0IGlzIGVzc2VudGlhbGx5IGluIGNvbnRyb2wgb2YgcmVtb3RlIHBsYXliYWNrCi0gKiBvbiB0aGUgcm91dGUuICBObyBvdGhlciBhcHBsaWNhdGlvbiBjYW4gdmlldyBvciBtb2RpZnkgdGhlIHJlbW90ZSBwbGF5YmFjayBzdGF0ZQotICogb2YgdGhhdCBhcHBsaWNhdGlvbidzIHNlc3Npb24gd2l0aG91dCBrbm93aW5nIGl0cyBpZC4KLSAqIDwvcD48cD4KLSAqIEhvd2V2ZXIsIG90aGVyIGFwcGxpY2F0aW9ucyBjYW4gcGVyZm9ybSBhY3Rpb25zIHRoYXQgaGF2ZSB0aGUgZWZmZWN0IG9mIHN0b3BwaW5nCi0gKiBwbGF5YmFjayBhbmQgaW52YWxpZGF0aW5nIHRoZSBjdXJyZW50IHNlc3Npb24uICBXaGVuIHRoaXMgb2NjdXJzLCB0aGUgZm9ybWVyIGFwcGxpY2F0aW9uCi0gKiB3aWxsIGJlIGluZm9ybWVkIHRoYXQgaXQgaGFzIGxvc3QgY29udHJvbCBieSB3YXkgb2YgaW5kaXZpZHVhbCBtZWRpYSBpdGVtIHN0YXR1cwotICogdXBkYXRlIGJyb2FkY2FzdHMgdGhhdCBpbmRpY2F0ZSB0aGF0IGl0cyBxdWV1ZWQgbWVkaWEgaXRlbXMgaGF2ZSBiZWNvbWUKLSAqIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMjUExBWUJBQ0tfU1RBVEVfSU5WQUxJREFURUQgaW52YWxpZGF0ZWR9LiAgVGhpcyBicm9hZGNhc3QKLSAqIGltcGxpZXMgdGhhdCBwbGF5YmFjayB3YXMgdGVybWluYXRlZCBhYm5vcm1hbGx5IGJ5IGFuIGV4dGVybmFsIGNhdXNlLgotICogPC9wPjxwPgotICogQXBwbGljYXRpb25zIHNob3VsZCBoYW5kbGUgY29uZmxpY3RzIGNvbnNlcnZhdGl2ZWx5IHRvIGFsbG93IG90aGVyIGFwcGxpY2F0aW9ucyB0bwotICogc21vb3RobHkgYXNzdW1lIGNvbnRyb2wgb3ZlciB0aGUgcm91dGUuICBXaGVuIGEgY29uZmxpY3Qgb2NjdXJzLCB0aGUgY3VycmVudGx5IHBsYXlpbmcKLSAqIGFwcGxpY2F0aW9uIHNob3VsZCByZWxlYXNlIGl0cyBzZXNzaW9uIGFuZCBhbGxvdyB0aGUgbmV3IGFwcGxpY2F0aW9uIHRvIHVzZSB0aGUKLSAqIHJvdXRlIHVudGlsIHN1Y2ggdGltZSBhcyB0aGUgdXNlciBpbnRlcnZlbmVzIHRvIHRha2Ugb3ZlciB0aGUgcm91dGUgYWdhaW4gYW5kIGJlZ2luCi0gKiBhIG5ldyBwbGF5YmFjayBzZXNzaW9uLgotICogPC9wPgotICoKLSAqIDxoND5CYXNpYyBhY3Rpb25zPC9oND4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBiYXNpYyBhY3Rpb25zIG11c3QgYmUgc3VwcG9ydGVkIChhbGwgb3Igbm90aGluZykgYnkgYWxsIHJlbW90ZQotICogcGxheWJhY2sgcm91dGVzLiAgVGhlc2UgYWN0aW9ucyBmb3JtIHRoZSBiYXNpcyBvZiB0aGUgcmVtb3RlIHBsYXliYWNrIHByb3RvY29sCi0gKiBhbmQgYXJlIHJlcXVpcmVkIGluIGFsbCBpbXBsZW1lbnRhdGlvbnMuCi0gKiA8L3A+PHVsPgotICogPGxpPntAbGluayAjQUNUSU9OX1BMQVkgUGxheX06IFN0YXJ0cyBwbGF5aW5nIGNvbnRlbnQgc3BlY2lmaWVkIGJ5IGEgZ2l2ZW4gVXJpCi0gKiBhbmQgcmV0dXJucyBhIG5ldyBtZWRpYSBpdGVtIGlkIHRvIGRlc2NyaWJlIHRoZSByZXF1ZXN0LiAgSW1wbGljaXRseSBjcmVhdGVzIGEgbmV3Ci0gKiBzZXNzaW9uIGlmIG5vIHNlc3Npb24gaWQgd2FzIHNwZWNpZmllZCBhcyBhIHBhcmFtZXRlci4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9TRUVLIFNlZWt9OiBTZXRzIHRoZSBjb250ZW50IHBsYXliYWNrIHBvc2l0aW9uIG9mIGEgc3BlY2lmaWMgbWVkaWEgaXRlbS4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9HRVRfU1RBVFVTIEdldCBzdGF0dXN9OiBHZXRzIHRoZSBzdGF0dXMgb2YgYSBtZWRpYSBpdGVtCi0gKiBpbmNsdWRpbmcgdGhlIGl0ZW0ncyBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uIGFuZCBwcm9ncmVzcy4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9QQVVTRSBQYXVzZX06IFBhdXNlcyBwbGF5YmFjayBvZiB0aGUgcXVldWUuCi0gKiA8bGk+e0BsaW5rICNBQ1RJT05fUkVTVU1FIFJlc3VtZX06IFJlc3VtZXMgcGxheWJhY2sgb2YgdGhlIHF1ZXVlLgotICogPGxpPntAbGluayAjQUNUSU9OX1NUT1AgU3RvcH06IFN0b3BzIHBsYXliYWNrLCBjbGVhcnMgdGhlIHF1ZXVlLCBhbmQgcmVzZXRzIHRoZQotICogcGF1c2Ugc3RhdGUuCi0gKiA8L3VsPgotICoKLSAqIDxoND5RdWV1ZSBhY3Rpb25zPC9oND4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBxdWV1ZSBhY3Rpb25zIG11c3QgYmUgc3VwcG9ydGVkIChhbGwgb3Igbm90aGluZykgYnkgcmVtb3RlCi0gKiBwbGF5YmFjayByb3V0ZXMgdGhhdCBvZmZlciBvcHRpb25hbCBxdWV1aW5nIGNhcGFiaWxpdGllcy4KLSAqIDwvcD48dWw+Ci0gKiA8bGk+e0BsaW5rICNBQ1RJT05fRU5RVUVVRSBFbnF1ZXVlfTogRW5xdWV1ZXMgY29udGVudCBzcGVjaWZpZWQgYnkgYSBnaXZlbiBVcmkKLSAqIGFuZCByZXR1cm5zIGEgbmV3IG1lZGlhIGl0ZW0gaWQgdG8gZGVzY3JpYmUgdGhlIHJlcXVlc3QuICBJbXBsaWNpdGx5IGNyZWF0ZXMgYSBuZXcKLSAqIHNlc3Npb24gaWYgbm8gc2Vzc2lvbiBpZCB3YXMgc3BlY2lmaWVkIGFzIGEgcGFyYW1ldGVyLgotICogPGxpPntAbGluayAjQUNUSU9OX1JFTU9WRSBSZW1vdmV9OiBSZW1vdmVzIGEgc3BlY2lmaWVkIG1lZGlhIGl0ZW0gZnJvbSB0aGUgcXVldWUuCi0gKiA8L3VsPgotICoKLSAqIDxoND5TZXNzaW9uIGFjdGlvbnM8L2g0PgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIHNlc3Npb24gYWN0aW9ucyBtdXN0IGJlIHN1cHBvcnRlZCAoYWxsIG9yIG5vdGhpbmcpIGJ5IHJlbW90ZQotICogcGxheWJhY2sgcm91dGVzIHRoYXQgb2ZmZXIgb3B0aW9uYWwgc2Vzc2lvbiBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcy4KLSAqIDwvcD48dWw+Ci0gKiA8bGk+e0BsaW5rICNBQ1RJT05fU1RBUlRfU0VTU0lPTiBTdGFydCBzZXNzaW9ufTogU3RhcnRzIGEgbmV3IHNlc3Npb24gZXhwbGljaXRseS4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMgR2V0IHNlc3Npb24gc3RhdHVzfTogR2V0cyB0aGUgc3RhdHVzIG9mIGEgc2Vzc2lvbi4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9FTkRfU0VTU0lPTiBFbmQgc2Vzc2lvbn06IEVuZHMgYSBzZXNzaW9uIGV4cGxpY2l0bHkuCi0gKiA8L3VsPgotICoKLSAqIDxoND5JbXBsZW1lbnRhdGlvbiBub3RlPC9oND4KLSAqIDxwPgotICogSW1wbGVtZW50YXRpb25zIG9mIHRoZSByZW1vdGUgcGxheWJhY2sgcHJvdG9jb2wgbXVzdCBpbXBsZW1lbnQgPGVtPmFsbDwvZW0+IG9mIHRoZQotICogZG9jdW1lbnRlZCBhY3Rpb25zLCBwYXJhbWV0ZXJzIGFuZCByZXN1bHRzLiAgTm90ZSB0aGF0IHRoZSBkb2N1bWVudGF0aW9uIGlzIHdyaXR0ZW4gZnJvbQotICogdGhlIHBlcnNwZWN0aXZlIG9mIGEgY2xpZW50IG9mIHRoZSBwcm90b2NvbC4gIEluIHBhcnRpY3VsYXIsIHdoZW5ldmVyIGEgcGFyYW1ldGVyCi0gKiBpcyBkZXNjcmliZWQgYXMgYmVpbmcgIm9wdGlvbmFsIiwgaXQgaXMgb25seSBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgY2xpZW50LgotICogQ29tcGxpYW50IG1lZGlhIHJvdXRlIHByb3ZpZGVyIGltcGxlbWVudGF0aW9ucyBvZiB0aGlzIHByb3RvY29sIG11c3Qgc3VwcG9ydCBhbGwKLSAqIG9mIHRoZSBmZWF0dXJlcyBkZXNjcmliZWQgaGVyZWluLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFDb250cm9sSW50ZW50IHsKLSAgICAvKiBSb3V0ZSBjYXRlZ29yaWVzLiAqLwotCi0gICAgLyoqCi0gICAgICogTWVkaWEgY29udHJvbCBjYXRlZ29yeTogTGl2ZSBhdWRpby4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHJvdXRlIHRoYXQgc3VwcG9ydHMgbGl2ZSBhdWRpbyByb3V0aW5nIHdpbGwgYWxsb3cgdGhlIG1lZGlhIGF1ZGlvIHN0cmVhbQotICAgICAqIHRvIGJlIHNlbnQgdG8gc3VwcG9ydGVkIGRlc3RpbmF0aW9ucy4gIFRoaXMgY2FuIGluY2x1ZGUgaW50ZXJuYWwgc3BlYWtlcnMgb3IKLSAgICAgKiBhdWRpbyBqYWNrcyBvbiB0aGUgZGV2aWNlIGl0c2VsZiwgQTJEUCBkZXZpY2VzLCBhbmQgbW9yZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogV2hlbiBhIGxpdmUgYXVkaW8gcm91dGUgaXMgc2VsZWN0ZWQsIGF1ZGlvIHJvdXRpbmcgaXMgdHJhbnNwYXJlbnQgdG8gdGhlIGFwcGxpY2F0aW9uLgotICAgICAqIEFsbCBhdWRpbyBwbGF5ZWQgb24gdGhlIG1lZGlhIHN0cmVhbSB3aWxsIGJlIHJvdXRlZCB0byB0aGUgc2VsZWN0ZWQgZGVzdGluYXRpb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFJlZmVyIHRvIHRoZSBjbGFzcyBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzIGFib3V0IGxpdmUgYXVkaW8gcm91dGVzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9MSVZFX0FVRElPID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmNhdGVnb3J5LkxJVkVfQVVESU8iOwotCi0gICAgLyoqCi0gICAgICogTWVkaWEgY29udHJvbCBjYXRlZ29yeTogTGl2ZSB2aWRlby4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHJvdXRlIHRoYXQgc3VwcG9ydHMgbGl2ZSB2aWRlbyByb3V0aW5nIHdpbGwgYWxsb3cgYSBtaXJyb3JlZCB2ZXJzaW9uCi0gICAgICogb2YgdGhlIGRldmljZSdzIHByaW1hcnkgZGlzcGxheSBvciBhIGN1c3RvbWl6ZWQKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5hcHAuUHJlc2VudGF0aW9uIFByZXNlbnRhdGlvbn0gdG8gYmUgc2VudCB0byBzdXBwb3J0ZWQKLSAgICAgKiBkZXN0aW5hdGlvbnMuCi0gICAgICogPC9wPjxwPgotICAgICAqIFdoZW4gYSBsaXZlIHZpZGVvIHJvdXRlIGlzIHNlbGVjdGVkLCBhdWRpbyBhbmQgdmlkZW8gcm91dGluZyBpcyB0cmFuc3BhcmVudAotICAgICAqIHRvIHRoZSBhcHBsaWNhdGlvbi4gIEJ5IGRlZmF1bHQsIGF1ZGlvIGFuZCB2aWRlbyBpcyByb3V0ZWQgdG8gdGhlIHNlbGVjdGVkCi0gICAgICogZGVzdGluYXRpb24uICBGb3IgY2VydGFpbiBsaXZlIHZpZGVvIHJvdXRlcywgdGhlIGFwcGxpY2F0aW9uIG1heSBhbHNvIHVzZSBhCi0gICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbiBQcmVzZW50YXRpb259IHRvIHJlcGxhY2UgdGhlIG1pcnJvcmVkIHZpZXcKLSAgICAgKiBvbiB0aGUgZXh0ZXJuYWwgZGlzcGxheSB3aXRoIGRpZmZlcmVudCBjb250ZW50LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBSZWZlciB0byB0aGUgY2xhc3MgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBhYm91dCBsaXZlIHZpZGVvIHJvdXRlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNnZXRQcmVzZW50YXRpb25EaXNwbGF5KCkKLSAgICAgKiBAc2VlIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZX0xJVkVfVklERU8gPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuY2F0ZWdvcnkuTElWRV9WSURFTyI7Ci0KLSAgICAvKioKLSAgICAgKiBNZWRpYSBjb250cm9sIGNhdGVnb3J5OiBSZW1vdGUgcGxheWJhY2suCi0gICAgICogPHA+Ci0gICAgICogQSByb3V0ZSB0aGF0IHN1cHBvcnRzIHJlbW90ZSBwbGF5YmFjayByb3V0aW5nIHdpbGwgYWxsb3cgYW4gYXBwbGljYXRpb24gdG8gc2VuZAotICAgICAqIHJlcXVlc3RzIHRvIHBsYXkgY29udGVudCByZW1vdGVseSB0byBzdXBwb3J0ZWQgZGVzdGluYXRpb25zLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgcm91dGVzIGRlc3RpbmF0aW9ucyBvcGVyYXRlIGluZGVwZW5kZW50bHkgb2YgdGhlIGxvY2FsIGRldmljZS4KLSAgICAgKiBXaGVuIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIGlzIHNlbGVjdGVkLCB0aGUgYXBwbGljYXRpb24gY2FuIGNvbnRyb2wgdGhlIGNvbnRlbnQKLSAgICAgKiBwbGF5aW5nIG9uIHRoZSBkZXN0aW5hdGlvbiBieSBzZW5kaW5nIG1lZGlhIGNvbnRyb2wgYWN0aW9ucyB0byB0aGUgcm91dGUuCi0gICAgICogVGhlIGFwcGxpY2F0aW9uIG1heSBhbHNvIHJlY2VpdmUgc3RhdHVzIHVwZGF0ZXMgZnJvbSB0aGUgcm91dGUgcmVnYXJkaW5nCi0gICAgICogcmVtb3RlIHBsYXliYWNrLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBSZWZlciB0byB0aGUgY2xhc3MgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBhYm91dCByZW1vdGUgcGxheWJhY2sgcm91dGVzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuY2F0ZWdvcnkuUkVNT1RFX1BMQVlCQUNLIjsKLQotICAgIC8qIFJlbW90ZSBwbGF5YmFjayBhY3Rpb25zIHRoYXQgYWZmZWN0IGluZGl2aWR1YWwgaXRlbXMuICovCi0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IFBsYXkgbWVkaWEgaXRlbS4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIHN0YXJ0IHBsYXlpbmcgY29udGVudCB3aXRoCi0gICAgICogdGhlIHtAbGluayBVcml9IHNwZWNpZmllZCBpbiB0aGUge0BsaW5rIEludGVudH0ncyB7QGxpbmsgSW50ZW50I2dldERhdGEoKSBkYXRhIHVyaX0uCi0gICAgICogVGhlIGFjdGlvbiByZXR1cm5zIGEgbWVkaWEgc2Vzc2lvbiBpZCBhbmQgbWVkaWEgaXRlbSBpZCB3aGljaCBjYW4gYmUgdXNlZAotICAgICAqIHRvIGNvbnRyb2wgcGxheWJhY2sgdXNpbmcgb3RoZXIgcmVtb3RlIHBsYXliYWNrIGFjdGlvbnMuCi0gICAgICogPC9wPjxwPgotICAgICAqIE9uY2UgaW5pdGlhdGVkLCBwbGF5YmFjayBvZiB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgd2lsbCBiZSBtYW5hZ2VkIGluZGVwZW5kZW50bHkKLSAgICAgKiBieSB0aGUgZGVzdGluYXRpb24uICBUaGUgYXBwbGljYXRpb24gd2lsbCByZWNlaXZlIHN0YXR1cyB1cGRhdGVzIGFzIHRoZSBzdGF0ZQotICAgICAqIG9mIHRoZSBtZWRpYSBpdGVtIGNoYW5nZXMuCi0gICAgICogPC9wPjxwPgotICAgICAqIElmIHRoZSBkYXRhIHVyaSBzcGVjaWZpZXMgYW4gSFRUUCBvciBIVFRQUyBzY2hlbWUsIHRoZW4gdGhlIGRlc3RpbmF0aW9uIGlzCi0gICAgICogcmVzcG9uc2libGUgZm9yIGZvbGxvd2luZyBIVFRQIHJlZGlyZWN0cyB0byBhIHJlYXNvbmFibGUgZGVwdGggb2YgYXQgbGVhc3QgMwotICAgICAqIGxldmVscyBhcyBtaWdodCB0eXBpY2FsbHkgYmUgaGFuZGxlZCBieSBhIHdlYiBicm93c2VyLiAgSWYgYW4gSFRUUCBlcnJvcgotICAgICAqIG9jY3VycywgdGhlbiB0aGUgZGVzdGluYXRpb24gc2hvdWxkIHNlbmQgYSB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzIHN0YXR1cyB1cGRhdGV9Ci0gICAgICogYmFjayB0byB0aGUgY2xpZW50IGluZGljYXRpbmcgdGhlIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMjUExBWUJBQ0tfU1RBVEVfRVJST1IgZXJyb3J9Ci0gICAgICoge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyNnZXRQbGF5YmFja1N0YXRlKCkgcGxheWJhY2sgc3RhdGV9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5PbmUgaXRlbSBhdCBhIHRpbWU8L2gzPgotICAgICAqIDxwPgotICAgICAqIEVhY2ggc3VjY2Vzc2Z1bCBwbGF5IGFjdGlvbiA8ZW0+cmVwbGFjZXM8L2VtPiB0aGUgcHJldmlvdXMgcGxheSBhY3Rpb24uCi0gICAgICogSWYgYW4gaXRlbSBpcyBhbHJlYWR5IHBsYXlpbmcsIHRoZW4gaXQgaXMgY2FuY2VsZWQsIHRoZSBzZXNzaW9uJ3MgcGxheWJhY2sgcXVldWUKLSAgICAgKiBpcyBjbGVhcmVkIGFuZCB0aGUgbmV3IGl0ZW0gYmVnaW5zIHBsYXlpbmcgaW1tZWRpYXRlbHkgKHJlZ2FyZGxlc3Mgb2YKLSAgICAgKiB3aGV0aGVyIHRoZSBwcmV2aW91c2x5IHBsYXlpbmcgaXRlbSBoYWQgYmVlbiBwYXVzZWQpLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGF5IGlzIHRoZXJlZm9yZSBlcXVpdmFsZW50IHRvIHtAbGluayAjQUNUSU9OX1NUT1Agc3RvcH0gZm9sbG93ZWQgYnkgYW4gYWN0aW9uCi0gICAgICogdG8gZW5xdWV1ZSBhIG5ldyBtZWRpYSBpdGVtIHRvIGJlIHBsYXllZCBpbW1lZGlhdGVseS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+U2Vzc2lvbnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgcmVxdWVzdCBoYXMgdGhlIGVmZmVjdCBvZiBpbXBsaWNpdGx5IGNyZWF0aW5nIGEgbWVkaWEgc2Vzc2lvbiB3aGVuZXZlciB0aGUKLSAgICAgKiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzcGVjaWZ5IHRoZSB7QGxpbmsgI0VYVFJBX1NFU1NJT05fSUQgc2Vzc2lvbiBpZH0gcGFyYW1ldGVyLgotICAgICAqIEJlY2F1c2UgdGhlcmUgY2FuIG9ubHkgYmUgYXQgbW9zdCBvbmUgdmFsaWQgc2Vzc2lvbiBhdCBhIHRpbWUsIGNyZWF0aW5nIGEgbmV3IHNlc3Npb24KLSAgICAgKiBoYXMgdGhlIHNpZGUtZWZmZWN0IG9mIGludmFsaWRhdGluZyBhbnkgZXhpc3Rpbmcgc2Vzc2lvbnMgYW5kIHRoZWlyIG1lZGlhIGl0ZW1zLAotICAgICAqIHRoZW4gaGFuZGxpbmcgdGhlIHBsYXliYWNrIHJlcXVlc3Qgd2l0aCBhIG5ldyBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJZiB0aGUgYXBwbGljYXRpb24gc3BlY2lmaWVzIGFuIGludmFsaWQgc2Vzc2lvbiBpZCwgdGhlbiBhbiBlcnJvciBpcyByZXR1cm5lZC4KLSAgICAgKiBXaGVuIHRoaXMgaGFwcGVucywgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBhc3N1bWUgdGhhdCBpdHMgc2Vzc2lvbgotICAgICAqIGlzIG5vIGxvbmdlciB2YWxpZC4gIFRvIG9idGFpbiBhIG5ldyBzZXNzaW9uLCB0aGUgYXBwbGljYXRpb24gbWF5IHRyeSBhZ2FpbgotICAgICAqIGFuZCBvbWl0IHRoZSBzZXNzaW9uIGlkIHBhcmFtZXRlci4gIEhvd2V2ZXIsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQKLSAgICAgKiBvbmx5IHJldHJ5IHJlcXVlc3RzIGR1ZSB0byBhbiBleHBsaWNpdCBhY3Rpb24gcGVyZm9ybWVkIGJ5IHRoZSB1c2VyLAotICAgICAqIHN1Y2ggYXMgdGhlIHVzZXIgY2xpY2tpbmcgb24gYSAicGxheSIgYnV0dG9uIGluIHRoZSBVSSwgc2luY2UgYW5vdGhlcgotICAgICAqIGFwcGxpY2F0aW9uIG1heSBiZSB0cnlpbmcgdG8gdGFrZSBjb250cm9sIG9mIHRoZSByb3V0ZSBhbmQgdGhlIGZvcm1lcgotICAgICAqIGFwcGxpY2F0aW9uIHNob3VsZCB0cnkgdG8gc3RheSBvdXQgb2YgaXRzIHdheS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gc2Vzc2lvbnMsIHF1ZXVlcyBhbmQgbWVkaWEgaXRlbXMsIHBsZWFzZSByZWZlciB0byB0aGUKLSAgICAgKiBjbGFzcyBkb2N1bWVudGF0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlCi0gICAgICogc2Vzc2lvbiB0byB3aGljaCB0aGUgcGxheWJhY2sgcmVxdWVzdCBiZWxvbmdzLiAgSWYgb21pdHRlZCwgYSBuZXcgc2Vzc2lvbgotICAgICAqIGlzIGNyZWF0ZWQgaW1wbGljaXRseS4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX0NPTlRFTlRfUE9TSVRJT059IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgaW5pdGlhbAotICAgICAqIGNvbnRlbnQgcGxheWJhY2sgcG9zaXRpb24gYXMgYSBsb25nIGludGVnZXIgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBmcm9tCi0gICAgICogdGhlIGJlZ2lubmluZyBvZiB0aGUgY29udGVudC4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX01FVEFEQVRBfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgbWV0YWRhdGEgYXNzb2NpYXRlZAotICAgICAqIHdpdGggdGhlIGNvbnRlbnQgc3VjaCBhcyB0aGUgdGl0bGUgb2YgYSBzb25nLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUn0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIGEKLSAgICAgKiB7QGxpbmsgUGVuZGluZ0ludGVudH0gZm9yIGEgYnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgd2lsbCByZWNlaXZlIHN0YXR1cyB1cGRhdGVzCi0gICAgICogYWJvdXQgdGhlIG1lZGlhIGl0ZW0uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlCi0gICAgICogc2Vzc2lvbiB0aGF0IHdhcyBhZmZlY3RlZCBieSB0aGUgcmVxdWVzdC4gIFRoaXMgd2lsbCBiZSBhIG5ldyBzZXNzaW9uIGluCi0gICAgICogdGhlIGNhc2Ugd2hlcmUgbm8gc2Vzc2lvbiBpZCB3YXMgc3VwcGxpZWQgYXMgYSBwYXJhbWV0ZXIuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ob3B0aW9uYWwsIG9sZCBpbXBsZW1lbnRhdGlvbnMgbWF5Ci0gICAgICogb21pdCB0aGlzIGtleSk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9JRH0gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyBhbiBvcGFxdWUgc3RyaW5nIGlkZW50aWZpZXIKLSAgICAgKiB0byB1c2UgdG8gcmVmZXIgdG8gdGhlIG1lZGlhIGl0ZW0gaW4gc3Vic2VxdWVudCByZXF1ZXN0cyBzdWNoIGFzCi0gICAgICoge0BsaW5rICNBQ1RJT05fR0VUX1NUQVRVU30uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9TVEFUVVN9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGluaXRpYWwgc3RhdHVzIG9mCi0gICAgICogdGhlIG5ldyBtZWRpYSBpdGVtLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+U3RhdHVzIHVwZGF0ZXM8L2gzPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBjbGllbnQgc3VwcGxpZXMgYW4KLSAgICAgKiB7QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUiBpdGVtIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJ9Ci0gICAgICogdGhlbiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgc3RhdHVzIHVwZGF0ZXMgdG8gdGhlIHJlY2VpdmVyCi0gICAgICogd2hlbiBzaWduaWZpY2FudCBtZWRpYSBpdGVtIHN0YXRlIGNoYW5nZXMgb2NjdXIgc3VjaCBhcyB3aGVuIHBsYXliYWNrIHN0YXJ0cyBvcgotICAgICAqIHN0b3BzLiAgVGhlIHJlY2VpdmVyIHdpbGwgbm90IGJlIGludm9rZWQgZm9yIGNvbnRlbnQgcGxheWJhY2sgcG9zaXRpb24gY2hhbmdlcy4KLSAgICAgKiBUaGUgYXBwbGljYXRpb24gbWF5IHJldHJpZXZlIHRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uIHdoZW4gbmVjZXNzYXJ5Ci0gICAgICogdXNpbmcgdGhlIHtAbGluayAjQUNUSU9OX0dFVF9TVEFUVVN9IHJlcXVlc3QuCi0gICAgICogPC9wPjxwPgotICAgICAqIFJlZmVyIHRvIHtAbGluayBNZWRpYUl0ZW1TdGF0dXN9IGZvciBkZXRhaWxzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgYSBzZXNzaW9uIGlkIHdhcyBwcm92aWRlZCBidXQgaXMgdW5rbm93biBvcgotICAgICAqIG5vIGxvbmdlciB2YWxpZCwgaWYgdGhlIGl0ZW0gVXJpIG9yIGNvbnRlbnQgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLCBvciBpZgotICAgICAqIGFueSBvdGhlciBhcmd1bWVudHMgYXJlIGludmFsaWQuCi0gICAgICogPC9wPjx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPkV4YW1wbGU8L2gzPgotICAgICAqIDxwcmU+Ci0gICAgICogTWVkaWFSb3V0ZXIgbWVkaWFSb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShjb250ZXh0KTsKLSAgICAgKiBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtZWRpYVJvdXRlci5nZXRTZWxlY3RlZFJvdXRlKCk7Ci0gICAgICogSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9QTEFZKTsKLSAgICAgKiBpbnRlbnQuYWRkQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyk7Ci0gICAgICogaW50ZW50LnNldERhdGFBbmRUeXBlKCJodHRwOi8vZXhhbXBsZS5jb20vdmlkZW9zL21vdmllLm1wNCIsICJ2aWRlby9tcDQiKTsKLSAgICAgKiBpZiAocm91dGUuc3VwcG9ydHNDb250cm9sUmVxdWVzdChpbnRlbnQpKSB7Ci0gICAgICogICAgIE1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjaygpIHsKLSAgICAgKiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhKSB7Ci0gICAgICogICAgICAgICAgICAgLy8gVGhlIHJlcXVlc3Qgc3VjY2VlZGVkLgotICAgICAqICAgICAgICAgICAgIC8vIFBsYXliYWNrIG1heSBiZSBjb250cm9sbGVkIHVzaW5nIHRoZSByZXR1cm5lZCBzZXNzaW9uIGFuZCBpdGVtIGlkLgotICAgICAqICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQgPSBkYXRhLmdldFN0cmluZyhNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9JRCk7Ci0gICAgICogICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCA9IGRhdGEuZ2V0U3RyaW5nKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX0lEKTsKLSAgICAgKiAgICAgICAgICAgICBNZWRpYUl0ZW1TdGF0dXMgc3RhdHVzID0gTWVkaWFJdGVtU3RhdHVzLmZyb21CdW5kbGUoZGF0YS5nZXRCdW5kbGUoCi0gICAgICogICAgICAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9TVEFUVVMpKTsKLSAgICAgKiAgICAgICAgICAgICAvLyAuLi4KLSAgICAgKiAgICAgICAgIH0KLSAgICAgKgotICAgICAqICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihTdHJpbmcgbWVzc2FnZSwgQnVuZGxlIGRhdGEpIHsKLSAgICAgKiAgICAgICAgICAgICAvLyBBbiBlcnJvciBvY2N1cnJlZCEKLSAgICAgKiAgICAgICAgIH0KLSAgICAgKiAgICAgfTsKLSAgICAgKiAgICAgcm91dGUuc2VuZENvbnRyb2xSZXF1ZXN0KGludGVudCwgY2FsbGJhY2spOwotICAgICAqIH08L3ByZT4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqIEBzZWUgI0FDVElPTl9TRUVLCi0gICAgICogQHNlZSAjQUNUSU9OX0dFVF9TVEFUVVMKLSAgICAgKiBAc2VlICNBQ1RJT05fUEFVU0UKLSAgICAgKiBAc2VlICNBQ1RJT05fUkVTVU1FCi0gICAgICogQHNlZSAjQUNUSU9OX1NUT1AKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUExBWSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uUExBWSI7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IEVucXVldWUgbWVkaWEgaXRlbS4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gd29ya3MganVzdCBsaWtlIHtAbGluayAjQUNUSU9OX1BMQVkgcGxheX0gZXhjZXB0IHRoYXQgaXQgZG9lcwotICAgICAqIG5vdCBjbGVhciB0aGUgcXVldWUgb3IgcmVzZXQgdGhlIHBhdXNlIHN0YXRlIHdoZW4gaXQgZW5xdWV1ZXMgdGhlCi0gICAgICogbmV3IG1lZGlhIGl0ZW0gaW50byB0aGUgc2Vzc2lvbidzIHBsYXliYWNrIHF1ZXVlLiAgVGhpcyBhY3Rpb24gb25seQotICAgICAqIGVucXVldWVzIGEgbWVkaWEgaXRlbSB3aXRoIG5vIG90aGVyIHNpZGUtZWZmZWN0cyBvbiB0aGUgcXVldWUuCi0gICAgICogPC9wPjxwPgotICAgICAqIElmIHRoZSBxdWV1ZSBpcyBjdXJyZW50bHkgZW1wdHkgYW5kIHRoZW4gdGhlIGl0ZW0gd2lsbCBwbGF5IGltbWVkaWF0ZWx5Ci0gICAgICogKGFzc3VtaW5nIHRoZSBxdWV1ZSBpcyBub3QgcGF1c2VkKS4gIE90aGVyd2lzZSwgdGhlIGl0ZW0gd2lsbCBwbGF5Ci0gICAgICogYWZ0ZXIgYWxsIGVhcmxpZXIgaXRlbXMgaW4gdGhlIHF1ZXVlIGhhdmUgZmluaXNoZWQgb3IgYmVlbiByZW1vdmVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgZW5xdWV1ZSBhY3Rpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIG5ldyBzZXNzaW9ucyBqdXN0IGxpa2UgcGxheS4KLSAgICAgKiBJdHMgcGFyYW1ldGVycyBhbmQgcmVzdWx0cyBhcmUgYWxzbyB0aGUgc2FtZS4gIE9ubHkgdGhlIHF1ZXVpbmcgYmVoYXZpb3IKLSAgICAgKiBpcyBkaWZmZXJlbnQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNlZSAjQUNUSU9OX1BMQVkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fRU5RVUVVRSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uRU5RVUVVRSI7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IFNlZWsgbWVkaWEgaXRlbSB0byBhIG5ldyBwbGF5YmFjayBwb3NpdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIG1vZGlmeSB0aGUgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbgotICAgICAqIG9mIHRoZSBzcGVjaWZpZWQgbWVkaWEgaXRlbS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gb25seSBhZmZlY3RzIHRoZSBwbGF5YmFjayBwb3NpdGlvbiBvZiB0aGUgbWVkaWEgaXRlbTsgbm90IGl0cyBwbGF5YmFjayBzdGF0ZS4KLSAgICAgKiBJZiB0aGUgcGxheWJhY2sgcXVldWUgaXMgcGF1c2VkLCB0aGVuIHNlZWtpbmcgc2V0cyB0aGUgcG9zaXRpb24gYnV0IHRoZSBpdGVtCi0gICAgICogcmVtYWlucyBwYXVzZWQuICBMaWtld2lzZSBpZiB0aGUgaXRlbSBpcyBwbGF5aW5nLCB0aGVuIHNlZWtpbmcgd2lsbCBjYXVzZSBwbGF5YmFjawotICAgICAqIHRvIGp1bXAgdG8gdGhlIG5ldyBwb3NpdGlvbiBhbmQgY29udGludWUgcGxheWluZyBmcm9tIHRoYXQgcG9pbnQuICBJZiB0aGUgaXRlbSBoYXMKLSAgICAgKiBub3QgeWV0IHN0YXJ0ZWQgcGxheWluZywgdGhlbiB0aGUgbmV3IHBsYXliYWNrIHBvc2l0aW9uIGlzIHJlbWVtYmVyZWQgYnkgdGhlCi0gICAgICogcXVldWUgYW5kIHVzZWQgYXMgdGhlIGl0ZW0ncyBpbml0aWFsIGNvbnRlbnQgcG9zaXRpb24gd2hlbiBwbGF5YmFjayBldmVudHVhbGx5IGJlZ2lucy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSWYgc3VjY2Vzc2Z1bCwgdGhlIG1lZGlhIGl0ZW0ncyBwbGF5YmFjayBwb3NpdGlvbiBpcyBjaGFuZ2VkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlIHNlc3Npb24KLSAgICAgKiB0byB3aGljaCB0aGUgbWVkaWEgaXRlbSBiZWxvbmdzLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbWVkaWEgaXRlbSBpZCBvZgotICAgICAqIHRoZSBtZWRpYSBpdGVtIHRvIHNlZWsuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9DT05URU5UX1BPU0lUSU9OfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG5ldwotICAgICAqIGNvbnRlbnQgcG9zaXRpb24gZm9yIHBsYXliYWNrIGFzIGEgbG9uZyBpbnRlZ2VyIG51bWJlciBvZiBtaWxsaXNlY29uZHMgZnJvbQotICAgICAqIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbnRlbnQuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQotICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBuZXcgc3RhdHVzIG9mCi0gICAgICogdGhlIG1lZGlhIGl0ZW0uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgb3IgbWVkaWEgaXRlbSBpZCBhcmUgdW5rbm93bgotICAgICAqIG9yIG5vIGxvbmdlciB2YWxpZCwgaWYgdGhlIGNvbnRlbnQgcG9zaXRpb24gaXMgaW52YWxpZCwgb3IgaWYgdGhlIG1lZGlhIGl0ZW0KLSAgICAgKiBpcyBpbiBhIHRlcm1pbmFsIHN0YXRlLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TRUVLID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5TRUVLIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogR2V0IG1lZGlhIGl0ZW0gcGxheWJhY2sgc3RhdHVzCi0gICAgICogYW5kIHByb2dyZXNzIGluZm9ybWF0aW9uLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBhc2tzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIHByb3ZpZGUgdXBkYXRlZCBwbGF5YmFjayBzdGF0dXMgYW5kIHByb2dyZXNzCi0gICAgICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNwZWNpZmllZCBtZWRpYSBpdGVtLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlIHNlc3Npb24KLSAgICAgKiB0byB3aGljaCB0aGUgbWVkaWEgaXRlbSBiZWxvbmdzLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbWVkaWEgaXRlbSBpZCBvZgotICAgICAqIHRoZSBtZWRpYSBpdGVtIHRvIHF1ZXJ5LgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihvcHRpb25hbCwgb2xkIGltcGxlbWVudGF0aW9ucyBtYXkKLSAgICAgKiBvbWl0IHRoaXMga2V5KTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU30gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgY3VycmVudCBzdGF0dXMgb2YKLSAgICAgKiB0aGUgbWVkaWEgaXRlbS4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPkVycm9yczwvaDM+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBhY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgc2Vzc2lvbiBpZCBvciBtZWRpYSBpdGVtIGlkIGFyZSB1bmtub3duCi0gICAgICogb3Igbm8gbG9uZ2VyIHZhbGlkLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqIEBzZWUgI0VYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9HRVRfU1RBVFVTID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5HRVRfU1RBVFVTIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogUmVtb3ZlIG1lZGlhIGl0ZW0gZnJvbSBzZXNzaW9uJ3MgcXVldWUuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQotICAgICAqIG1lZGlhIGNvbnRyb2wuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIGFza3MgYSByZW1vdGUgcGxheWJhY2sgcm91dGUgdG8gcmVtb3ZlIHRoZSBzcGVjaWZpZWQgbWVkaWEgaXRlbQotICAgICAqIGZyb20gdGhlIHNlc3Npb24ncyBwbGF5YmFjayBxdWV1ZS4gIElmIHRoZSBjdXJyZW50IGl0ZW0gaXMgcmVtb3ZlZCwgdGhlbgotICAgICAqIHBsYXliYWNrIHdpbGwgcHJvY2VlZCB0byB0aGUgbmV4dCBtZWRpYSBpdGVtIChhc3N1bWluZyB0aGUgcXVldWUgaGFzIG5vdCBiZWVuCi0gICAgICogcGF1c2VkKS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gZG9lcyBub3QgYWZmZWN0IHRoZSBwYXVzZSBzdGF0ZSBvZiB0aGUgcXVldWUuICBJZiB0aGUgcXVldWUgd2FzIHBhdXNlZAotICAgICAqIHRoZW4gaXQgcmVtYWlucyBwYXVzZWQgKGV2ZW4gaWYgaXQgaXMgbm93IGVtcHR5KSB1bnRpbCBhIHJlc3VtZSwgc3RvcCBvciBwbGF5Ci0gICAgICogYWN0aW9uIGlzIGlzc3VlZCB0aGF0IGNhdXNlcyB0aGUgcGF1c2Ugc3RhdGUgdG8gYmUgY2xlYXJlZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZSBzZXNzaW9uCi0gICAgICogdG8gd2hpY2ggdGhlIG1lZGlhIGl0ZW0gYmVsb25ncy4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG1lZGlhIGl0ZW0gaWQgb2YKLSAgICAgKiB0aGUgbWVkaWEgaXRlbSB0byByZW1vdmUuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQotICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBuZXcgc3RhdHVzIG9mCi0gICAgICogdGhlIG1lZGlhIGl0ZW0uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgb3IgbWVkaWEgaXRlbSBpZCBhcmUgdW5rbm93bgotICAgICAqIG9yIG5vIGxvbmdlciB2YWxpZCwgb3IgaWYgdGhlIG1lZGlhIGl0ZW0gaXMgaW4gYSB0ZXJtaW5hbCBzdGF0ZSAoYW5kIHRoZXJlZm9yZQotICAgICAqIG5vIGxvbmdlciBpbiB0aGUgcXVldWUpLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9SRU1PVkUgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLlJFTU9WRSI7Ci0KLSAgICAvKiBSZW1vdGUgcGxheWJhY2sgYWN0aW9ucyB0aGF0IGFmZmVjdCB0aGUgd2hvbGUgcGxheWJhY2sgcXVldWUuICovCi0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IFBhdXNlIG1lZGlhIHBsYXliYWNrLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBjYXVzZXMgdGhlIHBsYXliYWNrIHF1ZXVlIG9mIHRoZSBzcGVjaWZpZWQgc2Vzc2lvbiB0byBiZSBwYXVzZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUgc2Vzc2lvbgotICAgICAqIHdob3NlIHBsYXliYWNrIHF1ZXVlIGlzIHRvIGJlIHBhdXNlZC4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ob3B0aW9uYWwsIG9sZCBpbXBsZW1lbnRhdGlvbnMgbWF5Ci0gICAgICogb21pdCB0aGlzIGtleSk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgaXMgdW5rbm93biBvciBubyBsb25nZXIgdmFsaWQuCi0gICAgICogPC9wPjx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0Ci0gICAgICogQHNlZSAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLCi0gICAgICogQHNlZSAjQUNUSU9OX1JFU1VNRQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9QQVVTRSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uUEFVU0UiOwotCi0gICAgLyoqCi0gICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBSZXN1bWUgbWVkaWEgcGxheWJhY2sgKHVucGF1c2UpLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBjYXVzZXMgdGhlIHBsYXliYWNrIHF1ZXVlIG9mIHRoZSBzcGVjaWZpZWQgc2Vzc2lvbiB0byBiZSByZXN1bWVkLgotICAgICAqIFJldmVyc2VzIHRoZSBlZmZlY3RzIG9mIHtAbGluayAjQUNUSU9OX1BBVVNFfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZSBzZXNzaW9uCi0gICAgICogd2hvc2UgcGxheWJhY2sgcXVldWUgaXMgdG8gYmUgcmVzdW1lZC4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ob3B0aW9uYWwsIG9sZCBpbXBsZW1lbnRhdGlvbnMgbWF5Ci0gICAgICogb21pdCB0aGlzIGtleSk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgaXMgdW5rbm93biBvciBubyBsb25nZXIgdmFsaWQuCi0gICAgICogPC9wPjx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0Ci0gICAgICogQHNlZSAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLCi0gICAgICogQHNlZSAjQUNUSU9OX1BBVVNFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1JFU1VNRSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uUkVTVU1FIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogU3RvcCBtZWRpYSBwbGF5YmFjayAoY2xlYXIgcXVldWUgYW5kIHVucGF1c2UpLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBjYXVzZXMgYSByZW1vdGUgcGxheWJhY2sgcm91dGUgdG8gc3RvcCBwbGF5YmFjaywgY2FuY2VsIGFuZCByZW1vdmUKLSAgICAgKiBhbGwgbWVkaWEgaXRlbXMgZnJvbSB0aGUgc2Vzc2lvbidzIG1lZGlhIGl0ZW0gcXVldWUgYW5kLCByZXNldCB0aGUgcXVldWUncwotICAgICAqIHBhdXNlIHN0YXRlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJZiBzdWNjZXNzZnVsLCB0aGUgc3RhdHVzIG9mIGFsbCBtZWRpYSBpdGVtcyBpbiB0aGUgcXVldWUgaXMgc2V0IHRvCi0gICAgICoge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyNQTEFZQkFDS19TVEFURV9DQU5DRUxFRCBjYW5jZWxlZH0gYW5kIGEgc3RhdHVzIHVwZGF0ZSBpcyBzZW50Ci0gICAgICogdG8gdGhlIGFwcHJvcHJpYXRlIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzIGluZGljYXRpbmcgdGhlIG5ldyBzdGF0dXMgb2YgZWFjaCBpdGVtLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YKLSAgICAgKiB0aGUgc2Vzc2lvbiB3aG9zZSBwbGF5YmFjayBxdWV1ZSBpcyB0byBiZSBzdG9wcGVkIChjbGVhcmVkIGFuZCB1bnBhdXNlZCkuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQotICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIGlzIHVua25vd24gb3Igbm8gbG9uZ2VyIHZhbGlkLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TVE9QID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5TVE9QIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogU3RhcnQgc2Vzc2lvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIGludmFsaWRhdGUgdGhlIGN1cnJlbnQgc2Vzc2lvbgotICAgICAqIGFuZCBzdGFydCBhIG5ldyBzZXNzaW9uLiAgVGhlIG5ldyBzZXNzaW9uIGluaXRpYWxseSBoYXMgYW4gZW1wdHkgcXVldWUuCi0gICAgICogPC9wPjxwPgotICAgICAqIElmIHN1Y2Nlc3NmdWwsIHRoZSBzdGF0dXMgb2YgYWxsIG1lZGlhIGl0ZW1zIGluIHRoZSBwcmV2aW91cyBzZXNzaW9uJ3MgcXVldWUgaXMgc2V0IHRvCi0gICAgICoge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyNQTEFZQkFDS19TVEFURV9JTlZBTElEQVRFRCBpbnZhbGlkYXRlZH0gYW5kIGEgc3RhdHVzIHVwZGF0ZQotICAgICAqIGlzIHNlbnQgdG8gdGhlIGFwcHJvcHJpYXRlIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzIGluZGljYXRpbmcgdGhlIG5ldyBzdGF0dXMKLSAgICAgKiBvZiBlYWNoIGl0ZW0uICBUaGUgcHJldmlvdXMgc2Vzc2lvbiBiZWNvbWVzIG5vIGxvbmdlciB2YWxpZCBhbmQgdGhlIG5ldyBzZXNzaW9uCi0gICAgICogdGFrZXMgY29udHJvbCBvZiB0aGUgcm91dGUuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUn0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIGEKLSAgICAgKiB7QGxpbmsgUGVuZGluZ0ludGVudH0gZm9yIGEgYnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgd2lsbCByZWNlaXZlIHN0YXR1cyB1cGRhdGVzCi0gICAgICogYWJvdXQgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfTUVTU0FHRV9SRUNFSVZFUn0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIGEKLSAgICAgKiB7QGxpbmsgUGVuZGluZ0ludGVudH0gZm9yIGEgYnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgd2lsbCByZWNlaXZlIG1lc3NhZ2VzIGZyb20KLSAgICAgKiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUKLSAgICAgKiBzZXNzaW9uIHRoYXQgd2FzIHN0YXJ0ZWQgYnkgdGhlIHJlcXVlc3QuICBUaGlzIHdpbGwgYWx3YXlzIGJlIGEgYnJhbmQgbmV3IHNlc3Npb24KLSAgICAgKiBkaXN0aW5jdCBmcm9tIGFueSBvdGhlciBwcmV2aW91c2x5IGNyZWF0ZWQgc2Vzc2lvbnMuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlCi0gICAgICogc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+U3RhdHVzIHVwZGF0ZXM8L2gzPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBjbGllbnQgc3VwcGxpZXMgYQotICAgICAqIHtAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJ9Ci0gICAgICogdGhlbiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgc3RhdHVzIHVwZGF0ZXMgdG8gdGhlIHJlY2VpdmVyCi0gICAgICogd2hlbiBzaWduaWZpY2FudCBtZWRpYSBzZXNzaW9uIHN0YXRlIGNoYW5nZXMgb2NjdXIgc3VjaCBhcyB3aGVuIHRoZSBzZXNzaW9uJ3MKLSAgICAgKiBxdWV1ZSBpcyBwYXVzZWQgb3IgcmVzdW1lZCBvciB3aGVuIHRoZSBzZXNzaW9uIGlzIHRlcm1pbmF0ZWQgb3IgaW52YWxpZGF0ZWQuCi0gICAgICogPC9wPjxwPgotICAgICAqIFJlZmVyIHRvIHtAbGluayBNZWRpYVNlc3Npb25TdGF0dXN9IGZvciBkZXRhaWxzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5DdXN0b20gbWVzc2FnZXM8L2gzPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBjbGllbnQgc3VwcGxpZXMgYSB7QGxpbmsgI0VYVFJBX01FU1NBR0VfUkVDRUlWRVIgbWVzc2FnZSByZWNlaXZlcn0KLSAgICAgKiB0aGVuIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyBtZXNzYWdlcyB0byB0aGUgcmVjZWl2ZXIKLSAgICAgKiB3aGVuIHRoZSBzZXNzaW9uIGhhcyBhbnkgbWVzc2FnZXMgdG8gc2VuZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUmVmZXIgdG8ge0BsaW5rICNFWFRSQV9NRVNTQUdFfSBmb3IgZGV0YWlscy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGNvdWxkIG5vdCBiZSBjcmVhdGVkLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TVEFSVF9TRVNTSU9OID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5TVEFSVF9TRVNTSU9OIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogR2V0IG1lZGlhIHNlc3Npb24gc3RhdHVzIGluZm9ybWF0aW9uLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBhc2tzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIHByb3ZpZGUgdXBkYXRlZCBzdGF0dXMgaW5mb3JtYXRpb24KLSAgICAgKiBhYm91dCB0aGUgc3BlY2lmaWVkIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUKLSAgICAgKiBzZXNzaW9uIHdob3NlIHN0YXR1cyBpcyB0byBiZSByZXRyaWV2ZWQuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZQotICAgICAqIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIGlzIHVua25vd24gb3Igbm8gbG9uZ2VyIHZhbGlkLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqIEBzZWUgI0VYVFJBX1NFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5HRVRfU0VTU0lPTl9TVEFUVVMiOwotCi0gICAgLyoqCi0gICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBFbmQgc2Vzc2lvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIGVuZCB0aGUgc3BlY2lmaWVkIHNlc3Npb24uCi0gICAgICogVGhlIHNlc3Npb24gYmVjb21lcyBubyBsb25nZXIgdmFsaWQgYW5kIHRoZSByb3V0ZSBjZWFzZXMgdG8gYmUgdW5kZXIgY29udHJvbAotICAgICAqIG9mIHRoZSBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJZiBzdWNjZXNzZnVsLCB0aGUgc3RhdHVzIG9mIHRoZSBzZXNzaW9uIGlzIHNldCB0bwotICAgICAqIHtAbGluayBNZWRpYVNlc3Npb25TdGF0dXMjU0VTU0lPTl9TVEFURV9FTkRFRH0gYW5kIGEgc3RhdHVzIHVwZGF0ZSBpcyBzZW50IHRvCi0gICAgICogdGhlIHNlc3Npb24ncyBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBZGRpdGlvbmFsbHksIHRoZSBzdGF0dXMgb2YgYWxsIG1lZGlhIGl0ZW1zIGluIHRoZSBxdWV1ZSBpcyBzZXQgdG8KLSAgICAgKiB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzI1BMQVlCQUNLX1NUQVRFX0NBTkNFTEVEIGNhbmNlbGVkfSBhbmQgYSBzdGF0dXMgdXBkYXRlIGlzIHNlbnQKLSAgICAgKiB0byB0aGUgYXBwcm9wcmlhdGUgc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnMgaW5kaWNhdGluZyB0aGUgbmV3IHN0YXR1cyBvZiBlYWNoIGl0ZW0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZgotICAgICAqIHRoZSBzZXNzaW9uIHRvIGVuZC4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlCi0gICAgICogc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIGlzIHVua25vd24gb3Igbm8gbG9uZ2VyIHZhbGlkLgotICAgICAqIEluIG90aGVyIHdvcmRzLCBpdCBpcyBhbiBlcnJvciB0byBhdHRlbXB0IHRvIGVuZCBhIHNlc3Npb24gb3RoZXIgdGhhbiB0aGUKLSAgICAgKiBjdXJyZW50IHNlc3Npb24uCi0gICAgICogPC9wPjx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0Ci0gICAgICogQHNlZSAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0VORF9TRVNTSU9OID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5FTkRfU0VTU0lPTiI7Ci0KLSAgICAvKioKLSAgICAgKiBDdXN0b20gbWVkaWEgY29udHJvbCBhY3Rpb246IFNlbmQge0BsaW5rICNFWFRSQV9NRVNTQUdFfS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBhc2tzIGEgcm91dGUgdG8gaGFuZGxlIGEgbWVzc2FnZSBkZXNjcmliZWQgYnkgRVhUUkFfTUVTU0FHRS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZSBzZXNzaW9uCi0gICAgICogdG8gd2hpY2ggd2lsbCBoYW5kbGUgdGhpcyBtZXNzYWdlLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX01FU1NBR0V9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbWVzc2FnZSB0byBzZW5kLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIEFueSBtZXNzYWdlcyBkZWZpbmVkIGJ5IGVhY2ggbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiBBbnkgZXJyb3IgbWVzc2FnZXMgZGVmaW5lZCBieSBlYWNoIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NFTkRfTUVTU0FHRSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uU0VORF9NRVNTQUdFIjsKLQotICAgIC8qIEV4dHJhcyBhbmQgcmVsYXRlZCBjb25zdGFudHMuICovCi0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIHNlc3Npb24gaWQuCi0gICAgICogPHA+Ci0gICAgICogQW4gb3BhcXVlIHVuaXF1ZSBpZGVudGlmaWVyIHRoYXQgaWRlbnRpZmllcyB0aGUgcmVtb3RlIHBsYXliYWNrIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFVzZWQgd2l0aCB2YXJpb3VzIGFjdGlvbnMgdG8gc3BlY2lmeSB0aGUgaWQgb2YgdGhlIG1lZGlhIHNlc3Npb24gdG8gYmUgY29udHJvbGxlZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSW5jbHVkZWQgaW4gYnJvYWRjYXN0IGludGVudHMgc2VudCB0bwotICAgICAqIHtAbGluayAjRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIGl0ZW0gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnN9IHRvIGlkZW50aWZ5Ci0gICAgICogdGhlIHNlc3Npb24gdG8gd2hpY2ggdGhlIGl0ZW0gaW4gcXVlc3Rpb24gYmVsb25ncy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSW5jbHVkZWQgaW4gYnJvYWRjYXN0IGludGVudHMgc2VudCB0bwotICAgICAqIHtAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIHNlc3Npb24gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnN9IHRvIGlkZW50aWZ5Ci0gICAgICogdGhlIHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHVuaXF1ZSBzdHJpbmcgdmFsdWUgZ2VuZXJhdGVkIGJ5IHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlcgotICAgICAqIHRvIHJlcHJlc2VudCBvbmUgcGFydGljdWxhciBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX1NFRUsKLSAgICAgKiBAc2VlICNBQ1RJT05fR0VUX1NUQVRVUwotICAgICAqIEBzZWUgI0FDVElPTl9QQVVTRQotICAgICAqIEBzZWUgI0FDVElPTl9SRVNVTUUKLSAgICAgKiBAc2VlICNBQ1RJT05fU1RPUAotICAgICAqIEBzZWUgI0FDVElPTl9TVEFSVF9TRVNTSU9OCi0gICAgICogQHNlZSAjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUwotICAgICAqIEBzZWUgI0FDVElPTl9FTkRfU0VTU0lPTgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NFU1NJT05fSUQgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLlNFU1NJT05fSUQiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBzZXNzaW9uIHN0YXR1cy4KLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5lZCBhcyBhIHJlc3VsdCBmcm9tIG1lZGlhIHNlc3Npb24gYWN0aW9ucyBzdWNoIGFzIHtAbGluayAjQUNUSU9OX1NUQVJUX1NFU1NJT059LAotICAgICAqIHtAbGluayAjQUNUSU9OX1BBVVNFfSwgYW5kIHtAbGluayAjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVU30KLSAgICAgKiB0byBkZXNjcmliZSB0aGUgc3RhdHVzIG9mIHRoZSBzcGVjaWZpZWQgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSW5jbHVkZWQgaW4gYnJvYWRjYXN0IGludGVudHMgc2VudCB0bwotICAgICAqIHtAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIHNlc3Npb24gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnN9IHRvIHByb3ZpZGUKLSAgICAgKiB1cGRhdGVkIHN0YXR1cyBpbmZvcm1hdGlvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIGFuZHJvaWQub3MuQnVuZGxlfSBvZiBkYXRhIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCBpbnRvCi0gICAgICogYSB7QGxpbmsgTWVkaWFTZXNzaW9uU3RhdHVzfSBvYmplY3QgdXNpbmcKLSAgICAgKiB7QGxpbmsgTWVkaWFTZXNzaW9uU3RhdHVzI2Zyb21CdW5kbGUgTWVkaWFTZXNzaW9uU3RhdHVzLmZyb21CdW5kbGV9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX1NFRUsKLSAgICAgKiBAc2VlICNBQ1RJT05fR0VUX1NUQVRVUwotICAgICAqIEBzZWUgI0FDVElPTl9QQVVTRQotICAgICAqIEBzZWUgI0FDVElPTl9SRVNVTUUKLSAgICAgKiBAc2VlICNBQ1RJT05fU1RPUAotICAgICAqIEBzZWUgI0FDVElPTl9TVEFSVF9TRVNTSU9OCi0gICAgICogQHNlZSAjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUwotICAgICAqIEBzZWUgI0FDVElPTl9FTkRfU0VTU0lPTgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NFU1NJT05fU1RBVFVTID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5TRVNTSU9OX1NUQVRVUyI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIHNlc3Npb24gc3RhdHVzIHVwZGF0ZSByZWNlaXZlci4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fU1RBUlRfU0VTU0lPTn0gdG8gc3BlY2lmeSBhIHtAbGluayBQZW5kaW5nSW50ZW50fSBmb3IgYQotICAgICAqIGJyb2FkY2FzdCByZWNlaXZlciB0aGF0IHdpbGwgcmVjZWl2ZSBzdGF0dXMgdXBkYXRlcyBhYm91dCB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogV2hlbmV2ZXIgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbiBjaGFuZ2VzLCB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgd2lsbAotICAgICAqIHNlbmQgYSBicm9hZGNhc3QgdG8gdGhlIHBlbmRpbmcgaW50ZW50IHdpdGggZXh0cmFzIHRoYXQgaWRlbnRpZnkgdGhlIHNlc3Npb24KLSAgICAgKiBpZCBhbmQgaXRzIHVwZGF0ZWQgc3RhdHVzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgUGVuZGluZ0ludGVudH0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPkJyb2FkY2FzdCBleHRyYXM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YKLSAgICAgKiB0aGUgc2Vzc2lvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlCi0gICAgICogc2Vzc2lvbiBhcyBhIGJ1bmRsZSB0aGF0IGNhbiBiZSBkZWNvZGVkIGludG8gYSB7QGxpbmsgTWVkaWFTZXNzaW9uU3RhdHVzfSBvYmplY3QuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9TVEFSVF9TRVNTSU9OCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5TRVNTSU9OX1NUQVRVU19VUERBVEVfUkVDRUlWRVIiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBtZXNzYWdlIHJlY2VpdmVyLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgI0FDVElPTl9TVEFSVF9TRVNTSU9OfSB0byBzcGVjaWZ5IGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9IGZvciBhCi0gICAgICogYnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgd2lsbCByZWNlaXZlIG1lc3NhZ2VzIGZyb20gdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFdoZW4gdGhlIG1lZGlhIHNlc3Npb24gaGFzIGEgbWVzc2FnZSB0byBzZW5kLCB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgd2lsbAotICAgICAqIHNlbmQgYSBicm9hZGNhc3QgdG8gdGhlIHBlbmRpbmcgaW50ZW50IHdpdGggZXh0cmFzIHRoYXQgaWRlbnRpZnkgdGhlIHNlc3Npb24KLSAgICAgKiBpZCBhbmQgaXRzIG1lc3NhZ2UuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHtAbGluayBQZW5kaW5nSW50ZW50fS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+QnJvYWRjYXN0IGV4dHJhczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZgotICAgICAqIHRoZSBzZXNzaW9uLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX01FU1NBR0V9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbWVzc2FnZSBmcm9tCi0gICAgICogdGhlIHNlc3Npb24gYXMgYSBidW5kbGUgb2JqZWN0LgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fU1RBUlRfU0VTU0lPTgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX01FU1NBR0VfUkVDRUlWRVIgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLk1FU1NBR0VfUkVDRUlWRVIiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBpdGVtIGlkLgotICAgICAqIDxwPgotICAgICAqIEFuIG9wYXF1ZSB1bmlxdWUgaWRlbnRpZmllciByZXR1cm5lZCBhcyBhIHJlc3VsdCBmcm9tIHtAbGluayAjQUNUSU9OX1BMQVl9IG9yCi0gICAgICoge0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gdGhhdCByZXByZXNlbnRzIHRoZSBtZWRpYSBpdGVtIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlCi0gICAgICogcGxheWJhY2sgcmVxdWVzdC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVXNlZCB3aXRoIHZhcmlvdXMgYWN0aW9ucyB0byBzcGVjaWZ5IHRoZSBpZCBvZiB0aGUgbWVkaWEgaXRlbSB0byBiZSBjb250cm9sbGVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJbmNsdWRlZCBpbiBicm9hZGNhc3QgaW50ZW50cyBzZW50IHRvCi0gICAgICoge0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnN9IHRvIGlkZW50aWZ5Ci0gICAgICogdGhlIGl0ZW0gaW4gcXVlc3Rpb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHVuaXF1ZSBzdHJpbmcgdmFsdWUgZ2VuZXJhdGVkIGJ5IHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlcgotICAgICAqIHRvIHJlcHJlc2VudCBvbmUgcGFydGljdWxhciBtZWRpYSBpdGVtLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX0VOUVVFVUUKLSAgICAgKiBAc2VlICNBQ1RJT05fU0VFSwotICAgICAqIEBzZWUgI0FDVElPTl9HRVRfU1RBVFVTCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSVRFTV9JRCA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuSVRFTV9JRCI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIGl0ZW0gc3RhdHVzLgotICAgICAqIDxwPgotICAgICAqIFJldHVybmVkIGFzIGEgcmVzdWx0IGZyb20gbWVkaWEgaXRlbSBhY3Rpb25zIHN1Y2ggYXMge0BsaW5rICNBQ1RJT05fUExBWX0sCi0gICAgICoge0BsaW5rICNBQ1RJT05fRU5RVUVVRX0sIHtAbGluayAjQUNUSU9OX1NFRUt9LCBhbmQge0BsaW5rICNBQ1RJT05fR0VUX1NUQVRVU30KLSAgICAgKiB0byBkZXNjcmliZSB0aGUgc3RhdHVzIG9mIHRoZSBzcGVjaWZpZWQgbWVkaWEgaXRlbS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSW5jbHVkZWQgaW4gYnJvYWRjYXN0IGludGVudHMgc2VudCB0bwotICAgICAqIHtAbGluayAjRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIGl0ZW0gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnN9IHRvIHByb3ZpZGUKLSAgICAgKiB1cGRhdGVkIHN0YXR1cyBpbmZvcm1hdGlvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIGFuZHJvaWQub3MuQnVuZGxlfSBvZiBkYXRhIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCBpbnRvCi0gICAgICogYSB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzfSBvYmplY3QgdXNpbmcKLSAgICAgKiB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzI2Zyb21CdW5kbGUgTWVkaWFJdGVtU3RhdHVzLmZyb21CdW5kbGV9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX0VOUVVFVUUKLSAgICAgKiBAc2VlICNBQ1RJT05fU0VFSwotICAgICAqIEBzZWUgI0FDVElPTl9HRVRfU1RBVFVTCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSVRFTV9TVEFUVVMgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLklURU1fU1RBVFVTIjsKLQotICAgIC8qKgotICAgICAqIExvbmcgZXh0cmE6IE1lZGlhIGl0ZW0gY29udGVudCBwb3NpdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fUExBWX0gb3Ige0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gdG8gc3BlY2lmeSB0aGUKLSAgICAgKiBzdGFydGluZyBwbGF5YmFjayBwb3NpdGlvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1NFRUt9IHRvIHNldCBhIG5ldyBwbGF5YmFjayBwb3NpdGlvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgbG9uZyBpbnRlZ2VyIG51bWJlciBvZiBtaWxsaXNlY29uZHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb250ZW50LgotICAgICAqIDxwPgotICAgICAqCi0gICAgICogQHNlZSAjQUNUSU9OX1BMQVkKLSAgICAgKiBAc2VlICNBQ1RJT05fRU5RVUVVRQotICAgICAqIEBzZWUgI0FDVElPTl9TRUVLCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSVRFTV9DT05URU5UX1BPU0lUSU9OID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5JVEVNX1BPU0lUSU9OIjsKLQotICAgIC8qKgotICAgICAqIEJ1bmRsZSBleHRyYTogTWVkaWEgaXRlbSBtZXRhZGF0YS4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fUExBWX0gb3Ige0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gdG8gc3BlY2lmeSBtZXRhZGF0YQotICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udGVudCBvZiBhIG1lZGlhIGl0ZW0uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHtAbGluayBhbmRyb2lkLm9zLkJ1bmRsZX0gb2YgbWV0YWRhdGEga2V5LXZhbHVlIHBhaXJzIGFzIGRlZmluZWQKLSAgICAgKiBpbiB7QGxpbmsgTWVkaWFJdGVtTWV0YWRhdGF9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX0VOUVVFVUUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9JVEVNX01FVEFEQVRBID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5JVEVNX01FVEFEQVRBIjsKLQotICAgIC8qKgotICAgICAqIEJ1bmRsZSBleHRyYTogSFRUUCByZXF1ZXN0IGhlYWRlcnMuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1BMQVl9IG9yIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IHRvIHNwZWNpZnkgSFRUUCByZXF1ZXN0Ci0gICAgICogaGVhZGVycyB0byBiZSBpbmNsdWRlZCB3aGVuIGZldGNoaW5nIHRvIHRoZSBjb250ZW50IGluZGljYXRlZCBieSB0aGUgbWVkaWEKLSAgICAgKiBpdGVtJ3MgZGF0YSBVcmkuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgZXh0cmEgbWF5IGJlIHVzZWQgdG8gcHJvdmlkZSBhdXRoZW50aWNhdGlvbiB0b2tlbnMgYW5kIG90aGVyCi0gICAgICogcGFyYW1ldGVycyB0byB0aGUgc2VydmVyIHNlcGFyYXRlbHkgZnJvbSB0aGUgbWVkaWEgaXRlbSdzIGRhdGEgVXJpLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgYW5kcm9pZC5vcy5CdW5kbGV9IG9mIHN0cmluZyBiYXNlZCBrZXktdmFsdWUgcGFpcnMKLSAgICAgKiB0aGF0IGRlc2NyaWJlIHRoZSBIVFRQIHJlcXVlc3QgaGVhZGVycy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI0FDVElPTl9FTlFVRVVFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSVRFTV9IVFRQX0hFQURFUlMgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLkhUVFBfSEVBREVSUyI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIGl0ZW0gc3RhdHVzIHVwZGF0ZSByZWNlaXZlci4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fUExBWX0gb3Ige0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gdG8gc3BlY2lmeQotICAgICAqIGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9IGZvciBhCi0gICAgICogYnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgd2lsbCByZWNlaXZlIHN0YXR1cyB1cGRhdGVzIGFib3V0IGEgcGFydGljdWxhcgotICAgICAqIG1lZGlhIGl0ZW0uCi0gICAgICogPC9wPjxwPgotICAgICAqIFdoZW5ldmVyIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIGl0ZW0gY2hhbmdlcywgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHdpbGwKLSAgICAgKiBzZW5kIGEgYnJvYWRjYXN0IHRvIHRoZSBwZW5kaW5nIGludGVudCB3aXRoIGV4dHJhcyB0aGF0IGlkZW50aWZ5IHRoZSBzZXNzaW9uCi0gICAgICogdG8gd2hpY2ggdGhlIGl0ZW0gYmVsb25ncywgdGhlIHNlc3Npb24gc3RhdHVzLCB0aGUgaXRlbSdzIGlkCi0gICAgICogYW5kIHRoZSBpdGVtJ3MgdXBkYXRlZCBzdGF0dXMuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSBzYW1lIHBlbmRpbmcgaW50ZW50IGFuZCBicm9hZGNhc3QgcmVjZWl2ZXIgbWF5IGJlIHNoYXJlZCBieSBhbnkgbnVtYmVyIG9mCi0gICAgICogbWVkaWEgaXRlbXMgc2luY2UgdGhlIGJyb2FkY2FzdCBpbnRlbnQgaW5jbHVkZXMgdGhlIG1lZGlhIHNlc3Npb24gaWQKLSAgICAgKiBhbmQgbWVkaWEgaXRlbSBpZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5Ccm9hZGNhc3QgZXh0cmFzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mCi0gICAgICogdGhlIHNlc3Npb24gdG8gd2hpY2ggdGhlIGl0ZW0gaW4gcXVlc3Rpb24gYmVsb25ncy4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihvcHRpb25hbCwgb2xkIGltcGxlbWVudGF0aW9ucyBtYXkKLSAgICAgKiBvbWl0IHRoaXMga2V5KTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG1lZGlhIGl0ZW0gaWQgb2YgdGhlCi0gICAgICogbWVkaWEgaXRlbSBpbiBxdWVzdGlvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU30gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlCi0gICAgICogaXRlbSBhcyBhIGJ1bmRsZSB0aGF0IGNhbiBiZSBkZWNvZGVkIGludG8gYSB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzfSBvYmplY3QuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX0VOUVVFVUUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLklURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUiI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IE1lc3NhZ2UuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1NFTkRfTUVTU0FHRX0sIGFuZCBpbmNsdWRlZCBpbiBicm9hZGNhc3QgaW50ZW50cyBzZW50IHRvCi0gICAgICoge0BsaW5rICNFWFRSQV9NRVNTQUdFX1JFQ0VJVkVSIG1lc3NhZ2UgcmVjZWl2ZXJzfSB0byBkZXNjcmliZSBhIG1lc3NhZ2UgYmV0d2VlbiBhCi0gICAgICogc2Vzc2lvbiBhbmQgYSBtZWRpYSByb3V0ZSBwcm92aWRlci4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIGFuZHJvaWQub3MuQnVuZGxlfS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfTUVTU0FHRSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5NRVNTQUdFIjsKLQotICAgIC8qKgotICAgICAqIEludGVnZXIgZXh0cmE6IEVycm9yIGNvZGUuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIGFsbCBtZWRpYSBjb250cm9sIHJlcXVlc3RzIHRvIGRlc2NyaWJlIHRoZSBjYXVzZSBvZiBhbiBlcnJvci4KLSAgICAgKiBUaGlzIGV4dHJhIG1heSBiZSBvbWl0dGVkIHdoZW4gdGhlIGVycm9yIGlzIHVua25vd24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBvbmUgb2Y6IHtAbGluayAjRVJST1JfVU5LTk9XTn0sIHtAbGluayAjRVJST1JfVU5TVVBQT1JURURfT1BFUkFUSU9OfSwKLSAgICAgKiB7QGxpbmsgI0VSUk9SX0lOVkFMSURfU0VTU0lPTl9JRH0sIHtAbGluayAjRVJST1JfSU5WQUxJRF9JVEVNX0lEfS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfRVJST1JfQ09ERSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5FUlJPUl9DT0RFIjsKLQotICAgIC8qKgotICAgICAqIEVycm9yIGNvZGU6IEFuIHVua25vd24gZXJyb3Igb2NjdXJyZWQuCi0gICAgICoKLSAgICAgKiBAc2VlICNFWFRSQV9FUlJPUl9DT0RFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfVU5LTk9XTiA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBFcnJvciBjb2RlOiBUaGUgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCi0gICAgICoKLSAgICAgKiBAc2VlICNFWFRSQV9FUlJPUl9DT0RFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfVU5TVVBQT1JURURfT1BFUkFUSU9OID0gMTsKLQotICAgIC8qKgotICAgICAqIEVycm9yIGNvZGU6IFRoZSBzZXNzaW9uIGlkIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCB3YXMgaW52YWxpZC4KLSAgICAgKgotICAgICAqIEBzZWUgI0VYVFJBX0VSUk9SX0NPREUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9JTlZBTElEX1NFU1NJT05fSUQgPSAyOwotCi0gICAgLyoqCi0gICAgICogRXJyb3IgY29kZTogVGhlIGl0ZW0gaWQgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IHdhcyBpbnZhbGlkLgotICAgICAqCi0gICAgICogQHNlZSAjRVhUUkFfRVJST1JfQ09ERQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0lOVkFMSURfSVRFTV9JRCA9IDM7Ci0KLSAgICBwcml2YXRlIE1lZGlhQ29udHJvbEludGVudCgpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFJdGVtTWV0YWRhdGEuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYUl0ZW1NZXRhZGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTJkZGI2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYUl0ZW1NZXRhZGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi0vKioKLSAqIENvbnN0YW50cyBmb3Igc3BlY2lmeWluZyBtZXRhZGF0YSBhYm91dCBhIG1lZGlhIGl0ZW0gYXMgYSB7QGxpbmsgQnVuZGxlfS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIHRoZSByZW1vdGUgcGxheWJhY2sgcHJvdG9jb2wgZGVzY3JpYmVkIGJ5IHRoZQotICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBNZWRpYUNvbnRyb2xJbnRlbnR9IGNsYXNzLgotICogPC9wPjxwPgotICogTWVkaWEgaXRlbSBtZXRhZGF0YSBpcyBkZXNjcmliZWQgYXMgYSBidW5kbGUgb2Yga2V5L3ZhbHVlIHBhaXJzIGFzIGRlZmluZWQKLSAqIGluIHRoaXMgY2xhc3MuICBUaGUgZG9jdW1lbnRhdGlvbiBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdmFsdWUgYXNzb2NpYXRlZAotICogd2l0aCBlYWNoIGtleS4KLSAqIDwvcD48cD4KLSAqIEFuIGFwcGxpY2F0aW9uIG1heSBzcGVjaWZ5IGFkZGl0aW9uYWwgY3VzdG9tIG1ldGFkYXRhIGtleXMgYnV0IHRoZXJlIGlzIG5vIGd1YXJhbnRlZQotICogdGhhdCB0aGV5IHdpbGwgYmUgcmVjb2duaXplZCBieSB0aGUgZGVzdGluYXRpb24uCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYUl0ZW1NZXRhZGF0YSB7Ci0gICAgLyoKLSAgICAgKiBOb3RlOiBNZWRpYU1ldGFkYXRhUmV0cmlldmVyIGFsc28gZGVmaW5lcyBhIGNvbGxlY3Rpb24gb2YgbWV0YWRhdGEga2V5cyB0aGF0IGNhbiBiZQotICAgICAqIHJldHJpZXZlZCBmcm9tIGEgY29udGVudCBzdHJlYW0gYWx0aG91Z2ggdGhlIHJlcHJlc2VudGF0aW9uIGlzIHNvbWV3aGF0IGRpZmZlcmVudCBoZXJlCi0gICAgICogc2luY2Ugd2UgYXJlIHNlbmRpbmcgdGhlIGRhdGEgdG8gYSByZW1vdGUgZW5kcG9pbnQuCi0gICAgICovCi0KLSAgICBwcml2YXRlIE1lZGlhSXRlbU1ldGFkYXRhKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0cmluZyBrZXk6IEFsYnVtIGFydGlzdCBuYW1lLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHN0cmluZyBzdWl0YWJsZSBmb3IgZGlzcGxheS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FMQlVNX0FSVElTVCA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkFMQlVNX0FSVElTVCI7Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcga2V5OiBBbGJ1bSB0aXRsZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBzdHJpbmcgc3VpdGFibGUgZm9yIGRpc3BsYXkuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BTEJVTV9USVRMRSA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkFMQlVNX1RJVExFIjsKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBrZXk6IEFydHdvcmsgVXJpLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHN0cmluZyBVUkkgZm9yIGFuIGltYWdlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZWRpYSBpdGVtLAotICAgICAqIHN1Y2ggYXMgYWxidW0gb3IgY292ZXIgYXJ0LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQVJUV09SS19VUkkgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5BUlRXT1JLX1VSSSI7Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcga2V5OiBBcnRpc3QgbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBzdHJpbmcgc3VpdGFibGUgZm9yIGRpc3BsYXkuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BUlRJU1QgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5BUlRJU1QiOwotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGtleTogQXV0aG9yIG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBkaXNwbGF5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQVVUSE9SID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQVVUSE9SIjsKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBrZXk6IENvbXBvc2VyIG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBkaXNwbGF5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NUE9TRVIgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5DT01QT1NFUiI7Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcga2V5OiBUcmFjayB0aXRsZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBzdHJpbmcgc3VpdGFibGUgZm9yIGRpc3BsYXkuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9USVRMRSA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLlRJVExFIjsKLQotICAgIC8qKgotICAgICAqIEludGVnZXIga2V5OiBZZWFyIG9mIHB1YmxpY2F0aW9uLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyIHllYXIgbnVtYmVyLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfWUVBUiA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLllFQVIiOwotCi0gICAgLyoqCi0gICAgICogSW50ZWdlciBrZXk6IFRyYWNrIG51bWJlciAoc3VjaCBhcyBhIHRyYWNrIG9uIGEgQ0QpLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIG9uZS1iYXNlZCBpbnRlZ2VyIHRyYWNrIG51bWJlci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RSQUNLX05VTUJFUiA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLlRSQUNLX05VTUJFUiI7Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlZ2VyIGtleTogRGlzYyBudW1iZXIgd2l0aGluIGEgY29sbGVjdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBvbmUtYmFzZWQgaW50ZWdlciBkaXNjIG51bWJlci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RJU0NfTlVNQkVSID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuRElTQ19OVU1CRVIiOwotCi0gICAgLyoqCi0gICAgICogTG9uZyBrZXk6IEl0ZW0gcGxheWJhY2sgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIDxjb2RlPmxvbmc8L2NvZGU+IG51bWJlciBvZiBtaWxsaXNlY29uZHMuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSBkdXJhdGlvbiBtZXRhZGF0YSBpcyBvbmx5IGEgaGludCB0byBlbmFibGUgYSByZW1vdGUgbWVkaWEgcGxheWVyIHRvCi0gICAgICogZ3Vlc3MgdGhlIGR1cmF0aW9uIG9mIHRoZSBjb250ZW50IGJlZm9yZSBpdCBhY3R1YWxseSBvcGVucyB0aGUgbWVkaWEgc3RyZWFtLgotICAgICAqIFRoZSByZW1vdGUgbWVkaWEgcGxheWVyIHNob3VsZCBzdGlsbCBkZXRlcm1pbmUgdGhlIGFjdHVhbCBjb250ZW50IGR1cmF0aW9uIGZyb20KLSAgICAgKiB0aGUgbWVkaWEgc3RyZWFtIGl0c2VsZiBpbmRlcGVuZGVudCBvZiB0aGUgdmFsdWUgdGhhdCBtYXkgYmUgc3BlY2lmaWVkIGJ5IHRoaXMga2V5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRFVSQVRJT04gPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5EVVJBVElPTiI7Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFJdGVtU3RhdHVzLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFJdGVtU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZWEyZDUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhSXRlbVN0YXR1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudXRpbC5UaW1lVXRpbHM7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBwbGF5YmFjayBzdGF0dXMgb2YgYSBtZWRpYSBpdGVtLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgdGhlIHJlbW90ZSBwbGF5YmFjayBwcm90b2NvbCBkZXNjcmliZWQgYnkgdGhlCi0gKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IE1lZGlhQ29udHJvbEludGVudH0gY2xhc3MuCi0gKiA8L3A+PHA+Ci0gKiBBcyBhIG1lZGlhIGl0ZW0gaXMgcGxheWVkLCBpdCB0cmFuc2l0aW9ucyB0aHJvdWdoIGEgc2VxdWVuY2Ugb2Ygc3RhdGVzIGluY2x1ZGluZzoKLSAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfUEVORElORyBwZW5kaW5nfSwge0BsaW5rICNQTEFZQkFDS19TVEFURV9CVUZGRVJJTkcgYnVmZmVyaW5nfSwKLSAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfUExBWUlORyBwbGF5aW5nfSwge0BsaW5rICNQTEFZQkFDS19TVEFURV9QQVVTRUQgcGF1c2VkfSwKLSAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfRklOSVNIRUQgZmluaXNoZWR9LCB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0NBTkNFTEVEIGNhbmNlbGVkfSwKLSAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfSU5WQUxJREFURUQgaW52YWxpZGF0ZWR9LCBhbmQKLSAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfRVJST1IgZXJyb3J9LiAgUmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gb2YgZWFjaCBzdGF0ZQotICogZm9yIGFuIGV4cGxhbmF0aW9uIG9mIGl0cyBtZWFuaW5nLgotICogPC9wPjxwPgotICogV2hpbGUgdGhlIGl0ZW0gaXMgcGxheWluZywgdGhlIHBsYXliYWNrIHN0YXR1cyBtYXkgYWxzbyBpbmNsdWRlIHByb2dyZXNzIGluZm9ybWF0aW9uCi0gKiBhYm91dCB0aGUge0BsaW5rICNnZXRDb250ZW50UG9zaXRpb24gY29udGVudCBwb3NpdGlvbn0gYW5kCi0gKiB7QGxpbmsgI2dldENvbnRlbnREdXJhdGlvbiBjb250ZW50IGR1cmF0aW9ufSBhbHRob3VnaCBub3QgYWxsIHJvdXRlIGRlc3RpbmF0aW9ucwotICogd2lsbCByZXBvcnQgaXQuCi0gKiA8L3A+PHA+Ci0gKiBUbyBtb25pdG9yIHBsYXliYWNrIHN0YXR1cywgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBzdXBwbHkgYSB7QGxpbmsgUGVuZGluZ0ludGVudH0gdG8gdXNlIGFzIHRoZQotICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgaXRlbSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyfQotICogZm9yIGEgZ2l2ZW4ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBwbGF5YmFjayByZXF1ZXN0fS4gIE5vdGUgdGhhdAotICogdGhlIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXIgd2lsbCBvbmx5IGJlIGludm9rZWQgZm9yIG1ham9yIHN0YXR1cyBjaGFuZ2VzIHN1Y2ggYXMgYQotICogdHJhbnNpdGlvbiBmcm9tIHBsYXlpbmcgdG8gZmluaXNoZWQuCi0gKiA8L3A+PHAgY2xhc3M9Im5vdGUiPgotICogVGhlIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXIgd2lsbCBub3QgYmUgaW52b2tlZCBmb3IgbWlub3IgcHJvZ3Jlc3MgdXBkYXRlcyBzdWNoIGFzCi0gKiBjaGFuZ2VzIHRvIHBsYXliYWNrIHBvc2l0aW9uIG9yIGR1cmF0aW9uLiAgSWYgdGhlIGFwcGxpY2F0aW9uIHdhbnRzIHRvIG1vbml0b3IKLSAqIHBsYXliYWNrIHByb2dyZXNzLCB0aGVuIGl0IG11c3QgdXNlIHRoZQotICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NUQVRVUyBnZXQgc3RhdHVzIHJlcXVlc3R9IHRvIHBvbGwgZm9yIGNoYW5nZXMKLSAqIHBlcmlvZGljYWxseSBhbmQgZXN0aW1hdGUgdGhlIHBsYXliYWNrIHBvc2l0aW9uIHdoaWxlIHBsYXlpbmcuICBOb3RlIHRoYXQgdGhlcmUgbWF5Ci0gKiBiZSBhIHNpZ25pZmljYW50IHBvd2VyIGltcGFjdCB0byBwb2xsaW5nIHNvIHRoZSBhcHBsaWNhdGlvbiBpcyBhZHZpc2VkIG9ubHkKLSAqIHRvIHBvbGwgd2hlbiB0aGUgc2NyZWVuIGlzIG9uIGFuZCBuZXZlciBtb3JlIHRoYW4gYWJvdXQgb25jZSBldmVyeSA1IHNlY29uZHMgb3Igc28uCi0gKiA8L3A+PHA+Ci0gKiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUgb25jZSBjcmVhdGVkIHVzaW5nIGEge0BsaW5rIEJ1aWxkZXJ9IGluc3RhbmNlLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFJdGVtU3RhdHVzIHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9USU1FU1RBTVAgPSAidGltZXN0YW1wIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QTEFZQkFDS19TVEFURSA9ICJwbGF5YmFja1N0YXRlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05URU5UX1BPU0lUSU9OID0gImNvbnRlbnRQb3NpdGlvbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09OVEVOVF9EVVJBVElPTiA9ICJjb250ZW50RHVyYXRpb24iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VYVFJBUyA9ICJleHRyYXMiOwotCi0gICAgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0KLSAgICAvKioKLSAgICAgKiBQbGF5YmFjayBzdGF0ZTogUGVuZGluZy4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgaXRlbSBoYXMgbm90IHlldCBzdGFydGVkIHBsYXliYWNrIGJ1dCB3aWxsIGJlIHBsYXllZCBldmVudHVhbGx5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9QRU5ESU5HID0gMDsKLQotICAgIC8qKgotICAgICAqIFBsYXliYWNrIHN0YXRlOiBQbGF5aW5nLgotICAgICAqIDxwPgotICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBpdGVtIGlzIGN1cnJlbnRseSBwbGF5aW5nLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9QTEFZSU5HID0gMTsKLQotICAgIC8qKgotICAgICAqIFBsYXliYWNrIHN0YXRlOiBQYXVzZWQuCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHRoYXQgcGxheWJhY2sgb2YgdGhlIG1lZGlhIGl0ZW0gaGFzIGJlZW4gcGF1c2VkLiAgUGxheWJhY2sgY2FuIGJlCi0gICAgICogcmVzdW1lZCB1c2luZyB0aGUge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVTVU1FIHJlc3VtZX0gYWN0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9QQVVTRUQgPSAyOwotCi0gICAgLyoqCi0gICAgICogUGxheWJhY2sgc3RhdGU6IEJ1ZmZlcmluZyBvciBzZWVraW5nIHRvIGEgbmV3IHBvc2l0aW9uLgotICAgICAqIDxwPgotICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBpdGVtIGhhcyBiZWVuIHRlbXBvcmFyaWx5IGludGVycnVwdGVkCi0gICAgICogdG8gZmV0Y2ggbW9yZSBjb250ZW50LiAgUGxheWJhY2sgd2lsbCBjb250aW51ZSBhdXRvbWF0aWNhbGx5Ci0gICAgICogd2hlbiBlbm91Z2ggY29udGVudCBoYXMgYmVlbiBidWZmZXJlZC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfQlVGRkVSSU5HID0gMzsKLQotICAgIC8qKgotICAgICAqIFBsYXliYWNrIHN0YXRlOiBGaW5pc2hlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgaXRlbSBwbGF5ZWQgdG8gdGhlIGVuZCBvZiB0aGUgY29udGVudCBhbmQgZmluaXNoZWQgbm9ybWFsbHkuCi0gICAgICogPC9wPjxwPgotICAgICAqIEEgZmluaXNoZWQgbWVkaWEgaXRlbSBjYW5ub3QgYmUgcmVzdW1lZC4gIFRvIHBsYXkgdGhlIGNvbnRlbnQgYWdhaW4sIHRoZSBhcHBsaWNhdGlvbgotICAgICAqIG11c3Qgc2VuZCBhIG5ldyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZIHBsYXl9IG9yCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfSBhY3Rpb24uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1NUQVRFX0ZJTklTSEVEID0gNDsKLQotICAgIC8qKgotICAgICAqIFBsYXliYWNrIHN0YXRlOiBDYW5jZWxlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgaXRlbSB3YXMgZXhwbGljaXRseSByZW1vdmVkIGZyb20gdGhlIHF1ZXVlIGJ5IHRoZQotICAgICAqIGFwcGxpY2F0aW9uLiAgSXRlbXMgbWF5IGJlIGNhbmNlbGVkIGFuZCByZW1vdmVkIGZyb20gdGhlIHF1ZXVlIHVzaW5nCi0gICAgICogdGhlIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFTU9WRSByZW1vdmV9IG9yCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RPUCBzdG9wfSBhY3Rpb24gb3IgYnkgaXNzdWluZwotICAgICAqIGFub3RoZXIge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBwbGF5fSBhY3Rpb24gdGhhdCBoYXMgdGhlCi0gICAgICogc2lkZS1lZmZlY3Qgb2YgY2xlYXJpbmcgdGhlIHF1ZXVlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBIGNhbmNlbGVkIG1lZGlhIGl0ZW0gY2Fubm90IGJlIHJlc3VtZWQuICBUbyBwbGF5IHRoZSBjb250ZW50IGFnYWluLCB0aGUKLSAgICAgKiBhcHBsaWNhdGlvbiBtdXN0IHNlbmQgYSBuZXcge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBwbGF5fSBvcgotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VOUVVFVUUgZW5xdWV1ZX0gYWN0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9DQU5DRUxFRCA9IDU7Ci0KLSAgICAvKioKLSAgICAgKiBQbGF5YmFjayBzdGF0ZTogSW52YWxpZGF0ZWQuCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIGl0ZW0gd2FzIGludmFsaWRhdGVkIHBlcm1hbmVudGx5IGFuZCBpbnZvbHVudGFyaWx5LgotICAgICAqIFRoaXMgc3RhdGUgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBtZWRpYSBpdGVtIHdhcyBpbnZhbGlkYXRlZCBhbmQgcmVtb3ZlZAotICAgICAqIGZyb20gdGhlIHF1ZXVlIGJlY2F1c2UgdGhlIHNlc3Npb24gdG8gd2hpY2ggaXQgYmVsb25ncyB3YXMgaW52YWxpZGF0ZWQKLSAgICAgKiAodHlwaWNhbGx5IGJ5IGFub3RoZXIgYXBwbGljYXRpb24gdGFraW5nIGNvbnRyb2wgb2YgdGhlIHJvdXRlKS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogV2hlbiBpbnZhbGlkYXRpb24gb2NjdXJzLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGdlbmVyYWxseSB3YWl0IGZvciB0aGUgdXNlcgotICAgICAqIHRvIHBlcmZvcm0gYW4gZXhwbGljaXQgYWN0aW9uLCBzdWNoIGFzIGNsaWNraW5nIG9uIGEgcGxheSBidXR0b24gaW4gdGhlIFVJLAotICAgICAqIGJlZm9yZSBjcmVhdGluZyBhIG5ldyBtZWRpYSBzZXNzaW9uIHRvIGF2b2lkIHVubmVjZXNzYXJpbHkgaW50ZXJydXB0aW5nCi0gICAgICogYW5vdGhlciBhcHBsaWNhdGlvbiB0aGF0IG1heSBoYXZlIGp1c3Qgc3RhcnRlZCB1c2luZyB0aGUgcm91dGUuCi0gICAgICogPC9wPjxwPgotICAgICAqIEFuIGludmFsaWRhdGVkIG1lZGlhIGl0ZW0gY2Fubm90IGJlIHJlc3VtZWQuICBUbyBwbGF5IHRoZSBjb250ZW50IGFnYWluLCB0aGUgYXBwbGljYXRpb24KLSAgICAgKiBtdXN0IHNlbmQgYSBuZXcge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBwbGF5fSBvcgotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VOUVVFVUUgZW5xdWV1ZX0gYWN0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9JTlZBTElEQVRFRCA9IDY7Ci0KLSAgICAvKioKLSAgICAgKiBQbGF5YmFjayBzdGF0ZTogUGxheWJhY2sgaGFsdGVkIG9yIGFib3J0ZWQgZHVlIHRvIGFuIGVycm9yLgotICAgICAqIDxwPgotICAgICAqIEV4YW1wbGVzIG9mIGVycm9ycyBhcmUgbm8gbmV0d29yayBjb25uZWN0aXZpdHkgd2hlbiBhdHRlbXB0aW5nIHRvIHJldHJpZXZlIGNvbnRlbnQKLSAgICAgKiBmcm9tIGEgc2VydmVyLCBvciBleHBpcmVkIHVzZXIgY3JlZGVudGlhbHMgd2hlbiB0cnlpbmcgdG8gcGxheSBzdWJzY3JpcHRpb24tYmFzZWQKLSAgICAgKiBjb250ZW50LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBIG1lZGlhIGl0ZW0gaW4gdGhlIGVycm9yIHN0YXRlIGNhbm5vdCBiZSByZXN1bWVkLiAgVG8gcGxheSB0aGUgY29udGVudCBhZ2FpbiwKLSAgICAgKiB0aGUgYXBwbGljYXRpb24gbXVzdCBzZW5kIGEgbmV3IHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgcGxheX0gb3IKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFIGVucXVldWV9IGFjdGlvbi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfRVJST1IgPSA3OwotCi0gICAgLyoqCi0gICAgICogSW50ZWdlciBleHRyYTogSFRUUCBzdGF0dXMgY29kZS4KLSAgICAgKiA8cD4KLSAgICAgKiBTcGVjaWZpZXMgdGhlIEhUVFAgc3RhdHVzIGNvZGUgdGhhdCB3YXMgZW5jb3VudGVyZWQgd2hlbiB0aGUgY29udGVudAotICAgICAqIHdhcyByZXF1ZXN0ZWQgYWZ0ZXIgYWxsIHJlZGlyZWN0cyB3ZXJlIGZvbGxvd2VkLiAgVGhpcyBrZXkgb25seSBuZWVkcyB0bwotICAgICAqIHNwZWNpZmllZCB3aGVuIHRoZSBjb250ZW50IHVyaSB1c2VzIHRoZSBIVFRQIG9yIEhUVFBTIHNjaGVtZSBhbmQgYW4gZXJyb3IKLSAgICAgKiBvY2N1cnJlZC4gIFRoaXMga2V5IG1heSBiZSBvbWl0dGVkIGlmIHRoZSBjb250ZW50IHdhcyBhYmxlIHRvIGJlIHBsYXllZAotICAgICAqIHN1Y2Nlc3NmdWxseTsgdGhlcmUgaXMgbm8gbmVlZCB0byByZXBvcnQgYSAyMDAgKE9LKSBzdGF0dXMgY29kZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGFuIGludGVnZXIgSFRUUCBzdGF0dXMgY29kZSwgc3VjaCBhcyA0MDEgKFVuYXV0aG9yaXplZCksCi0gICAgICogNDA0IChOb3QgRm91bmQpLCBvciA1MDAgKFNlcnZlciBFcnJvciksIG9yIDAgaWYgbm9uZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSFRUUF9TVEFUVVNfQ09ERSA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5zdGF0dXMuZXh0cmEuSFRUUF9TVEFUVVNfQ09ERSI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IEhUVFAgcmVzcG9uc2UgaGVhZGVycy4KLSAgICAgKiA8cD4KLSAgICAgKiBTcGVjaWZpZXMgdGhlIEhUVFAgcmVzcG9uc2UgaGVhZGVycyB0aGF0IHdlcmUgcmV0dXJuZWQgd2hlbiB0aGUgY29udGVudCB3YXMKLSAgICAgKiByZXF1ZXN0ZWQgZnJvbSB0aGUgbmV0d29yay4gIFRoZSBoZWFkZXJzIG1heSBpbmNsdWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICAgKiBhYm91dCB0aGUgY29udGVudCBvciBhbnkgZXJyb3JzIGNvbmRpdGlvbnMgdGhhdCB3ZXJlIGVuY291bnRlcmVkIHdoaWxlCi0gICAgICogdHJ5aW5nIHRvIGZldGNoIHRoZSBjb250ZW50LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgYW5kcm9pZC5vcy5CdW5kbGV9IG9mIHN0cmluZyBiYXNlZCBrZXktdmFsdWUgcGFpcnMKLSAgICAgKiB0aGF0IGRlc2NyaWJlIHRoZSBIVFRQIHJlc3BvbnNlIGhlYWRlcnMuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0hUVFBfUkVTUE9OU0VfSEVBREVSUyA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5zdGF0dXMuZXh0cmEuSFRUUF9SRVNQT05TRV9IRUFERVJTIjsKLQotICAgIE1lZGlhSXRlbVN0YXR1cyhCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIG1CdW5kbGUgPSBidW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGltZXN0YW1wIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RhdHVzIGluZm9ybWF0aW9uIGluCi0gICAgICogbWlsbGlzZWNvbmRzIHNpbmNlIGJvb3QgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWV9IHRpbWUgYmFzZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHN0YXR1cyB0aW1lc3RhbXAgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWUoKX0gdGltZSBiYXNlLgotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldFRpbWVzdGFtcCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0TG9uZyhLRVlfVElNRVNUQU1QKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwbGF5YmFjayBzdGF0ZSBvZiB0aGUgbWVkaWEgaXRlbS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHBsYXliYWNrIHN0YXRlLiAgT25lIG9mIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfUEVORElOR30sCi0gICAgICoge0BsaW5rICNQTEFZQkFDS19TVEFURV9QTEFZSU5HfSwge0BsaW5rICNQTEFZQkFDS19TVEFURV9QQVVTRUR9LAotICAgICAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfQlVGRkVSSU5HfSwge0BsaW5rICNQTEFZQkFDS19TVEFURV9GSU5JU0hFRH0sCi0gICAgICoge0BsaW5rICNQTEFZQkFDS19TVEFURV9DQU5DRUxFRH0sIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfSU5WQUxJREFURUR9LAotICAgICAqIG9yIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfRVJST1J9LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UGxheWJhY2tTdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9QTEFZQkFDS19TVEFURSwgUExBWUJBQ0tfU1RBVEVfRVJST1IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNvbnRlbnQgcGxheWJhY2sgcG9zaXRpb24gYXMgYSBsb25nIGludGVnZXIgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcwotICAgICAqIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgY29udGVudC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnQgcGxheWJhY2sgcG9zaXRpb24gaW4gbWlsbGlzZWNvbmRzLCBvciAtMSBpZiB1bmtub3duLgotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldENvbnRlbnRQb3NpdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0TG9uZyhLRVlfQ09OVEVOVF9QT1NJVElPTiwgLTEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRvdGFsIGR1cmF0aW9uIG9mIHRoZSBjb250ZW50IHRvIGJlIHBsYXllZCBhcyBhIGxvbmcgaW50ZWdlciBudW1iZXIgb2YKLSAgICAgKiBtaWxsaXNlY29uZHMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50IGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcywgb3IgLTEgaWYgdW5rbm93bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRDb250ZW50RHVyYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldExvbmcoS0VZX0NPTlRFTlRfRFVSQVRJT04sIC0xKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgYnVuZGxlIG9mIGV4dHJhcyBmb3IgdGhpcyBzdGF0dXMgb2JqZWN0LgotICAgICAqIFRoZSBleHRyYXMgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgYnV0IHRoZXkgbWF5IGJlIHVzZWQKLSAgICAgKiBieSBhcHBsaWNhdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXMoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJ1bmRsZShLRVlfRVhUUkFTKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIk1lZGlhSXRlbVN0YXR1c3sgIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoInRpbWVzdGFtcD0iKTsKLSAgICAgICAgVGltZVV0aWxzLmZvcm1hdER1cmF0aW9uKFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpIC0gZ2V0VGltZXN0YW1wKCksIHJlc3VsdCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiBtcyBhZ28iKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBwbGF5YmFja1N0YXRlPSIpLmFwcGVuZChwbGF5YmFja1N0YXRlVG9TdHJpbmcoZ2V0UGxheWJhY2tTdGF0ZSgpKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgY29udGVudFBvc2l0aW9uPSIpLmFwcGVuZChnZXRDb250ZW50UG9zaXRpb24oKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgY29udGVudER1cmF0aW9uPSIpLmFwcGVuZChnZXRDb250ZW50RHVyYXRpb24oKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZXh0cmFzPSIpLmFwcGVuZChnZXRFeHRyYXMoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiB9Iik7Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGxheWJhY2tTdGF0ZVRvU3RyaW5nKGludCBwbGF5YmFja1N0YXRlKSB7Ci0gICAgICAgIHN3aXRjaCAocGxheWJhY2tTdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBQTEFZQkFDS19TVEFURV9QRU5ESU5HOgotICAgICAgICAgICAgICAgIHJldHVybiAicGVuZGluZyI7Ci0gICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX0JVRkZFUklORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gImJ1ZmZlcmluZyI7Ci0gICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX1BMQVlJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJwbGF5aW5nIjsKLSAgICAgICAgICAgIGNhc2UgUExBWUJBQ0tfU1RBVEVfUEFVU0VEOgotICAgICAgICAgICAgICAgIHJldHVybiAicGF1c2VkIjsKLSAgICAgICAgICAgIGNhc2UgUExBWUJBQ0tfU1RBVEVfRklOSVNIRUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJmaW5pc2hlZCI7Ci0gICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX0NBTkNFTEVEOgotICAgICAgICAgICAgICAgIHJldHVybiAiY2FuY2VsZWQiOwotICAgICAgICAgICAgY2FzZSBQTEFZQkFDS19TVEFURV9JTlZBTElEQVRFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWRhdGVkIjsKLSAgICAgICAgICAgIGNhc2UgUExBWUJBQ0tfU1RBVEVfRVJST1I6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJlcnJvciI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcocGxheWJhY2tTdGF0ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBidW5kbGUgZm9yIHNlcmlhbGl6YXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0IHJlcHJlc2VudGVkIGFzIGEgYnVuZGxlLgotICAgICAqLwotICAgIHB1YmxpYyBCdW5kbGUgYXNCdW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZnJvbSBhIGJ1bmRsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidW5kbGUgVGhlIGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEByZXR1cm4gVGhlIG5ldyBpbnN0YW5jZSwgb3IgbnVsbCBpZiB0aGUgYnVuZGxlIHdhcyBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFJdGVtU3RhdHVzIGZyb21CdW5kbGUoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gYnVuZGxlICE9IG51bGwgPyBuZXcgTWVkaWFJdGVtU3RhdHVzKGJ1bmRsZSkgOiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkZXIgZm9yIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMgbWVkaWEgaXRlbSBzdGF0dXMgb2JqZWN0c30uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG1lZGlhIGl0ZW0gc3RhdHVzIGJ1aWxkZXIgdXNpbmcgdGhlIGN1cnJlbnQgdGltZSBhcyB0aGUKLSAgICAgICAgICogcmVmZXJlbmNlIHRpbWVzdGFtcC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHBsYXliYWNrU3RhdGUgVGhlIGl0ZW0gcGxheWJhY2sgc3RhdGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlcihpbnQgcGxheWJhY2tTdGF0ZSkgewotICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIHNldFRpbWVzdGFtcChTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSk7Ci0gICAgICAgICAgICBzZXRQbGF5YmFja1N0YXRlKHBsYXliYWNrU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSBpdGVtIHN0YXR1cyBidWlsZGVyIHdob3NlIGluaXRpYWwgY29udGVudHMgYXJlCi0gICAgICAgICAqIGNvcGllZCBmcm9tIGFuIGV4aXN0aW5nIHN0YXR1cy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKE1lZGlhSXRlbVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInN0YXR1cyBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKHN0YXR1cy5tQnVuZGxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSB0aW1lc3RhbXAgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdGF0dXMgaW5mb3JtYXRpb24gaW4KLSAgICAgICAgICogbWlsbGlzZWNvbmRzIHNpbmNlIGJvb3QgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWV9IHRpbWUgYmFzZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFRpbWVzdGFtcChsb25nIGVsYXBzZWRSZWFsdGltZVRpbWVzdGFtcCkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRMb25nKEtFWV9USU1FU1RBTVAsIGVsYXBzZWRSZWFsdGltZVRpbWVzdGFtcCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBwbGF5YmFjayBzdGF0ZSBvZiB0aGUgbWVkaWEgaXRlbS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFBsYXliYWNrU3RhdGUoaW50IHBsYXliYWNrU3RhdGUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9QTEFZQkFDS19TVEFURSwgcGxheWJhY2tTdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBjb250ZW50IHBsYXliYWNrIHBvc2l0aW9uIGFzIGEgbG9uZyBpbnRlZ2VyIG51bWJlciBvZiBtaWxsaXNlY29uZHMKLSAgICAgICAgICogZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb250ZW50LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Q29udGVudFBvc2l0aW9uKGxvbmcgcG9zaXRpb25NaWxsaXNlY29uZHMpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0TG9uZyhLRVlfQ09OVEVOVF9QT1NJVElPTiwgcG9zaXRpb25NaWxsaXNlY29uZHMpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgdG90YWwgZHVyYXRpb24gb2YgdGhlIGNvbnRlbnQgdG8gYmUgcGxheWVkIGFzIGEgbG9uZyBpbnRlZ2VyIG51bWJlcgotICAgICAgICAgKiBvZiBtaWxsaXNlY29uZHMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRDb250ZW50RHVyYXRpb24obG9uZyBkdXJhdGlvbk1pbGxpc2Vjb25kcykgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRMb25nKEtFWV9DT05URU5UX0RVUkFUSU9OLCBkdXJhdGlvbk1pbGxpc2Vjb25kcyk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIGEgYnVuZGxlIG9mIGV4dHJhcyBmb3IgdGhpcyBzdGF0dXMgb2JqZWN0LgotICAgICAgICAgKiBUaGUgZXh0cmFzIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgbWVkaWEgcm91dGVyIGJ1dCB0aGV5IG1heSBiZSB1c2VkCi0gICAgICAgICAqIGJ5IGFwcGxpY2F0aW9ucy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEV4dHJhcyhCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEJ1bmRsZShLRVlfRVhUUkFTLCBleHRyYXMpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQnVpbGRzIHRoZSB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzIG1lZGlhIGl0ZW0gc3RhdHVzIG9iamVjdH0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTWVkaWFJdGVtU3RhdHVzIGJ1aWxkKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUl0ZW1TdGF0dXMobUJ1bmRsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZURlc2NyaXB0b3IuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmM4NGZjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRTZW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUgcHJvcGVydGllcyBvZiBhIHJvdXRlLgotICogPHA+Ci0gKiBFYWNoIHJvdXRlIGlzIHVuaXF1ZWx5IGlkZW50aWZpZWQgYnkgYW4gb3BhcXVlIGlkIHN0cmluZy4gIFRoaXMgdG9rZW4KLSAqIG1heSB0YWtlIGFueSBmb3JtIGFzIGxvbmcgYXMgaXQgaXMgdW5pcXVlIHdpdGhpbiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gKiA8L3A+PHA+Ci0gKiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUgb25jZSBjcmVhdGVkIHVzaW5nIGEge0BsaW5rIEJ1aWxkZXJ9IGluc3RhbmNlLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZURlc2NyaXB0b3IgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0lEID0gImlkIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9HUk9VUF9NRU1CRVJfSURTID0gImdyb3VwTWVtYmVySWRzIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9OQU1FID0gIm5hbWUiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFU0NSSVBUSU9OID0gInN0YXR1cyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfSUNPTl9VUkkgPSAiaWNvblVyaSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRU5BQkxFRCA9ICJlbmFibGVkIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05ORUNUSU5HID0gImNvbm5lY3RpbmciOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTk5FQ1RJT05fU1RBVEUgPSAiY29ubmVjdGlvblN0YXRlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05UUk9MX0ZJTFRFUlMgPSAiY29udHJvbEZpbHRlcnMiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BMQVlCQUNLX1RZUEUgPSAicGxheWJhY2tUeXBlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QTEFZQkFDS19TVFJFQU0gPSAicGxheWJhY2tTdHJlYW0iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFVklDRV9UWVBFID0gImRldmljZVR5cGUiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZPTFVNRSA9ICJ2b2x1bWUiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZPTFVNRV9NQVggPSAidm9sdW1lTWF4IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WT0xVTUVfSEFORExJTkcgPSAidm9sdW1lSGFuZGxpbmciOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BSRVNFTlRBVElPTl9ESVNQTEFZX0lEID0gInByZXNlbnRhdGlvbkRpc3BsYXlJZCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRVhUUkFTID0gImV4dHJhcyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ0FOX0RJU0NPTk5FQ1QgPSAiY2FuRGlzY29ubmVjdCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VUVElOR1NfSU5URU5UID0gInNldHRpbmdzSW50ZW50IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NSU5fQ0xJRU5UX1ZFUlNJT04gPSAibWluQ2xpZW50VmVyc2lvbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUFYX0NMSUVOVF9WRVJTSU9OID0gIm1heENsaWVudFZlcnNpb24iOwotCi0gICAgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0gICAgTGlzdDxJbnRlbnRGaWx0ZXI+IG1Db250cm9sRmlsdGVyczsKLQotICAgIE1lZGlhUm91dGVEZXNjcmlwdG9yKEJ1bmRsZSBidW5kbGUsIExpc3Q8SW50ZW50RmlsdGVyPiBjb250cm9sRmlsdGVycykgewotICAgICAgICBtQnVuZGxlID0gYnVuZGxlOwotICAgICAgICBtQ29udHJvbEZpbHRlcnMgPSBjb250cm9sRmlsdGVyczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB1bmlxdWUgaWQgb2YgdGhlIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIFRoZSByb3V0ZSBpZCBhc3NvY2lhdGVkIHdpdGggYSByb3V0ZSBkZXNjcmlwdG9yIGZ1bmN0aW9ucyBhcyBhIHN0YWJsZQotICAgICAqIGlkZW50aWZpZXIgZm9yIHRoZSByb3V0ZSBhbmQgbXVzdCBiZSB1bmlxdWUgYW1vbmcgYWxsIHJvdXRlcyBvZmZlcmVkCi0gICAgICogYnkgdGhlIHByb3ZpZGVyLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRTdHJpbmcoS0VZX0lEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBncm91cCBtZW1iZXIgaWRzIG9mIHRoZSByb3V0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHJvdXRlIGRlc2NyaXB0b3IgdGhhdCBoYXMgb25lIG9yIG1vcmUgZ3JvdXAgbWVtYmVyIHJvdXRlIGlkcwotICAgICAqIHJlcHJlc2VudHMgYSByb3V0ZSBncm91cC4gQSBtZW1iZXIgcm91dGUgbWF5IGJlbG9uZyB0byBhbm90aGVyIGdyb3VwLgotICAgICAqIDwvcD4KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRHcm91cE1lbWJlcklkcygpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0U3RyaW5nQXJyYXlMaXN0KEtFWV9HUk9VUF9NRU1CRVJfSURTKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB1c2VyLXZpc2libGUgbmFtZSBvZiB0aGUgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJvdXRlIG5hbWUgaWRlbnRpZmllcyB0aGUgZGVzdGluYXRpb24gcmVwcmVzZW50ZWQgYnkgdGhlIHJvdXRlLgotICAgICAqIEl0IG1heSBiZSBhIHVzZXItc3VwcGxpZWQgbmFtZSwgYW4gYWxpYXMsIG9yIGRldmljZSBzZXJpYWwgbnVtYmVyLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldFN0cmluZyhLRVlfTkFNRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdXNlci12aXNpYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSByb3V0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcm91dGUgZGVzY3JpcHRpb24gZGVzY3JpYmVzIHRoZSBraW5kIG9mIGRlc3RpbmF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSByb3V0ZS4KLSAgICAgKiBJdCBtYXkgYmUgYSB1c2VyLXN1cHBsaWVkIHN0cmluZywgYSBtb2RlbCBudW1iZXIgb3IgYnJhbmQgb2YgZGV2aWNlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRTdHJpbmcoS0VZX0RFU0NSSVBUSU9OKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBVUkkgb2YgdGhlIGljb24gcmVwcmVzZW50aW5nIHRoaXMgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpY29uIHdpbGwgYmUgdXNlZCBpbiBwaWNrZXIgVUlzIGlmIGF2YWlsYWJsZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIFVyaSBnZXRJY29uVXJpKCkgewotICAgICAgICBTdHJpbmcgaWNvblVyaSA9IG1CdW5kbGUuZ2V0U3RyaW5nKEtFWV9JQ09OX1VSSSk7Ci0gICAgICAgIHJldHVybiBpY29uVXJpID09IG51bGwgPyBudWxsIDogVXJpLnBhcnNlKGljb25VcmkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgd2hldGhlciB0aGUgcm91dGUgaXMgZW5hYmxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJvb2xlYW4oS0VZX0VOQUJMRUQsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgd2hldGhlciB0aGUgcm91dGUgaXMgY29ubmVjdGluZy4KLSAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRDb25uZWN0aW9uU3RhdGV9IGluc3RlYWQKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGluZygpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0Qm9vbGVhbihLRVlfQ09OTkVDVElORywgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhlIHJvdXRlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGlzIHJvdXRlOgotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUR9LAotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HfSwgb3IKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldENvbm5lY3Rpb25TdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9DT05ORUNUSU9OX1NUQVRFLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mby5DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB3aGV0aGVyIHRoZSByb3V0ZSBjYW4gYmUgZGlzY29ubmVjdGVkIHdpdGhvdXQgc3RvcHBpbmcgcGxheWJhY2suCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJvdXRlIGNhbiBub3JtYWxseSBiZSBkaXNjb25uZWN0ZWQgd2l0aG91dCBzdG9wcGluZyBwbGF5YmFjayB3aGVuCi0gICAgICogdGhlIGRlc3RpbmF0aW9uIGRldmljZSBvbiB0aGUgcm91dGUgaXMgY29ubmVjdGVkIHRvIHR3byBvciBtb3JlIHNvdXJjZQotICAgICAqIGRldmljZXMuIFRoZSByb3V0ZSBwcm92aWRlciBzaG91bGQgdXBkYXRlIHRoZSByb3V0ZSBpbW1lZGlhdGVseSB3aGVuIHRoZQotICAgICAqIG51bWJlciBvZiBjb25uZWN0ZWQgZGV2aWNlcyBjaGFuZ2VzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUbyBzcGVjaWZ5IHRoYXQgdGhlIHJvdXRlIHNob3VsZCBkaXNjb25uZWN0IHdpdGhvdXQgc3RvcHBpbmcgdXNlCi0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyI3Vuc2VsZWN0KGludCl9IHdpdGgKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX0RJU0NPTk5FQ1RFRH0uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNhbkRpc2Nvbm5lY3RBbmRLZWVwUGxheWluZygpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0Qm9vbGVhbihLRVlfQ0FOX0RJU0NPTk5FQ1QsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIHtAbGluayBJbnRlbnRTZW5kZXJ9IGZvciBzdGFydGluZyBhIHNldHRpbmdzIGFjdGl2aXR5IGZvciB0aGlzCi0gICAgICogcm91dGUuIFRoZSBhY3Rpdml0eSBtYXkgaGF2ZSBzcGVjaWZpYyByb3V0ZSBzZXR0aW5ncyBvciBnZW5lcmFsIHNldHRpbmdzCi0gICAgICogZm9yIHRoZSBjb25uZWN0ZWQgZGV2aWNlIG9yIHJvdXRlIHByb3ZpZGVyLgotICAgICAqCi0gICAgICogQHJldHVybiBBbiB7QGxpbmsgSW50ZW50U2VuZGVyfSB0byBzdGFydCBhIHNldHRpbmdzIGFjdGl2aXR5LgotICAgICAqLwotICAgIHB1YmxpYyBJbnRlbnRTZW5kZXIgZ2V0U2V0dGluZ3NBY3Rpdml0eSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0UGFyY2VsYWJsZShLRVlfU0VUVElOR1NfSU5URU5UKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByb3V0ZSdzIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBpbnRlbnR9IGZpbHRlcnMuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8SW50ZW50RmlsdGVyPiBnZXRDb250cm9sRmlsdGVycygpIHsKLSAgICAgICAgZW5zdXJlQ29udHJvbEZpbHRlcnMoKTsKLSAgICAgICAgcmV0dXJuIG1Db250cm9sRmlsdGVyczsKLSAgICB9Ci0KLSAgICB2b2lkIGVuc3VyZUNvbnRyb2xGaWx0ZXJzKCkgewotICAgICAgICBpZiAobUNvbnRyb2xGaWx0ZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Db250cm9sRmlsdGVycyA9IG1CdW5kbGUuPEludGVudEZpbHRlcj5nZXRQYXJjZWxhYmxlQXJyYXlMaXN0KEtFWV9DT05UUk9MX0ZJTFRFUlMpOwotICAgICAgICAgICAgaWYgKG1Db250cm9sRmlsdGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xGaWx0ZXJzID0gQ29sbGVjdGlvbnMuPEludGVudEZpbHRlcj5lbXB0eUxpc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHR5cGUgb2YgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSB0eXBlIG9mIHBsYXliYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlOgotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jUExBWUJBQ0tfVFlQRV9MT0NBTH0gb3IKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI1BMQVlCQUNLX1RZUEVfUkVNT1RFfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFBsYXliYWNrVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9QTEFZQkFDS19UWVBFLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVFlQRV9SRU1PVEUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdXRlJ3MgcGxheWJhY2sgc3RyZWFtLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UGxheWJhY2tTdHJlYW0oKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfUExBWUJBQ0tfU1RSRUFNLCAtMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdHlwZSBvZiB0aGUgcmVjZWl2ZXIgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgdHlwZSBvZiB0aGUgcmVjZWl2ZXIgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlOgotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jREVWSUNFX1RZUEVfVFZ9IG9yCi0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNERVZJQ0VfVFlQRV9TUEVBS0VSfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldERldmljZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfREVWSUNFX1RZUEUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdXRlJ3MgY3VycmVudCB2b2x1bWUsIG9yIDAgaWYgdW5rbm93bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFZvbHVtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9WT0xVTUUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdXRlJ3MgbWF4aW11bSB2b2x1bWUsIG9yIDAgaWYgdW5rbm93bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFZvbHVtZU1heCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9WT0xVTUVfTUFYKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IGhvdyB2b2x1bWUgaXMgaGFuZGxlZCBvbiB0aGUgcm91dGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEhvdyB2b2x1bWUgaXMgaGFuZGxlZCBvbiB0aGUgcm91dGU6Ci0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19WT0xVTUVfRklYRUR9IG9yCi0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19WT0xVTUVfVkFSSUFCTEV9LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Vm9sdW1lSGFuZGxpbmcoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfVk9MVU1FX0hBTkRMSU5HLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19WT0xVTUVfRklYRUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdXRlJ3MgcHJlc2VudGF0aW9uIGRpc3BsYXkgaWQsIG9yIC0xIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRQcmVzZW50YXRpb25EaXNwbGF5SWQoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludCgKLSAgICAgICAgICAgICAgICBLRVlfUFJFU0VOVEFUSU9OX0RJU1BMQVlfSUQsIE1lZGlhUm91dGVyLlJvdXRlSW5mby5QUkVTRU5UQVRJT05fRElTUExBWV9JRF9OT05FKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgYnVuZGxlIG9mIGV4dHJhcyBmb3IgdGhpcyByb3V0ZSBkZXNjcmlwdG9yLgotICAgICAqIFRoZSBleHRyYXMgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgYnV0IHRoZXkgbWF5IGJlIHVzZWQKLSAgICAgKiBieSBhcHBsaWNhdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXMoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJ1bmRsZShLRVlfRVhUUkFTKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtaW5pbXVtIGNsaWVudCB2ZXJzaW9uIHJlcXVpcmVkIGZvciB0aGlzIHJvdXRlLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICBwdWJsaWMgaW50IGdldE1pbkNsaWVudFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfTUlOX0NMSUVOVF9WRVJTSU9OLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9WRVJTSU9OX1NUQVJUKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIGNsaWVudCB2ZXJzaW9uIHJlcXVpcmVkIGZvciB0aGlzIHJvdXRlLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICBwdWJsaWMgaW50IGdldE1heENsaWVudFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfTUFYX0NMSUVOVF9WRVJTSU9OLCBJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBkZXNjcmlwdG9yIGhhcyBhbGwgb2YgdGhlIHJlcXVpcmVkIGZpZWxkcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotICAgICAgICBlbnN1cmVDb250cm9sRmlsdGVycygpOwotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoZ2V0SWQoKSkKLSAgICAgICAgICAgICAgICB8fCBUZXh0VXRpbHMuaXNFbXB0eShnZXROYW1lKCkpCi0gICAgICAgICAgICAgICAgfHwgbUNvbnRyb2xGaWx0ZXJzLmNvbnRhaW5zKG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJNZWRpYVJvdXRlRGVzY3JpcHRvcnsgIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoImlkPSIpLmFwcGVuZChnZXRJZCgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBncm91cE1lbWJlcklkcz0iKS5hcHBlbmQoZ2V0R3JvdXBNZW1iZXJJZHMoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgbmFtZT0iKS5hcHBlbmQoZ2V0TmFtZSgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbj0iKS5hcHBlbmQoZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgaWNvblVyaT0iKS5hcHBlbmQoZ2V0SWNvblVyaSgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBpc0VuYWJsZWQ9IikuYXBwZW5kKGlzRW5hYmxlZCgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBpc0Nvbm5lY3Rpbmc9IikuYXBwZW5kKGlzQ29ubmVjdGluZygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBjb25uZWN0aW9uU3RhdGU9IikuYXBwZW5kKGdldENvbm5lY3Rpb25TdGF0ZSgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBjb250cm9sRmlsdGVycz0iKS5hcHBlbmQoQXJyYXlzLnRvU3RyaW5nKGdldENvbnRyb2xGaWx0ZXJzKCkudG9BcnJheSgpKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgcGxheWJhY2tUeXBlPSIpLmFwcGVuZChnZXRQbGF5YmFja1R5cGUoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgcGxheWJhY2tTdHJlYW09IikuYXBwZW5kKGdldFBsYXliYWNrU3RyZWFtKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGRldmljZVR5cGU9IikuYXBwZW5kKGdldERldmljZVR5cGUoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgdm9sdW1lPSIpLmFwcGVuZChnZXRWb2x1bWUoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgdm9sdW1lTWF4PSIpLmFwcGVuZChnZXRWb2x1bWVNYXgoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgdm9sdW1lSGFuZGxpbmc9IikuYXBwZW5kKGdldFZvbHVtZUhhbmRsaW5nKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHByZXNlbnRhdGlvbkRpc3BsYXlJZD0iKS5hcHBlbmQoZ2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGV4dHJhcz0iKS5hcHBlbmQoZ2V0RXh0cmFzKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGlzVmFsaWQ9IikuYXBwZW5kKGlzVmFsaWQoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgbWluQ2xpZW50VmVyc2lvbj0iKS5hcHBlbmQoZ2V0TWluQ2xpZW50VmVyc2lvbigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBtYXhDbGllbnRWZXJzaW9uPSIpLmFwcGVuZChnZXRNYXhDbGllbnRWZXJzaW9uKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIgfSIpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBidW5kbGUgZm9yIHNlcmlhbGl6YXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0IHJlcHJlc2VudGVkIGFzIGEgYnVuZGxlLgotICAgICAqLwotICAgIHB1YmxpYyBCdW5kbGUgYXNCdW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZnJvbSBhIGJ1bmRsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidW5kbGUgVGhlIGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEByZXR1cm4gVGhlIG5ldyBpbnN0YW5jZSwgb3IgbnVsbCBpZiB0aGUgYnVuZGxlIHdhcyBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFSb3V0ZURlc2NyaXB0b3IgZnJvbUJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIHJldHVybiBidW5kbGUgIT0gbnVsbCA/IG5ldyBNZWRpYVJvdXRlRGVzY3JpcHRvcihidW5kbGUsIG51bGwpIDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgTWVkaWFSb3V0ZURlc2NyaXB0b3IgbWVkaWEgcm91dGUgZGVzY3JpcHRvcnN9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0gICAgICAgIHByaXZhdGUgQXJyYXlMaXN0PFN0cmluZz4gbUdyb3VwTWVtYmVySWRzOwotICAgICAgICBwcml2YXRlIEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+IG1Db250cm9sRmlsdGVyczsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIGRlc2NyaXB0b3IgYnVpbGRlci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGlkIFRoZSB1bmlxdWUgaWQgb2YgdGhlIHJvdXRlLgotICAgICAgICAgKiBAcGFyYW0gbmFtZSBUaGUgdXNlci12aXNpYmxlIG5hbWUgb2YgdGhlIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIHNldElkKGlkKTsKLSAgICAgICAgICAgIHNldE5hbWUobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIGRlc2NyaXB0b3IgYnVpbGRlciB3aG9zZSBpbml0aWFsIGNvbnRlbnRzIGFyZQotICAgICAgICAgKiBjb3BpZWQgZnJvbSBhbiBleGlzdGluZyBkZXNjcmlwdG9yLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoTWVkaWFSb3V0ZURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImRlc2NyaXB0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZShkZXNjcmlwdG9yLm1CdW5kbGUpOwotCi0gICAgICAgICAgICBkZXNjcmlwdG9yLmVuc3VyZUNvbnRyb2xGaWx0ZXJzKCk7Ci0gICAgICAgICAgICBpZiAoIWRlc2NyaXB0b3IubUNvbnRyb2xGaWx0ZXJzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG1Db250cm9sRmlsdGVycyA9IG5ldyBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPihkZXNjcmlwdG9yLm1Db250cm9sRmlsdGVycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSByb3V0ZSBpZCBhc3NvY2lhdGVkIHdpdGggYSByb3V0ZSBkZXNjcmlwdG9yIGZ1bmN0aW9ucyBhcyBhIHN0YWJsZQotICAgICAgICAgKiBpZGVudGlmaWVyIGZvciB0aGUgcm91dGUgYW5kIG11c3QgYmUgdW5pcXVlIGFtb25nIGFsbCByb3V0ZXMgb2ZmZXJlZAotICAgICAgICAgKiBieSB0aGUgcHJvdmlkZXIuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldElkKFN0cmluZyBpZCkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRTdHJpbmcoS0VZX0lELCBpZCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIGEgZ3JvdXAgbWVtYmVyIGlkIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIEEgcm91dGUgZGVzY3JpcHRvciB0aGF0IGhhcyBvbmUgb3IgbW9yZSBncm91cCBtZW1iZXIgcm91dGUgaWRzCi0gICAgICAgICAqIHJlcHJlc2VudHMgYSByb3V0ZSBncm91cC4gQSBtZW1iZXIgcm91dGUgbWF5IGJlbG9uZyB0byBhbm90aGVyIGdyb3VwLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRHcm91cE1lbWJlcklkKFN0cmluZyBncm91cE1lbWJlcklkKSB7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoZ3JvdXBNZW1iZXJJZCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJncm91cE1lbWJlcklkIG11c3Qgbm90IGJlIGVtcHR5Iik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtR3JvdXBNZW1iZXJJZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Hcm91cE1lbWJlcklkcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtR3JvdXBNZW1iZXJJZHMuY29udGFpbnMoZ3JvdXBNZW1iZXJJZCkpIHsKLSAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJJZHMuYWRkKGdyb3VwTWVtYmVySWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkcyBhIGxpc3Qgb2YgZ3JvdXAgbWVtYmVyIGlkcyBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBBIHJvdXRlIGRlc2NyaXB0b3IgdGhhdCBoYXMgb25lIG9yIG1vcmUgZ3JvdXAgbWVtYmVyIHJvdXRlIGlkcwotICAgICAgICAgKiByZXByZXNlbnRzIGEgcm91dGUgZ3JvdXAuIEEgbWVtYmVyIHJvdXRlIG1heSBiZWxvbmcgdG8gYW5vdGhlciBncm91cC4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKiBAaGlkZQotICAgICAgICAgKi8KLSAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkR3JvdXBNZW1iZXJJZHMoQ29sbGVjdGlvbjxTdHJpbmc+IGdyb3VwTWVtYmVySWRzKSB7Ci0gICAgICAgICAgICBpZiAoZ3JvdXBNZW1iZXJJZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImdyb3VwTWVtYmVySWRzIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFncm91cE1lbWJlcklkcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBncm91cE1lbWJlcklkIDogZ3JvdXBNZW1iZXJJZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkR3JvdXBNZW1iZXJJZChncm91cE1lbWJlcklkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSB1c2VyLXZpc2libGUgbmFtZSBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGUgcm91dGUgbmFtZSBpZGVudGlmaWVzIHRoZSBkZXN0aW5hdGlvbiByZXByZXNlbnRlZCBieSB0aGUgcm91dGUuCi0gICAgICAgICAqIEl0IG1heSBiZSBhIHVzZXItc3VwcGxpZWQgbmFtZSwgYW4gYWxpYXMsIG9yIGRldmljZSBzZXJpYWwgbnVtYmVyLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dFN0cmluZyhLRVlfTkFNRSwgbmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSB1c2VyLXZpc2libGUgZGVzY3JpcHRpb24gb2YgdGhlIHJvdXRlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhlIHJvdXRlIGRlc2NyaXB0aW9uIGRlc2NyaWJlcyB0aGUga2luZCBvZiBkZXN0aW5hdGlvbiByZXByZXNlbnRlZCBieSB0aGUgcm91dGUuCi0gICAgICAgICAqIEl0IG1heSBiZSBhIHVzZXItc3VwcGxpZWQgc3RyaW5nLCBhIG1vZGVsIG51bWJlciBvciBicmFuZCBvZiBkZXZpY2UuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRTdHJpbmcoS0VZX0RFU0NSSVBUSU9OLCBkZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBVUkkgb2YgdGhlIGljb24gcmVwcmVzZW50aW5nIHRoaXMgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGlzIGljb24gd2lsbCBiZSB1c2VkIGluIHBpY2tlciBVSXMgaWYgYXZhaWxhYmxlLgotICAgICAgICAgKiA8L3A+PHA+Ci0gICAgICAgICAqIFRoZSBVUkkgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXRzOgotICAgICAgICAgKiA8dWw+Ci0gICAgICAgICAqIDxsaT5jb250ZW50ICh7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciNTQ0hFTUVfQ09OVEVOVH0pPC9saT4KLSAgICAgICAgICogPGxpPmFuZHJvaWQucmVzb3VyY2UgKHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyI1NDSEVNRV9BTkRST0lEX1JFU09VUkNFfSkKLSAgICAgICAgICogPC9saT4KLSAgICAgICAgICogPGxpPmZpbGUgKHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyI1NDSEVNRV9GSUxFfSk8L2xpPgotICAgICAgICAgKiA8L3VsPgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRJY29uVXJpKFVyaSBpY29uVXJpKSB7Ci0gICAgICAgICAgICBpZiAoaWNvblVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWNvblVyaSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dFN0cmluZyhLRVlfSUNPTl9VUkksIGljb25VcmkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIHJvdXRlIGlzIGVuYWJsZWQuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBEaXNhYmxlZCByb3V0ZXMgcmVwcmVzZW50IHJvdXRlcyB0aGF0IGEgcm91dGUgcHJvdmlkZXIga25vd3MgYWJvdXQsIHN1Y2ggYXMgcGFpcmVkCi0gICAgICAgICAqIFdpZmkgRGlzcGxheSByZWNlaXZlcnMsIGJ1dCB0aGF0IGFyZSBub3QgY3VycmVudGx5IGF2YWlsYWJsZSBmb3IgdXNlLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRCb29sZWFuKEtFWV9FTkFCTEVELCBlbmFibGVkKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgd2hldGhlciB0aGUgcm91dGUgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgY29ubmVjdGluZyBhbmQgaXMgbm90IHlldAotICAgICAgICAgKiByZWFkeSBmb3IgdXNlLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNzZXRDb25uZWN0aW9uU3RhdGV9IGluc3RlYWQuCi0gICAgICAgICAqLwotICAgICAgICBARGVwcmVjYXRlZAotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRDb25uZWN0aW5nKGJvb2xlYW4gY29ubmVjdGluZykgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRCb29sZWFuKEtFWV9DT05ORUNUSU5HLCBjb25uZWN0aW5nKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgY29ubmVjdGlvbiBzdGF0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNvbm5lY3Rpb25TdGF0ZSBUaGUgY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGUgcm91dGU6Ci0gICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUR9LAotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElOR30sIG9yCi0gICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUR9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Q29ubmVjdGlvblN0YXRlKGludCBjb25uZWN0aW9uU3RhdGUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9DT05ORUNUSU9OX1NUQVRFLCBjb25uZWN0aW9uU3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB3aGV0aGVyIHRoZSByb3V0ZSBjYW4gYmUgZGlzY29ubmVjdGVkIHdpdGhvdXQgc3RvcHBpbmcgcGxheWJhY2suCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRDYW5EaXNjb25uZWN0KGJvb2xlYW4gY2FuRGlzY29ubmVjdCkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRCb29sZWFuKEtFWV9DQU5fRElTQ09OTkVDVCwgY2FuRGlzY29ubmVjdCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIGFuIGludGVudCBzZW5kZXIgZm9yIGxhdW5jaGluZyB0aGUgc2V0dGluZ3MgYWN0aXZpdHkgZm9yIHRoaXMKLSAgICAgICAgICogcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRTZXR0aW5nc0FjdGl2aXR5KEludGVudFNlbmRlciBpcykgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRQYXJjZWxhYmxlKEtFWV9TRVRUSU5HU19JTlRFTlQsIGlzKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZHMgYSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50fSBmaWx0ZXIgZm9yIHRoZSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZENvbnRyb2xGaWx0ZXIoSW50ZW50RmlsdGVyIGZpbHRlcikgewotICAgICAgICAgICAgaWYgKGZpbHRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZmlsdGVyIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Db250cm9sRmlsdGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xGaWx0ZXJzID0gbmV3IEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1Db250cm9sRmlsdGVycy5jb250YWlucyhmaWx0ZXIpKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xGaWx0ZXJzLmFkZChmaWx0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkcyBhIGxpc3Qgb2Yge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGludGVudH0gZmlsdGVycyBmb3IgdGhlIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkQ29udHJvbEZpbHRlcnMoQ29sbGVjdGlvbjxJbnRlbnRGaWx0ZXI+IGZpbHRlcnMpIHsKLSAgICAgICAgICAgIGlmIChmaWx0ZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmaWx0ZXJzIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFmaWx0ZXJzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGZvciAoSW50ZW50RmlsdGVyIGZpbHRlciA6IGZpbHRlcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkQ29udHJvbEZpbHRlcihmaWx0ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgcGxheWJhY2sgdHlwZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHBsYXliYWNrVHlwZSBUaGUgcGxheWJhY2sgdHlwZSBvZiB0aGUgcm91dGU6Ci0gICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jUExBWUJBQ0tfVFlQRV9MT0NBTH0gb3IKLSAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19UWVBFX1JFTU9URX0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRQbGF5YmFja1R5cGUoaW50IHBsYXliYWNrVHlwZSkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX1BMQVlCQUNLX1RZUEUsIHBsYXliYWNrVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIHBsYXliYWNrIHN0cmVhbS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFBsYXliYWNrU3RyZWFtKGludCBwbGF5YmFja1N0cmVhbSkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX1BMQVlCQUNLX1NUUkVBTSwgcGxheWJhY2tTdHJlYW0pOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyByZWNlaXZlciBkZXZpY2UgdHlwZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGRldmljZVR5cGUgVGhlIHJlY2VpdmUgZGV2aWNlIHR5cGUgb2YgdGhlIHJvdXRlOgotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0RFVklDRV9UWVBFX1RWfSBvcgotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0RFVklDRV9UWVBFX1NQRUFLRVJ9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RGV2aWNlVHlwZShpbnQgZGV2aWNlVHlwZSkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX0RFVklDRV9UWVBFLCBkZXZpY2VUeXBlKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgY3VycmVudCB2b2x1bWUsIG9yIDAgaWYgdW5rbm93bi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFZvbHVtZShpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfVk9MVU1FLCB2b2x1bWUpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyBtYXhpbXVtIHZvbHVtZSwgb3IgMCBpZiB1bmtub3duLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Vm9sdW1lTWF4KGludCB2b2x1bWVNYXgpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9WT0xVTUVfTUFYLCB2b2x1bWVNYXgpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyB2b2x1bWUgaGFuZGxpbmcuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB2b2x1bWVIYW5kbGluZyBob3cgdm9sdW1lIGlzIGhhbmRsZWQgb24gdGhlIHJvdXRlOgotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI1BMQVlCQUNLX1ZPTFVNRV9GSVhFRH0gb3IKLSAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19WT0xVTUVfVkFSSUFCTEV9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Vm9sdW1lSGFuZGxpbmcoaW50IHZvbHVtZUhhbmRsaW5nKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfVk9MVU1FX0hBTkRMSU5HLCB2b2x1bWVIYW5kbGluZyk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIHByZXNlbnRhdGlvbiBkaXNwbGF5IGlkLCBvciAtMSBpZiBub25lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKGludCBwcmVzZW50YXRpb25EaXNwbGF5SWQpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9QUkVTRU5UQVRJT05fRElTUExBWV9JRCwgcHJlc2VudGF0aW9uRGlzcGxheUlkKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgYSBidW5kbGUgb2YgZXh0cmFzIGZvciB0aGlzIHJvdXRlIGRlc2NyaXB0b3IuCi0gICAgICAgICAqIFRoZSBleHRyYXMgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgYnV0IHRoZXkgbWF5IGJlIHVzZWQKLSAgICAgICAgICogYnkgYXBwbGljYXRpb25zLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RXh0cmFzKEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0QnVuZGxlKEtFWV9FWFRSQVMsIGV4dHJhcyk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIG1pbmltdW0gY2xpZW50IHZlcnNpb24uCi0gICAgICAgICAqIEEgcm91dGVyIHdob3NlIHZlcnNpb24gaXMgbG93ZXIgdGhhbiB0aGlzIHdpbGwgbm90IGJlIGFibGUgdG8gY29ubmVjdCB0byB0aGlzIHJvdXRlLgotICAgICAgICAgKiBAaGlkZQotICAgICAgICAgKi8KLSAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0TWluQ2xpZW50VmVyc2lvbihpbnQgbWluVmVyc2lvbikgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX01JTl9DTElFTlRfVkVSU0lPTiwgbWluVmVyc2lvbik7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIG1heGltdW0gY2xpZW50IHZlcnNpb24uCi0gICAgICAgICAqIEEgcm91dGVyIHdob3NlIHZlcnNpb24gaXMgaGlnaGVyIHRoYW4gdGhpcyB3aWxsIG5vdCBiZSBhYmxlIHRvIGNvbm5lY3QgdG8gdGhpcyByb3V0ZS4KLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldE1heENsaWVudFZlcnNpb24oaW50IG1heFZlcnNpb24pIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9NQVhfQ0xJRU5UX1ZFUlNJT04sIG1heFZlcnNpb24pOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQnVpbGRzIHRoZSB7QGxpbmsgTWVkaWFSb3V0ZURlc2NyaXB0b3IgbWVkaWEgcm91dGUgZGVzY3JpcHRvcn0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZURlc2NyaXB0b3IgYnVpbGQoKSB7Ci0gICAgICAgICAgICBpZiAobUNvbnRyb2xGaWx0ZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQnVuZGxlLnB1dFBhcmNlbGFibGVBcnJheUxpc3QoS0VZX0NPTlRST0xfRklMVEVSUywgbUNvbnRyb2xGaWx0ZXJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtR3JvdXBNZW1iZXJJZHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1CdW5kbGUucHV0U3RyaW5nQXJyYXlMaXN0KEtFWV9HUk9VUF9NRU1CRVJfSURTLCBtR3JvdXBNZW1iZXJJZHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVJvdXRlRGVzY3JpcHRvcihtQnVuZGxlLCBtQ29udHJvbEZpbHRlcnMpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM5NjI3Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBraW5kcyBvZiByb3V0ZXMgdGhhdCB0aGUgbWVkaWEgcm91dGVyIHdvdWxkIGxpa2UgdG8gZGlzY292ZXIKLSAqIGFuZCB3aGV0aGVyIHRvIHBlcmZvcm0gYWN0aXZlIHNjYW5uaW5nLgotICogPHA+Ci0gKiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUgb25jZSBjcmVhdGVkLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VMRUNUT1IgPSAic2VsZWN0b3IiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQUNUSVZFX1NDQU4gPSAiYWN0aXZlU2NhbiI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvcjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBkaXNjb3ZlcnkgcmVxdWVzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgcm91dGUgc2VsZWN0b3IgdGhhdCBzcGVjaWZpZXMgdGhlIGtpbmRzIG9mIHJvdXRlcyB0byBkaXNjb3Zlci4KLSAgICAgKiBAcGFyYW0gYWN0aXZlU2NhbiBUcnVlIGlmIGFjdGl2ZSBzY2FubmluZyBzaG91bGQgYmUgcGVyZm9ybWVkLgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdChNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IsIGJvb2xlYW4gYWN0aXZlU2NhbikgewotICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgbVNlbGVjdG9yID0gc2VsZWN0b3I7Ci0gICAgICAgIG1CdW5kbGUucHV0QnVuZGxlKEtFWV9TRUxFQ1RPUiwgc2VsZWN0b3IuYXNCdW5kbGUoKSk7Ci0gICAgICAgIG1CdW5kbGUucHV0Qm9vbGVhbihLRVlfQUNUSVZFX1NDQU4sIGFjdGl2ZVNjYW4pOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICBtQnVuZGxlID0gYnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdXRlIHNlbGVjdG9yIHRoYXQgc3BlY2lmaWVzIHRoZSBraW5kcyBvZiByb3V0ZXMgdG8gZGlzY292ZXIuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVTZWxlY3RvciBnZXRTZWxlY3RvcigpIHsKLSAgICAgICAgZW5zdXJlU2VsZWN0b3IoKTsKLSAgICAgICAgcmV0dXJuIG1TZWxlY3RvcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5zdXJlU2VsZWN0b3IoKSB7Ci0gICAgICAgIGlmIChtU2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLmZyb21CdW5kbGUobUJ1bmRsZS5nZXRCdW5kbGUoS0VZX1NFTEVDVE9SKSk7Ci0gICAgICAgICAgICBpZiAobVNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgYWN0aXZlIHNjYW5uaW5nIHNob3VsZCBiZSBwZXJmb3JtZWQuCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyI0NBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQWN0aXZlU2NhbigpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0Qm9vbGVhbihLRVlfQUNUSVZFX1NDQU4pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGlzY292ZXJ5IHJlcXVlc3QgaGFzIGFsbCBvZiB0aGUgcmVxdWlyZWQgZmllbGRzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0gICAgICAgIGVuc3VyZVNlbGVjdG9yKCk7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0b3IuaXNWYWxpZCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0KSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBvdGhlciA9IChNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdClvOwotICAgICAgICAgICAgcmV0dXJuIGdldFNlbGVjdG9yKCkuZXF1YWxzKG90aGVyLmdldFNlbGVjdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgICYmIGlzQWN0aXZlU2NhbigpID09IG90aGVyLmlzQWN0aXZlU2NhbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gZ2V0U2VsZWN0b3IoKS5oYXNoQ29kZSgpIF4gKGlzQWN0aXZlU2NhbigpID8gMSA6IDApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiRGlzY292ZXJ5UmVxdWVzdHsgc2VsZWN0b3I9IikuYXBwZW5kKGdldFNlbGVjdG9yKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGFjdGl2ZVNjYW49IikuYXBwZW5kKGlzQWN0aXZlU2NhbigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBpc1ZhbGlkPSIpLmFwcGVuZChpc1ZhbGlkKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIgfSIpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBidW5kbGUgZm9yIHNlcmlhbGl6YXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0IHJlcHJlc2VudGVkIGFzIGEgYnVuZGxlLgotICAgICAqLwotICAgIHB1YmxpYyBCdW5kbGUgYXNCdW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZnJvbSBhIGJ1bmRsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidW5kbGUgVGhlIGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEByZXR1cm4gVGhlIG5ldyBpbnN0YW5jZSwgb3IgbnVsbCBpZiB0aGUgYnVuZGxlIHdhcyBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgZnJvbUJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIHJldHVybiBidW5kbGUgIT0gbnVsbCA/IG5ldyBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdChidW5kbGUpIDogbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYTJlMWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnV0aWwuT2JqZWN0c0NvbXBhdDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjazsKLQotLyoqCi0gKiBNZWRpYSByb3V0ZSBwcm92aWRlcnMgYXJlIHVzZWQgdG8gcHVibGlzaCBhZGRpdGlvbmFsIG1lZGlhIHJvdXRlcyBmb3IKLSAqIHVzZSB3aXRoaW4gYW4gYXBwbGljYXRpb24uICBNZWRpYSByb3V0ZSBwcm92aWRlcnMgbWF5IGFsc28gYmUgZGVjbGFyZWQKLSAqIGFzIGEgc2VydmljZSB0byBwdWJsaXNoIGFkZGl0aW9uYWwgbWVkaWEgcm91dGVzIHRvIGFsbCBhcHBsaWNhdGlvbnMKLSAqIGluIHRoZSBzeXN0ZW0uCi0gKiA8cD4KLSAqIFRoZSBwdXJwb3NlIG9mIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgaXMgdG8gZGlzY292ZXIgbWVkaWEgcm91dGVzIHRoYXQgc2F0aXNmeQotICogdGhlIGNyaXRlcmlhIHNwZWNpZmllZCBieSB0aGUgY3VycmVudCB7QGxpbmsgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3R9IGFuZCBwdWJsaXNoIGEKLSAqIHtAbGluayBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yfSB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggcm91dGUgYnkgY2FsbGluZwotICoge0BsaW5rICNzZXREZXNjcmlwdG9yfSB0byBub3RpZnkgdGhlIGN1cnJlbnRseSByZWdpc3RlcmVkIHtAbGluayBDYWxsYmFja30uCi0gKiA8L3A+PHA+Ci0gKiBUaGUgcHJvdmlkZXIgc2hvdWxkIHdhdGNoIGZvciBjaGFuZ2VzIHRvIHRoZSBkaXNjb3ZlcnkgcmVxdWVzdCBieSBpbXBsZW1lbnRpbmcKLSAqIHtAbGluayAjb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZH0gYW5kIHVwZGF0aW5nIHRoZSBzZXQgb2Ygcm91dGVzIHRoYXQgaXQgaXMKLSAqIGF0dGVtcHRpbmcgdG8gZGlzY292ZXIuICBJdCBzaG91bGQgYWxzbyBoYW5kbGUgcm91dGUgY29udHJvbCByZXF1ZXN0cyBzdWNoCi0gKiBhcyB2b2x1bWUgY2hhbmdlcyBvciB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50c30KLSAqIGJ5IGltcGxlbWVudGluZyB7QGxpbmsgI29uQ3JlYXRlUm91dGVDb250cm9sbGVyfSB0byByZXR1cm4gYSB7QGxpbmsgUm91dGVDb250cm9sbGVyfQotICogZm9yIGEgcGFydGljdWxhciByb3V0ZS4KLSAqIDwvcD48cD4KLSAqIEEgbWVkaWEgcm91dGUgcHJvdmlkZXIgbWF5IGJlIHVzZWQgcHJpdmF0ZWx5IHdpdGhpbiB0aGUgc2NvcGUgb2YgYSBzaW5nbGUKLSAqIGFwcGxpY2F0aW9uIHByb2Nlc3MgYnkgY2FsbGluZyB7QGxpbmsgTWVkaWFSb3V0ZXIjYWRkUHJvdmlkZXIgTWVkaWFSb3V0ZXIuYWRkUHJvdmlkZXJ9Ci0gKiB0byBhZGQgaXQgdG8gdGhlIGxvY2FsIHtAbGluayBNZWRpYVJvdXRlcn0uICBBIG1lZGlhIHJvdXRlIHByb3ZpZGVyIG1heSBhbHNvIGJlIG1hZGUKLSAqIGF2YWlsYWJsZSBnbG9iYWxseSB0byBhbGwgYXBwbGljYXRpb25zIGJ5IHJlZ2lzdGVyaW5nIGEge0BsaW5rIE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2V9Ci0gKiBpbiB0aGUgcHJvdmlkZXIncyBtYW5pZmVzdC4gIFdoZW4gdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGlzIHJlZ2lzdGVyZWQKLSAqIGFzIGEgc2VydmljZSwgYWxsIGFwcGxpY2F0aW9ucyB0aGF0IHVzZSB0aGUgbWVkaWEgcm91dGVyIEFQSSB3aWxsIGJlIGFibGUgdG8KLSAqIGRpc2NvdmVyIGFuZCB1c2VkIHRoZSBwcm92aWRlcidzIHJvdXRlcyB3aXRob3V0IGhhdmluZyB0byBpbnN0YWxsIGFueXRoaW5nIGVsc2UuCi0gKiA8L3A+PHA+Ci0gKiBUaGlzIG9iamVjdCBtdXN0IG9ubHkgYmUgYWNjZXNzZWQgb24gdGhlIG1haW4gdGhyZWFkLgotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWVkaWFSb3V0ZVByb3ZpZGVyIHsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1TR19ERUxJVkVSX0RFU0NSSVBUT1JfQ0hBTkdFRCA9IDE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNU0dfREVMSVZFUl9ESVNDT1ZFUllfUkVRVUVTVF9DSEFOR0VEID0gMjsKLQotICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyTWV0YWRhdGEgbU1ldGFkYXRhOwotICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXJIYW5kbGVyIG1IYW5kbGVyID0gbmV3IFByb3ZpZGVySGFuZGxlcigpOwotCi0gICAgcHJpdmF0ZSBDYWxsYmFjayBtQ2FsbGJhY2s7Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IG1EaXNjb3ZlcnlSZXF1ZXN0OwotICAgIHByaXZhdGUgYm9vbGVhbiBtUGVuZGluZ0Rpc2NvdmVyeVJlcXVlc3RDaGFuZ2U7Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgbURlc2NyaXB0b3I7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1QZW5kaW5nRGVzY3JpcHRvckNoYW5nZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBwcm92aWRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlUHJvdmlkZXIoQE5vbk51bGwgQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgTWVkaWFSb3V0ZVByb3ZpZGVyKENvbnRleHQgY29udGV4dCwgUHJvdmlkZXJNZXRhZGF0YSBtZXRhZGF0YSkgewotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZXh0IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgaWYgKG1ldGFkYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG5ldyBQcm92aWRlck1ldGFkYXRhKG5ldyBDb21wb25lbnROYW1lKGNvbnRleHQsIGdldENsYXNzKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY29udGV4dCBvZiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIG1Db250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHByb3ZpZGVyJ3MgaGFuZGxlciB3aGljaCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIG1haW4gdGhyZWFkLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBIYW5kbGVyIGdldEhhbmRsZXIoKSB7Ci0gICAgICAgIHJldHVybiBtSGFuZGxlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHNvbWUgbWV0YWRhdGEgYWJvdXQgdGhlIHByb3ZpZGVyJ3MgaW1wbGVtZW50YXRpb24uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIFByb3ZpZGVyTWV0YWRhdGEgZ2V0TWV0YWRhdGEoKSB7Ci0gICAgICAgIHJldHVybiBtTWV0YWRhdGE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSBwcm92aWRlcidzIGRlc2NyaXB0b3IgY2hhbmdlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gdXNlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0Q2FsbGJhY2soQE51bGxhYmxlIENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIE1lZGlhUm91dGVyLmNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGRpc2NvdmVyeSByZXF1ZXN0IHdoaWNoIGluZm9ybXMgdGhlIHByb3ZpZGVyIGFib3V0IHRoZQotICAgICAqIGtpbmRzIG9mIHJvdXRlcyB0byBkaXNjb3ZlciBhbmQgd2hldGhlciB0byBwZXJmb3JtIGFjdGl2ZSBzY2FubmluZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgZGlzY292ZXJ5IHJlcXVlc3QsIG9yIG51bGwgaWYgbm8gZGlzY292ZXJ5IGlzIG5lZWRlZCBhdCB0aGlzIHRpbWUuCi0gICAgICoKLSAgICAgKiBAc2VlICNvbkRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkCi0gICAgICovCi0gICAgQE51bGxhYmxlCi0gICAgcHVibGljIGZpbmFsIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IGdldERpc2NvdmVyeVJlcXVlc3QoKSB7Ci0gICAgICAgIHJldHVybiBtRGlzY292ZXJ5UmVxdWVzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgZGlzY292ZXJ5IHJlcXVlc3QgdG8gaW5mb3JtIHRoZSBwcm92aWRlciBhYm91dCB0aGUga2luZHMgb2YKLSAgICAgKiByb3V0ZXMgdGhhdCBpdHMgY2xpZW50cyB3b3VsZCBsaWtlIHRvIGRpc2NvdmVyIGFuZCB3aGV0aGVyIHRvIHBlcmZvcm0gYWN0aXZlIHNjYW5uaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIGRpc2NvdmVyeSByZXF1ZXN0LCBvciBudWxsIGlmIG5vIGRpc2NvdmVyeSBpcyBuZWVkZWQgYXQgdGhpcyB0aW1lLgotICAgICAqCi0gICAgICogQHNlZSAjb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZAotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldERpc2NvdmVyeVJlcXVlc3QoTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBNZWRpYVJvdXRlci5jaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoT2JqZWN0c0NvbXBhdC5lcXVhbHMobURpc2NvdmVyeVJlcXVlc3QsIHJlcXVlc3QpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtRGlzY292ZXJ5UmVxdWVzdCA9IHJlcXVlc3Q7Ci0gICAgICAgIGlmICghbVBlbmRpbmdEaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlKSB7Ci0gICAgICAgICAgICBtUGVuZGluZ0Rpc2NvdmVyeVJlcXVlc3RDaGFuZ2UgPSB0cnVlOwotICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfREVMSVZFUl9ESVNDT1ZFUllfUkVRVUVTVF9DSEFOR0VEKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZGVsaXZlckRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkKCkgewotICAgICAgICBtUGVuZGluZ0Rpc2NvdmVyeVJlcXVlc3RDaGFuZ2UgPSBmYWxzZTsKLSAgICAgICAgb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZChtRGlzY292ZXJ5UmVxdWVzdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgd2hlbiB0aGUge0BsaW5rIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IGRpc2NvdmVyeSByZXF1ZXN0fQotICAgICAqIGhhcyBjaGFuZ2VkLgotICAgICAqIDxwPgotICAgICAqIFdoZW5ldmVyIGFuIGFwcGxpY2F0aW9ucyBjYWxscyB7QGxpbmsgTWVkaWFSb3V0ZXIjYWRkQ2FsbGJhY2t9IHRvIHJlZ2lzdGVyCi0gICAgICogYSBjYWxsYmFjaywgaXQgYWxzbyBwcm92aWRlcyBhIHNlbGVjdG9yIHRvIHNwZWNpZnkgdGhlIGtpbmRzIG9mIHJvdXRlcyB0aGF0Ci0gICAgICogaXQgaXMgaW50ZXJlc3RlZCBpbi4gIFRoZSBtZWRpYSByb3V0ZXIgY29tYmluZXMgYWxsIG9mIHRoZXNlIHNlbGVjdG9ycyB0b2dldGhlcgotICAgICAqIHRvIGdlbmVyYXRlIGEge0BsaW5rIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0fSBhbmQgbm90aWZpZXMgZWFjaCBwcm92aWRlciB3aGVuIGEgY2hhbmdlCi0gICAgICogb2NjdXJzIGJ5IGNhbGxpbmcge0BsaW5rICNzZXREaXNjb3ZlcnlSZXF1ZXN0fSB3aGljaCBwb3N0cyBhIG1lc3NhZ2UgdG8gaW52b2tlCi0gICAgICogdGhpcyBtZXRob2QgYXN5bmNocm9ub3VzbHkuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSBwcm92aWRlciBzaG91bGQgZXhhbWluZSB0aGUge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGNhdGVnb3JpZXN9Ci0gICAgICogaW4gdGhlIGRpc2NvdmVyeSByZXF1ZXN0J3Mge0BsaW5rIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3Rvcn0gdG8gZGV0ZXJtaW5lIHdoYXQKLSAgICAgKiBraW5kcyBvZiByb3V0ZXMgaXQgc2hvdWxkIHRyeSB0byBkaXNjb3ZlciBhbmQgd2hldGhlciBpdCBzaG91bGQgcGVyZm9ybSBhY3RpdmUKLSAgICAgKiBvciBwYXNzaXZlIHNjYW5zLiAgSW4gbWFueSBjYXNlcywgdGhlIHByb3ZpZGVyIG1heSBiZSBhYmxlIHRvIHNhdmUgcG93ZXIgYnkKLSAgICAgKiBkZXRlcm1pbmluZyB0aGF0IHRoZSBzZWxlY3RvciBkb2VzIG5vdCBjb250YWluIGFueSBjYXRlZ29yaWVzIHRoYXQgaXQgc3VwcG9ydHMKLSAgICAgKiBhbmQgaXQgY2FuIHRoZXJlZm9yZSBhdm9pZCBwZXJmb3JtaW5nIGFueSBzY2FucyBhdCBhbGwuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIG5ldyBkaXNjb3ZlcnkgcmVxdWVzdCwgb3IgbnVsbCBpZiBubyBkaXNjb3ZlcnkgaXMgbmVlZGVkIGF0IHRoaXMgdGltZS4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIjYWRkQ2FsbGJhY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkKEBOdWxsYWJsZSBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcHJvdmlkZXIncyBkZXNjcmlwdG9yLgotICAgICAqIDxwPgotICAgICAqIFRoZSBkZXNjcmlwdG9yIGRlc2NyaWJlcyB0aGUgc3RhdGUgb2YgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGFuZAotICAgICAqIHRoZSByb3V0ZXMgdGhhdCBpdCBwdWJsaXNoZXMuICBXYXRjaCBmb3IgY2hhbmdlcyB0byB0aGUgZGVzY3JpcHRvcgotICAgICAqIGJ5IHJlZ2lzdGVyaW5nIGEge0BsaW5rIENhbGxiYWNrIGNhbGxiYWNrfSB3aXRoIHtAbGluayAjc2V0Q2FsbGJhY2t9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEBzZWUgQ2FsbGJhY2sjb25EZXNjcmlwdG9yQ2hhbmdlZAotICAgICAqLwotICAgIEBOdWxsYWJsZQotICAgIHB1YmxpYyBmaW5hbCBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtRGVzY3JpcHRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBwcm92aWRlcidzIGRlc2NyaXB0b3IuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHByb3ZpZGVyIG11c3QgY2FsbCB0aGlzIG1ldGhvZCB0byBub3RpZnkgdGhlIGN1cnJlbnRseSByZWdpc3RlcmVkCi0gICAgICoge0BsaW5rIENhbGxiYWNrIGNhbGxiYWNrfSBhYm91dCB0aGUgY2hhbmdlIHRvIHRoZSBwcm92aWRlcidzIGRlc2NyaXB0b3IuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGRlc2NyaXB0b3IgVGhlIHVwZGF0ZWQgcm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHNlZSBDYWxsYmFjayNvbkRlc2NyaXB0b3JDaGFuZ2VkCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0RGVzY3JpcHRvcihATnVsbGFibGUgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgIE1lZGlhUm91dGVyLmNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIGlmIChtRGVzY3JpcHRvciAhPSBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBtRGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0gICAgICAgICAgICBpZiAoIW1QZW5kaW5nRGVzY3JpcHRvckNoYW5nZSkgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nRGVzY3JpcHRvckNoYW5nZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfREVMSVZFUl9ERVNDUklQVE9SX0NIQU5HRUQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBkZWxpdmVyRGVzY3JpcHRvckNoYW5nZWQoKSB7Ci0gICAgICAgIG1QZW5kaW5nRGVzY3JpcHRvckNoYW5nZSA9IGZhbHNlOwotCi0gICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uRGVzY3JpcHRvckNoYW5nZWQodGhpcywgbURlc2NyaXB0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgdG8gb2J0YWluIGEgcm91dGUgY29udHJvbGxlciBmb3IgYSBwYXJ0aWN1bGFyIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIFRoZSBtZWRpYSByb3V0ZXIgd2lsbCBpbnZva2UgdGhlIHtAbGluayBSb3V0ZUNvbnRyb2xsZXIjb25SZWxlYXNlfSBtZXRob2Qgb2YgdGhlIHJvdXRlCi0gICAgICogY29udHJvbGxlciB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQgdG8gYWxsb3cgaXQgdG8gZnJlZSBpdHMgcmVzb3VyY2VzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSByb3V0ZUlkIFRoZSB1bmlxdWUgaWQgb2YgdGhlIHJvdXRlLgotICAgICAqIEByZXR1cm4gVGhlIHJvdXRlIGNvbnRyb2xsZXIuICBSZXR1cm5zIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCByb3V0ZSBvciBpZiB0aGUgcm91dGUKLSAgICAgKiBjYW5ub3QgYmUgY29udHJvbGxlZCB1c2luZyB0aGUgcm91dGUgY29udHJvbGxlciBpbnRlcmZhY2UuCi0gICAgICovCi0gICAgQE51bGxhYmxlCi0gICAgcHVibGljIFJvdXRlQ29udHJvbGxlciBvbkNyZWF0ZVJvdXRlQ29udHJvbGxlcihATm9uTnVsbCBTdHJpbmcgcm91dGVJZCkgewotICAgICAgICBpZiAocm91dGVJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZUlkIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgdG8gb2J0YWluIGEgcm91dGUgY29udHJvbGxlciBmb3IgYSBwYXJ0aWN1bGFyIHJvdXRlIHdoaWNoIGlzIGEKLSAgICAgKiBtZW1iZXIgb2Yge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlR3JvdXB9LgotICAgICAqIDxwPgotICAgICAqIFRoZSBtZWRpYSByb3V0ZXIgd2lsbCBpbnZva2UgdGhlIHtAbGluayBSb3V0ZUNvbnRyb2xsZXIjb25SZWxlYXNlfSBtZXRob2Qgb2YgdGhlIHJvdXRlCi0gICAgICogY29udHJvbGxlciB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQgdG8gYWxsb3cgaXQgdG8gZnJlZSBpdHMgcmVzb3VyY2VzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSByb3V0ZUlkIFRoZSB1bmlxdWUgaWQgb2YgdGhlIG1lbWJlciByb3V0ZS4KLSAgICAgKiBAcGFyYW0gcm91dGVHcm91cElkIFRoZSB1bmlxdWUgaWQgb2YgdGhlIHJvdXRlIGdyb3VwLgotICAgICAqIEByZXR1cm4gVGhlIHJvdXRlIGNvbnRyb2xsZXIuICBSZXR1cm5zIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCByb3V0ZSBvciBpZiB0aGUgcm91dGUKLSAgICAgKiBjYW5ub3QgYmUgY29udHJvbGxlZCB1c2luZyB0aGUgcm91dGUgY29udHJvbGxlciBpbnRlcmZhY2UuCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgIEBOdWxsYWJsZQotICAgIHB1YmxpYyBSb3V0ZUNvbnRyb2xsZXIgb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoQE5vbk51bGwgU3RyaW5nIHJvdXRlSWQsCi0gICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgcm91dGVHcm91cElkKSB7Ci0gICAgICAgIGlmIChyb3V0ZUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlSWQgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocm91dGVHcm91cElkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlR3JvdXBJZCBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvbkNyZWF0ZVJvdXRlQ29udHJvbGxlcihyb3V0ZUlkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXNjcmliZXMgcHJvcGVydGllcyBvZiB0aGUgcm91dGUgcHJvdmlkZXIncyBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUgb25jZSBjcmVhdGVkLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFByb3ZpZGVyTWV0YWRhdGEgewotICAgICAgICBwcml2YXRlIGZpbmFsIENvbXBvbmVudE5hbWUgbUNvbXBvbmVudE5hbWU7Ci0KLSAgICAgICAgUHJvdmlkZXJNZXRhZGF0YShDb21wb25lbnROYW1lIGNvbXBvbmVudE5hbWUpIHsKLSAgICAgICAgICAgIGlmIChjb21wb25lbnROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21wb25lbnROYW1lIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Db21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBwcm92aWRlcidzIHBhY2thZ2UgbmFtZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbXBvbmVudE5hbWUuZ2V0UGFja2FnZU5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBwcm92aWRlcidzIGNvbXBvbmVudCBuYW1lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIENvbXBvbmVudE5hbWUgZ2V0Q29tcG9uZW50TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29tcG9uZW50TmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlck1ldGFkYXRheyBjb21wb25lbnROYW1lPSIKLSAgICAgICAgICAgICAgICAgICAgKyBtQ29tcG9uZW50TmFtZS5mbGF0dGVuVG9TaG9ydFN0cmluZygpICsgIiB9IjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb3ZpZGVzIGNvbnRyb2wgb3ZlciBhIHBhcnRpY3VsYXIgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIG1lZGlhIHJvdXRlciBvYnRhaW5zIGEgcm91dGUgY29udHJvbGxlciBmb3IgYSByb3V0ZSB3aGVuZXZlciBpdCBuZWVkcwotICAgICAqIHRvIGNvbnRyb2wgYSByb3V0ZS4gIFdoZW4gYSByb3V0ZSBpcyBzZWxlY3RlZCwgdGhlIG1lZGlhIHJvdXRlciBpbnZva2VzCi0gICAgICogdGhlIHtAbGluayAjb25TZWxlY3R9IG1ldGhvZCBvZiBpdHMgcm91dGUgY29udHJvbGxlci4gIFdoaWxlIHNlbGVjdGVkLAotICAgICAqIHRoZSBtZWRpYSByb3V0ZXIgbWF5IGNhbGwgb3RoZXIgbWV0aG9kcyBvZiB0aGUgcm91dGUgY29udHJvbGxlciB0bwotICAgICAqIHJlcXVlc3QgdGhhdCBpdCBwZXJmb3JtIGNlcnRhaW4gYWN0aW9ucyB0byB0aGUgcm91dGUuICBXaGVuIGEgcm91dGUgaXMKLSAgICAgKiB1bnNlbGVjdGVkLCB0aGUgbWVkaWEgcm91dGVyIGludm9rZXMgdGhlIHtAbGluayAjb25VbnNlbGVjdH0gbWV0aG9kIG9mIGl0cwotICAgICAqIHJvdXRlIGNvbnRyb2xsZXIuICBXaGVuIHRoZSBtZWRpYSByb3V0ZSBubyBsb25nZXIgbmVlZHMgdGhlIHJvdXRlIGNvbnRyb2xsZXIKLSAgICAgKiBpdCB3aWxsIGludm9rZSB0aGUge0BsaW5rICNvblJlbGVhc2V9IG1ldGhvZCB0byBhbGxvdyB0aGUgcm91dGUgY29udHJvbGxlcgotICAgICAqIHRvIGZyZWUgaXRzIHJlc291cmNlcy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlcmUgbWF5IGJlIG11bHRpcGxlIHJvdXRlIGNvbnRyb2xsZXJzIHNpbXVsdGFuZW91c2x5IGFjdGl2ZSBmb3IgdGhlCi0gICAgICogc2FtZSByb3V0ZS4gIEVhY2ggcm91dGUgY29udHJvbGxlciB3aWxsIGJlIHJlbGVhc2VkIHNlcGFyYXRlbHkuCi0gICAgICogPC9wPjxwPgotICAgICAqIEFsbCBvcGVyYXRpb25zIG9uIHRoZSByb3V0ZSBjb250cm9sbGVyIGFyZSBhc3luY2hyb25vdXMgYW5kCi0gICAgICogcmVzdWx0cyBhcmUgY29tbXVuaWNhdGVkIHZpYSBjYWxsYmFja3MuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgUm91dGVDb250cm9sbGVyIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlbGVhc2VzIHRoZSByb3V0ZSBjb250cm9sbGVyLCBhbGxvd2luZyBpdCB0byBmcmVlIGl0cyByZXNvdXJjZXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJlbGVhc2UoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2VsZWN0cyB0aGUgcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblNlbGVjdCgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBVbnNlbGVjdHMgdGhlIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25VbnNlbGVjdCgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBVbnNlbGVjdHMgdGhlIHJvdXRlIGFuZCBwcm92aWRlcyBhIHJlYXNvbi4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLSAgICAgICAgICogY2FsbHMge0BsaW5rICNvblVuc2VsZWN0KCl9LgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhlIHJlYXNvbiBwcm92aWRlZCB3aWxsIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICAgICAgICAgKiA8dWw+Ci0gICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1VOS05PV059PC9saT4KLSAgICAgICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fRElTQ09OTkVDVEVEfTwvbGk+Ci0gICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1NUT1BQRUR9PC9saT4KLSAgICAgICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fUk9VVEVfQ0hBTkdFRH08L2xpPgotICAgICAgICAgKiA8L3VsPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcmVhc29uIFRoZSByZWFzb24gZm9yIHVuc2VsZWN0aW5nIHRoZSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVW5zZWxlY3QoaW50IHJlYXNvbikgewotICAgICAgICAgICAgb25VbnNlbGVjdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlcXVlc3RzIHRvIHNldCB0aGUgdm9sdW1lIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHZvbHVtZSBUaGUgbmV3IHZvbHVtZSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIHtAbGluayBNZWRpYVJvdXRlRGVzY3JpcHRvciNnZXRWb2x1bWVNYXh9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25TZXRWb2x1bWUoaW50IHZvbHVtZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlcXVlc3RzIGFuIGluY3JlbWVudGFsIHZvbHVtZSB1cGRhdGUgZm9yIHRoZSByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGRlbHRhIFRoZSBkZWx0YSB0byBhZGQgdG8gdGhlIGN1cnJlbnQgdm9sdW1lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25VcGRhdGVWb2x1bWUoaW50IGRlbHRhKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUGVyZm9ybXMgYSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IHJlcXVlc3QKLSAgICAgICAgICogYXN5bmNocm9ub3VzbHkgb24gYmVoYWxmIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGludGVudCBBIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBpbnRlbnR9LgotICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSB7QGxpbmsgQ29udHJvbFJlcXVlc3RDYWxsYmFja30gdG8gaW52b2tlIHdpdGggdGhlIHJlc3VsdAotICAgICAgICAgKiBvZiB0aGUgcmVxdWVzdCwgb3IgbnVsbCBpZiBubyByZXN1bHQgaXMgcmVxdWlyZWQuCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY29udHJvbGxlciBpbnRlbmRzIHRvIGhhbmRsZSB0aGUgcmVxdWVzdCBhbmQgd2lsbAotICAgICAgICAgKiBpbnZva2UgdGhlIGNhbGxiYWNrIHdoZW4gZmluaXNoZWQuICBGYWxzZSBpZiB0aGUgY29udHJvbGxlciB3aWxsIG5vdAotICAgICAgICAgKiBoYW5kbGUgdGhlIHJlcXVlc3QgYW5kIHdpbGwgbm90IGludm9rZSB0aGUgY2FsbGJhY2suCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNvbnRyb2xSZXF1ZXN0KEludGVudCBpbnRlbnQsIEBOdWxsYWJsZSBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsYmFjayB3aGljaCBpcyBpbnZva2VkIHdoZW4gcm91dGUgaW5mb3JtYXRpb24gYmVjb21lcyBhdmFpbGFibGUgb3IgY2hhbmdlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIENhbGxiYWNrIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGluZm9ybWF0aW9uIGFib3V0IGEgcm91dGUgcHJvdmlkZXIgYW5kIGl0cyByb3V0ZXMgY2hhbmdlcy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHByb3ZpZGVyIFRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciB0aGF0IGNoYW5nZWQsIG5ldmVyIG51bGwuCi0gICAgICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yIFRoZSBuZXcgbWVkaWEgcm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciwgb3IgbnVsbCBpZiBub25lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25EZXNjcmlwdG9yQ2hhbmdlZChATm9uTnVsbCBNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgQE51bGxhYmxlIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBQcm92aWRlckhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKLSAgICAgICAgUHJvdmlkZXJIYW5kbGVyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19ERUxJVkVSX0RFU0NSSVBUT1JfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgZGVsaXZlckRlc2NyaXB0b3JDaGFuZ2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTVNHX0RFTElWRVJfRElTQ09WRVJZX1JFUVVFU1RfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgZGVsaXZlckRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMWNlMDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUgc3RhdGUgb2YgYSBtZWRpYSByb3V0ZSBwcm92aWRlciBhbmQgdGhlIHJvdXRlcyB0aGF0IGl0IHB1Ymxpc2hlcy4KLSAqIDxwPgotICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZCB1c2luZyBhIHtAbGluayBCdWlsZGVyfSBpbnN0YW5jZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUk9VVEVTID0gInJvdXRlcyI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotICAgIHByaXZhdGUgTGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gbVJvdXRlczsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvcihCdW5kbGUgYnVuZGxlLCBMaXN0PE1lZGlhUm91dGVEZXNjcmlwdG9yPiByb3V0ZXMpIHsKLSAgICAgICAgbUJ1bmRsZSA9IGJ1bmRsZTsKLSAgICAgICAgbVJvdXRlcyA9IHJvdXRlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIGFsbCByb3V0ZXMgdGhhdCB0aGlzIHByb3ZpZGVyIGhhcyBwdWJsaXNoZWQuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+IGdldFJvdXRlcygpIHsKLSAgICAgICAgZW5zdXJlUm91dGVzKCk7Ci0gICAgICAgIHJldHVybiBtUm91dGVzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbnN1cmVSb3V0ZXMoKSB7Ci0gICAgICAgIGlmIChtUm91dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIEFycmF5TGlzdDxCdW5kbGU+IHJvdXRlQnVuZGxlcyA9IG1CdW5kbGUuPEJ1bmRsZT5nZXRQYXJjZWxhYmxlQXJyYXlMaXN0KEtFWV9ST1VURVMpOwotICAgICAgICAgICAgaWYgKHJvdXRlQnVuZGxlcyA9PSBudWxsIHx8IHJvdXRlQnVuZGxlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVzID0gQ29sbGVjdGlvbnMuPE1lZGlhUm91dGVEZXNjcmlwdG9yPmVtcHR5TGlzdCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSByb3V0ZUJ1bmRsZXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIG1Sb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PE1lZGlhUm91dGVEZXNjcmlwdG9yPihjb3VudCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXMuYWRkKE1lZGlhUm91dGVEZXNjcmlwdG9yLmZyb21CdW5kbGUocm91dGVCdW5kbGVzLmdldChpKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciBhbmQgYWxsIG9mIHRoZSByb3V0ZXMgdGhhdAotICAgICAqIGl0IGNvbnRhaW5zIGhhdmUgYWxsIG9mIHRoZSByZXF1aXJlZCBmaWVsZHMuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyB2ZXJpZmljYXRpb24gaXMgZGVlcC4gIElmIHRoZSBwcm92aWRlciBkZXNjcmlwdG9yIGlzIGtub3duIHRvIGJlCi0gICAgICogdmFsaWQgdGhlbiBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNhbGwge0BsaW5rICNpc1ZhbGlkfSBvbiBlYWNoIG9mIGl0cyByb3V0ZXMuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0gICAgICAgIGVuc3VyZVJvdXRlcygpOwotICAgICAgICBmaW5hbCBpbnQgcm91dGVDb3VudCA9IG1Sb3V0ZXMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvdXRlQ291bnQ7IGkrKykgewotICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGUgPSBtUm91dGVzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBudWxsIHx8ICFyb3V0ZS5pc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yeyAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgicm91dGVzPSIpLmFwcGVuZCgKLSAgICAgICAgICAgICAgICBBcnJheXMudG9TdHJpbmcoZ2V0Um91dGVzKCkudG9BcnJheSgpKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgaXNWYWxpZD0iKS5hcHBlbmQoaXNWYWxpZCgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIH0iKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgYnVuZGxlIGZvciBzZXJpYWxpemF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCByZXByZXNlbnRlZCBhcyBhIGJ1bmRsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIGFzQnVuZGxlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYSBidW5kbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgaW5zdGFuY2UsIG9yIG51bGwgaWYgdGhlIGJ1bmRsZSB3YXMgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZnJvbUJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIHJldHVybiBidW5kbGUgIT0gbnVsbCA/IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yKGJ1bmRsZSwgbnVsbCkgOiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkZXIgZm9yIHtAbGluayBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3JzfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotICAgICAgICBwcml2YXRlIEFycmF5TGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gbVJvdXRlczsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhbiBlbXB0eSBtZWRpYSByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yIGJ1aWxkZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlcigpIHsKLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IgYnVpbGRlciB3aG9zZSBpbml0aWFsIGNvbnRlbnRzIGFyZQotICAgICAgICAgKiBjb3BpZWQgZnJvbSBhbiBleGlzdGluZyBkZXNjcmlwdG9yLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBpZiAoZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZGVzY3JpcHRvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKGRlc2NyaXB0b3IubUJ1bmRsZSk7Ci0KLSAgICAgICAgICAgIGRlc2NyaXB0b3IuZW5zdXJlUm91dGVzKCk7Ci0gICAgICAgICAgICBpZiAoIWRlc2NyaXB0b3IubVJvdXRlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVzID0gbmV3IEFycmF5TGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4oZGVzY3JpcHRvci5tUm91dGVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIGEgcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRSb3V0ZShNZWRpYVJvdXRlRGVzY3JpcHRvciByb3V0ZSkgewotICAgICAgICAgICAgaWYgKHJvdXRlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtUm91dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVzID0gbmV3IEFycmF5TGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4oKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVJvdXRlcy5jb250YWlucyhyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZSBkZXNjcmlwdG9yIGFscmVhZHkgYWRkZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Sb3V0ZXMuYWRkKHJvdXRlKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZHMgYSBsaXN0IG9mIHJvdXRlcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZFJvdXRlcyhDb2xsZWN0aW9uPE1lZGlhUm91dGVEZXNjcmlwdG9yPiByb3V0ZXMpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlcyBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghcm91dGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGZvciAoTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGUgOiByb3V0ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkUm91dGUocm91dGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIGxpc3Qgb2Ygcm91dGVzLgotICAgICAgICAgKi8KLSAgICAgICAgQnVpbGRlciBzZXRSb3V0ZXMoQ29sbGVjdGlvbjxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gcm91dGVzKSB7Ci0gICAgICAgICAgICBpZiAocm91dGVzID09IG51bGwgfHwgcm91dGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG1Sb3V0ZXMgPSBudWxsOwotICAgICAgICAgICAgICAgIG1CdW5kbGUucmVtb3ZlKEtFWV9ST1VURVMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUm91dGVzID0gbmV3IEFycmF5TGlzdDw+KHJvdXRlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCdWlsZHMgdGhlIHtAbGluayBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3J9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgYnVpbGQoKSB7Ci0gICAgICAgICAgICBpZiAobVJvdXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVJvdXRlcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0PEJ1bmRsZT4gcm91dGVCdW5kbGVzID0gbmV3IEFycmF5TGlzdDxCdW5kbGU+KGNvdW50KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgcm91dGVCdW5kbGVzLmFkZChtUm91dGVzLmdldChpKS5hc0J1bmRsZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUJ1bmRsZS5wdXRQYXJjZWxhYmxlQXJyYXlMaXN0KEtFWV9ST1VURVMsIHJvdXRlQnVuZGxlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IobUJ1bmRsZSwgbVJvdXRlcyk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlclByb3RvY29sLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJlOTM0My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2VuZ2VyOwotCi0vKioKLSAqIERlZmluZXMgdGhlIGNvbW11bmljYXRpb24gcHJvdG9jb2wgZm9yIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2VzLgotICovCi1hYnN0cmFjdCBjbGFzcyBNZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbCB7Ci0gICAgLyoqCi0gICAgICogVGhlIHtAbGluayBJbnRlbnR9IHRoYXQgbXVzdCBiZSBkZWNsYXJlZCBhcyBoYW5kbGVkIGJ5IHRoZSBzZXJ2aWNlLgotICAgICAqIFB1dCB0aGlzIGluIHlvdXIgbWFuaWZlc3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9JTlRFUkZBQ0UgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZSI7Ci0KLSAgICAvKgotICAgICAqIE1lc3NhZ2VzIHNlbnQgZnJvbSB0aGUgY2xpZW50IHRvIHRoZSBzZXJ2aWNlLgotICAgICAqIERPIE5PVCBSRU5VTUJFUiBUSEVTRSEKLSAgICAgKi8KLQotICAgIC8qKiAoY2xpZW50IHYxKQotICAgICAqIFJlZ2lzdGVyIGNsaWVudC4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gYXJnMiAgICA6IGNsaWVudCB2ZXJzaW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19SRUdJU1RFUiA9IDE7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBVbnJlZ2lzdGVyIGNsaWVudC4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfVU5SRUdJU1RFUiA9IDI7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBDcmVhdGUgcm91dGUgY29udHJvbGxlci4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gYXJnMiAgICA6IHJvdXRlIGNvbnRyb2xsZXIgaWQKLSAgICAgKiAtIENMSUVOVF9EQVRBX1JPVVRFX0lEIDogcm91dGUgaWQgc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19DUkVBVEVfUk9VVEVfQ09OVFJPTExFUiA9IDM7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBSZWxlYXNlIHJvdXRlIGNvbnRyb2xsZXIuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiByb3V0ZSBjb250cm9sbGVyIGlkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19SRUxFQVNFX1JPVVRFX0NPTlRST0xMRVIgPSA0OwotCi0gICAgLyoqIChjbGllbnQgdjEpCi0gICAgICogU2VsZWN0IHJvdXRlLgotICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBhcmcyICAgIDogcm91dGUgY29udHJvbGxlciBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfU0VMRUNUX1JPVVRFID0gNTsKLQotICAgIC8qKiAoY2xpZW50IHYxKQotICAgICAqIFVuc2VsZWN0IHJvdXRlLgotICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBhcmcyICAgIDogcm91dGUgY29udHJvbGxlciBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfVU5TRUxFQ1RfUk9VVEUgPSA2OwotCi0gICAgLyoqIChjbGllbnQgdjEpCi0gICAgICogU2V0IHJvdXRlIHZvbHVtZS4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gYXJnMiAgICA6IHJvdXRlIGNvbnRyb2xsZXIgaWQKLSAgICAgKiAtIENMSUVOVF9EQVRBX1ZPTFVNRSA6IHZvbHVtZSBpbnRlZ2VyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19TRVRfUk9VVEVfVk9MVU1FID0gNzsKLQotICAgIC8qKiAoY2xpZW50IHYxKQotICAgICAqIFVwZGF0ZSByb3V0ZSB2b2x1bWUuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiByb3V0ZSBjb250cm9sbGVyIGlkCi0gICAgICogLSBDTElFTlRfREFUQV9WT0xVTUUgOiB2b2x1bWUgZGVsdGEgaW50ZWdlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfVVBEQVRFX1JPVVRFX1ZPTFVNRSA9IDg7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBSb3V0ZSBjb250cm9sIHJlcXVlc3QuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiByb3V0ZSBjb250cm9sbGVyIGlkCi0gICAgICogLSBvYmogICAgIDogbWVkaWEgY29udHJvbCBpbnRlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX1JPVVRFX0NPTlRST0xfUkVRVUVTVCA9IDk7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBTZXRzIHRoZSBkaXNjb3ZlcnkgcmVxdWVzdC4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gb2JqICAgICA6IGRpc2NvdmVyeSByZXF1ZXN0IGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19TRVRfRElTQ09WRVJZX1JFUVVFU1QgPSAxMDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUVOVF9EQVRBX1JPVVRFX0lEID0gInJvdXRlSWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUVOVF9EQVRBX1JPVVRFX0xJQlJBUllfR1JPVVAgPSAicm91dGVHcm91cElkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfREFUQV9WT0xVTUUgPSAidm9sdW1lIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfREFUQV9VTlNFTEVDVF9SRUFTT04gPSAidW5zZWxlY3RSZWFzb24iOwotCi0gICAgLyoKLSAgICAgKiBNZXNzYWdlcyBzZW50IGZyb20gdGhlIHNlcnZpY2UgdG8gdGhlIGNsaWVudC4KLSAgICAgKiBETyBOT1QgUkVOVU1CRVIgVEhFU0UhCi0gICAgICovCi0KLSAgICAvKiogKHNlcnZpY2UgdjEpCi0gICAgICogR2VuZXJpYyBmYWlsdXJlIHNlbnQgaW4gcmVzcG9uc2UgdG8gYW55IHVucmVjb2duaXplZCBvciBtYWxmb3JtZWQgcmVxdWVzdC4KLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9NU0dfR0VORVJJQ19GQUlMVVJFID0gMDsKLQotICAgIC8qKiAoc2VydmljZSB2MSkKLSAgICAgKiBHZW5lcmljIGZhaWx1cmUgc2VudCBpbiByZXNwb25zZSB0byBhIHN1Y2Nlc3NmdWwgbWVzc2FnZS4KLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9NU0dfR0VORVJJQ19TVUNDRVNTID0gMTsKLQotICAgIC8qKiAoc2VydmljZSB2MSkKLSAgICAgKiBSZWdpc3RyYXRpb24gc3VjY2VlZGVkLgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiBzZXJ2ZXIgdmVyc2lvbgotICAgICAqIC0gb2JqICAgICA6IHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IgYnVuZGxlLCBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9NU0dfUkVHSVNURVJFRCA9IDI7Ci0KLSAgICAvKiogKHNlcnZpY2UgdjEpCi0gICAgICogUm91dGUgY29udHJvbCByZXF1ZXN0IHN1Y2Nlc3MgcmVzdWx0LgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIG9iaiAgICAgOiByZXN1bHQgZGF0YSBidW5kbGUsIG9yIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX01TR19DT05UUk9MX1JFUVVFU1RfU1VDQ0VFREVEID0gMzsKLQotICAgIC8qKiAoc2VydmljZSB2MSkKLSAgICAgKiBSb3V0ZSBjb250cm9sIHJlcXVlc3QgZmFpbHVyZSByZXN1bHQuCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gb2JqICAgICA6IHJlc3VsdCBkYXRhIGJ1bmRsZSwgb3IgbnVsbAotICAgICAqIC0gU0VSVklDRV9EQVRBX0VSUk9SOiBlcnJvciBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX0ZBSUxFRCA9IDQ7Ci0KLSAgICAvKiogKHNlcnZpY2UgdjEpCi0gICAgICogUm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciBjaGFuZ2VkLiAgKHVuc29saWNpdGVkIGV2ZW50KQotICAgICAqIC0gYXJnMSAgICA6IHJlc2VydmVkICgwKQotICAgICAqIC0gb2JqICAgICA6IHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IgYnVuZGxlLCBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9NU0dfREVTQ1JJUFRPUl9DSEFOR0VEID0gNTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfREFUQV9FUlJPUiA9ICJlcnJvciI7Ci0KLSAgICAvKgotICAgICAqIFJlY29nbml6ZWQgY2xpZW50IHZlcnNpb24gbnVtYmVycy4gIChSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4pCi0gICAgICogRE8gTk9UIFJFTlVNQkVSIFRIRVNFIQotICAgICAqLwotCi0gICAgLyoqCi0gICAgICogVGhlIGNsaWVudCB2ZXJzaW9uIHVzZWQgZnJvbSB0aGUgYmVnaW5uaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9WRVJTSU9OXzEgPSAxOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNsaWVudCB2ZXJzaW9uIHVzZWQgZnJvbSBzdXBwb3J0IGxpYnJhcnkgdjI0LjEuMC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfVkVSU0lPTl8yID0gMjsKLQotICAgIC8qKgotICAgICAqIFRoZSBjdXJyZW50IGNsaWVudCB2ZXJzaW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9WRVJTSU9OX0NVUlJFTlQgPSBDTElFTlRfVkVSU0lPTl8yOwotCi0gICAgLyoKLSAgICAgKiBSZWNvZ25pemVkIHNlcnZlciB2ZXJzaW9uIG51bWJlcnMuICAoUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuKQotICAgICAqIERPIE5PVCBSRU5VTUJFUiBUSEVTRSEKLSAgICAgKi8KLQotICAgIC8qKgotICAgICAqIFRoZSBzZXJ2aWNlIHZlcnNpb24gdXNlZCBmcm9tIHRoZSBiZWdpbm5pbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9WRVJTSU9OXzEgPSAxOwotCi0gICAgLyoqCi0gICAgICogVGhlIGN1cnJlbnQgc2VydmljZSB2ZXJzaW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfVkVSU0lPTl9DVVJSRU5UID0gU0VSVklDRV9WRVJTSU9OXzE7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9WRVJTSU9OX1NUQVJUID0gQ0xJRU5UX1ZFUlNJT05fMTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWVzc2VuZ2VyIG9iamVjdCBpcyB2YWxpZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgbWVzc2VuZ2VyIGNvbnN0cnVjdG9yIGFuZCB1bnBhcmNlbGluZyBjb2RlIGRvZXMgbm90IGNoZWNrIHdoZXRoZXIgdGhlCi0gICAgICogcHJvdmlkZWQgSUJpbmRlciBpcyBhIHZhbGlkIElNZXNzZW5nZXIgb2JqZWN0LiAgQXMgYSByZXN1bHQsIGl0J3MgcG9zc2libGUKLSAgICAgKiBmb3IgYSBwZWVyIHRvIHNlbmQgYW4gaW52YWxpZCBJQmluZGVyIHRoYXQgd2lsbCByZXN1bHQgaW4gY3Jhc2hlcyBkb3duc3RyZWFtLgotICAgICAqIFRoaXMgbWV0aG9kIGNoZWNrcyB0aGF0IHRoZSBtZXNzZW5nZXIgaXMgaW4gYSB2YWxpZCBzdGF0ZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRSZW1vdGVNZXNzZW5nZXIoTWVzc2VuZ2VyIG1lc3NlbmdlcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1lc3NlbmdlciAhPSBudWxsICYmIG1lc3Nlbmdlci5nZXRCaW5kZXIoKSAhPSBudWxsOwotICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gSWYgdGhlIG1lc3NlbmdlciB3YXMgY29uc3RydWN0ZWQgd2l0aCBhIGJpbmRlciBpbnRlcmZhY2Ugb3RoZXIgdGhhbgotICAgICAgICAgICAgLy8gSU1lc3NlbmdlciB0aGVuIHRoZSBjYWxsIHRvIGdldEJpbmRlcigpIHdpbGwgY3Jhc2ggd2l0aCBhbiBOUEUuCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZS5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlclNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjZGUxMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9EQVRBX1JPVVRFX0lEOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfREFUQV9ST1VURV9MSUJSQVJZX0dST1VQOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfREFUQV9VTlNFTEVDVF9SRUFTT047Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX0RBVEFfVk9MVU1FOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX0NSRUFURV9ST1VURV9DT05UUk9MTEVSOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9NU0dfUkVHSVNURVI7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfUkVMRUFTRV9ST1VURV9DT05UUk9MTEVSOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1JPVVRFX0NPTlRST0xfUkVRVUVTVDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfTVNHX1NFTEVDVF9ST1VURTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19TRVRfRElTQ09WRVJZX1JFUVVFU1Q7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfU0VUX1JPVVRFX1ZPTFVNRTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfTVNHX1VOUkVHSVNURVI7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfVU5TRUxFQ1RfUk9VVEU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfVVBEQVRFX1JPVVRFX1ZPTFVNRTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfVkVSU0lPTl8xOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLlNFUlZJQ0VfREFUQV9FUlJPUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX0ZBSUxFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX1NVQ0NFRURFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuU0VSVklDRV9NU0dfREVTQ1JJUFRPUl9DSEFOR0VEOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5TRVJWSUNFX01TR19HRU5FUklDX0ZBSUxVUkU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0dFTkVSSUNfU1VDQ0VTUzsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX01TR19SRUdJU1RFUkVEOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLlNFUlZJQ0VfVkVSU0lPTl9DVVJSRU5UOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLmlzVmFsaWRSZW1vdGVNZXNzZW5nZXI7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5EZWFkT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyLkRlYXRoUmVjaXBpZW50OwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NlbmdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5WaXNpYmxlRm9yVGVzdGluZzsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudXRpbC5PYmplY3RzQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZXMuCi0gKiA8cD4KLSAqIEEgbWVkaWEgcm91dGVyIHdpbGwgYmluZCB0byBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlcyB3aGVuIGEgY2FsbGJhY2sgaXMgYWRkZWQgdmlhCi0gKiB7QGxpbmsgTWVkaWFSb3V0ZXIjYWRkQ2FsbGJhY2soTWVkaWFSb3V0ZVNlbGVjdG9yLCBNZWRpYVJvdXRlci5DYWxsYmFjaywgaW50KX0gd2l0aCBhIGRpc2NvdmVyeQotICogZmxhZzoge0BsaW5rIE1lZGlhUm91dGVyI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUll9LAotICoge0BsaW5rIE1lZGlhUm91dGVyI0NBTExCQUNLX0ZMQUdfRk9SQ0VfRElTQ09WRVJZfSwgb3IKLSAqIHtAbGluayBNZWRpYVJvdXRlciNDQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU59LCBhbmQgd2lsbCB1bmJpbmQgd2hlbiB0aGUgY2FsbGJhY2sKLSAqIGlzIHJlbW92ZWQgdmlhIHtAbGluayBNZWRpYVJvdXRlciNyZW1vdmVDYWxsYmFjayhNZWRpYVJvdXRlci5DYWxsYmFjayl9LgotICogPC9wPjxwPgotICogVG8gaW1wbGVtZW50IHlvdXIgb3duIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2UsIGV4dGVuZCB0aGlzIGNsYXNzIGFuZAotICogb3ZlcnJpZGUgdGhlIHtAbGluayAjb25DcmVhdGVNZWRpYVJvdXRlUHJvdmlkZXJ9IG1ldGhvZCB0byByZXR1cm4gYW4KLSAqIGluc3RhbmNlIG9mIHlvdXIge0BsaW5rIE1lZGlhUm91dGVQcm92aWRlcn0uCi0gKiA8L3A+PHA+Ci0gKiBEZWNsYXJlIHlvdXIgbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZSBpbiB5b3VyIGFwcGxpY2F0aW9uIG1hbmlmZXN0Ci0gKiBsaWtlIHRoaXM6Ci0gKiA8L3A+Ci0gKiA8cHJlPgotICogICAmbHQ7c2VydmljZSBhbmRyb2lkOm5hbWU9Ii5NeU1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UiCi0gKiAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9teV9tZWRpYV9yb3V0ZV9wcm92aWRlcl9zZXJ2aWNlIj4KLSAqICAgICAgICZsdDtpbnRlbnQtZmlsdGVyPgotICogICAgICAgICAgICZsdDthY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UiIC8+Ci0gKiAgICAgICAmbHQ7L2ludGVudC1maWx0ZXI+Ci0gKiAgICZsdDsvc2VydmljZT4KLSAqIDwvcHJlPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZSBleHRlbmRzIFNlcnZpY2UgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVQcm92aWRlclNydiI7IC8vIG1heC4gMjMgY2hhcnMKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PENsaWVudFJlY29yZD4gbUNsaWVudHMgPSBuZXcgQXJyYXlMaXN0PENsaWVudFJlY29yZD4oKTsKLSAgICBwcml2YXRlIGZpbmFsIFJlY2VpdmVIYW5kbGVyIG1SZWNlaXZlSGFuZGxlcjsKLSAgICBwcml2YXRlIGZpbmFsIE1lc3NlbmdlciBtUmVjZWl2ZU1lc3NlbmdlcjsKLSAgICBmaW5hbCBQcml2YXRlSGFuZGxlciBtUHJpdmF0ZUhhbmRsZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlckNhbGxiYWNrIG1Qcm92aWRlckNhbGxiYWNrOwotCi0gICAgTWVkaWFSb3V0ZVByb3ZpZGVyIG1Qcm92aWRlcjsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IG1Db21wb3NpdGVEaXNjb3ZlcnlSZXF1ZXN0OwotCi0gICAgLyoqCi0gICAgICogVGhlIHtAbGluayBJbnRlbnR9IHRoYXQgbXVzdCBiZSBkZWNsYXJlZCBhcyBoYW5kbGVkIGJ5IHRoZSBzZXJ2aWNlLgotICAgICAqIFB1dCB0aGlzIGluIHlvdXIgbWFuaWZlc3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9JTlRFUkZBQ0UgPSBNZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX0lOVEVSRkFDRTsKLQotICAgIC8qCi0gICAgICogUHJpdmF0ZSBtZXNzYWdlcyB1c2VkIGludGVybmFsbHkuICAoWWVzLCB5b3UgY2FuIHJlbnVtYmVyIHRoZXNlLikKLSAgICAgKi8KLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgUFJJVkFURV9NU0dfQ0xJRU5UX0RJRUQgPSAxOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2UuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UoKSB7Ci0gICAgICAgIG1SZWNlaXZlSGFuZGxlciA9IG5ldyBSZWNlaXZlSGFuZGxlcih0aGlzKTsKLSAgICAgICAgbVJlY2VpdmVNZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKG1SZWNlaXZlSGFuZGxlcik7Ci0gICAgICAgIG1Qcml2YXRlSGFuZGxlciA9IG5ldyBQcml2YXRlSGFuZGxlcigpOwotICAgICAgICBtUHJvdmlkZXJDYWxsYmFjayA9IG5ldyBQcm92aWRlckNhbGxiYWNrKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBzeXN0ZW0gd2hlbiBpdCBpcyB0aW1lIHRvIGNyZWF0ZSB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBvZmZlcmVkIGJ5IHRoaXMgc2VydmljZSwgb3IgbnVsbCBpZgotICAgICAqIHRoaXMgc2VydmljZSBoYXMgZGVjaWRlZCBub3QgdG8gb2ZmZXIgYSBtZWRpYSByb3V0ZSBwcm92aWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgTWVkaWFSb3V0ZVByb3ZpZGVyIG9uQ3JlYXRlTWVkaWFSb3V0ZVByb3ZpZGVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBvZmZlcmVkIGJ5IHRoaXMgc2VydmljZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIG9mZmVyZWQgYnkgdGhpcyBzZXJ2aWNlLCBvciBudWxsIGlmCi0gICAgICogaXQgaGFzIG5vdCB5ZXQgYmVlbiBjcmVhdGVkLgotICAgICAqCi0gICAgICogQHNlZSAjb25DcmVhdGVNZWRpYVJvdXRlUHJvdmlkZXIoKQotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlUHJvdmlkZXIgZ2V0TWVkaWFSb3V0ZVByb3ZpZGVyKCkgewotICAgICAgICByZXR1cm4gbVByb3ZpZGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJQmluZGVyIG9uQmluZChJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKFNFUlZJQ0VfSU5URVJGQUNFKSkgewotICAgICAgICAgICAgaWYgKG1Qcm92aWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyID0gb25DcmVhdGVNZWRpYVJvdXRlUHJvdmlkZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvdmlkZXJQYWNrYWdlID0gcHJvdmlkZXIuZ2V0TWV0YWRhdGEoKS5nZXRQYWNrYWdlTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXByb3ZpZGVyUGFja2FnZS5lcXVhbHMoZ2V0UGFja2FnZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm9uQ3JlYXRlTWVkaWFSb3V0ZVByb3ZpZGVyKCkgcmV0dXJuZWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJhIHByb3ZpZGVyIHdob3NlIHBhY2thZ2UgbmFtZSBkb2VzIG5vdCBtYXRjaCB0aGUgcGFja2FnZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm5hbWUgb2YgdGhlIHNlcnZpY2UuICBBIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2UgY2FuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAib25seSBleHBvcnQgaXRzIG93biBtZWRpYSByb3V0ZSBwcm92aWRlcnMuICAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlByb3ZpZGVyIHBhY2thZ2UgbmFtZTogIiArIHByb3ZpZGVyUGFja2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIuICBTZXJ2aWNlIHBhY2thZ2UgbmFtZTogIiArIGdldFBhY2thZ2VOYW1lKCkgKyAiLiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1Qcm92aWRlciA9IHByb3ZpZGVyOwotICAgICAgICAgICAgICAgICAgICBtUHJvdmlkZXIuc2V0Q2FsbGJhY2sobVByb3ZpZGVyQ2FsbGJhY2spOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtUmVjZWl2ZU1lc3Nlbmdlci5nZXRCaW5kZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblVuYmluZChJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIGlmIChtUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVByb3ZpZGVyLnNldENhbGxiYWNrKG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5vblVuYmluZChpbnRlbnQpOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25SZWdpc3RlckNsaWVudChNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLCBpbnQgdmVyc2lvbikgewotICAgICAgICBpZiAodmVyc2lvbiA+PSBDTElFTlRfVkVSU0lPTl8xKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kQ2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgQ2xpZW50UmVjb3JkIGNsaWVudCA9IG5ldyBDbGllbnRSZWNvcmQobWVzc2VuZ2VyLCB2ZXJzaW9uKTsKLSAgICAgICAgICAgICAgICBpZiAoY2xpZW50LnJlZ2lzdGVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNsaWVudHMuYWRkKGNsaWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBSZWdpc3RlcmVkLCB2ZXJzaW9uPSIgKyB2ZXJzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWVzdElkICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG1Qcm92aWRlci5nZXREZXNjcmlwdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZW5kUmVwbHkobWVzc2VuZ2VyLCBTRVJWSUNFX01TR19SRUdJU1RFUkVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsIFNFUlZJQ0VfVkVSU0lPTl9DVVJSRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVEZXNjcmlwdG9yQnVuZGxlRm9yQ2xpZW50VmVyc2lvbihkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5tVmVyc2lvbiksIG51bGwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBvblVucmVnaXN0ZXJDbGllbnQoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCkgewotICAgICAgICBpbnQgaW5kZXggPSBmaW5kQ2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gbUNsaWVudHMucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogVW5yZWdpc3RlcmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbGllbnQuZGlzcG9zZSgpOwotICAgICAgICAgICAgc2VuZEdlbmVyaWNTdWNjZXNzKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkIG9uQmluZGVyRGllZChNZXNzZW5nZXIgbWVzc2VuZ2VyKSB7Ci0gICAgICAgIGludCBpbmRleCA9IGZpbmRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBtQ2xpZW50cy5yZW1vdmUoaW5kZXgpOwotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBCaW5kZXIgZGllZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2xpZW50LmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJvb2xlYW4gb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwKLSAgICAgICAgICAgIGludCBjb250cm9sbGVySWQsIFN0cmluZyByb3V0ZUlkLCBTdHJpbmcgcm91dGVHcm91cElkKSB7Ci0gICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoY2xpZW50LmNyZWF0ZVJvdXRlQ29udHJvbGxlcihyb3V0ZUlkLCByb3V0ZUdyb3VwSWQsIGNvbnRyb2xsZXJJZCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBSb3V0ZSBjb250cm9sbGVyIGNyZWF0ZWQsIGNvbnRyb2xsZXJJZD0iICsgY29udHJvbGxlcklkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCByb3V0ZUlkPSIgKyByb3V0ZUlkICsgIiwgcm91dGVHcm91cElkPSIgKyByb3V0ZUdyb3VwSWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZW5kR2VuZXJpY1N1Y2Nlc3MobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIG9uUmVsZWFzZVJvdXRlQ29udHJvbGxlcihNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLAotICAgICAgICAgICAgaW50IGNvbnRyb2xsZXJJZCkgewotICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGNsaWVudC5yZWxlYXNlUm91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBSb3V0ZSBjb250cm9sbGVyIHJlbGVhc2VkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZW5kR2VuZXJpY1N1Y2Nlc3MobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIG9uU2VsZWN0Um91dGUoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwKLSAgICAgICAgICAgIGludCBjb250cm9sbGVySWQpIHsKLSAgICAgICAgQ2xpZW50UmVjb3JkIGNsaWVudCA9IGdldENsaWVudChtZXNzZW5nZXIpOwotICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9Ci0gICAgICAgICAgICAgICAgICAgIGNsaWVudC5nZXRSb3V0ZUNvbnRyb2xsZXIoY29udHJvbGxlcklkKTsKLSAgICAgICAgICAgIGlmIChjb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uU2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgc2VsZWN0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25VbnNlbGVjdFJvdXRlKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBpbnQgY29udHJvbGxlcklkLCBpbnQgcmVhc29uKSB7Ci0gICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQotICAgICAgICAgICAgICAgICAgICBjbGllbnQuZ2V0Um91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udHJvbGxlci5vblVuc2VsZWN0KHJlYXNvbik7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgdW5zZWxlY3RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGNvbnRyb2xsZXJJZD0iICsgY29udHJvbGxlcklkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VuZEdlbmVyaWNTdWNjZXNzKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBvblNldFJvdXRlVm9sdW1lKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBpbnQgY29udHJvbGxlcklkLCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQotICAgICAgICAgICAgICAgICAgICBjbGllbnQuZ2V0Um91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udHJvbGxlci5vblNldFZvbHVtZSh2b2x1bWUpOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIHZvbHVtZSBjaGFuZ2VkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQgKyAiLCB2b2x1bWU9IiArIHZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25VcGRhdGVSb3V0ZVZvbHVtZShNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLAotICAgICAgICAgICAgaW50IGNvbnRyb2xsZXJJZCwgaW50IGRlbHRhKSB7Ci0gICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQotICAgICAgICAgICAgICAgICAgICBjbGllbnQuZ2V0Um91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udHJvbGxlci5vblVwZGF0ZVZvbHVtZShkZWx0YSk7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgdm9sdW1lIHVwZGF0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZCArICIsIGRlbHRhPSIgKyBkZWx0YSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25Sb3V0ZUNvbnRyb2xSZXF1ZXN0KGZpbmFsIE1lc3NlbmdlciBtZXNzZW5nZXIsIGZpbmFsIGludCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBmaW5hbCBpbnQgY29udHJvbGxlcklkLCBmaW5hbCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIGZpbmFsIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQotICAgICAgICAgICAgICAgICAgICBjbGllbnQuZ2V0Um91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjayA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RJZCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gbmV3IE1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2soKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgY29udHJvbCByZXF1ZXN0IHN1Y2NlZWRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGNvbnRyb2xsZXJJZD0iICsgY29udHJvbGxlcklkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBpbnRlbnQ9IiArIGludGVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgZGF0YT0iICsgZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaW5kQ2xpZW50KG1lc3NlbmdlcikgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kUmVwbHkobWVzc2VuZ2VyLCBTRVJWSUNFX01TR19DT05UUk9MX1JFUVVFU1RfU1VDQ0VFREVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCwgMCwgZGF0YSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoU3RyaW5nIGVycm9yLCBCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIGNvbnRyb2wgcmVxdWVzdCBmYWlsZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgaW50ZW50PSIgKyBpbnRlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGVycm9yPSIgKyBlcnJvciArICIsIGRhdGE9IiArIGRhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluZENsaWVudChtZXNzZW5nZXIpID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidW5kbGUucHV0U3RyaW5nKFNFUlZJQ0VfREFUQV9FUlJPUiwgZXJyb3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFJlcGx5KG1lc3NlbmdlciwgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX0ZBSUxFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLCAwLCBkYXRhLCBidW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFJlcGx5KG1lc3NlbmdlciwgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX0ZBSUxFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLCAwLCBkYXRhLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIub25Db250cm9sUmVxdWVzdChpbnRlbnQsIGNhbGxiYWNrKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgY29udHJvbCByZXF1ZXN0IGRlbGl2ZXJlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZCArICIsIGludGVudD0iICsgaW50ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25TZXREaXNjb3ZlcnlSZXF1ZXN0KE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBib29sZWFuIGFjdHVhbGx5Q2hhbmdlZCA9IGNsaWVudC5zZXREaXNjb3ZlcnlSZXF1ZXN0KHJlcXVlc3QpOwotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBTZXQgZGlzY292ZXJ5IHJlcXVlc3QsIHJlcXVlc3Q9IiArIHJlcXVlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgYWN0dWFsbHlDaGFuZ2VkPSIgKyBhY3R1YWxseUNoYW5nZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29tcG9zaXRlRGlzY292ZXJ5UmVxdWVzdD0iICsgbUNvbXBvc2l0ZURpc2NvdmVyeVJlcXVlc3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VuZEdlbmVyaWNTdWNjZXNzKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkIHNlbmREZXNjcmlwdG9yQ2hhbmdlZChNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNsaWVudHMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBtQ2xpZW50cy5nZXQoaSk7Ci0gICAgICAgICAgICBzZW5kUmVwbHkoY2xpZW50Lm1NZXNzZW5nZXIsIFNFUlZJQ0VfTVNHX0RFU0NSSVBUT1JfQ0hBTkdFRCwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlRGVzY3JpcHRvckJ1bmRsZUZvckNsaWVudFZlcnNpb24oZGVzY3JpcHRvciwgY2xpZW50Lm1WZXJzaW9uKSwgbnVsbCk7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFNlbnQgZGVzY3JpcHRvciBjaGFuZ2UgZXZlbnQsIGRlc2NyaXB0b3I9IiArIGRlc2NyaXB0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgc3RhdGljIEJ1bmRsZSBjcmVhdGVEZXNjcmlwdG9yQnVuZGxlRm9yQ2xpZW50VmVyc2lvbihNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICBpbnQgY2xpZW50VmVyc2lvbikgewotICAgICAgICBpZiAoZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLkJ1aWxkZXIgYnVpbGRlciA9Ci0gICAgICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuQnVpbGRlcihkZXNjcmlwdG9yKTsKLSAgICAgICAgYnVpbGRlci5zZXRSb3V0ZXMobnVsbCk7Ci0gICAgICAgIGZvciAoTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGUgOiBkZXNjcmlwdG9yLmdldFJvdXRlcygpKSB7Ci0gICAgICAgICAgICBpZiAoY2xpZW50VmVyc2lvbiA+PSByb3V0ZS5nZXRNaW5DbGllbnRWZXJzaW9uKCkKLSAgICAgICAgICAgICAgICAgICAgJiYgY2xpZW50VmVyc2lvbiA8PSByb3V0ZS5nZXRNYXhDbGllbnRWZXJzaW9uKCkpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFkZFJvdXRlKHJvdXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpLmFzQnVuZGxlKCk7Ci0gICAgfQotCi0gICAgYm9vbGVhbiB1cGRhdGVDb21wb3NpdGVEaXNjb3ZlcnlSZXF1ZXN0KCkgewotICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBjb21wb3NpdGUgPSBudWxsOwotICAgICAgICBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlciBzZWxlY3RvckJ1aWxkZXIgPSBudWxsOwotICAgICAgICBib29sZWFuIGFjdGl2ZVNjYW4gPSBmYWxzZTsKLSAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNsaWVudHMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QgPSBtQ2xpZW50cy5nZXQoaSkubURpc2NvdmVyeVJlcXVlc3Q7Ci0gICAgICAgICAgICBpZiAocmVxdWVzdCAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmICghcmVxdWVzdC5nZXRTZWxlY3RvcigpLmlzRW1wdHkoKSB8fCByZXF1ZXN0LmlzQWN0aXZlU2NhbigpKSkgewotICAgICAgICAgICAgICAgIGFjdGl2ZVNjYW4gfD0gcmVxdWVzdC5pc0FjdGl2ZVNjYW4oKTsKLSAgICAgICAgICAgICAgICBpZiAoY29tcG9zaXRlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlID0gcmVxdWVzdDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3JCdWlsZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yQnVpbGRlciA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlcihjb21wb3NpdGUuZ2V0U2VsZWN0b3IoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JCdWlsZGVyLmFkZFNlbGVjdG9yKHJlcXVlc3QuZ2V0U2VsZWN0b3IoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChzZWxlY3RvckJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgY29tcG9zaXRlID0gbmV3IE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0KHNlbGVjdG9yQnVpbGRlci5idWlsZCgpLCBhY3RpdmVTY2FuKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIU9iamVjdHNDb21wYXQuZXF1YWxzKG1Db21wb3NpdGVEaXNjb3ZlcnlSZXF1ZXN0LCBjb21wb3NpdGUpKSB7Ci0gICAgICAgICAgICBtQ29tcG9zaXRlRGlzY292ZXJ5UmVxdWVzdCA9IGNvbXBvc2l0ZTsKLSAgICAgICAgICAgIG1Qcm92aWRlci5zZXREaXNjb3ZlcnlSZXF1ZXN0KGNvbXBvc2l0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDbGllbnRSZWNvcmQgZ2V0Q2xpZW50KE1lc3NlbmdlciBtZXNzZW5nZXIpIHsKLSAgICAgICAgaW50IGluZGV4ID0gZmluZENsaWVudChtZXNzZW5nZXIpOwotICAgICAgICByZXR1cm4gaW5kZXggPj0gMCA/IG1DbGllbnRzLmdldChpbmRleCkgOiBudWxsOwotICAgIH0KLQotICAgIGludCBmaW5kQ2xpZW50KE1lc3NlbmdlciBtZXNzZW5nZXIpIHsKLSAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNsaWVudHMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBtQ2xpZW50cy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoY2xpZW50Lmhhc01lc3NlbmdlcihtZXNzZW5nZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHNlbmRHZW5lcmljRmFpbHVyZShNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkKSB7Ci0gICAgICAgIGlmIChyZXF1ZXN0SWQgIT0gMCkgewotICAgICAgICAgICAgc2VuZFJlcGx5KG1lc3NlbmdlciwgU0VSVklDRV9NU0dfR0VORVJJQ19GQUlMVVJFLCByZXF1ZXN0SWQsIDAsIG51bGwsIG51bGwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZW5kR2VuZXJpY1N1Y2Nlc3MoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCkgewotICAgICAgICBpZiAocmVxdWVzdElkICE9IDApIHsKLSAgICAgICAgICAgIHNlbmRSZXBseShtZXNzZW5nZXIsIFNFUlZJQ0VfTVNHX0dFTkVSSUNfU1VDQ0VTUywgcmVxdWVzdElkLCAwLCBudWxsLCBudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHNlbmRSZXBseShNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgd2hhdCwKLSAgICAgICAgICAgIGludCByZXF1ZXN0SWQsIGludCBhcmcsIE9iamVjdCBvYmosIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgIE1lc3NhZ2UgbXNnID0gTWVzc2FnZS5vYnRhaW4oKTsKLSAgICAgICAgbXNnLndoYXQgPSB3aGF0OwotICAgICAgICBtc2cuYXJnMSA9IHJlcXVlc3RJZDsKLSAgICAgICAgbXNnLmFyZzIgPSBhcmc7Ci0gICAgICAgIG1zZy5vYmogPSBvYmo7Ci0gICAgICAgIG1zZy5zZXREYXRhKGRhdGEpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbWVzc2VuZ2VyLnNlbmQobXNnKTsKLSAgICAgICAgfSBjYXRjaCAoRGVhZE9iamVjdEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gVGhlIGNsaWVudCBkaWVkLgotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBzZW5kIG1lc3NhZ2UgdG8gIiArIGdldENsaWVudElkKG1lc3NlbmdlciksIGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgZ2V0Q2xpZW50SWQoTWVzc2VuZ2VyIG1lc3NlbmdlcikgewotICAgICAgICByZXR1cm4gIkNsaWVudCBjb25uZWN0aW9uICIgKyBtZXNzZW5nZXIuZ2V0QmluZGVyKCkudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFByaXZhdGVIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0gICAgICAgIFByaXZhdGVIYW5kbGVyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFBSSVZBVEVfTVNHX0NMSUVOVF9ESUVEOgotICAgICAgICAgICAgICAgICAgICBvbkJpbmRlckRpZWQoKE1lc3Nlbmdlciltc2cub2JqKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFByb3ZpZGVyQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlUHJvdmlkZXIuQ2FsbGJhY2sgewotICAgICAgICBQcm92aWRlckNhbGxiYWNrKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzY3JpcHRvckNoYW5nZWQoTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgc2VuZERlc2NyaXB0b3JDaGFuZ2VkKGRlc2NyaXB0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDbGllbnRSZWNvcmQgaW1wbGVtZW50cyBEZWF0aFJlY2lwaWVudCB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBNZXNzZW5nZXIgbU1lc3NlbmdlcjsKLSAgICAgICAgcHVibGljIGZpbmFsIGludCBtVmVyc2lvbjsKLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IG1EaXNjb3ZlcnlSZXF1ZXN0OwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3BhcnNlQXJyYXk8TWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlcj4gbUNvbnRyb2xsZXJzID0KLSAgICAgICAgICAgICAgICBuZXcgU3BhcnNlQXJyYXk8TWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlcj4oKTsKLQotICAgICAgICBwdWJsaWMgQ2xpZW50UmVjb3JkKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCB2ZXJzaW9uKSB7Ci0gICAgICAgICAgICBtTWVzc2VuZ2VyID0gbWVzc2VuZ2VyOwotICAgICAgICAgICAgbVZlcnNpb24gPSB2ZXJzaW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gcmVnaXN0ZXIoKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1NZXNzZW5nZXIuZ2V0QmluZGVyKCkubGlua1RvRGVhdGgodGhpcywgMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBiaW5kZXJEaWVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAgICAgaW50IGNvdW50ID0gbUNvbnRyb2xsZXJzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIG1Db250cm9sbGVycy52YWx1ZUF0KGkpLm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNvbnRyb2xsZXJzLmNsZWFyKCk7Ci0KLSAgICAgICAgICAgIG1NZXNzZW5nZXIuZ2V0QmluZGVyKCkudW5saW5rVG9EZWF0aCh0aGlzLCAwKTsKLQotICAgICAgICAgICAgc2V0RGlzY292ZXJ5UmVxdWVzdChudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc01lc3NlbmdlcihNZXNzZW5nZXIgb3RoZXIpIHsKLSAgICAgICAgICAgIHJldHVybiBtTWVzc2VuZ2VyLmdldEJpbmRlcigpID09IG90aGVyLmdldEJpbmRlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gY3JlYXRlUm91dGVDb250cm9sbGVyKFN0cmluZyByb3V0ZUlkLCBTdHJpbmcgcm91dGVHcm91cElkLAotICAgICAgICAgICAgICAgIGludCBjb250cm9sbGVySWQpIHsKLSAgICAgICAgICAgIGlmIChtQ29udHJvbGxlcnMuaW5kZXhPZktleShjb250cm9sbGVySWQpIDwgMCkgewotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9IHJvdXRlR3JvdXBJZCA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICA/IG1Qcm92aWRlci5vbkNyZWF0ZVJvdXRlQ29udHJvbGxlcihyb3V0ZUlkKQotICAgICAgICAgICAgICAgICAgICAgICAgOiBtUHJvdmlkZXIub25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIocm91dGVJZCwgcm91dGVHcm91cElkKTsKLSAgICAgICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Db250cm9sbGVycy5wdXQoY29udHJvbGxlcklkLCBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gcmVsZWFzZVJvdXRlQ29udHJvbGxlcihpbnQgY29udHJvbGxlcklkKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBtQ29udHJvbGxlcnMuZ2V0KGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xsZXJzLnJlbW92ZShjb250cm9sbGVySWQpOwotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciBnZXRSb3V0ZUNvbnRyb2xsZXIoaW50IGNvbnRyb2xsZXJJZCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVycy5nZXQoY29udHJvbGxlcklkKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHNldERpc2NvdmVyeVJlcXVlc3QoTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICAgICAgaWYgKCFPYmplY3RzQ29tcGF0LmVxdWFscyhtRGlzY292ZXJ5UmVxdWVzdCwgcmVxdWVzdCkpIHsKLSAgICAgICAgICAgICAgICBtRGlzY292ZXJ5UmVxdWVzdCA9IHJlcXVlc3Q7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUNvbXBvc2l0ZURpc2NvdmVyeVJlcXVlc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJ1bnMgb24gYSBiaW5kZXIgdGhyZWFkLgotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgYmluZGVyRGllZCgpIHsKLSAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5vYnRhaW5NZXNzYWdlKFBSSVZBVEVfTVNHX0NMSUVOVF9ESUVELCBtTWVzc2VuZ2VyKS5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIGdldENsaWVudElkKG1NZXNzZW5nZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlciB0aGF0IHJlY2VpdmVzIG1lc3NhZ2VzIGZyb20gY2xpZW50cy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlubmVyIGNsYXNzIGlzIHN0YXRpYyBhbmQgb25seSByZXRhaW5zIGEgd2VhayByZWZlcmVuY2UgdG8gdGhlIHNlcnZpY2UKLSAgICAgKiB0byBwcmV2ZW50IHRoZSBzZXJ2aWNlIGZyb20gYmVpbmcgbGVha2VkIGluIGNhc2Ugb25lIG9mIHRoZSBjbGllbnRzIGlzIGhvbGRpbmcgYW4KLSAgICAgKiBhY3RpdmUgcmVmZXJlbmNlIHRvIHRoZSBzZXJ2ZXIncyBtZXNzZW5nZXIuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgaGFuZGxlciBzaG91bGQgbm90IGJlIHVzZWQgdG8gaGFuZGxlIGFueSBtZXNzYWdlcyBvdGhlciB0aGFuIHRob3NlCi0gICAgICogdGhhdCBjb21lIGZyb20gdGhlIGNsaWVudC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVjZWl2ZUhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2U+IG1TZXJ2aWNlUmVmOwotCi0gICAgICAgIHB1YmxpYyBSZWNlaXZlSGFuZGxlcihNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICAgICAgICAgIG1TZXJ2aWNlUmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8TWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZT4oc2VydmljZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICAgICAgZmluYWwgTWVzc2VuZ2VyIG1lc3NlbmdlciA9IG1zZy5yZXBseVRvOwotICAgICAgICAgICAgaWYgKGlzVmFsaWRSZW1vdGVNZXNzZW5nZXIobWVzc2VuZ2VyKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aGF0ID0gbXNnLndoYXQ7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJlcXVlc3RJZCA9IG1zZy5hcmcxOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBhcmcgPSBtc2cuYXJnMjsKLSAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3Qgb2JqID0gbXNnLm9iajsKLSAgICAgICAgICAgICAgICBmaW5hbCBCdW5kbGUgZGF0YSA9IG1zZy5wZWVrRGF0YSgpOwotICAgICAgICAgICAgICAgIGlmICghcHJvY2Vzc01lc3NhZ2Uod2hhdCwgbWVzc2VuZ2VyLCByZXF1ZXN0SWQsIGFyZywgb2JqLCBkYXRhKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgZ2V0Q2xpZW50SWQobWVzc2VuZ2VyKSArICI6IE1lc3NhZ2UgZmFpbGVkLCB3aGF0PSIgKyB3aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgcmVxdWVzdElkPSIgKyByZXF1ZXN0SWQgKyAiLCBhcmc9IiArIGFyZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIG9iaj0iICsgb2JqICsgIiwgZGF0YT0iICsgZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2VuZEdlbmVyaWNGYWlsdXJlKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJJZ25vcmluZyBtZXNzYWdlIHdpdGhvdXQgdmFsaWQgcmVwbHkgbWVzc2VuZ2VyLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShpbnQgd2hhdCwKLSAgICAgICAgICAgICAgICBNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLCBpbnQgYXJnLCBPYmplY3Qgb2JqLCBCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZSBzZXJ2aWNlID0gbVNlcnZpY2VSZWYuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19SRUdJU1RFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uUmVnaXN0ZXJDbGllbnQobWVzc2VuZ2VyLCByZXF1ZXN0SWQsIGFyZyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDTElFTlRfTVNHX1VOUkVHSVNURVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblVucmVnaXN0ZXJDbGllbnQobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19DUkVBVEVfUk9VVEVfQ09OVFJPTExFUjogewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJvdXRlSWQgPSBkYXRhLmdldFN0cmluZyhDTElFTlRfREFUQV9ST1VURV9JRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcm91dGVHcm91cElkID0gZGF0YS5nZXRTdHJpbmcoQ0xJRU5UX0RBVEFfUk9VVEVfTElCUkFSWV9HUk9VUCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzZW5nZXIsIHJlcXVlc3RJZCwgYXJnLCByb3V0ZUlkLCByb3V0ZUdyb3VwSWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfUkVMRUFTRV9ST1VURV9DT05UUk9MTEVSOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25SZWxlYXNlUm91dGVDb250cm9sbGVyKG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcpOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19TRUxFQ1RfUk9VVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblNlbGVjdFJvdXRlKG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcpOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19VTlNFTEVDVF9ST1VURToKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWFzb24gPSBkYXRhID09IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fVU5LTk9XTgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRhdGEuZ2V0SW50KENMSUVOVF9EQVRBX1VOU0VMRUNUX1JFQVNPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fVU5LTk9XTik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblVuc2VsZWN0Um91dGUobWVzc2VuZ2VyLCByZXF1ZXN0SWQsIGFyZywgcmVhc29uKTsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfU0VUX1JPVVRFX1ZPTFVNRTogewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZvbHVtZSA9IGRhdGEuZ2V0SW50KENMSUVOVF9EQVRBX1ZPTFVNRSwgLTEpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvbHVtZSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25TZXRSb3V0ZVZvbHVtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcsIHZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19VUERBVEVfUk9VVEVfVk9MVU1FOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGEgPSBkYXRhLmdldEludChDTElFTlRfREFUQV9WT0xVTUUsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblVwZGF0ZVJvdXRlVm9sdW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2VuZ2VyLCByZXF1ZXN0SWQsIGFyZywgZGVsdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfUk9VVEVfQ09OVFJPTF9SRVFVRVNUOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEludGVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uUm91dGVDb250cm9sUmVxdWVzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcsIChJbnRlbnQpb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19TRVRfRElTQ09WRVJZX1JFUVVFU1Q6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogaW5zdGFuY2VvZiBCdW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0LmZyb21CdW5kbGUoKEJ1bmRsZSlvYmopOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uU2V0RGlzY292ZXJ5UmVxdWVzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NlbmdlciwgcmVxdWVzdElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCAhPSBudWxsICYmIHJlcXVlc3QuaXNWYWxpZCgpID8gcmVxdWVzdCA6IG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVTZWxlY3Rvci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVTZWxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjY5YjE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlU2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBEZXNjcmliZXMgdGhlIGNhcGFiaWxpdGllcyBvZiByb3V0ZXMgdGhhdCBhcHBsaWNhdGlvbnMgd291bGQgbGlrZSB0byBkaXNjb3ZlciBhbmQgdXNlLgotICogPHA+Ci0gKiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUgb25jZSBjcmVhdGVkIHVzaW5nIGEge0BsaW5rIEJ1aWxkZXJ9IGluc3RhbmNlLgotICogPC9wPgotICoKLSAqIDxoMz5FeGFtcGxlPC9oMz4KLSAqIDxwcmU+Ci0gKiBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3JCdWlsZGVyID0gbmV3IE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyKCkKLSAqICAgICAgICAgLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9WSURFTykKLSAqICAgICAgICAgLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKQotICogICAgICAgICAuYnVpbGQoKTsKLSAqCi0gKiBNZWRpYVJvdXRlciByb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShjb250ZXh0KTsKLSAqIHJvdXRlci5hZGRDYWxsYmFjayhzZWxlY3RvciwgY2FsbGJhY2ssIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlkpOwotICogPC9wcmU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlU2VsZWN0b3IgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTlRST0xfQ0FURUdPUklFUyA9ICJjb250cm9sQ2F0ZWdvcmllcyI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotICAgIExpc3Q8U3RyaW5nPiBtQ29udHJvbENhdGVnb3JpZXM7Ci0KLSAgICAvKioKLSAgICAgKiBBbiBlbXB0eSBtZWRpYSByb3V0ZSBzZWxlY3RvciB0aGF0IHdpbGwgbm90IG1hdGNoIGFueSByb3V0ZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBNZWRpYVJvdXRlU2VsZWN0b3IgRU1QVFkgPSBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yKG5ldyBCdW5kbGUoKSwgbnVsbCk7Ci0KLSAgICBNZWRpYVJvdXRlU2VsZWN0b3IoQnVuZGxlIGJ1bmRsZSwgTGlzdDxTdHJpbmc+IGNvbnRyb2xDYXRlZ29yaWVzKSB7Ci0gICAgICAgIG1CdW5kbGUgPSBidW5kbGU7Ci0gICAgICAgIG1Db250cm9sQ2F0ZWdvcmllcyA9IGNvbnRyb2xDYXRlZ29yaWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxpc3Qgb2Yge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGNhdGVnb3JpZXN9IGluIHRoZSBzZWxlY3Rvci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgY2F0ZWdvcmllcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldENvbnRyb2xDYXRlZ29yaWVzKCkgewotICAgICAgICBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICByZXR1cm4gbUNvbnRyb2xDYXRlZ29yaWVzOwotICAgIH0KLQotICAgIHZvaWQgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKSB7Ci0gICAgICAgIGlmIChtQ29udHJvbENhdGVnb3JpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgbUNvbnRyb2xDYXRlZ29yaWVzID0gbUJ1bmRsZS5nZXRTdHJpbmdBcnJheUxpc3QoS0VZX0NPTlRST0xfQ0FURUdPUklFUyk7Ci0gICAgICAgICAgICBpZiAobUNvbnRyb2xDYXRlZ29yaWVzID09IG51bGwgfHwgbUNvbnRyb2xDYXRlZ29yaWVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG1Db250cm9sQ2F0ZWdvcmllcyA9IENvbGxlY3Rpb25zLjxTdHJpbmc+ZW1wdHlMaXN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlbGVjdG9yIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgY2F0ZWdvcnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2F0ZWdvcnkgVGhlIGNhdGVnb3J5IHRvIGNoZWNrLgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY2F0ZWdvcnkgaXMgcHJlc2VudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb250cm9sQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB7Ci0gICAgICAgIGlmIChjYXRlZ29yeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICAgICAgZmluYWwgaW50IGNhdGVnb3J5Q291bnQgPSBtQ29udHJvbENhdGVnb3JpZXMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRlZ29yeUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobUNvbnRyb2xDYXRlZ29yaWVzLmdldChpKS5lcXVhbHMoY2F0ZWdvcnkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3RvciBtYXRjaGVzIGF0IGxlYXN0IG9uZSBvZiB0aGUgc3BlY2lmaWVkIGNvbnRyb2wgZmlsdGVycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWx0ZXJzIFRoZSBsaXN0IG9mIGNvbnRyb2wgZmlsdGVycyB0byBjb25zaWRlci4KLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgYSBtYXRjaCBpcyBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzQ29udHJvbEZpbHRlcnMoTGlzdDxJbnRlbnRGaWx0ZXI+IGZpbHRlcnMpIHsKLSAgICAgICAgaWYgKGZpbHRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBjYXRlZ29yeUNvdW50ID0gbUNvbnRyb2xDYXRlZ29yaWVzLnNpemUoKTsKLSAgICAgICAgICAgIGlmIChjYXRlZ29yeUNvdW50ICE9IDApIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZmlsdGVyQ291bnQgPSBmaWx0ZXJzLnNpemUoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlckNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZW50RmlsdGVyIGZpbHRlciA9IGZpbHRlcnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY2F0ZWdvcnlDb3VudDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlci5oYXNDYXRlZ29yeShtQ29udHJvbENhdGVnb3JpZXMuZ2V0KGopKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNlbGVjdG9yIGNvbnRhaW5zIGFsbCBvZiB0aGUgY2FwYWJpbGl0aWVzIGRlc2NyaWJlZAotICAgICAqIGJ5IHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yIHRvIGJlIGV4YW1pbmVkLgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHNlbGVjdG9yIGNvbnRhaW5zIGFsbCBvZiB0aGUgY2FwYWJpbGl0aWVzIGRlc2NyaWJlZAotICAgICAqIGJ5IHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICAgICAgc2VsZWN0b3IuZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbENhdGVnb3JpZXMuY29udGFpbnNBbGwoc2VsZWN0b3IubUNvbnRyb2xDYXRlZ29yaWVzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3RvciBkb2VzIG5vdCBzcGVjaWZ5IGFueSBjYXBhYmlsaXRpZXMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgcmV0dXJuIG1Db250cm9sQ2F0ZWdvcmllcy5pc0VtcHR5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3RvciBoYXMgYWxsIG9mIHRoZSByZXF1aXJlZCBmaWVsZHMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLSAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgaWYgKG1Db250cm9sQ2F0ZWdvcmllcy5jb250YWlucyhudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE1lZGlhUm91dGVTZWxlY3RvcikgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVNlbGVjdG9yIG90aGVyID0gKE1lZGlhUm91dGVTZWxlY3RvcilvOwotICAgICAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgICAgIG90aGVyLmVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbnRyb2xDYXRlZ29yaWVzLmVxdWFscyhvdGhlci5tQ29udHJvbENhdGVnb3JpZXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICByZXR1cm4gbUNvbnRyb2xDYXRlZ29yaWVzLmhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJNZWRpYVJvdXRlU2VsZWN0b3J7ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJjb250cm9sQ2F0ZWdvcmllcz0iKS5hcHBlbmQoCi0gICAgICAgICAgICAgICAgQXJyYXlzLnRvU3RyaW5nKGdldENvbnRyb2xDYXRlZ29yaWVzKCkudG9BcnJheSgpKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiB9Iik7Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGlzIG9iamVjdCB0byBhIGJ1bmRsZSBmb3Igc2VyaWFsaXphdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QgcmVwcmVzZW50ZWQgYXMgYSBidW5kbGUuCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSBhc0J1bmRsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmcm9tIGEgYnVuZGxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHJldHVybiBUaGUgbmV3IGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBidW5kbGUgd2FzIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZWRpYVJvdXRlU2VsZWN0b3IgZnJvbUJ1bmRsZShATnVsbGFibGUgQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gYnVuZGxlICE9IG51bGwgPyBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yKGJ1bmRsZSwgbnVsbCkgOiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkZXIgZm9yIHtAbGluayBNZWRpYVJvdXRlU2VsZWN0b3IgbWVkaWEgcm91dGUgc2VsZWN0b3JzfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgewotICAgICAgICBwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IG1Db250cm9sQ2F0ZWdvcmllczsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhbiBlbXB0eSBtZWRpYSByb3V0ZSBzZWxlY3RvciBidWlsZGVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGRlc2NyaXB0b3IgYnVpbGRlciB3aG9zZSBpbml0aWFsIGNvbnRlbnRzIGFyZQotICAgICAgICAgKiBjb3BpZWQgZnJvbSBhbiBleGlzdGluZyBzZWxlY3Rvci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKEBOb25OdWxsIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvcikgewotICAgICAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNlbGVjdG9yLmVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgICAgICBpZiAoIXNlbGVjdG9yLm1Db250cm9sQ2F0ZWdvcmllcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtQ29udHJvbENhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oc2VsZWN0b3IubUNvbnRyb2xDYXRlZ29yaWVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIGEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGNhdGVnb3J5fSB0byB0aGUgYnVpbGRlci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNhdGVnb3J5IFRoZSBjYXRlZ29yeSB0byBhZGQgdG8gdGhlIHNldCBvZiBkZXNpcmVkIGNhcGFiaWxpdGllcywgc3VjaCBhcwotICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX0xJVkVfQVVESU99LgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBidWlsZGVyIGluc3RhbmNlIGZvciBjaGFpbmluZy4KLSAgICAgICAgICovCi0gICAgICAgIEBOb25OdWxsCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZENvbnRyb2xDYXRlZ29yeShATm9uTnVsbCBTdHJpbmcgY2F0ZWdvcnkpIHsKLSAgICAgICAgICAgIGlmIChjYXRlZ29yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2F0ZWdvcnkgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUNvbnRyb2xDYXRlZ29yaWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ29udHJvbENhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbUNvbnRyb2xDYXRlZ29yaWVzLmNvbnRhaW5zKGNhdGVnb3J5KSkgewotICAgICAgICAgICAgICAgIG1Db250cm9sQ2F0ZWdvcmllcy5hZGQoY2F0ZWdvcnkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkcyBhIGxpc3Qgb2Yge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGNhdGVnb3JpZXN9IHRvIHRoZSBidWlsZGVyLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY2F0ZWdvcmllcyBUaGUgbGlzdCBjYXRlZ29yaWVzIHRvIGFkZCB0byB0aGUgc2V0IG9mIGRlc2lyZWQgY2FwYWJpbGl0aWVzLAotICAgICAgICAgKiBzdWNoIGFzIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9BVURJT30uCi0gICAgICAgICAqIEByZXR1cm4gVGhlIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nLgotICAgICAgICAgKi8KLSAgICAgICAgQE5vbk51bGwKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkQ29udHJvbENhdGVnb3JpZXMoQE5vbk51bGwgQ29sbGVjdGlvbjxTdHJpbmc+IGNhdGVnb3JpZXMpIHsKLSAgICAgICAgICAgIGlmIChjYXRlZ29yaWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYXRlZ29yaWVzIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFjYXRlZ29yaWVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGNhdGVnb3J5IDogY2F0ZWdvcmllcykgewotICAgICAgICAgICAgICAgICAgICBhZGRDb250cm9sQ2F0ZWdvcnkoY2F0ZWdvcnkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZHMgdGhlIGNvbnRlbnRzIG9mIGFuIGV4aXN0aW5nIG1lZGlhIHJvdXRlIHNlbGVjdG9yIHRvIHRoZSBidWlsZGVyLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIHdob3NlIGNvbnRlbnRzIGFyZSB0byBiZSBhZGRlZC4KLSAgICAgICAgICogQHJldHVybiBUaGUgYnVpbGRlciBpbnN0YW5jZSBmb3IgY2hhaW5pbmcuCi0gICAgICAgICAqLwotICAgICAgICBATm9uTnVsbAotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRTZWxlY3RvcihATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhZGRDb250cm9sQ2F0ZWdvcmllcyhzZWxlY3Rvci5nZXRDb250cm9sQ2F0ZWdvcmllcygpKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEJ1aWxkcyB0aGUge0BsaW5rIE1lZGlhUm91dGVTZWxlY3RvciBtZWRpYSByb3V0ZSBzZWxlY3Rvcn0uCi0gICAgICAgICAqLwotICAgICAgICBATm9uTnVsbAotICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGJ1aWxkKCkgewotICAgICAgICAgICAgaWYgKG1Db250cm9sQ2F0ZWdvcmllcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmdBcnJheUxpc3QoS0VZX0NPTlRST0xfQ0FURUdPUklFUywgbUNvbnRyb2xDYXRlZ29yaWVzKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yKGJ1bmRsZSwgbUNvbnRyb2xDYXRlZ29yaWVzKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjAwNTJlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uSW50RGVmOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudFNlbmRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuQWN0aXZpdHlNYW5hZ2VyQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5oYXJkd2FyZS5kaXNwbGF5LkRpc3BsYXlNYW5hZ2VyQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5Wb2x1bWVQcm92aWRlckNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb25Db21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnV0aWwuUGFpcjsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXk7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlci5Qcm92aWRlck1ldGFkYXRhOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlcjsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBNZWRpYVJvdXRlciBhbGxvd3MgYXBwbGljYXRpb25zIHRvIGNvbnRyb2wgdGhlIHJvdXRpbmcgb2YgbWVkaWEgY2hhbm5lbHMKLSAqIGFuZCBzdHJlYW1zIGZyb20gdGhlIGN1cnJlbnQgZGV2aWNlIHRvIGV4dGVybmFsIHNwZWFrZXJzIGFuZCBkZXN0aW5hdGlvbiBkZXZpY2VzLgotICogPHA+Ci0gKiBBIE1lZGlhUm91dGVyIGluc3RhbmNlIGlzIHJldHJpZXZlZCB0aHJvdWdoIHtAbGluayAjZ2V0SW5zdGFuY2V9LiAgQXBwbGljYXRpb25zCi0gKiBjYW4gcXVlcnkgdGhlIG1lZGlhIHJvdXRlciBhYm91dCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlIGFuZCBpdHMgY2FwYWJpbGl0aWVzCi0gKiB0byBkZXRlcm1pbmUgaG93IHRvIHNlbmQgY29udGVudCB0byB0aGUgcm91dGUncyBkZXN0aW5hdGlvbi4gIEFwcGxpY2F0aW9ucyBjYW4KLSAqIGFsc28ge0BsaW5rIFJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3Qgc2VuZCBjb250cm9sIHJlcXVlc3RzfSB0byB0aGUgcm91dGUKLSAqIHRvIGFzayB0aGUgcm91dGUncyBkZXN0aW5hdGlvbiB0byBwZXJmb3JtIGNlcnRhaW4gcmVtb3RlIGNvbnRyb2wgZnVuY3Rpb25zCi0gKiBzdWNoIGFzIHBsYXlpbmcgbWVkaWEuCi0gKiA8L3A+PHA+Ci0gKiBTZWUgYWxzbyB7QGxpbmsgTWVkaWFSb3V0ZVByb3ZpZGVyfSBmb3IgaW5mb3JtYXRpb24gb24gaG93IGFuIGFwcGxpY2F0aW9uCi0gKiBjYW4gcHVibGlzaCBuZXcgbWVkaWEgcm91dGVzIHRvIHRoZSBtZWRpYSByb3V0ZXIuCi0gKiA8L3A+PHA+Ci0gKiBUaGUgbWVkaWEgcm91dGVyIEFQSSBpcyBub3QgdGhyZWFkLXNhZmU7IGFsbCBpbnRlcmFjdGlvbnMgd2l0aCBpdCBtdXN0IGJlCi0gKiBkb25lIGZyb20gdGhlIG1haW4gdGhyZWFkIG9mIHRoZSBwcm9jZXNzLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXIgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVyIjsKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIC8qKgotICAgICAqIFBhc3NlZCB0byB7QGxpbmsgYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLk1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIjb25VbnNlbGVjdChpbnQpfQotICAgICAqIGFuZCB7QGxpbmsgQ2FsbGJhY2sjb25Sb3V0ZVVuc2VsZWN0ZWQoTWVkaWFSb3V0ZXIsIFJvdXRlSW5mbywgaW50KX0gd2hlbiB0aGUgcmVhc29uIHRoZSByb3V0ZQotICAgICAqIHdhcyB1bnNlbGVjdGVkIGlzIHVua25vd24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TRUxFQ1RfUkVBU09OX1VOS05PV04gPSAwOwotICAgIC8qKgotICAgICAqIFBhc3NlZCB0byB7QGxpbmsgYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLk1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIjb25VbnNlbGVjdChpbnQpfQotICAgICAqIGFuZCB7QGxpbmsgQ2FsbGJhY2sjb25Sb3V0ZVVuc2VsZWN0ZWQoTWVkaWFSb3V0ZXIsIFJvdXRlSW5mbywgaW50KX0gd2hlbiB0aGUgdXNlciBwcmVzc2VkCi0gICAgICogdGhlIGRpc2Nvbm5lY3QgYnV0dG9uIHRvIGRpc2Nvbm5lY3QgYW5kIGtlZXAgcGxheWluZy4KLSAgICAgKiA8cD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZURlc2NyaXB0b3IjY2FuRGlzY29ubmVjdEFuZEtlZXBQbGF5aW5nKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNFTEVDVF9SRUFTT05fRElTQ09OTkVDVEVEID0gMTsKLSAgICAvKioKLSAgICAgKiBQYXNzZWQgdG8ge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyI29uVW5zZWxlY3QoaW50KX0KLSAgICAgKiBhbmQge0BsaW5rIENhbGxiYWNrI29uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyLCBSb3V0ZUluZm8sIGludCl9IHdoZW4gdGhlIHVzZXIgcHJlc3NlZAotICAgICAqIHRoZSBzdG9wIGNhc3RpbmcgYnV0dG9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOU0VMRUNUX1JFQVNPTl9TVE9QUEVEID0gMjsKLSAgICAvKioKLSAgICAgKiBQYXNzZWQgdG8ge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyI29uVW5zZWxlY3QoaW50KX0KLSAgICAgKiBhbmQge0BsaW5rIENhbGxiYWNrI29uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyLCBSb3V0ZUluZm8sIGludCl9IHdoZW4gdGhlIHVzZXIgc2VsZWN0ZWQKLSAgICAgKiBhIGRpZmZlcmVudCByb3V0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNFTEVDVF9SRUFTT05fUk9VVEVfQ0hBTkdFRCA9IDM7Ci0KLSAgICAvLyBNYWludGFpbnMgZ2xvYmFsIG1lZGlhIHJvdXRlciBzdGF0ZSBmb3IgdGhlIHByb2Nlc3MuCi0gICAgLy8gVGhpcyBmaWVsZCBpcyBpbml0aWFsaXplZCBpbiBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZSgpIGJlZm9yZSBhbnkKLSAgICAvLyBNZWRpYVJvdXRlciBvYmplY3RzIGFyZSBpbnN0YW50aWF0ZWQgc28gaXQgaXMgZ3VhcmFudGVlZCB0byBiZQotICAgIC8vIHZhbGlkIHdoZW5ldmVyIGFueSBpbnN0YW5jZSBtZXRob2QgaXMgaW52b2tlZC4KLSAgICBzdGF0aWMgR2xvYmFsTWVkaWFSb3V0ZXIgc0dsb2JhbDsKLQotICAgIC8vIENvbnRleHQtYm91bmQgc3RhdGUgb2YgdGhlIG1lZGlhIHJvdXRlci4KLSAgICBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIGZpbmFsIEFycmF5TGlzdDxDYWxsYmFja1JlY29yZD4gbUNhbGxiYWNrUmVjb3JkcyA9IG5ldyBBcnJheUxpc3Q8Q2FsbGJhY2tSZWNvcmQ+KCk7Ci0KLSAgICBASW50RGVmKGZsYWcgPSB0cnVlLAotICAgICAgICAgICAgdmFsdWUgPSB7Ci0gICAgICAgICAgICAgICAgICAgIENBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTiwKLSAgICAgICAgICAgICAgICAgICAgQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWSwKLSAgICAgICAgICAgICAgICAgICAgQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UUwotICAgICAgICAgICAgfQotICAgICkKLSAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi0gICAgcHJpdmF0ZSBAaW50ZXJmYWNlIENhbGxiYWNrRmxhZ3Mge30KLQotICAgIC8qKgotICAgICAqIEZsYWcgZm9yIHtAbGluayAjYWRkQ2FsbGJhY2t9OiBBY3RpdmVseSBzY2FuIGZvciByb3V0ZXMgd2hpbGUgdGhpcyBjYWxsYmFjawotICAgICAqIGlzIHJlZ2lzdGVyZWQuCi0gICAgICogPHA+Ci0gICAgICogV2hlbiB0aGlzIGZsYWcgaXMgc3BlY2lmaWVkLCB0aGUgbWVkaWEgcm91dGVyIHdpbGwgYWN0aXZlbHkgc2NhbiBmb3IgbmV3Ci0gICAgICogcm91dGVzLiAgQ2VydGFpbiByb3V0ZXMsIHN1Y2ggYXMgd2lmaSBkaXNwbGF5IHJvdXRlcywgbWF5IG5vdCBiZSBkaXNjb3ZlcmFibGUKLSAgICAgKiBleGNlcHQgd2hlbiBhY3RpdmVseSBzY2FubmluZy4gIFRoaXMgZmxhZyBpcyB0eXBpY2FsbHkgdXNlZCB3aGVuIHRoZSByb3V0ZSBwaWNrZXIKLSAgICAgKiBkaWFsb2cgaGFzIGJlZW4gb3BlbmVkIGJ5IHRoZSB1c2VyIHRvIGVuc3VyZSB0aGF0IHRoZSByb3V0ZSBpbmZvcm1hdGlvbiBpcwotICAgICAqIHVwIHRvIGRhdGUuCi0gICAgICogPC9wPjxwPgotICAgICAqIEFjdGl2ZSBzY2FubmluZyBtYXkgY29uc3VtZSBhIHNpZ25pZmljYW50IGFtb3VudCBvZiBwb3dlciBhbmQgbWF5IGhhdmUgaW50cnVzaXZlCi0gICAgICogZWZmZWN0cyBvbiB3aXJlbGVzcyBjb25uZWN0aXZpdHkuICBUaGVyZWZvcmUgaXQgaXMgaW1wb3J0YW50IHRoYXQgYWN0aXZlIHNjYW5uaW5nCi0gICAgICogb25seSBiZSByZXF1ZXN0ZWQgd2hlbiBpdCBpcyBhY3R1YWxseSBuZWVkZWQgdG8gc2F0aXNmeSBhIHVzZXIgcmVxdWVzdCB0bwotICAgICAqIGRpc2NvdmVyIGFuZCBzZWxlY3QgYSBuZXcgcm91dGUuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgZmxhZyBpbXBsaWVzIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWX0gYnV0IHBlcmZvcm1pbmcKLSAgICAgKiBhY3RpdmUgc2NhbnMgaXMgbXVjaCBtb3JlIGV4cGVuc2l2ZSB0aGFuIGEgbm9ybWFsIGRpc2NvdmVyeSByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU4gPSAxIDw8IDA7Ci0KLSAgICAvKioKLSAgICAgKiBGbGFnIGZvciB7QGxpbmsgI2FkZENhbGxiYWNrfTogRG8gbm90IGZpbHRlciByb3V0ZSBldmVudHMuCi0gICAgICogPHA+Ci0gICAgICogV2hlbiB0aGlzIGZsYWcgaXMgc3BlY2lmaWVkLCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBpbnZva2VkIGZvciBldmVudHMgdGhhdCBhZmZlY3QgYW55Ci0gICAgICogcm91dGUgZXZlbiBpZiB0aGV5IGRvIG5vdCBtYXRjaCB0aGUgY2FsbGJhY2sncyBmaWx0ZXIuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFMgPSAxIDw8IDE7Ci0KLSAgICAvKioKLSAgICAgKiBGbGFnIGZvciB7QGxpbmsgI2FkZENhbGxiYWNrfTogUmVxdWVzdCBwYXNzaXZlIHJvdXRlIGRpc2NvdmVyeSB3aGlsZSB0aGlzCi0gICAgICogY2FsbGJhY2sgaXMgcmVnaXN0ZXJlZCwgZXhjZXB0IG9uIHtAbGluayBBY3Rpdml0eU1hbmFnZXIjaXNMb3dSYW1EZXZpY2UgbG93LVJBTSBkZXZpY2VzfS4KLSAgICAgKiA8cD4KLSAgICAgKiBXaGVuIHRoaXMgZmxhZyBpcyBzcGVjaWZpZWQsIHRoZSBtZWRpYSByb3V0ZXIgd2lsbCB0cnkgdG8gZGlzY292ZXIgcm91dGVzLgotICAgICAqIEFsdGhvdWdoIHJvdXRlIGRpc2NvdmVyeSBpcyBpbnRlbmRlZCB0byBiZSBlZmZpY2llbnQsIGNoZWNraW5nIGZvciBuZXcgcm91dGVzIG1heQotICAgICAqIHJlc3VsdCBpbiBzb21lIG5ldHdvcmsgYWN0aXZpdHkgYW5kIGNvdWxkIHNsb3dseSBkcmFpbiB0aGUgYmF0dGVyeS4gIFRoZXJlZm9yZQotICAgICAqIGFwcGxpY2F0aW9ucyBzaG91bGQgb25seSBzcGVjaWZ5IHtAbGluayAjQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWX0gd2hlbgotICAgICAqIHRoZXkgYXJlIHJ1bm5pbmcgaW4gdGhlIGZvcmVncm91bmQgYW5kIHdvdWxkIGxpa2UgdG8gcHJvdmlkZSB0aGUgdXNlciB3aXRoIHRoZQotICAgICAqIG9wdGlvbiBvZiBjb25uZWN0aW5nIHRvIG5ldyByb3V0ZXMuCi0gICAgICogPC9wPjxwPgotICAgICAqIEFwcGxpY2F0aW9ucyBzaG91bGQgdHlwaWNhbGx5IGFkZCBhIGNhbGxiYWNrIHVzaW5nIHRoaXMgZmxhZyBpbiB0aGUKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkgYWN0aXZpdHknc30ge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uU3RhcnQgb25TdGFydH0KLSAgICAgKiBtZXRob2QgYW5kIHJlbW92ZSBpdCBpbiB0aGUge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uU3RvcCBvblN0b3B9IG1ldGhvZC4KLSAgICAgKiBUaGUge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5hcHAuTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50fSBmcmFnbWVudCBtYXkKLSAgICAgKiBhbHNvIGJlIHVzZWQgZm9yIHRoaXMgcHVycG9zZS4KLSAgICAgKiA8L3A+PHAgY2xhc3M9Im5vdGUiPgotICAgICAqIE9uIHtAbGluayBBY3Rpdml0eU1hbmFnZXIjaXNMb3dSYW1EZXZpY2UgbG93LVJBTSBkZXZpY2VzfSB0aGlzIGZsYWcKLSAgICAgKiB3aWxsIGJlIGlnbm9yZWQuICBSZWZlciB0bwotICAgICAqIHtAbGluayAjYWRkQ2FsbGJhY2soTWVkaWFSb3V0ZVNlbGVjdG9yLCBDYWxsYmFjaywgaW50KSBhZGRDYWxsYmFja30gZm9yIGRldGFpbHMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNlZSBhbmRyb2lkLnN1cHBvcnQudjcuYXBwLk1lZGlhUm91dGVEaXNjb3ZlcnlGcmFnbWVudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlkgPSAxIDw8IDI7Ci0KLSAgICAvKioKLSAgICAgKiBGbGFnIGZvciB7QGxpbmsgI2FkZENhbGxiYWNrfTogUmVxdWVzdCBwYXNzaXZlIHJvdXRlIGRpc2NvdmVyeSB3aGlsZSB0aGlzCi0gICAgICogY2FsbGJhY2sgaXMgcmVnaXN0ZXJlZCwgZXZlbiBvbiB7QGxpbmsgQWN0aXZpdHlNYW5hZ2VyI2lzTG93UmFtRGV2aWNlIGxvdy1SQU0gZGV2aWNlc30uCi0gICAgICogPHAgY2xhc3M9Im5vdGUiPgotICAgICAqIFRoaXMgZmxhZyBoYXMgYSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBpbXBhY3Qgb24gbG93LVJBTSBkZXZpY2VzCi0gICAgICogc2luY2UgaXQgbWF5IGNhdXNlIG1hbnkgbWVkaWEgcm91dGUgcHJvdmlkZXJzIHRvIGJlIHN0YXJ0ZWQgc2ltdWx0YW5lb3VzbHkuCi0gICAgICogSXQgaXMgbXVjaCBiZXR0ZXIgdG8gdXNlIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWX0gaW5zdGVhZCB0byBhdm9pZAotICAgICAqIHBlcmZvcm1pbmcgcGFzc2l2ZSBkaXNjb3Zlcnkgb24gdGhlc2UgZGV2aWNlcyBhbHRvZ2V0aGVyLiAgUmVmZXIgdG8KLSAgICAgKiB7QGxpbmsgI2FkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3RvciwgQ2FsbGJhY2ssIGludCkgYWRkQ2FsbGJhY2t9IGZvciBkZXRhaWxzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgYW5kcm9pZC5zdXBwb3J0LnY3LmFwcC5NZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxMQkFDS19GTEFHX0ZPUkNFX0RJU0NPVkVSWSA9IDEgPDwgMzsKLQotICAgIC8qKgotICAgICAqIEZsYWcgZm9yIHtAbGluayAjaXNSb3V0ZUF2YWlsYWJsZX06IElnbm9yZSB0aGUgZGVmYXVsdCByb3V0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGZsYWcgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhIG1hdGNoaW5nIG5vbi1kZWZhdWx0IHJvdXRlIGlzIGF2YWlsYWJsZS4KLSAgICAgKiBUaGlzIGNvbnN0cmFpbnQgbWF5IGJlIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdG8gb2ZmZXIgdGhlIHJvdXRlIGNob29zZXIgZGlhbG9nCi0gICAgICogdG8gdGhlIHVzZXIuICBUaGVyZSBpcyBubyBwb2ludCBvZmZlcmluZyB0aGUgY2hvb3NlciBpZiB0aGVyZSBhcmUgbm8KLSAgICAgKiBub24tZGVmYXVsdCBjaG9pY2VzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVkFJTEFCSUxJVFlfRkxBR19JR05PUkVfREVGQVVMVF9ST1VURSA9IDEgPDwgMDsKLQotICAgIC8qKgotICAgICAqIEZsYWcgZm9yIHtAbGluayAjaXNSb3V0ZUF2YWlsYWJsZX06IFJlcXVpcmUgYW4gYWN0dWFsIHJvdXRlIHRvIGJlIG1hdGNoZWQuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhpcyBmbGFnIGlzIG5vdCBzZXQsIHRoZW4ge0BsaW5rICNpc1JvdXRlQXZhaWxhYmxlfSB3aWxsIHJldHVybiB0cnVlCi0gICAgICogaWYgaXQgaXMgcG9zc2libGUgdG8gZGlzY292ZXIgYSBtYXRjaGluZyByb3V0ZSBldmVuIGlmIGRpc2NvdmVyeSBpcyBub3QgaW4KLSAgICAgKiBwcm9ncmVzcyBvciBpZiBubyBtYXRjaGluZyByb3V0ZSBoYXMgeWV0IGJlZW4gZm91bmQuICBUaGlzIGZlYXR1cmUgaXMgdXNlZCB0bwotICAgICAqIHNhdmUgcmVzb3VyY2VzIGJ5IHJlbW92aW5nIHRoZSBuZWVkIHRvIHBlcmZvcm0gcGFzc2l2ZSByb3V0ZSBkaXNjb3Zlcnkgb24KLSAgICAgKiB7QGxpbmsgQWN0aXZpdHlNYW5hZ2VyI2lzTG93UmFtRGV2aWNlIGxvdy1SQU0gZGV2aWNlc30uCi0gICAgICogPC9wPjxwPgotICAgICAqIElmIHRoaXMgZmxhZyBpcyBzZXQsIHRoZW4ge0BsaW5rICNpc1JvdXRlQXZhaWxhYmxlfSB3aWxsIG9ubHkgcmV0dXJuIHRydWUgaWYKLSAgICAgKiBhIG1hdGNoaW5nIHJvdXRlIGhhcyBhY3R1YWxseSBiZWVuIGRpc2NvdmVyZWQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFWQUlMQUJJTElUWV9GTEFHX1JFUVVJUkVfTUFUQ0ggPSAxIDw8IDE7Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiBpbnN0YW5jZSBvZiB0aGUgbWVkaWEgcm91dGVyIHNlcnZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZXh0LgotICAgICAqIDxwPgotICAgICAqIFRoZSBhcHBsaWNhdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgaG9sZGluZyBhIHN0cm9uZyByZWZlcmVuY2UgdG8gdGhlIHJldHVybmVkCi0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyfSBpbnN0YW5jZSwgc3VjaCBhcyBieSBzdG9yaW5nIHRoZSBpbnN0YW5jZSBpbiBhIGZpZWxkIG9mCi0gICAgICogdGhlIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eX0sIHRvIGVuc3VyZSB0aGF0IHRoZSBtZWRpYSByb3V0ZXIgcmVtYWlucyBhbGl2ZQotICAgICAqIGFzIGxvbmcgYXMgdGhlIGFwcGxpY2F0aW9uIGlzIHVzaW5nIGl0cyBmZWF0dXJlcy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSW4gb3RoZXIgd29yZHMsIHRoZSBzdXBwb3J0IGxpYnJhcnkgb25seSBob2xkcyBhIHtAbGluayBXZWFrUmVmZXJlbmNlIHdlYWsgcmVmZXJlbmNlfQotICAgICAqIHRvIGVhY2ggbWVkaWEgcm91dGVyIGluc3RhbmNlLiAgV2hlbiB0aGVyZSBhcmUgbm8gcmVtYWluaW5nIHN0cm9uZyByZWZlcmVuY2VzIHRvIHRoZQotICAgICAqIG1lZGlhIHJvdXRlciBpbnN0YW5jZSwgYWxsIG9mIGl0cyBjYWxsYmFja3Mgd2lsbCBiZSByZW1vdmVkIGFuZCByb3V0ZSBkaXNjb3ZlcnkKLSAgICAgKiB3aWxsIG5vIGxvbmdlciBiZSBwZXJmb3JtZWQgb24gaXRzIGJlaGFsZi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSByb3V0ZXIgaW5zdGFuY2UgZm9yIHRoZSBjb250ZXh0LiAgVGhlIGFwcGxpY2F0aW9uIG11c3QgaG9sZAotICAgICAqIGEgc3Ryb25nIHJlZmVyZW5jZSB0byB0aGlzIG9iamVjdCBhcyBsb25nIGFzIGl0IGlzIGluIHVzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhUm91dGVyIGdldEluc3RhbmNlKEBOb25OdWxsIENvbnRleHQgY29udGV4dCkgewotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZXh0IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoc0dsb2JhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzR2xvYmFsID0gbmV3IEdsb2JhbE1lZGlhUm91dGVyKGNvbnRleHQuZ2V0QXBwbGljYXRpb25Db250ZXh0KCkpOwotICAgICAgICAgICAgc0dsb2JhbC5zdGFydCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzR2xvYmFsLmdldFJvdXRlcihjb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlc30gY3VycmVudGx5IGtub3duIHRvCi0gICAgICogdGhpcyBtZWRpYSByb3V0ZXIuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8Um91dGVJbmZvPiBnZXRSb3V0ZXMoKSB7Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXRSb3V0ZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB7QGxpbmsgTWVkaWFSb3V0ZXIuUHJvdmlkZXJJbmZvIHJvdXRlIHByb3ZpZGVyc30KLSAgICAgKiBjdXJyZW50bHkga25vd24gdG8gdGhpcyBtZWRpYSByb3V0ZXIuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8UHJvdmlkZXJJbmZvPiBnZXRQcm92aWRlcnMoKSB7Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXRQcm92aWRlcnMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IHJvdXRlIGZvciBwbGF5aW5nIG1lZGlhIGNvbnRlbnQgb24gdGhlIHN5c3RlbS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgc3lzdGVtIGFsd2F5cyBwcm92aWRlcyBhIGRlZmF1bHQgcm91dGUuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZGVmYXVsdCByb3V0ZSwgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBuZXZlciBiZSBudWxsLgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgcHVibGljIFJvdXRlSW5mbyBnZXREZWZhdWx0Um91dGUoKSB7Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXREZWZhdWx0Um91dGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgYmx1ZXRvb3RoIHJvdXRlIGZvciBwbGF5aW5nIG1lZGlhIGNvbnRlbnQgb24gdGhlIHN5c3RlbS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSBibHVldG9vdGggcm91dGUsIGlmIGV4aXN0LCBvdGhlcndpc2UgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUm91dGVJbmZvIGdldEJsdWV0b290aFJvdXRlKCkgewotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0Qmx1ZXRvb3RoUm91dGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBleGFtaW5lIHRoZSByb3V0ZSdzCi0gICAgICoge0BsaW5rIFJvdXRlSW5mbyNnZXRDb250cm9sRmlsdGVycyBtZWRpYSBjb250cm9sIGludGVudCBmaWx0ZXJzfSB0byBhc3Nlc3MgdGhlCi0gICAgICogY2FwYWJpbGl0aWVzIG9mIHRoZSByb3V0ZSBiZWZvcmUgYXR0ZW1wdGluZyB0byB1c2UgaXQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPkV4YW1wbGU8L2gzPgotICAgICAqIDxwcmU+Ci0gICAgICogcHVibGljIGJvb2xlYW4gcGxheU1vdmllKCkgewotICAgICAqICAgICBNZWRpYVJvdXRlciBtZWRpYVJvdXRlciA9IE1lZGlhUm91dGVyLmdldEluc3RhbmNlKGNvbnRleHQpOwotICAgICAqICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtZWRpYVJvdXRlci5nZXRTZWxlY3RlZFJvdXRlKCk7Ci0gICAgICoKLSAgICAgKiAgICAgLy8gRmlyc3QgdHJ5IHVzaW5nIHRoZSByZW1vdGUgcGxheWJhY2sgaW50ZXJmYWNlLCBpZiBzdXBwb3J0ZWQuCi0gICAgICogICAgIGlmIChyb3V0ZS5zdXBwb3J0c0NvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKSkgewotICAgICAqICAgICAgICAgLy8gVGhlIHJvdXRlIHN1cHBvcnRzIHJlbW90ZSBwbGF5YmFjay4KLSAgICAgKiAgICAgICAgIC8vIFRyeSB0byBzZW5kIGl0IHRoZSBVcmkgb2YgdGhlIG1vdmllIHRvIHBsYXkuCi0gICAgICogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1BMQVkpOwotICAgICAqICAgICAgICAgaW50ZW50LmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spOwotICAgICAqICAgICAgICAgaW50ZW50LnNldERhdGFBbmRUeXBlKCJodHRwOi8vZXhhbXBsZS5jb20vdmlkZW9zL21vdmllLm1wNCIsICJ2aWRlby9tcDQiKTsKLSAgICAgKiAgICAgICAgIGlmIChyb3V0ZS5zdXBwb3J0c0NvbnRyb2xSZXF1ZXN0KGludGVudCkpIHsKLSAgICAgKiAgICAgICAgICAgICByb3V0ZS5zZW5kQ29udHJvbFJlcXVlc3QoaW50ZW50LCBudWxsKTsKLSAgICAgKiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gc2VudCB0aGUgcmVxdWVzdCB0byBwbGF5IHRoZSBtb3ZpZQotICAgICAqICAgICAgICAgfQotICAgICAqICAgICB9Ci0gICAgICoKLSAgICAgKiAgICAgLy8gSWYgcmVtb3RlIHBsYXliYWNrIHdhcyBub3QgcG9zc2libGUsIHRoZW4gcGxheSBsb2NhbGx5LgotICAgICAqICAgICBpZiAocm91dGUuc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfVklERU8pKSB7Ci0gICAgICogICAgICAgICAvLyBUaGUgcm91dGUgc3VwcG9ydHMgbGl2ZSB2aWRlbyBzdHJlYW1pbmcuCi0gICAgICogICAgICAgICAvLyBQcmVwYXJlIHRvIHBsYXkgY29udGVudCBsb2NhbGx5IGluIGEgd2luZG93IG9yIGluIGEgcHJlc2VudGF0aW9uLgotICAgICAqICAgICAgICAgcmV0dXJuIHBsYXlNb3ZpZUluV2luZG93KCk7Ci0gICAgICogICAgIH0KLSAgICAgKgotICAgICAqICAgICAvLyBOZWl0aGVyIGludGVyZmFjZSBpcyBzdXBwb3J0ZWQsIHNvIHdlIGNhbid0IHBsYXkgdGhlIG1vdmllIHRvIHRoaXMgcm91dGUuCi0gICAgICogICAgIHJldHVybiBmYWxzZTsKLSAgICAgKiB9Ci0gICAgICogPC9wcmU+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzZWxlY3RlZCByb3V0ZSwgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBuZXZlciBiZSBudWxsLgotICAgICAqCi0gICAgICogQHNlZSBSb3V0ZUluZm8jZ2V0Q29udHJvbEZpbHRlcnMKLSAgICAgKiBAc2VlIFJvdXRlSW5mbyNzdXBwb3J0c0NvbnRyb2xDYXRlZ29yeQotICAgICAqIEBzZWUgUm91dGVJbmZvI3N1cHBvcnRzQ29udHJvbFJlcXVlc3QKLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBSb3V0ZUluZm8gZ2V0U2VsZWN0ZWRSb3V0ZSgpIHsKLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIHJldHVybiBzR2xvYmFsLmdldFNlbGVjdGVkUm91dGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCByb3V0ZSBpZiBpdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IsIG90aGVyd2lzZQotICAgICAqIHNlbGVjdHMgdGhlIGRlZmF1bHQgcm91dGUgYW5kIHJldHVybnMgaXQuIElmIHRoZXJlIGlzIG9uZSBsaXZlIGF1ZGlvIHJvdXRlCi0gICAgICogKHVzdWFsbHkgQmx1ZXRvb3RoIEEyRFApLCBpdCB3aWxsIGJlIHNlbGVjdGVkIGluc3RlYWQgb2YgZGVmYXVsdCByb3V0ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IgdG8gbWF0Y2guCi0gICAgICogQHJldHVybiBUaGUgcHJldmlvdXNseSBzZWxlY3RlZCByb3V0ZSBpZiBpdCBtYXRjaGVkIHRoZSBzZWxlY3Rvciwgb3RoZXJ3aXNlIHRoZQotICAgICAqIG5ld2x5IHNlbGVjdGVkIGRlZmF1bHQgcm91dGUgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBuZXZlciBiZSBudWxsLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlU2VsZWN0b3IKLSAgICAgKiBAc2VlIFJvdXRlSW5mbyNtYXRjaGVzU2VsZWN0b3IKLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBSb3V0ZUluZm8gdXBkYXRlU2VsZWN0ZWRSb3V0ZShATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInVwZGF0ZVNlbGVjdGVkUm91dGU6ICIgKyBzZWxlY3Rvcik7Ci0gICAgICAgIH0KLSAgICAgICAgUm91dGVJbmZvIHJvdXRlID0gc0dsb2JhbC5nZXRTZWxlY3RlZFJvdXRlKCk7Ci0gICAgICAgIGlmICghcm91dGUuaXNEZWZhdWx0T3JCbHVldG9vdGgoKSAmJiAhcm91dGUubWF0Y2hlc1NlbGVjdG9yKHNlbGVjdG9yKSkgewotICAgICAgICAgICAgcm91dGUgPSBzR2xvYmFsLmNob29zZUZhbGxiYWNrUm91dGUoKTsKLSAgICAgICAgICAgIHNHbG9iYWwuc2VsZWN0Um91dGUocm91dGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByb3V0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWxlY3RzIHRoZSBzcGVjaWZpZWQgcm91dGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHRvIHNlbGVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3RSb3V0ZShATm9uTnVsbCBSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgaWYgKHJvdXRlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInNlbGVjdFJvdXRlOiAiICsgcm91dGUpOwotICAgICAgICB9Ci0gICAgICAgIHNHbG9iYWwuc2VsZWN0Um91dGUocm91dGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVuc2VsZWN0cyB0aGUgY3VycmVudCByb3VuZCBhbmQgc2VsZWN0cyB0aGUgZGVmYXVsdCByb3V0ZSBpbnN0ZWFkLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZWFzb24gZ2l2ZW4gbXVzdCBiZSBvbmUgb2Y6Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1VOS05PV059PC9saT4KLSAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9ESVNDT05ORUNURUR9PC9saT4KLSAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9TVE9QUEVEfTwvbGk+Ci0gICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fUk9VVEVfQ0hBTkdFRH08L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVhc29uIFRoZSByZWFzb24gZm9yIGRpc2Nvbm5lY3RpbmcgdGhlIGN1cnJlbnQgcm91dGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdW5zZWxlY3QoaW50IHJlYXNvbikgewotICAgICAgICBpZiAocmVhc29uIDwgTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1VOS05PV04gfHwKLSAgICAgICAgICAgICAgICByZWFzb24gPiBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fUk9VVEVfQ0hBTkdFRCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgcmVhc29uIHRvIHVuc2VsZWN0IHJvdXRlIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgLy8gQ2hvb3NlIHRoZSBmYWxsYmFjayByb3V0ZSBpZiBpdCdzIG5vdCBhbHJlYWR5IHNlbGVjdGVkLgotICAgICAgICAvLyBPdGhlcndpc2UsIHNlbGVjdCB0aGUgZGVmYXVsdCByb3V0ZS4KLSAgICAgICAgUm91dGVJbmZvIGZhbGxiYWNrUm91dGUgPSBzR2xvYmFsLmNob29zZUZhbGxiYWNrUm91dGUoKTsKLSAgICAgICAgaWYgKHNHbG9iYWwuZ2V0U2VsZWN0ZWRSb3V0ZSgpICE9IGZhbGxiYWNrUm91dGUpIHsKLSAgICAgICAgICAgIHNHbG9iYWwuc2VsZWN0Um91dGUoZmFsbGJhY2tSb3V0ZSwgcmVhc29uKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNHbG9iYWwuc2VsZWN0Um91dGUoc0dsb2JhbC5nZXREZWZhdWx0Um91dGUoKSwgcmVhc29uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhIHJvdXRlIHRoYXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgYW55IGF2YWlsYWJsZSByb3V0ZXMgdGhhdCBtYXRjaCB0aGUKLSAgICAgKiBzZWxlY3RvciByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSBhcmUgZW5hYmxlZCBvciBkaXNhYmxlZC4gSWYgdGhlCi0gICAgICoge0BsaW5rICNBVkFJTEFCSUxJVFlfRkxBR19JR05PUkVfREVGQVVMVF9ST1VURX0gZmxhZyBpcyBzcGVjaWZpZWQsIHRoZW4KLSAgICAgKiB0aGUgbWV0aG9kIHdpbGwgb25seSBjb25zaWRlciBub24tZGVmYXVsdCByb3V0ZXMuCi0gICAgICogPC9wPgotICAgICAqIDxwIGNsYXNzPSJub3RlIj4KLSAgICAgKiBPbiB7QGxpbmsgQWN0aXZpdHlNYW5hZ2VyI2lzTG93UmFtRGV2aWNlIGxvdy1SQU0gZGV2aWNlc30gdGhpcyBtZXRob2QKLSAgICAgKiB3aWxsIHJldHVybiB0cnVlIGlmIGl0IGlzIHBvc3NpYmxlIHRvIGRpc2NvdmVyIGEgbWF0Y2hpbmcgcm91dGUgZXZlbiBpZgotICAgICAqIGRpc2NvdmVyeSBpcyBub3QgaW4gcHJvZ3Jlc3Mgb3IgaWYgbm8gbWF0Y2hpbmcgcm91dGUgaGFzIHlldCBiZWVuIGZvdW5kLgotICAgICAqIFVzZSB7QGxpbmsgI0FWQUlMQUJJTElUWV9GTEFHX1JFUVVJUkVfTUFUQ0h9IHRvIHJlcXVpcmUgYW4gYWN0dWFsIG1hdGNoLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IgdG8gbWF0Y2guCi0gICAgICogQHBhcmFtIGZsYWdzIEZsYWdzIHRvIGNvbnRyb2wgdGhlIGRldGVybWluYXRpb24gb2Ygd2hldGhlciBhIHJvdXRlIG1heSBiZQotICAgICAqICAgICAgICAgICAgYXZhaWxhYmxlLiBNYXkgYmUgemVybyBvciBzb21lIGNvbWJpbmF0aW9uIG9mCi0gICAgICogICAgICAgICAgICB7QGxpbmsgI0FWQUlMQUJJTElUWV9GTEFHX0lHTk9SRV9ERUZBVUxUX1JPVVRFfSBhbmQKLSAgICAgKiAgICAgICAgICAgIHtAbGluayAjQVZBSUxBQklMSVRZX0ZMQUdfUkVRVUlSRV9NQVRDSH0uCi0gICAgICogQHJldHVybiBUcnVlIGlmIGEgbWF0Y2hpbmcgcm91dGUgbWF5IGJlIGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JvdXRlQXZhaWxhYmxlKEBOb25OdWxsIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvciwgaW50IGZsYWdzKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgcmV0dXJuIHNHbG9iYWwuaXNSb3V0ZUF2YWlsYWJsZShzZWxlY3RvciwgZmxhZ3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGRpc2NvdmVyIHJvdXRlcyB0aGF0IG1hdGNoIHRoZSBzZWxlY3RvciBhbmQgdG8gcmVjZWl2ZQotICAgICAqIGV2ZW50cyB3aGVuIHRoZXkgY2hhbmdlLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIGNhbGxpbmcKLSAgICAgKiB7QGxpbmsgI2FkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3RvciwgQ2FsbGJhY2ssIGludCl9IHdpdGhvdXQgZmxhZ3MuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHNlbGVjdG9yIEEgcm91dGUgc2VsZWN0b3IgdGhhdCBpbmRpY2F0ZXMgdGhlIGtpbmRzIG9mIHJvdXRlcyB0aGF0IHRoZQotICAgICAqIGNhbGxiYWNrIHdvdWxkIGxpa2UgdG8gZGlzY292ZXIuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBhZGQuCi0gICAgICogQHNlZSAjcmVtb3ZlQ2FsbGJhY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRDYWxsYmFjayhNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IsIENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGFkZENhbGxiYWNrKHNlbGVjdG9yLCBjYWxsYmFjaywgMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gZGlzY292ZXIgcm91dGVzIHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yIGFuZCB0byByZWNlaXZlCi0gICAgICogZXZlbnRzIHdoZW4gdGhleSBjaGFuZ2UuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHNlbGVjdG9yIGRlc2NyaWJlcyB0aGUga2luZHMgb2Ygcm91dGVzIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHdhbnRzIHRvCi0gICAgICogZGlzY292ZXIuICBGb3IgZXhhbXBsZSwgaWYgdGhlIGFwcGxpY2F0aW9uIHdhbnRzIHRvIHVzZQotICAgICAqIGxpdmUgYXVkaW8gcm91dGVzIHRoZW4gaXQgc2hvdWxkIGluY2x1ZGUgdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9MSVZFX0FVRElPIGxpdmUgYXVkaW8gbWVkaWEgY29udHJvbCBpbnRlbnQgY2F0ZWdvcnl9Ci0gICAgICogaW4gaXRzIHNlbGVjdG9yIHdoZW4gaXQgYWRkcyBhIGNhbGxiYWNrIHRvIHRoZSBtZWRpYSByb3V0ZXIuCi0gICAgICogVGhlIHNlbGVjdG9yIG1heSBpbmNsdWRlIGFueSBudW1iZXIgb2YgY2F0ZWdvcmllcy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSWYgdGhlIGNhbGxiYWNrIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCwgdGhlbiB0aGUgc2VsZWN0b3IgaXMgYWRkZWQgdG8KLSAgICAgKiB0aGUgc2V0IG9mIHNlbGVjdG9ycyBiZWluZyBtb25pdG9yZWQgYnkgdGhlIGNhbGxiYWNrLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBCeSBkZWZhdWx0LCB0aGUgY2FsbGJhY2sgd2lsbCBvbmx5IGJlIGludm9rZWQgZm9yIGV2ZW50cyB0aGF0IGFmZmVjdCByb3V0ZXMKLSAgICAgKiB0aGF0IG1hdGNoIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IuICBFdmVudCBmaWx0ZXJpbmcgbWF5IGJlIGRpc2FibGVkIGJ5IHNwZWNpZnlpbmcKLSAgICAgKiB0aGUge0BsaW5rICNDQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTfSBmbGFnIHdoZW4gdGhlIGNhbGxiYWNrIGlzIHJlZ2lzdGVyZWQuCi0gICAgICogPC9wPjxwPgotICAgICAqIEFwcGxpY2F0aW9ucyBzaG91bGQgdXNlIHRoZSB7QGxpbmsgI2lzUm91dGVBdmFpbGFibGV9IG1ldGhvZCB0byBkZXRlcm1pbmUKLSAgICAgKiB3aGV0aGVyIGlzIGl0IHBvc3NpYmxlIHRvIGRpc2NvdmVyIGEgcm91dGUgd2l0aCB0aGUgZGVzaXJlZCBjYXBhYmlsaXRpZXMKLSAgICAgKiBhbmQgdGhlcmVmb3JlIHdoZXRoZXIgdGhlIG1lZGlhIHJvdXRlIGJ1dHRvbiBzaG91bGQgYmUgc2hvd24gdG8gdGhlIHVzZXIuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUll9IGZsYWcgc2hvdWxkIGJlIHVzZWQgd2hpbGUgdGhlIGFwcGxpY2F0aW9uCi0gICAgICogaXMgaW4gdGhlIGZvcmVncm91bmQgdG8gcmVxdWVzdCB0aGF0IHBhc3NpdmUgZGlzY292ZXJ5IGJlIHBlcmZvcm1lZCBpZiB0aGVyZSBhcmUKLSAgICAgKiBzdWZmaWNpZW50IHJlc291cmNlcyB0byBhbGxvdyBjb250aW51b3VzIHBhc3NpdmUgZGlzY292ZXJ5LgotICAgICAqIE9uIHtAbGluayBBY3Rpdml0eU1hbmFnZXIjaXNMb3dSYW1EZXZpY2UgbG93LVJBTSBkZXZpY2VzfSB0aGlzIGZsYWcgd2lsbCBiZQotICAgICAqIGlnbm9yZWQgdG8gY29uc2VydmUgcmVzb3VyY2VzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUge0BsaW5rICNDQUxMQkFDS19GTEFHX0ZPUkNFX0RJU0NPVkVSWX0gZmxhZyBzaG91bGQgYmUgdXNlZCB3aGVuCi0gICAgICogcGFzc2l2ZSBkaXNjb3ZlcnkgYWJzb2x1dGVseSBtdXN0IGJlIHBlcmZvcm1lZCwgZXZlbiBvbiBsb3ctUkFNIGRldmljZXMuCi0gICAgICogVGhpcyBmbGFnIGhhcyBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGltcGFjdCBvbiBsb3ctUkFNIGRldmljZXMKLSAgICAgKiBzaW5jZSBpdCBtYXkgY2F1c2UgbWFueSBtZWRpYSByb3V0ZSBwcm92aWRlcnMgdG8gYmUgc3RhcnRlZCBzaW11bHRhbmVvdXNseS4KLSAgICAgKiBJdCBpcyBtdWNoIGJldHRlciB0byB1c2Uge0BsaW5rICNDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZfSBpbnN0ZWFkIHRvIGF2b2lkCi0gICAgICogcGVyZm9ybWluZyBwYXNzaXZlIGRpc2NvdmVyeSBvbiB0aGVzZSBkZXZpY2VzIGFsdG9nZXRoZXIuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTn0gZmxhZyBzaG91bGQgYmUgdXNlZCB3aGVuIHRoZQotICAgICAqIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nIGlzIHNob3dpbmcgdG8gY29uZmlybSB0aGUgcHJlc2VuY2Ugb2YgYXZhaWxhYmxlCi0gICAgICogcm91dGVzIHRoYXQgdGhlIHVzZXIgbWF5IGNvbm5lY3QgdG8uICBUaGlzIGZsYWcgbWF5IHVzZSBzdWJzdGFudGlhbGx5IG1vcmUKLSAgICAgKiBwb3dlci4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+RXhhbXBsZTwvaDM+Ci0gICAgICogPHByZT4KLSAgICAgKiBwdWJsaWMgY2xhc3MgTXlBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLSAgICAgKiAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlciBtUm91dGVyOwotICAgICAqICAgICBwcml2YXRlIE1lZGlhUm91dGVyLkNhbGxiYWNrIG1DYWxsYmFjazsKLSAgICAgKiAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVNlbGVjdG9yOwotICAgICAqCi0gICAgICogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgKiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0gICAgICoKLSAgICAgKiAgICAgICAgIG1Sb3V0ZXIgPSBNZWRpYXJvdXRlci5nZXRJbnN0YW5jZSh0aGlzKTsKLSAgICAgKiAgICAgICAgIG1DYWxsYmFjayA9IG5ldyBNeUNhbGxiYWNrKCk7Ci0gICAgICogICAgICAgICBtU2VsZWN0b3IgPSBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIoKQotICAgICAqICAgICAgICAgICAgICAgICAuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKQotICAgICAqICAgICAgICAgICAgICAgICAuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spCi0gICAgICogICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAqICAgICB9Ci0gICAgICoKLSAgICAgKiAgICAgLy8gQWRkIHRoZSBjYWxsYmFjayBvbiBzdGFydCB0byB0ZWxsIHRoZSBtZWRpYSByb3V0ZXIgd2hhdCBraW5kcyBvZiByb3V0ZXMKLSAgICAgKiAgICAgLy8gdGhlIGFwcGxpY2F0aW9uIGlzIGludGVyZXN0ZWQgaW4gc28gdGhhdCBpdCBjYW4gdHJ5IHRvIGRpc2NvdmVyIHN1aXRhYmxlIG9uZXMuCi0gICAgICogICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKSB7Ci0gICAgICogICAgICAgICBzdXBlci5vblN0YXJ0KCk7Ci0gICAgICoKLSAgICAgKiAgICAgICAgIG1lZGlhUm91dGVyLmFkZENhbGxiYWNrKG1TZWxlY3RvciwgbUNhbGxiYWNrLAotICAgICAqICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZKTsKLSAgICAgKgotICAgICAqICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gbWVkaWFSb3V0ZXIudXBkYXRlU2VsZWN0ZWRSb3V0ZShtU2VsZWN0b3IpOwotICAgICAqICAgICAgICAgLy8gZG8gc29tZXRoaW5nIHdpdGggdGhlIHJvdXRlLi4uCi0gICAgICogICAgIH0KLSAgICAgKgotICAgICAqICAgICAvLyBSZW1vdmUgdGhlIHNlbGVjdG9yIG9uIHN0b3AgdG8gdGVsbCB0aGUgbWVkaWEgcm91dGVyIHRoYXQgaXQgbm8gbG9uZ2VyCi0gICAgICogICAgIC8vIG5lZWRzIHRvIGludmVzdCBlZmZvcnQgdHJ5aW5nIHRvIGRpc2NvdmVyIHJvdXRlcyBvZiB0aGVzZSBraW5kcyBmb3Igbm93LgotICAgICAqICAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7Ci0gICAgICogICAgICAgICBzdXBlci5vblN0b3AoKTsKLSAgICAgKgotICAgICAqICAgICAgICAgbWVkaWFSb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAgICAgKiAgICAgfQotICAgICAqCi0gICAgICogICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTXlDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVyLkNhbGxiYWNrIHsKLSAgICAgKiAgICAgICAgIC8vIEltcGxlbWVudCBjYWxsYmFjayBtZXRob2RzIGFzIG5lZWRlZC4KLSAgICAgKiAgICAgfQotICAgICAqIH0KLSAgICAgKiA8L3ByZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBBIHJvdXRlIHNlbGVjdG9yIHRoYXQgaW5kaWNhdGVzIHRoZSBraW5kcyBvZiByb3V0ZXMgdGhhdCB0aGUKLSAgICAgKiBjYWxsYmFjayB3b3VsZCBsaWtlIHRvIGRpc2NvdmVyLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gYWRkLgotICAgICAqIEBwYXJhbSBmbGFncyBGbGFncyB0byBjb250cm9sIHRoZSBiZWhhdmlvciBvZiB0aGUgY2FsbGJhY2suCi0gICAgICogTWF5IGJlIHplcm8gb3IgYSBjb21iaW5hdGlvbiBvZiB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTn0gYW5kCi0gICAgICoge0BsaW5rICNDQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTfS4KLSAgICAgKiBAc2VlICNyZW1vdmVDYWxsYmFjawotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZENhbGxiYWNrKEBOb25OdWxsIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvciwgQE5vbk51bGwgQ2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICBAQ2FsbGJhY2tGbGFncyBpbnQgZmxhZ3MpIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkQ2FsbGJhY2s6IHNlbGVjdG9yPSIgKyBzZWxlY3RvcgotICAgICAgICAgICAgICAgICAgICArICIsIGNhbGxiYWNrPSIgKyBjYWxsYmFjayArICIsIGZsYWdzPSIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGZsYWdzKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBDYWxsYmFja1JlY29yZCByZWNvcmQ7Ci0gICAgICAgIGludCBpbmRleCA9IGZpbmRDYWxsYmFja1JlY29yZChjYWxsYmFjayk7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIHJlY29yZCA9IG5ldyBDYWxsYmFja1JlY29yZCh0aGlzLCBjYWxsYmFjayk7Ci0gICAgICAgICAgICBtQ2FsbGJhY2tSZWNvcmRzLmFkZChyZWNvcmQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVjb3JkID0gbUNhbGxiYWNrUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gdXBkYXRlTmVlZGVkID0gZmFsc2U7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiB+cmVjb3JkLm1GbGFncykgIT0gMCkgewotICAgICAgICAgICAgcmVjb3JkLm1GbGFncyB8PSBmbGFnczsKLSAgICAgICAgICAgIHVwZGF0ZU5lZWRlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFyZWNvcmQubVNlbGVjdG9yLmNvbnRhaW5zKHNlbGVjdG9yKSkgewotICAgICAgICAgICAgcmVjb3JkLm1TZWxlY3RvciA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlcihyZWNvcmQubVNlbGVjdG9yKQotICAgICAgICAgICAgICAgICAgICAuYWRkU2VsZWN0b3Ioc2VsZWN0b3IpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICAgICAgdXBkYXRlTmVlZGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAodXBkYXRlTmVlZGVkKSB7Ci0gICAgICAgICAgICBzR2xvYmFsLnVwZGF0ZURpc2NvdmVyeVJlcXVlc3QoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBjYWxsYmFjay4gIEl0IHdpbGwgbm8gbG9uZ2VyIHJlY2VpdmUgZXZlbnRzIGFib3V0Ci0gICAgICogY2hhbmdlcyB0byBtZWRpYSByb3V0ZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlbW92ZS4KLSAgICAgKiBAc2VlICNhZGRDYWxsYmFjawotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNhbGxiYWNrKEBOb25OdWxsIENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYWxsYmFjayBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJyZW1vdmVDYWxsYmFjazogY2FsbGJhY2s9IiArIGNhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBpbmRleCA9IGZpbmRDYWxsYmFja1JlY29yZChjYWxsYmFjayk7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2tSZWNvcmRzLnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICBzR2xvYmFsLnVwZGF0ZURpc2NvdmVyeVJlcXVlc3QoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGZpbmRDYWxsYmFja1JlY29yZChDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtQ2FsbGJhY2tSZWNvcmRzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobUNhbGxiYWNrUmVjb3Jkcy5nZXQoaSkubUNhbGxiYWNrID09IGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHdpdGhpbiB0aGlzIGFwcGxpY2F0aW9uIHByb2Nlc3MuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHByb3ZpZGVyIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgcHJvdmlkZXJzIHRoYXQgYWxsIHtAbGluayBNZWRpYVJvdXRlcn0KLSAgICAgKiBpbnN0YW5jZXMgd2l0aGluIHRoaXMgcHJvY2VzcyBjYW4gdXNlIHRvIGRpc2NvdmVyIHJvdXRlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvdmlkZXJJbnN0YW5jZSBUaGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgaW5zdGFuY2UgdG8gYWRkLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlUHJvdmlkZXIKLSAgICAgKiBAc2VlICNyZW1vdmVDYWxsYmFjawotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFByb3ZpZGVyKEBOb25OdWxsIE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlckluc3RhbmNlKSB7Ci0gICAgICAgIGlmIChwcm92aWRlckluc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInByb3ZpZGVySW5zdGFuY2UgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkUHJvdmlkZXI6ICIgKyBwcm92aWRlckluc3RhbmNlKTsKLSAgICAgICAgfQotICAgICAgICBzR2xvYmFsLmFkZFByb3ZpZGVyKHByb3ZpZGVySW5zdGFuY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVucmVnaXN0ZXJzIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgd2l0aGluIHRoaXMgYXBwbGljYXRpb24gcHJvY2Vzcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcHJvdmlkZXIgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3Qgb2YgcHJvdmlkZXJzIHRoYXQgYWxsIHtAbGluayBNZWRpYVJvdXRlcn0KLSAgICAgKiBpbnN0YW5jZXMgd2l0aGluIHRoaXMgcHJvY2VzcyBjYW4gdXNlIHRvIGRpc2NvdmVyIHJvdXRlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvdmlkZXJJbnN0YW5jZSBUaGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgaW5zdGFuY2UgdG8gcmVtb3ZlLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlUHJvdmlkZXIKLSAgICAgKiBAc2VlICNhZGRDYWxsYmFjawotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3ZpZGVyKEBOb25OdWxsIE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlckluc3RhbmNlKSB7Ci0gICAgICAgIGlmIChwcm92aWRlckluc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInByb3ZpZGVySW5zdGFuY2UgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVtb3ZlUHJvdmlkZXI6ICIgKyBwcm92aWRlckluc3RhbmNlKTsKLSAgICAgICAgfQotICAgICAgICBzR2xvYmFsLnJlbW92ZVByb3ZpZGVyKHByb3ZpZGVySW5zdGFuY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSByZW1vdGUgY29udHJvbCBjbGllbnQgdG8gZW5hYmxlIHJlbW90ZSBjb250cm9sIG9mIHRoZSB2b2x1bWUKLSAgICAgKiBvZiB0aGUgc2VsZWN0ZWQgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlbW90ZSBjb250cm9sIGNsaWVudCBtdXN0IGhhdmUgcHJldmlvdXNseSBiZWVuIHJlZ2lzdGVyZWQgd2l0aAotICAgICAqIHRoZSBhdWRpbyBtYW5hZ2VyIHVzaW5nIHRoZSB7QGxpbmsgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXIjcmVnaXN0ZXJSZW1vdGVDb250cm9sQ2xpZW50Ci0gICAgICogQXVkaW9NYW5hZ2VyLnJlZ2lzdGVyUmVtb3RlQ29udHJvbENsaWVudH0gbWV0aG9kLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZW1vdGVDb250cm9sQ2xpZW50IFRoZSB7QGxpbmsgYW5kcm9pZC5tZWRpYS5SZW1vdGVDb250cm9sQ2xpZW50fSB0byByZWdpc3Rlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRSZW1vdGVDb250cm9sQ2xpZW50KEBOb25OdWxsIE9iamVjdCByZW1vdGVDb250cm9sQ2xpZW50KSB7Ci0gICAgICAgIGlmIChyZW1vdGVDb250cm9sQ2xpZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJlbW90ZUNvbnRyb2xDbGllbnQgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkUmVtb3RlQ29udHJvbENsaWVudDogIiArIHJlbW90ZUNvbnRyb2xDbGllbnQpOwotICAgICAgICB9Ci0gICAgICAgIHNHbG9iYWwuYWRkUmVtb3RlQ29udHJvbENsaWVudChyZW1vdGVDb250cm9sQ2xpZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEgcmVtb3RlIGNvbnRyb2wgY2xpZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIHJlbW90ZUNvbnRyb2xDbGllbnQgVGhlIHtAbGluayBhbmRyb2lkLm1lZGlhLlJlbW90ZUNvbnRyb2xDbGllbnR9Ci0gICAgICogICAgICAgICAgICB0byB1bnJlZ2lzdGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJlbW90ZUNvbnRyb2xDbGllbnQoQE5vbk51bGwgT2JqZWN0IHJlbW90ZUNvbnRyb2xDbGllbnQpIHsKLSAgICAgICAgaWYgKHJlbW90ZUNvbnRyb2xDbGllbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicmVtb3RlQ29udHJvbENsaWVudCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInJlbW92ZVJlbW90ZUNvbnRyb2xDbGllbnQ6ICIgKyByZW1vdGVDb250cm9sQ2xpZW50KTsKLSAgICAgICAgfQotICAgICAgICBzR2xvYmFsLnJlbW92ZVJlbW90ZUNvbnRyb2xDbGllbnQocmVtb3RlQ29udHJvbENsaWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgc2Vzc2lvbiB0byBlbmFibGUgcmVtb3RlIGNvbnRyb2wgb2YgdGhlIHZvbHVtZSBvZiB0aGUKLSAgICAgKiBzZWxlY3RlZCByb3V0ZS4gVGhpcyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mCi0gICAgICoge0BsaW5rICNhZGRSZW1vdGVDb250cm9sQ2xpZW50fSB3aGVuIHVzaW5nIG1lZGlhIHNlc3Npb25zLiBTZXQgdGhlCi0gICAgICogc2Vzc2lvbiB0byBudWxsIHRvIGNsZWFyIGl0LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lZGlhU2Vzc2lvbiBUaGUge0BsaW5rIGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb259IHRvCi0gICAgICogICAgICAgICAgICB1c2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWVkaWFTZXNzaW9uKE9iamVjdCBtZWRpYVNlc3Npb24pIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJhZGRNZWRpYVNlc3Npb246ICIgKyBtZWRpYVNlc3Npb24pOwotICAgICAgICB9Ci0gICAgICAgIHNHbG9iYWwuc2V0TWVkaWFTZXNzaW9uKG1lZGlhU2Vzc2lvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGNvbXBhdCBtZWRpYSBzZXNzaW9uIHRvIGVuYWJsZSByZW1vdGUgY29udHJvbCBvZiB0aGUgdm9sdW1lIG9mIHRoZQotICAgICAqIHNlbGVjdGVkIHJvdXRlLiBUaGlzIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YKLSAgICAgKiB7QGxpbmsgI2FkZFJlbW90ZUNvbnRyb2xDbGllbnR9IHdoZW4gdXNpbmcge0BsaW5rIE1lZGlhU2Vzc2lvbkNvbXBhdH0uCi0gICAgICogU2V0IHRoZSBzZXNzaW9uIHRvIG51bGwgdG8gY2xlYXIgaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVkaWFTZXNzaW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWVkaWFTZXNzaW9uQ29tcGF0KE1lZGlhU2Vzc2lvbkNvbXBhdCBtZWRpYVNlc3Npb24pIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJhZGRNZWRpYVNlc3Npb25Db21wYXQ6ICIgKyBtZWRpYVNlc3Npb24pOwotICAgICAgICB9Ci0gICAgICAgIHNHbG9iYWwuc2V0TWVkaWFTZXNzaW9uQ29tcGF0KG1lZGlhU2Vzc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvbkNvbXBhdC5Ub2tlbiBnZXRNZWRpYVNlc3Npb25Ub2tlbigpIHsKLSAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0TWVkaWFTZXNzaW9uVG9rZW4oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbnN1cmVzIHRoYXQgY2FsbHMgaW50byB0aGUgbWVkaWEgcm91dGVyIGFyZSBvbiB0aGUgY29ycmVjdCB0aHJlYWQuCi0gICAgICogSXQgcGF5cyB0byBiZSBhIGxpdHRsZSBwYXJhbm9pZCB3aGVuIGdsb2JhbCBzdGF0ZSBpbnZhcmlhbnRzIGFyZSBhdCByaXNrLgotICAgICAqLwotICAgIHN0YXRpYyB2b2lkIGNoZWNrQ2FsbGluZ1RocmVhZCgpIHsKLSAgICAgICAgaWYgKExvb3Blci5teUxvb3BlcigpICE9IExvb3Blci5nZXRNYWluTG9vcGVyKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBtZWRpYSByb3V0ZXIgc2VydmljZSBtdXN0IG9ubHkgYmUgIgotICAgICAgICAgICAgICAgICAgICArICJhY2Nlc3NlZCBvbiB0aGUgYXBwbGljYXRpb24ncyBtYWluIHRocmVhZC4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyA8VD4gYm9vbGVhbiBlcXVhbChUIGEsIFQgYikgewotICAgICAgICByZXR1cm4gYSA9PSBiIHx8IChhICE9IG51bGwgJiYgYiAhPSBudWxsICYmIGEuZXF1YWxzKGIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCBhIG1lZGlhIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIEVhY2ggbWVkaWEgcm91dGUgaGFzIGEgbGlzdCBvZiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9Ci0gICAgICoge0BsaW5rICNnZXRDb250cm9sRmlsdGVycyBpbnRlbnQgZmlsdGVyc30gdGhhdCBkZXNjcmliZSB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZQotICAgICAqIHJvdXRlIGFuZCB0aGUgbWFubmVyIGluIHdoaWNoIGl0IGlzIHVzZWQgYW5kIGNvbnRyb2xsZWQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUm91dGVJbmZvIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlckluZm8gbVByb3ZpZGVyOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtRGVzY3JpcHRvcklkOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVW5pcXVlSWQ7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1OYW1lOwotICAgICAgICBwcml2YXRlIFN0cmluZyBtRGVzY3JpcHRpb247Ci0gICAgICAgIHByaXZhdGUgVXJpIG1JY29uVXJpOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUVuYWJsZWQ7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQ29ubmVjdGluZzsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUNvbm5lY3Rpb25TdGF0ZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1DYW5EaXNjb25uZWN0OwotICAgICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+IG1Db250cm9sRmlsdGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBwcml2YXRlIGludCBtUGxheWJhY2tUeXBlOwotICAgICAgICBwcml2YXRlIGludCBtUGxheWJhY2tTdHJlYW07Ci0gICAgICAgIHByaXZhdGUgaW50IG1EZXZpY2VUeXBlOwotICAgICAgICBwcml2YXRlIGludCBtVm9sdW1lSGFuZGxpbmc7Ci0gICAgICAgIHByaXZhdGUgaW50IG1Wb2x1bWU7Ci0gICAgICAgIHByaXZhdGUgaW50IG1Wb2x1bWVNYXg7Ci0gICAgICAgIHByaXZhdGUgRGlzcGxheSBtUHJlc2VudGF0aW9uRGlzcGxheTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVByZXNlbnRhdGlvbkRpc3BsYXlJZCA9IFBSRVNFTlRBVElPTl9ESVNQTEFZX0lEX05PTkU7Ci0gICAgICAgIHByaXZhdGUgQnVuZGxlIG1FeHRyYXM7Ci0gICAgICAgIHByaXZhdGUgSW50ZW50U2VuZGVyIG1TZXR0aW5nc0ludGVudDsKLSAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IgbURlc2NyaXB0b3I7Ci0KLSAgICAgICAgQEludERlZih7Q09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQsIENPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElORywKLSAgICAgICAgICAgICAgICBDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKLSAgICAgICAgcHJpdmF0ZSBAaW50ZXJmYWNlIENvbm5lY3Rpb25TdGF0ZSB7fQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgZGVmYXVsdCBjb25uZWN0aW9uIHN0YXRlIGluZGljYXRpbmcgdGhlIHJvdXRlIGlzIGRpc2Nvbm5lY3RlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0Q29ubmVjdGlvblN0YXRlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRCA9IDA7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgY29ubmVjdGlvbiBzdGF0ZSBpbmRpY2F0aW5nIHRoZSByb3V0ZSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBjb25uZWN0aW5nIGFuZCBpcyBub3QgeWV0Ci0gICAgICAgICAqIHJlYWR5IGZvciB1c2UuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldENvbm5lY3Rpb25TdGF0ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HID0gMTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQSBjb25uZWN0aW9uIHN0YXRlIGluZGljYXRpbmcgdGhlIHJvdXRlIGlzIGNvbm5lY3RlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0Q29ubmVjdGlvblN0YXRlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRCA9IDI7Ci0KLSAgICAgICAgQEludERlZih7UExBWUJBQ0tfVFlQRV9MT0NBTCxQTEFZQkFDS19UWVBFX1JFTU9URX0pCi0gICAgICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKLSAgICAgICAgcHJpdmF0ZSBAaW50ZXJmYWNlIFBsYXliYWNrVHlwZSB7fQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgZGVmYXVsdCBwbGF5YmFjayB0eXBlLCAibG9jYWwiLCBpbmRpY2F0aW5nIHRoZSBwcmVzZW50YXRpb24gb2YgdGhlIG1lZGlhCi0gICAgICAgICAqIGlzIGhhcHBlbmluZyBvbiB0aGUgc2FtZSBkZXZpY2UgKGUuZy4gYSBwaG9uZSwgYSB0YWJsZXQpIGFzIHdoZXJlIGl0IGlzCi0gICAgICAgICAqIGNvbnRyb2xsZWQgZnJvbS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0UGxheWJhY2tUeXBlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19UWVBFX0xPQ0FMID0gMDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQSBwbGF5YmFjayB0eXBlIGluZGljYXRpbmcgdGhlIHByZXNlbnRhdGlvbiBvZiB0aGUgbWVkaWEgaXMgaGFwcGVuaW5nIG9uCi0gICAgICAgICAqIGEgZGlmZmVyZW50IGRldmljZSAoaS5lLiB0aGUgcmVtb3RlIGRldmljZSkgdGhhbiB3aGVyZSBpdCBpcyBjb250cm9sbGVkIGZyb20uCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldFBsYXliYWNrVHlwZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfVFlQRV9SRU1PVEUgPSAxOwotCi0gICAgICAgIEBJbnREZWYoe0RFVklDRV9UWVBFX1VOS05PV04sIERFVklDRV9UWVBFX1RWLCBERVZJQ0VfVFlQRV9TUEVBS0VSLCBERVZJQ0VfVFlQRV9CTFVFVE9PVEh9KQotICAgICAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi0gICAgICAgIHByaXZhdGUgQGludGVyZmFjZSBEZXZpY2VUeXBlIHt9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBkZWZhdWx0IHJlY2VpdmVyIGRldmljZSB0eXBlIG9mIHRoZSByb3V0ZSBpbmRpY2F0aW5nIHRoZSB0eXBlIGlzIHVua25vd24uCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldERldmljZVR5cGUKLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9UWVBFX1VOS05PV04gPSAwOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBIHJlY2VpdmVyIGRldmljZSB0eXBlIG9mIHRoZSByb3V0ZSBpbmRpY2F0aW5nIHRoZSBwcmVzZW50YXRpb24gb2YgdGhlIG1lZGlhIGlzIGhhcHBlbmluZwotICAgICAgICAgKiBvbiBhIFRWLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXREZXZpY2VUeXBlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfVFlQRV9UViA9IDE7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgcmVjZWl2ZXIgZGV2aWNlIHR5cGUgb2YgdGhlIHJvdXRlIGluZGljYXRpbmcgdGhlIHByZXNlbnRhdGlvbiBvZiB0aGUgbWVkaWEgaXMgaGFwcGVuaW5nCi0gICAgICAgICAqIG9uIGEgc3BlYWtlci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0RGV2aWNlVHlwZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1RZUEVfU1BFQUtFUiA9IDI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgcmVjZWl2ZXIgZGV2aWNlIHR5cGUgb2YgdGhlIHJvdXRlIGluZGljYXRpbmcgdGhlIHByZXNlbnRhdGlvbiBvZiB0aGUgbWVkaWEgaXMgaGFwcGVuaW5nCi0gICAgICAgICAqIG9uIGEgYmx1ZXRvb3RoIGRldmljZSBzdWNoIGFzIGEgYmx1ZXRvb3RoIHNwZWFrZXIuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldERldmljZVR5cGUKLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9UWVBFX0JMVUVUT09USCA9IDM7Ci0KLSAgICAgICAgQEludERlZih7UExBWUJBQ0tfVk9MVU1FX0ZJWEVELFBMQVlCQUNLX1ZPTFVNRV9WQVJJQUJMRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKLSAgICAgICAgcHJpdmF0ZSBAaW50ZXJmYWNlIFBsYXliYWNrVm9sdW1lIHt9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBsYXliYWNrIGluZm9ybWF0aW9uIGluZGljYXRpbmcgdGhlIHBsYXliYWNrIHZvbHVtZSBpcyBmaXhlZCwgaS5lLiBpdCBjYW5ub3QgYmUKLSAgICAgICAgICogY29udHJvbGxlZCBmcm9tIHRoaXMgb2JqZWN0LiBBbiBleGFtcGxlIG9mIGZpeGVkIHBsYXliYWNrIHZvbHVtZSBpcyBhIHJlbW90ZSBwbGF5ZXIsCi0gICAgICAgICAqIHBsYXlpbmcgb3ZlciBIRE1JIHdoZXJlIHRoZSB1c2VyIHByZWZlcnMgdG8gY29udHJvbCB0aGUgdm9sdW1lIG9uIHRoZSBIRE1JIHNpbmssIHJhdGhlcgotICAgICAgICAgKiB0aGFuIGF0dGVudWF0ZSBhdCB0aGUgc291cmNlLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXRWb2x1bWVIYW5kbGluZwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfVk9MVU1FX0ZJWEVEID0gMDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogUGxheWJhY2sgaW5mb3JtYXRpb24gaW5kaWNhdGluZyB0aGUgcGxheWJhY2sgdm9sdW1lIGlzIHZhcmlhYmxlIGFuZCBjYW4gYmUgY29udHJvbGxlZAotICAgICAgICAgKiBmcm9tIHRoaXMgb2JqZWN0LgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXRWb2x1bWVIYW5kbGluZwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfVk9MVU1FX1ZBUklBQkxFID0gMTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGRlZmF1bHQgcHJlc2VudGF0aW9uIGRpc3BsYXkgaWQgaW5kaWNhdGluZyBubyBwcmVzZW50YXRpb24gZGlzcGxheSBpcyBhc3NvY2lhdGVkCi0gICAgICAgICAqIHdpdGggdGhlIHJvdXRlLgotICAgICAgICAgKiBAaGlkZQotICAgICAgICAgKi8KLSAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFU0VOVEFUSU9OX0RJU1BMQVlfSURfTk9ORSA9IC0xOwotCi0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFX0dFTkVSQUwgPSAxIDw8IDA7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFX1ZPTFVNRSA9IDEgPDwgMTsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBDSEFOR0VfUFJFU0VOVEFUSU9OX0RJU1BMQVkgPSAxIDw8IDI7Ci0KLSAgICAgICAgLy8gU2hvdWxkIG1hdGNoIHRvIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlci5QQUNLQUdFX05BTUUuCi0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lTVEVNX01FRElBX1JPVVRFX1BST1ZJREVSX1BBQ0tBR0VfTkFNRSA9ICJhbmRyb2lkIjsKLQotICAgICAgICBSb3V0ZUluZm8oUHJvdmlkZXJJbmZvIHByb3ZpZGVyLCBTdHJpbmcgZGVzY3JpcHRvcklkLCBTdHJpbmcgdW5pcXVlSWQpIHsKLSAgICAgICAgICAgIG1Qcm92aWRlciA9IHByb3ZpZGVyOwotICAgICAgICAgICAgbURlc2NyaXB0b3JJZCA9IGRlc2NyaXB0b3JJZDsKLSAgICAgICAgICAgIG1VbmlxdWVJZCA9IHVuaXF1ZUlkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb3ZpZGVyIG9mIHRoaXMgbWVkaWEgcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgUHJvdmlkZXJJbmZvIGdldFByb3ZpZGVyKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Qcm92aWRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSB1bmlxdWUgaWQgb2YgdGhlIHJvdXRlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhlIHJvdXRlIHVuaXF1ZSBpZCBmdW5jdGlvbnMgYXMgYSBzdGFibGUgaWRlbnRpZmllciBieSB3aGljaCB0aGUgcm91dGUgaXMga25vd24uCi0gICAgICAgICAqIEZvciBleGFtcGxlLCBhbiBhcHBsaWNhdGlvbiBjYW4gdXNlIHRoaXMgaWQgYXMgYSB0b2tlbiB0byByZW1lbWJlciB0aGUKLSAgICAgICAgICogc2VsZWN0ZWQgcm91dGUgYWNyb3NzIHJlc3RhcnRzIG9yIHRvIGNvbW11bmljYXRlIGl0cyBpZGVudGl0eSB0byBhIHNlcnZpY2UuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZSwgbmV2ZXIgbnVsbC4KLSAgICAgICAgICovCi0gICAgICAgIEBOb25OdWxsCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVVuaXF1ZUlkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHVzZXItdmlzaWJsZSBuYW1lIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSByb3V0ZSBuYW1lIGlkZW50aWZpZXMgdGhlIGRlc3RpbmF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSByb3V0ZS4KLSAgICAgICAgICogSXQgbWF5IGJlIGEgdXNlci1zdXBwbGllZCBuYW1lLCBhbiBhbGlhcywgb3IgZGV2aWNlIHNlcmlhbCBudW1iZXIuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgdXNlci12aXNpYmxlIG5hbWUgb2YgYSBtZWRpYSByb3V0ZS4gIFRoaXMgaXMgdGhlIHN0cmluZyBwcmVzZW50ZWQKLSAgICAgICAgICogdG8gdXNlcnMgd2hvIG1heSBzZWxlY3QgdGhpcyBhcyB0aGUgYWN0aXZlIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG1OYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHVzZXItdmlzaWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGUgcm91dGUgZGVzY3JpcHRpb24gZGVzY3JpYmVzIHRoZSBraW5kIG9mIGRlc3RpbmF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSByb3V0ZS4KLSAgICAgICAgICogSXQgbWF5IGJlIGEgdXNlci1zdXBwbGllZCBzdHJpbmcsIGEgbW9kZWwgbnVtYmVyIG9yIGJyYW5kIG9mIGRldmljZS4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcm91dGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgICAgICovCi0gICAgICAgIEBOdWxsYWJsZQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EZXNjcmlwdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBVUkkgb2YgdGhlIGljb24gcmVwcmVzZW50aW5nIHRoaXMgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGlzIGljb24gd2lsbCBiZSB1c2VkIGluIHBpY2tlciBVSXMgaWYgYXZhaWxhYmxlLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIFVSSSBvZiB0aGUgaWNvbiByZXByZXNlbnRpbmcgdGhpcyByb3V0ZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFVyaSBnZXRJY29uVXJpKCkgewotICAgICAgICAgICAgcmV0dXJuIG1JY29uVXJpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIGVuYWJsZWQgYW5kIG1heSBiZSBzZWxlY3RlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgcm91dGUgaXMgZW5hYmxlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRW5hYmxlZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIGlzIGluIHRoZSBwcm9jZXNzIG9mIGNvbm5lY3RpbmcgYW5kIGlzIG5vdAotICAgICAgICAgKiB5ZXQgcmVhZHkgZm9yIHVzZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgcm91dGUgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgY29ubmVjdGluZy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29ubmVjdGluZzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBjb25uZWN0aW9uIHN0YXRlIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGlzIHJvdXRlOiB7QGxpbmsgI0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEfSwKLSAgICAgICAgICoge0BsaW5rICNDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkd9LCBvciB7QGxpbmsgI0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEfS4KLSAgICAgICAgICovCi0gICAgICAgIEBDb25uZWN0aW9uU3RhdGUKLSAgICAgICAgcHVibGljIGludCBnZXRDb25uZWN0aW9uU3RhdGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbm5lY3Rpb25TdGF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyByb3V0ZSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIGN1cnJlbnRseSBzZWxlY3RlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBNZWRpYVJvdXRlciNnZXRTZWxlY3RlZFJvdXRlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKCkgewotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXRTZWxlY3RlZFJvdXRlKCkgPT0gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyByb3V0ZSBpcyB0aGUgZGVmYXVsdCByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgcm91dGUgaXMgdGhlIGRlZmF1bHQgcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIjZ2V0RGVmYXVsdFJvdXRlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoKSB7Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgICAgIHJldHVybiBzR2xvYmFsLmdldERlZmF1bHRSb3V0ZSgpID09IHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcm91dGUgaXMgYSBibHVldG9vdGggcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIGEgYmx1ZXRvb3RoIHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhUm91dGVyI2dldEJsdWV0b290aFJvdXRlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0JsdWV0b290aCgpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0Qmx1ZXRvb3RoUm91dGUoKSA9PSB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIHRoZSBkZWZhdWx0IHJvdXRlIGFuZCB0aGUgZGV2aWNlIHNwZWFrZXIuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIHRoZSBkZWZhdWx0IHJvdXRlIGFuZCB0aGUgZGV2aWNlIHNwZWFrZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0RldmljZVNwZWFrZXIoKSB7Ci0gICAgICAgICAgICBpbnQgZGVmYXVsdEF1ZGlvUm91dGVOYW1lUmVzb3VyY2VJZCA9IFJlc291cmNlcy5nZXRTeXN0ZW0oKS5nZXRJZGVudGlmaWVyKAotICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdF9hdWRpb19yb3V0ZV9uYW1lIiwgInN0cmluZyIsICJhbmRyb2lkIik7Ci0gICAgICAgICAgICByZXR1cm4gaXNEZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAgICAgJiYgUmVzb3VyY2VzLmdldFN5c3RlbSgpLmdldFRleHQoZGVmYXVsdEF1ZGlvUm91dGVOYW1lUmVzb3VyY2VJZCkuZXF1YWxzKG1OYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIGEgbGlzdCBvZiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50fSBmaWx0ZXJzIHRoYXQKLSAgICAgICAgICogZGVzY3JpYmUgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGlzIHJvdXRlIGFuZCB0aGUgbWVkaWEgY29udHJvbCBhY3Rpb25zIHRoYXQKLSAgICAgICAgICogaXQgc3VwcG9ydHMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gQSBsaXN0IG9mIGludGVudCBmaWx0ZXJzIHRoYXQgc3BlY2lmaWVzIHRoZSBtZWRpYSBjb250cm9sIGludGVudHMgdGhhdAotICAgICAgICAgKiB0aGlzIHJvdXRlIHN1cHBvcnRzLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudAotICAgICAgICAgKiBAc2VlICNzdXBwb3J0c0NvbnRyb2xDYXRlZ29yeQotICAgICAgICAgKiBAc2VlICNzdXBwb3J0c0NvbnRyb2xSZXF1ZXN0Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTGlzdDxJbnRlbnRGaWx0ZXI+IGdldENvbnRyb2xGaWx0ZXJzKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sRmlsdGVyczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIGF0IGxlYXN0IG9uZSBvZiB0aGUgY2FwYWJpbGl0aWVzCi0gICAgICAgICAqIGRlc2NyaWJlZCBieSBhIG1lZGlhIHJvdXRlIHNlbGVjdG9yLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yIHRoYXQgc3BlY2lmaWVzIHRoZSBjYXBhYmlsaXRpZXMgdG8gY2hlY2suCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgYXQgbGVhc3Qgb25lIG9mIHRoZSBjYXBhYmlsaXRpZXMKLSAgICAgICAgICogZGVzY3JpYmVkIGluIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3Rvci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXNTZWxlY3RvcihATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICByZXR1cm4gc2VsZWN0b3IubWF0Y2hlc0NvbnRyb2xGaWx0ZXJzKG1Db250cm9sRmlsdGVycyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyB0aGUgc3BlY2lmaWVkCi0gICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbH0gY2F0ZWdvcnkuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBNZWRpYSBjb250cm9sIGNhdGVnb3JpZXMgZGVzY3JpYmUgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGlzIHJvdXRlCi0gICAgICAgICAqIHN1Y2ggYXMgd2hldGhlciBpdCBzdXBwb3J0cyBsaXZlIGF1ZGlvIHN0cmVhbWluZyBvciByZW1vdGUgcGxheWJhY2suCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNhdGVnb3J5IEEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSBjYXRlZ29yeQotICAgICAgICAgKiBzdWNoIGFzIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9BVURJT30sCi0gICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9WSURFT30sCi0gICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLfSwgb3IgYSBwcm92aWRlci1kZWZpbmVkCi0gICAgICAgICAqIG1lZGlhIGNvbnRyb2wgY2F0ZWdvcnkuCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgdGhlIHNwZWNpZmllZCBpbnRlbnQgY2F0ZWdvcnkuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50Ci0gICAgICAgICAqIEBzZWUgI2dldENvbnRyb2xGaWx0ZXJzCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NvbnRyb2xDYXRlZ29yeShATm9uTnVsbCBTdHJpbmcgY2F0ZWdvcnkpIHsKLSAgICAgICAgICAgIGlmIChjYXRlZ29yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2F0ZWdvcnkgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgICAgIGludCBjb3VudCA9IG1Db250cm9sRmlsdGVycy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobUNvbnRyb2xGaWx0ZXJzLmdldChpKS5oYXNDYXRlZ29yeShjYXRlZ29yeSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgdGhlIHNwZWNpZmllZAotICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IGNhdGVnb3J5IGFuZCBhY3Rpb24uCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBNZWRpYSBjb250cm9sIGFjdGlvbnMgZGVzY3JpYmUgc3BlY2lmaWMgcmVxdWVzdHMgdGhhdCBhbiBhcHBsaWNhdGlvbgotICAgICAgICAgKiBjYW4gYXNrIGEgcm91dGUgdG8gcGVyZm9ybS4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY2F0ZWdvcnkgQSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IGNhdGVnb3J5Ci0gICAgICAgICAqIHN1Y2ggYXMge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9MSVZFX0FVRElPfSwKLSAgICAgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9MSVZFX1ZJREVPfSwKLSAgICAgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0t9LCBvciBhIHByb3ZpZGVyLWRlZmluZWQKLSAgICAgICAgICogbWVkaWEgY29udHJvbCBjYXRlZ29yeS4KLSAgICAgICAgICogQHBhcmFtIGFjdGlvbiBBIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbH0gYWN0aW9uCi0gICAgICAgICAqIHN1Y2ggYXMge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWX0uCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgdGhlIHNwZWNpZmllZCBpbnRlbnQgYWN0aW9uLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudAotICAgICAgICAgKiBAc2VlICNnZXRDb250cm9sRmlsdGVycwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDb250cm9sQWN0aW9uKEBOb25OdWxsIFN0cmluZyBjYXRlZ29yeSwgQE5vbk51bGwgU3RyaW5nIGFjdGlvbikgewotICAgICAgICAgICAgaWYgKGNhdGVnb3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYXRlZ29yeSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYWN0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhY3Rpb24gbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgICAgIGludCBjb3VudCA9IG1Db250cm9sRmlsdGVycy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbUNvbnRyb2xGaWx0ZXJzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsdGVyLmhhc0NhdGVnb3J5KGNhdGVnb3J5KSAmJiBmaWx0ZXIuaGFzQWN0aW9uKGFjdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgdGhlIHNwZWNpZmllZAotICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IHJlcXVlc3QuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBNZWRpYSBjb250cm9sIHJlcXVlc3RzIGFyZSB1c2VkIHRvIHJlcXVlc3QgdGhlIHJvdXRlIHRvIHBlcmZvcm0KLSAgICAgICAgICogYWN0aW9ucyBzdWNoIGFzIHN0YXJ0aW5nIHJlbW90ZSBwbGF5YmFjayBvZiBhIG1lZGlhIGl0ZW0uCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGludGVudCBBIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBpbnRlbnR9LgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvdXRlIGNhbiBoYW5kbGUgdGhlIHNwZWNpZmllZCBpbnRlbnQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50Ci0gICAgICAgICAqIEBzZWUgI2dldENvbnRyb2xGaWx0ZXJzCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NvbnRyb2xSZXF1ZXN0KEBOb25OdWxsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIGlmIChpbnRlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludGVudCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICAgICAgQ29udGVudFJlc29sdmVyIGNvbnRlbnRSZXNvbHZlciA9IHNHbG9iYWwuZ2V0Q29udGVudFJlc29sdmVyKCk7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSBtQ29udHJvbEZpbHRlcnMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Db250cm9sRmlsdGVycy5nZXQoaSkubWF0Y2goY29udGVudFJlc29sdmVyLCBpbnRlbnQsIHRydWUsIFRBRykgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2VuZHMgYSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IHJlcXVlc3QgdG8gYmUgcGVyZm9ybWVkCi0gICAgICAgICAqIGFzeW5jaHJvbm91c2x5IGJ5IHRoZSByb3V0ZSdzIGRlc3RpbmF0aW9uLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogTWVkaWEgY29udHJvbCByZXF1ZXN0cyBhcmUgdXNlZCB0byByZXF1ZXN0IHRoZSByb3V0ZSB0byBwZXJmb3JtCi0gICAgICAgICAqIGFjdGlvbnMgc3VjaCBhcyBzdGFydGluZyByZW1vdGUgcGxheWJhY2sgb2YgYSBtZWRpYSBpdGVtLgotICAgICAgICAgKiA8L3A+PHA+Ci0gICAgICAgICAqIFRoaXMgZnVuY3Rpb24gbWF5IG9ubHkgYmUgY2FsbGVkIG9uIGEgc2VsZWN0ZWQgcm91dGUuICBDb250cm9sIHJlcXVlc3RzCi0gICAgICAgICAqIHNlbnQgdG8gdW5zZWxlY3RlZCByb3V0ZXMgd2lsbCBmYWlsLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpbnRlbnQgQSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50fS4KLSAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIEEge0BsaW5rIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2t9IHRvIGludm9rZSB3aXRoIHRoZSByZXN1bHQKLSAgICAgICAgICogb2YgdGhlIHJlcXVlc3QsIG9yIG51bGwgaWYgbm8gcmVzdWx0IGlzIHJlcXVpcmVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2VuZENvbnRyb2xSZXF1ZXN0KEBOb25OdWxsIEludGVudCBpbnRlbnQsCi0gICAgICAgICAgICAgICAgQE51bGxhYmxlIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGlmIChpbnRlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludGVudCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICAgICAgc0dsb2JhbC5zZW5kQ29udHJvbFJlcXVlc3QodGhpcywgaW50ZW50LCBjYWxsYmFjayk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgdHlwZSBvZiBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgdHlwZSBvZiBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZToge0BsaW5rICNQTEFZQkFDS19UWVBFX0xPQ0FMfQotICAgICAgICAgKiBvciB7QGxpbmsgI1BMQVlCQUNLX1RZUEVfUkVNT1RFfS4KLSAgICAgICAgICovCi0gICAgICAgIEBQbGF5YmFja1R5cGUKLSAgICAgICAgcHVibGljIGludCBnZXRQbGF5YmFja1R5cGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXliYWNrVHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBhdWRpbyBzdHJlYW0gb3ZlciB3aGljaCB0aGUgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUgaXMgcGVyZm9ybWVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBzdHJlYW0gb3ZlciB3aGljaCB0aGUgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUgaXMgcGVyZm9ybWVkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBnZXRQbGF5YmFja1N0cmVhbSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWJhY2tTdHJlYW07Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgdHlwZSBvZiB0aGUgcmVjZWl2ZXIgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSB0eXBlIG9mIHRoZSByZWNlaXZlciBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGU6Ci0gICAgICAgICAqIHtAbGluayAjREVWSUNFX1RZUEVfVFZ9IG9yIHtAbGluayAjREVWSUNFX1RZUEVfU1BFQUtFUn0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldERldmljZVR5cGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURldmljZVR5cGU7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAaGlkZQotICAgICAgICAgKi8KLSAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0T3JCbHVldG9vdGgoKSB7Ci0gICAgICAgICAgICBpZiAoaXNEZWZhdWx0KCkgfHwgbURldmljZVR5cGUgPT0gREVWSUNFX1RZUEVfQkxVRVRPT1RIKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgcGxhdGZvcm0gdmVyc2lvbiAyMyBvciBiZWxvdyB3aGVyZSB0aGUgc3lzdGVtIHJvdXRlCi0gICAgICAgICAgICAvLyBwcm92aWRlciBkb2Vzbid0IHNwZWNpZnkgZGV2aWNlIHR5cGUgZm9yIGJsdWV0b290aCBtZWRpYSByb3V0ZXMuCi0gICAgICAgICAgICByZXR1cm4gaXNTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIodGhpcykKLSAgICAgICAgICAgICAgICAgICAgJiYgc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfQVVESU8pCi0gICAgICAgICAgICAgICAgICAgICYmICFzdXBwb3J0c0NvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9WSURFTyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHJvdXRlIGlzIHNlbGVjdGFibGUuCi0gICAgICAgICAqLwotICAgICAgICBib29sZWFuIGlzU2VsZWN0YWJsZSgpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgdGVzdHMgd2hldGhlciB0aGUgcm91dGUgaXMgc3RpbGwgdmFsaWQgYW5kIGVuYWJsZWQuCi0gICAgICAgICAgICAvLyBUaGUgcm91dGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzZXQgdG8gbnVsbCB3aGVuIHRoZSByb3V0ZSBpcyByZW1vdmVkLgotICAgICAgICAgICAgcmV0dXJuIG1EZXNjcmlwdG9yICE9IG51bGwgJiYgbUVuYWJsZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgcmV0dXJuIFRleHRVdGlscy5lcXVhbHMocm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpLmdldE1ldGFkYXRhKCkuZ2V0UGFja2FnZU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgU1lTVEVNX01FRElBX1JPVVRFX1BST1ZJREVSX1BBQ0tBR0VfTkFNRSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCBob3cgdm9sdW1lIGlzIGhhbmRsZWQgb24gdGhlIHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIEhvdyB2b2x1bWUgaXMgaGFuZGxlZCBvbiB0aGUgcm91dGU6IHtAbGluayAjUExBWUJBQ0tfVk9MVU1FX0ZJWEVEfQotICAgICAgICAgKiBvciB7QGxpbmsgI1BMQVlCQUNLX1ZPTFVNRV9WQVJJQUJMRX0uCi0gICAgICAgICAqLwotICAgICAgICBAUGxheWJhY2tWb2x1bWUKLSAgICAgICAgcHVibGljIGludCBnZXRWb2x1bWVIYW5kbGluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBtVm9sdW1lSGFuZGxpbmc7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgY3VycmVudCB2b2x1bWUgZm9yIHRoaXMgcm91dGUuIERlcGVuZGluZyBvbiB0aGUgcm91dGUsIHRoaXMgbWF5IG9ubHkKLSAgICAgICAgICogYmUgdmFsaWQgaWYgdGhlIHJvdXRlIGlzIGN1cnJlbnRseSBzZWxlY3RlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgdm9sdW1lIGF0IHdoaWNoIHRoZSBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZSBpcyBwZXJmb3JtZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldFZvbHVtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtVm9sdW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIG1heGltdW0gdm9sdW1lIGF0IHdoaWNoIHRoZSBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZSBpcyBwZXJmb3JtZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIG1heGltdW0gdm9sdW1lIGF0IHdoaWNoIHRoZSBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGgKLSAgICAgICAgICogdGhpcyByb3V0ZSBpcyBwZXJmb3JtZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldFZvbHVtZU1heCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtVm9sdW1lTWF4OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgd2hldGhlciB0aGlzIHJvdXRlIHN1cHBvcnRzIGRpc2Nvbm5lY3Rpbmcgd2l0aG91dCBpbnRlcnJ1cHRpbmcKLSAgICAgICAgICogcGxheWJhY2suCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGNhbiBkaXNjb25uZWN0IHdpdGhvdXQgc3RvcHBpbmcgcGxheWJhY2ssCi0gICAgICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gY2FuRGlzY29ubmVjdCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ2FuRGlzY29ubmVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXF1ZXN0cyBhIHZvbHVtZSBjaGFuZ2UgZm9yIHRoaXMgcm91dGUgYXN5bmNocm9ub3VzbHkuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGlzIGZ1bmN0aW9uIG1heSBvbmx5IGJlIGNhbGxlZCBvbiBhIHNlbGVjdGVkIHJvdXRlLiAgSXQgd2lsbCBoYXZlCi0gICAgICAgICAqIG5vIGVmZmVjdCBpZiB0aGUgcm91dGUgaXMgY3VycmVudGx5IHVuc2VsZWN0ZWQuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHZvbHVtZSBUaGUgbmV3IHZvbHVtZSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIHtAbGluayAjZ2V0Vm9sdW1lTWF4fS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RTZXRWb2x1bWUoaW50IHZvbHVtZSkgewotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICBzR2xvYmFsLnJlcXVlc3RTZXRWb2x1bWUodGhpcywgTWF0aC5taW4obVZvbHVtZU1heCwgTWF0aC5tYXgoMCwgdm9sdW1lKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlcXVlc3RzIGFuIGluY3JlbWVudGFsIHZvbHVtZSB1cGRhdGUgZm9yIHRoaXMgcm91dGUgYXN5bmNocm9ub3VzbHkuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGlzIGZ1bmN0aW9uIG1heSBvbmx5IGJlIGNhbGxlZCBvbiBhIHNlbGVjdGVkIHJvdXRlLiAgSXQgd2lsbCBoYXZlCi0gICAgICAgICAqIG5vIGVmZmVjdCBpZiB0aGUgcm91dGUgaXMgY3VycmVudGx5IHVuc2VsZWN0ZWQuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGRlbHRhIFRoZSBkZWx0YSB0byBhZGQgdG8gdGhlIGN1cnJlbnQgdm9sdW1lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgcmVxdWVzdFVwZGF0ZVZvbHVtZShpbnQgZGVsdGEpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgaWYgKGRlbHRhICE9IDApIHsKLSAgICAgICAgICAgICAgICBzR2xvYmFsLnJlcXVlc3RVcGRhdGVWb2x1bWUodGhpcywgZGVsdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHtAbGluayBEaXNwbGF5fSB0aGF0IHNob3VsZCBiZSB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiB0byBzaG93Ci0gICAgICAgICAqIGEge0BsaW5rIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbn0gb24gYW4gZXh0ZXJuYWwgZGlzcGxheSB3aGVuIHRoaXMgcm91dGUgaXMgc2VsZWN0ZWQuCi0gICAgICAgICAqIERlcGVuZGluZyBvbiB0aGUgcm91dGUsIHRoaXMgbWF5IG9ubHkgYmUgdmFsaWQgaWYgdGhlIHJvdXRlIGlzIGN1cnJlbnRseQotICAgICAgICAgKiBzZWxlY3RlZC4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSBwcmVmZXJyZWQgcHJlc2VudGF0aW9uIGRpc3BsYXkgbWF5IGNoYW5nZSBpbmRlcGVuZGVudGx5IG9mIHRoZSByb3V0ZQotICAgICAgICAgKiBiZWluZyBzZWxlY3RlZCBvciB1bnNlbGVjdGVkLiAgRm9yIGV4YW1wbGUsIHRoZSBwcmVzZW50YXRpb24gZGlzcGxheQotICAgICAgICAgKiBvZiB0aGUgZGVmYXVsdCBzeXN0ZW0gcm91dGUgbWF5IGNoYW5nZSB3aGVuIGFuIGV4dGVybmFsIEhETUkgZGlzcGxheSBpcyBjb25uZWN0ZWQKLSAgICAgICAgICogb3IgZGlzY29ubmVjdGVkIGV2ZW4gdGhvdWdoIHRoZSByb3V0ZSBpdHNlbGYgaGFzIG5vdCBjaGFuZ2VkLgotICAgICAgICAgKiA8L3A+PHA+Ci0gICAgICAgICAqIFRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbCBpZiB0aGVyZSBpcyBubyBleHRlcm5hbCBkaXNwbGF5IGFzc29jaWF0ZWQgd2l0aAotICAgICAgICAgKiB0aGUgcm91dGUgb3IgaWYgdGhlIGRpc3BsYXkgaXMgbm90IHJlYWR5IHRvIHNob3cgVUkgeWV0LgotICAgICAgICAgKiA8L3A+PHA+Ci0gICAgICAgICAqIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgbGlzdGVuIGZvciBjaGFuZ2VzIHRvIHRoZSBwcmVzZW50YXRpb24gZGlzcGxheQotICAgICAgICAgKiB1c2luZyB0aGUge0BsaW5rIENhbGxiYWNrI29uUm91dGVQcmVzZW50YXRpb25EaXNwbGF5Q2hhbmdlZH0gY2FsbGJhY2sgYW5kCi0gICAgICAgICAqIHNob3cgb3IgZGlzbWlzcyBpdHMge0BsaW5rIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbn0gYWNjb3JkaW5nbHkgd2hlbiB0aGUgZGlzcGxheQotICAgICAgICAgKiBiZWNvbWVzIGF2YWlsYWJsZSBvciBpcyByZW1vdmVkLgotICAgICAgICAgKiA8L3A+PHA+Ci0gICAgICAgICAqIFRoaXMgbWV0aG9kIG9ubHkgbWFrZXMgc2Vuc2UgZm9yCi0gICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9WSURFTyBsaXZlIHZpZGVvfSByb3V0ZXMuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgcHJlZmVycmVkIHByZXNlbnRhdGlvbiBkaXNwbGF5IHRvIHVzZSB3aGVuIHRoaXMgcm91dGUgaXMKLSAgICAgICAgICogc2VsZWN0ZWQgb3IgbnVsbCBpZiBub25lLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9MSVZFX1ZJREVPCi0gICAgICAgICAqIEBzZWUgYW5kcm9pZC5hcHAuUHJlc2VudGF0aW9uCi0gICAgICAgICAqLwotICAgICAgICBATnVsbGFibGUKLSAgICAgICAgcHVibGljIERpc3BsYXkgZ2V0UHJlc2VudGF0aW9uRGlzcGxheSgpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgaWYgKG1QcmVzZW50YXRpb25EaXNwbGF5SWQgPj0gMCAmJiBtUHJlc2VudGF0aW9uRGlzcGxheSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbkRpc3BsYXkgPSBzR2xvYmFsLmdldERpc3BsYXkobVByZXNlbnRhdGlvbkRpc3BsYXlJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbVByZXNlbnRhdGlvbkRpc3BsYXk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgcm91dGUncyBwcmVzZW50YXRpb24gZGlzcGxheSBpZCwgb3IgLTEgaWYgbm9uZS4KLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1QcmVzZW50YXRpb25EaXNwbGF5SWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyBhIGNvbGxlY3Rpb24gb2YgZXh0cmEgcHJvcGVydGllcyBhYm91dCB0aGlzIHJvdXRlIHRoYXQgd2VyZSBzdXBwbGllZAotICAgICAgICAgKiBieSBpdHMgbWVkaWEgcm91dGUgcHJvdmlkZXIsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgICAgICovCi0gICAgICAgIEBOdWxsYWJsZQotICAgICAgICBwdWJsaWMgQnVuZGxlIGdldEV4dHJhcygpIHsKLSAgICAgICAgICAgIHJldHVybiBtRXh0cmFzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgYW4gaW50ZW50IHNlbmRlciBmb3IgbGF1bmNoaW5nIGEgc2V0dGluZ3MgYWN0aXZpdHkgZm9yIHRoaXMKLSAgICAgICAgICogcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBATnVsbGFibGUKLSAgICAgICAgcHVibGljIEludGVudFNlbmRlciBnZXRTZXR0aW5nc0ludGVudCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtU2V0dGluZ3NJbnRlbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2VsZWN0cyB0aGlzIG1lZGlhIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0KCkgewotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICBzR2xvYmFsLnNlbGVjdFJvdXRlKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gIk1lZGlhUm91dGVyLlJvdXRlSW5mb3sgdW5pcXVlSWQ9IiArIG1VbmlxdWVJZAotICAgICAgICAgICAgICAgICAgICArICIsIG5hbWU9IiArIG1OYW1lCi0gICAgICAgICAgICAgICAgICAgICsgIiwgZGVzY3JpcHRpb249IiArIG1EZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICAgICArICIsIGljb25Vcmk9IiArIG1JY29uVXJpCi0gICAgICAgICAgICAgICAgICAgICsgIiwgZW5hYmxlZD0iICsgbUVuYWJsZWQKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBjb25uZWN0aW5nPSIgKyBtQ29ubmVjdGluZwotICAgICAgICAgICAgICAgICAgICArICIsIGNvbm5lY3Rpb25TdGF0ZT0iICsgbUNvbm5lY3Rpb25TdGF0ZQotICAgICAgICAgICAgICAgICAgICArICIsIGNhbkRpc2Nvbm5lY3Q9IiArIG1DYW5EaXNjb25uZWN0Ci0gICAgICAgICAgICAgICAgICAgICsgIiwgcGxheWJhY2tUeXBlPSIgKyBtUGxheWJhY2tUeXBlCi0gICAgICAgICAgICAgICAgICAgICsgIiwgcGxheWJhY2tTdHJlYW09IiArIG1QbGF5YmFja1N0cmVhbQotICAgICAgICAgICAgICAgICAgICArICIsIGRldmljZVR5cGU9IiArIG1EZXZpY2VUeXBlCi0gICAgICAgICAgICAgICAgICAgICsgIiwgdm9sdW1lSGFuZGxpbmc9IiArIG1Wb2x1bWVIYW5kbGluZwotICAgICAgICAgICAgICAgICAgICArICIsIHZvbHVtZT0iICsgbVZvbHVtZQotICAgICAgICAgICAgICAgICAgICArICIsIHZvbHVtZU1heD0iICsgbVZvbHVtZU1heAotICAgICAgICAgICAgICAgICAgICArICIsIHByZXNlbnRhdGlvbkRpc3BsYXlJZD0iICsgbVByZXNlbnRhdGlvbkRpc3BsYXlJZAotICAgICAgICAgICAgICAgICAgICArICIsIGV4dHJhcz0iICsgbUV4dHJhcwotICAgICAgICAgICAgICAgICAgICArICIsIHNldHRpbmdzSW50ZW50PSIgKyBtU2V0dGluZ3NJbnRlbnQKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBwcm92aWRlclBhY2thZ2VOYW1lPSIgKyBtUHJvdmlkZXIuZ2V0UGFja2FnZU5hbWUoKQotICAgICAgICAgICAgICAgICAgICArICIgfSI7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbWF5YmVVcGRhdGVEZXNjcmlwdG9yKE1lZGlhUm91dGVEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIGludCBjaGFuZ2VzID0gMDsKLSAgICAgICAgICAgIGlmIChtRGVzY3JpcHRvciAhPSBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICAgICAgY2hhbmdlcyA9IHVwZGF0ZURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY2hhbmdlczsKLSAgICAgICAgfQotCi0gICAgICAgIGludCB1cGRhdGVEZXNjcmlwdG9yKE1lZGlhUm91dGVEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIGludCBjaGFuZ2VzID0gMDsKLSAgICAgICAgICAgIG1EZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLSAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWVxdWFsKG1OYW1lLCBkZXNjcmlwdG9yLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbU5hbWUgPSBkZXNjcmlwdG9yLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFlcXVhbChtRGVzY3JpcHRpb24sIGRlc2NyaXB0b3IuZ2V0RGVzY3JpcHRpb24oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbURlc2NyaXB0aW9uID0gZGVzY3JpcHRvci5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWVxdWFsKG1JY29uVXJpLCBkZXNjcmlwdG9yLmdldEljb25VcmkoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUljb25VcmkgPSBkZXNjcmlwdG9yLmdldEljb25VcmkoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1FbmFibGVkICE9IGRlc2NyaXB0b3IuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUVuYWJsZWQgPSBkZXNjcmlwdG9yLmlzRW5hYmxlZCgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3RpbmcgIT0gZGVzY3JpcHRvci5pc0Nvbm5lY3RpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGluZyA9IGRlc2NyaXB0b3IuaXNDb25uZWN0aW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvblN0YXRlICE9IGRlc2NyaXB0b3IuZ2V0Q29ubmVjdGlvblN0YXRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25TdGF0ZSA9IGRlc2NyaXB0b3IuZ2V0Q29ubmVjdGlvblN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghbUNvbnRyb2xGaWx0ZXJzLmVxdWFscyhkZXNjcmlwdG9yLmdldENvbnRyb2xGaWx0ZXJzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Db250cm9sRmlsdGVycy5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICBtQ29udHJvbEZpbHRlcnMuYWRkQWxsKGRlc2NyaXB0b3IuZ2V0Q29udHJvbEZpbHRlcnMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtUGxheWJhY2tUeXBlICE9IGRlc2NyaXB0b3IuZ2V0UGxheWJhY2tUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrVHlwZSA9IGRlc2NyaXB0b3IuZ2V0UGxheWJhY2tUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtUGxheWJhY2tTdHJlYW0gIT0gZGVzY3JpcHRvci5nZXRQbGF5YmFja1N0cmVhbSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja1N0cmVhbSA9IGRlc2NyaXB0b3IuZ2V0UGxheWJhY2tTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1EZXZpY2VUeXBlICE9IGRlc2NyaXB0b3IuZ2V0RGV2aWNlVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EZXZpY2VUeXBlID0gZGVzY3JpcHRvci5nZXREZXZpY2VUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtVm9sdW1lSGFuZGxpbmcgIT0gZGVzY3JpcHRvci5nZXRWb2x1bWVIYW5kbGluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVIYW5kbGluZyA9IGRlc2NyaXB0b3IuZ2V0Vm9sdW1lSGFuZGxpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTCB8IENIQU5HRV9WT0xVTUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtVm9sdW1lICE9IGRlc2NyaXB0b3IuZ2V0Vm9sdW1lKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVZvbHVtZSA9IGRlc2NyaXB0b3IuZ2V0Vm9sdW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUwgfCBDSEFOR0VfVk9MVU1FOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVZvbHVtZU1heCAhPSBkZXNjcmlwdG9yLmdldFZvbHVtZU1heCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVNYXggPSBkZXNjcmlwdG9yLmdldFZvbHVtZU1heCgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMIHwgQ0hBTkdFX1ZPTFVNRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1QcmVzZW50YXRpb25EaXNwbGF5SWQgIT0gZGVzY3JpcHRvci5nZXRQcmVzZW50YXRpb25EaXNwbGF5SWQoKSkgewotICAgICAgICAgICAgICAgICAgICBtUHJlc2VudGF0aW9uRGlzcGxheUlkID0gZGVzY3JpcHRvci5nZXRQcmVzZW50YXRpb25EaXNwbGF5SWQoKTsKLSAgICAgICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbkRpc3BsYXkgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMIHwgQ0hBTkdFX1BSRVNFTlRBVElPTl9ESVNQTEFZOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWVxdWFsKG1FeHRyYXMsIGRlc2NyaXB0b3IuZ2V0RXh0cmFzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1FeHRyYXMgPSBkZXNjcmlwdG9yLmdldEV4dHJhcygpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWVxdWFsKG1TZXR0aW5nc0ludGVudCwgZGVzY3JpcHRvci5nZXRTZXR0aW5nc0FjdGl2aXR5KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc0ludGVudCA9IGRlc2NyaXB0b3IuZ2V0U2V0dGluZ3NBY3Rpdml0eSgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobUNhbkRpc2Nvbm5lY3QgIT0gZGVzY3JpcHRvci5jYW5EaXNjb25uZWN0QW5kS2VlcFBsYXlpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBtQ2FuRGlzY29ubmVjdCA9IGRlc2NyaXB0b3IuY2FuRGlzY29ubmVjdEFuZEtlZXBQbGF5aW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUwgfCBDSEFOR0VfUFJFU0VOVEFUSU9OX0RJU1BMQVk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNoYW5nZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZ2V0RGVzY3JpcHRvcklkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EZXNjcmlwdG9ySWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogQGhpZGUgKi8KLSAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVQcm92aWRlciBnZXRQcm92aWRlckluc3RhbmNlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Qcm92aWRlci5nZXRQcm92aWRlckluc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbmZvcm1hdGlvbiBhYm91dCBhIHJvdXRlIHRoYXQgY29uc2lzdHMgb2YgbXVsdGlwbGUgb3RoZXIgcm91dGVzIGluIGEgZ3JvdXAuCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUm91dGVHcm91cCBleHRlbmRzIFJvdXRlSW5mbyB7Ci0gICAgICAgIHByaXZhdGUgTGlzdDxSb3V0ZUluZm8+IG1Sb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQotICAgICAgICBSb3V0ZUdyb3VwKFByb3ZpZGVySW5mbyBwcm92aWRlciwgU3RyaW5nIGRlc2NyaXB0b3JJZCwgU3RyaW5nIHVuaXF1ZUlkKSB7Ci0gICAgICAgICAgICBzdXBlcihwcm92aWRlciwgZGVzY3JpcHRvcklkLCB1bmlxdWVJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIHJvdXRlcyBpbiB0aGlzIGdyb3VwCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldFJvdXRlQ291bnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVJvdXRlcy5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgcm91dGUgaW4gdGhpcyBncm91cCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpbmRleCBJbmRleCB0byBmZXRjaAotICAgICAgICAgKiBAcmV0dXJuIFRoZSByb3V0ZSBhdCBpbmRleAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFJvdXRlSW5mbyBnZXRSb3V0ZUF0KGludCBpbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIG1Sb3V0ZXMuZ2V0KGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSByb3V0ZXMgaW4gdGhpcyBncm91cAotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIHRoZSByb3V0ZXMgaW4gdGhpcyBncm91cAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIExpc3Q8Um91dGVJbmZvPiBnZXRSb3V0ZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVJvdXRlczsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCdbJyk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtUm91dGVzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChpID4gMCkgc2IuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChtUm91dGVzLmdldChpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYi5hcHBlbmQoJ10nKTsKLSAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIGludCBtYXliZVVwZGF0ZURlc2NyaXB0b3IoTWVkaWFSb3V0ZURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAobURlc2NyaXB0b3IgIT0gZGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgIG1EZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLSAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBncm91cE1lbWJlcklkcyA9IGRlc2NyaXB0b3IuZ2V0R3JvdXBNZW1iZXJJZHMoKTsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxSb3V0ZUluZm8+IHJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gZ3JvdXBNZW1iZXJJZHMuc2l6ZSgpICE9IG1Sb3V0ZXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBncm91cE1lbWJlcklkIDogZ3JvdXBNZW1iZXJJZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1bmlxdWVJZCA9IHNHbG9iYWwuZ2V0VW5pcXVlSWQoZ2V0UHJvdmlkZXIoKSwgZ3JvdXBNZW1iZXJJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZUluZm8gZ3JvdXBNZW1iZXIgPSBzR2xvYmFsLmdldFJvdXRlKHVuaXF1ZUlkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChncm91cE1lbWJlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVzLmFkZChncm91cE1lbWJlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGFuZ2VkICYmICFtUm91dGVzLmNvbnRhaW5zKGdyb3VwTWVtYmVyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXMgPSByb3V0ZXM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gKGNoYW5nZWQgPyBDSEFOR0VfR0VORVJBTCA6IDApIHwgc3VwZXIudXBkYXRlRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IGEgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBvYmplY3QgbWF5IGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGhhcwotICAgICAqIHB1Ymxpc2hlZCBhIHBhcnRpY3VsYXIgcm91dGUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUHJvdmlkZXJJbmZvIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlUHJvdmlkZXIgbVByb3ZpZGVySW5zdGFuY2U7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxSb3V0ZUluZm8+IG1Sb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyTWV0YWRhdGEgbU1ldGFkYXRhOwotICAgICAgICBwcml2YXRlIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgbURlc2NyaXB0b3I7Ci0gICAgICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXNvdXJjZXM7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtUmVzb3VyY2VzTm90QXZhaWxhYmxlOwotCi0gICAgICAgIFByb3ZpZGVySW5mbyhNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIpIHsKLSAgICAgICAgICAgIG1Qcm92aWRlckluc3RhbmNlID0gcHJvdmlkZXI7Ci0gICAgICAgICAgICBtTWV0YWRhdGEgPSBwcm92aWRlci5nZXRNZXRhZGF0YSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHByb3ZpZGVyJ3MgdW5kZXJseWluZyB7QGxpbmsgTWVkaWFSb3V0ZVByb3ZpZGVyfSBpbnN0YW5jZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlUHJvdmlkZXIgZ2V0UHJvdmlkZXJJbnN0YW5jZSgpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgcmV0dXJuIG1Qcm92aWRlckluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG1NZXRhZGF0YS5nZXRQYWNrYWdlTmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIGNvbXBvbmVudCBuYW1lIG9mIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBDb21wb25lbnROYW1lIGdldENvbXBvbmVudE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1ldGFkYXRhLmdldENvbXBvbmVudE5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlc30gcHVibGlzaGVkIGJ5IHRoaXMgcm91dGUgcHJvdmlkZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTGlzdDxSb3V0ZUluZm8+IGdldFJvdXRlcygpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgcmV0dXJuIG1Sb3V0ZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBSZXNvdXJjZXMgZ2V0UmVzb3VyY2VzKCkgewotICAgICAgICAgICAgaWYgKG1SZXNvdXJjZXMgPT0gbnVsbCAmJiAhbVJlc291cmNlc05vdEF2YWlsYWJsZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGdldFBhY2thZ2VOYW1lKCk7Ci0gICAgICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gc0dsb2JhbC5nZXRQcm92aWRlckNvbnRleHQocGFja2FnZU5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChjb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIG9idGFpbiByZXNvdXJjZXMgZm9yIHJvdXRlIHByb3ZpZGVyIHBhY2thZ2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlc05vdEF2YWlsYWJsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1SZXNvdXJjZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIHVwZGF0ZURlc2NyaXB0b3IoTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBpZiAobURlc2NyaXB0b3IgIT0gZGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgIG1EZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBmaW5kUm91dGVCeURlc2NyaXB0b3JJZChTdHJpbmcgaWQpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1Sb3V0ZXMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Sb3V0ZXMuZ2V0KGkpLm1EZXNjcmlwdG9ySWQuZXF1YWxzKGlkKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiAiTWVkaWFSb3V0ZXIuUm91dGVQcm92aWRlckluZm97IHBhY2thZ2VOYW1lPSIgKyBnZXRQYWNrYWdlTmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICsgIiB9IjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZSBmb3IgcmVjZWl2aW5nIGV2ZW50cyBhYm91dCBtZWRpYSByb3V0aW5nIGNoYW5nZXMuCi0gICAgICogQWxsIG1ldGhvZHMgb2YgdGhpcyBpbnRlcmZhY2Ugd2lsbCBiZSBjYWxsZWQgZnJvbSB0aGUgYXBwbGljYXRpb24ncyBtYWluIHRocmVhZC4KLSAgICAgKiA8cD4KLSAgICAgKiBBIENhbGxiYWNrIHdpbGwgb25seSByZWNlaXZlIGV2ZW50cyByZWxldmFudCB0byByb3V0ZXMgdGhhdCB0aGUgY2FsbGJhY2sKLSAgICAgKiB3YXMgcmVnaXN0ZXJlZCBmb3IgdW5sZXNzIHRoZSB7QGxpbmsgTWVkaWFSb3V0ZXIjQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UU30KLSAgICAgKiBmbGFnIHdhcyBzcGVjaWZpZWQgaW4ge0BsaW5rIE1lZGlhUm91dGVyI2FkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3RvciwgQ2FsbGJhY2ssIGludCl9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIjYWRkQ2FsbGJhY2soTWVkaWFSb3V0ZVNlbGVjdG9yLCBDYWxsYmFjaywgaW50KQotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIjcmVtb3ZlQ2FsbGJhY2soQ2FsbGJhY2spCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDYWxsYmFjayB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgc3VwcGxpZWQgbWVkaWEgcm91dGUgYmVjb21lcyBzZWxlY3RlZCBhcyB0aGUgYWN0aXZlIHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0aGF0IGhhcyBiZWVuIHNlbGVjdGVkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHN1cHBsaWVkIG1lZGlhIHJvdXRlIGJlY29tZXMgdW5zZWxlY3RlZCBhcyB0aGUgYWN0aXZlIHJvdXRlLgotICAgICAgICAgKiBGb3IgZGV0YWlsZWQgcmVhc29uLCBvdmVycmlkZSB7QGxpbmsgI29uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyLCBSb3V0ZUluZm8sIGludCl9Ci0gICAgICAgICAqIGluc3RlYWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHRoYXQgaGFzIGJlZW4gdW5zZWxlY3RlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHN1cHBsaWVkIG1lZGlhIHJvdXRlIGJlY29tZXMgdW5zZWxlY3RlZCBhcyB0aGUgYWN0aXZlIHJvdXRlLgotICAgICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjYWxscyB7QGxpbmsgI29uUm91dGVVbnNlbGVjdGVkfS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSByZWFzb24gcHJvdmlkZWQgd2lsbCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAgICAgICAgICogPHVsPgotICAgICAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9VTktOT1dOfTwvbGk+Ci0gICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX0RJU0NPTk5FQ1RFRH08L2xpPgotICAgICAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9TVE9QUEVEfTwvbGk+Ci0gICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1JPVVRFX0NIQU5HRUR9PC9saT4KLSAgICAgICAgICogPC91bD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgdGhhdCBoYXMgYmVlbiB1bnNlbGVjdGVkLgotICAgICAgICAgKiBAcGFyYW0gcmVhc29uIFRoZSByZWFzb24gZm9yIHVuc2VsZWN0aW5nIHRoZSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlLCBpbnQgcmVhc29uKSB7Ci0gICAgICAgICAgICBvblJvdXRlVW5zZWxlY3RlZChyb3V0ZXIsIHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIHJvdXRlIGhhcyBiZWVuIGFkZGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0aGF0IGhhcyBiZWNvbWUgYXZhaWxhYmxlIGZvciB1c2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQWRkZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIHJvdXRlIGhhcyBiZWVuIHJlbW92ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIGF2YWlsYWJpbGl0eS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVSZW1vdmVkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBwcm9wZXJ0eSBvZiB0aGUgaW5kaWNhdGVkIG1lZGlhIHJvdXRlIGhhcyBjaGFuZ2VkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0aGF0IHdhcyBjaGFuZ2VkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIHJvdXRlJ3Mgdm9sdW1lIGNoYW5nZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHdob3NlIHZvbHVtZSBjaGFuZ2VkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVZvbHVtZUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIHJvdXRlJ3MgcHJlc2VudGF0aW9uIGRpc3BsYXkgY2hhbmdlcy4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgcm91dGUncyBwcmVzZW50YXRpb24gZGlzcGxheSBiZWNvbWVzCi0gICAgICAgICAqIGF2YWlsYWJsZSwgaXMgcmVtb3ZlZCBvciBoYXMgY2hhbmdlcyB0byBzb21lIG9mIGl0cyBwcm9wZXJ0aWVzIChzdWNoIGFzIGl0cyBzaXplKS4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB3aG9zZSBwcmVzZW50YXRpb24gZGlzcGxheSBjaGFuZ2VkLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIFJvdXRlSW5mbyNnZXRQcmVzZW50YXRpb25EaXNwbGF5KCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVQcmVzZW50YXRpb25EaXNwbGF5Q2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIFJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgaGFzIGJlZW4gYWRkZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcHJvdmlkZXIgVGhlIHByb3ZpZGVyIHRoYXQgaGFzIGJlY29tZSBhdmFpbGFibGUgZm9yIHVzZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJBZGRlZChNZWRpYVJvdXRlciByb3V0ZXIsIFByb3ZpZGVySW5mbyBwcm92aWRlcikgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgaGFzIGJlZW4gcmVtb3ZlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCi0gICAgICAgICAqIEBwYXJhbSBwcm92aWRlciBUaGUgcHJvdmlkZXIgdGhhdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gYXZhaWxhYmlsaXR5LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlclJlbW92ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBQcm92aWRlckluZm8gcHJvdmlkZXIpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIHByb3BlcnR5IG9mIHRoZSBpbmRpY2F0ZWQgbWVkaWEgcm91dGUgcHJvdmlkZXIgaGFzIGNoYW5nZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcHJvdmlkZXIgVGhlIHByb3ZpZGVyIHRoYXQgd2FzIGNoYW5nZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIFByb3ZpZGVySW5mbyBwcm92aWRlcikgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGJhY2sgd2hpY2ggaXMgaW52b2tlZCB3aXRoIHRoZSByZXN1bHQgb2YgYSBtZWRpYSBjb250cm9sIHJlcXVlc3QuCi0gICAgICoKLSAgICAgKiBAc2VlIFJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSBjb250cm9sIHJlcXVlc3Qgc3VjY2VlZHMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkYXRhIFJlc3VsdCBkYXRhLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICAgICAqIENvbnRlbnRzIGRlcGVuZCBvbiB0aGUge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGFjdGlvbn0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgY29udHJvbCByZXF1ZXN0IGZhaWxzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZXJyb3IgQSBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZSB3aGljaCBtYXkgYmUgc2hvd24gdG8gdGhlIHVzZXIsIG9yIG51bGwKLSAgICAgICAgICogaWYgdGhlIGNhdXNlIG9mIHRoZSBlcnJvciBpcyB1bmNsZWFyLgotICAgICAgICAgKiBAcGFyYW0gZGF0YSBFcnJvciBkYXRhLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICAgICAqIENvbnRlbnRzIGRlcGVuZCBvbiB0aGUge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGFjdGlvbn0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKFN0cmluZyBlcnJvciwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIENhbGxiYWNrUmVjb3JkIHsKLSAgICAgICAgcHVibGljIGZpbmFsIE1lZGlhUm91dGVyIG1Sb3V0ZXI7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBDYWxsYmFjayBtQ2FsbGJhY2s7Ci0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlU2VsZWN0b3IgbVNlbGVjdG9yOwotICAgICAgICBwdWJsaWMgaW50IG1GbGFnczsKLQotICAgICAgICBwdWJsaWMgQ2FsbGJhY2tSZWNvcmQoTWVkaWFSb3V0ZXIgcm91dGVyLCBDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICAgICAgbVJvdXRlciA9IHJvdXRlcjsKLSAgICAgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZmlsdGVyUm91dGVFdmVudChSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIHJldHVybiAobUZsYWdzICYgQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UUykgIT0gMAotICAgICAgICAgICAgICAgICAgICB8fCByb3V0ZS5tYXRjaGVzU2VsZWN0b3IobVNlbGVjdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdsb2JhbCBzdGF0ZSBmb3IgdGhlIG1lZGlhIHJvdXRlci4KLSAgICAgKiA8cD4KLSAgICAgKiBNZWRpYSByb3V0ZXMgYW5kIG1lZGlhIHJvdXRlIHByb3ZpZGVycyBhcmUgZ2xvYmFsIHRvIHRoZSBwcm9jZXNzOyB0aGVpcgotICAgICAqIHN0YXRlIGFuZCB0aGUgYnVsayBvZiB0aGUgbWVkaWEgcm91dGVyIGltcGxlbWVudGF0aW9uIGxpdmVzIGhlcmUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEdsb2JhbE1lZGlhUm91dGVyCi0gICAgICAgICAgICBpbXBsZW1lbnRzIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlci5TeW5jQ2FsbGJhY2ssCi0gICAgICAgICAgICBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlci5DYWxsYmFjayB7Ci0gICAgICAgIGZpbmFsIENvbnRleHQgbUFwcGxpY2F0aW9uQ29udGV4dDsKLSAgICAgICAgZmluYWwgQXJyYXlMaXN0PFdlYWtSZWZlcmVuY2U8TWVkaWFSb3V0ZXI+PiBtUm91dGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxSb3V0ZUluZm8+IG1Sb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8UGFpcjxTdHJpbmcsIFN0cmluZz4sIFN0cmluZz4gbVVuaXF1ZUlkTWFwID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxQcm92aWRlckluZm8+IG1Qcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8UmVtb3RlQ29udHJvbENsaWVudFJlY29yZD4gbVJlbW90ZUNvbnRyb2xDbGllbnRzID0KLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgZmluYWwgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdC5QbGF5YmFja0luZm8gbVBsYXliYWNrSW5mbyA9Ci0gICAgICAgICAgICAgICAgbmV3IFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQuUGxheWJhY2tJbmZvKCk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXJDYWxsYmFjayBtUHJvdmlkZXJDYWxsYmFjayA9IG5ldyBQcm92aWRlckNhbGxiYWNrKCk7Ci0gICAgICAgIGZpbmFsIENhbGxiYWNrSGFuZGxlciBtQ2FsbGJhY2tIYW5kbGVyID0gbmV3IENhbGxiYWNrSGFuZGxlcigpOwotICAgICAgICBwcml2YXRlIGZpbmFsIERpc3BsYXlNYW5hZ2VyQ29tcGF0IG1EaXNwbGF5TWFuYWdlcjsKLSAgICAgICAgZmluYWwgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyIG1TeXN0ZW1Qcm92aWRlcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Mb3dSYW07Ci0KLSAgICAgICAgcHJpdmF0ZSBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlciBtUmVnaXN0ZXJlZFByb3ZpZGVyV2F0Y2hlcjsKLSAgICAgICAgcHJpdmF0ZSBSb3V0ZUluZm8gbURlZmF1bHRSb3V0ZTsKLSAgICAgICAgcHJpdmF0ZSBSb3V0ZUluZm8gbUJsdWV0b290aFJvdXRlOwotICAgICAgICBSb3V0ZUluZm8gbVNlbGVjdGVkUm91dGU7Ci0gICAgICAgIHByaXZhdGUgUm91dGVDb250cm9sbGVyIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlcjsKLSAgICAgICAgLy8gQSBtYXAgZnJvbSByb3V0ZSBkZXNjcmlwdG9yIElEIHRvIFJvdXRlQ29udHJvbGxlciBmb3IgdGhlIG1lbWJlciByb3V0ZXMgaW4gdGhlIGN1cnJlbnRseQotICAgICAgICAvLyBzZWxlY3RlZCByb3V0ZSBncm91cC4KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBSb3V0ZUNvbnRyb2xsZXI+IG1Sb3V0ZUNvbnRyb2xsZXJNYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIHByaXZhdGUgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgbURpc2NvdmVyeVJlcXVlc3Q7Ci0gICAgICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uUmVjb3JkIG1NZWRpYVNlc3Npb247Ci0gICAgICAgIE1lZGlhU2Vzc2lvbkNvbXBhdCBtUmNjTWVkaWFTZXNzaW9uOwotICAgICAgICBwcml2YXRlIE1lZGlhU2Vzc2lvbkNvbXBhdCBtQ29tcGF0U2Vzc2lvbjsKLSAgICAgICAgcHJpdmF0ZSBNZWRpYVNlc3Npb25Db21wYXQuT25BY3RpdmVDaGFuZ2VMaXN0ZW5lciBtU2Vzc2lvbkFjdGl2ZUxpc3RlbmVyID0KLSAgICAgICAgICAgICAgICBuZXcgTWVkaWFTZXNzaW9uQ29tcGF0Lk9uQWN0aXZlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZlQ2hhbmdlZCgpIHsKLSAgICAgICAgICAgICAgICBpZihtUmNjTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1SY2NNZWRpYVNlc3Npb24uaXNBY3RpdmUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVtb3RlQ29udHJvbENsaWVudChtUmNjTWVkaWFTZXNzaW9uLmdldFJlbW90ZUNvbnRyb2xDbGllbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVSZW1vdGVDb250cm9sQ2xpZW50KG1SY2NNZWRpYVNlc3Npb24uZ2V0UmVtb3RlQ29udHJvbENsaWVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBHbG9iYWxNZWRpYVJvdXRlcihDb250ZXh0IGFwcGxpY2F0aW9uQ29udGV4dCkgewotICAgICAgICAgICAgbUFwcGxpY2F0aW9uQ29udGV4dCA9IGFwcGxpY2F0aW9uQ29udGV4dDsKLSAgICAgICAgICAgIG1EaXNwbGF5TWFuYWdlciA9IERpc3BsYXlNYW5hZ2VyQ29tcGF0LmdldEluc3RhbmNlKGFwcGxpY2F0aW9uQ29udGV4dCk7Ci0gICAgICAgICAgICBtTG93UmFtID0gQWN0aXZpdHlNYW5hZ2VyQ29tcGF0LmlzTG93UmFtRGV2aWNlKAotICAgICAgICAgICAgICAgICAgICAoQWN0aXZpdHlNYW5hZ2VyKWFwcGxpY2F0aW9uQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQuQUNUSVZJVFlfU0VSVklDRSkpOwotCi0gICAgICAgICAgICAvLyBBZGQgdGhlIHN5c3RlbSBtZWRpYSByb3V0ZSBwcm92aWRlciBmb3IgaW50ZXJvcGVyYXRpbmcgd2l0aAotICAgICAgICAgICAgLy8gdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIuICBUaGlzIG9uZSBpcyBzcGVjaWFsIGFuZCByZWNlaXZlcwotICAgICAgICAgICAgLy8gc3luY2hyb25pemF0aW9uIG1lc3NhZ2VzIGZyb20gdGhlIG1lZGlhIHJvdXRlci4KLSAgICAgICAgICAgIG1TeXN0ZW1Qcm92aWRlciA9IFN5c3RlbU1lZGlhUm91dGVQcm92aWRlci5vYnRhaW4oYXBwbGljYXRpb25Db250ZXh0LCB0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgICAgICAgICAgYWRkUHJvdmlkZXIobVN5c3RlbVByb3ZpZGVyKTsKLQotICAgICAgICAgICAgLy8gU3RhcnQgd2F0Y2hpbmcgZm9yIHJvdXRlcyBwdWJsaXNoZWQgYnkgcmVnaXN0ZXJlZCBtZWRpYSByb3V0ZQotICAgICAgICAgICAgLy8gcHJvdmlkZXIgc2VydmljZXMuCi0gICAgICAgICAgICBtUmVnaXN0ZXJlZFByb3ZpZGVyV2F0Y2hlciA9IG5ldyBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlcigKLSAgICAgICAgICAgICAgICAgICAgbUFwcGxpY2F0aW9uQ29udGV4dCwgdGhpcyk7Ci0gICAgICAgICAgICBtUmVnaXN0ZXJlZFByb3ZpZGVyV2F0Y2hlci5zdGFydCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVyIGdldFJvdXRlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVyIHJvdXRlcjsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUm91dGVycy5zaXplKCk7IC0taSA+PSAwOyApIHsKLSAgICAgICAgICAgICAgICByb3V0ZXIgPSBtUm91dGVycy5nZXQoaSkuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJvdXRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXJzLnJlbW92ZShpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvdXRlci5tQ29udGV4dCA9PSBjb250ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByb3V0ZXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcm91dGVyID0gbmV3IE1lZGlhUm91dGVyKGNvbnRleHQpOwotICAgICAgICAgICAgbVJvdXRlcnMuYWRkKG5ldyBXZWFrUmVmZXJlbmNlPE1lZGlhUm91dGVyPihyb3V0ZXIpKTsKLSAgICAgICAgICAgIHJldHVybiByb3V0ZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ29udGVudFJlc29sdmVyIGdldENvbnRlbnRSZXNvbHZlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBtQXBwbGljYXRpb25Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENvbnRleHQgZ2V0UHJvdmlkZXJDb250ZXh0KFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lLmVxdWFscyhTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIuUEFDS0FHRV9OQU1FKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtQXBwbGljYXRpb25Db250ZXh0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUFwcGxpY2F0aW9uQ29udGV4dC5jcmVhdGVQYWNrYWdlQ29udGV4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lLCBDb250ZXh0LkNPTlRFWFRfUkVTVFJJQ1RFRCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOYW1lTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBEaXNwbGF5IGdldERpc3BsYXkoaW50IGRpc3BsYXlJZCkgewotICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5TWFuYWdlci5nZXREaXNwbGF5KGRpc3BsYXlJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZW5kQ29udHJvbFJlcXVlc3QoUm91dGVJbmZvIHJvdXRlLAotICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQsIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBtU2VsZWN0ZWRSb3V0ZSAmJiBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIub25Db250cm9sUmVxdWVzdChpbnRlbnQsIGNhbGxiYWNrKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjYWxsYmFjay5vbkVycm9yKG51bGwsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVxdWVzdFNldFZvbHVtZShSb3V0ZUluZm8gcm91dGUsIGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBtU2VsZWN0ZWRSb3V0ZSAmJiBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlci5vblNldFZvbHVtZSh2b2x1bWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghbVJvdXRlQ29udHJvbGxlck1hcC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBSb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9IG1Sb3V0ZUNvbnRyb2xsZXJNYXAuZ2V0KHJvdXRlLm1EZXNjcmlwdG9ySWQpOwotICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5vblNldFZvbHVtZSh2b2x1bWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RVcGRhdGVWb2x1bWUoUm91dGVJbmZvIHJvdXRlLCBpbnQgZGVsdGEpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBtU2VsZWN0ZWRSb3V0ZSAmJiBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlci5vblVwZGF0ZVZvbHVtZShkZWx0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgUm91dGVJbmZvIGdldFJvdXRlKFN0cmluZyB1bmlxdWVJZCkgewotICAgICAgICAgICAgZm9yIChSb3V0ZUluZm8gaW5mbyA6IG1Sb3V0ZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5mby5tVW5pcXVlSWQuZXF1YWxzKHVuaXF1ZUlkKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5mbzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBMaXN0PFJvdXRlSW5mbz4gZ2V0Um91dGVzKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Sb3V0ZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PFByb3ZpZGVySW5mbz4gZ2V0UHJvdmlkZXJzKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Qcm92aWRlcnM7Ci0gICAgICAgIH0KLQotICAgICAgICBATm9uTnVsbCBSb3V0ZUluZm8gZ2V0RGVmYXVsdFJvdXRlKCkgewotICAgICAgICAgICAgaWYgKG1EZWZhdWx0Um91dGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBvbmNlIHRoZSBtZWRpYSByb3V0ZXIgaGFzIGJlZW4gZnVsbHkKLSAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplZCBidXQgaXQgaXMgZ29vZCB0byBjaGVjayBmb3IgdGhlIGVycm9yIGluIGNhc2UgdGhlcmUKLSAgICAgICAgICAgICAgICAvLyBpcyBhIGJ1ZyBpbiBwcm92aWRlciBpbml0aWFsaXphdGlvbi4KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGVyZSBpcyBubyBkZWZhdWx0IHJvdXRlLiAgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiVGhlIG1lZGlhIHJvdXRlciBoYXMgbm90IHlldCBiZWVuIGZ1bGx5IGluaXRpYWxpemVkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1EZWZhdWx0Um91dGU7Ci0gICAgICAgIH0KLQotICAgICAgICBSb3V0ZUluZm8gZ2V0Qmx1ZXRvb3RoUm91dGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUJsdWV0b290aFJvdXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE5vbk51bGwgUm91dGVJbmZvIGdldFNlbGVjdGVkUm91dGUoKSB7Ci0gICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBvbmNlIHRoZSBtZWRpYSByb3V0ZXIgaGFzIGJlZW4gZnVsbHkKLSAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplZCBidXQgaXQgaXMgZ29vZCB0byBjaGVjayBmb3IgdGhlIGVycm9yIGluIGNhc2UgdGhlcmUKLSAgICAgICAgICAgICAgICAvLyBpcyBhIGJ1ZyBpbiBwcm92aWRlciBpbml0aWFsaXphdGlvbi4KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGVyZSBpcyBubyBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUuICAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJUaGUgbWVkaWEgcm91dGVyIGhhcyBub3QgeWV0IGJlZW4gZnVsbHkgaW5pdGlhbGl6ZWQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbVNlbGVjdGVkUm91dGU7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNlbGVjdFJvdXRlKEBOb25OdWxsIFJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgc2VsZWN0Um91dGUocm91dGUsIE1lZGlhUm91dGVyLlVOU0VMRUNUX1JFQVNPTl9ST1VURV9DSEFOR0VEKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2VsZWN0Um91dGUoQE5vbk51bGwgUm91dGVJbmZvIHJvdXRlLCBpbnQgdW5zZWxlY3RSZWFzb24pIHsKLSAgICAgICAgICAgIGlmICghbVJvdXRlcy5jb250YWlucyhyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJZ25vcmluZyBhdHRlbXB0IHRvIHNlbGVjdCByZW1vdmVkIHJvdXRlOiAiICsgcm91dGUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghcm91dGUubUVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJZ25vcmluZyBhdHRlbXB0IHRvIHNlbGVjdCBkaXNhYmxlZCByb3V0ZTogIiArIHJvdXRlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRTZWxlY3RlZFJvdXRlSW50ZXJuYWwocm91dGUsIHVuc2VsZWN0UmVhc29uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzUm91dGVBdmFpbGFibGUoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yLCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgICAgIGlmIChzZWxlY3Rvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIE9uIGxvdy1SQU0gZGV2aWNlcywgZG8gbm90IHJlbHkgb24gYWN0dWFsIGRpc2NvdmVyeSByZXN1bHRzIHVubGVzcyBhc2tlZCB0by4KLSAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBBVkFJTEFCSUxJVFlfRkxBR19SRVFVSVJFX01BVENIKSA9PSAwICYmIG1Mb3dSYW0pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ2hlY2sgd2hldGhlciBhbnkgZXhpc3Rpbmcgcm91dGVzIG1hdGNoIHRoZSBzZWxlY3Rvci4KLSAgICAgICAgICAgIGZpbmFsIGludCByb3V0ZUNvdW50ID0gbVJvdXRlcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvdXRlQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IG1Sb3V0ZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBBVkFJTEFCSUxJVFlfRkxBR19JR05PUkVfREVGQVVMVF9ST1VURSkgIT0gMAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgcm91dGUuaXNEZWZhdWx0T3JCbHVldG9vdGgoKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJvdXRlLm1hdGNoZXNTZWxlY3RvcihzZWxlY3RvcikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJdCBkb2Vzbid0IGxvb2sgbGlrZSB3ZSBjYW4gZmluZCBhIG1hdGNoaW5nIHJvdXRlIHJpZ2h0IG5vdy4KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZURpc2NvdmVyeVJlcXVlc3QoKSB7Ci0gICAgICAgICAgICAvLyBDb21iaW5lIGFsbCBvZiB0aGUgY2FsbGJhY2sgc2VsZWN0b3JzIGFuZCBhY3RpdmUgc2NhbiBmbGFncy4KLSAgICAgICAgICAgIGJvb2xlYW4gZGlzY292ZXIgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2xlYW4gYWN0aXZlU2NhbiA9IGZhbHNlOwotICAgICAgICAgICAgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlcigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1Sb3V0ZXJzLnNpemUoKTsgLS1pID49IDA7ICkgewotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyIHJvdXRlciA9IG1Sb3V0ZXJzLmdldChpKS5nZXQoKTsKLSAgICAgICAgICAgICAgICBpZiAocm91dGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlcnMucmVtb3ZlKGkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IHJvdXRlci5tQ2FsbGJhY2tSZWNvcmRzLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDYWxsYmFja1JlY29yZCBjYWxsYmFjayA9IHJvdXRlci5tQ2FsbGJhY2tSZWNvcmRzLmdldChqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkU2VsZWN0b3IoY2FsbGJhY2subVNlbGVjdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoY2FsbGJhY2subUZsYWdzICYgQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlU2NhbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY292ZXIgPSB0cnVlOyAvLyBwZXJmb3JtIGFjdGl2ZSBzY2FuIGltcGxpZXMgcmVxdWVzdCBkaXNjb3ZlcnkKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoY2FsbGJhY2subUZsYWdzICYgQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUxvd1JhbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3ZlciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjYWxsYmFjay5tRmxhZ3MgJiBDQUxMQkFDS19GTEFHX0ZPUkNFX0RJU0NPVkVSWSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdmVyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvciA9IGRpc2NvdmVyID8gYnVpbGRlci5idWlsZCgpIDogTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOwotCi0gICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgZGlzY292ZXJ5IHJlcXVlc3QuCi0gICAgICAgICAgICBpZiAobURpc2NvdmVyeVJlcXVlc3QgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiBtRGlzY292ZXJ5UmVxdWVzdC5nZXRTZWxlY3RvcigpLmVxdWFscyhzZWxlY3RvcikKLSAgICAgICAgICAgICAgICAgICAgJiYgbURpc2NvdmVyeVJlcXVlc3QuaXNBY3RpdmVTY2FuKCkgPT0gYWN0aXZlU2NhbikgewotICAgICAgICAgICAgICAgIHJldHVybjsgLy8gbm8gY2hhbmdlCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2VsZWN0b3IuaXNFbXB0eSgpICYmICFhY3RpdmVTY2FuKSB7Ci0gICAgICAgICAgICAgICAgLy8gRGlzY292ZXJ5IGlzIG5vdCBuZWVkZWQuCi0gICAgICAgICAgICAgICAgaWYgKG1EaXNjb3ZlcnlSZXF1ZXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBubyBjaGFuZ2UKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbURpc2NvdmVyeVJlcXVlc3QgPSBudWxsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBEaXNjb3ZlcnkgaXMgbmVlZGVkLgotICAgICAgICAgICAgICAgIG1EaXNjb3ZlcnlSZXF1ZXN0ID0gbmV3IE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0KHNlbGVjdG9yLCBhY3RpdmVTY2FuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlVwZGF0ZWQgZGlzY292ZXJ5IHJlcXVlc3Q6ICIgKyBtRGlzY292ZXJ5UmVxdWVzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZGlzY292ZXIgJiYgIWFjdGl2ZVNjYW4gJiYgbUxvd1JhbSkgewotICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkZvcmNpbmcgcGFzc2l2ZSByb3V0ZSBkaXNjb3Zlcnkgb24gYSBsb3ctUkFNIGRldmljZSwgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAic3lzdGVtIHBlcmZvcm1hbmNlIG1heSBiZSBhZmZlY3RlZC4gIFBsZWFzZSBjb25zaWRlciB1c2luZyAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZIGluc3RlYWQgb2YgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiQ0FMTEJBQ0tfRkxBR19GT1JDRV9ESVNDT1ZFUlkuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIE5vdGlmeSBwcm92aWRlcnMuCi0gICAgICAgICAgICBmaW5hbCBpbnQgcHJvdmlkZXJDb3VudCA9IG1Qcm92aWRlcnMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm92aWRlckNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBtUHJvdmlkZXJzLmdldChpKS5tUHJvdmlkZXJJbnN0YW5jZS5zZXREaXNjb3ZlcnlSZXF1ZXN0KG1EaXNjb3ZlcnlSZXF1ZXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRQcm92aWRlcihNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXJJbnN0YW5jZSkgewotICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFByb3ZpZGVySW5mbyhwcm92aWRlckluc3RhbmNlKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAvLyAxLiBBZGQgdGhlIHByb3ZpZGVyIHRvIHRoZSBsaXN0LgotICAgICAgICAgICAgICAgIFByb3ZpZGVySW5mbyBwcm92aWRlciA9IG5ldyBQcm92aWRlckluZm8ocHJvdmlkZXJJbnN0YW5jZSk7Ci0gICAgICAgICAgICAgICAgbVByb3ZpZGVycy5hZGQocHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJQcm92aWRlciBhZGRlZDogIiArIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUFJPVklERVJfQURERUQsIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICAvLyAyLiBDcmVhdGUgdGhlIHByb3ZpZGVyJ3MgY29udGVudHMuCi0gICAgICAgICAgICAgICAgdXBkYXRlUHJvdmlkZXJDb250ZW50cyhwcm92aWRlciwgcHJvdmlkZXJJbnN0YW5jZS5nZXREZXNjcmlwdG9yKCkpOwotICAgICAgICAgICAgICAgIC8vIDMuIFJlZ2lzdGVyIHRoZSBwcm92aWRlciBjYWxsYmFjay4KLSAgICAgICAgICAgICAgICBwcm92aWRlckluc3RhbmNlLnNldENhbGxiYWNrKG1Qcm92aWRlckNhbGxiYWNrKTsKLSAgICAgICAgICAgICAgICAvLyA0LiBTZXQgdGhlIGRpc2NvdmVyeSByZXF1ZXN0LgotICAgICAgICAgICAgICAgIHByb3ZpZGVySW5zdGFuY2Uuc2V0RGlzY292ZXJ5UmVxdWVzdChtRGlzY292ZXJ5UmVxdWVzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvdmlkZXIoTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVySW5zdGFuY2UpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRQcm92aWRlckluZm8ocHJvdmlkZXJJbnN0YW5jZSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIC8vIDEuIFVucmVnaXN0ZXIgdGhlIHByb3ZpZGVyIGNhbGxiYWNrLgotICAgICAgICAgICAgICAgIHByb3ZpZGVySW5zdGFuY2Uuc2V0Q2FsbGJhY2sobnVsbCk7Ci0gICAgICAgICAgICAgICAgLy8gMi4gQ2xlYXIgdGhlIGRpc2NvdmVyeSByZXF1ZXN0LgotICAgICAgICAgICAgICAgIHByb3ZpZGVySW5zdGFuY2Uuc2V0RGlzY292ZXJ5UmVxdWVzdChudWxsKTsKLSAgICAgICAgICAgICAgICAvLyAzLiBEZWxldGUgdGhlIHByb3ZpZGVyJ3MgY29udGVudHMuCi0gICAgICAgICAgICAgICAgUHJvdmlkZXJJbmZvIHByb3ZpZGVyID0gbVByb3ZpZGVycy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVByb3ZpZGVyQ29udGVudHMocHJvdmlkZXIsIG51bGwpOwotICAgICAgICAgICAgICAgIC8vIDQuIFJlbW92ZSB0aGUgcHJvdmlkZXIgZnJvbSB0aGUgbGlzdC4KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUHJvdmlkZXIgcmVtb3ZlZDogIiArIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUFJPVklERVJfUkVNT1ZFRCwgcHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIG1Qcm92aWRlcnMucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgdXBkYXRlUHJvdmlkZXJEZXNjcmlwdG9yKE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlckluc3RhbmNlLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFByb3ZpZGVySW5mbyhwcm92aWRlckluc3RhbmNlKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBwcm92aWRlcidzIGNvbnRlbnRzLgotICAgICAgICAgICAgICAgIFByb3ZpZGVySW5mbyBwcm92aWRlciA9IG1Qcm92aWRlcnMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICB1cGRhdGVQcm92aWRlckNvbnRlbnRzKHByb3ZpZGVyLCBkZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGZpbmRQcm92aWRlckluZm8oTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVySW5zdGFuY2UpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1Qcm92aWRlcnMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Qcm92aWRlcnMuZ2V0KGkpLm1Qcm92aWRlckluc3RhbmNlID09IHByb3ZpZGVySW5zdGFuY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVByb3ZpZGVyQ29udGVudHMoUHJvdmlkZXJJbmZvIHByb3ZpZGVyLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgcHJvdmlkZXJEZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBpZiAocHJvdmlkZXIudXBkYXRlRGVzY3JpcHRvcihwcm92aWRlckRlc2NyaXB0b3IpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVXBkYXRlIGFsbCBleGlzdGluZyByb3V0ZXMgYW5kIHJlb3JkZXIgdGhlbSB0byBtYXRjaAotICAgICAgICAgICAgICAgIC8vIHRoZSBvcmRlciBvZiB0aGVpciBkZXNjcmlwdG9ycy4KLSAgICAgICAgICAgICAgICBpbnQgdGFyZ2V0SW5kZXggPSAwOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VsZWN0ZWRSb3V0ZURlc2NyaXB0b3JDaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm92aWRlckRlc2NyaXB0b3IuaXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PE1lZGlhUm91dGVEZXNjcmlwdG9yPiByb3V0ZURlc2NyaXB0b3JzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJEZXNjcmlwdG9yLmdldFJvdXRlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHJvdXRlQ291bnQgPSByb3V0ZURlc2NyaXB0b3JzLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0aW5nIHJvdXRlIGdyb3VwJ3MgY29udGVudHMgcmVxdWlyZXMgYWxsIG1lbWJlciByb3V0ZXMnIGluZm9ybWF0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBncm91cHMgdG8gdGhlIGxpc3RzIGFuZCB1cGRhdGUgdGhlbSBsYXRlci4KLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8UGFpcjxSb3V0ZUluZm8sIE1lZGlhUm91dGVEZXNjcmlwdG9yPj4gYWRkZWRHcm91cHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8UGFpcjxSb3V0ZUluZm8sIE1lZGlhUm91dGVEZXNjcmlwdG9yPj4gdXBkYXRlZEdyb3VwcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3V0ZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVJvdXRlRGVzY3JpcHRvciByb3V0ZURlc2NyaXB0b3IgPSByb3V0ZURlc2NyaXB0b3JzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSByb3V0ZURlc2NyaXB0b3IuZ2V0SWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc291cmNlSW5kZXggPSBwcm92aWRlci5maW5kUm91dGVCeURlc2NyaXB0b3JJZChpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZUluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxLiBBZGQgdGhlIHJvdXRlIHRvIHRoZSBsaXN0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdW5pcXVlSWQgPSBhc3NpZ25Sb3V0ZVVuaXF1ZUlkKHByb3ZpZGVyLCBpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNHcm91cCA9IHJvdXRlRGVzY3JpcHRvci5nZXRHcm91cE1lbWJlcklkcygpICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IGlzR3JvdXAgPyBuZXcgUm91dGVHcm91cChwcm92aWRlciwgaWQsIHVuaXF1ZUlkKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJvdXRlSW5mbyhwcm92aWRlciwgaWQsIHVuaXF1ZUlkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIubVJvdXRlcy5hZGQodGFyZ2V0SW5kZXgrKywgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVzLmFkZChyb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIuIENyZWF0ZSB0aGUgcm91dGUncyBjb250ZW50cy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR3JvdXApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkR3JvdXBzLmFkZChuZXcgUGFpcjw+KHJvdXRlLCByb3V0ZURlc2NyaXB0b3IpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLm1heWJlVXBkYXRlRGVzY3JpcHRvcihyb3V0ZURlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMy4gTm90aWZ5IGNsaWVudHMgYWJvdXQgYWRkaXRpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3V0ZSBhZGRlZDogIiArIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX0FEREVELCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlSW5kZXggPCB0YXJnZXRJbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJZ25vcmluZyByb3V0ZSBkZXNjcmlwdG9yIHdpdGggZHVwbGljYXRlIGlkOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByb3V0ZURlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEuIFJlb3JkZXIgdGhlIHJvdXRlIHdpdGhpbiB0aGUgbGlzdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVJbmZvIHJvdXRlID0gcHJvdmlkZXIubVJvdXRlcy5nZXQoc291cmNlSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zd2FwKHByb3ZpZGVyLm1Sb3V0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlSW5kZXgsIHRhcmdldEluZGV4KyspOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyLiBVcGRhdGUgdGhlIHJvdXRlJ3MgY29udGVudHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZSBpbnN0YW5jZW9mIFJvdXRlR3JvdXApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRHcm91cHMuYWRkKG5ldyBQYWlyPD4ocm91dGUsIHJvdXRlRGVzY3JpcHRvcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMy4gTm90aWZ5IGNsaWVudHMgYWJvdXQgY2hhbmdlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVSb3V0ZURlc2NyaXB0b3JBbmROb3RpZnkocm91dGUsIHJvdXRlRGVzY3JpcHRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBtU2VsZWN0ZWRSb3V0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFJvdXRlRGVzY3JpcHRvckNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgbmV3IGFuZC9vciBleGlzdGluZyBncm91cHMuCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFBhaXI8Um91dGVJbmZvLCBNZWRpYVJvdXRlRGVzY3JpcHRvcj4gcGFpciA6IGFkZGVkR3JvdXBzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVJbmZvIHJvdXRlID0gcGFpci5maXJzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5tYXliZVVwZGF0ZURlc2NyaXB0b3IocGFpci5zZWNvbmQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3V0ZSBhZGRlZDogIiArIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfQURERUQsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoUGFpcjxSb3V0ZUluZm8sIE1lZGlhUm91dGVEZXNjcmlwdG9yPiBwYWlyIDogdXBkYXRlZEdyb3VwcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IHBhaXIuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZVJvdXRlRGVzY3JpcHRvckFuZE5vdGlmeShyb3V0ZSwgcGFpci5zZWNvbmQpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlID09IG1TZWxlY3RlZFJvdXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFJvdXRlRGVzY3JpcHRvckNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSWdub3JpbmcgaW52YWxpZCBwcm92aWRlciBkZXNjcmlwdG9yOiAiICsgcHJvdmlkZXJEZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIERpc3Bvc2UgYWxsIHJlbWFpbmluZyByb3V0ZXMgdGhhdCBkbyBub3QgaGF2ZSBtYXRjaGluZyBkZXNjcmlwdG9ycy4KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gcHJvdmlkZXIubVJvdXRlcy5zaXplKCkgLSAxOyBpID49IHRhcmdldEluZGV4OyBpLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gMS4gRGVsZXRlIHRoZSByb3V0ZSdzIGNvbnRlbnRzLgotICAgICAgICAgICAgICAgICAgICBSb3V0ZUluZm8gcm91dGUgPSBwcm92aWRlci5tUm91dGVzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgcm91dGUubWF5YmVVcGRhdGVEZXNjcmlwdG9yKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAvLyAyLiBSZW1vdmUgdGhlIHJvdXRlIGZyb20gdGhlIGxpc3QuCi0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXMucmVtb3ZlKHJvdXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHNlbGVjdGVkIHJvdXRlIGlmIG5lZWRlZC4KLSAgICAgICAgICAgICAgICB1cGRhdGVTZWxlY3RlZFJvdXRlSWZOZWVkZWQoc2VsZWN0ZWRSb3V0ZURlc2NyaXB0b3JDaGFuZ2VkKTsKLQotICAgICAgICAgICAgICAgIC8vIE5vdyBub3RpZnkgY2xpZW50cyBhYm91dCByb3V0ZXMgdGhhdCB3ZXJlIHJlbW92ZWQuCi0gICAgICAgICAgICAgICAgLy8gV2UgZG8gdGhpcyBhZnRlciB1cGRhdGluZyB0aGUgc2VsZWN0ZWQgcm91dGUgdG8gZW5zdXJlCi0gICAgICAgICAgICAgICAgLy8gdGhhdCB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlciBvYnNlcnZlcyB0aGUgbmV3IHJvdXRlCi0gICAgICAgICAgICAgICAgLy8gc2VsZWN0aW9uIGJlZm9yZSB0aGUgcmVtb3ZhbCBzaW5jZSByZW1vdmluZyB0aGUgY3VycmVudGx5Ci0gICAgICAgICAgICAgICAgLy8gc2VsZWN0ZWQgcm91dGUgbWF5IGhhdmUgc2lkZS1lZmZlY3RzLgotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBwcm92aWRlci5tUm91dGVzLnNpemUoKSAtIDE7IGkgPj0gdGFyZ2V0SW5kZXg7IGktLSkgewotICAgICAgICAgICAgICAgICAgICBSb3V0ZUluZm8gcm91dGUgPSBwcm92aWRlci5tUm91dGVzLnJlbW92ZShpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3V0ZSByZW1vdmVkOiAiICsgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX1JFTU9WRUQsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBOb3RpZnkgcHJvdmlkZXIgY2hhbmdlZC4KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUHJvdmlkZXIgY2hhbmdlZDogIiArIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUFJPVklERVJfQ0hBTkdFRCwgcHJvdmlkZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgdXBkYXRlUm91dGVEZXNjcmlwdG9yQW5kTm90aWZ5KFJvdXRlSW5mbyByb3V0ZSwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvciByb3V0ZURlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIGludCBjaGFuZ2VzID0gcm91dGUubWF5YmVVcGRhdGVEZXNjcmlwdG9yKHJvdXRlRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICBpZiAoY2hhbmdlcyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChjaGFuZ2VzICYgUm91dGVJbmZvLkNIQU5HRV9HRU5FUkFMKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgY2hhbmdlZDogIiArIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2tIYW5kbGVyLk1TR19ST1VURV9DSEFOR0VELCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgoY2hhbmdlcyAmIFJvdXRlSW5mby5DSEFOR0VfVk9MVU1FKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgdm9sdW1lIGNoYW5nZWQ6ICIgKyByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfVk9MVU1FX0NIQU5HRUQsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChjaGFuZ2VzICYgUm91dGVJbmZvLkNIQU5HRV9QUkVTRU5UQVRJT05fRElTUExBWSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdXRlIHByZXNlbnRhdGlvbiBkaXNwbGF5IGNoYW5nZWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU0dfUk9VVEVfUFJFU0VOVEFUSU9OX0RJU1BMQVlfQ0hBTkdFRCwgcm91dGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjaGFuZ2VzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgYXNzaWduUm91dGVVbmlxdWVJZChQcm92aWRlckluZm8gcHJvdmlkZXIsIFN0cmluZyByb3V0ZURlc2NyaXB0b3JJZCkgewotICAgICAgICAgICAgLy8gQWx0aG91Z2ggcm91dGUgZGVzY3JpcHRvciBpZHMgYXJlIHVuaXF1ZSB3aXRoaW4gYSBwcm92aWRlciwgaXQncwotICAgICAgICAgICAgLy8gcG9zc2libGUgZm9yIHRoZXJlIHRvIGJlIHR3byBwcm92aWRlcnMgd2l0aCB0aGUgc2FtZSBwYWNrYWdlIG5hbWUuCi0gICAgICAgICAgICAvLyBUaGVyZWZvcmUgd2UgbXVzdCBkZWR1cGUgdGhlIGNvbXBvc2l0ZSBpZC4KLSAgICAgICAgICAgIFN0cmluZyBjb21wb25lbnROYW1lID0gcHJvdmlkZXIuZ2V0Q29tcG9uZW50TmFtZSgpLmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCk7Ci0gICAgICAgICAgICBTdHJpbmcgdW5pcXVlSWQgPSBjb21wb25lbnROYW1lICsgIjoiICsgcm91dGVEZXNjcmlwdG9ySWQ7Ci0gICAgICAgICAgICBpZiAoZmluZFJvdXRlQnlVbmlxdWVJZCh1bmlxdWVJZCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgbVVuaXF1ZUlkTWFwLnB1dChuZXcgUGFpcjw+KGNvbXBvbmVudE5hbWUsIHJvdXRlRGVzY3JpcHRvcklkKSwgdW5pcXVlSWQpOwotICAgICAgICAgICAgICAgIHJldHVybiB1bmlxdWVJZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExvZy53KFRBRywgIkVpdGhlciAiICsgcm91dGVEZXNjcmlwdG9ySWQgKyAiIGlzbid0IHVuaXF1ZSBpbiAiICsgY29tcG9uZW50TmFtZQotICAgICAgICAgICAgICAgICAgICArICIgb3Igd2UncmUgdHJ5aW5nIHRvIGFzc2lnbiBhIHVuaXF1ZSBJRCBmb3IgYW4gYWxyZWFkeSBhZGRlZCByb3V0ZSIpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDI7IDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5ld1VuaXF1ZUlkID0gU3RyaW5nLmZvcm1hdChMb2NhbGUuVVMsICIlc18lZCIsIHVuaXF1ZUlkLCBpKTsKLSAgICAgICAgICAgICAgICBpZiAoZmluZFJvdXRlQnlVbmlxdWVJZChuZXdVbmlxdWVJZCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1VbmlxdWVJZE1hcC5wdXQobmV3IFBhaXI8Pihjb21wb25lbnROYW1lLCByb3V0ZURlc2NyaXB0b3JJZCksIG5ld1VuaXF1ZUlkKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1VuaXF1ZUlkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGZpbmRSb3V0ZUJ5VW5pcXVlSWQoU3RyaW5nIHVuaXF1ZUlkKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtUm91dGVzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChtUm91dGVzLmdldChpKS5tVW5pcXVlSWQuZXF1YWxzKHVuaXF1ZUlkKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRVbmlxdWVJZChQcm92aWRlckluZm8gcHJvdmlkZXIsIFN0cmluZyByb3V0ZURlc2NyaXB0b3JJZCkgewotICAgICAgICAgICAgU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBwcm92aWRlci5nZXRDb21wb25lbnROYW1lKCkuZmxhdHRlblRvU2hvcnRTdHJpbmcoKTsKLSAgICAgICAgICAgIHJldHVybiBtVW5pcXVlSWRNYXAuZ2V0KG5ldyBQYWlyPD4oY29tcG9uZW50TmFtZSwgcm91dGVEZXNjcmlwdG9ySWQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTZWxlY3RlZFJvdXRlSWZOZWVkZWQoYm9vbGVhbiBzZWxlY3RlZFJvdXRlRGVzY3JpcHRvckNoYW5nZWQpIHsKLSAgICAgICAgICAgIC8vIFVwZGF0ZSBkZWZhdWx0IHJvdXRlLgotICAgICAgICAgICAgaWYgKG1EZWZhdWx0Um91dGUgIT0gbnVsbCAmJiAhbURlZmF1bHRSb3V0ZS5pc1NlbGVjdGFibGUoKSkgewotICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkNsZWFyaW5nIHRoZSBkZWZhdWx0IHJvdXRlIGJlY2F1c2UgaXQgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiaXMgbm8gbG9uZ2VyIHNlbGVjdGFibGU6ICIgKyBtRGVmYXVsdFJvdXRlKTsKLSAgICAgICAgICAgICAgICBtRGVmYXVsdFJvdXRlID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtRGVmYXVsdFJvdXRlID09IG51bGwgJiYgIW1Sb3V0ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChSb3V0ZUluZm8gcm91dGUgOiBtUm91dGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1N5c3RlbURlZmF1bHRSb3V0ZShyb3V0ZSkgJiYgcm91dGUuaXNTZWxlY3RhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZhdWx0Um91dGUgPSByb3V0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkZvdW5kIGRlZmF1bHQgcm91dGU6ICIgKyBtRGVmYXVsdFJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVcGRhdGUgYmx1ZXRvb3RoIHJvdXRlLgotICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhSb3V0ZSAhPSBudWxsICYmICFtQmx1ZXRvb3RoUm91dGUuaXNTZWxlY3RhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDbGVhcmluZyB0aGUgYmx1ZXRvb3RoIHJvdXRlIGJlY2F1c2UgaXQgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiaXMgbm8gbG9uZ2VyIHNlbGVjdGFibGU6ICIgKyBtQmx1ZXRvb3RoUm91dGUpOwotICAgICAgICAgICAgICAgIG1CbHVldG9vdGhSb3V0ZSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUJsdWV0b290aFJvdXRlID09IG51bGwgJiYgIW1Sb3V0ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChSb3V0ZUluZm8gcm91dGUgOiBtUm91dGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1N5c3RlbUxpdmVBdWRpb09ubHlSb3V0ZShyb3V0ZSkgJiYgcm91dGUuaXNTZWxlY3RhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhSb3V0ZSA9IHJvdXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiRm91bmQgYmx1ZXRvb3RoIHJvdXRlOiAiICsgbUJsdWV0b290aFJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVcGRhdGUgc2VsZWN0ZWQgcm91dGUuCi0gICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgPT0gbnVsbCB8fCAhbVNlbGVjdGVkUm91dGUuaXNTZWxlY3RhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJVbnNlbGVjdGluZyB0aGUgY3VycmVudCByb3V0ZSBiZWNhdXNlIGl0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImlzIG5vIGxvbmdlciBzZWxlY3RhYmxlOiAiICsgbVNlbGVjdGVkUm91dGUpOwotICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkUm91dGVJbnRlcm5hbChjaG9vc2VGYWxsYmFja1JvdXRlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fVU5LTk9XTik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkUm91dGVEZXNjcmlwdG9yQ2hhbmdlZCkgewotICAgICAgICAgICAgICAgIC8vIEluIGNhc2UgdGhlIHNlbGVjdGVkIHJvdXRlIGlzIGEgcm91dGUgZ3JvdXAsIHNlbGVjdC91bnNlbGVjdCByb3V0ZSBjb250cm9sbGVycwotICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgYWRkZWQvcmVtb3ZlZCByb3V0ZSBtZW1iZXJzLgotICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSBpbnN0YW5jZW9mIFJvdXRlR3JvdXApIHsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxSb3V0ZUluZm8+IHJvdXRlcyA9ICgoUm91dGVHcm91cCkgbVNlbGVjdGVkUm91dGUpLmdldFJvdXRlcygpOwotICAgICAgICAgICAgICAgICAgICAvLyBCdWlsZCBhIHNldCBvZiBkZXNjcmlwdG9yIElEcyBmb3IgdGhlIG5ldyByb3V0ZSBncm91cC4KLSAgICAgICAgICAgICAgICAgICAgU2V0PFN0cmluZz4gaWRTZXQgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIHJvdXRlIDogcm91dGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZFNldC5hZGQocm91dGUubURlc2NyaXB0b3JJZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gVW5zZWxlY3Qgcm91dGUgY29udHJvbGxlcnMgZm9yIHRoZSByZW1vdmVkIHJvdXRlcy4KLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgUm91dGVDb250cm9sbGVyPj4gaXRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlQ29udHJvbGxlck1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5PFN0cmluZywgUm91dGVDb250cm9sbGVyPiBlbnRyeSA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpZFNldC5jb250YWlucyhlbnRyeS5nZXRLZXkoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5vblVuc2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNlbGVjdCByb3V0ZSBjb250cm9sbGVycyBmb3IgdGhlIGFkZGVkIHJvdXRlcy4KLSAgICAgICAgICAgICAgICAgICAgZm9yIChSb3V0ZUluZm8gcm91dGUgOiByb3V0ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbVJvdXRlQ29udHJvbGxlck1hcC5jb250YWluc0tleShyb3V0ZS5tRGVzY3JpcHRvcklkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0gcm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLm1EZXNjcmlwdG9ySWQsIG1TZWxlY3RlZFJvdXRlLm1EZXNjcmlwdG9ySWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25TZWxlY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVDb250cm9sbGVyTWFwLnB1dChyb3V0ZS5tRGVzY3JpcHRvcklkLCBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHBsYXliYWNrIGluZm8gYmVjYXVzZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgcm91dGUgaGF2ZSBjaGFuZ2VkLgotICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrSW5mb0Zyb21TZWxlY3RlZFJvdXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBSb3V0ZUluZm8gY2hvb3NlRmFsbGJhY2tSb3V0ZSgpIHsKLSAgICAgICAgICAgIC8vIFdoZW4gdGhlIGN1cnJlbnQgcm91dGUgaXMgcmVtb3ZlZCBvciBubyBsb25nZXIgc2VsZWN0YWJsZSwKLSAgICAgICAgICAgIC8vIHdlIHdhbnQgdG8gcmV2ZXJ0IHRvIGEgbGl2ZSBhdWRpbyByb3V0ZSBpZiB0aGVyZSBpcwotICAgICAgICAgICAgLy8gb25lICh1c3VhbGx5IEJsdWV0b290aCBBMkRQKS4gIEZhaWxpbmcgdGhhdCwgdXNlCi0gICAgICAgICAgICAvLyB0aGUgZGVmYXVsdCByb3V0ZS4KLSAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIHJvdXRlIDogbVJvdXRlcykgewotICAgICAgICAgICAgICAgIGlmIChyb3V0ZSAhPSBtRGVmYXVsdFJvdXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBpc1N5c3RlbUxpdmVBdWRpb09ubHlSb3V0ZShyb3V0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHJvdXRlLmlzU2VsZWN0YWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByb3V0ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbURlZmF1bHRSb3V0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1N5c3RlbUxpdmVBdWRpb09ubHlSb3V0ZShSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIHJldHVybiByb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkgPT0gbVN5c3RlbVByb3ZpZGVyCi0gICAgICAgICAgICAgICAgICAgICYmIHJvdXRlLnN1cHBvcnRzQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKQotICAgICAgICAgICAgICAgICAgICAmJiAhcm91dGUuc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfVklERU8pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzU3lzdGVtRGVmYXVsdFJvdXRlKFJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgcmV0dXJuIHJvdXRlLmdldFByb3ZpZGVySW5zdGFuY2UoKSA9PSBtU3lzdGVtUHJvdmlkZXIKLSAgICAgICAgICAgICAgICAgICAgJiYgcm91dGUubURlc2NyaXB0b3JJZC5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyLkRFRkFVTFRfUk9VVEVfSUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGVkUm91dGVJbnRlcm5hbChATm9uTnVsbCBSb3V0ZUluZm8gcm91dGUsIGludCB1bnNlbGVjdFJlYXNvbikgewotICAgICAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoZSBmb2xsb3dpbmcgbG9nZ2luZyB3aGVuIG5vIGxvbmdlciBuZWVkZWQuCi0gICAgICAgICAgICBpZiAoc0dsb2JhbCA9PSBudWxsIHx8IChtQmx1ZXRvb3RoUm91dGUgIT0gbnVsbCAmJiByb3V0ZS5pc0RlZmF1bHQoKSkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdGFja1RyYWNlRWxlbWVudFtdIGNhbGxTdGFjayA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIC8vIGNhbGxTdGFja1szXSBpcyB0aGUgY2FsbGVyIG9mIHRoaXMgbWV0aG9kLgotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAzOyBpIDwgY2FsbFN0YWNrLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0YWNrVHJhY2VFbGVtZW50IGNhbGxlciA9IGNhbGxTdGFja1tpXTsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGNhbGxlci5nZXRDbGFzc05hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIuIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGNhbGxlci5nZXRNZXRob2ROYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiOiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChjYWxsZXIuZ2V0TGluZU51bWJlcigpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiAgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzR2xvYmFsID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2V0U2VsZWN0ZWRSb3V0ZUludGVybmFsIGlzIGNhbGxlZCB3aGlsZSBzR2xvYmFsIGlzIG51bGw6IHBrZ05hbWU9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUFwcGxpY2F0aW9uQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpICsgIiwgY2FsbGVycz0iICsgc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRGVmYXVsdCByb3V0ZSBpcyBzZWxlY3RlZCB3aGlsZSBhIEJUIHJvdXRlIGlzIGF2YWlsYWJsZTogcGtnTmFtZT0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtQXBwbGljYXRpb25Db250ZXh0LmdldFBhY2thZ2VOYW1lKCkgKyAiLCBjYWxsZXJzPSIgKyBzYi50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSAhPSByb3V0ZSkgewotICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgdW5zZWxlY3RlZDogIiArIG1TZWxlY3RlZFJvdXRlICsgIiByZWFzb246ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB1bnNlbGVjdFJlYXNvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfVU5TRUxFQ1RFRCwgbVNlbGVjdGVkUm91dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zZWxlY3RSZWFzb24pOwotICAgICAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGVDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlci5vblVuc2VsZWN0KHVuc2VsZWN0UmVhc29uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlci5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtUm91dGVDb250cm9sbGVyTWFwLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChSb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA6IG1Sb3V0ZUNvbnRyb2xsZXJNYXAudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uVW5zZWxlY3QodW5zZWxlY3RSZWFzb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVDb250cm9sbGVyTWFwLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZSA9IHJvdXRlOwotICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlciA9IHJvdXRlLmdldFByb3ZpZGVySW5zdGFuY2UoKS5vbkNyZWF0ZVJvdXRlQ29udHJvbGxlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLm1EZXNjcmlwdG9ySWQpOwotICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIub25TZWxlY3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdXRlIHNlbGVjdGVkOiAiICsgbVNlbGVjdGVkUm91dGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoQ2FsbGJhY2tIYW5kbGVyLk1TR19ST1VURV9TRUxFQ1RFRCwgbVNlbGVjdGVkUm91dGUpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlIGluc3RhbmNlb2YgUm91dGVHcm91cCkgewotICAgICAgICAgICAgICAgICAgICBMaXN0PFJvdXRlSW5mbz4gcm91dGVzID0gKChSb3V0ZUdyb3VwKSBtU2VsZWN0ZWRSb3V0ZSkuZ2V0Um91dGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZUNvbnRyb2xsZXJNYXAuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChSb3V0ZUluZm8gciA6IHJvdXRlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmdldFByb3ZpZGVySW5zdGFuY2UoKS5vbkNyZWF0ZVJvdXRlQ29udHJvbGxlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLm1EZXNjcmlwdG9ySWQsIG1TZWxlY3RlZFJvdXRlLm1EZXNjcmlwdG9ySWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5vblNlbGVjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlQ29udHJvbGxlck1hcC5wdXQoci5tRGVzY3JpcHRvcklkLCBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrSW5mb0Zyb21TZWxlY3RlZFJvdXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TeXN0ZW1Sb3V0ZVNlbGVjdGVkQnlEZXNjcmlwdG9ySWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgICAgICAvLyBTeXN0ZW0gcm91dGUgaXMgc2VsZWN0ZWQsIGRvIG5vdCBzeW5jIHRoZSByb3V0ZSB3ZSBzZWxlY3RlZCBiZWZvcmUuCi0gICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfU0VMRUNURUQpOwotICAgICAgICAgICAgaW50IHByb3ZpZGVySW5kZXggPSBmaW5kUHJvdmlkZXJJbmZvKG1TeXN0ZW1Qcm92aWRlcik7Ci0gICAgICAgICAgICBpZiAocHJvdmlkZXJJbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgUHJvdmlkZXJJbmZvIHByb3ZpZGVyID0gbVByb3ZpZGVycy5nZXQocHJvdmlkZXJJbmRleCk7Ci0gICAgICAgICAgICAgICAgaW50IHJvdXRlSW5kZXggPSBwcm92aWRlci5maW5kUm91dGVCeURlc2NyaXB0b3JJZChpZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJvdXRlSW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBwcm92aWRlci5tUm91dGVzLmdldChyb3V0ZUluZGV4KS5zZWxlY3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRSZW1vdGVDb250cm9sQ2xpZW50KE9iamVjdCByY2MpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkKHJjYyk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgUmVtb3RlQ29udHJvbENsaWVudFJlY29yZCByZWNvcmQgPSBuZXcgUmVtb3RlQ29udHJvbENsaWVudFJlY29yZChyY2MpOwotICAgICAgICAgICAgICAgIG1SZW1vdGVDb250cm9sQ2xpZW50cy5hZGQocmVjb3JkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJlbW90ZUNvbnRyb2xDbGllbnQoT2JqZWN0IHJjYykgewotICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQocmNjKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgUmVtb3RlQ29udHJvbENsaWVudFJlY29yZCByZWNvcmQgPSBtUmVtb3RlQ29udHJvbENsaWVudHMucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgICAgICByZWNvcmQuZGlzY29ubmVjdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0TWVkaWFTZXNzaW9uKE9iamVjdCBzZXNzaW9uKSB7Ci0gICAgICAgICAgICBzZXRNZWRpYVNlc3Npb25SZWNvcmQoc2Vzc2lvbiAhPSBudWxsID8gbmV3IE1lZGlhU2Vzc2lvblJlY29yZChzZXNzaW9uKSA6IG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0TWVkaWFTZXNzaW9uQ29tcGF0KGZpbmFsIE1lZGlhU2Vzc2lvbkNvbXBhdCBzZXNzaW9uKSB7Ci0gICAgICAgICAgICBtQ29tcGF0U2Vzc2lvbiA9IHNlc3Npb247Ci0gICAgICAgICAgICBpZiAoYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMjEpIHsKLSAgICAgICAgICAgICAgICBzZXRNZWRpYVNlc3Npb25SZWNvcmQoc2Vzc2lvbiAhPSBudWxsID8gbmV3IE1lZGlhU2Vzc2lvblJlY29yZChzZXNzaW9uKSA6IG51bGwpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSAxNCkgewotICAgICAgICAgICAgICAgIGlmIChtUmNjTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUmVtb3RlQ29udHJvbENsaWVudChtUmNjTWVkaWFTZXNzaW9uLmdldFJlbW90ZUNvbnRyb2xDbGllbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1SY2NNZWRpYVNlc3Npb24ucmVtb3ZlT25BY3RpdmVDaGFuZ2VMaXN0ZW5lcihtU2Vzc2lvbkFjdGl2ZUxpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVJjY01lZGlhU2Vzc2lvbiA9IHNlc3Npb247Ci0gICAgICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmFkZE9uQWN0aXZlQ2hhbmdlTGlzdGVuZXIobVNlc3Npb25BY3RpdmVMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uLmlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlbW90ZUNvbnRyb2xDbGllbnQoc2Vzc2lvbi5nZXRSZW1vdGVDb250cm9sQ2xpZW50KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldE1lZGlhU2Vzc2lvblJlY29yZChNZWRpYVNlc3Npb25SZWNvcmQgbWVkaWFTZXNzaW9uUmVjb3JkKSB7Ci0gICAgICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5jbGVhclZvbHVtZUhhbmRsaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTWVkaWFTZXNzaW9uID0gbWVkaWFTZXNzaW9uUmVjb3JkOwotICAgICAgICAgICAgaWYgKG1lZGlhU2Vzc2lvblJlY29yZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tJbmZvRnJvbVNlbGVjdGVkUm91dGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBNZWRpYVNlc3Npb25Db21wYXQuVG9rZW4gZ2V0TWVkaWFTZXNzaW9uVG9rZW4oKSB7Ci0gICAgICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1NZWRpYVNlc3Npb24uZ2V0VG9rZW4oKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUNvbXBhdFNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtQ29tcGF0U2Vzc2lvbi5nZXRTZXNzaW9uVG9rZW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgZmluZFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQoT2JqZWN0IHJjYykgewotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVJlbW90ZUNvbnRyb2xDbGllbnRzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQgcmVjb3JkID0gbVJlbW90ZUNvbnRyb2xDbGllbnRzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAocmVjb3JkLmdldFJlbW90ZUNvbnRyb2xDbGllbnQoKSA9PSByY2MpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBsYXliYWNrSW5mb0Zyb21TZWxlY3RlZFJvdXRlKCkgewotICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUGxheWJhY2tJbmZvLnZvbHVtZSA9IG1TZWxlY3RlZFJvdXRlLmdldFZvbHVtZSgpOwotICAgICAgICAgICAgICAgIG1QbGF5YmFja0luZm8udm9sdW1lTWF4ID0gbVNlbGVjdGVkUm91dGUuZ2V0Vm9sdW1lTWF4KCk7Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrSW5mby52b2x1bWVIYW5kbGluZyA9IG1TZWxlY3RlZFJvdXRlLmdldFZvbHVtZUhhbmRsaW5nKCk7Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrSW5mby5wbGF5YmFja1N0cmVhbSA9IG1TZWxlY3RlZFJvdXRlLmdldFBsYXliYWNrU3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrSW5mby5wbGF5YmFja1R5cGUgPSBtU2VsZWN0ZWRSb3V0ZS5nZXRQbGF5YmFja1R5cGUoKTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1SZW1vdGVDb250cm9sQ2xpZW50cy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQgcmVjb3JkID0gbVJlbW90ZUNvbnRyb2xDbGllbnRzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLnVwZGF0ZVBsYXliYWNrSW5mbygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSA9PSBnZXREZWZhdWx0Um91dGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1TZWxlY3RlZFJvdXRlID09IGdldEJsdWV0b290aFJvdXRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvY2FsIHJvdXRlCi0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFTZXNzaW9uLmNsZWFyVm9sdW1lSGFuZGxpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEBWb2x1bWVQcm92aWRlckNvbXBhdC5Db250cm9sVHlwZSBpbnQgY29udHJvbFR5cGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVQcm92aWRlckNvbXBhdC5WT0xVTUVfQ09OVFJPTF9GSVhFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUGxheWJhY2tJbmZvLnZvbHVtZUhhbmRsaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19WT0xVTUVfVkFSSUFCTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sVHlwZSA9IFZvbHVtZVByb3ZpZGVyQ29tcGF0LlZPTFVNRV9DT05UUk9MX0FCU09MVVRFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5jb25maWd1cmVWb2x1bWUoY29udHJvbFR5cGUsIG1QbGF5YmFja0luZm8udm9sdW1lTWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2tJbmZvLnZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChtTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5jbGVhclZvbHVtZUhhbmRsaW5nKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBQcm92aWRlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZVByb3ZpZGVyLkNhbGxiYWNrIHsKLSAgICAgICAgICAgIFByb3ZpZGVyQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25EZXNjcmlwdG9yQ2hhbmdlZChNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgIHVwZGF0ZVByb3ZpZGVyRGVzY3JpcHRvcihwcm92aWRlciwgZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE1lZGlhU2Vzc2lvblJlY29yZCB7Ci0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIE1lZGlhU2Vzc2lvbkNvbXBhdCBtTXNDb21wYXQ7Ci0KLSAgICAgICAgICAgIHByaXZhdGUgQFZvbHVtZVByb3ZpZGVyQ29tcGF0LkNvbnRyb2xUeXBlIGludCBtQ29udHJvbFR5cGU7Ci0gICAgICAgICAgICBwcml2YXRlIGludCBtTWF4Vm9sdW1lOwotICAgICAgICAgICAgcHJpdmF0ZSBWb2x1bWVQcm92aWRlckNvbXBhdCBtVnBDb21wYXQ7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBNZWRpYVNlc3Npb25SZWNvcmQoT2JqZWN0IG1lZGlhU2Vzc2lvbikgewotICAgICAgICAgICAgICAgIG1Nc0NvbXBhdCA9IE1lZGlhU2Vzc2lvbkNvbXBhdC5mcm9tTWVkaWFTZXNzaW9uKG1BcHBsaWNhdGlvbkNvbnRleHQsIG1lZGlhU2Vzc2lvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBNZWRpYVNlc3Npb25SZWNvcmQoTWVkaWFTZXNzaW9uQ29tcGF0IG1lZGlhU2Vzc2lvbkNvbXBhdCkgewotICAgICAgICAgICAgICAgIG1Nc0NvbXBhdCA9IG1lZGlhU2Vzc2lvbkNvbXBhdDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgY29uZmlndXJlVm9sdW1lKEBWb2x1bWVQcm92aWRlckNvbXBhdC5Db250cm9sVHlwZSBpbnQgY29udHJvbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgIGludCBtYXgsIGludCBjdXJyZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1WcENvbXBhdCAhPSBudWxsICYmIGNvbnRyb2xUeXBlID09IG1Db250cm9sVHlwZSAmJiBtYXggPT0gbU1heFZvbHVtZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IGNoYW5nZWQgY29udHJvbCB0eXBlIG9yIG1heCBqdXN0IHNldCB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gbmV3IGN1cnJlbnQgdm9sdW1lCi0gICAgICAgICAgICAgICAgICAgIG1WcENvbXBhdC5zZXRDdXJyZW50Vm9sdW1lKGN1cnJlbnQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBjcmVhdGUgYSBuZXcgcHJvdmlkZXIgYW5kIHVwZGF0ZQotICAgICAgICAgICAgICAgICAgICBtVnBDb21wYXQgPSBuZXcgVm9sdW1lUHJvdmlkZXJDb21wYXQoY29udHJvbFR5cGUsIG1heCwgY3VycmVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNldFZvbHVtZVRvKGZpbmFsIGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZS5yZXF1ZXN0U2V0Vm9sdW1lKHZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFkanVzdFZvbHVtZShmaW5hbCBpbnQgZGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGUucmVxdWVzdFVwZGF0ZVZvbHVtZShkaXJlY3Rpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgICAgIG1Nc0NvbXBhdC5zZXRQbGF5YmFja1RvUmVtb3RlKG1WcENvbXBhdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjbGVhclZvbHVtZUhhbmRsaW5nKCkgewotICAgICAgICAgICAgICAgIG1Nc0NvbXBhdC5zZXRQbGF5YmFja1RvTG9jYWwobVBsYXliYWNrSW5mby5wbGF5YmFja1N0cmVhbSk7Ci0gICAgICAgICAgICAgICAgbVZwQ29tcGF0ID0gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIE1lZGlhU2Vzc2lvbkNvbXBhdC5Ub2tlbiBnZXRUb2tlbigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbU1zQ29tcGF0LmdldFNlc3Npb25Ub2tlbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50cyBSZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0LlZvbHVtZUNhbGxiYWNrIHsKLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdCBtUmNjQ29tcGF0OwotICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1EaXNjb25uZWN0ZWQ7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkKE9iamVjdCByY2MpIHsKLSAgICAgICAgICAgICAgICBtUmNjQ29tcGF0ID0gUmVtb3RlQ29udHJvbENsaWVudENvbXBhdC5vYnRhaW4obUFwcGxpY2F0aW9uQ29udGV4dCwgcmNjKTsKLSAgICAgICAgICAgICAgICBtUmNjQ29tcGF0LnNldFZvbHVtZUNhbGxiYWNrKHRoaXMpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrSW5mbygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFJlbW90ZUNvbnRyb2xDbGllbnQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1SY2NDb21wYXQuZ2V0UmVtb3RlQ29udHJvbENsaWVudCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBkaXNjb25uZWN0KCkgewotICAgICAgICAgICAgICAgIG1EaXNjb25uZWN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1SY2NDb21wYXQuc2V0Vm9sdW1lQ2FsbGJhY2sobnVsbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVBsYXliYWNrSW5mbygpIHsKLSAgICAgICAgICAgICAgICBtUmNjQ29tcGF0LnNldFBsYXliYWNrSW5mbyhtUGxheWJhY2tJbmZvKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVNldFJlcXVlc3QoaW50IHZvbHVtZSkgewotICAgICAgICAgICAgICAgIGlmICghbURpc2Nvbm5lY3RlZCAmJiBtU2VsZWN0ZWRSb3V0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlLnJlcXVlc3RTZXRWb2x1bWUodm9sdW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVVcGRhdGVSZXF1ZXN0KGludCBkaXJlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1EaXNjb25uZWN0ZWQgJiYgbVNlbGVjdGVkUm91dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZS5yZXF1ZXN0VXBkYXRlVm9sdW1lKGRpcmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDYWxsYmFja0hhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PENhbGxiYWNrUmVjb3JkPiBtVGVtcENhbGxiYWNrUmVjb3JkcyA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8Q2FsbGJhY2tSZWNvcmQ+KCk7Ci0KLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVFlQRV9NQVNLID0gMHhmZjAwOwotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19UWVBFX1JPVVRFID0gMHgwMTAwOwotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19UWVBFX1BST1ZJREVSID0gMHgwMjAwOwotCi0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUk9VVEVfQURERUQgPSBNU0dfVFlQRV9ST1VURSB8IDE7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUk9VVEVfUkVNT1ZFRCA9IE1TR19UWVBFX1JPVVRFIHwgMjsKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19ST1VURV9DSEFOR0VEID0gTVNHX1RZUEVfUk9VVEUgfCAzOwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JPVVRFX1ZPTFVNRV9DSEFOR0VEID0gTVNHX1RZUEVfUk9VVEUgfCA0OwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JPVVRFX1BSRVNFTlRBVElPTl9ESVNQTEFZX0NIQU5HRUQgPSBNU0dfVFlQRV9ST1VURSB8IDU7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUk9VVEVfU0VMRUNURUQgPSBNU0dfVFlQRV9ST1VURSB8IDY7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUk9VVEVfVU5TRUxFQ1RFRCA9IE1TR19UWVBFX1JPVVRFIHwgNzsKLQotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BST1ZJREVSX0FEREVEID0gTVNHX1RZUEVfUFJPVklERVIgfCAxOwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BST1ZJREVSX1JFTU9WRUQgPSBNU0dfVFlQRV9QUk9WSURFUiB8IDI7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUFJPVklERVJfQ0hBTkdFRCA9IE1TR19UWVBFX1BST1ZJREVSIHwgMzsKLQotICAgICAgICAgICAgQ2FsbGJhY2tIYW5kbGVyKCkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwb3N0KGludCBtc2csIE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgICAgICBvYnRhaW5NZXNzYWdlKG1zZywgb2JqKS5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgcG9zdChpbnQgbXNnLCBPYmplY3Qgb2JqLCBpbnQgYXJnKSB7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gb2J0YWluTWVzc2FnZShtc2csIG9iaik7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZS5hcmcxID0gYXJnOwotICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aGF0ID0gbXNnLndoYXQ7Ci0gICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IG9iaiA9IG1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGFyZyA9IG1zZy5hcmcxOwotCi0gICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gTVNHX1JPVVRFX0NIQU5HRUQKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIGdldFNlbGVjdGVkUm91dGUoKS5nZXRJZCgpLmVxdWFscygoKFJvdXRlSW5mbykgb2JqKS5nZXRJZCgpKSkgewotICAgICAgICAgICAgICAgICAgICB1cGRhdGVTZWxlY3RlZFJvdXRlSWZOZWVkZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gU3luY2hyb25pemUgc3RhdGUgd2l0aCB0aGUgc3lzdGVtIG1lZGlhIHJvdXRlci4KLSAgICAgICAgICAgICAgICBzeW5jV2l0aFN5c3RlbVByb3ZpZGVyKHdoYXQsIG9iaik7Ci0KLSAgICAgICAgICAgICAgICAvLyBJbnZva2UgYWxsIHJlZ2lzdGVyZWQgY2FsbGJhY2tzLgotICAgICAgICAgICAgICAgIC8vIEJ1aWxkIGEgbGlzdCBvZiBjYWxsYmFja3MgYmVmb3JlIGludm9raW5nIHRoZW0gaW4gY2FzZSBjYWxsYmFja3MKLSAgICAgICAgICAgICAgICAvLyBhcmUgYWRkZWQgb3IgcmVtb3ZlZCBkdXJpbmcgZGlzcGF0Y2guCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1Sb3V0ZXJzLnNpemUoKTsgLS1pID49IDA7ICkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIgcm91dGVyID0gbVJvdXRlcnMuZ2V0KGkpLmdldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlcnMucmVtb3ZlKGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGVtcENhbGxiYWNrUmVjb3Jkcy5hZGRBbGwocm91dGVyLm1DYWxsYmFja1JlY29yZHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGNhbGxiYWNrQ291bnQgPSBtVGVtcENhbGxiYWNrUmVjb3Jkcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FsbGJhY2tDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnZva2VDYWxsYmFjayhtVGVtcENhbGxiYWNrUmVjb3Jkcy5nZXQoaSksIHdoYXQsIG9iaiwgYXJnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UZW1wQ2FsbGJhY2tSZWNvcmRzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgc3luY1dpdGhTeXN0ZW1Qcm92aWRlcihpbnQgd2hhdCwgT2JqZWN0IG9iaikgewotICAgICAgICAgICAgICAgIHN3aXRjaCAod2hhdCkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9BRERFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1Qcm92aWRlci5vblN5bmNSb3V0ZUFkZGVkKChSb3V0ZUluZm8pIG9iaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfUkVNT1ZFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1Qcm92aWRlci5vblN5bmNSb3V0ZVJlbW92ZWQoKFJvdXRlSW5mbykgb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVByb3ZpZGVyLm9uU3luY1JvdXRlQ2hhbmdlZCgoUm91dGVJbmZvKSBvYmopOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX1NFTEVDVEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVByb3ZpZGVyLm9uU3luY1JvdXRlU2VsZWN0ZWQoKFJvdXRlSW5mbykgb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGludm9rZUNhbGxiYWNrKENhbGxiYWNrUmVjb3JkIHJlY29yZCwgaW50IHdoYXQsIE9iamVjdCBvYmosIGludCBhcmcpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVJvdXRlciByb3V0ZXIgPSByZWNvcmQubVJvdXRlcjsKLSAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVJvdXRlci5DYWxsYmFjayBjYWxsYmFjayA9IHJlY29yZC5tQ2FsbGJhY2s7Ci0gICAgICAgICAgICAgICAgc3dpdGNoICh3aGF0ICYgTVNHX1RZUEVfTUFTSykgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19UWVBFX1JPVVRFOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSb3V0ZUluZm8gcm91dGUgPSAoUm91dGVJbmZvKW9iajsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVjb3JkLmZpbHRlclJvdXRlRXZlbnQocm91dGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHdoYXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9BRERFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZUFkZGVkKHJvdXRlciwgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9SRU1PVkVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJvdXRlUmVtb3ZlZChyb3V0ZXIsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZUNoYW5nZWQocm91dGVyLCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX1ZPTFVNRV9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJvdXRlVm9sdW1lQ2hhbmdlZChyb3V0ZXIsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfUFJFU0VOVEFUSU9OX0RJU1BMQVlfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZVByZXNlbnRhdGlvbkRpc3BsYXlDaGFuZ2VkKHJvdXRlciwgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9TRUxFQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZVNlbGVjdGVkKHJvdXRlciwgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9VTlNFTEVDVEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJvdXRlVW5zZWxlY3RlZChyb3V0ZXIsIHJvdXRlLCBhcmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1RZUEVfUFJPVklERVI6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb3ZpZGVySW5mbyBwcm92aWRlciA9IChQcm92aWRlckluZm8pb2JqOwotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUFJPVklERVJfQURERUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUHJvdmlkZXJBZGRlZChyb3V0ZXIsIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUFJPVklERVJfUkVNT1ZFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Qcm92aWRlclJlbW92ZWQocm91dGVyLCBwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1BST1ZJREVSX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUHJvdmlkZXJDaGFuZ2VkKHJvdXRlciwgcHJvdmlkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVNlc3Npb25TdGF0dXMuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVNlc3Npb25TdGF0dXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIwNjU5Ni4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFTZXNzaW9uU3RhdHVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC51dGlsLlRpbWVVdGlsczsKLQotLyoqCi0gKiBEZXNjcmliZXMgdGhlIHBsYXliYWNrIHN0YXR1cyBvZiBhIG1lZGlhIHNlc3Npb24uCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgcGFydCBvZiB0aGUgcmVtb3RlIHBsYXliYWNrIHByb3RvY29sIGRlc2NyaWJlZCBieSB0aGUKLSAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgTWVkaWFDb250cm9sSW50ZW50fSBjbGFzcy4KLSAqIDwvcD48cD4KLSAqIFdoZW4gYSBtZWRpYSBzZXNzaW9uIGlzIGNyZWF0ZWQsIGl0IGlzIGluaXRpYWxseSBpbiB0aGUKLSAqIHtAbGluayAjU0VTU0lPTl9TVEFURV9BQ1RJVkUgYWN0aXZlfSBzdGF0ZS4gIFdoZW4gdGhlIG1lZGlhIHNlc3Npb24gZW5kcwotICogbm9ybWFsbHksIGl0IHRyYW5zaXRpb25zIHRvIHRoZSB7QGxpbmsgI1NFU1NJT05fU1RBVEVfRU5ERUQgZW5kZWR9IHN0YXRlLgotICogSWYgdGhlIG1lZGlhIHNlc3Npb24gaXMgaW52YWxpZGF0ZWQgZHVlIHRvIGFub3RoZXIgc2Vzc2lvbiBmb3JjaWJseSB0YWtpbmcKLSAqIGNvbnRyb2wgb2YgdGhlIHJvdXRlLCB0aGVuIGl0IHRyYW5zaXRpb25zIHRvIHRoZQotICoge0BsaW5rICNTRVNTSU9OX1NUQVRFX0lOVkFMSURBVEVEIGludmFsaWRhdGVkfSBzdGF0ZS4KLSAqIFJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uIG9mIGVhY2ggc3RhdGUgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIGl0cyBtZWFuaW5nLgotICogPC9wPjxwPgotICogVG8gbW9uaXRvciBzZXNzaW9uIHN0YXR1cywgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBzdXBwbHkgYSB7QGxpbmsgUGVuZGluZ0ludGVudH0gdG8gdXNlIGFzIHRoZQotICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNFWFRSQV9TRVNTSU9OX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgc2Vzc2lvbiBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyfQotICogZm9yIGEgZ2l2ZW4ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RBUlRfU0VTU0lPTiBzZXNzaW9uIHN0YXJ0IHJlcXVlc3R9LgotICogPC9wPjxwPgotICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZCB1c2luZyBhIHtAbGluayBCdWlsZGVyfSBpbnN0YW5jZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhU2Vzc2lvblN0YXR1cyB7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVElNRVNUQU1QID0gInRpbWVzdGFtcCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VTU0lPTl9TVEFURSA9ICJzZXNzaW9uU3RhdGUiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1FVRVVFX1BBVVNFRCA9ICJxdWV1ZVBhdXNlZCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRVhUUkFTID0gImV4dHJhcyI7Ci0KLSAgICBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLQotICAgIC8qKgotICAgICAqIFNlc3Npb24gc3RhdGU6IEFjdGl2ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgc2Vzc2lvbiBpcyBhY3RpdmUgYW5kIGluIGNvbnRyb2wgb2YgdGhlIHJvdXRlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVNTSU9OX1NUQVRFX0FDVElWRSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBTZXNzaW9uIHN0YXRlOiBFbmRlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgc2Vzc2lvbiB3YXMgZW5kZWQgbm9ybWFsbHkgdXNpbmcgdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5EX1NFU1NJT04gZW5kIHNlc3Npb259IGFjdGlvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogQSB0ZXJtaW5hdGVkIG1lZGlhIHNlc3Npb24gY2Fubm90IGJlIHVzZWQgYW55bW9yZS4gIFRvIHBsYXkgbW9yZSBtZWRpYSwgdGhlCi0gICAgICogYXBwbGljYXRpb24gbXVzdCBzdGFydCBhIG5ldyBzZXNzaW9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVNTSU9OX1NUQVRFX0VOREVEID0gMTsKLQotICAgIC8qKgotICAgICAqIFNlc3Npb24gc3RhdGU6IEludmFsaWRhdGVkLgotICAgICAqIDxwPgotICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBzZXNzaW9uIHdhcyBpbnZhbGlkYXRlZCBpbnZvbHVudGFyaWx5IGR1ZSB0bwotICAgICAqIGFub3RoZXIgc2Vzc2lvbiB0YWtpbmcgY29udHJvbCBvZiB0aGUgcm91dGUuCi0gICAgICogPC9wPjxwPgotICAgICAqIEFuIGludmFsaWRhdGVkIG1lZGlhIHNlc3Npb24gY2Fubm90IGJlIHVzZWQgYW55bW9yZS4gIFRvIHBsYXkgbW9yZSBtZWRpYSwgdGhlCi0gICAgICogYXBwbGljYXRpb24gbXVzdCBzdGFydCBhIG5ldyBzZXNzaW9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVNTSU9OX1NUQVRFX0lOVkFMSURBVEVEID0gMjsKLQotICAgIE1lZGlhU2Vzc2lvblN0YXR1cyhCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIG1CdW5kbGUgPSBidW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGltZXN0YW1wIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RhdHVzIGluZm9ybWF0aW9uIGluCi0gICAgICogbWlsbGlzZWNvbmRzIHNpbmNlIGJvb3QgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWV9IHRpbWUgYmFzZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHN0YXR1cyB0aW1lc3RhbXAgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWUoKX0gdGltZSBiYXNlLgotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldFRpbWVzdGFtcCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0TG9uZyhLRVlfVElNRVNUQU1QKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzZXNzaW9uIHN0YXRlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2Vzc2lvbiBzdGF0ZS4gIE9uZSBvZiB7QGxpbmsgI1NFU1NJT05fU1RBVEVfQUNUSVZFfSwKLSAgICAgKiB7QGxpbmsgI1NFU1NJT05fU1RBVEVfRU5ERUR9LCBvciB7QGxpbmsgI1NFU1NJT05fU1RBVEVfSU5WQUxJREFURUR9LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0U2Vzc2lvblN0YXRlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX1NFU1NJT05fU1RBVEUsIFNFU1NJT05fU1RBVEVfSU5WQUxJREFURUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2Vzc2lvbidzIHF1ZXVlIGlzIHBhdXNlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc2Vzc2lvbidzIHF1ZXVlIGlzIHBhdXNlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1F1ZXVlUGF1c2VkKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRCb29sZWFuKEtFWV9RVUVVRV9QQVVTRUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBidW5kbGUgb2YgZXh0cmFzIGZvciB0aGlzIHN0YXR1cyBvYmplY3QuCi0gICAgICogVGhlIGV4dHJhcyB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIG1lZGlhIHJvdXRlciBidXQgdGhleSBtYXkgYmUgdXNlZAotICAgICAqIGJ5IGFwcGxpY2F0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIGdldEV4dHJhcygpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0QnVuZGxlKEtFWV9FWFRSQVMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiTWVkaWFTZXNzaW9uU3RhdHVzeyAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgidGltZXN0YW1wPSIpOwotICAgICAgICBUaW1lVXRpbHMuZm9ybWF0RHVyYXRpb24oU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkgLSBnZXRUaW1lc3RhbXAoKSwgcmVzdWx0KTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIG1zIGFnbyIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHNlc3Npb25TdGF0ZT0iKS5hcHBlbmQoc2Vzc2lvblN0YXRlVG9TdHJpbmcoZ2V0U2Vzc2lvblN0YXRlKCkpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBxdWV1ZVBhdXNlZD0iKS5hcHBlbmQoaXNRdWV1ZVBhdXNlZCgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBleHRyYXM9IikuYXBwZW5kKGdldEV4dHJhcygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIH0iKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzZXNzaW9uU3RhdGVUb1N0cmluZyhpbnQgc2Vzc2lvblN0YXRlKSB7Ci0gICAgICAgIHN3aXRjaCAoc2Vzc2lvblN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIFNFU1NJT05fU1RBVEVfQUNUSVZFOgotICAgICAgICAgICAgICAgIHJldHVybiAiYWN0aXZlIjsKLSAgICAgICAgICAgIGNhc2UgU0VTU0lPTl9TVEFURV9FTkRFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImVuZGVkIjsKLSAgICAgICAgICAgIGNhc2UgU0VTU0lPTl9TVEFURV9JTlZBTElEQVRFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWRhdGVkIjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhzZXNzaW9uU3RhdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgYnVuZGxlIGZvciBzZXJpYWxpemF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCByZXByZXNlbnRlZCBhcyBhIGJ1bmRsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIGFzQnVuZGxlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYSBidW5kbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgaW5zdGFuY2UsIG9yIG51bGwgaWYgdGhlIGJ1bmRsZSB3YXMgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhU2Vzc2lvblN0YXR1cyBmcm9tQnVuZGxlKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZSAhPSBudWxsID8gbmV3IE1lZGlhU2Vzc2lvblN0YXR1cyhidW5kbGUpIDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgTWVkaWFTZXNzaW9uU3RhdHVzIG1lZGlhIHNlc3Npb24gc3RhdHVzIG9iamVjdHN9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSBzZXNzaW9uIHN0YXR1cyBidWlsZGVyIHVzaW5nIHRoZSBjdXJyZW50IHRpbWUgYXMgdGhlCi0gICAgICAgICAqIHJlZmVyZW5jZSB0aW1lc3RhbXAuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uU3RhdGUgVGhlIHNlc3Npb24gc3RhdGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlcihpbnQgc2Vzc2lvblN0YXRlKSB7Ci0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgc2V0VGltZXN0YW1wKFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpKTsKLSAgICAgICAgICAgIHNldFNlc3Npb25TdGF0ZShzZXNzaW9uU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSBzZXNzaW9uIHN0YXR1cyBidWlsZGVyIHdob3NlIGluaXRpYWwgY29udGVudHMgYXJlCi0gICAgICAgICAqIGNvcGllZCBmcm9tIGFuIGV4aXN0aW5nIHN0YXR1cy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKE1lZGlhU2Vzc2lvblN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInN0YXR1cyBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKHN0YXR1cy5tQnVuZGxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSB0aW1lc3RhbXAgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdGF0dXMgaW5mb3JtYXRpb24gaW4KLSAgICAgICAgICogbWlsbGlzZWNvbmRzIHNpbmNlIGJvb3QgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWV9IHRpbWUgYmFzZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFRpbWVzdGFtcChsb25nIGVsYXBzZWRSZWFsdGltZVRpbWVzdGFtcCkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRMb25nKEtFWV9USU1FU1RBTVAsIGVsYXBzZWRSZWFsdGltZVRpbWVzdGFtcCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBzZXNzaW9uIHN0YXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0U2Vzc2lvblN0YXRlKGludCBzZXNzaW9uU3RhdGUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9TRVNTSU9OX1NUQVRFLCBzZXNzaW9uU3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB3aGV0aGVyIHRoZSBxdWV1ZSBpcyBwYXVzZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRRdWV1ZVBhdXNlZChib29sZWFuIHF1ZXVlUGF1c2VkKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEJvb2xlYW4oS0VZX1FVRVVFX1BBVVNFRCwgcXVldWVQYXVzZWQpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyBhIGJ1bmRsZSBvZiBleHRyYXMgZm9yIHRoaXMgc3RhdHVzIG9iamVjdC4KLSAgICAgICAgICogVGhlIGV4dHJhcyB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIG1lZGlhIHJvdXRlciBidXQgdGhleSBtYXkgYmUgdXNlZAotICAgICAgICAgKiBieSBhcHBsaWNhdGlvbnMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRFeHRyYXMoQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRCdW5kbGUoS0VZX0VYVFJBUywgZXh0cmFzKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEJ1aWxkcyB0aGUge0BsaW5rIE1lZGlhU2Vzc2lvblN0YXR1cyBtZWRpYSBzZXNzaW9uIHN0YXR1cyBvYmplY3R9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE1lZGlhU2Vzc2lvblN0YXR1cyBidWlsZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uU3RhdHVzKG1CdW5kbGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZTRlMjguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfREFUQV9ST1VURV9JRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX0RBVEFfUk9VVEVfTElCUkFSWV9HUk9VUDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX0RBVEFfVU5TRUxFQ1RfUkVBU09OOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9EQVRBX1ZPTFVNRTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19DUkVBVEVfUk9VVEVfQ09OVFJPTExFUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfTVNHX1JFR0lTVEVSOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1JFTEVBU0VfUk9VVEVfQ09OVFJPTExFUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19ST1VURV9DT05UUk9MX1JFUVVFU1Q7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX01TR19TRUxFQ1RfUk9VVEU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfU0VUX0RJU0NPVkVSWV9SRVFVRVNUOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1NFVF9ST1VURV9WT0xVTUU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX01TR19VTlJFR0lTVEVSOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1VOU0VMRUNUX1JPVVRFOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1VQREFURV9ST1VURV9WT0xVTUU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX1ZFUlNJT05fQ1VSUkVOVDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX0RBVEFfRVJST1I7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9GQUlMRUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9TVUNDRUVERUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0RFU0NSSVBUT1JfQ0hBTkdFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuU0VSVklDRV9NU0dfR0VORVJJQ19GQUlMVVJFOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5TRVJWSUNFX01TR19HRU5FUklDX1NVQ0NFU1M7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuU0VSVklDRV9NU0dfUkVHSVNURVJFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX1ZFUlNJT05fMTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5pc1ZhbGlkUmVtb3RlTWVzc2VuZ2VyOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5EZWFkT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyLkRlYXRoUmVjaXBpZW50OwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NlbmdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjazsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIE1haW50YWlucyBhIGNvbm5lY3Rpb24gdG8gYSBwYXJ0aWN1bGFyIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2UuCi0gKi8KLWZpbmFsIGNsYXNzIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIgZXh0ZW5kcyBNZWRpYVJvdXRlUHJvdmlkZXIKLSAgICAgICAgaW1wbGVtZW50cyBTZXJ2aWNlQ29ubmVjdGlvbiB7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkiOyAgLy8gbWF4LiAyMyBjaGFycwotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBDb21wb25lbnROYW1lIG1Db21wb25lbnROYW1lOwotICAgIGZpbmFsIFByaXZhdGVIYW5kbGVyIG1Qcml2YXRlSGFuZGxlcjsKLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxDb250cm9sbGVyPiBtQ29udHJvbGxlcnMgPSBuZXcgQXJyYXlMaXN0PENvbnRyb2xsZXI+KCk7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbVN0YXJ0ZWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Cb3VuZDsKLSAgICBwcml2YXRlIENvbm5lY3Rpb24gbUFjdGl2ZUNvbm5lY3Rpb247Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Db25uZWN0aW9uUmVhZHk7Ci0KLSAgICBwdWJsaWMgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcihDb250ZXh0IGNvbnRleHQsIENvbXBvbmVudE5hbWUgY29tcG9uZW50TmFtZSkgewotICAgICAgICBzdXBlcihjb250ZXh0LCBuZXcgUHJvdmlkZXJNZXRhZGF0YShjb21wb25lbnROYW1lKSk7Ci0KLSAgICAgICAgbUNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lOwotICAgICAgICBtUHJpdmF0ZUhhbmRsZXIgPSBuZXcgUHJpdmF0ZUhhbmRsZXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUm91dGVDb250cm9sbGVyIG9uQ3JlYXRlUm91dGVDb250cm9sbGVyKEBOb25OdWxsIFN0cmluZyByb3V0ZUlkKSB7Ci0gICAgICAgIGlmIChyb3V0ZUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlSWQgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3JlYXRlUm91dGVDb250cm9sbGVyKHJvdXRlSWQsIG51bGwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSb3V0ZUNvbnRyb2xsZXIgb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoCi0gICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgcm91dGVJZCwgQE5vbk51bGwgU3RyaW5nIHJvdXRlR3JvdXBJZCkgewotICAgICAgICBpZiAocm91dGVJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZUlkIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJvdXRlR3JvdXBJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZUdyb3VwSWQgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3JlYXRlUm91dGVDb250cm9sbGVyKHJvdXRlSWQsIHJvdXRlR3JvdXBJZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZChNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIGlmIChtQ29ubmVjdGlvblJlYWR5KSB7Ci0gICAgICAgICAgICBtQWN0aXZlQ29ubmVjdGlvbi5zZXREaXNjb3ZlcnlSZXF1ZXN0KHJlcXVlc3QpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZUJpbmRpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBuYW1lLCBJQmluZGVyIHNlcnZpY2UpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBDb25uZWN0ZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQm91bmQpIHsKLSAgICAgICAgICAgIGRpc2Nvbm5lY3QoKTsKLQotICAgICAgICAgICAgTWVzc2VuZ2VyIG1lc3NlbmdlciA9IChzZXJ2aWNlICE9IG51bGwgPyBuZXcgTWVzc2VuZ2VyKHNlcnZpY2UpIDogbnVsbCk7Ci0gICAgICAgICAgICBpZiAoaXNWYWxpZFJlbW90ZU1lc3NlbmdlcihtZXNzZW5nZXIpKSB7Ci0gICAgICAgICAgICAgICAgQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24obWVzc2VuZ2VyKTsKLSAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGlvbi5yZWdpc3RlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BY3RpdmVDb25uZWN0aW9uID0gY29ubmVjdGlvbjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IFJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCB0aGlzICsgIjogU2VydmljZSByZXR1cm5lZCBpbnZhbGlkIG1lc3NlbmdlciBiaW5kZXIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBTZXJ2aWNlIGRpc2Nvbm5lY3RlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGRpc2Nvbm5lY3QoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIlNlcnZpY2UgY29ubmVjdGlvbiAiICsgbUNvbXBvbmVudE5hbWUuZmxhdHRlblRvU2hvcnRTdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb21wb25lbnROYW1lKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICByZXR1cm4gbUNvbXBvbmVudE5hbWUuZ2V0UGFja2FnZU5hbWUoKS5lcXVhbHMocGFja2FnZU5hbWUpCi0gICAgICAgICAgICAgICAgJiYgbUNvbXBvbmVudE5hbWUuZ2V0Q2xhc3NOYW1lKCkuZXF1YWxzKGNsYXNzTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgICAgIGlmICghbVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IFN0YXJ0aW5nIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIHVwZGF0ZUJpbmRpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0gICAgICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogU3RvcHBpbmciKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHVwZGF0ZUJpbmRpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlYmluZElmRGlzY29ubmVjdGVkKCkgewotICAgICAgICBpZiAobUFjdGl2ZUNvbm5lY3Rpb24gPT0gbnVsbCAmJiBzaG91bGRCaW5kKCkpIHsKLSAgICAgICAgICAgIHVuYmluZCgpOwotICAgICAgICAgICAgYmluZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUJpbmRpbmcoKSB7Ci0gICAgICAgIGlmIChzaG91bGRCaW5kKCkpIHsKLSAgICAgICAgICAgIGJpbmQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHVuYmluZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZEJpbmQoKSB7Ci0gICAgICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICAgICAgLy8gQmluZCB3aGVuZXZlciB0aGVyZSBpcyBhIGRpc2NvdmVyeSByZXF1ZXN0LgotICAgICAgICAgICAgaWYgKGdldERpc2NvdmVyeVJlcXVlc3QoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEJpbmQgd2hlbmV2ZXIgdGhlIGFwcGxpY2F0aW9uIGhhcyBhbiBhY3RpdmUgcm91dGUgY29udHJvbGxlci4KLSAgICAgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCBvbmUgb2YgdGhpcyBwcm92aWRlcidzIHJvdXRlcyBpcyBzZWxlY3RlZC4KLSAgICAgICAgICAgIGlmICghbUNvbnRyb2xsZXJzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYmluZCgpIHsKLSAgICAgICAgaWYgKCFtQm91bmQpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IEJpbmRpbmciKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSW50ZW50IHNlcnZpY2UgPSBuZXcgSW50ZW50KE1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLlNFUlZJQ0VfSU5URVJGQUNFKTsKLSAgICAgICAgICAgIHNlcnZpY2Uuc2V0Q29tcG9uZW50KG1Db21wb25lbnROYW1lKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUJvdW5kID0gZ2V0Q29udGV4dCgpLmJpbmRTZXJ2aWNlKHNlcnZpY2UsIHRoaXMsIENvbnRleHQuQklORF9BVVRPX0NSRUFURSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFtQm91bmQgJiYgREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogQmluZCBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBCaW5kIGZhaWxlZCIsIGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdW5iaW5kKCkgewotICAgICAgICBpZiAobUJvdW5kKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBVbmJpbmRpbmciKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUJvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICBkaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICBnZXRDb250ZXh0KCkudW5iaW5kU2VydmljZSh0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgUm91dGVDb250cm9sbGVyIGNyZWF0ZVJvdXRlQ29udHJvbGxlcihTdHJpbmcgcm91dGVJZCwgU3RyaW5nIHJvdXRlR3JvdXBJZCkgewotICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yKCk7Ci0gICAgICAgIGlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIExpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+IHJvdXRlcyA9IGRlc2NyaXB0b3IuZ2V0Um91dGVzKCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSByb3V0ZXMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGUgPSByb3V0ZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChyb3V0ZS5nZXRJZCgpLmVxdWFscyhyb3V0ZUlkKSkgewotICAgICAgICAgICAgICAgICAgICBDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBuZXcgQ29udHJvbGxlcihyb3V0ZUlkLCByb3V0ZUdyb3VwSWQpOwotICAgICAgICAgICAgICAgICAgICBtQ29udHJvbGxlcnMuYWRkKGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3Rpb25SZWFkeSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5hdHRhY2hDb25uZWN0aW9uKG1BY3RpdmVDb25uZWN0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB1cGRhdGVCaW5kaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250cm9sbGVyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICB2b2lkIG9uQ29ubmVjdGlvblJlYWR5KENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotICAgICAgICBpZiAobUFjdGl2ZUNvbm5lY3Rpb24gPT0gY29ubmVjdGlvbikgewotICAgICAgICAgICAgbUNvbm5lY3Rpb25SZWFkeSA9IHRydWU7Ci0gICAgICAgICAgICBhdHRhY2hDb250cm9sbGVyc1RvQ29ubmVjdGlvbigpOwotCi0gICAgICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0ID0gZ2V0RGlzY292ZXJ5UmVxdWVzdCgpOwotICAgICAgICAgICAgaWYgKHJlcXVlc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1BY3RpdmVDb25uZWN0aW9uLnNldERpc2NvdmVyeVJlcXVlc3QocmVxdWVzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIG9uQ29ubmVjdGlvbkRpZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0gICAgICAgIGlmIChtQWN0aXZlQ29ubmVjdGlvbiA9PSBjb25uZWN0aW9uKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBTZXJ2aWNlIGNvbm5lY3Rpb24gZGllZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGlzY29ubmVjdCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBvbkNvbm5lY3Rpb25FcnJvcihDb25uZWN0aW9uIGNvbm5lY3Rpb24sIFN0cmluZyBlcnJvcikgewotICAgICAgICBpZiAobUFjdGl2ZUNvbm5lY3Rpb24gPT0gY29ubmVjdGlvbikgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogU2VydmljZSBjb25uZWN0aW9uIGVycm9yIC0gIiArIGVycm9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVuYmluZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBvbkNvbm5lY3Rpb25EZXNjcmlwdG9yQ2hhbmdlZChDb25uZWN0aW9uIGNvbm5lY3Rpb24sCi0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgaWYgKG1BY3RpdmVDb25uZWN0aW9uID09IGNvbm5lY3Rpb24pIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IERlc2NyaXB0b3IgY2hhbmdlZCwgZGVzY3JpcHRvcj0iICsgZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXREZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRpc2Nvbm5lY3QoKSB7Ci0gICAgICAgIGlmIChtQWN0aXZlQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXREZXNjcmlwdG9yKG51bGwpOwotICAgICAgICAgICAgbUNvbm5lY3Rpb25SZWFkeSA9IGZhbHNlOwotICAgICAgICAgICAgZGV0YWNoQ29udHJvbGxlcnNGcm9tQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgbUFjdGl2ZUNvbm5lY3Rpb24uZGlzcG9zZSgpOwotICAgICAgICAgICAgbUFjdGl2ZUNvbm5lY3Rpb24gPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBvbkNvbnRyb2xsZXJSZWxlYXNlZChDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgbUNvbnRyb2xsZXJzLnJlbW92ZShjb250cm9sbGVyKTsKLSAgICAgICAgY29udHJvbGxlci5kZXRhY2hDb25uZWN0aW9uKCk7Ci0gICAgICAgIHVwZGF0ZUJpbmRpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXR0YWNoQ29udHJvbGxlcnNUb0Nvbm5lY3Rpb24oKSB7Ci0gICAgICAgIGludCBjb3VudCA9IG1Db250cm9sbGVycy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgbUNvbnRyb2xsZXJzLmdldChpKS5hdHRhY2hDb25uZWN0aW9uKG1BY3RpdmVDb25uZWN0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZXRhY2hDb250cm9sbGVyc0Zyb21Db25uZWN0aW9uKCkgewotICAgICAgICBpbnQgY291bnQgPSBtQ29udHJvbGxlcnMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIG1Db250cm9sbGVycy5nZXQoaSkuZGV0YWNoQ29ubmVjdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDb250cm9sbGVyIGV4dGVuZHMgUm91dGVDb250cm9sbGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVJvdXRlSWQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Sb3V0ZUdyb3VwSWQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1TZWxlY3RlZDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVBlbmRpbmdTZXRWb2x1bWUgPSAtMTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVBlbmRpbmdVcGRhdGVWb2x1bWVEZWx0YTsKLQotICAgICAgICBwcml2YXRlIENvbm5lY3Rpb24gbUNvbm5lY3Rpb247Ci0gICAgICAgIHByaXZhdGUgaW50IG1Db250cm9sbGVySWQ7Ci0KLSAgICAgICAgcHVibGljIENvbnRyb2xsZXIoU3RyaW5nIHJvdXRlSWQsIFN0cmluZyByb3V0ZUdyb3VwSWQpIHsKLSAgICAgICAgICAgIG1Sb3V0ZUlkID0gcm91dGVJZDsKLSAgICAgICAgICAgIG1Sb3V0ZUdyb3VwSWQgPSByb3V0ZUdyb3VwSWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhdHRhY2hDb25uZWN0aW9uKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotICAgICAgICAgICAgbUNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOwotICAgICAgICAgICAgbUNvbnRyb2xsZXJJZCA9IGNvbm5lY3Rpb24uY3JlYXRlUm91dGVDb250cm9sbGVyKG1Sb3V0ZUlkLCBtUm91dGVHcm91cElkKTsKLSAgICAgICAgICAgIGlmIChtU2VsZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnNlbGVjdFJvdXRlKG1Db250cm9sbGVySWQpOwotICAgICAgICAgICAgICAgIGlmIChtUGVuZGluZ1NldFZvbHVtZSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uc2V0Vm9sdW1lKG1Db250cm9sbGVySWQsIG1QZW5kaW5nU2V0Vm9sdW1lKTsKLSAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdTZXRWb2x1bWUgPSAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1QZW5kaW5nVXBkYXRlVm9sdW1lRGVsdGEgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnVwZGF0ZVZvbHVtZShtQ29udHJvbGxlcklkLCBtUGVuZGluZ1VwZGF0ZVZvbHVtZURlbHRhKTsKLSAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdVcGRhdGVWb2x1bWVEZWx0YSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGV0YWNoQ29ubmVjdGlvbigpIHsKLSAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3Rpb24ucmVsZWFzZVJvdXRlQ29udHJvbGxlcihtQ29udHJvbGxlcklkKTsKLSAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xsZXJJZCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25SZWxlYXNlKCkgewotICAgICAgICAgICAgb25Db250cm9sbGVyUmVsZWFzZWQodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZWxlY3QoKSB7Ci0gICAgICAgICAgICBtU2VsZWN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbi5zZWxlY3RSb3V0ZShtQ29udHJvbGxlcklkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblVuc2VsZWN0KCkgewotICAgICAgICAgICAgb25VbnNlbGVjdChNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fVU5LTk9XTik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25VbnNlbGVjdChpbnQgcmVhc29uKSB7Ci0gICAgICAgICAgICBtU2VsZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3Rpb24udW5zZWxlY3RSb3V0ZShtQ29udHJvbGxlcklkLCByZWFzb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2V0Vm9sdW1lKGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3Rpb24uc2V0Vm9sdW1lKG1Db250cm9sbGVySWQsIHZvbHVtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nU2V0Vm9sdW1lID0gdm9sdW1lOwotICAgICAgICAgICAgICAgIG1QZW5kaW5nVXBkYXRlVm9sdW1lRGVsdGEgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVXBkYXRlVm9sdW1lKGludCBkZWx0YSkgewotICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbi51cGRhdGVWb2x1bWUobUNvbnRyb2xsZXJJZCwgZGVsdGEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ1VwZGF0ZVZvbHVtZURlbHRhICs9IGRlbHRhOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ29udHJvbFJlcXVlc3QoSW50ZW50IGludGVudCwgQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUNvbm5lY3Rpb24uc2VuZENvbnRyb2xSZXF1ZXN0KG1Db250cm9sbGVySWQsIGludGVudCwgY2FsbGJhY2spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDb25uZWN0aW9uIGltcGxlbWVudHMgRGVhdGhSZWNpcGllbnQgewotICAgICAgICBwcml2YXRlIGZpbmFsIE1lc3NlbmdlciBtU2VydmljZU1lc3NlbmdlcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZWNlaXZlSGFuZGxlciBtUmVjZWl2ZUhhbmRsZXI7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTWVzc2VuZ2VyIG1SZWNlaXZlTWVzc2VuZ2VyOwotCi0gICAgICAgIHByaXZhdGUgaW50IG1OZXh0UmVxdWVzdElkID0gMTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbU5leHRDb250cm9sbGVySWQgPSAxOwotICAgICAgICBwcml2YXRlIGludCBtU2VydmljZVZlcnNpb247IC8vIG5vbi16ZXJvIHdoZW4gcmVnaXN0cmF0aW9uIGNvbXBsZXRlCi0KLSAgICAgICAgcHJpdmF0ZSBpbnQgbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTcGFyc2VBcnJheTxDb250cm9sUmVxdWVzdENhbGxiYWNrPiBtUGVuZGluZ0NhbGxiYWNrcyA9Ci0gICAgICAgICAgICAgICAgbmV3IFNwYXJzZUFycmF5PENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2s+KCk7Ci0KLSAgICAgICAgcHVibGljIENvbm5lY3Rpb24oTWVzc2VuZ2VyIHNlcnZpY2VNZXNzZW5nZXIpIHsKLSAgICAgICAgICAgIG1TZXJ2aWNlTWVzc2VuZ2VyID0gc2VydmljZU1lc3NlbmdlcjsKLSAgICAgICAgICAgIG1SZWNlaXZlSGFuZGxlciA9IG5ldyBSZWNlaXZlSGFuZGxlcih0aGlzKTsKLSAgICAgICAgICAgIG1SZWNlaXZlTWVzc2VuZ2VyID0gbmV3IE1lc3NlbmdlcihtUmVjZWl2ZUhhbmRsZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gcmVnaXN0ZXIoKSB7Ci0gICAgICAgICAgICBtUGVuZGluZ1JlZ2lzdGVyUmVxdWVzdElkID0gbU5leHRSZXF1ZXN0SWQrKzsKLSAgICAgICAgICAgIGlmICghc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19SRUdJU1RFUiwKLSAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZCwKLSAgICAgICAgICAgICAgICAgICAgQ0xJRU5UX1ZFUlNJT05fQ1VSUkVOVCwgbnVsbCwgbnVsbCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbVNlcnZpY2VNZXNzZW5nZXIuZ2V0QmluZGVyKCkubGlua1RvRGVhdGgodGhpcywgMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBiaW5kZXJEaWVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19VTlJFR0lTVEVSLCAwLCAwLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIG1SZWNlaXZlSGFuZGxlci5kaXNwb3NlKCk7Ci0gICAgICAgICAgICBtU2VydmljZU1lc3Nlbmdlci5nZXRCaW5kZXIoKS51bmxpbmtUb0RlYXRoKHRoaXMsIDApOwotCi0gICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBmYWlsUGVuZGluZ0NhbGxiYWNrcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBmYWlsUGVuZGluZ0NhbGxiYWNrcygpIHsKLSAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1QZW5kaW5nQ2FsbGJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbVBlbmRpbmdDYWxsYmFja3MudmFsdWVBdChpKS5vbkVycm9yKG51bGwsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVBlbmRpbmdDYWxsYmFja3MuY2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uR2VuZXJpY0ZhaWx1cmUoaW50IHJlcXVlc3RJZCkgewotICAgICAgICAgICAgaWYgKHJlcXVlc3RJZCA9PSBtUGVuZGluZ1JlZ2lzdGVyUmVxdWVzdElkKSB7Ci0gICAgICAgICAgICAgICAgbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZCA9IDA7Ci0gICAgICAgICAgICAgICAgb25Db25uZWN0aW9uRXJyb3IodGhpcywgIlJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2sgPSBtUGVuZGluZ0NhbGxiYWNrcy5nZXQocmVxdWVzdElkKTsKLSAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVBlbmRpbmdDYWxsYmFja3MucmVtb3ZlKHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2sub25FcnJvcihudWxsLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25HZW5lcmljU3VjY2VzcyhpbnQgcmVxdWVzdElkKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uUmVnaXN0ZXJlZChpbnQgcmVxdWVzdElkLCBpbnQgc2VydmljZVZlcnNpb24sCi0gICAgICAgICAgICAgICAgQnVuZGxlIGRlc2NyaXB0b3JCdW5kbGUpIHsKLSAgICAgICAgICAgIGlmIChtU2VydmljZVZlcnNpb24gPT0gMAotICAgICAgICAgICAgICAgICAgICAmJiByZXF1ZXN0SWQgPT0gbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZAotICAgICAgICAgICAgICAgICAgICAmJiBzZXJ2aWNlVmVyc2lvbiA+PSBTRVJWSUNFX1ZFUlNJT05fMSkgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nUmVnaXN0ZXJSZXF1ZXN0SWQgPSAwOwotICAgICAgICAgICAgICAgIG1TZXJ2aWNlVmVyc2lvbiA9IHNlcnZpY2VWZXJzaW9uOwotICAgICAgICAgICAgICAgIG9uQ29ubmVjdGlvbkRlc2NyaXB0b3JDaGFuZ2VkKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLmZyb21CdW5kbGUoZGVzY3JpcHRvckJ1bmRsZSkpOwotICAgICAgICAgICAgICAgIG9uQ29ubmVjdGlvblJlYWR5KHRoaXMpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25EZXNjcmlwdG9yQ2hhbmdlZChCdW5kbGUgZGVzY3JpcHRvckJ1bmRsZSkgewotICAgICAgICAgICAgaWYgKG1TZXJ2aWNlVmVyc2lvbiAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgb25Db25uZWN0aW9uRGVzY3JpcHRvckNoYW5nZWQodGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuZnJvbUJ1bmRsZShkZXNjcmlwdG9yQnVuZGxlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNvbnRyb2xSZXF1ZXN0U3VjY2VlZGVkKGludCByZXF1ZXN0SWQsIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrID0gbVBlbmRpbmdDYWxsYmFja3MuZ2V0KHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nQ2FsbGJhY2tzLnJlbW92ZShyZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUmVzdWx0KGRhdGEpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25Db250cm9sUmVxdWVzdEZhaWxlZChpbnQgcmVxdWVzdElkLCBTdHJpbmcgZXJyb3IsIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrID0gbVBlbmRpbmdDYWxsYmFja3MuZ2V0KHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nQ2FsbGJhY2tzLnJlbW92ZShyZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uRXJyb3IoZXJyb3IsIGRhdGEpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGJpbmRlckRpZWQoKSB7Ci0gICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBvbkNvbm5lY3Rpb25EaWVkKENvbm5lY3Rpb24udGhpcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGNyZWF0ZVJvdXRlQ29udHJvbGxlcihTdHJpbmcgcm91dGVJZCwgU3RyaW5nIHJvdXRlR3JvdXBJZCkgewotICAgICAgICAgICAgaW50IGNvbnRyb2xsZXJJZCA9IG1OZXh0Q29udHJvbGxlcklkKys7Ci0gICAgICAgICAgICBCdW5kbGUgZGF0YSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGRhdGEucHV0U3RyaW5nKENMSUVOVF9EQVRBX1JPVVRFX0lELCByb3V0ZUlkKTsKLSAgICAgICAgICAgIGRhdGEucHV0U3RyaW5nKENMSUVOVF9EQVRBX1JPVVRFX0xJQlJBUllfR1JPVVAsIHJvdXRlR3JvdXBJZCk7Ci0gICAgICAgICAgICBzZW5kUmVxdWVzdChDTElFTlRfTVNHX0NSRUFURV9ST1VURV9DT05UUk9MTEVSLAotICAgICAgICAgICAgICAgICAgICBtTmV4dFJlcXVlc3RJZCsrLCBjb250cm9sbGVySWQsIG51bGwsIGRhdGEpOwotICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXJJZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VSb3V0ZUNvbnRyb2xsZXIoaW50IGNvbnRyb2xsZXJJZCkgewotICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19SRUxFQVNFX1JPVVRFX0NPTlRST0xMRVIsCi0gICAgICAgICAgICAgICAgICAgIG1OZXh0UmVxdWVzdElkKyssIGNvbnRyb2xsZXJJZCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3RSb3V0ZShpbnQgY29udHJvbGxlcklkKSB7Ci0gICAgICAgICAgICBzZW5kUmVxdWVzdChDTElFTlRfTVNHX1NFTEVDVF9ST1VURSwKLSAgICAgICAgICAgICAgICAgICAgbU5leHRSZXF1ZXN0SWQrKywgY29udHJvbGxlcklkLCBudWxsLCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHVuc2VsZWN0Um91dGUoaW50IGNvbnRyb2xsZXJJZCwgaW50IHJlYXNvbikgewotICAgICAgICAgICAgQnVuZGxlIGV4dHJhcyA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGV4dHJhcy5wdXRJbnQoQ0xJRU5UX0RBVEFfVU5TRUxFQ1RfUkVBU09OLCByZWFzb24pOwotICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19VTlNFTEVDVF9ST1VURSwKLSAgICAgICAgICAgICAgICAgICAgbU5leHRSZXF1ZXN0SWQrKywgY29udHJvbGxlcklkLCBudWxsLCBleHRyYXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Vm9sdW1lKGludCBjb250cm9sbGVySWQsIGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBkYXRhID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgZGF0YS5wdXRJbnQoQ0xJRU5UX0RBVEFfVk9MVU1FLCB2b2x1bWUpOwotICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19TRVRfUk9VVEVfVk9MVU1FLAotICAgICAgICAgICAgICAgICAgICBtTmV4dFJlcXVlc3RJZCsrLCBjb250cm9sbGVySWQsIG51bGwsIGRhdGEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlVm9sdW1lKGludCBjb250cm9sbGVySWQsIGludCBkZWx0YSkgewotICAgICAgICAgICAgQnVuZGxlIGRhdGEgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBkYXRhLnB1dEludChDTElFTlRfREFUQV9WT0xVTUUsIGRlbHRhKTsKLSAgICAgICAgICAgIHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfVVBEQVRFX1JPVVRFX1ZPTFVNRSwKLSAgICAgICAgICAgICAgICAgICAgbU5leHRSZXF1ZXN0SWQrKywgY29udHJvbGxlcklkLCBudWxsLCBkYXRhKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHNlbmRDb250cm9sUmVxdWVzdChpbnQgY29udHJvbGxlcklkLCBJbnRlbnQgaW50ZW50LAotICAgICAgICAgICAgICAgIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGludCByZXF1ZXN0SWQgPSBtTmV4dFJlcXVlc3RJZCsrOwotICAgICAgICAgICAgaWYgKHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfUk9VVEVfQ09OVFJPTF9SRVFVRVNULAotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsIGNvbnRyb2xsZXJJZCwgaW50ZW50LCBudWxsKSkgewotICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nQ2FsbGJhY2tzLnB1dChyZXF1ZXN0SWQsIGNhbGxiYWNrKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXREaXNjb3ZlcnlSZXF1ZXN0KE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgICAgIHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfU0VUX0RJU0NPVkVSWV9SRVFVRVNULAotICAgICAgICAgICAgICAgICAgICBtTmV4dFJlcXVlc3RJZCsrLCAwLCByZXF1ZXN0ICE9IG51bGwgPyByZXF1ZXN0LmFzQnVuZGxlKCkgOiBudWxsLCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBzZW5kUmVxdWVzdChpbnQgd2hhdCwgaW50IHJlcXVlc3RJZCwgaW50IGFyZywgT2JqZWN0IG9iaiwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gTWVzc2FnZS5vYnRhaW4oKTsKLSAgICAgICAgICAgIG1zZy53aGF0ID0gd2hhdDsKLSAgICAgICAgICAgIG1zZy5hcmcxID0gcmVxdWVzdElkOwotICAgICAgICAgICAgbXNnLmFyZzIgPSBhcmc7Ci0gICAgICAgICAgICBtc2cub2JqID0gb2JqOwotICAgICAgICAgICAgbXNnLnNldERhdGEoZGF0YSk7Ci0gICAgICAgICAgICBtc2cucmVwbHlUbyA9IG1SZWNlaXZlTWVzc2VuZ2VyOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtU2VydmljZU1lc3Nlbmdlci5zZW5kKG1zZyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGNhdGNoIChEZWFkT2JqZWN0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIHNlcnZpY2UgZGllZC4KLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIGlmICh3aGF0ICE9IENMSUVOVF9NU0dfVU5SRUdJU1RFUikgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3Qgc2VuZCBtZXNzYWdlIHRvIHNlcnZpY2UuIiwgZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFByaXZhdGVIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0gICAgICAgIFByaXZhdGVIYW5kbGVyKCkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlciB0aGF0IHJlY2VpdmVzIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlubmVyIGNsYXNzIGlzIHN0YXRpYyBhbmQgb25seSByZXRhaW5zIGEgd2VhayByZWZlcmVuY2UgdG8gdGhlIGNvbm5lY3Rpb24KLSAgICAgKiB0byBwcmV2ZW50IHRoZSBjbGllbnQgZnJvbSBiZWluZyBsZWFrZWQgaW4gY2FzZSB0aGUgc2VydmljZSBpcyBob2xkaW5nIGFuCi0gICAgICogYWN0aXZlIHJlZmVyZW5jZSB0byB0aGUgY2xpZW50J3MgbWVzc2VuZ2VyLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGhhbmRsZXIgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIGhhbmRsZSBhbnkgbWVzc2FnZXMgb3RoZXIgdGhhbiB0aG9zZQotICAgICAqIHRoYXQgY29tZSBmcm9tIHRoZSBzZXJ2aWNlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZWNlaXZlSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8Q29ubmVjdGlvbj4gbUNvbm5lY3Rpb25SZWY7Ci0KLSAgICAgICAgcHVibGljIFJlY2VpdmVIYW5kbGVyKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotICAgICAgICAgICAgbUNvbm5lY3Rpb25SZWYgPSBuZXcgV2Vha1JlZmVyZW5jZTxDb25uZWN0aW9uPihjb25uZWN0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgICAgICBtQ29ubmVjdGlvblJlZi5jbGVhcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IG1Db25uZWN0aW9uUmVmLmdldCgpOwotICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aGF0ID0gbXNnLndoYXQ7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJlcXVlc3RJZCA9IG1zZy5hcmcxOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBhcmcgPSBtc2cuYXJnMjsKLSAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3Qgb2JqID0gbXNnLm9iajsKLSAgICAgICAgICAgICAgICBmaW5hbCBCdW5kbGUgZGF0YSA9IG1zZy5wZWVrRGF0YSgpOwotICAgICAgICAgICAgICAgIGlmICghcHJvY2Vzc01lc3NhZ2UoY29ubmVjdGlvbiwgd2hhdCwgcmVxdWVzdElkLCBhcmcsIG9iaiwgZGF0YSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJVbmhhbmRsZWQgbWVzc2FnZSBmcm9tIHNlcnZlcjogIiArIG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoQ29ubmVjdGlvbiBjb25uZWN0aW9uLAotICAgICAgICAgICAgICAgIGludCB3aGF0LCBpbnQgcmVxdWVzdElkLCBpbnQgYXJnLCBPYmplY3Qgb2JqLCBCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVJWSUNFX01TR19HRU5FUklDX0ZBSUxVUkU6Ci0gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ub25HZW5lcmljRmFpbHVyZShyZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIGNhc2UgU0VSVklDRV9NU0dfR0VORVJJQ19TVUNDRVNTOgotICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLm9uR2VuZXJpY1N1Y2Nlc3MocmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNFUlZJQ0VfTVNHX1JFR0lTVEVSRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogaW5zdGFuY2VvZiBCdW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLm9uUmVnaXN0ZXJlZChyZXF1ZXN0SWQsIGFyZywgKEJ1bmRsZSlvYmopOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTRVJWSUNFX01TR19ERVNDUklQVE9SX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogaW5zdGFuY2VvZiBCdW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLm9uRGVzY3JpcHRvckNoYW5nZWQoKEJ1bmRsZSlvYmopOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTRVJWSUNFX01TR19DT05UUk9MX1JFUVVFU1RfU1VDQ0VFREVEOgotICAgICAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwgfHwgb2JqIGluc3RhbmNlb2YgQnVuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5vbkNvbnRyb2xSZXF1ZXN0U3VjY2VlZGVkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsIChCdW5kbGUpb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX0ZBSUxFRDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsIHx8IG9iaiBpbnN0YW5jZW9mIEJ1bmRsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVycm9yID0gKGRhdGEgPT0gbnVsbCA/IG51bGwgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmdldFN0cmluZyhTRVJWSUNFX0RBVEFfRVJST1IpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLm9uQ29udHJvbFJlcXVlc3RGYWlsZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCwgZXJyb3IsIChCdW5kbGUpb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXJXYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMWY2NDcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXJXYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5TZXJ2aWNlSW5mbzsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotLyoqCi0gKiBXYXRjaGVzIGZvciBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlcyB0byBiZSBpbnN0YWxsZWQuCi0gKiBBZGRzIGEgcHJvdmlkZXIgdG8gdGhlIG1lZGlhIHJvdXRlciBmb3IgZWFjaCByZWdpc3RlcmVkIHNlcnZpY2UuCi0gKgotICogQHNlZSBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyCi0gKi8KLWZpbmFsIGNsYXNzIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXJXYXRjaGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDYWxsYmFjayBtQ2FsbGJhY2s7Ci0gICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyOwotICAgIHByaXZhdGUgZmluYWwgUGFja2FnZU1hbmFnZXIgbVBhY2thZ2VNYW5hZ2VyOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8UmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcj4gbVByb3ZpZGVycyA9Ci0gICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXI+KCk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1SdW5uaW5nOwotCi0gICAgcHVibGljIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXJXYXRjaGVyKENvbnRleHQgY29udGV4dCwgQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOwotICAgICAgICBtUGFja2FnZU1hbmFnZXIgPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgICAgIGlmICghbVJ1bm5pbmcpIHsKLSAgICAgICAgICAgIG1SdW5uaW5nID0gdHJ1ZTsKLQotICAgICAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKLSAgICAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9QQUNLQUdFX0FEREVEKTsKLSAgICAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9QQUNLQUdFX1JFTU9WRUQpOwotICAgICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfQ0hBTkdFRCk7Ci0gICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fUEFDS0FHRV9SRVBMQUNFRCk7Ci0gICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fUEFDS0FHRV9SRVNUQVJURUQpOwotICAgICAgICAgICAgZmlsdGVyLmFkZERhdGFTY2hlbWUoInBhY2thZ2UiKTsKLSAgICAgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobVNjYW5QYWNrYWdlc1JlY2VpdmVyLCBmaWx0ZXIsIG51bGwsIG1IYW5kbGVyKTsKLQotICAgICAgICAgICAgLy8gU2NhbiBwYWNrYWdlcy4KLSAgICAgICAgICAgIC8vIEFsc28gaGFzIHRoZSBzaWRlLWVmZmVjdCBvZiByZXN0YXJ0aW5nIHByb3ZpZGVycyBpZiBuZWVkZWQuCi0gICAgICAgICAgICBtSGFuZGxlci5wb3N0KG1TY2FuUGFja2FnZXNSdW5uYWJsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdG9wKCkgewotICAgICAgICBpZiAobVJ1bm5pbmcpIHsKLSAgICAgICAgICAgIG1SdW5uaW5nID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIG1Db250ZXh0LnVucmVnaXN0ZXJSZWNlaXZlcihtU2NhblBhY2thZ2VzUmVjZWl2ZXIpOwotICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1TY2FuUGFja2FnZXNSdW5uYWJsZSk7Ci0KLSAgICAgICAgICAgIC8vIFN0b3AgYWxsIHByb3ZpZGVycy4KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUHJvdmlkZXJzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgbVByb3ZpZGVycy5nZXQoaSkuc3RvcCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBzY2FuUGFja2FnZXMoKSB7Ci0gICAgICAgIGlmICghbVJ1bm5pbmcpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFkZCBwcm92aWRlcnMgZm9yIGFsbCBuZXcgc2VydmljZXMuCi0gICAgICAgIC8vIFJlb3JkZXIgdGhlIGxpc3Qgc28gdGhhdCBwcm92aWRlcnMgbGVmdCBhdCB0aGUgZW5kIHdpbGwgYmUgdGhlIG9uZXMgdG8gcmVtb3ZlLgotICAgICAgICBpbnQgdGFyZ2V0SW5kZXggPSAwOwotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlLlNFUlZJQ0VfSU5URVJGQUNFKTsKLSAgICAgICAgZm9yIChSZXNvbHZlSW5mbyByZXNvbHZlSW5mbyA6IG1QYWNrYWdlTWFuYWdlci5xdWVyeUludGVudFNlcnZpY2VzKGludGVudCwgMCkpIHsKLSAgICAgICAgICAgIFNlcnZpY2VJbmZvIHNlcnZpY2VJbmZvID0gcmVzb2x2ZUluZm8uc2VydmljZUluZm87Ci0gICAgICAgICAgICBpZiAoc2VydmljZUluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBzb3VyY2VJbmRleCA9IGZpbmRQcm92aWRlcihzZXJ2aWNlSW5mby5wYWNrYWdlTmFtZSwgc2VydmljZUluZm8ubmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZUluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgICAgICBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcihtQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29tcG9uZW50TmFtZShzZXJ2aWNlSW5mby5wYWNrYWdlTmFtZSwgc2VydmljZUluZm8ubmFtZSkpOwotICAgICAgICAgICAgICAgICAgICBwcm92aWRlci5zdGFydCgpOwotICAgICAgICAgICAgICAgICAgICBtUHJvdmlkZXJzLmFkZCh0YXJnZXRJbmRleCsrLCBwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5hZGRQcm92aWRlcihwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VJbmRleCA+PSB0YXJnZXRJbmRleCkgewotICAgICAgICAgICAgICAgICAgICBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyID0gbVByb3ZpZGVycy5nZXQoc291cmNlSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBwcm92aWRlci5zdGFydCgpOyAvLyByZXN0YXJ0IHRoZSBwcm92aWRlciBpZiBuZWVkZWQKLSAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIucmViaW5kSWZEaXNjb25uZWN0ZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc3dhcChtUHJvdmlkZXJzLCBzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgrKyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVtb3ZlIHByb3ZpZGVycyBmb3IgbWlzc2luZyBzZXJ2aWNlcy4KLSAgICAgICAgaWYgKHRhcmdldEluZGV4IDwgbVByb3ZpZGVycy5zaXplKCkpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUHJvdmlkZXJzLnNpemUoKSAtIDE7IGkgPj0gdGFyZ2V0SW5kZXg7IGktLSkgewotICAgICAgICAgICAgICAgIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIgPSBtUHJvdmlkZXJzLmdldChpKTsKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2sucmVtb3ZlUHJvdmlkZXIocHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIG1Qcm92aWRlcnMucmVtb3ZlKHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICBwcm92aWRlci5zdG9wKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBmaW5kUHJvdmlkZXIoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIGludCBjb3VudCA9IG1Qcm92aWRlcnMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIgPSBtUHJvdmlkZXJzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChwcm92aWRlci5oYXNDb21wb25lbnROYW1lKHBhY2thZ2VOYW1lLCBjbGFzc05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgQnJvYWRjYXN0UmVjZWl2ZXIgbVNjYW5QYWNrYWdlc1JlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgc2NhblBhY2thZ2VzKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBSdW5uYWJsZSBtU2NhblBhY2thZ2VzUnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBzY2FuUGFja2FnZXMoKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwdWJsaWMgaW50ZXJmYWNlIENhbGxiYWNrIHsKLSAgICAgICAgdm9pZCBhZGRQcm92aWRlcihNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIpOwotICAgICAgICB2b2lkIHJlbW92ZVByb3ZpZGVyKE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNjQ0OWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5SZXF1aXJlc0FwaTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLQotLyoqCi0gKiBQcm92aWRlcyBhY2Nlc3MgdG8gZmVhdHVyZXMgb2YgdGhlIHJlbW90ZSBjb250cm9sIGNsaWVudC4KLSAqCi0gKiBIaWRkZW4gZm9yIG5vdyBidXQgd2UgbWlnaHQgd2FudCB0byBtYWtlIHRoaXMgYXZhaWxhYmxlIHRvIGFwcGxpY2F0aW9ucwotICogaW4gdGhlIGZ1dHVyZS4KLSAqLwotYWJzdHJhY3QgY2xhc3MgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdCB7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBtUmNjOwotICAgIHByb3RlY3RlZCBWb2x1bWVDYWxsYmFjayBtVm9sdW1lQ2FsbGJhY2s7Ci0KLSAgICBwcm90ZWN0ZWQgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdChDb250ZXh0IGNvbnRleHQsIE9iamVjdCByY2MpIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBtUmNjID0gcmNjOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdCBvYnRhaW4oQ29udGV4dCBjb250ZXh0LCBPYmplY3QgcmNjKSB7Ci0gICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMTYpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSmVsbHliZWFuSW1wbChjb250ZXh0LCByY2MpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTGVnYWN5SW1wbChjb250ZXh0LCByY2MpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVtb3RlQ29udHJvbENsaWVudCgpIHsKLSAgICAgICAgcmV0dXJuIG1SY2M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCBwbGF5YmFjayBpbmZvcm1hdGlvbi4KLSAgICAgKiBNdXN0IGJlIGNhbGxlZCBhdCBsZWFzdCBvbmNlIHRvIGF0dGFjaCB0byB0aGUgcmVtb3RlIGNvbnRyb2wgY2xpZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGluZm8gVGhlIHBsYXliYWNrIGluZm9ybWF0aW9uLiAgTXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5YmFja0luZm8oUGxheWJhY2tJbmZvIGluZm8pIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgY2FsbGJhY2sgdG8gcmVjZWl2ZSB2b2x1bWUgY2hhbmdlIHJlcXVlc3RzIGZyb20gdGhlIHJlbW90ZSBjb250cm9sIGNsaWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgdm9sdW1lIGNhbGxiYWNrIHRvIHVzZSBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Vm9sdW1lQ2FsbGJhY2soVm9sdW1lQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgbVZvbHVtZUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwbGF5YmFjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBsYXliYWNrSW5mbyB7Ci0gICAgICAgIHB1YmxpYyBpbnQgdm9sdW1lOwotICAgICAgICBwdWJsaWMgaW50IHZvbHVtZU1heDsKLSAgICAgICAgcHVibGljIGludCB2b2x1bWVIYW5kbGluZyA9IE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19WT0xVTUVfRklYRUQ7Ci0gICAgICAgIHB1YmxpYyBpbnQgcGxheWJhY2tTdHJlYW0gPSBBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDOwotICAgICAgICBwdWJsaWMgaW50IHBsYXliYWNrVHlwZSA9IE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19UWVBFX1JFTU9URTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB2b2x1bWUgdXBkYXRlcyBhcmUgcmVxdWVzdGVkIGJ5IHRoZSByZW1vdGUgY29udHJvbCBjbGllbnQuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBWb2x1bWVDYWxsYmFjayB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdm9sdW1lIHNob3VsZCBiZSBpbmNyZWFzZWQgb3IgZGVjcmVhc2VkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIEFuIGludGVnZXIgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB2b2x1bWUgaXMgdG8gYmUgaW5jcmVhc2VkCi0gICAgICAgICAqIChwb3NpdGl2ZSB2YWx1ZSkgb3IgZGVjcmVhc2VkIChuZWdhdGl2ZSB2YWx1ZSkuCi0gICAgICAgICAqIEZvciBidW5kbGVkIGNoYW5nZXMsIHRoZSBhYnNvbHV0ZSB2YWx1ZSBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBjaGFuZ2VzCi0gICAgICAgICAqIGluIHRoZSBzYW1lIGRpcmVjdGlvbiwgZS5nLiArMyBjb3JyZXNwb25kcyB0byB0aHJlZSAidm9sdW1lIHVwIiBjaGFuZ2VzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVVcGRhdGVSZXF1ZXN0KGludCBkaXJlY3Rpb24pOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdm9sdW1lIGZvciB0aGUgcm91dGUgc2hvdWxkIGJlIHNldCB0byB0aGUgZ2l2ZW4gdmFsdWUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB2b2x1bWUgQW4gaW50ZWdlciBpbmRpY2F0aW5nIHRoZSBuZXcgdm9sdW1lIHZhbHVlIHRoYXQgc2hvdWxkIGJlIHVzZWQsCi0gICAgICAgICAqIGFsd2F5cyBiZXR3ZWVuIDAgYW5kIHRoZSB2YWx1ZSBzZXQgYnkge0BsaW5rIFBsYXliYWNrSW5mbyN2b2x1bWVNYXh9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVTZXRSZXF1ZXN0KGludCB2b2x1bWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExlZ2FjeSBpbXBsZW1lbnRhdGlvbiBmb3IgcGxhdGZvcm0gdmVyc2lvbnMgcHJpb3IgdG8gSmVsbHliZWFuLgotICAgICAqIERvZXMgbm90aGluZy4KLSAgICAgKi8KLSAgICBzdGF0aWMgY2xhc3MgTGVnYWN5SW1wbCBleHRlbmRzIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQgewotICAgICAgICBwdWJsaWMgTGVnYWN5SW1wbChDb250ZXh0IGNvbnRleHQsIE9iamVjdCByY2MpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHJjYyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBmb3IgSmVsbHliZWFuLgotICAgICAqCi0gICAgICogVGhlIGJhc2ljIGlkZWEgb2YgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB0byBhdHRhY2ggdGhlIFJDQyB0byBhIFVzZXJSb3V0ZUluZm8KLSAgICAgKiBpbiBvcmRlciB0byBob29rIHVwIHN0cmVhbSBtZXRhZGF0YSBhbmQgdm9sdW1lIGNhbGxiYWNrcyBiZWNhdXNlIHRoZXJlIGlzIG5vCi0gICAgICogb3RoZXIgQVBJIGF2YWlsYWJsZSB0byBkbyBzbyBpbiB0aGlzIHBsYXRmb3JtIHZlcnNpb24uICBUaGUgVXNlclJvdXRlSW5mbyBpdHNlbGYKLSAgICAgKiBpcyBub3QgYXR0YWNoZWQgdG8gdGhlIE1lZGlhUm91dGVyIHNvIGl0IGlzIHRyYW5zcGFyZW50IHRvIHRoZSB1c2VyLgotICAgICAqLwotICAgIC8vIEBAUmVxdWlyZXNBcGkoMTYpCi0gICAgc3RhdGljIGNsYXNzIEplbGx5YmVhbkltcGwgZXh0ZW5kcyBSZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0IHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbVJvdXRlck9iajsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbVVzZXJSb3V0ZUNhdGVnb3J5T2JqOwotICAgICAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtVXNlclJvdXRlT2JqOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVJlZ2lzdGVyZWQ7Ci0KLSAgICAgICAgcHVibGljIEplbGx5YmVhbkltcGwoQ29udGV4dCBjb250ZXh0LCBPYmplY3QgcmNjKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCByY2MpOwotCi0gICAgICAgICAgICBtUm91dGVyT2JqID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uZ2V0TWVkaWFSb3V0ZXIoY29udGV4dCk7Ci0gICAgICAgICAgICBtVXNlclJvdXRlQ2F0ZWdvcnlPYmogPSBNZWRpYVJvdXRlckplbGx5YmVhbi5jcmVhdGVSb3V0ZUNhdGVnb3J5KAotICAgICAgICAgICAgICAgICAgICBtUm91dGVyT2JqLCAiIiwgZmFsc2UpOwotICAgICAgICAgICAgbVVzZXJSb3V0ZU9iaiA9IE1lZGlhUm91dGVySmVsbHliZWFuLmNyZWF0ZVVzZXJSb3V0ZSgKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlck9iaiwgbVVzZXJSb3V0ZUNhdGVnb3J5T2JqKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQbGF5YmFja0luZm8oUGxheWJhY2tJbmZvIGluZm8pIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0Vm9sdW1lKAotICAgICAgICAgICAgICAgICAgICBtVXNlclJvdXRlT2JqLCBpbmZvLnZvbHVtZSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZU1heCgKLSAgICAgICAgICAgICAgICAgICAgbVVzZXJSb3V0ZU9iaiwgaW5mby52b2x1bWVNYXgpOwotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVIYW5kbGluZygKLSAgICAgICAgICAgICAgICAgICAgbVVzZXJSb3V0ZU9iaiwgaW5mby52b2x1bWVIYW5kbGluZyk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFBsYXliYWNrU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICBtVXNlclJvdXRlT2JqLCBpbmZvLnBsYXliYWNrU3RyZWFtKTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0UGxheWJhY2tUeXBlKAotICAgICAgICAgICAgICAgICAgICBtVXNlclJvdXRlT2JqLCBpbmZvLnBsYXliYWNrVHlwZSk7Ci0KLSAgICAgICAgICAgIGlmICghbVJlZ2lzdGVyZWQpIHsKLSAgICAgICAgICAgICAgICBtUmVnaXN0ZXJlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVDYWxsYmFjayhtVXNlclJvdXRlT2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uY3JlYXRlVm9sdW1lQ2FsbGJhY2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBWb2x1bWVDYWxsYmFja1dyYXBwZXIodGhpcykpKTsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFJlbW90ZUNvbnRyb2xDbGllbnQobVVzZXJSb3V0ZU9iaiwgbVJjYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBWb2x1bWVDYWxsYmFja1dyYXBwZXIKLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIE1lZGlhUm91dGVySmVsbHliZWFuLlZvbHVtZUNhbGxiYWNrIHsKLSAgICAgICAgICAgIC8vIFVuZm9ydHVuYXRlbHksIHRoZSBmcmFtZXdvcmsgbmV2ZXIgdW5yZWdpc3RlcnMgaXRzIHZvbHVtZSBvYnNlcnZlciBmcm9tCi0gICAgICAgICAgICAvLyB0aGUgYXVkaW8gc2VydmljZSBzbyB0aGUgVXNlclJvdXRlSW5mbyBvYmplY3QgbWF5IGxlYWsgYWxvbmcgd2l0aAotICAgICAgICAgICAgLy8gYW55IGNhbGxiYWNrcyB0aGF0IHdlIGF0dGFjaCB0byBpdC4gIFVzZSBhIHdlYWsgcmVmZXJlbmNlIHRvIHByZXZlbnQKLSAgICAgICAgICAgIC8vIHRoZSB2b2x1bWUgY2FsbGJhY2sgZnJvbSBob2xkaW5nIHN0cm9uZyByZWZlcmVuY2VzIHRvIGFueXRoaW5nIGltcG9ydGFudC4KLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxKZWxseWJlYW5JbXBsPiBtSW1wbFdlYWs7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBWb2x1bWVDYWxsYmFja1dyYXBwZXIoSmVsbHliZWFuSW1wbCBpbXBsKSB7Ci0gICAgICAgICAgICAgICAgbUltcGxXZWFrID0gbmV3IFdlYWtSZWZlcmVuY2U8SmVsbHliZWFuSW1wbD4oaW1wbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVVcGRhdGVSZXF1ZXN0KE9iamVjdCByb3V0ZU9iaiwgaW50IGRpcmVjdGlvbikgewotICAgICAgICAgICAgICAgIEplbGx5YmVhbkltcGwgaW1wbCA9IG1JbXBsV2Vhay5nZXQoKTsKLSAgICAgICAgICAgICAgICBpZiAoaW1wbCAhPSBudWxsICYmIGltcGwubVZvbHVtZUNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaW1wbC5tVm9sdW1lQ2FsbGJhY2sub25Wb2x1bWVVcGRhdGVSZXF1ZXN0KGRpcmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lU2V0UmVxdWVzdChPYmplY3Qgcm91dGVPYmosIGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgICAgICBKZWxseWJlYW5JbXBsIGltcGwgPSBtSW1wbFdlYWsuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGltcGwgIT0gbnVsbCAmJiBpbXBsLm1Wb2x1bWVDYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGltcGwubVZvbHVtZUNhbGxiYWNrLm9uVm9sdW1lU2V0UmVxdWVzdCh2b2x1bWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZW1vdGVQbGF5YmFja0NsaWVudC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlbW90ZVBsYXliYWNrQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZTE0OTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlbW90ZVBsYXliYWNrQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC51dGlsLk9iamVjdHNDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyBmb3IgcGxheWluZyBtZWRpYSBvbiByZW1vdGUgcm91dGVzIHVzaW5nIHRoZSByZW1vdGUgcGxheWJhY2sgcHJvdG9jb2wKLSAqIGRlZmluZWQgYnkge0BsaW5rIE1lZGlhQ29udHJvbEludGVudH0uCi0gKiA8cD4KLSAqIFRoZSBjbGllbnQgbWFpbnRhaW5zIHNlc3Npb24gc3RhdGUgYW5kIG9mZmVycyBhIHNpbXBsaWZpZWQgaW50ZXJmYWNlIGZvciBpc3N1aW5nCi0gKiByZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBpbnRlbnRzIHRvIGEgc2luZ2xlIHJvdXRlLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgUmVtb3RlUGxheWJhY2tDbGllbnQgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlJlbW90ZVBsYXliYWNrQ2xpZW50IjsKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBtUm91dGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBY3Rpb25SZWNlaXZlciBtQWN0aW9uUmVjZWl2ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQZW5kaW5nSW50ZW50IG1JdGVtU3RhdHVzUGVuZGluZ0ludGVudDsKLSAgICBwcml2YXRlIGZpbmFsIFBlbmRpbmdJbnRlbnQgbVNlc3Npb25TdGF0dXNQZW5kaW5nSW50ZW50OwotICAgIHByaXZhdGUgZmluYWwgUGVuZGluZ0ludGVudCBtTWVzc2FnZVBlbmRpbmdJbnRlbnQ7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjazsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVJvdXRlU3VwcG9ydHNRdWV1aW5nOwotICAgIHByaXZhdGUgYm9vbGVhbiBtUm91dGVTdXBwb3J0c1Nlc3Npb25NYW5hZ2VtZW50OwotICAgIHByaXZhdGUgYm9vbGVhbiBtUm91dGVTdXBwb3J0c01lc3NhZ2luZzsKLQotICAgIFN0cmluZyBtU2Vzc2lvbklkOwotICAgIFN0YXR1c0NhbGxiYWNrIG1TdGF0dXNDYWxsYmFjazsKLSAgICBPbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyIG1Pbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHJlbW90ZSBwbGF5YmFjayBjbGllbnQgZm9yIGEgcm91dGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcm91dGUgVGhlIG1lZGlhIHJvdXRlLgotICAgICAqLwotICAgIHB1YmxpYyBSZW1vdGVQbGF5YmFja0NsaWVudChDb250ZXh0IGNvbnRleHQsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZXh0IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocm91dGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGUgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBtUm91dGUgPSByb3V0ZTsKLQotICAgICAgICBJbnRlbnRGaWx0ZXIgYWN0aW9uRmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOwotICAgICAgICBhY3Rpb25GaWx0ZXIuYWRkQWN0aW9uKEFjdGlvblJlY2VpdmVyLkFDVElPTl9JVEVNX1NUQVRVU19DSEFOR0VEKTsKLSAgICAgICAgYWN0aW9uRmlsdGVyLmFkZEFjdGlvbihBY3Rpb25SZWNlaXZlci5BQ1RJT05fU0VTU0lPTl9TVEFUVVNfQ0hBTkdFRCk7Ci0gICAgICAgIGFjdGlvbkZpbHRlci5hZGRBY3Rpb24oQWN0aW9uUmVjZWl2ZXIuQUNUSU9OX01FU1NBR0VfUkVDRUlWRUQpOwotICAgICAgICBtQWN0aW9uUmVjZWl2ZXIgPSBuZXcgQWN0aW9uUmVjZWl2ZXIoKTsKLSAgICAgICAgY29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1BY3Rpb25SZWNlaXZlciwgYWN0aW9uRmlsdGVyKTsKLQotICAgICAgICBJbnRlbnQgaXRlbVN0YXR1c0ludGVudCA9IG5ldyBJbnRlbnQoQWN0aW9uUmVjZWl2ZXIuQUNUSU9OX0lURU1fU1RBVFVTX0NIQU5HRUQpOwotICAgICAgICBpdGVtU3RhdHVzSW50ZW50LnNldFBhY2thZ2UoY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKLSAgICAgICAgbUl0ZW1TdGF0dXNQZW5kaW5nSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QoCi0gICAgICAgICAgICAgICAgY29udGV4dCwgMCwgaXRlbVN0YXR1c0ludGVudCwgMCk7Ci0KLSAgICAgICAgSW50ZW50IHNlc3Npb25TdGF0dXNJbnRlbnQgPSBuZXcgSW50ZW50KEFjdGlvblJlY2VpdmVyLkFDVElPTl9TRVNTSU9OX1NUQVRVU19DSEFOR0VEKTsKLSAgICAgICAgc2Vzc2lvblN0YXR1c0ludGVudC5zZXRQYWNrYWdlKGNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7Ci0gICAgICAgIG1TZXNzaW9uU3RhdHVzUGVuZGluZ0ludGVudCA9IFBlbmRpbmdJbnRlbnQuZ2V0QnJvYWRjYXN0KAotICAgICAgICAgICAgICAgIGNvbnRleHQsIDAsIHNlc3Npb25TdGF0dXNJbnRlbnQsIDApOwotCi0gICAgICAgIEludGVudCBtZXNzYWdlSW50ZW50ID0gbmV3IEludGVudChBY3Rpb25SZWNlaXZlci5BQ1RJT05fTUVTU0FHRV9SRUNFSVZFRCk7Ci0gICAgICAgIG1lc3NhZ2VJbnRlbnQuc2V0UGFja2FnZShjb250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICBtTWVzc2FnZVBlbmRpbmdJbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldEJyb2FkY2FzdCgKLSAgICAgICAgICAgICAgICBjb250ZXh0LCAwLCBtZXNzYWdlSW50ZW50LCAwKTsKLSAgICAgICAgZGV0ZWN0RmVhdHVyZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWxlYXNlcyByZXNvdXJjZXMgb3duZWQgYnkgdGhlIGNsaWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIobUFjdGlvblJlY2VpdmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHJlbW90ZSBwbGF5YmFjay4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCByZW1vdGUgcGxheWJhY2ssIHRoZW4gbm9uZSBvZiB0aGUgZnVuY3Rpb25hbGl0eQotICAgICAqIG9mZmVyZWQgYnkgdGhlIGNsaWVudCB3aWxsIGJlIGF2YWlsYWJsZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBhbGwgb2YgdGhlIGZvbGxvd2luZwotICAgICAqIGFjdGlvbnM6IHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgcGxheX0sCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU0VFSyBzZWVrfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9HRVRfU1RBVFVTIGdldCBzdGF0dXN9LAotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BBVVNFIHBhdXNlfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRVNVTUUgcmVzdW1lfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVE9QIHN0b3B9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiByZW1vdGUgcGxheWJhY2sgaXMgc3VwcG9ydGVkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBtUm91dGVTdXBwb3J0c1JlbW90ZVBsYXliYWNrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgcXVldWluZyBmZWF0dXJlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBxdWV1aW5nLCB0aGVuIGF0IG1vc3Qgb25lIG1lZGlhIGl0ZW0gY2FuIGJlIHBsYXllZAotICAgICAqIGF0IGEgdGltZSBhbmQgdGhlIHtAbGluayAjZW5xdWV1ZX0gbWV0aG9kIHdpbGwgbm90IGJlIGF2YWlsYWJsZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBhbGwgb2YgdGhlIGJhc2ljIHJlbW90ZSBwbGF5YmFjawotICAgICAqIGFjdGlvbnMgYW5kIGFsbCBvZiB0aGUgZm9sbG93aW5nIGFjdGlvbnM6Ci0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRU1PVkUgcmVtb3ZlfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgcXVldWluZyBpcyBzdXBwb3J0ZWQuICBJbXBsaWVzIHtAbGluayAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZH0KLSAgICAgKiBpcyBhbHNvIHRydWUuCi0gICAgICoKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNRdWV1aW5nU3VwcG9ydGVkKCkgewotICAgICAgICByZXR1cm4gbVJvdXRlU3VwcG9ydHNRdWV1aW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgc2Vzc2lvbiBtYW5hZ2VtZW50IGZlYXR1cmVzLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHNlc3Npb24gbWFuYWdlbWVudCwgdGhlbiB0aGUgc2Vzc2lvbiB3aWxsCi0gICAgICogbm90IGJlIGNyZWF0ZWQgdW50aWwgdGhlIGZpcnN0IG1lZGlhIGl0ZW0gaXMgcGxheWVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIGFsbCBvZiB0aGUgYmFzaWMgcmVtb3RlIHBsYXliYWNrCi0gICAgICogYWN0aW9ucyBhbmQgYWxsIG9mIHRoZSBmb2xsb3dpbmcgYWN0aW9uczoKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVEFSVF9TRVNTSU9OIHN0YXJ0IHNlc3Npb259LAotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUyBnZXQgc2Vzc2lvbiBzdGF0dXN9LAotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VORF9TRVNTSU9OIGVuZCBzZXNzaW9ufS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgc2Vzc2lvbiBtYW5hZ2VtZW50IGlzIHN1cHBvcnRlZC4KLSAgICAgKiBJbXBsaWVzIHtAbGluayAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZH0gaXMgYWxzbyB0cnVlLgotICAgICAqCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU2Vzc2lvbk1hbmFnZW1lbnRTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBtUm91dGVTdXBwb3J0c1Nlc3Npb25NYW5hZ2VtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgbWVzc2FnZXMuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBhbGwgb2YgdGhlIGJhc2ljIHJlbW90ZSBwbGF5YmFjawotICAgICAqIGFjdGlvbnMgYW5kIGFsbCBvZiB0aGUgZm9sbG93aW5nIGFjdGlvbnM6Ci0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RBUlRfU0VTU0lPTiBzdGFydCBzZXNzaW9ufSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TRU5EX01FU1NBR0Ugc2VuZCBtZXNzYWdlfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTkRfU0VTU0lPTiBlbmQgc2Vzc2lvbn0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHNlc3Npb24gbWFuYWdlbWVudCBpcyBzdXBwb3J0ZWQuCi0gICAgICogSW1wbGllcyB7QGxpbmsgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWR9IGlzIGFsc28gdHJ1ZS4KLSAgICAgKgotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc01lc3NhZ2luZ1N1cHBvcnRlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1Sb3V0ZVN1cHBvcnRzTWVzc2FnaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGN1cnJlbnQgc2Vzc2lvbiBpZCBpZiB0aGVyZSBpcyBvbmUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHNlc3Npb24gaWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlc3Npb25JZCgpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9uSWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCBzZXNzaW9uIGlkLgotICAgICAqIDxwPgotICAgICAqIEl0IGlzIHVzdWFsbHkgbm90IG5lY2Vzc2FyeSB0byBzZXQgdGhlIHNlc3Npb24gaWQgZXhwbGljaXRseSBzaW5jZQotICAgICAqIGl0IGlzIGNyZWF0ZWQgYXMgYSBzaWRlLWVmZmVjdCBvZiBvdGhlciByZXF1ZXN0cyBzdWNoIGFzCi0gICAgICoge0BsaW5rICNwbGF5fSwge0BsaW5rICNlbnF1ZXVlfSwgYW5kIHtAbGluayAjc3RhcnRTZXNzaW9ufS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIFRoZSBuZXcgc2Vzc2lvbiBpZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb25JZChTdHJpbmcgc2Vzc2lvbklkKSB7Ci0gICAgICAgIGlmICghT2JqZWN0c0NvbXBhdC5lcXVhbHMobVNlc3Npb25JZCwgc2Vzc2lvbklkKSkgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2Vzc2lvbiBpZCBpcyBub3c6ICIgKyBzZXNzaW9uSWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKLSAgICAgICAgICAgIGlmIChtU3RhdHVzQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TdGF0dXNDYWxsYmFjay5vblNlc3Npb25DaGFuZ2VkKHNlc3Npb25JZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNsaWVudCBjdXJyZW50bHkgaGFzIGEgc2Vzc2lvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBFcXVpdmFsZW50IHRvIGNoZWNraW5nIHdoZXRoZXIge0BsaW5rICNnZXRTZXNzaW9uSWR9IHJldHVybnMgYSBub24tbnVsbCByZXN1bHQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZXJlIGlzIGEgY3VycmVudCBzZXNzaW9uLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc1Nlc3Npb24oKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbklkICE9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGNhbGxiYWNrIHRoYXQgc2hvdWxkIHJlY2VpdmUgc3RhdHVzIHVwZGF0ZXMgd2hlbiB0aGUgc3RhdGUgb2YKLSAgICAgKiBtZWRpYSBzZXNzaW9ucyBvciBtZWRpYSBpdGVtcyBjcmVhdGVkIGJ5IHRoaXMgaW5zdGFuY2Ugb2YgdGhlIHJlbW90ZQotICAgICAqIHBsYXliYWNrIGNsaWVudCBjaGFuZ2VzLgotICAgICAqIDxwPgotICAgICAqIFRoZSBjYWxsYmFjayBzaG91bGQgYmUgc2V0IGJlZm9yZSB0aGUgc2Vzc2lvbiBpcyBjcmVhdGVkIG9yIGFueSBwbGF5Ci0gICAgICogY29tbWFuZHMgYXJlIGlzc3VlZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHNldC4gIE1heSBiZSBudWxsIHRvIHJlbW92ZSB0aGUgcHJldmlvdXMgY2FsbGJhY2suCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3RhdHVzQ2FsbGJhY2soU3RhdHVzQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgbVN0YXR1c0NhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGNhbGxiYWNrIHRoYXQgc2hvdWxkIHJlY2VpdmUgbWVzc2FnZXMgd2hlbiBhIG1lc3NhZ2UgaXMgc2VudCBmcm9tCi0gICAgICogbWVkaWEgc2Vzc2lvbnMgY3JlYXRlZCBieSB0aGlzIGluc3RhbmNlIG9mIHRoZSByZW1vdGUgcGxheWJhY2sgY2xpZW50IGNoYW5nZXMuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGNhbGxiYWNrIHNob3VsZCBiZSBzZXQgYmVmb3JlIHRoZSBzZXNzaW9uIGlzIGNyZWF0ZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBjYWxsYmFjayB0byBzZXQuICBNYXkgYmUgbnVsbCB0byByZW1vdmUgdGhlIHByZXZpb3VzIGNhbGxiYWNrLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE9uTWVzc2FnZVJlY2VpdmVkTGlzdGVuZXIoT25NZXNzYWdlUmVjZWl2ZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBtT25NZXNzYWdlUmVjZWl2ZWRMaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBwbGF5IGEgbWVkaWEgaXRlbS4KLSAgICAgKiA8cD4KLSAgICAgKiBDbGVhcnMgdGhlIHF1ZXVlIGFuZCBzdGFydHMgcGxheWluZyB0aGUgbmV3IGl0ZW0gaW1tZWRpYXRlbHkuICBJZiB0aGUgcXVldWUKLSAgICAgKiB3YXMgcHJldmlvdXNseSBwYXVzZWQsIHRoZW4gaXQgaXMgcmVzdW1lZCBhcyBhIHNpZGUtZWZmZWN0IG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiBubyBzZXNzaW9uIGlzIGF2YWlsYWJsZSwgdGhlbgotICAgICAqIG9uZSBpcyBjcmVhdGVkIGltcGxpY2l0bHkuCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZIEFDVElPTl9QTEFZfSBmb3IKLSAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZW50VXJpIFRoZSBjb250ZW50IFVyaSB0byBwbGF5LgotICAgICAqIEBwYXJhbSBtaW1lVHlwZSBUaGUgbWltZSB0eXBlIG9mIHRoZSBjb250ZW50LCBvciBudWxsIGlmIHVua25vd24uCi0gICAgICogQHBhcmFtIHBvc2l0aW9uTWlsbGlzIFRoZSBpbml0aWFsIGNvbnRlbnQgcG9zaXRpb24gZm9yIHRoZSBpdGVtIGluIG1pbGxpc2Vjb25kcywKLSAgICAgKiBvciA8Y29kZT4wPC9jb2RlPiB0byBzdGFydCBhdCB0aGUgYmVnaW5uaW5nLgotICAgICAqIEBwYXJhbSBtZXRhZGF0YSBUaGUgbWVkaWEgaXRlbSBtZXRhZGF0YSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCByZW1vdGUgcGxheWJhY2suCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwbGF5KFVyaSBjb250ZW50VXJpLCBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBtZXRhZGF0YSwKLSAgICAgICAgICAgIGxvbmcgcG9zaXRpb25NaWxsaXMsIEJ1bmRsZSBleHRyYXMsIEl0ZW1BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBwbGF5T3JFbnF1ZXVlKGNvbnRlbnRVcmksIG1pbWVUeXBlLCBtZXRhZGF0YSwgcG9zaXRpb25NaWxsaXMsCi0gICAgICAgICAgICAgICAgZXh0cmFzLCBjYWxsYmFjaywgTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9QTEFZKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gZW5xdWV1ZSBhIG1lZGlhIGl0ZW0uCi0gICAgICogPHA+Ci0gICAgICogRW5xdWV1ZXMgYSBuZXcgaXRlbSB0byBwbGF5LiAgSWYgdGhlIHF1ZXVlIHdhcyBwcmV2aW91c2x5IHBhdXNlZCwgdGhlbiB3aWxsCi0gICAgICogcmVtYWluIHBhdXNlZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiBubyBzZXNzaW9uIGlzIGF2YWlsYWJsZSwgdGhlbgotICAgICAqIG9uZSBpcyBjcmVhdGVkIGltcGxpY2l0bHkuCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFIEFDVElPTl9FTlFVRVVFfSBmb3IKLSAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZW50VXJpIFRoZSBjb250ZW50IFVyaSB0byBlbnF1ZXVlLgotICAgICAqIEBwYXJhbSBtaW1lVHlwZSBUaGUgbWltZSB0eXBlIG9mIHRoZSBjb250ZW50LCBvciBudWxsIGlmIHVua25vd24uCi0gICAgICogQHBhcmFtIHBvc2l0aW9uTWlsbGlzIFRoZSBpbml0aWFsIGNvbnRlbnQgcG9zaXRpb24gZm9yIHRoZSBpdGVtIGluIG1pbGxpc2Vjb25kcywKLSAgICAgKiBvciA8Y29kZT4wPC9jb2RlPiB0byBzdGFydCBhdCB0aGUgYmVnaW5uaW5nLgotICAgICAqIEBwYXJhbSBtZXRhZGF0YSBUaGUgbWVkaWEgaXRlbSBtZXRhZGF0YSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBxdWV1aW5nLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VOUVVFVUUKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICogQHNlZSAjaXNRdWV1aW5nU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5xdWV1ZShVcmkgY29udGVudFVyaSwgU3RyaW5nIG1pbWVUeXBlLCBCdW5kbGUgbWV0YWRhdGEsCi0gICAgICAgICAgICBsb25nIHBvc2l0aW9uTWlsbGlzLCBCdW5kbGUgZXh0cmFzLCBJdGVtQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgcGxheU9yRW5xdWV1ZShjb250ZW50VXJpLCBtaW1lVHlwZSwgbWV0YWRhdGEsIHBvc2l0aW9uTWlsbGlzLAotICAgICAgICAgICAgICAgIGV4dHJhcywgY2FsbGJhY2ssIE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fRU5RVUVVRSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBsYXlPckVucXVldWUoVXJpIGNvbnRlbnRVcmksIFN0cmluZyBtaW1lVHlwZSwgQnVuZGxlIG1ldGFkYXRhLAotICAgICAgICAgICAgbG9uZyBwb3NpdGlvbk1pbGxpcywgQnVuZGxlIGV4dHJhcywKLSAgICAgICAgICAgIGZpbmFsIEl0ZW1BY3Rpb25DYWxsYmFjayBjYWxsYmFjaywgU3RyaW5nIGFjdGlvbikgewotICAgICAgICBpZiAoY29udGVudFVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZW50VXJpIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICB0aHJvd0lmUmVtb3RlUGxheWJhY2tOb3RTdXBwb3J0ZWQoKTsKLSAgICAgICAgaWYgKGFjdGlvbi5lcXVhbHMoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9FTlFVRVVFKSkgewotICAgICAgICAgICAgdGhyb3dJZlF1ZXVpbmdOb3RTdXBwb3J0ZWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KGFjdGlvbik7Ci0gICAgICAgIGludGVudC5zZXREYXRhQW5kVHlwZShjb250ZW50VXJpLCBtaW1lVHlwZSk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSLAotICAgICAgICAgICAgICAgIG1JdGVtU3RhdHVzUGVuZGluZ0ludGVudCk7Ci0gICAgICAgIGlmIChtZXRhZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fTUVUQURBVEEsIG1ldGFkYXRhKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocG9zaXRpb25NaWxsaXMgIT0gMCkgewotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX0NPTlRFTlRfUE9TSVRJT04sIHBvc2l0aW9uTWlsbGlzKTsKLSAgICAgICAgfQotICAgICAgICBwZXJmb3JtSXRlbUFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIG51bGwsIGV4dHJhcywgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBzZWVrIHRvIGEgbmV3IHBvc2l0aW9uIGluIGEgbWVkaWEgaXRlbS4KLSAgICAgKiA8cD4KLSAgICAgKiBTZWVrcyB0byBhIG5ldyBwb3NpdGlvbi4gIElmIHRoZSBxdWV1ZSB3YXMgcHJldmlvdXNseSBwYXVzZWQgdGhlbiBpdAotICAgICAqIHJlbWFpbnMgcGF1c2VkIGJ1dCB0aGUgaXRlbSdzIG5ldyBwb3NpdGlvbiBpcyBzdGlsbCByZW1lbWJlcmVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NFRUsgQUNUSU9OX1NFRUt9IGZvcgotICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZW1JZCBUaGUgaXRlbSBpZC4KLSAgICAgKiBAcGFyYW0gcG9zaXRpb25NaWxsaXMgVGhlIG5ldyBjb250ZW50IHBvc2l0aW9uIGZvciB0aGUgaXRlbSBpbiBtaWxsaXNlY29uZHMsCi0gICAgICogb3IgPGNvZGU+MDwvY29kZT4gdG8gc3RhcnQgYXQgdGhlIGJlZ2lubmluZy4KLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TRUVLfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NFRUsKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VlayhTdHJpbmcgaXRlbUlkLCBsb25nIHBvc2l0aW9uTWlsbGlzLCBCdW5kbGUgZXh0cmFzLAotICAgICAgICAgICAgSXRlbUFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChpdGVtSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbUlkIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU0VFSyk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9DT05URU5UX1BPU0lUSU9OLCBwb3NpdGlvbk1pbGxpcyk7Ci0gICAgICAgIHBlcmZvcm1JdGVtQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgaXRlbUlkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBtZWRpYSBpdGVtLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NUQVRVUyBBQ1RJT05fR0VUX1NUQVRVU30gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gaXRlbUlkIFRoZSBpdGVtIGlkLgotICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TVEFUVVN9IGludGVudCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCi0gICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24uCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NUQVRVUwotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBnZXRTdGF0dXMoU3RyaW5nIGl0ZW1JZCwgQnVuZGxlIGV4dHJhcywgSXRlbUFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChpdGVtSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbUlkIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fR0VUX1NUQVRVUyk7Ci0gICAgICAgIHBlcmZvcm1JdGVtQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgaXRlbUlkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gcmVtb3ZlIGEgbWVkaWEgaXRlbSBmcm9tIHRoZSBxdWV1ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFTU9WRSBBQ1RJT05fUkVNT1ZFfSBmb3IKLSAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpdGVtSWQgVGhlIGl0ZW0gaWQuCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVNT1ZFfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgcXVldWluZy4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRU1PVkUKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICogQHNlZSAjaXNRdWV1aW5nU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlKFN0cmluZyBpdGVtSWQsIEJ1bmRsZSBleHRyYXMsIEl0ZW1BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBpZiAoaXRlbUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW1JZCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3dJZlF1ZXVpbmdOb3RTdXBwb3J0ZWQoKTsKLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1JFTU9WRSk7Ci0gICAgICAgIHBlcmZvcm1JdGVtQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgaXRlbUlkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gcGF1c2UgbWVkaWEgcGxheWJhY2suCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiBwbGF5YmFjayBpcyBhbHJlYWR5IHBhdXNlZAotICAgICAqIHRoZW4gdGhlIHJlcXVlc3QgaGFzIG5vIGVmZmVjdC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BBVVNFIEFDVElPTl9QQVVTRX0gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QQVVTRX0gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QQVVTRQotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYXVzZShCdW5kbGUgZXh0cmFzLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1BBVVNFKTsKLSAgICAgICAgcGVyZm9ybVNlc3Npb25BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gcmVzdW1lICh1bnBhdXNlKSBtZWRpYSBwbGF5YmFjay4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4gIElmIHBsYXliYWNrIGlzIG5vdCBwYXVzZWQKLSAgICAgKiB0aGVuIHRoZSByZXF1ZXN0IGhhcyBubyBlZmZlY3QuCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRVNVTUUgQUNUSU9OX1JFU1VNRX0gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRVNVTUV9IGludGVudCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCi0gICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24uCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVTVU1FCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc3VtZShCdW5kbGUgZXh0cmFzLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1JFU1VNRSk7Ci0gICAgICAgIHBlcmZvcm1TZXNzaW9uQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgZXh0cmFzLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIHN0b3AgbWVkaWEgcGxheWJhY2sgYW5kIGNsZWFyIHRoZSBtZWRpYSBwbGF5YmFjayBxdWV1ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4gIElmIHRoZSBxdWV1ZSBpcyBhbHJlYWR5Ci0gICAgICogZW1wdHkgdGhlbiB0aGUgcmVxdWVzdCBoYXMgbm8gZWZmZWN0LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RPUCBBQ1RJT05fU1RPUH0gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVE9QfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUT1AKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGUgZXh0cmFzLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1NUT1ApOwotICAgICAgICBwZXJmb3JtU2Vzc2lvbkFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIGV4dHJhcywgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBzdGFydCBhIG5ldyBtZWRpYSBwbGF5YmFjayBzZXNzaW9uLgotICAgICAqIDxwPgotICAgICAqIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHdhaXQgZm9yIHRoZSBjYWxsYmFjayB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgcmVxdWVzdAotICAgICAqIGlzIGNvbXBsZXRlIGJlZm9yZSBpc3N1aW5nIG90aGVyIHJlcXVlc3RzIHRoYXQgYWZmZWN0IHRoZSBzZXNzaW9uLiAgSWYgdGhpcwotICAgICAqIHJlcXVlc3QgaXMgc3VjY2Vzc2Z1bCB0aGVuIHRoZSBwcmV2aW91cyBzZXNzaW9uIHdpbGwgYmUgaW52YWxpZGF0ZWQuCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVEFSVF9TRVNTSU9OIEFDVElPTl9TVEFSVF9TRVNTSU9OfQotICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUQVJUX1NFU1NJT059IGludGVudCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCi0gICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHNlc3Npb24gbWFuYWdlbWVudC4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVEFSVF9TRVNTSU9OCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqIEBzZWUgI2lzU2Vzc2lvbk1hbmFnZW1lbnRTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydFNlc3Npb24oQnVuZGxlIGV4dHJhcywgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHRocm93SWZTZXNzaW9uTWFuYWdlbWVudE5vdFN1cHBvcnRlZCgpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU1RBUlRfU0VTU0lPTik7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSLAotICAgICAgICAgICAgICAgIG1TZXNzaW9uU3RhdHVzUGVuZGluZ0ludGVudCk7Ci0gICAgICAgIGlmIChtUm91dGVTdXBwb3J0c01lc3NhZ2luZykgewotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9NRVNTQUdFX1JFQ0VJVkVSLCBtTWVzc2FnZVBlbmRpbmdJbnRlbnQpOwotICAgICAgICB9Ci0gICAgICAgIHBlcmZvcm1TZXNzaW9uQWN0aW9uKGludGVudCwgbnVsbCwgZXh0cmFzLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSBtZXNzYWdlLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU0VORF9NRVNTQUdFfSBmb3IKLSAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIEEgYnVuZGxlIG1lc3NhZ2UgZGVub3Rpbmcge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNFWFRSQV9NRVNTQUdFfS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IG1lc3NhZ2VzLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NFTkRfTUVTU0FHRQotICAgICAqIEBzZWUgI2lzTWVzc2FnaW5nU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VuZE1lc3NhZ2UoQnVuZGxlIG1lc3NhZ2UsIFNlc3Npb25BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpOwotICAgICAgICB0aHJvd0lmTWVzc2FnZU5vdFN1cHBvcnRlZCgpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU0VORF9NRVNTQUdFKTsKLSAgICAgICAgcGVyZm9ybVNlc3Npb25BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBtZXNzYWdlLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIGdldCB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBwbGF5YmFjayBzZXNzaW9uLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTCi0gICAgICogQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVU30gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgc2Vzc2lvbiBtYW5hZ2VtZW50LgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUwotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKiBAc2VlICNpc1Nlc3Npb25NYW5hZ2VtZW50U3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ2V0U2Vzc2lvblN0YXR1cyhCdW5kbGUgZXh0cmFzLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgdGhyb3dJZlNlc3Npb25NYW5hZ2VtZW50Tm90U3VwcG9ydGVkKCk7Ci0gICAgICAgIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMpOwotICAgICAgICBwZXJmb3JtU2Vzc2lvbkFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIGV4dHJhcywgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBlbmQgdGhlIG1lZGlhIHBsYXliYWNrIHNlc3Npb24uCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiB0aGlzIHJlcXVlc3QgaXMgc3VjY2Vzc2Z1bCwKLSAgICAgKiB0aGUge0BsaW5rICNnZXRTZXNzaW9uSWQgc2Vzc2lvbiBpZCBwcm9wZXJ0eX0gd2lsbCBiZSBzZXQgdG8gbnVsbCBhZnRlcgotICAgICAqIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5EX1NFU1NJT04gQUNUSU9OX0VORF9TRVNTSU9OfQotICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VORF9TRVNTSU9OfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgc2Vzc2lvbiBtYW5hZ2VtZW50LgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VORF9TRVNTSU9OCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqIEBzZWUgI2lzU2Vzc2lvbk1hbmFnZW1lbnRTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmRTZXNzaW9uKEJ1bmRsZSBleHRyYXMsIFNlc3Npb25BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICB0aHJvd0lmU2Vzc2lvbk1hbmFnZW1lbnROb3RTdXBwb3J0ZWQoKTsKLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0VORF9TRVNTSU9OKTsKLSAgICAgICAgcGVyZm9ybVNlc3Npb25BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGVyZm9ybUl0ZW1BY3Rpb24oZmluYWwgSW50ZW50IGludGVudCwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzZXNzaW9uSWQsIGZpbmFsIFN0cmluZyBpdGVtSWQsCi0gICAgICAgICAgICBCdW5kbGUgZXh0cmFzLCBmaW5hbCBJdGVtQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgaW50ZW50LmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spOwotICAgICAgICBpZiAoc2Vzc2lvbklkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9JRCwgc2Vzc2lvbklkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXRlbUlkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9JRCwgaXRlbUlkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXh0cmFzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYXMoZXh0cmFzKTsKLSAgICAgICAgfQotICAgICAgICBsb2dSZXF1ZXN0KGludGVudCk7Ci0gICAgICAgIG1Sb3V0ZS5zZW5kQ29udHJvbFJlcXVlc3QoaW50ZW50LCBuZXcgTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjaygpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWRSZXN1bHQgPSBpbmZlck1pc3NpbmdSZXN1bHQoc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0U3RyaW5nKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX0lEKSk7Ci0gICAgICAgICAgICAgICAgICAgIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzID0gTWVkaWFTZXNzaW9uU3RhdHVzLmZyb21CdW5kbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5nZXRCdW5kbGUoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fU1RBVFVTKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBpdGVtSWRSZXN1bHQgPSBpbmZlck1pc3NpbmdSZXN1bHQoaXRlbUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0U3RyaW5nKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX0lEKSk7Ci0gICAgICAgICAgICAgICAgICAgIE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzID0gTWVkaWFJdGVtU3RhdHVzLmZyb21CdW5kbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5nZXRCdW5kbGUoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fU1RBVFVTKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkb3B0U2Vzc2lvbihzZXNzaW9uSWRSZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbklkUmVzdWx0ICE9IG51bGwgJiYgaXRlbUlkUmVzdWx0ICE9IG51bGwgJiYgaXRlbVN0YXR1cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWNlaXZlZCByZXN1bHQgZnJvbSAiICsgaW50ZW50LmdldEFjdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6IGRhdGE9IiArIGJ1bmRsZVRvU3RyaW5nKGRhdGEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlc3Npb25JZD0iICsgc2Vzc2lvbklkUmVzdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlc3Npb25TdGF0dXM9IiArIHNlc3Npb25TdGF0dXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgaXRlbUlkPSIgKyBpdGVtSWRSZXN1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgaXRlbVN0YXR1cz0iICsgaXRlbVN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJlc3VsdChkYXRhLCBzZXNzaW9uSWRSZXN1bHQsIHNlc3Npb25TdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1JZFJlc3VsdCwgaXRlbVN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaGFuZGxlSW52YWxpZFJlc3VsdChpbnRlbnQsIGNhbGxiYWNrLCBkYXRhKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKFN0cmluZyBlcnJvciwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcihpbnRlbnQsIGNhbGxiYWNrLCBlcnJvciwgZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwZXJmb3JtU2Vzc2lvbkFjdGlvbihmaW5hbCBJbnRlbnQgaW50ZW50LCBmaW5hbCBTdHJpbmcgc2Vzc2lvbklkLAotICAgICAgICAgICAgQnVuZGxlIGV4dHJhcywgZmluYWwgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGludGVudC5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKTsKLSAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fSUQsIHNlc3Npb25JZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV4dHJhcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmFzKGV4dHJhcyk7Ci0gICAgICAgIH0KLSAgICAgICAgbG9nUmVxdWVzdChpbnRlbnQpOwotICAgICAgICBtUm91dGUuc2VuZENvbnRyb2xSZXF1ZXN0KGludGVudCwgbmV3IE1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkUmVzdWx0ID0gaW5mZXJNaXNzaW5nUmVzdWx0KHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmdldFN0cmluZyhNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9JRCkpOwotICAgICAgICAgICAgICAgICAgICBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cyA9IE1lZGlhU2Vzc2lvblN0YXR1cy5mcm9tQnVuZGxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0QnVuZGxlKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX1NUQVRVUykpOwotICAgICAgICAgICAgICAgICAgICBhZG9wdFNlc3Npb24oc2Vzc2lvbklkUmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb25JZFJlc3VsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWNlaXZlZCByZXN1bHQgZnJvbSAiICsgaW50ZW50LmdldEFjdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6IGRhdGE9IiArIGJ1bmRsZVRvU3RyaW5nKGRhdGEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlc3Npb25JZD0iICsgc2Vzc2lvbklkUmVzdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlc3Npb25TdGF0dXM9IiArIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJlc3VsdChkYXRhLCBzZXNzaW9uSWRSZXN1bHQsIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0VORF9TRVNTSU9OKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgc2Vzc2lvbklkUmVzdWx0LmVxdWFscyhtU2Vzc2lvbklkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTZXNzaW9uSWQobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGhhbmRsZUludmFsaWRSZXN1bHQoaW50ZW50LCBjYWxsYmFjaywgZGF0YSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihTdHJpbmcgZXJyb3IsIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoaW50ZW50LCBjYWxsYmFjaywgZXJyb3IsIGRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIGFkb3B0U2Vzc2lvbihTdHJpbmcgc2Vzc2lvbklkKSB7Ci0gICAgICAgIGlmIChzZXNzaW9uSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgc2V0U2Vzc2lvbklkKHNlc3Npb25JZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGhhbmRsZUludmFsaWRSZXN1bHQoSW50ZW50IGludGVudCwgQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICBCdW5kbGUgZGF0YSkgewotICAgICAgICBMb2cudyhUQUcsICJSZWNlaXZlZCBpbnZhbGlkIHJlc3VsdCBkYXRhIGZyb20gIiArIGludGVudC5nZXRBY3Rpb24oKQotICAgICAgICAgICAgICAgICsgIjogZGF0YT0iICsgYnVuZGxlVG9TdHJpbmcoZGF0YSkpOwotICAgICAgICBjYWxsYmFjay5vbkVycm9yKG51bGwsIE1lZGlhQ29udHJvbEludGVudC5FUlJPUl9VTktOT1dOLCBkYXRhKTsKLSAgICB9Ci0KLSAgICB2b2lkIGhhbmRsZUVycm9yKEludGVudCBpbnRlbnQsIEFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgU3RyaW5nIGVycm9yLCBCdW5kbGUgZGF0YSkgewotICAgICAgICBmaW5hbCBpbnQgY29kZTsKLSAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgY29kZSA9IGRhdGEuZ2V0SW50KE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9FUlJPUl9DT0RFLAotICAgICAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xJbnRlbnQuRVJST1JfVU5LTk9XTik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb2RlID0gTWVkaWFDb250cm9sSW50ZW50LkVSUk9SX1VOS05PV047Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJSZWNlaXZlZCBlcnJvciBmcm9tICIgKyBpbnRlbnQuZ2V0QWN0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiOiBlcnJvcj0iICsgZXJyb3IKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBjb2RlPSIgKyBjb2RlCi0gICAgICAgICAgICAgICAgICAgICsgIiwgZGF0YT0iICsgYnVuZGxlVG9TdHJpbmcoZGF0YSkpOwotICAgICAgICB9Ci0gICAgICAgIGNhbGxiYWNrLm9uRXJyb3IoZXJyb3IsIGNvZGUsIGRhdGEpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZXRlY3RGZWF0dXJlcygpIHsKLSAgICAgICAgbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjayA9IHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9QTEFZKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TRUVLKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9HRVRfU1RBVFVTKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9QQVVTRSkKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUkVTVU1FKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TVE9QKTsKLSAgICAgICAgbVJvdXRlU3VwcG9ydHNRdWV1aW5nID0gbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjawotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9FTlFVRVVFKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9SRU1PVkUpOwotICAgICAgICBtUm91dGVTdXBwb3J0c1Nlc3Npb25NYW5hZ2VtZW50ID0gbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjawotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TVEFSVF9TRVNTSU9OKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMpCi0gICAgICAgICAgICAgICAgJiYgcm91dGVTdXBwb3J0c0FjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0VORF9TRVNTSU9OKTsKLSAgICAgICAgbVJvdXRlU3VwcG9ydHNNZXNzYWdpbmcgPSBkb2VzUm91dGVTdXBwb3J0TWVzc2FnaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHJvdXRlU3VwcG9ydHNBY3Rpb24oU3RyaW5nIGFjdGlvbikgewotICAgICAgICByZXR1cm4gbVJvdXRlLnN1cHBvcnRzQ29udHJvbEFjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLLCBhY3Rpb24pOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBkb2VzUm91dGVTdXBwb3J0TWVzc2FnaW5nKCkgewotICAgICAgICBmb3IgKEludGVudEZpbHRlciBmaWx0ZXIgOiBtUm91dGUuZ2V0Q29udHJvbEZpbHRlcnMoKSkgewotICAgICAgICAgICAgaWYgKGZpbHRlci5oYXNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TRU5EX01FU1NBR0UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0aHJvd0lmUmVtb3RlUGxheWJhY2tOb3RTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIGlmICghbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjaykgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCByZW1vdGUgcGxheWJhY2suIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGhyb3dJZlF1ZXVpbmdOb3RTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIGlmICghbVJvdXRlU3VwcG9ydHNRdWV1aW5nKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHF1ZXVpbmcuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGhyb3dJZlNlc3Npb25NYW5hZ2VtZW50Tm90U3VwcG9ydGVkKCkgewotICAgICAgICBpZiAoIW1Sb3V0ZVN1cHBvcnRzU2Vzc2lvbk1hbmFnZW1lbnQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgIgotICAgICAgICAgICAgICAgICAgICArICJzZXNzaW9uIG1hbmFnZW1lbnQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGhyb3dJZk1lc3NhZ2VOb3RTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIGlmICghbVJvdXRlU3VwcG9ydHNNZXNzYWdpbmcpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgbWVzc2FnZS4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpIHsKLSAgICAgICAgaWYgKG1TZXNzaW9uSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBpbmZlck1pc3NpbmdSZXN1bHQoU3RyaW5nIHJlcXVlc3QsIFN0cmluZyByZXN1bHQpIHsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBSZXN1bHQgaXMgbWlzc2luZy4KLSAgICAgICAgICAgIHJldHVybiByZXF1ZXN0OwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXF1ZXN0ID09IG51bGwgfHwgcmVxdWVzdC5lcXVhbHMocmVzdWx0KSkgewotICAgICAgICAgICAgLy8gUmVxdWVzdCBkaWRuJ3Qgc3BlY2lmeSBhIHZhbHVlIG9yIHJlc3VsdCBtYXRjaGVzIHJlcXVlc3QuCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIC8vIFJlc3VsdCBjb25mbGljdHMgd2l0aCByZXF1ZXN0LgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGxvZ1JlcXVlc3QoSW50ZW50IGludGVudCkgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIlNlbmRpbmcgcmVxdWVzdDogIiArIGludGVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGJ1bmRsZVRvU3RyaW5nKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidW5kbGUuc2l6ZSgpOyAvLyBmb3JjZSBidW5kbGUgdG8gYmUgdW5wYXJjZWxsZWQKLSAgICAgICAgICAgIHJldHVybiBidW5kbGUudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIm51bGwiOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQWN0aW9uUmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9JVEVNX1NUQVRVU19DSEFOR0VEID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLmFjdGlvbnMuQUNUSU9OX0lURU1fU1RBVFVTX0NIQU5HRUQiOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU0VTU0lPTl9TVEFUVVNfQ0hBTkdFRCA9Ci0gICAgICAgICAgICAgICAgImFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5hY3Rpb25zLkFDVElPTl9TRVNTSU9OX1NUQVRVU19DSEFOR0VEIjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX01FU1NBR0VfUkVDRUlWRUQgPQotICAgICAgICAgICAgICAgICJhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuYWN0aW9ucy5BQ1RJT05fTUVTU0FHRV9SRUNFSVZFRCI7Ci0KLSAgICAgICAgQWN0aW9uUmVjZWl2ZXIoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCA9IGludGVudC5nZXRTdHJpbmdFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9JRCk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbklkID09IG51bGwgfHwgIXNlc3Npb25JZC5lcXVhbHMobVNlc3Npb25JZCkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJEaXNjYXJkaW5nIHNwdXJpb3VzIHN0YXR1cyBjYWxsYmFjayAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJ3aXRoIG1pc3Npbmcgb3IgaW52YWxpZCBzZXNzaW9uIGlkOiBzZXNzaW9uSWQ9IiArIHNlc3Npb25JZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cyA9IE1lZGlhU2Vzc2lvblN0YXR1cy5mcm9tQnVuZGxlKAotICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0QnVuZGxlRXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fU1RBVFVTKSk7Ci0gICAgICAgICAgICBTdHJpbmcgYWN0aW9uID0gaW50ZW50LmdldEFjdGlvbigpOwotICAgICAgICAgICAgaWYgKGFjdGlvbi5lcXVhbHMoQUNUSU9OX0lURU1fU1RBVFVTX0NIQU5HRUQpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCA9IGludGVudC5nZXRTdHJpbmdFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9JRCk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW1JZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkRpc2NhcmRpbmcgc3B1cmlvdXMgc3RhdHVzIGNhbGxiYWNrIHdpdGggbWlzc2luZyBpdGVtIGlkLiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMgPSBNZWRpYUl0ZW1TdGF0dXMuZnJvbUJ1bmRsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRCdW5kbGVFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9TVEFUVVMpKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbVN0YXR1cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkRpc2NhcmRpbmcgc3B1cmlvdXMgc3RhdHVzIGNhbGxiYWNrIHdpdGggbWlzc2luZyBpdGVtIHN0YXR1cy4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWNlaXZlZCBpdGVtIHN0YXR1cyBjYWxsYmFjazogc2Vzc2lvbklkPSIgKyBzZXNzaW9uSWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlc3Npb25TdGF0dXM9IiArIHNlc3Npb25TdGF0dXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGl0ZW1JZD0iICsgaXRlbUlkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBpdGVtU3RhdHVzPSIgKyBpdGVtU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobVN0YXR1c0NhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0NhbGxiYWNrLm9uSXRlbVN0YXR1c0NoYW5nZWQoaW50ZW50LmdldEV4dHJhcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cywgaXRlbUlkLCBpdGVtU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQUNUSU9OX1NFU1NJT05fU1RBVFVTX0NIQU5HRUQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlc3Npb25TdGF0dXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJEaXNjYXJkaW5nIHNwdXJpb3VzIG1lZGlhIHN0YXR1cyBjYWxsYmFjayB3aXRoICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIm1pc3Npbmcgc2Vzc2lvbiBzdGF0dXMuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVjZWl2ZWQgc2Vzc2lvbiBzdGF0dXMgY2FsbGJhY2s6IHNlc3Npb25JZD0iICsgc2Vzc2lvbklkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzZXNzaW9uU3RhdHVzPSIgKyBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobVN0YXR1c0NhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0NhbGxiYWNrLm9uU2Vzc2lvblN0YXR1c0NoYW5nZWQoaW50ZW50LmdldEV4dHJhcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEFDVElPTl9NRVNTQUdFX1JFQ0VJVkVEKSkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWNlaXZlZCBtZXNzYWdlIGNhbGxiYWNrOiBzZXNzaW9uSWQ9IiArIHNlc3Npb25JZCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG1Pbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbU9uTWVzc2FnZVJlY2VpdmVkTGlzdGVuZXIub25NZXNzYWdlUmVjZWl2ZWQoc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRCdW5kbGVFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfTUVTU0FHRSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgY2FsbGJhY2sgdGhhdCB3aWxsIHJlY2VpdmUgbWVkaWEgc3RhdHVzIHVwZGF0ZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBTdGF0dXNDYWxsYmFjayB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgc3RhdHVzIG9mIGEgbWVkaWEgaXRlbSBjaGFuZ2VzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgcmVzdWx0IGRhdGEgYnVuZGxlLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIFRoZSBzZXNzaW9uIGlkLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvblN0YXR1cyBUaGUgc2Vzc2lvbiBzdGF0dXMsIG9yIG51bGwgaWYgdW5rbm93bi4KLSAgICAgICAgICogQHBhcmFtIGl0ZW1JZCBUaGUgaXRlbSBpZC4KLSAgICAgICAgICogQHBhcmFtIGl0ZW1TdGF0dXMgVGhlIGl0ZW0gc3RhdHVzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25JdGVtU3RhdHVzQ2hhbmdlZChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cywKLSAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkLCBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYSBtZWRpYSBzZXNzaW9uIGNoYW5nZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkYXRhIFRoZSByZXN1bHQgZGF0YSBidW5kbGUuCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIHNlc3Npb24gaWQuCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uU3RhdHVzIFRoZSBzZXNzaW9uIHN0YXR1cywgb3IgbnVsbCBpZiB1bmtub3duLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25TZXNzaW9uU3RhdHVzQ2hhbmdlZChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cykgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBzZXNzaW9uIG9mIHRoZSByZW1vdGUgcGxheWJhY2sgY2xpZW50IGNoYW5nZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIG5ldyBzZXNzaW9uIGlkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25TZXNzaW9uQ2hhbmdlZChTdHJpbmcgc2Vzc2lvbklkKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCYXNlIGNhbGxiYWNrIHR5cGUgZm9yIHJlbW90ZSBwbGF5YmFjayByZXF1ZXN0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEFjdGlvbkNhbGxiYWNrIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgY29udHJvbCByZXF1ZXN0IGZhaWxzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZXJyb3IgQSBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZSB3aGljaCBtYXkgYmUgc2hvd24gdG8gdGhlIHVzZXIsIG9yIG51bGwKLSAgICAgICAgICogaWYgdGhlIGNhdXNlIG9mIHRoZSBlcnJvciBpcyB1bmNsZWFyLgotICAgICAgICAgKiBAcGFyYW0gY29kZSBUaGUgZXJyb3IgY29kZSwgb3Ige0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNFUlJPUl9VTktOT1dOfSBpZiB1bmtub3duLgotICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgZXJyb3IgZGF0YSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoU3RyaW5nIGVycm9yLCBpbnQgY29kZSwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrIGZvciByZW1vdGUgcGxheWJhY2sgcmVxdWVzdHMgdGhhdCBvcGVyYXRlIG9uIGl0ZW1zLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgSXRlbUFjdGlvbkNhbGxiYWNrIGV4dGVuZHMgQWN0aW9uQ2FsbGJhY2sgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHJlcXVlc3Qgc3VjY2VlZHMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkYXRhIFRoZSByZXN1bHQgZGF0YSBidW5kbGUuCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIHNlc3Npb24gaWQuCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uU3RhdHVzIFRoZSBzZXNzaW9uIHN0YXR1cywgb3IgbnVsbCBpZiB1bmtub3duLgotICAgICAgICAgKiBAcGFyYW0gaXRlbUlkIFRoZSBpdGVtIGlkLgotICAgICAgICAgKiBAcGFyYW0gaXRlbVN0YXR1cyBUaGUgaXRlbSBzdGF0dXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSwgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMsCi0gICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrIGZvciByZW1vdGUgcGxheWJhY2sgcmVxdWVzdHMgdGhhdCBvcGVyYXRlIG9uIHNlc3Npb25zLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGV4dGVuZHMgQWN0aW9uQ2FsbGJhY2sgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHJlcXVlc3Qgc3VjY2VlZHMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkYXRhIFRoZSByZXN1bHQgZGF0YSBidW5kbGUuCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIHNlc3Npb24gaWQuCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uU3RhdHVzIFRoZSBzZXNzaW9uIHN0YXR1cywgb3IgbnVsbCBpZiB1bmtub3duLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIGNhbGxiYWNrIHRoYXQgd2lsbCByZWNlaXZlIG1lc3NhZ2VzIGZyb20gbWVkaWEgc2Vzc2lvbnMuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBPbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVzc2FnZSByZWNlaXZlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHNlc3Npb25JZCBUaGUgc2Vzc2lvbiBpZC4KLSAgICAgICAgICogQHBhcmFtIG1lc3NhZ2UgQSBidW5kbGUgbWVzc2FnZSBkZW5vdGluZyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0VYVFJBX01FU1NBR0V9LgotICAgICAgICAgKi8KLSAgICAgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChTdHJpbmcgc2Vzc2lvbklkLCBCdW5kbGUgbWVzc2FnZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1N5c3RlbU1lZGlhUm91dGVQcm92aWRlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1N5c3RlbU1lZGlhUm91dGVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzg0OTFmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9TeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uUmVxdWlyZXNBcGk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXk7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi0vKioKLSAqIFByb3ZpZGVzIHJvdXRlcyBmb3IgYnVpbHQtaW4gc3lzdGVtIGRlc3RpbmF0aW9ucyBzdWNoIGFzIHRoZSBsb2NhbCBkaXNwbGF5Ci0gKiBhbmQgc3BlYWtlci4gIE9uIEplbGx5YmVhbiBhbmQgbmV3ZXIgcGxhdGZvcm0gcmVsZWFzZXMsIHF1ZXJpZXMgdGhlIGZyYW1ld29yawotICogTWVkaWFSb3V0ZXIgZm9yIGZyYW1ld29yay1wcm92aWRlZCByb3V0ZXMgYW5kIHJlZ2lzdGVycyBub24tZnJhbWV3b3JrLXByb3ZpZGVkCi0gKiByb3V0ZXMgYXMgdXNlciByb3V0ZXMuCi0gKi8KLWFic3RyYWN0IGNsYXNzIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlciBleHRlbmRzIE1lZGlhUm91dGVQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9OQU1FID0gImFuZHJvaWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUk9VVEVfSUQgPSAiREVGQVVMVF9ST1VURSI7Ci0KLSAgICBwcm90ZWN0ZWQgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBzdXBlcihjb250ZXh0LCBuZXcgUHJvdmlkZXJNZXRhZGF0YShuZXcgQ29tcG9uZW50TmFtZShQQUNLQUdFX05BTUUsCi0gICAgICAgICAgICAgICAgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyLmNsYXNzLmdldE5hbWUoKSkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlciBvYnRhaW4oQ29udGV4dCBjb250ZXh0LCBTeW5jQ2FsbGJhY2sgc3luY0NhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMjQpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXBpMjRJbXBsKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSAxOCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBKZWxseWJlYW5NcjJJbXBsKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSAxNykgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBKZWxseWJlYW5NcjFJbXBsKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSAxNikgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBKZWxseWJlYW5JbXBsKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBMZWdhY3lJbXBsKGNvbnRleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgbWVkaWEgcm91dGVyIHdoZW4gYSByb3V0ZSBpcyBhZGRlZCB0byBzeW5jaHJvbml6ZSBzdGF0ZSB3aXRoCi0gICAgICogdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TeW5jUm91dGVBZGRlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgdGhlIG1lZGlhIHJvdXRlciB3aGVuIGEgcm91dGUgaXMgcmVtb3ZlZCB0byBzeW5jaHJvbml6ZSBzdGF0ZSB3aXRoCi0gICAgICogdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TeW5jUm91dGVSZW1vdmVkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgbWVkaWEgcm91dGVyIHdoZW4gYSByb3V0ZSBpcyBjaGFuZ2VkIHRvIHN5bmNocm9uaXplIHN0YXRlIHdpdGgKLSAgICAgKiB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN5bmNSb3V0ZUNoYW5nZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgd2hlbiBhIHJvdXRlIGlzIHNlbGVjdGVkIHRvIHN5bmNocm9uaXplIHN0YXRlIHdpdGgKLSAgICAgKiB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN5bmNSb3V0ZVNlbGVjdGVkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrcyBpbnRvIHRoZSBtZWRpYSByb3V0ZXIgdG8gc3luY2hyb25pemUgc3RhdGUgd2l0aCB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIFN5bmNDYWxsYmFjayB7Ci0gICAgICAgIHZvaWQgb25TeXN0ZW1Sb3V0ZVNlbGVjdGVkQnlEZXNjcmlwdG9ySWQoU3RyaW5nIGlkKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldERlZmF1bHRSb3V0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXRTeXN0ZW1Sb3V0ZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGVnYWN5IGltcGxlbWVudGF0aW9uIGZvciBwbGF0Zm9ybSB2ZXJzaW9ucyBwcmlvciB0byBKZWxseWJlYW4uCi0gICAgICovCi0gICAgc3RhdGljIGNsYXNzIExlZ2FjeUltcGwgZXh0ZW5kcyBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIgewotICAgICAgICBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1NUUkVBTSA9IEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUM7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlMaXN0PEludGVudEZpbHRlcj4gQ09OVFJPTF9GSUxURVJTOwotICAgICAgICBzdGF0aWMgewotICAgICAgICAgICAgSW50ZW50RmlsdGVyIGYgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0gICAgICAgICAgICBmLmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKTsKLSAgICAgICAgICAgIGYuYWRkQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfVklERU8pOwotCi0gICAgICAgICAgICBDT05UUk9MX0ZJTFRFUlMgPSBuZXcgQXJyYXlMaXN0PEludGVudEZpbHRlcj4oKTsKLSAgICAgICAgICAgIENPTlRST0xfRklMVEVSUy5hZGQoZik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBBdWRpb01hbmFnZXIgbUF1ZGlvTWFuYWdlcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBWb2x1bWVDaGFuZ2VSZWNlaXZlciBtVm9sdW1lQ2hhbmdlUmVjZWl2ZXI7Ci0gICAgICAgIGludCBtTGFzdFJlcG9ydGVkVm9sdW1lID0gLTE7Ci0KLSAgICAgICAgcHVibGljIExlZ2FjeUltcGwoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgICAgIG1BdWRpb01hbmFnZXIgPSAoQXVkaW9NYW5hZ2VyKWNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFVRElPX1NFUlZJQ0UpOwotICAgICAgICAgICAgbVZvbHVtZUNoYW5nZVJlY2VpdmVyID0gbmV3IFZvbHVtZUNoYW5nZVJlY2VpdmVyKCk7Ci0KLSAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtVm9sdW1lQ2hhbmdlUmVjZWl2ZXIsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlbnRGaWx0ZXIoVm9sdW1lQ2hhbmdlUmVjZWl2ZXIuVk9MVU1FX0NIQU5HRURfQUNUSU9OKSk7Ci0gICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHB1Ymxpc2hSb3V0ZXMoKSB7Ci0gICAgICAgICAgICBSZXNvdXJjZXMgciA9IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKTsKLSAgICAgICAgICAgIGludCBtYXhWb2x1bWUgPSBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbU1heFZvbHVtZShQTEFZQkFDS19TVFJFQU0pOwotICAgICAgICAgICAgbUxhc3RSZXBvcnRlZFZvbHVtZSA9IG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtVm9sdW1lKFBMQVlCQUNLX1NUUkVBTSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvciBkZWZhdWx0Um91dGUgPSBuZXcgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlcigKLSAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9ST1VURV9JRCwgci5nZXRTdHJpbmcoUi5zdHJpbmcubXJfc3lzdGVtX3JvdXRlX25hbWUpKQotICAgICAgICAgICAgICAgICAgICAuYWRkQ29udHJvbEZpbHRlcnMoQ09OVFJPTF9GSUxURVJTKQotICAgICAgICAgICAgICAgICAgICAuc2V0UGxheWJhY2tTdHJlYW0oUExBWUJBQ0tfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICAuc2V0UGxheWJhY2tUeXBlKE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19UWVBFX0xPQ0FMKQotICAgICAgICAgICAgICAgICAgICAuc2V0Vm9sdW1lSGFuZGxpbmcoTWVkaWFSb3V0ZXIuUm91dGVJbmZvLlBMQVlCQUNLX1ZPTFVNRV9WQVJJQUJMRSkKLSAgICAgICAgICAgICAgICAgICAgLnNldFZvbHVtZU1heChtYXhWb2x1bWUpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRWb2x1bWUobUxhc3RSZXBvcnRlZFZvbHVtZSkKLSAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0KLSAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgcHJvdmlkZXJEZXNjcmlwdG9yID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRSb3V0ZShkZWZhdWx0Um91dGUpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICAgICAgc2V0RGVzY3JpcHRvcihwcm92aWRlckRlc2NyaXB0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBSb3V0ZUNvbnRyb2xsZXIgb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoU3RyaW5nIHJvdXRlSWQpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZUlkLmVxdWFscyhERUZBVUxUX1JPVVRFX0lEKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFJvdXRlQ29udHJvbGxlcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBjbGFzcyBEZWZhdWx0Um91dGVDb250cm9sbGVyIGV4dGVuZHMgUm91dGVDb250cm9sbGVyIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25TZXRWb2x1bWUoaW50IHZvbHVtZSkgewotICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKFBMQVlCQUNLX1NUUkVBTSwgdm9sdW1lLCAwKTsKLSAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25VcGRhdGVWb2x1bWUoaW50IGRlbHRhKSB7Ci0gICAgICAgICAgICAgICAgaW50IHZvbHVtZSA9IG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtVm9sdW1lKFBMQVlCQUNLX1NUUkVBTSk7Ci0gICAgICAgICAgICAgICAgaW50IG1heFZvbHVtZSA9IG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtTWF4Vm9sdW1lKFBMQVlCQUNLX1NUUkVBTSk7Ci0gICAgICAgICAgICAgICAgaW50IG5ld1ZvbHVtZSA9IE1hdGgubWluKG1heFZvbHVtZSwgTWF0aC5tYXgoMCwgdm9sdW1lICsgZGVsdGEpKTsKLSAgICAgICAgICAgICAgICBpZiAobmV3Vm9sdW1lICE9IHZvbHVtZSkgewotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShQTEFZQkFDS19TVFJFQU0sIHZvbHVtZSwgMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGNsYXNzIFZvbHVtZUNoYW5nZVJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgewotICAgICAgICAgICAgLy8gVGhlc2UgY29uc3RhbnRzIGNvbWUgZnJvbSBBdWRpb01hbmFnZXIuCi0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWT0xVTUVfQ0hBTkdFRF9BQ1RJT04gPQotICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5WT0xVTUVfQ0hBTkdFRF9BQ1RJT04iOwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfVk9MVU1FX1NUUkVBTV9UWVBFID0KLSAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuRVhUUkFfVk9MVU1FX1NUUkVBTV9UWVBFIjsKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1ZPTFVNRV9TVFJFQU1fVkFMVUUgPQotICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5FWFRSQV9WT0xVTUVfU1RSRUFNX1ZBTFVFIjsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoVk9MVU1FX0NIQU5HRURfQUNUSU9OKSkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc3RyZWFtVHlwZSA9IGludGVudC5nZXRJbnRFeHRyYShFWFRSQV9WT0xVTUVfU1RSRUFNX1RZUEUsIC0xKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbVR5cGUgPT0gUExBWUJBQ0tfU1RSRUFNKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdm9sdW1lID0gaW50ZW50LmdldEludEV4dHJhKEVYVFJBX1ZPTFVNRV9TVFJFQU1fVkFMVUUsIC0xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2x1bWUgPj0gMCAmJiB2b2x1bWUgIT0gbUxhc3RSZXBvcnRlZFZvbHVtZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEplbGx5YmVhbiBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKi8KLSAgICAvLyBAQFJlcXVpcmVzQXBpKDE2KQotICAgIHN0YXRpYyBjbGFzcyBKZWxseWJlYW5JbXBsIGV4dGVuZHMgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyCi0gICAgICAgICAgICBpbXBsZW1lbnRzIE1lZGlhUm91dGVySmVsbHliZWFuLkNhbGxiYWNrLCBNZWRpYVJvdXRlckplbGx5YmVhbi5Wb2x1bWVDYWxsYmFjayB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+IExJVkVfQVVESU9fQ09OVFJPTF9GSUxURVJTOwotICAgICAgICBzdGF0aWMgewotICAgICAgICAgICAgSW50ZW50RmlsdGVyIGYgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0gICAgICAgICAgICBmLmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKTsKLQotICAgICAgICAgICAgTElWRV9BVURJT19DT05UUk9MX0ZJTFRFUlMgPSBuZXcgQXJyYXlMaXN0PEludGVudEZpbHRlcj4oKTsKLSAgICAgICAgICAgIExJVkVfQVVESU9fQ09OVFJPTF9GSUxURVJTLmFkZChmKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+IExJVkVfVklERU9fQ09OVFJPTF9GSUxURVJTOwotICAgICAgICBzdGF0aWMgewotICAgICAgICAgICAgSW50ZW50RmlsdGVyIGYgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0gICAgICAgICAgICBmLmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKTsKLQotICAgICAgICAgICAgTElWRV9WSURFT19DT05UUk9MX0ZJTFRFUlMgPSBuZXcgQXJyYXlMaXN0PEludGVudEZpbHRlcj4oKTsKLSAgICAgICAgICAgIExJVkVfVklERU9fQ09OVFJPTF9GSUxURVJTLmFkZChmKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3luY0NhbGxiYWNrIG1TeW5jQ2FsbGJhY2s7Ci0KLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBtUm91dGVyT2JqOwotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IG1DYWxsYmFja09iajsKLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBtVm9sdW1lQ2FsbGJhY2tPYmo7Ci0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBPYmplY3QgbVVzZXJSb3V0ZUNhdGVnb3J5T2JqOwotICAgICAgICBwcm90ZWN0ZWQgaW50IG1Sb3V0ZVR5cGVzOwotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtQWN0aXZlU2NhbjsKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gbUNhbGxiYWNrUmVnaXN0ZXJlZDsKLQotICAgICAgICAvLyBNYWludGFpbnMgYW4gYXNzb2NpYXRpb24gZnJvbSBmcmFtZXdvcmsgcm91dGVzIHRvIHN1cHBvcnQgbGlicmFyeSByb3V0ZXMuCi0gICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBjYW5ub3QgdXNlIHRoZSB0YWcgZmllbGQgZm9yIHRoaXMgYmVjYXVzZSBhbiBhcHBsaWNhdGlvbiBtYXkKLSAgICAgICAgLy8gaGF2ZSBwdWJsaXNoZWQgaXRzIG93biB1c2VyIHJvdXRlcyB0byB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlciBhbmQgYWxyZWFkeQotICAgICAgICAvLyB1c2VkIHRoZSB0YWcgZm9yIGl0cyBvd24gcHVycG9zZXMuCi0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBBcnJheUxpc3Q8U3lzdGVtUm91dGVSZWNvcmQ+IG1TeXN0ZW1Sb3V0ZVJlY29yZHMgPQotICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8U3lzdGVtUm91dGVSZWNvcmQ+KCk7Ci0KLSAgICAgICAgLy8gTWFpbnRhaW5zIGFuIGFzc29jaWF0aW9uIGZyb20gc3VwcG9ydCBsaWJyYXJ5IHJvdXRlcyB0byBmcmFtZXdvcmsgcm91dGVzLgotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgQXJyYXlMaXN0PFVzZXJSb3V0ZVJlY29yZD4gbVVzZXJSb3V0ZVJlY29yZHMgPQotICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8VXNlclJvdXRlUmVjb3JkPigpOwotCi0gICAgICAgIHByaXZhdGUgTWVkaWFSb3V0ZXJKZWxseWJlYW4uU2VsZWN0Um91dGVXb3JrYXJvdW5kIG1TZWxlY3RSb3V0ZVdvcmthcm91bmQ7Ci0gICAgICAgIHByaXZhdGUgTWVkaWFSb3V0ZXJKZWxseWJlYW4uR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZCBtR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZDsKLQotICAgICAgICBwdWJsaWMgSmVsbHliZWFuSW1wbChDb250ZXh0IGNvbnRleHQsIFN5bmNDYWxsYmFjayBzeW5jQ2FsbGJhY2spIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICAgICAgbVN5bmNDYWxsYmFjayA9IHN5bmNDYWxsYmFjazsKLSAgICAgICAgICAgIG1Sb3V0ZXJPYmogPSBNZWRpYVJvdXRlckplbGx5YmVhbi5nZXRNZWRpYVJvdXRlcihjb250ZXh0KTsKLSAgICAgICAgICAgIG1DYWxsYmFja09iaiA9IGNyZWF0ZUNhbGxiYWNrT2JqKCk7Ci0gICAgICAgICAgICBtVm9sdW1lQ2FsbGJhY2tPYmogPSBjcmVhdGVWb2x1bWVDYWxsYmFja09iaigpOwotCi0gICAgICAgICAgICBSZXNvdXJjZXMgciA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCk7Ci0gICAgICAgICAgICBtVXNlclJvdXRlQ2F0ZWdvcnlPYmogPSBNZWRpYVJvdXRlckplbGx5YmVhbi5jcmVhdGVSb3V0ZUNhdGVnb3J5KAotICAgICAgICAgICAgICAgICAgICBtUm91dGVyT2JqLCByLmdldFN0cmluZyhSLnN0cmluZy5tcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUpLCBmYWxzZSk7Ci0KLSAgICAgICAgICAgIHVwZGF0ZVN5c3RlbVJvdXRlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBSb3V0ZUNvbnRyb2xsZXIgb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoU3RyaW5nIHJvdXRlSWQpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZEJ5RGVzY3JpcHRvcklkKHJvdXRlSWQpOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTeXN0ZW1Sb3V0ZUNvbnRyb2xsZXIocmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkKE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgICAgIGludCBuZXdSb3V0ZVR5cGVzID0gMDsKLSAgICAgICAgICAgIGJvb2xlYW4gbmV3QWN0aXZlU2NhbiA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKHJlcXVlc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvciA9IHJlcXVlc3QuZ2V0U2VsZWN0b3IoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gY2F0ZWdvcmllcyA9IHNlbGVjdG9yLmdldENvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gY2F0ZWdvcmllcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjYXRlZ29yeSA9IGNhdGVnb3JpZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnkuZXF1YWxzKE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3Um91dGVUeXBlcyB8PSBNZWRpYVJvdXRlckplbGx5YmVhbi5ST1VURV9UWVBFX0xJVkVfQVVESU87Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2F0ZWdvcnkuZXF1YWxzKE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3Um91dGVUeXBlcyB8PSBNZWRpYVJvdXRlckplbGx5YmVhbi5ST1VURV9UWVBFX0xJVkVfVklERU87Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdSb3V0ZVR5cGVzIHw9IE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfVVNFUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuZXdBY3RpdmVTY2FuID0gcmVxdWVzdC5pc0FjdGl2ZVNjYW4oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Sb3V0ZVR5cGVzICE9IG5ld1JvdXRlVHlwZXMgfHwgbUFjdGl2ZVNjYW4gIT0gbmV3QWN0aXZlU2NhbikgewotICAgICAgICAgICAgICAgIG1Sb3V0ZVR5cGVzID0gbmV3Um91dGVUeXBlczsKLSAgICAgICAgICAgICAgICBtQWN0aXZlU2NhbiA9IG5ld0FjdGl2ZVNjYW47Ci0gICAgICAgICAgICAgICAgdXBkYXRlU3lzdGVtUm91dGVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUFkZGVkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgaWYgKGFkZFN5c3RlbVJvdXRlTm9QdWJsaXNoKHJvdXRlT2JqKSkgewotICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTeXN0ZW1Sb3V0ZXMoKSB7Ci0gICAgICAgICAgICB1cGRhdGVDYWxsYmFjaygpOwotICAgICAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCByb3V0ZU9iaiA6IE1lZGlhUm91dGVySmVsbHliZWFuLmdldFJvdXRlcyhtUm91dGVyT2JqKSkgewotICAgICAgICAgICAgICAgIGNoYW5nZWQgfD0gYWRkU3lzdGVtUm91dGVOb1B1Ymxpc2gocm91dGVPYmopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gYWRkU3lzdGVtUm91dGVOb1B1Ymxpc2goT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0VXNlclJvdXRlUmVjb3JkKHJvdXRlT2JqKSA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZChyb3V0ZU9iaikgPCAwKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGlkID0gYXNzaWduUm91dGVJZChyb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbmV3IFN5c3RlbVJvdXRlUmVjb3JkKHJvdXRlT2JqLCBpZCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU3lzdGVtUm91dGVEZXNjcmlwdG9yKHJlY29yZCk7Ci0gICAgICAgICAgICAgICAgbVN5c3RlbVJvdXRlUmVjb3Jkcy5hZGQocmVjb3JkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGFzc2lnblJvdXRlSWQoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBUaGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlciBzaG91bGQgc3VwcGx5IGEgdW5pcXVlIHJvdXRlIGlkIHRoYXQKLSAgICAgICAgICAgIC8vIHdlIGNhbiB1c2UgaGVyZS4gIEZvciBub3cgd2UgdXNlIGEgaGFzaCBvZiB0aGUgcm91dGUgbmFtZSBhbmQgdGFrZSBjYXJlCi0gICAgICAgICAgICAvLyB0byBkZWR1cGUgaXQuCi0gICAgICAgICAgICBib29sZWFuIGlzRGVmYXVsdCA9IChnZXREZWZhdWx0Um91dGUoKSA9PSByb3V0ZU9iaik7Ci0gICAgICAgICAgICBTdHJpbmcgaWQgPSBpc0RlZmF1bHQgPyBERUZBVUxUX1JPVVRFX0lEIDoKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChMb2NhbGUuVVMsICJST1VURV8lMDh4IiwgZ2V0Um91dGVOYW1lKHJvdXRlT2JqKS5oYXNoQ29kZSgpKTsKLSAgICAgICAgICAgIGlmIChmaW5kU3lzdGVtUm91dGVSZWNvcmRCeURlc2NyaXB0b3JJZChpZCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDI7IDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5ld0lkID0gU3RyaW5nLmZvcm1hdChMb2NhbGUuVVMsICIlc18lZCIsIGlkLCBpKTsKLSAgICAgICAgICAgICAgICBpZiAoZmluZFN5c3RlbVJvdXRlUmVjb3JkQnlEZXNjcmlwdG9ySWQobmV3SWQpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3SWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVSZW1vdmVkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgaWYgKGdldFVzZXJSb3V0ZVJlY29yZChyb3V0ZU9iaikgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZChyb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVJvdXRlUmVjb3Jkcy5yZW1vdmUoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVDaGFuZ2VkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgaWYgKGdldFVzZXJSb3V0ZVJlY29yZChyb3V0ZU9iaikgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZChyb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IocmVjb3JkKTsKLSAgICAgICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVm9sdW1lQ2hhbmdlZChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGlmIChnZXRVc2VyUm91dGVSZWNvcmQocm91dGVPYmopID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgaW50IG5ld1ZvbHVtZSA9IE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXRWb2x1bWUocm91dGVPYmopOwotICAgICAgICAgICAgICAgICAgICBpZiAobmV3Vm9sdW1lICE9IHJlY29yZC5tUm91dGVEZXNjcmlwdG9yLmdldFZvbHVtZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlRGVzY3JpcHRvciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyKHJlY29yZC5tUm91dGVEZXNjcmlwdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Vm9sdW1lKG5ld1ZvbHVtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVNlbGVjdGVkKGludCB0eXBlLCBPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZU9iaiAhPSBNZWRpYVJvdXRlckplbGx5YmVhbi5nZXRTZWxlY3RlZFJvdXRlKG1Sb3V0ZXJPYmosCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLkFMTF9ST1VURV9UWVBFUykpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlIGhhcyBhbHJlYWR5IGNoYW5nZWQgc28gdGhpcyBjYWxsYmFjawotICAgICAgICAgICAgICAgIC8vIGlzIHN0YWxlLiAgRHJvcCBpdCB0byBwcmV2ZW50IGdldHRpbmcgaW50byBzeW5jIGxvb3BzLgotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVXNlclJvdXRlUmVjb3JkIHVzZXJSb3V0ZVJlY29yZCA9IGdldFVzZXJSb3V0ZVJlY29yZChyb3V0ZU9iaik7Ci0gICAgICAgICAgICBpZiAodXNlclJvdXRlUmVjb3JkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB1c2VyUm91dGVSZWNvcmQubVJvdXRlLnNlbGVjdCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBTZWxlY3QgdGhlIHJvdXRlIGlmIGl0IGFscmVhZHkgZXhpc3RzIGluIHRoZSBjb21wYXQgbWVkaWEgcm91dGVyLgotICAgICAgICAgICAgICAgIC8vIElmIG5vdCwgd2Ugd2lsbCBzZWxlY3QgaXQgaW5zdGVhZCB3aGVuIHRoZSByb3V0ZSBpcyBhZGRlZC4KLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgbVN5bmNDYWxsYmFjay5vblN5c3RlbVJvdXRlU2VsZWN0ZWRCeURlc2NyaXB0b3JJZChyZWNvcmQubVJvdXRlRGVzY3JpcHRvcklkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuc2VsZWN0ZWQoaW50IHR5cGUsIE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgLy8gTm90aGluZyB0byBkbyB3aGVuIGEgcm91dGUgaXMgdW5zZWxlY3RlZC4KLSAgICAgICAgICAgIC8vIFdlIG9ubHkgbmVlZCB0byBoYW5kbGUgd2hlbiBhIHJvdXRlIGlzIHNlbGVjdGVkLgotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVHcm91cGVkKE9iamVjdCByb3V0ZU9iaiwgT2JqZWN0IGdyb3VwT2JqLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIC8vIFJvdXRlIGdyb3VwaW5nIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuCi0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuZ3JvdXBlZChPYmplY3Qgcm91dGVPYmosIE9iamVjdCBncm91cE9iaikgewotICAgICAgICAgICAgLy8gUm91dGUgZ3JvdXBpbmcgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVNldFJlcXVlc3QoT2JqZWN0IHJvdXRlT2JqLCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICBVc2VyUm91dGVSZWNvcmQgcmVjb3JkID0gZ2V0VXNlclJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKLSAgICAgICAgICAgIGlmIChyZWNvcmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGUucmVxdWVzdFNldFZvbHVtZSh2b2x1bWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lVXBkYXRlUmVxdWVzdChPYmplY3Qgcm91dGVPYmosIGludCBkaXJlY3Rpb24pIHsKLSAgICAgICAgICAgIFVzZXJSb3V0ZVJlY29yZCByZWNvcmQgPSBnZXRVc2VyUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgaWYgKHJlY29yZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZS5yZXF1ZXN0VXBkYXRlVm9sdW1lKGRpcmVjdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TeW5jUm91dGVBZGRlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkgIT0gdGhpcykgewotICAgICAgICAgICAgICAgIE9iamVjdCByb3V0ZU9iaiA9IE1lZGlhUm91dGVySmVsbHliZWFuLmNyZWF0ZVVzZXJSb3V0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXJPYmosIG1Vc2VyUm91dGVDYXRlZ29yeU9iaik7Ci0gICAgICAgICAgICAgICAgVXNlclJvdXRlUmVjb3JkIHJlY29yZCA9IG5ldyBVc2VyUm91dGVSZWNvcmQocm91dGUsIHJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uc2V0VGFnKHJvdXRlT2JqLCByZWNvcmQpOwotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0Vm9sdW1lQ2FsbGJhY2socm91dGVPYmosIG1Wb2x1bWVDYWxsYmFja09iaik7Ci0gICAgICAgICAgICAgICAgdXBkYXRlVXNlclJvdXRlUHJvcGVydGllcyhyZWNvcmQpOwotICAgICAgICAgICAgICAgIG1Vc2VyUm91dGVSZWNvcmRzLmFkZChyZWNvcmQpOwotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLmFkZFVzZXJSb3V0ZShtUm91dGVyT2JqLCByb3V0ZU9iaik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIElmIHRoZSBuZXdseSBhZGRlZCByb3V0ZSBpcyB0aGUgY291bnRlcnBhcnQgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZAotICAgICAgICAgICAgICAgIC8vIHJvdXRlIGluIHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyIHRoZW4gZW5zdXJlIGl0IGlzIHNlbGVjdGVkIGluCi0gICAgICAgICAgICAgICAgLy8gdGhlIGNvbXBhdCBtZWRpYSByb3V0ZXIuCi0gICAgICAgICAgICAgICAgT2JqZWN0IHJvdXRlT2JqID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uZ2V0U2VsZWN0ZWRSb3V0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXJPYmosIE1lZGlhUm91dGVySmVsbHliZWFuLkFMTF9ST1VURV9UWVBFUyk7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFN5c3RlbVJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWNvcmQubVJvdXRlRGVzY3JpcHRvcklkLmVxdWFscyhyb3V0ZS5nZXREZXNjcmlwdG9ySWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLnNlbGVjdCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlUmVtb3ZlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkgIT0gdGhpcykgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRVc2VyUm91dGVSZWNvcmQocm91dGUpOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFVzZXJSb3V0ZVJlY29yZCByZWNvcmQgPSBtVXNlclJvdXRlUmVjb3Jkcy5yZW1vdmUoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uc2V0VGFnKHJlY29yZC5tUm91dGVPYmosIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZUNhbGxiYWNrKHJlY29yZC5tUm91dGVPYmosIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5yZW1vdmVVc2VyUm91dGUobVJvdXRlck9iaiwgcmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlQ2hhbmdlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkgIT0gdGhpcykgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRVc2VyUm91dGVSZWNvcmQocm91dGUpOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFVzZXJSb3V0ZVJlY29yZCByZWNvcmQgPSBtVXNlclJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVVc2VyUm91dGVQcm9wZXJ0aWVzKHJlY29yZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlU2VsZWN0ZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBpZiAoIXJvdXRlLmlzU2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUgaGFzIGFscmVhZHkgY2hhbmdlZCBzbyB0aGlzIGNhbGxiYWNrCi0gICAgICAgICAgICAgICAgLy8gaXMgc3RhbGUuICBEcm9wIGl0IHRvIHByZXZlbnQgZ2V0dGluZyBpbnRvIHN5bmMgbG9vcHMuCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpICE9IHRoaXMpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kVXNlclJvdXRlUmVjb3JkKHJvdXRlKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBVc2VyUm91dGVSZWNvcmQgcmVjb3JkID0gbVVzZXJSb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0Um91dGUocmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmRCeURlc2NyaXB0b3JJZChyb3V0ZS5nZXREZXNjcmlwdG9ySWQoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBzZWxlY3RSb3V0ZShyZWNvcmQubVJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwdWJsaXNoUm91dGVzKCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIgPQotICAgICAgICAgICAgICAgICAgICBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvci5CdWlsZGVyKCk7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkUm91dGUobVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaSkubVJvdXRlRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNldERlc2NyaXB0b3IoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBpbnQgZmluZFN5c3RlbVJvdXRlUmVjb3JkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaSkubVJvdXRlT2JqID09IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBpbnQgZmluZFN5c3RlbVJvdXRlUmVjb3JkQnlEZXNjcmlwdG9ySWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpKS5tUm91dGVEZXNjcmlwdG9ySWQuZXF1YWxzKGlkKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgaW50IGZpbmRVc2VyUm91dGVSZWNvcmQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtVXNlclJvdXRlUmVjb3Jkcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobVVzZXJSb3V0ZVJlY29yZHMuZ2V0KGkpLm1Sb3V0ZSA9PSByb3V0ZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgVXNlclJvdXRlUmVjb3JkIGdldFVzZXJSb3V0ZVJlY29yZChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIE9iamVjdCB0YWcgPSBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0VGFnKHJvdXRlT2JqKTsKLSAgICAgICAgICAgIHJldHVybiB0YWcgaW5zdGFuY2VvZiBVc2VyUm91dGVSZWNvcmQgPyAoVXNlclJvdXRlUmVjb3JkKXRhZyA6IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IoU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkKSB7Ci0gICAgICAgICAgICAvLyBXZSBtdXN0IGFsd2F5cyByZWNyZWF0ZSB0aGUgcm91dGUgZGVzY3JpcHRvciB3aGVuIG1ha2luZyBhbnkgY2hhbmdlcwotICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGV5IGFyZSBpbnRlbmRlZCB0byBiZSBpbW11dGFibGUgb25jZSBwdWJsaXNoZWQuCi0gICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlcigKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3JJZCwgZ2V0Um91dGVOYW1lKHJlY29yZC5tUm91dGVPYmopKTsKLSAgICAgICAgICAgIG9uQnVpbGRTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IocmVjb3JkLCBidWlsZGVyKTsKLSAgICAgICAgICAgIHJlY29yZC5tUm91dGVEZXNjcmlwdG9yID0gYnVpbGRlci5idWlsZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSb3V0ZU5hbWUoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICAvLyBSb3V0ZXMgc2hvdWxkIG5vdCBoYXZlIG51bGwgbmFtZXMgYnV0IGl0IG1heSBoYXBwZW4gZm9yIGJhZGx5IGNvbmZpZ3VyZWQKLSAgICAgICAgICAgIC8vIHVzZXIgcm91dGVzLiAgV2UgdG9sZXJhdGUgdGhpcyBieSB1c2luZyBhbiBlbXB0eSBuYW1lIHN0cmluZyBoZXJlIGJ1dAotICAgICAgICAgICAgLy8gc3VjaCB1bm5hbWVkIHJvdXRlcyB3aWxsIGJlIGRpc2NhcmRlZCBieSB0aGUgbWVkaWEgcm91dGVyIHVwc3RyZWFtCi0gICAgICAgICAgICAvLyAod2l0aCBhIGxvZyBtZXNzYWdlIHNvIHdlIGNhbiB0cmFjayBkb3duIHRoZSBwcm9ibGVtKS4KLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBuYW1lID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldE5hbWUocm91dGVPYmosIGdldENvbnRleHQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZSAhPSBudWxsID8gbmFtZS50b1N0cmluZygpIDogIiI7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgICAgIGludCBzdXBwb3J0ZWRUeXBlcyA9IE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXRTdXBwb3J0ZWRUeXBlcygKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgICAgICBpZiAoKHN1cHBvcnRlZFR5cGVzICYgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9MSVZFX0FVRElPKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hZGRDb250cm9sRmlsdGVycyhMSVZFX0FVRElPX0NPTlRST0xfRklMVEVSUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKHN1cHBvcnRlZFR5cGVzICYgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9MSVZFX1ZJREVPKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hZGRDb250cm9sRmlsdGVycyhMSVZFX1ZJREVPX0NPTlRST0xfRklMVEVSUyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0UGxheWJhY2tUeXBlKAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0UGxheWJhY2tUeXBlKHJlY29yZC5tUm91dGVPYmopKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0UGxheWJhY2tTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXRQbGF5YmFja1N0cmVhbShyZWNvcmQubVJvdXRlT2JqKSk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldFZvbHVtZSgKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldFZvbHVtZShyZWNvcmQubVJvdXRlT2JqKSk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldFZvbHVtZU1heCgKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldFZvbHVtZU1heChyZWNvcmQubVJvdXRlT2JqKSk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldFZvbHVtZUhhbmRsaW5nKAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0Vm9sdW1lSGFuZGxpbmcocmVjb3JkLm1Sb3V0ZU9iaikpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlVXNlclJvdXRlUHJvcGVydGllcyhVc2VyUm91dGVSZWNvcmQgcmVjb3JkKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldE5hbWUoCi0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVPYmosIHJlY29yZC5tUm91dGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0UGxheWJhY2tUeXBlKAotICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlT2JqLCByZWNvcmQubVJvdXRlLmdldFBsYXliYWNrVHlwZSgpKTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0UGxheWJhY2tTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVPYmosIHJlY29yZC5tUm91dGUuZ2V0UGxheWJhY2tTdHJlYW0oKSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZSgKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaiwgcmVjb3JkLm1Sb3V0ZS5nZXRWb2x1bWUoKSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZU1heCgKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaiwgcmVjb3JkLm1Sb3V0ZS5nZXRWb2x1bWVNYXgoKSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZUhhbmRsaW5nKAotICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlT2JqLCByZWNvcmQubVJvdXRlLmdldFZvbHVtZUhhbmRsaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBpZiAobUNhbGxiYWNrUmVnaXN0ZXJlZCkgewotICAgICAgICAgICAgICAgIG1DYWxsYmFja1JlZ2lzdGVyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5yZW1vdmVDYWxsYmFjayhtUm91dGVyT2JqLCBtQ2FsbGJhY2tPYmopOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVJvdXRlVHlwZXMgIT0gMCkgewotICAgICAgICAgICAgICAgIG1DYWxsYmFja1JlZ2lzdGVyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLmFkZENhbGxiYWNrKG1Sb3V0ZXJPYmosIG1Sb3V0ZVR5cGVzLCBtQ2FsbGJhY2tPYmopOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVDYWxsYmFja09iaigpIHsKLSAgICAgICAgICAgIHJldHVybiBNZWRpYVJvdXRlckplbGx5YmVhbi5jcmVhdGVDYWxsYmFjayh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlVm9sdW1lQ2FsbGJhY2tPYmooKSB7Ci0gICAgICAgICAgICByZXR1cm4gTWVkaWFSb3V0ZXJKZWxseWJlYW4uY3JlYXRlVm9sdW1lQ2FsbGJhY2sodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZWxlY3RSb3V0ZShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGlmIChtU2VsZWN0Um91dGVXb3JrYXJvdW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0Um91dGVXb3JrYXJvdW5kID0gbmV3IE1lZGlhUm91dGVySmVsbHliZWFuLlNlbGVjdFJvdXRlV29ya2Fyb3VuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNlbGVjdFJvdXRlV29ya2Fyb3VuZC5zZWxlY3RSb3V0ZShtUm91dGVyT2JqLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5BTExfUk9VVEVfVFlQRVMsIHJvdXRlT2JqKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldERlZmF1bHRSb3V0ZSgpIHsKLSAgICAgICAgICAgIGlmIChtR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQgPSBuZXcgTWVkaWFSb3V0ZXJKZWxseWJlYW4uR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1HZXREZWZhdWx0Um91dGVXb3JrYXJvdW5kLmdldERlZmF1bHRSb3V0ZShtUm91dGVyT2JqKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFN5c3RlbVJvdXRlKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgaWYgKHJvdXRlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZEJ5RGVzY3JpcHRvcklkKHJvdXRlLmdldERlc2NyaXB0b3JJZCgpKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGluZGV4KS5tUm91dGVPYmo7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXByZXNlbnRzIGEgcm91dGUgdGhhdCBpcyBwcm92aWRlZCBieSB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlcgotICAgICAgICAgKiBhbmQgcHVibGlzaGVkIGJ5IHRoaXMgcm91dGUgcHJvdmlkZXIgdG8gdGhlIHN1cHBvcnQgbGlicmFyeSBtZWRpYSByb3V0ZXIuCi0gICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNsYXNzIFN5c3RlbVJvdXRlUmVjb3JkIHsKLSAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBPYmplY3QgbVJvdXRlT2JqOwotICAgICAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBtUm91dGVEZXNjcmlwdG9ySWQ7Ci0gICAgICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZURlc2NyaXB0b3IgbVJvdXRlRGVzY3JpcHRvcjsgLy8gYXNzaWduZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgY3JlYXRpb24KLQotICAgICAgICAgICAgcHVibGljIFN5c3RlbVJvdXRlUmVjb3JkKE9iamVjdCByb3V0ZU9iaiwgU3RyaW5nIGlkKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlT2JqID0gcm91dGVPYmo7Ci0gICAgICAgICAgICAgICAgbVJvdXRlRGVzY3JpcHRvcklkID0gaWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVwcmVzZW50cyBhIHJvdXRlIHRoYXQgaXMgcHJvdmlkZWQgYnkgdGhlIHN1cHBvcnQgbGlicmFyeSBtZWRpYSByb3V0ZXIKLSAgICAgICAgICogYW5kIHB1Ymxpc2hlZCBieSB0aGlzIHJvdXRlIHByb3ZpZGVyIHRvIHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjbGFzcyBVc2VyUm91dGVSZWNvcmQgewotICAgICAgICAgICAgcHVibGljIGZpbmFsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBtUm91dGU7Ci0gICAgICAgICAgICBwdWJsaWMgZmluYWwgT2JqZWN0IG1Sb3V0ZU9iajsKLQotICAgICAgICAgICAgcHVibGljIFVzZXJSb3V0ZVJlY29yZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUsIE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgICAgIG1Sb3V0ZSA9IHJvdXRlOwotICAgICAgICAgICAgICAgIG1Sb3V0ZU9iaiA9IHJvdXRlT2JqOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjbGFzcyBTeXN0ZW1Sb3V0ZUNvbnRyb2xsZXIgZXh0ZW5kcyBSb3V0ZUNvbnRyb2xsZXIgewotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbVJvdXRlT2JqOwotCi0gICAgICAgICAgICBwdWJsaWMgU3lzdGVtUm91dGVDb250cm9sbGVyKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgICAgIG1Sb3V0ZU9iaiA9IHJvdXRlT2JqOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2V0Vm9sdW1lKGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8ucmVxdWVzdFNldFZvbHVtZShtUm91dGVPYmosIHZvbHVtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25VcGRhdGVWb2x1bWUoaW50IGRlbHRhKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLnJlcXVlc3RVcGRhdGVWb2x1bWUobVJvdXRlT2JqLCBkZWx0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBKZWxseWJlYW4gTVIxIGltcGxlbWVudGF0aW9uLgotICAgICAqLwotICAgIC8vIEBAUmVxdWlyZXNBcGkoMTcpCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSmVsbHliZWFuTXIxSW1wbCBleHRlbmRzIEplbGx5YmVhbkltcGwKLSAgICAgICAgICAgIGltcGxlbWVudHMgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuQ2FsbGJhY2sgewotICAgICAgICBwcml2YXRlIE1lZGlhUm91dGVySmVsbHliZWFuTXIxLkFjdGl2ZVNjYW5Xb3JrYXJvdW5kIG1BY3RpdmVTY2FuV29ya2Fyb3VuZDsKLSAgICAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5Jc0Nvbm5lY3RpbmdXb3JrYXJvdW5kIG1Jc0Nvbm5lY3RpbmdXb3JrYXJvdW5kOwotCi0gICAgICAgIHB1YmxpYyBKZWxseWJlYW5NcjFJbXBsKENvbnRleHQgY29udGV4dCwgU3luY0NhbGxiYWNrIHN5bmNDYWxsYmFjaykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgc3luY0NhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUHJlc2VudGF0aW9uRGlzcGxheUNoYW5nZWQoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgRGlzcGxheSBuZXdQcmVzZW50YXRpb25EaXNwbGF5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuTXIxLlJvdXRlSW5mby5nZXRQcmVzZW50YXRpb25EaXNwbGF5KHJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICBpbnQgbmV3UHJlc2VudGF0aW9uRGlzcGxheUlkID0gKG5ld1ByZXNlbnRhdGlvbkRpc3BsYXkgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXdQcmVzZW50YXRpb25EaXNwbGF5LmdldERpc3BsYXlJZCgpIDogLTEpOwotICAgICAgICAgICAgICAgIGlmIChuZXdQcmVzZW50YXRpb25EaXNwbGF5SWQKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IHJlY29yZC5tUm91dGVEZXNjcmlwdG9yLmdldFByZXNlbnRhdGlvbkRpc3BsYXlJZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVEZXNjcmlwdG9yID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlcihyZWNvcmQubVJvdXRlRGVzY3JpcHRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKG5ld1ByZXNlbnRhdGlvbkRpc3BsYXlJZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgICAgIHN1cGVyLm9uQnVpbGRTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IocmVjb3JkLCBidWlsZGVyKTsKLQotICAgICAgICAgICAgaWYgKCFNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5Sb3V0ZUluZm8uaXNFbmFibGVkKHJlY29yZC5tUm91dGVPYmopKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGlzQ29ubmVjdGluZyhyZWNvcmQpKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5zZXRDb25uZWN0aW5nKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBEaXNwbGF5IHByZXNlbnRhdGlvbkRpc3BsYXkgPQotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5Sb3V0ZUluZm8uZ2V0UHJlc2VudGF0aW9uRGlzcGxheShyZWNvcmQubVJvdXRlT2JqKTsKLSAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25EaXNwbGF5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLnNldFByZXNlbnRhdGlvbkRpc3BsYXlJZChwcmVzZW50YXRpb25EaXNwbGF5LmdldERpc3BsYXlJZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDYWxsYmFjaygpIHsKLSAgICAgICAgICAgIHN1cGVyLnVwZGF0ZUNhbGxiYWNrKCk7Ci0KLSAgICAgICAgICAgIGlmIChtQWN0aXZlU2Nhbldvcmthcm91bmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1BY3RpdmVTY2FuV29ya2Fyb3VuZCA9IG5ldyBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5BY3RpdmVTY2FuV29ya2Fyb3VuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKSwgZ2V0SGFuZGxlcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1BY3RpdmVTY2FuV29ya2Fyb3VuZC5zZXRBY3RpdmVTY2FuUm91dGVUeXBlcyhtQWN0aXZlU2NhbiA/IG1Sb3V0ZVR5cGVzIDogMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVDYWxsYmFja09iaigpIHsKLSAgICAgICAgICAgIHJldHVybiBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5jcmVhdGVDYWxsYmFjayh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIGlzQ29ubmVjdGluZyhTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQpIHsKLSAgICAgICAgICAgIGlmIChtSXNDb25uZWN0aW5nV29ya2Fyb3VuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUlzQ29ubmVjdGluZ1dvcmthcm91bmQgPSBuZXcgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuSXNDb25uZWN0aW5nV29ya2Fyb3VuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1Jc0Nvbm5lY3RpbmdXb3JrYXJvdW5kLmlzQ29ubmVjdGluZyhyZWNvcmQubVJvdXRlT2JqKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEplbGx5YmVhbiBNUjIgaW1wbGVtZW50YXRpb24uCi0gICAgICovCi0gICAgLy8gQEBSZXF1aXJlc0FwaSgxOCkKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBKZWxseWJlYW5NcjJJbXBsIGV4dGVuZHMgSmVsbHliZWFuTXIxSW1wbCB7Ci0gICAgICAgIHB1YmxpYyBKZWxseWJlYW5NcjJJbXBsKENvbnRleHQgY29udGV4dCwgU3luY0NhbGxiYWNrIHN5bmNDYWxsYmFjaykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgc3luY0NhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgICAgIHN1cGVyLm9uQnVpbGRTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IocmVjb3JkLCBidWlsZGVyKTsKLQotICAgICAgICAgICAgQ2hhclNlcXVlbmNlIGRlc2NyaXB0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuUm91dGVJbmZvLmdldERlc2NyaXB0aW9uKHJlY29yZC5tUm91dGVPYmopOwotICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHNlbGVjdFJvdXRlKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uc2VsZWN0Um91dGUobVJvdXRlck9iaiwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uQUxMX1JPVVRFX1RZUEVTLCByb3V0ZU9iaik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBnZXREZWZhdWx0Um91dGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuZ2V0RGVmYXVsdFJvdXRlKG1Sb3V0ZXJPYmopOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVVzZXJSb3V0ZVByb3BlcnRpZXMoVXNlclJvdXRlUmVjb3JkIHJlY29yZCkgewotICAgICAgICAgICAgc3VwZXIudXBkYXRlVXNlclJvdXRlUHJvcGVydGllcyhyZWNvcmQpOwotCi0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbk1yMi5Vc2VyUm91dGVJbmZvLnNldERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlT2JqLCByZWNvcmQubVJvdXRlLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUNhbGxiYWNrKCkgewotICAgICAgICAgICAgaWYgKG1DYWxsYmFja1JlZ2lzdGVyZWQpIHsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5yZW1vdmVDYWxsYmFjayhtUm91dGVyT2JqLCBtQ2FsbGJhY2tPYmopOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQ2FsbGJhY2tSZWdpc3RlcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuTXIyLmFkZENhbGxiYWNrKG1Sb3V0ZXJPYmosIG1Sb3V0ZVR5cGVzLCBtQ2FsbGJhY2tPYmosCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFMKLSAgICAgICAgICAgICAgICAgICAgfCAobUFjdGl2ZVNjYW4gPyBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU4gOiAwKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNDb25uZWN0aW5nKFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCkgewotICAgICAgICAgICAgcmV0dXJuIE1lZGlhUm91dGVySmVsbHliZWFuTXIyLlJvdXRlSW5mby5pc0Nvbm5lY3RpbmcocmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBcGkyNCBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKi8KLSAgICAvLyBAQFJlcXVpcmVzQXBpKDI0KQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFwaTI0SW1wbCBleHRlbmRzIEplbGx5YmVhbk1yMkltcGwgewotICAgICAgICBwdWJsaWMgQXBpMjRJbXBsKENvbnRleHQgY29udGV4dCwgU3luY0NhbGxiYWNrIHN5bmNDYWxsYmFjaykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgc3luY0NhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgICAgIHN1cGVyLm9uQnVpbGRTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IocmVjb3JkLCBidWlsZGVyKTsKLQotICAgICAgICAgICAgYnVpbGRlci5zZXREZXZpY2VUeXBlKE1lZGlhUm91dGVyQXBpMjQuUm91dGVJbmZvLmdldERldmljZVR5cGUocmVjb3JkLm1Sb3V0ZU9iaikpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL3BhY2thZ2UuaHRtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMmFhZjIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+Ci0KLTxib2R5PgotCi08cD5Db250YWlucyBBUElzIHRoYXQgY29udHJvbCB0aGUgcm91dGluZyBvZiBtZWRpYSBjaGFubmVscyBhbmQgc3RyZWFtcyBmcm9tIHRoZSBjdXJyZW50IGRldmljZQotICB0byBleHRlcm5hbCBzcGVha2VycyBhbmQgZGVzdGluYXRpb24gZGV2aWNlcy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L0Jhc2VMYXlvdXQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L0Jhc2VMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI2NDcxZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9CYXNlTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC53aWRnZXQ7Ci0KLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZpZXdHcm91cFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtczsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLk1hcmdpbkxheW91dFBhcmFtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBCYXNlTGF5b3V0IGV4dGVuZHMgVmlld0dyb3VwSW1wbCB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3R3JvdXAgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgVmlld0dyb3VwUHJvdmlkZXIgbVN1cGVyUHJvdmlkZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3R3JvdXBQcm92aWRlciBtUHJpdmF0ZVByb3ZpZGVyOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8Vmlldz4gbU1hdGNoUGFyZW50Q2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PD4oMSk7Ci0KLSAgICBwdWJsaWMgQmFzZUxheW91dChWaWV3R3JvdXAgaW5zdGFuY2UsCi0gICAgICAgICAgICBWaWV3R3JvdXBQcm92aWRlciBzdXBlclByb3ZpZGVyLCBWaWV3R3JvdXBQcm92aWRlciBwcml2YXRlUHJvdmlkZXIpIHsKLSAgICAgICAgc3VwZXIoaW5zdGFuY2UsIHN1cGVyUHJvdmlkZXIsIHByaXZhdGVQcm92aWRlcik7Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICBtU3VwZXJQcm92aWRlciA9IHN1cGVyUHJvdmlkZXI7Ci0gICAgICAgIG1Qcml2YXRlUHJvdmlkZXIgPSBwcml2YXRlUHJvdmlkZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY2hlY2tMYXlvdXRQYXJhbXNfaW1wbChMYXlvdXRQYXJhbXMgcCkgewotICAgICAgICByZXR1cm4gcCBpbnN0YW5jZW9mIE1hcmdpbkxheW91dFBhcmFtczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGF5b3V0UGFyYW1zIGdlbmVyYXRlRGVmYXVsdExheW91dFBhcmFtc19pbXBsKCkgewotICAgICAgICByZXR1cm4gbmV3IE1hcmdpbkxheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULCBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zX2ltcGwoQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWFyZ2luTGF5b3V0UGFyYW1zKG1JbnN0YW5jZS5nZXRDb250ZXh0KCksIGF0dHJzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zX2ltcGwoTGF5b3V0UGFyYW1zIGxwKSB7Ci0gICAgICAgIGlmIChscCBpbnN0YW5jZW9mIE1hcmdpbkxheW91dFBhcmFtcykgewotICAgICAgICAgICAgcmV0dXJuIGxwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTWFyZ2luTGF5b3V0UGFyYW1zKGxwKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbk1lYXN1cmVfaW1wbChpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7Ci0gICAgICAgIGludCBjb3VudCA9IG1JbnN0YW5jZS5nZXRDaGlsZENvdW50KCk7Ci0KLSAgICAgICAgZmluYWwgYm9vbGVhbiBtZWFzdXJlTWF0Y2hQYXJlbnRDaGlsZHJlbiA9Ci0gICAgICAgICAgICAgICAgVmlldy5NZWFzdXJlU3BlYy5nZXRNb2RlKHdpZHRoTWVhc3VyZVNwZWMpICE9IFZpZXcuTWVhc3VyZVNwZWMuRVhBQ1RMWSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgVmlldy5NZWFzdXJlU3BlYy5nZXRNb2RlKGhlaWdodE1lYXN1cmVTcGVjKSAhPSBWaWV3Lk1lYXN1cmVTcGVjLkVYQUNUTFk7Ci0gICAgICAgIG1NYXRjaFBhcmVudENoaWxkcmVuLmNsZWFyKCk7Ci0KLSAgICAgICAgaW50IG1heEhlaWdodCA9IDA7Ci0gICAgICAgIGludCBtYXhXaWR0aCA9IDA7Ci0gICAgICAgIGludCBjaGlsZFN0YXRlID0gMDsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBtSW5zdGFuY2UuZ2V0Q2hpbGRBdChpKTsKLSAgICAgICAgICAgIGlmIChjaGlsZC5nZXRWaXNpYmlsaXR5KCkgIT0gVmlldy5HT05FKSB7Ci0gICAgICAgICAgICAgICAgbVByaXZhdGVQcm92aWRlci5tZWFzdXJlQ2hpbGRXaXRoTWFyZ2luc19pbXBsKAotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQsIHdpZHRoTWVhc3VyZVNwZWMsIDAsIGhlaWdodE1lYXN1cmVTcGVjLCAwKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBNYXJnaW5MYXlvdXRQYXJhbXMgbHAgPSAoTWFyZ2luTGF5b3V0UGFyYW1zKSBjaGlsZC5nZXRMYXlvdXRQYXJhbXMoKTsKLSAgICAgICAgICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpICsgbHAubGVmdE1hcmdpbiArIGxwLnJpZ2h0TWFyZ2luKTsKLSAgICAgICAgICAgICAgICBtYXhIZWlnaHQgPSBNYXRoLm1heChtYXhIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5nZXRNZWFzdXJlZEhlaWdodCgpICsgbHAudG9wTWFyZ2luICsgbHAuYm90dG9tTWFyZ2luKTsKLSAgICAgICAgICAgICAgICBjaGlsZFN0YXRlID0gY2hpbGRTdGF0ZSB8IGNoaWxkLmdldE1lYXN1cmVkU3RhdGUoKTsKLSAgICAgICAgICAgICAgICBpZiAobWVhc3VyZU1hdGNoUGFyZW50Q2hpbGRyZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxwLndpZHRoID09IExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC5oZWlnaHQgPT0gTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1hdGNoUGFyZW50Q2hpbGRyZW4uYWRkKGNoaWxkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFjY291bnQgZm9yIHBhZGRpbmcgdG9vCi0gICAgICAgIG1heFdpZHRoICs9IGdldFBhZGRpbmdMZWZ0V2l0aEZvcmVncm91bmQoKSArIGdldFBhZGRpbmdSaWdodFdpdGhGb3JlZ3JvdW5kKCk7Ci0gICAgICAgIG1heEhlaWdodCArPSBnZXRQYWRkaW5nVG9wV2l0aEZvcmVncm91bmQoKSArIGdldFBhZGRpbmdCb3R0b21XaXRoRm9yZWdyb3VuZCgpOwotCi0gICAgICAgIC8vIENoZWNrIGFnYWluc3Qgb3VyIG1pbmltdW0gaGVpZ2h0IGFuZCB3aWR0aAotICAgICAgICBtYXhIZWlnaHQgPSBNYXRoLm1heChtYXhIZWlnaHQsIG1Qcml2YXRlUHJvdmlkZXIuZ2V0U3VnZ2VzdGVkTWluaW11bUhlaWdodF9pbXBsKCkpOwotICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLCBtUHJpdmF0ZVByb3ZpZGVyLmdldFN1Z2dlc3RlZE1pbmltdW1XaWR0aF9pbXBsKCkpOwotCi0gICAgICAgIC8vIENoZWNrIGFnYWluc3Qgb3VyIGZvcmVncm91bmQncyBtaW5pbXVtIGhlaWdodCBhbmQgd2lkdGgKLSAgICAgICAgZmluYWwgRHJhd2FibGUgZHJhd2FibGUgPSBtSW5zdGFuY2UuZ2V0Rm9yZWdyb3VuZCgpOwotICAgICAgICBpZiAoZHJhd2FibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgbWF4SGVpZ2h0ID0gTWF0aC5tYXgobWF4SGVpZ2h0LCBkcmF3YWJsZS5nZXRNaW5pbXVtSGVpZ2h0KCkpOwotICAgICAgICAgICAgbWF4V2lkdGggPSBNYXRoLm1heChtYXhXaWR0aCwgZHJhd2FibGUuZ2V0TWluaW11bVdpZHRoKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVByaXZhdGVQcm92aWRlci5zZXRNZWFzdXJlZERpbWVuc2lvbl9pbXBsKAotICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5yZXNvbHZlU2l6ZUFuZFN0YXRlKG1heFdpZHRoLCB3aWR0aE1lYXN1cmVTcGVjLCBjaGlsZFN0YXRlKSwKLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UucmVzb2x2ZVNpemVBbmRTdGF0ZShtYXhIZWlnaHQsIGhlaWdodE1lYXN1cmVTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRTdGF0ZSA8PCBWaWV3Lk1FQVNVUkVEX0hFSUdIVF9TVEFURV9TSElGVCkpOwotCi0gICAgICAgIGNvdW50ID0gbU1hdGNoUGFyZW50Q2hpbGRyZW4uc2l6ZSgpOwotICAgICAgICBpZiAoY291bnQgPiAxKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gbU1hdGNoUGFyZW50Q2hpbGRyZW4uZ2V0KGkpOwotICAgICAgICAgICAgICAgIGZpbmFsIE1hcmdpbkxheW91dFBhcmFtcyBscCA9IChNYXJnaW5MYXlvdXRQYXJhbXMpIGNoaWxkLmdldExheW91dFBhcmFtcygpOwotCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IGNoaWxkV2lkdGhNZWFzdXJlU3BlYzsKLSAgICAgICAgICAgICAgICBpZiAobHAud2lkdGggPT0gTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBNYXRoLm1heCgwLCBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRXaWR0aCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBnZXRQYWRkaW5nTGVmdFdpdGhGb3JlZ3JvdW5kKCkgLSBnZXRQYWRkaW5nUmlnaHRXaXRoRm9yZWdyb3VuZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBscC5sZWZ0TWFyZ2luIC0gbHAucmlnaHRNYXJnaW4pOwotICAgICAgICAgICAgICAgICAgICBjaGlsZFdpZHRoTWVhc3VyZVNwZWMgPSBWaWV3Lk1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgVmlldy5NZWFzdXJlU3BlYy5FWEFDVExZKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjaGlsZFdpZHRoTWVhc3VyZVNwZWMgPSBtSW5zdGFuY2UuZ2V0Q2hpbGRNZWFzdXJlU3BlYyh3aWR0aE1lYXN1cmVTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBhZGRpbmdMZWZ0V2l0aEZvcmVncm91bmQoKSArIGdldFBhZGRpbmdSaWdodFdpdGhGb3JlZ3JvdW5kKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAubGVmdE1hcmdpbiArIGxwLnJpZ2h0TWFyZ2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLndpZHRoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY2hpbGRIZWlnaHRNZWFzdXJlU3BlYzsKLSAgICAgICAgICAgICAgICBpZiAobHAuaGVpZ2h0ID09IExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IE1hdGgubWF4KDAsIG1JbnN0YW5jZS5nZXRNZWFzdXJlZEhlaWdodCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBnZXRQYWRkaW5nVG9wV2l0aEZvcmVncm91bmQoKSAtIGdldFBhZGRpbmdCb3R0b21XaXRoRm9yZWdyb3VuZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBscC50b3BNYXJnaW4gLSBscC5ib3R0b21NYXJnaW4pOwotICAgICAgICAgICAgICAgICAgICBjaGlsZEhlaWdodE1lYXN1cmVTcGVjID0gVmlldy5NZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCBWaWV3Lk1lYXN1cmVTcGVjLkVYQUNUTFkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkSGVpZ2h0TWVhc3VyZVNwZWMgPSBtSW5zdGFuY2UuZ2V0Q2hpbGRNZWFzdXJlU3BlYyhoZWlnaHRNZWFzdXJlU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQYWRkaW5nVG9wV2l0aEZvcmVncm91bmQoKSArIGdldFBhZGRpbmdCb3R0b21XaXRoRm9yZWdyb3VuZCgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLnRvcE1hcmdpbiArIGxwLmJvdHRvbU1hcmdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC5oZWlnaHQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNoaWxkLm1lYXN1cmUoY2hpbGRXaWR0aE1lYXN1cmVTcGVjLCBjaGlsZEhlaWdodE1lYXN1cmVTcGVjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uTGF5b3V0X2ltcGwoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKSB7Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1JbnN0YW5jZS5nZXRDaGlsZENvdW50KCk7Ci0KLSAgICAgICAgZmluYWwgaW50IHBhcmVudExlZnQgPSBnZXRQYWRkaW5nTGVmdFdpdGhGb3JlZ3JvdW5kKCk7Ci0gICAgICAgIGZpbmFsIGludCBwYXJlbnRSaWdodCA9IHJpZ2h0IC0gbGVmdCAtIGdldFBhZGRpbmdSaWdodFdpdGhGb3JlZ3JvdW5kKCk7Ci0KLSAgICAgICAgZmluYWwgaW50IHBhcmVudFRvcCA9IGdldFBhZGRpbmdUb3BXaXRoRm9yZWdyb3VuZCgpOwotICAgICAgICBmaW5hbCBpbnQgcGFyZW50Qm90dG9tID0gYm90dG9tIC0gdG9wIC0gZ2V0UGFkZGluZ0JvdHRvbVdpdGhGb3JlZ3JvdW5kKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gbUluc3RhbmNlLmdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBpZiAoY2hpbGQuZ2V0VmlzaWJpbGl0eSgpICE9IFZpZXcuR09ORSkgewotICAgICAgICAgICAgICAgIGZpbmFsIE1hcmdpbkxheW91dFBhcmFtcyBscCA9IChNYXJnaW5MYXlvdXRQYXJhbXMpIGNoaWxkLmdldExheW91dFBhcmFtcygpOwotCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IHdpZHRoID0gY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBjaGlsZC5nZXRNZWFzdXJlZEhlaWdodCgpOwotCi0gICAgICAgICAgICAgICAgaW50IGNoaWxkTGVmdDsKLSAgICAgICAgICAgICAgICBpbnQgY2hpbGRUb3A7Ci0KLSAgICAgICAgICAgICAgICBjaGlsZExlZnQgPSBwYXJlbnRMZWZ0ICsgKHBhcmVudFJpZ2h0IC0gcGFyZW50TGVmdCAtIHdpZHRoKSAvIDIgKwotICAgICAgICAgICAgICAgICAgICAgICAgbHAubGVmdE1hcmdpbiAtIGxwLnJpZ2h0TWFyZ2luOwotCi0gICAgICAgICAgICAgICAgY2hpbGRUb3AgPSBwYXJlbnRUb3AgKyAocGFyZW50Qm90dG9tIC0gcGFyZW50VG9wIC0gaGVpZ2h0KSAvIDIgKwotICAgICAgICAgICAgICAgICAgICAgICAgbHAudG9wTWFyZ2luIC0gbHAuYm90dG9tTWFyZ2luOwotCi0gICAgICAgICAgICAgICAgY2hpbGQubGF5b3V0KGNoaWxkTGVmdCwgY2hpbGRUb3AsIGNoaWxkTGVmdCArIHdpZHRoLCBjaGlsZFRvcCArIGhlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGREZWxheUNoaWxkUHJlc3NlZFN0YXRlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRQYWRkaW5nTGVmdFdpdGhGb3JlZ3JvdW5kKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlLmlzRm9yZWdyb3VuZEluc2lkZVBhZGRpbmcoKSA/IE1hdGgubWF4KG1JbnN0YW5jZS5nZXRQYWRkaW5nTGVmdCgpLCAwKSA6Ci0gICAgICAgICAgICAgICAgbUluc3RhbmNlLmdldFBhZGRpbmdMZWZ0KCkgKyAwOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldFBhZGRpbmdSaWdodFdpdGhGb3JlZ3JvdW5kKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlLmlzRm9yZWdyb3VuZEluc2lkZVBhZGRpbmcoKSA/IE1hdGgubWF4KG1JbnN0YW5jZS5nZXRQYWRkaW5nUmlnaHQoKSwgMCkgOgotICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5nZXRQYWRkaW5nUmlnaHQoKSArIDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0UGFkZGluZ1RvcFdpdGhGb3JlZ3JvdW5kKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlLmlzRm9yZWdyb3VuZEluc2lkZVBhZGRpbmcoKSA/IE1hdGgubWF4KG1JbnN0YW5jZS5nZXRQYWRkaW5nVG9wKCksIDApIDoKLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UuZ2V0UGFkZGluZ1RvcCgpICsgMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRQYWRkaW5nQm90dG9tV2l0aEZvcmVncm91bmQoKSB7Ci0gICAgICAgIHJldHVybiBtSW5zdGFuY2UuaXNGb3JlZ3JvdW5kSW5zaWRlUGFkZGluZygpID8gTWF0aC5tYXgobUluc3RhbmNlLmdldFBhZGRpbmdCb3R0b20oKSwgMCkgOgotICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5nZXRQYWRkaW5nQm90dG9tKCkgKyAwOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L01lZGlhQ29udHJvbFZpZXcySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvTWVkaWFDb250cm9sVmlldzJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZmYxNTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvTWVkaWFDb250cm9sVmlldzJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGE7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhQ29udHJvbGxlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFDb250cm9sVmlldzJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5WaWV3R3JvdXBQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTWVkaWFDb250cm9sVmlldzI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuUHJvZ3Jlc3NCYXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuUG9wdXBXaW5kb3c7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVsYXRpdmVMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Vla0JhcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyLk9uU2Vla0JhckNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5NZWRpYVJvdXRlQnV0dG9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkZvcm1hdHRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1wdWJsaWMgY2xhc3MgTWVkaWFDb250cm9sVmlldzJJbXBsIGV4dGVuZHMgQmFzZUxheW91dCBpbXBsZW1lbnRzIE1lZGlhQ29udHJvbFZpZXcyUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFDb250cm9sVmlldzIiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYUNvbnRyb2xWaWV3MiBtSW5zdGFuY2U7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1VNRU5UX0tFWV9GVUxMU0NSRUVOID0gImZ1bGxTY3JlZW4iOwotCi0gICAgLy8gVE9ETzogTW92ZSB0aGVzZSBjb25zdGFudHMgdG8gcHVibGljIGFwaSB0byBzdXBwb3J0IGN1c3RvbSB2aWRlbyB2aWV3LgotICAgIC8vIFRPRE86IENvbWJpbmUgdGhlc2UgY29uc3RhbnRzIGludG8gb25lIHJlZ2FyZGluZyBUcmFja0luZm8uCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVklERU9fVFJBQ0tfQ09VTlQgPSAiVmlkZW9UcmFja0NvdW50IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BVURJT19UUkFDS19DT1VOVCA9ICJBdWRpb1RyYWNrQ291bnQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NVQlRJVExFX1RSQUNLX0NPVU5UID0gIlN1YnRpdGxlVHJhY2tDb3VudCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUExBWUJBQ0tfU1BFRUQgPSAiUGxheWJhY2tTcGVlZCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VMRUNURURfQVVESU9fSU5ERVggPSAiU2VsZWN0ZWRBdWRpb0luZGV4IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TRUxFQ1RFRF9TVUJUSVRMRV9JTkRFWCA9ICJTZWxlY3RlZFN1YnRpdGxlSW5kZXgiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfVVBEQVRFX1RSQUNLX1NUQVRVUyA9ICJVcGRhdGVUcmFja1N0YXR1cyI7Ci0KLSAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyBvbmNlIGludGVncmF0aW5nIHdpdGggTWVkaWFTZXNzaW9uMiAmIE1lZGlhTWV0YWRhdGEyCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU1RBVEVfSVNfQURWRVJUSVNFTUVOVCA9ICJNZWRpYVR5cGVBZHZlcnRpc2VtZW50IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX1VQREFURV9NRURJQV9UWVBFX1NUQVRVUyA9ICJVcGRhdGVNZWRpYVR5cGVTdGF0dXMiOwotCi0gICAgLy8gU3RyaW5nIGZvciBzZW5kaW5nIGNvbW1hbmQgdG8gc2hvdyBzdWJ0aXRsZSB0byBNZWRpYVNlc3Npb24uCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX1NIT1dfU1VCVElUTEUgPSAic2hvd1N1YnRpdGxlIjsKLSAgICAvLyBTdHJpbmcgZm9yIHNlbmRpbmcgY29tbWFuZCB0byBoaWRlIHN1YnRpdGxlIHRvIE1lZGlhU2Vzc2lvbi4KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfSElERV9TVUJUSVRMRSA9ICJoaWRlU3VidGl0bGUiOwotICAgIC8vIFRPRE86IHJlbW92ZSBvbmNlIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyByZXZpc2VkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9TRVRfRlVMTFNDUkVFTiA9ICJzZXRGdWxsc2NyZWVuIjsKLSAgICAvLyBTdHJpbmcgZm9yIHNlbmRpbmcgY29tbWFuZCB0byBzZWxlY3QgYXVkaW8gdHJhY2sgdG8gTWVkaWFTZXNzaW9uLgotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9TRUxFQ1RfQVVESU9fVFJBQ0sgPSAiU2VsZWN0VHJhY2siOwotICAgIC8vIFN0cmluZyBmb3Igc2VuZGluZyBjb21tYW5kIHRvIHNldCBwbGF5YmFjayBzcGVlZCB0byBNZWRpYVNlc3Npb24uCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX1NFVF9QTEFZQkFDS19TUEVFRCA9ICJTZXRQbGF5YmFja1NwZWVkIjsKLSAgICAvLyBTdHJpbmcgZm9yIHNlbmRpbmcgY29tbWFuZCB0byBtdXRlIGF1ZGlvIHRvIE1lZGlhU2Vzc2lvbi4KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfTVVURT0gIk11dGUiOwotICAgIC8vIFN0cmluZyBmb3Igc2VuZGluZyBjb21tYW5kIHRvIHVubXV0ZSBhdWRpbyB0byBNZWRpYVNlc3Npb24uCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX1VOTVVURSA9ICJVbm11dGUiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVFRJTkdTX01PREVfQVVESU9fVFJBQ0sgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVRUSU5HU19NT0RFX1BMQVlCQUNLX1NQRUVEID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUVElOR1NfTU9ERV9IRUxQID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUVElOR1NfTU9ERV9TVUJUSVRMRV9UUkFDSyA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVFRJTkdTX01PREVfVklERU9fUVVBTElUWSA9IDQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVFRJTkdTX01PREVfTUFJTiA9IDU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1NQRUVEXzF4X0lOREVYID0gMzsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRURJQV9UWVBFX0RFRkFVTFQgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRURJQV9UWVBFX01VU0lDID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVESUFfVFlQRV9BRFZFUlRJU0VNRU5UID0gMjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpFX1RZUEVfRU1CRURERUQgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpFX1RZUEVfRlVMTCA9IDE7Ci0gICAgLy8gVE9ETzogYWRkIHN1cHBvcnQgZm9yIE1pbmltYWwgc2l6ZSB0eXBlLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpFX1RZUEVfTUlOSU1BTCA9IDI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1BST0dSRVNTID0gMTAwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9QUk9HUkVTU19VUERBVEVfVElNRV9NUyA9IDEwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFV0lORF9USU1FX01TID0gMTAwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZPUldBUkRfVElNRV9NUyA9IDMwMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRF9TS0lQX1dBSVRfVElNRV9NUyA9IDUwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFU09VUkNFX05PTl9FWElTVEVOVCA9IC0xOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9FTVBUWSA9ICIiOwotCi0gICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlc291cmNlczsKLSAgICBwcml2YXRlIE1lZGlhQ29udHJvbGxlciBtQ29udHJvbGxlcjsKLSAgICBwcml2YXRlIE1lZGlhQ29udHJvbGxlci5UcmFuc3BvcnRDb250cm9scyBtQ29udHJvbHM7Ci0gICAgcHJpdmF0ZSBQbGF5YmFja1N0YXRlIG1QbGF5YmFja1N0YXRlOwotICAgIHByaXZhdGUgTWVkaWFNZXRhZGF0YSBtTWV0YWRhdGE7Ci0gICAgcHJpdmF0ZSBpbnQgbUR1cmF0aW9uOwotICAgIHByaXZhdGUgaW50IG1QcmV2U3RhdGU7Ci0gICAgcHJpdmF0ZSBpbnQgbVByZXZXaWR0aDsKLSAgICBwcml2YXRlIGludCBtUHJldkhlaWdodDsKLSAgICBwcml2YXRlIGludCBtT3JpZ2luYWxMZWZ0QmFyV2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbVZpZGVvVHJhY2tDb3VudDsKLSAgICBwcml2YXRlIGludCBtQXVkaW9UcmFja0NvdW50OwotICAgIHByaXZhdGUgaW50IG1TdWJ0aXRsZVRyYWNrQ291bnQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVNldHRpbmdzTW9kZTsKLSAgICBwcml2YXRlIGludCBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXg7Ci0gICAgcHJpdmF0ZSBpbnQgbVNlbGVjdGVkQXVkaW9UcmFja0luZGV4OwotICAgIHByaXZhdGUgaW50IG1TZWxlY3RlZFZpZGVvUXVhbGl0eUluZGV4OwotICAgIHByaXZhdGUgaW50IG1TZWxlY3RlZFNwZWVkSW5kZXg7Ci0gICAgcHJpdmF0ZSBpbnQgbUVtYmVkZGVkU2V0dGluZ3NJdGVtV2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbUZ1bGxTZXR0aW5nc0l0ZW1XaWR0aDsKLSAgICBwcml2YXRlIGludCBtRW1iZWRkZWRTZXR0aW5nc0l0ZW1IZWlnaHQ7Ci0gICAgcHJpdmF0ZSBpbnQgbUZ1bGxTZXR0aW5nc0l0ZW1IZWlnaHQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVNldHRpbmdzV2luZG93TWFyZ2luOwotICAgIHByaXZhdGUgaW50IG1NZWRpYVR5cGU7Ci0gICAgcHJpdmF0ZSBpbnQgbVNpemVUeXBlOwotICAgIHByaXZhdGUgbG9uZyBtUGxheWJhY2tBY3Rpb25zOwotICAgIHByaXZhdGUgYm9vbGVhbiBtRHJhZ2dpbmc7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc0Z1bGxTY3JlZW47Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1PdmVyZmxvd0V4cGFuZGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNTdG9wcGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBtU3VidGl0bGVJc0VuYWJsZWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1TZWVrQXZhaWxhYmxlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNBZHZlcnRpc2VtZW50OwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNNdXRlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtTmVlZFVYVXBkYXRlOwotCi0gICAgLy8gUmVsYXRpbmcgdG8gVGl0bGUgQmFyIFZpZXcKLSAgICBwcml2YXRlIFZpZXdHcm91cCBtUm9vdDsKLSAgICBwcml2YXRlIFZpZXcgbVRpdGxlQmFyOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVRpdGxlVmlldzsKLSAgICBwcml2YXRlIFZpZXcgbUFkRXh0ZXJuYWxMaW5rOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbUJhY2tCdXR0b247Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlQnV0dG9uIG1Sb3V0ZUJ1dHRvbjsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtUm91dGVTZWxlY3RvcjsKLQotICAgIC8vIFJlbGF0aW5nIHRvIENlbnRlciBWaWV3Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUNlbnRlclZpZXc7Ci0gICAgcHJpdmF0ZSBWaWV3IG1UcmFuc3BvcnRDb250cm9sczsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1QbGF5UGF1c2VCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtRmZ3ZEJ1dHRvbjsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1SZXdCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtTmV4dEJ1dHRvbjsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1QcmV2QnV0dG9uOwotCi0gICAgLy8gUmVsYXRpbmcgdG8gTWluaW1hbCBFeHRyYSBWaWV3Ci0gICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbU1pbmltYWxFeHRyYVZpZXc7Ci0KLSAgICAvLyBSZWxhdGluZyB0byBQcm9ncmVzcyBCYXIgVmlldwotICAgIHByaXZhdGUgUHJvZ3Jlc3NCYXIgbVByb2dyZXNzOwotICAgIHByaXZhdGUgVmlldyBtUHJvZ3Jlc3NCdWZmZXI7Ci0KLSAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyIFZpZXcKLSAgICBwcml2YXRlIFZpZXdHcm91cCBtQm90dG9tQmFyOwotCi0gICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhciBMZWZ0IFZpZXcKLSAgICBwcml2YXRlIFZpZXdHcm91cCBtQm90dG9tQmFyTGVmdFZpZXc7Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbVRpbWVWaWV3OwotICAgIHByaXZhdGUgVGV4dFZpZXcgbUVuZFRpbWU7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtQ3VycmVudFRpbWU7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtQWRTa2lwVmlldzsKLSAgICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgbUZvcm1hdEJ1aWxkZXI7Ci0gICAgcHJpdmF0ZSBGb3JtYXR0ZXIgbUZvcm1hdHRlcjsKLQotICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIgUmlnaHQgVmlldwotICAgIHByaXZhdGUgVmlld0dyb3VwIG1Cb3R0b21CYXJSaWdodFZpZXc7Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUJhc2ljQ29udHJvbHM7Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUV4dHJhQ29udHJvbHM7Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUN1c3RvbUJ1dHRvbnM7Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtU3VidGl0bGVCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtRnVsbFNjcmVlbkJ1dHRvbjsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1PdmVyZmxvd0J1dHRvblJpZ2h0OwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbU92ZXJmbG93QnV0dG9uTGVmdDsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1NdXRlQnV0dG9uOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbVZpZGVvUXVhbGl0eUJ1dHRvbjsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1TZXR0aW5nc0J1dHRvbjsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1BZFJlbWFpbmluZ1ZpZXc7Ci0KLSAgICAvLyBSZWxhdGluZyB0byBTZXR0aW5ncyBMaXN0IFZpZXcKLSAgICBwcml2YXRlIExpc3RWaWV3IG1TZXR0aW5nc0xpc3RWaWV3OwotICAgIHByaXZhdGUgUG9wdXBXaW5kb3cgbVNldHRpbmdzV2luZG93OwotICAgIHByaXZhdGUgU2V0dGluZ3NBZGFwdGVyIG1TZXR0aW5nc0FkYXB0ZXI7Ci0gICAgcHJpdmF0ZSBTdWJTZXR0aW5nc0FkYXB0ZXIgbVN1YlNldHRpbmdzQWRhcHRlcjsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtU2V0dGluZ3NNYWluVGV4dHNMaXN0OwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1TZXR0aW5nc1N1YlRleHRzTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8SW50ZWdlcj4gbVNldHRpbmdzSWNvbklkc0xpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVN1YnRpdGxlRGVzY3JpcHRpb25zTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtQXVkaW9UcmFja0xpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVZpZGVvUXVhbGl0eUxpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVBsYXliYWNrU3BlZWRUZXh0TGlzdDsKLSAgICBwcml2YXRlIExpc3Q8RmxvYXQ+IG1QbGF5YmFja1NwZWVkTGlzdDsKLQotICAgIHB1YmxpYyBNZWRpYUNvbnRyb2xWaWV3MkltcGwoTWVkaWFDb250cm9sVmlldzIgaW5zdGFuY2UsCi0gICAgICAgICAgICBWaWV3R3JvdXBQcm92aWRlciBzdXBlclByb3ZpZGVyLCBWaWV3R3JvdXBQcm92aWRlciBwcml2YXRlUHJvdmlkZXIpIHsKLSAgICAgICAgc3VwZXIoaW5zdGFuY2UsIHN1cGVyUHJvdmlkZXIsIHByaXZhdGVQcm92aWRlcik7Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoQE51bGxhYmxlIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7Ci0gICAgICAgIG1SZXNvdXJjZXMgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOwotICAgICAgICAvLyBJbmZsYXRlIE1lZGlhQ29udHJvbFZpZXcyIGZyb20gWE1MCi0gICAgICAgIG1Sb290ID0gbWFrZUNvbnRyb2xsZXJWaWV3KCk7Ci0gICAgICAgIG1JbnN0YW5jZS5hZGRWaWV3KG1Sb290KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRNZWRpYVNlc3Npb25Ub2tlbl9pbXBsKFNlc3Npb25Ub2tlbjIgdG9rZW4pIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRPbkZ1bGxTY3JlZW5MaXN0ZW5lcl9pbXBsKE1lZGlhQ29udHJvbFZpZXcyLk9uRnVsbFNjcmVlbkxpc3RlbmVyIGwpIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRDb250cm9sbGVyX2ltcGwoTWVkaWFDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgbUNvbnRyb2xsZXIgPSBjb250cm9sbGVyOwotICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ29udHJvbHMgPSBjb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCk7Ci0gICAgICAgICAgICAvLyBTZXQgbU1ldGFkYXRhIGFuZCBtUGxheWJhY2tTdGF0ZSB0byBleGlzdGluZyBNZWRpYVNlc3Npb24gdmFyaWFibGVzIHNpbmNlIHRoZXkgbWF5Ci0gICAgICAgICAgICAvLyBiZSBjYWxsZWQgYmVmb3JlIHRoZSBjYWxsYmFjayBpcyBjYWxsZWQKLSAgICAgICAgICAgIG1QbGF5YmFja1N0YXRlID0gbUNvbnRyb2xsZXIuZ2V0UGxheWJhY2tTdGF0ZSgpOwotICAgICAgICAgICAgbU1ldGFkYXRhID0gbUNvbnRyb2xsZXIuZ2V0TWV0YWRhdGEoKTsKLSAgICAgICAgICAgIHVwZGF0ZUR1cmF0aW9uKCk7Ci0gICAgICAgICAgICB1cGRhdGVUaXRsZSgpOwotCi0gICAgICAgICAgICBtQ29udHJvbGxlci5yZWdpc3RlckNhbGxiYWNrKG5ldyBNZWRpYUNvbnRyb2xsZXJDYWxsYmFjaygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEJ1dHRvblZpc2liaWxpdHlfaW1wbChpbnQgYnV0dG9uLCBpbnQgdmlzaWJpbGl0eSkgewotICAgICAgICAvLyBUT0RPOiBhZGQgbWVtYmVyIHZhcmlhYmxlcyBmb3IgRmFzdC1Gb3J3YXJkL1BydmlvdXMvUmV3aW5kIGJ1dHRvbnMgdG8gc2F2ZSB2aXNpYmlsaXR5IGluCi0gICAgICAgIC8vIG9yZGVyIHRvIHByZXZlbnQgYmVpbmcgb3ZlcnJpZGVuIGluc2lkZSB1cGRhdGVMYXlvdXQoKS4KLSAgICAgICAgc3dpdGNoIChidXR0b24pIHsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX1BMQVlfUEFVU0U6Ci0gICAgICAgICAgICAgICAgaWYgKG1QbGF5UGF1c2VCdXR0b24gIT0gbnVsbCAmJiBjYW5QYXVzZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9GRldEOgotICAgICAgICAgICAgICAgIGlmIChtRmZ3ZEJ1dHRvbiAhPSBudWxsICYmIGNhblNlZWtGb3J3YXJkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUZmd2RCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9SRVc6Ci0gICAgICAgICAgICAgICAgaWYgKG1SZXdCdXR0b24gIT0gbnVsbCAmJiBjYW5TZWVrQmFja3dhcmQoKSkgewotICAgICAgICAgICAgICAgICAgICBtUmV3QnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fTkVYVDoKLSAgICAgICAgICAgICAgICBpZiAobU5leHRCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX1BSRVY6Ci0gICAgICAgICAgICAgICAgaWYgKG1QcmV2QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVByZXZCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9TVUJUSVRMRToKLSAgICAgICAgICAgICAgICBpZiAobVN1YnRpdGxlQnV0dG9uICE9IG51bGwgJiYgbVN1YnRpdGxlVHJhY2tDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fRlVMTF9TQ1JFRU46Ci0gICAgICAgICAgICAgICAgaWYgKG1GdWxsU2NyZWVuQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9PVkVSRkxPVzoKLSAgICAgICAgICAgICAgICBpZiAobU92ZXJmbG93QnV0dG9uUmlnaHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtT3ZlcmZsb3dCdXR0b25SaWdodC5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX01VVEU6Ci0gICAgICAgICAgICAgICAgaWYgKG1NdXRlQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbU11dGVCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9TRVRUSU5HUzoKLSAgICAgICAgICAgICAgICBpZiAobVNldHRpbmdzQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RQbGF5QnV0dG9uRm9jdXNfaW1wbCgpIHsKLSAgICAgICAgaWYgKG1QbGF5UGF1c2VCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5yZXF1ZXN0Rm9jdXMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0QWNjZXNzaWJpbGl0eUNsYXNzTmFtZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gTWVkaWFDb250cm9sVmlldzIuY2xhc3MuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudF9pbXBsKE1vdGlvbkV2ZW50IGV2KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBTaG91bGQgdGhpcyBmdW5jdGlvbiBiZSByZW1vdmVkPwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uVHJhY2tiYWxsRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25NZWFzdXJlX2ltcGwoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgewotICAgICAgICBzdXBlci5vbk1lYXN1cmVfaW1wbCh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7Ci0KLSAgICAgICAgLy8gVXBkYXRlIGxheW91dCB3aGVuIHRoaXMgdmlldydzIHdpZHRoIGNoYW5nZXMgaW4gb3JkZXIgdG8gYXZvaWQgYW55IFVJIG92ZXJsYXAgYmV0d2VlbgotICAgICAgICAvLyB0cmFuc3BvcnQgY29udHJvbHMuCi0gICAgICAgIGlmIChtUHJldldpZHRoICE9IG1JbnN0YW5jZS5nZXRNZWFzdXJlZFdpZHRoKCkKLSAgICAgICAgICAgICAgICB8fCBtUHJldkhlaWdodCAhPSBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRIZWlnaHQoKSB8fCBtTmVlZFVYVXBkYXRlKSB7Ci0gICAgICAgICAgICAvLyBEaXNtaXNzIFNldHRpbmdzV2luZG93IGlmIGl0IGlzIHNob3dpbmcuCi0gICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3cuZGlzbWlzcygpOwotCi0gICAgICAgICAgICAvLyBUaGVzZSB2aWV3cyBtYXkgbm90IGhhdmUgYmVlbiBpbml0aWFsaXplZCB5ZXQuCi0gICAgICAgICAgICBpZiAobVRyYW5zcG9ydENvbnRyb2xzLmdldFdpZHRoKCkgPT0gMCB8fCBtVGltZVZpZXcuZ2V0V2lkdGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgY3VycldpZHRoID0gbUluc3RhbmNlLmdldE1lYXN1cmVkV2lkdGgoKTsKLSAgICAgICAgICAgIGludCBjdXJySGVpZ2h0ID0gbUluc3RhbmNlLmdldE1lYXN1cmVkSGVpZ2h0KCk7Ci0gICAgICAgICAgICBXaW5kb3dNYW5hZ2VyIG1hbmFnZXIgPSAoV2luZG93TWFuYWdlcikgbUluc3RhbmNlLmdldENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJTkRPV19TRVJWSUNFKTsKLSAgICAgICAgICAgIFBvaW50IHNjcmVlblNpemUgPSBuZXcgUG9pbnQoKTsKLSAgICAgICAgICAgIG1hbmFnZXIuZ2V0RGVmYXVsdERpc3BsYXkoKS5nZXRTaXplKHNjcmVlblNpemUpOwotICAgICAgICAgICAgaW50IHNjcmVlbldpZHRoID0gc2NyZWVuU2l6ZS54OwotICAgICAgICAgICAgaW50IHNjcmVlbkhlaWdodCA9IHNjcmVlblNpemUueTsKLSAgICAgICAgICAgIGludCBmdWxsSWNvblNpemUgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLm1jdjJfZnVsbF9pY29uX3NpemUpOwotICAgICAgICAgICAgaW50IGVtYmVkZGVkSWNvblNpemUgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICAgICAgUi5kaW1lbi5tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZSk7Ci0gICAgICAgICAgICBpbnQgbWFyZ2luU2l6ZSA9IG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4ubWN2Ml9pY29uX21hcmdpbik7Ci0KLSAgICAgICAgICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciBBZHZlcnRpc2VtZW50IE1vZGUuCi0gICAgICAgICAgICBpZiAobU1lZGlhVHlwZSA9PSBNRURJQV9UWVBFX0RFRkFVTFQpIHsKLSAgICAgICAgICAgICAgICAvLyBNYXggbnVtYmVyIG9mIGljb25zIGluc2lkZSBCb3R0b21CYXJSaWdodFZpZXcgZm9yIE11c2ljIG1vZGUgaXMgNC4KLSAgICAgICAgICAgICAgICBpbnQgbWF4SWNvbkNvdW50ID0gNDsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXQobWF4SWNvbkNvdW50LCBmdWxsSWNvblNpemUsIGVtYmVkZGVkSWNvblNpemUsIG1hcmdpblNpemUsIGN1cnJXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJIZWlnaHQsIHNjcmVlbldpZHRoLCBzY3JlZW5IZWlnaHQpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICBpZiAobU5lZWRVWFVwZGF0ZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBPbmUtdGltZSBvcGVyYXRpb24gZm9yIE11c2ljIG1lZGlhIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgbUJhc2ljQ29udHJvbHMucmVtb3ZlVmlldyhtTXV0ZUJ1dHRvbik7Ci0gICAgICAgICAgICAgICAgICAgIG1FeHRyYUNvbnRyb2xzLmFkZFZpZXcobU11dGVCdXR0b24sIDApOwotICAgICAgICAgICAgICAgICAgICBtVmlkZW9RdWFsaXR5QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1GZndkQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobVJld0J1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUmV3QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtTmVlZFVYVXBkYXRlID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAvLyBNYXggbnVtYmVyIG9mIGljb25zIGluc2lkZSBCb3R0b21CYXJSaWdodFZpZXcgZm9yIE11c2ljIG1vZGUgaXMgMy4KLSAgICAgICAgICAgICAgICBpbnQgbWF4SWNvbkNvdW50ID0gMzsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXQobWF4SWNvbkNvdW50LCBmdWxsSWNvblNpemUsIGVtYmVkZGVkSWNvblNpemUsIG1hcmdpblNpemUsIGN1cnJXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJIZWlnaHQsIHNjcmVlbldpZHRoLCBzY3JlZW5IZWlnaHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVByZXZXaWR0aCA9IGN1cnJXaWR0aDsKLSAgICAgICAgICAgIG1QcmV2SGVpZ2h0ID0gY3VyckhlaWdodDsKLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPOiBtb3ZlIHRoaXMgdG8gYSBkaWZmZXJlbnQgbG9jYXRpb24uCi0gICAgICAgIC8vIFVwZGF0ZSB0aXRsZSBiYXIgcGFyYW1ldGVycyBpbiBvcmRlciB0byBhdm9pZCBvdmVybGFwIGJldHdlZW4gdGl0bGUgdmlldyBhbmQgdGhlIHJpZ2h0Ci0gICAgICAgIC8vIHNpZGUgb2YgdGhlIHRpdGxlIGJhci4KLSAgICAgICAgdXBkYXRlVGl0bGVCYXJMYXlvdXQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkX2ltcGwoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgIHN1cGVyLnNldEVuYWJsZWRfaW1wbChlbmFibGVkKTsKLQotICAgICAgICAvLyBUT0RPOiBNZXJnZSB0aGUgYmVsb3cgY29kZSB3aXRoIGRpc2FibGVVbnN1cHBvcnRlZEJ1dHRvbnMoKS4KLSAgICAgICAgaWYgKG1QbGF5UGF1c2VCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtRmZ3ZEJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtUmV3QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1SZXdCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobU5leHRCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVByZXZCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVByZXZCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVByb2dyZXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGRpc2FibGVVbnN1cHBvcnRlZEJ1dHRvbnMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblZpc2liaWxpdHlBZ2dyZWdhdGVkX2ltcGwoYm9vbGVhbiBpc1Zpc2libGUpIHsKLSAgICAgICAgc3VwZXIub25WaXNpYmlsaXR5QWdncmVnYXRlZF9pbXBsKGlzVmlzaWJsZSk7Ci0KLSAgICAgICAgaWYgKGlzVmlzaWJsZSkgewotICAgICAgICAgICAgZGlzYWJsZVVuc3VwcG9ydGVkQnV0dG9ucygpOwotICAgICAgICAgICAgbUluc3RhbmNlLnJlbW92ZUNhbGxiYWNrcyhtVXBkYXRlUHJvZ3Jlc3MpOwotICAgICAgICAgICAgbUluc3RhbmNlLnBvc3QobVVwZGF0ZVByb2dyZXNzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1JbnN0YW5jZS5yZW1vdmVDYWxsYmFja3MobVVwZGF0ZVByb2dyZXNzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIG1Sb3V0ZVNlbGVjdG9yID0gc2VsZWN0b3I7Ci0gICAgICAgIGlmIChtUm91dGVTZWxlY3RvciAhPSBudWxsICYmICFtUm91dGVTZWxlY3Rvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIG1Sb3V0ZUJ1dHRvbi5zZXRSb3V0ZVNlbGVjdG9yKHNlbGVjdG9yLCBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU4pOwotICAgICAgICAgICAgbVJvdXRlQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Sb3V0ZUJ1dHRvbi5zZXRSb3V0ZVNlbGVjdG9yKE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWSk7Ci0gICAgICAgICAgICBtUm91dGVCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gUHJvdGVjdGVkIG9yIHByaXZhdGUgbWV0aG9kcwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUGxheWluZygpIHsKLSAgICAgICAgaWYgKG1QbGF5YmFja1N0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWJhY2tTdGF0ZS5nZXRTdGF0ZSgpID09IFBsYXliYWNrU3RhdGUuU1RBVEVfUExBWUlORzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0Q3VycmVudFBvc2l0aW9uKCkgewotICAgICAgICBtUGxheWJhY2tTdGF0ZSA9IG1Db250cm9sbGVyLmdldFBsYXliYWNrU3RhdGUoKTsKLSAgICAgICAgaWYgKG1QbGF5YmFja1N0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAoaW50KSBtUGxheWJhY2tTdGF0ZS5nZXRQb3NpdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldEJ1ZmZlclBlcmNlbnRhZ2UoKSB7Ci0gICAgICAgIGlmIChtRHVyYXRpb24gPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgbVBsYXliYWNrU3RhdGUgPSBtQ29udHJvbGxlci5nZXRQbGF5YmFja1N0YXRlKCk7Ci0gICAgICAgIGlmIChtUGxheWJhY2tTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsb25nIGJ1ZmZlcmVkUG9zID0gbVBsYXliYWNrU3RhdGUuZ2V0QnVmZmVyZWRQb3NpdGlvbigpOwotICAgICAgICAgICAgcmV0dXJuIChidWZmZXJlZFBvcyA9PSAtMSkgPyAtMSA6IChpbnQpIChidWZmZXJlZFBvcyAqIDEwMCAvIG1EdXJhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNhblBhdXNlKCkgewotICAgICAgICBpZiAobVBsYXliYWNrU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIChtUGxheWJhY2tTdGF0ZS5nZXRBY3Rpb25zKCkgJiBQbGF5YmFja1N0YXRlLkFDVElPTl9QQVVTRSkgIT0gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gY2FuU2Vla0JhY2t3YXJkKCkgewotICAgICAgICBpZiAobVBsYXliYWNrU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIChtUGxheWJhY2tTdGF0ZS5nZXRBY3Rpb25zKCkgJiBQbGF5YmFja1N0YXRlLkFDVElPTl9SRVdJTkQpICE9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNhblNlZWtGb3J3YXJkKCkgewotICAgICAgICBpZiAobVBsYXliYWNrU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIChtUGxheWJhY2tTdGF0ZS5nZXRBY3Rpb25zKCkgJiBQbGF5YmFja1N0YXRlLkFDVElPTl9GQVNUX0ZPUldBUkQpICE9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB2aWV3IHRoYXQgaG9sZHMgdGhlIHdpZGdldHMgdGhhdCBjb250cm9sIHBsYXliYWNrLgotICAgICAqIERlcml2ZWQgY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyB0byBjcmVhdGUgdGhlaXIgb3duLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udHJvbGxlciB2aWV3LgotICAgICAqIEBoaWRlIFRoaXMgZG9lc24ndCB3b3JrIGFzIGFkdmVydGlzZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVmlld0dyb3VwIG1ha2VDb250cm9sbGVyVmlldygpIHsKLSAgICAgICAgVmlld0dyb3VwIHJvb3QgPSAoVmlld0dyb3VwKSBBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgIFIubGF5b3V0Lm1lZGlhX2NvbnRyb2xsZXIpOwotICAgICAgICBpbml0Q29udHJvbGxlclZpZXcocm9vdCk7Ci0gICAgICAgIHJldHVybiByb290OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0Q29udHJvbGxlclZpZXcoVmlld0dyb3VwIHYpIHsKLSAgICAgICAgLy8gUmVsYXRpbmcgdG8gVGl0bGUgQmFyIFZpZXcKLSAgICAgICAgbVRpdGxlQmFyID0gdi5maW5kVmlld0J5SWQoUi5pZC50aXRsZV9iYXIpOwotICAgICAgICBtVGl0bGVWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC50aXRsZV90ZXh0KTsKLSAgICAgICAgbUFkRXh0ZXJuYWxMaW5rID0gdi5maW5kVmlld0J5SWQoUi5pZC5hZF9leHRlcm5hbF9saW5rKTsKLSAgICAgICAgbUJhY2tCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLmJhY2spOwotICAgICAgICBpZiAobUJhY2tCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbUJhY2tCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1CYWNrTGlzdGVuZXIpOwotICAgICAgICAgICAgbUJhY2tCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgICAgIG1Sb3V0ZUJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQuY2FzdCk7Ci0KLSAgICAgICAgLy8gUmVsYXRpbmcgdG8gQ2VudGVyIFZpZXcKLSAgICAgICAgbUNlbnRlclZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmNlbnRlcl92aWV3KTsKLSAgICAgICAgbVRyYW5zcG9ydENvbnRyb2xzID0gaW5mbGF0ZVRyYW5zcG9ydENvbnRyb2xzKFIubGF5b3V0LmVtYmVkZGVkX3RyYW5zcG9ydF9jb250cm9scyk7Ci0gICAgICAgIG1DZW50ZXJWaWV3LmFkZFZpZXcobVRyYW5zcG9ydENvbnRyb2xzKTsKLQotICAgICAgICAvLyBSZWxhdGluZyB0byBNaW5pbWFsIEV4dHJhIFZpZXcKLSAgICAgICAgbU1pbmltYWxFeHRyYVZpZXcgPSAoTGluZWFyTGF5b3V0KSB2LmZpbmRWaWV3QnlJZChSLmlkLm1pbmltYWxfZXh0cmFfdmlldyk7Ci0gICAgICAgIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgcGFyYW1zID0KLSAgICAgICAgICAgICAgICAoTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcykgbU1pbmltYWxFeHRyYVZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7Ci0gICAgICAgIGludCBpY29uU2l6ZSA9IG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4ubWN2Ml9lbWJlZGRlZF9pY29uX3NpemUpOwotICAgICAgICBpbnQgbWFyZ2luU2l6ZSA9IG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4ubWN2Ml9pY29uX21hcmdpbik7Ci0gICAgICAgIHBhcmFtcy5zZXRNYXJnaW5zKDAsIChpY29uU2l6ZSArIG1hcmdpblNpemUgKiAyKSAqICgtMSksIDAsIDApOwotICAgICAgICBtTWluaW1hbEV4dHJhVmlldy5zZXRMYXlvdXRQYXJhbXMocGFyYW1zKTsKLSAgICAgICAgbU1pbmltYWxFeHRyYVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotCi0gICAgICAgIC8vIFJlbGF0aW5nIHRvIFByb2dyZXNzIEJhciBWaWV3Ci0gICAgICAgIG1Qcm9ncmVzcyA9IHYuZmluZFZpZXdCeUlkKFIuaWQucHJvZ3Jlc3MpOwotICAgICAgICBpZiAobVByb2dyZXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChtUHJvZ3Jlc3MgaW5zdGFuY2VvZiBTZWVrQmFyKSB7Ci0gICAgICAgICAgICAgICAgU2Vla0JhciBzZWVrZXIgPSAoU2Vla0JhcikgbVByb2dyZXNzOwotICAgICAgICAgICAgICAgIHNlZWtlci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcihtU2Vla0xpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICBzZWVrZXIuc2V0UHJvZ3Jlc3NEcmF3YWJsZShtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuY3VzdG9tX3Byb2dyZXNzKSk7Ci0gICAgICAgICAgICAgICAgc2Vla2VyLnNldFRodW1iKG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5jdXN0b21fcHJvZ3Jlc3NfdGh1bWIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRNYXgoTUFYX1BST0dSRVNTKTsKLSAgICAgICAgfQotICAgICAgICBtUHJvZ3Jlc3NCdWZmZXIgPSB2LmZpbmRWaWV3QnlJZChSLmlkLnByb2dyZXNzX2J1ZmZlcik7Ci0KLSAgICAgICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhciBWaWV3Ci0gICAgICAgIG1Cb3R0b21CYXIgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmJvdHRvbV9iYXIpOwotCi0gICAgICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIgTGVmdCBWaWV3Ci0gICAgICAgIG1Cb3R0b21CYXJMZWZ0VmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYm90dG9tX2Jhcl9sZWZ0KTsKLSAgICAgICAgbVRpbWVWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC50aW1lKTsKLSAgICAgICAgbUVuZFRpbWUgPSB2LmZpbmRWaWV3QnlJZChSLmlkLnRpbWVfZW5kKTsKLSAgICAgICAgbUN1cnJlbnRUaW1lID0gdi5maW5kVmlld0J5SWQoUi5pZC50aW1lX2N1cnJlbnQpOwotICAgICAgICBtQWRTa2lwVmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYWRfc2tpcF90aW1lKTsKLSAgICAgICAgbUZvcm1hdEJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBtRm9ybWF0dGVyID0gbmV3IEZvcm1hdHRlcihtRm9ybWF0QnVpbGRlciwgTG9jYWxlLmdldERlZmF1bHQoKSk7Ci0KLSAgICAgICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhciBSaWdodCBWaWV3Ci0gICAgICAgIG1Cb3R0b21CYXJSaWdodFZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmJvdHRvbV9iYXJfcmlnaHQpOwotICAgICAgICBtQmFzaWNDb250cm9scyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYmFzaWNfY29udHJvbHMpOwotICAgICAgICBtRXh0cmFDb250cm9scyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuZXh0cmFfY29udHJvbHMpOwotICAgICAgICBtQ3VzdG9tQnV0dG9ucyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuY3VzdG9tX2J1dHRvbnMpOwotICAgICAgICBtU3VidGl0bGVCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLnN1YnRpdGxlKTsKLSAgICAgICAgaWYgKG1TdWJ0aXRsZUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1TdWJ0aXRsZUxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQuZnVsbHNjcmVlbik7Ci0gICAgICAgIGlmIChtRnVsbFNjcmVlbkJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUZ1bGxTY3JlZW5MaXN0ZW5lcik7Ci0gICAgICAgICAgICAvLyBUT0RPOiBTaG93IEZ1bGxzY3JlZW4gYnV0dG9uIHdoZW4gb25seSBpdCBpcyBwb3NzaWJsZS4KLSAgICAgICAgfQotICAgICAgICBtT3ZlcmZsb3dCdXR0b25SaWdodCA9IHYuZmluZFZpZXdCeUlkKFIuaWQub3ZlcmZsb3dfcmlnaHQpOwotICAgICAgICBpZiAobU92ZXJmbG93QnV0dG9uUmlnaHQgIT0gbnVsbCkgewotICAgICAgICAgICAgbU92ZXJmbG93QnV0dG9uUmlnaHQuc2V0T25DbGlja0xpc3RlbmVyKG1PdmVyZmxvd1JpZ2h0TGlzdGVuZXIpOwotICAgICAgICB9Ci0gICAgICAgIG1PdmVyZmxvd0J1dHRvbkxlZnQgPSB2LmZpbmRWaWV3QnlJZChSLmlkLm92ZXJmbG93X2xlZnQpOwotICAgICAgICBpZiAobU92ZXJmbG93QnV0dG9uTGVmdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtT3ZlcmZsb3dCdXR0b25MZWZ0LnNldE9uQ2xpY2tMaXN0ZW5lcihtT3ZlcmZsb3dMZWZ0TGlzdGVuZXIpOwotICAgICAgICB9Ci0gICAgICAgIG1NdXRlQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5tdXRlKTsKLSAgICAgICAgaWYgKG1NdXRlQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1NdXRlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtTXV0ZUJ1dHRvbkxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBtU2V0dGluZ3NCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLnNldHRpbmdzKTsKLSAgICAgICAgaWYgKG1TZXR0aW5nc0J1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2V0dGluZ3NCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1TZXR0aW5nc0J1dHRvbkxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBtVmlkZW9RdWFsaXR5QnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC52aWRlb19xdWFsaXR5KTsKLSAgICAgICAgaWYgKG1WaWRlb1F1YWxpdHlCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVZpZGVvUXVhbGl0eUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobVZpZGVvUXVhbGl0eUxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBtQWRSZW1haW5pbmdWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC5hZF9yZW1haW5pbmcpOwotCi0gICAgICAgIC8vIFJlbGF0aW5nIHRvIFNldHRpbmdzIExpc3QgVmlldwotICAgICAgICBpbml0aWFsaXplU2V0dGluZ3NMaXN0cygpOwotICAgICAgICBtU2V0dGluZ3NMaXN0VmlldyA9IChMaXN0VmlldykgQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICBSLmxheW91dC5zZXR0aW5nc19saXN0KTsKLSAgICAgICAgbVNldHRpbmdzQWRhcHRlciA9IG5ldyBTZXR0aW5nc0FkYXB0ZXIobVNldHRpbmdzTWFpblRleHRzTGlzdCwgbVNldHRpbmdzU3ViVGV4dHNMaXN0LAotICAgICAgICAgICAgICAgIG1TZXR0aW5nc0ljb25JZHNMaXN0KTsKLSAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlciA9IG5ldyBTdWJTZXR0aW5nc0FkYXB0ZXIobnVsbCwgMCk7Ci0gICAgICAgIG1TZXR0aW5nc0xpc3RWaWV3LnNldEFkYXB0ZXIobVNldHRpbmdzQWRhcHRlcik7Ci0gICAgICAgIG1TZXR0aW5nc0xpc3RWaWV3LnNldENob2ljZU1vZGUoTGlzdFZpZXcuQ0hPSUNFX01PREVfU0lOR0xFKTsKLSAgICAgICAgbVNldHRpbmdzTGlzdFZpZXcuc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcihtU2V0dGluZ3NJdGVtQ2xpY2tMaXN0ZW5lcik7Ci0KLSAgICAgICAgbUVtYmVkZGVkU2V0dGluZ3NJdGVtV2lkdGggPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLmRpbWVuLm1jdjJfZW1iZWRkZWRfc2V0dGluZ3Nfd2lkdGgpOwotICAgICAgICBtRnVsbFNldHRpbmdzSXRlbVdpZHRoID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoUi5kaW1lbi5tY3YyX2Z1bGxfc2V0dGluZ3Nfd2lkdGgpOwotICAgICAgICBtRW1iZWRkZWRTZXR0aW5nc0l0ZW1IZWlnaHQgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLmRpbWVuLm1jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0KTsKLSAgICAgICAgbUZ1bGxTZXR0aW5nc0l0ZW1IZWlnaHQgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLmRpbWVuLm1jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQpOwotICAgICAgICBtU2V0dGluZ3NXaW5kb3dNYXJnaW4gPSAoLTEpICogbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tY3YyX3NldHRpbmdzX29mZnNldCk7Ci0gICAgICAgIG1TZXR0aW5nc1dpbmRvdyA9IG5ldyBQb3B1cFdpbmRvdyhtU2V0dGluZ3NMaXN0VmlldywgbUVtYmVkZGVkU2V0dGluZ3NJdGVtV2lkdGgsCi0gICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc2FibGUgcGF1c2Ugb3Igc2VlayBidXR0b25zIGlmIHRoZSBzdHJlYW0gY2Fubm90IGJlIHBhdXNlZCBvciBzZWVrZWQuCi0gICAgICogVGhpcyByZXF1aXJlcyB0aGUgY29udHJvbCBpbnRlcmZhY2UgdG8gYmUgYSBNZWRpYVBsYXllckNvbnRyb2xFeHQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZGlzYWJsZVVuc3VwcG9ydGVkQnV0dG9ucygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChtUGxheVBhdXNlQnV0dG9uICE9IG51bGwgJiYgIWNhblBhdXNlKCkpIHsKLSAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1SZXdCdXR0b24gIT0gbnVsbCAmJiAhY2FuU2Vla0JhY2t3YXJkKCkpIHsKLSAgICAgICAgICAgICAgICBtUmV3QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1GZndkQnV0dG9uICE9IG51bGwgJiYgIWNhblNlZWtGb3J3YXJkKCkpIHsKLSAgICAgICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRPRE8gV2hhdCB3ZSByZWFsbHkgc2hvdWxkIGRvIGlzIGFkZCBhIGNhblNlZWsgdG8gdGhlIE1lZGlhUGxheWVyQ29udHJvbCBpbnRlcmZhY2U7Ci0gICAgICAgICAgICAvLyB0aGlzIHNjaGVtZSBjYW4gYnJlYWsgdGhlIGNhc2Ugd2hlbiBhcHBsaWNhdGlvbnMgd2FudCB0byBhbGxvdyBzZWVrIHRocm91Z2ggdGhlCi0gICAgICAgICAgICAvLyBwcm9ncmVzcyBiYXIgYnV0IGRpc2FibGUgZm9yd2FyZC9iYWNrd2FyZCBidXR0b25zLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEhvd2V2ZXIsIGN1cnJlbnRseSB0aGUgZmxhZ3MgU0VFS19CQUNLV0FSRF9BVkFJTEFCTEUsIFNFRUtfRk9SV0FSRF9BVkFJTEFCTEUsCi0gICAgICAgICAgICAvLyBhbmQgU0VFS19BVkFJTEFCTEUgYXJlIGFsbCAodW4pc2V0IHRvZ2V0aGVyOyBhcyBzdWNoIHRoZSBhZm9yZW1lbnRpb25lZCBpc3N1ZQotICAgICAgICAgICAgLy8gc2hvdWxkbid0IGFyaXNlIGluIGV4aXN0aW5nIGFwcGxpY2F0aW9ucy4KLSAgICAgICAgICAgIGlmIChtUHJvZ3Jlc3MgIT0gbnVsbCAmJiAhY2FuU2Vla0JhY2t3YXJkKCkgJiYgIWNhblNlZWtGb3J3YXJkKCkpIHsKLSAgICAgICAgICAgICAgICBtUHJvZ3Jlc3Muc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEluY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3IgZXgpIHsKLSAgICAgICAgICAgIC8vIFdlIHdlcmUgZ2l2ZW4gYW4gb2xkIHZlcnNpb24gb2YgdGhlIGludGVyZmFjZSwgdGhhdCBkb2Vzbid0IGhhdmUKLSAgICAgICAgICAgIC8vIHRoZSBjYW5QYXVzZS9jYW5TZWVrWFlaIG1ldGhvZHMuIFRoaXMgaXMgT0ssIGl0IGp1c3QgbWVhbnMgd2UKLSAgICAgICAgICAgIC8vIGFzc3VtZSB0aGUgbWVkaWEgY2FuIGJlIHBhdXNlZCBhbmQgc2Vla2VkLCBhbmQgc28gd2UgZG9uJ3QgZGlzYWJsZQotICAgICAgICAgICAgLy8gdGhlIGJ1dHRvbnMuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIFJ1bm5hYmxlIG1VcGRhdGVQcm9ncmVzcyA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGludCBwb3MgPSBzZXRQcm9ncmVzcygpOwotICAgICAgICAgICAgYm9vbGVhbiBpc1Nob3dpbmcgPSBtSW5zdGFuY2UuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRTsKLSAgICAgICAgICAgIGlmICghbURyYWdnaW5nICYmIGlzU2hvd2luZyAmJiBpc1BsYXlpbmcoKSkgewotICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5wb3N0RGVsYXllZChtVXBkYXRlUHJvZ3Jlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1BST0dSRVNTX1VQREFURV9USU1FX01TIC0gKHBvcyAlIERFRkFVTFRfUFJPR1JFU1NfVVBEQVRFX1RJTUVfTVMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIFN0cmluZyBzdHJpbmdGb3JUaW1lKGludCB0aW1lTXMpIHsKLSAgICAgICAgaW50IHRvdGFsU2Vjb25kcyA9IHRpbWVNcyAvIDEwMDA7Ci0KLSAgICAgICAgaW50IHNlY29uZHMgPSB0b3RhbFNlY29uZHMgJSA2MDsKLSAgICAgICAgaW50IG1pbnV0ZXMgPSAodG90YWxTZWNvbmRzIC8gNjApICUgNjA7Ci0gICAgICAgIGludCBob3VycyA9IHRvdGFsU2Vjb25kcyAvIDM2MDA7Ci0KLSAgICAgICAgbUZvcm1hdEJ1aWxkZXIuc2V0TGVuZ3RoKDApOwotICAgICAgICBpZiAoaG91cnMgPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUZvcm1hdHRlci5mb3JtYXQoIiVkOiUwMmQ6JTAyZCIsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzKS50b1N0cmluZygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG1Gb3JtYXR0ZXIuZm9ybWF0KCIlMDJkOiUwMmQiLCBtaW51dGVzLCBzZWNvbmRzKS50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgc2V0UHJvZ3Jlc3MoKSB7Ci0gICAgICAgIGlmIChtQ29udHJvbGxlciA9PSBudWxsIHx8IG1EcmFnZ2luZykgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHBvc2l0aW9uT25Qcm9ncmVzc0JhciA9IDA7Ci0gICAgICAgIGludCBjdXJyZW50UG9zaXRpb24gPSBnZXRDdXJyZW50UG9zaXRpb24oKTsKLSAgICAgICAgaWYgKG1EdXJhdGlvbiA+IDApIHsKLSAgICAgICAgICAgIHBvc2l0aW9uT25Qcm9ncmVzc0JhciA9IChpbnQpIChNQVhfUFJPR1JFU1MgKiAobG9uZykgY3VycmVudFBvc2l0aW9uIC8gbUR1cmF0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVByb2dyZXNzICE9IG51bGwgJiYgY3VycmVudFBvc2l0aW9uICE9IG1EdXJhdGlvbikgewotICAgICAgICAgICAgbVByb2dyZXNzLnNldFByb2dyZXNzKHBvc2l0aW9uT25Qcm9ncmVzc0Jhcik7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgbWVkaWEgaXMgYSBsb2NhbCBmaWxlLCB0aGVyZSBpcyBubyBuZWVkIHRvIHNldCBhIGJ1ZmZlciwgc28gc2V0IHNlY29uZGFyeQotICAgICAgICAgICAgLy8gcHJvZ3Jlc3MgdG8gbWF4aW11bS4KLSAgICAgICAgICAgIGlmIChnZXRCdWZmZXJQZXJjZW50YWdlKCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgbVByb2dyZXNzLnNldFNlY29uZGFyeVByb2dyZXNzKE1BWF9QUk9HUkVTUyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRTZWNvbmRhcnlQcm9ncmVzcyhnZXRCdWZmZXJQZXJjZW50YWdlKCkgKiAxMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUVuZFRpbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgbUVuZFRpbWUuc2V0VGV4dChzdHJpbmdGb3JUaW1lKG1EdXJhdGlvbikpOwotCi0gICAgICAgIH0KLSAgICAgICAgaWYgKG1DdXJyZW50VGltZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ3VycmVudFRpbWUuc2V0VGV4dChzdHJpbmdGb3JUaW1lKGN1cnJlbnRQb3NpdGlvbikpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1Jc0FkdmVydGlzZW1lbnQpIHsKLSAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcmVtYWluaW5nIG51bWJlciBvZiBzZWNvbmRzIHVudGlsIHRoZSBmaXJzdCA1IHNlY29uZHMgb2YgdGhlCi0gICAgICAgICAgICAvLyBhZHZlcnRpc2VtZW50LgotICAgICAgICAgICAgaWYgKG1BZFNraXBWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudFBvc2l0aW9uIDw9IEFEX1NLSVBfV0FJVF9USU1FX01TKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQWRTa2lwVmlldy5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5HT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQWRTa2lwVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNraXBUaW1lVGV4dCA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2FkX3NraXBfd2FpdF90aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURfU0tJUF9XQUlUX1RJTUVfTVMgLSBjdXJyZW50UG9zaXRpb24pIC8gMTAwMCArIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgbUFkU2tpcFZpZXcuc2V0VGV4dChza2lwVGltZVRleHQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQWRTa2lwVmlldy5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQWRTa2lwVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU5leHRCdXR0b24uY2xlYXJDb2xvckZpbHRlcigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSByZW1haW5pbmcgbnVtYmVyIG9mIHNlY29uZHMgb2YgdGhlIGFkdmVydGlzZW1lbnQuCi0gICAgICAgICAgICBpZiAobUFkUmVtYWluaW5nVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW50IHJlbWFpbmluZ1RpbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgKG1EdXJhdGlvbiAtIGN1cnJlbnRQb3NpdGlvbiA8IDApID8gMCA6IChtRHVyYXRpb24gLSBjdXJyZW50UG9zaXRpb24pOwotICAgICAgICAgICAgICAgIFN0cmluZyByZW1haW5pbmdUaW1lVGV4dCA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfYWRfcmVtYWluaW5nX3RpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdGb3JUaW1lKHJlbWFpbmluZ1RpbWUpKTsKLSAgICAgICAgICAgICAgICBtQWRSZW1haW5pbmdWaWV3LnNldFRleHQocmVtYWluaW5nVGltZVRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjdXJyZW50UG9zaXRpb247Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRvZ2dsZVBhdXNlUGxheVN0YXRlKCkgewotICAgICAgICBpZiAoaXNQbGF5aW5nKCkpIHsKLSAgICAgICAgICAgIG1Db250cm9scy5wYXVzZSgpOwotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfcGxheV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9wbGF5X2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ29udHJvbHMucGxheSgpOwotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZCwgbnVsbCkpOwotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfcGF1c2VfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRoZXJlIGFyZSB0d28gc2NlbmFyaW9zIHRoYXQgY2FuIHRyaWdnZXIgdGhlIHNlZWtiYXIgbGlzdGVuZXIgdG8gdHJpZ2dlcjoKLSAgICAvLwotICAgIC8vIFRoZSBmaXJzdCBpcyB0aGUgdXNlciB1c2luZyB0aGUgdG91Y2hwYWQgdG8gYWRqdXN0IHRoZSBwb3NpdGl0b24gb2YgdGhlCi0gICAgLy8gc2Vla2JhcidzIHRodW1iLiBJbiB0aGlzIGNhc2Ugb25TdGFydFRyYWNraW5nVG91Y2ggaXMgY2FsbGVkIGZvbGxvd2VkIGJ5Ci0gICAgLy8gYSBudW1iZXIgb2Ygb25Qcm9ncmVzc0NoYW5nZWQgbm90aWZpY2F0aW9ucywgY29uY2x1ZGVkIGJ5IG9uU3RvcFRyYWNraW5nVG91Y2guCi0gICAgLy8gV2UncmUgc2V0dGluZyB0aGUgZmllbGQgIm1EcmFnZ2luZyIgdG8gdHJ1ZSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBkcmFnZ2luZwotICAgIC8vIHNlc3Npb24gdG8gYXZvaWQganVtcHMgaW4gdGhlIHBvc2l0aW9uIGluIGNhc2Ugb2Ygb25nb2luZyBwbGF5YmFjay4KLSAgICAvLwotICAgIC8vIFRoZSBzZWNvbmQgc2NlbmFyaW8gaW52b2x2ZXMgdGhlIHVzZXIgb3BlcmF0aW5nIHRoZSBzY3JvbGwgYmFsbCwgaW4gdGhpcwotICAgIC8vIGNhc2UgdGhlcmUgV09OJ1QgQkUgb25TdGFydFRyYWNraW5nVG91Y2gvb25TdG9wVHJhY2tpbmdUb3VjaCBub3RpZmljYXRpb25zLAotICAgIC8vIHdlIHdpbGwgc2ltcGx5IGFwcGx5IHRoZSB1cGRhdGVkIHBvc2l0aW9uIHdpdGhvdXQgc3VzcGVuZGluZyByZWd1bGFyIHVwZGF0ZXMuCi0gICAgcHJpdmF0ZSBmaW5hbCBPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lciBtU2Vla0xpc3RlbmVyID0gbmV3IE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TdGFydFRyYWNraW5nVG91Y2goU2Vla0JhciBiYXIpIHsKLSAgICAgICAgICAgIGlmICghbVNlZWtBdmFpbGFibGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1EcmFnZ2luZyA9IHRydWU7Ci0KLSAgICAgICAgICAgIC8vIEJ5IHJlbW92aW5nIHRoZXNlIHBlbmRpbmcgcHJvZ3Jlc3MgbWVzc2FnZXMgd2UgbWFrZSBzdXJlCi0gICAgICAgICAgICAvLyB0aGF0IGEpIHdlIHdvbid0IHVwZGF0ZSB0aGUgcHJvZ3Jlc3Mgd2hpbGUgdGhlIHVzZXIgYWRqdXN0cwotICAgICAgICAgICAgLy8gdGhlIHNlZWtiYXIgYW5kIGIpIG9uY2UgdGhlIHVzZXIgaXMgZG9uZSBkcmFnZ2luZyB0aGUgdGh1bWIKLSAgICAgICAgICAgIC8vIHdlIHdpbGwgcG9zdCBvbmUgb2YgdGhlc2UgbWVzc2FnZXMgdG8gdGhlIHF1ZXVlIGFnYWluIGFuZAotICAgICAgICAgICAgLy8gdGhpcyBlbnN1cmVzIHRoYXQgdGhlcmUgd2lsbCBiZSBleGFjdGx5IG9uZSBtZXNzYWdlIHF1ZXVlZCB1cC4KLSAgICAgICAgICAgIG1JbnN0YW5jZS5yZW1vdmVDYWxsYmFja3MobVVwZGF0ZVByb2dyZXNzKTsKLQotICAgICAgICAgICAgLy8gQ2hlY2sgaWYgcGxheWJhY2sgaXMgY3VycmVudGx5IHN0b3BwZWQuIEluIHRoaXMgY2FzZSwgdXBkYXRlIHRoZSBwYXVzZSBidXR0b24gdG8KLSAgICAgICAgICAgIC8vIHNob3cgdGhlIHBsYXkgaW1hZ2UgaW5zdGVhZCBvZiB0aGUgcmVwbGF5IGltYWdlLgotICAgICAgICAgICAgaWYgKG1Jc1N0b3BwZWQpIHsKLSAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfcGxheV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3BsYXlfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgICAgICAgICBtSXNTdG9wcGVkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoU2Vla0JhciBiYXIsIGludCBwcm9ncmVzcywgYm9vbGVhbiBmcm9tVXNlcikgewotICAgICAgICAgICAgaWYgKCFtU2Vla0F2YWlsYWJsZSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZnJvbVVzZXIpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3QgaW50ZXJlc3RlZCBpbiBwcm9ncmFtbWF0aWNhbGx5IGdlbmVyYXRlZCBjaGFuZ2VzIHRvCi0gICAgICAgICAgICAgICAgLy8gdGhlIHByb2dyZXNzIGJhcidzIHBvc2l0aW9uLgotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtRHVyYXRpb24gPiAwKSB7Ci0gICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gKGludCkgKCgobG9uZykgbUR1cmF0aW9uICogcHJvZ3Jlc3MpIC8gTUFYX1BST0dSRVNTKTsKLSAgICAgICAgICAgICAgICBtQ29udHJvbHMuc2Vla1RvKHBvc2l0aW9uKTsKLQotICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFRpbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRpbWUuc2V0VGV4dChzdHJpbmdGb3JUaW1lKHBvc2l0aW9uKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RvcFRyYWNraW5nVG91Y2goU2Vla0JhciBiYXIpIHsKLSAgICAgICAgICAgIGlmICghbVNlZWtBdmFpbGFibGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRHJhZ2dpbmcgPSBmYWxzZTsKLQotICAgICAgICAgICAgc2V0UHJvZ3Jlc3MoKTsKLQotICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgcHJvZ3Jlc3MgaXMgcHJvcGVybHkgdXBkYXRlZCBpbiB0aGUgZnV0dXJlLAotICAgICAgICAgICAgLy8gdGhlIGNhbGwgdG8gc2hvdygpIGRvZXMgbm90IGd1YXJhbnRlZSB0aGlzIGJlY2F1c2UgaXQgaXMgYQotICAgICAgICAgICAgLy8gbm8tb3AgaWYgd2UgYXJlIGFscmVhZHkgc2hvd2luZy4KLSAgICAgICAgICAgIG1JbnN0YW5jZS5wb3N0KG1VcGRhdGVQcm9ncmVzcyk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtUGxheVBhdXNlTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgdG9nZ2xlUGF1c2VQbGF5U3RhdGUoKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1SZXdMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBpbnQgcG9zID0gZ2V0Q3VycmVudFBvc2l0aW9uKCkgLSBSRVdJTkRfVElNRV9NUzsKLSAgICAgICAgICAgIG1Db250cm9scy5zZWVrVG8ocG9zKTsKLSAgICAgICAgICAgIHNldFByb2dyZXNzKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtRmZ3ZExpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIGludCBwb3MgPSBnZXRDdXJyZW50UG9zaXRpb24oKSArIEZPUldBUkRfVElNRV9NUzsKLSAgICAgICAgICAgIG1Db250cm9scy5zZWVrVG8ocG9zKTsKLSAgICAgICAgICAgIHNldFByb2dyZXNzKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtTmV4dExpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIG1Db250cm9scy5za2lwVG9OZXh0KCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtUHJldkxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIG1Db250cm9scy5za2lwVG9QcmV2aW91cygpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbUJhY2tMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1TdWJ0aXRsZUxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIG1TZXR0aW5nc01vZGUgPSBTRVRUSU5HU19NT0RFX1NVQlRJVExFX1RSQUNLOwotICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5zZXRUZXh0cyhtU3VidGl0bGVEZXNjcmlwdGlvbnNMaXN0KTsKLSAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0Q2hlY2tQb3NpdGlvbihtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXgpOwotICAgICAgICAgICAgZGlzcGxheVNldHRpbmdzV2luZG93KG1TdWJTZXR0aW5nc0FkYXB0ZXIpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbVZpZGVvUXVhbGl0eUxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIG1TZXR0aW5nc01vZGUgPSBTRVRUSU5HU19NT0RFX1ZJREVPX1FVQUxJVFk7Ci0gICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldFRleHRzKG1WaWRlb1F1YWxpdHlMaXN0KTsKLSAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0Q2hlY2tQb3NpdGlvbihtU2VsZWN0ZWRWaWRlb1F1YWxpdHlJbmRleCk7Ci0gICAgICAgICAgICBkaXNwbGF5U2V0dGluZ3NXaW5kb3cobVN1YlNldHRpbmdzQWRhcHRlcik7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtRnVsbFNjcmVlbkxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNFbnRlcmluZ0Z1bGxTY3JlZW4gPSAhbUlzRnVsbFNjcmVlbjsKLSAgICAgICAgICAgIC8vIFRPRE86IFJlLWFycmFuZ2UgdGhlIGJ1dHRvbiBsYXlvdXRzIGFjY29yZGluZyB0byB0aGUgVVguCi0gICAgICAgICAgICBpZiAoaXNFbnRlcmluZ0Z1bGxTY3JlZW4pIHsKLSAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2Z1bGxzY3JlZW5fZXhpdCwgbnVsbCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2Z1bGxzY3JlZW4sIG51bGwpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJ1bmRsZSBhcmdzID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgYXJncy5wdXRCb29sZWFuKEFSR1VNRU5UX0tFWV9GVUxMU0NSRUVOLCBpc0VudGVyaW5nRnVsbFNjcmVlbik7Ci0gICAgICAgICAgICBtQ29udHJvbGxlci5zZW5kQ29tbWFuZChDT01NQU5EX1NFVF9GVUxMU0NSRUVOLCBhcmdzLCBudWxsKTsKLQotICAgICAgICAgICAgbUlzRnVsbFNjcmVlbiA9IGlzRW50ZXJpbmdGdWxsU2NyZWVuOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbU92ZXJmbG93UmlnaHRMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBtQmFzaWNDb250cm9scy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtRXh0cmFDb250cm9scy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtT3ZlcmZsb3dMZWZ0TGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgbUJhc2ljQ29udHJvbHMuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbUV4dHJhQ29udHJvbHMuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbU11dGVCdXR0b25MaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBpZiAoIW1Jc011dGUpIHsKLSAgICAgICAgICAgICAgICBtTXV0ZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX211dGUsIG51bGwpKTsKLSAgICAgICAgICAgICAgICBtTXV0ZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX211dGVkX2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgICAgICAgICAgbUlzTXV0ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoQ09NTUFORF9NVVRFLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbU11dGVCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY191bm11dGUsIG51bGwpKTsKLSAgICAgICAgICAgICAgICBtTXV0ZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3VubXV0ZWRfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgICAgICAgICBtSXNNdXRlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoQ09NTUFORF9VTk1VVEUsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbVNldHRpbmdzQnV0dG9uTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgbVNldHRpbmdzTW9kZSA9IFNFVFRJTkdTX01PREVfTUFJTjsKLSAgICAgICAgICAgIG1TZXR0aW5nc0FkYXB0ZXIuc2V0U3ViVGV4dHMobVNldHRpbmdzU3ViVGV4dHNMaXN0KTsKLSAgICAgICAgICAgIGRpc3BsYXlTZXR0aW5nc1dpbmRvdyhtU2V0dGluZ3NBZGFwdGVyKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIgbVNldHRpbmdzSXRlbUNsaWNrTGlzdGVuZXIKLSAgICAgICAgICAgID0gbmV3IEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DbGljayhBZGFwdGVyVmlldzw/PiBwYXJlbnQsIFZpZXcgdmlldywgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1TZXR0aW5nc01vZGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNFVFRJTkdTX01PREVfTUFJTjoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uID09IFNFVFRJTkdTX01PREVfQVVESU9fVFJBQ0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0VGV4dHMobUF1ZGlvVHJhY2tMaXN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0Q2hlY2tQb3NpdGlvbihtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzTW9kZSA9IFNFVFRJTkdTX01PREVfQVVESU9fVFJBQ0s7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPT0gU0VUVElOR1NfTU9ERV9QTEFZQkFDS19TUEVFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5zZXRUZXh0cyhtUGxheWJhY2tTcGVlZFRleHRMaXN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0Q2hlY2tQb3NpdGlvbihtU2VsZWN0ZWRTcGVlZEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc01vZGUgPSBTRVRUSU5HU19NT0RFX1BMQVlCQUNLX1NQRUVEOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09IFNFVFRJTkdTX01PREVfSEVMUCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMuCi0gICAgICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3cuZGlzbWlzcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlTZXR0aW5nc1dpbmRvdyhtU3ViU2V0dGluZ3NBZGFwdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRUSU5HU19NT0RFX0FVRElPX1RSQUNLOgotICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gIT0gbVNlbGVjdGVkQXVkaW9UcmFja0luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXggPSBwb3NpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQXVkaW9UcmFja0NvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBleHRyYSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYS5wdXRJbnQoS0VZX1NFTEVDVEVEX0FVRElPX0lOREVYLCBwb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoQ09NTUFORF9TRUxFQ1RfQVVESU9fVFJBQ0ssIGV4dHJhLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc1N1YlRleHRzTGlzdC5zZXQoU0VUVElOR1NfTU9ERV9BVURJT19UUkFDSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5nZXRNYWluVGV4dChwb3NpdGlvbikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc1dpbmRvdy5kaXNtaXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU0VUVElOR1NfTU9ERV9QTEFZQkFDS19TUEVFRDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uICE9IG1TZWxlY3RlZFNwZWVkSW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFNwZWVkSW5kZXggPSBwb3NpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBleHRyYSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhLnB1dEZsb2F0KEtFWV9QTEFZQkFDS19TUEVFRCwgbVBsYXliYWNrU3BlZWRMaXN0LmdldChwb3NpdGlvbikpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoQ09NTUFORF9TRVRfUExBWUJBQ0tfU1BFRUQsIGV4dHJhLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc1N1YlRleHRzTGlzdC5zZXQoU0VUVElOR1NfTU9ERV9QTEFZQkFDS19TUEVFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5nZXRNYWluVGV4dChwb3NpdGlvbikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc1dpbmRvdy5kaXNtaXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU0VUVElOR1NfTU9ERV9IRUxQOgotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcy4KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRUSU5HU19NT0RFX1NVQlRJVExFX1RSQUNLOgotICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gIT0gbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXggPSBwb3NpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGUgZXh0cmEgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmEucHV0SW50KEtFWV9TRUxFQ1RFRF9TVUJUSVRMRV9JTkRFWCwgcG9zaXRpb24gLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udHJvbGxlci5zZW5kQ29tbWFuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX1NIT1dfU1VCVElUTEUsIGV4dHJhLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19zdWJ0aXRsZV9vbiwgbnVsbCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX2NjX2lzX29uKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlSXNFbmFibGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9ISURFX1NVQlRJVExFLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19zdWJ0aXRsZV9vZmYsIG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9jY19pc19vZmYpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUlzRW5hYmxlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc1dpbmRvdy5kaXNtaXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU0VUVElOR1NfTU9ERV9WSURFT19RVUFMSVRZOgotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3IgdmlkZW8gcXVhbGl0eQotICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRWaWRlb1F1YWxpdHlJbmRleCA9IHBvc2l0aW9uOwotICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3cuZGlzbWlzcygpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlRHVyYXRpb24oKSB7Ci0gICAgICAgIGlmIChtTWV0YWRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1NZXRhZGF0YS5jb250YWluc0tleShNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9EVVJBVElPTikpIHsKLSAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSAoaW50KSBtTWV0YWRhdGEuZ2V0TG9uZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9EVVJBVElPTik7Ci0gICAgICAgICAgICAgICAgLy8gdXBkYXRlIHByb2dyZXNzIGJhcgotICAgICAgICAgICAgICAgIHNldFByb2dyZXNzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlVGl0bGUoKSB7Ci0gICAgICAgIGlmIChtTWV0YWRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1NZXRhZGF0YS5jb250YWluc0tleShNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9USVRMRSkpIHsKLSAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQobU1ldGFkYXRhLmdldFN0cmluZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9USVRMRSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGhlIHRpdGxlIGJhciBpcyBtYWRlIHVwIG9mIHR3byBzZXBhcmF0ZSBMaW5lYXJMYXlvdXRzLiBJZiB0aGUgc3VtIG9mIHRoZSB0d28gYmFycyBhcmUKLSAgICAvLyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgdGl0bGUgYmFyLCByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIGxlZnQgYmFyICh3aGljaCBtYWtlcyB0aGUKLSAgICAvLyBUZXh0VmlldyB0aGF0IGNvbnRhaW5zIHRoZSB0aXRsZSBvZiB0aGUgbWVkaWEgZmlsZSBzaHJpbmspLgotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVUaXRsZUJhckxheW91dCgpIHsKLSAgICAgICAgaWYgKG1UaXRsZUJhciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgdGl0bGVCYXJXaWR0aCA9IG1UaXRsZUJhci5nZXRXaWR0aCgpOwotCi0gICAgICAgICAgICBWaWV3IGxlZnRCYXIgPSBtVGl0bGVCYXIuZmluZFZpZXdCeUlkKFIuaWQudGl0bGVfYmFyX2xlZnQpOwotICAgICAgICAgICAgVmlldyByaWdodEJhciA9IG1UaXRsZUJhci5maW5kVmlld0J5SWQoUi5pZC50aXRsZV9iYXJfcmlnaHQpOwotICAgICAgICAgICAgaW50IGxlZnRCYXJXaWR0aCA9IGxlZnRCYXIuZ2V0V2lkdGgoKTsKLSAgICAgICAgICAgIGludCByaWdodEJhcldpZHRoID0gcmlnaHRCYXIuZ2V0V2lkdGgoKTsKLQotICAgICAgICAgICAgUmVsYXRpdmVMYXlvdXQuTGF5b3V0UGFyYW1zIHBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgICAgIChSZWxhdGl2ZUxheW91dC5MYXlvdXRQYXJhbXMpIGxlZnRCYXIuZ2V0TGF5b3V0UGFyYW1zKCk7Ci0gICAgICAgICAgICBpZiAobGVmdEJhcldpZHRoICsgcmlnaHRCYXJXaWR0aCA+IHRpdGxlQmFyV2lkdGgpIHsKLSAgICAgICAgICAgICAgICBwYXJhbXMud2lkdGggPSB0aXRsZUJhcldpZHRoIC0gcmlnaHRCYXJXaWR0aDsKLSAgICAgICAgICAgICAgICBtT3JpZ2luYWxMZWZ0QmFyV2lkdGggPSBsZWZ0QmFyV2lkdGg7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGxlZnRCYXJXaWR0aCArIHJpZ2h0QmFyV2lkdGggPCB0aXRsZUJhcldpZHRoICYmIG1PcmlnaW5hbExlZnRCYXJXaWR0aCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW1zLndpZHRoID0gbU9yaWdpbmFsTGVmdEJhcldpZHRoOwotICAgICAgICAgICAgICAgIG1PcmlnaW5hbExlZnRCYXJXaWR0aCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsZWZ0QmFyLnNldExheW91dFBhcmFtcyhwYXJhbXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUF1ZGlvTWV0YWRhdGEoKSB7Ci0gICAgICAgIGlmIChtTWVkaWFUeXBlICE9IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTWV0YWRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHRpdGxlVGV4dCA9ICIiOwotICAgICAgICAgICAgU3RyaW5nIGFydGlzdFRleHQgPSAiIjsKLSAgICAgICAgICAgIGlmIChtTWV0YWRhdGEuY29udGFpbnNLZXkoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfVElUTEUpKSB7Ci0gICAgICAgICAgICAgICAgdGl0bGVUZXh0ID0gbU1ldGFkYXRhLmdldFN0cmluZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9USVRMRSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRpdGxlVGV4dCA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfbXVzaWNfdGl0bGVfdW5rbm93bl90ZXh0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1NZXRhZGF0YS5jb250YWluc0tleShNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9BUlRJU1QpKSB7Ci0gICAgICAgICAgICAgICAgYXJ0aXN0VGV4dCA9IG1NZXRhZGF0YS5nZXRTdHJpbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfQVJUSVNUKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXJ0aXN0VGV4dCA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfbXVzaWNfYXJ0aXN0X3Vua25vd25fdGV4dCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFVwZGF0ZSB0aXRsZSBmb3IgRW1iZWRkZWQgc2l6ZSB0eXBlCi0gICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQodGl0bGVUZXh0ICsgIiAtICIgKyBhcnRpc3RUZXh0KTsKLQotICAgICAgICAgICAgLy8gU2V0IHRvIHRydWUgdG8gdXBkYXRlIGxheW91dCBpbnNpZGUgb25NZWFzdXJlKCkKLSAgICAgICAgICAgIG1OZWVkVVhVcGRhdGUgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUxheW91dCgpIHsKLSAgICAgICAgaWYgKG1Jc0FkdmVydGlzZW1lbnQpIHsKLSAgICAgICAgICAgIG1SZXdCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbUZmd2RCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVByZXZCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVRpbWVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICAgICAgbUFkU2tpcFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbUFkUmVtYWluaW5nVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtQWRFeHRlcm5hbExpbmsuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotCi0gICAgICAgICAgICBtUHJvZ3Jlc3Muc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldENvbG9yRmlsdGVyKFIuY29sb3IuZ3JheSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUmV3QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1QcmV2QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1UaW1lVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgIG1BZFNraXBWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1BZFJlbWFpbmluZ1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbUFkRXh0ZXJuYWxMaW5rLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICAgICAgbVByb2dyZXNzLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgbU5leHRCdXR0b24uY2xlYXJDb2xvckZpbHRlcigpOwotICAgICAgICAgICAgZGlzYWJsZVVuc3VwcG9ydGVkQnV0dG9ucygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUxheW91dChpbnQgbWF4SWNvbkNvdW50LCBpbnQgZnVsbEljb25TaXplLCBpbnQgZW1iZWRkZWRJY29uU2l6ZSwKLSAgICAgICAgICAgICBpbnQgbWFyZ2luU2l6ZSwgaW50IGN1cnJXaWR0aCwgaW50IGN1cnJIZWlnaHQsIGludCBzY3JlZW5XaWR0aCwgaW50IHNjcmVlbkhlaWdodCkgewotICAgICAgICBpbnQgZnVsbEJvdHRvbUJhclJpZ2h0V2lkdGhNYXggPSBmdWxsSWNvblNpemUgKiBtYXhJY29uQ291bnQKLSAgICAgICAgICAgICAgICArIG1hcmdpblNpemUgKiAobWF4SWNvbkNvdW50ICogMik7Ci0gICAgICAgIGludCBlbWJlZGRlZEJvdHRvbUJhclJpZ2h0V2lkdGhNYXggPSBlbWJlZGRlZEljb25TaXplICogbWF4SWNvbkNvdW50Ci0gICAgICAgICAgICAgICAgKyBtYXJnaW5TaXplICogKG1heEljb25Db3VudCAqIDIpOwotICAgICAgICBpbnQgZnVsbFdpZHRoID0gbVRyYW5zcG9ydENvbnRyb2xzLmdldFdpZHRoKCkgKyBtVGltZVZpZXcuZ2V0V2lkdGgoKQotICAgICAgICAgICAgICAgICsgZnVsbEJvdHRvbUJhclJpZ2h0V2lkdGhNYXg7Ci0gICAgICAgIGludCBlbWJlZGRlZFdpZHRoID0gbVRpbWVWaWV3LmdldFdpZHRoKCkgKyBlbWJlZGRlZEJvdHRvbUJhclJpZ2h0V2lkdGhNYXg7Ci0gICAgICAgIGludCBzY3JlZW5NYXhMZW5ndGggPSBNYXRoLm1heChzY3JlZW5XaWR0aCwgc2NyZWVuSGVpZ2h0KTsKLQotICAgICAgICBpZiAoZnVsbFdpZHRoID4gc2NyZWVuTWF4TGVuZ3RoKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBzY3JlZW4gbWF5IGJlIHNtYWxsZXIgdGhhbiB0aGUgbGVuZ3RoIG5lZWRlZCBmb3IgRnVsbCBzaXplLgotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc0Z1bGxTaXplID0gKG1NZWRpYVR5cGUgPT0gTUVESUFfVFlQRV9ERUZBVUxUKSA/IChjdXJyV2lkdGggPT0gc2NyZWVuTWF4TGVuZ3RoKSA6Ci0gICAgICAgICAgICAgICAgKGN1cnJXaWR0aCA9PSBzY3JlZW5XaWR0aCAmJiBjdXJySGVpZ2h0ID09IHNjcmVlbkhlaWdodCk7Ci0KLSAgICAgICAgaWYgKGlzRnVsbFNpemUpIHsKLSAgICAgICAgICAgIGlmIChtU2l6ZVR5cGUgIT0gU0laRV9UWVBFX0ZVTEwpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXRGb3JTaXplQ2hhbmdlKFNJWkVfVFlQRV9GVUxMKTsKLSAgICAgICAgICAgICAgICBpZiAobU1lZGlhVHlwZSA9PSBNRURJQV9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChlbWJlZGRlZFdpZHRoIDw9IGN1cnJXaWR0aCkgewotICAgICAgICAgICAgaWYgKG1TaXplVHlwZSAhPSBTSVpFX1RZUEVfRU1CRURERUQpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXRGb3JTaXplQ2hhbmdlKFNJWkVfVFlQRV9FTUJFRERFRCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYVR5cGUgPT0gTUVESUFfVFlQRV9NVVNJQykgewotICAgICAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobVNpemVUeXBlICE9IFNJWkVfVFlQRV9NSU5JTUFMKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0Rm9yU2l6ZUNoYW5nZShTSVpFX1RZUEVfTUlOSU1BTCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYVR5cGUgPT0gTUVESUFfVFlQRV9NVVNJQykgewotICAgICAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlTGF5b3V0Rm9yU2l6ZUNoYW5nZShpbnQgc2l6ZVR5cGUpIHsKLSAgICAgICAgbVNpemVUeXBlID0gc2l6ZVR5cGU7Ci0gICAgICAgIFJlbGF0aXZlTGF5b3V0LkxheW91dFBhcmFtcyB0aW1lVmlld1BhcmFtcyA9Ci0gICAgICAgICAgICAgICAgKFJlbGF0aXZlTGF5b3V0LkxheW91dFBhcmFtcykgbVRpbWVWaWV3LmdldExheW91dFBhcmFtcygpOwotICAgICAgICBTZWVrQmFyIHNlZWtlciA9IChTZWVrQmFyKSBtUHJvZ3Jlc3M7Ci0gICAgICAgIHN3aXRjaCAobVNpemVUeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFNJWkVfVFlQRV9FTUJFRERFRDoKLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBUaXRsZSBCYXIKLSAgICAgICAgICAgICAgICBtVGl0bGVCYXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIG1CYWNrQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIEZ1bGwgU2NyZWVuIEJ1dHRvbgotICAgICAgICAgICAgICAgIG1NaW5pbWFsRXh0cmFWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbiA9IG1Cb3R0b21CYXJSaWdodFZpZXcuZmluZFZpZXdCeUlkKFIuaWQuZnVsbHNjcmVlbik7Ci0gICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1GdWxsU2NyZWVuTGlzdGVuZXIpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gQ2VudGVyIFZpZXcKLSAgICAgICAgICAgICAgICBtQ2VudGVyVmlldy5yZW1vdmVBbGxWaWV3cygpOwotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXJMZWZ0Vmlldy5yZW1vdmVWaWV3KG1UcmFuc3BvcnRDb250cm9scyk7Ci0gICAgICAgICAgICAgICAgbUJvdHRvbUJhckxlZnRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICBtVHJhbnNwb3J0Q29udHJvbHMgPSBpbmZsYXRlVHJhbnNwb3J0Q29udHJvbHMoUi5sYXlvdXQuZW1iZWRkZWRfdHJhbnNwb3J0X2NvbnRyb2xzKTsKLSAgICAgICAgICAgICAgICBtQ2VudGVyVmlldy5hZGRWaWV3KG1UcmFuc3BvcnRDb250cm9scyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBQcm9ncmVzcyBCYXIKLSAgICAgICAgICAgICAgICBzZWVrZXIuc2V0VGh1bWIobVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmN1c3RvbV9wcm9ncmVzc190aHVtYikpOwotICAgICAgICAgICAgICAgIG1Qcm9ncmVzc0J1ZmZlci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyCi0gICAgICAgICAgICAgICAgbUJvdHRvbUJhci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRpbWVWaWV3UGFyYW1zLmdldFJ1bGUoUmVsYXRpdmVMYXlvdXQuTEVGVF9PRikgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICB0aW1lVmlld1BhcmFtcy5yZW1vdmVSdWxlKFJlbGF0aXZlTGF5b3V0LkxFRlRfT0YpOwotICAgICAgICAgICAgICAgICAgICB0aW1lVmlld1BhcmFtcy5hZGRSdWxlKFJlbGF0aXZlTGF5b3V0LlJJR0hUX09GLCBSLmlkLmJvdHRvbV9iYXJfbGVmdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTSVpFX1RZUEVfRlVMTDoKLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBUaXRsZSBCYXIKLSAgICAgICAgICAgICAgICBtVGl0bGVCYXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIG1CYWNrQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIEZ1bGwgU2NyZWVuIEJ1dHRvbgotICAgICAgICAgICAgICAgIG1NaW5pbWFsRXh0cmFWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbiA9IG1Cb3R0b21CYXJSaWdodFZpZXcuZmluZFZpZXdCeUlkKFIuaWQuZnVsbHNjcmVlbik7Ci0gICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1GdWxsU2NyZWVuTGlzdGVuZXIpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gQ2VudGVyIFZpZXcKLSAgICAgICAgICAgICAgICBtQ2VudGVyVmlldy5yZW1vdmVBbGxWaWV3cygpOwotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXJMZWZ0Vmlldy5yZW1vdmVWaWV3KG1UcmFuc3BvcnRDb250cm9scyk7Ci0gICAgICAgICAgICAgICAgbVRyYW5zcG9ydENvbnRyb2xzID0gaW5mbGF0ZVRyYW5zcG9ydENvbnRyb2xzKFIubGF5b3V0LmZ1bGxfdHJhbnNwb3J0X2NvbnRyb2xzKTsKLSAgICAgICAgICAgICAgICBtQm90dG9tQmFyTGVmdFZpZXcuYWRkVmlldyhtVHJhbnNwb3J0Q29udHJvbHMsIDApOwotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXJMZWZ0Vmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBQcm9ncmVzcyBCYXIKLSAgICAgICAgICAgICAgICBzZWVrZXIuc2V0VGh1bWIobVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmN1c3RvbV9wcm9ncmVzc190aHVtYikpOwotICAgICAgICAgICAgICAgIG1Qcm9ncmVzc0J1ZmZlci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyCi0gICAgICAgICAgICAgICAgbUJvdHRvbUJhci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRpbWVWaWV3UGFyYW1zLmdldFJ1bGUoUmVsYXRpdmVMYXlvdXQuUklHSFRfT0YpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdGltZVZpZXdQYXJhbXMucmVtb3ZlUnVsZShSZWxhdGl2ZUxheW91dC5SSUdIVF9PRik7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVWaWV3UGFyYW1zLmFkZFJ1bGUoUmVsYXRpdmVMYXlvdXQuTEVGVF9PRiwgUi5pZC5ib3R0b21fYmFyX3JpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNJWkVfVFlQRV9NSU5JTUFMOgotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIFRpdGxlIEJhcgotICAgICAgICAgICAgICAgIG1UaXRsZUJhci5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgbUJhY2tCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gRnVsbCBTY3JlZW4gQnV0dG9uCi0gICAgICAgICAgICAgICAgbU1pbmltYWxFeHRyYVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uID0gbU1pbmltYWxFeHRyYVZpZXcuZmluZFZpZXdCeUlkKFIuaWQuZnVsbHNjcmVlbik7Ci0gICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1GdWxsU2NyZWVuTGlzdGVuZXIpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gQ2VudGVyIFZpZXcKLSAgICAgICAgICAgICAgICBtQ2VudGVyVmlldy5yZW1vdmVBbGxWaWV3cygpOwotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXJMZWZ0Vmlldy5yZW1vdmVWaWV3KG1UcmFuc3BvcnRDb250cm9scyk7Ci0gICAgICAgICAgICAgICAgbVRyYW5zcG9ydENvbnRyb2xzID0gaW5mbGF0ZVRyYW5zcG9ydENvbnRyb2xzKFIubGF5b3V0Lm1pbmltYWxfdHJhbnNwb3J0X2NvbnRyb2xzKTsKLSAgICAgICAgICAgICAgICBtQ2VudGVyVmlldy5hZGRWaWV3KG1UcmFuc3BvcnRDb250cm9scyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBQcm9ncmVzcyBCYXIKLSAgICAgICAgICAgICAgICBzZWVrZXIuc2V0VGh1bWIobnVsbCk7Ci0gICAgICAgICAgICAgICAgbVByb2dyZXNzQnVmZmVyLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIKLSAgICAgICAgICAgICAgICBtQm90dG9tQmFyLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBtVGltZVZpZXcuc2V0TGF5b3V0UGFyYW1zKHRpbWVWaWV3UGFyYW1zKTsKLQotICAgICAgICBpZiAoaXNQbGF5aW5nKCkpIHsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3BhdXNlX2NpcmNsZV9maWxsZWQsIG51bGwpKTsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3BhdXNlX2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19wbGF5X2NpcmNsZV9maWxsZWQsIG51bGwpKTsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3BsYXlfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSXNGdWxsU2NyZWVuKSB7Ci0gICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfZnVsbHNjcmVlbl9leGl0LCBudWxsKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfZnVsbHNjcmVlbiwgbnVsbCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBWaWV3IGluZmxhdGVUcmFuc3BvcnRDb250cm9scyhpbnQgbGF5b3V0SWQpIHsKLSAgICAgICAgVmlldyB2ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwgbGF5b3V0SWQpOwotICAgICAgICBtUGxheVBhdXNlQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5wYXVzZSk7Ci0gICAgICAgIGlmIChtUGxheVBhdXNlQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24ucmVxdWVzdEZvY3VzKCk7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtUGxheVBhdXNlTGlzdGVuZXIpOwotICAgICAgICB9Ci0gICAgICAgIG1GZndkQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5mZndkKTsKLSAgICAgICAgaWYgKG1GZndkQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtRmZ3ZExpc3RlbmVyKTsKLSAgICAgICAgICAgIGlmIChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbVJld0J1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQucmV3KTsKLSAgICAgICAgaWYgKG1SZXdCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobVJld0xpc3RlbmVyKTsKLSAgICAgICAgICAgIGlmIChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICBtUmV3QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPOiBBZGQgc3VwcG9ydCBmb3IgTmV4dCBhbmQgUHJldmlvdXMgYnV0dG9ucwotICAgICAgICBtTmV4dEJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQubmV4dCk7Ci0gICAgICAgIGlmIChtTmV4dEJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobU5leHRMaXN0ZW5lcik7Ci0gICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLSAgICAgICAgbVByZXZCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLnByZXYpOwotICAgICAgICBpZiAobVByZXZCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVByZXZCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1QcmV2TGlzdGVuZXIpOwotICAgICAgICAgICAgbVByZXZCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplU2V0dGluZ3NMaXN0cygpIHsKLSAgICAgICAgbVNldHRpbmdzTWFpblRleHRzTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBtU2V0dGluZ3NNYWluVGV4dHNMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9hdWRpb190cmFja190ZXh0KSk7Ci0gICAgICAgIG1TZXR0aW5nc01haW5UZXh0c0xpc3QuYWRkKAotICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX3BsYXliYWNrX3NwZWVkX3RleHQpKTsKLSAgICAgICAgbVNldHRpbmdzTWFpblRleHRzTGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfaGVscF90ZXh0KSk7Ci0KLSAgICAgICAgbVNldHRpbmdzU3ViVGV4dHNMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIG1TZXR0aW5nc1N1YlRleHRzTGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfYXVkaW9fdHJhY2tfbm9uZV90ZXh0KSk7Ci0gICAgICAgIG1TZXR0aW5nc1N1YlRleHRzTGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmdBcnJheSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFIuYXJyYXkuTWVkaWFDb250cm9sVmlldzJfcGxheWJhY2tfc3BlZWRzKVtQTEFZQkFDS19TUEVFRF8xeF9JTkRFWF0pOwotICAgICAgICBtU2V0dGluZ3NTdWJUZXh0c0xpc3QuYWRkKFJFU09VUkNFX0VNUFRZKTsKLQotICAgICAgICBtU2V0dGluZ3NJY29uSWRzTGlzdCA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKLSAgICAgICAgbVNldHRpbmdzSWNvbklkc0xpc3QuYWRkKFIuZHJhd2FibGUuaWNfYXVkaW90cmFjayk7Ci0gICAgICAgIG1TZXR0aW5nc0ljb25JZHNMaXN0LmFkZChSLmRyYXdhYmxlLmljX3BsYXlfY2lyY2xlX2ZpbGxlZCk7Ci0gICAgICAgIG1TZXR0aW5nc0ljb25JZHNMaXN0LmFkZChSLmRyYXdhYmxlLmljX2hlbHApOwotCi0gICAgICAgIG1BdWRpb1RyYWNrTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBtQXVkaW9UcmFja0xpc3QuYWRkKAotICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX25vbmVfdGV4dCkpOwotCi0gICAgICAgIG1WaWRlb1F1YWxpdHlMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIG1WaWRlb1F1YWxpdHlMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml92aWRlb19xdWFsaXR5X2F1dG9fdGV4dCkpOwotCi0gICAgICAgIG1QbGF5YmFja1NwZWVkVGV4dExpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZ0FycmF5KFIuYXJyYXkuTWVkaWFDb250cm9sVmlldzJfcGxheWJhY2tfc3BlZWRzKSkpOwotICAgICAgICAvLyBTZWxlY3QgdGhlICIxeCIgc3BlZWQgYXMgdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICAgIG1TZWxlY3RlZFNwZWVkSW5kZXggPSBQTEFZQkFDS19TUEVFRF8xeF9JTkRFWDsKLQotICAgICAgICBtUGxheWJhY2tTcGVlZExpc3QgPSBuZXcgQXJyYXlMaXN0PEZsb2F0PigpOwotICAgICAgICBpbnRbXSBzcGVlZHMgPSBtUmVzb3VyY2VzLmdldEludEFycmF5KFIuYXJyYXkuc3BlZWRfbXVsdGlwbGllZF9ieV8xMDApOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwZWVkcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmxvYXQgc3BlZWQgPSAoZmxvYXQpIHNwZWVkc1tpXSAvIDEwMC4wZjsKLSAgICAgICAgICAgIG1QbGF5YmFja1NwZWVkTGlzdC5hZGQoc3BlZWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRpc3BsYXlTZXR0aW5nc1dpbmRvdyhCYXNlQWRhcHRlciBhZGFwdGVyKSB7Ci0gICAgICAgIC8vIFNldCBBZGFwdGVyCi0gICAgICAgIG1TZXR0aW5nc0xpc3RWaWV3LnNldEFkYXB0ZXIoYWRhcHRlcik7Ci0KLSAgICAgICAgLy8gU2V0IHdpZHRoIG9mIHdpbmRvdwotICAgICAgICBpbnQgaXRlbVdpZHRoID0gKG1TaXplVHlwZSA9PSBTSVpFX1RZUEVfRU1CRURERUQpCi0gICAgICAgICAgICAgICAgPyBtRW1iZWRkZWRTZXR0aW5nc0l0ZW1XaWR0aCA6IG1GdWxsU2V0dGluZ3NJdGVtV2lkdGg7Ci0gICAgICAgIG1TZXR0aW5nc1dpbmRvdy5zZXRXaWR0aChpdGVtV2lkdGgpOwotCi0gICAgICAgIC8vIENhbGN1bGF0ZSBoZWlnaHQgb2Ygd2luZG93IGFuZCBzaG93Ci0gICAgICAgIGludCBpdGVtSGVpZ2h0ID0gKG1TaXplVHlwZSA9PSBTSVpFX1RZUEVfRU1CRURERUQpCi0gICAgICAgICAgICAgICAgPyBtRW1iZWRkZWRTZXR0aW5nc0l0ZW1IZWlnaHQgOiBtRnVsbFNldHRpbmdzSXRlbUhlaWdodDsKLSAgICAgICAgaW50IHRvdGFsSGVpZ2h0ID0gYWRhcHRlci5nZXRDb3VudCgpICogaXRlbUhlaWdodDsKLSAgICAgICAgbVNldHRpbmdzV2luZG93LmRpc21pc3MoKTsKLSAgICAgICAgbVNldHRpbmdzV2luZG93LnNob3dBc0Ryb3BEb3duKG1JbnN0YW5jZSwgbVNldHRpbmdzV2luZG93TWFyZ2luLAotICAgICAgICAgICAgICAgIG1TZXR0aW5nc1dpbmRvd01hcmdpbiAtIHRvdGFsSGVpZ2h0LCBHcmF2aXR5LkJPVFRPTSB8IEdyYXZpdHkuUklHSFQpOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgTWVkaWFDb250cm9sbGVyQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYUNvbnRyb2xsZXIuQ2FsbGJhY2sgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25QbGF5YmFja1N0YXRlQ2hhbmdlZChQbGF5YmFja1N0YXRlIHN0YXRlKSB7Ci0gICAgICAgICAgICBtUGxheWJhY2tTdGF0ZSA9IHN0YXRlOwotCi0gICAgICAgICAgICAvLyBVcGRhdGUgcGF1c2UgYnV0dG9uIGRlcGVuZGluZyBvbiBwbGF5YmFjayBzdGF0ZSBmb3IgdGhlIGZvbGxvd2luZyB0d28gcmVhc29uczoKLSAgICAgICAgICAgIC8vICAgMSkgTmVlZCB0byBoYW5kbGUgY2FzZSB3aGVyZSBhcHAgY3VzdG9taXplcyBwbGF5YmFjayBzdGF0ZSBiZWhhdmlvciB3aGVuIGFwcAotICAgICAgICAgICAgLy8gICAgICBhY3Rpdml0eSBpcyByZXN1bWVkLgotICAgICAgICAgICAgLy8gICAyKSBOZWVkIHRvIGhhbmRsZSBjYXNlIHdoZXJlIHRoZSBtZWRpYSBmaWxlIHJlYWNoZXMgZW5kIG9mIGR1cmF0aW9uLgotICAgICAgICAgICAgaWYgKG1QbGF5YmFja1N0YXRlLmdldFN0YXRlKCkgIT0gbVByZXZTdGF0ZSkgewotICAgICAgICAgICAgICAgIHN3aXRjaCAobVBsYXliYWNrU3RhdGUuZ2V0U3RhdGUoKSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFBsYXliYWNrU3RhdGUuU1RBVEVfUExBWUlORzoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3BhdXNlX2NpcmNsZV9maWxsZWQsIG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3BhdXNlX2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2UucmVtb3ZlQ2FsbGJhY2tzKG1VcGRhdGVQcm9ncmVzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2UucG9zdChtVXBkYXRlUHJvZ3Jlc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgUGxheWJhY2tTdGF0ZS5TVEFURV9QQVVTRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19wbGF5X2NpcmNsZV9maWxsZWQsIG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3BsYXlfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFBsYXliYWNrU3RhdGUuU1RBVEVfU1RPUFBFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3JlcGxheV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9yZXBsYXlfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Jc1N0b3BwZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVByZXZTdGF0ZSA9IG1QbGF5YmFja1N0YXRlLmdldFN0YXRlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtUGxheWJhY2tBY3Rpb25zICE9IG1QbGF5YmFja1N0YXRlLmdldEFjdGlvbnMoKSkgewotICAgICAgICAgICAgICAgIGxvbmcgbmV3QWN0aW9ucyA9IG1QbGF5YmFja1N0YXRlLmdldEFjdGlvbnMoKTsKLSAgICAgICAgICAgICAgICBpZiAoKG5ld0FjdGlvbnMgJiBQbGF5YmFja1N0YXRlLkFDVElPTl9QQVVTRSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChuZXdBY3Rpb25zICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUkVXSU5EKSAhPSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBtTWVkaWFUeXBlICE9IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1SZXdCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChuZXdBY3Rpb25zICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fRkFTVF9GT1JXQVJEKSAhPSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBtTWVkaWFUeXBlICE9IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1GZndkQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKG5ld0FjdGlvbnMgJiBQbGF5YmFja1N0YXRlLkFDVElPTl9TRUVLX1RPKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZWVrQXZhaWxhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtU2Vla0F2YWlsYWJsZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUGxheWJhY2tBY3Rpb25zID0gbmV3QWN0aW9uczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQWRkIGJ1dHRvbnMgaWYgY3VzdG9tIGFjdGlvbnMgYXJlIHByZXNlbnQuCi0gICAgICAgICAgICBMaXN0PFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uPiBjdXN0b21BY3Rpb25zID0gbVBsYXliYWNrU3RhdGUuZ2V0Q3VzdG9tQWN0aW9ucygpOwotICAgICAgICAgICAgbUN1c3RvbUJ1dHRvbnMucmVtb3ZlQWxsVmlld3MoKTsKLSAgICAgICAgICAgIGlmIChjdXN0b21BY3Rpb25zLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uIGFjdGlvbiA6IGN1c3RvbUFjdGlvbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgSW1hZ2VCdXR0b24gYnV0dG9uID0gbmV3IEltYWdlQnV0dG9uKG1JbnN0YW5jZS5nZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBBdHRyaWJ1dGVTZXQgKi8sIDAgLyogU3R5bGUgKi8pOwotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBBcHBseSBSLnN0eWxlLkJvdHRvbUJhckJ1dHRvbiB0byB0aGlzIGJ1dHRvbiB1c2luZyBsaWJyYXJ5IGNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgIC8vIFJlZmVyIENvbnN0cnVjdG9yIHdpdGggYXJndW1lbnQgKGludCBkZWZTdHlsZVJlcykgb2YgVmlldy5qYXZhCi0gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5zZXRJbWFnZVJlc291cmNlKGFjdGlvbi5nZXRJY29uKCkpOwotICAgICAgICAgICAgICAgICAgICBidXR0b24uc2V0VG9vbHRpcFRleHQoYWN0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhY3Rpb25TdHJpbmcgPSBhY3Rpb24uZ2V0QWN0aW9uKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgYnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogQ3VycmVudGx5LCB3ZSBhcmUganVzdCBzZW5kaW5nIGV4dHJhcyB0aGF0IGNhbWUgZnJvbSBzZXNzaW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElzIGl0IHRoZSByaWdodCBiZWhhdmlvcj8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udHJvbHMuc2VuZEN1c3RvbUFjdGlvbihhY3Rpb25TdHJpbmcsIGFjdGlvbi5nZXRFeHRyYXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXN0b21CdXR0b25zLmFkZFZpZXcoYnV0dG9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25NZXRhZGF0YUNoYW5nZWQoTWVkaWFNZXRhZGF0YSBtZXRhZGF0YSkgewotICAgICAgICAgICAgbU1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgICAgICAgICB1cGRhdGVEdXJhdGlvbigpOwotICAgICAgICAgICAgdXBkYXRlVGl0bGUoKTsKLSAgICAgICAgICAgIHVwZGF0ZUF1ZGlvTWV0YWRhdGEoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblNlc3Npb25FdmVudChTdHJpbmcgZXZlbnQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEVWRU5UX1VQREFURV9UUkFDS19TVEFUVVM6Ci0gICAgICAgICAgICAgICAgICAgIG1WaWRlb1RyYWNrQ291bnQgPSBleHRyYXMuZ2V0SW50KEtFWV9WSURFT19UUkFDS19DT1VOVCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG9uZSBvciBtb3JlIGF1ZGlvIHRyYWNrcywgYW5kIHRoaXMgaW5mb3JtYXRpb24gaGFzIG5vdCBiZWVuCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlZmxlY3RlZCBpbnRvIHRoZSBTZXR0aW5ncyB3aW5kb3cgeWV0LCBhdXRvbWF0aWNhbGx5IGNoZWNrIHRoZSBmaXJzdCB0cmFjay4KLSAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgQXVkaW8gVHJhY2sgc2VsZWN0aW9uIHdpbGwgYmUgZGVmYXVsdGVkIHRvICJOb25lIi4KLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tDb3VudCA9IGV4dHJhcy5nZXRJbnQoS0VZX0FVRElPX1RSQUNLX0NPVU5UKTsKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQXVkaW9UcmFja0NvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogYWRkIG1vcmUgdGV4dCBhYm91dCB0cmFjayBpbmZvLgotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQXVkaW9UcmFja0NvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHJhY2sgPSBtUmVzb3VyY2VzLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX251bWJlcl90ZXh0LCBpICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tMaXN0LmFkZCh0cmFjayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGFuZ2Ugc3ViIHRleHQgaW5zaWRlIHRoZSBTZXR0aW5ncyB3aW5kb3cuCi0gICAgICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NTdWJUZXh0c0xpc3Quc2V0KFNFVFRJTkdTX01PREVfQVVESU9fVFJBQ0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrTGlzdC5nZXQoMCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tMaXN0LmFkZChtUmVzb3VyY2VzLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfYXVkaW9fdHJhY2tfbm9uZV90ZXh0KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1WaWRlb1RyYWNrQ291bnQgPT0gMCAmJiBtQXVkaW9UcmFja0NvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhVHlwZSA9IE1FRElBX1RZUEVfTVVTSUM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVUcmFja0NvdW50ID0gZXh0cmFzLmdldEludChLRVlfU1VCVElUTEVfVFJBQ0tfQ09VTlQpOwotICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVEZXNjcmlwdGlvbnNMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU3VidGl0bGVUcmFja0NvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlRGVzY3JpcHRpb25zTGlzdC5hZGQobVJlc291cmNlcy5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX3N1YnRpdGxlX29mZl90ZXh0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1TdWJ0aXRsZVRyYWNrQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0cmFjayA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfc3VidGl0bGVfdHJhY2tfbnVtYmVyX3RleHQsIGkgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVEZXNjcmlwdGlvbnNMaXN0LmFkZCh0cmFjayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRVZFTlRfVVBEQVRFX01FRElBX1RZUEVfU1RBVFVTOgotICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5ld1N0YXR1cyA9IGV4dHJhcy5nZXRCb29sZWFuKEtFWV9TVEFURV9JU19BRFZFUlRJU0VNRU5UKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1N0YXR1cyAhPSBtSXNBZHZlcnRpc2VtZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSXNBZHZlcnRpc2VtZW50ID0gbmV3U3RhdHVzOwotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFNldHRpbmdzQWRhcHRlciBleHRlbmRzIEJhc2VBZGFwdGVyIHsKLSAgICAgICAgcHJpdmF0ZSBMaXN0PEludGVnZXI+IG1JY29uSWRzOwotICAgICAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtTWFpblRleHRzOwotICAgICAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtU3ViVGV4dHM7Ci0KLSAgICAgICAgcHVibGljIFNldHRpbmdzQWRhcHRlcihMaXN0PFN0cmluZz4gbWFpblRleHRzLCBATnVsbGFibGUgTGlzdDxTdHJpbmc+IHN1YlRleHRzLAotICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBMaXN0PEludGVnZXI+IGljb25JZHMpIHsKLSAgICAgICAgICAgIG1NYWluVGV4dHMgPSBtYWluVGV4dHM7Ci0gICAgICAgICAgICBtU3ViVGV4dHMgPSBzdWJUZXh0czsKLSAgICAgICAgICAgIG1JY29uSWRzID0gaWNvbklkczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVN1YlRleHRzKExpc3Q8U3RyaW5nPiBzdWJUZXh0cykgewotICAgICAgICAgICAgbVN1YlRleHRzID0gc3ViVGV4dHM7Ci0gICAgICAgICAgICBub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRNYWluVGV4dChpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgICAgIGlmIChtTWFpblRleHRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPCBtTWFpblRleHRzLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbU1haW5UZXh0cy5nZXQocG9zaXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBSRVNPVVJDRV9FTVBUWTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldENvdW50KCkgewotICAgICAgICAgICAgcmV0dXJuIChtTWFpblRleHRzID09IG51bGwpID8gMCA6IG1NYWluVGV4dHMuc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBsb25nIGdldEl0ZW1JZChpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgICAgIC8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViLS1kb2VzIG5vdCBoYXZlIGFueSBwdXJwb3NlIGhlcmUKLSAgICAgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzLgotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRJdGVtKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWItLWRvZXMgbm90IGhhdmUgYW55IHB1cnBvc2UgaGVyZQotICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMuCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIGNvbnRhaW5lcikgewotICAgICAgICAgICAgVmlldyByb3c7Ci0gICAgICAgICAgICBpZiAobVNpemVUeXBlID09IFNJWkVfVFlQRV9GVUxMKSB7Ci0gICAgICAgICAgICAgICAgcm93ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0LmZ1bGxfc2V0dGluZ3NfbGlzdF9pdGVtKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcm93ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0LmVtYmVkZGVkX3NldHRpbmdzX2xpc3RfaXRlbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUZXh0VmlldyBtYWluVGV4dFZpZXcgPSAoVGV4dFZpZXcpIHJvdy5maW5kVmlld0J5SWQoUi5pZC5tYWluX3RleHQpOwotICAgICAgICAgICAgVGV4dFZpZXcgc3ViVGV4dFZpZXcgPSAoVGV4dFZpZXcpIHJvdy5maW5kVmlld0J5SWQoUi5pZC5zdWJfdGV4dCk7Ci0gICAgICAgICAgICBJbWFnZVZpZXcgaWNvblZpZXcgPSAoSW1hZ2VWaWV3KSByb3cuZmluZFZpZXdCeUlkKFIuaWQuaWNvbik7Ci0KLSAgICAgICAgICAgIC8vIFNldCBtYWluIHRleHQKLSAgICAgICAgICAgIG1haW5UZXh0Vmlldy5zZXRUZXh0KG1NYWluVGV4dHMuZ2V0KHBvc2l0aW9uKSk7Ci0KLSAgICAgICAgICAgIC8vIFJlbW92ZSBzdWIgdGV4dCBhbmQgY2VudGVyIHRoZSBtYWluIHRleHQgaWYgc3ViIHRleHRzIGRvIG5vdCBleGlzdCBhdCBhbGwgb3IgdGhlIHN1YgotICAgICAgICAgICAgLy8gdGV4dCBhdCB0aGlzIHBhcnRpY3VsYXIgcG9zaXRpb24gaXMgZW1wdHkuCi0gICAgICAgICAgICBpZiAobVN1YlRleHRzID09IG51bGwgfHwgbVN1YlRleHRzLmdldChwb3NpdGlvbikgPT0gUkVTT1VSQ0VfRU1QVFkpIHsKLSAgICAgICAgICAgICAgICBzdWJUZXh0Vmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgc2V0IHN1YiB0ZXh0LgotICAgICAgICAgICAgICAgIHN1YlRleHRWaWV3LnNldFRleHQobVN1YlRleHRzLmdldChwb3NpdGlvbikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBSZW1vdmUgbWFpbiBpY29uIGFuZCBzZXQgdmlzaWJpbGl0eSB0byBnb25lIGlmIGljb25zIGFyZSBzZXQgdG8gbnVsbCBvciB0aGUgaWNvbiBhdAotICAgICAgICAgICAgLy8gdGhpcyBwYXJ0aWN1bGFyIHBvc2l0aW9uIGlzIHNldCB0byBSRVNPVVJDRV9OT05fRVhJU1RFTlQuCi0gICAgICAgICAgICBpZiAobUljb25JZHMgPT0gbnVsbCB8fCBtSWNvbklkcy5nZXQocG9zaXRpb24pID09IFJFU09VUkNFX05PTl9FWElTVEVOVCkgewotICAgICAgICAgICAgICAgIGljb25WaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBzZXQgbWFpbiBpY29uLgotICAgICAgICAgICAgICAgIGljb25WaWV3LnNldEltYWdlRHJhd2FibGUobVJlc291cmNlcy5nZXREcmF3YWJsZShtSWNvbklkcy5nZXQocG9zaXRpb24pLCBudWxsKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcm93OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0U3ViVGV4dHMoTGlzdDxTdHJpbmc+IHN1YlRleHRzKSB7Ci0gICAgICAgICAgICBtU3ViVGV4dHMgPSBzdWJUZXh0czsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRPRE86IGV4dGVuZCB0aGlzIGNsYXNzIGZyb20gU2V0dGluZ3NBZGFwdGVyCi0gICAgcHJpdmF0ZSBjbGFzcyBTdWJTZXR0aW5nc0FkYXB0ZXIgZXh0ZW5kcyBCYXNlQWRhcHRlciB7Ci0gICAgICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1UZXh0czsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUNoZWNrUG9zaXRpb247Ci0KLSAgICAgICAgcHVibGljIFN1YlNldHRpbmdzQWRhcHRlcihMaXN0PFN0cmluZz4gdGV4dHMsIGludCBjaGVja1Bvc2l0aW9uKSB7Ci0gICAgICAgICAgICBtVGV4dHMgPSB0ZXh0czsKLSAgICAgICAgICAgIG1DaGVja1Bvc2l0aW9uID0gY2hlY2tQb3NpdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFpblRleHQoaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgICAgICBpZiAobVRleHRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPCBtVGV4dHMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtVGV4dHMuZ2V0KHBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gUkVTT1VSQ0VfRU1QVFk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKLSAgICAgICAgICAgIHJldHVybiAobVRleHRzID09IG51bGwpID8gMCA6IG1UZXh0cy5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGxvbmcgZ2V0SXRlbUlkKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWItLWRvZXMgbm90IGhhdmUgYW55IHB1cnBvc2UgaGVyZQotICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMuCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEl0ZW0oaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgICAgICAvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yi0tZG9lcyBub3QgaGF2ZSBhbnkgcHVycG9zZSBoZXJlCi0gICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcy4KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgY29udGFpbmVyKSB7Ci0gICAgICAgICAgICBWaWV3IHJvdzsKLSAgICAgICAgICAgIGlmIChtU2l6ZVR5cGUgPT0gU0laRV9UWVBFX0ZVTEwpIHsKLSAgICAgICAgICAgICAgICByb3cgPSBBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgUi5sYXlvdXQuZnVsbF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcm93ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0LmVtYmVkZGVkX3N1Yl9zZXR0aW5nc19saXN0X2l0ZW0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVGV4dFZpZXcgdGV4dFZpZXcgPSAoVGV4dFZpZXcpIHJvdy5maW5kVmlld0J5SWQoUi5pZC50ZXh0KTsKLSAgICAgICAgICAgIEltYWdlVmlldyBjaGVja1ZpZXcgPSAoSW1hZ2VWaWV3KSByb3cuZmluZFZpZXdCeUlkKFIuaWQuY2hlY2spOwotCi0gICAgICAgICAgICB0ZXh0Vmlldy5zZXRUZXh0KG1UZXh0cy5nZXQocG9zaXRpb24pKTsKLSAgICAgICAgICAgIGlmIChwb3NpdGlvbiAhPSBtQ2hlY2tQb3NpdGlvbikgewotICAgICAgICAgICAgICAgIGNoZWNrVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByb3c7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0cyhMaXN0PFN0cmluZz4gdGV4dHMpIHsKLSAgICAgICAgICAgIG1UZXh0cyA9IHRleHRzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q2hlY2tQb3NpdGlvbihpbnQgY2hlY2tQb3NpdGlvbikgewotICAgICAgICAgICAgbUNoZWNrUG9zaXRpb24gPSBjaGVja1Bvc2l0aW9uOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvU3VidGl0bGVWaWV3LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9TdWJ0aXRsZVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdiMmNkMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9TdWJ0aXRsZVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLndpZGdldDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZS5TdWJ0aXRsZUNvbnRyb2xsZXIuQW5jaG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlLlN1YnRpdGxlVHJhY2suUmVuZGVyaW5nV2lkZ2V0OwotCi1jbGFzcyBTdWJ0aXRsZVZpZXcgZXh0ZW5kcyBGcmFtZUxheW91dCBpbXBsZW1lbnRzIEFuY2hvciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTdWJ0aXRsZVZpZXciOwotCi0gICAgcHJpdmF0ZSBSZW5kZXJpbmdXaWRnZXQgbVN1YnRpdGxlV2lkZ2V0OwotICAgIHByaXZhdGUgUmVuZGVyaW5nV2lkZ2V0Lk9uQ2hhbmdlZExpc3RlbmVyIG1TdWJ0aXRsZXNDaGFuZ2VkTGlzdGVuZXI7Ci0KLSAgICBwdWJsaWMgU3VidGl0bGVWaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdWJ0aXRsZVZpZXcoQ29udGV4dCBjb250ZXh0LCBATnVsbGFibGUgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBTdWJ0aXRsZVZpZXcoQ29udGV4dCBjb250ZXh0LCBATnVsbGFibGUgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN1YnRpdGxlVmlldygKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgQE51bGxhYmxlIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIGRlZlN0eWxlUmVzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZVdpZGdldChSZW5kZXJpbmdXaWRnZXQgc3VidGl0bGVXaWRnZXQpIHsKLSAgICAgICAgaWYgKG1TdWJ0aXRsZVdpZGdldCA9PSBzdWJ0aXRsZVdpZGdldCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgYm9vbGVhbiBhdHRhY2hlZFRvV2luZG93ID0gaXNBdHRhY2hlZFRvV2luZG93KCk7Ci0gICAgICAgIGlmIChtU3VidGl0bGVXaWRnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgICAgICBtU3VidGl0bGVXaWRnZXQub25EZXRhY2hlZEZyb21XaW5kb3coKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVN1YnRpdGxlV2lkZ2V0LnNldE9uQ2hhbmdlZExpc3RlbmVyKG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIG1TdWJ0aXRsZVdpZGdldCA9IHN1YnRpdGxlV2lkZ2V0OwotCi0gICAgICAgIGlmIChzdWJ0aXRsZVdpZGdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobVN1YnRpdGxlc0NoYW5nZWRMaXN0ZW5lciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVN1YnRpdGxlc0NoYW5nZWRMaXN0ZW5lciA9IG5ldyBSZW5kZXJpbmdXaWRnZXQuT25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZWQoUmVuZGVyaW5nV2lkZ2V0IHJlbmRlcmluZ1dpZGdldCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0V2lsbE5vdERyYXcoZmFsc2UpOwotICAgICAgICAgICAgc3VidGl0bGVXaWRnZXQuc2V0T25DaGFuZ2VkTGlzdGVuZXIobVN1YnRpdGxlc0NoYW5nZWRMaXN0ZW5lcik7Ci0KLSAgICAgICAgICAgIGlmIChhdHRhY2hlZFRvV2luZG93KSB7Ci0gICAgICAgICAgICAgICAgc3VidGl0bGVXaWRnZXQub25BdHRhY2hlZFRvV2luZG93KCk7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2V0V2lsbE5vdERyYXcodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExvb3BlciBnZXRTdWJ0aXRsZUxvb3BlcigpIHsKLSAgICAgICAgcmV0dXJuIExvb3Blci5nZXRNYWluTG9vcGVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgewotICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKLQotICAgICAgICBpZiAobVN1YnRpdGxlV2lkZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TdWJ0aXRsZVdpZGdldC5vbkF0dGFjaGVkVG9XaW5kb3coKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgewotICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvdygpOwotCi0gICAgICAgIGlmIChtU3VidGl0bGVXaWRnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgbVN1YnRpdGxlV2lkZ2V0Lm9uRGV0YWNoZWRGcm9tV2luZG93KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkxheW91dChib29sZWFuIGNoYW5nZWQsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pIHsKLSAgICAgICAgc3VwZXIub25MYXlvdXQoY2hhbmdlZCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKLQotICAgICAgICBpZiAobVN1YnRpdGxlV2lkZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCB3aWR0aCA9IGdldFdpZHRoKCkgLSBnZXRQYWRkaW5nTGVmdCgpIC0gZ2V0UGFkZGluZ1JpZ2h0KCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gZ2V0SGVpZ2h0KCkgLSBnZXRQYWRkaW5nVG9wKCkgLSBnZXRQYWRkaW5nQm90dG9tKCk7Ci0KLSAgICAgICAgICAgIG1TdWJ0aXRsZVdpZGdldC5zZXRTaXplKHdpZHRoLCBoZWlnaHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgY2FudmFzKSB7Ci0gICAgICAgIHN1cGVyLmRyYXcoY2FudmFzKTsKLQotICAgICAgICBpZiAobVN1YnRpdGxlV2lkZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBzYXZlQ291bnQgPSBjYW52YXMuc2F2ZSgpOwotICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZShnZXRQYWRkaW5nTGVmdCgpLCBnZXRQYWRkaW5nVG9wKCkpOwotICAgICAgICAgICAgbVN1YnRpdGxlV2lkZ2V0LmRyYXcoY2FudmFzKTsKLSAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChzYXZlQ291bnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRBY2Nlc3NpYmlsaXR5Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gU3VidGl0bGVWaWV3LmNsYXNzLmdldE5hbWUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1N1cmZhY2VWaWV3LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1N1cmZhY2VWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjOTJlODUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9TdXJmYWNlVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcyLlZJRVdfVFlQRV9TVVJGQUNFVklFVzsKLQotY2xhc3MgVmlkZW9TdXJmYWNlVmlldyBleHRlbmRzIFN1cmZhY2VWaWV3IGltcGxlbWVudHMgVmlkZW9WaWV3SW50ZXJmYWNlLCBTdXJmYWNlSG9sZGVyLkNhbGxiYWNrIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlZpZGVvU3VyZmFjZVZpZXciOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOyAvLyBTVE9QU0hJUDogTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOwotICAgIHByaXZhdGUgU3VyZmFjZUhvbGRlciBtU3VyZmFjZUhvbGRlciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdXJmYWNlTGlzdGVuZXIgbVN1cmZhY2VMaXN0ZW5lciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBNZWRpYVBsYXllcjIgbU1lZGlhUGxheWVyOwotICAgIC8vIEEgZmxhZyB0byBpbmRpY2F0ZSB0YWtpbmcgb3ZlciBvdGhlciB2aWV3IHNob3VsZCBiZSBwcm9jZWVkLgotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNUYWtpbmdPdmVyT2xkVmlldzsKLSAgICBwcml2YXRlIFZpZGVvVmlld0ludGVyZmFjZSBtT2xkVmlldzsKLQotCi0gICAgcHVibGljIFZpZGVvU3VyZmFjZVZpZXcoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZpZGVvU3VyZmFjZVZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZpZGVvU3VyZmFjZVZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmlkZW9TdXJmYWNlVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmU3R5bGVSZXMpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgZGVmU3R5bGVSZXMpOwotICAgICAgICBnZXRIb2xkZXIoKS5hZGRDYWxsYmFjayh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gaW1wbGVtZW50cyBWaWRlb1ZpZXdJbnRlcmZhY2UKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcihNZWRpYVBsYXllcjIgbXApIHsKLSAgICAgICAgTG9nLmQoVEFHLCAiYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIoKTogbVN1cmZhY2VIb2xkZXI6ICIgKyBtU3VyZmFjZUhvbGRlcik7Ci0gICAgICAgIGlmIChtcCA9PSBudWxsIHx8ICFoYXNBdmFpbGFibGVTdXJmYWNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBtcC5zZXREaXNwbGF5KG1TdXJmYWNlSG9sZGVyKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U3VyZmFjZUxpc3RlbmVyKFN1cmZhY2VMaXN0ZW5lciBsKSB7Ci0gICAgICAgIG1TdXJmYWNlTGlzdGVuZXIgPSBsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0Vmlld1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiBWSUVXX1RZUEVfU1VSRkFDRVZJRVc7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0TWVkaWFQbGF5ZXIoTWVkaWFQbGF5ZXIyIG1wKSB7Ci0gICAgICAgIG1NZWRpYVBsYXllciA9IG1wOwotICAgICAgICBpZiAobUlzVGFraW5nT3Zlck9sZFZpZXcpIHsKLSAgICAgICAgICAgIHRha2VPdmVyKG1PbGRWaWV3KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRha2VPdmVyKEBOb25OdWxsIFZpZGVvVmlld0ludGVyZmFjZSBvbGRWaWV3KSB7Ci0gICAgICAgIGlmIChhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcihtTWVkaWFQbGF5ZXIpKSB7Ci0gICAgICAgICAgICAoKFZpZXcpIG9sZFZpZXcpLnNldFZpc2liaWxpdHkoR09ORSk7Ci0gICAgICAgICAgICBtSXNUYWtpbmdPdmVyT2xkVmlldyA9IGZhbHNlOwotICAgICAgICAgICAgbU9sZFZpZXcgPSBudWxsOwotICAgICAgICAgICAgaWYgKG1TdXJmYWNlTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlVGFrZU92ZXJEb25lKHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUlzVGFraW5nT3Zlck9sZFZpZXcgPSB0cnVlOwotICAgICAgICAgICAgbU9sZFZpZXcgPSBvbGRWaWV3OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQXZhaWxhYmxlU3VyZmFjZSgpIHsKLSAgICAgICAgcmV0dXJuIChtU3VyZmFjZUhvbGRlciAhPSBudWxsICYmIG1TdXJmYWNlSG9sZGVyLmdldFN1cmZhY2UoKSAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gaW1wbGVtZW50cyBTdXJmYWNlSG9sZGVyLkNhbGxiYWNrCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3VyZmFjZUNyZWF0ZWQoU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAic3VyZmFjZUNyZWF0ZWQ6IG1TdXJmYWNlSG9sZGVyOiAiICsgbVN1cmZhY2VIb2xkZXIgKyAiLCBuZXcgaG9sZGVyOiAiICsgaG9sZGVyKTsKLSAgICAgICAgbVN1cmZhY2VIb2xkZXIgPSBob2xkZXI7Ci0gICAgICAgIGlmIChtSXNUYWtpbmdPdmVyT2xkVmlldykgewotICAgICAgICAgICAgdGFrZU92ZXIobU9sZFZpZXcpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIobU1lZGlhUGxheWVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIFJlY3QgcmVjdCA9IG1TdXJmYWNlSG9sZGVyLmdldFN1cmZhY2VGcmFtZSgpOwotICAgICAgICAgICAgbVN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VDcmVhdGVkKHRoaXMsIHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ2hhbmdlZChTdXJmYWNlSG9sZGVyIGhvbGRlciwgaW50IGZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlQ2hhbmdlZCh0aGlzLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VEZXN0cm95ZWQoU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKLSAgICAgICAgLy8gQWZ0ZXIgd2UgcmV0dXJuIGZyb20gdGhpcyB3ZSBjYW4ndCB1c2UgdGhlIHN1cmZhY2UgYW55IG1vcmUKLSAgICAgICAgbVN1cmZhY2VIb2xkZXIgPSBudWxsOwotICAgICAgICBpZiAobVN1cmZhY2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU3VyZmFjZUxpc3RlbmVyLm9uU3VyZmFjZURlc3Ryb3llZCh0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRPRE86IEludmVzdGlnYXRlIHRoZSB3YXkgdG8gbW92ZSBvbk1lYXN1cmUoKSBjb2RlIGludG8gRnJhbWVMYXlvdXQuCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgaW50IHZpZGVvV2lkdGggPSAobU1lZGlhUGxheWVyID09IG51bGwpID8gMCA6IG1NZWRpYVBsYXllci5nZXRWaWRlb1dpZHRoKCk7Ci0gICAgICAgIGludCB2aWRlb0hlaWdodCA9IChtTWVkaWFQbGF5ZXIgPT0gbnVsbCkgPyAwIDogbU1lZGlhUGxheWVyLmdldFZpZGVvSGVpZ2h0KCk7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25NZWFzdXJlKCIgKyBNZWFzdXJlU3BlYy50b1N0cmluZyh3aWR0aE1lYXN1cmVTcGVjKSArICIsICIKLSAgICAgICAgICAgICAgICAgICAgKyBNZWFzdXJlU3BlYy50b1N0cmluZyhoZWlnaHRNZWFzdXJlU3BlYykgKyAiKSIpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiIG1lYXN1cmVkU2l6ZTogIiArIGdldE1lYXN1cmVkV2lkdGgoKSArICIvIiArIGdldE1lYXN1cmVkSGVpZ2h0KCkpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiIHZpZXdTaXplOiAiICsgZ2V0V2lkdGgoKSArICIvIiArIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiBtVmlkZW9XaWR0aC9oZWlnaHQ6ICIgKyB2aWRlb1dpZHRoICsgIiwgIiArIHZpZGVvSGVpZ2h0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCB3aWR0aCA9IGdldERlZmF1bHRTaXplKHZpZGVvV2lkdGgsIHdpZHRoTWVhc3VyZVNwZWMpOwotICAgICAgICBpbnQgaGVpZ2h0ID0gZ2V0RGVmYXVsdFNpemUodmlkZW9IZWlnaHQsIGhlaWdodE1lYXN1cmVTcGVjKTsKLQotICAgICAgICBpZiAodmlkZW9XaWR0aCA+IDAgJiYgdmlkZW9IZWlnaHQgPiAwKSB7Ci0gICAgICAgICAgICBpbnQgd2lkdGhTcGVjU2l6ZSA9IE1lYXN1cmVTcGVjLmdldFNpemUod2lkdGhNZWFzdXJlU3BlYyk7Ci0gICAgICAgICAgICBpbnQgaGVpZ2h0U3BlY1NpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKGhlaWdodE1lYXN1cmVTcGVjKTsKLQotICAgICAgICAgICAgd2lkdGggPSB3aWR0aFNwZWNTaXplOwotICAgICAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0U3BlY1NpemU7Ci0KLSAgICAgICAgICAgIC8vIGZvciBjb21wYXRpYmlsaXR5LCB3ZSBhZGp1c3Qgc2l6ZSBiYXNlZCBvbiBhc3BlY3QgcmF0aW8KLSAgICAgICAgICAgIGlmICh2aWRlb1dpZHRoICogaGVpZ2h0IDwgd2lkdGggKiB2aWRlb0hlaWdodCkgewotICAgICAgICAgICAgICAgIHdpZHRoID0gaGVpZ2h0ICogdmlkZW9XaWR0aCAvIHZpZGVvSGVpZ2h0OwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJpbWFnZSB0b28gd2lkZSwgY29ycmVjdGluZy4gd2lkdGg6ICIgKyB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICh2aWRlb1dpZHRoICogaGVpZ2h0ID4gd2lkdGggKiB2aWRlb0hlaWdodCkgewotICAgICAgICAgICAgICAgIGhlaWdodCA9IHdpZHRoICogdmlkZW9IZWlnaHQgLyB2aWRlb1dpZHRoOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJpbWFnZSB0b28gdGFsbCwgY29ycmVjdGluZy4gaGVpZ2h0OiAiICsgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBubyBzaXplIHlldCwganVzdCBhZG9wdCB0aGUgZ2l2ZW4gc3BlYyBzaXplcwotICAgICAgICB9Ci0gICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKHdpZHRoLCBoZWlnaHQpOwotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5pKFRBRywgImVuZCBvZiBvbk1lYXN1cmUoKSIpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiIG1lYXN1cmVkU2l6ZTogIiArIGdldE1lYXN1cmVkV2lkdGgoKSArICIvIiArIGdldE1lYXN1cmVkSGVpZ2h0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJWaWV3VHlwZTogU3VyZmFjZVZpZXcgLyBWaXNpYmlsaXR5OiAiICsgZ2V0VmlzaWJpbGl0eSgpCi0gICAgICAgICAgICAgICAgKyAiIC8gc3VyZmFjZUhvbGRlcjogIiArIG1TdXJmYWNlSG9sZGVyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvVGV4dHVyZVZpZXcuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvVGV4dHVyZVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI0YTNhYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1RleHR1cmVWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC53aWRnZXQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlN1cmZhY2VUZXh0dXJlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uUmVxdWlyZXNBcGk7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOwotaW1wb3J0IGFuZHJvaWQudmlldy5UZXh0dXJlVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcyLlZJRVdfVFlQRV9URVhUVVJFVklFVzsKLQotQFJlcXVpcmVzQXBpKDI2KQotY2xhc3MgVmlkZW9UZXh0dXJlVmlldyBleHRlbmRzIFRleHR1cmVWaWV3Ci0gICAgICAgIGltcGxlbWVudHMgVmlkZW9WaWV3SW50ZXJmYWNlLCBUZXh0dXJlVmlldy5TdXJmYWNlVGV4dHVyZUxpc3RlbmVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlZpZGVvVGV4dHVyZVZpZXciOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOyAvLyBTVE9QU0hJUDogTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOwotCi0gICAgcHJpdmF0ZSBTdXJmYWNlVGV4dHVyZSBtU3VyZmFjZVRleHR1cmU7Ci0gICAgcHJpdmF0ZSBTdXJmYWNlIG1TdXJmYWNlOwotICAgIHByaXZhdGUgU3VyZmFjZUxpc3RlbmVyIG1TdXJmYWNlTGlzdGVuZXI7Ci0gICAgcHJpdmF0ZSBNZWRpYVBsYXllcjIgbU1lZGlhUGxheWVyOwotICAgIC8vIEEgZmxhZyB0byBpbmRpY2F0ZSB0YWtpbmcgb3ZlciBvdGhlciB2aWV3IHNob3VsZCBiZSBwcm9jZWVkLgotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNUYWtpbmdPdmVyT2xkVmlldzsKLSAgICBwcml2YXRlIFZpZGVvVmlld0ludGVyZmFjZSBtT2xkVmlldzsKLQotICAgIHB1YmxpYyBWaWRlb1RleHR1cmVWaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBWaWRlb1RleHR1cmVWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBWaWRlb1RleHR1cmVWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZpZGVvVGV4dHVyZVZpZXcoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIGRlZlN0eWxlUmVzKTsKLSAgICAgICAgc2V0U3VyZmFjZVRleHR1cmVMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gaW1wbGVtZW50cyBWaWRlb1ZpZXdJbnRlcmZhY2UKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcihNZWRpYVBsYXllcjIgbXApIHsKLSAgICAgICAgTG9nLmQoVEFHLCAiYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIoKTogbVN1cmZhY2VUZXh0dXJlOiAiICsgbVN1cmZhY2VUZXh0dXJlKTsKLSAgICAgICAgaWYgKG1wID09IG51bGwgfHwgIWhhc0F2YWlsYWJsZVN1cmZhY2UoKSkgewotICAgICAgICAgICAgLy8gU3VyZmFjZSBpcyBub3QgcmVhZHkuCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgbXAuc2V0U3VyZmFjZShtU3VyZmFjZSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFN1cmZhY2VMaXN0ZW5lcihTdXJmYWNlTGlzdGVuZXIgbCkgewotICAgICAgICBtU3VyZmFjZUxpc3RlbmVyID0gbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFZpZXdUeXBlKCkgewotICAgICAgICByZXR1cm4gVklFV19UWVBFX1RFWFRVUkVWSUVXOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhUGxheWVyKE1lZGlhUGxheWVyMiBtcCkgewotICAgICAgICBtTWVkaWFQbGF5ZXIgPSBtcDsKLSAgICAgICAgaWYgKG1Jc1Rha2luZ092ZXJPbGRWaWV3KSB7Ci0gICAgICAgICAgICB0YWtlT3ZlcihtT2xkVmlldyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0YWtlT3ZlcihATm9uTnVsbCBWaWRlb1ZpZXdJbnRlcmZhY2Ugb2xkVmlldykgewotICAgICAgICBpZiAoYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIobU1lZGlhUGxheWVyKSkgewotICAgICAgICAgICAgKChWaWV3KSBvbGRWaWV3KS5zZXRWaXNpYmlsaXR5KEdPTkUpOwotICAgICAgICAgICAgbUlzVGFraW5nT3Zlck9sZFZpZXcgPSBmYWxzZTsKLSAgICAgICAgICAgIG1PbGRWaWV3ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU3VyZmFjZUxpc3RlbmVyLm9uU3VyZmFjZVRha2VPdmVyRG9uZSh0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Jc1Rha2luZ092ZXJPbGRWaWV3ID0gdHJ1ZTsKLSAgICAgICAgICAgIG1PbGRWaWV3ID0gb2xkVmlldzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGhhc0F2YWlsYWJsZVN1cmZhY2UoKSB7Ci0gICAgICAgIHJldHVybiAobVN1cmZhY2VUZXh0dXJlICE9IG51bGwgJiYgIW1TdXJmYWNlVGV4dHVyZS5pc1JlbGVhc2VkKCkgJiYgbVN1cmZhY2UgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIGltcGxlbWVudHMgVGV4dHVyZVZpZXcuU3VyZmFjZVRleHR1cmVMaXN0ZW5lcgotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZVRleHR1cmVBdmFpbGFibGUoU3VyZmFjZVRleHR1cmUgc3VyZmFjZVRleHR1cmUsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICBMb2cuZChUQUcsICJvblN1cmZhY2VUZXh0dXJlQXZhaWxhYmxlOiBtU3VyZmFjZVRleHR1cmU6ICIgKyBtU3VyZmFjZVRleHR1cmUKLSAgICAgICAgICAgICAgICArICIsIG5ldyBzdXJmYWNlOiAiICsgc3VyZmFjZVRleHR1cmUpOwotICAgICAgICBtU3VyZmFjZVRleHR1cmUgPSBzdXJmYWNlVGV4dHVyZTsKLSAgICAgICAgbVN1cmZhY2UgPSBuZXcgU3VyZmFjZShtU3VyZmFjZVRleHR1cmUpOwotICAgICAgICBpZiAobUlzVGFraW5nT3Zlck9sZFZpZXcpIHsKLSAgICAgICAgICAgIHRha2VPdmVyKG1PbGRWaWV3KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKG1NZWRpYVBsYXllcik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1TdXJmYWNlTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VDcmVhdGVkKHRoaXMsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdXJmYWNlVGV4dHVyZVNpemVDaGFuZ2VkKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2VUZXh0dXJlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgaWYgKG1TdXJmYWNlTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VDaGFuZ2VkKHRoaXMsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHJlcXVlc3RMYXlvdXQoKTsgIC8vIFRPRE86IGZpZ3VyZSBvdXQgaWYgaXQgc2hvdWxkIGJlIGNhbGxlZCBoZXJlPwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZVRleHR1cmVVcGRhdGVkKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2UpIHsKLSAgICAgICAgLy8gbm8tb3AKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblN1cmZhY2VUZXh0dXJlRGVzdHJveWVkKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2VUZXh0dXJlKSB7Ci0gICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlRGVzdHJveWVkKHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIG1TdXJmYWNlVGV4dHVyZSA9IG51bGw7Ci0gICAgICAgIG1TdXJmYWNlID0gbnVsbDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgaW50IHZpZGVvV2lkdGggPSAobU1lZGlhUGxheWVyID09IG51bGwpID8gMCA6IG1NZWRpYVBsYXllci5nZXRWaWRlb1dpZHRoKCk7Ci0gICAgICAgIGludCB2aWRlb0hlaWdodCA9IChtTWVkaWFQbGF5ZXIgPT0gbnVsbCkgPyAwIDogbU1lZGlhUGxheWVyLmdldFZpZGVvSGVpZ2h0KCk7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25NZWFzdXJlKCIgKyBNZWFzdXJlU3BlYy50b1N0cmluZyh3aWR0aE1lYXN1cmVTcGVjKSArICIsICIKLSAgICAgICAgICAgICAgICAgICAgKyBNZWFzdXJlU3BlYy50b1N0cmluZyhoZWlnaHRNZWFzdXJlU3BlYykgKyAiKSIpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiIG1lYXN1cmVkU2l6ZTogIiArIGdldE1lYXN1cmVkV2lkdGgoKSArICIvIiArIGdldE1lYXN1cmVkSGVpZ2h0KCkpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiIHZpZXdTaXplOiAiICsgZ2V0V2lkdGgoKSArICIvIiArIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiBtVmlkZW9XaWR0aC9oZWlnaHQ6ICIgKyB2aWRlb1dpZHRoICsgIiwgIiArIHZpZGVvSGVpZ2h0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCB3aWR0aCA9IGdldERlZmF1bHRTaXplKHZpZGVvV2lkdGgsIHdpZHRoTWVhc3VyZVNwZWMpOwotICAgICAgICBpbnQgaGVpZ2h0ID0gZ2V0RGVmYXVsdFNpemUodmlkZW9IZWlnaHQsIGhlaWdodE1lYXN1cmVTcGVjKTsKLQotICAgICAgICBpZiAodmlkZW9XaWR0aCA+IDAgJiYgdmlkZW9IZWlnaHQgPiAwKSB7Ci0gICAgICAgICAgICBpbnQgd2lkdGhTcGVjU2l6ZSA9IE1lYXN1cmVTcGVjLmdldFNpemUod2lkdGhNZWFzdXJlU3BlYyk7Ci0gICAgICAgICAgICBpbnQgaGVpZ2h0U3BlY1NpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKGhlaWdodE1lYXN1cmVTcGVjKTsKLQotICAgICAgICAgICAgd2lkdGggPSB3aWR0aFNwZWNTaXplOwotICAgICAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0U3BlY1NpemU7Ci0KLSAgICAgICAgICAgIC8vIGZvciBjb21wYXRpYmlsaXR5LCB3ZSBhZGp1c3Qgc2l6ZSBiYXNlZCBvbiBhc3BlY3QgcmF0aW8KLSAgICAgICAgICAgIGlmICh2aWRlb1dpZHRoICogaGVpZ2h0IDwgd2lkdGggKiB2aWRlb0hlaWdodCkgewotICAgICAgICAgICAgICAgIHdpZHRoID0gaGVpZ2h0ICogdmlkZW9XaWR0aCAvIHZpZGVvSGVpZ2h0OwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJpbWFnZSB0b28gd2lkZSwgY29ycmVjdGluZy4gd2lkdGg6ICIgKyB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICh2aWRlb1dpZHRoICogaGVpZ2h0ID4gd2lkdGggKiB2aWRlb0hlaWdodCkgewotICAgICAgICAgICAgICAgIGhlaWdodCA9IHdpZHRoICogdmlkZW9IZWlnaHQgLyB2aWRlb1dpZHRoOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJpbWFnZSB0b28gdGFsbCwgY29ycmVjdGluZy4gaGVpZ2h0OiAiICsgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBubyBzaXplIHlldCwganVzdCBhZG9wdCB0aGUgZ2l2ZW4gc3BlYyBzaXplcwotICAgICAgICB9Ci0gICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKHdpZHRoLCBoZWlnaHQpOwotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5pKFRBRywgImVuZCBvZiBvbk1lYXN1cmUoKSIpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiIG1lYXN1cmVkU2l6ZTogIiArIGdldE1lYXN1cmVkV2lkdGgoKSArICIvIiArIGdldE1lYXN1cmVkSGVpZ2h0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJWaWV3VHlwZTogVGV4dHVyZVZpZXcgLyBWaXNpYmlsaXR5OiAiICsgZ2V0VmlzaWJpbGl0eSgpCi0gICAgICAgICAgICAgICAgKyAiIC8gc3VyZmFjZVRleHR1cmU6ICIgKyBtU3VyZmFjZVRleHR1cmU7Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1ZpZXcySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9WaWV3MkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcyNzlkNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1ZpZXcySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLndpZGdldDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Gb2N1c1JlcXVlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5EYXRhU291cmNlRGVzYzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGE7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjIuTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMi5PblN1YnRpdGxlRGF0YUxpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIySW1wbDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlN1YnRpdGxlRGF0YTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZXRhZGF0YTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlBsYXliYWNrUGFyYW1zOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuVGltZWRUZXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYUNvbnRyb2xsZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhQ29udHJvbGxlci5QbGF5YmFja0luZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVmlkZW9WaWV3MlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZpZXdHcm91cFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkFzeW5jVGFzazsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTGF5b3V0UGFyYW1zOwotaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5NZWRpYUNvbnRyb2xWaWV3MjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcyOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuZ3JhcGhpY3MucGFsZXR0ZS5QYWxldHRlOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLlJvdXRlUGxheWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlLkNsb3NlZENhcHRpb25SZW5kZXJlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZS5TdWJ0aXRsZUNvbnRyb2xsZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGUuU3VidGl0bGVUcmFjazsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFJdGVtU3RhdHVzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFDb250cm9sSW50ZW50OwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBWaWRlb1ZpZXcySW1wbCBleHRlbmRzIEJhc2VMYXlvdXQKLSAgICAgICAgaW1wbGVtZW50cyBWaWRlb1ZpZXcyUHJvdmlkZXIsIFZpZGVvVmlld0ludGVyZmFjZS5TdXJmYWNlTGlzdGVuZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVmlkZW9WaWV3MiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7IC8vIFNUT1BTSElQOiBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBERUZBVUxUX1NIT1dfQ09OVFJPTExFUl9JTlRFUlZBTF9NUyA9IDIwMDA7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZGVvVmlldzIgbUluc3RhbmNlOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0VSUk9SID0gLTE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0lETEUgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QUkVQQVJJTkcgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QUkVQQVJFRCA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1BMQVlJTkcgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QQVVTRUQgPSA0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QTEFZQkFDS19DT01QTEVURUQgPSA1OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfVFJBQ0tfSU5ERVggPSAtMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBJTlZBTElEX1NQRUVEID0gMGY7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UWVBFX0VNQkVEREVEID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UWVBFX0ZVTEwgPSAxOwotICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciBNaW5pbWFsIHNpemUgdHlwZS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UWVBFX01JTklNQUwgPSAyOwotCi0gICAgcHJpdmF0ZSBBY2Nlc3NpYmlsaXR5TWFuYWdlciBtQWNjZXNzaWJpbGl0eU1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBBdWRpb01hbmFnZXIgbUF1ZGlvTWFuYWdlcjsKLSAgICBwcml2YXRlIEF1ZGlvQXR0cmlidXRlcyBtQXVkaW9BdHRyaWJ1dGVzOwotICAgIHByaXZhdGUgaW50IG1BdWRpb0ZvY3VzVHlwZSA9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX0dBSU47IC8vIGxlZ2FjeSBmb2N1cyBnYWluCi0KLSAgICBwcml2YXRlIFBhaXI8RXhlY3V0b3IsIFZpZGVvVmlldzIuT25DdXN0b21BY3Rpb25MaXN0ZW5lcj4gbUN1c3RvbUFjdGlvbkxpc3RlbmVyUmVjb3JkOwotICAgIHByaXZhdGUgVmlkZW9WaWV3Mi5PblZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyIG1WaWV3VHlwZUNoYW5nZWRMaXN0ZW5lcjsKLSAgICBwcml2YXRlIFZpZGVvVmlldzIuT25GdWxsU2NyZWVuUmVxdWVzdExpc3RlbmVyIG1GdWxsU2NyZWVuUmVxdWVzdExpc3RlbmVyOwotCi0gICAgcHJpdmF0ZSBWaWRlb1ZpZXdJbnRlcmZhY2UgbUN1cnJlbnRWaWV3OwotICAgIHByaXZhdGUgVmlkZW9UZXh0dXJlVmlldyBtVGV4dHVyZVZpZXc7Ci0gICAgcHJpdmF0ZSBWaWRlb1N1cmZhY2VWaWV3IG1TdXJmYWNlVmlldzsKLQotICAgIHByaXZhdGUgTWVkaWFQbGF5ZXIyIG1NZWRpYVBsYXllcjsKLSAgICBwcml2YXRlIERhdGFTb3VyY2VEZXNjIG1Ec2Q7Ci0gICAgcHJpdmF0ZSBNZWRpYUNvbnRyb2xWaWV3MiBtTWVkaWFDb250cm9sVmlldzsKLSAgICBwcml2YXRlIE1lZGlhU2Vzc2lvbiBtTWVkaWFTZXNzaW9uOwotICAgIHByaXZhdGUgTWVkaWFDb250cm9sbGVyIG1NZWRpYUNvbnRyb2xsZXI7Ci0gICAgcHJpdmF0ZSBNZXRhZGF0YSBtTWV0YWRhdGE7Ci0gICAgcHJpdmF0ZSBNZWRpYU1ldGFkYXRhMiBtTWVkaWFNZXRhZGF0YTsKLSAgICBwcml2YXRlIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIgbVJldHJpZXZlcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gbU5lZWRVcGRhdGVNZWRpYVR5cGU7Ci0gICAgcHJpdmF0ZSBCdW5kbGUgbU1lZGlhVHlwZURhdGE7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVRpdGxlOwotCi0gICAgLy8gVE9ETzogbW92ZSBtdXNpYyB2aWV3IGluc2lkZSBTdXJmYWNlVmlldy9UZXh0dXJlVmlldyBvciBpbXBsZW1lbnQgVmlkZW9WaWV3SW50ZXJmYWNlLgotICAgIHByaXZhdGUgV2luZG93TWFuYWdlciBtTWFuYWdlcjsKLSAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzb3VyY2VzOwotICAgIHByaXZhdGUgVmlldyBtTXVzaWNWaWV3OwotICAgIHByaXZhdGUgRHJhd2FibGUgbU11c2ljQWxidW1EcmF3YWJsZTsKLSAgICBwcml2YXRlIFN0cmluZyBtTXVzaWNUaXRsZVRleHQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbU11c2ljQXJ0aXN0VGV4dDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzTXVzaWNNZWRpYVR5cGU7Ci0gICAgcHJpdmF0ZSBpbnQgbVByZXZXaWR0aDsKLSAgICBwcml2YXRlIGludCBtUHJldkhlaWdodDsKLSAgICBwcml2YXRlIGludCBtRG9taW5hbnRDb2xvcjsKLSAgICBwcml2YXRlIGludCBtU2l6ZVR5cGU7Ci0KLSAgICBwcml2YXRlIFBsYXliYWNrU3RhdGUuQnVpbGRlciBtU3RhdGVCdWlsZGVyOwotICAgIHByaXZhdGUgTGlzdDxQbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbj4gbUN1c3RvbUFjdGlvbkxpc3Q7Ci0gICAgcHJpdmF0ZSBpbnQgbVRhcmdldFN0YXRlID0gU1RBVEVfSURMRTsKLSAgICBwcml2YXRlIGludCBtQ3VycmVudFN0YXRlID0gU1RBVEVfSURMRTsKLSAgICBwcml2YXRlIGludCBtQ3VycmVudEJ1ZmZlclBlcmNlbnRhZ2U7Ci0gICAgcHJpdmF0ZSBsb25nIG1TZWVrV2hlblByZXBhcmVkOyAgLy8gcmVjb3JkaW5nIHRoZSBzZWVrIHBvc2l0aW9uIHdoaWxlIHByZXBhcmluZwotCi0gICAgcHJpdmF0ZSBpbnQgbVZpZGVvV2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbVZpZGVvSGVpZ2h0OwotCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8SW50ZWdlcj4gbVZpZGVvVHJhY2tJbmRpY2VzOwotICAgIHByaXZhdGUgQXJyYXlMaXN0PEludGVnZXI+IG1BdWRpb1RyYWNrSW5kaWNlczsKLSAgICBwcml2YXRlIEFycmF5TGlzdDxQYWlyPEludGVnZXIsIFN1YnRpdGxlVHJhY2s+PiBtU3VidGl0bGVUcmFja0luZGljZXM7Ci0gICAgcHJpdmF0ZSBTdWJ0aXRsZUNvbnRyb2xsZXIgbVN1YnRpdGxlQ29udHJvbGxlcjsKLQotICAgIC8vIHNlbGVjdGVkIHZpZGVvL2F1ZGlvL3N1YnRpdGxlIHRyYWNrIGluZGV4IGFzIE1lZGlhUGxheWVyMiByZXR1cm5zCi0gICAgcHJpdmF0ZSBpbnQgbVNlbGVjdGVkVmlkZW9UcmFja0luZGV4OwotICAgIHByaXZhdGUgaW50IG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleDsKLSAgICBwcml2YXRlIGludCBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXg7Ci0KLSAgICBwcml2YXRlIFN1YnRpdGxlVmlldyBtU3VidGl0bGVWaWV3OwotICAgIHByaXZhdGUgYm9vbGVhbiBtU3VidGl0bGVFbmFibGVkOwotCi0gICAgcHJpdmF0ZSBmbG9hdCBtU3BlZWQ7Ci0gICAgLy8gVE9ETzogUmVtb3ZlIG1GYWxsYmFja1NwZWVkIHdoZW4gaW50ZWdyYXRpb24gd2l0aCBNZWRpYVBsYXllcjIncyBuZXcgc2V0UGxheWJhY2tQYXJhbXMoKS4KLSAgICAvLyBSZWZlcjogaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xbnpBZm5zNmkyaEozUmthVXJlM1FNVDZ3c0RlZEo1T05MaUFfT09CRkZYOC9lZGl0Ci0gICAgcHJpdmF0ZSBmbG9hdCBtRmFsbGJhY2tTcGVlZDsgIC8vIGtlZXAgdGhlIG9yaWdpbmFsIHNwZWVkIGJlZm9yZSAncGF1c2UnIGlzIGNhbGxlZC4KLSAgICBwcml2YXRlIGZsb2F0IG1Wb2x1bWVMZXZlbEZsb2F0OwotICAgIHByaXZhdGUgaW50IG1Wb2x1bWVMZXZlbDsKLQotICAgIHByaXZhdGUgbG9uZyBtU2hvd0NvbnRyb2xsZXJJbnRlcnZhbE1zOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlciBtTWVkaWFSb3V0ZXI7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVJvdXRlU2VsZWN0b3I7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gbVJvdXRlOwotICAgIHByaXZhdGUgUm91dGVQbGF5ZXIgbVJvdXRlUGxheWVyOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlci5DYWxsYmFjayBtUm91dGVyQ2FsbGJhY2sgPSBuZXcgTWVkaWFSb3V0ZXIuQ2FsbGJhY2soKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlU2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZS5zdXBwb3J0c0NvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKSkgewotICAgICAgICAgICAgICAgIC8vIFN0b3AgbG9jYWwgcGxheWJhY2sgKGlmIG5lY2Vzc2FyeSkKLSAgICAgICAgICAgICAgICByZXNldFBsYXllcigpOwotICAgICAgICAgICAgICAgIG1Sb3V0ZSA9IHJvdXRlOwotICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllciA9IG5ldyBSb3V0ZVBsYXllcihtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgbVJvdXRlUGxheWVyLnNldFBsYXllckV2ZW50Q2FsbGJhY2sobmV3IFJvdXRlUGxheWVyLlBsYXllckV2ZW50Q2FsbGJhY2soKSB7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXllclN0YXRlQ2hhbmdlZChNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICAgICAgUGxheWJhY2tTdGF0ZS5CdWlsZGVyIHBzQnVpbGRlciA9IG5ldyBQbGF5YmFja1N0YXRlLkJ1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBzQnVpbGRlci5zZXRBY3Rpb25zKFJvdXRlUGxheWVyLlBMQVlCQUNLX0FDVElPTlMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBwb3NpdGlvbiA9IGl0ZW1TdGF0dXMuZ2V0Q29udGVudFBvc2l0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGl0ZW1TdGF0dXMuZ2V0UGxheWJhY2tTdGF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUl0ZW1TdGF0dXMuUExBWUJBQ0tfU1RBVEVfUEVORElORzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNCdWlsZGVyLnNldFN0YXRlKFBsYXliYWNrU3RhdGUuU1RBVEVfTk9ORSwgcG9zaXRpb24sIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfSURMRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUl0ZW1TdGF0dXMuUExBWUJBQ0tfU1RBVEVfUExBWUlORzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNCdWlsZGVyLnNldFN0YXRlKFBsYXliYWNrU3RhdGUuU1RBVEVfUExBWUlORywgcG9zaXRpb24sIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUExBWUlORzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUl0ZW1TdGF0dXMuUExBWUJBQ0tfU1RBVEVfUEFVU0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc0J1aWxkZXIuc2V0U3RhdGUoUGxheWJhY2tTdGF0ZS5TVEFURV9QQVVTRUQsIHBvc2l0aW9uLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BBVVNFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUl0ZW1TdGF0dXMuUExBWUJBQ0tfU1RBVEVfQlVGRkVSSU5HOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc0J1aWxkZXIuc2V0U3RhdGUoUGxheWJhY2tTdGF0ZS5TVEFURV9CVUZGRVJJTkcsIHBvc2l0aW9uLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BBVVNFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUl0ZW1TdGF0dXMuUExBWUJBQ0tfU1RBVEVfRklOSVNIRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzQnVpbGRlci5zZXRTdGF0ZShQbGF5YmFja1N0YXRlLlNUQVRFX1NUT1BQRUQsIHBvc2l0aW9uLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BMQVlCQUNLX0NPTVBMRVRFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrU3RhdGUgcGJTdGF0ZSA9IHBzQnVpbGRlci5idWlsZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRQbGF5YmFja1N0YXRlKHBiU3RhdGUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhLkJ1aWxkZXIgbW1CdWlsZGVyID0gbmV3IE1lZGlhTWV0YWRhdGEuQnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgbW1CdWlsZGVyLnB1dExvbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfRFVSQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1TdGF0dXMuZ2V0Q29udGVudER1cmF0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRNZXRhZGF0YShtbUJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAvLyBTdGFydCByZW1vdGUgcGxheWJhY2sgKGlmIG5lY2Vzc2FyeSkKLSAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIub3BlblZpZGVvKG1Ec2QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlLCBpbnQgcmVhc29uKSB7Ci0gICAgICAgICAgICBpZiAobVJvdXRlICE9IG51bGwgJiYgbVJvdXRlUGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllciA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVJvdXRlID09IHJvdXRlKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZWFzb24gIT0gTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1JPVVRFX0NIQU5HRUQpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBSZXN1bWUgbG9jYWwgcGxheWJhY2sgIChpZiBuZWNlc3NhcnkpCi0gICAgICAgICAgICAgICAgb3BlblZpZGVvKG1Ec2QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHB1YmxpYyBWaWRlb1ZpZXcySW1wbChWaWRlb1ZpZXcyIGluc3RhbmNlLAotICAgICAgICAgICAgVmlld0dyb3VwUHJvdmlkZXIgc3VwZXJQcm92aWRlciwgVmlld0dyb3VwUHJvdmlkZXIgcHJpdmF0ZVByb3ZpZGVyKSB7Ci0gICAgICAgIHN1cGVyKGluc3RhbmNlLCBzdXBlclByb3ZpZGVyLCBwcml2YXRlUHJvdmlkZXIpOwotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKEBOdWxsYWJsZSBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykgewotICAgICAgICBtVmlkZW9XaWR0aCA9IDA7Ci0gICAgICAgIG1WaWRlb0hlaWdodCA9IDA7Ci0gICAgICAgIG1TcGVlZCA9IDEuMGY7Ci0gICAgICAgIG1GYWxsYmFja1NwZWVkID0gbVNwZWVkOwotICAgICAgICBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXggPSBJTlZBTElEX1RSQUNLX0lOREVYOwotICAgICAgICAvLyBUT0RPOiBhZGQgYXR0cmlidXRlcyB0byBnZXQgdGhpcyB2YWx1ZS4KLSAgICAgICAgbVNob3dDb250cm9sbGVySW50ZXJ2YWxNcyA9IERFRkFVTFRfU0hPV19DT05UUk9MTEVSX0lOVEVSVkFMX01TOwotCi0gICAgICAgIG1BY2Nlc3NpYmlsaXR5TWFuYWdlciA9IEFjY2Vzc2liaWxpdHlNYW5hZ2VyLmdldEluc3RhbmNlKG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOwotCi0gICAgICAgIG1BdWRpb01hbmFnZXIgPSAoQXVkaW9NYW5hZ2VyKSBtSW5zdGFuY2UuZ2V0Q29udGV4dCgpCi0gICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BVURJT19TRVJWSUNFKTsKLSAgICAgICAgbUF1ZGlvQXR0cmlidXRlcyA9IG5ldyBBdWRpb0F0dHJpYnV0ZXMuQnVpbGRlcigpLnNldFVzYWdlKEF1ZGlvQXR0cmlidXRlcy5VU0FHRV9NRURJQSkKLSAgICAgICAgICAgICAgICAuc2V0Q29udGVudFR5cGUoQXVkaW9BdHRyaWJ1dGVzLkNPTlRFTlRfVFlQRV9NT1ZJRSkuYnVpbGQoKTsKLSAgICAgICAgbUluc3RhbmNlLnNldEZvY3VzYWJsZSh0cnVlKTsKLSAgICAgICAgbUluc3RhbmNlLnNldEZvY3VzYWJsZUluVG91Y2hNb2RlKHRydWUpOwotICAgICAgICBtSW5zdGFuY2UucmVxdWVzdEZvY3VzKCk7Ci0KLSAgICAgICAgLy8gVE9ETzogdHJ5IHRvIGtlZXAgYSBzaW5nbGUgY2hpbGQgYXQgYSB0aW1lIHJhdGhlciB0aGFuIGFsd2F5cyBoYXZpbmcgYm90aC4KLSAgICAgICAgbVRleHR1cmVWaWV3ID0gbmV3IFZpZGVvVGV4dHVyZVZpZXcobUluc3RhbmNlLmdldENvbnRleHQoKSk7Ci0gICAgICAgIG1TdXJmYWNlVmlldyA9IG5ldyBWaWRlb1N1cmZhY2VWaWV3KG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOwotICAgICAgICBMYXlvdXRQYXJhbXMgcGFyYW1zID0gbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAotICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpOwotICAgICAgICBtVGV4dHVyZVZpZXcuc2V0TGF5b3V0UGFyYW1zKHBhcmFtcyk7Ci0gICAgICAgIG1TdXJmYWNlVmlldy5zZXRMYXlvdXRQYXJhbXMocGFyYW1zKTsKLSAgICAgICAgbVRleHR1cmVWaWV3LnNldFN1cmZhY2VMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgbVN1cmZhY2VWaWV3LnNldFN1cmZhY2VMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgbUluc3RhbmNlLmFkZFZpZXcobVRleHR1cmVWaWV3KTsKLSAgICAgICAgbUluc3RhbmNlLmFkZFZpZXcobVN1cmZhY2VWaWV3KTsKLQotICAgICAgICBtU3VidGl0bGVWaWV3ID0gbmV3IFN1YnRpdGxlVmlldyhtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRMYXlvdXRQYXJhbXMocGFyYW1zKTsKLSAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRCYWNrZ3JvdW5kQ29sb3IoMCk7Ci0gICAgICAgIG1JbnN0YW5jZS5hZGRWaWV3KG1TdWJ0aXRsZVZpZXcpOwotCi0gICAgICAgIGJvb2xlYW4gZW5hYmxlQ29udHJvbFZpZXcgPSAoYXR0cnMgPT0gbnVsbCkgfHwgYXR0cnMuZ2V0QXR0cmlidXRlQm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiLAotICAgICAgICAgICAgICAgICJlbmFibGVDb250cm9sVmlldyIsIHRydWUpOwotICAgICAgICBpZiAoZW5hYmxlQ29udHJvbFZpZXcpIHsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3ID0gbmV3IE1lZGlhQ29udHJvbFZpZXcyKG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVN1YnRpdGxlRW5hYmxlZCA9IChhdHRycyA9PSBudWxsKSB8fCBhdHRycy5nZXRBdHRyaWJ1dGVCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIsCi0gICAgICAgICAgICAgICAgImVuYWJsZVN1YnRpdGxlIiwgZmFsc2UpOwotCi0gICAgICAgIC8vIFRPRE86IENob29zZSBUZXh0dXJlVmlldyB3aGVuIFN1cmZhY2VWaWV3IGNhbm5vdCBiZSBjcmVhdGVkLgotICAgICAgICAvLyBDaG9vc2Ugc3VyZmFjZSB2aWV3IGJ5IGRlZmF1bHQKLSAgICAgICAgaW50IHZpZXdUeXBlID0gKGF0dHJzID09IG51bGwpID8gVmlkZW9WaWV3Mi5WSUVXX1RZUEVfU1VSRkFDRVZJRVcKLSAgICAgICAgICAgICAgICA6IGF0dHJzLmdldEF0dHJpYnV0ZUludFZhbHVlKAotICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiLAotICAgICAgICAgICAgICAgICJ2aWV3VHlwZSIsIFZpZGVvVmlldzIuVklFV19UWVBFX1NVUkZBQ0VWSUVXKTsKLSAgICAgICAgaWYgKHZpZXdUeXBlID09IFZpZGVvVmlldzIuVklFV19UWVBFX1NVUkZBQ0VWSUVXKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJ2aWV3VHlwZSBhdHRyaWJ1dGUgaXMgc3VyZmFjZVZpZXcuIik7Ci0gICAgICAgICAgICBtVGV4dHVyZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVN1cmZhY2VWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1DdXJyZW50VmlldyA9IG1TdXJmYWNlVmlldzsKLSAgICAgICAgfSBlbHNlIGlmICh2aWV3VHlwZSA9PSBWaWRlb1ZpZXcyLlZJRVdfVFlQRV9URVhUVVJFVklFVykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAidmlld1R5cGUgYXR0cmlidXRlIGlzIHRleHR1cmVWaWV3LiIpOwotICAgICAgICAgICAgbVRleHR1cmVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1TdXJmYWNlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtQ3VycmVudFZpZXcgPSBtVGV4dHVyZVZpZXc7Ci0gICAgICAgIH0KLQotICAgICAgICBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlciBidWlsZGVyID0gbmV3IE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spOwotICAgICAgICBidWlsZGVyLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTyk7Ci0gICAgICAgIGJ1aWxkZXIuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKTsKLSAgICAgICAgbVJvdXRlU2VsZWN0b3IgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0TWVkaWFDb250cm9sVmlldzJfaW1wbChNZWRpYUNvbnRyb2xWaWV3MiBtZWRpYUNvbnRyb2xWaWV3LCBsb25nIGludGVydmFsTXMpIHsKLSAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcgPSBtZWRpYUNvbnRyb2xWaWV3OwotICAgICAgICBtU2hvd0NvbnRyb2xsZXJJbnRlcnZhbE1zID0gaW50ZXJ2YWxNczsKLSAgICAgICAgLy8gVE9ETzogQ2FsbCBNZWRpYUNvbnRyb2xWaWV3Mi5zZXRSb3V0ZVNlbGVjdG9yIG9ubHkgd2hlbiBjYXN0IGF2YWlsYWxiZS4KLSAgICAgICAgKChNZWRpYUNvbnRyb2xWaWV3MkltcGwpIG1NZWRpYUNvbnRyb2xWaWV3LmdldFByb3ZpZGVyKCkpLnNldFJvdXRlU2VsZWN0b3IobVJvdXRlU2VsZWN0b3IpOwotCi0gICAgICAgIGlmIChtSW5zdGFuY2UuaXNBdHRhY2hlZFRvV2luZG93KCkpIHsKLSAgICAgICAgICAgIGF0dGFjaE1lZGlhQ29udHJvbFZpZXcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYUNvbnRyb2xsZXIgZ2V0TWVkaWFDb250cm9sbGVyX2ltcGwoKSB7Ci0gICAgICAgIGlmIChtTWVkaWFTZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1lZGlhU2Vzc2lvbiBpbnN0YW5jZSBpcyBub3QgYXZhaWxhYmxlLiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtTWVkaWFDb250cm9sbGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXNzaW9uVG9rZW4yIGdldE1lZGlhU2Vzc2lvblRva2VuX2ltcGwoKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYUNvbnRyb2xWaWV3MiBnZXRNZWRpYUNvbnRyb2xWaWV3Ml9pbXBsKCkgewotICAgICAgICByZXR1cm4gbU1lZGlhQ29udHJvbFZpZXc7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhTWV0YWRhdGEyIGdldE1lZGlhTWV0YWRhdGFfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1NZWRpYU1ldGFkYXRhOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhTWV0YWRhdGFfaW1wbChNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICAvLyBUT0RPOiBpbnRlZ3JhdGUgdGhpcyB3aXRoIE1lZGlhU2Vzc2lvbjIjTWVkaWFJdGVtMgotICAgICAgICBtTWVkaWFNZXRhZGF0YSA9IG1ldGFkYXRhOwotCi0gICAgICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciBoYW5kbGluZyB3ZWJzaXRlIGxpbmsKLSAgICAgICAgbU1lZGlhVHlwZURhdGEgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIGJvb2xlYW4gaXNBZCA9IG1ldGFkYXRhID09IG51bGwgPwotICAgICAgICAgICAgICAgIGZhbHNlIDogbWV0YWRhdGEuZ2V0TG9uZyhNZWRpYU1ldGFkYXRhMi5NRVRBREFUQV9LRVlfQURWRVJUSVNFTUVOVCkgIT0gMDsKLSAgICAgICAgbU1lZGlhVHlwZURhdGEucHV0Qm9vbGVhbigKLSAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xWaWV3MkltcGwuS0VZX1NUQVRFX0lTX0FEVkVSVElTRU1FTlQsIGlzQWQpOwotCi0gICAgICAgIGlmIChtTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uc2VuZFNlc3Npb25FdmVudCgKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLkVWRU5UX1VQREFURV9NRURJQV9UWVBFX1NUQVRVUywgbU1lZGlhVHlwZURhdGEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVXBkYXRlIGxhdGVyIGluc2lkZSBPblByZXBhcmVkTGlzdGVuZXIgYWZ0ZXIgTWVkaWFTZXNzaW9uIGlzIGluaXRpYWxpemVkLgotICAgICAgICAgICAgbU5lZWRVcGRhdGVNZWRpYVR5cGUgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGVFbmFibGVkX2ltcGwoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgaWYgKGVuYWJsZSAhPSBtU3VidGl0bGVFbmFibGVkKSB7Ci0gICAgICAgICAgICBzZWxlY3RPckRlc2VsZWN0U3VidGl0bGUoZW5hYmxlKTsKLSAgICAgICAgfQotICAgICAgICBtU3VidGl0bGVFbmFibGVkID0gZW5hYmxlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzU3VidGl0bGVFbmFibGVkX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU3VidGl0bGVFbmFibGVkOwotICAgIH0KLQotICAgIC8vIFRPRE86IHJlbW92ZSBzZXRTcGVlZF9pbXBsIG9uY2UgTWVkaWFDb250cm9sbGVyMiBpcyByZWFkeS4KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTcGVlZF9pbXBsKGZsb2F0IHNwZWVkKSB7Ci0gICAgICAgIGlmIChzcGVlZCA8PSAwLjBmKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJVbnN1cHBvcnRlZCBzcGVlZCAoIiArIHNwZWVkICsgIikgaXMgaWdub3JlZC4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtU3BlZWQgPSBzcGVlZDsKLSAgICAgICAgaWYgKG1NZWRpYVBsYXllciAhPSBudWxsICYmIG1NZWRpYVBsYXllci5pc1BsYXlpbmcoKSkgewotICAgICAgICAgICAgYXBwbHlTcGVlZCgpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRBdWRpb0ZvY3VzUmVxdWVzdF9pbXBsKGludCBmb2N1c0dhaW4pIHsKLSAgICAgICAgaWYgKGZvY3VzR2FpbiAhPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19OT05FCi0gICAgICAgICAgICAgICAgJiYgZm9jdXNHYWluICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX0dBSU4KLSAgICAgICAgICAgICAgICAmJiBmb2N1c0dhaW4gIT0gQXVkaW9NYW5hZ2VyLkFVRElPRk9DVVNfR0FJTl9UUkFOU0lFTlQKLSAgICAgICAgICAgICAgICAmJiBmb2N1c0dhaW4gIT0gQXVkaW9NYW5hZ2VyLkFVRElPRk9DVVNfR0FJTl9UUkFOU0lFTlRfTUFZX0RVQ0sKLSAgICAgICAgICAgICAgICAmJiBmb2N1c0dhaW4gIT0gQXVkaW9NYW5hZ2VyLkFVRElPRk9DVVNfR0FJTl9UUkFOU0lFTlRfRVhDTFVTSVZFKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIGF1ZGlvIGZvY3VzIHR5cGUgIiArIGZvY3VzR2Fpbik7Ci0gICAgICAgIH0KLSAgICAgICAgbUF1ZGlvRm9jdXNUeXBlID0gZm9jdXNHYWluOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEF1ZGlvQXR0cmlidXRlc19pbXBsKEF1ZGlvQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgbnVsbCBBdWRpb0F0dHJpYnV0ZXMiKTsKLSAgICAgICAgfQotICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRWaWRlb1BhdGhfaW1wbChTdHJpbmcgcGF0aCkgewotICAgICAgICBtSW5zdGFuY2Uuc2V0VmlkZW9VcmkoVXJpLnBhcnNlKHBhdGgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRWaWRlb1VyaV9pbXBsKFVyaSB1cmkpIHsKLSAgICAgICAgbUluc3RhbmNlLnNldFZpZGVvVXJpKHVyaSwgbnVsbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VmlkZW9VcmlfaW1wbChVcmkgdXJpLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMpIHsKLSAgICAgICAgRGF0YVNvdXJjZURlc2MuQnVpbGRlciBidWlsZGVyID0gbmV3IERhdGFTb3VyY2VEZXNjLkJ1aWxkZXIoKTsKLSAgICAgICAgYnVpbGRlci5zZXREYXRhU291cmNlKG1JbnN0YW5jZS5nZXRDb250ZXh0KCksIHVyaSwgaGVhZGVycywgbnVsbCk7Ci0gICAgICAgIG1JbnN0YW5jZS5zZXREYXRhU291cmNlKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0TWVkaWFJdGVtX2ltcGwoTWVkaWFJdGVtMiBtZWRpYUl0ZW0pIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXREYXRhU291cmNlX2ltcGwoRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgIG1Ec2QgPSBkc2Q7Ci0gICAgICAgIG1TZWVrV2hlblByZXBhcmVkID0gMDsKLSAgICAgICAgb3BlblZpZGVvKGRzZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Vmlld1R5cGVfaW1wbChpbnQgdmlld1R5cGUpIHsKLSAgICAgICAgaWYgKHZpZXdUeXBlID09IG1DdXJyZW50Vmlldy5nZXRWaWV3VHlwZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgVmlkZW9WaWV3SW50ZXJmYWNlIHRhcmdldFZpZXc7Ci0gICAgICAgIGlmICh2aWV3VHlwZSA9PSBWaWRlb1ZpZXcyLlZJRVdfVFlQRV9URVhUVVJFVklFVykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAic3dpdGNoaW5nIHRvIFRleHR1cmVWaWV3Iik7Ci0gICAgICAgICAgICB0YXJnZXRWaWV3ID0gbVRleHR1cmVWaWV3OwotICAgICAgICB9IGVsc2UgaWYgKHZpZXdUeXBlID09IFZpZGVvVmlldzIuVklFV19UWVBFX1NVUkZBQ0VWSUVXKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJzd2l0Y2hpbmcgdG8gU3VyZmFjZVZpZXciKTsKLSAgICAgICAgICAgIHRhcmdldFZpZXcgPSBtU3VyZmFjZVZpZXc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIHZpZXcgdHlwZTogIiArIHZpZXdUeXBlKTsKLSAgICAgICAgfQotICAgICAgICAoKFZpZXcpIHRhcmdldFZpZXcpLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgdGFyZ2V0Vmlldy50YWtlT3ZlcihtQ3VycmVudFZpZXcpOwotICAgICAgICBtSW5zdGFuY2UucmVxdWVzdExheW91dCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0Vmlld1R5cGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJyZW50Vmlldy5nZXRWaWV3VHlwZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbUFjdGlvbnNfaW1wbCgKLSAgICAgICAgICAgIExpc3Q8UGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24+IGFjdGlvbkxpc3QsCi0gICAgICAgICAgICBFeGVjdXRvciBleGVjdXRvciwgVmlkZW9WaWV3Mi5PbkN1c3RvbUFjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIG1DdXN0b21BY3Rpb25MaXN0ID0gYWN0aW9uTGlzdDsKLSAgICAgICAgbUN1c3RvbUFjdGlvbkxpc3RlbmVyUmVjb3JkID0gbmV3IFBhaXI8PihleGVjdXRvciwgbGlzdGVuZXIpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBwbGF5YmFjayBidWlsZGVyIGluIG9yZGVyIHRvIGNsZWFyIGV4aXN0aW5nIHRoZSBjdXN0b20gYWN0aW9ucy4KLSAgICAgICAgbVN0YXRlQnVpbGRlciA9IG51bGw7Ci0gICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRPblZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyX2ltcGwoVmlkZW9WaWV3Mi5PblZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyIGwpIHsKLSAgICAgICAgbVZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyID0gbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRGdWxsU2NyZWVuUmVxdWVzdExpc3RlbmVyX2ltcGwoVmlkZW9WaWV3Mi5PbkZ1bGxTY3JlZW5SZXF1ZXN0TGlzdGVuZXIgbCkgewotICAgICAgICBtRnVsbFNjcmVlblJlcXVlc3RMaXN0ZW5lciA9IGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93X2ltcGwoKSB7Ci0gICAgICAgIHN1cGVyLm9uQXR0YWNoZWRUb1dpbmRvd19pbXBsKCk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIE1lZGlhU2Vzc2lvbgotICAgICAgICBtTWVkaWFTZXNzaW9uID0gbmV3IE1lZGlhU2Vzc2lvbihtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLCAiVmlkZW9WaWV3Mk1lZGlhU2Vzc2lvbiIpOwotICAgICAgICBtTWVkaWFTZXNzaW9uLnNldENhbGxiYWNrKG5ldyBNZWRpYVNlc3Npb25DYWxsYmFjaygpKTsKLSAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRBY3RpdmUodHJ1ZSk7Ci0gICAgICAgIG1NZWRpYUNvbnRyb2xsZXIgPSBtTWVkaWFTZXNzaW9uLmdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgbU1lZGlhUm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UobUluc3RhbmNlLmdldENvbnRleHQoKSk7Ci0gICAgICAgIG1NZWRpYVJvdXRlci5zZXRNZWRpYVNlc3Npb24obU1lZGlhU2Vzc2lvbik7Ci0gICAgICAgIG1NZWRpYVJvdXRlci5hZGRDYWxsYmFjayhtUm91dGVTZWxlY3RvciwgbVJvdXRlckNhbGxiYWNrKTsKLSAgICAgICAgYXR0YWNoTWVkaWFDb250cm9sVmlldygpOwotICAgICAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyBhZnRlciBtb3ZpbmcgTWVkaWFTZXNzaW9uIGNyZWF0aW5nIGNvZGUgaW5zaWRlIGluaXRpYWxpemluZyBWaWRlb1ZpZXcyCi0gICAgICAgIGlmIChtQ3VycmVudFN0YXRlID09IFNUQVRFX1BSRVBBUkVEKSB7Ci0gICAgICAgICAgICBleHRyYWN0VHJhY2tzKCk7Ci0gICAgICAgICAgICBleHRyYWN0TWV0YWRhdGEoKTsKLSAgICAgICAgICAgIGV4dHJhY3RBdWRpb01ldGFkYXRhKCk7Ci0gICAgICAgICAgICBpZiAobU5lZWRVcGRhdGVNZWRpYVR5cGUpIHsKLSAgICAgICAgICAgICAgICBtTWVkaWFTZXNzaW9uLnNlbmRTZXNzaW9uRXZlbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xWaWV3MkltcGwuRVZFTlRfVVBEQVRFX01FRElBX1RZUEVfU1RBVFVTLAotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhVHlwZURhdGEpOwotICAgICAgICAgICAgICAgIG1OZWVkVXBkYXRlTWVkaWFUeXBlID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvd19pbXBsKCkgewotICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvd19pbXBsKCk7Ci0KLSAgICAgICAgbU1lZGlhU2Vzc2lvbi5yZWxlYXNlKCk7Ci0gICAgICAgIG1NZWRpYVNlc3Npb24gPSBudWxsOwotICAgICAgICBtTWVkaWFDb250cm9sbGVyID0gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldEFjY2Vzc2liaWxpdHlDbGFzc05hbWVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIFZpZGVvVmlldzIuY2xhc3MuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudF9pbXBsKE1vdGlvbkV2ZW50IGV2KSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25Ub3VjaEV2ZW50KCkuIG1DdXJyZW50U3RhdGU9IiArIG1DdXJyZW50U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBtVGFyZ2V0U3RhdGU9IiArIG1UYXJnZXRTdGF0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV2LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCAmJiBtTWVkaWFDb250cm9sVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIW1Jc011c2ljTWVkaWFUeXBlIHx8IG1TaXplVHlwZSAhPSBTSVpFX1RZUEVfRlVMTCkgewotICAgICAgICAgICAgICAgIHRvZ2dsZU1lZGlhQ29udHJvbFZpZXdWaXNpYmlsaXR5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3VwZXIub25Ub3VjaEV2ZW50X2ltcGwoZXYpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uVHJhY2tiYWxsRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICBpZiAoZXYuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX1VQICYmIG1NZWRpYUNvbnRyb2xWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghbUlzTXVzaWNNZWRpYVR5cGUgfHwgbVNpemVUeXBlICE9IFNJWkVfVFlQRV9GVUxMKSB7Ci0gICAgICAgICAgICAgICAgdG9nZ2xlTWVkaWFDb250cm9sVmlld1Zpc2liaWxpdHkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdXBlci5vblRyYWNrYmFsbEV2ZW50X2ltcGwoZXYpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoVG91Y2hFdmVudF9pbXBsKE1vdGlvbkV2ZW50IGV2KSB7Ci0gICAgICAgIC8vIFRPRE86IFRlc3QgdG91Y2ggZXZlbnQgaGFuZGxpbmcgbG9naWMgdGhvcm91Z2hseSBhbmQgc2ltcGxpZnkgdGhlIGxvZ2ljLgotICAgICAgICByZXR1cm4gc3VwZXIuZGlzcGF0Y2hUb3VjaEV2ZW50X2ltcGwoZXYpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uTWVhc3VyZV9pbXBsKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgc3VwZXIub25NZWFzdXJlX2ltcGwod2lkdGhNZWFzdXJlU3BlYywgaGVpZ2h0TWVhc3VyZVNwZWMpOwotCi0gICAgICAgIGlmIChtSXNNdXNpY01lZGlhVHlwZSkgewotICAgICAgICAgICAgaWYgKG1QcmV2V2lkdGggIT0gbUluc3RhbmNlLmdldE1lYXN1cmVkV2lkdGgoKQotICAgICAgICAgICAgICAgICAgICB8fCBtUHJldkhlaWdodCAhPSBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRIZWlnaHQoKSkgewotICAgICAgICAgICAgICAgIGludCBjdXJyV2lkdGggPSBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRXaWR0aCgpOwotICAgICAgICAgICAgICAgIGludCBjdXJySGVpZ2h0ID0gbUluc3RhbmNlLmdldE1lYXN1cmVkSGVpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgUG9pbnQgc2NyZWVuU2l6ZSA9IG5ldyBQb2ludCgpOwotICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmdldERlZmF1bHREaXNwbGF5KCkuZ2V0U2l6ZShzY3JlZW5TaXplKTsKLSAgICAgICAgICAgICAgICBpbnQgc2NyZWVuV2lkdGggPSBzY3JlZW5TaXplLng7Ci0gICAgICAgICAgICAgICAgaW50IHNjcmVlbkhlaWdodCA9IHNjcmVlblNpemUueTsKLQotICAgICAgICAgICAgICAgIGlmIChjdXJyV2lkdGggPT0gc2NyZWVuV2lkdGggJiYgY3VyckhlaWdodCA9PSBzY3JlZW5IZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IG9yaWVudGF0aW9uID0gcmV0cmlldmVPcmllbnRhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBpZiAob3JpZW50YXRpb24gPT0gQWN0aXZpdHlJbmZvLlNDUkVFTl9PUklFTlRBVElPTl9MQU5EU0NBUEUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZmxhdGVNdXNpY1ZpZXcoUi5sYXlvdXQuZnVsbF9sYW5kc2NhcGVfbXVzaWMpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5mbGF0ZU11c2ljVmlldyhSLmxheW91dC5mdWxsX3BvcnRyYWl0X211c2ljKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtU2l6ZVR5cGUgIT0gU0laRV9UWVBFX0ZVTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TaXplVHlwZSA9IFNJWkVfVFlQRV9GVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGV4aXN0aW5nIG1GYWRlT3V0IGNhbGxiYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5yZW1vdmVDYWxsYmFja3MobUZhZGVPdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TaXplVHlwZSAhPSBTSVpFX1RZUEVfRU1CRURERUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TaXplVHlwZSA9IFNJWkVfVFlQRV9FTUJFRERFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZmxhdGVNdXNpY1ZpZXcoUi5sYXlvdXQuZW1iZWRkZWRfbXVzaWMpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIG5ldyBtRmFkZU91dCBjYWxsYmFjawotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcucG9zdERlbGF5ZWQobUZhZGVPdXQsIG1TaG93Q29udHJvbGxlckludGVydmFsTXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1QcmV2V2lkdGggPSBjdXJyV2lkdGg7Ci0gICAgICAgICAgICAgICAgbVByZXZIZWlnaHQgPSBjdXJySGVpZ2h0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gSW1wbGVtZW50cyBWaWRlb1ZpZXdJbnRlcmZhY2UuU3VyZmFjZUxpc3RlbmVyCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDcmVhdGVkKFZpZXcgdmlldywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25TdXJmYWNlQ3JlYXRlZCgpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUgKyAiLCB3aWR0aC9oZWlnaHQ6ICIgKyB3aWR0aCArICIvIiArIGhlaWdodAotICAgICAgICAgICAgICAgICAgICArICIsICIgKyB2aWV3LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuZWVkVG9TdGFydCgpKSB7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCkucGxheSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdXJmYWNlRGVzdHJveWVkKFZpZXcgdmlldykgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uU3VyZmFjZURlc3Ryb3llZCgpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUgKyAiLCAiICsgdmlldy50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNoYW5nZWQoVmlldyB2aWV3LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgLy8gVE9ETzogRG8gd2UgbmVlZCB0byBjYWxsIHJlcXVlc3RMYXlvdXQgaGVyZT8KLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvblN1cmZhY2VDaGFuZ2VkKCkuIHdpZHRoL2hlaWdodDogIiArIHdpZHRoICsgIi8iICsgaGVpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICsgIiwgIiArIHZpZXcudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VUYWtlT3ZlckRvbmUoVmlkZW9WaWV3SW50ZXJmYWNlIHZpZXcpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvblN1cmZhY2VUYWtlT3ZlckRvbmUoKS4gTm93IGN1cnJlbnQgdmlldyBpczogIiArIHZpZXcpOwotICAgICAgICB9Ci0gICAgICAgIG1DdXJyZW50VmlldyA9IHZpZXc7Ci0gICAgICAgIGlmIChtVmlld1R5cGVDaGFuZ2VkTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyLm9uVmlld1R5cGVDaGFuZ2VkKG1JbnN0YW5jZSwgdmlldy5nZXRWaWV3VHlwZSgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmVlZFRvU3RhcnQoKSkgewotICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpLnBsYXkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIFByb3RlY3RlZCBvciBwcml2YXRlIG1ldGhvZHMKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIHByaXZhdGUgdm9pZCBhdHRhY2hNZWRpYUNvbnRyb2xWaWV3KCkgewotICAgICAgICAvLyBHZXQgTWVkaWFDb250cm9sbGVyIGZyb20gTWVkaWFTZXNzaW9uIGFuZCBzZXQgaXQgaW5zaWRlIE1lZGlhQ29udHJvbFZpZXcKLSAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcuc2V0Q29udHJvbGxlcihtTWVkaWFTZXNzaW9uLmdldENvbnRyb2xsZXIoKSk7Ci0KLSAgICAgICAgTGF5b3V0UGFyYW1zIHBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULCBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKLSAgICAgICAgbUluc3RhbmNlLmFkZFZpZXcobU1lZGlhQ29udHJvbFZpZXcsIHBhcmFtcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSW5QbGF5YmFja1N0YXRlKCkgewotICAgICAgICByZXR1cm4gKG1NZWRpYVBsYXllciAhPSBudWxsIHx8IG1Sb3V0ZVBsYXllciAhPSBudWxsKQotICAgICAgICAgICAgICAgICYmIG1DdXJyZW50U3RhdGUgIT0gU1RBVEVfRVJST1IKLSAgICAgICAgICAgICAgICAmJiBtQ3VycmVudFN0YXRlICE9IFNUQVRFX0lETEUKLSAgICAgICAgICAgICAgICAmJiBtQ3VycmVudFN0YXRlICE9IFNUQVRFX1BSRVBBUklORzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbmVlZFRvU3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiAobU1lZGlhUGxheWVyICE9IG51bGwgfHwgbVJvdXRlUGxheWVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgJiYgbUN1cnJlbnRTdGF0ZSAhPSBTVEFURV9QTEFZSU5HCi0gICAgICAgICAgICAgICAgJiYgbVRhcmdldFN0YXRlID09IFNUQVRFX1BMQVlJTkc7Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlcyBhIE1lZGlhUGxheWVyMiBpbnN0YW5jZSBhbmQgcHJlcGFyZSBwbGF5YmFjay4KLSAgICBwcml2YXRlIHZvaWQgb3BlblZpZGVvKERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICBVcmkgdXJpID0gZHNkLmdldFVyaSgpOwotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMgPSBkc2QuZ2V0VXJpSGVhZGVycygpOwotICAgICAgICByZXNldFBsYXllcigpOwotICAgICAgICBpZiAoaXNSZW1vdGVQbGF5YmFjaygpKSB7Ci0gICAgICAgICAgICBtUm91dGVQbGF5ZXIub3BlblZpZGVvKGRzZCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1BdWRpb0ZvY3VzVHlwZSAhPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19OT05FKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIHRoaXMgc2hvdWxkIGhhdmUgYSBmb2N1cyBsaXN0ZW5lcgotICAgICAgICAgICAgQXVkaW9Gb2N1c1JlcXVlc3QgZm9jdXNSZXF1ZXN0OwotICAgICAgICAgICAgZm9jdXNSZXF1ZXN0ID0gbmV3IEF1ZGlvRm9jdXNSZXF1ZXN0LkJ1aWxkZXIobUF1ZGlvRm9jdXNUeXBlKQotICAgICAgICAgICAgICAgICAgICAuc2V0QXVkaW9BdHRyaWJ1dGVzKG1BdWRpb0F0dHJpYnV0ZXMpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5yZXF1ZXN0QXVkaW9Gb2N1cyhmb2N1c1JlcXVlc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9wZW5WaWRlbygpOiBjcmVhdGluZyBuZXcgTWVkaWFQbGF5ZXIyIGluc3RhbmNlLiIpOwotICAgICAgICAgICAgbU1lZGlhUGxheWVyID0gbmV3IE1lZGlhUGxheWVyMkltcGwoKTsKLSAgICAgICAgICAgIG1TdXJmYWNlVmlldy5zZXRNZWRpYVBsYXllcihtTWVkaWFQbGF5ZXIpOwotICAgICAgICAgICAgbVRleHR1cmVWaWV3LnNldE1lZGlhUGxheWVyKG1NZWRpYVBsYXllcik7Ci0gICAgICAgICAgICBtQ3VycmVudFZpZXcuYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIobU1lZGlhUGxheWVyKTsKLQotICAgICAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gbUluc3RhbmNlLmdldENvbnRleHQoKTsKLSAgICAgICAgICAgIC8vIFRPRE86IEFkZCB0aW1lbHkgZmlyaW5nIGxvZ2ljIGZvciBtb3JlIGFjY3VyYXRlIHN5bmMgYmV0d2VlbiBDQyBhbmQgdmlkZW8gZnJhbWUKLSAgICAgICAgICAgIG1TdWJ0aXRsZUNvbnRyb2xsZXIgPSBuZXcgU3VidGl0bGVDb250cm9sbGVyKGNvbnRleHQpOwotICAgICAgICAgICAgbVN1YnRpdGxlQ29udHJvbGxlci5yZWdpc3RlclJlbmRlcmVyKG5ldyBDbG9zZWRDYXB0aW9uUmVuZGVyZXIoY29udGV4dCkpOwotICAgICAgICAgICAgbVN1YnRpdGxlQ29udHJvbGxlci5zZXRBbmNob3IoKFN1YnRpdGxlQ29udHJvbGxlci5BbmNob3IpIG1TdWJ0aXRsZVZpZXcpOwotICAgICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IgPSBuZXcgRXhlY3V0b3IoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICAgICAgICAgICAgICBydW5uYWJsZS5ydW4oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNldE1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2soZXhlY3V0b3IsIG1NZWRpYVBsYXllcjJDYWxsYmFjayk7Ci0KLSAgICAgICAgICAgIG1DdXJyZW50QnVmZmVyUGVyY2VudGFnZSA9IC0xOwotICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNldERhdGFTb3VyY2UoZHNkKTsKLSAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZXRBdWRpb0F0dHJpYnV0ZXMobUF1ZGlvQXR0cmlidXRlcyk7Ci0gICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0T25TdWJ0aXRsZURhdGFMaXN0ZW5lcihtU3VidGl0bGVMaXN0ZW5lcik7Ci0gICAgICAgICAgICAvLyB3ZSBkb24ndCBzZXQgdGhlIHRhcmdldCBzdGF0ZSBoZXJlIGVpdGhlciwgYnV0IHByZXNlcnZlIHRoZQotICAgICAgICAgICAgLy8gdGFyZ2V0IHN0YXRlIHRoYXQgd2FzIHRoZXJlIGJlZm9yZS4KLSAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QUkVQQVJJTkc7Ci0gICAgICAgICAgICBtTWVkaWFQbGF5ZXIucHJlcGFyZSgpOwotCi0gICAgICAgICAgICAvLyBTYXZlIGZpbGUgbmFtZSBhcyB0aXRsZSBzaW5jZSB0aGUgZmlsZSBtYXkgbm90IGhhdmUgYSB0aXRsZSBNZXRhZGF0YS4KLSAgICAgICAgICAgIG1UaXRsZSA9IHVyaS5nZXRQYXRoKCk7Ci0gICAgICAgICAgICBTdHJpbmcgc2NoZW1lID0gdXJpLmdldFNjaGVtZSgpOwotICAgICAgICAgICAgaWYgKHNjaGVtZSAhPSBudWxsICYmIHNjaGVtZS5lcXVhbHMoImZpbGUiKSkgewotICAgICAgICAgICAgICAgIG1UaXRsZSA9IHVyaS5nZXRMYXN0UGF0aFNlZ21lbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1SZXRyaWV2ZXIgPSBuZXcgTWVkaWFNZXRhZGF0YVJldHJpZXZlcigpOwotICAgICAgICAgICAgbVJldHJpZXZlci5zZXREYXRhU291cmNlKG1JbnN0YW5jZS5nZXRDb250ZXh0KCksIHVyaSk7Ci0KLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9wZW5WaWRlbygpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICArICIsIG1UYXJnZXRTdGF0ZT0iICsgbVRhcmdldFN0YXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJVbmFibGUgdG8gb3BlbiBjb250ZW50OiAiICsgdXJpLCBleCk7Ci0gICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfRVJST1I7Ci0gICAgICAgICAgICBtVGFyZ2V0U3RhdGUgPSBTVEFURV9FUlJPUjsKLSAgICAgICAgICAgIG1NZWRpYVBsYXllcjJDYWxsYmFjay5vbkVycm9yKG1NZWRpYVBsYXllciwgZHNkLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllcjIuTUVESUFfRVJST1JfVU5LTk9XTiwgTWVkaWFQbGF5ZXIyLk1FRElBX0VSUk9SX0lPKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogUmVzZXQgdGhlIG1lZGlhIHBsYXllciBpbiBhbnkgc3RhdGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRQbGF5ZXIoKSB7Ci0gICAgICAgIGlmIChtTWVkaWFQbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXIyIHBsYXllciA9IG1NZWRpYVBsYXllcjsKLSAgICAgICAgICAgIG5ldyBBc3luY1Rhc2s8TWVkaWFQbGF5ZXIyLCBWb2lkLCBWb2lkPigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgVm9pZCBkb0luQmFja2dyb3VuZChNZWRpYVBsYXllcjIuLi4gcGxheWVycykgewotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBGaXggTlBFIHdoaWxlIE1lZGlhUGxheWVyMi5jbG9zZSgpCi0gICAgICAgICAgICAgICAgICAgIC8vcGxheWVyc1swXS5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LmV4ZWN1dGVPbkV4ZWN1dG9yKEFzeW5jVGFzay5TRVJJQUxfRVhFQ1VUT1IsIHBsYXllcik7Ci0gICAgICAgICAgICBtTWVkaWFQbGF5ZXIgPSBudWxsOwotICAgICAgICAgICAgbVRleHR1cmVWaWV3LnNldE1lZGlhUGxheWVyKG51bGwpOwotICAgICAgICAgICAgbVN1cmZhY2VWaWV3LnNldE1lZGlhUGxheWVyKG51bGwpOwotICAgICAgICAgICAgLy9tUGVuZGluZ1N1YnRpdGxlVHJhY2tzLmNsZWFyKCk7Ci0gICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfSURMRTsKLSAgICAgICAgICAgIG1UYXJnZXRTdGF0ZSA9IFNUQVRFX0lETEU7Ci0gICAgICAgICAgICBpZiAobUF1ZGlvRm9jdXNUeXBlICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX05PTkUpIHsKLSAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmFiYW5kb25BdWRpb0ZvY3VzKG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1WaWRlb1dpZHRoID0gMDsKLSAgICAgICAgbVZpZGVvSGVpZ2h0ID0gMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlUGxheWJhY2tTdGF0ZSgpIHsKLSAgICAgICAgaWYgKG1TdGF0ZUJ1aWxkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gR2V0IHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIHBsYXllciBmb3IgdGhpcyBzdHJlYW0KLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1NZWRpYVBsYXllci5nZXRNZXRhZGF0YShNZWRpYVBsYXllcjIuTUVUQURBVEFfQUxMLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllcjIuQllQQVNTX01FVEFEQVRBX0ZJTFRFUik7Ci0KLSAgICAgICAgICAgIC8vIEFkZCBQbGF5IGFjdGlvbiBhcyBkZWZhdWx0Ci0gICAgICAgICAgICBsb25nIHBsYXliYWNrQWN0aW9ucyA9IFBsYXliYWNrU3RhdGUuQUNUSU9OX1BMQVk7Ci0gICAgICAgICAgICBpZiAobU1ldGFkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1NZXRhZGF0YS5oYXMoTWV0YWRhdGEuUEFVU0VfQVZBSUxBQkxFKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbU1ldGFkYXRhLmdldEJvb2xlYW4oTWV0YWRhdGEuUEFVU0VfQVZBSUxBQkxFKSkgewotICAgICAgICAgICAgICAgICAgICBwbGF5YmFja0FjdGlvbnMgfD0gUGxheWJhY2tTdGF0ZS5BQ1RJT05fUEFVU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghbU1ldGFkYXRhLmhhcyhNZXRhZGF0YS5TRUVLX0JBQ0tXQVJEX0FWQUlMQUJMRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1NZXRhZGF0YS5nZXRCb29sZWFuKE1ldGFkYXRhLlNFRUtfQkFDS1dBUkRfQVZBSUxBQkxFKSkgewotICAgICAgICAgICAgICAgICAgICBwbGF5YmFja0FjdGlvbnMgfD0gUGxheWJhY2tTdGF0ZS5BQ1RJT05fUkVXSU5EOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIW1NZXRhZGF0YS5oYXMoTWV0YWRhdGEuU0VFS19GT1JXQVJEX0FWQUlMQUJMRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1NZXRhZGF0YS5nZXRCb29sZWFuKE1ldGFkYXRhLlNFRUtfRk9SV0FSRF9BVkFJTEFCTEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBsYXliYWNrQWN0aW9ucyB8PSBQbGF5YmFja1N0YXRlLkFDVElPTl9GQVNUX0ZPUldBUkQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghbU1ldGFkYXRhLmhhcyhNZXRhZGF0YS5TRUVLX0FWQUlMQUJMRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1NZXRhZGF0YS5nZXRCb29sZWFuKE1ldGFkYXRhLlNFRUtfQVZBSUxBQkxFKSkgewotICAgICAgICAgICAgICAgICAgICBwbGF5YmFja0FjdGlvbnMgfD0gUGxheWJhY2tTdGF0ZS5BQ1RJT05fU0VFS19UTzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBsYXliYWNrQWN0aW9ucyB8PSAoUGxheWJhY2tTdGF0ZS5BQ1RJT05fUEFVU0UgfAotICAgICAgICAgICAgICAgICAgICAgICAgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUkVXSU5EIHwgUGxheWJhY2tTdGF0ZS5BQ1RJT05fRkFTVF9GT1JXQVJEIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrU3RhdGUuQUNUSU9OX1NFRUtfVE8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVN0YXRlQnVpbGRlciA9IG5ldyBQbGF5YmFja1N0YXRlLkJ1aWxkZXIoKTsKLSAgICAgICAgICAgIG1TdGF0ZUJ1aWxkZXIuc2V0QWN0aW9ucyhwbGF5YmFja0FjdGlvbnMpOwotCi0gICAgICAgICAgICBpZiAobUN1c3RvbUFjdGlvbkxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoUGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24gYWN0aW9uIDogbUN1c3RvbUFjdGlvbkxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXRlQnVpbGRlci5hZGRDdXN0b21BY3Rpb24oYWN0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbVN0YXRlQnVpbGRlci5zZXRTdGF0ZShnZXRDb3JyZXNwb25kaW5nUGxheWJhY2tTdGF0ZSgpLAotICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5nZXRDdXJyZW50UG9zaXRpb24oKSwgbVNwZWVkKTsKLSAgICAgICAgaWYgKG1DdXJyZW50U3RhdGUgIT0gU1RBVEVfRVJST1IKLSAgICAgICAgICAgICYmIG1DdXJyZW50U3RhdGUgIT0gU1RBVEVfSURMRQotICAgICAgICAgICAgJiYgbUN1cnJlbnRTdGF0ZSAhPSBTVEFURV9QUkVQQVJJTkcpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggTWVkaWFQbGF5ZXIyLmdldEJ1ZmZlcmVkUG9zaXRpb24oKSBvbmNlIGl0IGlzCi0gICAgICAgICAgICAvLyBpbXBsZW1lbnRlZC4KLSAgICAgICAgICAgIGlmIChtQ3VycmVudEJ1ZmZlclBlcmNlbnRhZ2UgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBtU3RhdGVCdWlsZGVyLnNldEJ1ZmZlcmVkUG9zaXRpb24oLTEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU3RhdGVCdWlsZGVyLnNldEJ1ZmZlcmVkUG9zaXRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgKG1DdXJyZW50QnVmZmVyUGVyY2VudGFnZSAvIDEwMC4wICogbU1lZGlhUGxheWVyLmdldER1cmF0aW9uKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNldCBQbGF5YmFja1N0YXRlIGZvciBNZWRpYVNlc3Npb24KLSAgICAgICAgaWYgKG1NZWRpYVNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgUGxheWJhY2tTdGF0ZSBzdGF0ZSA9IG1TdGF0ZUJ1aWxkZXIuYnVpbGQoKTsKLSAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uc2V0UGxheWJhY2tTdGF0ZShzdGF0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRDb3JyZXNwb25kaW5nUGxheWJhY2tTdGF0ZSgpIHsKLSAgICAgICAgc3dpdGNoIChtQ3VycmVudFN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX0VSUk9SOgotICAgICAgICAgICAgICAgIHJldHVybiBQbGF5YmFja1N0YXRlLlNUQVRFX0VSUk9SOwotICAgICAgICAgICAgY2FzZSBTVEFURV9JRExFOgotICAgICAgICAgICAgICAgIHJldHVybiBQbGF5YmFja1N0YXRlLlNUQVRFX05PTkU7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUklORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gUGxheWJhY2tTdGF0ZS5TVEFURV9DT05ORUNUSU5HOwotICAgICAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gUGxheWJhY2tTdGF0ZS5TVEFURV9QQVVTRUQ7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX1BMQVlJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBsYXliYWNrU3RhdGUuU1RBVEVfUExBWUlORzsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgotICAgICAgICAgICAgICAgIHJldHVybiBQbGF5YmFja1N0YXRlLlNUQVRFX1BBVVNFRDsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfUExBWUJBQ0tfQ09NUExFVEVEOgotICAgICAgICAgICAgICAgIHJldHVybiBQbGF5YmFja1N0YXRlLlNUQVRFX1NUT1BQRUQ7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgUnVubmFibGUgbUZhZGVPdXQgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBpZiAobUN1cnJlbnRTdGF0ZSA9PSBTVEFURV9QTEFZSU5HKSB7Ci0gICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgdm9pZCBzaG93Q29udHJvbGxlcigpIHsKLSAgICAgICAgLy8gVE9ETzogRGVjaWRlIHdoYXQgdG8gc2hvdyB3aGVuIHRoZSBzdGF0ZSBpcyBub3QgaW4gcGxheWJhY2sgc3RhdGUKLSAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xWaWV3ID09IG51bGwgfHwgIWlzSW5QbGF5YmFja1N0YXRlKCkKLSAgICAgICAgICAgICAgICB8fCAobUlzTXVzaWNNZWRpYVR5cGUgJiYgbVNpemVUeXBlID09IFNJWkVfVFlQRV9GVUxMKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnJlbW92ZUNhbGxiYWNrcyhtRmFkZU91dCk7Ci0gICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgaWYgKG1TaG93Q29udHJvbGxlckludGVydmFsTXMgIT0gMAotICAgICAgICAgICAgJiYgIW1BY2Nlc3NpYmlsaXR5TWFuYWdlci5pc1RvdWNoRXhwbG9yYXRpb25FbmFibGVkKCkpIHsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnBvc3REZWxheWVkKG1GYWRlT3V0LCBtU2hvd0NvbnRyb2xsZXJJbnRlcnZhbE1zKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0b2dnbGVNZWRpYUNvbnRyb2xWaWV3VmlzaWJpbGl0eSgpIHsKLSAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xWaWV3LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnJlbW92ZUNhbGxiYWNrcyhtRmFkZU91dCk7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzaG93Q29udHJvbGxlcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGx5U3BlZWQoKSB7Ci0gICAgICAgIFBsYXliYWNrUGFyYW1zIHBhcmFtcyA9IG1NZWRpYVBsYXllci5nZXRQbGF5YmFja1BhcmFtcygpLmFsbG93RGVmYXVsdHMoKTsKLSAgICAgICAgaWYgKG1TcGVlZCAhPSBwYXJhbXMuZ2V0U3BlZWQoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBwYXJhbXMuc2V0U3BlZWQobVNwZWVkKTsKLSAgICAgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0UGxheWJhY2tQYXJhbXMocGFyYW1zKTsKLSAgICAgICAgICAgICAgICBtRmFsbGJhY2tTcGVlZCA9IG1TcGVlZDsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiUGxheWJhY2tQYXJhbXMgaGFzIHVuc3VwcG9ydGVkIHZhbHVlOiAiICsgZSk7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHJldmlzZSB0aGlzIHBhcnQgYWZ0ZXIgaW50ZWdyYXRpbmcgd2l0aCBNUDIuCi0gICAgICAgICAgICAgICAgLy8gSWYgbVNwZWVkIGhhZCBhbiBpbGxlZ2FsIHZhbHVlIGZvciBzcGVlZCByYXRlLCBzeXN0ZW0gd2lsbCBkZXRlcm1pbmUgYmVzdAotICAgICAgICAgICAgICAgIC8vIGhhbmRsaW5nIChzZWUgUGxheWJhY2tQYXJhbXMuQVVESU9fRkFMTEJBQ0tfTU9ERV9ERUZBVUxUKS4KLSAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGUgcHJlLU1QMiByZXR1cm5zIDAuMGYgd2hlbiBpdCBpcyBwYXVzZWQuIEluIHRoaXMgY2FzZSwgVmlkZW9WaWV3MiB3aWxsCi0gICAgICAgICAgICAgICAgLy8gdXNlIG1GYWxsYmFja1NwZWVkIGluc3RlYWQuCi0gICAgICAgICAgICAgICAgZmxvYXQgZmFsbGJhY2tTcGVlZCA9IG1NZWRpYVBsYXllci5nZXRQbGF5YmFja1BhcmFtcygpLmFsbG93RGVmYXVsdHMoKS5nZXRTcGVlZCgpOwotICAgICAgICAgICAgICAgIGlmIChmYWxsYmFja1NwZWVkID4gMC4wZikgewotICAgICAgICAgICAgICAgICAgICBtRmFsbGJhY2tTcGVlZCA9IGZhbGxiYWNrU3BlZWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1TcGVlZCA9IG1GYWxsYmFja1NwZWVkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUmVtb3RlUGxheWJhY2soKSB7Ci0gICAgICAgIGlmIChtTWVkaWFDb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBQbGF5YmFja0luZm8gcGxheWJhY2tJbmZvID0gbU1lZGlhQ29udHJvbGxlci5nZXRQbGF5YmFja0luZm8oKTsKLSAgICAgICAgcmV0dXJuIHBsYXliYWNrSW5mbyAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgcGxheWJhY2tJbmZvLmdldFBsYXliYWNrVHlwZSgpID09IFBsYXliYWNrSW5mby5QTEFZQkFDS19UWVBFX1JFTU9URTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VsZWN0T3JEZXNlbGVjdFN1YnRpdGxlKGJvb2xlYW4gc2VsZWN0KSB7Ci0gICAgICAgIGlmICghaXNJblBsYXliYWNrU3RhdGUoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZWxlY3QpIHsKLSAgICAgICAgICAgIGlmIChtU3VidGl0bGVUcmFja0luZGljZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIC8vIFRPRE86IG1ha2UgdGhpcyBzZWxlY3Rpb24gZHluYW1pYwotICAgICAgICAgICAgICAgIG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCA9IG1TdWJ0aXRsZVRyYWNrSW5kaWNlcy5nZXQoMCkuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgbVN1YnRpdGxlQ29udHJvbGxlci5zZWxlY3RUcmFjayhtU3VidGl0bGVUcmFja0luZGljZXMuZ2V0KDApLnNlY29uZCk7Ci0gICAgICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNlbGVjdFRyYWNrKG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCk7Ci0gICAgICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4ICE9IElOVkFMSURfVFJBQ0tfSU5ERVgpIHsKLSAgICAgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuZGVzZWxlY3RUcmFjayhtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXgpOwotICAgICAgICAgICAgICAgIG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCA9IElOVkFMSURfVFJBQ0tfSU5ERVg7Ci0gICAgICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXh0cmFjdFRyYWNrcygpIHsKLSAgICAgICAgTGlzdDxNZWRpYVBsYXllcjIuVHJhY2tJbmZvPiB0cmFja0luZm9zID0gbU1lZGlhUGxheWVyLmdldFRyYWNrSW5mbygpOwotICAgICAgICBtVmlkZW9UcmFja0luZGljZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgbUF1ZGlvVHJhY2tJbmRpY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIG1TdWJ0aXRsZVRyYWNrSW5kaWNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBtU3VidGl0bGVDb250cm9sbGVyLnJlc2V0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHJhY2tJbmZvcy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgaW50IHRyYWNrVHlwZSA9IHRyYWNrSW5mb3MuZ2V0KGkpLmdldFRyYWNrVHlwZSgpOwotICAgICAgICAgICAgaWYgKHRyYWNrVHlwZSA9PSBNZWRpYVBsYXllcjIuVHJhY2tJbmZvLk1FRElBX1RSQUNLX1RZUEVfVklERU8pIHsKLSAgICAgICAgICAgICAgICBtVmlkZW9UcmFja0luZGljZXMuYWRkKGkpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0cmFja1R5cGUgPT0gTWVkaWFQbGF5ZXIyLlRyYWNrSW5mby5NRURJQV9UUkFDS19UWVBFX0FVRElPKSB7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tJbmRpY2VzLmFkZChpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHJhY2tUeXBlID09IE1lZGlhUGxheWVyMi5UcmFja0luZm8uTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRQotICAgICAgICAgICAgICAgICAgICB8fCB0cmFja1R5cGUgPT0gTWVkaWFQbGF5ZXIyLlRyYWNrSW5mby5NRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVCkgewotICAgICAgICAgICAgICAgIFN1YnRpdGxlVHJhY2sgdHJhY2sgPSBtU3VidGl0bGVDb250cm9sbGVyLmFkZFRyYWNrKHRyYWNrSW5mb3MuZ2V0KGkpLmdldEZvcm1hdCgpKTsKLSAgICAgICAgICAgICAgICBpZiAodHJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVUcmFja0luZGljZXMuYWRkKG5ldyBQYWlyPD4oaSwgdHJhY2spKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gU2VsZWN0IGZpcnN0IHRyYWNrcyBhcyBkZWZhdWx0Ci0gICAgICAgIGlmIChtVmlkZW9UcmFja0luZGljZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbVNlbGVjdGVkVmlkZW9UcmFja0luZGV4ID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAobUF1ZGlvVHJhY2tJbmRpY2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1WaWRlb1RyYWNrSW5kaWNlcy5zaXplKCkgPT0gMCAmJiBtQXVkaW9UcmFja0luZGljZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbUlzTXVzaWNNZWRpYVR5cGUgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgQnVuZGxlIGRhdGEgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIGRhdGEucHV0SW50KE1lZGlhQ29udHJvbFZpZXcySW1wbC5LRVlfVklERU9fVFJBQ0tfQ09VTlQsIG1WaWRlb1RyYWNrSW5kaWNlcy5zaXplKCkpOwotICAgICAgICBkYXRhLnB1dEludChNZWRpYUNvbnRyb2xWaWV3MkltcGwuS0VZX0FVRElPX1RSQUNLX0NPVU5ULCBtQXVkaW9UcmFja0luZGljZXMuc2l6ZSgpKTsKLSAgICAgICAgZGF0YS5wdXRJbnQoTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9TVUJUSVRMRV9UUkFDS19DT1VOVCwgbVN1YnRpdGxlVHJhY2tJbmRpY2VzLnNpemUoKSk7Ci0gICAgICAgIGlmIChtU3VidGl0bGVUcmFja0luZGljZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgc2VsZWN0T3JEZXNlbGVjdFN1YnRpdGxlKG1TdWJ0aXRsZUVuYWJsZWQpOwotICAgICAgICB9Ci0gICAgICAgIG1NZWRpYVNlc3Npb24uc2VuZFNlc3Npb25FdmVudChNZWRpYUNvbnRyb2xWaWV3MkltcGwuRVZFTlRfVVBEQVRFX1RSQUNLX1NUQVRVUywgZGF0YSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4dHJhY3RNZXRhZGF0YSgpIHsKLSAgICAgICAgLy8gR2V0IGFuZCBzZXQgZHVyYXRpb24gYW5kIHRpdGxlIHZhbHVlcyBhcyBNZWRpYU1ldGFkYXRhIGZvciBNZWRpYUNvbnRyb2xWaWV3MgotICAgICAgICBNZWRpYU1ldGFkYXRhLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBNZWRpYU1ldGFkYXRhLkJ1aWxkZXIoKTsKLSAgICAgICAgaWYgKG1NZXRhZGF0YSAhPSBudWxsICYmIG1NZXRhZGF0YS5oYXMoTWV0YWRhdGEuVElUTEUpKSB7Ci0gICAgICAgICAgICBtVGl0bGUgPSBtTWV0YWRhdGEuZ2V0U3RyaW5nKE1ldGFkYXRhLlRJVExFKTsKLSAgICAgICAgfQotICAgICAgICBidWlsZGVyLnB1dFN0cmluZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9USVRMRSwgbVRpdGxlKTsKLSAgICAgICAgYnVpbGRlci5wdXRMb25nKAotICAgICAgICAgICAgICAgIE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX0RVUkFUSU9OLCBtTWVkaWFQbGF5ZXIuZ2V0RHVyYXRpb24oKSk7Ci0KLSAgICAgICAgaWYgKG1NZWRpYVNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRNZXRhZGF0YShidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4dHJhY3RBdWRpb01ldGFkYXRhKCkgewotICAgICAgICBpZiAoIW1Jc011c2ljTWVkaWFUeXBlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtUmVzb3VyY2VzID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgbU1hbmFnZXIgPSAoV2luZG93TWFuYWdlcikgbUluc3RhbmNlLmdldENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKQotICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lORE9XX1NFUlZJQ0UpOwotCi0gICAgICAgIGJ5dGVbXSBhbGJ1bSA9IG1SZXRyaWV2ZXIuZ2V0RW1iZWRkZWRQaWN0dXJlKCk7Ci0gICAgICAgIGlmIChhbGJ1bSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBCaXRtYXAgYml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVCeXRlQXJyYXkoYWxidW0sIDAsIGFsYnVtLmxlbmd0aCk7Ci0gICAgICAgICAgICBtTXVzaWNBbGJ1bURyYXdhYmxlID0gbmV3IEJpdG1hcERyYXdhYmxlKGJpdG1hcCk7Ci0KLSAgICAgICAgICAgIC8vIFRPRE86IHJlcGxhY2Ugd2l0aCB2aXN1YWxpemVyCi0gICAgICAgICAgICBQYWxldHRlLmdlbmVyYXRlQXN5bmMoYml0bWFwLCBuZXcgUGFsZXR0ZS5QYWxldHRlQXN5bmNMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkdlbmVyYXRlZChQYWxldHRlIHBhbGV0dGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogYWRkIGRvbWluYW50IGNvbG9yIGZvciBkZWZhdWx0IGFsYnVtIGltYWdlLgotICAgICAgICAgICAgICAgICAgICBtRG9taW5hbnRDb2xvciA9IHBhbGV0dGUuZ2V0RG9taW5hbnRDb2xvcigwKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NdXNpY1ZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU11c2ljVmlldy5zZXRCYWNrZ3JvdW5kQ29sb3IobURvbWluYW50Q29sb3IpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtTXVzaWNBbGJ1bURyYXdhYmxlID0gbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2RlZmF1bHRfYWxidW1faW1hZ2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHRpdGxlID0gbVJldHJpZXZlci5leHRyYWN0TWV0YWRhdGEoTWVkaWFNZXRhZGF0YVJldHJpZXZlci5NRVRBREFUQV9LRVlfVElUTEUpOwotICAgICAgICBpZiAodGl0bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgbU11c2ljVGl0bGVUZXh0ID0gdGl0bGU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtTXVzaWNUaXRsZVRleHQgPSBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX211c2ljX3RpdGxlX3Vua25vd25fdGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgYXJ0aXN0ID0gbVJldHJpZXZlci5leHRyYWN0TWV0YWRhdGEoTWVkaWFNZXRhZGF0YVJldHJpZXZlci5NRVRBREFUQV9LRVlfQVJUSVNUKTsKLSAgICAgICAgaWYgKGFydGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTXVzaWNBcnRpc3RUZXh0ID0gYXJ0aXN0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbU11c2ljQXJ0aXN0VGV4dCA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfbXVzaWNfYXJ0aXN0X3Vua25vd25fdGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZW5kIHRpdGxlIGFuZCBhcnRpc3Qgc3RyaW5nIHRvIE1lZGlhQ29udHJvbFZpZXcyCi0gICAgICAgIE1lZGlhTWV0YWRhdGEuQnVpbGRlciBidWlsZGVyID0gbmV3IE1lZGlhTWV0YWRhdGEuQnVpbGRlcigpOwotICAgICAgICBidWlsZGVyLnB1dFN0cmluZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9USVRMRSwgbU11c2ljVGl0bGVUZXh0KTsKLSAgICAgICAgYnVpbGRlci5wdXRTdHJpbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfQVJUSVNULCBtTXVzaWNBcnRpc3RUZXh0KTsKLSAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRNZXRhZGF0YShidWlsZGVyLmJ1aWxkKCkpOwotCi0gICAgICAgIC8vIERpc3BsYXkgRW1iZWRkZWQgbW9kZSBhcyBkZWZhdWx0Ci0gICAgICAgIG1JbnN0YW5jZS5yZW1vdmVWaWV3KG1TdXJmYWNlVmlldyk7Ci0gICAgICAgIG1JbnN0YW5jZS5yZW1vdmVWaWV3KG1UZXh0dXJlVmlldyk7Ci0gICAgICAgIGluZmxhdGVNdXNpY1ZpZXcoUi5sYXlvdXQuZW1iZWRkZWRfbXVzaWMpOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IHJldHJpZXZlT3JpZW50YXRpb24oKSB7Ci0gICAgICAgIERpc3BsYXlNZXRyaWNzIGRtID0gUmVzb3VyY2VzLmdldFN5c3RlbSgpLmdldERpc3BsYXlNZXRyaWNzKCk7Ci0gICAgICAgIGludCB3aWR0aCA9IGRtLndpZHRoUGl4ZWxzOwotICAgICAgICBpbnQgaGVpZ2h0ID0gZG0uaGVpZ2h0UGl4ZWxzOwotCi0gICAgICAgIHJldHVybiAoaGVpZ2h0ID4gd2lkdGgpID8KLSAgICAgICAgICAgICAgICBBY3Rpdml0eUluZm8uU0NSRUVOX09SSUVOVEFUSU9OX1BPUlRSQUlUIDoKLSAgICAgICAgICAgICAgICBBY3Rpdml0eUluZm8uU0NSRUVOX09SSUVOVEFUSU9OX0xBTkRTQ0FQRTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5mbGF0ZU11c2ljVmlldyhpbnQgbGF5b3V0SWQpIHsKLSAgICAgICAgbUluc3RhbmNlLnJlbW92ZVZpZXcobU11c2ljVmlldyk7Ci0KLSAgICAgICAgVmlldyB2ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwgbGF5b3V0SWQpOwotICAgICAgICB2LnNldEJhY2tncm91bmRDb2xvcihtRG9taW5hbnRDb2xvcik7Ci0KLSAgICAgICAgSW1hZ2VWaWV3IGFsYnVtVmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYWxidW0pOwotICAgICAgICBpZiAoYWxidW1WaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFsYnVtVmlldy5zZXRJbWFnZURyYXdhYmxlKG1NdXNpY0FsYnVtRHJhd2FibGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgVGV4dFZpZXcgdGl0bGVWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC50aXRsZSk7Ci0gICAgICAgIGlmICh0aXRsZVZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgdGl0bGVWaWV3LnNldFRleHQobU11c2ljVGl0bGVUZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFRleHRWaWV3IGFydGlzdFZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmFydGlzdCk7Ci0gICAgICAgIGlmIChhcnRpc3RWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFydGlzdFZpZXcuc2V0VGV4dChtTXVzaWNBcnRpc3RUZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIG1NdXNpY1ZpZXcgPSB2OwotICAgICAgICBtSW5zdGFuY2UuYWRkVmlldyhtTXVzaWNWaWV3LCAwKTsKLSAgICB9Ci0KLSAgICBPblN1YnRpdGxlRGF0YUxpc3RlbmVyIG1TdWJ0aXRsZUxpc3RlbmVyID0KLSAgICAgICAgICAgIG5ldyBPblN1YnRpdGxlRGF0YUxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VidGl0bGVEYXRhKE1lZGlhUGxheWVyMiBtcCwgU3VidGl0bGVEYXRhIGRhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblN1YnRpdGxlRGF0YSgpOiBnZXRUcmFja0luZGV4OiAiICsgZGF0YS5nZXRUcmFja0luZGV4KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBnZXRDdXJyZW50UG9zaXRpb246ICIgKyBtcC5nZXRDdXJyZW50UG9zaXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGdldFN0YXJ0VGltZVVzKCk6ICIgKyBkYXRhLmdldFN0YXJ0VGltZVVzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBkaWZmOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKGRhdGEuZ2V0U3RhcnRUaW1lVXMoKS8xMDAwIC0gbXAuZ2V0Q3VycmVudFBvc2l0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm1zLCBnZXREdXJhdGlvblVzKCk6ICIgKyBkYXRhLmdldER1cmF0aW9uVXMoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4ID0gZGF0YS5nZXRUcmFja0luZGV4KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPSBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uU3VidGl0bGVEYXRhKCk6IGdldFRyYWNrSW5kZXg6ICIgKyBkYXRhLmdldFRyYWNrSW5kZXgoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlbGVjdGVkIHRyYWNrIGluZGV4OiAiICsgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmb3IgKFBhaXI8SW50ZWdlciwgU3VidGl0bGVUcmFjaz4gcCA6IG1TdWJ0aXRsZVRyYWNrSW5kaWNlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAuZmlyc3QgPT0gaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJ0aXRsZVRyYWNrIHRyYWNrID0gcC5zZWNvbmQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2sub25EYXRhKGRhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLQotICAgIE1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2sgbU1lZGlhUGxheWVyMkNhbGxiYWNrID0KLSAgICAgICAgICAgIG5ldyBNZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVmlkZW9TaXplQ2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblZpZGVvU2l6ZUNoYW5nZWQoKTogc2l6ZTogIiArIHdpZHRoICsgIi8iICsgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtVmlkZW9XaWR0aCA9IG1wLmdldFZpZGVvV2lkdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvSGVpZ2h0ID0gbXAuZ2V0VmlkZW9IZWlnaHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblZpZGVvU2l6ZUNoYW5nZWQoKTogbVZpZGVvU2l6ZToiICsgbVZpZGVvV2lkdGggKyAiLyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtVmlkZW9IZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtVmlkZW9XaWR0aCAhPSAwICYmIG1WaWRlb0hlaWdodCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2UucmVxdWVzdExheW91dCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRpbWVkIHRleHQgcmVsYXRlZCBjb2RlIGxhdGVyIG9uY2UgcmVsZXZhbnQgUmVuZGVyZXIgaXMgZGVmaW5lZC4KLSAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGp1c3QgZm9yIGRlYnVnZ2luZyBwdXJwb3NlLgotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVGltZWRUZXh0KAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIFRpbWVkVGV4dCB0ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJUaW1lZFRleHQ6ICIgKyB0ZXh0LmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25JbmZvKAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aGF0LCBpbnQgZXh0cmEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fTUVUQURBVEFfVVBEQVRFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0VHJhY2tzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuTUVESUFfSU5GT19QUkVQQVJFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vblByZXBhcmVkKG1wLCBkc2QpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fUExBWUJBQ0tfQ09NUExFVEUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25Db21wbGV0aW9uKG1wLCBkc2QpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fQlVGRkVSSU5HX1VQREFURSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkJ1ZmZlcmluZ1VwZGF0ZShtcCwgZHNkLCBleHRyYSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCBmcmFtZXdvcmtFcnIsIGludCBpbXBsRXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRXJyb3I6ICIgKyBmcmFtZXdvcmtFcnIgKyAiLCIgKyBpbXBsRXJyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIG1UYXJnZXRTdGF0ZSA9IFNUQVRFX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2FsbENvbXBsZXRlZChNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdoYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5DQUxMX0NPTVBMRVRFRF9TRUVLX1RPICYmIHN0YXR1cyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgb25QcmVwYXJlZChNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIk9uUHJlcGFyZWRMaXN0ZW5lcigpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QUkVQQVJFRDsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGFuZCBzZXQgcGxheWJhY2sgc3RhdGUgZm9yIE1lZGlhQ29udHJvbFZpZXcyCi0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBjaGFuZ2UgdGhpcyB0byBzZW5kIFRyYWNrSW5mb3MgdG8gTWVkaWFDb250cm9sVmlldzIKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogY3JlYXRlIE1lZGlhU2Vzc2lvbiB3aGVuIGluaXRpYWxpemluZyBWaWRlb1ZpZXcyCi0gICAgICAgICAgICAgICAgICAgIGlmIChtTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RUcmFja3MoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RNZXRhZGF0YSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdEF1ZGlvTWV0YWRhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtTWVkaWFDb250cm9sVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGludCB2aWRlb1dpZHRoID0gbXAuZ2V0VmlkZW9XaWR0aCgpOwotICAgICAgICAgICAgICAgICAgICBpbnQgdmlkZW9IZWlnaHQgPSBtcC5nZXRWaWRlb0hlaWdodCgpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIG1TZWVrV2hlblByZXBhcmVkIG1heSBiZSBjaGFuZ2VkIGFmdGVyIHNlZWtUbygpIGNhbGwKLSAgICAgICAgICAgICAgICAgICAgbG9uZyBzZWVrVG9Qb3NpdGlvbiA9IG1TZWVrV2hlblByZXBhcmVkOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2Vla1RvUG9zaXRpb24gIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpLnNlZWtUbyhzZWVrVG9Qb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW9XaWR0aCAhPSAwICYmIHZpZGVvSGVpZ2h0ICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlb1dpZHRoICE9IG1WaWRlb1dpZHRoIHx8IHZpZGVvSGVpZ2h0ICE9IG1WaWRlb0hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJPblByZXBhcmVkTGlzdGVuZXIoKSA6ICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICIgdmlkZW8gc2l6ZTogIiArIHZpZGVvV2lkdGggKyAiLyIgKyB2aWRlb0hlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIiBtZWFzdXJlZFNpemU6ICIgKyBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRXaWR0aCgpICsgIi8iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRIZWlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIiB2aWV3U2l6ZTogIiArIG1JbnN0YW5jZS5nZXRXaWR0aCgpICsgIi8iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtSW5zdGFuY2UuZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9XaWR0aCA9IHZpZGVvV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvSGVpZ2h0ID0gdmlkZW9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnJlcXVlc3RMYXlvdXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRUb1N0YXJ0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCkucGxheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyB0aGUgdmlkZW8gc2l6ZSB5ZXQsIGJ1dCBzaG91bGQgc3RhcnQgYW55d2F5LgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHZpZGVvIHNpemUgbWlnaHQgYmUgcmVwb3J0ZWQgdG8gdXMgbGF0ZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmVlZFRvU3RhcnQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKS5wbGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgb25Db21wbGV0aW9uKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QTEFZQkFDS19DT01QTEVURUQ7Ci0gICAgICAgICAgICAgICAgICAgIG1UYXJnZXRTdGF0ZSA9IFNUQVRFX1BMQVlCQUNLX0NPTVBMRVRFRDsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tTdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvRm9jdXNUeXBlICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX05PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuYWJhbmRvbkF1ZGlvRm9jdXMobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgb25CdWZmZXJpbmdVcGRhdGUoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCBwZXJjZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50QnVmZmVyUGVyY2VudGFnZSA9IHBlcmNlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotCi0gICAgcHJpdmF0ZSBjbGFzcyBNZWRpYVNlc3Npb25DYWxsYmFjayBleHRlbmRzIE1lZGlhU2Vzc2lvbi5DYWxsYmFjayB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbW1hbmQoU3RyaW5nIGNvbW1hbmQsIEJ1bmRsZSBhcmdzLCBSZXN1bHRSZWNlaXZlciByZWNlaXZlcikgewotICAgICAgICAgICAgaWYgKGlzUmVtb3RlUGxheWJhY2soKSkgewotICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllci5vbkNvbW1hbmQoY29tbWFuZCwgYXJncywgcmVjZWl2ZXIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9TSE9XX1NVQlRJVExFOgotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1YnRpdGxlSW5kZXggPSBhcmdzLmdldEludCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9TRUxFQ1RFRF9TVUJUSVRMRV9JTkRFWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WQUxJRF9UUkFDS19JTkRFWCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VidGl0bGVJbmRleCAhPSBJTlZBTElEX1RSQUNLX0lOREVYKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1YnRpdGxlVHJhY2tJbmRleCA9IG1TdWJ0aXRsZVRyYWNrSW5kaWNlcy5nZXQoc3VidGl0bGVJbmRleCkuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnRpdGxlVHJhY2tJbmRleCAhPSBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4ID0gc3VidGl0bGVUcmFja0luZGV4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc2V0U3VidGl0bGVFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX0hJREVfU1VCVElUTEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc2V0U3VidGl0bGVFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX1NFVF9GVUxMU0NSRUVOOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1GdWxsU2NyZWVuUmVxdWVzdExpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnVsbFNjcmVlblJlcXVlc3RMaXN0ZW5lci5vbkZ1bGxTY3JlZW5SZXF1ZXN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5nZXRCb29sZWFuKE1lZGlhQ29udHJvbFZpZXcySW1wbC5BUkdVTUVOVF9LRVlfRlVMTFNDUkVFTikpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzJJbXBsLkNPTU1BTkRfU0VMRUNUX0FVRElPX1RSQUNLOgotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvSW5kZXggPSBhcmdzLmdldEludChNZWRpYUNvbnRyb2xWaWV3MkltcGwuS0VZX1NFTEVDVEVEX0FVRElPX0lOREVYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlZBTElEX1RSQUNLX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdWRpb0luZGV4ICE9IElOVkFMSURfVFJBQ0tfSU5ERVgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9UcmFja0luZGV4ID0gbUF1ZGlvVHJhY2tJbmRpY2VzLmdldChhdWRpb0luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW9UcmFja0luZGV4ICE9IG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXggPSBhdWRpb1RyYWNrSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZWxlY3RUcmFjayhtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX1NFVF9QTEFZQkFDS19TUEVFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNwZWVkID0gYXJncy5nZXRGbG9hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9QTEFZQkFDS19TUEVFRCwgSU5WQUxJRF9TUEVFRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3BlZWQgIT0gSU5WQUxJRF9TUEVFRCAmJiBzcGVlZCAhPSBtU3BlZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc2V0U3BlZWQoc3BlZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TcGVlZCA9IHNwZWVkOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzJJbXBsLkNPTU1BTkRfTVVURToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVMZXZlbCA9IG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQywgMCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9VTk1VVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDLCBtVm9sdW1lTGV2ZWwsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkN1c3RvbUFjdGlvbihTdHJpbmcgYWN0aW9uLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBtQ3VzdG9tQWN0aW9uTGlzdGVuZXJSZWNvcmQuZmlyc3QuZXhlY3V0ZSgoKSAtPgotICAgICAgICAgICAgICAgICAgICBtQ3VzdG9tQWN0aW9uTGlzdGVuZXJSZWNvcmQuc2Vjb25kLm9uQ3VzdG9tQWN0aW9uKGFjdGlvbiwgZXh0cmFzKSk7Ci0gICAgICAgICAgICBzaG93Q29udHJvbGxlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheSgpIHsKLSAgICAgICAgICAgIGlmIChpc0luUGxheWJhY2tTdGF0ZSgpICYmIChtQ3VycmVudFZpZXcuaGFzQXZhaWxhYmxlU3VyZmFjZSgpIHx8IG1Jc011c2ljTWVkaWFUeXBlKSkgewotICAgICAgICAgICAgICAgIGlmIChpc1JlbW90ZVBsYXliYWNrKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlUGxheWVyLm9uUGxheSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGx5U3BlZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgbU1lZGlhUGxheWVyLnBsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BMQVlJTkc7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BMQVlJTkc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVGFyZ2V0U3RhdGUgPSBTVEFURV9QTEFZSU5HOwotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25QbGF5KCkuIG1DdXJyZW50U3RhdGU9IiArIG1DdXJyZW50U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblBhdXNlKCkgewotICAgICAgICAgICAgaWYgKGlzSW5QbGF5YmFja1N0YXRlKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNSZW1vdGVQbGF5YmFjaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllci5vblBhdXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QQVVTRUQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtTWVkaWFQbGF5ZXIuaXNQbGF5aW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbU1lZGlhUGxheWVyLnBhdXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QQVVTRUQ7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVGFyZ2V0U3RhdGUgPSBTVEFURV9QQVVTRUQ7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblBhdXNlKCkuIG1DdXJyZW50U3RhdGU9IiArIG1DdXJyZW50U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblNlZWtUbyhsb25nIHBvcykgewotICAgICAgICAgICAgaWYgKGlzSW5QbGF5YmFja1N0YXRlKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNSZW1vdGVQbGF5YmFjaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllci5vblNlZWtUbyhwb3MpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZWVrVG8ocG9zLCBNZWRpYVBsYXllcjIuU0VFS19QUkVWSU9VU19TWU5DKTsKLSAgICAgICAgICAgICAgICAgICAgbVNlZWtXaGVuUHJlcGFyZWQgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVNlZWtXaGVuUHJlcGFyZWQgPSBwb3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzaG93Q29udHJvbGxlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKLSAgICAgICAgICAgIGlmIChpc1JlbW90ZVBsYXliYWNrKCkpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIub25TdG9wKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc2V0UGxheWVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzaG93Q29udHJvbGxlcigpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9WaWV3SW50ZXJmYWNlLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1ZpZXdJbnRlcmZhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU0ZDQ3ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1ZpZXdJbnRlcmZhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci0KLWludGVyZmFjZSBWaWRlb1ZpZXdJbnRlcmZhY2UgewotICAgIC8qKgotICAgICAqIEFzc2lnbnMgdGhlIHZpZXcncyBzdXJmYWNlIHRvIHRoZSBnaXZlbiBNZWRpYVBsYXllcjIgaW5zdGFuY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXAgTWVkaWFQbGF5ZXIyCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzdXJmYWNlIGlzIHN1Y2Nlc3NmdWxseSBhc3NpZ25lZCwgZmFsc2UgaWYgbm90LiBJdCB3aWxsIGZhaWwgdG8gYXNzaWduCi0gICAgICogICAgICAgICBpZiBhbnkgb2YgTWVkaWFQbGF5ZXIyIG9yIHN1cmZhY2UgaXMgdW5hdmFpbGFibGUuCi0gICAgICovCi0gICAgYm9vbGVhbiBhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcihNZWRpYVBsYXllcjIgbXApOwotICAgIHZvaWQgc2V0U3VyZmFjZUxpc3RlbmVyKFN1cmZhY2VMaXN0ZW5lciBsKTsKLSAgICBpbnQgZ2V0Vmlld1R5cGUoKTsKLSAgICB2b2lkIHNldE1lZGlhUGxheWVyKE1lZGlhUGxheWVyMiBtcCk7Ci0KLSAgICAvKioKLSAgICAgKiBUYWtlcyBvdmVyIG9sZFZpZXcuIEl0IG1lYW5zIHRoYXQgdGhlIE1lZGlhUGxheWVyMiB3aWxsIHN0YXJ0IHJlbmRlcmluZyBvbiB0aGlzIHZpZXcuCi0gICAgICogVGhlIHZpc2liaWxpdHkgb2Ygb2xkVmlldyB3aWxsIGJlIHNldCBhcyB7QGxpbmsgVmlldy5HT05FfS4gSWYgdGhlIHZpZXcgZG9lc24ndCBoYXZlIGEKLSAgICAgKiBNZWRpYVBsYXllcjIgaW5zdGFuY2Ugb3IgaXRzIHN1cmZhY2UgaXMgbm90IGF2YWlsYWJsZSwgdGhlIGFjdHVhbCBleGVjdXRpb24gaXMgZGVmZXJyZWQgdW50aWwKLSAgICAgKiBhIE1lZGlhUGxheWVyMiBpbnN0YW5jZSBpcyBzZXQgYnkge0BsaW5rICNzZXRNZWRpYVBsYXllcn0gb3IgaXRzIHN1cmZhY2UgYmVjb21lcyBhdmFpbGFibGUuCi0gICAgICoge0BsaW5rIFN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VUYWtlT3ZlckRvbmV9IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGFjdHVhbCBleGVjdXRpb24gaXMKLSAgICAgKiBkb25lLgotICAgICAqCi0gICAgICogQHBhcmFtIG9sZFZpZXcgVGhlIHZpZXcgdGhhdCBNZWRpYVBsYXllcjIgaXMgY3VycmVudGx5IHJlbmRlcmluZyBvbi4KLSAgICAgKi8KLSAgICB2b2lkIHRha2VPdmVyKEBOb25OdWxsIFZpZGVvVmlld0ludGVyZmFjZSBvbGRWaWV3KTsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyBpZiB0aGUgdmlldydzIHN1cmZhY2UgaXMgYXZhaWxhYmxlLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzdXJmYWNlIGlzIGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBib29sZWFuIGhhc0F2YWlsYWJsZVN1cmZhY2UoKTsKLQotICAgIC8qKgotICAgICAqIEFuIGluc3RhbmNlIG9mIFZpZGVvVmlld0ludGVyZmFjZSBjYWxscyB0aGVzZSBzdXJmYWNlIG5vdGlmaWNhdGlvbiBtZXRob2RzIGFjY29yZGluZ2x5IGlmCi0gICAgICogYSBsaXN0ZW5lciBoYXMgYmVlbiByZWdpc3RlcmVkIHZpYSB7QGxpbmsgI3NldFN1cmZhY2VMaXN0ZW5lcihTdXJmYWNlTGlzdGVuZXIpfS4KLSAgICAgKi8KLSAgICBpbnRlcmZhY2UgU3VyZmFjZUxpc3RlbmVyIHsKLSAgICAgICAgdm9pZCBvblN1cmZhY2VDcmVhdGVkKFZpZXcgdmlldywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLSAgICAgICAgdm9pZCBvblN1cmZhY2VEZXN0cm95ZWQoVmlldyB2aWV3KTsKLSAgICAgICAgdm9pZCBvblN1cmZhY2VDaGFuZ2VkKFZpZXcgdmlldywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLSAgICAgICAgdm9pZCBvblN1cmZhY2VUYWtlT3ZlckRvbmUoVmlkZW9WaWV3SW50ZXJmYWNlIHZpZXcpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZXdHcm91cEltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZXdHcm91cEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEwNjgyNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWV3R3JvdXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC53aWRnZXQ7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5WaWV3R3JvdXBQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmlld0dyb3VwSW1wbCBpbXBsZW1lbnRzIFZpZXdHcm91cFByb3ZpZGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIFZpZXdHcm91cFByb3ZpZGVyIG1TdXBlclByb3ZpZGVyOwotCi0gICAgcHVibGljIFZpZXdHcm91cEltcGwoVmlld0dyb3VwIGluc3RhbmNlLAotICAgICAgICAgICAgVmlld0dyb3VwUHJvdmlkZXIgc3VwZXJQcm92aWRlciwgVmlld0dyb3VwUHJvdmlkZXIgcHJpdmF0ZVByb3ZpZGVyKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyID0gc3VwZXJQcm92aWRlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3dfaW1wbCgpIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIub25BdHRhY2hlZFRvV2luZG93X2ltcGwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvd19pbXBsKCkgewotICAgICAgICBtU3VwZXJQcm92aWRlci5vbkRldGFjaGVkRnJvbVdpbmRvd19pbXBsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRBY2Nlc3NpYmlsaXR5Q2xhc3NOYW1lX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5nZXRBY2Nlc3NpYmlsaXR5Q2xhc3NOYW1lX2ltcGwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIub25Ub3VjaEV2ZW50X2ltcGwoZXYpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uVHJhY2tiYWxsRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIub25UcmFja2JhbGxFdmVudF9pbXBsKGV2KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaEluZmxhdGVfaW1wbCgpIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIub25GaW5pc2hJbmZsYXRlX2ltcGwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkX2ltcGwoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLnNldEVuYWJsZWRfaW1wbChlbmFibGVkKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblZpc2liaWxpdHlBZ2dyZWdhdGVkX2ltcGwoYm9vbGVhbiBpc1Zpc2libGUpIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIub25WaXNpYmlsaXR5QWdncmVnYXRlZF9pbXBsKGlzVmlzaWJsZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25MYXlvdXRfaW1wbChib29sZWFuIGNoYW5nZWQsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIub25MYXlvdXRfaW1wbChjaGFuZ2VkLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uTWVhc3VyZV9pbXBsKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIub25NZWFzdXJlX2ltcGwod2lkdGhNZWFzdXJlU3BlYywgaGVpZ2h0TWVhc3VyZVNwZWMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0U3VnZ2VzdGVkTWluaW11bVdpZHRoX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5nZXRTdWdnZXN0ZWRNaW5pbXVtV2lkdGhfaW1wbCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0U3VnZ2VzdGVkTWluaW11bUhlaWdodF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuZ2V0U3VnZ2VzdGVkTWluaW11bUhlaWdodF9pbXBsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0TWVhc3VyZWREaW1lbnNpb25faW1wbChpbnQgbWVhc3VyZWRXaWR0aCwgaW50IG1lYXN1cmVkSGVpZ2h0KSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLnNldE1lYXN1cmVkRGltZW5zaW9uX2ltcGwobWVhc3VyZWRXaWR0aCwgbWVhc3VyZWRIZWlnaHQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoVG91Y2hFdmVudF9pbXBsKE1vdGlvbkV2ZW50IGV2KSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5kaXNwYXRjaFRvdWNoRXZlbnRfaW1wbChldik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY2hlY2tMYXlvdXRQYXJhbXNfaW1wbChWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIHApIHsKLSAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLmNoZWNrTGF5b3V0UGFyYW1zX2ltcGwocCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgZ2VuZXJhdGVEZWZhdWx0TGF5b3V0UGFyYW1zX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5nZW5lcmF0ZURlZmF1bHRMYXlvdXRQYXJhbXNfaW1wbCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zX2ltcGwoQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5nZW5lcmF0ZUxheW91dFBhcmFtc19pbXBsKGF0dHJzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVmlld0dyb3VwLkxheW91dFBhcmFtcyBnZW5lcmF0ZUxheW91dFBhcmFtc19pbXBsKFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgbHApIHsKLSAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLmdlbmVyYXRlTGF5b3V0UGFyYW1zX2ltcGwobHApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHNob3VsZERlbGF5Q2hpbGRQcmVzc2VkU3RhdGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLnNob3VsZERlbGF5Q2hpbGRQcmVzc2VkU3RhdGVfaW1wbCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG1lYXN1cmVDaGlsZFdpdGhNYXJnaW5zX2ltcGwoVmlldyBjaGlsZCwKLSAgICAgICAgaW50IHBhcmVudFdpZHRoTWVhc3VyZVNwZWMsIGludCB3aWR0aFVzZWQsIGludCBwYXJlbnRIZWlnaHRNZWFzdXJlU3BlYywgaW50IGhlaWdodFVzZWQpIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIubWVhc3VyZUNoaWxkV2l0aE1hcmdpbnNfaW1wbChjaGlsZCwKLSAgICAgICAgICAgICAgICBwYXJlbnRXaWR0aE1lYXN1cmVTcGVjLCB3aWR0aFVzZWQsIHBhcmVudEhlaWdodE1lYXN1cmVTcGVjLCBoZWlnaHRVc2VkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvQW5kcm9pZC5tayBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGRmZDJhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgXAotICAgIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzIFwKLSAgICBtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQgXAotICAgIGp1bml0Ci0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKLQotTE9DQUxfUEFDS0FHRV9OQU1FIDo9IE1lZGlhQ29tcG9uZW50c1Rlc3QKLQotTE9DQUxfSU5TVFJVTUVOVEFUSU9OX0ZPUiA6PSBNZWRpYUNvbXBvbmVudHMKLQotTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTIDo9IHRydWUKLQotTE9DQUxfQ0VSVElGSUNBVEUgOj0gcGxhdGZvcm0KLQotaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjU1MjY1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5tZWRpYS50ZXN0cyI+Ci0KLSAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iTWVkaWEgQVBJIFRlc3QiPgotICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KLSAgICA8L2FwcGxpY2F0aW9uPgotCi0gICAgPCEtLQotICAgIFRvIHJ1biB0aGUgdGVzdHMgdXNlIHRoZSBjb21tYW5kOgotICAgICJhZGIgc2hlbGwgYW0gaW5zdHJ1bWVudCAtdyBjb20uYW5kcm9pZC5tZWRpYS50ZXN0cy9hbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciIKLSAgICAtLT4KLSAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiCi0gICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQubWVkaWEudXBkYXRlIgotICAgICAgICBhbmRyb2lkOmxhYmVsPSJNZWRpYSBBUEkgdGVzdCIgLz4KLQotPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblBsYXlsaXN0QWdlbnRUZXN0LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25QbGF5bGlzdEFnZW50VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWIwODQ4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblBsYXlsaXN0QWdlbnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLio7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlLlBsYXllckV2ZW50Q2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5PbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcubW9ja2l0by5NYXRjaGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLS8qKgotICogVGVzdHMge0BsaW5rIFNlc3Npb25QbGF5bGlzdEFnZW50fS4KLSAqLwotcHVibGljIGNsYXNzIFNlc3Npb25QbGF5bGlzdEFnZW50VGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTZXNzaW9uUGxheWxpc3RBZ2VudFRlc3QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXQUlUX1RJTUVfTVMgPSAxMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1JFUEVBVF9NT0RFID0gLTEwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9TSFVGRkxFX01PREUgPSAtMTAwOwotCi0gICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyOwotICAgIHByaXZhdGUgRXhlY3V0b3IgbUhhbmRsZXJFeGVjdXRvcjsKLQotICAgIHByaXZhdGUgT2JqZWN0IG1XYWl0TG9jayA9IG5ldyBPYmplY3QoKTsKLSAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBNZWRpYVNlc3Npb24ySW1wbCBtU2Vzc2lvbkltcGw7Ci0gICAgcHJpdmF0ZSBNZWRpYVBsYXllckJhc2UgbVBsYXllcjsKLSAgICBwcml2YXRlIFBsYXllckV2ZW50Q2FsbGJhY2sgbVBsYXllckV2ZW50Q2FsbGJhY2s7Ci0gICAgcHJpdmF0ZSBTZXNzaW9uUGxheWxpc3RBZ2VudCBtQWdlbnQ7Ci0gICAgcHJpdmF0ZSBPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyIG1EYXRhU291cmNlSGVscGVyOwotICAgIHByaXZhdGUgTXlQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgbUV2ZW50Q2FsbGJhY2s7Ci0KLSAgICBwdWJsaWMgY2xhc3MgTXlQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVBsYXlsaXN0QWdlbnQuUGxheWxpc3RFdmVudENhbGxiYWNrIHsKLSAgICAgICAgYm9vbGVhbiBvblBsYXlsaXN0Q2hhbmdlZENhbGxlZDsKLSAgICAgICAgYm9vbGVhbiBvblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkQ2FsbGVkOwotICAgICAgICBib29sZWFuIG9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQ7Ci0gICAgICAgIGJvb2xlYW4gb25TaHVmZmxlTW9kZUNoYW5nZWRDYWxsZWQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBPYmplY3QgbVdhaXRMb2NrOwotCi0gICAgICAgIHB1YmxpYyBNeVBsYXlsaXN0RXZlbnRDYWxsYmFjayhPYmplY3Qgd2FpdExvY2spIHsKLSAgICAgICAgICAgIG1XYWl0TG9jayA9IHdhaXRMb2NrOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgICAgICBvblBsYXlsaXN0Q2hhbmdlZENhbGxlZCA9IGZhbHNlOwotICAgICAgICAgICAgb25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotICAgICAgICAgICAgb25SZXBlYXRNb2RlQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotICAgICAgICAgICAgb25TaHVmZmxlTW9kZUNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWxpc3RDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBMaXN0PE1lZGlhSXRlbTI+IGxpc3QsCi0gICAgICAgICAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICAgICAgb25QbGF5bGlzdENoYW5nZWRDYWxsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1XYWl0TG9jay5ub3RpZnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICAgICAgb25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZENhbGxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbVdhaXRMb2NrLm5vdGlmeSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25SZXBlYXRNb2RlQ2hhbmdlZChNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwgaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICAgICAgb25SZXBlYXRNb2RlQ2hhbmdlZENhbGxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbVdhaXRMb2NrLm5vdGlmeSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TaHVmZmxlTW9kZUNoYW5nZWQoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsIGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgICAgICBvblNodWZmbGVNb2RlQ2hhbmdlZENhbGxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbVdhaXRMb2NrLm5vdGlmeSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIE15RGF0YVNvdXJjZUhlbHBlciBpbXBsZW1lbnRzIE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIERhdGFTb3VyY2VEZXNjIG9uRGF0YVNvdXJjZU1pc3NpbmcoTWVkaWFTZXNzaW9uMiBzZXNzaW9uLCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgICAgIGlmIChpdGVtLmdldE1lZGlhSWQoKS5jb250YWlucygiV0lUSE9VVF9EU0QiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRhU291cmNlRGVzYy5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgLnNldERhdGFTb3VyY2UoZ2V0Q29udGV4dCgpLCBVcmkucGFyc2UoImRzZDovL3Rlc3QiKSkKLSAgICAgICAgICAgICAgICAgICAgLnNldE1lZGlhSWQoaXRlbS5nZXRNZWRpYUlkKCkpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIE1vY2tQbGF5ZXIgZXh0ZW5kcyBNZWRpYVBsYXllckJhc2UgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcGxheSgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBwcmVwYXJlKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHBhdXNlKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNraXBUb05leHQoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2Vla1RvKGxvbmcgcG9zKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRQbGF5ZXJTdGF0ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0QnVmZmVyaW5nU3RhdGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRBdWRpb0F0dHJpYnV0ZXMoQXVkaW9BdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQXVkaW9BdHRyaWJ1dGVzIGdldEF1ZGlvQXR0cmlidXRlcygpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldERhdGFTb3VyY2UoRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0TmV4dERhdGFTb3VyY2UoRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0TmV4dERhdGFTb3VyY2VzKExpc3Q8RGF0YVNvdXJjZURlc2M+IGRzZHMpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRGF0YVNvdXJjZURlc2MgZ2V0Q3VycmVudERhdGFTb3VyY2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBsb29wQ3VycmVudChib29sZWFuIGxvb3ApIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQbGF5YmFja1NwZWVkKGZsb2F0IHNwZWVkKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0UGxheWVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBmbG9hdCBnZXRQbGF5ZXJWb2x1bWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCByZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2soRXhlY3V0b3IgZSwgUGxheWVyRXZlbnRDYWxsYmFjayBjYikgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKFBsYXllckV2ZW50Q2FsbGJhY2sgY2IpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB9Ci0gICAgfQotCi0gICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1Db250ZXh0ID0gZ2V0Q29udGV4dCgpOwotICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBkZXhtYWtlciBidWc6IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZGV4bWFrZXIvaXNzdWVzL2RldGFpbD9pZD0yCi0gICAgICAgIC8vIERleG1ha2VyIGlzIHVzZWQgYnkgbW9ja2l0by4KLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJkZXhtYWtlci5kZXhjYWNoZSIsIG1Db250ZXh0LmdldENhY2hlRGlyKCkuZ2V0UGF0aCgpKTsKLQotICAgICAgICBIYW5kbGVyVGhyZWFkIGhhbmRsZXJUaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZCgiU2Vzc2lvblBsYXlsaXN0QWdlbnQiKTsKLSAgICAgICAgaGFuZGxlclRocmVhZC5zdGFydCgpOwotICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKGhhbmRsZXJUaHJlYWQuZ2V0TG9vcGVyKCkpOwotICAgICAgICBtSGFuZGxlckV4ZWN1dG9yID0gKHJ1bm5hYmxlKSAtPiB7Ci0gICAgICAgICAgICBtSGFuZGxlci5wb3N0KHJ1bm5hYmxlKTsKLSAgICAgICAgfTsKLQotICAgICAgICBtUGxheWVyID0gbW9jayhNb2NrUGxheWVyLmNsYXNzKTsKLSAgICAgICAgZG9BbnN3ZXIoaW52b2NhdGlvbiAtPiB7Ci0gICAgICAgICAgICBPYmplY3RbXSBhcmdzID0gaW52b2NhdGlvbi5nZXRBcmd1bWVudHMoKTsKLSAgICAgICAgICAgIG1QbGF5ZXJFdmVudENhbGxiYWNrID0gKFBsYXllckV2ZW50Q2FsbGJhY2spIGFyZ3NbMV07Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSkud2hlbihtUGxheWVyKS5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2soTWF0Y2hlcnMuYW55KCksIE1hdGNoZXJzLmFueSgpKTsKLQotICAgICAgICBtU2Vzc2lvbkltcGwgPSBtb2NrKE1lZGlhU2Vzc2lvbjJJbXBsLmNsYXNzKTsKLSAgICAgICAgbURhdGFTb3VyY2VIZWxwZXIgPSBuZXcgTXlEYXRhU291cmNlSGVscGVyKCk7Ci0gICAgICAgIG1BZ2VudCA9IG5ldyBTZXNzaW9uUGxheWxpc3RBZ2VudChtU2Vzc2lvbkltcGwsIG1QbGF5ZXIpOwotICAgICAgICBtQWdlbnQuc2V0T25EYXRhU291cmNlTWlzc2luZ0hlbHBlcihtRGF0YVNvdXJjZUhlbHBlcik7Ci0gICAgICAgIG1FdmVudENhbGxiYWNrID0gbmV3IE15UGxheWxpc3RFdmVudENhbGxiYWNrKG1XYWl0TG9jayk7Ci0gICAgICAgIG1BZ2VudC5yZWdpc3RlclBsYXlsaXN0RXZlbnRDYWxsYmFjayhtSGFuZGxlckV4ZWN1dG9yLCBtRXZlbnRDYWxsYmFjayk7Ci0gICAgfQotCi0gICAgQEFmdGVyCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbUhhbmRsZXIuZ2V0TG9vcGVyKCkucXVpdFNhZmVseSgpOwotICAgICAgICBtSGFuZGxlciA9IG51bGw7Ci0gICAgICAgIG1IYW5kbGVyRXhlY3V0b3IgPSBudWxsOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNldEFuZEdldFNodWZsbGVNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBzaHVmZmxlTW9kZSA9IG1BZ2VudC5nZXRTaHVmZmxlTW9kZSgpOwotICAgICAgICBpZiAoc2h1ZmZsZU1vZGUgIT0gTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9OT05FKSB7Ci0gICAgICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgICAgICBtQWdlbnQuc2V0U2h1ZmZsZU1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9OT05FKTsKLSAgICAgICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25TaHVmZmxlTW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfTk9ORSwgbUFnZW50LmdldFNodWZmbGVNb2RlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIG1BZ2VudC5zZXRTaHVmZmxlTW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0FMTCk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblNodWZmbGVNb2RlQ2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfQUxMLCBtQWdlbnQuZ2V0U2h1ZmZsZU1vZGUoKSk7Ci0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIG1BZ2VudC5zZXRTaHVmZmxlTW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0dST1VQKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uU2h1ZmZsZU1vZGVDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9HUk9VUCwgbUFnZW50LmdldFNodWZmbGVNb2RlKCkpOwotCi0gICAgICAgIC8vIElOVkFMSURfU0hVRkZMRV9NT0RFIHdpbGwgbm90IGNoYW5nZSB0aGUgc2h1ZmZsZSBtb2RlLgotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgbUFnZW50LnNldFNodWZmbGVNb2RlKElOVkFMSURfU0hVRkZMRV9NT0RFKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShtRXZlbnRDYWxsYmFjay5vblNodWZmbGVNb2RlQ2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfR1JPVVAsIG1BZ2VudC5nZXRTaHVmZmxlTW9kZSgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRBbmRHZXRSZXBlYXRNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCByZXBlYXRNb2RlID0gbUFnZW50LmdldFJlcGVhdE1vZGUoKTsKLSAgICAgICAgaWYgKHJlcGVhdE1vZGUgIT0gTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkUpIHsKLSAgICAgICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FKTsKLSAgICAgICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZENhbGxlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkUsIG1BZ2VudC5nZXRSZXBlYXRNb2RlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9PTkUpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9PTkUsIG1BZ2VudC5nZXRSZXBlYXRNb2RlKCkpOwotCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfQUxMKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfQUxMLCBtQWdlbnQuZ2V0UmVwZWF0TW9kZSgpKTsKLQotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0dST1VQKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfR1JPVVAsIG1BZ2VudC5nZXRSZXBlYXRNb2RlKCkpOwotCi0gICAgICAgIC8vIElOVkFMSURfU0hVRkZMRV9NT0RFIHdpbGwgbm90IGNoYW5nZSB0aGUgc2h1ZmZsZSBtb2RlLgotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoSU5WQUxJRF9SRVBFQVRfTU9ERSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2UobUV2ZW50Q2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9HUk9VUCwgbUFnZW50LmdldFJlcGVhdE1vZGUoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UGxheWxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGxpc3RTaXplID0gMTA7Ci0gICAgICAgIGNyZWF0ZUFuZFNldFBsYXlsaXN0KDEwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3RTaXplLCBtQWdlbnQuZ2V0UGxheWxpc3QoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2tpcEl0ZW1zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBsaXN0U2l6ZSA9IDU7Ci0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcGxheWxpc3QgPSBjcmVhdGVBbmRTZXRQbGF5bGlzdChsaXN0U2l6ZSk7Ci0KLSAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkUpOwotICAgICAgICAvLyBUZXN0IHNraXBUb1BsYXlsaXN0SXRlbQotICAgICAgICBmb3IgKGludCBpID0gbGlzdFNpemUgLSAxOyBpID49IDA7IC0taSkgewotICAgICAgICAgICAgbUFnZW50LnNraXBUb1BsYXlsaXN0SXRlbShwbGF5bGlzdC5nZXQoaSkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGVzdCBza2lwVG9OZXh0SXRlbQotICAgICAgICAvLyBjdXJQbGF5UG9zID0gMAotICAgICAgICBmb3IgKGludCBjdXJQbGF5UG9zID0gMDsgY3VyUGxheVBvcyA8IGxpc3RTaXplIC0gMTsgKytjdXJQbGF5UG9zKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2tpcFRvTmV4dEl0ZW0oKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjdXJQbGF5UG9zICsgMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUFnZW50LnNraXBUb05leHRJdGVtKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0U2l6ZSAtIDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFRlc3Qgc2tpcFRvUHJldmlvdXMKLSAgICAgICAgLy8gY3VyUGxheVBvcyA9IGxpc3RTaXplIC0gMQotICAgICAgICBmb3IgKGludCBjdXJQbGF5UG9zID0gbGlzdFNpemUgLSAxOyBjdXJQbGF5UG9zID4gMDsgLS1jdXJQbGF5UG9zKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2tpcFRvUHJldmlvdXNJdGVtKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY3VyUGxheVBvcyAtIDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgICAgICB9Ci0gICAgICAgIG1BZ2VudC5za2lwVG9QcmV2aW91c0l0ZW0oKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9BTEwpOwotICAgICAgICAvLyBUZXN0IHNraXBUb1ByZXZpb3VzIHdpdGggcmVwZWF0IG1vZGUgYWxsCi0gICAgICAgIC8vIGN1clBsYXlQb3MgPSAwCi0gICAgICAgIG1BZ2VudC5za2lwVG9QcmV2aW91c0l0ZW0oKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3RTaXplIC0gMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gVGVzdCBza2lwVG9OZXh0IHdpdGggcmVwZWF0IG1vZGUgYWxsCi0gICAgICAgIC8vIGN1clBsYXlQb3MgPSBsaXN0U2l6ZSAtIDEKLSAgICAgICAgbUFnZW50LnNraXBUb05leHRJdGVtKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICBtQWdlbnQuc2tpcFRvUHJldmlvdXNJdGVtKCk7Ci0gICAgICAgIC8vIGN1clBsYXlQb3MgPSBsaXN0U2l6ZSAtIDEsIG5leHRQbGF5UG9zID0gMAotICAgICAgICAvLyBUZXN0IG5leHQgcGxheSBwb3MgYWZ0ZXIgc2V0dGluZyByZXBlYXQgbW9kZSBub25lLgotICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfTk9ORSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0U2l6ZSAtIDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEVkaXRQbGF5bGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgbGlzdFNpemUgPSA1OwotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0ID0gY3JlYXRlQW5kU2V0UGxheWxpc3QobGlzdFNpemUpOwotCi0gICAgICAgIC8vIFRlc3QgYWRkIGl0ZW06IFswIChjdXIpLCAxLCAyLCAzLCA0XSAtPiBbMCAoY3VyKSwgMSwgNSwgMiwgMywgNF0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgTWVkaWFJdGVtMiBpdGVtXzUgPSBnZW5lcmF0ZU1lZGlhSXRlbSg1KTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LmFkZCgyLCBpdGVtXzUpOwotICAgICAgICAgICAgbUFnZW50LmFkZFBsYXlsaXN0SXRlbSgyLCBpdGVtXzUpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgLy8gTW92ZSBjdXJyZW50OiBbMCAoY3VyKSwgMSwgNSwgMiwgMywgNF0gLT4gWzAsIDEsIDUgKGN1ciksIDIsIDMsIDRdCi0gICAgICAgIG1BZ2VudC5za2lwVG9QbGF5bGlzdEl0ZW0oaXRlbV81KTsKLSAgICAgICAgLy8gUmVtb3ZlIGN1cnJlbnQgaXRlbTogWzAsIDEsIDUgKGN1ciksIDIsIDMsIDRdIC0+IFswLCAxLCAyIChjdXIpLCAzLCA0XQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3QucmVtb3ZlKGl0ZW1fNSk7Ci0gICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKGl0ZW1fNSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFJlbW92ZSBwcmV2aW91cyBpdGVtOiBbMCwgMSwgMiAoY3VyKSwgMywgNF0gLT4gWzAsIDIgKGN1ciksIDMsIDRdCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIE1lZGlhSXRlbTIgcHJldmlvdXNJdGVtID0gcGxheWxpc3QuZ2V0KDEpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3QucmVtb3ZlKHByZXZpb3VzSXRlbSk7Ci0gICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKHByZXZpb3VzSXRlbSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFJlbW92ZSBuZXh0IGl0ZW06IFswLCAyIChjdXIpLCAzLCA0XSAtPiBbMCwgMiAoY3VyKSwgNF0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgTWVkaWFJdGVtMiBuZXh0SXRlbSA9IHBsYXlsaXN0LmdldCgyKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShuZXh0SXRlbSk7Ci0gICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKG5leHRJdGVtKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gUmVwbGFjZSBpdGVtOiBbMCwgMiAoY3VyKSwgNF0gLT4gWzAsIDIgKGN1ciksIDVdCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5zZXQoMiwgaXRlbV81KTsKLSAgICAgICAgICAgIG1BZ2VudC5yZXBsYWNlUGxheWxpc3RJdGVtKDIsIGl0ZW1fNSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIE1vdmUgbGFzdCBhbmQgcmVtb3ZlIHRoZSBsYXN0IGl0ZW06IFswLCAyIChjdXIpLCA1XSAtPiBbMCwgMiwgNSAoY3VyKV0gLT4gWzAsIDIgKGN1cildCi0gICAgICAgIE1lZGlhSXRlbTIgbGFzdEl0ZW0gPSBwbGF5bGlzdC5nZXQoMSk7Ci0gICAgICAgIG1BZ2VudC5za2lwVG9QbGF5bGlzdEl0ZW0obGFzdEl0ZW0pOwotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3QucmVtb3ZlKGxhc3RJdGVtKTsKLSAgICAgICAgICAgIG1BZ2VudC5yZW1vdmVQbGF5bGlzdEl0ZW0obGFzdEl0ZW0pOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBSZW1vdmUgYWxsIGl0ZW1zCi0gICAgICAgIGZvciAoaW50IGkgPSBwbGF5bGlzdC5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgewotICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gcGxheWxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgbUFnZW50LnNraXBUb1BsYXlsaXN0SXRlbShpdGVtKTsKLSAgICAgICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShpdGVtKTsKLSAgICAgICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKGl0ZW0pOwotICAgICAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXNzaW9uUGxheWxpc3RBZ2VudC5OT19WQUxJRF9JVEVNUywgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgfQotCi0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQbGF5bGlzdFdpdGhJbnZhbGlkSXRlbSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgbGlzdFNpemUgPSAyOwotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0ID0gY3JlYXRlQW5kU2V0UGxheWxpc3QobGlzdFNpemUpOwotCi0gICAgICAgIC8vIEFkZCBpdGVtOiBbMCAoY3VyKSwgMV0gLT4gWzAgKGN1ciksIDMgKG5vX2RzZCksIDFdCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIE1lZGlhSXRlbTIgaW52YWxpZEl0ZW0yID0gZ2VuZXJhdGVNZWRpYUl0ZW1XaXRob3V0RGF0YVNvdXJjZURlc2MoMik7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5hZGQoMSwgaW52YWxpZEl0ZW0yKTsKLSAgICAgICAgICAgIG1BZ2VudC5hZGRQbGF5bGlzdEl0ZW0oMSwgaW52YWxpZEl0ZW0yKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gVGVzdCBza2lwIHRvIG5leHQgaXRlbTogIFswIChjdXIpLCAyIChub19kc2QpLCAxXSAtPiBbMCwgMiAobm9fZHNkKSwgMSAoY3VyKV0KLSAgICAgICAgbUFnZW50LnNraXBUb05leHRJdGVtKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBUZXN0IHNraXAgdG8gcHJldmlvdXMgaXRlbTogWzAsIDIgKG5vX2RzZCksIDEgKGN1cildIC0+IFswIChjdXIpLCAyIChub19kc2QpLCAxXQotICAgICAgICBtQWdlbnQuc2tpcFRvUHJldmlvdXNJdGVtKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBSZW1vdmUgY3VycmVudCBpdGVtOiBbMCAoY3VyKSwgMiAobm9fZHNkKSwgMV0gLT4gWzIgKG5vX2RzZCksIDEgKGN1cildCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IHBsYXlsaXN0LmdldCgwKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShpdGVtKTsKLSAgICAgICAgICAgIG1BZ2VudC5yZW1vdmVQbGF5bGlzdEl0ZW0oaXRlbSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFJlbW92ZSBjdXJyZW50IGl0ZW06IFsyIChub19kc2QpLCAxIChjdXIpXSAtPiBbMiAobm9fZHNkKV0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgaXRlbSA9IHBsYXlsaXN0LmdldCgxKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShpdGVtKTsKLSAgICAgICAgICAgIG1BZ2VudC5yZW1vdmVQbGF5bGlzdEl0ZW0oaXRlbSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNlc3Npb25QbGF5bGlzdEFnZW50Lk5PX1ZBTElEX0lURU1TLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBBZGQgaW52YWxpZCBpdGVtOiBbMiAobm9fZHNkKV0gLT4gWzAgKG5vX2RzZCksIDIgKG5vX2RzZCldCi0gICAgICAgIE1lZGlhSXRlbTIgaW52YWxpZEl0ZW0wID0gZ2VuZXJhdGVNZWRpYUl0ZW1XaXRob3V0RGF0YVNvdXJjZURlc2MoMCk7Ci0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5hZGQoMCwgaW52YWxpZEl0ZW0wKTsKLSAgICAgICAgICAgIG1BZ2VudC5hZGRQbGF5bGlzdEl0ZW0oMCwgaW52YWxpZEl0ZW0wKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU2Vzc2lvblBsYXlsaXN0QWdlbnQuTk9fVkFMSURfSVRFTVMsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIEFkZCB2YWxpZCBpdGVtOiBbMCAobm9fZHNkKSwgMiAobm9fZHNkKV0gLT4gWzAgKG5vX2RzZCksIDEsIDIgKG5vX2RzZCldCi0gICAgICAgIE1lZGlhSXRlbTIgaW52YWxpZEl0ZW0xID0gZ2VuZXJhdGVNZWRpYUl0ZW0oMSk7Ci0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5hZGQoMSwgaW52YWxpZEl0ZW0xKTsKLSAgICAgICAgICAgIG1BZ2VudC5hZGRQbGF5bGlzdEl0ZW0oMSwgaW52YWxpZEl0ZW0xKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gUmVwbGFjZSB0aGUgdmFsaWQgaXRlbSB3aXRoIGFuIGludmFsaWQgaXRlbToKLSAgICAgICAgLy8gWzAgKG5vX2RzZCksIDEgKGN1ciksIDIgKG5vX2RzZCldIC0+IFswIChub19kc2QpLCAzIChub19kc2QpLCAyIChub19kc2QpXQotICAgICAgICBNZWRpYUl0ZW0yIGludmFsaWRJdGVtMyA9IGdlbmVyYXRlTWVkaWFJdGVtV2l0aG91dERhdGFTb3VyY2VEZXNjKDMpOwotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3Quc2V0KDEsIGludmFsaWRJdGVtMyk7Ci0gICAgICAgICAgICBtQWdlbnQucmVwbGFjZVBsYXlsaXN0SXRlbSgxLCBpbnZhbGlkSXRlbTMpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXNzaW9uUGxheWxpc3RBZ2VudC5FTkRfT0ZfUExBWUxJU1QsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFBsYXlsaXN0QWZ0ZXJPbkN1cnJlbnREYXRhU291cmNlQ2hhbmdlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgbGlzdFNpemUgPSAyOwotICAgICAgICB2ZXJpZnkobVBsYXllcikucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKE1hdGNoZXJzLmFueSgpLCBNYXRjaGVycy5hbnkoKSk7Ci0KLSAgICAgICAgY3JlYXRlQW5kU2V0UGxheWxpc3QobGlzdFNpemUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgbVBsYXllckV2ZW50Q2FsbGJhY2sub25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQobVBsYXllciwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICAgICAgbVBsYXllckV2ZW50Q2FsbGJhY2sub25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQobVBsYXllciwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXNzaW9uUGxheWxpc3RBZ2VudC5FTkRfT0ZfUExBWUxJU1QsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIG1BZ2VudC5za2lwVG9OZXh0SXRlbSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU2Vzc2lvblBsYXlsaXN0QWdlbnQuRU5EX09GX1BMQVlMSVNULCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfT05FKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNlc3Npb25QbGF5bGlzdEFnZW50LkVORF9PRl9QTEFZTElTVCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0FMTCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICAgICAgbVBsYXllckV2ZW50Q2FsbGJhY2sub25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQobVBsYXllciwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICAgICAgbVBsYXllckV2ZW50Q2FsbGJhY2sub25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQobVBsYXllciwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3Q8TWVkaWFJdGVtMj4gY3JlYXRlQW5kU2V0UGxheWxpc3QoaW50IGxpc3RTaXplKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RTaXplOyArK2kpIHsKLSAgICAgICAgICAgIGl0ZW1zLmFkZChnZW5lcmF0ZU1lZGlhSXRlbShpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIG1BZ2VudC5zZXRQbGF5bGlzdChpdGVtcywgbnVsbCk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGl0ZW1zOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRQbGF5bGlzdEVxdWFscyhMaXN0PE1lZGlhSXRlbTI+IGV4cGVjdGVkLCBMaXN0PE1lZGlhSXRlbTI+IGFjdHVhbCkgewotICAgICAgICBpZiAoZXhwZWN0ZWQgPT0gYWN0dWFsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShleHBlY3RlZCAhPSBudWxsICYmIGFjdHVhbCAhPSBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLnNpemUoKSwgYWN0dWFsLnNpemUoKSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhwZWN0ZWQuZ2V0KGkpLmVxdWFscyhhY3R1YWwuZ2V0KGkpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhSXRlbTIgZ2VuZXJhdGVNZWRpYUl0ZW1XaXRob3V0RGF0YVNvdXJjZURlc2MoaW50IGtleSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhSXRlbTIuQnVpbGRlcigwKQotICAgICAgICAgICAgICAgIC5zZXRNZWRpYUlkKCJURVNUX01FRElBX0lEX1dJVEhPVVRfRFNEXyIgKyBrZXkpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZWRpYUl0ZW0yIGdlbmVyYXRlTWVkaWFJdGVtKGludCBrZXkpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUl0ZW0yLkJ1aWxkZXIoMCkKLSAgICAgICAgICAgICAgICAuc2V0TWVkaWFJZCgiVEVTVF9NRURJQV9JRF8iICsga2V5KQotICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL09XTkVSUyBiL3BhY2thZ2VzL09XTkVSUwppbmRleCBiYmM0Y2VmLi4zYjlmZDJiIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9PV05FUlMKKysrIGIvcGFja2FnZXMvT1dORVJTCkBAIC0xLDYgKzEsOSBAQAogYWtlcnN0ZW5AZ29vZ2xlLmNvbQogZHdrYW5nQGdvb2dsZS5jb20KK2hkbW9vbkBnb29nbGUuY29tCitpbnN1bkBnb29nbGUuY29tCiBqYWV3YW5AZ29vZ2xlLmNvbQoramlucGFya0Bnb29nbGUuY29tCiBtYXJjb25lQGdvb2dsZS5jb20KIHN1bmdzb29AZ29vZ2xlLmNvbQogd2ppYUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCmluZGV4IDc0MTllNjQuLmMwYWE0NzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCkBAIC0yLDI0ICsyLDYgQEAKIAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgU2VydmljZVV0aWxpdGllcy5jcHAKLQotIyBGSVhNRSBNb3ZlIHRoaXMgbGlicmFyeSB0byBmcmFtZXdvcmtzL25hdGl2ZQotTE9DQUxfTU9EVUxFIDo9IGxpYnNlcnZpY2V1dGlsaXR5Ci0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYmxvZyBcCi0gICAgbGliYmluZGVyCi0KLUxPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KIExPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgXAogICAgIEF1ZGlvRmxpbmdlci5jcHAgICAgICAgICAgICBcCiAgICAgVGhyZWFkcy5jcHAgICAgICAgICAgICAgICAgIFwKQEAgLTMxLDcgKzEzLDggQEAKICAgICBQYXRjaFBhbmVsLmNwcCAgICAgICAgICAgICAgXAogICAgIFN0YXRlUXVldWUuY3BwICAgICAgICAgICAgICBcCiAgICAgQnVmTG9nLmNwcCAgICAgICAgICAgICAgICAgIFwKLSAgICBUeXBlZExvZ2dlci5jcHAKKyAgICBUeXBlZExvZ2dlci5jcHAgICAgICAgICAgICAgXAorICAgIE5CQUlPX1RlZS5jcHAgICAgICAgICAgICAgICBcCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kgXApAQCAtNTMsMTMgKzM2LDEzIEBACiAgICAgbGlibmJhaW8gXAogICAgIGxpYm5ibG9nIFwKICAgICBsaWJwb3dlcm1hbmFnZXIgXAotICAgIGxpYnNlcnZpY2V1dGlsaXR5IFwKICAgICBsaWJtZWRpYXV0aWxzIFwKICAgICBsaWJtZW11bnJlYWNoYWJsZSBcCiAgICAgbGlibWVkaWFfaGVscGVyCiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICAgIGxpYmNwdXN0YXRzIFwKKyAgICBsaWJzbmRmaWxlIFwKIAogTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKIApAQCAtODIsNiArNjUsNyBAQAogTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4KIAogTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IgLVdhbGwKK0xPQ0FMX1NBTklUSVpFIDo9IGludGVnZXJfb3ZlcmZsb3cKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCmluZGV4IGJkZDM5YzYuLjI2Zjc2YzAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCkBAIC0yMywxMiArMjMsMTIgQEAKICNpbmNsdWRlIDxkaXJlbnQuaD4KICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL211bHRpdXNlci5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgpAQCAtNDcsNyArNDcsNyBAQAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCiAjaW5jbHVkZSAiQXVkaW9GbGluZ2VyLmgiCi0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgorI2luY2x1ZGUgIk5CQUlPX1RlZS5oIgogCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KIApAQCAtNTYsNyArNTYsNiBAQAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2VmZmVjdF9hZWMuaD4KIAogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KLSNpbmNsdWRlIDxhdWRpb191dGlscy9zdHJpbmcuaD4KIAogI2luY2x1ZGUgPHBvd2VybWFuYWdlci9Qb3dlck1hbmFnZXIuaD4KIApAQCAtNjQsOCArNjMsOCBAQAogI2luY2x1ZGUgPG1lZGlhL01lbW9yeUxlYWtUcmFja1V0aWwuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9QaXBlLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUGlwZVJlYWRlci5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9CYXR0ZXJ5Tm90aWZpZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KICNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KIAogLy8jZGVmaW5lIEJVRkxPR19OREVCVUcgMApAQCAtMTAwLDE3ICs5OSw2IEBACiAKIHVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6bVNjcmVlblN0YXRlOwogCi0KLSNpZmRlZiBURUVfU0lOSwotYm9vbCBBdWRpb0ZsaW5nZXI6Om1UZWVTaW5rSW5wdXRFbmFibGVkID0gZmFsc2U7Ci1ib29sIEF1ZGlvRmxpbmdlcjo6bVRlZVNpbmtPdXRwdXRFbmFibGVkID0gZmFsc2U7Ci1ib29sIEF1ZGlvRmxpbmdlcjo6bVRlZVNpbmtUcmFja0VuYWJsZWQgPSBmYWxzZTsKLQotc2l6ZV90IEF1ZGlvRmxpbmdlcjo6bVRlZVNpbmtJbnB1dEZyYW1lcyA9IGtUZWVTaW5rSW5wdXRGcmFtZXNEZWZhdWx0Owotc2l6ZV90IEF1ZGlvRmxpbmdlcjo6bVRlZVNpbmtPdXRwdXRGcmFtZXMgPSBrVGVlU2lua091dHB1dEZyYW1lc0RlZmF1bHQ7Ci1zaXplX3QgQXVkaW9GbGluZ2VyOjptVGVlU2lua1RyYWNrRnJhbWVzID0ga1RlZVNpbmtUcmFja0ZyYW1lc0RlZmF1bHQ7Ci0jZW5kaWYKLQogLy8gSW4gb3JkZXIgdG8gYXZvaWQgaW52YWxpZGF0aW5nIG9mZmxvYWRlZCB0cmFja3MgZWFjaCB0aW1lIGEgVmlzdWFsaXplciBpcyB0dXJuZWQgb24gYW5kIG9mZgogLy8gd2UgZGVmaW5lIGEgbWluaW11bSB0aW1lIGR1cmluZyB3aGljaCBhIGdsb2JhbCBlZmZlY3QgaXMgY29uc2lkZXJlZCBlbmFibGVkLgogc3RhdGljIGNvbnN0IG5zZWNzX3Qga01pbkdsb2JhbEVmZmVjdEVuYWJsZXRpbWVOcyA9IHNlY29uZHMoNzIwMCk7CkBAIC0xNjAsNiArMTQ4LDcgQEAKICAgICAgIG1Ub3RhbE1lbW9yeSgwKSwKICAgICAgIG1DbGllbnRTaGFyZWRIZWFwU2l6ZShrTWluaW11bUNsaWVudFNoYXJlZEhlYXBTaXplQnl0ZXMpLAogICAgICAgbUdsb2JhbEVmZmVjdEVuYWJsZVRpbWUoMCksCisgICAgICBtUGF0Y2hQYW5lbCh0aGlzKSwKICAgICAgIG1TeXN0ZW1SZWFkeShmYWxzZSkKIHsKICAgICAvLyB1bnNpZ25lZCBpbnN0ZWFkIG9mIGF1ZGlvX3VuaXF1ZV9pZF91c2VfdCwgYmVjYXVzZSArKyBvcGVyYXRvciBpcyB1bmF2YWlsYWJsZSBmb3IgZW51bQpAQCAtMTY4LDcgKzE1Nyw2IEBACiAgICAgICAgIG1OZXh0VW5pcXVlSWRzW3VzZV0gPSBBVURJT19VTklRVUVfSURfVVNFX01BWDsKICAgICB9CiAKLSAgICBnZXRwaWRfY2FjaGVkID0gZ2V0cGlkKCk7CiAgICAgY29uc3QgYm9vbCBkb0xvZyA9IHByb3BlcnR5X2dldF9ib29sKCJyby50ZXN0X2hhcm5lc3MiLCBmYWxzZSk7CiAgICAgaWYgKGRvTG9nKSB7CiAgICAgICAgIG1Mb2dNZW1vcnlEZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKGtMb2dNZW1vcnlTaXplLCAiTG9nV3JpdGVycyIsCkBAIC0xODUsMjcgKzE3Myw2IEBACiAgICAgbUVmZmVjdHNGYWN0b3J5SGFsID0gRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U6OmNyZWF0ZSgpOwogCiAgICAgbU1lZGlhTG9nTm90aWZpZXItPnJ1bigiTWVkaWFMb2dOb3RpZmllciIpOwotCi0jaWZkZWYgVEVFX1NJTksKLSAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgKHZvaWQpIHByb3BlcnR5X2dldCgicm8uZGVidWdnYWJsZSIsIHZhbHVlLCAiMCIpOwotICAgIGludCBkZWJ1Z2dhYmxlID0gYXRvaSh2YWx1ZSk7Ci0gICAgaW50IHRlZUVuYWJsZWQgPSAwOwotICAgIGlmIChkZWJ1Z2dhYmxlKSB7Ci0gICAgICAgICh2b2lkKSBwcm9wZXJ0eV9nZXQoImFmLnRlZSIsIHZhbHVlLCAiMCIpOwotICAgICAgICB0ZWVFbmFibGVkID0gYXRvaSh2YWx1ZSk7Ci0gICAgfQotICAgIC8vIEZJWE1FIHN5bWJvbGljIGNvbnN0YW50cyBoZXJlCi0gICAgaWYgKHRlZUVuYWJsZWQgJiAxKSB7Ci0gICAgICAgIG1UZWVTaW5rSW5wdXRFbmFibGVkID0gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKHRlZUVuYWJsZWQgJiAyKSB7Ci0gICAgICAgIG1UZWVTaW5rT3V0cHV0RW5hYmxlZCA9IHRydWU7Ci0gICAgfQotICAgIGlmICh0ZWVFbmFibGVkICYgNCkgewotICAgICAgICBtVGVlU2lua1RyYWNrRW5hYmxlZCA9IHRydWU7Ci0gICAgfQotI2VuZGlmCiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpvbkZpcnN0UmVmKCkKQEAgLTIyNiw4ICsxOTMsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgbVBhdGNoUGFuZWwgPSBuZXcgUGF0Y2hQYW5lbCh0aGlzKTsKLQogICAgIG1Nb2RlID0gQVVESU9fTU9ERV9OT1JNQUw7CiAKICAgICBnQXVkaW9GbGluZ2VyID0gdGhpczsKQEAgLTM0MSw3ICszMDYsNyBAQAogICAgICAgICAqc2Vzc2lvbklkID0gYWN0dWFsU2Vzc2lvbklkOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gTW1hcFN0cmVhbUludGVyZmFjZTo6RElSRUNUSU9OX09VVFBVVCkgewotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQoaW8sIHN0cmVhbVR5cGUsIGFjdHVhbFNlc3Npb25JZCk7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChwb3J0SWQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChwb3J0SWQpOwogICAgICAgICB9CkBAIC00NzgsNyArNDQzLDcgQEAKICAgICAgICAgICAgIG1IYXJkd2FyZUxvY2sudW5sb2NrKCk7CiAgICAgICAgIH0KIAotICAgICAgICBib29sIGxvY2tlZCA9IGR1bXBUcnlMb2NrKG1Mb2NrKTsKKyAgICAgICAgY29uc3QgYm9vbCBsb2NrZWQgPSBkdW1wVHJ5TG9jayhtTG9jayk7CiAKICAgICAgICAgLy8gZmFpbGVkIHRvIGxvY2sgLSBBdWRpb0ZsaW5nZXIgaXMgcHJvYmFibHkgZGVhZGxvY2tlZAogICAgICAgICBpZiAoIWxvY2tlZCkgewpAQCAtNTM0LDEyICs0OTksMjIgQEAKICAgICAgICAgICAgIGRldi0+ZHVtcChmZCk7CiAgICAgICAgIH0KIAotI2lmZGVmIFRFRV9TSU5LCi0gICAgICAgIC8vIGR1bXAgdGhlIHNlcmlhbGx5IHNoYXJlZCByZWNvcmQgdGVlIHNpbmsKLSAgICAgICAgaWYgKG1SZWNvcmRUZWVTb3VyY2UgIT0gMCkgewotICAgICAgICAgICAgZHVtcFRlZShmZCwgbVJlY29yZFRlZVNvdXJjZSwgQVVESU9fSU9fSEFORExFX05PTkUsICdDJyk7Ci0gICAgICAgIH0KLSNlbmRpZgorICAgICAgICBtUGF0Y2hQYW5lbC5kdW1wKGZkKTsKKworICAgICAgICAvLyBkdW1wIGV4dGVybmFsIHNldFBhcmFtZXRlcnMKKyAgICAgICAgYXV0byBkdW1wTG9nZ2VyID0gW2ZkXShTaW1wbGVMb2cmIGxvZ2dlciwgY29uc3QgY2hhciogbmFtZSkgeworICAgICAgICAgICAgZHByaW50ZihmZCwgIlxuJXMgc2V0UGFyYW1ldGVyczpcbiIsIG5hbWUpOworICAgICAgICAgICAgbG9nZ2VyLmR1bXAoZmQsICIgICAgIiAvKiBwcmVmaXggKi8pOworICAgICAgICB9OworICAgICAgICBkdW1wTG9nZ2VyKG1SZWplY3RlZFNldFBhcmFtZXRlckxvZywgIlJlamVjdGVkIik7CisgICAgICAgIGR1bXBMb2dnZXIobUFwcFNldFBhcmFtZXRlckxvZywgIkFwcCIpOworICAgICAgICBkdW1wTG9nZ2VyKG1TeXN0ZW1TZXRQYXJhbWV0ZXJMb2csICJTeXN0ZW0iKTsKKworICAgICAgICAvLyBkdW1wIGhpc3RvcmljYWwgdGhyZWFkcyBpbiB0aGUgbGFzdCAxMCBzZWNvbmRzCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHRocmVhZExvZyA9IG1UaHJlYWRMb2cuZHVtcFRvU3RyaW5nKAorICAgICAgICAgICAgICAgICJIaXN0b3JpY2FsIFRocmVhZCBMb2cgIiwgMCAvKiBsaW5lcyAqLywKKyAgICAgICAgICAgICAgICBhdWRpb191dGlsc19nZXRfcmVhbF90aW1lX25zKCkgLSAxMCAqIDYwICogTkFOT1NfUEVSX1NFQ09ORCk7CisgICAgICAgIHdyaXRlKGZkLCB0aHJlYWRMb2cuY19zdHIoKSwgdGhyZWFkTG9nLnNpemUoKSk7CiAKICAgICAgICAgQlVGTE9HX1JFU0VUOwogCkBAIC01NDcsNiArNTIyLDEwIEBACiAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgfQogCisjaWZkZWYgVEVFX1NJTksKKyAgICAgICAgLy8gTkJBSU9fVGVlIGR1bXAgaXMgc2FmZSB0byBjYWxsIG91dHNpZGUgb2YgQUYgbG9jay4KKyAgICAgICAgTkJBSU9fVGVlOjpkdW1wQWxsKGZkLCAiX0RVTVAiKTsKKyNlbmRpZgogICAgICAgICAvLyBhcHBlbmQgYSBjb3B5IG9mIG1lZGlhLmxvZyBoZXJlIGJ5IGZvcndhcmRpbmcgZmQgdG8gaXQsIGJ1dCBkb24ndCBhdHRlbXB0CiAgICAgICAgIC8vIHRvIGxvb2t1cCB0aGUgc2VydmljZSBpZiBpdCdzIG5vdCBydW5uaW5nLCBhcyBpdCB3aWxsIGJsb2NrIGZvciBhIHNlY29uZAogICAgICAgICBpZiAoc01lZGlhTG9nU2VydmljZUFzQmluZGVyICE9IDApIHsKQEAgLTY2Niw3ICs2NDUsNyBAQAogICAgIGJvb2wgdXBkYXRlUGlkID0gKGlucHV0LmNsaWVudEluZm8uY2xpZW50UGlkID09IC0xKTsKICAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwogICAgIHVpZF90IGNsaWVudFVpZCA9IGlucHV0LmNsaWVudEluZm8uY2xpZW50VWlkOwotICAgIGlmICghaXNUcnVzdGVkQ2FsbGluZ1VpZChjYWxsaW5nVWlkKSkgeworICAgIGlmICghaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoY2FsbGluZ1VpZCkpIHsKICAgICAgICAgQUxPR1dfSUYoY2xpZW50VWlkICE9IGNhbGxpbmdVaWQsCiAgICAgICAgICAgICAgICAgIiVzIHVpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgJWQiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FsbGluZ1VpZCwgY2xpZW50VWlkKTsKQEAgLTc2Nyw2ICs3NDYsNyBAQAogICAgICAgICBvdXRwdXQuYWZGcmFtZUNvdW50ID0gdGhyZWFkLT5mcmFtZUNvdW50KCk7CiAgICAgICAgIG91dHB1dC5hZlNhbXBsZVJhdGUgPSB0aHJlYWQtPnNhbXBsZVJhdGUoKTsKICAgICAgICAgb3V0cHV0LmFmTGF0ZW5jeU1zID0gdGhyZWFkLT5sYXRlbmN5KCk7CisgICAgICAgIG91dHB1dC5wb3J0SWQgPSBwb3J0SWQ7CiAKICAgICAgICAgLy8gbW92ZSBlZmZlY3QgY2hhaW4gdG8gdGhpcyBvdXRwdXQgdGhyZWFkIGlmIGFuIGVmZmVjdCBvbiBzYW1lIHNlc3Npb24gd2FzIHdhaXRpbmcKICAgICAgICAgLy8gZm9yIGEgdHJhY2sgdG8gYmUgY3JlYXRlZApAQCAtODEzLDcgKzc5Myw3IEBACiAKIEV4aXQ6CiAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IgJiYgb3V0cHV0Lm91dHB1dElkICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG91dHB1dC5vdXRwdXRJZCwgc3RyZWFtVHlwZSwgc2Vzc2lvbklkKTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQocG9ydElkKTsKICAgICB9CiAgICAgKnN0YXR1cyA9IGxTdGF0dXM7CiAgICAgcmV0dXJuIHRyYWNrSGFuZGxlOwpAQCAtMTA3OCw5ICsxMDU4LDkgQEAKICAgICAgICAgQUxPR1coImNoZWNrU3RyZWFtVHlwZSgpIGludmFsaWQgc3RyZWFtICVkIiwgc3RyZWFtKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgcGlkX3QgY2FsbGVyID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UICYmIGNhbGxlciAhPSBnZXRwaWRfY2FjaGVkKSB7Ci0gICAgICAgIEFMT0dXKCJjaGVja1N0cmVhbVR5cGUoKSBwaWQgJWQgY2Fubm90IHVzZSBpbnRlcm5hbCBzdHJlYW0gdHlwZSAlZCIsIGNhbGxlciwgc3RyZWFtKTsKKyAgICBjb25zdCB1aWRfdCBjYWxsZXJVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQgJiYgIWlzQXVkaW9TZXJ2ZXJVaWQoY2FsbGVyVWlkKSkgeworICAgICAgICBBTE9HVygiY2hlY2tTdHJlYW1UeXBlKCkgdWlkICVkIGNhbm5vdCB1c2UgaW50ZXJuYWwgc3RyZWFtIHR5cGUgJWQiLCBjYWxsZXJVaWQsIHN0cmVhbSk7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKQEAgLTExODAsNiArMTE2MCwyMyBAQAogICAgIH0KIH0KIAorLy8gZm9yd2FyZEF1ZGlvSHdTeW5jVG9Eb3duc3RyZWFtUGF0Y2hlc19sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKK3ZvaWQgQXVkaW9GbGluZ2VyOjpmb3J3YXJkUGFyYW1ldGVyc1RvRG93bnN0cmVhbVBhdGNoZXNfbCgKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgdXBTdHJlYW0sIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBzcDxQbGF5YmFja1RocmVhZD4mKT4gdXNlVGhyZWFkKQoreworICAgIHN0ZDo6dmVjdG9yPFBhdGNoUGFuZWw6OlNvZnR3YXJlUGF0Y2g+IHN3UGF0Y2hlczsKKyAgICBpZiAobVBhdGNoUGFuZWwuZ2V0RG93bnN0cmVhbVNvZnR3YXJlUGF0Y2hlcyh1cFN0cmVhbSwgJnN3UGF0Y2hlcykgIT0gT0spIHJldHVybjsKKyAgICBBTE9HVl9JRighc3dQYXRjaGVzLmVtcHR5KCksICIlcyBmb3VuZCAlenUgZG93bnN0cmVhbSBwYXRjaGVzIGZvciBzdHJlYW0gSUQgJWQiLAorICAgICAgICAgICAgX19mdW5jX18sIHN3UGF0Y2hlcy5zaXplKCksIHVwU3RyZWFtKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHN3UGF0Y2ggOiBzd1BhdGNoZXMpIHsKKyAgICAgICAgc3A8UGxheWJhY2tUaHJlYWQ+IGRvd25TdHJlYW0gPSBjaGVja1BsYXliYWNrVGhyZWFkX2woc3dQYXRjaC5nZXRQbGF5YmFja1RocmVhZEhhbmRsZSgpKTsKKyAgICAgICAgaWYgKGRvd25TdHJlYW0gIT0gTlVMTCAmJiAodXNlVGhyZWFkID09IG51bGxwdHIgfHwgdXNlVGhyZWFkKGRvd25TdHJlYW0pKSkgeworICAgICAgICAgICAgZG93blN0cmVhbS0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgfQorICAgIH0KK30KKwogLy8gRmlsdGVyIHJlc2VydmVkIGtleXMgZnJvbSBzZXRQYXJhbWV0ZXJzKCkgYmVmb3JlIGZvcndhcmRpbmcgdG8gYXVkaW8gSEFMIG9yIGFjdGluZyB1cG9uLgogLy8gU29tZSBrZXlzIGFyZSB1c2VkIGZvciBhdWRpbyByb3V0aW5nIGFuZCBhdWRpbyBwYXRoIGNvbmZpZ3VyYXRpb24gYW5kIHNob3VsZCBiZSByZXNlcnZlZCBmb3IgdXNlCiAvLyBieSBhdWRpbyBwb2xpY3kgYW5kIGF1ZGlvIGZsaW5nZXIgZm9yIGZ1bmN0aW9uYWwsIHByaXZhY3kgYW5kIHNlY3VyaXR5IHJlYXNvbnMuCkBAIC0xMjAwLDIzICsxMTk3LDM5IEBACiAgICAgICAgIFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZFNhbXBsaW5nUmF0ZXMpLAogICAgIH07CiAKLSAgICAvLyBtdWx0aXVzZXIgZnJpZW5kbHkgYXBwIElEIGNoZWNrIGZvciByZXF1ZXN0cyBjb21pbmcgZnJvbSBhdWRpb3NlcnZlcgotICAgIGlmIChtdWx0aXVzZXJfZ2V0X2FwcF9pZChjYWxsaW5nVWlkKSA9PSBBSURfQVVESU9TRVJWRVIpIHsKLSAgICAgICAgcmV0dXJuOworICAgIGlmIChpc0F1ZGlvU2VydmVyVWlkKGNhbGxpbmdVaWQpKSB7CisgICAgICAgIHJldHVybjsgLy8gbm8gbmVlZCB0byBmaWx0ZXIgaWYgYXVkaW9zZXJ2ZXIuCiAgICAgfQogCiAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlWYWx1ZVBhaXJzKTsKICAgICBTdHJpbmc4IHZhbHVlOworICAgIEF1ZGlvUGFyYW1ldGVyIHJlamVjdGVkUGFyYW07CiAgICAgZm9yIChhdXRvJiBrZXkgOiBrUmVzZXJ2ZWRQYXJhbWV0ZXJzKSB7CiAgICAgICAgIGlmIChwYXJhbS5nZXQoa2V5LCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dXKCIlczogZmlsdGVyaW5nIGtleSAlcyB2YWx1ZSAlcyBmcm9tIHVpZCAlZCIsCi0gICAgICAgICAgICAgICAgICBfX2Z1bmNfXywga2V5LnN0cmluZygpLCB2YWx1ZS5zdHJpbmcoKSwgY2FsbGluZ1VpZCk7CisgICAgICAgICAgICByZWplY3RlZFBhcmFtLmFkZChrZXksIHZhbHVlKTsKICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShrZXkpOwogICAgICAgICB9CiAgICAgfQorICAgIGxvZ0ZpbHRlcmVkUGFyYW1ldGVycyhwYXJhbS5zaXplKCkgKyByZWplY3RlZFBhcmFtLnNpemUoKSwga2V5VmFsdWVQYWlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0ZWRQYXJhbS5zaXplKCksIHJlamVjdGVkUGFyYW0udG9TdHJpbmcoKSwgY2FsbGluZ1VpZCk7CiAgICAga2V5VmFsdWVQYWlycyA9IHBhcmFtLnRvU3RyaW5nKCk7CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpsb2dGaWx0ZXJlZFBhcmFtZXRlcnMoc2l6ZV90IG9yaWdpbmFsS1ZQU2l6ZSwgY29uc3QgU3RyaW5nOCYgb3JpZ2luYWxLVlBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmVqZWN0ZWRLVlBTaXplLCBjb25zdCBTdHJpbmc4JiByZWplY3RlZEtWUHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IGNhbGxpbmdVaWQpIHsKKyAgICBhdXRvIHByZWZpeCA9IFN0cmluZzg6OmZvcm1hdCgiVUlEICU1ZCIsIGNhbGxpbmdVaWQpOworICAgIGF1dG8gc3VmZml4ID0gU3RyaW5nODo6Zm9ybWF0KCIlenUgS1ZQIHJlY2VpdmVkOiAlcyIsIG9yaWdpbmFsS1ZQU2l6ZSwgb3JpZ2luYWxLVlBzLmNfc3RyKCkpOworICAgIGlmIChyZWplY3RlZEtWUFNpemUgIT0gMCkgeworICAgICAgICBhdXRvIGVycm9yID0gU3RyaW5nODo6Zm9ybWF0KCIlenUgS1ZQIHJlamVjdGVkOiAlcyIsIHJlamVjdGVkS1ZQU2l6ZSwgcmVqZWN0ZWRLVlBzLmNfc3RyKCkpOworICAgICAgICBBTE9HVygiJXM6ICVzLCAlcywgJXMiLCBfX2Z1bmNfXywgcHJlZml4LmNfc3RyKCksIGVycm9yLmNfc3RyKCksIHN1ZmZpeC5jX3N0cigpKTsKKyAgICAgICAgbVJlamVjdGVkU2V0UGFyYW1ldGVyTG9nLmxvZygiJXMsICVzLCAlcyIsIHByZWZpeC5jX3N0cigpLCBlcnJvci5jX3N0cigpLCBzdWZmaXguY19zdHIoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXV0byYgbG9nZ2VyID0gKGlzU2VydmljZVVpZChjYWxsaW5nVWlkKSA/IG1TeXN0ZW1TZXRQYXJhbWV0ZXJMb2cgOiBtQXBwU2V0UGFyYW1ldGVyTG9nKTsKKyAgICAgICAgbG9nZ2VyLmxvZygiJXMsICVzIiwgcHJlZml4LmNfc3RyKCksIHN1ZmZpeC5jX3N0cigpKTsKKyAgICB9Cit9CisKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6c2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykKIHsKICAgICBBTE9HVigic2V0UGFyYW1ldGVycygpOiBpbyAlZCwga2V5dmFsdWUgJXMsIGNhbGxpbmcgcGlkICVkIGNhbGxpbmcgdWlkICVkIiwKQEAgLTEyOTYsNyArMTMwOSw5IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHRocmVhZCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiB0aHJlYWQtPnNldFBhcmFtZXRlcnMoZmlsdGVyZWRLZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gdGhyZWFkLT5zZXRQYXJhbWV0ZXJzKGZpbHRlcmVkS2V5VmFsdWVQYWlycyk7CisgICAgICAgIGZvcndhcmRQYXJhbWV0ZXJzVG9Eb3duc3RyZWFtUGF0Y2hlc19sKHRocmVhZC0+aWQoKSwgZmlsdGVyZWRLZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAgICAgcmV0dXJuIEJBRF9WQUxVRTsKIH0KQEAgLTE2MzYsNyArMTY1MSw3IEBACiAgICAgYm9vbCB1cGRhdGVQaWQgPSAoaW5wdXQuY2xpZW50SW5mby5jbGllbnRQaWQgPT0gLTEpOwogICAgIGNvbnN0IHVpZF90IGNhbGxpbmdVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CiAgICAgdWlkX3QgY2xpZW50VWlkID0gaW5wdXQuY2xpZW50SW5mby5jbGllbnRVaWQ7Ci0gICAgaWYgKCFpc1RydXN0ZWRDYWxsaW5nVWlkKGNhbGxpbmdVaWQpKSB7CisgICAgaWYgKCFpc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZChjYWxsaW5nVWlkKSkgewogICAgICAgICBBTE9HV19JRihjbGllbnRVaWQgIT0gY2FsbGluZ1VpZCwKICAgICAgICAgICAgICAgICAiJXMgdWlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyAlZCIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYWxsaW5nVWlkLCBjbGllbnRVaWQpOwpAQCAtMTc1MSw2ICsxNzY2LDcgQEAKIAogICAgIG91dHB1dC5jYmxrID0gcmVjb3JkVHJhY2stPmdldENibGsoKTsKICAgICBvdXRwdXQuYnVmZmVycyA9IHJlY29yZFRyYWNrLT5nZXRCdWZmZXJzKCk7CisgICAgb3V0cHV0LnBvcnRJZCA9IHBvcnRJZDsKIAogICAgIC8vIHJldHVybiBoYW5kbGUgdG8gY2xpZW50CiAgICAgcmVjb3JkSGFuZGxlID0gbmV3IFJlY29yZEhhbmRsZShyZWNvcmRUcmFjayk7CkBAIC0xODU0LDYgKzE4NzAsMTAgQEAKIAogICAgICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19JRExFOwogICAgIH0KKyAgICBpZiAoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpID09IDApIHsKKyAgICAgICAgLy8gQW4gTVNEIG1vZHVsZSBpcyBpbnNlcnRlZCBiZWZvcmUgaGFyZHdhcmUgbW9kdWxlcyBpbiBvcmRlciB0byBtaXggZW5jb2RlZCBzdHJlYW1zLgorICAgICAgICBmbGFncyA9IHN0YXRpY19jYXN0PEF1ZGlvSHdEZXZpY2U6OkZsYWdzPihmbGFncyB8IEF1ZGlvSHdEZXZpY2U6OkFIV0RfSVNfSU5TRVJUKTsKKyAgICB9CiAKICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgaGFuZGxlID0gKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCkgbmV4dFVuaXF1ZUlkKEFVRElPX1VOSVFVRV9JRF9VU0VfTU9EVUxFKTsKICAgICBtQXVkaW9Id0RldnMuYWRkKGhhbmRsZSwgbmV3IEF1ZGlvSHdEZXZpY2UoaGFuZGxlLCBuYW1lLCBkZXYsIGZsYWdzKSk7CkBAIC0xODg1LDcgKzE5MDUsNyBAQAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzZXRMb3dSYW1EZXZpY2UoYm9vbCBpc0xvd1JhbURldmljZSwgaW50NjRfdCB0b3RhbE1lbW9yeSkKIHsKICAgICB1aWRfdCB1aWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgaWYgKHVpZCAhPSBBSURfU1lTVEVNKSB7CisgICAgaWYgKCFpc0F1ZGlvU2VydmVyT3JTeXN0ZW1TZXJ2ZXJVaWQodWlkKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC0xOTMwLDYgKzE5NTAsMjggQEAKICAgICByZXR1cm4gbUNsaWVudFNoYXJlZEhlYXBTaXplOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3sKKyAgICBBTE9HVihfX2Z1bmNfXyk7CisKKyAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlOworICAgIGlmIChjb25maWctPnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICBtb2R1bGUgPSBjb25maWctPmV4dC5kZXZpY2UuaHdfbW9kdWxlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1vZHVsZSA9IGNvbmZpZy0+ZXh0Lm1peC5od19tb2R1bGU7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvSHdEZXZzLmluZGV4T2ZLZXkobW9kdWxlKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCIlcygpIGJhZCBodyBtb2R1bGUgJWQiLCBfX2Z1bmNfXywgbW9kdWxlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlID0gbUF1ZGlvSHdEZXZzLnZhbHVlQXQoaW5kZXgpOworICAgIHJldHVybiBhdWRpb0h3RGV2aWNlLT5od0RldmljZSgpLT5zZXRBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKK30KKwogYXVkaW9faHdfc3luY190IEF1ZGlvRmxpbmdlcjo6Z2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTE5NzUsNyArMjAxNywxMCBAQAogICAgICAgICBpZiAoc2Vzc2lvbnMgJiBUaHJlYWRCYXNlOjpUUkFDS19TRVNTSU9OKSB7CiAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7CiAgICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtSHdBdlN5bmMpLCB2YWx1ZSk7Ci0gICAgICAgICAgICB0aHJlYWQtPnNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICBTdHJpbmc4IGtleVZhbHVlUGFpcnMgPSBwYXJhbS50b1N0cmluZygpOworICAgICAgICAgICAgdGhyZWFkLT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcnMpOworICAgICAgICAgICAgZm9yd2FyZFBhcmFtZXRlcnNUb0Rvd25zdHJlYW1QYXRjaGVzX2wodGhyZWFkLT5pZCgpLCBrZXlWYWx1ZVBhaXJzLAorICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBzcDxQbGF5YmFja1RocmVhZD4mIHRocmVhZCkgeyByZXR1cm4gdGhyZWFkLT51c2VzSHdBdlN5bmMoKTsgfSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KQEAgLTIwMjEsNyArMjA2NiwxMCBAQAogICAgICAgICBBTE9HVigic2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uX2wgZm91bmQgSUQgJWQgZm9yIHNlc3Npb24gJWQiLCBzeW5jSWQsIHNlc3Npb25JZCk7CiAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKICAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbUh3QXZTeW5jKSwgc3luY0lkKTsKLSAgICAgICAgdGhyZWFkLT5zZXRQYXJhbWV0ZXJzKHBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICBTdHJpbmc4IGtleVZhbHVlUGFpcnMgPSBwYXJhbS50b1N0cmluZygpOworICAgICAgICB0aHJlYWQtPnNldFBhcmFtZXRlcnMoa2V5VmFsdWVQYWlycyk7CisgICAgICAgIGZvcndhcmRQYXJhbWV0ZXJzVG9Eb3duc3RyZWFtUGF0Y2hlc19sKHRocmVhZC0+aWQoKSwga2V5VmFsdWVQYWlycywKKyAgICAgICAgICAgICAgICBbXShjb25zdCBzcDxQbGF5YmFja1RocmVhZD4mIHRocmVhZCkgeyByZXR1cm4gdGhyZWFkLT51c2VzSHdBdlN5bmMoKTsgfSk7CiAgICAgfQogfQogCkBAIC0yMTExLDYgKzIxNTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICpvdXRwdXQsIHRocmVhZC5nZXQoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtUGxheWJhY2tUaHJlYWRzLmFkZCgqb3V0cHV0LCB0aHJlYWQpOworICAgICAgICAgICAgbVBhdGNoUGFuZWwubm90aWZ5U3RyZWFtT3BlbmVkKG91dEh3RGV2LCAqb3V0cHV0KTsKICAgICAgICAgICAgIHJldHVybiB0aHJlYWQ7CiAgICAgICAgIH0KICAgICB9CkBAIC0yMjA5LDYgKzIyNTgsOCBAQAogICAgICAgICBpZiAocGxheWJhY2tUaHJlYWQgIT0gTlVMTCkgewogICAgICAgICAgICAgQUxPR1YoImNsb3NlT3V0cHV0KCkgJWQiLCBvdXRwdXQpOwogCisgICAgICAgICAgICBkdW1wVG9UaHJlYWRMb2dfbChwbGF5YmFja1RocmVhZCk7CisKICAgICAgICAgICAgIGlmIChwbGF5YmFja1RocmVhZC0+dHlwZSgpID09IFRocmVhZEJhc2U6Ok1JWEVSKSB7CiAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheWJhY2tUaHJlYWRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSktPmlzRHVwbGljYXRpbmcoKSkgewpAQCAtMjI0MCwxMiArMjI5MSwxNCBAQAogICAgICAgICAgICAgaWYgKG1tYXBUaHJlYWQgPT0gMCkgewogICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBkdW1wVG9UaHJlYWRMb2dfbChtbWFwVGhyZWFkKTsKICAgICAgICAgICAgIG1NbWFwVGhyZWFkcy5yZW1vdmVJdGVtKG91dHB1dCk7CiAgICAgICAgICAgICBBTE9HRCgiY2xvc2luZyBtbWFwVGhyZWFkICVwIiwgbW1hcFRocmVhZC5nZXQoKSk7CiAgICAgICAgIH0KICAgICAgICAgY29uc3Qgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IGlvRGVzYyA9IG5ldyBBdWRpb0lvRGVzY3JpcHRvcigpOwogICAgICAgICBpb0Rlc2MtPm1Jb0hhbmRsZSA9IG91dHB1dDsKICAgICAgICAgaW9Db25maWdDaGFuZ2VkKEFVRElPX09VVFBVVF9DTE9TRUQsIGlvRGVzYyk7CisgICAgICAgIG1QYXRjaFBhbmVsLm5vdGlmeVN0cmVhbUNsb3NlZChvdXRwdXQpOwogICAgIH0KICAgICAvLyBUaGUgdGhyZWFkIGVudGl0eSAoYWN0aXZlIHVuaXQgb2YgZXhlY3V0aW9uKSBpcyBubyBsb25nZXIgcnVubmluZyBoZXJlLAogICAgIC8vIGJ1dCB0aGUgVGhyZWFkQmFzZSBjb250YWluZXIgc3RpbGwgZXhpc3RzLgpAQCAtMjI3NCw3ICsyMzI3LDcgQEAKICAgICBkZWxldGUgb3V0OwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6Y2xvc2VPdXRwdXRJbnRlcm5hbF9sKGNvbnN0IHNwPFBsYXliYWNrVGhyZWFkPiYgdGhyZWFkKQordm9pZCBBdWRpb0ZsaW5nZXI6OmNsb3NlVGhyZWFkSW50ZXJuYWxfbChjb25zdCBzcDxQbGF5YmFja1RocmVhZD4mIHRocmVhZCkKIHsKICAgICBtUGxheWJhY2tUaHJlYWRzLnJlbW92ZUl0ZW0odGhyZWFkLT5tSWQpOwogICAgIHRocmVhZC0+ZXhpdCgpOwpAQCAtMjM1MCw2ICsyNDAzLDkgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCisgICAgLy8gU29tZSBmbGFncyBhcmUgc3BlY2lmaWMgdG8gZnJhbWV3b3JrIGFuZCBtdXN0IG5vdCBsZWFrIHRvIHRoZSBIQUwuCisgICAgZmxhZ3MgPSBzdGF0aWNfY2FzdDxhdWRpb19pbnB1dF9mbGFnc190PihmbGFncyAmIH5BVURJT19JTlBVVF9GUkFNRVdPUktfRkxBR1MpOworCiAgICAgLy8gQXVkaW8gUG9saWN5IGNhbiByZXF1ZXN0IGEgc3BlY2lmaWMgaGFuZGxlIGZvciBoYXJkd2FyZSBob3R3b3JkLgogICAgIC8vIFRoZSBnb2FsIGhlcmUgaXMgbm90IHRvIHJlLW9wZW4gYW4gYWxyZWFkeSBvcGVuZWQgaW5wdXQuCiAgICAgLy8gSXQgaXMgdG8gdXNlIGEgcHJlLWFzc2lnbmVkIEkvTyBoYW5kbGUuCkBAIC0yNDA3LDU1ICsyNDYzLDYgQEAKICAgICAgICAgICAgICAgICAgICAgdGhyZWFkLmdldCgpKTsKICAgICAgICAgICAgIHJldHVybiB0aHJlYWQ7CiAgICAgICAgIH0gZWxzZSB7Ci0jaWZkZWYgVEVFX1NJTksKLSAgICAgICAgICAgIC8vIFRyeSB0byByZS11c2UgbW9zdCByZWNlbnRseSB1c2VkIFBpcGUgdG8gYXJjaGl2ZSBhIGNvcHkgb2YgaW5wdXQgZm9yIGR1bXBzeXMsCi0gICAgICAgICAgICAvLyBvciAocmUtKWNyZWF0ZSBpZiBjdXJyZW50IFBpcGUgaXMgaWRsZSBhbmQgZG9lcyBub3QgbWF0Y2ggdGhlIG5ldyBmb3JtYXQKLSAgICAgICAgICAgIHNwPE5CQUlPX1Npbms+IHRlZVNpbms7Ci0gICAgICAgICAgICBlbnVtIHsKLSAgICAgICAgICAgICAgICBURUVfU0lOS19OTywgICAgLy8gZG9uJ3QgY29weSBpbnB1dAotICAgICAgICAgICAgICAgIFRFRV9TSU5LX05FVywgICAvLyBjb3B5IGlucHV0IHVzaW5nIGEgbmV3IHBpcGUKLSAgICAgICAgICAgICAgICBURUVfU0lOS19PTEQsICAgLy8gY29weSBpbnB1dCB1c2luZyBhbiBleGlzdGluZyBwaXBlCi0gICAgICAgICAgICB9IGtpbmQ7Ci0gICAgICAgICAgICBOQkFJT19Gb3JtYXQgZm9ybWF0ID0gRm9ybWF0X2Zyb21fU1JfQyhoYWxjb25maWcuc2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGhhbGNvbmZpZy5jaGFubmVsX21hc2spLCBoYWxjb25maWcuZm9ybWF0KTsKLSAgICAgICAgICAgIGlmICghbVRlZVNpbmtJbnB1dEVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBraW5kID0gVEVFX1NJTktfTk87Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFGb3JtYXRfaXNWYWxpZChmb3JtYXQpKSB7Ci0gICAgICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX05POwotICAgICAgICAgICAgfSBlbHNlIGlmIChtUmVjb3JkVGVlU2luayA9PSAwKSB7Ci0gICAgICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX05FVzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVJlY29yZFRlZVNpbmstPmdldFN0cm9uZ0NvdW50KCkgIT0gMSkgewotICAgICAgICAgICAgICAgIGtpbmQgPSBURUVfU0lOS19OTzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoRm9ybWF0X2lzRXF1YWwoZm9ybWF0LCBtUmVjb3JkVGVlU2luay0+Zm9ybWF0KCkpKSB7Ci0gICAgICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX09MRDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX05FVzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoa2luZCkgewotICAgICAgICAgICAgY2FzZSBURUVfU0lOS19ORVc6IHsKLSAgICAgICAgICAgICAgICBQaXBlICpwaXBlID0gbmV3IFBpcGUobVRlZVNpbmtJbnB1dEZyYW1lcywgZm9ybWF0KTsKLSAgICAgICAgICAgICAgICBzaXplX3QgbnVtQ291bnRlck9mZmVycyA9IDA7Ci0gICAgICAgICAgICAgICAgY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyc1sxXSA9IHtmb3JtYXR9OwotICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBwaXBlLT5uZWdvdGlhdGUob2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChpbmRleCA9PSAwKTsKLSAgICAgICAgICAgICAgICBQaXBlUmVhZGVyICpwaXBlUmVhZGVyID0gbmV3IFBpcGVSZWFkZXIoKnBpcGUpOwotICAgICAgICAgICAgICAgIG51bUNvdW50ZXJPZmZlcnMgPSAwOwotICAgICAgICAgICAgICAgIGluZGV4ID0gcGlwZVJlYWRlci0+bmVnb3RpYXRlKG9mZmVycywgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoaW5kZXggPT0gMCk7Ci0gICAgICAgICAgICAgICAgbVJlY29yZFRlZVNpbmsgPSBwaXBlOwotICAgICAgICAgICAgICAgIG1SZWNvcmRUZWVTb3VyY2UgPSBwaXBlUmVhZGVyOwotICAgICAgICAgICAgICAgIHRlZVNpbmsgPSBwaXBlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVEVFX1NJTktfT0xEOgotICAgICAgICAgICAgICAgIHRlZVNpbmsgPSBtUmVjb3JkVGVlU2luazsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVEVFX1NJTktfTk86Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotI2VuZGlmCi0KICAgICAgICAgICAgIC8vIFN0YXJ0IHJlY29yZCB0aHJlYWQKICAgICAgICAgICAgIC8vIFJlY29yZFRocmVhZCByZXF1aXJlcyBib3RoIGlucHV0IGFuZCBvdXRwdXQgZGV2aWNlIGluZGljYXRpb24gdG8gZm9yd2FyZCB0byBhdWRpbwogICAgICAgICAgICAgLy8gcHJlIHByb2Nlc3NpbmcgbW9kdWxlcwpAQCAtMjQ2NSw5ICsyNDcyLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeU91dHB1dERldmljZV9sKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1SZWFkeQotI2lmZGVmIFRFRV9TSU5LCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgdGVlU2luawotI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICBtUmVjb3JkVGhyZWFkcy5hZGQoKmlucHV0LCB0aHJlYWQpOwogICAgICAgICAgICAgQUxPR1YoIm9wZW5JbnB1dF9sKCkgY3JlYXRlZCByZWNvcmQgdGhyZWFkOiBJRCAlZCB0aHJlYWQgJXAiLCAqaW5wdXQsIHRocmVhZC5nZXQoKSk7CkBAIC0yNDk2LDYgKzI1MDAsOCBAQAogICAgICAgICBpZiAocmVjb3JkVGhyZWFkICE9IDApIHsKICAgICAgICAgICAgIEFMT0dWKCJjbG9zZUlucHV0KCkgJWQiLCBpbnB1dCk7CiAKKyAgICAgICAgICAgIGR1bXBUb1RocmVhZExvZ19sKHJlY29yZFRocmVhZCk7CisKICAgICAgICAgICAgIC8vIElmIHdlIHN0aWxsIGhhdmUgZWZmZWN0IGNoYWlucywgaXQgbWVhbnMgdGhhdCBhIGNsaWVudCBzdGlsbCBob2xkcyBhIGhhbmRsZQogICAgICAgICAgICAgLy8gb24gYXQgbGVhc3Qgb25lIGVmZmVjdC4gV2UgbXVzdCBlaXRoZXIgbW92ZSB0aGUgY2hhaW4gdG8gYW4gZXhpc3RpbmcgdGhyZWFkIHdpdGggdGhlCiAgICAgICAgICAgICAvLyBzYW1lIHNlc3Npb24gSUQgb3IgcHV0IGl0IGFzaWRlIGluIGNhc2UgYSBuZXcgcmVjb3JkIHRocmVhZCBpcyBvcGVuZWQgZm9yIGEKQEAgLTI1MzgsNiArMjU0NCw3IEBACiAgICAgICAgICAgICBpZiAobW1hcFRocmVhZCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGR1bXBUb1RocmVhZExvZ19sKG1tYXBUaHJlYWQpOwogICAgICAgICAgICAgbU1tYXBUaHJlYWRzLnJlbW92ZUl0ZW0oaW5wdXQpOwogICAgICAgICB9CiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBpb0Rlc2MgPSBuZXcgQXVkaW9Jb0Rlc2NyaXB0b3IoKTsKQEAgLTI1NjcsNyArMjU3NCw3IEBACiAgICAgZGVsZXRlIGluOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6Y2xvc2VJbnB1dEludGVybmFsX2woY29uc3Qgc3A8UmVjb3JkVGhyZWFkPiYgdGhyZWFkKQordm9pZCBBdWRpb0ZsaW5nZXI6OmNsb3NlVGhyZWFkSW50ZXJuYWxfbChjb25zdCBzcDxSZWNvcmRUaHJlYWQ+JiB0aHJlYWQpCiB7CiAgICAgbVJlY29yZFRocmVhZHMucmVtb3ZlSXRlbSh0aHJlYWQtPm1JZCk7CiAgICAgY2xvc2VJbnB1dEZpbmlzaCh0aHJlYWQpOwpAQCAtMjYwNSw3ICsyNjEyLDggQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIHBpZF90IGNhbGxlciA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICBBTE9HVigiYWNxdWlyaW5nICVkIGZyb20gJWQsIGZvciAlZCIsIGF1ZGlvU2Vzc2lvbiwgY2FsbGVyLCBwaWQpOwotICAgIGlmIChwaWQgIT0gLTEgJiYgKGNhbGxlciA9PSBnZXRwaWRfY2FjaGVkKSkgeworICAgIGNvbnN0IHVpZF90IGNhbGxlclVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKyAgICBpZiAocGlkICE9IC0xICYmIGlzQXVkaW9TZXJ2ZXJVaWQoY2FsbGVyVWlkKSkgeyAvLyBjaGVjayBtdXN0IG1hdGNoIHJlbGVhc2VBdWRpb1Nlc3Npb25JZCgpCiAgICAgICAgIGNhbGxlciA9IHBpZDsKICAgICB9CiAKQEAgLTI2MzksNyArMjY0Nyw4IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBwaWRfdCBjYWxsZXIgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgQUxPR1YoInJlbGVhc2luZyAlZCBmcm9tICVkIGZvciAlZCIsIGF1ZGlvU2Vzc2lvbiwgY2FsbGVyLCBwaWQpOwotICAgIGlmIChwaWQgIT0gLTEgJiYgKGNhbGxlciA9PSBnZXRwaWRfY2FjaGVkKSkgeworICAgIGNvbnN0IHVpZF90IGNhbGxlclVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKyAgICBpZiAocGlkICE9IC0xICYmIGlzQXVkaW9TZXJ2ZXJVaWQoY2FsbGVyVWlkKSkgeyAvLyBjaGVjayBtdXN0IG1hdGNoIGFjcXVpcmVBdWRpb1Nlc3Npb25JZCgpCiAgICAgICAgIGNhbGxlciA9IHBpZDsKICAgICB9CiAgICAgc2l6ZV90IG51bSA9IG1BdWRpb1Nlc3Npb25SZWZzLnNpemUoKTsKQEAgLTI2NTYsOSArMjY2NSwxMCBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQotICAgIC8vIElmIHRoZSBjYWxsZXIgaXMgbWVkaWFzZXJ2ZXIgaXQgaXMgbGlrZWx5IHRoYXQgdGhlIHNlc3Npb24gYmVpbmcgcmVsZWFzZWQgd2FzIGFjcXVpcmVkCisgICAgLy8gSWYgdGhlIGNhbGxlciBpcyBhdWRpb3NlcnZlciBpdCBpcyBsaWtlbHkgdGhhdCB0aGUgc2Vzc2lvbiBiZWluZyByZWxlYXNlZCB3YXMgYWNxdWlyZWQKICAgICAvLyBvbiBiZWhhbGYgb2YgYSBwcm9jZXNzIG5vdCBpbiBub3RpZmljYXRpb24gY2xpZW50cyBhbmQgd2UgaWdub3JlIHRoZSB3YXJuaW5nLgotICAgIEFMT0dXX0lGKGNhbGxlciAhPSBnZXRwaWRfY2FjaGVkLCAic2Vzc2lvbiBpZCAlZCBub3QgZm91bmQgZm9yIHBpZCAlZCIsIGF1ZGlvU2Vzc2lvbiwgY2FsbGVyKTsKKyAgICBBTE9HV19JRighaXNBdWRpb1NlcnZlclVpZChjYWxsZXJVaWQpLAorICAgICAgICAgICAgInNlc3Npb24gaWQgJWQgbm90IGZvdW5kIGZvciBwaWQgJWQiLCBhdWRpb1Nlc3Npb24sIGNhbGxlcik7CiB9CiAKIGJvb2wgQXVkaW9GbGluZ2VyOjppc1Nlc3Npb25BY3F1aXJlZF9sKGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24pCkBAIC0yNzMzLDYgKzI3NDMsMTcgQEAKICAgICByZXR1cm47CiB9CiAKKy8vIGR1bXBUb1RocmVhZExvZ19sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKK3ZvaWQgQXVkaW9GbGluZ2VyOjpkdW1wVG9UaHJlYWRMb2dfbChjb25zdCBzcDxUaHJlYWRCYXNlPiAmdGhyZWFkKQoreworICAgIGF1ZGlvX3V0aWxzOjpGZFRvU3RyaW5nIGZkVG9TdHJpbmc7CisgICAgY29uc3QgaW50IGZkID0gZmRUb1N0cmluZy5mZCgpOworICAgIGlmIChmZCA+PSAwKSB7CisgICAgICAgIHRocmVhZC0+ZHVtcChmZCwge30gLyogYXJncyAqLyk7CisgICAgICAgIG1UaHJlYWRMb2cubG9ncygtMSAvKiB0aW1lICovLCBmZFRvU3RyaW5nLmdldFN0cmluZ0FuZENsb3NlKCkpOworICAgIH0KK30KKwogLy8gY2hlY2tUaHJlYWRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCiBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2UgKkF1ZGlvRmxpbmdlcjo6Y2hlY2tUaHJlYWRfbChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkgY29uc3QKIHsKQEAgLTI5MzgsMTYgKzI5NTksNzQgQEAKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpnZXRFZmZlY3REZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBVdWlkLAotICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKSBjb25zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBUeXBlVXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKSBjb25zdAogeworICAgIGlmIChwVXVpZCA9PSBOVUxMIHx8IHBUeXBlVXVpZCA9PSBOVUxMIHx8IGRlc2NyaXB0b3IgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeUhhbC5nZXQoKSkgewotICAgICAgICByZXR1cm4gbUVmZmVjdHNGYWN0b3J5SGFsLT5nZXREZXNjcmlwdG9yKHBVdWlkLCBkZXNjcmlwdG9yKTsKLSAgICB9IGVsc2UgeworCisgICAgaWYgKCFtRWZmZWN0c0ZhY3RvcnlIYWwuZ2V0KCkpIHsKICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CiAgICAgfQotfQogCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgaWYgKCFFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTo6aXNOdWxsVXVpZChwVXVpZCkpIHsKKyAgICAgICAgLy8gSWYgdXVpZCBpcyBzcGVjaWZpZWQsIHJlcXVlc3QgZWZmZWN0IGRlc2NyaXB0b3IgZnJvbSB0aGF0LgorICAgICAgICBzdGF0dXMgPSBtRWZmZWN0c0ZhY3RvcnlIYWwtPmdldERlc2NyaXB0b3IocFV1aWQsIGRlc2NyaXB0b3IpOworICAgIH0gZWxzZSBpZiAoIUVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOjppc051bGxVdWlkKHBUeXBlVXVpZCkpIHsKKyAgICAgICAgLy8gSWYgdXVpZCBpcyBub3Qgc3BlY2lmaWVkLCBsb29rIGZvciBhbiBhdmFpbGFibGUgaW1wbGVtZW50YXRpb24KKyAgICAgICAgLy8gb2YgdGhlIHJlcXVpcmVkIHR5cGUgaW5zdGVhZC4KKworICAgICAgICAvLyBVc2UgYSB0ZW1wb3JhcnkgZGVzY3JpcHRvciB0byBhdm9pZCBtb2RpZnlpbmcgfGRlc2NyaXB0b3J8IGluIHRoZSBmYWlsdXJlIGNhc2UuCisgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYzsKKyAgICAgICAgZGVzYy5mbGFncyA9IDA7IC8vIHByZXZlbnQgY29tcGlsZXIgd2FybmluZworCisgICAgICAgIHVpbnQzMl90IG51bUVmZmVjdHMgPSAwOworICAgICAgICBzdGF0dXMgPSBtRWZmZWN0c0ZhY3RvcnlIYWwtPnF1ZXJ5TnVtYmVyRWZmZWN0cygmbnVtRWZmZWN0cyk7CisgICAgICAgIGlmIChzdGF0dXMgPCAwKSB7CisgICAgICAgICAgICBBTE9HVygiZ2V0RWZmZWN0RGVzY3JpcHRvcigpIGVycm9yICVkIGZyb20gRmFjdG9yeUhhbCBxdWVyeU51bWJlckVmZmVjdHMiLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51bUVmZmVjdHM7IGkrKykgeworICAgICAgICAgICAgc3RhdHVzID0gbUVmZmVjdHNGYWN0b3J5SGFsLT5nZXREZXNjcmlwdG9yKGksICZkZXNjKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPCAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImdldEVmZmVjdERlc2NyaXB0b3IoKSBlcnJvciAlZCBmcm9tIEZhY3RvcnlIYWwgZ2V0RGVzY3JpcHRvciIsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWVtY21wKCZkZXNjLnR5cGUsIHBUeXBlVXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgbWF0Y2hpbmcgdHlwZSBmb3VuZCBzYXZlIGVmZmVjdCBkZXNjcmlwdG9yLgorICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAqZGVzY3JpcHRvciA9IGRlc2M7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSdzIG5vIHByZWZlcnJlZCBmbGFnIG9yIHRoaXMgZGVzY3JpcHRvciBtYXRjaGVzIHRoZSBwcmVmZXJyZWQKKyAgICAgICAgICAgICAgICAvLyBmbGFnLCBzdWNjZXNzISBJZiB0aGlzIGRlc2NyaXB0b3IgZG9lc24ndCBtYXRjaCB0aGUgcHJlZmVycmVkCisgICAgICAgICAgICAgICAgLy8gZmxhZywgY29udGludWUgZW51bWVyYXRpb24gaW4gY2FzZSBhIGJldHRlciBtYXRjaGluZyB2ZXJzaW9uIG9mIHRoaXMKKyAgICAgICAgICAgICAgICAvLyBlZmZlY3QgdHlwZSBpcyBhdmFpbGFibGUuIE5vdGUgdGhhdCB0aGlzIG1lYW5zIGlmIG5vIGVmZmVjdCB3aXRoIGEKKyAgICAgICAgICAgICAgICAvLyBjb3JyZWN0IGZsYWcgaXMgZm91bmQsIHRoZSBkZXNjcmlwdG9yIHJldHVybmVkIHdpbGwgY29ycmVzcG9uZCB0byB0aGUKKyAgICAgICAgICAgICAgICAvLyBsYXN0IGVmZmVjdCB0aGF0IGF0IGxlYXN0IGhhZCBhIG1hdGNoaW5nIHR5cGUgdXVpZCAoaWYgYW55KS4KKyAgICAgICAgICAgICAgICBpZiAocHJlZmVycmVkVHlwZUZsYWcgPT0gRUZGRUNUX0ZMQUdfVFlQRV9NQVNLIHx8CisgICAgICAgICAgICAgICAgICAgIChkZXNjLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBwcmVmZXJyZWRUeXBlRmxhZykgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBOQU1FX05PVF9GT1VORDsKKyAgICAgICAgICAgIEFMT0dXKCJnZXRFZmZlY3REZXNjcmlwdG9yKCk6IEVmZmVjdCBub3QgZm91bmQgYnkgdHlwZS4iKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoImdldEVmZmVjdERlc2NyaXB0b3IoKTogRWl0aGVyIHV1aWQgb3IgdHlwZSB1dWlkIG11c3QgYmUgbm9uLW51bGwgVVVJRHMuIik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CiAKIHNwPElFZmZlY3Q+IEF1ZGlvRmxpbmdlcjo6Y3JlYXRlRWZmZWN0KAogICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzYywKQEAgLTI5NjYsNyArMzA0NSw3IEBACiAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjOwogCiAgICAgY29uc3QgdWlkX3QgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLSAgICBpZiAocGlkID09IC0xIHx8ICFpc1RydXN0ZWRDYWxsaW5nVWlkKGNhbGxpbmdVaWQpKSB7CisgICAgaWYgKHBpZCA9PSAtMSB8fCAhaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoY2FsbGluZ1VpZCkpIHsKICAgICAgICAgY29uc3QgcGlkX3QgY2FsbGluZ1BpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICAgICAgQUxPR1dfSUYocGlkICE9IC0xICYmIHBpZCAhPSBjYWxsaW5nUGlkLAogICAgICAgICAgICAgICAgICAiJXMgdWlkICVkIHBpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgcGlkICVkIiwKQEAgLTI5ODksOCArMzA2OCw4IEBACiAgICAgfQogCiAgICAgLy8gU2Vzc2lvbiBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSBpcyByZXNlcnZlZCBmb3Igb3V0cHV0IHN0YWdlIGVmZmVjdHMKLSAgICAvLyB0aGF0IGNhbiBvbmx5IGJlIGNyZWF0ZWQgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIgKHJ1bm5pbmcgaW4gc2FtZSBwcm9jZXNzKQotICAgIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UgJiYgZ2V0cGlkX2NhY2hlZCAhPSBwaWQpIHsKKyAgICAvLyB0aGF0IGNhbiBvbmx5IGJlIGNyZWF0ZWQgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIKKyAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFICYmICFpc0F1ZGlvU2VydmVyVWlkKGNhbGxpbmdVaWQpKSB7CiAgICAgICAgIGxTdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KQEAgLTMwMDEsNjAgKzMwODAsMTUgQEAKICAgICB9CiAKICAgICB7Ci0gICAgICAgIGlmICghRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U6OmlzTnVsbFV1aWQoJnBEZXNjLT51dWlkKSkgewotICAgICAgICAgICAgLy8gaWYgdXVpZCBpcyBzcGVjaWZpZWQsIHJlcXVlc3QgZWZmZWN0IGRlc2NyaXB0b3IKLSAgICAgICAgICAgIGxTdGF0dXMgPSBtRWZmZWN0c0ZhY3RvcnlIYWwtPmdldERlc2NyaXB0b3IoJnBEZXNjLT51dWlkLCAmZGVzYyk7Ci0gICAgICAgICAgICBpZiAobFN0YXR1cyA8IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlRWZmZWN0KCkgZXJyb3IgJWQgZnJvbSBFZmZlY3RHZXREZXNjcmlwdG9yIiwgbFN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gaWYgdXVpZCBpcyBub3Qgc3BlY2lmaWVkLCBsb29rIGZvciBhbiBhdmFpbGFibGUgaW1wbGVtZW50YXRpb24KLSAgICAgICAgICAgIC8vIG9mIHRoZSByZXF1aXJlZCB0eXBlIGluIGVmZmVjdCBmYWN0b3J5Ci0gICAgICAgICAgICBpZiAoRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U6OmlzTnVsbFV1aWQoJnBEZXNjLT50eXBlKSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVFZmZlY3QoKSBubyBlZmZlY3QgdHlwZSIpOwotICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdWludDMyX3QgbnVtRWZmZWN0cyA9IDA7Ci0gICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGQ7Ci0gICAgICAgICAgICBkLmZsYWdzID0gMDsgLy8gcHJldmVudCBjb21waWxlciB3YXJuaW5nCi0gICAgICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIGxTdGF0dXMgPSBtRWZmZWN0c0ZhY3RvcnlIYWwtPnF1ZXJ5TnVtYmVyRWZmZWN0cygmbnVtRWZmZWN0cyk7Ci0gICAgICAgICAgICBpZiAobFN0YXR1cyA8IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlRWZmZWN0KCkgZXJyb3IgJWQgZnJvbSBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMiLCBsU3RhdHVzKTsKLSAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtRWZmZWN0czsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbFN0YXR1cyA9IG1FZmZlY3RzRmFjdG9yeUhhbC0+Z2V0RGVzY3JpcHRvcihpLCAmZGVzYyk7Ci0gICAgICAgICAgICAgICAgaWYgKGxTdGF0dXMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVFZmZlY3QoKSBlcnJvciAlZCBmcm9tIEVmZmVjdFF1ZXJ5RWZmZWN0IiwgbFN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobWVtY21wKCZkZXNjLnR5cGUsICZwRGVzYy0+dHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIG1hdGNoaW5nIHR5cGUgZm91bmQgc2F2ZSBlZmZlY3QgZGVzY3JpcHRvci4gSWYgdGhlIHNlc3Npb24gaXMKLSAgICAgICAgICAgICAgICAgICAgLy8gMCBhbmQgdGhlIGVmZmVjdCBpcyBub3QgYXV4aWxpYXJ5LCBjb250aW51ZSBlbnVtZXJhdGlvbiBpbiBjYXNlCi0gICAgICAgICAgICAgICAgICAgIC8vIGFuIGF1eGlsaWFyeSB2ZXJzaW9uIG9mIHRoaXMgZWZmZWN0IHR5cGUgaXMgYXZhaWxhYmxlCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgZCA9IGRlc2M7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2MuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZm91bmQpIHsKLSAgICAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVFZmZlY3QoKSBlZmZlY3Qgbm90IGZvdW5kIik7Ci0gICAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gRm9yIHNhbWUgZWZmZWN0IHR5cGUsIGNob3NlIGF1eGlsaWFyeSB2ZXJzaW9uIG92ZXIgaW5zZXJ0IHZlcnNpb24gaWYKLSAgICAgICAgICAgIC8vIGNvbm5lY3QgdG8gb3V0cHV0IG1peCAoQ29tcGxpYW5jZSB0byBPcGVuU0wgRVMpCi0gICAgICAgICAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCAmJgotICAgICAgICAgICAgICAgICAgICAoZC5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgIT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKLSAgICAgICAgICAgICAgICBkZXNjID0gZDsKLSAgICAgICAgICAgIH0KKyAgICAgICAgLy8gR2V0IHRoZSBmdWxsIGVmZmVjdCBkZXNjcmlwdG9yIGZyb20gdGhlIHV1aWQvdHlwZS4KKyAgICAgICAgLy8gSWYgdGhlIHNlc3Npb24gaXMgdGhlIG91dHB1dCBtaXgsIHByZWZlciBhbiBhdXhpbGlhcnkgZWZmZWN0LAorICAgICAgICAvLyBvdGhlcndpc2Ugbm8gcHJlZmVyZW5jZS4KKyAgICAgICAgdWludDMyX3QgcHJlZmVycmVkVHlwZSA9IChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSA6IEVGRkVDVF9GTEFHX1RZUEVfTUFTSyk7CisgICAgICAgIGxTdGF0dXMgPSBnZXRFZmZlY3REZXNjcmlwdG9yKCZwRGVzYy0+dXVpZCwgJnBEZXNjLT50eXBlLCBwcmVmZXJyZWRUeXBlLCAmZGVzYyk7CisgICAgICAgIGlmIChsU3RhdHVzIDwgMCkgeworICAgICAgICAgICAgQUxPR1coImNyZWF0ZUVmZmVjdCgpIGVycm9yICVkIGZyb20gZ2V0RWZmZWN0RGVzY3JpcHRvciIsIGxTdGF0dXMpOworICAgICAgICAgICAgZ290byBFeGl0OwogICAgICAgICB9CiAKICAgICAgICAgLy8gRG8gbm90IGFsbG93IGF1eGlsaWFyeSBlZmZlY3RzIG9uIGEgc2Vzc2lvbiBkaWZmZXJlbnQgZnJvbSAwIChvdXRwdXQgbWl4KQpAQCAtMzM3MCwxMzYgKzM0MDQsNiBAQAogfQogCiAKLXN0cnVjdCBFbnRyeSB7Ci0jZGVmaW5lIFRFRV9NQVhfRklMRU5BTUUgMzIgLy8gJVklbSVkJUglTSVTXyVkLndhdiA9IDQrMisyKzIrMisyKzErMSs0KzEgPSAyMQotICAgIGNoYXIgbUZpbGVOYW1lW1RFRV9NQVhfRklMRU5BTUVdOwotfTsKLQotaW50IGNvbXBhckVudHJ5KGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKLXsKLSAgICByZXR1cm4gc3RyY21wKCgoY29uc3QgRW50cnkgKikgcDEpLT5tRmlsZU5hbWUsICgoY29uc3QgRW50cnkgKikgcDIpLT5tRmlsZU5hbWUpOwotfQotCi0jaWZkZWYgVEVFX1NJTksKLXZvaWQgQXVkaW9GbGluZ2VyOjpkdW1wVGVlKGludCBmZCwgY29uc3Qgc3A8TkJBSU9fU291cmNlPiYgc291cmNlLCBhdWRpb19pb19oYW5kbGVfdCBpZCwgY2hhciBzdWZmaXgpCi17Ci0gICAgTkJBSU9fU291cmNlICp0ZWVTb3VyY2UgPSBzb3VyY2UuZ2V0KCk7Ci0gICAgaWYgKHRlZVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIC53YXYgcm90YXRpb24KLSAgICAgICAgLy8gVGhlcmUgaXMgYSBiZW5pZ24gcmFjZSBjb25kaXRpb24gaWYgMiB0aHJlYWRzIGNhbGwgdGhpcyBzaW11bHRhbmVvdXNseS4KLSAgICAgICAgLy8gVGhleSB3b3VsZCBib3RoIHRyYXZlcnNlIHRoZSBkaXJlY3RvcnksIGJ1dCB0aGUgcmVzdWx0IHdvdWxkIHNpbXBseSBiZQotICAgICAgICAvLyBmYWlsdXJlcyBhdCB1bmxpbmsoKSB3aGljaCBhcmUgaWdub3JlZC4gIEl0J3MgYWxzbyB1bmxpa2VseSBzaW5jZQotICAgICAgICAvLyBub3JtYWxseSBkdW1wc3lzIGlzIG9ubHkgZG9uZSBieSBidWdyZXBvcnQgb3IgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgotICAgICAgICBjaGFyIHRlZVBhdGhbUEFUSF9NQVhdID0gIi9kYXRhL21pc2MvYXVkaW9zZXJ2ZXIiOwotICAgICAgICBzaXplX3QgdGVlUGF0aExlbiA9IHN0cmxlbih0ZWVQYXRoKTsKLSAgICAgICAgRElSICpkaXIgPSBvcGVuZGlyKHRlZVBhdGgpOwotICAgICAgICB0ZWVQYXRoW3RlZVBhdGhMZW4rK10gPSAnLyc7Ci0gICAgICAgIGlmIChkaXIgIT0gTlVMTCkgewotI2RlZmluZSBURUVfTUFYX1NPUlQgMjAgLy8gbnVtYmVyIG9mIGVudHJpZXMgdG8gc29ydAotI2RlZmluZSBURUVfTUFYX0tFRVAgMTAgLy8gbnVtYmVyIG9mIGVudHJpZXMgdG8ga2VlcAotICAgICAgICAgICAgc3RydWN0IEVudHJ5IGVudHJpZXNbVEVFX01BWF9TT1JUXTsKLSAgICAgICAgICAgIHNpemVfdCBlbnRyeUNvdW50ID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChlbnRyeUNvdW50IDwgVEVFX01BWF9TT1JUKSB7Ci0gICAgICAgICAgICAgICAgZXJybm8gPSAwOyAvLyBjbGVhciBlcnJubyBiZWZvcmUgcmVhZGRpcigpIHRvIHRyYWNrIHBvdGVudGlhbCBlcnJvcnMuCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGRpcmVudCAqcmVzdWx0ID0gcmVhZGRpcihkaXIpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICAgICBBTE9HV19JRihlcnJubyAhPSAwLCAidGVlIHJlYWRkaXIoKSBmYWlsdXJlICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBub24gLndhdiBmaWxlIGVudHJpZXMKLSAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgbmFtZUxlbiA9IHN0cmxlbihyZXN1bHQtPmRfbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVMZW4gPD0gNCB8fCBuYW1lTGVuID49IFRFRV9NQVhfRklMRU5BTUUgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNtcCgmcmVzdWx0LT5kX25hbWVbbmFtZUxlbiAtIDRdLCAiLndhdiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAodm9pZClhdWRpb191dGlsc19zdHJsY3B5KGVudHJpZXNbZW50cnlDb3VudCsrXS5tRmlsZU5hbWUsIHJlc3VsdC0+ZF9uYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICh2b2lkKSBjbG9zZWRpcihkaXIpOwotICAgICAgICAgICAgaWYgKGVudHJ5Q291bnQgPiBURUVfTUFYX0tFRVApIHsKLSAgICAgICAgICAgICAgICBxc29ydChlbnRyaWVzLCBlbnRyeUNvdW50LCBzaXplb2YoRW50cnkpLCBjb21wYXJFbnRyeSk7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeUNvdW50IC0gVEVFX01BWF9LRUVQOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyY3B5KCZ0ZWVQYXRoW3RlZVBhdGhMZW5dLCBlbnRyaWVzW2ldLm1GaWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICh2b2lkKSB1bmxpbmsodGVlUGF0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGZkID49IDApIHsKLSAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAidW5hYmxlIHRvIHJvdGF0ZSB0ZWVzIGluICUuKnM6ICVzXG4iLCAoaW50KSB0ZWVQYXRoTGVuLCB0ZWVQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjaGFyIHRlZVRpbWVbMTZdOwotICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0djsKLSAgICAgICAgZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7Ci0gICAgICAgIHN0cnVjdCB0bSB0bTsKLSAgICAgICAgbG9jYWx0aW1lX3IoJnR2LnR2X3NlYywgJnRtKTsKLSAgICAgICAgc3RyZnRpbWUodGVlVGltZSwgc2l6ZW9mKHRlZVRpbWUpLCAiJVklbSVkJUglTSVTIiwgJnRtKTsKLSAgICAgICAgc25wcmludGYoJnRlZVBhdGhbdGVlUGF0aExlbl0sIHNpemVvZih0ZWVQYXRoKSAtIHRlZVBhdGhMZW4sICIlc18lZF8lYy53YXYiLCB0ZWVUaW1lLCBpZCwKLSAgICAgICAgICAgICAgICBzdWZmaXgpOwotICAgICAgICAvLyBpZiAyIGR1bXBzeXMgYXJlIGRvbmUgd2l0aGluIDEgc2Vjb25kLCBhbmQgcm90YXRpb24gZGlkbid0IHdvcmssIHRoZW4gZGlzY2FyZCAybmQKLSAgICAgICAgaW50IHRlZUZkID0gb3Blbih0ZWVQYXRoLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX0VYQ0wgfCBPX05PRk9MTE9XLCBTX0lSVVNSIHwgU19JV1VTUik7Ci0gICAgICAgIGlmICh0ZWVGZCA+PSAwKSB7Ci0gICAgICAgICAgICAvLyBGSVhNRSB1c2UgbGlic25kZmlsZQotICAgICAgICAgICAgY2hhciB3YXZIZWFkZXJbNDRdOwotICAgICAgICAgICAgbWVtY3B5KHdhdkhlYWRlciwKLSAgICAgICAgICAgICAgICAiUklGRlwwXDBcMFwwV0FWRWZtdCBcMjBcMFwwXDBcMVwwXDJcMFwxMDRcMjU0XDBcMFwwXDBcMFwwXDRcMFwyMFwwZGF0YVwwXDBcMFwwIiwKLSAgICAgICAgICAgICAgICBzaXplb2Yod2F2SGVhZGVyKSk7Ci0gICAgICAgICAgICBOQkFJT19Gb3JtYXQgZm9ybWF0ID0gdGVlU291cmNlLT5mb3JtYXQoKTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxDb3VudCA9IEZvcm1hdF9jaGFubmVsQ291bnQoZm9ybWF0KTsKLSAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBGb3JtYXRfc2FtcGxlUmF0ZShmb3JtYXQpOwotICAgICAgICAgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IEZvcm1hdF9mcmFtZVNpemUoZm9ybWF0KTsKLSAgICAgICAgICAgIHdhdkhlYWRlclsyMl0gPSBjaGFubmVsQ291bnQ7ICAgICAgIC8vIG51bWJlciBvZiBjaGFubmVscwotICAgICAgICAgICAgd2F2SGVhZGVyWzI0XSA9IHNhbXBsZVJhdGU7ICAgICAgICAgLy8gc2FtcGxlIHJhdGUKLSAgICAgICAgICAgIHdhdkhlYWRlclsyNV0gPSBzYW1wbGVSYXRlID4+IDg7Ci0gICAgICAgICAgICB3YXZIZWFkZXJbMzJdID0gZnJhbWVTaXplOyAgICAgICAgICAvLyBibG9jayBhbGlnbm1lbnQKLSAgICAgICAgICAgIHdhdkhlYWRlclszM10gPSBmcmFtZVNpemUgPj4gODsKLSAgICAgICAgICAgIHdyaXRlKHRlZUZkLCB3YXZIZWFkZXIsIHNpemVvZih3YXZIZWFkZXIpKTsKLSAgICAgICAgICAgIHNpemVfdCB0b3RhbCA9IDA7Ci0gICAgICAgICAgICBib29sIGZpcnN0UmVhZCA9IHRydWU7Ci0jZGVmaW5lIFRFRV9TSU5LX1JFQUQgMTAyNCAgICAgICAgICAgICAgICAgICAgICAvLyBmcmFtZXMgcGVyIEkvTyBvcGVyYXRpb24KLSAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciA9IG1hbGxvYyhURUVfU0lOS19SRUFEICogZnJhbWVTaXplKTsKLSAgICAgICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgICAgICBzaXplX3QgY291bnQgPSBURUVfU0lOS19SRUFEOwotICAgICAgICAgICAgICAgIHNzaXplX3QgYWN0dWFsID0gdGVlU291cmNlLT5yZWFkKGJ1ZmZlciwgY291bnQpOwotICAgICAgICAgICAgICAgIGJvb2wgd2FzRmlyc3RSZWFkID0gZmlyc3RSZWFkOwotICAgICAgICAgICAgICAgIGZpcnN0UmVhZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGlmIChhY3R1YWwgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYWN0dWFsID09IChzc2l6ZV90KSBPVkVSUlVOICYmIHdhc0ZpcnN0UmVhZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGFjdHVhbCA8PSAoc3NpemVfdCljb3VudCk7Ci0gICAgICAgICAgICAgICAgd3JpdGUodGVlRmQsIGJ1ZmZlciwgYWN0dWFsICogZnJhbWVTaXplKTsKLSAgICAgICAgICAgICAgICB0b3RhbCArPSBhY3R1YWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmVlKGJ1ZmZlcik7Ci0gICAgICAgICAgICBsc2Vlayh0ZWVGZCwgKG9mZl90KSA0LCBTRUVLX1NFVCk7Ci0gICAgICAgICAgICB1aW50MzJfdCB0ZW1wID0gNDQgKyB0b3RhbCAqIGZyYW1lU2l6ZSAtIDg7Ci0gICAgICAgICAgICAvLyBGSVhNRSBub3QgYmlnLWVuZGlhbiBzYWZlCi0gICAgICAgICAgICB3cml0ZSh0ZWVGZCwgJnRlbXAsIHNpemVvZih0ZW1wKSk7Ci0gICAgICAgICAgICBsc2Vlayh0ZWVGZCwgKG9mZl90KSA0MCwgU0VFS19TRVQpOwotICAgICAgICAgICAgdGVtcCA9ICB0b3RhbCAqIGZyYW1lU2l6ZTsKLSAgICAgICAgICAgIC8vIEZJWE1FIG5vdCBiaWctZW5kaWFuIHNhZmUKLSAgICAgICAgICAgIHdyaXRlKHRlZUZkLCAmdGVtcCwgc2l6ZW9mKHRlbXApKTsKLSAgICAgICAgICAgIGNsb3NlKHRlZUZkKTsKLSAgICAgICAgICAgIC8vIFRPRE8gU2hvdWxkIGNyZWF0ZSBmaWxlIHdpdGggdGVtcG9yYXJ5IG5hbWUgYW5kIHRoZW4gcmVuYW1lIHRvIGZpbmFsIGlmIG5vbi1lbXB0eS4KLSAgICAgICAgICAgIGlmICh0b3RhbCA+IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoZmQgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAidGVlIGNvcGllZCB0byAlc1xuIiwgdGVlUGF0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1bmxpbmsodGVlUGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZmQgPj0gMCkgewotICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICJ1bmFibGUgdG8gY3JlYXRlIHRlZSAlczogJXNcbiIsIHRlZVBhdGgsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0jZW5kaWYKLQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Om9uVHJhbnNhY3QoCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKaW5kZXggOTYzYTg3ZC4uNmM2OThmNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaApAQCAtMjMsNiArMjMsOCBAQAogI2luY2x1ZGUgPG11dGV4PgogI2luY2x1ZGUgPGRlcXVlPgogI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KQEAgLTYyLDcgKzY0LDEwIEBACiAjaW5jbHVkZSA8bWVkaWEvTGluZWFyTWFwLmg+CiAjaW5jbHVkZSA8bWVkaWEvVm9sdW1lU2hhcGVyLmg+CiAKKyNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL0ZkVG9TdHJpbmcuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9TaW1wbGVMb2cuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9UaW1lc3RhbXBWZXJpZmllci5oPgogCiAjaW5jbHVkZSAiRmFzdENhcHR1cmUuaCIKICNpbmNsdWRlICJGYXN0TWl4ZXIuaCIKQEAgLTcxLDYgKzc2LDcgQEAKICNpbmNsdWRlICJBdWRpb1N0cmVhbU91dC5oIgogI2luY2x1ZGUgIlNwZGlmU3RyZWFtT3V0LmgiCiAjaW5jbHVkZSAiQXVkaW9Id0RldmljZS5oIgorI2luY2x1ZGUgIk5CQUlPX1RlZS5oIgogCiAjaW5jbHVkZSA8cG93ZXJtYW5hZ2VyL0lQb3dlck1hbmFnZXIuaD4KIApAQCAtMjAyLDYgKzIwOCw4IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeUVmZmVjdCh1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcikgY29uc3Q7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVmZmVjdERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqcFV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBUeXBlVXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlZmVycmVkVHlwZUZsYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpIGNvbnN0OwogCiAgICAgdmlydHVhbCBzcDxJRWZmZWN0PiBjcmVhdGVFZmZlY3QoCkBAIC0zNTcsMTYgKzM2NSwxNyBAQAogICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc1ZhbGlkUGNtU2lua0NoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSB7CiAgICAgICAgIHN3aXRjaCAoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9yZXByZXNlbnRhdGlvbihjaGFubmVsTWFzaykpIHsKICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX1BPU0lUSU9OOiB7Ci0gICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBGQ0NfMjsgLy8gc3RlcmVvIGlzIGRlZmF1bHQKLSAgICAgICAgICAgIGlmIChrRW5hYmxlRXh0ZW5kZWRDaGFubmVscykgewotICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayk7Ci0gICAgICAgICAgICAgICAgaWYgKGNoYW5uZWxDb3VudCA8IEZDQ18yIC8vIG1vbm8gaXMgbm90IHN1cHBvcnRlZCBhdCB0aGlzIHRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNoYW5uZWxDb3VudCA+IEF1ZGlvTWl4ZXI6Ok1BWF9OVU1fQ0hBTk5FTFMpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEhhcHRpYyBjaGFubmVsIG1hc2sgaXMgb25seSBhcHBsaWNhYmxlIGZvciBjaGFubmVsIHBvc2l0aW9uIG1hc2suCisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soCisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrICYgfkFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCk7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBtYXhDaGFubmVsQ291bnQgPSBrRW5hYmxlRXh0ZW5kZWRDaGFubmVscworICAgICAgICAgICAgICAgICAgICA/IEF1ZGlvTWl4ZXI6Ok1BWF9OVU1fQ0hBTk5FTFMgOiBGQ0NfMjsKKyAgICAgICAgICAgIGlmIChjaGFubmVsQ291bnQgPCBGQ0NfMiAvLyBtb25vIGlzIG5vdCBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lCisgICAgICAgICAgICAgICAgICAgIHx8IGNoYW5uZWxDb3VudCA+IG1heENoYW5uZWxDb3VudCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgY2hhbm5lbE1hc2sgaXMgdGhlICJjYW5vbmljYWwiIG9uZSB3ZSBleHBlY3QgZm9yIHRoZSBjaGFubmVsQ291bnQuCi0gICAgICAgICAgICByZXR1cm4gY2hhbm5lbE1hc2sgPT0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KGNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICByZXR1cm4gYXVkaW9fY2hhbm5lbF9wb3NpdGlvbl9tYXNrX2lzX291dF9jYW5vbmljYWwoY2hhbm5lbE1hc2spOwogICAgICAgICAgICAgfQogICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fSU5ERVg6CiAgICAgICAgICAgICBpZiAoa0VuYWJsZUV4dGVuZGVkQ2hhbm5lbHMpIHsKQEAgLTQxNiw2ICs0MjUsMTEgQEAKICAgICB2b2lkIGR1bXBDbGllbnRzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAgICAgdm9pZCBkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKKyAgICBTaW1wbGVMb2cgbVRocmVhZExvZ3sxNn07IC8vIDE2IFRocmVhZCBoaXN0b3J5IGxpbWl0CisKKyAgICBjbGFzcyBUaHJlYWRCYXNlOworICAgIHZvaWQgZHVtcFRvVGhyZWFkTG9nX2woY29uc3Qgc3A8VGhyZWFkQmFzZT4gJnRocmVhZCk7CisKICAgICAvLyAtLS0gQ2xpZW50IC0tLQogICAgIGNsYXNzIENsaWVudCA6IHB1YmxpYyBSZWZCYXNlIHsKICAgICBwdWJsaWM6CkBAIC01NDAsNiArNTU0LDcgQEAKICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICBwYXVzZSgpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCk7CiAgICAgICAgIHZpcnR1YWwgbWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAogICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLAogICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbikgb3ZlcnJpZGU7CkBAIC02NzUsNiArNjkwLDkgQEAKICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgdXBkYXRlT3JwaGFuRWZmZWN0Q2hhaW5zKGNvbnN0IHNwPEVmZmVjdE1vZHVsZT4mIGVmZmVjdCk7CiAKICAgICAgICAgICAgICAgICB2b2lkIGJyb2FjYXN0UGFyYW1ldGVyc1RvUmVjb3JkVGhyZWFkc19sKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOworICAgICAgICAgICAgICAgIHZvaWQgZm9yd2FyZFBhcmFtZXRlcnNUb0Rvd25zdHJlYW1QYXRjaGVzX2woCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCB1cFN0cmVhbSwgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBzcDxQbGF5YmFja1RocmVhZD4mKT4gdXNlVGhyZWFkID0gbnVsbHB0cik7CiAKICAgICAvLyBBdWRpb1N0cmVhbUluIGlzIGltbXV0YWJsZSwgc28gdGhlaXIgZmllbGRzIGFyZSBjb25zdC4KICAgICAvLyBGb3IgZW1waGFzaXMsIHdlIGNvdWxkIGFsc28gbWFrZSBhbGwgcG9pbnRlcnMgdG8gdGhlbSBiZSAiY29uc3QgKiIsCkBAIC03OTEsNDQgKzgwOSwxOSBAQAogCiAgICAgLy8gZm9yIHVzZSBmcm9tIGRlc3RydWN0b3IKICAgICBzdGF0dXNfdCAgICBjbG9zZU91dHB1dF9ub252aXJ0dWFsKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7Ci0gICAgdm9pZCAgICAgICAgY2xvc2VPdXRwdXRJbnRlcm5hbF9sKGNvbnN0IHNwPFBsYXliYWNrVGhyZWFkPiYgdGhyZWFkKTsKKyAgICB2b2lkICAgICAgICBjbG9zZVRocmVhZEludGVybmFsX2woY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+JiB0aHJlYWQpOwogICAgIHN0YXR1c190ICAgIGNsb3NlSW5wdXRfbm9udmlydHVhbChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7Ci0gICAgdm9pZCAgICAgICAgY2xvc2VJbnB1dEludGVybmFsX2woY29uc3Qgc3A8UmVjb3JkVGhyZWFkPiYgdGhyZWFkKTsKKyAgICB2b2lkICAgICAgICBjbG9zZVRocmVhZEludGVybmFsX2woY29uc3Qgc3A8UmVjb3JkVGhyZWFkPiYgdGhyZWFkKTsKICAgICB2b2lkICAgICAgICBzZXRBdWRpb0h3U3luY0ZvclNlc3Npb25fbChQbGF5YmFja1RocmVhZCAqdGhyZWFkLCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKTsKIAogICAgIHN0YXR1c190ICAgIGNoZWNrU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3Q7CiAKICAgICB2b2lkICAgICAgICBmaWx0ZXJSZXNlcnZlZFBhcmFtZXRlcnMoU3RyaW5nOCYga2V5VmFsdWVQYWlycywgdWlkX3QgY2FsbGluZ1VpZCk7Ci0KLSNpZmRlZiBURUVfU0lOSwotICAgIC8vIGFsbCByZWNvcmQgdGhyZWFkcyBzZXJpYWxseSBzaGFyZSBhIGNvbW1vbiB0ZWUgc2luaywgd2hpY2ggaXMgcmUtY3JlYXRlZCBvbiBmb3JtYXQgY2hhbmdlCi0gICAgc3A8TkJBSU9fU2luaz4gICBtUmVjb3JkVGVlU2luazsKLSAgICBzcDxOQkFJT19Tb3VyY2U+IG1SZWNvcmRUZWVTb3VyY2U7Ci0jZW5kaWYKKyAgICB2b2lkICAgICAgICBsb2dGaWx0ZXJlZFBhcmFtZXRlcnMoc2l6ZV90IG9yaWdpbmFsS1ZQU2l6ZSwgY29uc3QgU3RyaW5nOCYgb3JpZ2luYWxLVlBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmVqZWN0ZWRLVlBTaXplLCBjb25zdCBTdHJpbmc4JiByZWplY3RlZEtWUHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IGNhbGxpbmdVaWQpOwogCiBwdWJsaWM6Ci0KLSNpZmRlZiBURUVfU0lOSwotICAgIC8vIHRlZSBzaW5rLCBpZiBlbmFibGVkIGJ5IHByb3BlcnR5LCBhbGxvd3MgZHVtcHN5cyB0byB3cml0ZSBtb3N0IHJlY2VudCBhdWRpbyB0byAud2F2IGZpbGUKLSAgICBzdGF0aWMgdm9pZCBkdW1wVGVlKGludCBmZCwgY29uc3Qgc3A8TkJBSU9fU291cmNlPiYgc291cmNlLCBhdWRpb19pb19oYW5kbGVfdCBpZCwgY2hhciBzdWZmaXgpOwotCi0gICAgLy8gd2hldGhlciB0ZWUgc2luayBpcyBlbmFibGVkIGJ5IHByb3BlcnR5Ci0gICAgc3RhdGljIGJvb2wgbVRlZVNpbmtJbnB1dEVuYWJsZWQ7Ci0gICAgc3RhdGljIGJvb2wgbVRlZVNpbmtPdXRwdXRFbmFibGVkOwotICAgIHN0YXRpYyBib29sIG1UZWVTaW5rVHJhY2tFbmFibGVkOwotCi0gICAgLy8gcnVudGltZSBjb25maWd1cmVkIHNpemUgb2YgZWFjaCB0ZWUgc2luayBwaXBlLCBpbiBmcmFtZXMKLSAgICBzdGF0aWMgc2l6ZV90IG1UZWVTaW5rSW5wdXRGcmFtZXM7Ci0gICAgc3RhdGljIHNpemVfdCBtVGVlU2lua091dHB1dEZyYW1lczsKLSAgICBzdGF0aWMgc2l6ZV90IG1UZWVTaW5rVHJhY2tGcmFtZXM7Ci0KLSAgICAvLyBjb21waWxlLXRpbWUgZGVmYXVsdCBzaXplIG9mIHRlZSBzaW5rIHBpcGVzLCBpbiBmcmFtZXMKLSAgICAvLyAweDIwMDAwMCBzdGVyZW8gMTYtYml0IFBDTSBmcmFtZXMgPSA0Ny41IHNlY29uZHMgYXQgNDQuMSBrSHosIDggbWVnYWJ5dGVzCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrVGVlU2lua0lucHV0RnJhbWVzRGVmYXVsdCA9IDB4MjAwMDAwOwotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1RlZVNpbmtPdXRwdXRGcmFtZXNEZWZhdWx0ID0gMHgyMDAwMDA7Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrVGVlU2lua1RyYWNrRnJhbWVzRGVmYXVsdCA9IDB4MjAwMDAwOwotI2VuZGlmCi0KICAgICAvLyBUaGVzZSBtZXRob2RzIHJlYWQgdmFyaWFibGVzIGF0b21pY2FsbHkgd2l0aG91dCBtTG9jaywKICAgICAvLyB0aG91Z2ggdGhlIHZhcmlhYmxlcyBhcmUgdXBkYXRlZCB3aXRoIG1Mb2NrLgogICAgIGJvb2wgICAgaXNMb3dSYW1EZXZpY2UoKSBjb25zdCB7IHJldHVybiBtSXNMb3dSYW1EZXZpY2U7IH0KQEAgLTg0MywxMCArODM2LDE1IEBACiAKICAgICBuc2Vjc190IG1HbG9iYWxFZmZlY3RFbmFibGVUaW1lOyAgLy8gd2hlbiBhIGdsb2JhbCBlZmZlY3Qgd2FzIGxhc3QgZW5hYmxlZAogCi0gICAgc3A8UGF0Y2hQYW5lbD4gbVBhdGNoUGFuZWw7CisgICAgLy8gcHJvdGVjdGVkIGJ5IG1Mb2NrCisgICAgUGF0Y2hQYW5lbCBtUGF0Y2hQYW5lbDsKICAgICBzcDxFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZT4gbUVmZmVjdHNGYWN0b3J5SGFsOwogCi0gICAgYm9vbCAgICAgICAgbVN5c3RlbVJlYWR5OworICAgIGJvb2wgICAgICAgbVN5c3RlbVJlYWR5OworCisgICAgU2ltcGxlTG9nICBtUmVqZWN0ZWRTZXRQYXJhbWV0ZXJMb2c7CisgICAgU2ltcGxlTG9nICBtQXBwU2V0UGFyYW1ldGVyTG9nOworICAgIFNpbXBsZUxvZyAgbVN5c3RlbVNldFBhcmFtZXRlckxvZzsKIH07CiAKICN1bmRlZiBJTkNMVURJTkdfRlJPTV9BVURJT0ZMSU5HRVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSHdEZXZpY2UuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmgKaW5kZXggZWI4MjZjNi4uZDQyOTliMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSHdEZXZpY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5oCkBAIC0zNSw2ICszNSw5IEBACiAgICAgZW51bSBGbGFncyB7CiAgICAgICAgIEFIV0RfQ0FOX1NFVF9NQVNURVJfVk9MVU1FICA9IDB4MSwKICAgICAgICAgQUhXRF9DQU5fU0VUX01BU1RFUl9NVVRFICAgID0gMHgyLAorICAgICAgICAvLyBNZWFucyB0aGF0IHRoaXMgaXNuJ3QgYSB0ZXJtaW5hbCBtb2R1bGUsIGFuZCBzb2Z0d2FyZSBwYXRjaGVzCisgICAgICAgIC8vIGFyZSB1c2VkIHRvIHRyYW5zcG9ydCBhdWRpbyBkYXRhIGZ1cnRoZXIuCisgICAgICAgIEFIV0RfSVNfSU5TRVJUICAgICAgICAgICAgICA9IDB4NCwKICAgICB9OwogCiAgICAgQXVkaW9Id0RldmljZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgaGFuZGxlLApAQCAtNTUsNiArNTgsMTAgQEAKICAgICAgICAgcmV0dXJuICgwICE9IChtRmxhZ3MgJiBBSFdEX0NBTl9TRVRfTUFTVEVSX01VVEUpKTsKICAgICB9CiAKKyAgICBib29sIGlzSW5zZXJ0KCkgY29uc3QgeworICAgICAgICByZXR1cm4gKDAgIT0gKG1GbGFncyAmIEFIV0RfSVNfSU5TRVJUKSk7CisgICAgfQorCiAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1IYW5kbGU7IH0KICAgICBjb25zdCBjaGFyICptb2R1bGVOYW1lKCkgY29uc3QgeyByZXR1cm4gbU1vZHVsZU5hbWU7IH0KICAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGh3RGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbUh3RGV2aWNlOyB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKaW5kZXggYjNmNWVmZC4uNmFiNjM2OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcApAQCAtMzEsOSArMzEsOSBAQAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KIAogI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0zMDksOCArMzA5LDggQEAKICAgICAvLyBpbnB1dCBhbmQgb3V0cHV0IGVmZmVjdCBidWZmZXJzIHdpdGhvdXQgYW4gaW50ZXJtZWRpYXJ5IGVmZmVjdCBwcm9jZXNzLgogICAgIC8vIFRPRE86IGNvbnNpZGVyIGltcGxlbWVudGluZyBjaGFubmVsIGNvbnZlcnNpb24uCiAgICAgY29uc3Qgc2l6ZV90IHNhZmVJbnB1dE91dHB1dFNhbXBsZUNvdW50ID0KLSAgICAgICAgICAgIGluQ2hhbm5lbENvdW50ICE9IG91dENoYW5uZWxDb3VudCA/IDAKLSAgICAgICAgICAgICAgICAgICAgOiBvdXRDaGFubmVsQ291bnQgKiBzdGQ6Om1pbigKKyAgICAgICAgICAgIG1JbkNoYW5uZWxDb3VudFJlcXVlc3RlZCAhPSBtT3V0Q2hhbm5lbENvdW50UmVxdWVzdGVkID8gMAorICAgICAgICAgICAgICAgICAgICA6IG1PdXRDaGFubmVsQ291bnRSZXF1ZXN0ZWQgKiBzdGQ6Om1pbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50KTsKICAgICBjb25zdCBhdXRvIGFjY3VtdWxhdGVJbnB1dFRvT3V0cHV0ID0gW3RoaXMsIHNhZmVJbnB1dE91dHB1dFNhbXBsZUNvdW50XSgpIHsKQEAgLTQ4MCw3ICs0ODAsMTIgQEAKICAgICAgICAgLy8gYWNjdW11bGF0ZSBpbnB1dCBvbnRvIG91dHB1dAogICAgICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBtQ2hhaW4ucHJvbW90ZSgpOwogICAgICAgICBpZiAoY2hhaW4uZ2V0KCkgIT0gbnVsbHB0ciAmJiBjaGFpbi0+YWN0aXZlVHJhY2tDbnQoKSAhPSAwKSB7Ci0gICAgICAgICAgICBhY2N1bXVsYXRlSW5wdXRUb091dHB1dCgpOworICAgICAgICAgICAgLy8gc2ltaWxhciBoYW5kbGluZyB3aXRoIGRhdGFfYnlwYXNzIGFib3ZlLgorICAgICAgICAgICAgaWYgKG1Db25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgeworICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVJbnB1dFRvT3V0cHV0KCk7CisgICAgICAgICAgICB9IGVsc2UgeyAvLyBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURQorICAgICAgICAgICAgICAgIGNvcHlJbnB1dFRvT3V0cHV0KCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0xODU5LDcgKzE4NjQsNyBAQAogICAgIGJvb2wgbG9ja2VkID0gbUNibGsgIT0gTlVMTCAmJiBBdWRpb0ZsaW5nZXI6OmR1bXBUcnlMb2NrKG1DYmxrLT5sb2NrKTsKIAogICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIlx0XHRcdCU1ZCAgICAlNWQgICUzcyAgICAlM3MgICU1dSAgJTV1XG4iLAotICAgICAgICAgICAgKG1DbGllbnQgPT0gMCkgPyBnZXRwaWRfY2FjaGVkIDogbUNsaWVudC0+cGlkKCksCisgICAgICAgICAgICAobUNsaWVudCA9PSAwKSA/IGdldHBpZCgpIDogbUNsaWVudC0+cGlkKCksCiAgICAgICAgICAgICBtUHJpb3JpdHksCiAgICAgICAgICAgICBtSGFzQ29udHJvbCA/ICJ5ZXMiIDogIm5vIiwKICAgICAgICAgICAgIGxvY2tlZCA/ICJ5ZXMiIDogIm5vIiwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmUuY3BwCmluZGV4IGQwNjM3NzIuLmRkODRiZjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlLmNwcApAQCAtMjAsNiArMjAsNyBAQAogI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQVVESU8KIAogI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlIDxhdWRpb191dGlscy9mb3JtYXQuaD4KICNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgogI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgpAQCAtMTYxLDcgKzE2MiwyMSBAQAogICAgIGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKiBjb25zdCBjdXJyZW50ID0gKGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKikgbUN1cnJlbnQ7CiAgICAgRmFzdENhcHR1cmVEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdENhcHR1cmVEdW1wU3RhdGUgKikgbUR1bXBTdGF0ZTsKICAgICBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlOjpDb21tYW5kIGNvbW1hbmQgPSBtQ29tbWFuZDsKLSAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudCA9IGN1cnJlbnQtPm1GcmFtZUNvdW50OworICAgIHNpemVfdCBmcmFtZUNvdW50ID0gY3VycmVudC0+bUZyYW1lQ291bnQ7CisgICAgQXVkaW9CdWZmZXJQcm92aWRlciogZmFzdFBhdGNoUmVjb3JkQnVmZmVyUHJvdmlkZXIgPSBjdXJyZW50LT5tRmFzdFBhdGNoUmVjb3JkQnVmZmVyUHJvdmlkZXI7CisgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyIHBhdGNoQnVmZmVyOworCisgICAgaWYgKGZhc3RQYXRjaFJlY29yZEJ1ZmZlclByb3ZpZGVyICE9IDApIHsKKyAgICAgICAgcGF0Y2hCdWZmZXIuZnJhbWVDb3VudCA9IH4wOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBmYXN0UGF0Y2hSZWNvcmRCdWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmcGF0Y2hCdWZmZXIpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBmcmFtZUNvdW50ID0gMDsKKyAgICAgICAgfSBlbHNlIGlmIChwYXRjaEJ1ZmZlci5mcmFtZUNvdW50IDwgZnJhbWVDb3VudCkgeworICAgICAgICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHRoYXQgaXQgZG9lc24ndCBjYXVzZSBhbnkgaXNzdWVzIGlmIHdlIGp1c3QgZ2V0IGEgc21hbGwgYXZhaWxhYmxlCisgICAgICAgICAgICAvLyBidWZmZXIgZnJvbSB0aGUgYnVmZmVyIHByb3ZpZGVyLgorICAgICAgICAgICAgZnJhbWVDb3VudCA9IHBhdGNoQnVmZmVyLmZyYW1lQ291bnQ7CisgICAgICAgIH0KKyAgICB9CiAKICAgICBpZiAoKGNvbW1hbmQgJiBGYXN0Q2FwdHVyZVN0YXRlOjpSRUFEKSAvKiYmIGlzV2FybSovKSB7CiAgICAgICAgIEFMT0dfQVNTRVJUKG1JbnB1dFNvdXJjZSAhPSBOVUxMKTsKQEAgLTE3Niw2ICsxOTEsNyBAQAogICAgICAgICAgICAgbVRvdGFsTmF0aXZlRnJhbWVzUmVhZCArPSBmcmFtZXNSZWFkOwogICAgICAgICAgICAgZHVtcFN0YXRlLT5tRnJhbWVzUmVhZCA9IG1Ub3RhbE5hdGl2ZUZyYW1lc1JlYWQ7CiAgICAgICAgICAgICBtUmVhZEJ1ZmZlclN0YXRlID0gZnJhbWVzUmVhZDsKKyAgICAgICAgICAgIHBhdGNoQnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZXNSZWFkOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZHVtcFN0YXRlLT5tUmVhZEVycm9ycysrOwogICAgICAgICAgICAgbVJlYWRCdWZmZXJTdGF0ZSA9IDA7CkBAIC0xOTMsMTEgKzIwOSwxOCBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChtUmVhZEJ1ZmZlclN0YXRlID4gMCkgewogICAgICAgICAgICAgc3NpemVfdCBmcmFtZXNXcml0dGVuID0gbVBpcGVTaW5rLT53cml0ZShtUmVhZEJ1ZmZlciwgbVJlYWRCdWZmZXJTdGF0ZSk7Ci0gICAgICAgICAgICAvLyBGSVhNRSBUaGlzIHN1cHBvcnRzIGF0IG1vc3Qgb25lIGZhc3QgY2FwdHVyZSBjbGllbnQuCi0gICAgICAgICAgICAvLyAgICAgICBUbyBoYW5kbGUgbXVsdGlwbGUgY2xpZW50cyB0aGlzIGNvdWxkIGJlIGNvbnZlcnRlZCB0byBhbiBhcnJheSwKLSAgICAgICAgICAgIC8vICAgICAgIG9yIHdpdGggYSBsb3QgbW9yZSB3b3JrIHRoZSBjb250cm9sIGJsb2NrIGNvdWxkIGJlIHNoYXJlZCBieSBhbGwgY2xpZW50cy4KICAgICAgICAgICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IGN1cnJlbnQtPm1DYmxrOwotICAgICAgICAgICAgaWYgKGNibGsgIT0gTlVMTCAmJiBmcmFtZXNXcml0dGVuID4gMCkgeworICAgICAgICAgICAgaWYgKGZhc3RQYXRjaFJlY29yZEJ1ZmZlclByb3ZpZGVyICE9IDApIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGluZGljYXRlcyB0aGUgZmFzdCB0cmFjayBpcyBhIHBhdGNoIHJlY29yZCwgdXBkYXRlIHRoZSBjYmxrIGJ5CisgICAgICAgICAgICAgICAgLy8gY2FsbGluZyByZWxlYXNlQnVmZmVyKCkuCisgICAgICAgICAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChwYXRjaEJ1ZmZlci5yYXcsIGN1cnJlbnQtPm1GYXN0UGF0Y2hSZWNvcmRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBtUmVhZEJ1ZmZlciwgbUZvcm1hdC5tRm9ybWF0LCBmcmFtZXNXcml0dGVuICogbUZvcm1hdC5tQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgICAgICBwYXRjaEJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVzV3JpdHRlbjsKKyAgICAgICAgICAgICAgICBmYXN0UGF0Y2hSZWNvcmRCdWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmcGF0Y2hCdWZmZXIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjYmxrICE9IE5VTEwgJiYgZnJhbWVzV3JpdHRlbiA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRSBUaGlzIHN1cHBvcnRzIGF0IG1vc3Qgb25lIGZhc3QgY2FwdHVyZSBjbGllbnQuCisgICAgICAgICAgICAgICAgLy8gICAgICAgVG8gaGFuZGxlIG11bHRpcGxlIGNsaWVudHMgdGhpcyBjb3VsZCBiZSBjb252ZXJ0ZWQgdG8gYW4gYXJyYXksCisgICAgICAgICAgICAgICAgLy8gICAgICAgb3Igd2l0aCBhIGxvdCBtb3JlIHdvcmsgdGhlIGNvbnRyb2wgYmxvY2sgY291bGQgYmUgc2hhcmVkIGJ5IGFsbCBjbGllbnRzLgogICAgICAgICAgICAgICAgIGludDMyX3QgcmVhciA9IGNibGstPnUubVN0cmVhbWluZy5tUmVhcjsKICAgICAgICAgICAgICAgICBhbmRyb2lkX2F0b21pY19yZWxlYXNlX3N0b3JlKGZyYW1lc1dyaXR0ZW4gKyByZWFyLCAmY2Jsay0+dS5tU3RyZWFtaW5nLm1SZWFyKTsKICAgICAgICAgICAgICAgICBjYmxrLT5tU2VydmVyICs9IGZyYW1lc1dyaXR0ZW47CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVTdGF0ZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlU3RhdGUuaAppbmRleCA5YmNhMmQ0Li5kMjg3MjMyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVTdGF0ZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZVN0YXRlLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9BVURJT19GQVNUX0NBUFRVUkVfU1RBVEVfSAogCiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmg+CiAjaW5jbHVkZSAiRmFzdFRocmVhZFN0YXRlLmgiCiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmg+CiAKQEAgLTM3LDYgKzM4LDEwIEBACiAgICAgc2l6ZV90ICAgICAgICAgIG1GcmFtZUNvdW50OyAgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBwZXIgZmFzdCBjYXB0dXJlIGJ1ZmZlcgogICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogbUNibGs7ICAgICAgICAgIC8vIGNvbnRyb2wgYmxvY2sgZm9yIHRoZSBzaW5nbGUgZmFzdCBjbGllbnQsIG9yIE5VTEwKIAorICAgIGF1ZGlvX2Zvcm1hdF90ICBtRmFzdFBhdGNoUmVjb3JkRm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgQXVkaW9CdWZmZXJQcm92aWRlciogbUZhc3RQYXRjaFJlY29yZEJ1ZmZlclByb3ZpZGVyID0gbnVsbHB0cjsgICAvLyBhIHJlZmVyZW5jZSB0byBhIHBhdGNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvcmQgaW4gZmFzdCBtb2RlCisKICAgICAvLyBFeHRlbmRzIEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZAogICAgIHN0YXRpYyBjb25zdCBDb21tYW5kCiAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYWxzbyBwcm9jZXNzIGNvbmZpZ3VyYXRpb24gY2hhbmdlcywgYW5kIGNhbiBiZSAib3IiZWQ6CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCmluZGV4IDc5YmI5ZmUuLmYzMjg1NzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCkBAIC0zMiwxMyArMzIsMTQgQEAKICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2lmZGVmIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKLSNpbmNsdWRlIDxjcHVzdGF0cy9DZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvU3RhdGlzdGljcy5oPgogI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwogI2luY2x1ZGUgPGNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmg+CiAjZW5kaWYKICNlbmRpZgotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL21vbm9fYmxlbmQuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9jaGFubmVscy5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Zvcm1hdC5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL21vbm9fYmxlbmQuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb01peGVyLmg+CiAjaW5jbHVkZSAiRmFzdE1peGVyLmgiCiAjaW5jbHVkZSAiVHlwZWRMb2dnZXIuaCIKQEAgLTQ3LDcgKzQ4LDggQEAKIAogLypzdGF0aWMqLyBjb25zdCBGYXN0TWl4ZXJTdGF0ZSBGYXN0TWl4ZXI6OnNJbml0aWFsOwogCi1GYXN0TWl4ZXI6OkZhc3RNaXhlcigpIDogRmFzdFRocmVhZCgiY3ljbGVfbXMiLCAibG9hZF91cyIpLAorRmFzdE1peGVyOjpGYXN0TWl4ZXIoYXVkaW9faW9faGFuZGxlX3QgcGFyZW50SW9IYW5kbGUpCisgICAgOiBGYXN0VGhyZWFkKCJjeWNsZV9tcyIsICJsb2FkX3VzIiksCiAgICAgLy8gbUZhc3RUcmFja05hbWVzCiAgICAgLy8gbUdlbmVyYXRpb25zCiAgICAgbU91dHB1dFNpbmsoTlVMTCksCkBAIC02Niw4ICs2OCwxMSBAQAogICAgIG1Ub3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4oMCksCiAgICAgLy8gdGltZXN0YW1wCiAgICAgbU5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQoMCksICAgLy8gdGhlID0gMCBpcyB0byBzaWxlbmNlIHRoZSBjb21waWxlcgotICAgIG1NYXN0ZXJNb25vKGZhbHNlKQorICAgIG1NYXN0ZXJNb25vKGZhbHNlKSwKKyAgICBtVGhyZWFkSW9IYW5kbGUocGFyZW50SW9IYW5kbGUpCiB7CisgICAgKHZvaWQpbVRocmVhZElvSGFuZGxlOyAvLyBwcmV2ZW50IHVudXNlZCB3YXJuaW5nLCBzZWUgQysrMTcgW1ttYXliZV91bnVzZWRdXQorCiAgICAgLy8gRklYTUUgcGFzcyBzSW5pdGlhbCBhcyBwYXJhbWV0ZXIgdG8gYmFzZSBjbGFzcyBjb25zdHJ1Y3RvciwgYW5kIG1ha2UgaXQgc3RhdGljIGxvY2FsCiAgICAgbVByZXZpb3VzID0gJnNJbml0aWFsOwogICAgIG1DdXJyZW50ID0gJnNJbml0aWFsOwpAQCAtMTU1LDIwICsxNjAsMjQgQEAKICAgICBpZiAoY3VycmVudC0+bU91dHB1dFNpbmtHZW4gIT0gbU91dHB1dFNpbmtHZW4pIHsKICAgICAgICAgbU91dHB1dFNpbmsgPSBjdXJyZW50LT5tT3V0cHV0U2luazsKICAgICAgICAgbU91dHB1dFNpbmtHZW4gPSBjdXJyZW50LT5tT3V0cHV0U2lua0dlbjsKKyAgICAgICAgbVNpbmtDaGFubmVsTWFzayA9IGN1cnJlbnQtPm1TaW5rQ2hhbm5lbE1hc2s7CiAgICAgICAgIGlmIChtT3V0cHV0U2luayA9PSBOVUxMKSB7CiAgICAgICAgICAgICBtRm9ybWF0ID0gRm9ybWF0X0ludmFsaWQ7CiAgICAgICAgICAgICBtU2FtcGxlUmF0ZSA9IDA7CiAgICAgICAgICAgICBtU2lua0NoYW5uZWxDb3VudCA9IDA7CiAgICAgICAgICAgICBtU2lua0NoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOworICAgICAgICAgICAgbUF1ZGlvQ2hhbm5lbENvdW50ID0gMDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1Gb3JtYXQgPSBtT3V0cHV0U2luay0+Zm9ybWF0KCk7CiAgICAgICAgICAgICBtU2FtcGxlUmF0ZSA9IEZvcm1hdF9zYW1wbGVSYXRlKG1Gb3JtYXQpOwogICAgICAgICAgICAgbVNpbmtDaGFubmVsQ291bnQgPSBGb3JtYXRfY2hhbm5lbENvdW50KG1Gb3JtYXQpOwogICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtU2lua0NoYW5uZWxDb3VudCA+IEF1ZGlvTWl4ZXI6Ok1BWF9OVU1fQ0hBTk5FTFMpOwogCi0gICAgICAgICAgICAvLyBUT0RPOiBBZGQgY2hhbm5lbCBtYXNrIHRvIE5CQUlPX0Zvcm1hdAotICAgICAgICAgICAgLy8gV2UgYXNzdW1lIHRoYXQgdGhlIGNoYW5uZWwgbWFzayBtdXN0IGJlIGEgdmFsaWQgcG9zaXRpb25hbCBjaGFubmVsIG1hc2suCi0gICAgICAgICAgICBtU2lua0NoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KG1TaW5rQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIGlmIChtU2lua0NoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfTk9ORSkgeworICAgICAgICAgICAgICAgIG1TaW5rQ2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQobVNpbmtDaGFubmVsQ291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUF1ZGlvQ2hhbm5lbENvdW50ID0gbVNpbmtDaGFubmVsQ291bnQgLSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soCisgICAgICAgICAgICAgICAgICAgIG1TaW5rQ2hhbm5lbE1hc2sgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpOwogICAgICAgICB9CiAgICAgICAgIGR1bXBTdGF0ZS0+bVNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKICAgICB9CkBAIC0xOTEsNiArMjAwLDEwIEBACiAgICAgICAgICAgICAvLyAgICAgICB0byBhdm9pZCBibG9ja2luZyBoZXJlIGFuZCB0byBwcmV2ZW50IHBvc3NpYmxlIHByaW9yaXR5IGludmVyc2lvbgogICAgICAgICAgICAgbU1peGVyID0gbmV3IEF1ZGlvTWl4ZXIoZnJhbWVDb3VudCwgbVNhbXBsZVJhdGUpOwogICAgICAgICAgICAgLy8gRklYTUUgU2VlIHRoZSBvdGhlciBGSVhNRSBhdCBGYXN0TWl4ZXI6OnNldE5CTG9nV3JpdGVyKCkKKyAgICAgICAgICAgIE5CTG9nOjp0aHJlYWRfcGFyYW1zX3QgcGFyYW1zOworICAgICAgICAgICAgcGFyYW1zLmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgICAgICAgICAgcGFyYW1zLnNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIExPR19USFJFQURfUEFSQU1TKHBhcmFtcyk7CiAgICAgICAgICAgICBjb25zdCBzaXplX3QgbWl4ZXJGcmFtZVNpemUgPSBtU2lua0NoYW5uZWxDb3VudAogICAgICAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobU1peGVyQnVmZmVyRm9ybWF0KTsKICAgICAgICAgICAgIG1NaXhlckJ1ZmZlclNpemUgPSBtaXhlckZyYW1lU2l6ZSAqIGZyYW1lQ291bnQ7CkBAIC0yMjAsNiArMjMzLDEwIEBACiAgICAgICAgIHByZXZpb3VzVHJhY2tNYXNrID0gMDsKICAgICAgICAgbUZhc3RUcmFja3NHZW4gPSBjdXJyZW50LT5tRmFzdFRyYWNrc0dlbiAtIDE7CiAgICAgICAgIGR1bXBTdGF0ZS0+bUZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworI2lmZGVmIFRFRV9TSU5LCisgICAgICAgIG1UZWUuc2V0KG1Gb3JtYXQsIE5CQUlPX1RlZTo6VEVFX0ZMQUdfT1VUUFVUX1RIUkVBRCk7CisgICAgICAgIG1UZWUuc2V0SWQoc3RkOjpzdHJpbmcoIl8iKSArIHN0ZDo6dG9fc3RyaW5nKG1UaHJlYWRJb0hhbmRsZSkgKyAiX0YiKTsKKyNlbmRpZgogICAgIH0gZWxzZSB7CiAgICAgICAgIHByZXZpb3VzVHJhY2tNYXNrID0gcHJldmlvdXMtPm1UcmFja01hc2s7CiAgICAgfQpAQCAtMjc2LDYgKzI5Myw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2spOwogICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNSVhFUl9DSEFOTkVMX01BU0ssCiAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpbVNpbmtDaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkhBUFRJQ19FTkFCTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KWZhc3RUcmFjay0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCk7CiAgICAgICAgICAgICAgICAgbU1peGVyLT5lbmFibGUobmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtR2VuZXJhdGlvbnNbaV0gPSBmYXN0VHJhY2stPm1HZW5lcmF0aW9uOwpAQCAtMzEyLDYgKzMzMSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KWZhc3RUcmFjay0+bUNoYW5uZWxNYXNrKTsKICAgICAgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6Ok1JWEVSX0NIQU5ORUxfTUFTSywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpbVNpbmtDaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpIQVBUSUNfRU5BQkxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkKTsKICAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBlbmFibGVkCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1HZW5lcmF0aW9uc1tpXSA9IGZhc3RUcmFjay0+bUdlbmVyYXRpb247CkBAIC0zMjgsMTMgKzM0OSwyNCBAQAogewogICAgIC8vIFRPRE86IHBhc3MgYW4gSUQgcGFyYW1ldGVyIHRvIGluZGljYXRlIHdoaWNoIHRpbWUgc2VyaWVzIHdlIHdhbnQgdG8gd3JpdGUgdG8gaW4gTkJMb2cuY3BwCiAgICAgLy8gT3I6IHBhc3MgYm90aCBvZiB0aGVzZSBpbnRvIGEgc2luZ2xlIGNhbGwgd2l0aCBhIGJvb2xlYW4KLSAgICBpZiAobUlzV2FybSkgewotICAgICAgICBMT0dfSElTVF9UUygpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIExPR19BVURJT19TVEFURSgpOwotICAgIH0KICAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqIGNvbnN0IGN1cnJlbnQgPSAoY29uc3QgRmFzdE1peGVyU3RhdGUgKikgbUN1cnJlbnQ7CiAgICAgRmFzdE1peGVyRHVtcFN0YXRlICogY29uc3QgZHVtcFN0YXRlID0gKEZhc3RNaXhlckR1bXBTdGF0ZSAqKSBtRHVtcFN0YXRlOworCisgICAgaWYgKG1Jc1dhcm0pIHsKKyAgICAgICAgLy8gTG9nZ2luZyB0aW1lc3RhbXBzIGZvciBGYXN0TWl4ZXIgaXMgY3VycmVudGx5IGRpc2FibGVkIHRvIG1ha2UgbWVtb3J5IHJvb20gZm9yIGxvZ2dpbmcKKyAgICAgICAgLy8gb3RoZXIgc3RhdGlzdGljcyBpbiBGYXN0TWl4ZXIuCisgICAgICAgIC8vIFRvIHJlLWVuYWJsZSwgZGVsZXRlIHRoZSAjaWZkZWYgRkFTVE1JWEVSX0xPR19ISVNUX1RTIGxpbmVzIChhbmQgdGhlICNlbmRpZiBsaW5lcykuCisjaWZkZWYgRkFTVE1JWEVSX0xPR19ISVNUX1RTCisgICAgICAgIExPR19ISVNUX1RTKCk7CisjZW5kaWYKKyAgICAgICAgLy9BTE9HRCgiRXJpYyBGYXN0TWl4ZXI6Om9uV29yaygpIG1Jc1dhcm0iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkdW1wU3RhdGUtPm1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KCk7CisgICAgICAgIC8vIFNlZSBjb21tZW50IGluIGlmIGJsb2NrLgorI2lmZGVmIEZBU1RNSVhFUl9MT0dfSElTVF9UUworICAgICAgICBMT0dfQVVESU9fU1RBVEUoKTsKKyNlbmRpZgorICAgIH0KICAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZTo6Q29tbWFuZCBjb21tYW5kID0gbUNvbW1hbmQ7CiAgICAgY29uc3Qgc2l6ZV90IGZyYW1lQ291bnQgPSBjdXJyZW50LT5tRnJhbWVDb3VudDsKIApAQCAtNDQ1LDExICs0NzcsMTcgQEAKICAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQoYnVmZmVyLCBtRm9ybWF0Lm1Gb3JtYXQsIG1NaXhlckJ1ZmZlciwgbU1peGVyQnVmZmVyRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50ICogRm9ybWF0X2NoYW5uZWxDb3VudChtRm9ybWF0KSk7CiAgICAgICAgIH0KLSAgICAgICAgLy8gaWYgbm9uLU5VTEwsIHRoZW4gZHVwbGljYXRlIHdyaXRlKCkgdG8gdGhpcyBub24tYmxvY2tpbmcgc2luawotICAgICAgICBOQkFJT19TaW5rKiB0ZWVTaW5rOwotICAgICAgICBpZiAoKHRlZVNpbmsgPSBjdXJyZW50LT5tVGVlU2luaykgIT0gTlVMTCkgewotICAgICAgICAgICAgKHZvaWQpIHRlZVNpbmstPndyaXRlKGJ1ZmZlciwgZnJhbWVDb3VudCk7CisgICAgICAgIGlmIChtU2lua0NoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSB7CisgICAgICAgICAgICAvLyBXaGVuIHRoZXJlIGFyZSBoYXB0aWMgY2hhbm5lbHMsIHRoZSBzYW1wbGUgZGF0YSBpcyBwYXJ0aWFsbHkgaW50ZXJsZWF2ZWQuCisgICAgICAgICAgICAvLyBNYWtlIHRoZSBzYW1wbGUgZGF0YSBmdWxseSBpbnRlcmxlYXZlZCBoZXJlLgorICAgICAgICAgICAgYWRqdXN0X2NoYW5uZWxzX25vbl9kZXN0cnVjdGl2ZShidWZmZXIsIG1BdWRpb0NoYW5uZWxDb3VudCwgYnVmZmVyLCBtU2lua0NoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtRm9ybWF0Lm1Gb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50ICogYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKG1BdWRpb0NoYW5uZWxDb3VudCwgbUZvcm1hdC5tRm9ybWF0KSk7CiAgICAgICAgIH0KKyAgICAgICAgLy8gaWYgbm9uLU5VTEwsIHRoZW4gZHVwbGljYXRlIHdyaXRlKCkgdG8gdGhpcyBub24tYmxvY2tpbmcgc2luaworI2lmZGVmIFRFRV9TSU5LCisgICAgICAgIG1UZWUud3JpdGUoYnVmZmVyLCBmcmFtZUNvdW50KTsKKyNlbmRpZgogICAgICAgICAvLyBGSVhNRSB3cml0ZSgpIGlzIG5vbi1ibG9ja2luZyBhbmQgbG9jay1mcmVlIGZvciBhIHByb3Blcmx5IGltcGxlbWVudGVkIE5CQUlPIHNpbmssCiAgICAgICAgIC8vICAgICAgIGJ1dCB0aGlzIGNvZGUgc2hvdWxkIGJlIG1vZGlmaWVkIHRvIGhhbmRsZSBib3RoIG5vbi1ibG9ja2luZyBhbmQgYmxvY2tpbmcgc2lua3MKICAgICAgICAgZHVtcFN0YXRlLT5tV3JpdGVTZXF1ZW5jZSsrOwpAQCAtNDcwLDM1ICs1MDgsNDkgQEAKICAgICAgICAgbUF0dGVtcHRlZFdyaXRlID0gdHJ1ZTsKICAgICAgICAgLy8gRklYTUUgY291bnQgIyBvZiB3cml0ZXMgYmxvY2tlZCBleGNlc3NpdmVseSwgQ1BVIHVzYWdlLCBldGMuIGZvciBkdW1wCiAKLSAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgdGltZXN0YW1wOyAvLyBsb2NhbAotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT3V0cHV0U2luay0+Z2V0VGltZXN0YW1wKHRpbWVzdGFtcCk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGNvbnN0IGludDY0X3QgdG90YWxOYXRpdmVGcmFtZXNQcmVzZW50ZWQgPQotICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdOwotICAgICAgICAgICAgaWYgKHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkIDw9IG1Ub3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4pIHsKLSAgICAgICAgICAgICAgICBtTmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZCA9Ci0gICAgICAgICAgICAgICAgICAgIG1Ub3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4gLSB0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZDsKLSAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9CisgICAgICAgIGlmIChtSXNXYXJtKSB7CisgICAgICAgICAgICBFeHRlbmRlZFRpbWVzdGFtcCB0aW1lc3RhbXA7IC8vIGxvY2FsCisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT3V0cHV0U2luay0+Z2V0VGltZXN0YW1wKHRpbWVzdGFtcCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tVGltZXN0YW1wVmVyaWZpZXIuYWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdLAorICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgdG90YWxOYXRpdmVGcmFtZXNQcmVzZW50ZWQgPQogICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXTsKLSAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPQotICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07CisgICAgICAgICAgICAgICAgaWYgKHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkIDw9IG1Ub3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgbU5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQgPQorICAgICAgICAgICAgICAgICAgICAgICAgbVRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbiAtIHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkOworICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXTsKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXTsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgY29tcGVuc2F0ZSBmb3Igc2VydmVyIC0ga2VybmVsIHRpbWUgZGlmZmVyZW5jZSBhbmQKKyAgICAgICAgICAgICAgICAgICAgLy8gb25seSB1cGRhdGUgbGF0ZW5jeSBpZiB3ZSBoYXZlIHZhbGlkIGluZm8uCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBsYXRlbmN5TXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpbU5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQgKiAxMDAwIC8gbVNhbXBsZVJhdGU7CisgICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bUxhdGVuY3lNcyA9IGxhdGVuY3lNczsKKyAgICAgICAgICAgICAgICAgICAgTE9HX0xBVEVOQ1kobGF0ZW5jeU1zKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBIQUwgcmVwb3J0ZWQgdGhhdCBtb3JlIGZyYW1lcyB3ZXJlIHByZXNlbnRlZCB0aGFuIHdlcmUgd3JpdHRlbgorICAgICAgICAgICAgICAgICAgICBtTmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gSEFMIHJlcG9ydGVkIHRoYXQgbW9yZSBmcmFtZXMgd2VyZSBwcmVzZW50ZWQgdGhhbiB3ZXJlIHdyaXR0ZW4KLSAgICAgICAgICAgICAgICBtTmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZCA9IDA7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tVGltZXN0YW1wVmVyaWZpZXIuZXJyb3IoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl0gPQotICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBmZXRjaCBzZXJ2ZXIgdGltZSBpZiB3ZSBjYW4ndCBnZXQgdGltZXN0YW1wCi0gICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl0gPQotICAgICAgICAgICAgICAgICAgICBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgICAgICAgICAvLyBjbGVhciBvdXQga2VybmVsIGNhY2hlZCBwb3NpdGlvbiBhcyB0aGlzIG1heSBnZXQgcmFwaWRseSBzdGFsZQotICAgICAgICAgICAgLy8gaWYgd2UgbmV2ZXIgZ2V0IGEgbmV3IHZhbGlkIHRpbWVzdGFtcAotICAgICAgICAgICAgbVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPSAwOwotICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0gLTE7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gZmV0Y2ggc2VydmVyIHRpbWUgaWYgd2UgY2FuJ3QgZ2V0IHRpbWVzdGFtcAorICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7CisgICAgICAgICAgICAgICAgLy8gY2xlYXIgb3V0IGtlcm5lbCBjYWNoZWQgcG9zaXRpb24gYXMgdGhpcyBtYXkgZ2V0IHJhcGlkbHkgc3RhbGUKKyAgICAgICAgICAgICAgICAvLyBpZiB3ZSBuZXZlciBnZXQgYSBuZXcgdmFsaWQgdGltZXN0YW1wCisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPSAwOworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9IC0xOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5oCmluZGV4IDIzNWQyM2YuLjFkMzMyZTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmgKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlICJTdGF0ZVF1ZXVlLmgiCiAjaW5jbHVkZSAiRmFzdE1peGVyU3RhdGUuaCIKICNpbmNsdWRlICJGYXN0TWl4ZXJEdW1wU3RhdGUuaCIKKyNpbmNsdWRlICJOQkFJT19UZWUuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zMiw3ICszMyw5IEBACiBjbGFzcyBGYXN0TWl4ZXIgOiBwdWJsaWMgRmFzdFRocmVhZCB7CiAKIHB1YmxpYzoKLSAgICAgICAgICAgIEZhc3RNaXhlcigpOworICAgIC8qKiBGYXN0TWl4ZXIgY29uc3RydWN0b3IgdGFrZXMgYXMgcGFyYW0gdGhlIHBhcmVudCBNaXhlclRocmVhZCdzIGlvIGhhbmRsZSAoaWQpCisgICAgICAgIGZvciBwdXJwb3NlcyBvZiBpZGVudGlmaWNhdGlvbi4gKi8KKyAgICBleHBsaWNpdCBGYXN0TWl4ZXIoYXVkaW9faW9faGFuZGxlX3QgdGhyZWFkSW9IYW5kbGUpOwogICAgIHZpcnR1YWwgfkZhc3RNaXhlcigpOwogCiAgICAgICAgICAgICBGYXN0TWl4ZXJTdGF0ZVF1ZXVlKiBzcSgpOwpAQCAtNzMsNiArNzYsOCBAQAogICAgIHNpemVfdCAgICAgICAgICBtTWl4ZXJCdWZmZXJTaXplOwogICAgIGF1ZGlvX2Zvcm1hdF90ICBtTWl4ZXJCdWZmZXJGb3JtYXQ7IC8vIG1peGVyIG91dHB1dCBmb3JtYXQ6IEFVRElPX0ZPUk1BVF9QQ01fKDE2X0JJVHxGTE9BVCkuCiAKKyAgICB1aW50MzJfdCAgICAgICAgbUF1ZGlvQ2hhbm5lbENvdW50OyAvLyBhdWRpbyBjaGFubmVsIGNvdW50LCBleGNsdWRlcyBoYXB0aWMgY2hhbm5lbHMuCisKICAgICBlbnVtIHtVTkRFRklORUQsIE1JWEVELCBaRVJPRUR9IG1NaXhlckJ1ZmZlclN0YXRlOwogICAgIE5CQUlPX0Zvcm1hdCAgICBtRm9ybWF0OwogICAgIHVuc2lnbmVkICAgICAgICBtU2FtcGxlUmF0ZTsKQEAgLTg3LDYgKzkyLDExIEBACiAgICAgLy8gYWNjZXNzZWQgd2l0aG91dCBsb2NrIGJldHdlZW4gbXVsdGlwbGUgdGhyZWFkcy4KICAgICBzdGQ6OmF0b21pY19ib29sIG1NYXN0ZXJNb25vOwogICAgIHN0ZDo6YXRvbWljX2ludF9mYXN0NjRfdCBtQm9vdHRpbWVPZmZzZXQ7CisKKyAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBtVGhyZWFkSW9IYW5kbGU7IC8vIHBhcmVudCB0aHJlYWQgaWQgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcworI2lmZGVmIFRFRV9TSU5LCisgICAgTkJBSU9fVGVlICAgICAgIG1UZWU7CisjZW5kaWYKIH07ICAvLyBjbGFzcyBGYXN0TWl4ZXIKIAogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuY3BwCmluZGV4IDJlNGZiOGMuLmE0MmUwOWMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuY3BwCkBAIC0xOSw3ICsxOSw3IEBACiAKICNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCiAjaWZkZWYgRkFTVF9USFJFQURfU1RBVElTVElDUwotI2luY2x1ZGUgPGNwdXN0YXRzL0NlbnRyYWxUZW5kZW5jeVN0YXRpc3RpY3MuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9TdGF0aXN0aWNzLmg+CiAjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCiAjaW5jbHVkZSA8Y3B1c3RhdHMvVGhyZWFkQ3B1VXNhZ2UuaD4KICNlbmRpZgpAQCAtNjgsMjEgKzY4LDIyIEBACiAgICAgZHByaW50ZihmZCwgIiAgRmFzdE1peGVyIGNvbW1hbmQ9JXMgd3JpdGVTZXF1ZW5jZT0ldSBmcmFtZXNXcml0dGVuPSV1XG4iCiAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIG51bVRyYWNrcz0ldSB3cml0ZUVycm9ycz0ldSB1bmRlcnJ1bnM9JXUgb3ZlcnJ1bnM9JXVcbiIKICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgc2FtcGxlUmF0ZT0ldSBmcmFtZUNvdW50PSV6dSBtZWFzdXJlZFdhcm11cD0lLjNnIG1zLCB3YXJtdXBDeWNsZXM9JXVcbiIKLSAgICAgICAgICAgICAgICAiICAgICAgICAgICAgbWl4UGVyaW9kPSUuMmYgbXNcbiIsCisgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIG1peFBlcmlvZD0lLjJmIG1zIGxhdGVuY3k9JS4yZiBtc1xuIiwKICAgICAgICAgICAgICAgICBGYXN0TWl4ZXJTdGF0ZTo6Y29tbWFuZFRvU3RyaW5nKG1Db21tYW5kKSwgbVdyaXRlU2VxdWVuY2UsIG1GcmFtZXNXcml0dGVuLAogICAgICAgICAgICAgICAgIG1OdW1UcmFja3MsIG1Xcml0ZUVycm9ycywgbVVuZGVycnVucywgbU92ZXJydW5zLAogICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtRnJhbWVDb3VudCwgbWVhc3VyZWRXYXJtdXBNcywgbVdhcm11cEN5Y2xlcywKLSAgICAgICAgICAgICAgICBtaXhQZXJpb2RTZWMgKiAxZTMpOworICAgICAgICAgICAgICAgIG1peFBlcmlvZFNlYyAqIDFlMywgbUxhdGVuY3lNcyk7CisgICAgZHByaW50ZihmZCwgIiAgRmFzdE1peGVyIFRpbWVzdGFtcCBzdGF0czogJXNcbiIsIG1UaW1lc3RhbXBWZXJpZmllci50b1N0cmluZygpLmNfc3RyKCkpOwogI2lmZGVmIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKICAgICAvLyBmaW5kIHRoZSBpbnRlcnZhbCBvZiB2YWxpZCBzYW1wbGVzCi0gICAgdWludDMyX3QgYm91bmRzID0gbUJvdW5kczsKLSAgICB1aW50MzJfdCBuZXdlc3RPcGVuID0gYm91bmRzICYgMHhGRkZGOworICAgIGNvbnN0IHVpbnQzMl90IGJvdW5kcyA9IG1Cb3VuZHM7CisgICAgY29uc3QgdWludDMyX3QgbmV3ZXN0T3BlbiA9IGJvdW5kcyAmIDB4RkZGRjsKICAgICB1aW50MzJfdCBvbGRlc3RDbG9zZWQgPSBib3VuZHMgPj4gMTY7CiAKICAgICAvL3VpbnQzMl90IG4gPSAobmV3ZXN0T3BlbiAtIG9sZGVzdENsb3NlZCkgJiAweEZGRkY7CiAgICAgdWludDMyX3QgbjsKICAgICBfX2J1aWx0aW5fc3ViX292ZXJmbG93KG5ld2VzdE9wZW4sIG9sZGVzdENsb3NlZCwgJm4pOwotICAgIG4gPSBuICYgMHhGRkZGOworICAgIG4gJj0gMHhGRkZGOwogCiAgICAgaWYgKG4gPiBtU2FtcGxpbmdOKSB7CiAgICAgICAgIEFMT0dFKCJ0b28gbWFueSBzYW1wbGVzICV1Iiwgbik7CkBAIC05MCw5ICs5MSw5IEBACiAgICAgfQogICAgIC8vIHN0YXRpc3RpY3MgZm9yIG1vbm90b25pYyAod2FsbCBjbG9jaykgdGltZSwgdGhyZWFkIHJhdyBDUFUgbG9hZCBpbiB0aW1lLCBDUFUgY2xvY2sgZnJlcXVlbmN5LAogICAgIC8vIGFuZCBhZGp1c3RlZCBDUFUgbG9hZCBpbiBNSHogbm9ybWFsaXplZCBmb3IgQ1BVIGNsb2NrIGZyZXF1ZW5jeQotICAgIENlbnRyYWxUZW5kZW5jeVN0YXRpc3RpY3Mgd2FsbCwgbG9hZE5zOworICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gd2FsbCwgbG9hZE5zOwogI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwotICAgIENlbnRyYWxUZW5kZW5jeVN0YXRpc3RpY3Mga0h6LCBsb2FkTUh6OworICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4ga0h6LCBsb2FkTUh6OwogICAgIHVpbnQzMl90IHByZXZpb3VzQ3B1a0h6ID0gMDsKICNlbmRpZgogICAgIC8vIEFzc3VtaW5nIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiBmb3IgY3ljbGUgdGltZXMsIHRocmVlIHN0YW5kYXJkIGRldmlhdGlvbnMgb24gZWl0aGVyIHNpZGUgb2YKQEAgLTEwNywxOCArMTA4LDE4IEBACiAgICAgICAgIGlmICh0YWlsICE9IE5VTEwpIHsKICAgICAgICAgICAgIHRhaWxbal0gPSB3YWxsTnM7CiAgICAgICAgIH0KLSAgICAgICAgd2FsbC5zYW1wbGUod2FsbE5zKTsKKyAgICAgICAgd2FsbC5hZGQod2FsbE5zKTsKICAgICAgICAgdWludDMyX3Qgc2FtcGxlTG9hZE5zID0gbUxvYWROc1tpXTsKLSAgICAgICAgbG9hZE5zLnNhbXBsZShzYW1wbGVMb2FkTnMpOworICAgICAgICBsb2FkTnMuYWRkKHNhbXBsZUxvYWROcyk7CiAjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZUNwdWtIeiA9IG1DcHVrSHpbaV07CiAgICAgICAgIC8vIHNraXAgYmFkIGtIeiBzYW1wbGVzCiAgICAgICAgIGlmICgoc2FtcGxlQ3B1a0h6ICYgfjB4RikgIT0gMCkgewotICAgICAgICAgICAga0h6LnNhbXBsZShzYW1wbGVDcHVrSHogPj4gNCk7CisgICAgICAgICAgICBrSHouYWRkKHNhbXBsZUNwdWtIeiA+PiA0KTsKICAgICAgICAgICAgIGlmIChzYW1wbGVDcHVrSHogPT0gcHJldmlvdXNDcHVrSHopIHsKICAgICAgICAgICAgICAgICBkb3VibGUgbWVnYWN5Y2xlcyA9IChkb3VibGUpIHNhbXBsZUxvYWROcyAqIChkb3VibGUpIChzYW1wbGVDcHVrSHogPj4gNCkgKiAxZS0xMjsKICAgICAgICAgICAgICAgICBkb3VibGUgYWRqTUh6ID0gbWVnYWN5Y2xlcyAvIG1peFBlcmlvZFNlYzsgIC8vIF9ub3RfIHdhbGxOcyAqIDFlOQotICAgICAgICAgICAgICAgIGxvYWRNSHouc2FtcGxlKGFkak1Ieik7CisgICAgICAgICAgICAgICAgbG9hZE1Iei5hZGQoYWRqTUh6KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBwcmV2aW91c0NwdWtIeiA9IHNhbXBsZUNwdWtIejsKQEAgLTEyNiw0MiArMTI3LDQyIEBACiAgICAgfQogICAgIGlmIChuKSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgIFNpbXBsZSBtb3Zpbmcgc3RhdGlzdGljcyBvdmVyIGxhc3QgJS4xZiBzZWNvbmRzOlxuIiwKLSAgICAgICAgICAgICAgICAgICAgd2FsbC5uKCkgKiBtaXhQZXJpb2RTZWMpOworICAgICAgICAgICAgICAgICAgICB3YWxsLmdldE4oKSAqIG1peFBlcmlvZFNlYyk7CiAgICAgICAgIGRwcmludGYoZmQsICIgICAgd2FsbCBjbG9jayB0aW1lIGluIG1zIHBlciBtaXggY3ljbGU6XG4iCiAgICAgICAgICAgICAgICAgICAgICIgICAgICBtZWFuPSUuMmYgbWluPSUuMmYgbWF4PSUuMmYgc3RkZGV2PSUuMmZcbiIsCi0gICAgICAgICAgICAgICAgICAgIHdhbGwubWVhbigpKjFlLTYsIHdhbGwubWluaW11bSgpKjFlLTYsIHdhbGwubWF4aW11bSgpKjFlLTYsCi0gICAgICAgICAgICAgICAgICAgIHdhbGwuc3RkZGV2KCkqMWUtNik7CisgICAgICAgICAgICAgICAgICAgIHdhbGwuZ2V0TWVhbigpKjFlLTYsIHdhbGwuZ2V0TWluKCkqMWUtNiwgd2FsbC5nZXRNYXgoKSoxZS02LAorICAgICAgICAgICAgICAgICAgICB3YWxsLmdldFN0ZERldigpKjFlLTYpOwogICAgICAgICBkcHJpbnRmKGZkLCAiICAgIHJhdyBDUFUgbG9hZCBpbiB1cyBwZXIgbWl4IGN5Y2xlOlxuIgogICAgICAgICAgICAgICAgICAgICAiICAgICAgbWVhbj0lLjBmIG1pbj0lLjBmIG1heD0lLjBmIHN0ZGRldj0lLjBmXG4iLAotICAgICAgICAgICAgICAgICAgICBsb2FkTnMubWVhbigpKjFlLTMsIGxvYWROcy5taW5pbXVtKCkqMWUtMywgbG9hZE5zLm1heGltdW0oKSoxZS0zLAotICAgICAgICAgICAgICAgICAgICBsb2FkTnMuc3RkZGV2KCkqMWUtMyk7CisgICAgICAgICAgICAgICAgICAgIGxvYWROcy5nZXRNZWFuKCkqMWUtMywgbG9hZE5zLmdldE1pbigpKjFlLTMsIGxvYWROcy5nZXRNYXgoKSoxZS0zLAorICAgICAgICAgICAgICAgICAgICBsb2FkTnMuZ2V0U3RkRGV2KCkqMWUtMyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZHByaW50ZihmZCwgIiAgTm8gRmFzdE1peGVyIHN0YXRpc3RpY3MgYXZhaWxhYmxlIGN1cnJlbnRseVxuIik7CiAgICAgfQogI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwogICAgIGRwcmludGYoZmQsICIgIENQVSBjbG9jayBmcmVxdWVuY3kgaW4gTUh6OlxuIgogICAgICAgICAgICAgICAgICIgICAgbWVhbj0lLjBmIG1pbj0lLjBmIG1heD0lLjBmIHN0ZGRldj0lLjBmXG4iLAotICAgICAgICAgICAgICAgIGtIei5tZWFuKCkqMWUtMywga0h6Lm1pbmltdW0oKSoxZS0zLCBrSHoubWF4aW11bSgpKjFlLTMsIGtIei5zdGRkZXYoKSoxZS0zKTsKKyAgICAgICAgICAgICAgICBrSHouZ2V0TWVhbigpKjFlLTMsIGtIei5nZXRNaW4oKSoxZS0zLCBrSHouZ2V0TWF4KCkqMWUtMywga0h6LmdldFN0ZERldigpKjFlLTMpOwogICAgIGRwcmludGYoZmQsICIgIGFkanVzdGVkIENQVSBsb2FkIGluIE1IeiAoaS5lLiBub3JtYWxpemVkIGZvciBDUFUgY2xvY2sgZnJlcXVlbmN5KTpcbiIKICAgICAgICAgICAgICAgICAiICAgIG1lYW49JS4xZiBtaW49JS4xZiBtYXg9JS4xZiBzdGRkZXY9JS4xZlxuIiwKLSAgICAgICAgICAgICAgICBsb2FkTUh6Lm1lYW4oKSwgbG9hZE1Iei5taW5pbXVtKCksIGxvYWRNSHoubWF4aW11bSgpLCBsb2FkTUh6LnN0ZGRldigpKTsKKyAgICAgICAgICAgICAgICBsb2FkTUh6LmdldE1lYW4oKSwgbG9hZE1Iei5nZXRNaW4oKSwgbG9hZE1Iei5nZXRNYXgoKSwgbG9hZE1Iei5nZXRTdGREZXYoKSk7CiAjZW5kaWYKICAgICBpZiAodGFpbCAhPSBOVUxMKSB7CiAgICAgICAgIHFzb3J0KHRhaWwsIG4sIHNpemVvZih1aW50MzJfdCksIGNvbXBhcmVfdWludDMyX3QpOwogICAgICAgICAvLyBhc3N1bWUgc2FtZSBudW1iZXIgb2YgdGFpbCBzYW1wbGVzIG9uIGVhY2ggc2lkZSwgbGVmdCBhbmQgcmlnaHQKICAgICAgICAgdWludDMyX3QgY291bnQgPSBuIC8ga1RhaWxEZW5vbWluYXRvcjsKLSAgICAgICAgQ2VudHJhbFRlbmRlbmN5U3RhdGlzdGljcyBsZWZ0LCByaWdodDsKKyAgICAgICAgYXVkaW9fdXRpbHM6OlN0YXRpc3RpY3M8ZG91YmxlPiBsZWZ0LCByaWdodDsKICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgICAgICAgIGxlZnQuc2FtcGxlKHRhaWxbaV0pOwotICAgICAgICAgICAgcmlnaHQuc2FtcGxlKHRhaWxbbiAtIChpICsgMSldKTsKKyAgICAgICAgICAgIGxlZnQuYWRkKHRhaWxbaV0pOworICAgICAgICAgICAgcmlnaHQuYWRkKHRhaWxbbiAtIChpICsgMSldKTsKICAgICAgICAgfQogICAgICAgICBkcHJpbnRmKGZkLCAiICBEaXN0cmlidXRpb24gb2YgbWl4IGN5Y2xlIHRpbWVzIGluIG1zIGZvciB0aGUgdGFpbHMgIgogICAgICAgICAgICAgICAgICAgICAiKD4gfjMgc3RkZGV2IG91dGxpZXJzKTpcbiIKICAgICAgICAgICAgICAgICAgICAgIiAgICBsZWZ0IHRhaWw6IG1lYW49JS4yZiBtaW49JS4yZiBtYXg9JS4yZiBzdGRkZXY9JS4yZlxuIgogICAgICAgICAgICAgICAgICAgICAiICAgIHJpZ2h0IHRhaWw6IG1lYW49JS4yZiBtaW49JS4yZiBtYXg9JS4yZiBzdGRkZXY9JS4yZlxuIiwKLSAgICAgICAgICAgICAgICAgICAgbGVmdC5tZWFuKCkqMWUtNiwgbGVmdC5taW5pbXVtKCkqMWUtNiwgbGVmdC5tYXhpbXVtKCkqMWUtNiwgbGVmdC5zdGRkZXYoKSoxZS02LAotICAgICAgICAgICAgICAgICAgICByaWdodC5tZWFuKCkqMWUtNiwgcmlnaHQubWluaW11bSgpKjFlLTYsIHJpZ2h0Lm1heGltdW0oKSoxZS02LAotICAgICAgICAgICAgICAgICAgICByaWdodC5zdGRkZXYoKSoxZS02KTsKKyAgICAgICAgICAgICAgICAgICAgbGVmdC5nZXRNZWFuKCkqMWUtNiwgbGVmdC5nZXRNaW4oKSoxZS02LCBsZWZ0LmdldE1heCgpKjFlLTYsIGxlZnQuZ2V0U3RkRGV2KCkqMWUtNiwKKyAgICAgICAgICAgICAgICAgICAgcmlnaHQuZ2V0TWVhbigpKjFlLTYsIHJpZ2h0LmdldE1pbigpKjFlLTYsIHJpZ2h0LmdldE1heCgpKjFlLTYsCisgICAgICAgICAgICAgICAgICAgIHJpZ2h0LmdldFN0ZERldigpKjFlLTYpOwogICAgICAgICBkZWxldGVbXSB0YWlsOwogICAgIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5oCmluZGV4IDhlZjMxZDEuLjliOTFjYmMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9BVURJT19GQVNUX01JWEVSX0RVTVBfU1RBVEVfSAogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvVGltZXN0YW1wVmVyaWZpZXIuaD4KICNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCiAjaW5jbHVkZSAiRmFzdFRocmVhZER1bXBTdGF0ZS5oIgogI2luY2x1ZGUgIkZhc3RNaXhlclN0YXRlLmgiCkBAIC02Niw2ICs2Nyw3IEBACiAKICAgICB2b2lkIGR1bXAoaW50IGZkKSBjb25zdDsgICAgLy8gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGEgc3RhYmxlIGNvcHksIG5vdCB0aGUgb3JpZ2luYWwKIAorICAgIGRvdWJsZSAgIG1MYXRlbmN5TXMgPSAwLjsgICAvLyBtZWFzdXJlZCBsYXRlbmN5LCBkZWZhdWx0IG9mIDAgaWYgbm8gdmFsaWQgdGltZXN0YW1wIHJlYWQuCiAgICAgdWludDMyX3QgbVdyaXRlU2VxdWVuY2U7ICAgIC8vIGluY3JlbWVudGVkIGJlZm9yZSBhbmQgYWZ0ZXIgZWFjaCB3cml0ZSgpCiAgICAgdWludDMyX3QgbUZyYW1lc1dyaXR0ZW47ICAgIC8vIHRvdGFsIG51bWJlciBvZiBmcmFtZXMgd3JpdHRlbiBzdWNjZXNzZnVsbHkKICAgICB1aW50MzJfdCBtTnVtVHJhY2tzOyAgICAgICAgLy8gdG90YWwgbnVtYmVyIG9mIGFjdGl2ZSBmYXN0IHRyYWNrcwpAQCAtNzQsNiArNzYsOSBAQAogICAgIHNpemVfdCAgIG1GcmFtZUNvdW50OwogICAgIHVpbnQzMl90IG1UcmFja01hc2s7ICAgICAgICAvLyBtYXNrIG9mIGFjdGl2ZSB0cmFja3MKICAgICBGYXN0VHJhY2tEdW1wICAgbVRyYWNrc1tGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3NdOworCisgICAgLy8gRm9yIHRpbWVzdGFtcCBzdGF0aXN0aWNzLgorICAgIFRpbWVzdGFtcFZlcmlmaWVyPGludDY0X3QgLyogZnJhbWUgY291bnQgKi8sIGludDY0X3QgLyogdGltZSBucyAqLz4gbVRpbWVzdGFtcFZlcmlmaWVyOwogfTsKIAogfSAgIC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuY3BwCmluZGV4IDM2ZDhlZWYuLmI5ODg0MmQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmNwcApAQCAtMzUsNyArMzUsNyBAQAogRmFzdE1peGVyU3RhdGU6OkZhc3RNaXhlclN0YXRlKCkgOiBGYXN0VGhyZWFkU3RhdGUoKSwKICAgICAvLyBtRmFzdFRyYWNrcwogICAgIG1GYXN0VHJhY2tzR2VuKDApLCBtVHJhY2tNYXNrKDApLCBtT3V0cHV0U2luayhOVUxMKSwgbU91dHB1dFNpbmtHZW4oMCksCi0gICAgbUZyYW1lQ291bnQoMCksIG1UZWVTaW5rKE5VTEwpCisgICAgbUZyYW1lQ291bnQoMCkKIHsKICAgICBpbnQgb2sgPSBwdGhyZWFkX29uY2UoJnNNYXhGYXN0VHJhY2tzT25jZSwgc01heEZhc3RUcmFja3NJbml0KTsKICAgICBpZiAob2sgIT0gMCkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuaAppbmRleCAyYmUxZTkxLi45ZDJhNzMzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuaApAQCAtNDcsNiArNDcsNyBAQAogICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICAgIG1DaGFubmVsTWFzazsgICAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyBvciBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8KICAgICBhdWRpb19mb3JtYXRfdCAgICAgICAgICBtRm9ybWF0OyAgICAgICAgIC8vIHRyYWNrIGZvcm1hdAogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1HZW5lcmF0aW9uOyAgICAgLy8gaW5jcmVtZW50IHdoZW4gYW55IGZpZWxkIGlzIGFzc2lnbmVkCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbUhhcHRpY1BsYXliYWNrRW5hYmxlZCA9IGZhbHNlOyAvLyBoYXB0aWMgcGxheWJhY2sgaXMgZW5hYmxlZCBvciBub3QKIH07CiAKIC8vIFJlcHJlc2VudHMgYSBzaW5nbGUgc3RhdGUgb2YgdGhlIGZhc3QgbWl4ZXIKQEAgLTY5LDYgKzcwLDkgQEAKICAgICBOQkFJT19TaW5rKiBtT3V0cHV0U2luazsgICAgLy8gSEFMIG91dHB1dCBkZXZpY2UsIG11c3QgYWxyZWFkeSBiZSBuZWdvdGlhdGVkCiAgICAgaW50ICAgICAgICAgbU91dHB1dFNpbmtHZW47IC8vIGluY3JlbWVudCB3aGVuIG1PdXRwdXRTaW5rIGlzIGFzc2lnbmVkCiAgICAgc2l6ZV90ICAgICAgbUZyYW1lQ291bnQ7ICAgIC8vIG51bWJlciBvZiBmcmFtZXMgcGVyIGZhc3QgbWl4IGJ1ZmZlcgorICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1TaW5rQ2hhbm5lbE1hc2s7IC8vIElmIG5vdCBBVURJT19DSEFOTkVMX05PTkUsIHNwZWNpZmllcyBzaW5rIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXNrIHdoZW4gaXQgY2Fubm90IGJlIGRpcmVjdGx5IGNhbGN1bGF0ZWQgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYW5uZWwgY291bnQKIAogICAgIC8vIEV4dGVuZHMgRmFzdFRocmVhZFN0YXRlOjpDb21tYW5kCiAgICAgc3RhdGljIGNvbnN0IENvbW1hbmQKQEAgLTc3LDkgKzgxLDYgQEAKICAgICAgICAgV1JJVEUgPSAweDEwLCAgICAgICAgICAgLy8gd3JpdGUgdG8gb3V0cHV0IHNpbmsKICAgICAgICAgTUlYX1dSSVRFID0gMHgxODsgICAgICAgLy8gbWl4IHRyYWNrcyBhbmQgd3JpdGUgdG8gb3V0cHV0IHNpbmsKIAotICAgIC8vIFRoaXMgbWlnaHQgYmUgYSBvbmUtdGltZSBjb25maWd1cmF0aW9uIHJhdGhlciB0aGFuIHBlci1zdGF0ZQotICAgIE5CQUlPX1NpbmsqIG1UZWVTaW5rOyAgICAgICAvLyBpZiBub24tTlVMTCwgdGhlbiBkdXBsaWNhdGUgd3JpdGUoKXMgdG8gdGhpcyBub24tYmxvY2tpbmcgc2luawotCiAgICAgLy8gbmV2ZXIgcmV0dXJucyBOVUxMOyBhc3NlcnRzIGlmIGNvbW1hbmQgaXMgaW52YWxpZAogICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb21tYW5kVG9TdHJpbmcoQ29tbWFuZCBjb21tYW5kKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuY3BwCmluZGV4IGRjMTU0ODcuLjA0YjMyYzIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5jcHAKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCiAjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KICNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Nsb2NrLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CkBAIC02NSw4ICs2Niw2IEBACiAgICAgLyogbU1lYXN1cmVkV2FybXVwVHMoezAsIDB9KSwgKi8KICAgICBtV2FybXVwQ3ljbGVzKDApLAogICAgIG1XYXJtdXBDb25zZWN1dGl2ZUluUmFuZ2VDeWNsZXMoMCksCi0gICAgLy8gbUR1bW15TkJMb2dXcml0ZXIKLSAgICBtTkJMb2dXcml0ZXIoJm1EdW1teU5CTG9nV3JpdGVyKSwKICAgICBtVGltZXN0YW1wU3RhdHVzKElOVkFMSURfT1BFUkFUSU9OKSwKIAogICAgIG1Db21tYW5kKEZhc3RUaHJlYWRTdGF0ZTo6SU5JVElBTCksCkBAIC05Myw3ICs5Miw3IEBACiB7CiAgICAgLy8gTE9HVCBub3cgd29ya3MgZXZlbiBpZiB0bE5CTG9nV3JpdGVyIGlzIG51bGxwdHIsIGJ1dCB3ZSdyZSBjb25zaWRlcmluZyBjaGFuZ2luZyB0aGF0LAogICAgIC8vIHNvIHRoaXMgaW5pdGlhbGl6YXRpb24gcGVybWl0cyBhIGZ1dHVyZSBjaGFuZ2UgdG8gcmVtb3ZlIHRoZSBjaGVjayBmb3IgbnVsbHB0ci4KLSAgICB0bE5CTG9nV3JpdGVyID0gJm1EdW1teU5CTG9nV3JpdGVyOworICAgIHRsTkJMb2dXcml0ZXIgPSBtRHVtbXlOQkxvZ1dyaXRlci5nZXQoKTsKICAgICBmb3IgKDs7KSB7CiAKICAgICAgICAgLy8gZWl0aGVyIG5hbm9zbGVlcCwgc2NoZWRfeWllbGQsIG9yIGJ1c3kgd2FpdApAQCAtMTIzLDkgKzEyMiw5IEBACiAKICAgICAgICAgICAgIC8vIEFzIHNvb24gYXMgcG9zc2libGUgb2YgbGVhcm5pbmcgb2YgYSBuZXcgZHVtcCBhcmVhLCBzdGFydCB1c2luZyBpdAogICAgICAgICAgICAgbUR1bXBTdGF0ZSA9IG5leHQtPm1EdW1wU3RhdGUgIT0gTlVMTCA/IG5leHQtPm1EdW1wU3RhdGUgOiBtRHVtbXlEdW1wU3RhdGU7Ci0gICAgICAgICAgICBtTkJMb2dXcml0ZXIgPSBuZXh0LT5tTkJMb2dXcml0ZXIgIT0gTlVMTCA/IG5leHQtPm1OQkxvZ1dyaXRlciA6ICZtRHVtbXlOQkxvZ1dyaXRlcjsKLSAgICAgICAgICAgIHNldE5CTG9nV3JpdGVyKG1OQkxvZ1dyaXRlcik7ICAgLy8gRmFzdE1peGVyIGluZm9ybXMgaXRzIEF1ZGlvTWl4ZXIsIEZhc3RDYXB0dXJlIGlnbm9yZXMKLSAgICAgICAgICAgIHRsTkJMb2dXcml0ZXIgPSBtTkJMb2dXcml0ZXI7CisgICAgICAgICAgICB0bE5CTG9nV3JpdGVyID0gbmV4dC0+bU5CTG9nV3JpdGVyICE9IE5VTEwgPworICAgICAgICAgICAgICAgICAgICBuZXh0LT5tTkJMb2dXcml0ZXIgOiBtRHVtbXlOQkxvZ1dyaXRlci5nZXQoKTsKKyAgICAgICAgICAgIHNldE5CTG9nV3JpdGVyKHRsTkJMb2dXcml0ZXIpOyAvLyBGYXN0TWl4ZXIgaW5mb3JtcyBpdHMgQXVkaW9NaXhlciwgRmFzdENhcHR1cmUgaWdub3JlcwogCiAgICAgICAgICAgICAvLyBXZSB3YW50IHRvIGFsd2F5cyBoYXZlIGEgdmFsaWQgcmVmZXJlbmNlIHRvIHRoZSBwcmV2aW91cyAobm9uLWlkbGUpIHN0YXRlLgogICAgICAgICAgICAgLy8gSG93ZXZlciwgdGhlIHN0YXRlIHF1ZXVlIG9ubHkgZ3VhcmFudGVlcyBhY2Nlc3MgdG8gY3VycmVudCBhbmQgcHJldmlvdXMgc3RhdGVzLgpAQCAtMjYwLDYgKzI1OSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtSXNXYXJtID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1NZWFzdXJlZFdhcm11cFRzID0gbU1lYXN1cmVkV2FybXVwVHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBtRHVtcFN0YXRlLT5tV2FybXVwQ3ljbGVzID0gbVdhcm11cEN5Y2xlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtZWFzdXJlZFdhcm11cE1zID0gKG1NZWFzdXJlZFdhcm11cFRzLnR2X3NlYyAqIDFlMykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobU1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyAqIDFlLTYpOworICAgICAgICAgICAgICAgICAgICAgICAgTE9HX1dBUk1VUF9USU1FKG1lYXN1cmVkV2FybXVwTXMpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1TbGVlcE5zID0gLTE7CkBAIC0yNzAsNiArMjcyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJ1bmRlcnJ1bjogdGltZSBzaW5jZSBsYXN0IGN5Y2xlICVkLiUwM2xkIHNlYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIHNlYywgbnNlYyAvIDEwMDAwMDBMKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1VbmRlcnJ1bnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR19VTkRFUlJVTihhdWRpb191dGlsc19uc19mcm9tX3RpbWVzcGVjKCZuZXdUcykpOwogICAgICAgICAgICAgICAgICAgICAgICAgbUlnbm9yZU5leHRPdmVycnVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuc2VjIDwgbU92ZXJydW5OcykgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1JZ25vcmVOZXh0T3ZlcnJ1bikgewpAQCAtMjc5LDYgKzI4Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm92ZXJydW46IHRpbWUgc2luY2UgbGFzdCBjeWNsZSAlZC4lMDNsZCBzZWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgc2VjLCBuc2VjIC8gMTAwMDAwMEwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1PdmVycnVucysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR19PVkVSUlVOKGF1ZGlvX3V0aWxzX25zX2Zyb21fdGltZXNwZWMoJm5ld1RzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGZvcmNlcyBhIG1pbmltdW0gY3ljbGUgdGltZS4gSXQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBjb21wZW5zYXRlcyBmb3IgYW4gYXVkaW8gSEFMIHdpdGggaml0dGVyIGR1ZSB0byBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uCkBAIC0zMzksNiArMzQzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2Ugc3RvcmVzICMxLCAjMiwgIzMgYXJlIG5vdCBhdG9taWMgd2l0aCByZXNwZWN0IHRvIGVhY2ggb3RoZXIsCiAgICAgICAgICAgICAgICAgICAgIC8vIG9yIHdpdGggcmVzcGVjdCB0byBzdG9yZSAjNCBiZWxvdwogICAgICAgICAgICAgICAgICAgICBtRHVtcFN0YXRlLT5tTW9ub3RvbmljTnNbaV0gPSBtb25vdG9uaWNOczsKKyAgICAgICAgICAgICAgICAgICAgTE9HX1dPUktfVElNRShtb25vdG9uaWNOcyk7CiAgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1Mb2FkTnNbaV0gPSBsb2FkTnM7CiAjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCiAgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1DcHVrSHpbaV0gPSBrSHo7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuaAppbmRleCAyYTcxNDE0Li4zZjZiMjA2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmgKQEAgLTc4LDEyICs3OCwxMSBAQAogICAgIHVuc2lnbmVkICAgICAgICBtQ29sZEdlbjsgICAgICAgLy8gbGFzdCBvYnNlcnZlZCBtQ29sZEdlbgogICAgIGJvb2wgICAgICAgICAgICBtSXNXYXJtOyAgICAgICAgLy8gdHJ1ZSBtZWFucyByZWFkeSB0byBtaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxzZSBtZWFucyB3YWl0IGZvciB3YXJtdXAgYmVmb3JlIG1peGluZwotICAgIHN0cnVjdCB0aW1lc3BlYyBtTWVhc3VyZWRXYXJtdXBUczsgIC8vIGhvdyBsb25nIGRpZCBpdCB0YWtlIGZvciB3YXJtdXAgdG8gY29tcGxldGUKLSAgICB1aW50MzJfdCAgICAgICAgbVdhcm11cEN5Y2xlczsgIC8vIGNvdW50ZXIgb2YgbnVtYmVyIG9mIGxvb3AgY3ljbGVzIGR1cmluZyB3YXJtdXAgcGhhc2UKLSAgICB1aW50MzJfdCAgICAgICAgbVdhcm11cENvbnNlY3V0aXZlSW5SYW5nZUN5Y2xlczsgICAgLy8gbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGN5Y2xlcyBpbiByYW5nZQotICAgIE5CTG9nOjpXcml0ZXIgICBtRHVtbXlOQkxvZ1dyaXRlcjsKLSAgICBOQkxvZzo6V3JpdGVyKiAgbU5CTG9nV3JpdGVyOyAgIC8vIGFsd2F5cyBub24tbnVsbHB0cjogcmVhbCBOQkxvZzo6V3JpdGVyKiBvciAmbUR1bW15TkJMb2dXcml0ZXIKLSAgICBzdGF0dXNfdCAgICAgICAgbVRpbWVzdGFtcFN0YXR1czsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgICBtTWVhc3VyZWRXYXJtdXBUczsgIC8vIGhvdyBsb25nIGRpZCBpdCB0YWtlIGZvciB3YXJtdXAgdG8gY29tcGxldGUKKyAgICB1aW50MzJfdCAgICAgICAgICBtV2FybXVwQ3ljbGVzOyAgLy8gY291bnRlciBvZiBudW1iZXIgb2YgbG9vcCBjeWNsZXMgZHVyaW5nIHdhcm11cCBwaGFzZQorICAgIHVpbnQzMl90ICAgICAgICAgIG1XYXJtdXBDb25zZWN1dGl2ZUluUmFuZ2VDeWNsZXM7ICAgIC8vIG51bWJlciBvZiBjb25zZWN1dGl2ZSBjeWNsZXMgaW4gcmFuZ2UKKyAgICBjb25zdCBzcDxOQkxvZzo6V3JpdGVyPiBtRHVtbXlOQkxvZ1dyaXRlcntuZXcgTkJMb2c6OldyaXRlcigpfTsKKyAgICBzdGF0dXNfdCAgICAgICAgICBtVGltZXN0YW1wU3RhdHVzOwogCiAgICAgRmFzdFRocmVhZFN0YXRlOjpDb21tYW5kIG1Db21tYW5kOwogICAgIGJvb2wgICAgICAgICAgICBtQXR0ZW1wdGVkV3JpdGU7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTW1hcFRyYWNrcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL01tYXBUcmFja3MuaAppbmRleCA2ZjU0NmMzLi45NjhkNWFhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTW1hcFRyYWNrcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9NbWFwVHJhY2tzLmgKQEAgLTI4LDYgKzI4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKQEAgLTM5LDggKzQwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbik7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICBzdG9wKCk7CiAgICAgdmlydHVhbCBib29sICAgICAgICBpc0Zhc3RUcmFjaygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgICAgICBib29sICAgICAgICBpc0RpcmVjdCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KIAotICAgICBzdGF0aWMgdm9pZCAgICAgICAgYXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpOworICAgICAgICAgICAgdm9pZCAgICAgICAgYXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgYXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvdGVjdGVkIGJ5IE1NYXBUaHJlYWQ6Om1Mb2NrCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTkJBSU9fVGVlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9OQkFJT19UZWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMDgzZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTkJBSU9fVGVlLmNwcApAQCAtMCwwICsxLDUxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTkJBSU9fVGVlIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxmdXR1cmU+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9mb3JtYXQuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9zbmRmaWxlLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUGlwZVJlYWRlci5oPgorCisjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgIk5CQUlPX1RlZS5oIgorCisvLyBFbmFibGVkIHdpdGggVEVFX1NJTksgaW4gQ29uZmlndXJhdGlvbi5oCisjaWZkZWYgVEVFX1NJTksKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKgorIFRlZSBmaWxlbmFtZXMgZ2VuZXJhdGVkIGFzIGZvbGxvd3M6CisKKyAiYWZ0ZWVfRGF0ZV9UaHJlYWRJZF9DX3JlYXNvbi53YXYiIFJlY29yZFRocmVhZAorICJhZnRlZV9EYXRlX1RocmVhZElkX01fcmVhc29uLndhdiIgTWl4ZXJUaHJlYWQgKE5vcm1hbCkKKyAiYWZ0ZWVfRGF0ZV9UaHJlYWRJZF9GX3JlYXNvbi53YXYiIE1peGVyVGhyZWFkIChGYXN0KQorICJhZnRlZV9EYXRlX1RocmVhZElkX1RyYWNrSWRfUl9yZWFzb24ud2F2IiBSZWNvcmRUcmFjaworICJhZnRlZV9EYXRlX1RocmVhZElkX1RyYWNrSWRfVHJhY2tOYW1lX1RfcmVhc29uLndhdiIgUGxheWJhY2tUcmFjaworCisgd2hlcmUgRGF0ZSA9IFlZWVltbWRkX0hITU1TU19NU0VDCisKKyB3aGVyZSBSZWFzb24gPSBbIERUT1IgfCBEVU1QIHwgUkVNT1ZFIF0KKworIEV4YW1wbGVzOgorICBhZnRlZV8yMDE4MDQyNF8xNTM4MTFfMDM4XzEzXzU3XzJfVF9SRU1PVkUud2F2CisgIGFmdGVlXzIwMTgwNDI0XzE1MzgxMV8yMThfMTNfNTdfMl9UX1JFTU9WRS53YXYKKyAgYWZ0ZWVfMjAxODA0MjRfMTUzODExXzM3OF8xM181N18yX1RfUkVNT1ZFLndhdgorICBhZnRlZV8yMDE4MDQyNF8xNTM4MjVfMTQ3XzYyX0NfRFVNUC53YXYKKyAgYWZ0ZWVfMjAxODA0MjRfMTUzODI1XzE0OF82Ml81OV9SX0RVTVAud2F2CisgIGFmdGVlXzIwMTgwNDI0XzE1MzgyNV8xNDlfMTNfRl9EVU1QLndhdgorICBhZnRlZV8yMDE4MDQyNF8xNTM4NDJfMTI1XzYyXzU5X1JfUkVNT1ZFLndhdgorICBhZnRlZV8yMDE4MDQyNF8xNTM4NDJfMTY4XzYyX0NfRFRPUi53YXYKKyovCisKK3N0YXRpYyBjb25zdGV4cHIgY2hhciBERUZBVUxUX1BSRUZJWFtdID0gImFmdGVlXyI7CitzdGF0aWMgY29uc3RleHByIGNoYXIgREVGQVVMVF9ESVJFQ1RPUllbXSA9ICIvZGF0YS9taXNjL2F1ZGlvc2VydmVyIjsKK3N0YXRpYyBjb25zdGV4cHIgc2l6ZV90IERFRkFVTFRfVEhSRUFEUE9PTF9TSVpFID0gODsKKworLyoqIEF1ZGlvRmlsZUhhbmRsZXIgbWFuYWdlcyB0ZW1wb3JhcnkgYXVkaW8gd2F2IGZpbGVzIHdpdGggYSBsZWFzdCByZWNlbnRseSBjcmVhdGVkCisgICAgcmV0ZW50aW9uIHBvbGljeS4KKworICAgIFRoZSB0ZW1wb3JhcnkgZmlsZW5hbWVzIGFyZSBzeXN0ZW1hdGljYWxseSBnZW5lcmF0ZWQuIEEgY29tbW9uIGZpbGVuYW1lIHByZWZpeCwKKyAgICBzdG9yYWdlIGRpcmVjdG9yeSwgYW5kIGNvbmN1cnJlbmN5IHBvb2wgYXJlIHBhc3NlZCBpbiBvbiBjcmVhdGluZyB0aGUgb2JqZWN0LgorCisgICAgVGVtcG9yYXJ5IGZpbGVzIGFyZSBjcmVhdGVkIGJ5ICJjcmVhdGUiLCB3aGljaCByZXR1cm5zIGEgZmlsZW5hbWUgZ2VuZXJhdGVkIGJ5CisKKyAgICBwcmVmaXggKyAxNCBjaGFyIGRhdGUgKyBzdWZmaXgKKworICAgIFRPRE8gTW92ZSB0byBhdWRpb191dGlscy4KKyAgICBUT0RPIEF2b2lkIHBvaW50aW5nIHR3byBBdWRpb0ZpbGVIYW5kbGVycyB0byB0aGUgc2FtZSBkaXJlY3RvcnkgYW5kIHByZWZpeAorICAgIGFzIHdlIGRvbid0IGhhdmUgYSBwcmVmaXggc3BlY2lmaWMgbG9jayBmaWxlLiAqLworCitjbGFzcyBBdWRpb0ZpbGVIYW5kbGVyIHsKK3B1YmxpYzoKKworICAgIEF1ZGlvRmlsZUhhbmRsZXIoY29uc3Qgc3RkOjpzdHJpbmcgJnByZWZpeCwgY29uc3Qgc3RkOjpzdHJpbmcgJmRpcmVjdG9yeSwgc2l6ZV90IHBvb2wpCisgICAgICAgIDogbVRocmVhZFBvb2wocG9vbCkKKyAgICAgICAgLCBtUHJlZml4KHByZWZpeCkKKyAgICB7CisgICAgICAgICh2b2lkKXNldERpcmVjdG9yeShkaXJlY3RvcnkpOworICAgIH0KKworICAgIC8qKiByZXR1cm5zIGZpbGVuYW1lIG9mIGNyZWF0ZWQgYXVkaW8gZmlsZSwgZWxzZSBlbXB0eSBzdHJpbmcgb24gZmFpbHVyZS4gKi8KKyAgICBzdGQ6OnN0cmluZyBjcmVhdGUoCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNzaXplX3QgLyogZnJhbWVzX3JlYWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICogLyogYnVmZmVyICovLCBzaXplX3QgLyogc2l6ZV9pbl9mcmFtZXMgKi8pPiByZWFkZXIsCisgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnN1ZmZpeCk7CisKK3ByaXZhdGU6CisgICAgLyoqIHNldHMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiB0aGlzIGlzIGN1cnJlbnRseSBwcml2YXRlIHRvIGF2b2lkIGNvbmZ1c2lvbgorICAgICAgICB3aGVuIGNoYW5naW5nIHdoaWxlIHBlbmRpbmcgb3BlcmF0aW9ucyBhcmUgb2NjdXJyaW5nIChpdCdzIG9rYXksIGJ1dAorICAgICAgICB3ZWFrbHkgc3luY2hyb25pemVkKS4gKi8KKyAgICBzdGF0dXNfdCBzZXREaXJlY3RvcnkoY29uc3Qgc3RkOjpzdHJpbmcgJmRpcmVjdG9yeSk7CisKKyAgICAvKiogY2xlYW5zIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCByZXR1cm5zIHRoZSBkaXJlY3RvcnkgbmFtZSBkb25lLiAqLworICAgIHN0YXR1c190IGNsZWFuKHN0ZDo6c3RyaW5nICpkaXIgPSBudWxscHRyKTsKKworICAgIC8qKiBjcmVhdGVzIGFuIGF1ZGlvIGZpbGUgZnJvbSBhIHJlYWRlciBmdW5jdG9yIHBhc3NlZCBpbi4gKi8KKyAgICBzdGF0dXNfdCBjcmVhdGVJbnRlcm5hbCgKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3NpemVfdCAvKiBmcmFtZXNfcmVhZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiAvKiBidWZmZXIgKi8sIHNpemVfdCAvKiBzaXplX2luX2ZyYW1lcyAqLyk+IHJlYWRlciwKKyAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmZmlsZW5hbWUpOworCisgICAgc3RhdGljIGJvb2wgaXNEaXJlY3RvcnlWYWxpZChjb25zdCBzdGQ6OnN0cmluZyAmZGlyZWN0b3J5KSB7CisgICAgICAgIHJldHVybiBkaXJlY3Rvcnkuc2l6ZSgpID4gMCAmJiBkaXJlY3RvcnlbMF0gPT0gJy8nOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlRmlsZW5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJnN1ZmZpeCkgY29uc3QgeworICAgICAgICBjaGFyIGZpbGVUaW1lW3NpemVvZigiWVlZWW1tZGRfSEhNTVNTX1wwIildOworICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICAgICAgZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisgICAgICAgIHN0cnVjdCB0bSB0bTsKKyAgICAgICAgbG9jYWx0aW1lX3IoJnR2LnR2X3NlYywgJnRtKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihzdHJmdGltZShmaWxlVGltZSwgc2l6ZW9mKGZpbGVUaW1lKSwgIiVZJW0lZF8lSCVNJVNfIiwgJnRtKSA9PSAwLAorICAgICAgICAgICAgImluY29ycmVjdCBmaWxlVGltZSBidWZmZXIiKTsKKyAgICAgICAgY2hhciBtc2VjWzRdOworICAgICAgICAodm9pZClzbnByaW50Zihtc2VjLCBzaXplb2YobXNlYyksICIlMDNkIiwgKGludCkodHYudHZfdXNlYyAvIDEwMDApKTsKKyAgICAgICAgcmV0dXJuIG1QcmVmaXggKyBmaWxlVGltZSArIG1zZWMgKyBzdWZmaXggKyAiLndhdiI7CisgICAgfQorCisgICAgYm9vbCBpc01hbmFnZWRGaWxlbmFtZShjb25zdCBjaGFyICpuYW1lKSB7CisgICAgICAgIGNvbnN0ZXhwciBzaXplX3QgRklMRU5BTUVfTEVOX0RBVEUgPSA0ICsgMiArIDIgLy8gJVklbSVkJQorICAgICAgICAgICAgKyAxICsgMiArIDIgKyAyIC8vIF9IJU0lUworICAgICAgICAgICAgKyAxICsgMzsgLy9fTVNFQworICAgICAgICBjb25zdCBzaXplX3QgcHJlZml4TGVuID0gbVByZWZpeC5zaXplKCk7CisgICAgICAgIGNvbnN0IHNpemVfdCBuYW1lTGVuID0gc3RybGVuKG5hbWUpOworCisgICAgICAgIC8vIHJlamVjdCBvbiBzaXplLCBwcmVmaXgsIGFuZCAud2F2CisgICAgICAgIGlmIChuYW1lTGVuIDwgcHJlZml4TGVuICsgRklMRU5BTUVfTEVOX0RBVEUgKyA0IC8qIC53YXYgKi8KKyAgICAgICAgICAgICB8fCBzdHJuY21wKG5hbWUsIG1QcmVmaXguY19zdHIoKSwgcHJlZml4TGVuKSAhPSAwCisgICAgICAgICAgICAgfHwgc3RyY21wKG5hbWUgKyBuYW1lTGVuIC0gNCwgIi53YXYiKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyB2YWxpZGF0ZSBkYXRlIHBvcnRpb24KKyAgICAgICAgY29uc3QgY2hhciAqZGF0ZSA9IG5hbWUgKyBwcmVmaXhMZW47CisgICAgICAgIHJldHVybiBzdGQ6OmFsbF9vZihkYXRlLCBkYXRlICsgOCwgaXNkaWdpdCkKKyAgICAgICAgICAgICYmIGRhdGVbOF0gPT0gJ18nCisgICAgICAgICAgICAmJiBzdGQ6OmFsbF9vZihkYXRlICsgOSwgZGF0ZSArIDE1LCBpc2RpZ2l0KQorICAgICAgICAgICAgJiYgZGF0ZVsxNV0gPT0gJ18nCisgICAgICAgICAgICAmJiBzdGQ6OmFsbF9vZihkYXRlICsgMTYsIGRhdGUgKyAxOSwgaXNkaWdpdCk7CisgICAgfQorCisgICAgLy8geWV0IGFub3RoZXIgVGhyZWFkUG9vbCBpbXBsZW1lbnRhdGlvbi4KKyAgICBjbGFzcyBUaHJlYWRQb29sIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFRocmVhZFBvb2woc2l6ZV90IHNpemUpCisgICAgICAgICAgICA6IG1UaHJlYWRQb29sU2l6ZShzaXplKQorICAgICAgICB7IH0KKworICAgICAgICAvKiogbGF1bmNoZXMgdGFzayAibmFtZSIgd2l0aCBhc3NvY2lhdGVkIGZ1bmN0aW9uICJmdW5jIi4KKyAgICAgICAgICAgIGlmIHRoZSB0aHJlYWRwb29sIGlzIGV4aGF1c3RlZCwgaXQgd2lsbCBsYXVuY2ggb24gY2FsbGluZyBmdW5jdGlvbiAqLworICAgICAgICBzdGF0dXNfdCBsYXVuY2goY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIHN0ZDo6ZnVuY3Rpb248c3RhdHVzX3QoKT4gZnVuYyk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjpwYWlyPAorICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nLCBzdGQ6OmZ1dHVyZTxzdGF0dXNfdD4+PiBtRnV0dXJlczsgLy8gR1VBUkRFRF9CWShtTG9jaykKKworICAgICAgICBjb25zdCBzaXplX3QgbVRocmVhZFBvb2xTaXplOworICAgIH0gbVRocmVhZFBvb2w7CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBtUHJlZml4OworICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgc3RkOjpzdHJpbmcgbURpcmVjdG9yeTsgICAgICAgICAvLyBHVUFSREVEX0JZKG1Mb2NrKQorICAgIHN0ZDo6ZGVxdWU8c3RkOjpzdHJpbmc+IG1GaWxlczsgLy8gR1VBUkRFRF9CWShtTG9jaykgIHNvcnRlZCBsaXN0IG9mIGZpbGVzIGJ5IGNyZWF0aW9uIHRpbWUKKworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IEZSQU1FU19QRVJfUkVBRCA9IDEwMjQ7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgTUFYX0ZJTEVTX1JFQUQgPSAxMDI0OworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IE1BWF9GSUxFU19LRUVQID0gMzI7Cit9OworCisvKiBzdGF0aWMgKi8KK3ZvaWQgTkJBSU9fVGVlOjpOQkFJT19UZWVJbXBsOjpkdW1wVGVlKAorICAgICAgICBpbnQgZmQsIGNvbnN0IE5CQUlPX1NpbmtTb3VyY2UgJnNpbmtTb3VyY2UsIGNvbnN0IHN0ZDo6c3RyaW5nICZzdWZmaXgpCit7CisgICAgLy8gU2luZ2xldG9uLiBDb25zdHJ1Y3RlZCB0aHJlYWQtc2FmZSBvbiBmaXJzdCBjYWxsLCBuZXZlciBkZXN0cm95ZWQuCisgICAgc3RhdGljIEF1ZGlvRmlsZUhhbmRsZXIgYXVkaW9GaWxlSGFuZGxlcigKKyAgICAgICAgICAgIERFRkFVTFRfUFJFRklYLCBERUZBVUxUX0RJUkVDVE9SWSwgREVGQVVMVF9USFJFQURQT09MX1NJWkUpOworCisgICAgYXV0byAmc291cmNlID0gc2lua1NvdXJjZS5zZWNvbmQ7CisgICAgaWYgKHNvdXJjZS5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBOQkFJT19Gb3JtYXQgZm9ybWF0ID0gc291cmNlLT5mb3JtYXQoKTsKKyAgICBib29sIGZpcnN0UmVhZCA9IHRydWU7CisgICAgc3RkOjpzdHJpbmcgZmlsZW5hbWUgPSBhdWRpb0ZpbGVIYW5kbGVyLmNyZWF0ZSgKKyAgICAgICAgICAgIC8vIHRoaXMgZnVuY3RvciBtdXN0IG5vdCBob2xkIHJlZmVyZW5jZXMgdG8gc3RhY2sKKyAgICAgICAgICAgIFtmaXJzdFJlYWQsIHNpbmtTb3VyY2VdICh2b2lkICpidWZmZXIsIHNpemVfdCBmcmFtZXMpIG11dGFibGUgeworICAgICAgICAgICAgICAgICAgICBhdXRvICZzb3VyY2UgPSBzaW5rU291cmNlLnNlY29uZDsKKyAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBhY3R1YWxSZWFkID0gc291cmNlLT5yZWFkKGJ1ZmZlciwgZnJhbWVzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjdHVhbFJlYWQgPT0gKHNzaXplX3QpT1ZFUlJVTiAmJiBmaXJzdFJlYWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY2hlY2sgb25jZQorICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsUmVhZCA9IHNvdXJjZS0+cmVhZChidWZmZXIsIGZyYW1lcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZmlyc3RSZWFkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhY3R1YWxSZWFkOworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICBGb3JtYXRfc2FtcGxlUmF0ZShmb3JtYXQpLAorICAgICAgICAgICAgRm9ybWF0X2NoYW5uZWxDb3VudChmb3JtYXQpLAorICAgICAgICAgICAgZm9ybWF0Lm1Gb3JtYXQsCisgICAgICAgICAgICBzdWZmaXgpOworCisgICAgaWYgKGZkID49IDAgJiYgZmlsZW5hbWUuc2l6ZSgpID4gMCkgeworICAgICAgICBkcHJpbnRmKGZkLCAidGVlIHdyb3RlIHRvICVzXG4iLCBmaWxlbmFtZS5jX3N0cigpKTsKKyAgICB9Cit9CisKKy8qIHN0YXRpYyAqLworTkJBSU9fVGVlOjpOQkFJT19UZWVJbXBsOjpOQkFJT19TaW5rU291cmNlIE5CQUlPX1RlZTo6TkJBSU9fVGVlSW1wbDo6bWFrZVNpbmtTb3VyY2UoCisgICAgICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCAmZm9ybWF0LCBzaXplX3QgZnJhbWVzLCBib29sICplbmFibGVkKQoreworICAgIGlmIChGb3JtYXRfaXNWYWxpZChmb3JtYXQpICYmIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0Lm1Gb3JtYXQpKSB7CisgICAgICAgIFBpcGUgKnBpcGUgPSBuZXcgUGlwZShmcmFtZXMsIGZvcm1hdCk7CisgICAgICAgIHNpemVfdCBudW1Db3VudGVyT2ZmZXJzID0gMDsKKyAgICAgICAgY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyc1sxXSA9IHtmb3JtYXR9OworICAgICAgICBzc2l6ZV90IGluZGV4ID0gcGlwZS0+bmVnb3RpYXRlKG9mZmVycywgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7CisgICAgICAgIGlmIChpbmRleCAhPSAwKSB7CisgICAgICAgICAgICBBTE9HVygicGlwZSBmYWlsdXJlIHRvIG5lZ290aWF0ZTogJXpkIiwgaW5kZXgpOworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisgICAgICAgIFBpcGVSZWFkZXIgKnBpcGVSZWFkZXIgPSBuZXcgUGlwZVJlYWRlcigqcGlwZSk7CisgICAgICAgIG51bUNvdW50ZXJPZmZlcnMgPSAwOworICAgICAgICBpbmRleCA9IHBpcGVSZWFkZXItPm5lZ290aWF0ZShvZmZlcnMsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOworICAgICAgICBpZiAoaW5kZXggIT0gMCkgeworICAgICAgICAgICAgQUxPR1coInBpcGVSZWFkZXIgZmFpbHVyZSB0byBuZWdvdGlhdGU6ICV6ZCIsIGluZGV4KTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZW5hYmxlZCAhPSBudWxscHRyKSAqZW5hYmxlZCA9IHRydWU7CisgICAgICAgIHJldHVybiB7cGlwZSwgcGlwZVJlYWRlcn07CisgICAgfQorZXhpdDoKKyAgICBpZiAoZW5hYmxlZCAhPSBudWxscHRyKSAqZW5hYmxlZCA9IGZhbHNlOworICAgIHJldHVybiB7bnVsbHB0ciwgbnVsbHB0cn07Cit9CisKK3N0ZDo6c3RyaW5nIEF1ZGlvRmlsZUhhbmRsZXI6OmNyZWF0ZSgKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxzc2l6ZV90IC8qIGZyYW1lc19yZWFkICovCisgICAgICAgICAgICAgICAgICAgICh2b2lkICogLyogYnVmZmVyICovLCBzaXplX3QgLyogc2l6ZV9pbl9mcmFtZXMgKi8pPiByZWFkZXIsCisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCwKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc3VmZml4KQoreworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGZpbGVuYW1lID0gZ2VuZXJhdGVGaWxlbmFtZShzdWZmaXgpOworCisgICAgaWYgKG1UaHJlYWRQb29sLmxhdW5jaChzdGQ6OnN0cmluZygiY3JlYXRlICIpICsgZmlsZW5hbWUsCisgICAgICAgICAgICBbPV0oKSB7IHJldHVybiBjcmVhdGVJbnRlcm5hbChyZWFkZXIsIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCwgZm9ybWF0LCBmaWxlbmFtZSk7IH0pCisgICAgICAgICAgICA9PSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gZmlsZW5hbWU7CisgICAgfQorICAgIHJldHVybiAiIjsKK30KKworc3RhdHVzX3QgQXVkaW9GaWxlSGFuZGxlcjo6c2V0RGlyZWN0b3J5KGNvbnN0IHN0ZDo6c3RyaW5nICZkaXJlY3RvcnkpCit7CisgICAgaWYgKCFpc0RpcmVjdG9yeVZhbGlkKGRpcmVjdG9yeSkpIHJldHVybiBCQURfVkFMVUU7CisKKyAgICAvLyBUT0RPOiBjb25zaWRlciB1c2luZyBzdGQ6OmZpbGVzeXN0ZW0gaW4gQysrMTcKKyAgICBESVIgKmRpciA9IG9wZW5kaXIoZGlyZWN0b3J5LmNfc3RyKCkpOworCisgICAgaWYgKGRpciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCIlczogY2Fubm90IG9wZW4gZGlyZWN0b3J5ICVzIiwgX19mdW5jX18sIGRpcmVjdG9yeS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzaXplX3QgdG9SZW1vdmUgPSAwOworICAgIGRlY2x0eXBlKG1GaWxlcykgZmlsZXM7CisKKyAgICB3aGlsZSAoZmlsZXMuc2l6ZSgpIDwgTUFYX0ZJTEVTX1JFQUQpIHsKKyAgICAgICAgZXJybm8gPSAwOworICAgICAgICBjb25zdCBzdHJ1Y3QgZGlyZW50ICpyZXN1bHQgPSByZWFkZGlyKGRpcik7CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR1dfSUYoZXJybm8gIT0gMCwgIiVzOiByZWFkZGlyIGZhaWx1cmUgJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIGlzIGl0IGEgbWFuYWdlZCBmaWxlbmFtZT8KKyAgICAgICAgaWYgKCFpc01hbmFnZWRGaWxlbmFtZShyZXN1bHQtPmRfbmFtZSkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZpbGVzLmVtcGxhY2VfYmFjayhyZXN1bHQtPmRfbmFtZSk7CisgICAgfQorICAgICh2b2lkKWNsb3NlZGlyKGRpcik7CisKKyAgICAvLyBPUFRJTUlaQVRJT046IHdlIGRvbid0IG5lZWQgdG8gc3RhdCBlYWNoIGZpbGUsIHRoZSBmaWxlbmFtZXMgbmFtZXMgYXJlCisgICAgLy8gYWxyZWFkeSAocm91Z2hseSkgb3JkZXJlZCBieSBjcmVhdGlvbiBkYXRlLiAgd2UgdXNlIHN0ZDo6ZGVxdWUgaW5zdGVhZAorICAgIC8vIG9mIHN0ZDo6c2V0IGZvciBmYXN0ZXIgaW5zZXJ0aW9uIGFuZCBzb3J0aW5nIHRpbWVzLgorCisgICAgaWYgKGZpbGVzLnNpemUoKSA+IE1BWF9GSUxFU19LRUVQKSB7CisgICAgICAgIC8vIHJlbW92ZWQgZmlsZXMgY2FuIHVzZSBhIHBhcnRpdGlvbiAobm8gbmVlZCB0byBkbyBhIGZ1bGwgc29ydCkuCisgICAgICAgIHRvUmVtb3ZlID0gZmlsZXMuc2l6ZSgpIC0gTUFYX0ZJTEVTX0tFRVA7CisgICAgICAgIHN0ZDo6bnRoX2VsZW1lbnQoZmlsZXMuYmVnaW4oKSwgZmlsZXMuYmVnaW4oKSArIHRvUmVtb3ZlIC0gMSwgZmlsZXMuZW5kKCkpOworICAgIH0KKworICAgIC8vIGtlcHQgZmlsZXMgbXVzdCBiZSBzb3J0ZWQuCisgICAgc3RkOjpzb3J0KGZpbGVzLmJlZ2luKCkgKyB0b1JlbW92ZSwgZmlsZXMuZW5kKCkpOworCisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobUxvY2spOworCisgICAgICAgIG1EaXJlY3RvcnkgPSBkaXJlY3Rvcnk7CisgICAgICAgIG1GaWxlcyA9IHN0ZDo6bW92ZShmaWxlcyk7CisgICAgfQorCisgICAgaWYgKHRvUmVtb3ZlID4gMCkgeyAvLyBsYXVuY2ggYSBjbGVhbiBpbiBiYWNrZ3JvdW5kLgorICAgICAgICAodm9pZCltVGhyZWFkUG9vbC5sYXVuY2goCisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoImNsZWFuaW5nICIpICsgZGlyZWN0b3J5LCBbdGhpc10oKSB7IHJldHVybiBjbGVhbigpOyB9KTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb0ZpbGVIYW5kbGVyOjpjbGVhbihzdGQ6OnN0cmluZyAqZGlyZWN0b3J5KQoreworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBmaWxlc1RvUmVtb3ZlOworICAgIHN0ZDo6c3RyaW5nIGRpcjsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisKKyAgICAgICAgaWYgKCFpc0RpcmVjdG9yeVZhbGlkKG1EaXJlY3RvcnkpKSByZXR1cm4gTk9fSU5JVDsKKworICAgICAgICBkaXIgPSBtRGlyZWN0b3J5OworICAgICAgICBpZiAobUZpbGVzLnNpemUoKSA+IE1BWF9GSUxFU19LRUVQKSB7CisgICAgICAgICAgICBzaXplX3QgdG9SZW1vdmUgPSBtRmlsZXMuc2l6ZSgpIC0gTUFYX0ZJTEVTX0tFRVA7CisKKyAgICAgICAgICAgIC8vIHVzZSBtb3ZlIGFuZCBlcmFzZSB0byBlZmZpY2llbnRseSB0cmFuc2ZlciBzdGQ6OnN0cmluZworICAgICAgICAgICAgc3RkOjptb3ZlKG1GaWxlcy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICBtRmlsZXMuYmVnaW4oKSArIHRvUmVtb3ZlLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIoZmlsZXNUb1JlbW92ZSkpOworICAgICAgICAgICAgbUZpbGVzLmVyYXNlKG1GaWxlcy5iZWdpbigpLCBtRmlsZXMuYmVnaW4oKSArIHRvUmVtb3ZlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGRpcnAgPSBkaXIgKyAiLyI7CisgICAgLy8gcmVtb3ZlIGZpbGVzIG91dHNpZGUgb2YgbG9jayBmb3IgYmV0dGVyIGNvbmN1cnJlbmN5LgorICAgIGZvciAoY29uc3QgYXV0byAmZmlsZSA6IGZpbGVzVG9SZW1vdmUpIHsKKyAgICAgICAgKHZvaWQpdW5saW5rKChkaXJwICsgZmlsZSkuY19zdHIoKSk7CisgICAgfQorCisgICAgLy8gcmV0dXJuIHRoZSBkaXJlY3RvcnkgaWYgcmVxdWVzdGVkLgorICAgIGlmIChkaXJlY3RvcnkgIT0gbnVsbHB0cikgeworICAgICAgICAqZGlyZWN0b3J5ID0gZGlyOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvRmlsZUhhbmRsZXI6OlRocmVhZFBvb2w6OmxhdW5jaCgKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIHN0ZDo6ZnVuY3Rpb248c3RhdHVzX3QoKT4gZnVuYykKK3sKKyAgICBpZiAobVRocmVhZFBvb2xTaXplID4gMSkgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobUxvY2spOworICAgICAgICBpZiAobUZ1dHVyZXMuc2l6ZSgpID49IG1UaHJlYWRQb29sU2l6ZSkgeworICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gbUZ1dHVyZXMuYmVnaW4oKTsgaXQgIT0gbUZ1dHVyZXMuZW5kKCk7KSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVuYW1lID0gaXQtPmZpcnN0OworICAgICAgICAgICAgICAgIHN0ZDo6ZnV0dXJlPHN0YXR1c190PiAmZnV0dXJlID0gaXQtPnNlY29uZDsKKyAgICAgICAgICAgICAgICBpZiAoIWZ1dHVyZS52YWxpZCgpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBmdXR1cmUud2FpdF9mb3Ioc3RkOjpjaHJvbm86OnNlY29uZHMoMCkpID09IHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBmdXR1cmUgJXMgcmVhZHkiLCBfX2Z1bmNfXywgZmlsZW5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGl0ID0gbUZ1dHVyZXMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogZnV0dXJlICVzIG5vdCByZWFkeSIsIF9fZnVuY19fLCBmaWxlbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1GdXR1cmVzLnNpemUoKSA8IG1UaHJlYWRQb29sU2l6ZSkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBkZWZlcnJlZCBjYWxsaW5nICVzIiwgX19mdW5jX18sIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBtRnV0dXJlcy5lbXBsYWNlX2JhY2sobmFtZSwgc3RkOjphc3luYyhzdGQ6OmxhdW5jaDo6YXN5bmMsIGZ1bmMpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiJXM6IGltbWVkaWF0ZSBjYWxsaW5nICVzIiwgX19mdW5jX18sIG5hbWUuY19zdHIoKSk7CisgICAgcmV0dXJuIGZ1bmMoKTsKK30KKworc3RhdHVzX3QgQXVkaW9GaWxlSGFuZGxlcjo6Y3JlYXRlSW50ZXJuYWwoCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3NpemVfdCAvKiBmcmFtZXNfcmVhZCAqLworICAgICAgICAgICAgICAgICAgICAodm9pZCAqIC8qIGJ1ZmZlciAqLywgc2l6ZV90IC8qIHNpemVfaW5fZnJhbWVzICovKT4gcmVhZGVyLAorICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVuYW1lKQoreworICAgIC8vIEF0dGVtcHQgdG8gY2hvb3NlIHRoZSBiZXN0IG1hdGNoaW5nIGZpbGUgZm9ybWF0LgorICAgIC8vIFdlIGNhbiBjaG9vc2UgYW55IHNmX2Zvcm1hdAorICAgIC8vIGJ1dCB3cml0ZUZvcm1hdCBtdXN0IGJlIG9uZSBvZiAxNiwgMzIsIGZsb2F0CisgICAgLy8gZHVlIHRvIHNmX3dyaXRlZiBjb21wYXRpYmlsaXR5LgorICAgIGludCBzZl9mb3JtYXQ7CisgICAgYXVkaW9fZm9ybWF0X3Qgd3JpdGVGb3JtYXQ7CisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQ6CisgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgc2ZfZm9ybWF0ID0gU0ZfRk9STUFUX1BDTV8xNjsKKyAgICAgICAgd3JpdGVGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICAgICAgQUxPR1YoIiVzOiAlcyB1c2luZyBQQ01fMTYgZm9yIGZvcm1hdCAlI3giLCBfX2Z1bmNfXywgZmlsZW5hbWUuY19zdHIoKSwgZm9ybWF0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzhfMjRfQklUOgorICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEOgorICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8zMl9CSVQ6CisgICAgICAgIHNmX2Zvcm1hdCA9IFNGX0ZPUk1BVF9QQ01fMzI7CisgICAgICAgIHdyaXRlRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8zMl9CSVQ7CisgICAgICAgIEFMT0dWKCIlczogJXMgdXNpbmcgUENNXzMyIGZvciBmb3JtYXQgJSN4IiwgX19mdW5jX18sIGZpbGVuYW1lLmNfc3RyKCksIGZvcm1hdCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgc2ZfZm9ybWF0ID0gU0ZfRk9STUFUX0ZMT0FUOworICAgICAgICB3cml0ZUZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgICAgICAgIEFMT0dWKCIlczogJXMgdXNpbmcgUENNX0ZMT0FUIGZvciBmb3JtYXQgJSN4IiwgX19mdW5jX18sIGZpbGVuYW1lLmNfc3RyKCksIGZvcm1hdCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIC8vIFRPRE86CisgICAgICAgIC8vIGhhbmRsZSBhdWRpb19oYXNfcHJvcG9ydGlvbmFsX2ZyYW1lcygpIGZvcm1hdHMuCisgICAgICAgIC8vIGhhbmRsZSBjb21wcmVzc2VkIGZvcm1hdHMgYXMgc2luZ2xlIGJ5dGUgZmlsZXMuCisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgZGlyZWN0b3J5OworICAgIHN0YXR1c190IHN0YXR1cyA9IGNsZWFuKCZkaXJlY3RvcnkpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7CisgICAgc3RkOjpzdHJpbmcgZGlyUHJlZml4ID0gZGlyZWN0b3J5ICsgIi8iOworCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgcGF0aCA9IGRpclByZWZpeCArIGZpbGVuYW1lOworCisgICAgLyogY29uc3QgKi8gU0ZfSU5GTyBpbmZvID0geworICAgICAgICAuZnJhbWVzID0gMCwKKyAgICAgICAgLnNhbXBsZXJhdGUgPSAoaW50KXNhbXBsZVJhdGUsCisgICAgICAgIC5jaGFubmVscyA9IChpbnQpY2hhbm5lbENvdW50LAorICAgICAgICAuZm9ybWF0ID0gU0ZfRk9STUFUX1dBViB8IHNmX2Zvcm1hdCwKKyAgICB9OworICAgIFNOREZJTEUgKnNmID0gc2Zfb3BlbihwYXRoLmNfc3RyKCksIFNGTV9XUklURSwgJmluZm8pOworICAgIGlmIChzZiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzaXplX3QgdG90YWwgPSAwOworICAgIHZvaWQgKmJ1ZmZlciA9IG1hbGxvYyhGUkFNRVNfUEVSX1JFQUQgKiBzdGQ6Om1heCgKKyAgICAgICAgICAgIGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUod3JpdGVGb3JtYXQpLCAvL291dHB1dCBmcmFtZXNpemUKKyAgICAgICAgICAgIGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSkpOyAvLyBpbnB1dCBmcmFtZXNpemUKKyAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgc2ZfY2xvc2Uoc2YpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIGZvciAoOzspIHsKKyAgICAgICAgY29uc3Qgc3NpemVfdCBhY3R1YWxSZWFkID0gcmVhZGVyKGJ1ZmZlciwgRlJBTUVTX1BFUl9SRUFEKTsKKyAgICAgICAgaWYgKGFjdHVhbFJlYWQgPD0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb252ZXJ0IGlucHV0IGZvcm1hdCB0byB3cml0ZUZvcm1hdCBhcyBuZWVkZWQuCisgICAgICAgIGlmIChmb3JtYXQgIT0gd3JpdGVGb3JtYXQpIHsKKyAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgd3JpdGVGb3JtYXQsIGJ1ZmZlciwgZm9ybWF0LCBhY3R1YWxSZWFkICogaW5mby5jaGFubmVscyk7CisgICAgICAgIH0KKworICAgICAgICBzc2l6ZV90IHJlYWxseVdyaXR0ZW47CisgICAgICAgIHN3aXRjaCAod3JpdGVGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgICAgIHJlYWxseVdyaXR0ZW4gPSBzZl93cml0ZWZfc2hvcnQoc2YsIChjb25zdCBpbnQxNl90ICopYnVmZmVyLCBhY3R1YWxSZWFkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUOgorICAgICAgICAgICAgcmVhbGx5V3JpdHRlbiA9IHNmX3dyaXRlZl9pbnQoc2YsIChjb25zdCBpbnQzMl90ICopYnVmZmVyLCBhY3R1YWxSZWFkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgICAgICByZWFsbHlXcml0dGVuID0gc2Zfd3JpdGVmX2Zsb2F0KHNmLCAoY29uc3QgZmxvYXQgKilidWZmZXIsIGFjdHVhbFJlYWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlczogJXMgd3JpdGVGb3JtYXQ6ICUjeCIsIF9fZnVuY19fLCBmaWxlbmFtZS5jX3N0cigpLCB3cml0ZUZvcm1hdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZWFsbHlXcml0dGVuIDwgMCkgeworICAgICAgICAgICAgQUxPR1coIiVzOiAlcyB3cml0ZSBlcnJvcjogJXpkIiwgX19mdW5jX18sIGZpbGVuYW1lLmNfc3RyKCksIHJlYWxseVdyaXR0ZW4pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdG90YWwgKz0gcmVhbGx5V3JpdHRlbjsKKyAgICAgICAgaWYgKHJlYWxseVdyaXR0ZW4gPCBhY3R1YWxSZWFkKSB7CisgICAgICAgICAgICBBTE9HVygiJXM6ICVzIHdyaXRlIHNob3J0IGNvdW50OiAlemQgPCAlemQiLAorICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGZpbGVuYW1lLmNfc3RyKCksIHJlYWxseVdyaXR0ZW4sIGFjdHVhbFJlYWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgc2ZfY2xvc2Uoc2YpOworICAgIGZyZWUoYnVmZmVyKTsKKyAgICBpZiAodG90YWwgPT0gMCkgeworICAgICAgICAodm9pZCl1bmxpbmsocGF0aC5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICB9CisKKyAgICAvLyBTdWNjZXNzOiBhZGQgb3VyIG5hbWUgdG8gbWFuYWdlZCBmaWxlcy4KKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisgICAgICAgIC8vIHdlYWsgc3luY2hyb25pemF0aW9uIC0gb25seSB1cGRhdGUgbUZpbGVzIGlmIHRoZSBkaXJlY3RvcnkgaGFzbid0IGNoYW5nZWQuCisgICAgICAgIGlmIChtRGlyZWN0b3J5ID09IGRpcmVjdG9yeSkgeworICAgICAgICAgICAgbUZpbGVzLmVtcGxhY2VfYmFjayhmaWxlbmFtZSk7ICAvLyBhZGQgdG8gdGhlIGVuZCB0byBwcmVzZXJ2ZSBzb3J0LgorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsgLy8gcmV0dXJuIGZ1bGwgcGF0aAorfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBURUVfU0lOSwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL05CQUlPX1RlZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL05CQUlPX1RlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZDhjYzgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTkJBSU9fVGVlLmgKQEAgLTAsMCArMSwzMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBFbmFibGVkIHdpdGggVEVFX1NJTksgaW4gQ29uZmlndXJhdGlvbi5oCisjaWZuZGVmIEFORFJPSURfTkJBSU9fVEVFX0gKKyNkZWZpbmUgQU5EUk9JRF9OQkFJT19URUVfSAorCisjaWZkZWYgVEVFX1NJTksKKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CQUlPLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBUaGUgTkJBSU9fVGVlIHVzZXMgdGhlIE5CQUlPIFBpcGUgYW5kIFBpcGVSZWFkZXIgZm9yIG5vbmJsb2NraW5nCisgKiBkYXRhIGNvbGxlY3Rpb24sIGZvciBldmVudHVhbCBkdW1wIHRvIGxvZyBmaWxlcy4KKyAqIFNlZSBodHRwczovL3NvdXJjZS5hbmRyb2lkLmNvbS9kZXZpY2VzL2F1ZGlvL2RlYnVnZ2luZyBmb3IgaG93IHRvCisgKiBlbmFibGUgYnkgcm8uZGVidWdnYWJsZSBhbmQgYWYudGVlIHByb3BlcnRpZXMuCisgKgorICogVGhlIHdyaXRlKCkgaW50byB0aGUgTkJBSU9fVGVlIGlzIHRoZXJlZm9yZSBub25ibG9ja2luZywKKyAqIGJ1dCBjaGFuZ2luZyBOQkFJT19UZWUgZm9ybWF0cyB3aXRoIHNldCgpIGNhbm5vdCBiZSBkb25lIGR1cmluZyBhIHdyaXRlKCk7CisgKiB1c3VhbGx5IHRoZSBjYWxsZXIgYWxyZWFkeSBpbXBsZW1lbnRzIHRoaXMgbXV0dWFsIGV4Y2x1c2lvbi4KKyAqCisgKiBBbGwgb3RoZXIgY2FsbHMgZXhjZXB0IHNldCgpIHZzIHdyaXRlKCkgbWF5IG9jY3VyIGF0IGFueSB0aW1lLgorICoKKyAqIGR1bXAoKSBkaXNydXB0aW9uIGlzIG1pbmltaXplZCB0byB0aGUgY2FsbGVyIHNpbmNlIHN5c3RlbSBjYWxscyBhcmUgZXhlY3V0ZWQKKyAqIGluIGFuIGFzeW5jaHJvbm91cyB0aHJlYWQgKHdoZW4gcG9zc2libGUpLgorICoKKyAqIEN1cnJlbnRseSB0aGUgTkJBSU9fVGVlIGlzICJoYXJkd2lyZWQiIGZvciBBdWRpb0ZsaW5nZXIgc3VwcG9ydC4KKyAqCisgKiBTb21lIEF1ZGlvRmxpbmdlciBzcGVjaWZpYyBub3RlczoKKyAqCisgKiAxKSBUZWVzIGNhcHR1cmUgb25seSBsaW5lYXIgUENNIGRhdGEuCisgKiAyKSBUZWVzIHdpdGhvdXQgYW55IGRhdGEgd3JpdHRlbiBhcmUgY29uc2lkZXJlZCBlbXB0eSBhbmQgZG8gbm90IGdlbmVyYXRlCisgKiAgICBhbnkgb3V0cHV0IGZpbGVzLgorICogMikgT25jZSBhIFRlZSBkdW1wcyBkYXRhLCBpdCBpcyBjb25zaWRlcmVkICJlbXB0aWVkIiBhbmQgbmV3IGRhdGEKKyAqICAgIG5lZWRzIHRvIGJlIHdyaXR0ZW4gYmVmb3JlIGFub3RoZXIgVGVlIGZpbGUgaXMgZ2VuZXJhdGVkLgorICogMykgVGVlIGZpbGUgZm9ybWF0IGlzCisgKiAgICBXQVYgaW50ZWdlciBQQ00gMTYgYml0IGZvciBBVURJT19GT1JNQVRfUENNXzhfQklULCBBVURJT19GT1JNQVRfUENNXzE2X0JJVC4KKyAqICAgIFdBViBpbnRlZ2VyIFBDTSAzMiBiaXQgZm9yIEFVRElPX0ZPUk1BVF9QQ01fOF8yNF9CSVQsIEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8zMl9CSVQuCisgKiAgICBXQVYgZmxvYXQgUENNIDMyIGJpdCBmb3IgQVVESU9fRk9STUFUX1BDTV9GTE9BVC4KKyAqCisgKiBJbnB1dF9UaHJlYWQ6CisgKiAxKSBDYXB0dXJlIGJ1ZmZlciBpcyB0ZWVkIHdoZW4gcmVhZCBmcm9tIHRoZSBIQUwsIGJlZm9yZSByZXNhbXBsaW5nIGZvciB0aGUgQXVkaW9SZWNvcmQKKyAqICAgIGNsaWVudC4KKyAqCisgKiBPdXRwdXRfVGhyZWFkOgorICogMSkgTWl4ZXJUaHJlYWRzIHdpbGwgdGVlIGF0IHRoZSBGYXN0TWl4ZXIgb3V0cHV0IChpZiBpdCBoYXMgb25lKSBvciBhdCB0aGUKKyAqICAgIE5vcm1hbE1peGVyIG91dHB1dCAoaWYgbm8gRmFzdE1peGVyKS4KKyAqIDIpIER1cGxpY2F0aW5nVGhyZWFkcyBkbyBub3QgdGVlIGFueSBtaXhlZCBkYXRhLiBBcHBseSBhIHRlZSBvbiB0aGUgZG93bnN0cmVhbSBPdXRwdXRUcmFjaworICogICAgb3Igb24gdGhlIHVwc3RyZWFtIHBsYXliYWNrIFRyYWNrcy4KKyAqIDMpIERpcmVjdFRocmVhZHMgYW5kIE9mZmxvYWRUaHJlYWRzIGRvIG5vdCB0ZWUgYW55IGRhdGEuIFRoZSB1cHN0cmVhbSB0cmFjaworICogICAgKGlmIGxpbmVhciBQQ00gZm9ybWF0KSBtYXkgYmUgdGVlZCB0byBkaXNjb3ZlciBkYXRhLgorICogNCkgTW1hcFRocmVhZHMgYXJlIG5vdCBzdXBwb3J0ZWQuCisgKgorICogVHJhY2tzOgorICogMSkgUmVjb3JkVHJhY2tzIGFuZCBwbGF5YmFjayBUcmFja3MgdGVlIGFzIGRhdGEgaXMgYmVpbmcgd3JpdHRlbiB0byBvcgorICogICAgcmVhZCBmcm9tIHRoZSBzaGFyZWQgY2xpZW50LXNlcnZlciB0cmFjayBidWZmZXIgYnkgdGhlIGFzc29jaWF0ZWQgVGhyZWFkcy4KKyAqIDIpIFRoZSBtZWNoYW5pc20gaXMgb24gdGhlIEF1ZGlvQnVmZmVyUHJvdmlkZXIgcmVsZWFzZSgpIHNvIGxhcmdlIHN0YXRpYyBUcmFjaworICogICAgcGxheWJhY2sgbWF5IG5vdCBzaG93IGFueSBUZWUgZGF0YSBkZXBlbmRpbmcgb24gd2hlbiBpdCBpcyByZWxlYXNlZC4KKyAqIDMpIFdoZW4gYSB0cmFjayBiZWNvbWVzIGluYWN0aXZlLCB0aGUgVGhyZWFkIHdpbGwgdHJpZ2dlciBhIGR1bXAuCisgKi8KKworY2xhc3MgTkJBSU9fVGVlIHsKK3B1YmxpYzoKKyAgICAvKiBURUVfRkxBRyBpcyB1c2VkIGluIHNldCgpIGFuZCBtdXN0IG1hdGNoIHRoZSBmbGFncyBmb3IgdGhlIGFmLnRlZSBwcm9wZXJ0eQorICAgICAgIGdpdmVuIGluIGh0dHBzOi8vc291cmNlLmFuZHJvaWQuY29tL2RldmljZXMvYXVkaW8vZGVidWdnaW5nCisgICAgKi8KKyAgICBlbnVtIFRFRV9GTEFHIHsKKyAgICAgICAgVEVFX0ZMQUdfTk9ORSA9IDAsCisgICAgICAgIFRFRV9GTEFHX0lOUFVUX1RIUkVBRCA9ICgxIDw8IDApLCAgLy8gdHJlYXQgYXMgYSBUZWUgZm9yIGlucHV0IChDYXB0dXJlKSBUaHJlYWRzCisgICAgICAgIFRFRV9GTEFHX09VVFBVVF9USFJFQUQgPSAoMSA8PCAxKSwgLy8gdHJlYXQgYXMgYSBUZWUgZm9yIG91dHB1dCAoUGxheWJhY2spIFRocmVhZHMKKyAgICAgICAgVEVFX0ZMQUdfVFJBQ0sgPSAoMSA8PCAyKSwgICAgICAgICAvLyB0cmVhdCBhcyBhIFRlZSBmb3IgdHJhY2tzIChSZWNvcmQgYW5kIFBsYXliYWNrKQorICAgIH07CisKKyAgICBOQkFJT19UZWUoKQorICAgICAgICA6IG1UZWUoc3RkOjptYWtlX3NoYXJlZDxOQkFJT19UZWVJbXBsPigpKQorICAgIHsKKyAgICAgICAgZ2V0UnVubmluZ1RlZXMoKS5hZGQobVRlZSk7CisgICAgfQorCisgICAgfk5CQUlPX1RlZSgpIHsKKyAgICAgICAgZ2V0UnVubmluZ1RlZXMoKS5yZW1vdmUobVRlZSk7CisgICAgICAgIGR1bXAoLTEsICJfRFRPUiIpOyAvLyBsb2cgYW55IGRhdGEgcmVtYWluaW5nIGluIFRlZS4KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgc2V0IGlzIHVzZWQgZm9yIGRlZmVycmVkIGNvbmZpZ3VyYXRpb24gb2YgVGVlLgorICAgICAqCisgICAgICogIE1heSBiZSBjYWxsZWQgYW55dGltZSBleGNlcHQgY29uY3VycmVudGx5IHdpdGggd3JpdGUoKS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBmb3JtYXQgTkJBSU9fRm9ybWF0IHVzZWQgdG8gb3BlbiBOQkFJTyBwaXBlcworICAgICAqIFxwYXJhbSBmbGFncyAoaHR0cHM6Ly9zb3VyY2UuYW5kcm9pZC5jb20vZGV2aWNlcy9hdWRpby9kZWJ1Z2dpbmcpCisgICAgICogICAgICAgICAgICAgIC0gVEVFX0ZMQUdfTk9ORSB0byBieXBhc3MgYWYudGVlIHByb3BlcnR5IGNoZWNrcyAoZGVmYXVsdCk7CisgICAgICogICAgICAgICAgICAgIC0gVEVFX0ZMQUdfSU5QVVRfVEhSRUFEIHRvIGNoZWNrIGFmLnRlZSBpZiBpbnB1dCB0aHJlYWQgbG9nZ2luZyBzZXQ7CisgICAgICogICAgICAgICAgICAgIC0gVEVFX0ZMQUdfT1VUUFVUX1RIUkVBRCB0byBjaGVjayBhZi50ZWUgaWYgb3V0cHV0IHRocmVhZCBsb2dnaW5nIHNldDsKKyAgICAgKiAgICAgICAgICAgICAgLSBURUVfRkxBR19UUkFDSyB0byBjaGVjayBhZi50ZWUgaWYgdHJhY2sgbG9nZ2luZyBzZXQuCisgICAgICogXHBhcmFtIGZyYW1lcyBudW1iZXIgb2YgZnJhbWVzIHRvIG9wZW4gdGhlIE5CQUlPIHBpcGUgKHNldCB0byAwIHRvIHVzZSBkZWZhdWx0KS4KKyAgICAgKgorICAgICAqIFxyZXR1cm4KKyAgICAgKiAgICAgICAgIC0gTk9fRVJST1Igb24gc3VjY2VzcyAob3IgZm9ybWF0IHVuY2hhbmdlZCkKKyAgICAgKiAgICAgICAgIC0gQkFEX1ZBTFVFIGlmIGZvcm1hdCBvciBmbGFncyBpbnZhbGlkLgorICAgICAqICAgICAgICAgLSBQRVJNSVNTSU9OX0RFTklFRCBpZiBmbGFncyBub3QgYWxsb3dlZCBieSBhZi50ZWUKKyAgICAgKi8KKworICAgIHN0YXR1c190IHNldChjb25zdCBOQkFJT19Gb3JtYXQgJmZvcm1hdCwKKyAgICAgICAgICAgIFRFRV9GTEFHIGZsYWdzID0gVEVFX0ZMQUdfTk9ORSwgc2l6ZV90IGZyYW1lcyA9IDApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UZWUtPnNldChmb3JtYXQsIGZsYWdzLCBmcmFtZXMpOworICAgIH0KKworICAgIHN0YXR1c190IHNldCh1aW50MzJfdCBzYW1wbGVSYXRlLCB1aW50MzJfdCBjaGFubmVsQ291bnQsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgIFRFRV9GTEFHIGZsYWdzID0gVEVFX0ZMQUdfTk9ORSwgc2l6ZV90IGZyYW1lcyA9IDApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UZWUtPnNldChGb3JtYXRfZnJvbV9TUl9DKHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCwgZm9ybWF0KSwgZmxhZ3MsIGZyYW1lcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogXGJyaWVmIHdyaXRlIGRhdGEgdG8gdGhlIHRlZS4KKyAgICAgKgorICAgICAqIFRoaXMgY2FsbCBpcyBsb2NrIGZyZWUgKGFzIHNoYXJlZCBwb2ludGVyIGFuZCBOQkFJTyBpcyBsb2NrIGZyZWUpOworICAgICAqIG1heSBiZSBjYWxsZWQgc2ltdWx0YW5lb3VzIHRvIGFsbCBtZXRob2RzIGV4Y2VwdCBzZXQoKS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBidWZmZXIgdG8gd3JpdGUgdG8gcGlwZS4KKyAgICAgKiBccGFyYW0gZnJhbWVDb3VudCBpbiBmcmFtZXMgYXMgc3BlY2lmaWVkIGJ5IHRoZSBmb3JtYXQgcGFzc2VkIHRvIHNldCgpCisgICAgICovCisKKyAgICB2b2lkIHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGZyYW1lQ291bnQpIGNvbnN0IHsKKyAgICAgICAgbVRlZS0+d3JpdGUoYnVmZmVyLCBmcmFtZUNvdW50KTsKKyAgICB9CisKKyAgICAvKiogc2V0cyBUZWUgaWQgc3RyaW5nIHdoaWNoIGlkZW50aWZpZXMgdGhlIGdlbmVyYXRlZCBmaWxlIChzaG91bGQgYmUgdW5pcXVlKS4gKi8KKyAgICB2b2lkIHNldElkKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCkgY29uc3QgeworICAgICAgICBtVGVlLT5zZXRJZChpZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogXGJyaWVmIGR1bXAgdGhlIGF1ZGlvIGNvbnRlbnQgd3JpdHRlbiB0byB0aGUgVGVlLgorICAgICAqCisgICAgICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvciB0byB3cml0ZSBkdW1wZWQgZmlsZW5hbWUgZm9yIGxvZ2dpbmcsIHVzZSAtMSB0byBpZ25vcmUuCisgICAgICogXHBhcmFtIHJlYXNvbiBzdHJpbmcgc3VmZml4IHRvIGFwcGVuZCB0byB0aGUgZ2VuZXJhdGVkIGZpbGUuCisgICAgICovCisgICAgdm9pZCBkdW1wKGludCBmZCwgY29uc3Qgc3RkOjpzdHJpbmcgJnJlYXNvbiA9ICIiKSBjb25zdCB7CisgICAgICAgIG1UZWUtPmR1bXAoZmQsIHJlYXNvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogXGJyaWVmIGR1bXAgYWxsIFRlZXMgY3VycmVudGx5IGFsaXZlLgorICAgICAqCisgICAgICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvciB0byB3cml0ZSBkdW1wZWQgZmlsZW5hbWUgZm9yIGxvZ2dpbmcsIHVzZSAtMSB0byBpZ25vcmUuCisgICAgICogXHBhcmFtIHJlYXNvbiBzdHJpbmcgc3VmZml4IHRvIGFwcGVuZCB0byB0aGUgZ2VuZXJhdGVkIGZpbGUuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgZHVtcEFsbChpbnQgZmQsIGNvbnN0IHN0ZDo6c3RyaW5nICZyZWFzb24gPSAiIikgeworICAgICAgICBnZXRSdW5uaW5nVGVlcygpLmR1bXAoZmQsIHJlYXNvbik7CisgICAgfQorCitwcml2YXRlOgorCisgICAgLyoqIFRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUZWUgLSB0aGUgbGlmZXRpbWUgaXMgdGhyb3VnaAorICAgICAgICBhIHNoYXJlZCBwb2ludGVyIHNvIGRlc3RydWN0aW9uIG9mIHRoZSBOQkFJT19UZWUgY29udGFpbmVyIG1heSBwcm9jZWVkCisgICAgICAgIGV2ZW4gdGhvdWdoIGR1bXBpbmcgaXMgb2NjdXJyaW5nLiAqLworICAgIGNsYXNzIE5CQUlPX1RlZUltcGwgeworICAgIHB1YmxpYzoKKyAgICAgICAgc3RhdHVzX3Qgc2V0KGNvbnN0IE5CQUlPX0Zvcm1hdCAmZm9ybWF0LCBURUVfRkxBRyBmbGFncywgc2l6ZV90IGZyYW1lcykgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCB0ZWVDb25maWcgPSBwcm9wZXJ0eV9nZXRfYm9vbCgicm8uZGVidWdnYWJsZSIsIGZhbHNlKQorICAgICAgICAgICAgICAgICAgID8gcHJvcGVydHlfZ2V0X2ludDMyKCJhZi50ZWUiLCAwKSA6IDA7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIHRoZSB0eXBlIG9mIFRlZQorICAgICAgICAgICAgY29uc3QgVEVFX0ZMQUcgdHlwZSA9IFRFRV9GTEFHKAorICAgICAgICAgICAgICAgICAgICBmbGFncyAmIChURUVfRkxBR19JTlBVVF9USFJFQUQgfCBURUVfRkxBR19PVVRQVVRfVEhSRUFEIHwgVEVFX0ZMQUdfVFJBQ0spKTsKKworICAgICAgICAgICAgLy8gcGFyYW1ldGVyIGZsYWdzIGNhbid0IHNlbGVjdCBtdWx0aXBsZSB0eXBlcy4KKyAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fcG9wY291bnQodHlwZSkgPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaWYgdHlwZSBpcyBzZXQsIHdlIGNoZWNrIHRvIHNlZSBpZiBpdCBpcyBwZXJtaXR0ZWQgYnkgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICAgIGlmICh0eXBlICE9IDAgJiYgKHR5cGUgJiB0ZWVDb25maWcpID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGRldGVybWluZSBudW1iZXIgb2YgZnJhbWVzIGZvciBUZWUKKyAgICAgICAgICAgIGlmIChmcmFtZXMgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IGNvbnNpZGVyIHZhcnlpbmcgZnJhbWUgY291bnQgYmFzZWQgb24gdHlwZS4KKyAgICAgICAgICAgICAgICBmcmFtZXMgPSBERUZBVUxUX1RFRV9GUkFNRVM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBjaGVjayBtaW5pbXVtIG51bWJlciBvZiBmcmFtZXM/CisKKyAgICAgICAgICAgIC8vIGRvbid0IGRvIGFueXRoaW5nIGlmIGZvcm1hdCBhbmQgZnJhbWVzIGFyZSB0aGUgc2FtZS4KKyAgICAgICAgICAgIGlmIChGb3JtYXRfaXNFcXVhbChmb3JtYXQsIG1Gb3JtYXQpICYmIGZyYW1lcyA9PSBtRnJhbWVzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIGVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGF1dG8gc2lua3NvdXJjZSA9IG1ha2VTaW5rU291cmNlKGZvcm1hdCwgZnJhbWVzLCAmZW5hYmxlZCk7CisKKyAgICAgICAgICAgIC8vIGVuYWJsZWQgaXMgc2V0IGlmIG1ha2VTaW5rU291cmNlIGlzIHN1Y2Nlc3NmdWwuCisgICAgICAgICAgICAvLyBOb3RlOiBhcyBtZW50aW9uZWQgaW4gTkJBSU9fVGVlOjpzZXQoKSwgZG9uJ3QgY2FsbCBzZXQoKSB3aGlsZSB3cml0ZSgpIGlzCisgICAgICAgICAgICAvLyBvbmdvaW5nLgorICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobUxvY2spOworICAgICAgICAgICAgICAgIG1GbGFncyA9IGZsYWdzOworICAgICAgICAgICAgICAgIG1Gb3JtYXQgPSBmb3JtYXQ7IC8vIGNvdWxkIGdldCB0aGlzIGZyb20gdGhlIFNpbmsuCisgICAgICAgICAgICAgICAgbUZyYW1lcyA9IGZyYW1lczsKKyAgICAgICAgICAgICAgICBtU2lua1NvdXJjZSA9IHN0ZDo6bW92ZShzaW5rc291cmNlKTsKKyAgICAgICAgICAgICAgICBtRW5hYmxlZC5zdG9yZSh0cnVlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRJZChjb25zdCBzdGQ6OnN0cmluZyAmaWQpIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisgICAgICAgICAgICBtSWQgPSBpZDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZHVtcChpbnQgZmQsIGNvbnN0IHN0ZDo6c3RyaW5nICZyZWFzb24pIHsKKyAgICAgICAgICAgIGlmICghbURhdGFSZWFkeS5leGNoYW5nZShmYWxzZSkpIHJldHVybjsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN1ZmZpeDsKKyAgICAgICAgICAgIE5CQUlPX1NpbmtTb3VyY2Ugc2lua1NvdXJjZTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobUxvY2spOworICAgICAgICAgICAgICAgIHN1ZmZpeCA9IG1JZCArIHJlYXNvbjsKKyAgICAgICAgICAgICAgICBzaW5rU291cmNlID0gbVNpbmtTb3VyY2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkdW1wVGVlKGZkLCBzaW5rU291cmNlLCBzdWZmaXgpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBmcmFtZUNvdW50KSB7CisgICAgICAgICAgICBpZiAoIW1FbmFibGVkLmxvYWQoKSB8fCBmcmFtZUNvdW50ID09IDApIHJldHVybjsKKyAgICAgICAgICAgICh2b2lkKW1TaW5rU291cmNlLmZpcnN0LT53cml0ZShidWZmZXIsIGZyYW1lQ291bnQpOworICAgICAgICAgICAgbURhdGFSZWFkeS5zdG9yZSh0cnVlKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gVFJJQ0tZOiBXZSBuZWVkIHRvIGtlZXAgdGhlIE5CQUlPX1NpbmsgYW5kIE5CQUlPX1NvdXJjZSBib3RoIGFsaXZlIGF0IHRoZSBzYW1lIHRpbWUKKyAgICAgICAgLy8gYmVjYXVzZSBQaXBlUmVhZGVyIGhvbGRzIGEgbmFrZWQgcmVmZXJlbmNlIChub3QgYSBzdHJvbmcgb3Igd2VhayBwb2ludGVyKSB0byBQaXBlLgorICAgICAgICB1c2luZyBOQkFJT19TaW5rU291cmNlID0gc3RkOjpwYWlyPHNwPE5CQUlPX1Npbms+LCBzcDxOQkFJT19Tb3VyY2U+PjsKKworICAgICAgICBzdGF0aWMgdm9pZCBkdW1wVGVlKGludCBmZCwgY29uc3QgTkJBSU9fU2lua1NvdXJjZSYgc2lua1NvdXJjZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHN1ZmZpeCk7CisKKyAgICAgICAgc3RhdGljIE5CQUlPX1NpbmtTb3VyY2UgbWFrZVNpbmtTb3VyY2UoCisgICAgICAgICAgICAgICAgY29uc3QgTkJBSU9fRm9ybWF0ICZmb3JtYXQsIHNpemVfdCBmcmFtZXMsIGJvb2wgKmVuYWJsZWQpOworCisgICAgICAgIC8vIDB4MjAwMDAwIHN0ZXJlbyAxNi1iaXQgUENNIGZyYW1lcyA9IDQ3LjUgc2Vjb25kcyBhdCA0NC4xIGtIeiwgOCBtZWdhYnl0ZXMKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgREVGQVVMVF9URUVfRlJBTUVTID0gMHgyMDAwMDA7CisKKyAgICAgICAgLy8gYXRvbWljIHN0YXR1cyBjaGVja2luZworICAgICAgICBzdGQ6OmF0b21pYzxib29sPiBtRW5hYmxlZHtmYWxzZX07CisgICAgICAgIHN0ZDo6YXRvbWljPGJvb2w+IG1EYXRhUmVhZHl7ZmFsc2V9OworCisgICAgICAgIC8vIGxvY2tlZCBkdW1wIGluZm9ybWF0aW9uCisgICAgICAgIG11dGFibGUgc3RkOjptdXRleCBtTG9jazsKKyAgICAgICAgc3RkOjpzdHJpbmcgbUlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR1VBUkRFRF9CWShtTG9jaykKKyAgICAgICAgVEVFX0ZMQUcgbUZsYWdzID0gVEVFX0ZMQUdfTk9ORTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR1VBUkRFRF9CWShtTG9jaykKKyAgICAgICAgTkJBSU9fRm9ybWF0IG1Gb3JtYXQgPSBGb3JtYXRfSW52YWxpZDsgICAgICAgICAgICAgICAgICAgLy8gR1VBUkRFRF9CWShtTG9jaykKKyAgICAgICAgc2l6ZV90IG1GcmFtZXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR1VBUkRFRF9CWShtTG9jaykKKyAgICAgICAgTkJBSU9fU2lua1NvdXJjZSBtU2lua1NvdXJjZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR1VBUkRFRF9CWShtTG9jaykKKyAgICB9OworCisgICAgLyoqIFJ1bm5pbmdUZWVzIHRyYWNrcyBjdXJyZW50IHJ1bm5pbmcgdGVlcyBmb3IgZHVtcCBwdXJwb3Nlcy4KKyAgICAgICAgSXQgaXMgaW1wbGVtZW50ZWQgdG8gaGF2ZSBtaW5pbWFsIGxvY2tlZCByZWdpb25zLCB0byBiZSB0cmFuc3BhcmVudCB0byB0aGUgY2FsbGVyLiAqLworICAgIGNsYXNzIFJ1bm5pbmdUZWVzIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZvaWQgYWRkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxOQkFJT19UZWVJbXBsPiAmdGVlKSB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobUxvY2spOworICAgICAgICAgICAgQUxPR1dfSUYoIW1UZWVzLmVtcGxhY2UodGVlKS5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICIlczogJXAgYWxyZWFkeSBleGlzdHMgaW4gbVRlZXMiLCBfX2Z1bmNfXywgdGVlLmdldCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcmVtb3ZlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxOQkFJT19UZWVJbXBsPiAmdGVlKSB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobUxvY2spOworICAgICAgICAgICAgQUxPR1dfSUYobVRlZXMuZXJhc2UodGVlKSAhPSAxLAorICAgICAgICAgICAgICAgICAgICAiJXM6ICVwIGRvZXNuJ3QgZXhpc3QgaW4gbVRlZXMiLCBfX2Z1bmNfXywgdGVlLmdldCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZHVtcChpbnQgZmQsIGNvbnN0IHN0ZDo6c3RyaW5nICZyZWFzb24pIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxOQkFJT19UZWVJbXBsPj4gdGVlczsgLy8gc2FmZSBzbmFwc2hvdCBvZiB0ZWVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IF9sKG1Mb2NrKTsKKyAgICAgICAgICAgICAgICB0ZWVzLmluc2VydCh0ZWVzLmVuZCgpLCBtVGVlcy5iZWdpbigpLCBtVGVlcy5lbmQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnRlZSA6IHRlZXMpIHsKKyAgICAgICAgICAgICAgICB0ZWUtPmR1bXAoZmQsIHJlYXNvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c2hhcmVkX3B0cjxOQkFJT19UZWVJbXBsPj4gbVRlZXM7IC8vIEdVQVJERURfQlkobUxvY2spCisgICAgfTsKKworICAgIC8vIHNpbmdsZXRvbgorICAgIHN0YXRpYyBSdW5uaW5nVGVlcyAmZ2V0UnVubmluZ1RlZXMoKSB7CisgICAgICAgIHN0YXRpYyBSdW5uaW5nVGVlcyBydW5uaW5nVGVlczsKKyAgICAgICAgcmV0dXJuIHJ1bm5pbmdUZWVzOworICAgIH0KKworICAgIC8vIFRoZSBOQkFJTyBUZWVJbXBsIG1heSBoYXZlIGxpZmV0aW1lIGxvbmdlciB0aGFuIE5CQUlPX1RlZSBpZgorICAgIC8vIFJ1bm5pbmdUZWVzOjpkdW1wKCkgaXMgYmVpbmcgY2FsbGVkIHNpbXVsdGFuZW91cyB0byB+TkJBSU9fVGVlKCkuCisgICAgLy8gVGhpcyBpcyBhbGxvd2VkIGZvciBtYXhpbXVtIGNvbmN1cnJlbmN5LgorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxOQkFJT19UZWVJbXBsPiBtVGVlOworfTsgLy8gTkJBSU9fVGVlCisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIFRFRV9TSU5LCisjZW5kaWYgLy8gIUFORFJPSURfTkJBSU9fVEVFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcAppbmRleCBlNWNiOGEyLi41MzhhMGViIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwCkBAIC0yNCw4ICsyNCw5IEBACiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogCiAjaW5jbHVkZSAiQXVkaW9GbGluZ2VyLmgiCi0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvUGF0Y2hCdWlsZGVyLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtNDksMTExICs1MCw3NyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobVBhdGNoUGFuZWwgIT0gMCkgewotICAgICAgICByZXR1cm4gbVBhdGNoUGFuZWwtPmxpc3RBdWRpb1BvcnRzKG51bV9wb3J0cywgcG9ydHMpOwotICAgIH0KLSAgICByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gbVBhdGNoUGFuZWwubGlzdEF1ZGlvUG9ydHMobnVtX3BvcnRzLCBwb3J0cyk7CiB9CiAKIC8qIEdldCBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0ICovCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtUGF0Y2hQYW5lbCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtUGF0Y2hQYW5lbC0+Z2V0QXVkaW9Qb3J0KHBvcnQpOwotICAgIH0KLSAgICByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gbVBhdGNoUGFuZWwuZ2V0QXVkaW9Qb3J0KHBvcnQpOwogfQogCi0KIC8qIENvbm5lY3QgYSBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzICovCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtUGF0Y2hQYW5lbCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtUGF0Y2hQYW5lbC0+Y3JlYXRlQXVkaW9QYXRjaChwYXRjaCwgaGFuZGxlKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIG1QYXRjaFBhbmVsLmNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2gsIGhhbmRsZSk7CiB9CiAKIC8qIERpc2Nvbm5lY3QgYSBwYXRjaCAqLwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobVBhdGNoUGFuZWwgIT0gMCkgewotICAgICAgICByZXR1cm4gbVBhdGNoUGFuZWwtPnJlbGVhc2VBdWRpb1BhdGNoKGhhbmRsZSk7Ci0gICAgfQotICAgIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBtUGF0Y2hQYW5lbC5yZWxlYXNlQXVkaW9QYXRjaChoYW5kbGUpOwogfQogCi0KIC8qIExpc3QgY29ubmVjdGVkIGF1ZGlvIHBvcnRzIGFuZCB0aGV5IGF0dHJpYnV0ZXMgKi8KIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6bGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcykKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtUGF0Y2hQYW5lbCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtUGF0Y2hQYW5lbC0+bGlzdEF1ZGlvUGF0Y2hlcyhudW1fcGF0Y2hlcywgcGF0Y2hlcyk7CisgICAgcmV0dXJuIG1QYXRjaFBhbmVsLmxpc3RBdWRpb1BhdGNoZXMobnVtX3BhdGNoZXMsIHBhdGNoZXMpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OlNvZnR3YXJlUGF0Y2g6OmdldExhdGVuY3lNc19sKGRvdWJsZSAqbGF0ZW5jeU1zKSBjb25zdAoreworICAgIGNvbnN0IGF1dG8mIGl0ZXIgPSBtUGF0Y2hQYW5lbC5tUGF0Y2hlcy5maW5kKG1QYXRjaEhhbmRsZSk7CisgICAgaWYgKGl0ZXIgIT0gbVBhdGNoUGFuZWwubVBhdGNoZXMuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIGl0ZXItPnNlY29uZC5nZXRMYXRlbmN5TXMobGF0ZW5jeU1zKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICByZXR1cm4gTk9fSU5JVDsKLX0KLQotLyogU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbiAqLwotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobVBhdGNoUGFuZWwgIT0gMCkgewotICAgICAgICByZXR1cm4gbVBhdGNoUGFuZWwtPnNldEF1ZGlvUG9ydENvbmZpZyhjb25maWcpOwotICAgIH0KLSAgICByZXR1cm4gTk9fSU5JVDsKLX0KLQotCi1BdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OlBhdGNoUGFuZWwoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1BdWRpb0ZsaW5nZXIoYXVkaW9GbGluZ2VyKQotewotfQotCi1BdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6On5QYXRjaFBhbmVsKCkKLXsKIH0KIAogLyogTGlzdCBjb25uZWN0ZWQgYXVkaW8gcG9ydHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgKi8KIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6bGlzdEF1ZGlvUG9ydHModW5zaWduZWQgaW50ICpudW1fcG9ydHMgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cyBfX3VudXNlZCkKIHsKLSAgICBBTE9HVigibGlzdEF1ZGlvUG9ydHMiKTsKKyAgICBBTE9HVihfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiAvKiBHZXQgc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydCAqLwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQgX191bnVzZWQpCiB7Ci0gICAgQUxPR1YoImdldEF1ZGlvUG9ydCIpOworICAgIEFMT0dWKF9fZnVuY19fKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLQogLyogQ29ubmVjdCBhIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMgKi8KIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6Y3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQogewotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgIHNwPEF1ZGlvRmxpbmdlcj4gYXVkaW9mbGluZ2VyID0gbUF1ZGlvRmxpbmdlci5wcm9tb3RlKCk7CiAgICAgaWYgKGhhbmRsZSA9PSBOVUxMIHx8IHBhdGNoID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBudW1fc291cmNlcyAlZCBudW1fc2lua3MgJWQgaGFuZGxlICVkIiwKLSAgICAgICAgICBwYXRjaC0+bnVtX3NvdXJjZXMsIHBhdGNoLT5udW1fc2lua3MsICpoYW5kbGUpOwotICAgIGlmIChhdWRpb2ZsaW5nZXIgPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9CisgICAgQUxPR1YoIiVzKCkgbnVtX3NvdXJjZXMgJWQgbnVtX3NpbmtzICVkIGhhbmRsZSAlZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgcGF0Y2gtPm51bV9zb3VyY2VzLCBwYXRjaC0+bnVtX3NpbmtzLCAqaGFuZGxlKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYWxIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKIAotICAgIGlmIChwYXRjaC0+bnVtX3NvdXJjZXMgPT0gMCB8fCBwYXRjaC0+bnVtX3NvdXJjZXMgPiBBVURJT19QQVRDSF9QT1JUU19NQVggfHwKLSAgICAgICAgICAgIChwYXRjaC0+bnVtX3NpbmtzID09IDAgJiYgcGF0Y2gtPm51bV9zb3VyY2VzICE9IDIpIHx8Ci0gICAgICAgICAgICBwYXRjaC0+bnVtX3NpbmtzID4gQVVESU9fUEFUQ0hfUE9SVFNfTUFYKSB7CisgICAgaWYgKCFhdWRpb19wYXRjaF9pc192YWxpZChwYXRjaCkgfHwgKHBhdGNoLT5udW1fc2lua3MgPT0gMCAmJiBwYXRjaC0+bnVtX3NvdXJjZXMgIT0gMikpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgLy8gbGltaXQgbnVtYmVyIG9mIHNvdXJjZXMgdG8gMSBmb3Igbm93IG9yIDIgc291cmNlcyBmb3Igc3BlY2lhbCBjcm9zcyBodyBtb2R1bGUgY2FzZS4KQEAgLTE2Myw4MSArMTMwLDczIEBACiAgICAgfQogCiAgICAgaWYgKCpoYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKLSAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyAqaGFuZGxlICE9IDAgJiYgaW5kZXggPCBtUGF0Y2hlcy5zaXplKCk7IGluZGV4KyspIHsKLSAgICAgICAgICAgIGlmICgqaGFuZGxlID09IG1QYXRjaGVzW2luZGV4XS0+bUhhbmRsZSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgcmVtb3ZpbmcgcGF0Y2ggaGFuZGxlICVkIiwgKmhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgaGFsSGFuZGxlID0gbVBhdGNoZXNbaW5kZXhdLT5tSGFsSGFuZGxlOwotICAgICAgICAgICAgICAgIFBhdGNoICpyZW1vdmVkUGF0Y2ggPSBtUGF0Y2hlc1tpbmRleF07Ci0gICAgICAgICAgICAgICAgLy8gZnJlZSByZXNvdXJjZXMgb3duZWQgYnkgdGhlIHJlbW92ZWQgcGF0Y2ggaWYgYXBwbGljYWJsZQotICAgICAgICAgICAgICAgIC8vIDEpIGlmIGEgc29mdHdhcmUgcGF0Y2ggaXMgcHJlc2VudCwgcmVsZWFzZSB0aGUgcGxheWJhY2sgYW5kIGNhcHR1cmUgdGhyZWFkcyBhbmQKLSAgICAgICAgICAgICAgICAvLyB0cmFja3MgY3JlYXRlZC4gVGhpcyB3aWxsIGFsc28gcmVsZWFzZSB0aGUgY29ycmVzcG9uZGluZyBhdWRpbyBIQUwgcGF0Y2hlcwotICAgICAgICAgICAgICAgIGlmICgocmVtb3ZlZFBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKHJlbW92ZWRQYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUgIT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUEFUQ0hfSEFORExFX05PTkUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsZWFyUGF0Y2hDb25uZWN0aW9ucyhyZW1vdmVkUGF0Y2gpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyAyKSBpZiB0aGUgbmV3IHBhdGNoIGFuZCBvbGQgcGF0Y2ggc291cmNlIG9yIHNpbmsgYXJlIGRldmljZXMgZnJvbSBkaWZmZXJlbnQKLSAgICAgICAgICAgICAgICAvLyBodyBtb2R1bGVzLCAgY2xlYXIgdGhlIGF1ZGlvIEhBTCBwYXRjaGVzIG5vdyBiZWNhdXNlIHRoZXkgd2lsbCBub3QgYmUgdXBkYXRlZAotICAgICAgICAgICAgICAgIC8vIGJ5IGNhbGwgdG8gY3JlYXRlX2F1ZGlvX3BhdGNoKCkgYmVsb3cgd2hpY2ggd2lsbCBoYXBwZW4gb24gYSBkaWZmZXJlbnQgSFcgbW9kdWxlCi0gICAgICAgICAgICAgICAgaWYgKGhhbEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgaHdNb2R1bGUgPSBBVURJT19NT0RVTEVfSEFORExFX05PTkU7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgocmVtb3ZlZFBhdGNoLT5tQXVkaW9QYXRjaC5zb3VyY2VzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICgocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSAhPSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAocmVtb3ZlZFBhdGNoLT5tQXVkaW9QYXRjaC5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBod01vZHVsZSA9IHJlbW92ZWRQYXRjaC0+bUF1ZGlvUGF0Y2guc291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgocGF0Y2gtPm51bV9zaW5rcyA9PSAwKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocmVtb3ZlZFBhdGNoLT5tQXVkaW9QYXRjaC5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocGF0Y2gtPnNpbmtzWzBdLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZW1vdmVkUGF0Y2gtPm1BdWRpb1BhdGNoLnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIG9uIChwYXRjaC0+bnVtX3NpbmtzID09IDApOiB0aGlzIHNpdHVhdGlvbiBzaG91bGQgbm90IGhhcHBlbiBhcwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2Ugc3BlY2lhbCBwYXRjaGVzIGFyZSBvbmx5IGNyZWF0ZWQgYnkgdGhlIHBvbGljeSBtYW5hZ2VyIGJ1dCBqdXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBjYXNlLCBzeXN0ZW1hdGljYWxseSBjbGVhciB0aGUgSEFMIHBhdGNoLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHJlbW92ZWRQYXRjaC0+bUF1ZGlvUGF0Y2gubnVtX3NpbmtzIGNhbm5vdCBiZSAwIGhlcmUgYmVjYXVzZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFsSGFuZGxlIHdvdWxkIGJlIEFVRElPX1BBVENIX0hBTkRMRV9OT05FIGluIHRoaXMgY2FzZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGh3TW9kdWxlID0gcmVtb3ZlZFBhdGNoLT5tQXVkaW9QYXRjaC5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoaHdNb2R1bGUgIT0gQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMuaW5kZXhPZktleShod01vZHVsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZUhhbEludGVyZmFjZT4gaHdEZXZpY2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMudmFsdWVBdChpbmRleCktPmh3RGV2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHdEZXZpY2UtPnJlbGVhc2VBdWRpb1BhdGNoKGhhbEhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVBhdGNoZXMucmVtb3ZlQXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIGRlbGV0ZSByZW1vdmVkUGF0Y2g7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGF1dG8gaXRlciA9IG1QYXRjaGVzLmZpbmQoKmhhbmRsZSk7CisgICAgICAgIGlmIChpdGVyICE9IG1QYXRjaGVzLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HVigiJXMoKSByZW1vdmluZyBwYXRjaCBoYW5kbGUgJWQiLCBfX2Z1bmNfXywgKmhhbmRsZSk7CisgICAgICAgICAgICBQYXRjaCAmcmVtb3ZlZFBhdGNoID0gaXRlci0+c2Vjb25kOworICAgICAgICAgICAgLy8gZnJlZSByZXNvdXJjZXMgb3duZWQgYnkgdGhlIHJlbW92ZWQgcGF0Y2ggaWYgYXBwbGljYWJsZQorICAgICAgICAgICAgLy8gMSkgaWYgYSBzb2Z0d2FyZSBwYXRjaCBpcyBwcmVzZW50LCByZWxlYXNlIHRoZSBwbGF5YmFjayBhbmQgY2FwdHVyZSB0aHJlYWRzIGFuZAorICAgICAgICAgICAgLy8gdHJhY2tzIGNyZWF0ZWQuIFRoaXMgd2lsbCBhbHNvIHJlbGVhc2UgdGhlIGNvcnJlc3BvbmRpbmcgYXVkaW8gSEFMIHBhdGNoZXMKKyAgICAgICAgICAgIGlmIChyZW1vdmVkUGF0Y2guaXNTb2Z0d2FyZSgpKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlZFBhdGNoLmNsZWFyQ29ubmVjdGlvbnModGhpcyk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAyKSBpZiB0aGUgbmV3IHBhdGNoIGFuZCBvbGQgcGF0Y2ggc291cmNlIG9yIHNpbmsgYXJlIGRldmljZXMgZnJvbSBkaWZmZXJlbnQKKyAgICAgICAgICAgIC8vIGh3IG1vZHVsZXMsICBjbGVhciB0aGUgYXVkaW8gSEFMIHBhdGNoZXMgbm93IGJlY2F1c2UgdGhleSB3aWxsIG5vdCBiZSB1cGRhdGVkCisgICAgICAgICAgICAvLyBieSBjYWxsIHRvIGNyZWF0ZV9hdWRpb19wYXRjaCgpIGJlbG93IHdoaWNoIHdpbGwgaGFwcGVuIG9uIGEgZGlmZmVyZW50IEhXIG1vZHVsZQorICAgICAgICAgICAgaWYgKHJlbW92ZWRQYXRjaC5tSGFsSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGh3TW9kdWxlID0gQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FOworICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAmb2xkUGF0Y2ggPSByZW1vdmVkUGF0Y2gubUF1ZGlvUGF0Y2g7CisgICAgICAgICAgICAgICAgaWYgKG9sZFBhdGNoLnNvdXJjZXNbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFICYmCisgICAgICAgICAgICAgICAgICAgICAgICAocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSAhPSBBVURJT19QT1JUX1RZUEVfREVWSUNFIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFBhdGNoLnNvdXJjZXNbMF0uZXh0LmRldmljZS5od19tb2R1bGUgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS5od19tb2R1bGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGh3TW9kdWxlID0gb2xkUGF0Y2guc291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhdGNoLT5udW1fc2lua3MgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKG9sZFBhdGNoLnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGF0Y2gtPnNpbmtzWzBdLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFBhdGNoLnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSBvbiAocGF0Y2gtPm51bV9zaW5rcyA9PSAwKTogdGhpcyBzaXR1YXRpb24gc2hvdWxkIG5vdCBoYXBwZW4gYXMKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2Ugc3BlY2lhbCBwYXRjaGVzIGFyZSBvbmx5IGNyZWF0ZWQgYnkgdGhlIHBvbGljeSBtYW5hZ2VyIGJ1dCBqdXN0CisgICAgICAgICAgICAgICAgICAgIC8vIGluIGNhc2UsIHN5c3RlbWF0aWNhbGx5IGNsZWFyIHRoZSBIQUwgcGF0Y2guCisgICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCByZW1vdmVkUGF0Y2gubUF1ZGlvUGF0Y2gubnVtX3NpbmtzIGNhbm5vdCBiZSAwIGhlcmUgYmVjYXVzZQorICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmVkUGF0Y2gubUhhbEhhbmRsZSB3b3VsZCBiZSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgIGh3TW9kdWxlID0gb2xkUGF0Y2guc2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNwPERldmljZUhhbEludGVyZmFjZT4gaHdEZXZpY2UgPSBmaW5kSHdEZXZpY2VCeU1vZHVsZShod01vZHVsZSk7CisgICAgICAgICAgICAgICAgaWYgKGh3RGV2aWNlICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaHdEZXZpY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHJlbW92ZWRQYXRjaC5tSGFsSGFuZGxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUGF0Y2hlcy5lcmFzZShpdGVyKTsKKyAgICAgICAgICAgIHJlbW92ZVNvZnR3YXJlUGF0Y2hGcm9tSW5zZXJ0ZWRNb2R1bGVzKCpoYW5kbGUpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgUGF0Y2ggKm5ld1BhdGNoID0gbmV3IFBhdGNoKHBhdGNoKTsKKyAgICBQYXRjaCBuZXdQYXRjaHsqcGF0Y2h9OworICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBpbnNlcnRlZE1vZHVsZSA9IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORTsKIAogICAgIHN3aXRjaCAocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSkgewogICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0U6IHsKICAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBzcmNNb2R1bGUgPSBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZTsKLSAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KHNyY01vZHVsZSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBiYWQgc3JjIGh3IG1vZHVsZSAlZCIsIHNyY01vZHVsZSk7CisgICAgICAgICAgICBBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlID0gZmluZEF1ZGlvSHdEZXZpY2VCeU1vZHVsZShzcmNNb2R1bGUpOworICAgICAgICAgICAgaWYgKCFhdWRpb0h3RGV2aWNlKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UgPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy52YWx1ZUF0KGluZGV4KTsKICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBvbmx5IG9uZSBzaW5rIGlmIGNvbm5lY3Rpb24gdG8gYSBtaXggb3IgYWNyb3NzIEhXIG1vZHVsZXMKICAgICAgICAgICAgICAgICBpZiAoKHBhdGNoLT5zaW5rc1tpXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVggfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1tpXS5leHQubWl4Lmh3X21vZHVsZSAhPSBzcmNNb2R1bGUpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXRjaC0+c2lua3NbaV0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UuaHdfbW9kdWxlICE9IHNyY01vZHVsZSkpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bnVtX3NpbmtzID4gMSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBtdWx0aXBsZSBzaW5rcyBmb3IgbWl4IG9yIGFjcm9zcyBtb2R1bGVzIG5vdCBzdXBwb3J0ZWQiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIHJlamVjdCBjb25uZWN0aW9uIHRvIGRpZmZlcmVudCBzaW5rIHR5cGVzCiAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1tpXS50eXBlICE9IHBhdGNoLT5zaW5rc1swXS50eXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgZGlmZmVyZW50IHNpbmsgdHlwZXMgaW4gc2FtZSBwYXRjaCBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGRpZmZlcmVudCBzaW5rIHR5cGVzIGluIHNhbWUgcGF0Y2ggbm90IHN1cHBvcnRlZCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjU2LDM4ICsyMTUsNTIgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zb3VyY2VzWzFdLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX01JWCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXRjaC0+bnVtX3NpbmtzICE9IDAgJiYgcGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlICE9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1sxXS5leHQubWl4Lmh3X21vZHVsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgaW52YWxpZCBzb3VyY2UgY29tYmluYXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGludmFsaWQgc291cmNlIGNvbWJpbmF0aW9uIiwgX19mdW5jX18pOwogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvZmxpbmdlci0+Y2hlY2tQbGF5YmFja1RocmVhZF9sKHBhdGNoLT5zb3VyY2VzWzFdLmV4dC5taXguaGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3UGF0Y2gtPm1QbGF5YmFja1RocmVhZCA9IChNaXhlclRocmVhZCAqKXRocmVhZC5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9GbGluZ2VyLmNoZWNrUGxheWJhY2tUaHJlYWRfbChwYXRjaC0+c291cmNlc1sxXS5leHQubWl4LmhhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBjYW5ub3QgZ2V0IHBsYXliYWNrIHRocmVhZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgY2Fubm90IGdldCBwbGF5YmFjayB0aHJlYWQiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBwbGF5YmFjayB0aHJlYWQgaXMgcmV1c2VkLCBzbyBpdCBpcyBub3QgY2xvc2VkIHdoZW4gcGF0Y2ggaXMgY2xlYXJlZAorICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC5tUGxheWJhY2suc2V0VGhyZWFkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UGxheWJhY2tUaHJlYWQqPih0aHJlYWQuZ2V0KCkpLCBmYWxzZSAvKmNsb3NlVGhyZWFkKi8pOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLnR5cGU7CiAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IFN0cmluZzgocGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBhdWRpb2ZsaW5nZXItPm9wZW5PdXRwdXRfbCgKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOworICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IHBhdGNoLT5zaW5rc1swXS5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gcGF0Y2gtPnNpbmtzWzBdLmNoYW5uZWxfbWFzazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gcGF0Y2gtPnNpbmtzWzBdLmZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRkxBR1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gcGF0Y2gtPnNpbmtzWzBdLmZsYWdzLm91dHB1dDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtQXVkaW9GbGluZ2VyLm9wZW5PdXRwdXRfbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUpOwotICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC0+bVBsYXliYWNrVGhyZWFkID0gKFBsYXliYWNrVGhyZWFkICopdGhyZWFkLmdldCgpOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiYXVkaW9mbGluZ2VyLT5vcGVuT3V0cHV0X2woKSByZXR1cm5lZCAlcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC0+bVBsYXliYWNrVGhyZWFkLmdldCgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1BhdGNoLT5tUGxheWJhY2tUaHJlYWQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigibUF1ZGlvRmxpbmdlci5vcGVuT3V0cHV0X2woKSByZXR1cm5lZCAlcCIsIHRocmVhZC5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gTk9fTUVNT1JZOwogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG5ld1BhdGNoLm1QbGF5YmFjay5zZXRUaHJlYWQocmVpbnRlcnByZXRfY2FzdDxQbGF5YmFja1RocmVhZCo+KHRocmVhZC5nZXQoKSkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS50eXBlOwogICAgICAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IFN0cmluZzgocGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS5hZGRyZXNzKTsKQEAgLTI5Nyw0NyArMjcwLDUzIEBACiAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zb3VyY2VzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpIHsKICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gcGF0Y2gtPnNvdXJjZXNbMF0uc2FtcGxlX3JhdGU7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gbmV3UGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+c2FtcGxlUmF0ZSgpOworICAgICAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBuZXdQYXRjaC5tUGxheWJhY2sudGhyZWFkKCktPnNhbXBsZVJhdGUoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zb3VyY2VzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBwYXRjaC0+c291cmNlc1swXS5jaGFubmVsX21hc2s7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2luX21hc2tfZnJvbV9jb3VudChuZXdQYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5jaGFubmVsQ291bnQoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBhdWRpb19jaGFubmVsX2luX21hc2tfZnJvbV9jb3VudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC5tUGxheWJhY2sudGhyZWFkKCktPmNoYW5uZWxDb3VudCgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zb3VyY2VzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBwYXRjaC0+c291cmNlc1swXS5mb3JtYXQ7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IG5ld1BhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmZvcm1hdCgpOworICAgICAgICAgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gbmV3UGF0Y2gubVBsYXliYWNrLnRocmVhZCgpLT5mb3JtYXQoKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTID8KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmZsYWdzLmlucHV0IDogQVVESU9fSU5QVVRfRkxBR19OT05FOwogICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5vcGVuSW5wdXRfbChzcmNNb2R1bGUsCisgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbUF1ZGlvRmxpbmdlci5vcGVuSW5wdXRfbChzcmNNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfTUlDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX05PTkUpOwotICAgICAgICAgICAgICAgIG5ld1BhdGNoLT5tUmVjb3JkVGhyZWFkID0gKFJlY29yZFRocmVhZCAqKXRocmVhZC5nZXQoKTsKLSAgICAgICAgICAgICAgICBBTE9HVigiYXVkaW9mbGluZ2VyLT5vcGVuSW5wdXRfbCgpIHJldHVybmVkICVwIGluQ2hhbm5lbE1hc2sgJTA4eCIsCi0gICAgICAgICAgICAgICAgICAgICAgbmV3UGF0Y2gtPm1SZWNvcmRUaHJlYWQuZ2V0KCksIGNvbmZpZy5jaGFubmVsX21hc2spOwotICAgICAgICAgICAgICAgIGlmIChuZXdQYXRjaC0+bVJlY29yZFRocmVhZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICAgICAgICAgICAgICBBTE9HVigibUF1ZGlvRmxpbmdlci5vcGVuSW5wdXRfbCgpIHJldHVybmVkICVwIGluQ2hhbm5lbE1hc2sgJTA4eCIsCisgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkLmdldCgpLCBjb25maWcuY2hhbm5lbF9tYXNrKTsKKyAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gTk9fTUVNT1JZOwogICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNyZWF0ZVBhdGNoQ29ubmVjdGlvbnMobmV3UGF0Y2gsIHBhdGNoKTsKKyAgICAgICAgICAgICAgICBuZXdQYXRjaC5tUmVjb3JkLnNldFRocmVhZChyZWludGVycHJldF9jYXN0PFJlY29yZFRocmVhZCo+KHRocmVhZC5nZXQoKSkpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IG5ld1BhdGNoLmNyZWF0ZUNvbm5lY3Rpb25zKHRoaXMpOwogICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYXVkaW9Id0RldmljZS0+aXNJbnNlcnQoKSkgeworICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZE1vZHVsZSA9IGF1ZGlvSHdEZXZpY2UtPmhhbmRsZSgpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKLSAgICAgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5jaGVja1JlY29yZFRocmVhZF9sKAorICAgICAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtQXVkaW9GbGluZ2VyLmNoZWNrUmVjb3JkVGhyZWFkX2woCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5jaGVja01tYXBUaHJlYWRfbChwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkID0gbUF1ZGlvRmxpbmdlci5jaGVja01tYXBUaHJlYWRfbChwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBiYWQgY2FwdHVyZSBJL08gaGFuZGxlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgYmFkIGNhcHR1cmUgSS9PIGhhbmRsZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMzU2LDkgKzMzNSw5IEBACiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX01JWDogewogICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IHNyY01vZHVsZSA9ICBwYXRjaC0+c291cmNlc1swXS5leHQubWl4Lmh3X21vZHVsZTsKLSAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KHNyY01vZHVsZSk7CisgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvRmxpbmdlci5tQXVkaW9Id0RldnMuaW5kZXhPZktleShzcmNNb2R1bGUpOwogICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgYmFkIHNyYyBodyBtb2R1bGUgJWQiLCBzcmNNb2R1bGUpOworICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGJhZCBzcmMgaHcgbW9kdWxlICVkIiwgX19mdW5jX18sIHNyY01vZHVsZSk7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgIH0KQEAgLTM2Niw4ICszNDUsOCBAQAogICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBBVURJT19ERVZJQ0VfTk9ORTsKICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1tpXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBpbnZhbGlkIHNpbmsgdHlwZSAlZCBmb3IgbWl4IHNvdXJjZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1tpXS50eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgaW52YWxpZCBzaW5rIHR5cGUgJWQgZm9yIG1peCBzb3VyY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwYXRjaC0+c2lua3NbaV0udHlwZSk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgIH0KQEAgLTM3OSwyMSArMzU4LDIxIEBACiAgICAgICAgICAgICAgICAgdHlwZSB8PSBwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS50eXBlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb2ZsaW5nZXItPmNoZWNrUGxheWJhY2tUaHJlYWRfbChwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvRmxpbmdlci5jaGVja1BsYXliYWNrVGhyZWFkX2wocGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5jaGVja01tYXBUaHJlYWRfbChwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgdGhyZWFkID0gbUF1ZGlvRmxpbmdlci5jaGVja01tYXBUaHJlYWRfbChwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CiAgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgYmFkIHBsYXliYWNrIEkvTyBoYW5kbGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBiYWQgcGxheWJhY2sgSS9PIGhhbmRsZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRocmVhZCA9PSBhdWRpb2ZsaW5nZXItPnByaW1hcnlQbGF5YmFja1RocmVhZF9sKCkpIHsKKyAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gbUF1ZGlvRmxpbmdlci5wcmltYXJ5UGxheWJhY2tUaHJlYWRfbCgpKSB7CiAgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOwogICAgICAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwgKGludCl0eXBlKTsKIAotICAgICAgICAgICAgICAgIGF1ZGlvZmxpbmdlci0+YnJvYWNhc3RQYXJhbWV0ZXJzVG9SZWNvcmRUaHJlYWRzX2wocGFyYW0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgbUF1ZGlvRmxpbmdlci5icm9hY2FzdFBhcmFtZXRlcnNUb1JlY29yZFRocmVhZHNfbChwYXJhbS50b1N0cmluZygpKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZW5kQ3JlYXRlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KHBhdGNoLCAmaGFsSGFuZGxlKTsKQEAgLTQwMywyOTUgKzM4Miw0MTUgQEAKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiBleGl0OgotICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc3RhdHVzICVkIiwgc3RhdHVzKTsKKyAgICBBTE9HVigiJXMoKSBzdGF0dXMgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICpoYW5kbGUgPSAoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpIGF1ZGlvZmxpbmdlci0+bmV4dFVuaXF1ZUlkKEFVRElPX1VOSVFVRV9JRF9VU0VfUEFUQ0gpOwotICAgICAgICBuZXdQYXRjaC0+bUhhbmRsZSA9ICpoYW5kbGU7Ci0gICAgICAgIG5ld1BhdGNoLT5tSGFsSGFuZGxlID0gaGFsSGFuZGxlOwotICAgICAgICBtUGF0Y2hlcy5hZGQobmV3UGF0Y2gpOwotICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIGFkZGVkIG5ldyBwYXRjaCBoYW5kbGUgJWQgaGFsSGFuZGxlICVkIiwgKmhhbmRsZSwgaGFsSGFuZGxlKTsKKyAgICAgICAgKmhhbmRsZSA9IChhdWRpb19wYXRjaF9oYW5kbGVfdCkgbUF1ZGlvRmxpbmdlci5uZXh0VW5pcXVlSWQoQVVESU9fVU5JUVVFX0lEX1VTRV9QQVRDSCk7CisgICAgICAgIG5ld1BhdGNoLm1IYWxIYW5kbGUgPSBoYWxIYW5kbGU7CisgICAgICAgIG1QYXRjaGVzLmluc2VydChzdGQ6Om1ha2VfcGFpcigqaGFuZGxlLCBzdGQ6Om1vdmUobmV3UGF0Y2gpKSk7CisgICAgICAgIGlmIChpbnNlcnRlZE1vZHVsZSAhPSBBVURJT19NT0RVTEVfSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgIGFkZFNvZnR3YXJlUGF0Y2hUb0luc2VydGVkTW9kdWxlcyhpbnNlcnRlZE1vZHVsZSwgKmhhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIiVzKCkgYWRkZWQgbmV3IHBhdGNoIGhhbmRsZSAlZCBoYWxIYW5kbGUgJWQiLCBfX2Z1bmNfXywgKmhhbmRsZSwgaGFsSGFuZGxlKTsKICAgICB9IGVsc2UgewotICAgICAgICBjbGVhclBhdGNoQ29ubmVjdGlvbnMobmV3UGF0Y2gpOwotICAgICAgICBkZWxldGUgbmV3UGF0Y2g7CisgICAgICAgIG5ld1BhdGNoLmNsZWFyQ29ubmVjdGlvbnModGhpcyk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6Y3JlYXRlUGF0Y2hDb25uZWN0aW9ucyhQYXRjaCAqcGF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICphdWRpb1BhdGNoKQorQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpQYXRjaDo6flBhdGNoKCkKK3sKKyAgICBBTE9HRV9JRihpc1NvZnR3YXJlKCksICJTb2Z0d2FyZSBwYXRjaCBjb25uZWN0aW9ucyBsZWFrZWQgJWQgJWQiLAorICAgICAgICAgICAgbVJlY29yZC5oYW5kbGUoKSwgbVBsYXliYWNrLmhhbmRsZSgpKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpQYXRjaDo6Y3JlYXRlQ29ubmVjdGlvbnMoUGF0Y2hQYW5lbCAqcGFuZWwpCiB7CiAgICAgLy8gY3JlYXRlIHBhdGNoIGZyb20gc291cmNlIGRldmljZSB0byByZWNvcmQgdGhyZWFkIGlucHV0Ci0gICAgc3RydWN0IGF1ZGlvX3BhdGNoIHN1YlBhdGNoOwotICAgIHN1YlBhdGNoLm51bV9zb3VyY2VzID0gMTsKLSAgICBzdWJQYXRjaC5zb3VyY2VzWzBdID0gYXVkaW9QYXRjaC0+c291cmNlc1swXTsKLSAgICBzdWJQYXRjaC5udW1fc2lua3MgPSAxOwotCi0gICAgcGF0Y2gtPm1SZWNvcmRUaHJlYWQtPmdldEF1ZGlvUG9ydENvbmZpZygmc3ViUGF0Y2guc2lua3NbMF0pOwotICAgIHN1YlBhdGNoLnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPSBBVURJT19TT1VSQ0VfTUlDOwotCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gY3JlYXRlQXVkaW9QYXRjaCgmc3ViUGF0Y2gsICZwYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYW5lbC0+Y3JlYXRlQXVkaW9QYXRjaCgKKyAgICAgICAgICAgIFBhdGNoQnVpbGRlcigpLmFkZFNvdXJjZShtQXVkaW9QYXRjaC5zb3VyY2VzWzBdKS4KKyAgICAgICAgICAgICAgICBhZGRTaW5rKG1SZWNvcmQudGhyZWFkKCksIHsgLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9NSUMgfSkucGF0Y2goKSwKKyAgICAgICAgICAgIG1SZWNvcmQuaGFuZGxlUHRyKCkpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICAqbVJlY29yZC5oYW5kbGVQdHIoKSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAogICAgIC8vIGNyZWF0ZSBwYXRjaCBmcm9tIHBsYXliYWNrIHRocmVhZCBvdXRwdXQgdG8gc2luayBkZXZpY2UKLSAgICBpZiAoYXVkaW9QYXRjaC0+bnVtX3NpbmtzICE9IDApIHsKLSAgICAgICAgcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+Z2V0QXVkaW9Qb3J0Q29uZmlnKCZzdWJQYXRjaC5zb3VyY2VzWzBdKTsKLSAgICAgICAgc3ViUGF0Y2guc2lua3NbMF0gPSBhdWRpb1BhdGNoLT5zaW5rc1swXTsKLSAgICAgICAgc3RhdHVzID0gY3JlYXRlQXVkaW9QYXRjaCgmc3ViUGF0Y2gsICZwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUpOworICAgIGlmIChtQXVkaW9QYXRjaC5udW1fc2lua3MgIT0gMCkgeworICAgICAgICBzdGF0dXMgPSBwYW5lbC0+Y3JlYXRlQXVkaW9QYXRjaCgKKyAgICAgICAgICAgICAgICBQYXRjaEJ1aWxkZXIoKS5hZGRTb3VyY2UobVBsYXliYWNrLnRocmVhZCgpKS5hZGRTaW5rKG1BdWRpb1BhdGNoLnNpbmtzWzBdKS5wYXRjaCgpLAorICAgICAgICAgICAgICAgIG1QbGF5YmFjay5oYW5kbGVQdHIoKSk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICAgICAgKm1QbGF5YmFjay5oYW5kbGVQdHIoKSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIHBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICAqbVBsYXliYWNrLmhhbmRsZVB0cigpID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CiAgICAgfQogCiAgICAgLy8gdXNlIGEgcHNldWRvIExDTSBiZXR3ZWVuIGlucHV0IGFuZCBvdXRwdXQgZnJhbWVjb3VudAotICAgIHNpemVfdCBwbGF5YmFja0ZyYW1lQ291bnQgPSBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5mcmFtZUNvdW50KCk7CisgICAgc2l6ZV90IHBsYXliYWNrRnJhbWVDb3VudCA9IG1QbGF5YmFjay50aHJlYWQoKS0+ZnJhbWVDb3VudCgpOwogICAgIGludCBwbGF5YmFja1NoaWZ0ID0gX19idWlsdGluX2N0eihwbGF5YmFja0ZyYW1lQ291bnQpOwotICAgIHNpemVfdCByZWNvcmRGcmFtZWNvdW50ID0gcGF0Y2gtPm1SZWNvcmRUaHJlYWQtPmZyYW1lQ291bnQoKTsKLSAgICBpbnQgc2hpZnQgPSBfX2J1aWx0aW5fY3R6KHJlY29yZEZyYW1lY291bnQpOworICAgIHNpemVfdCByZWNvcmRGcmFtZUNvdW50ID0gbVJlY29yZC50aHJlYWQoKS0+ZnJhbWVDb3VudCgpOworICAgIGludCBzaGlmdCA9IF9fYnVpbHRpbl9jdHoocmVjb3JkRnJhbWVDb3VudCk7CiAgICAgaWYgKHBsYXliYWNrU2hpZnQgPCBzaGlmdCkgewogICAgICAgICBzaGlmdCA9IHBsYXliYWNrU2hpZnQ7CiAgICAgfQotICAgIHNpemVfdCBmcmFtZUNvdW50ID0gKHBsYXliYWNrRnJhbWVDb3VudCAqIHJlY29yZEZyYW1lY291bnQpID4+IHNoaWZ0OwotICAgIEFMT0dWKCJjcmVhdGVQYXRjaENvbm5lY3Rpb25zKCkgcGxheWZyYW1lQ291bnQgJXp1IHJlY29yZEZyYW1lY291bnQgJXp1IGZyYW1lQ291bnQgJXp1IiwKLSAgICAgICAgICBwbGF5YmFja0ZyYW1lQ291bnQsIHJlY29yZEZyYW1lY291bnQsIGZyYW1lQ291bnQpOworICAgIHNpemVfdCBmcmFtZUNvdW50ID0gKHBsYXliYWNrRnJhbWVDb3VudCAqIHJlY29yZEZyYW1lQ291bnQpID4+IHNoaWZ0OworICAgIEFMT0dWKCIlcygpIHBsYXlmcmFtZUNvdW50ICV6dSByZWNvcmRGcmFtZUNvdW50ICV6dSBmcmFtZUNvdW50ICV6dSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgcGxheWJhY2tGcmFtZUNvdW50LCByZWNvcmRGcmFtZUNvdW50LCBmcmFtZUNvdW50KTsKIAogICAgIC8vIGNyZWF0ZSBhIHNwZWNpYWwgcmVjb3JkIHRyYWNrIHRvIGNhcHR1cmUgZnJvbSByZWNvcmQgdGhyZWFkCi0gICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+Y2hhbm5lbENvdW50KCk7CisgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gbVBsYXliYWNrLnRocmVhZCgpLT5jaGFubmVsQ291bnQoKTsKICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBpbkNoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9pbl9tYXNrX2Zyb21fY291bnQoY2hhbm5lbENvdW50KTsKLSAgICBhdWRpb19jaGFubmVsX21hc2tfdCBvdXRDaGFubmVsTWFzayA9IHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmNoYW5uZWxNYXNrKCk7Ci0gICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPnNhbXBsZVJhdGUoKTsKLSAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5mb3JtYXQoKTsKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBvdXRDaGFubmVsTWFzayA9IG1QbGF5YmFjay50aHJlYWQoKS0+Y2hhbm5lbE1hc2soKTsKKyAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gbVBsYXliYWNrLnRocmVhZCgpLT5zYW1wbGVSYXRlKCk7CisgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gbVBsYXliYWNrLnRocmVhZCgpLT5mb3JtYXQoKTsKIAotICAgIHBhdGNoLT5tUGF0Y2hSZWNvcmQgPSBuZXcgUmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5tUmVjb3JkVGhyZWFkLmdldCgpLAorICAgIGF1ZGlvX2Zvcm1hdF90IGlucHV0Rm9ybWF0ID0gbVJlY29yZC50aHJlYWQoKS0+Zm9ybWF0KCk7CisgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKGlucHV0Rm9ybWF0KSkgeworICAgICAgICAvLyBUaGUgcGxheWJhY2tUaHJlYWQgZm9ybWF0IHdpbGwgc2F5IFBDTSBmb3IgSUVDNjE5MzcgcGFja2V0aXplZCBzdHJlYW0uCisgICAgICAgIC8vIFVzZSByZWNvcmRUaHJlYWQgZm9ybWF0LgorICAgICAgICBmb3JtYXQgPSBpbnB1dEZvcm1hdDsKKyAgICB9CisgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBpbnB1dEZsYWdzID0gbUF1ZGlvUGF0Y2guc291cmNlc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTID8KKyAgICAgICAgICAgIG1BdWRpb1BhdGNoLnNvdXJjZXNbMF0uZmxhZ3MuaW5wdXQgOiBBVURJT19JTlBVVF9GTEFHX05PTkU7CisgICAgaWYgKHNhbXBsZVJhdGUgPT0gbVJlY29yZC50aHJlYWQoKS0+c2FtcGxlUmF0ZSgpICYmCisgICAgICAgICAgICBpbkNoYW5uZWxNYXNrID09IG1SZWNvcmQudGhyZWFkKCktPmNoYW5uZWxNYXNrKCkgJiYKKyAgICAgICAgICAgIG1SZWNvcmQudGhyZWFkKCktPmZhc3RUcmFja0F2YWlsYWJsZSgpICYmCisgICAgICAgICAgICBtUmVjb3JkLnRocmVhZCgpLT5oYXNGYXN0Q2FwdHVyZSgpKSB7CisgICAgICAgIC8vIENyZWF0ZSBhIGZhc3QgdHJhY2sgaWYgdGhlIHJlY29yZCB0aHJlYWQgaGFzIGZhc3QgY2FwdHVyZSB0byBnZXQgYmV0dGVyIHBlcmZvcm1hbmNlLgorICAgICAgICAvLyBPbmx5IGVuYWJsZSBmYXN0IG1vZGUgd2hlbiB0aGVyZSBpcyBubyByZXNhbXBsZSBuZWVkZWQuCisgICAgICAgIGlucHV0RmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkgKGlucHV0RmxhZ3MgfCBBVURJT19JTlBVVF9GTEFHX0ZBU1QpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEZhc3QgbW9kZSBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgY2FzZS4KKyAgICAgICAgaW5wdXRGbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KSAoaW5wdXRGbGFncyAmIH5BVURJT19JTlBVVF9GTEFHX0ZBU1QpOworICAgIH0KKyAgICBzcDxSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkPiB0ZW1wUmVjb3JkVHJhY2sgPSBuZXcgKHN0ZDo6bm90aHJvdykgUmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZWNvcmQudGhyZWFkKCkuZ2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5DaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdCkwIC8qIGJ1ZmZlclNpemUgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX05PTkUpOwotICAgIGlmIChwYXRjaC0+bVBhdGNoUmVjb3JkID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0gICAgc3RhdHVzID0gcGF0Y2gtPm1QYXRjaFJlY29yZC0+aW5pdENoZWNrKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEZsYWdzKTsKKyAgICBzdGF0dXMgPSBtUmVjb3JkLmNoZWNrVHJhY2sodGVtcFJlY29yZFRyYWNrLmdldCgpKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQotICAgIHBhdGNoLT5tUmVjb3JkVGhyZWFkLT5hZGRQYXRjaFJlY29yZChwYXRjaC0+bVBhdGNoUmVjb3JkKTsKKworICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG91dHB1dEZsYWdzID0gbUF1ZGlvUGF0Y2guc2lua3NbMF0uY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GTEFHUyA/CisgICAgICAgICAgICBtQXVkaW9QYXRjaC5zaW5rc1swXS5mbGFncy5vdXRwdXQgOiBBVURJT19PVVRQVVRfRkxBR19OT05FOworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9QQVRDSDsKKyAgICBpZiAobUF1ZGlvUGF0Y2gubnVtX3NvdXJjZXMgPT0gMiAmJiBtQXVkaW9QYXRjaC5zb3VyY2VzWzFdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgeworICAgICAgICAvLyAicmV1c2Ugb25lIGV4aXN0aW5nIG91dHB1dCBtaXgiIGNhc2UKKyAgICAgICAgc3RyZWFtVHlwZSA9IG1BdWRpb1BhdGNoLnNvdXJjZXNbMV0uZXh0Lm1peC51c2VjYXNlLnN0cmVhbTsKKyAgICB9CisgICAgaWYgKG1QbGF5YmFjay50aHJlYWQoKS0+aGFzRmFzdE1peGVyKCkpIHsKKyAgICAgICAgLy8gQ3JlYXRlIGEgZmFzdCB0cmFjayBpZiB0aGUgcGxheWJhY2sgdGhyZWFkIGhhcyBmYXN0IG1peGVyIHRvIGdldCBiZXR0ZXIgcGVyZm9ybWFuY2UuCisgICAgICAgIG91dHB1dEZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAob3V0cHV0RmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19GQVNUKTsKKyAgICB9CiAKICAgICAvLyBjcmVhdGUgYSBzcGVjaWFsIHBsYXliYWNrIHRyYWNrIHRvIHJlbmRlciB0byBwbGF5YmFjayB0aHJlYWQuCiAgICAgLy8gdGhpcyB0cmFjayBpcyBnaXZlbiB0aGUgc2FtZSBidWZmZXIgYXMgdGhlIFBhdGNoUmVjb3JkIGJ1ZmZlcgotICAgIHBhdGNoLT5tUGF0Y2hUcmFjayA9IG5ldyBQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjaygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvUGF0Y2gtPnNvdXJjZXNbMV0uZXh0Lm1peC51c2VjYXNlLnN0cmVhbSwKKyAgICBzcDxQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjaz4gdGVtcFBhdGNoVHJhY2sgPSBuZXcgKHN0ZDo6bm90aHJvdykgUGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrLnRocmVhZCgpLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRDaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bVBhdGNoUmVjb3JkLT5idWZmZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bVBhdGNoUmVjb3JkLT5idWZmZXJTaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSk7Ci0gICAgc3RhdHVzID0gcGF0Y2gtPm1QYXRjaFRyYWNrLT5pbml0Q2hlY2soKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wUmVjb3JkVHJhY2stPmJ1ZmZlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBSZWNvcmRUcmFjay0+YnVmZmVyU2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZsYWdzKTsKKyAgICBzdGF0dXMgPSBtUGxheWJhY2suY2hlY2tUcmFjayh0ZW1wUGF0Y2hUcmFjay5nZXQoKSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KLSAgICBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5hZGRQYXRjaFRyYWNrKHBhdGNoLT5tUGF0Y2hUcmFjayk7CiAKICAgICAvLyB0aWUgcGxheWJhY2sgYW5kIHJlY29yZCB0cmFja3MgdG9nZXRoZXIKLSAgICBwYXRjaC0+bVBhdGNoUmVjb3JkLT5zZXRQZWVyUHJveHkocGF0Y2gtPm1QYXRjaFRyYWNrLmdldCgpKTsKLSAgICBwYXRjaC0+bVBhdGNoVHJhY2stPnNldFBlZXJQcm94eShwYXRjaC0+bVBhdGNoUmVjb3JkLmdldCgpKTsKKyAgICBtUmVjb3JkLnNldFRyYWNrQW5kUGVlcih0ZW1wUmVjb3JkVHJhY2ssIHRlbXBQYXRjaFRyYWNrLmdldCgpKTsKKyAgICBtUGxheWJhY2suc2V0VHJhY2tBbmRQZWVyKHRlbXBQYXRjaFRyYWNrLCB0ZW1wUmVjb3JkVHJhY2suZ2V0KCkpOwogCiAgICAgLy8gc3RhcnQgY2FwdHVyZSBhbmQgcGxheWJhY2sKLSAgICBwYXRjaC0+bVBhdGNoUmVjb3JkLT5zdGFydChBdWRpb1N5c3RlbTo6U1lOQ19FVkVOVF9OT05FLCBBVURJT19TRVNTSU9OX05PTkUpOwotICAgIHBhdGNoLT5tUGF0Y2hUcmFjay0+c3RhcnQoKTsKKyAgICBtUmVjb3JkLnRyYWNrKCktPnN0YXJ0KEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX05PTkUsIEFVRElPX1NFU1NJT05fTk9ORSk7CisgICAgbVBsYXliYWNrLnRyYWNrKCktPnN0YXJ0KCk7CiAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6Y2xlYXJQYXRjaENvbm5lY3Rpb25zKFBhdGNoICpwYXRjaCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpQYXRjaDo6Y2xlYXJDb25uZWN0aW9ucyhQYXRjaFBhbmVsICpwYW5lbCkKIHsKLSAgICBzcDxBdWRpb0ZsaW5nZXI+IGF1ZGlvZmxpbmdlciA9IG1BdWRpb0ZsaW5nZXIucHJvbW90ZSgpOwotICAgIGlmIChhdWRpb2ZsaW5nZXIgPT0gMCkgewotICAgICAgICByZXR1cm47CisgICAgQUxPR1YoIiVzKCkgbVJlY29yZC5oYW5kbGUgJWQgbVBsYXliYWNrLmhhbmRsZSAlZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbVJlY29yZC5oYW5kbGUoKSwgbVBsYXliYWNrLmhhbmRsZSgpKTsKKyAgICBtUmVjb3JkLnN0b3BUcmFjaygpOworICAgIG1QbGF5YmFjay5zdG9wVHJhY2soKTsKKyAgICBtUmVjb3JkLmNsb3NlQ29ubmVjdGlvbnMocGFuZWwpOworICAgIG1QbGF5YmFjay5jbG9zZUNvbm5lY3Rpb25zKHBhbmVsKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpQYXRjaDo6Z2V0TGF0ZW5jeU1zKGRvdWJsZSAqbGF0ZW5jeU1zKSBjb25zdAoreworICAgIGlmICghaXNTb2Z0d2FyZSgpKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisKKyAgICBhdXRvIHJlY29yZFRyYWNrID0gbVJlY29yZC5jb25zdF90cmFjaygpOworICAgIGlmIChyZWNvcmRUcmFjay5nZXQoKSA9PSBudWxscHRyKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisKKyAgICBhdXRvIHBsYXliYWNrVHJhY2sgPSBtUGxheWJhY2suY29uc3RfdHJhY2soKTsKKyAgICBpZiAocGxheWJhY2tUcmFjay5nZXQoKSA9PSBudWxscHRyKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisKKyAgICAvLyBMYXRlbmN5IGluZm9ybWF0aW9uIGZvciB0cmFja3MgbWF5IGJlIGNhbGxlZCB3aXRob3V0IG9idGFpbmluZworICAgIC8vIHRoZSB1bmRlcmx5aW5nIHRocmVhZCBsb2NrLgorICAgIC8vCisgICAgLy8gV2UgdXNlIHJlY29yZCBzZXJ2ZXIgbGF0ZW5jeSArIHBsYXliYWNrIHRyYWNrIGxhdGVuY3kgKGdlbmVyYWxseSBzbWFsbGVyIHRoYW4gdGhlCisgICAgLy8gcmV2ZXJzZSBkdWUgdG8gaW50ZXJuYWwgYmlhc2VzKS4KKyAgICAvLworICAgIC8vIFRPRE86IGlzIHRoaXMgc3RhYmxlIGVub3VnaD8gQ29uc2lkZXIgYSBQYXRjaFRyYWNrIHN5bmNocm9uaXplZCB2ZXJzaW9uIG9mIHRoaXMuCisKKyAgICAvLyBGb3IgUENNIHRyYWNrcyBnZXQgc2VydmVyIGxhdGVuY3kuCisgICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20ocmVjb3JkVHJhY2stPmZvcm1hdCgpKSkgeworICAgICAgICBkb3VibGUgcmVjb3JkU2VydmVyTGF0ZW5jeU1zLCBwbGF5YmFja1RyYWNrTGF0ZW5jeU1zOworICAgICAgICBpZiAocmVjb3JkVHJhY2stPmdldFNlcnZlckxhdGVuY3lNcygmcmVjb3JkU2VydmVyTGF0ZW5jeU1zKSA9PSBPSworICAgICAgICAgICAgICAgICYmIHBsYXliYWNrVHJhY2stPmdldFRyYWNrTGF0ZW5jeU1zKCZwbGF5YmFja1RyYWNrTGF0ZW5jeU1zKSA9PSBPSykgeworICAgICAgICAgICAgKmxhdGVuY3lNcyA9IHJlY29yZFNlcnZlckxhdGVuY3lNcyArIHBsYXliYWNrVHJhY2tMYXRlbmN5TXM7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBBTE9HVigiY2xlYXJQYXRjaENvbm5lY3Rpb25zKCkgcGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSAlZCBwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUgJWQiLAotICAgICAgICAgIHBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUsIHBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSk7CisgICAgLy8gU2VlIGlmIGtlcm5lbCBsYXRlbmNpZXMgYXJlIGF2YWlsYWJsZS4KKyAgICAvLyBJZiBzbywgZG8gYSBmcmFtZSBkaWZmIGFuZCB0aW1lIGRpZmZlcmVuY2UgY29tcHV0YXRpb24gdG8gZXN0aW1hdGUKKyAgICAvLyB0aGUgdG90YWwgcGF0Y2ggbGF0ZW5jeS4gVGhpcyByZXF1aXJlcyB0aGF0IGZyYW1lIGNvdW50cyBhcmUgcmVwb3J0ZWQgYnkgdGhlCisgICAgLy8gSEFMIGFyZSBtYXRjaGVkIHByb3Blcmx5IGluIHRoZSBjYXNlIG9mIHJlY29yZCBvdmVycnVucyBhbmQgcGxheWJhY2sgdW5kZXJydW5zLgorICAgIFRocmVhZEJhc2U6OlRyYWNrQmFzZTo6RnJhbWVUaW1lIHJlY29yZEZUe30sIHBsYXlGVHt9OworICAgIHJlY29yZFRyYWNrLT5nZXRLZXJuZWxGcmFtZVRpbWUoJnJlY29yZEZUKTsKKyAgICBwbGF5YmFja1RyYWNrLT5nZXRLZXJuZWxGcmFtZVRpbWUoJnBsYXlGVCk7CisgICAgaWYgKHJlY29yZEZULnRpbWVOcyA+IDAgJiYgcGxheUZULnRpbWVOcyA+IDApIHsKKyAgICAgICAgY29uc3QgaW50NjRfdCBmcmFtZURpZmYgPSByZWNvcmRGVC5mcmFtZXMgLSBwbGF5RlQuZnJhbWVzOworICAgICAgICBjb25zdCBpbnQ2NF90IHRpbWVEaWZmTnMgPSByZWNvcmRGVC50aW1lTnMgLSBwbGF5RlQudGltZU5zOwogCi0gICAgaWYgKHBhdGNoLT5tUGF0Y2hSZWNvcmQgIT0gMCkgewotICAgICAgICBwYXRjaC0+bVBhdGNoUmVjb3JkLT5zdG9wKCk7Ci0gICAgfQotICAgIGlmIChwYXRjaC0+bVBhdGNoVHJhY2sgIT0gMCkgewotICAgICAgICBwYXRjaC0+bVBhdGNoVHJhY2stPnN0b3AoKTsKLSAgICB9Ci0gICAgaWYgKHBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKLSAgICAgICAgcmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSk7Ci0gICAgICAgIHBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICB9Ci0gICAgaWYgKHBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewotICAgICAgICByZWxlYXNlQXVkaW9QYXRjaChwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUpOwotICAgICAgICBwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICB9Ci0gICAgaWYgKHBhdGNoLT5tUmVjb3JkVGhyZWFkICE9IDApIHsKLSAgICAgICAgaWYgKHBhdGNoLT5tUGF0Y2hSZWNvcmQgIT0gMCkgewotICAgICAgICAgICAgcGF0Y2gtPm1SZWNvcmRUaHJlYWQtPmRlbGV0ZVBhdGNoUmVjb3JkKHBhdGNoLT5tUGF0Y2hSZWNvcmQpOworICAgICAgICAvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBwYXRjaCB0cmFjayBhbmQgcGF0Y2ggcmVjb3JkIGhhdmUgYSBsYXJnZSB0aW1lIGRpc3Bhcml0eSBiZWNhdXNlCisgICAgICAgIC8vIG9uZSB0aHJlYWQgcnVucyBidXQgYW5vdGhlciBpcyBzdG9wcGVkLiAgV2UgYXJiaXRyYXJpbHkgY2hvb3NlIHRoZSBtYXhpbXVtIHRpbWVzdGFtcAorICAgICAgICAvLyB0aW1lIGRpZmZlcmVuY2UgYmFzZWQgb24gaG93IG9mdGVuIHdlIGV4cGVjdCB0aGUgdGltZXN0YW1wcyB0byB1cGRhdGUgaW4gbm9ybWFsIG9wZXJhdGlvbgorICAgICAgICAvLyAodHlwaWNhbCBzaG91bGQgYmUgbm8gbW9yZSB0aGFuIDUwIG1zKS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gSWYgdGhlIHRpbWVzdGFtcHMgYXJlbid0IHNhbXBsZWQgY2xvc2UgZW5vdWdoLCB0aGUgcGF0Y2ggbGF0ZW5jeSBpcyBub3QKKyAgICAgICAgLy8gY29uc2lkZXJlZCB2YWxpZC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gVE9ETzogY2hhbmdlIHRoaXMgYmFzZWQgb24gbW9yZSBleHBlcmltZW50cy4KKyAgICAgICAgY29uc3RleHByIGludDY0X3QgbWF4VmFsaWRUaW1lRGlmZk5zID0gMjAwICogTkFOT1NfUEVSX01JTExJU0VDT05EOworICAgICAgICBpZiAoc3RkOjphYnModGltZURpZmZOcykgPCBtYXhWYWxpZFRpbWVEaWZmTnMpIHsKKyAgICAgICAgICAgICpsYXRlbmN5TXMgPSBmcmFtZURpZmYgKiAxZTMgLyByZWNvcmRUcmFjay0+c2FtcGxlUmF0ZSgpCisgICAgICAgICAgICAgICAgICAgLSB0aW1lRGlmZk5zICogMWUtNjsKKyAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQotICAgICAgICBhdWRpb2ZsaW5nZXItPmNsb3NlSW5wdXRJbnRlcm5hbF9sKHBhdGNoLT5tUmVjb3JkVGhyZWFkKTsKLSAgICB9Ci0gICAgaWYgKHBhdGNoLT5tUGxheWJhY2tUaHJlYWQgIT0gMCkgewotICAgICAgICBpZiAocGF0Y2gtPm1QYXRjaFRyYWNrICE9IDApIHsKLSAgICAgICAgICAgIHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmRlbGV0ZVBhdGNoVHJhY2socGF0Y2gtPm1QYXRjaFRyYWNrKTsKLSAgICAgICAgfQotICAgICAgICAvLyBpZiBudW0gc291cmNlcyA9PSAyIHdlIGFyZSByZXVzaW5nIGFuIGV4aXN0aW5nIHBsYXliYWNrIHRocmVhZCBzbyB3ZSBkbyBub3QgY2xvc2UgaXQKLSAgICAgICAgaWYgKHBhdGNoLT5tQXVkaW9QYXRjaC5udW1fc291cmNlcyAhPSAyKSB7Ci0gICAgICAgICAgICBhdWRpb2ZsaW5nZXItPmNsb3NlT3V0cHV0SW50ZXJuYWxfbChwYXRjaC0+bVBsYXliYWNrVGhyZWFkKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocGF0Y2gtPm1SZWNvcmRUaHJlYWQgIT0gMCkgewotICAgICAgICBpZiAocGF0Y2gtPm1QYXRjaFJlY29yZCAhPSAwKSB7Ci0gICAgICAgICAgICBwYXRjaC0+bVBhdGNoUmVjb3JkLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcGF0Y2gtPm1SZWNvcmRUaHJlYWQuY2xlYXIoKTsKLSAgICB9Ci0gICAgaWYgKHBhdGNoLT5tUGxheWJhY2tUaHJlYWQgIT0gMCkgewotICAgICAgICBpZiAocGF0Y2gtPm1QYXRjaFRyYWNrICE9IDApIHsKLSAgICAgICAgICAgIHBhdGNoLT5tUGF0Y2hUcmFjay5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIHBhdGNoLT5tUGxheWJhY2tUaHJlYWQuY2xlYXIoKTsKICAgICB9CiAKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK1N0cmluZzggQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpQYXRjaDo6ZHVtcChhdWRpb19wYXRjaF9oYW5kbGVfdCBteUhhbmRsZSkgY29uc3QKK3sKKyAgICAvLyBUT0RPOiBDb25zaWRlciB0YWJsZSBkdW1wIGZvcm0gZm9yIHBhdGNoZXMsIGp1c3QgbGlrZSB0cmFja3MuCisgICAgU3RyaW5nOCByZXN1bHQgPSBTdHJpbmc4Ojpmb3JtYXQoIlBhdGNoICVkOiB0aHJlYWQgJXAgPT4gdGhyZWFkICVwIiwKKyAgICAgICAgICAgIG15SGFuZGxlLCBtUmVjb3JkLmNvbnN0X3RocmVhZCgpLmdldCgpLCBtUGxheWJhY2suY29uc3RfdGhyZWFkKCkuZ2V0KCkpOworCisgICAgLy8gYWRkIGxhdGVuY3kgaWYgaXQgZXhpc3RzCisgICAgZG91YmxlIGxhdGVuY3lNczsKKyAgICBpZiAoZ2V0TGF0ZW5jeU1zKCZsYXRlbmN5TXMpID09IE9LKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgbGF0ZW5jeTogJS4ybGYgbXMiLCBsYXRlbmN5TXMpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBEaXNjb25uZWN0IGEgcGF0Y2ggKi8KIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQogewotICAgIEFMT0dWKCJyZWxlYXNlQXVkaW9QYXRjaCBoYW5kbGUgJWQiLCBoYW5kbGUpOworICAgIEFMT0dWKCIlcyBoYW5kbGUgJWQiLCBfX2Z1bmNfXywgaGFuZGxlKTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBzaXplX3QgaW5kZXg7CiAKLSAgICBzcDxBdWRpb0ZsaW5nZXI+IGF1ZGlvZmxpbmdlciA9IG1BdWRpb0ZsaW5nZXIucHJvbW90ZSgpOwotICAgIGlmIChhdWRpb2ZsaW5nZXIgPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0KLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBtUGF0Y2hlcy5zaXplKCk7IGluZGV4KyspIHsKLSAgICAgICAgaWYgKGhhbmRsZSA9PSBtUGF0Y2hlc1tpbmRleF0tPm1IYW5kbGUpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChpbmRleCA9PSBtUGF0Y2hlcy5zaXplKCkpIHsKKyAgICBhdXRvIGl0ZXIgPSBtUGF0Y2hlcy5maW5kKGhhbmRsZSk7CisgICAgaWYgKGl0ZXIgPT0gbVBhdGNoZXMuZW5kKCkpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgUGF0Y2ggKnJlbW92ZWRQYXRjaCA9IG1QYXRjaGVzW2luZGV4XTsKLSAgICBtUGF0Y2hlcy5yZW1vdmVBdChpbmRleCk7CisgICAgUGF0Y2ggJnJlbW92ZWRQYXRjaCA9IGl0ZXItPnNlY29uZDsKKyAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggJnBhdGNoID0gcmVtb3ZlZFBhdGNoLm1BdWRpb1BhdGNoOwogCi0gICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCA9ICZyZW1vdmVkUGF0Y2gtPm1BdWRpb1BhdGNoOwotCi0gICAgc3dpdGNoIChwYXRjaC0+c291cmNlc1swXS50eXBlKSB7CisgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICZzcmMgPSBwYXRjaC5zb3VyY2VzWzBdOworICAgIHN3aXRjaCAoc3JjLnR5cGUpIHsKICAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfREVWSUNFOiB7Ci0gICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3Qgc3JjTW9kdWxlID0gcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS5od19tb2R1bGU7Ci0gICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMuaW5kZXhPZktleShzcmNNb2R1bGUpOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJyZWxlYXNlQXVkaW9QYXRjaCgpIGJhZCBzcmMgaHcgbW9kdWxlICVkIiwgc3JjTW9kdWxlKTsKKyAgICAgICAgICAgIHNwPERldmljZUhhbEludGVyZmFjZT4gaHdEZXZpY2UgPSBmaW5kSHdEZXZpY2VCeU1vZHVsZShzcmMuZXh0LmRldmljZS5od19tb2R1bGUpOworICAgICAgICAgICAgaWYgKGh3RGV2aWNlID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBiYWQgc3JjIGh3IG1vZHVsZSAlZCIsIF9fZnVuY19fLCBzcmMuZXh0LmRldmljZS5od19tb2R1bGUpOwogICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHJlbW92ZWRQYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FIHx8Ci0gICAgICAgICAgICAgICAgICAgIHJlbW92ZWRQYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBjbGVhclBhdGNoQ29ubmVjdGlvbnMocmVtb3ZlZFBhdGNoKTsKKyAgICAgICAgICAgIGlmIChyZW1vdmVkUGF0Y2guaXNTb2Z0d2FyZSgpKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlZFBhdGNoLmNsZWFyQ29ubmVjdGlvbnModGhpcyk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7Ci0gICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5jaGVja1JlY29yZFRocmVhZF9sKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICBpZiAocGF0Y2guc2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CisgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUgPSBwYXRjaC5zaW5rc1swXS5leHQubWl4LmhhbmRsZTsKKyAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtQXVkaW9GbGluZ2VyLmNoZWNrUmVjb3JkVGhyZWFkX2woaW9IYW5kbGUpOwogICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICB0aHJlYWQgPSBhdWRpb2ZsaW5nZXItPmNoZWNrTW1hcFRocmVhZF9sKHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIHRocmVhZCA9IG1BdWRpb0ZsaW5nZXIuY2hlY2tNbWFwVGhyZWFkX2woaW9IYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJyZWxlYXNlQXVkaW9QYXRjaCgpIGJhZCBjYXB0dXJlIEkvTyBoYW5kbGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGJhZCBjYXB0dXJlIEkvTyBoYW5kbGUgJWQiLCBfX2Z1bmNfXywgaW9IYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZW5kUmVsZWFzZUF1ZGlvUGF0Y2hDb25maWdFdmVudChyZW1vdmVkUGF0Y2gtPm1IYWxIYW5kbGUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2VuZFJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnQocmVtb3ZlZFBhdGNoLm1IYWxIYW5kbGUpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgICAgICAgICAgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiBod0RldmljZSA9IGF1ZGlvSHdEZXZpY2UtPmh3RGV2aWNlKCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gaHdEZXZpY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHJlbW92ZWRQYXRjaC0+bUhhbEhhbmRsZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gaHdEZXZpY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHJlbW92ZWRQYXRjaC5tSGFsSGFuZGxlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfTUlYOiB7Ci0gICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3Qgc3JjTW9kdWxlID0gIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaHdfbW9kdWxlOwotICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLmluZGV4T2ZLZXkoc3JjTW9kdWxlKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygicmVsZWFzZUF1ZGlvUGF0Y2goKSBiYWQgc3JjIGh3IG1vZHVsZSAlZCIsIHNyY01vZHVsZSk7CisgICAgICAgICAgICBpZiAoZmluZEh3RGV2aWNlQnlNb2R1bGUoc3JjLmV4dC5taXguaHdfbW9kdWxlKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgYmFkIHNyYyBodyBtb2R1bGUgJWQiLCBfX2Z1bmNfXywgc3JjLmV4dC5taXguaHdfbW9kdWxlKTsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvZmxpbmdlci0+Y2hlY2tQbGF5YmFja1RocmVhZF9sKHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlID0gc3JjLmV4dC5taXguaGFuZGxlOworICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbUF1ZGlvRmxpbmdlci5jaGVja1BsYXliYWNrVGhyZWFkX2woaW9IYW5kbGUpOwogICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5jaGVja01tYXBUaHJlYWRfbChwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgdGhyZWFkID0gbUF1ZGlvRmxpbmdlci5jaGVja01tYXBUaHJlYWRfbChpb0hhbmRsZSk7CiAgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJyZWxlYXNlQXVkaW9QYXRjaCgpIGJhZCBwbGF5YmFjayBJL08gaGFuZGxlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgYmFkIHBsYXliYWNrIEkvTyBoYW5kbGUgJWQiLCBfX2Z1bmNfXywgaW9IYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2VuZFJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnQocmVtb3ZlZFBhdGNoLT5tSGFsSGFuZGxlKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2VuZFJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnQocmVtb3ZlZFBhdGNoLm1IYWxIYW5kbGUpOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgZGVsZXRlIHJlbW92ZWRQYXRjaDsKKyAgICBtUGF0Y2hlcy5lcmFzZShpdGVyKTsKKyAgICByZW1vdmVTb2Z0d2FyZVBhdGNoRnJvbUluc2VydGVkTW9kdWxlcyhoYW5kbGUpOwogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLQogLyogTGlzdCBjb25uZWN0ZWQgYXVkaW8gcG9ydHMgYW5kIHRoZXkgYXR0cmlidXRlcyAqLwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzIF9fdW51c2VkKQogewotICAgIEFMT0dWKCJsaXN0QXVkaW9QYXRjaGVzIik7CisgICAgQUxPR1YoX19mdW5jX18pOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotLyogU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbiAqLwotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmdldERvd25zdHJlYW1Tb2Z0d2FyZVBhdGNoZXMoCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHN0cmVhbSwKKyAgICAgICAgc3RkOjp2ZWN0b3I8QXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpTb2Z0d2FyZVBhdGNoPiAqcGF0Y2hlcykgY29uc3QKIHsKLSAgICBBTE9HVigic2V0QXVkaW9Qb3J0Q29uZmlnIik7Ci0KLSAgICBzcDxBdWRpb0ZsaW5nZXI+IGF1ZGlvZmxpbmdlciA9IG1BdWRpb0ZsaW5nZXIucHJvbW90ZSgpOwotICAgIGlmIChhdWRpb2ZsaW5nZXIgPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIG1vZHVsZSA6IG1JbnNlcnRlZE1vZHVsZXMpIHsKKyAgICAgICAgaWYgKG1vZHVsZS5zZWNvbmQuc3RyZWFtcy5jb3VudChzdHJlYW0pKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHBhdGNoSGFuZGxlIDogbW9kdWxlLnNlY29uZC5zd19wYXRjaGVzKSB7CisgICAgICAgICAgICAgICAgY29uc3QgYXV0byYgcGF0Y2hfaXRlciA9IG1QYXRjaGVzLmZpbmQocGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgICAgIGlmIChwYXRjaF9pdGVyICE9IG1QYXRjaGVzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhdGNoICZwYXRjaCA9IHBhdGNoX2l0ZXItPnNlY29uZDsKKyAgICAgICAgICAgICAgICAgICAgcGF0Y2hlcy0+ZW1wbGFjZV9iYWNrKCp0aGlzLCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC5tUGxheWJhY2suY29uc3RfdGhyZWFkKCktPmlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gubVJlY29yZC5jb25zdF90aHJlYWQoKS0+aWQoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlN0YWxlIHBhdGNoIGhhbmRsZSBpbiB0aGUgY2FjaGU6ICVkIiwgcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQogICAgIH0KKyAgICAvLyBUaGUgc3RyZWFtIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IG9mIGluc2VydGVkIG1vZHVsZXMuCisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KIAotICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGU7Ci0gICAgaWYgKGNvbmZpZy0+dHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7Ci0gICAgICAgIG1vZHVsZSA9IGNvbmZpZy0+ZXh0LmRldmljZS5od19tb2R1bGU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbW9kdWxlID0gY29uZmlnLT5leHQubWl4Lmh3X21vZHVsZTsKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpub3RpZnlTdHJlYW1PcGVuZWQoCisgICAgICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UsIGF1ZGlvX2lvX2hhbmRsZV90IHN0cmVhbSkKK3sKKyAgICBpZiAoYXVkaW9Id0RldmljZS0+aXNJbnNlcnQoKSkgeworICAgICAgICBtSW5zZXJ0ZWRNb2R1bGVzW2F1ZGlvSHdEZXZpY2UtPmhhbmRsZSgpXS5zdHJlYW1zLmluc2VydChzdHJlYW0pOwogICAgIH0KK30KIAotICAgIHNzaXplX3QgaW5kZXggPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KG1vZHVsZSk7Cit2b2lkIEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6bm90aWZ5U3RyZWFtQ2xvc2VkKGF1ZGlvX2lvX2hhbmRsZV90IHN0cmVhbSkKK3sKKyAgICBmb3IgKGF1dG8mIG1vZHVsZSA6IG1JbnNlcnRlZE1vZHVsZXMpIHsKKyAgICAgICAgbW9kdWxlLnNlY29uZC5zdHJlYW1zLmVyYXNlKHN0cmVhbSk7CisgICAgfQorfQorCitBdWRpb0h3RGV2aWNlKiBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmZpbmRBdWRpb0h3RGV2aWNlQnlNb2R1bGUoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSkKK3sKKyAgICBpZiAobW9kdWxlID09IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORSkgcmV0dXJuIG51bGxwdHI7CisgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb0ZsaW5nZXIubUF1ZGlvSHdEZXZzLmluZGV4T2ZLZXkobW9kdWxlKTsKICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJzZXRBdWRpb1BvcnRDb25maWcoKSBiYWQgaHcgbW9kdWxlICVkIiwgbW9kdWxlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR1coIiVzKCkgYmFkIGh3IG1vZHVsZSAlZCIsIF9fZnVuY19fLCBtb2R1bGUpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIG1BdWRpb0ZsaW5nZXIubUF1ZGlvSHdEZXZzLnZhbHVlQXQoaW5kZXgpOworfQorCitzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6ZmluZEh3RGV2aWNlQnlNb2R1bGUoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSkKK3sKKyAgICBBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlID0gZmluZEF1ZGlvSHdEZXZpY2VCeU1vZHVsZShtb2R1bGUpOworICAgIHJldHVybiBhdWRpb0h3RGV2aWNlID8gYXVkaW9Id0RldmljZS0+aHdEZXZpY2UoKSA6IG51bGxwdHI7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjphZGRTb2Z0d2FyZVBhdGNoVG9JbnNlcnRlZE1vZHVsZXMoCisgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBtSW5zZXJ0ZWRNb2R1bGVzW21vZHVsZV0uc3dfcGF0Y2hlcy5pbnNlcnQoaGFuZGxlKTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OnJlbW92ZVNvZnR3YXJlUGF0Y2hGcm9tSW5zZXJ0ZWRNb2R1bGVzKAorICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgZm9yIChhdXRvJiBtb2R1bGUgOiBtSW5zZXJ0ZWRNb2R1bGVzKSB7CisgICAgICAgIG1vZHVsZS5zZWNvbmQuc3dfcGF0Y2hlcy5lcmFzZShoYW5kbGUpOworICAgIH0KK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmR1bXAoaW50IGZkKSBjb25zdAoreworICAgIFN0cmluZzggcGF0Y2hQYW5lbER1bXA7CisgICAgY29uc3QgY2hhciAqaW5kZW50ID0gIiAgIjsKKworICAgIC8vIE9ubHkgZHVtcCBzb2Z0d2FyZSBwYXRjaGVzLgorICAgIGJvb2wgaGVhZGVyUHJpbnRlZCA9IGZhbHNlOworICAgIGZvciAoY29uc3QgYXV0byYgaXRlciA6IG1QYXRjaGVzKSB7CisgICAgICAgIGlmIChpdGVyLnNlY29uZC5pc1NvZnR3YXJlKCkpIHsKKyAgICAgICAgICAgIGlmICghaGVhZGVyUHJpbnRlZCkgeworICAgICAgICAgICAgICAgIHBhdGNoUGFuZWxEdW1wICs9ICJcblNvZnR3YXJlIHBhdGNoZXM6XG4iOworICAgICAgICAgICAgICAgIGhlYWRlclByaW50ZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGF0Y2hQYW5lbER1bXAuYXBwZW5kRm9ybWF0KCIlcyVzXG4iLCBpbmRlbnQsIGl0ZXIuc2Vjb25kLmR1bXAoaXRlci5maXJzdCkuc3RyaW5nKCkpOworICAgICAgICB9CiAgICAgfQogCi0gICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLnZhbHVlQXQoaW5kZXgpOwotICAgIHJldHVybiBhdWRpb0h3RGV2aWNlLT5od0RldmljZSgpLT5zZXRBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKKyAgICBoZWFkZXJQcmludGVkID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBhdXRvJiBtb2R1bGUgOiBtSW5zZXJ0ZWRNb2R1bGVzKSB7CisgICAgICAgIGlmICghbW9kdWxlLnNlY29uZC5zdHJlYW1zLmVtcHR5KCkgfHwgIW1vZHVsZS5zZWNvbmQuc3dfcGF0Y2hlcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBpZiAoIWhlYWRlclByaW50ZWQpIHsKKyAgICAgICAgICAgICAgICBwYXRjaFBhbmVsRHVtcCArPSAiXG5UcmFja2VkIGluc2VydGVkIG1vZHVsZXM6XG4iOworICAgICAgICAgICAgICAgIGhlYWRlclByaW50ZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nOCBtb2R1bGVEdW1wID0gU3RyaW5nODo6Zm9ybWF0KCJNb2R1bGUgJWQ6IEkvTyBoYW5kbGVzOiAiLCBtb2R1bGUuZmlyc3QpOworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzdHJlYW0gOiBtb2R1bGUuc2Vjb25kLnN0cmVhbXMpIHsKKyAgICAgICAgICAgICAgICBtb2R1bGVEdW1wLmFwcGVuZEZvcm1hdCgiJWQgIiwgc3RyZWFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1vZHVsZUR1bXAuYXBwZW5kKCI7IFNXIFBhdGNoZXM6ICIpOworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwYXRjaCA6IG1vZHVsZS5zZWNvbmQuc3dfcGF0Y2hlcykgeworICAgICAgICAgICAgICAgIG1vZHVsZUR1bXAuYXBwZW5kRm9ybWF0KCIlZCAiLCBwYXRjaCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXRjaFBhbmVsRHVtcC5hcHBlbmRGb3JtYXQoIiVzJXNcbiIsIGluZGVudCwgbW9kdWxlRHVtcC5zdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXBhdGNoUGFuZWxEdW1wLmlzRW1wdHkoKSkgeworICAgICAgICB3cml0ZShmZCwgcGF0Y2hQYW5lbER1bXAuc3RyaW5nKCksIHBhdGNoUGFuZWxEdW1wLnNpemUoKSk7CisgICAgfQogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuaAppbmRleCBkMzdjMGQzLi4yZDliZDhlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmgKQEAgLTE5LDEzICsxOSwzMyBAQAogICAgICNlcnJvciBUaGlzIGhlYWRlciBmaWxlIHNob3VsZCBvbmx5IGJlIGluY2x1ZGVkIGZyb20gQXVkaW9GbGluZ2VyLmgKICNlbmRpZgogCi1jbGFzcyBQYXRjaFBhbmVsIDogcHVibGljIFJlZkJhc2UgeworCisvLyBQYXRjaFBhbmVsIGlzIGNvbmNlYWxlZCB3aXRoaW4gQXVkaW9GbGluZ2VyLCB0aGVpciBsaWZldGltZXMgYXJlIHRoZSBzYW1lLgorY2xhc3MgUGF0Y2hQYW5lbCB7CiBwdWJsaWM6CisgICAgY2xhc3MgU29mdHdhcmVQYXRjaCB7CisgICAgICBwdWJsaWM6CisgICAgICAgIFNvZnR3YXJlUGF0Y2goY29uc3QgUGF0Y2hQYW5lbCAmcGF0Y2hQYW5lbCwgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgcGxheWJhY2tUaHJlYWRIYW5kbGUsIGF1ZGlvX2lvX2hhbmRsZV90IHJlY29yZFRocmVhZEhhbmRsZSkKKyAgICAgICAgICAgICAgICA6IG1QYXRjaFBhbmVsKHBhdGNoUGFuZWwpLCBtUGF0Y2hIYW5kbGUocGF0Y2hIYW5kbGUpLAorICAgICAgICAgICAgICAgICAgbVBsYXliYWNrVGhyZWFkSGFuZGxlKHBsYXliYWNrVGhyZWFkSGFuZGxlKSwKKyAgICAgICAgICAgICAgICAgIG1SZWNvcmRUaHJlYWRIYW5kbGUocmVjb3JkVGhyZWFkSGFuZGxlKSB7fQorICAgICAgICBTb2Z0d2FyZVBhdGNoKGNvbnN0IFNvZnR3YXJlUGF0Y2gmKSA9IGRlZmF1bHQ7CisgICAgICAgIFNvZnR3YXJlUGF0Y2gmIG9wZXJhdG9yPShjb25zdCBTb2Z0d2FyZVBhdGNoJikgPSBkZWZhdWx0OwogCi0gICAgY2xhc3MgUGF0Y2g7CisgICAgICAgIC8vIE11c3QgYmUgY2FsbGVkIHVuZGVyIEF1ZGlvRmxpbmdlcjo6bUxvY2sKKyAgICAgICAgc3RhdHVzX3QgZ2V0TGF0ZW5jeU1zX2woZG91YmxlICpsYXRlbmN5TXMpIGNvbnN0OworICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBnZXRQYXRjaEhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1QYXRjaEhhbmRsZTsgfTsKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZ2V0UGxheWJhY2tUaHJlYWRIYW5kbGUoKSBjb25zdCB7IHJldHVybiBtUGxheWJhY2tUaHJlYWRIYW5kbGU7IH07CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldFJlY29yZFRocmVhZEhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1SZWNvcmRUaHJlYWRIYW5kbGU7IH07CisgICAgICBwcml2YXRlOgorICAgICAgICBjb25zdCBQYXRjaFBhbmVsICZtUGF0Y2hQYW5lbDsKKyAgICAgICAgY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbVBhdGNoSGFuZGxlOworICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBtUGxheWJhY2tUaHJlYWRIYW5kbGU7CisgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IG1SZWNvcmRUaHJlYWRIYW5kbGU7CisgICAgfTsKIAotICAgIGV4cGxpY2l0IFBhdGNoUGFuZWwoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyKTsKLSAgICB2aXJ0dWFsIH5QYXRjaFBhbmVsKCk7CisgICAgZXhwbGljaXQgUGF0Y2hQYW5lbChBdWRpb0ZsaW5nZXIqIGF1ZGlvRmxpbmdlcikgOiBtQXVkaW9GbGluZ2VyKCphdWRpb0ZsaW5nZXIpIHt9CiAKICAgICAvKiBMaXN0IGNvbm5lY3RlZCBhdWRpbyBwb3J0cyBhbmQgdGhlaXIgYXR0cmlidXRlcyAqLwogICAgIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLApAQCAtNDUsNDYgKzY1LDE0NCBAQAogICAgIHN0YXR1c190IGxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzKTsKIAotICAgIC8qIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KLSAgICBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworICAgIC8vIFJldHJpZXZlcyBhbGwgY3VycmVudGx5IGVzdHJhYmxpc2hlZCBzb2Z0d2FyZSBwYXRjaGVzIGZvciBhIHN0cmVhbQorICAgIC8vIG9wZW5lZCBvbiBhbiBpbnRlcm1lZGlhdGUgbW9kdWxlLgorICAgIHN0YXR1c190IGdldERvd25zdHJlYW1Tb2Z0d2FyZVBhdGNoZXMoYXVkaW9faW9faGFuZGxlX3Qgc3RyZWFtLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U29mdHdhcmVQYXRjaD4gKnBhdGNoZXMpIGNvbnN0OwogCi0gICAgc3RhdHVzX3QgY3JlYXRlUGF0Y2hDb25uZWN0aW9ucyhQYXRjaCAqcGF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKmF1ZGlvUGF0Y2gpOwotICAgIHZvaWQgY2xlYXJQYXRjaENvbm5lY3Rpb25zKFBhdGNoICpwYXRjaCk7CisgICAgLy8gTm90aWZpZXMgcGF0Y2ggcGFuZWwgYWJvdXQgYWxsIG9wZW5lZCBhbmQgY2xvc2VkIHN0cmVhbXMuCisgICAgdm9pZCBub3RpZnlTdHJlYW1PcGVuZWQoQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSwgYXVkaW9faW9faGFuZGxlX3Qgc3RyZWFtKTsKKyAgICB2b2lkIG5vdGlmeVN0cmVhbUNsb3NlZChhdWRpb19pb19oYW5kbGVfdCBzdHJlYW0pOworCisgICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVGhyZWFkVHlwZSwgdHlwZW5hbWUgVHJhY2tUeXBlPgorICAgIGNsYXNzIEVuZHBvaW50IHsKKyAgICBwdWJsaWM6CisgICAgICAgIEVuZHBvaW50KCkgPSBkZWZhdWx0OworICAgICAgICBFbmRwb2ludChFbmRwb2ludCYmIG90aGVyKSB7ICp0aGlzID0gc3RkOjptb3ZlKG90aGVyKTsgfQorICAgICAgICBFbmRwb2ludCYgb3BlcmF0b3I9KEVuZHBvaW50JiYgb3RoZXIpIHsKKyAgICAgICAgICAgIEFMT0dFX0lGKG1IYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICJBIG5vbiBlbXB0eSBQYXRjaCBFbmRwb2ludCBsZWFrZWQsIGhhbmRsZSAlZCIsIG1IYW5kbGUpOworICAgICAgICAgICAgKnRoaXMgPSBvdGhlcjsKKyAgICAgICAgICAgIG90aGVyLm1IYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1c190IGNoZWNrVHJhY2soVHJhY2tUeXBlICp0cmFja09yTnVsbCkgY29uc3QgeworICAgICAgICAgICAgaWYgKHRyYWNrT3JOdWxsID09IG51bGxwdHIpIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICByZXR1cm4gdHJhY2tPck51bGwtPmluaXRDaGVjaygpOworICAgICAgICB9CisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1IYW5kbGU7IH0KKyAgICAgICAgc3A8VGhyZWFkVHlwZT4gdGhyZWFkKCkgeyByZXR1cm4gbVRocmVhZDsgfQorICAgICAgICBzcDxUcmFja1R5cGU+IHRyYWNrKCkgeyByZXR1cm4gbVRyYWNrOyB9CisgICAgICAgIHNwPGNvbnN0IFRocmVhZFR5cGU+IGNvbnN0X3RocmVhZCgpIGNvbnN0IHsgcmV0dXJuIG1UaHJlYWQ7IH0KKyAgICAgICAgc3A8Y29uc3QgVHJhY2tUeXBlPiBjb25zdF90cmFjaygpIGNvbnN0IHsgcmV0dXJuIG1UcmFjazsgfQorCisgICAgICAgIHZvaWQgY2xvc2VDb25uZWN0aW9ucyhQYXRjaFBhbmVsICpwYW5lbCkgeworICAgICAgICAgICAgaWYgKG1IYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBwYW5lbC0+cmVsZWFzZUF1ZGlvUGF0Y2gobUhhbmRsZSk7CisgICAgICAgICAgICAgICAgbUhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1UaHJlYWQgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChtVHJhY2sgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtVGhyZWFkLT5kZWxldGVQYXRjaFRyYWNrKG1UcmFjayk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtQ2xvc2VUaHJlYWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFuZWwtPm1BdWRpb0ZsaW5nZXIuY2xvc2VUaHJlYWRJbnRlcm5hbF9sKG1UaHJlYWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCogaGFuZGxlUHRyKCkgeyByZXR1cm4gJm1IYW5kbGU7IH0KKyAgICAgICAgdm9pZCBzZXRUaHJlYWQoY29uc3Qgc3A8VGhyZWFkVHlwZT4mIHRocmVhZCwgYm9vbCBjbG9zZVRocmVhZCA9IHRydWUpIHsKKyAgICAgICAgICAgIG1UaHJlYWQgPSB0aHJlYWQ7CisgICAgICAgICAgICBtQ2xvc2VUaHJlYWQgPSBjbG9zZVRocmVhZDsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHNldFRyYWNrQW5kUGVlcihjb25zdCBzcDxUcmFja1R5cGU+JiB0cmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkQmFzZTo6UGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyICpwZWVyKSB7CisgICAgICAgICAgICBtVHJhY2sgPSB0cmFjazsKKyAgICAgICAgICAgIG1UaHJlYWQtPmFkZFBhdGNoVHJhY2sobVRyYWNrKTsKKyAgICAgICAgICAgIG1UcmFjay0+c2V0UGVlclByb3h5KHBlZXIpOworICAgICAgICB9CisgICAgICAgIHZvaWQgc3RvcFRyYWNrKCkgeyBpZiAobVRyYWNrKSBtVHJhY2stPnN0b3AoKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgRW5kcG9pbnQoY29uc3QgRW5kcG9pbnQmKSA9IGRlZmF1bHQ7CisgICAgICAgIEVuZHBvaW50JiBvcGVyYXRvcj0oY29uc3QgRW5kcG9pbnQmKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgc3A8VGhyZWFkVHlwZT4gbVRocmVhZDsKKyAgICAgICAgYm9vbCBtQ2xvc2VUaHJlYWQgPSB0cnVlOworICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgICAgIHNwPFRyYWNrVHlwZT4gbVRyYWNrOworICAgIH07CiAKICAgICBjbGFzcyBQYXRjaCB7CiAgICAgcHVibGljOgotICAgICAgICBleHBsaWNpdCBQYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoKSA6Ci0gICAgICAgICAgICBtQXVkaW9QYXRjaCgqcGF0Y2gpLCBtSGFuZGxlKEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSwKLSAgICAgICAgICAgIG1IYWxIYW5kbGUoQVVESU9fUEFUQ0hfSEFORExFX05PTkUpLCBtUmVjb3JkUGF0Y2hIYW5kbGUoQVVESU9fUEFUQ0hfSEFORExFX05PTkUpLAotICAgICAgICAgICAgbVBsYXliYWNrUGF0Y2hIYW5kbGUoQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHt9Ci0gICAgICAgIH5QYXRjaCgpIHt9CisgICAgICAgIGV4cGxpY2l0IFBhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAmcGF0Y2gpIDogbUF1ZGlvUGF0Y2gocGF0Y2gpIHt9CisgICAgICAgIH5QYXRjaCgpOworICAgICAgICBQYXRjaChjb25zdCBQYXRjaCYpID0gZGVsZXRlOworICAgICAgICBQYXRjaChQYXRjaCYmKSA9IGRlZmF1bHQ7CisgICAgICAgIFBhdGNoJiBvcGVyYXRvcj0oY29uc3QgUGF0Y2gmKSA9IGRlbGV0ZTsKKyAgICAgICAgUGF0Y2gmIG9wZXJhdG9yPShQYXRjaCYmKSA9IGRlZmF1bHQ7CiAKKyAgICAgICAgc3RhdHVzX3QgY3JlYXRlQ29ubmVjdGlvbnMoUGF0Y2hQYW5lbCAqcGFuZWwpOworICAgICAgICB2b2lkIGNsZWFyQ29ubmVjdGlvbnMoUGF0Y2hQYW5lbCAqcGFuZWwpOworICAgICAgICBib29sIGlzU29mdHdhcmUoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbVJlY29yZC5oYW5kbGUoKSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSB8fAorICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2suaGFuZGxlKCkgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7IH0KKworICAgICAgICAvLyByZXR1cm5zIHRoZSBsYXRlbmN5IG9mIHRoZSBwYXRjaCAoZnJvbSByZWNvcmQgdG8gcGxheWJhY2spLgorICAgICAgICBzdGF0dXNfdCBnZXRMYXRlbmN5TXMoZG91YmxlICpsYXRlbmN5TXMpIGNvbnN0OworCisgICAgICAgIFN0cmluZzggZHVtcChhdWRpb19wYXRjaF9oYW5kbGVfdCBteUhhbmRsZSkgY29uc3Q7CisKKyAgICAgICAgLy8gTm90ZSB0aGF0IGF1ZGlvX3BhdGNoOjppZCBpcyBvbmx5IHVuaXF1ZSB3aXRoaW4gYSBIQUwgbW9kdWxlCiAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAgICAgICAgICAgICAgbUF1ZGlvUGF0Y2g7Ci0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICAgICAgICAgICAgbUhhbmRsZTsKICAgICAgICAgLy8gaGFuZGxlIGZvciBhdWRpbyBIQUwgcGF0Y2ggaGFuZGxlIHByZXNlbnQgb25seSB3aGVuIHRoZSBhdWRpbyBIQUwgdmVyc2lvbiBpcyA+PSAzLjAKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgICAgICAgICAgICBtSGFsSGFuZGxlOworICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAgICAgICAgICAgIG1IYWxIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICAgICAgLy8gYmVsb3cgbWVtYmVycyBhcmUgdXNlZCBieSBhIHNvZnR3YXJlIGF1ZGlvIHBhdGNoIGNvbm5lY3RpbmcgYSBzb3VyY2UgZGV2aWNlIGZyb20gYQogICAgICAgICAvLyBnaXZlbiBhdWRpbyBIVyBtb2R1bGUgdG8gYSBzaW5rIGRldmljZSBvbiBhbiBvdGhlciBhdWRpbyBIVyBtb2R1bGUuCi0gICAgICAgIC8vIHBsYXliYWNrIHRocmVhZCBjcmVhdGVkIGJ5IGNyZWF0ZUF1ZGlvUGF0Y2goKSBhbmQgcmVsZWFzZWQgYnkgY2xlYXJQYXRjaENvbm5lY3Rpb25zKCkgaWYKLSAgICAgICAgLy8gbm8gZXhpc3RpbmcgcGxheWJhY2sgdGhyZWFkIGNhbiBiZSB1c2VkIGJ5IHRoZSBzb2Z0d2FyZSBwYXRjaAotICAgICAgICBzcDxQbGF5YmFja1RocmVhZD4gICAgICAgICAgICAgIG1QbGF5YmFja1RocmVhZDsKLSAgICAgICAgLy8gYXVkaW8gdHJhY2sgY3JlYXRlZCBieSBjcmVhdGVQYXRjaENvbm5lY3Rpb25zKCkgYW5kIHJlbGVhc2VkIGJ5IGNsZWFyUGF0Y2hDb25uZWN0aW9ucygpCi0gICAgICAgIHNwPFBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrPiAgbVBhdGNoVHJhY2s7Ci0gICAgICAgIC8vIHJlY29yZCB0aHJlYWQgY3JlYXRlZCBieSBjcmVhdGVBdWRpb1BhdGNoKCkgYW5kIHJlbGVhc2VkIGJ5IGNsZWFyUGF0Y2hDb25uZWN0aW9ucygpCi0gICAgICAgIHNwPFJlY29yZFRocmVhZD4gICAgICAgICAgICAgICAgbVJlY29yZFRocmVhZDsKLSAgICAgICAgLy8gYXVkaW8gcmVjb3JkIGNyZWF0ZWQgYnkgY3JlYXRlUGF0Y2hDb25uZWN0aW9ucygpIGFuZCByZWxlYXNlZCBieSBjbGVhclBhdGNoQ29ubmVjdGlvbnMoKQotICAgICAgICBzcDxSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkPiAgIG1QYXRjaFJlY29yZDsKLSAgICAgICAgLy8gaGFuZGxlIGZvciBhdWRpbyBwYXRjaCBjb25uZWN0aW5nIHNvdXJjZSBkZXZpY2UgdG8gcmVjb3JkIHRocmVhZCBpbnB1dC4KLSAgICAgICAgLy8gY3JlYXRlZCBieSBjcmVhdGVQYXRjaENvbm5lY3Rpb25zKCkgYW5kIHJlbGVhc2VkIGJ5IGNsZWFyUGF0Y2hDb25uZWN0aW9ucygpCi0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICAgICAgICAgICAgbVJlY29yZFBhdGNoSGFuZGxlOwotICAgICAgICAvLyBoYW5kbGUgZm9yIGF1ZGlvIHBhdGNoIGNvbm5lY3RpbmcgcGxheWJhY2sgdGhyZWFkIG91dHB1dCB0byBzaW5rIGRldmljZQotICAgICAgICAvLyBjcmVhdGVkIGJ5IGNyZWF0ZVBhdGNoQ29ubmVjdGlvbnMoKSBhbmQgcmVsZWFzZWQgYnkgY2xlYXJQYXRjaENvbm5lY3Rpb25zKCkKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgICAgICAgICAgICBtUGxheWJhY2tQYXRjaEhhbmRsZTsKLQorICAgICAgICAvLyB0aGUgb2JqZWN0cyBhcmUgY3JlYXRlZCBieSBjcmVhdGVDb25uZWN0aW9ucygpIGFuZCByZWxlYXNlZCBieSBjbGVhckNvbm5lY3Rpb25zKCkKKyAgICAgICAgLy8gcGxheWJhY2sgdGhyZWFkIGlzIGNyZWF0ZWQgaWYgbm8gZXhpc3RpbmcgcGxheWJhY2sgdGhyZWFkIGNhbiBiZSB1c2VkCisgICAgICAgIC8vIGNvbm5lY3RzIHBsYXliYWNrIHRocmVhZCBvdXRwdXQgdG8gc2luayBkZXZpY2UKKyAgICAgICAgRW5kcG9pbnQ8UGxheWJhY2tUaHJlYWQsIFBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrPiBtUGxheWJhY2s7CisgICAgICAgIC8vIGNvbm5lY3RzIHNvdXJjZSBkZXZpY2UgdG8gcmVjb3JkIHRocmVhZCBpbnB1dAorICAgICAgICBFbmRwb2ludDxSZWNvcmRUaHJlYWQsIFJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ+IG1SZWNvcmQ7CiAgICAgfTsKIAotcHJpdmF0ZToKLSAgICBjb25zdCB3cDxBdWRpb0ZsaW5nZXI+ICAgICAgbUF1ZGlvRmxpbmdlcjsKLSAgICBTb3J0ZWRWZWN0b3IgPFBhdGNoICo+ICAgICAgbVBhdGNoZXM7CisgICAgQXVkaW9Id0RldmljZSogZmluZEF1ZGlvSHdEZXZpY2VCeU1vZHVsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlKTsKKyAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGZpbmRId0RldmljZUJ5TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUpOworICAgIHZvaWQgYWRkU29mdHdhcmVQYXRjaFRvSW5zZXJ0ZWRNb2R1bGVzKAorICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICB2b2lkIHJlbW92ZVNvZnR3YXJlUGF0Y2hGcm9tSW5zZXJ0ZWRNb2R1bGVzKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CisKKyAgICBBdWRpb0ZsaW5nZXIgJm1BdWRpb0ZsaW5nZXI7CisgICAgc3RkOjptYXA8YXVkaW9fcGF0Y2hfaGFuZGxlX3QsIFBhdGNoPiBtUGF0Y2hlczsKKworICAgIC8vIFRoaXMgbWFwIGFsbG93cyBnb2luZyBmcm9tIGEgdGhyZWFkIHRvICJkb3duc3RyZWFtIiBzb2Z0d2FyZSBwYXRjaGVzCisgICAgLy8gd2hlbiBhIHByb2Nlc3NpbmcgbW9kdWxlIGluc2VydGVkIGluIGJldHdlZW4uIEV4YW1wbGU6CisgICAgLy8KKyAgICAvLyAgZnJvbSBtYXAgdmFsdWUuc3RyZWFtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAga2V5CisgICAgLy8gIFtNaXhlciB0aHJlYWRdIC0tPiBbVmlydHVhbCBvdXRwdXQgZGV2aWNlXSAtLT4gW1Byb2Nlc3NpbmcgbW9kdWxlXSAtLS1cCisgICAgLy8gICAgICAgW0hhcndhcmUgbW9kdWxlXSA8LS0gW1BoeXNpY2FsIG91dHB1dCBkZXZpY2VdIDwtLSBbUy9XIFBhdGNoXSA8LS0vCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBtYXAgdmFsdWUuc3dfcGF0Y2hlcworICAgIC8vCisgICAgLy8gVGhpcyBhbGxvd3MgdGhlIG1peGVyIHRocmVhZCB0byBsb29rIHVwIHRoZSB0aHJlYWRzIG9mIHRoZSBzb2Z0d2FyZSBwYXRjaAorICAgIC8vIGZvciBwcm9wYWdhdGluZyB0aW1pbmcgaW5mbywgcGFyYW1ldGVycywgZXRjLgorICAgIC8vCisgICAgLy8gVGhlIGN1cnJlbnQgYXNzdW1wdGlvbnMgYXJlOgorICAgIC8vICAgMSkgVGhlIHByb2Nlc3NpbmcgbW9kdWxlIGFjdHMgYXMgYSBtaXhlciB3aXRoIHNldmVyYWwgb3V0cHV0cyB3aGljaAorICAgIC8vICAgICAgcmVwcmVzZW50IGRpZmZlcmVudGx5IGRvd25taXhlZCBhbmQgLyBvciBlbmNvZGVkIHZlcnNpb25zIG9mIHRoZSBzYW1lCisgICAgLy8gICAgICBtaXhlZCBzdHJlYW0uIFRoZXJlIGlzIG5vIDE6MSBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIHRoZSBpbnB1dCBzdHJlYW1zCisgICAgLy8gICAgICBhbmQgdGhlIHNvZnR3YXJlIHBhdGNoZXMsIGJ1dCByYXRoZXIgYSBOOk4gY29ycmVzcG9uZGVuY2UgYmV0d2VlbgorICAgIC8vICAgICAgYSBncm91cCBvZiBzdHJlYW1zIGFuZCBhIGdyb3VwIG9mIHBhdGNoZXMuCisgICAgLy8gICAyKSBUaGVyZSBhcmUgb25seSBhIGNvdXBsZSBvZiBpbnNlcnRlZCBwcm9jZXNzaW5nIG1vZHVsZXMgaW4gdGhlIHN5c3RlbSwKKyAgICAvLyAgICAgIHNvIHdoZW4gbG9va2luZyBmb3IgYSBzdHJlYW0gb3IgcGF0Y2ggaGFuZGxlIHdlIGNhbiBpdGVyYXRlIG92ZXIKKyAgICAvLyAgICAgIGFsbCBtb2R1bGVzLgorICAgIHN0cnVjdCBNb2R1bGVDb25uZWN0aW9ucyB7CisgICAgICAgIHN0ZDo6c2V0PGF1ZGlvX2lvX2hhbmRsZV90PiBzdHJlYW1zOworICAgICAgICBzdGQ6OnNldDxhdWRpb19wYXRjaF9oYW5kbGVfdD4gc3dfcGF0Y2hlczsKKyAgICB9OworICAgIHN0ZDo6bWFwPGF1ZGlvX21vZHVsZV9oYW5kbGVfdCwgTW9kdWxlQ29ubmVjdGlvbnM+IG1JbnNlcnRlZE1vZHVsZXM7CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaAppbmRleCBhNzhiZTk5Li5kOWY1NzBkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaApAQCAtNDEsNyArNDEsNyBAQAogICAgIHZpcnR1YWwgICAgICAgICAgICAgflRyYWNrKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBpbml0Q2hlY2soKSBjb25zdDsKIAotICAgIHN0YXRpYyAgdm9pZCAgICAgICAgYXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpOworICAgICAgICAgICAgdm9pZCAgICAgICAgYXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgYXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHN0YXJ0KEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgZXZlbnQgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OlNZTkNfRVZFTlRfTk9ORSwKQEAgLTUxLDEyICs1MSw2IEBACiAKICAgICAgICAgICAgIHZvaWQgICAgICAgIGZsdXNoKCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICBkZXN0cm95KCk7Ci0gICAgICAgICAgICBpbnQgICAgICAgICBuYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KLSAgICAgICAgICAgIHZvaWQgICAgICAgIHNldE5hbWUoaW50IG5hbWUpIHsKLSAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1OYW1lID49IDAgJiYgbmFtZSA+PSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGJvdGggb2xkIG5hbWUgJWQgYW5kIG5ldyBuYW1lICVkIGFyZSB2YWxpZCIsIF9fZnVuY19fLCBtTmFtZSwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgbU5hbWUgPSBuYW1lOwotICAgICAgICAgICAgfQogCiAgICAgdmlydHVhbCB1aW50MzJfdCAgICBzYW1wbGVSYXRlKCkgY29uc3Q7CiAKQEAgLTY1LDEyICs1OSwxNSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgYm9vbCAgICAgICAgaXNPZmZsb2FkZWQoKSBjb25zdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgIT0gMDsgfQotICAgICAgICAgICAgYm9vbCAgICAgICAgaXNEaXJlY3QoKSBjb25zdCB7IHJldHVybiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAhPSAwOyB9CisgICAgICAgICAgICBib29sICAgICAgICBpc0RpcmVjdCgpIGNvbnN0IG92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICE9IDA7IH0KICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSBjb25zdCB7IHJldHVybiAobUZsYWdzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiAoQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpKSAhPSAwOyB9CisgICAgICAgICAgICBib29sICAgICAgICBpc1N0YXRpYygpIGNvbnN0IHsgcmV0dXJuICBtU2hhcmVkQnVmZmVyLmdldCgpICE9IG51bGxwdHI7IH0KIAogICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgIHNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgYXR0YWNoQXV4RWZmZWN0KGludCBFZmZlY3RJZCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICBzZXRBdXhCdWZmZXIoaW50IEVmZmVjdElkLCBpbnQzMl90ICpidWZmZXIpOwogICAgICAgICAgICAgaW50MzJfdCAgICAgKmF1eEJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1BdXhCdWZmZXI7IH0KQEAgLTg3LDYgKzg0LDEwIEBACiAKICAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGlzRmFzdFRyYWNrKCkgY29uc3QgeyByZXR1cm4gKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpICE9IDA7IH0KIAorICAgICAgICAgICAgZG91YmxlICAgICAgYnVmZmVyTGF0ZW5jeU1zKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc1N0YXRpYygpID8gMC4gOiBUcmFja0Jhc2U6OmJ1ZmZlckxhdGVuY3lNcygpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCiAvLyBpbXBsZW1lbnQgdm9sdW1lIGhhbmRsaW5nLgogICAgIG1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXR1cyBhcHBseVZvbHVtZVNoYXBlcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCkBAIC0xMTEsNiArMTEyLDE0IEBACiAgICAgLyoqIENvcHkgdGhlIHRyYWNrIG1ldGFkYXRhIGluIHRoZSBwcm92aWRlZCBpdGVyYXRvci4gVGhyZWFkIHNhZmUuICovCiAgICAgdmlydHVhbCB2b2lkICAgIGNvcHlNZXRhZGF0YVRvKE1ldGFkYXRhSW5zZXJ0ZXImIGJhY2tJbnNlcnRlcikgY29uc3Q7CiAKKyAgICAgICAgICAgIC8qKiBSZXR1cm4gaGFwdGljIHBsYXliYWNrIG9mIHRoZSB0cmFjayBpcyBlbmFibGVkIG9yIG5vdCwgdXNlZCBpbiBtaXhlci4gKi8KKyAgICAgICAgICAgIGJvb2wgICAgZ2V0SGFwdGljUGxheWJhY2tFbmFibGVkKCkgY29uc3QgeyByZXR1cm4gbUhhcHRpY1BsYXliYWNrRW5hYmxlZDsgfQorICAgICAgICAgICAgLyoqIFNldCBoYXB0aWMgcGxheWJhY2sgb2YgdGhlIHRyYWNrIGlzIGVuYWJsZWQgb3Igbm90LCBzaG91bGQgYmUKKyAgICAgICAgICAgICAqICBzZXQgYWZ0ZXIgcXVlcnkgb3IgZ2V0IGNhbGxiYWNrIGZyb20gdmlicmF0b3Igc2VydmljZSAqLworICAgICAgICAgICAgdm9pZCAgICBzZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQoYm9vbCBoYXB0aWNQbGF5YmFja0VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBtSGFwdGljUGxheWJhY2tFbmFibGVkID0gaGFwdGljUGxheWJhY2tFbmFibGVkOworICAgICAgICAgICAgfQorCiBwcm90ZWN0ZWQ6CiAgICAgLy8gZm9yIG51bWVyb3VzCiAgICAgZnJpZW5kIGNsYXNzIFBsYXliYWNrVGhyZWFkOwpAQCAtMTQwLDcgKzE0OSw3IEBACiAgICAgYm9vbCBpc1Jlc3VtZVBlbmRpbmcoKTsKICAgICB2b2lkIHJlc3VtZUFjaygpOwogICAgIHZvaWQgdXBkYXRlVHJhY2tGcmFtZUluZm8oaW50NjRfdCB0cmFja0ZyYW1lc1JlbGVhc2VkLCBpbnQ2NF90IHNpbmtGcmFtZXNXcml0dGVuLAotICAgICAgICAgICAgY29uc3QgRXh0ZW5kZWRUaW1lc3RhbXAgJnRpbWVTdGFtcCk7CisgICAgICAgICAgICB1aW50MzJfdCBoYWxTYW1wbGVSYXRlLCBjb25zdCBFeHRlbmRlZFRpbWVzdGFtcCAmdGltZVN0YW1wKTsKIAogICAgIHNwPElNZW1vcnk+IHNoYXJlZEJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1TaGFyZWRCdWZmZXI7IH0KIApAQCAtMTcxLDcgKzE4MCw2IEBACiAKICAgICBib29sICAgICAgICAgICAgICAgIG1SZXNldERvbmU7CiAgICAgY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtVHlwZTsKLSAgICBpbnQgICAgICAgICAgICAgICAgIG1OYW1lOwogICAgIGVmZmVjdF9idWZmZXJfdCAgICAgKm1NYWluQnVmZmVyOwogCiAgICAgaW50MzJfdCAgICAgICAgICAgICAqbUF1eEJ1ZmZlcjsKQEAgLTE4OCw2ICsxOTYsOCBAQAogCiAgICAgc3A8bWVkaWE6OlZvbHVtZUhhbmRsZXI+ICBtVm9sdW1lSGFuZGxlcjsgLy8gaGFuZGxlcyBtdWx0aXBsZSBWb2x1bWVTaGFwZXIgY29uZmlncyBhbmQgb3BlcmF0aW9ucwogCisgICAgYm9vbCAgICAgICAgICAgICAgICBtSGFwdGljUGxheWJhY2tFbmFibGVkID0gZmFsc2U7IC8vIGluZGljYXRlcyBoYXB0aWMgcGxheWJhY2sgZW5hYmxlZCBvciBub3QKKwogcHJpdmF0ZToKICAgICAvLyBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgb25seSBmb3IgZmFzdCB0cmFja3MsIGFuZCBzaG91bGQgYmUgaW4gYSBzdWJjbGFzcwogICAgIGludCAgICAgICAgICAgICAgICAgbUZhc3RJbmRleDsgLy8gaW5kZXggd2l0aGluIEZhc3RNaXhlclN0YXRlOjptRmFzdFRyYWNrc1tdOwpAQCAtMjMzLDcgKzI0Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6U1lOQ19FVkVOVF9OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24gPSBBVURJT19TRVNTSU9OX05PTkUpOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgc3RvcCgpOwotICAgICAgICAgICAgYm9vbCAgICAgICAgd3JpdGUodm9pZCogZGF0YSwgdWludDMyX3QgZnJhbWVzKTsKKyAgICAgICAgICAgIHNzaXplX3QgICAgIHdyaXRlKHZvaWQqIGRhdGEsIHVpbnQzMl90IGZyYW1lcyk7CiAgICAgICAgICAgICBib29sICAgICAgICBidWZmZXJRdWV1ZUVtcHR5KCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlclF1ZXVlLnNpemUoKSA9PSAwOyB9CiAgICAgICAgICAgICBib29sICAgICAgICBpc0FjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIG1BY3RpdmU7IH0KICAgICBjb25zdCB3cDxUaHJlYWRCYXNlPiYgdGhyZWFkKCkgY29uc3QgeyByZXR1cm4gbVRocmVhZDsgfQpAQCAtMjQxLDYgKzI1MSwxOCBAQAogICAgICAgICAgICAgdm9pZCAgICAgICAgY29weU1ldGFkYXRhVG8oTWV0YWRhdGFJbnNlcnRlciYgYmFja0luc2VydGVyKSBjb25zdCBvdmVycmlkZTsKICAgICAvKiogU2V0IHRoZSBtZXRhZGF0YXMgb2YgdGhlIHVwc3RyZWFtIHRyYWNrcy4gVGhyZWFkIHNhZmUuICovCiAgICAgICAgICAgICB2b2lkICAgICAgICBzZXRNZXRhZGF0YXMoY29uc3QgU291cmNlTWV0YWRhdGFzJiBtZXRhZGF0YXMpOworICAgIC8qKiByZXR1cm5zIGNsaWVudCB0aW1lc3RhbXAgdG8gdGhlIHVwc3RyZWFtIGR1cGxpY2F0aW5nIHRocmVhZC4gKi8KKyAgICBFeHRlbmRlZFRpbWVzdGFtcCAgIGdldENsaWVudFByb3h5VGltZXN0YW1wKCkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlcnZlciAtIGtlcm5lbCBkaWZmZXJlbmNlIGlzIG5vdCB0cnVlIGxhdGVuY3kgd2hlbiBkcmFpbmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaS5lLiBtU2VydmVyUHJveHktPmlzRHJhaW5lZCgpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuZGVkVGltZXN0YW1wIHRpbWVzdGFtcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgbUNsaWVudFByb3h5LT5nZXRUaW1lc3RhbXAoJnRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT24gc3VjY2VzcywgdGhlIHRpbWVzdGFtcCBMT0NBVElPTl9TRVJWRVIgYW5kIExPQ0FUSU9OX0tFUk5FTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVudHJpZXMgd2lsbCBiZSBwcm9wZXJseSBmaWxsZWQuIElmIGdldFRpbWVzdGFtcCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdW5zdWNjZXNzZnVsLCB0aGVuIGEgZGVmYXVsdCBpbml0aWFsaXplZCB0aW1lc3RhbXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAod2l0aCBtVGltZU5zW10gZmlsbGVkIHdpdGggLTEncykgaXMgcmV0dXJuZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRpbWVzdGFtcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogcHJpdmF0ZToKICAgICBzdGF0dXNfdCAgICAgICAgICAgIG9idGFpbkJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlciwKQEAgLTI1Nyw2ICsyNzksNyBAQAogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlOwogICAgIER1cGxpY2F0aW5nVGhyZWFkKiBjb25zdCAgICBtU291cmNlVGhyZWFkOyAvLyBmb3Igd2FpdFRpbWVNcygpIGluIHdyaXRlKCkKICAgICBzcDxBdWRpb1RyYWNrQ2xpZW50UHJveHk+ICAgbUNsaWVudFByb3h5OworCiAgICAgLyoqIEF0dHJpYnV0ZXMgb2YgdGhlIHNvdXJjZSB0cmFja3MuCiAgICAgICoKICAgICAgKiBUaGlzIG1lbWJlciBtdXN0IGJlIGFjY2Vzc2VkIHdpdGggbVRyYWNrTWV0YWRhdGFzTXV0ZXggdGFrZW4uCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmgKaW5kZXggZmMyZGJiYi4uODVmNTQ1NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaApAQCAtNTEsNyArNTEsNyBAQAogICAgICAgICAgICAgYm9vbCAgICAgICAgc2V0T3ZlcmZsb3coKSB7IGJvb2wgdG1wID0gbU92ZXJmbG93OyBtT3ZlcmZsb3cgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRtcDsgfQogCi0gICAgc3RhdGljICB2b2lkICAgICAgICBhcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCk7CisgICAgICAgICAgICB2b2lkICAgICAgICBhcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICBhcHBlbmREdW1wKFN0cmluZzgmIHJlc3VsdCwgYm9vbCBhY3RpdmUpOwogCiAgICAgICAgICAgICB2b2lkICAgICAgICBoYW5kbGVTeW5jU3RhcnRFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCk7CkBAIC02MywxMiArNjMsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4dGVuZGVkVGltZXN0YW1wICZ0aW1lc3RhbXApOwogCiAgICAgdmlydHVhbCBib29sICAgICAgICBpc0Zhc3RUcmFjaygpIGNvbnN0IHsgcmV0dXJuIChtRmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0ZBU1QpICE9IDA7IH0KKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzRGlyZWN0KCkgY29uc3Qgb3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gKG1GbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRElSRUNUKSAhPSAwOyB9CiAKICAgICAgICAgICAgIHZvaWQgICAgICAgIHNldFNpbGVuY2VkKGJvb2wgc2lsZW5jZWQpIHsgaWYgKCFpc1BhdGNoVHJhY2soKSkgbVNpbGVuY2VkID0gc2lsZW5jZWQ7IH0KICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzU2lsZW5jZWQoKSBjb25zdCB7IHJldHVybiBtU2lsZW5jZWQ7IH0KIAogICAgICAgICAgICAgc3RhdHVzX3QgICAgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpOwogCisgICAgc3RhdGljICBib29sICAgICAgICBjaGVja1NlcnZlckxhdGVuY3lTdXBwb3J0ZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChmbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfSFdfQVZfU1lOQykgPT0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgQXVkaW9GbGluZ2VyOyAgLy8gZm9yIG1TdGF0ZQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMjY3ZWEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8YmluZGVyL0FwcE9wc01hbmFnZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1Blcm1pc3Npb25DYWNoZS5oPgotI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKLQotLyogV2hlbiBwZXJmb3JtaW5nIHBlcm1pc3Npb24gY2hlY2tzIHdlIGRvIG5vdCB1c2UgcGVybWlzc2lvbiBjYWNoZSBmb3IKLSAqIHJ1bnRpbWUgcGVybWlzc2lvbnMgKHByb3RlY3Rpb24gbGV2ZWwgZGFuZ2Vyb3VzKSBhcyB0aGV5IG1heSBjaGFuZ2UgYXQKLSAqIHJ1bnRpbWUuIEFsbCBvdGhlciBwZXJtaXNzaW9ucyAocHJvdGVjdGlvbiBsZXZlbCBub3JtYWwgYW5kIGRhbmdlcm91cykKLSAqIGNhbiBiZSBjYWNoZWQgYXMgdGhleSBuZXZlciBjaGFuZ2UuIE9mIGNvdXJzZSBhbGwgcGVybWlzc2lvbiBjaGVja2VkCi0gKiBoZXJlIGFyZSBwbGF0Zm9ybSBkZWZpbmVkLgotICovCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIGNvbnN0IFN0cmluZzE2IHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKCJhbmRyb2lkLnBlcm1pc3Npb24uUkVDT1JEX0FVRElPIik7Ci0KLS8vIE5vdCB2YWxpZCB1bnRpbCBpbml0aWFsaXplZCBieSBBdWRpb0ZsaW5nZXIgY29uc3RydWN0b3IuICBJdCB3b3VsZCBoYXZlIHRvIGJlCi0vLyByZS1pbml0aWFsaXplZCBpZiB0aGUgcHJvY2VzcyBjb250YWluaW5nIEF1ZGlvRmxpbmdlciBzZXJ2aWNlIGZvcmtzICh3aGljaCBpdCBkb2Vzbid0KS4KLS8vIFRoaXMgaXMgb2Z0ZW4gdXNlZCB0byB2YWxpZGF0ZSBiaW5kZXIgaW50ZXJmYWNlIGNhbGxzIHdpdGhpbiBhdWRpb3NlcnZlcgotLy8gKGUuZy4gQXVkaW9Qb2xpY3lNYW5hZ2VyIHRvIEF1ZGlvRmxpbmdlcikuCi1waWRfdCBnZXRwaWRfY2FjaGVkOwotCi0vLyBBIHRydXN0ZWQgY2FsbGluZyBVSUQgbWF5IHNwZWNpZnkgdGhlIGNsaWVudCBVSUQgYXMgcGFydCBvZiBhIGJpbmRlciBpbnRlcmZhY2UgY2FsbC4KLS8vIG90aGVyd2lzZSB0aGUgY2FsbGluZyBVSUQgbXVzdCBiZSBlcXVhbCB0byB0aGUgY2xpZW50IFVJRC4KLWJvb2wgaXNUcnVzdGVkQ2FsbGluZ1VpZCh1aWRfdCB1aWQpIHsKLSAgICBzd2l0Y2ggKHVpZCkgewotICAgIGNhc2UgQUlEX01FRElBOgotICAgIGNhc2UgQUlEX0FVRElPU0VSVkVSOgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi1zdGF0aWMgU3RyaW5nMTYgcmVzb2x2ZUNhbGxpbmdQYWNrYWdlKFBlcm1pc3Npb25Db250cm9sbGVyJiBwZXJtaXNzaW9uQ29udHJvbGxlciwKLSAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHVpZF90IHVpZCkgewotICAgIGlmIChvcFBhY2thZ2VOYW1lLnNpemUoKSA+IDApIHsKLSAgICAgICAgcmV0dXJuIG9wUGFja2FnZU5hbWU7Ci0gICAgfQotICAgIC8vIEluIHNvbWUgY2FzZXMgdGhlIGNhbGxpbmcgY29kZSBoYXMgbm8gYWNjZXNzIHRvIHRoZSBwYWNrYWdlIGl0IHJ1bnMgdW5kZXIuCi0gICAgLy8gRm9yIGV4YW1wbGUsIGNvZGUgdXNpbmcgdGhlIHdpbGhlbG0gZnJhbWV3b3JrJ3MgT3BlblNMLUVTIEFQSXMuIEluIHRoaXMKLSAgICAvLyBjYXNlIHdlIHdpbGwgZ2V0IHRoZSBwYWNrYWdlcyBmb3IgdGhlIGNhbGxpbmcgVUlEIGFuZCBwaWNrIHRoZSBmaXJzdCBvbmUKLSAgICAvLyBmb3IgYXR0cmlidXRpbmcgdGhlIGFwcCBvcC4gVGhpcyB3aWxsIHdvcmsgY29ycmVjdGx5IGZvciBydW50aW1lIHBlcm1pc3Npb25zCi0gICAgLy8gYXMgZm9yIGxlZ2FjeSBhcHBzIHdlIHdpbGwgdG9nZ2xlIHRoZSBhcHAgb3AgZm9yIGFsbCBwYWNrYWdlcyBpbiB0aGUgVUlELgotICAgIC8vIFRoZSBjYXZlYXQgaXMgdGhhdCB0aGUgb3BlcmF0aW9uIG1heSBiZSBhdHRyaWJ1dGVkIHRvIHRoZSB3cm9uZyBwYWNrYWdlIGFuZAotICAgIC8vIHN0YXRzIGJhc2VkIG9uIGFwcCBvcHMgbWF5IGJlIHNsaWdodGx5IG9mZi4KLSAgICBWZWN0b3I8U3RyaW5nMTY+IHBhY2thZ2VzOwotICAgIHBlcm1pc3Npb25Db250cm9sbGVyLmdldFBhY2thZ2VzRm9yVWlkKHVpZCwgcGFja2FnZXMpOwotICAgIGlmIChwYWNrYWdlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIk5vIHBhY2thZ2VzIGZvciB1aWQgJWQiLCB1aWQpOwotICAgICAgICByZXR1cm4gb3BQYWNrYWdlTmFtZTsgLy8gZW1wdHkgc3RyaW5nCi0gICAgfQotICAgIHJldHVybiBwYWNrYWdlc1swXTsKLX0KLQotc3RhdGljIGlubGluZSBib29sIGlzQXVkaW9TZXJ2ZXJPclJvb3QodWlkX3QgdWlkKSB7Ci0gICAgLy8gQUlEX1JPT1QgaXMgT0sgZm9yIGNvbW1hbmQtbGluZSB0ZXN0cy4gIE5hdGl2ZSB1bmZvcmtlZCBhdWRpb3NlcnZlciBhbHdheXMgT0suCi0gICAgcmV0dXJuIHVpZCA9PSBBSURfUk9PVCB8fCB1aWQgPT0gQUlEX0FVRElPU0VSVkVSIDsKLX0KLQotc3RhdGljIGJvb2wgY2hlY2tSZWNvcmRpbmdJbnRlcm5hbChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLAotICAgICAgICB1aWRfdCB1aWQsIGJvb2wgc3RhcnQpIHsKLSAgICAvLyBPa2F5IHRvIG5vdCB0cmFjayBpbiBhcHAgb3BzIGFzIGF1ZGlvIHNlcnZlciBpcyB1cyBhbmQgaWYKLSAgICAvLyBkZXZpY2UgaXMgcm9vdGVkIHNlY3VyaXR5IG1vZGVsIGlzIGNvbnNpZGVyZWQgY29tcHJvbWlzZWQuCi0gICAgaWYgKGlzQXVkaW9TZXJ2ZXJPclJvb3QodWlkKSkgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBXZSBzcGVjaWZ5IGEgcGlkIGFuZCB1aWQgaGVyZSBhcyBtZWRpYXNlcnZlciAoYWthIE1lZGlhUmVjb3JkZXIgb3IgU3RhZ2VGcmlnaHRSZWNvcmRlcikKLSAgICAvLyBtYXkgb3BlbiBhIHJlY29yZCB0cmFjayBvbiBiZWhhbGYgb2YgYSBjbGllbnQuICBOb3RlIHRoYXQgcGlkIG1heSBiZSBhIHRpZC4KLSAgICAvLyBJTVBPUlRBTlQ6IERPTidUIFVTRSBQZXJtaXNzaW9uQ2FjaGUgLSBSVU5USU1FIFBFUk1JU1NJT05TIENIQU5HRS4KLSAgICBQZXJtaXNzaW9uQ29udHJvbGxlciBwZXJtaXNzaW9uQ29udHJvbGxlcjsKLSAgICBjb25zdCBib29sIG9rID0gcGVybWlzc2lvbkNvbnRyb2xsZXIuY2hlY2tQZXJtaXNzaW9uKHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvLCBwaWQsIHVpZCk7Ci0gICAgaWYgKCFvaykgewotICAgICAgICBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyAlcyIsIFN0cmluZzgoc0FuZHJvaWRQZXJtaXNzaW9uUmVjb3JkQXVkaW8pLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgU3RyaW5nMTYgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lID0gcmVzb2x2ZUNhbGxpbmdQYWNrYWdlKAotICAgICAgICAgICAgcGVybWlzc2lvbkNvbnRyb2xsZXIsIG9wUGFja2FnZU5hbWUsIHVpZCk7Ci0gICAgaWYgKHJlc29sdmVkT3BQYWNrYWdlTmFtZS5zaXplKCkgPT0gMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQXBwT3BzTWFuYWdlciBhcHBPcHM7Ci0gICAgY29uc3QgaW50MzJfdCBvcCA9IGFwcE9wcy5wZXJtaXNzaW9uVG9PcENvZGUoc0FuZHJvaWRQZXJtaXNzaW9uUmVjb3JkQXVkaW8pOwotICAgIGlmIChzdGFydCkgewotICAgICAgICBpZiAoYXBwT3BzLnN0YXJ0T3BOb1Rocm93KG9wLCB1aWQsIHJlc29sdmVkT3BQYWNrYWdlTmFtZSwgLypzdGFydElmTW9kZURlZmF1bHQqLyBmYWxzZSkKLSAgICAgICAgICAgICAgICAhPSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0FMTE9XRUQpIHsKLSAgICAgICAgICAgIEFMT0dFKCJSZXF1ZXN0IGRlbmllZCBieSBhcHAgb3A6ICVkIiwgb3ApOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGFwcE9wcy5ub3RlT3Aob3AsIHVpZCwgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lKSAhPSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0FMTE9XRUQpIHsKLSAgICAgICAgICAgIEFMT0dFKCJSZXF1ZXN0IGRlbmllZCBieSBhcHAgb3A6ICVkIiwgb3ApOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgcmVjb3JkaW5nQWxsb3dlZChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKLSAgICByZXR1cm4gY2hlY2tSZWNvcmRpbmdJbnRlcm5hbChvcFBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgLypzdGFydCovIGZhbHNlKTsKLX0KLQotYm9vbCBzdGFydFJlY29yZGluZyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKLSAgICAgcmV0dXJuIGNoZWNrUmVjb3JkaW5nSW50ZXJuYWwob3BQYWNrYWdlTmFtZSwgcGlkLCB1aWQsIC8qc3RhcnQqLyB0cnVlKTsKLX0KLQotdm9pZCBmaW5pc2hSZWNvcmRpbmcoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHVpZF90IHVpZCkgewotICAgIC8vIE9rYXkgdG8gbm90IHRyYWNrIGluIGFwcCBvcHMgYXMgYXVkaW8gc2VydmVyIGlzIHVzIGFuZCBpZgotICAgIC8vIGRldmljZSBpcyByb290ZWQgc2VjdXJpdHkgbW9kZWwgaXMgY29uc2lkZXJlZCBjb21wcm9taXNlZC4KLSAgICBpZiAoaXNBdWRpb1NlcnZlck9yUm9vdCh1aWQpKSByZXR1cm47Ci0KLSAgICBQZXJtaXNzaW9uQ29udHJvbGxlciBwZXJtaXNzaW9uQ29udHJvbGxlcjsKLSAgICBTdHJpbmcxNiByZXNvbHZlZE9wUGFja2FnZU5hbWUgPSByZXNvbHZlQ2FsbGluZ1BhY2thZ2UoCi0gICAgICAgICAgICBwZXJtaXNzaW9uQ29udHJvbGxlciwgb3BQYWNrYWdlTmFtZSwgdWlkKTsKLSAgICBpZiAocmVzb2x2ZWRPcFBhY2thZ2VOYW1lLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBcHBPcHNNYW5hZ2VyIGFwcE9wczsKLSAgICBjb25zdCBpbnQzMl90IG9wID0gYXBwT3BzLnBlcm1pc3Npb25Ub09wQ29kZShzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbyk7Ci0gICAgYXBwT3BzLmZpbmlzaE9wKG9wLCB1aWQsIHJlc29sdmVkT3BQYWNrYWdlTmFtZSk7Ci19Ci0KLWJvb2wgY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCkgewotICAgIGlmIChnZXRwaWRfY2FjaGVkID09IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSkgcmV0dXJuIHRydWU7Ci0gICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNDYXB0dXJlQXVkaW9PdXRwdXQoImFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX09VVFBVVCIpOwotICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihzQ2FwdHVyZUF1ZGlvT3V0cHV0LCBwaWQsIHVpZCk7Ci0gICAgaWYgKCFvaykgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fT1VUUFVUIik7Ci0gICAgcmV0dXJuIG9rOwotfQotCi1ib29sIGNhcHR1cmVIb3R3b3JkQWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCkgewotICAgIC8vIENBUFRVUkVfQVVESU9fSE9UV09SRCBwZXJtaXNzaW9uIGltcGxpZXMgUkVDT1JEX0FVRElPIHBlcm1pc3Npb24KLSAgICBib29sIG9rID0gcmVjb3JkaW5nQWxsb3dlZChTdHJpbmcxNigiIiksIHBpZCwgdWlkKTsKLQotICAgIGlmIChvaykgewotICAgICAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0NhcHR1cmVIb3R3b3JkQWxsb3dlZCgiYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fSE9UV09SRCIpOwotICAgICAgICAvLyBJTVBPUlRBTlQ6IFVzZSBQZXJtaXNzaW9uQ2FjaGUgLSBub3QgYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBub3QgY2hhbmdlLgotICAgICAgICBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzQ2FwdHVyZUhvdHdvcmRBbGxvd2VkKTsKLSAgICB9Ci0gICAgaWYgKCFvaykgQUxPR0UoImFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX0hPVFdPUkQiKTsKLSAgICByZXR1cm4gb2s7Ci19Ci0KLWJvb2wgc2V0dGluZ3NBbGxvd2VkKCkgewotICAgIGlmIChnZXRwaWRfY2FjaGVkID09IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSkgcmV0dXJuIHRydWU7Ci0gICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNBdWRpb1NldHRpbmdzKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1NFVFRJTkdTIik7Ci0gICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KLSAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNBdWRpb1NldHRpbmdzKTsKLSAgICBpZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1NFVFRJTkdTIik7Ci0gICAgcmV0dXJuIG9rOwotfQotCi1ib29sIG1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSB7Ci0gICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNNb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1JPVVRJTkciKTsKLSAgICAvLyBJTVBPUlRBTlQ6IFVzZSBQZXJtaXNzaW9uQ2FjaGUgLSBub3QgYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBub3QgY2hhbmdlLgotICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc01vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQpOwotICAgIGlmICghb2spIEFMT0dFKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1JPVVRJTkciKTsKLSAgICByZXR1cm4gb2s7Ci19Ci0KLWJvb2wgZHVtcEFsbG93ZWQoKSB7Ci0gICAgLy8gZG9uJ3Qgb3B0aW1pemUgZm9yIHNhbWUgcGlkLCBzaW5jZSBtZWRpYXNlcnZlciBuZXZlciBkdW1wcyBpdHNlbGYKLSAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0R1bXAoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIik7Ci0gICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KLSAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNEdW1wKTsKLSAgICAvLyBjb252ZW50aW9uIGlzIGZvciBjYWxsZXIgdG8gZHVtcCBhbiBlcnJvciBtZXNzYWdlIHRvIGZkIGluc3RlYWQgb2YgbG9nZ2luZyBoZXJlCi0gICAgLy9pZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpOwotICAgIHJldHVybiBvazsKLX0KLQotYm9vbCBtb2RpZnlQaG9uZVN0YXRlQWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCkgewotICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzTW9kaWZ5UGhvbmVTdGF0ZSgiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9QSE9ORV9TVEFURSIpOwotICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihzTW9kaWZ5UGhvbmVTdGF0ZSwgcGlkLCB1aWQpOwotICAgIGlmICghb2spIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfUEhPTkVfU1RBVEUiKTsKLSAgICByZXR1cm4gb2s7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDVhZGExLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8YmluZGVyL1Blcm1pc3Npb25Db250cm9sbGVyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotZXh0ZXJuIHBpZF90IGdldHBpZF9jYWNoZWQ7Ci1ib29sIGlzVHJ1c3RlZENhbGxpbmdVaWQodWlkX3QgdWlkKTsKLWJvb2wgcmVjb3JkaW5nQWxsb3dlZChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpOwotYm9vbCBzdGFydFJlY29yZGluZyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpOwotdm9pZCBmaW5pc2hSZWNvcmRpbmcoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHVpZF90IHVpZCk7Ci1ib29sIGNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpOwotYm9vbCBjYXB0dXJlSG90d29yZEFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpOwotYm9vbCBzZXR0aW5nc0FsbG93ZWQoKTsKLWJvb2wgbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpOwotYm9vbCBkdW1wQWxsb3dlZCgpOwotYm9vbCBtb2RpZnlQaG9uZVN0YXRlQWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCk7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKaW5kZXggYzIzMjBiYy4uYzY5NDFjMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcApAQCAtMjMsNiArMjMsOCBAQAogI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgpAQCAtMzYsNiArMzgsNyBAQAogCiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2hhbm5lbHMuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9tb25vX2JsZW5kLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Zvcm1hdC5oPgpAQCAtNjIsOCArNjUsOCBAQAogI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgogI2luY2x1ZGUgIkZhc3RNaXhlci5oIgogI2luY2x1ZGUgIkZhc3RDYXB0dXJlLmgiCi0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgotI2luY2x1ZGUgIm1lZGlhdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaCIKKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAKICNpZmRlZiBBRERfQkFUVEVSWV9EQVRBCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgpAQCAtNzEsNyArNzQsNyBAQAogI2VuZGlmCiAKICNpZmRlZiBERUJVR19DUFVfVVNBR0UKLSNpbmNsdWRlIDxjcHVzdGF0cy9DZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvU3RhdGlzdGljcy5oPgogI2luY2x1ZGUgPGNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmg+CiAjZW5kaWYKIApAQCAtMjAwLDcgKzIwMyw3IEBACiAvLyBJbml0aWFsbHkgdGhpcyBoZWFwIGlzIHVzZWQgdG8gYWxsb2NhdGUgY2xpZW50IGJ1ZmZlcnMgZm9yICJmYXN0IiBBdWRpb1JlY29yZC4KIC8vIEV2ZW50dWFsbHkgaXQgd2lsbCBiZSB0aGUgc2luZ2xlIGJ1ZmZlciB0aGF0IEZhc3RDYXB0dXJlIHdyaXRlcyBpbnRvIHZpYSBIQUwgcmVhZCgpLAogLy8gYW5kIHRoYXQgYWxsICJmYXN0IiBBdWRpb1JlY29yZCBjbGllbnRzIHJlYWQgZnJvbS4gIEluIGVpdGhlciBjYXNlLCB0aGUgc2l6ZSBjYW4gYmUgc21hbGwuCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGtSZWNvcmRUaHJlYWRSZWFkT25seUhlYXBTaXplID0gMHg0MDAwOworc3RhdGljIGNvbnN0IHNpemVfdCBrUmVjb3JkVGhyZWFkUmVhZE9ubHlIZWFwU2l6ZSA9IDB4RDAwMDsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0zMzMsOSArMzM2LDkgQEAKICNpZmRlZiBERUJVR19DUFVfVVNBR0UKIHByaXZhdGU6CiAgICAgVGhyZWFkQ3B1VXNhZ2UgbUNwdVVzYWdlOyAgICAgICAgICAgLy8gaW5zdGFudGFuZW91cyB0aHJlYWQgQ1BVIHVzYWdlIGluIHdhbGwgY2xvY2sgbnMKLSAgICBDZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzIG1XY1N0YXRzOyAvLyBzdGF0aXN0aWNzIG9uIHRocmVhZCBDUFUgdXNhZ2UgaW4gd2FsbCBjbG9jayBucworICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbVdjU3RhdHM7IC8vIHN0YXRpc3RpY3Mgb24gdGhyZWFkIENQVSB1c2FnZSBpbiB3YWxsIGNsb2NrIG5zCiAKLSAgICBDZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzIG1IelN0YXRzOyAvLyBzdGF0aXN0aWNzIG9uIHRocmVhZCBDUFUgdXNhZ2UgaW4gY3ljbGVzCisgICAgYXVkaW9fdXRpbHM6OlN0YXRpc3RpY3M8ZG91YmxlPiBtSHpTdGF0czsgLy8gc3RhdGlzdGljcyBvbiB0aHJlYWQgQ1BVIHVzYWdlIGluIGN5Y2xlcwogCiAgICAgaW50IG1DcHVOdW07ICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyZWFkJ3MgY3VycmVudCBDUFUgbnVtYmVyCiAgICAgaW50IG1DcHVrSHo7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJlcXVlbmN5IG9mIHRocmVhZCdzIGN1cnJlbnQgQ1BVIGluIGtIegpAQCAtMzYxLDcgKzM2NCw3IEBACiAKICAgICAvLyByZWNvcmQgc2FtcGxlIGZvciB3YWxsIGNsb2NrIHN0YXRpc3RpY3MKICAgICBpZiAodmFsaWQpIHsKLSAgICAgICAgbVdjU3RhdHMuc2FtcGxlKHdjTnMpOworICAgICAgICBtV2NTdGF0cy5hZGQod2NOcyk7CiAgICAgfQogCiAgICAgLy8gZ2V0IHRoZSBjdXJyZW50IENQVSBudW1iZXIKQEAgLTM4MCwyNiArMzgzLDI2IEBACiAKICAgICAvLyBpZiBubyBjaGFuZ2UgaW4gQ1BVIG51bWJlciBvciBmcmVxdWVuY3ksIHRoZW4gcmVjb3JkIHNhbXBsZSBmb3IgY3ljbGUgc3RhdGlzdGljcwogICAgIGlmICh2YWxpZCAmJiBtQ3B1a0h6ID4gMCkgewotICAgICAgICBkb3VibGUgY3ljbGVzID0gd2NOcyAqIGNwdWtIeiAqIDAuMDAwMDAxOwotICAgICAgICBtSHpTdGF0cy5zYW1wbGUoY3ljbGVzKTsKKyAgICAgICAgY29uc3QgZG91YmxlIGN5Y2xlcyA9IHdjTnMgKiBjcHVrSHogKiAwLjAwMDAwMTsKKyAgICAgICAgbUh6U3RhdHMuYWRkKGN5Y2xlcyk7CiAgICAgfQogCi0gICAgdW5zaWduZWQgbiA9IG1XY1N0YXRzLm4oKTsKKyAgICBjb25zdCB1bnNpZ25lZCBuID0gbVdjU3RhdHMuZ2V0TigpOwogICAgIC8vIG1DcHVVc2FnZS5lbGFwc2VkKCkgaXMgZXhwZW5zaXZlLCBzbyBkb24ndCBjYWxsIGl0IGV2ZXJ5IGxvb3AKICAgICBpZiAoKG4gJiAxMjcpID09IDEpIHsKLSAgICAgICAgbG9uZyBsb25nIGVsYXBzZWQgPSBtQ3B1VXNhZ2UuZWxhcHNlZCgpOworICAgICAgICBjb25zdCBsb25nIGxvbmcgZWxhcHNlZCA9IG1DcHVVc2FnZS5lbGFwc2VkKCk7CiAgICAgICAgIGlmIChlbGFwc2VkID49IERFQlVHX0NQVV9VU0FHRSAqIDEwMDAwMDAwMDBMTCkgewotICAgICAgICAgICAgZG91YmxlIHBlckxvb3AgPSBlbGFwc2VkIC8gKGRvdWJsZSkgbjsKLSAgICAgICAgICAgIGRvdWJsZSBwZXJMb29wMTAwID0gcGVyTG9vcCAqIDAuMDE7Ci0gICAgICAgICAgICBkb3VibGUgcGVyTG9vcDFrID0gcGVyTG9vcCAqIDAuMDAxOwotICAgICAgICAgICAgZG91YmxlIG1lYW4gPSBtV2NTdGF0cy5tZWFuKCk7Ci0gICAgICAgICAgICBkb3VibGUgc3RkZGV2ID0gbVdjU3RhdHMuc3RkZGV2KCk7Ci0gICAgICAgICAgICBkb3VibGUgbWluaW11bSA9IG1XY1N0YXRzLm1pbmltdW0oKTsKLSAgICAgICAgICAgIGRvdWJsZSBtYXhpbXVtID0gbVdjU3RhdHMubWF4aW11bSgpOwotICAgICAgICAgICAgZG91YmxlIG1lYW5DeWNsZXMgPSBtSHpTdGF0cy5tZWFuKCk7Ci0gICAgICAgICAgICBkb3VibGUgc3RkZGV2Q3ljbGVzID0gbUh6U3RhdHMuc3RkZGV2KCk7Ci0gICAgICAgICAgICBkb3VibGUgbWluQ3ljbGVzID0gbUh6U3RhdHMubWluaW11bSgpOwotICAgICAgICAgICAgZG91YmxlIG1heEN5Y2xlcyA9IG1IelN0YXRzLm1heGltdW0oKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBwZXJMb29wID0gZWxhcHNlZCAvIChkb3VibGUpIG47CisgICAgICAgICAgICBjb25zdCBkb3VibGUgcGVyTG9vcDEwMCA9IHBlckxvb3AgKiAwLjAxOworICAgICAgICAgICAgY29uc3QgZG91YmxlIHBlckxvb3AxayA9IHBlckxvb3AgKiAwLjAwMTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtZWFuID0gbVdjU3RhdHMuZ2V0TWVhbigpOworICAgICAgICAgICAgY29uc3QgZG91YmxlIHN0ZGRldiA9IG1XY1N0YXRzLmdldFN0ZERldigpOworICAgICAgICAgICAgY29uc3QgZG91YmxlIG1pbmltdW0gPSBtV2NTdGF0cy5nZXRNaW4oKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtYXhpbXVtID0gbVdjU3RhdHMuZ2V0TWF4KCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbWVhbkN5Y2xlcyA9IG1IelN0YXRzLmdldE1lYW4oKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBzdGRkZXZDeWNsZXMgPSBtSHpTdGF0cy5nZXRTdGREZXYoKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtaW5DeWNsZXMgPSBtSHpTdGF0cy5nZXRNaW4oKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtYXhDeWNsZXMgPSBtSHpTdGF0cy5nZXRNYXgoKTsKICAgICAgICAgICAgIG1DcHVVc2FnZS5yZXNldEVsYXBzZWQoKTsKICAgICAgICAgICAgIG1XY1N0YXRzLnJlc2V0KCk7CiAgICAgICAgICAgICBtSHpTdGF0cy5yZXNldCgpOwpAQCAtNzQ5LDYgKzc1Miw3IEBACiAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfZ2V0X3JlcHJlc2VudGF0aW9uKG1hc2spOwogCiAgICAgc3dpdGNoIChyZXByZXNlbnRhdGlvbikgeworICAgIC8vIFRyYXZlbCBhbGwgc2luZ2xlIGJpdCBjaGFubmVsIG1hc2sgdG8gY29udmVydCBjaGFubmVsIG1hc2sgdG8gc3RyaW5nLgogICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9QT1NJVElPTjogewogICAgICAgICBpZiAob3V0cHV0KSB7CiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlQpIHMuYXBwZW5kKCJmcm9udC1sZWZ0LCAiKTsKQEAgLTc2OSw2ICs3NzMsMTAgQEAKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfTEVGVCkgcy5hcHBlbmQoInRvcC1iYWNrLWxlZnQsICIpOwogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19DRU5URVIpIHMuYXBwZW5kKCJ0b3AtYmFjay1jZW50ZXIsICIgKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfUklHSFQpIHMuYXBwZW5kKCJ0b3AtYmFjay1yaWdodCwgIiApOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfU0lERV9MRUZUKSBzLmFwcGVuZCgidG9wLXNpZGUtbGVmdCwgIiApOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfU0lERV9SSUdIVCkgcy5hcHBlbmQoInRvcC1zaWRlLXJpZ2h0LCAiICk7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0hBUFRJQ19CKSBzLmFwcGVuZCgiaGFwdGljLUIsICIgKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfSEFQVElDX0EpIHMuYXBwZW5kKCJoYXB0aWMtQSwgIiApOwogICAgICAgICAgICAgaWYgKG1hc2sgJiB+QVVESU9fQ0hBTk5FTF9PVVRfQUxMKSBzLmFwcGVuZCgidW5rbm93biwgICIpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0xFRlQpIHMuYXBwZW5kKCJsZWZ0LCAiKTsKQEAgLTc4Myw2ICs3OTEsMTIgQEAKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9YX0FYSVMpIHMuYXBwZW5kKCJYLCAiKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9ZX0FYSVMpIHMuYXBwZW5kKCJZLCAiKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9aX0FYSVMpIHMuYXBwZW5kKCJaLCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9CQUNLX0xFRlQpIHMuYXBwZW5kKCJiYWNrLWxlZnQsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0JBQ0tfUklHSFQpIHMuYXBwZW5kKCJiYWNrLXJpZ2h0LCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9DRU5URVIpIHMuYXBwZW5kKCJjZW50ZXIsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0xPV19GUkVRVUVOQ1kpIHMuYXBwZW5kKCJsb3cgZnJlcSwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fVE9QX0xFRlQpIHMuYXBwZW5kKCJ0b3AtbGVmdCwgIiApOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1RPUF9SSUdIVCkgcy5hcHBlbmQoInRvcC1yaWdodCwgIiApOwogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX1VQTElOSykgcy5hcHBlbmQoInZvaWNlLXVwbGluaywgIik7CiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfRE5MSU5LKSBzLmFwcGVuZCgidm9pY2UtZG5saW5rLCAiKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgfkFVRElPX0NIQU5ORUxfSU5fQUxMKSBzLmFwcGVuZCgidW5rbm93biwgICIpOwpAQCAtODQ1LDYgKzg1OSwxNiBAQAogICAgIGRwcmludGYoZmQsICIgIElucHV0IGRldmljZTogJSN4ICglcylcbiIsIG1JbkRldmljZSwgZGV2aWNlc1RvU3RyaW5nKG1JbkRldmljZSkuY19zdHIoKSk7CiAgICAgZHByaW50ZihmZCwgIiAgQXVkaW8gc291cmNlOiAlZCAoJXMpXG4iLCBtQXVkaW9Tb3VyY2UsIHNvdXJjZVRvU3RyaW5nKG1BdWRpb1NvdXJjZSkpOwogCisgICAgLy8gRHVtcCB0aW1lc3RhbXAgc3RhdGlzdGljcyBmb3IgdGhlIFRocmVhZCB0eXBlcyB0aGF0IHN1cHBvcnQgaXQuCisgICAgaWYgKG1UeXBlID09IFJFQ09SRAorICAgICAgICAgICAgfHwgbVR5cGUgPT0gTUlYRVIKKyAgICAgICAgICAgIHx8IG1UeXBlID09IERVUExJQ0FUSU5HCisgICAgICAgICAgICB8fCBtVHlwZSA9PSBESVJFQ1QKKyAgICAgICAgICAgIHx8IG1UeXBlID09IE9GRkxPQUQpIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgVGltZXN0YW1wIHN0YXRzOiAlc1xuIiwgbVRpbWVzdGFtcFZlcmlmaWVyLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIGRwcmludGYoZmQsICIgIFRpbWVzdGFtcCBjb3JyZWN0ZWQ6ICVzXG4iLCBpc1RpbWVzdGFtcENvcnJlY3Rpb25FbmFibGVkKCkgPyAieWVzIiA6ICJubyIpOworICAgIH0KKwogICAgIGlmIChsb2NrZWQpIHsKICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgfQpAQCAtMTUxOSw3ICsxNTQzLDcgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6dG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCiB7CiAgICAgY29uZmlnLT50eXBlID0gQVVESU9fUE9SVF9UWVBFX01JWDsKICAgICBjb25maWctPmV4dC5taXguaGFuZGxlID0gbUlkOwpAQCAtMTU3MSw2ICsxNTk1LDkgQEAKICAgICAtLW1CYXR0ZXJ5Q291bnRlclt0cmFjay0+dWlkKCldLnNlY29uZDsKICAgICAvLyBtTGF0ZXN0QWN0aXZlVHJhY2sgaXMgbm90IGNsZWFyZWQgZXZlbiBpZiBpcyB0aGUgc2FtZSBhcyB0cmFjay4KICAgICBtSGFzQ2hhbmdlZCA9IHRydWU7CisjaWZkZWYgVEVFX1NJTksKKyAgICB0cmFjay0+ZHVtcFRlZSgtMSAvKiBmZCAqLywgIl9SRU1PVkUiKTsKKyNlbmRpZgogICAgIHJldHVybiBpbmRleDsKIH0KIApAQCAtMTcwOSwxMCArMTczNiwyMSBAQAogICAgICAgICBpZiAobU91dHB1dC0+YXVkaW9Id0Rldi0+Y2FuU2V0TWFzdGVyTXV0ZSgpKSB7CiAgICAgICAgICAgICBtTWFzdGVyTXV0ZSA9IGZhbHNlOwogICAgICAgICB9CisgICAgICAgIG1Jc01zZERldmljZSA9IHN0cmNtcCgKKyAgICAgICAgICAgICAgICBtT3V0cHV0LT5hdWRpb0h3RGV2LT5tb2R1bGVOYW1lKCksIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpID09IDA7CiAgICAgfQogCiAgICAgcmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpOwogCisgICAgLy8gVE9ETzogV2UgbWF5IGFsc28gbWF0Y2ggb24gYWRkcmVzcyBhcyB3ZWxsIGFzIGRldmljZSB0eXBlIGZvcgorICAgIC8vIEFVRElPX0RFVklDRV9PVVRfQlVTLCBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQLCBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgKKyAgICBpZiAodHlwZSA9PSBNSVhFUiB8fCB0eXBlID09IERJUkVDVCkgeworICAgICAgICBtVGltZXN0YW1wQ29ycmVjdGVkRGV2aWNlcyA9IChhdWRpb19kZXZpY2VzX3QpcHJvcGVydHlfZ2V0X2ludDY0KAorICAgICAgICAgICAgICAgICJhdWRpby50aW1lc3RhbXAuY29ycmVjdGVkX291dHB1dF9kZXZpY2VzIiwKKyAgICAgICAgICAgICAgICAoaW50NjRfdCkobUlzTXNkRGV2aWNlID8gQVVESU9fREVWSUNFX09VVF9CVVMgLy8gdHVybiBvbiBieSBkZWZhdWx0IGZvciBNU0QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVVESU9fREVWSUNFX05PTkUpKTsKKyAgICB9CisKICAgICAvLyArKyBvcGVyYXRvciBkb2VzIG5vdCBjb21waWxlCiAgICAgZm9yIChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IEFVRElPX1NUUkVBTV9NSU47IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsKICAgICAgICAgICAgIHN0cmVhbSA9IChhdWRpb19zdHJlYW1fdHlwZV90KSAoc3RyZWFtICsgMSkpIHsKQEAgLTE3NzMsNyArMTgxMSw3IEBACiAgICAgaWYgKG51bXRyYWNrcykgewogICAgICAgICBkcHJpbnRmKGZkLCAiIG9mIHdoaWNoICV6dSBhcmUgYWN0aXZlXG4iLCBudW1hY3RpdmUpOwogICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7Ci0gICAgICAgIFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CisgICAgICAgIG1UcmFja3NbMF0tPmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW10cmFja3M7ICsraSkgewogICAgICAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKICAgICAgICAgICAgIGlmICh0cmFjayAhPSAwKSB7CkBAIC0xNzkzLDcgKzE4MzEsNyBAQAogICAgICAgICByZXN1bHQuYXBwZW5kKCIgIFRoZSBmb2xsb3dpbmcgdHJhY2tzIGFyZSBpbiB0aGUgYWN0aXZlIGxpc3QgYnV0IgogICAgICAgICAgICAgICAgICIgbm90IGluIHRoZSB0cmFjayBsaXN0XG4iKTsKICAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwotICAgICAgICBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOworICAgICAgICBtQWN0aXZlVHJhY2tzWzBdLT5hcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtYWN0aXZlOyArK2kpIHsKICAgICAgICAgICAgIHNwPFRyYWNrPiB0cmFjayA9IG1BY3RpdmVUcmFja3NbaV07CiAgICAgICAgICAgICBpZiAobVRyYWNrcy5pbmRleE9mKHRyYWNrKSA8IDApIHsKQEAgLTE4MTAsNiArMTg0OCwxMSBAQAogewogICAgIGR1bXBCYXNlKGZkLCBhcmdzKTsKIAorICAgIGRwcmludGYoZmQsICIgIE1hc3RlciBtdXRlOiAlc1xuIiwgbU1hc3Rlck11dGUgPyAib24iIDogIm9mZiIpOworICAgIGlmIChtSGFwdGljQ2hhbm5lbE1hc2sgIT0gQVVESU9fQ0hBTk5FTF9OT05FKSB7CisgICAgICAgIGRwcmludGYoZmQsICIgIEhhcHRpYyBjaGFubmVsIG1hc2s6ICUjeCAoJXMpXG4iLCBtSGFwdGljQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tUb1N0cmluZyhtSGFwdGljQ2hhbm5lbE1hc2ssIHRydWUgLyogb3V0cHV0ICovKS5jX3N0cigpKTsKKyAgICB9CiAgICAgZHByaW50ZihmZCwgIiAgTm9ybWFsIGZyYW1lIGNvdW50OiAlenVcbiIsIG1Ob3JtYWxGcmFtZUNvdW50KTsKICAgICBkcHJpbnRmKGZkLCAiICBMYXN0IHdyaXRlIG9jY3VycmVkIChtc2Vjcyk6ICVsbHVcbiIsCiAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBuczJtcyhzeXN0ZW1UaW1lKCkgLSBtTGFzdFdyaXRlVGltZSkpOwpAQCAtMTg4MCwxMSArMTkyMywxNyBAQAogICAgIHN0YXR1c190IGxTdGF0dXM7CiAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3Qgb3V0cHV0RmxhZ3MgPSBtT3V0cHV0LT5mbGFnczsKICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCByZXF1ZXN0ZWRGbGFncyA9ICpmbGFnczsKKyAgICB1aW50MzJfdCBzYW1wbGVSYXRlOworCisgICAgaWYgKHNoYXJlZEJ1ZmZlciAhPSAwICYmIGNoZWNrSU1lbW9yeShzaGFyZWRCdWZmZXIpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CiAKICAgICBpZiAoKnBTYW1wbGVSYXRlID09IDApIHsKICAgICAgICAgKnBTYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7CiAgICAgfQotICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSAqcFNhbXBsZVJhdGU7CisgICAgc2FtcGxlUmF0ZSA9ICpwU2FtcGxlUmF0ZTsKIAogICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgRkFTVCBmbGFnIGNvbnNpZGVyZWQgT0sgaWYgZmFzdCBtaXhlciBpcyBwcmVzZW50CiAgICAgaWYgKGhhc0Zhc3RNaXhlcigpKSB7CkBAIC0xOTA1LDcgKzE5NTQsNyBAQAogICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpICYmCiAgICAgICAgICAgICAvLyBUT0RPOiBleHRyYWN0IGFzIGEgZGF0YSBsaWJyYXJ5IGZ1bmN0aW9uIHRoYXQgY2hlY2tzIHRoYXQgYSBjb21wdXRhdGlvbmFsbHkKICAgICAgICAgICAgIC8vIGV4cGVuc2l2ZSBkb3dubWl4ZXIgaXMgbm90IHJlcXVpcmVkOiBpc0Zhc3RPdXRwdXRDaGFubmVsQ29udmVyc2lvbigpCi0gICAgICAgICAgICAoY2hhbm5lbE1hc2sgPT0gbUNoYW5uZWxNYXNrIHx8CisgICAgICAgICAgICAoY2hhbm5lbE1hc2sgPT0gKG1DaGFubmVsTWFzayB8IG1IYXB0aWNDaGFubmVsTWFzaykgfHwKICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrICE9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyB8fAogICAgICAgICAgICAgICAgICAgICAoY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICYmIG1DaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8gKi8pKSAmJgpAQCAtMjE3NCw0OCArMjIyMywxNyBAQAogfQogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3NpemVfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFja3M8VD46OmFkZChjb25zdCBzcDxUPiAmdHJhY2spCi17Ci0gICAgY29uc3Qgc3NpemVfdCBpbmRleCA9IG1UcmFja3MuYWRkKHRyYWNrKTsKLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAvLyBzZXQgbmFtZSBmb3IgdHJhY2sgd2hlbiBhZGRpbmcuCi0gICAgICAgIGludCBuYW1lOwotICAgICAgICBpZiAobVVudXNlZFRyYWNrTmFtZXMuZW1wdHkoKSkgewotICAgICAgICAgICAgbmFtZSA9IG1UcmFja3Muc2l6ZSgpIC0gMTsgLy8gbmV3IG5hbWUgezAgLi4uIHNpemUtMX0uCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyByZXVzZSBzbWFsbGVzdCBuYW1lIGZvciBkZWxldGVkIHRyYWNrLgotICAgICAgICAgICAgYXV0byBpdCA9IG1VbnVzZWRUcmFja05hbWVzLmJlZ2luKCk7Ci0gICAgICAgICAgICBuYW1lID0gKml0OwotICAgICAgICAgICAgKHZvaWQpbVVudXNlZFRyYWNrTmFtZXMuZXJhc2UoaXQpOwotICAgICAgICB9Ci0gICAgICAgIHRyYWNrLT5zZXROYW1lKG5hbWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUwoImNhbm5vdCBhZGQgdHJhY2siKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluZGV4OwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgogc3NpemVfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFja3M8VD46OnJlbW92ZShjb25zdCBzcDxUPiAmdHJhY2spCiB7Ci0gICAgY29uc3QgaW50IG5hbWUgPSB0cmFjay0+bmFtZSgpOworICAgIGNvbnN0IGludCB0cmFja0lkID0gdHJhY2stPmlkKCk7CiAgICAgY29uc3Qgc3NpemVfdCBpbmRleCA9IG1UcmFja3MucmVtb3ZlKHRyYWNrKTsKICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAvLyBpbnZhbGlkYXRlIG5hbWUgd2hlbiByZW1vdmluZyBmcm9tIG1UcmFja3MuCi0gICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobmFtZSA8IDAsICJpbnZhbGlkIG5hbWUgJWQgZm9yIHRyYWNrIG9uIG1UcmFja3MiLCBuYW1lKTsKLQotICAgICAgICBpZiAobVNhdmVEZWxldGVkVHJhY2tOYW1lcykgeworICAgICAgICBpZiAobVNhdmVEZWxldGVkVHJhY2tJZHMpIHsKICAgICAgICAgICAgIC8vIFdlIGNhbid0IGRpcmVjdGx5IGFjY2VzcyBtQXVkaW9NaXhlciBzaW5jZSB0aGUgY2FsbGVyIG1heSBiZSBvdXRzaWRlIG9mIHRocmVhZExvb3AuCi0gICAgICAgICAgICAvLyBJbnN0ZWFkLCB3ZSBhZGQgdG8gbURlbGV0ZWRUcmFja05hbWVzIHdoaWNoIGlzIHNvbGVseSB1c2VkIGZvciBtQXVkaW9NaXhlciB1cGRhdGUsCisgICAgICAgICAgICAvLyBJbnN0ZWFkLCB3ZSBhZGQgdG8gbURlbGV0ZWRUcmFja0lkcyB3aGljaCBpcyBzb2xlbHkgdXNlZCBmb3IgbUF1ZGlvTWl4ZXIgdXBkYXRlLAogICAgICAgICAgICAgLy8gdG8gYmUgaGFuZGxlZCB3aGVuIE1peGVyVGhyZWFkOjpwcmVwYXJlVHJhY2tzX2woKSBuZXh0IGNoYW5nZXMgbUF1ZGlvTWl4ZXIuCi0gICAgICAgICAgICBtRGVsZXRlZFRyYWNrTmFtZXMuZW1wbGFjZShuYW1lKTsKKyAgICAgICAgICAgIG1EZWxldGVkVHJhY2tJZHMuZW1wbGFjZSh0cmFja0lkKTsKICAgICAgICAgfQotCi0gICAgICAgIG1VbnVzZWRUcmFja05hbWVzLmVtcGxhY2UobmFtZSk7Ci0gICAgICAgIHRyYWNrLT5zZXROYW1lKFQ6OlRSQUNLX05BTUVfUEVORElORyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihuYW1lID49IDAsCi0gICAgICAgICAgICAgICAgInZhbGlkIG5hbWUgJWQgZm9yIHRyYWNrIG5vdCBpbiBtVHJhY2tzIChyZXR1cm5lZCAlemQpIiwgbmFtZSwgaW5kZXgpOwogICAgIH0KICAgICByZXR1cm4gaW5kZXg7CiB9CkBAIC0yMzAzLDE1ICsyMzIxLDEzIEBACiAgICAgICAgIGlmICh0cmFjay0+aXNFeHRlcm5hbFRyYWNrKCkpIHsKICAgICAgICAgICAgIFRyYWNrQmFzZTo6dHJhY2tfc3RhdGUgc3RhdGUgPSB0cmFjay0+bVN0YXRlOwogICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6c3RhcnRPdXRwdXQobUlkLCB0cmFjay0+c3RyZWFtVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6c3RhcnRPdXRwdXQodHJhY2stPnBvcnRJZCgpKTsKICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgIC8vIGFib3J0IHRyYWNrIHdhcyBzdG9wcGVkL3BhdXNlZCB3aGlsZSB3ZSByZWxlYXNlZCB0aGUgbG9jawogICAgICAgICAgICAgaWYgKHN0YXRlICE9IHRyYWNrLT5tU3RhdGUpIHsKICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dChtSWQsIHRyYWNrLT5zdHJlYW1UeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KHRyYWNrLT5wb3J0SWQoKSk7CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMjM0MCw2ICsyMzU2LDE3IEBACiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zaGFyZWRCdWZmZXIoKSAhPSAwID8gVHJhY2s6OkZTX0ZJTExFRCA6IFRyYWNrOjpGU19GSUxMSU5HOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gRGlzYWJsZSBhbGwgaGFwdGljIHBsYXliYWNrIGZvciBhbGwgb3RoZXIgYWN0aXZlIHRyYWNrcyB3aGVuIGhhcHRpYyBwbGF5YmFjayBpcyBzdXBwb3J0ZWQKKyAgICAgICAgLy8gYW5kIHRoZSB0cmFjayBjb250YWlucyBoYXB0aWMgY2hhbm5lbHMuIEVuYWJsZSBoYXB0aWMgcGxheWJhY2sgZm9yIGN1cnJlbnQgdHJhY2suCisgICAgICAgIC8vIFRPRE86IFJlcXVlc3QgYWN0dWFsIGhhcHRpYyBwbGF5YmFjayBzdGF0dXMgZnJvbSB2aWJyYXRvciBzZXJ2aWNlCisgICAgICAgIGlmICgodHJhY2stPmNoYW5uZWxNYXNrKCkgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpICE9IEFVRElPX0NIQU5ORUxfTk9ORQorICAgICAgICAgICAgICAgICYmIG1IYXB0aWNDaGFubmVsTWFzayAhPSBBVURJT19DSEFOTkVMX05PTkUpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byAmdCA6IG1BY3RpdmVUcmFja3MpIHsKKyAgICAgICAgICAgICAgICB0LT5zZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJhY2stPnNldEhhcHRpY1BsYXliYWNrRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgfQorCiAgICAgICAgIHRyYWNrLT5tUmVzZXREb25lID0gZmFsc2U7CiAgICAgICAgIHRyYWNrLT5tUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMgPSAwOwogICAgICAgICBtQWN0aXZlVHJhY2tzLmFkZCh0cmFjayk7CkBAIC0yNDA1LDYgKzI0MzIsMTQgQEAKICAgICByZXR1cm4gU3RyaW5nOCgpOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6c2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1PdXRwdXQgPT0gbnVsbHB0ciB8fCBtT3V0cHV0LT5zdHJlYW0gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1PdXRwdXQtPnN0cmVhbS0+c2VsZWN0UHJlc2VudGF0aW9uKHByZXNlbnRhdGlvbklkLCBwcm9ncmFtSWQpOworfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCkgewogICAgIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBkZXNjID0gbmV3IEF1ZGlvSW9EZXNjcmlwdG9yKCk7CiAgICAgQUxPR1YoIlBsYXliYWNrVGhyZWFkOjppb0NvbmZpZ0NoYW5nZWQsIHRocmVhZCAlcCwgZXZlbnQgJWQiLCB0aGlzLCBldmVudCk7CkBAIC0yNDYyLDYgKzI0OTcsMTEgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIC8vIHJlamVjdCBvdXQgb2Ygc2VxdWVuY2UgcmVxdWVzdHMKICAgICBpZiAoKG1EcmFpblNlcXVlbmNlICYgMSkgJiYgKHNlcXVlbmNlID09IG1EcmFpblNlcXVlbmNlKSkgeworICAgICAgICAvLyBSZWdpc3RlciBkaXNjb250aW51aXR5IHdoZW4gSFcgZHJhaW4gaXMgY29tcGxldGVkIGJlY2F1c2UgdGhhdCBjYW4gY2F1c2UKKyAgICAgICAgLy8gdGhlIHRpbWVzdGFtcCBmcmFtZSBwb3NpdGlvbiB0byByZXNldCB0byAwIGZvciBkaXJlY3QgYW5kIG9mZmxvYWQgdGhyZWFkcy4KKyAgICAgICAgLy8gKE91dCBvZiBzZXF1ZW5jZSByZXF1ZXN0cyBhcmUgaWdub3JlZCwgc2luY2UgdGhlIGRpc2NvbnRpbnVpdHkgd291bGQgYmUgaGFuZGxlZAorICAgICAgICAvLyBlbHNld2hlcmUsIGUuZy4gaW4gZmx1c2gpLgorICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eSgpOwogICAgICAgICBtRHJhaW5TZXF1ZW5jZSAmPSB+MTsKICAgICAgICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7CiAgICAgfQpAQCAtMjYxNCw2ICsyNjU0LDExIEBACiAgICAgICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtRWZmZWN0QnVmZmVyLCAzMiwgbUVmZmVjdEJ1ZmZlclNpemUpOwogICAgIH0KIAorICAgIG1IYXB0aWNDaGFubmVsTWFzayA9IG1DaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTDsKKyAgICBtQ2hhbm5lbE1hc2sgJj0gfm1IYXB0aWNDaGFubmVsTWFzazsKKyAgICBtSGFwdGljQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1IYXB0aWNDaGFubmVsTWFzayk7CisgICAgbUNoYW5uZWxDb3VudCAtPSBtSGFwdGljQ2hhbm5lbENvdW50OworCiAgICAgLy8gZm9yY2UgcmVjb25maWd1cmF0aW9uIG9mIGVmZmVjdCBjaGFpbnMgYW5kIGVuZ2luZXMgdG8gdGFrZSBuZXcgYnVmZmVyIHNpemUgYW5kIGF1ZGlvCiAgICAgLy8gcGFyYW1ldGVycyBpbnRvIGFjY291bnQKICAgICAvLyBOb3RlIHRoYXQgbUxvY2sgaXMgbm90IGhlbGQgd2hlbiByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCkgaXMgY2FsbGVkIGZyb20gdGhlIGNvbnN0cnVjdG9yCkBAIC0yNzgxLDI0ICsyODI2LDE4IEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnRocmVhZExvb3BfcmVtb3ZlVHJhY2tzKAogICAgICAgICBjb25zdCBWZWN0b3I8IHNwPFRyYWNrPiA+JiB0cmFja3NUb1JlbW92ZSkKIHsKLSAgICBzaXplX3QgY291bnQgPSB0cmFja3NUb1JlbW92ZS5zaXplKCk7Ci0gICAgaWYgKGNvdW50ID4gMCkgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMCA7IGkgPCBjb3VudCA7IGkrKykgewotICAgICAgICAgICAgY29uc3Qgc3A8VHJhY2s+JiB0cmFjayA9IHRyYWNrc1RvUmVtb3ZlLml0ZW1BdChpKTsKLSAgICAgICAgICAgIGlmICh0cmFjay0+aXNFeHRlcm5hbFRyYWNrKCkpIHsKLSAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dChtSWQsIHRyYWNrLT5zdHJlYW1UeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAvLyBNaXNjZWxsYW5lb3VzIHRyYWNrIGNsZWFudXAgd2hlbiByZW1vdmVkIGZyb20gdGhlIGFjdGl2ZSBsaXN0LAorICAgIC8vIGNhbGxlZCB3aXRob3V0IFRocmVhZCBsb2NrIGJ1dCBzeW5jaHJvbml6ZWQgd2l0aCB0aHJlYWRMb29wIHByb2Nlc3NpbmcuCiAjaWZkZWYgQUREX0JBVFRFUllfREFUQQotICAgICAgICAgICAgICAgIC8vIHRvIHRyYWNrIHRoZSBzcGVha2VyIHVzYWdlCi0gICAgICAgICAgICAgICAgYWRkQmF0dGVyeURhdGEoSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhQXVkaW9GbGluZ2VyU3RvcCk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBpZiAodHJhY2stPmlzVGVybWluYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG1JZCwgdHJhY2stPnN0cmVhbVR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNlc3Npb25JZCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiB0cmFjayA6IHRyYWNrc1RvUmVtb3ZlKSB7CisgICAgICAgIGlmICh0cmFjay0+aXNFeHRlcm5hbFRyYWNrKCkpIHsKKyAgICAgICAgICAgIC8vIHRvIHRyYWNrIHRoZSBzcGVha2VyIHVzYWdlCisgICAgICAgICAgICBhZGRCYXR0ZXJ5RGF0YShJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFBdWRpb0ZsaW5nZXJTdG9wKTsKICAgICAgICAgfQogICAgIH0KKyNlbHNlCisgICAgKHZvaWQpdHJhY2tzVG9SZW1vdmU7IC8vIHN1cHByZXNzIHVudXNlZCB3YXJuaW5nCisjZW5kaWYKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpjaGVja1NpbGVudE1vZGVfbCgpCkBAIC0yODUwLDYgKzI4ODksOSBAQAogICAgICAgICBBVFJBQ0VfRU5EKCk7CiAgICAgICAgIGlmIChmcmFtZXNXcml0dGVuID4gMCkgewogICAgICAgICAgICAgYnl0ZXNXcml0dGVuID0gZnJhbWVzV3JpdHRlbiAqIG1GcmFtZVNpemU7CisjaWZkZWYgVEVFX1NJTksKKyAgICAgICAgICAgIG1UZWUud3JpdGUoKGNoYXIgKiltU2lua0J1ZmZlciArIG9mZnNldCwgZnJhbWVzV3JpdHRlbik7CisjZW5kaWYKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IGZyYW1lc1dyaXR0ZW47CiAgICAgICAgIH0KQEAgLTI5ODksNyArMzAzMSw3IEBACiAgICAgICAgIC8vIE9ubHkgb25lIGVmZmVjdCBjaGFpbiBjYW4gYmUgcHJlc2VudCBpbiBkaXJlY3Qgb3V0cHV0IHRocmVhZCBhbmQgaXQgdXNlcwogICAgICAgICAvLyB0aGUgc2luayBidWZmZXIgYXMgaW5wdXQKICAgICAgICAgaWYgKG1UeXBlICE9IERJUkVDVCkgewotICAgICAgICAgICAgc2l6ZV90IG51bVNhbXBsZXMgPSBtTm9ybWFsRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQ7CisgICAgICAgICAgICBzaXplX3QgbnVtU2FtcGxlcyA9IG1Ob3JtYWxGcmFtZUNvdW50ICogKG1DaGFubmVsQ291bnQgKyBtSGFwdGljQ2hhbm5lbENvdW50KTsKICAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IG1BdWRpb0ZsaW5nZXItPm1FZmZlY3RzRmFjdG9yeUhhbC0+YWxsb2NhdGVCdWZmZXIoCiAgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMgKiBzaXplb2YoZWZmZWN0X2J1ZmZlcl90KSwKICAgICAgICAgICAgICAgICAgICAgJmhhbEluQnVmZmVyKTsKQEAgLTMxNjcsNiArMzIwOSwxNiBAQAogCiAgICAgY2hlY2tTaWxlbnRNb2RlX2woKTsKIAorICAgIC8vIERJUkVDVCBhbmQgT0ZGTE9BRCB0aHJlYWRzIHNob3VsZCByZXNldCBmcmFtZSBjb3VudCB0byB6ZXJvIG9uIHN0b3AvZmx1c2gKKyAgICAvLyBUT0RPOiBhZGQgY29uZmlybWF0aW9uIGNoZWNrczoKKyAgICAvLyAxKSBESVJFQ1QgdGhyZWFkcyBhbmQgbGluZWFyIFBDTSBmb3JtYXQgcmVhbGx5IHJlc2V0cyB0byAwPworICAgIC8vIDIpIElzIGZyYW1lIGNvdW50IHJlYWxseSB2YWxpZCBpZiBub3QgbGluZWFyIHBjbT8KKyAgICAvLyAzKSBBcmUgYWxsIDY0IGJpdHMgb2YgcG9zaXRpb24gcmV0dXJuZWQsIG5vdCBqdXN0IGxvd2VzdCAzMiBiaXRzPworICAgIGlmIChtVHlwZSA9PSBPRkZMT0FEIHx8IG1UeXBlID09IERJUkVDVCkgeworICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuc2V0RGlzY29udGludWl0eU1vZGUobVRpbWVzdGFtcFZlcmlmaWVyLkRJU0NPTlRJTlVJVFlfTU9ERV9aRVJPKTsKKyAgICB9CisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbGFzdERvd25zdHJlYW1QYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworCiAgICAgd2hpbGUgKCFleGl0UGVuZGluZygpKQogICAgIHsKICAgICAgICAgLy8gTG9nIG1lcmdlIHJlcXVlc3RzIGFyZSBwZXJmb3JtZWQgZHVyaW5nIEF1ZGlvRmxpbmdlciBiaW5kZXIgdHJhbnNhY3Rpb25zLCBidXQKQEAgLTMxNzcsNiArMzIyOSw0OSBAQAogCiAgICAgICAgIFZlY3Rvcjwgc3A8RWZmZWN0Q2hhaW4+ID4gZWZmZWN0Q2hhaW5zOwogCisgICAgICAgIC8vIElmIHRoZSBkZXZpY2UgaXMgQVVESU9fREVWSUNFX09VVF9CVVMsIGNoZWNrIGZvciBkb3duc3RyZWFtIGxhdGVuY3kuCisgICAgICAgIC8vCisgICAgICAgIC8vIE5vdGU6IHdlIGFjY2VzcyBvdXREZXZpY2UoKSBvdXRzaWRlIG9mIG1Mb2NrLgorICAgICAgICBpZiAoaXNNc2REZXZpY2UoKSAmJiAob3V0RGV2aWNlKCkgJiBBVURJT19ERVZJQ0VfT1VUX0JVUykgIT0gMCkgeworICAgICAgICAgICAgLy8gSGVyZSwgd2UgdHJ5IGZvciB0aGUgQUYgbG9jaywgYnV0IGRvIG5vdCBibG9jayBvbiBpdCBhcyB0aGUgbGF0ZW5jeQorICAgICAgICAgICAgLy8gaXMgbW9yZSBpbmZvcm1hdGlvbmFsLgorICAgICAgICAgICAgaWYgKG1BdWRpb0ZsaW5nZXItPm1Mb2NrLnRyeUxvY2soKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBhdGNoUGFuZWw6OlNvZnR3YXJlUGF0Y2g+IHN3UGF0Y2hlczsKKyAgICAgICAgICAgICAgICBkb3VibGUgbGF0ZW5jeU1zOworICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGRvd25zdHJlYW1QYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICAgICAgICAgIGlmIChtQXVkaW9GbGluZ2VyLT5tUGF0Y2hQYW5lbC5nZXREb3duc3RyZWFtU29mdHdhcmVQYXRjaGVzKGlkKCksICZzd1BhdGNoZXMpID09IE9LCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBzd1BhdGNoZXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gc3dQYXRjaGVzWzBdLmdldExhdGVuY3lNc19sKCZsYXRlbmN5TXMpOworICAgICAgICAgICAgICAgICAgICAgICAgZG93bnN0cmVhbVBhdGNoSGFuZGxlID0gc3dQYXRjaGVzWzBdLmdldFBhdGNoSGFuZGxlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChkb3duc3RyZWFtUGF0Y2hIYW5kbGUgIT0gbGFzdERvd25zdHJlYW1QYXRjaEhhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICBtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgbGFzdERvd25zdHJlYW1QYXRjaEhhbmRsZSA9IGRvd25zdHJlYW1QYXRjaEhhbmRsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAvLyB2ZXJpZnkgZG93bnN0cmVhbSBsYXRlbmN5ICh3ZSBhc3N1bWUgYSBtYXggcmVhc29uYWJsZQorICAgICAgICAgICAgICAgICAgICAvLyBsYXRlbmN5IG9mIDUgc2Vjb25kcykuCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtaW5MYXRlbmN5ID0gMC4sIG1heExhdGVuY3kgPSA1MDAwLjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhdGVuY3lNcyA+PSBtaW5MYXRlbmN5ICYmIGxhdGVuY3lNcyA8PSBtYXhMYXRlbmN5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigibmV3IGRvd25zdHJlYW0gbGF0ZW5jeSAlbGYgbXMiLCBsYXRlbmN5TXMpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIm91dCBvZiByYW5nZSBkb3duc3RyZWFtIGxhdGVuY3kgJWxmIG1zIiwgbGF0ZW5jeU1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXRlbmN5TXMgPCBtaW5MYXRlbmN5KSBsYXRlbmN5TXMgPSBtaW5MYXRlbmN5OworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobGF0ZW5jeU1zID4gbWF4TGF0ZW5jeSkgbGF0ZW5jeU1zID0gbWF4TGF0ZW5jeTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMuYWRkKGxhdGVuY3lNcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1BdWRpb0ZsaW5nZXItPm1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGxhc3REb3duc3RyZWFtUGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICAvLyBvdXIgZGV2aWNlIGlzIG5vIGxvbmdlciBBVURJT19ERVZJQ0VfT1VUX0JVUywgcmVzZXQgcGF0Y2ggaGFuZGxlIGFuZCBzdGF0cy4KKyAgICAgICAgICAgICAgICBtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMucmVzZXQoKTsKKyAgICAgICAgICAgICAgICBsYXN0RG93bnN0cmVhbVBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICB7IC8vIHNjb3BlIGZvciBtTG9jawogCiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtMzE5MCwxNiArMzI4NSw1MSBAQAogICAgICAgICAgICAgICAgIGxvZ1N0cmluZyA9IE5VTEw7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIC8vIENvbGxlY3QgdGltZXN0YW1wIHN0YXRpc3RpY3MgZm9yIHRoZSBQbGF5YmFjayBUaHJlYWQgdHlwZXMgdGhhdCBzdXBwb3J0IGl0LgorICAgICAgICAgICAgaWYgKG1UeXBlID09IE1JWEVSCisgICAgICAgICAgICAgICAgICAgIHx8IG1UeXBlID09IERVUExJQ0FUSU5HCisgICAgICAgICAgICAgICAgICAgIHx8IG1UeXBlID09IERJUkVDVAorICAgICAgICAgICAgICAgICAgICB8fCBtVHlwZSA9PSBPRkZMT0FEKSB7IC8vIG5vIGluZGVudGF0aW9uCiAgICAgICAgICAgICAvLyBHYXRoZXIgdGhlIGZyYW1lc1JlbGVhc2VkIGNvdW50ZXJzIGZvciBhbGwgYWN0aXZlIHRyYWNrcywKICAgICAgICAgICAgIC8vIGFuZCBhc3NvY2lhdGUgd2l0aCB0aGUgc2luayBmcmFtZXMgd3JpdHRlbiBvdXQuICBXZSBuZWVkCiAgICAgICAgICAgICAvLyB0aGlzIHRvIGNvbnZlcnQgdGhlIHNpbmsgdGltZXN0YW1wIHRvIHRoZSB0cmFjayB0aW1lc3RhbXAuCiAgICAgICAgICAgICBib29sIGtlcm5lbExvY2F0aW9uVXBkYXRlID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAobU5vcm1hbFNpbmsgIT0gMCkgewotICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBEdXBsaWNhdGluZ1RocmVhZCBtYXkgbm90IGhhdmUgYSBtTm9ybWFsU2luay4KKyAgICAgICAgICAgIEV4dGVuZGVkVGltZXN0YW1wIHRpbWVzdGFtcDsgLy8gdXNlIHByaXZhdGUgY29weSB0byBmZXRjaAorICAgICAgICAgICAgaWYgKG1TdGFuZGJ5KSB7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmRpc2NvbnRpbnVpdHkoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodGhyZWFkbG9vcF9nZXRIYWxUaW1lc3RhbXBfbCgmdGltZXN0YW1wKSA9PSBPSykgeworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5hZGQodGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdLAorICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUpOworCisgICAgICAgICAgICAgICAgaWYgKGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiVFNfQkVGT1JFOiAlZCAlbGxkICVsbGQiLCBpZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdKTsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBjb3JyZWN0ZWRUaW1lc3RhbXAgPSBtVGltZXN0YW1wVmVyaWZpZXIuZ2V0TGFzdENvcnJlY3RlZFRpbWVzdGFtcCgpOworICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBjb3JyZWN0ZWRUaW1lc3RhbXAubUZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGNvcnJlY3RlZFRpbWVzdGFtcC5tVGltZU5zOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiVFNfQUZURVI6ICVkICVsbGQgJWxsZCIsIGlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0pOworCisgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IERvd25zdHJlYW0gbGF0ZW5jeSBvbmx5IGFkZGVkIGlmIHRpbWVzdGFtcCBjb3JyZWN0aW9uIGVuYWJsZWQuCisgICAgICAgICAgICAgICAgICAgIGlmIChtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMuZ2V0TigpID4gMCkgeyAvLyB3ZSBoYXZlIGxhdGVuY3kgaW5mby4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgbmV3UG9zaXRpb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gaW50NjRfdChtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMuZ2V0TWVhbigpICogbVNhbXBsZVJhdGUgKiAxZS0zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgcmV0cm9ncmFkZQorICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9IG1heCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbVN1c3BlbmRlZEZyYW1lcykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgLy8gV2UgYWx3YXlzIGZldGNoIHRoZSB0aW1lc3RhbXAgaGVyZSBiZWNhdXNlIG9mdGVuIHRoZSBkb3duc3RyZWFtCiAgICAgICAgICAgICAgICAgLy8gc2luayB3aWxsIGJsb2NrIHdoaWxlIHdyaXRpbmcuCi0gICAgICAgICAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgdGltZXN0YW1wOyAvLyB1c2UgcHJpdmF0ZSBjb3B5IHRvIGZldGNoCi0gICAgICAgICAgICAgICAgKHZvaWQpIG1Ob3JtYWxTaW5rLT5nZXRUaW1lc3RhbXAodGltZXN0YW1wKTsKIAogICAgICAgICAgICAgICAgIC8vIFdlIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgdmFsaWQga2VybmVsIHBvc2l0aW9uIGluIGNhc2Ugd2UgYXJlIGluIHVuZGVycnVuCiAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBub3JtYWwgbWl4ZXIgcGVyaW9kIGlzIHRoZSBzYW1lIGFzIHRoZSBmYXN0IG1peGVyIHBlcmlvZCwgb3IgdGhlcmUKQEAgLTMyMjgsNyArMzM1OCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKyBtU3VzcGVuZGVkRnJhbWVzOyAvLyBhZGQgZnJhbWVzIGRpc2NhcmRlZCB3aGVuIHN1c3BlbmRlZAogICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9CiAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmVycm9yKCk7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8vIG1GcmFtZXNXcml0dGVuIGZvciBub24tb2ZmbG9hZGVkIHRyYWNrcyBhcmUgY29udGlndW91cwogICAgICAgICAgICAgLy8gZXZlbiBhZnRlciBzdGFuZGJ5KCkgaXMgY2FsbGVkLiBUaGlzIGlzIHVzZWZ1bCBmb3IgdGhlIHRyYWNrIGZyYW1lCiAgICAgICAgICAgICAvLyB0byBzaW5rIGZyYW1lIG1hcHBpbmcuCkBAIC0zMjU2LDEwICszMzg5LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICB0LT51cGRhdGVUcmFja0ZyYW1lSW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVsZWFzZWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gLy8gaWYgKG1UeXBlIC4uLiApIHsgLy8gbm8gaW5kZW50YXRpb24KICNpZiAwCiAgICAgICAgICAgICAvLyBsb2dGb3JtYXQgZXhhbXBsZQogICAgICAgICAgICAgaWYgKHogJSAxMDAgPT0gMCkgewpAQCAtMzMwMCw3ICszNDM1LDcgQEAKIAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCghbUFjdGl2ZVRyYWNrcy5zaXplKCkgJiYgc3lzdGVtVGltZSgpID4gbVN0YW5kYnlUaW1lTnMpIHx8CisgICAgICAgICAgICBpZiAoKG1BY3RpdmVUcmFja3MuaXNFbXB0eSgpICYmIHN5c3RlbVRpbWUoKSA+IG1TdGFuZGJ5VGltZU5zKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1N1c3BlbmRlZCgpKSB7CiAgICAgICAgICAgICAgICAgLy8gcHV0IGF1ZGlvIGhhcmR3YXJlIGludG8gc3RhbmRieSBhZnRlciBzaG9ydCBkZWxheQogICAgICAgICAgICAgICAgIGlmIChzaG91bGRTdGFuZGJ5X2woKSkgewpAQCAtMzMxNCw3ICszNDQ5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgbVN0YW5kYnkgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmICghbUFjdGl2ZVRyYWNrcy5zaXplKCkgJiYgbUNvbmZpZ0V2ZW50cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUFjdGl2ZVRyYWNrcy5pc0VtcHR5KCkgJiYgbUNvbmZpZ0V2ZW50cy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgYWJvdXQgdG8gd2FpdCwgZmx1c2ggdGhlIGJpbmRlciBjb21tYW5kIGJ1ZmZlcgogICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CiAKQEAgLTMzOTUsNyArMzUzMCwxNyBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQoYnVmZmVyLCBmb3JtYXQsIG1NaXhlckJ1ZmZlciwgbU1peGVyQnVmZmVyRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50ICogKG1DaGFubmVsQ291bnQgKyBtSGFwdGljQ2hhbm5lbENvdW50KSk7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBnb2luZyBkaXJlY3RseSB0byB0aGUgc2luayBhbmQgdGhlcmUgYXJlIGhhcHRpYyBjaGFubmVscywKKyAgICAgICAgICAgICAgICAvLyB3ZSBzaG91bGQgYWRqdXN0IGNoYW5uZWxzIGFzIHRoZSBzYW1wbGUgZGF0YSBpcyBwYXJ0aWFsbHkgaW50ZXJsZWF2ZWQKKyAgICAgICAgICAgICAgICAvLyBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgaWYgKCFtRWZmZWN0QnVmZmVyVmFsaWQgJiYgbUhhcHRpY0NoYW5uZWxDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYWRqdXN0X2NoYW5uZWxzX25vbl9kZXN0cnVjdGl2ZShidWZmZXIsIG1DaGFubmVsQ291bnQsIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbENvdW50ICsgbUhhcHRpY0NoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKG1DaGFubmVsQ291bnQsIGZvcm1hdCkgKiBtTm9ybWFsRnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtQnl0ZXNSZW1haW5pbmcgPSBtQ3VycmVudFdyaXRlTGVuZ3RoOwpAQCAtMzQzOSw3ICszNTg0LDE1IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQobVNpbmtCdWZmZXIsIG1Gb3JtYXQsIG1FZmZlY3RCdWZmZXIsIG1FZmZlY3RCdWZmZXJGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50ICogKG1DaGFubmVsQ291bnQgKyBtSGFwdGljQ2hhbm5lbENvdW50KSk7CisgICAgICAgICAgICAvLyBUaGUgc2FtcGxlIGRhdGEgaXMgcGFydGlhbGx5IGludGVybGVhdmVkIHdoZW4gaGFwdGljIGNoYW5uZWxzIGV4aXN0LAorICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBhZGp1c3QgY2hhbm5lbHMgaGVyZS4KKyAgICAgICAgICAgIGlmIChtSGFwdGljQ2hhbm5lbENvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIGFkanVzdF9jaGFubmVsc19ub25fZGVzdHJ1Y3RpdmUobVNpbmtCdWZmZXIsIG1DaGFubmVsQ291bnQsIG1TaW5rQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudCArIG1IYXB0aWNDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1Gb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKG1DaGFubmVsQ291bnQsIG1Gb3JtYXQpICogbU5vcm1hbEZyYW1lQ291bnQpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gZW5hYmxlIGNoYW5nZXMgaW4gZWZmZWN0IGNoYWluCkBAIC0zNjA1LDI0ICszNzU4LDQxIEBACiAvLyByZW1vdmVUcmFja3NfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpyZW1vdmVUcmFja3NfbChjb25zdCBWZWN0b3I8IHNwPFRyYWNrPiA+JiB0cmFja3NUb1JlbW92ZSkKIHsKLSAgICBzaXplX3QgY291bnQgPSB0cmFja3NUb1JlbW92ZS5zaXplKCk7Ci0gICAgaWYgKGNvdW50ID4gMCkgewotICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7Ci0gICAgICAgICAgICBjb25zdCBzcDxUcmFjaz4mIHRyYWNrID0gdHJhY2tzVG9SZW1vdmUuaXRlbUF0KGkpOwotICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy5yZW1vdmUodHJhY2spOwotICAgICAgICAgICAgQUxPR1YoInJlbW92ZVRyYWNrc19sIHJlbW92aW5nIHRyYWNrIG9uIHNlc3Npb24gJWQiLCB0cmFjay0+c2Vzc2lvbklkKCkpOwotICAgICAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbCh0cmFjay0+c2Vzc2lvbklkKCkpOwotICAgICAgICAgICAgaWYgKGNoYWluICE9IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVigic3RvcHBpbmcgdHJhY2sgb24gY2hhaW4gJXAgZm9yIHNlc3Npb24gSWQ6ICVkIiwgY2hhaW4uZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+c2Vzc2lvbklkKCkpOwotICAgICAgICAgICAgICAgIGNoYWluLT5kZWNBY3RpdmVUcmFja0NudCgpOwotICAgICAgICAgICAgfQorICAgIGJvb2wgZW5hYmxlZEhhcHRpY1RyYWNrc1JlbW92ZWQgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHRyYWNrIDogdHJhY2tzVG9SZW1vdmUpIHsKKyAgICAgICAgbUFjdGl2ZVRyYWNrcy5yZW1vdmUodHJhY2spOworICAgICAgICBBTE9HVigiJXMoJWQpOiByZW1vdmluZyB0cmFjayBvbiBzZXNzaW9uICVkIiwgX19mdW5jX18sIHRyYWNrLT5pZCgpLCB0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgIGlmIChjaGFpbiAhPSAwKSB7CisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBzdG9wcGluZyB0cmFjayBvbiBjaGFpbiAlcCBmb3Igc2Vzc2lvbiBJZDogJWQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdHJhY2stPmlkKCksIGNoYWluLmdldCgpLCB0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgY2hhaW4tPmRlY0FjdGl2ZVRyYWNrQ250KCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gSWYgYW4gZXh0ZXJuYWwgY2xpZW50IHRyYWNrLCBpbmZvcm0gQVBNIHdlJ3JlIG5vIGxvbmdlciBhY3RpdmUsIGFuZCByZW1vdmUgaWYgbmVlZGVkLgorICAgICAgICAvLyBXZSBkbyB0aGlzIHVuZGVyIGxvY2sgc28gdGhhdCB0aGUgc3RhdGUgaXMgY29uc2lzdGVudCBpZiB0aGUgVHJhY2sgaXMgZGVzdHJveWVkLgorICAgICAgICBpZiAodHJhY2stPmlzRXh0ZXJuYWxUcmFjaygpKSB7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dCh0cmFjay0+cG9ydElkKCkpOwogICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJlbW92ZVRyYWNrX2wodHJhY2spOworICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KHRyYWNrLT5wb3J0SWQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSkgeworICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gb3VyIHRyYWNrcyB2ZWN0b3IKKyAgICAgICAgICAgIHJlbW92ZVRyYWNrX2wodHJhY2spOworICAgICAgICB9CisgICAgICAgIGVuYWJsZWRIYXB0aWNUcmFja3NSZW1vdmVkIHw9IHRyYWNrLT5nZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQoKTsKKyAgICB9CisgICAgLy8gSWYgdGhlIHRocmVhZCBzdXBwb3J0cyBoYXB0aWMgcGxheWJhY2sgYW5kIHRoZSB0cmFjayBwbGF5aW5nIGhhcHRpYyBkYXRhIHdhcyByZW1vdmVkLAorICAgIC8vIGVuYWJsZSBoYXB0aWMgcGxheWJhY2sgb24gdGhlIGZpcnN0IGFjdGl2ZSB0cmFjayB0aGF0IGNvbnRhaW5zIGhhcHRpYyBjaGFubmVscy4KKyAgICAvLyBUT0RPOiBRdWVyeSB2aWJyYXRvciBzZXJ2aWNlIHRvIGtub3cgd2hpY2ggdHJhY2sgc2hvdWxkIGVuYWJsZSBoYXB0aWMgcGxheWJhY2suCisgICAgaWYgKGVuYWJsZWRIYXB0aWNUcmFja3NSZW1vdmVkICYmIG1IYXB0aWNDaGFubmVsTWFzayAhPSBBVURJT19DSEFOTkVMX05PTkUpIHsKKyAgICAgICAgZm9yIChhdXRvICZ0IDogbUFjdGl2ZVRyYWNrcykgeworICAgICAgICAgICAgaWYgKHQtPmNoYW5uZWxNYXNrKCkgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpIHsKKyAgICAgICAgICAgICAgICB0LT5zZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0KIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Z2V0VGltZXN0YW1wX2woQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkKQEAgLTM2MzksNiArMzgwOSwxNSBAQAogICAgICAgICB1aW50NjRfdCBwb3NpdGlvbjY0OwogICAgICAgICBpZiAobU91dHB1dC0+Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24oJnBvc2l0aW9uNjQsICZ0aW1lc3RhbXAubVRpbWUpID09IE9LKSB7CiAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uID0gKHVpbnQzMl90KXBvc2l0aW9uNjQ7CisgICAgICAgICAgICBpZiAobURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLmdldE4oKSA+IDApIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBwb3NpdGlvbk9mZnNldCA9CisgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkobURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLmdldE1lYW4oKSAqIG1TYW1wbGVSYXRlICogMWUtMyk7CisgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uT2Zmc2V0ID4gdGltZXN0YW1wLm1Qb3NpdGlvbikgeworICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uIC09IHBvc2l0aW9uT2Zmc2V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogICAgIH0KQEAgLTM3NzcsMTIgKzM5NTYsMTYgQEAKICAgICBkZXN0cm95VHJhY2tfbCh0cmFjayk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Z2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKIHsKLSAgICBUaHJlYWRCYXNlOjpnZXRBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKKyAgICBUaHJlYWRCYXNlOjp0b0F1ZGlvUG9ydENvbmZpZyhjb25maWcpOwogICAgIGNvbmZpZy0+cm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7CiAgICAgY29uZmlnLT5leHQubWl4Lmh3X21vZHVsZSA9IG1PdXRwdXQtPmF1ZGlvSHdEZXYtPmhhbmRsZSgpOwogICAgIGNvbmZpZy0+ZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOworICAgIGlmIChtT3V0cHV0ICYmIG1PdXRwdXQtPmZsYWdzICE9IEFVRElPX09VVFBVVF9GTEFHX05PTkUpIHsKKyAgICAgICAgY29uZmlnLT5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICAgICAgY29uZmlnLT5mbGFncy5vdXRwdXQgPSBtT3V0cHV0LT5mbGFnczsKKyAgICB9CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTM4MTQsNyArMzk5Nyw4IEBACiAgICAgLy8gY3JlYXRlIGFuIE5CQUlPIHNpbmsgZm9yIHRoZSBIQUwgb3V0cHV0IHN0cmVhbSwgYW5kIG5lZ290aWF0ZQogICAgIG1PdXRwdXRTaW5rID0gbmV3IEF1ZGlvU3RyZWFtT3V0U2luayhvdXRwdXQtPnN0cmVhbSk7CiAgICAgc2l6ZV90IG51bUNvdW50ZXJPZmZlcnMgPSAwOwotICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbMV0gPSB7Rm9ybWF0X2Zyb21fU1JfQyhtU2FtcGxlUmF0ZSwgbUNoYW5uZWxDb3VudCwgbUZvcm1hdCl9OworICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbMV0gPSB7Rm9ybWF0X2Zyb21fU1JfQygKKyAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtQ2hhbm5lbENvdW50ICsgbUhhcHRpY0NoYW5uZWxDb3VudCwgbUZvcm1hdCl9OwogI2lmICFMT0dfTkRFQlVHCiAgICAgc3NpemVfdCBpbmRleCA9CiAjZWxzZQpAQCAtMzg1NiwxNiArNDA0MCwxNCBAQAogICAgICAgICAgICAgLy8gY2hhbmdlIG91ciBTaW5rIGZvcm1hdCB0byBhY2NlcHQgb3VyIGludGVybWVkaWF0ZSBwcmVjaXNpb24KICAgICAgICAgICAgIG1Gb3JtYXQgPSBmYXN0TWl4ZXJGb3JtYXQ7CiAgICAgICAgICAgICBmcmVlKG1TaW5rQnVmZmVyKTsKLSAgICAgICAgICAgIG1GcmFtZVNpemUgPSBtQ2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtRm9ybWF0KTsKKyAgICAgICAgICAgIG1GcmFtZVNpemUgPSBhdWRpb19ieXRlc19wZXJfZnJhbWUobUNoYW5uZWxDb3VudCArIG1IYXB0aWNDaGFubmVsQ291bnQsIG1Gb3JtYXQpOwogICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHNpbmtCdWZmZXJTaXplID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtRnJhbWVTaXplOwogICAgICAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1TaW5rQnVmZmVyLCAzMiwgc2lua0J1ZmZlclNpemUpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gY3JlYXRlIGEgTW9ub1BpcGUgdG8gY29ubmVjdCBvdXIgc3VibWl4IHRvIEZhc3RNaXhlcgogICAgICAgICBOQkFJT19Gb3JtYXQgZm9ybWF0ID0gbU91dHB1dFNpbmstPmZvcm1hdCgpOwotI2lmZGVmIFRFRV9TSU5LCi0gICAgICAgIE5CQUlPX0Zvcm1hdCBvcmlnZm9ybWF0ID0gZm9ybWF0OwotI2VuZGlmCisKICAgICAgICAgLy8gYWRqdXN0IGZvcm1hdCB0byBtYXRjaCB0aGF0IG9mIHRoZSBGYXN0IE1peGVyCiAgICAgICAgIEFMT0dWKCJmb3JtYXQgY2hhbmdlZCBmcm9tICUjeCB0byAlI3giLCBmb3JtYXQubUZvcm1hdCwgZmFzdE1peGVyRm9ybWF0KTsKICAgICAgICAgZm9ybWF0Lm1Gb3JtYXQgPSBmYXN0TWl4ZXJGb3JtYXQ7CkBAIC0zODc3LDcgKzQwNTksNyBAQAogICAgICAgICBNb25vUGlwZSAqbW9ub1BpcGUgPSBuZXcgTW9ub1BpcGUobU5vcm1hbEZyYW1lQ291bnQgKiA0LCBmb3JtYXQsIHRydWUgLyp3cml0ZUNhbkJsb2NrKi8pOwogICAgICAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzWzFdID0ge2Zvcm1hdH07CiAgICAgICAgIHNpemVfdCBudW1Db3VudGVyT2ZmZXJzID0gMDsKLSNpZiAhTE9HX05ERUJVRyB8fCBkZWZpbmVkKFRFRV9TSU5LKQorI2lmICFMT0dfTkRFQlVHCiAgICAgICAgIHNzaXplX3QgaW5kZXggPQogI2Vsc2UKICAgICAgICAgKHZvaWQpCkBAIC0zODg4LDI1ICs0MDcwLDggQEAKICAgICAgICAgICAgICAgICAobW9ub1BpcGUtPm1heEZyYW1lcygpICogNykgLyA4IDogbU5vcm1hbEZyYW1lQ291bnQgKiAyKTsKICAgICAgICAgbVBpcGVTaW5rID0gbW9ub1BpcGU7CiAKLSNpZmRlZiBURUVfU0lOSwotICAgICAgICBpZiAobVRlZVNpbmtPdXRwdXRFbmFibGVkKSB7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgYSBQaXBlIHRvIGFyY2hpdmUgYSBjb3B5IG9mIEZhc3RNaXhlcidzIG91dHB1dCBmb3IgZHVtcHN5cwotICAgICAgICAgICAgUGlwZSAqdGVlU2luayA9IG5ldyBQaXBlKG1UZWVTaW5rT3V0cHV0RnJhbWVzLCBvcmlnZm9ybWF0KTsKLSAgICAgICAgICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnMyWzFdID0ge29yaWdmb3JtYXR9OwotICAgICAgICAgICAgbnVtQ291bnRlck9mZmVycyA9IDA7Ci0gICAgICAgICAgICBpbmRleCA9IHRlZVNpbmstPm5lZ290aWF0ZShvZmZlcnMyLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKGluZGV4ID09IDApOwotICAgICAgICAgICAgbVRlZVNpbmsgPSB0ZWVTaW5rOwotICAgICAgICAgICAgUGlwZVJlYWRlciAqdGVlU291cmNlID0gbmV3IFBpcGVSZWFkZXIoKnRlZVNpbmspOwotICAgICAgICAgICAgbnVtQ291bnRlck9mZmVycyA9IDA7Ci0gICAgICAgICAgICBpbmRleCA9IHRlZVNvdXJjZS0+bmVnb3RpYXRlKG9mZmVyczIsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOwotICAgICAgICAgICAgQUxPR19BU1NFUlQoaW5kZXggPT0gMCk7Ci0gICAgICAgICAgICBtVGVlU291cmNlID0gdGVlU291cmNlOwotICAgICAgICB9Ci0jZW5kaWYKLQogICAgICAgICAvLyBjcmVhdGUgZmFzdCBtaXhlciBhbmQgY29uZmlndXJlIGl0IGluaXRpYWxseSB3aXRoIGp1c3Qgb25lIGZhc3QgdHJhY2sgZm9yIG91ciBzdWJtaXgKLSAgICAgICAgbUZhc3RNaXhlciA9IG5ldyBGYXN0TWl4ZXIoKTsKKyAgICAgICAgbUZhc3RNaXhlciA9IG5ldyBGYXN0TWl4ZXIobUlkKTsKICAgICAgICAgRmFzdE1peGVyU3RhdGVRdWV1ZSAqc3EgPSBtRmFzdE1peGVyLT5zcSgpOwogI2lmZGVmIFNUQVRFX1FVRVVFX0RVTVAKICAgICAgICAgc3EtPnNldE9ic2VydmVyRHVtcCgmbVN0YXRlUXVldWVPYnNlcnZlckR1bXApOwpAQCAtMzkxNyw4ICs0MDgyLDEwIEBACiAgICAgICAgIC8vIHdyYXAgdGhlIHNvdXJjZSBzaWRlIG9mIHRoZSBNb25vUGlwZSB0byBtYWtlIGl0IGFuIEF1ZGlvQnVmZmVyUHJvdmlkZXIKICAgICAgICAgZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXIgPSBuZXcgU291cmNlQXVkaW9CdWZmZXJQcm92aWRlcihuZXcgTW9ub1BpcGVSZWFkZXIobW9ub1BpcGUpKTsKICAgICAgICAgZmFzdFRyYWNrLT5tVm9sdW1lUHJvdmlkZXIgPSBOVUxMOwotICAgICAgICBmYXN0VHJhY2stPm1DaGFubmVsTWFzayA9IG1DaGFubmVsTWFzazsgLy8gbVBpcGVTaW5rIGNoYW5uZWwgbWFzayBmb3IgYXVkaW8gdG8gRmFzdE1peGVyCisgICAgICAgIGZhc3RUcmFjay0+bUNoYW5uZWxNYXNrID0gbUNoYW5uZWxNYXNrIHwgbUhhcHRpY0NoYW5uZWxNYXNrOyAvLyBtUGlwZVNpbmsgY2hhbm5lbCBtYXNrIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXVkaW8gdG8gRmFzdE1peGVyCiAgICAgICAgIGZhc3RUcmFjay0+bUZvcm1hdCA9IG1Gb3JtYXQ7IC8vIG1QaXBlU2luayBmb3JtYXQgZm9yIGF1ZGlvIHRvIEZhc3RNaXhlcgorICAgICAgICBmYXN0VHJhY2stPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQgPSBtSGFwdGljQ2hhbm5lbE1hc2sgIT0gQVVESU9fQ0hBTk5FTF9OT05FOwogICAgICAgICBmYXN0VHJhY2stPm1HZW5lcmF0aW9uKys7CiAgICAgICAgIHN0YXRlLT5tRmFzdFRyYWNrc0dlbisrOwogICAgICAgICBzdGF0ZS0+bVRyYWNrTWFzayA9IDE7CkBAIC0zOTI2LDI0ICs0MDkzLDMwIEBACiAgICAgICAgIHN0YXRlLT5tT3V0cHV0U2luayA9IG1PdXRwdXRTaW5rLmdldCgpOwogICAgICAgICBzdGF0ZS0+bU91dHB1dFNpbmtHZW4rKzsKICAgICAgICAgc3RhdGUtPm1GcmFtZUNvdW50ID0gbUZyYW1lQ291bnQ7CisgICAgICAgIC8vIHNwZWNpZnkgc2luayBjaGFubmVsIG1hc2sgd2hlbiBoYXB0aWMgY2hhbm5lbCBtYXNrIHByZXNlbnQgYXMgaXQgY2FuIG5vdAorICAgICAgICAvLyBiZSBjYWxjdWxhdGVkIGRpcmVjdGx5IGZyb20gY2hhbm5lbCBjb3VudAorICAgICAgICBzdGF0ZS0+bVNpbmtDaGFubmVsTWFzayA9IG1IYXB0aWNDaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX05PTkUKKyAgICAgICAgICAgICAgICA/IEFVRElPX0NIQU5ORUxfTk9ORSA6IG1DaGFubmVsTWFzayB8IG1IYXB0aWNDaGFubmVsTWFzazsKICAgICAgICAgc3RhdGUtPm1Db21tYW5kID0gRmFzdE1peGVyU3RhdGU6OkNPTERfSURMRTsKICAgICAgICAgLy8gYWxyZWFkeSBkb25lIGluIGNvbnN0cnVjdG9yIGluaXRpYWxpemF0aW9uIGxpc3QKICAgICAgICAgLy9tRmFzdE1peGVyRnV0ZXggPSAwOwogICAgICAgICBzdGF0ZS0+bUNvbGRGdXRleEFkZHIgPSAmbUZhc3RNaXhlckZ1dGV4OwogICAgICAgICBzdGF0ZS0+bUNvbGRHZW4rKzsKICAgICAgICAgc3RhdGUtPm1EdW1wU3RhdGUgPSAmbUZhc3RNaXhlckR1bXBTdGF0ZTsKLSNpZmRlZiBURUVfU0lOSwotICAgICAgICBzdGF0ZS0+bVRlZVNpbmsgPSBtVGVlU2luay5nZXQoKTsKLSNlbmRpZgogICAgICAgICBtRmFzdE1peGVyTkJMb2dXcml0ZXIgPSBhdWRpb0ZsaW5nZXItPm5ld1dyaXRlcl9sKGtGYXN0TWl4ZXJMb2dTaXplLCAiRmFzdE1peGVyIik7CiAgICAgICAgIHN0YXRlLT5tTkJMb2dXcml0ZXIgPSBtRmFzdE1peGVyTkJMb2dXcml0ZXIuZ2V0KCk7CiAgICAgICAgIHNxLT5lbmQoKTsKICAgICAgICAgc3EtPnB1c2goRmFzdE1peGVyU3RhdGVRdWV1ZTo6QkxPQ0tfVU5USUxfUFVTSEVEKTsKIAorICAgICAgICBOQkxvZzo6dGhyZWFkX2luZm9fdCBpbmZvOworICAgICAgICBpbmZvLmlkID0gbUlkOworICAgICAgICBpbmZvLnR5cGUgPSBOQkxvZzo6RkFTVE1JWEVSOworICAgICAgICBtRmFzdE1peGVyTkJMb2dXcml0ZXItPmxvZzxOQkxvZzo6RVZFTlRfVEhSRUFEX0lORk8+KGluZm8pOworCiAgICAgICAgIC8vIHN0YXJ0IHRoZSBmYXN0IG1peGVyCiAgICAgICAgIG1GYXN0TWl4ZXItPnJ1bigiRmFzdE1peGVyIiwgUFJJT1JJVFlfVVJHRU5UX0FVRElPKTsKICAgICAgICAgcGlkX3QgdGlkID0gbUZhc3RNaXhlci0+Z2V0VGlkKCk7Ci0gICAgICAgIHNlbmRQcmlvQ29uZmlnRXZlbnQoZ2V0cGlkX2NhY2hlZCwgdGlkLCBrUHJpb3JpdHlGYXN0TWl4ZXIsIGZhbHNlIC8qZm9yQXBwKi8pOworICAgICAgICBzZW5kUHJpb0NvbmZpZ0V2ZW50KGdldHBpZCgpLCB0aWQsIGtQcmlvcml0eUZhc3RNaXhlciwgZmFsc2UgLypmb3JBcHAqLyk7CiAgICAgICAgIHN0cmVhbSgpLT5zZXRIYWxUaHJlYWRQcmlvcml0eShrUHJpb3JpdHlGYXN0TWl4ZXIpOwogCiAjaWZkZWYgQVVESU9fV0FUQ0hET0cKQEAgLTM5NTIsOSArNDEyNSwxNCBAQAogICAgICAgICBtQXVkaW9XYXRjaGRvZy0+c2V0RHVtcCgmbUF1ZGlvV2F0Y2hkb2dEdW1wKTsKICAgICAgICAgbUF1ZGlvV2F0Y2hkb2ctPnJ1bigiQXVkaW9XYXRjaGRvZyIsIFBSSU9SSVRZX1VSR0VOVF9BVURJTyk7CiAgICAgICAgIHRpZCA9IG1BdWRpb1dhdGNoZG9nLT5nZXRUaWQoKTsKLSAgICAgICAgc2VuZFByaW9Db25maWdFdmVudChnZXRwaWRfY2FjaGVkLCB0aWQsIGtQcmlvcml0eUZhc3RNaXhlciwgZmFsc2UgLypmb3JBcHAqLyk7CisgICAgICAgIHNlbmRQcmlvQ29uZmlnRXZlbnQoZ2V0cGlkKCksIHRpZCwga1ByaW9yaXR5RmFzdE1peGVyLCBmYWxzZSAvKmZvckFwcCovKTsKICNlbmRpZgotCisgICAgfSBlbHNlIHsKKyNpZmRlZiBURUVfU0lOSworICAgICAgICAvLyBPbmx5IHVzZSB0aGUgTWl4ZXJUaHJlYWQgdGVlIGlmIHRoZXJlIGlzIG5vIEZhc3RNaXhlci4KKyAgICAgICAgbVRlZS5zZXQobU91dHB1dFNpbmstPmZvcm1hdCgpLCBOQkFJT19UZWU6OlRFRV9GTEFHX09VVFBVVF9USFJFQUQpOworICAgICAgICBtVGVlLnNldElkKHN0ZDo6c3RyaW5nKCJfIikgKyBzdGQ6OnRvX3N0cmluZyhtSWQpICsgIl9NIik7CisjZW5kaWYKICAgICB9CiAKICAgICBzd2l0Y2ggKGtVc2VGYXN0TWl4ZXIpIHsKQEAgLTQwMTgsMTIgKzQxOTYsNiBAQAogICAgIHJldHVybiBsYXRlbmN5OwogfQogCi0KLXZvaWQgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6dGhyZWFkTG9vcF9yZW1vdmVUcmFja3MoY29uc3QgVmVjdG9yPCBzcDxUcmFjaz4gPiYgdHJhY2tzVG9SZW1vdmUpCi17Ci0gICAgUGxheWJhY2tUaHJlYWQ6OnRocmVhZExvb3BfcmVtb3ZlVHJhY2tzKHRyYWNrc1RvUmVtb3ZlKTsKLX0KLQogc3NpemVfdCBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjp0aHJlYWRMb29wX3dyaXRlKCkKIHsKICAgICAvLyBGSVhNRSB3ZSBzaG91bGQgb25seSBkbyBvbmUgcHVzaCBwZXIgY3ljbGU7IGNvbmZpcm0gdGhpcyBpcyB0cnVlCkBAIC00MjIyLDE0ICs0Mzk0LDE0IEBACiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjptaXhlcl9zdGF0ZSBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjpwcmVwYXJlVHJhY2tzX2woCiAgICAgICAgIFZlY3Rvcjwgc3A8VHJhY2s+ID4gKnRyYWNrc1RvUmVtb3ZlKQogewotICAgIC8vIGNsZWFuIHVwIGRlbGV0ZWQgdHJhY2sgbmFtZXMgaW4gQXVkaW9NaXhlciBiZWZvcmUgYWxsb2NhdGluZyBuZXcgdHJhY2tzCi0gICAgKHZvaWQpbVRyYWNrcy5wcm9jZXNzRGVsZXRlZFRyYWNrTmFtZXMoW3RoaXNdKGludCBuYW1lKSB7Ci0gICAgICAgIC8vIGZvciBlYWNoIG5hbWUsIGRlc3Ryb3kgaXQgaW4gdGhlIEF1ZGlvTWl4ZXIKLSAgICAgICAgaWYgKG1BdWRpb01peGVyLT5leGlzdHMobmFtZSkpIHsKLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5kZXN0cm95KG5hbWUpOworICAgIC8vIGNsZWFuIHVwIGRlbGV0ZWQgdHJhY2sgaWRzIGluIEF1ZGlvTWl4ZXIgYmVmb3JlIGFsbG9jYXRpbmcgbmV3IHRyYWNrcworICAgICh2b2lkKW1UcmFja3MucHJvY2Vzc0RlbGV0ZWRUcmFja0lkcyhbdGhpc10oaW50IHRyYWNrSWQpIHsKKyAgICAgICAgLy8gZm9yIGVhY2ggdHJhY2tJZCwgZGVzdHJveSBpdCBpbiB0aGUgQXVkaW9NaXhlcgorICAgICAgICBpZiAobUF1ZGlvTWl4ZXItPmV4aXN0cyh0cmFja0lkKSkgeworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPmRlc3Ryb3kodHJhY2tJZCk7CiAgICAgICAgIH0KICAgICB9KTsKLSAgICBtVHJhY2tzLmNsZWFyRGVsZXRlZFRyYWNrTmFtZXMoKTsKKyAgICBtVHJhY2tzLmNsZWFyRGVsZXRlZFRyYWNrSWRzKCk7CiAKICAgICBtaXhlcl9zdGF0ZSBtaXhlclN0YXR1cyA9IE1JWEVSX0lETEU7CiAgICAgLy8gZmluZCBvdXQgd2hpY2ggdHJhY2tzIG5lZWQgdG8gYmUgcHJvY2Vzc2VkCkBAIC00MjcwLDYgKzQ0NDIsMzggQEAKICAgICBtTWl4ZXJCdWZmZXJWYWxpZCA9IGZhbHNlOyAgLy8gbU1peGVyQnVmZmVyIGhhcyBubyB2YWxpZCBkYXRhIHVudGlsIGFwcHJvcHJpYXRlIHRyYWNrcyBmb3VuZC4KICAgICBtRWZmZWN0QnVmZmVyVmFsaWQgPSBmYWxzZTsgLy8gbUVmZmVjdEJ1ZmZlciBoYXMgbm8gdmFsaWQgZGF0YSB1bnRpbCB0cmFja3MgZm91bmQuCiAKKyAgICAvLyBEZWZlcnJlZE9wZXJhdGlvbnMgaGFuZGxlcyBzdGF0aXN0aWNzIGFmdGVyIHNldHRpbmcgbWl4ZXJTdGF0dXMuCisgICAgY2xhc3MgRGVmZXJyZWRPcGVyYXRpb25zIHsKKyAgICBwdWJsaWM6CisgICAgICAgIERlZmVycmVkT3BlcmF0aW9ucyhtaXhlcl9zdGF0ZSAqbWl4ZXJTdGF0dXMpCisgICAgICAgICAgICA6IG1NaXhlclN0YXR1cyhtaXhlclN0YXR1cykgeyB9CisKKyAgICAgICAgLy8gd2hlbiBsZWF2aW5nIHNjb3BlLCB0YWxseSBmcmFtZXMgcHJvcGVybHkuCisgICAgICAgIH5EZWZlcnJlZE9wZXJhdGlvbnMoKSB7CisgICAgICAgICAgICAvLyBUYWxseSB1bmRlcnJ1biBmcmFtZXMgb25seSBpZiB3ZSBhcmUgYWN0dWFsbHkgbWl4aW5nIChNSVhFUl9UUkFDS1NfUkVBRFkpCisgICAgICAgICAgICAvLyBiZWNhdXNlIHRoYXQgaXMgd2hlbiB0aGUgdW5kZXJydW4gb2NjdXJzLgorICAgICAgICAgICAgLy8gV2UgZG8gbm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gRmFzdFRyYWNrcyBhbmQgTm9ybWFsVHJhY2tzIGhlcmUuCisgICAgICAgICAgICBpZiAoKm1NaXhlclN0YXR1cyA9PSBNSVhFUl9UUkFDS1NfUkVBRFkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnVuZGVycnVuIDogbVVuZGVycnVuRnJhbWVzKSB7CisgICAgICAgICAgICAgICAgICAgIHVuZGVycnVuLmZpcnN0LT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT50YWxseVVuZGVycnVuRnJhbWVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVycnVuLnNlY29uZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gdGFsbHlVbmRlcnJ1bkZyYW1lcygpIGlzIGNhbGxlZCB0byB1cGRhdGUgdGhlIHRyYWNrIGNvdW50ZXJzCisgICAgICAgIC8vIHdpdGggdGhlIG51bWJlciBvZiB1bmRlcnJ1biBmcmFtZXMgZm9yIGEgcGFydGljdWxhciBtaXhlciBwZXJpb2QuCisgICAgICAgIC8vIFdlIGRlZmVyIHRhbGx5aW5nIHVudGlsIHdlIGtub3cgdGhlIGZpbmFsIG1peGVyIHN0YXR1cy4KKyAgICAgICAgdm9pZCB0YWxseVVuZGVycnVuRnJhbWVzKHNwPFRyYWNrPiB0cmFjaywgc2l6ZV90IHVuZGVycnVuRnJhbWVzKSB7CisgICAgICAgICAgICBtVW5kZXJydW5GcmFtZXMuZW1wbGFjZV9iYWNrKHRyYWNrLCB1bmRlcnJ1bkZyYW1lcyk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IG1peGVyX3N0YXRlICogY29uc3QgbU1peGVyU3RhdHVzOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3A8VHJhY2s+LCBzaXplX3Q+PiBtVW5kZXJydW5GcmFtZXM7CisgICAgfSBkZWZlcnJlZE9wZXJhdGlvbnMoJm1peGVyU3RhdHVzKTsgLy8gaW1wbGljaXQgbmVzdGVkIHNjb3BlIGZvciB2YXJpYWJsZSBjYXB0dXJlCisKKyAgICBib29sIG5vRmFzdEhhcHRpY1RyYWNrID0gdHJ1ZTsKICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHNwPFRyYWNrPiB0ID0gbUFjdGl2ZVRyYWNrc1tpXTsKIApAQCAtNDI3OCw2ICs0NDgyLDkgQEAKIAogICAgICAgICAvLyBwcm9jZXNzIGZhc3QgdHJhY2tzCiAgICAgICAgIGlmICh0cmFjay0+aXNGYXN0VHJhY2soKSkgeworICAgICAgICAgICAgaWYgKHRyYWNrLT5nZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIG5vRmFzdEhhcHRpY1RyYWNrID0gZmFsc2U7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIEl0J3MgdGhlb3JldGljYWxseSBwb3NzaWJsZSAodGhvdWdoIHVubGlrZWx5KSBmb3IgYSBmYXN0IHRyYWNrIHRvIGJlIGNyZWF0ZWQKICAgICAgICAgICAgIC8vIGFuZCB0aGVuIHJlbW92ZWQgd2l0aGluIHRoZSBzYW1lIG5vcm1hbCBtaXggY3ljbGUuICBUaGlzIGlzIG5vdCBhIHByb2JsZW0sIGFzCkBAIC00MzA0LDEzICs0NTExLDE0IEBACiAgICAgICAgICAgICB0cmFjay0+bU9ic2VydmVkVW5kZXJydW5zID0gdW5kZXJydW5zOwogICAgICAgICAgICAgLy8gZG9uJ3QgY291bnQgdW5kZXJydW5zIHRoYXQgb2NjdXIgd2hpbGUgc3RvcHBpbmcgb3IgcGF1c2luZwogICAgICAgICAgICAgLy8gb3Igc3RvcHBlZCB3aGljaCBjYW4gb2NjdXIgd2hlbiBmbHVzaCgpIGlzIGNhbGxlZCB3aGlsZSBhY3RpdmUKKyAgICAgICAgICAgIHNpemVfdCB1bmRlcnJ1bkZyYW1lcyA9IDA7CiAgICAgICAgICAgICBpZiAoISh0cmFjay0+aXNTdG9wcGluZygpIHx8IHRyYWNrLT5pc1BhdXNpbmcoKSB8fCB0cmFjay0+aXNTdG9wcGVkKCkpICYmCiAgICAgICAgICAgICAgICAgICAgIHJlY2VudFVuZGVycnVucyA+IDApIHsKICAgICAgICAgICAgICAgICAvLyBGSVhNRSBmYXN0IG1peGVyIHdpbGwgcHVsbCAmIG1peCBwYXJ0aWFsIGJ1ZmZlcnMsIGJ1dCB3ZSBjb3VudCBhcyBhIGZ1bGwgdW5kZXJydW4KLSAgICAgICAgICAgICAgICB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcyhyZWNlbnRVbmRlcnJ1bnMgKiBtRnJhbWVDb3VudCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT50YWxseVVuZGVycnVuRnJhbWVzKDApOworICAgICAgICAgICAgICAgIHVuZGVycnVuRnJhbWVzID0gcmVjZW50VW5kZXJydW5zICogbUZyYW1lQ291bnQ7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJbW1lZGlhdGVseSBhY2NvdW50IGZvciBGYXN0VHJhY2sgdW5kZXJydW5zLgorICAgICAgICAgICAgdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPnRhbGx5VW5kZXJydW5GcmFtZXModW5kZXJydW5GcmFtZXMpOwogCiAgICAgICAgICAgICAvLyBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIHN0YXRlIG1hY2hpbmUgZm9yIG5vcm1hbCB0cmFja3MsCiAgICAgICAgICAgICAvLyB3aXRoIGEgZmV3IG1vZGlmaWNhdGlvbnMgZm9yIGZhc3QgdHJhY2tzLgpAQCAtNDQwMiw2ICs0NjEwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tVm9sdW1lUHJvdmlkZXIgPSB2cDsKICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2sgPSB0cmFjay0+bUNoYW5uZWxNYXNrOwogICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1Gb3JtYXQgPSB0cmFjay0+bUZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkID0gdHJhY2stPmdldEhhcHRpY1BsYXliYWNrRW5hYmxlZCgpOwogICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1HZW5lcmF0aW9uKys7CiAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tVHJhY2tNYXNrIHw9IDEgPDwgajsKICAgICAgICAgICAgICAgICAgICAgZGlkTW9kaWZ5ID0gdHJ1ZTsKQEAgLTQ0NDcsNiArNDY1NiwxMCBAQAogICAgICAgICAgICAgICAgIC8vIEF2b2lkcyBhIG1pc2xlYWRpbmcgZGlzcGxheSBpbiBkdW1wc3lzCiAgICAgICAgICAgICAgICAgdHJhY2stPm1PYnNlcnZlZFVuZGVycnVucy5tQml0RmllbGRzLm1Nb3N0UmVjZW50ID0gVU5ERVJSVU5fRlVMTDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmYXN0VHJhY2stPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQgIT0gdHJhY2stPmdldEhhcHRpY1BsYXliYWNrRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkID0gdHJhY2stPmdldEhhcHRpY1BsYXliYWNrRW5hYmxlZCgpOworICAgICAgICAgICAgICAgIGRpZE1vZGlmeSA9IHRydWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCkBAIC00NDU2LDE5ICs0NjY5LDIxIEBACiAKICAgICAgICAgLy8gVGhlIGZpcnN0IHRpbWUgYSB0cmFjayBpcyBhZGRlZCB3ZSB3YWl0CiAgICAgICAgIC8vIGZvciBhbGwgaXRzIGJ1ZmZlcnMgdG8gYmUgZmlsbGVkIGJlZm9yZSBwcm9jZXNzaW5nIGl0Ci0gICAgICAgIGludCBuYW1lID0gdHJhY2stPm5hbWUoKTsKKyAgICAgICAgY29uc3QgaW50IHRyYWNrSWQgPSB0cmFjay0+aWQoKTsKIAogICAgICAgICAvLyBpZiBhbiBhY3RpdmUgdHJhY2sgZG9lc24ndCBleGlzdCBpbiB0aGUgQXVkaW9NaXhlciwgY3JlYXRlIGl0LgotICAgICAgICBpZiAoIW1BdWRpb01peGVyLT5leGlzdHMobmFtZSkpIHsKKyAgICAgICAgLy8gdXNlIHRoZSB0cmFja0lkIGFzIHRoZSBBdWRpb01peGVyIG5hbWUuCisgICAgICAgIGlmICghbUF1ZGlvTWl4ZXItPmV4aXN0cyh0cmFja0lkKSkgewogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvTWl4ZXItPmNyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1DaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1Gb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tU2Vzc2lvbklkKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiJXM6IGNhbm5vdCBjcmVhdGUgdHJhY2sgbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgJWQsIG1hc2sgJSN4LCBmb3JtYXQgJSN4LCBzZXNzaW9uSWQgJWQgaW4gQXVkaW9NaXhlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbmFtZSwgdHJhY2stPm1DaGFubmVsTWFzaywgdHJhY2stPm1Gb3JtYXQsIHRyYWNrLT5tU2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoKTogQXVkaW9NaXhlciBjYW5ub3QgY3JlYXRlIHRyYWNrKCVkKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgbWFzayAlI3gsIGZvcm1hdCAlI3gsIHNlc3Npb25JZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdHJhY2tJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tQ2hhbm5lbE1hc2ssIHRyYWNrLT5tRm9ybWF0LCB0cmFjay0+bVNlc3Npb25JZCk7CiAgICAgICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7CiAgICAgICAgICAgICAgICAgdHJhY2stPmludmFsaWRhdGUoKTsgLy8gY29uc2lkZXIgaXQgZGVhZC4KICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTQ0ODksNyArNDcwNCw3IEBACiAgICAgICAgIC8vIFRPRE86IE9OTFkgVVNFRCBGT1IgTEVHQUNZIFJFU0FNUExFUlMsIHJlbW92ZSB3aGVuIHRoZXkgYXJlIHJlbW92ZWQuCiAgICAgICAgIC8vIGFkZCBmcmFtZXMgYWxyZWFkeSBjb25zdW1lZCBidXQgbm90IHlldCByZWxlYXNlZCBieSB0aGUgcmVzYW1wbGVyCiAgICAgICAgIC8vIGJlY2F1c2UgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVhZHkoKSB3aWxsIGluY2x1ZGUgdGhlc2UgZnJhbWVzCi0gICAgICAgIGRlc2lyZWRGcmFtZXMgKz0gbUF1ZGlvTWl4ZXItPmdldFVucmVsZWFzZWRGcmFtZXModHJhY2stPm5hbWUoKSk7CisgICAgICAgIGRlc2lyZWRGcmFtZXMgKz0gbUF1ZGlvTWl4ZXItPmdldFVucmVsZWFzZWRGcmFtZXModHJhY2tJZCk7CiAKICAgICAgICAgdWludDMyX3QgbWluRnJhbWVzID0gMTsKICAgICAgICAgaWYgKCh0cmFjay0+c2hhcmVkQnVmZmVyKCkgPT0gMCkgJiYgIXRyYWNrLT5pc1N0b3BwZWQoKSAmJiAhdHJhY2stPmlzUGF1c2luZygpICYmCkBAIC00NTAxLDEzICs0NzE2LDEzIEBACiAgICAgICAgIGlmIChBVFJBQ0VfRU5BQkxFRCgpKSB7CiAgICAgICAgICAgICAvLyBJIHdpc2ggd2UgaGFkIGZvcm1hdHRlZCB0cmFjZSBuYW1lcwogICAgICAgICAgICAgc3RkOjpzdHJpbmcgdHJhY2VOYW1lKCJuUmR5Iik7Ci0gICAgICAgICAgICB0cmFjZU5hbWUgKz0gc3RkOjp0b19zdHJpbmcodHJhY2stPm5hbWUoKSk7CisgICAgICAgICAgICB0cmFjZU5hbWUgKz0gc3RkOjp0b19zdHJpbmcodHJhY2tJZCk7CiAgICAgICAgICAgICBBVFJBQ0VfSU5UKHRyYWNlTmFtZS5jX3N0cigpLCBmcmFtZXNSZWFkeSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKChmcmFtZXNSZWFkeSA+PSBtaW5GcmFtZXMpICYmIHRyYWNrLT5pc1JlYWR5KCkgJiYKICAgICAgICAgICAgICAgICAhdHJhY2stPmlzUGF1c2VkKCkgJiYgIXRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSkKICAgICAgICAgewotICAgICAgICAgICAgQUxPR1ZWKCJ0cmFjayAlZCBzPSUwOHggW09LXSBvbiB0aHJlYWQgJXAiLCBuYW1lLCBjYmxrLT5tU2VydmVyLCB0aGlzKTsKKyAgICAgICAgICAgIEFMT0dWVigidHJhY2soJWQpIHM9JTA4eCBbT0tdIG9uIHRocmVhZCAlcCIsIHRyYWNrSWQsIGNibGstPm1TZXJ2ZXIsIHRoaXMpOwogCiAgICAgICAgICAgICBtaXhlZFRyYWNrcysrOwogCkBAIC00NTI0LDkgKzQ3MzksOSBAQAogICAgICAgICAgICAgICAgIGlmIChjaGFpbiAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrc1dpdGhFZmZlY3QrKzsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygicHJlcGFyZVRyYWNrc19sKCk6IHRyYWNrICVkIGF0dGFjaGVkIHRvIGVmZmVjdCBidXQgbm8gY2hhaW4gZm91bmQgb24gIgorICAgICAgICAgICAgICAgICAgICBBTE9HVygicHJlcGFyZVRyYWNrc19sKCk6IHRyYWNrKCVkKSBhdHRhY2hlZCB0byBlZmZlY3QgYnV0IG5vIGNoYWluIGZvdW5kIG9uICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2Vzc2lvbiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lkLCB0cmFjay0+c2Vzc2lvbklkKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtNDUzOSw3ICs0NzU0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6QUNUSVZFOwogICAgICAgICAgICAgICAgICAgICBwYXJhbSA9IEF1ZGlvTWl4ZXI6OlJBTVBfVk9MVU1FOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlJFU0FNUExFLCBBdWRpb01peGVyOjpSRVNFVCwgTlVMTCk7CisgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcih0cmFja0lkLCBBdWRpb01peGVyOjpSRVNBTVBMRSwgQXVkaW9NaXhlcjo6UkVTRVQsIE5VTEwpOwogICAgICAgICAgICAgICAgIG1MZWZ0Vm9sRmxvYXQgPSAtMS4wOwogICAgICAgICAgICAgLy8gRklYTUUgc2hvdWxkIG5vdCBtYWtlIGEgZGVjaXNpb24gYmFzZWQgb24gbVNlcnZlcgogICAgICAgICAgICAgfSBlbHNlIGlmIChjYmxrLT5tU2VydmVyICE9IDApIHsKQEAgLTQ2MzUsMjQgKzQ4NTAsMjUgQEAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFhYWDogdGhlc2UgdGhpbmdzIERPTidUIG5lZWQgdG8gYmUgZG9uZSBlYWNoIHRpbWUKLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRCdWZmZXJQcm92aWRlcihuYW1lLCB0cmFjayk7Ci0gICAgICAgICAgICBtQXVkaW9NaXhlci0+ZW5hYmxlKG5hbWUpOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKHRyYWNrSWQsIHRyYWNrKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5lbmFibGUodHJhY2tJZCk7CiAKLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgcGFyYW0sIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsICZ2bGYpOwotICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBwYXJhbSwgQXVkaW9NaXhlcjo6Vk9MVU1FMSwgJnZyZik7Ci0gICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIHBhcmFtLCBBdWRpb01peGVyOjpBVVhMRVZFTCwgJnZhZik7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKHRyYWNrSWQsIHBhcmFtLCBBdWRpb01peGVyOjpWT0xVTUUwLCAmdmxmKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIodHJhY2tJZCwgcGFyYW0sIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICZ2cmYpOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcih0cmFja0lkLCBwYXJhbSwgQXVkaW9NaXhlcjo6QVVYTEVWRUwsICZ2YWYpOwogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6Rk9STUFULCAodm9pZCAqKXRyYWNrLT5mb3JtYXQoKSk7CiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpDSEFOTkVMX01BU0ssICh2b2lkICopKHVpbnRwdHJfdCl0cmFjay0+Y2hhbm5lbE1hc2soKSk7CiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKLSAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9DSEFOTkVMX01BU0ssICh2b2lkICopKHVpbnRwdHJfdCltQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1JWEVSX0NIQU5ORUxfTUFTSywKKyAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpKG1DaGFubmVsTWFzayB8IG1IYXB0aWNDaGFubmVsTWFzaykpOwogICAgICAgICAgICAgLy8gbGltaXQgdHJhY2sgc2FtcGxlIHJhdGUgdG8gMiB4IG91dHB1dCBzYW1wbGUgcmF0ZSwgd2hpY2ggY2hhbmdlcyBhdCByZS1jb25maWd1cmF0aW9uCiAgICAgICAgICAgICB1aW50MzJfdCBtYXhTYW1wbGVSYXRlID0gbVNhbXBsZVJhdGUgKiBBVURJT19SRVNBTVBMRVJfRE9XTl9SQVRJT19NQVg7CiAgICAgICAgICAgICB1aW50MzJfdCByZXFTYW1wbGVSYXRlID0gdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFNhbXBsZVJhdGUoKTsKQEAgLTQ2NjIsMTQgKzQ4NzgsMTQgQEAKICAgICAgICAgICAgICAgICByZXFTYW1wbGVSYXRlID0gbWF4U2FtcGxlUmF0ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlJFU0FNUExFLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlNBTVBMRV9SQVRFLAogICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClyZXFTYW1wbGVSYXRlKTsKIAogICAgICAgICAgICAgQXVkaW9QbGF5YmFja1JhdGUgcGxheWJhY2tSYXRlID0gdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFBsYXliYWNrUmF0ZSgpOwogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VElNRVNUUkVUQ0gsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6UExBWUJBQ0tfUkFURSwKICAgICAgICAgICAgICAgICAmcGxheWJhY2tSYXRlKTsKQEAgLTQ2OTAsMjkgKzQ5MDYsMzMgQEAKICAgICAgICAgICAgICAgICAgICAgJiYgKHRyYWNrLT5tYWluQnVmZmVyKCkgPT0gbVNpbmtCdWZmZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0cmFjay0+bWFpbkJ1ZmZlcigpID09IG1NaXhlckJ1ZmZlcikpIHsKICAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1JWEVSX0ZPUk1BVCwgKHZvaWQgKiltTWl4ZXJCdWZmZXJGb3JtYXQpOwogICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUFJTl9CVUZGRVIsICh2b2lkICopbU1peGVyQnVmZmVyKTsKICAgICAgICAgICAgICAgICAvLyBUT0RPOiBvdmVycmlkZSB0cmFjay0+bWFpbkJ1ZmZlcigpPwogICAgICAgICAgICAgICAgIG1NaXhlckJ1ZmZlclZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9GT1JNQVQsICh2b2lkICopRUZGRUNUX0JVRkZFUl9GT1JNQVQpOwogICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUFJTl9CVUZGRVIsICh2b2lkICopdHJhY2stPm1haW5CdWZmZXIoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpBVVhfQlVGRkVSLCAodm9pZCAqKXRyYWNrLT5hdXhCdWZmZXIoKSk7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIHRyYWNrSWQsCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6SEFQVElDX0VOQUJMRUQsICh2b2lkICopKHVpbnRwdHJfdCl0cmFjay0+Z2V0SGFwdGljUGxheWJhY2tFbmFibGVkKCkpOwogCiAgICAgICAgICAgICAvLyByZXNldCByZXRyeSBjb3VudAogICAgICAgICAgICAgdHJhY2stPm1SZXRyeUNvdW50ID0ga01heFRyYWNrUmV0cmllczsKQEAgLTQ3MjUsMTMgKzQ5NDUsMTMgQEAKICAgICAgICAgICAgICAgICBtaXhlclN0YXR1cyA9IE1JWEVSX1RSQUNLU19SRUFEWTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNpemVfdCB1bmRlcnJ1bkZyYW1lcyA9IDA7CiAgICAgICAgICAgICBpZiAoZnJhbWVzUmVhZHkgPCBkZXNpcmVkRnJhbWVzICYmICF0cmFjay0+aXNTdG9wcGVkKCkgJiYgIXRyYWNrLT5pc1BhdXNlZCgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInRyYWNrKCVwKSB1bmRlcnJ1biwgIGZyYW1lc1JlYWR5KCV6dSkgPCBmcmFtZXNEZXNpcmVkKCV6ZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2ssIGZyYW1lc1JlYWR5LCBkZXNpcmVkRnJhbWVzKTsKLSAgICAgICAgICAgICAgICB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcyhkZXNpcmVkRnJhbWVzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPnRhbGx5VW5kZXJydW5GcmFtZXMoMCk7CisgICAgICAgICAgICAgICAgQUxPR1YoInRyYWNrKCVkKSB1bmRlcnJ1biwgIGZyYW1lc1JlYWR5KCV6dSkgPCBmcmFtZXNEZXNpcmVkKCV6ZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwgZnJhbWVzUmVhZHksIGRlc2lyZWRGcmFtZXMpOworICAgICAgICAgICAgICAgIHVuZGVycnVuRnJhbWVzID0gZGVzaXJlZEZyYW1lczsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmVycmVkT3BlcmF0aW9ucy50YWxseVVuZGVycnVuRnJhbWVzKHRyYWNrLCB1bmRlcnJ1bkZyYW1lcyk7CiAKICAgICAgICAgICAgIC8vIGNsZWFyIGVmZmVjdCBjaGFpbiBpbnB1dCBidWZmZXIgaWYgYW4gYWN0aXZlIHRyYWNrIHVuZGVycnVucyB0byBhdm9pZCBzZW5kaW5nCiAgICAgICAgICAgICAvLyBwcmV2aW91cyBhdWRpbyBidWZmZXIgYWdhaW4gdG8gZWZmZWN0cwpAQCAtNDc0MCw3ICs0OTYwLDcgQEAKICAgICAgICAgICAgICAgICBjaGFpbi0+Y2xlYXJJbnB1dEJ1ZmZlcigpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBBTE9HVlYoInRyYWNrICVkIHM9JTA4eCBbTk9UIFJFQURZXSBvbiB0aHJlYWQgJXAiLCBuYW1lLCBjYmxrLT5tU2VydmVyLCB0aGlzKTsKKyAgICAgICAgICAgIEFMT0dWVigidHJhY2soJWQpIHM9JTA4eCBbTk9UIFJFQURZXSBvbiB0aHJlYWQgJXAiLCB0cmFja0lkLCBjYmxrLT5tU2VydmVyLCB0aGlzKTsKICAgICAgICAgICAgIGlmICgodHJhY2stPnNoYXJlZEJ1ZmZlcigpICE9IDApIHx8IHRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSB8fAogICAgICAgICAgICAgICAgICAgICB0cmFjay0+aXNTdG9wcGVkKCkgfHwgdHJhY2stPmlzUGF1c2VkKCkpIHsKICAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGNvbnN1bWVkIGFsbCB0aGUgYnVmZmVycyBvZiB0aGlzIHRyYWNrLgpAQCAtNDc1OSw3ICs0OTc5LDggQEAKICAgICAgICAgICAgICAgICAvLyBObyBidWZmZXJzIGZvciB0aGlzIHRyYWNrLiBHaXZlIGl0IGEgZmV3IGNoYW5jZXMgdG8KICAgICAgICAgICAgICAgICAvLyBmaWxsIGEgYnVmZmVyLCB0aGVuIHJlbW92ZSBpdCBmcm9tIGFjdGl2ZSBsaXN0LgogICAgICAgICAgICAgICAgIGlmICgtLSh0cmFjay0+bVJldHJ5Q291bnQpIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0koIkJVRkZFUiBUSU1FT1VUOiByZW1vdmUoJWQpIGZyb20gYWN0aXZlIGxpc3Qgb24gdGhyZWFkICVwIiwgbmFtZSwgdGhpcyk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJCVUZGRVIgVElNRU9VVDogcmVtb3ZlKCVkKSBmcm9tIGFjdGl2ZSBsaXN0IG9uIHRocmVhZCAlcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOwogICAgICAgICAgICAgICAgICAgICAvLyBpbmRpY2F0ZSB0byBjbGllbnQgcHJvY2VzcyB0aGF0IHRoZSB0cmFjayB3YXMgZGlzYWJsZWQgYmVjYXVzZSBvZiB1bmRlcnJ1bjsKICAgICAgICAgICAgICAgICAgICAgLy8gaXQgd2lsbCB0aGVuIGF1dG9tYXRpY2FsbHkgY2FsbCBzdGFydCgpIHdoZW4gZGF0YSBpcyBhdmFpbGFibGUKQEAgLTQ3NzIsMTMgKzQ5OTMsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgbWl4ZXJTdGF0dXMgPSBNSVhFUl9UUkFDS1NfRU5BQkxFRDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQXVkaW9NaXhlci0+ZGlzYWJsZShuYW1lKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5kaXNhYmxlKHRyYWNrSWQpOwogICAgICAgICB9CiAKICAgICAgICAgfSAgIC8vIGxvY2FsIHZhcmlhYmxlIHNjb3BlIHRvIGF2b2lkIGdvdG8gd2FybmluZwogCiAgICAgfQogCisgICAgaWYgKG1IYXB0aWNDaGFubmVsTWFzayAhPSBBVURJT19DSEFOTkVMX05PTkUgJiYgc3EgIT0gTlVMTCkgeworICAgICAgICAvLyBXaGVuIHRoZXJlIGlzIG5vIGZhc3QgdHJhY2sgcGxheWluZyBoYXB0aWMgYW5kIEZhc3RNaXhlciBleGlzdHMsCisgICAgICAgIC8vIGVuYWJsaW5nIHRoZSBmaXJzdCBGYXN0VHJhY2ssIHdoaWNoIHByb3ZpZGVzIG1peGVkIGRhdGEgZnJvbSBub3JtYWwKKyAgICAgICAgLy8gdHJhY2tzLCB0byBwbGF5IGhhcHRpYyBkYXRhLgorICAgICAgICBGYXN0VHJhY2sgKmZhc3RUcmFjayA9ICZzdGF0ZS0+bUZhc3RUcmFja3NbMF07CisgICAgICAgIGlmIChmYXN0VHJhY2stPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQgIT0gbm9GYXN0SGFwdGljVHJhY2spIHsKKyAgICAgICAgICAgIGZhc3RUcmFjay0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCA9IG5vRmFzdEhhcHRpY1RyYWNrOworICAgICAgICAgICAgZGlkTW9kaWZ5ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIFB1c2ggdGhlIG5ldyBGYXN0TWl4ZXIgc3RhdGUgaWYgbmVjZXNzYXJ5CiAgICAgYm9vbCBwYXVzZUF1ZGlvV2F0Y2hkb2cgPSBmYWxzZTsKICAgICBpZiAoZGlkTW9kaWZ5KSB7CkBAIC00ODMzLDkgKzUwNjUsOSBAQAogICAgIC8vIG9mIHByZXBhcmVUcmFja3NfbCgpOyB0aGlzIHJlbGVhc2VzIGFueSBvdXRzdGFuZGluZyBidWZmZXIgYmFjayB0byB0aGUgdHJhY2suCiAgICAgLy8gU2VlIGFsc28gdGhlIGltcGxlbWVudGF0aW9uIG9mIGRlc3Ryb3lUcmFja19sKCkuCiAgICAgZm9yIChjb25zdCBhdXRvICZ0cmFjayA6ICp0cmFja3NUb1JlbW92ZSkgewotICAgICAgICBjb25zdCBpbnQgbmFtZSA9IHRyYWNrLT5uYW1lKCk7Ci0gICAgICAgIGlmIChtQXVkaW9NaXhlci0+ZXhpc3RzKG5hbWUpKSB7IC8vIE5vcm1hbCB0cmFja3MgaGVyZSwgZmFzdCB0cmFja3MgaW4gRmFzdE1peGVyLgotICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKG5hbWUsIG51bGxwdHIgLyogYnVmZmVyUHJvdmlkZXIgKi8pOworICAgICAgICBjb25zdCBpbnQgdHJhY2tJZCA9IHRyYWNrLT5pZCgpOworICAgICAgICBpZiAobUF1ZGlvTWl4ZXItPmV4aXN0cyh0cmFja0lkKSkgeyAvLyBOb3JtYWwgdHJhY2tzIGhlcmUsIGZhc3QgdHJhY2tzIGluIEZhc3RNaXhlci4KKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRCdWZmZXJQcm92aWRlcih0cmFja0lkLCBudWxscHRyIC8qIGJ1ZmZlclByb3ZpZGVyICovKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNTAwNCwxNyArNTIzNiwxNyBAQAogICAgICAgICAgICAgZGVsZXRlIG1BdWRpb01peGVyOwogICAgICAgICAgICAgbUF1ZGlvTWl4ZXIgPSBuZXcgQXVkaW9NaXhlcihtTm9ybWFsRnJhbWVDb3VudCwgbVNhbXBsZVJhdGUpOwogICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZ0cmFjayA6IG1UcmFja3MpIHsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQgbmFtZSA9IHRyYWNrLT5uYW1lKCk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHRyYWNrSWQgPSB0cmFjay0+aWQoKTsKICAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9NaXhlci0+Y3JlYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bUNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1Gb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bVNlc3Npb25JZCk7CiAgICAgICAgICAgICAgICAgQUxPR1dfSUYoc3RhdHVzICE9IE5PX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBjYW5ub3QgY3JlYXRlIHRyYWNrIG5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAiICVkLCBtYXNrICUjeCwgZm9ybWF0ICUjeCwgc2Vzc2lvbklkICVkIGluIEF1ZGlvTWl4ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCk6IEF1ZGlvTWl4ZXIgY2Fubm90IGNyZWF0ZSB0cmFjayglZCkiCisgICAgICAgICAgICAgICAgICAgICAgICAiIG1hc2sgJSN4LCBmb3JtYXQgJSN4LCBzZXNzaW9uSWQgJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCB0cmFjay0+bUNoYW5uZWxNYXNrLCB0cmFjay0+bUZvcm1hdCwgdHJhY2stPm1TZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwgdHJhY2stPm1DaGFubmVsTWFzaywgdHJhY2stPm1Gb3JtYXQsIHRyYWNrLT5tU2Vzc2lvbklkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEKTsKICAgICAgICAgfQpAQCAtNTAzMCw2ICs1MjYyLDEyIEBACiAgICAgZHByaW50ZihmZCwgIiAgVGhyZWFkIHRocm90dGxlIHRpbWUgKG1zZWNzKTogJXVcbiIsIG1UaHJlYWRUaHJvdHRsZVRpbWVNcyk7CiAgICAgZHByaW50ZihmZCwgIiAgQXVkaW9NaXhlciB0cmFja3M6ICVzXG4iLCBtQXVkaW9NaXhlci0+dHJhY2tOYW1lcygpLmNfc3RyKCkpOwogICAgIGRwcmludGYoZmQsICIgIE1hc3RlciBtb25vOiAlc1xuIiwgbU1hc3Rlck1vbm8gPyAib24iIDogIm9mZiIpOworICAgIGNvbnN0IGRvdWJsZSBsYXRlbmN5TXMgPSBtVGltZXN0YW1wLmdldE91dHB1dFNlcnZlckxhdGVuY3lNcyhtU2FtcGxlUmF0ZSk7CisgICAgaWYgKGxhdGVuY3lNcyAhPSAwLikgeworICAgICAgICBkcHJpbnRmKGZkLCAiICBOb3JtYWxNaXhlciBsYXRlbmN5IG1zOiAlLjJsZlxuIiwgbGF0ZW5jeU1zKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkcHJpbnRmKGZkLCAiICBOb3JtYWxNaXhlciBsYXRlbmN5IG1zOiB1bmF2YWlsXG4iKTsKKyAgICB9CiAKICAgICBpZiAoaGFzRmFzdE1peGVyKCkpIHsKICAgICAgICAgZHByaW50ZihmZCwgIiAgRmFzdE1peGVyIHRocmVhZCAlcCB0aWQ9JWQiLCBtRmFzdE1peGVyLmdldCgpLCBtRmFzdE1peGVyLT5nZXRUaWQoKSk7CkBAIC01MDM4LDkgKzUyNzYsOSBAQAogICAgICAgICAvLyB3aGlsZSB3ZSBhcmUgZHVtcGluZyBpdC4gIEl0IG1heSBiZSBpbmNvbnNpc3RlbnQsIGJ1dCBpdCB3b24ndCBtdXRhdGUhCiAgICAgICAgIC8vIFRoaXMgaXMgYSBsYXJnZSBvYmplY3Qgc28gd2UgcGxhY2UgaXQgb24gdGhlIGhlYXAuCiAgICAgICAgIC8vIEZJWE1FIDI1OTcyOTU4OiBOZWVkIGFuIGludGVsbGlnZW50IGNvcHkgY29uc3RydWN0b3IgdGhhdCBkb2VzIG5vdCB0b3VjaCB1bnVzZWQgcGFnZXMuCi0gICAgICAgIGNvbnN0IEZhc3RNaXhlckR1bXBTdGF0ZSAqY29weSA9IG5ldyBGYXN0TWl4ZXJEdW1wU3RhdGUobUZhc3RNaXhlckR1bXBTdGF0ZSk7CisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxGYXN0TWl4ZXJEdW1wU3RhdGU+IGNvcHkgPQorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8RmFzdE1peGVyRHVtcFN0YXRlPihtRmFzdE1peGVyRHVtcFN0YXRlKTsKICAgICAgICAgY29weS0+ZHVtcChmZCk7Ci0gICAgICAgIGRlbGV0ZSBjb3B5OwogCiAjaWZkZWYgU1RBVEVfUVVFVUVfRFVNUAogICAgICAgICAvLyBTaW1pbGFyIGZvciBzdGF0ZSBxdWV1ZQpAQCAtNTA2MSwxMiArNTI5OSw2IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgZHByaW50ZihmZCwgIiAgTm8gRmFzdE1peGVyXG4iKTsKICAgICB9Ci0KLSNpZmRlZiBURUVfU0lOSwotICAgIC8vIFdyaXRlIHRoZSB0ZWUgb3V0cHV0IHRvIGEgLndhdiBmaWxlCi0gICAgZHVtcFRlZShmZCwgbVRlZVNvdXJjZSwgbUlkLCAnTScpOwotI2VuZGlmCi0KIH0KIAogdWludDMyX3QgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6aWRsZVNsZWVwVGltZVVzKCkgY29uc3QKQEAgLTUyNTMsNyArNTQ4NSw3IEBACiAgICAgICAgIGlmICgodHJhY2stPmZyYW1lc1JlYWR5KCkgPj0gbWluRnJhbWVzKSAmJiB0cmFjay0+aXNSZWFkeSgpICYmICF0cmFjay0+aXNQYXVzZWQoKSAmJgogICAgICAgICAgICAgICAgICF0cmFjay0+aXNTdG9wcGluZ18yKCkgJiYgIXRyYWNrLT5pc1N0b3BwZWQoKSkKICAgICAgICAgewotICAgICAgICAgICAgQUxPR1ZWKCJ0cmFjayAlZCBzPSUwOHggW09LXSIsIHRyYWNrLT5uYW1lKCksIGNibGstPm1TZXJ2ZXIpOworICAgICAgICAgICAgQUxPR1ZWKCJ0cmFjayglZCkgcz0lMDh4IFtPS10iLCB0cmFjay0+aWQoKSwgY2Jsay0+bVNlcnZlcik7CiAKICAgICAgICAgICAgIGlmICh0cmFjay0+bUZpbGxpbmdVcFN0YXR1cyA9PSBUcmFjazo6RlNfRklMTEVEKSB7CiAgICAgICAgICAgICAgICAgdHJhY2stPm1GaWxsaW5nVXBTdGF0dXMgPSBUcmFjazo6RlNfQUNUSVZFOwpAQCAtNTMyOSw3ICs1NTYxLDcgQEAKICAgICAgICAgICAgICAgICAvLyBmaWxsIGEgYnVmZmVyLCB0aGVuIHJlbW92ZSBpdCBmcm9tIGFjdGl2ZSBsaXN0LgogICAgICAgICAgICAgICAgIC8vIE9ubHkgY29uc2lkZXIgbGFzdCB0cmFjayBzdGFydGVkIGZvciBtaXhlciBzdGF0ZSBjb250cm9sCiAgICAgICAgICAgICAgICAgaWYgKC0tKHRyYWNrLT5tUmV0cnlDb3VudCkgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiQlVGRkVSIFRJTUVPVVQ6IHJlbW92ZSglZCkgZnJvbSBhY3RpdmUgbGlzdCIsIHRyYWNrLT5uYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQlVGRkVSIFRJTUVPVVQ6IHJlbW92ZSB0cmFjayglZCkgZnJvbSBhY3RpdmUgbGlzdCIsIHRyYWNrLT5pZCgpKTsKICAgICAgICAgICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7CiAgICAgICAgICAgICAgICAgICAgIC8vIGluZGljYXRlIHRvIGNsaWVudCBwcm9jZXNzIHRoYXQgdGhlIHRyYWNrIHdhcyBkaXNhYmxlZCBiZWNhdXNlIG9mIHVuZGVycnVuOwogICAgICAgICAgICAgICAgICAgICAvLyBpdCB3aWxsIHRoZW4gYXV0b21hdGljYWxseSBjYWxsIHN0YXJ0KCkgd2hlbiBkYXRhIGlzIGF2YWlsYWJsZQpAQCAtNTU2OCw2ICs1ODAwLDcgQEAKICAgICBtT3V0cHV0LT5mbHVzaCgpOwogICAgIG1Id1BhdXNlZCA9IGZhbHNlOwogICAgIG1GbHVzaFBlbmRpbmcgPSBmYWxzZTsKKyAgICBtVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eSgpOyAvLyBESVJFQ1QgYW5kIE9GRkxPQURFRCBmbHVzaCByZXNldHMgZnJhbWUgY291bnQuCiB9CiAKIGludDY0X3QgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OmNvbXB1dGVXYWl0VGltZU5zX2woKSBjb25zdCB7CkBAIC01ODExLDcgKzYwNDQsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9ICBlbHNlIGlmICh0cmFjay0+ZnJhbWVzUmVhZHkoKSAmJiB0cmFjay0+aXNSZWFkeSgpICYmCiAgICAgICAgICAgICAgICAgIXRyYWNrLT5pc1BhdXNlZCgpICYmICF0cmFjay0+aXNUZXJtaW5hdGVkKCkgJiYgIXRyYWNrLT5pc1N0b3BwaW5nXzIoKSkgewotICAgICAgICAgICAgQUxPR1ZWKCJPZmZsb2FkVGhyZWFkOiB0cmFjayAlZCBzPSUwOHggW09LXSIsIHRyYWNrLT5uYW1lKCksIGNibGstPm1TZXJ2ZXIpOworICAgICAgICAgICAgQUxPR1ZWKCJPZmZsb2FkVGhyZWFkOiB0cmFjayglZCkgcz0lMDh4IFtPS10iLCB0cmFjay0+aWQoKSwgY2Jsay0+bVNlcnZlcik7CiAgICAgICAgICAgICBpZiAodHJhY2stPm1GaWxsaW5nVXBTdGF0dXMgPT0gVHJhY2s6OkZTX0ZJTExFRCkgewogICAgICAgICAgICAgICAgIHRyYWNrLT5tRmlsbGluZ1VwU3RhdHVzID0gVHJhY2s6OkZTX0FDVElWRTsKICAgICAgICAgICAgICAgICBpZiAobGFzdCkgewpAQCAtNTg1NSw3ICs2MDg4LDcgQEAKICAgICAgICAgICAgICAgICBtaXhlclN0YXR1cyA9IE1JWEVSX1RSQUNLU19SRUFEWTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dWVigiT2ZmbG9hZFRocmVhZDogdHJhY2sgJWQgcz0lMDh4IFtOT1QgUkVBRFldIiwgdHJhY2stPm5hbWUoKSwgY2Jsay0+bVNlcnZlcik7CisgICAgICAgICAgICBBTE9HVlYoIk9mZmxvYWRUaHJlYWQ6IHRyYWNrKCVkKSBzPSUwOHggW05PVCBSRUFEWV0iLCB0cmFjay0+aWQoKSwgY2Jsay0+bVNlcnZlcik7CiAgICAgICAgICAgICBpZiAodHJhY2stPmlzU3RvcHBpbmdfMSgpKSB7CiAgICAgICAgICAgICAgICAgaWYgKC0tKHRyYWNrLT5tUmV0cnlDb3VudCkgPD0gMCkgewogICAgICAgICAgICAgICAgICAgICAvLyBIYXJkd2FyZSBidWZmZXIgY2FuIGhvbGQgYSBsYXJnZSBhbW91bnQgb2YgYXVkaW8gc28gd2UgbXVzdApAQCAtNTkwMiw2ICs2MTM1LDE0IEBACiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5wcmVzZW50YXRpb25Db21wbGV0ZShmcmFtZXNXcml0dGVuLCBhdWRpb0hBTEZyYW1lcyk7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5yZXNldCgpOwogICAgICAgICAgICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gRElSRUNUIGFuZCBPRkZMT0FERUQgc3RvcCByZXNldHMgZnJhbWUgY291bnRzLgorICAgICAgICAgICAgICAgICAgICBpZiAoIW1Vc2VBc3luY1dyaXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBnZXQgZXhwbGljaXQgZHJhaW4gbm90aWZpY2F0aW9uIHdlIG11c3QKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIGRpc2NvbnRpbnVpdHkgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoaXMgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwcmV2aW91cyAoIWxhc3QpIG9yIHRoZSB1cGNvbWluZyAobGFzdCkgdHJhY2sKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGF2b2lkIHNraXBwaW5nIHRoZSBkaXNjb250aW51aXR5LgorICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmRpc2NvbnRpbnVpdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gTm8gYnVmZmVycyBmb3IgdGhpcyB0cmFjay4gR2l2ZSBpdCBhIGZldyBjaGFuY2VzIHRvCkBAIC01OTIzLDggKzYxNjQsOCBAQAogICAgICAgICAgICAgICAgICAgICBpZiAocnVubmluZykgeyAvLyBzdGlsbCBydW5uaW5nLCBnaXZlIHVzIG1vcmUgdGltZS4KICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tUmV0cnlDb3VudCA9IGtNYXhUcmFja1JldHJpZXNPZmZsb2FkOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIk9mZmxvYWRUaHJlYWQ6IEJVRkZFUiBUSU1FT1VUOiByZW1vdmUoJWQpIGZyb20gYWN0aXZlIGxpc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJPZmZsb2FkVGhyZWFkOiBCVUZGRVIgVElNRU9VVDogcmVtb3ZlIHRyYWNrKCVkKSBmcm9tIGFjdGl2ZSBsaXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPmlkKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZWxsIGNsaWVudCBwcm9jZXNzIHRoYXQgdGhlIHRyYWNrIHdhcyBkaXNhYmxlZCBiZWNhdXNlIG9mIHVuZGVycnVuOwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgd2lsbCB0aGVuIGF1dG9tYXRpY2FsbHkgY2FsbCBzdGFydCgpIHdoZW4gZGF0YSBpcyBhdmFpbGFibGUKQEAgLTYwNjcsNyArNjMwOCwyMiBAQAogc3NpemVfdCBBdWRpb0ZsaW5nZXI6OkR1cGxpY2F0aW5nVGhyZWFkOjp0aHJlYWRMb29wX3dyaXRlKCkKIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dFRyYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICBvdXRwdXRUcmFja3NbaV0tPndyaXRlKG1TaW5rQnVmZmVyLCB3cml0ZUZyYW1lcyk7CisgICAgICAgIGNvbnN0IHNzaXplX3QgYWN0dWFsV3JpdHRlbiA9IG91dHB1dFRyYWNrc1tpXS0+d3JpdGUobVNpbmtCdWZmZXIsIHdyaXRlRnJhbWVzKTsKKworICAgICAgICAvLyBDb25zaWRlciB0aGUgZmlyc3QgT3V0cHV0VHJhY2sgZm9yIHRpbWVzdGFtcCBhbmQgZnJhbWUgY291bnRpbmcuCisKKyAgICAgICAgLy8gVGhlIHRocmVhZExvb3AoKSBnZW5lcmFsbHkgYXNzdW1lcyB3cml0aW5nIGEgZnVsbCBzaW5rIGJ1ZmZlciBzaXplIGF0IGEgdGltZS4KKyAgICAgICAgLy8gSGVyZSwgd2UgY29ycmVjdCBmb3Igd3JpdGVGcmFtZXMgb2YgMCAoYSBzdG9wKSBvciB1bmRlcnJ1bnMgYmVjYXVzZQorICAgICAgICAvLyB3ZSBhbHdheXMgY2xhaW0gc3VjY2Vzcy4KKyAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgY29uc3Qgc3NpemVfdCBjb3JyZWN0aW9uID0gbVNpbmtCdWZmZXJTaXplIC8gbUZyYW1lU2l6ZSAtIGFjdHVhbFdyaXR0ZW47CisgICAgICAgICAgICBBTE9HRF9JRihjb3JyZWN0aW9uICE9IDAgJiYgd3JpdGVGcmFtZXMgIT0gMCwKKyAgICAgICAgICAgICAgICAgICAgIiVzOiB3cml0ZUZyYW1lczoldSAgYWN0dWFsV3JpdHRlbjolemQgIGNvcnJlY3Rpb246JXpkICBtRnJhbWVzV3JpdHRlbjolbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHdyaXRlRnJhbWVzLCBhY3R1YWxXcml0dGVuLCBjb3JyZWN0aW9uLCAobG9uZyBsb25nKW1GcmFtZXNXcml0dGVuKTsKKyAgICAgICAgICAgIG1GcmFtZXNXcml0dGVuIC09IGNvcnJlY3Rpb247CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiBSZXBvcnQgY29ycmVjdGlvbiBmb3IgdGhlIG90aGVyIG91dHB1dCB0cmFja3MgYW5kIHNob3cgaW4gdGhlIGR1bXAuCiAgICAgfQogICAgIG1TdGFuZGJ5ID0gZmFsc2U7CiAgICAgcmV0dXJuIChzc2l6ZV90KW1TaW5rQnVmZmVyU2l6ZTsKQEAgLTYwOTIsNyArNjM0OCw3IEBACiAgICAgICAgIHNzIDw8ICI6IjsKICAgICAgICAgZm9yIChjb25zdCBhdXRvICZ0cmFjayA6IG1PdXRwdXRUcmFja3MpIHsKICAgICAgICAgICAgIGNvbnN0IHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IHRyYWNrLT50aHJlYWQoKS5wcm9tb3RlKCk7Ci0gICAgICAgICAgICBzcyA8PCAiICgiIDw8IHRyYWNrLT5uYW1lKCkgPDwgIiA6ICI7CisgICAgICAgICAgICBzcyA8PCAiICgiIDw8IHRyYWNrLT5pZCgpIDw8ICIgOiAiOwogICAgICAgICAgICAgaWYgKHRocmVhZC5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgc3MgPDwgdGhyZWFkLmdldCgpIDw8ICIsICIgPDwgdGhyZWFkLT5pZCgpOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTYyMzIsOSArNjQ4OCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzeXN0ZW1SZWFkeQotI2lmZGVmIFRFRV9TSU5LCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgY29uc3Qgc3A8TkJBSU9fU2luaz4mIHRlZVNpbmsKLSNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIDoKICAgICBUaHJlYWRCYXNlKGF1ZGlvRmxpbmdlciwgaWQsIG91dERldmljZSwgaW5EZXZpY2UsIFJFQ09SRCwgc3lzdGVtUmVhZHkpLAogICAgIG1JbnB1dChpbnB1dCksCkBAIC02MjQyLDkgKzY0OTUsNiBAQAogICAgIG1Sc21wSW5CdWZmZXIoTlVMTCksCiAgICAgLy8gbVJzbXBJbkZyYW1lcywgbVJzbXBJbkZyYW1lc1AyLCBhbmQgbVJzbXBJbkZyYW1lc09BIGFyZSBzZXQgYnkgcmVhZElucHV0UGFyYW1ldGVyc19sKCkKICAgICBtUnNtcEluUmVhcigwKQotI2lmZGVmIFRFRV9TSU5LCi0gICAgLCBtVGVlU2luayh0ZWVTaW5rKQotI2VuZGlmCiAgICAgLCBtUmVhZE9ubHlIZWFwKG5ldyBNZW1vcnlEZWFsZXIoa1JlY29yZFRocmVhZFJlYWRPbmx5SGVhcFNpemUsCiAgICAgICAgICAgICAiUmVjb3JkVGhyZWFkUk8iLCBNZW1vcnlIZWFwQmFzZTo6UkVBRF9PTkxZKSkKICAgICAvLyBtRmFzdENhcHR1cmUgYmVsb3cKQEAgLTYyNjEsOCArNjUxMSwyMCBAQAogICAgIHNucHJpbnRmKG1UaHJlYWROYW1lLCBrVGhyZWFkTmFtZUxlbmd0aCwgIkF1ZGlvSW5fJVgiLCBpZCk7CiAgICAgbU5CTG9nV3JpdGVyID0gYXVkaW9GbGluZ2VyLT5uZXdXcml0ZXJfbChrTG9nU2l6ZSwgbVRocmVhZE5hbWUpOwogCisgICAgaWYgKG1JbnB1dCAhPSBudWxscHRyICYmIG1JbnB1dC0+YXVkaW9Id0RldiAhPSBudWxscHRyKSB7CisgICAgICAgIG1Jc01zZERldmljZSA9IHN0cmNtcCgKKyAgICAgICAgICAgICAgICBtSW5wdXQtPmF1ZGlvSHdEZXYtPm1vZHVsZU5hbWUoKSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCkgPT0gMDsKKyAgICB9CisKICAgICByZWFkSW5wdXRQYXJhbWV0ZXJzX2woKTsKIAorICAgIC8vIFRPRE86IFdlIG1heSBhbHNvIG1hdGNoIG9uIGFkZHJlc3MgYXMgd2VsbCBhcyBkZXZpY2UgdHlwZSBmb3IKKyAgICAvLyBBVURJT19ERVZJQ0VfSU5fQlVTLCBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFAsIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYCisgICAgbVRpbWVzdGFtcENvcnJlY3RlZERldmljZXMgPSAoYXVkaW9fZGV2aWNlc190KXByb3BlcnR5X2dldF9pbnQ2NCgKKyAgICAgICAgICAgICJhdWRpby50aW1lc3RhbXAuY29ycmVjdGVkX2lucHV0X2RldmljZXMiLAorICAgICAgICAgICAgKGludDY0X3QpKG1Jc01zZERldmljZSA/IEFVRElPX0RFVklDRV9JTl9CVVMgLy8gdHVybiBvbiBieSBkZWZhdWx0IGZvciBNU0QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBVURJT19ERVZJQ0VfTk9ORSkpOworCiAgICAgLy8gY3JlYXRlIGFuIE5CQUlPIHNvdXJjZSBmb3IgdGhlIEhBTCBpbnB1dCBzdHJlYW0sIGFuZCBuZWdvdGlhdGUKICAgICBtSW5wdXRTb3VyY2UgPSBuZXcgQXVkaW9TdHJlYW1JblNvdXJjZShpbnB1dC0+c3RyZWFtKTsKICAgICBzaXplX3QgbnVtQ291bnRlck9mZmVycyA9IDA7CkBAIC02MzU5LDcgKzY2MjEsNyBAQAogICAgICAgICAvLyBzdGFydCB0aGUgZmFzdCBjYXB0dXJlCiAgICAgICAgIG1GYXN0Q2FwdHVyZS0+cnVuKCJGYXN0Q2FwdHVyZSIsIEFORFJPSURfUFJJT1JJVFlfVVJHRU5UX0FVRElPKTsKICAgICAgICAgcGlkX3QgdGlkID0gbUZhc3RDYXB0dXJlLT5nZXRUaWQoKTsKLSAgICAgICAgc2VuZFByaW9Db25maWdFdmVudChnZXRwaWRfY2FjaGVkLCB0aWQsIGtQcmlvcml0eUZhc3RDYXB0dXJlLCBmYWxzZSAvKmZvckFwcCovKTsKKyAgICAgICAgc2VuZFByaW9Db25maWdFdmVudChnZXRwaWQoKSwgdGlkLCBrUHJpb3JpdHlGYXN0Q2FwdHVyZSwgZmFsc2UgLypmb3JBcHAqLyk7CiAgICAgICAgIHN0cmVhbSgpLT5zZXRIYWxUaHJlYWRQcmlvcml0eShrUHJpb3JpdHlGYXN0Q2FwdHVyZSk7CiAjaWZkZWYgQVVESU9fV0FUQ0hET0cKICAgICAgICAgLy8gRklYTUUKQEAgLTYzNjcsNiArNjYyOSwxMCBAQAogCiAgICAgICAgIG1GYXN0VHJhY2tBdmFpbCA9IHRydWU7CiAgICAgfQorI2lmZGVmIFRFRV9TSU5LCisgICAgbVRlZS5zZXQobUlucHV0U291cmNlLT5mb3JtYXQoKSwgTkJBSU9fVGVlOjpURUVfRkxBR19JTlBVVF9USFJFQUQpOworICAgIG1UZWUuc2V0SWQoc3RkOjpzdHJpbmcoIl8iKSArIHN0ZDo6dG9fc3RyaW5nKG1JZCkgKyAiX0MiKTsKKyNlbmRpZgogZmFpbGVkOiA7CiAKICAgICAvLyBGSVhNRSBtTm9ybWFsU291cmNlCkBAIC02NDk0LDYgKzY3NjAsNyBAQAogCiAgICAgICAgICAgICAgICAgY2FzZSBUcmFja0Jhc2U6OlBBVVNJTkc6CiAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFja3MucmVtb3ZlKGFjdGl2ZVRyYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6UEFVU0VEOwogICAgICAgICAgICAgICAgICAgICBkb0Jyb2FkY2FzdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIHNpemUtLTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC02NTE1LDEyICs2NzgyLDEyIEBACiAgICAgICAgICAgICAgICAgICAgIGFsbFN0b3BwZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6SURMRToKLSAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQorICAgICAgICAgICAgICAgIGNhc2UgVHJhY2tCYXNlOjpJRExFOiAgICAvLyBjYW5ub3QgYmUgb24gQWN0aXZlVHJhY2tzIGlmIGlkbGUKKyAgICAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6UEFVU0VEOiAgLy8gY2Fubm90IGJlIG9uIEFjdGl2ZVRyYWNrcyBpZiBwYXVzZWQKKyAgICAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6U1RPUFBFRDogLy8gY2Fubm90IGJlIG9uIEFjdGl2ZVRyYWNrcyBpZiBkZXN0cm95ZWQvdGVybWluYXRlZAogICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVuZXhwZWN0ZWQgYWN0aXZlVHJhY2tTdGF0ZSAlZCIsIGFjdGl2ZVRyYWNrU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlczogVW5leHBlY3RlZCBhY3RpdmUgdHJhY2sgc3RhdGU6JWQsIGlkOiVkLCB0cmFja3M6JXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYWN0aXZlVHJhY2tTdGF0ZSwgYWN0aXZlVHJhY2stPmlkKCksIHNpemUpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrcy5hZGQoYWN0aXZlVHJhY2spOwpAQCAtNjU0NSw3ICs2ODEyLDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gc2xlZXAgaWYgdGhlcmUgYXJlIG5vIGFjdGl2ZSB0cmFja3MgdG8gcHJvY2VzcwotICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrcy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBpZiAoc2xlZXBVcyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHNsZWVwVXMgPSBrUmVjb3JkVGhyZWFkU2xlZXBVczsKICAgICAgICAgICAgICAgICB9CkBAIC02NTk2LDYgKzY4NjMsMTQgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZGlkTW9kaWZ5ID0gdHJ1ZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIGFicCA9IChmYXN0VHJhY2sgIT0gMCAmJiBmYXN0VHJhY2stPmlzUGF0Y2hUcmFjaygpKSA/CisgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXVkaW9CdWZmZXJQcm92aWRlcio+KGZhc3RUcmFjay5nZXQoKSkgOiBudWxscHRyOworICAgICAgICAgICAgaWYgKHN0YXRlLT5tRmFzdFBhdGNoUmVjb3JkQnVmZmVyUHJvdmlkZXIgIT0gYWJwKSB7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1GYXN0UGF0Y2hSZWNvcmRCdWZmZXJQcm92aWRlciA9IGFicDsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bUZhc3RQYXRjaFJlY29yZEZvcm1hdCA9IGZhc3RUcmFjayA9PSAwID8KKyAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9JTlZBTElEIDogZmFzdFRyYWNrLT5mb3JtYXQoKTsKKyAgICAgICAgICAgICAgICBkaWRNb2RpZnkgPSB0cnVlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgc3EtPmVuZChkaWRNb2RpZnkpOwogICAgICAgICAgICAgaWYgKGRpZE1vZGlmeSkgewogICAgICAgICAgICAgICAgIHNxLT5wdXNoKGJsb2NrKTsKQEAgLTY2MjEsOCArNjg5Niw3IEBACiAKICAgICAgICAgLy8gSWYgYW4gTkJBSU8gc291cmNlIGlzIHByZXNlbnQsIHVzZSBpdCB0byByZWFkIHRoZSBub3JtYWwgY2FwdHVyZSdzIGRhdGEKICAgICAgICAgaWYgKG1QaXBlU291cmNlICE9IDApIHsKLSAgICAgICAgICAgIHNpemVfdCBmcmFtZXNUb1JlYWQgPSBtQnVmZmVyU2l6ZSAvIG1GcmFtZVNpemU7Ci0gICAgICAgICAgICBmcmFtZXNUb1JlYWQgPSBtaW4obVJzbXBJbkZyYW1lc09BIC0gcmVhciwgbVJzbXBJbkZyYW1lc1AyIC8gMik7CisgICAgICAgICAgICBzaXplX3QgZnJhbWVzVG9SZWFkID0gbWluKG1Sc21wSW5GcmFtZXNPQSAtIHJlYXIsIG1Sc21wSW5GcmFtZXNQMiAvIDIpOwogCiAgICAgICAgICAgICAvLyBUaGUgYXVkaW8gZmlmbyByZWFkKCkgcmV0dXJucyBPVkVSUlVOIG9uIG92ZXJmbG93LCBhbmQgYWR2YW5jZXMgdGhlIHJlYWQgcG9pbnRlcgogICAgICAgICAgICAgLy8gdG8gdGhlIGZ1bGwgYnVmZmVyIHBvaW50IChjbGVhcmluZyB0aGUgb3ZlcmZsb3cgY29uZGl0aW9uKS4gIFVwb24gT1ZFUlJVTiBlcnJvciwKQEAgLTY2ODQsOCArNjk1OCwyNCBAQAogICAgICAgICAvLyBVcGRhdGUgc2VydmVyIHRpbWVzdGFtcCB3aXRoIGtlcm5lbCBzdGF0cwogICAgICAgICBpZiAobVBpcGVTb3VyY2UuZ2V0KCkgPT0gbnVsbHB0ciAvKiBkb24ndCBvYnRhaW4gZm9yIEZhc3RDYXB0dXJlLCBjb3VsZCBibG9jayAqLykgewogICAgICAgICAgICAgaW50NjRfdCBwb3NpdGlvbiwgdGltZTsKLSAgICAgICAgICAgIGludCByZXQgPSBtSW5wdXQtPnN0cmVhbS0+Z2V0Q2FwdHVyZVBvc2l0aW9uKCZwb3NpdGlvbiwgJnRpbWUpOwotICAgICAgICAgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgaWYgKG1TdGFuZGJ5KSB7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmRpc2NvbnRpbnVpdHkoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUlucHV0LT5zdHJlYW0tPmdldENhcHR1cmVQb3NpdGlvbigmcG9zaXRpb24sICZ0aW1lKSA9PSBOT19FUlJPUgorICAgICAgICAgICAgICAgICAgICAmJiB0aW1lID4gbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdKSB7CisKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuYWRkKHBvc2l0aW9uLCB0aW1lLCBtU2FtcGxlUmF0ZSk7CisKKyAgICAgICAgICAgICAgICAvLyBDb3JyZWN0IHRpbWVzdGFtcHMKKyAgICAgICAgICAgICAgICBpZiAoaXNUaW1lc3RhbXBDb3JyZWN0aW9uRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJUU19CRUZPUkU6ICVkICVsbGQgJWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQoKSwgKGxvbmcgbG9uZyl0aW1lLCAobG9uZyBsb25nKXBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBjb3JyZWN0ZWRUaW1lc3RhbXAgPSBtVGltZXN0YW1wVmVyaWZpZXIuZ2V0TGFzdENvcnJlY3RlZFRpbWVzdGFtcCgpOworICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IGNvcnJlY3RlZFRpbWVzdGFtcC5tRnJhbWVzOworICAgICAgICAgICAgICAgICAgICB0aW1lID0gY29ycmVjdGVkVGltZXN0YW1wLm1UaW1lTnM7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJUU19BRlRFUjogJWQgJWxsZCAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCgpLCAobG9uZyBsb25nKXRpbWUsIChsb25nIGxvbmcpcG9zaXRpb24pOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0gcG9zaXRpb247CiAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0gdGltZTsKICAgICAgICAgICAgICAgICAvLyBOb3RlOiBJbiBnZW5lcmFsIHJlY29yZCBidWZmZXJzIHNob3VsZCB0ZW5kIHRvIGJlIGVtcHR5IGluCkBAIC02NjkzLDYgKzY5ODMsOCBAQAogICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgLy8gQWxzbywgaXQgaXMgbm90IGFkdmFudGFnZW91cyB0byBjYWxsIGdldF9wcmVzZW50YXRpb25fcG9zaXRpb24gZHVyaW5nIHRoZSByZWFkCiAgICAgICAgICAgICAgICAgLy8gYXMgdGhlIHJlYWQgb2J0YWlucyBhIGxvY2ssIHByZXZlbnRpbmcgdGhlIHRpbWVzdGFtcCBjYWxsIGZyb20gZXhlY3V0aW5nLgorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuZXJyb3IoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAvLyBVc2UgdGhpcyB0byB0cmFjayB0aW1lc3RhbXAgaW5mb3JtYXRpb24KQEAgLTY3MDgsMTAgKzcwMDAsMTEgQEAKICAgICAgICAgICAgIGdvdG8gdW5sb2NrOwogICAgICAgICB9CiAgICAgICAgIEFMT0dfQVNTRVJUKGZyYW1lc1JlYWQgPiAwKTsKKyAgICAgICAgbUZyYW1lc1JlYWQgKz0gZnJhbWVzUmVhZDsKIAotICAgICAgICBpZiAobVRlZVNpbmsgIT0gMCkgewotICAgICAgICAgICAgKHZvaWQpIG1UZWVTaW5rLT53cml0ZSgodWludDhfdCopbVJzbXBJbkJ1ZmZlciArIHJlYXIgKiBtRnJhbWVTaXplLCBmcmFtZXNSZWFkKTsKLSAgICAgICAgfQorI2lmZGVmIFRFRV9TSU5LCisgICAgICAgICh2b2lkKW1UZWUud3JpdGUoKHVpbnQ4X3QqKW1Sc21wSW5CdWZmZXIgKyByZWFyICogbUZyYW1lU2l6ZSwgZnJhbWVzUmVhZCk7CisjZW5kaWYKICAgICAgICAgLy8gSWYgZGVzdGluYXRpb24gaXMgbm9uLWNvbnRpZ3VvdXMsIHdlIG5vdyBjb3JyZWN0IGZvciByZWFkaW5nIHBhc3QgZW5kIG9mIGJ1ZmZlci4KICAgICAgICAgewogICAgICAgICAgICAgc2l6ZV90IHBhcnQxID0gbVJzbXBJbkZyYW1lc1AyIC0gcmVhcjsKQEAgLTY3NjksOSArNzA2MiwzMyBAQAogICAgICAgICAgICAgICAgIGZyYW1lc091dCA9IG1pbihmcmFtZXNPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbkZyYW1lc1Bvc3NpYmxlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbiwgbVNhbXBsZVJhdGUsIGFjdGl2ZVRyYWNrLT5tU2FtcGxlUmF0ZSkpOwotICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgZnJhbWVzIGZyb20gdGhlIFJlY29yZFRocmVhZCBidWZmZXIgcHJvdmlkZXIgdG8gdGhlIFJlY29yZFRyYWNrIGJ1ZmZlcgotICAgICAgICAgICAgICAgIGZyYW1lc091dCA9IGFjdGl2ZVRyYWNrLT5tUmVjb3JkQnVmZmVyQ29udmVydGVyLT5jb252ZXJ0KAotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1TaW5rLnJhdywgYWN0aXZlVHJhY2stPm1SZXNhbXBsZXJCdWZmZXJQcm92aWRlciwgZnJhbWVzT3V0KTsKKworICAgICAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+aXNEaXJlY3QoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBObyBSZWNvcmRCdWZmZXJDb252ZXJ0ZXIgdXNlZCBmb3IgZGlyZWN0IHN0cmVhbXMuIFBhc3MKKyAgICAgICAgICAgICAgICAgICAgLy8gc3RyYWlnaHQgZnJvbSBSZWNvcmRUaHJlYWQgYnVmZmVyIHRvIFJlY29yZFRyYWNrIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyIGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZXNPdXQ7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGFjdGl2ZVRyYWNrLT5tUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0sgJiYgYnVmZmVyLmZyYW1lQ291bnQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1ZfSUYoYnVmZmVyLmZyYW1lQ291bnQgIT0gZnJhbWVzT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKSByZWFkIGxlc3MgdGhhbiBleHBlY3RlZCAoJXp1IHZzICV6dSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYnVmZmVyLmZyYW1lQ291bnQsIGZyYW1lc091dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQgPSBidWZmZXIuZnJhbWVDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShhY3RpdmVUcmFjay0+bVNpbmsucmF3LCBidWZmZXIucmF3LCBidWZmZXIuZnJhbWVDb3VudCAqIG1GcmFtZVNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1SZXNhbXBsZXJCdWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXMoKSBjYW5ub3QgZmlsbCByZXF1ZXN0LCBzdGF0dXM6ICVkLCBmcmFtZUNvdW50OiAlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzdGF0dXMsIGJ1ZmZlci5mcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgZnJhbWVzIGZyb20gdGhlIFJlY29yZFRocmVhZCBidWZmZXIgcHJvdmlkZXIgdG8gdGhlIFJlY29yZFRyYWNrCisgICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQgPSBhY3RpdmVUcmFjay0+bVJlY29yZEJ1ZmZlckNvbnZlcnRlci0+Y29udmVydCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVNpbmsucmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0KTsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAoZnJhbWVzT3V0ID4gMCAmJiAob3ZlcnJ1biA9PSBPVkVSUlVOX1VOS05PV04pKSB7CiAgICAgICAgICAgICAgICAgICAgIG92ZXJydW4gPSBPVkVSUlVOX0ZBTFNFOwpAQCAtNjk0Miw2ICs3MjU5LDEyIEBACiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKKyAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkgJiYgKCpmbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRElSRUNUKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJjcmVhdGVSZWNvcmRUcmFja19sKCkgb24gYW4gZW5jb2RlZCBzdHJlYW0gcmVxdWlyZXMgQVVESU9fSU5QVVRfRkxBR19ESVJFQ1QiKTsKKyAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0KKwogICAgIGlmICgqcFNhbXBsZVJhdGUgPT0gMCkgewogICAgICAgICAqcFNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKICAgICB9CkBAIC03MTA3LDggKzc0MzAsMTQgQEAKICAgICB7CiAgICAgICAgIC8vIFRoaXMgc2VjdGlvbiBpcyBhIHJlbmRlenZvdXMgYmV0d2VlbiBiaW5kZXIgdGhyZWFkIGV4ZWN1dGluZyBzdGFydCgpIGFuZCBSZWNvcmRUaHJlYWQKICAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgICAgICBpZiAocmVjb3JkVHJhY2stPmlzSW52YWxpZCgpKSB7CisgICAgICAgICAgICByZWNvcmRUcmFjay0+Y2xlYXJTeW5jU3RhcnRFdmVudCgpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CiAgICAgICAgIGlmIChtQWN0aXZlVHJhY2tzLmluZGV4T2YocmVjb3JkVHJhY2spID49IDApIHsKICAgICAgICAgICAgIGlmIChyZWNvcmRUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UEFVU0lORykgeworICAgICAgICAgICAgICAgIC8vIFdlIGhhdmVuJ3Qgc3RvcHBlZCB5ZXQgKG1vdmVkIHRvIFBBVVNFRCBhbmQgbm90IGluIG1BY3RpdmVUcmFja3MpCisgICAgICAgICAgICAgICAgLy8gc28gbm8gbmVlZCB0byBzdGFydElucHV0KCkuCiAgICAgICAgICAgICAgICAgQUxPR1YoImFjdGl2ZSByZWNvcmQgdHJhY2sgUEFVU0lORyAtPiBBQ1RJVkUiKTsKICAgICAgICAgICAgICAgICByZWNvcmRUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpBQ1RJVkU7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNzEyNSwxNyArNzQ1NCwzNCBAQAogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKICAgICAgICAgaWYgKHJlY29yZFRyYWNrLT5pc0V4dGVybmFsVHJhY2soKSkgewogICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICBib29sIHNpbGVuY2VkOwotICAgICAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OnN0YXJ0SW5wdXQocmVjb3JkVHJhY2stPnBvcnRJZCgpLCAmc2lsZW5jZWQpOworICAgICAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OnN0YXJ0SW5wdXQocmVjb3JkVHJhY2stPnBvcnRJZCgpKTsKICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgICAgIC8vIEZJWE1FIHNob3VsZCB2ZXJpZnkgdGhhdCByZWNvcmRUcmFjayBpcyBzdGlsbCBpbiBtQWN0aXZlVHJhY2tzCisgICAgICAgICAgICBpZiAocmVjb3JkVHJhY2stPmlzSW52YWxpZCgpKSB7CisgICAgICAgICAgICAgICAgcmVjb3JkVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIHJlY29yZFRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpTVEFSVElOR18xKSB7CisgICAgICAgICAgICAgICAgICAgIHJlY29yZFRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlNUQVJUSU5HXzI7CisgICAgICAgICAgICAgICAgICAgIC8vIFNUQVJUSU5HXzIgZm9yY2VzIGRlc3Ryb3kgdG8gY2FsbCBzdG9wSW5wdXQuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZWNvcmRUcmFjay0+bVN0YXRlICE9IFRyYWNrQmFzZTo6U1RBUlRJTkdfMSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IHVuc3luY2hyb25pemVkIG1TdGF0ZTolZCBjaGFuZ2UiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcmVjb3JkVHJhY2stPmlkKCksIHJlY29yZFRyYWNrLT5tU3RhdGUpOworICAgICAgICAgICAgICAgIC8vIFNvbWVvbmUgZWxzZSBoYXMgY2hhbmdlZCBzdGF0ZSwgbGV0IHRoZW0gdGFrZSBvdmVyLAorICAgICAgICAgICAgICAgIC8vIGxlYXZlIG1TdGF0ZSBpbiB0aGUgbmV3IHN0YXRlLgorICAgICAgICAgICAgICAgIHJlY29yZFRyYWNrLT5jbGVhclN5bmNTdGFydEV2ZW50KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gd2UncmUgb2ssIGJ1dCBwZXJoYXBzIHN0YXJ0SW5wdXQgaGFzIGZhaWxlZAogICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IHN0YXJ0SW5wdXQgZmFpbGVkLCBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcmVjb3JkVHJhY2stPmlkKCksIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGluIEFjdGl2ZVRyYWNrcyBpZiBTVEFSVElOR18xIGFuZCB2YWxpZCwgc28gcmVtb3ZlIGZyb20gQWN0aXZlVHJhY2tzLAorICAgICAgICAgICAgICAgIC8vIGxlYXZlIGluIFNUQVJUSU5HXzEsIHNvIGRlc3Ryb3koKSB3aWxsIG5vdCBjYWxsIHN0b3BJbnB1dC4KICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2tzLnJlbW92ZShyZWNvcmRUcmFjayk7CiAgICAgICAgICAgICAgICAgcmVjb3JkVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKLSAgICAgICAgICAgICAgICBBTE9HVigiUmVjb3JkVGhyZWFkOjpzdGFydCBlcnJvciAlZCIsIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlY29yZFRyYWNrLT5zZXRTaWxlbmNlZChzaWxlbmNlZCk7CiAgICAgICAgIH0KICAgICAgICAgLy8gQ2F0Y2ggdXAgd2l0aCBjdXJyZW50IGJ1ZmZlciBpbmRpY2VzIGlmIHRocmVhZCBpcyBhbHJlYWR5IHJ1bm5pbmcuCiAgICAgICAgIC8vIFRoaXMgaXMgd2hhdCBtYWtlcyBhIG5ldyBjbGllbnQgZGlzY2FyZCBhbGwgYnVmZmVyZWQgZGF0YS4gIElmIHRoZSB0cmFjaydzIG1Sc21wSW5Gcm9udApAQCAtNzE0MywyNiArNzQ4OSwxNSBAQAogICAgICAgICAvLyBzZWUgcHJldmlvdXNseSBidWZmZXJlZCBkYXRhIGJlZm9yZSBpdCBjYWxsZWQgc3RhcnQoKSwgYnV0IHdpdGggZ3JlYXRlciByaXNrIG9mIG92ZXJydW4uCiAKICAgICAgICAgcmVjb3JkVHJhY2stPm1SZXNhbXBsZXJCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKLSAgICAgICAgLy8gY2xlYXIgYW55IGNvbnZlcnRlciBzdGF0ZSBhcyBuZXcgZGF0YSB3aWxsIGJlIGRpc2NvbnRpbnVvdXMKLSAgICAgICAgcmVjb3JkVHJhY2stPm1SZWNvcmRCdWZmZXJDb252ZXJ0ZXItPnJlc2V0KCk7CisgICAgICAgIGlmICghcmVjb3JkVHJhY2stPmlzRGlyZWN0KCkpIHsKKyAgICAgICAgICAgIC8vIGNsZWFyIGFueSBjb252ZXJ0ZXIgc3RhdGUgYXMgbmV3IGRhdGEgd2lsbCBiZSBkaXNjb250aW51b3VzCisgICAgICAgICAgICByZWNvcmRUcmFjay0+bVJlY29yZEJ1ZmZlckNvbnZlcnRlci0+cmVzZXQoKTsKKyAgICAgICAgfQogICAgICAgICByZWNvcmRUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpTVEFSVElOR18yOwogICAgICAgICAvLyBzaWduYWwgdGhyZWFkIHRvIHN0YXJ0CiAgICAgICAgIG1XYWl0V29ya0NWLmJyb2FkY2FzdCgpOwotICAgICAgICBpZiAobUFjdGl2ZVRyYWNrcy5pbmRleE9mKHJlY29yZFRyYWNrKSA8IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJSZWNvcmQgZmFpbGVkIHRvIHN0YXJ0Iik7Ci0gICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICBnb3RvIHN0YXJ0RXJyb3I7Ci0gICAgICAgIH0KICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9Ci0KLXN0YXJ0RXJyb3I6Ci0gICAgaWYgKHJlY29yZFRyYWNrLT5pc0V4dGVybmFsVHJhY2soKSkgewotICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcElucHV0KHJlY29yZFRyYWNrLT5wb3J0SWQoKSk7Ci0gICAgfQotICAgIHJlY29yZFRyYWNrLT5jbGVhclN5bmNTdGFydEV2ZW50KCk7Ci0gICAgLy8gRklYTUUgSSB3b25kZXIgd2h5IHdlIGRvIG5vdCByZXNldCB0aGUgc3RhdGUgaGVyZT8KLSAgICByZXR1cm4gc3RhdHVzOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpzeW5jU3RhcnRFdmVudENhbGxiYWNrKGNvbnN0IHdwPFN5bmNFdmVudD4mIGV2ZW50KQpAQCAtNzE4MSwyNCArNzUxNiwyNiBAQAogYm9vbCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6c3RvcChSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrKiByZWNvcmRUcmFjaykgewogICAgIEFMT0dWKCJSZWNvcmRUaHJlYWQ6OnN0b3AiKTsKICAgICBBdXRvTXV0ZXggX2wobUxvY2spOworICAgIC8vIGlmIHdlJ3JlIGludmFsaWQsIHdlIGNhbid0IGJlIG9uIHRoZSBBY3RpdmVUcmFja3MuCiAgICAgaWYgKG1BY3RpdmVUcmFja3MuaW5kZXhPZihyZWNvcmRUcmFjaykgPCAwIHx8IHJlY29yZFRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpQQVVTSU5HKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgLy8gbm90ZSB0aGF0IHRocmVhZExvb3AgbWF5IHN0aWxsIGJlIHByb2Nlc3NpbmcgdGhlIHRyYWNrIGF0IHRoaXMgcG9pbnQgW3dpdGhvdXQgbG9ja10KICAgICByZWNvcmRUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpQQVVTSU5HOwotICAgIC8vIHNpZ25hbCB0aHJlYWQgdG8gc3RvcAotICAgIG1XYWl0V29ya0NWLmJyb2FkY2FzdCgpOwotICAgIC8vIGRvIG5vdCB3YWl0IGZvciBtU3RhcnRTdG9wQ29uZCBpZiBleGl0aW5nCi0gICAgaWYgKGV4aXRQZW5kaW5nKCkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICB3aGlsZSAocmVjb3JkVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OlBBVVNJTkcgJiYgIXJlY29yZFRyYWNrLT5pc0ludmFsaWQoKSkgeworICAgICAgICBtV2FpdFdvcmtDVi5icm9hZGNhc3QoKTsgLy8gc2lnbmFsIHRocmVhZCB0byBzdG9wCisgICAgICAgIG1TdGFydFN0b3BDb25kLndhaXQobUxvY2spOwogICAgIH0KLSAgICAvLyBGSVhNRSBpbmNvcnJlY3QgdXNhZ2Ugb2Ygd2FpdDogbm8gZXhwbGljaXQgcHJlZGljYXRlIG9yIGxvb3AKLSAgICBtU3RhcnRTdG9wQ29uZC53YWl0KG1Mb2NrKTsKLSAgICAvLyBpZiB3ZSBoYXZlIGJlZW4gcmVzdGFydGVkLCByZWNvcmRUcmFjayBpcyBpbiBtQWN0aXZlVHJhY2tzIGhlcmUKLSAgICBpZiAoZXhpdFBlbmRpbmcoKSB8fCBtQWN0aXZlVHJhY2tzLmluZGV4T2YocmVjb3JkVHJhY2spIDwgMCkgeworCisgICAgaWYgKHJlY29yZFRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpQQVVTRUQpIHsgLy8gc3VjY2Vzc2Z1bCBzdG9wCiAgICAgICAgIEFMT0dWKCJSZWNvcmQgc3RvcHBlZCBPSyIpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CisKKyAgICAvLyBkb24ndCBoYW5kbGUgYW55dGhpbmcgLSB3ZSd2ZSBiZWVuIGludmFsaWRhdGVkIG9yIHJlc3RhcnRlZCBhbmQgaW4gYSBkaWZmZXJlbnQgc3RhdGUKKyAgICBBTE9HV19JRigiJXMoJWQpOiB1bnN5bmNocm9uaXplZCBzdG9wLCBzdGF0ZTogJWQiLAorICAgICAgICAgICAgX19mdW5jX18sIHJlY29yZFRyYWNrLT5pZCgpLCByZWNvcmRUcmFjay0+bVN0YXRlKTsKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKQEAgLTczMDAsNyArNzYzNyw4IEBACiAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IGlucHV0ICE9IE5VTEwgPyBpbnB1dC0+ZmxhZ3MgOiBBVURJT19JTlBVVF9GTEFHX05PTkU7CiAgICAgZHByaW50ZihmZCwgIiAgQXVkaW9TdHJlYW1JbjogJXAgZmxhZ3MgJSN4ICglcylcbiIsCiAgICAgICAgICAgICBpbnB1dCwgZmxhZ3MsIGlucHV0RmxhZ3NUb1N0cmluZyhmbGFncykuY19zdHIoKSk7Ci0gICAgaWYgKG1BY3RpdmVUcmFja3Muc2l6ZSgpID09IDApIHsKKyAgICBkcHJpbnRmKGZkLCAiICBGcmFtZXMgcmVhZDogJWxsZFxuIiwgKGxvbmcgbG9uZyltRnJhbWVzUmVhZCk7CisgICAgaWYgKG1BY3RpdmVUcmFja3MuaXNFbXB0eSgpKSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgIE5vIGFjdGl2ZSByZWNvcmQgY2xpZW50c1xuIik7CiAgICAgfQogCkBAIC03MzA5LDYgKzc2NDcsMTQgQEAKICAgICAgICAgKHZvaWQpaW5wdXQtPnN0cmVhbS0+ZHVtcChmZCk7CiAgICAgfQogCisgICAgY29uc3QgZG91YmxlIGxhdGVuY3lNcyA9IFJlY29yZFRyYWNrOjpjaGVja1NlcnZlckxhdGVuY3lTdXBwb3J0ZWQobUZvcm1hdCwgZmxhZ3MpCisgICAgICAgICAgICA/IC0gbVRpbWVzdGFtcC5nZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXMobVNhbXBsZVJhdGUpIDogMC47CisgICAgaWYgKGxhdGVuY3lNcyAhPSAwLikgeworICAgICAgICBkcHJpbnRmKGZkLCAiICBOb3JtYWxSZWNvcmQgbGF0ZW5jeSBtczogJS4ybGZcbiIsIGxhdGVuY3lNcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgTm9ybWFsUmVjb3JkIGxhdGVuY3kgbXM6IHVuYXZhaWxcbiIpOworICAgIH0KKwogICAgIGRwcmludGYoZmQsICIgIEZhc3QgY2FwdHVyZSB0aHJlYWQ6ICVzXG4iLCBoYXNGYXN0Q2FwdHVyZSgpID8gInllcyIgOiAibm8iKTsKICAgICBkcHJpbnRmKGZkLCAiICBGYXN0IHRyYWNrIGF2YWlsYWJsZTogJXNcbiIsIG1GYXN0VHJhY2tBdmFpbCA/ICJ5ZXMiIDogIm5vIik7CiAKQEAgLTczMTYsOSArNzY2Miw5IEBACiAgICAgLy8gd2hpbGUgd2UgYXJlIGR1bXBpbmcgaXQuICBJdCBtYXkgYmUgaW5jb25zaXN0ZW50LCBidXQgaXQgd29uJ3QgbXV0YXRlIQogICAgIC8vIFRoaXMgaXMgYSBsYXJnZSBvYmplY3Qgc28gd2UgcGxhY2UgaXQgb24gdGhlIGhlYXAuCiAgICAgLy8gRklYTUUgMjU5NzI5NTg6IE5lZWQgYW4gaW50ZWxsaWdlbnQgY29weSBjb25zdHJ1Y3RvciB0aGF0IGRvZXMgbm90IHRvdWNoIHVudXNlZCBwYWdlcy4KLSAgICBjb25zdCBGYXN0Q2FwdHVyZUR1bXBTdGF0ZSAqY29weSA9IG5ldyBGYXN0Q2FwdHVyZUR1bXBTdGF0ZShtRmFzdENhcHR1cmVEdW1wU3RhdGUpOworICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxGYXN0Q2FwdHVyZUR1bXBTdGF0ZT4gY29weSA9CisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEZhc3RDYXB0dXJlRHVtcFN0YXRlPihtRmFzdENhcHR1cmVEdW1wU3RhdGUpOwogICAgIGNvcHktPmR1bXAoZmQpOwotICAgIGRlbGV0ZSBjb3B5OwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpkdW1wVHJhY2tzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKQEAgLTczMzIsNyArNzY3OCw3IEBACiAgICAgaWYgKG51bXRyYWNrcykgewogICAgICAgICBkcHJpbnRmKGZkLCAiIG9mIHdoaWNoICV6dSBhcmUgYWN0aXZlXG4iLCBudW1hY3RpdmUpOwogICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7Ci0gICAgICAgIFJlY29yZFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CisgICAgICAgIG1UcmFja3NbMF0tPmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW10cmFja3MgOyArK2kpIHsKICAgICAgICAgICAgIHNwPFJlY29yZFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07CiAgICAgICAgICAgICBpZiAodHJhY2sgIT0gMCkgewpAQCAtNzM1Miw3ICs3Njk4LDcgQEAKICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICBUaGUgZm9sbG93aW5nIHRyYWNrcyBhcmUgaW4gdGhlIGFjdGl2ZSBsaXN0IGJ1dCIKICAgICAgICAgICAgICAgICAiIG5vdCBpbiB0aGUgdHJhY2sgbGlzdFxuIik7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKLSAgICAgICAgUmVjb3JkVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKKyAgICAgICAgbUFjdGl2ZVRyYWNrc1swXS0+YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bWFjdGl2ZTsgKytpKSB7CiAgICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldOwogICAgICAgICAgICAgaWYgKG1UcmFja3MuaW5kZXhPZih0cmFjaykgPCAwKSB7CkBAIC03NjQ3LDEwICs3OTkzLDE1IEBACiB7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gbUlucHV0LT5zdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygmbVNhbXBsZVJhdGUsICZtQ2hhbm5lbE1hc2ssICZtSEFMRm9ybWF0KTsKICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHJlc3VsdCAhPSBPSywgIkVycm9yIHJldHJpZXZpbmcgYXVkaW8gcHJvcGVydGllcyBmcm9tIEhBTDogJWQiLCByZXN1bHQpOwotICAgIG1DaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhtQ2hhbm5lbE1hc2spOwotICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUNoYW5uZWxDb3VudCA+IEZDQ184LCAiSEFMIGNoYW5uZWwgY291bnQgJWQgPiAlZCIsIG1DaGFubmVsQ291bnQsIEZDQ184KTsKICAgICBtRm9ybWF0ID0gbUhBTEZvcm1hdDsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpLCAiSEFMIGZvcm1hdCAlI3ggaXMgbm90IGxpbmVhciBwY20iLCBtRm9ybWF0KTsKKyAgICBtQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobUNoYW5uZWxNYXNrKTsKKyAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1DaGFubmVsQ291bnQgPiBGQ0NfOCwgIkhBTCBjaGFubmVsIGNvdW50ICVkID4gJWQiLAorICAgICAgICAgICAgICAgIG1DaGFubmVsQ291bnQsIEZDQ184KTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBDYW4gaGF2ZSBtb3JlIHRoYXQgRkNDXzggY2hhbm5lbHMgaW4gZW5jb2RlZCBzdHJlYW1zLgorICAgICAgICBBTE9HSSgiSEFMIGZvcm1hdCAlI3ggaXMgbm90IGxpbmVhciBwY20iLCBtRm9ybWF0KTsKKyAgICB9CiAgICAgcmVzdWx0ID0gbUlucHV0LT5zdHJlYW0tPmdldEZyYW1lU2l6ZSgmbUZyYW1lU2l6ZSk7CiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihyZXN1bHQgIT0gT0ssICJFcnJvciByZXRyaWV2aW5nIGZyYW1lIHNpemUgZnJvbSBIQUw6ICVkIiwgcmVzdWx0KTsKICAgICByZXN1bHQgPSBtSW5wdXQtPnN0cmVhbS0+Z2V0QnVmZmVyU2l6ZSgmbUJ1ZmZlclNpemUpOwpAQCAtNzc1NSw3ICs4MTA2LDcgQEAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjphZGRFZmZlY3RDaGFpbl9sKGNvbnN0IHNwPEVmZmVjdENoYWluPiYgY2hhaW4pCiB7CiAgICAgLy8gb25seSBvbmUgY2hhaW4gcGVyIGlucHV0IHRocmVhZAotICAgIGlmIChtRWZmZWN0Q2hhaW5zLnNpemUoKSAhPSAwKSB7CisgICAgaWYgKCFtRWZmZWN0Q2hhaW5zLmlzRW1wdHkoKSkgewogICAgICAgICBBTE9HVygiYWRkRWZmZWN0Q2hhaW5fbCgpIGFscmVhZHkgb25lIGNoYWluICVwIG9uIHRocmVhZCAlcCIsIGNoYWluLmdldCgpLCB0aGlzKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KQEAgLTc4NjAsMjQgKzgyMTEsMjggQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjphZGRQYXRjaFJlY29yZChjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmFkZFBhdGNoVHJhY2soY29uc3Qgc3A8UGF0Y2hSZWNvcmQ+JiByZWNvcmQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBtVHJhY2tzLmFkZChyZWNvcmQpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpkZWxldGVQYXRjaFJlY29yZChjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmRlbGV0ZVBhdGNoVHJhY2soY29uc3Qgc3A8UGF0Y2hSZWNvcmQ+JiByZWNvcmQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBkZXN0cm95VHJhY2tfbChyZWNvcmQpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKIHsKLSAgICBUaHJlYWRCYXNlOjpnZXRBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKKyAgICBUaHJlYWRCYXNlOjp0b0F1ZGlvUG9ydENvbmZpZyhjb25maWcpOwogICAgIGNvbmZpZy0+cm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TSU5LOwogICAgIGNvbmZpZy0+ZXh0Lm1peC5od19tb2R1bGUgPSBtSW5wdXQtPmF1ZGlvSHdEZXYtPmhhbmRsZSgpOwogICAgIGNvbmZpZy0+ZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9IG1BdWRpb1NvdXJjZTsKKyAgICBpZiAobUlucHV0ICYmIG1JbnB1dC0+ZmxhZ3MgIT0gQVVESU9fSU5QVVRfRkxBR19OT05FKSB7CisgICAgICAgIGNvbmZpZy0+Y29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfRkxBR1M7CisgICAgICAgIGNvbmZpZy0+ZmxhZ3MuaW5wdXQgPSBtSW5wdXQtPmZsYWdzOworICAgIH0KIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNzk2NCw3ICs4MzE5LDcgQEAKICAgICB9CiAgICAgLy8gVGhpcyB3aWxsIGRlY3JlbWVudCByZWZlcmVuY2VzIGFuZCBtYXkgY2F1c2UgdGhlIGRlc3RydWN0aW9uIG9mIHRoaXMgdGhyZWFkLgogICAgIGlmIChpc091dHB1dCgpKSB7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG1JZCwgc3RyZWFtVHlwZSgpLCBtU2Vzc2lvbklkKTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQobVBvcnRJZCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChtUG9ydElkKTsKICAgICB9CkBAIC04MDc2LDIxICs4NDMxLDIwIEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgYm9vbCBzaWxlbmNlZCA9IGZhbHNlOwogICAgIGlmIChpc091dHB1dCgpKSB7Ci0gICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpzdGFydE91dHB1dChtSWQsIHN0cmVhbVR5cGUoKSwgbVNlc3Npb25JZCk7CisgICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpzdGFydE91dHB1dChwb3J0SWQpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpzdGFydElucHV0KHBvcnRJZCwgJnNpbGVuY2VkKTsKKyAgICAgICAgcmV0ID0gQXVkaW9TeXN0ZW06OnN0YXJ0SW5wdXQocG9ydElkKTsKICAgICB9CiAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIC8vIGFib3J0IGlmIHN0YXJ0IGlzIHJlamVjdGVkIGJ5IGF1ZGlvIHBvbGljeSBtYW5hZ2VyCiAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HRSgiJXM6IGVycm9yIHN0YXJ0IHJlamVjdGVkIGJ5IEF1ZGlvUG9saWN5TWFuYWdlciA9ICVkIiwgX19GVU5DVElPTl9fLCByZXQpOwotICAgICAgICBpZiAobUFjdGl2ZVRyYWNrcy5zaXplKCkgIT0gMCkgeworICAgICAgICBpZiAoIW1BY3RpdmVUcmFja3MuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgIGlmIChpc091dHB1dCgpKSB7Ci0gICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQobUlkLCBzdHJlYW1UeXBlKCksIG1TZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KHBvcnRJZCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQocG9ydElkKTsKICAgICAgICAgICAgIH0KQEAgLTgxMDEsMjEgKzg0NTUsMjEgQEAKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KIAorICAgIC8vIEdpdmVuIHRoYXQgTW1hcFRocmVhZDo6bUF0dHIgaXMgbXV0YWJsZSwgc2hvdWxkIGEgTW1hcFRyYWNrIGhhdmUgYXR0cmlidXRlcyA/CisgICAgc3A8TW1hcFRyYWNrPiB0cmFjayA9IG5ldyBNbWFwVHJhY2sodGhpcywgbUF0dHIsIG1TYW1wbGVSYXRlLCBtRm9ybWF0LCBtQ2hhbm5lbE1hc2ssIG1TZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNPdXRwdXQoKSwgY2xpZW50LmNsaWVudFVpZCwgY2xpZW50LmNsaWVudFBpZCwgcG9ydElkKTsKKwogICAgIGlmIChpc091dHB1dCgpKSB7CiAgICAgICAgIC8vIGZvcmNlIHZvbHVtZSB1cGRhdGUgd2hlbiBhIG5ldyB0cmFjayBpcyBhZGRlZAogICAgICAgICBtSGFsVm9sRmxvYXQgPSAtMS4wZjsKLSAgICB9IGVsc2UgaWYgKCFzaWxlbmNlZCkgewotICAgICAgICBmb3IgKGNvbnN0IHNwPE1tYXBUcmFjaz4gJnRyYWNrIDogbUFjdGl2ZVRyYWNrcykgewotICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1NpbGVuY2VkX2woKSAmJiB0cmFjay0+dWlkKCkgIT0gY2xpZW50LmNsaWVudFVpZCkKLSAgICAgICAgICAgICAgICB0cmFjay0+aW52YWxpZGF0ZSgpOworICAgIH0gZWxzZSBpZiAoIXRyYWNrLT5pc1NpbGVuY2VkX2woKSkgeworICAgICAgICBmb3IgKGNvbnN0IHNwPE1tYXBUcmFjaz4gJnQgOiBtQWN0aXZlVHJhY2tzKSB7CisgICAgICAgICAgICBpZiAodC0+aXNTaWxlbmNlZF9sKCkgJiYgdC0+dWlkKCkgIT0gY2xpZW50LmNsaWVudFVpZCkKKyAgICAgICAgICAgICAgICB0LT5pbnZhbGlkYXRlKCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBHaXZlbiB0aGF0IE1tYXBUaHJlYWQ6Om1BdHRyIGlzIG11dGFibGUsIHNob3VsZCBhIE1tYXBUcmFjayBoYXZlIGF0dHJpYnV0ZXMgPwotICAgIHNwPE1tYXBUcmFjaz4gdHJhY2sgPSBuZXcgTW1hcFRyYWNrKHRoaXMsIG1BdHRyLCBtU2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxNYXNrLCBtU2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5jbGllbnRVaWQsIGNsaWVudC5jbGllbnRQaWQsIHBvcnRJZCk7CiAKLSAgICB0cmFjay0+c2V0U2lsZW5jZWRfbChzaWxlbmNlZCk7CiAgICAgbUFjdGl2ZVRyYWNrcy5hZGQodHJhY2spOwogICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IGdldEVmZmVjdENoYWluX2wobVNlc3Npb25JZCk7CiAgICAgaWYgKGNoYWluICE9IDApIHsKQEAgLTgxNjIsOCArODUxNiw4IEBACiAKICAgICBtTG9jay51bmxvY2soKTsKICAgICBpZiAoaXNPdXRwdXQoKSkgewotICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dChtSWQsIHN0cmVhbVR5cGUoKSwgdHJhY2stPnNlc3Npb25JZCgpKTsKLSAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQobUlkLCBzdHJlYW1UeXBlKCksIHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KHRyYWNrLT5wb3J0SWQoKSk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KHRyYWNrLT5wb3J0SWQoKSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BJbnB1dCh0cmFjay0+cG9ydElkKCkpOwogICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KHRyYWNrLT5wb3J0SWQoKSk7CkBAIC04MTg4LDcgKzg1NDIsNyBAQAogICAgIGlmIChtSGFsU3RyZWFtID09IDApIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIGlmIChtQWN0aXZlVHJhY2tzLnNpemUoKSAhPSAwKSB7CisgICAgaWYgKCFtQWN0aXZlVHJhY2tzLmlzRW1wdHkoKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIG1IYWxTdHJlYW0tPnN0YW5kYnkoKTsKQEAgLTg0NTksOSArODgxMyw5IEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6OmdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3ZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKIHsKLSAgICBUaHJlYWRCYXNlOjpnZXRBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKKyAgICBUaHJlYWRCYXNlOjp0b0F1ZGlvUG9ydENvbmZpZyhjb25maWcpOwogICAgIGlmIChpc091dHB1dCgpKSB7CiAgICAgICAgIGNvbmZpZy0+cm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7CiAgICAgICAgIGNvbmZpZy0+ZXh0Lm1peC5od19tb2R1bGUgPSBtQXVkaW9Id0Rldi0+aGFuZGxlKCk7CkBAIC04NjI2LDcgKzg5ODAsNyBAQAogICAgIGRwcmludGYoZmQsICIgIEF0dHJpYnV0ZXM6IGNvbnRlbnQgdHlwZSAlZCB1c2FnZSAlZCBzb3VyY2UgJWRcbiIsCiAgICAgICAgICAgICBtQXR0ci5jb250ZW50X3R5cGUsIG1BdHRyLnVzYWdlLCBtQXR0ci5zb3VyY2UpOwogICAgIGRwcmludGYoZmQsICIgIFNlc3Npb246ICVkIHBvcnQgSWQ6ICVkXG4iLCBtU2Vzc2lvbklkLCBtUG9ydElkKTsKLSAgICBpZiAobUFjdGl2ZVRyYWNrcy5zaXplKCkgPT0gMCkgeworICAgIGlmIChtQWN0aXZlVHJhY2tzLmlzRW1wdHkoKSkgewogICAgICAgICBkcHJpbnRmKGZkLCAiICBObyBhY3RpdmUgY2xpZW50c1xuIik7CiAgICAgfQogfQpAQCAtODYzOSw3ICs4OTkzLDcgQEAKICAgICBjb25zdCBjaGFyICpwcmVmaXggPSAiICAgICI7CiAgICAgaWYgKG51bXRyYWNrcykgewogICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7Ci0gICAgICAgIE1tYXBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOworICAgICAgICBtQWN0aXZlVHJhY2tzWzBdLT5hcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtdHJhY2tzIDsgKytpKSB7CiAgICAgICAgICAgICBzcDxNbWFwVHJhY2s+IHRyYWNrID0gbUFjdGl2ZVRyYWNrc1tpXTsKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKQEAgLTg4NDUsNiArOTE5OSwxNSBAQAogICAgIH0KIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBQbGF5YmFja1RocmVhZDo6dG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit7CisgICAgTW1hcFRocmVhZDo6dG9BdWRpb1BvcnRDb25maWcoY29uZmlnKTsKKyAgICBpZiAobU91dHB1dCAmJiBtT3V0cHV0LT5mbGFncyAhPSBBVURJT19PVVRQVVRfRkxBR19OT05FKSB7CisgICAgICAgIGNvbmZpZy0+Y29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfRkxBR1M7CisgICAgICAgIGNvbmZpZy0+ZmxhZ3Mub3V0cHV0ID0gbU91dHB1dC0+ZmxhZ3M7CisgICAgfQorfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFBsYXliYWNrVGhyZWFkOjpkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKIHsKICAgICBNbWFwVGhyZWFkOjpkdW1wSW50ZXJuYWxzKGZkLCBhcmdzKTsKQEAgLTg4NjcsNyArOTIzMCwxMyBAQAogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Ok1tYXBDYXB0dXJlVGhyZWFkOjpleGl0U3RhbmRieSgpCiB7Ci0gICAgbUlucHV0LT5zdHJlYW0tPnNldEdhaW4oMS4wZik7CisgICAgeworICAgICAgICAvLyBtSW5wdXQgbWlnaHQgaGF2ZSBiZWVuIGNsZWFyZWQgYnkgY2xlYXJJbnB1dCgpCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIGlmIChtSW5wdXQgIT0gbnVsbHB0ciAmJiBtSW5wdXQtPnN0cmVhbSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtSW5wdXQtPnN0cmVhbS0+c2V0R2FpbigxLjBmKTsKKyAgICAgICAgfQorICAgIH0KICAgICByZXR1cm4gTW1hcFRocmVhZDo6ZXhpdFN0YW5kYnkoKTsKIH0KIApAQCAtODkzNSw0ICs5MzA0LDEzIEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcENhcHR1cmVUaHJlYWQ6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQoreworICAgIE1tYXBUaHJlYWQ6OnRvQXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CisgICAgaWYgKG1JbnB1dCAmJiBtSW5wdXQtPmZsYWdzICE9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSkgeworICAgICAgICBjb25maWctPmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOworICAgICAgICBjb25maWctPmZsYWdzLmlucHV0ID0gbUlucHV0LT5mbGFnczsKKyAgICB9Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oCmluZGV4IGVhMjk0NTUuLmU4YjIxNTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaApAQCAtMjgxLDcgKzI4MSw3IEBACiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgY3JlYXRlQXVkaW9QYXRjaF9sKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpID0gMDsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICByZWxlYXNlQXVkaW9QYXRjaF9sKGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgPSAwOwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgPSAwOworICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSA9IDA7CiAKIAogICAgICAgICAgICAgICAgIC8vIHNlZSBub3RlIGF0IGRlY2xhcmF0aW9uIG9mIG1TdGFuZGJ5LCBtT3V0RGV2aWNlIGFuZCBtSW5EZXZpY2UKQEAgLTM5Myw2ICszOTMsMTIgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgYnJvYWRjYXN0X2woKTsKIAorICAgICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNUaW1lc3RhbXBDb3JyZWN0aW9uRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgIGlzTXNkRGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbUlzTXNkRGV2aWNlOyB9CisKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICAgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSA9IDA7CisKICAgICBtdXRhYmxlICAgICBNdXRleCAgICAgICAgICAgICAgICAgICBtTG9jazsKIAogcHJvdGVjdGVkOgpAQCAtNDM0LDYgKzQ0MCwxMiBAQAogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHNldE1hc3Rlck1vbm9fbChib29sIG1vbm8gX191bnVzZWQpIHsgfQogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHJlcXVpcmVNb25vQmxlbmQoKSB7IHJldHVybiBmYWxzZTsgfQogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsbGVkIHdpdGhpbiB0aGUgdGhyZWFkTG9vcCB0byBvYnRhaW4gdGltZXN0YW1wIGZyb20gdGhlIEhBTC4KKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICB0aHJlYWRsb29wX2dldEhhbFRpbWVzdGFtcF9sKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgKnRpbWVzdGFtcCBfX3VudXNlZCkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgZnJpZW5kIGNsYXNzIEF1ZGlvRmxpbmdlcjsgICAgICAvLyBmb3IgbUVmZmVjdENoYWlucwogCiAgICAgICAgICAgICAgICAgY29uc3QgdHlwZV90ICAgICAgICAgICAgbVR5cGU7CkBAIC00OTMsMTAgKzUwNSwxNyBAQAogICAgICAgICAgICAgICAgIHNwPE5CTG9nOjpXcml0ZXI+ICAgICAgIG1OQkxvZ1dyaXRlcjsKICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICBtU3lzdGVtUmVhZHk7CiAgICAgICAgICAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgICAgICAgbVRpbWVzdGFtcDsKKyAgICAgICAgICAgICAgICBUaW1lc3RhbXBWZXJpZmllcjwgLy8gRm9yIHRpbWVzdGFtcCBzdGF0aXN0aWNzLgorICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAvKiBmcmFtZSBjb3VudCAqLywgaW50NjRfdCAvKiB0aW1lIG5zICovPiBtVGltZXN0YW1wVmVyaWZpZXI7CisgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgbVRpbWVzdGFtcENvcnJlY3RlZERldmljZXMgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICBtSXNNc2REZXZpY2UgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAvLyBBIGNvbmRpdGlvbiB0aGF0IG11c3QgYmUgZXZhbHVhdGVkIGJ5IHRoZSB0aHJlYWQgbG9vcCBoYXMgY2hhbmdlZCBhbmQKICAgICAgICAgICAgICAgICAvLyB3ZSBtdXN0IG5vdCB3YWl0IGZvciBhc3luYyB3cml0ZSBjYWxsYmFjayBpbiB0aGUgdGhyZWFkIGxvb3AgYmVmb3JlIGV2YWx1YXRpbmcgaXQKICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICBtU2lnbmFsUGVuZGluZzsKIAorI2lmZGVmIFRFRV9TSU5LCisgICAgICAgICAgICAgICAgTkJBSU9fVGVlICAgICAgICAgICAgICAgbVRlZTsKKyNlbmRpZgogICAgICAgICAgICAgICAgIC8vIEFjdGl2ZVRyYWNrcyBpcyBhIHNvcnRlZCB2ZWN0b3Igb2YgdHJhY2sgdHlwZSBUIHJlcHJlc2VudGluZyB0aGUKICAgICAgICAgICAgICAgICAvLyBhY3RpdmUgdHJhY2tzIG9mIHRocmVhZExvb3AoKSB0byBiZSBjb25zaWRlcmVkIGJ5IHRoZSBsb2NrZWQgcHJlcGFyZSBwb3J0aW9uLgogICAgICAgICAgICAgICAgIC8vIEFjdGl2ZVRyYWNrcyBzaG91bGQgYmUgYWNjZXNzZWQgd2l0aCB0aGUgVGhyZWFkQmFzZSBsb2NrIGhlbGQuCkBAIC01NDMsNiArNTYyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIHNpemUoKSBjb25zdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUFjdGl2ZVRyYWNrcy5zaXplKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgIGlzRW1wdHkoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUFjdGl2ZVRyYWNrcy5pc0VtcHR5KCk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIGluZGV4T2YoY29uc3Qgc3A8VD4mIGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtQWN0aXZlVHJhY2tzLmluZGV4T2YoaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTY0NSw3ICs2NjcsNyBAQAogICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCB0eXBlX3QgdHlwZSwgYm9vbCBzeXN0ZW1SZWFkeSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+UGxheWJhY2tUaHJlYWQoKTsKIAotICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgb3ZlcnJpZGU7CiAKICAgICAvLyBUaHJlYWQgdmlydHVhbHMKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICB0aHJlYWRMb29wKCk7CkBAIC03ODQsNyArODA2LDcgQEAKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBhZGRQYXRjaFRyYWNrKGNvbnN0IHNwPFBhdGNoVHJhY2s+JiB0cmFjayk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZGVsZXRlUGF0Y2hUcmFjayhjb25zdCBzcDxQYXRjaFRyYWNrPiYgdHJhY2spOwogCi0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZ2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CiAKICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGFzeW5jaHJvbm91cyBzaWduYWwgd2FpdCB0aW1lLgogICAgIHZpcnR1YWwgICAgIGludDY0X3QgICAgIGNvbXB1dGVXYWl0VGltZU5zX2woKSBjb25zdCB7IHJldHVybiBJTlQ2NF9NQVg7IH0KQEAgLTgwMSw2ICs4MjMsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1UcmFja3Muc2l6ZSgpIDwgUGxheWJhY2tUaHJlYWQ6OmtNYXhUcmFja3M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgaXNUaW1lc3RhbXBDb3JyZWN0aW9uRW5hYmxlZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dERldmljZSAmIG1UaW1lc3RhbXBDb3JyZWN0ZWREZXZpY2VzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXVkaW9faXNfb3V0cHV0X2RldmljZXMoZGV2aWNlKSAmJiBwb3Bjb3VudChkZXZpY2UpID4gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiBwcm90ZWN0ZWQ6CiAgICAgLy8gdXBkYXRlZCBieSByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCkKICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50OyAgLy8gbm9ybWFsIG1peGVyIGFuZCBlZmZlY3RzCkBAIC04ODAsNiArOTA3LDExIEBACiAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuOwogICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1dyaXR0ZW47IC8vIG5vdCByZXNldCBvbiBzdGFuZGJ5CiAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICBtU3VzcGVuZGVkRnJhbWVzOyAvLyBub3QgcmVzZXQgb24gc3RhbmRieQorCisgICAgLy8gbUhhcHRpY0NoYW5uZWxNYXNrIGFuZCBtSGFwdGljQ2hhbm5lbENvdW50IHdpbGwgb25seSBiZSB2YWxpZCB3aGVuIHRoZSB0aHJlYWQgc3VwcG9ydAorICAgIC8vIGhhcHRpYyBwbGF5YmFjay4KKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCAgICAgICAgICAgIG1IYXB0aWNDaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIG1IYXB0aWNDaGFubmVsQ291bnQgPSAwOwogcHJpdmF0ZToKICAgICAvLyBtTWFzdGVyTXV0ZSBpcyBpbiBib3RoIFBsYXliYWNrVGhyZWFkIGFuZCBpbiBBdWRpb0ZsaW5nZXIuICBXaGVuIGEKICAgICAvLyBQbGF5YmFja1RocmVhZCBuZWVkcyB0byBmaW5kIG91dCBpZiBtYXN0ZXItbXV0ZWQsIGl0IGNoZWNrcyBpdCdzIGxvY2FsCkBAIC05MzUsMTYgKzk2NywxOSBAQAogICAgIHZpcnR1YWwgdm9pZCBkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAgICAgdm9pZCAgICAgICAgZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCi0gICAgLy8gVGhlIFRyYWNrcyBjbGFzcyBtYW5hZ2VzIG5hbWVzIGZvciBhbGwgdHJhY2tzCi0gICAgLy8gYWRkZWQgYW5kIHJlbW92ZWQgZnJvbSB0aGUgVGhyZWFkLgorICAgIC8vIFRoZSBUcmFja3MgY2xhc3MgbWFuYWdlcyB0cmFja3MgYWRkZWQgYW5kIHJlbW92ZWQgZnJvbSB0aGUgVGhyZWFkLgogICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogICAgIGNsYXNzIFRyYWNrcyB7CiAgICAgcHVibGljOgotICAgICAgICBUcmFja3MoYm9vbCBzYXZlRGVsZXRlZFRyYWNrTmFtZXMpIDoKLSAgICAgICAgICAgIG1TYXZlRGVsZXRlZFRyYWNrTmFtZXMoc2F2ZURlbGV0ZWRUcmFja05hbWVzKSB7IH0KKyAgICAgICAgVHJhY2tzKGJvb2wgc2F2ZURlbGV0ZWRUcmFja0lkcykgOgorICAgICAgICAgICAgbVNhdmVEZWxldGVkVHJhY2tJZHMoc2F2ZURlbGV0ZWRUcmFja0lkcykgeyB9CiAKICAgICAgICAgLy8gU29ydGVkVmVjdG9yIG1ldGhvZHMKLSAgICAgICAgc3NpemVfdCAgICAgICAgIGFkZChjb25zdCBzcDxUPiAmdHJhY2spOworICAgICAgICBzc2l6ZV90ICAgICAgICAgYWRkKGNvbnN0IHNwPFQ+ICZ0cmFjaykgeworICAgICAgICAgICAgY29uc3Qgc3NpemVfdCBpbmRleCA9IG1UcmFja3MuYWRkKHRyYWNrKTsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaW5kZXggPCAwLCAiY2Fubm90IGFkZCB0cmFjayIpOworICAgICAgICAgICAgcmV0dXJuIGluZGV4OworICAgICAgICB9CiAgICAgICAgIHNzaXplX3QgICAgICAgICByZW1vdmUoY29uc3Qgc3A8VD4gJnRyYWNrKTsKICAgICAgICAgc2l6ZV90ICAgICAgICAgIHNpemUoKSBjb25zdCB7CiAgICAgICAgICAgICByZXR1cm4gbVRyYWNrcy5zaXplKCk7CkBAIC05NjUsMjggKzEwMDAsMTkgQEAKICAgICAgICAgICAgIHJldHVybiBtVHJhY2tzLmVuZCgpOwogICAgICAgICB9CiAKLSAgICAgICAgc2l6ZV90ICAgICAgICAgIHByb2Nlc3NEZWxldGVkVHJhY2tOYW1lcyhzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50KT4gZikgewotICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHNpemUgPSBtRGVsZXRlZFRyYWNrTmFtZXMuc2l6ZSgpOwotICAgICAgICAgICAgaWYgKHNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpbnQgbmFtZSA6IG1EZWxldGVkVHJhY2tOYW1lcykgewotICAgICAgICAgICAgICAgICAgICBmKG5hbWUpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgc2l6ZV90ICAgICAgICAgIHByb2Nlc3NEZWxldGVkVHJhY2tJZHMoc3RkOjpmdW5jdGlvbjx2b2lkKGludCk+IGYpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgaW50IHRyYWNrSWQgOiBtRGVsZXRlZFRyYWNrSWRzKSB7CisgICAgICAgICAgICAgICAgZih0cmFja0lkKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzaXplOworICAgICAgICAgICAgcmV0dXJuIG1EZWxldGVkVHJhY2tJZHMuc2l6ZSgpOwogICAgICAgICB9CiAKLSAgICAgICAgdm9pZCAgICAgICAgICAgIGNsZWFyRGVsZXRlZFRyYWNrTmFtZXMoKSB7IG1EZWxldGVkVHJhY2tOYW1lcy5jbGVhcigpOyB9CisgICAgICAgIHZvaWQgICAgICAgICAgICBjbGVhckRlbGV0ZWRUcmFja0lkcygpIHsgbURlbGV0ZWRUcmFja0lkcy5jbGVhcigpOyB9CiAKICAgICBwcml2YXRlOgotICAgICAgICAvLyBUcmFjayBuYW1lcyBwZW5kaW5nIGRlbGV0aW9uIGZvciBNSVhFUiB0eXBlIHRocmVhZHMKLSAgICAgICAgY29uc3QgYm9vbCBtU2F2ZURlbGV0ZWRUcmFja05hbWVzOyAvLyB0cnVlIHRvIGVuYWJsZSB0cmFja2luZwotICAgICAgICBzdGQ6OnNldDxpbnQ+IG1EZWxldGVkVHJhY2tOYW1lczsKLQotICAgICAgICAvLyBGYXN0IGxvb2t1cCBvZiBwcmV2aW91c2x5IGRlbGV0ZWQgdHJhY2sgbmFtZXMgZm9yIHJldXNlLgotICAgICAgICAvLyBUaGlzIGlzIGFuIGFyYml0cmFyeSBkZWNpc2lvbiAoYWN0dWFsbHkgYW55IG5vbi1uZWdhdGl2ZQotICAgICAgICAvLyBpbnRlZ2VyIHRoYXQgaXNuJ3QgaW4gbVRyYWNrc1sqXS0+bmFtZXMoKSBjb3VsZCBiZSB1c2VkKSAtIHdlIGF0dGVtcHQKLSAgICAgICAgLy8gdG8gdXNlIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSBhdmFpbGFibGUgbmFtZS4KLSAgICAgICAgc3RkOjpzZXQ8aW50PiBtVW51c2VkVHJhY2tOYW1lczsKKyAgICAgICAgLy8gVHJhY2tzIHBlbmRpbmcgZGVsZXRpb24gZm9yIE1JWEVSIHR5cGUgdGhyZWFkcworICAgICAgICBjb25zdCBib29sIG1TYXZlRGVsZXRlZFRyYWNrSWRzOyAvLyB0cnVlIHRvIGVuYWJsZSB0cmFja2luZworICAgICAgICBzdGQ6OnNldDxpbnQ+IG1EZWxldGVkVHJhY2tJZHM7CiAKICAgICAgICAgU29ydGVkVmVjdG9yPHNwPFQ+PiBtVHJhY2tzOyAvLyB3cmFwcGVkIFNvcnRlZFZlY3Rvci4KICAgICB9OwpAQCAtMTA1NiwxNiArMTA4MiwxMyBAQAogICAgIHNwPE5CQUlPX1Npbms+ICAgICAgICAgIG1QaXBlU2luazsKICAgICAvLyBUaGUgY3VycmVudCBzaW5rIGZvciB0aGUgbm9ybWFsIG1peGVyIHRvIHdyaXRlIGl0J3MgKHN1YiltaXgsIG1PdXRwdXRTaW5rIG9yIG1QaXBlU2luawogICAgIHNwPE5CQUlPX1Npbms+ICAgICAgICAgIG1Ob3JtYWxTaW5rOwotI2lmZGVmIFRFRV9TSU5LCi0gICAgLy8gRm9yIGR1bXBzeXMKLSAgICBzcDxOQkFJT19TaW5rPiAgICAgICAgICBtVGVlU2luazsKLSAgICBzcDxOQkFJT19Tb3VyY2U+ICAgICAgICBtVGVlU291cmNlOwotI2VuZGlmCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVNjcmVlblN0YXRlOyAgIC8vIGNhY2hlZCBjb3B5IG9mIGdTY3JlZW5TdGF0ZQogICAgIC8vIFRPRE86IGFkZCBjb21tZW50IGFuZCBhZGp1c3Qgc2l6ZSBhcyBuZWVkZWQKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90ICAgICBrRmFzdE1peGVyTG9nU2l6ZSA9IDggKiAxMDI0OwogICAgIHNwPE5CTG9nOjpXcml0ZXI+ICAgICAgIG1GYXN0TWl4ZXJOQkxvZ1dyaXRlcjsKIAorICAgIC8vIERvd25zdHJlYW0gcGF0Y2ggbGF0ZW5jeSwgYXZhaWxhYmxlIGlmIG1Eb3duc3RyZWFtTGF0ZW5jeVN0YXRNcy5nZXROKCkgPiAwLgorICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbURvd25zdHJlYW1MYXRlbmN5U3RhdE1zezAuOTk5fTsKIAogcHVibGljOgogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGhhc0Zhc3RNaXhlcigpIGNvbnN0ID0gMDsKQEAgLTExMjEsNyArMTE0NCw2IEBACiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgdGhyZWFkTG9vcF9zdGFuZGJ5KCk7CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgdGhyZWFkTG9vcF9taXgoKTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0aHJlYWRMb29wX3NsZWVwVGltZSgpOwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRocmVhZExvb3BfcmVtb3ZlVHJhY2tzKGNvbnN0IFZlY3Rvcjwgc3A8VHJhY2s+ID4mIHRyYWNrc1RvUmVtb3ZlKTsKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBjb3JyZWN0TGF0ZW5jeV9sKHVpbnQzMl90IGxhdGVuY3kpIGNvbnN0OwogCiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgY3JlYXRlQXVkaW9QYXRjaF9sKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCkBAIC0xMTU0LDYgKzExNzYsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtRmFzdE1peGVyRHVtcFN0YXRlLm1UcmFja3NbZmFzdEluZGV4XS5tVW5kZXJydW5zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHRocmVhZGxvb3BfZ2V0SGFsVGltZXN0YW1wX2woCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbmRlZFRpbWVzdGFtcCAqdGltZXN0YW1wKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtTm9ybWFsU2luay5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbU5vcm1hbFNpbmstPmdldFRpbWVzdGFtcCgqdGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICBzZXRNYXN0ZXJNb25vX2woYm9vbCBtb25vKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hc3Rlck1vbm8uc3RvcmUobW9ubyk7CkBAIC0xMTc0LDYgKzEyMDQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgYm9vbCBzeXN0ZW1SZWFkeSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfkRpcmVjdE91dHB1dFRocmVhZCgpOwogCisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCk7CisKICAgICAvLyBUaHJlYWQgdmlydHVhbHMKIAogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGNoZWNrRm9yTmV3UGFyYW1ldGVyX2woY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlyLApAQCAtMTIxMSw2ICsxMjQzLDIzIEBACiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgaGFzRmFzdE1peGVyKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KIAogICAgIHZpcnR1YWwgICAgIGludDY0X3QgICAgIGNvbXB1dGVXYWl0VGltZU5zX2woKSBjb25zdCBvdmVycmlkZTsKKworICAgIHN0YXR1c190ICAgIHRocmVhZGxvb3BfZ2V0SGFsVGltZXN0YW1wX2woRXh0ZW5kZWRUaW1lc3RhbXAgKnRpbWVzdGFtcCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgICAgICAvLyBGb3IgRElSRUNUIGFuZCBPRkZMT0FEIHRocmVhZHMsIHF1ZXJ5IHRoZSBvdXRwdXQgc2luayBkaXJlY3RseS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1PdXRwdXQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdXBvc2l0aW9uNjQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgdGltZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtT3V0cHV0LT5nZXRQcmVzZW50YXRpb25Qb3NpdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVwb3NpdGlvbjY0LCAmdGltZSkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAoaW50NjRfdCl1cG9zaXRpb242NDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gYXVkaW9fdXRpbHNfbnNfZnJvbV90aW1lc3BlYygmdGltZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICB9CiB9OwogCiBjbGFzcyBPZmZsb2FkVGhyZWFkIDogcHVibGljIERpcmVjdE91dHB1dFRocmVhZCB7CkBAIC0xMzE4LDYgKzEzNjcsMjIgQEAKICAgICBTb3J0ZWRWZWN0b3IgPCBzcDxPdXRwdXRUcmFjaz4gPiAgbU91dHB1dFRyYWNrczsKIHB1YmxpYzoKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBoYXNGYXN0TWl4ZXIoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHRocmVhZGxvb3BfZ2V0SGFsVGltZXN0YW1wX2woCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbmRlZFRpbWVzdGFtcCAqdGltZXN0YW1wKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIGlmIChtT3V0cHV0VHJhY2tzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIC8vIGZvcndhcmQgdGhlIGZpcnN0IE91dHB1dFRyYWNrJ3Mga2VybmVsIGluZm9ybWF0aW9uIGZvciB0aW1lc3RhbXAuCisgICAgICAgICAgICBjb25zdCBFeHRlbmRlZFRpbWVzdGFtcCB0cmFja1RpbWVzdGFtcCA9CisgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRUcmFja3NbMF0tPmdldENsaWVudFByb3h5VGltZXN0YW1wKCk7CisgICAgICAgICAgICBpZiAodHJhY2tUaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA+IDApIHsKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tUaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXTsKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja1RpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOyAgLy8gZGlzY2FyZCBzZXJ2ZXIgdGltZXN0YW1wIC0gdGhhdCdzIGlnbm9yZWQuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KIH07CiAKIC8vIHJlY29yZCB0aHJlYWQKQEAgLTEzNzYsOSArMTQ0MSw2IEBACiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgYm9vbCBzeXN0ZW1SZWFkeQotI2lmZGVmIFRFRV9TSU5LCi0gICAgICAgICAgICAgICAgICAgICwgY29uc3Qgc3A8TkJBSU9fU2luaz4mIHRlZVNpbmsKLSNlbmRpZgogICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgdmlydHVhbCAgICAgflJlY29yZFRocmVhZCgpOwogCkBAIC0xNDI1LDcgKzE0ODcsNyBAQAogICAgICAgICAgICAgLy8gcmV0dXJuIHRydWUgaWYgdGhlIGNhbGxlciBzaG91bGQgdGhlbiBkbyBpdCdzIHBhcnQgb2YgdGhlIHN0b3BwaW5nIHByb2Nlc3MKICAgICAgICAgICAgIGJvb2wgICAgICAgIHN0b3AoUmVjb3JkVHJhY2sqIHJlY29yZFRyYWNrKTsKIAotICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIG92ZXJyaWRlOwogICAgICAgICAgICAgQXVkaW9TdHJlYW1JbiogY2xlYXJJbnB1dCgpOwogICAgICAgICAgICAgdmlydHVhbCBzcDxTdHJlYW1IYWxJbnRlcmZhY2U+IHN0cmVhbSgpIGNvbnN0OwogCkBAIC0xNDM5LDggKzE1MDEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcmVsZWFzZUF1ZGlvUGF0Y2hfbChjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOwogCi0gICAgICAgICAgICB2b2lkICAgICAgICBhZGRQYXRjaFJlY29yZChjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICBkZWxldGVQYXRjaFJlY29yZChjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCk7CisgICAgICAgICAgICB2b2lkICAgICAgICBhZGRQYXRjaFRyYWNrKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGRlbGV0ZVBhdGNoVHJhY2soY29uc3Qgc3A8UGF0Y2hSZWNvcmQ+JiByZWNvcmQpOwogCiAgICAgICAgICAgICB2b2lkICAgICAgICByZWFkSW5wdXRQYXJhbWV0ZXJzX2woKTsKICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgIGdldElucHV0RnJhbWVzTG9zdCgpOwpAQCAtMTQ2MSw3ICsxNTIzLDcgQEAKIAogICAgIHZpcnR1YWwgc2l6ZV90ICAgICAgZnJhbWVDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1GcmFtZUNvdW50OyB9CiAgICAgICAgICAgICBib29sICAgICAgICBoYXNGYXN0Q2FwdHVyZSgpIGNvbnN0IHsgcmV0dXJuIG1GYXN0Q2FwdHVyZSAhPSAwOyB9Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICBnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBjaGVja0VmZmVjdENvbXBhdGliaWxpdHlfbChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCk7CkBAIC0xNDgxLDYgKzE1NDMsMTMgQEAKIAogICAgICAgICAgICAgdm9pZCAgICAgICAgdXBkYXRlTWV0YWRhdGFfbCgpIG92ZXJyaWRlOwogCisgICAgICAgICAgICBib29sICAgICAgICBmYXN0VHJhY2tBdmFpbGFibGUoKSBjb25zdCB7IHJldHVybiBtRmFzdFRyYWNrQXZhaWw7IH0KKworICAgICAgICAgICAgYm9vbCAgICAgICAgaXNUaW1lc3RhbXBDb3JyZWN0aW9uRW5hYmxlZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVja3MgcG9wY291bnQgZm9yIGV4YWN0bHkgb25lIGRldmljZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXVkaW9faXNfaW5wdXRfZGV2aWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluRGV2aWNlICYgbVRpbWVzdGFtcENvcnJlY3RlZERldmljZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogcHJpdmF0ZToKICAgICAgICAgICAgIC8vIEVudGVyIHN0YW5kYnkgaWYgbm90IGFscmVhZHkgaW4gc3RhbmRieSwgYW5kIHNldCBtU3RhbmRieSBmbGFnCiAgICAgICAgICAgICB2b2lkICAgIHN0YW5kYnlJZk5vdEFscmVhZHlJblN0YW5kYnkoKTsKQEAgLTE1MDgsOCArMTU3Nyw2IEBACiAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUnNtcEluUmVhcjsgICAgLy8gbGFzdCBmaWxsZWQgZnJhbWUgKyAxCiAKICAgICAgICAgICAgIC8vIEZvciBkdW1wc3lzCi0gICAgICAgICAgICBjb25zdCBzcDxOQkFJT19TaW5rPiAgICAgICAgICAgICAgICBtVGVlU2luazsKLQogICAgICAgICAgICAgY29uc3Qgc3A8TWVtb3J5RGVhbGVyPiAgICAgICAgICAgICAgbVJlYWRPbmx5SGVhcDsKIAogICAgICAgICAgICAgLy8gb25lLXRpbWUgaW5pdGlhbGl6YXRpb24sIG5vIGxvY2tzIHJlcXVpcmVkCkBAIC0xNTUyLDYgKzE2MTksOCBAQAogICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZhc3RUcmFja0F2YWlsOyAgICAvLyB0cnVlIGlmIGZhc3QgdHJhY2sgYXZhaWxhYmxlCiAgICAgICAgICAgICAvLyBjb21tb24gc3RhdGUgdG8gYWxsIHJlY29yZCB0aHJlYWRzCiAgICAgICAgICAgICBzdGQ6OmF0b21pY19ib29sICAgICAgICAgICAgICAgICAgICBtQnROcmVjU3VzcGVuZGVkOworCisgICAgICAgICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzUmVhZCA9IDA7ICAgIC8vIGNvbnRpbnVvdXMgcnVubmluZyBjb3VudGVyLgogfTsKIAogY2xhc3MgTW1hcFRocmVhZCA6IHB1YmxpYyBUaHJlYWRCYXNlCkBAIC0xNjA0LDcgKzE2NzMsNyBAQAogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIGNyZWF0ZUF1ZGlvUGF0Y2hfbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICByZWxlYXNlQXVkaW9QYXRjaF9sKGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7Ci0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZ2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CiAKICAgICB2aXJ0dWFsICAgICBzcDxTdHJlYW1IYWxJbnRlcmZhY2U+IHN0cmVhbSgpIGNvbnN0IHsgcmV0dXJuIG1IYWxTdHJlYW07IH0KICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBhZGRFZmZlY3RDaGFpbl9sKGNvbnN0IHNwPEVmZmVjdENoYWluPiYgY2hhaW4pOwpAQCAtMTYyNyw3ICsxNjk2LDcgQEAKICAgICAgICAgICAgICAgICAvLyBTZXRzIHRoZSBVSUQgcmVjb3JkcyBzaWxlbmNlCiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgc2V0UmVjb3JkU2lsZW5jZWQodWlkX3QgdWlkIF9fdW51c2VkLCBib29sIHNpbGVuY2VkIF9fdW51c2VkKSB7fQogCi0gICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCkBAIC0xNjg4LDYgKzE3NTcsOCBAQAogCiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgdXBkYXRlTWV0YWRhdGFfbCgpIG92ZXJyaWRlOwogCisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworCiBwcm90ZWN0ZWQ6CiAKICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICAgICAgICAgbVN0cmVhbVR5cGU7CkBAIC0xNzE2LDYgKzE3ODcsOCBAQAogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgIHByb2Nlc3NWb2x1bWVfbCgpIG92ZXJyaWRlOwogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgIHNldFJlY29yZFNpbGVuY2VkKHVpZF90IHVpZCwgYm9vbCBzaWxlbmNlZCkgb3ZlcnJpZGU7CiAKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICAgICB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisKIHByb3RlY3RlZDoKIAogICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtSW4qICBtSW5wdXQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmgKaW5kZXggY2NmYjY5Zi4uYzk0NjM5YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaApAQCAtMjUsMTMgKzI1LDEzIEBACiBwdWJsaWM6CiAgICAgZW51bSB0cmFja19zdGF0ZSB7CiAgICAgICAgIElETEUsCi0gICAgICAgIEZMVVNIRUQsCisgICAgICAgIEZMVVNIRUQsICAgICAgICAvLyBmb3IgUGxheWJhY2tUcmFja3Mgb25seQogICAgICAgICBTVE9QUEVELAogICAgICAgICAvLyBuZXh0IDIgc3RhdGVzIGFyZSBjdXJyZW50bHkgdXNlZCBmb3IgZmFzdCB0cmFja3MKICAgICAgICAgLy8gYW5kIG9mZmxvYWRlZCB0cmFja3Mgb25seQogICAgICAgICBTVE9QUElOR18xLCAgICAgLy8gd2FpdGluZyBmb3IgZmlyc3QgdW5kZXJydW4KICAgICAgICAgU1RPUFBJTkdfMiwgICAgIC8vIHdhaXRpbmcgZm9yIHByZXNlbnRhdGlvbiBjb21wbGV0ZQotICAgICAgICBSRVNVTUlORywKKyAgICAgICAgUkVTVU1JTkcsICAgICAgIC8vIGZvciBQbGF5YmFja1RyYWNrcyBvbmx5CiAgICAgICAgIEFDVElWRSwKICAgICAgICAgUEFVU0lORywKICAgICAgICAgUEFVU0VELApAQCAtNTQsMTEgKzU0LDYgQEAKICAgICAgICAgVFlQRV9QQVRDSCwKICAgICB9OwogCi0gICAgZW51bSB7Ci0gICAgICAgIFRSQUNLX05BTUVfUEVORElORyA9IC0xLAotICAgICAgICBUUkFDS19OQU1FX0ZBSUxVUkUgPSAtMiwKLSAgICB9OwotCiAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja0Jhc2UoVGhyZWFkQmFzZSAqdGhyZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgbUF0dHIsCkBAIC05MSw2ICs4Niw3IEBACiAgICAgICAgICAgICB2b2lkKiAgICAgICBidWZmZXIoKSBjb25zdCB7IHJldHVybiBtQnVmZmVyOyB9CiAgICAgICAgICAgICBzaXplX3QgICAgICBidWZmZXJTaXplKCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlclNpemU7IH0KICAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGlzRmFzdFRyYWNrKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNEaXJlY3QoKSBjb25zdCA9IDA7CiAgICAgICAgICAgICBib29sICAgICAgICBpc091dHB1dFRyYWNrKCkgY29uc3QgeyByZXR1cm4gKG1UeXBlID09IFRZUEVfT1VUUFVUKTsgfQogICAgICAgICAgICAgYm9vbCAgICAgICAgaXNQYXRjaFRyYWNrKCkgY29uc3QgeyByZXR1cm4gKG1UeXBlID09IFRZUEVfUEFUQ0gpOyB9CiAgICAgICAgICAgICBib29sICAgICAgICBpc0V4dGVybmFsVHJhY2soKSBjb25zdCB7IHJldHVybiAhaXNPdXRwdXRUcmFjaygpICYmICFpc1BhdGNoVHJhY2soKTsgfQpAQCAtMTAwLDYgKzk2LDEwNiBAQAogCiAgICAgYXVkaW9fYXR0cmlidXRlc190ICBhdHRyaWJ1dGVzKCkgY29uc3QgeyByZXR1cm4gbUF0dHI7IH0KIAorI2lmZGVmIFRFRV9TSU5LCisgICAgICAgICAgIHZvaWQgICAgICAgICBkdW1wVGVlKGludCBmZCwgY29uc3Qgc3RkOjpzdHJpbmcgJnJlYXNvbikgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGVlLmR1bXAoZmQsIHJlYXNvbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgLyoqIHJldHVybnMgdGhlIGJ1ZmZlciBjb250ZW50cyBzaXplIGNvbnZlcnRlZCB0byB0aW1lIGluIG1pbGxpc2Vjb25kcworICAgICAgICAgICAgICogZm9yIFBDTSBQbGF5YmFjayBvciBSZWNvcmQgc3RyZWFtaW5nIHRyYWNrcy4gVGhlIHJldHVybiB2YWx1ZSBpcyB6ZXJvIGZvcgorICAgICAgICAgICAgICogUENNIHN0YXRpYyB0cmFja3MgYW5kIG5vdCBkZWZpbmVkIGZvciBub24tUENNIHRyYWNrcy4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBUaGlzIG1heSBiZSBjYWxsZWQgd2l0aG91dCB0aGUgdGhyZWFkIGxvY2suCisgICAgICAgICAgICAgKi8KKyAgICB2aXJ0dWFsIGRvdWJsZSAgICAgIGJ1ZmZlckxhdGVuY3lNcygpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZlclByb3h5LT5mcmFtZXNSZWFkeVNhZmUoKSAqIDEwMDAgLyBzYW1wbGVSYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qKiByZXR1cm5zIHdoZXRoZXIgdGhlIHRyYWNrIHN1cHBvcnRzIHNlcnZlciBsYXRlbmN5IGNvbXB1dGF0aW9uLgorICAgICAgICAgICAgICogVGhpcyBpcyBzZXQgaW4gdGhlIGNvbnN0cnVjdG9yIGFuZCBjb25zdGFudCB0aHJvdWdob3V0IHRoZSB0cmFjayBsaWZldGltZS4KKyAgICAgICAgICAgICAqLworCisgICAgICAgICAgICBib29sICAgICAgICBpc1NlcnZlckxhdGVuY3lTdXBwb3J0ZWQoKSBjb25zdCB7IHJldHVybiBtU2VydmVyTGF0ZW5jeVN1cHBvcnRlZDsgfQorCisgICAgICAgICAgICAvKiogY29tcHV0ZXMgdGhlIHNlcnZlciBsYXRlbmN5IGZvciBQQ00gUGxheWJhY2sgb3IgUmVjb3JkIHRyYWNrCisgICAgICAgICAgICAgKiB0byB0aGUgZGV2aWNlIHNpbmsvc291cmNlLiAgVGhpcyBpcyB0aGUgdGltZSBmb3IgdGhlIG5leHQgZnJhbWUgaW4gdGhlIHRyYWNrIGJ1ZmZlcgorICAgICAgICAgICAgICogd3JpdHRlbiBvciByZWFkIGZyb20gdGhlIHNlcnZlciB0aHJlYWQgdG8gdGhlIGRldmljZSBzb3VyY2Ugb3Igc2luay4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBUaGlzIG1heSBiZSBjYWxsZWQgd2l0aG91dCB0aGUgdGhyZWFkIGxvY2ssIGJ1dCBsYXRlbmN5TXMgYW5kIGZyb21UcmFjaworICAgICAgICAgICAgICogbWF5IGJlIG5vdCBiZSBzeW5jaHJvbml6ZWQuIEZvciBleGFtcGxlIFBhdGNoUGFuZWwgbWF5IG5vdCBvYnRhaW4gdGhlCisgICAgICAgICAgICAgKiB0aHJlYWQgbG9jayBiZWZvcmUgY2FsbGluZy4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBccGFyYW0gbGF0ZW5jeU1zIG9uIHN1Y2Nlc3MgaXMgc2V0IHRvIHRoZSBsYXRlbmN5IGluIG1pbGxpc2Vjb25kcyBvZiB0aGUKKyAgICAgICAgICAgICAqICAgICAgICBuZXh0IGZyYW1lIHdyaXR0ZW4vcmVhZCBieSB0aGUgc2VydmVyIHRocmVhZCB0by9mcm9tIHRoZSB0cmFjayBidWZmZXIKKyAgICAgICAgICAgICAqICAgICAgICBmcm9tIHRoZSBkZXZpY2Ugc291cmNlL3NpbmsuCisgICAgICAgICAgICAgKiBccGFyYW0gZnJvbVRyYWNrIG9uIHN1Y2Nlc3MgaXMgc2V0IHRvIHRydWUgaWYgbGF0ZW5jeSB3YXMgY29tcHV0ZWQgZGlyZWN0bHkKKyAgICAgICAgICAgICAqICAgICAgICBmcm9tIHRoZSB0cmFjayB0aW1lc3RhbXA7IG90aGVyd2lzZSBzZXQgdG8gZmFsc2UgaWYgbGF0ZW5jeSB3YXMKKyAgICAgICAgICAgICAqICAgICAgICBlc3RpbWF0ZWQgZnJvbSB0aGUgc2VydmVyIHRpbWVzdGFtcC4KKyAgICAgICAgICAgICAqICAgICAgICBmcm9tVHJhY2sgbWF5IGJlIG51bGxwdHIgb3Igb21pdHRlZCBpZiBub3QgcmVxdWlyZWQuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogXHJldHVybnMgT0sgb3IgSU5WQUxJRF9PUEVSQVRJT04gb24gZmFpbHVyZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc3RhdHVzX3QgICAgZ2V0U2VydmVyTGF0ZW5jeU1zKGRvdWJsZSAqbGF0ZW5jeU1zLCBib29sICpmcm9tVHJhY2sgPSBudWxscHRyKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1NlcnZlckxhdGVuY3lTdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgbm8gdGhyZWFkIGxvY2sgaXMgYWNxdWlyZWQsIHRoZXNlIGF0b21pY3MgYXJlIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN5bmNocm9uaXplZCB3aXRoIGVhY2ggb3RoZXIsIGNvbnNpZGVyZWQgYSBiZW5pZ24gcmFjZS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBzZXJ2ZXJMYXRlbmN5TXMgPSBtU2VydmVyTGF0ZW5jeU1zLmxvYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyTGF0ZW5jeU1zID09IDAuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyb21UcmFjayAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpmcm9tVHJhY2sgPSBtU2VydmVyTGF0ZW5jeUZyb21UcmFjay5sb2FkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsYXRlbmN5TXMgPSBzZXJ2ZXJMYXRlbmN5TXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiogY29tcHV0ZXMgdGhlIHRvdGFsIGNsaWVudCBsYXRlbmN5IGZvciBQQ00gUGxheWJhY2sgb3IgUmVjb3JkIHRyYWNrcworICAgICAgICAgICAgICogZm9yIHRoZSBuZXh0IGNsaWVudCBhcHAgYWNjZXNzIHRvIHRoZSBkZXZpY2Ugc2luay9zb3VyY2U7IGkuZS4gdGhlCisgICAgICAgICAgICAgKiBzZXJ2ZXIgbGF0ZW5jeSBwbHVzIHRoZSBidWZmZXIgbGF0ZW5jeS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBUaGlzIG1heSBiZSBjYWxsZWQgd2l0aG91dCB0aGUgdGhyZWFkIGxvY2ssIGJ1dCBsYXRlbmN5TXMgYW5kIGZyb21UcmFjaworICAgICAgICAgICAgICogbWF5IGJlIG5vdCBiZSBzeW5jaHJvbml6ZWQuIEZvciBleGFtcGxlIFBhdGNoUGFuZWwgbWF5IG5vdCBvYnRhaW4gdGhlCisgICAgICAgICAgICAgKiB0aHJlYWQgbG9jayBiZWZvcmUgY2FsbGluZy4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBccGFyYW0gbGF0ZW5jeU1zIG9uIHN1Y2Nlc3MgaXMgc2V0IHRvIHRoZSBsYXRlbmN5IGluIG1pbGxpc2Vjb25kcyBvZiB0aGUKKyAgICAgICAgICAgICAqICAgICAgICBuZXh0IGZyYW1lIHdyaXR0ZW4vcmVhZCBieSB0aGUgY2xpZW50IGFwcCB0by9mcm9tIHRoZSB0cmFjayBidWZmZXIKKyAgICAgICAgICAgICAqICAgICAgICBmcm9tIHRoZSBkZXZpY2Ugc2luay9zb3VyY2UuCisgICAgICAgICAgICAgKiBccGFyYW0gZnJvbVRyYWNrIG9uIHN1Y2Nlc3MgaXMgc2V0IHRvIHRydWUgaWYgbGF0ZW5jeSB3YXMgY29tcHV0ZWQgZGlyZWN0bHkKKyAgICAgICAgICAgICAqICAgICAgICBmcm9tIHRoZSB0cmFjayB0aW1lc3RhbXA7IG90aGVyd2lzZSBzZXQgdG8gZmFsc2UgaWYgbGF0ZW5jeSB3YXMKKyAgICAgICAgICAgICAqICAgICAgICBlc3RpbWF0ZWQgZnJvbSB0aGUgc2VydmVyIHRpbWVzdGFtcC4KKyAgICAgICAgICAgICAqICAgICAgICBmcm9tVHJhY2sgbWF5IGJlIG51bGxwdHIgb3Igb21pdHRlZCBpZiBub3QgcmVxdWlyZWQuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogXHJldHVybnMgT0sgb3IgSU5WQUxJRF9PUEVSQVRJT04gb24gZmFpbHVyZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc3RhdHVzX3QgICAgZ2V0VHJhY2tMYXRlbmN5TXMoZG91YmxlICpsYXRlbmN5TXMsIGJvb2wgKmZyb21UcmFjayA9IG51bGxwdHIpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgc2VydmVyTGF0ZW5jeU1zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldFNlcnZlckxhdGVuY3lNcygmc2VydmVyTGF0ZW5jeU1zLCBmcm9tVHJhY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxhdGVuY3lNcyA9IHNlcnZlckxhdGVuY3lNcyArIGJ1ZmZlckxhdGVuY3lNcygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgIC8vIFRPRE86IENvbnNpZGVyIG1ha2luZyB0aGlzIGV4dGVybmFsLgorICAgICAgICAgICBzdHJ1Y3QgRnJhbWVUaW1lIHsKKyAgICAgICAgICAgICAgIGludDY0X3QgZnJhbWVzOworICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lTnM7CisgICAgICAgICAgIH07CisKKyAgICAgICAgICAgLy8gS2VybmVsRnJhbWVUaW1lIGlzIHVwZGF0ZWQgcGVyICJtaXgiIHBlcmlvZCBldmVuIGZvciBub24tcGNtIHRyYWNrcy4KKyAgICAgICAgICAgdm9pZCAgICAgICAgIGdldEtlcm5lbEZyYW1lVGltZShGcmFtZVRpbWUgKmZ0KSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAqZnQgPSBtS2VybmVsRnJhbWVUaW1lLmxvYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQoKSBjb25zdCB7IHJldHVybiBtRm9ybWF0OyB9CisgICAgICAgICAgIGludCBpZCgpIGNvbnN0IHsgcmV0dXJuIG1JZDsgfQorCiBwcm90ZWN0ZWQ6CiAgICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFRyYWNrQmFzZSk7CiAKQEAgLTExMSw4ICsyMDcsNiBAQAogICAgIC8vIGJ1dCBwdXR0aW5nIGl0IGluIFRyYWNrQmFzZSBhdm9pZHMgdGhlIGNvbXBsZXhpdHkgb2YgdmlydHVhbCBpbmhlcml0YW5jZQogICAgIHZpcnR1YWwgc2l6ZV90ICBmcmFtZXNSZWFkeSgpIGNvbnN0IHsgcmV0dXJuIFNJWkVfTUFYOyB9CiAKLSAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQoKSBjb25zdCB7IHJldHVybiBtRm9ybWF0OyB9Ci0KICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQoKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbENvdW50OyB9CiAKICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaygpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsTWFzazsgfQpAQCAtMjA4LDEzICszMDIsMTkgQEAKICAgICBjb25zdCBib29sICAgICAgICAgIG1Jc091dDsKICAgICBzcDxTZXJ2ZXJQcm94eT4gICAgIG1TZXJ2ZXJQcm94eTsKICAgICBjb25zdCBpbnQgICAgICAgICAgIG1JZDsKLSAgICBzcDxOQkFJT19TaW5rPiAgICAgIG1UZWVTaW5rOwotICAgIHNwPE5CQUlPX1NvdXJjZT4gICAgbVRlZVNvdXJjZTsKKyNpZmRlZiBURUVfU0lOSworICAgIE5CQUlPX1RlZSAgICAgICAgICAgbVRlZTsKKyNlbmRpZgogICAgIGJvb2wgICAgICAgICAgICAgICAgbVRlcm1pbmF0ZWQ7CiAgICAgdHJhY2tfdHlwZSAgICAgICAgICBtVHlwZTsgICAgICAvLyBtdXN0IGJlIG9uZSBvZiBUWVBFX0RFRkFVTFQsIFRZUEVfT1VUUFVULCBUWVBFX1BBVENIIC4uLgogICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgbVRocmVhZElvSGFuZGxlOyAvLyBJL08gaGFuZGxlIG9mIHRoZSB0aHJlYWQgdGhlIHRyYWNrIGlzIGF0dGFjaGVkIHRvCiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtUG9ydElkOyAvLyB1bmlxdWUgSUQgZm9yIHRoaXMgdHJhY2sgdXNlZCBieSBhdWRpbyBwb2xpY3kKICAgICBib29sICAgICAgICAgICAgICAgIG1Jc0ludmFsaWQ7IC8vIG5vbi1yZXNldHRhYmxlIGxhdGNoLCBzZXQgYnkgaW52YWxpZGF0ZSgpCisKKyAgICBib29sICAgICAgICAgICAgICAgIG1TZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkID0gZmFsc2U7CisgICAgc3RkOjphdG9taWM8Ym9vbD4gICBtU2VydmVyTGF0ZW5jeUZyb21UcmFja3t9OyAvLyBsYXRlbmN5IGZyb20gdHJhY2sgb3Igc2VydmVyIHRpbWVzdGFtcC4KKyAgICBzdGQ6OmF0b21pYzxkb3VibGU+IG1TZXJ2ZXJMYXRlbmN5TXN7fTsgICAgICAgIC8vIGxhc3QgbGF0ZW5jeSBwdXNoZWQgZnJvbSBzZXJ2ZXIgdGhyZWFkLgorICAgIHN0ZDo6YXRvbWljPEZyYW1lVGltZT4gbUtlcm5lbEZyYW1lVGltZXt9OyAgICAgLy8gbGFzdCBmcmFtZSB0aW1lIG9uIGtlcm5lbCBzaWRlLgogfTsKIAogLy8gUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBQYXRjaFRyYWNrIGFuZCBQYXRjaFJlY29yZC4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAKaW5kZXggNmQyNWZiOS4uOWE3ZjFmMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAKQEAgLTI4LDExICsyOCwxMSBAQAogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oPgogCiAjaW5jbHVkZSAiQXVkaW9GbGluZ2VyLmgiCi0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgogCiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUGlwZS5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL1BpcGVSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9SZWNvcmRCdWZmZXJDb252ZXJ0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9taW5pZmxvYXQuaD4KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNTYsNiArNTYsOCBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gICAgICBUcmFja0Jhc2UKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkFGOjpUcmFja0Jhc2UiCiAKIHN0YXRpYyB2b2xhdGlsZSBpbnQzMl90IG5leHRUcmFja0lkID0gNTU7CiAKQEAgLTEwMiw5ICsxMDQsMTAgQEAKICAgICAgICAgbUlzSW52YWxpZChmYWxzZSkKIHsKICAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGlmICghaXNUcnVzdGVkQ2FsbGluZ1VpZChjYWxsaW5nVWlkKSB8fCBjbGllbnRVaWQgPT0gQVVESU9fVUlEX0lOVkFMSUQpIHsKKyAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKGNhbGxpbmdVaWQpIHx8IGNsaWVudFVpZCA9PSBBVURJT19VSURfSU5WQUxJRCkgewogICAgICAgICBBTE9HV19JRihjbGllbnRVaWQgIT0gQVVESU9fVUlEX0lOVkFMSUQgJiYgY2xpZW50VWlkICE9IGNhbGxpbmdVaWQsCi0gICAgICAgICAgICAgICAgIiVzIHVpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgJWQiLCBfX0ZVTkNUSU9OX18sIGNhbGxpbmdVaWQsIGNsaWVudFVpZCk7CisgICAgICAgICAgICAgICAgIiVzKCVkKTogdWlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyAlZCIsCisgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIGNhbGxpbmdVaWQsIGNsaWVudFVpZCk7CiAgICAgICAgIGNsaWVudFVpZCA9IGNhbGxpbmdVaWQ7CiAgICAgfQogICAgIC8vIGNsaWVudFVpZCBjb250YWlucyB0aGUgdWlkIG9mIHRoZSBhcHAgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgdGhpcyB0cmFjaywgc28gd2UgY2FuIGJsYW1lCkBAIC0xNDQsNyArMTQ3LDcgQEAKICAgICAgICAgbUNibGtNZW1vcnkgPSBjbGllbnQtPmhlYXAoKS0+YWxsb2NhdGUoc2l6ZSk7CiAgICAgICAgIGlmIChtQ2Jsa01lbW9yeSA9PSAwIHx8CiAgICAgICAgICAgICAgICAgKG1DYmxrID0gc3RhdGljX2Nhc3Q8YXVkaW9fdHJhY2tfY2Jsa190ICo+KG1DYmxrTWVtb3J5LT5wb2ludGVyKCkpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgibm90IGVub3VnaCBtZW1vcnkgZm9yIEF1ZGlvVHJhY2sgc2l6ZT0lenUiLCBzaXplKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IG5vdCBlbm91Z2ggbWVtb3J5IGZvciBBdWRpb1RyYWNrIHNpemU9JXp1IiwgX19mdW5jX18sIG1JZCwgc2l6ZSk7CiAgICAgICAgICAgICBjbGllbnQtPmhlYXAoKS0+ZHVtcCgiQXVkaW9UcmFjayIpOwogICAgICAgICAgICAgbUNibGtNZW1vcnkuY2xlYXIoKTsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTE1Miw3ICsxNTUsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIG1DYmxrID0gKGF1ZGlvX3RyYWNrX2NibGtfdCAqKSBtYWxsb2Moc2l6ZSk7CiAgICAgICAgIGlmIChtQ2JsayA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgibm90IGVub3VnaCBtZW1vcnkgZm9yIEF1ZGlvVHJhY2sgc2l6ZT0lenUiLCBzaXplKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IG5vdCBlbm91Z2ggbWVtb3J5IGZvciBBdWRpb1RyYWNrIHNpemU9JXp1IiwgX19mdW5jX18sIG1JZCwgc2l6ZSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9CkBAIC0xNjYsNyArMTY5LDggQEAKICAgICAgICAgICAgIGlmIChyb0hlYXAgPT0gMCB8fAogICAgICAgICAgICAgICAgICAgICAobUJ1ZmZlck1lbW9yeSA9IHJvSGVhcC0+YWxsb2NhdGUoYnVmZmVyU2l6ZSkpID09IDAgfHwKICAgICAgICAgICAgICAgICAgICAgKG1CdWZmZXIgPSBtQnVmZmVyTWVtb3J5LT5wb2ludGVyKCkpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgibm90IGVub3VnaCBtZW1vcnkgZm9yIHJlYWQtb25seSBidWZmZXIgc2l6ZT0lenUiLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBub3QgZW5vdWdoIG1lbW9yeSBmb3IgcmVhZC1vbmx5IGJ1ZmZlciBzaXplPSV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBidWZmZXJTaXplKTsKICAgICAgICAgICAgICAgICBpZiAocm9IZWFwICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgcm9IZWFwLT5kdW1wKCJidWZmZXIiKTsKICAgICAgICAgICAgICAgICB9CkBAIC0yMDUsMjcgKzIwOSwxMiBAQAogICAgICAgICAgICAgbUJ1ZmZlciA9IGJ1ZmZlcjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiaW52YWxpZCBhbGxvY2F0aW9uIHR5cGU6ICVkIiwgKGludClhbGxvYyk7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlcyglZCk6IGludmFsaWQgYWxsb2NhdGlvbiB0eXBlOiAlZCIsIF9fZnVuY19fLCBtSWQsIChpbnQpYWxsb2MpOwogICAgICAgICB9CiAgICAgICAgIG1CdWZmZXJTaXplID0gYnVmZmVyU2l6ZTsKIAogI2lmZGVmIFRFRV9TSU5LCi0gICAgICAgIGlmIChtVGVlU2lua1RyYWNrRW5hYmxlZCkgewotICAgICAgICAgICAgTkJBSU9fRm9ybWF0IHBpcGVGb3JtYXQgPSBGb3JtYXRfZnJvbV9TUl9DKG1TYW1wbGVSYXRlLCBtQ2hhbm5lbENvdW50LCBtRm9ybWF0KTsKLSAgICAgICAgICAgIGlmIChGb3JtYXRfaXNWYWxpZChwaXBlRm9ybWF0KSkgewotICAgICAgICAgICAgICAgIFBpcGUgKnBpcGUgPSBuZXcgUGlwZShtVGVlU2lua1RyYWNrRnJhbWVzLCBwaXBlRm9ybWF0KTsKLSAgICAgICAgICAgICAgICBzaXplX3QgbnVtQ291bnRlck9mZmVycyA9IDA7Ci0gICAgICAgICAgICAgICAgY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyc1sxXSA9IHtwaXBlRm9ybWF0fTsKLSAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gcGlwZS0+bmVnb3RpYXRlKG9mZmVycywgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoaW5kZXggPT0gMCk7Ci0gICAgICAgICAgICAgICAgUGlwZVJlYWRlciAqcGlwZVJlYWRlciA9IG5ldyBQaXBlUmVhZGVyKCpwaXBlKTsKLSAgICAgICAgICAgICAgICBudW1Db3VudGVyT2ZmZXJzID0gMDsKLSAgICAgICAgICAgICAgICBpbmRleCA9IHBpcGVSZWFkZXItPm5lZ290aWF0ZShvZmZlcnMsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOwotICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGluZGV4ID09IDApOwotICAgICAgICAgICAgICAgIG1UZWVTaW5rID0gcGlwZTsKLSAgICAgICAgICAgICAgICBtVGVlU291cmNlID0gcGlwZVJlYWRlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBtVGVlLnNldChzYW1wbGVSYXRlLCBtQ2hhbm5lbENvdW50LCBmb3JtYXQsIE5CQUlPX1RlZTo6VEVFX0ZMQUdfVFJBQ0spOwogI2VuZGlmCiAKICAgICB9CkBAIC0yNDQsOSArMjMzLDYgQEAKIAogQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpUcmFja0Jhc2U6On5UcmFja0Jhc2UoKQogewotI2lmZGVmIFRFRV9TSU5LCi0gICAgZHVtcFRlZSgtMSwgbVRlZVNvdXJjZSwgbUlkLCAnVCcpOwotI2VuZGlmCiAgICAgLy8gZGVsZXRlIHRoZSBwcm94eSBiZWZvcmUgZGVsZXRpbmcgdGhlIHNoYXJlZCBtZW1vcnkgaXQgcmVmZXJzIHRvLCB0byBhdm9pZCBkYW5nbGluZyByZWZlcmVuY2UKICAgICBtU2VydmVyUHJveHkuY2xlYXIoKTsKICAgICBpZiAobUNibGsgIT0gTlVMTCkgewpAQCAtMjc0LDkgKzI2MCw3IEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6VHJhY2tCYXNlOjpyZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQogewogI2lmZGVmIFRFRV9TSU5LCi0gICAgaWYgKG1UZWVTaW5rICE9IDApIHsKLSAgICAgICAgKHZvaWQpIG1UZWVTaW5rLT53cml0ZShidWZmZXItPnJhdywgYnVmZmVyLT5mcmFtZUNvdW50KTsKLSAgICB9CisgICAgbVRlZS53cml0ZShidWZmZXItPnJhdywgYnVmZmVyLT5mcmFtZUNvdW50KTsKICNlbmRpZgogCiAgICAgU2VydmVyUHJveHk6OkJ1ZmZlciBidWY7CkBAIC0yOTYsNiArMjgwLDggQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vICAgICAgUGxheWJhY2sKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkFGOjpUcmFja0hhbmRsZSIKIAogQXVkaW9GbGluZ2VyOjpUcmFja0hhbmRsZTo6VHJhY2tIYW5kbGUoY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s+JiB0cmFjaykKICAgICA6IEJuQXVkaW9UcmFjaygpLApAQCAtMzQwLDYgKzMyNiwxMCBAQAogICAgIHJldHVybiBtVHJhY2stPnNldFBhcmFtZXRlcnMoa2V5VmFsdWVQYWlycyk7CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6VHJhY2tIYW5kbGU6OnNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpIHsKKyAgICByZXR1cm4gbVRyYWNrLT5zZWxlY3RQcmVzZW50YXRpb24ocHJlc2VudGF0aW9uSWQsIHByb2dyYW1JZCk7Cit9CisKIFZvbHVtZVNoYXBlcjo6U3RhdHVzIEF1ZGlvRmxpbmdlcjo6VHJhY2tIYW5kbGU6OmFwcGx5Vm9sdW1lU2hhcGVyKAogICAgICAgICBjb25zdCBzcDxWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLAogICAgICAgICBjb25zdCBzcDxWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbikgewpAQCAtMzY4LDYgKzM1OCw4IEBACiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkFGOjpUcmFjayIKIAogLy8gVHJhY2sgY29uc3RydWN0b3IgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGFuZCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6VHJhY2soCkBAIC0zOTcsNyArMzg5LDYgQEAKICAgICAvLyBtUmV0cnlDb3VudCBpbml0aWFsaXplZCBsYXRlciB3aGVuIG5lZWRlZAogICAgIG1TaGFyZWRCdWZmZXIoc2hhcmVkQnVmZmVyKSwKICAgICBtU3RyZWFtVHlwZShzdHJlYW1UeXBlKSwKLSAgICBtTmFtZShUUkFDS19OQU1FX0ZBSUxVUkUpLCAgLy8gc2V0IHRvIFRSQUNLX05BTUVfUEVORElORyBvbiBjb25zdHJ1Y3RvciBzdWNjZXNzLgogICAgIG1NYWluQnVmZmVyKHRocmVhZC0+c2lua0J1ZmZlcigpKSwKICAgICBtQXV4QnVmZmVyKE5VTEwpLAogICAgIG1BdXhFZmZlY3RJZCgwKSwgbUhhc1ZvbHVtZUNvbnRyb2xsZXIoZmFsc2UpLApAQCAtNDE3LDggKzQwOCw4IEBACiAgICAgLy8gY2xpZW50ID09IDAgaW1wbGllcyBzaGFyZWRCdWZmZXIgPT0gMAogICAgIEFMT0dfQVNTRVJUKCEoY2xpZW50ID09IDAgJiYgc2hhcmVkQnVmZmVyICE9IDApKTsKIAotICAgIEFMT0dWX0lGKHNoYXJlZEJ1ZmZlciAhPSAwLCAic2hhcmVkQnVmZmVyOiAlcCwgc2l6ZTogJXp1Iiwgc2hhcmVkQnVmZmVyLT5wb2ludGVyKCksCi0gICAgICAgICAgICBzaGFyZWRCdWZmZXItPnNpemUoKSk7CisgICAgQUxPR1ZfSUYoc2hhcmVkQnVmZmVyICE9IDAsICIlcyglZCk6IHNoYXJlZEJ1ZmZlcjogJXAsIHNpemU6ICV6dSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSwgc2hhcmVkQnVmZmVyLT5zaXplKCkpOwogCiAgICAgaWYgKG1DYmxrID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtNDM0LDcgKzQyNSw3IEBACiAgICAgbVNlcnZlclByb3h5ID0gbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTsKIAogICAgIGlmICghdGhyZWFkLT5pc1RyYWNrQWxsb3dlZF9sKGNoYW5uZWxNYXNrLCBmb3JtYXQsIHNlc3Npb25JZCwgdWlkKSkgewotICAgICAgICBBTE9HRSgibm8gbW9yZSB0cmFja3MgYXZhaWxhYmxlIik7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IG5vIG1vcmUgdHJhY2tzIGF2YWlsYWJsZSIsIF9fZnVuY19fLCBtSWQpOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIC8vIG9ubHkgYWxsb2NhdGUgYSBmYXN0IHRyYWNrIGluZGV4IGlmIHdlIHdlcmUgYWJsZSB0byBhbGxvY2F0ZSBhIG5vcm1hbCB0cmFjayBuYW1lCkBAIC00NTMsMTIgKzQ0NCwxOCBAQAogICAgICAgICBtRmFzdEluZGV4ID0gaTsKICAgICAgICAgdGhyZWFkLT5tRmFzdFRyYWNrQXZhaWxNYXNrICY9IH4oMSA8PCBpKTsKICAgICB9Ci0gICAgbU5hbWUgPSBUUkFDS19OQU1FX1BFTkRJTkc7CisKKyAgICBtU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCA9IHRocmVhZC0+dHlwZSgpID09IFRocmVhZEJhc2U6Ok1JWEVSCisgICAgICAgICAgICB8fCB0aHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpEVVBMSUNBVElORzsKKyNpZmRlZiBURUVfU0lOSworICAgIG1UZWUuc2V0SWQoc3RkOjpzdHJpbmcoIl8iKSArIHN0ZDo6dG9fc3RyaW5nKG1UaHJlYWRJb0hhbmRsZSkKKyAgICAgICAgICAgICsgIl8iICsgc3RkOjp0b19zdHJpbmcobUlkKSk7CisjZW5kaWYKIH0KIAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6On5UcmFjaygpCiB7Ci0gICAgQUxPR1YoIlBsYXliYWNrVGhyZWFkOjpUcmFjayBkZXN0cnVjdG9yIik7CisgICAgQUxPR1YoIiVzKCVkKSIsIF9fZnVuY19fLCBtSWQpOwogCiAgICAgLy8gVGhlIGRlc3RydWN0b3Igd291bGQgY2xlYXIgbVNoYXJlZEJ1ZmZlciwKICAgICAvLyBidXQgaXQgd2lsbCBub3QgcHVzaCB0aGUgZGVjcmVtZW50ZWQgcmVmZXJlbmNlIGNvdW50LApAQCAtNDcyLDcgKzQ2OSw3IEBACiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6aW5pdENoZWNrKCkgY29uc3QKIHsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBUcmFja0Jhc2U6OmluaXRDaGVjaygpOwotICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgbU5hbWUgPT0gVFJBQ0tfTkFNRV9GQUlMVVJFKSB7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiBtQ2JsayA9PSBudWxscHRyKSB7CiAgICAgICAgIHN0YXR1cyA9IE5PX01FTU9SWTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTQ5OCwxOCArNDk1LDIwIEBACiAgICAgICAgICAgICB3YXNBY3RpdmUgPSBwbGF5YmFja1RocmVhZC0+ZGVzdHJveVRyYWNrX2wodGhpcyk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlzRXh0ZXJuYWxUcmFjaygpICYmICF3YXNBY3RpdmUpIHsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG1UaHJlYWRJb0hhbmRsZSwgbVN0cmVhbVR5cGUsIG1TZXNzaW9uSWQpOworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQobVBvcnRJZCk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKLS8qc3RhdGljKi8gdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjphcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCkKIHsKLSAgICByZXN1bHQuYXBwZW5kKCJUIE5hbWUgQWN0aXZlIENsaWVudCBTZXNzaW9uIFMgIEZsYWdzICIKLSAgICAgICAgICAgICAgICAgICIgIEZvcm1hdCBDaG4gbWFzayAgU1JhdGUgIgotICAgICAgICAgICAgICAgICAgIlNUICBMIGRCICBSIGRCICBWUyBkQiAiCi0gICAgICAgICAgICAgICAgICAiICBTZXJ2ZXIgRnJtQ250ICBGcm1SZHkgRiBVbmRlcnJ1bnMgIEZsdXNoZWQgIgotICAgICAgICAgICAgICAgICAgIk1haW4gQnVmICBBdXggQnVmXG4iKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJUeXBlICAgICBJZCBBY3RpdmUgQ2xpZW50IFNlc3Npb24gUG9ydCBJZCBTICBGbGFncyAiCisgICAgICAgICAgICAgICAgICAgICAgICAiICBGb3JtYXQgQ2huIG1hc2sgIFNSYXRlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJTVCBVc2cgQ1QgIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBHIGRiICBMIGRCICBSIGRCICBWUyBkQiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiICBTZXJ2ZXIgRnJtQ250ICBGcm1SZHkgRiBVbmRlcnJ1bnMgIEZsdXNoZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAiJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpc1NlcnZlckxhdGVuY3lTdXBwb3J0ZWQoKSA/ICIgICBMYXRlbmN5IiA6ICIiKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6YXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlKQpAQCAtNTE4LDcgKzUxNyw3IEBACiAgICAgc3dpdGNoIChtVHlwZSkgewogICAgIGNhc2UgVFlQRV9ERUZBVUxUOgogICAgIGNhc2UgVFlQRV9PVVRQVVQ6Ci0gICAgICAgIGlmIChtU2hhcmVkQnVmZmVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKGlzU3RhdGljKCkpIHsKICAgICAgICAgICAgIHRyYWNrVHlwZSA9ICdTJzsgLy8gc3RhdGljCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0cmFja1R5cGUgPSAnICc7IC8vIG5vcm1hbApAQCAtNTMyLDEzICs1MzEsOSBAQAogICAgIH0KIAogICAgIGlmIChpc0Zhc3RUcmFjaygpKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkYlYyAlM2QiLCB0cmFja1R5cGUsIG1GYXN0SW5kZXgpOwotICAgIH0gZWxzZSBpZiAobU5hbWUgPT0gVFJBQ0tfTkFNRV9QRU5ESU5HKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiVjIHBlbmQiLCB0cmFja1R5cGUpOwotICAgIH0gZWxzZSBpZiAobU5hbWUgPT0gVFJBQ0tfTkFNRV9GQUlMVVJFKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiVjIGZhaWwiLCB0cmFja1R5cGUpOworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJGJWQgJWMgJTZkIiwgbUZhc3RJbmRleCwgdHJhY2tUeXBlLCBtSWQpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiVjICU0ZCIsIHRyYWNrVHlwZSwgbU5hbWUpOworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgICAlYyAlNmQiLCB0cmFja1R5cGUsIG1JZCk7CiAgICAgfQogCiAgICAgY2hhciBub3dJblVuZGVycnVuOwpAQCAtNTkzLDIyICs1ODgsMjcgQEAKICAgICAgICAgICAgID8gJ3InIC8qIGJ1ZmZlciByZWR1Y2VkICovOiBidWZmZXJTaXplSW5GcmFtZXMgPiBtRnJhbWVDb3VudAogICAgICAgICAgICAgICAgICAgICA/ICdlJyAvKiBlcnJvciAqLyA6ICcgJyAvKiBpZGVudGljYWwgKi87CiAKLSAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlN3MgJTZ1ICU3dSAlMnMgMHglMDNYICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMDhYICUwOFggJTZ1ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMnUgJTUuMmcgJTUuMmcgJTUuMmclYyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiJTA4WCAlNnp1JWMgJTZ6dSAlYyAlOXUlYyAlN3UgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUwOHpYICUwOHpYXG4iLAorICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiU3cyAlNnUgJTd1ICU3dSAlMnMgMHglMDNYICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIlMDhYICUwOFggJTZ1ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIlMnUgJTN4ICUyeCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiJTUuMmcgJTUuMmcgJTUuMmcgJTUuMmclYyAiCisgICAgICAgICAgICAgICAgICAgICAgICAiJTA4WCAlNnp1JWMgJTZ6dSAlYyAlOXUlYyAlN3UiLAogICAgICAgICAgICAgYWN0aXZlID8gInllcyIgOiAibm8iLAotICAgICAgICAgICAgKG1DbGllbnQgPT0gMCkgPyBnZXRwaWRfY2FjaGVkIDogbUNsaWVudC0+cGlkKCksCisgICAgICAgICAgICAobUNsaWVudCA9PSAwKSA/IGdldHBpZCgpIDogbUNsaWVudC0+cGlkKCksCiAgICAgICAgICAgICBtU2Vzc2lvbklkLAorICAgICAgICAgICAgbVBvcnRJZCwKICAgICAgICAgICAgIGdldFRyYWNrU3RhdGVTdHJpbmcoKSwKICAgICAgICAgICAgIG1DYmxrLT5tRmxhZ3MsCiAKICAgICAgICAgICAgIG1Gb3JtYXQsCiAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRTYW1wbGVSYXRlKCksCisgICAgICAgICAgICBzYW1wbGVSYXRlKCksCiAKICAgICAgICAgICAgIG1TdHJlYW1UeXBlLAorICAgICAgICAgICAgbUF0dHIudXNhZ2UsCisgICAgICAgICAgICBtQXR0ci5jb250ZW50X3R5cGUsCisKKyAgICAgICAgICAgIDIwLjAgKiBsb2cxMChtRmluYWxWb2x1bWUpLAogICAgICAgICAgICAgMjAuMCAqIGxvZzEwKGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfbGVmdCh2bHIpKSksCiAgICAgICAgICAgICAyMC4wICogbG9nMTAoZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19yaWdodCh2bHIpKSksCiAgICAgICAgICAgICAyMC4wICogbG9nMTAodnNWb2x1bWUuZmlyc3QpLCAvLyBWb2x1bWVTaGFwZXIocykgdG90YWwgdm9sdW1lCkBAIC02MjEsMTEgKzYyMSwyMSBAQAogICAgICAgICAgICAgZmlsbGluZ1N0YXR1cywKICAgICAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFVuZGVycnVuRnJhbWVzKCksCiAgICAgICAgICAgICBub3dJblVuZGVycnVuLAotICAgICAgICAgICAgKHVuc2lnbmVkKW1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc0ZsdXNoZWQoKSAlIDEwMDAwMDAwLAotCi0gICAgICAgICAgICAoc2l6ZV90KW1NYWluQnVmZmVyLCAvLyB1c2UgJXpYIGFzICVwIGFwcGVuZHMgMHgKLSAgICAgICAgICAgIChzaXplX3QpbUF1eEJ1ZmZlciAgIC8vIHVzZSAlelggYXMgJXAgYXBwZW5kcyAweAorICAgICAgICAgICAgKHVuc2lnbmVkKW1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc0ZsdXNoZWQoKSAlIDEwMDAwMDAwCiAgICAgICAgICAgICApOworCisgICAgaWYgKGlzU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCgpKSB7CisgICAgICAgIGRvdWJsZSBsYXRlbmN5TXM7CisgICAgICAgIGJvb2wgZnJvbVRyYWNrOworICAgICAgICBpZiAoZ2V0VHJhY2tMYXRlbmN5TXMoJmxhdGVuY3lNcywgJmZyb21UcmFjaykgPT0gT0spIHsKKyAgICAgICAgICAgIC8vIFNob3cgbGF0ZW5jeSBpbiBtc2VjLCBmb2xsb3dlZCBieSAndCcgaWYgZnJvbSB0cmFjayB0aW1lc3RhbXAgKHRoZSBtb3N0IGFjY3VyYXRlKQorICAgICAgICAgICAgLy8gb3IgJ2snIGlmIGVzdGltYXRlZCBmcm9tIGtlcm5lbCBiZWNhdXNlIHRyYWNrIGZyYW1lcyBoYXZlbid0IGJlZW4gcHJlc2VudGVkIHlldC4KKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAlNy4ybGYgJWMiLCBsYXRlbmN5TXMsIGZyb21UcmFjayA/ICd0JyA6ICdrJyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlMTBzIiwgbUNibGstPm1TZXJ2ZXIgIT0gMCA/ICJ1bmF2YWlsIiA6ICJuZXciKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwogfQogCiB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6c2FtcGxlUmF0ZSgpIGNvbnN0IHsKQEAgLTY0Myw4ICs2NTMsOCBAQAogICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IGJ1Zi5tRnJhbWVDb3VudDsKICAgICBidWZmZXItPnJhdyA9IGJ1Zi5tUmF3OwogICAgIGlmIChidWYubUZyYW1lQ291bnQgPT0gMCAmJiAhaXNTdG9wcGluZygpICYmICFpc1N0b3BwZWQoKSAmJiAhaXNQYXVzZWQoKSkgewotICAgICAgICBBTE9HVigidW5kZXJydW4sICBmcmFtZXNSZWFkeSglenUpIDwgZnJhbWVzRGVzaXJlZCglemQpLCBzdGF0ZTogJWQiLAotICAgICAgICAgICAgICAgIGJ1Zi5tRnJhbWVDb3VudCwgZGVzaXJlZEZyYW1lcywgbVN0YXRlKTsKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogdW5kZXJydW4sICBmcmFtZXNSZWFkeSglenUpIDwgZnJhbWVzRGVzaXJlZCglemQpLCBzdGF0ZTogJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIGJ1Zi5tRnJhbWVDb3VudCwgZGVzaXJlZEZyYW1lcywgbVN0YXRlKTsKICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcyhkZXNpcmVkRnJhbWVzKTsKICAgICB9IGVsc2UgewogICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT50YWxseVVuZGVycnVuRnJhbWVzKDApOwpAQCAtNjgyLDYgKzY5MiwxMyBAQAogICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPnNldFRpbWVzdGFtcCh0aW1lc3RhbXApOwogCiAgICAgLy8gV2UgZG8gbm90IHNldCBkcmFpbmVkIGhlcmUsIGFzIEZhc3RUcmFjayB0aW1lc3RhbXAgbWF5IG5vdCBnbyB0byB2ZXJ5IGxhc3QgZnJhbWUuCisKKyAgICAvLyBDb21wdXRlIGxhdGVuY3kuCisgICAgLy8gVE9ETzogQ29uc2lkZXIgd2hldGhlciB0aGUgc2VydmVyIGxhdGVuY3kgbWF5IGJlIHBhc3NlZCBpbiBieSBGYXN0TWl4ZXIKKyAgICAvLyBhcyBhIGNvbnN0YW50IGZvciBhbGwgYWN0aXZlIEZhc3RUcmFja3MuCisgICAgY29uc3QgZG91YmxlIGxhdGVuY3lNcyA9IHRpbWVzdGFtcC5nZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXMoc2FtcGxlUmF0ZSgpKTsKKyAgICBtU2VydmVyTGF0ZW5jeUZyb21UcmFjay5zdG9yZSh0cnVlKTsKKyAgICBtU2VydmVyTGF0ZW5jeU1zLnN0b3JlKGxhdGVuY3lNcyk7CiB9CiAKIC8vIERvbid0IGNhbGwgZm9yIGZhc3QgdHJhY2tzOyB0aGUgZnJhbWVzUmVhZHkoKSBjb3VsZCByZXN1bHQgaW4gcHJpb3JpdHkgaW52ZXJzaW9uCkBAIC03MTAsOCArNzI3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24gX191bnVzZWQpCiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgQUxPR1YoInN0YXJ0KCVkKSwgY2FsbGluZyBwaWQgJWQgc2Vzc2lvbiAlZCIsCi0gICAgICAgICAgICBtTmFtZSwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLCBtU2Vzc2lvbklkKTsKKyAgICBBTE9HVigiJXMoJWQpOiBjYWxsaW5nIHBpZCAlZCBzZXNzaW9uICVkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwgbVNlc3Npb25JZCk7CiAKICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKICAgICBpZiAodGhyZWFkICE9IDApIHsKQEAgLTczNywxNCArNzU0LDE3IEBACiAgICAgICAgICAgICBpZiAobVJlc3VtZVRvU3RvcHBpbmcpIHsKICAgICAgICAgICAgICAgICAvLyBoYXBwZW5lZCB3ZSBuZWVkIHRvIHJlc3VtZSB0byBTVE9QUElOR18xCiAgICAgICAgICAgICAgICAgbVN0YXRlID0gVHJhY2tCYXNlOjpTVE9QUElOR18xOwotICAgICAgICAgICAgICAgIEFMT0dWKCJQQVVTRUQgPT4gU1RPUFBJTkdfMSAoJWQpIG9uIHRocmVhZCAlcCIsIG1OYW1lLCB0aGlzKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBQQVVTRUQgPT4gU1RPUFBJTkdfMSBvbiB0aHJlYWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgKGludCltVGhyZWFkSW9IYW5kbGUpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBtU3RhdGUgPSBUcmFja0Jhc2U6OlJFU1VNSU5HOwotICAgICAgICAgICAgICAgIEFMT0dWKCJQQVVTRUQgPT4gUkVTVU1JTkcgKCVkKSBvbiB0aHJlYWQgJXAiLCBtTmFtZSwgdGhpcyk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogUEFVU0VEID0+IFJFU1VNSU5HIG9uIHRocmVhZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgIG1JZCwgKGludCltVGhyZWFkSW9IYW5kbGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbVN0YXRlID0gVHJhY2tCYXNlOjpBQ1RJVkU7Ci0gICAgICAgICAgICBBTE9HVigiPyA9PiBBQ1RJVkUgKCVkKSBvbiB0aHJlYWQgJXAiLCBtTmFtZSwgdGhpcyk7CisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiA/ID0+IEFDVElWRSBvbiB0aHJlYWQgJWQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCAoaW50KW1UaHJlYWRJb0hhbmRsZSk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBzdGF0ZXMgdG8gcmVzZXQgcG9zaXRpb24gaW5mbyBmb3Igbm9uLW9mZmxvYWRlZC9kaXJlY3QgdHJhY2tzCkBAIC03OTUsNyArODE1LDcgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6c3RvcCgpCiB7Ci0gICAgQUxPR1YoInN0b3AoJWQpLCBjYWxsaW5nIHBpZCAlZCIsIG1OYW1lLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOworICAgIEFMT0dWKCIlcyglZCk6IGNhbGxpbmcgcGlkICVkIiwgX19mdW5jX18sIG1JZCwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKTsKICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKICAgICBpZiAodGhyZWFkICE9IDApIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOwpAQCAtODE5LDE1ICs4MzksMTUgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwbGF5YmFja1RocmVhZC0+YnJvYWRjYXN0X2woKTsKLSAgICAgICAgICAgIEFMT0dWKCJub3Qgc3RvcHBpbmcvc3RvcHBlZCA9PiBzdG9wcGluZy9zdG9wcGVkICglZCkgb24gdGhyZWFkICVwIiwgbU5hbWUsCi0gICAgICAgICAgICAgICAgICAgIHBsYXliYWNrVGhyZWFkKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IG5vdCBzdG9wcGluZy9zdG9wcGVkID0+IHN0b3BwaW5nL3N0b3BwZWQgb24gdGhyZWFkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgKGludCltVGhyZWFkSW9IYW5kbGUpOwogICAgICAgICB9CiAgICAgfQogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpwYXVzZSgpCiB7Ci0gICAgQUxPR1YoInBhdXNlKCVkKSwgY2FsbGluZyBwaWQgJWQiLCBtTmFtZSwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBBTE9HVigiJXMoJWQpOiBjYWxsaW5nIHBpZCAlZCIsIF9fZnVuY19fLCBtSWQsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7CiAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgaWYgKHRocmVhZCAhPSAwKSB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKQEAgLTg0Niw3ICs4NjYsOCBAQAogICAgICAgICBjYXNlIEFDVElWRToKICAgICAgICAgY2FzZSBSRVNVTUlORzoKICAgICAgICAgICAgIG1TdGF0ZSA9IFBBVVNJTkc7Ci0gICAgICAgICAgICBBTE9HVigiQUNUSVZFL1JFU1VNSU5HID0+IFBBVVNJTkcgKCVkKSBvbiB0aHJlYWQgJXAiLCBtTmFtZSwgdGhyZWFkLmdldCgpKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IEFDVElWRS9SRVNVTUlORyA9PiBQQVVTSU5HIG9uIHRocmVhZCAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIChpbnQpbVRocmVhZElvSGFuZGxlKTsKICAgICAgICAgICAgIHBsYXliYWNrVGhyZWFkLT5icm9hZGNhc3RfbCgpOwogICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTg1OCw3ICs4NzksNyBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpmbHVzaCgpCiB7Ci0gICAgQUxPR1YoImZsdXNoKCVkKSIsIG1OYW1lKTsKKyAgICBBTE9HVigiJXMoJWQpIiwgX19mdW5jX18sIG1JZCk7CiAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgaWYgKHRocmVhZCAhPSAwKSB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKQEAgLTg4MCwxMSArOTAxLDEyIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBBTE9HVigiZmx1c2g6IG9mZmxvYWQgZmx1c2giKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IG9mZmxvYWQgZmx1c2giLCBfX2Z1bmNfXywgbUlkKTsKICAgICAgICAgICAgIHJlc2V0KCk7CiAKICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RPUFBJTkdfMSB8fCBtU3RhdGUgPT0gU1RPUFBJTkdfMikgewotICAgICAgICAgICAgICAgIEFMT0dWKCJmbHVzaGVkIGluIFNUT1BQSU5HXzEgb3IgMiBzdGF0ZSwgY2hhbmdlIHN0YXRlIHRvIEFDVElWRSIpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IGZsdXNoZWQgaW4gU1RPUFBJTkdfMSBvciAyIHN0YXRlLCBjaGFuZ2Ugc3RhdGUgdG8gQUNUSVZFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQpOwogICAgICAgICAgICAgICAgIG1TdGF0ZSA9IEFDVElWRTsKICAgICAgICAgICAgIH0KIApAQCAtOTQ5LDcgKzk3MSw3IEBACiB7CiAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgaWYgKHRocmVhZCA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJ0aHJlYWQgaXMgZGVhZCIpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiB0aHJlYWQgaXMgZGVhZCIsIF9fZnVuY19fLCBtSWQpOwogICAgICAgICByZXR1cm4gRkFJTEVEX1RSQU5TQUNUSU9OOwogICAgIH0gZWxzZSBpZiAoKHRocmVhZC0+dHlwZSgpID09IFRocmVhZEJhc2U6OkRJUkVDVCkgfHwKICAgICAgICAgICAgICAgICAgICAgKHRocmVhZC0+dHlwZSgpID09IFRocmVhZEJhc2U6Ok9GRkxPQUQpKSB7CkBAIC05NTksNiArOTgxLDE5IEBACiAgICAgfQogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6c2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwKKyAgICAgICAgaW50IHByb2dyYW1JZCkgeworICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgIGlmICh0aHJlYWQgPT0gMCkgeworICAgICAgICBBTE9HRSgidGhyZWFkIGlzIGRlYWQiKTsKKyAgICAgICAgcmV0dXJuIEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9IGVsc2UgaWYgKCh0aHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpESVJFQ1QpIHx8ICh0aHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpPRkZMT0FEKSkgeworICAgICAgICBEaXJlY3RPdXRwdXRUaHJlYWQgKmRpcmVjdE91dHB1dFRocmVhZCA9IHN0YXRpY19jYXN0PERpcmVjdE91dHB1dFRocmVhZCo+KHRocmVhZC5nZXQoKSk7CisgICAgICAgIHJldHVybiBkaXJlY3RPdXRwdXRUaHJlYWQtPnNlbGVjdFByZXNlbnRhdGlvbihwcmVzZW50YXRpb25JZCwgcHJvZ3JhbUlkKTsKKyAgICB9CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCiBWb2x1bWVTaGFwZXI6OlN0YXR1cyBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6YXBwbHlWb2x1bWVTaGFwZXIoCiAgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCiAgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKQpAQCAtOTY5LDggKzEwMDQsMTAgQEAKICAgICAgICAgY29uc3QgVm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uOjpPcHRpb25GbGFnIG9wdGlvbkZsYWcKICAgICAgICAgICAgID0gY29uZmlndXJhdGlvbi0+Z2V0T3B0aW9uRmxhZ3MoKTsKICAgICAgICAgaWYgKChvcHRpb25GbGFnICYgVm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uOjpPUFRJT05fRkxBR19DTE9DS19USU1FKSA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiJXMgdHJhY2tzIGRvIG5vdCBzdXBwb3J0IGZyYW1lIGNvdW50ZWQgVm9sdW1lU2hhcGVyLCIKLSAgICAgICAgICAgICAgICAgICAgIiB1c2luZyBjbG9jayB0aW1lIGluc3RlYWQiLCBpc09mZmxvYWRlZCgpID8gIk9mZmxvYWQiIDogIkRpcmVjdCIpOworICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogJXMgdHJhY2tzIGRvIG5vdCBzdXBwb3J0IGZyYW1lIGNvdW50ZWQgVm9sdW1lU2hhcGVyLCIKKyAgICAgICAgICAgICAgICAgICAgIiB1c2luZyBjbG9jayB0aW1lIGluc3RlYWQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLAorICAgICAgICAgICAgICAgICAgICBpc09mZmxvYWRlZCgpID8gIk9mZmxvYWQiIDogIkRpcmVjdCIpOwogICAgICAgICAgICAgbmV3Q29uZmlndXJhdGlvbiA9IG5ldyBWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24oKmNvbmZpZ3VyYXRpb24pOwogICAgICAgICAgICAgbmV3Q29uZmlndXJhdGlvbi0+c2V0T3B0aW9uRmxhZ3MoCiAgICAgICAgICAgICAgICAgVm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uOjpPcHRpb25GbGFnKG9wdGlvbkZsYWcKQEAgLTk4NSw3ICsxMDIyLDcgQEAKICAgICAgICAgLy8gU2lnbmFsIHRocmVhZCB0byBmZXRjaCBuZXcgdm9sdW1lLgogICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKICAgICAgICAgaWYgKHRocmVhZCAhPSAwKSB7Ci0gICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOwogICAgICAgICAgICAgdGhyZWFkLT5icm9hZGNhc3RfbCgpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTEwNSwxMSArMTE0MiwxNCBAQAogICAgIC8vIHRvIGRldGVjdCB3aGVuIGFsbCBmcmFtZXMgaGF2ZSBiZWVuIHBsYXllZC4gSW4gdGhpcyBjYXNlIGZyYW1lc1dyaXR0ZW4gaXNuJ3QKICAgICAvLyB1c2VmdWwgYmVjYXVzZSBpdCBkb2Vzbid0IGFsd2F5cyByZWZsZWN0IHdoZXRoZXIgdGhlcmUgaXMgZGF0YSBpbiB0aGUgaC93CiAgICAgLy8gYnVmZmVycywgcGFydGljdWxhcmx5IGlmIGEgdHJhY2sgaGFzIGJlZW4gcGF1c2VkIGFuZCByZXN1bWVkIGR1cmluZyBkcmFpbmluZwotICAgIEFMT0dWKCJwcmVzZW50YXRpb25Db21wbGV0ZSgpIG1QcmVzZW50YXRpb25Db21wbGV0ZUZyYW1lcyAlbGxkIGZyYW1lc1dyaXR0ZW4gJWxsZCIsCisgICAgQUxPR1YoIiVzKCVkKTogcHJlc2VudGF0aW9uQ29tcGxldGUoKSBtUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMgJWxsZCBmcmFtZXNXcml0dGVuICVsbGQiLAorICAgICAgICAgICAgX19mdW5jX18sIG1JZCwKICAgICAgICAgICAgIChsb25nIGxvbmcpbVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzLCAobG9uZyBsb25nKWZyYW1lc1dyaXR0ZW4pOwogICAgIGlmIChtUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMgPT0gMCkgewogICAgICAgICBtUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMgPSBmcmFtZXNXcml0dGVuICsgYXVkaW9IYWxGcmFtZXM7Ci0gICAgICAgIEFMT0dWKCJwcmVzZW50YXRpb25Db21wbGV0ZSgpIHJlc2V0OiBtUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMgJWxsZCBhdWRpb0hhbEZyYW1lcyAlenUiLAorICAgICAgICBBTE9HVigiJXMoJWQpOiBwcmVzZW50YXRpb25Db21wbGV0ZSgpIHJlc2V0OiIKKyAgICAgICAgICAgICAgICAiIG1QcmVzZW50YXRpb25Db21wbGV0ZUZyYW1lcyAlbGxkIGF1ZGlvSGFsRnJhbWVzICV6dSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwKICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1QcmVzZW50YXRpb25Db21wbGV0ZUZyYW1lcywgYXVkaW9IYWxGcmFtZXMpOwogICAgIH0KIApAQCAtMTE3NSw3ICsxMjE1LDggQEAKICAgICBpZiAoaXNUZXJtaW5hdGVkKCkgfHwgbVN0YXRlID09IFBBVVNFRCB8fAogICAgICAgICAgICAgKChmcmFtZXNSZWFkeSgpID09IDApICYmICgobVNoYXJlZEJ1ZmZlciAhPSAwKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVN0YXRlID09IFNUT1BQRUQpKSkpIHsKLSAgICAgICAgQUxPR1coIlRyYWNrOjpzZXRTeW5jRXZlbnQoKSBpbiBpbnZhbGlkIHN0YXRlICVkIG9uIHNlc3Npb24gJWQgJXMgbW9kZSwgZnJhbWVzUmVhZHkgJXp1IiwKKyAgICAgICAgQUxPR1coIiVzKCVkKTogaW4gaW52YWxpZCBzdGF0ZSAlZCBvbiBzZXNzaW9uICVkICVzIG1vZGUsIGZyYW1lc1JlYWR5ICV6dSIsCisgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsCiAgICAgICAgICAgICAgIG1TdGF0ZSwgbVNlc3Npb25JZCwgKG1TaGFyZWRCdWZmZXIgIT0gMCkgPyAic3RhdGljIiA6ICJzdHJlYW0iLCBmcmFtZXNSZWFkeSgpKTsKICAgICAgICAgZXZlbnQtPmNhbmNlbCgpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0xMjQ2LDcgKzEyODcsMTcgQEAKIC8vVG8gYmUgY2FsbGVkIHdpdGggdGhyZWFkIGxvY2sgaGVsZAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6dXBkYXRlVHJhY2tGcmFtZUluZm8oCiAgICAgICAgIGludDY0X3QgdHJhY2tGcmFtZXNSZWxlYXNlZCwgaW50NjRfdCBzaW5rRnJhbWVzV3JpdHRlbiwKLSAgICAgICAgY29uc3QgRXh0ZW5kZWRUaW1lc3RhbXAgJnRpbWVTdGFtcCkgeworICAgICAgICB1aW50MzJfdCBoYWxTYW1wbGVSYXRlLCBjb25zdCBFeHRlbmRlZFRpbWVzdGFtcCAmdGltZVN0YW1wKSB7CisgICAvLyBNYWtlIHRoZSBrZXJuZWwgZnJhbWV0aW1lIGF2YWlsYWJsZS4KKyAgICBjb25zdCBGcmFtZVRpbWUgZnR7CisgICAgICAgICAgICB0aW1lU3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdLAorICAgICAgICAgICAgdGltZVN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF19OworICAgIC8vIEFMT0dEKCJGcmFtZVRpbWU6ICVsbGQgJWxsZCIsIChsb25nIGxvbmcpZnQuZnJhbWVzLCAobG9uZyBsb25nKWZ0LnRpbWVOcyk7CisgICAgbUtlcm5lbEZyYW1lVGltZS5zdG9yZShmdCk7CisgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICAvL3VwZGF0ZSBmcmFtZSBtYXAKICAgICBtRnJhbWVNYXAucHVzaCh0cmFja0ZyYW1lc1JlbGVhc2VkLCBzaW5rRnJhbWVzV3JpdHRlbik7CiAKQEAgLTEyNTUsNiArMTMwNiw3IEBACiAgICAgLy8gT3VyIHRpbWVzdGFtcHMgYXJlIG9ubHkgdXBkYXRlZCB3aGVuIHRoZSB0cmFjayBpcyBvbiB0aGUgVGhyZWFkIGFjdGl2ZSBsaXN0LgogICAgIC8vIFdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgdHJhY2tzIGFyZSBub3QgcmVtb3ZlZCBiZWZvcmUgZnVsbCBkcmFpbi4KICAgICBFeHRlbmRlZFRpbWVzdGFtcCBsb2NhbCA9IHRpbWVTdGFtcDsKKyAgICBib29sIGRyYWluZWQgPSB0cnVlOyAvLyBkZWZhdWx0IGFzc3VtZSBkcmFpbmVkLCBpZiBubyBzZXJ2ZXIgaW5mbyBmb3VuZAogICAgIGJvb2wgY2hlY2tlZCA9IGZhbHNlOwogICAgIGZvciAoaW50IGkgPSBFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fTUFYIC0gMTsKICAgICAgICAgICAgIGkgPj0gRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUjsgLS1pKSB7CkBAIC0xMjYzLDIxICsxMzE1LDMwIEBACiAgICAgICAgICAgICBsb2NhbC5tUG9zaXRpb25baV0gPSBtRnJhbWVNYXAuZmluZFgobG9jYWwubVBvc2l0aW9uW2ldKTsKICAgICAgICAgICAgIC8vIGNoZWNrIGRyYWluIHN0YXRlIGZyb20gdGhlIGxhdGVzdCBzdGFnZSBpbiB0aGUgcGlwZWxpbmUuCiAgICAgICAgICAgICBpZiAoIWNoZWNrZWQgJiYgaSA8PSBFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMKSB7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+c2V0RHJhaW5lZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsLm1Qb3NpdGlvbltpXSA+PSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNSZWxlYXNlZCgpKTsKKyAgICAgICAgICAgICAgICBkcmFpbmVkID0gbG9jYWwubVBvc2l0aW9uW2ldID49IG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc1JlbGVhc2VkKCk7CiAgICAgICAgICAgICAgICAgY2hlY2tlZCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKCFjaGVja2VkKSB7IC8vIG5vIHNlcnZlciBpbmZvLCBhc3N1bWUgZHJhaW5lZC4KLSAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+c2V0RHJhaW5lZCh0cnVlKTsKLSAgICB9CisKKyAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5zZXREcmFpbmVkKGRyYWluZWQpOwogICAgIC8vIFNldCBjb3JyZWN0aW9uIGZvciBmbHVzaGVkIGZyYW1lcyB0aGF0IGFyZSBub3QgYWNjb3VudGVkIGZvciBpbiByZWxlYXNlZC4KICAgICBsb2NhbC5tRmx1c2hlZCA9IG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc0ZsdXNoZWQoKTsKICAgICBtU2VydmVyUHJveHktPnNldFRpbWVzdGFtcChsb2NhbCk7CisKKyAgICAvLyBDb21wdXRlIGxhdGVuY3kgaW5mby4KKyAgICBjb25zdCBib29sIHVzZVRyYWNrVGltZXN0YW1wID0gIWRyYWluZWQ7CisgICAgY29uc3QgZG91YmxlIGxhdGVuY3lNcyA9IHVzZVRyYWNrVGltZXN0YW1wCisgICAgICAgICAgICA/IGxvY2FsLmdldE91dHB1dFNlcnZlckxhdGVuY3lNcyhzYW1wbGVSYXRlKCkpCisgICAgICAgICAgICA6IHRpbWVTdGFtcC5nZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXMoaGFsU2FtcGxlUmF0ZSk7CisKKyAgICBtU2VydmVyTGF0ZW5jeUZyb21UcmFjay5zdG9yZSh1c2VUcmFja1RpbWVzdGFtcCk7CisgICAgbVNlcnZlckxhdGVuY3lNcy5zdG9yZShsYXRlbmN5TXMpOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBRjo6T3V0cHV0VHJhY2siCiAKIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Ok91dHB1dFRyYWNrOjpPdXRwdXRUcmFjaygKICAgICAgICAgICAgIFBsYXliYWNrVGhyZWFkICpwbGF5YmFja1RocmVhZCwKQEAgLTEyOTksOSArMTM2MCw5IEBACiAgICAgaWYgKG1DYmxrICE9IE5VTEwpIHsKICAgICAgICAgbU91dEJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKICAgICAgICAgcGxheWJhY2tUaHJlYWQtPm1UcmFja3MuYWRkKHRoaXMpOwotICAgICAgICBBTE9HVigiT3V0cHV0VHJhY2sgY29uc3RydWN0b3IgbUNibGsgJXAsIG1CdWZmZXIgJXAsICIKKyAgICAgICAgQUxPR1YoIiVzKCk6IG1DYmxrICVwLCBtQnVmZmVyICVwLCAiCiAgICAgICAgICAgICAgICAgImZyYW1lQ291bnQgJXp1LCBtQ2hhbm5lbE1hc2sgMHglMDh4IiwKLSAgICAgICAgICAgICAgICBtQ2JsaywgbUJ1ZmZlciwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUNibGssIG1CdWZmZXIsCiAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgbUNoYW5uZWxNYXNrKTsKICAgICAgICAgLy8gc2luY2UgY2xpZW50IGFuZCBzZXJ2ZXIgYXJlIGluIHRoZSBzYW1lIHByb2Nlc3MsCiAgICAgICAgIC8vIHRoZSBidWZmZXIgaGFzIHRoZSBzYW1lIHZpcnR1YWwgYWRkcmVzcyBvbiBib3RoIHNpZGVzCkBAIC0xMzExLDcgKzEzNzIsOCBAQAogICAgICAgICBtQ2xpZW50UHJveHktPnNldFNlbmRMZXZlbCgwLjApOwogICAgICAgICBtQ2xpZW50UHJveHktPnNldFNhbXBsZVJhdGUoc2FtcGxlUmF0ZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1coIkVycm9yIGNyZWF0aW5nIG91dHB1dCB0cmFjayBvbiB0aHJlYWQgJXAiLCBwbGF5YmFja1RocmVhZCk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IEVycm9yIGNyZWF0aW5nIG91dHB1dCB0cmFjayBvbiB0aHJlYWQgJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIChpbnQpbVRocmVhZElvSGFuZGxlKTsKICAgICB9CiB9CiAKQEAgLTEzNDIsNyArMTQwNCw3IEBACiAgICAgbUFjdGl2ZSA9IGZhbHNlOwogfQogCi1ib29sIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Ok91dHB1dFRyYWNrOjp3cml0ZSh2b2lkKiBkYXRhLCB1aW50MzJfdCBmcmFtZXMpCitzc2l6ZV90IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Ok91dHB1dFRyYWNrOjp3cml0ZSh2b2lkKiBkYXRhLCB1aW50MzJfdCBmcmFtZXMpCiB7CiAgICAgQnVmZmVyICpwSW5CdWZmZXI7CiAgICAgQnVmZmVyIGluQnVmZmVyOwpAQCAtMTM3Myw4ICsxNDM1LDkgQEAKICAgICAgICAgICAgIG5zZWNzX3Qgc3RhcnRUaW1lID0gc3lzdGVtVGltZSgpOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb2J0YWluQnVmZmVyKCZtT3V0QnVmZmVyLCB3YWl0VGltZUxlZnRNcyk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SICYmIHN0YXR1cyAhPSBOT1RfRU5PVUdIX0RBVEEpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiT3V0cHV0VHJhY2s6OndyaXRlKCkgJXAgdGhyZWFkICVwIG5vIG1vcmUgb3V0cHV0IGJ1ZmZlcnM7IHN0YXR1cyAlZCIsIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBtVGhyZWFkLnVuc2FmZV9nZXQoKSwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiB0aHJlYWQgJWQgbm8gbW9yZSBvdXRwdXQgYnVmZmVyczsgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KW1UaHJlYWRJb0hhbmRsZSwgc3RhdHVzKTsKICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJGdWxsID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTE0MTAsOCArMTQ3Myw5IEBACiAgICAgICAgICAgICAgICAgaWYgKHBJbkJ1ZmZlciAhPSAmaW5CdWZmZXIpIHsKICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBJbkJ1ZmZlcjsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQUxPR1YoIk91dHB1dFRyYWNrOjp3cml0ZSgpICVwIHRocmVhZCAlcCByZWxlYXNlZCBvdmVyZmxvdyBidWZmZXIgJXp1IiwgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJlYWQudW5zYWZlX2dldCgpLCBtQnVmZmVyUXVldWUuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiB0aHJlYWQgJWQgcmVsZWFzZWQgb3ZlcmZsb3cgYnVmZmVyICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCltVGhyZWFkSW9IYW5kbGUsIG1CdWZmZXJRdWV1ZS5zaXplKCkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTE0MjksMTEgKzE0OTMsMTQgQEAKICAgICAgICAgICAgICAgICBwSW5CdWZmZXItPnJhdyA9IHBJbkJ1ZmZlci0+bUJ1ZmZlcjsKICAgICAgICAgICAgICAgICBtZW1jcHkocEluQnVmZmVyLT5yYXcsIGluQnVmZmVyLnJhdywgaW5CdWZmZXIuZnJhbWVDb3VudCAqIG1GcmFtZVNpemUpOwogICAgICAgICAgICAgICAgIG1CdWZmZXJRdWV1ZS5hZGQocEluQnVmZmVyKTsKLSAgICAgICAgICAgICAgICBBTE9HVigiT3V0cHV0VHJhY2s6OndyaXRlKCkgJXAgdGhyZWFkICVwIGFkZGluZyBvdmVyZmxvdyBidWZmZXIgJXp1IiwgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJlYWQudW5zYWZlX2dldCgpLCBtQnVmZmVyUXVldWUuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiB0aHJlYWQgJWQgYWRkaW5nIG92ZXJmbG93IGJ1ZmZlciAlenUiLCBfX2Z1bmNfXywgbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCltVGhyZWFkSW9IYW5kbGUsIG1CdWZmZXJRdWV1ZS5zaXplKCkpOworICAgICAgICAgICAgICAgIC8vIGF1ZGlvIGRhdGEgaXMgY29uc3VtZWQgKHN0b3JlZCBsb2NhbGx5KTsgc2V0IGZyYW1lQ291bnQgdG8gMC4KKyAgICAgICAgICAgICAgICBpbkJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIk91dHB1dFRyYWNrOjp3cml0ZSgpICVwIHRocmVhZCAlcCBubyBtb3JlIG92ZXJmbG93IGJ1ZmZlcnMiLAotICAgICAgICAgICAgICAgICAgICAgICAgbVRocmVhZC51bnNhZmVfZ2V0KCksIHRoaXMpOworICAgICAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IHRocmVhZCAlZCBubyBtb3JlIG92ZXJmbG93IGJ1ZmZlcnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgKGludCltVGhyZWFkSW9IYW5kbGUpOworICAgICAgICAgICAgICAgIC8vIFRPRE86IHJldHVybiBlcnJvciBmb3IgdGhpcy4KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTE0NDQsNyArMTUxMSw3IEBACiAgICAgICAgIHN0b3AoKTsKICAgICB9CiAKLSAgICByZXR1cm4gb3V0cHV0QnVmZmVyRnVsbDsKKyAgICByZXR1cm4gZnJhbWVzIC0gaW5CdWZmZXIuZnJhbWVDb3VudDsgIC8vIG51bWJlciBvZiBmcmFtZXMgY29uc3VtZWQuCiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6T3V0cHV0VHJhY2s6OmNvcHlNZXRhZGF0YVRvKE1ldGFkYXRhSW5zZXJ0ZXImIGJhY2tJbnNlcnRlcikgY29uc3QKQEAgLTE0OTYsNiArMTU2MywxMCBAQAogICAgIH0KIH0KIAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiQUY6OlBhdGNoVHJhY2siCisKIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s6OlBhdGNoVHJhY2soUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCkBAIC0xNTA5LDcgKzE1ODAsNyBAQAogICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3R7fSAvKiBjdXJyZW50bHkgdW51c2VkIGZvciBwYXRjaCB0cmFjayAqLywKICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgYnVmZmVyLCBidWZmZXJTaXplLCBudWxscHRyIC8qIHNoYXJlZEJ1ZmZlciAqLywKLSAgICAgICAgICAgICAgQVVESU9fU0VTU0lPTl9OT05FLCBnZXR1aWQoKSwgZmxhZ3MsIFRZUEVfUEFUQ0gpLAorICAgICAgICAgICAgICBBVURJT19TRVNTSU9OX05PTkUsIEFJRF9BVURJT1NFUlZFUiwgZmxhZ3MsIFRZUEVfUEFUQ0gpLAogICAgICAgICAgICAgICBtUHJveHkobmV3IENsaWVudFByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LCBtRnJhbWVTaXplLCB0cnVlLCB0cnVlKSkKIHsKICAgICB1aW50NjRfdCBtaXhCdWZmZXJOcyA9ICgodWludDY0X3QpMiAqIHBsYXliYWNrVGhyZWFkLT5mcmFtZUNvdW50KCkgKiAxMDAwMDAwMDAwKSAvCkBAIC0xNTE3LDggKzE1ODgsOCBAQAogICAgIG1QZWVyVGltZW91dC50dl9zZWMgPSBtaXhCdWZmZXJOcyAvIDEwMDAwMDAwMDA7CiAgICAgbVBlZXJUaW1lb3V0LnR2X25zZWMgPSAoaW50KSAobWl4QnVmZmVyTnMgJSAxMDAwMDAwMDAwKTsKIAotICAgIEFMT0dWKCJQYXRjaFRyYWNrICVwIHNhbXBsZVJhdGUgJWQgbVBlZXJUaW1lb3V0ICVkLiUwM2Qgc2VjIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgc2FtcGxlUmF0ZSwKKyAgICBBTE9HVigiJXMoJWQpOiBzYW1wbGVSYXRlICVkIG1QZWVyVGltZW91dCAlZC4lMDNkIHNlYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpbVBlZXJUaW1lb3V0LnR2X3NlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkobVBlZXJUaW1lb3V0LnR2X25zZWMgLyAxMDAwMDAwKSk7CiB9CkBAIC0xNTI4LDcgKzE1OTksNyBAQAogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrOjpzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbikKIHsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBUcmFjazo6c3RhcnQoZXZlbnQsIHRyaWdnZXJTZXNzaW9uKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CkBAIC0xNTQyLDExICsxNjEzLDExIEBACiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrOjpnZXROZXh0QnVmZmVyKAogICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKIHsKLSAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICJQYXRjaFRyYWNrOjpnZXROZXh0QnVmZmVyKCkgY2FsbGVkIHdpdGhvdXQgcGVlciBwcm94eSIpOworICAgIEFMT0dfQVNTRVJUKG1QZWVyUHJveHkgIT0gMCwgIiVzKCVkKTogY2FsbGVkIHdpdGhvdXQgcGVlciBwcm94eSIsIF9fZnVuY19fLCBtSWQpOwogICAgIFByb3h5OjpCdWZmZXIgYnVmOwogICAgIGJ1Zi5tRnJhbWVDb3VudCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUGVlclByb3h5LT5vYnRhaW5CdWZmZXIoJmJ1ZiwgJm1QZWVyVGltZW91dCk7Ci0gICAgQUxPR1ZfSUYoc3RhdHVzICE9IE5PX0VSUk9SLCAiUGF0Y2hUcmFjaygpICVwIGdldE5leHRCdWZmZXIgc3RhdHVzICVkIiwgdGhpcywgc3RhdHVzKTsKKyAgICBBTE9HVl9JRihzdGF0dXMgIT0gTk9fRVJST1IsICIlcyglZCk6IGdldE5leHRCdWZmZXIgc3RhdHVzICVkIiwgX19mdW5jX18sIG1JZCwgc3RhdHVzKTsKICAgICBidWZmZXItPmZyYW1lQ291bnQgPSBidWYubUZyYW1lQ291bnQ7CiAgICAgaWYgKGJ1Zi5tRnJhbWVDb3VudCA9PSAwKSB7CiAgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKQEAgLTE1NTcsNyArMTYyOCw3IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjazo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKIHsKLSAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICJQYXRjaFRyYWNrOjpyZWxlYXNlQnVmZmVyKCkgY2FsbGVkIHdpdGhvdXQgcGVlciBwcm94eSIpOworICAgIEFMT0dfQVNTRVJUKG1QZWVyUHJveHkgIT0gMCwgIiVzKCVkKTogY2FsbGVkIHdpdGhvdXQgcGVlciBwcm94eSIsIF9fZnVuY19fLCBtSWQpOwogICAgIFByb3h5OjpCdWZmZXIgYnVmOwogICAgIGJ1Zi5tRnJhbWVDb3VudCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKICAgICBidWYubVJhdyA9IGJ1ZmZlci0+cmF3OwpAQCAtMTU5Miw3ICsxNjYzLDcgQEAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjazo6cmVzdGFydElmRGlzYWJsZWQoKQogewogICAgIGlmIChhbmRyb2lkX2F0b21pY19hbmQofkNCTEtfRElTQUJMRUQsICZtQ2Jsay0+bUZsYWdzKSAmIENCTEtfRElTQUJMRUQpIHsKLSAgICAgICAgQUxPR1coIlBhdGNoVHJhY2s6OnJlbGVhc2VCdWZmZXIoKSBkaXNhYmxlZCBkdWUgdG8gcHJldmlvdXMgdW5kZXJydW4sIHJlc3RhcnRpbmciKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogZGlzYWJsZWQgZHVlIHRvIHByZXZpb3VzIHVuZGVycnVuLCByZXN0YXJ0aW5nIiwgX19mdW5jX18sIG1JZCk7CiAgICAgICAgIHN0YXJ0KCk7CiAgICAgfQogfQpAQCAtMTYwMCw2ICsxNjcxLDggQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vICAgICAgUmVjb3JkCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBRjo6UmVjb3JkSGFuZGxlIgogCiBBdWRpb0ZsaW5nZXI6OlJlY29yZEhhbmRsZTo6UmVjb3JkSGFuZGxlKAogICAgICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s+JiByZWNvcmRUcmFjaykKQEAgLTE2MTUsNyArMTY4OCw3IEBACiAKIGJpbmRlcjo6U3RhdHVzIEF1ZGlvRmxpbmdlcjo6UmVjb3JkSGFuZGxlOjpzdGFydChpbnQgLypBdWRpb1N5c3RlbTo6c3luY19ldmVudF90Ki8gZXZlbnQsCiAgICAgICAgIGludCAvKmF1ZGlvX3Nlc3Npb25fdCovIHRyaWdnZXJTZXNzaW9uKSB7Ci0gICAgQUxPR1YoIlJlY29yZEhhbmRsZTo6c3RhcnQoKSIpOworICAgIEFMT0dWKCIlcygpIiwgX19mdW5jX18pOwogICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoCiAgICAgICAgIG1SZWNvcmRUcmFjay0+c3RhcnQoKEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QpZXZlbnQsIChhdWRpb19zZXNzaW9uX3QpIHRyaWdnZXJTZXNzaW9uKSk7CiB9CkBAIC0xNjI2LDE4ICsxNjk5LDIwIEBACiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6OnN0b3Bfbm9udmlydHVhbCgpIHsKLSAgICBBTE9HVigiUmVjb3JkSGFuZGxlOjpzdG9wKCkiKTsKKyAgICBBTE9HVigiJXMoKSIsIF9fZnVuY19fKTsKICAgICBtUmVjb3JkVHJhY2stPnN0b3AoKTsKIH0KIAogYmluZGVyOjpTdGF0dXMgQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKAogICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcykgewotICAgIEFMT0dWKCJSZWNvcmRIYW5kbGU6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKCkiKTsKKyAgICBBTE9HVigiJXMoKSIsIF9fZnVuY19fKTsKICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKAogICAgICAgICAgICAgbVJlY29yZFRyYWNrLT5nZXRBY3RpdmVNaWNyb3Bob25lcyhhY3RpdmVNaWNyb3Bob25lcykpOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBRjo6UmVjb3JkVHJhY2siCiAKIC8vIFJlY29yZFRyYWNrIGNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBhbmQgVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAogQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpSZWNvcmRUcmFjaygKQEAgLTE2NzIsMTggKzE3NDcsMjAgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIG1SZWNvcmRCdWZmZXJDb252ZXJ0ZXIgPSBuZXcgUmVjb3JkQnVmZmVyQ29udmVydGVyKAotICAgICAgICAgICAgdGhyZWFkLT5tQ2hhbm5lbE1hc2ssIHRocmVhZC0+bUZvcm1hdCwgdGhyZWFkLT5tU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmb3JtYXQsIHNhbXBsZVJhdGUpOwotICAgIC8vIENoZWNrIGlmIHRoZSBSZWNvcmRCdWZmZXJDb252ZXJ0ZXIgY29uc3RydWN0aW9uIHdhcyBzdWNjZXNzZnVsLgotICAgIC8vIElmIG5vdCwgZG9uJ3QgY29udGludWUgd2l0aCBjb25zdHJ1Y3Rpb24uCi0gICAgLy8KLSAgICAvLyBOT1RFOiBJdCB3b3VsZCBiZSBleHRyZW1lbHkgcmFyZSB0aGF0IHRoZSByZWNvcmQgdHJhY2sgY2Fubm90IGJlIGNyZWF0ZWQKLSAgICAvLyBmb3IgdGhlIGN1cnJlbnQgZGV2aWNlLCBidXQgYSBwZW5kaW5nIG9yIGZ1dHVyZSBkZXZpY2UgY2hhbmdlIHdvdWxkIG1ha2UKLSAgICAvLyB0aGUgcmVjb3JkIHRyYWNrIGNvbmZpZ3VyYXRpb24gdmFsaWQuCi0gICAgaWYgKG1SZWNvcmRCdWZmZXJDb252ZXJ0ZXItPmluaXRDaGVjaygpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJSZWNvcmRUcmFjayB1bmFibGUgdG8gY3JlYXRlIHJlY29yZCBidWZmZXIgY29udmVydGVyIik7Ci0gICAgICAgIHJldHVybjsKKyAgICBpZiAoIWlzRGlyZWN0KCkpIHsKKyAgICAgICAgbVJlY29yZEJ1ZmZlckNvbnZlcnRlciA9IG5ldyBSZWNvcmRCdWZmZXJDb252ZXJ0ZXIoCisgICAgICAgICAgICAgICAgdGhyZWFkLT5tQ2hhbm5lbE1hc2ssIHRocmVhZC0+bUZvcm1hdCwgdGhyZWFkLT5tU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZm9ybWF0LCBzYW1wbGVSYXRlKTsKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIFJlY29yZEJ1ZmZlckNvbnZlcnRlciBjb25zdHJ1Y3Rpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgICAgIC8vIElmIG5vdCwgZG9uJ3QgY29udGludWUgd2l0aCBjb25zdHJ1Y3Rpb24uCisgICAgICAgIC8vCisgICAgICAgIC8vIE5PVEU6IEl0IHdvdWxkIGJlIGV4dHJlbWVseSByYXJlIHRoYXQgdGhlIHJlY29yZCB0cmFjayBjYW5ub3QgYmUgY3JlYXRlZAorICAgICAgICAvLyBmb3IgdGhlIGN1cnJlbnQgZGV2aWNlLCBidXQgYSBwZW5kaW5nIG9yIGZ1dHVyZSBkZXZpY2UgY2hhbmdlIHdvdWxkIG1ha2UKKyAgICAgICAgLy8gdGhlIHJlY29yZCB0cmFjayBjb25maWd1cmF0aW9uIHZhbGlkLgorICAgICAgICBpZiAobVJlY29yZEJ1ZmZlckNvbnZlcnRlci0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IFJlY29yZFRyYWNrIHVuYWJsZSB0byBjcmVhdGUgcmVjb3JkIGJ1ZmZlciBjb252ZXJ0ZXIiLCBfX2Z1bmNfXywgbUlkKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIG1TZXJ2ZXJQcm94eSA9IG5ldyBBdWRpb1JlY29yZFNlcnZlclByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LApAQCAtMTY5NCwxMiArMTc3MSwyMCBAQAogICAgIGlmIChmbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgewogICAgICAgICBBTE9HX0FTU0VSVCh0aHJlYWQtPm1GYXN0VHJhY2tBdmFpbCk7CiAgICAgICAgIHRocmVhZC0+bUZhc3RUcmFja0F2YWlsID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVE9ETzogb25seSBOb3JtYWwgUmVjb3JkIGhhcyB0aW1lc3RhbXBzIChGYXN0IFJlY29yZCBkb2VzIG5vdCkuCisgICAgICAgIG1TZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkID0gY2hlY2tTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKG1Gb3JtYXQsIGZsYWdzKTsKICAgICB9CisjaWZkZWYgVEVFX1NJTksKKyAgICBtVGVlLnNldElkKHN0ZDo6c3RyaW5nKCJfIikgKyBzdGQ6OnRvX3N0cmluZyhtVGhyZWFkSW9IYW5kbGUpCisgICAgICAgICAgICArICJfIiArIHN0ZDo6dG9fc3RyaW5nKG1JZCkKKyAgICAgICAgICAgICsgIl9SIik7CisjZW5kaWYKIH0KIAogQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjp+UmVjb3JkVHJhY2soKQogewotICAgIEFMT0dWKCIlcyIsIF9fZnVuY19fKTsKKyAgICBBTE9HVigiJXMoKSIsIF9fZnVuY19fKTsKICAgICBkZWxldGUgbVJlY29yZEJ1ZmZlckNvbnZlcnRlcjsKICAgICBkZWxldGUgbVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyOwogfQpAQCAtMTc1NiwxNyArMTg0MSwzNCBAQAogICAgIC8vIHNlZSBjb21tZW50cyBhdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6ZGVzdHJveSgpCiAgICAgc3A8UmVjb3JkVHJhY2s+IGtlZXAodGhpcyk7CiAgICAgewotICAgICAgICBpZiAoaXNFeHRlcm5hbFRyYWNrKCkpIHsKLSAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gQUNUSVZFIHx8IG1TdGF0ZSA9PSBSRVNVTUlORykgewotICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQobVBvcnRJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KG1Qb3J0SWQpOwotICAgICAgICB9CisgICAgICAgIHRyYWNrX3N0YXRlIHByaW9yU3RhdGUgPSBtU3RhdGU7CiAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgICAgICBpZiAodGhyZWFkICE9IDApIHsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKICAgICAgICAgICAgIFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkID0gKFJlY29yZFRocmVhZCAqKSB0aHJlYWQuZ2V0KCk7Ci0gICAgICAgICAgICByZWNvcmRUaHJlYWQtPmRlc3Ryb3lUcmFja19sKHRoaXMpOworICAgICAgICAgICAgcHJpb3JTdGF0ZSA9IG1TdGF0ZTsKKyAgICAgICAgICAgIHJlY29yZFRocmVhZC0+ZGVzdHJveVRyYWNrX2wodGhpcyk7IC8vIG1vdmUgbVN0YXRlIHRvIFNUT1BQRUQsIHRlcm1pbmF0ZQorICAgICAgICB9CisgICAgICAgIC8vIEFQTSBwb3J0aWQvY2xpZW50IG1hbmFnZW1lbnQgZG9uZSBvdXRzaWRlIG9mIGxvY2suCisgICAgICAgIC8vIE5PVEU6IGlmIHRocmVhZCBkb2Vzbid0IGV4aXN0LCB0aGUgaW5wdXQgZGVzY3JpcHRvciBwcm9iYWJseSBkb2Vzbid0IGVpdGhlci4KKyAgICAgICAgaWYgKGlzRXh0ZXJuYWxUcmFjaygpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHByaW9yU3RhdGUpIHsKKyAgICAgICAgICAgIGNhc2UgQUNUSVZFOiAgICAgLy8gaW52YWxpZGF0ZWQgd2hpbGUgc3RpbGwgYWN0aXZlCisgICAgICAgICAgICBjYXNlIFNUQVJUSU5HXzI6IC8vIGludmFsaWRhdGVkL3N0YXJ0LWFib3J0ZWQgYWZ0ZXIgc3RhcnRJbnB1dCBzdWNjZXNzZnVsbHkgY2FsbGVkCisgICAgICAgICAgICBjYXNlIFBBVVNJTkc6ICAgIC8vIGludmFsaWRhdGVkIHdoaWxlIGluIHRoZSBtaWRkbGUgb2Ygc3RvcCgpIHBhdXNpbmcgKHN0aWxsIGFjdGl2ZSkKKyAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcElucHV0KG1Qb3J0SWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNUQVJUSU5HXzE6IC8vIGludmFsaWRhdGVkL3N0YXJ0LWFib3J0ZWQgYW5kIHN0YXJ0SW5wdXQgbm90IHN1Y2Nlc3NmdWwKKyAgICAgICAgICAgIGNhc2UgUEFVU0VEOiAgICAgLy8gT0ssIG5vdCBhY3RpdmUKKyAgICAgICAgICAgIGNhc2UgSURMRTogICAgICAgLy8gT0ssIG5vdCBhY3RpdmUKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTVE9QUEVEOiAgICAvLyB1bmV4cGVjdGVkIChkZXN0cm95ZWQpCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzKCVkKTogaW52YWxpZCBwcmlvciBzdGF0ZTogJWQiLCBfX2Z1bmNfXywgbUlkLCBwcmlvclN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQobVBvcnRJZCk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0xNzgzLDMxICsxODg1LDUwIEBACiB9CiAKIAotLypzdGF0aWMqLyB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZCgiQWN0aXZlIENsaWVudCBTZXNzaW9uIFMgIEZsYWdzICAgRm9ybWF0IENobiBtYXNrICBTUmF0ZSAgIFNlcnZlciBGcm1DbnQgU2lsXG4iKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJBY3RpdmUgICAgIElkIENsaWVudCBTZXNzaW9uIFBvcnQgSWQgIFMgIEZsYWdzICAiCisgICAgICAgICAgICAgICAgICAgICAgICAiIEZvcm1hdCBDaG4gbWFzayAgU1JhdGUgU291cmNlICAiCisgICAgICAgICAgICAgICAgICAgICAgICAiIFNlcnZlciBGcm1DbnQgRnJtUmR5IFNpbCVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaXNTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKCkgPyAiICAgTGF0ZW5jeSIgOiAiIik7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjphcHBlbmREdW1wKFN0cmluZzgmIHJlc3VsdCwgYm9vbCBhY3RpdmUpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJWMlNXMgJTZ1ICU3dSAlMnMgMHglMDNYICIKLSAgICAgICAgICAgICIlMDhYICUwOFggJTZ1ICIKLSAgICAgICAgICAgICIlMDhYICU2enUgJTNjXG4iLAorICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiVjJTVzICU2ZCAlNnUgJTd1ICU3dSAgJTJzIDB4JTAzWCAiCisgICAgICAgICAgICAiJTA4WCAlMDhYICU2dSAlNlggIgorICAgICAgICAgICAgIiUwOFggJTZ6dSAlNnp1ICUzYyIsCiAgICAgICAgICAgICBpc0Zhc3RUcmFjaygpID8gJ0YnIDogJyAnLAogICAgICAgICAgICAgYWN0aXZlID8gInllcyIgOiAibm8iLAotICAgICAgICAgICAgKG1DbGllbnQgPT0gMCkgPyBnZXRwaWRfY2FjaGVkIDogbUNsaWVudC0+cGlkKCksCisgICAgICAgICAgICBtSWQsCisgICAgICAgICAgICAobUNsaWVudCA9PSAwKSA/IGdldHBpZCgpIDogbUNsaWVudC0+cGlkKCksCiAgICAgICAgICAgICBtU2Vzc2lvbklkLAorICAgICAgICAgICAgbVBvcnRJZCwKICAgICAgICAgICAgIGdldFRyYWNrU3RhdGVTdHJpbmcoKSwKICAgICAgICAgICAgIG1DYmxrLT5tRmxhZ3MsCiAKICAgICAgICAgICAgIG1Gb3JtYXQsCiAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIG1BdHRyLnNvdXJjZSwKIAogICAgICAgICAgICAgbUNibGstPm1TZXJ2ZXIsCiAgICAgICAgICAgICBtRnJhbWVDb3VudCwKKyAgICAgICAgICAgIG1TZXJ2ZXJQcm94eS0+ZnJhbWVzUmVhZHlTYWZlKCksCiAgICAgICAgICAgICBpc1NpbGVuY2VkKCkgPyAncycgOiAnbicKICAgICAgICAgICAgICk7CisgICAgaWYgKGlzU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCgpKSB7CisgICAgICAgIGRvdWJsZSBsYXRlbmN5TXM7CisgICAgICAgIGJvb2wgZnJvbVRyYWNrOworICAgICAgICBpZiAoZ2V0VHJhY2tMYXRlbmN5TXMoJmxhdGVuY3lNcywgJmZyb21UcmFjaykgPT0gT0spIHsKKyAgICAgICAgICAgIC8vIFNob3cgbGF0ZW5jeSBpbiBtc2VjLCBmb2xsb3dlZCBieSAndCcgaWYgZnJvbSB0cmFjayB0aW1lc3RhbXAgKHRoZSBtb3N0IGFjY3VyYXRlKQorICAgICAgICAgICAgLy8gb3IgJ2snIGlmIGVzdGltYXRlZCBmcm9tIGtlcm5lbCAodXN1YWxseSBmb3IgZGVidWdnaW5nKS4KKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAlNy4ybGYgJWMiLCBsYXRlbmN5TXMsIGZyb21UcmFjayA/ICd0JyA6ICdrJyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlMTBzIiwgbUNibGstPm1TZXJ2ZXIgIT0gMCA/ICJ1bmF2YWlsIiA6ICJuZXciKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6aGFuZGxlU3luY1N0YXJ0RXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpCkBAIC0xODM3LDYgKzE5NTgsMTYgQEAKICAgICAgICAgaW50NjRfdCB0cmFja0ZyYW1lc1JlbGVhc2VkLCBpbnQ2NF90IHNvdXJjZUZyYW1lc1JlYWQsCiAgICAgICAgIHVpbnQzMl90IGhhbFNhbXBsZVJhdGUsIGNvbnN0IEV4dGVuZGVkVGltZXN0YW1wICZ0aW1lc3RhbXApCiB7CisgICAvLyBNYWtlIHRoZSBrZXJuZWwgZnJhbWV0aW1lIGF2YWlsYWJsZS4KKyAgICBjb25zdCBGcmFtZVRpbWUgZnR7CisgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdLAorICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF19OworICAgIC8vIEFMT0dEKCJGcmFtZVRpbWU6ICVsbGQgJWxsZCIsIChsb25nIGxvbmcpZnQuZnJhbWVzLCAobG9uZyBsb25nKWZ0LnRpbWVOcyk7CisgICAgbUtlcm5lbEZyYW1lVGltZS5zdG9yZShmdCk7CisgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBFeHRlbmRlZFRpbWVzdGFtcCBsb2NhbCA9IHRpbWVzdGFtcDsKIAogICAgIC8vIENvbnZlcnQgSEFMIGZyYW1lcyB0byBzZXJ2ZXItc2lkZSB0cmFjayBmcmFtZXMgYXQgdHJhY2sgc2FtcGxlIHJhdGUuCkBAIC0xODUwLDYgKzE5ODEsMTUgQEAKICAgICAgICAgfQogICAgIH0KICAgICBtU2VydmVyUHJveHktPnNldFRpbWVzdGFtcChsb2NhbCk7CisKKyAgICAvLyBDb21wdXRlIGxhdGVuY3kgaW5mby4KKyAgICBjb25zdCBib29sIHVzZVRyYWNrVGltZXN0YW1wID0gdHJ1ZTsgLy8gdXNlIHRyYWNrIHVubGVzcyBkZWJ1Z2dpbmcuCisgICAgY29uc3QgZG91YmxlIGxhdGVuY3lNcyA9IC0gKHVzZVRyYWNrVGltZXN0YW1wCisgICAgICAgICAgICA/IGxvY2FsLmdldE91dHB1dFNlcnZlckxhdGVuY3lNcyhzYW1wbGVSYXRlKCkpCisgICAgICAgICAgICA6IHRpbWVzdGFtcC5nZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXMoaGFsU2FtcGxlUmF0ZSkpOworCisgICAgbVNlcnZlckxhdGVuY3lGcm9tVHJhY2suc3RvcmUodXNlVHJhY2tUaW1lc3RhbXApOworICAgIG1TZXJ2ZXJMYXRlbmN5TXMuc3RvcmUobGF0ZW5jeU1zKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKQEAgLTE4NjQsNiArMjAwNCwxMCBAQAogICAgIH0KIH0KIAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiQUY6OlBhdGNoUmVjb3JkIgorCiBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ6OlBhdGNoUmVjb3JkKFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKQEAgLTE4NzUsNyArMjAxOSw4IEBACiAgICAgOiAgIFJlY29yZFRyYWNrKHJlY29yZFRocmVhZCwgTlVMTCwKICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3R7fSAvKiBjdXJyZW50bHkgdW51c2VkIGZvciBwYXRjaCB0cmFjayAqLywKICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgIGJ1ZmZlciwgYnVmZmVyU2l6ZSwgQVVESU9fU0VTU0lPTl9OT05FLCBnZXR1aWQoKSwgZmxhZ3MsIFRZUEVfUEFUQ0gpLAorICAgICAgICAgICAgICAgIGJ1ZmZlciwgYnVmZmVyU2l6ZSwgQVVESU9fU0VTU0lPTl9OT05FLCBBSURfQVVESU9TRVJWRVIsCisgICAgICAgICAgICAgICAgZmxhZ3MsIFRZUEVfUEFUQ0gpLAogICAgICAgICAgICAgICAgIG1Qcm94eShuZXcgQ2xpZW50UHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsIG1GcmFtZVNpemUsIGZhbHNlLCB0cnVlKSkKIHsKICAgICB1aW50NjRfdCBtaXhCdWZmZXJOcyA9ICgodWludDY0X3QpMiAqIHJlY29yZFRocmVhZC0+ZnJhbWVDb3VudCgpICogMTAwMDAwMDAwMCkgLwpAQCAtMTg4Myw4ICsyMDI4LDggQEAKICAgICBtUGVlclRpbWVvdXQudHZfc2VjID0gbWl4QnVmZmVyTnMgLyAxMDAwMDAwMDAwOwogICAgIG1QZWVyVGltZW91dC50dl9uc2VjID0gKGludCkgKG1peEJ1ZmZlck5zICUgMTAwMDAwMDAwMCk7CiAKLSAgICBBTE9HVigiUGF0Y2hSZWNvcmQgJXAgc2FtcGxlUmF0ZSAlZCBtUGVlclRpbWVvdXQgJWQuJTAzZCBzZWMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBzYW1wbGVSYXRlLAorICAgIEFMT0dWKCIlcyglZCk6IHNhbXBsZVJhdGUgJWQgbVBlZXJUaW1lb3V0ICVkLiUwM2Qgc2VjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCltUGVlclRpbWVvdXQudHZfc2VjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShtUGVlclRpbWVvdXQudHZfbnNlYyAvIDEwMDAwMDApKTsKIH0KQEAgLTE4OTcsMTIgKzIwNDIsMTIgQEAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZDo6Z2V0TmV4dEJ1ZmZlcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpCiB7Ci0gICAgQUxPR19BU1NFUlQobVBlZXJQcm94eSAhPSAwLCAiUGF0Y2hSZWNvcmQ6OmdldE5leHRCdWZmZXIoKSBjYWxsZWQgd2l0aG91dCBwZWVyIHByb3h5Iik7CisgICAgQUxPR19BU1NFUlQobVBlZXJQcm94eSAhPSAwLCAiJXMoJWQpOiBjYWxsZWQgd2l0aG91dCBwZWVyIHByb3h5IiwgX19mdW5jX18sIG1JZCk7CiAgICAgUHJveHk6OkJ1ZmZlciBidWY7CiAgICAgYnVmLm1GcmFtZUNvdW50ID0gYnVmZmVyLT5mcmFtZUNvdW50OwogICAgIHN0YXR1c190IHN0YXR1cyA9IG1QZWVyUHJveHktPm9idGFpbkJ1ZmZlcigmYnVmLCAmbVBlZXJUaW1lb3V0KTsKICAgICBBTE9HVl9JRihzdGF0dXMgIT0gTk9fRVJST1IsCi0gICAgICAgICAgICAgIlBhdGNoUmVjb3JkKCkgJXAgbVBlZXJQcm94eS0+b2J0YWluQnVmZmVyIHN0YXR1cyAlZCIsIHRoaXMsIHN0YXR1cyk7CisgICAgICAgICAgICAgIiVzKCVkKTogbVBlZXJQcm94eS0+b2J0YWluQnVmZmVyIHN0YXR1cyAlZCIsIF9fZnVuY19fLCBtSWQsIHN0YXR1cyk7CiAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gYnVmLm1GcmFtZUNvdW50OwogICAgIGlmIChidWYubUZyYW1lQ291bnQgPT0gMCkgewogICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CkBAIC0xOTEzLDcgKzIwNTgsNyBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZDo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKIHsKLSAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICJQYXRjaFJlY29yZDo6cmVsZWFzZUJ1ZmZlcigpIGNhbGxlZCB3aXRob3V0IHBlZXIgcHJveHkiKTsKKyAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICIlcyglZCk6IGNhbGxlZCB3aXRob3V0IHBlZXIgcHJveHkiLCBfX2Z1bmNfXywgbUlkKTsKICAgICBQcm94eTo6QnVmZmVyIGJ1ZjsKICAgICBidWYubUZyYW1lQ291bnQgPSBidWZmZXItPmZyYW1lQ291bnQ7CiAgICAgYnVmLm1SYXcgPSBidWZmZXItPnJhdzsKQEAgLTE5MzIsNyArMjA3Nyw5IEBACiAgICAgbVByb3h5LT5yZWxlYXNlQnVmZmVyKGJ1ZmZlcik7CiB9CiAKLQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiQUY6Ok1tYXBUcmFjayIKIAogQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpNbWFwVHJhY2s6Ok1tYXBUcmFjayhUaHJlYWRCYXNlICp0aHJlYWQsCiAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0ciwKQEAgLTE5NDAsMTMgKzIwODcsMTQgQEAKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgYm9vbCBpc091dCwKICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBOVUxMLCBhdHRyLCBzYW1wbGVSYXRlLCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgKHNpemVfdCkwIC8qIGZyYW1lQ291bnQgKi8sCiAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIGJ1ZmZlciAqLywgKHNpemVfdCkwIC8qIGJ1ZmZlclNpemUgKi8sCi0gICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHVpZCwgZmFsc2UgLyogaXNPdXQgKi8sCisgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHVpZCwgaXNPdXQsCiAgICAgICAgICAgICAgICAgICBBTExPQ19OT05FLAogICAgICAgICAgICAgICAgICAgVFlQRV9ERUZBVUxULCBwb3J0SWQpLAogICAgICAgICBtUGlkKHBpZCksIG1TaWxlbmNlZChmYWxzZSksIG1TaWxlbmNlZE5vdGlmaWVkKGZhbHNlKQpAQCAtMTk2Myw3ICsyMTExLDcgQEAKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpNbWFwVHJhY2s6OnN0YXJ0KEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgZXZlbnQgX191bnVzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbiBfX3VudXNlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24gX191bnVzZWQpCiB7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtMTk5NCwxOSArMjE0MiwyOCBAQAogewogfQogCi0vKnN0YXRpYyovIHZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpNbWFwVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KQordm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6Ok1tYXBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZCgiQ2xpZW50IFNlc3Npb24gICBGb3JtYXQgQ2huIG1hc2sgIFNSYXRlXG4iKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJDbGllbnQgU2Vzc2lvbiBQb3J0IElkICBGb3JtYXQgQ2huIG1hc2sgIFNSYXRlIEZsYWdzICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaXNPdXQoKSA/ICJVc2cgQ1QiOiAiU291cmNlIik7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpNbWFwVHJhY2s6OmFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSBfX3VudXNlZCkKIHsKLSAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlNnUgJTd1ICUwOFggJTA4WCAlNnVcbiIsCisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTZ1ICU3dSAlN3UgJTA4WCAlMDhYICU2dSAweCUwM1ggIiwKICAgICAgICAgICAgIG1QaWQsCiAgICAgICAgICAgICBtU2Vzc2lvbklkLAorICAgICAgICAgICAgbVBvcnRJZCwKICAgICAgICAgICAgIG1Gb3JtYXQsCiAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICBtU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICBtU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIG1BdHRyLmZsYWdzKTsKKyAgICBpZiAoaXNPdXQoKSkgeworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlM3ggJTJ4IiwgbUF0dHIudXNhZ2UsIG1BdHRyLmNvbnRlbnRfdHlwZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTZ4IiwgbUF0dHIuc291cmNlKTsKKyAgICB9CisgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1R5cGVkTG9nZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaAppbmRleCAzOGMzYzAyLi42ZWYxOWJmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaApAQCAtOTcsOCArOTcsNDIgQEAKICNkZWZpbmUgTE9HX0FVRElPX1NUQVRFKCkgZG8geyBOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgaWYgKHggIT0gbnVsbHB0cikgXAogICAgICAgICB4LT5sb2dFdmVudEhpc3RUcyhOQkxvZzo6RVZFTlRfQVVESU9fU1RBVEUsIGhhc2goX19GSUxFX18sIF9fTElORV9fKSk7IH0gd2hpbGUoMCkKIAorLy8gTG9nIHRoZSBkaWZmZXJlbmNlIGJld3RlZW4gZnJhbWVzIHByZXNlbnRlZCBieSBIQUwgYW5kIGZyYW1lcyB3cml0dGVuIHRvIEhBTCBvdXRwdXQgc2luaywKKy8vIGRpdmlkZWQgYnkgdGhlIHNhbXBsZSByYXRlLiBQYXJhbWV0ZXIgbXMgaXMgb2YgdHlwZSBkb3VibGUuCisjZGVmaW5lIExPR19MQVRFTkNZKG1zKSBkbyB7IE5CTG9nOjpXcml0ZXIgKnggPSB0bE5CTG9nV3JpdGVyOyBpZiAoeCAhPSBudWxscHRyKSBcCisgICAgICAgIHgtPmxvZzxOQkxvZzo6RVZFTlRfTEFURU5DWT4obXMpOyB9IHdoaWxlICgwKQorCisvLyBSZWNvcmQgdGhyZWFkIG92ZXJydW4gZXZlbnQgbmFub3NlY29uZCB0aW1lc3RhbXAuIFBhcmFtZXRlciBucyBpcyBhbiBpbnQ2NF90LgorI2RlZmluZSBMT0dfT1ZFUlJVTihucykgZG8geyBOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgaWYgKHggIT0gbnVsbHB0cikgXAorICAgICAgICB4LT5sb2c8TkJMb2c6OkVWRU5UX09WRVJSVU4+KG5zKTsgfSB3aGlsZSAoMCkKKworLy8gUmVjb3JkIHRocmVhZCBpbmZvLiBUaGlzIGN1cnJlbnRseSBpbmNsdWRlcyB0eXBlLCBmcmFtZUNvdW50LCBhbmQgc2FtcGxlUmF0ZS4KKy8vIFBhcmFtZXRlciB0eXBlIGlzIHRocmVhZF9pbmZvX3QgYXMgZGVmaW5lZCBpbiBOQkxvZy5oLgorI2RlZmluZSBMT0dfVEhSRUFEX0lORk8oaW5mbykgZG8geyBOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgXAorICAgICAgICBpZiAoeCAhPSBudWxscHRyKSB4LT5sb2c8TkJMb2c6OkVWRU5UX1RIUkVBRF9JTkZPPihpbmZvKTsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBMT0dfVEhSRUFEX1BBUkFNUyhwYXJhbXMpIGRvIHtOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgXAorICAgICAgICBpZiAoeCAhPSBudWxscHRyKSB4LT5sb2c8TkJMb2c6OkVWRU5UX1RIUkVBRF9QQVJBTVM+KHBhcmFtcyk7IH0gd2hpbGUgKDApCisKKy8vIFJlY29yZCB0aHJlYWQgdW5kZXJydW4gZXZlbnQgbmFub3NlY29uZCB0aW1lc3RhbXAuIFBhcmFtZXRlciBucyBpcyBhbiBpbnQ2NF90LgorI2RlZmluZSBMT0dfVU5ERVJSVU4obnMpIGRvIHsgTkJMb2c6OldyaXRlciAqeCA9IHRsTkJMb2dXcml0ZXI7IGlmICh4ICE9IG51bGxwdHIpIFwKKyAgICAgICAgeC0+bG9nPE5CTG9nOjpFVkVOVF9VTkRFUlJVTj4obnMpOyB9IHdoaWxlICgwKQorCisvLyBSZWNvcmQgdGhyZWFkIHdhcm11cCB0aW1lIGluIG1pbGxpc2Vjb25kcy4gUGFyYW1ldGVyIG1zIGlzIG9mIHR5cGUgZG91YmxlLgorI2RlZmluZSBMT0dfV0FSTVVQX1RJTUUobXMpIGRvIHsgTkJMb2c6OldyaXRlciAqeCA9IHRsTkJMb2dXcml0ZXI7IGlmICh4ICE9IG51bGxwdHIpIFwKKyAgICAgICAgeC0+bG9nPE5CTG9nOjpFVkVOVF9XQVJNVVBfVElNRT4obXMpOyB9IHdoaWxlICgwKQorCisvLyBSZWNvcmQgYSB0eXBlZCBlbnRyeSB0aGF0IHJlcHJlc2VudHMgYSB0aHJlYWQncyB3b3JrIHRpbWUgaW4gbmFub3NlY29uZHMuCisvLyBQYXJhbWV0ZXIgbnMgc2hvdWxkIGJlIG9mIHR5cGUgdWludDMyX3QuCisjZGVmaW5lIExPR19XT1JLX1RJTUUobnMpIGRvIHsgTkJMb2c6OldyaXRlciAqeCA9IHRsTkJMb2dXcml0ZXI7IGlmICh4ICE9IG51bGxwdHIpIFwKKyAgICAgICAgeC0+bG9nPE5CTG9nOjpFVkVOVF9XT1JLX1RJTUU+KG5zKTsgfSB3aGlsZSAoMCkKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogZXh0ZXJuICJDIiB7CisvLyBUT0RPIGNvbnNpZGVyIGFkZGluZyBhIHRocmVhZF9sb2NhbCBOQkxvZzo6V3JpdGVyIHRsRHVtbXlOQkxvZ1dyaXRlciBhbmQgdGhlbgorLy8gaW5pdGlhbGl6ZSBiZWxvdyB0bE5CTG9nV3JpdGVyIHRvICZ0bER1bW15TkJMb2dXcml0ZXIgdG8gcmVtb3ZlIHRoZSBuZWVkIHRvCisvLyBjaGVjayBmb3IgbnVsbHB0ciBldmVyeSB0aW1lLiBBbHNvIHJlZHVjZXMgdGhlIG5lZWQgdG8gYWRkIGEgbmV3IGxvZ2dpbmcgbWFjcm8gYWJvdmUKKy8vIGVhY2ggdGltZSB3ZSB3YW50IHRvIGxvZyBhIG5ldyB0eXBlLgogZXh0ZXJuIHRocmVhZF9sb2NhbCBOQkxvZzo6V3JpdGVyICp0bE5CTG9nV3JpdGVyOwogfQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQubWsKaW5kZXggNGM5MGJiNS4uZWJiNGYzYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLm1rCkBAIC0xMyw3ICsxMyw2IEBACiAgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L3V0aWxpdGllcwogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICBsaWJjdXRpbHMgXApAQCAtMjIsMTEgKzIxLDE1IEBACiAgICAgbGliYmluZGVyIFwKICAgICBsaWJhdWRpb2NsaWVudCBcCiAgICAgbGliaGFyZHdhcmVfbGVnYWN5IFwKLSAgICBsaWJzZXJ2aWNldXRpbGl0eSBcCiAgICAgbGliYXVkaW9wb2xpY3ltYW5hZ2VyIFwKICAgICBsaWJtZWRpYV9oZWxwZXIgXAogICAgIGxpYm1lZGlhbWV0cmljcyBcCi0gICAgbGliZWZmZWN0c2NvbmZpZworICAgIGxpYm1lZGlhdXRpbHMgXAorICAgIGxpYmVmZmVjdHNjb25maWcgXAorICAgIGxpYnNlbnNvcnByaXZhY3kKKworTE9DQUxfRVhQT1JUX1NIQVJFRF9MSUJSQVJZX0hFQURFUlMgOj0gXAorICAgIGxpYnNlbnNvcnByaXZhY3kKIAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAgICAgbGliYXVkaW9wb2xpY3ljb21wb25lbnRzCkBAIC00OCw2ICs1MSw3IEBACiAgICAgbGliY3V0aWxzIFwKICAgICBsaWJ1dGlscyBcCiAgICAgbGlibG9nIFwKKyAgICBsaWJhdWRpb2NsaWVudCBcCiAgICAgbGlic291bmR0cmlnZ2VyCiAKIGlmZXEgKCQoVVNFX0NPTkZJR1VSQUJMRV9BVURJT19QT0xJQ1kpLCAxKQpAQCAtNzQsNyArNzgsNyBAQAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L3V0aWxpdGllcworICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKICAgICBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMKQEAgLTgyLDkgKzg2LDkgQEAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGlibWVkaWFfaGVscGVyCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYm1lZGlhbWV0cmljcwogCi1pZmVxICgkKFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYpLCAxKQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJ4bWwyCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmhpZGxiYXNlIGxpYnhtbDIKIAoraWZlcSAoJChVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GKSwgMSkKIExPQ0FMX0NGTEFHUyArPSAtRFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYKIGVuZGlmICNpZmVxICgkKFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYpLCAxKQogCkBAIC0xMTEsNyArMTE1LDggQEAKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlCisgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlIFwKKyAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKIAogTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKaW5kZXggNDgxMmIxZi4uMWMyYjlkNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCkBAIC02NSwyMCArNjUsNiBAQAogICAgICAgICBBUElfSU5QVVRfVEVMRVBIT05ZX1JYLCAvLyB1c2VkIGZvciBjYXB0dXJlIGZyb20gdGVsZXBob255IFJYIHBhdGgKICAgICB9IGlucHV0X3R5cGVfdDsKIAotICAgIGVudW0gewotICAgICAgICBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfTk9ORSA9IDAsCi0gICAgICAgIEFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQUxMID0gKDEgPDwgMCksICAgICAgLy8gQ29uY3VycmVuY3kgd2l0aCBhIGNhbGwKLSAgICAgICAgQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBUFRVUkUgPSAoMSA8PCAxKSwgICAvLyBDb25jdXJyZW5jeSB3aXRoIGFub3RoZXIgY2FwdHVyZQotICAgICAgICBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfSE9UV09SRCA9ICgxIDw8IDIpLCAgIC8vIENvbmN1cnJlbmN5IHdpdGggYSBob3R3b3JkCi0gICAgICAgIEFQSV9JTlBVVF9DT05DVVJSRU5DWV9QUkVFTVBUID0gKDEgPDwgMyksICAgLy8gcHJlLWVtcHRlZCBzb21lb25lCi0gICAgICAgICAgICAgICAgLy8gTkI6IHByZWVtcHQgaXMgbWFya2VkIG9uIGEgc3VjY2Vzc2Z1bCByZXR1cm4sIG90aGVycyBhcmUgb24gZmFpbGluZyBjYWxscwotICAgICAgICBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfTEFTVCA9ICgxIDw8IDQpLAotCi0gICAgICAgIEFQSV9JTlBVVF9DT05DVVJSRU5DWV9BTEwgPSAoQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0xBU1QgLSAxKSwKLSAgICB9OwotCi0gICAgdHlwZWRlZiB1aW50MzJfdCBjb25jdXJyZW5jeV90eXBlX19tYXNrX3Q7Ci0KIHB1YmxpYzoKICAgICB2aXJ0dWFsIH5BdWRpb1BvbGljeUludGVyZmFjZSgpIHt9CiAgICAgLy8KQEAgLTEyNCwxNyArMTEwLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpID0gMDsKICAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIG91dHB1dCBzdGFydHMgYmVpbmcgdXNlZCBieSBjb3JyZXNwb25kaW5nIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBvdXRwdXQgc3RvcHMgYmVpbmcgdXNlZCBieSBjb3JyZXNwb25kaW5nIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKICAgICAvLyByZWxlYXNlcyB0aGUgb3V0cHV0LgotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAKICAgICAvLyByZXF1ZXN0IGFuIGlucHV0IGFwcHJvcHJpYXRlIGZvciByZWNvcmQgZnJvbSB0aGUgc3VwcGxpZWQgZGV2aWNlIHdpdGggc3VwcGxpZWQgcGFyYW1ldGVycy4KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCkBAIC0xNDcsMTYgKzEyNywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3R5cGVfdCAqaW5wdXRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgPSAwOwogICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgaW5wdXQgc3RhcnRzIGJlaW5nIHVzZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzaWxlbmNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY3VycmVuY3lfdHlwZV9fbWFza190ICpjb25jdXJyZW5jeSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgaW5wdXQgc3RvcHMgYmVpbmcgdXNlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgLy8gcmVsZWFzZXMgdGhlIGlucHV0LgotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKIAogICAgIC8vCiAgICAgLy8gdm9sdW1lIGNvbnRyb2wgZnVuY3Rpb25zCkBAIC0yMDYsNiArMTgxLDggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKSA9IDA7CiAKICAgICB2aXJ0dWFsIGJvb2wgaXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBvZmZsb2FkSW5mbykgPSAwOworICAgIHZpcnR1YWwgYm9vbCBpc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcykgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKQEAgLTIzMywxMSArMjEwLDE1IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlclBvbGljeU1peGVzKGNvbnN0IFZlY3RvcjxBdWRpb01peD4mIG1peGVzKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyUG9saWN5TWl4ZXMoVmVjdG9yPEF1ZGlvTWl4PiBtaXhlcykgPSAwOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKQorICAgICAgICAgICAgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpID0gMDsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck1vbm8oYm9vbCBtb25vKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNb25vKGJvb2wgKm1vbm8pID0gMDsKQEAgLTI1MSw3ICsyMzIsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVwb3J0ZWQpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwgYm9vbCBlbmFibGVkKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQgICAgIHNldFJlY29yZFNpbGVuY2VkKHVpZF90IHVpZCwgYm9vbCBzaWxlbmNlZCk7CisgICAgdmlydHVhbCBib29sICAgICBpc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkICAgICBzZXRBcHBTdGF0ZSh1aWRfdCB1aWQsIGFwcF9zdGF0ZV90IHN0YXRlKTsKIH07CiAKIApAQCAtMzI0LDExICszMDcsNiBAQAogICAgIC8vIGZ1bmN0aW9uIGVuYWJsaW5nIHRvIHJlY2VpdmUgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb25zIGRpcmVjdGx5IGZyb20gYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIHRvIGF1ZGlvIHBvbGljeSBtYW5hZ2VyLgogICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlzKSA9IDA7CiAKLSAgICAvLyByZXF1ZXN0IHRoZSBwbGF5YmFjayBvZiBhIHRvbmUgb24gdGhlIHNwZWNpZmllZCBzdHJlYW06IHVzZWQgZm9yIGluc3RhbmNlIHRvIHJlcGxhY2Ugbm90aWZpY2F0aW9uIHNvdW5kcyB3aGVuIHBsYXlpbmcKLSAgICAvLyBvdmVyIGEgdGVsZXBob255IGRldmljZSBkdXJpbmcgYSBwaG9uZSBjYWxsLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRUb25lKGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BUb25lKCkgPSAwOwotCiAgICAgLy8gc2V0IGRvd24gbGluayBhdWRpbyB2b2x1bWUuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zID0gMCkgPSAwOwogCkBAIC0zNTgsMTAgKzMzNiwxMyBAQAogICAgIHZpcnR1YWwgdm9pZCBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShTdHJpbmc4IHJlZ0lkLCBpbnQzMl90IHN0YXRlKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSAqY2xpZW50Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnX2Jhc2UgKmRldmljZUNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgPSAwOwogfTsKIAogZXh0ZXJuICJDIiBBdWRpb1BvbGljeUludGVyZmFjZSogY3JlYXRlQXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTI1YjlhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0IEBACitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJhdWRpb3BvbGljeWNvbW1vbiIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2NlOGUzLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0KLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBSZWN1cnNpdmUgY2FsbCBzdWItZm9sZGVyIEFuZHJvaWQubWsKLSMKLWluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvUm91dGluZ1N0cmF0ZWd5LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Sb3V0aW5nU3RyYXRlZ3kuaAppbmRleCBkMzg5NjdlLi5mOGExY2Q2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Sb3V0aW5nU3RyYXRlZ3kuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Sb3V0aW5nU3RyYXRlZ3kuaApAQCAtMjMsNiArMjMsNyBAQAogI2RlZmluZSBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSA1MDAwCiAKIGVudW0gcm91dGluZ19zdHJhdGVneSB7CisgICAgU1RSQVRFR1lfTk9ORSA9IC0xLAogICAgIFNUUkFURUdZX01FRElBLAogICAgIFNUUkFURUdZX1BIT05FLAogICAgIFNUUkFURUdZX1NPTklGSUNBVElPTiwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1ZvbHVtZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmgKaW5kZXggZmMwMTJhMi4uNWNjYzhmZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmgKQEAgLTEzNCw2ICsxMzQsNyBAQAogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRToKICAgICAgICAgICAgIHJldHVybiBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBOwogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjoKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRToKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUOgogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUjoKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlk6CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9wb2xpY3kuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL3BvbGljeS5oCmluZGV4IDliZDY4ZTEuLjMwYjAwNDQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL3BvbGljeS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL3BvbGljeS5oCkBAIC0zMiwxNCArMzIsNiBAQAogI2RlZmluZSBNQVhfTUlYRVJfQ0hBTk5FTF9DT1VOVCBGQ0NfOAogCiAvKioKLSAqIEEgZGV2aWNlIG1hc2sgZm9yIGFsbCBhdWRpbyBpbnB1dCBkZXZpY2VzIHRoYXQgYXJlIGNvbnNpZGVyZWQgInZpcnR1YWwiIHdoZW4gZXZhbHVhdGluZwotICogYWN0aXZlIGlucHV0cyBpbiBnZXRBY3RpdmVJbnB1dHMoKQotICovCi0jZGVmaW5lIEFQTV9BVURJT19JTl9ERVZJQ0VfVklSVFVBTF9BTEwgKEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYfFwKLSAgICAgICAgQVVESU9fREVWSUNFX0lOX0JVU3xBVURJT19ERVZJQ0VfSU5fRk1fVFVORVIpCi0KLQotLyoqCiAgKiBBIGRldmljZSBtYXNrIGZvciBhbGwgYXVkaW8gaW5wdXQgYW5kIG91dHB1dCBkZXZpY2VzIHdoZXJlIG1hdGNoaW5nIGlucHV0cy9vdXRwdXRzIG9uIGRldmljZQogICogdHlwZSBhbG9uZSBpcyBub3QgZW5vdWdoOiB0aGUgYWRkcmVzcyBtdXN0IG1hdGNoIHRvbwogICovCkBAIC02OCwyMyArNjAsNiBAQAogfQogCiAvKioKLSAqIENoZWNrIGlmIHRoZSBpbnB1dCBkZXZpY2UgZ2l2ZW4gaXMgY29uc2lkZXJlZCBhcyBhIHZpcnR1YWwgZGV2aWNlLgotICoKLSAqIEBwYXJhbVtpbl0gZGV2aWNlIHRvIGNvbnNpZGVyCi0gKgotICogQHJldHVybiB0cnVlIGlmIHRoZSBkZXZpY2UgaXMgYSB2aXJ0dWFsIG9uZSwgZmFsc2Ugb3RoZXJ3aXNlLgotICovCi1zdGF0aWMgaW5saW5lIGJvb2wgaXNfdmlydHVhbF9pbnB1dF9kZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkKLXsKLSAgICBpZiAoKGRldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApIHsKLSAgICAgICAgZGV2aWNlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOwotICAgICAgICBpZiAoKHBvcGNvdW50KGRldmljZSkgPT0gMSkgJiYgKChkZXZpY2UgJiB+QVBNX0FVRElPX0lOX0RFVklDRV9WSVJUVUFMX0FMTCkgPT0gMCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioKICAqIENoZWNrIHdoZXRoZXIgdGhlIGRldmljZSB0eXBlIGlzIG9uZQogICogd2hlcmUgYWRkcmVzc2VzIGFyZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gb25lIGNvbm5lY3RlZCBkZXZpY2UgYW5kIGFub3RoZXIKICAqCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVlYmFiNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5icApAQCAtMCwwICsxLDUyIEBACitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cyIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJzcmMvQXVkaW9Db2xsZWN0aW9ucy5jcHAiLAorICAgICAgICAic3JjL0F1ZGlvR2Fpbi5jcHAiLAorICAgICAgICAic3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcCIsCisgICAgICAgICJzcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcCIsCisgICAgICAgICJzcmMvQXVkaW9QYXRjaC5jcHAiLAorICAgICAgICAic3JjL0F1ZGlvUG9saWN5TWl4LmNwcCIsCisgICAgICAgICJzcmMvQXVkaW9Qb3J0LmNwcCIsCisgICAgICAgICJzcmMvQXVkaW9Qcm9maWxlLmNwcCIsCisgICAgICAgICJzcmMvQXVkaW9Sb3V0ZS5jcHAiLAorICAgICAgICAic3JjL0NsaWVudERlc2NyaXB0b3IuY3BwIiwKKyAgICAgICAgInNyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcCIsCisgICAgICAgICJzcmMvRWZmZWN0RGVzY3JpcHRvci5jcHAiLAorICAgICAgICAic3JjL0h3TW9kdWxlLmNwcCIsCisgICAgICAgICJzcmMvSU9Qcm9maWxlLmNwcCIsCisgICAgICAgICJzcmMvU2VyaWFsaXplci5jcHAiLAorICAgICAgICAic3JjL1NvdW5kVHJpZ2dlclNlc3Npb24uY3BwIiwKKyAgICAgICAgInNyYy9UeXBlQ29udmVydGVyLmNwcCIsCisgICAgICAgICJzcmMvVm9sdW1lQ3VydmUuY3BwIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnhtbDIiLAorICAgIF0sCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWyJsaWJtZWRpYSJdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3BvbGljeWNvbW1vbiIsCisgICAgXSwKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbImxpYmF1ZGlvcG9saWN5Y29tbW9uIl0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjRjNWNjLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotICAgIHNyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcCBcCi0gICAgc3JjL0F1ZGlvR2Fpbi5jcHAgXAotICAgIHNyYy9Id01vZHVsZS5jcHAgXAotICAgIHNyYy9JT1Byb2ZpbGUuY3BwIFwKLSAgICBzcmMvQXVkaW9Qb3J0LmNwcCBcCi0gICAgc3JjL0F1ZGlvUHJvZmlsZS5jcHAgXAotICAgIHNyYy9BdWRpb1JvdXRlLmNwcCBcCi0gICAgc3JjL0F1ZGlvUG9saWN5TWl4LmNwcCBcCi0gICAgc3JjL0F1ZGlvUGF0Y2guY3BwIFwKLSAgICBzcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwIFwKLSAgICBzcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcCBcCi0gICAgc3JjL0F1ZGlvQ29sbGVjdGlvbnMuY3BwIFwKLSAgICBzcmMvRWZmZWN0RGVzY3JpcHRvci5jcHAgXAotICAgIHNyYy9Tb3VuZFRyaWdnZXJTZXNzaW9uLmNwcCBcCi0gICAgc3JjL1Nlc3Npb25Sb3V0ZS5jcHAgXAotICAgIHNyYy9BdWRpb1NvdXJjZURlc2NyaXB0b3IuY3BwIFwKLSAgICBzcmMvVm9sdW1lQ3VydmUuY3BwIFwKLSAgICBzcmMvVHlwZUNvbnZlcnRlci5jcHAgXAotICAgIHNyYy9BdWRpb1Nlc3Npb24uY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGlibWVkaWEgXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJsb2cgXAotCi1MT0NBTF9FWFBPUlRfU0hBUkVEX0xJQlJBUllfSEVBREVSUyA6PSBsaWJtZWRpYQotCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKExPQ0FMX1BBVEgpL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvdXRpbGl0aWVzIFwKLSAgICBzeXN0ZW0vbWVkaWEvYXVkaW9fdXRpbHMvaW5jbHVkZSBcCi0KLWlmZXEgKCQoVVNFX1hNTF9BVURJT19QT0xJQ1lfQ09ORiksIDEpCi0KLUxPQ0FMX1NSQ19GSUxFUyArPSBzcmMvU2VyaWFsaXplci5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJ4bWwyCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgIGV4dGVybmFsL2xpYnhtbDIvaW5jbHVkZSBcCi0KLWVsc2UKLQotTE9DQUxfU1JDX0ZJTEVTICs9IFwKLSAgICBzcmMvQ29uZmlnUGFyc2luZ1V0aWxzLmNwcCBcCi0gICAgc3JjL1N0cmVhbURlc2NyaXB0b3IuY3BwIFwKLSAgICBzcmMvR2FpbnMuY3BwCi0KLWVuZGlmICNpZmVxICgkKFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYpLCAxKQotCi1MT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gXAotICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZQotCi1MT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQotCi1MT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgotCi1MT0NBTF9NT0RVTEUgOj0gbGliYXVkaW9wb2xpY3ljb21wb25lbnRzCi0KLWluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0NvbGxlY3Rpb25zLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Db2xsZWN0aW9ucy5oCmluZGV4IGY4NmU3NWEuLmE5NDhlYTkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0NvbGxlY3Rpb25zLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvQ29sbGVjdGlvbnMuaApAQCAtMzgsNyArMzgsNyBAQAogY2xhc3MgQXVkaW9Sb3V0ZVZlY3RvciA6IHB1YmxpYyBWZWN0b3I8c3A8QXVkaW9Sb3V0ZT4gPgogewogcHVibGljOgotICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0dhaW4uaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0dhaW4uaAppbmRleCA0YWM1MDhmLi45OTYzNDdiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9HYWluLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvR2Fpbi5oCkBAIC0xOCw2ICsxOCw3IEBACiAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC01Myw3ICs1NCw3IEBACiAgICAgaW50IGdldE1heFJhbXBJbk1zKCkgY29uc3QgeyByZXR1cm4gbUdhaW4ubWF4X3JhbXBfbXM7IH0KIAogICAgIC8vIFRPRE86IHJlbW92ZSBkdW1wIGZyb20gaGVyZSAoc3BsaXQgc2VyaWFsaXphdGlvbikKLSAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CiAKICAgICB2b2lkIGdldERlZmF1bHRDb25maWcoc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnICpjb25maWcpOwogICAgIHN0YXR1c190IGNoZWNrQ29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqY29uZmlnKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU1NDEyZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZS5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIEludGVyZmFjZSBmb3IgSS9PIGRlc2NyaXB0b3JzIHRvIGltcGxlbWVudCBzbyBpbmZvcm1hdGlvbiBhYm91dCB0aGVpciBjb250ZXh0CisgKiBjYW4gYmUgcXVlcmllZCBhbmQgdXBkYXRlZC4KKyAqLworY2xhc3MgQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5BdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZSgpIHt9OworCisgICAgdmlydHVhbCBhdWRpb19jb25maWdfYmFzZV90IGdldENvbmZpZygpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgZ2V0UGF0Y2hIYW5kbGUoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UGF0Y2hIYW5kbGUoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSA9IDA7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JbnB1dERlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lucHV0RGVzY3JpcHRvci5oCmluZGV4IGIyNWQ2ZDQuLmZhOWJhMGIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lucHV0RGVzY3JpcHRvci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lucHV0RGVzY3JpcHRvci5oCkBAIC0xNiwzNiArMTYsMzggQEAKIAogI3ByYWdtYSBvbmNlCiAKLSNpbmNsdWRlICJBdWRpb1BvcnQuaCIKLSNpbmNsdWRlICJBdWRpb1Nlc3Npb24uaCIKLSNpbmNsdWRlICJBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIuaCIKLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgIkF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiQXVkaW9Qb3J0LmgiCisjaW5jbHVkZSAiQ2xpZW50RGVzY3JpcHRvci5oIgorI2luY2x1ZGUgIkVmZmVjdERlc2NyaXB0b3IuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBJT1Byb2ZpbGU7CiBjbGFzcyBBdWRpb01peDsKK2NsYXNzIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlOwogCiAvLyBkZXNjcmlwdG9yIGZvciBhdWRpbyBpbnB1dHMuIFVzZWQgdG8gbWFpbnRhaW4gY3VycmVudCBjb25maWd1cmF0aW9uIG9mIGVhY2ggb3BlbmVkIGF1ZGlvIGlucHV0CiAvLyBhbmQga2VlcCB0cmFjayBvZiB0aGUgdXNhZ2Ugb2YgdGhpcyBpbnB1dC4KLWNsYXNzIEF1ZGlvSW5wdXREZXNjcmlwdG9yOiBwdWJsaWMgQXVkaW9Qb3J0Q29uZmlnLCBwdWJsaWMgQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyCitjbGFzcyBBdWRpb0lucHV0RGVzY3JpcHRvcjogcHVibGljIEF1ZGlvUG9ydENvbmZpZywgcHVibGljIEF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlCisgICAgLCBwdWJsaWMgQ2xpZW50TWFwSGFuZGxlcjxSZWNvcmRDbGllbnREZXNjcmlwdG9yPgogewogcHVibGljOgogICAgIGV4cGxpY2l0IEF1ZGlvSW5wdXREZXNjcmlwdG9yKGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7CiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRJZCgpIGNvbnN0OwogICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBnZXRNb2R1bGVIYW5kbGUoKSBjb25zdDsKLSAgICB1aW50MzJfdCBnZXRPcGVuUmVmQ291bnQoKSBjb25zdDsKIAotICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdCBvdmVycmlkZTsKIAotICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgICAgICAgIG1Jb0hhbmRsZTsgICAgICAgLy8gaW5wdXQgaGFuZGxlCi0gICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgICAgICAgbURldmljZTsgICAgICAgICAvLyBjdXJyZW50IGRldmljZSB0aGlzIGlucHV0IGlzIHJvdXRlZCB0bwotICAgIEF1ZGlvTWl4ICAgICAgICAgICAgICAgICAgICAgICptUG9saWN5TWl4OyAgICAgLy8gbm9uIE5VTEwgd2hlbiB1c2VkIGJ5IGEgZHluYW1pYyBwb2xpY3kKLSAgICBjb25zdCBzcDxJT1Byb2ZpbGU+ICAgICAgICAgICBtUHJvZmlsZTsgICAgICAgIC8vIEkvTyBwcm9maWxlIHRoaXMgb3V0cHV0IGRlcml2ZXMgZnJvbQorICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgbUlvSGFuZGxlID0gQVVESU9fSU9fSEFORExFX05PTkU7IC8vIGlucHV0IGhhbmRsZQorICAgIGF1ZGlvX2RldmljZXNfdCAgICAgbURldmljZSA9IEFVRElPX0RFVklDRV9OT05FOyAgLy8gY3VycmVudCBkZXZpY2UgdGhpcyBpbnB1dCBpcyByb3V0ZWQgdG8KKyAgICBBdWRpb01peCAgICAgICAgICAgICptUG9saWN5TWl4ID0gbnVsbHB0cjsgICAgICAgIC8vIG5vbiBOVUxMIHdoZW4gdXNlZCBieSBhIGR5bmFtaWMgcG9saWN5CisgICAgY29uc3Qgc3A8SU9Qcm9maWxlPiBtUHJvZmlsZTsgICAgICAgICAgICAgICAgICAgICAvLyBJL08gcHJvZmlsZSB0aGlzIG91dHB1dCBkZXJpdmVzIGZyb20KIAogICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3Q7CkBAIC01NSwyMyArNTcsMTggQEAKICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90PiBnZXRQcmVlbXB0ZWRTZXNzaW9ucygpIGNvbnN0OwogICAgIGJvb2wgaGFzUHJlZW1wdGVkU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgY29uc3Q7CiAgICAgdm9pZCBjbGVhclByZWVtcHRlZFNlc3Npb25zKCk7Ci0gICAgYm9vbCBpc0FjdGl2ZSgpIGNvbnN0OworICAgIGJvb2wgaXNBY3RpdmUoKSBjb25zdCB7IHJldHVybiBtR2xvYmFsQWN0aXZlQ291bnQgPiAwOyB9CiAgICAgYm9vbCBpc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0OwotICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKGJvb2wgYWN0aXZlT25seSA9IGZhbHNlKSBjb25zdDsKKyAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UoKSBjb25zdDsKICAgICBib29sIGlzU291bmRUcmlnZ2VyKCkgY29uc3Q7Ci0gICAgc3RhdHVzX3QgYWRkQXVkaW9TZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1Nlc3Npb24+JiBhdWRpb1Nlc3Npb24pOwotICAgIHN0YXR1c190IHJlbW92ZUF1ZGlvU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgc3A8QXVkaW9TZXNzaW9uPiBnZXRBdWRpb1Nlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pIGNvbnN0OwotICAgIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gZ2V0QXVkaW9TZXNzaW9ucyhib29sIGFjdGl2ZU9ubHkpIGNvbnN0OwotICAgIHNpemVfdCBnZXRBdWRpb1Nlc3Npb25Db3VudChib29sIGFjdGl2ZU9ubHkpIGNvbnN0OwotICAgIGF1ZGlvX3NvdXJjZV90IGdldEhpZ2hlc3RQcmlvcml0eVNvdXJjZShib29sIGFjdGl2ZU9ubHkpIGNvbnN0OwotCi0gICAgLy8gaW1wbGVtZW50YXRpb24gb2YgQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyCi0gICAgdmlydHVhbCBhdWRpb19jb25maWdfYmFzZV90IGdldENvbmZpZygpIGNvbnN0OwotICAgIHZpcnR1YWwgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgZ2V0UGF0Y2hIYW5kbGUoKSBjb25zdDsKLQotICAgIHZvaWQgc2V0UGF0Y2hIYW5kbGUoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICB2b2lkIHNldENsaWVudEFjdGl2ZShjb25zdCBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50LCBib29sIGFjdGl2ZSk7CisgICAgaW50MzJfdCBhY3RpdmVDb3VudCgpIHsgcmV0dXJuIG1HbG9iYWxBY3RpdmVDb3VudDsgfQorICAgIHZvaWQgdHJhY2tFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+ICZlZmZlY3QsIGJvb2wgZW5hYmxlZCk7CisgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gZ2V0RW5hYmxlZEVmZmVjdHMoKSBjb25zdDsKKyAgICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBBdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZQorICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgZ2V0Q29uZmlnKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgZ2V0UGF0Y2hIYW5kbGUoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIHNldFBhdGNoSGFuZGxlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgb3ZlcnJpZGU7CiAKICAgICBzdGF0dXNfdCBvcGVuKGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLApAQCAtODAsMTggKzc3LDI4IEBACiAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0KTsKICAgICAvLyBDYWxsZWQgd2hlbiBhIHN0cmVhbSBpcyBhYm91dCB0byBiZSBzdGFydGVkLgotICAgIC8vIE5vdGU6IGNhbGxlZCBhZnRlciBBdWRpb1Nlc3Npb246OmNoYW5nZUFjdGl2ZUNvdW50KDEpCisgICAgLy8gTm90ZTogY2FsbGVkIGFmdGVyIHNldENsaWVudEFjdGl2ZShjbGllbnQsIHRydWUpCiAgICAgc3RhdHVzX3Qgc3RhcnQoKTsKICAgICAvLyBDYWxsZWQgYWZ0ZXIgYSBzdHJlYW0gaXMgc3RvcHBlZAotICAgIC8vIE5vdGU6IGNhbGxlZCBhZnRlciBBdWRpb1Nlc3Npb246OmNoYW5nZUFjdGl2ZUNvdW50KC0xKQorICAgIC8vIE5vdGU6IGNhbGxlZCBhZnRlciBzZXRDbGllbnRBY3RpdmUoY2xpZW50LCBmYWxzZSkKICAgICB2b2lkIHN0b3AoKTsKICAgICB2b2lkIGNsb3NlKCk7CiAKLXByaXZhdGU6Ci0gICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgICAgICAgICAgbVBhdGNoSGFuZGxlOwotICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgICAgICAgIG1JZDsKLSAgICAvLyBhdWRpbyBzZXNzaW9ucyBhdHRhY2hlZCB0byB0aGlzIGlucHV0Ci0gICAgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiAgICAgICAgbVNlc3Npb25zOworICAgIFJlY29yZENsaWVudFZlY3RvciBnZXRDbGllbnRzRm9yU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGNsaWVudHNMaXN0KGJvb2wgYWN0aXZlT25seSA9IGZhbHNlLAorICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSBBVURJT19TT1VSQ0VfREVGQVVMVCwgYm9vbCBwcmVmZXJyZWREZXZpY2VPbmx5ID0gZmFsc2UpIGNvbnN0OworCisgICAgdm9pZCBzZXRBcHBTdGF0ZSh1aWRfdCB1aWQsIGFwcF9zdGF0ZV90IHN0YXRlKTsKKworICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIENsaWVudE1hcEhhbmRsZXI8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4KKyAgICB2b2lkIGFkZENsaWVudChjb25zdCBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiAmY2xpZW50KSBvdmVycmlkZTsKKworIHByaXZhdGU6CisKKyAgICB2b2lkIHVwZGF0ZUNsaWVudFJlY29yZGluZ0NvbmZpZ3VyYXRpb24oaW50IGV2ZW50LCBjb25zdCBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50KTsKKworICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1QYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgIG1JZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiAgICAgLy8gQmVjYXVzZSBhIHByZWVtcHRpYmxlIGNhcHR1cmUgc2Vzc2lvbiBjYW4gcHJlZW1wdCBhbm90aGVyIG9uZSwgd2UgZW5kIHVwIGluIGFuIGVuZGxlc3MgbG9vcAogICAgIC8vIHNpdHVhdGlvbiB3ZXJlIGVhY2ggc2Vzc2lvbiBpcyBhbGxvd2VkIHRvIHJlc3RhcnQgYWZ0ZXIgYmVpbmcgcHJlZW1wdGVkLAogICAgIC8vIHRodXMgcHJlZW1wdGluZyB0aGUgb3RoZXIgb25lIHdoaWNoIHJlc3RhcnRzIGFuZCBzbyBvbi4KQEAgLTk5LDcgKzEwNiw5IEBACiAgICAgLy8gYSBwYXJ0aWN1bGFyIGlucHV0IHN0YXJ0ZWQgYW5kIHByZXZlbnQgcHJlZW1wdGlvbiBvZiB0aGlzIGFjdGl2ZSBpbnB1dCBieSB0aGlzIHNlc3Npb24uCiAgICAgLy8gV2UgYWxzbyBpbmhlcml0IHNlc3Npb25zIGZyb20gdGhlIHByZWVtcHRlZCBpbnB1dCB0byBhdm9pZCBhIDMgd2F5IHByZWVtcHRpb24gbG9vcCBldGMuLi4KICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90PiBtUHJlZW1wdGVkU2Vzc2lvbnM7Ci0gICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKm1DbGllbnRJbnRlcmZhY2U7CisgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKiBjb25zdCBtQ2xpZW50SW50ZXJmYWNlOworICAgIGludDMyX3QgbUdsb2JhbEFjdGl2ZUNvdW50ID0gMDsgIC8vIG5vbi1jbGllbnQtc3BlY2lmaWMgYWN0aXZpdHkgcmVmIGNvdW50CisgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gbUVuYWJsZWRFZmZlY3RzOwogfTsKIAogY2xhc3MgQXVkaW9JbnB1dENvbGxlY3Rpb24gOgpAQCAtMTE5LDExICsxMjgsMTUgQEAKICAgICAgKiBPbmx5IGNvbnNpZGVycyBpbnB1dHMgZnJvbSBwaHlzaWNhbCBkZXZpY2VzIChlLmcuIG1haW4gbWljLCBoZWFkc2V0IG1pYykgd2hlbgogICAgICAqIGlnbm9yZVZpcnR1YWxJbnB1dHMgaXMgdHJ1ZS4KICAgICAgKi8KLSAgICBWZWN0b3I8c3AgPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiA+IGdldEFjdGl2ZUlucHV0cyhib29sIGlnbm9yZVZpcnR1YWxJbnB1dHMgPSB0cnVlKTsKKyAgICBWZWN0b3I8c3AgPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiA+IGdldEFjdGl2ZUlucHV0cygpOwogCiAgICAgYXVkaW9fZGV2aWNlc190IGdldFN1cHBvcnRlZERldmljZXMoYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlKSBjb25zdDsKIAotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gZ2V0SW5wdXRGb3JDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworCisgICAgdm9pZCB0cmFja0VmZmVjdEVuYWJsZWQoY29uc3Qgc3A8RWZmZWN0RGVzY3JpcHRvcj4gJmVmZmVjdCwgYm9vbCBlbmFibGVkKTsKKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0OwogfTsKIAogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmgKaW5kZXggNWU1ZDM4Yi4uZWQ5OTVlMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb091dHB1dERlc2NyaXB0b3IuaApAQCAtMTgsMTMgKzE4LDE0IEBACiAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAotI2luY2x1ZGUgIkF1ZGlvUG9ydC5oIgotI2luY2x1ZGUgPFJvdXRpbmdTdHJhdGVneS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSAiQXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmgiCisjaW5jbHVkZSA8Um91dGluZ1N0cmF0ZWd5Lmg+CisjaW5jbHVkZSAiQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJBdWRpb1BvcnQuaCIKKyNpbmNsdWRlICJDbGllbnREZXNjcmlwdG9yLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzUsMTQgKzM2LDE1IEBACiAKIC8vIGRlc2NyaXB0b3IgZm9yIGF1ZGlvIG91dHB1dHMuIFVzZWQgdG8gbWFpbnRhaW4gY3VycmVudCBjb25maWd1cmF0aW9uIG9mIGVhY2ggb3BlbmVkIGF1ZGlvIG91dHB1dAogLy8gYW5kIGtlZXAgdHJhY2sgb2YgdGhlIHVzYWdlIG9mIHRoaXMgb3V0cHV0IGJ5IGVhY2ggYXVkaW8gc3RyZWFtIHR5cGUuCi1jbGFzcyBBdWRpb091dHB1dERlc2NyaXB0b3I6IHB1YmxpYyBBdWRpb1BvcnRDb25maWcKK2NsYXNzIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjogcHVibGljIEF1ZGlvUG9ydENvbmZpZywgcHVibGljIEF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlCisgICAgLCBwdWJsaWMgQ2xpZW50TWFwSGFuZGxlcjxUcmFja0NsaWVudERlc2NyaXB0b3I+CiB7CiBwdWJsaWM6CiAgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yKGNvbnN0IHNwPEF1ZGlvUG9ydD4mIHBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOwogICAgIHZpcnR1YWwgfkF1ZGlvT3V0cHV0RGVzY3JpcHRvcigpIHt9CiAKLSAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCk7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgdm9pZCAgICAgICAgbG9nKGNvbnN0IGNoYXIqIGluZGVudCk7CiAKICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldElkKCkgY29uc3Q7CkBAIC01OSw3ICs2MSwyMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKTsKLSAgICB2aXJ0dWFsIHZvaWQgY2hhbmdlUmVmQ291bnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBkZWx0YSk7CisKKyAgICAvKioKKyAgICAgKiBDaGFuZ2VzIHRoZSBzdHJlYW0gYWN0aXZlIGNvdW50IGFuZCBtQWN0aXZlQ2xpZW50cyBvbmx5LgorICAgICAqIFRoaXMgZG9lcyBub3QgY2hhbmdlIHRoZSBjbGllbnQtPmFjdGl2ZSgpIHN0YXRlIG9yIHRoZSBvdXRwdXQgZGVzY3JpcHRvcidzCisgICAgICogZ2xvYmFsIGFjdGl2ZSBjb3VudC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgY2hhbmdlU3RyZWFtQWN0aXZlQ291bnQoY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50LCBpbnQgZGVsdGEpOworICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtQWN0aXZlQ291bnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gbUFjdGl2ZUNvdW50W3N0cmVhbV07IH0KKworICAgIC8qKgorICAgICAqIENoYW5nZXMgdGhlIGNsaWVudC0+YWN0aXZlKCkgc3RhdGUgYW5kIHRoZSBvdXRwdXQgZGVzY3JpcHRvcidzIGdsb2JhbCBhY3RpdmUgY291bnQsCisgICAgICogYWxvbmcgd2l0aCB0aGUgc3RyZWFtIGFjdGl2ZSBjb3VudCBhbmQgbUFjdGl2ZUNsaWVudHMuCisgICAgICogVGhlIGNsaWVudCBtdXN0IGJlIHByZXZpb3VzbHkgYWRkZWQgYnkgdGhlIGJhc2UgY2xhc3MgYWRkQ2xpZW50KCkuCisgICAgICovCisgICAgICAgICAgICB2b2lkIHNldENsaWVudEFjdGl2ZShjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsIGJvb2wgYWN0aXZlKTsKIAogICAgIGJvb2wgaXNBY3RpdmUodWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKICAgICBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLApAQCAtNzMsMjIgKzkwLDU2IEBACiAKICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgZ2V0TW9kdWxlSGFuZGxlKCkgY29uc3Q7CiAKLSAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBnZXRQYXRjaEhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1QYXRjaEhhbmRsZTsgfTsKLSAgICB2b2lkIHNldFBhdGNoSGFuZGxlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgeyBtUGF0Y2hIYW5kbGUgPSBoYW5kbGU7IH07CisgICAgLy8gaW1wbGVtZW50YXRpb24gb2YgQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UKKyAgICBhdWRpb19jb25maWdfYmFzZV90IGdldENvbmZpZygpIGNvbnN0IG92ZXJyaWRlOworICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGdldFBhdGNoSGFuZGxlKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRQYXRjaEhhbmRsZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpIG92ZXJyaWRlOwogCi0gICAgc3A8QXVkaW9Qb3J0PiAgICAgICBtUG9ydDsKLSAgICBhdWRpb19kZXZpY2VzX3QgbURldmljZTsgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBkZXZpY2UgdGhpcyBvdXRwdXQgaXMgcm91dGVkIHRvCi0gICAgdWludDMyX3QgbVJlZkNvdW50W0FVRElPX1NUUkVBTV9DTlRdOyAvLyBudW1iZXIgb2Ygc3RyZWFtcyBvZiBlYWNoIHR5cGUgdXNpbmcgdGhpcyBvdXRwdXQKKyAgICBUcmFja0NsaWVudFZlY3RvciBjbGllbnRzTGlzdChib29sIGFjdGl2ZU9ubHkgPSBmYWxzZSwKKyAgICAgICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IFNUUkFURUdZX05PTkUsIGJvb2wgcHJlZmVycmVkRGV2aWNlT25seSA9IGZhbHNlKSBjb25zdDsKKworICAgIC8vIG92ZXJyaWRlIENsaWVudE1hcEhhbmRsZXIgdG8gYWJvcnQgd2hlbiByZW1vdmluZyBhIGNsaWVudCB3aGVuIGFjdGl2ZS4KKyAgICB2b2lkIHJlbW92ZUNsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgb3ZlcnJpZGUgeworICAgICAgICBhdXRvIGNsaWVudCA9IGdldENsaWVudChwb3J0SWQpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGNsaWVudC5nZXQoKSA9PSBudWxscHRyLAorICAgICAgICAgICAgICAgICIlcyglZCk6IG5vbmV4aXN0ZW50IGNsaWVudCBwb3J0SWQgJWQiLCBfX2Z1bmNfXywgbUlkLCBwb3J0SWQpOworICAgICAgICAvLyBpdCBpcyBwb3NzaWJsZSB0aGF0IHdoZW4gYSBjbGllbnQgaXMgcmVtb3ZlZCwgd2UgY291bGQgcmVtb3ZlIGl0cworICAgICAgICAvLyBhc3NvY2lhdGVkIGFjdGl2ZSBjb3VudCBieSBjYWxsaW5nIGNoYW5nZVN0cmVhbUFjdGl2ZUNvdW50KCksCisgICAgICAgIC8vIGJ1dCB0aGF0IHdvdWxkIGJlIGhpZGluZyBhIHByb2JsZW0sIHNvIHdlIGxvZyBmYXRhbCBpbnN0ZWFkLgorICAgICAgICBhdXRvIGl0MiA9IG1BY3RpdmVDbGllbnRzLmZpbmQoY2xpZW50KTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihpdDIgIT0gbUFjdGl2ZUNsaWVudHMuZW5kKCksCisgICAgICAgICAgICAgICAgIiVzKCVkKSByZW1vdmluZyBjbGllbnQgcG9ydElkICVkIHdoaWNoIGlzIGFjdGl2ZSAoY291bnQgJXp1KSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgcG9ydElkLCBpdDItPnNlY29uZCk7CisgICAgICAgIENsaWVudE1hcEhhbmRsZXI8VHJhY2tDbGllbnREZXNjcmlwdG9yPjo6cmVtb3ZlQ2xpZW50KHBvcnRJZCk7CisgICAgfQorCisgICAgdXNpbmcgQWN0aXZlQ2xpZW50TWFwID0gc3RkOjptYXA8c3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiwgc2l6ZV90IC8qIGNvdW50ICovPjsKKyAgICAvLyByZXF1aXJlZCBmb3IgZHVwbGljYXRpbmcgdGhyZWFkCisgICAgY29uc3QgQWN0aXZlQ2xpZW50TWFwJiBnZXRBY3RpdmVDbGllbnRzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUFjdGl2ZUNsaWVudHM7CisgICAgfQorCisgICAgYXVkaW9fZGV2aWNlc190IG1EZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsgLy8gY3VycmVudCBkZXZpY2UgdGhpcyBvdXRwdXQgaXMgcm91dGVkIHRvCiAgICAgbnNlY3NfdCBtU3RvcFRpbWVbQVVESU9fU1RSRUFNX0NOVF07Ci0gICAgZmxvYXQgbUN1clZvbHVtZVtBVURJT19TVFJFQU1fQ05UXTsgICAvLyBjdXJyZW50IHN0cmVhbSB2b2x1bWUgaW4gZEIKLSAgICBpbnQgbU11dGVDb3VudFtBVURJT19TVFJFQU1fQ05UXTsgICAgIC8vIG11dGUgcmVxdWVzdCBjb3VudGVyCisgICAgaW50IG1NdXRlQ291bnRbQVVESU9fU1RSRUFNX0NOVF07ICAgICAgICAgICAgLy8gbXV0ZSByZXF1ZXN0IGNvdW50ZXIKICAgICBib29sIG1TdHJhdGVneU11dGVkQnlEZXZpY2VbTlVNX1NUUkFURUdJRVNdOyAvLyBzdHJhdGVnaWVzIG11dGVkIGJlY2F1c2Ugb2YgaW5jb21wYXRpYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGV2aWNlIHNlbGVjdGlvbi4gU2VlIGNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMoKQotICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICptQ2xpZW50SW50ZXJmYWNlOworICAgIEF1ZGlvTWl4ICptUG9saWN5TWl4ID0gbnVsbHB0cjsgICAgICAgICAgICAgIC8vIG5vbiBOVUxMIHdoZW4gdXNlZCBieSBhIGR5bmFtaWMgcG9saWN5CiAKIHByb3RlY3RlZDoKLSAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtUGF0Y2hIYW5kbGU7Ci0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtSWQ7CisgICAgY29uc3Qgc3A8QXVkaW9Qb3J0PiBtUG9ydDsKKyAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqIGNvbnN0IG1DbGllbnRJbnRlcmZhY2U7CisgICAgZmxvYXQgbUN1clZvbHVtZVtBVURJT19TVFJFQU1fQ05UXTsgICAvLyBjdXJyZW50IHN0cmVhbSB2b2x1bWUgaW4gZEIKKyAgICB1aW50MzJfdCBtQWN0aXZlQ291bnRbQVVESU9fU1RSRUFNX0NOVF07IC8vIG51bWJlciBvZiBzdHJlYW1zIG9mIGVhY2ggdHlwZSBhY3RpdmUgb24gdGhpcyBvdXRwdXQKKyAgICB1aW50MzJfdCBtR2xvYmFsQWN0aXZlQ291bnQgPSAwOyAgLy8gbm9uLWNsaWVudC1zcGVjaWZpYyBhY3RpdmUgY291bnQKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1JZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisKKyAgICAvLyBUaGUgQWN0aXZlQ2xpZW50TWFwIHNob3dzIHRoZSBjbGllbnRzIHRoYXQgY29udHJpYnV0ZSB0byB0aGUgc3RyZWFtcyBjb3VudHMKKyAgICAvLyBhbmQgbWF5IGluY2x1ZGUgdXBzdHJlYW0gY2xpZW50cyBmcm9tIGEgZHVwbGljYXRpbmcgdGhyZWFkLgorICAgIC8vIENvbXBhcmUgd2l0aCB0aGUgQ2xpZW50TWFwIChtQ2xpZW50cykgd2hpY2ggYXJlIGV4dGVybmFsIEF1ZGlvVHJhY2sgY2xpZW50cyBvZiB0aGUKKyAgICAvLyBvdXRwdXQgZGVzY3JpcHRvciAoYW5kIGRvIG5vdCBjb3VudCBpbnRlcm5hbCBQYXRjaFRyYWNrcykuCisgICAgQWN0aXZlQ2xpZW50TWFwIG1BY3RpdmVDbGllbnRzOwogfTsKIAogLy8gQXVkaW8gb3V0cHV0IGRyaXZlbiBieSBhIHNvZnR3YXJlIG1peGVyIGluIGF1ZGlvIGZsaW5nZXIuCkBAIC05OSw4ICsxNTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOwogICAgIHZpcnR1YWwgflN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKCkge30KIAotICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKLQorICAgICAgICAgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKCkgY29uc3Q7CiAgICAgdmlydHVhbCBib29sIHNoYXJlc0h3TW9kdWxlV2l0aChjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjKTsKICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBzdXBwb3J0ZWREZXZpY2VzKCk7CkBAIC0xMDksNyArMTU5LDggQEAKICAgICB2aXJ0dWFsIGJvb2wgaXNGaXhlZFZvbHVtZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKICAgICB2aXJ0dWFsIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gc3ViT3V0cHV0MSgpIHsgcmV0dXJuIG1PdXRwdXQxOyB9CiAgICAgdmlydHVhbCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IHN1Yk91dHB1dDIoKSB7IHJldHVybiBtT3V0cHV0MjsgfQotICAgIHZpcnR1YWwgdm9pZCBjaGFuZ2VSZWZDb3VudChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGRlbHRhKTsKKyAgICAgICAgICAgIHZvaWQgY2hhbmdlU3RyZWFtQWN0aXZlQ291bnQoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCwgaW50IGRlbHRhKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIGJvb2wgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKQEAgLTEyNywxMCArMTc4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0KTsKICAgICAgICAgICAgIC8vIENhbGxlZCB3aGVuIGEgc3RyZWFtIGlzIGFib3V0IHRvIGJlIHN0YXJ0ZWQKLSAgICAgICAgICAgIC8vIE5vdGU6IGNhbGxlZCBiZWZvcmUgY2hhbmdlUmVmQ291bnQoMSk7CisgICAgICAgICAgICAvLyBOb3RlOiBjYWxsZWQgYmVmb3JlIHNldENsaWVudEFjdGl2ZSh0cnVlKTsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXJ0KCk7CiAgICAgICAgICAgICAvLyBDYWxsZWQgYWZ0ZXIgYSBzdHJlYW0gaXMgc3RvcHBlZC4KLSAgICAgICAgICAgIC8vIE5vdGU6IGNhbGxlZCBhZnRlciBjaGFuZ2VSZWZDb3VudCgtMSk7CisgICAgICAgICAgICAvLyBOb3RlOiBjYWxsZWQgYWZ0ZXIgc2V0Q2xpZW50QWN0aXZlKGZhbHNlKTsKICAgICAgICAgICAgIHZvaWQgc3RvcCgpOwogICAgICAgICAgICAgdm9pZCBjbG9zZSgpOwogICAgICAgICAgICAgc3RhdHVzX3Qgb3BlbkR1cGxpY2F0aW5nKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0MSwKQEAgLTE0MSwyMyArMTkyLDIxIEBACiAgICAgYXVkaW9faW9faGFuZGxlX3QgbUlvSGFuZGxlOyAgICAgICAgICAgLy8gb3V0cHV0IGhhbmRsZQogICAgIHVpbnQzMl90IG1MYXRlbmN5OyAgICAgICAgICAgICAgICAgIC8vCiAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgbUZsYWdzOyAgIC8vCi0gICAgQXVkaW9NaXggKm1Qb2xpY3lNaXg7ICAgICAgICAgICAgIC8vIG5vbiBOVUxMIHdoZW4gdXNlZCBieSBhIGR5bmFtaWMgcG9saWN5CiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG1PdXRwdXQxOyAgICAvLyB1c2VkIGJ5IGR1cGxpY2F0ZWQgb3V0cHV0czogZmlyc3Qgb3V0cHV0CiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG1PdXRwdXQyOyAgICAvLyB1c2VkIGJ5IGR1cGxpY2F0ZWQgb3V0cHV0czogc2Vjb25kIG91dHB1dAogICAgIHVpbnQzMl90IG1EaXJlY3RPcGVuQ291bnQ7IC8vIG51bWJlciBvZiBjbGllbnRzIHVzaW5nIHRoaXMgb3V0cHV0IChkaXJlY3Qgb3V0cHV0cyBvbmx5KQogICAgIGF1ZGlvX3Nlc3Npb25fdCBtRGlyZWN0Q2xpZW50U2Vzc2lvbjsgLy8gc2Vzc2lvbiBpZCBvZiB0aGUgZGlyZWN0IG91dHB1dCBjbGllbnQKLSAgICB1aW50MzJfdCBtR2xvYmFsUmVmQ291bnQ7ICAvLyBub24tc3RyZWFtLXNwZWNpZmljIHJlZiBjb3VudAogfTsKIAogLy8gQXVkaW8gb3V0cHV0IGRyaXZlbiBieSBhbiBpbnB1dCBkZXZpY2UgZGlyZWN0bHkuCiBjbGFzcyBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjogcHVibGljIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcgogewogcHVibGljOgotICAgIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yKGNvbnN0IHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4mIHNvdXJjZSwKKyAgICBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiYgc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOwogICAgIHZpcnR1YWwgfkh3QXVkaW9PdXRwdXREZXNjcmlwdG9yKCkge30KIAotICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKKyAgICAgICAgICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0IG92ZXJyaWRlOwogCiAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3Qgc3VwcG9ydGVkRGV2aWNlcygpOwogICAgIHZpcnR1YWwgYm9vbCBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lLApAQCAtMTcwLDcgKzIxOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZyA9IE5VTEwpIGNvbnN0OwogICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3Q7CiAKLSAgICBjb25zdCBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IG1Tb3VyY2U7CisgICAgY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gbVNvdXJjZTsKIAogfTsKIApAQCAtMjI0LDcgKzI3Myw5IEBACiAKICAgICBhdWRpb19kZXZpY2VzX3QgZ2V0U3VwcG9ydGVkRGV2aWNlcyhhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUpIGNvbnN0OwogCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0OworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBnZXRPdXRwdXRGb3JDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Q7CiB9OwogCiBjbGFzcyBId0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiA6CkBAIC0yMzgsNyArMjg5LDcgQEAKICAgICAgKi8KICAgICBib29sIGlzQW55T3V0cHV0QWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVG9JZ25vcmUpIGNvbnN0OwogCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0OwogfTsKIAogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9QYXRjaC5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUGF0Y2guaAppbmRleCBjMWMzZjNjLi4wODQzZmVhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9QYXRjaC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BhdGNoLmgKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzAsNyArMzEsNyBAQAogcHVibGljOgogICAgIEF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwgdWlkX3QgdWlkKTsKIAotICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CiAKICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtSGFuZGxlOwogICAgIHN0cnVjdCBhdWRpb19wYXRjaCBtUGF0Y2g7CkBAIC00Nyw3ICs0OCw3IEBACiAKICAgICBzdGF0dXNfdCBsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcykgY29uc3Q7CiAKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Q7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lDb25maWcuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeUNvbmZpZy5oCmluZGV4IDQzZjZlZDYuLjUwOTllYmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeUNvbmZpZy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeUNvbmZpZy5oCkBAIC0xNiw2ICsxNiw5IEBACiAKICNwcmFnbWEgb25jZQogCisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorCiAjaW5jbHVkZSA8QXVkaW9HYWluLmg+CiAjaW5jbHVkZSA8Vm9sdW1lQ3VydmUuaD4KICNpbmNsdWRlIDxBdWRpb1BvcnQuaD4KQEAgLTI4LDcgKzMxLDYgQEAKICNpbmNsdWRlIDxBdWRpb1BvbGljeU1peC5oPgogI2luY2x1ZGUgPEVmZmVjdERlc2NyaXB0b3IuaD4KICNpbmNsdWRlIDxTb3VuZFRyaWdnZXJTZXNzaW9uLmg+Ci0jaW5jbHVkZSA8U2Vzc2lvblJvdXRlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzgsMTYgKzQwLDI0IEBACiAgICAgQXVkaW9Qb2xpY3lDb25maWcoSHdNb2R1bGVDb2xsZWN0aW9uICZod01vZHVsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVPdXRwdXREZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciAmYXZhaWxhYmxlSW5wdXREZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+ICZkZWZhdWx0T3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGVmYXVsdE91dHB1dERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uICp2b2x1bWVzID0gbnVsbHB0cikKICAgICAgICAgOiBtSHdNb2R1bGVzKGh3TW9kdWxlcyksCiAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMoYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyksCiAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcyhhdmFpbGFibGVJbnB1dERldmljZXMpLAotICAgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlcyhkZWZhdWx0T3V0cHV0RGV2aWNlcyksCisgICAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UoZGVmYXVsdE91dHB1dERldmljZSksCiAgICAgICAgICAgbVZvbHVtZUN1cnZlcyh2b2x1bWVzKSwKICAgICAgICAgICBtSXNTcGVha2VyRHJjRW5hYmxlZChmYWxzZSkKICAgICB7fQogCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldFNvdXJjZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2U7CisgICAgfQorCisgICAgdm9pZCBzZXRTb3VyY2UoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGUpIHsKKyAgICAgICAgbVNvdXJjZSA9IGZpbGU7CisgICAgfQorCiAgICAgdm9pZCBzZXRWb2x1bWVzKGNvbnN0IFZvbHVtZUN1cnZlc0NvbGxlY3Rpb24gJnZvbHVtZXMpCiAgICAgewogICAgICAgICBpZiAobVZvbHVtZUN1cnZlcyAhPSBudWxscHRyKSB7CkBAIC0xMDAsNTEgKzExMCw4OCBAQAogCiAgICAgdm9pZCBzZXREZWZhdWx0T3V0cHV0RGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZWZhdWx0RGV2aWNlKQogICAgIHsKLSAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2VzID0gZGVmYXVsdERldmljZTsKKyAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UgPSBkZWZhdWx0RGV2aWNlOwogICAgIH0KIAotICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZnZXREZWZhdWx0T3V0cHV0RGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbURlZmF1bHRPdXRwdXREZXZpY2VzOyB9CisgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmdldERlZmF1bHRPdXRwdXREZXZpY2UoKSBjb25zdCB7IHJldHVybiBtRGVmYXVsdE91dHB1dERldmljZTsgfQogCiAgICAgdm9pZCBzZXREZWZhdWx0KHZvaWQpCiAgICAgewotICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZXMgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpOwotICAgICAgICBzcDxId01vZHVsZT4gbW9kdWxlOworICAgICAgICBtU291cmNlID0gIkF1ZGlvUG9saWN5Q29uZmlnOjpzZXREZWZhdWx0IjsKKyAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpOworICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZS0+YWRkQXVkaW9Qcm9maWxlKEF1ZGlvUHJvZmlsZTo6Y3JlYXRlRnVsbER5bmFtaWMoKSk7CiAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRlZmF1bHRJbnB1dERldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQyk7Ci0gICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmFkZChtRGVmYXVsdE91dHB1dERldmljZXMpOworICAgICAgICBkZWZhdWx0SW5wdXREZXZpY2UtPmFkZEF1ZGlvUHJvZmlsZShBdWRpb1Byb2ZpbGU6OmNyZWF0ZUZ1bGxEeW5hbWljKCkpOworICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IG1pY1Byb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKAorICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCBBVURJT19DSEFOTkVMX0lOX01PTk8sIDgwMDApOworICAgICAgICBkZWZhdWx0SW5wdXREZXZpY2UtPmFkZEF1ZGlvUHJvZmlsZShtaWNQcm9maWxlKTsKKyAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuYWRkKG1EZWZhdWx0T3V0cHV0RGV2aWNlKTsKICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5hZGQoZGVmYXVsdElucHV0RGV2aWNlKTsKIAotICAgICAgICBtb2R1bGUgPSBuZXcgSHdNb2R1bGUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlkpOworICAgICAgICBzcDxId01vZHVsZT4gbW9kdWxlID0gbmV3IEh3TW9kdWxlKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9QUklNQVJZLCAyIC8qaGFsVmVyc2lvbk1ham9yKi8pOworICAgICAgICBtSHdNb2R1bGVzLmFkZChtb2R1bGUpOworICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZS0+YXR0YWNoKG1vZHVsZSk7CisgICAgICAgIGRlZmF1bHRJbnB1dERldmljZS0+YXR0YWNoKG1vZHVsZSk7CiAKICAgICAgICAgc3A8T3V0cHV0UHJvZmlsZT4gb3V0UHJvZmlsZTsKICAgICAgICAgb3V0UHJvZmlsZSA9IG5ldyBPdXRwdXRQcm9maWxlKFN0cmluZzgoInByaW1hcnkiKSk7CiAgICAgICAgIG91dFByb2ZpbGUtPmF0dGFjaChtb2R1bGUpOwogICAgICAgICBvdXRQcm9maWxlLT5hZGRBdWRpb1Byb2ZpbGUoCiAgICAgICAgICAgICAgICAgbmV3IEF1ZGlvUHJvZmlsZShBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLCA0NDEwMCkpOwotICAgICAgICBvdXRQcm9maWxlLT5hZGRTdXBwb3J0ZWREZXZpY2UobURlZmF1bHRPdXRwdXREZXZpY2VzKTsKKyAgICAgICAgb3V0UHJvZmlsZS0+YWRkU3VwcG9ydGVkRGV2aWNlKG1EZWZhdWx0T3V0cHV0RGV2aWNlKTsKICAgICAgICAgb3V0UHJvZmlsZS0+c2V0RmxhZ3MoQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSk7CiAgICAgICAgIG1vZHVsZS0+YWRkT3V0cHV0UHJvZmlsZShvdXRQcm9maWxlKTsKIAogICAgICAgICBzcDxJbnB1dFByb2ZpbGU+IGluUHJvZmlsZTsKICAgICAgICAgaW5Qcm9maWxlID0gbmV3IElucHV0UHJvZmlsZShTdHJpbmc4KCJwcmltYXJ5IikpOwogICAgICAgICBpblByb2ZpbGUtPmF0dGFjaChtb2R1bGUpOwotICAgICAgICBpblByb2ZpbGUtPmFkZEF1ZGlvUHJvZmlsZSgKLSAgICAgICAgICAgICAgICBuZXcgQXVkaW9Qcm9maWxlKEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCBBVURJT19DSEFOTkVMX0lOX01PTk8sIDgwMDApKTsKKyAgICAgICAgaW5Qcm9maWxlLT5hZGRBdWRpb1Byb2ZpbGUobWljUHJvZmlsZSk7CiAgICAgICAgIGluUHJvZmlsZS0+YWRkU3VwcG9ydGVkRGV2aWNlKGRlZmF1bHRJbnB1dERldmljZSk7CiAgICAgICAgIG1vZHVsZS0+YWRkSW5wdXRQcm9maWxlKGluUHJvZmlsZSk7CiAKLSAgICAgICAgbUh3TW9kdWxlcy5hZGQobW9kdWxlKTsKKyAgICAgICAgc2V0RGVmYXVsdFN1cnJvdW5kRm9ybWF0cygpOworICAgIH0KKworICAgIC8vIFN1cnJvdW5kIGZvcm1hdHMsIHdpdGggYW4gb3B0aW9uYWwgbGlzdCBvZiBzdWJmb3JtYXRzIHRoYXQgYXJlIGVxdWl2YWxlbnQgZnJvbSB1c2VycycgUE9WLgorICAgIHVzaW5nIFN1cnJvdW5kRm9ybWF0cyA9IHN0ZDo6dW5vcmRlcmVkX21hcDxhdWRpb19mb3JtYXRfdCwgc3RkOjp1bm9yZGVyZWRfc2V0PGF1ZGlvX2Zvcm1hdF90Pj47CisKKyAgICBjb25zdCBTdXJyb3VuZEZvcm1hdHMgJmdldFN1cnJvdW5kRm9ybWF0cygpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbVN1cnJvdW5kRm9ybWF0czsKKyAgICB9CisKKyAgICB2b2lkIHNldFN1cnJvdW5kRm9ybWF0cyhjb25zdCBTdXJyb3VuZEZvcm1hdHMgJnN1cnJvdW5kRm9ybWF0cykKKyAgICB7CisgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMgPSBzdXJyb3VuZEZvcm1hdHM7CisgICAgfQorCisgICAgdm9pZCBzZXREZWZhdWx0U3Vycm91bmRGb3JtYXRzKCkKKyAgICB7CisgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMgPSB7CisgICAgICAgICAgICB7QVVESU9fRk9STUFUX0FDMywge319LAorICAgICAgICAgICAge0FVRElPX0ZPUk1BVF9FX0FDMywge319LAorICAgICAgICAgICAge0FVRElPX0ZPUk1BVF9EVFMsIHt9fSwKKyAgICAgICAgICAgIHtBVURJT19GT1JNQVRfRFRTX0hELCB7fX0sCisgICAgICAgICAgICB7QVVESU9fRk9STUFUX0FBQ19MQywgeworICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0hFX1YxLCBBVURJT19GT1JNQVRfQUFDX0hFX1YyLCBBVURJT19GT1JNQVRfQUFDX0VMRCwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19YSEV9fSwKKyAgICAgICAgICAgIHtBVURJT19GT1JNQVRfRE9MQllfVFJVRUhELCB7fX0sCisgICAgICAgICAgICB7QVVESU9fRk9STUFUX0VfQUMzX0pPQywge319LAorICAgICAgICAgICAge0FVRElPX0ZPUk1BVF9BQzQsIHt9fX07CiAgICAgfQogCiBwcml2YXRlOgorICAgIHN0ZDo6c3RyaW5nIG1Tb3VyY2U7CiAgICAgSHdNb2R1bGVDb2xsZWN0aW9uICZtSHdNb2R1bGVzOyAvKio8IENvbGxlY3Rpb24gb2YgTW9kdWxlLCB3aXRoIFByb2ZpbGVzLCBpLmUuIE1peCBQb3J0cy4gKi8KICAgICBEZXZpY2VWZWN0b3IgJm1BdmFpbGFibGVPdXRwdXREZXZpY2VzOwogICAgIERldmljZVZlY3RvciAmbUF2YWlsYWJsZUlucHV0RGV2aWNlczsKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmbURlZmF1bHRPdXRwdXREZXZpY2VzOworICAgIHNwPERldmljZURlc2NyaXB0b3I+ICZtRGVmYXVsdE91dHB1dERldmljZTsKICAgICBWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uICptVm9sdW1lQ3VydmVzOwogICAgIC8vIFRPRE86IHJlbW92ZSB3aGVuIGxlZ2FjeSBjb25mIGZpbGUgaXMgcmVtb3ZlZC4gdHJ1ZSBvbiBkZXZpY2VzIHRoYXQgdXNlIERSQyBvbiB0aGUKICAgICAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiBwYXRoIHRvIGJvb3N0IHNvZnQgc291bmRzLCB1c2VkIHRvIGFkanVzdCB2b2x1bWUgY3VydmVzIGFjY29yZGluZ2x5LgogICAgIC8vIE5vdGU6IHJlbW92ZSBhbHNvIHNwZWFrZXJfZHJjX2VuYWJsZWQgZnJvbSBnbG9iYWwgY29uZmlndXJhdGlvbiBvZiBYTUwgY29uZmlnIGZpbGUuCiAgICAgYm9vbCBtSXNTcGVha2VyRHJjRW5hYmxlZDsKKyAgICBTdXJyb3VuZEZvcm1hdHMgbVN1cnJvdW5kRm9ybWF0czsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeU1peC5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5TWl4LmgKaW5kZXggOGZjNmZlOS4uOTU1ZTg3YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5TWl4LmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5TWl4LmgKQEAgLTQzLDcgKzQzLDcgQEAKIAogICAgIHZvaWQgc2V0TWl4KEF1ZGlvTWl4ICZtaXgpOwogCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKIAogcHJpdmF0ZToKICAgICBBdWRpb01peCAgICBtTWl4OyAgICAgICAgICAgICAgICAgICAvLyBBdWRpbyBwb2xpY3kgbWl4IGRlc2NyaXB0b3IKQEAgLTgwLDcgKzgwLDExIEBACiAKICAgICBzdGF0dXNfdCBnZXRJbnB1dE1peEZvckF0dHIoYXVkaW9fYXR0cmlidXRlc190IGF0dHIsIEF1ZGlvTWl4ICoqcG9saWN5TWl4KTsKIAotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKKyAgICBzdGF0dXNfdCBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKTsKKyAgICBzdGF0dXNfdCByZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCk7CisgICAgc3RhdHVzX3QgZ2V0RGV2aWNlc0ZvclVpZCh1aWRfdCB1aWQsIFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykgY29uc3Q7CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvcnQuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvcnQuaAppbmRleCAwOWE4NmRkLi5iYjljYWQ4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb3J0LmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9ydC5oCkBAIC0xMTYsNiArMTE2LDcgQEAKICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgZ2V0TW9kdWxlSGFuZGxlKCkgY29uc3Q7CiAgICAgdWludDMyX3QgZ2V0TW9kdWxlVmVyc2lvbk1ham9yKCkgY29uc3Q7CiAgICAgY29uc3QgY2hhciAqZ2V0TW9kdWxlTmFtZSgpIGNvbnN0OworICAgIHNwPEh3TW9kdWxlPiBnZXRNb2R1bGUoKSBjb25zdCB7IHJldHVybiBtTW9kdWxlOyB9CiAKICAgICBib29sIHVzZUlucHV0Q2hhbm5lbE1hc2soKSBjb25zdAogICAgIHsKQEAgLTEzMiwxNiArMTMzLDE3IEBACiAgICAgdm9pZCBhZGRSb3V0ZShjb25zdCBzcDxBdWRpb1JvdXRlPiAmcm91dGUpIHsgbVJvdXRlcy5hZGQocm91dGUpOyB9CiAgICAgY29uc3QgQXVkaW9Sb3V0ZVZlY3RvciAmZ2V0Um91dGVzKCkgY29uc3QgeyByZXR1cm4gbVJvdXRlczsgfQogCi0gICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgYm9vbCB2ZXJib3NlID0gdHJ1ZSkgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgYm9vbCB2ZXJib3NlID0gdHJ1ZSkgY29uc3Q7CisKICAgICB2b2lkIGxvZyhjb25zdCBjaGFyKiBpbmRlbnQpIGNvbnN0OwogCiAgICAgQXVkaW9HYWluQ29sbGVjdGlvbiBtR2FpbnM7IC8vIGdhaW4gY29udHJvbGxlcnMKLSAgICBzcDxId01vZHVsZT4gbU1vZHVsZTsgICAgICAgICAgICAgICAgIC8vIGF1ZGlvIEhXIG1vZHVsZSBleHBvc2luZyB0aGlzIEkvTyBzdHJlYW0KIAogcHJpdmF0ZToKICAgICB2b2lkIHBpY2tDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAmY2hhbm5lbE1hc2ssIGNvbnN0IENoYW5uZWxzVmVjdG9yICZjaGFubmVsTWFza3MpIGNvbnN0OwogICAgIHZvaWQgcGlja1NhbXBsaW5nUmF0ZSh1aW50MzJfdCAmcmF0ZSxjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGluZ1JhdGVzKSBjb25zdDsKIAorICAgIHNwPEh3TW9kdWxlPiBtTW9kdWxlOyAgICAgICAgICAgICAgICAgLy8gYXVkaW8gSFcgbW9kdWxlIGV4cG9zaW5nIHRoaXMgSS9PIHN0cmVhbQogICAgIFN0cmluZzggIG1OYW1lOwogICAgIGF1ZGlvX3BvcnRfdHlwZV90IG1UeXBlOwogICAgIGF1ZGlvX3BvcnRfcm9sZV90IG1Sb2xlOwpAQCAtMTUzLDkgKzE1NSw2IEBACiBjbGFzcyBBdWRpb1BvcnRDb25maWcgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCiB7CiBwdWJsaWM6Ci0gICAgQXVkaW9Qb3J0Q29uZmlnKCk7Ci0gICAgdmlydHVhbCB+QXVkaW9Qb3J0Q29uZmlnKCkge30KLQogICAgIHN0YXR1c190IGFwcGx5QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqYmFja3VwQ29uZmlnID0gTlVMTCk7CiAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLApAQCAtMTY1LDEwICsxNjQsMTEgQEAKICAgICAgICAgcmV0dXJuIChvdGhlciAhPSAwKSAmJgogICAgICAgICAgICAgICAgIChvdGhlci0+Z2V0QXVkaW9Qb3J0KCktPmdldE1vZHVsZUhhbmRsZSgpID09IGdldEF1ZGlvUG9ydCgpLT5nZXRNb2R1bGVIYW5kbGUoKSk7CiAgICAgfQotICAgIHVpbnQzMl90IG1TYW1wbGluZ1JhdGU7Ci0gICAgYXVkaW9fZm9ybWF0X3QgbUZvcm1hdDsKLSAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtQ2hhbm5lbE1hc2s7Ci0gICAgc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnIG1HYWluOworICAgIHVuc2lnbmVkIGludCBtU2FtcGxpbmdSYXRlID0gMHU7CisgICAgYXVkaW9fZm9ybWF0X3QgbUZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOworICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1DaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKKyAgICBzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgbUdhaW4gPSB7IC5pbmRleCA9IC0xIH07CisgICAgdW5pb24gYXVkaW9faW9fZmxhZ3MgbUZsYWdzID0geyBBVURJT19JTlBVVF9GTEFHX05PTkUgfTsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Byb2ZpbGUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Byb2ZpbGUuaAppbmRleCA4NzQxYzY2Li5iNTg4ZDU3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qcm9maWxlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUHJvZmlsZS5oCkBAIC0xNiw5MSArMTYsODQgQEAKIAogI3ByYWdtYSBvbmNlCiAKLSNpbmNsdWRlICJwb2xpY3kuaCIKLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKwogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPGN1dGlscy9jb25maWdfdXRpbHMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCisjaW5jbHVkZSAicG9saWN5LmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogdHlwZWRlZiBTb3J0ZWRWZWN0b3I8dWludDMyX3Q+IFNhbXBsZVJhdGVWZWN0b3I7Ci10eXBlZGVmIFNvcnRlZFZlY3RvcjxhdWRpb19jaGFubmVsX21hc2tfdD4gQ2hhbm5lbHNWZWN0b3I7CiB0eXBlZGVmIFZlY3RvcjxhdWRpb19mb3JtYXRfdD4gRm9ybWF0VmVjdG9yOwogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IFNvcnRlZFZlY3RvcjxUPiAmbGVmdCwgY29uc3QgU29ydGVkVmVjdG9yPFQ+ICZyaWdodCk7Citib29sIG9wZXJhdG9yPT0gKGNvbnN0IFNvcnRlZFZlY3RvcjxUPiAmbGVmdCwgY29uc3QgU29ydGVkVmVjdG9yPFQ+ICZyaWdodCkKK3sKKyAgICBpZiAobGVmdC5zaXplKCkgIT0gcmlnaHQuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHJpZ2h0LnNpemUoKTsgaW5kZXgrKykgeworICAgICAgICBpZiAobGVmdFtpbmRleF0gIT0gcmlnaHRbaW5kZXhdKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYm9vbCBvcGVyYXRvciE9IChjb25zdCBTb3J0ZWRWZWN0b3I8VD4gJmxlZnQsIGNvbnN0IFNvcnRlZFZlY3RvcjxUPiAmcmlnaHQpCit7CisgICAgcmV0dXJuICEobGVmdCA9PSByaWdodCk7Cit9CisKK2NsYXNzIENoYW5uZWxzVmVjdG9yIDogcHVibGljIFNvcnRlZFZlY3RvcjxhdWRpb19jaGFubmVsX21hc2tfdD4KK3sKK3B1YmxpYzoKKyAgICBDaGFubmVsc1ZlY3RvcigpID0gZGVmYXVsdDsKKyAgICBDaGFubmVsc1ZlY3Rvcihjb25zdCBDaGFubmVsc1ZlY3RvciYpID0gZGVmYXVsdDsKKyAgICBDaGFubmVsc1ZlY3Rvcihjb25zdCBTb3J0ZWRWZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+JiBzdikgOgorICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2NoYW5uZWxfbWFza190Pihzdikge30KKyAgICBDaGFubmVsc1ZlY3RvciYgb3BlcmF0b3I9KGNvbnN0IENoYW5uZWxzVmVjdG9yJikgPSBkZWZhdWx0OworCisgICAgLy8gQXBwbGllcyBhdWRpb19jaGFubmVsX21hc2tfb3V0X3RvX2luIHRvIGFsbCBlbGVtZW50cyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgorICAgIENoYW5uZWxzVmVjdG9yIGFzSW5NYXNrKCkgY29uc3Q7CisgICAgLy8gQXBwbGllcyBhdWRpb19jaGFubmVsX21hc2tfaW5fdG9fb3V0IHRvIGFsbCBlbGVtZW50cyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgorICAgIENoYW5uZWxzVmVjdG9yIGFzT3V0TWFzaygpIGNvbnN0OworfTsKIAogY2xhc3MgQXVkaW9Qcm9maWxlIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZQogewogcHVibGljOgotICAgIEF1ZGlvUHJvZmlsZShhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrcywKLSAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlKSA6Ci0gICAgICAgIG1OYW1lKFN0cmluZzgoIiIpKSwKLSAgICAgICAgbUZvcm1hdChmb3JtYXQpCi0gICAgewotICAgICAgICBtQ2hhbm5lbE1hc2tzLmFkZChjaGFubmVsTWFza3MpOwotICAgICAgICBtU2FtcGxpbmdSYXRlcy5hZGQoc2FtcGxpbmdSYXRlKTsKLSAgICB9CisgICAgc3RhdGljIHNwPEF1ZGlvUHJvZmlsZT4gY3JlYXRlRnVsbER5bmFtaWMoKTsKIAorICAgIEF1ZGlvUHJvZmlsZShhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrcywgdWludDMyX3Qgc2FtcGxpbmdSYXRlKTsKICAgICBBdWRpb1Byb2ZpbGUoYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICBjb25zdCBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbE1hc2tzLAotICAgICAgICAgICAgICAgICBjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGluZ1JhdGVDb2xsZWN0aW9uKSA6Ci0gICAgICAgIG1OYW1lKFN0cmluZzgoIiIpKSwKLSAgICAgICAgbUZvcm1hdChmb3JtYXQpLAotICAgICAgICBtQ2hhbm5lbE1hc2tzKGNoYW5uZWxNYXNrcyksCi0gICAgICAgIG1TYW1wbGluZ1JhdGVzKHNhbXBsaW5nUmF0ZUNvbGxlY3Rpb24pCi0gICAge30KKyAgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxlUmF0ZVZlY3RvciAmc2FtcGxpbmdSYXRlQ29sbGVjdGlvbik7CiAKICAgICBhdWRpb19mb3JtYXRfdCBnZXRGb3JtYXQoKSBjb25zdCB7IHJldHVybiBtRm9ybWF0OyB9Ci0KLSAgICB2b2lkIHNldENoYW5uZWxzKGNvbnN0IENoYW5uZWxzVmVjdG9yICZjaGFubmVsTWFza3MpCi0gICAgewotICAgICAgICBpZiAobUlzRHluYW1pY0NoYW5uZWxzKSB7Ci0gICAgICAgICAgICBtQ2hhbm5lbE1hc2tzID0gY2hhbm5lbE1hc2tzOwotICAgICAgICB9Ci0gICAgfQogICAgIGNvbnN0IENoYW5uZWxzVmVjdG9yICZnZXRDaGFubmVscygpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsTWFza3M7IH0KLQotICAgIHZvaWQgc2V0U2FtcGxlUmF0ZXMoY29uc3QgU2FtcGxlUmF0ZVZlY3RvciAmc2FtcGxlUmF0ZXMpCi0gICAgewotICAgICAgICBpZiAobUlzRHluYW1pY1JhdGUpIHsKLSAgICAgICAgICAgIG1TYW1wbGluZ1JhdGVzID0gc2FtcGxlUmF0ZXM7Ci0gICAgICAgIH0KLSAgICB9CiAgICAgY29uc3QgU2FtcGxlUmF0ZVZlY3RvciAmZ2V0U2FtcGxlUmF0ZXMoKSBjb25zdCB7IHJldHVybiBtU2FtcGxpbmdSYXRlczsgfQorICAgIHZvaWQgc2V0Q2hhbm5lbHMoY29uc3QgQ2hhbm5lbHNWZWN0b3IgJmNoYW5uZWxNYXNrcyk7CisgICAgdm9pZCBzZXRTYW1wbGVSYXRlcyhjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGVSYXRlcyk7CiAKKyAgICB2b2lkIGNsZWFyKCk7CiAgICAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gaGFzVmFsaWRGb3JtYXQoKSAmJiBoYXNWYWxpZFJhdGVzKCkgJiYgaGFzVmFsaWRDaGFubmVscygpOyB9Ci0KLSAgICB2b2lkIGNsZWFyKCkKLSAgICB7Ci0gICAgICAgIGlmIChtSXNEeW5hbWljQ2hhbm5lbHMpIHsKLSAgICAgICAgICAgIG1DaGFubmVsTWFza3MuY2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUlzRHluYW1pY1JhdGUpIHsKLSAgICAgICAgICAgIG1TYW1wbGluZ1JhdGVzLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbmxpbmUgYm9vbCBzdXBwb3J0c0NoYW5uZWxzKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxzKSBjb25zdAorICAgIGJvb2wgc3VwcG9ydHNDaGFubmVscyhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVscykgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtQ2hhbm5lbE1hc2tzLmluZGV4T2YoY2hhbm5lbHMpID49IDA7CiAgICAgfQotICAgIGlubGluZSBib29sIHN1cHBvcnRzUmF0ZSh1aW50MzJfdCByYXRlKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1TYW1wbGluZ1JhdGVzLmluZGV4T2YocmF0ZSkgPj0gMDsKLSAgICB9CisgICAgYm9vbCBzdXBwb3J0c1JhdGUodWludDMyX3QgcmF0ZSkgY29uc3QgeyByZXR1cm4gbVNhbXBsaW5nUmF0ZXMuaW5kZXhPZihyYXRlKSA+PSAwOyB9CiAKICAgICBzdGF0dXNfdCBjaGVja0V4YWN0KHVpbnQzMl90IHJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxzLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0OwotCiAgICAgc3RhdHVzX3QgY2hlY2tDb21wYXRpYmxlQ2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgJnVwZGF0ZWRDaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCBwb3J0VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3JvbGVfdCBwb3J0Um9sZSkgY29uc3Q7Ci0KICAgICBzdGF0dXNfdCBjaGVja0NvbXBhdGlibGVTYW1wbGluZ1JhdGUodWludDMyX3Qgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmdXBkYXRlZFNhbXBsaW5nUmF0ZSkgY29uc3Q7CiAKQEAgLTExOSw3ICsxMTIsNyBAQAogCiAgICAgYm9vbCBpc0R5bmFtaWMoKSB7IHJldHVybiBtSXNEeW5hbWljRm9ybWF0IHx8IG1Jc0R5bmFtaWNDaGFubmVscyB8fCBtSXNEeW5hbWljUmF0ZTsgfQogCi0gICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3Q7CiAKIHByaXZhdGU6CiAgICAgU3RyaW5nOCAgbU5hbWU7CkBAIC0xMzYsMjEzICsxMjksNDggQEAKIGNsYXNzIEF1ZGlvUHJvZmlsZVZlY3RvciA6IHB1YmxpYyBWZWN0b3I8c3A8QXVkaW9Qcm9maWxlPiA+CiB7CiBwdWJsaWM6Ci0gICAgc3NpemVfdCBhZGQoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmcHJvZmlsZSkKLSAgICB7Ci0gICAgICAgIHNzaXplX3QgaW5kZXggPSBWZWN0b3I6OmFkZChwcm9maWxlKTsKLSAgICAgICAgLy8gd2Ugc29ydCBmcm9tIHdvcnN0IHRvIGJlc3QsIHNvIHRoYXQgQVVESU9fRk9STUFUX0RFRkFVTFQgaXMgYWx3YXlzIHRoZSBmaXJzdCBlbnRyeS4KLSAgICAgICAgLy8gVE9ETzogY29tcGFyZUZvcm1hdHMgY291bGQgYmUgYSBsYW1iZGEgdG8gY29udmVydCBiZXR3ZWVuIHBvaW50ZXItdG8tZm9ybWF0IHRvIGZvcm1hdDoKLSAgICAgICAgLy8gW10oY29uc3QgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdDEsIGNvbnN0IGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQyKSB7Ci0gICAgICAgIC8vICAgICByZXR1cm4gY29tcGFyZUZvcm1hdHMoKmZvcm1hdDEsICpmb3JtYXQyKTsKLSAgICAgICAgLy8gfQotICAgICAgICBzb3J0KGNvbXBhcmVGb3JtYXRzKTsKLSAgICAgICAgcmV0dXJuIGluZGV4OwotICAgIH0KLQorICAgIHNzaXplX3QgYWRkKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGUpOwogICAgIC8vIFRoaXMgQVBJIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgdGhlIHBvbGljeSBtYW5hZ2VyIG9uY2UgcmV0cmlldmluZyBjYXBhYmlsaXRpZXMKICAgICAvLyBmb3IgYSBwcm9maWxlIHdpdGggZHluYW1pYyBmb3JtYXQsIHJhdGUgYW5kIGNoYW5uZWxzIGF0dHJpYnV0ZXMKLSAgICBzc2l6ZV90IGFkZFByb2ZpbGVGcm9tSGFsKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGVUb0FkZCkKLSAgICB7Ci0gICAgICAgIC8vIENoZWNrIHZhbGlkIHByb2ZpbGUgdG8gYWRkOgotICAgICAgICBpZiAoIXByb2ZpbGVUb0FkZC0+aGFzVmFsaWRGb3JtYXQoKSkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcHJvZmlsZVRvQWRkLT5oYXNWYWxpZENoYW5uZWxzKCkgJiYgIXByb2ZpbGVUb0FkZC0+aGFzVmFsaWRSYXRlcygpKSB7Ci0gICAgICAgICAgICBGb3JtYXRWZWN0b3IgZm9ybWF0czsKLSAgICAgICAgICAgIGZvcm1hdHMuYWRkKHByb2ZpbGVUb0FkZC0+Z2V0Rm9ybWF0KCkpOwotICAgICAgICAgICAgc2V0Rm9ybWF0cyhGb3JtYXRWZWN0b3IoZm9ybWF0cykpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFwcm9maWxlVG9BZGQtPmhhc1ZhbGlkQ2hhbm5lbHMoKSAmJiBwcm9maWxlVG9BZGQtPmhhc1ZhbGlkUmF0ZXMoKSkgewotICAgICAgICAgICAgc2V0U2FtcGxlUmF0ZXNGb3IocHJvZmlsZVRvQWRkLT5nZXRTYW1wbGVSYXRlcygpLCBwcm9maWxlVG9BZGQtPmdldEZvcm1hdCgpKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9maWxlVG9BZGQtPmhhc1ZhbGlkQ2hhbm5lbHMoKSAmJiAhcHJvZmlsZVRvQWRkLT5oYXNWYWxpZFJhdGVzKCkpIHsKLSAgICAgICAgICAgIHNldENoYW5uZWxzRm9yKHByb2ZpbGVUb0FkZC0+Z2V0Q2hhbm5lbHMoKSwgcHJvZmlsZVRvQWRkLT5nZXRGb3JtYXQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICAvLyBHbyB0aHJvdWdoIHRoZSBsaXN0IG9mIHByb2ZpbGUgdG8gYXZvaWQgZHVwbGljYXRlcwotICAgICAgICBmb3IgKHNpemVfdCBwcm9maWxlSW5kZXggPSAwOyBwcm9maWxlSW5kZXggPCBzaXplKCk7IHByb2ZpbGVJbmRleCsrKSB7Ci0gICAgICAgICAgICBjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICZwcm9maWxlID0gaXRlbUF0KHByb2ZpbGVJbmRleCk7Ci0gICAgICAgICAgICBpZiAocHJvZmlsZS0+aXNWYWxpZCgpICYmIHByb2ZpbGUgPT0gcHJvZmlsZVRvQWRkKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm90aGluZyB0byBkbwotICAgICAgICAgICAgICAgIHJldHVybiBwcm9maWxlSW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOyAvLyBzZXQgdGhlIGZvcm1hdCBhcyBkeW5hbWljIHRvIGFsbG93IHJlbW92YWwKLSAgICAgICAgcmV0dXJuIGFkZChwcm9maWxlVG9BZGQpOwotICAgIH0KLQotICAgIHNwPEF1ZGlvUHJvZmlsZT4gZ2V0Rmlyc3RWYWxpZFByb2ZpbGUoKSBjb25zdAotICAgIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKGl0ZW1BdChpKS0+aXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1BdChpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBib29sIGhhc1ZhbGlkUHJvZmlsZSgpIGNvbnN0IHsgcmV0dXJuIGdldEZpcnN0VmFsaWRQcm9maWxlKCkgIT0gMDsgfQorICAgIHNzaXplX3QgYWRkUHJvZmlsZUZyb21IYWwoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmcHJvZmlsZVRvQWRkKTsKIAogICAgIHN0YXR1c190IGNoZWNrRXhhY3RQcm9maWxlKHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdDsKLQogICAgIHN0YXR1c190IGNoZWNrQ29tcGF0aWJsZVByb2ZpbGUodWludDMyX3QgJnNhbXBsaW5nUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgJmNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgJmZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHBvcnRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9yb2xlX3QgcG9ydFJvbGUpIGNvbnN0OworICAgIHZvaWQgY2xlYXJQcm9maWxlcygpOworICAgIC8vIEFzc3VtaW5nIHRoYXQgdGhpcyBwcm9maWxlIHZlY3RvciBjb250YWlucyBpbnB1dCBwcm9maWxlcywKKyAgICAvLyBmaW5kIHRoZSBiZXN0IG1hdGNoaW5nIGNvbmZpZyBmcm9tICdvdXRwdXRQcm9maWxlcycsIGFjY29yZGluZyB0bworICAgIC8vIHRoZSBnaXZlbiBwcmVmZXJlbmNlcyBmb3IgYXVkaW8gZm9ybWF0cyBhbmQgY2hhbm5lbCBtYXNrcy4KKyAgICAvLyBOb3RlOiBzdGQ6OnZlY3RvcnMgYXJlIHVzZWQgYmVjYXVzZSBzcGVjaWFsaXplZCBjb250YWluZXJzIGZvciBmb3JtYXRzCisgICAgLy8gICAgICAgYW5kIGNoYW5uZWxzIGNhbiBiZSBzb3J0ZWQgYW5kIHVzZSB0aGVpciBvd24gb3JkZXJpbmcuCisgICAgc3RhdHVzX3QgZmluZEJlc3RNYXRjaGluZ091dHB1dENvbmZpZyhjb25zdCBBdWRpb1Byb2ZpbGVWZWN0b3ImIG91dHB1dFByb2ZpbGVzLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+JiBwcmVmZXJyZWRGb3JtYXRzLCAvLyBvcmRlcjogbW9zdCBwcmVmIC0+IGxlYXN0IHByZWYKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGF1ZGlvX2NoYW5uZWxfbWFza190PiYgcHJlZmVycmVkT3V0cHV0Q2hhbm5lbHMsCisgICAgICAgICAgICBib29sIHByZWZlckhpZ2hlclNhbXBsaW5nUmF0ZXMsCisgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZSAqYmVzdE91dHB1dENvbmZpZykgY29uc3Q7CiAKLSAgICBGb3JtYXRWZWN0b3IgZ2V0U3VwcG9ydGVkRm9ybWF0cygpIGNvbnN0Ci0gICAgewotICAgICAgICBGb3JtYXRWZWN0b3Igc3VwcG9ydGVkRm9ybWF0czsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKGl0ZW1BdChpKS0+aGFzVmFsaWRGb3JtYXQoKSkgewotICAgICAgICAgICAgICAgIHN1cHBvcnRlZEZvcm1hdHMuYWRkKGl0ZW1BdChpKS0+Z2V0Rm9ybWF0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBwb3J0ZWRGb3JtYXRzOwotICAgIH0KKyAgICBzcDxBdWRpb1Byb2ZpbGU+IGdldEZpcnN0VmFsaWRQcm9maWxlKCkgY29uc3Q7CisgICAgc3A8QXVkaW9Qcm9maWxlPiBnZXRGaXJzdFZhbGlkUHJvZmlsZUZvcihhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0OworICAgIGJvb2wgaGFzVmFsaWRQcm9maWxlKCkgY29uc3QgeyByZXR1cm4gZ2V0Rmlyc3RWYWxpZFByb2ZpbGUoKSAhPSAwOyB9CiAKLSAgICBib29sIGhhc0R5bmFtaWNQcm9maWxlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpdGVtQXQoaSktPmlzRHluYW1pYygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2wgaGFzRHluYW1pY0Zvcm1hdCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gZ2V0UHJvZmlsZUZvcihnRHluYW1pY0Zvcm1hdCkgIT0gMDsKLSAgICB9Ci0KLSAgICBib29sIGhhc0R5bmFtaWNDaGFubmVsc0ZvcihhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0Ci0gICAgewotICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gaXRlbUF0KGkpOwotICAgICAgICAgICBpZiAocHJvZmlsZS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0ICYmIHByb2ZpbGUtPmlzRHluYW1pY0NoYW5uZWxzKCkpIHsKLSAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sIGhhc0R5bmFtaWNSYXRlRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3QKLSAgICB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IGl0ZW1BdChpKTsKLSAgICAgICAgICAgIGlmIChwcm9maWxlLT5nZXRGb3JtYXQoKSA9PSBmb3JtYXQgJiYgcHJvZmlsZS0+aXNEeW5hbWljUmF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KKyAgICBGb3JtYXRWZWN0b3IgZ2V0U3VwcG9ydGVkRm9ybWF0cygpIGNvbnN0OworICAgIGJvb2wgaGFzRHluYW1pY0NoYW5uZWxzRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3Q7CisgICAgYm9vbCBoYXNEeW5hbWljRm9ybWF0KCkgY29uc3QgeyByZXR1cm4gZ2V0UHJvZmlsZUZvcihnRHluYW1pY0Zvcm1hdCkgIT0gMDsgfQorICAgIGJvb2wgaGFzRHluYW1pY1Byb2ZpbGUoKSBjb25zdDsKKyAgICBib29sIGhhc0R5bmFtaWNSYXRlRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3Q7CiAKICAgICAvLyBPbmUgYXVkaW8gcHJvZmlsZSB3aWxsIGJlIGFkZGVkIGZvciBlYWNoIGZvcm1hdCBzdXBwb3J0ZWQgYnkgQXVkaW8gSEFMCi0gICAgdm9pZCBzZXRGb3JtYXRzKGNvbnN0IEZvcm1hdFZlY3RvciAmZm9ybWF0cykKLSAgICB7Ci0gICAgICAgIC8vIE9ubHkgYWxsb3cgdG8gY2hhbmdlIHRoZSBmb3JtYXQgb2YgZHluYW1pYyBwcm9maWxlCi0gICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gZHluYW1pY0Zvcm1hdFByb2ZpbGUgPSBnZXRQcm9maWxlRm9yKGdEeW5hbWljRm9ybWF0KTsKLSAgICAgICAgaWYgKGR5bmFtaWNGb3JtYXRQcm9maWxlID09IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoZm9ybWF0c1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY0Zvcm1hdFByb2ZpbGUtPmdldENoYW5uZWxzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNGb3JtYXRQcm9maWxlLT5nZXRTYW1wbGVSYXRlcygpKTsKLSAgICAgICAgICAgIHByb2ZpbGUtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7Ci0gICAgICAgICAgICBwcm9maWxlLT5zZXREeW5hbWljQ2hhbm5lbHMoZHluYW1pY0Zvcm1hdFByb2ZpbGUtPmlzRHluYW1pY0NoYW5uZWxzKCkpOwotICAgICAgICAgICAgcHJvZmlsZS0+c2V0RHluYW1pY1JhdGUoZHluYW1pY0Zvcm1hdFByb2ZpbGUtPmlzRHluYW1pY1JhdGUoKSk7Ci0gICAgICAgICAgICBhZGQocHJvZmlsZSk7Ci0gICAgICAgIH0KLSAgICB9CisgICAgdm9pZCBzZXRGb3JtYXRzKGNvbnN0IEZvcm1hdFZlY3RvciAmZm9ybWF0cyk7CiAKLSAgICB2b2lkIGNsZWFyUHJvZmlsZXMoKQotICAgIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IHNpemUoKTsgaSAhPSAwOyApIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IGl0ZW1BdCgtLWkpOwotICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmlzRHluYW1pY0Zvcm1hdCgpICYmIHByb2ZpbGUtPmhhc1ZhbGlkRm9ybWF0KCkpIHsKLSAgICAgICAgICAgICAgICByZW1vdmVBdChpKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb2ZpbGUtPmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdAotICAgIHsKLSAgICAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gUHJvZmlsZXM6XG4iLCBzcGFjZXMsICIiKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNQcm9maWxlICV6dToiLCBzcGFjZXMgKyA0LCAiIiwgaSk7Ci0gICAgICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgICAgICBpdGVtQXQoaSktPmR1bXAoZmQsIHNwYWNlcyArIDgpOwotICAgICAgICB9Ci0gICAgfQorICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0OwogCiBwcml2YXRlOgotICAgIHZvaWQgc2V0U2FtcGxlUmF0ZXNGb3IoY29uc3QgU2FtcGxlUmF0ZVZlY3RvciAmc2FtcGxlUmF0ZXMsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkKLSAgICB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IGl0ZW1BdChpKTsKLSAgICAgICAgICAgIGlmIChwcm9maWxlLT5nZXRGb3JtYXQoKSA9PSBmb3JtYXQgJiYgcHJvZmlsZS0+aXNEeW5hbWljUmF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmhhc1ZhbGlkUmF0ZXMoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGNyZWF0ZSBhIG5ldyBwcm9maWxlIHdpdGggc2FtZSBmb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlVG9BZGQgPSBuZXcgQXVkaW9Qcm9maWxlKGZvcm1hdCwgcHJvZmlsZS0+Z2V0Q2hhbm5lbHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGVzKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOyAvLyBuZWVkIHRvIHNldCB0byBhbGxvdyBjbGVhbmluZwotICAgICAgICAgICAgICAgICAgICBhZGQocHJvZmlsZVRvQWRkKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5zZXRTYW1wbGVSYXRlcyhzYW1wbGVSYXRlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc2V0Q2hhbm5lbHNGb3IoY29uc3QgQ2hhbm5lbHNWZWN0b3IgJmNoYW5uZWxNYXNrcywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQotICAgIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gaXRlbUF0KGkpOwotICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmdldEZvcm1hdCgpID09IGZvcm1hdCAmJiBwcm9maWxlLT5pc0R5bmFtaWNDaGFubmVscygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmhhc1ZhbGlkQ2hhbm5lbHMoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGNyZWF0ZSBhIG5ldyBwcm9maWxlIHdpdGggc2FtZSBmb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlVG9BZGQgPSBuZXcgQXVkaW9Qcm9maWxlKGZvcm1hdCwgY2hhbm5lbE1hc2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+Z2V0U2FtcGxlUmF0ZXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHByb2ZpbGVUb0FkZC0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsgLy8gbmVlZCB0byBzZXQgdG8gYWxsb3cgY2xlYW5pbmcKLSAgICAgICAgICAgICAgICAgICAgYWRkKHByb2ZpbGVUb0FkZCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+c2V0Q2hhbm5lbHMoY2hhbm5lbE1hc2tzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3A8QXVkaW9Qcm9maWxlPiBnZXRQcm9maWxlRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3QKLSAgICB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpdGVtQXQoaSktPmdldEZvcm1hdCgpID09IGZvcm1hdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBpdGVtQXQoaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIHNwPEF1ZGlvUHJvZmlsZT4gZ2V0UHJvZmlsZUZvcihhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0OworICAgIHZvaWQgc2V0U2FtcGxlUmF0ZXNGb3IoY29uc3QgU2FtcGxlUmF0ZVZlY3RvciAmc2FtcGxlUmF0ZXMsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCk7CisgICAgdm9pZCBzZXRDaGFubmVsc0Zvcihjb25zdCBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbE1hc2tzLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpOwogCiAgICAgc3RhdGljIGludCBjb21wYXJlRm9ybWF0cyhjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICpwcm9maWxlMSwgY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAqcHJvZmlsZTIpOwogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1JvdXRlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Sb3V0ZS5oCmluZGV4IDZiMjRmZGUuLjAzNTdmZjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1JvdXRlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUm91dGUuaApAQCAtNDYsNyArNDYsMjAgQEAKIAogICAgIGF1ZGlvX3JvdXRlX3R5cGVfdCBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gbVR5cGU7IH0KIAotICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0OworICAgIC8qKgorICAgICAqIEBicmllZiBzdXBwb3J0c1BhdGNoIGNoZWNrcyBpZiBhbiBhdWRpbyBwYXRjaCBpcyBzdXBwb3J0ZWQgYnkgYSBSb3V0ZSBkZWNsYXJlZCBpbgorICAgICAqIHRoZSBhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgZmlsZS4KKyAgICAgKiBJZiB0aGUgcGF0Y2ggaXMgc3VwcG9ydGVkIG5hdGl2ZWx5IGJ5IGFuIEF1ZGlvSEFMICh3aGljaCBzdXBwb3J0cyBvZiBjb3Vyc2UgUm91dGluZyBBUEkgMy4wKSwKKyAgICAgKiBhdWRpb3BvbGljeSB3aWxsIG5vdCByZXF1ZXN0IEF1ZGlvRmxpbmdlciB0byB1c2UgYSBzb2Z0d2FyZSBicmlkZ2UgdG8gcmVhbGl6ZSBhIHBhdGNoCisgICAgICogYmV0d2VlbiAyIHBvcnRzLgorICAgICAqIEBwYXJhbSBzcmNQb3J0IChha2EgdGhlIHNvdXJjZSkgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEBwYXJhbSBkc3RQb3J0IChha2EgdGhlIHNpbmspIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGF1ZGlvIHJvdXRlIHN1cHBvcnRzIHRoZSBjb25uZWN0aW9uIGJldHdlZW4gdGhlIHNpbmsgYW5kIHRoZSBzb3VyY2UsCisgICAgICogZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgYm9vbCBzdXBwb3J0c1BhdGNoKGNvbnN0IHNwPEF1ZGlvUG9ydD4gJnNyY1BvcnQsIGNvbnN0IHNwPEF1ZGlvUG9ydD4gJmRzdFBvcnQpIGNvbnN0OworCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3Q7CiAKIHByaXZhdGU6CiAgICAgQXVkaW9Qb3J0VmVjdG9yIG1Tb3VyY2VzOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbi5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDUyNDdkLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Nlc3Npb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgotI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaD4KLSNpbmNsdWRlICJBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZTsKLQotY2xhc3MgQXVkaW9TZXNzaW9uIDogcHVibGljIFJlZkJhc2UsIHB1YmxpYyBBdWRpb1Nlc3Npb25JbmZvVXBkYXRlTGlzdGVuZXIKLXsKLXB1YmxpYzoKLSAgICBBdWRpb1Nlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCi0gICAgICAgICAgICAgICAgIGJvb2wgaXNTb3VuZFRyaWdnZXIsCi0gICAgICAgICAgICAgICAgIEF1ZGlvTWl4KiBwb2xpY3lNaXgsCi0gICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOwotCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7Ci0KLSAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1SZWNvcmRDbGllbnRJbmZvLnNlc3Npb247IH0KLSAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSgpY29uc3QgeyByZXR1cm4gbVJlY29yZENsaWVudEluZm8uc291cmNlOyB9Ci0gICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUNvbmZpZy5mb3JtYXQ7IH0KLSAgICB1aW50MzJfdCBzYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbUNvbmZpZy5zYW1wbGVfcmF0ZTsgfQotICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKCkgY29uc3QgeyByZXR1cm4gbUNvbmZpZy5jaGFubmVsX21hc2s7IH0KLSAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKCkgY29uc3QgeyByZXR1cm4gbUZsYWdzOyB9Ci0gICAgdWlkX3QgdWlkKCkgY29uc3QgeyByZXR1cm4gbVJlY29yZENsaWVudEluZm8udWlkOyB9Ci0gICAgdm9pZCBzZXRVaWQodWlkX3QgdWlkKSB7IG1SZWNvcmRDbGllbnRJbmZvLnVpZCA9IHVpZDsgfQotICAgIGJvb2wgbWF0Y2hlcyhjb25zdCBzcDxBdWRpb1Nlc3Npb24+ICZvdGhlcikgY29uc3Q7Ci0gICAgYm9vbCBpc1NvdW5kVHJpZ2dlcigpIGNvbnN0IHsgcmV0dXJuIG1Jc1NvdW5kVHJpZ2dlcjsgfQotICAgIHZvaWQgc2V0U2lsZW5jZWQoYm9vbCBzaWxlbmNlZCkgeyBtU2lsZW5jZWQgPSBzaWxlbmNlZDsgfQotICAgIGJvb2wgaXNTaWxlbmNlZCgpIGNvbnN0IHsgcmV0dXJuIG1TaWxlbmNlZDsgfQotICAgIHVpbnQzMl90IG9wZW5Db3VudCgpIGNvbnN0IHsgcmV0dXJuIG1PcGVuQ291bnQ7IH0gOwotICAgIHVpbnQzMl90IGFjdGl2ZUNvdW50KCkgY29uc3QgeyByZXR1cm4gbUFjdGl2ZUNvdW50OyB9IDsKLQotICAgIHVpbnQzMl90IGNoYW5nZU9wZW5Db3VudChpbnQgZGVsdGEpOwotICAgIHVpbnQzMl90IGNoYW5nZUFjdGl2ZUNvdW50KGludCBkZWx0YSk7Ci0KLSAgICB2b2lkIHNldEluZm9Qcm92aWRlcihBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIgKnByb3ZpZGVyKTsKLSAgICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBBdWRpb1Nlc3Npb25JbmZvVXBkYXRlTGlzdGVuZXIKLSAgICB2aXJ0dWFsIHZvaWQgb25TZXNzaW9uSW5mb1VwZGF0ZSgpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIHJlY29yZF9jbGllbnRfaW5mb190IG1SZWNvcmRDbGllbnRJbmZvOwotICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSBtQ29uZmlnOwotICAgIGNvbnN0IGF1ZGlvX2lucHV0X2ZsYWdzX3QgbUZsYWdzOwotICAgIGJvb2wgIG1Jc1NvdW5kVHJpZ2dlcjsKLSAgICBib29sIG1TaWxlbmNlZDsKLSAgICB1aW50MzJfdCAgbU9wZW5Db3VudDsKLSAgICB1aW50MzJfdCAgbUFjdGl2ZUNvdW50OwotICAgIEF1ZGlvTWl4KiBtUG9saWN5TWl4OyAvLyBub24gTlVMTCB3aGVuIHVzZWQgYnkgYSBkeW5hbWljIHBvbGljeQotICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlKiBtQ2xpZW50SW50ZXJmYWNlOwotICAgIGNvbnN0IEF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlciogbUluZm9Qcm92aWRlcjsKLX07Ci0KLWNsYXNzIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gOgotICAgIHB1YmxpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90LCBzcDxBdWRpb1Nlc3Npb24+ID4sCi0gICAgcHVibGljIEF1ZGlvU2Vzc2lvbkluZm9VcGRhdGVMaXN0ZW5lcgotewotcHVibGljOgotICAgIHN0YXR1c190IGFkZFNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4mIGF1ZGlvU2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyICpwcm92aWRlcik7Ci0KLSAgICBzdGF0dXNfdCByZW1vdmVTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLQotICAgIHVpbnQzMl90IGdldE9wZW5Db3VudCgpIGNvbnN0OwotCi0gICAgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiBnZXRBY3RpdmVTZXNzaW9ucygpIGNvbnN0OwotICAgIHNpemVfdCBnZXRBY3RpdmVTZXNzaW9uQ291bnQoKSBjb25zdDsKLSAgICBib29sIGhhc0FjdGl2ZVNlc3Npb24oKSBjb25zdDsKLSAgICBib29sIGlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3Q7Ci0gICAgYXVkaW9fc291cmNlX3QgZ2V0SGlnaGVzdFByaW9yaXR5U291cmNlKGJvb2wgYWN0aXZlT25seSkgY29uc3Q7Ci0KLSAgICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBBdWRpb1Nlc3Npb25JbmZvVXBkYXRlTGlzdGVuZXIKLSAgICB2aXJ0dWFsIHZvaWQgb25TZXNzaW9uSW5mb1VwZGF0ZSgpIGNvbnN0OwotCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0OwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDAzN2ZjLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgaW5wdXQgZGVzY3JpcHRvcnMgdG8gaW1wbGVtZW50IHNvIGRlcGVuZGVudCBhdWRpbyBzZXNzaW9ucyBjYW4gcXVlcnkgaW5mb3JtYXRpb24KLSAqIGFib3V0IHRoZWlyIGNvbnRleHQKLSAqLwotY2xhc3MgQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+QXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyKCkge307Ci0KLSAgICB2aXJ0dWFsIGF1ZGlvX2NvbmZpZ19iYXNlX3QgZ2V0Q29uZmlnKCkgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbCBhdWRpb19wYXRjaF9oYW5kbGVfdCBnZXRQYXRjaEhhbmRsZSgpIGNvbnN0ID0gMDsKLQotfTsKLQotY2xhc3MgQXVkaW9TZXNzaW9uSW5mb1VwZGF0ZUxpc3RlbmVyCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+QXVkaW9TZXNzaW9uSW5mb1VwZGF0ZUxpc3RlbmVyKCkge307Ci0KLSAgICB2aXJ0dWFsIHZvaWQgb25TZXNzaW9uSW5mb1VwZGF0ZSgpIGNvbnN0ID0gMDs7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkOTBmNDIuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU291cmNlRGVzY3JpcHRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8Um91dGluZ1N0cmF0ZWd5Lmg+Ci0jaW5jbHVkZSA8QXVkaW9QYXRjaC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOwotY2xhc3MgSHdBdWRpb091dHB1dERlc2NyaXB0b3I7Ci1jbGFzcyBEZXZpY2VEZXNjcmlwdG9yOwotCi1jbGFzcyBBdWRpb1NvdXJjZURlc2NyaXB0b3I6IHB1YmxpYyBSZWZCYXNlCi17Ci1wdWJsaWM6Ci0gICAgQXVkaW9Tb3VyY2VEZXNjcmlwdG9yKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSwgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpIDoKLSAgICAgICAgbURldmljZShkZXZpY2UpLCBtQXR0cmlidXRlcygqYXR0cmlidXRlcyksIG1VaWQodWlkKSB7fQotICAgIHZpcnR1YWwgfkF1ZGlvU291cmNlRGVzY3JpcHRvcigpIHt9Ci0KLSAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBnZXRIYW5kbGUoKSBjb25zdCB7IHJldHVybiBtUGF0Y2hEZXNjLT5tSGFuZGxlOyB9Ci0KLSAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCk7Ci0KLSAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtRGV2aWNlOwotICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBtQXR0cmlidXRlczsKLSAgICB1aWRfdCBtVWlkOwotICAgIHNwPEF1ZGlvUGF0Y2g+IG1QYXRjaERlc2M7Ci0gICAgd3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG1Td091dHB1dDsKLSAgICB3cDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbUh3T3V0cHV0OwotfTsKLQotY2xhc3MgQXVkaW9Tb3VyY2VDb2xsZWN0aW9uIDoKLSAgICAgICAgcHVibGljIERlZmF1bHRLZXllZFZlY3RvcjwgYXVkaW9fcGF0Y2hfaGFuZGxlX3QsIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gPgotewotcHVibGljOgotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9DbGllbnREZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQ2xpZW50RGVzY3JpcHRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExODcwMjkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQ2xpZW50RGVzY3JpcHRvci5oCkBAIC0wLDAgKzEsMjUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlICJBdWRpb1BhdGNoLmgiCisjaW5jbHVkZSAiRWZmZWN0RGVzY3JpcHRvci5oIgorI2luY2x1ZGUgIlJvdXRpbmdTdHJhdGVneS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIERldmljZURlc2NyaXB0b3I7CitjbGFzcyBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjsKK2NsYXNzIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOworCitjbGFzcyBDbGllbnREZXNjcmlwdG9yOiBwdWJsaWMgUmVmQmFzZQoreworcHVibGljOgorICAgIENsaWVudERlc2NyaXB0b3IoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsIHVpZF90IHVpZCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwcmVmZXJyZWREZXZpY2VJZCkgOgorICAgICAgICBtUG9ydElkKHBvcnRJZCksIG1VaWQodWlkKSwgbVNlc3Npb25JZChzZXNzaW9uSWQpLCBtQXR0cmlidXRlcyhhdHRyaWJ1dGVzKSwKKyAgICAgICAgbUNvbmZpZyhjb25maWcpLCBtUHJlZmVycmVkRGV2aWNlSWQocHJlZmVycmVkRGV2aWNlSWQpLCBtQWN0aXZlKGZhbHNlKSB7fQorICAgIH5DbGllbnREZXNjcmlwdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OworICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgdG9TaG9ydFN0cmluZygpIGNvbnN0OworCisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQoKSBjb25zdCB7IHJldHVybiBtUG9ydElkOyB9CisgICAgdWlkX3QgdWlkKCkgY29uc3QgeyByZXR1cm4gbVVpZDsgfQorICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbVNlc3Npb25JZDsgfTsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcygpIGNvbnN0IHsgcmV0dXJuIG1BdHRyaWJ1dGVzOyB9CisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcoKSBjb25zdCB7IHJldHVybiBtQ29uZmlnOyB9CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwcmVmZXJyZWREZXZpY2VJZCgpIGNvbnN0IHsgcmV0dXJuIG1QcmVmZXJyZWREZXZpY2VJZDsgfTsKKyAgICB2b2lkIHNldFByZWZlcnJlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcHJlZmVycmVkRGV2aWNlSWQpIHsKKyAgICAgICAgbVByZWZlcnJlZERldmljZUlkID0gcHJlZmVycmVkRGV2aWNlSWQ7CisgICAgfTsKKyAgICB2b2lkIHNldEFjdGl2ZShib29sIGFjdGl2ZSkgeyBtQWN0aXZlID0gYWN0aXZlOyB9CisgICAgYm9vbCBhY3RpdmUoKSBjb25zdCB7IHJldHVybiBtQWN0aXZlOyB9CisgICAgYm9vbCBoYXNQcmVmZXJyZWREZXZpY2UoYm9vbCBhY3RpdmVPbmx5ID0gZmFsc2UpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1QcmVmZXJyZWREZXZpY2VJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FICYmICghYWN0aXZlT25seSB8fCBtQWN0aXZlKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBtUG9ydElkOyAgLy8gdW5pcXVlIElkIGZvciB0aGlzIGNsaWVudAorICAgIGNvbnN0IHVpZF90IG1VaWQ7ICAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IFVJRAorICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBtU2Vzc2lvbklkOyAgICAgICAvLyBhdWRpbyBzZXNzaW9uIElECisgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IG1BdHRyaWJ1dGVzOyAvLyB1c2FnZS4uLgorICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgbUNvbmZpZzsKKyAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1QcmVmZXJyZWREZXZpY2VJZDsgIC8vIHNlbGVjdGVkIGlucHV0IGRldmljZSBwb3J0IElECisgICAgICAgICAgYm9vbCBtQWN0aXZlOworfTsKKworY2xhc3MgVHJhY2tDbGllbnREZXNjcmlwdG9yOiBwdWJsaWMgQ2xpZW50RGVzY3JpcHRvcgoreworcHVibGljOgorICAgIFRyYWNrQ2xpZW50RGVzY3JpcHRvcihhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwgdWlkX3QgdWlkLCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLCBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHByZWZlcnJlZERldmljZUlkLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpIDoKKyAgICAgICAgQ2xpZW50RGVzY3JpcHRvcihwb3J0SWQsIHVpZCwgc2Vzc2lvbklkLCBhdHRyaWJ1dGVzLCBjb25maWcsIHByZWZlcnJlZERldmljZUlkKSwKKyAgICAgICAgbVN0cmVhbShzdHJlYW0pLCBtU3RyYXRlZ3koc3RyYXRlZ3kpLCBtRmxhZ3MoZmxhZ3MpIHt9CisgICAgflRyYWNrQ2xpZW50RGVzY3JpcHRvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHVzaW5nIENsaWVudERlc2NyaXB0b3I6OmR1bXA7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdCBvdmVycmlkZTsKKyAgICBzdGQ6OnN0cmluZyB0b1Nob3J0U3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncygpIGNvbnN0IHsgcmV0dXJuIG1GbGFnczsgfQorICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbTsgfQorICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3koKSBjb25zdCB7IHJldHVybiBtU3RyYXRlZ3k7IH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW07CisgICAgY29uc3Qgcm91dGluZ19zdHJhdGVneSBtU3RyYXRlZ3k7CisgICAgY29uc3QgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgbUZsYWdzOworfTsKKworY2xhc3MgUmVjb3JkQ2xpZW50RGVzY3JpcHRvcjogcHVibGljIENsaWVudERlc2NyaXB0b3IKK3sKK3B1YmxpYzoKKyAgICBSZWNvcmRDbGllbnREZXNjcmlwdG9yKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLCB1aWRfdCB1aWQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHByZWZlcnJlZERldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLCBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLCBib29sIGlzU291bmRUcmlnZ2VyKSA6CisgICAgICAgIENsaWVudERlc2NyaXB0b3IocG9ydElkLCB1aWQsIHNlc3Npb25JZCwgYXR0cmlidXRlcywgY29uZmlnLCBwcmVmZXJyZWREZXZpY2VJZCksCisgICAgICAgIG1Tb3VyY2Uoc291cmNlKSwgbUZsYWdzKGZsYWdzKSwgbUlzU291bmRUcmlnZ2VyKGlzU291bmRUcmlnZ2VyKSwgbUFwcFN0YXRlKEFQUF9TVEFURV9JRExFKSB7fQorICAgIH5SZWNvcmRDbGllbnREZXNjcmlwdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdXNpbmcgQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKCkgY29uc3QgeyByZXR1cm4gbVNvdXJjZTsgfQorICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KKyAgICBib29sIGlzU291bmRUcmlnZ2VyKCkgY29uc3QgeyByZXR1cm4gbUlzU291bmRUcmlnZ2VyOyB9CisgICAgdm9pZCBzZXRBcHBTdGF0ZShhcHBfc3RhdGVfdCBhcHBTdGF0ZSkgeyBtQXBwU3RhdGUgPSBhcHBTdGF0ZTsgfQorICAgIGFwcF9zdGF0ZV90IGFwcFN0YXRlKCkgeyByZXR1cm4gbUFwcFN0YXRlOyB9CisgICAgYm9vbCBpc1NpbGVuY2VkKCkgY29uc3QgeyByZXR1cm4gbUFwcFN0YXRlID09IEFQUF9TVEFURV9JRExFOyB9CisgICAgdm9pZCB0cmFja0VmZmVjdEVuYWJsZWQoY29uc3Qgc3A8RWZmZWN0RGVzY3JpcHRvcj4gJmVmZmVjdCwgYm9vbCBlbmFibGVkKTsKKyAgICBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiBnZXRFbmFibGVkRWZmZWN0cygpIGNvbnN0IHsgcmV0dXJuIG1FbmFibGVkRWZmZWN0czsgfQorCitwcml2YXRlOgorICAgIGNvbnN0IGF1ZGlvX3NvdXJjZV90IG1Tb3VyY2U7CisgICAgY29uc3QgYXVkaW9faW5wdXRfZmxhZ3NfdCBtRmxhZ3M7CisgICAgY29uc3QgYm9vbCBtSXNTb3VuZFRyaWdnZXI7CisgICAgICAgICAgYXBwX3N0YXRlX3QgbUFwcFN0YXRlOworICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIG1FbmFibGVkRWZmZWN0czsKK307CisKK2NsYXNzIFNvdXJjZUNsaWVudERlc2NyaXB0b3I6IHB1YmxpYyBUcmFja0NsaWVudERlc2NyaXB0b3IKK3sKK3B1YmxpYzoKKyAgICBTb3VyY2VDbGllbnREZXNjcmlwdG9yKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLCB1aWRfdCB1aWQsIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9QYXRjaD4mIHBhdGNoRGVzYywgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIHNyY0RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KTsKKyAgICB+U291cmNlQ2xpZW50RGVzY3JpcHRvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYygpIGNvbnN0IHsgcmV0dXJuIG1QYXRjaERlc2M7IH0KKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzcmNEZXZpY2UoKSBjb25zdCB7IHJldHVybiBtU3JjRGV2aWNlOyB9OworICAgIHdwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzd091dHB1dCgpIGNvbnN0IHsgcmV0dXJuIG1Td091dHB1dDsgfQorICAgIHZvaWQgc2V0U3dPdXRwdXQoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBzd091dHB1dCk7CisgICAgd3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+IGh3T3V0cHV0KCkgY29uc3QgeyByZXR1cm4gbUh3T3V0cHV0OyB9CisgICAgdm9pZCBzZXRId091dHB1dChjb25zdCBzcDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIGh3T3V0cHV0KTsKKworICAgIHVzaW5nIENsaWVudERlc2NyaXB0b3I6OmR1bXA7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdCBvdmVycmlkZTsKKworIHByaXZhdGU6CisgICAgY29uc3Qgc3A8QXVkaW9QYXRjaD4gbVBhdGNoRGVzYzsKKyAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtU3JjRGV2aWNlOworICAgIHdwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtU3dPdXRwdXQ7CisgICAgd3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+IG1Id091dHB1dDsKK307CisKK2NsYXNzIFNvdXJjZUNsaWVudENvbGxlY3Rpb24gOgorICAgIHB1YmxpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8IGF1ZGlvX3BvcnRfaGFuZGxlX3QsIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+ID4KK3sKK3B1YmxpYzoKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKK307CisKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4gPiBUcmFja0NsaWVudFZlY3RvcjsKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+ID4gUmVjb3JkQ2xpZW50VmVjdG9yOworCisvLyBBIE1hcCB0aGF0IGFzc29jaWF0ZXMgYSBwb3J0SWQgd2l0aCBhIGNsaWVudCAodHlwZSBUKQorLy8gd2hpY2ggaXMgZWl0aGVyIFRyYWNrQ2xpZW50RGVzY3JpcHRvciBvciBSZWNvcmRDbGllbnREZXNjcmlwdG9yLgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQ2xpZW50TWFwSGFuZGxlciB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+Q2xpZW50TWFwSGFuZGxlcigpID0gZGVmYXVsdDsKKworICAgIC8vIFRyYWNrIGNsaWVudCBtYW5hZ2VtZW50CisgICAgdmlydHVhbCB2b2lkIGFkZENsaWVudChjb25zdCBzcDxUPiAmY2xpZW50KSB7CisgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gY2xpZW50LT5wb3J0SWQoKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRighbUNsaWVudHMuZW1wbGFjZShwb3J0SWQsIGNsaWVudCkuc2Vjb25kLAorICAgICAgICAgICAgICAgICIlcyglZCk6IGF0dGVtcHRpbmcgdG8gYWRkIGNsaWVudCB0aGF0IGFscmVhZHkgZXhpc3RzIiwgX19mdW5jX18sIHBvcnRJZCk7CisgICAgfQorICAgIHNwPFQ+IGdldENsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgY29uc3QgeworICAgICAgICBhdXRvIGl0ID0gbUNsaWVudHMuZmluZChwb3J0SWQpOworICAgICAgICBpZiAoaXQgPT0gbUNsaWVudHMuZW5kKCkpIHJldHVybiBudWxscHRyOworICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9CisgICAgdmlydHVhbCB2b2lkIHJlbW92ZUNsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgeworICAgICAgICBhdXRvIGl0ID0gbUNsaWVudHMuZmluZChwb3J0SWQpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGl0ID09IG1DbGllbnRzLmVuZCgpLAorICAgICAgICAgICAgICAgICIlcyglZCk6IGNsaWVudCBkb2VzIG5vdCBleGlzdCIsIF9fZnVuY19fLCBwb3J0SWQpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGl0LT5zZWNvbmQtPmFjdGl2ZSgpLAorICAgICAgICAgICAgICAgICIlcyglZCk6IHJlbW92aW5nIGNsaWVudCBzdGlsbCBhY3RpdmUhIiwgX19mdW5jX18sIHBvcnRJZCk7CisgICAgICAgICh2b2lkKW1DbGllbnRzLmVyYXNlKGl0KTsKKyAgICB9CisgICAgc2l6ZV90IGdldENsaWVudENvdW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNsaWVudHMuc2l6ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0IHsKKyAgICAgICAgc2l6ZV90IGluZGV4ID0gMDsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQ6IGdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgICAgIGNsaWVudC0+ZHVtcChkc3QsIDIsIGluZGV4KyspOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gaGVscGVyIHR5cGVzCisgICAgdXNpbmcgQ2xpZW50TWFwID0gc3RkOjptYXA8YXVkaW9fcG9ydF9oYW5kbGVfdCwgc3A8VD4+OworICAgIHVzaW5nIENsaWVudE1hcEl0ZXJhdG9yID0gdHlwZW5hbWUgQ2xpZW50TWFwOjpjb25zdF9pdGVyYXRvcjsgIC8vIENsaWVudE1hcCBpcyBjb25zdCBxdWFsaWZpZWQKKyAgICBjbGFzcyBDbGllbnRJdGVyYWJsZSB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBDbGllbnRJdGVyYWJsZShjb25zdCBDbGllbnRNYXBIYW5kbGVyPFQ+ICZyZWYpIDogbUNsaWVudE1hcEhhbmRsZXIocmVmKSB7IH0KKworICAgICAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIC8vIHRyYWl0cworICAgICAgICAgICAgdXNpbmcgaXRlcmF0b3JfY2F0ZWdvcnkgPSBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnOworICAgICAgICAgICAgdXNpbmcgdmFsdWVfdHlwZSA9IHNwPFQ+OworICAgICAgICAgICAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gcHRyZGlmZl90OworICAgICAgICAgICAgdXNpbmcgcG9pbnRlciA9IGNvbnN0IHNwPFQ+KjsgICAgLy8gTm90ZTogY29uc3QKKyAgICAgICAgICAgIHVzaW5nIHJlZmVyZW5jZSA9IGNvbnN0IHNwPFQ+JjsgIC8vIE5vdGU6IGNvbnN0CisKKyAgICAgICAgICAgIC8vIGltcGxlbWVudGF0aW9uCisgICAgICAgICAgICBleHBsaWNpdCBpdGVyYXRvcihjb25zdCBDbGllbnRNYXBJdGVyYXRvciAmaXQpIDogbUl0KGl0KSB7IH0KKyAgICAgICAgICAgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgICAgLyogcHJlZml4ICovICAgICB7ICsrbUl0OyByZXR1cm4gKnRoaXM7IH0KKyAgICAgICAgICAgIHJlZmVyZW5jZSBvcGVyYXRvciogKCkgY29uc3QgICAgICAgICAgICAgICB7IHJldHVybiBtSXQtPnNlY29uZDsgfQorICAgICAgICAgICAgcmVmZXJlbmNlIG9wZXJhdG9yLT4oKSBjb25zdCAgICAgICAgICAgICAgIHsgcmV0dXJuIG1JdC0+c2Vjb25kOyB9IC8vIGFzIGlmIHNwPD4KKyAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZSBvcGVyYXRvci0oY29uc3QgaXRlcmF0b3ImIHJocykge3JldHVybiBtSXQgLSByaHMubUl0OyB9CisgICAgICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIHJocykgY29uc3QgeyByZXR1cm4gbUl0ID09IHJocy5tSXQ7IH0KKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgcmhzKSBjb25zdCB7IHJldHVybiBtSXQgIT0gcmhzLm1JdDsgfQorICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgQ2xpZW50TWFwSXRlcmF0b3IgbUl0OworICAgICAgICB9OworCisgICAgICAgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3J7bUNsaWVudE1hcEhhbmRsZXIubUNsaWVudHMuYmVnaW4oKX07IH0KKyAgICAgICAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3J7bUNsaWVudE1hcEhhbmRsZXIubUNsaWVudHMuZW5kKCl9OyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCBDbGllbnRNYXBIYW5kbGVyPFQ+JiBtQ2xpZW50TWFwSGFuZGxlcjsgLy8gaXRlcmF0aW5nIGRvZXMgbm90IG1vZGlmeSBtYXAuCisgICAgfTsKKworICAgIC8vIHJldHVybiBhbiBpdGVyYWJsZSBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBpbiBhIHJhbmdlLWJhc2VkLWZvciB0byBlbnVtZXJhdGUgY2xpZW50cy4KKyAgICAvLyB0aGlzIGl0ZXJhYmxlIGRvZXMgbm90IGFsbG93IG1vZGlmaWNhdGlvbiwgaXQgc2hvdWxkIGJlIHVzZWQgYXMgYSB0ZW1wb3JhcnkuCisgICAgQ2xpZW50SXRlcmFibGUgZ2V0Q2xpZW50SXRlcmFibGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDbGllbnRJdGVyYWJsZXsqdGhpc307CisgICAgfQorCitwcml2YXRlOgorICAgIC8vIENsaWVudE1hcCBtYXBzIGEgcG9ydElkIHRvIGEgY2xpZW50IGRlc2NyaXB0b3IgKGJvdGggdW5pcXVlbHkgaWRlbnRpZnkgZWFjaCBvdGhlcikuCisgICAgQ2xpZW50TWFwIG1DbGllbnRzOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NvbmZpZ1BhcnNpbmdVdGlscy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NvbmZpZ1BhcnNpbmdVdGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDA3ODU0Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Db25maWdQYXJzaW5nVXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIkF1ZGlvUG9saWN5Q29uZmlnLmgiCi0jaW5jbHVkZSAiRGV2aWNlRGVzY3JpcHRvci5oIgotI2luY2x1ZGUgIkh3TW9kdWxlLmgiCi0jaW5jbHVkZSAiYXVkaW9fcG9saWN5X2NvbmYuaCIKLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBEZWZpbml0aW9ucyBmb3IgYXVkaW9fcG9saWN5LmNvbmYgZmlsZSBwYXJzaW5nCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIENvbmZpZ1BhcnNpbmdVdGlscwotewotcHVibGljOgotICAgIHN0YXRpYyBzdGF0dXNfdCBsb2FkQ29uZmlnKGNvbnN0IGNoYXIgKnBhdGgsIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpOwotCi1wcml2YXRlOgotICAgIHN0YXRpYyB2b2lkIGxvYWRBdWRpb1BvcnRHYWluKGNub2RlICpyb290LCBBdWRpb1BvcnQgJmF1ZGlvUG9ydCwgaW50IGluZGV4KTsKLSAgICBzdGF0aWMgdm9pZCBsb2FkQXVkaW9Qb3J0R2FpbnMoY25vZGUgKnJvb3QsIEF1ZGlvUG9ydCAmYXVkaW9Qb3J0KTsKLSAgICBzdGF0aWMgdm9pZCBsb2FkRGV2aWNlRGVzY3JpcHRvckdhaW5zKGNub2RlICpyb290LCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlRGVzYyk7Ci0gICAgc3RhdGljIHN0YXR1c190IGxvYWRId01vZHVsZURldmljZShjbm9kZSAqcm9vdCwgRGV2aWNlVmVjdG9yICZkZXZpY2VzKTsKLSAgICBzdGF0aWMgc3RhdHVzX3QgbG9hZEh3TW9kdWxlUHJvZmlsZShjbm9kZSAqcm9vdCwgc3A8SHdNb2R1bGU+ICZtb2R1bGUsIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUpOwotICAgIHN0YXRpYyB2b2lkIGxvYWREZXZpY2VzRnJvbVRhZyhjb25zdCBjaGFyICp0YWcsIERldmljZVZlY3RvciAmZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRlY2xhcmVkRGV2aWNlcyk7Ci0gICAgc3RhdGljIHZvaWQgbG9hZEh3TW9kdWxlcyhjbm9kZSAqcm9vdCwgSHdNb2R1bGVDb2xsZWN0aW9uICZod01vZHVsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKTsKLSAgICBzdGF0aWMgdm9pZCBsb2FkR2xvYmFsQ29uZmlnKGNub2RlICpyb290LCBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SHdNb2R1bGU+ICZwcmltYXJ5TW9kdWxlKTsKLSAgICBzdGF0aWMgdm9pZCBsb2FkTW9kdWxlR2xvYmFsQ29uZmlnKGNub2RlICpyb290LCBjb25zdCBzcDxId01vZHVsZT4gJm1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBsb2FkSHdNb2R1bGUoY25vZGUgKnJvb3QsIHNwPEh3TW9kdWxlPiAmbW9kdWxlLCBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRGV2aWNlRGVzY3JpcHRvci5oCmluZGV4IDkyYTRjM2UuLmQwMjEyM2MgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0RldmljZURlc2NyaXB0b3IuaApAQCAtMzEsMTIgKzMxLDE4IEBACiBwdWJsaWM6CiAgICAgIC8vIE5vdGUgdGhhdCBlbXB0eSBuYW1lIHJlZmVycyBieSBjb252ZW50aW9uIHRvIGEgZ2VuZXJpYyBkZXZpY2UuCiAgICAgZXhwbGljaXQgRGV2aWNlRGVzY3JpcHRvcihhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3QgU3RyaW5nOCAmdGFnTmFtZSA9IFN0cmluZzgoIiIpKTsKKyAgICBEZXZpY2VEZXNjcmlwdG9yKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBGb3JtYXRWZWN0b3IgJmVuY29kZWRGb3JtYXRzLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmdGFnTmFtZSA9IFN0cmluZzgoIiIpKTsKIAogICAgIHZpcnR1YWwgfkRldmljZURlc2NyaXB0b3IoKSB7fQogCiAgICAgdmlydHVhbCBjb25zdCBTdHJpbmc4IGdldFRhZ05hbWUoKSBjb25zdCB7IHJldHVybiBtVGFnTmFtZTsgfQogCiAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlVHlwZTsgfQorICAgIFN0cmluZzggYWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIG1BZGRyZXNzOyB9CisgICAgdm9pZCBzZXRBZGRyZXNzKGNvbnN0IFN0cmluZzggJmFkZHJlc3MpIHsgbUFkZHJlc3MgPSBhZGRyZXNzOyB9CisKKyAgICBjb25zdCBGb3JtYXRWZWN0b3ImIGVuY29kZWRGb3JtYXRzKCkgY29uc3QgeyByZXR1cm4gbUVuY29kZWRGb3JtYXRzOyB9CiAKICAgICBib29sIGVxdWFscyhjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgb3RoZXIpIGNvbnN0OwogCkBAIC01MSw0MCArNTcsMTE2IEBACiAgICAgdmlydHVhbCB2b2lkIGltcG9ydEF1ZGlvUG9ydChjb25zdCBzcDxBdWRpb1BvcnQ+JiBwb3J0LCBib29sIGZvcmNlID0gZmFsc2UpOwogCiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRJZCgpIGNvbnN0OwotICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCwgYm9vbCB2ZXJib3NlID0gdHJ1ZSkgY29uc3Q7CiAgICAgdm9pZCBsb2coKSBjb25zdDsKLQotICAgIFN0cmluZzggbUFkZHJlc3M7CisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKIAogcHJpdmF0ZToKKyAgICBTdHJpbmc4IG1BZGRyZXNzeyIifTsKICAgICBTdHJpbmc4IG1UYWdOYW1lOyAvLyBVbmlxdWUgaHVtYW4gcmVhZGFibGUgaWRlbnRpZmllciBmb3IgYSBkZXZpY2UgcG9ydCBmb3VuZCBpbiBjb25mIGZpbGUuCiAgICAgYXVkaW9fZGV2aWNlc190ICAgICBtRGV2aWNlVHlwZTsKLSAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1JZDsKLQotZnJpZW5kIGNsYXNzIERldmljZVZlY3RvcjsKKyAgICBGb3JtYXRWZWN0b3IgICAgICAgIG1FbmNvZGVkRm9ybWF0czsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1JZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiB9OwogCiBjbGFzcyBEZXZpY2VWZWN0b3IgOiBwdWJsaWMgU29ydGVkVmVjdG9yPHNwPERldmljZURlc2NyaXB0b3I+ID4KIHsKIHB1YmxpYzoKICAgICBEZXZpY2VWZWN0b3IoKSA6IFNvcnRlZFZlY3RvcigpLCBtRGV2aWNlVHlwZXMoQVVESU9fREVWSUNFX05PTkUpIHt9CisgICAgZXhwbGljaXQgRGV2aWNlVmVjdG9yKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKSA6IERldmljZVZlY3RvcigpCisgICAgeworICAgICAgICBhZGQoaXRlbSk7CisgICAgfQogCiAgICAgc3NpemVfdCBhZGQoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pOwogICAgIHZvaWQgYWRkKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcyk7CiAgICAgc3NpemVfdCByZW1vdmUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pOworICAgIHZvaWQgcmVtb3ZlKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcyk7CiAgICAgc3NpemVfdCBpbmRleE9mKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKSBjb25zdDsKIAogICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlcygpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VUeXBlczsgfQogCi0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0RGV2aWNlKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBTdHJpbmc4JiBhZGRyZXNzKSBjb25zdDsKLSAgICBEZXZpY2VWZWN0b3IgZ2V0RGV2aWNlc0Zyb21UeXBlKGF1ZGlvX2RldmljZXNfdCB0eXBlcykgY29uc3Q7CisgICAgLy8gSWYgJ2FkZHJlc3MnIGlzIGVtcHR5LCBhIGRldmljZSB3aXRoIGEgbm9uLWVtcHR5IGFkZHJlc3MgbWF5IGJlIHJldHVybmVkCisgICAgLy8gaWYgdGhlcmUgaXMgbm8gZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCAndHlwZScgYW5kIGVtcHR5IGFkZHJlc3MuCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0RGV2aWNlKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBTdHJpbmc4ICZhZGRyZXNzID0ge30pIGNvbnN0OworICAgIERldmljZVZlY3RvciBnZXREZXZpY2VzRnJvbVR5cGVNYXNrKGF1ZGlvX2RldmljZXNfdCB0eXBlcykgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZ2V0RGV2aWNlRnJvbUlkCisgICAgICogQHBhcmFtIGlkIG9mIHRoZSBEZXZpY2VEZXNjcmlwdG9yIHRvIHNlYWNoIChha2EgUG9ydCBoYW5kbGUpLgorICAgICAqIEByZXR1cm4gRGV2aWNlRGVzY3JpcHRvciBhc3NvY2lhdGVkIHRvIHBvcnQgaWQgaWYgZm91bmQsIG51bGxwdHIgb3RoZXJ3aXNlLiBJZiB0aGUgaWQgaXMKKyAgICAgKiBlcXVhbCB0byBBVURJT19QT1JUX0hBTkRMRV9OT05FLCBpdCBhbHNvIHJldHVybnMgYSBudWxscHRyLgorICAgICAqLwogICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZUZyb21JZChhdWRpb19wb3J0X2hhbmRsZV90IGlkKSBjb25zdDsKICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2VGcm9tVGFnTmFtZShjb25zdCBTdHJpbmc4ICZ0YWdOYW1lKSBjb25zdDsKLSAgICBEZXZpY2VWZWN0b3IgZ2V0RGV2aWNlc0Zyb21UeXBlQWRkcihhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3QgU3RyaW5nOCYgYWRkcmVzcykgY29uc3Q7CisgICAgRGV2aWNlVmVjdG9yIGdldERldmljZXNGcm9tSHdNb2R1bGUoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZUhhbmRsZSkgY29uc3Q7CisgICAgYXVkaW9fZGV2aWNlc190IGdldERldmljZVR5cGVzRnJvbUh3TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGVIYW5kbGUpIGNvbnN0OwogCi0gICAgYXVkaW9fZGV2aWNlc190IGdldERldmljZXNGcm9tSHdNb2R1bGUoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZUhhbmRsZSkgY29uc3Q7CisgICAgYm9vbCBjb250YWlucyhjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSkgY29uc3QgeyByZXR1cm4gaW5kZXhPZihpdGVtKSA+PSAwOyB9CiAKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgU3RyaW5nOCAmdGFnLCBpbnQgc3BhY2VzID0gMCwgYm9vbCB2ZXJib3NlID0gdHJ1ZSkgY29uc3Q7CisgICAgLyoqCisgICAgICogQGJyaWVmIGNvbnRhaW5zQXRMZWFzdE9uZQorICAgICAqIEBwYXJhbSBkZXZpY2VzIHZlY3RvciBvZiBkZXZpY2VzIHRvIGNoZWNrIGFnYWluc3QuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBEZXZpY2VWZWN0b3IgY29udGFpbnMgYXQgbGlzdCBvbmUgb2YgdGhlIGRldmljZXMgZnJvbSB0aGUgZ2l2ZW4gdmVjdG9yLgorICAgICAqLworICAgIGJvb2wgY29udGFpbnNBdExlYXN0T25lKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgY29udGFpbnNBbGxEZXZpY2VzCisgICAgICogQHBhcmFtIGRldmljZXMgdmVjdG9yIG9mIGRldmljZXMgdG8gY2hlY2sgYWdhaW5zdC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIERldmljZVZlY3RvciBjb250YWlucyBhbGwgdGhlIGRldmljZXMgZnJvbSB0aGUgZ2l2ZW4gdmVjdG9yCisgICAgICovCisgICAgYm9vbCBjb250YWluc0FsbERldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBmaWx0ZXIgdGhlIGRldmljZXMgc3VwcG9ydGVkIGJ5IHRoaXMgY29sbGVjdGlvbiBhZ2FpbnN0IGFub3RoZXIgY29sbGVjdGlvbgorICAgICAqIEBwYXJhbSBkZXZpY2VzIHRvIGZpbHRlciBhZ2FpbnN0CisgICAgICogQHJldHVybgorICAgICAqLworICAgIERldmljZVZlY3RvciBmaWx0ZXIoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBtZXJnZSB0d28gdmVjdG9ycy4gQXMgU29ydGVkVmVjdG9yIEltcGxlbWVudGF0aW9uIGlzIGJ1Z2d5IChpdCBkb2VzIG5vdCBjaGVjayB0aGUgc2l6ZQorICAgICAqIG9mIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3IsIG9ubHkgb2YgdGhlIHNvdXJjZSwgaXQgcHJvdmlkZXMgYSBzYWZlIGltcGxlbWVudGF0aW9uCisgICAgICogQHBhcmFtIGRldmljZXMgc291cmNlIGRldmljZSB2ZWN0b3IgdG8gbWVyZ2Ugd2l0aAorICAgICAqIEByZXR1cm4gc2l6ZSBvZiB0aGUgbWVyZ2VkIHZlY3Rvci4KKyAgICAgKi8KKyAgICBzc2l6ZV90IG1lcmdlKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykKKyAgICB7CisgICAgICAgIGlmIChpc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGFkZChkZXZpY2VzKTsKKyAgICAgICAgICAgIHJldHVybiBzaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFNvcnRlZFZlY3Rvcjo6bWVyZ2UoZGV2aWNlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGJyaWVmIG9wZXJhdG9yID09IERldmljZVZlY3RvciBhcmUgZXF1YWxzIGlmIGFsbCB0aGUgRGV2aWNlRGVzY3JpcHRvciBjYW4gYmUgZm91bmQgKGFrYQorICAgICAqIERldmljZURlc2NyaXB0b3Igd2l0aCBzYW1lIHR5cGUgYW5kIGFkZHJlc3MpIGFuZCB0aGUgdmVjdG9yIGhhcyBzYW1lIHNpemUuCisgICAgICogQHBhcmFtIHJpZ2h0IERldmljZVZlY3RvciB0byBjb21wYXJlIHRvLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiByaWdodCBjb250YWlucyB0aGUgc2FtZSBkZXZpY2UgYW5kIGhhcyB0aGUgc2FtZSBzaXplLgorICAgICAqLworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBEZXZpY2VWZWN0b3IgJnJpZ2h0KSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKHNpemUoKSAhPSByaWdodC5zaXplKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmRldmljZSA6ICp0aGlzKSB7CisgICAgICAgICAgICBpZiAocmlnaHQuaW5kZXhPZihkZXZpY2UpIDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgRGV2aWNlVmVjdG9yICZyaWdodCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAhb3BlcmF0b3I9PShyaWdodCk7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGNvbnN0IFN0cmluZzggJnRhZywgaW50IHNwYWNlcyA9IDAsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OwogCiBwcml2YXRlOgogICAgIHZvaWQgcmVmcmVzaFR5cGVzKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRWZmZWN0RGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0VmZmVjdERlc2NyaXB0b3IuaAppbmRleCAwNDgzMWM2Li4yZGMzM2FiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRWZmZWN0RGVzY3JpcHRvci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9FZmZlY3REZXNjcmlwdG9yLmgKQEAgLTIxLDE1ICsyMSwxNiBAQAogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi0KIGNsYXNzIEVmZmVjdERlc2NyaXB0b3IgOiBwdWJsaWMgUmVmQmFzZQogewogcHVibGljOgotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzID0gMCkgY29uc3Q7CiAKKyAgICBpbnQgbUlkOyAgICAgICAgICAgICAgICAvLyBlZmZlY3QgdW5pcXVlIElECiAgICAgaW50IG1JbzsgICAgICAgICAgICAgICAgLy8gaW8gdGhlIGVmZmVjdCBpcyBhdHRhY2hlZCB0bwogICAgIHJvdXRpbmdfc3RyYXRlZ3kgbVN0cmF0ZWd5OyAvLyByb3V0aW5nIHN0cmF0ZWd5IHRoZSBlZmZlY3QgaXMgYXNzb2NpYXRlZCB0bwogICAgIGludCBtU2Vzc2lvbjsgICAgICAgICAgICAgICAvLyBhdWRpbyBzZXNzaW9uIHRoZSBlZmZlY3QgaXMgb24KQEAgLTQ1LDEyICs0NiwxNCBAQAogICAgIHN0YXR1c190IHJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LCBpbnQgc2Vzc2lvbiwgaW50IGlkKTsKICAgICBzdGF0dXNfdCB1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCk7CisgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZ2V0RWZmZWN0KGludCBpZCkgY29uc3Q7CiAgICAgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCk7CisgICAgYm9vbCAgICAgaXNFZmZlY3RFbmFibGVkKGludCBpZCkgY29uc3Q7CiAgICAgdWludDMyX3QgZ2V0TWF4RWZmZWN0c0NwdUxvYWQoKSBjb25zdDsKICAgICB1aW50MzJfdCBnZXRNYXhFZmZlY3RzTWVtb3J5KCkgY29uc3Q7Ci0gICAgYm9vbCBpc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpOworICAgIGJvb2wgaXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKSBjb25zdDsKIAotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzID0gMCwgYm9vbCB2ZXJib3NlID0gdHJ1ZSkgY29uc3Q7CiAKIHByaXZhdGU6CiAgICAgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChjb25zdCBzcDxFZmZlY3REZXNjcmlwdG9yPiAmZWZmZWN0RGVzYywgYm9vbCBlbmFibGVkKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9HYWlucy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0dhaW5zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMjI5YTQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0dhaW5zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxTdHJlYW1EZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgU3RyZWFtRGVzY3JpcHRvcjsKLQotY2xhc3MgR2FpbnMKLXsKLXB1YmxpYyA6Ci0gICAgc3RhdGljIGZsb2F0IHZvbEluZGV4VG9EYihjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpwb2ludCwgaW50IGluZGV4TWluLCBpbnQgaW5kZXhNYXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhJblVpKTsKLQotICAgIC8vIGRlZmF1bHQgdm9sdW1lIGN1cnZlCi0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07Ci0gICAgLy8gZGVmYXVsdCB2b2x1bWUgY3VydmUgZm9yIG1lZGlhIHN0cmF0ZWd5Ci0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICAvLyB2b2x1bWUgY3VydmUgZm9yIG5vbi1tZWRpYSBhdWRpbyBvbiBleHQgbWVkaWEgb3V0cHV0cyAoSERNSSwgTGluZSwgZXRjKQotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICAvLyB2b2x1bWUgY3VydmUgZm9yIG1lZGlhIHN0cmF0ZWd5IG9uIHNwZWFrZXJzCi0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVEcmNbVm9sdW1lOjpWT0xDTlRdOwotICAgIC8vIHZvbHVtZSBjdXJ2ZSBmb3Igc29uaWZpY2F0aW9uIHN0cmF0ZWd5IG9uIHNwZWFrZXJzCi0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07Ci0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyY1tWb2x1bWU6OlZPTENOVF07Ci0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07Ci0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZURyY1tWb2x1bWU6OlZPTENOVF07Ci0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0hlYWRzZXRTeXN0ZW1Wb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07Ci0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNMaW5lYXJWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07Ci0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NpbGVudFZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRnVsbFNjYWxlVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNIZWFyaW5nQWlkVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIC8vIGRlZmF1bHQgdm9sdW1lIGN1cnZlcyBwZXIgc3RyZWFtIGFuZCBkZXZpY2UgY2F0ZWdvcnkuIFNlZSBpbml0aWFsaXplVm9sdW1lQ3VydmVzKCkKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqc1ZvbHVtZVByb2ZpbGVzW0FVRElPX1NUUkVBTV9DTlRdW0RFVklDRV9DQVRFR09SWV9DTlRdOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0h3TW9kdWxlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSHdNb2R1bGUuaAppbmRleCBjYjlmNDllLi4yYjU3ZmE5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSHdNb2R1bGUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSHdNb2R1bGUuaApAQCAtODEsOCArODEsMTkgQEAKICAgICAgICAgcmV0dXJuIG1Qb3J0cy5maW5kQnlUYWdOYW1lKHRhZ05hbWUpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEBicmllZiBzdXBwb3J0c1BhdGNoIGNoZWNrcyBpZiBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIDIgcG9ydHMgYmVsb2dpbmcgdG8gdGhpcyBId01vZHVsZQorICAgICAqIGlzIHN1cHBvcnRlZCBieSBhIEh3TW9kdWxlLiBUaGUgcG9ydHMgYW5kIHRoZSByb3V0ZSBzaGFsbCBiZSBkZWNsYXJlZCBpbiB0aGUKKyAgICAgKiBhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgZmlsZS4KKyAgICAgKiBAcGFyYW0gc3JjUG9ydCAoYWthIHRoZSBzb3VyY2UpIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcGFyYW0gZHN0UG9ydCAoYWthIHRoZSBzaW5rKSB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBId01vZHVsZSBzdXBwb3J0cyB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSBzaW5rIGFuZCB0aGUgc291cmNlLAorICAgICAqIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIGJvb2wgc3VwcG9ydHNQYXRjaChjb25zdCBzcDxBdWRpb1BvcnQ+ICZzcmNQb3J0LCBjb25zdCBzcDxBdWRpb1BvcnQ+ICZkc3RQb3J0KSBjb25zdDsKKwogICAgIC8vIFRPRE8gcmVtb3ZlIGZyb20gaGVyZSAoc3BsaXQgc2VyaWFsaXphdGlvbikKLSAgICB2b2lkIGR1bXAoaW50IGZkKTsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKIAogcHJpdmF0ZToKICAgICB2b2lkIHJlZnJlc2hTdXBwb3J0ZWREZXZpY2VzKCk7CkBAIC0xMDcsOSArMTE4LDkgQEAKICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2VEZXNjcmlwdG9yKGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtYXRjaEFkcmVzcyA9IHRydWUpIGNvbnN0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtYXRjaEFkZHJlc3MgPSB0cnVlKSBjb25zdDsKIAotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JT1Byb2ZpbGUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JT1Byb2ZpbGUuaAppbmRleCA2N2FjOWJjLi5jYTZjYTU2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSU9Qcm9maWxlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lPUHJvZmlsZS5oCkBAIC0zNSw3ICszNSw3IEBACiBwdWJsaWM6CiAgICAgSU9Qcm9maWxlKGNvbnN0IFN0cmluZzggJm5hbWUsIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUpCiAgICAgICAgIDogQXVkaW9Qb3J0KG5hbWUsIEFVRElPX1BPUlRfVFlQRV9NSVgsIHJvbGUpLAotICAgICAgICAgIG1heE9wZW5Db3VudCgocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSA/IDEgOiAwKSwKKyAgICAgICAgICBtYXhPcGVuQ291bnQoMSksCiAgICAgICAgICAgY3VyT3BlbkNvdW50KDApLAogICAgICAgICAgIG1heEFjdGl2ZUNvdW50KDEpLAogICAgICAgICAgIGN1ckFjdGl2ZUNvdW50KDApIHt9CkBAIC03Myw3ICs3Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGV4YWN0TWF0Y2hSZXF1aXJlZEZvcklucHV0RmxhZ3MgPSBmYWxzZSkgY29uc3Q7CiAKLSAgICB2b2lkIGR1bXAoaW50IGZkKTsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKICAgICB2b2lkIGxvZygpOwogCiAgICAgYm9vbCBoYXNTdXBwb3J0ZWREZXZpY2VzKCkgY29uc3QgeyByZXR1cm4gIW1TdXBwb3J0ZWREZXZpY2VzLmlzRW1wdHkoKTsgfQpAQCAtODgsNyArODgsNyBAQAogCiAgICAgYm9vbCBzdXBwb3J0RGV2aWNlQWRkcmVzcyhjb25zdCBTdHJpbmc4ICZhZGRyZXNzKSBjb25zdAogICAgIHsKLSAgICAgICAgcmV0dXJuIG1TdXBwb3J0ZWREZXZpY2VzWzBdLT5tQWRkcmVzcyA9PSBhZGRyZXNzOworICAgICAgICByZXR1cm4gbVN1cHBvcnRlZERldmljZXNbMF0tPmFkZHJlc3MoKSA9PSBhZGRyZXNzOwogICAgIH0KIAogICAgIC8vIGNob3NlIGZpcnN0IGRldmljZSBwcmVzZW50IGluIG1TdXBwb3J0ZWREZXZpY2VzIGFsc28gcGFydCBvZiBkZXZpY2VUeXBlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24uaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JVm9sdW1lQ3VydmVzQ29sbGVjdGlvbi5oCmluZGV4IGUxZjZiMDguLjc1MGRhNTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JVm9sdW1lQ3VydmVzQ29sbGVjdGlvbi5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JVm9sdW1lQ3VydmVzQ29sbGVjdGlvbi5oCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8Vm9sdW1lLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQ3LDcgKzQ4LDcgQEAKICAgICB2aXJ0dWFsIGJvb2wgaGFzVm9sdW1lSW5kZXhGb3JEZXZpY2UoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0ID0gMDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TZXJpYWxpemVyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2VyaWFsaXplci5oCmluZGV4IDI5ZGU4NDguLjQ4YzQxNDcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TZXJpYWxpemVyLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1NlcmlhbGl6ZXIuaApAQCAtMTcsMjIzICsxNyw5IEBACiAjcHJhZ21hIG9uY2UKIAogI2luY2x1ZGUgIkF1ZGlvUG9saWN5Q29uZmlnLmgiCi0jaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxmc3RyZWFtPgotCi1zdHJ1Y3QgX3htbE5vZGU7Ci1zdHJ1Y3QgX3htbERvYzsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgQXVkaW9HYWluVHJhaXRzCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRhZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY29sbGVjdGlvblRhZzsKLQotICAgIHN0cnVjdCBBdHRyaWJ1dGVzCi0gICAgewotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBtb2RlW107IC8qKjwgZ2FpbiBtb2RlcyBzdXBwb3J0ZWQsIGUuZy4gQVVESU9fR0FJTl9NT0RFX0NIQU5ORUxTLiAqLwotICAgICAgICAvKiogY29udHJvbGxlZCBjaGFubmVscywgbmVlZGVkIGlmIG1vZGUgQVVESU9fR0FJTl9NT0RFX0NIQU5ORUxTLiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBjaGFubmVsTWFza1tdOwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBtaW5WYWx1ZU1CW107IC8qKjwgbWluIHZhbHVlIGluIG1pbGxpYmVsLiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBtYXhWYWx1ZU1CW107IC8qKjwgbWF4IHZhbHVlIGluIG1pbGxpYmVsLiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBkZWZhdWx0VmFsdWVNQltdOyAvKio8IGRlZmF1bHQgdmFsdWUgaW4gbWlsbGliZWwuICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHN0ZXBWYWx1ZU1CW107IC8qKjwgc3RlcCB2YWx1ZSBpbiBtaWxsaWJlbC4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbWluUmFtcE1zW107IC8qKjwgbmVlZGVkIGlmIG1vZGUgQVVESU9fR0FJTl9NT0RFX1JBTVAuICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG1heFJhbXBNc1tdOyAvKio8IC5uZWVkZWQgaWYgbW9kZSBBVURJT19HQUlOX01PREVfUkFNUCAqLwotICAgIH07Ci0KLSAgICB0eXBlZGVmIEF1ZGlvR2FpbiBFbGVtZW50OwotICAgIHR5cGVkZWYgc3A8RWxlbWVudD4gUHRyRWxlbWVudDsKLSAgICB0eXBlZGVmIEF1ZGlvR2FpbkNvbGxlY3Rpb24gQ29sbGVjdGlvbjsKLSAgICB0eXBlZGVmIHZvaWQgKlB0clNlcmlhbGl6aW5nQ3R4OwotCi0gICAgc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7Ci0KLSAgICAvLyBHYWluIGhhcyBubyBjaGlsZAotfTsKLQotLy8gQSBwcm9maWxlIHNlY3Rpb24gY29udGFpbnMgYSBuYW1lLCAgb25lIGF1ZGlvIGZvcm1hdCBhbmQgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGVzCi0vLyBhbmQgY2hhbm5lbCBtYXNrcyBmb3IgdGhpcyBmb3JtYXQKLXN0cnVjdCBBdWRpb1Byb2ZpbGVUcmFpdHMKLXsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGFnOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjb2xsZWN0aW9uVGFnOwotCi0gICAgc3RydWN0IEF0dHJpYnV0ZXMKLSAgICB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG5hbWVbXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgc2FtcGxpbmdSYXRlc1tdOwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBmb3JtYXRbXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgY2hhbm5lbE1hc2tzW107Ci0gICAgfTsKLQotICAgIHR5cGVkZWYgQXVkaW9Qcm9maWxlIEVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBzcDxBdWRpb1Byb2ZpbGU+IFB0ckVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBBdWRpb1Byb2ZpbGVWZWN0b3IgQ29sbGVjdGlvbjsKLSAgICB0eXBlZGVmIHZvaWQgKlB0clNlcmlhbGl6aW5nQ3R4OwotCi0gICAgc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7Ci19OwotCi1zdHJ1Y3QgTWl4UG9ydFRyYWl0cwotewotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0YWc7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbGxlY3Rpb25UYWc7Ci0KLSAgICBzdHJ1Y3QgQXR0cmlidXRlcwotICAgIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbmFtZVtdOwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciByb2xlW107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGZsYWdzW107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG1heE9wZW5Db3VudFtdOwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBtYXhBY3RpdmVDb3VudFtdOwotICAgIH07Ci0KLSAgICB0eXBlZGVmIElPUHJvZmlsZSBFbGVtZW50OwotICAgIHR5cGVkZWYgc3A8RWxlbWVudD4gUHRyRWxlbWVudDsKLSAgICB0eXBlZGVmIElPUHJvZmlsZUNvbGxlY3Rpb24gQ29sbGVjdGlvbjsKLSAgICB0eXBlZGVmIHZvaWQgKlB0clNlcmlhbGl6aW5nQ3R4OwotCi0gICAgc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7Ci0KLSAgICAvLyBDaGlsZHJlbiBhcmU6IEdhaW5UcmFpdHMKLX07Ci0KLXN0cnVjdCBEZXZpY2VQb3J0VHJhaXRzCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRhZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY29sbGVjdGlvblRhZzsKLQotICAgIHN0cnVjdCBBdHRyaWJ1dGVzCi0gICAgewotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciB0YWdOYW1lW107IC8qKjwgIDxkZXZpY2UgdGFnIG5hbWU+OiBhbnkgc3RyaW5nIHdpdGhvdXQgc3BhY2UuICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHR5cGVbXTsgLyoqPCA8ZGV2aWNlIHR5cGU+LiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciByb2xlW107IC8qKjwgPGRldmljZSByb2xlOiBzaW5rIG9yIHNvdXJjZT4uICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHJvbGVTb3VyY2VbXTsgLyoqPCA8YXR0cmlidXRlIHJvbGUgc291cmNlIHZhbHVlPi4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgYWRkcmVzc1tdOyAvKio8IG9wdGlvbmFsOiBkZXZpY2UgYWRkcmVzcywgY2hhciBzdHJpbmcgbGVzcyB0aGFuIDY0LiAqLwotICAgIH07Ci0gICAgdHlwZWRlZiBEZXZpY2VEZXNjcmlwdG9yIEVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBzcDxEZXZpY2VEZXNjcmlwdG9yPiBQdHJFbGVtZW50OwotICAgIHR5cGVkZWYgRGV2aWNlVmVjdG9yIENvbGxlY3Rpb247Ci0gICAgdHlwZWRlZiB2b2lkICpQdHJTZXJpYWxpemluZ0N0eDsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOwotICAgIC8vIENoaWxkcmVuIGFyZTogR2FpblRyYWl0cyAob3B0aW9ubmFsKQotfTsKLQotc3RydWN0IFJvdXRlVHJhaXRzCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRhZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY29sbGVjdGlvblRhZzsKLQotICAgIHN0cnVjdCBBdHRyaWJ1dGVzCi0gICAgewotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciB0eXBlW107IC8qKjwgPHJvdXRlIHR5cGU+OiBtaXggb3IgbXV4LiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciB0eXBlTWl4W107IC8qKjwgdHlwZSBhdHRyaWJ1dGUgbWl4IHZhbHVlLiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBzaW5rW107IC8qKjwgPHNpbms6IGludm9sdmVkIGluIHRoaXMgcm91dGU+LiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBzb3VyY2VzW107IC8qKjwgc291cmNlczogYWxsIHNvdXJjZSB0aGF0IGNhbiBiZSBpbnZvbHZlZCBpbiB0aGlzIHJvdXRlLiAqLwotICAgIH07Ci0gICAgdHlwZWRlZiBBdWRpb1JvdXRlIEVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBzcDxBdWRpb1JvdXRlPiBQdHJFbGVtZW50OwotICAgIHR5cGVkZWYgQXVkaW9Sb3V0ZVZlY3RvciBDb2xsZWN0aW9uOwotICAgIHR5cGVkZWYgSHdNb2R1bGUgKlB0clNlcmlhbGl6aW5nQ3R4OwotCi0gICAgc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IGN0eCk7Ci19OwotCi1zdHJ1Y3QgTW9kdWxlVHJhaXRzCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRhZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY29sbGVjdGlvblRhZzsKLQotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjaGlsZEF0dGFjaGVkRGV2aWNlc1RhZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY2hpbGRBdHRhY2hlZERldmljZVRhZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY2hpbGREZWZhdWx0T3V0cHV0RGV2aWNlVGFnOwotCi0gICAgc3RydWN0IEF0dHJpYnV0ZXMKLSAgICB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG5hbWVbXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbltdOwotICAgIH07Ci0KLSAgICB0eXBlZGVmIEh3TW9kdWxlIEVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBzcDxFbGVtZW50PiBQdHJFbGVtZW50OwotICAgIHR5cGVkZWYgSHdNb2R1bGVDb2xsZWN0aW9uIENvbGxlY3Rpb247Ci0gICAgdHlwZWRlZiBBdWRpb1BvbGljeUNvbmZpZyAqUHRyU2VyaWFsaXppbmdDdHg7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKLQotICAgIC8vIENoaWxkcmVuIGFyZTogbWl4UG9ydFRyYWl0cywgZGV2aWNlUG9ydFRyYWl0cyBhbmQgcm91dGVUcmFpdHMKLSAgICAvLyBOZWVkIHRvIGNhbGwgZGVzZXJpYWxpemUgb24gZWFjaCBjaGlsZAotfTsKLQotc3RydWN0IEdsb2JhbENvbmZpZ1RyYWl0cwotewotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0YWc7Ci0KLSAgICBzdHJ1Y3QgQXR0cmlidXRlcwotICAgIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgc3BlYWtlckRyY0VuYWJsZWRbXTsKLSAgICB9OwotCi0gICAgc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplKGNvbnN0IF94bWxOb2RlICpyb290LCBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKTsKLX07Ci0KLXN0cnVjdCBWb2x1bWVUcmFpdHMKLXsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGFnOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjb2xsZWN0aW9uVGFnOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2b2x1bWVQb2ludFRhZzsKLQotICAgIHN0cnVjdCBBdHRyaWJ1dGVzCi0gICAgewotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBzdHJlYW1bXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgZGV2aWNlQ2F0ZWdvcnlbXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgcmVmZXJlbmNlW107Ci0gICAgfTsKLQotICAgIHR5cGVkZWYgVm9sdW1lQ3VydmUgRWxlbWVudDsKLSAgICB0eXBlZGVmIHNwPFZvbHVtZUN1cnZlPiBQdHJFbGVtZW50OwotICAgIHR5cGVkZWYgVm9sdW1lQ3VydmVzQ29sbGVjdGlvbiBDb2xsZWN0aW9uOwotICAgIHR5cGVkZWYgdm9pZCAqUHRyU2VyaWFsaXppbmdDdHg7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKLQotICAgIC8vIE5vIENoaWxkCi19OwotCi1jbGFzcyBQb2xpY3lTZXJpYWxpemVyCi17Ci1wcml2YXRlOgotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCByb290TmFtZTsKLQotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2ZXJzaW9uQXR0cmlidXRlOwotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBnTWFqb3I7IC8qKjwgdGhlIG1ham9yIG51bWJlciBvZiB0aGUgcG9saWN5IHhtbCBmb3JtYXQgdmVyc2lvbi4gKi8KLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgZ01pbm9yOyAvKio8IHRoZSBtaW5vciBudW1iZXIgb2YgdGhlIHBvbGljeSB4bWwgZm9ybWF0IHZlcnNpb24uICovCi0KLXB1YmxpYzoKLSAgICBQb2xpY3lTZXJpYWxpemVyKCk7Ci0gICAgc3RhdHVzX3QgZGVzZXJpYWxpemUoY29uc3QgY2hhciAqc3RyLCBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKTsKLQotcHJpdmF0ZToKLSAgICB0eXBlZGVmIEF1ZGlvUG9saWN5Q29uZmlnIEVsZW1lbnQ7Ci0KLSAgICBzdGQ6OnN0cmluZyBtUm9vdEVsZW1lbnROYW1lOwotICAgIHN0ZDo6c3RyaW5nIG1WZXJzaW9uOwotCi0gICAgLy8gQ2hpbGRyZW4gYXJlOiBNb2R1bGVzVHJhaXRzLCBWb2x1bWVUcmFpdHMKLX07CitzdGF0dXNfdCBkZXNlcmlhbGl6ZUF1ZGlvUG9saWN5RmlsZShjb25zdCBjaGFyICpmaWxlTmFtZSwgQXVkaW9Qb2xpY3lDb25maWcgKmNvbmZpZyk7CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TZXNzaW9uUm91dGUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TZXNzaW9uUm91dGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJiNDQ0MC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2Vzc2lvblJvdXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGV2aWNlRGVzY3JpcHRvcjsKLWNsYXNzIERldmljZVZlY3RvcjsKLQotY2xhc3MgU2Vzc2lvblJvdXRlIDogcHVibGljIFJlZkJhc2UKLXsKLXB1YmxpYzoKLSAgICAvLyBGb3IgSW5wdXQgKFNvdXJjZSkgcm91dGVzLCB1c2UgU1RSRUFNX1RZUEVfTkEgKCJOQSIgPSAibm90IGFwcGxpY2FibGUpZm9yIHRoZQotICAgIC8vIHN0cmVhbVR5cGUgYXJndW1lbnQKLSAgICBzdGF0aWMgY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCBTVFJFQU1fVFlQRV9OQSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOwotCi0gICAgLy8gRm9yIE91dHB1dCAoU2luaykgcm91dGVzLCB1c2UgU09VUkNFX1RZUEVfTkEgKCJOQSIgPSAibm90IGFwcGxpY2FibGUiKSBmb3IgdGhlCi0gICAgLy8gc291cmNlIGFyZ3VtZW50Ci0KLSAgICBzdGF0aWMgY29uc3QgYXVkaW9fc291cmNlX3QgU09VUkNFX1RZUEVfTkEgPSBBVURJT19TT1VSQ0VfREVGQVVMVDsKLQotICAgIFNlc3Npb25Sb3V0ZShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgIHVpZF90IHVpZCkKLSAgICAgICAgOiBtVWlkKHVpZCksCi0gICAgICAgICAgbVNlc3Npb24oc2Vzc2lvbiksCi0gICAgICAgICAgbURldmljZURlc2NyaXB0b3IoZGV2aWNlRGVzY3JpcHRvciksCi0gICAgICAgICAgbVJlZkNvdW50KDApLAotICAgICAgICAgIG1BY3Rpdml0eUNvdW50KDApLAotICAgICAgICAgIG1DaGFuZ2VkKGZhbHNlKSwKLSAgICAgICAgICBtU3RyZWFtVHlwZShzdHJlYW1UeXBlKSwKLSAgICAgICAgICBtU291cmNlKHNvdXJjZSkKLSAgICB7fQotCi0gICAgdm9pZCBsb2coY29uc3QgY2hhciogcHJlZml4KTsKLQotICAgIGJvb2wgaXNBY3RpdmVPckNoYW5nZWQoKSB7Ci0gICAgICAgIHJldHVybiAobURldmljZURlc2NyaXB0b3IgIT0gMCkgJiYgKG1DaGFuZ2VkIHx8IChtQWN0aXZpdHlDb3VudCA+IDApKTsKLSAgICB9Ci0KLSAgICB1aWRfdCAgICAgICAgICAgICAgICAgICAgICAgbVVpZDsKLSAgICBhdWRpb19zZXNzaW9uX3QgICAgICAgICAgICAgbVNlc3Npb247Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gICAgICAgIG1EZXZpY2VEZXNjcmlwdG9yOwotCi0gICAgLy8gInJlZmVyZW5jZSIgY291bnRpbmcKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbVJlZkNvdW50OyAgICAgIC8vICsvLSBvbiByZWZlcmVuY2VzCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1BY3Rpdml0eUNvdW50OyAvLyArLy0gb24gc3RhcnQvc3RvcAotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhbmdlZDsKLSAgICAvLyBmb3Igb3V0cHV0cwotICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgICBtU3RyZWFtVHlwZTsKLSAgICAvLyBmb3IgaW5wdXRzCi0gICAgY29uc3QgYXVkaW9fc291cmNlX3QgICAgICAgIG1Tb3VyY2U7Ci19OwotCi1jbGFzcyBTZXNzaW9uUm91dGVNYXA6IHB1YmxpYyBLZXllZFZlY3RvcjxhdWRpb19zZXNzaW9uX3QsIHNwPFNlc3Npb25Sb3V0ZT4gPgotewotcHVibGljOgotICAgIC8vIFRoZXNlIGNvbnN0YW50cyBpZGVudGlmeSB0aGUgU2Vzc2lvblJvdXRNYXAgYXMgaG9sZGluZyBFSVRIRVIgaW5wdXQgcm91dGVzLAotICAgIC8vIG9yIG91dHB1dCByb3V0ZXMuICBBbiBlcnJvciB3aWxsIG9jY3VyIGlmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBhZGQgYSBTZXNzaW9uUm91dGUKLSAgICAvLyBvYmplY3Qgd2l0aCBtU3RyZWFtVHlwZSA9PSBTVFJFQU1fVFlQRV9OQSAoaS5lLiBhbiBpbnB1dCBTZXNzaW9uUm91dGUpIHRvIGEKLSAgICAvLyBTZXNzaW9uUm91dE1hcCB0aGF0IGlzIG1hcmtlZCBmb3Igb3V0cHV0IChpLmUuIG1NYXBUeXBlID09IFNFU1NJT05fUk9VVEVfTUFQX09VVFBVVCkKLSAgICAvLyBhbmQgc2ltaWxhcmx5ICBmb3Igb3V0cHV0IFNlc3Npb25Sb3V0ZXMgYW5kIElucHV0IFNlc3Npb25Sb3V0ZU1hcHMuCi0gICAgdHlwZWRlZiBlbnVtCi0gICAgewotICAgICAgICBNQVBUWVBFX0lOUFVUID0gMCwKLSAgICAgICAgTUFQVFlQRV9PVVRQVVQgPSAxCi0gICAgfSBzZXNzaW9uX3JvdXRlX21hcF90eXBlX3Q7Ci0KLSAgICBleHBsaWNpdCBTZXNzaW9uUm91dGVNYXAoc2Vzc2lvbl9yb3V0ZV9tYXBfdHlwZV90IG1hcFR5cGUpIDoKLSAgICAgICAgbU1hcFR5cGUobWFwVHlwZSkKLSAgICB7fQotCi0gICAgYm9vbCBoYXNSb3V0ZShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0KLSAgICB2b2lkIHJlbW92ZVJvdXRlKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLQotICAgIGludCBpbmNSb3V0ZUFjdGl2aXR5KGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICBpbnQgZGVjUm91dGVBY3Rpdml0eShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgYm9vbCBnZXRBbmRDbGVhclJvdXRlQ2hhbmdlZChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7IC8vIGFsc28gY2xlYXJzIHRoZSBjaGFuZ2VkIGZsYWcKLSAgICB2b2lkIGxvZyhjb25zdCBjaGFyKiBjYXB0aW9uKTsKLSAgICBhdWRpb19kZXZpY2VzX3QgZ2V0QWN0aXZlRGV2aWNlRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgYXZhaWxhYmxlRGV2aWNlcyk7Ci0gICAgLy8gU3BlY2lmeSBhbiBPdXRwdXQoU2luaykgcm91dGUgYnkgcGFzc2luZyBTZXNzaW9uUm91dGU6OlNPVVJDRV9UWVBFX05BIGluIHRoZQotICAgIC8vIHNvdXJjZSBhcmd1bWVudC4KLSAgICAvLyBTcGVjaWZ5IGFuIElucHV0KFNvdXJjZSkgcm91dCBieSBwYXNzaW5nIFNlc3Npb25Sb3V0ZTo6QVVESU9fU1RSRUFNX0RFRkFVTFQKLSAgICAvLyBpbiB0aGUgc3RyZWFtVHlwZSBhcmd1bWVudC4KLSAgICB2b2lkIGFkZFJvdXRlKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldmljZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpOwotCi1wcml2YXRlOgotICAgIC8vIFVzZWQgdG8gbWFyayBhIFNlc3Npb25Sb3V0ZSBhcyBmb3IgZWl0aGVyIGlucHV0cyAobU1hcFR5cGUgPT0ga1Nlc3Npb25Sb3V0ZU1hcF9JbnB1dCkKLSAgICAvLyBvciBvdXRwdXRzIChtTWFwVHlwZSA9PSBrU2Vzc2lvblJvdXRlTWFwX091dHB1dCkKLSAgICBjb25zdCBzZXNzaW9uX3JvdXRlX21hcF90eXBlX3QgbU1hcFR5cGU7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU3RyZWFtRGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1N0cmVhbURlc2NyaXB0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBiMTAzNy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU3RyZWFtRGVzY3JpcHRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIklWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uLmgiCi0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gc3RyZWFtIGRlc2NyaXB0b3IgdXNlZCBmb3Igdm9sdW1lIGNvbnRyb2wKLWNsYXNzIFN0cmVhbURlc2NyaXB0b3IKLXsKLXB1YmxpYzoKLSAgICBTdHJlYW1EZXNjcmlwdG9yKCk7Ci0KLSAgICBpbnQgZ2V0Vm9sdW1lSW5kZXgoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3Q7Ci0gICAgYm9vbCBjYW5CZU11dGVkKCkgY29uc3QgeyByZXR1cm4gbUNhbkJlTXV0ZWQ7IH0KLSAgICB2b2lkIGNsZWFyQ3VycmVudFZvbHVtZUluZGV4KCk7Ci0gICAgdm9pZCBhZGRDdXJyZW50Vm9sdW1lSW5kZXgoYXVkaW9fZGV2aWNlc190IGRldmljZSwgaW50IGluZGV4KTsKLSAgICBpbnQgZ2V0Vm9sdW1lSW5kZXhNaW4oKSBjb25zdCB7IHJldHVybiBtSW5kZXhNaW47IH0KLSAgICBpbnQgZ2V0Vm9sdW1lSW5kZXhNYXgoKSBjb25zdCB7IHJldHVybiBtSW5kZXhNYXg7IH0KLSAgICB2b2lkIHNldFZvbHVtZUluZGV4TWluKGludCB2b2xJbmRleE1pbik7Ci0gICAgdm9pZCBzZXRWb2x1bWVJbmRleE1heChpbnQgdm9sSW5kZXhNYXgpOwotICAgIGJvb2wgaGFzVm9sdW1lSW5kZXhGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIGRldmljZSA9IFZvbHVtZTo6Z2V0RGV2aWNlRm9yVm9sdW1lKGRldmljZSk7Ci0gICAgICAgIHJldHVybiBtSW5kZXhDdXIuaW5kZXhPZktleShkZXZpY2UpID49IDA7Ci0gICAgfQotCi0gICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3Q7Ci0KLSAgICB2b2lkIHNldFZvbHVtZUN1cnZlUG9pbnQoZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LCBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpwb2ludCk7Ci0gICAgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqZ2V0Vm9sdW1lQ3VydmVQb2ludChkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnkpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbVZvbHVtZUN1cnZlW2RldmljZUNhdGVnb3J5XTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqbVZvbHVtZUN1cnZlW0RFVklDRV9DQVRFR09SWV9DTlRdOwotICAgIEtleWVkVmVjdG9yPGF1ZGlvX2RldmljZXNfdCwgaW50PiBtSW5kZXhDdXI7IC8qKjwgY3VycmVudCB2b2x1bWUgaW5kZXggcGVyIGRldmljZS4gKi8KLSAgICBpbnQgbUluZGV4TWluOyAvKio8IG1pbiB2b2x1bWUgaW5kZXguICovCi0gICAgaW50IG1JbmRleE1heDsgLyoqPCBtYXggdm9sdW1lIGluZGV4LiAqLwotICAgIGJvb2wgbUNhbkJlTXV0ZWQ7IC8qKjwgdHJ1ZSBpcyB0aGUgc3RyZWFtIGNhbiBiZSBtdXRlZC4gKi8KLX07Ci0KLS8qKgotICogc3RyZWFtIGRlc2NyaXB0b3JzIGNvbGxlY3Rpb24gZm9yIHZvbHVtZSBjb250cm9sCi0gKi8KLWNsYXNzIFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uIDogcHVibGljIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19zdHJlYW1fdHlwZV90LCBTdHJlYW1EZXNjcmlwdG9yPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIElWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uCi17Ci1wdWJsaWM6Ci0gICAgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb24oKTsKLQotICAgIHZpcnR1YWwgdm9pZCBjbGVhckN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0gICAgdmlydHVhbCB2b2lkIGFkZEN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCk7Ci0gICAgdmlydHVhbCBib29sIGNhbkJlTXV0ZWQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgIHZpcnR1YWwgaW50IGdldFZvbHVtZUluZGV4TWluKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlRm9yKHN0cmVhbSkuZ2V0Vm9sdW1lSW5kZXhNaW4oKTsKLSAgICB9Ci0gICAgdmlydHVhbCBpbnQgZ2V0Vm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCi0gICAgewotICAgICAgICByZXR1cm4gdmFsdWVGb3Ioc3RyZWFtKS5nZXRWb2x1bWVJbmRleChkZXZpY2UpOwotICAgIH0KLSAgICB2aXJ0dWFsIGludCBnZXRWb2x1bWVJbmRleE1heChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiB2YWx1ZUZvcihzdHJlYW0pLmdldFZvbHVtZUluZGV4TWF4KCk7Ci0gICAgfQotICAgIHZpcnR1YWwgZmxvYXQgdm9sSW5kZXhUb0RiKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleEluVWkpIGNvbnN0OwotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4TWluLCBpbnQgaW5kZXhNYXgpOwotICAgIHZpcnR1YWwgdm9pZCBpbml0aWFsaXplVm9sdW1lQ3VydmVzKGJvb2wgaXNTcGVha2VyRHJjRW5hYmxlZCk7Ci0gICAgdmlydHVhbCB2b2lkIHN3aXRjaFZvbHVtZUN1cnZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtU3JjLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbURzdCk7Ci0gICAgdmlydHVhbCBib29sIGhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlRm9yKHN0cmVhbSkuaGFzVm9sdW1lSW5kZXhGb3JEZXZpY2UoZGV2aWNlKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICB2b2lkIHNldFZvbHVtZUN1cnZlUG9pbnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqcG9pbnQpOwotICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKmdldFZvbHVtZUN1cnZlUG9pbnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnkpIGNvbnN0OwotICAgIHZvaWQgc2V0Vm9sdW1lSW5kZXhNaW4oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0saW50IHZvbEluZGV4TWluKTsKLSAgICB2b2lkIHNldFZvbHVtZUluZGV4TWF4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLGludCB2b2xJbmRleE1heCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVHlwZUNvbnZlcnRlci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1R5cGVDb252ZXJ0ZXIuaAppbmRleCA2M2MxOWQxLi42YjA0NzZjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVHlwZUNvbnZlcnRlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9UeXBlQ29udmVydGVyLmgKQEAgLTIzLDI2ICsyMywxMCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBEZXZpY2VDYXRlZ29yeVRyYWl0cwotewotICAgIHR5cGVkZWYgZGV2aWNlX2NhdGVnb3J5IFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgTWl4VHlwZVRyYWl0cwotewotICAgIHR5cGVkZWYgaW50MzJfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IFJvdXRlRmxhZ1RyYWl0cwotewotICAgIHR5cGVkZWYgdWludDMyX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBSdWxlVHJhaXRzCi17Ci0gICAgdHlwZWRlZiB1aW50MzJfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Oworc3RydWN0IFJ1bGVUcmFpdHMgOiBwdWJsaWMgRGVmYXVsdFRyYWl0czx1aW50MzJfdD4ge307Cit1c2luZyBEZXZpY2VDYXRlZ29yeVRyYWl0cyA9IERlZmF1bHRUcmFpdHM8ZGV2aWNlX2NhdGVnb3J5PjsKK3N0cnVjdCBNaXhUeXBlVHJhaXRzIDogcHVibGljIERlZmF1bHRUcmFpdHM8aW50MzJfdD4ge307CitzdHJ1Y3QgUm91dGVGbGFnVHJhaXRzIDogcHVibGljIERlZmF1bHRUcmFpdHM8dWludDMyX3Q+IHt9OwogCiB0eXBlZGVmIFR5cGVDb252ZXJ0ZXI8RGV2aWNlQ2F0ZWdvcnlUcmFpdHM+IERldmljZUNhdGVnb3J5Q29udmVydGVyOwogdHlwZWRlZiBUeXBlQ29udmVydGVyPE1peFR5cGVUcmFpdHM+IE1peFR5cGVDb252ZXJ0ZXI7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVm9sdW1lQ3VydmUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Wb2x1bWVDdXJ2ZS5oCmluZGV4IDNlNmIyYjQuLjc2ZWMxOTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Wb2x1bWVDdXJ2ZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Wb2x1bWVDdXJ2ZS5oCkBAIC01OSw3ICs1OSw3IEBACiAKICAgICBmbG9hdCB2b2xJbmRleFRvRGIoaW50IGluZGV4SW5VaSwgaW50IHZvbEluZGV4TWluLCBpbnQgdm9sSW5kZXhNYXgpIGNvbnN0OwogCi0gICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKnJlc3VsdCkgY29uc3Q7CiAKIHByaXZhdGU6CiAgICAgU29ydGVkVmVjdG9yPEN1cnZlUG9pbnQ+IG1DdXJ2ZVBvaW50czsKQEAgLTE0NCw3ICsxNDQsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgYm9vbCBjdXJ2ZVBvaW50cyA9IGZhbHNlKSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBib29sIGN1cnZlUG9pbnRzID0gZmFsc2UpIGNvbnN0OwogCiBwcml2YXRlOgogICAgIEtleWVkVmVjdG9yPGRldmljZV9jYXRlZ29yeSwgc3A8Vm9sdW1lQ3VydmU+ID4gbU9yaWdpblZvbHVtZUN1cnZlczsKQEAgLTIxNyw3ICsyMTcsNyBAQAogICAgICAgICByZXR1cm4gZ2V0Q3VydmVzRm9yKHN0cmVhbSkuaGFzVm9sdW1lSW5kZXhGb3JEZXZpY2UoZGV2aWNlKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdCBvdmVycmlkZTsKIAogICAgIHNzaXplX3QgYWRkKGNvbnN0IHNwPFZvbHVtZUN1cnZlPiAmdm9sdW1lQ3VydmUpCiAgICAgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Db2xsZWN0aW9ucy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0NvbGxlY3Rpb25zLmNwcAppbmRleCBjYTY3Yjg3Li5jOTBhNTgyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0NvbGxlY3Rpb25zLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0NvbGxlY3Rpb25zLmNwcApAQCAtMzUsMjIgKzM1LDE2IEBACiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLXN0YXR1c190IEF1ZGlvUm91dGVWZWN0b3I6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdAordm9pZCBBdWRpb1JvdXRlVmVjdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKIHsKICAgICBpZiAoaXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuJSpzQXVkaW8gUm91dGVzICglenUpOlxuIiwgc3BhY2VzLCAiIiwgc2l6ZSgpKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuJSpzQXVkaW8gUm91dGVzICglenUpOlxuIiwgc3BhY2VzLCAiIiwgc2l6ZSgpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gUm91dGUgJXp1OlxuIiwgc3BhY2VzLCAiIiwgaSArIDEpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIGl0ZW1BdChpKS0+ZHVtcChmZCwgNCk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFJvdXRlICV6dTpcbiIsIHNwYWNlcywgIiIsIGkgKyAxKTsKKyAgICAgICAgaXRlbUF0KGkpLT5kdW1wKGRzdCwgNCk7CiAgICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9HYWluLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvR2Fpbi5jcHAKaW5kZXggMTkzZDRhNi4uMjcyNTg3MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9HYWluLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0dhaW4uY3BwCkBAIC05OCwzMiArOTgsMTcgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXZvaWQgQXVkaW9HYWluOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAordm9pZCBBdWRpb0dhaW46OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNHYWluICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbW9kZTogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubW9kZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gY2hhbm5lbF9tYXNrOiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5jaGFubmVsX21hc2spOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1pbl92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1pbl92YWx1ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbWF4X3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWF4X3ZhbHVlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBkZWZhdWx0X3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4uZGVmYXVsdF92YWx1ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gc3RlcF92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLnN0ZXBfdmFsdWUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1pbl9yYW1wX21zOiAlZCBtc1xuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWluX3JhbXBfbXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1heF9yYW1wX21zOiAlZCBtc1xuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWF4X3JhbXBfbXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNHYWluICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gbW9kZTogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubW9kZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gY2hhbm5lbF9tYXNrOiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5jaGFubmVsX21hc2spOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIG1pbl92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1pbl92YWx1ZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gbWF4X3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWF4X3ZhbHVlKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBkZWZhdWx0X3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4uZGVmYXVsdF92YWx1ZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gc3RlcF92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLnN0ZXBfdmFsdWUpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIG1pbl9yYW1wX21zOiAlZCBtc1xuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWluX3JhbXBfbXMpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIG1heF9yYW1wX21zOiAlZCBtc1xuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWF4X3JhbXBfbXMpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAKaW5kZXggMWUwNjQwYy4uMGJjODhhNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcApAQCAtMTcsMjIgKzE3LDIwIEBACiAjZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9JbnB1dERlc2NyaXB0b3IiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgorI2luY2x1ZGUgPHBvbGljeS5oPgogI2luY2x1ZGUgPEF1ZGlvUG9saWN5SW50ZXJmYWNlLmg+CiAjaW5jbHVkZSAiQXVkaW9JbnB1dERlc2NyaXB0b3IuaCIKICNpbmNsdWRlICJJT1Byb2ZpbGUuaCIKICNpbmNsdWRlICJBdWRpb0dhaW4uaCIKICNpbmNsdWRlICJId01vZHVsZS5oIgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+Ci0jaW5jbHVkZSA8cG9saWN5Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogQXVkaW9JbnB1dERlc2NyaXB0b3I6OkF1ZGlvSW5wdXREZXNjcmlwdG9yKGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSkKLSAgICA6IG1Jb0hhbmRsZSgwKSwKLSAgICAgIG1EZXZpY2UoQVVESU9fREVWSUNFX05PTkUpLCBtUG9saWN5TWl4KE5VTEwpLAotICAgICAgbVByb2ZpbGUocHJvZmlsZSksIG1QYXRjaEhhbmRsZShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSksIG1JZCgwKSwKLSAgICAgIG1DbGllbnRJbnRlcmZhY2UoY2xpZW50SW50ZXJmYWNlKQorICAgIDogbVByb2ZpbGUocHJvZmlsZSkKKyAgICAsICBtQ2xpZW50SW50ZXJmYWNlKGNsaWVudEludGVyZmFjZSkKIHsKICAgICBpZiAocHJvZmlsZSAhPSBOVUxMKSB7CiAgICAgICAgIHByb2ZpbGUtPnBpY2tBdWRpb1Byb2ZpbGUobVNhbXBsaW5nUmF0ZSwgbUNoYW5uZWxNYXNrLCBtRm9ybWF0KTsKQEAgLTUwLDE5ICs0OCwzNyBAQAogICAgIHJldHVybiBtUHJvZmlsZS0+Z2V0TW9kdWxlSGFuZGxlKCk7CiB9CiAKLXVpbnQzMl90IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRPcGVuUmVmQ291bnQoKSBjb25zdAotewotICAgIHJldHVybiBtU2Vzc2lvbnMuZ2V0T3BlbkNvdW50KCk7Ci19Ci0KIGF1ZGlvX3BvcnRfaGFuZGxlX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmdldElkKCkgY29uc3QKIHsKICAgICByZXR1cm4gbUlkOwogfQogCi1hdWRpb19zb3VyY2VfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6aW5wdXRTb3VyY2UoYm9vbCBhY3RpdmVPbmx5KSBjb25zdAorYXVkaW9fc291cmNlX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnNvdXJjZSgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIGdldEhpZ2hlc3RQcmlvcml0eVNvdXJjZShhY3RpdmVPbmx5KTsKKyAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSBBVURJT19TT1VSQ0VfREVGQVVMVDsKKworICAgIGZvciAoYm9vbCBhY3RpdmVPbmx5IDogeyB0cnVlLCBmYWxzZSB9KSB7CisgICAgICAgIGludDMyX3QgdG9wUHJpb3JpdHkgPSAtMTsKKyAgICAgICAgYXBwX3N0YXRlX3QgdG9wU3RhdGUgPSBBUFBfU1RBVEVfSURMRTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnQgOiBnZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgICAgICBpZiAoYWN0aXZlT25seSAmJiAhY2xpZW50LT5hY3RpdmUoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXBwX3N0YXRlX3QgY3VyU3RhdGUgPSBjbGllbnQtPmFwcFN0YXRlKCk7CisgICAgICAgICAgICBpZiAoY3VyU3RhdGUgPj0gdG9wU3RhdGUpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGN1clByaW9yaXR5ID0gc291cmNlX3ByaW9yaXR5KGNsaWVudC0+c291cmNlKCkpOworICAgICAgICAgICAgICAgIGlmIChjdXJQcmlvcml0eSA+IHRvcFByaW9yaXR5KSB7CisgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9IGNsaWVudC0+c291cmNlKCk7CisgICAgICAgICAgICAgICAgICAgIHRvcFByaW9yaXR5ID0gY3VyUHJpb3JpdHk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRvcFN0YXRlID0gY3VyU3RhdGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvdXJjZSAhPSBBVURJT19TT1VSQ0VfREVGQVVMVCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNvdXJjZTsKIH0KIAogdm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCkBAIC04Myw3ICs5OSw3IEBACiAgICAgZHN0Q29uZmlnLT50eXBlID0gQVVESU9fUE9SVF9UWVBFX01JWDsKICAgICBkc3RDb25maWctPmV4dC5taXguaHdfbW9kdWxlID0gZ2V0TW9kdWxlSGFuZGxlKCk7CiAgICAgZHN0Q29uZmlnLT5leHQubWl4LmhhbmRsZSA9IG1Jb0hhbmRsZTsKLSAgICBkc3RDb25maWctPmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPSBpbnB1dFNvdXJjZSgpOworICAgIGRzdENvbmZpZy0+ZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9IHNvdXJjZSgpOwogfQogCiB2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3QKQEAgLTExOCw1NyArMTM0LDI3IEBACiAgICAgbVByZWVtcHRlZFNlc3Npb25zLmNsZWFyKCk7CiB9CiAKLWJvb2wgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmlzQWN0aXZlKCkgY29uc3QgewotICAgIHJldHVybiBtU2Vzc2lvbnMuaGFzQWN0aXZlU2Vzc2lvbigpOwotfQotCiBib29sIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjppc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIG1TZXNzaW9ucy5pc1NvdXJjZUFjdGl2ZShzb3VyY2UpOwotfQotCi1hdWRpb19zb3VyY2VfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0SGlnaGVzdFByaW9yaXR5U291cmNlKGJvb2wgYWN0aXZlT25seSkgY29uc3QKLXsKLQotICAgIHJldHVybiBtU2Vzc2lvbnMuZ2V0SGlnaGVzdFByaW9yaXR5U291cmNlKGFjdGl2ZU9ubHkpOworICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogZ2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICBpZiAoY2xpZW50LT5hY3RpdmUoKSAmJgorICAgICAgICAgICAgKChjbGllbnQtPnNvdXJjZSgpID09IHNvdXJjZSkgfHwKKyAgICAgICAgICAgICAgICAoKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04pICYmCisgICAgICAgICAgICAgICAgICAgIChjbGllbnQtPnNvdXJjZSgpID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSAmJgorICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmlzU291bmRUcmlnZ2VyKCkpKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiBib29sIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjppc1NvdW5kVHJpZ2dlcigpIGNvbnN0IHsKLSAgICAvLyBzb3VuZCB0cmlnZ2VyIGFuZCBub24gc291bmQgdHJpZ2dlciBzZXNzaW9ucyBhcmUgbm90IG1peGVkCi0gICAgLy8gb24gYSBnaXZlbiBpbnB1dAotICAgIHJldHVybiBtU2Vzc2lvbnMudmFsdWVBdCgwKS0+aXNTb3VuZFRyaWdnZXIoKTsKLX0KLQotc3A8QXVkaW9TZXNzaW9uPiBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0QXVkaW9TZXNzaW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1TZXNzaW9ucy52YWx1ZUZvcihzZXNzaW9uKTsKLX0KLQotQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0QXVkaW9TZXNzaW9ucyhib29sIGFjdGl2ZU9ubHkpIGNvbnN0Ci17Ci0gICAgaWYgKGFjdGl2ZU9ubHkpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9ucy5nZXRBY3RpdmVTZXNzaW9ucygpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbnM7CisgICAgLy8gc291bmQgdHJpZ2dlciBhbmQgbm9uIHNvdW5kIHRyaWdnZXIgY2xpZW50cyBhcmUgbm90IG1peGVkIG9uIGEgZ2l2ZW4gaW5wdXQKKyAgICAvLyBzbyBjaGVjayBvbmx5IGZpcnN0IGNsaWVudAorICAgIGlmIChnZXRDbGllbnRDb3VudCgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLX0KLQotc2l6ZV90IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRBdWRpb1Nlc3Npb25Db3VudChib29sIGFjdGl2ZU9ubHkpIGNvbnN0Ci17Ci0gICAgaWYgKGFjdGl2ZU9ubHkpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9ucy5nZXRBY3RpdmVTZXNzaW9uQ291bnQoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbVNlc3Npb25zLnNpemUoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjphZGRBdWRpb1Nlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiYgYXVkaW9TZXNzaW9uKSB7Ci0gICAgcmV0dXJuIG1TZXNzaW9ucy5hZGRTZXNzaW9uKHNlc3Npb24sIGF1ZGlvU2Vzc2lvbiwgLypBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIqL3RoaXMpOwotfQotCi1zdGF0dXNfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6cmVtb3ZlQXVkaW9TZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSB7Ci0gICAgcmV0dXJuIG1TZXNzaW9ucy5yZW1vdmVTZXNzaW9uKHNlc3Npb24pOworICAgIHJldHVybiBnZXRDbGllbnRJdGVyYWJsZSgpLmJlZ2luKCktPmlzU291bmRUcmlnZ2VyKCk7CiB9CiAKIGF1ZGlvX3BhdGNoX2hhbmRsZV90IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRQYXRjaEhhbmRsZSgpIGNvbnN0CkBAIC0xNzksNyArMTY1LDExIEBACiB2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpzZXRQYXRjaEhhbmRsZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCiB7CiAgICAgbVBhdGNoSGFuZGxlID0gaGFuZGxlOwotICAgIG1TZXNzaW9ucy5vblNlc3Npb25JbmZvVXBkYXRlKCk7CisgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnQgOiBnZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgIGlmIChjbGllbnQtPmFjdGl2ZSgpKSB7CisgICAgICAgICAgICB1cGRhdGVDbGllbnRSZWNvcmRpbmdDb25maWd1cmF0aW9uKFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQsIGNsaWVudCk7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIGF1ZGlvX2NvbmZpZ19iYXNlX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmdldENvbmZpZygpIGNvbnN0CkBAIC0yMzksNyArMjI5LDcgQEAKIAogc3RhdHVzX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnN0YXJ0KCkKIHsKLSAgICBpZiAoZ2V0QXVkaW9TZXNzaW9uQ291bnQodHJ1ZS8qYWN0aXZlT25seSovKSA9PSAxKSB7CisgICAgaWYgKCFpc0FjdGl2ZSgpKSB7CiAgICAgICAgIGlmICghbVByb2ZpbGUtPmNhblN0YXJ0TmV3SW8oKSkgewogICAgICAgICAgICAgQUxPR0koIiVzIG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudCAlZCIsIF9fZnVuY19fLCBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQpOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMjY2LDM4ICsyNTYsMTc4IEBACiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVByb2ZpbGUtPmN1ck9wZW5Db3VudCA8IDEsICIlcyBwcm9maWxlIG9wZW4gY291bnQgJXUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb2ZpbGUtPmN1ck9wZW5Db3VudCk7CiAgICAgICAgIC8vIGRvIG5vdCBjYWxsIHN0b3AoKSBoZXJlIGFzIHN0b3AoKSBpcyBzdXBwb3NlZCB0byBiZSBjYWxsZWQgYWZ0ZXIKLSAgICAgICAgLy8gQXVkaW9TZXNzaW9uOjpjaGFuZ2VBY3RpdmVDb3VudCgtMSkgYW5kIHdlIGRvbid0IGtub3cgaG93IG1hbnkgc2Vzc2lvbnMKKyAgICAgICAgLy8gIHNldENsaWVudEFjdGl2ZShjbGllbnQsIGZhbHNlKSBhbmQgd2UgZG9uJ3Qga25vdyBob3cgbWFueSBjbGllbnRzCiAgICAgICAgIC8vIGFyZSBzdGlsbCBhY3RpdmUgYXQgdGhpcyB0aW1lCiAgICAgICAgIGlmIChpc0FjdGl2ZSgpKSB7CiAgICAgICAgICAgICBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQtLTsKICAgICAgICAgfQogICAgICAgICBtUHJvZmlsZS0+Y3VyT3BlbkNvdW50LS07CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVByb2ZpbGUtPmN1ck9wZW5Db3VudCA8ICBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQsCisgICAgICAgICAgICAgICAgIiVzKCVkKTogbVByb2ZpbGUtPmN1ck9wZW5Db3VudCAlZCA8IG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudCAlZC4iLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIG1Qcm9maWxlLT5jdXJPcGVuQ291bnQsIG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudCk7CiAgICAgICAgIG1Jb0hhbmRsZSA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgIH0KIH0KIAotc3RhdHVzX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQordm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6YWRkQ2xpZW50KGNvbnN0IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+ICZjbGllbnQpIHsKKyAgICBDbGllbnRNYXBIYW5kbGVyPFJlY29yZENsaWVudERlc2NyaXB0b3I+OjphZGRDbGllbnQoY2xpZW50KTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVuYWJsZWRFZmZlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtRW5hYmxlZEVmZmVjdHMudmFsdWVBdChpKS0+bVNlc3Npb24gPT0gY2xpZW50LT5zZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGNsaWVudC0+dHJhY2tFZmZlY3RFbmFibGVkKG1FbmFibGVkRWZmZWN0cy52YWx1ZUF0KGkpLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6c2V0Q2xpZW50QWN0aXZlKGNvbnN0IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsIGJvb2wgYWN0aXZlKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZ2V0Q2xpZW50KGNsaWVudC0+cG9ydElkKCkpID09IG51bGxwdHIsCisgICAgICAgICIlcyglZCkgZG9lcyBub3QgZXhpc3Qgb24gaW5wdXQgZGVzY3JpcHRvciIsIF9fZnVuY19fLCBjbGllbnQtPnBvcnRJZCgpKTsKKyAgICBpZiAoYWN0aXZlID09IGNsaWVudC0+YWN0aXZlKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBJRDogJWRcbiIsIGdldElkKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9ybWF0OiAlZFxuIiwgbUZvcm1hdCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBDaGFubmVsczogJTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIERldmljZXMgJTA4eFxuIiwgbURldmljZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIC8vIEhhbmRsZSBub24tY2xpZW50LXNwZWNpZmljIGFjdGl2aXR5IHJlZiBjb3VudAorICAgIGludDMyX3Qgb2xkR2xvYmFsQWN0aXZlQ291bnQgPSBtR2xvYmFsQWN0aXZlQ291bnQ7CisgICAgaWYgKCFhY3RpdmUgJiYgbUdsb2JhbEFjdGl2ZUNvdW50IDwgMSkgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlcyglZCkgaW52YWxpZCBkZWFjdGl2YXRpb24gd2l0aCBnbG9iYWxBY3RpdmVDb3VudCAlZCIsCisgICAgICAgICAgICAgICBfX2Z1bmNfXywgY2xpZW50LT5wb3J0SWQoKSwgbUdsb2JhbEFjdGl2ZUNvdW50KTsKKyAgICAgICAgLy8gbUdsb2JhbEFjdGl2ZUNvdW50ID0gMTsKKyAgICB9CisgICAgY29uc3QgaW50IGRlbHRhID0gYWN0aXZlID8gMSA6IC0xOworICAgIG1HbG9iYWxBY3RpdmVDb3VudCArPSBkZWx0YTsKIAotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIGlmICgob2xkR2xvYmFsQWN0aXZlQ291bnQgPT0gMCkgJiYgKG1HbG9iYWxBY3RpdmVDb3VudCA+IDApKSB7CisgICAgICAgIGlmICgobVBvbGljeU1peCAhPSBOVUxMKSAmJiAoKG1Qb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKG1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlYX1NUQVRFX01JWElORyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKChvbGRHbG9iYWxBY3RpdmVDb3VudCA+IDApICYmIChtR2xvYmFsQWN0aXZlQ291bnQgPT0gMCkpIHsKKyAgICAgICAgaWYgKChtUG9saWN5TWl4ICE9IE5VTEwpICYmICgobVBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUobVBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfSURMRSk7CisgICAgICAgIH0KKyAgICB9CiAKLSAgICBtU2Vzc2lvbnMuZHVtcChmZCwgMSk7CisgICAgY2xpZW50LT5zZXRBY3RpdmUoYWN0aXZlKTsKIAotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICBpbnQgZXZlbnQgPSBhY3RpdmUgPyBSRUNPUkRfQ09ORklHX0VWRU5UX1NUQVJUIDogUkVDT1JEX0NPTkZJR19FVkVOVF9TVE9QOworICAgIHVwZGF0ZUNsaWVudFJlY29yZGluZ0NvbmZpZ3VyYXRpb24oZXZlbnQsIGNsaWVudCk7CisKK30KKwordm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6dXBkYXRlQ2xpZW50UmVjb3JkaW5nQ29uZmlndXJhdGlvbigKKyAgICBpbnQgZXZlbnQsIGNvbnN0IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+JiBjbGllbnQpCit7CisgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCBzZXNzaW9uQ29uZmlnID0gY2xpZW50LT5jb25maWcoKTsKKyAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCByZWNvcmRDbGllbnRJbmZve2NsaWVudC0+dWlkKCksIGNsaWVudC0+c2Vzc2lvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5zb3VyY2UoKSwgY2xpZW50LT5wb3J0SWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+aXNTaWxlbmNlZCgpfTsKKyAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZyA9IGdldENvbmZpZygpOworCisgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0czsKKyAgICBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiBlZmZlY3RzTGlzdCA9IGNsaWVudC0+Z2V0RW5hYmxlZEVmZmVjdHMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdHNMaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNsaWVudEVmZmVjdHMucHVzaF9iYWNrKGVmZmVjdHNMaXN0LnZhbHVlQXQoaSktPm1EZXNjKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzOworICAgIGVmZmVjdHNMaXN0ID0gZ2V0RW5hYmxlZEVmZmVjdHMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdHNMaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgIGVmZmVjdHMucHVzaF9iYWNrKGVmZmVjdHNMaXN0LnZhbHVlQXQoaSktPm1EZXNjKTsKKyAgICB9CisKKyAgICBtQ2xpZW50SW50ZXJmYWNlLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsICZyZWNvcmRDbGllbnRJbmZvLCAmc2Vzc2lvbkNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50RWZmZWN0cywgJmNvbmZpZywgZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhdGNoSGFuZGxlLCBzb3VyY2UoKSk7Cit9CisKK1JlY29yZENsaWVudFZlY3RvciBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0Q2xpZW50c0ZvclNlc3Npb24oCisgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGNsaWVudHM7CisgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnQgOiBnZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgIGlmIChjbGllbnQtPnNlc3Npb24oKSA9PSBzZXNzaW9uKSB7CisgICAgICAgICAgICBjbGllbnRzLnB1c2hfYmFjayhjbGllbnQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjbGllbnRzOworfQorCitSZWNvcmRDbGllbnRWZWN0b3IgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmNsaWVudHNMaXN0KGJvb2wgYWN0aXZlT25seSwgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByZWZlcnJlZERldmljZU9ubHkpIGNvbnN0Cit7CisgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGNsaWVudHM7CisgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnQgOiBnZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgIGlmICgoIWFjdGl2ZU9ubHkgfHwgY2xpZW50LT5hY3RpdmUoKSkKKyAgICAgICAgICAgICYmIChzb3VyY2UgPT0gQVVESU9fU09VUkNFX0RFRkFVTFQgfHwgc291cmNlID09IGNsaWVudC0+c291cmNlKCkpCisgICAgICAgICAgICAmJiAoIXByZWZlcnJlZERldmljZU9ubHkgfHwgY2xpZW50LT5oYXNQcmVmZXJyZWREZXZpY2UoKSkpIHsKKyAgICAgICAgICAgIGNsaWVudHMucHVzaF9iYWNrKGNsaWVudCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNsaWVudHM7Cit9CisKK3ZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnRyYWNrRWZmZWN0RW5hYmxlZChjb25zdCBzcDxFZmZlY3REZXNjcmlwdG9yPiAmZWZmZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5hYmxlZCkKK3sKKyAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICBtRW5hYmxlZEVmZmVjdHMucmVwbGFjZVZhbHVlRm9yKGVmZmVjdC0+bUlkLCBlZmZlY3QpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1FbmFibGVkRWZmZWN0cy5yZW1vdmVJdGVtKGVmZmVjdC0+bUlkKTsKKyAgICB9CisKKyAgICBSZWNvcmRDbGllbnRWZWN0b3IgY2xpZW50cyA9IGdldENsaWVudHNGb3JTZXNzaW9uKChhdWRpb19zZXNzaW9uX3QpZWZmZWN0LT5tU2Vzc2lvbik7CisgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBjbGllbnRzKSB7CisgICAgICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGNsaWVudEVmZmVjdCA9IGNsaWVudC0+Z2V0RW5hYmxlZEVmZmVjdHMoKS5nZXRFZmZlY3QoZWZmZWN0LT5tSWQpOworICAgICAgICBib29sIGNoYW5nZWQgPSAoZW5hYmxlZCAmJiBjbGllbnRFZmZlY3QgPT0gbnVsbHB0cikKKyAgICAgICAgICAgICAgICB8fCAoIWVuYWJsZWQgJiYgY2xpZW50RWZmZWN0ICE9IG51bGxwdHIpOworICAgICAgICBjbGllbnQtPnRyYWNrRWZmZWN0RW5hYmxlZChlZmZlY3QsIGVuYWJsZWQpOworICAgICAgICBpZiAoY2hhbmdlZCAmJiBjbGllbnQtPmFjdGl2ZSgpKSB7CisgICAgICAgICAgICB1cGRhdGVDbGllbnRSZWNvcmRpbmdDb25maWd1cmF0aW9uKFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQsIGNsaWVudCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0VmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRFbmFibGVkRWZmZWN0cygpIGNvbnN0Cit7CisgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gZW5hYmxlZEVmZmVjdHM7CisgICAgLy8gcmVwb3J0IGVmZmVjdHMgZm9yIGhpZ2hlc3QgcHJpb3JpdHkgYWN0aXZlIHNvdXJjZSBhcyBhcHBsaWVkIHRvIGFsbCBjbGllbnRzCisgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGNsaWVudHMgPQorICAgICAgICBjbGllbnRzTGlzdCh0cnVlIC8qYWN0aXZlT25seSovLCBzb3VyY2UoKSwgZmFsc2UgLypwcmVmZXJyZWREZXZpY2VPbmx5Ki8pOworICAgIGlmIChjbGllbnRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgZW5hYmxlZEVmZmVjdHMgPSBjbGllbnRzWzBdLT5nZXRFbmFibGVkRWZmZWN0cygpOworICAgIH0KKyAgICByZXR1cm4gZW5hYmxlZEVmZmVjdHM7Cit9CisKK3ZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnNldEFwcFN0YXRlKHVpZF90IHVpZCwgYXBwX3N0YXRlX3Qgc3RhdGUpIHsKKyAgICBSZWNvcmRDbGllbnRWZWN0b3IgY2xpZW50cyA9IGNsaWVudHNMaXN0KGZhbHNlIC8qYWN0aXZlT25seSovKTsKKworICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogY2xpZW50cykgeworICAgICAgICBpZiAodWlkID09IGNsaWVudC0+dWlkKCkpIHsKKyAgICAgICAgICAgIGJvb2wgd2FzU2lsZW5jZWQgPSBjbGllbnQtPmlzU2lsZW5jZWQoKTsKKyAgICAgICAgICAgIGNsaWVudC0+c2V0QXBwU3RhdGUoc3RhdGUpOworICAgICAgICAgICAgaWYgKGNsaWVudC0+YWN0aXZlKCkgJiYgd2FzU2lsZW5jZWQgIT0gY2xpZW50LT5pc1NpbGVuY2VkKCkpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVDbGllbnRSZWNvcmRpbmdDb25maWd1cmF0aW9uKFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQsIGNsaWVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgSUQ6ICVkXG4iLCBnZXRJZCgpKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFNhbXBsaW5nIHJhdGU6ICVkXG4iLCBtU2FtcGxpbmdSYXRlKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIEZvcm1hdDogJWRcbiIsIG1Gb3JtYXQpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgQ2hhbm5lbHM6ICUwOHhcbiIsIG1DaGFubmVsTWFzayk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBEZXZpY2VzICUwOHhcbiIsIG1EZXZpY2UpOworICAgIGdldEVuYWJsZWRFZmZlY3RzKCkuZHVtcChkc3QsIDEgLypzcGFjZXMqLywgZmFsc2UgLyp2ZXJib3NlKi8pOworICAgIGRzdC0+YXBwZW5kKCIgQXVkaW9SZWNvcmQgQ2xpZW50czpcbiIpOworICAgIENsaWVudE1hcEhhbmRsZXI8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj46OmR1bXAoZHN0KTsKKyAgICBkc3QtPmFwcGVuZCgiXG4iKTsKIH0KIAogYm9vbCBBdWRpb0lucHV0Q29sbGVjdGlvbjo6aXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdApAQCAtMzM2LDE1ICs0NjYsMTMgQEAKICAgICByZXR1cm4gY291bnQ7CiB9CiAKLVZlY3RvcjxzcCA8QXVkaW9JbnB1dERlc2NyaXB0b3I+ID4gQXVkaW9JbnB1dENvbGxlY3Rpb246OmdldEFjdGl2ZUlucHV0cyhib29sIGlnbm9yZVZpcnR1YWxJbnB1dHMpCitWZWN0b3I8c3AgPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiA+IEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjpnZXRBY3RpdmVJbnB1dHMoKQogewogICAgIFZlY3RvcjxzcCA8QXVkaW9JbnB1dERlc2NyaXB0b3I+ID4gYWN0aXZlSW5wdXRzOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewogICAgICAgICBjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gIGlucHV0RGVzY3JpcHRvciA9IHZhbHVlQXQoaSk7Ci0gICAgICAgIGlmICgoaW5wdXREZXNjcmlwdG9yLT5pc0FjdGl2ZSgpKQotICAgICAgICAgICAgICAgICYmICghaWdub3JlVmlydHVhbElucHV0cyB8fAotICAgICAgICAgICAgICAgICAgICAhaXNfdmlydHVhbF9pbnB1dF9kZXZpY2UoaW5wdXREZXNjcmlwdG9yLT5tRGV2aWNlKSkpIHsKKyAgICAgICAgaWYgKGlucHV0RGVzY3JpcHRvci0+aXNBY3RpdmUoKSkgewogICAgICAgICAgICAgYWN0aXZlSW5wdXRzLmFkZChpbnB1dERlc2NyaXB0b3IpOwogICAgICAgICB9CiAgICAgfQpAQCAtMzU4LDIwICs0ODYsMzUgQEAKICAgICByZXR1cm4gZGV2aWNlczsKIH0KIAotc3RhdHVzX3QgQXVkaW9JbnB1dENvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAorc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjpnZXRJbnB1dEZvckNsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuSW5wdXRzIGR1bXA6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIElucHV0ICVkIGR1bXA6XG4iLCBrZXlBdChpKSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCk7CisgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSB2YWx1ZUF0KGkpOworICAgICAgICBpZiAoaW5wdXREZXNjLT5nZXRDbGllbnQocG9ydElkKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gaW5wdXREZXNjOworICAgICAgICB9CiAgICAgfQorICAgIHJldHVybiAwOworfQogCi0gICAgcmV0dXJuIE5PX0VSUk9SOwordm9pZCBBdWRpb0lucHV0Q29sbGVjdGlvbjo6dHJhY2tFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+ICZlZmZlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5hYmxlZCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSB2YWx1ZUF0KGkpOworICAgICAgICBpZiAoaW5wdXREZXNjLT5tSW9IYW5kbGUgPT0gZWZmZWN0LT5tSW8pIHsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dERlc2MtPnRyYWNrRWZmZWN0RW5hYmxlZChlZmZlY3QsIGVuYWJsZWQpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZCgiXG5JbnB1dHMgZHVtcDpcbiIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIi0gSW5wdXQgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QpOworICAgIH0KIH0KIAogfTsgLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5jcHAKaW5kZXggOTliNDVjOC4uOTc1MDRhYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwCkBAIC0zNCwxMiArMzQsMTIgQEAKIAogQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpBdWRpb091dHB1dERlc2NyaXB0b3IoY29uc3Qgc3A8QXVkaW9Qb3J0PiYgcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCi0gICAgOiBtUG9ydChwb3J0KSwgbURldmljZShBVURJT19ERVZJQ0VfTk9ORSksCi0gICAgICBtQ2xpZW50SW50ZXJmYWNlKGNsaWVudEludGVyZmFjZSksIG1QYXRjaEhhbmRsZShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSksIG1JZCgwKQorICAgIDogbVBvcnQocG9ydCkKKyAgICAsIG1DbGllbnRJbnRlcmZhY2UoY2xpZW50SW50ZXJmYWNlKQogewogICAgIC8vIGNsZWFyIHVzYWdlIGNvdW50IGZvciBhbGwgc3RyZWFtIHR5cGVzCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKLSAgICAgICAgbVJlZkNvdW50W2ldID0gMDsKKyAgICAgICAgbUFjdGl2ZUNvdW50W2ldID0gMDsKICAgICAgICAgbUN1clZvbHVtZVtpXSA9IC0xLjA7CiAgICAgICAgIG1NdXRlQ291bnRbaV0gPSAwOwogICAgICAgICBtU3RvcFRpbWVbaV0gPSAwOwpAQCAtNTUsMTEgKzU1LDI4IEBACiAgICAgfQogfQogCithdWRpb19jb25maWdfYmFzZV90IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Z2V0Q29uZmlnKCkgY29uc3QKK3sKKyAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZyA9IHsgLnNhbXBsZV9yYXRlID0gbVNhbXBsaW5nUmF0ZSwgLmNoYW5uZWxfbWFzayA9IG1DaGFubmVsTWFzaywKKyAgICAgICAgICAgIC5mb3JtYXQgPSBtRm9ybWF0IH07CisgICAgcmV0dXJuIGNvbmZpZzsKK30KKwogYXVkaW9fbW9kdWxlX2hhbmRsZV90IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Z2V0TW9kdWxlSGFuZGxlKCkgY29uc3QKIHsKICAgICByZXR1cm4gbVBvcnQuZ2V0KCkgIT0gbnVsbHB0ciA/IG1Qb3J0LT5nZXRNb2R1bGVIYW5kbGUoKSA6IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORTsKIH0KIAorYXVkaW9fcGF0Y2hfaGFuZGxlX3QgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpnZXRQYXRjaEhhbmRsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1QYXRjaEhhbmRsZTsKK30KKwordm9pZCBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFBhdGNoSGFuZGxlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBtUGF0Y2hIYW5kbGUgPSBoYW5kbGU7Cit9CisKIGF1ZGlvX3BvcnRfaGFuZGxlX3QgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpnZXRJZCgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1JZDsKQEAgLTg2LDE3ICsxMDMsNzggQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpjaGFuZ2VSZWZDb3VudChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGEpCit2b2lkIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Y2hhbmdlU3RyZWFtQWN0aXZlQ291bnQoY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWx0YSkKIHsKLSAgICBpZiAoKGRlbHRhICsgKGludCltUmVmQ291bnRbc3RyZWFtXSkgPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJjaGFuZ2VSZWZDb3VudCgpIGludmFsaWQgZGVsdGEgJWQgZm9yIHN0cmVhbSAlZCwgcmVmQ291bnQgJWQiLAotICAgICAgICAgICAgICBkZWx0YSwgc3RyZWFtLCBtUmVmQ291bnRbc3RyZWFtXSk7Ci0gICAgICAgIG1SZWZDb3VudFtzdHJlYW1dID0gMDsKKyAgICBpZiAoZGVsdGEgPT0gMCkgcmV0dXJuOworICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gY2xpZW50LT5zdHJlYW0oKTsKKyAgICBpZiAoKGRlbHRhICsgKGludCltQWN0aXZlQ291bnRbc3RyZWFtXSkgPCAwKSB7CisgICAgICAgIC8vIGFueSBtaXNtYXRjaGVkIGFjdGl2ZSBjb3VudCB3aWxsIGFib3J0LgorICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlcyglcykgaW52YWxpZCBkZWx0YSAlZCwgYWN0aXZlIHN0cmVhbSBjb3VudCAlZCIsCisgICAgICAgICAgICAgIF9fZnVuY19fLCBjbGllbnQtPnRvU2hvcnRTdHJpbmcoKS5jX3N0cigpLCBkZWx0YSwgbUFjdGl2ZUNvdW50W3N0cmVhbV0pOworICAgICAgICAvLyBtQWN0aXZlQ291bnRbc3RyZWFtXSA9IDA7CisgICAgICAgIC8vIHJldHVybjsKKyAgICB9CisgICAgbUFjdGl2ZUNvdW50W3N0cmVhbV0gKz0gZGVsdGE7CisKKyAgICBpZiAoZGVsdGEgPiAwKSB7CisgICAgICAgIG1BY3RpdmVDbGllbnRzW2NsaWVudF0gKz0gZGVsdGE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXV0byBpdCA9IG1BY3RpdmVDbGllbnRzLmZpbmQoY2xpZW50KTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmVDbGllbnRzLmVuZCgpKSB7IC8vIGNsaWVudCBub3QgZm91bmQhCisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlcyglcykgaW52YWxpZCBkZWx0YSAlZCwgaW5hY3RpdmUgY2xpZW50IiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNsaWVudC0+dG9TaG9ydFN0cmluZygpLmNfc3RyKCksIGRlbHRhKTsKKyAgICAgICAgfSBlbHNlIGlmIChpdC0+c2Vjb25kIDwgLWRlbHRhKSB7IC8vIGludmFsaWQgZGVsdGEhCisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlcyglcykgaW52YWxpZCBkZWx0YSAlZCwgYWN0aXZlIGNsaWVudCBjb3VudCAlenUiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY2xpZW50LT50b1Nob3J0U3RyaW5nKCkuY19zdHIoKSwgZGVsdGEsIGl0LT5zZWNvbmQpOworICAgICAgICB9CisgICAgICAgIGl0LT5zZWNvbmQgKz0gZGVsdGE7CisgICAgICAgIGlmIChpdC0+c2Vjb25kID09IDApIHsKKyAgICAgICAgICAgICh2b2lkKW1BY3RpdmVDbGllbnRzLmVyYXNlKGl0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCIlcyBzdHJlYW0gJWQsIGNvdW50ICVkIiwgX19GVU5DVElPTl9fLCBzdHJlYW0sIG1BY3RpdmVDb3VudFtzdHJlYW1dKTsKK30KKwordm9pZCBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldENsaWVudEFjdGl2ZShjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsIGJvb2wgYWN0aXZlKQoreworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZ2V0Q2xpZW50KGNsaWVudC0+cG9ydElkKCkpID09IG51bGxwdHIsCisgICAgICAgICIlcyglZCkgZG9lcyBub3QgZXhpc3Qgb24gb3V0cHV0IGRlc2NyaXB0b3IiLCBfX2Z1bmNfXywgY2xpZW50LT5wb3J0SWQoKSk7CisKKyAgICBpZiAoYWN0aXZlID09IGNsaWVudC0+YWN0aXZlKCkpIHsKKyAgICAgICAgQUxPR1coIiVzKCVzKTogaWdub3JlZCBhY3RpdmU6ICVkLCBjdXJyZW50IHN0cmVhbSBjb3VudCAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIGNsaWVudC0+dG9TaG9ydFN0cmluZygpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgYWN0aXZlLCBtQWN0aXZlQ291bnRbY2xpZW50LT5zdHJlYW0oKV0pOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIG1SZWZDb3VudFtzdHJlYW1dICs9IGRlbHRhOwotICAgIEFMT0dWKCJjaGFuZ2VSZWZDb3VudCgpIHN0cmVhbSAlZCwgY291bnQgJWQiLCBzdHJlYW0sIG1SZWZDb3VudFtzdHJlYW1dKTsKKyAgICBjb25zdCBpbnQgZGVsdGEgPSBhY3RpdmUgPyAxIDogLTE7CisgICAgY2hhbmdlU3RyZWFtQWN0aXZlQ291bnQoY2xpZW50LCBkZWx0YSk7CisKKyAgICAvLyBIYW5kbGUgbm9uLWNsaWVudC1zcGVjaWZpYyBhY3Rpdml0eSByZWYgY291bnQKKyAgICBpbnQzMl90IG9sZEdsb2JhbEFjdGl2ZUNvdW50ID0gbUdsb2JhbEFjdGl2ZUNvdW50OworICAgIGlmICghYWN0aXZlICYmIG1HbG9iYWxBY3RpdmVDb3VudCA8IDEpIHsKKyAgICAgICAgQUxPR1coIiVzKCVzKTogaW52YWxpZCBkZWFjdGl2YXRpb24gd2l0aCBnbG9iYWxSZWZDb3VudCAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIGNsaWVudC0+dG9TaG9ydFN0cmluZygpLmNfc3RyKCksIG1HbG9iYWxBY3RpdmVDb3VudCk7CisgICAgICAgIG1HbG9iYWxBY3RpdmVDb3VudCA9IDE7CisgICAgfQorICAgIG1HbG9iYWxBY3RpdmVDb3VudCArPSBkZWx0YTsKKworICAgIGlmICgob2xkR2xvYmFsQWN0aXZlQ291bnQgPT0gMCkgJiYgKG1HbG9iYWxBY3RpdmVDb3VudCA+IDApKSB7CisgICAgICAgIGlmICgobVBvbGljeU1peCAhPSBOVUxMKSAmJiAoKG1Qb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKG1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlYX1NUQVRFX01JWElORyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKChvbGRHbG9iYWxBY3RpdmVDb3VudCA+IDApICYmIChtR2xvYmFsQWN0aXZlQ291bnQgPT0gMCkpIHsKKyAgICAgICAgaWYgKChtUG9saWN5TWl4ICE9IE5VTEwpICYmICgobVBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUobVBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfSURMRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGllbnQtPnNldEFjdGl2ZShhY3RpdmUpOwogfQogCiBib29sIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6aXNBY3RpdmUodWludDMyX3QgaW5QYXN0TXMpIGNvbnN0CkBAIC0xMjAsNyArMTk4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHN5c1RpbWUpIGNvbnN0CiB7Ci0gICAgaWYgKG1SZWZDb3VudFtzdHJlYW1dICE9IDApIHsKKyAgICBpZiAobUFjdGl2ZUNvdW50W3N0cmVhbV0gIT0gMCkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKGluUGFzdE1zID09IDApIHsKQEAgLTE4NCwzMiArMjYyLDQ1IEBACiAgICAgcG9ydC0+ZXh0Lm1peC5od19tb2R1bGUgPSBnZXRNb2R1bGVIYW5kbGUoKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKK1RyYWNrQ2xpZW50VmVjdG9yIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Y2xpZW50c0xpc3QoYm9vbCBhY3RpdmVPbmx5LCByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByZWZlcnJlZERldmljZU9ubHkpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgSUQ6ICVkXG4iLCBtSWQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9ybWF0OiAlMDh4XG4iLCBtRm9ybWF0KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIENoYW5uZWxzOiAlMDh4XG4iLCBtQ2hhbm5lbE1hc2spOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRGV2aWNlcyAlMDh4XG4iLCBkZXZpY2UoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTdHJlYW0gdm9sdW1lIHJlZkNvdW50IG11dGVDb3VudFxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICUwMmQgICAgICUuMDNmICAgICAlMDJkICAgICAgICUwMmRcbiIsCi0gICAgICAgICAgICAgICAgIGksIG1DdXJWb2x1bWVbaV0sIG1SZWZDb3VudFtpXSwgbU11dGVDb3VudFtpXSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBUcmFja0NsaWVudFZlY3RvciBjbGllbnRzOworICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogZ2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICBpZiAoKCFhY3RpdmVPbmx5IHx8IGNsaWVudC0+YWN0aXZlKCkpCisgICAgICAgICAgICAmJiAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfTk9ORSB8fCBzdHJhdGVneSA9PSBjbGllbnQtPnN0cmF0ZWd5KCkpCisgICAgICAgICAgICAmJiAoIXByZWZlcnJlZERldmljZU9ubHkgfHwgY2xpZW50LT5oYXNQcmVmZXJyZWREZXZpY2UoKSkpIHsKKyAgICAgICAgICAgIGNsaWVudHMucHVzaF9iYWNrKGNsaWVudCk7CisgICAgICAgIH0KICAgICB9Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgcmV0dXJuIGNsaWVudHM7Cit9CiAKLSAgICByZXR1cm4gTk9fRVJST1I7Cit2b2lkIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBJRDogJWRcbiIsIG1JZCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBTYW1wbGluZyByYXRlOiAlZFxuIiwgbVNhbXBsaW5nUmF0ZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBGb3JtYXQ6ICUwOHhcbiIsIG1Gb3JtYXQpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgQ2hhbm5lbHM6ICUwOHhcbiIsIG1DaGFubmVsTWFzayk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBEZXZpY2VzOiAlMDh4XG4iLCBkZXZpY2UoKSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBHbG9iYWwgYWN0aXZlIGNvdW50OiAldVxuIiwgbUdsb2JhbEFjdGl2ZUNvdW50KTsKKyAgICBkc3QtPmFwcGVuZCgiIFN0cmVhbSB2b2x1bWUgYWN0aXZlQ291bnQgbXV0ZUNvdW50XG4iKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgJTAyZCAgICAgJS4wM2YgICAgICUwMmQgICAgICAgICAgJTAyZFxuIiwKKyAgICAgICAgICAgICAgICAgaSwgbUN1clZvbHVtZVtpXSwgc3RyZWFtQWN0aXZlQ291bnQoKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSksIG1NdXRlQ291bnRbaV0pOworICAgIH0KKyAgICBkc3QtPmFwcGVuZCgiIEF1ZGlvVHJhY2sgQ2xpZW50czpcbiIpOworICAgIENsaWVudE1hcEhhbmRsZXI8VHJhY2tDbGllbnREZXNjcmlwdG9yPjo6ZHVtcChkc3QpOworICAgIGRzdC0+YXBwZW5kKCJcbiIpOworICAgIGlmIChtQWN0aXZlQ2xpZW50cy5zaXplKCkgPiAwKSB7CisgICAgICAgIGRzdC0+YXBwZW5kKCIgQXVkaW9UcmFjayBhY3RpdmUgKHN0cmVhbSkgY2xpZW50czpcbiIpOworICAgICAgICBzaXplX3QgaW5kZXggPSAwOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudFBhaXIgOiBtQWN0aXZlQ2xpZW50cykgeworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBSZWZjb3VudDogJXp1IiwgY2xpZW50UGFpci5zZWNvbmQpOworICAgICAgICAgICAgY2xpZW50UGFpci5maXJzdC0+ZHVtcChkc3QsIDIsIGluZGV4KyspOworICAgICAgICB9CisgICAgICAgIGRzdC0+YXBwZW5kKCIgXG4iKTsKKyAgICB9CiB9CiAKIHZvaWQgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpsb2coY29uc3QgY2hhciogaW5kZW50KQpAQCAtMjIzLDMwICszMTQsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQogICAgIDogQXVkaW9PdXRwdXREZXNjcmlwdG9yKHByb2ZpbGUsIGNsaWVudEludGVyZmFjZSksCiAgICAgbVByb2ZpbGUocHJvZmlsZSksIG1Jb0hhbmRsZShBVURJT19JT19IQU5ETEVfTk9ORSksIG1MYXRlbmN5KDApLAotICAgIG1GbGFncygoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpMCksIG1Qb2xpY3lNaXgoTlVMTCksCisgICAgbUZsYWdzKChhdWRpb19vdXRwdXRfZmxhZ3NfdCkwKSwKICAgICBtT3V0cHV0MSgwKSwgbU91dHB1dDIoMCksIG1EaXJlY3RPcGVuQ291bnQoMCksCi0gICAgbURpcmVjdENsaWVudFNlc3Npb24oQVVESU9fU0VTU0lPTl9OT05FKSwgbUdsb2JhbFJlZkNvdW50KDApCisgICAgbURpcmVjdENsaWVudFNlc3Npb24oQVVESU9fU0VTU0lPTl9OT05FKQogewogICAgIGlmIChwcm9maWxlICE9IE5VTEwpIHsKICAgICAgICAgbUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KXByb2ZpbGUtPmdldEZsYWdzKCk7CiAgICAgfQogfQogCi1zdGF0dXNfdCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCit2b2lkIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBMYXRlbmN5OiAlZFxuIiwgbUxhdGVuY3kpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRmxhZ3MgJTA4eFxuIiwgbUZsYWdzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0KLSAgICBBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoZmQpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgTGF0ZW5jeTogJWRcbiIsIG1MYXRlbmN5KTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIEZsYWdzICUwOHhcbiIsIG1GbGFncyk7CisgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKGRzdCk7CiB9CiAKIGF1ZGlvX2RldmljZXNfdCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZGV2aWNlKCkgY29uc3QKQEAgLTI4OSw0MSArMzcwLDE3IEBACiAgICAgfQogfQogCi12b2lkIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpjaGFuZ2VSZWZDb3VudChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGEpCit2b2lkIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpjaGFuZ2VTdHJlYW1BY3RpdmVDb3VudChjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbHRhKQogewogICAgIC8vIGZvcndhcmQgdXNhZ2UgY291bnQgY2hhbmdlIHRvIGF0dGFjaGVkIG91dHB1dHMKICAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgbU91dHB1dDEtPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgZGVsdGEpOwotICAgICAgICBtT3V0cHV0Mi0+Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCBkZWx0YSk7CisgICAgICAgIG1PdXRwdXQxLT5jaGFuZ2VTdHJlYW1BY3RpdmVDb3VudChjbGllbnQsIGRlbHRhKTsKKyAgICAgICAgbU91dHB1dDItPmNoYW5nZVN0cmVhbUFjdGl2ZUNvdW50KGNsaWVudCwgZGVsdGEpOwogICAgIH0KLSAgICBBdWRpb091dHB1dERlc2NyaXB0b3I6OmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgZGVsdGEpOwotCi0gICAgLy8gaGFuZGxlIHN0cmVhbS1pbmRlcGVuZGVudCByZWYgY291bnQKLSAgICB1aW50MzJfdCBvbGRHbG9iYWxSZWZDb3VudCA9IG1HbG9iYWxSZWZDb3VudDsKLSAgICBpZiAoKGRlbHRhICsgKGludCltR2xvYmFsUmVmQ291bnQpIDwgMCkgewotICAgICAgICBBTE9HVygiY2hhbmdlUmVmQ291bnQoKSBpbnZhbGlkIGRlbHRhICVkIGdsb2JhbFJlZkNvdW50ICVkIiwgZGVsdGEsIG1HbG9iYWxSZWZDb3VudCk7Ci0gICAgICAgIG1HbG9iYWxSZWZDb3VudCA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUdsb2JhbFJlZkNvdW50ICs9IGRlbHRhOwotICAgIH0KLSAgICBpZiAoKG9sZEdsb2JhbFJlZkNvdW50ID09IDApICYmIChtR2xvYmFsUmVmQ291bnQgPiAwKSkgewotICAgICAgICBpZiAoKG1Qb2xpY3lNaXggIT0gTlVMTCkgJiYgKChtUG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShtUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgTUlYX1NUQVRFX01JWElORyk7Ci0gICAgICAgIH0KLQotICAgIH0gZWxzZSBpZiAoKG9sZEdsb2JhbFJlZkNvdW50ID4gMCkgJiYgKG1HbG9iYWxSZWZDb3VudCA9PSAwKSkgewotICAgICAgICBpZiAoKG1Qb2xpY3lNaXggIT0gTlVMTCkgJiYgKChtUG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShtUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgTUlYX1NUQVRFX0lETEUpOwotICAgICAgICB9Ci0gICAgfQorICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Y2hhbmdlU3RyZWFtQWN0aXZlQ291bnQoY2xpZW50LCBkZWx0YSk7CiB9CiAKLQogYm9vbCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6aXNGaXhlZFZvbHVtZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQogewogICAgIC8vIHVuaXQgZ2FpbiBpZiByZXJvdXRpbmcgdG8gZXh0ZXJuYWwgcG9saWN5CkBAIC00OTksNyArNTU2LDcgQEAKIAogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1Qcm9maWxlLT5jdXJPcGVuQ291bnQgPCAxLCAiJXMgcHJvZmlsZSBvcGVuIGNvdW50ICV1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm9maWxlLT5jdXJPcGVuQ291bnQpOwotICAgICAgICAvLyBkbyBub3QgY2FsbCBzdG9wKCkgaGVyZSBhcyBzdG9wKCkgaXMgc3VwcG9zZWQgdG8gYmUgY2FsbGVkIGFmdGVyIGNoYW5nZVJlZkNvdW50KC0xKQorICAgICAgICAvLyBkbyBub3QgY2FsbCBzdG9wKCkgaGVyZSBhcyBzdG9wKCkgaXMgc3VwcG9zZWQgdG8gYmUgY2FsbGVkIGFmdGVyIHNldENsaWVudEFjdGl2ZShmYWxzZSkKICAgICAgICAgLy8gYW5kIHdlIGRvbid0IGtub3cgaG93IG1hbnkgc3RyZWFtcyBhcmUgc3RpbGwgYWN0aXZlIGF0IHRoaXMgdGltZQogICAgICAgICBpZiAoaXNBY3RpdmUoKSkgewogICAgICAgICAgICAgbVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50LS07CkBAIC01MzQsMjcgKzU5MSwxOCBAQAogfQogCiAvLyBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvciBpbXBsZW1lbnRhdGlvbgotSHdBdWRpb091dHB1dERlc2NyaXB0b3I6Okh3QXVkaW9PdXRwdXREZXNjcmlwdG9yKGNvbnN0IHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4mIHNvdXJjZSwKK0h3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiYgc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCi0gICAgOiBBdWRpb091dHB1dERlc2NyaXB0b3Ioc291cmNlLT5tRGV2aWNlLCBjbGllbnRJbnRlcmZhY2UpLAorICAgIDogQXVkaW9PdXRwdXREZXNjcmlwdG9yKHNvdXJjZS0+c3JjRGV2aWNlKCksIGNsaWVudEludGVyZmFjZSksCiAgICAgICBtU291cmNlKHNvdXJjZSkKIHsKIH0KIAotc3RhdHVzX3QgSHdBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQordm9pZCBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoZmQpOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiU291cmNlOlxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIG1Tb3VyY2UtPmR1bXAoZmQpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChkc3QpOworICAgIGRzdC0+YXBwZW5kKCJTb3VyY2U6XG4iKTsKKyAgICBtU291cmNlLT5kdW1wKGRzdCwgMCwgMCk7CiB9CiAKIGF1ZGlvX2RldmljZXNfdCBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c3VwcG9ydGVkRGV2aWNlcygpCkBAIC01NjYsMTMgKzYxNCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnKSBjb25zdAogewotICAgIG1Tb3VyY2UtPm1EZXZpY2UtPnRvQXVkaW9Qb3J0Q29uZmlnKGRzdENvbmZpZywgc3JjQ29uZmlnKTsKKyAgICBtU291cmNlLT5zcmNEZXZpY2UoKS0+dG9BdWRpb1BvcnRDb25maWcoZHN0Q29uZmlnLCBzcmNDb25maWcpOwogfQogCiB2b2lkIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3QKIHsKLSAgICBtU291cmNlLT5tRGV2aWNlLT50b0F1ZGlvUG9ydChwb3J0KTsKKyAgICBtU291cmNlLT5zcmNEZXZpY2UoKS0+dG9BdWRpb1BvcnQocG9ydCk7CiB9CiAKIApAQCAtNjUwLDggKzY5OCw4IEBACiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHByaW1hcnlPdXRwdXQgPSBnZXRQcmltYXJ5T3V0cHV0KCk7CiAKICAgICBpZiAoKHByaW1hcnlPdXRwdXQgIT0gTlVMTCkgJiYgKHByaW1hcnlPdXRwdXQtPm1Qcm9maWxlICE9IE5VTEwpCi0gICAgICAgICYmIChwcmltYXJ5T3V0cHV0LT5tUHJvZmlsZS0+bU1vZHVsZSAhPSBOVUxMKSkgewotICAgICAgICBzcDxId01vZHVsZT4gcHJpbWFyeUh3TW9kdWxlID0gcHJpbWFyeU91dHB1dC0+bVByb2ZpbGUtPm1Nb2R1bGU7CisgICAgICAgICYmIChwcmltYXJ5T3V0cHV0LT5tUHJvZmlsZS0+Z2V0TW9kdWxlKCkgIT0gTlVMTCkpIHsKKyAgICAgICAgc3A8SHdNb2R1bGU+IHByaW1hcnlId01vZHVsZSA9IHByaW1hcnlPdXRwdXQtPm1Qcm9maWxlLT5nZXRNb2R1bGUoKTsKICAgICAgICAgVmVjdG9yIDxzcDxJT1Byb2ZpbGU+PiBwcmltYXJ5SHdNb2R1bGVPdXRwdXRQcm9maWxlcyA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlId01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwcmltYXJ5SHdNb2R1bGVPdXRwdXRQcm9maWxlcy5zaXplKCk7IGkrKykgewpAQCAtNjk4LDcgKzc0Niw3IEBACiAgICAgICAgIH0KICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewogICAgICAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSB2YWx1ZUF0KGkpOwotICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzXSAhPSAwKSB7CisgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+c3RyZWFtQWN0aXZlQ291bnQoKGF1ZGlvX3N0cmVhbV90eXBlX3QpcykhPSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTcxMywyMSArNzYxLDI0IEBACiAgICAgcmV0dXJuIGRldmljZXM7CiB9CiAKLQotc3RhdHVzX3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAorc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpnZXRPdXRwdXRGb3JDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbk91dHB1dHMgZHVtcDpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gT3V0cHV0ICVkIGR1bXA6XG4iLCBrZXlBdChpKSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCk7CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmdldENsaWVudChwb3J0SWQpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBvdXRwdXREZXNjOworICAgICAgICB9CiAgICAgfQorICAgIHJldHVybiAwOworfQogCi0gICAgcmV0dXJuIE5PX0VSUk9SOwordm9pZCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmQoIlxuT3V0cHV0cyBkdW1wOlxuIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiLSBPdXRwdXQgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QpOworICAgIH0KIH0KIAogLy8gSHdBdWRpb091dHB1dENvbGxlY3Rpb24gaW1wbGVtZW50YXRpb24KQEAgLTc1MSw3ICs4MDIsNyBAQAogICAgICAgICB9CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIGNvbnN0IHNwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKLSAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc10gIT0gMCkgeworICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPnN0cmVhbUFjdGl2ZUNvdW50KChhdWRpb19zdHJlYW1fdHlwZV90KXMpICE9IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNzU5LDIwICs4MTAsMTMgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXR1c190IEh3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKK3ZvaWQgSHdBdWRpb091dHB1dENvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5PdXRwdXRzIGR1bXA6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZHN0LT5hcHBlbmQoIlxuT3V0cHV0cyBkdW1wOlxuIik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIE91dHB1dCAlZCBkdW1wOlxuIiwga2V5QXQoaSkpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZmQpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiLSBPdXRwdXQgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QpOwogICAgIH0KLQotICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogfTsgLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9QYXRjaC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BhdGNoLmNwcAppbmRleCBhOWZlNDhkLi5jZDFjMmYyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BhdGNoLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BhdGNoLmNwcApAQCAtMzQsNTMgKzM0LDI5IEBACiB7CiB9CiAKLXN0YXR1c190IEF1ZGlvUGF0Y2g6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0CitzdGF0aWMgdm9pZCBkdW1wUGF0Y2hFbmRwb2ludHMoCisgICAgICAgIFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgY29uc3QgY2hhciAqcHJlZml4LCBpbnQgY291bnQsIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnICpjZmdzKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzQXVkaW8gcGF0Y2ggJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBoYW5kbGU6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbUhhbmRsZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gYXVkaW8gZmxpbmdlciBoYW5kbGU6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbUFmUGF0Y2hIYW5kbGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG93bmVyIHVpZDogJTJkXG4iLCBzcGFjZXMsICIiLCBtVWlkKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSAlZCBzb3VyY2VzOlxuIiwgc3BhY2VzLCAiIiwgbVBhdGNoLm51bV9zb3VyY2VzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGF0Y2gubnVtX3NvdXJjZXM7IGkrKykgewotICAgICAgICBpZiAobVBhdGNoLnNvdXJjZXNbaV0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnICZjZmcgPSBjZmdzW2ldOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzICBbJXMgJWRdICIsIHNwYWNlcywgIiIsIHByZWZpeCwgaSArIDEpOworICAgICAgICBpZiAoY2ZnLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewogICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGV2aWNlOwotICAgICAgICAgICAgZGV2aWNlVG9TdHJpbmcobVBhdGNoLnNvdXJjZXNbaV0uZXh0LmRldmljZS50eXBlLCBkZXZpY2UpOwotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBEZXZpY2UgSUQgJWQgJXNcbiIsIHNwYWNlcyArIDIsICIiLAotICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNvdXJjZXNbaV0uaWQsCi0gICAgICAgICAgICAgICAgICAgICBkZXZpY2UuY19zdHIoKSk7CisgICAgICAgICAgICBkZXZpY2VUb1N0cmluZyhjZmcuZXh0LmRldmljZS50eXBlLCBkZXZpY2UpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIkRldmljZSBJRCAlZCAlcyIsIGNmZy5pZCwgZGV2aWNlLmNfc3RyKCkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBNaXggSUQgJWQgSS9PIGhhbmRsZSAlZFxuIiwgc3BhY2VzICsgMiwgIiIsCi0gICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc291cmNlc1tpXS5pZCwgbVBhdGNoLnNvdXJjZXNbaV0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIk1peCBJRCAlZCBJL08gaGFuZGxlICVkIiwgY2ZnLmlkLCBjZmcuZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmQoIlxuIik7CiAgICAgfQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gJWQgc2lua3M6XG4iLCBzcGFjZXMsICIiLCBtUGF0Y2gubnVtX3NpbmtzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGF0Y2gubnVtX3NpbmtzOyBpKyspIHsKLSAgICAgICAgaWYgKG1QYXRjaC5zaW5rc1tpXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRldmljZTsKLSAgICAgICAgICAgIGRldmljZVRvU3RyaW5nKG1QYXRjaC5zaW5rc1tpXS5leHQuZGV2aWNlLnR5cGUsIGRldmljZSk7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIERldmljZSBJRCAlZCAlc1xuIiwgc3BhY2VzICsgMiwgIiIsCi0gICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc2lua3NbaV0uaWQsCi0gICAgICAgICAgICAgICAgICAgICBkZXZpY2UuY19zdHIoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIE1peCBJRCAlZCBJL08gaGFuZGxlICVkXG4iLCBzcGFjZXMgKyAyLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgIG1QYXRjaC5zaW5rc1tpXS5pZCwgbVBhdGNoLnNpbmtzW2ldLmV4dC5taXguaGFuZGxlKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgfQorfQogCi0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwordm9pZCBBdWRpb1BhdGNoOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNQYXRjaCAlZDogb3duZXIgdWlkICU0ZCwgaGFuZGxlICUyZCwgYWYgaGFuZGxlICUyZFxuIiwKKyAgICAgICAgICAgIHNwYWNlcywgIiIsIGluZGV4ICsgMSwgbVVpZCwgbUhhbmRsZSwgbUFmUGF0Y2hIYW5kbGUpOworICAgIGR1bXBQYXRjaEVuZHBvaW50cyhkc3QsIHNwYWNlcywgInNyYyAiLCBtUGF0Y2gubnVtX3NvdXJjZXMsIG1QYXRjaC5zb3VyY2VzKTsKKyAgICBkdW1wUGF0Y2hFbmRwb2ludHMoZHN0LCBzcGFjZXMsICJzaW5rIiwgbVBhdGNoLm51bV9zaW5rcywgbVBhdGNoLnNpbmtzKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9QYXRjaENvbGxlY3Rpb246OmFkZEF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLApAQCAtMTYxLDE2ICsxMzcsMTIgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvUGF0Y2hDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKK3ZvaWQgQXVkaW9QYXRjaENvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuQXVkaW8gUGF0Y2hlczpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBkc3QtPmFwcGVuZCgiXG5BdWRpbyBQYXRjaGVzOlxuIik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkLCAyLCBpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QsIDIsIGkpOwogICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9saWN5TWl4LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9saWN5TWl4LmNwcAppbmRleCAwODkzMGYxLi43NzZkOThmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvbGljeU1peC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb2xpY3lNaXguY3BwCkBAIC01Miw2NCArNTIsNTUgQEAKICAgICByZXR1cm4gJm1NaXg7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWl4OjpkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAordm9pZCBBdWRpb1BvbGljeU1peDo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0F1ZGlvIFBvbGljeSBNaXggJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc0F1ZGlvIFBvbGljeSBNaXggJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCArIDEpOwogICAgIHN0ZDo6c3RyaW5nIG1peFR5cGVMaXRlcmFsOwogICAgIGlmICghTWl4VHlwZUNvbnZlcnRlcjo6dG9TdHJpbmcobU1peC5tTWl4VHlwZSwgbWl4VHlwZUxpdGVyYWwpKSB7CiAgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIGNvbnZlcnQgbWl4IHR5cGUgJWQiLCBfX0ZVTkNUSU9OX18sIG1NaXgubU1peFR5cGUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CiAgICAgfQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbWl4IHR5cGU6ICVzXG4iLCBzcGFjZXMsICIiLCBtaXhUeXBlTGl0ZXJhbC5jX3N0cigpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gbWl4IHR5cGU6ICVzXG4iLCBzcGFjZXMsICIiLCBtaXhUeXBlTGl0ZXJhbC5jX3N0cigpKTsKKwogICAgIHN0ZDo6c3RyaW5nIHJvdXRlRmxhZ0xpdGVyYWw7CiAgICAgUm91dGVGbGFnVHlwZUNvbnZlcnRlcjo6bWFza1RvU3RyaW5nKG1NaXgubVJvdXRlRmxhZ3MsIHJvdXRlRmxhZ0xpdGVyYWwpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gUm91dGUgRmxhZ3M6ICVzXG4iLCBzcGFjZXMsICIiLCByb3V0ZUZsYWdMaXRlcmFsLmNfc3RyKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBSb3V0ZSBGbGFnczogJXNcbiIsIHNwYWNlcywgIiIsIHJvdXRlRmxhZ0xpdGVyYWwuY19zdHIoKSk7CisKICAgICBzdGQ6OnN0cmluZyBkZXZpY2VMaXRlcmFsOwogICAgIGRldmljZVRvU3RyaW5nKG1NaXgubURldmljZVR5cGUsIGRldmljZUxpdGVyYWwpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gZGV2aWNlIHR5cGU6ICVzXG4iLCBzcGFjZXMsICIiLCBkZXZpY2VMaXRlcmFsLmNfc3RyKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGRldmljZSBhZGRyZXNzOiAlc1xuIiwgc3BhY2VzLCAiIiwgbU1peC5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIGRldmljZSB0eXBlOiAlc1xuIiwgc3BhY2VzLCAiIiwgZGV2aWNlTGl0ZXJhbC5jX3N0cigpKTsKKworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIGRldmljZSBhZGRyZXNzOiAlc1xuIiwgc3BhY2VzLCAiIiwgbU1peC5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKSk7CiAKICAgICBpbnQgaW5kZXhDcml0ZXJpb24gPSAwOwogICAgIGZvciAoY29uc3QgYXV0byAmY3JpdGVyaW9uIDogbU1peC5tQ3JpdGVyaWEpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBDcml0ZXJpb24gJWQ6XG4iLCBzcGFjZXMgKyAyLCAiIiwgaW5kZXhDcml0ZXJpb24rKyk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gQ3JpdGVyaW9uICVkOlxuIiwgc3BhY2VzICsgMiwgIiIsIGluZGV4Q3JpdGVyaW9uKyspOworCiAgICAgICAgIHN0ZDo6c3RyaW5nIHVzYWdlTGl0ZXJhbDsKICAgICAgICAgaWYgKCFVc2FnZVR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKGNyaXRlcmlvbi5tVmFsdWUubVVzYWdlLCB1c2FnZUxpdGVyYWwpKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBjb252ZXJ0IHVzYWdlICVkIiwgX19GVU5DVElPTl9fLCBjcml0ZXJpb24ubVZhbHVlLm1Vc2FnZSk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gVXNhZ2U6JXNcbiIsIHNwYWNlcyArIDQsICIiLCB1c2FnZUxpdGVyYWwuY19zdHIoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gVXNhZ2U6JXNcbiIsIHNwYWNlcyArIDQsICIiLCB1c2FnZUxpdGVyYWwuY19zdHIoKSk7CisKICAgICAgICAgaWYgKG1NaXgubU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7CiAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VMaXRlcmFsOwogICAgICAgICAgICAgaWYgKCFTb3VyY2VUeXBlQ29udmVydGVyOjp0b1N0cmluZyhjcml0ZXJpb24ubVZhbHVlLm1Tb3VyY2UsIHNvdXJjZUxpdGVyYWwpKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gY29udmVydCBzb3VyY2UgJWQiLCBfX0ZVTkNUSU9OX18sIGNyaXRlcmlvbi5tVmFsdWUubVNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIFNvdXJjZTolc1xuIiwgc3BhY2VzICsgNCwgIiIsIHNvdXJjZUxpdGVyYWwuY19zdHIoKSk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBTb3VyY2U6JXNcbiIsIHNwYWNlcyArIDQsICIiLCBzb3VyY2VMaXRlcmFsLmNfc3RyKCkpOworCiAgICAgICAgIH0KLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBVaWQ6JWRcbiIsIHNwYWNlcyArIDQsICIiLCBjcml0ZXJpb24ubVZhbHVlLm1VaWQpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFVpZDolZFxuIiwgc3BhY2VzICsgNCwgIiIsIGNyaXRlcmlvbi5tVmFsdWUubVVpZCk7CisKICAgICAgICAgc3RkOjpzdHJpbmcgcnVsZUxpdGVyYWw7CiAgICAgICAgIGlmICghUnVsZVR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKGNyaXRlcmlvbi5tUnVsZSwgcnVsZUxpdGVyYWwpKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBjb252ZXJ0IHNvdXJjZSAlZCIsIF9fRlVOQ1RJT05fXyxjcml0ZXJpb24ubVJ1bGUpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIFJ1bGU6JXNcbiIsIHNwYWNlcyArIDQsICIiLCBydWxlTGl0ZXJhbC5jX3N0cigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBSdWxlOiVzXG4iLCBzcGFjZXMgKyA0LCAiIiwgcnVsZUxpdGVyYWwuY19zdHIoKSk7CiAgICAgfQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpyZWdpc3Rlck1peChjb25zdCBTdHJpbmc4JiBhZGRyZXNzLCBBdWRpb01peCBtaXgsCkBAIC0zNDksMTQgKzM0MCw5MyBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKLXsKLSAgICBzdGQ6OnN0cmluZyBsb2coIlxuQXVkaW8gUG9saWN5IE1peDpcbiIpOwotICAgIHdyaXRlKGZkLCBsb2cuY19zdHIoKSwgbG9nLnNpemUoKSk7CitzdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OnNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLAorICAgICAgICBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpIHsKKyAgICAvLyByZW1vdmUgZXhpc3RpbmcgcnVsZXMgZm9yIHRoaXMgdWlkCisgICAgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWQpOworCisgICAgLy8gZm9yIGVhY2ggcGxheWVyIG1peDogYWRkIGEgcnVsZSB0byBtYXRjaCBvciBleGNsdWRlIHRoZSB1aWQgYmFzZWQgb24gdGhlIGRldmljZQogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCwgMiwgaSk7CisgICAgICAgIGNvbnN0IEF1ZGlvTWl4ICptaXggPSB2YWx1ZUF0KGkpLT5nZXRNaXgoKTsKKyAgICAgICAgaWYgKG1peC0+bU1peFR5cGUgIT0gTUlYX1RZUEVfUExBWUVSUykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2hlY2sgaWYgdGhpcyBtaXggZ29lcyB0byBhIGRldmljZSBpbiB0aGUgbGlzdCBvZiBkZXZpY2VzCisgICAgICAgIGJvb2wgZGV2aWNlTWF0Y2ggPSBmYWxzZTsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBkZXZpY2VzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICBpZiAoZGV2aWNlc1tqXS5tVHlwZSA9PSBtaXgtPm1EZXZpY2VUeXBlCisgICAgICAgICAgICAgICAgICAgICYmIGRldmljZXNbal0ubUFkZHJlc3MgPT0gbWl4LT5tRGV2aWNlQWRkcmVzcykgeworICAgICAgICAgICAgICAgIGRldmljZU1hdGNoID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWRldmljZU1hdGNoKSB7CisgICAgICAgICAgICAvLyB0aGlzIG1peCBkb2Vzbid0IGdvIHRvIG9uZSBvZiB0aGUgbGlzdGVkIGRldmljZXMgZm9yIHRoZSBnaXZlbiB1aWQsCisgICAgICAgICAgICAvLyBtb2RpZnkgaXRzIHJ1bGVzIHRvIGV4Y2x1ZGUgdGhlIHVpZAorICAgICAgICAgICAgbWl4LT5leGNsdWRlVWlkKHVpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6cmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpIHsKKyAgICAvLyBmb3IgZWFjaCBwbGF5ZXIgbWl4OiByZW1vdmUgZXhpc3RpbmcgcnVsZXMgdGhhdCBtYXRjaCBvciBleGNsdWRlIHRoaXMgdWlkCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBib29sIGZvdW5kVWlkUnVsZSA9IGZhbHNlOworICAgICAgICBBdWRpb01peCAqbWl4ID0gdmFsdWVBdChpKS0+Z2V0TWl4KCk7CisgICAgICAgIGlmIChtaXgtPm1NaXhUeXBlICE9IE1JWF9UWVBFX1BMQVlFUlMpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gY3JpdGVyaWFUb1JlbW92ZTsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtaXgtPm1Dcml0ZXJpYS5zaXplKCk7IGorKykgeworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgcnVsZSA9IG1peC0+bUNyaXRlcmlhW2pdLm1SdWxlOworICAgICAgICAgICAgLy8gaXMgdGhpcyBydWxlIGFmZmVjdGluZyB0aGUgdWlkPworICAgICAgICAgICAgaWYgKHJ1bGUgPT0gUlVMRV9FWENMVURFX1VJRAorICAgICAgICAgICAgICAgICAgICAmJiB1aWQgPT0gbWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1VaWQpIHsKKyAgICAgICAgICAgICAgICBmb3VuZFVpZFJ1bGUgPSB0cnVlOworICAgICAgICAgICAgICAgIGNyaXRlcmlhVG9SZW1vdmUucHVzaF9iYWNrKGopOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChmb3VuZFVpZFJ1bGUpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSBjcml0ZXJpYVRvUmVtb3ZlLnNpemUoKSAtIDE7IGogPj0gMDsgai0tKSB7CisgICAgICAgICAgICAgICAgbWl4LT5tQ3JpdGVyaWEucmVtb3ZlQXQoY3JpdGVyaWFUb1JlbW92ZVtqXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OmdldERldmljZXNGb3JVaWQodWlkX3QgdWlkLAorICAgICAgICBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpIGNvbnN0IHsKKyAgICAvLyBmb3IgZWFjaCBwbGF5ZXIgbWl4OiBmaW5kIHJ1bGVzIHRoYXQgZG9uJ3QgZXhjbHVkZSB0aGlzIHVpZCwgYW5kIGFkZCB0aGUgZGV2aWNlIHRvIHRoZSBsaXN0CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBib29sIHJ1bGVBbGxvd3NVaWQgPSB0cnVlOworICAgICAgICBBdWRpb01peCAqbWl4ID0gdmFsdWVBdChpKS0+Z2V0TWl4KCk7CisgICAgICAgIGlmIChtaXgtPm1NaXhUeXBlICE9IE1JWF9UWVBFX1BMQVlFUlMpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbWl4LT5tQ3JpdGVyaWEuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHJ1bGUgPSBtaXgtPm1Dcml0ZXJpYVtqXS5tUnVsZTsKKyAgICAgICAgICAgIGlmIChydWxlID09IFJVTEVfRVhDTFVERV9VSUQKKyAgICAgICAgICAgICAgICAgICAgJiYgdWlkID09IG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVWlkKSB7CisgICAgICAgICAgICAgICAgcnVsZUFsbG93c1VpZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChydWxlQWxsb3dzVWlkKSB7CisgICAgICAgICAgICBkZXZpY2VzLmFkZChBdWRpb0RldmljZVR5cGVBZGRyKG1peC0+bURldmljZVR5cGUsIG1peC0+bURldmljZUFkZHJlc3MpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZCgiXG5BdWRpbyBQb2xpY3kgTWl4OlxuIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCwgMiwgaSk7CisgICAgfQorfQorCiB9OyAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvcnQuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb3J0LmNwcAppbmRleCBkODU1NjJlLi4xOWRkZTZhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvcnQuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9ydC5jcHAKQEAgLTM1NCwyNiArMzU0LDE4IEBACiAgICAgcmV0dXJuIG1HYWluc1tpbmRleF0tPmNoZWNrQ29uZmlnKGdhaW5Db25maWcpOwogfQogCi12b2lkIEF1ZGlvUG9ydDo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGJvb2wgdmVyYm9zZSkgY29uc3QKK3ZvaWQgQXVkaW9Qb3J0OjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgYm9vbCB2ZXJib3NlKSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCiAgICAgaWYgKCFtTmFtZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBuYW1lOiAlc1xuIiwgc3BhY2VzLCAiIiwgbU5hbWUuc3RyaW5nKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBuYW1lOiAlc1xuIiwgc3BhY2VzLCAiIiwgbU5hbWUuc3RyaW5nKCkpOwogICAgIH0KICAgICBpZiAodmVyYm9zZSkgewotICAgICAgICBtUHJvZmlsZXMuZHVtcChmZCwgc3BhY2VzKTsKKyAgICAgICAgbVByb2ZpbGVzLmR1bXAoZHN0LCBzcGFjZXMpOwogCiAgICAgICAgIGlmIChtR2FpbnMuc2l6ZSgpICE9IDApIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gZ2FpbnM6XG4iLCBzcGFjZXMsICIiKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IGJ1ZmZlcjsKLSAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gZ2FpbnM6XG4iLCBzcGFjZXMsICIiKTsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUdhaW5zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUdhaW5zW2ldLT5kdW1wKGZkLCBzcGFjZXMgKyAyLCBpKTsKKyAgICAgICAgICAgICAgICBtR2FpbnNbaV0tPmR1bXAoZHN0LCBzcGFjZXMgKyAyLCBpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTM4NiwyMiArMzc4LDEyIEBACiAKIC8vIC0tLSBBdWRpb1BvcnRDb25maWcgY2xhc3MgaW1wbGVtZW50YXRpb24KIAotQXVkaW9Qb3J0Q29uZmlnOjpBdWRpb1BvcnRDb25maWcoKQotewotICAgIG1TYW1wbGluZ1JhdGUgPSAwOwotICAgIG1DaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKLSAgICBtRm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7Ci0gICAgbWVtc2V0KCZtR2FpbiwgMCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZykpOwotICAgIG1HYWluLmluZGV4ID0gLTE7Ci19Ci0KIHN0YXR1c190IEF1ZGlvUG9ydENvbmZpZzo6YXBwbHlBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqYmFja3VwQ29uZmlnKQogewotICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBsb2NhbEJhY2t1cENvbmZpZzsKKyAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgbG9jYWxCYWNrdXBDb25maWcgPSB7IC5jb25maWdfbWFzayA9IGNvbmZpZy0+Y29uZmlnX21hc2sgfTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKIAotICAgIGxvY2FsQmFja3VwQ29uZmlnLmNvbmZpZ19tYXNrID0gY29uZmlnLT5jb25maWdfbWFzazsKICAgICB0b0F1ZGlvUG9ydENvbmZpZygmbG9jYWxCYWNrdXBDb25maWcpOwogCiAgICAgc3A8QXVkaW9Qb3J0PiBhdWRpb3BvcnQgPSBnZXRBdWRpb1BvcnQoKTsKQEAgLTQyNSw2ICs0MDcsOSBAQAogICAgIGlmIChjb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfR0FJTikgewogICAgICAgICBtR2FpbiA9IGNvbmZpZy0+Z2FpbjsKICAgICB9CisgICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GTEFHUykgeworICAgICAgICBtRmxhZ3MgPSBjb25maWctPmZsYWdzOworICAgIH0KIAogZXhpdDoKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CkBAIC00MzYsMzMgKzQyMSwzOCBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKK25hbWVzcGFjZSB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIHVwZGF0ZUZpZWxkKAorICAgICAgICBjb25zdCBUJiBwb3J0Q29uZmlnRmllbGQsIFQgYXVkaW9fcG9ydF9jb25maWc6Oipwb3J0X2NvbmZpZ19maWVsZCwKKyAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnLAorICAgICAgICB1bnNpZ25lZCBpbnQgY29uZmlnTWFzaywgVCBkZWZhdWx0VmFsdWUpCit7CisgICAgaWYgKGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJiBjb25maWdNYXNrKSB7CisgICAgICAgIGlmICgoc3JjQ29uZmlnICE9IG51bGxwdHIpICYmIChzcmNDb25maWctPmNvbmZpZ19tYXNrICYgY29uZmlnTWFzaykpIHsKKyAgICAgICAgICAgIGRzdENvbmZpZy0+KnBvcnRfY29uZmlnX2ZpZWxkID0gc3JjQ29uZmlnLT4qcG9ydF9jb25maWdfZmllbGQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkc3RDb25maWctPipwb3J0X2NvbmZpZ19maWVsZCA9IHBvcnRDb25maWdGaWVsZDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGRzdENvbmZpZy0+KnBvcnRfY29uZmlnX2ZpZWxkID0gZGVmYXVsdFZhbHVlOworICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UKKwogdm9pZCBBdWRpb1BvcnRDb25maWc6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnKSBjb25zdAogewotICAgIGlmIChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpIHsKLSAgICAgICAgZHN0Q29uZmlnLT5zYW1wbGVfcmF0ZSA9IG1TYW1wbGluZ1JhdGU7Ci0gICAgICAgIGlmICgoc3JjQ29uZmlnICE9IE5VTEwpICYmIChzcmNDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpKSB7Ci0gICAgICAgICAgICBkc3RDb25maWctPnNhbXBsZV9yYXRlID0gc3JjQ29uZmlnLT5zYW1wbGVfcmF0ZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRzdENvbmZpZy0+c2FtcGxlX3JhdGUgPSAwOwotICAgIH0KLSAgICBpZiAoZHN0Q29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykgewotICAgICAgICBkc3RDb25maWctPmNoYW5uZWxfbWFzayA9IG1DaGFubmVsTWFzazsKLSAgICAgICAgaWYgKChzcmNDb25maWcgIT0gTlVMTCkgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0spKSB7Ci0gICAgICAgICAgICBkc3RDb25maWctPmNoYW5uZWxfbWFzayA9IHNyY0NvbmZpZy0+Y2hhbm5lbF9tYXNrOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZHN0Q29uZmlnLT5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7Ci0gICAgfQotICAgIGlmIChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUKSB7Ci0gICAgICAgIGRzdENvbmZpZy0+Zm9ybWF0ID0gbUZvcm1hdDsKLSAgICAgICAgaWYgKChzcmNDb25maWcgIT0gTlVMTCkgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQpKSB7Ci0gICAgICAgICAgICBkc3RDb25maWctPmZvcm1hdCA9IHNyY0NvbmZpZy0+Zm9ybWF0OwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZHN0Q29uZmlnLT5mb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKLSAgICB9CisgICAgdXBkYXRlRmllbGQobVNhbXBsaW5nUmF0ZSwgJmF1ZGlvX3BvcnRfY29uZmlnOjpzYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgIGRzdENvbmZpZywgc3JjQ29uZmlnLCBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURSwgMHUpOworICAgIHVwZGF0ZUZpZWxkKG1DaGFubmVsTWFzaywgJmF1ZGlvX3BvcnRfY29uZmlnOjpjaGFubmVsX21hc2ssCisgICAgICAgICAgICBkc3RDb25maWcsIHNyY0NvbmZpZywgQVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLLAorICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KUFVRElPX0NIQU5ORUxfTk9ORSk7CisgICAgdXBkYXRlRmllbGQobUZvcm1hdCwgJmF1ZGlvX3BvcnRfY29uZmlnOjpmb3JtYXQsCisgICAgICAgICAgICBkc3RDb25maWcsIHNyY0NvbmZpZywgQVVESU9fUE9SVF9DT05GSUdfRk9STUFULCBBVURJT19GT1JNQVRfSU5WQUxJRCk7CisKICAgICBzcDxBdWRpb1BvcnQ+IGF1ZGlvcG9ydCA9IGdldEF1ZGlvUG9ydCgpOwogICAgIGlmICgoZHN0Q29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0dBSU4pICYmIGF1ZGlvcG9ydCAhPSBOVUxMKSB7CiAgICAgICAgIGRzdENvbmZpZy0+Z2FpbiA9IG1HYWluOwpAQCAtNDc4LDYgKzQ2OCw5IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayAmPSB+QVVESU9fUE9SVF9DT05GSUdfR0FJTjsKICAgICB9CisKKyAgICB1cGRhdGVGaWVsZChtRmxhZ3MsICZhdWRpb19wb3J0X2NvbmZpZzo6ZmxhZ3MsCisgICAgICAgICAgICBkc3RDb25maWcsIHNyY0NvbmZpZywgQVVESU9fUE9SVF9DT05GSUdfRkxBR1MsIHsgQVVESU9fSU5QVVRfRkxBR19OT05FIH0pOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Byb2ZpbGUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qcm9maWxlLmNwcAppbmRleCBmZDZmYzFjLi5hNjQ1ZTAyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Byb2ZpbGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUHJvZmlsZS5jcHAKQEAgLTE0LDIwICsxNCwxMTIgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKwogI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvUHJvZmlsZSIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAotI2luY2x1ZGUgIkF1ZGlvUHJvZmlsZS5oIgotI2luY2x1ZGUgIkF1ZGlvUG9ydC5oIgotI2luY2x1ZGUgIkh3TW9kdWxlLmgiCi0jaW5jbHVkZSAiQXVkaW9HYWluLmgiCi0jaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+Ci0jaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+Ci0jaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCisjaW5jbHVkZSAiQXVkaW9HYWluLmgiCisjaW5jbHVkZSAiQXVkaW9Qb3J0LmgiCisjaW5jbHVkZSAiQXVkaW9Qcm9maWxlLmgiCisjaW5jbHVkZSAiSHdNb2R1bGUuaCIKKyNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorQ2hhbm5lbHNWZWN0b3IgQ2hhbm5lbHNWZWN0b3I6OmFzSW5NYXNrKCkgY29uc3QKK3sKKyAgICBDaGFubmVsc1ZlY3RvciBpbk1hc2tWZWN0b3I7CisgICAgZm9yIChjb25zdCBhdXRvJiBjaGFubmVsIDogKnRoaXMpIHsKKyAgICAgICAgaWYgKGF1ZGlvX2NoYW5uZWxfbWFza19vdXRfdG9faW4oY2hhbm5lbCkgIT0gQVVESU9fQ0hBTk5FTF9JTlZBTElEKSB7CisgICAgICAgICAgICBpbk1hc2tWZWN0b3IuYWRkKGF1ZGlvX2NoYW5uZWxfbWFza19vdXRfdG9faW4oY2hhbm5lbCkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbk1hc2tWZWN0b3I7Cit9CisKK0NoYW5uZWxzVmVjdG9yIENoYW5uZWxzVmVjdG9yOjphc091dE1hc2soKSBjb25zdAoreworICAgIENoYW5uZWxzVmVjdG9yIG91dE1hc2tWZWN0b3I7CisgICAgZm9yIChjb25zdCBhdXRvJiBjaGFubmVsIDogKnRoaXMpIHsKKyAgICAgICAgaWYgKGF1ZGlvX2NoYW5uZWxfbWFza19pbl90b19vdXQoY2hhbm5lbCkgIT0gQVVESU9fQ0hBTk5FTF9JTlZBTElEKSB7CisgICAgICAgICAgICBvdXRNYXNrVmVjdG9yLmFkZChhdWRpb19jaGFubmVsX21hc2tfaW5fdG9fb3V0KGNoYW5uZWwpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gb3V0TWFza1ZlY3RvcjsKK30KKworYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQXVkaW9Qcm9maWxlICZsZWZ0LCBjb25zdCBBdWRpb1Byb2ZpbGUgJmNvbXBhcmVUbykKK3sKKyAgICByZXR1cm4gKGxlZnQuZ2V0Rm9ybWF0KCkgPT0gY29tcGFyZVRvLmdldEZvcm1hdCgpKSAmJgorICAgICAgICAgICAgKGxlZnQuZ2V0Q2hhbm5lbHMoKSA9PSBjb21wYXJlVG8uZ2V0Q2hhbm5lbHMoKSkgJiYKKyAgICAgICAgICAgIChsZWZ0LmdldFNhbXBsZVJhdGVzKCkgPT0gY29tcGFyZVRvLmdldFNhbXBsZVJhdGVzKCkpOworfQorCitzdGF0aWMgQXVkaW9Qcm9maWxlKiBjcmVhdGVGdWxsRHluYW1pY0ltcGwoKQoreworICAgIEF1ZGlvUHJvZmlsZSogZHluYW1pY1Byb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKGdEeW5hbWljRm9ybWF0LAorICAgICAgICAgICAgQ2hhbm5lbHNWZWN0b3IoKSwgU2FtcGxlUmF0ZVZlY3RvcigpKTsKKyAgICBkeW5hbWljUHJvZmlsZS0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsKKyAgICBkeW5hbWljUHJvZmlsZS0+c2V0RHluYW1pY0NoYW5uZWxzKHRydWUpOworICAgIGR5bmFtaWNQcm9maWxlLT5zZXREeW5hbWljUmF0ZSh0cnVlKTsKKyAgICByZXR1cm4gZHluYW1pY1Byb2ZpbGU7Cit9CisKKy8vIHN0YXRpYworc3A8QXVkaW9Qcm9maWxlPiBBdWRpb1Byb2ZpbGU6OmNyZWF0ZUZ1bGxEeW5hbWljKCkKK3sKKyAgICBzdGF0aWMgc3A8QXVkaW9Qcm9maWxlPiBkeW5hbWljUHJvZmlsZSA9IGNyZWF0ZUZ1bGxEeW5hbWljSW1wbCgpOworICAgIHJldHVybiBkeW5hbWljUHJvZmlsZTsKK30KKworQXVkaW9Qcm9maWxlOjpBdWRpb1Byb2ZpbGUoYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlKSA6CisgICAgICAgIG1OYW1lKFN0cmluZzgoIiIpKSwKKyAgICAgICAgbUZvcm1hdChmb3JtYXQpCit7CisgICAgbUNoYW5uZWxNYXNrcy5hZGQoY2hhbm5lbE1hc2tzKTsKKyAgICBtU2FtcGxpbmdSYXRlcy5hZGQoc2FtcGxpbmdSYXRlKTsKK30KKworQXVkaW9Qcm9maWxlOjpBdWRpb1Byb2ZpbGUoYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2hhbm5lbHNWZWN0b3IgJmNoYW5uZWxNYXNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJnNhbXBsaW5nUmF0ZUNvbGxlY3Rpb24pIDoKKyAgICAgICAgbU5hbWUoU3RyaW5nOCgiIikpLAorICAgICAgICBtRm9ybWF0KGZvcm1hdCksCisgICAgICAgIG1DaGFubmVsTWFza3MoY2hhbm5lbE1hc2tzKSwKKyAgICAgICAgbVNhbXBsaW5nUmF0ZXMoc2FtcGxpbmdSYXRlQ29sbGVjdGlvbikge30KKwordm9pZCBBdWRpb1Byb2ZpbGU6OnNldENoYW5uZWxzKGNvbnN0IENoYW5uZWxzVmVjdG9yICZjaGFubmVsTWFza3MpCit7CisgICAgaWYgKG1Jc0R5bmFtaWNDaGFubmVscykgeworICAgICAgICBtQ2hhbm5lbE1hc2tzID0gY2hhbm5lbE1hc2tzOworICAgIH0KK30KKwordm9pZCBBdWRpb1Byb2ZpbGU6OnNldFNhbXBsZVJhdGVzKGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJnNhbXBsZVJhdGVzKQoreworICAgIGlmIChtSXNEeW5hbWljUmF0ZSkgeworICAgICAgICBtU2FtcGxpbmdSYXRlcyA9IHNhbXBsZVJhdGVzOworICAgIH0KK30KKwordm9pZCBBdWRpb1Byb2ZpbGU6OmNsZWFyKCkKK3sKKyAgICBpZiAobUlzRHluYW1pY0NoYW5uZWxzKSB7CisgICAgICAgIG1DaGFubmVsTWFza3MuY2xlYXIoKTsKKyAgICB9CisgICAgaWYgKG1Jc0R5bmFtaWNSYXRlKSB7CisgICAgICAgIG1TYW1wbGluZ1JhdGVzLmNsZWFyKCk7CisgICAgfQorfQorCiBzdGF0dXNfdCBBdWRpb1Byb2ZpbGU6OmNoZWNrRXhhY3QodWludDMyX3Qgc2FtcGxpbmdSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0CiB7CkBAIC0zOSwyNyArMTMxLDYgQEAKICAgICByZXR1cm4gQkFEX1ZBTFVFOwogfQogCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IFNvcnRlZFZlY3RvcjxUPiAmbGVmdCwgY29uc3QgU29ydGVkVmVjdG9yPFQ+ICZyaWdodCkKLXsKLSAgICBpZiAobGVmdC5zaXplKCkgIT0gcmlnaHQuc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZm9yKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcmlnaHQuc2l6ZSgpOyBpbmRleCsrKSB7Ci0gICAgICAgIGlmIChsZWZ0W2luZGV4XSAhPSByaWdodFtpbmRleF0pIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQXVkaW9Qcm9maWxlICZsZWZ0LCBjb25zdCBBdWRpb1Byb2ZpbGUgJmNvbXBhcmVUbykKLXsKLSAgICByZXR1cm4gKGxlZnQuZ2V0Rm9ybWF0KCkgPT0gY29tcGFyZVRvLmdldEZvcm1hdCgpKSAmJgotICAgICAgICAgICAgKGxlZnQuZ2V0Q2hhbm5lbHMoKSA9PSBjb21wYXJlVG8uZ2V0Q2hhbm5lbHMoKSkgJiYKLSAgICAgICAgICAgIChsZWZ0LmdldFNhbXBsZVJhdGVzKCkgPT0gY29tcGFyZVRvLmdldFNhbXBsZVJhdGVzKCkpOwotfQotCiBzdGF0dXNfdCBBdWRpb1Byb2ZpbGU6OmNoZWNrQ29tcGF0aWJsZVNhbXBsaW5nUmF0ZSh1aW50MzJfdCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmdXBkYXRlZFNhbXBsaW5nUmF0ZSkgY29uc3QKIHsKQEAgLTE4Miw0NyArMjUzLDc5IEBACiAgICAgcmV0dXJuIGJlc3RNYXRjaCA+IDAgPyBOT19FUlJPUiA6IEJBRF9WQUxVRTsKIH0KIAotdm9pZCBBdWRpb1Byb2ZpbGU6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdAordm9pZCBBdWRpb1Byb2ZpbGU6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJXMlcyVzXG4iLCBtSXNEeW5hbWljRm9ybWF0ID8gIltkeW5hbWljIGZvcm1hdF0iIDogIiIsCisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiVzJXMlc1xuIiwgbUlzRHluYW1pY0Zvcm1hdCA/ICJbZHluYW1pYyBmb3JtYXRdIiA6ICIiLAogICAgICAgICAgICAgIG1Jc0R5bmFtaWNDaGFubmVscyA/ICJbZHluYW1pYyBjaGFubmVsc10iIDogIiIsCiAgICAgICAgICAgICAgbUlzRHluYW1pY1JhdGUgPyAiW2R5bmFtaWMgcmF0ZXNdIiA6ICIiKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgaWYgKG1OYW1lLmxlbmd0aCgpICE9IDApIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBuYW1lOiAlc1xuIiwgc3BhY2VzLCAiIiwgbU5hbWUuc3RyaW5nKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIG5hbWU6ICVzXG4iLCBzcGFjZXMsICIiLCBtTmFtZS5zdHJpbmcoKSk7CiAgICAgfQogICAgIHN0ZDo6c3RyaW5nIGZvcm1hdExpdGVyYWw7CiAgICAgaWYgKEZvcm1hdENvbnZlcnRlcjo6dG9TdHJpbmcobUZvcm1hdCwgZm9ybWF0TGl0ZXJhbCkpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBmb3JtYXQ6ICVzXG4iLCBzcGFjZXMsICIiLCBmb3JtYXRMaXRlcmFsLmNfc3RyKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIGZvcm1hdDogJXNcbiIsIHNwYWNlcywgIiIsIGZvcm1hdExpdGVyYWwuY19zdHIoKSk7CiAgICAgfQogICAgIGlmICghbVNhbXBsaW5nUmF0ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gc2FtcGxpbmcgcmF0ZXM6Iiwgc3BhY2VzLCAiIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gc2FtcGxpbmcgcmF0ZXM6Iiwgc3BhY2VzLCAiIik7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNhbXBsaW5nUmF0ZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiVkIiwgbVNhbXBsaW5nUmF0ZXNbaV0pOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpID09IChtU2FtcGxpbmdSYXRlcy5zaXplKCkgLSAxKSA/ICIiIDogIiwgIik7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJWQiLCBtU2FtcGxpbmdSYXRlc1tpXSk7CisgICAgICAgICAgICBkc3QtPmFwcGVuZChpID09IChtU2FtcGxpbmdSYXRlcy5zaXplKCkgLSAxKSA/ICIiIDogIiwgIik7CiAgICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICAgICAgZHN0LT5hcHBlbmQoIlxuIik7CiAgICAgfQogCiAgICAgaWYgKCFtQ2hhbm5lbE1hc2tzLmlzRW1wdHkoKSkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGNoYW5uZWwgbWFza3M6Iiwgc3BhY2VzLCAiIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gY2hhbm5lbCBtYXNrczoiLCBzcGFjZXMsICIiKTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2hhbm5lbE1hc2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIweCUwNHgiLCBtQ2hhbm5lbE1hc2tzW2ldKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaSA9PSAobUNoYW5uZWxNYXNrcy5zaXplKCkgLSAxKSA/ICIiIDogIiwgIik7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiMHglMDR4IiwgbUNoYW5uZWxNYXNrc1tpXSk7CisgICAgICAgICAgICBkc3QtPmFwcGVuZChpID09IChtQ2hhbm5lbE1hc2tzLnNpemUoKSAtIDEpID8gIiIgOiAiLCAiKTsKICAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgICAgICBkc3QtPmFwcGVuZCgiXG4iKTsKICAgICB9Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Cit9CisKK3NzaXplX3QgQXVkaW9Qcm9maWxlVmVjdG9yOjphZGQoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmcHJvZmlsZSkKK3sKKyAgICBzc2l6ZV90IGluZGV4ID0gVmVjdG9yOjphZGQocHJvZmlsZSk7CisgICAgLy8gd2Ugc29ydCBmcm9tIHdvcnN0IHRvIGJlc3QsIHNvIHRoYXQgQVVESU9fRk9STUFUX0RFRkFVTFQgaXMgYWx3YXlzIHRoZSBmaXJzdCBlbnRyeS4KKyAgICAvLyBUT0RPOiBjb21wYXJlRm9ybWF0cyBjb3VsZCBiZSBhIGxhbWJkYSB0byBjb252ZXJ0IGJldHdlZW4gcG9pbnRlci10by1mb3JtYXQgdG8gZm9ybWF0OgorICAgIC8vIFtdKGNvbnN0IGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQxLCBjb25zdCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0MikgeworICAgIC8vICAgICByZXR1cm4gY29tcGFyZUZvcm1hdHMoKmZvcm1hdDEsICpmb3JtYXQyKTsKKyAgICAvLyB9CisgICAgc29ydChjb21wYXJlRm9ybWF0cyk7CisgICAgcmV0dXJuIGluZGV4OworfQorCitzc2l6ZV90IEF1ZGlvUHJvZmlsZVZlY3Rvcjo6YWRkUHJvZmlsZUZyb21IYWwoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmcHJvZmlsZVRvQWRkKQoreworICAgIC8vIENoZWNrIHZhbGlkIHByb2ZpbGUgdG8gYWRkOgorICAgIGlmICghcHJvZmlsZVRvQWRkLT5oYXNWYWxpZEZvcm1hdCgpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFwcm9maWxlVG9BZGQtPmhhc1ZhbGlkQ2hhbm5lbHMoKSAmJiAhcHJvZmlsZVRvQWRkLT5oYXNWYWxpZFJhdGVzKCkpIHsKKyAgICAgICAgRm9ybWF0VmVjdG9yIGZvcm1hdHM7CisgICAgICAgIGZvcm1hdHMuYWRkKHByb2ZpbGVUb0FkZC0+Z2V0Rm9ybWF0KCkpOworICAgICAgICBzZXRGb3JtYXRzKEZvcm1hdFZlY3Rvcihmb3JtYXRzKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoIXByb2ZpbGVUb0FkZC0+aGFzVmFsaWRDaGFubmVscygpICYmIHByb2ZpbGVUb0FkZC0+aGFzVmFsaWRSYXRlcygpKSB7CisgICAgICAgIHNldFNhbXBsZVJhdGVzRm9yKHByb2ZpbGVUb0FkZC0+Z2V0U2FtcGxlUmF0ZXMoKSwgcHJvZmlsZVRvQWRkLT5nZXRGb3JtYXQoKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAocHJvZmlsZVRvQWRkLT5oYXNWYWxpZENoYW5uZWxzKCkgJiYgIXByb2ZpbGVUb0FkZC0+aGFzVmFsaWRSYXRlcygpKSB7CisgICAgICAgIHNldENoYW5uZWxzRm9yKHByb2ZpbGVUb0FkZC0+Z2V0Q2hhbm5lbHMoKSwgcHJvZmlsZVRvQWRkLT5nZXRGb3JtYXQoKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvLyBHbyB0aHJvdWdoIHRoZSBsaXN0IG9mIHByb2ZpbGUgdG8gYXZvaWQgZHVwbGljYXRlcworICAgIGZvciAoc2l6ZV90IHByb2ZpbGVJbmRleCA9IDA7IHByb2ZpbGVJbmRleCA8IHNpemUoKTsgcHJvZmlsZUluZGV4KyspIHsKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmcHJvZmlsZSA9IGl0ZW1BdChwcm9maWxlSW5kZXgpOworICAgICAgICBpZiAocHJvZmlsZS0+aXNWYWxpZCgpICYmIHByb2ZpbGUgPT0gcHJvZmlsZVRvQWRkKSB7CisgICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGRvCisgICAgICAgICAgICByZXR1cm4gcHJvZmlsZUluZGV4OworICAgICAgICB9CisgICAgfQorICAgIHByb2ZpbGVUb0FkZC0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsgLy8gc2V0IHRoZSBmb3JtYXQgYXMgZHluYW1pYyB0byBhbGxvdyByZW1vdmFsCisgICAgcmV0dXJuIGFkZChwcm9maWxlVG9BZGQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1Byb2ZpbGVWZWN0b3I6OmNoZWNrRXhhY3RQcm9maWxlKHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKQEAgLTI4MSw2ICszODQsMjI4IEBACiAgICAgcmV0dXJuIEJBRF9WQUxVRTsKIH0KIAordm9pZCBBdWRpb1Byb2ZpbGVWZWN0b3I6OmNsZWFyUHJvZmlsZXMoKQoreworICAgIGZvciAoc2l6ZV90IGkgPSBzaXplKCk7IGkgIT0gMDsgKSB7CisgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IGl0ZW1BdCgtLWkpOworICAgICAgICBpZiAocHJvZmlsZS0+aXNEeW5hbWljRm9ybWF0KCkgJiYgcHJvZmlsZS0+aGFzVmFsaWRGb3JtYXQoKSkgeworICAgICAgICAgICAgcmVtb3ZlQXQoaSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBwcm9maWxlLT5jbGVhcigpOworICAgIH0KK30KKworLy8gUmV0dXJucyBhbiBpbnRlcnNlY3Rpb24gYmV0d2VlbiB0d28gcG9zc2libHkgdW5zb3J0ZWQgdmVjdG9ycyBhbmQgdGhlIGNvbnRlbnRzIG9mICdvcmRlcicuCisvLyBUaGUgcmVzdWx0IGlzIG9yZGVyZWQgYWNjb3JkaW5nIHRvICdvcmRlcicuCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBPcmRlcj4KK3N0ZDo6dmVjdG9yPHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGU+IGludGVyc2VjdEZpbHRlckFuZE9yZGVyKAorICAgICAgICBjb25zdCBUJiBpbnB1dDEsIGNvbnN0IFQmIGlucHV0MiwgY29uc3QgT3JkZXImIG9yZGVyKQoreworICAgIHN0ZDo6c2V0PHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGU+IHNldDF7aW5wdXQxLmJlZ2luKCksIGlucHV0MS5lbmQoKX07CisgICAgc3RkOjpzZXQ8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZT4gc2V0MntpbnB1dDIuYmVnaW4oKSwgaW5wdXQyLmVuZCgpfTsKKyAgICBzdGQ6OnNldDx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlPiBjb21tb247CisgICAgc3RkOjpzZXRfaW50ZXJzZWN0aW9uKHNldDEuYmVnaW4oKSwgc2V0MS5lbmQoKSwgc2V0Mi5iZWdpbigpLCBzZXQyLmVuZCgpLAorICAgICAgICAgICAgc3RkOjppbnNlcnRlcihjb21tb24sIGNvbW1vbi5iZWdpbigpKSk7CisgICAgc3RkOjp2ZWN0b3I8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZT4gcmVzdWx0OworICAgIGZvciAoY29uc3QgYXV0byYgZSA6IG9yZGVyKSB7CisgICAgICAgIGlmIChjb21tb24uZmluZChlKSAhPSBjb21tb24uZW5kKCkpIHJlc3VsdC5wdXNoX2JhY2soZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIEludGVyc2VjdCB0d28gcG9zc2libHkgdW5zb3J0ZWQgdmVjdG9ycywgcmV0dXJuIGNvbW1vbiBlbGVtZW50cyBhY2NvcmRpbmcgdG8gJ2NvbXAnIG9yZGVyaW5nLgorLy8gJ2NvbXAnIGlzIGEgY29tcGFyYXRvciBmdW5jdGlvbi4KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIENvbXBhcmU+CitzdGQ6OnZlY3Rvcjx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlPiBpbnRlcnNlY3RBbmRPcmRlcigKKyAgICAgICAgY29uc3QgVCYgaW5wdXQxLCBjb25zdCBUJiBpbnB1dDIsIENvbXBhcmUgY29tcCkKK3sKKyAgICBzdGQ6OnNldDx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlLCBDb21wYXJlPiBzZXQxe2lucHV0MS5iZWdpbigpLCBpbnB1dDEuZW5kKCksIGNvbXB9OworICAgIHN0ZDo6c2V0PHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGUsIENvbXBhcmU+IHNldDJ7aW5wdXQyLmJlZ2luKCksIGlucHV0Mi5lbmQoKSwgY29tcH07CisgICAgc3RkOjp2ZWN0b3I8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZT4gcmVzdWx0OworICAgIHN0ZDo6c2V0X2ludGVyc2VjdGlvbihzZXQxLmJlZ2luKCksIHNldDEuZW5kKCksIHNldDIuYmVnaW4oKSwgc2V0Mi5lbmQoKSwKKyAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcihyZXN1bHQpLCBjb21wKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0dXNfdCBBdWRpb1Byb2ZpbGVWZWN0b3I6OmZpbmRCZXN0TWF0Y2hpbmdPdXRwdXRDb25maWcoY29uc3QgQXVkaW9Qcm9maWxlVmVjdG9yJiBvdXRwdXRQcm9maWxlcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiYgcHJlZmVycmVkRm9ybWF0cywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGF1ZGlvX2NoYW5uZWxfbWFza190PiYgcHJlZmVycmVkT3V0cHV0Q2hhbm5lbHMsCisgICAgICAgICAgICBib29sIHByZWZlckhpZ2hlclNhbXBsaW5nUmF0ZXMsCisgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZSAqYmVzdE91dHB1dENvbmZpZykgY29uc3QKK3sKKyAgICBhdXRvIGZvcm1hdHMgPSBpbnRlcnNlY3RGaWx0ZXJBbmRPcmRlcihnZXRTdXBwb3J0ZWRGb3JtYXRzKCksCisgICAgICAgICAgICBvdXRwdXRQcm9maWxlcy5nZXRTdXBwb3J0ZWRGb3JtYXRzKCksIHByZWZlcnJlZEZvcm1hdHMpOworICAgIC8vIFBpY2sgdGhlIGJlc3QgY29tcGF0aWJsZSBwcm9maWxlLgorICAgIGZvciAoY29uc3QgYXV0byYgZiA6IGZvcm1hdHMpIHsKKyAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBpbnB1dFByb2ZpbGUgPSBnZXRGaXJzdFZhbGlkUHJvZmlsZUZvcihmKTsKKyAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBvdXRwdXRQcm9maWxlID0gb3V0cHV0UHJvZmlsZXMuZ2V0Rmlyc3RWYWxpZFByb2ZpbGVGb3IoZik7CisgICAgICAgIGlmIChpbnB1dFByb2ZpbGUgPT0gbnVsbHB0ciB8fCBvdXRwdXRQcm9maWxlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGF1dG8gY2hhbm5lbHMgPSBpbnRlcnNlY3RGaWx0ZXJBbmRPcmRlcihpbnB1dFByb2ZpbGUtPmdldENoYW5uZWxzKCkuYXNPdXRNYXNrKCksCisgICAgICAgICAgICAgICAgb3V0cHV0UHJvZmlsZS0+Z2V0Q2hhbm5lbHMoKSwgcHJlZmVycmVkT3V0cHV0Q2hhbm5lbHMpOworICAgICAgICBpZiAoY2hhbm5lbHMuZW1wdHkoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgYXV0byBzYW1wbGVSYXRlcyA9IHByZWZlckhpZ2hlclNhbXBsaW5nUmF0ZXMgPworICAgICAgICAgICAgICAgIGludGVyc2VjdEFuZE9yZGVyKGlucHV0UHJvZmlsZS0+Z2V0U2FtcGxlUmF0ZXMoKSwgb3V0cHV0UHJvZmlsZS0+Z2V0U2FtcGxlUmF0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Z3JlYXRlcjx0eXBlbmFtZSBTYW1wbGVSYXRlVmVjdG9yOjp2YWx1ZV90eXBlPigpKSA6CisgICAgICAgICAgICAgICAgaW50ZXJzZWN0QW5kT3JkZXIoaW5wdXRQcm9maWxlLT5nZXRTYW1wbGVSYXRlcygpLCBvdXRwdXRQcm9maWxlLT5nZXRTYW1wbGVSYXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsZXNzPHR5cGVuYW1lIFNhbXBsZVJhdGVWZWN0b3I6OnZhbHVlX3R5cGU+KCkpOworICAgICAgICBpZiAoc2FtcGxlUmF0ZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQUxPR0QoIiVzKCkgZm91bmQgY2hhbm5lbCBtYXNrICUjeCBhbmQgc2FtcGxlIHJhdGUgJWQgZm9yIGZvcm1hdCAlI3guIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgKmNoYW5uZWxzLmJlZ2luKCksICpzYW1wbGVSYXRlcy5iZWdpbigpLCBmKTsKKyAgICAgICAgYmVzdE91dHB1dENvbmZpZy0+Zm9ybWF0ID0gZjsKKyAgICAgICAgYmVzdE91dHB1dENvbmZpZy0+c2FtcGxlX3JhdGUgPSAqc2FtcGxlUmF0ZXMuYmVnaW4oKTsKKyAgICAgICAgYmVzdE91dHB1dENvbmZpZy0+Y2hhbm5lbF9tYXNrID0gKmNoYW5uZWxzLmJlZ2luKCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworc3A8QXVkaW9Qcm9maWxlPiBBdWRpb1Byb2ZpbGVWZWN0b3I6OmdldEZpcnN0VmFsaWRQcm9maWxlKCkgY29uc3QKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpdGVtQXQoaSktPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIGl0ZW1BdChpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3A8QXVkaW9Qcm9maWxlPiBBdWRpb1Byb2ZpbGVWZWN0b3I6OmdldEZpcnN0VmFsaWRQcm9maWxlRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3QKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpdGVtQXQoaSktPmlzVmFsaWQoKSAmJiBpdGVtQXQoaSktPmdldEZvcm1hdCgpID09IGZvcm1hdCkgeworICAgICAgICAgICAgcmV0dXJuIGl0ZW1BdChpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworRm9ybWF0VmVjdG9yIEF1ZGlvUHJvZmlsZVZlY3Rvcjo6Z2V0U3VwcG9ydGVkRm9ybWF0cygpIGNvbnN0Cit7CisgICAgRm9ybWF0VmVjdG9yIHN1cHBvcnRlZEZvcm1hdHM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaXRlbUF0KGkpLT5oYXNWYWxpZEZvcm1hdCgpKSB7CisgICAgICAgICAgICBzdXBwb3J0ZWRGb3JtYXRzLmFkZChpdGVtQXQoaSktPmdldEZvcm1hdCgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3VwcG9ydGVkRm9ybWF0czsKK30KKworYm9vbCBBdWRpb1Byb2ZpbGVWZWN0b3I6Omhhc0R5bmFtaWNDaGFubmVsc0ZvcihhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBpdGVtQXQoaSk7CisgICAgICAgIGlmIChwcm9maWxlLT5nZXRGb3JtYXQoKSA9PSBmb3JtYXQgJiYgcHJvZmlsZS0+aXNEeW5hbWljQ2hhbm5lbHMoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEF1ZGlvUHJvZmlsZVZlY3Rvcjo6aGFzRHluYW1pY1Byb2ZpbGUoKSBjb25zdAoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGl0ZW1BdChpKS0+aXNEeW5hbWljKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBdWRpb1Byb2ZpbGVWZWN0b3I6Omhhc0R5bmFtaWNSYXRlRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3QKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IGl0ZW1BdChpKTsKKyAgICAgICAgaWYgKHByb2ZpbGUtPmdldEZvcm1hdCgpID09IGZvcm1hdCAmJiBwcm9maWxlLT5pc0R5bmFtaWNSYXRlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBBdWRpb1Byb2ZpbGVWZWN0b3I6OnNldEZvcm1hdHMoY29uc3QgRm9ybWF0VmVjdG9yICZmb3JtYXRzKQoreworICAgIC8vIE9ubHkgYWxsb3cgdG8gY2hhbmdlIHRoZSBmb3JtYXQgb2YgZHluYW1pYyBwcm9maWxlCisgICAgc3A8QXVkaW9Qcm9maWxlPiBkeW5hbWljRm9ybWF0UHJvZmlsZSA9IGdldFByb2ZpbGVGb3IoZ0R5bmFtaWNGb3JtYXQpOworICAgIGlmIChkeW5hbWljRm9ybWF0UHJvZmlsZSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmb3JtYXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoZm9ybWF0c1tpXSwKKyAgICAgICAgICAgICAgICBkeW5hbWljRm9ybWF0UHJvZmlsZS0+Z2V0Q2hhbm5lbHMoKSwKKyAgICAgICAgICAgICAgICBkeW5hbWljRm9ybWF0UHJvZmlsZS0+Z2V0U2FtcGxlUmF0ZXMoKSk7CisgICAgICAgIHByb2ZpbGUtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7CisgICAgICAgIHByb2ZpbGUtPnNldER5bmFtaWNDaGFubmVscyhkeW5hbWljRm9ybWF0UHJvZmlsZS0+aXNEeW5hbWljQ2hhbm5lbHMoKSk7CisgICAgICAgIHByb2ZpbGUtPnNldER5bmFtaWNSYXRlKGR5bmFtaWNGb3JtYXRQcm9maWxlLT5pc0R5bmFtaWNSYXRlKCkpOworICAgICAgICBhZGQocHJvZmlsZSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUHJvZmlsZVZlY3Rvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gUHJvZmlsZXM6XG4iLCBzcGFjZXMsICIiKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNQcm9maWxlICV6dToiLCBzcGFjZXMgKyA0LCAiIiwgaSk7CisgICAgICAgIGl0ZW1BdChpKS0+ZHVtcChkc3QsIHNwYWNlcyArIDgpOworICAgIH0KK30KKworc3A8QXVkaW9Qcm9maWxlPiBBdWRpb1Byb2ZpbGVWZWN0b3I6OmdldFByb2ZpbGVGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdAoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGl0ZW1BdChpKS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0KSB7CisgICAgICAgICAgICByZXR1cm4gaXRlbUF0KGkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCit2b2lkIEF1ZGlvUHJvZmlsZVZlY3Rvcjo6c2V0U2FtcGxlUmF0ZXNGb3IoCisgICAgICAgIGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJnNhbXBsZVJhdGVzLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBpdGVtQXQoaSk7CisgICAgICAgIGlmIChwcm9maWxlLT5nZXRGb3JtYXQoKSA9PSBmb3JtYXQgJiYgcHJvZmlsZS0+aXNEeW5hbWljUmF0ZSgpKSB7CisgICAgICAgICAgICBpZiAocHJvZmlsZS0+aGFzVmFsaWRSYXRlcygpKSB7CisgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBjcmVhdGUgYSBuZXcgcHJvZmlsZSB3aXRoIHNhbWUgZm9ybWF0CisgICAgICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlVG9BZGQgPSBuZXcgQXVkaW9Qcm9maWxlKGZvcm1hdCwgcHJvZmlsZS0+Z2V0Q2hhbm5lbHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGVzKTsKKyAgICAgICAgICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7IC8vIG5lZWQgdG8gc2V0IHRvIGFsbG93IGNsZWFuaW5nCisgICAgICAgICAgICAgICAgYWRkKHByb2ZpbGVUb0FkZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByb2ZpbGUtPnNldFNhbXBsZVJhdGVzKHNhbXBsZVJhdGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb1Byb2ZpbGVWZWN0b3I6OnNldENoYW5uZWxzRm9yKGNvbnN0IENoYW5uZWxzVmVjdG9yICZjaGFubmVsTWFza3MsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IGl0ZW1BdChpKTsKKyAgICAgICAgaWYgKHByb2ZpbGUtPmdldEZvcm1hdCgpID09IGZvcm1hdCAmJiBwcm9maWxlLT5pc0R5bmFtaWNDaGFubmVscygpKSB7CisgICAgICAgICAgICBpZiAocHJvZmlsZS0+aGFzVmFsaWRDaGFubmVscygpKSB7CisgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBjcmVhdGUgYSBuZXcgcHJvZmlsZSB3aXRoIHNhbWUgZm9ybWF0CisgICAgICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlVG9BZGQgPSBuZXcgQXVkaW9Qcm9maWxlKGZvcm1hdCwgY2hhbm5lbE1hc2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+Z2V0U2FtcGxlUmF0ZXMoKSk7CisgICAgICAgICAgICAgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOyAvLyBuZWVkIHRvIHNldCB0byBhbGxvdyBjbGVhbmluZworICAgICAgICAgICAgICAgIGFkZChwcm9maWxlVG9BZGQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcm9maWxlLT5zZXRDaGFubmVscyhjaGFubmVsTWFza3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorCisvLyBzdGF0aWMKIGludCBBdWRpb1Byb2ZpbGVWZWN0b3I6OmNvbXBhcmVGb3JtYXRzKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gKnByb2ZpbGUxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAqcHJvZmlsZTIpCiB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1JvdXRlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUm91dGUuY3BwCmluZGV4IDc5YWQxZjcuLjc5ZjA5MTkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUm91dGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUm91dGUuY3BwCkBAIC0yNCwyOSArMjQsMzIgQEAKIG5hbWVzcGFjZSBhbmRyb2lkCiB7CiAKLXZvaWQgQXVkaW9Sb3V0ZTo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0Cit2b2lkIEF1ZGlvUm91dGU6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBUeXBlOiAlc1xuIiwgc3BhY2VzLCAiIiwgbVR5cGUgPT0gQVVESU9fUk9VVEVfTVVYID8gIk11eCIgOiAiTWl4Iik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBTaW5rOiAlc1xuIiwgc3BhY2VzLCAiIiwgbVNpbmstPmdldFRhZ05hbWUoKS5zdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gVHlwZTogJXNcbiIsIHNwYWNlcywgIiIsIG1UeXBlID09IEFVRElPX1JPVVRFX01VWCA/ICJNdXgiIDogIk1peCIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFNpbms6ICVzXG4iLCBzcGFjZXMsICIiLCBtU2luay0+Z2V0VGFnTmFtZSgpLnN0cmluZygpKTsKICAgICBpZiAobVNvdXJjZXMuc2l6ZSgpICE9IDApIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBTb3VyY2VzOiBcbiIsIHNwYWNlcywgIiIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFNvdXJjZXM6IFxuIiwgc3BhY2VzLCAiIik7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcyVzIFxuIiwgc3BhY2VzICsgNCwgIiIsIG1Tb3VyY2VzW2ldLT5nZXRUYWdOYW1lKCkuc3RyaW5nKCkpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyVzIFxuIiwgc3BhY2VzICsgNCwgIiIsIG1Tb3VyY2VzW2ldLT5nZXRUYWdOYW1lKCkuc3RyaW5nKCkpOwogICAgICAgICB9CiAgICAgfQotICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgZHN0LT5hcHBlbmQoIlxuIik7Cit9CiAKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKK2Jvb2wgQXVkaW9Sb3V0ZTo6c3VwcG9ydHNQYXRjaChjb25zdCBzcDxBdWRpb1BvcnQ+ICZzcmNQb3J0LCBjb25zdCBzcDxBdWRpb1BvcnQ+ICZkc3RQb3J0KSBjb25zdAoreworICAgIGlmIChtU2luayA9PSAwIHx8IGRzdFBvcnQgPT0gMCB8fCBkc3RQb3J0ICE9IG1TaW5rKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQUxPR1YoIiVzOiBzaW5rcyAlcyBtYXRjaGluZyIsIF9fRlVOQ1RJT05fXywgbVNpbmstPmdldFRhZ05hbWUoKS5zdHJpbmcoKSk7CisgICAgZm9yIChjb25zdCBhdXRvICZzb3VyY2VQb3J0IDogbVNvdXJjZXMpIHsKKyAgICAgICAgaWYgKHNvdXJjZVBvcnQgPT0gc3JjUG9ydCkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBzb3VyY2VzICVzIG1hdGNoaW5nIiwgX19GVU5DVElPTl9fLCBzb3VyY2VQb3J0LT5nZXRUYWdOYW1lKCkuc3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Nlc3Npb24uY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9TZXNzaW9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NkYTQ2Yi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Nlc3Npb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9TZXNzaW9uIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8QXVkaW9Qb2xpY3lJbnRlcmZhY2UuaD4KLSNpbmNsdWRlICJwb2xpY3kuaCIKLSNpbmNsdWRlICJBdWRpb1Nlc3Npb24uaCIKLSNpbmNsdWRlICJBdWRpb0dhaW4uaCIKLSNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCi0KLSNpbmNsdWRlIDxsb2cvbG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLUF1ZGlvU2Vzc2lvbjo6QXVkaW9TZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NvdW5kVHJpZ2dlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4KiBwb2xpY3lNaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKSA6Ci0gICAgbVJlY29yZENsaWVudEluZm8oeyAudWlkID0gdWlkLCAuc2Vzc2lvbiA9IHNlc3Npb24sIC5zb3VyY2UgPSBpbnB1dFNvdXJjZX0pLAotICAgIG1Db25maWcoeyAuZm9ybWF0ID0gZm9ybWF0LCAuc2FtcGxlX3JhdGUgPSBzYW1wbGVSYXRlLCAuY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2t9KSwKLSAgICBtRmxhZ3MoZmxhZ3MpLCBtSXNTb3VuZFRyaWdnZXIoaXNTb3VuZFRyaWdnZXIpLAotICAgIG1PcGVuQ291bnQoMSksIG1BY3RpdmVDb3VudCgwKSwgbVBvbGljeU1peChwb2xpY3lNaXgpLCBtQ2xpZW50SW50ZXJmYWNlKGNsaWVudEludGVyZmFjZSksCi0gICAgbUluZm9Qcm92aWRlcihOVUxMKQotewotfQotCi11aW50MzJfdCBBdWRpb1Nlc3Npb246OmNoYW5nZU9wZW5Db3VudChpbnQgZGVsdGEpCi17Ci0gICAgaWYgKChkZWx0YSArIChpbnQpbU9wZW5Db3VudCkgPCAwKSB7Ci0gICAgICAgIEFMT0dXKCIlcyBpbnZhbGlkIGRlbHRhICVkLCBvcGVuIGNvdW50ICVkIiwKLSAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZWx0YSwgbU9wZW5Db3VudCk7Ci0gICAgICAgIG1PcGVuQ291bnQgPSAodWludDMyX3QpKC1kZWx0YSk7Ci0gICAgfQotICAgIG1PcGVuQ291bnQgKz0gZGVsdGE7Ci0gICAgQUxPR1YoIiVzIG9wZW4gY291bnQgJWQiLCBfX0ZVTkNUSU9OX18sIG1PcGVuQ291bnQpOwotICAgIHJldHVybiBtT3BlbkNvdW50OwotfQotCi11aW50MzJfdCBBdWRpb1Nlc3Npb246OmNoYW5nZUFjdGl2ZUNvdW50KGludCBkZWx0YSkKLXsKLSAgICBjb25zdCB1aW50MzJfdCBvbGRBY3RpdmVDb3VudCA9IG1BY3RpdmVDb3VudDsKLSAgICBpZiAoKGRlbHRhICsgKGludCltQWN0aXZlQ291bnQpIDwgMCkgewotICAgICAgICBBTE9HVygiJXMgaW52YWxpZCBkZWx0YSAlZCwgYWN0aXZlIGNvdW50ICVkIiwKLSAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZWx0YSwgbUFjdGl2ZUNvdW50KTsKLSAgICAgICAgbUFjdGl2ZUNvdW50ID0gKHVpbnQzMl90KSgtZGVsdGEpOwotICAgIH0KLSAgICBtQWN0aXZlQ291bnQgKz0gZGVsdGE7Ci0gICAgQUxPR1YoIiVzIGFjdGl2ZSBjb3VudCAlZCIsIF9fRlVOQ1RJT05fXywgbUFjdGl2ZUNvdW50KTsKLSAgICBpbnQgZXZlbnQgPSBSRUNPUkRfQ09ORklHX0VWRU5UX05PTkU7Ci0KLSAgICBpZiAoKG9sZEFjdGl2ZUNvdW50ID09IDApICYmIChtQWN0aXZlQ291bnQgPiAwKSkgewotICAgICAgICBldmVudCA9IFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQ7Ci0gICAgfSBlbHNlIGlmICgob2xkQWN0aXZlQ291bnQgPiAwKSAmJiAobUFjdGl2ZUNvdW50ID09IDApKSB7Ci0gICAgICAgIGV2ZW50ID0gUkVDT1JEX0NPTkZJR19FVkVOVF9TVE9QOwotICAgIH0KLQotICAgIGlmIChldmVudCAhPSBSRUNPUkRfQ09ORklHX0VWRU5UX05PTkUpIHsKLSAgICAgICAgLy8gRHluYW1pYyBwb2xpY3kgY2FsbGJhY2s6Ci0gICAgICAgIC8vIGlmIGlucHV0IG1hcHMgdG8gYSBkeW5hbWljIHBvbGljeSB3aXRoIGFuIGFjdGl2aXR5IGxpc3RlbmVyLCBub3RpZnkgb2Ygc3RhdGUgY2hhbmdlCi0gICAgICAgIGlmICgobVBvbGljeU1peCAhPSBOVUxMKSAmJiAoKG1Qb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKG1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAoZXZlbnQgPT0gUkVDT1JEX0NPTkZJR19FVkVOVF9TVEFSVCkgPyBNSVhfU1RBVEVfTUlYSU5HIDogTUlYX1NUQVRFX0lETEUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVjb3JkaW5nIGNvbmZpZ3VyYXRpb24gY2FsbGJhY2s6Ci0gICAgICAgIGNvbnN0IEF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlciogcHJvdmlkZXIgPSBtSW5mb1Byb3ZpZGVyOwotICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90IGRldmljZUNvbmZpZyA9IChwcm92aWRlciAhPSBOVUxMKSA/IHByb3ZpZGVyLT5nZXRDb25maWcoKSA6Ci0gICAgICAgICAgICAgICAgQVVESU9fQ09ORklHX0JBU0VfSU5JVElBTElaRVI7Ci0gICAgICAgIGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlID0gKHByb3ZpZGVyICE9IE5VTEwpID8gcHJvdmlkZXItPmdldFBhdGNoSGFuZGxlKCkgOgotICAgICAgICAgICAgICAgIEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgICAgICBpZiAocGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgJm1SZWNvcmRDbGllbnRJbmZvLAotICAgICAgICAgICAgICAgICAgICAmbUNvbmZpZywgJmRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG1BY3RpdmVDb3VudDsKLX0KLQotYm9vbCBBdWRpb1Nlc3Npb246Om1hdGNoZXMoY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiAmb3RoZXIpIGNvbnN0Ci17Ci0gICAgaWYgKG90aGVyLT5zZXNzaW9uKCkgPT0gbVJlY29yZENsaWVudEluZm8uc2Vzc2lvbiAmJgotICAgICAgICBvdGhlci0+aW5wdXRTb3VyY2UoKSA9PSBtUmVjb3JkQ2xpZW50SW5mby5zb3VyY2UgJiYKLSAgICAgICAgb3RoZXItPmZvcm1hdCgpID09IG1Db25maWcuZm9ybWF0ICYmCi0gICAgICAgIG90aGVyLT5zYW1wbGVSYXRlKCkgPT0gbUNvbmZpZy5zYW1wbGVfcmF0ZSAmJgotICAgICAgICBvdGhlci0+Y2hhbm5lbE1hc2soKSA9PSBtQ29uZmlnLmNoYW5uZWxfbWFzayAmJgotICAgICAgICBvdGhlci0+ZmxhZ3MoKSA9PSBtRmxhZ3MgJiYKLSAgICAgICAgb3RoZXItPnVpZCgpID09IG1SZWNvcmRDbGllbnRJbmZvLnVpZCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIEF1ZGlvU2Vzc2lvbjo6c2V0SW5mb1Byb3ZpZGVyKEF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlciAqcHJvdmlkZXIpCi17Ci0gICAgbUluZm9Qcm92aWRlciA9IHByb3ZpZGVyOwotfQotCi12b2lkIEF1ZGlvU2Vzc2lvbjo6b25TZXNzaW9uSW5mb1VwZGF0ZSgpIGNvbnN0Ci17Ci0gICAgaWYgKG1BY3RpdmVDb3VudCA+IDApIHsKLSAgICAgICAgLy8gcmVzZW5kIHRoZSBjYWxsYmFjayBhZnRlciByZXF1ZXJ5aW5nIHRoZSBpbmZvcm1hdGlvbnMgZnJvbSB0aGUgaW5mbyBwcm92aWRlcgotICAgICAgICBjb25zdCBBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIqIHByb3ZpZGVyID0gbUluZm9Qcm92aWRlcjsKLSAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCBkZXZpY2VDb25maWcgPSAocHJvdmlkZXIgIT0gTlVMTCkgPyBwcm92aWRlci0+Z2V0Q29uZmlnKCkgOgotICAgICAgICAgICAgICAgIEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSOwotICAgICAgICBjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSA9IChwcm92aWRlciAhPSBOVUxMKSA/IHByb3ZpZGVyLT5nZXRQYXRjaEhhbmRsZSgpIDoKLSAgICAgICAgICAgICAgICBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgaWYgKHBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoUkVDT1JEX0NPTkZJR19FVkVOVF9TVEFSVCwKLSAgICAgICAgICAgICAgICAgICAgJm1SZWNvcmRDbGllbnRJbmZvLCAmbUNvbmZpZywgJmRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb1Nlc3Npb246OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNBdWRpbyBzZXNzaW9uICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gc2Vzc2lvbjogJTJkXG4iLCBzcGFjZXMsICIiLCBtUmVjb3JkQ2xpZW50SW5mby5zZXNzaW9uKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBvd25lciB1aWQ6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbVJlY29yZENsaWVudEluZm8udWlkKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBpbnB1dCBzb3VyY2U6ICVkXG4iLCBzcGFjZXMsICIiLCBtUmVjb3JkQ2xpZW50SW5mby5zb3VyY2UpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGZvcm1hdDogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbUNvbmZpZy5mb3JtYXQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHNhbXBsZTogJWRcbiIsIHNwYWNlcywgIiIsIG1Db25maWcuc2FtcGxlX3JhdGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGNoYW5uZWwgbWFzazogJTA4eFxuIiwKLSAgICAgICAgICAgICBzcGFjZXMsICIiLCBtQ29uZmlnLmNoYW5uZWxfbWFzayk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gaXMgc291bmR0cmlnZ2VyOiAlc1xuIiwKLSAgICAgICAgICAgICBzcGFjZXMsICIiLCBtSXNTb3VuZFRyaWdnZXIgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBvcGVuIGNvdW50OiAlZFxuIiwgc3BhY2VzLCAiIiwgbU9wZW5Db3VudCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gYWN0aXZlIGNvdW50OiAlZFxuIiwgc3BhY2VzLCAiIiwgbUFjdGl2ZUNvdW50KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb246OmFkZFNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4mIGF1ZGlvU2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyICpwcm92aWRlcikKLXsKLSAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShzZXNzaW9uKTsKLQotICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIEFMT0dXKCJhZGRTZXNzaW9uKCkgc2Vzc2lvbiAlZCBhbHJlYWR5IGluIiwgc2Vzc2lvbik7Ci0gICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKLSAgICB9Ci0gICAgYXVkaW9TZXNzaW9uLT5zZXRJbmZvUHJvdmlkZXIocHJvdmlkZXIpOwotICAgIGFkZChzZXNzaW9uLCBhdWRpb1Nlc3Npb24pOwotICAgIEFMT0dWKCJhZGRTZXNzaW9uKCkgc2Vzc2lvbiAlZCAgY2xpZW50ICVkIHNvdXJjZSAlZCIsCi0gICAgICAgICAgICBzZXNzaW9uLCBhdWRpb1Nlc3Npb24tPnVpZCgpLCBhdWRpb1Nlc3Npb24tPmlucHV0U291cmNlKCkpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6cmVtb3ZlU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKLXsKLSAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShzZXNzaW9uKTsKLQotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInJlbW92ZVNlc3Npb24oKSBzZXNzaW9uICVkIG5vdCBpbiIsIHNlc3Npb24pOwotICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7Ci0gICAgfQotICAgIEFMT0dWKCJyZW1vdmVTZXNzaW9uKCkgc2Vzc2lvbiAlZCIsIHNlc3Npb24pOwotICAgIHZhbHVlQXQoaW5kZXgpLT5zZXRJbmZvUHJvdmlkZXIoTlVMTCk7Ci0gICAgcmVtb3ZlSXRlbXNBdChpbmRleCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi11aW50MzJfdCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjpnZXRPcGVuQ291bnQoKSBjb25zdAotewotICAgIHVpbnQzMl90IG9wZW5Db3VudCA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBvcGVuQ291bnQgKz0gdmFsdWVBdChpKS0+b3BlbkNvdW50KCk7Ci0gICAgfQotICAgIHJldHVybiBvcGVuQ291bnQ7Ci19Ci0KLUF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6Z2V0QWN0aXZlU2Vzc2lvbnMoKSBjb25zdAotewotICAgIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gYWN0aXZlU2Vzc2lvbnM7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBpZiAodmFsdWVBdChpKS0+YWN0aXZlQ291bnQoKSAhPSAwKSB7Ci0gICAgICAgICAgICBhY3RpdmVTZXNzaW9ucy5hZGQodmFsdWVBdChpKS0+c2Vzc2lvbigpLCB2YWx1ZUF0KGkpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYWN0aXZlU2Vzc2lvbnM7Ci19Ci0KLXNpemVfdCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjpnZXRBY3RpdmVTZXNzaW9uQ291bnQoKSBjb25zdAotewotICAgIHNpemVfdCBhY3RpdmVDb3VudCA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBpZiAodmFsdWVBdChpKS0+YWN0aXZlQ291bnQoKSAhPSAwKSB7Ci0gICAgICAgICAgICBhY3RpdmVDb3VudCsrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBhY3RpdmVDb3VudDsKLX0KLQotYm9vbCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjpoYXNBY3RpdmVTZXNzaW9uKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QWN0aXZlU2Vzc2lvbkNvdW50KCkgIT0gMDsKLX0KLQotYm9vbCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjppc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0Ci17Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBjb25zdCBzcDxBdWRpb1Nlc3Npb24+ICBhdWRpb1Nlc3Npb24gPSB2YWx1ZUF0KGkpOwotICAgICAgICAvLyBBVURJT19TT1VSQ0VfSE9UV09SRCBpcyBlcXVpdmFsZW50IHRvIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiBvbmx5IGlmIGl0Ci0gICAgICAgIC8vIGNvcnJlc3BvbmRzIHRvIGFuIGFjdGl2ZSBjYXB0dXJlIHRyaWdnZXJlZCBieSBhIGhhcmR3YXJlIGhvdHdvcmQgcmVjb2duaXRpb24KLSAgICAgICAgaWYgKGF1ZGlvU2Vzc2lvbi0+YWN0aXZlQ291bnQoKSA+IDAgJiYKLSAgICAgICAgICAgICAgICAoKGF1ZGlvU2Vzc2lvbi0+aW5wdXRTb3VyY2UoKSA9PSBzb3VyY2UpIHx8Ci0gICAgICAgICAgICAgICAgKChzb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OKSAmJgotICAgICAgICAgICAgICAgICAoYXVkaW9TZXNzaW9uLT5pbnB1dFNvdXJjZSgpID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSAmJgotICAgICAgICAgICAgICAgICBhdWRpb1Nlc3Npb24tPmlzU291bmRUcmlnZ2VyKCkpKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1hdWRpb19zb3VyY2VfdCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjpnZXRIaWdoZXN0UHJpb3JpdHlTb3VyY2UoYm9vbCBhY3RpdmVPbmx5KSBjb25zdAotewotICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IEFVRElPX1NPVVJDRV9ERUZBVUxUOwotICAgIGludDMyX3QgcHJpb3JpdHkgPSAtMTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiAgYXVkaW9TZXNzaW9uID0gdmFsdWVBdChpKTsKLSAgICAgICAgaWYgKGFjdGl2ZU9ubHkgJiYgYXVkaW9TZXNzaW9uLT5hY3RpdmVDb3VudCgpID09IDApIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGludDMyX3QgY3VyUHJpb3JpdHkgPSBzb3VyY2VfcHJpb3JpdHkoYXVkaW9TZXNzaW9uLT5pbnB1dFNvdXJjZSgpKTsKLSAgICAgICAgaWYgKGN1clByaW9yaXR5ID4gcHJpb3JpdHkpIHsKLSAgICAgICAgICAgIHByaW9yaXR5ID0gY3VyUHJpb3JpdHk7Ci0gICAgICAgICAgICBzb3VyY2UgPSBhdWRpb1Nlc3Npb24tPmlucHV0U291cmNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHNvdXJjZTsKLX0KLQotdm9pZCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjpvblNlc3Npb25JbmZvVXBkYXRlKCkgY29uc3QKLXsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHZhbHVlQXQoaSktPm9uU2Vzc2lvbkluZm9VcGRhdGUoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb246OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0F1ZGlvIFNlc3Npb25zOlxuIiwgc3BhY2VzLCAiIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCwgc3BhY2VzICsgMiwgaSk7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvU291cmNlRGVzY3JpcHRvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMzNlNTcuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9Tb3VyY2VEZXNjcmlwdG9yIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmg+Ci0jaW5jbHVkZSA8SHdNb2R1bGUuaD4KLSNpbmNsdWRlIDxBdWRpb0dhaW4uaD4KLSNpbmNsdWRlIDxBdWRpb1NvdXJjZURlc2NyaXB0b3IuaD4KLSNpbmNsdWRlIDxEZXZpY2VEZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8SU9Qcm9maWxlLmg+Ci0jaW5jbHVkZSA8QXVkaW9PdXRwdXREZXNjcmlwdG9yLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdHVzX3QgQXVkaW9Tb3VyY2VEZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIm1TdHJlYW06ICVkXG4iLCBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKCZtQXR0cmlidXRlcykpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJtRGV2aWNlOlxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIG1EZXZpY2UtPmR1bXAoZmQsIDIgLCAwKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLQotc3RhdHVzX3QgQXVkaW9Tb3VyY2VDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuQXVkaW8gc291cmNlcyBkdW1wOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBTb3VyY2UgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLX07IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0NsaWVudERlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQ2xpZW50RGVzY3JpcHRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJkNjRjOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0NsaWVudERlc2NyaXB0b3IuY3BwCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE1fQ2xpZW50RGVzY3JpcHRvciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgorI2luY2x1ZGUgIkF1ZGlvT3V0cHV0RGVzY3JpcHRvci5oIgorI2luY2x1ZGUgIkF1ZGlvUGF0Y2guaCIKKyNpbmNsdWRlICJDbGllbnREZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiRGV2aWNlRGVzY3JpcHRvci5oIgorI2luY2x1ZGUgIkh3TW9kdWxlLmgiCisjaW5jbHVkZSAiSU9Qcm9maWxlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RkOjpzdHJpbmcgQ2xpZW50RGVzY3JpcHRvcjo6dG9TaG9ydFN0cmluZygpIGNvbnN0Cit7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisKKyAgICBzcyA8PCAiUG9ydElkOiAiIDw8IG1Qb3J0SWQgPDwgIiBTZXNzaW9uSWQ6ICIgPDwgbVNlc3Npb25JZCA8PCAiIFVpZDogIiA8PCBtVWlkOworICAgIHJldHVybiBzcy5zdHIoKTsKK30KKwordm9pZCBDbGllbnREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNDbGllbnQgJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBQb3J0IElkOiAlZCBTZXNzaW9uIElkOiAlZCBVSUQ6ICVkXG4iLCBzcGFjZXMsICIiLAorICAgICAgICAgICAgIG1Qb3J0SWQsIG1TZXNzaW9uSWQsIG1VaWQpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIEZvcm1hdDogJTA4eCBTYW1wbGluZyByYXRlOiAlZCBDaGFubmVsczogJTA4eFxuIiwgc3BhY2VzLCAiIiwKKyAgICAgICAgICAgICBtQ29uZmlnLmZvcm1hdCwgbUNvbmZpZy5zYW1wbGVfcmF0ZSwgbUNvbmZpZy5jaGFubmVsX21hc2spOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFByZWZlcnJlZCBEZXZpY2UgSWQ6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1QcmVmZXJyZWREZXZpY2VJZCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gU3RhdGU6ICVzXG4iLCBzcGFjZXMsICIiLCBtQWN0aXZlID8gIkFjdGl2ZSIgOiAiSW5hY3RpdmUiKTsKK30KKwordm9pZCBUcmFja0NsaWVudERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Cit7CisgICAgQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcChkc3QsIHNwYWNlcywgaW5kZXgpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFN0cmVhbTogJWQgZmxhZ3M6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1TdHJlYW0sIG1GbGFncyk7Cit9CisKK3N0ZDo6c3RyaW5nIFRyYWNrQ2xpZW50RGVzY3JpcHRvcjo6dG9TaG9ydFN0cmluZygpIGNvbnN0Cit7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisKKyAgICBzcyA8PCBDbGllbnREZXNjcmlwdG9yOjp0b1Nob3J0U3RyaW5nKCkgPDwgIiBTdHJlYW06ICIgPDwgbVN0cmVhbTsKKyAgICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK3ZvaWQgUmVjb3JkQ2xpZW50RGVzY3JpcHRvcjo6dHJhY2tFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+ICZlZmZlY3QsIGJvb2wgZW5hYmxlZCkKK3sKKyAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICBtRW5hYmxlZEVmZmVjdHMucmVwbGFjZVZhbHVlRm9yKGVmZmVjdC0+bUlkLCBlZmZlY3QpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1FbmFibGVkRWZmZWN0cy5yZW1vdmVJdGVtKGVmZmVjdC0+bUlkKTsKKyAgICB9Cit9CisKK3ZvaWQgUmVjb3JkQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3sKKyAgICBDbGllbnREZXNjcmlwdG9yOjpkdW1wKGRzdCwgc3BhY2VzLCBpbmRleCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gU291cmNlOiAlZCBmbGFnczogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbVNvdXJjZSwgbUZsYWdzKTsKKyAgICBtRW5hYmxlZEVmZmVjdHMuZHVtcChkc3QsIHNwYWNlcyArIDIgLypzcGFjZXMqLywgZmFsc2UgLyp2ZXJib3NlKi8pOworfQorCitTb3VyY2VDbGllbnREZXNjcmlwdG9yOjpTb3VyY2VDbGllbnREZXNjcmlwdG9yKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLCB1aWRfdCB1aWQsCisgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywgY29uc3Qgc3A8QXVkaW9QYXRjaD4mIHBhdGNoRGVzYywKKyAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBzcmNEZXZpY2UsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkgOgorICAgIFRyYWNrQ2xpZW50RGVzY3JpcHRvcjo6VHJhY2tDbGllbnREZXNjcmlwdG9yKHBvcnRJZCwgdWlkLCBBVURJT19TRVNTSU9OX05PTkUsIGF0dHJpYnV0ZXMsCisgICAgICAgIEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSLCBBVURJT19QT1JUX0hBTkRMRV9OT05FLAorICAgICAgICBzdHJlYW0sIHN0cmF0ZWd5LCBBVURJT19PVVRQVVRfRkxBR19OT05FKSwKKyAgICAgICAgbVBhdGNoRGVzYyhwYXRjaERlc2MpLCBtU3JjRGV2aWNlKHNyY0RldmljZSkKK3sKK30KKwordm9pZCBTb3VyY2VDbGllbnREZXNjcmlwdG9yOjpzZXRTd091dHB1dChjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIHN3T3V0cHV0KQoreworICAgIG1Td091dHB1dCA9IHN3T3V0cHV0OworfQorCit2b2lkIFNvdXJjZUNsaWVudERlc2NyaXB0b3I6OnNldEh3T3V0cHV0KGNvbnN0IHNwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgaHdPdXRwdXQpCit7CisgICAgbUh3T3V0cHV0ID0gaHdPdXRwdXQ7Cit9CisKK3ZvaWQgU291cmNlQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3sKKyAgICBUcmFja0NsaWVudERlc2NyaXB0b3I6OmR1bXAoZHN0LCBzcGFjZXMsIGluZGV4KTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBEZXZpY2U6XG4iLCBzcGFjZXMsICIiKTsKKyAgICBtU3JjRGV2aWNlLT5kdW1wKGRzdCwgMiwgMCk7Cit9CisKK3ZvaWQgU291cmNlQ2xpZW50Q29sbGVjdGlvbjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmQoIlxuQXVkaW8gc291cmNlczpcbiIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QsIDIsIGkpOworICAgIH0KK30KKworfTsgLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQ29uZmlnUGFyc2luZ1V0aWxzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0NvbmZpZ1BhcnNpbmdVdGlscy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMTA1ZjUuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQ29uZmlnUGFyc2luZ1V0aWxzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJBUE06OkNvbmZpZ1BhcnNpbmdVdGlscyIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgIkNvbmZpZ1BhcnNpbmdVdGlscy5oIgotI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgotI2luY2x1ZGUgIklPUHJvZmlsZS5oIgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvVHlwZUNvbnZlcnRlci5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tIGF1ZGlvX3BvbGljeS5jb25mIGZpbGUgcGFyc2luZwotCi0vL3N0YXRpYwotdm9pZCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRBdWRpb1BvcnRHYWluKGNub2RlICpyb290LCBBdWRpb1BvcnQgJmF1ZGlvUG9ydCwgaW50IGluZGV4KQotewotICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7Ci0KLSAgICBzcDxBdWRpb0dhaW4+IGdhaW4gPSBuZXcgQXVkaW9HYWluKGluZGV4LCBhdWRpb1BvcnQudXNlSW5wdXRDaGFubmVsTWFzaygpKTsKLQotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9NT0RFKSA9PSAwKSB7Ci0gICAgICAgICAgICBnYWluLT5zZXRNb2RlKEdhaW5Nb2RlQ29udmVydGVyOjptYXNrRnJvbVN0cmluZyhub2RlLT52YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX0NIQU5ORUxTKSA9PSAwKSB7Ci0gICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtYXNrOwotICAgICAgICAgICAgaWYgKGF1ZGlvUG9ydC51c2VJbnB1dENoYW5uZWxNYXNrKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoSW5wdXRDaGFubmVsQ29udmVydGVyOjpmcm9tU3RyaW5nKG5vZGUtPnZhbHVlLCBtYXNrKSkgewotICAgICAgICAgICAgICAgICAgICBnYWluLT5zZXRDaGFubmVsTWFzayhtYXNrKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChPdXRwdXRDaGFubmVsQ29udmVydGVyOjpmcm9tU3RyaW5nKG5vZGUtPnZhbHVlLCBtYXNrKSkgewotICAgICAgICAgICAgICAgICAgICBnYWluLT5zZXRDaGFubmVsTWFzayhtYXNrKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fTUlOX1ZBTFVFKSA9PSAwKSB7Ci0gICAgICAgICAgICBnYWluLT5zZXRNaW5WYWx1ZUluTWIoYXRvaShub2RlLT52YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX01BWF9WQUxVRSkgPT0gMCkgewotICAgICAgICAgICAgZ2Fpbi0+c2V0TWF4VmFsdWVJbk1iKGF0b2kobm9kZS0+dmFsdWUpKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9ERUZBVUxUX1ZBTFVFKSA9PSAwKSB7Ci0gICAgICAgICAgICBnYWluLT5zZXREZWZhdWx0VmFsdWVJbk1iKGF0b2kobm9kZS0+dmFsdWUpKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9TVEVQX1ZBTFVFKSA9PSAwKSB7Ci0gICAgICAgICAgICBnYWluLT5zZXRTdGVwVmFsdWVJbk1iKGF0b2kobm9kZS0+dmFsdWUpKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9NSU5fUkFNUF9NUykgPT0gMCkgewotICAgICAgICAgICAgZ2Fpbi0+c2V0TWluUmFtcEluTXMoYXRvaShub2RlLT52YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX01BWF9SQU1QX01TKSA9PSAwKSB7Ci0gICAgICAgICAgICBnYWluLT5zZXRNYXhSYW1wSW5NcyhhdG9pKG5vZGUtPnZhbHVlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotCi0gICAgQUxPR1YoImxvYWRHYWluKCkgYWRkaW5nIG5ldyBnYWluIG1vZGUgJTA4eCBjaGFubmVsIG1hc2sgJTA4eCBtaW4gbUIgJWQgbWF4IG1CICVkIiwKLSAgICAgICAgICBnYWluLT5nZXRNb2RlKCksIGdhaW4tPmdldENoYW5uZWxNYXNrKCksIGdhaW4tPmdldE1pblZhbHVlSW5NYigpLAotICAgICAgICAgIGdhaW4tPmdldE1heFZhbHVlSW5NYigpKTsKLQotICAgIGlmIChnYWluLT5nZXRNb2RlKCkgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGF1ZGlvUG9ydC5tR2FpbnMuYWRkKGdhaW4pOwotfQotCi12b2lkIENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZEF1ZGlvUG9ydEdhaW5zKGNub2RlICpyb290LCBBdWRpb1BvcnQgJmF1ZGlvUG9ydCkKLXsKLSAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOwotICAgIGludCBpbmRleCA9IDA7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgQUxPR1YoImxvYWRHYWlucygpIGxvYWRpbmcgZ2FpbiAlcyIsIG5vZGUtPm5hbWUpOwotICAgICAgICBsb2FkQXVkaW9Qb3J0R2Fpbihub2RlLCBhdWRpb1BvcnQsIGluZGV4KyspOwotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci19Ci0KLS8vc3RhdGljCi12b2lkIENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZERldmljZURlc2NyaXB0b3JHYWlucyhjbm9kZSAqcm9vdCwgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZURlc2MpCi17Ci0gICAgbG9hZEF1ZGlvUG9ydEdhaW5zKHJvb3QsICpkZXZpY2VEZXNjKTsKLSAgICBpZiAoZGV2aWNlRGVzYy0+bUdhaW5zLnNpemUoKSA+IDApIHsKLSAgICAgICAgZGV2aWNlRGVzYy0+bUdhaW5zWzBdLT5nZXREZWZhdWx0Q29uZmlnKCZkZXZpY2VEZXNjLT5tR2Fpbik7Ci0gICAgfQotfQotCi0vL3N0YXRpYwotc3RhdHVzX3QgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkSHdNb2R1bGVEZXZpY2UoY25vZGUgKnJvb3QsIERldmljZVZlY3RvciAmZGV2aWNlcykKLXsKLSAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOwotCi0gICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEFQTV9ERVZJQ0VfVFlQRSkgPT0gMCkgewotICAgICAgICAgICAgZGV2aWNlRnJvbVN0cmluZyhub2RlLT52YWx1ZSwgdHlwZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci0gICAgaWYgKHR5cGUgPT0gQVVESU9fREVWSUNFX05PTkUgfHwKLSAgICAgICAgICAgICghYXVkaW9faXNfaW5wdXRfZGV2aWNlKHR5cGUpICYmICFhdWRpb19pc19vdXRwdXRfZGV2aWNlKHR5cGUpKSkgewotICAgICAgICBBTE9HVygibG9hZERldmljZSgpIGJhZCB0eXBlICUwOHgiLCB0eXBlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKHR5cGUsIFN0cmluZzgocm9vdC0+bmFtZSkpOwotCi0gICAgbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgQVBNX0RFVklDRV9BRERSRVNTKSA9PSAwKSB7Ci0gICAgICAgICAgICBkZXZpY2VEZXNjLT5tQWRkcmVzcyA9IFN0cmluZzgoKGNoYXIgKilub2RlLT52YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIENIQU5ORUxTX1RBRykgPT0gMCkgewotICAgICAgICAgICAgaWYgKGF1ZGlvX2lzX2lucHV0X2RldmljZSh0eXBlKSkgewotICAgICAgICAgICAgICAgIGRldmljZURlc2MtPmFkZEF1ZGlvUHJvZmlsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdWRpb1Byb2ZpbGUoZ0R5bmFtaWNGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0Q2hhbm5lbE1hc2tzRnJvbVN0cmluZyhub2RlLT52YWx1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZVJhdGVWZWN0b3IoKSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkZXZpY2VEZXNjLT5hZGRBdWRpb1Byb2ZpbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXVkaW9Qcm9maWxlKGdEeW5hbWljRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRDaGFubmVsTWFza3NGcm9tU3RyaW5nKG5vZGUtPnZhbHVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlUmF0ZVZlY3RvcigpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5TX1RBRykgPT0gMCkgewotICAgICAgICAgICAgbG9hZERldmljZURlc2NyaXB0b3JHYWlucyhub2RlLCBkZXZpY2VEZXNjKTsKLSAgICAgICAgfQotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci0KLSAgICBBTE9HVigibG9hZERldmljZSgpIGFkZGluZyBkZXZpY2UgdGFnIChsaXRlcmFsIHR5cGUpICVzIHR5cGUgJTA4eCBhZGRyZXNzICVzIiwKLSAgICAgICAgICBkZXZpY2VEZXNjLT5nZXRUYWdOYW1lKCkuc3RyaW5nKCksIHR5cGUsIGRldmljZURlc2MtPm1BZGRyZXNzLnN0cmluZygpKTsKLQotICAgIGRldmljZXMuYWRkKGRldmljZURlc2MpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLy9zdGF0aWMKLXN0YXR1c190IENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZEh3TW9kdWxlUHJvZmlsZShjbm9kZSAqcm9vdCwgc3A8SHdNb2R1bGU+ICZtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSkKLXsKLSAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOwotCi0gICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbmV3IElPUHJvZmlsZShTdHJpbmc4KHJvb3QtPm5hbWUpLCByb2xlKTsKLQotICAgIEF1ZGlvUHJvZmlsZVZlY3RvciBhdWRpb1Byb2ZpbGVzOwotICAgIFNhbXBsZVJhdGVWZWN0b3Igc2FtcGxlUmF0ZXM7Ci0gICAgQ2hhbm5lbHNWZWN0b3IgY2hhbm5lbHM7Ci0gICAgRm9ybWF0VmVjdG9yIGZvcm1hdHM7Ci0KLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEZPUk1BVFNfVEFHKSA9PSAwICYmCi0gICAgICAgICAgICAgICAgc3RyY21wKG5vZGUtPnZhbHVlLCBEWU5BTUlDX1ZBTFVFX1RBRykgIT0gMCkgewotICAgICAgICAgICAgZm9ybWF0cyA9IGZvcm1hdHNGcm9tU3RyaW5nKG5vZGUtPnZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgU0FNUExJTkdfUkFURVNfVEFHKSA9PSAwICYmCi0gICAgICAgICAgICAgICAgICBzdHJjbXAobm9kZS0+dmFsdWUsIERZTkFNSUNfVkFMVUVfVEFHKSAhPSAwKSB7Ci0gICAgICAgICAgICBjb2xsZWN0aW9uRnJvbVN0cmluZzxTYW1wbGVSYXRlVHJhaXRzPihub2RlLT52YWx1ZSwgc2FtcGxlUmF0ZXMpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBDSEFOTkVMU19UQUcpID09IDAgJiYKLSAgICAgICAgICAgICAgICAgICBzdHJjbXAobm9kZS0+dmFsdWUsIERZTkFNSUNfVkFMVUVfVEFHKSAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSykgewotICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gaW5wdXRDaGFubmVsTWFza3NGcm9tU3RyaW5nKG5vZGUtPnZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2hhbm5lbHMgPSBvdXRwdXRDaGFubmVsTWFza3NGcm9tU3RyaW5nKG5vZGUtPnZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgREVWSUNFU19UQUcpID09IDApIHsKLSAgICAgICAgICAgIERldmljZVZlY3RvciBkZXZpY2VzOwotICAgICAgICAgICAgbG9hZERldmljZXNGcm9tVGFnKG5vZGUtPnZhbHVlLCBkZXZpY2VzLCBtb2R1bGUtPmdldERlY2xhcmVkRGV2aWNlcygpKTsKLSAgICAgICAgICAgIHByb2ZpbGUtPnNldFN1cHBvcnRlZERldmljZXMoZGV2aWNlcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEZMQUdTX1RBRykgPT0gMCkgewotICAgICAgICAgICAgaWYgKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTkspIHsKLSAgICAgICAgICAgICAgICBwcm9maWxlLT5zZXRGbGFncyhJbnB1dEZsYWdDb252ZXJ0ZXI6Om1hc2tGcm9tU3RyaW5nKG5vZGUtPnZhbHVlKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHByb2ZpbGUtPnNldEZsYWdzKE91dHB1dEZsYWdDb252ZXJ0ZXI6Om1hc2tGcm9tU3RyaW5nKG5vZGUtPnZhbHVlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5TX1RBRykgPT0gMCkgewotICAgICAgICAgICAgbG9hZEF1ZGlvUG9ydEdhaW5zKG5vZGUsICpwcm9maWxlKTsKLSAgICAgICAgfQotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci0gICAgaWYgKGZvcm1hdHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZVRvQWRkID0gbmV3IEF1ZGlvUHJvZmlsZShnRHluYW1pY0Zvcm1hdCwgY2hhbm5lbHMsIHNhbXBsZVJhdGVzKTsKLSAgICAgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOwotICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNDaGFubmVscyhjaGFubmVscy5pc0VtcHR5KCkpOwotICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNSYXRlKHNhbXBsZVJhdGVzLmlzRW1wdHkoKSk7Ci0gICAgICAgIGF1ZGlvUHJvZmlsZXMuYWRkKHByb2ZpbGVUb0FkZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmb3JtYXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAvLyBGb3IgY29tcGF0aWJpbGl0eSByZWFzb24sIGZvciBlYWNoIGZvcm1hdCwgY3JlYXRlcyBhIHByb2ZpbGUgd2l0aCB0aGUgc2FtZQotICAgICAgICAgICAgLy8gY29sbGVjdGlvbiBvZiByYXRlIGFuZCBjaGFubmVscy4KLSAgICAgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZVRvQWRkID0gbmV3IEF1ZGlvUHJvZmlsZShmb3JtYXRzW2ldLCBjaGFubmVscywgc2FtcGxlUmF0ZXMpOwotICAgICAgICAgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljRm9ybWF0KGZvcm1hdHNbaV0gPT0gZ0R5bmFtaWNGb3JtYXQpOwotICAgICAgICAgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljQ2hhbm5lbHMoY2hhbm5lbHMuaXNFbXB0eSgpKTsKLSAgICAgICAgICAgIHByb2ZpbGVUb0FkZC0+c2V0RHluYW1pY1JhdGUoc2FtcGxlUmF0ZXMuaXNFbXB0eSgpKTsKLSAgICAgICAgICAgIGF1ZGlvUHJvZmlsZXMuYWRkKHByb2ZpbGVUb0FkZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHJvZmlsZS0+c2V0QXVkaW9Qcm9maWxlcyhhdWRpb1Byb2ZpbGVzKTsKLSAgICBBTE9HV19JRighcHJvZmlsZS0+aGFzU3VwcG9ydGVkRGV2aWNlcygpLCAibG9hZCVzKCkgaW52YWxpZCBzdXBwb3J0ZWQgZGV2aWNlcyIsCi0gICAgICAgICAgICAgcm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSyA/ICJJbnB1dCIgOiAiT3V0cHV0Iik7Ci0gICAgaWYgKHByb2ZpbGUtPmhhc1N1cHBvcnRlZERldmljZXMoKSkgewotICAgICAgICBBTE9HVigibG9hZCVzKCkgYWRkaW5nIFN1cHBvcnRlZCBEZXZpY2VzICUwNHgsIG1GbGFncyAlMDR4IiwKLSAgICAgICAgICAgICAgcm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSyA/ICJJbnB1dCIgOiAiT3V0cHV0IiwKLSAgICAgICAgICAgICAgcHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlc1R5cGUoKSwgcHJvZmlsZS0+Z2V0RmxhZ3MoKSk7Ci0gICAgICAgIHJldHVybiBtb2R1bGUtPmFkZFByb2ZpbGUocHJvZmlsZSk7Ci0gICAgfQotICAgIHJldHVybiBCQURfVkFMVUU7Ci19Ci0KLS8vc3RhdGljCi1zdGF0dXNfdCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRId01vZHVsZShjbm9kZSAqcm9vdCwgc3A8SHdNb2R1bGU+ICZtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKQotewotICAgIHN0YXR1c190IHN0YXR1cyA9IE5BTUVfTk9UX0ZPVU5EOwotICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgREVWSUNFU19UQUcpOwotICAgIGlmIChub2RlICE9IE5VTEwpIHsKLSAgICAgICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOwotICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKLSAgICAgICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkSHdNb2R1bGUoKSBsb2FkaW5nIGRldmljZSAlcyIsIG5vZGUtPm5hbWUpOwotICAgICAgICAgICAgc3RhdHVzX3QgdG1wU3RhdHVzID0gbG9hZEh3TW9kdWxlRGV2aWNlKG5vZGUsIGRldmljZXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOQU1FX05PVF9GT1VORCB8fCBzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSB0bXBTdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICAgICAgfQotICAgICAgICBtb2R1bGUtPnNldERlY2xhcmVkRGV2aWNlcyhkZXZpY2VzKTsKLSAgICB9Ci0gICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIE9VVFBVVFNfVEFHKTsKLSAgICBpZiAobm9kZSAhPSBOVUxMKSB7Ci0gICAgICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKLSAgICAgICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkSHdNb2R1bGUoKSBsb2FkaW5nIG91dHB1dCAlcyIsIG5vZGUtPm5hbWUpOwotICAgICAgICAgICAgc3RhdHVzX3QgdG1wU3RhdHVzID0gbG9hZEh3TW9kdWxlUHJvZmlsZShub2RlLCBtb2R1bGUsIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOQU1FX05PVF9GT1VORCB8fCBzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSB0bXBTdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICAgICAgfQotICAgIH0KLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgSU5QVVRTX1RBRyk7Ci0gICAgaWYgKG5vZGUgIT0gTlVMTCkgewotICAgICAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7Ci0gICAgICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgICAgICBBTE9HVigibG9hZEh3TW9kdWxlKCkgbG9hZGluZyBpbnB1dCAlcyIsIG5vZGUtPm5hbWUpOwotICAgICAgICAgICAgc3RhdHVzX3QgdG1wU3RhdHVzID0gbG9hZEh3TW9kdWxlUHJvZmlsZShub2RlLCBtb2R1bGUsIEFVRElPX1BPUlRfUk9MRV9TSU5LKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTkFNRV9OT1RfRk9VTkQgfHwgc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gdG1wU3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbG9hZE1vZHVsZUdsb2JhbENvbmZpZyhyb290LCBtb2R1bGUsIGNvbmZpZyk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotLy9zdGF0aWMKLXZvaWQgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkSHdNb2R1bGVzKGNub2RlICpyb290LCBId01vZHVsZUNvbGxlY3Rpb24gJmh3TW9kdWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpCi17Ci0gICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBBVURJT19IV19NT0RVTEVfVEFHKTsKLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgQUxPR1YoImxvYWRId01vZHVsZXMoKSBsb2FkaW5nIG1vZHVsZSAlcyIsIG5vZGUtPm5hbWUpOwotICAgICAgICBzcDxId01vZHVsZT4gbW9kdWxlID0gbmV3IEh3TW9kdWxlKG5vZGUtPm5hbWUpOwotICAgICAgICBpZiAobG9hZEh3TW9kdWxlKG5vZGUsIG1vZHVsZSwgY29uZmlnKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgaHdNb2R1bGVzLmFkZChtb2R1bGUpOwotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLX0KLQotLy9zdGF0aWMKLXZvaWQgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkRGV2aWNlc0Zyb21UYWcoY29uc3QgY2hhciAqdGFnLCBEZXZpY2VWZWN0b3IgJmRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmZGVjbGFyZWREZXZpY2VzKQotewotICAgIGNoYXIgKnRhZ0xpdGVyYWwgPSBzdHJuZHVwKHRhZywgc3RybGVuKHRhZykpOwotICAgIGNoYXIgKmRldlRhZyA9IHN0cnRvayh0YWdMaXRlcmFsLCBBdWRpb1BhcmFtZXRlcjo6dmFsdWVMaXN0U2VwYXJhdG9yKTsKLSAgICB3aGlsZSAoZGV2VGFnICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKHN0cmxlbihkZXZUYWcpICE9IDApIHsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlOwotICAgICAgICAgICAgaWYgKGRldmljZUZyb21TdHJpbmcoZGV2VGFnLCB0eXBlKSkgewotICAgICAgICAgICAgICAgIHVpbnQzMl90IGluQml0ID0gdHlwZSAmIEFVRElPX0RFVklDRV9CSVRfSU47Ci0gICAgICAgICAgICAgICAgdHlwZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKLSAgICAgICAgICAgICAgICB3aGlsZSAodHlwZSkgewotICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHNpbmdsZVR5cGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgaW5CaXQgfCAoMSA8PCAoMzEgLSBfX2J1aWx0aW5fY2x6KHR5cGUpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGUgJj0gfnNpbmdsZVR5cGU7Ci0gICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldiA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKHNpbmdsZVR5cGUpOwotICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLmFkZChkZXYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZERldmljZXMuZ2V0RGV2aWNlRnJvbVRhZ05hbWUoU3RyaW5nOChkZXZUYWcpKTsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlRGVzYyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRldmljZXMuYWRkKGRldmljZURlc2MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkZXZUYWcgPSBzdHJ0b2soTlVMTCwgQXVkaW9QYXJhbWV0ZXI6OnZhbHVlTGlzdFNlcGFyYXRvcik7Ci0gICAgfQotICAgIGZyZWUodGFnTGl0ZXJhbCk7Ci19Ci0KLS8vc3RhdGljCi12b2lkIENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZE1vZHVsZUdsb2JhbENvbmZpZyhjbm9kZSAqcm9vdCwgY29uc3Qgc3A8SHdNb2R1bGU+ICZtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKQotewotICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgR0xPQkFMX0NPTkZJR19UQUcpOwotCi0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIERldmljZVZlY3RvciBkZWNsYXJlZERldmljZXM7Ci0gICAgaWYgKG1vZHVsZSAhPSBOVUxMKSB7Ci0gICAgICAgIGRlY2xhcmVkRGV2aWNlcyA9IG1vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCk7Ci0gICAgfQotCi0gICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChzdHJjbXAoQVRUQUNIRURfT1VUUFVUX0RFVklDRVNfVEFHLCBub2RlLT5uYW1lKSA9PSAwKSB7Ci0gICAgICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlT3V0cHV0RGV2aWNlczsKLSAgICAgICAgICAgIGxvYWREZXZpY2VzRnJvbVRhZyhub2RlLT52YWx1ZSwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgZGVjbGFyZWREZXZpY2VzKTsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkR2xvYmFsQ29uZmlnKCkgQXR0YWNoZWQgT3V0cHV0IERldmljZXMgJTA4eCIsCi0gICAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkpOwotICAgICAgICAgICAgY29uZmlnLmFkZEF2YWlsYWJsZU91dHB1dERldmljZXMoYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKERFRkFVTFRfT1VUUFVUX0RFVklDRV9UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICAgICAgICAgIGRldmljZUZyb21TdHJpbmcobm9kZS0+dmFsdWUsIGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGVmYXVsdE91dHB1dERldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKGRldmljZSk7Ci0gICAgICAgICAgICAgICAgY29uZmlnLnNldERlZmF1bHRPdXRwdXREZXZpY2UoZGVmYXVsdE91dHB1dERldmljZSk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImxvYWRHbG9iYWxDb25maWcoKSBtRGVmYXVsdE91dHB1dERldmljZSAlMDh4IiwgZGVmYXVsdE91dHB1dERldmljZS0+dHlwZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImxvYWRHbG9iYWxDb25maWcoKSBkZWZhdWx0IGRldmljZSBub3Qgc3BlY2lmaWVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKEFUVEFDSEVEX0lOUFVUX0RFVklDRVNfVEFHLCBub2RlLT5uYW1lKSA9PSAwKSB7Ci0gICAgICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlSW5wdXREZXZpY2VzOwotICAgICAgICAgICAgbG9hZERldmljZXNGcm9tVGFnKG5vZGUtPnZhbHVlLCBhdmFpbGFibGVJbnB1dERldmljZXMsIGRlY2xhcmVkRGV2aWNlcyk7Ci0gICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIEF2YWlsYWJsZSBJbnB1dERldmljZXMgJTA4eCIsIGF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpKTsKLSAgICAgICAgICAgIGNvbmZpZy5hZGRBdmFpbGFibGVJbnB1dERldmljZXMoYXZhaWxhYmxlSW5wdXREZXZpY2VzKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoQVVESU9fSEFMX1ZFUlNJT05fVEFHLCBub2RlLT5uYW1lKSA9PSAwKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCBtYWpvciwgbWlub3I7Ci0gICAgICAgICAgICBzc2NhbmYoKGNoYXIgKilub2RlLT52YWx1ZSwgIiV1LiV1IiwgJm1ham9yLCAmbWlub3IpOwotICAgICAgICAgICAgbW9kdWxlLT5zZXRIYWxWZXJzaW9uKG1ham9yLCBtaW5vcik7Ci0gICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIG1IYWxWZXJzaW9uID0gbWFqb3IgJXUgbWlub3IgJXUiLCBtYWpvciwgbWlub3IpOwotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLX0KLQotLy9zdGF0aWMKLXZvaWQgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkR2xvYmFsQ29uZmlnKGNub2RlICpyb290LCBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SHdNb2R1bGU+JiBwcmltYXJ5TW9kdWxlKQotewotICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgR0xPQkFMX0NPTkZJR19UQUcpOwotCi0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBpZiAoc3RyY21wKFNQRUFLRVJfRFJDX0VOQUJMRURfVEFHLCBub2RlLT5uYW1lKSA9PSAwKSB7Ci0gICAgICAgICAgICBib29sIHNwZWFrZXJEcmNFbmFibGVkOwotICAgICAgICAgICAgaWYgKHV0aWxpdGllczo6Y29udmVydFRvPHN0ZDo6c3RyaW5nLCBib29sPihub2RlLT52YWx1ZSwgc3BlYWtlckRyY0VuYWJsZWQpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImxvYWRHbG9iYWxDb25maWcoKSBtU3BlYWtlckRyY0VuYWJsZWQgPSAlZCIsIHNwZWFrZXJEcmNFbmFibGVkKTsKLSAgICAgICAgICAgICAgICBjb25maWcuc2V0U3BlYWtlckRyY0VuYWJsZWQoc3BlYWtlckRyY0VuYWJsZWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLSAgICBsb2FkTW9kdWxlR2xvYmFsQ29uZmlnKHJvb3QsIHByaW1hcnlNb2R1bGUsIGNvbmZpZyk7Ci19Ci0KLS8vc3RhdGljCi1zdGF0dXNfdCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRDb25maWcoY29uc3QgY2hhciAqcGF0aCwgQXVkaW9Qb2xpY3lDb25maWcgJmNvbmZpZykKLXsKLSAgICBjbm9kZSAqcm9vdDsKLSAgICBjaGFyICpkYXRhOwotCi0gICAgZGF0YSA9IChjaGFyICopbG9hZF9maWxlKHBhdGgsIE5VTEwpOwotICAgIGlmIChkYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJvb3QgPSBjb25maWdfbm9kZSgiIiwgIiIpOwotICAgIGNvbmZpZ19sb2FkKHJvb3QsIGRhdGEpOwotCi0gICAgSHdNb2R1bGVDb2xsZWN0aW9uIGh3TW9kdWxlczsKLSAgICBsb2FkSHdNb2R1bGVzKHJvb3QsIGh3TW9kdWxlcywgY29uZmlnKTsKLQotICAgIC8vIGxlZ2FjeSBhdWRpb19wb2xpY3kuY29uZiBmaWxlcyBoYXZlIG9uZSBnbG9iYWxfY29uZmlndXJhdGlvbiBzZWN0aW9uLCBhdHRhY2hlZCB0byBwcmltYXJ5LgotICAgIGxvYWRHbG9iYWxDb25maWcocm9vdCwgY29uZmlnLCBod01vZHVsZXMuZ2V0TW9kdWxlRnJvbU5hbWUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlkpKTsKLQotICAgIGNvbmZpZy5zZXRId01vZHVsZXMoaHdNb2R1bGVzKTsKLQotICAgIGNvbmZpZ19mcmVlKHJvb3QpOwotICAgIGZyZWUocm9vdCk7Ci0gICAgZnJlZShkYXRhKTsKLQotICAgIEFMT0dJKCJsb2FkQXVkaW9Qb2xpY3lDb25maWcoKSBsb2FkZWQgJXNcbiIsIHBhdGgpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0RldmljZURlc2NyaXB0b3IuY3BwCmluZGV4IDE5YzIwNjIuLjA0Y2JjZDEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0RldmljZURlc2NyaXB0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0RldmljZURlc2NyaXB0b3IuY3BwCkBAIC0yNiwxNCArMjYsMjUgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogRGV2aWNlRGVzY3JpcHRvcjo6RGV2aWNlRGVzY3JpcHRvcihhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3QgU3RyaW5nOCAmdGFnTmFtZSkgOgorICAgICAgICBEZXZpY2VEZXNjcmlwdG9yKHR5cGUsIEZvcm1hdFZlY3Rvcnt9LCB0YWdOYW1lKQoreworfQorCitEZXZpY2VEZXNjcmlwdG9yOjpEZXZpY2VEZXNjcmlwdG9yKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBGb3JtYXRWZWN0b3IgJmVuY29kZWRGb3JtYXRzLAorICAgICAgICBjb25zdCBTdHJpbmc4ICZ0YWdOYW1lKSA6CiAgICAgQXVkaW9Qb3J0KFN0cmluZzgoIiIpLCBBVURJT19QT1JUX1RZUEVfREVWSUNFLAogICAgICAgICAgICAgICBhdWRpb19pc19vdXRwdXRfZGV2aWNlKHR5cGUpID8gQVVESU9fUE9SVF9ST0xFX1NJTksgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9SVF9ST0xFX1NPVVJDRSksCi0gICAgbUFkZHJlc3MoIiIpLCBtVGFnTmFtZSh0YWdOYW1lKSwgbURldmljZVR5cGUodHlwZSksIG1JZCgwKQorICAgIG1UYWdOYW1lKHRhZ05hbWUpLCBtRGV2aWNlVHlwZSh0eXBlKSwgbUVuY29kZWRGb3JtYXRzKGVuY29kZWRGb3JtYXRzKQogewogICAgIGlmICh0eXBlID09IEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYIHx8IHR5cGUgPT0gQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYICkgewogICAgICAgICBtQWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKICAgICB9CisgICAgLyogRklYTUU6IHJlYWQgZnJvbSBBUE0gY29uZmlnIGZpbGUgKi8KKyAgICBpZiAodHlwZSA9PSBBVURJT19ERVZJQ0VfT1VUX0hETUkpIHsKKyAgICAgICAgbUVuY29kZWRGb3JtYXRzLmFkZChBVURJT19GT1JNQVRfQUMzKTsKKyAgICAgICAgbUVuY29kZWRGb3JtYXRzLmFkZChBVURJT19GT1JNQVRfSUVDNjE5MzcpOworICAgIH0KIH0KIAogYXVkaW9fcG9ydF9oYW5kbGVfdCBEZXZpY2VEZXNjcmlwdG9yOjpnZXRJZCgpIGNvbnN0CkBAIC0xMjEsNzAgKzEzMiw3OCBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLWF1ZGlvX2RldmljZXNfdCBEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tSHdNb2R1bGUoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZUhhbmRsZSkgY29uc3QKK3ZvaWQgRGV2aWNlVmVjdG9yOjpyZW1vdmUoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKQogewotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gQVVESU9fREVWSUNFX05PTkU7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbUF0KGkpLT5nZXRNb2R1bGVIYW5kbGUoKSA9PSBtb2R1bGVIYW5kbGUpIHsKLSAgICAgICAgICAgIGRldmljZXMgfD0gaXRlbUF0KGkpLT50eXBlKCk7CisgICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOiBkZXZpY2VzKSB7CisgICAgICAgIHJlbW92ZShkZXZpY2UpOworICAgIH0KK30KKworRGV2aWNlVmVjdG9yIERldmljZVZlY3Rvcjo6Z2V0RGV2aWNlc0Zyb21Id01vZHVsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlSGFuZGxlKSBjb25zdAoreworICAgIERldmljZVZlY3RvciBkZXZpY2VzOworICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogKnRoaXMpIHsKKyAgICAgICAgaWYgKGRldmljZS0+Z2V0TW9kdWxlSGFuZGxlKCkgPT0gbW9kdWxlSGFuZGxlKSB7CisgICAgICAgICAgICBkZXZpY2VzLmFkZChkZXZpY2UpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBkZXZpY2VzOwogfQogCithdWRpb19kZXZpY2VzX3QgRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VUeXBlc0Zyb21Id01vZHVsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlSGFuZGxlKSBjb25zdAoreworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlcyA9IEFVRElPX0RFVklDRV9OT05FOworICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogKnRoaXMpIHsKKyAgICAgICAgaWYgKGRldmljZS0+Z2V0TW9kdWxlSGFuZGxlKCkgPT0gbW9kdWxlSGFuZGxlKSB7CisgICAgICAgICAgICBkZXZpY2VUeXBlcyB8PSBkZXZpY2UtPnR5cGUoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGV2aWNlVHlwZXM7Cit9CisKIHNwPERldmljZURlc2NyaXB0b3I+IERldmljZVZlY3Rvcjo6Z2V0RGV2aWNlKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBTdHJpbmc4JiBhZGRyZXNzKSBjb25zdAogewogICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIGlmIChpdGVtQXQoaSktPnR5cGUoKSA9PSB0eXBlKSB7Ci0gICAgICAgICAgICBpZiAoYWRkcmVzcyA9PSAiIiB8fCBpdGVtQXQoaSktPm1BZGRyZXNzID09IGFkZHJlc3MpIHsKKyAgICAgICAgICAgIGlmIChhZGRyZXNzID09ICIiIHx8IGl0ZW1BdChpKS0+YWRkcmVzcygpID09IGFkZHJlc3MpIHsKICAgICAgICAgICAgICAgICBkZXZpY2UgPSBpdGVtQXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW1BdChpKS0+bUFkZHJlc3MgPT0gYWRkcmVzcykgeworICAgICAgICAgICAgICAgIGlmIChpdGVtQXQoaSktPmFkZHJlc3MoKSA9PSBhZGRyZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICBBTE9HVigiRGV2aWNlVmVjdG9yOjpnZXREZXZpY2UoKSBmb3IgdHlwZSAlMDh4IGFkZHJlc3MgJXMgZm91bmQgJXAiLAotICAgICAgICAgIHR5cGUsIGFkZHJlc3Muc3RyaW5nKCksIGRldmljZS5nZXQoKSk7CisgICAgQUxPR1YoIkRldmljZVZlY3Rvcjo6JXMoKSBmb3IgdHlwZSAlMDh4IGFkZHJlc3MgXCIlc1wiIGZvdW5kICVwIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCB0eXBlLCBhZGRyZXNzLnN0cmluZygpLCBkZXZpY2UuZ2V0KCkpOwogICAgIHJldHVybiBkZXZpY2U7CiB9CiAKIHNwPERldmljZURlc2NyaXB0b3I+IERldmljZVZlY3Rvcjo6Z2V0RGV2aWNlRnJvbUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgaWQpIGNvbnN0CiB7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOiAqdGhpcykgewotICAgICAgICBpZiAoZGV2aWNlLT5nZXRJZCgpID09IGlkKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGV2aWNlOworICAgIGlmIChpZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogKnRoaXMpIHsKKyAgICAgICAgICAgIGlmIChkZXZpY2UtPmdldElkKCkgPT0gaWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBudWxscHRyOwogfQogCi1EZXZpY2VWZWN0b3IgRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VzRnJvbVR5cGUoYXVkaW9fZGV2aWNlc190IHR5cGUpIGNvbnN0CitEZXZpY2VWZWN0b3IgRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VzRnJvbVR5cGVNYXNrKGF1ZGlvX2RldmljZXNfdCB0eXBlKSBjb25zdAogewogICAgIERldmljZVZlY3RvciBkZXZpY2VzOwogICAgIGJvb2wgaXNPdXRwdXQgPSBhdWRpb19pc19vdXRwdXRfZGV2aWNlcyh0eXBlKTsKICAgICB0eXBlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyAoaSA8IHNpemUoKSkgJiYgKHR5cGUgIT0gQVVESU9fREVWSUNFX05PTkUpOyBpKyspIHsKLSAgICAgICAgYm9vbCBjdXJJc091dHB1dCA9IGF1ZGlvX2lzX291dHB1dF9kZXZpY2VzKGl0ZW1BdChpKS0+bURldmljZVR5cGUpOwotICAgICAgICBhdWRpb19kZXZpY2VzX3QgY3VyVHlwZSA9IGl0ZW1BdChpKS0+bURldmljZVR5cGUgJiB+QVVESU9fREVWSUNFX0JJVF9JTjsKKyAgICAgICAgYm9vbCBjdXJJc091dHB1dCA9IGF1ZGlvX2lzX291dHB1dF9kZXZpY2VzKGl0ZW1BdChpKS0+dHlwZSgpKTsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGN1clR5cGUgPSBpdGVtQXQoaSktPnR5cGUoKSAmIH5BVURJT19ERVZJQ0VfQklUX0lOOwogICAgICAgICBpZiAoKGlzT3V0cHV0ID09IGN1cklzT3V0cHV0KSAmJiAoKHR5cGUgJiBjdXJUeXBlKSAhPSAwKSkgewogICAgICAgICAgICAgZGV2aWNlcy5hZGQoaXRlbUF0KGkpKTsKICAgICAgICAgICAgIHR5cGUgJj0gfmN1clR5cGU7Ci0gICAgICAgICAgICBBTE9HVigiRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VzRnJvbVR5cGUoKSBmb3IgdHlwZSAleCBmb3VuZCAlcCIsCi0gICAgICAgICAgICAgICAgICBpdGVtQXQoaSktPnR5cGUoKSwgaXRlbUF0KGkpLmdldCgpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZGV2aWNlczsKLX0KLQotRGV2aWNlVmVjdG9yIERldmljZVZlY3Rvcjo6Z2V0RGV2aWNlc0Zyb21UeXBlQWRkcigKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MpIGNvbnN0Ci17Ci0gICAgRGV2aWNlVmVjdG9yIGRldmljZXM7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOiAqdGhpcykgewotICAgICAgICBpZiAoZGV2aWNlLT50eXBlKCkgPT0gdHlwZSAmJiBkZXZpY2UtPm1BZGRyZXNzID09IGFkZHJlc3MpIHsKLSAgICAgICAgICAgIGRldmljZXMuYWRkKGRldmljZSk7CisgICAgICAgICAgICBBTE9HVigiRGV2aWNlVmVjdG9yOjolcygpIGZvciB0eXBlICUwOHggZm91bmQgJXAiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgaXRlbUF0KGkpLT50eXBlKCksIGl0ZW1BdChpKS5nZXQoKSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGRldmljZXM7CkBAIC0yMDAsMjAgKzIxOSwxNSBAQAogICAgIHJldHVybiBudWxscHRyOwogfQogCi1zdGF0dXNfdCBEZXZpY2VWZWN0b3I6OmR1bXAoaW50IGZkLCBjb25zdCBTdHJpbmc4ICZ0YWcsIGludCBzcGFjZXMsIGJvb2wgdmVyYm9zZSkgY29uc3QKK3ZvaWQgRGV2aWNlVmVjdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgY29uc3QgU3RyaW5nOCAmdGFnLCBpbnQgc3BhY2VzLCBib29sIHZlcmJvc2UpIGNvbnN0CiB7CiAgICAgaWYgKGlzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtICVzIGRldmljZXM6XG4iLCBzcGFjZXMsICIiLCB0YWcuc3RyaW5nKCkpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSAlcyBkZXZpY2VzOlxuIiwgc3BhY2VzLCAiIiwgdGFnLnN0cmluZygpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGl0ZW1BdChpKS0+ZHVtcChmZCwgc3BhY2VzICsgMiwgaSwgdmVyYm9zZSk7CisgICAgICAgIGl0ZW1BdChpKS0+ZHVtcChkc3QsIHNwYWNlcyArIDIsIGksIHZlcmJvc2UpOwogICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIHZvaWQgRGV2aWNlRGVzY3JpcHRvcjo6dG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCkBAIC0yNDYsMTkgKzI2MCwxOCBAQAogICAgIC8vIHdpdGhvdXQgdGhlIHRlc3Q/CiAgICAgLy8gVGhpcyBoYXMgYmVlbiBkZW1vbnN0cmF0ZWQgdG8gTk9UIGJlIHRydWUgKGF0IHN0YXJ0IHVwKQogICAgIC8vIEFMT0dfQVNTRVJUKG1Nb2R1bGUgIT0gTlVMTCk7Ci0gICAgZHN0Q29uZmlnLT5leHQuZGV2aWNlLmh3X21vZHVsZSA9Ci0gICAgICAgICAgICBtTW9kdWxlICE9IDAgPyBtTW9kdWxlLT5nZXRIYW5kbGUoKSA6IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORTsKKyAgICBkc3RDb25maWctPmV4dC5kZXZpY2UuaHdfbW9kdWxlID0gZ2V0TW9kdWxlSGFuZGxlKCk7CiAgICAgKHZvaWQpYXVkaW9fdXRpbHNfc3RybGNweV96ZXJvZmlsbChkc3RDb25maWctPmV4dC5kZXZpY2UuYWRkcmVzcywgbUFkZHJlc3Muc3RyaW5nKCkpOwogfQogCiB2b2lkIERldmljZURlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdAogewotICAgIEFMT0dWKCJEZXZpY2VEZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydCgpIGhhbmRsZSAlZCB0eXBlICV4IiwgbUlkLCBtRGV2aWNlVHlwZSk7CisgICAgQUxPR1YoIkRldmljZURlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KCkgaGFuZGxlICVkIHR5cGUgJTA4eCIsIG1JZCwgbURldmljZVR5cGUpOwogICAgIEF1ZGlvUG9ydDo6dG9BdWRpb1BvcnQocG9ydCk7CiAgICAgcG9ydC0+aWQgPSBtSWQ7CiAgICAgdG9BdWRpb1BvcnRDb25maWcoJnBvcnQtPmFjdGl2ZV9jb25maWcpOwogICAgIHBvcnQtPmV4dC5kZXZpY2UudHlwZSA9IG1EZXZpY2VUeXBlOwotICAgIHBvcnQtPmV4dC5kZXZpY2UuaHdfbW9kdWxlID0gbU1vZHVsZS0+Z2V0SGFuZGxlKCk7CisgICAgcG9ydC0+ZXh0LmRldmljZS5od19tb2R1bGUgPSBnZXRNb2R1bGVIYW5kbGUoKTsKICAgICAodm9pZClhdWRpb191dGlsc19zdHJsY3B5X3plcm9maWxsKHBvcnQtPmV4dC5kZXZpY2UuYWRkcmVzcywgbUFkZHJlc3Muc3RyaW5nKCkpOwogfQogCkBAIC0yNzAsNDIgKzI4Myw3MyBAQAogICAgIHBvcnQtPnBpY2tBdWRpb1Byb2ZpbGUobVNhbXBsaW5nUmF0ZSwgbUNoYW5uZWxNYXNrLCBtRm9ybWF0KTsKIH0KIAotc3RhdHVzX3QgRGV2aWNlRGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCwgYm9vbCB2ZXJib3NlKSBjb25zdAordm9pZCBEZXZpY2VEZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4LCBib29sIHZlcmJvc2UpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNEZXZpY2UgJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc0RldmljZSAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4ICsgMSk7CiAgICAgaWYgKG1JZCAhPSAwKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gaWQ6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbUlkKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBpZDogJTJkXG4iLCBzcGFjZXMsICIiLCBtSWQpOwogICAgIH0KICAgICBpZiAoIW1UYWdOYW1lLmlzRW1wdHkoKSkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHRhZyBuYW1lOiAlc1xuIiwgc3BhY2VzLCAiIiwgbVRhZ05hbWUuc3RyaW5nKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIHRhZyBuYW1lOiAlc1xuIiwgc3BhY2VzLCAiIiwgbVRhZ05hbWUuc3RyaW5nKCkpOwogICAgIH0KICAgICBzdGQ6OnN0cmluZyBkZXZpY2VMaXRlcmFsOwogICAgIGlmIChkZXZpY2VUb1N0cmluZyhtRGV2aWNlVHlwZSwgZGV2aWNlTGl0ZXJhbCkpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSB0eXBlOiAlLTQ4c1xuIiwgc3BhY2VzLCAiIiwgZGV2aWNlTGl0ZXJhbC5jX3N0cigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSB0eXBlOiAlLTQ4c1xuIiwgc3BhY2VzLCAiIiwgZGV2aWNlTGl0ZXJhbC5jX3N0cigpKTsKICAgICB9CiAgICAgaWYgKG1BZGRyZXNzLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gYWRkcmVzczogJS0zMnNcbiIsIHNwYWNlcywgIiIsIG1BZGRyZXNzLnN0cmluZygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBhZGRyZXNzOiAlLTMyc1xuIiwgc3BhY2VzLCAiIiwgbUFkZHJlc3Muc3RyaW5nKCkpOwogICAgIH0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICBBdWRpb1BvcnQ6OmR1bXAoZmQsIHNwYWNlcywgdmVyYm9zZSk7CisgICAgQXVkaW9Qb3J0OjpkdW1wKGRzdCwgc3BhY2VzLCB2ZXJib3NlKTsKK30KIAotICAgIHJldHVybiBOT19FUlJPUjsKK3N0ZDo6c3RyaW5nIERldmljZURlc2NyaXB0b3I6OnRvU3RyaW5nKCkgY29uc3QKK3sKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzc3RyZWFtOworICAgIHNzdHJlYW0gPDwgInR5cGU6MHgiIDw8IHN0ZDo6aGV4IDw8IHR5cGUoKSA8PCAiLEA6IiA8PCBtQWRkcmVzczsKKyAgICByZXR1cm4gc3N0cmVhbS5zdHIoKTsKK30KKworc3RkOjpzdHJpbmcgRGV2aWNlVmVjdG9yOjp0b1N0cmluZygpIGNvbnN0Cit7CisgICAgaWYgKGlzRW1wdHkoKSkgeworICAgICAgICByZXR1cm4geyJBVURJT19ERVZJQ0VfTk9ORSJ9OworICAgIH0KKyAgICBzdGQ6OnN0cmluZyByZXN1bHQgPSB7InsifTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmRldmljZSA6ICp0aGlzKSB7CisgICAgICAgIGlmIChkZXZpY2UgIT0gKmJlZ2luKCkpIHsKKyAgICAgICAgICAgcmVzdWx0ICs9ICI7IjsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgKz0gZGV2aWNlLT50b1N0cmluZygpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0ICsgIn0iOworfQorCitEZXZpY2VWZWN0b3IgRGV2aWNlVmVjdG9yOjpmaWx0ZXIoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdAoreworICAgIERldmljZVZlY3RvciBmaWx0ZXJlZERldmljZXM7CisgICAgZm9yIChjb25zdCBhdXRvICZkZXZpY2UgOiAqdGhpcykgeworICAgICAgICBpZiAoZGV2aWNlcy5jb250YWlucyhkZXZpY2UpKSB7CisgICAgICAgICAgICBmaWx0ZXJlZERldmljZXMuYWRkKGRldmljZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZpbHRlcmVkRGV2aWNlczsKK30KKworYm9vbCBEZXZpY2VWZWN0b3I6OmNvbnRhaW5zQXRMZWFzdE9uZShjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0Cit7CisgICAgcmV0dXJuICFmaWx0ZXIoZGV2aWNlcykuaXNFbXB0eSgpOworfQorCitib29sIERldmljZVZlY3Rvcjo6Y29udGFpbnNBbGxEZXZpY2VzKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3QKK3sKKyAgICByZXR1cm4gZmlsdGVyKGRldmljZXMpLnNpemUoKSA9PSBkZXZpY2VzLnNpemUoKTsKIH0KIAogdm9pZCBEZXZpY2VEZXNjcmlwdG9yOjpsb2coKSBjb25zdAogewogICAgIHN0ZDo6c3RyaW5nIGRldmljZTsKICAgICBkZXZpY2VUb1N0cmluZyhtRGV2aWNlVHlwZSwgZGV2aWNlKTsKLSAgICBBTE9HSSgiRGV2aWNlIGlkOiVkIHR5cGU6MHglWDolcywgYWRkcjolcyIsIG1JZCwgIG1EZXZpY2VUeXBlLCBkZXZpY2UuY19zdHIoKSwKKyAgICBBTE9HSSgiRGV2aWNlIGlkOiVkIHR5cGU6MHglMDhYOiVzLCBhZGRyOiVzIiwgbUlkLCAgbURldmljZVR5cGUsIGRldmljZS5jX3N0cigpLAogICAgICAgICAgIG1BZGRyZXNzLnN0cmluZygpKTsKIAogICAgIEF1ZGlvUG9ydDo6bG9nKCIgICIpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRWZmZWN0RGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9FZmZlY3REZXNjcmlwdG9yLmNwcAppbmRleCA3YjIzNDFlLi40MGM0OWU3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9FZmZlY3REZXNjcmlwdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9FZmZlY3REZXNjcmlwdG9yLmNwcApAQCAtMjIsMjUgKzIyLDEzIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RhdHVzX3QgRWZmZWN0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCit2b2lkIEVmZmVjdERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEkvTzogJWRcbiIsIG1Jbyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTdHJhdGVneTogJWRcbiIsIG1TdHJhdGVneSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTZXNzaW9uOiAlZFxuIiwgbVNlc3Npb24pOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgTmFtZTogJXNcbiIsICBtRGVzYy5uYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICVzXG4iLCAgbUVuYWJsZWQgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc0kvTzogJWRcbiIsIHNwYWNlcywgIiIsIG1Jbyk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc1N0cmF0ZWd5OiAlZFxuIiwgc3BhY2VzLCAiIiwgbVN0cmF0ZWd5KTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzU2Vzc2lvbjogJWRcbiIsIHNwYWNlcywgIiIsIG1TZXNzaW9uKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzTmFtZTogJXNcbiIsIHNwYWNlcywgIiIsICBtRGVzYy5uYW1lKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzJXNcbiIsIHNwYWNlcywgIiIsICBtRW5hYmxlZCA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIpOwogfQogCiBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6RWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24oKSA6CkBAIC01Nyw2ICs0NSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCkKIHsKKyAgICBpZiAoZ2V0RWZmZWN0KGlkKSAhPSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCIlcyBlZmZlY3QgJXMgYWxyZWFkeSByZWdpc3RlcmVkIiwgX19GVU5DVElPTl9fLCBkZXNjLT5uYW1lKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKwogICAgIGlmIChtVG90YWxFZmZlY3RzTWVtb3J5ICsgZGVzYy0+bWVtb3J5VXNhZ2UgPiBnZXRNYXhFZmZlY3RzTWVtb3J5KCkpIHsKICAgICAgICAgQUxPR1coInJlZ2lzdGVyRWZmZWN0KCkgbWVtb3J5IGxpbWl0IGV4Y2VlZGVkIGZvciBGeCAlcywgTWVtb3J5ICVkIEtCIiwKICAgICAgICAgICAgICAgICBkZXNjLT5uYW1lLCBkZXNjLT5tZW1vcnlVc2FnZSk7CkBAIC03Miw2ICs2NSw3IEBACiAKICAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBlZmZlY3REZXNjID0gbmV3IEVmZmVjdERlc2NyaXB0b3IoKTsKICAgICBtZW1jcHkgKCZlZmZlY3REZXNjLT5tRGVzYywgZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICBlZmZlY3REZXNjLT5tSWQgPSBpZDsKICAgICBlZmZlY3REZXNjLT5tSW8gPSBpbzsKICAgICBlZmZlY3REZXNjLT5tU3RyYXRlZ3kgPSBzdGF0aWNfY2FzdDxyb3V0aW5nX3N0cmF0ZWd5PihzdHJhdGVneSk7CiAgICAgZWZmZWN0RGVzYy0+bVNlc3Npb24gPSBzZXNzaW9uOwpAQCAtODIsMTggKzc2LDIzIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6dW5yZWdpc3RlckVmZmVjdChpbnQgaWQpCitzcDxFZmZlY3REZXNjcmlwdG9yPiBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6Z2V0RWZmZWN0KGludCBpZCkgY29uc3QKIHsKICAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShpZCk7CiAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygidW5yZWdpc3RlckVmZmVjdCgpIHVua25vd24gZWZmZWN0IElEICVkIiwgaWQpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIHZhbHVlQXQoaW5kZXgpOworfQorCitzdGF0dXNfdCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6dW5yZWdpc3RlckVmZmVjdChpbnQgaWQpCit7CisgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0RGVzYyA9IGdldEVmZmVjdChpZCk7CisgICAgaWYgKGVmZmVjdERlc2MgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVygiJXMgdW5rbm93biBlZmZlY3QgSUQgJWQiLCBfX0ZVTkNUSU9OX18sIGlkKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGVmZmVjdERlc2MgPSB2YWx1ZUF0KGluZGV4KTsKLQotICAgIHNldEVmZmVjdEVuYWJsZWQoZWZmZWN0RGVzYywgZmFsc2UpOwotCiAgICAgaWYgKG1Ub3RhbEVmZmVjdHNNZW1vcnkgPCBlZmZlY3REZXNjLT5tRGVzYy5tZW1vcnlVc2FnZSkgewogICAgICAgICBBTE9HVygidW5yZWdpc3RlckVmZmVjdCgpIG1lbW9yeSAlZCB0b28gYmlnIGZvciB0b3RhbCAlZCIsCiAgICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bURlc2MubWVtb3J5VXNhZ2UsIG1Ub3RhbEVmZmVjdHNNZW1vcnkpOwpAQCAtMTE5LDYgKzExOCwxNCBAQAogICAgIHJldHVybiBzZXRFZmZlY3RFbmFibGVkKHZhbHVlQXQoaW5kZXgpLCBlbmFibGVkKTsKIH0KIAorYm9vbCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6aXNFZmZlY3RFbmFibGVkKGludCBpZCkgY29uc3QKK3sKKyAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShpZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB2YWx1ZUF0KGluZGV4KS0+bUVuYWJsZWQ7Cit9CiAKIHN0YXR1c190IEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjpzZXRFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+ICZlZmZlY3REZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVkKQpAQCAtMTUwLDcgKzE1Nyw3IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1ib29sIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjppc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpCitib29sIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjppc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpIGNvbnN0CiB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewogICAgICAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBlZmZlY3REZXNjID0gdmFsdWVBdChpKTsKQEAgLTE3NCwyNCArMTgxLDIyIEBACiAgICAgcmV0dXJuIE1BWF9FRkZFQ1RTX01FTU9SWTsKIH0KIAotc3RhdHVzX3QgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb246OmR1bXAoaW50IGZkKQordm9pZCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGJvb2wgdmVyYm9zZSkgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKLSAgICAgICAgICAgICJcblRvdGFsIEVmZmVjdHMgQ1BVOiAlZiBNSVBTLCBUb3RhbCBFZmZlY3RzIG1lbW9yeTogJWQgS0IsIE1heCBtZW1vcnkgdXNlZDogJWQgS0JcbiIsCi0gICAgICAgICAgICAgKGZsb2F0KW1Ub3RhbEVmZmVjdHNDcHVMb2FkLzEwLCBtVG90YWxFZmZlY3RzTWVtb3J5LCBtVG90YWxFZmZlY3RzTWVtb3J5TWF4VXNlZCk7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiUmVnaXN0ZXJlZCBlZmZlY3RzOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBFZmZlY3QgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkKTsKKyAgICBpZiAodmVyYm9zZSkgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgKKyAgICAgICAgICAgICJcbiUqc1RvdGFsIEVmZmVjdHMgQ1BVOiAlZiBNSVBTLCAiCisgICAgICAgICAgICAiVG90YWwgRWZmZWN0cyBtZW1vcnk6ICVkIEtCLCBNYXggbWVtb3J5IHVzZWQ6ICVkIEtCXG4iLAorICAgICAgICAgICAgc3BhY2VzLCAiIiwKKyAgICAgICAgICAgIChmbG9hdCkgbVRvdGFsRWZmZWN0c0NwdUxvYWQgLyAxMCwKKyAgICAgICAgICAgIG1Ub3RhbEVmZmVjdHNNZW1vcnksCisgICAgICAgICAgICBtVG90YWxFZmZlY3RzTWVtb3J5TWF4VXNlZCk7CiAgICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzRWZmZWN0czpcbiIsIHNwYWNlcywgIiIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gRWZmZWN0ICVkOlxuIiwgc3BhY2VzLCAiIiwga2V5QXQoaSkpOworICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCwgc3BhY2VzICsgMik7CisgICAgfQogfQogCiB9OyAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9HYWlucy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9HYWlucy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MDdhMTcuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvR2FpbnMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkFQTTo6R2FpbnMiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLS8vI2RlZmluZSBWRVJZX1ZFUkJPU0VfTE9HR0lORwotI2lmZGVmIFZFUllfVkVSQk9TRV9MT0dHSU5HCi0jZGVmaW5lIEFMT0dWViBBTE9HVgotI2Vsc2UKLSNkZWZpbmUgQUxPR1ZWKGEuLi4pIGRvIHsgfSB3aGlsZSgwKQotI2VuZGlmCi0KLSNpbmNsdWRlICJHYWlucy5oIgotI2luY2x1ZGUgPFZvbHVtZS5oPgotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gRW5naW5lZGVmYXVsdAotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNEZWZhdWx0Vm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHsxLCAtNDkuNWZ9LCB7MzMsIC0zMy41Zn0sIHs2NiwgLTE3LjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezEsIC01OC4wZn0sIHsyMCwgLTQwLjBmfSwgezYwLCAtMTcuMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTU4LjBmfSwgezIwLCAtNDAuMGZ9LCB7NjAsIC0yMS4wZn0sIHsxMDAsIC0xMC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHsxLCAtNTYuMGZ9LCB7MjAsIC0zNC4wZn0sIHs2MCwgLTExLjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVEcmNbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHsxLCAtNTUuMGZ9LCB7MjAsIC00My4wZn0sIHs4NiwgLTEyLjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTI5LjdmfSwgezMzLCAtMjAuMWZ9LCB7NjYsIC0xMC4yZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyY1tWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezEsIC0zNS43Zn0sIHszMywgLTI2LjFmfSwgezY2LCAtMTMuMmZ9LCB7MTAwLCAwLjBmfQotfTsKLQotLy8gQVVESU9fU1RSRUFNX1NZU1RFTSwgQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUgYW5kIEFVRElPX1NUUkVBTV9EVE1GIHZvbHVtZSB0cmFja3MKLS8vIEFVRElPX1NUUkVBTV9SSU5HIG9uIHBob25lcyBhbmQgQVVESU9fU1RSRUFNX01VU0lDIG9uIHRhYmxldHMuCi0vLyBBVURJT19TVFJFQU1fRFRNRiB0cmFja3MgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwgd2hpbGUgaW4gY2FsbCAoU2VlIEF1ZGlvU2VydmljZS5qYXZhKS4KLS8vIFRoZSByYW5nZSBpcyBjb25zdHJhaW5lZCBiZXR3ZWVuIC0yNGRCIGFuZCAtNmRCIG92ZXIgc3BlYWtlciBhbmQgLTMwZEIgYW5kIC0xOGRCIG92ZXIgaGVhZHNldC4KLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHsxLCAtMjQuMGZ9LCB7MzMsIC0xOC4wZn0sIHs2NiwgLTEyLjBmfSwgezEwMCwgLTYuMGZ9Ci19OwotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZURyY1tWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezEsIC0zNC4wZn0sIHszMywgLTI0LjBmfSwgezY2LCAtMTUuMGZ9LCB7MTAwLCAtNi4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTMwLjBmfSwgezMzLCAtMjYuMGZ9LCB7NjYsIC0yMi4wZn0sIHsxMDAsIC0xOC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHswLCAtNDIuMGZ9LCB7MzMsIC0yOC4wZn0sIHs2NiwgLTE0LjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHswLCAtMjQuMGZ9LCB7MzMsIC0xNi4wZn0sIHs2NiwgLTguMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNMaW5lYXJWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezAsIC05Ni4wZn0sIHszMywgLTY4LjBmfSwgezY2LCAtMzQuMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNTaWxlbnRWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezAsIC05Ni4wZn0sIHsxLCAtOTYuMGZ9LCB7MiwgLTk2LjBmfSwgezEwMCwgLTk2LjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezAsIDAuMGZ9LCB7MSwgMC4wZn0sIHsyLCAwLjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTEyOC4wZn0sIHsyMCwgLTgwLjBmfSwgezYwLCAtNDAuMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqR2FpbnM6OnNWb2x1bWVQcm9maWxlc1tBVURJT19TVFJFQU1fQ05UXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbREVWSUNFX0NBVEVHT1JZX0NOVF0gPSB7Ci0gICAgeyAvLyBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTAotICAgICAgICBHYWluczo6c0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c1NwZWFrZXJWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c1NwZWFrZXJWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9TWVNURU0KLSAgICAgICAgR2FpbnM6OnNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgICAgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9SSU5HCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9sdW1lQ3VydmUsICAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fTVVTSUMKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgICAgIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fQUxBUk0KLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c0RlZmF1bHRWb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04KLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c0RlZmF1bHRWb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlICAgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFCi0gICAgICAgIEdhaW5zOjpzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgICAgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7ICAvLyBBVURJT19TVFJFQU1fRFRNRgotICAgICAgICBHYWluczo6c0hlYWRzZXRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlICAgICAgIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fVFRTCi0gICAgICAvLyAiVHJhbnNtaXR0ZWQgVGhyb3VnaCBTcGVha2VyIjogYWx3YXlzIHNpbGVudCBleGNlcHQgb24gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNTaWxlbnRWb2x1bWVDdXJ2ZSwgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNTaWxlbnRWb2x1bWVDdXJ2ZSwgICAgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzU2lsZW50Vm9sdW1lQ3VydmUsICAgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWQotICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9SRVJPVVRJTkcKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9QQVRDSAotICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKLSAgICB9LAotfTsKLQotLy9zdGF0aWMKLWZsb2F0IEdhaW5zOjp2b2xJbmRleFRvRGIoY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqY3VydmUsIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4LCBpbnQgaW5kZXhJblVpKQotewotICAgIC8vIHRoZSB2b2x1bWUgaW5kZXggaW4gdGhlIFVJIGlzIHJlbGF0aXZlIHRvIHRoZSBtaW4gYW5kIG1heCB2b2x1bWUgaW5kaWNlcyBmb3IgdGhpcyBzdHJlYW0gdHlwZQotICAgIGludCBuYlN0ZXBzID0gMSArIGN1cnZlW1ZvbHVtZTo6Vk9MTUFYXS5tSW5kZXggLSBjdXJ2ZVtWb2x1bWU6OlZPTE1JTl0ubUluZGV4OwotICAgIGludCB2b2xJZHggPSAobmJTdGVwcyAqIChpbmRleEluVWkgLSBpbmRleE1pbikpIC8gKGluZGV4TWF4IC0gaW5kZXhNaW4pOwotCi0gICAgLy8gZmluZCB3aGF0IHBhcnQgb2YgdGhlIGN1cnZlIHRoaXMgaW5kZXggdm9sdW1lIGJlbG9uZ3MgdG8sIG9yIGlmIGl0J3Mgb3V0IG9mIGJvdW5kcwotICAgIGludCBzZWdtZW50ID0gMDsKLSAgICBpZiAodm9sSWR4IDwgY3VydmVbVm9sdW1lOjpWT0xNSU5dLm1JbmRleCkgeyAgICAgICAgIC8vIG91dCBvZiBib3VuZHMKLSAgICAgICAgcmV0dXJuIFZPTFVNRV9NSU5fREI7Ci0gICAgfSBlbHNlIGlmICh2b2xJZHggPCBjdXJ2ZVtWb2x1bWU6OlZPTEtORUUxXS5tSW5kZXgpIHsKLSAgICAgICAgc2VnbWVudCA9IDA7Ci0gICAgfSBlbHNlIGlmICh2b2xJZHggPCBjdXJ2ZVtWb2x1bWU6OlZPTEtORUUyXS5tSW5kZXgpIHsKLSAgICAgICAgc2VnbWVudCA9IDE7Ci0gICAgfSBlbHNlIGlmICh2b2xJZHggPD0gY3VydmVbVm9sdW1lOjpWT0xNQVhdLm1JbmRleCkgewotICAgICAgICBzZWdtZW50ID0gMjsKLSAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dCBvZiBib3VuZHMKLSAgICAgICAgcmV0dXJuIDAuMGY7Ci0gICAgfQotCi0gICAgLy8gbGluZWFyIGludGVycG9sYXRpb24gaW4gdGhlIGF0dGVudWF0aW9uIHRhYmxlIGluIGRCCi0gICAgZmxvYXQgZGVjaWJlbHMgPSBjdXJ2ZVtzZWdtZW50XS5tREJBdHRlbnVhdGlvbiArCi0gICAgICAgICAgICAoKGZsb2F0KSh2b2xJZHggLSBjdXJ2ZVtzZWdtZW50XS5tSW5kZXgpKSAqCi0gICAgICAgICAgICAgICAgKCAoY3VydmVbc2VnbWVudCsxXS5tREJBdHRlbnVhdGlvbiAtCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXJ2ZVtzZWdtZW50XS5tREJBdHRlbnVhdGlvbikgLwotICAgICAgICAgICAgICAgICAgICAoKGZsb2F0KShjdXJ2ZVtzZWdtZW50KzFdLm1JbmRleCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VydmVbc2VnbWVudF0ubUluZGV4KSkgKTsKLQotICAgIEFMT0dWVigiVk9MVU1FIHZvbCBpbmRleD1bJWQgJWQgJWRdLCBkQj1bJS4xZiAlLjFmICUuMWZdIiwKLSAgICAgICAgICAgIGN1cnZlW3NlZ21lbnRdLm1JbmRleCwgdm9sSWR4LAotICAgICAgICAgICAgY3VydmVbc2VnbWVudCsxXS5tSW5kZXgsCi0gICAgICAgICAgICBjdXJ2ZVtzZWdtZW50XS5tREJBdHRlbnVhdGlvbiwKLSAgICAgICAgICAgIGRlY2liZWxzLAotICAgICAgICAgICAgY3VydmVbc2VnbWVudCsxXS5tREJBdHRlbnVhdGlvbik7Ci0KLSAgICByZXR1cm4gZGVjaWJlbHM7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0h3TW9kdWxlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0h3TW9kdWxlLmNwcAppbmRleCBhZWY3ZGJlLi44MGFmODhkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Id01vZHVsZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSHdNb2R1bGUuY3BwCkBAIC01MSw3ICs1MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSkpOwogCiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKGRldmljZSk7Ci0gICAgZGV2RGVzYy0+bUFkZHJlc3MgPSBhZGRyZXNzOworICAgIGRldkRlc2MtPnNldEFkZHJlc3MoYWRkcmVzcyk7CiAgICAgcHJvZmlsZS0+YWRkU3VwcG9ydGVkRGV2aWNlKGRldkRlc2MpOwogCiAgICAgcmV0dXJuIGFkZE91dHB1dFByb2ZpbGUocHJvZmlsZSk7CkBAIC0xMTMsNyArMTEzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlKSk7CiAKICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gbmV3IERldmljZURlc2NyaXB0b3IoZGV2aWNlKTsKLSAgICBkZXZEZXNjLT5tQWRkcmVzcyA9IGFkZHJlc3M7CisgICAgZGV2RGVzYy0+c2V0QWRkcmVzcyhhZGRyZXNzKTsKICAgICBwcm9maWxlLT5hZGRTdXBwb3J0ZWREZXZpY2UoZGV2RGVzYyk7CiAKICAgICBBTE9HVigiYWRkSW5wdXRQcm9maWxlKCkgbmFtZSAlcyByYXRlICVkIG1hc2sgMHglMDh4IiwKQEAgLTIxOCwzNyArMjE4LDM2IEBACiAgICAgbUhhbmRsZSA9IGhhbmRsZTsKIH0KIAotdm9pZCBId01vZHVsZTo6ZHVtcChpbnQgZmQpCi17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Citib29sIEh3TW9kdWxlOjpzdXBwb3J0c1BhdGNoKGNvbnN0IHNwPEF1ZGlvUG9ydD4gJnNyY1BvcnQsIGNvbnN0IHNwPEF1ZGlvUG9ydD4gJmRzdFBvcnQpIGNvbnN0IHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnJvdXRlIDogbVJvdXRlcykgeworICAgICAgICBpZiAocm91dGUtPnN1cHBvcnRzUGF0Y2goc3JjUG9ydCwgZHN0UG9ydCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KIAotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgLSBuYW1lOiAlc1xuIiwgZ2V0TmFtZSgpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAtIGhhbmRsZTogJWRcbiIsIG1IYW5kbGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgIC0gdmVyc2lvbjogJXUuJXVcbiIsIGdldEhhbFZlcnNpb25NYWpvcigpLCBnZXRIYWxWZXJzaW9uTWlub3IoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwordm9pZCBId01vZHVsZTo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAgLSBuYW1lOiAlc1xuIiwgZ2V0TmFtZSgpKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICAtIGhhbmRsZTogJWRcbiIsIG1IYW5kbGUpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgIC0gdmVyc2lvbjogJXUuJXVcbiIsIGdldEhhbFZlcnNpb25NYWpvcigpLCBnZXRIYWxWZXJzaW9uTWlub3IoKSk7CiAgICAgaWYgKG1PdXRwdXRQcm9maWxlcy5zaXplKCkpIHsKLSAgICAgICAgd3JpdGUoZmQsICIgIC0gb3V0cHV0czpcbiIsIHN0cmxlbigiICAtIG91dHB1dHM6XG4iKSk7CisgICAgICAgIGRzdC0+YXBwZW5kKCIgIC0gb3V0cHV0czpcbiIpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgIG91dHB1dCAlenU6XG4iLCBpKTsKLSAgICAgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgICAgIG1PdXRwdXRQcm9maWxlc1tpXS0+ZHVtcChmZCk7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICAgIG91dHB1dCAlenU6XG4iLCBpKTsKKyAgICAgICAgICAgIG1PdXRwdXRQcm9maWxlc1tpXS0+ZHVtcChkc3QpOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChtSW5wdXRQcm9maWxlcy5zaXplKCkpIHsKLSAgICAgICAgd3JpdGUoZmQsICIgIC0gaW5wdXRzOlxuIiwgc3RybGVuKCIgIC0gaW5wdXRzOlxuIikpOworICAgICAgICBkc3QtPmFwcGVuZCgiICAtIGlucHV0czpcbiIpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgaW5wdXQgJXp1OlxuIiwgaSk7Ci0gICAgICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgICAgICBtSW5wdXRQcm9maWxlc1tpXS0+ZHVtcChmZCk7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICAgIGlucHV0ICV6dTpcbiIsIGkpOworICAgICAgICAgICAgbUlucHV0UHJvZmlsZXNbaV0tPmR1bXAoZHN0KTsKICAgICAgICAgfQogICAgIH0KLSAgICBtRGVjbGFyZWREZXZpY2VzLmR1bXAoZmQsIFN0cmluZzgoIkRlY2xhcmVkIiksICAyLCB0cnVlKTsKLSAgICBtUm91dGVzLmR1bXAoZmQsIDIpOworICAgIG1EZWNsYXJlZERldmljZXMuZHVtcChkc3QsIFN0cmluZzgoIkRlY2xhcmVkIiksIDIsIHRydWUpOworICAgIG1Sb3V0ZXMuZHVtcChkc3QsIDIpOwogfQogCiBzcCA8SHdNb2R1bGU+IEh3TW9kdWxlQ29sbGVjdGlvbjo6Z2V0TW9kdWxlRnJvbU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3QKQEAgLTI3OCw5ICsyNzcsMTAgQEAKIHNwPERldmljZURlc2NyaXB0b3I+IEh3TW9kdWxlQ29sbGVjdGlvbjo6Z2V0RGV2aWNlRGVzY3JpcHRvcihjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbWF0Y2hBZHJlc3MpIGNvbnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtYXRjaEFkZHJlc3MpIGNvbnN0CiB7Ci0gICAgU3RyaW5nOCBhZGRyZXNzID0gKGRldmljZV9hZGRyZXNzID09IG51bGxwdHIpID8gU3RyaW5nOCgiIikgOiBTdHJpbmc4KGRldmljZV9hZGRyZXNzKTsKKyAgICBTdHJpbmc4IGFkZHJlc3MgPSAoZGV2aWNlX2FkZHJlc3MgPT0gbnVsbHB0ciB8fCAhbWF0Y2hBZGRyZXNzKSA/CisgICAgICAgICAgICBTdHJpbmc4KCIiKSA6IFN0cmluZzgoZGV2aWNlX2FkZHJlc3MpOwogICAgIC8vIGhhbmRsZSBsZWdhY3kgcmVtb3RlIHN1Ym1peCBjYXNlIHdoZXJlIHRoZSBhZGRyZXNzIHdhcyBub3QgYWx3YXlzIHNwZWNpZmllZAogICAgIGlmIChkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZSkgJiYgKGFkZHJlc3MubGVuZ3RoKCkgPT0gMCkpIHsKICAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKQEAgLTI4OCwzNyArMjg4LDI1IEBACiAKICAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogKnRoaXMpIHsKICAgICAgICAgRGV2aWNlVmVjdG9yIGRlY2xhcmVkRGV2aWNlcyA9IGh3TW9kdWxlLT5nZXREZWNsYXJlZERldmljZXMoKTsKLSAgICAgICAgRGV2aWNlVmVjdG9yIGRldmljZUxpc3QgPSBkZWNsYXJlZERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlQWRkcihkZXZpY2UsIGFkZHJlc3MpOwotICAgICAgICBpZiAoIWRldmljZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGV2aWNlTGlzdC5pdGVtQXQoMCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtYXRjaEFkcmVzcykgewotICAgICAgICAgICAgZGV2aWNlTGlzdCA9IGRlY2xhcmVkRGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKTsKLSAgICAgICAgICAgIGlmICghZGV2aWNlTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlTGlzdC5pdGVtQXQoMCk7Ci0gICAgICAgICAgICB9CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2MgPSBkZWNsYXJlZERldmljZXMuZ2V0RGV2aWNlKGRldmljZSwgYWRkcmVzcyk7CisgICAgICAgIGlmIChkZXZpY2VEZXNjKSB7CisgICAgICAgICAgICByZXR1cm4gZGV2aWNlRGVzYzsKICAgICAgICAgfQogICAgIH0KIAogICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihkZXZpY2UpOwogICAgIGRldkRlc2MtPnNldE5hbWUoU3RyaW5nOChkZXZpY2VfbmFtZSkpOwotICAgIGRldkRlc2MtPm1BZGRyZXNzID0gYWRkcmVzczsKKyAgICBkZXZEZXNjLT5zZXRBZGRyZXNzKGFkZHJlc3MpOwogICAgIHJldHVybiBkZXZEZXNjOwogfQogCi1zdGF0dXNfdCBId01vZHVsZUNvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAordm9pZCBId01vZHVsZUNvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5IVyBNb2R1bGVzIGR1bXA6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZHN0LT5hcHBlbmQoIlxuSFcgTW9kdWxlcyBkdW1wOlxuIik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIEhXIE1vZHVsZSAlenU6XG4iLCBpICsgMSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgaXRlbUF0KGkpLT5kdW1wKGZkKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIi0gSFcgTW9kdWxlICV6dTpcbiIsIGkgKyAxKTsKKyAgICAgICAgaXRlbUF0KGkpLT5kdW1wKGRzdCk7CiAgICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9JT1Byb2ZpbGUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSU9Qcm9maWxlLmNwcAppbmRleCBmYmMyMzg0Li4zNzg4MjQ0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9JT1Byb2ZpbGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0lPUHJvZmlsZS5jcHAKQEAgLTE3LDYgKzE3LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiQVBNOjpJT1Byb2ZpbGUiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8tYmFzZS5oPgogI2luY2x1ZGUgIklPUHJvZmlsZS5oIgogI2luY2x1ZGUgIkh3TW9kdWxlLmgiCiAjaW5jbHVkZSAiQXVkaW9HYWluLmgiCkBAIC02NiwxOSArNjcsMjMgQEAKICAgICBhdWRpb19mb3JtYXRfdCBteVVwZGF0ZWRGb3JtYXQgPSBmb3JtYXQ7CiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbXlVcGRhdGVkQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzazsKICAgICB1aW50MzJfdCBteVVwZGF0ZWRTYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGU7CisgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIGNvbmZpZyA9IHsKKyAgICAgICAgLmNvbmZpZ19tYXNrID0gQVVESU9fUE9SVF9DT05GSUdfQUxMICYgfkFVRElPX1BPUlRfQ09ORklHX0dBSU4sCisgICAgICAgIC5zYW1wbGVfcmF0ZSA9IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgLmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrLAorICAgICAgICAuZm9ybWF0ID0gZm9ybWF0LAorICAgIH07CiAgICAgaWYgKGlzUmVjb3JkVGhyZWFkKQogICAgIHsKLSAgICAgICAgaWYgKGNoZWNrQ29tcGF0aWJsZUF1ZGlvUHJvZmlsZSgKKyAgICAgICAgaWYgKChmbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfTU1BUF9OT0lSUSkgIT0gMCkgeworICAgICAgICAgICAgaWYgKGNoZWNrRXhhY3RBdWRpb1Byb2ZpbGUoJmNvbmZpZykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tDb21wYXRpYmxlQXVkaW9Qcm9maWxlKAogICAgICAgICAgICAgICAgIG15VXBkYXRlZFNhbXBsaW5nUmF0ZSwgbXlVcGRhdGVkQ2hhbm5lbE1hc2ssIG15VXBkYXRlZEZvcm1hdCkgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBjb25maWcgPSB7Ci0gICAgICAgICAgICAuY29uZmlnX21hc2sgPSBBVURJT19QT1JUX0NPTkZJR19BTEwgJiB+QVVESU9fUE9SVF9DT05GSUdfR0FJTiwKLSAgICAgICAgICAgIC5zYW1wbGVfcmF0ZSA9IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgIC5jaGFubmVsX21hc2sgPSBjaGFubmVsTWFzaywKLSAgICAgICAgICAgIC5mb3JtYXQgPSBmb3JtYXQsCi0gICAgICAgIH07CiAgICAgICAgIGlmIChjaGVja0V4YWN0QXVkaW9Qcm9maWxlKCZjb25maWcpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KQEAgLTEwOCwxNiArMTEzLDExIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgSU9Qcm9maWxlOjpkdW1wKGludCBmZCkKK3ZvaWQgSU9Qcm9maWxlOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICBBdWRpb1BvcnQ6OmR1bXAoZHN0LCA0KTsKIAotICAgIEF1ZGlvUG9ydDo6ZHVtcChmZCwgNCk7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgLSBmbGFnczogMHglMDR4IiwgZ2V0RmxhZ3MoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgICAgLSBmbGFnczogMHglMDR4IiwgZ2V0RmxhZ3MoKSk7CiAgICAgc3RkOjpzdHJpbmcgZmxhZ3NMaXRlcmFsOwogICAgIGlmIChnZXRSb2xlKCkgPT0gQVVESU9fUE9SVF9ST0xFX1NJTkspIHsKICAgICAgICAgSW5wdXRGbGFnQ29udmVydGVyOjptYXNrVG9TdHJpbmcoZ2V0RmxhZ3MoKSwgZmxhZ3NMaXRlcmFsKTsKQEAgLTEyNSwyMSArMTI1LDE0IEBACiAgICAgICAgIE91dHB1dEZsYWdDb252ZXJ0ZXI6Om1hc2tUb1N0cmluZyhnZXRGbGFncygpLCBmbGFnc0xpdGVyYWwpOwogICAgIH0KICAgICBpZiAoIWZsYWdzTGl0ZXJhbC5lbXB0eSgpKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAoJXMpIiwgZmxhZ3NMaXRlcmFsLmNfc3RyKCkpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICglcykiLCBmbGFnc0xpdGVyYWwuY19zdHIoKSk7CiAgICAgfQotICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgbVN1cHBvcnRlZERldmljZXMuZHVtcChmZCwgU3RyaW5nOCgiU3VwcG9ydGVkIiksIDQsIGZhbHNlKTsKLQotICAgIHJlc3VsdC5jbGVhcigpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuICAgIC0gbWF4T3BlbkNvdW50OiAldSAtIGN1ck9wZW5Db3VudDogJXVcbiIsCisgICAgZHN0LT5hcHBlbmQoIlxuIik7CisgICAgbVN1cHBvcnRlZERldmljZXMuZHVtcChkc3QsIFN0cmluZzgoIlN1cHBvcnRlZCIpLCA0LCBmYWxzZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuICAgIC0gbWF4T3BlbkNvdW50OiAldSAtIGN1ck9wZW5Db3VudDogJXVcbiIsCiAgICAgICAgICAgICAgbWF4T3BlbkNvdW50LCBjdXJPcGVuQ291bnQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgLSBtYXhBY3RpdmVDb3VudDogJXUgLSBjdXJBY3RpdmVDb3VudDogJXVcbiIsCisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAgICAtIG1heEFjdGl2ZUNvdW50OiAldSAtIGN1ckFjdGl2ZUNvdW50OiAldVxuIiwKICAgICAgICAgICAgICBtYXhBY3RpdmVDb3VudCwgY3VyQWN0aXZlQ291bnQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogfQogCiB2b2lkIElPUHJvZmlsZTo6bG9nKCkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1NlcmlhbGl6ZXIuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2VyaWFsaXplci5jcHAKaW5kZXggYTI1MzExMy4uMTE1NDY1NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2VyaWFsaXplci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2VyaWFsaXplci5jcHAKQEAgLTE3LDI0MSArMTcsNDQxIEBACiAjZGVmaW5lIExPR19UQUcgIkFQTTo6U2VyaWFsaXplciIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAotI2luY2x1ZGUgIlNlcmlhbGl6ZXIuaCIKLSNpbmNsdWRlIDxtZWRpYS9jb252ZXJ0Lmg+Ci0jaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CiAjaW5jbHVkZSA8bGlieG1sL3BhcnNlci5oPgogI2luY2x1ZGUgPGxpYnhtbC94aW5jbHVkZS5oPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPGlzdHJlYW0+Ci0KLXVzaW5nIHN0ZDo6c3RyaW5nOworI2luY2x1ZGUgPG1lZGlhL2NvbnZlcnQuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgIlNlcmlhbGl6ZXIuaCIKKyNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RyaW5nIGdldFhtbEF0dHJpYnV0ZShjb25zdCB4bWxOb2RlICpjdXIsIGNvbnN0IGNoYXIgKmF0dHJpYnV0ZSkKK25hbWVzcGFjZSB7CisKKy8vIFRPRE8obW5hZ2Fub3YpOiBDb25zaWRlciBmaW5kaW5nIGFuIGFsdGVybmF0aXZlIGZvciB1c2luZyBISURMIGNvZGUuCit1c2luZyBoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgaGFyZHdhcmU6OlN0YXR1czsKK3VzaW5nIHV0aWxpdGllczo6Y29udmVydFRvOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBFLCB0eXBlbmFtZSBDPgorc3RydWN0IEFuZHJvaWRDb2xsZWN0aW9uVHJhaXRzIHsKKyAgICB0eXBlZGVmIHNwPEU+IEVsZW1lbnQ7CisgICAgdHlwZWRlZiBDIENvbGxlY3Rpb247CisgICAgdHlwZWRlZiB2b2lkKiBQdHJTZXJpYWxpemluZ0N0eDsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBhZGRFbGVtZW50VG9Db2xsZWN0aW9uKGNvbnN0IEVsZW1lbnQgJmVsZW1lbnQsIENvbGxlY3Rpb24gKmNvbGxlY3Rpb24pIHsKKyAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24tPmFkZChlbGVtZW50KSA+PSAwID8gTk9fRVJST1IgOiBCQURfVkFMVUU7CisgICAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgQz4KK3N0cnVjdCBTdGRDb2xsZWN0aW9uVHJhaXRzIHsKKyAgICB0eXBlZGVmIEMgQ29sbGVjdGlvbjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEM6OnZhbHVlX3R5cGUgRWxlbWVudDsKKyAgICB0eXBlZGVmIHZvaWQqIFB0clNlcmlhbGl6aW5nQ3R4OworCisgICAgc3RhdGljIHN0YXR1c190IGFkZEVsZW1lbnRUb0NvbGxlY3Rpb24oY29uc3QgRWxlbWVudCAmZWxlbWVudCwgQ29sbGVjdGlvbiAqY29sbGVjdGlvbikgeworICAgICAgICBhdXRvIHBhaXIgPSBjb2xsZWN0aW9uLT5pbnNlcnQoZWxlbWVudCk7CisgICAgICAgIHJldHVybiBwYWlyLnNlY29uZCA/IE5PX0VSUk9SIDogQkFEX1ZBTFVFOworICAgIH0KK307CisKK3N0cnVjdCBBdWRpb0dhaW5UcmFpdHMgOiBwdWJsaWMgQW5kcm9pZENvbGxlY3Rpb25UcmFpdHM8QXVkaW9HYWluLCBBdWRpb0dhaW5Db2xsZWN0aW9uPgogewotICAgIHhtbENoYXIgKnhtbFZhbHVlID0geG1sR2V0UHJvcChjdXIsIChjb25zdCB4bWxDaGFyKilhdHRyaWJ1dGUpOwotICAgIGlmICh4bWxWYWx1ZSA9PSBOVUxMKSB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAiZ2FpbiI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gImdhaW5zIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzCisgICAgeworICAgICAgICAvKiogZ2FpbiBtb2RlcyBzdXBwb3J0ZWQsIGUuZy4gQVVESU9fR0FJTl9NT0RFX0NIQU5ORUxTLiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm1vZGUgPSAibW9kZSI7CisgICAgICAgIC8qKiBjb250cm9sbGVkIGNoYW5uZWxzLCBuZWVkZWQgaWYgbW9kZSBBVURJT19HQUlOX01PREVfQ0hBTk5FTFMuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY2hhbm5lbE1hc2sgPSAiY2hhbm5lbF9tYXNrIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICptaW5WYWx1ZU1CID0gIm1pblZhbHVlTUIiOyAvKio8IG1pbiB2YWx1ZSBpbiBtaWxsaWJlbC4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICptYXhWYWx1ZU1CID0gIm1heFZhbHVlTUIiOyAvKio8IG1heCB2YWx1ZSBpbiBtaWxsaWJlbC4gKi8KKyAgICAgICAgLyoqIGRlZmF1bHQgdmFsdWUgaW4gbWlsbGliZWwuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqZGVmYXVsdFZhbHVlTUIgPSAiZGVmYXVsdFZhbHVlTUIiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnN0ZXBWYWx1ZU1CID0gInN0ZXBWYWx1ZU1CIjsgLyoqPCBzdGVwIHZhbHVlIGluIG1pbGxpYmVsLiAqLworICAgICAgICAvKiogbmVlZGVkIGlmIG1vZGUgQVVESU9fR0FJTl9NT0RFX1JBTVAuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbWluUmFtcE1zID0gIm1pblJhbXBNcyI7CisgICAgICAgIC8qKiBuZWVkZWQgaWYgbW9kZSBBVURJT19HQUlOX01PREVfUkFNUC4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICptYXhSYW1wTXMgPSAibWF4UmFtcE1zIjsKKyAgICB9OworCisgICAgc3RhdGljIFJldHVybjxFbGVtZW50PiBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7CisgICAgLy8gTm8gY2hpbGRyZW4KK307CisKKy8vIEEgcHJvZmlsZSBzZWN0aW9uIGNvbnRhaW5zIGEgbmFtZSwgIG9uZSBhdWRpbyBmb3JtYXQgYW5kIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBzYW1wbGluZyByYXRlcworLy8gYW5kIGNoYW5uZWwgbWFza3MgZm9yIHRoaXMgZm9ybWF0CitzdHJ1Y3QgQXVkaW9Qcm9maWxlVHJhaXRzIDogcHVibGljIEFuZHJvaWRDb2xsZWN0aW9uVHJhaXRzPEF1ZGlvUHJvZmlsZSwgQXVkaW9Qcm9maWxlVmVjdG9yPgoreworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gInByb2ZpbGUiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJwcm9maWxlcyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcworICAgIHsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzYW1wbGluZ1JhdGVzID0gInNhbXBsaW5nUmF0ZXMiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmZvcm1hdCA9ICJmb3JtYXQiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNoYW5uZWxNYXNrcyA9ICJjaGFubmVsTWFza3MiOworICAgIH07CisKKyAgICBzdGF0aWMgUmV0dXJuPEVsZW1lbnQ+IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKK307CisKK3N0cnVjdCBNaXhQb3J0VHJhaXRzIDogcHVibGljIEFuZHJvaWRDb2xsZWN0aW9uVHJhaXRzPElPUHJvZmlsZSwgSU9Qcm9maWxlQ29sbGVjdGlvbj4KK3sKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJtaXhQb3J0IjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAibWl4UG9ydHMiOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMKKyAgICB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbmFtZSA9ICJuYW1lIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpyb2xlID0gInJvbGUiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnJvbGVTb3VyY2UgPSAic291cmNlIjsgLyoqPCA8YXR0cmlidXRlIHJvbGUgc291cmNlIHZhbHVlPi4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpmbGFncyA9ICJmbGFncyI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbWF4T3BlbkNvdW50ID0gIm1heE9wZW5Db3VudCI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbWF4QWN0aXZlQ291bnQgPSAibWF4QWN0aXZlQ291bnQiOworICAgIH07CisKKyAgICBzdGF0aWMgUmV0dXJuPEVsZW1lbnQ+IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKKyAgICAvLyBDaGlsZHJlbjogR2FpblRyYWl0cworfTsKKworc3RydWN0IERldmljZVBvcnRUcmFpdHMgOiBwdWJsaWMgQW5kcm9pZENvbGxlY3Rpb25UcmFpdHM8RGV2aWNlRGVzY3JpcHRvciwgRGV2aWNlVmVjdG9yPgoreworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gImRldmljZVBvcnQiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJkZXZpY2VQb3J0cyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcworICAgIHsKKyAgICAgICAgLyoqICA8ZGV2aWNlIHRhZyBuYW1lPjogYW55IHN0cmluZyB3aXRob3V0IHNwYWNlLiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZ05hbWUgPSAidGFnTmFtZSI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdHlwZSA9ICJ0eXBlIjsgLyoqPCA8ZGV2aWNlIHR5cGU+LiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnJvbGUgPSAicm9sZSI7IC8qKjwgPGRldmljZSByb2xlOiBzaW5rIG9yIHNvdXJjZT4uICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqcm9sZVNvdXJjZSA9ICJzb3VyY2UiOyAvKio8IDxhdHRyaWJ1dGUgcm9sZSBzb3VyY2UgdmFsdWU+LiAqLworICAgICAgICAvKiogb3B0aW9uYWw6IGRldmljZSBhZGRyZXNzLCBjaGFyIHN0cmluZyBsZXNzIHRoYW4gNjQuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqYWRkcmVzcyA9ICJhZGRyZXNzIjsKKyAgICB9OworCisgICAgc3RhdGljIFJldHVybjxFbGVtZW50PiBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7CisgICAgLy8gQ2hpbGRyZW46IEdhaW5UcmFpdHMgKG9wdGlvbmFsKQorfTsKKworc3RydWN0IFJvdXRlVHJhaXRzIDogcHVibGljIEFuZHJvaWRDb2xsZWN0aW9uVHJhaXRzPEF1ZGlvUm91dGUsIEF1ZGlvUm91dGVWZWN0b3I+Cit7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAicm91dGUiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJyb3V0ZXMiOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMKKyAgICB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdHlwZSA9ICJ0eXBlIjsgLyoqPCA8cm91dGUgdHlwZT46IG1peCBvciBtdXguICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdHlwZU1peCA9ICJtaXgiOyAvKio8IHR5cGUgYXR0cmlidXRlIG1peCB2YWx1ZS4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzaW5rID0gInNpbmsiOyAvKio8IDxzaW5rOiBpbnZvbHZlZCBpbiB0aGlzIHJvdXRlPi4gKi8KKyAgICAgICAgLyoqIHNvdXJjZXM6IGFsbCBzb3VyY2UgdGhhdCBjYW4gYmUgaW52b2x2ZWQgaW4gdGhpcyByb3V0ZS4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzb3VyY2VzID0gInNvdXJjZXMiOworICAgIH07CisKKyAgICB0eXBlZGVmIEh3TW9kdWxlICpQdHJTZXJpYWxpemluZ0N0eDsKKworICAgIHN0YXRpYyBSZXR1cm48RWxlbWVudD4gZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLCBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOworfTsKKworc3RydWN0IE1vZHVsZVRyYWl0cyA6IHB1YmxpYyBBbmRyb2lkQ29sbGVjdGlvblRyYWl0czxId01vZHVsZSwgSHdNb2R1bGVDb2xsZWN0aW9uPgoreworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gIm1vZHVsZSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gIm1vZHVsZXMiOworCisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjaGlsZEF0dGFjaGVkRGV2aWNlc1RhZyA9ICJhdHRhY2hlZERldmljZXMiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY2hpbGRBdHRhY2hlZERldmljZVRhZyA9ICJpdGVtIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNoaWxkRGVmYXVsdE91dHB1dERldmljZVRhZyA9ICJkZWZhdWx0T3V0cHV0RGV2aWNlIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzCisgICAgeworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm5hbWUgPSAibmFtZSI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdmVyc2lvbiA9ICJoYWxWZXJzaW9uIjsKKyAgICB9OworCisgICAgdHlwZWRlZiBBdWRpb1BvbGljeUNvbmZpZyAqUHRyU2VyaWFsaXppbmdDdHg7CisKKyAgICBzdGF0aWMgUmV0dXJuPEVsZW1lbnQ+IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKKyAgICAvLyBDaGlsZHJlbjogbWl4UG9ydFRyYWl0cywgZGV2aWNlUG9ydFRyYWl0cywgYW5kIHJvdXRlVHJhaXRzCisgICAgLy8gTmVlZCB0byBjYWxsIGRlc2VyaWFsaXplIG9uIGVhY2ggY2hpbGQKK307CisKK3N0cnVjdCBHbG9iYWxDb25maWdUcmFpdHMKK3sKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJnbG9iYWxDb25maWd1cmF0aW9uIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzCisgICAgeworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnNwZWFrZXJEcmNFbmFibGVkID0gInNwZWFrZXJfZHJjX2VuYWJsZWQiOworICAgIH07CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqcm9vdCwgQXVkaW9Qb2xpY3lDb25maWcgKmNvbmZpZyk7Cit9OworCitzdHJ1Y3QgVm9sdW1lVHJhaXRzIDogcHVibGljIEFuZHJvaWRDb2xsZWN0aW9uVHJhaXRzPFZvbHVtZUN1cnZlLCBWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uPgoreworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gInZvbHVtZSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gInZvbHVtZXMiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdm9sdW1lUG9pbnRUYWcgPSAicG9pbnQiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqcmVmZXJlbmNlVGFnID0gInJlZmVyZW5jZSI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcworICAgIHsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzdHJlYW0gPSAic3RyZWFtIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpkZXZpY2VDYXRlZ29yeSA9ICJkZXZpY2VDYXRlZ29yeSI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqcmVmZXJlbmNlID0gInJlZiI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqcmVmZXJlbmNlTmFtZSA9ICJuYW1lIjsKKyAgICB9OworCisgICAgc3RhdGljIFJldHVybjxFbGVtZW50PiBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7CisgICAgLy8gTm8gQ2hpbGRyZW4KK307CisKK3N0cnVjdCBTdXJyb3VuZFNvdW5kVHJhaXRzCit7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAic3Vycm91bmRTb3VuZCI7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqcm9vdCwgQXVkaW9Qb2xpY3lDb25maWcgKmNvbmZpZyk7CisgICAgLy8gQ2hpbGRyZW46IFN1cnJvdW5kU291bmRGb3JtYXRUcmFpdHMKK307CisKK3N0cnVjdCBTdXJyb3VuZFNvdW5kRm9ybWF0VHJhaXRzIDogcHVibGljIFN0ZENvbGxlY3Rpb25UcmFpdHM8QXVkaW9Qb2xpY3lDb25maWc6OlN1cnJvdW5kRm9ybWF0cz4KK3sKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJmb3JtYXQiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJmb3JtYXRzIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzCisgICAgeworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm5hbWUgPSAibmFtZSI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqc3ViZm9ybWF0cyA9ICJzdWJmb3JtYXRzIjsKKyAgICB9OworCisgICAgc3RhdGljIFJldHVybjxFbGVtZW50PiBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7Cit9OworCitjbGFzcyBQb2xpY3lTZXJpYWxpemVyCit7CitwdWJsaWM6CisgICAgUG9saWN5U2VyaWFsaXplcigpIDogbVZlcnNpb257c3RkOjp0b19zdHJpbmcoZ01ham9yKSArICIuIiArIHN0ZDo6dG9fc3RyaW5nKGdNaW5vcil9CisgICAgeworICAgICAgICBBTE9HVigiJXM6IFZlcnNpb249JXMgUm9vdD0lcyIsIF9fZnVuY19fLCBtVmVyc2lvbi5jX3N0cigpLCByb290TmFtZSk7CisgICAgfQorICAgIHN0YXR1c190IGRlc2VyaWFsaXplKGNvbnN0IGNoYXIgKmNvbmZpZ0ZpbGUsIEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcpOworCitwcml2YXRlOgorICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqcm9vdE5hbWUgPSAiYXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnZlcnNpb25BdHRyaWJ1dGUgPSAidmVyc2lvbiI7CisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBnTWFqb3IgPSAxOyAvKio8IHRoZSBtYWpvciBudW1iZXIgb2YgdGhlIHBvbGljeSB4bWwgZm9ybWF0IHZlcnNpb24uICovCisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBnTWlub3IgPSAwOyAvKio8IHRoZSBtaW5vciBudW1iZXIgb2YgdGhlIHBvbGljeSB4bWwgZm9ybWF0IHZlcnNpb24uICovCisKKyAgICB0eXBlZGVmIEF1ZGlvUG9saWN5Q29uZmlnIEVsZW1lbnQ7CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBtVmVyc2lvbjsKKworICAgIC8vIENoaWxkcmVuOiBNb2R1bGVzVHJhaXRzLCBWb2x1bWVUcmFpdHMsIFN1cnJvdW5kU291bmRUcmFpdHMgKG9wdGlvbmFsKQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+Citjb25zdGV4cHIgdm9pZCAoKnhtbERlbGV0ZXIpKFQqIHQpOwordGVtcGxhdGUgPD4KK2NvbnN0ZXhwciBhdXRvIHhtbERlbGV0ZXI8eG1sRG9jPiA9IHhtbEZyZWVEb2M7CisvLyBodHRwOi8vYi8xMTEwNjcyNzcgLSBBZGQgYmFjayBjb25zdGV4cHIgd2hlbiB3ZSBzd2l0Y2ggdG8gQysrMTcuCit0ZW1wbGF0ZSA8PgorYXV0byB4bWxEZWxldGVyPHhtbENoYXI+ID0gW10oeG1sQ2hhciAqcykgeyB4bWxGcmVlKHMpOyB9OworCisvKiogQHJldHVybiBhIHVuaXF1ZV9wdHIgd2l0aCB0aGUgY29ycmVjdCBkZWxldGVyIGZvciB0aGUgbGlieG1sMiBvYmplY3QuICovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NvbnN0ZXhwciBhdXRvIG1ha2VfeG1sVW5pcXVlKFQgKnQpIHsKKyAgICAvLyBXcmFwIGRlbGV0ZXIgaW4gbGFtYmRhIHRvIGVuYWJsZSBlbXB0eSBiYXNlIG9wdGltaXphdGlvbgorICAgIGF1dG8gZGVsZXRlciA9IFtdKFQgKnQpIHsgeG1sRGVsZXRlcjxUPih0KTsgfTsKKyAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPFQsIGRlY2x0eXBlKGRlbGV0ZXIpPnt0LCBkZWxldGVyfTsKK30KKworc3RkOjpzdHJpbmcgZ2V0WG1sQXR0cmlidXRlKGNvbnN0IHhtbE5vZGUgKmN1ciwgY29uc3QgY2hhciAqYXR0cmlidXRlKQoreworICAgIGF1dG8geG1sVmFsdWUgPSBtYWtlX3htbFVuaXF1ZSh4bWxHZXRQcm9wKGN1ciwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4oYXR0cmlidXRlKSkpOworICAgIGlmICh4bWxWYWx1ZSA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiAiIjsKICAgICB9Ci0gICAgc3RyaW5nIHZhbHVlKChjb25zdCBjaGFyKil4bWxWYWx1ZSk7Ci0gICAgeG1sRnJlZSh4bWxWYWx1ZSk7CisgICAgc3RkOjpzdHJpbmcgdmFsdWUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oeG1sVmFsdWUuZ2V0KCkpKTsKICAgICByZXR1cm4gdmFsdWU7CiB9CiAKLXVzaW5nIHV0aWxpdGllczo6Y29udmVydFRvOwotCi1jb25zdCBjaGFyICpjb25zdCBQb2xpY3lTZXJpYWxpemVyOjpyb290TmFtZSA9ICJhdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24iOwotY29uc3QgY2hhciAqY29uc3QgUG9saWN5U2VyaWFsaXplcjo6dmVyc2lvbkF0dHJpYnV0ZSA9ICJ2ZXJzaW9uIjsKLWNvbnN0IHVpbnQzMl90IFBvbGljeVNlcmlhbGl6ZXI6OmdNYWpvciA9IDE7Ci1jb25zdCB1aW50MzJfdCBQb2xpY3lTZXJpYWxpemVyOjpnTWlub3IgPSAwOwotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGdSZWZlcmVuY2VFbGVtZW50TmFtZSA9ICJyZWZlcmVuY2UiOwotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGdSZWZlcmVuY2VBdHRyaWJ1dGVOYW1lID0gIm5hbWUiOwotCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhaXQ+Ci1zdGF0aWMgdm9pZCBnZXRSZWZlcmVuY2UoY29uc3QgX3htbE5vZGUgKnJvb3QsIGNvbnN0IF94bWxOb2RlIComcmVmTm9kZSwgY29uc3Qgc3RyaW5nICZyZWZOYW1lKQorY29uc3QgeG1sTm9kZSogZ2V0UmVmZXJlbmNlKGNvbnN0IHhtbE5vZGUgKmN1ciwgY29uc3Qgc3RkOjpzdHJpbmcgJnJlZk5hbWUpCiB7Ci0gICAgY29uc3QgX3htbE5vZGUgKmNvbCA9IHJvb3Q7Ci0gICAgd2hpbGUgKGNvbCAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICgheG1sU3RyY21wKGNvbC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilUcmFpdDo6Y29sbGVjdGlvblRhZykpIHsKLSAgICAgICAgICAgIGNvbnN0IHhtbE5vZGUgKmN1ciA9IGNvbC0+Y2hpbGRyZW47Ci0gICAgICAgICAgICB3aGlsZSAoY3VyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAoKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKWdSZWZlcmVuY2VFbGVtZW50TmFtZSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgZ1JlZmVyZW5jZUF0dHJpYnV0ZU5hbWUpOworICAgIGZvciAoOyBjdXIgIT0gTlVMTDsgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgICAgIGlmICgheG1sU3RyY21wKGN1ci0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4oVHJhaXQ6OmNvbGxlY3Rpb25UYWcpKSkgeworICAgICAgICAgICAgZm9yIChjb25zdCB4bWxOb2RlICpjaGlsZCA9IGN1ci0+Y2hpbGRyZW47IGNoaWxkICE9IE5VTEw7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKyAgICAgICAgICAgICAgICBpZiAoKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4oVHJhaXQ6OnJlZmVyZW5jZVRhZykpKSkgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBUcmFpdDo6QXR0cmlidXRlczo6cmVmZXJlbmNlTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChyZWZOYW1lID09IG5hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZk5vZGUgPSBjdXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQ7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY3VyID0gY3VyLT5uZXh0OwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGNvbCA9IGNvbC0+bmV4dDsKICAgICB9Ci0gICAgcmV0dXJuOworICAgIHJldHVybiBOVUxMOwogfQogCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhaXQ+Ci1zdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemVDb2xsZWN0aW9uKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKmN1ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgVHJhaXQ6OkNvbGxlY3Rpb24gJmNvbGxlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIFRyYWl0OjpQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpCitzdGF0dXNfdCBkZXNlcmlhbGl6ZUNvbGxlY3Rpb24oY29uc3QgeG1sTm9kZSAqY3VyLAorICAgICAgICB0eXBlbmFtZSBUcmFpdDo6Q29sbGVjdGlvbiAqY29sbGVjdGlvbiwKKyAgICAgICAgdHlwZW5hbWUgVHJhaXQ6OlB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCkKIHsKLSAgICBjb25zdCB4bWxOb2RlICpyb290ID0gY3VyLT54bWxDaGlsZHJlbk5vZGU7Ci0gICAgd2hpbGUgKHJvb3QgIT0gTlVMTCkgewotICAgICAgICBpZiAoeG1sU3RyY21wKHJvb3QtPm5hbWUsIChjb25zdCB4bWxDaGFyICopVHJhaXQ6OmNvbGxlY3Rpb25UYWcpICYmCi0gICAgICAgICAgICAgICAgeG1sU3RyY21wKHJvb3QtPm5hbWUsIChjb25zdCB4bWxDaGFyICopVHJhaXQ6OnRhZykpIHsKLSAgICAgICAgICAgIHJvb3QgPSByb290LT5uZXh0OwotICAgICAgICAgICAgY29udGludWU7CisgICAgZm9yIChjdXIgPSBjdXItPnhtbENoaWxkcmVuTm9kZTsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgICAgICBjb25zdCB4bWxOb2RlICpjaGlsZCA9IE5VTEw7CisgICAgICAgIGlmICgheG1sU3RyY21wKGN1ci0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4oVHJhaXQ6OmNvbGxlY3Rpb25UYWcpKSkgeworICAgICAgICAgICAgY2hpbGQgPSBjdXItPnhtbENoaWxkcmVuTm9kZTsKKyAgICAgICAgfSBlbHNlIGlmICgheG1sU3RyY21wKGN1ci0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4oVHJhaXQ6OnRhZykpKSB7CisgICAgICAgICAgICBjaGlsZCA9IGN1cjsKICAgICAgICAgfQotICAgICAgICBjb25zdCB4bWxOb2RlICpjaGlsZCA9IHJvb3Q7Ci0gICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKVRyYWl0Ojpjb2xsZWN0aW9uVGFnKSkgewotICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC0+eG1sQ2hpbGRyZW5Ob2RlOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChjaGlsZCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilUcmFpdDo6dGFnKSkgewotICAgICAgICAgICAgICAgIHR5cGVuYW1lIFRyYWl0OjpQdHJFbGVtZW50IGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gVHJhaXQ6OmRlc2VyaWFsaXplKGRvYywgY2hpbGQsIGVsZW1lbnQsIHNlcmlhbGl6aW5nQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY29sbGVjdGlvbi5hZGQoZWxlbWVudCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogY291bGQgbm90IGFkZCBlbGVtZW50IHRvICVzIGNvbGxlY3Rpb24iLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWl0Ojpjb2xsZWN0aW9uVGFnKTsKKyAgICAgICAgZm9yICg7IGNoaWxkICE9IE5VTEw7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKyAgICAgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihUcmFpdDo6dGFnKSkpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGVsZW1lbnQgPSBUcmFpdDo6ZGVzZXJpYWxpemUoY2hpbGQsIHNlcmlhbGl6aW5nQ29udGV4dCk7CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IFRyYWl0OjphZGRFbGVtZW50VG9Db2xsZWN0aW9uKGVsZW1lbnQsIGNvbGxlY3Rpb24pOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGNvdWxkIG5vdCBhZGQgZWxlbWVudCB0byAlcyBjb2xsZWN0aW9uIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhaXQ6OmNvbGxlY3Rpb25UYWcpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC0+bmV4dDsKICAgICAgICAgfQotICAgICAgICBpZiAoIXhtbFN0cmNtcChyb290LT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKVRyYWl0Ojp0YWcpKSB7CisgICAgICAgIGlmICgheG1sU3RyY21wKGN1ci0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4oVHJhaXQ6OnRhZykpKSB7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KLSAgICAgICAgcm9vdCA9IHJvb3QtPm5leHQ7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotY29uc3QgY2hhciAqY29uc3QgQXVkaW9HYWluVHJhaXRzOjp0YWcgPSAiZ2FpbiI7Ci1jb25zdCBjaGFyICpjb25zdCBBdWRpb0dhaW5UcmFpdHM6OmNvbGxlY3Rpb25UYWcgPSAiZ2FpbnMiOwotCi1jb25zdCBjaGFyIEF1ZGlvR2FpblRyYWl0czo6QXR0cmlidXRlczo6bW9kZVtdID0gIm1vZGUiOwotY29uc3QgY2hhciBBdWRpb0dhaW5UcmFpdHM6OkF0dHJpYnV0ZXM6OmNoYW5uZWxNYXNrW10gPSAiY2hhbm5lbF9tYXNrIjsKLWNvbnN0IGNoYXIgQXVkaW9HYWluVHJhaXRzOjpBdHRyaWJ1dGVzOjptaW5WYWx1ZU1CW10gPSAibWluVmFsdWVNQiI7Ci1jb25zdCBjaGFyIEF1ZGlvR2FpblRyYWl0czo6QXR0cmlidXRlczo6bWF4VmFsdWVNQltdID0gIm1heFZhbHVlTUIiOwotY29uc3QgY2hhciBBdWRpb0dhaW5UcmFpdHM6OkF0dHJpYnV0ZXM6OmRlZmF1bHRWYWx1ZU1CW10gPSAiZGVmYXVsdFZhbHVlTUIiOwotY29uc3QgY2hhciBBdWRpb0dhaW5UcmFpdHM6OkF0dHJpYnV0ZXM6OnN0ZXBWYWx1ZU1CW10gPSAic3RlcFZhbHVlTUIiOwotY29uc3QgY2hhciBBdWRpb0dhaW5UcmFpdHM6OkF0dHJpYnV0ZXM6Om1pblJhbXBNc1tdID0gIm1pblJhbXBNcyI7Ci1jb25zdCBjaGFyIEF1ZGlvR2FpblRyYWl0czo6QXR0cmlidXRlczo6bWF4UmFtcE1zW10gPSAibWF4UmFtcE1zIjsKLQotc3RhdHVzX3QgQXVkaW9HYWluVHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICovKmRvYyovLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmZ2FpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKK1JldHVybjxBdWRpb0dhaW5UcmFpdHM6OkVsZW1lbnQ+IEF1ZGlvR2FpblRyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLAorICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCAvKnNlcmlhbGl6aW5nQ29udGV4dCovKQogewogICAgIHN0YXRpYyB1aW50MzJfdCBpbmRleCA9IDA7Ci0gICAgZ2FpbiA9IG5ldyBFbGVtZW50KGluZGV4KyssIHRydWUpOworICAgIEVsZW1lbnQgZ2FpbiA9IG5ldyBBdWRpb0dhaW4oaW5kZXgrKywgdHJ1ZSk7CiAKLSAgICBzdHJpbmcgbW9kZSA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjptb2RlKTsKKyAgICBzdGQ6OnN0cmluZyBtb2RlID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6bW9kZSk7CiAgICAgaWYgKCFtb2RlLmVtcHR5KCkpIHsKICAgICAgICAgZ2Fpbi0+c2V0TW9kZShHYWluTW9kZUNvbnZlcnRlcjo6bWFza0Zyb21TdHJpbmcobW9kZSkpOwogICAgIH0KIAotICAgIHN0cmluZyBjaGFubmVsc0xpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6Y2hhbm5lbE1hc2spOworICAgIHN0ZDo6c3RyaW5nIGNoYW5uZWxzTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OmNoYW5uZWxNYXNrKTsKICAgICBpZiAoIWNoYW5uZWxzTGl0ZXJhbC5lbXB0eSgpKSB7CiAgICAgICAgIGdhaW4tPnNldENoYW5uZWxNYXNrKGNoYW5uZWxNYXNrRnJvbVN0cmluZyhjaGFubmVsc0xpdGVyYWwpKTsKICAgICB9CiAKLSAgICBzdHJpbmcgbWluVmFsdWVNQkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6bWluVmFsdWVNQik7CisgICAgc3RkOjpzdHJpbmcgbWluVmFsdWVNQkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjptaW5WYWx1ZU1CKTsKICAgICBpbnQzMl90IG1pblZhbHVlTUI7CiAgICAgaWYgKCFtaW5WYWx1ZU1CTGl0ZXJhbC5lbXB0eSgpICYmIGNvbnZlcnRUbyhtaW5WYWx1ZU1CTGl0ZXJhbCwgbWluVmFsdWVNQikpIHsKICAgICAgICAgZ2Fpbi0+c2V0TWluVmFsdWVJbk1iKG1pblZhbHVlTUIpOwogICAgIH0KIAotICAgIHN0cmluZyBtYXhWYWx1ZU1CTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjptYXhWYWx1ZU1CKTsKKyAgICBzdGQ6OnN0cmluZyBtYXhWYWx1ZU1CTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6Om1heFZhbHVlTUIpOwogICAgIGludDMyX3QgbWF4VmFsdWVNQjsKICAgICBpZiAoIW1heFZhbHVlTUJMaXRlcmFsLmVtcHR5KCkgJiYgY29udmVydFRvKG1heFZhbHVlTUJMaXRlcmFsLCBtYXhWYWx1ZU1CKSkgewogICAgICAgICBnYWluLT5zZXRNYXhWYWx1ZUluTWIobWF4VmFsdWVNQik7CiAgICAgfQogCi0gICAgc3RyaW5nIGRlZmF1bHRWYWx1ZU1CTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpkZWZhdWx0VmFsdWVNQik7CisgICAgc3RkOjpzdHJpbmcgZGVmYXVsdFZhbHVlTUJMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6ZGVmYXVsdFZhbHVlTUIpOwogICAgIGludDMyX3QgZGVmYXVsdFZhbHVlTUI7CiAgICAgaWYgKCFkZWZhdWx0VmFsdWVNQkxpdGVyYWwuZW1wdHkoKSAmJiBjb252ZXJ0VG8oZGVmYXVsdFZhbHVlTUJMaXRlcmFsLCBkZWZhdWx0VmFsdWVNQikpIHsKICAgICAgICAgZ2Fpbi0+c2V0RGVmYXVsdFZhbHVlSW5NYihkZWZhdWx0VmFsdWVNQik7CiAgICAgfQogCi0gICAgc3RyaW5nIHN0ZXBWYWx1ZU1CTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpzdGVwVmFsdWVNQik7CisgICAgc3RkOjpzdHJpbmcgc3RlcFZhbHVlTUJMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6c3RlcFZhbHVlTUIpOwogICAgIHVpbnQzMl90IHN0ZXBWYWx1ZU1COwogICAgIGlmICghc3RlcFZhbHVlTUJMaXRlcmFsLmVtcHR5KCkgJiYgY29udmVydFRvKHN0ZXBWYWx1ZU1CTGl0ZXJhbCwgc3RlcFZhbHVlTUIpKSB7CiAgICAgICAgIGdhaW4tPnNldFN0ZXBWYWx1ZUluTWIoc3RlcFZhbHVlTUIpOwogICAgIH0KIAotICAgIHN0cmluZyBtaW5SYW1wTXNMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6Om1pblJhbXBNcyk7CisgICAgc3RkOjpzdHJpbmcgbWluUmFtcE1zTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6Om1pblJhbXBNcyk7CiAgICAgdWludDMyX3QgbWluUmFtcE1zOwogICAgIGlmICghbWluUmFtcE1zTGl0ZXJhbC5lbXB0eSgpICYmIGNvbnZlcnRUbyhtaW5SYW1wTXNMaXRlcmFsLCBtaW5SYW1wTXMpKSB7CiAgICAgICAgIGdhaW4tPnNldE1pblJhbXBJbk1zKG1pblJhbXBNcyk7CiAgICAgfQogCi0gICAgc3RyaW5nIG1heFJhbXBNc0xpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6bWF4UmFtcE1zKTsKKyAgICBzdGQ6OnN0cmluZyBtYXhSYW1wTXNMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6bWF4UmFtcE1zKTsKICAgICB1aW50MzJfdCBtYXhSYW1wTXM7CiAgICAgaWYgKCFtYXhSYW1wTXNMaXRlcmFsLmVtcHR5KCkgJiYgY29udmVydFRvKG1heFJhbXBNc0xpdGVyYWwsIG1heFJhbXBNcykpIHsKICAgICAgICAgZ2Fpbi0+c2V0TWF4UmFtcEluTXMobWF4UmFtcE1zKTsKICAgICB9Ci0gICAgQUxPR1YoIiVzOiBhZGRpbmcgbmV3IGdhaW4gbW9kZSAlMDh4IGNoYW5uZWwgbWFzayAlMDh4IG1pbiBtQiAlZCBtYXggbUIgJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgQUxPR1YoIiVzOiBhZGRpbmcgbmV3IGdhaW4gbW9kZSAlMDh4IGNoYW5uZWwgbWFzayAlMDh4IG1pbiBtQiAlZCBtYXggbUIgJWQiLCBfX2Z1bmNfXywKICAgICAgICAgICBnYWluLT5nZXRNb2RlKCksIGdhaW4tPmdldENoYW5uZWxNYXNrKCksIGdhaW4tPmdldE1pblZhbHVlSW5NYigpLAogICAgICAgICAgIGdhaW4tPmdldE1heFZhbHVlSW5NYigpKTsKIAotICAgIGlmIChnYWluLT5nZXRNb2RlKCkgPT0gMCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIGlmIChnYWluLT5nZXRNb2RlKCkgIT0gMCkgeworICAgICAgICByZXR1cm4gZ2FpbjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLWNvbnN0IGNoYXIgKmNvbnN0IEF1ZGlvUHJvZmlsZVRyYWl0czo6Y29sbGVjdGlvblRhZyA9ICJwcm9maWxlcyI7Ci1jb25zdCBjaGFyICpjb25zdCBBdWRpb1Byb2ZpbGVUcmFpdHM6OnRhZyA9ICJwcm9maWxlIjsKLQotY29uc3QgY2hhciBBdWRpb1Byb2ZpbGVUcmFpdHM6OkF0dHJpYnV0ZXM6Om5hbWVbXSA9ICJuYW1lIjsKLWNvbnN0IGNoYXIgQXVkaW9Qcm9maWxlVHJhaXRzOjpBdHRyaWJ1dGVzOjpzYW1wbGluZ1JhdGVzW10gPSAic2FtcGxpbmdSYXRlcyI7Ci1jb25zdCBjaGFyIEF1ZGlvUHJvZmlsZVRyYWl0czo6QXR0cmlidXRlczo6Zm9ybWF0W10gPSAiZm9ybWF0IjsKLWNvbnN0IGNoYXIgQXVkaW9Qcm9maWxlVHJhaXRzOjpBdHRyaWJ1dGVzOjpjaGFubmVsTWFza3NbXSA9ICJjaGFubmVsTWFza3MiOwotCi1zdGF0dXNfdCBBdWRpb1Byb2ZpbGVUcmFpdHM6OmRlc2VyaWFsaXplKF94bWxEb2MgKi8qZG9jKi8sIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZwcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCAvKnNlcmlhbGl6aW5nQ29udGV4dCovKQorUmV0dXJuPEF1ZGlvUHJvZmlsZVRyYWl0czo6RWxlbWVudD4gQXVkaW9Qcm9maWxlVHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsCisgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCiB7Ci0gICAgc3RyaW5nIHNhbXBsaW5nUmF0ZXMgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6c2FtcGxpbmdSYXRlcyk7Ci0gICAgc3RyaW5nIGZvcm1hdCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpmb3JtYXQpOwotICAgIHN0cmluZyBjaGFubmVscyA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpjaGFubmVsTWFza3MpOworICAgIHN0ZDo6c3RyaW5nIHNhbXBsaW5nUmF0ZXMgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpzYW1wbGluZ1JhdGVzKTsKKyAgICBzdGQ6OnN0cmluZyBmb3JtYXQgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpmb3JtYXQpOworICAgIHN0ZDo6c3RyaW5nIGNoYW5uZWxzID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6Y2hhbm5lbE1hc2tzKTsKIAotICAgIHByb2ZpbGUgPSBuZXcgRWxlbWVudChmb3JtYXRGcm9tU3RyaW5nKGZvcm1hdCwgZ0R5bmFtaWNGb3JtYXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3NGcm9tU3RyaW5nKGNoYW5uZWxzLCAiLCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzRnJvbVN0cmluZyhzYW1wbGluZ1JhdGVzLCAiLCIpKTsKKyAgICBFbGVtZW50IHByb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKGZvcm1hdEZyb21TdHJpbmcoZm9ybWF0LCBnRHluYW1pY0Zvcm1hdCksCisgICAgICAgICAgICBjaGFubmVsTWFza3NGcm9tU3RyaW5nKGNoYW5uZWxzLCAiLCIpLAorICAgICAgICAgICAgc2FtcGxpbmdSYXRlc0Zyb21TdHJpbmcoc2FtcGxpbmdSYXRlcywgIiwiKSk7CiAKICAgICBwcm9maWxlLT5zZXREeW5hbWljRm9ybWF0KHByb2ZpbGUtPmdldEZvcm1hdCgpID09IGdEeW5hbWljRm9ybWF0KTsKICAgICBwcm9maWxlLT5zZXREeW5hbWljQ2hhbm5lbHMocHJvZmlsZS0+Z2V0Q2hhbm5lbHMoKS5pc0VtcHR5KCkpOwogICAgIHByb2ZpbGUtPnNldER5bmFtaWNSYXRlKHByb2ZpbGUtPmdldFNhbXBsZVJhdGVzKCkuaXNFbXB0eSgpKTsKIAotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICByZXR1cm4gcHJvZmlsZTsKIH0KIAotCi1jb25zdCBjaGFyICpjb25zdCBNaXhQb3J0VHJhaXRzOjpjb2xsZWN0aW9uVGFnID0gIm1peFBvcnRzIjsKLWNvbnN0IGNoYXIgKmNvbnN0IE1peFBvcnRUcmFpdHM6OnRhZyA9ICJtaXhQb3J0IjsKLQotY29uc3QgY2hhciBNaXhQb3J0VHJhaXRzOjpBdHRyaWJ1dGVzOjpuYW1lW10gPSAibmFtZSI7Ci1jb25zdCBjaGFyIE1peFBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6OnJvbGVbXSA9ICJyb2xlIjsKLWNvbnN0IGNoYXIgTWl4UG9ydFRyYWl0czo6QXR0cmlidXRlczo6ZmxhZ3NbXSA9ICJmbGFncyI7Ci1jb25zdCBjaGFyIE1peFBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6Om1heE9wZW5Db3VudFtdID0gIm1heE9wZW5Db3VudCI7Ci1jb25zdCBjaGFyIE1peFBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6Om1heEFjdGl2ZUNvdW50W10gPSAibWF4QWN0aXZlQ291bnQiOwotCi1zdGF0dXNfdCBNaXhQb3J0VHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpjaGlsZCwgUHRyRWxlbWVudCAmbWl4UG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCitSZXR1cm48TWl4UG9ydFRyYWl0czo6RWxlbWVudD4gTWl4UG9ydFRyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY2hpbGQsCisgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCiB7Ci0gICAgc3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om5hbWUpOwogICAgIGlmIChuYW1lLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6bmFtZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6bmFtZSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQotICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgQXR0cmlidXRlczo6bmFtZSwgbmFtZS5jX3N0cigpKTsKLSAgICBzdHJpbmcgcm9sZSA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6cm9sZSk7CisgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIEF0dHJpYnV0ZXM6Om5hbWUsIG5hbWUuY19zdHIoKSk7CisgICAgc3RkOjpzdHJpbmcgcm9sZSA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6cm9sZSk7CiAgICAgaWYgKHJvbGUuZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpyb2xlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpyb2xlKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9Ci0gICAgQUxPR1YoIiVzOiBSb2xlPSVzIiwgX19GVU5DVElPTl9fLCByb2xlLmNfc3RyKCkpOwotICAgIGF1ZGlvX3BvcnRfcm9sZV90IHBvcnRSb2xlID0gcm9sZSA9PSAic291cmNlIiA/IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UgOiBBVURJT19QT1JUX1JPTEVfU0lOSzsKKyAgICBBTE9HVigiJXM6IFJvbGU9JXMiLCBfX2Z1bmNfXywgcm9sZS5jX3N0cigpKTsKKyAgICBhdWRpb19wb3J0X3JvbGVfdCBwb3J0Um9sZSA9IChyb2xlID09IEF0dHJpYnV0ZXM6OnJvbGVTb3VyY2UpID8KKyAgICAgICAgICAgIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UgOiBBVURJT19QT1JUX1JPTEVfU0lOSzsKIAotICAgIG1peFBvcnQgPSBuZXcgRWxlbWVudChTdHJpbmc4KG5hbWUuY19zdHIoKSksIHBvcnRSb2xlKTsKKyAgICBFbGVtZW50IG1peFBvcnQgPSBuZXcgSU9Qcm9maWxlKFN0cmluZzgobmFtZS5jX3N0cigpKSwgcG9ydFJvbGUpOwogCiAgICAgQXVkaW9Qcm9maWxlVHJhaXRzOjpDb2xsZWN0aW9uIHByb2ZpbGVzOwotICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdWRpb1Byb2ZpbGVUcmFpdHM+KGRvYywgY2hpbGQsIHByb2ZpbGVzLCBOVUxMKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248QXVkaW9Qcm9maWxlVHJhaXRzPihjaGlsZCwgJnByb2ZpbGVzLCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKHN0YXR1cyk7CisgICAgfQogICAgIGlmIChwcm9maWxlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgc3AgPEF1ZGlvUHJvZmlsZT4gZHluYW1pY1Byb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKGdEeW5hbWljRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbHNWZWN0b3IoKSwgU2FtcGxlUmF0ZVZlY3RvcigpKTsKLSAgICAgICAgZHluYW1pY1Byb2ZpbGUtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7Ci0gICAgICAgIGR5bmFtaWNQcm9maWxlLT5zZXREeW5hbWljQ2hhbm5lbHModHJ1ZSk7Ci0gICAgICAgIGR5bmFtaWNQcm9maWxlLT5zZXREeW5hbWljUmF0ZSh0cnVlKTsKLSAgICAgICAgcHJvZmlsZXMuYWRkKGR5bmFtaWNQcm9maWxlKTsKKyAgICAgICAgcHJvZmlsZXMuYWRkKEF1ZGlvUHJvZmlsZTo6Y3JlYXRlRnVsbER5bmFtaWMoKSk7CiAgICAgfQogICAgIG1peFBvcnQtPnNldEF1ZGlvUHJvZmlsZXMocHJvZmlsZXMpOwogCi0gICAgc3RyaW5nIGZsYWdzID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjpmbGFncyk7CisgICAgc3RkOjpzdHJpbmcgZmxhZ3MgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6OmZsYWdzKTsKICAgICBpZiAoIWZsYWdzLmVtcHR5KCkpIHsKICAgICAgICAgLy8gU291cmNlIHJvbGUKICAgICAgICAgaWYgKHBvcnRSb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpIHsKQEAgLTI2MSw1MiArNDYxLDQ2IEBACiAgICAgICAgICAgICBtaXhQb3J0LT5zZXRGbGFncyhJbnB1dEZsYWdDb252ZXJ0ZXI6Om1hc2tGcm9tU3RyaW5nKGZsYWdzKSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgc3RyaW5nIG1heE9wZW5Db3VudCA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6bWF4T3BlbkNvdW50KTsKKyAgICBzdGQ6OnN0cmluZyBtYXhPcGVuQ291bnQgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om1heE9wZW5Db3VudCk7CiAgICAgaWYgKCFtYXhPcGVuQ291bnQuZW1wdHkoKSkgewogICAgICAgICBjb252ZXJ0VG8obWF4T3BlbkNvdW50LCBtaXhQb3J0LT5tYXhPcGVuQ291bnQpOwogICAgIH0KLSAgICBzdHJpbmcgbWF4QWN0aXZlQ291bnQgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om1heEFjdGl2ZUNvdW50KTsKKyAgICBzdGQ6OnN0cmluZyBtYXhBY3RpdmVDb3VudCA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6bWF4QWN0aXZlQ291bnQpOwogICAgIGlmICghbWF4QWN0aXZlQ291bnQuZW1wdHkoKSkgewogICAgICAgICBjb252ZXJ0VG8obWF4QWN0aXZlQ291bnQsIG1peFBvcnQtPm1heEFjdGl2ZUNvdW50KTsKICAgICB9CiAgICAgLy8gRGVzZXJpYWxpemUgY2hpbGRyZW4KICAgICBBdWRpb0dhaW5UcmFpdHM6OkNvbGxlY3Rpb24gZ2FpbnM7Ci0gICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPEF1ZGlvR2FpblRyYWl0cz4oZG9jLCBjaGlsZCwgZ2FpbnMsIE5VTEwpOworICAgIHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdWRpb0dhaW5UcmFpdHM+KGNoaWxkLCAmZ2FpbnMsIE5VTEwpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CiAgICAgbWl4UG9ydC0+c2V0R2FpbnMoZ2FpbnMpOwogCi0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIHJldHVybiBtaXhQb3J0OwogfQogCi1jb25zdCBjaGFyICpjb25zdCBEZXZpY2VQb3J0VHJhaXRzOjp0YWcgPSAiZGV2aWNlUG9ydCI7Ci1jb25zdCBjaGFyICpjb25zdCBEZXZpY2VQb3J0VHJhaXRzOjpjb2xsZWN0aW9uVGFnID0gImRldmljZVBvcnRzIjsKLQotY29uc3QgY2hhciBEZXZpY2VQb3J0VHJhaXRzOjpBdHRyaWJ1dGVzOjp0YWdOYW1lW10gPSAidGFnTmFtZSI7Ci1jb25zdCBjaGFyIERldmljZVBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6OnR5cGVbXSA9ICJ0eXBlIjsKLWNvbnN0IGNoYXIgRGV2aWNlUG9ydFRyYWl0czo6QXR0cmlidXRlczo6cm9sZVtdID0gInJvbGUiOwotY29uc3QgY2hhciBEZXZpY2VQb3J0VHJhaXRzOjpBdHRyaWJ1dGVzOjphZGRyZXNzW10gPSAiYWRkcmVzcyI7Ci1jb25zdCBjaGFyIERldmljZVBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6OnJvbGVTb3VyY2VbXSA9ICJzb3VyY2UiOwotCi1zdGF0dXNfdCBEZXZpY2VQb3J0VHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZkZXZpY2VEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKK1JldHVybjxEZXZpY2VQb3J0VHJhaXRzOjpFbGVtZW50PiBEZXZpY2VQb3J0VHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsCisgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCiB7Ci0gICAgc3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6dGFnTmFtZSk7CisgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnRhZ05hbWUpOwogICAgIGlmIChuYW1lLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6dGFnTmFtZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6dGFnTmFtZSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQotICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgQXR0cmlidXRlczo6dGFnTmFtZSwgbmFtZS5jX3N0cigpKTsKLSAgICBzdHJpbmcgdHlwZU5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6dHlwZSk7CisgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIEF0dHJpYnV0ZXM6OnRhZ05hbWUsIG5hbWUuY19zdHIoKSk7CisgICAgc3RkOjpzdHJpbmcgdHlwZU5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjp0eXBlKTsKICAgICBpZiAodHlwZU5hbWUuZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IG5vIHR5cGUgZm9yICVzIiwgX19GVU5DVElPTl9fLCBuYW1lLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HRSgiJXM6IG5vIHR5cGUgZm9yICVzIiwgX19mdW5jX18sIG5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQotICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgQXR0cmlidXRlczo6dHlwZSwgdHlwZU5hbWUuY19zdHIoKSk7Ci0gICAgc3RyaW5nIHJvbGUgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6cm9sZSk7CisgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIEF0dHJpYnV0ZXM6OnR5cGUsIHR5cGVOYW1lLmNfc3RyKCkpOworICAgIHN0ZDo6c3RyaW5nIHJvbGUgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpyb2xlKTsKICAgICBpZiAocm9sZS5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OnJvbGUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19mdW5jX18sIEF0dHJpYnV0ZXM6OnJvbGUpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KLSAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19GVU5DVElPTl9fLCB0YWcsIEF0dHJpYnV0ZXM6OnJvbGUsIHJvbGUuY19zdHIoKSk7CisgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIEF0dHJpYnV0ZXM6OnJvbGUsIHJvbGUuY19zdHIoKSk7CiAgICAgYXVkaW9fcG9ydF9yb2xlX3QgcG9ydFJvbGUgPSAocm9sZSA9PSBBdHRyaWJ1dGVzOjpyb2xlU291cmNlKSA/CiAgICAgICAgICAgICAgICAgQVVESU9fUE9SVF9ST0xFX1NPVVJDRSA6IEFVRElPX1BPUlRfUk9MRV9TSU5LOwogCkBAIC0zMTQsMzM4ICs1MDgsMzY0IEBACiAgICAgaWYgKCFkZXZpY2VGcm9tU3RyaW5nKHR5cGVOYW1lLCB0eXBlKSB8fAogICAgICAgICAgICAgKCFhdWRpb19pc19pbnB1dF9kZXZpY2UodHlwZSkgJiYgcG9ydFJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgfHwKICAgICAgICAgICAgICghYXVkaW9faXNfb3V0cHV0X2RldmljZXModHlwZSkgJiYgcG9ydFJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTkspKSB7Ci0gICAgICAgIEFMT0dXKCIlczogYmFkIHR5cGUgJTA4eCIsIF9fRlVOQ1RJT05fXywgdHlwZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dXKCIlczogYmFkIHR5cGUgJTA4eCIsIF9fZnVuY19fLCB0eXBlKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9Ci0gICAgZGV2aWNlRGVzYyA9IG5ldyBFbGVtZW50KHR5cGUsIFN0cmluZzgobmFtZS5jX3N0cigpKSk7CisgICAgRWxlbWVudCBkZXZpY2VEZXNjID0gbmV3IERldmljZURlc2NyaXB0b3IodHlwZSwgU3RyaW5nOChuYW1lLmNfc3RyKCkpKTsKIAotICAgIHN0cmluZyBhZGRyZXNzID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OmFkZHJlc3MpOworICAgIHN0ZDo6c3RyaW5nIGFkZHJlc3MgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjphZGRyZXNzKTsKICAgICBpZiAoIWFkZHJlc3MuZW1wdHkoKSkgewotICAgICAgICBBTE9HVigiJXM6IGFkZHJlc3M9JXMgZm9yICVzIiwgX19GVU5DVElPTl9fLCBhZGRyZXNzLmNfc3RyKCksIG5hbWUuY19zdHIoKSk7Ci0gICAgICAgIGRldmljZURlc2MtPm1BZGRyZXNzID0gU3RyaW5nOChhZGRyZXNzLmNfc3RyKCkpOworICAgICAgICBBTE9HVigiJXM6IGFkZHJlc3M9JXMgZm9yICVzIiwgX19mdW5jX18sIGFkZHJlc3MuY19zdHIoKSwgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgZGV2aWNlRGVzYy0+c2V0QWRkcmVzcyhTdHJpbmc4KGFkZHJlc3MuY19zdHIoKSkpOwogICAgIH0KIAogICAgIEF1ZGlvUHJvZmlsZVRyYWl0czo6Q29sbGVjdGlvbiBwcm9maWxlczsKLSAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248QXVkaW9Qcm9maWxlVHJhaXRzPihkb2MsIHJvb3QsIHByb2ZpbGVzLCBOVUxMKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248QXVkaW9Qcm9maWxlVHJhaXRzPihjdXIsICZwcm9maWxlcywgTlVMTCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChzdGF0dXMpOworICAgIH0KICAgICBpZiAocHJvZmlsZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHNwIDxBdWRpb1Byb2ZpbGU+IGR5bmFtaWNQcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZShnRHluYW1pY0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWxzVmVjdG9yKCksIFNhbXBsZVJhdGVWZWN0b3IoKSk7Ci0gICAgICAgIGR5bmFtaWNQcm9maWxlLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOwotICAgICAgICBkeW5hbWljUHJvZmlsZS0+c2V0RHluYW1pY0NoYW5uZWxzKHRydWUpOwotICAgICAgICBkeW5hbWljUHJvZmlsZS0+c2V0RHluYW1pY1JhdGUodHJ1ZSk7Ci0gICAgICAgIHByb2ZpbGVzLmFkZChkeW5hbWljUHJvZmlsZSk7CisgICAgICAgIHByb2ZpbGVzLmFkZChBdWRpb1Byb2ZpbGU6OmNyZWF0ZUZ1bGxEeW5hbWljKCkpOwogICAgIH0KICAgICBkZXZpY2VEZXNjLT5zZXRBdWRpb1Byb2ZpbGVzKHByb2ZpbGVzKTsKIAogICAgIC8vIERlc2VyaWFsaXplIEF1ZGlvR2FpbiBjaGlsZHJlbgotICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdWRpb0dhaW5UcmFpdHM+KGRvYywgcm9vdCwgZGV2aWNlRGVzYy0+bUdhaW5zLCBOVUxMKTsKLSAgICBBTE9HVigiJXM6IGFkZGluZyBkZXZpY2UgdGFnICVzIHR5cGUgJTA4eCBhZGRyZXNzICVzIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgIGRldmljZURlc2MtPmdldE5hbWUoKS5zdHJpbmcoKSwgdHlwZSwgZGV2aWNlRGVzYy0+bUFkZHJlc3Muc3RyaW5nKCkpOwotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248QXVkaW9HYWluVHJhaXRzPihjdXIsICZkZXZpY2VEZXNjLT5tR2FpbnMsIE5VTEwpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CisgICAgQUxPR1YoIiVzOiBhZGRpbmcgZGV2aWNlIHRhZyAlcyB0eXBlICUwOHggYWRkcmVzcyAlcyIsIF9fZnVuY19fLAorICAgICAgICAgIGRldmljZURlc2MtPmdldE5hbWUoKS5zdHJpbmcoKSwgdHlwZSwgZGV2aWNlRGVzYy0+YWRkcmVzcygpLnN0cmluZygpKTsKKyAgICByZXR1cm4gZGV2aWNlRGVzYzsKIH0KIAotY29uc3QgY2hhciAqY29uc3QgUm91dGVUcmFpdHM6OnRhZyA9ICJyb3V0ZSI7Ci1jb25zdCBjaGFyICpjb25zdCBSb3V0ZVRyYWl0czo6Y29sbGVjdGlvblRhZyA9ICJyb3V0ZXMiOwotCi1jb25zdCBjaGFyIFJvdXRlVHJhaXRzOjpBdHRyaWJ1dGVzOjp0eXBlW10gPSAidHlwZSI7Ci1jb25zdCBjaGFyIFJvdXRlVHJhaXRzOjpBdHRyaWJ1dGVzOjp0eXBlTWl4W10gPSAibWl4IjsKLWNvbnN0IGNoYXIgUm91dGVUcmFpdHM6OkF0dHJpYnV0ZXM6OnNpbmtbXSA9ICJzaW5rIjsKLWNvbnN0IGNoYXIgUm91dGVUcmFpdHM6OkF0dHJpYnV0ZXM6OnNvdXJjZXNbXSA9ICJzb3VyY2VzIjsKLQotCi1zdGF0dXNfdCBSb3V0ZVRyYWl0czo6ZGVzZXJpYWxpemUoX3htbERvYyAqLypkb2MqLywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggY3R4KQorUmV0dXJuPFJvdXRlVHJhaXRzOjpFbGVtZW50PiBSb3V0ZVRyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLCBQdHJTZXJpYWxpemluZ0N0eCBjdHgpCiB7Ci0gICAgc3RyaW5nIHR5cGUgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6dHlwZSk7CisgICAgc3RkOjpzdHJpbmcgdHlwZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnR5cGUpOwogICAgIGlmICh0eXBlLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6dHlwZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6dHlwZSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQogICAgIGF1ZGlvX3JvdXRlX3R5cGVfdCByb3V0ZVR5cGUgPSAodHlwZSA9PSBBdHRyaWJ1dGVzOjp0eXBlTWl4KSA/CiAgICAgICAgICAgICAgICAgQVVESU9fUk9VVEVfTUlYIDogQVVESU9fUk9VVEVfTVVYOwogCi0gICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fRlVOQ1RJT05fXywgdGFnLCBBdHRyaWJ1dGVzOjp0eXBlLCB0eXBlLmNfc3RyKCkpOwotICAgIGVsZW1lbnQgPSBuZXcgRWxlbWVudChyb3V0ZVR5cGUpOworICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX2Z1bmNfXywgdGFnLCBBdHRyaWJ1dGVzOjp0eXBlLCB0eXBlLmNfc3RyKCkpOworICAgIEVsZW1lbnQgcm91dGUgPSBuZXcgQXVkaW9Sb3V0ZShyb3V0ZVR5cGUpOwogCi0gICAgc3RyaW5nIHNpbmtBdHRyID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnNpbmspOworICAgIHN0ZDo6c3RyaW5nIHNpbmtBdHRyID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6c2luayk7CiAgICAgaWYgKHNpbmtBdHRyLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6c2luayk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6c2luayk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQogICAgIC8vIENvbnZlcnQgU2luayBuYW1lIHRvIHBvcnQgcG9pbnRlcgogICAgIHNwPEF1ZGlvUG9ydD4gc2luayA9IGN0eC0+ZmluZFBvcnRCeVRhZ05hbWUoU3RyaW5nOChzaW5rQXR0ci5jX3N0cigpKSk7CiAgICAgaWYgKHNpbmsgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiJXM6IG5vIHNpbmsgZm91bmQgd2l0aCBuYW1lPSVzIiwgX19GVU5DVElPTl9fLCBzaW5rQXR0ci5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBubyBzaW5rIGZvdW5kIHdpdGggbmFtZT0lcyIsIF9fZnVuY19fLCBzaW5rQXR0ci5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9Ci0gICAgZWxlbWVudC0+c2V0U2luayhzaW5rKTsKKyAgICByb3V0ZS0+c2V0U2luayhzaW5rKTsKIAotICAgIHN0cmluZyBzb3VyY2VzQXR0ciA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpzb3VyY2VzKTsKKyAgICBzdGQ6OnN0cmluZyBzb3VyY2VzQXR0ciA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnNvdXJjZXMpOwogICAgIGlmIChzb3VyY2VzQXR0ci5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OnNvdXJjZXMpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19mdW5jX18sIEF0dHJpYnV0ZXM6OnNvdXJjZXMpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KICAgICAvLyBUb2tlbml6ZSBhbmQgQ29udmVydCBTb3VyY2VzIG5hbWUgdG8gcG9ydCBwb2ludGVyCiAgICAgQXVkaW9Qb3J0VmVjdG9yIHNvdXJjZXM7Ci0gICAgY2hhciAqc291cmNlc0xpdGVyYWwgPSBzdHJuZHVwKHNvdXJjZXNBdHRyLmNfc3RyKCksIHN0cmxlbihzb3VyY2VzQXR0ci5jX3N0cigpKSk7Ci0gICAgY2hhciAqZGV2VGFnID0gc3RydG9rKHNvdXJjZXNMaXRlcmFsLCAiLCIpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjaGFyW10+IHNvdXJjZXNMaXRlcmFse3N0cm5kdXAoCisgICAgICAgICAgICAgICAgc291cmNlc0F0dHIuY19zdHIoKSwgc3RybGVuKHNvdXJjZXNBdHRyLmNfc3RyKCkpKX07CisgICAgY2hhciAqZGV2VGFnID0gc3RydG9rKHNvdXJjZXNMaXRlcmFsLmdldCgpLCAiLCIpOwogICAgIHdoaWxlIChkZXZUYWcgIT0gTlVMTCkgewogICAgICAgICBpZiAoc3RybGVuKGRldlRhZykgIT0gMCkgewogICAgICAgICAgICAgc3A8QXVkaW9Qb3J0PiBzb3VyY2UgPSBjdHgtPmZpbmRQb3J0QnlUYWdOYW1lKFN0cmluZzgoZGV2VGFnKSk7CiAgICAgICAgICAgICBpZiAoc291cmNlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IG5vIHNvdXJjZSBmb3VuZCB3aXRoIG5hbWU9JXMiLCBfX0ZVTkNUSU9OX18sIGRldlRhZyk7Ci0gICAgICAgICAgICAgICAgZnJlZShzb3VyY2VzTGl0ZXJhbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IG5vIHNvdXJjZSBmb3VuZCB3aXRoIG5hbWU9JXMiLCBfX2Z1bmNfXywgZGV2VGFnKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc291cmNlcy5hZGQoc291cmNlKTsKICAgICAgICAgfQogICAgICAgICBkZXZUYWcgPSBzdHJ0b2soTlVMTCwgIiwiKTsKICAgICB9Ci0gICAgZnJlZShzb3VyY2VzTGl0ZXJhbCk7CiAKLSAgICBzaW5rLT5hZGRSb3V0ZShlbGVtZW50KTsKKyAgICBzaW5rLT5hZGRSb3V0ZShyb3V0ZSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzb3VyY2VzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIHNwPEF1ZGlvUG9ydD4gc291cmNlID0gc291cmNlcy5pdGVtQXQoaSk7Ci0gICAgICAgIHNvdXJjZS0+YWRkUm91dGUoZWxlbWVudCk7CisgICAgICAgIHNvdXJjZS0+YWRkUm91dGUocm91dGUpOwogICAgIH0KLSAgICBlbGVtZW50LT5zZXRTb3VyY2VzKHNvdXJjZXMpOwotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICByb3V0ZS0+c2V0U291cmNlcyhzb3VyY2VzKTsKKyAgICByZXR1cm4gcm91dGU7CiB9CiAKLWNvbnN0IGNoYXIgKmNvbnN0IE1vZHVsZVRyYWl0czo6Y2hpbGRBdHRhY2hlZERldmljZXNUYWcgPSAiYXR0YWNoZWREZXZpY2VzIjsKLWNvbnN0IGNoYXIgKmNvbnN0IE1vZHVsZVRyYWl0czo6Y2hpbGRBdHRhY2hlZERldmljZVRhZyA9ICJpdGVtIjsKLWNvbnN0IGNoYXIgKmNvbnN0IE1vZHVsZVRyYWl0czo6Y2hpbGREZWZhdWx0T3V0cHV0RGV2aWNlVGFnID0gImRlZmF1bHRPdXRwdXREZXZpY2UiOwotCi1jb25zdCBjaGFyICpjb25zdCBNb2R1bGVUcmFpdHM6OnRhZyA9ICJtb2R1bGUiOwotY29uc3QgY2hhciAqY29uc3QgTW9kdWxlVHJhaXRzOjpjb2xsZWN0aW9uVGFnID0gIm1vZHVsZXMiOwotCi1jb25zdCBjaGFyIE1vZHVsZVRyYWl0czo6QXR0cmlidXRlczo6bmFtZVtdID0gIm5hbWUiOwotY29uc3QgY2hhciBNb2R1bGVUcmFpdHM6OkF0dHJpYnV0ZXM6OnZlcnNpb25bXSA9ICJoYWxWZXJzaW9uIjsKLQotc3RhdHVzX3QgTW9kdWxlVHJhaXRzOjpkZXNlcmlhbGl6ZSh4bWxEb2NQdHIgZG9jLCBjb25zdCB4bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IGN0eCkKK1JldHVybjxNb2R1bGVUcmFpdHM6OkVsZW1lbnQ+IE1vZHVsZVRyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLCBQdHJTZXJpYWxpemluZ0N0eCBjdHgpCiB7Ci0gICAgc3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6bmFtZSk7CisgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6Om5hbWUpOwogICAgIGlmIChuYW1lLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6bmFtZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6bmFtZSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQogICAgIHVpbnQzMl90IHZlcnNpb25NYWpvciA9IDAsIHZlcnNpb25NaW5vciA9IDA7Ci0gICAgc3RyaW5nIHZlcnNpb25MaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnZlcnNpb24pOworICAgIHN0ZDo6c3RyaW5nIHZlcnNpb25MaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6dmVyc2lvbik7CiAgICAgaWYgKCF2ZXJzaW9uTGl0ZXJhbC5lbXB0eSgpKSB7CiAgICAgICAgIHNzY2FuZih2ZXJzaW9uTGl0ZXJhbC5jX3N0cigpLCAiJXUuJXUiLCAmdmVyc2lvbk1ham9yLCAmdmVyc2lvbk1pbm9yKTsKLSAgICAgICAgQUxPR1YoIiVzOiBtSGFsVmVyc2lvbiA9IG1ham9yICV1IG1pbm9yICV1IiwgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgQUxPR1YoIiVzOiBtSGFsVmVyc2lvbiA9IG1ham9yICV1IG1pbm9yICV1IiwgIF9fZnVuY19fLAogICAgICAgICAgICAgICB2ZXJzaW9uTWFqb3IsIHZlcnNpb25NYWpvcik7CiAgICAgfQogCi0gICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fRlVOQ1RJT05fXywgdGFnLCBBdHRyaWJ1dGVzOjpuYW1lLCBuYW1lLmNfc3RyKCkpOworICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX2Z1bmNfXywgdGFnLCBBdHRyaWJ1dGVzOjpuYW1lLCBuYW1lLmNfc3RyKCkpOwogCi0gICAgbW9kdWxlID0gbmV3IEVsZW1lbnQobmFtZS5jX3N0cigpLCB2ZXJzaW9uTWFqb3IsIHZlcnNpb25NaW5vcik7CisgICAgRWxlbWVudCBtb2R1bGUgPSBuZXcgSHdNb2R1bGUobmFtZS5jX3N0cigpLCB2ZXJzaW9uTWFqb3IsIHZlcnNpb25NaW5vcik7CiAKICAgICAvLyBEZXNlcmlhbGl6ZSBjaGlsZHJlbnM6IEF1ZGlvIE1peCBQb3J0LCBBdWRpbyBEZXZpY2UgUG9ydHMgKFNvdXJjZS9TaW5rKSwgQXVkaW8gUm91dGVzCiAgICAgTWl4UG9ydFRyYWl0czo6Q29sbGVjdGlvbiBtaXhQb3J0czsKLSAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248TWl4UG9ydFRyYWl0cz4oZG9jLCByb290LCBtaXhQb3J0cywgTlVMTCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPE1peFBvcnRUcmFpdHM+KGN1ciwgJm1peFBvcnRzLCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKHN0YXR1cyk7CisgICAgfQogICAgIG1vZHVsZS0+c2V0UHJvZmlsZXMobWl4UG9ydHMpOwogCiAgICAgRGV2aWNlUG9ydFRyYWl0czo6Q29sbGVjdGlvbiBkZXZpY2VQb3J0czsKLSAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248RGV2aWNlUG9ydFRyYWl0cz4oZG9jLCByb290LCBkZXZpY2VQb3J0cywgTlVMTCk7CisgICAgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPERldmljZVBvcnRUcmFpdHM+KGN1ciwgJmRldmljZVBvcnRzLCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKHN0YXR1cyk7CisgICAgfQogICAgIG1vZHVsZS0+c2V0RGVjbGFyZWREZXZpY2VzKGRldmljZVBvcnRzKTsKIAogICAgIFJvdXRlVHJhaXRzOjpDb2xsZWN0aW9uIHJvdXRlczsKLSAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248Um91dGVUcmFpdHM+KGRvYywgcm9vdCwgcm91dGVzLCBtb2R1bGUuZ2V0KCkpOworICAgIHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxSb3V0ZVRyYWl0cz4oY3VyLCAmcm91dGVzLCBtb2R1bGUuZ2V0KCkpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CiAgICAgbW9kdWxlLT5zZXRSb3V0ZXMocm91dGVzKTsKIAotICAgIGNvbnN0IHhtbE5vZGUgKmNoaWxkcmVuID0gcm9vdC0+eG1sQ2hpbGRyZW5Ob2RlOwotICAgIHdoaWxlIChjaGlsZHJlbiAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkcmVuLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKWNoaWxkQXR0YWNoZWREZXZpY2VzVGFnKSkgewotICAgICAgICAgICAgQUxPR1YoIiVzOiAlcyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgdGFnLCBjaGlsZEF0dGFjaGVkRGV2aWNlc1RhZyk7Ci0gICAgICAgICAgICBjb25zdCB4bWxOb2RlICpjaGlsZCA9IGNoaWxkcmVuLT54bWxDaGlsZHJlbk5vZGU7Ci0gICAgICAgICAgICB3aGlsZSAoY2hpbGQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKWNoaWxkQXR0YWNoZWREZXZpY2VUYWcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbENoYXIgKmF0dGFjaGVkRGV2aWNlID0geG1sTm9kZUxpc3RHZXRTdHJpbmcoZG9jLCBjaGlsZC0+eG1sQ2hpbGRyZW5Ob2RlLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGFjaGVkRGV2aWNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgY2hpbGRBdHRhY2hlZERldmljZVRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyKilhdHRhY2hlZERldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUtPmdldERlY2xhcmVkRGV2aWNlcygpLmdldERldmljZUZyb21UYWdOYW1lKFN0cmluZzgoKGNvbnN0IGNoYXIqKWF0dGFjaGVkRGV2aWNlKSk7CisgICAgZm9yIChjb25zdCB4bWxOb2RlICpjaGlsZHJlbiA9IGN1ci0+eG1sQ2hpbGRyZW5Ob2RlOyBjaGlsZHJlbiAhPSBOVUxMOworICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbi0+bmV4dCkgeworICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZHJlbi0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4oY2hpbGRBdHRhY2hlZERldmljZXNUYWcpKSkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiAlcyAlcyBmb3VuZCIsIF9fZnVuY19fLCB0YWcsIGNoaWxkQXR0YWNoZWREZXZpY2VzVGFnKTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgeG1sTm9kZSAqY2hpbGQgPSBjaGlsZHJlbi0+eG1sQ2hpbGRyZW5Ob2RlOyBjaGlsZCAhPSBOVUxMOworICAgICAgICAgICAgICAgICBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisgICAgICAgICAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KGNoaWxkQXR0YWNoZWREZXZpY2VUYWcpKSkgeworICAgICAgICAgICAgICAgICAgICBhdXRvIGF0dGFjaGVkRGV2aWNlID0gbWFrZV94bWxVbmlxdWUoeG1sTm9kZUxpc3RHZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC0+ZG9jLCBjaGlsZC0+eG1sQ2hpbGRyZW5Ob2RlLCAxKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhdHRhY2hlZERldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19mdW5jX18sIHRhZywgY2hpbGRBdHRhY2hlZERldmljZVRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oYXR0YWNoZWREZXZpY2UuZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IG1vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERldmljZUZyb21UYWdOYW1lKFN0cmluZzgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaGVkRGV2aWNlLmdldCgpKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5hZGRBdmFpbGFibGVEZXZpY2UoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbEZyZWUoYXR0YWNoZWREZXZpY2UpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQtPm5leHQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGRyZW4tPm5hbWUsIChjb25zdCB4bWxDaGFyICopY2hpbGREZWZhdWx0T3V0cHV0RGV2aWNlVGFnKSkgewotICAgICAgICAgICAgeG1sQ2hhciAqZGVmYXVsdE91dHB1dERldmljZSA9IHhtbE5vZGVMaXN0R2V0U3RyaW5nKGRvYywgY2hpbGRyZW4tPnhtbENoaWxkcmVuTm9kZSwgMSk7OwotICAgICAgICAgICAgaWYgKGRlZmF1bHRPdXRwdXREZXZpY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgY2hpbGREZWZhdWx0T3V0cHV0RGV2aWNlVGFnLAotICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyKilkZWZhdWx0T3V0cHV0RGV2aWNlKTsKLSAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLT5nZXREZWNsYXJlZERldmljZXMoKS5nZXREZXZpY2VGcm9tVGFnTmFtZShTdHJpbmc4KChjb25zdCBjaGFyKilkZWZhdWx0T3V0cHV0RGV2aWNlKSk7CisgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkcmVuLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4oY2hpbGREZWZhdWx0T3V0cHV0RGV2aWNlVGFnKSkpIHsKKyAgICAgICAgICAgIGF1dG8gZGVmYXVsdE91dHB1dERldmljZSA9IG1ha2VfeG1sVW5pcXVlKHhtbE5vZGVMaXN0R2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLT5kb2MsIGNoaWxkcmVuLT54bWxDaGlsZHJlbk5vZGUsIDEpKTsKKyAgICAgICAgICAgIGlmIChkZWZhdWx0T3V0cHV0RGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19mdW5jX18sIHRhZywgY2hpbGREZWZhdWx0T3V0cHV0RGV2aWNlVGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZGVmYXVsdE91dHB1dERldmljZS5nZXQoKSkpOworICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IG1vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCkuZ2V0RGV2aWNlRnJvbVRhZ05hbWUoCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGRlZmF1bHRPdXRwdXREZXZpY2UuZ2V0KCkpKSk7CiAgICAgICAgICAgICAgICAgaWYgKGRldmljZSAhPSAwICYmIGN0eC0+Z2V0RGVmYXVsdE91dHB1dERldmljZSgpID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgY3R4LT5zZXREZWZhdWx0T3V0cHV0RGV2aWNlKGRldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogZGVmYXVsdCBpcyAlMDh4IiwgX19GVU5DVElPTl9fLCBjdHgtPmdldERlZmF1bHRPdXRwdXREZXZpY2UoKS0+dHlwZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBkZWZhdWx0IGlzICUwOHgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjdHgtPmdldERlZmF1bHRPdXRwdXREZXZpY2UoKS0+dHlwZSgpKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sRnJlZShkZWZhdWx0T3V0cHV0RGV2aWNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuLT5uZXh0OwogICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgcmV0dXJuIG1vZHVsZTsKIH0KIAotY29uc3QgY2hhciAqY29uc3QgR2xvYmFsQ29uZmlnVHJhaXRzOjp0YWcgPSAiZ2xvYmFsQ29uZmlndXJhdGlvbiI7Ci0KLWNvbnN0IGNoYXIgR2xvYmFsQ29uZmlnVHJhaXRzOjpBdHRyaWJ1dGVzOjpzcGVha2VyRHJjRW5hYmxlZFtdID0gInNwZWFrZXJfZHJjX2VuYWJsZWQiOwotCi0KLXN0YXR1c190IEdsb2JhbENvbmZpZ1RyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLCBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKQorc3RhdHVzX3QgR2xvYmFsQ29uZmlnVHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpyb290LCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKQogewotICAgIGNvbnN0IHhtbE5vZGUgKnJvb3QgPSBjdXItPnhtbENoaWxkcmVuTm9kZTsKLSAgICB3aGlsZSAocm9vdCAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICgheG1sU3RyY21wKHJvb3QtPm5hbWUsIChjb25zdCB4bWxDaGFyICopdGFnKSkgewotICAgICAgICAgICAgc3RyaW5nIHNwZWFrZXJEcmNFbmFibGVkID0KLSAgICAgICAgICAgICAgICAgICAgZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnNwZWFrZXJEcmNFbmFibGVkKTsKKyAgICBmb3IgKGNvbnN0IHhtbE5vZGUgKmN1ciA9IHJvb3QtPnhtbENoaWxkcmVuTm9kZTsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgICAgICBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KHRhZykpKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBzcGVha2VyRHJjRW5hYmxlZCA9CisgICAgICAgICAgICAgICAgICAgIGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnNwZWFrZXJEcmNFbmFibGVkKTsKICAgICAgICAgICAgIGJvb2wgaXNTcGVha2VyRHJjRW5hYmxlZDsKICAgICAgICAgICAgIGlmICghc3BlYWtlckRyY0VuYWJsZWQuZW1wdHkoKSAmJgotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VG88c3RyaW5nLCBib29sPihzcGVha2VyRHJjRW5hYmxlZCwgaXNTcGVha2VyRHJjRW5hYmxlZCkpIHsKLSAgICAgICAgICAgICAgICBjb25maWcuc2V0U3BlYWtlckRyY0VuYWJsZWQoaXNTcGVha2VyRHJjRW5hYmxlZCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUbzxzdGQ6OnN0cmluZywgYm9vbD4oc3BlYWtlckRyY0VuYWJsZWQsIGlzU3BlYWtlckRyY0VuYWJsZWQpKSB7CisgICAgICAgICAgICAgICAgY29uZmlnLT5zZXRTcGVha2VyRHJjRW5hYmxlZChpc1NwZWFrZXJEcmNFbmFibGVkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQotICAgICAgICByb290ID0gcm9vdC0+bmV4dDsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi0KLWNvbnN0IGNoYXIgKmNvbnN0IFZvbHVtZVRyYWl0czo6dGFnID0gInZvbHVtZSI7Ci1jb25zdCBjaGFyICpjb25zdCBWb2x1bWVUcmFpdHM6OmNvbGxlY3Rpb25UYWcgPSAidm9sdW1lcyI7Ci1jb25zdCBjaGFyICpjb25zdCBWb2x1bWVUcmFpdHM6OnZvbHVtZVBvaW50VGFnID0gInBvaW50IjsKLQotY29uc3QgY2hhciBWb2x1bWVUcmFpdHM6OkF0dHJpYnV0ZXM6OnN0cmVhbVtdID0gInN0cmVhbSI7Ci1jb25zdCBjaGFyIFZvbHVtZVRyYWl0czo6QXR0cmlidXRlczo6ZGV2aWNlQ2F0ZWdvcnlbXSA9ICJkZXZpY2VDYXRlZ29yeSI7Ci1jb25zdCBjaGFyIFZvbHVtZVRyYWl0czo6QXR0cmlidXRlczo6cmVmZXJlbmNlW10gPSAicmVmIjsKLQotc3RhdHVzX3QgVm9sdW1lVHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCAvKnNlcmlhbGl6aW5nQ29udGV4dCovKQorUmV0dXJuPFZvbHVtZVRyYWl0czo6RWxlbWVudD4gVm9sdW1lVHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsCisgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCiB7Ci0gICAgc3RyaW5nIHN0cmVhbVR5cGVMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnN0cmVhbSk7CisgICAgc3RkOjpzdHJpbmcgc3RyZWFtVHlwZUxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpzdHJlYW0pOwogICAgIGlmIChzdHJlYW1UeXBlTGl0ZXJhbC5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OnN0cmVhbSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6c3RyZWFtKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9CiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlOwogICAgIGlmICghU3RyZWFtVHlwZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhzdHJlYW1UeXBlTGl0ZXJhbCwgc3RyZWFtVHlwZSkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkICVzIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpzdHJlYW0pOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgJXMiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6c3RyZWFtKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9Ci0gICAgc3RyaW5nIGRldmljZUNhdGVnb3J5TGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpkZXZpY2VDYXRlZ29yeSk7CisgICAgc3RkOjpzdHJpbmcgZGV2aWNlQ2F0ZWdvcnlMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6ZGV2aWNlQ2F0ZWdvcnkpOwogICAgIGlmIChkZXZpY2VDYXRlZ29yeUxpdGVyYWwuZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpkZXZpY2VDYXRlZ29yeSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6ZGV2aWNlQ2F0ZWdvcnkpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KICAgICBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnk7CiAgICAgaWYgKCFEZXZpY2VDYXRlZ29yeUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhkZXZpY2VDYXRlZ29yeUxpdGVyYWwsIGRldmljZUNhdGVnb3J5KSkgewotICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgJXM9JXMiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OmRldmljZUNhdGVnb3J5LAorICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgJXM9JXMiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6ZGV2aWNlQ2F0ZWdvcnksCiAgICAgICAgICAgICAgIGRldmljZUNhdGVnb3J5TGl0ZXJhbC5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9CiAKLSAgICBzdHJpbmcgcmVmZXJlbmNlTmFtZSA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpyZWZlcmVuY2UpOwotICAgIGNvbnN0IF94bWxOb2RlICpyZWYgPSBOVUxMOworICAgIHN0ZDo6c3RyaW5nIHJlZmVyZW5jZU5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpyZWZlcmVuY2UpOworICAgIGNvbnN0IHhtbE5vZGUgKnJlZiA9IE5VTEw7CiAgICAgaWYgKCFyZWZlcmVuY2VOYW1lLmVtcHR5KCkpIHsKLSAgICAgICAgZ2V0UmVmZXJlbmNlPFZvbHVtZVRyYWl0cz4ocm9vdC0+cGFyZW50LCByZWYsIHJlZmVyZW5jZU5hbWUpOworICAgICAgICByZWYgPSBnZXRSZWZlcmVuY2U8Vm9sdW1lVHJhaXRzPihjdXItPnBhcmVudCwgcmVmZXJlbmNlTmFtZSk7CiAgICAgICAgIGlmIChyZWYgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBObyByZWZlcmVuY2UgUHRyIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgcmVmZXJlbmNlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICBBTE9HRSgiJXM6IE5vIHJlZmVyZW5jZSBQdHIgZm91bmQgZm9yICVzIiwgX19mdW5jX18sIHJlZmVyZW5jZU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgZWxlbWVudCA9IG5ldyBFbGVtZW50KGRldmljZUNhdGVnb3J5LCBzdHJlYW1UeXBlKTsKKyAgICBFbGVtZW50IHZvbEN1cnZlID0gbmV3IFZvbHVtZUN1cnZlKGRldmljZUNhdGVnb3J5LCBzdHJlYW1UeXBlKTsKIAotICAgIGNvbnN0IHhtbE5vZGUgKmNoaWxkID0gcmVmZXJlbmNlTmFtZS5lbXB0eSgpID8gcm9vdC0+eG1sQ2hpbGRyZW5Ob2RlIDogcmVmLT54bWxDaGlsZHJlbk5vZGU7Ci0gICAgd2hpbGUgKGNoaWxkICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIChjb25zdCB4bWxDaGFyICopdm9sdW1lUG9pbnRUYWcpKSB7Ci0gICAgICAgICAgICB4bWxDaGFyICpwb2ludERlZmluaXRpb24gPSB4bWxOb2RlTGlzdEdldFN0cmluZyhkb2MsIGNoaWxkLT54bWxDaGlsZHJlbk5vZGUsIDEpOzsKLSAgICAgICAgICAgIGlmIChwb2ludERlZmluaXRpb24gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgZm9yIChjb25zdCB4bWxOb2RlICpjaGlsZCA9IHJlZmVyZW5jZU5hbWUuZW1wdHkoKSA/IGN1ci0+eG1sQ2hpbGRyZW5Ob2RlIDogcmVmLT54bWxDaGlsZHJlbk5vZGU7CisgICAgICAgICBjaGlsZCAhPSBOVUxMOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPih2b2x1bWVQb2ludFRhZykpKSB7CisgICAgICAgICAgICBhdXRvIHBvaW50RGVmaW5pdGlvbiA9IG1ha2VfeG1sVW5pcXVlKHhtbE5vZGVMaXN0R2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLT5kb2MsIGNoaWxkLT54bWxDaGlsZHJlbk5vZGUsIDEpKTsKKyAgICAgICAgICAgIGlmIChwb2ludERlZmluaXRpb24gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiJXM6ICVzPSVzIiwgX19GVU5DVElPTl9fLCB0YWcsIChjb25zdCBjaGFyKilwb2ludERlZmluaXRpb24pOwotICAgICAgICAgICAgVmVjdG9yPGludDMyX3Q+IHBvaW50OwotICAgICAgICAgICAgY29sbGVjdGlvbkZyb21TdHJpbmc8RGVmYXVsdFRyYWl0czxpbnQzMl90PiA+KChjb25zdCBjaGFyKilwb2ludERlZmluaXRpb24sIHBvaW50LCAiLCIpOworICAgICAgICAgICAgQUxPR1YoIiVzOiAlcz0lcyIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB0YWcsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHBvaW50RGVmaW5pdGlvbi5nZXQoKSkpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gcG9pbnQ7CisgICAgICAgICAgICBjb2xsZWN0aW9uRnJvbVN0cmluZzxEZWZhdWx0VHJhaXRzPGludDMyX3Q+PigKKyAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4ocG9pbnREZWZpbml0aW9uLmdldCgpKSwgcG9pbnQsICIsIik7CiAgICAgICAgICAgICBpZiAocG9pbnQuc2l6ZSgpICE9IDIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgJXM6ICVzIiwgX19GVU5DVElPTl9fLCB2b2x1bWVQb2ludFRhZywKLSAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciopcG9pbnREZWZpbml0aW9uKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCAlczogJXMiLCBfX2Z1bmNfXywgdm9sdW1lUG9pbnRUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihwb2ludERlZmluaXRpb24uZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxlbWVudC0+YWRkKEN1cnZlUG9pbnQocG9pbnRbMF0sIHBvaW50WzFdKSk7Ci0gICAgICAgICAgICB4bWxGcmVlKHBvaW50RGVmaW5pdGlvbik7CisgICAgICAgICAgICB2b2xDdXJ2ZS0+YWRkKEN1cnZlUG9pbnQocG9pbnRbMF0sIHBvaW50WzFdKSk7CiAgICAgICAgIH0KLSAgICAgICAgY2hpbGQgPSBjaGlsZC0+bmV4dDsKKyAgICB9CisgICAgcmV0dXJuIHZvbEN1cnZlOworfQorCitzdGF0dXNfdCBTdXJyb3VuZFNvdW5kVHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpyb290LCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKQoreworICAgIGNvbmZpZy0+c2V0RGVmYXVsdFN1cnJvdW5kRm9ybWF0cygpOworCisgICAgZm9yIChjb25zdCB4bWxOb2RlICpjdXIgPSByb290LT54bWxDaGlsZHJlbk5vZGU7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPih0YWcpKSkgeworICAgICAgICAgICAgQXVkaW9Qb2xpY3lDb25maWc6OlN1cnJvdW5kRm9ybWF0cyBmb3JtYXRzOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPFN1cnJvdW5kU291bmRGb3JtYXRUcmFpdHM+KAorICAgICAgICAgICAgICAgICAgICBjdXIsICZmb3JtYXRzLCBudWxscHRyKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBjb25maWctPnNldFN1cnJvdW5kRm9ybWF0cyhmb3JtYXRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLVBvbGljeVNlcmlhbGl6ZXI6OlBvbGljeVNlcmlhbGl6ZXIoKSA6IG1Sb290RWxlbWVudE5hbWUocm9vdE5hbWUpCitSZXR1cm48U3Vycm91bmRTb3VuZEZvcm1hdFRyYWl0czo6RWxlbWVudD4gU3Vycm91bmRTb3VuZEZvcm1hdFRyYWl0czo6ZGVzZXJpYWxpemUoCisgICAgICAgIGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKIHsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOwotICAgIG9zcyA8PCBnTWFqb3IgPDwgIi4iIDw8IGdNaW5vcjsKLSAgICBtVmVyc2lvbiA9IG9zcy5zdHIoKTsKLSAgICBBTE9HVigiJXM6IFZlcnNpb249JXMgUm9vdD0lcyIsIF9fRlVOQ1RJT05fXywgbVZlcnNpb24uY19zdHIoKSwgbVJvb3RFbGVtZW50TmFtZS5jX3N0cigpKTsKKyAgICBzdGQ6OnN0cmluZyBmb3JtYXRMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6bmFtZSk7CisgICAgaWYgKGZvcm1hdExpdGVyYWwuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIGZvciBhIHN1cnJvdW5kIGZvcm1hdCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpuYW1lKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICB9CisgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gZm9ybWF0RnJvbVN0cmluZyhmb3JtYXRMaXRlcmFsKTsKKyAgICBpZiAoZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5yZWNvZ25pemVkIGZvcm1hdCAlcyIsIF9fZnVuY19fLCBmb3JtYXRMaXRlcmFsLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOworICAgIH0KKyAgICBFbGVtZW50IHBhaXIgPSBzdGQ6Om1ha2VfcGFpcihmb3JtYXQsIENvbGxlY3Rpb246Om1hcHBlZF90eXBle30pOworCisgICAgc3RkOjpzdHJpbmcgc3ViZm9ybWF0c0xpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpzdWJmb3JtYXRzKTsKKyAgICBpZiAoc3ViZm9ybWF0c0xpdGVyYWwuZW1wdHkoKSkgcmV0dXJuIHBhaXI7CisgICAgRm9ybWF0VmVjdG9yIHN1YmZvcm1hdHMgPSBmb3JtYXRzRnJvbVN0cmluZyhzdWJmb3JtYXRzTGl0ZXJhbCwgIiAiKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHN1YmZvcm1hdCA6IHN1YmZvcm1hdHMpIHsKKyAgICAgICAgYXV0byByZXN1bHQgPSBwYWlyLnNlY29uZC5pbnNlcnQoc3ViZm9ybWF0KTsKKyAgICAgICAgaWYgKCFyZXN1bHQuc2Vjb25kKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGNvdWxkIG5vdCBhZGQgc3ViZm9ybWF0ICV4IHRvIGNvbGxlY3Rpb24iLCBfX2Z1bmNfXywgc3ViZm9ybWF0KTsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHBhaXI7CiB9CiAKLXN0YXR1c190IFBvbGljeVNlcmlhbGl6ZXI6OmRlc2VyaWFsaXplKGNvbnN0IGNoYXIgKmNvbmZpZ0ZpbGUsIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpCitzdGF0dXNfdCBQb2xpY3lTZXJpYWxpemVyOjpkZXNlcmlhbGl6ZShjb25zdCBjaGFyICpjb25maWdGaWxlLCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKQogewotICAgIHhtbERvY1B0ciBkb2M7Ci0gICAgZG9jID0geG1sUGFyc2VGaWxlKGNvbmZpZ0ZpbGUpOwotICAgIGlmIChkb2MgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBwYXJzZSAlcyBkb2N1bWVudC4iLCBfX0ZVTkNUSU9OX18sIGNvbmZpZ0ZpbGUpOworICAgIGF1dG8gZG9jID0gbWFrZV94bWxVbmlxdWUoeG1sUGFyc2VGaWxlKGNvbmZpZ0ZpbGUpKTsKKyAgICBpZiAoZG9jID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgcGFyc2UgJXMgZG9jdW1lbnQuIiwgX19mdW5jX18sIGNvbmZpZ0ZpbGUpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICB4bWxOb2RlUHRyIGN1ciA9IHhtbERvY0dldFJvb3RFbGVtZW50KGRvYyk7Ci0gICAgaWYgKGN1ciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IHBhcnNlICVzIGRvY3VtZW50OiBlbXB0eS4iLCBfX0ZVTkNUSU9OX18sIGNvbmZpZ0ZpbGUpOwotICAgICAgICB4bWxGcmVlRG9jKGRvYyk7CisgICAgeG1sTm9kZVB0ciByb290ID0geG1sRG9jR2V0Um9vdEVsZW1lbnQoZG9jLmdldCgpKTsKKyAgICBpZiAocm9vdCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IHBhcnNlICVzIGRvY3VtZW50OiBlbXB0eS4iLCBfX2Z1bmNfXywgY29uZmlnRmlsZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIGlmICh4bWxYSW5jbHVkZVByb2Nlc3MoZG9jKSA8IDApIHsKLSAgICAgICAgIEFMT0dFKCIlczogbGlieG1sIGZhaWxlZCB0byByZXNvbHZlIFhJbmNsdWRlcyBvbiAlcyBkb2N1bWVudC4iLCBfX0ZVTkNUSU9OX18sIGNvbmZpZ0ZpbGUpOworICAgIGlmICh4bWxYSW5jbHVkZVByb2Nlc3MoZG9jLmdldCgpKSA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBsaWJ4bWwgZmFpbGVkIHRvIHJlc29sdmUgWEluY2x1ZGVzIG9uICVzIGRvY3VtZW50LiIsIF9fZnVuY19fLCBjb25maWdGaWxlKTsKICAgICB9CiAKLSAgICBpZiAoeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikgbVJvb3RFbGVtZW50TmFtZS5jX3N0cigpKSkgIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyByb290IGVsZW1lbnQgZm91bmQgaW4geG1sIGRhdGEgJXMuIiwgX19GVU5DVElPTl9fLCBtUm9vdEVsZW1lbnROYW1lLmNfc3RyKCksCi0gICAgICAgICAgICAgIChjb25zdCBjaGFyICopY3VyLT5uYW1lKTsKLSAgICAgICAgeG1sRnJlZURvYyhkb2MpOworICAgIGlmICh4bWxTdHJjbXAocm9vdC0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4ocm9vdE5hbWUpKSkgIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyByb290IGVsZW1lbnQgZm91bmQgaW4geG1sIGRhdGEgJXMuIiwgX19mdW5jX18sIHJvb3ROYW1lLAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHJvb3QtPm5hbWUpKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBzdHJpbmcgdmVyc2lvbiA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIHZlcnNpb25BdHRyaWJ1dGUpOworICAgIHN0ZDo6c3RyaW5nIHZlcnNpb24gPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgdmVyc2lvbkF0dHJpYnV0ZSk7CiAgICAgaWYgKHZlcnNpb24uZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vIHZlcnNpb24gZm91bmQgaW4gcm9vdCBub2RlICVzIiwgX19GVU5DVElPTl9fLCBtUm9vdEVsZW1lbnROYW1lLmNfc3RyKCkpOworICAgICAgICBBTE9HRSgiJXM6IE5vIHZlcnNpb24gZm91bmQgaW4gcm9vdCBub2RlICVzIiwgX19mdW5jX18sIHJvb3ROYW1lKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgaWYgKHZlcnNpb24gIT0gbVZlcnNpb24pIHsKLSAgICAgICAgQUxPR0UoIiVzOiBWZXJzaW9uIGRvZXMgbm90IG1hdGNoOyBleHBlY3QgJXMgZ290ICVzIiwgX19GVU5DVElPTl9fLCBtVmVyc2lvbi5jX3N0cigpLAorICAgICAgICBBTE9HRSgiJXM6IFZlcnNpb24gZG9lcyBub3QgbWF0Y2g7IGV4cGVjdCAlcyBnb3QgJXMiLCBfX2Z1bmNfXywgbVZlcnNpb24uY19zdHIoKSwKICAgICAgICAgICAgICAgdmVyc2lvbi5jX3N0cigpKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgLy8gTGV0cyBkZXNlcmlhbGl6ZSBjaGlsZHJlbgogICAgIC8vIE1vZHVsZXMKICAgICBNb2R1bGVUcmFpdHM6OkNvbGxlY3Rpb24gbW9kdWxlczsKLSAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248TW9kdWxlVHJhaXRzPihkb2MsIGN1ciwgbW9kdWxlcywgJmNvbmZpZyk7Ci0gICAgY29uZmlnLnNldEh3TW9kdWxlcyhtb2R1bGVzKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248TW9kdWxlVHJhaXRzPihyb290LCAmbW9kdWxlcywgY29uZmlnKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGNvbmZpZy0+c2V0SHdNb2R1bGVzKG1vZHVsZXMpOwogCiAgICAgLy8gZGVzZXJpYWxpemUgdm9sdW1lIHNlY3Rpb24KICAgICBWb2x1bWVUcmFpdHM6OkNvbGxlY3Rpb24gdm9sdW1lczsKLSAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248Vm9sdW1lVHJhaXRzPihkb2MsIGN1ciwgdm9sdW1lcywgJmNvbmZpZyk7Ci0gICAgY29uZmlnLnNldFZvbHVtZXModm9sdW1lcyk7CisgICAgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPFZvbHVtZVRyYWl0cz4ocm9vdCwgJnZvbHVtZXMsIGNvbmZpZyk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBjb25maWctPnNldFZvbHVtZXModm9sdW1lcyk7CiAKICAgICAvLyBHbG9iYWwgQ29uZmlndXJhdGlvbgotICAgIEdsb2JhbENvbmZpZ1RyYWl0czo6ZGVzZXJpYWxpemUoY3VyLCBjb25maWcpOworICAgIEdsb2JhbENvbmZpZ1RyYWl0czo6ZGVzZXJpYWxpemUocm9vdCwgY29uZmlnKTsKIAotICAgIHhtbEZyZWVEb2MoZG9jKTsKKyAgICAvLyBTdXJyb3VuZCBjb25maWd1cmF0aW9uCisgICAgU3Vycm91bmRTb3VuZFRyYWl0czo6ZGVzZXJpYWxpemUocm9vdCwgY29uZmlnKTsKKwogICAgIHJldHVybiBhbmRyb2lkOjpPSzsKIH0KIAorfSAgLy8gbmFtZXNwYWNlCisKK3N0YXR1c190IGRlc2VyaWFsaXplQXVkaW9Qb2xpY3lGaWxlKGNvbnN0IGNoYXIgKmZpbGVOYW1lLCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKQoreworICAgIFBvbGljeVNlcmlhbGl6ZXIgc2VyaWFsaXplcjsKKyAgICByZXR1cm4gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShmaWxlTmFtZSwgY29uZmlnKTsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2Vzc2lvblJvdXRlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1Nlc3Npb25Sb3V0ZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMDY1MjYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2Vzc2lvblJvdXRlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJBUE1fU2Vzc2lvblJvdXRlIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSAiU2Vzc2lvblJvdXRlLmgiCi0jaW5jbHVkZSAiSHdNb2R1bGUuaCIKLSNpbmNsdWRlICJBdWRpb0dhaW4uaCIKLSNpbmNsdWRlICJEZXZpY2VEZXNjcmlwdG9yLmgiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tIFNlc3Npb25Sb3V0ZSBjbGFzcyBpbXBsZW1lbnRhdGlvbgotdm9pZCBTZXNzaW9uUm91dGU6OmxvZyhjb25zdCBjaGFyKiBwcmVmaXgpCi17Ci0gICAgQUxPR0koIiVzW1Nlc3Npb25Sb3V0ZSBzdHJtOjB4JVgsIHNyYzolZCwgc2VzczoweCVYLCBkZXY6MHglWCByZWZzOiVkIGFjdDolZCIsCi0gICAgICAgICAgcHJlZml4LCBtU3RyZWFtVHlwZSwgbVNvdXJjZSwgbVNlc3Npb24sCi0gICAgICAgICAgbURldmljZURlc2NyaXB0b3IgIT0gMCA/IG1EZXZpY2VEZXNjcmlwdG9yLT50eXBlKCkgOiBBVURJT19ERVZJQ0VfTk9ORSwKLSAgICAgICAgICBtUmVmQ291bnQsIG1BY3Rpdml0eUNvdW50KTsKLX0KLQotLy8gLS0tIFNlc3Npb25Sb3V0ZU1hcCBjbGFzcyBpbXBsZW1lbnRhdGlvbgotYm9vbCBTZXNzaW9uUm91dGVNYXA6Omhhc1JvdXRlKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQotewotICAgIHJldHVybiBpbmRleE9mS2V5KHNlc3Npb24pID49IDAgJiYgdmFsdWVGb3Ioc2Vzc2lvbiktPm1EZXZpY2VEZXNjcmlwdG9yICE9IDA7Ci19Ci0KLWJvb2wgU2Vzc2lvblJvdXRlTWFwOjpnZXRBbmRDbGVhclJvdXRlQ2hhbmdlZChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKLXsKLSAgICBpZiAoaW5kZXhPZktleShzZXNzaW9uKSA+PSAwKSB7Ci0gICAgICAgIGlmICh2YWx1ZUZvcihzZXNzaW9uKS0+bUNoYW5nZWQpIHsKLSAgICAgICAgICAgIHZhbHVlRm9yKHNlc3Npb24pLT5tQ2hhbmdlZCA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIFNlc3Npb25Sb3V0ZU1hcDo6cmVtb3ZlUm91dGUoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCi17Ci0gICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IGluZGV4T2ZLZXkoc2Vzc2lvbikgPj0gMCA/IHZhbHVlRm9yKHNlc3Npb24pIDogMDsKLSAgICBpZiAocm91dGUgIT0gMCkgewotICAgICAgICBBTE9HX0FTU0VSVChyb3V0ZS0+bVJlZkNvdW50ID4gMCk7Ci0gICAgICAgIC0tcm91dGUtPm1SZWZDb3VudDsKLSAgICAgICAgaWYgKHJvdXRlLT5tUmVmQ291bnQgPD0gMCkgewotICAgICAgICAgICAgcmVtb3ZlSXRlbShzZXNzaW9uKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotaW50IFNlc3Npb25Sb3V0ZU1hcDo6aW5jUm91dGVBY3Rpdml0eShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKLXsKLSAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gaW5kZXhPZktleShzZXNzaW9uKSA+PSAwID8gdmFsdWVGb3Ioc2Vzc2lvbikgOiAwOwotICAgIHJldHVybiByb3V0ZSAhPSAwID8gKysocm91dGUtPm1BY3Rpdml0eUNvdW50KSA6IC0xOwotfQotCi1pbnQgU2Vzc2lvblJvdXRlTWFwOjpkZWNSb3V0ZUFjdGl2aXR5KGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQotewotICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSBpbmRleE9mS2V5KHNlc3Npb24pID49IDAgPyB2YWx1ZUZvcihzZXNzaW9uKSA6IDA7Ci0gICAgaWYgKHJvdXRlICE9IDAgJiYgcm91dGUtPm1BY3Rpdml0eUNvdW50ID4gMCkgewotICAgICAgICByZXR1cm4gLS0ocm91dGUtPm1BY3Rpdml0eUNvdW50KTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotfQotCi12b2lkIFNlc3Npb25Sb3V0ZU1hcDo6bG9nKGNvbnN0IGNoYXIqIGNhcHRpb24pCi17Ci0gICAgQUxPR0koIiVzIC0tLS0iLCBjYXB0aW9uKTsKLSAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgc2l6ZSgpOyBpbmRleCsrKSB7Ci0gICAgICAgIHZhbHVlQXQoaW5kZXgpLT5sb2coIiAgIik7Ci0gICAgfQotfQotCi12b2lkIFNlc3Npb25Sb3V0ZU1hcDo6YWRkUm91dGUoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCi17Ci0gICAgaWYgKG1NYXBUeXBlID09IE1BUFRZUEVfSU5QVVQgJiYgc3RyZWFtVHlwZSAhPSBTZXNzaW9uUm91dGU6OlNUUkVBTV9UWVBFX05BKSB7Ci0gICAgICAgIEFMT0dFKCJBZGRpbmcgT3V0cHV0IFJvdXRlIHRvIElucHV0Um91dGVNYXAiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSBpZiAobU1hcFR5cGUgPT0gTUFQVFlQRV9PVVRQVVQgJiYgc291cmNlICE9IFNlc3Npb25Sb3V0ZTo6U09VUkNFX1RZUEVfTkEpIHsKLSAgICAgICAgQUxPR0UoIkFkZGluZyBJbnB1dCBSb3V0ZSB0byBPdXRwdXRSb3V0ZU1hcCIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IGluZGV4T2ZLZXkoc2Vzc2lvbikgPj0gMCA/IHZhbHVlRm9yKHNlc3Npb24pIDogMDsKLQotICAgIGlmIChyb3V0ZSAhPSAwKSB7Ci0gICAgICAgIGlmIChkZXNjcmlwdG9yICE9IDAgfHwgcm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yICE9IDApIHsKLSAgICAgICAgICAgIHJvdXRlLT5tQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcm91dGUtPm1SZWZDb3VudCsrOwotICAgICAgICByb3V0ZS0+bURldmljZURlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJvdXRlID0gbmV3IFNlc3Npb25Sb3V0ZShzZXNzaW9uLCBzdHJlYW1UeXBlLCBzb3VyY2UsIGRlc2NyaXB0b3IsIHVpZCk7Ci0gICAgICAgIHJvdXRlLT5tUmVmQ291bnQrKzsKLSAgICAgICAgaWYgKGRlc2NyaXB0b3IgIT0gMCkgewotICAgICAgICAgICAgcm91dGUtPm1DaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBhZGQoc2Vzc2lvbiwgcm91dGUpOwotICAgIH0KLX0KLQotYXVkaW9fZGV2aWNlc190IFNlc3Npb25Sb3V0ZU1hcDo6Z2V0QWN0aXZlRGV2aWNlRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGF2YWlsYWJsZURldmljZXMpCi17Ci0gICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHNpemUoKTsgaW5kZXgrKykgewotICAgICAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gdmFsdWVBdChpbmRleCk7Ci0gICAgICAgIGlmIChzdHJlYW1UeXBlID09IHJvdXRlLT5tU3RyZWFtVHlwZSAmJiByb3V0ZS0+aXNBY3RpdmVPckNoYW5nZWQoKQotICAgICAgICAgICAgICAgICYmIHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvciAhPSAwKSB7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gcm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yLT50eXBlKCk7Ci0gICAgICAgICAgICBpZiAoIWF2YWlsYWJsZURldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1N0cmVhbURlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU3RyZWFtRGVzY3JpcHRvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NjQ5ZmIuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU3RyZWFtRGVzY3JpcHRvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQVBNOjpWb2x1bWVzIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0vLyNkZWZpbmUgVkVSWV9WRVJCT1NFX0xPR0dJTkcKLSNpZmRlZiBWRVJZX1ZFUkJPU0VfTE9HR0lORwotI2RlZmluZSBBTE9HVlYgQUxPR1YKLSNlbHNlCi0jZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUoMCkKLSNlbmRpZgotCi0jaW5jbHVkZSAiU3RyZWFtRGVzY3JpcHRvci5oIgotI2luY2x1ZGUgIkdhaW5zLmgiCi0jaW5jbHVkZSAicG9saWN5LmgiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLSBTdHJlYW1EZXNjcmlwdG9yIGNsYXNzIGltcGxlbWVudGF0aW9uCi0KLVN0cmVhbURlc2NyaXB0b3I6OlN0cmVhbURlc2NyaXB0b3IoKQotICAgIDogICBtSW5kZXhNaW4oMCksIG1JbmRleE1heCgxKSwgbUNhbkJlTXV0ZWQodHJ1ZSkKLXsKLSAgICAvLyBJbml0aWFsaXplIHRoZSBjdXJyZW50IHN0cmVhbSdzIGluZGV4IHRvIG1JbmRleE1heCBzbyB2b2x1bWUgaXNuJ3QgMCBpbgotICAgIC8vIGNhc2VzIHdoZXJlIHRoZSBKYXZhIGxheWVyIGRvZXNuJ3QgY2FsbCBpbnRvIHRoZSBhdWRpbyBwb2xpY3kgc2VydmljZSB0bwotICAgIC8vIHNldCB0aGUgZGVmYXVsdCB2b2x1bWUuCi0gICAgbUluZGV4Q3VyLmFkZChBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSwgbUluZGV4TWF4KTsKLX0KLQotaW50IFN0cmVhbURlc2NyaXB0b3I6OmdldFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0Ci17Ci0gICAgZGV2aWNlID0gVm9sdW1lOjpnZXREZXZpY2VGb3JWb2x1bWUoZGV2aWNlKTsKLSAgICAvLyB0aGVyZSBpcyBhbHdheXMgYSB2YWxpZCBlbnRyeSBmb3IgQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUUKLSAgICBpZiAobUluZGV4Q3VyLmluZGV4T2ZLZXkoZGV2aWNlKSA8IDApIHsKLSAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUU7Ci0gICAgfQotICAgIHJldHVybiBtSW5kZXhDdXIudmFsdWVGb3IoZGV2aWNlKTsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yOjpjbGVhckN1cnJlbnRWb2x1bWVJbmRleCgpCi17Ci0gICAgbUluZGV4Q3VyLmNsZWFyKCk7Ci19Ci0KLXZvaWQgU3RyZWFtRGVzY3JpcHRvcjo6YWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGludCBpbmRleCkKLXsKLSAgICBtSW5kZXhDdXIuYWRkKGRldmljZSwgaW5kZXgpOwotfQotCi12b2lkIFN0cmVhbURlc2NyaXB0b3I6OnNldFZvbHVtZUluZGV4TWluKGludCB2b2xJbmRleE1pbikKLXsKLSAgICBtSW5kZXhNaW4gPSB2b2xJbmRleE1pbjsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yOjpzZXRWb2x1bWVJbmRleE1heChpbnQgdm9sSW5kZXhNYXgpCi17Ci0gICAgbUluZGV4TWF4ID0gdm9sSW5kZXhNYXg7Ci19Ci0KLXZvaWQgU3RyZWFtRGVzY3JpcHRvcjo6c2V0Vm9sdW1lQ3VydmVQb2ludChkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqcG9pbnQpCi17Ci0gICAgbVZvbHVtZUN1cnZlW2RldmljZUNhdGVnb3J5XSA9IHBvaW50OwotfQotCi12b2lkIFN0cmVhbURlc2NyaXB0b3I6OmR1bXAoaW50IGZkKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJXMgICAgICAgICAlMDJkICAgICAgICAgJTAyZCAgICAgICAgICIsCi0gICAgICAgICAgICAgbUNhbkJlTXV0ZWQgPyAidHJ1ZSAiIDogImZhbHNlIiwgbUluZGV4TWluLCBtSW5kZXhNYXgpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbmRleEN1ci5zaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlMDR4IDogJTAyZCwgIiwKLSAgICAgICAgICAgICAgICAgbUluZGV4Q3VyLmtleUF0KGkpLAotICAgICAgICAgICAgICAgICBtSW5kZXhDdXIudmFsdWVBdChpKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB9Ci0gICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKLQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotfQotCi1TdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6U3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb24oKQotewotICAgIGZvciAoc2l6ZV90IHN0cmVhbSA9IDAgOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fQ05UOyBzdHJlYW0rKykgewotICAgICAgICBhZGQoc3RhdGljX2Nhc3Q8YXVkaW9fc3RyZWFtX3R5cGVfdD4oc3RyZWFtKSwgU3RyZWFtRGVzY3JpcHRvcigpKTsKLSAgICB9Ci19Ci0KLWJvb2wgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OmNhbkJlTXV0ZWQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi17Ci0gICAgcmV0dXJuIHZhbHVlQXQoc3RyZWFtKS5jYW5CZU11dGVkKCk7Ci19Ci0KLXZvaWQgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OmNsZWFyQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotewotICAgIGVkaXRWYWx1ZUF0KHN0cmVhbSkuY2xlYXJDdXJyZW50Vm9sdW1lSW5kZXgoKTsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6YWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGludCBpbmRleCkKLXsKLSAgICBlZGl0VmFsdWVBdChzdHJlYW0pLmFkZEN1cnJlbnRWb2x1bWVJbmRleChkZXZpY2UsIGluZGV4KTsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6c2V0Vm9sdW1lQ3VydmVQb2ludChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpwb2ludCkKLXsKLSAgICBlZGl0VmFsdWVBdChzdHJlYW0pLnNldFZvbHVtZUN1cnZlUG9pbnQoZGV2aWNlQ2F0ZWdvcnksIHBvaW50KTsKLX0KLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OmdldFZvbHVtZUN1cnZlUG9pbnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnkpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHZhbHVlQXQoc3RyZWFtKS5nZXRWb2x1bWVDdXJ2ZVBvaW50KGRldmljZUNhdGVnb3J5KTsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6c2V0Vm9sdW1lSW5kZXhNaW4oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0saW50IHZvbEluZGV4TWluKQotewotICAgIHJldHVybiBlZGl0VmFsdWVBdChzdHJlYW0pLnNldFZvbHVtZUluZGV4TWluKHZvbEluZGV4TWluKTsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6c2V0Vm9sdW1lSW5kZXhNYXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0saW50IHZvbEluZGV4TWF4KQotewotICAgIHJldHVybiBlZGl0VmFsdWVBdChzdHJlYW0pLnNldFZvbHVtZUluZGV4TWF4KHZvbEluZGV4TWF4KTsKLX0KLQotZmxvYXQgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OnZvbEluZGV4VG9EYihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZGV2aWNlX2NhdGVnb3J5IGNhdGVnb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhJblVpKSBjb25zdAotewotICAgIGNvbnN0IFN0cmVhbURlc2NyaXB0b3IgJnN0cmVhbURlc2MgPSB2YWx1ZUF0KHN0cmVhbSk7Ci0gICAgcmV0dXJuIEdhaW5zOjp2b2xJbmRleFRvRGIoc3RyZWFtRGVzYy5nZXRWb2x1bWVDdXJ2ZVBvaW50KGNhdGVnb3J5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjLmdldFZvbHVtZUluZGV4TWluKCksIHN0cmVhbURlc2MuZ2V0Vm9sdW1lSW5kZXhNYXgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleEluVWkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6aW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4KQotewotICAgIEFMT0dWKCJpbml0U3RyZWFtVm9sdW1lKCkgc3RyZWFtICVkLCBtaW4gJWQsIG1heCAlZCIsIHN0cmVhbSAsIGluZGV4TWluLCBpbmRleE1heCk7Ci0gICAgaWYgKGluZGV4TWluIDwgMCB8fCBpbmRleE1pbiA+PSBpbmRleE1heCkgewotICAgICAgICBBTE9HVygiaW5pdFN0cmVhbVZvbHVtZSgpIGludmFsaWQgaW5kZXggbGltaXRzIGZvciBzdHJlYW0gJWQsIG1pbiAlZCwgbWF4ICVkIiwKLSAgICAgICAgICAgICAgc3RyZWFtICwgaW5kZXhNaW4sIGluZGV4TWF4KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc2V0Vm9sdW1lSW5kZXhNaW4oc3RyZWFtLCBpbmRleE1pbik7Ci0gICAgc2V0Vm9sdW1lSW5kZXhNYXgoc3RyZWFtLCBpbmRleE1heCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi12b2lkIFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uOjppbml0aWFsaXplVm9sdW1lQ3VydmVzKGJvb2wgaXNTcGVha2VyRHJjRW5hYmxlZCkKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IEFVRElPX1NUUkVBTV9DTlQ7IGkrKykgewotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IERFVklDRV9DQVRFR09SWV9DTlQ7IGorKykgewotICAgICAgICAgICAgc2V0Vm9sdW1lQ3VydmVQb2ludChzdGF0aWNfY2FzdDxhdWRpb19zdHJlYW1fdHlwZV90PihpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZGV2aWNlX2NhdGVnb3J5PihqKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FpbnM6OnNWb2x1bWVQcm9maWxlc1tpXVtqXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBDaGVjayBhdmFpbGFiaWxpdHkgb2YgRFJDIG9uIHNwZWFrZXIgcGF0aDogaWYgYXZhaWxhYmxlLCBvdmVycmlkZSBzb21lIG9mIHRoZSBzcGVha2VyIGN1cnZlcwotICAgIGlmIChpc1NwZWFrZXJEcmNFbmFibGVkKSB7Ci0gICAgICAgIHNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX1NZU1RFTSwgREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVEcmMpOwotICAgICAgICBzZXRWb2x1bWVDdXJ2ZVBvaW50KEFVRElPX1NUUkVBTV9SSU5HLCBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYWluczo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyYyk7Ci0gICAgICAgIHNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX0FMQVJNLCBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYWluczo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyYyk7Ci0gICAgICAgIHNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX05PVElGSUNBVElPTiwgREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FpbnM6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVEcmMpOwotICAgICAgICBzZXRWb2x1bWVDdXJ2ZVBvaW50KEFVRElPX1NUUkVBTV9NVVNJQywgREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FpbnM6OnNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZURyYyk7Ci0gICAgICAgIHNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFksIERFVklDRV9DQVRFR09SWV9TUEVBS0VSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdhaW5zOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVEcmMpOwotICAgIH0KLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6c3dpdGNoVm9sdW1lQ3VydmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1TcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbURzdCkKLXsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IERFVklDRV9DQVRFR09SWV9DTlQ7IGorKykgewotICAgICAgICBzZXRWb2x1bWVDdXJ2ZVBvaW50KHN0cmVhbURzdCwgc3RhdGljX2Nhc3Q8ZGV2aWNlX2NhdGVnb3J5PihqKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYWluczo6c1ZvbHVtZVByb2ZpbGVzW3N0cmVhbVNyY11bal0pOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5TdHJlYW1zIGR1bXA6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLAotICAgICAgICAgICAgICIgU3RyZWFtICBDYW4gYmUgbXV0ZWQgIEluZGV4IE1pbiAgSW5kZXggTWF4ICBJbmRleCBDdXIgW2RldmljZSA6IGluZGV4XS4uLlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICUwMnp1ICAgICAgIiwgaSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgdmFsdWVBdChpKS5kdW1wKGZkKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1ZvbHVtZUN1cnZlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1ZvbHVtZUN1cnZlLmNwcAppbmRleCBhYzNmMWJjLi42MjBmMzYxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Wb2x1bWVDdXJ2ZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvVm9sdW1lQ3VydmUuY3BwCkBAIC02OCw4MSArNjgsNTYgQEAKICAgICByZXR1cm4gZGVjaWJlbHM7CiB9CiAKLXZvaWQgVm9sdW1lQ3VydmU6OmR1bXAoaW50IGZkKSBjb25zdAordm9pZCBWb2x1bWVDdXJ2ZTo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIHsiKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgZHN0LT5hcHBlbmQoIiB7Iik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ3VydmVQb2ludHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiKCUzZCwgJTVkKSIsCisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIoJTNkLCAlNWQpIiwKICAgICAgICAgICAgICAgICAgbUN1cnZlUG9pbnRzW2ldLm1JbmRleCwgbUN1cnZlUG9pbnRzW2ldLm1BdHRlbnVhdGlvbkluTWIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoaSA9PSAobUN1cnZlUG9pbnRzLnNpemUoKSAtIDEpID8gIiB9XG4iIDogIiwgIik7CisgICAgICAgIGRzdC0+YXBwZW5kKGkgPT0gKG1DdXJ2ZVBvaW50cy5zaXplKCkgLSAxKSA/ICIgfVxuIiA6ICIsICIpOwogICAgIH0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKIH0KIAotdm9pZCBWb2x1bWVDdXJ2ZXNGb3JTdHJlYW06OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzID0gMCwgYm9vbCBjdXJ2ZVBvaW50cykgY29uc3QKK3ZvaWQgVm9sdW1lQ3VydmVzRm9yU3RyZWFtOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcyA9IDAsIGJvb2wgY3VydmVQb2ludHMpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KICAgICBpZiAoIWN1cnZlUG9pbnRzKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiVzICAgICAgICAgJTAyZCAgICAgICAgICUwMmQgICAgICAgICAiLAorICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJXMgICAgICAgICAlMDJkICAgICAgICAgJTAyZCAgICAgICAgICIsCiAgICAgICAgICAgICAgICAgIG1DYW5CZU11dGVkID8gInRydWUgIiA6ICJmYWxzZSIsIG1JbmRleE1pbiwgbUluZGV4TWF4KTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbmRleEN1ci5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJTA0eCA6ICUwMmQsICIsIG1JbmRleEN1ci5rZXlBdChpKSwgbUluZGV4Q3VyLnZhbHVlQXQoaSkpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUwNHggOiAlMDJkLCAiLCBtSW5kZXhDdXIua2V5QXQoaSksIG1JbmRleEN1ci52YWx1ZUF0KGkpKTsKICAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwotICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICAgICAgZHN0LT5hcHBlbmQoIlxuIik7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIHN0ZDo6c3RyaW5nIGRldmljZUNhdExpdGVyYWw7CiAgICAgICAgIERldmljZUNhdGVnb3J5Q29udmVydGVyOjp0b1N0cmluZyhrZXlBdChpKSwgZGV2aWNlQ2F0TGl0ZXJhbCk7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcyAlcyA6IiwKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyAlcyA6IiwKICAgICAgICAgICAgICAgICAgc3BhY2VzLCAiIiwgZGV2aWNlQ2F0TGl0ZXJhbC5jX3N0cigpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QpOwogICAgIH0KLSAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIGRzdC0+YXBwZW5kKCJcbiIpOwogfQogCi1zdGF0dXNfdCBWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKK3ZvaWQgVm9sdW1lQ3VydmVzQ29sbGVjdGlvbjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcblN0cmVhbXMgZHVtcDpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCisgICAgZHN0LT5hcHBlbmQoIlxuU3RyZWFtcyBkdW1wOlxuIik7CisgICAgZHN0LT5hcHBlbmQoCiAgICAgICAgICAgICAgIiBTdHJlYW0gIENhbiBiZSBtdXRlZCAgSW5kZXggTWluICBJbmRleCBNYXggIEluZGV4IEN1ciBbZGV2aWNlIDogaW5kZXhdLi4uXG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgJTAyenUgICAgICAiLCBpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLmR1bXAoZmQpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICUwMnp1ICAgICAgIiwgaSk7CisgICAgICAgIHZhbHVlQXQoaSkuZHVtcChkc3QpOwogICAgIH0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcblZvbHVtZSBDdXJ2ZXMgZm9yIFVzZSBDYXNlcyAoYWthIFN0cmVhbSB0eXBlcykgZHVtcDpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBkc3QtPmFwcGVuZCgiXG5Wb2x1bWUgQ3VydmVzIGZvciBVc2UgQ2FzZXMgKGFrYSBTdHJlYW0gdHlwZXMpIGR1bXA6XG4iKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIHN0ZDo6c3RyaW5nIHN0cmVhbVR5cGVMaXRlcmFsOwogICAgICAgICBTdHJlYW1UeXBlQ29udmVydGVyOjp0b1N0cmluZyhrZXlBdChpKSwgc3RyZWFtVHlwZUxpdGVyYWwpOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KAogICAgICAgICAgICAgICAgICAiICVzICglMDJ6dSk6IEN1cnZlIHBvaW50cyBmb3IgZGV2aWNlIGNhdGVnb3J5IChpbmRleCwgYXR0ZW51YXRpb24gaW4gbWlsbGliZWwpXG4iLAogICAgICAgICAgICAgICAgICBzdHJlYW1UeXBlTGl0ZXJhbC5jX3N0cigpLCBpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLmR1bXAoZmQsIDIsIHRydWUpOworICAgICAgICB2YWx1ZUF0KGkpLmR1bXAoZHN0LCAyLCB0cnVlKTsKICAgICB9Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCmluZGV4IGE3NWYxY2IuLjQyYzUyZGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbApAQCAtMTg1LDYgKzE4NSw5IEBACiAgICAgICAgIDwhLS0gSGVhcmluZyBhaWQgQXVkaW8gSEFMIC0tPgogICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJoZWFyaW5nX2FpZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLz4KIAorICAgICAgICA8IS0tIE1TRCBBdWRpbyBIQUwgKG9wdGlvbmFsKSAtLT4KKyAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0ibXNkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCIvPgorCiAgICAgPC9tb2R1bGVzPgogICAgIDwhLS0gRW5kIG9mIE1vZHVsZXMgc2VjdGlvbiAtLT4KIApAQCAtMTk1LDQgKzE5OCwxMCBAQAogCiAgICAgPCEtLSBFbmQgb2YgVm9sdW1lIHNlY3Rpb24gLS0+CiAKKyAgICA8IS0tIFN1cnJvdW5kIFNvdW5kIGNvbmZpZ3VyYXRpb24gLS0+CisKKyAgICA8eGk6aW5jbHVkZSBocmVmPSJzdXJyb3VuZF9zb3VuZF9jb25maWd1cmF0aW9uXzVfMC54bWwiLz4KKworICAgIDwhLS0gRW5kIG9mIFN1cnJvdW5kIFNvdW5kIGNvbmZpZ3VyYXRpb24gLS0+CisKIDwvYXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL21zZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvbXNkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjE3YmM2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL21zZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKQEAgLTAsMCArMSw3OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE3LTIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLSBNdWx0aSBTdHJlYW0gRGVjb2RlciBBdWRpbyBQb2xpY3kgQ29uZmlndXJhdGlvbiBmaWxlIC0tPgorPG1vZHVsZSBuYW1lPSJtc2QiIGhhbFZlcnNpb249IjIuMCI+CisgICAgPGF0dGFjaGVkRGV2aWNlcz4KKyAgICAgICAgPGl0ZW0+TVMxMiBJbnB1dDwvaXRlbT4KKyAgICAgICAgPGl0ZW0+TVMxMiBPdXRwdXQ8L2l0ZW0+CisgICAgPC9hdHRhY2hlZERldmljZXM+CisgICAgPG1peFBvcnRzPgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJtczEyIGlucHV0IiByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0ibXMxMiBjb21wcmVzc2VkIGlucHV0IiByb2xlPSJzb3VyY2UiCisgICAgICAgICAgICAgICAgZmxhZ3M9IkFVRElPX09VVFBVVF9GTEFHX0RJUkVDVHxBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEfEFVRElPX09VVFBVVF9GTEFHX05PTl9CTE9DS0lORyI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0FDMyIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyxBVURJT19DSEFOTkVMX09VVF81UE9JTlQxIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0VfQUMzIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iMzIwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8sQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSIvPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9FX0FDM19KT0MiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCw0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyxBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSxBVURJT19DSEFOTkVMX09VVF83UE9JTlQxIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0FDNCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyxBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEiLz4KKyAgICAgICAgPC9taXhQb3J0PgorICAgICAgICA8IS0tIFRoZSBIVyBBViBTeW5jIGZsYWcgaXMgbm90IHJlcXVpcmVkLCBidXQgaXMgcmVjb21tZW5kZWQgLS0+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9Im1zMTIgb3V0cHV0IiByb2xlPSJzaW5rIiBmbGFncz0iQVVESU9fSU5QVVRfRkxBR19IV19BVl9TWU5DIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0FDMyIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fNVBPSU5UMSIvPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9FX0FDMyIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fNVBPSU5UMSIvPgorICAgICAgICA8L21peFBvcnQ+CisgICA8L21peFBvcnRzPgorICAgPGRldmljZVBvcnRzPgorICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9Ik1TMTIgSW5wdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQlVTIiAgcm9sZT0ic2luayI+CisgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfQUMzIgorICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCw0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyxBVURJT19DSEFOTkVMX09VVF81UE9JTlQxIi8+CisgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfRV9BQzMiCisgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8sQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSIvPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9FX0FDM19KT0MiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCw0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyxBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSxBVURJT19DSEFOTkVMX09VVF83UE9JTlQxIi8+CisgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfQUM0IgorICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCw0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyxBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEiLz4KKyAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iTVMxMiBPdXRwdXQiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9CVVMiICByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICA8L2RldmljZVBvcnRzPgorICAgIDxyb3V0ZXM+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9Ik1TMTIgSW5wdXQiIHNvdXJjZXM9Im1zMTIgaW5wdXQsbXMxMiBjb21wcmVzc2VkIGlucHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9Im1zMTIgb3V0cHV0IiBzb3VyY2VzPSJNUzEyIE91dHB1dCIvPgorICAgIDwvcm91dGVzPgorPC9tb2R1bGU+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvc3Vycm91bmRfc291bmRfY29uZmlndXJhdGlvbl81XzAueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3N1cnJvdW5kX3NvdW5kX2NvbmZpZ3VyYXRpb25fNV8wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTBhMTgxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3N1cnJvdW5kX3NvdW5kX2NvbmZpZ3VyYXRpb25fNV8wLnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8c3Vycm91bmRTb3VuZD4KKyAgPCEtLSBFYWNoIG9mIHRoZSBsaXN0ZWQgZm9ybWF0cyBnZXRzIGFuIGVudHJ5IGluIFN1cnJvdW5kIFNldHRpbmdzIGRpYWxvZyBvbiBUViBkZXZpY2VzLgorICAgICAgIFRoZXJlIG11c3QgYmUgYSBjb3JyZXNwb25kaW5nIEphdmEgRU5DT0RJTkdfLi4uIGNvbnRhbnQgZGVmaW5lZCBpbiBBdWRpb0Zvcm1hdC5qYXZhLAorICAgICAgIGFuZCBhIGRpc3BsYXkgbmFtZSBkZWZpbmVkIGluIEF1ZGlvRm9ybWF0LnRvRGlzcGxheU5hbWUuIEZvciB0aGUgZm9ybWF0cyB0aGF0IGRvbid0CisgICAgICAgbmVlZCBhIGRlZGljYXRlZCBTdXJyb25kIFNldHRpbmdzIGRpYWxvZyBlbnRyeSwgYSBzdWJmb3JtYXRzIGxpc3QgaGFzIHRvIGJlIHVzZWQuIC0tPgorICA8Zm9ybWF0cz4KKyAgICA8Zm9ybWF0IG5hbWU9IkFVRElPX0ZPUk1BVF9BQzMiIC8+CisgICAgPGZvcm1hdCBuYW1lPSJBVURJT19GT1JNQVRfRV9BQzMiIC8+CisgICAgPGZvcm1hdCBuYW1lPSJBVURJT19GT1JNQVRfRV9BQzNfSk9DIiAvPgorICAgIDxmb3JtYXQgbmFtZT0iQVVESU9fRk9STUFUX0RPTEJZX1RSVUVIRCIgLz4KKyAgICA8Zm9ybWF0IG5hbWU9IkFVRElPX0ZPUk1BVF9EVFMiIC8+CisgICAgPGZvcm1hdCBuYW1lPSJBVURJT19GT1JNQVRfRFRTX0hEIiAvPgorICAgIDxmb3JtYXQgbmFtZT0iQVVESU9fRk9STUFUX0FBQ19MQyIgc3ViZm9ybWF0cz0iQVVESU9fRk9STUFUX0FBQ19IRV9WMSBBVURJT19GT1JNQVRfQUFDX0hFX1YyIEFVRElPX0ZPUk1BVF9BQUNfRUxEIEFVRElPX0ZPUk1BVF9BQUNfWEhFIiAvPgorICAgIDxmb3JtYXQgbmFtZT0iQVVESU9fRk9STUFUX0FDNCIgLz4KKyAgPC9mb3JtYXRzPgorPC9zdXJyb3VuZFNvdW5kPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL0FuZHJvaWQubWsKaW5kZXggMzZlMGY0Mi4uYjEyOGEzOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9BbmRyb2lkLm1rCkBAIC0xMCw3ICsxMCw2IEBACiAgICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlIFwKICAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbmNsdWRlIFwKICAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbnRlcmZhY2UgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvdXRpbGl0aWVzL2NvbnZlcnQgXAogCiBMT0NBTF9TUkNfRklMRVM6PSBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5jcHAKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5jcHAKaW5kZXggZTg2YWU1Zi4uNjkzOTVmMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuY3BwCkBAIC0zMTUsNyArMzE1LDcgQEAKICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eERldmljZSA9IGdldERldmljZUZvcklucHV0U291cmNlKEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OKTsKICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gcHJpbWFyeU91dHB1dCA9IG91dHB1dHMuZ2V0UHJpbWFyeU91dHB1dCgpOwogICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGF2YWlsUHJpbWFyeUlucHV0RGV2aWNlcyA9Ci0gICAgICAgICAgICAgICAgIGF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbUh3TW9kdWxlKHByaW1hcnlPdXRwdXQtPmdldE1vZHVsZUhhbmRsZSgpKTsKKyAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZVR5cGVzRnJvbUh3TW9kdWxlKHByaW1hcnlPdXRwdXQtPmdldE1vZHVsZUhhbmRsZSgpKTsKIAogICAgICAgICAgICAgLy8gVE9ETzogZ2V0UHJpbWFyeU91dHB1dCByZXR1cm4gb25seSBkZXZpY2VzIGZyb20gZmlyc3QgbW9kdWxlIGluCiAgICAgICAgICAgICAvLyBhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwsIGhlYXJpbmcgYWlkIGlzIG5vdCB0aGVyZSwgYnV0IGl0J3MKQEAgLTQxMCw4ICs0MTAsNyBAQAogCiAgICAgY2FzZSBTVFJBVEVHWV9TT05JRklDQVRJT046CiAKLSAgICAgICAgLy8gSWYgaW5jYWxsLCBqdXN0IHNlbGVjdCB0aGUgU1RSQVRFR1lfUEhPTkUgZGV2aWNlOiBUaGUgcmVzdCBvZiB0aGUgYmVoYXZpb3IgaXMgaGFuZGxlZCBieQotICAgICAgICAvLyBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKS4KKyAgICAgICAgLy8gSWYgaW5jYWxsLCBqdXN0IHNlbGVjdCB0aGUgU1RSQVRFR1lfUEhPTkUgZGV2aWNlCiAgICAgICAgIGlmIChpc0luQ2FsbCgpIHx8IG91dHB1dHMuaXNTdHJlYW1BY3RpdmVMb2NhbGx5KEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSkgewogICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3lJbnQoCiAgICAgICAgICAgICAgICAgICAgIFNUUkFURUdZX1BIT05FLCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLCBhdmFpbGFibGVJbnB1dERldmljZXMsIG91dHB1dHMsCkBAIC00ODQsNyArNDgzLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzID0KLSAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUpOworICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZU1hc2soYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUpOwogICAgICAgICAgICAgaWYgKG91dHB1dHMuaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX1JJTkcpIHx8CiAgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX0FMQVJNKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBnZXREZXZpY2VGb3JTdHJhdGVneUludCgKQEAgLTY3MSw5ICs2NzAsOCBAQAogICAgICAgICBpZiAoKGdldFBob25lU3RhdGUoKSA9PSBBVURJT19NT0RFX0lOX0NBTEwpICYmCiAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSAmIEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYKSA9PSAwKSB7CiAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IHByaW1hcnlPdXRwdXQgPSBvdXRwdXRzLmdldFByaW1hcnlPdXRwdXQoKTsKLSAgICAgICAgICAgIGF2YWlsYWJsZURldmljZVR5cGVzID0KLSAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tSHdNb2R1bGUocHJpbWFyeU91dHB1dC0+Z2V0TW9kdWxlSGFuZGxlKCkpCi0gICAgICAgICAgICAgICAgICAgICYgfkFVRElPX0RFVklDRV9CSVRfSU47CisgICAgICAgICAgICBhdmFpbGFibGVEZXZpY2VUeXBlcyA9IGF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VUeXBlc0Zyb21Id01vZHVsZSgKKyAgICAgICAgICAgICAgICAgICAgcHJpbWFyeU91dHB1dC0+Z2V0TW9kdWxlSGFuZGxlKCkpICYgfkFVRElPX0RFVklDRV9CSVRfSU47CiAgICAgICAgIH0KIAogICAgICAgICBzd2l0Y2ggKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcAppbmRleCAyM2NjMDJlLi41NTQ0ODIxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKQEAgLTM2LDYgKzM2LDggQEAKIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lFbmdpbmVJbnN0YW5jZS5oPgpAQCAtNDMsMTQgKzQ1LDExIEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oPgorI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgogI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDxhdWRpb19wb2xpY3lfY29uZi5oPgogI2luY2x1ZGUgIkF1ZGlvUG9saWN5TWFuYWdlci5oIgotI2lmbmRlZiBVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GCi0jaW5jbHVkZSA8Q29uZmlnUGFyc2luZ1V0aWxzLmg+Ci0jaW5jbHVkZSA8U3RyZWFtRGVzY3JpcHRvci5oPgotI2VuZGlmCiAjaW5jbHVkZSA8U2VyaWFsaXplci5oPgogI2luY2x1ZGUgIlR5cGVDb252ZXJ0ZXIuaCIKICNpbmNsdWRlIDxwb2xpY3kuaD4KQEAgLTY1LDI1ICs2NCwxNSBAQAogLy8gbWVkaWEgLyBub3RpZmljYXRpb24gLyBzeXN0ZW0gdm9sdW1lLgogY29uc3RleHByIGZsb2F0IElOX0NBTExfRUFSUElFQ0VfSEVBRFJPT01fREIgPSAzLmY7CiAKLSNkZWZpbmUgQVJSQVlfU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKChhKVswXSkpCi0vLyBBcnJheSBvZiBhbGwgc3Vycm91bmQgZm9ybWF0cy4KLXN0YXRpYyBjb25zdCBhdWRpb19mb3JtYXRfdCBTVVJST1VORF9GT1JNQVRTW10gPSB7Ci0gICAgQVVESU9fRk9STUFUX0FDMywKLSAgICBBVURJT19GT1JNQVRfRV9BQzMsCi0gICAgQVVESU9fRk9STUFUX0RUUywKLSAgICBBVURJT19GT1JNQVRfRFRTX0hELAotICAgIEFVRElPX0ZPUk1BVF9BQUNfTEMsCi0gICAgQVVESU9fRk9STUFUX0RPTEJZX1RSVUVIRCwKLSAgICBBVURJT19GT1JNQVRfRV9BQzNfSk9DLAotfTsKLS8vIEFycmF5IG9mIGFsbCBBQUMgZm9ybWF0cy4gV2hlbiBBQUMgaXMgZW5hYmxlZCBieSB1c2VycywgYWxsIEFBQyBmb3JtYXRzIHNob3VsZCBiZSBlbmFibGVkLgotc3RhdGljIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IEFBQ19GT1JNQVRTW10gPSB7Ci0gICAgQVVESU9fRk9STUFUX0FBQ19MQywKLSAgICBBVURJT19GT1JNQVRfQUFDX0hFX1YxLAotICAgIEFVRElPX0ZPUk1BVF9BQUNfSEVfVjIsCi0gICAgQVVESU9fRk9STUFUX0FBQ19FTEQsCi0gICAgQVVESU9fRk9STUFUX0FBQ19YSEUsCi19OworLy8gQ29tcHJlc3NlZCBmb3JtYXRzIGZvciBNU0QgbW9kdWxlLCBvcmRlcmVkIGZyb20gbW9zdCBwcmVmZXJyZWQgdG8gbGVhc3QgcHJlZmVycmVkLgorc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiBjb21wcmVzc2VkRm9ybWF0c09yZGVyID0ge3sKKyAgICAgICAgQVVESU9fRk9STUFUX01BVF8yXzEsIEFVRElPX0ZPUk1BVF9NQVRfMl8wLCBBVURJT19GT1JNQVRfRV9BQzMsCisgICAgICAgIEFVRElPX0ZPUk1BVF9BQzMsIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIH19OworLy8gQ2hhbm5lbCBtYXNrcyBmb3IgTVNEIG1vZHVsZSwgM0QgPiAyRCA+IDFEIG9yZGVyaW5nIChtb3N0IHByZWZlcnJlZCB0byBsZWFzdCBwcmVmZXJyZWQpLgorc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPGF1ZGlvX2NoYW5uZWxfbWFza190PiBzdXJyb3VuZENoYW5uZWxNYXNrc09yZGVyID0ge3sKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMVBPSU5UMiwgQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMFBPSU5UMiwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMVBPSU5UMiwgQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMFBPSU5UMiwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIH19OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBBdWRpb1BvbGljeUludGVyZmFjZSBpbXBsZW1lbnRhdGlvbgpAQCAtMTYwLDEzICsxNDksMTMgQEAKIAogICAgICAgICAgICAgLy8gQmVmb3JlIGNoZWNraW5nIG91dHB1dHMsIGJyb2FkY2FzdCBjb25uZWN0IGV2ZW50IHRvIGFsbG93IEhBTCB0byByZXRyaWV2ZSBkeW5hbWljCiAgICAgICAgICAgICAvLyBwYXJhbWV0ZXJzIG9uIG5ld2x5IGNvbm5lY3RlZCBkZXZpY2VzIChpbnN0ZWFkIG9mIG9wZW5pbmcgdGhlIG91dHB1dHMuLi4pCi0gICAgICAgICAgICBicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSwgZGV2RGVzYy0+bUFkZHJlc3MpOworICAgICAgICAgICAgYnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUsIGRldkRlc2MtPmFkZHJlc3MoKSk7CiAKLSAgICAgICAgICAgIGlmIChjaGVja091dHB1dHNGb3JEZXZpY2UoZGV2RGVzYywgc3RhdGUsIG91dHB1dHMsIGRldkRlc2MtPm1BZGRyZXNzKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgaWYgKGNoZWNrT3V0cHV0c0ZvckRldmljZShkZXZEZXNjLCBzdGF0ZSwgb3V0cHV0cywgZGV2RGVzYy0+YWRkcmVzcygpKSAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShkZXZEZXNjKTsKIAogICAgICAgICAgICAgICAgIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPm1BZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+YWRkcmVzcygpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBQcm9wYWdhdGUgZGV2aWNlIGF2YWlsYWJpbGl0eSB0byBFbmdpbmUKQEAgLTE4OSwxMiArMTc4LDEyIEBACiAgICAgICAgICAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGlzY29ubmVjdGluZyBvdXRwdXQgZGV2aWNlICV4IiwgZGV2aWNlKTsKIAogICAgICAgICAgICAgLy8gU2VuZCBEaXNjb25uZWN0IHRvIEhBTHMKLSAgICAgICAgICAgIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlLCBkZXZEZXNjLT5tQWRkcmVzcyk7CisgICAgICAgICAgICBicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSwgZGV2RGVzYy0+YWRkcmVzcygpKTsKIAogICAgICAgICAgICAgLy8gcmVtb3ZlIGRldmljZSBmcm9tIGF2YWlsYWJsZSBvdXRwdXQgZGV2aWNlcwogICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMucmVtb3ZlKGRldkRlc2MpOwogCi0gICAgICAgICAgICBjaGVja091dHB1dHNGb3JEZXZpY2UoZGV2RGVzYywgc3RhdGUsIG91dHB1dHMsIGRldkRlc2MtPm1BZGRyZXNzKTsKKyAgICAgICAgICAgIGNoZWNrT3V0cHV0c0ZvckRldmljZShkZXZEZXNjLCBzdGF0ZSwgb3V0cHV0cywgZGV2RGVzYy0+YWRkcmVzcygpKTsKIAogICAgICAgICAgICAgLy8gUHJvcGFnYXRlIGRldmljZSBhdmFpbGFiaWxpdHkgdG8gRW5naW5lCiAgICAgICAgICAgICBtRW5naW5lLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2RGVzYywgc3RhdGUpOwpAQCAtMjA1LDMxICsxOTQsMzEgQEAKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBjaGVja0EyZHBTdXNwZW5kIG11c3QgcnVuIGJlZm9yZSBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMgc28gdGhhdCBBMkRQCi0gICAgICAgIC8vIG91dHB1dCBpcyBzdXNwZW5kZWQgYmVmb3JlIGFueSB0cmFja3MgYXJlIG1vdmVkIHRvIGl0Ci0gICAgICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKLSAgICAgICAgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCk7Ci0gICAgICAgIC8vIG91dHB1dHMgbXVzdCBiZSBjbG9zZWQgYWZ0ZXIgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkgaXMgZXhlY3V0ZWQKLSAgICAgICAgaWYgKCFvdXRwdXRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZm9yIChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgOiBvdXRwdXRzKSB7Ci0gICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwotICAgICAgICAgICAgICAgIC8vIGNsb3NlIHVudXNlZCBvdXRwdXRzIGFmdGVyIGRldmljZSBkaXNjb25uZWN0aW9uIG9yIGRpcmVjdCBvdXRwdXRzIHRoYXQgaGF2ZSBiZWVuCi0gICAgICAgICAgICAgICAgLy8gb3BlbmVkIGJ5IGNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHRvIHF1ZXJ5IGR5bmFtaWMgcGFyYW1ldGVycwotICAgICAgICAgICAgICAgIGlmICgoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICgoKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgIT0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAoZGVzYy0+bURpcmVjdE9wZW5Db3VudCA9PSAwKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2VPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgY2hlY2tGb3JEZXZpY2VBbmRPdXRwdXRDaGFuZ2VzKFsmXSgpIHsKKyAgICAgICAgICAgIC8vIG91dHB1dHMgbXVzdCBiZSBjbG9zZWQgYWZ0ZXIgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkgaXMgZXhlY3V0ZWQKKyAgICAgICAgICAgIGlmICghb3V0cHV0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA6IG91dHB1dHMpIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAvLyBjbG9zZSB1bnVzZWQgb3V0cHV0cyBhZnRlciBkZXZpY2UgZGlzY29ubmVjdGlvbiBvciBkaXJlY3Qgb3V0cHV0cyB0aGF0IGhhdmUgYmVlbgorICAgICAgICAgICAgICAgICAgICAvLyBvcGVuZWQgYnkgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgdG8gcXVlcnkgZHluYW1pYyBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgICAgIGlmICgoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICE9IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjLT5tRGlyZWN0T3BlbkNvdW50ID09IDApKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBjaGVjayBBMkRQIGFnYWluIGFmdGVyIGNsb3NpbmcgQTJEUCBvdXRwdXQgdG8gcmVzZXQgbUEyZHBTdXNwZW5kZWQgaWYgbmVlZGVkCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBjaGVjayBhZ2FpbiBhZnRlciBjbG9zaW5nIEEyRFAgb3V0cHV0IHRvIHJlc2V0IG1BMmRwU3VzcGVuZGVkIGlmIG5lZWRlZAotICAgICAgICAgICAgY2hlY2tBMmRwU3VzcGVuZCgpOwotICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0pOwogCi0gICAgICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CiAgICAgICAgIGlmIChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkgPT0gQVVESU9fTU9ERV9JTl9DQUxMICYmIGhhc1ByaW1hcnlPdXRwdXQoKSkgewogICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CiAgICAgICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhuZXdEZXZpY2UpOwogICAgICAgICB9CisgICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCBtc2RPdXREZXZpY2UgPSBnZXRNb2R1bGVEZXZpY2VUeXBlcygKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKICAgICAgICAgICAgIGlmICgobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpICE9IEFVRElPX01PREVfSU5fQ0FMTCkgfHwgKGRlc2MgIT0gbVByaW1hcnlPdXRwdXQpKSB7CkBAIC0yMzcsNyArMjI2LDggQEAKICAgICAgICAgICAgICAgICAvLyBkbyBub3QgZm9yY2UgZGV2aWNlIGNoYW5nZSBvbiBkdXBsaWNhdGVkIG91dHB1dCBiZWNhdXNlIGlmIGRldmljZSBpcyAwLCBpdCB3aWxsCiAgICAgICAgICAgICAgICAgLy8gYWxzbyBmb3JjZSBhIGRldmljZSAwIGZvciB0aGUgdHdvIG91dHB1dHMgaXQgaXMgZHVwbGljYXRlZCB0byB3aGljaCBtYXkgb3ZlcnJpZGUKICAgICAgICAgICAgICAgICAvLyBhIHZhbGlkIGRldmljZSBzZWxlY3Rpb24gb24gdGhvc2Ugb3V0cHV0cy4KLSAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gIWRlc2MtPmlzRHVwbGljYXRlZCgpCisgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSA9IChtc2RPdXREZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUgfHwgbXNkT3V0RGV2aWNlICE9IGRlc2MtPmRldmljZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWRlc2MtPmlzRHVwbGljYXRlZCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoIWRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHdheXMgZm9yY2Ugd2hlbiBkaXNjb25uZWN0aW5nIChhIG5vbi1kdXBsaWNhdGVkIGRldmljZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpKTsKQEAgLTI3NSwxMSArMjY1LDExIEBACiAKICAgICAgICAgICAgIC8vIEJlZm9yZSBjaGVja2luZyBpbnRwdXRzLCBicm9hZGNhc3QgY29ubmVjdCBldmVudCB0byBhbGxvdyBIQUwgdG8gcmV0cmlldmUgZHluYW1pYwogICAgICAgICAgICAgLy8gcGFyYW1ldGVycyBvbiBuZXdseSBjb25uZWN0ZWQgZGV2aWNlcyAoaW5zdGVhZCBvZiBvcGVuaW5nIHRoZSBpbnB1dHMuLi4pCi0gICAgICAgICAgICBicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSwgZGV2RGVzYy0+bUFkZHJlc3MpOworICAgICAgICAgICAgYnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUsIGRldkRlc2MtPmFkZHJlc3MoKSk7CiAKLSAgICAgICAgICAgIGlmIChjaGVja0lucHV0c0ZvckRldmljZShkZXZEZXNjLCBzdGF0ZSwgaW5wdXRzLCBkZXZEZXNjLT5tQWRkcmVzcykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGlmIChjaGVja0lucHV0c0ZvckRldmljZShkZXZEZXNjLCBzdGF0ZSwgaW5wdXRzLCBkZXZEZXNjLT5hZGRyZXNzKCkpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgYnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+bUFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5hZGRyZXNzKCkpOwogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KIApAQCAtMzA0LDkgKzI5NCw5IEBACiAgICAgICAgICAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGlzY29ubmVjdGluZyBpbnB1dCBkZXZpY2UgJXgiLCBkZXZpY2UpOwogCiAgICAgICAgICAgICAvLyBTZXQgRGlzY29ubmVjdCB0byBIQUxzCi0gICAgICAgICAgICBicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSwgZGV2RGVzYy0+bUFkZHJlc3MpOworICAgICAgICAgICAgYnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUsIGRldkRlc2MtPmFkZHJlc3MoKSk7CiAKLSAgICAgICAgICAgIGNoZWNrSW5wdXRzRm9yRGV2aWNlKGRldkRlc2MsIHN0YXRlLCBpbnB1dHMsIGRldkRlc2MtPm1BZGRyZXNzKTsKKyAgICAgICAgICAgIGNoZWNrSW5wdXRzRm9yRGV2aWNlKGRldkRlc2MsIHN0YXRlLCBpbnB1dHMsIGRldkRlc2MtPmFkZHJlc3MoKSk7CiAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnJlbW92ZShkZXZEZXNjKTsKIAogICAgICAgICAgICAgLy8gUHJvcGFnYXRlIGRldmljZSBhdmFpbGFiaWxpdHkgdG8gRW5naW5lCkBAIC00ODEsMzMgKzQ3MSwyNiBAQAogCiBzcDxBdWRpb1BhdGNoPiBBdWRpb1BvbGljeU1hbmFnZXI6OmNyZWF0ZVRlbGVwaG9ueVBhdGNoKAogICAgICAgICBib29sIGlzUngsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIHVpbnQzMl90IGRlbGF5TXMpIHsKLSAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2g7Ci0gICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOwotICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7CisgICAgUGF0Y2hCdWlsZGVyIHBhdGNoQnVpbGRlcjsKIAogICAgIHNwPERldmljZURlc2NyaXB0b3I+IHR4U291cmNlRGV2aWNlRGVzYzsKICAgICBpZiAoaXNSeCkgewotICAgICAgICBmaWxsQXVkaW9Qb3J0Q29uZmlnRm9yRGV2aWNlKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLCBkZXZpY2UsICZwYXRjaC5zaW5rc1swXSk7Ci0gICAgICAgIGZpbGxBdWRpb1BvcnRDb25maWdGb3JEZXZpY2UoCi0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcywgQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCwgJnBhdGNoLnNvdXJjZXNbMF0pOworICAgICAgICBwYXRjaEJ1aWxkZXIuYWRkU2luayhmaW5kRGV2aWNlKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLCBkZXZpY2UpKS4KKyAgICAgICAgICAgICAgICBhZGRTb3VyY2UoZmluZERldmljZShtQXZhaWxhYmxlSW5wdXREZXZpY2VzLCBBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgdHhTb3VyY2VEZXZpY2VEZXNjID0gZmlsbEF1ZGlvUG9ydENvbmZpZ0ZvckRldmljZSgKLSAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLCBkZXZpY2UsICZwYXRjaC5zb3VyY2VzWzBdKTsKLSAgICAgICAgZmlsbEF1ZGlvUG9ydENvbmZpZ0ZvckRldmljZSgKLSAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgsICZwYXRjaC5zaW5rc1swXSk7CisgICAgICAgIHBhdGNoQnVpbGRlci5hZGRTb3VyY2UodHhTb3VyY2VEZXZpY2VEZXNjID0gZmluZERldmljZShtQXZhaWxhYmxlSW5wdXREZXZpY2VzLCBkZXZpY2UpKS4KKyAgICAgICAgICAgICAgICBhZGRTaW5rKGZpbmREZXZpY2UobUF2YWlsYWJsZU91dHB1dERldmljZXMsIEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYKSk7CiAgICAgfQogCiAgICAgYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZSA9IGlzUnggPyBkZXZpY2UgOiBBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWDsKICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKG91dHB1dERldmljZSwgbU91dHB1dHMpOwotICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHNlbGVjdE91dHB1dChvdXRwdXRzLCBBVURJT19PVVRQVVRfRkxBR19OT05FLCBBVURJT19GT1JNQVRfSU5WQUxJRCk7CisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMpOwogICAgIC8vIHJlcXVlc3QgdG8gcmV1c2UgZXhpc3Rpbmcgb3V0cHV0IHN0cmVhbSBpZiBvbmUgaXMgYWxyZWFkeSBvcGVuZWQgdG8gcmVhY2ggdGhlIHRhcmdldCBkZXZpY2UKICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CiAgICAgICAgIEFMT0dfQVNTRVJUKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSwKICAgICAgICAgICAgICAgICAiJXMoKSAlI3ggZGV2aWNlIG91dHB1dCAlZCBpcyBkdXBsaWNhdGVkIiwgX19mdW5jX18sIG91dHB1dERldmljZSwgb3V0cHV0KTsKLSAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMV0pOwotICAgICAgICBwYXRjaC5zb3VyY2VzWzFdLmV4dC5taXgudXNlY2FzZS5zdHJlYW0gPSBBVURJT19TVFJFQU1fUEFUQ0g7Ci0gICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMjsKKyAgICAgICAgcGF0Y2hCdWlsZGVyLmFkZFNvdXJjZShvdXRwdXREZXNjLCB7IC5zdHJlYW0gPSBBVURJT19TVFJFQU1fUEFUQ0ggfSk7CiAgICAgfQogCiAgICAgaWYgKCFpc1J4KSB7CkBAIC01MTcsMzggKzUwMCw0OSBAQAogICAgICAgICAvLyBzeW1tZXRyaWMgdG8gdGhlIG9uZSBpbiBzdGFydElucHV0KCkKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhY3RpdmVEZXNjIDogbUlucHV0cy5nZXRBY3RpdmVJbnB1dHMoKSkgewogICAgICAgICAgICAgaWYgKGFjdGl2ZURlc2MtPmhhc1NhbWVId01vZHVsZUFzKHR4U291cmNlRGV2aWNlRGVzYykpIHsKLSAgICAgICAgICAgICAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uIGFjdGl2ZVNlc3Npb25zID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZURlc2MtPmdldEF1ZGlvU2Vzc2lvbnModHJ1ZSAvKmFjdGl2ZU9ubHkqLyk7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBhY3RpdmVTZXNzaW9ucy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgYWN0aXZlU2Vzc2lvbiA9IGFjdGl2ZVNlc3Npb25zLmtleUF0KGopOwotICAgICAgICAgICAgICAgICAgICBzdG9wSW5wdXQoYWN0aXZlRGVzYy0+bUlvSGFuZGxlLCBhY3RpdmVTZXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUlucHV0KGFjdGl2ZURlc2MtPm1Jb0hhbmRsZSwgYWN0aXZlU2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNsb3NlQWN0aXZlQ2xpZW50cyhhY3RpdmVEZXNjKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAogICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsICZhZlBhdGNoSGFuZGxlLCBkZWxheU1zKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgKKyAgICAgICAgICAgIHBhdGNoQnVpbGRlci5wYXRjaCgpLCAmYWZQYXRjaEhhbmRsZSwgZGVsYXlNcyk7CiAgICAgQUxPR1dfSUYoc3RhdHVzICE9IE5PX0VSUk9SLAogICAgICAgICAgICAgIiVzKCkgZXJyb3IgJWQgY3JlYXRpbmcgJXMgYXVkaW8gcGF0Y2giLCBfX2Z1bmNfXywgc3RhdHVzLCBpc1J4ID8gIlJYIiA6ICJUWCIpOwogICAgIHNwPEF1ZGlvUGF0Y2g+IGF1ZGlvUGF0Y2g7CiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICBhdWRpb1BhdGNoID0gbmV3IEF1ZGlvUGF0Y2goJnBhdGNoLCBtVWlkQ2FjaGVkKTsKKyAgICAgICAgYXVkaW9QYXRjaCA9IG5ldyBBdWRpb1BhdGNoKHBhdGNoQnVpbGRlci5wYXRjaCgpLCBtVWlkQ2FjaGVkKTsKICAgICAgICAgYXVkaW9QYXRjaC0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOwogICAgICAgICBhdWRpb1BhdGNoLT5tVWlkID0gbVVpZENhY2hlZDsKICAgICB9CiAgICAgcmV0dXJuIGF1ZGlvUGF0Y2g7CiB9CiAKLXNwPERldmljZURlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWFuYWdlcjo6ZmlsbEF1ZGlvUG9ydENvbmZpZ0ZvckRldmljZSgKLSAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSB7Ci0gICAgRGV2aWNlVmVjdG9yIGRldmljZUxpc3QgPSBkZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOworc3A8RGV2aWNlRGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpmaW5kRGV2aWNlKAorICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0IHsKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9IGRldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlTWFzayhkZXZpY2UpOwogICAgIEFMT0dfQVNTRVJUKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSwKICAgICAgICAgICAgICIlcygpIHNlbGVjdGVkIGRldmljZSB0eXBlICUjeCBpcyBub3QgaW4gZGV2aWNlcyBsaXN0IiwgX19mdW5jX18sIGRldmljZSk7Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYyA9IGRldmljZUxpc3QuaXRlbUF0KDApOwotICAgIGRldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7Ci0gICAgcmV0dXJuIGRldmljZURlc2M7CisgICAgcmV0dXJuIGRldmljZUxpc3QuaXRlbUF0KDApOworfQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRNb2R1bGVEZXZpY2VUeXBlcygKKyAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzLCBjb25zdCBjaGFyICptb2R1bGVJZCkgY29uc3QgeworICAgIHNwPEh3TW9kdWxlPiBtb2QgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKG1vZHVsZUlkKTsKKyAgICByZXR1cm4gbW9kICE9IDAgPyBkZXZpY2VzLmdldERldmljZVR5cGVzRnJvbUh3TW9kdWxlKG1vZC0+Z2V0SGFuZGxlKCkpIDogQVVESU9fREVWSUNFX05PTkU7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc0RldmljZU9mTW9kdWxlKAorICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2RGVzYywgY29uc3QgY2hhciAqbW9kdWxlSWQpIGNvbnN0IHsKKyAgICBzcDxId01vZHVsZT4gbW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShtb2R1bGVJZCk7CisgICAgaWYgKG1vZHVsZSAhPSAwKSB7CisgICAgICAgIHJldHVybiBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbUh3TW9kdWxlKG1vZHVsZS0+Z2V0SGFuZGxlKCkpCisgICAgICAgICAgICAgICAgLmluZGV4T2YoZGV2RGVzYykgIT0gTkFNRV9OT1RfRk9VTkQKKyAgICAgICAgICAgICAgICB8fCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tSHdNb2R1bGUobW9kdWxlLT5nZXRIYW5kbGUoKSkKKyAgICAgICAgICAgICAgICAuaW5kZXhPZihkZXZEZXNjKSAhPSBOQU1FX05PVF9GT1VORDsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpCkBAIC01NjIsMTQgKzU1Niw4IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgLy8vIE9wZW5zOiBjYW4gdGhlc2UgbGluZSBiZSBleGVjdXRlZCBhZnRlciB0aGUgc3dpdGNoIG9mIHZvbHVtZSBjdXJ2ZXM/Pz8KLSAgICAvLyBpZiBsZWF2aW5nIGNhbGwgc3RhdGUsIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgYWN0aXZlIHN0cmVhbXMKLSAgICAvLyBwZXJ0YWluaW5nIHRvIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBzZWUgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkKICAgICBpZiAoaXNTdGF0ZUluQ2FsbChvbGRTdGF0ZSkpIHsKICAgICAgICAgQUxPR1YoInNldFBob25lU3RhdGUoKSBpbiBjYWxsIHN0YXRlIG1hbmFnZW1lbnQ6IG5ldyBzdGF0ZSBpcyAlZCIsIHN0YXRlKTsKLSAgICAgICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBzdHJlYW0rKykgewotICAgICAgICAgICAgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwgZmFsc2UsIHRydWUpOwotICAgICAgICB9Ci0KICAgICAgICAgLy8gZm9yY2UgcmVldmFsdWF0aW5nIGFjY2Vzc2liaWxpdHkgcm91dGluZyB3aGVuIGNhbGwgc3RvcHMKICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkpOwogICAgIH0KQEAgLTU4Miw5ICs1NzAsNyBAQAogICAgICAgICAgICAgICAgICAgfHwgKGlzX3N0YXRlX2luX2NhbGwoc3RhdGUpICYmIChzdGF0ZSAhPSBvbGRTdGF0ZSkpKTsKIAogICAgIC8vIGNoZWNrIGZvciBkZXZpY2UgYW5kIG91dHB1dCBjaGFuZ2VzIHRyaWdnZXJlZCBieSBuZXcgcGhvbmUgc3RhdGUKLSAgICBjaGVja0EyZHBTdXNwZW5kKCk7Ci0gICAgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCk7Ci0gICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKKyAgICBjaGVja0ZvckRldmljZUFuZE91dHB1dENoYW5nZXMoKTsKIAogICAgIGludCBkZWxheU1zID0gMDsKICAgICBpZiAoaXNTdGF0ZUluQ2FsbChzdGF0ZSkpIHsKQEAgLTY0OCwxNCArNjM0LDggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIGlmIGVudGVyaW5nIGluIGNhbGwgc3RhdGUsIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgYWN0aXZlIHN0cmVhbXMKLSAgICAvLyBwZXJ0YWluaW5nIHRvIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBzZWUgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkKICAgICBpZiAoaXNTdGF0ZUluQ2FsbChzdGF0ZSkpIHsKICAgICAgICAgQUxPR1YoInNldFBob25lU3RhdGUoKSBpbiBjYWxsIHN0YXRlIG1hbmFnZW1lbnQ6IG5ldyBzdGF0ZSBpcyAlZCIsIHN0YXRlKTsKLSAgICAgICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBzdHJlYW0rKykgewotICAgICAgICAgICAgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIH0KLQogICAgICAgICAvLyBmb3JjZSByZWV2YWx1YXRpbmcgYWNjZXNzaWJpbGl0eSByb3V0aW5nIHdoZW4gY2FsbCBzdGFydHMKICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkpOwogICAgIH0KQEAgLTY5MCw5ICs2NzAsNyBAQAogICAgICAgICAgICAgKHVzYWdlID09IEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKTsKIAogICAgIC8vIGNoZWNrIGZvciBkZXZpY2UgYW5kIG91dHB1dCBjaGFuZ2VzIHRyaWdnZXJlZCBieSBuZXcgZm9yY2UgdXNhZ2UKLSAgICBjaGVja0EyZHBTdXNwZW5kKCk7Ci0gICAgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCk7Ci0gICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKKyAgICBjaGVja0ZvckRldmljZUFuZE91dHB1dENoYW5nZXMoKTsKIAogICAgIC8vRklYTUU6IHdvcmthcm91bmQgZm9yIHRydW5jYXRlZCB0b3VjaCBzb3VuZHMKICAgICAvLyB0byBiZSByZW1vdmVkIHdoZW4gdGhlIHByb2JsZW0gaXMgaGFuZGxlZCBieSBzeXN0ZW0gVUkKQEAgLTczNCwyMiArNzEyLDI1IEBACiAgICAgQUxPR1YoInNldFN5c3RlbVByb3BlcnR5KCkgcHJvcGVydHkgJXMsIHZhbHVlICVzIiwgcHJvcGVydHksIHZhbHVlKTsKIH0KIAotLy8gRmluZCBhIGRpcmVjdCBvdXRwdXQgcHJvZmlsZSBjb21wYXRpYmxlIHdpdGggdGhlIHBhcmFtZXRlcnMgcGFzc2VkLCBldmVuIGlmIHRoZSBpbnB1dCBmbGFncyBkbwotLy8gbm90IGV4cGxpY2l0bHkgcmVxdWVzdCBhIGRpcmVjdCBvdXRwdXQKLXNwPElPUHJvZmlsZT4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRQcm9maWxlRm9yRGlyZWN0T3V0cHV0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCisvLyBGaW5kIGFuIG91dHB1dCBwcm9maWxlIGNvbXBhdGlibGUgd2l0aCB0aGUgcGFyYW1ldGVycyBwYXNzZWQuIFdoZW4gImRpcmVjdE9ubHkiIGlzIHNldCwgcmVzdHJpY3QKKy8vIHNlYXJjaCB0byBwcm9maWxlcyBmb3IgZGlyZWN0IG91dHB1dHMuCitzcDxJT1Byb2ZpbGU+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0UHJvZmlsZUZvck91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkaXJlY3RPbmx5KQogewotICAgIC8vIG9ubHkgcmV0YWluIGZsYWdzIHRoYXQgd2lsbCBkcml2ZSB0aGUgZGlyZWN0IG91dHB1dCBwcm9maWxlIHNlbGVjdGlvbgotICAgIC8vIGlmIGV4cGxpY2l0bHkgcmVxdWVzdGVkCi0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtSZWxldmFudEZsYWdzID0KLSAgICAgICAgICAgIChBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DIHwgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCB8Ci0gICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfVk9JUF9SWCk7Ci0gICAgZmxhZ3MgPQotICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKChmbGFncyAmIGtSZWxldmFudEZsYWdzKSB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgaWYgKGRpcmVjdE9ubHkpIHsKKyAgICAgICAgLy8gb25seSByZXRhaW4gZmxhZ3MgdGhhdCB3aWxsIGRyaXZlIHRoZSBkaXJlY3Qgb3V0cHV0IHByb2ZpbGUgc2VsZWN0aW9uCisgICAgICAgIC8vIGlmIGV4cGxpY2l0bHkgcmVxdWVzdGVkCisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrUmVsZXZhbnRGbGFncyA9CisgICAgICAgICAgICAgICAgKEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMgfCBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEIHwKKyAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfVk9JUF9SWCk7CisgICAgICAgIGZsYWdzID0KKyAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoKGZsYWdzICYga1JlbGV2YW50RmxhZ3MpIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICB9CiAKICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGU7CiAKQEAgLTc2Niw3ICs3NDcsOSBAQAogICAgICAgICAgICAgaWYgKChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpICYgY3VyUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlc1R5cGUoKSkgPT0gMCkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gaWYgc2V2ZXJhbCBwcm9maWxlcyBhcmUgY29tcGF0aWJsZSwgZ2l2ZSBwcmlvcml0eSB0byBvbmUgd2l0aCBvZmZsb2FkIGNhcGFiaWxpdHkKKyAgICAgICAgICAgIGlmICghZGlyZWN0T25seSkgcmV0dXJuIGN1clByb2ZpbGU7CisgICAgICAgICAgICAvLyB3aGVuIHNlYXJjaGluZyBmb3IgZGlyZWN0IG91dHB1dHMsIGlmIHNldmVyYWwgcHJvZmlsZXMgYXJlIGNvbXBhdGlibGUsIGdpdmUgcHJpb3JpdHkKKyAgICAgICAgICAgIC8vIHRvIG9uZSB3aXRoIG9mZmxvYWQgY2FwYWJpbGl0eQogICAgICAgICAgICAgaWYgKHByb2ZpbGUgIT0gMCAmJiAoKGN1clByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSA9PSAwKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQpAQCAtNzkxLDEyICs3NzQsMTQ5IEBACiAgICAgLy8gYW5kIEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRTYW1wbGluZ1JhdGUoKS4KIAogICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2UoZGV2aWNlLCBtT3V0cHV0cyk7Ci0gICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsIEFVRElPX0ZPUk1BVF9JTlZBTElEKTsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cyk7CiAKICAgICBBTE9HVigiZ2V0T3V0cHV0KCkgc3RyZWFtICVkIHNlbGVjdGVkIGRldmljZSAlMDh4LCBvdXRwdXQgJWQiLCBzdHJlYW0sIGRldmljZSwgb3V0cHV0KTsKICAgICByZXR1cm4gb3V0cHV0OwogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEF1ZGlvQXR0cmlidXRlcyhhdWRpb19hdHRyaWJ1dGVzX3QgKmRzdEF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKnNyY0F0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHNyY1N0cmVhbSkKK3sKKyAgICBpZiAoc3JjQXR0ciAhPSBOVUxMKSB7CisgICAgICAgIGlmICghaXNWYWxpZEF0dHJpYnV0ZXMoc3JjQXR0cikpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBpbnZhbGlkIGF0dHJpYnV0ZXM6IHVzYWdlPSVkIGNvbnRlbnQ9JWQgZmxhZ3M9MHgleCB0YWdzPVslc10iLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgICAgc3JjQXR0ci0+dXNhZ2UsIHNyY0F0dHItPmNvbnRlbnRfdHlwZSwgc3JjQXR0ci0+ZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIHNyY0F0dHItPnRhZ3MpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICAqZHN0QXR0ciA9ICpzcmNBdHRyOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzcmNTdHJlYW0gPCBBVURJT19TVFJFQU1fTUlOIHx8IHNyY1N0cmVhbSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiAgaW52YWxpZCBzdHJlYW0gdHlwZSIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgc3RyZWFtX3R5cGVfdG9fYXVkaW9fYXR0cmlidXRlcyhzcmNTdHJlYW0sIGRzdEF0dHIpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0Rm9yQXR0ckludChhdWRpb19hdHRyaWJ1dGVzX3QgKnJlc3VsdEF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkKQoreworICAgIERldmljZVZlY3RvciBvdXRwdXREZXZpY2VzOworICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3k7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZTsKKyAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IHJlcXVlc3RlZERldmljZUlkID0gKnNlbGVjdGVkRGV2aWNlSWQ7CisgICAgYXVkaW9fZGV2aWNlc190IG1zZERldmljZSA9CisgICAgICAgICAgICBnZXRNb2R1bGVEZXZpY2VUeXBlcyhtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCk7CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRBdWRpb0F0dHJpYnV0ZXMocmVzdWx0QXR0ciwgYXR0ciwgKnN0cmVhbSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIEFMT0dWKCIlcyB1c2FnZT0lZCwgY29udGVudD0lZCwgdGFnPSVzIGZsYWdzPSUwOHgiCisgICAgICAgICAgIiBzZXNzaW9uICVkIHNlbGVjdGVkRGV2aWNlSWQgJWQiLAorICAgICAgICAgIF9fZnVuY19fLAorICAgICAgICAgIHJlc3VsdEF0dHItPnVzYWdlLCByZXN1bHRBdHRyLT5jb250ZW50X3R5cGUsIHJlc3VsdEF0dHItPnRhZ3MsIHJlc3VsdEF0dHItPmZsYWdzLAorICAgICAgICAgIHNlc3Npb24sIHJlcXVlc3RlZERldmljZUlkKTsKKworICAgICpzdHJlYW0gPSBzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQocmVzdWx0QXR0cik7CisKKyAgICBzdHJhdGVneSA9IGdldFN0cmF0ZWd5Rm9yQXR0cihyZXN1bHRBdHRyKTsKKworICAgIC8vIEZpcnN0IGNoZWNrIGZvciBleHBsaWNpdCByb3V0aW5nIChlZy4gc2V0UHJlZmVycmVkRGV2aWNlKQorICAgIGlmIChyZXF1ZXN0ZWREZXZpY2VJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2MgPQorICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHJlcXVlc3RlZERldmljZUlkKTsKKyAgICAgICAgZGV2aWNlID0gZGV2aWNlRGVzYy0+dHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIElmIG5vIGV4cGxpY3Qgcm91dGUsIGlzIHRoZXJlIGEgbWF0Y2hpbmcgZHluYW1pYyBwb2xpY3kgdGhhdCBhcHBsaWVzPworICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYzsKKyAgICAgICAgaWYgKG1Qb2xpY3lNaXhlcy5nZXRPdXRwdXRGb3JBdHRyKCpyZXN1bHRBdHRyLCB1aWQsIGRlc2MpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HX0FTU0VSVChkZXNjICE9IDAsICJJbnZhbGlkIGRlc2MgcmV0dXJuZWQgYnkgZ2V0T3V0cHV0Rm9yQXR0ciIpOworICAgICAgICAgICAgaWYgKCFhdWRpb19oYXNfcHJvcG9ydGlvbmFsX2ZyYW1lcyhjb25maWctPmZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnN0cmVhbSA9IHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludChyZXN1bHRBdHRyKTsKKyAgICAgICAgICAgICpvdXRwdXQgPSBkZXNjLT5tSW9IYW5kbGU7CisgICAgICAgICAgICBBdWRpb01peCAqbWl4ID0gZGVzYy0+bVBvbGljeU1peDsKKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2MgPQorICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZShtaXgtPm1EZXZpY2VUeXBlLCBtaXgtPm1EZXZpY2VBZGRyZXNzKTsKKyAgICAgICAgICAgICpzZWxlY3RlZERldmljZUlkID0gZGV2aWNlRGVzYyAhPSAwID8gZGV2aWNlRGVzYy0+Z2V0SWQoKSA6IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgICAgICAgICBBTE9HVigiJXMgcmV0dXJucyBvdXRwdXQgJWQiLCBfX2Z1bmNfXywgKm91dHB1dCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICAvLyBWaXJ0dWFsIHNvdXJjZXMgbXVzdCBhbHdheXMgYmUgZHluYW1pY2FseSBvciBleHBsaWNpdGx5IHJvdXRlZAorICAgICAgICBpZiAocmVzdWx0QXR0ci0+dXNhZ2UgPT0gQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0UpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcyBubyBwb2xpY3kgbWl4IGZvdW5kIGZvciB1c2FnZSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRSIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgIH0KKworICAgIGlmICgocmVzdWx0QXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX0hXX0FWX1NZTkMpICE9IDApIHsKKyAgICAgICAgKmZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSgqZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKTsKKyAgICB9CisKKyAgICAvLyBTZXQgaW5jYWxsIG11c2ljIG9ubHkgaWYgZGV2aWNlIHdhcyBleHBsaWNpdGx5IHNldCwgYW5kIGZhbGxiYWNrIHRvIHRoZSBkZXZpY2Ugd2hpY2ggaXMKKyAgICAvLyBjaG9zZW4gYnkgdGhlIGVuZ2luZSBpZiBub3QuCisgICAgLy8gRklYTUU6IHByb3ZpZGUgYSBtb3JlIGdlbmVyaWMgYXBwcm9hY2ggd2hpY2ggaXMgbm90IGRldmljZSBzcGVjaWZpYyBhbmQgbW92ZSB0aGlzIGJhY2sKKyAgICAvLyB0byBnZXRPdXRwdXRGb3JEZXZpY2UuCisgICAgLy8gVE9ETzogUmVtb3ZlIGNoZWNrIG9mIEFVRElPX1NUUkVBTV9NVVNJQyBvbmNlIG1pZ3JhdGlvbiBpcyBjb21wbGV0ZWQgb24gdGhlIGFwcCBzaWRlLgorICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFggJiYKKyAgICAgICAgKCpzdHJlYW0gPT0gQVVESU9fU1RSRUFNX01VU0lDIHx8IHJlc3VsdEF0dHItPnVzYWdlID09IEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT04pICYmCisgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oY29uZmlnLT5mb3JtYXQpICYmCisgICAgICAgIGlzSW5DYWxsKCkpIHsKKyAgICAgICAgaWYgKHJlcXVlc3RlZERldmljZUlkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICpmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdClBVURJT19PVVRQVVRfRkxBR19JTkNBTExfTVVTSUM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBHZXQgdGhlIGRldmNlIHR5cGUgZGlyZWN0bHkgZnJvbSB0aGUgZW5naW5lIHRvIGJ5cGFzcyBwcmVmZXJyZWQgcm91dGUgbG9naWMKKyAgICAgICAgICAgIGRldmljZSA9IG1FbmdpbmUtPmdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCIlcyBkZXZpY2UgMHgleCwgc2FtcGxpbmcgcmF0ZSAlZCwgZm9ybWF0ICUjeCwgY2hhbm5lbCBtYXNrICUjeCwgIgorICAgICAgICAgICJmbGFncyAlI3giLAorICAgICAgICAgIF9fZnVuY19fLCBkZXZpY2UsIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywgKmZsYWdzKTsKKworICAgICpvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICBpZiAobXNkRGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICpvdXRwdXQgPSBnZXRPdXRwdXRGb3JEZXZpY2UobXNkRGV2aWNlLCBzZXNzaW9uLCAqc3RyZWFtLCBjb25maWcsIGZsYWdzKTsKKyAgICAgICAgaWYgKCpvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUgJiYgc2V0TXNkUGF0Y2goZGV2aWNlKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR1YoIiVzKCkgVXNpbmcgTVNEIGRldmljZSAweCV4IGluc3RlYWQgb2YgZGV2aWNlIDB4JXgiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbXNkRGV2aWNlLCBkZXZpY2UpOworICAgICAgICAgICAgZGV2aWNlID0gbXNkRGV2aWNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKm91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICB9CisgICAgfQorICAgIGlmICgqb3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICpvdXRwdXQgPSBnZXRPdXRwdXRGb3JEZXZpY2UoZGV2aWNlLCBzZXNzaW9uLCAqc3RyZWFtLCBjb25maWcsIGZsYWdzKTsKKyAgICB9CisgICAgaWYgKCpvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIG91dHB1dERldmljZXMgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKGRldmljZSk7CisgICAgKnNlbGVjdGVkRGV2aWNlSWQgPSBnZXRGaXJzdERldmljZUlkKG91dHB1dERldmljZXMpOworCisgICAgQUxPR1YoIiVzIHJldHVybnMgb3V0cHV0ICVkIHNlbGVjdGVkRGV2aWNlSWQgJWQiLCBfX2Z1bmNfXywgKm91dHB1dCwgKnNlbGVjdGVkRGV2aWNlSWQpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCkBAIC04MDcsOTUgKzkyNywzMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKQogewotICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzOwotICAgIGlmIChhdHRyICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCFpc1ZhbGlkQXR0cmlidXRlcyhhdHRyKSkgewotICAgICAgICAgICAgQUxPR0UoImdldE91dHB1dEZvckF0dHIoKSBpbnZhbGlkIGF0dHJpYnV0ZXM6IHVzYWdlPSVkIGNvbnRlbnQ9JWQgZmxhZ3M9MHgleCB0YWdzPVslc10iLAotICAgICAgICAgICAgICAgICAgYXR0ci0+dXNhZ2UsIGF0dHItPmNvbnRlbnRfdHlwZSwgYXR0ci0+ZmxhZ3MsCi0gICAgICAgICAgICAgICAgICBhdHRyLT50YWdzKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgYXR0cmlidXRlcyA9ICphdHRyOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICgqc3RyZWFtIDwgQVVESU9fU1RSRUFNX01JTiB8fCAqc3RyZWFtID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0cigpOiAgaW52YWxpZCBzdHJlYW0gdHlwZSIpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBzdHJlYW1fdHlwZV90b19hdWRpb19hdHRyaWJ1dGVzKCpzdHJlYW0sICZhdHRyaWJ1dGVzKTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBjaGVjayBmb3IgZXhpc3RpbmcgY2xpZW50IGZvciB0aGlzIHBvcnQgSUQKLSAgICBpZiAoKnBvcnRJZCA9PSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICpwb3J0SWQgPSBBdWRpb1BvcnQ6OmdldE5leHRVbmlxdWVJZCgpOwotICAgIH0KLQotICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjOwotICAgIGlmIChtUG9saWN5TWl4ZXMuZ2V0T3V0cHV0Rm9yQXR0cihhdHRyaWJ1dGVzLCB1aWQsIGRlc2MpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dfQVNTRVJUKGRlc2MgIT0gMCwgIkludmFsaWQgZGVzYyByZXR1cm5lZCBieSBnZXRPdXRwdXRGb3JBdHRyIik7Ci0gICAgICAgIGlmICghYXVkaW9faGFzX3Byb3BvcnRpb25hbF9mcmFtZXMoY29uZmlnLT5mb3JtYXQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgICpzdHJlYW0gPSBzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoJmF0dHJpYnV0ZXMpOwotICAgICAgICAqb3V0cHV0ID0gZGVzYy0+bUlvSGFuZGxlOwotICAgICAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yQXR0cigpIHJldHVybnMgb3V0cHV0ICVkIiwgKm91dHB1dCk7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0gICAgaWYgKGF0dHJpYnV0ZXMudXNhZ2UgPT0gQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0UpIHsKLSAgICAgICAgQUxPR1coImdldE91dHB1dEZvckF0dHIoKSBubyBwb2xpY3kgbWl4IGZvdW5kIGZvciB1c2FnZSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRSIpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JBdHRyKCkgdXNhZ2U9JWQsIGNvbnRlbnQ9JWQsIHRhZz0lcyBmbGFncz0lMDh4IgotICAgICAgICAgICAgIiBzZXNzaW9uICVkIHNlbGVjdGVkRGV2aWNlSWQgJWQiLAotICAgICAgICAgICAgYXR0cmlidXRlcy51c2FnZSwgYXR0cmlidXRlcy5jb250ZW50X3R5cGUsIGF0dHJpYnV0ZXMudGFncywgYXR0cmlidXRlcy5mbGFncywKLSAgICAgICAgICAgIHNlc3Npb24sICpzZWxlY3RlZERldmljZUlkKTsKLQotICAgICpzdHJlYW0gPSBzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoJmF0dHJpYnV0ZXMpOwotCi0gICAgLy8gRXhwbGljaXQgcm91dGluZz8KLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjOwotICAgIGlmICgqc2VsZWN0ZWREZXZpY2VJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIGRldmljZURlc2MgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQoKnNlbGVjdGVkRGV2aWNlSWQpOwotICAgIH0KLSAgICBtT3V0cHV0Um91dGVzLmFkZFJvdXRlKHNlc3Npb24sICpzdHJlYW0sIFNlc3Npb25Sb3V0ZTo6U09VUkNFX1RZUEVfTkEsIGRldmljZURlc2MsIHVpZCk7Ci0KLSAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gKHJvdXRpbmdfc3RyYXRlZ3kpIGdldFN0cmF0ZWd5Rm9yQXR0cigmYXR0cmlidXRlcyk7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLQotICAgIGlmICgoYXR0cmlidXRlcy5mbGFncyAmIEFVRElPX0ZMQUdfSFdfQVZfU1lOQykgIT0gMCkgewotICAgICAgICAqZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKCpmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpOwotICAgIH0KLQotICAgIC8vIFNldCBpbmNhbGwgbXVzaWMgb25seSBpZiBkZXZpY2Ugd2FzIGV4cGxpY2l0bHkgc2V0LCBhbmQgZmFsbGJhY2sgdG8gdGhlIGRldmljZSB3aGljaCBpcwotICAgIC8vIGNob3NlbiBieSB0aGUgZW5naW5lIGlmIG5vdC4KLSAgICAvLyBGSVhNRTogcHJvdmlkZSBhIG1vcmUgZ2VuZXJpYyBhcHByb2FjaCB3aGljaCBpcyBub3QgZGV2aWNlIHNwZWNpZmljIGFuZCBtb3ZlIHRoaXMgYmFjawotICAgIC8vIHRvIGdldE91dHB1dEZvckRldmljZS4KLSAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYICYmCi0gICAgICAgICpzdHJlYW0gPT0gQVVESU9fU1RSRUFNX01VU0lDICYmCi0gICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oY29uZmlnLT5mb3JtYXQpICYmCi0gICAgICAgIGlzSW5DYWxsKCkpIHsKLSAgICAgICAgaWYgKCpzZWxlY3RlZERldmljZUlkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICpmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdClBVURJT19PVVRQVVRfRkxBR19JTkNBTExfTVVTSUM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBtRW5naW5lLT5nZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yQXR0cigpIGRldmljZSAweCV4LCBzYW1wbGluZyByYXRlICVkLCBmb3JtYXQgJSN4LCBjaGFubmVsIG1hc2sgJSN4LCAiCi0gICAgICAgICAgImZsYWdzICUjeCIsCi0gICAgICAgICAgZGV2aWNlLCBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssICpmbGFncyk7Ci0KLSAgICAqb3V0cHV0ID0gZ2V0T3V0cHV0Rm9yRGV2aWNlKGRldmljZSwgc2Vzc2lvbiwgKnN0cmVhbSwgY29uZmlnLCBmbGFncyk7Ci0gICAgaWYgKCpvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgbU91dHB1dFJvdXRlcy5yZW1vdmVSb3V0ZShzZXNzaW9uKTsKKyAgICAvLyBUaGUgc3VwcGxpZWQgcG9ydElkIG11c3QgYmUgQVVESU9fUE9SVF9IQU5ETEVfTk9ORQorICAgIGlmICgqcG9ydElkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KKyAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IHJlcXVlc3RlZERldmljZUlkID0gKnNlbGVjdGVkRGV2aWNlSWQ7CisgICAgYXVkaW9fYXR0cmlidXRlc190IHJlc3VsdEF0dHI7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0T3V0cHV0Rm9yQXR0ckludCgmcmVzdWx0QXR0ciwgb3V0cHV0LCBzZXNzaW9uLCBhdHRyLCBzdHJlYW0sIHVpZCwKKyAgICAgICAgICAgIGNvbmZpZywgZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CiAKLSAgICBEZXZpY2VWZWN0b3Igb3V0cHV0RGV2aWNlcyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOwotICAgICpzZWxlY3RlZERldmljZUlkID0gb3V0cHV0RGV2aWNlcy5zaXplKCkgPiAwID8gb3V0cHV0RGV2aWNlcy5pdGVtQXQoMCktPmdldElkKCkKLSAgICAgICAgICAgIDogQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICBhdWRpb19jb25maWdfYmFzZV90IGNsaWVudENvbmZpZyA9IHsuc2FtcGxlX3JhdGUgPSBjb25maWctPnNhbXBsZV9yYXRlLAorICAgICAgICAuZm9ybWF0ID0gY29uZmlnLT5mb3JtYXQsCisgICAgICAgIC5jaGFubmVsX21hc2sgPSBjb25maWctPmNoYW5uZWxfbWFzayB9OworICAgICpwb3J0SWQgPSBBdWRpb1BvcnQ6OmdldE5leHRVbmlxdWVJZCgpOwogCi0gICAgQUxPR1YoIiAgZ2V0T3V0cHV0Rm9yQXR0cigpIHJldHVybnMgb3V0cHV0ICVkIHNlbGVjdGVkRGV2aWNlSWQgJWQiLCAqb3V0cHV0LCAqc2VsZWN0ZWREZXZpY2VJZCk7CisgICAgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiBjbGllbnREZXNjID0KKyAgICAgICAgbmV3IFRyYWNrQ2xpZW50RGVzY3JpcHRvcigqcG9ydElkLCB1aWQsIHNlc3Npb24sIHJlc3VsdEF0dHIsIGNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWREZXZpY2VJZCwgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTdHJhdGVneUZvckF0dHIoJnJlc3VsdEF0dHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpmbGFncyk7CisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcigqb3V0cHV0KTsKKyAgICBvdXRwdXREZXNjLT5hZGRDbGllbnQoY2xpZW50RGVzYyk7CisKKyAgICBBTE9HVigiJXMgcmV0dXJucyBvdXRwdXQgJWQgc2VsZWN0ZWREZXZpY2VJZCAlZCBmb3IgcG9ydCBJRCAlZCIsCisgICAgICAgICAgX19mdW5jX18sICpvdXRwdXQsIHJlcXVlc3RlZERldmljZUlkLCAqcG9ydElkKTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTkzMiw3ICs5OTAsOCBAQAogICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1RUUykgewogICAgICAgICAqZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19UVFM7CiAgICAgfSBlbHNlIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwgJiYKLSAgICAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oY29uZmlnLT5mb3JtYXQpKSB7CisgICAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGNvbmZpZy0+Zm9ybWF0KSAmJgorICAgICAgICAgICAgICAgKCpmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0lOQ0FMTF9NVVNJQykgPT0gMCkgewogICAgICAgICAqZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKEFVRElPX09VVFBVVF9GTEFHX1ZPSVBfUlggfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKICAgICAgICAgQUxPR1YoIlNldCBWb0lQIGFuZCBEaXJlY3Qgb3V0cHV0IGZsYWdzIGZvciBQQ00gZm9ybWF0Iik7CkBAIC05NTgsMTEgKzEwMTcsMTIgQEAKIAogICAgIGlmICgoKCpmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpID09IDApIHx8CiAgICAgICAgICAgICAhKG1FZmZlY3RzLmlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkgfHwgbU1hc3Rlck1vbm8pKSB7Ci0gICAgICAgIHByb2ZpbGUgPSBnZXRQcm9maWxlRm9yRGlyZWN0T3V0cHV0KGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkqZmxhZ3MpOworICAgICAgICBwcm9maWxlID0gZ2V0UHJvZmlsZUZvck91dHB1dChkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KSpmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBkaXJlY3RPbmx5ICovKTsKICAgICB9CiAKICAgICBpZiAocHJvZmlsZSAhPSAwKSB7CkBAIC05OTEsOSArMTA1MSwyNSBAQAogICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9CiAgICAgICAgICAgICAgICAgbmV3IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKHByb2ZpbGUsIG1wQ2xpZW50SW50ZXJmYWNlKTsKIAotICAgICAgICBEZXZpY2VWZWN0b3Igb3V0cHV0RGV2aWNlcyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOwotICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBvdXRwdXREZXZpY2VzLnNpemUoKSA+IDAgPyBvdXRwdXREZXZpY2VzLml0ZW1BdCgwKS0+bUFkZHJlc3MKLSAgICAgICAgICAgICAgICA6IFN0cmluZzgoIiIpOworICAgICAgICBEZXZpY2VWZWN0b3Igb3V0cHV0RGV2aWNlcyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZU1hc2soZGV2aWNlKTsKKyAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gZ2V0Rmlyc3REZXZpY2VBZGRyZXNzKG91dHB1dERldmljZXMpOworCisgICAgICAgIC8vIE1TRCBwYXRjaCBtYXkgYmUgdXNpbmcgdGhlIG9ubHkgb3V0cHV0IHN0cmVhbSB0aGF0IGNhbiBzZXJ2aWNlIHRoaXMgcmVxdWVzdC4gUmVsZWFzZQorICAgICAgICAvLyBNU0QgcGF0Y2ggdG8gcHJpb3JpdGl6ZSB0aGlzIHJlcXVlc3Qgb3ZlciBhbnkgYWN0aXZlIG91dHB1dCBvbiBNU0QuCisgICAgICAgIEF1ZGlvUGF0Y2hDb2xsZWN0aW9uIG1zZFBhdGNoZXMgPSBnZXRNc2RQYXRjaGVzKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbXNkUGF0Y2hlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgY29uc3QgYXV0byYgcGF0Y2ggPSBtc2RQYXRjaGVzW2ldOworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBwYXRjaC0+bVBhdGNoLm51bV9zaW5rczsgKytqKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rID0gJnBhdGNoLT5tUGF0Y2guc2lua3Nbal07CisgICAgICAgICAgICAgICAgaWYgKHNpbmstPnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKHNpbmstPmV4dC5kZXZpY2UudHlwZSAmIGRldmljZSkgIT0gQVVESU9fREVWSUNFX05PTkUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChhZGRyZXNzLmlzRW1wdHkoKSB8fCBzdHJuY21wKHNpbmstPmV4dC5kZXZpY2UuYWRkcmVzcywgYWRkcmVzcy5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTikgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2gtPm1IYW5kbGUsIG1VaWRDYWNoZWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAogICAgICAgICBzdGF0dXMgPSBvdXRwdXREZXNjLT5vcGVuKGNvbmZpZywgZGV2aWNlLCBhZGRyZXNzLCBzdHJlYW0sICpmbGFncywgJm91dHB1dCk7CiAKQEAgLTEwMTYsOCArMTA5Miw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgICAgIH0KLSAgICAgICAgb3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPSAwOwotICAgICAgICBvdXRwdXREZXNjLT5tU3RvcFRpbWVbc3RyZWFtXSA9IDA7CiAgICAgICAgIG91dHB1dERlc2MtPm1EaXJlY3RPcGVuQ291bnQgPSAxOwogICAgICAgICBvdXRwdXREZXNjLT5tRGlyZWN0Q2xpZW50U2Vzc2lvbiA9IHNlc3Npb247CiAKQEAgLTEwNDgsNyArMTEyMiw4IEBACiAKICAgICAgICAgLy8gYXQgdGhpcyBzdGFnZSB3ZSBzaG91bGQgaWdub3JlIHRoZSBESVJFQ1QgZmxhZyBhcyBubyBkaXJlY3Qgb3V0cHV0IGNvdWxkIGJlIGZvdW5kIGVhcmxpZXIKICAgICAgICAgKmZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSgqZmxhZ3MgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKLSAgICAgICAgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsICpmbGFncywgY29uZmlnLT5mb3JtYXQpOworICAgICAgICBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywgKmZsYWdzLCBjb25maWctPmZvcm1hdCwKKyAgICAgICAgICAgICAgICBjb25maWctPmNoYW5uZWxfbWFzaywgY29uZmlnLT5zYW1wbGVfcmF0ZSk7CiAgICAgfQogICAgIEFMT0dXX0lGKChvdXRwdXQgPT0gMCksICJnZXRPdXRwdXRGb3JEZXZpY2UoKSBjb3VsZCBub3QgZmluZCBvdXRwdXQgZm9yIHN0cmVhbSAlZCwgIgogICAgICAgICAgICAgInNhbXBsaW5nIHJhdGUgJWQsIGZvcm1hdCAlI3gsIGNoYW5uZWxzICUjeCwgZmxhZ3MgJSN4IiwKQEAgLTEwNTcsMTcgKzExMzIsMTcwIEBACiAgICAgcmV0dXJuIG91dHB1dDsKIH0KIAorc3A8RGV2aWNlRGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRNc2RBdWRpb0luRGV2aWNlKCkgY29uc3QgeworICAgIHNwPEh3TW9kdWxlPiBtc2RNb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpOworICAgIGlmIChtc2RNb2R1bGUgIT0gMCkgeworICAgICAgICBEZXZpY2VWZWN0b3IgbXNkSW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbUh3TW9kdWxlKAorICAgICAgICAgICAgICAgIG1zZE1vZHVsZS0+Z2V0SGFuZGxlKCkpOworICAgICAgICBpZiAoIW1zZElucHV0RGV2aWNlcy5pc0VtcHR5KCkpIHJldHVybiBtc2RJbnB1dERldmljZXMuaXRlbUF0KDApOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworY29uc3QgQXVkaW9QYXRjaENvbGxlY3Rpb24gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRNc2RQYXRjaGVzKCkgY29uc3QgeworICAgIEF1ZGlvUGF0Y2hDb2xsZWN0aW9uIG1zZFBhdGNoZXM7CisgICAgc3A8SHdNb2R1bGU+IG1zZE1vZHVsZSA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRnJvbU5hbWUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCk7CisgICAgaWYgKG1zZE1vZHVsZSAhPSAwKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvUGF0Y2hlcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2ggPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHBhdGNoLT5tUGF0Y2gubnVtX3NvdXJjZXM7ICsraikgeworICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlID0gJnBhdGNoLT5tUGF0Y2guc291cmNlc1tqXTsKKyAgICAgICAgICAgICAgICBpZiAoc291cmNlLT50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS0+ZXh0LmRldmljZS5od19tb2R1bGUgPT0gbXNkTW9kdWxlLT5nZXRIYW5kbGUoKSkgeworICAgICAgICAgICAgICAgICAgICBtc2RQYXRjaGVzLmFkZEF1ZGlvUGF0Y2gocGF0Y2gtPm1IYW5kbGUsIHBhdGNoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1zZFBhdGNoZXM7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0QmVzdE1zZEF1ZGlvUHJvZmlsZUZvcihhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlLAorICAgICAgICBib29sIGh3QXZTeW5jLCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlQ29uZmlnLCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua0NvbmZpZykgY29uc3QKK3sKKyAgICBzcDxId01vZHVsZT4gbXNkTW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKTsKKyAgICBpZiAobXNkTW9kdWxlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgdW5hYmxlIHRvIGdldCBNU0QgbW9kdWxlIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgc3A8SHdNb2R1bGU+IGRldmljZU1vZHVsZSA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRm9yRGV2aWNlKG91dHB1dERldmljZSk7CisgICAgaWYgKGRldmljZU1vZHVsZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcygpIHVuYWJsZSB0byBnZXQgbW9kdWxlIGZvciAlI3giLCBfX2Z1bmNfXywgb3V0cHV0RGV2aWNlKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGNvbnN0IElucHV0UHJvZmlsZUNvbGxlY3Rpb24gJmlucHV0UHJvZmlsZXMgPSBtc2RNb2R1bGUtPmdldElucHV0UHJvZmlsZXMoKTsKKyAgICBpZiAoaW5wdXRQcm9maWxlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgbm8gaW5wdXQgcHJvZmlsZXMgZm9yIE1TRCBtb2R1bGUiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBjb25zdCBPdXRwdXRQcm9maWxlQ29sbGVjdGlvbiAmb3V0cHV0UHJvZmlsZXMgPSBkZXZpY2VNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCk7CisgICAgaWYgKG91dHB1dFByb2ZpbGVzLmlzRW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXMoKSBubyBvdXRwdXQgcHJvZmlsZXMgZm9yIGRldmljZSAlI3giLCBfX2Z1bmNfXywgb3V0cHV0RGV2aWNlKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIEF1ZGlvUHJvZmlsZVZlY3RvciBtc2RQcm9maWxlczsKKyAgICAvLyBFYWNoIElPUHJvZmlsZSByZXByZXNlbnRzIGEgTWl4UG9ydCBmcm9tIGF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAorICAgIGZvciAoY29uc3QgYXV0byAmaW5Qcm9maWxlIDogaW5wdXRQcm9maWxlcykgeworICAgICAgICBpZiAoaHdBdlN5bmMgPT0gKChpblByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19JTlBVVF9GTEFHX0hXX0FWX1NZTkMpICE9IDApKSB7CisgICAgICAgICAgICBtc2RQcm9maWxlcy5hcHBlbmRWZWN0b3IoaW5Qcm9maWxlLT5nZXRBdWRpb1Byb2ZpbGVzKCkpOworICAgICAgICB9CisgICAgfQorICAgIEF1ZGlvUHJvZmlsZVZlY3RvciBkZXZpY2VQcm9maWxlczsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJm91dFByb2ZpbGUgOiBvdXRwdXRQcm9maWxlcykgeworICAgICAgICBpZiAoaHdBdlN5bmMgPT0gKChvdXRQcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQykgIT0gMCkpIHsKKyAgICAgICAgICAgIGRldmljZVByb2ZpbGVzLmFwcGVuZFZlY3RvcihvdXRQcm9maWxlLT5nZXRBdWRpb1Byb2ZpbGVzKCkpOworICAgICAgICB9CisgICAgfQorICAgIHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSBiZXN0U2lua0NvbmZpZzsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBtc2RQcm9maWxlcy5maW5kQmVzdE1hdGNoaW5nT3V0cHV0Q29uZmlnKGRldmljZVByb2ZpbGVzLAorICAgICAgICAgICAgY29tcHJlc3NlZEZvcm1hdHNPcmRlciwgc3Vycm91bmRDaGFubmVsTWFza3NPcmRlciwgdHJ1ZSAvKnByZWZlckhpZ2hlclNhbXBsaW5nUmF0ZXMqLywKKyAgICAgICAgICAgICZiZXN0U2lua0NvbmZpZyk7CisgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRCgiJXMoKSBubyBtYXRjaGluZyBwcm9maWxlcyBmb3VuZCBmb3IgZGV2aWNlOiAlI3gsIGh3QXZTeW5jOiAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG91dHB1dERldmljZSwgaHdBdlN5bmMpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBzaW5rQ29uZmlnLT5zYW1wbGVfcmF0ZSA9IGJlc3RTaW5rQ29uZmlnLnNhbXBsZV9yYXRlOworICAgIHNpbmtDb25maWctPmNoYW5uZWxfbWFzayA9IGJlc3RTaW5rQ29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICBzaW5rQ29uZmlnLT5mb3JtYXQgPSBiZXN0U2lua0NvbmZpZy5mb3JtYXQ7CisgICAgLy8gRm9yIGVuY29kZWQgc3RyZWFtcyBmb3JjZSBkaXJlY3QgZmxhZyB0byBwcmV2ZW50IGRvd25zdHJlYW0gbWl4aW5nLgorICAgIHNpbmtDb25maWctPmZsYWdzLm91dHB1dCA9IHN0YXRpY19jYXN0PGF1ZGlvX291dHB1dF9mbGFnc190PigKKyAgICAgICAgICAgIHNpbmtDb25maWctPmZsYWdzLm91dHB1dCB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgc291cmNlQ29uZmlnLT5zYW1wbGVfcmF0ZSA9IGJlc3RTaW5rQ29uZmlnLnNhbXBsZV9yYXRlOworICAgIC8vIFNwZWNpZnkgZXhhY3QgY2hhbm5lbCBtYXNrIHRvIHByZXZlbnQgZ3Vlc3NpbmcgYnkgYml0IGNvdW50IGluIFBhdGNoUGFuZWwuCisgICAgc291cmNlQ29uZmlnLT5jaGFubmVsX21hc2sgPSBhdWRpb19jaGFubmVsX21hc2tfb3V0X3RvX2luKGJlc3RTaW5rQ29uZmlnLmNoYW5uZWxfbWFzayk7CisgICAgc291cmNlQ29uZmlnLT5mb3JtYXQgPSBiZXN0U2lua0NvbmZpZy5mb3JtYXQ7CisgICAgLy8gQ29weSBpbnB1dCBzdHJlYW0gZGlyZWN0bHkgd2l0aG91dCBhbnkgcHJvY2Vzc2luZyAoZS5nLiByZXNhbXBsaW5nKS4KKyAgICBzb3VyY2VDb25maWctPmZsYWdzLmlucHV0ID0gc3RhdGljX2Nhc3Q8YXVkaW9faW5wdXRfZmxhZ3NfdD4oCisgICAgICAgICAgICBzb3VyY2VDb25maWctPmZsYWdzLmlucHV0IHwgQVVESU9fSU5QVVRfRkxBR19ESVJFQ1QpOworICAgIGlmIChod0F2U3luYykgeworICAgICAgICBzaW5rQ29uZmlnLT5mbGFncy5vdXRwdXQgPSBzdGF0aWNfY2FzdDxhdWRpb19vdXRwdXRfZmxhZ3NfdD4oCisgICAgICAgICAgICAgICAgc2lua0NvbmZpZy0+ZmxhZ3Mub3V0cHV0IHwgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyk7CisgICAgICAgIHNvdXJjZUNvbmZpZy0+ZmxhZ3MuaW5wdXQgPSBzdGF0aWNfY2FzdDxhdWRpb19pbnB1dF9mbGFnc190PigKKyAgICAgICAgICAgICAgICBzb3VyY2VDb25maWctPmZsYWdzLmlucHV0IHwgQVVESU9fSU5QVVRfRkxBR19IV19BVl9TWU5DKTsKKyAgICB9CisgICAgY29uc3QgdW5zaWduZWQgaW50IGNvbmZpZ19tYXNrID0gQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUgfAorICAgICAgICAgICAgQVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLIHwgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUIHwgQVVESU9fUE9SVF9DT05GSUdfRkxBR1M7CisgICAgc2lua0NvbmZpZy0+Y29uZmlnX21hc2sgfD0gY29uZmlnX21hc2s7CisgICAgc291cmNlQ29uZmlnLT5jb25maWdfbWFzayB8PSBjb25maWdfbWFzazsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK1BhdGNoQnVpbGRlciBBdWRpb1BvbGljeU1hbmFnZXI6OmJ1aWxkTXNkUGF0Y2goYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZSkgY29uc3QKK3sKKyAgICBQYXRjaEJ1aWxkZXIgcGF0Y2hCdWlsZGVyOworICAgIHBhdGNoQnVpbGRlci5hZGRTb3VyY2UoZ2V0TXNkQXVkaW9JbkRldmljZSgpKS4KKyAgICAgICAgICAgIGFkZFNpbmsoZmluZERldmljZShtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgb3V0cHV0RGV2aWNlKSk7CisgICAgYXVkaW9fcG9ydF9jb25maWcgc291cmNlQ29uZmlnID0gcGF0Y2hCdWlsZGVyLnBhdGNoKCktPnNvdXJjZXNbMF07CisgICAgYXVkaW9fcG9ydF9jb25maWcgc2lua0NvbmZpZyA9IHBhdGNoQnVpbGRlci5wYXRjaCgpLT5zaW5rc1swXTsKKyAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoZXRoZXIgTVNEIG1vZHVsZSBoYXMgSFdfQVZfU1lOQyBmbGFnIHNldCBpbiB0aGUgQVAgY29uZmlnIGZpbGUuCisgICAgLy8gRm9yIG5vdywgd2UganVzdCBmb3JjZWZ1bGx5IHRyeSB3aXRoIEh3QXZTeW5jIGZpcnN0LgorICAgIHN0YXR1c190IHJlcyA9IGdldEJlc3RNc2RBdWRpb1Byb2ZpbGVGb3Iob3V0cHV0RGV2aWNlLCB0cnVlIC8qaHdBdlN5bmMqLywKKyAgICAgICAgICAgICZzb3VyY2VDb25maWcsICZzaW5rQ29uZmlnKSA9PSBOT19FUlJPUiA/IE5PX0VSUk9SIDoKKyAgICAgICAgICAgIGdldEJlc3RNc2RBdWRpb1Byb2ZpbGVGb3IoCisgICAgICAgICAgICAgICAgICAgIG91dHB1dERldmljZSwgZmFsc2UgLypod0F2U3luYyovLCAmc291cmNlQ29uZmlnLCAmc2lua0NvbmZpZyk7CisgICAgaWYgKHJlcyA9PSBOT19FUlJPUikgeworICAgICAgICAvLyBGb3VuZCBhIG1hdGNoaW5nIHByb2ZpbGUgZm9yIGVuY29kZWQgYXVkaW8uIFJlLWNyZWF0ZSBQYXRjaEJ1aWxkZXIgd2l0aCB0aGlzIGNvbmZpZy4KKyAgICAgICAgcmV0dXJuIChQYXRjaEJ1aWxkZXIoKSkuYWRkU291cmNlKHNvdXJjZUNvbmZpZykuYWRkU2luayhzaW5rQ29uZmlnKTsKKyAgICB9CisgICAgQUxPR1YoIiVzKCkgbm8gbWF0Y2hpbmcgcHJvZmlsZSBmb3VuZC4gRmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQgUENNIHBhdGNoIgorICAgICAgICAgICAgIiBzdXBwb3J0aW5nIFBDTSBmb3JtYXQgY29udmVyc2lvbi4iLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIHBhdGNoQnVpbGRlcjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRNc2RQYXRjaChhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlKSB7CisgICAgQUxPR1YoIiVzKCkgZm9yIG91dHB1dERldmljZSAlI3giLCBfX2Z1bmNfXywgb3V0cHV0RGV2aWNlKTsKKyAgICBpZiAob3V0cHV0RGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIC8vIFVzZSBtZWRpYSBzdHJhdGVneSBmb3IgdW5zcGVjaWZpZWQgb3V0cHV0IGRldmljZS4gVGhpcyBzaG91bGQgb25seQorICAgICAgICAvLyBvY2N1ciBvbiBjaGVja0ZvckRldmljZUFuZE91dHB1dENoYW5nZXMoKS4gRGV2aWNlIGNvbm5lY3Rpb24gZXZlbnRzIG1heQorICAgICAgICAvLyB0aGVyZWZvcmUgaW52YWxpZGF0ZSBleHBsaWNpdCByb3V0aW5nIHJlcXVlc3RzLgorICAgICAgICBvdXRwdXREZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgfQorICAgIFBhdGNoQnVpbGRlciBwYXRjaEJ1aWxkZXIgPSBidWlsZE1zZFBhdGNoKG91dHB1dERldmljZSk7CisgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoKiBwYXRjaCA9IHBhdGNoQnVpbGRlci5wYXRjaCgpOworICAgIGNvbnN0IEF1ZGlvUGF0Y2hDb2xsZWN0aW9uIG1zZFBhdGNoZXMgPSBnZXRNc2RQYXRjaGVzKCk7CisgICAgaWYgKCFtc2RQYXRjaGVzLmlzRW1wdHkoKSkgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1zZFBhdGNoZXMuc2l6ZSgpID4gMSwKKyAgICAgICAgICAgICAgICAiVGhlIGN1cnJlbnQgTVNEIHByb3RvdHlwZSBvbmx5IHN1cHBvcnRzIG9uZSBvdXRwdXQgcGF0Y2giKTsKKyAgICAgICAgc3A8QXVkaW9QYXRjaD4gY3VycmVudFBhdGNoID0gbXNkUGF0Y2hlcy52YWx1ZUF0KDApOworICAgICAgICBpZiAoYXVkaW9fcGF0Y2hlc19hcmVfZXF1YWwoJmN1cnJlbnRQYXRjaC0+bVBhdGNoLCBwYXRjaCkpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICByZWxlYXNlQXVkaW9QYXRjaChjdXJyZW50UGF0Y2gtPm1IYW5kbGUsIG1VaWRDYWNoZWQpOworICAgIH0KKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbnN0YWxsUGF0Y2goX19mdW5jX18sIC0xIC8qaW5kZXgqLywgbnVsbHB0ciAvKnBhdGNoSGFuZGxlKi8sCisgICAgICAgICAgICBwYXRjaCwgMCAvKmRlbGF5TXMqLywgbVVpZENhY2hlZCwgbnVsbHB0ciAvKnBhdGNoRGVzY1B0ciovKTsKKyAgICBBTE9HRV9JRihzdGF0dXMgIT0gTk9fRVJST1IsICIlcygpIGVycm9yICVkIGNyZWF0aW5nIE1TRCBhdWRpbyBwYXRjaCIsIF9fZnVuY19fLCBzdGF0dXMpOworICAgIEFMT0dJX0lGKHN0YXR1cyA9PSBOT19FUlJPUiwgIiVzKCkgUGF0Y2ggY3JlYXRlZCBmcm9tIE1TRF9JTiB0byAiCisgICAgICAgICAgICJkZXZpY2U6JSN4IChmb3JtYXQ6JSN4IGNoYW5uZWxzOiUjeCBzYW1wbGVyYXRlOiVkKSIsIF9fZnVuY19fLCBvdXRwdXREZXZpY2UsCisgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmZvcm1hdCwgcGF0Y2gtPnNvdXJjZXNbMF0uY2hhbm5lbF9tYXNrLCBwYXRjaC0+c291cmNlc1swXS5zYW1wbGVfcmF0ZSk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwogYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZWxlY3RPdXRwdXQoY29uc3QgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSkKIHsKICAgICAvLyBzZWxlY3Qgb25lIG91dHB1dCBhbW9uZyBzZXZlcmFsIHRoYXQgcHJvdmlkZSBhIHBhdGggdG8gYSBwYXJ0aWN1bGFyIGRldmljZSBvciBzZXQgb2YKICAgICAvLyBkZXZpY2VzICh0aGUgbGlzdCB3YXMgcHJldmlvdXNseSBidWlsZCBieSBnZXRPdXRwdXRzRm9yRGV2aWNlKCkpLgogICAgIC8vIFRoZSBwcmlvcml0eSBpcyBhcyBmb2xsb3dzOgotICAgIC8vIDE6IHRoZSBvdXRwdXQgd2l0aCB0aGUgaGlnaGVzdCBudW1iZXIgb2YgcmVxdWVzdGVkIHBvbGljeSBmbGFncwotICAgIC8vIDI6IHRoZSBvdXRwdXQgd2l0aCB0aGUgYml0IGRlcHRoIHRoZSBjbG9zZXN0IHRvIHRoZSByZXF1ZXN0ZWQgb25lCi0gICAgLy8gMzogdGhlIHByaW1hcnkgb3V0cHV0Ci0gICAgLy8gNDogdGhlIGZpcnN0IG91dHB1dCBpbiB0aGUgbGlzdAorICAgIC8vIDE6IHRoZSBvdXRwdXQgc3VwcG9ydGluZyBoYXB0aWMgcGxheWJhY2sgd2hlbiByZXF1ZXN0aW5nIGhhcHRpYyBwbGF5YmFjaworICAgIC8vIDI6IHRoZSBvdXRwdXQgd2l0aCB0aGUgaGlnaGVzdCBudW1iZXIgb2YgcmVxdWVzdGVkIHBvbGljeSBmbGFncworICAgIC8vIDM6IHRoZSBvdXRwdXQgd2l0aCB0aGUgYml0IGRlcHRoIHRoZSBjbG9zZXN0IHRvIHRoZSByZXF1ZXN0ZWQgb25lCisgICAgLy8gNDogdGhlIHByaW1hcnkgb3V0cHV0CisgICAgLy8gNTogdGhlIGZpcnN0IG91dHB1dCBpbiB0aGUgbGlzdAogCiAgICAgaWYgKG91dHB1dHMuc2l6ZSgpID09IDApIHsKICAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOwpAQCAtMTA3NywxOCArMTMwNSw0NiBAQAogICAgIH0KIAogICAgIGludCBtYXhDb21tb25GbGFncyA9IDA7CisgICAgY29uc3Qgc2l6ZV90IGhhcHRpY0NoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzaygKKyAgICAgICAgICAgIGNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKTsKICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRGb3JGbGFncyA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dEZvclByaW1hcnkgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRGb3JGb3JtYXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICBhdWRpb19mb3JtYXRfdCBiZXN0Rm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CiAgICAgYXVkaW9fZm9ybWF0X3QgYmVzdEZvcm1hdEZvckZsYWdzID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CiAKKyAgICAvLyBGbGFncyB3aGljaCBtdXN0IGJlIHByZXNlbnQgb24gYm90aCB0aGUgcmVxdWVzdCBhbmQgdGhlIHNlbGVjdGVkIG91dHB1dAorICAgIHN0YXRpYyBjb25zdCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBrTWFuZGF0ZWRGbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkKKyAgICAgICAgKEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMgfCBBVURJT19PVVRQVVRfRkxBR19NTUFQX05PSVJRKTsKKwogICAgIGZvciAoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0IDogb3V0cHV0cykgewogICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CiAgICAgICAgIGlmICghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIElmIGhhcHRpYyBjaGFubmVsIGlzIHNwZWNpZmllZCwgdXNlIHRoZSBoYXB0aWMgb3V0cHV0IGlmIHByZXNlbnQuCisgICAgICAgICAgICAvLyBXaGVuIHVzaW5nIGhhcHRpYyBvdXRwdXQsIHNhbWUgYXVkaW8gZm9ybWF0IGFuZCBzYW1wbGUgcmF0ZSBhcmUgcmVxdWlyZWQuCisgICAgICAgICAgICBpZiAoaGFwdGljQ2hhbm5lbENvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIC8vIElmIGhhcHRpYyBjaGFubmVsIGlzIHNwZWNpZmllZCwgdXNlIHRoZSBmaXJzdCBvdXRwdXQgdGhhdAorICAgICAgICAgICAgICAgIC8vIHN1cHBvcnQgaGFwdGljIHBsYXliYWNrLgorICAgICAgICAgICAgICAgIGlmIChhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2sgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpID49IGhhcHRpY0NoYW5uZWxDb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0ID09IG91dHB1dERlc2MtPm1Gb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHNhbXBsaW5nUmF0ZSA9PSBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBXaGVuIGhhcHRpYyBjaGFubmVsIGlzIG5vdCBzcGVjaWZpZWQsIHNraXAgaGFwdGljIG91dHB1dC4KKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoa01hbmRhdGVkRmxhZ3MgJiBmbGFncykgIT0KKyAgICAgICAgICAgICAgICAoa01hbmRhdGVkRmxhZ3MgJiBvdXRwdXREZXNjLT5tUHJvZmlsZS0+Z2V0RmxhZ3MoKSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLy8gaWYgYSB2YWxpZCBmb3JtYXQgaXMgc3BlY2lmaWVkLCBza2lwIG91dHB1dCBpZiBub3QgY29tcGF0aWJsZQogICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfSU5WQUxJRCkgewogICAgICAgICAgICAgICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7CkBAIC0xMTM2LDY3ICsxMzkyLDMyIEBACiAgICAgcmV0dXJuIG91dHB1dHNbMF07CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgQUxPR1YoInN0YXJ0T3V0cHV0KCkgb3V0cHV0ICVkLCBzdHJlYW0gJWQsIHNlc3Npb24gJWQiLAotICAgICAgICAgIG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKLSAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dHMuaW5kZXhPZktleShvdXRwdXQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInN0YXJ0T3V0cHV0KCkgdW5rbm93biBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgIEFMT0dWKCIlcyBwb3J0SWQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CisKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLmdldE91dHB1dEZvckNsaWVudChwb3J0SWQpOworICAgIGlmIChvdXRwdXREZXNjID09IDApIHsKKyAgICAgICAgQUxPR1coInN0YXJ0T3V0cHV0KCkgbm8gb3V0cHV0IGZvciBjbGllbnQgJWQiLCBwb3J0SWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KKyAgICBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+IGNsaWVudCA9IG91dHB1dERlc2MtPmdldENsaWVudChwb3J0SWQpOwogCi0gICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGluZGV4KTsKKyAgICBBTE9HVigic3RhcnRPdXRwdXQoKSBvdXRwdXQgJWQsIHN0cmVhbSAlZCwgc2Vzc2lvbiAlZCIsCisgICAgICAgICAgb3V0cHV0RGVzYy0+bUlvSGFuZGxlLCBjbGllbnQtPnN0cmVhbSgpLCBjbGllbnQtPnNlc3Npb24oKSk7CiAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvdXRwdXREZXNjLT5zdGFydCgpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKLSAgICAvLyBSb3V0aW5nPwotICAgIG1PdXRwdXRSb3V0ZXMuaW5jUm91dGVBY3Rpdml0eShzZXNzaW9uKTsKLQotICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2U7Ci0gICAgQXVkaW9NaXggKnBvbGljeU1peCA9IE5VTEw7Ci0gICAgY29uc3QgY2hhciAqYWRkcmVzcyA9IE5VTEw7Ci0gICAgaWYgKG91dHB1dERlc2MtPm1Qb2xpY3lNaXggIT0gTlVMTCkgewotICAgICAgICBwb2xpY3lNaXggPSBvdXRwdXREZXNjLT5tUG9saWN5TWl4OwotICAgICAgICBhZGRyZXNzID0gcG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKTsKLSAgICAgICAgaWYgKChwb2xpY3lNaXgtPm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSA9PSBNSVhfUk9VVEVfRkxBR19SRU5ERVIpIHsKLSAgICAgICAgICAgIG5ld0RldmljZSA9IHBvbGljeU1peC0+bURldmljZVR5cGU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBuZXdEZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVg7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1PdXRwdXRSb3V0ZXMuZ2V0QW5kQ2xlYXJSb3V0ZUNoYW5nZWQoc2Vzc2lvbikpIHsKLSAgICAgICAgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICBpZiAobmV3RGV2aWNlICE9IG91dHB1dERlc2MtPmRldmljZSgpKSB7Ci0gICAgICAgICAgICBjaGVja1N0cmF0ZWd5Um91dGUoZ2V0U3RyYXRlZ3koc3RyZWFtKSwgb3V0cHV0KTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG5ld0RldmljZSA9IEFVRElPX0RFVklDRV9OT05FOwotICAgIH0KLQotICAgIHVpbnQzMl90IGRlbGF5TXMgPSAwOwotCi0gICAgc3RhdHVzID0gc3RhcnRTb3VyY2Uob3V0cHV0RGVzYywgc3RyZWFtLCBuZXdEZXZpY2UsIGFkZHJlc3MsICZkZWxheU1zKTsKKyAgICB1aW50MzJfdCBkZWxheU1zOworICAgIHN0YXR1cyA9IHN0YXJ0U291cmNlKG91dHB1dERlc2MsIGNsaWVudCwgJmRlbGF5TXMpOwogCiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBtT3V0cHV0Um91dGVzLmRlY1JvdXRlQWN0aXZpdHkoc2Vzc2lvbik7CiAgICAgICAgIG91dHB1dERlc2MtPnN0b3AoKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9Ci0gICAgLy8gQXV0b21hdGljYWxseSBlbmFibGUgdGhlIHJlbW90ZSBzdWJtaXggaW5wdXQgd2hlbiBvdXRwdXQgaXMgc3RhcnRlZCBvbiBhIHJlIHJvdXRpbmcgbWl4Ci0gICAgLy8gb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKLSAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UobmV3RGV2aWNlKSAmJiBwb2xpY3lNaXggIT0gTlVMTCAmJgotICAgICAgICAgICAgcG9saWN5TWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKLSAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwKLSAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICJyZW1vdGUtc3VibWl4Iik7Ci0gICAgfQotCiAgICAgaWYgKGRlbGF5TXMgIT0gMCkgewogICAgICAgICB1c2xlZXAoZGVsYXlNcyAqIDEwMDApOwogICAgIH0KQEAgLTEyMDQsMTYgKzE0MjUsMTUgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0U291cmNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmRlbGF5TXMpCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0U291cmNlKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqZGVsYXlNcykKIHsKICAgICAvLyBjYW5ub3Qgc3RhcnQgcGxheWJhY2sgb2YgU1RSRUFNX1RUUyBpZiBhbnkgb3RoZXIgb3V0cHV0IGlzIGJlaW5nIHVzZWQKICAgICB1aW50MzJfdCBiZWFjb25NdXRlTGF0ZW5jeSA9IDA7CiAKICAgICAqZGVsYXlNcyA9IDA7CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBjbGllbnQtPnN0cmVhbSgpOwogICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1RUUykgewogICAgICAgICBBTE9HVigiXHQgZm91bmQgQkVBQ09OIHN0cmVhbSIpOwogICAgICAgICBpZiAoIW1UdHNPdXRwdXRBdmFpbGFibGUgJiYgbU91dHB1dHMuaXNBbnlPdXRwdXRBY3RpdmUoQVVESU9fU1RSRUFNX1RUUyAvKnN0cmVhbVRvSWdub3JlKi8pKSB7CkBAIC0xMjMxLDYgKzE0NTEsMTkgQEAKICAgICBib29sIGZvcmNlID0gIW91dHB1dERlc2MtPmlzQWN0aXZlKCkgJiYKICAgICAgICAgICAgIChvdXRwdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpID09IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKTsKIAorICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICBBdWRpb01peCAqcG9saWN5TWl4ID0gTlVMTDsKKyAgICBjb25zdCBjaGFyICphZGRyZXNzID0gTlVMTDsKKyAgICBpZiAob3V0cHV0RGVzYy0+bVBvbGljeU1peCAhPSBOVUxMKSB7CisgICAgICAgIHBvbGljeU1peCA9IG91dHB1dERlc2MtPm1Qb2xpY3lNaXg7CisgICAgICAgIGFkZHJlc3MgPSBwb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLnN0cmluZygpOworICAgICAgICBpZiAoKHBvbGljeU1peC0+bVJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19SRU5ERVIpID09IE1JWF9ST1VURV9GTEFHX1JFTkRFUikgeworICAgICAgICAgICAgZGV2aWNlID0gcG9saWN5TWl4LT5tRGV2aWNlVHlwZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIHJlcXVpcmVzTXV0ZUNoZWNrIGlzIGZhbHNlIHdoZW4gd2UgY2FuIGJ5cGFzcyBtdXRlIHN0cmF0ZWd5LgogICAgIC8vIEl0IGNvdmVycyBhIGNvbW1vbiBjYXNlIHdoZW4gdGhlcmUgaXMgbm8gbWF0ZXJpYWxseSBhY3RpdmUgYXVkaW8KICAgICAvLyBhbmQgbXV0aW5nIHdvdWxkIHJlc3VsdCBpbiB1bm5lY2Vzc2FyeSBkZWxheSBhbmQgZHJvcHBlZCBhdWRpby4KQEAgLTEyNDAsMTMgKzE0NzMsMjAgQEAKICAgICAvLyBpbmNyZW1lbnQgdXNhZ2UgY291bnQgZm9yIHRoaXMgc3RyZWFtIG9uIHRoZSByZXF1ZXN0ZWQgb3V0cHV0OgogICAgIC8vIE5PVEUgdGhhdCB0aGUgdXNhZ2UgY291bnQgaXMgdGhlIHNhbWUgZm9yIGR1cGxpY2F0ZWQgb3V0cHV0IGFuZCBoYXJkd2FyZSBvdXRwdXQgd2hpY2ggaXMKICAgICAvLyBuZWNlc3NhcnkgZm9yIGEgY29ycmVjdCBjb250cm9sIG9mIGhhcmR3YXJlIG91dHB1dCByb3V0aW5nIGJ5IHN0YXJ0T3V0cHV0KCkgYW5kIHN0b3BPdXRwdXQoKQotICAgIG91dHB1dERlc2MtPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgMSk7CisgICAgb3V0cHV0RGVzYy0+c2V0Q2xpZW50QWN0aXZlKGNsaWVudCwgdHJ1ZSk7CisKKyAgICBpZiAoY2xpZW50LT5oYXNQcmVmZXJyZWREZXZpY2UodHJ1ZSkpIHsKKyAgICAgICAgZGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICBpZiAoZGV2aWNlICE9IG91dHB1dERlc2MtPmRldmljZSgpKSB7CisgICAgICAgICAgICBjaGVja1N0cmF0ZWd5Um91dGUoZ2V0U3RyYXRlZ3koc3RyZWFtKSwgb3V0cHV0RGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgfQorICAgIH0KIAogICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX01VU0lDKSB7CiAgICAgICAgIHNlbGVjdE91dHB1dEZvck11c2ljRWZmZWN0cygpOwogICAgIH0KIAotICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA9PSAxIHx8IGRldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgIGlmIChvdXRwdXREZXNjLT5zdHJlYW1BY3RpdmVDb3VudChzdHJlYW0pID09IDEgfHwgZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7CiAgICAgICAgIC8vIHN0YXJ0aW5nIGFuIG91dHB1dCBiZWluZyByZXJvdXRlZD8KICAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewogICAgICAgICAgICAgZGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwpAQCAtMTI5OSwxMSArMTUzOSw2IEBACiAgICAgICAgIGNvbnN0IHVpbnQzMl90IG11dGVXYWl0TXMgPQogICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXREZXNjLCBkZXZpY2UsIGZvcmNlLCAwLCBOVUxMLCBhZGRyZXNzLCByZXF1aXJlc011dGVDaGVjayk7CiAKLSAgICAgICAgLy8gaGFuZGxlIHNwZWNpYWwgY2FzZSBmb3Igc29uaWZpY2F0aW9uIHdoaWxlIGluIGNhbGwKLSAgICAgICAgaWYgKGlzSW5DYWxsKCkpIHsKLSAgICAgICAgICAgIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbihzdHJlYW0sIHRydWUsIGZhbHNlKTsKLSAgICAgICAgfQotCiAgICAgICAgIC8vIGFwcGx5IHZvbHVtZSBydWxlcyBmb3IgY3VycmVudCBzdHJlYW0gYW5kIGRldmljZSBpZiBuZWNlc3NhcnkKICAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lQ3VydmVzLT5nZXRWb2x1bWVJbmRleChzdHJlYW0sIG91dHB1dERlc2MtPmRldmljZSgpKSwKQEAgLTEzMzcsNTMgKzE1NzIsMzQgQEAKICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX1NPTklGSUNBVElPTiwgdHJ1ZSwgb3V0cHV0RGVzYyk7CiAgICAgfQogCi0gICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSAmJgotICAgICAgICAgICAgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpIHsKLSAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX1NPTklGSUNBVElPTiwgdHJ1ZSwgb3V0cHV0RGVzYyk7CisgICAgLy8gQXV0b21hdGljYWxseSBlbmFibGUgdGhlIHJlbW90ZSBzdWJtaXggaW5wdXQgd2hlbiBvdXRwdXQgaXMgc3RhcnRlZCBvbiBhIHJlIHJvdXRpbmcgbWl4CisgICAgLy8gb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKKyAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UoZGV2aWNlKSAmJiBwb2xpY3lNaXggIT0gTlVMTCAmJgorICAgICAgICBwb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1JFQ09SREVSUykgeworICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVtb3RlLXN1Ym1peCIpOwogICAgIH0KIAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgQUxPR1YoInN0b3BPdXRwdXQoKSBvdXRwdXQgJWQsIHN0cmVhbSAlZCwgc2Vzc2lvbiAlZCIsIG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKLSAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dHMuaW5kZXhPZktleShvdXRwdXQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInN0b3BPdXRwdXQoKSB1bmtub3duIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgQUxPR1YoIiVzIHBvcnRJZCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKKworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMuZ2V0T3V0cHV0Rm9yQ2xpZW50KHBvcnRJZCk7CisgICAgaWYgKG91dHB1dERlc2MgPT0gMCkgeworICAgICAgICBBTE9HVygic3RvcE91dHB1dCgpIG5vIG91dHB1dCBmb3IgY2xpZW50ICVkIiwgcG9ydElkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CisgICAgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiBjbGllbnQgPSBvdXRwdXREZXNjLT5nZXRDbGllbnQocG9ydElkKTsKIAotICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpbmRleCk7CisgICAgQUxPR1YoInN0b3BPdXRwdXQoKSBvdXRwdXQgJWQsIHN0cmVhbSAlZCwgc2Vzc2lvbiAlZCIsCisgICAgICAgICAgb3V0cHV0RGVzYy0+bUlvSGFuZGxlLCBjbGllbnQtPnN0cmVhbSgpLCBjbGllbnQtPnNlc3Npb24oKSk7CiAKLSAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPT0gMSkgewotICAgICAgICAvLyBBdXRvbWF0aWNhbGx5IGRpc2FibGUgdGhlIHJlbW90ZSBzdWJtaXggaW5wdXQgd2hlbiBvdXRwdXQgaXMgc3RvcHBlZCBvbiBhCi0gICAgICAgIC8vIHJlIHJvdXRpbmcgbWl4IG9mIHR5cGUgTUlYX1RZUEVfUkVDT1JERVJTCi0gICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShvdXRwdXREZXNjLT5tRGV2aWNlKSAmJgotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Qb2xpY3lNaXggIT0gTlVMTCAmJgotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Qb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1JFQ09SREVSUykgewotICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLAotICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgInJlbW90ZS1zdWJtaXgiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFJvdXRpbmc/Ci0gICAgYm9vbCBmb3JjZURldmljZVVwZGF0ZSA9IGZhbHNlOwotICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA+IDApIHsKLSAgICAgICAgaW50IGFjdGl2aXR5Q291bnQgPSBtT3V0cHV0Um91dGVzLmRlY1JvdXRlQWN0aXZpdHkoc2Vzc2lvbik7Ci0gICAgICAgIGZvcmNlRGV2aWNlVXBkYXRlID0gKG1PdXRwdXRSb3V0ZXMuaGFzUm91dGUoc2Vzc2lvbikgJiYgKGFjdGl2aXR5Q291bnQgPT0gMCkpOwotCi0gICAgICAgIGlmIChmb3JjZURldmljZVVwZGF0ZSkgewotICAgICAgICAgICAgY2hlY2tTdHJhdGVneVJvdXRlKGdldFN0cmF0ZWd5KHN0cmVhbSksIEFVRElPX0lPX0hBTkRMRV9OT05FKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXR1c190IHN0YXR1cyA9IHN0b3BTb3VyY2Uob3V0cHV0RGVzYywgc3RyZWFtLCBmb3JjZURldmljZVVwZGF0ZSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RvcFNvdXJjZShvdXRwdXREZXNjLCBjbGllbnQpOwogCiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiApIHsKICAgICAgICAgb3V0cHV0RGVzYy0+c3RvcCgpOwpAQCAtMTM5MSwyNCArMTYwNywzOCBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcFNvdXJjZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZURldmljZVVwZGF0ZSkKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcFNvdXJjZShjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50KQogewogICAgIC8vIGFsd2F5cyBoYW5kbGUgc3RyZWFtIHN0b3AsIGNoZWNrIHdoaWNoIHN0cmVhbSB0eXBlIGlzIHN0b3BwaW5nCisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBjbGllbnQtPnN0cmVhbSgpOworCiAgICAgaGFuZGxlRXZlbnRGb3JCZWFjb24oc3RyZWFtID09IEFVRElPX1NUUkVBTV9UVFMgPyBTVE9QUElOR19CRUFDT04gOiBTVE9QUElOR19PVVRQVVQpOwogCi0gICAgLy8gaGFuZGxlIHNwZWNpYWwgY2FzZSBmb3Igc29uaWZpY2F0aW9uIHdoaWxlIGluIGNhbGwKLSAgICBpZiAoaXNJbkNhbGwoKSkgewotICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oc3RyZWFtLCBmYWxzZSwgZmFsc2UpOwotICAgIH0KKyAgICBpZiAob3V0cHV0RGVzYy0+c3RyZWFtQWN0aXZlQ291bnQoc3RyZWFtKSA+IDApIHsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPnN0cmVhbUFjdGl2ZUNvdW50KHN0cmVhbSkgPT0gMSkgeworICAgICAgICAgICAgLy8gQXV0b21hdGljYWxseSBkaXNhYmxlIHRoZSByZW1vdGUgc3VibWl4IGlucHV0IHdoZW4gb3V0cHV0IGlzIHN0b3BwZWQgb24gYQorICAgICAgICAgICAgLy8gcmUgcm91dGluZyBtaXggb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKKyAgICAgICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShvdXRwdXREZXNjLT5tRGV2aWNlKSAmJgorICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Qb2xpY3lNaXggIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Qb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1JFQ09SREVSUykgeworICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW1vdGUtc3VibWl4Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBmb3JjZURldmljZVVwZGF0ZSA9IGZhbHNlOworICAgICAgICBpZiAoY2xpZW50LT5oYXNQcmVmZXJyZWREZXZpY2UodHJ1ZSkpIHsKKyAgICAgICAgICAgIGNoZWNrU3RyYXRlZ3lSb3V0ZShnZXRTdHJhdGVneShzdHJlYW0pLCBBVURJT19JT19IQU5ETEVfTk9ORSk7CisgICAgICAgICAgICBmb3JjZURldmljZVVwZGF0ZSA9IHRydWU7CisgICAgICAgIH0KIAotICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA+IDApIHsKICAgICAgICAgLy8gZGVjcmVtZW50IHVzYWdlIGNvdW50IG9mIHRoaXMgc3RyZWFtIG9uIHRoZSBvdXRwdXQKLSAgICAgICAgb3V0cHV0RGVzYy0+Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCAtMSk7CisgICAgICAgIG91dHB1dERlc2MtPnNldENsaWVudEFjdGl2ZShjbGllbnQsIGZhbHNlKTsKIAogICAgICAgICAvLyBzdG9yZSB0aW1lIGF0IHdoaWNoIHRoZSBzdHJlYW0gd2FzIHN0b3BwZWQgLSBzZWUgaXNTdHJlYW1BY3RpdmUoKQotICAgICAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPT0gMCB8fCBmb3JjZURldmljZVVwZGF0ZSkgeworICAgICAgICBpZiAob3V0cHV0RGVzYy0+c3RyZWFtQWN0aXZlQ291bnQoc3RyZWFtKSA9PSAwIHx8IGZvcmNlRGV2aWNlVXBkYXRlKSB7CiAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU3RvcFRpbWVbc3RyZWFtXSA9IHN5c3RlbVRpbWUoKTsKICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CiAgICAgICAgICAgICAvLyBkZWxheSB0aGUgZGV2aWNlIHN3aXRjaCBieSB0d2ljZSB0aGUgbGF0ZW5jeSBiZWNhdXNlIHN0b3BPdXRwdXQoKSBpcyBleGVjdXRlZCB3aGVuCkBAIC0xNDU5LDM1ICsxNjg5LDQxIEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSBfX3VudXNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uIF9fdW51c2VkKQordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgQUxPR1YoInJlbGVhc2VPdXRwdXQoKSAlZCIsIG91dHB1dCk7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkob3V0cHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJyZWxlYXNlT3V0cHV0KCkgcmVsZWFzaW5nIHVua25vd24gb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICBBTE9HVigiJXMgcG9ydElkICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOworCisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy5nZXRPdXRwdXRGb3JDbGllbnQocG9ydElkKTsKKyAgICBpZiAob3V0cHV0RGVzYyA9PSAwKSB7CisgICAgICAgIC8vIElmIGFuIG91dHB1dCBkZXNjcmlwdG9yIGlzIGNsb3NlZCBkdWUgdG8gYSBkZXZpY2Ugcm91dGluZyBjaGFuZ2UsCisgICAgICAgIC8vIHRoZW4gdGhlcmUgYXJlIHJhY2UgY29uZGl0aW9ucyB3aXRoIHJlbGVhc2VPdXRwdXQgZnJvbSB0cmFja3MKKyAgICAgICAgLy8gdGhhdCBtYXkgYmUgZGVzdHJveWVkICh3aXRoIG5vIFBsYXliYWNrVGhyZWFkKSBvciBhIFBsYXliYWNrVGhyZWFkCisgICAgICAgIC8vIGRlc3Ryb3llZCBzaG9ydGx5IHRoZXJlYWZ0ZXIuCisgICAgICAgIC8vCisgICAgICAgIC8vIEhlcmUgd2UganVzdCBsb2cgYSB3YXJuaW5nLCBpbnN0ZWFkIG9mIGEgZmF0YWwgZXJyb3IuCisgICAgICAgIEFMT0dXKCJyZWxlYXNlT3V0cHV0KCkgbm8gb3V0cHV0IGZvciBjbGllbnQgJWQiLCBwb3J0SWQpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgLy8gUm91dGluZwotICAgIG1PdXRwdXRSb3V0ZXMucmVtb3ZlUm91dGUoc2Vzc2lvbik7CisgICAgQUxPR1YoInJlbGVhc2VPdXRwdXQoKSAlZCIsIG91dHB1dERlc2MtPm1Jb0hhbmRsZSk7CiAKLSAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaW5kZXgpOwotICAgIGlmIChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpIHsKLSAgICAgICAgaWYgKGRlc2MtPm1EaXJlY3RPcGVuQ291bnQgPD0gMCkgeworICAgIGlmIChvdXRwdXREZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpIHsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPm1EaXJlY3RPcGVuQ291bnQgPD0gMCkgewogICAgICAgICAgICAgQUxPR1coInJlbGVhc2VPdXRwdXQoKSBpbnZhbGlkIG9wZW4gY291bnQgJWQgZm9yIG91dHB1dCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1EaXJlY3RPcGVuQ291bnQsIG91dHB1dCk7CisgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGlyZWN0T3BlbkNvdW50LCBvdXRwdXREZXNjLT5tSW9IYW5kbGUpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIGlmICgtLWRlc2MtPm1EaXJlY3RPcGVuQ291bnQgPT0gMCkgewotICAgICAgICAgICAgY2xvc2VPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgaWYgKC0tb3V0cHV0RGVzYy0+bURpcmVjdE9wZW5Db3VudCA9PSAwKSB7CisgICAgICAgICAgICBjbG9zZU91dHB1dChvdXRwdXREZXNjLT5tSW9IYW5kbGUpOwogICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwogICAgICAgICB9CiAgICAgfQorICAgIC8vIHN0b3BPdXRwdXQoKSBuZWVkcyB0byBiZSBzdWNjZXNzZnVsbHkgY2FsbGVkIGJlZm9yZSByZWxlYXNlT3V0cHV0KCkKKyAgICAvLyBvdGhlcndpc2UgdGhlcmUgbWF5IGJlIGluYWNjdXJhdGUgc3RyZWFtIHJlZmVyZW5jZSBjb3VudHMuCisgICAgLy8gVGhpcyBpcyBjaGVja2VkIGluIG91dHB1dERlc2MtPnJlbW92ZUNsaWVudCBiZWxvdy4KKyAgICBvdXRwdXREZXNjLT5yZW1vdmVDbGllbnQocG9ydElkKTsKIH0KIAotCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKQEAgLTE1MDksMTcgKzE3NDUsMjMgQEAKICAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSA9IGF0dHItPnNvdXJjZTsKICAgICBBdWRpb01peCAqcG9saWN5TWl4ID0gTlVMTDsKICAgICBEZXZpY2VWZWN0b3IgaW5wdXREZXZpY2VzOworICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2M7CisgICAgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4gY2xpZW50RGVzYzsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHJlcXVlc3RlZERldmljZUlkID0gKnNlbGVjdGVkRGV2aWNlSWQ7CisgICAgYm9vbCBpc1NvdW5kVHJpZ2dlcjsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlOworCisgICAgLy8gVGhlIHN1cHBsaWVkIHBvcnRJZCBtdXN0IGJlIEFVRElPX1BPUlRfSEFORExFX05PTkUKKyAgICBpZiAoKnBvcnRJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CiAKICAgICBpZiAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0RFRkFVTFQpIHsKICAgICAgICAgaW5wdXRTb3VyY2UgPSBBVURJT19TT1VSQ0VfTUlDOwogICAgIH0KIAogICAgIC8vIEV4cGxpY2l0IHJvdXRpbmc/Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYzsKLSAgICBpZiAoKnNlbGVjdGVkRGV2aWNlSWQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgewotICAgICAgICBkZXZpY2VEZXNjID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQoKnNlbGVjdGVkRGV2aWNlSWQpOwotICAgIH0KLSAgICBtSW5wdXRSb3V0ZXMuYWRkUm91dGUoc2Vzc2lvbiwgU2Vzc2lvblJvdXRlOjpTVFJFQU1fVFlQRV9OQSwgaW5wdXRTb3VyY2UsIGRldmljZURlc2MsIHVpZCk7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKCpzZWxlY3RlZERldmljZUlkKTsKIAogICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgbW1hcCBjYXB0dXJlOiBpZiBhbiBpbnB1dCBJTyBoYW5kbGUgaXMgc3BlY2lmaWVkLCB3ZSByZXVzZSB0aGlzIGlucHV0IGlmCiAgICAgLy8gcG9zc2libGUKQEAgLTE1MzIsOCArMTc3NCw4IEBACiAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CiAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICBzcDxBdWRpb1Nlc3Npb24+IGF1ZGlvU2Vzc2lvbiA9IGlucHV0RGVzYy0+Z2V0QXVkaW9TZXNzaW9uKHNlc3Npb24pOwotICAgICAgICBpZiAoYXVkaW9TZXNzaW9uID09IDApIHsKKyAgICAgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGNsaWVudHMgPSBpbnB1dERlc2MtPmdldENsaWVudHNGb3JTZXNzaW9uKHNlc3Npb24pOworICAgICAgICBpZiAoY2xpZW50cy5zaXplKCkgPT0gMCkgewogICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIHVua25vd24gc2Vzc2lvbiAlZCBvbiBpbnB1dCAlZCIsIHNlc3Npb24sICppbnB1dCk7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwpAQCAtMTU0MiwyOSArMTc4NCwyOCBAQAogICAgICAgICAvLyBUaGUgc2Vjb25kIGNhbGwgaXMgZm9yIHRoZSBmaXJzdCBhY3RpdmUgY2xpZW50IGFuZCBzZXRzIHRoZSBVSUQuIEFueSBmdXJ0aGVyIGNhbGwKICAgICAgICAgLy8gY29ycmVzcG9uZHMgdG8gYSBuZXcgY2xpZW50IGFuZCBpcyBvbmx5IHBlcm1pdHRlZCBmcm9tIHRoZSBzYW1lIFVJRC4KICAgICAgICAgLy8gSWYgdGhlIGZpcnN0IFVJRCBpcyBzaWxlbmNlZCwgYWxsb3cgYSBuZXcgVUlEIGNvbm5lY3Rpb24gYW5kIHJlcGxhY2Ugd2l0aCBuZXcgVUlECi0gICAgICAgIGlmIChhdWRpb1Nlc3Npb24tPm9wZW5Db3VudCgpID09IDEpIHsKLSAgICAgICAgICAgIGF1ZGlvU2Vzc2lvbi0+c2V0VWlkKHVpZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYXVkaW9TZXNzaW9uLT51aWQoKSAhPSB1aWQpIHsKLSAgICAgICAgICAgIGlmICghYXVkaW9TZXNzaW9uLT5pc1NpbGVuY2VkKCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JBdHRyKCkgYmFkIHVpZCAlZCBmb3Igc2Vzc2lvbiAlZCB1aWQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgIHVpZCwgc2Vzc2lvbiwgYXVkaW9TZXNzaW9uLT51aWQoKSk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgaWYgKGNsaWVudHMuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBjbGllbnRzKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGNsaWVudCBtYXAgaXMgb3JkZXJlZCBieSBrZXkgdmFsdWVzIChwb3J0SWQpIGFuZCBwb3J0SWRzIGFyZSBhbGxvY2F0ZWQKKyAgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnRhbHkuIFNvIHRoZSBmaXJzdCBjbGllbnQgaW4gdGhpcyBsaXN0IGlzIHRoZSBvbmUgb3BlbmVkIGJ5IGF1ZGlvIGZsaW5nZXIKKyAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSBtbWFwIHN0cmVhbSBpcyBjcmVhdGVkIGFuZCBzaG91bGQgYmUgaWdub3JlZCBhcyBpdCBkb2VzIG5vdCBjb3JyZXNwb25kCisgICAgICAgICAgICAgICAgLy8gdG8gYW4gYWN0dWFsIGNsaWVudAorICAgICAgICAgICAgICAgIGlmIChjbGllbnQgPT0gKmNsaWVudHMuY2JlZ2luKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh1aWQgIT0gY2xpZW50LT51aWQoKSAmJiAhY2xpZW50LT5pc1NpbGVuY2VkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIGJhZCB1aWQgJWQgZm9yIGNsaWVudCAlZCB1aWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQsIGNsaWVudC0+cG9ydElkKCksIGNsaWVudC0+dWlkKCkpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdWRpb1Nlc3Npb24tPnNldFVpZCh1aWQpOwotICAgICAgICAgICAgYXVkaW9TZXNzaW9uLT5zZXRTaWxlbmNlZChmYWxzZSk7CiAgICAgICAgIH0KLSAgICAgICAgYXVkaW9TZXNzaW9uLT5jaGFuZ2VPcGVuQ291bnQoMSk7CiAgICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTEVHQUNZOwotICAgICAgICBpZiAoKnBvcnRJZCA9PSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAqcG9ydElkID0gQXVkaW9Qb3J0OjpnZXROZXh0VW5pcXVlSWQoKTsKLSAgICAgICAgfQotICAgICAgICBpbnB1dERldmljZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShpbnB1dERlc2MtPm1EZXZpY2UpOwotICAgICAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IGlucHV0RGV2aWNlcy5zaXplKCkgPiAwID8gaW5wdXREZXZpY2VzLml0ZW1BdCgwKS0+Z2V0SWQoKQotICAgICAgICAgICAgICAgIDogQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKLSAgICAgICAgQUxPR0koIiVzIHJldXNpbmcgTU1BUCBpbnB1dCAlZCBmb3Igc2Vzc2lvbiAlZCIsIF9fRlVOQ1RJT05fXywgKmlucHV0LCBzZXNzaW9uKTsKKyAgICAgICAgZGV2aWNlID0gaW5wdXREZXNjLT5tRGV2aWNlOwogCi0gICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgQUxPR0koIiVzIHJldXNpbmcgTU1BUCBpbnB1dCAlZCBmb3Igc2Vzc2lvbiAlZCIsIF9fRlVOQ1RJT05fXywgKmlucHV0LCBzZXNzaW9uKTsKKyAgICAgICAgZ290byBleGl0OwogICAgIH0KIAogICAgICppbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwpAQCAtMTU3MiwxMyArMTgxMyw2IEBACiAKICAgICBoYWxJbnB1dFNvdXJjZSA9IGlucHV0U291cmNlOwogCi0gICAgLy8gVE9ETzogY2hlY2sgZm9yIGV4aXN0aW5nIGNsaWVudCBmb3IgdGhpcyBwb3J0IElECi0gICAgaWYgKCpwb3J0SWQgPT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgewotICAgICAgICAqcG9ydElkID0gQXVkaW9Qb3J0OjpnZXROZXh0VW5pcXVlSWQoKTsKLSAgICB9Ci0KLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlOwotCiAgICAgaWYgKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYICYmCiAgICAgICAgICAgICBzdHJuY21wKGF0dHItPnRhZ3MsICJhZGRyPSIsIHN0cmxlbigiYWRkcj0iKSkgPT0gMCkgewogICAgICAgICBzdGF0dXMgPSBtUG9saWN5TWl4ZXMuZ2V0SW5wdXRNaXhGb3JBdHRyKCphdHRyLCAmcG9saWN5TWl4KTsKQEAgLTE1ODksNyArMTgyMywxMSBAQAogICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWDsKICAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoYXR0ci0+dGFncyArIHN0cmxlbigiYWRkcj0iKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoaW5wdXRTb3VyY2UsICZwb2xpY3lNaXgpOworICAgICAgICBpZiAoZGV2aWNlRGVzYyAhPSAwKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBkZXZpY2VEZXNjLT50eXBlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShpbnB1dFNvdXJjZSwgJnBvbGljeU1peCk7CisgICAgICAgIH0KICAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewogICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIGNvdWxkIG5vdCBmaW5kIGRldmljZSBmb3Igc291cmNlICVkIiwgaW5wdXRTb3VyY2UpOwogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwpAQCAtMTYxOCw3ICsxODU2LDcgQEAKIAogICAgIH0KIAotICAgICppbnB1dCA9IGdldElucHV0Rm9yRGV2aWNlKGRldmljZSwgYWRkcmVzcywgc2Vzc2lvbiwgdWlkLCBpbnB1dFNvdXJjZSwKKyAgICAqaW5wdXQgPSBnZXRJbnB1dEZvckRldmljZShkZXZpY2UsIGFkZHJlc3MsIHNlc3Npb24sIGlucHV0U291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZywgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5TWl4KTsKICAgICBpZiAoKmlucHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CkBAIC0xNjI2LDE3ICsxODY0LDI3IEBACiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCi0gICAgaW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKTsKLSAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IGlucHV0RGV2aWNlcy5zaXplKCkgPiAwID8gaW5wdXREZXZpY2VzLml0ZW1BdCgwKS0+Z2V0SWQoKQotICAgICAgICAgICAgOiBBVURJT19QT1JUX0hBTkRMRV9OT05FOworZXhpdDoKIAotICAgIEFMT0dWKCJnZXRJbnB1dEZvckF0dHIoKSByZXR1cm5zIGlucHV0ICVkIHR5cGUgJWQgc2VsZWN0ZWREZXZpY2VJZCAlZCIsCi0gICAgICAgICAgICAqaW5wdXQsICppbnB1dFR5cGUsICpzZWxlY3RlZERldmljZUlkKTsKKyAgICBpbnB1dERldmljZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZU1hc2soZGV2aWNlKTsKKyAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IGdldEZpcnN0RGV2aWNlSWQoaW5wdXREZXZpY2VzKTsKKworICAgIGlzU291bmRUcmlnZ2VyID0gaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQgJiYKKyAgICAgICAgbVNvdW5kVHJpZ2dlclNlc3Npb25zLmluZGV4T2ZLZXkoc2Vzc2lvbikgPiAwOworICAgICpwb3J0SWQgPSBBdWRpb1BvcnQ6OmdldE5leHRVbmlxdWVJZCgpOworCisgICAgY2xpZW50RGVzYyA9IG5ldyBSZWNvcmRDbGllbnREZXNjcmlwdG9yKCpwb3J0SWQsIHVpZCwgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYXR0ciwgKmNvbmZpZywgcmVxdWVzdGVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTb3VyY2UsZmxhZ3MsIGlzU291bmRUcmlnZ2VyKTsKKyAgICBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlRm9yKCppbnB1dCk7CisgICAgaW5wdXREZXNjLT5hZGRDbGllbnQoY2xpZW50RGVzYyk7CisKKyAgICBBTE9HVigiZ2V0SW5wdXRGb3JBdHRyKCkgcmV0dXJucyBpbnB1dCAlZCB0eXBlICVkIHNlbGVjdGVkRGV2aWNlSWQgJWQgZm9yIHBvcnQgSUQgJWQiLAorICAgICAgICAgICAgKmlucHV0LCAqaW5wdXRUeXBlLCAqc2VsZWN0ZWREZXZpY2VJZCwgKnBvcnRJZCk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiAKIGVycm9yOgotICAgIG1JbnB1dFJvdXRlcy5yZW1vdmVSb3V0ZShzZXNzaW9uKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xNjQ0LDcgKzE4OTIsNiBAQAogYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRJbnB1dEZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCkBAIC0xNzA2LDg2ICsxOTUzLDQxIEBACiAgICAgICAgIHJldHVybiBpbnB1dDsKICAgICB9CiAKLSAgICBzcDxBdWRpb1Nlc3Npb24+IGF1ZGlvU2Vzc2lvbiA9IG5ldyBBdWRpb1Nlc3Npb24oc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NvdW5kVHJpZ2dlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5TWl4LCBtcENsaWVudEludGVyZmFjZSk7Ci0KLS8vIEZJWE1FOiBkaXNhYmxlIGNvbmN1cnJlbnQgY2FwdHVyZSB1bnRpbCBVSSBpcyByZWFkeQotI2lmIDAKLSAgICAvLyByZXVzZSBhbiBvcGVuIGlucHV0IGlmIHBvc3NpYmxlCi0gICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IHJldXNlZElucHV0RGVzYzsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGRlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgIC8vIHJldXNlIGlucHV0IGlmOgotICAgICAgICAvLyAtIGl0IHNoYXJlcyB0aGUgc2FtZSBwcm9maWxlCi0gICAgICAgIC8vICAgICAgQU5ECi0gICAgICAgIC8vIC0gaXQgaXMgbm90IGEgcmVyb3V0ZSBzdWJtaXggaW5wdXQKLSAgICAgICAgLy8gICAgICBBTkQKLSAgICAgICAgLy8gLSBpdCBpczogbm90IHVzZWQgZm9yIHNvdW5kIHRyaWdnZXIKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgT1IKLSAgICAgICAgLy8gICAgICAgICAgdXNlZCBmb3Igc291bmQgdHJpZ2dlciBhbmQgYWxsIGNsaWVudHMgdXNlIHRoZSBzYW1lIHNlc3Npb24gSUQKLSAgICAgICAgLy8KLSAgICAgICAgaWYgKChwcm9maWxlID09IGRlc2MtPm1Qcm9maWxlKSAmJgotICAgICAgICAgICAgKGlzU291bmRUcmlnZ2VyID09IGRlc2MtPmlzU291bmRUcmlnZ2VyKCkpICYmCi0gICAgICAgICAgICAhaXNfdmlydHVhbF9pbnB1dF9kZXZpY2UoZGV2aWNlKSkgewotCi0gICAgICAgICAgICBzcDxBdWRpb1Nlc3Npb24+IGFzID0gZGVzYy0+Z2V0QXVkaW9TZXNzaW9uKHNlc3Npb24pOwotICAgICAgICAgICAgaWYgKGFzICE9IDApIHsKLSAgICAgICAgICAgICAgICAvLyBkbyBub3QgYWxsb3cgdW5tYXRjaGluZyBwcm9wZXJ0aWVzIG9uIHNhbWUgc2Vzc2lvbgotICAgICAgICAgICAgICAgIGlmIChhcy0+bWF0Y2hlcyhhdWRpb1Nlc3Npb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzLT5jaGFuZ2VPcGVuQ291bnQoMSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yRGV2aWNlKCkgcmVjb3JkIHdpdGggZGlmZmVyZW50IGF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgZXhpc3RzIGZvciBzZXNzaW9uICVkIiwgc2Vzc2lvbik7CisgICAgaWYgKCFwcm9maWxlLT5jYW5PcGVuTmV3SW8oKSkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyApIHsKKyAgICAgICAgICAgIHNwIDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1JbnB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmIChkZXNjLT5tUHJvZmlsZSAhPSBwcm9maWxlKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBpZiBzb3VuZCB0cmlnZ2VyLCByZXVzZSBpbnB1dCBpZiB1c2VkIGJ5IG90aGVyIHNvdW5kIHRyaWdnZXIgb24gc2FtZSBzZXNzaW9uCisgICAgICAgICAgICAvLyBlbHNlCisgICAgICAgICAgICAvLyAgICByZXVzZSBpbnB1dCBpZiBhY3RpdmUgY2xpZW50IGFwcCBpcyBub3QgaW4gSURMRSBzdGF0ZQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIFJlY29yZENsaWVudFZlY3RvciBjbGllbnRzID0gZGVzYy0+Y2xpZW50c0xpc3QoKTsKKyAgICAgICAgICAgIGJvb2wgZG9DbG9zZSA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBjbGllbnRzKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzU291bmRUcmlnZ2VyICE9IGNsaWVudC0+aXNTb3VuZFRyaWdnZXIoKSkgewogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzU291bmRUcmlnZ2VyKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKGNsaWVudC0+aXNTb3VuZFRyaWdnZXIoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBjbGllbnQtPnNlc3Npb24oKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2MtPm1Jb0hhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNsaWVudC0+YWN0aXZlKCkgJiYgY2xpZW50LT5hcHBTdGF0ZSgpICE9IEFQUF9TVEFURV9JRExFKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXNjLT5tSW9IYW5kbGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRvQ2xvc2UgPSB0cnVlOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBSZXVzZSB0aGUgYWxyZWFkeSBvcGVuZWQgaW5wdXQgc3RyZWFtIG9uIHRoaXMgcHJvZmlsZSBpZjoKLSAgICAgICAgICAgIC8vIC0gdGhlIG5ldyBjYXB0dXJlIHNvdXJjZSBpcyBiYWNrZ3JvdW5kIE9SCi0gICAgICAgICAgICAvLyAtIHRoZSBwYXRoIHJlcXVlc3RlZCBjb25maWd1cmF0aW9ucyBtYXRjaCBPUgotICAgICAgICAgICAgLy8gLSB0aGUgbmV3IHNvdXJjZSBwcmlvcml0eSBpcyBsZXNzIHRoYW4gdGhlIGhpZ2hlc3Qgc291cmNlIHByaW9yaXR5IG9uIHRoaXMgaW5wdXQKLSAgICAgICAgICAgIC8vIElmIHRoZSBpbnB1dCBzdHJlYW0gY2Fubm90IGJlIHJldXNlZCwgY2xvc2UgaXQgYmVmb3JlIG9wZW5pbmcgYSBuZXcgc3RyZWFtCi0gICAgICAgICAgICAvLyBvbiB0aGUgc2FtZSBwcm9maWxlIGZvciB0aGUgbmV3IGNsaWVudCBzbyB0aGF0IHRoZSByZXF1ZXN0ZWQgcGF0aCBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICAvLyBjYW4gYmUgc2VsZWN0ZWQuCi0gICAgICAgICAgICBpZiAoIWlzQ29uY3VycmVudFNvdXJjZShpbnB1dFNvdXJjZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKChkZXNjLT5tU2FtcGxpbmdSYXRlICE9IHNhbXBsaW5nUmF0ZSB8fAotICAgICAgICAgICAgICAgICAgICBkZXNjLT5tQ2hhbm5lbE1hc2sgIT0gY29uZmlnLT5jaGFubmVsX21hc2sgfHwKLSAgICAgICAgICAgICAgICAgICAgIWF1ZGlvX2Zvcm1hdHNfbWF0Y2goZGVzYy0+bUZvcm1hdCwgY29uZmlnLT5mb3JtYXQpKSAmJgotICAgICAgICAgICAgICAgICAgICAoc291cmNlX3ByaW9yaXR5KGRlc2MtPmdldEhpZ2hlc3RQcmlvcml0eVNvdXJjZShmYWxzZSAvKmFjdGl2ZU9ubHkqLykpIDwKLSAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9wcmlvcml0eShpbnB1dFNvdXJjZSkpKSkgewotICAgICAgICAgICAgICAgIHJldXNlZElucHV0RGVzYyA9IGRlc2M7Ci0gICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoZG9DbG9zZSkgeworICAgICAgICAgICAgICAgIGNsb3NlSW5wdXQoZGVzYy0+bUlvSGFuZGxlKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGVzYy0+YWRkQXVkaW9TZXNzaW9uKHNlc3Npb24sIGF1ZGlvU2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzOiByZXVzaW5nIGlucHV0ICVkIiwgX19GVU5DVElPTl9fLCBtSW5wdXRzLmtleUF0KGkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUlucHV0cy5rZXlBdChpKTsKKyAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAocmV1c2VkSW5wdXREZXNjICE9IDApIHsKLSAgICAgICAgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiBzZXNzaW9ucyA9IHJldXNlZElucHV0RGVzYy0+Z2V0QXVkaW9TZXNzaW9ucyhmYWxzZSAvKmFjdGl2ZU9ubHkqLyk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgc2Vzc2lvbnMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBjdXJyZW50U2Vzc2lvbiA9IHNlc3Npb25zLmtleUF0KGopOwotICAgICAgICAgICAgc3RvcElucHV0KHJldXNlZElucHV0RGVzYy0+bUlvSGFuZGxlLCBjdXJyZW50U2Vzc2lvbik7Ci0gICAgICAgICAgICByZWxlYXNlSW5wdXQocmV1c2VkSW5wdXREZXNjLT5tSW9IYW5kbGUsIGN1cnJlbnRTZXNzaW9uKTsKLSAgICAgICAgfQotICAgIH0KLSNlbmRpZgotCi0gICAgaWYgKCFwcm9maWxlLT5jYW5PcGVuTmV3SW8oKSkgewotICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgfQotCiAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG5ldyBBdWRpb0lucHV0RGVzY3JpcHRvcihwcm9maWxlLCBtcENsaWVudEludGVyZmFjZSk7CiAKICAgICBhdWRpb19jb25maWdfdCBsQ29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOwpAQCAtMTc5NCw5ICsxOTk2LDkgQEAKICAgICBsQ29uZmlnLmZvcm1hdCA9IHByb2ZpbGVGb3JtYXQ7CiAKICAgICBpZiAoYWRkcmVzcyA9PSAiIikgewotICAgICAgICBEZXZpY2VWZWN0b3IgaW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKTsKKyAgICAgICAgRGV2aWNlVmVjdG9yIGlucHV0RGV2aWNlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlTWFzayhkZXZpY2UpOwogICAgICAgICAvLyB0aGUgaW5wdXRzIHZlY3RvciBtdXN0IGJlIG9mIHNpemUgPj0gMSwgYnV0IHdlIGRvbid0IHdhbnQgdG8gY3Jhc2ggaGVyZQotICAgICAgICBhZGRyZXNzID0gaW5wdXREZXZpY2VzLnNpemUoKSA+IDAgPyBpbnB1dERldmljZXMuaXRlbUF0KDApLT5tQWRkcmVzcyA6IFN0cmluZzgoIiIpOworICAgICAgICBhZGRyZXNzID0gZ2V0Rmlyc3REZXZpY2VBZGRyZXNzKGlucHV0RGV2aWNlcyk7CiAgICAgfQogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5wdXREZXNjLT5vcGVuKCZsQ29uZmlnLCBkZXZpY2UsIGFkZHJlc3MsCkBAIC0xODE3LDcgKzIwMTksNiBAQAogICAgIH0KIAogICAgIGlucHV0RGVzYy0+bVBvbGljeU1peCA9IHBvbGljeU1peDsKLSAgICBpbnB1dERlc2MtPmFkZEF1ZGlvU2Vzc2lvbihzZXNzaW9uLCBhdWRpb1Nlc3Npb24pOwogCiAgICAgYWRkSW5wdXQoaW5wdXQsIGlucHV0RGVzYyk7CiAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwpAQCAtMTgyNSwzODkgKzIwMjYsMTc4IEBACiAgICAgcmV0dXJuIGlucHV0OwogfQogCi0vL3N0YXRpYwotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzQ29uY3VycmVudFNvdXJjZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgcmV0dXJuIChzb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHx8Ci0gICAgICAgICAgICAoc291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTikgfHwKLSAgICAgICAgICAgIChzb3VyY2UgPT0gQVVESU9fU09VUkNFX0ZNX1RVTkVSKTsKLX0KKyAgICBBTE9HVigiJXMgcG9ydElkICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOwogCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNDb25jdXJlbnRDYXB0dXJlQWxsb3dlZChjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4mIGlucHV0RGVzYywKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiYgYXVkaW9TZXNzaW9uKQotewotICAgIC8vIERvIG5vdCBhbGxvdyBjYXB0dXJlIGlmIGFuIGFjdGl2ZSB2b2ljZSBjYWxsIGlzIHVzaW5nIGEgc29mdHdhcmUgcGF0Y2ggYW5kCi0gICAgLy8gdGhlIGNhbGwgVFggc291cmNlIGRldmljZSBpcyBvbiB0aGUgc2FtZSBIVyBtb2R1bGUuCi0gICAgLy8gRklYTUU6IHdvdWxkIGJlIGJldHRlciB0byByZWZpbmUgdG8gb25seSBpbnB1dHMgd2hvc2UgcHJvZmlsZSBjb25uZWN0cyB0byB0aGUKLSAgICAvLyBjYWxsIFRYIGRldmljZSBidXQgdGhpcyBpbmZvcm1hdGlvbiBpcyBub3QgaW4gdGhlIGF1ZGlvIHBhdGNoCi0gICAgaWYgKG1DYWxsVHhQYXRjaCAhPSAwICYmCi0gICAgICAgIGlucHV0RGVzYy0+Z2V0TW9kdWxlSGFuZGxlKCkgPT0gbUNhbGxUeFBhdGNoLT5tUGF0Y2guc291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gc3RhcnRpbmcgY29uY3VycmVudCBjYXB0dXJlIGlzIGVuYWJsZWQgaWY6Ci0gICAgLy8gMSkgY2FwdHVyaW5nIGZvciByZS1yb3V0aW5nCi0gICAgLy8gMikgY2FwdHVyaW5nIGZvciBIT1RXT1JEIHNvdXJjZQotICAgIC8vIDMpIGNhcHR1cmluZyBmb3IgRk0gVFVORVIgc291cmNlCi0gICAgLy8gMykgQWxsIG90aGVyIGFjdGl2ZSBjYXB0dXJlcyBhcmUgZWl0aGVyIGZvciByZS1yb3V0aW5nIG9yIEhPVFdPUkQKLQotICAgIGlmIChpc192aXJ0dWFsX2lucHV0X2RldmljZShpbnB1dERlc2MtPm1EZXZpY2UpIHx8Ci0gICAgICAgICAgICBpc0NvbmN1cnJlbnRTb3VyY2UoYXVkaW9TZXNzaW9uLT5pbnB1dFNvdXJjZSgpKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBmb3IgKGNvbnN0IGF1dG8mIGFjdGl2ZUlucHV0IDogbUlucHV0cy5nZXRBY3RpdmVJbnB1dHMoKSkgewotICAgICAgICBpZiAoIWlzQ29uY3VycmVudFNvdXJjZShhY3RpdmVJbnB1dC0+aW5wdXRTb3VyY2UodHJ1ZSkpICYmCi0gICAgICAgICAgICAgICAgIWlzX3ZpcnR1YWxfaW5wdXRfZGV2aWNlKGFjdGl2ZUlucHV0LT5tRGV2aWNlKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIEZJWE1FOiByZW1vdmUgd2hlbiBjb25jdXJyZW50IGNhcHR1cmUgaXMgcmVhZHkuIFRoaXMgaXMgYSBoYWNrIHRvIHdvcmsgYXJvdW5kIGJ1ZyBiLzYzMDgzNTM3LgotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OnNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmUoKSB7Ci0gICAgaWYgKCFtSGFzQ29tcHV0ZWRTb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlKSB7Ci0gICAgICAgIGJvb2wgc291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZSA9IGZhbHNlOwotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtTW9kdWxlcyA9IDA7Ci0gICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yKiBuTW9kdWxlcyA9IE5VTEw7Ci0KLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gU291bmRUcmlnZ2VyOjpsaXN0TW9kdWxlcyhuTW9kdWxlcywgJm51bU1vZHVsZXMpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIG51bU1vZHVsZXMgIT0gMCkgewotICAgICAgICAgICAgbk1vZHVsZXMgPSAoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IqKSBjYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgIG51bU1vZHVsZXMsIHNpemVvZihzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvcikpOwotICAgICAgICAgICAgaWYgKG5Nb2R1bGVzID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgLy8gV2UgZmFpbGVkIHRvIG1hbGxvYyB0aGUgYnVmZmVyLCBzbyBqdXN0IHNheSBubyBmb3Igbm93LCBhbmQgaG9wZSB0aGF0IHdlIGhhdmUgbW9yZQotICAgICAgICAgICAgICAvLyByYW0gdGhlIG5leHQgdGltZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4KLSAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgZm9yIG1vZHVsZSBkZXNjcmlwdG9ycyIpOwotICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0YXR1cyA9IFNvdW5kVHJpZ2dlcjo6bGlzdE1vZHVsZXMobk1vZHVsZXMsICZudW1Nb2R1bGVzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBzb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bU1vZHVsZXM7ICsraSkgewotICAgICAgICAgICAgICAgICAgICBzb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlICY9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbk1vZHVsZXNbaV0ucHJvcGVydGllcy5jb25jdXJyZW50X2NhcHR1cmU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJlZShuTW9kdWxlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgbVNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmUgPSBzb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlOwotICAgICAgICBtSGFzQ29tcHV0ZWRTb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlID0gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIG1Tb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlOwotfQotCi0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNpbGVuY2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmN1cnJlbmN5X3R5cGVfX21hc2tfdCAqY29uY3VycmVuY3kpCi17Ci0KLSAgICBBTE9HVigiQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydElucHV0KGlucHV0OiVkLCBzZXNzaW9uOiVkLCBzaWxlbmNlZDolZCwgY29uY3VycmVuY3k6JWQpIiwKLSAgICAgICAgICAgIGlucHV0LCBzZXNzaW9uLCBzaWxlbmNlZCwgKmNvbmN1cnJlbmN5KTsKLQotICAgICpjb25jdXJyZW5jeSA9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9OT05FOwotCi0gICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dHMuaW5kZXhPZktleShpbnB1dCk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygic3RhcnRJbnB1dCgpIHVua25vd24gaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMuZ2V0SW5wdXRGb3JDbGllbnQocG9ydElkKTsKKyAgICBpZiAoaW5wdXREZXNjID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzIG5vIGlucHV0IGZvciBjbGllbnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOwotCi0gICAgc3A8QXVkaW9TZXNzaW9uPiBhdWRpb1Nlc3Npb24gPSBpbnB1dERlc2MtPmdldEF1ZGlvU2Vzc2lvbihzZXNzaW9uKTsKLSAgICBpZiAoYXVkaW9TZXNzaW9uID09IDApIHsKLSAgICAgICAgQUxPR1coInN0YXJ0SW5wdXQoKSB1bmtub3duIHNlc3Npb24gJWQgb24gaW5wdXQgJWQiLCBzZXNzaW9uLCBpbnB1dCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0vLyBGSVhNRTogZGlzYWJsZSBjb25jdXJyZW50IGNhcHR1cmUgdW50aWwgVUkgaXMgcmVhZHkKLSNpZiAwCi0gICAgaWYgKCFpc0NvbmN1cmVudENhcHR1cmVBbGxvd2VkKGlucHV0RGVzYywgYXVkaW9TZXNzaW9uKSkgewotICAgICAgICBBTE9HVygic3RhcnRJbnB1dCglZCkgZmFpbGVkOiBvdGhlciBpbnB1dCBhbHJlYWR5IHN0YXJ0ZWQiLCBpbnB1dCk7CisgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBpbnB1dERlc2MtPm1Jb0hhbmRsZTsKKyAgICBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiBjbGllbnQgPSBpbnB1dERlc2MtPmdldENsaWVudChwb3J0SWQpOworICAgIGlmIChjbGllbnQtPmFjdGl2ZSgpKSB7CisgICAgICAgIEFMT0dXKCIlcyBpbnB1dCAlZCBjbGllbnQgJWQgYWxyZWFkeSBzdGFydGVkIiwgX19GVU5DVElPTl9fLCBpbnB1dCwgY2xpZW50LT5wb3J0SWQoKSk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBpZiAoaXNJbkNhbGwoKSkgewotICAgICAgICAqY29uY3VycmVuY3kgfD0gQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBTEw7CisgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSBjbGllbnQtPnNlc3Npb24oKTsKKworICAgIEFMT0dWKCIlcyBpbnB1dDolZCwgc2Vzc2lvbjolZCkiLCBfX0ZVTkNUSU9OX18sIGlucHV0LCBzZXNzaW9uKTsKKworICAgIFZlY3RvcjxzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4+IGFjdGl2ZUlucHV0cyA9IG1JbnB1dHMuZ2V0QWN0aXZlSW5wdXRzKCk7CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbnB1dERlc2MtPnN0YXJ0KCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KLSAgICBpZiAobUlucHV0cy5hY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcygpICE9IDApIHsKLSAgICAgICAgKmNvbmN1cnJlbmN5IHw9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQVBUVVJFOwotICAgIH0KLSNlbHNlCi0gICAgaWYgKCFpc192aXJ0dWFsX2lucHV0X2RldmljZShpbnB1dERlc2MtPm1EZXZpY2UpKSB7Ci0gICAgICAgIGlmIChtQ2FsbFR4UGF0Y2ggIT0gMCAmJgotICAgICAgICAgICAgaW5wdXREZXNjLT5nZXRNb2R1bGVIYW5kbGUoKSA9PSBtQ2FsbFR4UGF0Y2gtPm1QYXRjaC5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlKSB7Ci0gICAgICAgICAgICBBTE9HVygic3RhcnRJbnB1dCglZCkgZmFpbGVkOiBjYWxsIGluIHByb2dyZXNzIiwgaW5wdXQpOwotICAgICAgICAgICAgKmNvbmN1cnJlbmN5IHw9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQUxMOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9CiAKLSAgICAgICAgVmVjdG9yPHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPj4gYWN0aXZlSW5wdXRzID0gbUlucHV0cy5nZXRBY3RpdmVJbnB1dHMoKTsKLQotICAgICAgICAvLyBJZiBhIFVJRCBpcyBpZGxlIGFuZCByZWNvcmRzIHNpbGVuY2UgYW5kIGFub3RoZXIgbm90IHNpbGVuY2VkIHJlY29yZGluZyBzdGFydHMKLSAgICAgICAgLy8gZnJvbSBhbm90aGVyIFVJRCAoaWRsZSBvciBhY3RpdmUpIHdlIHN0b3AgdGhlIGN1cnJlbnQgaWRsZSBVSUQgcmVjb3JkaW5nIGluCi0gICAgICAgIC8vIGZhdm9yIG9mIHRoZSBuZXcgb25lIC0gIlRoZXJlIGNhbiBiZSBvbmx5IG9uZSIgVE0KLSAgICAgICAgaWYgKCFzaWxlbmNlZCkgewotICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhY3RpdmVEZXNjIDogYWN0aXZlSW5wdXRzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChhdWRpb1Nlc3Npb24tPmZsYWdzKCkgJiBBVURJT19JTlBVVF9GTEFHX01NQVBfTk9JUlEpICE9IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZURlc2MtPmdldElkKCkgPT0gaW5wdXREZXNjLT5nZXRJZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uIGFjdGl2ZVNlc3Npb25zID0gYWN0aXZlRGVzYy0+Z2V0QXVkaW9TZXNzaW9ucygKLSAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyphY3RpdmVPbmx5Ki8pOwotICAgICAgICAgICAgICAgIHNwPEF1ZGlvU2Vzc2lvbj4gYWN0aXZlU2Vzc2lvbiA9IGFjdGl2ZVNlc3Npb25zLnZhbHVlQXQoMCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVNlc3Npb24tPmlzU2lsZW5jZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBhY3RpdmVJbnB1dCA9IGFjdGl2ZURlc2MtPm1Jb0hhbmRsZTsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IGFjdGl2ZVNlc3Npb25JZCA9IGFjdGl2ZVNlc3Npb24tPnNlc3Npb24oKTsKLSAgICAgICAgICAgICAgICAgICAgc3RvcElucHV0KGFjdGl2ZUlucHV0LCBhY3RpdmVTZXNzaW9uSWQpOwotICAgICAgICAgICAgICAgICAgICByZWxlYXNlSW5wdXQoYWN0aXZlSW5wdXQsIGFjdGl2ZVNlc3Npb25JZCk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzdGFydElucHV0KCVkKSBzdG9wcGluZyBzaWxlbmNlZCBpbnB1dCAlZCIsIGlucHV0LCBhY3RpdmVJbnB1dCk7Ci0gICAgICAgICAgICAgICAgICAgIGFjdGl2ZUlucHV0cyA9IG1JbnB1dHMuZ2V0QWN0aXZlSW5wdXRzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhY3RpdmVEZXNjIDogYWN0aXZlSW5wdXRzKSB7Ci0gICAgICAgICAgICBpZiAoKGF1ZGlvU2Vzc2lvbi0+ZmxhZ3MoKSAmIEFVRElPX0lOUFVUX0ZMQUdfTU1BUF9OT0lSUSkgIT0gMCAmJgotICAgICAgICAgICAgICAgICAgICBhY3RpdmVEZXNjLT5nZXRJZCgpID09IGlucHV0RGVzYy0+Z2V0SWQoKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBhY3RpdmVTb3VyY2UgPSBhY3RpdmVEZXNjLT5pbnB1dFNvdXJjZSh0cnVlKTsKLSAgICAgICAgICAgIGlmIChhdWRpb1Nlc3Npb24tPmlucHV0U291cmNlKCkgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKLSAgICAgICAgICAgICAgICBpZiAoYWN0aXZlU291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVEZXNjLT5oYXNQcmVlbXB0ZWRTZXNzaW9uKHNlc3Npb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygic3RhcnRJbnB1dCglZCkgZmFpbGVkIGZvciBIT1RXT1JEOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdGhlciBpbnB1dCAlZCBhbHJlYWR5IHN0YXJ0ZWQgZm9yIEhPVFdPUkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsIGFjdGl2ZURlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqY29uY3VycmVuY3kgfD0gQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0hPVFdPUkQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigic3RhcnRJbnB1dCglZCkgZmFpbGVkIGZvciBIT1RXT1JEOiBvdGhlciBpbnB1dCAlZCBhbHJlYWR5IHN0YXJ0ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgYWN0aXZlRGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgKmNvbmN1cnJlbmN5IHw9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQVBUVVJFOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoYWN0aXZlU291cmNlICE9IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJzdGFydElucHV0KCVkKSBmYWlsZWQ6IG90aGVyIGlucHV0ICVkIGFscmVhZHkgc3RhcnRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCBhY3RpdmVEZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAqY29uY3VycmVuY3kgfD0gQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBUFRVUkU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBvbmx5IG5lZWQgdG8gY2hlY2sgaWYgdGhlIHNvdW5kIHRyaWdnZXIgc2Vzc2lvbiBzdXBwb3J0cyBjb25jdXJyZW50IGNhcHR1cmUgaWYgdGhlCi0gICAgICAgIC8vIGlucHV0IGlzIGFsc28gYSBzb3VuZCB0cmlnZ2VyIGlucHV0LiBPdGhlcndpc2UsIHdlIHNob3VsZCBwcmVlbXB0IGFueSBob3R3b3JkIHN0cmVhbQotICAgICAgICAvLyB0aGF0J3MgcnVubmluZy4KLSAgICAgICAgY29uc3QgYm9vbCBhbGxvd0NvbmN1cnJlbnRXaXRoU291bmRUcmlnZ2VyID0KLSAgICAgICAgICAgIGlucHV0RGVzYy0+aXNTb3VuZFRyaWdnZXIoKSA/IHNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmUoKSA6IGZhbHNlOwotCi0gICAgICAgIC8vIGlmIGNhcHR1cmUgaXMgYWxsb3dlZCwgcHJlZW1wdCBjdXJyZW50bHkgYWN0aXZlIEhPVFdPUkQgY2FwdHVyZXMKLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhY3RpdmVEZXNjIDogYWN0aXZlSW5wdXRzKSB7Ci0gICAgICAgICAgICBpZiAoYWxsb3dDb25jdXJyZW50V2l0aFNvdW5kVHJpZ2dlciAmJiBhY3RpdmVEZXNjLT5pc1NvdW5kVHJpZ2dlcigpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGFjdGl2ZVNvdXJjZSA9IGFjdGl2ZURlc2MtPmlucHV0U291cmNlKHRydWUpOwotICAgICAgICAgICAgaWYgKGFjdGl2ZVNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgewotICAgICAgICAgICAgICAgIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gYWN0aXZlU2Vzc2lvbnMgPQotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlRGVzYy0+Z2V0QXVkaW9TZXNzaW9ucyh0cnVlIC8qYWN0aXZlT25seSovKTsKLSAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgYWN0aXZlU2Vzc2lvbiA9IGFjdGl2ZVNlc3Npb25zLmtleUF0KDApOwotICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGFjdGl2ZUhhbmRsZSA9IGFjdGl2ZURlc2MtPm1Jb0hhbmRsZTsKLSAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90PiBzZXNzaW9ucyA9IGFjdGl2ZURlc2MtPmdldFByZWVtcHRlZFNlc3Npb25zKCk7Ci0gICAgICAgICAgICAgICAgKmNvbmN1cnJlbmN5IHw9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9QUkVFTVBUOwotICAgICAgICAgICAgICAgIHNlc3Npb25zLmFkZChhY3RpdmVTZXNzaW9uKTsKLSAgICAgICAgICAgICAgICBpbnB1dERlc2MtPnNldFByZWVtcHRlZFNlc3Npb25zKHNlc3Npb25zKTsKLSAgICAgICAgICAgICAgICBzdG9wSW5wdXQoYWN0aXZlSGFuZGxlLCBhY3RpdmVTZXNzaW9uKTsKLSAgICAgICAgICAgICAgICByZWxlYXNlSW5wdXQoYWN0aXZlSGFuZGxlLCBhY3RpdmVTZXNzaW9uKTsKLSAgICAgICAgICAgICAgICBBTE9HVigic3RhcnRJbnB1dCglZCkgZm9yIEhPVFdPUkQgcHJlZW1wdGluZyBIT1RXT1JEIGlucHV0ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgYWN0aXZlRGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSNlbmRpZgotCi0gICAgLy8gTWFrZSBzdXJlIHdlIHN0YXJ0IHdpdGggdGhlIGNvcnJlY3Qgc2lsZW5jZSBzdGF0ZQotICAgIGF1ZGlvU2Vzc2lvbi0+c2V0U2lsZW5jZWQoc2lsZW5jZWQpOwotCi0gICAgLy8gaW5jcmVtZW50IGFjdGl2aXR5IGNvdW50IGJlZm9yZSBjYWxsaW5nIGdldE5ld0lucHV0RGV2aWNlKCkgYmVsb3cgYXMgb25seSBhY3RpdmUgc2Vzc2lvbnMKKyAgLy8gaW5jcmVtZW50IGFjdGl2aXR5IGNvdW50IGJlZm9yZSBjYWxsaW5nIGdldE5ld0lucHV0RGV2aWNlKCkgYmVsb3cgYXMgb25seSBhY3RpdmUgc2Vzc2lvbnMKICAgICAvLyBhcmUgY29uc2lkZXJlZCBmb3IgZGV2aWNlIHNlbGVjdGlvbgotICAgIGF1ZGlvU2Vzc2lvbi0+Y2hhbmdlQWN0aXZlQ291bnQoMSk7CisgICAgaW5wdXREZXNjLT5zZXRDbGllbnRBY3RpdmUoY2xpZW50LCB0cnVlKTsKIAotICAgIC8vIFJvdXRpbmc/Ci0gICAgbUlucHV0Um91dGVzLmluY1JvdXRlQWN0aXZpdHkoc2Vzc2lvbik7CisgICAgLy8gaW5kaWNhdGUgYWN0aXZlIGNhcHR1cmUgdG8gc291bmQgdHJpZ2dlciBzZXJ2aWNlIGlmIHN0YXJ0aW5nIGNhcHR1cmUgZnJvbSBhIG1pYyBvbgorICAgIC8vIHByaW1hcnkgSFcgbW9kdWxlCisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldE5ld0lucHV0RGV2aWNlKGlucHV0RGVzYyk7CisgICAgc2V0SW5wdXREZXZpY2UoaW5wdXQsIGRldmljZSwgdHJ1ZSAvKiBmb3JjZSAqLyk7CiAKLSAgICBpZiAoYXVkaW9TZXNzaW9uLT5hY3RpdmVDb3VudCgpID09IDEgfHwgbUlucHV0Um91dGVzLmdldEFuZENsZWFyUm91dGVDaGFuZ2VkKHNlc3Npb24pKSB7Ci0gICAgICAgIC8vIGluZGljYXRlIGFjdGl2ZSBjYXB0dXJlIHRvIHNvdW5kIHRyaWdnZXIgc2VydmljZSBpZiBzdGFydGluZyBjYXB0dXJlIGZyb20gYSBtaWMgb24KLSAgICAgICAgLy8gcHJpbWFyeSBIVyBtb2R1bGUKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldE5ld0lucHV0RGV2aWNlKGlucHV0RGVzYyk7Ci0gICAgICAgIHNldElucHV0RGV2aWNlKGlucHV0LCBkZXZpY2UsIHRydWUgLyogZm9yY2UgKi8pOwotCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGlucHV0RGVzYy0+c3RhcnQoKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgbUlucHV0Um91dGVzLmRlY1JvdXRlQWN0aXZpdHkoc2Vzc2lvbik7Ci0gICAgICAgICAgICBhdWRpb1Nlc3Npb24tPmNoYW5nZUFjdGl2ZUNvdW50KC0xKTsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgaWYgKGlucHV0RGVzYy0+YWN0aXZlQ291bnQoKSAgPT0gMSkgeworICAgICAgICAvLyBpZiBpbnB1dCBtYXBzIHRvIGEgZHluYW1pYyBwb2xpY3kgd2l0aCBhbiBhY3Rpdml0eSBsaXN0ZW5lciwgbm90aWZ5IG9mIHN0YXRlIGNoYW5nZQorICAgICAgICBpZiAoKGlucHV0RGVzYy0+bVBvbGljeU1peCAhPSBOVUxMKQorICAgICAgICAgICAgICAgICYmICgoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgTUlYX1NUQVRFX01JWElORyk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoaW5wdXREZXNjLT5nZXRBdWRpb1Nlc3Npb25Db3VudCh0cnVlLyphY3RpdmVPbmx5Ki8pID09IDEpIHsKLSAgICAgICAgICAgIC8vIGlmIGlucHV0IG1hcHMgdG8gYSBkeW5hbWljIHBvbGljeSB3aXRoIGFuIGFjdGl2aXR5IGxpc3RlbmVyLCBub3RpZnkgb2Ygc3RhdGUgY2hhbmdlCi0gICAgICAgICAgICBpZiAoKGlucHV0RGVzYy0+bVBvbGljeU1peCAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAmJiAoKGlucHV0RGVzYy0+bVBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkgewotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgTUlYX1NUQVRFX01JWElORyk7Ci0gICAgICAgICAgICB9CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcmltYXJ5SW5wdXREZXZpY2VzID0gYXZhaWxhYmxlUHJpbWFyeUlucHV0RGV2aWNlcygpOworICAgICAgICBpZiAoKChkZXZpY2UgJiBwcmltYXJ5SW5wdXREZXZpY2VzICYgfkFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApICYmCisgICAgICAgICAgICAgICAgbUlucHV0cy5hY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcyhwcmltYXJ5SW5wdXREZXZpY2VzKSA9PSAxKSB7CisgICAgICAgICAgICBTb3VuZFRyaWdnZXI6OnNldENhcHR1cmVTdGF0ZSh0cnVlKTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgcHJpbWFyeUlucHV0RGV2aWNlcyA9IGF2YWlsYWJsZVByaW1hcnlJbnB1dERldmljZXMoKTsKLSAgICAgICAgICAgIGlmICgoKGRldmljZSAmIHByaW1hcnlJbnB1dERldmljZXMgJiB+QVVESU9fREVWSUNFX0JJVF9JTikgIT0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgbUlucHV0cy5hY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcyhwcmltYXJ5SW5wdXREZXZpY2VzKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgU291bmRUcmlnZ2VyOjpzZXRDYXB0dXJlU3RhdGUodHJ1ZSk7CisgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgZW5hYmxlIHRoZSByZW1vdGUgc3VibWl4IG91dHB1dCB3aGVuIGlucHV0IGlzIHN0YXJ0ZWQgaWYgbm90CisgICAgICAgIC8vIHVzZWQgYnkgYSBwb2xpY3kgbWl4IG9mIHR5cGUgTUlYX1RZUEVfUkVDT1JERVJTCisgICAgICAgIC8vIEZvciByZW1vdGUgc3VibWl4IChhIHZpcnR1YWwgZGV2aWNlKSwgd2Ugb3BlbiBvbmx5IG9uZSBpbnB1dCBwZXIgY2FwdHVyZSByZXF1ZXN0LgorICAgICAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UoaW5wdXREZXNjLT5tRGV2aWNlKSkgeworICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOCgiIik7CisgICAgICAgICAgICBpZiAoaW5wdXREZXNjLT5tUG9saWN5TWl4ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBhZGRyZXNzID0gU3RyaW5nOCgiMCIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKKyAgICAgICAgICAgICAgICBhZGRyZXNzID0gaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzczsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYXV0b21hdGljYWxseSBlbmFibGUgdGhlIHJlbW90ZSBzdWJtaXggb3V0cHV0IHdoZW4gaW5wdXQgaXMgc3RhcnRlZCBpZiBub3QKLSAgICAgICAgICAgIC8vIHVzZWQgYnkgYSBwb2xpY3kgbWl4IG9mIHR5cGUgTUlYX1RZUEVfUkVDT1JERVJTCi0gICAgICAgICAgICAvLyBGb3IgcmVtb3RlIHN1Ym1peCAoYSB2aXJ0dWFsIGRldmljZSksIHdlIG9wZW4gb25seSBvbmUgaW5wdXQgcGVyIGNhcHR1cmUgcmVxdWVzdC4KLSAgICAgICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShpbnB1dERlc2MtPm1EZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOCgiIik7Ci0gICAgICAgICAgICAgICAgaWYgKGlucHV0RGVzYy0+bVBvbGljeU1peCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KCIwIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9IGlucHV0RGVzYy0+bVBvbGljeU1peC0+bURldmljZUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhZGRyZXNzICE9ICIiKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywgInJlbW90ZS1zdWJtaXgiKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWRkcmVzcyAhPSAiIikgeworICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsICJyZW1vdGUtc3VibWl4Iik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBBTE9HVigiQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydElucHV0KCkgaW5wdXQgc291cmNlID0gJWQiLCBhdWRpb1Nlc3Npb24tPmlucHV0U291cmNlKCkpOworICAgIEFMT0dWKCIlcyBpbnB1dCAlZCBzb3VyY2UgPSAlZCBleGl0IiwgX19GVU5DVElPTl9fLCBpbnB1dCwgY2xpZW50LT5zb3VyY2UoKSk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKLSAgICBBTE9HVigic3RvcElucHV0KCkgaW5wdXQgJWQiLCBpbnB1dCk7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dHMuaW5kZXhPZktleShpbnB1dCk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygic3RvcElucHV0KCkgdW5rbm93biBpbnB1dCAlZCIsIGlucHV0KTsKKyAgICBBTE9HVigiJXMgcG9ydElkICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOworCisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMuZ2V0SW5wdXRGb3JDbGllbnQocG9ydElkKTsKKyAgICBpZiAoaW5wdXREZXNjID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzIG5vIGlucHV0IGZvciBjbGllbnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOwotCi0gICAgc3A8QXVkaW9TZXNzaW9uPiBhdWRpb1Nlc3Npb24gPSBpbnB1dERlc2MtPmdldEF1ZGlvU2Vzc2lvbihzZXNzaW9uKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJzdG9wSW5wdXQoKSB1bmtub3duIHNlc3Npb24gJWQgb24gaW5wdXQgJWQiLCBzZXNzaW9uLCBpbnB1dCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgaWYgKGF1ZGlvU2Vzc2lvbi0+YWN0aXZlQ291bnQoKSA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCJzdG9wSW5wdXQoKSBpbnB1dCAlZCBhbHJlYWR5IHN0b3BwZWQiLCBpbnB1dCk7CisgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBpbnB1dERlc2MtPm1Jb0hhbmRsZTsKKyAgICBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiBjbGllbnQgPSBpbnB1dERlc2MtPmdldENsaWVudChwb3J0SWQpOworICAgIGlmICghY2xpZW50LT5hY3RpdmUoKSkgeworICAgICAgICBBTE9HVygiJXMgaW5wdXQgJWQgY2xpZW50ICVkIGFscmVhZHkgc3RvcHBlZCIsIF9fRlVOQ1RJT05fXywgaW5wdXQsIGNsaWVudC0+cG9ydElkKCkpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgYXVkaW9TZXNzaW9uLT5jaGFuZ2VBY3RpdmVDb3VudCgtMSk7CisgICAgaW5wdXREZXNjLT5zZXRDbGllbnRBY3RpdmUoY2xpZW50LCBmYWxzZSk7CiAKLSAgICAvLyBSb3V0aW5nPwotICAgIG1JbnB1dFJvdXRlcy5kZWNSb3V0ZUFjdGl2aXR5KHNlc3Npb24pOwotCi0gICAgaWYgKGF1ZGlvU2Vzc2lvbi0+YWN0aXZlQ291bnQoKSA9PSAwKSB7Ci0gICAgICAgIGlucHV0RGVzYy0+c3RvcCgpOwotICAgICAgICBpZiAoaW5wdXREZXNjLT5pc0FjdGl2ZSgpKSB7Ci0gICAgICAgICAgICBzZXRJbnB1dERldmljZShpbnB1dCwgZ2V0TmV3SW5wdXREZXZpY2UoaW5wdXREZXNjKSwgZmFsc2UgLyogZm9yY2UgKi8pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gaWYgaW5wdXQgbWFwcyB0byBhIGR5bmFtaWMgcG9saWN5IHdpdGggYW4gYWN0aXZpdHkgbGlzdGVuZXIsIG5vdGlmeSBvZiBzdGF0ZSBjaGFuZ2UKLSAgICAgICAgICAgIGlmICgoaW5wdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICYmICgoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGlucHV0RGVzYy0+bVBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfSURMRSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgZGlzYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBvdXRwdXQgd2hlbiBpbnB1dCBpcyBzdG9wcGVkIGlmIG5vdAotICAgICAgICAgICAgLy8gdXNlZCBieSBhIHBvbGljeSBtaXggb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKLSAgICAgICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShpbnB1dERlc2MtPm1EZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOCgiIik7Ci0gICAgICAgICAgICAgICAgaWYgKGlucHV0RGVzYy0+bVBvbGljeU1peCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KCIwIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9IGlucHV0RGVzYy0+bVBvbGljeU1peC0+bURldmljZUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhZGRyZXNzICE9ICIiKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywgInJlbW90ZS1zdWJtaXgiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBpbnB1dERlc2MtPm1EZXZpY2U7Ci0gICAgICAgICAgICByZXNldElucHV0RGV2aWNlKGlucHV0KTsKLQotICAgICAgICAgICAgLy8gaW5kaWNhdGUgaW5hY3RpdmUgY2FwdHVyZSB0byBzb3VuZCB0cmlnZ2VyIHNlcnZpY2UgaWYgc3RvcHBpbmcgY2FwdHVyZSBmcm9tIGEgbWljIG9uCi0gICAgICAgICAgICAvLyBwcmltYXJ5IEhXIG1vZHVsZQotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHByaW1hcnlJbnB1dERldmljZXMgPSBhdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCk7Ci0gICAgICAgICAgICBpZiAoKChkZXZpY2UgJiBwcmltYXJ5SW5wdXREZXZpY2VzICYgfkFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApICYmCi0gICAgICAgICAgICAgICAgICAgIG1JbnB1dHMuYWN0aXZlSW5wdXRzQ291bnRPbkRldmljZXMocHJpbWFyeUlucHV0RGV2aWNlcykgPT0gMCkgewotICAgICAgICAgICAgICAgIFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0RGVzYy0+Y2xlYXJQcmVlbXB0ZWRTZXNzaW9ucygpOworICAgIGlucHV0RGVzYy0+c3RvcCgpOworICAgIGlmIChpbnB1dERlc2MtPmlzQWN0aXZlKCkpIHsKKyAgICAgICAgc2V0SW5wdXREZXZpY2UoaW5wdXQsIGdldE5ld0lucHV0RGV2aWNlKGlucHV0RGVzYyksIGZhbHNlIC8qIGZvcmNlICovKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBpZiBpbnB1dCBtYXBzIHRvIGEgZHluYW1pYyBwb2xpY3kgd2l0aCBhbiBhY3Rpdml0eSBsaXN0ZW5lciwgbm90aWZ5IG9mIHN0YXRlIGNoYW5nZQorICAgICAgICBpZiAoKGlucHV0RGVzYy0+bVBvbGljeU1peCAhPSBOVUxMKQorICAgICAgICAgICAgICAgICYmICgoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgTUlYX1NUQVRFX0lETEUpOwogICAgICAgICB9CisKKyAgICAgICAgLy8gYXV0b21hdGljYWxseSBkaXNhYmxlIHRoZSByZW1vdGUgc3VibWl4IG91dHB1dCB3aGVuIGlucHV0IGlzIHN0b3BwZWQgaWYgbm90CisgICAgICAgIC8vIHVzZWQgYnkgYSBwb2xpY3kgbWl4IG9mIHR5cGUgTUlYX1RZUEVfUkVDT1JERVJTCisgICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShpbnB1dERlc2MtPm1EZXZpY2UpKSB7CisgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KCIiKTsKKyAgICAgICAgICAgIGlmIChpbnB1dERlc2MtPm1Qb2xpY3lNaXggPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KCIwIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0RGVzYy0+bVBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUExBWUVSUykgeworICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFkZHJlc3MgIT0gIiIpIHsKKyAgICAgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCAicmVtb3RlLXN1Ym1peCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGlucHV0RGVzYy0+bURldmljZTsKKyAgICAgICAgcmVzZXRJbnB1dERldmljZShpbnB1dCk7CisKKyAgICAgICAgLy8gaW5kaWNhdGUgaW5hY3RpdmUgY2FwdHVyZSB0byBzb3VuZCB0cmlnZ2VyIHNlcnZpY2UgaWYgc3RvcHBpbmcgY2FwdHVyZSBmcm9tIGEgbWljIG9uCisgICAgICAgIC8vIHByaW1hcnkgSFcgbW9kdWxlCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcmltYXJ5SW5wdXREZXZpY2VzID0gYXZhaWxhYmxlUHJpbWFyeUlucHV0RGV2aWNlcygpOworICAgICAgICBpZiAoKChkZXZpY2UgJiBwcmltYXJ5SW5wdXREZXZpY2VzICYgfkFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApICYmCisgICAgICAgICAgICAgICAgbUlucHV0cy5hY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcyhwcmltYXJ5SW5wdXREZXZpY2VzKSA9PSAwKSB7CisgICAgICAgICAgICBTb3VuZFRyaWdnZXI6OnNldENhcHR1cmVTdGF0ZShmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgaW5wdXREZXNjLT5jbGVhclByZWVtcHRlZFNlc3Npb25zKCk7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVsZWFzZUlucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIEFMT0dWKCJyZWxlYXNlSW5wdXQoKSAlZCIsIGlucHV0KTsKLSAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlucHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJyZWxlYXNlSW5wdXQoKSByZWxlYXNpbmcgdW5rbm93biBpbnB1dCAlZCIsIGlucHV0KTsKKyAgICBBTE9HVigiJXMgcG9ydElkICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOworCisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMuZ2V0SW5wdXRGb3JDbGllbnQocG9ydElkKTsKKyAgICBpZiAoaW5wdXREZXNjID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzIG5vIGlucHV0IGZvciBjbGllbnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CisgICAgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4gY2xpZW50ID0gaW5wdXREZXNjLT5nZXRDbGllbnQocG9ydElkKTsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IGlucHV0RGVzYy0+bUlvSGFuZGxlOwogCi0gICAgLy8gUm91dGluZwotICAgIG1JbnB1dFJvdXRlcy5yZW1vdmVSb3V0ZShzZXNzaW9uKTsKKyAgICBBTE9HVigiJXMgJWQiLCBfX0ZVTkNUSU9OX18sIGlucHV0KTsKIAotICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOwotICAgIEFMT0dfQVNTRVJUKGlucHV0RGVzYyAhPSAwKTsKKyAgICBpbnB1dERlc2MtPnJlbW92ZUNsaWVudChwb3J0SWQpOwogCi0gICAgc3A8QXVkaW9TZXNzaW9uPiBhdWRpb1Nlc3Npb24gPSBpbnB1dERlc2MtPmdldEF1ZGlvU2Vzc2lvbihzZXNzaW9uKTsKLSAgICBpZiAoYXVkaW9TZXNzaW9uID09IDApIHsKLSAgICAgICAgQUxPR1coInJlbGVhc2VJbnB1dCgpIHVua25vd24gc2Vzc2lvbiAlZCBvbiBpbnB1dCAlZCIsIHNlc3Npb24sIGlucHV0KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChhdWRpb1Nlc3Npb24tPm9wZW5Db3VudCgpID09IDApIHsKLSAgICAgICAgQUxPR1coInJlbGVhc2VJbnB1dCgpIGludmFsaWQgb3BlbiBjb3VudCAlZCBvbiBzZXNzaW9uICVkIiwKLSAgICAgICAgICAgICAgYXVkaW9TZXNzaW9uLT5vcGVuQ291bnQoKSwgc2Vzc2lvbik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoYXVkaW9TZXNzaW9uLT5jaGFuZ2VPcGVuQ291bnQoLTEpID09IDApIHsKLSAgICAgICAgaW5wdXREZXNjLT5yZW1vdmVBdWRpb1Nlc3Npb24oc2Vzc2lvbik7Ci0gICAgfQotCi0gICAgaWYgKGlucHV0RGVzYy0+Z2V0T3BlblJlZkNvdW50KCkgPiAwKSB7Ci0gICAgICAgIEFMT0dWKCJyZWxlYXNlSW5wdXQoKSBleGl0ID4gMCIpOworICAgIGlmIChpbnB1dERlc2MtPmdldENsaWVudENvdW50KCkgPiAwKSB7CisgICAgICAgIEFMT0dWKCIlcyglZCkgJXp1IGNsaWVudHMgcmVtYWluaW5nIiwgX19mdW5jX18sIHBvcnRJZCwgaW5wdXREZXNjLT5nZXRDbGllbnRDb3VudCgpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIGNsb3NlSW5wdXQoaW5wdXQpOwogICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKLSAgICBBTE9HVigicmVsZWFzZUlucHV0KCkgZXhpdCIpOworICAgIEFMT0dWKCIlcyBleGl0IiwgX19GVU5DVElPTl9fKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsb3NlQWN0aXZlQ2xpZW50cyhjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4mIGlucHV0KQoreworICAgIFJlY29yZENsaWVudFZlY3RvciBjbGllbnRzID0gaW5wdXQtPmNsaWVudHNMaXN0KHRydWUpOworCisgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBjbGllbnRzKSB7CisgICAgICAgIGNsb3NlQ2xpZW50KGNsaWVudC0+cG9ydElkKCkpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsb3NlQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQoreworICAgIHN0b3BJbnB1dChwb3J0SWQpOworICAgIHJlbGVhc2VJbnB1dChwb3J0SWQpOwogfQogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xvc2VBbGxJbnB1dHMoKSB7CkBAIC0yMjI0LDcgKzIyMTQsNiBAQAogICAgICAgICB9CiAgICAgICAgIGlucHV0RGVzYy0+Y2xvc2UoKTsKICAgICB9Ci0gICAgbUlucHV0Um91dGVzLmNsZWFyKCk7CiAgICAgbUlucHV0cy5jbGVhcigpOwogICAgIFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKGZhbHNlKTsKICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwpAQCAtMjI5MywxMSArMjI4MiwxMCBAQAogICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CiAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJEZXZpY2UgPSBkZXNjLT5kZXZpY2UoKTsKICAgICAgICAgZm9yIChpbnQgY3VyU3RyZWFtID0gMDsgY3VyU3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBjdXJTdHJlYW0rKykgewotICAgICAgICAgICAgaWYgKCFzdHJlYW1zTWF0Y2hGb3J2b2x1bWUoc3RyZWFtLCAoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pKSB7CisgICAgICAgICAgICBpZiAoIShzdHJlYW1zTWF0Y2hGb3J2b2x1bWUoc3RyZWFtLCAoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCEoZGVzYy0+aXNTdHJlYW1BY3RpdmUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKSB8fAotICAgICAgICAgICAgICAgICAgICAoaXNJbkNhbGwoKSAmJiAoY3VyU3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSkpKSB7CisgICAgICAgICAgICBpZiAoIShkZXNjLT5pc1N0cmVhbUFjdGl2ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pIHx8IGlzSW5DYWxsKCkpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IGN1clN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKTsKQEAgLTIzMTUsMTMgKzIzMDMsMTUgQEAKICAgICAgICAgICAgICAgICBhcHBseVZvbHVtZSA9ICFtVm9sdW1lQ3VydmVzLT5oYXNWb2x1bWVJbmRleEZvckRldmljZSgKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgY3VyU3RyZWFtRGV2aWNlKTsKICAgICAgICAgICAgIH0KLQorICAgICAgICAgICAgLy8gcmVzY2FsZSBpbmRleCBiZWZvcmUgYXBwbHlpbmcgdG8gY3VyU3RyZWFtIGFzIHJhbmdlcyBtYXkgYmUgZGlmZmVyZW50IGZvcgorICAgICAgICAgICAgLy8gc3RyZWFtIGFuZCBjdXJTdHJlYW0KKyAgICAgICAgICAgIGludCBpZHggPSByZXNjYWxlVm9sdW1lSW5kZXgoaW5kZXgsIHN0cmVhbSwgKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKTsKICAgICAgICAgICAgIGlmIChhcHBseVZvbHVtZSkgewogICAgICAgICAgICAgICAgIC8vRklYTUU6IHdvcmthcm91bmQgZm9yIHRydW5jYXRlZCB0b3VjaCBzb3VuZHMKICAgICAgICAgICAgICAgICAvLyBkZWxheWVkIHZvbHVtZSBjaGFuZ2UgZm9yIHN5c3RlbSBzdHJlYW0gdG8gYmUgcmVtb3ZlZCB3aGVuIHRoZSBwcm9ibGVtIGlzCiAgICAgICAgICAgICAgICAgLy8gaGFuZGxlZCBieSBzeXN0ZW0gVUkKICAgICAgICAgICAgICAgICBzdGF0dXNfdCB2b2xTdGF0dXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtLCBpbmRleCwgZGVzYywgY3VyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtLCBpZHgsIGRlc2MsIGN1ckRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9TWVNURU0pID8gVE9VQ0hfU09VTkRfRklYRURfREVMQVlfTVMgOiAwKTsKICAgICAgICAgICAgICAgICBpZiAodm9sU3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHZvbFN0YXR1czsKQEAgLTI0NDEsNiArMjQzMSwzMyBAQAogICAgIHJldHVybiBtRWZmZWN0cy5yZWdpc3RlckVmZmVjdChkZXNjLCBpbywgc3RyYXRlZ3ksIHNlc3Npb24sIGlkKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkKK3sKKyAgICBpZiAobUVmZmVjdHMuZ2V0RWZmZWN0KGlkKSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAobUVmZmVjdHMuaXNFZmZlY3RFbmFibGVkKGlkKSkgeworICAgICAgICBBTE9HVygiJXMgZWZmZWN0ICVkIGVuYWJsZWQiLCBfX0ZVTkNUSU9OX18sIGlkKTsKKyAgICAgICAgc2V0RWZmZWN0RW5hYmxlZChpZCwgZmFsc2UpOworICAgIH0KKyAgICByZXR1cm4gbUVmZmVjdHMudW5yZWdpc3RlckVmZmVjdChpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCkKK3sKKyAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBlZmZlY3QgPSBtRWZmZWN0cy5nZXRFZmZlY3QoaWQpOworICAgIGlmIChlZmZlY3QgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUVmZmVjdHMuc2V0RWZmZWN0RW5hYmxlZChpZCwgZW5hYmxlZCk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBtSW5wdXRzLnRyYWNrRWZmZWN0RW5hYmxlZChlZmZlY3QsIGVuYWJsZWQpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCiBib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAogewogICAgIGJvb2wgYWN0aXZlID0gZmFsc2U7CkBAIC0yNTAwLDEyICsyNTE3LDEzIEBACiAgICAgc3A8SHdNb2R1bGU+IHJTdWJtaXhNb2R1bGU7CiAgICAgLy8gZXhhbWluZSBlYWNoIG1peCdzIHJvdXRlIHR5cGUKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1peGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEF1ZGlvTWl4IG1peCA9IG1peGVzW2ldOwogICAgICAgICAvLyB3ZSBvbmx5IHN1cHBvcnQgTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLIG9yIE1JWF9ST1VURV9GTEFHX1JFTkRFUiwgbm90IHRoZSBjb21iaW5hdGlvbgotICAgICAgICBpZiAoKG1peGVzW2ldLm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfQUxMKSA9PSBNSVhfUk9VVEVfRkxBR19BTEwpIHsKKyAgICAgICAgaWYgKChtaXgubVJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19BTEwpID09IE1JWF9ST1VURV9GTEFHX0FMTCkgewogICAgICAgICAgICAgcmVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBpZiAoKG1peGVzW2ldLm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLKSA9PSBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spIHsKKyAgICAgICAgaWYgKChtaXgubVJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spID09IE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSykgewogICAgICAgICAgICAgQUxPR1YoInJlZ2lzdGVyUG9saWN5TWl4ZXMoKSBtaXggJXp1IG9mICV6dSBpcyBMT09QX0JBQ0siLCBpLCBtaXhlcy5zaXplKCkpOwogICAgICAgICAgICAgaWYgKHJTdWJtaXhNb2R1bGUgPT0gMCkgewogICAgICAgICAgICAgICAgIHJTdWJtaXhNb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKApAQCAtMjUxOCwxNSArMjUzNiwyMCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gbWl4ZXNbaV0ubURldmljZUFkZHJlc3M7CisgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBtaXgubURldmljZUFkZHJlc3M7CisgICAgICAgICAgICBpZiAobWl4Lm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKKyAgICAgICAgICAgICAgICBtaXgubURldmljZVR5cGUgPSBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWl4Lm1EZXZpY2VUeXBlID0gQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAobVBvbGljeU1peGVzLnJlZ2lzdGVyTWl4KGFkZHJlc3MsIG1peGVzW2ldLCAwIC8qb3V0cHV0IGRlc2MqLykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGlmIChtUG9saWN5TWl4ZXMucmVnaXN0ZXJNaXgoYWRkcmVzcywgbWl4LCAwIC8qb3V0cHV0IGRlc2MqLykgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiIEVycm9yIHJlZ2lzdGVyaW5nIG1peCAlenUgZm9yIGFkZHJlc3MgJXMiLCBpLCBhZGRyZXNzLnN0cmluZygpKTsKICAgICAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IG91dHB1dENvbmZpZyA9IG1peGVzW2ldLm1Gb3JtYXQ7Ci0gICAgICAgICAgICBhdWRpb19jb25maWdfdCBpbnB1dENvbmZpZyA9IG1peGVzW2ldLm1Gb3JtYXQ7CisgICAgICAgICAgICBhdWRpb19jb25maWdfdCBvdXRwdXRDb25maWcgPSBtaXgubUZvcm1hdDsKKyAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGlucHV0Q29uZmlnID0gbWl4Lm1Gb3JtYXQ7CiAgICAgICAgICAgICAvLyBOT1RFOiBhdWRpbyBmbGluZ2VyIG1peGVyIGRvZXMgbm90IHN1cHBvcnQgbW9ubyBvdXRwdXQ6IGNvbmZpZ3VyZSByZW1vdGUgc3VibWl4IEhBTCBpbgogICAgICAgICAgICAgLy8gc3RlcmVvIGFuZCBsZXQgYXVkaW8gZmxpbmdlciBkbyB0aGUgY2hhbm5lbCBjb252ZXJzaW9uIGlmIG5lZWRlZC4KICAgICAgICAgICAgIG91dHB1dENvbmZpZy5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CkBAIC0yNTM2LDcgKzI1NTksNyBAQAogICAgICAgICAgICAgclN1Ym1peE1vZHVsZS0+YWRkSW5wdXRQcm9maWxlKGFkZHJlc3MsICZpbnB1dENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsIGFkZHJlc3MpOwogCi0gICAgICAgICAgICBpZiAobWl4ZXNbaV0ubU1peFR5cGUgPT0gTUlYX1RZUEVfUExBWUVSUykgeworICAgICAgICAgICAgaWYgKG1peC5tTWl4VHlwZSA9PSBNSVhfVFlQRV9QTEFZRVJTKSB7CiAgICAgICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLAogICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpLCAicmVtb3RlLXN1Ym1peCIpOwpAQCAtMjU0NSw5ICsyNTY4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSwgInJlbW90ZS1zdWJtaXgiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICgobWl4ZXNbaV0ubVJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19SRU5ERVIpID09IE1JWF9ST1VURV9GTEFHX1JFTkRFUikgewotICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gbWl4ZXNbaV0ubURldmljZUFkZHJlc3M7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gbWl4ZXNbaV0ubURldmljZVR5cGU7CisgICAgICAgIH0gZWxzZSBpZiAoKG1peC5tUm91dGVGbGFncyAmIE1JWF9ST1VURV9GTEFHX1JFTkRFUikgPT0gTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSB7CisgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBtaXgubURldmljZUFkZHJlc3M7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gbWl4Lm1EZXZpY2VUeXBlOwogICAgICAgICAgICAgQUxPR1YoIiByZWdpc3RlclBvbGljeU1peGVzKCkgbWl4ICV6dSBvZiAlenUgaXMgUkVOREVSLCBkZXY9MHglWCBhZGRyPSVzIiwKICAgICAgICAgICAgICAgICAgICAgaSwgbWl4ZXMuc2l6ZSgpLCBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCkpOwogCkBAIC0yNTYwLDcgKzI1ODMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBhdGNoLT5tUGF0Y2guc2lua3NbMF0uZXh0LmRldmljZS50eXBlID09IGRldmljZSkKICAgICAgICAgICAgICAgICAgICAgICAgICYmIChzdHJuY21wKHBhdGNoLT5tUGF0Y2guc2lua3NbMF0uZXh0LmRldmljZS5hZGRyZXNzLCBhZGRyZXNzLnN0cmluZygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobVBvbGljeU1peGVzLnJlZ2lzdGVyTWl4KGFkZHJlc3MsIG1peGVzW2ldLCBkZXNjKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBpZiAobVBvbGljeU1peGVzLnJlZ2lzdGVyTWl4KGFkZHJlc3MsIG1peCwgZGVzYykgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRPdXRwdXQgPSB0cnVlOwpAQCAtMjYzOCw1NyArMjY2MSwxMTUgQEAKICAgICByZXR1cm4gcmVzOwogfQogCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZHVtcE1hbnVhbFN1cnJvdW5kRm9ybWF0cyhTdHJpbmc4ICpkc3QpIGNvbnN0Cit7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGNvbnN0ZXhwciBzaXplX3QgYXVkaW9Gb3JtYXRQcmVmaXhMZW4gPSBzaXplb2YoIkFVRElPX0ZPUk1BVF8iKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZtdCA6IG1NYW51YWxTdXJyb3VuZEZvcm1hdHMpIHsKKyAgICAgICAgaWYgKGkrKyAhPSAwKSBkc3QtPmFwcGVuZCgiLCAiKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgc2ZtdDsKKyAgICAgICAgRm9ybWF0Q29udmVydGVyOjp0b1N0cmluZyhmbXQsIHNmbXQpOworICAgICAgICBkc3QtPmFwcGVuZChzZm10LnNpemUoKSA+PSBhdWRpb0Zvcm1hdFByZWZpeExlbiA/CisgICAgICAgICAgICAgICAgc2ZtdC5jX3N0cigpICsgYXVkaW9Gb3JtYXRQcmVmaXhMZW4gLSAxIDogc2ZtdC5jX3N0cigpKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsCisgICAgICAgIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykgeworICAgIEFMT0dWKCIlcygpIHVpZD0lZCBudW0gZGV2aWNlcyAlenUiLCBfX0ZVTkNUSU9OX18sIHVpZCwgZGV2aWNlcy5zaXplKCkpOworICAgIC8vIHVpZC9kZXZpY2UgYWZmaW5pdHkgaXMgb25seSBmb3Igb3V0cHV0IGRldmljZXMKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZXNbaV0ubVR5cGUpKSB7CisgICAgICAgICAgICBBTE9HRSgic2V0VWlkRGV2aWNlQWZmaW5pdGllcygpIGRldmljZT0lMDh4IGlzIE5PVCBhbiBvdXRwdXQgZGV2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlc1tpXS5tVHlwZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorICAgIHN0YXR1c190IHJlcyA9ICBtUG9saWN5TWl4ZXMuc2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWQsIGRldmljZXMpOworICAgIGlmIChyZXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgLy8gcmVldmFsdWF0ZSBvdXRwdXRzIGZvciBhbGwgZ2l2ZW4gZGV2aWNlcworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPSBtSHdNb2R1bGVzLmdldERldmljZURlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlc1tpXS5tVHlwZSwgZGV2aWNlc1tpXS5tQWRkcmVzcywgU3RyaW5nOCgpKTsKKyAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0czsKKyAgICAgICAgICAgIGlmIChjaGVja091dHB1dHNGb3JEZXZpY2UoZGV2RGVzYywgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgIG91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPmFkZHJlc3MoKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgic2V0VWlkRGV2aWNlQWZmaW5pdGllcygpIGVycm9yIGluIGNoZWNrT3V0cHV0c0ZvckRldmljZSBmb3IgZGV2aWNlPSUwOHgiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGFkZHI9JXMiLCBkZXZpY2VzW2ldLm1UeXBlLCBkZXZpY2VzW2ldLm1BZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCkgeworICAgIEFMT0dWKCIlcygpIHVpZD0lZCIsIF9fRlVOQ1RJT05fXywgdWlkKTsKKyAgICBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4gZGV2aWNlczsKKyAgICBzdGF0dXNfdCByZXMgPSAgbVBvbGljeU1peGVzLmdldERldmljZXNGb3JVaWQodWlkLCBkZXZpY2VzKTsKKyAgICBpZiAocmVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIC8vIHJlZXZhbHVhdGUgb3V0cHV0cyBmb3IgYWxsIGZvdW5kIGRldmljZXMKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZXZpY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gbUh3TW9kdWxlcy5nZXREZXZpY2VEZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgICAgICBkZXZpY2VzW2ldLm1UeXBlLCBkZXZpY2VzW2ldLm1BZGRyZXNzLCBTdHJpbmc4KCkpOworICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzOworICAgICAgICAgICAgaWYgKGNoZWNrT3V0cHV0c0ZvckRldmljZShkZXZEZXNjLCBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5hZGRyZXNzKCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzKCkgZXJyb3IgaW4gY2hlY2tPdXRwdXRzRm9yRGV2aWNlIGZvciBkZXZpY2U9JTA4eCBhZGRyPSVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlc1tpXS5tVHlwZSwgZGV2aWNlc1tpXS5tQWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbkF1ZGlvUG9saWN5TWFuYWdlciBEdW1wOiAlcFxuIiwgdGhpcyk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBQcmltYXJ5IE91dHB1dDogJWRcbiIsCisgICAgICAgICAgICAgaGFzUHJpbWFyeU91dHB1dCgpID8gbVByaW1hcnlPdXRwdXQtPm1Jb0hhbmRsZSA6IEFVRElPX0lPX0hBTkRMRV9OT05FKTsKKyAgICBzdGQ6OnN0cmluZyBzdGF0ZUxpdGVyYWw7CisgICAgQXVkaW9Nb2RlQ29udmVydGVyOjp0b1N0cmluZyhtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCksIHN0YXRlTGl0ZXJhbCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBQaG9uZSBzdGF0ZTogJXNcbiIsIHN0YXRlTGl0ZXJhbC5jX3N0cigpKTsKKyAgICBjb25zdCBjaGFyKiBmb3JjZVVzZXNbQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlRdID0geworICAgICAgICAiY29tbXVuaWNhdGlvbnMiLCAibWVkaWEiLCAicmVjb3JkIiwgImRvY2siLCAic3lzdGVtIiwKKyAgICAgICAgIkhETUkgc3lzdGVtIGF1ZGlvIiwgImVuY29kZWQgc3Vycm91bmQgb3V0cHV0IiwgInZpYnJhdGUgcmluZ2luZyIgfTsKKyAgICBmb3IgKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCBpID0gQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OOworICAgICAgICAgaSA8IEFVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UOyBpID0gKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCkoKGludClpICsgMSkpIHsKKyAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBmb3JjZVVzZVZhbHVlID0gbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoaSk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgRm9yY2UgdXNlIGZvciAlczogJWQiLCBmb3JjZVVzZXNbaV0sIGZvcmNlVXNlVmFsdWUpOworICAgICAgICBpZiAoaSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQgJiYKKyAgICAgICAgICAgICAgICBmb3JjZVVzZVZhbHVlID09IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX01BTlVBTCkgeworICAgICAgICAgICAgZHN0LT5hcHBlbmQoIiAoTUFOVUFMOiAiKTsKKyAgICAgICAgICAgIGR1bXBNYW51YWxTdXJyb3VuZEZvcm1hdHMoZHN0KTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kKCIpIik7CisgICAgICAgIH0KKyAgICAgICAgZHN0LT5hcHBlbmQoIlxuIik7CisgICAgfQorICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgVFRTIG91dHB1dCAlc2F2YWlsYWJsZVxuIiwgbVR0c091dHB1dEF2YWlsYWJsZSA/ICIiIDogIm5vdCAiKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIE1hc3RlciBtb25vOiAlc1xuIiwgbU1hc3Rlck1vbm8gPyAib24iIDogIm9mZiIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgQ29uZmlnIHNvdXJjZTogJXNcbiIsIG1Db25maWcuZ2V0U291cmNlKCkuY19zdHIoKSk7IC8vIGdldENvbmZpZyBub3QgY29uc3QKKyAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5kdW1wKGRzdCwgU3RyaW5nOCgiQXZhaWxhYmxlIG91dHB1dCIpKTsKKyAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmR1bXAoZHN0LCBTdHJpbmc4KCJBdmFpbGFibGUgaW5wdXQiKSk7CisgICAgbUh3TW9kdWxlc0FsbC5kdW1wKGRzdCk7CisgICAgbU91dHB1dHMuZHVtcChkc3QpOworICAgIG1JbnB1dHMuZHVtcChkc3QpOworICAgIG1Wb2x1bWVDdXJ2ZXMtPmR1bXAoZHN0KTsKKyAgICBtRWZmZWN0cy5kdW1wKGRzdCk7CisgICAgbUF1ZGlvUGF0Y2hlcy5kdW1wKGRzdCk7CisgICAgbVBvbGljeU1peGVzLmR1bXAoZHN0KTsKKyAgICBtQXVkaW9Tb3VyY2VzLmR1bXAoZHN0KTsKK30KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkdW1wKGludCBmZCkKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKICAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuQXVkaW9Qb2xpY3lNYW5hZ2VyIER1bXA6ICVwXG4iLCB0aGlzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgUHJpbWFyeSBPdXRwdXQ6ICVkXG4iLAotICAgICAgICAgICAgIGhhc1ByaW1hcnlPdXRwdXQoKSA/IG1QcmltYXJ5T3V0cHV0LT5tSW9IYW5kbGUgOiBBVURJT19JT19IQU5ETEVfTk9ORSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHN0ZDo6c3RyaW5nIHN0YXRlTGl0ZXJhbDsKLSAgICBBdWRpb01vZGVDb252ZXJ0ZXI6OnRvU3RyaW5nKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSwgc3RhdGVMaXRlcmFsKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgUGhvbmUgc3RhdGU6ICVzXG4iLCBzdGF0ZUxpdGVyYWwuY19zdHIoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIGNvbW11bmljYXRpb25zICVkXG4iLAotICAgICAgICAgICAgIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTikpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBtZWRpYSAlZFxuIiwgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQSkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciByZWNvcmQgJWRcbiIsIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIGRvY2sgJWRcbiIsIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRE9DSykpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBzeXN0ZW0gJWRcbiIsIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIGhkbWkgc3lzdGVtIGF1ZGlvICVkXG4iLAotICAgICAgICAgICAgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9IRE1JX1NZU1RFTV9BVURJTykpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBlbmNvZGVkIHN1cnJvdW5kIG91dHB1dCAlZFxuIiwKLSAgICAgICAgICAgIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgVFRTIG91dHB1dCAlc1xuIiwgbVR0c091dHB1dEF2YWlsYWJsZSA/ICJhdmFpbGFibGUiIDogIm5vdCBhdmFpbGFibGUiKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIE1hc3RlciBtb25vOiAlc1xuIiwgbU1hc3Rlck1vbm8gPyAib24iIDogIm9mZiIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQorICAgIGR1bXAoJnJlc3VsdCk7CiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0KLSAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5kdW1wKGZkLCBTdHJpbmc4KCJBdmFpbGFibGUgb3V0cHV0IikpOwotICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuZHVtcChmZCwgU3RyaW5nOCgiQXZhaWxhYmxlIGlucHV0IikpOwotICAgIG1Id01vZHVsZXNBbGwuZHVtcChmZCk7Ci0gICAgbU91dHB1dHMuZHVtcChmZCk7Ci0gICAgbUlucHV0cy5kdW1wKGZkKTsKLSAgICBtVm9sdW1lQ3VydmVzLT5kdW1wKGZkKTsKLSAgICBtRWZmZWN0cy5kdW1wKGZkKTsKLSAgICBtQXVkaW9QYXRjaGVzLmR1bXAoZmQpOwotICAgIG1Qb2xpY3lNaXhlcy5kdW1wKGZkKTsKLQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtMjcwOSwxMiArMjc5MCw5IEBACiAgICAgfQogCiAgICAgLy8gQ2hlY2sgaWYgb2ZmbG9hZCBoYXMgYmVlbiBkaXNhYmxlZAotICAgIGNoYXIgcHJvcFZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgaWYgKHByb3BlcnR5X2dldCgiYXVkaW8ub2ZmbG9hZC5kaXNhYmxlIiwgcHJvcFZhbHVlLCAiMCIpKSB7Ci0gICAgICAgIGlmIChhdG9pKHByb3BWYWx1ZSkgIT0gMCkgewotICAgICAgICAgICAgQUxPR1YoIm9mZmxvYWQgZGlzYWJsZWQgYnkgYXVkaW8ub2ZmbG9hZC5kaXNhYmxlPSVzIiwgcHJvcFZhbHVlICk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KKyAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woImF1ZGlvLm9mZmxvYWQuZGlzYWJsZSIsIGZhbHNlIC8qIGRlZmF1bHRfdmFsdWUgKi8pKSB7CisgICAgICAgIEFMT0dWKCJvZmZsb2FkIGRpc2FibGVkIGJ5IGF1ZGlvLm9mZmxvYWQuZGlzYWJsZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLy8gQ2hlY2sgaWYgc3RyZWFtIHR5cGUgaXMgbXVzaWMsIHRoZW4gb25seSBhbGxvdyBvZmZsb2FkIGFzIG9mIG5vdy4KQEAgLTI3MzMsOSArMjgxMSwxMiBAQAogICAgIH0KIAogICAgIC8vSWYgZHVyYXRpb24gaXMgbGVzcyB0aGFuIG1pbmltdW0gdmFsdWUgZGVmaW5lZCBpbiBwcm9wZXJ0eSwgcmV0dXJuIGZhbHNlCi0gICAgaWYgKHByb3BlcnR5X2dldCgiYXVkaW8ub2ZmbG9hZC5taW4uZHVyYXRpb24uc2VjcyIsIHByb3BWYWx1ZSwgTlVMTCkpIHsKLSAgICAgICAgaWYgKG9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzIDwgKGF0b2kocHJvcFZhbHVlKSAqIDEwMDAwMDAgKSkgewotICAgICAgICAgICAgQUxPR1YoIk9mZmxvYWQgZGVuaWVkIGJ5IGR1cmF0aW9uIDwgYXVkaW8ub2ZmbG9hZC5taW4uZHVyYXRpb24uc2Vjcyg9JXMpIiwgcHJvcFZhbHVlKTsKKyAgICBjb25zdCBpbnQgbWluX2R1cmF0aW9uX3NlY3MgPSBwcm9wZXJ0eV9nZXRfaW50MzIoCisgICAgICAgICAgICAiYXVkaW8ub2ZmbG9hZC5taW4uZHVyYXRpb24uc2VjcyIsIC0xIC8qIGRlZmF1bHRfdmFsdWUgKi8pOworICAgIGlmIChtaW5fZHVyYXRpb25fc2VjcyA+PSAwKSB7CisgICAgICAgIGlmIChvZmZsb2FkSW5mby5kdXJhdGlvbl91cyA8IG1pbl9kdXJhdGlvbl9zZWNzICogMTAwMDAwMExMKSB7CisgICAgICAgICAgICBBTE9HVigiT2ZmbG9hZCBkZW5pZWQgYnkgZHVyYXRpb24gPCBhdWRpby5vZmZsb2FkLm1pbi5kdXJhdGlvbi5zZWNzKD0lZCkiLAorICAgICAgICAgICAgICAgICAgICBtaW5fZHVyYXRpb25fc2Vjcyk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzIDwgT0ZGTE9BRF9ERUZBVUxUX01JTl9EVVJBVElPTl9TRUNTICogMTAwMDAwMCkgewpAQCAtMjc1NSwxNSArMjgzNiwzNCBAQAogCiAgICAgLy8gU2VlIGlmIHRoZXJlIGlzIGEgcHJvZmlsZSB0byBzdXBwb3J0IHRoaXMuCiAgICAgLy8gQVVESU9fREVWSUNFX05PTkUKLSAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBnZXRQcm9maWxlRm9yRGlyZWN0T3V0cHV0KEFVRElPX0RFVklDRV9OT05FIC8qaWdub3JlIGRldmljZSAqLywKKyAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBnZXRQcm9maWxlRm9yT3V0cHV0KEFVRElPX0RFVklDRV9OT05FIC8qaWdub3JlIGRldmljZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8uc2FtcGxlX3JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZmxvYWRJbmZvLmZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8uY2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBkaXJlY3RPbmx5ICovKTsKICAgICBBTE9HVigiaXNPZmZsb2FkU3VwcG9ydGVkKCkgcHJvZmlsZSAlc2ZvdW5kIiwgcHJvZmlsZSAhPSAwID8gIiIgOiAiTk9UICIpOwogICAgIHJldHVybiAocHJvZmlsZSAhPSAwKTsKIH0KIAorYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QmIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMpIHsKKyAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBvdXRwdXRfZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfZmxhZ3NfdG9fYXVkaW9fb3V0cHV0X2ZsYWdzKGF0dHJpYnV0ZXMuZmxhZ3MsIG91dHB1dF9mbGFncyk7CisgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gZ2V0UHJvZmlsZUZvck91dHB1dChBVURJT19ERVZJQ0VfTk9ORSAvKmlnbm9yZSBkZXZpY2UgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGRpcmVjdE9ubHkgKi8pOworICAgIEFMT0dWKCIlcygpIHByb2ZpbGUgJXNmb3VuZCB3aXRoIG5hbWU6ICVzLCAiCisgICAgICAgICJzYW1wbGUgcmF0ZTogJXUsIGZvcm1hdDogMHgleCwgY2hhbm5lbF9tYXNrOiAweCV4LCBvdXRwdXQgZmxhZ3M6IDB4JXgiLAorICAgICAgICBfX0ZVTkNUSU9OX18sIHByb2ZpbGUgIT0gMCA/ICIiIDogIk5PVCAiLAorICAgICAgICAocHJvZmlsZSAhPSAwID8gcHJvZmlsZS0+Z2V0VGFnTmFtZSgpLnN0cmluZygpIDogIm51bGwiKSwKKyAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlLCBjb25maWcuZm9ybWF0LCBjb25maWcuY2hhbm5lbF9tYXNrLCBvdXRwdXRfZmxhZ3MpOworICAgIHJldHVybiAocHJvZmlsZSAhPSAwKTsKK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKQEAgLTI4NzIsOCArMjk3Miw3IEBACiAgICAgfQogICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgbnVtIHNvdXJjZXMgJWQgbnVtIHNpbmtzICVkIiwgcGF0Y2gtPm51bV9zb3VyY2VzLCBwYXRjaC0+bnVtX3NpbmtzKTsKIAotICAgIGlmIChwYXRjaC0+bnVtX3NvdXJjZXMgPT0gMCB8fCBwYXRjaC0+bnVtX3NvdXJjZXMgPiBBVURJT19QQVRDSF9QT1JUU19NQVggfHwKLSAgICAgICAgICAgIHBhdGNoLT5udW1fc2lua3MgPT0gMCB8fCBwYXRjaC0+bnVtX3NpbmtzID4gQVVESU9fUEFUQ0hfUE9SVFNfTUFYKSB7CisgICAgaWYgKCFhdWRpb19wYXRjaF9pc192YWxpZChwYXRjaCkpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgLy8gb25seSBvbmUgc291cmNlIHBlciBhdWRpbyBwYXRjaCBzdXBwb3J0ZWQgZm9yIG5vdwpAQCAtMjk0Niw3ICszMDQ1LDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5tUHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZEZXNjLT50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPm1BZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5hZGRyZXNzKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLnNhbXBsZV9yYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgLy8gdXBkYXRlZFNhbXBsaW5nUmF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5mb3JtYXQsCkBAIC0zMDAzLDcgKzMxMDIsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoIWlucHV0RGVzYy0+bVByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoZGV2RGVzYy0+dHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPm1BZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPmFkZHJlc3MoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uc2FtcGxlX3JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgLyp1cGRhdGVkU2FtcGxlUmF0ZSovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmZvcm1hdCwKQEAgLTMwNjYsOCArMzE2NSwxMCBAQAogICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHNvZnR3YXJlIGJyaWRnZSBpbiBQYXRjaFBhbmVsIGlmOgogICAgICAgICAgICAgICAgIC8vIC0gc291cmNlIGFuZCBzaW5rIGRldmljZXMgYXJlIG9uIGRpZmZlcmVudCBIVyBtb2R1bGVzIE9SCiAgICAgICAgICAgICAgICAgLy8gLSBhdWRpbyBIQUwgdmVyc2lvbiBpcyA8IDMuMAorICAgICAgICAgICAgICAgIC8vIC0gYXVkaW8gSEFMIHZlcnNpb24gaXMgPj0gMy4wIGJ1dCBubyByb3V0ZSBoYXMgYmVlbiBkZWNsYXJlZCBiZXR3ZWVuIGRldmljZXMKICAgICAgICAgICAgICAgICBpZiAoIXNyY0RldmljZURlc2MtPmhhc1NhbWVId01vZHVsZUFzKHNpbmtEZXZpY2VEZXNjKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKHNyY0RldmljZURlc2MtPm1Nb2R1bGUtPmdldEhhbFZlcnNpb25NYWpvcigpIDwgMykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIChzcmNEZXZpY2VEZXNjLT5nZXRNb2R1bGVWZXJzaW9uTWFqb3IoKSA8IDMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAhc3JjRGV2aWNlRGVzYy0+Z2V0TW9kdWxlKCktPnN1cHBvcnRzUGF0Y2goc3JjRGV2aWNlRGVzYywgc2lua0RldmljZURlc2MpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHN1cHBvcnQgb25seSBvbmUgc2luayBkZXZpY2UgZm9yIG5vdyB0byBzaW1wbGlmeSBvdXRwdXQgc2VsZWN0aW9uIGxvZ2ljCiAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+bnVtX3NpbmtzID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMzA3Niw5ICszMTc3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0c0ZvckRldmljZShzaW5rRGV2aWNlRGVzYy0+dHlwZSgpLCBtT3V0cHV0cyk7CiAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBzaW5rIGRldmljZSBpcyByZWFjaGFibGUgdmlhIGFuIG9wZW5lZCBvdXRwdXQgc3RyZWFtLCByZXF1ZXN0IHRvIGdvIHZpYQogICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIG91dHB1dCBzdHJlYW0gYnkgYWRkaW5nIGEgc2Vjb25kIHNvdXJjZSB0byB0aGUgcGF0Y2ggZGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0lOVkFMSUQpOworICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cyk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKQEAgLTMwOTIsMjggKzMxOTEsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gVE9ETzogY2hlY2sgZnJvbSByb3V0aW5nIGNhcGFiaWxpdGllcyBpbiBjb25maWcgZmlsZSBhbmQgb3RoZXIgY29uZmxpY3RpbmcgcGF0Y2hlcwogCi0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIGFmUGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgmbmV3UGF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWZQYXRjaEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBwYXRjaCBwYW5lbCByZXR1cm5lZCAlZCBwYXRjaEhhbmRsZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGFmUGF0Y2hIYW5kbGUpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbmV3IEF1ZGlvUGF0Y2goJm5ld1BhdGNoLCB1aWQpOwotICAgICAgICAgICAgICAgICAgICBhZGRBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSwgcGF0Y2hEZXNjKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaCA9IG5ld1BhdGNoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgICAgICAqaGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOwotICAgICAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbnN0YWxsUGF0Y2goX19mdW5jX18sIGluZGV4LCBoYW5kbGUsICZuZXdQYXRjaCwgMCwgdWlkLCAmcGF0Y2hEZXNjKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIHBhdGNoIHBhbmVsIGNvdWxkIG5vdCBjb25uZWN0IGRldmljZSBwYXRjaCwgZXJyb3IgJWQiLAogICAgICAgICAgICAgICAgIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMzI0NiwxMCArMzMyNSwxMCBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBiYWNrdXBDb25maWc7CisgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIGJhY2t1cENvbmZpZyA9IHt9OwogICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9ydENvbmZpZy0+YXBwbHlBdWRpb1BvcnRDb25maWcoY29uZmlnLCAmYmFja3VwQ29uZmlnKTsKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBuZXdDb25maWc7CisgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBuZXdDb25maWcgPSB7fTsKICAgICAgICAgYXVkaW9Qb3J0Q29uZmlnLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3Q29uZmlnLCBjb25maWcpOwogICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+c2V0QXVkaW9Qb3J0Q29uZmlnKCZuZXdDb25maWcsIDApOwogICAgIH0KQEAgLTMzMTAsMTIgKzMzODksMTIgQEAKIHsKICAgICAvLyByZW1vdmUgb3V0cHV0IHJvdXRlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB1aWQKICAgICBTb3J0ZWRWZWN0b3I8cm91dGluZ19zdHJhdGVneT4gYWZmZWN0ZWRTdHJhdGVnaWVzOwotICAgIGZvciAoc3NpemVfdCBpID0gKHNzaXplX3QpbU91dHB1dFJvdXRlcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgIHsKLSAgICAgICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IG1PdXRwdXRSb3V0ZXMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKHJvdXRlLT5tVWlkID09IHVpZCkgewotICAgICAgICAgICAgbU91dHB1dFJvdXRlcy5yZW1vdmVJdGVtc0F0KGkpOwotICAgICAgICAgICAgaWYgKHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYWZmZWN0ZWRTdHJhdGVnaWVzLmFkZChnZXRTdHJhdGVneShyb3V0ZS0+bVN0cmVhbVR5cGUpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogb3V0cHV0RGVzYy0+Z2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICAgICAgaWYgKGNsaWVudC0+aGFzUHJlZmVycmVkRGV2aWNlKCkgJiYgY2xpZW50LT51aWQoKSA9PSB1aWQpIHsKKyAgICAgICAgICAgICAgICBjbGllbnQtPnNldFByZWZlcnJlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpOworICAgICAgICAgICAgICAgIGFmZmVjdGVkU3RyYXRlZ2llcy5hZGQoZ2V0U3RyYXRlZ3koY2xpZW50LT5zdHJlYW0oKSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMzMyNiwxMiArMzQwNSwxMiBAQAogCiAgICAgLy8gcmVtb3ZlIGlucHV0IHJvdXRlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB1aWQKICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9fc291cmNlX3Q+IGFmZmVjdGVkU291cmNlczsKLSAgICBmb3IgKHNzaXplX3QgaSA9IChzc2l6ZV90KW1JbnB1dFJvdXRlcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgIHsKLSAgICAgICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IG1JbnB1dFJvdXRlcy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAocm91dGUtPm1VaWQgPT0gdWlkKSB7Ci0gICAgICAgICAgICBtSW5wdXRSb3V0ZXMucmVtb3ZlSXRlbXNBdChpKTsKLSAgICAgICAgICAgIGlmIChyb3V0ZS0+bURldmljZURlc2NyaXB0b3IgIT0gMCkgewotICAgICAgICAgICAgICAgIGFmZmVjdGVkU291cmNlcy5hZGQocm91dGUtPm1Tb3VyY2UpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGkpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IGlucHV0RGVzYy0+Z2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICAgICAgaWYgKGNsaWVudC0+aGFzUHJlZmVycmVkRGV2aWNlKCkgJiYgY2xpZW50LT51aWQoKSA9PSB1aWQpIHsKKyAgICAgICAgICAgICAgICBjbGllbnQtPnNldFByZWZlcnJlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpOworICAgICAgICAgICAgICAgIGFmZmVjdGVkU291cmNlcy5hZGQoY2xpZW50LT5zb3VyY2UoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0zMzM5LDcgKzM0MTgsNyBAQAogICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gaW5wdXRzVG9DbG9zZTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKGFmZmVjdGVkU291cmNlcy5pbmRleE9mKGlucHV0RGVzYy0+aW5wdXRTb3VyY2UoKSkgPj0gMCkgeworICAgICAgICBpZiAoYWZmZWN0ZWRTb3VyY2VzLmluZGV4T2YoaW5wdXREZXNjLT5zb3VyY2UoKSkgPj0gMCkgewogICAgICAgICAgICAgaW5wdXRzVG9DbG9zZS5hZGQoaW5wdXREZXNjLT5tSW9IYW5kbGUpOwogICAgICAgICB9CiAgICAgfQpAQCAtMzM1MSw4ICszNDMwLDggQEAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbGVhckF1ZGlvU291cmNlcyh1aWRfdCB1aWQpCiB7CiAgICAgZm9yIChzc2l6ZV90IGkgPSAoc3NpemVfdCltQXVkaW9Tb3VyY2VzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSAgewotICAgICAgICBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IHNvdXJjZURlc2MgPSBtQXVkaW9Tb3VyY2VzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChzb3VyY2VEZXNjLT5tVWlkID09IHVpZCkgeworICAgICAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoc291cmNlRGVzYy0+dWlkKCkgPT0gdWlkKSB7CiAgICAgICAgICAgICBzdG9wQXVkaW9Tb3VyY2UobUF1ZGlvU291cmNlcy5rZXlBdChpKSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMzcwLDIwICszNDQ5LDIzIEBACiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCiB7Ci0gICAgQUxPR1YoIiVzIHNvdXJjZSAlcCBhdHRyaWJ1dGVzICVwIGhhbmRsZSAlcCIsIF9fRlVOQ1RJT05fXywgc291cmNlLCBhdHRyaWJ1dGVzLCBoYW5kbGUpOwotICAgIGlmIChzb3VyY2UgPT0gTlVMTCB8fCBhdHRyaWJ1dGVzID09IE5VTEwgfHwgaGFuZGxlID09IE5VTEwpIHsKKyAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgICpwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworCisgICAgaWYgKHNvdXJjZSA9PSBOVUxMIHx8IGF0dHJpYnV0ZXMgPT0gTlVMTCB8fCBwb3J0SWQgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiJXMgaW52YWxpZCBhcmd1bWVudDogc291cmNlICVwIGF0dHJpYnV0ZXMgJXAgaGFuZGxlICVwIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzb3VyY2UsIGF0dHJpYnV0ZXMsIHBvcnRJZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgKmhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotCiAgICAgaWYgKHNvdXJjZS0+cm9sZSAhPSBBVURJT19QT1JUX1JPTEVfU09VUkNFIHx8CiAgICAgICAgICAgICBzb3VyY2UtPnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewotICAgICAgICBBTE9HVigiJXMgSU5WQUxJRF9PUEVSQVRJT04gc291cmNlLT5yb2xlICVkIHNvdXJjZS0+dHlwZSAlZCIsIF9fRlVOQ1RJT05fXywgc291cmNlLT5yb2xlLCBzb3VyY2UtPnR5cGUpOworICAgICAgICBBTE9HVygiJXMgSU5WQUxJRF9PUEVSQVRJT04gc291cmNlLT5yb2xlICVkIHNvdXJjZS0+dHlwZSAlZCIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc291cmNlLT5yb2xlLCBzb3VyY2UtPnR5cGUpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCkBAIC0zMzkxLDUzICszNDczLDY0IEBACiAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZShzb3VyY2UtPmV4dC5kZXZpY2UudHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KHNvdXJjZS0+ZXh0LmRldmljZS5hZGRyZXNzKSk7CiAgICAgaWYgKHNyY0RldmljZURlc2MgPT0gMCkgewotICAgICAgICBBTE9HVigiJXMgc291cmNlLT5leHQuZGV2aWNlLnR5cGUgJTA4eCBub3QgZm91bmQiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZS0+ZXh0LmRldmljZS50eXBlKTsKKyAgICAgICAgQUxPR1coIiVzIHNvdXJjZS0+ZXh0LmRldmljZS50eXBlICUwOHggbm90IGZvdW5kIiwgX19GVU5DVElPTl9fLCBzb3VyY2UtPmV4dC5kZXZpY2UudHlwZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gc291cmNlRGVzYyA9Ci0gICAgICAgICAgICBuZXcgQXVkaW9Tb3VyY2VEZXNjcmlwdG9yKHNyY0RldmljZURlc2MsIGF0dHJpYnV0ZXMsIHVpZCk7CiAKLSAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggZHVtbXlQYXRjaDsKKyAgICAqcG9ydElkID0gQXVkaW9Qb3J0OjpnZXROZXh0VW5pcXVlSWQoKTsKKworICAgIHN0cnVjdCBhdWRpb19wYXRjaCBkdW1teVBhdGNoID0ge307CiAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbmV3IEF1ZGlvUGF0Y2goJmR1bW15UGF0Y2gsIHVpZCk7Ci0gICAgc291cmNlRGVzYy0+bVBhdGNoRGVzYyA9IHBhdGNoRGVzYzsKKworICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IHNvdXJjZURlc2MgPQorICAgICAgICBuZXcgU291cmNlQ2xpZW50RGVzY3JpcHRvcigqcG9ydElkLCB1aWQsICphdHRyaWJ1dGVzLCBwYXRjaERlc2MsIHNyY0RldmljZURlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludChhdHRyaWJ1dGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RyYXRlZ3lGb3JBdHRyKGF0dHJpYnV0ZXMpKTsKIAogICAgIHN0YXR1c190IHN0YXR1cyA9IGNvbm5lY3RBdWRpb1NvdXJjZShzb3VyY2VEZXNjKTsKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIG1BdWRpb1NvdXJjZXMuYWRkKHNvdXJjZURlc2MtPmdldEhhbmRsZSgpLCBzb3VyY2VEZXNjKTsKLSAgICAgICAgKmhhbmRsZSA9IHNvdXJjZURlc2MtPmdldEhhbmRsZSgpOworICAgICAgICBtQXVkaW9Tb3VyY2VzLmFkZCgqcG9ydElkLCBzb3VyY2VEZXNjKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjb25uZWN0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiYgc291cmNlRGVzYykKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y29ubmVjdEF1ZGlvU291cmNlKGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKQogewotICAgIEFMT0dWKCIlcyBoYW5kbGUgJWQiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZURlc2MtPmdldEhhbmRsZSgpKTsKKyAgICBBTE9HVigiJXMgaGFuZGxlICVkIiwgX19GVU5DVElPTl9fLCBzb3VyY2VEZXNjLT5wb3J0SWQoKSk7CiAKICAgICAvLyBtYWtlIHN1cmUgd2Ugb25seSBoYXZlIG9uZSBwYXRjaCBwZXIgc291cmNlLgogICAgIGRpc2Nvbm5lY3RBdWRpb1NvdXJjZShzb3VyY2VEZXNjKTsKIAotICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSAocm91dGluZ19zdHJhdGVneSkgZ2V0U3RyYXRlZ3lGb3JBdHRyKCZzb3VyY2VEZXNjLT5tQXR0cmlidXRlcyk7Ci0gICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoJnNvdXJjZURlc2MtPm1BdHRyaWJ1dGVzKTsKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzcmNEZXZpY2VEZXNjID0gc291cmNlRGVzYy0+bURldmljZTsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHNvdXJjZURlc2MtPmF0dHJpYnV0ZXMoKTsKKyAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3lGb3JBdHRyKCZhdHRyaWJ1dGVzKTsKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IHNvdXJjZURlc2MtPnN0cmVhbSgpOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNyY0RldmljZURlc2MgPSBzb3VyY2VEZXNjLT5zcmNEZXZpY2UoKTsKIAogICAgIGF1ZGlvX2RldmljZXNfdCBzaW5rRGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIHRydWUpOwogICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNpbmtEZXZpY2VEZXNjID0KICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZShzaW5rRGV2aWNlLCBTdHJpbmc4KCIiKSk7CiAKICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCA9ICZzb3VyY2VEZXNjLT5tUGF0Y2hEZXNjLT5tUGF0Y2g7CiAKLSAgICBpZiAoc3JjRGV2aWNlRGVzYy0+Z2V0QXVkaW9Qb3J0KCktPm1Nb2R1bGUtPmdldEhhbmRsZSgpID09Ci0gICAgICAgICAgICBzaW5rRGV2aWNlRGVzYy0+Z2V0QXVkaW9Qb3J0KCktPm1Nb2R1bGUtPmdldEhhbmRsZSgpICYmCi0gICAgICAgICAgICBzcmNEZXZpY2VEZXNjLT5nZXRBdWRpb1BvcnQoKS0+bU1vZHVsZS0+Z2V0SGFsVmVyc2lvbk1ham9yKCkgPj0gMyAmJgorICAgIGlmIChzcmNEZXZpY2VEZXNjLT5oYXNTYW1lSHdNb2R1bGVBcyhzaW5rRGV2aWNlRGVzYykgJiYKKyAgICAgICAgICAgIHNyY0RldmljZURlc2MtPmdldE1vZHVsZVZlcnNpb25NYWpvcigpID49IDMgJiYKKyAgICAgICAgICAgIHNpbmtEZXZpY2VEZXNjLT5nZXRNb2R1bGUoKS0+c3VwcG9ydHNQYXRjaChzcmNEZXZpY2VEZXNjLCBzaW5rRGV2aWNlRGVzYykgJiYKICAgICAgICAgICAgIHNyY0RldmljZURlc2MtPmdldEF1ZGlvUG9ydCgpLT5tR2FpbnMuc2l6ZSgpID4gMCkgewotICAgICAgICBBTE9HVigiJXMgQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEFMT0dWKCIlcyBEZXZpY2UgdG8gRGV2aWNlIHJvdXRlIHN1cHBvcnRlZCBieSA+PTMuMCBIQUwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAvLyBUT0RPOiBtYXkgZXhwbGljaXRseSBzcGVjaWZ5IHdoZXRoZXIgd2Ugc2hvdWxkIHVzZSBIVyBvciBTVyBwYXRjaAogICAgICAgICAvLyAgIGNyZWF0ZSBwYXRjaCBiZXR3ZWVuIHNyYyBkZXZpY2UgYW5kIG91dHB1dCBkZXZpY2UKICAgICAgICAgLy8gICBjcmVhdGUgSHdvdXRwdXQgYW5kIGFkZCB0byBtSHdPdXRwdXRzCiAgICAgfSBlbHNlIHsKLSAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShzaW5rRGV2aWNlLCBtT3V0cHV0cyk7Ci0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9Ci0gICAgICAgICAgICAgICAgc2VsZWN0T3V0cHV0KG91dHB1dHMsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsIEFVRElPX0ZPUk1BVF9JTlZBTElEKTsKKyAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IHJlc3VsdEF0dHI7CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IHNvdXJjZURlc2MtPmNvbmZpZygpLnNhbXBsZV9yYXRlOworICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gc291cmNlRGVzYy0+Y29uZmlnKCkuY2hhbm5lbF9tYXNrOworICAgICAgICBjb25maWcuZm9ybWF0ID0gc291cmNlRGVzYy0+Y29uZmlnKCkuZm9ybWF0OworICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkU7CisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgICAgIGdldE91dHB1dEZvckF0dHJJbnQoJnJlc3VsdEF0dHIsICZvdXRwdXQsIEFVRElPX1NFU1NJT05fTk9ORSwKKyAgICAgICAgICAgICAgICAmYXR0cmlidXRlcywgJnN0cmVhbSwgc291cmNlRGVzYy0+dWlkKCksICZjb25maWcsICZmbGFncywgJnNlbGVjdGVkRGV2aWNlSWQpOwogICAgICAgICBpZiAob3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgICAgICBBTE9HVigiJXMgbm8gb3V0cHV0IGZvciBkZXZpY2UgJTA4eCIsIF9fRlVOQ1RJT05fXywgc2lua0RldmljZSk7CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0zNDU3LDUxICszNTUwLDU2IEBACiAgICAgICAgIC8vIGJlIGNvbm5lY3RlZCBhcyB3ZWxsIGFzIHRoZSBzdHJlYW0gdHlwZSBmb3Igdm9sdW1lIGNvbnRyb2wKICAgICAgICAgLy8gLSB0aGUgc2luayBpcyBkZWZpbmVkIGJ5IHdoYXRldmVyIG91dHB1dCBkZXZpY2UgaXMgY3VycmVudGx5IHNlbGVjdGVkIGZvciB0aGUgb3V0cHV0CiAgICAgICAgIC8vIHRob3VnaCB3aGljaCB0aGlzIHBhdGNoIGlzIHJvdXRlZC4KLSAgICAgICAgcGF0Y2gtPm51bV9zaW5rcyA9IDA7Ci0gICAgICAgIHBhdGNoLT5udW1fc291cmNlcyA9IDI7Ci0gICAgICAgIHNyY0RldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC0+c291cmNlc1swXSwgTlVMTCk7Ci0gICAgICAgIG91dHB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC0+c291cmNlc1sxXSwgTlVMTCk7Ci0gICAgICAgIHBhdGNoLT5zb3VyY2VzWzFdLmV4dC5taXgudXNlY2FzZS5zdHJlYW0gPSBzdHJlYW07Ci0gICAgICAgIHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKHBhdGNoLAorICAgICAgICBQYXRjaEJ1aWxkZXIgcGF0Y2hCdWlsZGVyOworICAgICAgICBwYXRjaEJ1aWxkZXIuYWRkU291cmNlKHNyY0RldmljZURlc2MpLmFkZFNvdXJjZShvdXRwdXREZXNjLCB7IC5zdHJlYW0gPSBzdHJlYW0gfSk7CisgICAgICAgIHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKHBhdGNoQnVpbGRlci5wYXRjaCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWZQYXRjaEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CiAgICAgICAgIEFMT0dWKCIlcyBwYXRjaCBwYW5lbCByZXR1cm5lZCAlZCBwYXRjaEhhbmRsZSAlZCIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBhZlBhdGNoSGFuZGxlKTsKKyAgICAgICAgc291cmNlRGVzYy0+cGF0Y2hEZXNjKCktPm1QYXRjaCA9ICpwYXRjaEJ1aWxkZXIucGF0Y2goKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgQUxPR1coIiVzIHBhdGNoIHBhbmVsIGNvdWxkIG5vdCBjb25uZWN0IGRldmljZSBwYXRjaCwgZXJyb3IgJWQiLAogICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9CisKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmdldENsaWVudChzb3VyY2VEZXNjLT5wb3J0SWQoKSkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR1coIiVzIHNvdXJjZSBwb3J0SWQgaGFzIGFscmVhZHkgYmVlbiBhdHRhY2hlZCB0byBvdXRwdXREZXNjIiwgX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIG91dHB1dERlc2MtPmFkZENsaWVudChzb3VyY2VEZXNjKTsKKwogICAgICAgICB1aW50MzJfdCBkZWxheU1zID0gMDsKLSAgICAgICAgc3RhdHVzID0gc3RhcnRTb3VyY2Uob3V0cHV0RGVzYywgc3RyZWFtLCBzaW5rRGV2aWNlLCBOVUxMLCAmZGVsYXlNcyk7CisgICAgICAgIHN0YXR1cyA9IHN0YXJ0U291cmNlKG91dHB1dERlc2MsIHNvdXJjZURlc2MsICZkZWxheU1zKTsKIAogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2goc291cmNlRGVzYy0+bVBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIDApOworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHNvdXJjZURlc2MtPnBhdGNoRGVzYygpLT5tQWZQYXRjaEhhbmRsZSwgMCk7CiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICB9Ci0gICAgICAgIHNvdXJjZURlc2MtPm1Td091dHB1dCA9IG91dHB1dERlc2M7CisgICAgICAgIHNvdXJjZURlc2MtPnNldFN3T3V0cHV0KG91dHB1dERlc2MpOwogICAgICAgICBpZiAoZGVsYXlNcyAhPSAwKSB7CiAgICAgICAgICAgICB1c2xlZXAoZGVsYXlNcyAqIDEwMDApOwogICAgICAgICB9CiAgICAgfQogCi0gICAgc291cmNlRGVzYy0+bVBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOwotICAgIGFkZEF1ZGlvUGF0Y2goc291cmNlRGVzYy0+bVBhdGNoRGVzYy0+bUhhbmRsZSwgc291cmNlRGVzYy0+bVBhdGNoRGVzYyk7CisgICAgc291cmNlRGVzYy0+cGF0Y2hEZXNjKCktPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKKyAgICBhZGRBdWRpb1BhdGNoKHNvdXJjZURlc2MtPnBhdGNoRGVzYygpLT5tSGFuZGxlLCBzb3VyY2VEZXNjLT5wYXRjaERlc2MoKSk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSBfX3VudXNlZCkKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gc291cmNlRGVzYyA9IG1BdWRpb1NvdXJjZXMudmFsdWVGb3IoaGFuZGxlKTsKLSAgICBBTE9HVigiJXMgaGFuZGxlICVkIiwgX19GVU5DVElPTl9fLCBoYW5kbGUpOworICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IHNvdXJjZURlc2MgPSBtQXVkaW9Tb3VyY2VzLnZhbHVlRm9yKHBvcnRJZCk7CisgICAgQUxPR1YoIiVzIHBvcnQgSUQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CiAgICAgaWYgKHNvdXJjZURlc2MgPT0gMCkgewotICAgICAgICBBTE9HVygiJXMgdW5rbm93biBzb3VyY2UgZm9yIGhhbmRsZSAlZCIsIF9fRlVOQ1RJT05fXywgaGFuZGxlKTsKKyAgICAgICAgQUxPR1coIiVzIHVua25vd24gc291cmNlIGZvciBwb3J0IElEICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkaXNjb25uZWN0QXVkaW9Tb3VyY2Uoc291cmNlRGVzYyk7CiAKLSAgICBtQXVkaW9Tb3VyY2VzLnJlbW92ZUl0ZW0oaGFuZGxlKTsKKyAgICBtQXVkaW9Tb3VyY2VzLnJlbW92ZUl0ZW0ocG9ydElkKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCkBAIC0zNTQ5LDUwICszNjQ3LDYgQEAKICAgICByZXR1cm4gY29tcHV0ZVZvbHVtZShzdHJlYW0sIGluZGV4LCBkZXZpY2UpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN1cHBvcnRlZEZvcm1hdHMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0VmVjdG9yJiBmb3JtYXRzKSB7Ci0gICAgaWYgKGlvSGFuZGxlID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIFN0cmluZzggcmVwbHk7Ci0gICAgcmVwbHkgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycygKLSAgICAgICAgICAgIGlvSGFuZGxlLCBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRGb3JtYXRzKSk7Ci0gICAgQUxPR1YoIiVzOiBzdXBwb3J0ZWQgZm9ybWF0cyAlcyIsIF9fRlVOQ1RJT05fXywgcmVwbHkuc3RyaW5nKCkpOwotICAgIEF1ZGlvUGFyYW1ldGVyIHJlcGxpZWRQYXJhbWV0ZXJzKHJlcGx5KTsKLSAgICBpZiAocmVwbGllZFBhcmFtZXRlcnMuZ2V0KAotICAgICAgICAgICAgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkRm9ybWF0cyksIHJlcGx5KSAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byByZXRyaWV2ZSBmb3JtYXQsIGJhaWxpbmcgb3V0IiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgZm9yIChhdXRvIGZvcm1hdCA6IGZvcm1hdHNGcm9tU3RyaW5nKHJlcGx5LnN0cmluZygpKSkgewotICAgICAgICAvLyBPbmx5IEFVRElPX0ZPUk1BVF9BQUNfTEMgd2lsbCBiZSB1c2VkIGluIFNldHRpbmdzIFVJIGZvciBhbGwgQUFDIGZvcm1hdHMuCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShBQUNfRk9STUFUUyk7IGkrKykgewotICAgICAgICAgICAgaWYgKGZvcm1hdCA9PSBBQUNfRk9STUFUU1tpXSkgewotICAgICAgICAgICAgICAgIGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9BQUNfTEM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbCBleGlzdCA9IGZhbHNlOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gZm9ybWF0c1tpXSkgewotICAgICAgICAgICAgICAgIGV4aXN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBib29sIGlzU3Vycm91bmRGb3JtYXQgPSBmYWxzZTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKFNVUlJPVU5EX0ZPUk1BVFMpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChTVVJST1VORF9GT1JNQVRTW2ldID09IGZvcm1hdCkgewotICAgICAgICAgICAgICAgIGlzU3Vycm91bmRGb3JtYXQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghZXhpc3QgJiYgaXNTdXJyb3VuZEZvcm1hdCkgewotICAgICAgICAgICAgZm9ybWF0cy5hZGQoZm9ybWF0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3Vycm91bmRGb3JtYXRzKHVuc2lnbmVkIGludCAqbnVtU3Vycm91bmRGb3JtYXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnN1cnJvdW5kRm9ybWF0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnN1cnJvdW5kRm9ybWF0c0VuYWJsZWQsCkBAIC0zNjAyLDE2NCArMzY1Niw5OSBAQAogICAgICAgICAgICAgKHN1cnJvdW5kRm9ybWF0cyA9PSBOVUxMIHx8IHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQgPT0gTlVMTCkpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIEFMT0dWKCJnZXRTdXJyb3VuZEZvcm1hdHMoKSBudW1TdXJyb3VuZEZvcm1hdHMgJWQgc3Vycm91bmRGb3JtYXRzICVwIHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQgJXAiLAotICAgICAgICAgICAgKm51bVN1cnJvdW5kRm9ybWF0cywgc3Vycm91bmRGb3JtYXRzLCBzdXJyb3VuZEZvcm1hdHNFbmFibGVkKTsKLQotICAgIC8vIE9ubHkgcmV0dXJuIHZhbHVlIGlmIHRoZXJlIGlzIEhETUkgb3V0cHV0LgotICAgIGlmICgobUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSAmIEFVRElPX0RFVklDRV9PVVRfSERNSSkgPT0gMCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQorICAgIEFMT0dWKCIlcygpIG51bVN1cnJvdW5kRm9ybWF0cyAlZCBzdXJyb3VuZEZvcm1hdHMgJXAgc3Vycm91bmRGb3JtYXRzRW5hYmxlZCAlcCByZXBvcnRlZCAlZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgKm51bVN1cnJvdW5kRm9ybWF0cywgc3Vycm91bmRGb3JtYXRzLCBzdXJyb3VuZEZvcm1hdHNFbmFibGVkLCByZXBvcnRlZCk7CiAKICAgICBzaXplX3QgZm9ybWF0c1dyaXR0ZW4gPSAwOwogICAgIHNpemVfdCBmb3JtYXRzTWF4ID0gKm51bVN1cnJvdW5kRm9ybWF0czsKLSAgICAqbnVtU3Vycm91bmRGb3JtYXRzID0gMDsKLSAgICBGb3JtYXRWZWN0b3IgZm9ybWF0czsKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+IGZvcm1hdHM7IC8vIFVzZXMgcHJpbWFyeSBzdXJyb3VuZCBmb3JtYXRzIG9ubHkKICAgICBpZiAocmVwb3J0ZWQpIHsKLSAgICAgICAgLy8gT25seSBnZXQgc3Vycm91bmQgZm9ybWF0cyB3aGljaCBhcmUgcmVwb3J0ZWQgYnkgZGV2aWNlLgotICAgICAgICAvLyBGaXJzdCBsaXN0IGFscmVhZHkgb3BlbiBvdXRwdXRzIHRoYXQgY2FuIGJlIHJvdXRlZCB0byB0aGlzIGRldmljZQotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9IRE1JOwotICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHM7Ci0gICAgICAgIGJvb2wgcmVwb3J0ZWRGb3JtYXRGb3VuZCA9IGZhbHNlOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYgKGRlc2MtPnN1cHBvcnRlZERldmljZXMoKSAmIGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICBvdXRwdXRzLmFkZChtT3V0cHV0cy5rZXlBdChpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gT3BlbiBhbiBvdXRwdXQgdG8gcXVlcnkgZHluYW1pYyBwYXJhbWV0ZXJzLgotICAgICAgICBEZXZpY2VWZWN0b3IgaGRtaU91dHB1dERldmljZXMgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoCi0gICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9IRE1JKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZG1pT3V0cHV0RGV2aWNlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gaGRtaU91dHB1dERldmljZXNbaV0tPm1BZGRyZXNzOwotICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6IG1Id01vZHVsZXMpIHsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpW2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydERldmljZShBVURJT19ERVZJQ0VfT1VUX0hETUkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+c3VwcG9ydERldmljZUFkZHJlc3MoYWRkcmVzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBqOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG91dHB1dHMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0cy5pdGVtQXQoaikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYgZGVzYy0+bVByb2ZpbGUgPT0gcHJvZmlsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiAhPSBvdXRwdXRzLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGdldFN1cHBvcnRlZEZvcm1hdHMob3V0cHV0cy5pdGVtQXQoaiksIGZvcm1hdHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVkRm9ybWF0Rm91bmQgfD0gKHN0YXR1cyA9PSBOT19FUlJPUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJvZmlsZS0+Y2FuT3Blbk5ld0lvKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiTWF4IE91dHB1dCBudW1iZXIgJXUgYWxyZWFkeSBvcGVuZWQgZm9yIHRoaXMgcHJvZmlsZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bWF4T3BlbkNvdW50LCBwcm9maWxlLT5nZXRUYWdOYW1lKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJvcGVuaW5nIG91dHB1dCBmb3IgZGV2aWNlICUwOHggd2l0aCBwYXJhbXMgJXMgcHJvZmlsZSAlcCBuYW1lICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwgYWRkcmVzcy5zdHJpbmcoKSwgcHJvZmlsZS5nZXQoKSwgcHJvZmlsZS0+Z2V0TmFtZSgpLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MgPSBuZXcgU3dBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSwgbXBDbGllbnRJbnRlcmZhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNjLT5vcGVuKG51bGxwdHIsIGRldmljZSwgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX0RFRkFVTFQsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gZ2V0U3VwcG9ydGVkRm9ybWF0cyhvdXRwdXQsIGZvcm1hdHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVkRm9ybWF0Rm91bmQgfD0gKHN0YXR1cyA9PSBOT19FUlJPUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+Y2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgLy8gUmV0dXJuIGZvcm1hdHMgZnJvbSBhbGwgZGV2aWNlIHByb2ZpbGVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVzb2x2ZWQgYnkKKyAgICAgICAgLy8gY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkuCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF2YWlsYWJsZU91dHB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldOworICAgICAgICAgICAgRm9ybWF0VmVjdG9yIHN1cHBvcnRlZEZvcm1hdHMgPQorICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmdldEF1ZGlvUG9ydCgpLT5nZXRBdWRpb1Byb2ZpbGVzKCkuZ2V0U3VwcG9ydGVkRm9ybWF0cygpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzdXBwb3J0ZWRGb3JtYXRzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Db25maWcuZ2V0U3Vycm91bmRGb3JtYXRzKCkuY291bnQoc3VwcG9ydGVkRm9ybWF0c1tqXSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXRzLmluc2VydChzdXBwb3J0ZWRGb3JtYXRzW2pdKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHBhaXIgOiBtQ29uZmlnLmdldFN1cnJvdW5kRm9ybWF0cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFpci5zZWNvbmQuY291bnQoc3VwcG9ydGVkRm9ybWF0c1tqXSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMuaW5zZXJ0KHBhaXIuZmlyc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFyZXBvcnRlZEZvcm1hdEZvdW5kKSB7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShTVVJST1VORF9GT1JNQVRTKTsgaSsrKSB7Ci0gICAgICAgICAgICBmb3JtYXRzLmFkZChTVVJST1VORF9GT1JNQVRTW2ldKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogbUNvbmZpZy5nZXRTdXJyb3VuZEZvcm1hdHMoKSkgeworICAgICAgICAgICAgZm9ybWF0cy5pbnNlcnQocGFpci5maXJzdCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmb3JtYXRzLnNpemUoKTsgaSsrKSB7CisgICAgKm51bVN1cnJvdW5kRm9ybWF0cyA9IGZvcm1hdHMuc2l6ZSgpOworICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZm9yY2VVc2UgPSBtRW5naW5lLT5nZXRGb3JjZVVzZSgKKyAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORCk7CisgICAgZm9yIChjb25zdCBhdXRvJiBmb3JtYXQ6IGZvcm1hdHMpIHsKICAgICAgICAgaWYgKGZvcm1hdHNXcml0dGVuIDwgZm9ybWF0c01heCkgewotICAgICAgICAgICAgc3Vycm91bmRGb3JtYXRzW2Zvcm1hdHNXcml0dGVuXSA9IGZvcm1hdHNbaV07Ci0gICAgICAgICAgICBib29sIGZvcm1hdEVuYWJsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChmb3JtYXRzW2ldID09IEFVRElPX0ZPUk1BVF9BQUNfTEMpIHsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IEFSUkFZX1NJWkUoQUFDX0ZPUk1BVFMpOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0RW5hYmxlZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5maW5kKEFBQ19GT1JNQVRTW2ldKSAhPSBtU3Vycm91bmRGb3JtYXRzLmVuZCgpOworICAgICAgICAgICAgc3Vycm91bmRGb3JtYXRzW2Zvcm1hdHNXcml0dGVuXSA9IGZvcm1hdDsKKyAgICAgICAgICAgIGJvb2wgZm9ybWF0RW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICBzd2l0Y2ggKGZvcmNlVXNlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9NQU5VQUw6CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdEVuYWJsZWQgPSBtTWFudWFsU3Vycm91bmRGb3JtYXRzLmNvdW50KGZvcm1hdCkgIT0gMDsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3JtYXRFbmFibGVkID0gbVN1cnJvdW5kRm9ybWF0cy5maW5kKGZvcm1hdHNbaV0pICE9IG1TdXJyb3VuZEZvcm1hdHMuZW5kKCk7CisgICAgICAgICAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9ORVZFUjoKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0RW5hYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiAvLyBBVVRPIG9yIEFMV0FZUyA9PiB0cnVlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3Vycm91bmRGb3JtYXRzRW5hYmxlZFtmb3JtYXRzV3JpdHRlbisrXSA9IGZvcm1hdEVuYWJsZWQ7CiAgICAgICAgIH0KLSAgICAgICAgKCpudW1TdXJyb3VuZEZvcm1hdHMpKys7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQsIGJvb2wgZW5hYmxlZCkKIHsKLSAgICAvLyBDaGVjayBpZiBhdWRpbyBmb3JtYXQgaXMgYSBzdXJyb3VuZCBmb3JtYXRzLgotICAgIGJvb2wgaXNTdXJyb3VuZEZvcm1hdCA9IGZhbHNlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShTVVJST1VORF9GT1JNQVRTKTsgaSsrKSB7Ci0gICAgICAgIGlmIChhdWRpb0Zvcm1hdCA9PSBTVVJST1VORF9GT1JNQVRTW2ldKSB7Ci0gICAgICAgICAgICBpc1N1cnJvdW5kRm9ybWF0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICghaXNTdXJyb3VuZEZvcm1hdCkgeworICAgIEFMT0dWKCIlcygpIGZvcm1hdCAweCVYIGVuYWJsZWQgJWQiLCBfX2Z1bmNfXywgYXVkaW9Gb3JtYXQsIGVuYWJsZWQpOworICAgIGNvbnN0IGF1dG8mIGZvcm1hdEl0ZXIgPSBtQ29uZmlnLmdldFN1cnJvdW5kRm9ybWF0cygpLmZpbmQoYXVkaW9Gb3JtYXQpOworICAgIGlmIChmb3JtYXRJdGVyID09IG1Db25maWcuZ2V0U3Vycm91bmRGb3JtYXRzKCkuZW5kKCkpIHsKKyAgICAgICAgQUxPR1coIiVzKCkgZm9ybWF0IDB4JVggaXMgbm90IGEga25vd24gc3Vycm91bmQgZm9ybWF0IiwgX19mdW5jX18sIGF1ZGlvRm9ybWF0KTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICAvLyBTaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiBNQU5VQUwuCi0gICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBmb3JjZVVzZSA9IG1FbmdpbmUtPmdldEZvcmNlVXNlKAotICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORCk7Ci0gICAgaWYgKGZvcmNlVXNlICE9IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX01BTlVBTCkgeworICAgIGlmIChtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQpICE9CisgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9NQU5VQUwpIHsKKyAgICAgICAgQUxPR1coIiVzKCkgbm90IGluIG1hbnVhbCBtb2RlIGZvciBzdXJyb3VuZCBzb3VuZCBmb3JtYXQgc2VsZWN0aW9uIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgaWYgKChtU3Vycm91bmRGb3JtYXRzLmZpbmQoYXVkaW9Gb3JtYXQpICE9IG1TdXJyb3VuZEZvcm1hdHMuZW5kKCkgJiYgZW5hYmxlZCkKLSAgICAgICAgICAgIHx8IChtU3Vycm91bmRGb3JtYXRzLmZpbmQoYXVkaW9Gb3JtYXQpID09IG1TdXJyb3VuZEZvcm1hdHMuZW5kKCkgJiYgIWVuYWJsZWQpKSB7CisgICAgaWYgKChtTWFudWFsU3Vycm91bmRGb3JtYXRzLmNvdW50KGF1ZGlvRm9ybWF0KSAhPSAwKSA9PSBlbmFibGVkKSB7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKLSAgICAvLyBUaGUgb3BlcmF0aW9uIGlzIHZhbGlkIG9ubHkgd2hlbiB0aGVyZSBpcyBIRE1JIG91dHB1dCBhdmFpbGFibGUuCi0gICAgaWYgKChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpICYgQVVESU9fREVWSUNFX09VVF9IRE1JKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+IHN1cnJvdW5kRm9ybWF0c0JhY2t1cChtTWFudWFsU3Vycm91bmRGb3JtYXRzKTsKICAgICBpZiAoZW5hYmxlZCkgewotICAgICAgICBpZiAoYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX0FBQ19MQykgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKEFBQ19GT1JNQVRTKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5pbnNlcnQoQUFDX0ZPUk1BVFNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5pbnNlcnQoYXVkaW9Gb3JtYXQpOworICAgICAgICBtTWFudWFsU3Vycm91bmRGb3JtYXRzLmluc2VydChhdWRpb0Zvcm1hdCk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgc3ViRm9ybWF0IDogZm9ybWF0SXRlci0+c2Vjb25kKSB7CisgICAgICAgICAgICBtTWFudWFsU3Vycm91bmRGb3JtYXRzLmluc2VydChzdWJGb3JtYXQpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGF1ZGlvRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9BQUNfTEMpIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShBQUNfRk9STUFUUyk7IGkrKykgewotICAgICAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuZXJhc2UoQUFDX0ZPUk1BVFNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5lcmFzZShhdWRpb0Zvcm1hdCk7CisgICAgICAgIG1NYW51YWxTdXJyb3VuZEZvcm1hdHMuZXJhc2UoYXVkaW9Gb3JtYXQpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHN1YkZvcm1hdCA6IGZvcm1hdEl0ZXItPnNlY29uZCkgeworICAgICAgICAgICAgbU1hbnVhbFN1cnJvdW5kRm9ybWF0cy5lcmFzZShzdWJGb3JtYXQpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2M7CiAgICAgYm9vbCBwcm9maWxlVXBkYXRlZCA9IGZhbHNlOwotICAgIERldmljZVZlY3RvciBoZG1pT3V0cHV0RGV2aWNlcyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZSgKKyAgICBEZXZpY2VWZWN0b3IgaGRtaU91dHB1dERldmljZXMgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKAogICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9IRE1JKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhkbWlPdXRwdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIC8vIFNpbXVsYXRlIHJlY29ubmVjdGlvbiB0byB1cGRhdGUgZW5hYmxlZCBzdXJyb3VuZCBzb3VuZCBmb3JtYXRzLgotICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBoZG1pT3V0cHV0RGV2aWNlc1tpXS0+bUFkZHJlc3M7CisgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IGhkbWlPdXRwdXREZXZpY2VzW2ldLT5hZGRyZXNzKCk7CiAgICAgICAgIFN0cmluZzggbmFtZSA9IGhkbWlPdXRwdXREZXZpY2VzW2ldLT5nZXROYW1lKCk7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX0hETUksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLApAQCAtMzc3NCwxMSArMzc2MywxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpKTsKICAgICAgICAgcHJvZmlsZVVwZGF0ZWQgfD0gKHN0YXR1cyA9PSBOT19FUlJPUik7CiAgICAgfQotICAgIERldmljZVZlY3RvciBoZG1pSW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoCisgICAgLy8gRklYTUU6IFdoeSBkb2luZyB0aGlzIGZvciBpbnB1dCBIRE1JIGRldmljZXMgaWYgd2UgZG9uJ3QgYXVnbWVudCB0aGVpciByZXBvcnRlZCBmb3JtYXRzPworICAgIERldmljZVZlY3RvciBoZG1pSW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKAogICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9IRE1JKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhkbWlJbnB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgLy8gU2ltdWxhdGUgcmVjb25uZWN0aW9uIHRvIHVwZGF0ZSBlbmFibGVkIHN1cnJvdW5kIHNvdW5kIGZvcm1hdHMuCi0gICAgICAgIFN0cmluZzggYWRkcmVzcyA9IGhkbWlJbnB1dERldmljZXNbaV0tPm1BZGRyZXNzOworICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBoZG1pSW5wdXREZXZpY2VzW2ldLT5hZGRyZXNzKCk7CiAgICAgICAgIFN0cmluZzggbmFtZSA9IGhkbWlJbnB1dERldmljZXNbaV0tPmdldE5hbWUoKTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9JTl9IRE1JLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKQEAgLTM3OTQsNjkgKzM3ODQsNjcgQEAKICAgICAgICAgcHJvZmlsZVVwZGF0ZWQgfD0gKHN0YXR1cyA9PSBOT19FUlJPUik7CiAgICAgfQogCi0gICAgLy8gVW5kbyB0aGUgc3Vycm91bmQgZm9ybWF0cyBjaGFuZ2UgZHVlIHRvIG5vIGF1ZGlvIHByb2ZpbGVzIHVwZGF0ZWQuCiAgICAgaWYgKCFwcm9maWxlVXBkYXRlZCkgewotICAgICAgICBpZiAoZW5hYmxlZCkgewotICAgICAgICAgICAgaWYgKGF1ZGlvRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9BQUNfTEMpIHsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoQUFDX0ZPUk1BVFMpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5lcmFzZShBQUNfRk9STUFUU1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmVyYXNlKGF1ZGlvRm9ybWF0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfQUFDX0xDKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKEFBQ19GT1JNQVRTKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuaW5zZXJ0KEFBQ19GT1JNQVRTW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuaW5zZXJ0KGF1ZGlvRm9ybWF0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBBTE9HVygiJXMoKSBubyBhdWRpbyBwcm9maWxlcyB1cGRhdGVkLCB1bmRvaW5nIHN1cnJvdW5kIGZvcm1hdHMgY2hhbmdlIiwgX19mdW5jX18pOworICAgICAgICBtTWFudWFsU3Vycm91bmRGb3JtYXRzID0gc3RkOjptb3ZlKHN1cnJvdW5kRm9ybWF0c0JhY2t1cCk7CiAgICAgfQogCiAgICAgcmV0dXJuIHByb2ZpbGVVcGRhdGVkID8gTk9fRVJST1IgOiBJTlZBTElEX09QRVJBVElPTjsKIH0KIAotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFJlY29yZFNpbGVuY2VkKHVpZF90IHVpZCwgYm9vbCBzaWxlbmNlZCkKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRBcHBTdGF0ZSh1aWRfdCB1aWQsIGFwcF9zdGF0ZV90IHN0YXRlKQogewotICAgIEFMT0dWKCJBdWRpb1BvbGljeU1hbmFnZXI6c2V0UmVjb3JkU2lsZW5jZWQodWlkOiVkLCBzaWxlbmNlZDolZCkiLCB1aWQsIHNpbGVuY2VkKTsKKyAgICBBTE9HVigiJXModWlkOiVkLCBzdGF0ZTolZCkiLCBfX2Z1bmNfXywgdWlkLCBzdGF0ZSk7CiAKLSAgICBWZWN0b3I8c3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ID4gYWN0aXZlSW5wdXRzID0gbUlucHV0cy5nZXRBY3RpdmVJbnB1dHMoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFjdGl2ZUlucHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gYWN0aXZlRGVzYyA9IGFjdGl2ZUlucHV0c1tpXTsKLSAgICAgICAgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiBhY3RpdmVTZXNzaW9ucyA9IGFjdGl2ZURlc2MtPmdldEF1ZGlvU2Vzc2lvbnModHJ1ZSk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgYWN0aXZlU2Vzc2lvbnMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvU2Vzc2lvbj4gYWN0aXZlU2Vzc2lvbiA9IGFjdGl2ZVNlc3Npb25zLnZhbHVlQXQoaik7Ci0gICAgICAgICAgICBpZiAoYWN0aXZlU2Vzc2lvbi0+dWlkKCkgPT0gdWlkKSB7Ci0gICAgICAgICAgICAgICAgYWN0aXZlU2Vzc2lvbi0+c2V0U2lsZW5jZWQoc2lsZW5jZWQpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGkpOworICAgICAgICBSZWNvcmRDbGllbnRWZWN0b3IgY2xpZW50cyA9IGlucHV0RGVzYy0+Y2xpZW50c0xpc3QoZmFsc2UgLyphY3RpdmVPbmx5Ki8pOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IGNsaWVudHMpIHsKKyAgICAgICAgICAgIGlmICh1aWQgPT0gY2xpZW50LT51aWQoKSkgeworICAgICAgICAgICAgICAgIGNsaWVudC0+c2V0QXBwU3RhdGUoc3RhdGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmRpc2Nvbm5lY3RBdWRpb1NvdXJjZShjb25zdCBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKQorYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKQogewotICAgIEFMT0dWKCIlcyBoYW5kbGUgJWQiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZURlc2MtPmdldEhhbmRsZSgpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlcykgeworICAgICAgICBjb25zdCBPdXRwdXRQcm9maWxlQ29sbGVjdGlvbiAmb3V0cHV0UHJvZmlsZXMgPSBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZvdXRQcm9maWxlIDogb3V0cHV0UHJvZmlsZXMpIHsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0IGF1ZGlvUG9ydDsKKyAgICAgICAgICAgIG91dFByb2ZpbGUtPnRvQXVkaW9Qb3J0KCZhdWRpb1BvcnQpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhdWRpb1BvcnQubnVtX2NoYW5uZWxfbWFza3M7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChhdWRpb1BvcnQuY2hhbm5lbF9tYXNrc1tpXSAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQogCi0gICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUZvcihzb3VyY2VEZXNjLT5tUGF0Y2hEZXNjLT5tSGFuZGxlKTsKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6ZGlzY29ubmVjdEF1ZGlvU291cmNlKGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKQoreworICAgIEFMT0dWKCIlcyBwb3J0IElkICVkIiwgX19GVU5DVElPTl9fLCBzb3VyY2VEZXNjLT5wb3J0SWQoKSk7CisKKyAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlRm9yKHNvdXJjZURlc2MtPnBhdGNoRGVzYygpLT5tSGFuZGxlKTsKICAgICBpZiAocGF0Y2hEZXNjID09IDApIHsKICAgICAgICAgQUxPR1coIiVzIHNvdXJjZSBoYXMgbm8gcGF0Y2ggd2l0aCBoYW5kbGUgJWQiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgIHNvdXJjZURlc2MtPm1QYXRjaERlc2MtPm1IYW5kbGUpOworICAgICAgICAgICAgICBzb3VyY2VEZXNjLT5wYXRjaERlc2MoKS0+bUhhbmRsZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHJlbW92ZUF1ZGlvUGF0Y2goc291cmNlRGVzYy0+bVBhdGNoRGVzYy0+bUhhbmRsZSk7CisgICAgcmVtb3ZlQXVkaW9QYXRjaChzb3VyY2VEZXNjLT5wYXRjaERlc2MoKS0+bUhhbmRsZSk7CiAKLSAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludCgmc291cmNlRGVzYy0+bUF0dHJpYnV0ZXMpOwotICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzd091dHB1dERlc2MgPSBzb3VyY2VEZXNjLT5tU3dPdXRwdXQucHJvbW90ZSgpOworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzd091dHB1dERlc2MgPSBzb3VyY2VEZXNjLT5zd091dHB1dCgpLnByb21vdGUoKTsKICAgICBpZiAoc3dPdXRwdXREZXNjICE9IDApIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RvcFNvdXJjZShzd091dHB1dERlc2MsIHN0cmVhbSwgZmFsc2UpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdG9wU291cmNlKHN3T3V0cHV0RGVzYywgc291cmNlRGVzYyk7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHN3T3V0cHV0RGVzYy0+c3RvcCgpOwogICAgICAgICB9CiAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKICAgICB9IGVsc2UgewotICAgICAgICBzcDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gaHdPdXRwdXREZXNjID0gc291cmNlRGVzYy0+bUh3T3V0cHV0LnByb21vdGUoKTsKKyAgICAgICAgc3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+IGh3T3V0cHV0RGVzYyA9IHNvdXJjZURlc2MtPmh3T3V0cHV0KCkucHJvbW90ZSgpOwogICAgICAgICBpZiAoaHdPdXRwdXREZXNjICE9IDApIHsKICAgICAgICAgICAvLyAgIHJlbGVhc2UgcGF0Y2ggYmV0d2VlbiBzcmMgZGV2aWNlIGFuZCBvdXRwdXQgZGV2aWNlCiAgICAgICAgICAgLy8gICBjbG9zZSBId291dHB1dCBhbmQgcmVtb3ZlIGZyb20gbUh3T3V0cHV0cwpAQCAtMzg2NywxNSArMzg1NSwxNSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFNvdXJjZUZvclN0cmF0ZWd5T25PdXRwdXQoCitzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFNvdXJjZUZvclN0cmF0ZWd5T25PdXRwdXQoCiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkKIHsKLSAgICBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IHNvdXJjZTsKKyAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2U7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Tb3VyY2VzLnNpemUoKTsgaSsrKSAgewotICAgICAgICBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IHNvdXJjZURlc2MgPSBtQXVkaW9Tb3VyY2VzLnZhbHVlQXQoaSk7Ci0gICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgc291cmNlU3RyYXRlZ3kgPQotICAgICAgICAgICAgICAgIChyb3V0aW5nX3N0cmF0ZWd5KSBnZXRTdHJhdGVneUZvckF0dHIoJnNvdXJjZURlc2MtPm1BdHRyaWJ1dGVzKTsKLSAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBzb3VyY2VEZXNjLT5tU3dPdXRwdXQucHJvbW90ZSgpOworICAgICAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUF0KGkpOworICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHNvdXJjZURlc2MtPmF0dHJpYnV0ZXMoKTsKKyAgICAgICAgcm91dGluZ19zdHJhdGVneSBzb3VyY2VTdHJhdGVneSA9IGdldFN0cmF0ZWd5Rm9yQXR0cigmYXR0cmlidXRlcyk7CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gc291cmNlRGVzYy0+c3dPdXRwdXQoKS5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChzb3VyY2VTdHJhdGVneSA9PSBzdHJhdGVneSAmJiBvdXRwdXREZXNjICE9IDAgJiYgb3V0cHV0RGVzYy0+bUlvSGFuZGxlID09IG91dHB1dCkgewogICAgICAgICAgICAgc291cmNlID0gc291cmNlRGVzYzsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMzg5Miw3ICszODgwLDYgQEAKICAgICByZXR1cm4gbUF1ZGlvUG9ydEdlbmVyYXRpb24rKzsKIH0KIAotI2lmZGVmIFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYKIC8vIFRyZWJsaXplZCBhdWRpbyBwb2xpY3kgeG1sIGNvbmZpZyB3aWxsIGJlIGxvY2F0ZWQgaW4gL29kbS9ldGMgb3IgL3ZlbmRvci9ldGMuCiBzdGF0aWMgY29uc3QgY2hhciAqa0NvbmZpZ0xvY2F0aW9uTGlzdFtdID0KICAgICAgICAgeyIvb2RtL2V0YyIsICIvdmVuZG9yL2V0YyIsICIvc3lzdGVtL2V0YyJ9OwpAQCAtMzkxMyw0MyArMzkwMCwzNSBAQAogCiAgICAgZm9yIChjb25zdCBjaGFyKiBmaWxlTmFtZSA6IGZpbGVOYW1lcykgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtDb25maWdMb2NhdGlvbkxpc3RTaXplOyBpKyspIHsKLSAgICAgICAgICAgIFBvbGljeVNlcmlhbGl6ZXIgc2VyaWFsaXplcjsKICAgICAgICAgICAgIHNucHJpbnRmKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSwgc2l6ZW9mKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSksCiAgICAgICAgICAgICAgICAgICAgICAiJXMvJXMiLCBrQ29uZmlnTG9jYXRpb25MaXN0W2ldLCBmaWxlTmFtZSk7Ci0gICAgICAgICAgICByZXQgPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSwgY29uZmlnKTsKKyAgICAgICAgICAgIHJldCA9IGRlc2VyaWFsaXplQXVkaW9Qb2xpY3lGaWxlKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSwgJmNvbmZpZyk7CiAgICAgICAgICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgY29uZmlnLnNldFNvdXJjZShhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUpOwogICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHJldDsKIH0KLSNlbmRpZgogCiBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9saWN5TWFuYWdlcihBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAvKmZvclRlc3RpbmcqLykKICAgICA6Ci0gICAgbVVpZENhY2hlZChnZXR1aWQoKSksCisgICAgbVVpZENhY2hlZChBSURfQVVESU9TRVJWRVIpLCAvLyBubyBuZWVkIHRvIGNhbGwgZ2V0dWlkKCksIHRoZXJlJ3Mgb25seSBvbmUgb2YgdXMgcnVubmluZy4KICAgICBtcENsaWVudEludGVyZmFjZShjbGllbnRJbnRlcmZhY2UpLAogICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lKGZhbHNlKSwgbUxhc3RWb2ljZVZvbHVtZSgtMS4wZiksCiAgICAgbUEyZHBTdXNwZW5kZWQoZmFsc2UpLAotI2lmZGVmIFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYKICAgICBtVm9sdW1lQ3VydmVzKG5ldyBWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uKCkpLAogICAgIG1Db25maWcobUh3TW9kdWxlc0FsbCwgbUF2YWlsYWJsZU91dHB1dERldmljZXMsIG1BdmFpbGFibGVJbnB1dERldmljZXMsCiAgICAgICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZSwgc3RhdGljX2Nhc3Q8Vm9sdW1lQ3VydmVzQ29sbGVjdGlvbio+KG1Wb2x1bWVDdXJ2ZXMuZ2V0KCkpKSwKLSNlbHNlCi0gICAgbVZvbHVtZUN1cnZlcyhuZXcgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb24oKSksCi0gICAgbUNvbmZpZyhtSHdNb2R1bGVzQWxsLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgbUF2YWlsYWJsZUlucHV0RGV2aWNlcywKLSAgICAgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlKSwKLSNlbmRpZgogICAgIG1BdWRpb1BvcnRHZW5lcmF0aW9uKDEpLAogICAgIG1CZWFjb25NdXRlUmVmQ291bnQoMCksCiAgICAgbUJlYWNvblBsYXlpbmdSZWZDb3VudCgwKSwKICAgICBtQmVhY29uTXV0ZWQoZmFsc2UpLAogICAgIG1UdHNPdXRwdXRBdmFpbGFibGUoZmFsc2UpLAogICAgIG1NYXN0ZXJNb25vKGZhbHNlKSwKLSAgICBtTXVzaWNFZmZlY3RPdXRwdXQoQVVESU9fSU9fSEFORExFX05PTkUpLAotICAgIG1IYXNDb21wdXRlZFNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmUoZmFsc2UpCisgICAgbU11c2ljRWZmZWN0T3V0cHV0KEFVRElPX0lPX0hBTkRMRV9OT05FKQogewogfQogCkBAIC0zOTYwLDEzICszOTM5LDE2IEBACiAgICAgaW5pdGlhbGl6ZSgpOwogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6bG9hZENvbmZpZygpIHsKLSNpZmRlZiBVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GCi0gICAgaWYgKGRlc2VyaWFsaXplQXVkaW9Qb2xpY3lYbWxDb25maWcoZ2V0Q29uZmlnKCkpICE9IE5PX0VSUk9SKSB7Ci0jZWxzZQotICAgIGlmICgoQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkQ29uZmlnKEFVRElPX1BPTElDWV9WRU5ET1JfQ09ORklHX0ZJTEUsIGdldENvbmZpZygpKSAhPSBOT19FUlJPUikKLSAgICAgICAgICAgJiYgKENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZENvbmZpZyhBVURJT19QT0xJQ1lfQ09ORklHX0ZJTEUsIGdldENvbmZpZygpKSAhPSBOT19FUlJPUikpIHsKKy8vICBUaGlzIGNoZWNrIGlzIHRvIGNhdGNoIGFueSBsZWdhY3kgcGxhdGZvcm0gdXBkYXRpbmcgdG8gUSB3aXRob3V0IGhhdmluZworLy8gIHN3aXRjaGVkIHRvIFhNTCBzaW5jZSBpdHMgZGVwcmVjYXRpb24gb24gTy4KKy8vIFRPRE86IGFmdGVyIFEgcmVsZWFzZSwgcmVtb3ZlIHRoaXMgY2hlY2sgYW5kIGZsYWcgYXMgWE1MIGlzIG5vdyB0aGUgb25seQorLy8gICAgICAgIG9wdGlvbiBhbmQgYWxsIGxlZ2FjeSBwbGF0Zm9ybSBzaG91bGQgaGF2ZSB0cmFuc2l0aW9uZWQgdG8gWE1MLgorI2lmbmRlZiBVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GCisjZXJyb3IgQXVkaW8gcG9saWN5IG5vIGxvbmdlciBzdXBwb3J0cyBsZWdhY3kgLmNvbmYgY29uZmlndXJhdGlvbiBmb3JtYXQKICNlbmRpZgorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6bG9hZENvbmZpZygpIHsKKyAgICBpZiAoZGVzZXJpYWxpemVBdWRpb1BvbGljeVhtbENvbmZpZyhnZXRDb25maWcoKSkgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBsb2FkIGF1ZGlvIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUsIHNldHRpbmcgZGVmYXVsdHMiKTsKICAgICAgICAgZ2V0Q29uZmlnKCkuc2V0RGVmYXVsdCgpOwogICAgIH0KQEAgLTQwNDAsOSArNDAyMiw5IEBACiAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG5ldyBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihvdXRQcm9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UpOwogICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZzdXBwb3J0ZWREZXZpY2VzID0gb3V0UHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpOwotICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzRm9yVHlwZSA9IHN1cHBvcnRlZERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKHByb2ZpbGVUeXBlKTsKLSAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IGRldmljZXNGb3JUeXBlLnNpemUoKSA+IDAgPyBkZXZpY2VzRm9yVHlwZS5pdGVtQXQoMCktPm1BZGRyZXNzCi0gICAgICAgICAgICAgICAgICAgIDogU3RyaW5nOCgiIik7CisgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXNGb3JUeXBlID0gc3VwcG9ydGVkRGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKAorICAgICAgICAgICAgICAgICAgICBwcm9maWxlVHlwZSk7CisgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBnZXRGaXJzdERldmljZUFkZHJlc3MoZGV2aWNlc0ZvclR5cGUpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvdXRwdXREZXNjLT5vcGVuKG51bGxwdHIsIHByb2ZpbGVUeXBlLCBhZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9ERUZBVUxULCBBVURJT19PVVRQVVRfRkxBR19OT05FLCAmb3V0cHV0KTsKQEAgLTQwOTQsMTAgKzQwNzYsOSBAQAogICAgICAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9CiAgICAgICAgICAgICAgICAgICAgIG5ldyBBdWRpb0lucHV0RGVzY3JpcHRvcihpblByb2ZpbGUsIG1wQ2xpZW50SW50ZXJmYWNlKTsKIAotICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGlucHV0RGV2aWNlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKHByb2ZpbGVUeXBlKTsKKyAgICAgICAgICAgIERldmljZVZlY3RvciBpbnB1dERldmljZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZU1hc2socHJvZmlsZVR5cGUpOwogICAgICAgICAgICAgLy8gICB0aGUgaW5wdXRzIHZlY3RvciBtdXN0IGJlIG9mIHNpemUgPj0gMSwgYnV0IHdlIGRvbid0IHdhbnQgdG8gY3Jhc2ggaGVyZQotICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gaW5wdXREZXZpY2VzLnNpemUoKSA+IDAgPyBpbnB1dERldmljZXMuaXRlbUF0KDApLT5tQWRkcmVzcwotICAgICAgICAgICAgICAgICAgICA6IFN0cmluZzgoIiIpOworICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gZ2V0Rmlyc3REZXZpY2VBZGRyZXNzKGlucHV0RGV2aWNlcyk7CiAgICAgICAgICAgICBBTE9HVigiICBmb3IgaW5wdXQgZGV2aWNlIDB4JXggdXNpbmcgYWRkcmVzcyAlcyIsIHByb2ZpbGVUeXBlLCBhZGRyZXNzLnN0cmluZygpKTsKICAgICAgICAgICAgIEFMT0dFX0lGKGlucHV0RGV2aWNlcy5zaXplKCkgPT0gMCwgIklucHV0IGRldmljZSBsaXN0IGlzIGVtcHR5ISIpOwogCkBAIC00MTU5LDExICs0MTQwLDExIEBACiAgICAgfQogICAgIC8vIElmIG1pY3JvcGhvbmVzIGFkZHJlc3MgaXMgZW1wdHksIHNldCBpdCBhY2NvcmRpbmcgdG8gZGV2aWNlIHR5cGUKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSAgPCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5tQWRkcmVzcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgaWYgKG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPmFkZHJlc3MoKS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIGlmIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT50eXBlKCkgPT0gQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDKSB7Ci0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+bUFkZHJlc3MgPSBTdHJpbmc4KEFVRElPX0JPVFRPTV9NSUNST1BIT05FX0FERFJFU1MpOworICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPnNldEFkZHJlc3MoU3RyaW5nOChBVURJT19CT1RUT01fTUlDUk9QSE9ORV9BRERSRVNTKSk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPnR5cGUoKSA9PSBBVURJT19ERVZJQ0VfSU5fQkFDS19NSUMpIHsKLSAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5tQWRkcmVzcyA9IFN0cmluZzgoQVVESU9fQkFDS19NSUNST1BIT05FX0FERFJFU1MpOworICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPnNldEFkZHJlc3MoU3RyaW5nOChBVURJT19CQUNLX01JQ1JPUEhPTkVfQUREUkVTUykpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNDE5NCw3ICs0MTc1LDcgQEAKICAgIG1JbnB1dHMuY2xlYXIoKTsKICAgIG1Id01vZHVsZXMuY2xlYXIoKTsKICAgIG1Id01vZHVsZXNBbGwuY2xlYXIoKTsKLSAgIG1TdXJyb3VuZEZvcm1hdHMuY2xlYXIoKTsKKyAgIG1NYW51YWxTdXJyb3VuZEZvcm1hdHMuY2xlYXIoKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbml0Q2hlY2soKQpAQCAtNDMzMiw3ICs0MzEzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMob3V0cHV0LCBTdHJpbmc4KHBhcmFtKSk7CiAgICAgICAgICAgICAgICAgICAgIGZyZWUocGFyYW0pOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1cGRhdGVBdWRpb1Byb2ZpbGVzKGRldmljZSwgb3V0cHV0LCBwcm9maWxlLT5nZXRBdWRpb1Byb2ZpbGVzKCkpOworICAgICAgICAgICAgICAgIHVwZGF0ZUF1ZGlvUHJvZmlsZXMoZGV2RGVzYywgb3V0cHV0LCBwcm9maWxlLT5nZXRBdWRpb1Byb2ZpbGVzKCkpOwogICAgICAgICAgICAgICAgIGlmICghcHJvZmlsZS0+aGFzVmFsaWRBdWRpb1Byb2ZpbGUoKSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgbWlzc2luZyBwYXJhbSIpOwogICAgICAgICAgICAgICAgICAgICBkZXNjLT5jbG9zZSgpOwpAQCAtNDU0MCw3ICs0NTIxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoaW5wdXQsIFN0cmluZzgocGFyYW0pKTsKICAgICAgICAgICAgICAgICAgICAgZnJlZShwYXJhbSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVwZGF0ZUF1ZGlvUHJvZmlsZXMoZGV2aWNlLCBpbnB1dCwgcHJvZmlsZS0+Z2V0QXVkaW9Qcm9maWxlcygpKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVBdWRpb1Byb2ZpbGVzKGRldkRlc2MsIGlucHV0LCBwcm9maWxlLT5nZXRBdWRpb1Byb2ZpbGVzKCkpOwogICAgICAgICAgICAgICAgIGlmICghcHJvZmlsZS0+aGFzVmFsaWRBdWRpb1Byb2ZpbGUoKSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKSBkaXJlY3QgaW5wdXQgbWlzc2luZyBwYXJhbSIpOwogICAgICAgICAgICAgICAgICAgICBkZXNjLT5jbG9zZSgpOwpAQCAtNDYyNiwxMCArNDYwNyw5IEBACiAgICAgICAgICAgICAvLyBhbmQgYXMgdGhleSB3ZXJlIGFsc28gcmVmZXJlbmNlZCBvbiB0aGUgb3RoZXIgb3V0cHV0LCB0aGUgcmVmZXJlbmNlCiAgICAgICAgICAgICAvLyBjb3VudCBmb3IgdGhlaXIgc3RyZWFtIHR5cGUgbXVzdCBiZSBhZGp1c3RlZCBhY2NvcmRpbmdseSBvbgogICAgICAgICAgICAgLy8gdGhlIG90aGVyIG91dHB1dC4KLSAgICAgICAgICAgIGJvb2wgd2FzQWN0aXZlID0gb3V0cHV0RGVzYzItPmlzQWN0aXZlKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IEFVRElPX1NUUkVBTV9DTlQ7IGorKykgewotICAgICAgICAgICAgICAgIGludCByZWZDb3VudCA9IGR1cE91dHB1dERlc2MtPm1SZWZDb3VudFtqXTsKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjMi0+Y2hhbmdlUmVmQ291bnQoKGF1ZGlvX3N0cmVhbV90eXBlX3QpaiwtcmVmQ291bnQpOworICAgICAgICAgICAgY29uc3QgYm9vbCB3YXNBY3RpdmUgPSBvdXRwdXREZXNjMi0+aXNBY3RpdmUoKTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50UGFpciA6IGR1cE91dHB1dERlc2MtPmdldEFjdGl2ZUNsaWVudHMoKSkgeworICAgICAgICAgICAgICAgIG91dHB1dERlc2MyLT5jaGFuZ2VTdHJlYW1BY3RpdmVDb3VudChjbGllbnRQYWlyLmZpcnN0LCAtY2xpZW50UGFpci5zZWNvbmQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gc3RvcCgpIHdpbGwgYmUgYSBubyBvcCBpZiB0aGUgb3V0cHV0IGlzIHN0aWxsIGFjdGl2ZSBidXQgaXMgbmVlZGVkIGluIGNhc2UgYWxsCiAgICAgICAgICAgICAvLyBhY3RpdmUgc3RyZWFtcyByZWZjb3VudHMgd2hlcmUgY2xlYXJlZCBhYm92ZQpAQCAtNDY1OCw2ICs0NjM4LDIyIEBACiAKICAgICByZW1vdmVPdXRwdXQob3V0cHV0KTsKICAgICBtUHJldmlvdXNPdXRwdXRzID0gbU91dHB1dHM7CisKKyAgICAvLyBNU0QgcGF0Y2hlcyBtYXkgaGF2ZSBiZWVuIHJlbGVhc2VkIHRvIHN1cHBvcnQgYSBub24tTVNEIGRpcmVjdCBvdXRwdXQuIFJlc2V0IE1TRCBwYXRjaCBpZgorICAgIC8vIG5vIGRpcmVjdCBvdXRwdXRzIGFyZSBvcGVuLgorICAgIGlmIChtSHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpICE9IDApIHsKKyAgICAgICAgYm9vbCBkaXJlY3RPdXRwdXRPcGVuID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtT3V0cHV0c1tpXS0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSB7CisgICAgICAgICAgICAgICAgZGlyZWN0T3V0cHV0T3BlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFkaXJlY3RPdXRwdXRPcGVuKSB7CisgICAgICAgICAgICBBTE9HVigibm8gZGlyZWN0IG91dHB1dHMgb3BlbiwgcmVzZXQgTVNEIHBhdGNoIik7CisgICAgICAgICAgICBzZXRNc2RQYXRjaCgpOworICAgICAgICB9CisgICAgfQogfQogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xvc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKQEAgLTQ2NzIsNiArNDY2OCw3IEBACiAKICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwogCisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGlucHV0RGVzYy0+bURldmljZTsKICAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGlucHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7CiAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKQEAgLTQ2ODIsNiArNDY3OSwxMiBAQAogCiAgICAgaW5wdXREZXNjLT5jbG9zZSgpOwogICAgIG1JbnB1dHMucmVtb3ZlSXRlbShpbnB1dCk7CisKKyAgICBhdWRpb19kZXZpY2VzX3QgcHJpbWFyeUlucHV0RGV2aWNlcyA9IGF2YWlsYWJsZVByaW1hcnlJbnB1dERldmljZXMoKTsKKyAgICBpZiAoKChkZXZpY2UgJiBwcmltYXJ5SW5wdXREZXZpY2VzICYgfkFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApICYmCisgICAgICAgICAgICBtSW5wdXRzLmFjdGl2ZUlucHV0c0NvdW50T25EZXZpY2VzKHByaW1hcnlJbnB1dERldmljZXMpID09IDApIHsKKyAgICAgICAgU291bmRUcmlnZ2VyOjpzZXRDYXB0dXJlU3RhdGUoZmFsc2UpOworICAgIH0KIH0KIAogU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dHNGb3JEZXZpY2UoCkBAIC00NzAzLDE4ICs0NzA2LDE3IEBACiAgICAgcmV0dXJuIG91dHB1dHM7CiB9CiAKLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp2ZWN0b3JzRXF1YWwoU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0czEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMyKQordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrRm9yRGV2aWNlQW5kT3V0cHV0Q2hhbmdlcyhzdGQ6OmZ1bmN0aW9uPGJvb2woKT4gb25PdXRwdXRzQ2hlY2tlZCkKIHsKLSAgICBpZiAob3V0cHV0czEuc2l6ZSgpICE9IG91dHB1dHMyLnNpemUoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgLy8gY2hlY2tBMmRwU3VzcGVuZCBtdXN0IHJ1biBiZWZvcmUgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzIHNvIHRoYXQgQTJEUAorICAgIC8vIG91dHB1dCBpcyBzdXNwZW5kZWQgYmVmb3JlIGFueSB0cmFja3MgYXJlIG1vdmVkIHRvIGl0CisgICAgY2hlY2tBMmRwU3VzcGVuZCgpOworICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOworICAgIGlmIChvbk91dHB1dHNDaGVja2VkICE9IG51bGxwdHIgJiYgb25PdXRwdXRzQ2hlY2tlZCgpKSBjaGVja0EyZHBTdXNwZW5kKCk7CisgICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKKyAgICBpZiAobUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKSAhPSAwKSB7CisgICAgICAgIHNldE1zZFBhdGNoKCk7CiAgICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0czEuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG91dHB1dHMxW2ldICE9IG91dHB1dHMyW2ldKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja091dHB1dEZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpCkBAIC00NzQyLDcgKzQ3NDQsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCF2ZWN0b3JzRXF1YWwoc3JjT3V0cHV0cyxkc3RPdXRwdXRzKSkgeworICAgIGlmIChzcmNPdXRwdXRzICE9IGRzdE91dHB1dHMpIHsKICAgICAgICAgLy8gZ2V0IG1heGltdW0gbGF0ZW5jeSBvZiBhbGwgc291cmNlIG91dHB1dHMgdG8gZGV0ZXJtaW5lIHRoZSBtaW5pbXVtIG11dGUgdGltZSBndWFyYW50ZWVpbmcKICAgICAgICAgLy8gYXVkaW8gZnJvbSBpbnZhbGlkYXRlZCB0cmFja3Mgd2lsbCBiZSByZW5kZXJlZCB3aGVuIHVubXV0aW5nCiAgICAgICAgIHVpbnQzMl90IG1heExhdGVuY3kgPSAwOwpAQCAtNDc2MSw3ICs0NzYzLDcgQEAKICAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoc3RyYXRlZ3ksIHRydWUsIGRlc2MpOwogICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShzdHJhdGVneSwgZmFsc2UsIGRlc2MsIG1heExhdGVuY3kgKiBMQVRFTkNZX01VVEVfRkFDVE9SLCBuZXdEZXZpY2UpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiBzb3VyY2UgPQorICAgICAgICAgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gc291cmNlID0KICAgICAgICAgICAgICAgICAgICAgZ2V0U291cmNlRm9yU3RyYXRlZ3lPbk91dHB1dChzcmNPdXQsIHN0cmF0ZWd5KTsKICAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gMCl7CiAgICAgICAgICAgICAgICAgY29ubmVjdEF1ZGlvU291cmNlKHNvdXJjZSk7CkBAIC00ODQ2LDExICs0ODQ4LDQxIEBACiAgICAgfQogfQogCit0ZW1wbGF0ZSA8Y2xhc3MgSW9EZXNjcmlwdG9yLCBjbGFzcyBGaWx0ZXI+CitzcDxEZXZpY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OmZpbmRQcmVmZXJyZWREZXZpY2UoCisgICAgICAgIElvRGVzY3JpcHRvciYgZGVzYywgRmlsdGVyIGZpbHRlciwgYm9vbCYgYWN0aXZlLCBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMpCit7CisgICAgYXV0byBhY3RpdmVDbGllbnRzID0gZGVzYy0+Y2xpZW50c0xpc3QodHJ1ZSAvKmFjdGl2ZU9ubHkqLyk7CisgICAgYXV0byBhY3RpdmVDbGllbnRzV2l0aFJvdXRlID0KKyAgICAgICAgZGVzYy0+Y2xpZW50c0xpc3QodHJ1ZSAvKmFjdGl2ZU9ubHkqLywgZmlsdGVyLCB0cnVlIC8qcHJlZmVycmVkRGV2aWNlKi8pOworICAgIGFjdGl2ZSA9IGFjdGl2ZUNsaWVudHMuc2l6ZSgpID4gMDsKKyAgICBpZiAoYWN0aXZlICYmIGFjdGl2ZUNsaWVudHMuc2l6ZSgpID09IGFjdGl2ZUNsaWVudHNXaXRoUm91dGUuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBkZXZpY2VzLmdldERldmljZUZyb21JZChhY3RpdmVDbGllbnRzV2l0aFJvdXRlWzBdLT5wcmVmZXJyZWREZXZpY2VJZCgpKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBJb0NvbGxlY3Rpb24sIGNsYXNzIEZpbHRlcj4KK3NwPERldmljZURlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWFuYWdlcjo6ZmluZFByZWZlcnJlZERldmljZSgKKyAgICAgICAgSW9Db2xsZWN0aW9uJiBpb0NvbGxlY3Rpb24sIEZpbHRlciBmaWx0ZXIsIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcykKK3sKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpb0NvbGxlY3Rpb24uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgYXV0byBkZXNjID0gaW9Db2xsZWN0aW9uLnZhbHVlQXQoaSk7CisgICAgICAgIGJvb2wgYWN0aXZlOworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBjdXJEZXZpY2UgPSBmaW5kUHJlZmVycmVkRGV2aWNlKGRlc2MsIGZpbHRlciwgYWN0aXZlLCBkZXZpY2VzKTsKKyAgICAgICAgaWYgKGFjdGl2ZSAmJiBjdXJEZXZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0gZWxzZSBpZiAoY3VyRGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGRldmljZSA9IGN1ckRldmljZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGV2aWNlOworfQorCiBhdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXROZXdPdXRwdXREZXZpY2UoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSkKIHsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7Ci0KICAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOwogICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CkBAIC00ODYxLDE4ICs0ODkzLDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBDaGVjayBpZiBhbiBleHBsaWNpdCByb3V0aW5nIHJlcXVlc3QgZXhpc3RzIGZvciBhbiBhY3RpdmUgc3RyZWFtIG9uIHRoaXMgb3V0cHV0IGFuZAotICAgIC8vIHVzZSBpdCBpbiBwcmlvcml0eSBiZWZvcmUgYW55IG90aGVyIHJ1bGUKLSAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IHN0cmVhbSsrKSB7Ci0gICAgICAgIGlmIChvdXRwdXREZXNjLT5pc1N0cmVhbUFjdGl2ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0pKSB7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZm9yY2VkRGV2aWNlID0KLSAgICAgICAgICAgICAgICAgICAgbU91dHB1dFJvdXRlcy5nZXRBY3RpdmVEZXZpY2VGb3JTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyk7Ci0KLSAgICAgICAgICAgIGlmIChmb3JjZWREZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZm9yY2VkRGV2aWNlOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgLy8gSG9ub3IgZXhwbGljaXQgcm91dGluZyByZXF1ZXN0cyBvbmx5IGlmIG5vIGNsaWVudCB1c2luZyBkZWZhdWx0IHJvdXRpbmcgaXMgYWN0aXZlIG9uIHRoaXMKKyAgICAvLyBpbnB1dDogYSBzcGVjaWZpYyBhcHAgY2FuIG5vdCBmb3JjZSByb3V0aW5nIGZvciBvdGhlciBhcHBzIGJ5IHNldHRpbmcgYSBwcmVmZXJyZWQgZGV2aWNlLgorICAgIGJvb2wgYWN0aXZlOyAvLyB1bnVzZWQKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0KKyAgICAgICAgZmluZFByZWZlcnJlZERldmljZShvdXRwdXREZXNjLCBTVFJBVEVHWV9OT05FLCBhY3RpdmUsIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKKyAgICBpZiAoZGV2aWNlRGVzYyAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBkZXZpY2VEZXNjLT50eXBlKCk7CiAgICAgfQogCiAgICAgLy8gY2hlY2sgdGhlIGZvbGxvd2luZyBieSBvcmRlciBvZiBwcmlvcml0eSB0byByZXF1ZXN0IGEgcm91dGluZyBjaGFuZ2UgaWYgbmVjZXNzYXJ5OgpAQCAtNDg5OCwxMyArNDkyNSwxNCBAQAogICAgIC8vIEZJWE1FOiBleHRlbmQgdXNlIG9mIGlzU3RyYXRlZ3lBY3RpdmVPblNhbWVNb2R1bGUoKSB0byBhbGwgc3RyYXRlZ2llcwogICAgIC8vIHdpdGggYSByZWZpbmVkIHJ1bGUgY29uc2lkZXJpbmcgbXV0dWFsbHkgZXhjbHVzaXZlIGRldmljZXMgKHVzaW5nIHNhbWUgYmFja2VuZCkKICAgICAvLyBhcyBvcHBvc2VkIHRvIGFsbCBzdHJlYW1zIG9uIHRoZSBzYW1lIGF1ZGlvIEhBTCBtb2R1bGUuCisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOwogICAgIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpICYmCiAgICAgICAgIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKSB7CiAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUsIGZyb21DYWNoZSk7CiAgICAgfSBlbHNlIGlmIChpc0luQ2FsbCgpIHx8CiAgICAgICAgICAgICAgICBpc1N0cmF0ZWd5QWN0aXZlT25TYW1lTW9kdWxlKG91dHB1dERlc2MsIFNUUkFURUdZX1BIT05FKSkgewogICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9QSE9ORSwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSkgeworICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZU9uU2FtZU1vZHVsZShvdXRwdXREZXNjLCBTVFJBVEVHWV9TT05JRklDQVRJT04pKSB7CiAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTiwgZnJvbUNhY2hlKTsKICAgICB9IGVsc2UgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSkpIHsKICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSwgZnJvbUNhY2hlKTsKQEAgLTQ5NDAsOSArNDk2OCwxOCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gSG9ub3IgZXhwbGljaXQgcm91dGluZyByZXF1ZXN0cyBvbmx5IGlmIG5vIGNsaWVudCB1c2luZyBkZWZhdWx0IHJvdXRpbmcgaXMgYWN0aXZlIG9uIHRoaXMKKyAgICAvLyBpbnB1dDogYSBzcGVjaWZpYyBhcHAgY2FuIG5vdCBmb3JjZSByb3V0aW5nIGZvciBvdGhlciBhcHBzIGJ5IHNldHRpbmcgYSBwcmVmZXJyZWQgZGV2aWNlLgorICAgIGJvb2wgYWN0aXZlOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2MgPQorICAgICAgICBmaW5kUHJlZmVycmVkRGV2aWNlKGlucHV0RGVzYywgQVVESU9fU09VUkNFX0RFRkFVTFQsIGFjdGl2ZSwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcyk7CisgICAgaWYgKGRldmljZURlc2MgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZGV2aWNlRGVzYy0+dHlwZSgpOworICAgIH0KKwogICAgIC8vIElmIHdlIGFyZSBub3QgaW4gY2FsbCBhbmQgbm8gY2xpZW50IGlzIGFjdGl2ZSBvbiB0aGlzIGlucHV0LCB0aGlzIG1ldGhvZHMgcmV0dXJucwogICAgIC8vIEFVRElPX0RFVklDRV9OT05FLCBjYXVzaW5nIHRoZSBwYXRjaCBvbiB0aGUgaW5wdXQgc3RyZWFtIHRvIGJlIHJlbGVhc2VkLgotICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IGlucHV0RGVzYy0+Z2V0SGlnaGVzdFByaW9yaXR5U291cmNlKHRydWUgLyphY3RpdmVPbmx5Ki8pOworICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IGlucHV0RGVzYy0+c291cmNlKCk7CiAgICAgaWYgKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfREVGQVVMVCAmJiBpc0luQ2FsbCgpKSB7CiAgICAgICAgIHNvdXJjZSA9IEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OOwogICAgIH0KQEAgLTQ5NjksNiArNTAwNiw3IEBACiAgICAgaWYgKHN0cmVhbSA8IChhdWRpb19zdHJlYW1fdHlwZV90KSAwIHx8IHN0cmVhbSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgewogICAgICAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7CiAgICAgfQorICAgIGF1ZGlvX2RldmljZXNfdCBhY3RpdmVEZXZpY2VzID0gQVVESU9fREVWSUNFX05PTkU7CiAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSBBVURJT19ERVZJQ0VfTk9ORTsKICAgICBmb3IgKGludCBjdXJTdHJlYW0gPSAwOyBjdXJTdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IGN1clN0cmVhbSsrKSB7CiAgICAgICAgIGlmICghc3RyZWFtc01hdGNoRm9ydm9sdW1lKHN0cmVhbSwgKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKSkgewpAQCAtNDk3NywxNSArNTAxNSwyMCBAQAogICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IGN1clN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKTsKICAgICAgICAgYXVkaW9fZGV2aWNlc190IGN1ckRldmljZXMgPQogICAgICAgICAgICAgICAgIGdldERldmljZUZvclN0cmF0ZWd5KChyb3V0aW5nX3N0cmF0ZWd5KWN1clN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgZGV2aWNlcyB8PSBjdXJEZXZpY2VzOwogICAgICAgICBmb3IgKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA6IGdldE91dHB1dHNGb3JEZXZpY2UoY3VyRGV2aWNlcywgbU91dHB1dHMpKSB7CiAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwogICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSkpIHsKLSAgICAgICAgICAgICAgICBjdXJEZXZpY2VzIHw9IG91dHB1dERlc2MtPmRldmljZSgpOworICAgICAgICAgICAgICAgIGFjdGl2ZURldmljZXMgfD0gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgZGV2aWNlcyB8PSBjdXJEZXZpY2VzOwogICAgIH0KIAorICAgIC8vIEZhdm9yIGRldmljZXMgc2VsZWN0ZWQgb24gYWN0aXZlIHN0cmVhbXMgaWYgYW55IHRvIHJlcG9ydCBjb3JyZWN0IGRldmljZSBpbiBjYXNlIG9mCisgICAgLy8gZXhwbGljaXQgZGV2aWNlIHNlbGVjdGlvbgorICAgIGlmIChhY3RpdmVEZXZpY2VzICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIGRldmljZXMgPSBhY3RpdmVEZXZpY2VzOworICAgIH0KICAgICAvKkZpbHRlciBTUEVBS0VSX1NBRkUgb3V0IG9mIHJlc3VsdHMsIGFzIEF1ZGlvU2VydmljZSBkb2Vzbid0IGtub3cgYWJvdXQgaXQKICAgICAgIGFuZCBkb2Vzbid0IHJlYWxseSBuZWVkIHRvLiovCiAgICAgaWYgKGRldmljZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSkgewpAQCAtNTAwMSwxNiArNTA0NCwxNiBAQAogICAgIHJldHVybiBtRW5naW5lLT5nZXRTdHJhdGVneUZvclN0cmVhbShzdHJlYW0pOwogfQogCi11aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN0cmF0ZWd5Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIpIHsKK3JvdXRpbmdfc3RyYXRlZ3kgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTdHJhdGVneUZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKSB7CiAgICAgLy8gZmxhZ3MgdG8gc3RyYXRlZ3kgbWFwcGluZwogICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX0JFQUNPTikgPT0gQVVESU9fRkxBR19CRUFDT04pIHsKLSAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSOworICAgICAgICByZXR1cm4gU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSOwogICAgIH0KICAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSA9PSBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpIHsKLSAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRTsKKyAgICAgICAgcmV0dXJuIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEU7CiAgICAgfQogICAgIC8vIHVzYWdlIHRvIHN0cmF0ZWd5IG1hcHBpbmcKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG1FbmdpbmUtPmdldFN0cmF0ZWd5Rm9yVXNhZ2UoYXR0ci0+dXNhZ2UpKTsKKyAgICByZXR1cm4gbUVuZ2luZS0+Z2V0U3RyYXRlZ3lGb3JVc2FnZShhdHRyLT51c2FnZSk7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpoYW5kbGVOb3RpZmljYXRpb25Sb3V0aW5nRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7CkBAIC01MDg2LDE3ICs1MTI5LDExIEBACiBhdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUpCiB7Ci0gICAgLy8gQ2hlY2sgaWYgYW4gZXhwbGljaXQgcm91dGluZyByZXF1ZXN0IGV4aXN0cyBmb3IgYSBzdHJlYW0gdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZQotICAgIC8vIHNwZWNpZmllZCBzdHJhdGVneSBhbmQgdXNlIGl0IGluIHByaW9yaXR5IG92ZXIgZGVmYXVsdCByb3V0aW5nIHJ1bGVzLgotICAgIGZvciAoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgc3RyZWFtKyspIHsKLSAgICAgICAgaWYgKGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSkgPT0gc3RyYXRlZ3kpIHsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBmb3JjZWREZXZpY2UgPQotICAgICAgICAgICAgICAgICAgICBtT3V0cHV0Um91dGVzLmdldEFjdGl2ZURldmljZUZvclN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKLSAgICAgICAgICAgIGlmIChmb3JjZWREZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZm9yY2VkRGV2aWNlOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgLy8gSG9ub3IgZXhwbGljaXQgcm91dGluZyByZXF1ZXN0cyBvbmx5IGlmIGFsbCBhY3RpdmUgY2xpZW50cyBoYXZlIGEgcHJlZmVycmVkIHJvdXRlIGluIHdoaWNoCisgICAgLy8gY2FzZSB0aGUgbGFzdCBhY3RpdmUgY2xpZW50IHJvdXRlIGlzIHVzZWQKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0gZmluZFByZWZlcnJlZERldmljZShtT3V0cHV0cywgc3RyYXRlZ3ksIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKKyAgICBpZiAoZGV2aWNlRGVzYyAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBkZXZpY2VEZXNjLT50eXBlKCk7CiAgICAgfQogCiAgICAgaWYgKGZyb21DYWNoZSkgewpAQCAtNTI2Niw2OCArNTMwMywyMSBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0OwogICAgICAgICBpZiAoKGFkZHJlc3MgPT0gTlVMTCkgfHwgKHN0cmxlbihhZGRyZXNzKSA9PSAwKSkgewotICAgICAgICAgICAgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOworICAgICAgICAgICAgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZU1hc2soZGV2aWNlKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVBZGRyKGRldmljZSwgU3RyaW5nOChhZGRyZXNzKSk7CisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlKAorICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIFN0cmluZzgoYWRkcmVzcykpOworICAgICAgICAgICAgaWYgKGRldmljZURlc2MpIGRldmljZUxpc3QuYWRkKGRldmljZURlc2MpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOwotICAgICAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMF0pOwotICAgICAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOwotICAgICAgICAgICAgcGF0Y2gubnVtX3NpbmtzID0gMDsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGV2aWNlTGlzdC5zaXplKCkgJiYgaSA8IEFVRElPX1BBVENIX1BPUlRTX01BWDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlTGlzdC5pdGVtQXQoaSktPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zaW5rc1tpXSk7Ci0gICAgICAgICAgICAgICAgcGF0Y2gubnVtX3NpbmtzKys7CisgICAgICAgICAgICBQYXRjaEJ1aWxkZXIgcGF0Y2hCdWlsZGVyOworICAgICAgICAgICAgcGF0Y2hCdWlsZGVyLmFkZFNvdXJjZShvdXRwdXREZXNjKTsKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKGRldmljZUxpc3Quc2l6ZSgpIDw9IEFVRElPX1BBVENIX1BPUlRTX01BWCwgIlRvbyBtYW55IHNpbmsgcG9ydHMiKTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmZGV2aWNlIDogZGV2aWNlTGlzdCkgeworICAgICAgICAgICAgICAgIHBhdGNoQnVpbGRlci5hZGRTaW5rKGRldmljZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzc2l6ZV90IGluZGV4OwotICAgICAgICAgICAgaWYgKHBhdGNoSGFuZGxlICYmICpwYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpwYXRjaEhhbmRsZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8IEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYzsKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgICAgICAgICBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZlBhdGNoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMpOwotICAgICAgICAgICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIGNyZWF0ZUF1ZGlvUGF0Y2ggcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiCi0gICAgICAgICAgICAgICAgICAgICJudW1fc291cmNlcyAlZCBudW1fc2lua3MgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBhZlBhdGNoSGFuZGxlLCBwYXRjaC5udW1fc291cmNlcywgcGF0Y2gubnVtX3NpbmtzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYyA9IG5ldyBBdWRpb1BhdGNoKCZwYXRjaCwgbVVpZENhY2hlZCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlLCBwYXRjaERlc2MpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bVBhdGNoID0gcGF0Y2g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOwotICAgICAgICAgICAgICAgIGlmIChwYXRjaEhhbmRsZSkgewotICAgICAgICAgICAgICAgICAgICAqcGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPnNldFBhdGNoSGFuZGxlKHBhdGNoRGVzYy0+bUhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaW5mb3JtIGFsbCBpbnB1dCBhcyB3ZWxsCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ICBpbnB1dERlc2NyaXB0b3IgPSBtSW5wdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBpZiAoIWlzX3ZpcnR1YWxfaW5wdXRfZGV2aWNlKGlucHV0RGVzY3JpcHRvci0+bURldmljZSkpIHsKLSAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBpbnB1dENtZCA9IEF1ZGlvUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBpbmZvcm0gaW5wdXQgJWQgb2YgZGV2aWNlOiVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgaW5wdXREZXNjcmlwdG9yLT5tSW9IYW5kbGUsIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgaW5wdXRDbWQuYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLGRldmljZSk7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoaW5wdXREZXNjcmlwdG9yLT5tSW9IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRDbWQudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluc3RhbGxQYXRjaChfX2Z1bmNfXywgcGF0Y2hIYW5kbGUsIG91dHB1dERlc2MuZ2V0KCksIHBhdGNoQnVpbGRlci5wYXRjaCgpLCBkZWxheU1zKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNTM3MSw1MyArNTM2MSwyMSBAQAogICAgIGlmICgoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSAmJiAoKGRldmljZSAhPSBpbnB1dERlc2MtPm1EZXZpY2UpIHx8IGZvcmNlKSkgewogICAgICAgICBpbnB1dERlc2MtPm1EZXZpY2UgPSBkZXZpY2U7CiAKLSAgICAgICAgRGV2aWNlVmVjdG9yIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOworICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlTWFzayhkZXZpY2UpOwogICAgICAgICBpZiAoIWRldmljZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2g7Ci0gICAgICAgICAgICBpbnB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zaW5rc1swXSk7CisgICAgICAgICAgICBQYXRjaEJ1aWxkZXIgcGF0Y2hCdWlsZGVyOworICAgICAgICAgICAgcGF0Y2hCdWlsZGVyLmFkZFNpbmsoaW5wdXREZXNjLAogICAgICAgICAgICAgLy8gQVVESU9fU09VUkNFX0hPVFdPUkQgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5OgogICAgICAgICAgICAgLy8gaGFuZGxlZCBhcyBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04gYnkgdGhlIGF1ZGlvIEhBTAotICAgICAgICAgICAgaWYgKHBhdGNoLnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQgJiYKLSAgICAgICAgICAgICAgICAgICAgIWlucHV0RGVzYy0+aXNTb3VuZFRyaWdnZXIoKSkgewotICAgICAgICAgICAgICAgIHBhdGNoLnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXRjaC5udW1fc2lua3MgPSAxOworICAgICAgICAgICAgICAgICAgICBbaW5wdXREZXNjXShjb25zdCBQYXRjaEJ1aWxkZXI6Om1peF91c2VjYXNlX3QmIHVzZWNhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gdXNlY2FzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEICYmICFpbnB1dERlc2MtPmlzU291bmRUcmlnZ2VyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc291cmNlID0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsgfSkuCiAgICAgICAgICAgICAvL29ubHkgb25lIGlucHV0IGRldmljZSBmb3Igbm93Ci0gICAgICAgICAgICBkZXZpY2VMaXN0Lml0ZW1BdCgwKS0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMF0pOwotICAgICAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOwotICAgICAgICAgICAgc3NpemVfdCBpbmRleDsKLSAgICAgICAgICAgIGlmIChwYXRjaEhhbmRsZSAmJiAqcGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqcGF0Y2hIYW5kbGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShpbnB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8IEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYzsKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgICAgICAgICBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmUGF0Y2hIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgICAgIEFMT0dWKCJzZXRJbnB1dERldmljZSgpIGNyZWF0ZUF1ZGlvUGF0Y2ggcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGFmUGF0Y2hIYW5kbGUpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbmV3IEF1ZGlvUGF0Y2goJnBhdGNoLCBtVWlkQ2FjaGVkKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUsIHBhdGNoRGVzYyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2ggPSBwYXRjaDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdGNoSGFuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICpwYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUhhbmRsZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW5wdXREZXNjLT5zZXRQYXRjaEhhbmRsZShwYXRjaERlc2MtPm1IYW5kbGUpOwotICAgICAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYWRkU291cmNlKGRldmljZUxpc3QuaXRlbUF0KDApKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGluc3RhbGxQYXRjaChfX2Z1bmNfXywgcGF0Y2hIYW5kbGUsIGlucHV0RGVzYy5nZXQoKSwgcGF0Y2hCdWlsZGVyLnBhdGNoKCksIDApOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CkBAIC01NTA2LDYgKzU0NjQsMTUgQEAKIGF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXggKipwb2xpY3lNaXgpCiB7CisgICAgLy8gSG9ub3IgZXhwbGljaXQgcm91dGluZyByZXF1ZXN0cyBvbmx5IGlmIGFsbCBhY3RpdmUgY2xpZW50cyBoYXZlIGEgcHJlZmVycmVkIHJvdXRlIGluIHdoaWNoCisgICAgLy8gY2FzZSB0aGUgbGFzdCBhY3RpdmUgY2xpZW50IHJvdXRlIGlzIHVzZWQKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0KKyAgICAgICAgZmluZFByZWZlcnJlZERldmljZShtSW5wdXRzLCBpbnB1dFNvdXJjZSwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcyk7CisgICAgaWYgKGRldmljZURlc2MgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZGV2aWNlRGVzYy0+dHlwZSgpOworICAgIH0KKworCiAgICAgYXVkaW9fZGV2aWNlc190IGF2YWlsYWJsZURldmljZVR5cGVzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYgfkFVRElPX0RFVklDRV9CSVRfSU47CiAgICAgYXVkaW9fZGV2aWNlc190IHNlbGVjdGVkRGV2aWNlRnJvbU1peCA9CiAgICAgICAgICAgIG1Qb2xpY3lNaXhlcy5nZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShpbnB1dFNvdXJjZSwgYXZhaWxhYmxlRGV2aWNlVHlwZXMsIHBvbGljeU1peCk7CkBAIC01NTE4LDIwICs1NDg1LDcgQEAKIAogYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UpCiB7Ci0gICAgLy8gUm91dGluZwotICAgIC8vIFNjYW4gdGhlIHdob2xlIFJvdXRlTWFwIHRvIHNlZSBpZiB3ZSBoYXZlIGFuIGV4cGxpY2l0IHJvdXRlOgotICAgIC8vIGlmIHRoZSBpbnB1dCBzb3VyY2UgaW4gdGhlIFJvdXRlTWFwIGlzIHRoZSBzYW1lIGFzIHRoZSBhcmd1bWVudCBhYm92ZSwKLSAgICAvLyBhbmQgYWN0aXZpdHkgY291bnQgaXMgbm9uLXplcm8gYW5kIHRoZSBkZXZpY2UgaW4gdGhlIHJvdXRlIGRlc2NyaXB0b3IgaXMgYXZhaWxhYmxlCi0gICAgLy8gdGhlbiBzZWxlY3QgdGhpcyBkZXZpY2UuCi0gICAgZm9yIChzaXplX3Qgcm91dGVJbmRleCA9IDA7IHJvdXRlSW5kZXggPCBtSW5wdXRSb3V0ZXMuc2l6ZSgpOyByb3V0ZUluZGV4KyspIHsKLSAgICAgICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSBtSW5wdXRSb3V0ZXMudmFsdWVBdChyb3V0ZUluZGV4KTsKLSAgICAgICAgIGlmICgoaW5wdXRTb3VyY2UgPT0gcm91dGUtPm1Tb3VyY2UpICYmIHJvdXRlLT5pc0FjdGl2ZU9yQ2hhbmdlZCgpICYmCi0gICAgICAgICAgICAgICAgIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmluZGV4T2Yocm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yKSA+PSAwKSkgewotICAgICAgICAgICAgIHJldHVybiByb3V0ZS0+bURldmljZURlc2NyaXB0b3ItPnR5cGUoKTsKLSAgICAgICAgIH0KLSAgICAgfQotCi0gICAgIHJldHVybiBtRW5naW5lLT5nZXREZXZpY2VGb3JJbnB1dFNvdXJjZShpbnB1dFNvdXJjZSk7CisgICAgcmV0dXJuIG1FbmdpbmUtPmdldERldmljZUZvcklucHV0U291cmNlKGlucHV0U291cmNlKTsKIH0KIAogZmxvYXQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjb21wdXRlVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLApAQCAtNTU1MSw4ICs1NTA1LDggQEAKICAgICAgICAgcmV0dXJuIHJpbmdWb2x1bWVEQiAtIDQgPiB2b2x1bWVEQiA/IHJpbmdWb2x1bWVEQiAtIDQgOiB2b2x1bWVEQjsKICAgICB9CiAKLSAgICAvLyBpbi1jYWxsOiBhbHdheXMgY2FwIGVhcnBpZWNlIHZvbHVtZSBieSB2b2ljZSB2b2x1bWUgKyBzb21lIGxvdyBoZWFkcm9vbQotICAgIGlmICgoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRSkgJiYKKyAgICAvLyBpbi1jYWxsOiBhbHdheXMgY2FwIHZvbHVtZSBieSB2b2ljZSB2b2x1bWUgKyBzb21lIGxvdyBoZWFkcm9vbQorICAgIGlmICgoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSAmJgogICAgICAgICAgICAgKGlzSW5DYWxsKCkgfHwgbU91dHB1dHMuaXNTdHJlYW1BY3RpdmVMb2NhbGx5KEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSkpIHsKICAgICAgICAgc3dpdGNoIChzdHJlYW0pIHsKICAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fU1lTVEVNOgpAQCAtNTU2NCw5ICs1NTE4LDkgQEAKICAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fRFRNRjoKICAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWTogewogICAgICAgICAgICAgaW50IHZvaWNlVm9sdW1lSW5kZXggPQotICAgICAgICAgICAgICAgIG1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4KEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMLCBBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFKTsKKyAgICAgICAgICAgICAgICBtVm9sdW1lQ3VydmVzLT5nZXRWb2x1bWVJbmRleChBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgZGV2aWNlKTsKICAgICAgICAgICAgIGNvbnN0IGZsb2F0IG1heFZvaWNlVm9sRGIgPQotICAgICAgICAgICAgICAgIGNvbXB1dGVWb2x1bWUoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwsIHZvaWNlVm9sdW1lSW5kZXgsIEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0UpCisgICAgICAgICAgICAgICAgY29tcHV0ZVZvbHVtZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgdm9pY2VWb2x1bWVJbmRleCwgZGV2aWNlKQogICAgICAgICAgICAgICAgICsgSU5fQ0FMTF9FQVJQSUVDRV9IRUFEUk9PTV9EQjsKICAgICAgICAgICAgIGlmICh2b2x1bWVEQiA+IG1heFZvaWNlVm9sRGIpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiY29tcHV0ZVZvbHVtZSgpIHN0cmVhbSAlZCBhdCB2b2w9JWYgb3ZlcnJpZGVuIGJ5IHN0cmVhbSAlZCBhdCB2b2w9JWYiLApAQCAtNTYzNyw2ICs1NTkxLDIxIEBACiAgICAgcmV0dXJuIHZvbHVtZURCOwogfQogCitpbnQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZXNjYWxlVm9sdW1lSW5kZXgoaW50IHNyY0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3JjU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgZHN0U3RyZWFtKQoreworICAgIGlmIChzcmNTdHJlYW0gPT0gZHN0U3RyZWFtKSB7CisgICAgICAgIHJldHVybiBzcmNJbmRleDsKKyAgICB9CisgICAgZmxvYXQgbWluU3JjID0gKGZsb2F0KW1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4TWluKHNyY1N0cmVhbSk7CisgICAgZmxvYXQgbWF4U3JjID0gKGZsb2F0KW1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4TWF4KHNyY1N0cmVhbSk7CisgICAgZmxvYXQgbWluRHN0ID0gKGZsb2F0KW1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4TWluKGRzdFN0cmVhbSk7CisgICAgZmxvYXQgbWF4RHN0ID0gKGZsb2F0KW1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4TWF4KGRzdFN0cmVhbSk7CisKKyAgICByZXR1cm4gKGludCkobWluRHN0ICsgKChzcmNJbmRleCAtIG1pblNyYykgKiAobWF4RHN0IC0gbWluRHN0KSkgLyAobWF4U3JjIC0gbWluU3JjKSk7Cit9CisKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tBbmRTZXRWb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLApAQCAtNTc2Myw1NSArNTczMiw2IEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdGFydGluZywgYm9vbCBzdGF0ZUNoYW5nZSkKLXsKLSAgICBpZighaGFzUHJpbWFyeU91dHB1dCgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBpZiB0aGUgc3RyZWFtIHBlcnRhaW5zIHRvIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBhbmQgd2UgYXJlIGluIGNhbGwgd2UgbXVzdAotICAgIC8vIG11dGUgdGhlIHN0cmVhbSBpZiBpdCBpcyBsb3cgdmlzaWJpbGl0eS4gSWYgaXQgaXMgaGlnaCB2aXNpYmlsaXR5LCB3ZSBtdXN0IHBsYXkgYSB0b25lCi0gICAgLy8gaW4gdGhlIGRldmljZSB1c2VkIGZvciBwaG9uZSBzdHJhdGVneSBhbmQgcGxheSB0aGUgdG9uZSBpZiB0aGUgc2VsZWN0ZWQgZGV2aWNlIGRvZXMgbm90Ci0gICAgLy8gaW50ZXJmZXJlIHdpdGggdGhlIGRldmljZSB1c2VkIGZvciBwaG9uZSBzdHJhdGVneQotICAgIC8vIGlmIHN0YXRlQ2hhbmdlIGlzIHRydWUsIHdlIGFyZSBjYWxsZWQgZnJvbSBzZXRQaG9uZVN0YXRlKCkgYW5kIHdlIG11c3QgbXV0ZSBvciB1bm11dGUgYXMKLSAgICAvLyBtYW55IHRpbWVzIGFzIHRoZXJlIGFyZSBhY3RpdmUgdHJhY2tzIG9uIHRoZSBvdXRwdXQKLSAgICBjb25zdCByb3V0aW5nX3N0cmF0ZWd5IHN0cmVhbV9zdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7Ci0gICAgaWYgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB8fAotICAgICAgICAgICAgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpKSkgewotICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1QcmltYXJ5T3V0cHV0OwotICAgICAgICBBTE9HVigiaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkgc3RyZWFtICVkIHN0YXJ0aW5nICVkIGRldmljZSAleCBzdGF0ZUNoYW5nZSAlZCIsCi0gICAgICAgICAgICAgICAgc3RyZWFtLCBzdGFydGluZywgb3V0cHV0RGVzYy0+bURldmljZSwgc3RhdGVDaGFuZ2UpOwotICAgICAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0pIHsKLSAgICAgICAgICAgIGludCBtdXRlQ291bnQgPSAxOwotICAgICAgICAgICAgaWYgKHN0YXRlQ2hhbmdlKSB7Ci0gICAgICAgICAgICAgICAgbXV0ZUNvdW50ID0gb3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYXVkaW9faXNfbG93X3Zpc2liaWxpdHkoc3RyZWFtKSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBsb3cgdmlzaWJpbGl0eSwgbXV0ZUNvdW50ICVkIiwgbXV0ZUNvdW50KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG11dGVDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldFN0cmVhbU11dGUoc3RyZWFtLCBzdGFydGluZywgbVByaW1hcnlPdXRwdXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpIGhpZ2ggdmlzaWJpbGl0eSIpOwotICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5kZXZpY2UoKSAmCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9QSE9ORSwgdHJ1ZSAvKmZyb21DYWNoZSovKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkgaGlnaCB2aXNpYmlsaXR5IG11dGVkLCBtdXRlQ291bnQgJWQiLCBtdXRlQ291bnQpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG11dGVDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRTdHJlYW1NdXRlKHN0cmVhbSwgc3RhcnRpbmcsIG1QcmltYXJ5T3V0cHV0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3RhcnRpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnN0YXJ0VG9uZShBVURJT19QT0xJQ1lfVE9ORV9JTl9DQUxMX05PVElGSUNBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnN0b3BUb25lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCiBhdWRpb19zdHJlYW1fdHlwZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RyZWFtVHlwZWZyb21BdHRyaWJ1dGVzSW50KGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cikKIHsKICAgICAvLyBmbGFncyB0byBzdHJlYW0gdHlwZSBtYXBwaW5nCkBAIC01ODI1LDM5ICs1NzQ1LDcgQEAKICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9UVFM7CiAgICAgfQogCi0gICAgLy8gdXNhZ2UgdG8gc3RyZWFtIHR5cGUgbWFwcGluZwotICAgIHN3aXRjaCAoYXR0ci0+dXNhZ2UpIHsKLSAgICBjYXNlIEFVRElPX1VTQUdFX01FRElBOgotICAgIGNhc2UgQVVESU9fVVNBR0VfR0FNRToKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOVDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRToKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9NVVNJQzsKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWToKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZOwotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT046Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fU1lTVEVNOwotICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fRFRNRjsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfQUxBUk06Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQUxBUk07Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1JJTkc7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTjoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1Q6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVDoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT047Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX1VOS05PV046Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9NVVNJQzsKLSAgICB9CisgICAgcmV0dXJuIGF1ZGlvX3VzYWdlX3RvX3N0cmVhbV90eXBlKGF0dHItPnVzYWdlKTsKIH0KIAogYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzVmFsaWRBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqcGFhKQpAQCAtNTkwMiw3ICs1NzkwLDcgQEAKICAgICB9CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KUFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgaSsrKSB7CiAgICAgICAgIGlmICgoKGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KWkpID09IHN0cmF0ZWd5KSB8fAotICAgICAgICAgICAgICAgIChOVU1fU1RSQVRFR0lFUyA9PSBzdHJhdGVneSkpICYmCisgICAgICAgICAgICAgICAgKFNUUkFURUdZX05PTkUgPT0gc3RyYXRlZ3kpKSAmJgogICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKChhdWRpb19zdHJlYW1fdHlwZV90KWksIGluUGFzdE1zLCBzeXNUaW1lKSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KQEAgLTU5NDIsMTAgKzU4MzAsMTAgQEAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbGVhblVwRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZpY2VEZXNjKQogewogICAgIGZvciAoc3NpemVfdCBpID0gKHNzaXplX3QpbUF1ZGlvU291cmNlcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgIHsKLSAgICAgICAgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAoc291cmNlRGVzYy0+bURldmljZS0+ZXF1YWxzKGRldmljZURlc2MpKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXMgcmVsZWFzaW5nIGF1ZGlvIHNvdXJjZSAlZCIsIF9fRlVOQ1RJT05fXywgc291cmNlRGVzYy0+Z2V0SGFuZGxlKCkpOwotICAgICAgICAgICAgc3RvcEF1ZGlvU291cmNlKHNvdXJjZURlc2MtPmdldEhhbmRsZSgpKTsKKyAgICAgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gc291cmNlRGVzYyA9IG1BdWRpb1NvdXJjZXMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKHNvdXJjZURlc2MtPnNyY0RldmljZSgpLT5lcXVhbHMoZGV2aWNlRGVzYykpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlcyByZWxlYXNpbmcgYXVkaW8gc291cmNlICVkIiwgX19GVU5DVElPTl9fLCBzb3VyY2VEZXNjLT5wb3J0SWQoKSk7CisgICAgICAgICAgICBzdG9wQXVkaW9Tb3VyY2Uoc291cmNlRGVzYy0+cG9ydElkKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC01OTczLDEyNyArNTg2MSw2MSBAQAogICAgIH0KIH0KIAotLy8gTW9kaWZ5IHRoZSBsaXN0IG9mIHN1cnJvdW5kIHNvdW5kIGZvcm1hdHMgc3VwcG9ydGVkLgotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmZpbHRlclN1cnJvdW5kRm9ybWF0cyhGb3JtYXRWZWN0b3IgKmZvcm1hdHNQdHIpIHsKLSAgICBGb3JtYXRWZWN0b3IgJmZvcm1hdHMgPSAqZm9ybWF0c1B0cjsKLSAgICAvLyBUT0RPIFNldCB0aGlzIGJhc2VkIG9uIENvbmZpZyBwcm9wZXJ0aWVzLgotICAgIGNvbnN0IGJvb2wgYWx3YXlzRm9yY2VBQzMgPSB0cnVlOwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6Om1vZGlmeVN1cnJvdW5kRm9ybWF0cygKKyAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldkRlc2MsIEZvcm1hdFZlY3RvciAqZm9ybWF0c1B0cikgeworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4gZW5mb3JjZWRTdXJyb3VuZCgKKyAgICAgICAgICAgIGRldkRlc2MtPmVuY29kZWRGb3JtYXRzKCkuYmVnaW4oKSwgZGV2RGVzYy0+ZW5jb2RlZEZvcm1hdHMoKS5lbmQoKSk7CisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGF1ZGlvX2Zvcm1hdF90PiBhbGxTdXJyb3VuZDsgIC8vIEEgZmxhdCBzZXQgb2YgYWxsIGtub3duIHN1cnJvdW5kIGZvcm1hdHMKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHBhaXIgOiBtQ29uZmlnLmdldFN1cnJvdW5kRm9ybWF0cygpKSB7CisgICAgICAgIGFsbFN1cnJvdW5kLmluc2VydChwYWlyLmZpcnN0KTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzdWJmb3JtYXQgOiBwYWlyLnNlY29uZCkgYWxsU3Vycm91bmQuaW5zZXJ0KHN1YmZvcm1hdCk7CisgICAgfQogCiAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBmb3JjZVVzZSA9IG1FbmdpbmUtPmdldEZvcmNlVXNlKAogICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5EKTsKICAgICBBTE9HRCgiJXM6IGZvcmNlZCB1c2UgPSAlZCIsIF9fRlVOQ1RJT05fXywgZm9yY2VVc2UpOworICAgIC8vIFRoaXMgaXMgdGhlIHJlc3VsdGluZyBzZXQgb2YgZm9ybWF0cyBkZXBlbmRpbmcgb24gdGhlIHN1cnJvdW5kIG1vZGU6CisgICAgLy8gICAnYWxsIHN1cnJvdW5kJyA9IGFsbFN1cnJvdW5kCisgICAgLy8gICAnZW5mb3JjZWQgc3Vycm91bmQnID0gZW5mb3JjZWRTdXJyb3VuZCBbbWF5IGluY2x1ZGUgSUVDNjkxMzcgd2hpY2ggaXNuJ3QgcmF3IHN1cnJvdW5kIGZtdF0KKyAgICAvLyAgICdub24tc3Vycm91bmQnID0gbm90IGluICdhbGwgc3Vycm91bmQnIGFuZCBub3QgaW4gJ2VuZm9yY2VkIHN1cnJvdW5kJworICAgIC8vICAgJ21hbnVhbCBzdXJyb3VuZCcgPSBtTWFudWFsU3Vycm91bmRGb3JtYXRzCisgICAgLy8gQVVUTzogICBmb3JtYXRzIHYgJ2VuZm9yY2VkIHN1cnJvdW5kJworICAgIC8vIEFMV0FZUzogZm9ybWF0cyB2ICdhbGwgc3Vycm91bmQnIHYgJ2VuZm9yY2VkIHN1cnJvdW5kJworICAgIC8vIE5FVkVSOiAgZm9ybWF0cyBeICdub24tc3Vycm91bmQnCisgICAgLy8gTUFOVUFMOiBmb3JtYXRzIF4gKCdub24tc3Vycm91bmQnIHYgJ21hbnVhbCBzdXJyb3VuZCcgdiAoSUVDNjkxMzcgXiAnZW5mb3JjZWQgc3Vycm91bmQnKSkKIAotICAgIC8vIElmIE1BTlVBTCwga2VlcCB0aGUgc3VwcG9ydGVkIHN1cnJvdW5kIHNvdW5kIGZvcm1hdHMgYXMgY3VycmVudCBlbmFibGVkIG9uZXMuCisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGF1ZGlvX2Zvcm1hdF90PiBmb3JtYXRTZXQ7CisgICAgaWYgKGZvcmNlVXNlID09IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX01BTlVBTAorICAgICAgICAgICAgfHwgZm9yY2VVc2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTkVWRVIpIHsKKyAgICAgICAgLy8gZm9ybWF0U2V0IGlzIChmb3JtYXRzIF4gJ25vbi1zdXJyb3VuZCcpCisgICAgICAgIGZvciAoYXV0byBmb3JtYXRJdGVyID0gZm9ybWF0c1B0ci0+YmVnaW4oKTsgZm9ybWF0SXRlciAhPSBmb3JtYXRzUHRyLT5lbmQoKTsgKytmb3JtYXRJdGVyKSB7CisgICAgICAgICAgICBpZiAoYWxsU3Vycm91bmQuY291bnQoKmZvcm1hdEl0ZXIpID09IDAgJiYgZW5mb3JjZWRTdXJyb3VuZC5jb3VudCgqZm9ybWF0SXRlcikgPT0gMCkgeworICAgICAgICAgICAgICAgIGZvcm1hdFNldC5pbnNlcnQoKmZvcm1hdEl0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9ybWF0U2V0Lmluc2VydChmb3JtYXRzUHRyLT5iZWdpbigpLCBmb3JtYXRzUHRyLT5lbmQoKSk7CisgICAgfQorICAgIGZvcm1hdHNQdHItPmNsZWFyKCk7ICAvLyBSZS1maWxsZWQgZnJvbSB0aGUgZm9ybWF0U2V0IGF0IHRoZSBlbmQuCisKICAgICBpZiAoZm9yY2VVc2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTUFOVUFMKSB7Ci0gICAgICAgIGZvcm1hdHMuY2xlYXIoKTsKLSAgICAgICAgZm9yIChhdXRvIGl0ID0gbVN1cnJvdW5kRm9ybWF0cy5iZWdpbigpOyBpdCAhPSBtU3Vycm91bmRGb3JtYXRzLmVuZCgpOyBpdCsrKSB7Ci0gICAgICAgICAgICBmb3JtYXRzLmFkZCgqaXQpOworICAgICAgICBmb3JtYXRTZXQuaW5zZXJ0KG1NYW51YWxTdXJyb3VuZEZvcm1hdHMuYmVnaW4oKSwgbU1hbnVhbFN1cnJvdW5kRm9ybWF0cy5lbmQoKSk7CisgICAgICAgIC8vIEVuYWJsZSBJRUM2MTkzNyB3aGVuIGluIE1BTlVBTCBtb2RlIGlmIGl0J3MgZW5mb3JjZWQgZm9yIHRoaXMgZGV2aWNlLgorICAgICAgICBpZiAoZW5mb3JjZWRTdXJyb3VuZC5jb3VudChBVURJT19GT1JNQVRfSUVDNjE5MzcpICE9IDApIHsKKyAgICAgICAgICAgIGZvcm1hdFNldC5pbnNlcnQoQVVESU9fRk9STUFUX0lFQzYxOTM3KTsKICAgICAgICAgfQotICAgICAgICAvLyBBbHdheXMgZW5hYmxlIElFQzYxOTM3IHdoZW4gaW4gTUFOVUFMIG1vZGUuCi0gICAgICAgIGZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9JRUM2MTkzNyk7Ci0gICAgfSBlbHNlIHsgLy8gTkVWRVIsIEFVVE8gb3IgQUxXQVlTCi0gICAgICAgIC8vIEFuYWx5emUgb3JpZ2luYWwgc3VwcG9ydCBmb3IgdmFyaW91cyBmb3JtYXRzLgotICAgICAgICBib29sIHN1cHBvcnRzQUMzID0gZmFsc2U7Ci0gICAgICAgIGJvb2wgc3VwcG9ydHNPdGhlclN1cnJvdW5kID0gZmFsc2U7Ci0gICAgICAgIGJvb2wgc3VwcG9ydHNJRUM2MTkzNyA9IGZhbHNlOwotICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmNsZWFyKCk7Ci0gICAgICAgIGZvciAoc3NpemVfdCBmb3JtYXRJbmRleCA9IDA7IGZvcm1hdEluZGV4IDwgKHNzaXplX3QpZm9ybWF0cy5zaXplKCk7IGZvcm1hdEluZGV4KyspIHsKLSAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IGZvcm1hdHNbZm9ybWF0SW5kZXhdOwotICAgICAgICAgICAgc3dpdGNoIChmb3JtYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9BQzM6Ci0gICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzQUMzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRV9BQzM6Ci0gICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRFRTOgotICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0RUU19IRDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgQUxXQVlTLCByZW1vdmUgYWxsIG90aGVyIHN1cnJvdW5kIGZvcm1hdHMgaGVyZQotICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSB3aWxsIGFkZCB0aGVtIGxhdGVyLgotICAgICAgICAgICAgICAgICAgICBpZiAoZm9yY2VVc2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfQUxXQVlTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRzLnJlbW92ZUF0KGZvcm1hdEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdEluZGV4LS07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHNPdGhlclN1cnJvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfSUVDNjE5Mzc6Ci0gICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzSUVDNjE5MzcgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGZvcmNlVXNlICE9IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX05FVkVSKSB7IC8vIEFVVE8gb3IgQUxXQVlTCisgICAgICAgIGlmIChmb3JjZVVzZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9BTFdBWVMpIHsKKyAgICAgICAgICAgIGZvcm1hdFNldC5pbnNlcnQoYWxsU3Vycm91bmQuYmVnaW4oKSwgYWxsU3Vycm91bmQuZW5kKCkpOwogICAgICAgICB9Ci0KLSAgICAgICAgLy8gTW9kaWZ5IGZvcm1hdHMgYmFzZWQgb24gc3Vycm91bmQgcHJlZmVyZW5jZXMuCi0gICAgICAgIC8vIElmIE5FVkVSLCByZW1vdmUgc3VwcG9ydCBmb3Igc3Vycm91bmQgZm9ybWF0cy4KLSAgICAgICAgaWYgKGZvcmNlVXNlID09IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX05FVkVSKSB7Ci0gICAgICAgICAgICBpZiAoc3VwcG9ydHNBQzMgfHwgc3VwcG9ydHNPdGhlclN1cnJvdW5kIHx8IHN1cHBvcnRzSUVDNjE5MzcpIHsKLSAgICAgICAgICAgICAgICAvLyBSZW1vdmUgc3Vycm91bmQgc291bmQgcmVsYXRlZCBmb3JtYXRzLgotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGZvcm1hdEluZGV4ID0gMDsgZm9ybWF0SW5kZXggPCBmb3JtYXRzLnNpemUoKTsgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IGZvcm1hdHNbZm9ybWF0SW5kZXhdOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2goZm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9BQzM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9FX0FDMzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0RUUzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0RUU19IRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0lFQzYxOTM3OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMucmVtb3ZlQXQoZm9ybWF0SW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRJbmRleCsrOyAvLyBrZWVwIGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3VwcG9ydHNBQzMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBzdXBwb3J0c090aGVyU3Vycm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBzdXBwb3J0c0lFQzYxOTM3ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7IC8vIEFVVE8gb3IgQUxXQVlTCi0gICAgICAgICAgICAvLyBNb3N0IFRWcyBzdXBwb3J0IEFDMyBldmVuIGlmIHRoZXkgZG8gbm90IHJlcG9ydCBpdCBpbiB0aGUgRURJRC4KLSAgICAgICAgICAgIGlmICgoYWx3YXlzRm9yY2VBQzMgfHwgKGZvcmNlVXNlID09IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX0FMV0FZUykpCi0gICAgICAgICAgICAgICAgICAgICYmICFzdXBwb3J0c0FDMykgewotICAgICAgICAgICAgICAgIGZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9BQzMpOwotICAgICAgICAgICAgICAgIHN1cHBvcnRzQUMzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSWYgQUxXQVlTLCBhZGQgc3VwcG9ydCBmb3IgcmF3IHN1cnJvdW5kIGZvcm1hdHMgaWYgYWxsIGFyZSBtaXNzaW5nLgotICAgICAgICAgICAgLy8gVGhpcyBhc3N1bWVzIHRoYXQgaWYgYW55IG9mIHRoZXNlIGZvcm1hdHMgYXJlIHJlcG9ydGVkIGJ5IHRoZSBIQUwKLSAgICAgICAgICAgIC8vIHRoZW4gdGhlIHJlcG9ydCBpcyB2YWxpZCBhbmQgc2hvdWxkIG5vdCBiZSBtb2RpZmllZC4KLSAgICAgICAgICAgIGlmIChmb3JjZVVzZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9BTFdBWVMpIHsKLSAgICAgICAgICAgICAgICBmb3JtYXRzLmFkZChBVURJT19GT1JNQVRfRV9BQzMpOwotICAgICAgICAgICAgICAgIGZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9EVFMpOwotICAgICAgICAgICAgICAgIGZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9EVFNfSEQpOwotICAgICAgICAgICAgICAgIHN1cHBvcnRzT3RoZXJTdXJyb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEFkZCBzdXBwb3J0IGZvciBJRUM2MTkzNyBpZiBhbnkgcmF3IHN1cnJvdW5kIHN1cHBvcnRlZC4KLSAgICAgICAgICAgIC8vIFRoZSBIQUwgY291bGQgZG8gdGhpcyBidXQgYWRkIGl0IGhlcmUsIGp1c3QgaW4gY2FzZS4KLSAgICAgICAgICAgIGlmICgoc3VwcG9ydHNBQzMgfHwgc3VwcG9ydHNPdGhlclN1cnJvdW5kKSAmJiAhc3VwcG9ydHNJRUM2MTkzNykgewotICAgICAgICAgICAgICAgIGZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9JRUM2MTkzNyk7Ci0gICAgICAgICAgICAgICAgc3VwcG9ydHNJRUM2MTkzNyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEFkZCByZXBvcnRlZCBzdXJyb3VuZCBzb3VuZCBmb3JtYXRzIHRvIGVuYWJsZWQgc3Vycm91bmQgZm9ybWF0cy4KLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGZvcm1hdEluZGV4ID0gMDsgZm9ybWF0SW5kZXggPCBmb3JtYXRzLnNpemUoKTsgZm9ybWF0SW5kZXgrKykgewotICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IGZvcm1hdHNbZm9ybWF0SW5kZXhdOwotICAgICAgICAgICAgICAgIHN3aXRjaChmb3JtYXQpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfQUMzOgotICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9FX0FDMzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRFRTOgotICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9EVFNfSEQ6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0FBQ19MQzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRE9MQllfVFJVRUhEOgotICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9FX0FDM19KT0M6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmluc2VydChmb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgZm9ybWF0U2V0Lmluc2VydChlbmZvcmNlZFN1cnJvdW5kLmJlZ2luKCksIGVuZm9yY2VkU3Vycm91bmQuZW5kKCkpOworICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZvcm1hdCA6IGZvcm1hdFNldCkgeworICAgICAgICBmb3JtYXRzUHRyLT5wdXNoKGZvcm1hdCk7CiAgICAgfQogfQogCi0vLyBNb2RpZnkgdGhlIGxpc3Qgb2YgY2hhbm5lbCBtYXNrcyBzdXBwb3J0ZWQuCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZmlsdGVyU3Vycm91bmRDaGFubmVsTWFza3MoQ2hhbm5lbHNWZWN0b3IgKmNoYW5uZWxNYXNrc1B0cikgewordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6Om1vZGlmeVN1cnJvdW5kQ2hhbm5lbE1hc2tzKENoYW5uZWxzVmVjdG9yICpjaGFubmVsTWFza3NQdHIpIHsKICAgICBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbE1hc2tzID0gKmNoYW5uZWxNYXNrc1B0cjsKICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGZvcmNlVXNlID0gbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoCiAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQpOwpAQCAtNjEyMywxNiArNTk0NSwxNyBAQAogICAgICAgICAvLyBJZiBub3QgdGhlbiBhZGQgNS4xIHN1cHBvcnQuCiAgICAgICAgIGlmICghc3VwcG9ydHM1ZG90MSkgewogICAgICAgICAgICAgY2hhbm5lbE1hc2tzLmFkZChBVURJT19DSEFOTkVMX09VVF81UE9JTlQxKTsKLSAgICAgICAgICAgIEFMT0dJKCIlczogZm9yY2UgQUxXQVlTLCBzbyBhZGRpbmcgY2hhbm5lbE1hc2sgZm9yIDUuMSBzdXJyb3VuZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBBTE9HSSgiJXM6IGZvcmNlIE1BTlVBTCBvciBBTFdBWVMsIHNvIGFkZGluZyBjaGFubmVsTWFzayBmb3IgNS4xIHN1cnJvdW5kIiwgX19mdW5jX18pOwogICAgICAgICB9CiAgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6dXBkYXRlQXVkaW9Qcm9maWxlcyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnVwZGF0ZUF1ZGlvUHJvZmlsZXMoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldkRlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUHJvZmlsZVZlY3RvciAmcHJvZmlsZXMpCiB7CiAgICAgU3RyaW5nOCByZXBseTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZGV2RGVzYy0+dHlwZSgpOwogCiAgICAgLy8gRm9ybWF0IE1VU1QgYmUgY2hlY2tlZCBmaXJzdCB0byB1cGRhdGUgdGhlIGxpc3Qgb2YgQXVkaW9Qcm9maWxlCiAgICAgaWYgKHByb2ZpbGVzLmhhc0R5bmFtaWNGb3JtYXQoKSkgewpAQCAtNjE0Niw4ICs1OTY5LDkgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBGb3JtYXRWZWN0b3IgZm9ybWF0cyA9IGZvcm1hdHNGcm9tU3RyaW5nKHJlcGx5LnN0cmluZygpKTsKLSAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0hETUkpIHsKLSAgICAgICAgICAgIGZpbHRlclN1cnJvdW5kRm9ybWF0cygmZm9ybWF0cyk7CisgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9IRE1JCisgICAgICAgICAgICAgICAgfHwgaXNEZXZpY2VPZk1vZHVsZShkZXZEZXNjLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKSkgeworICAgICAgICAgICAgbW9kaWZ5U3Vycm91bmRGb3JtYXRzKGRldkRlc2MsICZmb3JtYXRzKTsKICAgICAgICAgfQogICAgICAgICBwcm9maWxlcy5zZXRGb3JtYXRzKGZvcm1hdHMpOwogICAgIH0KQEAgLTYxNzksOCArNjAwMyw5IEBACiAgICAgICAgICAgICBpZiAocmVwbGllZFBhcmFtZXRlcnMuZ2V0KAogICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRDaGFubmVscyksIHJlcGx5KSA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcyA9IGNoYW5uZWxNYXNrc0Zyb21TdHJpbmcocmVwbHkuc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9IRE1JKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbHRlclN1cnJvdW5kQ2hhbm5lbE1hc2tzKCZjaGFubmVsTWFza3MpOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9IRE1JCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBpc0RldmljZU9mTW9kdWxlKGRldkRlc2MsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpKSB7CisgICAgICAgICAgICAgICAgICAgIG1vZGlmeVN1cnJvdW5kQ2hhbm5lbE1hc2tzKCZjaGFubmVsTWFza3MpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNjE4OCw0ICs2MDEzLDU4IEBACiAgICAgfQogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6Omluc3RhbGxQYXRjaChjb25zdCBjaGFyICpjYWxsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZSAqaW9EZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQoreworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoCisgICAgICAgICAgICBwYXRjaEhhbmRsZSAmJiAqcGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUgPworICAgICAgICAgICAgKnBhdGNoSGFuZGxlIDogaW9EZXNjcmlwdG9yLT5nZXRQYXRjaEhhbmRsZSgpKTsKKyAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2M7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5zdGFsbFBhdGNoKAorICAgICAgICAgICAgY2FsbGVyLCBpbmRleCwgcGF0Y2hIYW5kbGUsIHBhdGNoLCBkZWxheU1zLCBtVWlkQ2FjaGVkLCAmcGF0Y2hEZXNjKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIGlvRGVzY3JpcHRvci0+c2V0UGF0Y2hIYW5kbGUocGF0Y2hEZXNjLT5tSGFuZGxlKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbnN0YWxsUGF0Y2goY29uc3QgY2hhciAqY2FsbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+ICpwYXRjaERlc2NQdHIpCit7CisgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjOworICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaChwYXRjaCwgJmFmUGF0Y2hIYW5kbGUsIGRlbGF5TXMpOworICAgIEFMT0dWKCIlcygpIEFGOjpjcmVhdGVBdWRpb1BhdGNoIHJldHVybmVkICVkIHBhdGNoSGFuZGxlICVkIG51bV9zb3VyY2VzICVkIG51bV9zaW5rcyAlZCIsCisgICAgICAgICAgICBjYWxsZXIsIHN0YXR1cywgYWZQYXRjaEhhbmRsZSwgcGF0Y2gtPm51bV9zb3VyY2VzLCBwYXRjaC0+bnVtX3NpbmtzKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIHBhdGNoRGVzYyA9IG5ldyBBdWRpb1BhdGNoKHBhdGNoLCB1aWQpOworICAgICAgICAgICAgYWRkQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUsIHBhdGNoRGVzYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaCA9ICpwYXRjaDsKKyAgICAgICAgfQorICAgICAgICBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKKyAgICAgICAgaWYgKHBhdGNoSGFuZGxlKSB7CisgICAgICAgICAgICAqcGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7CisgICAgICAgIH0KKyAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICB9CisgICAgaWYgKHBhdGNoRGVzY1B0cikgKnBhdGNoRGVzY1B0ciA9IHBhdGNoRGVzYzsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oCmluZGV4IDQ4ZTA0NzIuLjllYjFkY2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oCkBAIC0xNyw2ICsxNyw3IEBACiAjcHJhZ21hIG9uY2UKIAogI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgogCkBAIC0zMCw2ICszMSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgorI2luY2x1ZGUgPG1lZGlhL1BhdGNoQnVpbGRlci5oPgogI2luY2x1ZGUgIkF1ZGlvUG9saWN5SW50ZXJmYWNlLmgiCiAKICNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaD4KQEAgLTM4LDYgKzQwLDcgQEAKICNpbmNsdWRlIDxBdWRpb1BvbGljeUNvbmZpZy5oPgogI2luY2x1ZGUgPEF1ZGlvUG9ydC5oPgogI2luY2x1ZGUgPEF1ZGlvUGF0Y2guaD4KKyNpbmNsdWRlIDxBdWRpb1Byb2ZpbGUuaD4KICNpbmNsdWRlIDxEZXZpY2VEZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8SU9Qcm9maWxlLmg+CiAjaW5jbHVkZSA8SHdNb2R1bGUuaD4KQEAgLTQ2LDcgKzQ5LDYgQEAKICNpbmNsdWRlIDxBdWRpb1BvbGljeU1peC5oPgogI2luY2x1ZGUgPEVmZmVjdERlc2NyaXB0b3IuaD4KICNpbmNsdWRlIDxTb3VuZFRyaWdnZXJTZXNzaW9uLmg+Ci0jaW5jbHVkZSA8U2Vzc2lvblJvdXRlLmg+CiAjaW5jbHVkZSA8Vm9sdW1lQ3VydmUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMTE4LDE1ICsxMjAsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKQEAgLTEzOCwxNiArMTM0LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCk7CiAKICAgICAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBpbnB1dCBzdGFydHMgYmVpbmcgdXNlZC4KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNpbGVuY2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY3VycmVuY3lfdHlwZV9fbWFza190ICpjb25jdXJyZW5jeSk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAKICAgICAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBpbnB1dCBzdG9wcyBiZWluZyB1c2VkLgotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICAgICAgdmlydHVhbCB2b2lkIGNsb3NlQWxsSW5wdXRzKCk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKQEAgLTE2Miw3ICsxNTMsNyBAQAogICAgICAgICAvLyByZXR1cm4gdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBzdHJlYW0gdHlwZQogICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKICAgICAgICAgLy8gcmV0dXJuIHRoZSBzdHJhdGVneSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBhdWRpbyBhdHRyaWJ1dGVzCi0gICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cik7CisgICAgICAgIHZpcnR1YWwgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneUZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKTsKIAogICAgICAgICAvLyByZXR1cm4gdGhlIGVuYWJsZWQgb3V0cHV0IGRldmljZXMgZm9yIHRoZSBnaXZlbiBzdHJlYW0gdHlwZQogICAgICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKQEAgLTE3MywxNCArMTY0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbUVmZmVjdHMudW5yZWdpc3RlckVmZmVjdChpZCk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbUVmZmVjdHMuc2V0RWZmZWN0RW5hYmxlZChpZCwgZW5hYmxlZCk7Ci0gICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCk7CiAKICAgICAgICAgdmlydHVhbCBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OwogICAgICAgICAvLyByZXR1cm4gd2hldGhlciBhIHN0cmVhbSBpcyBwbGF5aW5nIHJlbW90ZWx5LCBvdmVycmlkZSB0byBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2YKQEAgLTE5MywxMCArMTc4LDE3IEBACiAKICAgICAgICAgdmlydHVhbCBib29sIGlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3Q7CiAKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisgICAgICAgIC8vIGhlbHBlcnMgZm9yIGR1bXAoaW50IGZkKQorICAgICAgICB2b2lkIGR1bXBNYW51YWxTdXJyb3VuZEZvcm1hdHMoU3RyaW5nOCAqZHN0KSBjb25zdDsKKyAgICAgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Q7CisKKyAgICAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpIG92ZXJyaWRlOwogCiAgICAgICAgIHZpcnR1YWwgYm9vbCBpc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIG9mZmxvYWRJbmZvKTsKIAorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCYgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzKTsKKwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKQEAgLTIyNiwxMiArMjE4LDE1IEBACiAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlclBvbGljeU1peGVzKGNvbnN0IFZlY3RvcjxBdWRpb01peD4mIG1peGVzKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyUG9saWN5TWl4ZXMoVmVjdG9yPEF1ZGlvTWl4PiBtaXhlcyk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCk7CiAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck1vbm8oYm9vbCBtb25vKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNb25vKGJvb2wgKm1vbm8pOwpAQCAtMjQ3LDcgKzI0Miw5IEBACiAgICAgICAgIC8vIHJldHVybiB0aGUgc3RyYXRlZ3kgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIHN0cmVhbSB0eXBlCiAgICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3koYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0OwogCi0gICAgICAgIHZpcnR1YWwgdm9pZCBzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQsIGJvb2wgc2lsZW5jZWQpOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0QXBwU3RhdGUodWlkX3QgdWlkLCBhcHBfc3RhdGVfdCBzdGF0ZSk7CisKKyAgICAgICAgdmlydHVhbCBib29sIGlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKTsKIAogcHJvdGVjdGVkOgogICAgICAgICAvLyBBIGNvbnN0cnVjdG9yIHRoYXQgYWxsb3dzIG1vcmUgZmluZS1ncmFpbmVkIGNvbnRyb2wgb3ZlciBpbml0aWFsaXphdGlvbiBwcm9jZXNzLApAQCAtMzUzLDYgKzM1MCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSk7CiAKKyAgICAgICAgLy8gcmVzY2FsZSB2b2x1bWUgaW5kZXggZnJvbSBzcmNTdHJlYW0gd2l0aGluIHJhbmdlIG9mIGRzdFN0cmVhbQorICAgICAgICBpbnQgcmVzY2FsZVZvbHVtZUluZGV4KGludCBzcmNJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHNyY1N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IGRzdFN0cmVhbSk7CiAgICAgICAgIC8vIGNoZWNrIHRoYXQgdm9sdW1lIGNoYW5nZSBpcyBwZXJtaXR0ZWQsIGNvbXB1dGUgYW5kIHNlbmQgbmV3IHZvbHVtZSB0byBhdWRpbyBoYXJkd2FyZQogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNoZWNrQW5kU2V0Vm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKQEAgLTM2OCw3ICszNjksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KTApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gQVVESU9fREVWSUNFX05PTkUpOwogCiAgICAgICAgIC8vIE11dGUgb3IgdW5tdXRlIHRoZSBzdHJlYW0gb24gdGhlIHNwZWNpZmllZCBvdXRwdXQKICAgICAgICAgdm9pZCBzZXRTdHJlYW1NdXRlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLApAQCAtMzc3LDEwICszNzgsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpMCk7CiAKLSAgICAgICAgLy8gaGFuZGxlIHNwZWNpYWwgY2FzZXMgZm9yIHNvbmlmaWNhdGlvbiBzdHJhdGVneSB3aGlsZSBpbiBjYWxsOiBtdXRlIHN0cmVhbXMgb3IgcmVwbGFjZSBieQotICAgICAgICAvLyBhIHNwZWNpYWwgdG9uZSBpbiB0aGUgZGV2aWNlIHVzZWQgZm9yIGNvbW11bmljYXRpb24KLSAgICAgICAgdm9pZCBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGJvb2wgc3RhcnRpbmcsIGJvb2wgc3RhdGVDaGFuZ2UpOwotCiAgICAgICAgIGF1ZGlvX21vZGVfdCBnZXRQaG9uZVN0YXRlKCk7CiAKICAgICAgICAgLy8gdHJ1ZSBpZiBkZXZpY2UgaXMgaW4gYSB0ZWxlcGhvbnkgb3IgVm9JUCBjYWxsCkBAIC00MTAsNiArNDA3LDEyIEBACiAgICAgICAgIC8vIGNsb3NlIGFuIGlucHV0LgogICAgICAgICB2b2lkIGNsb3NlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOwogCisgICAgICAgIC8vIHJ1bnMgYWxsIHRoZSBjaGVja3MgcmVxdWlyZWQgZm9yIGFjY29tb2RhdGluZyBjaGFuZ2VzIGluIGRldmljZXMgYW5kIG91dHB1dHMKKyAgICAgICAgLy8gaWYgJ29uT3V0cHV0c0NoZWNrZWQnIGNhbGxiYWNrIGlzIHByb3ZpZGVkLCBpdCBpcyBleGVjdXRlZCBhZnRlciB0aGUgb3V0cHV0cworICAgICAgICAvLyBjaGVjayB2aWEgJ2NoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcycuIElmIHRoZSBjYWxsYmFjayByZXR1cm5zICd0cnVlJywKKyAgICAgICAgLy8gQTJEUCBzdXNwZW5kIHN0YXR1cyBpcyByZWNoZWNrZWQuCisgICAgICAgIHZvaWQgY2hlY2tGb3JEZXZpY2VBbmRPdXRwdXRDaGFuZ2VzKHN0ZDo6ZnVuY3Rpb248Ym9vbCgpPiBvbk91dHB1dHNDaGVja2VkID0gbnVsbHB0cik7CisKICAgICAgICAgLy8gY2hlY2tzIGFuZCBpZiBuZWNlc3NhcnkgY2hhbmdlcyBvdXRwdXRzIHVzZWQgZm9yIGFsbCBzdHJhdGVnaWVzLgogICAgICAgICAvLyBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgY29uZGl0aW9uIHRoYXQgYWZmZWN0cyB0aGUgb3V0cHV0IGNob2ljZSBmb3IgYSBnaXZlbiBzdHJhdGVneQogICAgICAgICAvLyBjaGFuZ2VzOiBjb25uZWN0ZWQgZGV2aWNlLCBwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLi4uCkBAIC00MjIsNiArNDI1LDE0IEBACiAgICAgICAgIC8vIG1hbmFnZXMgQTJEUCBvdXRwdXQgc3VzcGVuZC9yZXN0b3JlIGFjY29yZGluZyB0byBwaG9uZSBzdGF0ZSBhbmQgQlQgU0NPIHVzYWdlCiAgICAgICAgIHZvaWQgY2hlY2tBMmRwU3VzcGVuZCgpOwogCisgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBJb0Rlc2NyaXB0b3IsIGNsYXNzIEZpbHRlcj4KKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZmluZFByZWZlcnJlZERldmljZShJb0Rlc2NyaXB0b3ImIGRlc2MsIEZpbHRlciBmaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBhY3RpdmUsIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcyk7CisKKyAgICAgICAgdGVtcGxhdGUgPGNsYXNzIElvQ29sbGVjdGlvbiwgY2xhc3MgRmlsdGVyPgorICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBmaW5kUHJlZmVycmVkRGV2aWNlKElvQ29sbGVjdGlvbiYgaW9Db2xsZWN0aW9uLCBGaWx0ZXIgZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzKTsKKwogICAgICAgICAvLyBzZWxlY3RzIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGRldmljZSBvbiBvdXRwdXQgZm9yIGN1cnJlbnQgc3RhdGUKICAgICAgICAgLy8gbXVzdCBiZSBjYWxsZWQgZXZlcnkgdGltZSBhIGNvbmRpdGlvbiB0aGF0IGFmZmVjdHMgdGhlIGRldmljZSBjaG9pY2UgZm9yIGEgZ2l2ZW4gb3V0cHV0IGlzCiAgICAgICAgIC8vIGNoYW5nZWQ6IGNvbm5lY3RlZCBkZXZpY2UsIHBob25lIHN0YXRlLCBmb3JjZSB1c2UsIG91dHB1dCBzdGFydCwgb3V0cHV0IHN0b3AuLgpAQCAtNDUxLDggKzQ2Miw2IEBACiAKICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBnZXRPdXRwdXRzRm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiYgb3Blbk91dHB1dHMpOwotICAgICAgICBib29sIHZlY3RvcnNFcXVhbChTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMik7CiAKICAgICAgICAgLy8gbXV0ZS91bm11dGUgc3RyYXRlZ2llcyB1c2luZyBhbiBpbmNvbXBhdGlibGUgZGV2aWNlIGNvbWJpbmF0aW9uCiAgICAgICAgIC8vIGlmIG11dGluZywgd2FpdCBmb3IgdGhlIGF1ZGlvIGluIHBjbSBidWZmZXIgdG8gYmUgZHJhaW5lZCBiZWZvcmUgcHJvY2VlZGluZwpAQCAtNDYzLDggKzQ3MiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zKTsKIAogICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzZWxlY3RPdXRwdXQoY29uc3QgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwKTsKICAgICAgICAgLy8gc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrIGFyZSBpbi9vdXQgYW5kIHNvIG1heSBiZSBtb2RpZmllZAogICAgICAgICBzcDxJT1Byb2ZpbGU+IGdldElucHV0UHJvZmlsZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLApAQCAtNDcyLDExICs0ODMsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QmIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QmIGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKTsKLSAgICAgICAgc3A8SU9Qcm9maWxlPiBnZXRQcm9maWxlRm9yRGlyZWN0T3V0cHV0KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyk7CisgICAgICAgIHNwPElPUHJvZmlsZT4gZ2V0UHJvZmlsZUZvck91dHB1dChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGlyZWN0T25seSk7CiAKICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgc2VsZWN0T3V0cHV0Rm9yTXVzaWNFZmZlY3RzKCk7CiAKQEAgLTUwMSwyNCArNTEzLDM2IEBACiAgICAgICAgICAgICBpZiAoIWhhc1ByaW1hcnlPdXRwdXQoKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfTk9ORTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tSHdNb2R1bGUobVByaW1hcnlPdXRwdXQtPmdldE1vZHVsZUhhbmRsZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZVR5cGVzRnJvbUh3TW9kdWxlKAorICAgICAgICAgICAgICAgICAgICBtUHJpbWFyeU91dHB1dC0+Z2V0TW9kdWxlSGFuZGxlKCkpOworICAgICAgICB9CisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgZ2V0Rmlyc3REZXZpY2VJZCBvZiB0aGUgRGV2aWNlIFZlY3RvcgorICAgICAgICAgKiBAcmV0dXJuIGlmIHRoZSBjb2xsZWN0aW9uIGlzIG5vdCBlbXB0eSwgaXQgcmV0dXJucyB0aGUgZmlyc3QgZGV2aWNlIElkLAorICAgICAgICAgKiAgICAgICAgIG90aGVyd2lzZSBBVURJT19QT1JUX0hBTkRMRV9OT05FCisgICAgICAgICAqLworICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldEZpcnN0RGV2aWNlSWQoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKGRldmljZXMuc2l6ZSgpID4gMCkgPyBkZXZpY2VzLml0ZW1BdCgwKS0+Z2V0SWQoKSA6IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nOCBnZXRGaXJzdERldmljZUFkZHJlc3MoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKGRldmljZXMuc2l6ZSgpID4gMCkgPyBkZXZpY2VzLml0ZW1BdCgwKS0+YWRkcmVzcygpIDogU3RyaW5nOCgiIik7CiAgICAgICAgIH0KIAogICAgICAgICB1aW50MzJfdCB1cGRhdGVDYWxsUm91dGluZyhhdWRpb19kZXZpY2VzX3QgcnhEZXZpY2UsIHVpbnQzMl90IGRlbGF5TXMgPSAwKTsKICAgICAgICAgc3A8QXVkaW9QYXRjaD4gY3JlYXRlVGVsZXBob255UGF0Y2goYm9vbCBpc1J4LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCB1aW50MzJfdCBkZWxheU1zKTsKLSAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZmlsbEF1ZGlvUG9ydENvbmZpZ0ZvckRldmljZSgKLSAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBmaW5kRGV2aWNlKAorICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcywgYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3Q7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBnZXRNb2R1bGVEZXZpY2VUeXBlcygKKyAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMsIGNvbnN0IGNoYXIgKm1vZHVsZUlkKSBjb25zdDsKKyAgICAgICAgYm9vbCBpc0RldmljZU9mTW9kdWxlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZEZXNjLCBjb25zdCBjaGFyICptb2R1bGVJZCkgY29uc3Q7CiAKLSAgICAgICAgLy8gaWYgYXJndW1lbnQgImRldmljZSIgaXMgZGlmZmVyZW50IGZyb20gQVVESU9fREVWSUNFX05PTkUsICBzdGFydFNvdXJjZSgpIHdpbGwgZm9yY2UKLSAgICAgICAgLy8gdGhlIHJlLWV2YWx1YXRpb24gb2YgdGhlIG91dHB1dCBkZXZpY2UuCi0gICAgICAgIHN0YXR1c190IHN0YXJ0U291cmNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICBzdGF0dXNfdCBzdGFydFNvdXJjZShjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmRlbGF5TXMpOwotICAgICAgICBzdGF0dXNfdCBzdG9wU291cmNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZURldmljZVVwZGF0ZSk7CisgICAgICAgIHN0YXR1c190IHN0b3BTb3VyY2UoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCk7CiAKICAgICAgICAgdm9pZCBjbGVhckF1ZGlvUGF0Y2hlcyh1aWRfdCB1aWQpOwogICAgICAgICB2b2lkIGNsZWFyU2Vzc2lvblJvdXRlcyh1aWRfdCB1aWQpOwpAQCAtNTI2LDI1ICs1NTAsMjMgQEAKIAogICAgICAgICBzdGF0dXNfdCBoYXNQcmltYXJ5T3V0cHV0KCkgY29uc3QgeyByZXR1cm4gbVByaW1hcnlPdXRwdXQgIT0gMDsgfQogCi0gICAgICAgIHN0YXR1c190IGNvbm5lY3RBdWRpb1NvdXJjZShjb25zdCBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKTsKLSAgICAgICAgc3RhdHVzX3QgZGlzY29ubmVjdEF1ZGlvU291cmNlKGNvbnN0IHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpOworICAgICAgICBzdGF0dXNfdCBjb25uZWN0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpOworICAgICAgICBzdGF0dXNfdCBkaXNjb25uZWN0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpOwogCi0gICAgICAgIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gZ2V0U291cmNlRm9yU3RyYXRlZ3lPbk91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IGdldFNvdXJjZUZvclN0cmF0ZWd5T25PdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSk7CiAKICAgICAgICAgdm9pZCBjbGVhblVwRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZpY2VEZXNjKTsKIAogICAgICAgICB2b2lkIGNsZWFyQXVkaW9Tb3VyY2VzKHVpZF90IHVpZCk7CiAKLSAgICAgICAgc3RhdGljIGJvb2wgaXNDb25jdXJyZW50U291cmNlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7Ci0KLSAgICAgICAgYm9vbCBpc0NvbmN1cmVudENhcHR1cmVBbGxvd2VkKGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiYgaW5wdXREZXNjLAotICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4mIGF1ZGlvU2Vzc2lvbik7Ci0KICAgICAgICAgc3RhdGljIGJvb2wgc3RyZWFtc01hdGNoRm9ydm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtMik7CiAKLSAgICAgICAgdWlkX3QgbVVpZENhY2hlZDsKKyAgICAgICAgdm9pZCBjbG9zZUFjdGl2ZUNsaWVudHMoY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+JiBpbnB1dCk7CisgICAgICAgIHZvaWQgY2xvc2VDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworCisgICAgICAgIGNvbnN0IHVpZF90IG1VaWRDYWNoZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFJRF9BVURJT1NFUlZFUgogICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqbXBDbGllbnRJbnRlcmZhY2U7ICAvLyBhdWRpbyBwb2xpY3kgY2xpZW50IGludGVyZmFjZQogICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbVByaW1hcnlPdXRwdXQ7ICAgICAvLyBwcmltYXJ5IG91dHB1dCBkZXNjcmlwdG9yCiAgICAgICAgIC8vIGxpc3Qgb2YgZGVzY3JpcHRvcnMgZm9yIG91dHB1dHMgY3VycmVudGx5IG9wZW5lZApAQCAtNTU4LDkgKzU4MCw2IEBACiAgICAgICAgIERldmljZVZlY3RvciAgbUF2YWlsYWJsZU91dHB1dERldmljZXM7IC8vIGFsbCBhdmFpbGFibGUgb3V0cHV0IGRldmljZXMKICAgICAgICAgRGV2aWNlVmVjdG9yICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzOyAgLy8gYWxsIGF2YWlsYWJsZSBpbnB1dCBkZXZpY2VzCiAKLSAgICAgICAgU2Vzc2lvblJvdXRlTWFwIG1PdXRwdXRSb3V0ZXMgPSBTZXNzaW9uUm91dGVNYXAoU2Vzc2lvblJvdXRlTWFwOjpNQVBUWVBFX09VVFBVVCk7Ci0gICAgICAgIFNlc3Npb25Sb3V0ZU1hcCBtSW5wdXRSb3V0ZXMgPSBTZXNzaW9uUm91dGVNYXAoU2Vzc2lvblJvdXRlTWFwOjpNQVBUWVBFX0lOUFVUKTsKLQogICAgICAgICBib29sICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lOyAgICAgICAgLy8gbGltaXQgcmluZ3RvbmUgdm9sdW1lIHRvIG11c2ljIHZvbHVtZSBpZiBoZWFkc2V0IGNvbm5lY3RlZAogICAgICAgICBhdWRpb19kZXZpY2VzX3QgbURldmljZUZvclN0cmF0ZWd5W05VTV9TVFJBVEVHSUVTXTsKICAgICAgICAgZmxvYXQgICBtTGFzdFZvaWNlVm9sdW1lOyAgICAgICAgICAgIC8vIGxhc3Qgdm9pY2Ugdm9sdW1lIHZhbHVlIHNlbnQgdG8gYXVkaW8gSEFMCkBAIC01ODQsNyArNjAzLDcgQEAKICAgICAgICAgc3A8QXVkaW9QYXRjaD4gbUNhbGxSeFBhdGNoOwogCiAgICAgICAgIEh3QXVkaW9PdXRwdXRDb2xsZWN0aW9uIG1Id091dHB1dHM7Ci0gICAgICAgIEF1ZGlvU291cmNlQ29sbGVjdGlvbiBtQXVkaW9Tb3VyY2VzOworICAgICAgICBTb3VyY2VDbGllbnRDb2xsZWN0aW9uIG1BdWRpb1NvdXJjZXM7CiAKICAgICAgICAgLy8gZm9yIHN1cHBvcnRpbmcgImJlYWNvbiIgc3RyZWFtcywgaS5lLiBzdHJlYW1zIHRoYXQgb25seSBwbGF5IG9uIHNwZWFrZXIsIGFuZCBuZXZlcgogICAgICAgICAvLyB3aGVuIHNvbWV0aGluZyBvdGhlciB0aGFuIFNUUkVBTV9UVFMgKGEuay5hLiAiVHJhbnNtaXR0ZWQgVGhyb3VnaCBTcGVha2VyIikgaXMgcGxheWluZwpAQCAtNjA4LDE3ICs2MjcsMjYgQEAKICAgICAgICAgLy8gQXVkaW8gUG9saWN5IEVuZ2luZSBJbnRlcmZhY2UuCiAgICAgICAgIEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZSAqbUVuZ2luZTsKIAotICAgICAgICAvLyBTdXJyb3VuZCBmb3JtYXRzIHRoYXQgYXJlIGVuYWJsZWQuCi0gICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4gbVN1cnJvdW5kRm9ybWF0czsKKyAgICAgICAgLy8gU3Vycm91bmQgZm9ybWF0cyB0aGF0IGFyZSBlbmFibGVkIG1hbnVhbGx5LiBUYWtlbiBpbnRvIGFjY291bnQgd2hlbgorICAgICAgICAvLyAiZW5jb2RlZCBzdXJyb3VuZCIgaXMgZm9yY2VkIGludG8gIm1hbnVhbCIgbW9kZS4KKyAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGF1ZGlvX2Zvcm1hdF90PiBtTWFudWFsU3Vycm91bmRGb3JtYXRzOwogcHJpdmF0ZToKICAgICAgICAgLy8gQWRkIG9yIHJlbW92ZSBBQzMgRFRTIGVuY29kaW5ncyBiYXNlZCBvbiB1c2VyIHByZWZlcmVuY2VzLgotICAgICAgICB2b2lkIGZpbHRlclN1cnJvdW5kRm9ybWF0cyhGb3JtYXRWZWN0b3IgKmZvcm1hdHNQdHIpOwotICAgICAgICB2b2lkIGZpbHRlclN1cnJvdW5kQ2hhbm5lbE1hc2tzKENoYW5uZWxzVmVjdG9yICpjaGFubmVsTWFza3NQdHIpOworICAgICAgICB2b2lkIG1vZGlmeVN1cnJvdW5kRm9ybWF0cyhjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2RGVzYywgRm9ybWF0VmVjdG9yICpmb3JtYXRzUHRyKTsKKyAgICAgICAgdm9pZCBtb2RpZnlTdXJyb3VuZENoYW5uZWxNYXNrcyhDaGFubmVsc1ZlY3RvciAqY2hhbm5lbE1hc2tzUHRyKTsKIAotICAgICAgICBzdGF0dXNfdCBnZXRTdXBwb3J0ZWRGb3JtYXRzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBGb3JtYXRWZWN0b3ImIGZvcm1hdHMpOworICAgICAgICAvLyBTdXBwb3J0IGZvciBNdWx0aS1TdHJlYW0gRGVjb2RlciAoTVNEKSBtb2R1bGUKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0TXNkQXVkaW9JbkRldmljZSgpIGNvbnN0OworICAgICAgICBjb25zdCBBdWRpb1BhdGNoQ29sbGVjdGlvbiBnZXRNc2RQYXRjaGVzKCkgY29uc3Q7CisgICAgICAgIHN0YXR1c190IGdldEJlc3RNc2RBdWRpb1Byb2ZpbGVGb3IoYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGh3QXZTeW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtDb25maWcpIGNvbnN0OworICAgICAgICBQYXRjaEJ1aWxkZXIgYnVpbGRNc2RQYXRjaChhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlKSBjb25zdDsKKyAgICAgICAgc3RhdHVzX3Qgc2V0TXNkUGF0Y2goYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZSA9IEFVRElPX0RFVklDRV9OT05FKTsKIAogICAgICAgICAvLyBJZiBhbnksIHJlc29sdmUgYW55ICJkeW5hbWljIiBmaWVsZHMgb2YgYW4gQXVkaW8gUHJvZmlsZXMgY29sbGVjdGlvbgotICAgICAgICB2b2lkIHVwZGF0ZUF1ZGlvUHJvZmlsZXMoYXVkaW9fZGV2aWNlc190IGRldmljZSwgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCisgICAgICAgIHZvaWQgdXBkYXRlQXVkaW9Qcm9maWxlcyhjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2RGVzYywgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCiAgICAgICAgICAgICAgICAgQXVkaW9Qcm9maWxlVmVjdG9yICZwcm9maWxlcyk7CiAKICAgICAgICAgLy8gTm90aWZ5IHRoZSBwb2xpY3kgY2xpZW50IG9mIGFueSBjaGFuZ2Ugb2YgZGV2aWNlIHN0YXRlIHdpdGggQVVESU9fSU9fSEFORExFX05PTkUsCkBAIC02NDMsNiArNjcxLDIxIEBACiAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcyAvKmluKi8sCiAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cyAvKm91dCovKTsKICAgICAgICAgdWludDMyX3QgY3VyQXVkaW9Qb3J0R2VuZXJhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1BdWRpb1BvcnRHZW5lcmF0aW9uOyB9CisgICAgICAgIC8vIGludGVybmFsIG1ldGhvZCwgZ2V0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBmcm9tIGVpdGhlciBhIHNvdXJjZSBhdWRpb19hdHRyaWJ1dGVzX3QKKyAgICAgICAgLy8gb3IgYXVkaW9fc3RyZWFtX3R5cGVfdCwgcmVzcGVjdGl2ZWx5LgorICAgICAgICBzdGF0dXNfdCBnZXRBdWRpb0F0dHJpYnV0ZXMoYXVkaW9fYXR0cmlidXRlc190ICpkc3RBdHRyLAorICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqc3JjQXR0ciwKKyAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHNyY1N0cmVhbSk7CisgICAgICAgIC8vIGludGVybmFsIG1ldGhvZCwgY2FsbGVkIGJ5IGdldE91dHB1dEZvckF0dHIoKSBhbmQgY29ubmVjdEF1ZGlvU291cmNlLgorICAgICAgICBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRySW50KGF1ZGlvX2F0dHJpYnV0ZXNfdCAqcmVzdWx0QXR0ciwKKyAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCisgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzLAorICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQpOwogICAgICAgICAvLyBpbnRlcm5hbCBtZXRob2QgdG8gcmV0dXJuIHRoZSBvdXRwdXQgaGFuZGxlIGZvciB0aGUgZ2l2ZW4gZGV2aWNlIGFuZCBmb3JtYXQKICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yRGV2aWNlKAogICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCkBAIC02NTQsNyArNjk3LDYgQEAKICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZ2V0SW5wdXRGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAogICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLApAQCAtNjg0LDEwICs3MjYsMTggQEAKICAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlNb25vT3V0cHV0KSwgKGludCltTWFzdGVyTW9ubyk7CiAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhvdXRwdXQsIHBhcmFtLnRvU3RyaW5nKCkpOwogICAgICAgICB9Ci0KLSAgICAgICAgYm9vbCBzb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlKCk7Ci0gICAgICAgIGJvb2wgbVNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmU7Ci0gICAgICAgIGJvb2wgbUhhc0NvbXB1dGVkU291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZTsKKyAgICAgICAgc3RhdHVzX3QgaW5zdGFsbFBhdGNoKGNvbnN0IGNoYXIgKmNhbGxlciwKKyAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UgKmlvRGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgIGludCBkZWxheU1zKTsKKyAgICAgICAgc3RhdHVzX3QgaW5zdGFsbFBhdGNoKGNvbnN0IGNoYXIgKmNhbGxlciwKKyAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4LAorICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAorICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICBzcDxBdWRpb1BhdGNoPiAqcGF0Y2hEZXNjUHRyKTsKIH07CiAKIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKaW5kZXggYjA2NGY4Yy4uZDgyNjE5MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcApAQCAtMTU1LDE3ICsxNTUsNiBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OnN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsCi0gICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotewotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5zdGFydFRvbmUodG9uZSwgc3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6c3RvcFRvbmUoKQotewotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5zdG9wVG9uZSgpOwotfQotCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUsIGludCBkZWxheV9tcykKIHsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5U2VydmljZS0+c2V0Vm9pY2VWb2x1bWUodm9sdW1lLCBkZWxheV9tcyk7CkBAIC0yMjAsMTIgKzIwOSwxNyBAQAogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6Om9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKLSAgICAgICAgaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCi0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpCiB7CiAgICAgbUF1ZGlvUG9saWN5U2VydmljZS0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCBjbGllbnRJbmZvLAotICAgICAgICAgICAgY2xpZW50Q29uZmlnLCBkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIGNsaWVudENvbmZpZywgY2xpZW50RWZmZWN0cywgZGV2aWNlQ29uZmlnLCBlZmZlY3RzLCBwYXRjaEhhbmRsZSwgc291cmNlKTsKIH0KIAogYXVkaW9fdW5pcXVlX2lkX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6bmV3QXVkaW9VbmlxdWVJZChhdWRpb191bmlxdWVfaWRfdXNlX3QgdXNlKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCmluZGV4IDRhMWNhYjQuLjI5YjA1NjEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKQEAgLTIzLDcgKzIzLDkgQEAKICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8Y3V0aWxzL21pc2MuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0NvbmZpZy5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2F1ZGlvX2VmZmVjdHNfY29uZi5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgpAQCAtMzEsNyArMzMsNiBAQAogI2luY2x1ZGUgPGN1dGlscy9jb25maWdfdXRpbHMuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlICJBdWRpb1BvbGljeUVmZmVjdHMuaCIKLSNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzE3LDYgKzMxOCwyMDEgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeUVmZmVjdHM6OmFkZFNvdXJjZURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCkKK3sKKyAgICBpZiAodXVpZCA9PSBOVUxMIHx8IHR5cGUgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiYWRkU291cmNlRGVmYXVsdEVmZmVjdCgpOiBOdWxsIHV1aWQgb3IgdHlwZSB1dWlkIHBvaW50ZXIiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBIT1RXT1JEIGFuZCBGTV9UVU5FUiBhcmUgdHdvIHNwZWNpYWwgY2FzZSBzb3VyY2VzID4gTUFYLgorICAgIGlmIChzb3VyY2UgPCBBVURJT19TT1VSQ0VfREVGQVVMVCB8fAorICAgICAgICAgICAgKHNvdXJjZSA+IEFVRElPX1NPVVJDRV9NQVggJiYKKyAgICAgICAgICAgICBzb3VyY2UgIT0gQVVESU9fU09VUkNFX0hPVFdPUkQgJiYKKyAgICAgICAgICAgICBzb3VyY2UgIT0gQVVESU9fU09VUkNFX0ZNX1RVTkVSKSkgeworICAgICAgICBBTE9HRSgiYWRkU291cmNlRGVmYXVsdEVmZmVjdCgpOiBVbnN1cHBvcnRlZCBzb3VyY2UgdHlwZSAlZCIsIHNvdXJjZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gQ2hlY2sgdGhhdCB8dXVpZHwgb3IgfHR5cGV8IGNvcnJlc3BvbmRzIHRvIGFuIGVmZmVjdCBvbiB0aGUgc3lzdGVtLgorICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzY3JpcHRvciA9IHt9OworICAgIHN0YXR1c190IHJlcyA9IEF1ZGlvRWZmZWN0OjpnZXRFZmZlY3REZXNjcmlwdG9yKAorICAgICAgICAgICAgdXVpZCwgdHlwZSwgRUZGRUNUX0ZMQUdfVFlQRV9QUkVfUFJPQywgJmRlc2NyaXB0b3IpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImFkZFNvdXJjZURlZmF1bHRFZmZlY3QoKTogRmFpbGVkIHRvIGZpbmQgZWZmZWN0IGRlc2NyaXB0b3IgbWF0Y2hpbmcgdXVpZC90eXBlLiIpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8vIE9ubHkgcHJlLXByb2Nlc3NpbmcgZWZmZWN0cyBjYW4gYmUgYWRkZWQgZHluYW1pY2FsbHkgYXMgc291cmNlIGRlZmF1bHRzLgorICAgIGlmICgoZGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgIT0gRUZGRUNUX0ZMQUdfVFlQRV9QUkVfUFJPQykgeworICAgICAgICBBTE9HRSgiYWRkU291cmNlRGVmYXVsdEVmZmVjdCgpOiBEZXNpcmVkIGVmZmVjdCBjYW5ub3QgYmUgYXR0YWNoZWQgIgorICAgICAgICAgICAgICAiYXMgYSBzb3VyY2UgZGVmYXVsdCBlZmZlY3QuIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIC8vIEZpbmQgdGhlIEVmZmVjdERlc2NWZWN0b3IgZm9yIHRoZSBnaXZlbiBzb3VyY2UgdHlwZSwgb3IgY3JlYXRlIGEgbmV3IG9uZSBpZiBuZWNlc3NhcnkuCisgICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dFNvdXJjZXMuaW5kZXhPZktleShzb3VyY2UpOworICAgIEVmZmVjdERlc2NWZWN0b3IgKmRlc2MgPSBOVUxMOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgLy8gTm8gZWZmZWN0cyBmb3IgdGhpcyBzb3VyY2UgdHlwZSB5ZXQuCisgICAgICAgIGRlc2MgPSBuZXcgRWZmZWN0RGVzY1ZlY3RvcigpOworICAgICAgICBtSW5wdXRTb3VyY2VzLmFkZChzb3VyY2UsIGRlc2MpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRlc2MgPSBtSW5wdXRTb3VyY2VzLnZhbHVlQXQoaW5kZXgpOworICAgIH0KKworICAgIC8vIENyZWF0ZSBhIG5ldyBlZmZlY3QgYW5kIGFkZCBpdCB0byB0aGUgdmVjdG9yLgorICAgIHJlcyA9IEF1ZGlvRWZmZWN0OjpuZXdFZmZlY3RVbmlxdWVJZChpZCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiYWRkU291cmNlRGVmYXVsdEVmZmVjdCgpOiBmYWlsZWQgdG8gZ2V0IG5ldyB1bmlxdWUgaWQuIik7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIEVmZmVjdERlc2MgKmVmZmVjdCA9IG5ldyBFZmZlY3REZXNjKAorICAgICAgICAgICAgZGVzY3JpcHRvci5uYW1lLCAqdHlwZSwgb3BQYWNrYWdlTmFtZSwgKnV1aWQsIHByaW9yaXR5LCAqaWQpOworICAgIGRlc2MtPm1FZmZlY3RzLmFkZChlZmZlY3QpOworICAgIC8vIFRPRE8oYi83MTgxMzY5Nyk6IFN1cHBvcnQgc2V0dGluZyBwYXJhbXMgYXMgd2VsbC4KKworICAgIC8vIFRPRE8oYi83MTgxNDMwMCk6IFJldHJvYWN0aXZlbHkgYXR0YWNoIHRvIGFueSBleGlzdGluZyBzb3VyY2VzIG9mIHRoZSBnaXZlbiB0eXBlLgorICAgIC8vIFRoaXMgcmVxdWlyZXMgdHJhY2tpbmcgdGhlIHNvdXJjZSB0eXBlIG9mIGVhY2ggc2Vzc2lvbiBpZCBpbiBhZGRpdGlvbiB0byB3aGF0IGlzCisgICAgLy8gYWxyZWFkeSBiZWluZyB0cmFja2VkLgorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeUVmZmVjdHM6OmFkZFN0cmVhbURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdXNhZ2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpCit7CisgICAgaWYgKHV1aWQgPT0gTlVMTCB8fCB0eXBlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImFkZFN0cmVhbURlZmF1bHRFZmZlY3QoKTogTnVsbCB1dWlkIG9yIHR5cGUgdXVpZCBwb2ludGVyIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBhdWRpb191c2FnZV90b19zdHJlYW1fdHlwZSh1c2FnZSk7CisKKyAgICBpZiAoc3RyZWFtIDwgQVVESU9fU1RSRUFNX01JTiB8fCBzdHJlYW0gPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQpIHsKKyAgICAgICAgQUxPR0UoImFkZFN0cmVhbURlZmF1bHRFZmZlY3QoKTogVW5zdXBwb3J0ZWQgc3RyZWFtIHR5cGUgJWQiLCBzdHJlYW0pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIENoZWNrIHRoYXQgfHV1aWR8IG9yIHx0eXBlfCBjb3JyZXNwb25kcyB0byBhbiBlZmZlY3Qgb24gdGhlIHN5c3RlbS4KKyAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2NyaXB0b3IgPSB7fTsKKyAgICBzdGF0dXNfdCByZXMgPSBBdWRpb0VmZmVjdDo6Z2V0RWZmZWN0RGVzY3JpcHRvcigKKyAgICAgICAgICAgIHV1aWQsIHR5cGUsIEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJULCAmZGVzY3JpcHRvcik7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiYWRkU3RyZWFtRGVmYXVsdEVmZmVjdCgpOiBGYWlsZWQgdG8gZmluZCBlZmZlY3QgZGVzY3JpcHRvciBtYXRjaGluZyB1dWlkL3R5cGUuIik7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLy8gT25seSBpbnNlcnQgZWZmZWN0cyBjYW4gYmUgYWRkZWQgZHluYW1pY2FsbHkgYXMgc3RyZWFtIGRlZmF1bHRzLgorICAgIGlmICgoZGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgIT0gRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQpIHsKKyAgICAgICAgQUxPR0UoImFkZFN0cmVhbURlZmF1bHRFZmZlY3QoKTogRGVzaXJlZCBlZmZlY3QgY2Fubm90IGJlIGF0dGFjaGVkICIKKyAgICAgICAgICAgICAgImFzIGEgc3RyZWFtIGRlZmF1bHQgZWZmZWN0LiIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICAvLyBGaW5kIHRoZSBFZmZlY3REZXNjVmVjdG9yIGZvciB0aGUgZ2l2ZW4gc3RyZWFtIHR5cGUsIG9yIGNyZWF0ZSBhIG5ldyBvbmUgaWYgbmVjZXNzYXJ5LgorICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KHN0cmVhbSk7CisgICAgRWZmZWN0RGVzY1ZlY3RvciAqZGVzYyA9IE5VTEw7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAvLyBObyBlZmZlY3RzIGZvciB0aGlzIHN0cmVhbSB0eXBlIHlldC4KKyAgICAgICAgZGVzYyA9IG5ldyBFZmZlY3REZXNjVmVjdG9yKCk7CisgICAgICAgIG1PdXRwdXRTdHJlYW1zLmFkZChzdHJlYW0sIGRlc2MpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRlc2MgPSBtT3V0cHV0U3RyZWFtcy52YWx1ZUF0KGluZGV4KTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgYSBuZXcgZWZmZWN0IGFuZCBhZGQgaXQgdG8gdGhlIHZlY3Rvci4KKyAgICByZXMgPSBBdWRpb0VmZmVjdDo6bmV3RWZmZWN0VW5pcXVlSWQoaWQpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImFkZFN0cmVhbURlZmF1bHRFZmZlY3QoKTogZmFpbGVkIHRvIGdldCBuZXcgdW5pcXVlIGlkLiIpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBFZmZlY3REZXNjICplZmZlY3QgPSBuZXcgRWZmZWN0RGVzYygKKyAgICAgICAgICAgIGRlc2NyaXB0b3IubmFtZSwgKnR5cGUsIG9wUGFja2FnZU5hbWUsICp1dWlkLCBwcmlvcml0eSwgKmlkKTsKKyAgICBkZXNjLT5tRWZmZWN0cy5hZGQoZWZmZWN0KTsKKyAgICAvLyBUT0RPKGIvNzE4MTM2OTcpOiBTdXBwb3J0IHNldHRpbmcgcGFyYW1zIGFzIHdlbGwuCisKKyAgICAvLyBUT0RPKGIvNzE4MTQzMDApOiBSZXRyb2FjdGl2ZWx5IGF0dGFjaCB0byBhbnkgZXhpc3Rpbmcgc3RyZWFtcyBvZiB0aGUgZ2l2ZW4gdHlwZS4KKyAgICAvLyBUaGlzIHJlcXVpcmVzIHRyYWNraW5nIHRoZSBzdHJlYW0gdHlwZSBvZiBlYWNoIHNlc3Npb24gaWQgaW4gYWRkaXRpb24gdG8gd2hhdCBpcworICAgIC8vIGFscmVhZHkgYmVpbmcgdHJhY2tlZC4KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjpyZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKQoreworICAgIGlmIChpZCA9PSBBVURJT19VTklRVUVfSURfQUxMT0NBVEUpIHsKKyAgICAgICAgLy8gQUxMT0NBVEUgaXMgbm90IGEgdW5pcXVlIGlkZW50aWZpZXIsIGJ1dCByYXRoZXIgYSByZXNlcnZlZCB2YWx1ZSBpbmRpY2F0aW5nCisgICAgICAgIC8vIGEgcmVhbCBpZCBoYXMgbm90IGJlZW4gYXNzaWduZWQuIEZvciBkZWZhdWx0IGVmZmVjdHMsIHRoaXMgdmFsdWUgaXMgb25seSB1c2VkCisgICAgICAgIC8vIGJ5IHN5c3RlbS1vd25lZCBkZWZhdWx0cyBmcm9tIHRoZSBsb2FkZWQgY29uZmlnLCB3aGljaCBjYW5ub3QgYmUgcmVtb3ZlZC4KKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgLy8gQ2hlY2sgZWFjaCBzb3VyY2UgdHlwZS4KKyAgICBzaXplX3QgbnVtU291cmNlcyA9IG1JbnB1dFNvdXJjZXMuc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU291cmNlczsgKytpKSB7CisgICAgICAgIC8vIENoZWNrIGVhY2ggZWZmZWN0IGZvciBlYWNoIHNvdXJjZS4KKyAgICAgICAgRWZmZWN0RGVzY1ZlY3RvciogZGVzY1ZlY3RvciA9IG1JbnB1dFNvdXJjZXNbaV07CisgICAgICAgIGZvciAoYXV0byBkZXNjID0gZGVzY1ZlY3Rvci0+bUVmZmVjdHMuYmVnaW4oKTsgZGVzYyAhPSBkZXNjVmVjdG9yLT5tRWZmZWN0cy5lbmQoKTsgKytkZXNjKSB7CisgICAgICAgICAgICBpZiAoKCpkZXNjKS0+bUlkID09IGlkKSB7CisgICAgICAgICAgICAgICAgLy8gRm91bmQgaXQhCisgICAgICAgICAgICAgICAgLy8gVE9ETyhiLzcxODE0MzAwKTogUmVtb3ZlIGZyb20gYW55IHNvdXJjZXMgdGhlIGVmZmVjdCB3YXMgYXR0YWNoZWQgdG8uCisgICAgICAgICAgICAgICAgZGVzY1ZlY3Rvci0+bUVmZmVjdHMuZXJhc2UoZGVzYyk7CisgICAgICAgICAgICAgICAgLy8gSGFuZGxlcyBhcmUgdW5pcXVlOyB0aGVyZSBjYW4gb25seSBiZSBvbmUgbWF0Y2gsIHNvIHJldHVybiBlYXJseS4KKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBFZmZlY3Qgd2Fzbid0IGZvdW5kLCBzbyBpdCdzIGJlZW4gdHJpdmlhbGx5IHJlbW92ZWQgc3VjY2Vzc2Z1bGx5LgorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjpyZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKQoreworICAgIGlmIChpZCA9PSBBVURJT19VTklRVUVfSURfQUxMT0NBVEUpIHsKKyAgICAgICAgLy8gQUxMT0NBVEUgaXMgbm90IGEgdW5pcXVlIGlkZW50aWZpZXIsIGJ1dCByYXRoZXIgYSByZXNlcnZlZCB2YWx1ZSBpbmRpY2F0aW5nCisgICAgICAgIC8vIGEgcmVhbCBpZCBoYXMgbm90IGJlZW4gYXNzaWduZWQuIEZvciBkZWZhdWx0IGVmZmVjdHMsIHRoaXMgdmFsdWUgaXMgb25seSB1c2VkCisgICAgICAgIC8vIGJ5IHN5c3RlbS1vd25lZCBkZWZhdWx0cyBmcm9tIHRoZSBsb2FkZWQgY29uZmlnLCB3aGljaCBjYW5ub3QgYmUgcmVtb3ZlZC4KKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgLy8gQ2hlY2sgZWFjaCBzdHJlYW0gdHlwZS4KKyAgICBzaXplX3QgbnVtU3RyZWFtcyA9IG1PdXRwdXRTdHJlYW1zLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVN0cmVhbXM7ICsraSkgeworICAgICAgICAvLyBDaGVjayBlYWNoIGVmZmVjdCBmb3IgZWFjaCBzdHJlYW0uCisgICAgICAgIEVmZmVjdERlc2NWZWN0b3IqIGRlc2NWZWN0b3IgPSBtT3V0cHV0U3RyZWFtc1tpXTsKKyAgICAgICAgZm9yIChhdXRvIGRlc2MgPSBkZXNjVmVjdG9yLT5tRWZmZWN0cy5iZWdpbigpOyBkZXNjICE9IGRlc2NWZWN0b3ItPm1FZmZlY3RzLmVuZCgpOyArK2Rlc2MpIHsKKyAgICAgICAgICAgIGlmICgoKmRlc2MpLT5tSWQgPT0gaWQpIHsKKyAgICAgICAgICAgICAgICAvLyBGb3VuZCBpdCEKKyAgICAgICAgICAgICAgICAvLyBUT0RPKGIvNzE4MTQzMDApOiBSZW1vdmUgZnJvbSBhbnkgc3RyZWFtcyB0aGUgZWZmZWN0IHdhcyBhdHRhY2hlZCB0by4KKyAgICAgICAgICAgICAgICBkZXNjVmVjdG9yLT5tRWZmZWN0cy5lcmFzZShkZXNjKTsKKyAgICAgICAgICAgICAgICAvLyBIYW5kbGVzIGFyZSB1bmlxdWU7IHRoZXJlIGNhbiBvbmx5IGJlIG9uZSBtYXRjaCwgc28gcmV0dXJuIGVhcmx5LgorICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEVmZmVjdCB3YXNuJ3QgZm91bmQsIHNvIGl0J3MgYmVlbiB0cml2aWFsbHkgcmVtb3ZlZCBzdWNjZXNzZnVsbHkuCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQogCiB2b2lkIEF1ZGlvUG9saWN5RWZmZWN0czo6RWZmZWN0VmVjdG9yOjpzZXRQcm9jZXNzb3JFbmFibGVkKGJvb2wgZW5hYmxlZCkKIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5oCmluZGV4IDYyMzE4MGUuLjZhZDAxZjcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuaApAQCAtNjQsNyArNjQsNiBAQAogICAgIHN0YXR1c190IHJlbGVhc2VJbnB1dEVmZmVjdHMoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uKTsKIAotCiAgICAgLy8gUmV0dXJuIGEgbGlzdCBvZiBlZmZlY3QgZGVzY3JpcHRvcnMgZm9yIGRlZmF1bHQgb3V0cHV0IGVmZmVjdHMKICAgICAvLyBhc3NvY2lhdGVkIHdpdGggYXVkaW9TZXNzaW9uCiAgICAgc3RhdHVzX3QgcXVlcnlEZWZhdWx0T3V0cHV0U2Vzc2lvbkVmZmVjdHMoYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbiwKQEAgLTgyLDE4ICs4MSw2MCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbik7CiAKKyAgICAvLyBBZGQgdGhlIGVmZmVjdCB0byB0aGUgbGlzdCBvZiBkZWZhdWx0IGVmZmVjdHMgZm9yIHNvdXJjZXMgb2YgdHlwZSB8c291cmNlfC4KKyAgICBzdGF0dXNfdCBhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKTsKKworICAgIC8vIEFkZCB0aGUgZWZmZWN0IHRvIHRoZSBsaXN0IG9mIGRlZmF1bHQgZWZmZWN0cyBmb3Igc3RyZWFtcyBvZiBhIGdpdmVuIHVzYWdlLgorICAgIHN0YXR1c190IGFkZFN0cmVhbURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKTsKKworICAgIC8vIFJlbW92ZSB0aGUgZGVmYXVsdCBzb3VyY2UgZWZmZWN0IGZyb20gd2hlcmV2ZXIgaXQncyBhdHRhY2hlZC4KKyAgICBzdGF0dXNfdCByZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKTsKKworICAgIC8vIFJlbW92ZSB0aGUgZGVmYXVsdCBzdHJlYW0gZWZmZWN0IGZyb20gd2hlcmV2ZXIgaXQncyBhdHRhY2hlZC4KKyAgICBzdGF0dXNfdCByZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKTsKKwogcHJpdmF0ZToKIAogICAgIC8vIGNsYXNzIHRvIHN0b3JlIHRoZSBkZXNjcmlwdGlvbiBvZiBhbiBlZmZlY3RzIGFuZCBpdHMgcGFyYW1ldGVycwogICAgIC8vIGFzIGRlZmluZWQgaW4gYXVkaW9fZWZmZWN0cy5jb25mCiAgICAgY2xhc3MgRWZmZWN0RGVzYyB7CiAgICAgcHVibGljOgotICAgICAgICBFZmZlY3REZXNjKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGVmZmVjdF91dWlkX3QmIHV1aWQpIDoKKyAgICAgICAgRWZmZWN0RGVzYyhjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QmIHR5cGVVdWlkLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QmIHV1aWQsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgaWQpIDoKICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lKHN0cmR1cChuYW1lKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBtVXVpZCh1dWlkKSB7IH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1UeXBlVXVpZCh0eXBlVXVpZCksCisgICAgICAgICAgICAgICAgICAgICAgICBtT3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1VdWlkKHV1aWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgbVByaW9yaXR5KHByaW9yaXR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JZChpZCkgeyB9CisgICAgICAgIEVmZmVjdERlc2MoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgZWZmZWN0X3V1aWRfdCYgdXVpZCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0RGVzYyhuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqRUZGRUNUX1VVSURfTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nMTYoIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19VTklRVUVfSURfQUxMT0NBVEUpIHsgfQogICAgICAgICBFZmZlY3REZXNjKGNvbnN0IEVmZmVjdERlc2MmIG9yaWcpIDoKICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lKHN0cmR1cChvcmlnLm1OYW1lKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBtVXVpZChvcmlnLm1VdWlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVHlwZVV1aWQob3JpZy5tVHlwZVV1aWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgbU9wUGFja2FnZU5hbWUob3JpZy5tT3BQYWNrYWdlTmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICBtVXVpZChvcmlnLm1VdWlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qcmlvcml0eShvcmlnLm1Qcmlvcml0eSksCisgICAgICAgICAgICAgICAgICAgICAgICBtSWQob3JpZy5tSWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWVwIGNvcHkgbVBhcmFtcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgb3JpZy5tUGFyYW1zLnNpemUoKTsgaysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICpvcmlnUGFyYW0gPSBvcmlnLm1QYXJhbXNba107CkBAIC0xMTYsNyArMTU3LDExIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgY2hhciAqbU5hbWU7CisgICAgICAgIGVmZmVjdF91dWlkX3QgbVR5cGVVdWlkOworICAgICAgICBTdHJpbmcxNiBtT3BQYWNrYWdlTmFtZTsKICAgICAgICAgZWZmZWN0X3V1aWRfdCBtVXVpZDsKKyAgICAgICAgaW50MzJfdCBtUHJpb3JpdHk7CisgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IG1JZDsKICAgICAgICAgVmVjdG9yIDxlZmZlY3RfcGFyYW1fdCAqPiBtUGFyYW1zOwogICAgIH07CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcAppbmRleCA3MzM3ZjA0Li44MDUwM2ZkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwCkBAIC0xNywxMiArMTcsMTIgQEAKICNkZWZpbmUgTE9HX1RBRyAiQXVkaW9Qb2xpY3lJbnRlZmFjZUltcGwiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KLQogI2luY2x1ZGUgIkF1ZGlvUG9saWN5U2VydmljZS5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKICNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0xODMsNyArMTgzLDcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCiAgICAgY29uc3QgdWlkX3QgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLSAgICBpZiAoIWlzVHJ1c3RlZENhbGxpbmdVaWQoY2FsbGluZ1VpZCkgfHwgdWlkID09ICh1aWRfdCktMSkgeworICAgIGlmICghaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoY2FsbGluZ1VpZCkgfHwgdWlkID09ICh1aWRfdCktMSkgewogICAgICAgICBBTE9HV19JRih1aWQgIT0gKHVpZF90KS0xICYmIHVpZCAhPSBjYWxsaW5nVWlkLAogICAgICAgICAgICAgICAgICIlcyB1aWQgJWQgdHJpZWQgdG8gcGFzcyBpdHNlbGYgb2ZmIGFzICVkIiwgX19GVU5DVElPTl9fLCBjYWxsaW5nVWlkLCB1aWQpOwogICAgICAgICB1aWQgPSBjYWxsaW5nVWlkOwpAQCAtMjAwLDcgKzIwMCw3IEBACiAgICAgICAgICFtb2RpZnlQaG9uZVN0YXRlQWxsb3dlZChwaWQsIHVpZCkpIHsKICAgICAgICAgLy8gSWYgdGhlIGFwcCB0cmllcyB0byBwbGF5IG11c2ljIHRocm91Z2ggdGhlIHRlbGVwaG9ueSBkZXZpY2UgYW5kIGRvZXNuJ3QgaGF2ZSBwZXJtaXNzaW9uCiAgICAgICAgIC8vIHRoZSBmYWxsYmFjayB0byB0aGUgZGVmYXVsdCBvdXRwdXQgZGV2aWNlLgotICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlT3V0cHV0KCpvdXRwdXQsICpzdHJlYW0sIHNlc3Npb24pOworICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlT3V0cHV0KCpwb3J0SWQpOwogICAgICAgICBmbGFncyA9IG9yaWdpbmFsRmxhZ3M7CiAgICAgICAgICpzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKICAgICAgICAgKnBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CkBAIC0yMDgsOTMgKzIwOCwxMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLCBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQpOwogICAgIH0KKworICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgc3AgPEF1ZGlvUGxheWJhY2tDbGllbnQ+IGNsaWVudCA9CisgICAgICAgICAgICBuZXcgQXVkaW9QbGF5YmFja0NsaWVudCgqYXR0ciwgKm91dHB1dCwgdWlkLCBwaWQsIHNlc3Npb24sICpzZWxlY3RlZERldmljZUlkLCAqc3RyZWFtKTsKKyAgICAgICAgbUF1ZGlvUGxheWJhY2tDbGllbnRzLmFkZCgqcG9ydElkLCBjbGllbnQpOworICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKLSAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIEFMT0dWKCJzdGFydE91dHB1dCgpIik7CisgICAgc3A8QXVkaW9QbGF5YmFja0NsaWVudD4gY2xpZW50OwogICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBjb25zdCBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGxheWJhY2tDbGllbnRzLmluZGV4T2ZLZXkocG9ydElkKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzIEF1ZGlvVHJhY2sgY2xpZW50IG5vdCBmb3VuZCBmb3IgcG9ydElkICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIGNsaWVudCA9IG1BdWRpb1BsYXliYWNrQ2xpZW50cy52YWx1ZUF0KGluZGV4KTsKICAgICAgICAgYXVkaW9Qb2xpY3lFZmZlY3RzID0gbUF1ZGlvUG9saWN5RWZmZWN0czsKICAgICB9CiAgICAgaWYgKGF1ZGlvUG9saWN5RWZmZWN0cyAhPSAwKSB7CiAgICAgICAgIC8vIGNyZWF0ZSBhdWRpbyBwcm9jZXNzb3JzIGFjY29yZGluZyB0byBzdHJlYW0KLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb2xpY3lFZmZlY3RzLT5hZGRPdXRwdXRTZXNzaW9uRWZmZWN0cyhvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+YWRkT3V0cHV0U2Vzc2lvbkVmZmVjdHMoCisgICAgICAgICAgICBjbGllbnQtPmlvLCBjbGllbnQtPnN0cmVhbSwgY2xpZW50LT5zZXNzaW9uKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKLSAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gYWRkIGVmZmVjdHMgb24gc2Vzc2lvbiAlZCIsIHNlc3Npb24pOworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBhZGQgZWZmZWN0cyBvbiBzZXNzaW9uICVkIiwgY2xpZW50LT5zZXNzaW9uKTsKICAgICAgICAgfQogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0YXJ0T3V0cHV0KG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdGFydE91dHB1dChwb3J0SWQpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgY2xpZW50LT5hY3RpdmUgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgQUxPR1YoInN0b3BPdXRwdXQoKSIpOwotICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5zdG9wT3V0cHV0Q29tbWFuZChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnN0b3BPdXRwdXRDb21tYW5kKHBvcnRJZCk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb1N0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCitzdGF0dXNfdCAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb1N0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgQUxPR1YoImRvU3RvcE91dHB1dCBmcm9tIHRpZCAlZCIsIGdldHRpZCgpKTsKKyAgICBBTE9HVigiZG9TdG9wT3V0cHV0Iik7CisgICAgc3A8QXVkaW9QbGF5YmFja0NsaWVudD4gY2xpZW50OwogICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgICAgIGNvbnN0IHNzaXplX3QgaW5kZXggPSBtQXVkaW9QbGF5YmFja0NsaWVudHMuaW5kZXhPZktleShwb3J0SWQpOworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgQXVkaW9UcmFjayBjbGllbnQgbm90IGZvdW5kIGZvciBwb3J0SWQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gbUF1ZGlvUGxheWJhY2tDbGllbnRzLnZhbHVlQXQoaW5kZXgpOwogICAgICAgICBhdWRpb1BvbGljeUVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOwogICAgIH0KICAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzICE9IDApIHsKICAgICAgICAgLy8gcmVsZWFzZSBhdWRpbyBwcm9jZXNzb3JzIGZyb20gdGhlIHN0cmVhbQotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPnJlbGVhc2VPdXRwdXRTZXNzaW9uRWZmZWN0cyhvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVsZWFzZU91dHB1dFNlc3Npb25FZmZlY3RzKAorICAgICAgICAgICAgY2xpZW50LT5pbywgY2xpZW50LT5zdHJlYW0sIGNsaWVudC0+c2Vzc2lvbik7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgc3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7Ci0gICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIHJlbGVhc2UgZWZmZWN0cyBvbiBzZXNzaW9uICVkIiwgc2Vzc2lvbik7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIHJlbGVhc2UgZWZmZWN0cyBvbiBzZXNzaW9uICVkIiwgY2xpZW50LT5zZXNzaW9uKTsKICAgICAgICAgfQogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BPdXRwdXQocG9ydElkKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIGNsaWVudC0+YWN0aXZlID0gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgQUxPR1YoInJlbGVhc2VPdXRwdXQoKSIpOwotICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5yZWxlYXNlT3V0cHV0Q29tbWFuZChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnJlbGVhc2VPdXRwdXRDb21tYW5kKHBvcnRJZCk7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb1JlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9SZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIEFMT0dWKCJkb1JlbGVhc2VPdXRwdXQgZnJvbSB0aWQgJWQiLCBnZXR0aWQoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBjb25zdCBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGxheWJhY2tDbGllbnRzLmluZGV4T2ZLZXkocG9ydElkKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dFKCIlcyBBdWRpb1RyYWNrIGNsaWVudCBub3QgZm91bmQgZm9yIHBvcnRJZCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcDxBdWRpb1BsYXliYWNrQ2xpZW50PiBjbGllbnQgPSBtQXVkaW9QbGF5YmFja0NsaWVudHMudmFsdWVBdChpbmRleCk7CisgICAgbUF1ZGlvUmVjb3JkQ2xpZW50cy5yZW1vdmVJdGVtKHBvcnRJZCk7CisKICAgICAvLyBjYWxsZWQgZnJvbSBpbnRlcm5hbCB0aHJlYWQ6IG5vIG5lZWQgdG8gY2xlYXIgY2FsbGVyIGlkZW50aXR5Ci0gICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZU91dHB1dChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZU91dHB1dChwb3J0SWQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCkBAIC0zMjAsNyArMzQzLDcgQEAKIAogICAgIGJvb2wgdXBkYXRlUGlkID0gKHBpZCA9PSAtMSk7CiAgICAgY29uc3QgdWlkX3QgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLSAgICBpZiAoIWlzVHJ1c3RlZENhbGxpbmdVaWQoY2FsbGluZ1VpZCkpIHsKKyAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKGNhbGxpbmdVaWQpKSB7CiAgICAgICAgIEFMT0dXX0lGKHVpZCAhPSAodWlkX3QpLTEgJiYgdWlkICE9IGNhbGxpbmdVaWQsCiAgICAgICAgICAgICAgICAgIiVzIHVpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgJWQiLCBfX0ZVTkNUSU9OX18sIGNhbGxpbmdVaWQsIHVpZCk7CiAgICAgICAgIHVpZCA9IGNhbGxpbmdVaWQ7CkBAIC0zOTgsMTcgKzQyMSwxMyBAQAogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFBFUk1JU1NJT05fREVOSUVEKSB7CiAgICAgICAgICAgICAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlSW5wdXQoKmlucHV0LCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlSW5wdXQoKnBvcnRJZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICB9CiAKLSAgICAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGNsaWVudCA9Ci0gICAgICAgICAgICAgICAgbmV3IEF1ZGlvUmVjb3JkQ2xpZW50KCphdHRyLCAqaW5wdXQsIHVpZCwgcGlkLCBvcFBhY2thZ2VOYW1lLCBzZXNzaW9uKTsKLSAgICAgICAgY2xpZW50LT5hY3RpdmUgPSBmYWxzZTsKLSAgICAgICAgY2xpZW50LT5pc0NvbmN1cnJlbnQgPSBmYWxzZTsKLSAgICAgICAgY2xpZW50LT5pc1ZpcnR1YWxEZXZpY2UgPSBmYWxzZTsgLy9UT0RPIDogdXBkYXRlIGZyb20gQVBNLT5nZXRJbnB1dEZvckF0dHIoKQotICAgICAgICBjbGllbnQtPmRldmljZUlkID0gKnNlbGVjdGVkRGV2aWNlSWQ7CisgICAgICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBjbGllbnQgPSBuZXcgQXVkaW9SZWNvcmRDbGllbnQoKmF0dHIsICppbnB1dCwgdWlkLCBwaWQsIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNlbGVjdGVkRGV2aWNlSWQsIG9wUGFja2FnZU5hbWUpOwogICAgICAgICBtQXVkaW9SZWNvcmRDbGllbnRzLmFkZCgqcG9ydElkLCBjbGllbnQpOwogICAgIH0KIApAQCAtNDM1LDIzICs0NTQsNiBAQAogICAgIHJldHVybiByYXdidWZmZXI7CiB9CiAKLXN0YXRpYyBzdGQ6OnN0cmluZyBhdWRpb0NvbmN1cnJlbmN5U3RyaW5nKAotICAgICAgICBBdWRpb1BvbGljeUludGVyZmFjZTo6Y29uY3VycmVuY3lfdHlwZV9fbWFza190IGNvbmN1cnJlbmN5KQotewotICAgIGNoYXIgYnVmZmVyWzY0XTsgLy8gb3ZlcnNpemVkCi0gICAgaWYgKGNvbmN1cnJlbmN5ICYgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9BTEwpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiVzJXMlcyVzIiwKLSAgICAgICAgICAgIChjb25jdXJyZW5jeSAmIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FMTCk/ICIsY2FsbCI6IiIsCi0gICAgICAgICAgICAoY29uY3VycmVuY3kgJiBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBUFRVUkUpPyAiLGNhcHR1cmUiOiIiLAotICAgICAgICAgICAgKGNvbmN1cnJlbmN5ICYgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9IT1RXT1JEKT8gIixob3R3b3JkIjoiIiwKLSAgICAgICAgICAgIChjb25jdXJyZW5jeSAmIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfUFJFRU1QVCk/ICIscHJlZW1wdCI6IiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIsbm9uZSIpOwotICAgIH0KLQotICAgIHJldHVybiAmYnVmZmVyWzFdOwotfQotCiBzdGQ6OnN0cmluZyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldERldmljZVR5cGVTdHJGb3JQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpIHsKICAgICBzdGQ6OnN0cmluZyB0eXBlU3RyOwogICAgIHN0cnVjdCBhdWRpb19wb3J0IHBvcnQgPSB7fTsKQEAgLTQ2Myw3ICs0NjUsNyBAQAogICAgIHJldHVybiB0eXBlU3RyOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsIGJvb2wgKnNpbGVuY2VkKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC00ODYsMTggKzQ4OCwxNiBAQAogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCi0gICAgLy8gSWYgVUlEIGluYWN0aXZlIGl0IHJlY29yZHMgc2lsZW5jZSB1bnRpbCBiZWNvbWluZyBhY3RpdmUKLSAgICAqc2lsZW5jZWQgPSAhbVVpZFBvbGljeS0+aXNVaWRBY3RpdmUoY2xpZW50LT51aWQpICYmICFjbGllbnQtPmlzVmlydHVhbERldmljZTsKLQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OmNvbmN1cnJlbmN5X3R5cGVfX21hc2tfdCBjb25jdXJyZW5jeSA9Ci0gICAgICAgICAgICBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX05PTkU7CisKKyAgICBjbGllbnQtPmFjdGl2ZSA9IHRydWU7CisgICAgY2xpZW50LT5zdGFydFRpbWVOcyA9IHN5c3RlbVRpbWUoKTsKKyAgICB1cGRhdGVVaWRTdGF0ZXNfbCgpOwogCiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgIHsKICAgICAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICAgICAgc3RhdHVzID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RhcnRJbnB1dCgKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5pbnB1dCwgY2xpZW50LT5zZXNzaW9uLCAqc2lsZW5jZWQsICZjb25jdXJyZW5jeSk7CisgICAgICAgIHN0YXR1cyA9IG1BdWRpb1BvbGljeU1hbmFnZXItPnN0YXJ0SW5wdXQocG9ydElkKTsKIAogICAgIH0KIApAQCAtNTA2LDcgKzUwNiw2IEBACiAKICAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1BvbGljeVtdID0gImF1ZGlvcG9saWN5IjsKIAotICAgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUG9saWN5UmVhc29uW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5yZWFzb24iOwogICAgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUG9saWN5U3RhdHVzW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5zdGF0dXMiOwogICAgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUG9saWN5UnFzdFNyY1tdID0gImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kucnFzdC5zcmMiOwogICAgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUG9saWN5UnFzdFBrZ1tdID0gImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kucnFzdC5wa2ciOwpAQCAtNTIzLDYxICs1MjIsNDkgQEAKICAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gbmV3IE1lZGlhQW5hbHl0aWNzSXRlbShrQXVkaW9Qb2xpY3kpOwogICAgICAgICBpZiAoaXRlbSAhPSBOVUxMKSB7CiAKLSAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5UmVhc29uLCBhdWRpb0NvbmN1cnJlbmN5U3RyaW5nKGNvbmN1cnJlbmN5KS5jX3N0cigpKTsKICAgICAgICAgICAgIGl0ZW0tPnNldEludDMyKGtBdWRpb1BvbGljeVN0YXR1cywgc3RhdHVzKTsKIAogICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lScXN0U3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1NvdXJjZVN0cmluZyhjbGllbnQtPmF0dHJpYnV0ZXMuc291cmNlKS5jX3N0cigpKTsKLSAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5UnFzdFBrZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoU3RyaW5nOChjbGllbnQtPm9wUGFja2FnZU5hbWUpLnN0cmluZygpKS5jX3N0cigpKTsKICAgICAgICAgICAgIGl0ZW0tPnNldEludDMyKGtBdWRpb1BvbGljeVJxc3RTZXNzaW9uLCBjbGllbnQtPnNlc3Npb24pOwotCisgICAgICAgICAgICBpZiAoY2xpZW50LT5vcFBhY2thZ2VOYW1lLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lScXN0UGtnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoU3RyaW5nOChjbGllbnQtPm9wUGFja2FnZU5hbWUpLnN0cmluZygpKS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lScXN0UGtnLCBzdGQ6OnRvX3N0cmluZyhjbGllbnQtPnVpZCkuY19zdHIoKSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICBrQXVkaW9Qb2xpY3lScXN0RGV2aWNlLCBnZXREZXZpY2VUeXBlU3RyRm9yUG9ydElkKGNsaWVudC0+ZGV2aWNlSWQpLmNfc3RyKCkpOwogCi0gICAgICAgICAgICAvLyBmaWd1cmUgb3V0IHdobyBpcyBhY3RpdmUKLSAgICAgICAgICAgIC8vIE5COiBtaWdodCB0aGUgb3RoZXIgcGFydHkgaGF2ZSBnaXZlbiB1cCB0aGUgbWljcm9waG9uZSBzaW5jZSB0aGVuPyBob3cgc3VyZS4KLSAgICAgICAgICAgIC8vIHBlcmhhcHMgY291bGQgaGF2ZSBnaXZlbiB1cCBvbiBpdC4KLSAgICAgICAgICAgIC8vIHdlIGhvbGQgbUxvY2ssIHNvIHBlcmhhcHMgd2UncmUgc2FmZSBmb3IgdGhpcyBsb29waW5nCi0gICAgICAgICAgICBpZiAoY29uY3VycmVuY3kgIT0gQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgaW50IGNvdW50ID0gbUF1ZGlvUmVjb3JkQ2xpZW50cy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGk8Y291bnQgOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvcnRJZCA9PSBtQXVkaW9SZWNvcmRDbGllbnRzLmtleUF0KGkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gb3RoZXIgPSBtQXVkaW9SZWNvcmRDbGllbnRzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvdGhlci0+YWN0aXZlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBrZWVwcyB0aGUgbGFzdCBvZiB0aGUgY2xpZW50cyBtYXJrZWQgYWN0aXZlCi0gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeUFjdGl2ZVNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Tb3VyY2VTdHJpbmcob3RoZXItPmF0dHJpYnV0ZXMuc291cmNlKS5jX3N0cigpKTsKKyAgICAgICAgICAgIGludCBjb3VudCA9IG1BdWRpb1JlY29yZENsaWVudHMuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudCA7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChwb3J0SWQgPT0gbUF1ZGlvUmVjb3JkQ2xpZW50cy5rZXlBdChpKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IG90aGVyID0gbUF1ZGlvUmVjb3JkQ2xpZW50cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgICAgIGlmIChvdGhlci0+YWN0aXZlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGtlZXBzIHRoZSBsYXN0IG9mIHRoZSBjbGllbnRzIG1hcmtlZCBhY3RpdmUKKyAgICAgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lBY3RpdmVTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Tb3VyY2VTdHJpbmcob3RoZXItPmF0dHJpYnV0ZXMuc291cmNlKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgaXRlbS0+c2V0SW50MzIoa0F1ZGlvUG9saWN5QWN0aXZlU2Vzc2lvbiwgb3RoZXItPnNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICBpZiAob3RoZXItPm9wUGFja2FnZU5hbWUuc2l6ZSgpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5QWN0aXZlUGtnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKFN0cmluZzgob3RoZXItPm9wUGFja2FnZU5hbWUpLnN0cmluZygpKS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldEludDMyKGtBdWRpb1BvbGljeUFjdGl2ZVNlc3Npb24sIG90aGVyLT5zZXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5QWN0aXZlRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VUeXBlU3RyRm9yUG9ydElkKG90aGVyLT5kZXZpY2VJZCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKFN0cmluZzgob3RoZXItPm9wUGFja2FnZU5hbWUpLnN0cmluZygpKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5UnFzdFBrZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp0b19zdHJpbmcob3RoZXItPnVpZCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lBY3RpdmVEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlVHlwZVN0ckZvclBvcnRJZChvdGhlci0+ZGV2aWNlSWQpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGl0ZW0tPnNlbGZyZWNvcmQoKTsKICAgICAgICAgICAgIGRlbGV0ZSBpdGVtOwogICAgICAgICAgICAgaXRlbSA9IE5VTEw7CiAgICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoY29uY3VycmVuY3kgJiB+QXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9BTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0YXJ0SW5wdXQoKTogaW52YWxpZCBjb25jdXJyZW5jeSB0eXBlICVkIiwgKGludCljb25jdXJyZW5jeSk7Ci0KLSAgICAgICAgLy8gZW5mb3JjZSBwZXJtaXNzaW9uIChpZiBhbnkpIHJlcXVpcmVkIGZvciBlYWNoIHR5cGUgb2YgY29uY3VycmVuY3kKLSAgICAgICAgaWYgKGNvbmN1cnJlbmN5ICYgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQUxMKSB7Ci0gICAgICAgICAgICAvL1RPRE86IGNoZWNrIGluY2FsbCBjYXB0dXJlIHBlcm1pc3Npb24KLSAgICAgICAgfQotICAgICAgICBpZiAoY29uY3VycmVuY3kgJiBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBUFRVUkUpIHsKLSAgICAgICAgICAgIC8vVE9ETzogY2hlY2sgY29uY3VycmVudCBjYXB0dXJlIHBlcm1pc3Npb24KLSAgICAgICAgfQotCi0gICAgICAgIGNsaWVudC0+YWN0aXZlID0gdHJ1ZTsKLSAgICB9IGVsc2UgeworICAgICAgICBjbGllbnQtPmFjdGl2ZSA9IGZhbHNlOworICAgICAgICBjbGllbnQtPnN0YXJ0VGltZU5zID0gMDsKKyAgICAgICAgdXBkYXRlVWlkU3RhdGVzX2woKTsKICAgICAgICAgZmluaXNoUmVjb3JkaW5nKGNsaWVudC0+b3BQYWNrYWdlTmFtZSwgY2xpZW50LT51aWQpOwogICAgIH0KIApAQCAtNTg5LDYgKzU3Niw3IEBACiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CisKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCiAgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1JlY29yZENsaWVudHMuaW5kZXhPZktleShwb3J0SWQpOwpAQCAtNTk4LDExICs1ODYsMTQgQEAKICAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gY2xpZW50ID0gbUF1ZGlvUmVjb3JkQ2xpZW50cy52YWx1ZUF0KGluZGV4KTsKIAogICAgIGNsaWVudC0+YWN0aXZlID0gZmFsc2U7CisgICAgY2xpZW50LT5zdGFydFRpbWVOcyA9IDA7CisKKyAgICB1cGRhdGVVaWRTdGF0ZXNfbCgpOwogCiAgICAgLy8gZmluaXNoIHRoZSByZWNvcmRpbmcgYXBwIG9wCiAgICAgZmluaXNoUmVjb3JkaW5nKGNsaWVudC0+b3BQYWNrYWdlTmFtZSwgY2xpZW50LT51aWQpOwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BJbnB1dChjbGllbnQtPmlucHV0LCBjbGllbnQtPnNlc3Npb24pOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdG9wSW5wdXQocG9ydElkKTsKIH0KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbGVhc2VJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKQEAgLTYyMCw2ICs2MTEsMTQgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBjbGllbnQgPSBtQXVkaW9SZWNvcmRDbGllbnRzLnZhbHVlQXQoaW5kZXgpOworCisgICAgICAgIGlmIChjbGllbnQtPmFjdGl2ZSkgeworICAgICAgICAgICAgQUxPR1coIiVzIHJlbGVhc2luZyBhY3RpdmUgY2xpZW50IHBvcnRJZCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKKyAgICAgICAgICAgIGNsaWVudC0+YWN0aXZlID0gZmFsc2U7CisgICAgICAgICAgICBjbGllbnQtPnN0YXJ0VGltZU5zID0gMDsKKyAgICAgICAgICAgIHVwZGF0ZVVpZFN0YXRlc19sKCk7CisgICAgICAgIH0KKwogICAgICAgICBtQXVkaW9SZWNvcmRDbGllbnRzLnJlbW92ZUl0ZW0ocG9ydElkKTsKICAgICB9CiAgICAgaWYgKGNsaWVudCA9PSAwKSB7CkBAIC02MjcsMTUgKzYyNiwxNSBAQAogICAgIH0KICAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzICE9IDApIHsKICAgICAgICAgLy8gcmVsZWFzZSBhdWRpbyBwcm9jZXNzb3JzIGZyb20gdGhlIGlucHV0Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVsZWFzZUlucHV0RWZmZWN0cyhjbGllbnQtPmlucHV0LCBjbGllbnQtPnNlc3Npb24pOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPnJlbGVhc2VJbnB1dEVmZmVjdHMoY2xpZW50LT5pbywgY2xpZW50LT5zZXNzaW9uKTsKICAgICAgICAgaWYoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIHJlbGVhc2UgZWZmZWN0cyBvbiBpbnB1dCAlZCIsIGNsaWVudC0+aW5wdXQpOworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byByZWxlYXNlIGVmZmVjdHMgb24gaW5wdXQgJWQiLCBjbGllbnQtPmlvKTsKICAgICAgICAgfQogICAgIH0KICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VJbnB1dChjbGllbnQtPmlucHV0LCBjbGllbnQtPnNlc3Npb24pOworICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlSW5wdXQocG9ydElkKTsKICAgICB9CiB9CiAKQEAgLTgwMywyNyArODAyLDEwMCBAQAogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pc1NvdXJjZUFjdGl2ZShzb3VyY2UpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcoYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldEF1ZGlvUG9saWN5RWZmZWN0cyhzcDxBdWRpb1BvbGljeUVmZmVjdHM+JiBhdWRpb1BvbGljeUVmZmVjdHMpCiB7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICAqY291bnQgPSAwOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIGF1ZGlvUG9saWN5RWZmZWN0cyA9IG1BdWRpb1BvbGljeUVmZmVjdHM7CiAgICAgfQogICAgIGlmIChhdWRpb1BvbGljeUVmZmVjdHMgPT0gMCkgewotICAgICAgICAqY291bnQgPSAwOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCkKK3sKKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEF1ZGlvUG9saWN5RWZmZWN0cyhhdWRpb1BvbGljeUVmZmVjdHMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgKmNvdW50ID0gMDsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CiAgICAgcmV0dXJuIGF1ZGlvUG9saWN5RWZmZWN0cy0+cXVlcnlEZWZhdWx0SW5wdXRFZmZlY3RzKAogICAgICAgICAgICAgKGF1ZGlvX3Nlc3Npb25fdClhdWRpb1Nlc3Npb24sIGRlc2NyaXB0b3JzLCBjb3VudCk7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6YWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKQoreworICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QXVkaW9Qb2xpY3lFZmZlY3RzKGF1ZGlvUG9saWN5RWZmZWN0cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBpZiAoIW1vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICByZXR1cm4gYXVkaW9Qb2xpY3lFZmZlY3RzLT5hZGRTb3VyY2VEZWZhdWx0RWZmZWN0KAorICAgICAgICAgICAgdHlwZSwgb3BQYWNrYWdlTmFtZSwgdXVpZCwgcHJpb3JpdHksIHNvdXJjZSwgaWQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmFkZFN0cmVhbURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdXNhZ2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpCit7CisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRBdWRpb1BvbGljeUVmZmVjdHMoYXVkaW9Qb2xpY3lFZmZlY3RzKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGlmICghbW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIHJldHVybiBhdWRpb1BvbGljeUVmZmVjdHMtPmFkZFN0cmVhbURlZmF1bHRFZmZlY3QoCisgICAgICAgICAgICB0eXBlLCBvcFBhY2thZ2VOYW1lLCB1dWlkLCBwcmlvcml0eSwgdXNhZ2UsIGlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKQoreworICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QXVkaW9Qb2xpY3lFZmZlY3RzKGF1ZGlvUG9saWN5RWZmZWN0cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBpZiAoIW1vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICByZXR1cm4gYXVkaW9Qb2xpY3lFZmZlY3RzLT5yZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKQoreworICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QXVkaW9Qb2xpY3lFZmZlY3RzKGF1ZGlvUG9saWN5RWZmZWN0cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBpZiAoIW1vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICByZXR1cm4gYXVkaW9Qb2xpY3lFZmZlY3RzLT5yZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGlkKTsKK30KKwogYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgaW5mbykKIHsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CkBAIC04MzcsNiArOTA5LDE3IEBACiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmlzT2ZmbG9hZFN1cHBvcnRlZChpbmZvKTsKIH0KIAorYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QmIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMpIHsKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25maWcsIGF0dHJpYnV0ZXMpOworfQorCisKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6bGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCkBAIC05NTQsMjcgKzEwMzcsNTIgQEAKICAgICB9CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsCisgICAgICAgIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldFVpZERldmljZUFmZmluaXRpZXModWlkLCBkZXZpY2VzKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkKTsKK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdGFydEF1ZGlvU291cmNlKHNvdXJjZSwgYXR0cmlidXRlcywgaGFuZGxlLAorICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdGFydEF1ZGlvU291cmNlKHNvdXJjZSwgYXR0cmlidXRlcywgcG9ydElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RvcEF1ZGlvU291cmNlKGhhbmRsZSk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BBdWRpb1NvdXJjZShwb3J0SWQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldE1hc3Rlck1vbm8oYm9vbCBtb25vKQpAQCAtMTAzNiw0ICsxMTQ0LDI5IEBACiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb0Zvcm1hdCwgZW5hYmxlZCk7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0QXNzaXN0YW50VWlkKHVpZF90IHVpZCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1VaWRQb2xpY3ktPnNldEFzc2lzdGFudFVpZCh1aWQpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRBMTF5U2VydmljZXNVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgdWlkcykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1VaWRQb2xpY3ktPnNldEExMXlVaWRzKHVpZHMpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coIiVzLCBtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAppbmRleCBmM2NkZGMzLi40MTY4MTdmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCkBAIC0yNiw3ICsyNiw2IEBACiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL211bHRpdXNlci5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0FjdGl2aXR5TWFuYWdlci5oPgpAQCAtMzUsMTYgKzM0LDE1IEBACiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lTZXJ2aWNlLmgiCi0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgogI2luY2x1ZGUgPGhhcmR3YXJlX2xlZ2FjeS9wb3dlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KKyNpbmNsdWRlIDxzZW5zb3Jwcml2YWN5L1NlbnNvclByaXZhY3lNYW5hZ2VyLmg+CiAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CiAKLSNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdGF0aWMgY29uc3QgY2hhciBrRGVhZGxvY2tlZFN0cmluZ1tdID0gIkF1ZGlvUG9saWN5U2VydmljZSBtYXkgYmUgZGVhZGxvY2tlZFxuIjsKQEAgLTcwLDggKzY4LDYgQEAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKLSAgICAgICAgLy8gc3RhcnQgdG9uZSBwbGF5YmFjayB0aHJlYWQKLSAgICAgICAgbVRvbmVQbGF5YmFja1RocmVhZCA9IG5ldyBBdWRpb0NvbW1hbmRUaHJlYWQoU3RyaW5nOCgiQXBtVG9uZSIpLCB0aGlzKTsKICAgICAgICAgLy8gc3RhcnQgYXVkaW8gY29tbWFuZHMgdGhyZWFkCiAgICAgICAgIG1BdWRpb0NvbW1hbmRUaHJlYWQgPSBuZXcgQXVkaW9Db21tYW5kVGhyZWFkKFN0cmluZzgoIkFwbUF1ZGlvIiksIHRoaXMpOwogICAgICAgICAvLyBzdGFydCBvdXRwdXQgYWN0aXZpdHkgY29tbWFuZCB0aHJlYWQKQEAgLTg5LDExICs4NSwxMyBAQAogCiAgICAgbVVpZFBvbGljeSA9IG5ldyBVaWRQb2xpY3kodGhpcyk7CiAgICAgbVVpZFBvbGljeS0+cmVnaXN0ZXJTZWxmKCk7CisKKyAgICBtU2Vuc29yUHJpdmFjeVBvbGljeSA9IG5ldyBTZW5zb3JQcml2YWN5UG9saWN5KHRoaXMpOworICAgIG1TZW5zb3JQcml2YWN5UG9saWN5LT5yZWdpc3RlclNlbGYoKTsKIH0KIAogQXVkaW9Qb2xpY3lTZXJ2aWNlOjp+QXVkaW9Qb2xpY3lTZXJ2aWNlKCkKIHsKLSAgICBtVG9uZVBsYXliYWNrVGhyZWFkLT5leGl0KCk7CiAgICAgbUF1ZGlvQ29tbWFuZFRocmVhZC0+ZXhpdCgpOwogICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5leGl0KCk7CiAKQEAgLTEwNSw2ICsxMDMsOSBAQAogCiAgICAgbVVpZFBvbGljeS0+dW5yZWdpc3RlclNlbGYoKTsKICAgICBtVWlkUG9saWN5LmNsZWFyKCk7CisKKyAgICBtU2Vuc29yUHJpdmFjeVBvbGljeS0+dW5yZWdpc3RlclNlbGYoKTsKKyAgICBtU2Vuc29yUHJpdmFjeVBvbGljeS5jbGVhcigpOwogfQogCiAvLyBBIG5vdGlmaWNhdGlvbiBjbGllbnQgaXMgYWx3YXlzIHJlZ2lzdGVyZWQgYnkgQXVkaW9TeXN0ZW0gd2hlbiB0aGUgY2xpZW50IHByb2Nlc3MKQEAgLTExOCwxMyArMTE5LDE3IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Ob3RpZmljYXRpb25DbGllbnRzTG9jayk7CiAKICAgICB1aWRfdCB1aWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLmluZGV4T2ZLZXkodWlkKSA8IDApIHsKKyAgICBwaWRfdCBwaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgaW50NjRfdCB0b2tlbiA9ICgoaW50NjRfdCl1aWQ8PDMyKSB8IHBpZDsKKworICAgIGlmIChtTm90aWZpY2F0aW9uQ2xpZW50cy5pbmRleE9mS2V5KHRva2VuKSA8IDApIHsKICAgICAgICAgc3A8Tm90aWZpY2F0aW9uQ2xpZW50PiBub3RpZmljYXRpb25DbGllbnQgPSBuZXcgTm90aWZpY2F0aW9uQ2xpZW50KHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQpOwotICAgICAgICBBTE9HVigicmVnaXN0ZXJDbGllbnQoKSBjbGllbnQgJXAsIHVpZCAlZCIsIGNsaWVudC5nZXQoKSwgdWlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZCk7CisgICAgICAgIEFMT0dWKCJyZWdpc3RlckNsaWVudCgpIGNsaWVudCAlcCwgdWlkICVkIHBpZCAlZCIsIGNsaWVudC5nZXQoKSwgdWlkLCBwaWQpOwogCi0gICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLmFkZCh1aWQsIG5vdGlmaWNhdGlvbkNsaWVudCk7CisgICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLmFkZCh0b2tlbiwgbm90aWZpY2F0aW9uQ2xpZW50KTsKIAogICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBJSW50ZXJmYWNlOjphc0JpbmRlcihjbGllbnQpOwogICAgICAgICBiaW5kZXItPmxpbmtUb0RlYXRoKG5vdGlmaWNhdGlvbkNsaWVudCk7CkBAIC0xMzYsMjIgKzE0MSwzMyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTm90aWZpY2F0aW9uQ2xpZW50c0xvY2spOwogCiAgICAgdWlkX3QgdWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGlmIChtTm90aWZpY2F0aW9uQ2xpZW50cy5pbmRleE9mS2V5KHVpZCkgPCAwKSB7CisgICAgcGlkX3QgcGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIGludDY0X3QgdG9rZW4gPSAoKGludDY0X3QpdWlkPDwzMikgfCBwaWQ7CisKKyAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMuaW5kZXhPZktleSh0b2tlbikgPCAwKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVGb3IodWlkKS0+c2V0QXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZChlbmFibGVkKTsKKyAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUZvcih0b2tlbiktPnNldEF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoZW5hYmxlZCk7CiB9CiAKIC8vIHJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudCgpIGlzIGNhbGxlZCB3aGVuIHRoZSBjbGllbnQgcHJvY2VzcyBkaWVzLgotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudCh1aWRfdCB1aWQpCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6cmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KHVpZF90IHVpZCwgcGlkX3QgcGlkKQogewogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Ob3RpZmljYXRpb25DbGllbnRzTG9jayk7Ci0gICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnJlbW92ZUl0ZW0odWlkKTsKKyAgICAgICAgaW50NjRfdCB0b2tlbiA9ICgoaW50NjRfdCl1aWQ8PDMyKSB8IHBpZDsKKyAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMucmVtb3ZlSXRlbSh0b2tlbik7CiAgICAgfQogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIpIHsKKyAgICAgICAgYm9vbCBoYXNTYW1lVWlkID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU5vdGlmaWNhdGlvbkNsaWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUF0KGkpLT51aWQoKSA9PSB1aWQpIHsKKyAgICAgICAgICAgICAgICBoYXNTYW1lVWlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciAmJiAhaGFzU2FtZVVpZCkgewogICAgICAgICAgICAgLy8gY2FsbGVkIGZyb20gYmluZGVyIGRlYXRoIG5vdGlmaWNhdGlvbjogbm8gbmVlZCB0byBjbGVhciBjYWxsZXIgaWRlbnRpdHkKICAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VSZXNvdXJjZXNGb3JVaWQodWlkKTsKICAgICAgICAgfQpAQCAtMTk5LDIyICsyMTUsMzQgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAotICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAotICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKQordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Om9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKQogewogICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5yZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlQ29tbWFuZChldmVudCwgY2xpZW50SW5mbywKLSAgICAgICAgICAgIGNsaWVudENvbmZpZywgZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICBjbGllbnRDb25maWcsIGNsaWVudEVmZmVjdHMsIGRldmljZUNvbmZpZywgZWZmZWN0cywgcGF0Y2hIYW5kbGUsIHNvdXJjZSk7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb09uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCi0gICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCi0gICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9PblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTm90aWZpY2F0aW9uQ2xpZW50c0xvY2spOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU5vdGlmaWNhdGlvbkNsaWVudHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVBdChpKS0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCBjbGllbnRJbmZvLAotICAgICAgICAgICAgICAgIGNsaWVudENvbmZpZywgZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICAgICAgY2xpZW50Q29uZmlnLCBjbGllbnRFZmZlY3RzLCBkZXZpY2VDb25maWcsIGVmZmVjdHMsIHBhdGNoSGFuZGxlLCBzb3VyY2UpOwogICAgIH0KIH0KIApAQCAtMjM5LDggKzI2Nyw5IEBACiAKIEF1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpOb3RpZmljYXRpb25DbGllbnQoY29uc3Qgc3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiYgc2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKQotICAgIDogbVNlcnZpY2Uoc2VydmljZSksIG1VaWQodWlkKSwgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudChjbGllbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCkKKyAgICA6IG1TZXJ2aWNlKHNlcnZpY2UpLCBtVWlkKHVpZCksIG1QaWQocGlkKSwgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudChjbGllbnQpLAogICAgICAgbUF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoZmFsc2UpCiB7CiB9CkBAIC0yNTQsNyArMjgzLDcgQEAKICAgICBzcDxOb3RpZmljYXRpb25DbGllbnQ+IGtlZXAodGhpcyk7CiAgICAgc3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBzZXJ2aWNlID0gbVNlcnZpY2UucHJvbW90ZSgpOwogICAgIGlmIChzZXJ2aWNlICE9IDApIHsKLSAgICAgICAgc2VydmljZS0+cmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KG1VaWQpOworICAgICAgICBzZXJ2aWNlLT5yZW1vdmVOb3RpZmljYXRpb25DbGllbnQobVVpZCwgbVBpZCk7CiAgICAgfQogfQogCkBAIC0yNzUsMTkgKzMwNCwyNCBAQAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIHJlZ0lkLCBpbnQzMl90IHN0YXRlKQogewotICAgIGlmIChtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ICE9IDAgJiYgbXVsdGl1c2VyX2dldF9hcHBfaWQobVVpZCkgPCBBSURfQVBQX1NUQVJUKSB7CisgICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCAmJiBpc1NlcnZpY2VVaWQobVVpZCkpIHsKICAgICAgICAgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUocmVnSWQsIHN0YXRlKTsKICAgICB9CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpOb3RpZmljYXRpb25DbGllbnQ6Om9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKLSAgICAgICAgaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCi0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKIHsKLSAgICBpZiAobUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCAhPSAwICYmIG11bHRpdXNlcl9nZXRfYXBwX2lkKG1VaWQpIDwgQUlEX0FQUF9TVEFSVCkgeworICAgIGlmIChtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ICE9IDAgJiYgaXNTZXJ2aWNlVWlkKG1VaWQpKSB7CiAgICAgICAgIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQtPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICBjbGllbnRDb25maWcsIGRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgICAgIGNsaWVudENvbmZpZywgY2xpZW50RWZmZWN0cywgZGV2aWNlQ29uZmlnLCBlZmZlY3RzLCBwYXRjaEhhbmRsZSwgc291cmNlKTsKICAgICB9CiB9CiAKQEAgLTMyNSwyNCArMzU5LDE2OCBAQAogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJDb21tYW5kIFRocmVhZDogJXBcbiIsIG1BdWRpb0NvbW1hbmRUaHJlYWQuZ2V0KCkpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJUb25lcyBUaHJlYWQ6ICVwXG4iLCBtVG9uZVBsYXliYWNrVGhyZWFkLmdldCgpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAKICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQsIGJvb2wgc2lsZW5jZWQpCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6dXBkYXRlVWlkU3RhdGVzKCkKIHsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyKSB7Ci0gICAgICAgICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0UmVjb3JkU2lsZW5jZWQodWlkLCBzaWxlbmNlZCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICB1cGRhdGVVaWRTdGF0ZXNfbCgpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6dXBkYXRlVWlkU3RhdGVzX2woKQoreworLy8gICAgR28gb3ZlciBhbGwgYWN0aXZlIGNsaWVudHMgYW5kIGFsbG93IGNhcHR1cmUgKGRvZXMgbm90IGZvcmNlIHNpbGVuY2UpIGluIHRoZQorLy8gICAgZm9sbG93aW5nIGNhc2VzOgorLy8gICAgVGhlIGNsaWVudCBpcyB0aGUgYXNzaXN0YW50CisvLyAgICAgICAgQU5EIGFuIGFjY2Vzc2liaWxpdHkgc2VydmljZSBpcyBvbiBUT1AKKy8vICAgICAgICAgICAgICAgQU5EIHRoZSBzb3VyY2UgaXMgVk9JQ0VfUkVDT0dOSVRJT04gb3IgSE9UV09SRAorLy8gICAgICAgIE9SIHVzZXMgVk9JQ0VfUkVDT0dOSVRJT04gQU5EIGlzIG9uIFRPUCBPUiBsYXRlc3Qgc3RhcnRlZAorLy8gICAgICAgICAgICAgICBPUiB1c2VzIEhPVFdPUkQKKy8vICAgICAgICAgICAgQU5EIHRoZXJlIGlzIG5vIHByaXZhY3kgc2Vuc2l0aXZlIGFjdGl2ZSBjYXB0dXJlCisvLyAgICBPUiBUaGUgY2xpZW50IGlzIGFuIGFjY2Vzc2liaWxpdHkgc2VydmljZQorLy8gICAgICAgIEFORCBpcyBvbiBUT1AgT1IgbGF0ZXN0IHN0YXJ0ZWQKKy8vICAgICAgICBBTkQgdGhlIHNvdXJjZSBpcyBWT0lDRV9SRUNPR05JVElPTiBvciBIT1RXT1JECisvLyAgICBPUiBBbnkgb3RoZXIgY2xpZW50CisvLyAgICAgICAgQU5EIFRoZSBhc3Npc3RhbnQgaXMgbm90IG9uIFRPUAorLy8gICAgICAgIEFORCBpcyBvbiBUT1AgT1IgbGF0ZXN0IHN0YXJ0ZWQKKy8vICAgICAgICBBTkQgdGhlcmUgaXMgbm8gcHJpdmFjeSBzZW5zaXRpdmUgYWN0aXZlIGNhcHR1cmUKKy8vVE9ETzogbWFtYW5hZ2UgcHJlIHByb2Nlc3NpbmcgZWZmZWN0cyBhY2NvcmRpbmcgdG8gdXNlIGNhc2UgcHJpb3JpdHkKKworICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiB0b3BBY3RpdmU7CisgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGxhdGVzdEFjdGl2ZTsKKyAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gbGF0ZXN0U2Vuc2l0aXZlQWN0aXZlOworICAgIG5zZWNzX3QgdG9wU3RhcnROcyA9IDA7CisgICAgbnNlY3NfdCBsYXRlc3RTdGFydE5zID0gMDsKKyAgICBuc2Vjc190IGxhdGVzdFNlbnNpdGl2ZVN0YXJ0TnMgPSAwOworICAgIGJvb2wgaXNBMTF5T25Ub3AgPSBtVWlkUG9saWN5LT5pc0ExMXlPblRvcCgpOworICAgIGJvb2wgaXNBc3Npc3RhbnRPblRvcCA9IGZhbHNlOworICAgIGJvb2wgaXNTZW5zaXRpdmVBY3RpdmUgPSBmYWxzZTsKKworICAgIC8vIGlmIFNlbnNvciBQcml2YWN5IGlzIGVuYWJsZWQgdGhlbiBhbGwgcmVjb3JkaW5ncyBzaG91bGQgYmUgc2lsZW5jZWQuCisgICAgaWYgKG1TZW5zb3JQcml2YWN5UG9saWN5LT5pc1NlbnNvclByaXZhY3lFbmFibGVkKCkpIHsKKyAgICAgICAgc2lsZW5jZUFsbFJlY29yZGluZ3NfbCgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9MDsgaSA8IG1BdWRpb1JlY29yZENsaWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGN1cnJlbnQgPSBtQXVkaW9SZWNvcmRDbGllbnRzW2ldOworICAgICAgICBpZiAoIWN1cnJlbnQtPmFjdGl2ZSkgY29udGludWU7CisgICAgICAgIGlmIChpc1ByaXZhY3lTZW5zaXRpdmUoY3VycmVudC0+YXR0cmlidXRlcy5zb3VyY2UpKSB7CisgICAgICAgICAgICBpZiAoY3VycmVudC0+c3RhcnRUaW1lTnMgPiBsYXRlc3RTZW5zaXRpdmVTdGFydE5zKSB7CisgICAgICAgICAgICAgICAgbGF0ZXN0U2Vuc2l0aXZlQWN0aXZlID0gY3VycmVudDsKKyAgICAgICAgICAgICAgICBsYXRlc3RTZW5zaXRpdmVTdGFydE5zID0gY3VycmVudC0+c3RhcnRUaW1lTnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpc1NlbnNpdGl2ZUFjdGl2ZSA9IHRydWU7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG1VaWRQb2xpY3ktPmdldFVpZFN0YXRlKGN1cnJlbnQtPnVpZCkgPT0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1RPUCkgeworICAgICAgICAgICAgaWYgKGN1cnJlbnQtPnN0YXJ0VGltZU5zID4gdG9wU3RhcnROcykgeworICAgICAgICAgICAgICAgIHRvcEFjdGl2ZSA9IGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgdG9wU3RhcnROcyA9IGN1cnJlbnQtPnN0YXJ0VGltZU5zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1VaWRQb2xpY3ktPmlzQXNzaXN0YW50VWlkKGN1cnJlbnQtPnVpZCkpIHsKKyAgICAgICAgICAgICAgICBpc0Fzc2lzdGFudE9uVG9wID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY3VycmVudC0+c3RhcnRUaW1lTnMgPiBsYXRlc3RTdGFydE5zKSB7CisgICAgICAgICAgICBsYXRlc3RBY3RpdmUgPSBjdXJyZW50OworICAgICAgICAgICAgbGF0ZXN0U3RhcnROcyA9IGN1cnJlbnQtPnN0YXJ0VGltZU5zOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHRvcEFjdGl2ZSA9PSBudWxscHRyICYmIGxhdGVzdEFjdGl2ZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAodG9wQWN0aXZlICE9IG51bGxwdHIpIHsKKyAgICAgICAgbGF0ZXN0QWN0aXZlID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0wOyBpIDwgbUF1ZGlvUmVjb3JkQ2xpZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gY3VycmVudCA9IG1BdWRpb1JlY29yZENsaWVudHNbaV07CisgICAgICAgIGlmICghY3VycmVudC0+YWN0aXZlKSBjb250aW51ZTsKKworICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSBjdXJyZW50LT5hdHRyaWJ1dGVzLnNvdXJjZTsKKyAgICAgICAgYm9vbCBpc09uVG9wID0gY3VycmVudCA9PSB0b3BBY3RpdmU7CisgICAgICAgIGJvb2wgaXNMYXRlc3QgPSBjdXJyZW50ID09IGxhdGVzdEFjdGl2ZTsKKyAgICAgICAgYm9vbCBpc0xhdGVzdFNlbnNpdGl2ZSA9IGN1cnJlbnQgPT0gbGF0ZXN0U2Vuc2l0aXZlQWN0aXZlOworICAgICAgICBib29sIGZvcmNlSWRsZSA9IHRydWU7CisgICAgICAgIGlmIChtVWlkUG9saWN5LT5pc0Fzc2lzdGFudFVpZChjdXJyZW50LT51aWQpKSB7CisgICAgICAgICAgICBpZiAoaXNBMTF5T25Ub3ApIHsKKyAgICAgICAgICAgICAgICBpZiAoc291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEIHx8IHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04pIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yY2VJZGxlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoKCgoaXNPblRvcCB8fCBpc0xhdGVzdCkgJiYgc291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTikgfHwKKyAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgJiYgIWlzU2Vuc2l0aXZlQWN0aXZlKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcmNlSWRsZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtVWlkUG9saWN5LT5pc0ExMXlVaWQoY3VycmVudC0+dWlkKSkgeworICAgICAgICAgICAgaWYgKChpc09uVG9wIHx8IGlzTGF0ZXN0KSAmJgorICAgICAgICAgICAgICAgIChzb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OIHx8IHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkpIHsKKyAgICAgICAgICAgICAgICBmb3JjZUlkbGUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghaXNBc3Npc3RhbnRPblRvcCAmJiAoaXNPblRvcCB8fCBpc0xhdGVzdCkgJiYKKyAgICAgICAgICAgICAgICAoIWlzU2Vuc2l0aXZlQWN0aXZlIHx8IGlzTGF0ZXN0U2Vuc2l0aXZlKSkgeworICAgICAgICAgICAgICAgIGZvcmNlSWRsZSA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNldEFwcFN0YXRlX2woY3VycmVudC0+dWlkLAorICAgICAgICAgICAgICAgICAgICAgIGZvcmNlSWRsZSA/IEFQUF9TVEFURV9JRExFIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcG1TdGF0RnJvbUFtU3RhdGUobVVpZFBvbGljeS0+Z2V0VWlkU3RhdGUoY3VycmVudC0+dWlkKSkpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnNpbGVuY2VBbGxSZWNvcmRpbmdzX2woKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9SZWNvcmRDbGllbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBjdXJyZW50ID0gbUF1ZGlvUmVjb3JkQ2xpZW50c1tpXTsKKyAgICAgICAgc2V0QXBwU3RhdGVfbChjdXJyZW50LT51aWQsIEFQUF9TVEFURV9JRExFKTsKKyAgICB9Cit9CisKKy8qIHN0YXRpYyAqLworYXBwX3N0YXRlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjphcG1TdGF0RnJvbUFtU3RhdGUoaW50IGFtU3RhdGUpIHsKKyAgICBzd2l0Y2ggKGFtU3RhdGUpIHsKKyAgICBjYXNlIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOOgorICAgICAgICByZXR1cm4gQVBQX1NUQVRFX0lETEU7CisgICAgY2FzZSBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVE9QOgorICAgICAgICByZXR1cm4gQVBQX1NUQVRFX1RPUDsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIEFQUF9TVEFURV9GT1JFR1JPVU5EOworfQorCisvKiBzdGF0aWMgKi8KK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc1ByaXZhY3lTZW5zaXRpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKQoreworICAgIHN3aXRjaCAoc291cmNlKSB7CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSzoKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTks6CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0NBTEw6CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX0NBTUNPUkRFUjoKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEFwcFN0YXRlX2wodWlkX3QgdWlkLCBhcHBfc3RhdGVfdCBzdGF0ZSkKK3sKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOworCisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIpIHsKKyAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0QXBwU3RhdGUodWlkLCBzdGF0ZSk7CiAgICAgfQogICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmKSB7CisgICAgICAgIGJvb2wgc2lsZW5jZWQgPSBzdGF0ZSA9PSBBUFBfU1RBVEVfSURMRTsKICAgICAgICAgYWYtPnNldFJlY29yZFNpbGVuY2VkKHVpZCwgc2lsZW5jZWQpOwogICAgIH0KIH0KQEAgLTM2Miw5ICs1NDAsNiBAQAogICAgICAgICBpZiAobUF1ZGlvQ29tbWFuZFRocmVhZCAhPSAwKSB7CiAgICAgICAgICAgICBtQXVkaW9Db21tYW5kVGhyZWFkLT5kdW1wKGZkKTsKICAgICAgICAgfQotICAgICAgICBpZiAobVRvbmVQbGF5YmFja1RocmVhZCAhPSAwKSB7Ci0gICAgICAgICAgICBtVG9uZVBsYXliYWNrVGhyZWFkLT5kdW1wKGZkKTsKLSAgICAgICAgfQogCiAgICAgICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyKSB7CiAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5kdW1wKGZkKTsKQEAgLTUwNSw3ICs2ODAsOCBAQAogICAgIEFjdGl2aXR5TWFuYWdlciBhbTsKICAgICBhbS5yZWdpc3RlclVpZE9ic2VydmVyKHRoaXMsIEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX0dPTkUKICAgICAgICAgICAgIHwgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfSURMRQotICAgICAgICAgICAgfCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9BQ1RJVkUsCisgICAgICAgICAgICB8IEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX0FDVElWRQorICAgICAgICAgICAgfCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9QUk9DU1RBVEUsCiAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTiwKICAgICAgICAgICAgIFN0cmluZzE2KCJhdWRpb3NlcnZlciIpKTsKICAgICBzdGF0dXNfdCByZXMgPSBhbS5saW5rVG9EZWF0aCh0aGlzKTsKQEAgLTUxNCw2ICs2OTAsNyBAQAogICAgICAgICBtT2JzZXJ2ZXJSZWdpc3RlcmVkID0gdHJ1ZTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HRSgiVWlkUG9saWN5OjpyZWdpc3RlclNlbGYgbGlua1RvRGVhdGggZmFpbGVkOiAlZCIsIHJlcyk7CisKICAgICAgICAgYW0udW5yZWdpc3RlclVpZE9ic2VydmVyKHRoaXMpOwogICAgIH0KIH0KQEAgLTUzMiw4ICs3MDksNyBAQAogICAgIG1PYnNlcnZlclJlZ2lzdGVyZWQgPSBmYWxzZTsKIH0KIAotYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6aXNVaWRBY3RpdmUodWlkX3QgdWlkKSB7Ci0gICAgaWYgKGlzU2VydmljZVVpZCh1aWQpKSByZXR1cm4gdHJ1ZTsKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OmNoZWNrUmVnaXN0ZXJlZCgpIHsKICAgICBib29sIG5lZWRUb1JlcmVnaXN0ZXIgPSBmYWxzZTsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC01NDMsMTAzICs3MTksMjEzIEBACiAgICAgICAgIC8vIExvb2tzIGxpa2UgQWN0aXZpdHlNYW5hZ2VyIGhhcyBkaWVkIHByZXZpb3VzbHksIGF0dGVtcHQgdG8gcmUtcmVnaXN0ZXIuCiAgICAgICAgIHJlZ2lzdGVyU2VsZigpOwogICAgIH0KK30KKworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6aXNVaWRBY3RpdmUodWlkX3QgdWlkKSB7CisgICAgaWYgKGlzU2VydmljZVVpZCh1aWQpKSByZXR1cm4gdHJ1ZTsKKyAgICBjaGVja1JlZ2lzdGVyZWQoKTsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIGF1dG8gb3ZlcnJpZGVJdGVyID0gbU92ZXJyaWRlVWlkcy5maW5kKHVpZCk7CiAgICAgICAgIGlmIChvdmVycmlkZUl0ZXIgIT0gbU92ZXJyaWRlVWlkcy5lbmQoKSkgewotICAgICAgICAgICAgcmV0dXJuIG92ZXJyaWRlSXRlci0+c2Vjb25kOworICAgICAgICAgICAgcmV0dXJuIG92ZXJyaWRlSXRlci0+c2Vjb25kLmZpcnN0OwogICAgICAgICB9CiAgICAgICAgIC8vIEluIGFuIGFic2Vuc2Ugb2YgdGhlIEFjdGl2aXR5TWFuYWdlciwgYXNzdW1lIGV2ZXJ5dGhpbmcgdG8gYmUgYWN0aXZlLgogICAgICAgICBpZiAoIW1PYnNlcnZlclJlZ2lzdGVyZWQpIHJldHVybiB0cnVlOwogICAgICAgICBhdXRvIGNhY2hlSXRlciA9IG1DYWNoZWRVaWRzLmZpbmQodWlkKTsKICAgICAgICAgaWYgKGNhY2hlSXRlciAhPSBtQ2FjaGVkVWlkcy5lbmQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGNhY2hlSXRlci0+c2Vjb25kOworICAgICAgICAgICAgcmV0dXJuIGNhY2hlSXRlci0+c2Vjb25kLmZpcnN0OwogICAgICAgICB9CiAgICAgfQogICAgIEFjdGl2aXR5TWFuYWdlciBhbTsKICAgICBib29sIGFjdGl2ZSA9IGFtLmlzVWlkQWN0aXZlKHVpZCwgU3RyaW5nMTYoImF1ZGlvc2VydmVyIikpOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgbUNhY2hlZFVpZHMuaW5zZXJ0KHN0ZDo6cGFpcjx1aWRfdCwgYm9vbD4odWlkLCBhY3RpdmUpKTsKKyAgICAgICAgbUNhY2hlZFVpZHMuaW5zZXJ0KHN0ZDo6cGFpcjx1aWRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxib29sLCBpbnQ+Pih1aWQsIHN0ZDo6cGFpcjxib29sLCBpbnQ+KGFjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOKSkpOwogICAgIH0KICAgICByZXR1cm4gYWN0aXZlOwogfQogCitpbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OmdldFVpZFN0YXRlKHVpZF90IHVpZCkgeworICAgIGlmIChpc1NlcnZpY2VVaWQodWlkKSkgeworICAgICAgICByZXR1cm4gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1RPUDsKKyAgICB9CisgICAgY2hlY2tSZWdpc3RlcmVkKCk7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBhdXRvIG92ZXJyaWRlSXRlciA9IG1PdmVycmlkZVVpZHMuZmluZCh1aWQpOworICAgICAgICBpZiAob3ZlcnJpZGVJdGVyICE9IG1PdmVycmlkZVVpZHMuZW5kKCkpIHsKKyAgICAgICAgICAgIGlmIChvdmVycmlkZUl0ZXItPnNlY29uZC5maXJzdCkgeworICAgICAgICAgICAgICAgIGlmIChvdmVycmlkZUl0ZXItPnNlY29uZC5zZWNvbmQgIT0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG92ZXJyaWRlSXRlci0+c2Vjb25kLnNlY29uZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhdXRvIGNhY2hlSXRlciA9IG1DYWNoZWRVaWRzLmZpbmQodWlkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlSXRlciAhPSBtQ2FjaGVkVWlkcy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlSXRlci0+c2Vjb25kLnNlY29uZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTjsKKyAgICAgICAgfQorICAgICAgICAvLyBJbiBhbiBhYnNlbnNlIG9mIHRoZSBBY3Rpdml0eU1hbmFnZXIsIGFzc3VtZSBldmVyeXRoaW5nIHRvIGJlIGFjdGl2ZS4KKyAgICAgICAgaWYgKCFtT2JzZXJ2ZXJSZWdpc3RlcmVkKSB7CisgICAgICAgICAgICByZXR1cm4gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1RPUDsKKyAgICAgICAgfQorICAgICAgICBhdXRvIGNhY2hlSXRlciA9IG1DYWNoZWRVaWRzLmZpbmQodWlkKTsKKyAgICAgICAgaWYgKGNhY2hlSXRlciAhPSBtQ2FjaGVkVWlkcy5lbmQoKSkgeworICAgICAgICAgICAgaWYgKGNhY2hlSXRlci0+c2Vjb25kLmZpcnN0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlSXRlci0+c2Vjb25kLnNlY29uZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFjdGl2aXR5TWFuYWdlciBhbTsKKyAgICBib29sIGFjdGl2ZSA9IGFtLmlzVWlkQWN0aXZlKHVpZCwgU3RyaW5nMTYoImF1ZGlvc2VydmVyIikpOworICAgIGludCBzdGF0ZSA9IEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOOworICAgIGlmIChhY3RpdmUpIHsKKyAgICAgICAgc3RhdGUgPSBhbS5nZXRVaWRQcm9jZXNzU3RhdGUodWlkLCBTdHJpbmcxNigiYXVkaW9zZXJ2ZXIiKSk7CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgbUNhY2hlZFVpZHMuaW5zZXJ0KHN0ZDo6cGFpcjx1aWRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxib29sLCBpbnQ+Pih1aWQsIHN0ZDo6cGFpcjxib29sLCBpbnQ+KGFjdGl2ZSwgc3RhdGUpKSk7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXRlOworfQorCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5OjpvblVpZEFjdGl2ZSh1aWRfdCB1aWQpIHsKLSAgICB1cGRhdGVVaWRDYWNoZSh1aWQsIHRydWUsIHRydWUpOworICAgIHVwZGF0ZVVpZCgmbUNhY2hlZFVpZHMsIHVpZCwgdHJ1ZSwgQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04sIHRydWUpOwogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5OjpvblVpZEdvbmUodWlkX3QgdWlkLCBfX3VudXNlZCBib29sIGRpc2FibGVkKSB7Ci0gICAgdXBkYXRlVWlkQ2FjaGUodWlkLCBmYWxzZSwgZmFsc2UpOworICAgIHVwZGF0ZVVpZCgmbUNhY2hlZFVpZHMsIHVpZCwgZmFsc2UsIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOLCBmYWxzZSk7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6Om9uVWlkSWRsZSh1aWRfdCB1aWQsIF9fdW51c2VkIGJvb2wgZGlzYWJsZWQpIHsKLSAgICB1cGRhdGVVaWRDYWNoZSh1aWQsIGZhbHNlLCB0cnVlKTsKKyAgICB1cGRhdGVVaWQoJm1DYWNoZWRVaWRzLCB1aWQsIGZhbHNlLCBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTiwgdHJ1ZSk7CiB9CiAKLWJvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OmlzU2VydmljZVVpZCh1aWRfdCB1aWQpIGNvbnN0IHsKLSAgICByZXR1cm4gbXVsdGl1c2VyX2dldF9hcHBfaWQodWlkKSA8IEFJRF9BUFBfU1RBUlQ7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6Om5vdGlmeVNlcnZpY2UodWlkX3QgdWlkLCBib29sIGFjdGl2ZSkgewotICAgIHNwPEF1ZGlvUG9saWN5U2VydmljZT4gc2VydmljZSA9IG1TZXJ2aWNlLnByb21vdGUoKTsKLSAgICBpZiAoc2VydmljZSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHNlcnZpY2UtPnNldFJlY29yZFNpbGVuY2VkKHVpZCwgIWFjdGl2ZSk7Cit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5OjpvblVpZFN0YXRlQ2hhbmdlZCh1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByb2NTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcHJvY1N0YXRlU2VxIF9fdW51c2VkKSB7CisgICAgaWYgKHByb2NTdGF0ZSAhPSBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTikgeworICAgICAgICB1cGRhdGVVaWQoJm1DYWNoZWRVaWRzLCB1aWQsIHRydWUsIHByb2NTdGF0ZSwgdHJ1ZSk7CiAgICAgfQogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojp1cGRhdGVPdmVycmlkZVVpZCh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlLCBib29sIGluc2VydCkgewotICAgIGlmIChpc1NlcnZpY2VVaWQodWlkKSkgcmV0dXJuOwotICAgIGJvb2wgd2FzT3ZlcnJpZGRlbiA9IGZhbHNlLCB3YXNBY3RpdmUgPSBmYWxzZTsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIHVwZGF0ZVVpZExvY2tlZCgmbU92ZXJyaWRlVWlkcywgdWlkLCBhY3RpdmUsIGluc2VydCwgJndhc092ZXJyaWRkZW4sICZ3YXNBY3RpdmUpOwotICAgIH0KLSAgICBpZiAoIXdhc092ZXJyaWRkZW4gJiYgaW5zZXJ0KSB7Ci0gICAgICAgIG5vdGlmeVNlcnZpY2UodWlkLCBhY3RpdmUpOyAgLy8gU3RhcnRlZCB0byBvdmVycmlkZS4KLSAgICB9IGVsc2UgaWYgKHdhc092ZXJyaWRkZW4gJiYgIWluc2VydCkgewotICAgICAgICBub3RpZnlTZXJ2aWNlKHVpZCwgaXNVaWRBY3RpdmUodWlkKSk7ICAvLyBPdmVycmlkZSBjZWFzZWQsIG5vdGlmeSB3aXRoIGdyb3VuZCB0cnV0aC4KLSAgICB9IGVsc2UgaWYgKHdhc0FjdGl2ZSAhPSBhY3RpdmUpIHsKLSAgICAgICAgbm90aWZ5U2VydmljZSh1aWQsIGFjdGl2ZSk7ICAvLyBPdmVycmlkZSB1cGRhdGVkLgorICAgIHVwZGF0ZVVpZCgmbU92ZXJyaWRlVWlkcywgdWlkLCBhY3RpdmUsIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOLCBpbnNlcnQpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojpub3RpZnlTZXJ2aWNlKCkgeworICAgIHNwPEF1ZGlvUG9saWN5U2VydmljZT4gc2VydmljZSA9IG1TZXJ2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoc2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIHNlcnZpY2UtPnVwZGF0ZVVpZFN0YXRlcygpOwogICAgIH0KIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6dXBkYXRlVWlkQ2FjaGUodWlkX3QgdWlkLCBib29sIGFjdGl2ZSwgYm9vbCBpbnNlcnQpIHsKLSAgICBpZiAoaXNTZXJ2aWNlVWlkKHVpZCkpIHJldHVybjsKLSAgICBib29sIHdhc0FjdGl2ZSA9IGZhbHNlOwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6dXBkYXRlVWlkKHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8Ym9vbCwgaW50Pj4gKnVpZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluc2VydCkgeworICAgIGlmIChpc1NlcnZpY2VVaWQodWlkKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGJvb2wgd2FzQWN0aXZlID0gaXNVaWRBY3RpdmUodWlkKTsKKyAgICBpbnQgcHJldmlvdXNTdGF0ZSA9IGdldFVpZFN0YXRlKHVpZCk7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICB1cGRhdGVVaWRMb2NrZWQoJm1DYWNoZWRVaWRzLCB1aWQsIGFjdGl2ZSwgaW5zZXJ0LCBudWxscHRyLCAmd2FzQWN0aXZlKTsKLSAgICAgICAgLy8gRG8gbm90IG5vdGlmeSBzZXJ2aWNlIGlmIGN1cnJlbnRseSBvdmVycmlkZGVuLgotICAgICAgICBpZiAobU92ZXJyaWRlVWlkcy5maW5kKHVpZCkgIT0gbU92ZXJyaWRlVWlkcy5lbmQoKSkgcmV0dXJuOworICAgICAgICB1cGRhdGVVaWRMb2NrZWQodWlkcywgdWlkLCBhY3RpdmUsIHN0YXRlLCBpbnNlcnQpOwogICAgIH0KLSAgICBib29sIG5vd0FjdGl2ZSA9IGFjdGl2ZSAmJiBpbnNlcnQ7Ci0gICAgaWYgKHdhc0FjdGl2ZSAhPSBub3dBY3RpdmUpIG5vdGlmeVNlcnZpY2UodWlkLCBub3dBY3RpdmUpOworICAgIGlmICh3YXNBY3RpdmUgIT0gaXNVaWRBY3RpdmUodWlkKSB8fCBzdGF0ZSAhPSBwcmV2aW91c1N0YXRlKSB7CisgICAgICAgIG5vdGlmeVNlcnZpY2UoKTsKKyAgICB9CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OnVwZGF0ZVVpZExvY2tlZChzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIGJvb2w+ICp1aWRzLAotICAgICAgICB1aWRfdCB1aWQsIGJvb2wgYWN0aXZlLCBib29sIGluc2VydCwgYm9vbCAqd2FzVGhlcmUsIGJvb2wgKndhc0FjdGl2ZSkgewordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6dXBkYXRlVWlkTG9ja2VkKHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8Ym9vbCwgaW50Pj4gKnVpZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluc2VydCkgewogICAgIGF1dG8gaXQgPSB1aWRzLT5maW5kKHVpZCk7CiAgICAgaWYgKGl0ICE9IHVpZHMtPmVuZCgpKSB7Ci0gICAgICAgIGlmICh3YXNUaGVyZSAhPSBudWxscHRyKSAqd2FzVGhlcmUgPSB0cnVlOwotICAgICAgICBpZiAod2FzQWN0aXZlICE9IG51bGxwdHIpICp3YXNBY3RpdmUgPSBpdC0+c2Vjb25kOwogICAgICAgICBpZiAoaW5zZXJ0KSB7Ci0gICAgICAgICAgICBpdC0+c2Vjb25kID0gYWN0aXZlOworICAgICAgICAgICAgaWYgKHN0YXRlID09IEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOKSB7CisgICAgICAgICAgICAgICAgaXQtPnNlY29uZC5maXJzdCA9IGFjdGl2ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpdC0+c2Vjb25kLmZpcnN0KSB7CisgICAgICAgICAgICAgICAgaXQtPnNlY29uZC5zZWNvbmQgPSBzdGF0ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaXQtPnNlY29uZC5zZWNvbmQgPSBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHVpZHMtPmVyYXNlKGl0KTsKICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoaW5zZXJ0KSB7Ci0gICAgICAgIHVpZHMtPmluc2VydChzdGQ6OnBhaXI8dWlkX3QsIGJvb2w+KHVpZCwgYWN0aXZlKSk7CisgICAgfSBlbHNlIGlmIChpbnNlcnQgJiYgKHN0YXRlID09IEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOKSkgeworICAgICAgICB1aWRzLT5pbnNlcnQoc3RkOjpwYWlyPHVpZF90LCBzdGQ6OnBhaXI8Ym9vbCwgaW50Pj4odWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8Ym9vbCwgaW50PihhY3RpdmUsIHN0YXRlKSkpOwogICAgIH0KIH0KIAorYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6aXNBMTF5T25Ub3AoKSB7CisgICAgZm9yIChjb25zdCBhdXRvICZ1aWQgOiBtQ2FjaGVkVWlkcykgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aWRfdD46Oml0ZXJhdG9yIGl0ID0gZmluZChtQTExeVVpZHMuYmVnaW4oKSwgbUExMXlVaWRzLmVuZCgpLCB1aWQuZmlyc3QpOworICAgICAgICBpZiAoaXQgPT0gbUExMXlVaWRzLmVuZCgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodWlkLnNlY29uZC5zZWNvbmQgPT0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1RPUCB8fAorICAgICAgICAgICAgdWlkLnNlY29uZC5zZWNvbmQgPT0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX0ZPUkVHUk9VTkRfU0VSVklDRSB8fAorICAgICAgICAgICAgdWlkLnNlY29uZC5zZWNvbmQgPT0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX0JPVU5EX0ZPUkVHUk9VTkRfU0VSVklDRSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojppc0ExMXlVaWQodWlkX3QgdWlkKQoreworICAgIHN0ZDo6dmVjdG9yPHVpZF90Pjo6aXRlcmF0b3IgaXQgPSBmaW5kKG1BMTF5VWlkcy5iZWdpbigpLCBtQTExeVVpZHMuZW5kKCksIHVpZCk7CisgICAgcmV0dXJuIGl0ICE9IG1BMTF5VWlkcy5lbmQoKTsKK30KKworLy8gLS0tLS0tLS0tLS0gIEF1ZGlvUG9saWN5U2VydmljZTo6U2Vuc29yUHJpdmFjeVNlcnZpY2UgaW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLQordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlNlbnNvclByaXZhY3lQb2xpY3k6OnJlZ2lzdGVyU2VsZigpIHsKKyAgICBTZW5zb3JQcml2YWN5TWFuYWdlciBzcG07CisgICAgbVNlbnNvclByaXZhY3lFbmFibGVkID0gc3BtLmlzU2Vuc29yUHJpdmFjeUVuYWJsZWQoKTsKKyAgICBzcG0uYWRkU2Vuc29yUHJpdmFjeUxpc3RlbmVyKHRoaXMpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6dW5yZWdpc3RlclNlbGYoKSB7CisgICAgU2Vuc29yUHJpdmFjeU1hbmFnZXIgc3BtOworICAgIHNwbS5yZW1vdmVTZW5zb3JQcml2YWN5TGlzdGVuZXIodGhpcyk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5Ojppc1NlbnNvclByaXZhY3lFbmFibGVkKCkgeworICAgIHJldHVybiBtU2Vuc29yUHJpdmFjeUVuYWJsZWQ7Cit9CisKK2JpbmRlcjo6U3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6b25TZW5zb3JQcml2YWN5Q2hhbmdlZChib29sIGVuYWJsZWQpIHsKKyAgICBtU2Vuc29yUHJpdmFjeUVuYWJsZWQgPSBlbmFibGVkOworICAgIHNwPEF1ZGlvUG9saWN5U2VydmljZT4gc2VydmljZSA9IG1TZXJ2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoc2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIHNlcnZpY2UtPnVwZGF0ZVVpZFN0YXRlcygpOworICAgIH0KKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKIC8vIC0tLS0tLS0tLS0tICBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZCBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tCiAKIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpBdWRpb0NvbW1hbmRUaHJlYWQoU3RyaW5nOCBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3cDxBdWRpb1BvbGljeVNlcnZpY2U+JiBzZXJ2aWNlKQogICAgIDogVGhyZWFkKGZhbHNlKSwgbU5hbWUobmFtZSksIG1TZXJ2aWNlKHNlcnZpY2UpCiB7Ci0gICAgbXBUb25lR2VuZXJhdG9yID0gTlVMTDsKIH0KIAogCkBAIC02NDksNyArOTM1LDYgQEAKICAgICAgICAgcmVsZWFzZV93YWtlX2xvY2sobU5hbWUuc3RyaW5nKCkpOwogICAgIH0KICAgICBtQXVkaW9Db21tYW5kcy5jbGVhcigpOwotICAgIGRlbGV0ZSBtcFRvbmVHZW5lcmF0b3I7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6Om9uRmlyc3RSZWYoKQpAQCAtNjc0LDY4ICs5NTksNTQgQEAKICAgICAgICAgICAgICAgICBtTGFzdENvbW1hbmQgPSBjb21tYW5kOwogCiAgICAgICAgICAgICAgICAgc3dpdGNoIChjb21tYW5kLT5tQ29tbWFuZCkgewotICAgICAgICAgICAgICAgIGNhc2UgU1RBUlRfVE9ORTogewotICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgVG9uZURhdGEgKmRhdGEgPSAoVG9uZURhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHN0YXJ0IHRvbmUgJWQgb24gc3RyZWFtICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tVHlwZSwgZGF0YS0+bVN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtcFRvbmVHZW5lcmF0b3I7Ci0gICAgICAgICAgICAgICAgICAgIG1wVG9uZUdlbmVyYXRvciA9IG5ldyBUb25lR2VuZXJhdG9yKGRhdGEtPm1TdHJlYW0sIDEuMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1wVG9uZUdlbmVyYXRvci0+c3RhcnRUb25lKGRhdGEtPm1UeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICAgICAgICAgICAgICB9YnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVE9QX1RPTkU6IHsKLSAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHN0b3AgdG9uZSIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobXBUb25lR2VuZXJhdG9yICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1wVG9uZUdlbmVyYXRvci0+c3RvcFRvbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtcFRvbmVHZW5lcmF0b3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtcFRvbmVHZW5lcmF0b3IgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU0VUX1ZPTFVNRTogewogICAgICAgICAgICAgICAgICAgICBWb2x1bWVEYXRhICpkYXRhID0gKFZvbHVtZURhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHNldCB2b2x1bWUgc3RyZWFtICVkLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lICVmLCBvdXRwdXQgJWQiLCBkYXRhLT5tU3RyZWFtLCBkYXRhLT5tVm9sdW1lLCBkYXRhLT5tSU8pOworICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzZXRTdHJlYW1Wb2x1bWUoZGF0YS0+bVN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVZvbHVtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUlPKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBTRVRfUEFSQU1FVEVSUzogewogICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzRGF0YSAqZGF0YSA9IChQYXJhbWV0ZXJzRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc2V0IHBhcmFtZXRlcnMgc3RyaW5nICVzLCBpbyAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUtleVZhbHVlUGFpcnMuc3RyaW5nKCksIGRhdGEtPm1JTyk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gQXVkaW9TeXN0ZW06OnNldFBhcmFtZXRlcnMoZGF0YS0+bUlPLCBkYXRhLT5tS2V5VmFsdWVQYWlycyk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU0VUX1ZPSUNFX1ZPTFVNRTogewogICAgICAgICAgICAgICAgICAgICBWb2ljZVZvbHVtZURhdGEgKmRhdGEgPSAoVm9pY2VWb2x1bWVEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOwogICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzZXQgdm9pY2Ugdm9sdW1lIHZvbHVtZSAlZiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVZvbHVtZSk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gQXVkaW9TeXN0ZW06OnNldFZvaWNlVm9sdW1lKGRhdGEtPm1Wb2x1bWUpOworICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFNUT1BfT1VUUFVUOiB7CiAgICAgICAgICAgICAgICAgICAgIFN0b3BPdXRwdXREYXRhICpkYXRhID0gKFN0b3BPdXRwdXREYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzdG9wIG91dHB1dCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUlPKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc3RvcCBvdXRwdXQgcG9ydElkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tUG9ydElkKTsKICAgICAgICAgICAgICAgICAgICAgc3ZjID0gbVNlcnZpY2UucHJvbW90ZSgpOwogICAgICAgICAgICAgICAgICAgICBpZiAoc3ZjID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgICAgICAgICBzdmMtPmRvU3RvcE91dHB1dChkYXRhLT5tSU8sIGRhdGEtPm1TdHJlYW0sIGRhdGEtPm1TZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb1N0b3BPdXRwdXQoZGF0YS0+bVBvcnRJZCk7CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgUkVMRUFTRV9PVVRQVVQ6IHsKICAgICAgICAgICAgICAgICAgICAgUmVsZWFzZU91dHB1dERhdGEgKmRhdGEgPSAoUmVsZWFzZU91dHB1dERhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHJlbGVhc2Ugb3V0cHV0ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tSU8pOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyByZWxlYXNlIG91dHB1dCBwb3J0SWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1Qb3J0SWQpOwogICAgICAgICAgICAgICAgICAgICBzdmMgPSBtU2VydmljZS5wcm9tb3RlKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzdmMgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9SZWxlYXNlT3V0cHV0KGRhdGEtPm1JTywgZGF0YS0+bVN0cmVhbSwgZGF0YS0+bVNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICBzdmMtPmRvUmVsZWFzZU91dHB1dChkYXRhLT5tUG9ydElkKTsKICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBDUkVBVEVfQVVESU9fUEFUQ0g6IHsKQEAgLTc0NSw3ICsxMDE2LDkgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGFmID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IGFmLT5jcmVhdGVBdWRpb1BhdGNoKCZkYXRhLT5tUGF0Y2gsICZkYXRhLT5tSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgUkVMRUFTRV9BVURJT19QQVRDSDogewpAQCAtNzU1LDcgKzEwMjgsOSBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoYWYgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gYWYtPnJlbGVhc2VBdWRpb1BhdGNoKGRhdGEtPm1IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfQVVESU9QT1JUX0xJU1Q6IHsKQEAgLTc4NSw3ICsxMDYwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGFmID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IGFmLT5zZXRBdWRpb1BvcnRDb25maWcoJmRhdGEtPm1Db25maWcpOworICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBEWU5fUE9MSUNZX01JWF9TVEFURV9VUERBVEU6IHsKQEAgLTgxMSw4ICsxMDg4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb09uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShkYXRhLT5tRXZlbnQsICZkYXRhLT5tQ2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YS0+bUNsaWVudENvbmZpZywgJmRhdGEtPm1EZXZpY2VDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YS0+bUNsaWVudENvbmZpZywgZGF0YS0+bUNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEtPm1EZXZpY2VDb25maWcsIGRhdGEtPm1FZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1QYXRjaEhhbmRsZSwgZGF0YS0+bVNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtOTAwLDI3ICsxMTc4LDYgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnN0YXJ0VG9uZUNvbW1hbmQoVG9uZUdlbmVyYXRvcjo6dG9uZV90eXBlIHR5cGUsCi0gICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotewotICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKLSAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFNUQVJUX1RPTkU7Ci0gICAgc3A8VG9uZURhdGE+IGRhdGEgPSBuZXcgVG9uZURhdGEoKTsKLSAgICBkYXRhLT5tVHlwZSA9IHR5cGU7Ci0gICAgZGF0YS0+bVN0cmVhbSA9IHN0cmVhbTsKLSAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOwotICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgdG9uZSBzdGFydCB0eXBlICVkLCBzdHJlYW0gJWQiLCB0eXBlLCBzdHJlYW0pOwotICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOwotfQotCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpzdG9wVG9uZUNvbW1hbmQoKQotewotICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKLSAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFNUT1BfVE9ORTsKLSAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHRvbmUgc3RvcCIpOwotICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOwotfQotCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6dm9sdW1lQ29tbWFuZChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKQEAgLTk2NywzMyArMTIyNCwyNSBAQAogICAgIHJldHVybiBzZW5kQ29tbWFuZChjb21tYW5kLCBkZWxheU1zKTsKIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6c3RvcE91dHB1dENvbW1hbmQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnN0b3BPdXRwdXRDb21tYW5kKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKICAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFNUT1BfT1VUUFVUOwogICAgIHNwPFN0b3BPdXRwdXREYXRhPiBkYXRhID0gbmV3IFN0b3BPdXRwdXREYXRhKCk7Ci0gICAgZGF0YS0+bUlPID0gb3V0cHV0OwotICAgIGRhdGEtPm1TdHJlYW0gPSBzdHJlYW07Ci0gICAgZGF0YS0+bVNlc3Npb24gPSBzZXNzaW9uOworICAgIGRhdGEtPm1Qb3J0SWQgPSBwb3J0SWQ7CiAgICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKLSAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHN0b3Agb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHN0b3Agb3V0cHV0IHBvcnRJZCAlZCIsIHBvcnRJZCk7CiAgICAgc2VuZENvbW1hbmQoY29tbWFuZCk7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnJlbGVhc2VPdXRwdXRDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpyZWxlYXNlT3V0cHV0Q29tbWFuZChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CiAgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBSRUxFQVNFX09VVFBVVDsKICAgICBzcDxSZWxlYXNlT3V0cHV0RGF0YT4gZGF0YSA9IG5ldyBSZWxlYXNlT3V0cHV0RGF0YSgpOwotICAgIGRhdGEtPm1JTyA9IG91dHB1dDsKLSAgICBkYXRhLT5tU3RyZWFtID0gc3RyZWFtOwotICAgIGRhdGEtPm1TZXNzaW9uID0gc2Vzc2lvbjsKKyAgICBkYXRhLT5tUG9ydElkID0gcG9ydElkOwogICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7Ci0gICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyByZWxlYXNlIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyByZWxlYXNlIG91dHB1dCBwb3J0SWQgJWQiLCBwb3J0SWQpOwogICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOwogfQogCkBAIC0xMDc2LDkgKzEzMjUsMTQgQEAKIH0KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6cmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZUNvbW1hbmQoCi0gICAgICAgIGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKIHsKICAgICBzcDxBdWRpb0NvbW1hbmQ+Y29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKICAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFJFQ09SRElOR19DT05GSUdVUkFUSU9OX1VQREFURTsKQEAgLTEwODYsOCArMTM0MCwxMSBAQAogICAgIGRhdGEtPm1FdmVudCA9IGV2ZW50OwogICAgIGRhdGEtPm1DbGllbnRJbmZvID0gKmNsaWVudEluZm87CiAgICAgZGF0YS0+bUNsaWVudENvbmZpZyA9ICpjbGllbnRDb25maWc7CisgICAgZGF0YS0+bUNsaWVudEVmZmVjdHMgPSBjbGllbnRFZmZlY3RzOwogICAgIGRhdGEtPm1EZXZpY2VDb25maWcgPSAqZGV2aWNlQ29uZmlnOworICAgIGRhdGEtPm1FZmZlY3RzID0gZWZmZWN0czsKICAgICBkYXRhLT5tUGF0Y2hIYW5kbGUgPSBwYXRjaEhhbmRsZTsKKyAgICBkYXRhLT5tU291cmNlID0gc291cmNlOwogICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7CiAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyByZWNvcmRpbmcgY29uZmlndXJhdGlvbiB1cGRhdGUgZXZlbnQgJWQsIHNvdXJjZSAlZCB1aWQgJXUiLAogICAgICAgICAgICAgZXZlbnQsIGNsaWVudEluZm8tPnNvdXJjZSwgY2xpZW50SW5mby0+dWlkKTsKQEAgLTEyMTIsNiArMTQ2OSw3IEBACiAgICAgICAgICAgICAgICAgcGF0Y2ggPSAoKENyZWF0ZUF1ZGlvUGF0Y2hEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpKS0+bVBhdGNoOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBoYW5kbGUgPSAoKFJlbGVhc2VBdWRpb1BhdGNoRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKSktPm1IYW5kbGU7CisgICAgICAgICAgICAgICAgbWVtc2V0KCZwYXRjaCwgMCwgc2l6ZW9mKHBhdGNoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUyOwogICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoMjsKQEAgLTEyNTYsOCArMTUxNCw2IEBACiAKICAgICAgICAgfSBicmVhazsKIAotICAgICAgICBjYXNlIFNUQVJUX1RPTkU6Ci0gICAgICAgIGNhc2UgU1RPUF9UT05FOgogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTEzMzAsMjcgKzE1ODYsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LCBkZWxheU1zKTsKIH0KIAotaW50IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRUb25lKGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLXsKLSAgICBpZiAodG9uZSAhPSBBVURJT19QT0xJQ1lfVE9ORV9JTl9DQUxMX05PVElGSUNBVElPTikgewotICAgICAgICBBTE9HRSgic3RhcnRUb25lOiBpbGxlZ2FsIHRvbmUgcmVxdWVzdGVkICglZCkiLCB0b25lKTsKLSAgICB9Ci0gICAgaWYgKHN0cmVhbSAhPSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkgewotICAgICAgICBBTE9HRSgic3RhcnRUb25lOiBpbGxlZ2FsIHN0cmVhbSAoJWQpIHJlcXVlc3RlZCBmb3IgdG9uZSAlZCIsIHN0cmVhbSwKLSAgICAgICAgICAgIHRvbmUpOwotICAgIH0KLSAgICBtVG9uZVBsYXliYWNrVGhyZWFkLT5zdGFydFRvbmVDb21tYW5kKFRvbmVHZW5lcmF0b3I6OlRPTkVfU1VQX0NBTExfV0FJVElORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcFRvbmUoKQotewotICAgIG1Ub25lUGxheWJhY2tUaHJlYWQtPnN0b3BUb25lQ29tbWFuZCgpOwotICAgIHJldHVybiAwOwotfQotCiBpbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zKQogewogICAgIHJldHVybiAoaW50KW1BdWRpb0NvbW1hbmRUaHJlYWQtPnZvaWNlVm9sdW1lQ29tbWFuZCh2b2x1bWUsIGRlbGF5TXMpOwpAQCAtMTQwNiw5ICsxNjQxLDYgQEAKIGludCBhcHNfc2V0X3N0cmVhbV92b2x1bWUodm9pZCAqc2VydmljZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5X21zKTsKLWludCBhcHNfc3RhcnRfdG9uZSh2b2lkICpzZXJ2aWNlLCBhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci1pbnQgYXBzX3N0b3BfdG9uZSh2b2lkICpzZXJ2aWNlKTsKIGludCBhcHNfc2V0X3ZvaWNlX3ZvbHVtZSh2b2lkICpzZXJ2aWNlLCBmbG9hdCB2b2x1bWUsIGludCBkZWxheV9tcyk7CiB9OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaAppbmRleCA0MDdkN2E1Li45NTllNzU3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKQEAgLTMzLDEzICszMywxMiBAQAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lFZmZlY3RzLmgiCiAjaW5jbHVkZSAibWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmgiCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9CblNlbnNvclByaXZhY3lMaXN0ZW5lci5oPgogCiAjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIGNsYXNzIEF1ZGlvUG9saWN5U2VydmljZSA6CkBAIC04MywxNSArODIsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLApAQCAtMTAyLDggKzk1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqc2lsZW5jZWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKQEAgLTEzNCw2ICsxMjYsMjEgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcoYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU3RyZWFtRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdXNhZ2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCk7CisKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBvblRyYW5zYWN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCkBAIC0xNTksMTAgKzE2NiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BUb25lKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zID0gMCk7CiAgICAgdmlydHVhbCBib29sIGlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAmY29uZmlnKTsKKyAgICB2aXJ0dWFsIGJvb2wgaXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCYgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKQEAgLTE5MiwxMCArMTk5LDE0IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyUG9saWN5TWl4ZXMoY29uc3QgVmVjdG9yPEF1ZGlvTWl4PiYgbWl4ZXMsIGJvb2wgcmVnaXN0cmF0aW9uKTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkKTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTW9ubyhib29sIG1vbm8pOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTW9ubyhib29sICptb25vKTsKQEAgLTIwOSwxMiArMjIwLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXBvcnRlZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQsIGJvb2wgZW5hYmxlZCk7CiAKLSAgICAgICAgICAgIHN0YXR1c190IGRvU3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgICAgICAgICAgdm9pZCBkb1JlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBc3Npc3RhbnRVaWQodWlkX3QgdWlkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEExMXlTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiB1aWRzKTsKKworICAgIHZpcnR1YWwgYm9vbCAgICAgaXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpOworCisgICAgICAgICAgICBzdGF0dXNfdCBkb1N0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgICAgICAgICAgdm9pZCBkb1JlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCiAgICAgICAgICAgICBzdGF0dXNfdCBjbGllbnRDcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCkBAIC0yMjQsNyArMjM2LDcgQEAKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xpZW50U2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOwogCi0gICAgICAgICAgICB2b2lkIHJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudCh1aWRfdCB1aWQpOworICAgICAgICAgICAgdm9pZCByZW1vdmVOb3RpZmljYXRpb25DbGllbnQodWlkX3QgdWlkLCBwaWRfdCBwaWQpOwogICAgICAgICAgICAgdm9pZCBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKICAgICAgICAgICAgIHZvaWQgZG9PbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKICAgICAgICAgICAgIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwpAQCAtMjMyLDEyICsyNDQsMjIgQEAKIAogICAgICAgICAgICAgdm9pZCBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShjb25zdCBTdHJpbmc4JiByZWdJZCwgaW50MzJfdCBzdGF0ZSk7CiAgICAgICAgICAgICB2b2lkIGRvT25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoY29uc3QgU3RyaW5nOCYgcmVnSWQsIGludDMyX3Qgc3RhdGUpOwotICAgICAgICAgICAgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKLSAgICAgICAgICAgIHZvaWQgZG9PblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CisgICAgICAgICAgICB2b2lkIGRvT25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKTsKIAogcHJpdmF0ZToKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5U2VydmljZSgpIEFORFJPSURfQVBJOwpAQCAtMjQ5LDcgKzI3MSw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzaGVsbENvbW1hbmQoaW50IGluLCBpbnQgb3V0LCBpbnQgZXJyLCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAogICAgIC8vIFNldHMgd2hldGhlciB0aGUgZ2l2ZW4gVUlEIHJlY29yZHMgb25seSBzaWxlbmNlCi0gICAgdmlydHVhbCB2b2lkIHNldFJlY29yZFNpbGVuY2VkKHVpZF90IHVpZCwgYm9vbCBzaWxlbmNlZCk7CisgICAgdmlydHVhbCB2b2lkIHNldEFwcFN0YXRlX2wodWlkX3QgdWlkLCBhcHBfc3RhdGVfdCBzdGF0ZSk7CiAKICAgICAvLyBPdmVycmlkZXMgdGhlIFVJRCBzdGF0ZSBhcyBpZiBpdCBpcyBpZGxlCiAgICAgc3RhdHVzX3QgaGFuZGxlU2V0VWlkU3RhdGUoVmVjdG9yPFN0cmluZzE2PiYgYXJncywgaW50IGVycik7CkBAIC0yNjUsNiArMjg3LDE3IEBACiAKICAgICBzdGQ6OnN0cmluZyBnZXREZXZpY2VUeXBlU3RyRm9yUG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAorICAgIHN0YXR1c190IGdldEF1ZGlvUG9saWN5RWZmZWN0cyhzcDxBdWRpb1BvbGljeUVmZmVjdHM+JiBhdWRpb1BvbGljeUVmZmVjdHMpOworCisgICAgYXBwX3N0YXRlX3QgYXBtU3RhdEZyb21BbVN0YXRlKGludCBhbVN0YXRlKTsKKworICAgIHZvaWQgdXBkYXRlVWlkU3RhdGVzKCk7CisgICAgdm9pZCB1cGRhdGVVaWRTdGF0ZXNfbCgpOworCisgICAgdm9pZCBzaWxlbmNlQWxsUmVjb3JkaW5nc19sKCk7CisKKyAgICBzdGF0aWMgYm9vbCBpc1ByaXZhY3lTZW5zaXRpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKTsKKwogICAgIC8vIElmIHJlY29yZGluZyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgVUlEIGlzIGFsbG93ZWQgdG8gZG8gdGhhdC4gSWYgdGhlIFVJRCBpcyBpZGxlCiAgICAgLy8gdGhlbiBpdCBjYW5ub3QgcmVjb3JkIGFuZCBnZXRzIGJ1ZmZlcnMgd2l0aCB6ZXJvcyAtIHNpbGVuY2UuIEFzIHNvb24gYXMgdGhlIFVJRAogICAgIC8vIHRyYW5zaXRpb25zIHRvIGFuIGFjdGl2ZSBzdGF0ZSB3ZSB3aWxsIHN0YXJ0IHJlcG9ydGluZyBidWZmZXJzIHdpdGggZGF0YS4gVGhpcyBhcHByb2FjaApAQCAtMjc0LDcgKzMwNyw3IEBACiAgICAgY2xhc3MgVWlkUG9saWN5IDogcHVibGljIEJuVWlkT2JzZXJ2ZXIsIHB1YmxpYyB2aXJ0dWFsIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKICAgICBwdWJsaWM6CiAgICAgICAgIGV4cGxpY2l0IFVpZFBvbGljeSh3cDxBdWRpb1BvbGljeVNlcnZpY2U+IHNlcnZpY2UpCi0gICAgICAgICAgICAgICAgOiBtU2VydmljZShzZXJ2aWNlKSwgbU9ic2VydmVyUmVnaXN0ZXJlZChmYWxzZSkge30KKyAgICAgICAgICAgICAgICA6IG1TZXJ2aWNlKHNlcnZpY2UpLCBtT2JzZXJ2ZXJSZWdpc3RlcmVkKGZhbHNlKSwgbUFzc2lzdGFudFVpZCgwKSB7fQogCiAgICAgICAgIHZvaWQgcmVnaXN0ZXJTZWxmKCk7CiAgICAgICAgIHZvaWQgdW5yZWdpc3RlclNlbGYoKTsKQEAgLTI4MywzNCArMzE2LDYzIEBACiAgICAgICAgIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmd2hvKSBvdmVycmlkZTsKIAogICAgICAgICBib29sIGlzVWlkQWN0aXZlKHVpZF90IHVpZCk7CisgICAgICAgIGludCBnZXRVaWRTdGF0ZSh1aWRfdCB1aWQpOworICAgICAgICB2b2lkIHNldEFzc2lzdGFudFVpZCh1aWRfdCB1aWQpIHsgbUFzc2lzdGFudFVpZCA9IHVpZDsgfQorICAgICAgICBib29sIGlzQXNzaXN0YW50VWlkKHVpZF90IHVpZCkgeyByZXR1cm4gdWlkID09IG1Bc3Npc3RhbnRVaWQ7IH0KKyAgICAgICAgdm9pZCBzZXRBMTF5VWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIHVpZHMpIHsgbUExMXlVaWRzLmNsZWFyKCk7IG1BMTF5VWlkcyA9IHVpZHM7IH0KKyAgICAgICAgYm9vbCBpc0ExMXlVaWQodWlkX3QgdWlkKTsKKyAgICAgICAgYm9vbCBpc0ExMXlPblRvcCgpOwogCiAgICAgICAgIC8vIEJuVWlkT2JzZXJ2ZXIgaW1wbGVtZW50YXRpb24KICAgICAgICAgdm9pZCBvblVpZEFjdGl2ZSh1aWRfdCB1aWQpIG92ZXJyaWRlOwogICAgICAgICB2b2lkIG9uVWlkR29uZSh1aWRfdCB1aWQsIGJvb2wgZGlzYWJsZWQpIG92ZXJyaWRlOwogICAgICAgICB2b2lkIG9uVWlkSWRsZSh1aWRfdCB1aWQsIGJvb2wgZGlzYWJsZWQpIG92ZXJyaWRlOworICAgICAgICB2b2lkIG9uVWlkU3RhdGVDaGFuZ2VkKHVpZF90IHVpZCwgaW50MzJfdCBwcm9jU3RhdGUsIGludDY0X3QgcHJvY1N0YXRlU2VxKTsKIAogICAgICAgICB2b2lkIGFkZE92ZXJyaWRlVWlkKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUpIHsgdXBkYXRlT3ZlcnJpZGVVaWQodWlkLCBhY3RpdmUsIHRydWUpOyB9CiAgICAgICAgIHZvaWQgcmVtb3ZlT3ZlcnJpZGVVaWQodWlkX3QgdWlkKSB7IHVwZGF0ZU92ZXJyaWRlVWlkKHVpZCwgZmFsc2UsIGZhbHNlKTsgfQogCi0gICAgcHJpdmF0ZToKLSAgICAgICAgYm9vbCBpc1NlcnZpY2VVaWQodWlkX3QgdWlkKSBjb25zdDsKLSAgICAgICAgdm9pZCBub3RpZnlTZXJ2aWNlKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUpOworICAgICAgICB2b2lkIHVwZGF0ZVVpZChzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIHN0ZDo6cGFpcjxib29sLCBpbnQ+PiAqdWlkcywKKyAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLCBib29sIGFjdGl2ZSwgaW50IHN0YXRlLCBib29sIGluc2VydCk7CisKKyAgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBub3RpZnlTZXJ2aWNlKCk7CiAgICAgICAgIHZvaWQgdXBkYXRlT3ZlcnJpZGVVaWQodWlkX3QgdWlkLCBib29sIGFjdGl2ZSwgYm9vbCBpbnNlcnQpOwotICAgICAgICB2b2lkIHVwZGF0ZVVpZENhY2hlKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUsIGJvb2wgaW5zZXJ0KTsKLSAgICAgICAgdm9pZCB1cGRhdGVVaWRMb2NrZWQoc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBib29sPiAqdWlkcywKLSAgICAgICAgICAgICAgICB1aWRfdCB1aWQsIGJvb2wgYWN0aXZlLCBib29sIGluc2VydCwgYm9vbCAqd2FzVGhlcmUsIGJvb2wgKndhc0FjdGl2ZSk7CisgICAgICAgIHZvaWQgdXBkYXRlVWlkTG9ja2VkKHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgc3RkOjpwYWlyPGJvb2wsIGludD4+ICp1aWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsIGJvb2wgYWN0aXZlLCBpbnQgc3RhdGUsIGJvb2wgaW5zZXJ0KTsKKyAgICAgICAgdm9pZCBjaGVja1JlZ2lzdGVyZWQoKTsKIAogICAgICAgICB3cDxBdWRpb1BvbGljeVNlcnZpY2U+IG1TZXJ2aWNlOwogICAgICAgICBNdXRleCBtTG9jazsKICAgICAgICAgYm9vbCBtT2JzZXJ2ZXJSZWdpc3RlcmVkOwotICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIGJvb2w+IG1PdmVycmlkZVVpZHM7Ci0gICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgYm9vbD4gbUNhY2hlZFVpZHM7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgc3RkOjpwYWlyPGJvb2wsIGludD4+IG1PdmVycmlkZVVpZHM7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgc3RkOjpwYWlyPGJvb2wsIGludD4+IG1DYWNoZWRVaWRzOworICAgICAgICB1aWRfdCBtQXNzaXN0YW50VWlkOworICAgICAgICBzdGQ6OnZlY3Rvcjx1aWRfdD4gbUExMXlVaWRzOwogICAgIH07CiAKLSAgICAvLyBUaHJlYWQgdXNlZCBmb3IgdG9uZSBwbGF5YmFjayBhbmQgdG8gc2VuZCBhdWRpbyBjb25maWcgY29tbWFuZHMgdG8gYXVkaW8gZmxpbmdlcgotICAgIC8vIEZvciB0b25lIHBsYXliYWNrLCB1c2luZyBhIHNlcGFyYXRlIHRocmVhZCBpcyBuZWNlc3NhcnkgdG8gYXZvaWQgZGVhZGxvY2sgd2l0aCBtTG9jayBiZWNhdXNlCi0gICAgLy8gc3RhcnRUb25lKCkgYW5kIHN0b3BUb25lKCkgYXJlIG5vcm1hbGx5IGNhbGxlZCB3aXRoIG1Mb2NrIGxvY2tlZCBhbmQgcmVxdWVzdGluZyBhIHRvbmUgc3RhcnQKLSAgICAvLyBvciBzdG9wIHdpbGwgY2F1c2UgY2FsbHMgdG8gQXVkaW9Qb2xpY3lTZXJ2aWNlIGFuZCBhbiBhdHRlbXB0IHRvIGxvY2sgbUxvY2suCisgICAgLy8gSWYgc2Vuc29yIHByaXZhY3kgaXMgZW5hYmxlZCB0aGVuIGFsbCBhcHBzLCBpbmNsdWRpbmcgdGhvc2UgdGhhdCBhcmUgYWN0aXZlLCBzaG91bGQgYmUKKyAgICAvLyBwcmV2ZW50ZWQgZnJvbSByZWNvcmRpbmcuIFRoaXMgaXMgaGFuZGxlZCBzaW1pbGFyIHRvIGlkbGUgVUlEcywgYW55IGFwcCB0aGF0IGF0dGVtcHRzCisgICAgLy8gdG8gcmVjb3JkIHdoaWxlIHNlbnNvciBwcml2YWN5IGlzIGVuYWJsZWQgd2lsbCByZWNlaXZlIGJ1ZmZlcnMgd2l0aCB6ZXJvcy4gQXMgc29vbiBhcworICAgIC8vIHNlbnNvciBwcml2YWN5IGlzIGRpc2FibGVkIGFjdGl2ZSBhcHBzIHdpbGwgcmVjZWl2ZSB0aGUgZXhwZWN0ZWQgZGF0YSB3aGVuIHJlY29yZGluZy4KKyAgICBjbGFzcyBTZW5zb3JQcml2YWN5UG9saWN5IDogcHVibGljIGhhcmR3YXJlOjpCblNlbnNvclByaXZhY3lMaXN0ZW5lciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIGV4cGxpY2l0IFNlbnNvclByaXZhY3lQb2xpY3kod3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBzZXJ2aWNlKQorICAgICAgICAgICAgICAgICAgICA6IG1TZXJ2aWNlKHNlcnZpY2UpIHt9CisKKyAgICAgICAgICAgIHZvaWQgcmVnaXN0ZXJTZWxmKCk7CisgICAgICAgICAgICB2b2lkIHVucmVnaXN0ZXJTZWxmKCk7CisKKyAgICAgICAgICAgIGJvb2wgaXNTZW5zb3JQcml2YWN5RW5hYmxlZCgpOworCisgICAgICAgICAgICBiaW5kZXI6OlN0YXR1cyBvblNlbnNvclByaXZhY3lDaGFuZ2VkKGJvb2wgZW5hYmxlZCk7CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIHdwPEF1ZGlvUG9saWN5U2VydmljZT4gbVNlcnZpY2U7CisgICAgICAgICAgICBzdGQ6OmF0b21pY19ib29sIG1TZW5zb3JQcml2YWN5RW5hYmxlZDsKKyAgICB9OworCisgICAgLy8gVGhyZWFkIHVzZWQgdG8gc2VuZCBhdWRpbyBjb25maWcgY29tbWFuZHMgdG8gYXVkaW8gZmxpbmdlcgogICAgIC8vIEZvciBhdWRpbyBjb25maWcgY29tbWFuZHMsIGl0IGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGF1ZGlvIGZsaW5nZXIgcmVxdWlyZXMgdGhhdCB0aGUgY2FsbGluZwogICAgIC8vIHByb2Nlc3MgKHVzZXIpIGhhcyBwZXJtaXNzaW9uIHRvIG1vZGlmeSBhdWRpbyBzZXR0aW5ncy4KICAgICBjbGFzcyBBdWRpb0NvbW1hbmRUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKQEAgLTMxOSw4ICszODEsNiBAQAogCiAgICAgICAgIC8vIGNvbW1hbmRzIGZvciB0b25lIEF1ZGlvQ29tbWFuZAogICAgICAgICBlbnVtIHsKLSAgICAgICAgICAgIFNUQVJUX1RPTkUsCi0gICAgICAgICAgICBTVE9QX1RPTkUsCiAgICAgICAgICAgICBTRVRfVk9MVU1FLAogICAgICAgICAgICAgU0VUX1BBUkFNRVRFUlMsCiAgICAgICAgICAgICBTRVRfVk9JQ0VfVk9MVU1FLApAQCAtMzQ1LDIwICs0MDUsMTMgQEAKICAgICAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgdGhyZWFkTG9vcCgpOwogCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGV4aXQoKTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc3RhcnRUb25lQ29tbWFuZChUb25lR2VuZXJhdG9yOjp0b25lX3R5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHN0b3BUb25lQ29tbWFuZCgpOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICB2b2x1bWVDb21tYW5kKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBmbG9hdCB2b2x1bWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgaW50IGRlbGF5TXMgPSAwKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgcGFyYW1ldGVyc0NvbW1hbmQoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleVZhbHVlUGFpcnMsIGludCBkZWxheU1zID0gMCk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHZvaWNlVm9sdW1lQ29tbWFuZChmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zID0gMCk7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHN0b3BPdXRwdXRDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcmVsZWFzZU91dHB1dENvbW1hbmQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdG9wT3V0cHV0Q29tbWFuZChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlbGVhc2VPdXRwdXRDb21tYW5kKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2VuZENvbW1hbmQoc3A8QXVkaW9Db21tYW5kPiYgY29tbWFuZCwgaW50IGRlbGF5TXMgPSAwKTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgaW5zZXJ0Q29tbWFuZF9sKHNwPEF1ZGlvQ29tbWFuZD4mIGNvbW1hbmQsIGludCBkZWxheU1zID0gMCk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIGNyZWF0ZUF1ZGlvUGF0Y2hDb21tYW5kKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCkBAIC0zNzAsMTMgKzQyMywxNyBAQAogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICB1cGRhdGVBdWRpb1BhdGNoTGlzdENvbW1hbmQoKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0QXVkaW9Qb3J0Q29uZmlnQ29tbWFuZChjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZUNvbW1hbmQoY29uc3QgU3RyaW5nOCYgcmVnSWQsIGludDMyX3Qgc3RhdGUpOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGVDb21tYW5kKGNvbnN0IFN0cmluZzgmIHJlZ0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhdGUpOwogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICByZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlQ29tbWFuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgaW5zZXJ0Q29tbWFuZF9sKEF1ZGlvQ29tbWFuZCAqY29tbWFuZCwgaW50IGRlbGF5TXMgPSAwKTsKICAgICBwcml2YXRlOgogICAgICAgICBjbGFzcyBBdWRpb0NvbW1hbmREYXRhOwpAQCAtMzkwLDcgKzQ0Nyw3IEBACiAKICAgICAgICAgICAgIHZvaWQgZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKTsKIAotICAgICAgICAgICAgaW50IG1Db21tYW5kOyAgIC8vIFNUQVJUX1RPTkUsIFNUT1BfVE9ORSAuLi4KKyAgICAgICAgICAgIGludCBtQ29tbWFuZDsgICAvLyBTRVRfVk9MVU1FLCBTRVRfUEFSQU1FVEVSUy4uLgogICAgICAgICAgICAgbnNlY3NfdCBtVGltZTsgIC8vIHRpbWUgc3RhbXAKICAgICAgICAgICAgIE11dGV4IG1Mb2NrOyAgICAvLyBtdXRleCBhc3NvY2lhdGVkIHRvIG1Db25kCiAgICAgICAgICAgICBDb25kaXRpb24gbUNvbmQ7IC8vIGNvbmRpdGlvbiBmb3Igc3RhdHVzIHJldHVybgpAQCAtNDA2LDEyICs0NjMsNiBAQAogICAgICAgICAgICAgQXVkaW9Db21tYW5kRGF0YSgpIHt9CiAgICAgICAgIH07CiAKLSAgICAgICAgY2xhc3MgVG9uZURhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIFRvbmVHZW5lcmF0b3I6OnRvbmVfdHlwZSBtVHlwZTsgLy8gdG9uZSB0eXBlIChTVEFSVF9UT05FIG9ubHkpCi0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW07ICAgIC8vIHN0cmVhbSB0eXBlIChTVEFSVF9UT05FIG9ubHkpCi0gICAgICAgIH07Ci0KICAgICAgICAgY2xhc3MgVm9sdW1lRGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtOwpAQCAtNDMyLDE2ICs0ODMsMTIgQEAKIAogICAgICAgICBjbGFzcyBTdG9wT3V0cHV0RGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKICAgICAgICAgcHVibGljOgotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbUlPOwotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IG1TZXNzaW9uOworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtUG9ydElkOwogICAgICAgICB9OwogCiAgICAgICAgIGNsYXNzIFJlbGVhc2VPdXRwdXREYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgewogICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBtSU87Ci0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW07Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgbVNlc3Npb247CisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1Qb3J0SWQ7CiAgICAgICAgIH07CiAKICAgICAgICAgY2xhc3MgQ3JlYXRlQXVkaW9QYXRjaERhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7CkBAIC00NzEsMTQgKzUxOCwxNiBAQAogICAgICAgICAgICAgaW50IG1FdmVudDsKICAgICAgICAgICAgIHJlY29yZF9jbGllbnRfaW5mb190IG1DbGllbnRJbmZvOwogICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlIG1DbGllbnRDb25maWc7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBtQ2xpZW50RWZmZWN0czsKICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSBtRGV2aWNlQ29uZmlnOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gbUVmZmVjdHM7CiAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBtU291cmNlOwogICAgICAgICB9OwogCiAgICAgICAgIE11dGV4ICAgbUxvY2s7CiAgICAgICAgIENvbmRpdGlvbiBtV2FpdFdvcmtDVjsKICAgICAgICAgVmVjdG9yIDwgc3A8QXVkaW9Db21tYW5kPiA+IG1BdWRpb0NvbW1hbmRzOyAvLyBsaXN0IG9mIHBlbmRpbmcgY29tbWFuZHMKLSAgICAgICAgVG9uZUdlbmVyYXRvciAqbXBUb25lR2VuZXJhdG9yOyAgICAgLy8gdGhlIHRvbmUgZ2VuZXJhdG9yCiAgICAgICAgIHNwPEF1ZGlvQ29tbWFuZD4gbUxhc3RDb21tYW5kOyAgICAgIC8vIGxhc3QgcHJvY2Vzc2VkIGNvbW1hbmQgKHVzZWQgYnkgZHVtcCkKICAgICAgICAgU3RyaW5nOCBtTmFtZTsgICAgICAgICAgICAgICAgICAgICAgLy8gc3RyaW5nIHVzZWQgYnkgd2FrZSBsb2NrIGZvIGRlbGF5ZWQgY29tbWFuZHMKICAgICAgICAgd3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBtU2VydmljZTsKQEAgLTU1MywxMSArNjAyLDYgQEAKICAgICAgICAgLy8gZnVuY3Rpb24gZW5hYmxpbmcgdG8gcmVjZWl2ZSBwcm9wcmlldGFyeSBpbmZvcm1hdGlvbnMgZGlyZWN0bHkgZnJvbSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UgdG8gYXVkaW8gcG9saWN5IG1hbmFnZXIuCiAgICAgICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlzKTsKIAotICAgICAgICAvLyByZXF1ZXN0IHRoZSBwbGF5YmFjayBvZiBhIHRvbmUgb24gdGhlIHNwZWNpZmllZCBzdHJlYW06IHVzZWQgZm9yIGluc3RhbmNlIHRvIHJlcGxhY2Ugbm90aWZpY2F0aW9uIHNvdW5kcyB3aGVuIHBsYXlpbmcKLSAgICAgICAgLy8gb3ZlciBhIHRlbGVwaG9ueSBkZXZpY2UgZHVyaW5nIGEgcGhvbmUgY2FsbC4KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFRvbmUoYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFRvbmUoKTsKLQogICAgICAgICAvLyBzZXQgZG93biBsaW5rIGF1ZGlvIHZvbHVtZS4KICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zID0gMCk7CiAKQEAgLTU4Miw5ICs2MjYsMTMgQEAKICAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKICAgICAgICAgdmlydHVhbCB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKTsKIAogICAgICAgICB2aXJ0dWFsIGF1ZGlvX3VuaXF1ZV9pZF90IG5ld0F1ZGlvVW5pcXVlSWQoYXVkaW9fdW5pcXVlX2lkX3VzZV90IHVzZSk7CiAKQEAgLTU5NywxOSArNjQ1LDI4IEBACiAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkNsaWVudChjb25zdCBzcDxBdWRpb1BvbGljeVNlcnZpY2U+JiBzZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsIHBpZF90IHBpZCk7CiAgICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgfk5vdGlmaWNhdGlvbkNsaWVudCgpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGNvbnN0IFN0cmluZzgmIHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoY29uc3QgU3RyaW5nOCYgcmVnSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgc2V0QXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZChib29sIGVuYWJsZWQpOwogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVVpZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAogICAgICAgICAgICAgICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyk7CiAKQEAgLTYxOSwzNCArNjc2LDYwIEBACiAKICAgICAgICAgY29uc3Qgd3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiAgICAgICAgbVNlcnZpY2U7CiAgICAgICAgIGNvbnN0IHVpZF90ICAgICAgICAgICAgICAgICAgICAgICAgIG1VaWQ7CisgICAgICAgIGNvbnN0IHBpZF90ICAgICAgICAgICAgICAgICAgICAgICAgIG1QaWQ7CiAgICAgICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+IG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ7CiAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkOwogICAgIH07CiAKKyAgICBjbGFzcyBBdWRpb0NsaWVudCA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgICAgICAgICBBdWRpb0NsaWVudChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBpbywgdWlkX3QgdWlkLCBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyhhdHRyaWJ1dGVzKSwgaW8oaW8pLCB1aWQodWlkKSwgcGlkKHBpZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24oc2Vzc2lvbiksIGRldmljZUlkKGRldmljZUlkKSwgYWN0aXZlKGZhbHNlKSB7fQorICAgICAgICAgICAgICAgIH5BdWRpb0NsaWVudCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzOyAvLyBzb3VyY2UsIGZsYWdzIC4uLgorICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBpbzsgICAgICAgICAgLy8gYXVkaW8gSEFMIHN0cmVhbSBJTyBoYW5kbGUKKyAgICAgICAgY29uc3QgdWlkX3QgdWlkOyAgICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCBVSUQKKyAgICAgICAgY29uc3QgcGlkX3QgcGlkOyAgICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCBQSUQKKyAgICAgICAgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb247ICAgICAgIC8vIGF1ZGlvIHNlc3Npb24gSUQKKyAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZDsgIC8vIHNlbGVjdGVkIGlucHV0IGRldmljZSBwb3J0IElECisgICAgICAgICAgICAgIGJvb2wgYWN0aXZlOyAgICAgICAgICAgICAgICAgICAvLyBQbGF5YmFjay9DYXB0dXJlIGlzIGFjdGl2ZSBvciBpbmFjdGl2ZQorICAgIH07CisKICAgICAvLyAtLS0gQXVkaW9SZWNvcmRDbGllbnQgLS0tCiAgICAgLy8gSW5mb3JtYXRpb24gYWJvdXQgZWFjaCByZWdpc3RlcmVkIEF1ZGlvUmVjb3JkIGNsaWVudAogICAgIC8vIChiZXR3ZWVuIGNhbGxzIHRvIGdldElucHV0Rm9yQXR0cigpIGFuZCByZWxlYXNlSW5wdXQoKSkKLSAgICBjbGFzcyBBdWRpb1JlY29yZENsaWVudCA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBjbGFzcyBBdWRpb1JlY29yZENsaWVudCA6IHB1YmxpYyBBdWRpb0NsaWVudCB7CiAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIEF1ZGlvUmVjb3JkQ2xpZW50KGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LCB1aWRfdCB1aWQsIHBpZF90IHBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyhhdHRyaWJ1dGVzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaW5wdXQpLCB1aWQodWlkKSwgcGlkKHBpZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSksIHNlc3Npb24oc2Vzc2lvbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZShmYWxzZSksIGlzQ29uY3VycmVudChmYWxzZSksIGlzVmlydHVhbERldmljZShmYWxzZSkge30KLSAgICAgICAgdmlydHVhbCB+QXVkaW9SZWNvcmRDbGllbnQoKSB7fQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBpbywgdWlkX3QgdWlkLCBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSkgOgorICAgICAgICAgICAgICAgICAgICBBdWRpb0NsaWVudChhdHRyaWJ1dGVzLCBpbywgdWlkLCBwaWQsIHNlc3Npb24sIGRldmljZUlkKSwKKyAgICAgICAgICAgICAgICAgICAgb3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKSwgc3RhcnRUaW1lTnMoMCkge30KKyAgICAgICAgICAgICAgICB+QXVkaW9SZWNvcmRDbGllbnQoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CiAKLSAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXM7IC8vIHNvdXJjZSwgZmxhZ3MgLi4uCi0gICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0OyAgICAgICAvLyBhdWRpbyBIQUwgaW5wdXQgSU8gaGFuZGxlCi0gICAgICAgIGNvbnN0IHVpZF90IHVpZDsgICAgICAgICAgICAgICAgICAgICAvLyBjbGllbnQgVUlECi0gICAgICAgIGNvbnN0IHBpZF90IHBpZDsgICAgICAgICAgICAgICAgICAgICAvLyBjbGllbnQgUElECiAgICAgICAgIGNvbnN0IFN0cmluZzE2IG9wUGFja2FnZU5hbWU7ICAgICAgICAvLyBjbGllbnQgcGFja2FnZSBuYW1lCi0gICAgICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uOyAgICAgICAvLyBhdWRpbyBzZXNzaW9uIElECi0gICAgICAgIGJvb2wgYWN0aXZlOyAgICAgICAgICAgICAgICAgICAvLyBDYXB0dXJlIGlzIGFjdGl2ZSBvciBpbmFjdGl2ZQotICAgICAgICBib29sIGlzQ29uY3VycmVudDsgICAgICAgICAgICAgLy8gaXMgYWxsb3dlZCB0byBjb25jdXJyZW50IGNhcHR1cmUKLSAgICAgICAgYm9vbCBpc1ZpcnR1YWxEZXZpY2U7ICAgICAgICAgIC8vIHVzZXMgdmlydHVhbCBkZXZpY2U6IHVwZGF0ZWQgYnkgQVBNOjpnZXRJbnB1dEZvckF0dHIoKQotICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkOyAgLy8gc2VsZWN0ZWQgaW5wdXQgZGV2aWNlIHBvcnQgSUQKKyAgICAgICAgbnNlY3NfdCBzdGFydFRpbWVOczsKKyAgICB9OworCisgICAgLy8gLS0tIEF1ZGlvUGxheWJhY2tDbGllbnQgLS0tCisgICAgLy8gSW5mb3JtYXRpb24gYWJvdXQgZWFjaCByZWdpc3RlcmVkIEF1ZGlvVHJhY2sgY2xpZW50CisgICAgLy8gKGJldHdlZW4gY2FsbHMgdG8gZ2V0T3V0cHV0Rm9yQXR0cigpIGFuZCByZWxlYXNlT3V0cHV0KCkpCisgICAgY2xhc3MgQXVkaW9QbGF5YmFja0NsaWVudCA6IHB1YmxpYyBBdWRpb0NsaWVudCB7CisgICAgcHVibGljOgorICAgICAgICAgICAgICAgIEF1ZGlvUGxheWJhY2tDbGllbnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgaW8sIHVpZF90IHVpZCwgcGlkX3QgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA6CisgICAgICAgICAgICAgICAgICAgIEF1ZGlvQ2xpZW50KGF0dHJpYnV0ZXMsIGlvLCB1aWQsIHBpZCwgc2Vzc2lvbiwgZGV2aWNlSWQpLCBzdHJlYW0oc3RyZWFtKSB7fQorICAgICAgICAgICAgICAgIH5BdWRpb1BsYXliYWNrQ2xpZW50KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtOwogICAgIH07CiAKICAgICAvLyBBIGNsYXNzIGF1dG9tYXRpY2FsbHkgY2xlYXJpbmcgYW5kIHJlc3RvcmluZyBiaW5kZXIgY2FsbGVyIGlkZW50aXR5IGluc2lkZQpAQCAtNjc2LDIxICs3NTksMjMgQEAKICAgICAvLyBtTG9jayBwcm90ZWN0cyBBdWRpb1BvbGljeU1hbmFnZXIgbWV0aG9kcyB0aGF0IGNhbiBjYWxsIGludG8gYXVkaW8gZmxpbmdlcgogICAgIC8vIGFuZCBwb3NzaWJseSBiYWNrIGluIHRvIGF1ZGlvIHBvbGljeSBzZXJ2aWNlIGFuZCBhY3F1aXJlIG1FZmZlY3RzTG9jay4KICAgICBzcDxBdWRpb0NvbW1hbmRUaHJlYWQ+IG1BdWRpb0NvbW1hbmRUaHJlYWQ7ICAgICAvLyBhdWRpbyBjb21tYW5kcyB0aHJlYWQKLSAgICBzcDxBdWRpb0NvbW1hbmRUaHJlYWQ+IG1Ub25lUGxheWJhY2tUaHJlYWQ7ICAgICAvLyB0b25lIHBsYXliYWNrIHRocmVhZAogICAgIHNwPEF1ZGlvQ29tbWFuZFRocmVhZD4gbU91dHB1dENvbW1hbmRUaHJlYWQ7ICAgIC8vIHByb2Nlc3Mgc3RvcCBhbmQgcmVsZWFzZSBvdXRwdXQKICAgICBzdHJ1Y3QgYXVkaW9fcG9saWN5X2RldmljZSAqbXBBdWRpb1BvbGljeURldjsKICAgICBzdHJ1Y3QgYXVkaW9fcG9saWN5ICptcEF1ZGlvUG9saWN5OwogICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlICptQXVkaW9Qb2xpY3lNYW5hZ2VyOwogICAgIEF1ZGlvUG9saWN5Q2xpZW50ICptQXVkaW9Qb2xpY3lDbGllbnQ7CiAKLSAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IHVpZF90LCBzcDxOb3RpZmljYXRpb25DbGllbnQ+ID4gICAgbU5vdGlmaWNhdGlvbkNsaWVudHM7CisgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBpbnQ2NF90LCBzcDxOb3RpZmljYXRpb25DbGllbnQ+ID4gICAgbU5vdGlmaWNhdGlvbkNsaWVudHM7CiAgICAgTXV0ZXggbU5vdGlmaWNhdGlvbkNsaWVudHNMb2NrOyAgLy8gcHJvdGVjdHMgbU5vdGlmaWNhdGlvbkNsaWVudHMKICAgICAvLyBNYW5hZ2UgYWxsIGVmZmVjdHMgY29uZmlndXJlZCBpbiBhdWRpb19lZmZlY3RzLmNvbmYKICAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+IG1BdWRpb1BvbGljeUVmZmVjdHM7CiAgICAgYXVkaW9fbW9kZV90IG1QaG9uZVN0YXRlOwogCiAgICAgc3A8VWlkUG9saWN5PiBtVWlkUG9saWN5OworICAgIHNwPFNlbnNvclByaXZhY3lQb2xpY3k+IG1TZW5zb3JQcml2YWN5UG9saWN5OworCiAgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBhdWRpb19wb3J0X2hhbmRsZV90LCBzcDxBdWRpb1JlY29yZENsaWVudD4gPiAgIG1BdWRpb1JlY29yZENsaWVudHM7CisgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBhdWRpb19wb3J0X2hhbmRsZV90LCBzcDxBdWRpb1BsYXliYWNrQ2xpZW50PiA+ICAgbUF1ZGlvUGxheWJhY2tDbGllbnRzOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0FuZHJvaWQubWsKaW5kZXggYTQzZGFlYS4uMmNjYjU0MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BbmRyb2lkLm1rCkBAIC02LDcgKzYsNyBAQAogICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5IFwKICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCiAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZSBcCi0gIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvdXRpbGl0aWVzCisgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgbGliYXVkaW9wb2xpY3ltYW5hZ2VyZGVmYXVsdCBcCkBAIC0zMCwzICszMCwyOSBAQAogTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKIAogaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQorCisjIHN5c3RlbS9hdWRpby5oIHV0aWxpdGllcyB0ZXN0CisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgbGliYmFzZSBcCisgIGxpYmxvZyBcCisgIGxpYm1lZGlhX2hlbHBlciBcCisgIGxpYnV0aWxzCisKK0xPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAorICBsaWJtZWRpYV9oZWFkZXJzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgIHN5c3RlbWF1ZGlvX3Rlc3RzLmNwcCBcCisKK0xPQ0FMX01PRFVMRSA6PSBzeXN0ZW1hdWRpb190ZXN0cworCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitMT0NBTF9DRkxBR1MgOj0gLVdlcnJvciAtV2FsbAorCitMT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQorCitpbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeVRlc3RDbGllbnQuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdENsaWVudC5oCmluZGV4IGViODIyMmMuLjZhZTM1NGIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdENsaWVudC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdENsaWVudC5oCkBAIC02MCw5ICs2MCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKmRlbGF5TXMqLykgb3ZlcnJpZGUgeyB9CiAgICAgU3RyaW5nOCBnZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IC8qaW9IYW5kbGUqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgLyprZXlzKi8pIG92ZXJyaWRlIHsgcmV0dXJuIFN0cmluZzgoKTsgfQotICAgIHN0YXR1c190IHN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IC8qdG9uZSovLAotICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IC8qc3RyZWFtKi8pIG92ZXJyaWRlIHsgcmV0dXJuIE5PX0lOSVQ7IH0KLSAgICBzdGF0dXNfdCBzdG9wVG9uZSgpIG92ZXJyaWRlIHsgcmV0dXJuIE5PX0lOSVQ7IH0KICAgICBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCAvKnZvbHVtZSovLCBpbnQgLypkZWxheU1zKi8pIG92ZXJyaWRlIHsgcmV0dXJuIE5PX0lOSVQ7IH0KICAgICBzdGF0dXNfdCBtb3ZlRWZmZWN0cyhhdWRpb19zZXNzaW9uX3QgLypzZXNzaW9uKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgLypzcmNPdXRwdXQqLywKQEAgLTc4LDExICs3NSwxNCBAQAogICAgIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpIG92ZXJyaWRlIHsgfQogICAgIGF1ZGlvX3VuaXF1ZV9pZF90IG5ld0F1ZGlvVW5pcXVlSWQoYXVkaW9fdW5pcXVlX2lkX3VzZV90IC8qdXNlKi8pIG92ZXJyaWRlIHsgcmV0dXJuIDA7IH0KICAgICB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggLypyZWdJZCovLCBpbnQzMl90IC8qc3RhdGUqLykgb3ZlcnJpZGUgeyB9Ci0gICAgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IC8qZXZlbnQqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCogLypjbGllbnRJbmZvKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlKiAvKmNsaWVudENvbmZpZyovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSogLypkZXZpY2VDb25maWcqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAvKnBhdGNoSGFuZGxlKi8pIG92ZXJyaWRlIHsgfQorICAgIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbyBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cyBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cyBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgX191bnVzZWQpIG92ZXJyaWRlIHsgfQogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvYXVkaW9wb2xpY3ltYW5hZ2VyX3Rlc3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvcG9saWN5bWFuYWdlcl90ZXN0cy5jcHAKaW5kZXggYTk1OTNiOC4uNTZhZjE1MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvYXVkaW9wb2xpY3ltYW5hZ2VyX3Rlc3RzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb3BvbGljeW1hbmFnZXJfdGVzdHMuY3BwCkBAIC0xNiw5ICsxNiwxNSBAQAogCiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KIAorI2RlZmluZSBMT0dfVEFHICJBUE1fVGVzdCIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvUGF0Y2hCdWlsZGVyLmg+CisKICNpbmNsdWRlICJBdWRpb1BvbGljeVRlc3RDbGllbnQuaCIKICNpbmNsdWRlICJBdWRpb1BvbGljeVRlc3RNYW5hZ2VyLmgiCiAKQEAgLTEzMiw2ICsxMzgsMzYgQEAKICAgICAvLyBTZXRVcCBtdXN0IGZpbmlzaCB3aXRoIG5vIGFzc2VydGlvbnMuCiB9CiAKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0LCBEdW1wKSB7CisgICAgaW50IHBpcGVmZFsyXTsKKyAgICBBU1NFUlRfTkUoLTEsIHBpcGUocGlwZWZkKSk7CisgICAgcGlkX3QgY3BpZCA9IGZvcmsoKTsKKyAgICBBU1NFUlRfTkUoLTEsIGNwaWQpOworICAgIGlmIChjcGlkID09IDApIHsKKyAgICAgICAgLy8gQ2hpbGQgcHJvY2VzcyByZWFkcyBmcm9tIHRoZSBwaXBlIGFuZCBsb2dzLgorICAgICAgICBjbG9zZShwaXBlZmRbMV0pOworICAgICAgICBzdGQ6OnN0cmluZyBsaW5lOworICAgICAgICBjaGFyIGJ1ZjsKKyAgICAgICAgd2hpbGUgKHJlYWQocGlwZWZkWzBdLCAmYnVmLCBzaXplb2YoYnVmKSkgPiAwKSB7CisgICAgICAgICAgICBpZiAoYnVmICE9ICdcbicpIHsKKyAgICAgICAgICAgICAgICBsaW5lICs9IGJ1ZjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0koIiVzIiwgbGluZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBsaW5lID0gIiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFsaW5lLmVtcHR5KCkpIEFMT0dJKCIlcyIsIGxpbmUuY19zdHIoKSk7CisgICAgICAgIGNsb3NlKHBpcGVmZFswXSk7CisgICAgICAgIF9leGl0KEVYSVRfU1VDQ0VTUyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gUGFyZW50IGRvZXMgdGhlIGR1bXAgYW5kIGNoZWNrcyB0aGUgc3RhdHVzIGNvZGUuCisgICAgICAgIGNsb3NlKHBpcGVmZFswXSk7CisgICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPmR1bXAocGlwZWZkWzFdKSk7CisgICAgICAgIGNsb3NlKHBpcGVmZFsxXSk7CisgICAgICAgIHdhaXQoTlVMTCk7ICAvLyBXYWl0IGZvciB0aGUgY2hpbGQgdG8gZXhpdC4KKyAgICB9Cit9CisKIFRFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0LCBDcmVhdGVBdWRpb1BhdGNoRmFpbHVyZSkgewogICAgIGF1ZGlvX3BhdGNoIHBhdGNoe307CiAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CkBAIC0xNjYsMjkgKzIwMiwxNCBAQAogfQogCiBURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdCwgQ3JlYXRlQXVkaW9QYXRjaEZyb21NaXgpIHsKLSAgICBhdWRpb19wYXRjaCBwYXRjaHt9OwogICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogICAgIHVpZF90IHVpZCA9IDQyOwogICAgIGNvbnN0IHNpemVfdCBwYXRjaENvdW50QmVmb3JlID0gbUNsaWVudC0+Z2V0QWN0aXZlUGF0Y2hlc0NvdW50KCk7Ci0gICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOwotICAgIHsKLSAgICAgICAgYXV0byYgc3JjID0gcGF0Y2guc291cmNlc1swXTsKLSAgICAgICAgc3JjLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFOwotICAgICAgICBzcmMudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9NSVg7Ci0gICAgICAgIHNyYy5pZCA9IG1NYW5hZ2VyLT5nZXRDb25maWcoKS5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKVswXS0+Z2V0SWQoKTsKLSAgICAgICAgLy8gTm90ZTogdGhlc2UgYXJlIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBvdXRwdXQgZGV2aWNlLgotICAgICAgICBzcmMuc2FtcGxlX3JhdGUgPSA0NDEwMDsKLSAgICAgICAgc3JjLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwotICAgICAgICBzcmMuY2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgIH0KLSAgICBwYXRjaC5udW1fc2lua3MgPSAxOwotICAgIHsKLSAgICAgICAgYXV0byYgc2luayA9IHBhdGNoLnNpbmtzWzBdOwotICAgICAgICBzaW5rLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU0lOSzsKLSAgICAgICAgc2luay50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRTsKLSAgICAgICAgc2luay5pZCA9IG1NYW5hZ2VyLT5nZXRDb25maWcoKS5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCktPmdldElkKCk7Ci0gICAgfQotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmaGFuZGxlLCB1aWQpKTsKKyAgICBBU1NFUlRfRkFMU0UobU1hbmFnZXItPmdldENvbmZpZygpLmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpLmlzRW1wdHkoKSk7CisgICAgUGF0Y2hCdWlsZGVyIHBhdGNoQnVpbGRlcjsKKyAgICBwYXRjaEJ1aWxkZXIuYWRkU291cmNlKG1NYW5hZ2VyLT5nZXRDb25maWcoKS5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKVswXSkuCisgICAgICAgICAgICBhZGRTaW5rKG1NYW5hZ2VyLT5nZXRDb25maWcoKS5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCkpOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPmNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2hCdWlsZGVyLnBhdGNoKCksICZoYW5kbGUsIHVpZCkpOwogICAgIEFTU0VSVF9ORShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSwgaGFuZGxlKTsKICAgICBBU1NFUlRfRVEocGF0Y2hDb3VudEJlZm9yZSArIDEsIG1DbGllbnQtPmdldEFjdGl2ZVBhdGNoZXNDb3VudCgpKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3N5c3RlbWF1ZGlvX3Rlc3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3N5c3RlbWF1ZGlvX3Rlc3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmFhZTUyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvc3lzdGVtYXVkaW9fdGVzdHMuY3BwCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNkZWZpbmUgTE9HX1RBRyAiU3lzQXVkaW9fVGVzdCIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvUGF0Y2hCdWlsZGVyLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitURVNUKFN5c3RlbUF1ZGlvVGVzdCwgUGF0Y2hJbnZhbGlkKSB7CisgICAgYXVkaW9fcGF0Y2ggcGF0Y2h7fTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcGF0Y2hfaXNfdmFsaWQoJnBhdGNoKSk7CisgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSBBVURJT19QQVRDSF9QT1JUU19NQVggKyAxOworICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BhdGNoX2lzX3ZhbGlkKCZwYXRjaCkpOworICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKKyAgICBwYXRjaC5udW1fc2lua3MgPSBBVURJT19QQVRDSF9QT1JUU19NQVggKyAxOworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wYXRjaF9pc192YWxpZCgmcGF0Y2gpKTsKKyAgICBwYXRjaC5udW1fc291cmNlcyA9IDA7CisgICAgcGF0Y2gubnVtX3NpbmtzID0gMTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcGF0Y2hfaXNfdmFsaWQoJnBhdGNoKSk7Cit9CisKK1RFU1QoU3lzdGVtQXVkaW9UZXN0LCBQYXRjaFZhbGlkKSB7CisgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWcgc3JjID0geworICAgICAgICAuaWQgPSAxLCAucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UsIC50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSB9OworICAgIC8vIEl0J3MgT0sgbm90IHRvIGhhdmUgc2lua3MuCisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcGF0Y2hfaXNfdmFsaWQoKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5wYXRjaCgpKSk7CisgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWcgc2luayA9IHsKKyAgICAgICAgLmlkID0gMiwgLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU0lOSywgLnR5cGUgPSBBVURJT19QT1JUX1RZUEVfREVWSUNFIH07CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcGF0Y2hfaXNfdmFsaWQoKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmspLnBhdGNoKCkpKTsKKyAgICBBU1NFUlRfVFJVRShhdWRpb19wYXRjaF9pc192YWxpZCgKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmspLnBhdGNoKCkpKTsKKyAgICBBU1NFUlRfVFJVRShhdWRpb19wYXRjaF9pc192YWxpZCgKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmspLmFkZFNpbmsoc2luaykucGF0Y2goKSkpOworICAgIEFTU0VSVF9UUlVFKGF1ZGlvX3BhdGNoX2lzX3ZhbGlkKAorICAgICAgICAgICAgICAgICAgICAoUGF0Y2hCdWlsZGVye30pLmFkZFNvdXJjZShzcmMpLmFkZFNvdXJjZShzcmMpLgorICAgICAgICAgICAgICAgICAgICBhZGRTaW5rKHNpbmspLmFkZFNpbmsoc2luaykucGF0Y2goKSkpOworfQorCitURVNUKFN5c3RlbUF1ZGlvVGVzdCwgUGF0Y2hId0F2U3luYykgeworICAgIGF1ZGlvX3BvcnRfY29uZmlnIGRldmljZV9zcmNfY2ZnID0geworICAgICAgICAuaWQgPSAxLCAucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UsIC50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSB9OworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wb3J0X2NvbmZpZ19oYXNfaHdfYXZfc3luYygmZGV2aWNlX3NyY19jZmcpKTsKKyAgICBkZXZpY2Vfc3JjX2NmZy5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJmRldmljZV9zcmNfY2ZnKSk7CisgICAgZGV2aWNlX3NyY19jZmcuZmxhZ3MuaW5wdXQgPSBBVURJT19JTlBVVF9GTEFHX0hXX0FWX1NZTkM7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJmRldmljZV9zcmNfY2ZnKSk7CisKKyAgICBhdWRpb19wb3J0X2NvbmZpZyBkZXZpY2Vfc2lua19jZmcgPSB7CisgICAgICAgIC5pZCA9IDEsIC5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NJTkssIC50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSB9OworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wb3J0X2NvbmZpZ19oYXNfaHdfYXZfc3luYygmZGV2aWNlX3NpbmtfY2ZnKSk7CisgICAgZGV2aWNlX3NpbmtfY2ZnLmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wb3J0X2NvbmZpZ19oYXNfaHdfYXZfc3luYygmZGV2aWNlX3NpbmtfY2ZnKSk7CisgICAgZGV2aWNlX3NpbmtfY2ZnLmZsYWdzLm91dHB1dCA9IEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkM7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJmRldmljZV9zaW5rX2NmZykpOworCisgICAgYXVkaW9fcG9ydF9jb25maWcgbWl4X3NpbmtfY2ZnID0geworICAgICAgICAuaWQgPSAxLCAucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TSU5LLCAudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9NSVggfTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJm1peF9zaW5rX2NmZykpOworICAgIG1peF9zaW5rX2NmZy5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJm1peF9zaW5rX2NmZykpOworICAgIG1peF9zaW5rX2NmZy5mbGFncy5pbnB1dCA9IEFVRElPX0lOUFVUX0ZMQUdfSFdfQVZfU1lOQzsKKyAgICBBU1NFUlRfVFJVRShhdWRpb19wb3J0X2NvbmZpZ19oYXNfaHdfYXZfc3luYygmbWl4X3NpbmtfY2ZnKSk7CisKKyAgICBhdWRpb19wb3J0X2NvbmZpZyBtaXhfc3JjX2NmZyA9IHsKKyAgICAgICAgLmlkID0gMSwgLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFLCAudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9NSVggfTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJm1peF9zcmNfY2ZnKSk7CisgICAgbWl4X3NyY19jZmcuY29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfRkxBR1M7CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZtaXhfc3JjX2NmZykpOworICAgIG1peF9zcmNfY2ZnLmZsYWdzLm91dHB1dCA9IEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkM7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJm1peF9zcmNfY2ZnKSk7Cit9CisKK1RFU1QoU3lzdGVtQXVkaW9UZXN0LCBQYXRjaEVxdWFsKSB7CisgICAgY29uc3QgYXVkaW9fcGF0Y2ggcGF0Y2gxe30sIHBhdGNoMnt9OworICAgIC8vIEludmFsaWQgcGF0Y2hlcyBhcmUgbm90IGVxdWFsLgorICAgIEFTU0VSVF9GQUxTRShhdWRpb19wYXRjaGVzX2FyZV9lcXVhbCgmcGF0Y2gxLCAmcGF0Y2gyKSk7CisgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWcgc3JjID0geworICAgICAgICAuaWQgPSAxLCAucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UsIC50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSB9OworICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnIHNpbmsgPSB7CisgICAgICAgIC5pZCA9IDIsIC5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NJTkssIC50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSB9OworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wYXRjaGVzX2FyZV9lcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5wYXRjaCgpLAorICAgICAgICAgICAgICAgICAgICAoUGF0Y2hCdWlsZGVye30pLmFkZFNvdXJjZShzcmMpLmFkZFNpbmsoc2luaykucGF0Y2goKSkpOworICAgIEFTU0VSVF9UUlVFKGF1ZGlvX3BhdGNoZXNfYXJlX2VxdWFsKAorICAgICAgICAgICAgICAgICAgICAoUGF0Y2hCdWlsZGVye30pLmFkZFNvdXJjZShzcmMpLmFkZFNpbmsoc2luaykucGF0Y2goKSwKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmspLnBhdGNoKCkpKTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcGF0Y2hlc19hcmVfZXF1YWwoCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rKS5wYXRjaCgpLAorICAgICAgICAgICAgICAgICAgICAoUGF0Y2hCdWlsZGVye30pLmFkZFNvdXJjZShzcmMpLmFkZFNvdXJjZShzcmMpLmFkZFNpbmsoc2luaykucGF0Y2goKSkpOworICAgIGF1ZGlvX3BvcnRfY29uZmlnIHNpbmtfaHdfYXZfc3luYyA9IHNpbms7CisgICAgc2lua19od19hdl9zeW5jLmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOworICAgIHNpbmtfaHdfYXZfc3luYy5mbGFncy5vdXRwdXQgPSBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DOworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wYXRjaGVzX2FyZV9lcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmspLnBhdGNoKCksCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rX2h3X2F2X3N5bmMpLnBhdGNoKCkpKTsKKyAgICBBU1NFUlRfVFJVRShhdWRpb19wYXRjaGVzX2FyZV9lcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmtfaHdfYXZfc3luYykucGF0Y2goKSwKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmtfaHdfYXZfc3luYykucGF0Y2goKSkpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUxZGQ2OQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMjEgQEAKKy8vIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vCisvLyBsaWJjYW1lcmFzZXJ2aWNlCisvLworCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNhbWVyYXNlcnZpY2UiLAorCisgICAgLy8gQ2FtZXJhIHNlcnZpY2Ugc291cmNlCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDYW1lcmFTZXJ2aWNlLmNwcCIsCisgICAgICAgICJDYW1lcmFGbGFzaGxpZ2h0LmNwcCIsCisgICAgICAgICJjb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwIiwKKyAgICAgICAgImNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmNwcCIsCisgICAgICAgICJjb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcCIsCisgICAgICAgICJjb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmNwcCIsCisgICAgICAgICJhcGkxL0NhbWVyYUNsaWVudC5jcHAiLAorICAgICAgICAiYXBpMS9DYW1lcmEyQ2xpZW50LmNwcCIsCisgICAgICAgICJhcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAiLAorICAgICAgICAiYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmNwcCIsCisgICAgICAgICJhcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcCIsCisgICAgICAgICJhcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAiLAorICAgICAgICAiYXBpMS9jbGllbnQyL0NhbGxiYWNrUHJvY2Vzc29yLmNwcCIsCisgICAgICAgICJhcGkxL2NsaWVudDIvSnBlZ0NvbXByZXNzb3IuY3BwIiwKKyAgICAgICAgImFwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcCIsCisgICAgICAgICJhcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmNwcCIsCisgICAgICAgICJhcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAiLAorICAgICAgICAiZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5jcHAiLAorICAgICAgICAiZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwIiwKKyAgICAgICAgImRldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAiLAorICAgICAgICAiZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwIiwKKyAgICAgICAgImRldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAiLAorICAgICAgICAiZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwIiwKKyAgICAgICAgImRldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5jcHAiLAorICAgICAgICAiZGV2aWNlMy9TdGF0dXNUcmFja2VyLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5jcHAiLAorICAgICAgICAiZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmNwcCIsCisgICAgICAgICJndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmNwcCIsCisgICAgICAgICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5jcHAiLAorICAgICAgICAiaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmNwcCIsCisgICAgICAgICJoaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuY3BwIiwKKyAgICAgICAgImhpZGwvQ29udmVydC5jcHAiLAorICAgICAgICAiaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5jcHAiLAorICAgICAgICAiaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5jcHAiLAorICAgICAgICAidXRpbHMvQ2FtZXJhVHJhY2VzLmNwcCIsCisgICAgICAgICJ1dGlscy9BdXRvQ29uZGl0aW9uTG9jay5jcHAiLAorICAgICAgICAidXRpbHMvVGFnTW9uaXRvci5jcHAiLAorICAgICAgICAidXRpbHMvTGF0ZW5jeUhpc3RvZ3JhbS5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlidWkiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzY2FsbHN0YWNrIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKKyAgICAgICAgImxpYmNhbWVyYV9tZXRhZGF0YSIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmhhcmR3YXJlIiwKKyAgICAgICAgImxpYmh3YmluZGVyIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGlianBlZyIsCisgICAgICAgICJsaWJtZW11bnJlYWNoYWJsZSIsCisgICAgICAgICJsaWJzZW5zb3Jwcml2YWN5IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAiYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2UuY29tbW9uQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5kZXZpY2VAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmNvbW1vbkAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMiIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4zIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjQiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNSIsCisgICAgXSwKKworICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKKyAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJsaWJzZW5zb3Jwcml2YWN5IiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZSIsCisgICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9uZGsiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tawppbmRleCA5NjI2MWFiLi40Y2ZlY2ZkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTE0LDkxICsxNCw5IEBACiAKIExPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQogCi0jCi0jIGxpYmNhbWVyYXNlcnZpY2UKLSMKLQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKLSMgQ2FtZXJhIHNlcnZpY2Ugc291cmNlCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAgXAotICAgIENhbWVyYVNlcnZpY2UuY3BwIFwKLSAgICBDYW1lcmFGbGFzaGxpZ2h0LmNwcCBcCi0gICAgY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcCBcCi0gICAgY29tbW9uL0NhbWVyYURldmljZUJhc2UuY3BwIFwKLSAgICBjb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcCBcCi0gICAgY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5jcHAgXAotICAgIGFwaTEvQ2FtZXJhQ2xpZW50LmNwcCBcCi0gICAgYXBpMS9DYW1lcmEyQ2xpZW50LmNwcCBcCi0gICAgYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwIFwKLSAgICBhcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuY3BwIFwKLSAgICBhcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcCBcCi0gICAgYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwIFwKLSAgICBhcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuY3BwIFwKLSAgICBhcGkxL2NsaWVudDIvSnBlZ0NvbXByZXNzb3IuY3BwIFwKLSAgICBhcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAgXAotICAgIGFwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwIFwKLSAgICBhcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAgXAotICAgIGRldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuY3BwIFwKLSAgICBkZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwIFwKLSAgICBkZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwIFwKLSAgICBkZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwIFwKLSAgICBkZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcCBcCi0gICAgZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmNwcCBcCi0gICAgZGV2aWNlMy9TdGF0dXNUcmFja2VyLmNwcCBcCi0gICAgZGV2aWNlMy9DYW1lcmEzQnVmZmVyTWFuYWdlci5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcCBcCi0gICAgZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmNwcCBcCi0gICAgZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5jcHAgXAotICAgIHV0aWxzL0NhbWVyYVRyYWNlcy5jcHAgXAotICAgIHV0aWxzL0F1dG9Db25kaXRpb25Mb2NrLmNwcCBcCi0gICAgdXRpbHMvVGFnTW9uaXRvci5jcHAgXAotICAgIHV0aWxzL0xhdGVuY3lIaXN0b2dyYW0uY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVM6PSBcCi0gICAgbGlidWkgXAotICAgIGxpYmxvZyBcCi0gICAgbGlidXRpbHNjYWxsc3RhY2sgXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJiaW5kZXIgXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGlibWVkaWEgXAotICAgIGxpYm1lZGlhdXRpbHMgXAotICAgIGxpYmNhbWVyYV9jbGllbnQgXAotICAgIGxpYmNhbWVyYV9tZXRhZGF0YSBcCi0gICAgbGliZm1xIFwKLSAgICBsaWJndWkgXAotICAgIGxpYmhhcmR3YXJlIFwKLSAgICBsaWJoaWRsYmFzZSBcCi0gICAgbGliaGlkbHRyYW5zcG9ydCBcCi0gICAgbGlianBlZyBcCi0gICAgbGlibWVtdW5yZWFjaGFibGUgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmNvbW1vbkAxLjAgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNCBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDEuMCBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMiBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMyBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNAotCi1MT0NBTF9FWFBPUlRfU0hBUkVEX0xJQlJBUllfSEVBREVSUyA6PSBsaWJiaW5kZXIgbGliY2FtZXJhX2NsaWVudCBsaWJmbXEKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgc3lzdGVtL21lZGlhL3ByaXZhdGUvY2FtZXJhL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAotCi1MT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UKLQotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXh0cmEgLVdlcnJvcgotCi1MT0NBTF9NT0RVTEU6PSBsaWJjYW1lcmFzZXJ2aWNlCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotIyBCdWlsZCB0ZXN0cyB0b28KKyMgQnVpbGQgdGVzdHMKIAogaW5jbHVkZSAkKExPQ0FMX1BBVEgpL3Rlc3RzL0FuZHJvaWQubWsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcAppbmRleCBiYTAyNDRlLi5jMzExM2JmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcApAQCAtNDcsMTEgKzQ3LDE0IEBACiAjaW5jbHVkZSA8Y3V0aWxzL21pc2MuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CisjaW5jbHVkZSAiaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5oIgorI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KICNpbmNsdWRlIDxtZW11bnJlYWNoYWJsZS9tZW11bnJlYWNoYWJsZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvQmF0dGVyeU5vdGlmaWVyLmg+CisjaW5jbHVkZSA8c2Vuc29ycHJpdmFjeS9TZW5zb3JQcml2YWN5TWFuYWdlci5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CkBAIC02OSw2ICs3Miw3IEBACiAjaW5jbHVkZSAiYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaCIKICNpbmNsdWRlICJ1dGlscy9DYW1lcmFUcmFjZXMuaCIKICNpbmNsdWRlICJ1dGlscy9UYWdNb25pdG9yLmgiCisjaW5jbHVkZSAidXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaCIKIAogbmFtZXNwYWNlIHsKICAgICBjb25zdCBjaGFyKiBrUGVybWlzc2lvblNlcnZpY2VOYW1lID0gInBlcm1pc3Npb24iOwpAQCAtNzcsNiArODEsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiB1c2luZyBiaW5kZXI6OlN0YXR1czsKK3VzaW5nIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpIaWRsQ2FtZXJhU2VydmljZTsKIHVzaW5nIGhhcmR3YXJlOjpJQ2FtZXJhOwogdXNpbmcgaGFyZHdhcmU6OklDYW1lcmFDbGllbnQ7CiB1c2luZyBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTsKQEAgLTE0MSw2ICsxNDYsMTMgQEAKIAogICAgIG1VaWRQb2xpY3kgPSBuZXcgVWlkUG9saWN5KHRoaXMpOwogICAgIG1VaWRQb2xpY3ktPnJlZ2lzdGVyU2VsZigpOworICAgIG1TZW5zb3JQcml2YWN5UG9saWN5ID0gbmV3IFNlbnNvclByaXZhY3lQb2xpY3kodGhpcyk7CisgICAgbVNlbnNvclByaXZhY3lQb2xpY3ktPnJlZ2lzdGVyU2VsZigpOworICAgIHNwPEhpZGxDYW1lcmFTZXJ2aWNlPiBoY3MgPSBIaWRsQ2FtZXJhU2VydmljZTo6Z2V0SW5zdGFuY2UodGhpcyk7CisgICAgaWYgKGhjcy0+cmVnaXN0ZXJBc1NlcnZpY2UoKSAhPSBhbmRyb2lkOjpPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWdpc3RlciBkZWZhdWx0IGFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMS4wIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICB9CiB9CiAKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OmVudW1lcmF0ZVByb3ZpZGVycygpIHsKQEAgLTIyMSw2ICsyMzMsNyBAQAogQ2FtZXJhU2VydmljZTo6fkNhbWVyYVNlcnZpY2UoKSB7CiAgICAgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y2xlYXJHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CiAgICAgbVVpZFBvbGljeS0+dW5yZWdpc3RlclNlbGYoKTsKKyAgICBtU2Vuc29yUHJpdmFjeVBvbGljeS0+dW5yZWdpc3RlclNlbGYoKTsKIH0KIAogdm9pZCBDYW1lcmFTZXJ2aWNlOjpvbk5ld1Byb3ZpZGVyUmVnaXN0ZXJlZCgpIHsKQEAgLTMzNyw3ICszNTAsNyBAQAogICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRCwKICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhc3t9KTsKICAgICAgICAgICAgIC8vIEVuc3VyZSBub3QgaW4gYmluZGVyIFJQQyBzbyBjbGllbnQgZGlzY29ubmVjdCBQSUQgY2hlY2tzIHdvcmsgY29ycmVjdGx5Ci0gICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGdldENhbGxpbmdQaWQoKSAhPSBnZXRwaWQoKSwKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSAhPSBnZXRwaWQoKSwKICAgICAgICAgICAgICAgICAgICAgIm9uRGV2aWNlU3RhdHVzQ2hhbmdlZCBtdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBjYW1lcmEgc2VydmljZSBwcm9jZXNzISIpOwogICAgICAgICAgICAgY2xpZW50VG9EaXNjb25uZWN0LT5kaXNjb25uZWN0KCk7CiAgICAgICAgIH0KQEAgLTQ5OCwxNyArNTExLDM3IEBACiAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgfQogCisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nVWlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiB0YWdzUmVtb3ZlZDsKKyAgICAvLyBJZiBpdCdzIG5vdCBjYWxsaW5nIGZyb20gY2FtZXJhc2VydmVyLCBjaGVjayB0aGUgcGVybWlzc2lvbi4KKyAgICBpZiAoKGNhbGxpbmdQaWQgIT0gZ2V0cGlkKCkpICYmCisgICAgICAgICAgICAhY2hlY2tQZXJtaXNzaW9uKFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FNRVJBIiksIGNhbGxpbmdQaWQsIGNhbGxpbmdVaWQpKSB7CisgICAgICAgIHJlcyA9IGNhbWVyYUluZm8tPnJlbW92ZVBlcm1pc3Npb25FbnRyaWVzKAorICAgICAgICAgICAgICAgIG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmdldFByb3ZpZGVyVGFnSWRMb2NrZWQoU3RyaW5nOChjYW1lcmFJZCkuc3RyaW5nKCkpLAorICAgICAgICAgICAgICAgICZ0YWdzUmVtb3ZlZCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIGNhbWVyYUluZm8tPmNsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgIkZhaWxlZCB0byByZW1vdmUgY2FtZXJhIgorICAgICAgICAgICAgICAgICAgICAiIGNoYXJhY3RlcmlzdGljcyBuZWVkaW5nIGNhbWVyYSBwZXJtaXNzaW9uIGZvciBkZXZpY2UgJXM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGNhbWVyYUlkKS5zdHJpbmcoKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXRhZ3NSZW1vdmVkLmVtcHR5KCkpIHsKKyAgICAgICAgcmVzID0gY2FtZXJhSW5mby0+dXBkYXRlKEFORFJPSURfUkVRVUVTVF9DSEFSQUNURVJJU1RJQ19LRVlTX05FRURJTkdfUEVSTUlTU0lPTiwKKyAgICAgICAgICAgICAgICB0YWdzUmVtb3ZlZC5kYXRhKCksIHRhZ3NSZW1vdmVkLnNpemUoKSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIGNhbWVyYUluZm8tPmNsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgIkZhaWxlZCB0byBpbnNlcnQgY2FtZXJhICIKKyAgICAgICAgICAgICAgICAgICAgImtleXMgbmVlZGluZyBwZXJtaXNzaW9uIGZvciBkZXZpY2UgJXM6ICVzICglZCkiLCBTdHJpbmc4KGNhbWVyYUlkKS5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIH0KKyAgICB9CisKICAgICByZXR1cm4gcmV0OwogfQogCi1pbnQgQ2FtZXJhU2VydmljZTo6Z2V0Q2FsbGluZ1BpZCgpIHsKLSAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotfQotCi1pbnQgQ2FtZXJhU2VydmljZTo6Z2V0Q2FsbGluZ1VpZCgpIHsKLSAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotfQotCiBTdHJpbmc4IENhbWVyYVNlcnZpY2U6OmdldEZvcm1hdHRlZEN1cnJlbnRUaW1lKCkgewogICAgIHRpbWVfdCBub3cgPSB0aW1lKG51bGxwdHIpOwogICAgIGNoYXIgZm9ybWF0dGVkVGltZVs2NF07CkBAIC01ODksNyArNjIyLDcgQEAKIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjptYWtlQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICBjb25zdCBzcDxJSW50ZXJmYWNlPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzE2JiBwYWNrYWdlTmFtZSwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGludCBmYWNpbmcsIGludCBjbGllbnRQaWQsIHVpZF90IGNsaWVudFVpZCwgaW50IHNlcnZpY2VQaWQsCi0gICAgICAgIGJvb2wgbGVnYWN5TW9kZSwgaW50IGhhbFZlcnNpb24sIGludCBkZXZpY2VWZXJzaW9uLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwKKyAgICAgICAgaW50IGhhbFZlcnNpb24sIGludCBkZXZpY2VWZXJzaW9uLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwKICAgICAgICAgLypvdXQqL3NwPEJhc2ljQ2xpZW50PiogY2xpZW50KSB7CiAKICAgICBpZiAoaGFsVmVyc2lvbiA8IDAgfHwgaGFsVmVyc2lvbiA9PSBkZXZpY2VWZXJzaW9uKSB7CkBAIC02MDEsNyArNjM0LDcgQEAKICAgICAgICAgICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PiB0bXAgPSBzdGF0aWNfY2FzdDxJQ2FtZXJhQ2xpZW50Kj4oY2FtZXJhQ2IuZ2V0KCkpOwogICAgICAgICAgICAgICAgICpjbGllbnQgPSBuZXcgQ2FtZXJhQ2xpZW50KGNhbWVyYVNlcnZpY2UsIHRtcCwgcGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBhcGkxQ2FtZXJhSWQsIGZhY2luZywgY2xpZW50UGlkLCBjbGllbnRVaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRwaWQoKSwgbGVnYWN5TW9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRwaWQoKSk7CiAgICAgICAgICAgICB9IGVsc2UgeyAvLyBDYW1lcmEyIEFQSSByb3V0ZQogICAgICAgICAgICAgICAgIEFMT0dXKCJDYW1lcmEgdXNpbmcgb2xkIEhBTCB2ZXJzaW9uOiAlZCIsIGRldmljZVZlcnNpb24pOwogICAgICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0RFUFJFQ0FURURfSEFMLApAQCAtNjE0LDEyICs2NDcsMTMgQEAKICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgogICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzM6CiAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNDoKKyAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM181OgogICAgICAgICAgICAgaWYgKGVmZmVjdGl2ZUFwaUxldmVsID09IEFQSV8xKSB7IC8vIENhbWVyYTEgQVBJIHJvdXRlCiAgICAgICAgICAgICAgICAgc3A8SUNhbWVyYUNsaWVudD4gdG1wID0gc3RhdGljX2Nhc3Q8SUNhbWVyYUNsaWVudCo+KGNhbWVyYUNiLmdldCgpKTsKICAgICAgICAgICAgICAgICAqY2xpZW50ID0gbmV3IENhbWVyYTJDbGllbnQoY2FtZXJhU2VydmljZSwgdG1wLCBwYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBhcGkxQ2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBmYWNpbmcsIGNsaWVudFBpZCwgY2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZVBpZCwgbGVnYWN5TW9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlUGlkKTsKICAgICAgICAgICAgIH0gZWxzZSB7IC8vIENhbWVyYTIgQVBJIHJvdXRlCiAgICAgICAgICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IHRtcCA9CiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcyo+KGNhbWVyYUNiLmdldCgpKTsKQEAgLTY0Myw3ICs2NzcsNyBAQAogICAgICAgICAgICAgc3A8SUNhbWVyYUNsaWVudD4gdG1wID0gc3RhdGljX2Nhc3Q8SUNhbWVyYUNsaWVudCo+KGNhbWVyYUNiLmdldCgpKTsKICAgICAgICAgICAgICpjbGllbnQgPSBuZXcgQ2FtZXJhQ2xpZW50KGNhbWVyYVNlcnZpY2UsIHRtcCwgcGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgIGFwaTFDYW1lcmFJZCwgZmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZVBpZCwgbGVnYWN5TW9kZSk7CisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VQaWQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gT3RoZXIgY29tYmluYXRpb25zIChlLmcuIEhBTDMueCBvcGVuIGFzIEhBTDIueCkgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0LgogICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgY2FtZXJhIEhBTCB2ZXJzaW9uICV4OiBIQUwgJXggZGV2aWNlIGNhbiBvbmx5IGJlIgpAQCAtNzMyLDcgKzc2Niw3IEBACiB9CiAKIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjppbml0aWFsaXplU2hpbU1ldGFkYXRhKGludCBjYW1lcmFJZCkgewotICAgIGludCB1aWQgPSBnZXRDYWxsaW5nVWlkKCk7CisgICAgaW50IHVpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CiAKICAgICBTdHJpbmcxNiBpbnRlcm5hbFBhY2thZ2VOYW1lKCJjYW1lcmFzZXJ2ZXIiKTsKICAgICBTdHJpbmc4IGlkID0gU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGNhbWVyYUlkKTsKQEAgLTc0Miw4ICs3NzYsNyBAQAogICAgICAgICAgICAgc3A8SUNhbWVyYUNsaWVudD57bnVsbHB0cn0sIGlkLCBjYW1lcmFJZCwKICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oQ0FNRVJBX0hBTF9BUElfVkVSU0lPTl9VTlNQRUNJRklFRCksCiAgICAgICAgICAgICBpbnRlcm5hbFBhY2thZ2VOYW1lLCB1aWQsIFVTRV9DQUxMSU5HX1BJRCwKLSAgICAgICAgICAgIEFQSV8xLCAvKmxlZ2FjeU1vZGUqLyBmYWxzZSwgLypzaGltVXBkYXRlT25seSovIHRydWUsCi0gICAgICAgICAgICAvKm91dCovIHRtcCkKKyAgICAgICAgICAgIEFQSV8xLCAvKnNoaW1VcGRhdGVPbmx5Ki8gdHJ1ZSwgLypvdXQqLyB0bXApCiAgICAgICAgICAgICApLmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IEVycm9yIGluaXRpYWxpemluZyBzaGltIG1ldGFkYXRhOiAlcyIsIF9fRlVOQ1RJT05fXywgcmV0LnRvU3RyaW5nOCgpLnN0cmluZygpKTsKICAgICB9CkBAIC03ODIsOSArODE1LDkgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgIGludDY0X3QgdG9rZW4gPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICByZXQgPSBpbml0aWFsaXplU2hpbU1ldGFkYXRhKGNhbWVyYUlkKTsKLSAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CiAgICAgaWYgKCFyZXQuaXNPaygpKSB7CiAgICAgICAgIC8vIEVycm9yIGFscmVhZHkgbG9nZ2VkIGJ5IGNhbGxlZQogICAgICAgICByZXR1cm4gcmV0OwpAQCAtODQxLDcgKzg3NCw3IEBACiAgICAgfQogI2VuZGlmICAvLyBfX0JSSUxMT19fCiAKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAKICAgICBpZiAoIW1Jbml0aWFsaXplZCkgewogICAgICAgICBBTE9HRSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChQSUQgJWQpIHJlamVjdGVkIChjYW1lcmEgSEFMIG1vZHVsZSBub3QgbG9hZGVkKSIsCkBAIC04NzUsOCArOTA4LDggQEAKIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjp2YWxpZGF0ZUNsaWVudFBlcm1pc3Npb25zTG9ja2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICBjb25zdCBTdHJpbmc4JiBjbGllbnROYW1lOCwgaW50JiBjbGllbnRVaWQsIGludCYgY2xpZW50UGlkLAogICAgICAgICAvKm91dCovaW50JiBvcmlnaW5hbENsaWVudFBpZCkgY29uc3QgewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOwotICAgIGludCBjYWxsaW5nVWlkID0gZ2V0Q2FsbGluZ1VpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1VpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CiAKICAgICAvLyBDaGVjayBpZiB3ZSBjYW4gdHJ1c3QgY2xpZW50VWlkCiAgICAgaWYgKGNsaWVudFVpZCA9PSBVU0VfQ0FMTElOR19VSUQpIHsKQEAgLTkyMiw2ICs5NTUsMTQgQEAKICAgICAgICAgICAgICAgICBjbGllbnROYW1lOC5zdHJpbmcoKSwgY2xpZW50VWlkLCBjbGllbnRQaWQsIGNhbWVyYUlkLnN0cmluZygpKTsKICAgICB9CiAKKyAgICAvLyBJZiBzZW5zb3IgcHJpdmFjeSBpcyBlbmFibGVkIHRoZW4gcHJldmVudCBhY2Nlc3MgdG8gdGhlIGNhbWVyYQorICAgIGlmIChtU2Vuc29yUHJpdmFjeVBvbGljeS0+aXNTZW5zb3JQcml2YWN5RW5hYmxlZCgpKSB7CisgICAgICAgIEFMT0dFKCJBY2Nlc3MgRGVuaWFsOiBjYW5ub3QgdXNlIHRoZSBjYW1lcmEgd2hlbiBzZW5zb3IgcHJpdmFjeSBpcyBlbmFibGVkIik7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0RJU0FCTEVELAorICAgICAgICAgICAgICAgICJDYWxsZXIgXCIlc1wiIChQSUQgJWQsIFVJRCAlZCkgY2Fubm90IG9wZW4gY2FtZXJhIFwiJXNcIiB3aGVuIHNlbnNvciBwcml2YWN5ICIKKyAgICAgICAgICAgICAgICAiaXMgZW5hYmxlZCIsIGNsaWVudE5hbWU4LnN0cmluZygpLCBjbGllbnRVaWQsIGNsaWVudFBpZCwgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgIH0KKwogICAgIC8vIE9ubHkgdXNlIHBhc3NlZCBpbiBjbGllbnRQaWQgdG8gY2hlY2sgcGVybWlzc2lvbi4gVXNlIGNhbGxpbmcgUElEIGFzIHRoZSBjbGllbnQgUElEIHRoYXQncwogICAgIC8vIGNvbm5lY3RlZCB0byBjYW1lcmEgc2VydmljZSBkaXJlY3RseS4KICAgICBvcmlnaW5hbENsaWVudFBpZCA9IGNsaWVudFBpZDsKQEAgLTk0NSw3ICs5ODYsNyBAQAogCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpjaGVja0lmRGV2aWNlSXNVc2FibGUoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQpIGNvbnN0IHsKICAgICBhdXRvIGNhbWVyYVN0YXRlID0gZ2V0Q2FtZXJhU3RhdGUoY2FtZXJhSWQpOwotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBpZiAoY2FtZXJhU3RhdGUgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChQSUQgJWQpIHJlamVjdGVkIChpbnZhbGlkIGNhbWVyYSBJRCAlcykiLCBjYWxsaW5nUGlkLAogICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpKTsKQEAgLTExNDksNyArMTE5MCw3IEBACiAgICAgbVNlcnZpY2VMb2NrLnVubG9jaygpOwogCiAgICAgLy8gQ2xlYXIgY2FsbGVyIGlkZW50aXR5IHRlbXBvcmFyaWx5IHNvIGNsaWVudCBkaXNjb25uZWN0IFBJRCBjaGVja3Mgd29yayBjb3JyZWN0bHkKLSAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICBpbnQ2NF90IHRva2VuID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAKICAgICAvLyBEZXN0cm95IGV2aWN0ZWQgY2xpZW50cwogICAgIGZvciAoYXV0byYgaSA6IGV2aWN0ZWRDbGllbnRzKSB7CkBAIC0xMTU3LDcgKzExOTgsNyBAQAogICAgICAgICBpLT5nZXRWYWx1ZSgpLT5kaXNjb25uZWN0KCk7IC8vIENsaWVudHMgd2lsbCByZW1vdmUgdGhlbXNlbHZlcyBmcm9tIHRoZSBhY3RpdmUgY2xpZW50IGxpc3QKICAgICB9CiAKLSAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CiAKICAgICBmb3IgKGNvbnN0IGF1dG8mIGkgOiBldmljdGVkQ2xpZW50cykgewogICAgICAgICBBTE9HVigiJXM6IFdhaXRpbmcgZm9yIGRpc2Nvbm5lY3QgdG8gY29tcGxldGUgZm9yIGNsaWVudCBmb3IgZGV2aWNlICVzIChQSUQgJSIgUFJJZDMyICIpIiwKQEAgLTEyMDcsMTEgKzEyNDgsMTAgQEAKICAgICBzcDxDbGllbnQ+IGNsaWVudCA9IG51bGxwdHI7CiAgICAgcmV0ID0gY29ubmVjdEhlbHBlcjxJQ2FtZXJhQ2xpZW50LENsaWVudD4oY2FtZXJhQ2xpZW50LCBpZCwgYXBpMUNhbWVyYUlkLAogICAgICAgICAgICAgQ0FNRVJBX0hBTF9BUElfVkVSU0lPTl9VTlNQRUNJRklFRCwgY2xpZW50UGFja2FnZU5hbWUsIGNsaWVudFVpZCwgY2xpZW50UGlkLCBBUElfMSwKLSAgICAgICAgICAgIC8qbGVnYWN5TW9kZSovIGZhbHNlLCAvKnNoaW1VcGRhdGVPbmx5Ki8gZmFsc2UsCi0gICAgICAgICAgICAvKm91dCovY2xpZW50KTsKKyAgICAgICAgICAgIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwgLypvdXQqL2NsaWVudCk7CiAKICAgICBpZighcmV0LmlzT2soKSkgewotICAgICAgICBsb2dSZWplY3RlZChpZCwgZ2V0Q2FsbGluZ1BpZCgpLCBTdHJpbmc4KGNsaWVudFBhY2thZ2VOYW1lKSwKKyAgICAgICAgbG9nUmVqZWN0ZWQoaWQsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWUpLAogICAgICAgICAgICAgICAgIHJldC50b1N0cmluZzgoKSk7CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQpAQCAtMTIzNCwxMiArMTI3NCwxMSBAQAogICAgIFN0YXR1cyByZXQgPSBTdGF0dXM6Om9rKCk7CiAgICAgc3A8Q2xpZW50PiBjbGllbnQgPSBudWxscHRyOwogICAgIHJldCA9IGNvbm5lY3RIZWxwZXI8SUNhbWVyYUNsaWVudCxDbGllbnQ+KGNhbWVyYUNsaWVudCwgaWQsIGFwaTFDYW1lcmFJZCwgaGFsVmVyc2lvbiwKLSAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLCBjbGllbnRVaWQsIFVTRV9DQUxMSU5HX1BJRCwgQVBJXzEsCi0gICAgICAgICAgICAvKmxlZ2FjeU1vZGUqLyB0cnVlLCAvKnNoaW1VcGRhdGVPbmx5Ki8gZmFsc2UsCisgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwgY2xpZW50VWlkLCBVU0VfQ0FMTElOR19QSUQsIEFQSV8xLCAvKnNoaW1VcGRhdGVPbmx5Ki8gZmFsc2UsCiAgICAgICAgICAgICAvKm91dCovY2xpZW50KTsKIAogICAgIGlmKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgIGxvZ1JlamVjdGVkKGlkLCBnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWUpLAorICAgICAgICBsb2dSZWplY3RlZChpZCwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSksCiAgICAgICAgICAgICAgICAgcmV0LnRvU3RyaW5nOCgpKTsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CkBAIC0xMjYzLDEyICsxMzAyLDEwIEBACiAgICAgcmV0ID0gY29ubmVjdEhlbHBlcjxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcyxDYW1lcmFEZXZpY2VDbGllbnQ+KGNhbWVyYUNiLCBpZCwKICAgICAgICAgICAgIC8qYXBpMUNhbWVyYUlkKi8tMSwKICAgICAgICAgICAgIENBTUVSQV9IQUxfQVBJX1ZFUlNJT05fVU5TUEVDSUZJRUQsIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgY2xpZW50VWlkLCBVU0VfQ0FMTElOR19QSUQsIEFQSV8yLAotICAgICAgICAgICAgLypsZWdhY3lNb2RlKi8gZmFsc2UsIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwKLSAgICAgICAgICAgIC8qb3V0Ki9jbGllbnQpOworICAgICAgICAgICAgY2xpZW50VWlkLCBVU0VfQ0FMTElOR19QSUQsIEFQSV8yLCAvKnNoaW1VcGRhdGVPbmx5Ki8gZmFsc2UsIC8qb3V0Ki9jbGllbnQpOwogCiAgICAgaWYoIXJldC5pc09rKCkpIHsKLSAgICAgICAgbG9nUmVqZWN0ZWQoaWQsIGdldENhbGxpbmdQaWQoKSwgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSksCisgICAgICAgIGxvZ1JlamVjdGVkKGlkLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBTdHJpbmc4KGNsaWVudFBhY2thZ2VOYW1lKSwKICAgICAgICAgICAgICAgICByZXQudG9TdHJpbmc4KCkpOwogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KQEAgLTEyODAsNyArMTMxNyw3IEBACiB0ZW1wbGF0ZTxjbGFzcyBDQUxMQkFDSywgY2xhc3MgQ0xJRU5UPgogU3RhdHVzIENhbWVyYVNlcnZpY2U6OmNvbm5lY3RIZWxwZXIoY29uc3Qgc3A8Q0FMTEJBQ0s+JiBjYW1lcmFDYiwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGludCBoYWxWZXJzaW9uLCBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsIGludCBjbGllbnRVaWQsCi0gICAgICAgIGludCBjbGllbnRQaWQsIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLCBib29sIGxlZ2FjeU1vZGUsIGJvb2wgc2hpbVVwZGF0ZU9ubHksCisgICAgICAgIGludCBjbGllbnRQaWQsIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLCBib29sIHNoaW1VcGRhdGVPbmx5LAogICAgICAgICAvKm91dCovc3A8Q0xJRU5UPiYgZGV2aWNlKSB7CiAgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiAKQEAgLTEzNjUsNyArMTQwMiw3IEBACiAgICAgICAgIHNwPEJhc2ljQ2xpZW50PiB0bXAgPSBudWxscHRyOwogICAgICAgICBpZighKHJldCA9IG1ha2VDbGllbnQodGhpcywgY2FtZXJhQ2IsIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBhcGkxQ2FtZXJhSWQsIGZhY2luZywKLSAgICAgICAgICAgICAgICBjbGllbnRQaWQsIGNsaWVudFVpZCwgZ2V0cGlkKCksIGxlZ2FjeU1vZGUsCisgICAgICAgICAgICAgICAgY2xpZW50UGlkLCBjbGllbnRVaWQsIGdldHBpZCgpLAogICAgICAgICAgICAgICAgIGhhbFZlcnNpb24sIGRldmljZVZlcnNpb24sIGVmZmVjdGl2ZUFwaUxldmVsLAogICAgICAgICAgICAgICAgIC8qb3V0Ki8mdG1wKSkuaXNPaygpKSB7CiAgICAgICAgICAgICByZXR1cm4gcmV0OwpAQCAtMTQ0OSw3ICsxNDg2LDcgQEAKICAgICB9CiAKICAgICBTdHJpbmc4IGlkID0gU3RyaW5nOChjYW1lcmFJZC5zdHJpbmcoKSk7Ci0gICAgaW50IHVpZCA9IGdldENhbGxpbmdVaWQoKTsKKyAgICBpbnQgdWlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKTsKIAogICAgIC8vIHZlcmlmeSBpZCBpcyB2YWxpZC4KICAgICBhdXRvIHN0YXRlID0gZ2V0Q2FtZXJhU3RhdGUoaWQpOwpAQCAtMTU1Niw3ICsxNTkzLDcgQEAKIAogU3RhdHVzIENhbWVyYVNlcnZpY2U6Om5vdGlmeVN5c3RlbUV2ZW50KGludDMyX3QgZXZlbnRJZCwKICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGFyZ3MpIHsKLSAgICBjb25zdCBpbnQgcGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGNvbnN0IGludCBwaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGNvbnN0IGludCBzZWxmUGlkID0gZ2V0cGlkKCk7CiAKICAgICAvLyBQZXJtaXNzaW9uIGNoZWNrcwpAQCAtMTU2NSw3ICsxNjAyLDcgQEAKICAgICAgICAgLy8gcGVybWlzc2lvbnMgdG8gbm90aWZ5IHRoZSBjYW1lcmEgc2VydmljZSBhYm91dCBzeXN0ZW0gZXZlbnRzCiAgICAgICAgIGlmICghY2hlY2tDYWxsaW5nUGVybWlzc2lvbigKICAgICAgICAgICAgICAgICBTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQV9TRU5EX1NZU1RFTV9FVkVOVFMiKSkpIHsKLSAgICAgICAgICAgIGNvbnN0IGludCB1aWQgPSBnZXRDYWxsaW5nVWlkKCk7CisgICAgICAgICAgICBjb25zdCBpbnQgdWlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKTsKICAgICAgICAgICAgIEFMT0dFKCJQZXJtaXNzaW9uIERlbmlhbDogY2Fubm90IHNlbmQgdXBkYXRlcyB0byBjYW1lcmEgc2VydmljZSBhYm91dCBzeXN0ZW0iCiAgICAgICAgICAgICAgICAgICAgICIgZXZlbnRzIGZyb20gcGlkPSVkLCB1aWQ9JWQiLCBwaWQsIHVpZCk7CiAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9QRVJNSVNTSU9OX0RFTklFRCwKQEAgLTE1NzgsOSArMTYxNSwxMCBAQAogCiAgICAgc3dpdGNoKGV2ZW50SWQpIHsKICAgICAgICAgY2FzZSBJQ2FtZXJhU2VydmljZTo6RVZFTlRfVVNFUl9TV0lUQ0hFRDogewotICAgICAgICAgICAgLy8gVHJ5IHRvIHJlZ2lzdGVyIGZvciBVSUQgcG9saWN5IHVwZGF0ZXMsIGluIGNhc2Ugd2UncmUgcmVjb3ZlcmluZworICAgICAgICAgICAgLy8gVHJ5IHRvIHJlZ2lzdGVyIGZvciBVSUQgYW5kIHNlbnNvciBwcml2YWN5IHBvbGljeSB1cGRhdGVzLCBpbiBjYXNlIHdlJ3JlIHJlY292ZXJpbmcKICAgICAgICAgICAgIC8vIGZyb20gYSBzeXN0ZW0gc2VydmVyIGNyYXNoCiAgICAgICAgICAgICBtVWlkUG9saWN5LT5yZWdpc3RlclNlbGYoKTsKKyAgICAgICAgICAgIG1TZW5zb3JQcml2YWN5UG9saWN5LT5yZWdpc3RlclNlbGYoKTsKICAgICAgICAgICAgIGRvVXNlclN3aXRjaCgvKm5ld1VzZXJJZHMqLyBhcmdzKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xNzE3LDcgKzE3NTUsNyBAQAogICAgIH0KIAogICAgIGludCBkZXZpY2VWZXJzaW9uID0gZ2V0RGV2aWNlVmVyc2lvbihpZCk7Ci0gICAgc3dpdGNoKGRldmljZVZlcnNpb24pIHsKKyAgICBzd2l0Y2ggKGRldmljZVZlcnNpb24pIHsKICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMDoKICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMDoKICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMToKQEAgLTE3MzQsNiArMTc3Miw3IEBACiAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzI6CiAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzM6CiAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzQ6CisgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzU6CiAgICAgICAgICAgICBBTE9HVigiJXM6IENhbWVyYSBpZCAlcyB1c2VzIEhBTDMuMiBvciBuZXdlciwgc3VwcG9ydHMgYXBpMS9hcGkyIGRpcmVjdGx5IiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5zdHJpbmcoKSk7CiAgICAgICAgICAgICAqaXNTdXBwb3J0ZWQgPSB0cnVlOwpAQCAtMTc1NCw2ICsxNzkzLDE4IEBACiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAorU3RhdHVzIENhbWVyYVNlcnZpY2U6OmlzSGlkZGVuUGh5c2ljYWxDYW1lcmEoY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLAorICAgICAgICAvKm91dCovIGJvb2wgKmlzU3VwcG9ydGVkKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKworICAgIGNvbnN0IFN0cmluZzggaWQgPSBTdHJpbmc4KGNhbWVyYUlkKTsKKworICAgIEFMT0dWKCIlczogZm9yIGNhbWVyYSBJRCA9ICVzIiwgX19GVU5DVElPTl9fLCBpZC5zdHJpbmcoKSk7CisgICAgKmlzU3VwcG9ydGVkID0gbUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+aXNIaWRkZW5QaHlzaWNhbENhbWVyYShpZC5zdHJpbmcoKSk7CisKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCiB2b2lkIENhbWVyYVNlcnZpY2U6OnJlbW92ZUJ5Q2xpZW50KGNvbnN0IEJhc2ljQ2xpZW50KiBjbGllbnQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOwogICAgIGZvciAoYXV0byYgaSA6IG1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldEFsbCgpKSB7CkBAIC0xOTAxLDEzICsxOTUyLDEzIEBACiAgICAgbVNlcnZpY2VMb2NrLnVubG9jaygpOwogCiAgICAgLy8gQ2xlYXIgY2FsbGVyIGlkZW50aXR5IHRlbXBvcmFyaWx5IHNvIGNsaWVudCBkaXNjb25uZWN0IFBJRCBjaGVja3Mgd29yayBjb3JyZWN0bHkKLSAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICBpbnQ2NF90IHRva2VuID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAKICAgICBmb3IgKGF1dG8mIGkgOiBldmljdGVkKSB7CiAgICAgICAgIGktPmRpc2Nvbm5lY3QoKTsKICAgICB9CiAKLSAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CiAKICAgICAvLyBSZWFjcXVpcmUgbVNlcnZpY2VMb2NrCiAgICAgbVNlcnZpY2VMb2NrLmxvY2soKTsKQEAgLTE5NzUsNyArMjAyNiw2IEBACiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwKICAgICAgICAgdWludDMyX3QgZmxhZ3MpIHsKIAotCiAgICAgLy8gUGVybWlzc2lvbiBjaGVja3MKICAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgICAgY2FzZSBTSEVMTF9DT01NQU5EX1RSQU5TQUNUSU9OOiB7CkBAIC0yMDkxLDcgKzIxNDEsNyBAQAogICAgICAgICAgICAgICAgIHNlcnZpY2VQaWQpLAogICAgICAgICBtQ2FtZXJhSWQoYXBpMUNhbWVyYUlkKQogewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBMT0cxKCJDbGllbnQ6OkNsaWVudCBFIChwaWQgJWQsIGlkICVkKSIsIGNhbGxpbmdQaWQsIG1DYW1lcmFJZCk7CiAKICAgICBtUmVtb3RlQ2FsbGJhY2sgPSBjYW1lcmFDbGllbnQ7CkBAIC0yMTc4LDYgKzIyMjgsOCBAQAogICAgIHNDYW1lcmFTZXJ2aWNlLT5yZW1vdmVCeUNsaWVudCh0aGlzKTsKICAgICBzQ2FtZXJhU2VydmljZS0+bG9nRGlzY29ubmVjdGVkKG1DYW1lcmFJZFN0ciwgbUNsaWVudFBpZCwKICAgICAgICAgICAgIFN0cmluZzgobUNsaWVudFBhY2thZ2VOYW1lKSk7CisgICAgc0NhbWVyYVNlcnZpY2UtPm1DYW1lcmFQcm92aWRlck1hbmFnZXItPnJlbW92ZVJlZihDYW1lcmFQcm92aWRlck1hbmFnZXI6OkRldmljZU1vZGU6OkNBTUVSQSwKKyAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5jX3N0cigpKTsKIAogICAgIHNwPElCaW5kZXI+IHJlbW90ZSA9IGdldFJlbW90ZSgpOwogICAgIGlmIChyZW1vdGUgIT0gbnVsbHB0cikgewpAQCAtMjIwMCw3ICsyMjUyLDcgQEAKICAgICAvLyBObyBkdW1waW5nIG9mIGNsaWVudHMgZGlyZWN0bHkgb3ZlciBCaW5kZXIsCiAgICAgLy8gbXVzdCBnbyB0aHJvdWdoIENhbWVyYVNlcnZpY2U6OmR1bXAKICAgICBhbmRyb2lkX2Vycm9yV3JpdGVXaXRoSW5mb0xvZyhTTl9FVkVOVF9MT0dfSUQsICIyNjI2NTQwMyIsCi0gICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCksIE5VTEwsIDApOworICAgICAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKSwgTlVMTCwgMCk7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0yMzM3LDcgKzIzODksNyBAQAogCiAgICAgLy8gUmVzZXQgdGhlIGNsaWVudCBQSUQgdG8gYWxsb3cgc2VydmVyLWluaXRpYXRlZCBkaXNjb25uZWN0LAogICAgIC8vIGFuZCB0byBwcmV2ZW50IGZ1cnRoZXIgY2FsbHMgYnkgY2xpZW50LgotICAgIG1DbGllbnRQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgbUNsaWVudFBpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXM7IC8vIGEgZHVtbXkgcmVzdWx0IChpbnZhbGlkKQogICAgIG5vdGlmeUVycm9yKGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfRElTQUJMRUQsIHJlc3VsdEV4dHJhcyk7CiAgICAgZGlzY29ubmVjdCgpOwpAQCAtMjUzOCw2ICsyNTkwLDU5IEBACiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgICAgICAgICAgICAgU2Vuc29yUHJpdmFjeVBvbGljeQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCBDYW1lcmFTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5OjpyZWdpc3RlclNlbGYoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TZW5zb3JQcml2YWN5TG9jayk7CisgICAgaWYgKG1SZWdpc3RlcmVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgU2Vuc29yUHJpdmFjeU1hbmFnZXIgc3BtOworICAgIHNwbS5hZGRTZW5zb3JQcml2YWN5TGlzdGVuZXIodGhpcyk7CisgICAgbVNlbnNvclByaXZhY3lFbmFibGVkID0gc3BtLmlzU2Vuc29yUHJpdmFjeUVuYWJsZWQoKTsKKyAgICBzdGF0dXNfdCByZXMgPSBzcG0ubGlua1RvRGVhdGgodGhpcyk7CisgICAgaWYgKHJlcyA9PSBPSykgeworICAgICAgICBtUmVnaXN0ZXJlZCA9IHRydWU7CisgICAgICAgIEFMT0dWKCJTZW5zb3JQcml2YWN5UG9saWN5OiBSZWdpc3RlcmVkIHdpdGggU2Vuc29yUHJpdmFjeU1hbmFnZXIiKTsKKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6dW5yZWdpc3RlclNlbGYoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TZW5zb3JQcml2YWN5TG9jayk7CisgICAgU2Vuc29yUHJpdmFjeU1hbmFnZXIgc3BtOworICAgIHNwbS5yZW1vdmVTZW5zb3JQcml2YWN5TGlzdGVuZXIodGhpcyk7CisgICAgc3BtLnVubGlua1RvRGVhdGgodGhpcyk7CisgICAgbVJlZ2lzdGVyZWQgPSBmYWxzZTsKKyAgICBBTE9HVigiU2Vuc29yUHJpdmFjeVBvbGljeTogVW5yZWdpc3RlcmVkIHdpdGggU2Vuc29yUHJpdmFjeU1hbmFnZXIiKTsKK30KKworYm9vbCBDYW1lcmFTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5Ojppc1NlbnNvclByaXZhY3lFbmFibGVkKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vuc29yUHJpdmFjeUxvY2spOworICAgIHJldHVybiBtU2Vuc29yUHJpdmFjeUVuYWJsZWQ7Cit9CisKK2JpbmRlcjo6U3RhdHVzIENhbWVyYVNlcnZpY2U6OlNlbnNvclByaXZhY3lQb2xpY3k6Om9uU2Vuc29yUHJpdmFjeUNoYW5nZWQoYm9vbCBlbmFibGVkKSB7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNlbnNvclByaXZhY3lMb2NrKTsKKyAgICAgICAgbVNlbnNvclByaXZhY3lFbmFibGVkID0gZW5hYmxlZDsKKyAgICB9CisgICAgLy8gaWYgc2Vuc29yIHByaXZhY3kgaXMgZW5hYmxlZCB0aGVuIGJsb2NrIGFsbCBjbGllbnRzIGZyb20gYWNjZXNzaW5nIHRoZSBjYW1lcmEKKyAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICBzcDxDYW1lcmFTZXJ2aWNlPiBzZXJ2aWNlID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgICAgICBpZiAoc2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzZXJ2aWNlLT5ibG9ja0FsbENsaWVudHMoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgLyp3aG8qLykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vuc29yUHJpdmFjeUxvY2spOworICAgIEFMT0dWKCJTZW5zb3JQcml2YWN5UG9saWN5OiBTZW5zb3JQcml2YWN5TWFuYWdlciBoYXMgZGllZCIpOworICAgIG1SZWdpc3RlcmVkID0gZmFsc2U7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vICAgICAgICAgICAgICAgICAgQ2FtZXJhU3RhdGUKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMjY5OCw4ICsyODAzLDggQEAKIAogICAgIGlmIChjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpKSA9PSBmYWxzZSkgewogICAgICAgICBkcHJpbnRmKGZkLCAiUGVybWlzc2lvbiBEZW5pYWw6IGNhbid0IGR1bXAgQ2FtZXJhU2VydmljZSBmcm9tIHBpZD0lZCwgdWlkPSVkXG4iLAotICAgICAgICAgICAgICAgIGdldENhbGxpbmdQaWQoKSwKLSAgICAgICAgICAgICAgICBnZXRDYWxsaW5nVWlkKCkpOworICAgICAgICAgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksCisgICAgICAgICAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKSk7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAgICAgYm9vbCBsb2NrZWQgPSB0cnlMb2NrKG1TZXJ2aWNlTG9jayk7CkBAIC0yODcyLDcgKzI5NzcsNyBAQAogICAgICAgKiBiaW5kZXIgZHJpdmVyCiAgICAgICAqLwogICAgIC8vIFBJRCBoZXJlIGlzIGFwcHJveGltYXRlIGFuZCBjYW4gYmUgd3JvbmcuCi0gICAgbG9nQ2xpZW50RGllZChnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoIkJpbmRlciBkaWVkIHVuZXhwZWN0ZWRseSIpKTsKKyAgICBsb2dDbGllbnREaWVkKENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoIkJpbmRlciBkaWVkIHVuZXhwZWN0ZWRseSIpKTsKIAogICAgIC8vIGNoZWNrIHRvcmNoIGNsaWVudAogICAgIGhhbmRsZVRvcmNoQ2xpZW50QmluZGVyRGllZCh3aG8pOwpAQCAtMzAyMyw2ICszMTI4LDE4IEBACiAgICAgfQogfQogCit2b2lkIENhbWVyYVNlcnZpY2U6OmJsb2NrQWxsQ2xpZW50cygpIHsKKyAgICBjb25zdCBhdXRvIGNsaWVudHMgPSBtQWN0aXZlQ2xpZW50TWFuYWdlci5nZXRBbGwoKTsKKyAgICBmb3IgKGF1dG8mIGN1cnJlbnQgOiBjbGllbnRzKSB7CisgICAgICAgIGlmIChjdXJyZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gYmFzaWNDbGllbnQgPSBjdXJyZW50LT5nZXRWYWx1ZSgpOworICAgICAgICAgICAgaWYgKGJhc2ljQ2xpZW50LmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBiYXNpY0NsaWVudC0+YmxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwogLy8gTk9URTogVGhpcyBpcyBhIHJlbW90ZSBBUEkgLSBtYWtlIHN1cmUgYWxsIGFyZ3MgYXJlIHZhbGlkYXRlZAogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6c2hlbGxDb21tYW5kKGludCBpbiwgaW50IG91dCwgaW50IGVyciwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgewogICAgIGlmICghY2hlY2tDYWxsaW5nUGVybWlzc2lvbihzTWFuYWdlQ2FtZXJhUGVybWlzc2lvbiwgbnVsbHB0ciwgbnVsbHB0cikpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaAppbmRleCA2MjRkMWNhLi5hMjk2MTk4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBU0VSVklDRV9ICiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0JuQ2FtZXJhU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvQm5TZW5zb3JQcml2YWN5TGlzdGVuZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlUHJveHkuaD4KIApAQCAtMTU5LDYgKzE2MCwxMSBAQAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpOwogCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyAgICBpc0hpZGRlblBoeXNpY2FsQ2FtZXJhKAorICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLAorICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpOworCiAgICAgLy8gRXh0cmEgcGVybWlzc2lvbnMgY2hlY2tzCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpOwpAQCAtNTMxLDYgKzUzNyw3IEBACiAgICAgICAgIHZvaWQgb25VaWRHb25lKHVpZF90IHVpZCwgYm9vbCBkaXNhYmxlZCk7CiAgICAgICAgIHZvaWQgb25VaWRBY3RpdmUodWlkX3QgdWlkKTsKICAgICAgICAgdm9pZCBvblVpZElkbGUodWlkX3QgdWlkLCBib29sIGRpc2FibGVkKTsKKyAgICAgICAgdm9pZCBvblVpZFN0YXRlQ2hhbmdlZCh1aWRfdCB1aWQgX191bnVzZWQsIGludDMyX3QgcHJvY1N0YXRlIF9fdW51c2VkLCBpbnQ2NF90IHByb2NTdGF0ZVNlcSBfX3VudXNlZCkge30KIAogICAgICAgICB2b2lkIGFkZE92ZXJyaWRlVWlkKHVpZF90IHVpZCwgU3RyaW5nMTYgY2FsbGluZ1BhY2thZ2UsIGJvb2wgYWN0aXZlKTsKICAgICAgICAgdm9pZCByZW1vdmVPdmVycmlkZVVpZCh1aWRfdCB1aWQsIFN0cmluZzE2IGNhbGxpbmdQYWNrYWdlKTsKQEAgLTU0OCw4ICs1NTUsMzUgQEAKICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBib29sPiBtT3ZlcnJpZGVVaWRzOwogICAgIH07IC8vIGNsYXNzIFVpZFBvbGljeQogCisgICAgLy8gSWYgc2Vuc29yIHByaXZhY3kgaXMgZW5hYmxlZCB0aGVuIGFsbCBhcHBzLCBpbmNsdWRpbmcgdGhvc2UgdGhhdCBhcmUgYWN0aXZlLCBzaG91bGQgYmUKKyAgICAvLyBwcmV2ZW50ZWQgZnJvbSBhY2Nlc3NpbmcgdGhlIGNhbWVyYS4KKyAgICBjbGFzcyBTZW5zb3JQcml2YWN5UG9saWN5IDogcHVibGljIGhhcmR3YXJlOjpCblNlbnNvclByaXZhY3lMaXN0ZW5lciwKKyAgICAgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgZXhwbGljaXQgU2Vuc29yUHJpdmFjeVBvbGljeSh3cDxDYW1lcmFTZXJ2aWNlPiBzZXJ2aWNlKQorICAgICAgICAgICAgICAgICAgICA6IG1TZXJ2aWNlKHNlcnZpY2UpLCBtU2Vuc29yUHJpdmFjeUVuYWJsZWQoZmFsc2UpLCBtUmVnaXN0ZXJlZChmYWxzZSkge30KKworICAgICAgICAgICAgdm9pZCByZWdpc3RlclNlbGYoKTsKKyAgICAgICAgICAgIHZvaWQgdW5yZWdpc3RlclNlbGYoKTsKKworICAgICAgICAgICAgYm9vbCBpc1NlbnNvclByaXZhY3lFbmFibGVkKCk7CisKKyAgICAgICAgICAgIGJpbmRlcjo6U3RhdHVzIG9uU2Vuc29yUHJpdmFjeUNoYW5nZWQoYm9vbCBlbmFibGVkKTsKKworICAgICAgICAgICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8pOworCisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICB3cDxDYW1lcmFTZXJ2aWNlPiBtU2VydmljZTsKKyAgICAgICAgICAgIE11dGV4IG1TZW5zb3JQcml2YWN5TG9jazsKKyAgICAgICAgICAgIGJvb2wgbVNlbnNvclByaXZhY3lFbmFibGVkOworICAgICAgICAgICAgYm9vbCBtUmVnaXN0ZXJlZDsKKyAgICB9OworCiAgICAgc3A8VWlkUG9saWN5PiBtVWlkUG9saWN5OwogCisgICAgc3A8U2Vuc29yUHJpdmFjeVBvbGljeT4gbVNlbnNvclByaXZhY3lQb2xpY3k7CisKICAgICAvLyBEZWxheS1sb2FkIHRoZSBDYW1lcmEgSEFMIG1vZHVsZQogICAgIHZpcnR1YWwgdm9pZCBvbkZpcnN0UmVmKCk7CiAKQEAgLTU4NSw4ICs2MTksNyBAQAogICAgIHRlbXBsYXRlPGNsYXNzIENBTExCQUNLLCBjbGFzcyBDTElFTlQ+CiAgICAgYmluZGVyOjpTdGF0dXMgY29ubmVjdEhlbHBlcihjb25zdCBzcDxDQUxMQkFDSz4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGludCBoYWxWZXJzaW9uLCBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICBpbnQgY2xpZW50VWlkLCBpbnQgY2xpZW50UGlkLAotICAgICAgICAgICAgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsIGJvb2wgbGVnYWN5TW9kZSwgYm9vbCBzaGltVXBkYXRlT25seSwKKyAgICAgICAgICAgIGludCBjbGllbnRVaWQsIGludCBjbGllbnRQaWQsIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLCBib29sIHNoaW1VcGRhdGVPbmx5LAogICAgICAgICAgICAgLypvdXQqL3NwPENMSUVOVD4mIGRldmljZSk7CiAKICAgICAvLyBMb2NrIGd1YXJkaW5nIGNhbWVyYSBzZXJ2aWNlIHN0YXRlCkBAIC04MjAsNiArODUzLDkgQEAKICAgICAvLyBCbG9ja3MgYWxsIGNsaWVudHMgZnJvbSB0aGUgVUlECiAgICAgdm9pZCBibG9ja0NsaWVudHNGb3JVaWQodWlkX3QgdWlkKTsKIAorICAgIC8vIEJsb2NrcyBhbGwgYWN0aXZlIGNsaWVudHMuCisgICAgdm9pZCBibG9ja0FsbENsaWVudHMoKTsKKwogICAgIC8vIE92ZXJyaWRlcyB0aGUgVUlEIHN0YXRlIGFzIGlmIGl0IGlzIGlkbGUKICAgICBzdGF0dXNfdCBoYW5kbGVTZXRVaWRTdGF0ZShjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzLCBpbnQgZXJyKTsKIApAQCAtODMyLDEwICs4NjgsNiBAQAogICAgIC8vIFByaW50cyB0aGUgc2hlbGwgY29tbWFuZCBoZWxwCiAgICAgc3RhdHVzX3QgcHJpbnRIZWxwKGludCBvdXQpOwogCi0gICAgc3RhdGljIGludCBnZXRDYWxsaW5nUGlkKCk7Ci0KLSAgICBzdGF0aWMgaW50IGdldENhbGxpbmdVaWQoKTsKLQogICAgIC8qKgogICAgICAqIEdldCB0aGUgY3VycmVudCBzeXN0ZW0gdGltZSBhcyBhIGZvcm1hdHRlZCBzdHJpbmcuCiAgICAgICovCkBAIC04NDQsNyArODc2LDcgQEAKICAgICBzdGF0aWMgYmluZGVyOjpTdGF0dXMgbWFrZUNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IHNwPElJbnRlcmZhY2U+JiBjYW1lcmFDYiwgY29uc3QgU3RyaW5nMTYmIHBhY2thZ2VOYW1lLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGludCBmYWNpbmcsIGludCBjbGllbnRQaWQsIHVpZF90IGNsaWVudFVpZCwgaW50IHNlcnZpY2VQaWQsCi0gICAgICAgICAgICBib29sIGxlZ2FjeU1vZGUsIGludCBoYWxWZXJzaW9uLCBpbnQgZGV2aWNlVmVyc2lvbiwgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsCisgICAgICAgICAgICBpbnQgaGFsVmVyc2lvbiwgaW50IGRldmljZVZlcnNpb24sIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLAogICAgICAgICAgICAgLypvdXQqL3NwPEJhc2ljQ2xpZW50PiogY2xpZW50KTsKIAogICAgIHN0YXR1c190IGNoZWNrQ2FtZXJhQWNjZXNzKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL1RFU1RfTUFQUElORyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL1RFU1RfTUFQUElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmRhYzY4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvVEVTVF9NQVBQSU5HCkBAIC0wLDAgKzEsNyBAQAoreworICAicHJlc3VibWl0IjogWworICAgIHsKKyAgICAgICAibmFtZSI6ICJjYW1lcmFzZXJ2aWNlX3Rlc3QiCisgICAgfQorICBdCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcAppbmRleCA4YmIyNGQ0Li5jOWMyMTZiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlICJhcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5oIgogI2luY2x1ZGUgImFwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5oIgogI2luY2x1ZGUgImFwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuaCIKKyNpbmNsdWRlICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIgogCiAjZGVmaW5lIEFMT0cxKC4uLikgQUxPR0RfSUYoZ0xvZ0xldmVsID49IDEsIF9fVkFfQVJHU19fKTsKICNkZWZpbmUgQUxPRzIoLi4uKSBBTE9HRF9JRihnTG9nTGV2ZWwgPj0gMiwgX19WQV9BUkdTX18pOwpAQCAtNDQsMTAgKzQ1LDYgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIHVzaW5nIG5hbWVzcGFjZSBjYW1lcmEyOwogCi1zdGF0aWMgaW50IGdldENhbGxpbmdQaWQoKSB7Ci0gICAgcmV0dXJuIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKLX0KLQogLy8gSW50ZXJmYWNlIHVzZWQgYnkgQ2FtZXJhU2VydmljZQogCiBDYW1lcmEyQ2xpZW50OjpDYW1lcmEyQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLApAQCAtNTgsOCArNTUsNyBAQAogICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICBpbnQgY2xpZW50UGlkLAogICAgICAgICB1aWRfdCBjbGllbnRVaWQsCi0gICAgICAgIGludCBzZXJ2aWNlUGlkLAotICAgICAgICBib29sIGxlZ2FjeU1vZGUpOgorICAgICAgICBpbnQgc2VydmljZVBpZCk6CiAgICAgICAgIENhbWVyYTJDbGllbnRCYXNlKGNhbWVyYVNlcnZpY2UsIGNhbWVyYUNsaWVudCwgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgY2FtZXJhRGV2aWNlSWQsIGFwaTFDYW1lcmFJZCwgY2FtZXJhRmFjaW5nLAogICAgICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKSwKQEAgLTY5LDggKzY1LDYgQEAKIAogICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChtUGFyYW1ldGVycyk7CiAgICAgbC5tUGFyYW1ldGVycy5zdGF0ZSA9IFBhcmFtZXRlcnM6OkRJU0NPTk5FQ1RFRDsKLQotICAgIG1MZWdhY3lNb2RlID0gbGVnYWN5TW9kZTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhMkNsaWVudDo6aW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsIGNvbnN0IFN0cmluZzgmIG1vbml0b3JUYWdzKSB7CkBAIC00MDUsNyArMzk5LDcgQEAKIAogICAgIGJpbmRlcjo6U3RhdHVzIHJlcyA9IGJpbmRlcjo6U3RhdHVzOjpvaygpOwogICAgIC8vIEFsbG93IGJvdGggY2xpZW50IGFuZCB0aGUgY2FtZXJhc2VydmVyIHRvIGRpc2Nvbm5lY3QgYXQgYWxsIHRpbWVzCi0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGlmIChjYWxsaW5nUGlkICE9IG1DbGllbnRQaWQgJiYgY2FsbGluZ1BpZCAhPSBtU2VydmljZVBpZCkgcmV0dXJuIHJlczsKIAogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiByZXM7CkBAIC00NjAsOCArNDU0LDYgQEAKIAogICAgIG1EZXZpY2UtPmRpc2Nvbm5lY3QoKTsKIAotICAgIG1EZXZpY2UuY2xlYXIoKTsKLQogICAgIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6ZGlzY29ubmVjdCgpOwogCiAgICAgcmV0dXJuIHJlczsKQEAgLTQ3MiwxNCArNDY0LDE0IEBACiAgICAgQUxPR1YoIiVzOiBFIiwgX19GVU5DVElPTl9fKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CiAKLSAgICBpZiAobUNsaWVudFBpZCAhPSAwICYmIGdldENhbGxpbmdQaWQoKSAhPSBtQ2xpZW50UGlkKSB7CisgICAgaWYgKG1DbGllbnRQaWQgIT0gMCAmJiBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpICE9IG1DbGllbnRQaWQpIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENvbm5lY3Rpb24gYXR0ZW1wdCBmcm9tIHBpZCAlZDsgIgogICAgICAgICAgICAgICAgICJjdXJyZW50IGxvY2tlZCB0byBwaWQgJWQiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgbUNhbWVyYUlkLCBnZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOworICAgICAgICAgICAgICAgIG1DYW1lcmFJZCwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgbUNsaWVudFBpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBtQ2xpZW50UGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKIAogICAgIG1SZW1vdGVDYWxsYmFjayA9IGNsaWVudDsKICAgICBtU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzID0gY2xpZW50OwpAQCAtNDkyLDE2ICs0ODQsMTYgQEAKICAgICBBTE9HVigiJXM6IEUiLCBfX0ZVTkNUSU9OX18pOwogICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogTG9jayBjYWxsIGZyb20gcGlkICVkOyBjdXJyZW50IGNsaWVudCBwaWQgJWQiLAotICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIGdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CiAKICAgICBpZiAobUNsaWVudFBpZCA9PSAwKSB7Ci0gICAgICAgIG1DbGllbnRQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgICAgIG1DbGllbnRQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCi0gICAgaWYgKG1DbGllbnRQaWQgIT0gZ2V0Q2FsbGluZ1BpZCgpKSB7CisgICAgaWYgKG1DbGllbnRQaWQgIT0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSkgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogTG9jayBjYWxsIGZyb20gcGlkICVkOyBjdXJyZW50bHkgbG9ja2VkIHRvIHBpZCAlZCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIGdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOwogICAgICAgICByZXR1cm4gRUJVU1k7CiAgICAgfQogCkBAIC01MTMsOSArNTA1LDkgQEAKICAgICBBTE9HVigiJXM6IEUiLCBfX0ZVTkNUSU9OX18pOwogICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogVW5sb2NrIGNhbGwgZnJvbSBwaWQgJWQ7IGN1cnJlbnQgY2xpZW50IHBpZCAlZCIsCi0gICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgZ2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKIAotICAgIGlmIChtQ2xpZW50UGlkID09IGdldENhbGxpbmdQaWQoKSkgeworICAgIGlmIChtQ2xpZW50UGlkID09IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpIHsKICAgICAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKG1QYXJhbWV0ZXJzKTsKICAgICAgICAgaWYgKGwubVBhcmFtZXRlcnMuc3RhdGUgPT0gUGFyYW1ldGVyczo6UkVDT1JEIHx8CiAgICAgICAgICAgICAgICAgbC5tUGFyYW1ldGVycy5zdGF0ZSA9PSBQYXJhbWV0ZXJzOjpWSURFT19TTkFQU0hPVCkgewpAQCAtNTI5LDcgKzUyMSw3IEBACiAgICAgfQogCiAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVubG9jayBjYWxsIGZyb20gcGlkICVkOyBjdXJyZW50bHkgbG9ja2VkIHRvIHBpZCAlZCIsCi0gICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgZ2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKICAgICByZXR1cm4gRUJVU1k7CiB9CiAKQEAgLTE0NDcsMTMgKzE0MzksMTQgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYTJDbGllbnQ6OnRha2VQaWN0dXJlKGludCBtc2dUeXBlKSB7CitzdGF0dXNfdCBDYW1lcmEyQ2xpZW50Ojp0YWtlUGljdHVyZShpbnQgLyptc2dUeXBlKi8pIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKICAgICBzdGF0dXNfdCByZXM7CiAgICAgaWYgKCAocmVzID0gY2hlY2tQaWQoX19GVU5DVElPTl9fKSApICE9IE9LKSByZXR1cm4gcmVzOwogCiAgICAgaW50IHRha2VQaWN0dXJlQ291bnRlcjsKKyAgICBib29sIHNob3VsZFN5bmNXaXRoRGV2aWNlID0gdHJ1ZTsKICAgICB7CiAgICAgICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChtUGFyYW1ldGVycyk7CiAgICAgICAgIHN3aXRjaCAobC5tUGFyYW1ldGVycy5zdGF0ZSkgewpAQCAtMTUzOSwxNCArMTUzMiwyNSBAQAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CiAgICAgICAgICAgICBtWnNsUHJvY2Vzc29yLT5jbGVhclpzbFF1ZXVlKCk7CiAgICAgICAgIH0KKworICAgICAgICAvLyBXZSBzaG91bGQgYWx3YXlzIHN5bmMgd2l0aCB0aGUgZGV2aWNlIGluIGNhc2UgZmxhc2ggaXMgdHVybmVkIG9uLAorICAgICAgICAvLyB0aGUgY2FtZXJhIGRldmljZSBzdWdnZXN0cyB0aGF0IGZsYXNoIGlzIG5lZWRlZCAoQUUgc3RhdGUgRkxBU0hfUkVRVUlSRUQpCisgICAgICAgIC8vIG9yIHdlIGFyZSBpbiBzb21lIG90aGVyIEFFIHN0YXRlIGRpZmZlcmVudCBmcm9tIENPTlZFUkdFRCB0aGF0IG1heSBuZWVkCisgICAgICAgIC8vIHByZWNhcHR1cmUgdHJpZ2dlci4KKyAgICAgICAgaWYgKGwubVBhcmFtZXRlcnMuZmxhc2hNb2RlICE9IFBhcmFtZXRlcnM6OkZMQVNIX01PREVfT04gJiYKKyAgICAgICAgICAgICAgICAobC5tUGFyYW1ldGVycy5hZVN0YXRlID09IEFORFJPSURfQ09OVFJPTF9BRV9TVEFURV9DT05WRVJHRUQpKSB7CisgICAgICAgICAgICBzaG91bGRTeW5jV2l0aERldmljZSAgPSBmYWxzZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEFUUkFDRV9BU1lOQ19CRUdJTihrVGFrZXBpY3R1cmVMYWJlbCwgdGFrZVBpY3R1cmVDb3VudGVyKTsKIAotICAgIC8vIE5lZWQgSEFMIHRvIGhhdmUgY29ycmVjdCBzZXR0aW5ncyBiZWZvcmUgKHBvc3NpYmx5KSB0cmlnZ2VyaW5nIHByZWNhcHR1cmUKLSAgICBzeW5jV2l0aERldmljZSgpOworICAgIC8vIE1ha2Ugc3VyZSBIQUwgaGFzIGNvcnJlY3Qgc2V0dGluZ3MgaW4gY2FzZSBwcmVjYXB0dXJlIHRyaWdnZXIgaXMgbmVlZGVkLgorICAgIGlmIChzaG91bGRTeW5jV2l0aERldmljZSkgeworICAgICAgICBzeW5jV2l0aERldmljZSgpOworICAgIH0KIAotICAgIHJlcyA9IG1DYXB0dXJlU2VxdWVuY2VyLT5zdGFydENhcHR1cmUobXNnVHlwZSk7CisgICAgcmVzID0gbUNhcHR1cmVTZXF1ZW5jZXItPnN0YXJ0Q2FwdHVyZSgpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVuYWJsZSB0byBzdGFydCBjYXB0dXJlOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC0xNTgzLDcgKzE1ODcsNyBAQAogICAgIEFMT0dWKCIlczogQ2FtZXJhICVkIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOwogICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKICAgICAvLyBUaGUgY2FtZXJhIHNlcnZpY2UgY2FuIHVuY29uZGl0aW9uYWxseSBnZXQgdGhlIHBhcmFtZXRlcnMgYXQgYWxsIHRpbWVzCi0gICAgaWYgKGdldENhbGxpbmdQaWQoKSAhPSBtU2VydmljZVBpZCAmJiBjaGVja1BpZChfX0ZVTkNUSU9OX18pICE9IE9LKSByZXR1cm4gU3RyaW5nOCgpOworICAgIGlmIChDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpICE9IG1TZXJ2aWNlUGlkICYmIGNoZWNrUGlkKF9fRlVOQ1RJT05fXykgIT0gT0spIHJldHVybiBTdHJpbmc4KCk7CiAKICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpSZWFkTG9jayBsKG1QYXJhbWV0ZXJzKTsKIApAQCAtMTY2NiwyNyArMTY3MCw2IEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICAvLyB0aGUgY2FtZXJhMiBhcGkgbGVnYWN5IG1vZGUgY2FuIHVuY29uZGl0aW9uYWxseSBkaXNhYmxlIHRoZSBzaHV0dGVyIHNvdW5kCi0gICAgaWYgKG1MZWdhY3lNb2RlKSB7Ci0gICAgICAgIEFMT0dWKCIlczogRGlzYWJsZSBzaHV0dGVyIHNvdW5kIGluIGxlZ2FjeSBtb2RlIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgbC5tUGFyYW1ldGVycy5wbGF5U2h1dHRlclNvdW5kID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICAvLyBEaXNhYmxpbmcgc2h1dHRlciBzb3VuZCBtYXkgbm90IGJlIGFsbG93ZWQuIEluIHRoYXQgY2FzZSBvbmx5Ci0gICAgLy8gYWxsb3cgdGhlIG1lZGlhc2VydmVyIHByb2Nlc3MgdG8gZGlzYWJsZSB0aGUgc291bmQuCi0gICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIHByb3BlcnR5X2dldCgicm8uY2FtZXJhLnNvdW5kLmZvcmNlZCIsIHZhbHVlLCAiMCIpOwotICAgIGlmIChzdHJuY21wKHZhbHVlLCAiMCIsIDIpICE9IDApIHsKLSAgICAgICAgLy8gRGlzYWJsaW5nIHNodXR0ZXIgc291bmQgaXMgbm90IGFsbG93ZWQuIERlbnkgaWYgdGhlIGN1cnJlbnQKLSAgICAgICAgLy8gcHJvY2VzcyBpcyBub3QgbWVkaWFzZXJ2ZXIuCi0gICAgICAgIGlmIChnZXRDYWxsaW5nUGlkKCkgIT0gZ2V0cGlkKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZGlzYWJsZSBzaHV0dGVyIHNvdW5kLiBQZXJtaXNzaW9uIGRlbmllZCAocGlkICVkKSIsCi0gICAgICAgICAgICAgICAgICAgIGdldENhbGxpbmdQaWQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBsLm1QYXJhbWV0ZXJzLnBsYXlTaHV0dGVyU291bmQgPSBmYWxzZTsKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xOTM0LDYgKzE5MTcsMTEgQEAKIHZvaWQgQ2FtZXJhMkNsaWVudDo6bm90aWZ5QXV0b0V4cG9zdXJlKHVpbnQ4X3QgbmV3U3RhdGUsIGludCB0cmlnZ2VySWQpIHsKICAgICBBTE9HVigiJXM6IEF1dG9leHBvc3VyZSBzdGF0ZSBub3cgJWQsIGxhc3QgdHJpZ2dlciAlZCIsCiAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG5ld1N0YXRlLCB0cmlnZ2VySWQpOworICAgIHsKKyAgICAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKG1QYXJhbWV0ZXJzKTsKKyAgICAgICAgLy8gVXBkYXRlIHN0YXRlCisgICAgICAgIGwubVBhcmFtZXRlcnMuYWVTdGF0ZSA9IG5ld1N0YXRlOworICAgIH0KICAgICBtQ2FwdHVyZVNlcXVlbmNlci0+bm90aWZ5QXV0b0V4cG9zdXJlKG5ld1N0YXRlLCB0cmlnZ2VySWQpOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCmluZGV4IDQ0OTI5YzMuLmE5ZWEyNzEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCkBAIC05Niw4ICs5Niw3IEBACiAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICAgICAgaW50IGNsaWVudFBpZCwKICAgICAgICAgICAgIHVpZF90IGNsaWVudFVpZCwKLSAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkLAotICAgICAgICAgICAgYm9vbCBsZWdhY3lNb2RlKTsKKyAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkKTsKIAogICAgIHZpcnR1YWwgfkNhbWVyYTJDbGllbnQoKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwCmluZGV4IGYxMjAzZjkuLmQ2NWFjN2IgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5jcHAKQEAgLTI1LDI3ICsyNSwyNCBAQAogI2luY2x1ZGUgImFwaTEvQ2FtZXJhQ2xpZW50LmgiCiAjaW5jbHVkZSAiZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oIgogI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2UuaCIKKyNpbmNsdWRlICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKICNkZWZpbmUgTE9HMSguLi4pIEFMT0dEX0lGKGdMb2dMZXZlbCA+PSAxLCBfX1ZBX0FSR1NfXyk7CiAjZGVmaW5lIExPRzIoLi4uKSBBTE9HRF9JRihnTG9nTGV2ZWwgPj0gMiwgX19WQV9BUkdTX18pOwogCi1zdGF0aWMgaW50IGdldENhbGxpbmdQaWQoKSB7Ci0gICAgcmV0dXJuIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKLX0KLQogQ2FtZXJhQ2xpZW50OjpDYW1lcmFDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAogICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgIGludCBjYW1lcmFJZCwgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgaW50IGNsaWVudFBpZCwgaW50IGNsaWVudFVpZCwKLSAgICAgICAgaW50IHNlcnZpY2VQaWQsIGJvb2wgbGVnYWN5TW9kZSk6CisgICAgICAgIGludCBzZXJ2aWNlUGlkKToKICAgICAgICAgQ2xpZW50KGNhbWVyYVNlcnZpY2UsIGNhbWVyYUNsaWVudCwgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGNhbWVyYUlkKSwgY2FtZXJhSWQsIGNhbWVyYUZhY2luZywgY2xpZW50UGlkLAogICAgICAgICAgICAgICAgIGNsaWVudFVpZCwgc2VydmljZVBpZCkKIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgiQ2FtZXJhQ2xpZW50OjpDYW1lcmFDbGllbnQgRSAocGlkICVkLCBpZCAlZCkiLCBjYWxsaW5nUGlkLCBjYW1lcmFJZCk7CiAKICAgICBtSGFyZHdhcmUgPSBOVUxMOwpAQCAtNTcsMTQgKzU0LDEzIEBACiAgICAgLy8gQ2FsbGJhY2sgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdAogICAgIG1QcmV2aWV3Q2FsbGJhY2tGbGFnID0gQ0FNRVJBX0ZSQU1FX0NBTExCQUNLX0ZMQUdfTk9PUDsKICAgICBtT3JpZW50YXRpb24gPSBnZXRPcmllbnRhdGlvbigwLCBtQ2FtZXJhRmFjaW5nID09IENBTUVSQV9GQUNJTkdfRlJPTlQpOwotICAgIG1MZWdhY3lNb2RlID0gbGVnYWN5TW9kZTsKICAgICBtUGxheVNodXR0ZXJTb3VuZCA9IHRydWU7CiAgICAgTE9HMSgiQ2FtZXJhQ2xpZW50OjpDYW1lcmFDbGllbnQgWCAocGlkICVkLCBpZCAlZCkiLCBjYWxsaW5nUGlkLCBjYW1lcmFJZCk7CiB9CiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6aW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIC8qbW9uaXRvclRhZ3MqLykgewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBzdGF0dXNfdCByZXM7CiAKICAgICBMT0cxKCJDYW1lcmFDbGllbnQ6OmluaXRpYWxpemUgRSAocGlkICVkLCBpZCAlZCkiLCBjYWxsaW5nUGlkLCBtQ2FtZXJhSWQpOwpAQCAtMTA1LDcgKzEwMSw3IEBACiAvLyB0ZWFyIGRvd24gdGhlIGNsaWVudAogQ2FtZXJhQ2xpZW50Ojp+Q2FtZXJhQ2xpZW50KCkgewogICAgIG1EZXN0cnVjdGlvblN0YXJ0ZWQgPSB0cnVlOwotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBMT0cxKCJDYW1lcmFDbGllbnQ6On5DYW1lcmFDbGllbnQgRSAocGlkICVkLCB0aGlzICVwKSIsIGNhbGxpbmdQaWQsIHRoaXMpOwogCiAgICAgZGlzY29ubmVjdCgpOwpAQCAtMTQ4LDcgKzE0NCw3IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6Y2hlY2tQaWQoKSBjb25zdCB7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGlmIChjYWxsaW5nUGlkID09IG1DbGllbnRQaWQpIHJldHVybiBOT19FUlJPUjsKIAogICAgIEFMT0dXKCJhdHRlbXB0IHRvIHVzZSBhIGxvY2tlZCBjYW1lcmEgZnJvbSBhIGRpZmZlcmVudCBwcm9jZXNzIgpAQCAtMTU4LDcgKzE1NCw4IEBACiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6Y2hlY2tQaWRBbmRIYXJkd2FyZSgpIGNvbnN0IHsKICAgICBpZiAobUhhcmR3YXJlID09IDApIHsKLSAgICAgICAgQUxPR0UoImF0dGVtcHQgdG8gdXNlIGEgY2FtZXJhIGFmdGVyIGRpc2Nvbm5lY3QoKSAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgICAgIEFMT0dFKCJhdHRlbXB0IHRvIHVzZSBhIGNhbWVyYSBhZnRlciBkaXNjb25uZWN0KCkgKHBpZCAlZCkiLAorICAgICAgICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZCgpOwpAQCAtMTY3LDcgKzE2NCw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6bG9jaygpIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgibG9jayAocGlkICVkKSIsIGNhbGxpbmdQaWQpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKIApAQCAtMTgyLDcgKzE3OSw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6dW5sb2NrKCkgewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBMT0cxKCJ1bmxvY2sgKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAKQEAgLTIwNCw3ICsyMDEsNyBAQAogCiAvLyBjb25uZWN0IGEgbmV3IGNsaWVudCB0byB0aGUgY2FtZXJhCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmNvbm5lY3QoY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmFDbGllbnQ+JiBjbGllbnQpIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgiY29ubmVjdCBFIChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogCkBAIC0yNDAsNyArMjM3LDcgQEAKIH0KIAogYmluZGVyOjpTdGF0dXMgQ2FtZXJhQ2xpZW50OjpkaXNjb25uZWN0KCkgewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBMT0cxKCJkaXNjb25uZWN0IEUgKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAKQEAgLTMzNCw3ICszMzEsNyBAQAogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpzZXRQcmV2aWV3VGFyZ2V0KAogICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgYnVmZmVyUHJvZHVjZXIpIHsKICAgICBMT0cxKCJzZXRQcmV2aWV3VGFyZ2V0KCVwKSAocGlkICVkKSIsIGJ1ZmZlclByb2R1Y2VyLmdldCgpLAotICAgICAgICAgICAgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICAgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogCiAgICAgc3A8SUJpbmRlcj4gYmluZGVyOwogICAgIHNwPEFOYXRpdmVXaW5kb3c+IHdpbmRvdzsKQEAgLTM1MSw3ICszNDgsNyBAQAogLy8gc2V0IHRoZSBwcmV2aWV3IGNhbGxiYWNrIGZsYWcgdG8gYWZmZWN0IGhvdyB0aGUgcmVjZWl2ZWQgZnJhbWVzIGZyb20KIC8vIHByZXZpZXcgYXJlIGhhbmRsZWQuCiB2b2lkIENhbWVyYUNsaWVudDo6c2V0UHJldmlld0NhbGxiYWNrRmxhZyhpbnQgY2FsbGJhY2tfZmxhZykgewotICAgIExPRzEoInNldFByZXZpZXdDYWxsYmFja0ZsYWcoJWQpIChwaWQgJWQpIiwgY2FsbGJhY2tfZmxhZywgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJzZXRQcmV2aWV3Q2FsbGJhY2tGbGFnKCVkKSAocGlkICVkKSIsIGNhbGxiYWNrX2ZsYWcsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm47CiAKQEAgLTM3MiwxMyArMzY5LDEzIEBACiAKIC8vIHN0YXJ0IHByZXZpZXcgbW9kZQogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpzdGFydFByZXZpZXcoKSB7Ci0gICAgTE9HMSgic3RhcnRQcmV2aWV3IChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJzdGFydFByZXZpZXcgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKICAgICByZXR1cm4gc3RhcnRDYW1lcmFNb2RlKENBTUVSQV9QUkVWSUVXX01PREUpOwogfQogCiAvLyBzdGFydCByZWNvcmRpbmcgbW9kZQogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpzdGFydFJlY29yZGluZygpIHsKLSAgICBMT0cxKCJzdGFydFJlY29yZGluZyAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgic3RhcnRSZWNvcmRpbmcgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKICAgICByZXR1cm4gc3RhcnRDYW1lcmFNb2RlKENBTUVSQV9SRUNPUkRJTkdfTU9ERSk7CiB9CiAKQEAgLTQ2MSw3ICs0NTgsNyBAQAogCiAvLyBzdG9wIHByZXZpZXcgbW9kZQogdm9pZCBDYW1lcmFDbGllbnQ6OnN0b3BQcmV2aWV3KCkgewotICAgIExPRzEoInN0b3BQcmV2aWV3IChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJzdG9wUHJldmlldyAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm47CiAKQEAgLTQ3Nyw3ICs0NzQsNyBAQAogCiAvLyBzdG9wIHJlY29yZGluZyBtb2RlCiB2b2lkIENhbWVyYUNsaWVudDo6c3RvcFJlY29yZGluZygpIHsKLSAgICBMT0cxKCJzdG9wUmVjb3JkaW5nIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJzdG9wUmVjb3JkaW5nIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybjsKQEAgLTUwMyw3ICs1MDAsNyBAQAogICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybjsKICAgICBpZiAobWVtID09IG51bGxwdHIpIHsKICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlV2l0aEluZm9Mb2coQ2FtZXJhU2VydmljZTo6U05fRVZFTlRfTE9HX0lELCAiMjYxNjQyNzIiLAotICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSwgbnVsbHB0ciwgMCk7CisgICAgICAgICAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKSwgbnVsbHB0ciwgMCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTYxNSw3ICs2MTIsNyBAQAogfQogCiBib29sIENhbWVyYUNsaWVudDo6cHJldmlld0VuYWJsZWQoKSB7Ci0gICAgTE9HMSgicHJldmlld0VuYWJsZWQgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIExPRzEoInByZXZpZXdFbmFibGVkIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuIGZhbHNlOwpAQCAtNjIzLDcgKzYyMCw3IEBACiB9CiAKIGJvb2wgQ2FtZXJhQ2xpZW50OjpyZWNvcmRpbmdFbmFibGVkKCkgewotICAgIExPRzEoInJlY29yZGluZ0VuYWJsZWQgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIExPRzEoInJlY29yZGluZ0VuYWJsZWQgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm4gZmFsc2U7CkBAIC02MzEsNyArNjI4LDcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjphdXRvRm9jdXMoKSB7Ci0gICAgTE9HMSgiYXV0b0ZvY3VzIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJhdXRvRm9jdXMgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CkBAIC02NDEsNyArNjM4LDcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpjYW5jZWxBdXRvRm9jdXMoKSB7Ci0gICAgTE9HMSgiY2FuY2VsQXV0b0ZvY3VzIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJjYW5jZWxBdXRvRm9jdXMgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CkBAIC02NTIsNyArNjQ5LDcgQEAKIAogLy8gdGFrZSBhIHBpY3R1cmUgLSBpbWFnZSBpcyByZXR1cm5lZCBpbiBjYWxsYmFjawogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50Ojp0YWtlUGljdHVyZShpbnQgbXNnVHlwZSkgewotICAgIExPRzEoInRha2VQaWN0dXJlIChwaWQgJWQpOiAweCV4IiwgZ2V0Q2FsbGluZ1BpZCgpLCBtc2dUeXBlKTsKKyAgICBMT0cxKCJ0YWtlUGljdHVyZSAocGlkICVkKTogMHgleCIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIG1zZ1R5cGUpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkQW5kSGFyZHdhcmUoKTsKQEAgLTY4MSw3ICs2NzgsNyBAQAogCiAvLyBzZXQgcHJldmlldy9jYXB0dXJlIHBhcmFtZXRlcnMgLSBrZXkvdmFsdWUgcGFpcnMKIHN0YXR1c190IENhbWVyYUNsaWVudDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBwYXJhbXMpIHsKLSAgICBMT0cxKCJzZXRQYXJhbWV0ZXJzIChwaWQgJWQpICglcykiLCBnZXRDYWxsaW5nUGlkKCksIHBhcmFtcy5zdHJpbmcoKSk7CisgICAgTE9HMSgic2V0UGFyYW1ldGVycyAocGlkICVkKSAoJXMpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgcGFyYW1zLnN0cmluZygpKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CkBAIC02OTYsMTYgKzY5MywxOCBAQAogU3RyaW5nOCBDYW1lcmFDbGllbnQ6OmdldFBhcmFtZXRlcnMoKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIC8vIFRoZSBjYW1lcmEgc2VydmljZSBjYW4gdW5jb25kaXRpb25hbGx5IGdldCB0aGUgcGFyYW1ldGVycyBhdCBhbGwgdGltZXMKLSAgICBpZiAoZ2V0Q2FsbGluZ1BpZCgpICE9IG1TZXJ2aWNlUGlkICYmIGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuIFN0cmluZzgoKTsKKyAgICBpZiAoQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSAhPSBtU2VydmljZVBpZCAmJiBjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzgoKTsKKyAgICB9CiAKICAgICBTdHJpbmc4IHBhcmFtcyhtSGFyZHdhcmUtPmdldFBhcmFtZXRlcnMoKS5mbGF0dGVuKCkpOwotICAgIExPRzEoImdldFBhcmFtZXRlcnMgKHBpZCAlZCkgKCVzKSIsIGdldENhbGxpbmdQaWQoKSwgcGFyYW1zLnN0cmluZygpKTsKKyAgICBMT0cxKCJnZXRQYXJhbWV0ZXJzIChwaWQgJWQpICglcykiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBwYXJhbXMuc3RyaW5nKCkpOwogICAgIHJldHVybiBwYXJhbXM7CiB9CiAKIC8vIGVuYWJsZSBzaHV0dGVyIHNvdW5kCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmVuYWJsZVNodXR0ZXJTb3VuZChib29sIGVuYWJsZSkgewotICAgIExPRzEoImVuYWJsZVNodXR0ZXJTb3VuZCAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgiZW5hYmxlU2h1dHRlclNvdW5kIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CiAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgcmV0dXJuIHJlc3VsdDsKQEAgLTcxNSwzMiArNzE0LDEyIEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICAvLyB0aGUgY2FtZXJhMiBhcGkgbGVnYWN5IG1vZGUgY2FuIHVuY29uZGl0aW9uYWxseSBkaXNhYmxlIHRoZSBzaHV0dGVyIHNvdW5kCi0gICAgaWYgKG1MZWdhY3lNb2RlKSB7Ci0gICAgICAgIEFMT0dWKCIlczogRGlzYWJsZSBzaHV0dGVyIHNvdW5kIGluIGxlZ2FjeSBtb2RlIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgbVBsYXlTaHV0dGVyU291bmQgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIC8vIERpc2FibGluZyBzaHV0dGVyIHNvdW5kIG1heSBub3QgYmUgYWxsb3dlZC4gSW4gdGhhdCBjYXNlIG9ubHkKLSAgICAvLyBhbGxvdyB0aGUgbWVkaWFzZXJ2ZXIgcHJvY2VzcyB0byBkaXNhYmxlIHRoZSBzb3VuZC4KLSAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgcHJvcGVydHlfZ2V0KCJyby5jYW1lcmEuc291bmQuZm9yY2VkIiwgdmFsdWUsICIwIik7Ci0gICAgaWYgKHN0cmNtcCh2YWx1ZSwgIjAiKSAhPSAwKSB7Ci0gICAgICAgIC8vIERpc2FibGluZyBzaHV0dGVyIHNvdW5kIGlzIG5vdCBhbGxvd2VkLiBEZW55IGlmIHRoZSBjdXJyZW50Ci0gICAgICAgIC8vIHByb2Nlc3MgaXMgbm90IG1lZGlhc2VydmVyLgotICAgICAgICBpZiAoZ2V0Q2FsbGluZ1BpZCgpICE9IGdldHBpZCgpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGRpc2FibGUgc2h1dHRlciBzb3VuZC4gUGVybWlzc2lvbiBkZW5pZWQgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOwotICAgICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgbVBsYXlTaHV0dGVyU291bmQgPSBmYWxzZTsKICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6c2VuZENvbW1hbmQoaW50MzJfdCBjbWQsIGludDMyX3QgYXJnMSwgaW50MzJfdCBhcmcyKSB7Ci0gICAgTE9HMSgic2VuZENvbW1hbmQgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIExPRzEoInNlbmRDb21tYW5kIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAgICAgaW50IG9yaWVudGF0aW9uOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaAppbmRleCAxOTEwNTM2Li45NTMwYjZjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmgKQEAgLTY4LDggKzY4LDcgQEAKICAgICAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCiAgICAgICAgICAgICBpbnQgY2xpZW50UGlkLAogICAgICAgICAgICAgaW50IGNsaWVudFVpZCwKLSAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkLAotICAgICAgICAgICAgYm9vbCBsZWdhY3lNb2RlID0gZmFsc2UpOworICAgICAgICAgICAgaW50IHNlcnZpY2VQaWQpOwogICAgIH5DYW1lcmFDbGllbnQoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAKaW5kZXggNzAzNDFjNS4uNTAyOWQ0YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcApAQCAtNTAsOCArNTAsNyBAQAogICAgICAgICBtU3RhdGVUcmFuc2l0aW9uQ291bnQoMCksCiAgICAgICAgIG1UcmlnZ2VySWQoMCksCiAgICAgICAgIG1UaW1lb3V0Q291bnQoMCksCi0gICAgICAgIG1DYXB0dXJlSWQoQ2FtZXJhMkNsaWVudDo6a0NhcHR1cmVSZXF1ZXN0SWRTdGFydCksCi0gICAgICAgIG1Nc2dUeXBlKDApIHsKKyAgICAgICAgbUNhcHR1cmVJZChDYW1lcmEyQ2xpZW50OjprQ2FwdHVyZVJlcXVlc3RJZFN0YXJ0KSB7CiAgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKIH0KIApAQCAtNjQsNyArNjMsNyBAQAogICAgIG1ac2xQcm9jZXNzb3IgPSBwcm9jZXNzb3I7CiB9CiAKLXN0YXR1c190IENhcHR1cmVTZXF1ZW5jZXI6OnN0YXJ0Q2FwdHVyZShpbnQgbXNnVHlwZSkgeworc3RhdHVzX3QgQ2FwdHVyZVNlcXVlbmNlcjo6c3RhcnRDYXB0dXJlKCkgewogICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5wdXRNdXRleCk7CkBAIC03Myw3ICs3Miw2IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgaWYgKCFtU3RhcnRDYXB0dXJlKSB7Ci0gICAgICAgIG1Nc2dUeXBlID0gbXNnVHlwZTsKICAgICAgICAgbVN0YXJ0Q2FwdHVyZSA9IHRydWU7CiAgICAgICAgIG1TdGFydENhcHR1cmVTaWduYWwuc2lnbmFsKCk7CiAgICAgfQpAQCAtMzg2LDcgKzM4NCw3IEBACiAKICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwoY2xpZW50LT5nZXRQYXJhbWV0ZXJzKCkpOwogICAgIC8qIHdhcm5pbmc6IHRoaXMgYWxzbyBsb2NrcyBhIFNoYXJlZENhbWVyYUNhbGxiYWNrcyAqLwotICAgIHNodXR0ZXJOb3RpZnlMb2NrZWQobC5tUGFyYW1ldGVycywgY2xpZW50LCBtTXNnVHlwZSk7CisgICAgc2h1dHRlck5vdGlmeUxvY2tlZChsLm1QYXJhbWV0ZXJzLCBjbGllbnQpOwogICAgIG1TaHV0dGVyTm90aWZpZWQgPSB0cnVlOwogICAgIG1UaW1lb3V0Q291bnQgPSBrTWF4VGltZW91dHNGb3JDYXB0dXJlRW5kOwogICAgIHJldHVybiBTVEFOREFSRF9DQVBUVVJFX1dBSVQ7CkBAIC02MDYsNyArNjA0LDcgQEAKICAgICAgICAgaWYgKCFtU2h1dHRlck5vdGlmaWVkKSB7CiAgICAgICAgICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwoY2xpZW50LT5nZXRQYXJhbWV0ZXJzKCkpOwogICAgICAgICAgICAgLyogd2FybmluZzogdGhpcyBhbHNvIGxvY2tzIGEgU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzICovCi0gICAgICAgICAgICBzaHV0dGVyTm90aWZ5TG9ja2VkKGwubVBhcmFtZXRlcnMsIGNsaWVudCwgbU1zZ1R5cGUpOworICAgICAgICAgICAgc2h1dHRlck5vdGlmeUxvY2tlZChsLm1QYXJhbWV0ZXJzLCBjbGllbnQpOwogICAgICAgICAgICAgbVNodXR0ZXJOb3RpZmllZCA9IHRydWU7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1UaW1lb3V0Q291bnQgPD0gMCkgewpAQCAtNzIzLDEyICs3MjEsMTEgQEAKIH0KIAogLypzdGF0aWMqLyB2b2lkIENhcHR1cmVTZXF1ZW5jZXI6OnNodXR0ZXJOb3RpZnlMb2NrZWQoY29uc3QgUGFyYW1ldGVycyAmcGFyYW1zLAotICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhMkNsaWVudD4mIGNsaWVudCwgaW50IG1zZ1R5cGUpIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYTJDbGllbnQ+JiBjbGllbnQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCiAgICAgaWYgKHBhcmFtcy5zdGF0ZSA9PSBQYXJhbWV0ZXJzOjpTVElMTF9DQVBUVVJFCi0gICAgICAgICYmIHBhcmFtcy5wbGF5U2h1dHRlclNvdW5kCi0gICAgICAgICYmIChtc2dUeXBlICYgQ0FNRVJBX01TR19TSFVUVEVSKSkgeworICAgICAgICAmJiBwYXJhbXMucGxheVNodXR0ZXJTb3VuZCkgewogICAgICAgICBjbGllbnQtPmdldENhbWVyYVNlcnZpY2UoKS0+cGxheVNvdW5kKENhbWVyYVNlcnZpY2U6OlNPVU5EX1NIVVRURVIpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmgKaW5kZXggZjJlMzc1MC4uYzIzYjEyZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5oCkBAIC01MSw3ICs1MSw3IEBACiAgICAgdm9pZCBzZXRac2xQcm9jZXNzb3IoY29uc3Qgd3A8WnNsUHJvY2Vzc29yPiYgcHJvY2Vzc29yKTsKIAogICAgIC8vIEJlZ2luIHN0aWxsIGltYWdlIGNhcHR1cmUKLSAgICBzdGF0dXNfdCBzdGFydENhcHR1cmUoaW50IG1zZ1R5cGUpOworICAgIHN0YXR1c190IHN0YXJ0Q2FwdHVyZSgpOwogCiAgICAgLy8gV2FpdCB1bnRpbCBjdXJyZW50IGltYWdlIGNhcHR1cmUgY29tcGxldGVzOyByZXR1cm5zIGltbWVkaWF0ZWx5IGlmIG5vCiAgICAgLy8gY2FwdHVyZSBpcyBhY3RpdmUuIFJldHVybnMgVElNRURfT1VUIGlmIGNhcHR1cmUgZG9lcyBub3QgY29tcGxldGUgZHVyaW5nCkBAIC0xNDUsNyArMTQ1LDYgQEAKICAgICBib29sIG1BZUluUHJlY2FwdHVyZTsKIAogICAgIGludDMyX3QgbUNhcHR1cmVJZDsKLSAgICBpbnQgbU1zZ1R5cGU7CiAKICAgICAvLyBNYWluIGludGVybmFsIG1ldGhvZHMKIApAQCAtMTcyLDcgKzE3MSw3IEBACiAKICAgICAvLyBFbWl0IFNodXR0ZXIvUmF3IGNhbGxiYWNrIHRvIGphdmEsIGFuZCBtYXliZSBwbGF5IGEgc2h1dHRlciBzb3VuZAogICAgIHN0YXRpYyB2b2lkIHNodXR0ZXJOb3RpZnlMb2NrZWQoY29uc3QgUGFyYW1ldGVycyAmcGFyYW1zLAotICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhMkNsaWVudD4mIGNsaWVudCwgaW50IG1zZ1R5cGUpOworICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhMkNsaWVudD4mIGNsaWVudCk7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgY2FtZXJhMgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAKaW5kZXggMGM3MzhlNy4uNjgzZTg0ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuY3BwCkBAIC0zMyw3ICszMywxMCBAQAogICAgIEZyYW1lUHJvY2Vzc29yQmFzZShkZXZpY2UpLAogICAgIG1DbGllbnQoY2xpZW50KSwKICAgICBtTGFzdEZyYW1lTnVtYmVyT2ZGYWNlcygwKSwKLSAgICBtTGFzdDNBRnJhbWVOdW1iZXIoLTEpIHsKKyAgICBtTGFzdDNBRnJhbWVOdW1iZXIoLTEpLAorICAgIG1MYXN0QUVGcmFtZU51bWJlcigtMSksCisgICAgbUxhc3RBRnJhbWVOdW1iZXIoLTEpLAorICAgIG1MYXN0QVdCRnJhbWVOdW1iZXIoLTEpIHsKIAogICAgIHNwPENhbWVyYURldmljZUJhc2U+IGQgPSBkZXZpY2UucHJvbW90ZSgpOwogICAgIG1TeW50aGVzaXplM0FOb3RpZnkgPSAhKGQtPndpbGxOb3RpZnkzQSgpKTsKQEAgLTI2MiwyNCArMjY1LDczIEBACiAgICAgYm9vbCBnb3RBbGxTdGF0ZXMgPSB0cnVlOwogCiAgICAgLy8gVE9ETzogQWxzbyB1c2UgQUUgbW9kZSwgQUUgdHJpZ2dlciBJRAotICAgIGdvdEFsbFN0YXRlcyAmPSB1cGRhdGVQZW5kaW5nU3RhdGU8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRl9NT0RFLAorICAgIGJvb2wgZ290QUZTdGF0ZSA9IHVwZGF0ZVBlbmRpbmdTdGF0ZTx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FGX01PREUsCiAgICAgICAgICAgICAmcGVuZGluZ1N0YXRlLmFmTW9kZSwgZnJhbWVOdW1iZXIsIGNhbWVyYUlkKTsKIAotICAgIGdvdEFsbFN0YXRlcyAmPSB1cGRhdGVQZW5kaW5nU3RhdGU8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BV0JfTU9ERSwKKyAgICBib29sIGdvdEFXQlN0YXRlID0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQVdCX01PREUsCiAgICAgICAgICAgICAmcGVuZGluZ1N0YXRlLmF3Yk1vZGUsIGZyYW1lTnVtYmVyLCBjYW1lcmFJZCk7CiAKLSAgICBnb3RBbGxTdGF0ZXMgJj0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUVfU1RBVEUsCisgICAgYm9vbCBnb3RBRVN0YXRlID0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUVfU1RBVEUsCiAgICAgICAgICAgICAmcGVuZGluZ1N0YXRlLmFlU3RhdGUsIGZyYW1lTnVtYmVyLCBjYW1lcmFJZCk7CiAKLSAgICBnb3RBbGxTdGF0ZXMgJj0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEUsCisgICAgZ290QUZTdGF0ZSAmPSB1cGRhdGVQZW5kaW5nU3RhdGU8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRl9TVEFURSwKICAgICAgICAgICAgICZwZW5kaW5nU3RhdGUuYWZTdGF0ZSwgZnJhbWVOdW1iZXIsIGNhbWVyYUlkKTsKIAotICAgIGdvdEFsbFN0YXRlcyAmPSB1cGRhdGVQZW5kaW5nU3RhdGU8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BV0JfU1RBVEUsCisgICAgZ290QVdCU3RhdGUgJj0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQVdCX1NUQVRFLAogICAgICAgICAgICAgJnBlbmRpbmdTdGF0ZS5hd2JTdGF0ZSwgZnJhbWVOdW1iZXIsIGNhbWVyYUlkKTsKIAogICAgIHBlbmRpbmdTdGF0ZS5hZlRyaWdnZXJJZCA9IGZyYW1lLm1SZXN1bHRFeHRyYXMuYWZUcmlnZ2VySWQ7CiAgICAgcGVuZGluZ1N0YXRlLmFlVHJpZ2dlcklkID0gZnJhbWUubVJlc3VsdEV4dHJhcy5wcmVjYXB0dXJlVHJpZ2dlcklkOwogCisgICAgaWYgKGdvdEFFU3RhdGUgJiYgKGZyYW1lTnVtYmVyID4gbUxhc3RBRUZyYW1lTnVtYmVyKSkgeworICAgICAgICBpZiAocGVuZGluZ1N0YXRlLmFlU3RhdGUgIT0gbTNhU3RhdGUuYWVTdGF0ZSB8fAorICAgICAgICAgICAgICAgIHBlbmRpbmdTdGF0ZS5hZVRyaWdnZXJJZCA+IG0zYVN0YXRlLmFlVHJpZ2dlcklkKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogQUUgc3RhdGUgJWQtPiVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgbTNhU3RhdGUuYWVTdGF0ZSwgcGVuZGluZ1N0YXRlLmFlU3RhdGUpOworICAgICAgICAgICAgY2xpZW50LT5ub3RpZnlBdXRvRXhwb3N1cmUocGVuZGluZ1N0YXRlLmFlU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZVRyaWdnZXJJZCk7CisKKyAgICAgICAgICAgIG0zYVN0YXRlLmFlU3RhdGUgPSBwZW5kaW5nU3RhdGUuYWVTdGF0ZTsKKyAgICAgICAgICAgIG0zYVN0YXRlLmFlVHJpZ2dlcklkID0gcGVuZGluZ1N0YXRlLmFlVHJpZ2dlcklkOworICAgICAgICAgICAgbUxhc3RBRUZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ290QUZTdGF0ZSAmJiAoZnJhbWVOdW1iZXIgPiBtTGFzdEFGcmFtZU51bWJlcikpIHsKKyAgICAgICAgaWYgKHBlbmRpbmdTdGF0ZS5hZlN0YXRlICE9IG0zYVN0YXRlLmFmU3RhdGUgfHwKKyAgICAgICAgICAgICAgICBwZW5kaW5nU3RhdGUuYWZNb2RlICE9IG0zYVN0YXRlLmFmTW9kZSB8fAorICAgICAgICAgICAgICAgIHBlbmRpbmdTdGF0ZS5hZlRyaWdnZXJJZCAhPSBtM2FTdGF0ZS5hZlRyaWdnZXJJZCkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEFGIHN0YXRlICVkLT4lZC4gQUYgbW9kZSAlZC0+JWQuIFRyaWdnZXIgJWQtPiVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgbTNhU3RhdGUuYWZTdGF0ZSwgcGVuZGluZ1N0YXRlLmFmU3RhdGUsCisgICAgICAgICAgICAgICAgICAgIG0zYVN0YXRlLmFmTW9kZSwgcGVuZGluZ1N0YXRlLmFmTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgbTNhU3RhdGUuYWZUcmlnZ2VySWQsIHBlbmRpbmdTdGF0ZS5hZlRyaWdnZXJJZCk7CisgICAgICAgICAgICBjbGllbnQtPm5vdGlmeUF1dG9Gb2N1cyhwZW5kaW5nU3RhdGUuYWZTdGF0ZSwgcGVuZGluZ1N0YXRlLmFmVHJpZ2dlcklkKTsKKworICAgICAgICAgICAgbTNhU3RhdGUuYWZTdGF0ZSA9IHBlbmRpbmdTdGF0ZS5hZlN0YXRlOworICAgICAgICAgICAgbTNhU3RhdGUuYWZNb2RlID0gcGVuZGluZ1N0YXRlLmFmTW9kZTsKKyAgICAgICAgICAgIG0zYVN0YXRlLmFmVHJpZ2dlcklkID0gcGVuZGluZ1N0YXRlLmFmVHJpZ2dlcklkOworICAgICAgICAgICAgbUxhc3RBRnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChnb3RBV0JTdGF0ZSAmJiAoZnJhbWVOdW1iZXIgPiBtTGFzdEFXQkZyYW1lTnVtYmVyKSkgeworICAgICAgICBpZiAocGVuZGluZ1N0YXRlLmF3YlN0YXRlICE9IG0zYVN0YXRlLmF3YlN0YXRlIHx8CisgICAgICAgICAgICAgICAgcGVuZGluZ1N0YXRlLmF3Yk1vZGUgIT0gbTNhU3RhdGUuYXdiTW9kZSkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEFXQiBzdGF0ZSAlZC0+JWQuIEFXQiBtb2RlICVkLT4lZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIG0zYVN0YXRlLmF3YlN0YXRlLCBwZW5kaW5nU3RhdGUuYXdiU3RhdGUsCisgICAgICAgICAgICAgICAgICAgIG0zYVN0YXRlLmF3Yk1vZGUsIHBlbmRpbmdTdGF0ZS5hd2JNb2RlKTsKKyAgICAgICAgICAgIGNsaWVudC0+bm90aWZ5QXV0b1doaXRlYmFsYW5jZShwZW5kaW5nU3RhdGUuYXdiU3RhdGUsCisgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdTdGF0ZS5hZVRyaWdnZXJJZCk7CisKKyAgICAgICAgICAgIG0zYVN0YXRlLmF3Yk1vZGUgPSBwZW5kaW5nU3RhdGUuYXdiTW9kZTsKKyAgICAgICAgICAgIG0zYVN0YXRlLmF3YlN0YXRlID0gcGVuZGluZ1N0YXRlLmF3YlN0YXRlOworICAgICAgICAgICAgbUxhc3RBV0JGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOworICAgICAgICB9CisgICAgfQorCisgICAgZ290QWxsU3RhdGVzICY9IGdvdEFFU3RhdGUgJiBnb3RBRlN0YXRlICYgZ290QVdCU3RhdGU7CiAgICAgaWYgKCFnb3RBbGxTdGF0ZXMpIHsKICAgICAgICAgLy8gSWYgbm90IGFsbCBzdGF0ZXMgYXJlIHJlY2VpdmVkLCBwdXQgdGhlIHBlbmRpbmcgc3RhdGUgdG8gbVBlbmRpbmczQVN0YXRlcy4KICAgICAgICAgaWYgKGluZGV4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CkBAIC0yOTAsNDAgKzM0MiwxMCBAQAogICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwogICAgIH0KIAotICAgIC8vIE9uY2UgYWxsIDNBIHN0YXRlcyBhcmUgcmVjZWl2ZWQsIG5vdGlmeSB0aGUgY2xpZW50IGFib3V0IDNBIGNoYW5nZXMuCi0gICAgaWYgKHBlbmRpbmdTdGF0ZS5hZVN0YXRlICE9IG0zYVN0YXRlLmFlU3RhdGUgfHwKLSAgICAgICAgICAgIHBlbmRpbmdTdGF0ZS5hZVRyaWdnZXJJZCA+IG0zYVN0YXRlLmFlVHJpZ2dlcklkKSB7Ci0gICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBBRSBzdGF0ZSAlZC0+JWQiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgbTNhU3RhdGUuYWVTdGF0ZSwgcGVuZGluZ1N0YXRlLmFlU3RhdGUpOwotICAgICAgICBjbGllbnQtPm5vdGlmeUF1dG9FeHBvc3VyZShwZW5kaW5nU3RhdGUuYWVTdGF0ZSwgcGVuZGluZ1N0YXRlLmFlVHJpZ2dlcklkKTsKLSAgICB9Ci0KLSAgICBpZiAocGVuZGluZ1N0YXRlLmFmU3RhdGUgIT0gbTNhU3RhdGUuYWZTdGF0ZSB8fAotICAgICAgICBwZW5kaW5nU3RhdGUuYWZNb2RlICE9IG0zYVN0YXRlLmFmTW9kZSB8fAotICAgICAgICBwZW5kaW5nU3RhdGUuYWZUcmlnZ2VySWQgIT0gbTNhU3RhdGUuYWZUcmlnZ2VySWQpIHsKLSAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEFGIHN0YXRlICVkLT4lZC4gQUYgbW9kZSAlZC0+JWQuIFRyaWdnZXIgJWQtPiVkIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLAotICAgICAgICAgICAgICAgIG0zYVN0YXRlLmFmU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZlN0YXRlLAotICAgICAgICAgICAgICAgIG0zYVN0YXRlLmFmTW9kZSwgcGVuZGluZ1N0YXRlLmFmTW9kZSwKLSAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hZlRyaWdnZXJJZCwgcGVuZGluZ1N0YXRlLmFmVHJpZ2dlcklkKTsKLSAgICAgICAgY2xpZW50LT5ub3RpZnlBdXRvRm9jdXMocGVuZGluZ1N0YXRlLmFmU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZlRyaWdnZXJJZCk7Ci0gICAgfQotICAgIGlmIChwZW5kaW5nU3RhdGUuYXdiU3RhdGUgIT0gbTNhU3RhdGUuYXdiU3RhdGUgfHwKLSAgICAgICAgcGVuZGluZ1N0YXRlLmF3Yk1vZGUgIT0gbTNhU3RhdGUuYXdiTW9kZSkgewotICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogQVdCIHN0YXRlICVkLT4lZC4gQVdCIG1vZGUgJWQtPiVkIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLAotICAgICAgICAgICAgICAgIG0zYVN0YXRlLmF3YlN0YXRlLCBwZW5kaW5nU3RhdGUuYXdiU3RhdGUsCi0gICAgICAgICAgICAgICAgbTNhU3RhdGUuYXdiTW9kZSwgcGVuZGluZ1N0YXRlLmF3Yk1vZGUpOwotICAgICAgICBjbGllbnQtPm5vdGlmeUF1dG9XaGl0ZWJhbGFuY2UocGVuZGluZ1N0YXRlLmF3YlN0YXRlLAotICAgICAgICAgICAgICAgIHBlbmRpbmdTdGF0ZS5hZVRyaWdnZXJJZCk7Ci0gICAgfQotCiAgICAgaWYgKGluZGV4ICE9IE5BTUVfTk9UX0ZPVU5EKSB7CiAgICAgICAgIG1QZW5kaW5nM0FTdGF0ZXMucmVtb3ZlSXRlbXNBdChpbmRleCk7CiAgICAgfQogCi0gICAgbTNhU3RhdGUgPSBwZW5kaW5nU3RhdGU7CiAgICAgbUxhc3QzQUZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CiAKICAgICByZXR1cm4gT0s7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5oCmluZGV4IDYyYTRlOTEuLjgxODNjMTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5oCkBAIC0xMDQsOCArMTA0LDcgQEAKICAgICAvLyBUcmFjayBtb3N0IHJlY2VudCBmcmFtZSBudW1iZXIgZm9yIHdoaWNoIDNBIG5vdGlmaWNhdGlvbnMgd2VyZSBzZW50IGZvci4KICAgICAvLyBVc2VkIHRvIGZpbHRlciBhZ2FpbnN0IHNlbmRpbmcgM0Egbm90aWZpY2F0aW9ucyBmb3IgdGhlIHNhbWUgZnJhbWUKICAgICAvLyBzZXZlcmFsIHRpbWVzLgotICAgIGludDMyX3QgbUxhc3QzQUZyYW1lTnVtYmVyOwotCisgICAgaW50MzJfdCBtTGFzdDNBRnJhbWVOdW1iZXIsIG1MYXN0QUVGcmFtZU51bWJlciwgbUxhc3RBRnJhbWVOdW1iZXIsIG1MYXN0QVdCRnJhbWVOdW1iZXI7CiAgICAgLy8gRW1pdCBGYWNlRGV0ZWN0aW9uIGV2ZW50IHRvIGphdmEgaWYgZmFjZXMgY2hhbmdlZAogICAgIHZvaWQgY2FsbGJhY2tGYWNlRGV0ZWN0aW9uKGNvbnN0IHNwPENhbWVyYTJDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX2ZyYW1lX21ldGFkYXRhICZtZXRhZGF0YSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAKaW5kZXggMjhkMTg2YS4uMThhZGRiNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcApAQCAtNjksNyArNjksNyBAQAogICAgIHJlcyA9IGJ1aWxkUXVpcmtzKCk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKIAotICAgIGNvbnN0IFNpemUgTUFYX1BSRVZJRVdfU0laRSA9IHsgTUFYX1BSRVZJRVdfV0lEVEgsIE1BWF9QUkVWSUVXX0hFSUdIVCB9OworICAgIFNpemUgbWF4UHJldmlld1NpemUgPSB7IE1BWF9QUkVWSUVXX1dJRFRILCBNQVhfUFJFVklFV19IRUlHSFQgfTsKICAgICAvLyBUcmVhdCB0aGUgSC4yNjQgbWF4IHNpemUgYXMgdGhlIG1heCBzdXBwb3J0ZWQgdmlkZW8gc2l6ZS4KICAgICBNZWRpYVByb2ZpbGVzICp2aWRlb0VuY29kZXJQcm9maWxlcyA9IE1lZGlhUHJvZmlsZXM6OmdldEluc3RhbmNlKCk7CiAgICAgVmVjdG9yPHZpZGVvX2VuY29kZXI+IGVuY29kZXJzID0gdmlkZW9FbmNvZGVyUHJvZmlsZXMtPmdldFZpZGVvRW5jb2RlcnMoKTsKQEAgLTkwLDExICs5MCwxNiBAQAogICAgICAgICB9CiAgICAgfQogICAgIC8vIFRoaXMgaXMganVzdCBhbiB1cHBlciBib3VuZCBhbmQgbWF5IG5vdCBiZSBhbiBhY3R1YWxseSB2YWxpZCB2aWRlbyBzaXplCi0gICAgY29uc3QgU2l6ZSBWSURFT19TSVpFX1VQUEVSX0JPVU5EID0ge21heFZpZGVvV2lkdGgsIG1heFZpZGVvSGVpZ2h0fTsKKyAgICBTaXplIHZpZGVvU2l6ZVVwcGVyQm91bmQgPSB7bWF4VmlkZW9XaWR0aCwgbWF4VmlkZW9IZWlnaHR9OwogCi0gICAgcmVzID0gZ2V0RmlsdGVyZWRTaXplcyhNQVhfUFJFVklFV19TSVpFLCAmYXZhaWxhYmxlUHJldmlld1NpemVzKTsKKyAgICBpZiAoZmFzdEluZm8uc3VwcG9ydHNQcmVmZXJyZWRDb25maWdzKSB7CisgICAgICAgIG1heFByZXZpZXdTaXplID0gZ2V0TWF4U2l6ZShnZXRQcmVmZXJyZWRQcmV2aWV3U2l6ZXMoKSk7CisgICAgICAgIHZpZGVvU2l6ZVVwcGVyQm91bmQgPSBnZXRNYXhTaXplKGdldFByZWZlcnJlZFZpZGVvU2l6ZXMoKSk7CisgICAgfQorCisgICAgcmVzID0gZ2V0RmlsdGVyZWRTaXplcyhtYXhQcmV2aWV3U2l6ZSwgJmF2YWlsYWJsZVByZXZpZXdTaXplcyk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKLSAgICByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKFZJREVPX1NJWkVfVVBQRVJfQk9VTkQsICZhdmFpbGFibGVWaWRlb1NpemVzKTsKKyAgICByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKHZpZGVvU2l6ZVVwcGVyQm91bmQsICZhdmFpbGFibGVWaWRlb1NpemVzKTsKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwogCiAgICAgLy8gU2VsZWN0IGluaXRpYWwgcHJldmlldyBhbmQgdmlkZW8gc2l6ZSB0aGF0J3MgdW5kZXIgdGhlIGluaXRpYWwgYm91bmQgYW5kCkBAIC0yOTYsOSArMzAxLDEzIEBACiAgICAgVmVjdG9yPFNpemU+IGF2YWlsYWJsZUpwZWdTaXplcyA9IGdldEF2YWlsYWJsZUpwZWdTaXplcygpOwogICAgIGlmICghYXZhaWxhYmxlSnBlZ1NpemVzLnNpemUoKSkgcmV0dXJuIE5PX0lOSVQ7CiAKLSAgICAvLyBUT0RPOiBQaWNrIG1heGltdW0KICAgICBwaWN0dXJlV2lkdGggPSBhdmFpbGFibGVKcGVnU2l6ZXNbMF0ud2lkdGg7CiAgICAgcGljdHVyZUhlaWdodCA9IGF2YWlsYWJsZUpwZWdTaXplc1swXS5oZWlnaHQ7CisgICAgaWYgKGZhc3RJbmZvLnN1cHBvcnRzUHJlZmVycmVkQ29uZmlncykgeworICAgICAgICBTaXplIHN1Z2dlc3RlZEpwZWdTaXplID0gZ2V0TWF4U2l6ZShnZXRQcmVmZXJyZWRKcGVnU2l6ZXMoKSk7CisgICAgICAgIHBpY3R1cmVXaWR0aCA9IHN1Z2dlc3RlZEpwZWdTaXplLndpZHRoOworICAgICAgICBwaWN0dXJlSGVpZ2h0ID0gc3VnZ2VzdGVkSnBlZ1NpemUuaGVpZ2h0OworICAgIH0KICAgICBwaWN0dXJlV2lkdGhMYXN0U2V0ID0gcGljdHVyZVdpZHRoOwogICAgIHBpY3R1cmVIZWlnaHRMYXN0U2V0ID0gcGljdHVyZUhlaWdodDsKICAgICBwaWN0dXJlU2l6ZU92ZXJyaWRlbiA9IGZhbHNlOwpAQCAtNzU3LDYgKzc2Niw3IEBACiAgICAgZm9jdXNTdGF0ZSA9IEFORFJPSURfQ09OVFJPTF9BRl9TVEFURV9JTkFDVElWRTsKICAgICBzaGFkb3dGb2N1c01vZGUgPSBGT0NVU19NT0RFX0lOVkFMSUQ7CiAKKyAgICBhZVN0YXRlID0gQU5EUk9JRF9DT05UUk9MX0FFX1NUQVRFX0lOQUNUSVZFOwogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IG1heDNhUmVnaW9ucyA9IHN0YXRpY0luZm8oQU5EUk9JRF9DT05UUk9MX01BWF9SRUdJT05TLAogICAgICAgICAgICAgUGFyYW1ldGVyczo6TlVNX1JFR0lPTiwgUGFyYW1ldGVyczo6TlVNX1JFR0lPTik7CiAgICAgaWYgKG1heDNhUmVnaW9ucy5jb3VudCAhPSBQYXJhbWV0ZXJzOjpOVU1fUkVHSU9OKSByZXR1cm4gTk9fSU5JVDsKQEAgLTEwMTAsNiArMTAyMCw5IEBACiAgICAgICAgIGFycmF5SGVpZ2h0ID0gYWN0aXZlQXJyYXlTaXplLmRhdGEuaTMyWzNdOwogICAgIH0gZWxzZSByZXR1cm4gTk9fSU5JVDsKIAorICAgIGZhc3RJbmZvLnN1cHBvcnRzUHJlZmVycmVkQ29uZmlncyA9CisgICAgICAgIGluZm8tPmV4aXN0cyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKKwogICAgIC8vIFdlJ2xsIHNldCB0aGUgdGFyZ2V0IEZQUyByYW5nZSBmb3Igc3RpbGwgY2FwdHVyZXMgdG8gYmUgYXMgd2lkZQogICAgIC8vIGFzIHBvc3NpYmxlIHRvIGdpdmUgdGhlIEhBTCBtYXhpbXVtIGxhdGl0dWRlIGZvciBleHBvc3VyZSBzZWxlY3Rpb24KICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVGcHNSYW5nZXMgPQpAQCAtMTAyMSw4ICsxMDM0LDExIEBACiAgICAgLy8gR2V0IHN1cHBvcnRlZCBwcmV2aWV3IGZwcyByYW5nZXMsIHVwIHRvIGRlZmF1bHQgbWF4aW11bS4KICAgICBWZWN0b3I8U2l6ZT4gc3VwcG9ydGVkUHJldmlld1NpemVzOwogICAgIFZlY3RvcjxGcHNSYW5nZT4gc3VwcG9ydGVkUHJldmlld0Zwc1JhbmdlczsKLSAgICBjb25zdCBTaXplIFBSRVZJRVdfU0laRV9CT1VORCA9IHsgTUFYX1BSRVZJRVdfV0lEVEgsIE1BWF9QUkVWSUVXX0hFSUdIVCB9OwotICAgIHN0YXR1c190IHJlcyA9IGdldEZpbHRlcmVkU2l6ZXMoUFJFVklFV19TSVpFX0JPVU5ELCAmc3VwcG9ydGVkUHJldmlld1NpemVzKTsKKyAgICBTaXplIHByZXZpZXdTaXplQm91bmQgPSB7IE1BWF9QUkVWSUVXX1dJRFRILCBNQVhfUFJFVklFV19IRUlHSFQgfTsKKyAgICBpZiAoZmFzdEluZm8uc3VwcG9ydHNQcmVmZXJyZWRDb25maWdzKSB7CisgICAgICAgIHByZXZpZXdTaXplQm91bmQgPSBnZXRNYXhTaXplKGdldFByZWZlcnJlZFByZXZpZXdTaXplcygpKTsKKyAgICB9CisgICAgc3RhdHVzX3QgcmVzID0gZ2V0RmlsdGVyZWRTaXplcyhwcmV2aWV3U2l6ZUJvdW5kLCAmc3VwcG9ydGVkUHJldmlld1NpemVzKTsKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwogICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGF2YWlsYWJsZUZwc1Jhbmdlcy5jb3VudDsgaSArPSAyKSB7CiAgICAgICAgIGlmICghaXNGcHNTdXBwb3J0ZWQoc3VwcG9ydGVkUHJldmlld1NpemVzLApAQCAtMzEwNiw2ICszMTIyLDY3IEBACiAgICAgcmV0dXJuIGpwZWdTaXplczsKIH0KIAorVmVjdG9yPFBhcmFtZXRlcnM6OlN0cmVhbUNvbmZpZ3VyYXRpb24+IFBhcmFtZXRlcnM6OmdldFByZWZlcnJlZFN0cmVhbUNvbmZpZ3VyYXRpb25zKAorICAgICAgICBpbnQzMl90IHVzZWNhc2VJZCkgY29uc3QgeworICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFID0gNTsKKyAgICBjb25zdCBzaXplX3QgU1RSRUFNX1dJRFRIX09GRlNFVCA9IDA7CisgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9IRUlHSFRfT0ZGU0VUID0gMTsKKyAgICBjb25zdCBzaXplX3QgU1RSRUFNX0ZPUk1BVF9PRkZTRVQgPSAyOworICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUID0gMzsKKyAgICBjb25zdCBzaXplX3QgU1RSRUFNX1VTRUNBU0VfQklUTUFQX09GRlNFVCA9IDQ7CisgICAgVmVjdG9yPFN0cmVhbUNvbmZpZ3VyYXRpb24+IHNjczsKKworICAgIGlmIChmYXN0SW5mby5zdXBwb3J0c1ByZWZlcnJlZENvbmZpZ3MpIHsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlU3RyZWFtQ29uZmlncyA9IHN0YXRpY0luZm8oCisgICAgICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OUyk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5jb3VudDsgaSs9IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUpIHsKKyAgICAgICAgICAgIGludDMyX3Qgd2lkdGggPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fV0lEVEhfT0ZGU0VUXTsKKyAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0ID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX0hFSUdIVF9PRkZTRVRdOworICAgICAgICAgICAgaW50MzJfdCBmb3JtYXQgPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fRk9STUFUX09GRlNFVF07CisgICAgICAgICAgICBpbnQzMl90IGlzSW5wdXQgPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUXTsKKyAgICAgICAgICAgIGludDMyX3Qgc3VwcG9ydGVkVXNlY2FzZXMgPQorICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fVVNFQ0FTRV9CSVRNQVBfT0ZGU0VUXTsKKyAgICAgICAgICAgIGlmIChzdXBwb3J0ZWRVc2VjYXNlcyAmICgxIDw8IHVzZWNhc2VJZCkpIHsKKyAgICAgICAgICAgICAgICBTdHJlYW1Db25maWd1cmF0aW9uIHNjID0ge2Zvcm1hdCwgd2lkdGgsIGhlaWdodCwgaXNJbnB1dH07CisgICAgICAgICAgICAgICAgc2NzLmFkZChzYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2NzOworfQorCitWZWN0b3I8UGFyYW1ldGVyczo6U2l6ZT4gUGFyYW1ldGVyczo6Z2V0UHJlZmVycmVkRmlsdGVyZWRTaXplcyhpbnQzMl90IHVzZWNhc2VJZCwKKyAgICAgICAgaW50MzJfdCBmb3JtYXQpIGNvbnN0IHsKKyAgICBWZWN0b3I8UGFyYW1ldGVyczo6U2l6ZT4gc2l6ZXM7CisgICAgVmVjdG9yPFN0cmVhbUNvbmZpZ3VyYXRpb24+IHNjcyA9IGdldFByZWZlcnJlZFN0cmVhbUNvbmZpZ3VyYXRpb25zKHVzZWNhc2VJZCk7CisgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IHNjcykgeworICAgICAgICBpZiAoaXQuZm9ybWF0ID09IGZvcm1hdCkgeworICAgICAgICAgICAgc2l6ZXMuYWRkKHtpdC53aWR0aCwgaXQuaGVpZ2h0fSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2l6ZXM7Cit9CisKK1ZlY3RvcjxQYXJhbWV0ZXJzOjpTaXplPiBQYXJhbWV0ZXJzOjpnZXRQcmVmZXJyZWRKcGVnU2l6ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFByZWZlcnJlZEZpbHRlcmVkU2l6ZXMoCisgICAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1NOQVBTSE9ULAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKTsKK30KKworVmVjdG9yPFBhcmFtZXRlcnM6OlNpemU+IFBhcmFtZXRlcnM6OmdldFByZWZlcnJlZFByZXZpZXdTaXplcygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UHJlZmVycmVkRmlsdGVyZWRTaXplcygKKyAgICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfUFJFVklFVywKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCk7Cit9CisKK1ZlY3RvcjxQYXJhbWV0ZXJzOjpTaXplPiBQYXJhbWV0ZXJzOjpnZXRQcmVmZXJyZWRWaWRlb1NpemVzKCkgY29uc3QgeworICAgIHJldHVybiBnZXRQcmVmZXJyZWRGaWx0ZXJlZFNpemVzKAorICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19SRUNPUkQsCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpOworfQorCiBQYXJhbWV0ZXJzOjpDcm9wUmVnaW9uIFBhcmFtZXRlcnM6OmNhbGN1bGF0ZUNyb3BSZWdpb24oYm9vbCBwcmV2aWV3T25seSkgY29uc3QgewogCiAgICAgZmxvYXQgem9vbUxlZnQsIHpvb21Ub3AsIHpvb21XaWR0aCwgem9vbUhlaWdodDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oCmluZGV4IDQyZTdhNDcuLjNhNzA5YzkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaApAQCAtMTIyLDYgKzEyMiw3IEBACiAgICAgICAgIGludDMyX3QgaGlnaDsKICAgICB9OwogCisgICAgdWludDhfdCBhZVN0YXRlOyAvL2xhdGVzdCBBRSBzdGF0ZSBmcm9tIEhhbAogICAgIGludDMyX3QgZXhwb3N1cmVDb21wZW5zYXRpb247CiAgICAgYm9vbCBhdXRvRXhwb3N1cmVMb2NrOwogICAgIGJvb2wgYXV0b0V4cG9zdXJlTG9ja0F2YWlsYWJsZTsKQEAgLTI0Nyw2ICsyNDgsNyBAQAogICAgICAgICBib29sIHVzZUZsZXhpYmxlWXV2OwogICAgICAgICBTaXplIG1heEpwZWdTaXplOwogICAgICAgICBTaXplIG1heFpzbFNpemU7CisgICAgICAgIGJvb2wgc3VwcG9ydHNQcmVmZXJyZWRDb25maWdzOwogICAgIH0gZmFzdEluZm87CiAKICAgICAvLyBRdWlya3MgaW5mb3JtYXRpb247IHRoZXNlIGFyZSBzaG9ydC1saXZlZCBmbGFncyB0byBlbmFibGUgd29ya2Fyb3VuZHMgZm9yCkBAIC00MTcsNiArNDE5LDkgQEAKICAgICAvLyByZXR1cm5zIGFuIGVtcHR5IFZlY3RvciBpZiBkZXZpY2UgSEFMIHZlcnNpb24gZG9lcyBzdXBwb3J0IGl0CiAgICAgVmVjdG9yPFN0cmVhbUNvbmZpZ3VyYXRpb24+IGdldFN0cmVhbUNvbmZpZ3VyYXRpb25zKCk7CiAKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZXh0cmFjdCB0aGUgc3VnZ2VzdGVkIHN0cmVhbSBjb25maWd1cmF0aW9ucworICAgIFZlY3RvcjxTdHJlYW1Db25maWd1cmF0aW9uPiBnZXRQcmVmZXJyZWRTdHJlYW1Db25maWd1cmF0aW9ucyhpbnQzMl90IHVzZWNhc2VJZCkgY29uc3Q7CisKICAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IG1pbmltdW0gZnJhbWUgZHVyYXRpb24gZm9yIGEganBlZyBzaXplCiAgICAgLy8gcmV0dXJuIC0xIGlmIGlucHV0IGpwZWcgc2l6ZSBjYW5ub3QgYmUgZm91bmQgaW4gc3VwcG9ydGVkIHNpemUgbGlzdAogICAgIGludDY0X3QgZ2V0SnBlZ1N0cmVhbU1pbkZyYW1lRHVyYXRpb25OcyhQYXJhbWV0ZXJzOjpTaXplIHNpemUpOwpAQCAtNDM4LDYgKzQ0MywxNSBAQAogICAgIC8vIFRoZSBtYXhpbXVtIHNpemUgaXMgZGVmaW5lZCBieSBjb21wYXJpbmcgd2lkdGggZmlyc3QsIHdoZW4gd2lkdGggdGllcyBjb21wYXJpbmcgaGVpZ2h0LgogICAgIFNpemUgZ2V0TWF4U2l6ZShjb25zdCBWZWN0b3I8U2l6ZT4mIHNpemVzKTsKIAorICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBmaWx0ZXIgYW5kIHNvcnQgc3VnZ2VzdGVkIHNpemVzCisgICAgVmVjdG9yPFBhcmFtZXRlcnM6OlNpemU+IGdldFByZWZlcnJlZEZpbHRlcmVkU2l6ZXMoaW50MzJfdCB1c2VjYXNlSWQsIGludDMyX3QgZm9ybWF0KSBjb25zdDsKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzdWdnZXN0ZWQganBlZyBzaXplcworICAgIFZlY3RvcjxTaXplPiBnZXRQcmVmZXJyZWRKcGVnU2l6ZXMoKSBjb25zdDsKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzdWdnZXN0ZWQgcHJldmlldyBzaXplcworICAgIFZlY3RvcjxTaXplPiBnZXRQcmVmZXJyZWRQcmV2aWV3U2l6ZXMoKSBjb25zdDsKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzdWdnZXN0ZWQgdmlkZW8gc2l6ZXMKKyAgICBWZWN0b3I8U2l6ZT4gZ2V0UHJlZmVycmVkVmlkZW9TaXplcygpIGNvbnN0OworCiAgICAgaW50IG1EZXZpY2VWZXJzaW9uOwogICAgIHVpbnQ4X3QgbURlZmF1bHRTY2VuZU1vZGU7CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCmluZGV4IDU2N2IxNWYuLjQ2ZmJjM2UgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8dXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CkBAIC0yNiw2ICsyNyw4IEBACiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVV0aWxzLmg+CiAKICNpbmNsdWRlICJjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIgorI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM0RldmljZS5oIgorI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oIgogI2luY2x1ZGUgImFwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgiCiAKICNpbmNsdWRlIDxjYW1lcmFfbWV0YWRhdGFfaGlkZGVuLmg+CkBAIC0xMjIsNiArMTI1LDcgQEAKICAgICAgICAgICAgICAgICBwaHlzaWNhbEtleXNFbnRyeS5kYXRhLmkzMiArIHBoeXNpY2FsS2V5c0VudHJ5LmNvdW50KTsKICAgICB9CiAKKyAgICBtUHJvdmlkZXJNYW5hZ2VyID0gcHJvdmlkZXJQdHI7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC00NjksNiArNDczLDY4IEBACiAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfRElTQ09OTkVDVEVELCAiQ2FtZXJhIGRldmljZSBubyBsb25nZXIgYWxpdmUiKTsKICAgICB9CiAKKyAgICByZXMgPSBjaGVja09wZXJhdGluZ01vZGVMb2NrZWQob3BlcmF0aW5nTW9kZSk7CisgICAgaWYgKCFyZXMuaXNPaygpKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gbURldmljZS0+Y29uZmlndXJlU3RyZWFtcyhzZXNzaW9uUGFyYW1zLCBvcGVyYXRpbmdNb2RlKTsKKyAgICBpZiAoZXJyID09IEJBRF9WQUxVRSkgeworICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBVbnN1cHBvcnRlZCBzZXQgb2YgaW5wdXRzL291dHB1dHMgcHJvdmlkZWQiLAorICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOworICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IEVycm9yIGNvbmZpZ3VyaW5nIHN0cmVhbXM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgc3RyZXJyb3IoLWVyciksIGVycik7CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgbXNnLnN0cmluZygpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitiaW5kZXI6OlN0YXR1cyBDYW1lcmFEZXZpY2VDbGllbnQ6OmNoZWNrU3VyZmFjZVR5cGVMb2NrZWQoc2l6ZV90IG51bUJ1ZmZlclByb2R1Y2VycywKKyAgICAgICAgYm9vbCBkZWZlcnJlZENvbnN1bWVyLCBpbnQgc3VyZmFjZVR5cGUpIGNvbnN0IHsKKyAgICBpZiAobnVtQnVmZmVyUHJvZHVjZXJzID4gTUFYX1NVUkZBQ0VTX1BFUl9TVFJFQU0pIHsKKyAgICAgICAgQUxPR0UoIiVzOiBHcmFwaGljQnVmZmVyUHJvZHVjZXIgY291bnQgJXp1IGZvciBzdHJlYW0gZXhjZWVkcyBsaW1pdCBvZiAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBudW1CdWZmZXJQcm9kdWNlcnMsIE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiU3VyZmFjZSBjb3VudCBpcyB0b28gaGlnaCIpOworICAgIH0gZWxzZSBpZiAoKG51bUJ1ZmZlclByb2R1Y2VycyA9PSAwKSAmJiAoIWRlZmVycmVkQ29uc3VtZXIpKSB7CisgICAgICAgIEFMT0dFKCIlczogTnVtYmVyIG9mIGNvbnN1bWVycyBjYW5ub3QgYmUgc21hbGxlciB0aGFuIDEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsICJObyB2YWxpZCBjb25zdW1lcnMuIik7CisgICAgfQorCisgICAgYm9vbCB2YWxpZFN1cmZhY2VUeXBlID0gKChzdXJmYWNlVHlwZSA9PSBPdXRwdXRDb25maWd1cmF0aW9uOjpTVVJGQUNFX1RZUEVfU1VSRkFDRV9WSUVXKSB8fAorICAgICAgICAgICAgKHN1cmZhY2VUeXBlID09IE91dHB1dENvbmZpZ3VyYXRpb246OlNVUkZBQ0VfVFlQRV9TVVJGQUNFX1RFWFRVUkUpKTsKKworICAgIGlmIChkZWZlcnJlZENvbnN1bWVyICYmICF2YWxpZFN1cmZhY2VUeXBlKSB7CisgICAgICAgIEFMT0dFKCIlczogVGFyZ2V0IHN1cmZhY2UgaGFzIGludmFsaWQgc3VyZmFjZVR5cGUgPSAlZC4iLCBfX0ZVTkNUSU9OX18sIHN1cmZhY2VUeXBlKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiVGFyZ2V0IFN1cmZhY2UgaXMgaW52YWxpZCIpOworICAgIH0KKworICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworYmluZGVyOjpTdGF0dXMgQ2FtZXJhRGV2aWNlQ2xpZW50OjpjaGVja1BoeXNpY2FsQ2FtZXJhSWRMb2NrZWQoU3RyaW5nOCBwaHlzaWNhbENhbWVyYUlkKSB7CisgICAgaWYgKHBoeXNpY2FsQ2FtZXJhSWQuc2l6ZSgpID4gMCkgeworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGh5c2ljYWxDYW1lcmFJZHM7CisgICAgICAgIGJvb2wgbG9naWNhbENhbWVyYSA9CisgICAgICAgICAgICBtUHJvdmlkZXJNYW5hZ2VyLT5pc0xvZ2ljYWxDYW1lcmEobUNhbWVyYUlkU3RyLnN0cmluZygpLCAmcGh5c2ljYWxDYW1lcmFJZHMpOworICAgICAgICBpZiAoIWxvZ2ljYWxDYW1lcmEgfHwKKyAgICAgICAgICAgICAgICBzdGQ6OmZpbmQocGh5c2ljYWxDYW1lcmFJZHMuYmVnaW4oKSwgcGh5c2ljYWxDYW1lcmFJZHMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQuc3RyaW5nKCkpID09IHBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpKSB7CisgICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBDYW1lcmEgZG9lc24ndCBzdXBwb3J0IHBoeXNpY2FsQ2FtZXJhSWQgJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBwaHlzaWNhbENhbWVyYUlkLnN0cmluZygpKTsKKyAgICAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6Y2hlY2tPcGVyYXRpbmdNb2RlTG9ja2VkKGludCBvcGVyYXRpbmdNb2RlKSBjb25zdCB7CiAgICAgaWYgKG9wZXJhdGluZ01vZGUgPCAwKSB7CiAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KAogICAgICAgICAgICAgIkNhbWVyYSAlczogSW52YWxpZCBvcGVyYXRpbmcgbW9kZSAlZCByZXF1ZXN0ZWQiLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIG9wZXJhdGluZ01vZGUpOwpAQCAtNDc3LDcgKzU0Myw2IEBACiAgICAgICAgICAgICAgICAgbXNnLnN0cmluZygpKTsKICAgICB9CiAKLSAgICAvLyBTYW5pdGl6ZSB0aGUgaGlnaCBzcGVlZCBzZXNzaW9uIGFnYWluc3QgbmVjZXNzYXJ5IGNhcGFiaWxpdHkgYml0LgogICAgIGJvb2wgaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCA9IChvcGVyYXRpbmdNb2RlID09IElDYW1lcmFEZXZpY2VVc2VyOjpDT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREUpOwogICAgIGlmIChpc0NvbnN0cmFpbmVkSGlnaFNwZWVkKSB7CiAgICAgICAgIENhbWVyYU1ldGFkYXRhIHN0YXRpY0luZm8gPSBtRGV2aWNlLT5pbmZvKCk7CkBAIC01MDAsMTcgKzU2NSwxNjMgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHN0YXR1c190IGVyciA9IG1EZXZpY2UtPmNvbmZpZ3VyZVN0cmVhbXMoc2Vzc2lvblBhcmFtcywgb3BlcmF0aW5nTW9kZSk7Ci0gICAgaWYgKGVyciA9PSBCQURfVkFMVUUpIHsKLSAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogVW5zdXBwb3J0ZWQgc2V0IG9mIGlucHV0cy9vdXRwdXRzIHByb3ZpZGVkIiwKLSAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOworICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKwordm9pZCBDYW1lcmFEZXZpY2VDbGllbnQ6Om1hcFN0cmVhbUluZm8oY29uc3QgT3V0cHV0U3RyZWFtSW5mbyAmc3RyZWFtSW5mbywKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIFN0cmluZzggcGh5c2ljYWxJZCwKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtICpzdHJlYW0gLypvdXQqLykgeworICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RyZWFtLT52M18yLnN0cmVhbVR5cGUgPSBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbVR5cGU6Ok9VVFBVVDsKKyAgICBzdHJlYW0tPnYzXzIud2lkdGggPSBzdHJlYW1JbmZvLndpZHRoOworICAgIHN0cmVhbS0+djNfMi5oZWlnaHQgPSBzdHJlYW1JbmZvLmhlaWdodDsKKyAgICBzdHJlYW0tPnYzXzIuZm9ybWF0ID0gQ2FtZXJhM0RldmljZTo6bWFwVG9QaXhlbEZvcm1hdChzdHJlYW1JbmZvLmZvcm1hdCk7CisgICAgYXV0byB1ID0gc3RyZWFtSW5mby5jb25zdW1lclVzYWdlOworICAgIGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW06OmFwcGx5WlNMVXNhZ2VRdWlyayhzdHJlYW1JbmZvLmZvcm1hdCwgJnUpOworICAgIHN0cmVhbS0+djNfMi51c2FnZSA9IENhbWVyYTNEZXZpY2U6Om1hcFRvQ29uc3VtZXJVc2FnZSh1KTsKKyAgICBzdHJlYW0tPnYzXzIuZGF0YVNwYWNlID0gQ2FtZXJhM0RldmljZTo6bWFwVG9IaWRsRGF0YXNwYWNlKHN0cmVhbUluZm8uZGF0YVNwYWNlKTsKKyAgICBzdHJlYW0tPnYzXzIucm90YXRpb24gPSBDYW1lcmEzRGV2aWNlOjptYXBUb1N0cmVhbVJvdGF0aW9uKHJvdGF0aW9uKTsKKyAgICBzdHJlYW0tPnBoeXNpY2FsQ2FtZXJhSWQgPSBzdGQ6OnN0cmluZyhwaHlzaWNhbElkLnN0cmluZygpKTsKKyAgICBzdHJlYW0tPmJ1ZmZlclNpemUgPSAwOworfQorCitiaW5kZXI6OlN0YXR1cyBDYW1lcmFEZXZpY2VDbGllbnQ6OmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgIGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBzZXNzaW9uQ29uZmlndXJhdGlvbiwgYm9vbCAqc3RhdHVzIC8qb3V0Ki8pIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgYmluZGVyOjpTdGF0dXMgcmVzOworICAgIGlmICghKHJlcyA9IGNoZWNrUGlkU3RhdHVzKF9fRlVOQ1RJT05fXykpLmlzT2soKSkgcmV0dXJuIHJlczsKKworICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKKworICAgIGlmICghbURldmljZS5nZXQoKSkgeworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0RJU0NPTk5FQ1RFRCwgIkNhbWVyYSBkZXZpY2Ugbm8gbG9uZ2VyIGFsaXZlIik7CisgICAgfQorCisgICAgYXV0byBvcGVyYXRpbmdNb2RlID0gc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0T3BlcmF0aW5nTW9kZSgpOworICAgIHJlcyA9IGNoZWNrT3BlcmF0aW5nTW9kZUxvY2tlZChvcGVyYXRpbmdNb2RlKTsKKyAgICBpZiAoIXJlcy5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBpZiAoc3RhdHVzID09IG51bGxwdHIpIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoICJDYW1lcmEgJXM6IEludmFsaWQgc3RhdHVzISIsIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CiAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOwotICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IEVycm9yIGNvbmZpZ3VyaW5nIHN0cmVhbXM6ICVzICglZCkiLAotICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgc3RyZXJyb3IoLWVyciksIGVycik7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKKyAgICB9CisKKyAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gc3RyZWFtQ29uZmlndXJhdGlvbjsKKyAgICBhdXRvIHJldCA9IENhbWVyYTNEZXZpY2U6Om1hcFRvU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjYW1lcmEzX3N0cmVhbV9jb25maWd1cmF0aW9uX21vZGVfdD4gKG9wZXJhdGluZ01vZGUpLAorICAgICAgICAgICAgLypvdXQqLyAmc3RyZWFtQ29uZmlndXJhdGlvbi5vcGVyYXRpb25Nb2RlKTsKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KAorICAgICAgICAgICAgIkNhbWVyYSAlczogRmFpbGVkIG1hcHBpbmcgb3BlcmF0aW5nIG1vZGUgJWQgcmVxdWVzdGVkOiAlcyAoJWQpIiwgbUNhbWVyYUlkU3RyLnN0cmluZygpLAorICAgICAgICAgICAgb3BlcmF0aW5nTW9kZSwgc3RyZXJyb3IoLXJldCksIHJldCk7CiAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAorICAgICAgICAgICAgICAgIG1zZy5zdHJpbmcoKSk7CisgICAgfQorCisgICAgYm9vbCBpc0lucHV0VmFsaWQgPSAoc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0SW5wdXRXaWR0aCgpID4gMCkgJiYKKyAgICAgICAgICAgIChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dEhlaWdodCgpID4gMCkgJiYKKyAgICAgICAgICAgIChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dEZvcm1hdCgpID4gMCk7CisgICAgYXV0byBvdXRwdXRDb25maWdzID0gc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0Q29uZmlndXJhdGlvbnMoKTsKKyAgICBzaXplX3Qgc3RyZWFtQ291bnQgPSBvdXRwdXRDb25maWdzLnNpemUoKTsKKyAgICBzdHJlYW1Db3VudCA9IGlzSW5wdXRWYWxpZCA/IHN0cmVhbUNvdW50ICsgMSA6IHN0cmVhbUNvdW50OworICAgIHN0cmVhbUNvbmZpZ3VyYXRpb24uc3RyZWFtcy5yZXNpemUoc3RyZWFtQ291bnQpOworICAgIHNpemVfdCBzdHJlYW1JZHggPSAwOworICAgIGlmIChpc0lucHV0VmFsaWQpIHsKKyAgICAgICAgc3RyZWFtQ29uZmlndXJhdGlvbi5zdHJlYW1zW3N0cmVhbUlkeCsrXSA9IHt7LypzdHJlYW1JZCovMCwKKyAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbVR5cGU6OklOUFVULAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PiAoc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0SW5wdXRXaWR0aCgpKSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4gKHNlc3Npb25Db25maWd1cmF0aW9uLmdldElucHV0SGVpZ2h0KCkpLAorICAgICAgICAgICAgICAgIENhbWVyYTNEZXZpY2U6Om1hcFRvUGl4ZWxGb3JtYXQoc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0SW5wdXRGb3JtYXQoKSksCisgICAgICAgICAgICAgICAgLyp1c2FnZSovIDAsIEhBTF9EQVRBU1BBQ0VfVU5LTk9XTiwKKyAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbVJvdGF0aW9uOjpST1RBVElPTl8wfSwKKyAgICAgICAgICAgICAgICAvKnBoeXNpY2FsSWQqLyBudWxscHRyLCAvKmJ1ZmZlclNpemUqLzB9OworICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byAmaXQgOiBvdXRwdXRDb25maWdzKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+PiYgYnVmZmVyUHJvZHVjZXJzID0KKyAgICAgICAgICAgIGl0LmdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcnMoKTsKKyAgICAgICAgYm9vbCBkZWZlcnJlZENvbnN1bWVyID0gaXQuaXNEZWZlcnJlZCgpOworICAgICAgICBTdHJpbmc4IHBoeXNpY2FsQ2FtZXJhSWQgPSBTdHJpbmc4KGl0LmdldFBoeXNpY2FsQ2FtZXJhSWQoKSk7CisgICAgICAgIHNpemVfdCBudW1CdWZmZXJQcm9kdWNlcnMgPSBidWZmZXJQcm9kdWNlcnMuc2l6ZSgpOworICAgICAgICBib29sIGlzU3RyZWFtSW5mb1ZhbGlkID0gZmFsc2U7CisgICAgICAgIE91dHB1dFN0cmVhbUluZm8gc3RyZWFtSW5mbzsKKworICAgICAgICByZXMgPSBjaGVja1N1cmZhY2VUeXBlTG9ja2VkKG51bUJ1ZmZlclByb2R1Y2VycywgZGVmZXJyZWRDb25zdW1lciwgaXQuZ2V0U3VyZmFjZVR5cGUoKSk7CisgICAgICAgIGlmICghcmVzLmlzT2soKSkgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorCisgICAgICAgIHJlcyA9IGNoZWNrUGh5c2ljYWxDYW1lcmFJZExvY2tlZChwaHlzaWNhbENhbWVyYUlkKTsKKyAgICAgICAgaWYgKCFyZXMuaXNPaygpKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlZmVycmVkQ29uc3VtZXIpIHsKKyAgICAgICAgICAgIHN0cmVhbUluZm8ud2lkdGggPSBpdC5nZXRXaWR0aCgpOworICAgICAgICAgICAgc3RyZWFtSW5mby5oZWlnaHQgPSBpdC5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgIHN0cmVhbUluZm8uZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOworICAgICAgICAgICAgc3RyZWFtSW5mby5kYXRhU3BhY2UgPSBhbmRyb2lkX2RhdGFzcGFjZV90OjpIQUxfREFUQVNQQUNFX1VOS05PV047CisgICAgICAgICAgICBhdXRvIHN1cmZhY2VUeXBlID0gaXQuZ2V0U3VyZmFjZVR5cGUoKTsKKyAgICAgICAgICAgIHN0cmVhbUluZm8uY29uc3VtZXJVc2FnZSA9IEdyYXBoaWNCdWZmZXI6OlVTQUdFX0hXX1RFWFRVUkU7CisgICAgICAgICAgICBpZiAoc3VyZmFjZVR5cGUgPT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6U1VSRkFDRV9UWVBFX1NVUkZBQ0VfVklFVykgeworICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uY29uc3VtZXJVc2FnZSB8PSBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19DT01QT1NFUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hcFN0cmVhbUluZm8oc3RyZWFtSW5mbywgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMCwgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgJnN0cmVhbUNvbmZpZ3VyYXRpb24uc3RyZWFtc1tzdHJlYW1JZHgrK10pOworICAgICAgICAgICAgaXNTdHJlYW1JbmZvVmFsaWQgPSB0cnVlOworCisgICAgICAgICAgICBpZiAobnVtQnVmZmVyUHJvZHVjZXJzID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoYXV0byYgYnVmZmVyUHJvZHVjZXIgOiBidWZmZXJQcm9kdWNlcnMpIHsKKyAgICAgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2U7CisgICAgICAgICAgICByZXMgPSBjcmVhdGVTdXJmYWNlRnJvbUdicChzdHJlYW1JbmZvLCBpc1N0cmVhbUluZm9WYWxpZCwgc3VyZmFjZSwgYnVmZmVyUHJvZHVjZXIsCisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQpOworCisgICAgICAgICAgICBpZiAoIXJlcy5pc09rKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKworICAgICAgICAgICAgaWYgKCFpc1N0cmVhbUluZm9WYWxpZCkgeworICAgICAgICAgICAgICAgIG1hcFN0cmVhbUluZm8oc3RyZWFtSW5mbywgc3RhdGljX2Nhc3Q8Y2FtZXJhM19zdHJlYW1fcm90YXRpb25fdD4gKGl0LmdldFJvdGF0aW9uKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZCwgJnN0cmVhbUNvbmZpZ3VyYXRpb24uc3RyZWFtc1tzdHJlYW1JZHgrK10pOworICAgICAgICAgICAgICAgIGlzU3RyZWFtSW5mb1ZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgICpzdGF0dXMgPSBmYWxzZTsKKyAgICByZXQgPSBtUHJvdmlkZXJNYW5hZ2VyLT5pc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwKKyAgICAgICAgICAgIHN0cmVhbUNvbmZpZ3VyYXRpb24sIHN0YXR1cyk7CisgICAgc3dpdGNoIChyZXQpIHsKKyAgICAgICAgY2FzZSBPSzoKKyAgICAgICAgICAgIC8vIEV4cGVjdGVkLCBkbyBub3RoaW5nLgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSU5WQUxJRF9PUEVSQVRJT046IHsKKyAgICAgICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW1lcmEgJXM6IFNlc3Npb24gY29uZmlndXJhdGlvbiBxdWVyeSBub3Qgc3VwcG9ydGVkISIsCisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIEFMT0dEKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmVzID0gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLCBtc2cuc3RyaW5nKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCAiQ2FtZXJhICVzOiBFcnJvcjogJXMgKCVkKSIsIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXQpLCByZXQpOworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmVzID0gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCisgICAgICAgICAgICAgICAgICAgICAgICBtc2cuc3RyaW5nKCkpOworICAgICAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiByZXM7CkBAIC02MDMsNDEgKzgxNCwyMyBAQAogICAgIGJvb2wgZGVmZXJyZWRDb25zdW1lciA9IG91dHB1dENvbmZpZ3VyYXRpb24uaXNEZWZlcnJlZCgpOwogICAgIGJvb2wgaXNTaGFyZWQgPSBvdXRwdXRDb25maWd1cmF0aW9uLmlzU2hhcmVkKCk7CiAgICAgU3RyaW5nOCBwaHlzaWNhbENhbWVyYUlkID0gU3RyaW5nOChvdXRwdXRDb25maWd1cmF0aW9uLmdldFBoeXNpY2FsQ2FtZXJhSWQoKSk7Ci0KLSAgICBpZiAobnVtQnVmZmVyUHJvZHVjZXJzID4gTUFYX1NVUkZBQ0VTX1BFUl9TVFJFQU0pIHsKLSAgICAgICAgQUxPR0UoIiVzOiBHcmFwaGljQnVmZmVyUHJvZHVjZXIgY291bnQgJXp1IGZvciBzdHJlYW0gZXhjZWVkcyBsaW1pdCBvZiAlZCIsCi0gICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmZmVyUHJvZHVjZXJzLnNpemUoKSwgTUFYX1NVUkZBQ0VTX1BFUl9TVFJFQU0pOwotICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsICJTdXJmYWNlIGNvdW50IGlzIHRvbyBoaWdoIik7Ci0gICAgfQogICAgIGJvb2wgZGVmZXJyZWRDb25zdW1lck9ubHkgPSBkZWZlcnJlZENvbnN1bWVyICYmIG51bUJ1ZmZlclByb2R1Y2VycyA9PSAwOwotICAgIGludCBzdXJmYWNlVHlwZSA9IG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0U3VyZmFjZVR5cGUoKTsKLSAgICBib29sIHZhbGlkU3VyZmFjZVR5cGUgPSAoKHN1cmZhY2VUeXBlID09IE91dHB1dENvbmZpZ3VyYXRpb246OlNVUkZBQ0VfVFlQRV9TVVJGQUNFX1ZJRVcpIHx8Ci0gICAgICAgICAgICAoc3VyZmFjZVR5cGUgPT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6U1VSRkFDRV9UWVBFX1NVUkZBQ0VfVEVYVFVSRSkpOwogCi0gICAgaWYgKGRlZmVycmVkQ29uc3VtZXIgJiYgIXZhbGlkU3VyZmFjZVR5cGUpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBUYXJnZXQgc3VyZmFjZSBpcyBpbnZhbGlkOiBidWZmZXJQcm9kdWNlciA9ICVwLCBzdXJmYWNlVHlwZSA9ICVkLiIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidWZmZXJQcm9kdWNlcnNbMF0uZ2V0KCksIHN1cmZhY2VUeXBlKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiVGFyZ2V0IFN1cmZhY2UgaXMgaW52YWxpZCIpOworICAgIHJlcyA9IGNoZWNrU3VyZmFjZVR5cGVMb2NrZWQobnVtQnVmZmVyUHJvZHVjZXJzLCBkZWZlcnJlZENvbnN1bWVyLAorICAgICAgICAgICAgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRTdXJmYWNlVHlwZSgpKTsKKyAgICBpZiAoIXJlcy5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKICAgICBpZiAoIW1EZXZpY2UuZ2V0KCkpIHsKICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9ESVNDT05ORUNURUQsICJDYW1lcmEgZGV2aWNlIG5vIGxvbmdlciBhbGl2ZSIpOwogICAgIH0KIAotICAgIGlmIChwaHlzaWNhbENhbWVyYUlkLnNpemUoKSA+IDApIHsKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBoeXNpY2FsQ2FtZXJhSWRzOwotICAgICAgICBzdGQ6OnN0cmluZyBwaHlzaWNhbElkKHBoeXNpY2FsQ2FtZXJhSWQuc3RyaW5nKCkpOwotICAgICAgICBib29sIGxvZ2ljYWxDYW1lcmEgPQotICAgICAgICAgICAgICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6aXNMb2dpY2FsQ2FtZXJhKG1EZXZpY2UtPmluZm8oKSwgJnBoeXNpY2FsQ2FtZXJhSWRzKTsKLSAgICAgICAgaWYgKCFsb2dpY2FsQ2FtZXJhIHx8Ci0gICAgICAgICAgICAgICAgc3RkOjpmaW5kKHBoeXNpY2FsQ2FtZXJhSWRzLmJlZ2luKCksIHBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpLCBwaHlzaWNhbElkKSA9PQotICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBDYW1lcmEgZG9lc24ndCBzdXBwb3J0IHBoeXNpY2FsQ2FtZXJhSWQgJXMuIiwKLSAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBwaHlzaWNhbENhbWVyYUlkLnN0cmluZygpKTsKLSAgICAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgIH0KKyAgICByZXMgPSBjaGVja1BoeXNpY2FsQ2FtZXJhSWRMb2NrZWQocGh5c2ljYWxDYW1lcmFJZCk7CisgICAgaWYgKCFyZXMuaXNPaygpKSB7CisgICAgICAgIHJldHVybiByZXM7CiAgICAgfQorCiAgICAgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+IHN1cmZhY2VzOwogICAgIHN0ZDo6dmVjdG9yPHNwPElCaW5kZXI+PiBiaW5kZXJzOwogICAgIHN0YXR1c190IGVycjsKQEAgLTE3MjQsNyArMTkxNyw3IEBACiAvLyBUT0RPOiBtb3ZlIHRvIENhbWVyYTJDbGllbnRCYXNlCiBib29sIENhbWVyYURldmljZUNsaWVudDo6ZW5mb3JjZVJlcXVlc3RQZXJtaXNzaW9ucyhDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEpIHsKIAotICAgIGNvbnN0IGludCBwaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgY29uc3QgaW50IHBpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgY29uc3QgaW50IHNlbGZQaWQgPSBnZXRwaWQoKTsKICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBlbnRyeTsKIApAQCAtMTc2Myw3ICsxOTU2LDcgQEAKICAgICAgICAgU3RyaW5nMTYgcGVybWlzc2lvblN0cmluZyA9CiAgICAgICAgICAgICBTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQV9ESVNBQkxFX1RSQU5TTUlUX0xFRCIpOwogICAgICAgICBpZiAoIWNoZWNrQ2FsbGluZ1Blcm1pc3Npb24ocGVybWlzc2lvblN0cmluZykpIHsKLSAgICAgICAgICAgIGNvbnN0IGludCB1aWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgICAgICAgICBjb25zdCBpbnQgdWlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKTsKICAgICAgICAgICAgIEFMT0dFKCJQZXJtaXNzaW9uIERlbmlhbDogIgogICAgICAgICAgICAgICAgICAgImNhbid0IGRpc2FibGUgdHJhbnNtaXQgTEVEIHBpZD0lZCwgdWlkPSVkIiwgcGlkLCB1aWQpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgKaW5kZXggYzMwNTYxZC4uMTdhMDk4MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0JuQ2FtZXJhRGV2aWNlVXNlci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL1Nlc3Npb25Db25maWd1cmF0aW9uLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvU3VibWl0SW5mby5oPgogCiAjaW5jbHVkZSAiQ2FtZXJhU2VydmljZS5oIgpAQCAtODksNiArOTAsMTIgQEAKICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIGVuZENvbmZpZ3VyZShpbnQgb3BlcmF0aW5nTW9kZSwKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmEyOjppbXBsOjpDYW1lcmFNZXRhZGF0YU5hdGl2ZSYgc2Vzc2lvblBhcmFtcykgb3ZlcnJpZGU7CiAKKyAgICAvLyBWZXJpZnkgc3BlY2lmaWMgc2Vzc2lvbiBjb25maWd1cmF0aW9uLgorICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgaXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgICAgIGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBzZXNzaW9uQ29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIGJvb2wqIHN0cmVhbVN0YXR1cykgb3ZlcnJpZGU7CisKICAgICAvLyBSZXR1cm5zIC1FQlVTWSBpZiBkZXZpY2UgaXMgbm90IGlkbGUgb3IgaW4gZXJyb3Igc3RhdGUKICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIGRlbGV0ZVN0cmVhbShpbnQgc3RyZWFtSWQpIG92ZXJyaWRlOwogCkBAIC0yMzAsNiArMjM3LDEzIEBACiAKICAgICAvKiogVXRpbGl0eSBtZW1iZXJzICovCiAgICAgYmluZGVyOjpTdGF0dXMgY2hlY2tQaWRTdGF0dXMoY29uc3QgY2hhciogY2hlY2tMb2NhdGlvbik7CisgICAgYmluZGVyOjpTdGF0dXMgY2hlY2tPcGVyYXRpbmdNb2RlTG9ja2VkKGludCBvcGVyYXRpbmdNb2RlKSBjb25zdDsKKyAgICBiaW5kZXI6OlN0YXR1cyBjaGVja1BoeXNpY2FsQ2FtZXJhSWRMb2NrZWQoU3RyaW5nOCBwaHlzaWNhbENhbWVyYUlkKTsKKyAgICBiaW5kZXI6OlN0YXR1cyBjaGVja1N1cmZhY2VUeXBlTG9ja2VkKHNpemVfdCBudW1CdWZmZXJQcm9kdWNlcnMsIGJvb2wgZGVmZXJyZWRDb25zdW1lciwKKyAgICAgICAgICAgIGludCBzdXJmYWNlVHlwZSkgY29uc3Q7CisgICAgc3RhdGljIHZvaWQgbWFwU3RyZWFtSW5mbyhjb25zdCBPdXRwdXRTdHJlYW1JbmZvICZzdHJlYW1JbmZvLAorICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgU3RyaW5nOCBwaHlzaWNhbElkLAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW0gKnN0cmVhbSAvKm91dCovKTsKICAgICBib29sIGVuZm9yY2VSZXF1ZXN0UGVybWlzc2lvbnMoQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhKTsKIAogICAgIC8vIEZpbmQgdGhlIHNxdWFyZSBvZiB0aGUgZXVjbGlkZWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50cwpAQCAtMzAwLDcgKzMxNCw4IEBACiAgICAgLy8gc3RyZWFtIElEIC0+IG91dHB1dFN0cmVhbUluZm8gbWFwcGluZwogICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQzMl90LCBPdXRwdXRTdHJlYW1JbmZvPiBtU3RyZWFtSW5mb01hcDsKIAotICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNID0gMjsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBNQVhfU1VSRkFDRVNfUEVSX1NUUkVBTSA9IDQ7CisgICAgc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtUHJvdmlkZXJNYW5hZ2VyOwogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwCmluZGV4IGNlMDA2YTcuLjc4ZmViM2UgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcApAQCAtMzIsMTQgKzMyLDExIEBACiAjaW5jbHVkZSAiYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaCIKIAogI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM0RldmljZS5oIgorI2luY2x1ZGUgInV0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIHVzaW5nIG5hbWVzcGFjZSBjYW1lcmEyOwogCi1zdGF0aWMgaW50IGdldENhbGxpbmdQaWQoKSB7Ci0gICAgcmV0dXJuIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKLX0KLQogLy8gSW50ZXJmYWNlIHVzZWQgYnkgQ2FtZXJhU2VydmljZQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+CkBAIC01NywxMyArNTQsMTMgQEAKICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgYXBpMUNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKSwKICAgICAgICAgbVNoYXJlZENhbWVyYUNhbGxiYWNrcyhyZW1vdGVDYWxsYmFjayksCiAgICAgICAgIG1EZXZpY2VWZXJzaW9uKGNhbWVyYVNlcnZpY2UtPmdldERldmljZVZlcnNpb24oVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0cikpLAorICAgICAgICBtRGV2aWNlKG5ldyBDYW1lcmEzRGV2aWNlKGNhbWVyYUlkKSksCiAgICAgICAgIG1EZXZpY2VBY3RpdmUoZmFsc2UpLCBtQXBpMUNhbWVyYUlkKGFwaTFDYW1lcmFJZCkKIHsKICAgICBBTE9HSSgiQ2FtZXJhICVzOiBPcGVuZWQuIENsaWVudDogJXMgKFBJRCAlZCwgVUlEICVkKSIsIGNhbWVyYUlkLnN0cmluZygpLAogICAgICAgICAgICAgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSkuc3RyaW5nKCksIGNsaWVudFBpZCwgY2xpZW50VWlkKTsKIAogICAgIG1Jbml0aWFsQ2xpZW50UGlkID0gY2xpZW50UGlkOwotICAgIG1EZXZpY2UgPSBuZXcgQ2FtZXJhM0RldmljZShjYW1lcmFJZCk7CiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtRGV2aWNlID09IDAsICJEZXZpY2Ugc2hvdWxkIG5ldmVyIGJlIE5VTEwgaGVyZS4iKTsKIH0KIApAQCAtNzEsNyArNjgsNyBAQAogc3RhdHVzX3QgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+OjpjaGVja1BpZChjb25zdCBjaGFyKiBjaGVja0xvY2F0aW9uKQogICAgICAgICBjb25zdCB7CiAKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgaWYgKGNhbGxpbmdQaWQgPT0gVENsaWVudEJhc2U6Om1DbGllbnRQaWQpIHJldHVybiBOT19FUlJPUjsKIAogICAgIEFMT0dFKCIlczogYXR0ZW1wdCB0byB1c2UgYSBsb2NrZWQgY2FtZXJhIGZyb20gYSBkaWZmZXJlbnQgcHJvY2VzcyIKQEAgLTE4Niw3ICsxODMsNyBAQAogCiAgICAgYmluZGVyOjpTdGF0dXMgcmVzID0gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiAgICAgLy8gQWxsb3cgYm90aCBjbGllbnQgYW5kIHRoZSBtZWRpYSBzZXJ2ZXIgdG8gZGlzY29ubmVjdCBhdCBhbGwgdGltZXMKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgaWYgKGNhbGxpbmdQaWQgIT0gVENsaWVudEJhc2U6Om1DbGllbnRQaWQgJiYKICAgICAgICAgY2FsbGluZ1BpZCAhPSBUQ2xpZW50QmFzZTo6bVNlcnZpY2VQaWQpIHJldHVybiByZXM7CiAKQEAgLTIwNiw4ICsyMDMsNiBAQAogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybjsKICAgICBtRGV2aWNlLT5kaXNjb25uZWN0KCk7CiAKLSAgICBtRGV2aWNlLmNsZWFyKCk7Ci0KICAgICBBTE9HVigiQ2FtZXJhICVzOiBEZXRhY2ggY29tcGxldGUiLCBUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyLnN0cmluZygpKTsKIH0KIApAQCAtMjE5LDE4ICsyMTQsMTggQEAKICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CiAKICAgICBpZiAoVENsaWVudEJhc2U6Om1DbGllbnRQaWQgIT0gMCAmJgotICAgICAgICBnZXRDYWxsaW5nUGlkKCkgIT0gVENsaWVudEJhc2U6Om1DbGllbnRQaWQpIHsKKyAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSAhPSBUQ2xpZW50QmFzZTo6bUNsaWVudFBpZCkgewogCiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVzOiBDb25uZWN0aW9uIGF0dGVtcHQgZnJvbSBwaWQgJWQ7ICIKICAgICAgICAgICAgICAgICAiY3VycmVudCBsb2NrZWQgdG8gcGlkICVkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0ci5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICBnZXRDYWxsaW5nUGlkKCksCisgICAgICAgICAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwKICAgICAgICAgICAgICAgICBUQ2xpZW50QmFzZTo6bUNsaWVudFBpZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgVENsaWVudEJhc2U6Om1DbGllbnRQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgVENsaWVudEJhc2U6Om1DbGllbnRQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogCiAgICAgVENsaWVudEJhc2U6Om1SZW1vdGVDYWxsYmFjayA9IGNsaWVudDsKICAgICBtU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzID0gY2xpZW50OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaAppbmRleCBlNzRmYmRmLi42NjkzODQ3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaApAQCAtMTMwLDcgKzEzMCwxMCBAQAogICAgIC8qKiBDYW1lcmFEZXZpY2VCYXNlIGluc3RhbmNlIHdyYXBwaW5nIEhBTDMrIGVudHJ5ICovCiAKICAgICBjb25zdCBpbnQgbURldmljZVZlcnNpb247Ci0gICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gIG1EZXZpY2U7CisKKyAgICAvLyBTZXQgdG8gY29uc3QgdG8gYXZvaWQgbURldmljZSBiZWluZyB1cGRhdGVkICh1cGRhdGUgb2Ygc3A8PiBpcyByYWN5KSBkdXJpbmcKKyAgICAvLyBkdW1wRGV2aWNlICh3aGljaCBpcyBpbXBvcnRhbnQgdG8gYmUgbG9jayBmcmVlIGZvciBkZWJ1Z2dpbmcgcHVycG9zZSkKKyAgICBjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiAgbURldmljZTsKIAogICAgIC8qKiBVdGlsaXR5IG1lbWJlcnMgKi8KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcAppbmRleCAwY2U0MzE4Li5hOWNiZTcyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcApAQCAtMjAsMjQgKzIwLDQxIEBACiAKICNpbmNsdWRlICJDYW1lcmFQcm92aWRlck1hbmFnZXIuaCIKIAorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjUvSUNhbWVyYURldmljZS5oPgorCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxmdXR1cmU+CiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmFfY29tbW9uLmg+CiAjaW5jbHVkZSA8aGlkbC9TZXJ2aWNlTWFuYWdlbWVudC5oPgogI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiAjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX2hpZGRlbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wYXJzZWludC5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTsKIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDsKK3VzaW5nIHN0ZDo6bGl0ZXJhbHM6OmNocm9ub19saXRlcmFsczo6b3BlcmF0b3IiInM7CiAKIG5hbWVzcGFjZSB7CiAvLyBIYXJkY29kZWQgbmFtZSBmb3IgdGhlIHBhc3N0aHJvdWdoIEhBTCBpbXBsZW1lbnRhdGlvbiwgc2luY2UgaXQgY2FuJ3QgYmUgZGlzY292ZXJlZCB2aWEgdGhlCiAvLyBzZXJ2aWNlIG1hbmFnZXIKIGNvbnN0IHN0ZDo6c3RyaW5nIGtMZWdhY3lQcm92aWRlck5hbWUoImxlZ2FjeS8wIik7CiBjb25zdCBzdGQ6OnN0cmluZyBrRXh0ZXJuYWxQcm92aWRlck5hbWUoImV4dGVybmFsLzAiKTsKK2NvbnN0IGJvb2wga0VuYWJsZUxhenlIYWwocHJvcGVydHlfZ2V0X2Jvb2woInJvLmNhbWVyYS5lbmFibGVMYXp5SGFsIiwgZmFsc2UpKTsKKworLy8gVGhlIGV4dHJhIGFtb3VudCBvZiB0aW1lIHRvIGhvbGQgYSByZWZlcmVuY2UgdG8gYW4gSUNhbWVyYVByb3ZpZGVyIGFmdGVyIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQuCisvLyBIb2xkIHRoZSByZWZlcmVuY2UgZm9yIHRoaXMgZXh0cmEgdGltZSBzbyB0aGF0IGlmIHRoZSBjYW1lcmEgaXMgdW5yZWZlcmVuY2VkIGFuZCB0aGVuIHJlZmVyZW5jZWQKKy8vIGFnYWluIHF1aWNrbHksIHdlIGRvIG5vdCBsZXQgdGhlIEhBTCBleGl0IGFuZCB0aGVuIG5lZWQgdG8gaW1tZWRpYXRlbHkgcmVzdGFydCBpdC4gQW4gZXhhbXBsZQorLy8gd2hlbiB0aGlzIGNvdWxkIGhhcHBlbiBpcyBzd2l0Y2hpbmcgZnJvbSBhIGZyb250LWZhY2luZyB0byBhIHJlYXItZmFjaW5nIGNhbWVyYS4gSWYgdGhlIEhBTCB3ZXJlCisvLyB0byBleGl0IGR1cmluZyB0aGUgY2FtZXJhIHN3aXRjaCwgdGhlIGNhbWVyYSBjb3VsZCBhcHBlYXIgamFua3kgdG8gdGhlIHVzZXIuCitjb25zdCBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpkdXJhdGlvbiBrQ2FtZXJhS2VlcEFsaXZlRGVsYXkgPSAzczsKIAogfSAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCiAKQEAgLTcxLDYgKzg4LDggQEAKICAgICBhZGRQcm92aWRlckxvY2tlZChrTGVnYWN5UHJvdmlkZXJOYW1lLCAvKmV4cGVjdGVkKi8gZmFsc2UpOwogICAgIGFkZFByb3ZpZGVyTG9ja2VkKGtFeHRlcm5hbFByb3ZpZGVyTmFtZSwgLypleHBlY3RlZCovIGZhbHNlKTsKIAorICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMTc0LDYgKzE5MywxOSBAQAogICAgIHJldHVybiBkZXZpY2VJbmZvLT5nZXRDYW1lcmFJbmZvKGluZm8pOwogfQogCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24sCisgICAgICAgIGJvb2wgKnN0YXR1cyAvKm91dCovKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKKworICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkKTsKKyAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICB9CisKKyAgICByZXR1cm4gZGV2aWNlSW5mby0+aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZChjb25maWd1cmF0aW9uLCBzdGF0dXMpOworfQorCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjb25zdCBzdGQ6OnN0cmluZyAmaWQsCiAgICAgICAgIENhbWVyYU1ldGFkYXRhKiBjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwpAQCAtMjAzLDI2ICsyMzUsMTUgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLWJvb2wgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzdXBwb3J0U2V0VG9yY2hNb2RlKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCkgeworYm9vbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnN1cHBvcnRTZXRUb3JjaE1vZGUoY29uc3Qgc3RkOjpzdHJpbmcgJmlkKSBjb25zdCB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKLSAgICBib29sIHN1cHBvcnQgPSBmYWxzZTsKICAgICBmb3IgKGF1dG8mIHByb3ZpZGVyIDogbVByb3ZpZGVycykgewogICAgICAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCk7CiAgICAgICAgIGlmIChkZXZpY2VJbmZvICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGF1dG8gcmV0ID0gcHJvdmlkZXItPm1JbnRlcmZhY2UtPmlzU2V0VG9yY2hNb2RlU3VwcG9ydGVkKAotICAgICAgICAgICAgICAgIFsmc3VwcG9ydF0oYXV0byBzdGF0dXMsIGJvb2wgc3VwcG9ydGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCA9IHN1cHBvcnRlZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBjaGVja2luZyB0b3JjaCBtb2RlIHN1cHBvcnQgJyVzJzogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwcm92aWRlci0+bVByb3ZpZGVyTmFtZS5jX3N0cigpLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyLT5tU2V0VG9yY2hNb2RlU3VwcG9ydGVkOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBzdXBwb3J0OworICAgIHJldHVybiBmYWxzZTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzZXRUb3JjaE1vZGUoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCBib29sIGVuYWJsZWQpIHsKQEAgLTIzMSw2ICsyNTIsMTUgQEAKICAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCk7CiAgICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwogCisgICAgLy8gUGFzcyB0aGUgY2FtZXJhIElEIHRvIHN0YXJ0IGludGVyZmFjZSBzbyB0aGF0IGl0IHdpbGwgc2F2ZSBpdCB0byB0aGUgbWFwIG9mIElDYW1lcmFQcm92aWRlcnMKKyAgICAvLyB0aGF0IGFyZSBjdXJyZW50bHkgaW4gdXNlLgorICAgIGNvbnN0IHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZSA9CisgICAgICAgICAgICBkZXZpY2VJbmZvLT5tUGFyZW50UHJvdmlkZXItPnN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBzYXZlUmVmKERldmljZU1vZGU6OlRPUkNILCBkZXZpY2VJbmZvLT5tSWQsIGludGVyZmFjZSk7CisKICAgICByZXR1cm4gZGV2aWNlSW5mby0+c2V0VG9yY2hNb2RlKGVuYWJsZWQpOwogfQogCkBAIC0yMzgsMzcgKzI2OCw3IEBACiAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlPiB0YWdDYWNoZSA9IG5ldyBWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGUoKTsKIAogICAgIGZvciAoYXV0byYgcHJvdmlkZXIgOiBtUHJvdmlkZXJzKSB7Ci0gICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxWZW5kb3JUYWdTZWN0aW9uPiB2dHM7Ci0gICAgICAgIFN0YXR1cyBzdGF0dXM7Ci0gICAgICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OwotICAgICAgICByZXQgPSBwcm92aWRlci0+bUludGVyZmFjZS0+Z2V0VmVuZG9yVGFncygKLSAgICAgICAgICAgIFsmXShhdXRvIHMsIGNvbnN0IGF1dG8mIHZlbmRvclRhZ1NlY3MpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgIGlmIChzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgdnRzID0gdmVuZG9yVGFnU2VjczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgZ2V0dGluZyB2ZW5kb3IgdGFncyBmcm9tIHByb3ZpZGVyICclcyc6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwcm92aWRlci0+bVByb3ZpZGVyTmFtZS5jX3N0cigpLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlYWQgYWxsIHZlbmRvciB0YWcgZGVmaW5pdGlvbnMgaW50byBhIGRlc2NyaXB0b3IKLSAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gZGVzYzsKLSAgICAgICAgc3RhdHVzX3QgcmVzOwotICAgICAgICBpZiAoKHJlcyA9IEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbUhpZGwodnRzLCAvKm91dCovZGVzYykpCi0gICAgICAgICAgICAgICAgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGdlbmVyYXRlIGRlc2NyaXB0b3IgZnJvbSB2ZW5kb3IgdGFnIG9wZXJhdGlvbnMsIgotICAgICAgICAgICAgICAgICAgInJlY2VpdmVkIGVycm9yICVzICglZCkuIENhbWVyYSBjbGllbnRzIHdpbGwgbm90IGJlIGFibGUgdG8gdXNlIgotICAgICAgICAgICAgICAgICAgInZlbmRvciB0YWdzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihyZXMpLCByZXMpOwotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQotCi0gICAgICAgIHRhZ0NhY2hlLT5hZGRWZW5kb3JEZXNjcmlwdG9yKHByb3ZpZGVyLT5tUHJvdmlkZXJUYWdpZCwgZGVzYyk7CisgICAgICAgIHRhZ0NhY2hlLT5hZGRWZW5kb3JEZXNjcmlwdG9yKHByb3ZpZGVyLT5tUHJvdmlkZXJUYWdpZCwgcHJvdmlkZXItPm1WZW5kb3JUYWdEZXNjcmlwdG9yKTsKICAgICB9CiAKICAgICBWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGU6OnNldEFzR2xvYmFsVmVuZG9yVGFnQ2FjaGUodGFnQ2FjaGUpOwpAQCAtMjc3LDkgKzI3Nyw5IEBACiB9CiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6b3BlblNlc3Npb24oY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAotICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLAorICAgICAgICBjb25zdCBzcDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLAogICAgICAgICAvKm91dCovCi0gICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZVNlc3Npb24+ICpzZXNzaW9uKSB7CisgICAgICAgIHNwPGRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZVNlc3Npb24+ICpzZXNzaW9uKSB7CiAKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwogCkBAIC0yODgsMTAgKzI4OCwyMiBAQAogICAgIGlmIChkZXZpY2VJbmZvID09IG51bGxwdHIpIHJldHVybiBOQU1FX05PVF9GT1VORDsKIAogICAgIGF1dG8gKmRldmljZUluZm8zID0gc3RhdGljX2Nhc3Q8UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMyo+KGRldmljZUluZm8pOworICAgIGNvbnN0IHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IHByb3ZpZGVyID0KKyAgICAgICAgICAgIGRldmljZUluZm8tPm1QYXJlbnRQcm92aWRlci0+c3RhcnRQcm92aWRlckludGVyZmFjZSgpOworICAgIGlmIChwcm92aWRlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgc2F2ZVJlZihEZXZpY2VNb2RlOjpDQU1FUkEsIGlkLCBwcm92aWRlcik7CiAKICAgICBTdGF0dXMgc3RhdHVzOwogICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OwotICAgIHJldCA9IGRldmljZUluZm8zLT5tSW50ZXJmYWNlLT5vcGVuKGNhbGxiYWNrLCBbJnN0YXR1cywgJnNlc3Npb25dCisgICAgYXV0byBpbnRlcmZhY2UgPSBkZXZpY2VJbmZvMy0+c3RhcnREZXZpY2VJbnRlcmZhY2U8CisgICAgICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OkludGVyZmFjZVQ+KCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICByZXQgPSBpbnRlcmZhY2UtPm9wZW4oY2FsbGJhY2ssIFsmc3RhdHVzLCAmc2Vzc2lvbl0KICAgICAgICAgICAgIChTdGF0dXMgcywgY29uc3Qgc3A8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4mIGNhbWVyYVNlc3Npb24pIHsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwogICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewpAQCAtMjk5LDYgKzMxMSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSk7CiAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgIHJlbW92ZVJlZihEZXZpY2VNb2RlOjpDQU1FUkEsIGlkKTsKICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBvcGVuaW5nIGEgc2Vzc2lvbiBmb3IgY2FtZXJhIGRldmljZSAlczogJXMiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CiAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKQEAgLTMwNyw5ICszMjAsOSBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om9wZW5TZXNzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKLSAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgY29uc3Qgc3A8ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKICAgICAgICAgLypvdXQqLwotICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2U+ICpzZXNzaW9uKSB7CisgICAgICAgIHNwPGRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZT4gKnNlc3Npb24pIHsKIAogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CiAKQEAgLTMxOCwyNCArMzMxLDg4IEBACiAgICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwogCiAgICAgYXV0byAqZGV2aWNlSW5mbzEgPSBzdGF0aWNfY2FzdDxQcm92aWRlckluZm86OkRldmljZUluZm8xKj4oZGV2aWNlSW5mbyk7CisgICAgY29uc3Qgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gcHJvdmlkZXIgPQorICAgICAgICAgICAgZGV2aWNlSW5mby0+bVBhcmVudFByb3ZpZGVyLT5zdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7CisgICAgaWYgKHByb3ZpZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBzYXZlUmVmKERldmljZU1vZGU6OkNBTUVSQSwgaWQsIHByb3ZpZGVyKTsKIAotICAgIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBkZXZpY2VJbmZvMS0+bUludGVyZmFjZS0+b3BlbihjYWxsYmFjayk7CisgICAgYXV0byBpbnRlcmZhY2UgPSBkZXZpY2VJbmZvMS0+c3RhcnREZXZpY2VJbnRlcmZhY2U8CisgICAgICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzE6OkludGVyZmFjZVQ+KCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+IHN0YXR1cyA9IGludGVyZmFjZS0+b3BlbihjYWxsYmFjayk7CiAgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIHJlbW92ZVJlZihEZXZpY2VNb2RlOjpDQU1FUkEsIGlkKTsKICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBvcGVuaW5nIGEgc2Vzc2lvbiBmb3IgY2FtZXJhIGRldmljZSAlczogJXMiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgc3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CiAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKICAgICB9CiAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICpzZXNzaW9uID0gZGV2aWNlSW5mbzEtPm1JbnRlcmZhY2U7CisgICAgICAgICpzZXNzaW9uID0gaW50ZXJmYWNlOwogICAgIH0KICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHN0YXR1cyk7CiB9CiAKK3ZvaWQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzYXZlUmVmKERldmljZU1vZGUgdXNhZ2VUeXBlLCBjb25zdCBzdGQ6OnN0cmluZyAmY2FtZXJhSWQsCisgICAgICAgIHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IHByb3ZpZGVyKSB7CisgICAgaWYgKCFrRW5hYmxlTGF6eUhhbCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dJKCJTYXZpbmcgY2FtZXJhIHByb3ZpZGVyICVzIGZvciBjYW1lcmEgZGV2aWNlICVzIiwgcHJvdmlkZXItPmRlc2NyaXB0b3IsIGNhbWVyYUlkLmNfc3RyKCkpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Qcm92aWRlckludGVyZmFjZU1hcExvY2spOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4+ICpwcmltYXJ5TWFwLCAqYWx0ZXJuYXRlTWFwOworICAgIGlmICh1c2FnZVR5cGUgPT0gRGV2aWNlTW9kZTo6VE9SQ0gpIHsKKyAgICAgICAgcHJpbWFyeU1hcCA9ICZtVG9yY2hQcm92aWRlckJ5Q2FtZXJhSWQ7CisgICAgICAgIGFsdGVybmF0ZU1hcCA9ICZtQ2FtZXJhUHJvdmlkZXJCeUNhbWVyYUlkOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW1hcnlNYXAgPSAmbUNhbWVyYVByb3ZpZGVyQnlDYW1lcmFJZDsKKyAgICAgICAgYWx0ZXJuYXRlTWFwID0gJm1Ub3JjaFByb3ZpZGVyQnlDYW1lcmFJZDsKKyAgICB9CisgICAgYXV0byBpZCA9IGNhbWVyYUlkLmNfc3RyKCk7CisgICAgKCpwcmltYXJ5TWFwKVtpZF0gPSBwcm92aWRlcjsKKyAgICBhdXRvIHNlYXJjaCA9IGFsdGVybmF0ZU1hcC0+ZmluZChpZCk7CisgICAgaWYgKHNlYXJjaCAhPSBhbHRlcm5hdGVNYXAtPmVuZCgpKSB7CisgICAgICAgIEFMT0dXKCIlczogQ2FtZXJhIGRldmljZSAlcyBpcyB1c2luZyBib3RoIHRvcmNoIG1vZGUgYW5kIGNhbWVyYSBtb2RlIHNpbXVsdGFuZW91c2x5LiAiCisgICAgICAgICAgICAgICAgIlRoYXQgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSIsIF9fRlVOQ1RJT05fXywgaWQpOworICAgIH0KKyAgICBBTE9HVigiJXM6IENhbWVyYSBkZXZpY2UgJXMgY29ubmVjdGVkIiwgX19GVU5DVElPTl9fLCBpZCk7Cit9CisKK3ZvaWQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpyZW1vdmVSZWYoRGV2aWNlTW9kZSB1c2FnZVR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nICZjYW1lcmFJZCkgeworICAgIGlmICgha0VuYWJsZUxhenlIYWwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HSSgiUmVtb3ZpbmcgY2FtZXJhIGRldmljZSAlcyIsIGNhbWVyYUlkLmNfc3RyKCkpOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4+ICpwcm92aWRlck1hcDsKKyAgICBpZiAodXNhZ2VUeXBlID09IERldmljZU1vZGU6OlRPUkNIKSB7CisgICAgICAgIHByb3ZpZGVyTWFwID0gJm1Ub3JjaFByb3ZpZGVyQnlDYW1lcmFJZDsKKyAgICB9IGVsc2UgeworICAgICAgICBwcm92aWRlck1hcCA9ICZtQ2FtZXJhUHJvdmlkZXJCeUNhbWVyYUlkOworICAgIH0KKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUHJvdmlkZXJJbnRlcmZhY2VNYXBMb2NrKTsKKyAgICBhdXRvIHNlYXJjaCA9IHByb3ZpZGVyTWFwLT5maW5kKGNhbWVyYUlkLmNfc3RyKCkpOworICAgIGlmIChzZWFyY2ggIT0gcHJvdmlkZXJNYXAtPmVuZCgpKSB7CisgICAgICAgIGF1dG8gcHRyID0gc2VhcmNoLT5zZWNvbmQ7CisgICAgICAgIGF1dG8gZnV0dXJlID0gc3RkOjphc3luYyhzdGQ6OmxhdW5jaDo6YXN5bmMsIFtwdHJdIHsKKyAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihrQ2FtZXJhS2VlcEFsaXZlRGVsYXkpOworICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOworICAgICAgICB9KTsKKyAgICAgICAgcHJvdmlkZXJNYXAtPmVyYXNlKGNhbWVyYUlkLmNfc3RyKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogQXNrZWQgdG8gcmVtb3ZlIHJlZmVyZW5jZSBmb3IgY2FtZXJhICVzLCBidXQgbm8gcmVmZXJlbmNlIHRvIGl0IHdhcyBmb3VuZC4gVGhpcyAiCisgICAgICAgICAgICAgICAgImNvdWxkIG1lYW4gcmVtb3ZlUmVmIHdhcyBjYWxsZWQgdHdpY2UgZm9yIHRoZSBzYW1lIGNhbWVyYSBJRC4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgY2FtZXJhSWQuY19zdHIoKSk7CisgICAgfQorfQogCiBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6b25SZWdpc3RyYXRpb24oCiAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgLypmcU5hbWUqLywKICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBuYW1lLAogICAgICAgICBib29sIC8qcHJlZXhpc3RpbmcqLykgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBwcm92aWRlckxvY2sobVByb3ZpZGVyTGlmZWN5Y2xlTG9jayk7CiAgICAgewogICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwogCkBAIC0zNDcsNiArNDI0LDggQEAKICAgICAgICAgbGlzdGVuZXItPm9uTmV3UHJvdmlkZXJSZWdpc3RlcmVkKCk7CiAgICAgfQogCisgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOworCiAgICAgcmV0dXJuIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4oKTsKIH0KIApAQCAtMzkyLDM1ICs0NzEsMTg0IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotYm9vbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzTG9naWNhbENhbWVyYShjb25zdCBDYW1lcmFNZXRhZGF0YSYgc3RhdGljSW5mbywKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBwaHlzaWNhbENhbWVyYUlkcykgewotICAgIGJvb2wgaXNMb2dpY2FsQ2FtID0gZmFsc2U7Ci0gICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnlDYXA7Cit2b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6cXVlcnlQaHlzaWNhbENhbWVyYUlkcygpIHsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBlbnRyeUNhcDsKIAotICAgIGVudHJ5Q2FwID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKKyAgICBlbnRyeUNhcCA9IG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeUNhcC5jb3VudDsgKytpKSB7CiAgICAgICAgIHVpbnQ4X3QgY2FwYWJpbGl0eSA9IGVudHJ5Q2FwLmRhdGEudThbaV07CiAgICAgICAgIGlmIChjYXBhYmlsaXR5ID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX0xPR0lDQUxfTVVMVElfQ0FNRVJBKSB7Ci0gICAgICAgICAgICBpc0xvZ2ljYWxDYW0gPSB0cnVlOworICAgICAgICAgICAgbUlzTG9naWNhbENhbWVyYSA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiAoIWlzTG9naWNhbENhbSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFtSXNMb2dpY2FsQ2FtZXJhKSB7CisgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeUlkcyA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX0xPR0lDQUxfTVVMVElfQ0FNRVJBX1BIWVNJQ0FMX0lEUyk7CisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnlJZHMgPSBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmZpbmQoCisgICAgICAgICAgICBBTkRST0lEX0xPR0lDQUxfTVVMVElfQ0FNRVJBX1BIWVNJQ0FMX0lEUyk7CiAgICAgY29uc3QgdWludDhfdCogaWRzID0gZW50cnlJZHMuZGF0YS51ODsKICAgICBzaXplX3Qgc3RhcnQgPSAwOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnlJZHMuY291bnQ7ICsraSkgewogICAgICAgICBpZiAoaWRzW2ldID09ICdcMCcpIHsKICAgICAgICAgICAgIGlmIChzdGFydCAhPSBpKSB7Ci0gICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZHMtPnB1c2hfYmFjaygoY29uc3QgY2hhciopaWRzK3N0YXJ0KTsKKyAgICAgICAgICAgICAgICBtUGh5c2ljYWxJZHMucHVzaF9iYWNrKChjb25zdCBjaGFyKilpZHMrc3RhcnQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3RhcnQgPSBpKzE7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6Zml4dXBNb25vY2hyb21lVGFncygpIHsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICBhdXRvJiBjID0gbUNhbWVyYUNoYXJhY3RlcmlzdGljczsKKworICAgIC8vIE92ZXJyaWRlIHN0YXRpYyBtZXRhZGF0YSBmb3IgTU9OT0NIUk9NRSBjYW1lcmEgd2l0aCBvbGRlciBkZXZpY2UgdmVyc2lvbgorICAgIGlmIChtVmVyc2lvbi5nZXRfbWFqb3IoKSA9PSAzICYmIG1WZXJzaW9uLmdldF9taW5vcigpIDwgNSkgeworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgY2FwID0gYy5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXAuY291bnQ7IGkrKykgeworICAgICAgICAgICAgaWYgKGNhcC5kYXRhLnU4W2ldID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX01PTk9DSFJPTUUpIHsKKyAgICAgICAgICAgICAgICAvLyBBTkRST0lEX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVAorICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2ZhID0gQU5EUk9JRF9TRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlRfTU9OTzsKKyAgICAgICAgICAgICAgICByZXMgPSBjLnVwZGF0ZShBTkRST0lEX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVCwgJmNmYSwgMSk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB1cGRhdGUgQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHNLZXlzID0geworICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQyLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfQ0FMSUJSQVRJT05fVFJBTlNGT1JNMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0NBTElCUkFUSU9OX1RSQU5TRk9STTIsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9DT0xPUl9UUkFOU0ZPUk0xLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfQ09MT1JfVFJBTlNGT1JNMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0ZPUldBUkRfTUFUUklYMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0ZPUldBUkRfTUFUUklYMiwKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHJlcyA9IHJlbW92ZUF2YWlsYWJsZUtleXMoYywgc0tleXMsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHVwZGF0ZSBSRVFVRVNUX0FWQUlMQUJMRV9DSEFSQUNURVJJU1RJQ1NfS0VZUzogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX1JFUVVFU1RfS0VZUworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiByZXFLZXlzID0geworICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX01PREUsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fVFJBTlNGT1JNLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX0dBSU5TLAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgcmVzID0gcmVtb3ZlQXZhaWxhYmxlS2V5cyhjLCByZXFLZXlzLCBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX1JFUVVFU1RfS0VZUyk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB1cGRhdGUgUkVRVUVTVF9BVkFJTEFCTEVfUkVRVUVTVF9LRVlTOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfUkVTVUxUX0tFWVMKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gcmVzS2V5cyA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0dSRUVOX1NQTElULAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfTkVVVFJBTF9DT0xPUl9QT0lOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9NT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX1RSQU5TRk9STSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9HQUlOUywKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHJlcyA9IHJlbW92ZUF2YWlsYWJsZUtleXMoYywgcmVzS2V5cywgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9SRVNVTFRfS0VZUyk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB1cGRhdGUgUkVRVUVTVF9BVkFJTEFCTEVfUkVTVUxUX0tFWVM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQU5EUk9JRF9TRU5TT1JfQkxBQ0tfTEVWRUxfUEFUVEVSTgorICAgICAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBibEVudHJ5ID0gYy5maW5kKEFORFJPSURfU0VOU09SX0JMQUNLX0xFVkVMX1BBVFRFUk4pOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAxOyBqIDwgYmxFbnRyeS5jb3VudDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGJsRW50cnkuZGF0YS5pMzJbal0gPSBibEVudHJ5LmRhdGEuaTMyWzBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OnJlbW92ZUF2YWlsYWJsZUtleXMoCisgICAgICAgIENhbWVyYU1ldGFkYXRhJiBjLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGtleXMsIHVpbnQzMl90IGtleVRhZykgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworCisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGtleXNFbnRyeSA9IGMuZmluZChrZXlUYWcpOworICAgIGlmIChrZXlzRW50cnkuY291bnQgPT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBmaW5kIHRhZyAldTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywga2V5VGFnLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gdktleXM7CisgICAgdktleXMucmVzZXJ2ZShrZXlzRW50cnkuY291bnQpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga2V5c0VudHJ5LmNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKHN0ZDo6ZmluZChrZXlzLmJlZ2luKCksIGtleXMuZW5kKCksIGtleXNFbnRyeS5kYXRhLmkzMltpXSkgPT0ga2V5cy5lbmQoKSkgeworICAgICAgICAgICAgdktleXMucHVzaF9iYWNrKGtleXNFbnRyeS5kYXRhLmkzMltpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmVzID0gYy51cGRhdGUoa2V5VGFnLCB2S2V5cy5kYXRhKCksIHZLZXlzLnNpemUoKSk7CisgICAgcmV0dXJuIHJlczsKK30KKworYm9vbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzTG9naWNhbENhbWVyYShjb25zdCBzdGQ6OnN0cmluZyYgaWQsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogcGh5c2ljYWxDYW1lcmFJZHMpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOworCisgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQpOworICAgIGlmIChkZXZpY2VJbmZvID09IG51bGxwdHIpIHJldHVybiBmYWxzZTsKKworICAgIGlmIChkZXZpY2VJbmZvLT5tSXNMb2dpY2FsQ2FtZXJhICYmIHBoeXNpY2FsQ2FtZXJhSWRzICE9IG51bGxwdHIpIHsKKyAgICAgICAgKnBoeXNpY2FsQ2FtZXJhSWRzID0gZGV2aWNlSW5mby0+bVBoeXNpY2FsSWRzOworICAgIH0KKyAgICByZXR1cm4gZGV2aWNlSW5mby0+bUlzTG9naWNhbENhbWVyYTsKK30KKworYm9vbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzSGlkZGVuUGh5c2ljYWxDYW1lcmEoY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkKSB7CisgICAgZm9yIChhdXRvJiBwcm92aWRlciA6IG1Qcm92aWRlcnMpIHsKKyAgICAgICAgZm9yIChhdXRvJiBkZXZpY2VJbmZvIDogcHJvdmlkZXItPm1EZXZpY2VzKSB7CisgICAgICAgICAgICBpZiAoZGV2aWNlSW5mby0+bUlkID09IGNhbWVyYUlkKSB7CisgICAgICAgICAgICAgICAgLy8gY2FtZXJhSWQgaXMgZm91bmQgaW4gcHVibGljIGNhbWVyYSBJRHMgYWR2ZXJ0aXNlZCBieSB0aGUKKyAgICAgICAgICAgICAgICAvLyBwcm92aWRlci4KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGF1dG8mIHByb3ZpZGVyIDogbVByb3ZpZGVycykgeworICAgICAgICBmb3IgKGF1dG8mIGRldmljZUluZm8gOiBwcm92aWRlci0+bURldmljZXMpIHsKKyAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhIGluZm87CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBkZXZpY2VJbmZvLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoJmluZm8pOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGdldENhbWVyYUNoYXJhY3RlcmlzdGljcyBmb3IgaWQgJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJbmZvLT5tSWQuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGh5c2ljYWxJZHM7CisgICAgICAgICAgICBpZiAoZGV2aWNlSW5mby0+bUlzTG9naWNhbENhbWVyYSkgeworICAgICAgICAgICAgICAgIGlmIChzdGQ6OmZpbmQoZGV2aWNlSW5mby0+bVBoeXNpY2FsSWRzLmJlZ2luKCksIGRldmljZUluZm8tPm1QaHlzaWNhbElkcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkKSAhPSBkZXZpY2VJbmZvLT5tUGh5c2ljYWxJZHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGRldmljZVZlcnNpb24gPSBIQVJEV0FSRV9ERVZJQ0VfQVBJX1ZFUlNJT04oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSW5mby0+bVZlcnNpb24uZ2V0X21ham9yKCksIGRldmljZUluZm8tPm1WZXJzaW9uLmdldF9taW5vcigpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRldmljZVZlcnNpb24gPCBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBXcm9uZyBkZXZpY2VWZXJzaW9uICV4IGZvciBoaWRkZW5QaHlzaWNhbENhbWVyYUlkICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXZpY2VWZXJzaW9uLCBjYW1lcmFJZC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOwogfQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmFkZFByb3ZpZGVyTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nJiBuZXdQcm92aWRlciwgYm9vbCBleHBlY3RlZCkgewpAQCAtNDQ1LDkgKzY3Myw4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzcDxQcm92aWRlckluZm8+IHByb3ZpZGVySW5mbyA9Ci0gICAgICAgICAgICBuZXcgUHJvdmlkZXJJbmZvKG5ld1Byb3ZpZGVyLCBpbnRlcmZhY2UsIHRoaXMpOwotICAgIHN0YXR1c190IHJlcyA9IHByb3ZpZGVySW5mby0+aW5pdGlhbGl6ZSgpOworICAgIHNwPFByb3ZpZGVySW5mbz4gcHJvdmlkZXJJbmZvID0gbmV3IFByb3ZpZGVySW5mbyhuZXdQcm92aWRlciwgdGhpcyk7CisgICAgc3RhdHVzX3QgcmVzID0gcHJvdmlkZXJJbmZvLT5pbml0aWFsaXplKGludGVyZmFjZSk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KQEAgLTQ1OCw2ICs2ODUsNyBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnJlbW92ZVByb3ZpZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm92aWRlcikgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBwcm92aWRlckxvY2sobVByb3ZpZGVyTGlmZWN5Y2xlTG9jayk7CiAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CiAgICAgc3RkOjp2ZWN0b3I8U3RyaW5nOD4gcmVtb3ZlZERldmljZUlkczsKICAgICBzdGF0dXNfdCByZXMgPSBOQU1FX05PVF9GT1VORDsKQEAgLTQ5OCwyNyArNzI2LDI2IEBACiAKIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpQcm92aWRlckluZm8oCiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZwcm92aWRlck5hbWUsCi0gICAgICAgIHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+JiBpbnRlcmZhY2UsCiAgICAgICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlciAqbWFuYWdlcikgOgogICAgICAgICBtUHJvdmlkZXJOYW1lKHByb3ZpZGVyTmFtZSksCi0gICAgICAgIG1JbnRlcmZhY2UoaW50ZXJmYWNlKSwKICAgICAgICAgbVByb3ZpZGVyVGFnaWQoZ2VuZXJhdGVWZW5kb3JUYWdJZChwcm92aWRlck5hbWUpKSwKICAgICAgICAgbVVuaXF1ZURldmljZUNvdW50KDApLAogICAgICAgICBtTWFuYWdlcihtYW5hZ2VyKSB7CiAgICAgKHZvaWQpIG1NYW5hZ2VyOwogfQogCi1zdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6aW5pdGlhbGl6ZSgpIHsKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjppbml0aWFsaXplKAorICAgICAgICBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiYgaW50ZXJmYWNlKSB7CiAgICAgc3RhdHVzX3QgcmVzID0gcGFyc2VQcm92aWRlck5hbWUobVByb3ZpZGVyTmFtZSwgJm1UeXBlLCAmbUlkKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBwcm92aWRlciBuYW1lLCBpZ25vcmluZyIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIEFMT0dJKCJDb25uZWN0aW5nIHRvIG5ldyBjYW1lcmEgcHJvdmlkZXI6ICVzLCBpc1JlbW90ZT8gJWQiLAotICAgICAgICAgICAgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBtSW50ZXJmYWNlLT5pc1JlbW90ZSgpKTsKKyAgICAgICAgICAgIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgaW50ZXJmYWNlLT5pc1JlbW90ZSgpKTsKICAgICAvLyBjYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2UgY2FsbGJhY2tzIG1heSBiZSBjYWxsZWQgKGFuZCBjYXVzaW5nIG5ldyBkZXZpY2VzIGFkZGVkKQogICAgIC8vIGJlZm9yZSBzZXRDYWxsYmFjayByZXR1cm5zCi0gICAgaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1JbnRlcmZhY2UtPnNldENhbGxiYWNrKHRoaXMpOworICAgIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBpbnRlcmZhY2UtPnNldENhbGxiYWNrKHRoaXMpOwogICAgIGlmICghc3RhdHVzLmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIHNldHRpbmcgdXAgY2FsbGJhY2tzIHdpdGggY2FtZXJhIHByb3ZpZGVyICclcyc6ICVzIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgc3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CkBAIC01MzAsNyArNzU3LDcgQEAKICAgICAgICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzdGF0dXMpOwogICAgIH0KIAotICAgIGhhcmR3YXJlOjpSZXR1cm48Ym9vbD4gbGlua2VkID0gbUludGVyZmFjZS0+bGlua1RvRGVhdGgodGhpcywgLypjb29raWUqLyBtSWQpOworICAgIGhhcmR3YXJlOjpSZXR1cm48Ym9vbD4gbGlua2VkID0gaW50ZXJmYWNlLT5saW5rVG9EZWF0aCh0aGlzLCAvKmNvb2tpZSovIG1JZCk7CiAgICAgaWYgKCFsaW5rZWQuaXNPaygpKSB7CiAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgaW4gbGlua2luZyB0byBjYW1lcmEgcHJvdmlkZXIgJyVzJyBkZWF0aDogJXMiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBsaW5rZWQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKQEAgLTU0MiwxMyArNzY5LDIyIEBACiAKICAgICAvLyBHZXQgaW5pdGlhbCBsaXN0IG9mIGNhbWVyYSBkZXZpY2VzLCBpZiBhbnkKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZGV2aWNlczsKLSAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldCA9IG1JbnRlcmZhY2UtPmdldENhbWVyYUlkTGlzdChbJnN0YXR1cywgJmRldmljZXNdKAorICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0ID0gaW50ZXJmYWNlLT5nZXRDYW1lcmFJZExpc3QoWyZzdGF0dXMsIHRoaXMsICZkZXZpY2VzXSgKICAgICAgICAgICAgIFN0YXR1cyBpZFN0YXR1cywKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6aGlkbF9zdHJpbmc+JiBjYW1lcmFEZXZpY2VOYW1lcykgewogICAgICAgICBzdGF0dXMgPSBpZFN0YXR1czsKICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhbWVyYURldmljZU5hbWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlcy5wdXNoX2JhY2soY2FtZXJhRGV2aWNlTmFtZXNbaV0pOworICAgICAgICAgICAgZm9yIChhdXRvJiBuYW1lIDogY2FtZXJhRGV2aWNlTmFtZXMpIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBtYWpvciwgbWlub3I7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdHlwZSwgaWQ7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gcGFyc2VEZXZpY2VOYW1lKG5hbWUsICZtYWpvciwgJm1pbm9yLCAmdHlwZSwgJmlkKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3IgcGFyc2luZyBkZXZpY2VOYW1lOiAlczogJWQiLCBfX0ZVTkNUSU9OX18sIG5hbWUuY19zdHIoKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLnB1c2hfYmFjayhuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgbVByb3ZpZGVyUHVibGljQ2FtZXJhSWRzLnB1c2hfYmFjayhpZCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IH0pOwogICAgIGlmICghcmV0LmlzT2soKSkgewpAQCAtNTYyLDExICs3OTgsMjQgQEAKICAgICAgICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzdGF0dXMpOwogICAgIH0KIAorICAgIHJldCA9IGludGVyZmFjZS0+aXNTZXRUb3JjaE1vZGVTdXBwb3J0ZWQoCisgICAgICAgIFt0aGlzXShhdXRvIHN0YXR1cywgYm9vbCBzdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIG1TZXRUb3JjaE1vZGVTdXBwb3J0ZWQgPSBzdXBwb3J0ZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGNoZWNraW5nIHRvcmNoIG1vZGUgc3VwcG9ydCAnJXMnOiAlcyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgbUlzUmVtb3RlID0gaW50ZXJmYWNlLT5pc1JlbW90ZSgpOworCiAgICAgc3A8U3RhdHVzTGlzdGVuZXI+IGxpc3RlbmVyID0gbU1hbmFnZXItPmdldFN0YXR1c0xpc3RlbmVyKCk7CiAgICAgZm9yIChhdXRvJiBkZXZpY2UgOiBkZXZpY2VzKSB7CiAgICAgICAgIHN0ZDo6c3RyaW5nIGlkOwotICAgICAgICBzdGF0dXNfdCByZXMgPSBhZGREZXZpY2UoZGV2aWNlLAotICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzOjpQUkVTRU5ULCAmaWQpOworICAgICAgICBzdGF0dXNfdCByZXMgPSBhZGREZXZpY2UoZGV2aWNlLCBjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1czo6UFJFU0VOVCwgJmlkKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZW51bWVyYXRlIGNhbWVyYSBkZXZpY2UgJyVzJzogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlLmNfc3RyKCksIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtNTc0LDEzICs4MjMsNTMgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHJlcyA9IHNldFVwVmVuZG9yVGFncygpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gc2V0IHVwIHZlbmRvciB0YWdzIGZyb20gcHJvdmlkZXIgJyVzJyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKwogICAgIEFMT0dJKCJDYW1lcmEgcHJvdmlkZXIgJXMgcmVhZHkgd2l0aCAlenUgY2FtZXJhIGRldmljZXMiLAogICAgICAgICAgICAgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBtRGV2aWNlcy5zaXplKCkpOwogCiAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICBpZiAoIWtFbmFibGVMYXp5SGFsKSB7CisgICAgICAgIC8vIFNhdmUgSEFMIHJlZmVyZW5jZSBpbmRlZmluaXRlbHkKKyAgICAgICAgbVNhdmVkSW50ZXJmYWNlID0gaW50ZXJmYWNlOworICAgIH0KICAgICByZXR1cm4gT0s7CiB9CiAKK2NvbnN0IHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+CitDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6c3RhcnRQcm92aWRlckludGVyZmFjZSgpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dJKCJSZXF1ZXN0IHRvIHN0YXJ0IGNhbWVyYSBwcm92aWRlcjogJXMiLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgIGlmIChtU2F2ZWRJbnRlcmZhY2UgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbVNhdmVkSW50ZXJmYWNlOworICAgIH0KKyAgICBhdXRvIGludGVyZmFjZSA9IG1BY3RpdmVJbnRlcmZhY2UucHJvbW90ZSgpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HSSgiQ291bGQgbm90IHByb21vdGUsIGNhbGxpbmcgZ2V0U2VydmljZSglcykiLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgICAgICBpbnRlcmZhY2UgPSBtTWFuYWdlci0+bVNlcnZpY2VQcm94eS0+Z2V0U2VydmljZShtUHJvdmlkZXJOYW1lKTsKKyAgICAgICAgaW50ZXJmYWNlLT5zZXRDYWxsYmFjayh0aGlzKTsKKyAgICAgICAgaGFyZHdhcmU6OlJldHVybjxib29sPiBsaW5rZWQgPSBpbnRlcmZhY2UtPmxpbmtUb0RlYXRoKHRoaXMsIC8qY29va2llKi8gbUlkKTsKKyAgICAgICAgaWYgKCFsaW5rZWQuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGluIGxpbmtpbmcgdG8gY2FtZXJhIHByb3ZpZGVyICclcycgZGVhdGg6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIGxpbmtlZC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgbU1hbmFnZXItPnJlbW92ZVByb3ZpZGVyKG1Qcm92aWRlck5hbWUpOworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0gZWxzZSBpZiAoIWxpbmtlZCkgeworICAgICAgICAgICAgQUxPR1coIiVzOiBVbmFibGUgdG8gbGluayB0byBwcm92aWRlciAnJXMnIGRlYXRoIG5vdGlmaWNhdGlvbnMiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgbUFjdGl2ZUludGVyZmFjZSA9IGludGVyZmFjZTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HSSgiQ2FtZXJhIHByb3ZpZGVyICglcykgYWxyZWFkeSBpbiB1c2UuIFJlLXVzaW5nIGluc3RhbmNlLiIsIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBpbnRlcmZhY2U7Cit9CisKIGNvbnN0IHN0ZDo6c3RyaW5nJiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6Z2V0VHlwZSgpIGNvbnN0IHsKICAgICByZXR1cm4gbVR5cGU7CiB9CkBAIC02NjIsNyArOTUxLDcgQEAKIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JikgY29uc3QgewogICAgIGRwcmludGYoZmQsICI9PSBDYW1lcmEgUHJvdmlkZXIgSEFMICVzICh2Mi40LCAlcykgc3RhdGljIGluZm86ICV6dSBkZXZpY2VzOiA9PVxuIiwKLSAgICAgICAgICAgIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgbUludGVyZmFjZS0+aXNSZW1vdGUoKSA/ICJyZW1vdGUiIDogInBhc3N0aHJvdWdoIiwKKyAgICAgICAgICAgIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgbUlzUmVtb3RlID8gInJlbW90ZSIgOiAicGFzc3Rocm91Z2giLAogICAgICAgICAgICAgbURldmljZXMuc2l6ZSgpKTsKIAogICAgIGZvciAoYXV0byYgZGV2aWNlIDogbURldmljZXMpIHsKQEAgLTcwMyw2ICs5OTIsMjQgQEAKICAgICAgICAgICAgIGluZm8yLmR1bXAoZmQsIC8qdmVyYm9zaXR5Ki8gMiwgLyppbmRlbnRhdGlvbiovIDQpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gRHVtcCBjaGFyYWN0ZXJpc3RpY3Mgb2Ygbm9uLXN0YW5kYWxvbmUgcGh5c2ljYWwgY2FtZXJhCisgICAgICAgIGlmIChkZXZpY2UtPm1Jc0xvZ2ljYWxDYW1lcmEpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byYgaWQgOiBkZXZpY2UtPm1QaHlzaWNhbElkcykgeworICAgICAgICAgICAgICAgIC8vIFNraXAgaWYgcGh5c2ljYWwgaWQgaXMgYW4gaW5kZXBlbmRlbnQgY2FtZXJhCisgICAgICAgICAgICAgICAgaWYgKHN0ZDo6ZmluZChtUHJvdmlkZXJQdWJsaWNDYW1lcmFJZHMuYmVnaW4oKSwgbVByb3ZpZGVyUHVibGljQ2FtZXJhSWRzLmVuZCgpLCBpZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICE9IG1Qcm92aWRlclB1YmxpY0NhbWVyYUlkcy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBwaHlzaWNhbEluZm87CisgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2aWNlLT5nZXRQaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcyhpZCwgJnBoeXNpY2FsSW5mbyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAiICBQaHlzaWNhbCBjYW1lcmEgJXMgY2hhcmFjdGVyaXN0aWNzOlxuIiwgaWQuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsSW5mby5kdW1wKGZkLCAvKnZlcmJvc2l0eSovIDIsIC8qaW5kZW50YXRpb24qLyA0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBkcHJpbnRmKGZkLCAiPT0gQ2FtZXJhIEhBTCBkZXZpY2UgJXMgKHYlZC4lZCkgZHVtcFN0YXRlOiA9PVxuIiwgZGV2aWNlLT5tTmFtZS5jX3N0cigpLAogICAgICAgICAgICAgICAgIGRldmljZS0+bVZlcnNpb24uZ2V0X21ham9yKCksIGRldmljZS0+bVZlcnNpb24uZ2V0X21pbm9yKCkpOwogICAgICAgICByZXMgPSBkZXZpY2UtPmR1bXBTdGF0ZShmZCk7CkBAIC03NzIsNiArMTA3OSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB0b3JjaFN0YXR1c1RvU3RyaW5nKG5ld1N0YXR1cykpOwogICAgICAgICAgICAgICAgIGlkID0gZGV2aWNlSW5mby0+bUlkOwogICAgICAgICAgICAgICAgIGtub3duID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAoVG9yY2hNb2RlU3RhdHVzOjpBVkFJTEFCTEVfT04gIT0gbmV3U3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLT5yZW1vdmVSZWYoRGV2aWNlTW9kZTo6VE9SQ0gsIGlkKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTgwMCwxNSArMTExMCw1NSBAQAogICAgIG1NYW5hZ2VyLT5yZW1vdmVQcm92aWRlcihtUHJvdmlkZXJOYW1lKTsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnNldFVwVmVuZG9yVGFncygpIHsKKyAgICBpZiAobVZlbmRvclRhZ0Rlc2NyaXB0b3IgIT0gbnVsbHB0cikKKyAgICAgICAgcmV0dXJuIE9LOworCisgICAgaGFyZHdhcmU6OmhpZGxfdmVjPFZlbmRvclRhZ1NlY3Rpb24+IHZ0czsKKyAgICBTdGF0dXMgc3RhdHVzOworICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OworICAgIGNvbnN0IHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZSA9IHN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICByZXQgPSBpbnRlcmZhY2UtPmdldFZlbmRvclRhZ3MoCisgICAgICAgIFsmXShhdXRvIHMsIGNvbnN0IGF1dG8mIHZlbmRvclRhZ1NlY3MpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICBpZiAocyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgdnRzID0gdmVuZG9yVGFnU2VjczsKKyAgICAgICAgICAgIH0KKyAgICB9KTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBnZXR0aW5nIHZlbmRvciB0YWdzIGZyb20gcHJvdmlkZXIgJyVzJzogJXMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzdGF0dXMpOworICAgIH0KKworICAgIC8vIFJlYWQgYWxsIHZlbmRvciB0YWcgZGVmaW5pdGlvbnMgaW50byBhIGRlc2NyaXB0b3IKKyAgICBzdGF0dXNfdCByZXM7CisgICAgaWYgKChyZXMgPSBIaWRsVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y3JlYXRlRGVzY3JpcHRvckZyb21IaWRsKHZ0cywgLypvdXQqL21WZW5kb3JUYWdEZXNjcmlwdG9yKSkKKyAgICAgICAgICAgICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGdlbmVyYXRlIGRlc2NyaXB0b3IgZnJvbSB2ZW5kb3IgdGFnIG9wZXJhdGlvbnMsIgorICAgICAgICAgICAgICAgICJyZWNlaXZlZCBlcnJvciAlcyAoJWQpLiBDYW1lcmEgY2xpZW50cyB3aWxsIG5vdCBiZSBhYmxlIHRvIHVzZSIKKyAgICAgICAgICAgICAgICAidmVuZG9yIHRhZ3MiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKHJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCiB0ZW1wbGF0ZTxjbGFzcyBEZXZpY2VJbmZvVD4KIHN0ZDo6dW5pcXVlX3B0cjxDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbz4KICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6aW5pdGlhbGl6ZURldmljZUluZm8oCiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCB1aW50MTZfdCBtaW5vclZlcnNpb24pIGNvbnN0IHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCB1aW50MTZfdCBtaW5vclZlcnNpb24pIHsKICAgICBTdGF0dXMgc3RhdHVzOwogCiAgICAgYXV0byBjYW1lcmFJbnRlcmZhY2UgPQotICAgICAgICAgICAgZ2V0RGV2aWNlSW50ZXJmYWNlPHR5cGVuYW1lIERldmljZUluZm9UOjpJbnRlcmZhY2VUPihuYW1lKTsKKyAgICAgICAgICAgIHN0YXJ0RGV2aWNlSW50ZXJmYWNlPHR5cGVuYW1lIERldmljZUluZm9UOjpJbnRlcmZhY2VUPihuYW1lKTsKICAgICBpZiAoY2FtZXJhSW50ZXJmYWNlID09IG51bGxwdHIpIHJldHVybiBudWxscHRyOwogCiAgICAgQ2FtZXJhUmVzb3VyY2VDb3N0IHJlc291cmNlQ29zdDsKQEAgLTgzNSwxMyArMTE4NSwxMyBAQAogICAgIH0KIAogICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8RGV2aWNlSW5mbz4oCi0gICAgICAgIG5ldyBEZXZpY2VJbmZvVChuYW1lLCB0YWdJZCwgaWQsIG1pbm9yVmVyc2lvbiwgcmVzb3VyY2VDb3N0LAotICAgICAgICAgICAgICAgIGNhbWVyYUludGVyZmFjZSkpOworICAgICAgICBuZXcgRGV2aWNlSW5mb1QobmFtZSwgdGFnSWQsIGlkLCBtaW5vclZlcnNpb24sIHJlc291cmNlQ29zdCwgdGhpcywKKyAgICAgICAgICAgICAgICBtUHJvdmlkZXJQdWJsaWNDYW1lcmFJZHMsIGNhbWVyYUludGVyZmFjZSkpOwogfQogCiB0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2VUPgogc3A8SW50ZXJmYWNlVD4KLUNhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpnZXREZXZpY2VJbnRlcmZhY2UoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIGNvbnN0IHsKK0NhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpzdGFydERldmljZUludGVyZmFjZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgewogICAgIEFMT0dFKCIlczogRGV2aWNlICVzOiBVbmtub3duIEhJREwgZGV2aWNlIEhBTCBtYWpvciB2ZXJzaW9uICVkOiIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgIG5hbWUuY19zdHIoKSwgSW50ZXJmYWNlVDo6dmVyc2lvbi5nZXRfbWFqb3IoKSk7CiAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC04NDksMTIgKzExOTksMTYgQEAKIAogdGVtcGxhdGU8Pgogc3A8ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlPgotQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmdldERldmljZUludGVyZmFjZQotICAgICAgICA8ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlPihjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgY29uc3QgeworQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnN0YXJ0RGV2aWNlSW50ZXJmYWNlCisgICAgICAgIDxkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2U+KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSB7CiAgICAgU3RhdHVzIHN0YXR1czsKICAgICBzcDxkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2U+IGNhbWVyYUludGVyZmFjZTsKICAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKLSAgICByZXQgPSBtSW50ZXJmYWNlLT5nZXRDYW1lcmFEZXZpY2VJbnRlcmZhY2VfVjFfeChuYW1lLCBbJnN0YXR1cywgJmNhbWVyYUludGVyZmFjZV0oCisgICAgY29uc3Qgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlID0gc3RhcnRQcm92aWRlckludGVyZmFjZSgpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0ID0gaW50ZXJmYWNlLT5nZXRDYW1lcmFEZXZpY2VJbnRlcmZhY2VfVjFfeChuYW1lLCBbJnN0YXR1cywgJmNhbWVyYUludGVyZmFjZV0oCiAgICAgICAgIFN0YXR1cyBzLCBzcDxkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2U+IGludGVyZmFjZSkgewogICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CiAgICAgICAgICAgICAgICAgY2FtZXJhSW50ZXJmYWNlID0gaW50ZXJmYWNlOwpAQCAtODc0LDEyICsxMjI4LDE2IEBACiAKIHRlbXBsYXRlPD4KIHNwPGRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZT4KLUNhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpnZXREZXZpY2VJbnRlcmZhY2UKLSAgICAgICAgPGRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZT4oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIGNvbnN0IHsKK0NhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpzdGFydERldmljZUludGVyZmFjZQorICAgICAgICA8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlPihjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgewogICAgIFN0YXR1cyBzdGF0dXM7CiAgICAgc3A8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlPiBjYW1lcmFJbnRlcmZhY2U7CiAgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQ7Ci0gICAgcmV0ID0gbUludGVyZmFjZS0+Z2V0Q2FtZXJhRGV2aWNlSW50ZXJmYWNlX1YzX3gobmFtZSwgWyZzdGF0dXMsICZjYW1lcmFJbnRlcmZhY2VdKAorICAgIGNvbnN0IHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZSA9IHN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldCA9IGludGVyZmFjZS0+Z2V0Q2FtZXJhRGV2aWNlSW50ZXJmYWNlX1YzX3gobmFtZSwgWyZzdGF0dXMsICZjYW1lcmFJbnRlcmZhY2VdKAogICAgICAgICBTdGF0dXMgcywgc3A8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2UpIHsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwogICAgICAgICAgICAgICAgIGNhbWVyYUludGVyZmFjZSA9IGludGVyZmFjZTsKQEAgLTkwMCw2ICsxMjU4LDE4IEBACiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzo6fkRldmljZUluZm8oKSB7fQogCiB0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2VUPgorc3A8SW50ZXJmYWNlVD4gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm86OnN0YXJ0RGV2aWNlSW50ZXJmYWNlKCkgeworICAgIHNwPEludGVyZmFjZVQ+IGRldmljZTsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChtU2F2ZWRJbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICBkZXZpY2UgPSBtUGFyZW50UHJvdmlkZXItPnN0YXJ0RGV2aWNlSW50ZXJmYWNlPEludGVyZmFjZVQ+KG1OYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZXZpY2UgPSAoSW50ZXJmYWNlVCAqKSBtU2F2ZWRJbnRlcmZhY2UuZ2V0KCk7CisgICAgfQorICAgIHJldHVybiBkZXZpY2U7Cit9CisKK3RlbXBsYXRlPGNsYXNzIEludGVyZmFjZVQ+CiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzo6c2V0VG9yY2hNb2RlKEludGVyZmFjZVQmIGludGVyZmFjZSwKICAgICAgICAgYm9vbCBlbmFibGVkKSB7CiAgICAgU3RhdHVzIHMgPSBpbnRlcmZhY2UtPnNldFRvcmNoTW9kZShlbmFibGVkID8gVG9yY2hNb2RlOjpPTiA6IFRvcmNoTW9kZTo6T0ZGKTsKQEAgLTkxMCwzMCArMTI4MCwzMSBAQAogICAgICAgICBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAogICAgICAgICB1aW50MTZfdCBtaW5vclZlcnNpb24sCiAgICAgICAgIGNvbnN0IENhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0LAorICAgICAgICBzcDxQcm92aWRlckluZm8+IHBhcmVudFByb3ZpZGVyLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHB1YmxpY0NhbWVyYUlkcywKICAgICAgICAgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlKSA6CiAgICAgICAgIERldmljZUluZm8obmFtZSwgdGFnSWQsIGlkLCBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uezEsIG1pbm9yVmVyc2lvbn0sCi0gICAgICAgICAgICAgICAgICAgcmVzb3VyY2VDb3N0KSwKLSAgICAgICAgbUludGVyZmFjZShpbnRlcmZhY2UpIHsKKyAgICAgICAgICAgICAgICAgICBwdWJsaWNDYW1lcmFJZHMsIHJlc291cmNlQ29zdCwgcGFyZW50UHJvdmlkZXIpIHsKICAgICAvLyBHZXQgZGVmYXVsdCBwYXJhbWV0ZXJzIGFuZCBpbml0aWFsaXplIGZsYXNoIHVuaXQgYXZhaWxhYmlsaXR5CiAgICAgLy8gUmVxdWlyZXMgcG93ZXJpbmcgb24gdGhlIGNhbWVyYSBkZXZpY2UKLSAgICBoYXJkd2FyZTo6UmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gbUludGVyZmFjZS0+b3BlbihudWxscHRyKTsKKyAgICBoYXJkd2FyZTo6UmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gaW50ZXJmYWNlLT5vcGVuKG51bGxwdHIpOwogICAgIGlmICghc3RhdHVzLmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIG9wZW5pbmcgY2FtZXJhIGRldmljZSAlcyB0byBjaGVjayBmb3IgYSBmbGFzaCB1bml0OiAlcyIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQuY19zdHIoKSwgc3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCBzdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gb3BlbiBjYW1lcmEgZGV2aWNlICVzIHRvIGNoZWNrIGZvciBhIGZsYXNoIHVuaXQ6ICVzIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgIG1JZC5jX3N0cigpLCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnN0YXR1c1RvU3RyaW5nKHN0YXR1cykpOworICAgICAgICAgICAgICAgIGlkLmNfc3RyKCksIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c3RhdHVzVG9TdHJpbmcoc3RhdHVzKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQ7Ci0gICAgcmV0ID0gbUludGVyZmFjZS0+Z2V0UGFyYW1ldGVycyhbdGhpc10oY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBwYXJtcykgeworICAgIHJldCA9IGludGVyZmFjZS0+Z2V0UGFyYW1ldGVycyhbdGhpc10oY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBwYXJtcykgewogICAgICAgICAgICAgICAgIG1EZWZhdWx0UGFyYW1ldGVycy51bmZsYXR0ZW4oU3RyaW5nOChwYXJtcy5jX3N0cigpKSk7CiAgICAgICAgICAgICB9KTsKICAgICBpZiAoIXJldC5pc09rKCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciByZWFkaW5nIGNhbWVyYSBkZXZpY2UgJXMgcGFyYW1zIHRvIGNoZWNrIGZvciBhIGZsYXNoIHVuaXQ6ICVzIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZC5jX3N0cigpLCBzdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIHN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIGNvbnN0IGNoYXIgKmZsYXNoTW9kZSA9CkBAIC05NDIsMjcgKzEzMTMsNDMgQEAKICAgICAgICAgbUhhc0ZsYXNoVW5pdCA9IHRydWU7CiAgICAgfQogCi0gICAgcmV0ID0gbUludGVyZmFjZS0+Y2xvc2UoKTsKKyAgICBzdGF0dXNfdCByZXMgPSBjYWNoZUNhbWVyYUluZm8oaW50ZXJmYWNlKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGNhY2hlIENhbWVyYUluZm8iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcmV0ID0gaW50ZXJmYWNlLT5jbG9zZSgpOwogICAgIGlmICghcmV0LmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGNsb3NpbmcgY2FtZXJhIGRldmljZSAlcyBhZnRlciBjaGVjayBmb3IgYSBmbGFzaCB1bml0OiAlcyIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQuY19zdHIoKSwgc3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCBzdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICB9CisKKyAgICBpZiAoIWtFbmFibGVMYXp5SGFsKSB7CisgICAgICAgIC8vIFNhdmUgSEFMIHJlZmVyZW5jZSBpbmRlZmluaXRlbHkKKyAgICAgICAgbVNhdmVkSW50ZXJmYWNlID0gaW50ZXJmYWNlOwogICAgIH0KIH0KIAogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8xOjp+RGV2aWNlSW5mbzEoKSB7fQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzE6OnNldFRvcmNoTW9kZShib29sIGVuYWJsZWQpIHsKLSAgICByZXR1cm4gRGV2aWNlSW5mbzo6c2V0VG9yY2hNb2RlKG1JbnRlcmZhY2UsIGVuYWJsZWQpOworICAgIHJldHVybiBzZXRUb3JjaE1vZGVGb3JEZXZpY2U8SW50ZXJmYWNlVD4oZW5hYmxlZCk7CiB9CiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMTo6Z2V0Q2FtZXJhSW5mbygKICAgICAgICAgaGFyZHdhcmU6OkNhbWVyYUluZm8gKmluZm8pIGNvbnN0IHsKICAgICBpZiAoaW5mbyA9PSBudWxscHRyKSByZXR1cm4gQkFEX1ZBTFVFOworICAgICppbmZvID0gbUluZm87CisgICAgcmV0dXJuIE9LOworfQogCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzE6OmNhY2hlQ2FtZXJhSW5mbygKKyAgICAgICAgc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8xOjpJbnRlcmZhY2VUPiBpbnRlcmZhY2UpIHsKICAgICBTdGF0dXMgc3RhdHVzOwogICAgIGRldmljZTo6VjFfMDo6Q2FtZXJhSW5mbyBjSW5mbzsKICAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKLSAgICByZXQgPSBtSW50ZXJmYWNlLT5nZXRDYW1lcmFJbmZvKFsmc3RhdHVzLCAmY0luZm9dKFN0YXR1cyBzLCBkZXZpY2U6OlYxXzA6OkNhbWVyYUluZm8gY2FtSW5mbykgeworICAgIHJldCA9IGludGVyZmFjZS0+Z2V0Q2FtZXJhSW5mbyhbJnN0YXR1cywgJmNJbmZvXShTdGF0dXMgcywgZGV2aWNlOjpWMV8wOjpDYW1lcmFJbmZvIGNhbUluZm8pIHsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwogICAgICAgICAgICAgICAgIGNJbmZvID0gY2FtSW5mbzsKICAgICAgICAgICAgIH0pOwpAQCAtOTc3LDI3ICsxMzY0LDMxIEBACiAKICAgICBzd2l0Y2goY0luZm8uZmFjaW5nKSB7CiAgICAgICAgIGNhc2UgZGV2aWNlOjpWMV8wOjpDYW1lcmFGYWNpbmc6OkJBQ0s6Ci0gICAgICAgICAgICBpbmZvLT5mYWNpbmcgPSBoYXJkd2FyZTo6Q0FNRVJBX0ZBQ0lOR19CQUNLOworICAgICAgICAgICAgbUluZm8uZmFjaW5nID0gaGFyZHdhcmU6OkNBTUVSQV9GQUNJTkdfQkFDSzsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIGRldmljZTo6VjFfMDo6Q2FtZXJhRmFjaW5nOjpFWFRFUk5BTDoKICAgICAgICAgICAgIC8vIE1hcCBleHRlcm5hbCB0byBmcm9udCBmb3IgbGVnYWN5IEFQSQogICAgICAgICBjYXNlIGRldmljZTo6VjFfMDo6Q2FtZXJhRmFjaW5nOjpGUk9OVDoKLSAgICAgICAgICAgIGluZm8tPmZhY2luZyA9IGhhcmR3YXJlOjpDQU1FUkFfRkFDSU5HX0ZST05UOworICAgICAgICAgICAgbUluZm8uZmFjaW5nID0gaGFyZHdhcmU6OkNBTUVSQV9GQUNJTkdfRlJPTlQ7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dXKCIlczogRGV2aWNlICVzOiBVbmtub3duIGNhbWVyYSBmYWNpbmc6ICVkIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQuY19zdHIoKSwgY0luZm8uZmFjaW5nKTsKLSAgICAgICAgICAgIGluZm8tPmZhY2luZyA9IGhhcmR3YXJlOjpDQU1FUkFfRkFDSU5HX0JBQ0s7CisgICAgICAgICAgICBtSW5mby5mYWNpbmcgPSBoYXJkd2FyZTo6Q0FNRVJBX0ZBQ0lOR19CQUNLOwogICAgIH0KLSAgICBpbmZvLT5vcmllbnRhdGlvbiA9IGNJbmZvLm9yaWVudGF0aW9uOworICAgIG1JbmZvLm9yaWVudGF0aW9uID0gY0luZm8ub3JpZW50YXRpb247CiAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMTo6ZHVtcFN0YXRlKGludCBmZCkgY29uc3Qgeworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8xOjpkdW1wU3RhdGUoaW50IGZkKSB7CiAgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLDApOwogICAgIGhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzID0gbUludGVyZmFjZS0+ZHVtcFN0YXRlKGhhbmRsZSk7CisgICAgY29uc3Qgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlID0gc3RhcnREZXZpY2VJbnRlcmZhY2U8SW50ZXJmYWNlVD4oKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBoYXJkd2FyZTo6UmV0dXJuPFN0YXR1cz4gcyA9IGludGVyZmFjZS0+ZHVtcFN0YXRlKGhhbmRsZSk7CiAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGFuZGxlKTsKICAgICBpZiAoIXMuaXNPaygpKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTEwMDksMTQgKzE0MDAsMTUgQEAKICAgICAgICAgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKICAgICAgICAgdWludDE2X3QgbWlub3JWZXJzaW9uLAogICAgICAgICBjb25zdCBDYW1lcmFSZXNvdXJjZUNvc3QmIHJlc291cmNlQ29zdCwKKyAgICAgICAgc3A8UHJvdmlkZXJJbmZvPiBwYXJlbnRQcm92aWRlciwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwdWJsaWNDYW1lcmFJZHMsCiAgICAgICAgIHNwPEludGVyZmFjZVQ+IGludGVyZmFjZSkgOgogICAgICAgICBEZXZpY2VJbmZvKG5hbWUsIHRhZ0lkLCBpZCwgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbnszLCBtaW5vclZlcnNpb259LAotICAgICAgICAgICAgICAgICAgIHJlc291cmNlQ29zdCksCi0gICAgICAgIG1JbnRlcmZhY2UoaW50ZXJmYWNlKSB7CisgICAgICAgICAgICAgICAgICAgcHVibGljQ2FtZXJhSWRzLCByZXNvdXJjZUNvc3QsIHBhcmVudFByb3ZpZGVyKSB7CiAgICAgLy8gR2V0IGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgYW5kIGluaXRpYWxpemUgZmxhc2ggdW5pdCBhdmFpbGFiaWxpdHkKICAgICBTdGF0dXMgc3RhdHVzOwogICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OwotICAgIHJldCA9IG1JbnRlcmZhY2UtPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhbJnN0YXR1cywgdGhpc10oU3RhdHVzIHMsCisgICAgcmV0ID0gaW50ZXJmYWNlLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoWyZzdGF0dXMsIHRoaXNdKFN0YXR1cyBzLAogICAgICAgICAgICAgICAgICAgICBkZXZpY2U6OlYzXzI6OkNhbWVyYU1ldGFkYXRhIG1ldGFkYXRhKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKICAgICAgICAgICAgICAgICBpZiAocyA9PSBTdGF0dXM6Ok9LKSB7CkBAIC0xMDM1LDEzICsxNDI3LDE5IEBACiAgICAgICAgICAgICB9KTsKICAgICBpZiAoIXJldC5pc09rKCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBnZXR0aW5nIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgZm9yIGRldmljZSAlcyIKLSAgICAgICAgICAgICAgICAiIHRvIGNoZWNrIGZvciBhIGZsYXNoIHVuaXQ6ICVzIiwgX19GVU5DVElPTl9fLCBtSWQuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAiIHRvIGNoZWNrIGZvciBhIGZsYXNoIHVuaXQ6ICVzIiwgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLAogICAgICAgICAgICAgICAgIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgewogICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBnZXQgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBmb3IgZGV2aWNlICVzOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZC5jX3N0cigpLCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnN0YXR1c1RvU3RyaW5nKHN0YXR1cyksIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnN0YXR1c1RvU3RyaW5nKHN0YXR1cyksIHN0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RhdHVzX3QgcmVzID0gZml4dXBNb25vY2hyb21lVGFncygpOworICAgIGlmIChPSyAhPSByZXMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZml4IHVwIG1vbm9jaHJvbWUgdGFncyBiYXNlZCBmb3Igb2xkZXIgSEFMIHZlcnNpb246ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGZsYXNoQXZhaWxhYmxlID0KQEAgLTEwNTIsMTIgKzE0NTAsNzAgQEAKICAgICB9IGVsc2UgewogICAgICAgICBtSGFzRmxhc2hVbml0ID0gZmFsc2U7CiAgICAgfQorCisgICAgcXVlcnlQaHlzaWNhbENhbWVyYUlkcygpOworICAgIC8vIEdldCBwaHlzaWNhbCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGlmIGFwcGxpY2FibGUKKyAgICBhdXRvIGNhc3RSZXN1bHQgPSBkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2U6OmNhc3RGcm9tKGludGVyZmFjZSk7CisgICAgaWYgKCFjYXN0UmVzdWx0LmlzT2soKSkgeworICAgICAgICBBTE9HVigiJXM6IFVuYWJsZSB0byBjb252ZXJ0IElDYW1lcmFEZXZpY2UgaW5zdGFuY2UgdG8gdmVyc2lvbiAzLjUiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPGRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZT4gaW50ZXJmYWNlXzNfNSA9IGNhc3RSZXN1bHQ7CisgICAgaWYgKGludGVyZmFjZV8zXzUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IENvbnZlcnRlZCBJQ2FtZXJhRGV2aWNlIGluc3RhbmNlIHRvIG51bGxwdHIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1Jc0xvZ2ljYWxDYW1lcmEpIHsKKyAgICAgICAgZm9yIChhdXRvJiBpZCA6IG1QaHlzaWNhbElkcykgeworICAgICAgICAgICAgaWYgKHN0ZDo6ZmluZChtUHVibGljQ2FtZXJhSWRzLmJlZ2luKCksIG1QdWJsaWNDYW1lcmFJZHMuZW5kKCksIGlkKSAhPQorICAgICAgICAgICAgICAgICAgICBtUHVibGljQ2FtZXJhSWRzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX3N0cmluZyBoaWRsSWQoaWQpOworICAgICAgICAgICAgcmV0ID0gaW50ZXJmYWNlXzNfNS0+Z2V0UGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoaGlkbElkLAorICAgICAgICAgICAgICAgICAgICBbJnN0YXR1cywgJmlkLCB0aGlzXShTdGF0dXMgcywgZGV2aWNlOjpWM18yOjpDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YSkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgaWYgKHMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCAqYnVmZmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4obWV0YWRhdGEuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGV4cGVjdGVkU2l6ZSA9IG1ldGFkYXRhLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJlcyA9IHZhbGlkYXRlX2NhbWVyYV9tZXRhZGF0YV9zdHJ1Y3R1cmUoYnVmZmVyLCAmZXhwZWN0ZWRTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBPSyB8fCByZXMgPT0gQ0FNRVJBX01FVEFEQVRBX1ZBTElEQVRJT05fU0hJRlRFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2NhbWVyYV9tZXRhZGF0YV92ZW5kb3JfaWQoYnVmZmVyLCBtUHJvdmlkZXJUYWdpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtUGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3NbaWRdID0gYnVmZmVyOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBNYWxmb3JtZWQgY2FtZXJhIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gSEFMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFN0YXR1czo6SU5URVJOQUxfRVJST1I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBnZXR0aW5nIHBoeXNpY2FsIGNhbWVyYSAlcyBjaGFyYWN0ZXJpc3RpY3MgZm9yICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIGlkLmNfc3RyKCksIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGdldCBwaHlzaWNhbCBjYW1lcmEgJXMgY2hhcmFjdGVyaXN0aWNzIGZvciBkZXZpY2UgJXM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCBtSWQuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c3RhdHVzVG9TdHJpbmcoc3RhdHVzKSwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWtFbmFibGVMYXp5SGFsKSB7CisgICAgICAgIC8vIFNhdmUgSEFMIHJlZmVyZW5jZSBpbmRlZmluaXRlbHkKKyAgICAgICAgbVNhdmVkSW50ZXJmYWNlID0gaW50ZXJmYWNlOworICAgIH0KIH0KIAogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjp+RGV2aWNlSW5mbzMoKSB7fQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OnNldFRvcmNoTW9kZShib29sIGVuYWJsZWQpIHsKLSAgICByZXR1cm4gRGV2aWNlSW5mbzo6c2V0VG9yY2hNb2RlKG1JbnRlcmZhY2UsIGVuYWJsZWQpOworICAgIHJldHVybiBzZXRUb3JjaE1vZGVGb3JEZXZpY2U8SW50ZXJmYWNlVD4oZW5hYmxlZCk7CiB9CiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6Z2V0Q2FtZXJhSW5mbygKQEAgLTExMDgsMTAgKzE1NjQsMTQgQEAKICAgICByZXR1cm4gaXNCYWNrd2FyZENvbXBhdGlibGU7CiB9CiAKLXN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6ZHVtcFN0YXRlKGludCBmZCkgY29uc3Qgeworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpkdW1wU3RhdGUoaW50IGZkKSB7CiAgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLDApOwogICAgIGhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIGF1dG8gcmV0ID0gbUludGVyZmFjZS0+ZHVtcFN0YXRlKGhhbmRsZSk7CisgICAgY29uc3Qgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlID0gc3RhcnREZXZpY2VJbnRlcmZhY2U8SW50ZXJmYWNlVD4oKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBhdXRvIHJldCA9IGludGVyZmFjZS0+ZHVtcFN0YXRlKGhhbmRsZSk7CiAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGFuZGxlKTsKICAgICBpZiAoIXJldC5pc09rKCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMTEyNyw2ICsxNTg3LDYxIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmdldFBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGh5c2ljYWxDYW1lcmFJZCwgQ2FtZXJhTWV0YWRhdGEgKmNoYXJhY3RlcmlzdGljcykgY29uc3QgeworICAgIGlmIChjaGFyYWN0ZXJpc3RpY3MgPT0gbnVsbHB0cikgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBpZiAobVBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmZpbmQocGh5c2ljYWxDYW1lcmFJZCkgPT0KKyAgICAgICAgICAgIG1QaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcy5lbmQoKSkgeworICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgKmNoYXJhY3RlcmlzdGljcyA9IG1QaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcy5hdChwaHlzaWNhbENhbWVyYUlkKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uLAorICAgICAgICBib29sICpzdGF0dXMgLypvdXQqLykgeworCisgICAgY29uc3Qgc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpJbnRlcmZhY2VUPiBpbnRlcmZhY2UgPQorICAgICAgICAgICAgdGhpcy0+c3RhcnREZXZpY2VJbnRlcmZhY2U8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpJbnRlcmZhY2VUPigpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIGF1dG8gY2FzdFJlc3VsdCA9IGRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZTo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKKyAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2U+IGludGVyZmFjZV8zXzUgPSBjYXN0UmVzdWx0OworICAgIGlmIChpbnRlcmZhY2VfM181ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHN0YXR1c190IHJlczsKKyAgICBTdGF0dXMgY2FsbFN0YXR1czsKKyAgICBhdXRvIHJldCA9ICBpbnRlcmZhY2VfM181LT5pc1N0cmVhbUNvbWJpbmF0aW9uU3VwcG9ydGVkKGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICBbJmNhbGxTdGF0dXMsICZzdGF0dXNdIChTdGF0dXMgcywgYm9vbCBjb21iU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgY2FsbFN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgKnN0YXR1cyA9IGNvbWJTdGF0dXM7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAocmV0LmlzT2soKSkgeworICAgICAgICBzd2l0Y2ggKGNhbGxTdGF0dXMpIHsKKyAgICAgICAgICAgIGNhc2UgU3RhdHVzOjpPSzoKKyAgICAgICAgICAgICAgICAvLyBFeHBlY3RlZCBjYXNlLCBkbyBub3RoaW5nLgorICAgICAgICAgICAgICAgIHJlcyA9IE9LOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTdGF0dXM6Ok1FVEhPRF9OT1RfU1VQUE9SVEVEOgorICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFNlc3Npb24gY29uZmlndXJhdGlvbiBxdWVyeSBmYWlsZWQ6ICVkIiwgX19GVU5DVElPTl9fLCBjYWxsU3RhdHVzKTsKKyAgICAgICAgICAgICAgICByZXMgPSBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIGJpbmRlciBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXMgPSBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpwYXJzZVByb3ZpZGVyTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKICAgICAgICAgc3RkOjpzdHJpbmcgKnR5cGUsIHVpbnQzMl90ICppZCkgewogICAgIC8vIEZvcm1hdCBtdXN0IGJlICI8dHlwZT4vPGlkPiIKQEAgLTEzNjksNyArMTg4NCw3IEBACiAKIAogc3RhdHVzX3QgSGlkbFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNyZWF0ZURlc2NyaXB0b3JGcm9tSGlkbCgKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6VmVuZG9yVGFnU2VjdGlvbj4mIHZ0cywKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGNvbW1vbjo6VjFfMDo6VmVuZG9yVGFnU2VjdGlvbj4mIHZ0cywKICAgICAgICAgLypvdXQqLwogICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzY3JpcHRvcikgewogCkBAIC0xMzk3LDcgKzE5MTIsNyBAQAogCiAgICAgaW50IGlkeCA9IDA7CiAgICAgZm9yIChzaXplX3QgcyA9IDA7IHMgPCB2dHMuc2l6ZSgpOyBzKyspIHsKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpWZW5kb3JUYWdTZWN0aW9uJiBzZWN0aW9uID0gdnRzW3NdOworICAgICAgICBjb25zdCBjb21tb246OlYxXzA6OlZlbmRvclRhZ1NlY3Rpb24mIHNlY3Rpb24gPSB2dHNbc107CiAgICAgICAgIGNvbnN0IGNoYXIgKnNlY3Rpb25OYW1lID0gc2VjdGlvbi5zZWN0aW9uTmFtZS5jX3N0cigpOwogICAgICAgICBpZiAoc2VjdGlvbk5hbWUgPT0gTlVMTCkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBubyBzZWN0aW9uIG5hbWUgZGVmaW5lZCBmb3IgdmVuZG9yIHRhZyBzZWN0aW9uICV6dS4iLCBfX0ZVTkNUSU9OX18sIHMpOwpAQCAtMTQ1OCwxMCArMTk3MywyMCBAQAogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmdldENhbWVyYUNoYXJhY3RlcmlzdGljc0xvY2tlZChjb25zdCBzdGQ6OnN0cmluZyAmaWQsCiAgICAgICAgIENhbWVyYU1ldGFkYXRhKiBjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IHsKLSAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCwgLyptaW5WZXJzaW9uKi8gezMsMH0sIC8qbWF4VmVyc2lvbiovIHs0LDB9KTsKLSAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQsIC8qbWluVmVyc2lvbiovIHszLDB9LCAvKm1heFZlcnNpb24qLyB7NSwwfSk7CisgICAgaWYgKGRldmljZUluZm8gIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZGV2aWNlSW5mby0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNoYXJhY3RlcmlzdGljcyk7CisgICAgfQogCi0gICAgcmV0dXJuIGRldmljZUluZm8tPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjaGFyYWN0ZXJpc3RpY3MpOworICAgIC8vIEZpbmQgaGlkZGVuIHBoeXNpY2FsIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MKKyAgICBmb3IgKGF1dG8mIHByb3ZpZGVyIDogbVByb3ZpZGVycykgeworICAgICAgICBmb3IgKGF1dG8mIGRldmljZUluZm8gOiBwcm92aWRlci0+bURldmljZXMpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IGRldmljZUluZm8tPmdldFBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGlkLCBjaGFyYWN0ZXJpc3RpY3MpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBOQU1FX05PVF9GT1VORCkgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKIH0KIAogdm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmZpbHRlckxvZ2ljYWxDYW1lcmFJZHNMb2NrZWQoCkBAIC0xNDcwLDIwICsxOTk1LDE0IEBACiAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiByZW1vdmVkSWRzOwogCiAgICAgZm9yIChhdXRvJiBkZXZpY2VJZCA6IGRldmljZUlkcykgewotICAgICAgICBDYW1lcmFNZXRhZGF0YSBpbmZvOwotICAgICAgICBzdGF0dXNfdCByZXMgPSBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3NMb2NrZWQoZGV2aWNlSWQsICZpbmZvKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzIGZvciBpZCAlcyIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQuY19zdHIoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKyAgICAgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoZGV2aWNlSWQpOworICAgICAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSBjb250aW51ZTsKIAotICAgICAgICAvLyBpZENvbWJvIGNvbnRhaW5zIHRoZSBpZHMgb2YgYSBsb2dpY2FsIGNhbWVyYSBhbmQgaXRzIHBoeXNpY2FsIGNhbWVyYXMKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGlkQ29tYm87Ci0gICAgICAgIGJvb2wgbG9naWNhbENhbWVyYSA9IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6aXNMb2dpY2FsQ2FtZXJhKGluZm8sICZpZENvbWJvKTsKLSAgICAgICAgaWYgKCFsb2dpY2FsQ2FtZXJhKSB7CisgICAgICAgIGlmICghZGV2aWNlSW5mby0+bUlzTG9naWNhbENhbWVyYSkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KKyAgICAgICAgLy8gaWRDb21ibyBjb250YWlucyB0aGUgaWRzIG9mIGEgbG9naWNhbCBjYW1lcmEgYW5kIGl0cyBwaHlzaWNhbCBjYW1lcmFzCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpZENvbWJvID0gZGV2aWNlSW5mby0+bVBoeXNpY2FsSWRzOwogICAgICAgICBpZENvbWJvLnB1c2hfYmFjayhkZXZpY2VJZCk7CiAKICAgICAgICAgZm9yIChhdXRvJiBpZCA6IGRldmljZUlkcykgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oCmluZGV4IGI4YjhiOGMuLjA5NjY3NDMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkFQUk9WSURFUl9ICiAKICNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KICNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDxtdXRleD4KQEAgLTI4LDYgKzI5LDcgQEAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9jb21tb24vMS4wL3R5cGVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvcHJvdmlkZXIvMi40L0lDYW1lcmFQcm92aWRlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjQvSUNhbWVyYURldmljZVNlc3Npb24uaD4KIC8vI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL3Byb3ZpZGVyLzIuNC9JQ2FtZXJhUHJvdmlkZXJDYWxsYmFja3MuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWFuYWdlci8xLjAvSVNlcnZpY2VOb3RpZmljYXRpb24uaD4KICNpbmNsdWRlIDxjYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oPgpAQCAtMTEwLDYgKzExMiwxNCBAQAogICAgIH07CiAKICAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIHRoZSBtb2RlIGEgY2FtZXJhIGRldmljZSBpcyBjdXJyZW50bHkgaW4KKyAgICAgKi8KKyAgICBlbnVtIGNsYXNzIERldmljZU1vZGUgeworICAgICAgICBUT1JDSCwKKyAgICAgICAgQ0FNRVJBCisgICAgfTsKKworICAgIC8qKgogICAgICAqIEluaXRpYWxpemUgdGhlIG1hbmFnZXIgYW5kIGdpdmUgaXQgYSBzdGF0dXMgbGlzdGVuZXI7IG9wdGlvbmFsbHkgYWNjZXB0cyBhIHNlcnZpY2UKICAgICAgKiBpbnRlcmFjdGlvbiBwcm94eS4KICAgICAgKgpAQCAtMTY2LDYgKzE3NiwxMyBAQAogICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEqIGNoYXJhY3RlcmlzdGljcykgY29uc3Q7CiAKICAgICAvKioKKyAgICAgKiBDaGVjayBmb3IgZGV2aWNlIHN1cHBvcnQgb2Ygc3BlY2lmaWMgc3RyZWFtIGNvbWJpbmF0aW9uLgorICAgICAqLworICAgIHN0YXR1c190IGlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgYm9vbCAqc3RhdHVzIC8qb3V0Ki8pIGNvbnN0OworCisgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBoaWdoZXN0IHN1cHBvcnRlZCBkZXZpY2UgaW50ZXJmYWNlIHZlcnNpb24gZm9yIHRoaXMgSUQKICAgICAgKi8KICAgICBzdGF0dXNfdCBnZXRIaWdoZXN0U3VwcG9ydGVkVmVyc2lvbihjb25zdCBzdGQ6OnN0cmluZyAmaWQsCkBAIC0xNzQsNyArMTkxLDcgQEAKICAgICAvKioKICAgICAgKiBDaGVjayBpZiBhIGdpdmVuIGNhbWVyYSBkZXZpY2Ugc3VwcG9ydCBzZXRUb3JjaE1vZGUgQVBJLgogICAgICAqLwotICAgIGJvb2wgc3VwcG9ydFNldFRvcmNoTW9kZShjb25zdCBzdGQ6OnN0cmluZyAmaWQpOworICAgIGJvb2wgc3VwcG9ydFNldFRvcmNoTW9kZShjb25zdCBzdGQ6OnN0cmluZyAmaWQpIGNvbnN0OwogCiAgICAgLyoqCiAgICAgICogVHVybiBvbiBvciBvZmYgdGhlIGZsYXNobGlnaHQgb24gYSBnaXZlbiBjYW1lcmEgZGV2aWNlLgpAQCAtMjA1LDYgKzIyMiwxNyBAQAogICAgICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlPiAqc2Vzc2lvbik7CiAKICAgICAvKioKKyAgICAgKiBTYXZlIHRoZSBJQ2FtZXJhUHJvdmlkZXIgd2hpbGUgaXQgaXMgYmVpbmcgdXNlZCBieSBhIGNhbWVyYSBvciB0b3JjaCBjbGllbnQKKyAgICAgKi8KKyAgICB2b2lkIHNhdmVSZWYoRGV2aWNlTW9kZSB1c2FnZVR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nICZjYW1lcmFJZCwKKyAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IHByb3ZpZGVyKTsKKworICAgIC8qKgorICAgICAqIE5vdGlmeSB0aGF0IHRoZSBjYW1lcmEgb3IgdG9yY2ggaXMgbm8gbG9uZ2VyIGJlaW5nIHVzZWQgYnkgYSBjYW1lcmEgY2xpZW50CisgICAgICovCisgICAgdm9pZCByZW1vdmVSZWYoRGV2aWNlTW9kZSB1c2FnZVR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nICZjYW1lcmFJZCk7CisKKyAgICAvKioKICAgICAgKiBJU2VydmljZU5vdGlmaWNhdGlvbjo6b25SZWdpc3RyYXRpb24KICAgICAgKiBJbnZva2VkIGJ5IHRoZSBoYXJkd2FyZSBzZXJ2aWNlIG1hbmFnZXIgd2hlbiBhIG5ldyBjYW1lcmEgcHJvdmlkZXIgaXMgcmVnaXN0ZXJlZAogICAgICAqLwpAQCAtMjMxLDEyICsyNTksMTIgQEAKICAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlcnNpb24gbWF4VmVyc2lvbiA9IGhhcmR3YXJlOjpoaWRsX3ZlcnNpb257MTAwMCwwfSkgY29uc3Q7CiAKICAgICAvKgotICAgICAqIENoZWNrIGlmIGEgY2FtZXJhIHdpdGggc3RhdGljSW5mbyBpcyBhIGxvZ2ljYWwgY2FtZXJhLiBBbmQgaWYgeWVzLCByZXR1cm4KKyAgICAgKiBDaGVjayBpZiBhIGNhbWVyYSBpcyBhIGxvZ2ljYWwgY2FtZXJhLiBBbmQgaWYgeWVzLCByZXR1cm4KICAgICAgKiB0aGUgcGh5c2ljYWwgY2FtZXJhIGlkcy4KICAgICAgKi8KLSAgICBzdGF0aWMgYm9vbCBpc0xvZ2ljYWxDYW1lcmEoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHN0YXRpY0luZm8sCi0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHBoeXNpY2FsQ2FtZXJhSWRzKTsKKyAgICBib29sIGlzTG9naWNhbENhbWVyYShjb25zdCBzdGQ6OnN0cmluZyYgaWQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogcGh5c2ljYWxDYW1lcmFJZHMpOwogCisgICAgYm9vbCBpc0hpZGRlblBoeXNpY2FsQ2FtZXJhKGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFJZCk7CiBwcml2YXRlOgogICAgIC8vIEFsbCBwcml2YXRlIG1lbWJlcnMsIHVubGVzcyBvdGhlcndpc2Ugbm90ZWQsIGV4cGVjdCBtSW50ZXJmYWNlTXV0ZXggdG8gYmUgbG9ja2VkIGJlZm9yZSB1c2UKICAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbUludGVyZmFjZU11dGV4OwpAQCAtMjQ2LDIyICsyNzQsNDggQEAKICAgICB3cDxTdGF0dXNMaXN0ZW5lcj4gbUxpc3RlbmVyOwogICAgIFNlcnZpY2VJbnRlcmFjdGlvblByb3h5KiBtU2VydmljZVByb3h5OwogCisgICAgLy8gbVByb3ZpZGVyTGlmZWN5Y2xlTG9jayBpcyBsb2NrZWQgZHVyaW5nIG9uUmVnaXN0cmF0aW9uIGFuZCByZW1vdmVQcm92aWRlcgorICAgIG11dGFibGUgc3RkOjptdXRleCBtUHJvdmlkZXJMaWZlY3ljbGVMb2NrOworCiAgICAgc3RhdGljIEhhcmR3YXJlU2VydmljZUludGVyYWN0aW9uUHJveHkgc0hhcmR3YXJlU2VydmljZUludGVyYWN0aW9uUHJveHk7CiAKKyAgICAvLyBNYXBwaW5nIGZyb20gQ2FtZXJhRGV2aWNlIElEcyB0byBDYW1lcmFQcm92aWRlcnMuIFRoaXMgbWFwIGlzIHVzZWQgdG8ga2VlcCB0aGUKKyAgICAvLyBJQ2FtZXJhUHJvdmlkZXIgYWxpdmUgd2hpbGUgaXQgaXMgaW4gdXNlIGJ5IHRoZSBjYW1lcmEgd2l0aCB0aGUgZ2l2ZW4gSUQgZm9yIGNhbWVyYQorICAgIC8vIGNhcGFiaWxpdGllcworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4+CisgICAgICAgICAgICBtQ2FtZXJhUHJvdmlkZXJCeUNhbWVyYUlkOworCisgICAgLy8gTWFwcGluZyBmcm9tIENhbWVyYURldmljZSBJRHMgdG8gQ2FtZXJhUHJvdmlkZXJzLiBUaGlzIG1hcCBpcyB1c2VkIHRvIGtlZXAgdGhlCisgICAgLy8gSUNhbWVyYVByb3ZpZGVyIGFsaXZlIHdoaWxlIGl0IGlzIGluIHVzZSBieSB0aGUgY2FtZXJhIHdpdGggdGhlIGdpdmVuIElEIGZvciB0b3JjaAorICAgIC8vIGNhcGFiaWxpdGllcworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4+CisgICAgICAgICAgICBtVG9yY2hQcm92aWRlckJ5Q2FtZXJhSWQ7CisKKyAgICAvLyBMb2NrIGZvciBhY2Nlc3NpbmcgbUNhbWVyYVByb3ZpZGVyQnlDYW1lcmFJZCBhbmQgbVRvcmNoUHJvdmlkZXJCeUNhbWVyYUlkCisgICAgc3RkOjptdXRleCBtUHJvdmlkZXJJbnRlcmZhY2VNYXBMb2NrOworCiAgICAgc3RydWN0IFByb3ZpZGVySW5mbyA6CiAgICAgICAgICAgICB2aXJ0dWFsIHB1YmxpYyBoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyQ2FsbGJhY2ssCiAgICAgICAgICAgICB2aXJ0dWFsIHB1YmxpYyBoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQKICAgICB7CiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1Qcm92aWRlck5hbWU7Ci0gICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IG1JbnRlcmZhY2U7CiAgICAgICAgIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IG1Qcm92aWRlclRhZ2lkOworICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiBtVmVuZG9yVGFnRGVzY3JpcHRvcjsKKyAgICAgICAgYm9vbCBtU2V0VG9yY2hNb2RlU3VwcG9ydGVkOworICAgICAgICBib29sIG1Jc1JlbW90ZTsKKworICAgICAgICAvLyBUaGlzIHBvaW50ZXIgaXMgdXNlZCB0byBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBJQ2FtZXJhUHJvdmlkZXIgdGhhdCB3YXMgbGFzdCBhY2Nlc3NlZC4KKyAgICAgICAgd3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gbUFjdGl2ZUludGVyZmFjZTsKKworICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBtU2F2ZWRJbnRlcmZhY2U7CiAKICAgICAgICAgUHJvdmlkZXJJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nICZwcm92aWRlck5hbWUsCi0gICAgICAgICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4mIGludGVyZmFjZSwKICAgICAgICAgICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXIgKm1hbmFnZXIpOwogICAgICAgICB+UHJvdmlkZXJJbmZvKCk7CiAKLSAgICAgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZSgpOworICAgICAgICBzdGF0dXNfdCBpbml0aWFsaXplKHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+JiBpbnRlcmZhY2UpOworCisgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IHN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKTsKIAogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0VHlwZSgpIGNvbnN0OwogCkBAIC0yODMsODQgKzMzNywxNDEgQEAKICAgICAgICAgLy8gaGlkbF9kZWF0aF9yZWNpcGllbnQgaW50ZXJmYWNlIC0gdGhpcyBsb2NrcyB0aGUgcGFyZW50IG1JbnRlcmZhY2VNdXRleAogICAgICAgICB2aXJ0dWFsIHZvaWQgc2VydmljZURpZWQodWludDY0X3QgY29va2llLCBjb25zdCB3cDxoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIHdobykgb3ZlcnJpZGU7CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHVwIHZlbmRvciB0YWdzIGZvciB0aGlzIHByb3ZpZGVyCisgICAgICAgICAqLworICAgICAgICBzdGF0dXNfdCBzZXRVcFZlbmRvclRhZ3MoKTsKKwogICAgICAgICAvLyBCYXNpYyBkZXZpY2UgaW5mb3JtYXRpb24sIGNvbW1vbiB0byBhbGwgY2FtZXJhIGRldmljZXMKICAgICAgICAgc3RydWN0IERldmljZUluZm8gewogICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgbU5hbWU7ICAvLyBGdWxsIGluc3RhbmNlIG5hbWUKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1JZDsgICAgLy8gSUQgc2VjdGlvbiBvZiBmdWxsIG5hbWUKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlcnNpb24gbVZlcnNpb247CiAgICAgICAgICAgICBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCBtUHJvdmlkZXJUYWdpZDsKKyAgICAgICAgICAgIGJvb2wgbUlzTG9naWNhbENhbWVyYTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtUGh5c2ljYWxJZHM7CisgICAgICAgICAgICBoYXJkd2FyZTo6Q2FtZXJhSW5mbyBtSW5mbzsKKyAgICAgICAgICAgIHNwPElCYXNlPiBtU2F2ZWRJbnRlcmZhY2U7CiAKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhUmVzb3VyY2VDb3N0IG1SZXNvdXJjZUNvc3Q7CiAKICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzIG1TdGF0dXM7CiAKKyAgICAgICAgICAgIHNwPFByb3ZpZGVySW5mbz4gbVBhcmVudFByb3ZpZGVyOworCiAgICAgICAgICAgICBib29sIGhhc0ZsYXNoVW5pdCgpIGNvbnN0IHsgcmV0dXJuIG1IYXNGbGFzaFVuaXQ7IH0KICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlKGJvb2wgZW5hYmxlZCkgPSAwOwogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYW1lcmFJbmZvKGhhcmR3YXJlOjpDYW1lcmFJbmZvICppbmZvKSBjb25zdCA9IDA7CiAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgaXNBUEkxQ29tcGF0aWJsZSgpIGNvbnN0ID0gMDsKLSAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcFN0YXRlKGludCBmZCkgY29uc3QgPSAwOworICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wU3RhdGUoaW50IGZkKSA9IDA7CiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhDYW1lcmFNZXRhZGF0YSAqY2hhcmFjdGVyaXN0aWNzKSBjb25zdCB7CiAgICAgICAgICAgICAgICAgKHZvaWQpIGNoYXJhY3RlcmlzdGljczsKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSAqY2hhcmFjdGVyaXN0aWNzKSBjb25zdCB7CisgICAgICAgICAgICAgICAgKHZvaWQpIHBoeXNpY2FsQ2FtZXJhSWQ7CisgICAgICAgICAgICAgICAgKHZvaWQpIGNoYXJhY3RlcmlzdGljczsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uICYvKmNvbmZpZ3VyYXRpb24qLywKKyAgICAgICAgICAgICAgICAgICAgYm9vbCAqIC8qc3RhdHVzKi8pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIEludGVyZmFjZVQ+CisgICAgICAgICAgICBzcDxJbnRlcmZhY2VUPiBzdGFydERldmljZUludGVyZmFjZSgpOwogCiAgICAgICAgICAgICBEZXZpY2VJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uJiB2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0KSA6CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcHVibGljQ2FtZXJhSWRzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0LAorICAgICAgICAgICAgICAgICAgICBzcDxQcm92aWRlckluZm8+IHBhcmVudFByb3ZpZGVyKSA6CiAgICAgICAgICAgICAgICAgICAgIG1OYW1lKG5hbWUpLCBtSWQoaWQpLCBtVmVyc2lvbih2ZXJzaW9uKSwgbVByb3ZpZGVyVGFnaWQodGFnSWQpLAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VDb3N0KHJlc291cmNlQ29zdCksCisgICAgICAgICAgICAgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmEoZmFsc2UpLCBtUmVzb3VyY2VDb3N0KHJlc291cmNlQ29zdCksCiAgICAgICAgICAgICAgICAgICAgIG1TdGF0dXMoaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQpLAotICAgICAgICAgICAgICAgICAgICBtSGFzRmxhc2hVbml0KGZhbHNlKSB7fQorICAgICAgICAgICAgICAgICAgICBtUGFyZW50UHJvdmlkZXIocGFyZW50UHJvdmlkZXIpLCBtSGFzRmxhc2hVbml0KGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgbVB1YmxpY0NhbWVyYUlkcyhwdWJsaWNDYW1lcmFJZHMpIHt9CiAgICAgICAgICAgICB2aXJ0dWFsIH5EZXZpY2VJbmZvKCk7CiAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgIGJvb2wgbUhhc0ZsYXNoVW5pdDsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgbVB1YmxpY0NhbWVyYUlkczsKIAogICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlVD4KICAgICAgICAgICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoSW50ZXJmYWNlVCYgaW50ZXJmYWNlLCBib29sIGVuYWJsZWQpOworCisgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2VUPgorICAgICAgICAgICAgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlRm9yRGV2aWNlKGJvb2wgZW5hYmxlZCkgeworICAgICAgICAgICAgICAgIC8vIERvbid0IHNhdmUgdGhlIElDYW1lcmFQcm92aWRlciBpbnRlcmZhY2UgaGVyZSBiZWNhdXNlIHdlIGFzc3VtZSB0aGF0IHRoaXMgd2FzCisgICAgICAgICAgICAgICAgLy8gY2FsbGVkIGZyb20gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzZXRUb3JjaE1vZGUoKSwgd2hpY2ggZG9lcyBzYXZlIGl0LgorICAgICAgICAgICAgICAgIGNvbnN0IHNwPEludGVyZmFjZVQ+IGludGVyZmFjZSA9IHN0YXJ0RGV2aWNlSW50ZXJmYWNlPEludGVyZmFjZVQ+KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIERldmljZUluZm86OnNldFRvcmNoTW9kZShpbnRlcmZhY2UsIGVuYWJsZWQpOworICAgICAgICAgICAgfQogICAgICAgICB9OwogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RGV2aWNlSW5mbz4+IG1EZXZpY2VzOwogICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IG1VbmlxdWVDYW1lcmFJZHM7CiAgICAgICAgIGludCBtVW5pcXVlRGV2aWNlQ291bnQ7CiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtVW5pcXVlQVBJMUNvbXBhdGlibGVDYW1lcmFJZHM7CisgICAgICAgIC8vIFRoZSBpbml0aWFsIHB1YmxpYyBjYW1lcmEgSURzIHB1Ymxpc2hlZCBieSB0aGUgY2FtZXJhIHByb3ZpZGVyLgorICAgICAgICAvLyBDdXJyZW50bHkgbG9naWNhbCBtdWx0aS1jYW1lcmEgaXMgbm90IHN1cHBvcnRlZCBmb3IgaG90LXBsdWcgY2FtZXJhLgorICAgICAgICAvLyBBbmQgd2UgdXNlIHRoaXMgbGlzdCB0byBrZWVwIHRyYWNrIG9mIGluaXRpYWwgcHVibGljIGNhbWVyYSBJRHMKKyAgICAgICAgLy8gYWR2ZXJ0aXNlZCBieSB0aGUgcHJvdmlkZXIsIGFuZCB0byBkaXN0aW5ndWlzaCBhZ2FpbnN0ICJoaWRkZW4iCisgICAgICAgIC8vIHBoeXNpY2FsIGNhbWVyYSBJRHMuCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtUHJvdmlkZXJQdWJsaWNDYW1lcmFJZHM7CiAKICAgICAgICAgLy8gSEFMdjEtc3BlY2lmaWMgY2FtZXJhIGZpZWxkcywgaW5jbHVkaW5nIHRoZSBhY3R1YWwgZGV2aWNlIGludGVyZmFjZQogICAgICAgICBzdHJ1Y3QgRGV2aWNlSW5mbzEgOiBwdWJsaWMgRGV2aWNlSW5mbyB7CiAgICAgICAgICAgICB0eXBlZGVmIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZSBJbnRlcmZhY2VUOwotICAgICAgICAgICAgY29uc3Qgc3A8SW50ZXJmYWNlVD4gbUludGVyZmFjZTsKIAogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoYm9vbCBlbmFibGVkKSBvdmVycmlkZTsKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FtZXJhSW5mbyhoYXJkd2FyZTo6Q2FtZXJhSW5mbyAqaW5mbykgY29uc3Qgb3ZlcnJpZGU7CiAgICAgICAgICAgICAvL0luIGNhc2Ugb2YgRGV2aWNlMUluZm8gYXNzdW1lIHRoYXQgd2UgYXJlIGFsd2F5cyBBUEkxIGNvbXBhdGlibGUKICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBpc0FQSTFDb21wYXRpYmxlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQotICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wU3RhdGUoaW50IGZkKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcFN0YXRlKGludCBmZCkgb3ZlcnJpZGU7CiAgICAgICAgICAgICBEZXZpY2VJbmZvMShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgdWludDE2X3QgbWlub3JWZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0LAorICAgICAgICAgICAgICAgICAgICBzcDxQcm92aWRlckluZm8+IHBhcmVudFByb3ZpZGVyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHB1YmxpY0NhbWVyYUlkcywKICAgICAgICAgICAgICAgICAgICAgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlKTsKICAgICAgICAgICAgIHZpcnR1YWwgfkRldmljZUluZm8xKCk7CiAgICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzMiBtRGVmYXVsdFBhcmFtZXRlcnM7CisgICAgICAgICAgICBzdGF0dXNfdCBjYWNoZUNhbWVyYUluZm8oc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlKTsKICAgICAgICAgfTsKIAogICAgICAgICAvLyBIQUx2My1zcGVjaWZpYyBjYW1lcmEgZmllbGRzLCBpbmNsdWRpbmcgdGhlIGFjdHVhbCBkZXZpY2UgaW50ZXJmYWNlCiAgICAgICAgIHN0cnVjdCBEZXZpY2VJbmZvMyA6IHB1YmxpYyBEZXZpY2VJbmZvIHsKICAgICAgICAgICAgIHR5cGVkZWYgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlIEludGVyZmFjZVQ7Ci0gICAgICAgICAgICBjb25zdCBzcDxJbnRlcmZhY2VUPiBtSW50ZXJmYWNlOwogCiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFRvcmNoTW9kZShib29sIGVuYWJsZWQpIG92ZXJyaWRlOwogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYW1lcmFJbmZvKGhhcmR3YXJlOjpDYW1lcmFJbmZvICppbmZvKSBjb25zdCBvdmVycmlkZTsKICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBpc0FQSTFDb21wYXRpYmxlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBTdGF0ZShpbnQgZmQpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wU3RhdGUoaW50IGZkKSBvdmVycmlkZTsKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAogICAgICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSAqY2hhcmFjdGVyaXN0aWNzKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY29uc3Qgc3RkOjpzdHJpbmcmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhICpjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBpc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAorICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgIGJvb2wgKnN0YXR1cyAvKm91dCovKQorICAgICAgICAgICAgICAgICAgICBvdmVycmlkZTsKIAogICAgICAgICAgICAgRGV2aWNlSW5mbzMoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHRhZ0lkLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmaWQsIHVpbnQxNl90IG1pbm9yVmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFSZXNvdXJjZUNvc3QmIHJlc291cmNlQ29zdCwKLSAgICAgICAgICAgICAgICAgICAgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgc3A8UHJvdmlkZXJJbmZvPiBwYXJlbnRQcm92aWRlciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwdWJsaWNDYW1lcmFJZHMsIHNwPEludGVyZmFjZVQ+IGludGVyZmFjZSk7CiAgICAgICAgICAgICB2aXJ0dWFsIH5EZXZpY2VJbmZvMygpOwogICAgICAgICBwcml2YXRlOgogICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgbUNhbWVyYUNoYXJhY3RlcmlzdGljczsKKyAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgQ2FtZXJhTWV0YWRhdGE+IG1QaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljczsKKyAgICAgICAgICAgIHZvaWQgcXVlcnlQaHlzaWNhbENhbWVyYUlkcygpOworICAgICAgICAgICAgc3RhdHVzX3QgZml4dXBNb25vY2hyb21lVGFncygpOworICAgICAgICAgICAgc3RhdHVzX3QgcmVtb3ZlQXZhaWxhYmxlS2V5cyhDYW1lcmFNZXRhZGF0YSYgYywgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBrZXlzLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBrZXlUYWcpOwogICAgICAgICB9OwogCiAgICAgcHJpdmF0ZToKQEAgLTM3OCwxMSArNDg5LDExIEBACiAgICAgICAgIHRlbXBsYXRlPGNsYXNzIERldmljZUluZm9UPgogICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8RGV2aWNlSW5mbz4gaW5pdGlhbGl6ZURldmljZUluZm8oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsCiAgICAgICAgICAgICAgICAgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKLSAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5vclZlcnNpb24pIGNvbnN0OworICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbm9yVmVyc2lvbik7CiAKICAgICAgICAgLy8gSGVscGVyIGZvciBpbml0aWFsaXplRGV2aWNlSW5mbyB0byB1c2UgdGhlIHJpZ2h0IENhbWVyYVByb3ZpZGVyIGdldCBtZXRob2QuCiAgICAgICAgIHRlbXBsYXRlPGNsYXNzIEludGVyZmFjZVQ+Ci0gICAgICAgIHNwPEludGVyZmFjZVQ+IGdldERldmljZUludGVyZmFjZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgY29uc3Q7CisgICAgICAgIHNwPEludGVyZmFjZVQ+IHN0YXJ0RGV2aWNlSW50ZXJmYWNlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKTsKIAogICAgICAgICAvLyBQYXJzZSBwcm92aWRlciBpbnN0YW5jZSBuYW1lIGZvciB0eXBlIGFuZCBpZAogICAgICAgICBzdGF0aWMgc3RhdHVzX3QgcGFyc2VQcm92aWRlck5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCkBAIC00MTYsNiArNTI3LDE0IEBACiAKICAgICBzdGQ6OnZlY3RvcjxzcDxQcm92aWRlckluZm8+PiBtUHJvdmlkZXJzOwogCisgICAgdm9pZCBhZGRQcm92aWRlclRvTWFwKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmNhbWVyYUlkLAorICAgICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gcHJvdmlkZXIsCisgICAgICAgICAgICBib29sIGlzVG9yY2hVc2FnZSk7CisgICAgdm9pZCByZW1vdmVDYW1lcmFJZEZyb21NYXAoCisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4+ICZtYXAsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZjYW1lcmFJZCk7CisKICAgICBzdGF0aWMgY29uc3QgY2hhciogZGV2aWNlU3RhdHVzVG9TdHJpbmcoCiAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzJik7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIHRvcmNoU3RhdHVzVG9TdHJpbmcoCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcAppbmRleCA2MTY2NWFjLi4xMmZiZjgyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAKQEAgLTU2LDYgKzU2LDcgQEAKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5oIgogI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oIgogI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2UuaCIKKyNpbmNsdWRlICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y2FtZXJhMzsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOwpAQCAtNzgsMTEgKzc5LDEwIEBACiAgICAgICAgIG1OZXh0UmVwcm9jZXNzU2h1dHRlckZyYW1lTnVtYmVyKDApLAogICAgICAgICBtTGlzdGVuZXIoTlVMTCksCiAgICAgICAgIG1WZW5kb3JUYWdJZChDQU1FUkFfTUVUQURBVEFfSU5WQUxJRF9WRU5ET1JfSUQpLAotICAgICAgICBtTGFzdFRlbXBsYXRlSWQoLTEpCisgICAgICAgIG1MYXN0VGVtcGxhdGVJZCgtMSksCisgICAgICAgIG1OZWVkRml4dXBNb25vY2hyb21lVGFncyhmYWxzZSkKIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIGNhbWVyYTNfY2FsbGJhY2tfb3BzOjpub3RpZnkgPSAmc05vdGlmeTsKLSAgICBjYW1lcmEzX2NhbGxiYWNrX29wczo6cHJvY2Vzc19jYXB0dXJlX3Jlc3VsdCA9ICZzUHJvY2Vzc0NhcHR1cmVSZXN1bHQ7CiAgICAgQUxPR1YoIiVzOiBDcmVhdGVkIGRldmljZSBmb3IgY2FtZXJhICVzIiwgX19GVU5DVElPTl9fLCBtSWQuc3RyaW5nKCkpOwogfQogCkBAIC05MCw3ICs5MCw3IEBACiB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXM6IFRlYXJpbmcgZG93biBmb3IgY2FtZXJhIGlkICVzIiwgX19GVU5DVElPTl9fLCBtSWQuc3RyaW5nKCkpOwotICAgIGRpc2Nvbm5lY3QoKTsKKyAgICBkaXNjb25uZWN0SW1wbCgpOwogfQogCiBjb25zdCBTdHJpbmc4JiBDYW1lcmEzRGV2aWNlOjpnZXRJZCgpIGNvbnN0IHsKQEAgLTEyNyw3ICsxMjcsNyBAQAogICAgIH0KIAogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbENhbWVyYUlkczsKLSAgICBib29sIGlzTG9naWNhbCA9IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6aXNMb2dpY2FsQ2FtZXJhKG1EZXZpY2VJbmZvLCAmcGh5c2ljYWxDYW1lcmFJZHMpOworICAgIGJvb2wgaXNMb2dpY2FsID0gbWFuYWdlci0+aXNMb2dpY2FsQ2FtZXJhKG1JZC5zdHJpbmcoKSwgJnBoeXNpY2FsQ2FtZXJhSWRzKTsKICAgICBpZiAoaXNMb2dpY2FsKSB7CiAgICAgICAgIGZvciAoYXV0byYgcGh5c2ljYWxJZCA6IHBoeXNpY2FsQ2FtZXJhSWRzKSB7CiAgICAgICAgICAgICByZXMgPSBtYW5hZ2VyLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MocGh5c2ljYWxJZCwgJm1QaHlzaWNhbERldmljZUluZm9NYXBbcGh5c2ljYWxJZF0pOwpAQCAtMTgxLDcgKzE4MSwxNCBAQAogICAgICAgICAgICAgfSk7CiAgICAgfQogCi0gICAgbUludGVyZmFjZSA9IG5ldyBIYWxJbnRlcmZhY2Uoc2Vzc2lvbiwgcXVldWUpOworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBidWZNZ3JNb2RlID0KKyAgICAgICAgICAgIG1EZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9JTkZPX1NVUFBPUlRFRF9CVUZGRVJfTUFOQUdFTUVOVF9WRVJTSU9OKTsKKyAgICBpZiAoYnVmTWdyTW9kZS5jb3VudCA+IDApIHsKKyAgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyID0gKGJ1Zk1nck1vZGUuZGF0YS51OFswXSA9PQorICAgICAgICAgICAgQU5EUk9JRF9JTkZPX1NVUFBPUlRFRF9CVUZGRVJfTUFOQUdFTUVOVF9WRVJTSU9OX0hJRExfREVWSUNFXzNfNSk7CisgICAgfQorCisgICAgbUludGVyZmFjZSA9IG5ldyBIYWxJbnRlcmZhY2Uoc2Vzc2lvbiwgcXVldWUsIG1Vc2VIYWxCdWZNYW5hZ2VyKTsKICAgICBzdGQ6OnN0cmluZyBwcm92aWRlclR5cGU7CiAgICAgbVZlbmRvclRhZ0lkID0gbWFuYWdlci0+Z2V0UHJvdmlkZXJUYWdJZExvY2tlZChtSWQuc3RyaW5nKCkpOwogICAgIG1UYWdNb25pdG9yLmluaXRpYWxpemUobVZlbmRvclRhZ0lkKTsKQEAgLTE4OSw2ICsxOTYsMjggQEAKICAgICAgICAgbVRhZ01vbml0b3IucGFyc2VUYWdzVG9Nb25pdG9yKFN0cmluZzgobW9uaXRvclRhZ3MpKTsKICAgICB9CiAKKyAgICAvLyBNZXRhZGF0YSB0YWdzIG5lZWRzIGZpeHVwIGZvciBtb25vY2hyb21lIGNhbWVyYSBkZXZpY2UgdmVyc2lvbiBsZXNzCisgICAgLy8gdGhhbiAzLjUuCisgICAgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiBtYXhWZXJzaW9uezAsMH07CisgICAgcmVzID0gbWFuYWdlci0+Z2V0SGlnaGVzdFN1cHBvcnRlZFZlcnNpb24obUlkLnN0cmluZygpLCAmbWF4VmVyc2lvbik7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yIGluIGdldHRpbmcgY2FtZXJhIGRldmljZSB2ZXJzaW9uIGlkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IEhBUkRXQVJFX0RFVklDRV9BUElfVkVSU0lPTigKKyAgICAgICAgICAgIG1heFZlcnNpb24uZ2V0X21ham9yKCksIG1heFZlcnNpb24uZ2V0X21pbm9yKCkpOworCisgICAgYm9vbCBpc01vbm9jaHJvbWUgPSBmYWxzZTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBlbnRyeSA9IG1EZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnkuY291bnQ7IGkrKykgeworICAgICAgICB1aW50OF90IGNhcGFiaWxpdHkgPSBlbnRyeS5kYXRhLnU4W2ldOworICAgICAgICBpZiAoY2FwYWJpbGl0eSA9PSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19NT05PQ0hST01FKSB7CisgICAgICAgICAgICBpc01vbm9jaHJvbWUgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIG1OZWVkRml4dXBNb25vY2hyb21lVGFncyA9IChpc01vbm9jaHJvbWUgJiYgZGV2aWNlVmVyc2lvbiA8IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM181KTsKKwogICAgIHJldHVybiBpbml0aWFsaXplQ29tbW9uTG9ja2VkKCk7CiB9CiAKQEAgLTIwOCw2ICsyMzcsMTcgQEAKICAgICAvKiogUmVnaXN0ZXIgaW4tZmxpZ2h0IG1hcCB0byB0aGUgc3RhdHVzIHRyYWNrZXIgKi8KICAgICBtSW5GbGlnaHRTdGF0dXNJZCA9IG1TdGF0dXNUcmFja2VyLT5hZGRDb21wb25lbnQoKTsKIAorICAgIGlmIChtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICByZXMgPSBtUmVxdWVzdEJ1ZmZlclNNLmluaXRpYWxpemUobVN0YXR1c1RyYWNrZXIpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBTRVRfRVJSX0woIlVuYWJsZSB0byBzdGFydCByZXF1ZXN0IGJ1ZmZlciBzdGF0ZSBtYWNoaW5lOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICBtSW50ZXJmYWNlLT5jbG9zZSgpOworICAgICAgICAgICAgbVN0YXR1c1RyYWNrZXIuY2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKiogQ3JlYXRlIGJ1ZmZlciBtYW5hZ2VyICovCiAgICAgbUJ1ZmZlck1hbmFnZXIgPSBuZXcgQ2FtZXJhM0J1ZmZlck1hbmFnZXIoKTsKIApAQCAtMjE3LDggKzI1NywxMCBAQAogICAgIGlmIChzZXNzaW9uS2V5c0VudHJ5LmNvdW50ID4gMCkgewogICAgICAgICBzZXNzaW9uUGFyYW1LZXlzLmluc2VydEFycmF5QXQoc2Vzc2lvbktleXNFbnRyeS5kYXRhLmkzMiwgMCwgc2Vzc2lvbktleXNFbnRyeS5jb3VudCk7CiAgICAgfQorCiAgICAgLyoqIFN0YXJ0IHVwIHJlcXVlc3QgcXVldWUgdGhyZWFkICovCi0gICAgbVJlcXVlc3RUaHJlYWQgPSBuZXcgUmVxdWVzdFRocmVhZCh0aGlzLCBtU3RhdHVzVHJhY2tlciwgbUludGVyZmFjZSwgc2Vzc2lvblBhcmFtS2V5cyk7CisgICAgbVJlcXVlc3RUaHJlYWQgPSBuZXcgUmVxdWVzdFRocmVhZCgKKyAgICAgICAgICAgIHRoaXMsIG1TdGF0dXNUcmFja2VyLCBtSW50ZXJmYWNlLCBzZXNzaW9uUGFyYW1LZXlzLCBtVXNlSGFsQnVmTWFuYWdlcik7CiAgICAgcmVzID0gbVJlcXVlc3RUaHJlYWQtPnJ1bihTdHJpbmc4Ojpmb3JtYXQoIkMzRGV2LSVzLVJlcVF1ZXVlIiwgbUlkLnN0cmluZygpKS5zdHJpbmcoKSk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBTRVRfRVJSX0woIlVuYWJsZSB0byBzdGFydCByZXF1ZXN0IHF1ZXVlIHRocmVhZDogJXMgKCVkKSIsCkBAIC0yNzAsMTEgKzMxMiwxNCBAQAogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgIH0KLQogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6ZGlzY29ubmVjdCgpIHsKKyAgICByZXR1cm4gZGlzY29ubmVjdEltcGwoKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6ZGlzY29ubmVjdEltcGwoKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogCkBAIC0zNDEsNiArMzg2LDcgQEAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKICAgICAgICAgbVJlcXVlc3RUaHJlYWQuY2xlYXIoKTsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIHN0TG9jayhtVHJhY2tlckxvY2spOwogICAgICAgICBtU3RhdHVzVHJhY2tlci5jbGVhcigpOwogICAgICAgICBpbnRlcmZhY2UgPSBtSW50ZXJmYWNlLmdldCgpOwogICAgIH0KQEAgLTkxMyw2ICs5NTksMjIxIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAoraGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmEzRGV2aWNlOjpyZXF1ZXN0U3RyZWFtQnVmZmVycygKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6QnVmZmVyUmVxdWVzdD4mIGJ1ZlJlcXMsCisgICAgICAgIHJlcXVlc3RTdHJlYW1CdWZmZXJzX2NiIF9oaWRsX2NiKSB7CisgICAgdXNpbmcgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpCdWZmZXJSZXF1ZXN0U3RhdHVzOworICAgIHVzaW5nIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6U3RyZWFtQnVmZmVyUmV0OworICAgIHVzaW5nIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6U3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOworCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlcXVlc3RCdWZmZXJJbnRlcmZhY2VMb2NrKTsKKworICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxTdHJlYW1CdWZmZXJSZXQ+IGJ1ZlJldHM7CisgICAgaWYgKCFtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlcyBkb2VzIG5vdCBzdXBwb3J0IEhBTCBidWZmZXIgbWFuYWdlbWVudCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQuc3RyaW5nKCkpOworICAgICAgICBfaGlkbF9jYihCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfSUxMRUdBTF9BUkdVTUVOVFMsIGJ1ZlJldHMpOworICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICB9CisKKyAgICBTb3J0ZWRWZWN0b3I8aW50MzJfdD4gc3RyZWFtSWRzOworICAgIHNzaXplX3Qgc3ogPSBzdHJlYW1JZHMuc2V0Q2FwYWNpdHkoYnVmUmVxcy5zaXplKCkpOworICAgIGlmIChzeiA8IDAgfHwgc3RhdGljX2Nhc3Q8c2l6ZV90PihzeikgIT0gYnVmUmVxcy5zaXplKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciAlenUgYnVmZmVyIHJlcXVlc3RzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZlJlcXMuc2l6ZSgpKTsKKyAgICAgICAgX2hpZGxfY2IoQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX0lMTEVHQUxfQVJHVU1FTlRTLCBidWZSZXRzKTsKKyAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgfQorCisgICAgaWYgKGJ1ZlJlcXMuc2l6ZSgpID4gbU91dHB1dFN0cmVhbXMuc2l6ZSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogdG9vIG1hbnkgYnVmZmVyIHJlcXVlc3RzICglenUgPiAjIG9mIG91dHB1dCBzdHJlYW1zICV6dSkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmUmVxcy5zaXplKCksIG1PdXRwdXRTdHJlYW1zLnNpemUoKSk7CisgICAgICAgIF9oaWRsX2NiKEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9JTExFR0FMX0FSR1VNRU5UUywgYnVmUmV0cyk7CisgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgIH0KKworICAgIC8vIENoZWNrIGZvciByZXBlYXRlZCBzdHJlYW1JZAorICAgIGZvciAoY29uc3QgYXV0byYgYnVmUmVxIDogYnVmUmVxcykgeworICAgICAgICBpZiAoc3RyZWFtSWRzLmluZGV4T2YoYnVmUmVxLnN0cmVhbUlkKSAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQgYXBwZWFyIG11bHRpcGxlIHRpbWVzIGluIGJ1ZmZlciByZXF1ZXN0cyIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmUmVxLnN0cmVhbUlkKTsKKyAgICAgICAgICAgIF9oaWRsX2NiKEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9JTExFR0FMX0FSR1VNRU5UUywgYnVmUmV0cyk7CisgICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICAgICAgfQorICAgICAgICBzdHJlYW1JZHMuYWRkKGJ1ZlJlcS5zdHJlYW1JZCk7CisgICAgfQorCisgICAgaWYgKCFtUmVxdWVzdEJ1ZmZlclNNLnN0YXJ0UmVxdWVzdEJ1ZmZlcigpKSB7CisgICAgICAgIEFMT0dFKCIlczogcmVxdWVzdCBidWZmZXIgZGlzYWxsb3dlZCB3aGlsZSBjYW1lcmEgc2VydmljZSBpcyBjb25maWd1cmluZyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgX2hpZGxfY2IoQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX0NPTkZJR1VSSU5HLCBidWZSZXRzKTsKKyAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgfQorCisgICAgYnVmUmV0cy5yZXNpemUoYnVmUmVxcy5zaXplKCkpOworCisgICAgYm9vbCBhbGxSZXFzU3VjY2VlZHMgPSB0cnVlOworICAgIGJvb2wgb25lUmVxU3VjY2VlZHMgPSBmYWxzZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJ1ZlJlcXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgYXV0byYgYnVmUmVxID0gYnVmUmVxc1tpXTsKKyAgICAgICAgYXV0byYgYnVmUmV0ID0gYnVmUmV0c1tpXTsKKyAgICAgICAgaW50MzJfdCBzdHJlYW1JZCA9IGJ1ZlJlcS5zdHJlYW1JZDsKKyAgICAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gb3V0cHV0U3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KHN0cmVhbUlkKTsKKyAgICAgICAgaWYgKG91dHB1dFN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IE91dHB1dCBzdHJlYW0gaWQgJWQgbm90IGZvdW5kISIsIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOworICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVjPFN0cmVhbUJ1ZmZlclJldD4gZW1wdHlCdWZSZXRzOworICAgICAgICAgICAgX2hpZGxfY2IoQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX0lMTEVHQUxfQVJHVU1FTlRTLCBlbXB0eUJ1ZlJldHMpOworICAgICAgICAgICAgbVJlcXVlc3RCdWZmZXJTTS5lbmRSZXF1ZXN0QnVmZmVyKCk7CisgICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGJ1ZlJldC5zdHJlYW1JZCA9IHN0cmVhbUlkOworICAgICAgICB1aW50MzJfdCBudW1CdWZmZXJzUmVxdWVzdGVkID0gYnVmUmVxLm51bUJ1ZmZlcnNSZXF1ZXN0ZWQ7CisgICAgICAgIHNpemVfdCB0b3RhbEhhbmRvdXQgPSBvdXRwdXRTdHJlYW0tPmdldE91dHN0YW5kaW5nQnVmZmVyc0NvdW50KCkgKyBudW1CdWZmZXJzUmVxdWVzdGVkOworICAgICAgICBpZiAodG90YWxIYW5kb3V0ID4gb3V0cHV0U3RyZWFtLT5hc0hhbFN0cmVhbSgpLT5tYXhfYnVmZmVycykgeworICAgICAgICAgICAgLy8gTm90IGFibGUgdG8gYWxsb2NhdGUgZW5vdWdoIGJ1ZmZlci4gRXhpdCBlYXJseSBmb3IgdGhpcyBzdHJlYW0KKyAgICAgICAgICAgIGJ1ZlJldC52YWwuZXJyb3IoU3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOjpNQVhfQlVGRkVSX0VYQ0VFREVEKTsKKyAgICAgICAgICAgIGFsbFJlcXNTdWNjZWVkcyA9IGZhbHNlOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZWM8U3RyZWFtQnVmZmVyPiB0bXBSZXRCdWZmZXJzKG51bUJ1ZmZlcnNSZXF1ZXN0ZWQpOworICAgICAgICBib29sIGN1cnJlbnRSZXFTdWNjZWVkcyA9IHRydWU7CisgICAgICAgIHN0ZDo6dmVjdG9yPGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90PiBzdHJlYW1CdWZmZXJzKG51bUJ1ZmZlcnNSZXF1ZXN0ZWQpOworICAgICAgICBzaXplX3QgbnVtQWxsb2NhdGVkQnVmZmVycyA9IDA7CisgICAgICAgIHNpemVfdCBudW1QdXNoZWRJbmZsaWdodEJ1ZmZlcnMgPSAwOworICAgICAgICBmb3IgKHNpemVfdCBiID0gMDsgYiA8IG51bUJ1ZmZlcnNSZXF1ZXN0ZWQ7IGIrKykgeworICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QmIHNiID0gc3RyZWFtQnVmZmVyc1tiXTsKKyAgICAgICAgICAgIC8vIFNpbmNlIHRoaXMgbWV0aG9kIGNhbiBydW4gY29uY3VycmVudGx5IHdpdGggcmVxdWVzdCB0aHJlYWQKKyAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gdXBkYXRlIHRoZSB3YWl0IGR1cmF0aW9uIGV2ZXJ5dGltZSB3ZSBjYWxsIGdldGJ1ZmZlcgorICAgICAgICAgICAgbnNlY3NfdCB3YWl0RHVyYXRpb24gPSBrQmFzZUdldEJ1ZmZlcldhaXQgKyBnZXRFeHBlY3RlZEluRmxpZ2h0RHVyYXRpb24oKTsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IG91dHB1dFN0cmVhbS0+Z2V0QnVmZmVyKCZzYiwgd2FpdER1cmF0aW9uKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbid0IGdldCBvdXRwdXQgYnVmZmVyIGZvciBzdHJlYW0gJWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBOT19JTklUIHx8IHJlcyA9PSBERUFEX09CSkVDVCkgeworICAgICAgICAgICAgICAgICAgICBidWZSZXQudmFsLmVycm9yKFN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjo6U1RSRUFNX0RJU0NPTk5FQ1RFRCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMgPT0gVElNRURfT1VUIHx8IHJlcyA9PSBOT19NRU1PUlkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmUmV0LnZhbC5lcnJvcihTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I6Ok5PX0JVRkZFUl9BVkFJTEFCTEUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZlJldC52YWwuZXJyb3IoU3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOjpVTktOT1dOX0VSUk9SKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3VycmVudFJlcVN1Y2NlZWRzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBudW1BbGxvY2F0ZWRCdWZmZXJzKys7CisKKyAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyID0gc2IuYnVmZmVyOworICAgICAgICAgICAgYXV0byBwYWlyID0gbUludGVyZmFjZS0+Z2V0QnVmZmVySWQoKmJ1ZmZlciwgc3RyZWFtSWQpOworICAgICAgICAgICAgYm9vbCBpc05ld0J1ZmZlciA9IHBhaXIuZmlyc3Q7CisgICAgICAgICAgICB1aW50NjRfdCBidWZmZXJJZCA9IHBhaXIuc2Vjb25kOworICAgICAgICAgICAgU3RyZWFtQnVmZmVyJiBoQnVmID0gdG1wUmV0QnVmZmVyc1tiXTsKKworICAgICAgICAgICAgaEJ1Zi5zdHJlYW1JZCA9IHN0cmVhbUlkOworICAgICAgICAgICAgaEJ1Zi5idWZmZXJJZCA9IGJ1ZmZlcklkOworICAgICAgICAgICAgaEJ1Zi5idWZmZXIgPSAoaXNOZXdCdWZmZXIpID8gKmJ1ZmZlciA6IG51bGxwdHI7CisgICAgICAgICAgICBoQnVmLnN0YXR1cyA9IEJ1ZmZlclN0YXR1czo6T0s7CisgICAgICAgICAgICBoQnVmLnJlbGVhc2VGZW5jZSA9IG51bGxwdHI7CisKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqYWNxdWlyZUZlbmNlID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGlmIChzYi5hY3F1aXJlX2ZlbmNlICE9IC0xKSB7CisgICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwwKTsKKyAgICAgICAgICAgICAgICBhY3F1aXJlRmVuY2UtPmRhdGFbMF0gPSBzYi5hY3F1aXJlX2ZlbmNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaEJ1Zi5hY3F1aXJlRmVuY2Uuc2V0VG8oYWNxdWlyZUZlbmNlLCAvKnNob3VsZE93biovdHJ1ZSk7CisgICAgICAgICAgICBoQnVmLnJlbGVhc2VGZW5jZSA9IG51bGxwdHI7CisKKyAgICAgICAgICAgIHJlcyA9IG1JbnRlcmZhY2UtPnB1c2hJbmZsaWdodFJlcXVlc3RCdWZmZXIoYnVmZmVySWQsIGJ1ZmZlcik7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW4ndCBnZXQgcmVnaXN0ZXIgcmVxdWVzdCBidWZmZXJzIGZvciBzdHJlYW0gJWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgYnVmUmV0LnZhbC5lcnJvcihTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I6OlVOS05PV05fRVJST1IpOworICAgICAgICAgICAgICAgIGN1cnJlbnRSZXFTdWNjZWVkcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbnVtUHVzaGVkSW5mbGlnaHRCdWZmZXJzKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN1cnJlbnRSZXFTdWNjZWVkcykgeworICAgICAgICAgICAgYnVmUmV0LnZhbC5idWZmZXJzKHN0ZDo6bW92ZSh0bXBSZXRCdWZmZXJzKSk7CisgICAgICAgICAgICBvbmVSZXFTdWNjZWVkcyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhbGxSZXFzU3VjY2VlZHMgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGIgPSAwOyBiIDwgbnVtUHVzaGVkSW5mbGlnaHRCdWZmZXJzOyBiKyspIHsKKyAgICAgICAgICAgICAgICBTdHJlYW1CdWZmZXImIGhCdWYgPSB0bXBSZXRCdWZmZXJzW2JdOworICAgICAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCogYnVmZmVyOworICAgICAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IG1JbnRlcmZhY2UtPnBvcEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcihoQnVmLmJ1ZmZlcklkLCAmYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIFNFVF9FUlIoIiVzOiBwb3BJbmZsaWdodFJlcXVlc3RCdWZmZXIgZmFpbGVkIGZvciBzdHJlYW0gJWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGIgPSAwOyBiIDwgbnVtQWxsb2NhdGVkQnVmZmVyczsgYisrKSB7CisgICAgICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QmIHNiID0gc3RyZWFtQnVmZmVyc1tiXTsKKyAgICAgICAgICAgICAgICBzYi5hY3F1aXJlX2ZlbmNlID0gLTE7CisgICAgICAgICAgICAgICAgc2Iuc3RhdHVzID0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuT3V0cHV0QnVmZmVycyhzdHJlYW1CdWZmZXJzLmRhdGEoKSwgbnVtQWxsb2NhdGVkQnVmZmVycywgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfaGlkbF9jYihhbGxSZXFzU3VjY2VlZHMgPyBCdWZmZXJSZXF1ZXN0U3RhdHVzOjpPSyA6CisgICAgICAgICAgICBvbmVSZXFTdWNjZWVkcyA/IEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9QQVJUSUFMIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX1VOS05PV04sCisgICAgICAgICAgICBidWZSZXRzKTsKKyAgICBtUmVxdWVzdEJ1ZmZlclNNLmVuZFJlcXVlc3RCdWZmZXIoKTsKKyAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKK30KKworaGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmEzRGV2aWNlOjpyZXR1cm5TdHJlYW1CdWZmZXJzKAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKSB7CisgICAgaWYgKCFtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlcyBkb2VzIG5vdCBzdXBwb3J0IEhBTCBidWZmZXIgbWFuYWdlcm1lbnQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgfQorCisgICAgZm9yIChjb25zdCBhdXRvJiBidWYgOiBidWZmZXJzKSB7CisgICAgICAgIGlmIChidWYuYnVmZmVySWQgPT0gSGFsSW50ZXJmYWNlOjpCVUZGRVJfSURfTk9fQlVGRkVSKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCByZXR1cm4gYSBidWZmZXIgd2l0aG91dCBidWZmZXJJZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCogYnVmZmVyOworICAgICAgICBzdGF0dXNfdCByZXMgPSBtSW50ZXJmYWNlLT5wb3BJbmZsaWdodFJlcXVlc3RCdWZmZXIoYnVmLmJ1ZmZlcklkLCAmYnVmZmVyKTsKKworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCBmaW5kIGluLWZsaWdodCBidWZmZXIgJSIgUFJJdTY0ICIgZm9yIHN0cmVhbSAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmLmJ1ZmZlcklkLCBidWYuc3RyZWFtSWQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCBzdHJlYW1CdWZmZXI7CisgICAgICAgIHN0cmVhbUJ1ZmZlci5idWZmZXIgPSBidWZmZXI7CisgICAgICAgIHN0cmVhbUJ1ZmZlci5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1I7CisgICAgICAgIHN0cmVhbUJ1ZmZlci5hY3F1aXJlX2ZlbmNlID0gLTE7CisgICAgICAgIHN0cmVhbUJ1ZmZlci5yZWxlYXNlX2ZlbmNlID0gLTE7CisKKyAgICAgICAgaWYgKGJ1Zi5yZWxlYXNlRmVuY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgc3RyZWFtQnVmZmVyLnJlbGVhc2VfZmVuY2UgPSAtMTsKKyAgICAgICAgfSBlbHNlIGlmIChidWYucmVsZWFzZUZlbmNlLT5udW1GZHMgPT0gMSkgeworICAgICAgICAgICAgc3RyZWFtQnVmZmVyLnJlbGVhc2VfZmVuY2UgPSBkdXAoYnVmLnJlbGVhc2VGZW5jZS0+ZGF0YVswXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgcmVsZWFzZSBmZW5jZSwgZmQgY291bnQgaXMgJWQsIG5vdCAxIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidWYucmVsZWFzZUZlbmNlLT5udW1GZHMpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoYnVmLnN0cmVhbUlkKTsKKyAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IE91dHB1dCBzdHJlYW0gaWQgJWQgbm90IGZvdW5kISIsIF9fRlVOQ1RJT05fXywgYnVmLnN0cmVhbUlkKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0cmVhbUJ1ZmZlci5zdHJlYW0gPSBzdHJlYW0tPmFzSGFsU3RyZWFtKCk7CisgICAgICAgIHJldHVybk91dHB1dEJ1ZmZlcnMoJnN0cmVhbUJ1ZmZlciwgLypzaXplKi8xLCAvKnRpbWVzdGFtcCovIDApOworICAgIH0KKyAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKK30KKwogaGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmEzRGV2aWNlOjpwcm9jZXNzQ2FwdHVyZVJlc3VsdF8zXzQoCiAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OkNhcHR1cmVSZXN1bHQ+JiByZXN1bHRzKSB7CkBAIC0xMDYxLDI3ICsxMzIyLDUxIEBACiAgICAgICAgIGF1dG8mIGJEc3QgPSBvdXRwdXRCdWZmZXJzW2ldOwogICAgICAgICBjb25zdCBTdHJlYW1CdWZmZXIgJmJTcmMgPSByZXN1bHQub3V0cHV0QnVmZmVyc1tpXTsKIAotICAgICAgICBzc2l6ZV90IGlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoYlNyYy5zdHJlYW1JZCk7Ci0gICAgICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KGJTcmMuc3RyZWFtSWQpOworICAgICAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEJ1ZmZlciAlenU6IEludmFsaWQgb3V0cHV0IHN0cmVhbSBpZCAlZCIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0LmZyYW1lTnVtYmVyLCBpLCBiU3JjLnN0cmVhbUlkKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBiRHN0LnN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLnZhbHVlQXQoaWR4KS0+YXNIYWxTdHJlYW0oKTsKKyAgICAgICAgYkRzdC5zdHJlYW0gPSBzdHJlYW0tPmFzSGFsU3RyZWFtKCk7CiAKLSAgICAgICAgYnVmZmVyX2hhbmRsZV90ICpidWZmZXI7Ci0gICAgICAgIHJlcyA9IG1JbnRlcmZhY2UtPnBvcEluZmxpZ2h0QnVmZmVyKHJlc3VsdC5mcmFtZU51bWJlciwgYlNyYy5zdHJlYW1JZCwgJmJ1ZmZlcik7CisgICAgICAgIGJvb2wgbm9CdWZmZXJSZXR1cm5lZCA9IGZhbHNlOworICAgICAgICBidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIGlmIChtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICAgICAgLy8gVGhpcyBpcyBzdXNwaWNpb3VzIG1vc3Qgb2YgdGhlIHRpbWUgYnV0IGNhbiBiZSBjb3JyZWN0IGR1cmluZyBmbHVzaCB3aGVyZSBIQUwKKyAgICAgICAgICAgIC8vIGhhcyB0byByZXR1cm4gY2FwdHVyZSByZXN1bHQgYmVmb3JlIGEgYnVmZmVyIGlzIHJlcXVlc3RlZAorICAgICAgICAgICAgaWYgKGJTcmMuYnVmZmVySWQgPT0gSGFsSW50ZXJmYWNlOjpCVUZGRVJfSURfTk9fQlVGRkVSKSB7CisgICAgICAgICAgICAgICAgaWYgKGJTcmMuc3RhdHVzID09IEJ1ZmZlclN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogQnVmZmVyICV6dTogTm8gYnVmZmVySWQgZm9yIHN0cmVhbSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXN1bHQuZnJhbWVOdW1iZXIsIGksIGJTcmMuc3RyZWFtSWQpOworICAgICAgICAgICAgICAgICAgICAvLyBTdGlsbCBwcm9jZWVkcyBzbyBvdGhlciBidWZmZXJzIGNhbiBiZSByZXR1cm5lZAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBub0J1ZmZlclJldHVybmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChub0J1ZmZlclJldHVybmVkKSB7CisgICAgICAgICAgICAgICAgcmVzID0gT0s7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcyA9IG1JbnRlcmZhY2UtPnBvcEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcihiU3JjLmJ1ZmZlcklkLCAmYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IG1JbnRlcmZhY2UtPnBvcEluZmxpZ2h0QnVmZmVyKHJlc3VsdC5mcmFtZU51bWJlciwgYlNyYy5zdHJlYW1JZCwgJmJ1ZmZlcik7CisgICAgICAgIH0KKwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBCdWZmZXIgJXp1OiBObyBpbi1mbGlnaHQgYnVmZmVyIGZvciBzdHJlYW0gJWQiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdC5mcmFtZU51bWJlciwgaSwgYlNyYy5zdHJlYW1JZCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKwogICAgICAgICBiRHN0LmJ1ZmZlciA9IGJ1ZmZlcjsKICAgICAgICAgYkRzdC5zdGF0dXMgPSBtYXBIaWRsQnVmZmVyU3RhdHVzKGJTcmMuc3RhdHVzKTsKICAgICAgICAgYkRzdC5hY3F1aXJlX2ZlbmNlID0gLTE7CiAgICAgICAgIGlmIChiU3JjLnJlbGVhc2VGZW5jZSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICBiRHN0LnJlbGVhc2VfZmVuY2UgPSAtMTsKICAgICAgICAgfSBlbHNlIGlmIChiU3JjLnJlbGVhc2VGZW5jZS0+bnVtRmRzID09IDEpIHsKKyAgICAgICAgICAgIGlmIChub0J1ZmZlclJldHVybmVkKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBnb3QgcmVsZWFzZUZlbmNlIHdpdGhvdXQgb3V0cHV0IGJ1ZmZlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYkRzdC5yZWxlYXNlX2ZlbmNlID0gZHVwKGJTcmMucmVsZWFzZUZlbmNlLT5kYXRhWzBdKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEludmFsaWQgcmVsZWFzZSBmZW5jZSBmb3IgYnVmZmVyICV6dSwgZmQgY291bnQgaXMgJWQsIG5vdCAxIiwKQEAgLTExNTcsMTMgKzE0NDIsMTMgQEAKICAgICAgICAgICAgIG0udHlwZSA9IENBTUVSQTNfTVNHX0VSUk9SOwogICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmZyYW1lX251bWJlciA9IG1zZy5tc2cuZXJyb3IuZnJhbWVOdW1iZXI7CiAgICAgICAgICAgICBpZiAobXNnLm1zZy5lcnJvci5lcnJvclN0cmVhbUlkID49IDApIHsKLSAgICAgICAgICAgICAgICBzc2l6ZV90IGlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkobXNnLm1zZy5lcnJvci5lcnJvclN0cmVhbUlkKTsKLSAgICAgICAgICAgICAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEludmFsaWQgZXJyb3Igc3RyZWFtIGlkICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG0ubWVzc2FnZS5lcnJvci5mcmFtZV9udW1iZXIsIG1zZy5tc2cuZXJyb3IuZXJyb3JTdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KG1zZy5tc2cuZXJyb3IuZXJyb3JTdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEludmFsaWQgZXJyb3Igc3RyZWFtIGlkICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5mcmFtZV9udW1iZXIsIG1zZy5tc2cuZXJyb3IuZXJyb3JTdHJlYW1JZCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmVycm9yX3N0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLnZhbHVlQXQoaWR4KS0+YXNIYWxTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZXJyb3Jfc3RyZWFtID0gc3RyZWFtLT5hc0hhbFN0cmVhbSgpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZXJyb3Jfc3RyZWFtID0gbnVsbHB0cjsKICAgICAgICAgICAgIH0KQEAgLTEzNDQsNiArMTYyOSw1NiBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6U3RyZWFtU2V0OjphZGQoCisgICAgICAgIGludCBzdHJlYW1JZCwgc3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gc3RyZWFtKSB7CisgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogY2Fubm90IGFkZCBudWxsIHN0cmVhbSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbURhdGEuYWRkKHN0cmVhbUlkLCBzdHJlYW0pOworfQorCitzc2l6ZV90IENhbWVyYTNEZXZpY2U6OlN0cmVhbVNldDo6cmVtb3ZlKGludCBzdHJlYW1JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbURhdGEucmVtb3ZlSXRlbShzdHJlYW1JZCk7Cit9CisKK3NwPGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+CitDYW1lcmEzRGV2aWNlOjpTdHJlYW1TZXQ6OmdldChpbnQgc3RyZWFtSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgc3NpemVfdCBpZHggPSBtRGF0YS5pbmRleE9mS2V5KHN0cmVhbUlkKTsKKyAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gbURhdGEuZWRpdFZhbHVlQXQoaWR4KTsKK30KKworc3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4KK0NhbWVyYTNEZXZpY2U6OlN0cmVhbVNldDo6b3BlcmF0b3JbXSAoc2l6ZV90IGluZGV4KSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIHJldHVybiBtRGF0YS5lZGl0VmFsdWVBdChpbmRleCk7Cit9CisKK3NpemVfdCBDYW1lcmEzRGV2aWNlOjpTdHJlYW1TZXQ6OnNpemUoKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIHJldHVybiBtRGF0YS5zaXplKCk7Cit9CisKK3ZvaWQgQ2FtZXJhM0RldmljZTo6U3RyZWFtU2V0OjpjbGVhcigpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1EYXRhLmNsZWFyKCk7Cit9CisKK3N0ZDo6dmVjdG9yPGludD4gQ2FtZXJhM0RldmljZTo6U3RyZWFtU2V0OjpnZXRTdHJlYW1JZHMoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIHN0ZDo6dmVjdG9yPGludD4gc3RyZWFtSWRzKG1EYXRhLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRGF0YS5zaXplKCk7IGkrKykgeworICAgICAgICBzdHJlYW1JZHNbaV0gPSBtRGF0YS5rZXlBdChpKTsKKyAgICB9CisgICAgcmV0dXJuIHN0cmVhbUlkczsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y3JlYXRlU3RyZWFtKHNwPFN1cmZhY2U+IGNvbnN1bWVyLAogICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKICAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwKQEAgLTE0NTAsNyArMTc4NSw4IEBACiAgICAgfSBlbHNlIGlmIChpc1NoYXJlZCkgewogICAgICAgICBuZXdTdHJlYW0gPSBuZXcgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbShtTmV4dFN0cmVhbUlkLCBjb25zdW1lcnMsCiAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBjb25zdW1lclVzYWdlLCBkYXRhU3BhY2UsIHJvdGF0aW9uLAotICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBPZmZzZXQsIHBoeXNpY2FsQ2FtZXJhSWQsIHN0cmVhbVNldElkKTsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wT2Zmc2V0LCBwaHlzaWNhbENhbWVyYUlkLCBzdHJlYW1TZXRJZCwKKyAgICAgICAgICAgICAgICBtVXNlSGFsQnVmTWFuYWdlcik7CiAgICAgfSBlbHNlIGlmIChjb25zdW1lcnMuc2l6ZSgpID09IDAgJiYgaGFzRGVmZXJyZWRDb25zdW1lcikgewogICAgICAgICBuZXdTdHJlYW0gPSBuZXcgQ2FtZXJhM091dHB1dFN0cmVhbShtTmV4dFN0cmVhbUlkLAogICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgY29uc3VtZXJVc2FnZSwgZGF0YVNwYWNlLCByb3RhdGlvbiwKQEAgLTE1MjcsMjAgKzE4NjMsMjAgQEAKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBzc2l6ZV90IGlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoaWQpOwotICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoaWQpOworICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGlzIHVua25vd24iLCBpZCk7Ci0gICAgICAgIHJldHVybiBpZHg7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgc3RyZWFtSW5mby0+d2lkdGggID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0V2lkdGgoKTsKLSAgICBzdHJlYW1JbmZvLT5oZWlnaHQgPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5nZXRIZWlnaHQoKTsKLSAgICBzdHJlYW1JbmZvLT5mb3JtYXQgPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5nZXRGb3JtYXQoKTsKLSAgICBzdHJlYW1JbmZvLT5kYXRhU3BhY2UgPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5nZXREYXRhU3BhY2UoKTsKLSAgICBzdHJlYW1JbmZvLT5mb3JtYXRPdmVycmlkZGVuID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+aXNGb3JtYXRPdmVycmlkZGVuKCk7Ci0gICAgc3RyZWFtSW5mby0+b3JpZ2luYWxGb3JtYXQgPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5nZXRPcmlnaW5hbEZvcm1hdCgpOwotICAgIHN0cmVhbUluZm8tPmRhdGFTcGFjZU92ZXJyaWRkZW4gPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5pc0RhdGFTcGFjZU92ZXJyaWRkZW4oKTsKLSAgICBzdHJlYW1JbmZvLT5vcmlnaW5hbERhdGFTcGFjZSA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmdldE9yaWdpbmFsRGF0YVNwYWNlKCk7CisgICAgc3RyZWFtSW5mby0+d2lkdGggID0gc3RyZWFtLT5nZXRXaWR0aCgpOworICAgIHN0cmVhbUluZm8tPmhlaWdodCA9IHN0cmVhbS0+Z2V0SGVpZ2h0KCk7CisgICAgc3RyZWFtSW5mby0+Zm9ybWF0ID0gc3RyZWFtLT5nZXRGb3JtYXQoKTsKKyAgICBzdHJlYW1JbmZvLT5kYXRhU3BhY2UgPSBzdHJlYW0tPmdldERhdGFTcGFjZSgpOworICAgIHN0cmVhbUluZm8tPmZvcm1hdE92ZXJyaWRkZW4gPSBzdHJlYW0tPmlzRm9ybWF0T3ZlcnJpZGRlbigpOworICAgIHN0cmVhbUluZm8tPm9yaWdpbmFsRm9ybWF0ID0gc3RyZWFtLT5nZXRPcmlnaW5hbEZvcm1hdCgpOworICAgIHN0cmVhbUluZm8tPmRhdGFTcGFjZU92ZXJyaWRkZW4gPSBzdHJlYW0tPmlzRGF0YVNwYWNlT3ZlcnJpZGRlbigpOworICAgIHN0cmVhbUluZm8tPm9yaWdpbmFsRGF0YVNwYWNlID0gc3RyZWFtLT5nZXRPcmlnaW5hbERhdGFTcGFjZSgpOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMTU2NywxNCArMTkwMywxMiBAQAogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIHNzaXplX3QgaWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShpZCk7Ci0gICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgewotICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGRvZXMgbm90IGV4aXN0IiwKLSAgICAgICAgICAgICAgICBpZCk7CisgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KGlkKTsKKyAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKKyAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBkb2VzIG5vdCBleGlzdCIsIGlkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0KLSAgICByZXR1cm4gbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQoaWR4KS0+c2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7CisgICAgcmV0dXJuIHN0cmVhbS0+c2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7CiB9CiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OmRlbGV0ZVN0cmVhbShpbnQgaWQpIHsKQEAgLTE1OTksMjEgKzE5MzMsMjEgQEAKICAgICB9CiAKICAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBkZWxldGVkU3RyZWFtOwotICAgIHNzaXplX3Qgb3V0cHV0U3RyZWFtSWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShpZCk7CisgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KGlkKTsKICAgICBpZiAobUlucHV0U3RyZWFtICE9IE5VTEwgJiYgaWQgPT0gbUlucHV0U3RyZWFtLT5nZXRJZCgpKSB7CiAgICAgICAgIGRlbGV0ZWRTdHJlYW0gPSBtSW5wdXRTdHJlYW07CiAgICAgICAgIG1JbnB1dFN0cmVhbS5jbGVhcigpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChvdXRwdXRTdHJlYW1JZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGRvZXMgbm90IGV4aXN0IiwgaWQpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8vIERlbGV0ZSBvdXRwdXQgc3RyZWFtIG9yIHRoZSBvdXRwdXQgcGFydCBvZiBhIGJpLWRpcmVjdGlvbmFsIHN0cmVhbS4KLSAgICBpZiAob3V0cHV0U3RyZWFtSWR4ICE9IE5BTUVfTk9UX0ZPVU5EKSB7Ci0gICAgICAgIGRlbGV0ZWRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChvdXRwdXRTdHJlYW1JZHgpOwotICAgICAgICBtT3V0cHV0U3RyZWFtcy5yZW1vdmVJdGVtKGlkKTsKKyAgICBpZiAoc3RyZWFtICE9IG51bGxwdHIpIHsKKyAgICAgICAgZGVsZXRlZFN0cmVhbSA9IHN0cmVhbTsKKyAgICAgICAgbU91dHB1dFN0cmVhbXMucmVtb3ZlKGlkKTsKICAgICB9CiAKICAgICAvLyBGcmVlIHVwIHRoZSBzdHJlYW0gZW5kcG9pbnQgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBieSBzb21lIG90aGVyIHN0cmVhbQpAQCAtMTY5Niw3ICsyMDMwLDcgQEAKIAogICAgIGlmICh0ZW1wbGF0ZUlkIDw9IDAgfHwgdGVtcGxhdGVJZCA+PSBDQU1FUkEzX1RFTVBMQVRFX0NPVU5UKSB7CiAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZVdpdGhJbmZvTG9nKENhbWVyYVNlcnZpY2U6OlNOX0VWRU5UX0xPR19JRCwgIjI2ODY2MTEwIiwKLSAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCksIG51bGxwdHIsIDApOworICAgICAgICAgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCksIG51bGxwdHIsIDApOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIApAQCAtMTg1MCw2ICsyMTg0LDE1IEBACiAKICAgICBtU3RhdHVzV2FpdGVycysrOwogCisgICAgLy8gTm90aWZ5IEhBTCB0byBzdGFydCBkcmFpbmluZy4gV2UgbmVlZCB0byBub3RpZnkgdGhlIEhhbEludGVyZmFjZSBsYXllcgorICAgIC8vIGV2ZW4gd2hlbiB0aGUgZGV2aWNlIGlzIGFscmVhZHkgSURMRSwgc28gSGFsSW50ZXJmYWNlIGNhbiByZWplY3QgaW5jb21pbmcKKyAgICAvLyByZXF1ZXN0U3RyZWFtQnVmZmVycyBjYWxsLgorICAgIGlmICghYWN0aXZlICYmIG1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgIGF1dG8gc3RyZWFtSWRzID0gbU91dHB1dFN0cmVhbXMuZ2V0U3RyZWFtSWRzKCk7CisgICAgICAgIG1SZXF1ZXN0VGhyZWFkLT5zaWduYWxQaXBlbGluZURyYWluKHN0cmVhbUlkcyk7CisgICAgICAgIG1SZXF1ZXN0QnVmZmVyU00ub25XYWl0VW50aWxJZGxlKCk7CisgICAgfQorCiAgICAgYm9vbCBzdGF0ZVNlZW4gPSBmYWxzZTsKICAgICBkbyB7CiAgICAgICAgIGlmIChhY3RpdmUgPT0gKG1TdGF0dXMgPT0gU1RBVFVTX0FDVElWRSkpIHsKQEAgLTIwMDksNiArMjM1MiwxMyBAQAogCiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisKKyAgICAgICAgLy8gYi8xMTY1MTQxMDYgImRpc2Nvbm5lY3QoKSIgY2FuIGdldCBjYWxsZWQgdHdpY2UgZm9yIHRoZSBzYW1lIGRldmljZS4gVGhlCisgICAgICAgIC8vIGNhbWVyYSBkZXZpY2Ugd2lsbCBub3QgYmUgaW5pdGlhbGl6ZWQgZHVyaW5nIHRoZSBzZWNvbmQgcnVuLgorICAgICAgICBpZiAobVN0YXR1cyA9PSBTVEFUVVNfVU5JTklUSUFMSVpFRCkgeworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKICAgICAgICAgbVJlcXVlc3RUaHJlYWQtPmNsZWFyKC8qb3V0Ki9mcmFtZU51bWJlcik7CiAgICAgfQogCkBAIC0yMDI1LDE1ICsyMzc1LDEyIEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKLSAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW07Ci0gICAgc3NpemVfdCBvdXRwdXRTdHJlYW1JZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KHN0cmVhbUlkKTsKLSAgICBpZiAob3V0cHV0U3RyZWFtSWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KHN0cmVhbUlkKTsKKyAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBkb2VzIG5vdCBleGlzdCIsIHN0cmVhbUlkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChvdXRwdXRTdHJlYW1JZHgpOwotCiAgICAgaWYgKHN0cmVhbS0+aXNVbnByZXBhcmFibGUoKSB8fCBzdHJlYW0tPmhhc091dHN0YW5kaW5nQnVmZmVycygpICkgewogICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGhhcyBhbHJlYWR5IGJlZW4gYSByZXF1ZXN0IHRhcmdldCIsIHN0cmVhbUlkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTIwNTMsMTUgKzI0MDAsMTIgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIAotICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbTsKLSAgICBzc2l6ZV90IG91dHB1dFN0cmVhbUlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoc3RyZWFtSWQpOwotICAgIGlmIChvdXRwdXRTdHJlYW1JZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoc3RyZWFtSWQpOworICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGRvZXMgbm90IGV4aXN0Iiwgc3RyZWFtSWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KG91dHB1dFN0cmVhbUlkeCk7Ci0KICAgICBpZiAoc3RyZWFtLT5oYXNPdXRzdGFuZGluZ0J1ZmZlcnMoKSB8fCBtUmVxdWVzdFRocmVhZC0+aXNTdHJlYW1QZW5kaW5nKHN0cmVhbSkpIHsKICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBpcyBhIHRhcmdldCBvZiBhIGluLXByb2dyZXNzIHJlcXVlc3QiLCBzdHJlYW1JZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC0yMDc3LDE0ICsyNDIxLDExIEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKLSAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW07Ci0gICAgc3NpemVfdCBvdXRwdXRTdHJlYW1JZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KHN0cmVhbUlkKTsKLSAgICBpZiAob3V0cHV0U3RyZWFtSWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KHN0cmVhbUlkKTsKKyAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBkb2VzIG5vdCBleGlzdCIsIHN0cmVhbUlkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0KLSAgICBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChvdXRwdXRTdHJlYW1JZHgpOwogICAgIHN0cmVhbS0+YWRkQnVmZmVyTGlzdGVuZXIobGlzdGVuZXIpOwogCiAgICAgcmV0dXJuIE9LOwpAQCAtMjE0MywxMiArMjQ4NCwxMSBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHNzaXplX3QgaWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShzdHJlYW1JZCk7Ci0gICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChzdHJlYW1JZCk7CisgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgaXMgdW5rbm93biIsIHN0cmVhbUlkKTsKLSAgICAgICAgcmV0dXJuIGlkeDsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXNbaWR4XTsKICAgICBzdGF0dXNfdCByZXMgPSBzdHJlYW0tPnNldENvbnN1bWVycyhjb25zdW1lcnMpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBzZXQgY29uc3VtZXIgZmFpbGVkIChlcnJvciAlZCAlcykgIiwgc3RyZWFtSWQsIHJlcywgc3RyZXJyb3IoLXJlcykpOwpAQCAtMjE5MywxMCArMjUzMywxMCBAQAogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCi0gICAgc3NpemVfdCBpZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KHN0cmVhbUlkKTsKLSAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KHN0cmVhbUlkKTsKKyAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBpcyB1bmtub3duIiwgc3RyZWFtSWQpOwotICAgICAgICByZXR1cm4gaWR4OworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIGZvciAoY29uc3QgYXV0byAmaXQgOiByZW1vdmVkU3VyZmFjZUlkcykgewpAQCAtMjIwNiw3ICsyNTQ2LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zW2lkeF07CiAgICAgc3RhdHVzX3QgcmVzID0gc3RyZWFtLT51cGRhdGVTdHJlYW0obmV3U3VyZmFjZXMsIG91dHB1dEluZm8sIHJlbW92ZWRTdXJmYWNlSWRzLCBvdXRwdXRNYXApOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBmYWlsZWQgdG8gdXBkYXRlIHN0cmVhbSAoZXJyb3IgJWQgJXMpICIsCkBAIC0yMjI1LDEzICsyNTY0LDExIEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKLSAgICBpbnQgaWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShzdHJlYW1JZCk7Ci0gICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChzdHJlYW1JZCk7CisgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkIGlzIG5vdCBmb3VuZC4iLCBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0KLSAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChpZHgpOwogICAgIHJldHVybiBzdHJlYW0tPmRyb3BCdWZmZXJzKGRyb3BwaW5nKTsKIH0KIApAQCAtMjI4NSwxNSArMjYyMiwxMiBAQAogICAgIH0KIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyZWFtcy5jb3VudDsgaSsrKSB7Ci0gICAgICAgIGludCBpZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KHN0cmVhbXMuZGF0YS5pMzJbaV0pOwotICAgICAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChzdHJlYW1zLmRhdGEuaTMyW2ldKTsKKyAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICBDTE9HRSgiUmVxdWVzdCByZWZlcmVuY2VzIHVua25vd24gc3RyZWFtICVkIiwKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtcy5kYXRhLnU4W2ldKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtcy5kYXRhLmkzMltpXSk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPQotICAgICAgICAgICAgICAgIG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KGlkeCk7Ci0KICAgICAgICAgLy8gSXQgaXMgaWxsZWdhbCB0byBpbmNsdWRlIGEgZGVmZXJyZWQgY29uc3VtZXIgb3V0cHV0IHN0cmVhbSBpbnRvIGEgcmVxdWVzdAogICAgICAgICBhdXRvIGl0ZXIgPSBzdXJmYWNlTWFwLmZpbmQoc3RyZWFtcy5kYXRhLmkzMltpXSk7CiAgICAgICAgIGlmIChpdGVyICE9IHN1cmZhY2VNYXAuZW5kKCkpIHsKQEAgLTIzMDUsNyArMjYzOSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5ld1JlcXVlc3QtPm1PdXRwdXRTdXJmYWNlc1tpXSA9IHN1cmZhY2VzOworICAgICAgICAgICAgbmV3UmVxdWVzdC0+bU91dHB1dFN1cmZhY2VzW3N0cmVhbXMuZGF0YS5pMzJbaV1dID0gc3VyZmFjZXM7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBMYXp5IGNvbXBsZXRpb24gb2Ygc3RyZWFtIGNvbmZpZ3VyYXRpb24gKGFsbG9jYXRpb24vcmVnaXN0cmF0aW9uKQpAQCAtMjM1NCw3ICsyNjg4LDcgQEAKICAgICB9CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRTdHJlYW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IG91dHB1dFN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KGkpOworICAgICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBvdXRwdXRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtc1tpXTsKICAgICAgICAgaWYgKG91dHB1dFN0cmVhbS0+aXNDb25maWd1cmluZygpKSB7CiAgICAgICAgICAgICByZXMgPSBvdXRwdXRTdHJlYW0tPmNhbmNlbENvbmZpZ3VyYXRpb24oKTsKICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKQEAgLTI0ODksNyArMjgyMyw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBjYW1lcmEzX3N0cmVhbV90ICpvdXRwdXRTdHJlYW07Ci0gICAgICAgIG91dHB1dFN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KGkpLT5zdGFydENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtID0gbU91dHB1dFN0cmVhbXNbaV0tPnN0YXJ0Q29uZmlndXJhdGlvbigpOwogICAgICAgICBpZiAob3V0cHV0U3RyZWFtID09IE5VTEwpIHsKICAgICAgICAgICAgIENMT0dFKCJDYW4ndCBzdGFydCBvdXRwdXQgc3RyZWFtIGNvbmZpZ3VyYXRpb24iKTsKICAgICAgICAgICAgIGNhbmNlbFN0cmVhbXNDb25maWd1cmF0aW9uTG9ja2VkKCk7CkBAIC0yNTQ3LDggKzI4ODEsNyBAQAogICAgIH0KIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gb3V0cHV0U3RyZWFtID0KLSAgICAgICAgICAgIG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KGkpOworICAgICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBvdXRwdXRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtc1tpXTsKICAgICAgICAgaWYgKG91dHB1dFN0cmVhbS0+aXNDb25maWd1cmluZygpICYmICFvdXRwdXRTdHJlYW0tPmlzQ29uc3VtZXJDb25maWd1cmF0aW9uRGVmZXJyZWQoKSkgewogICAgICAgICAgICAgcmVzID0gb3V0cHV0U3RyZWFtLT5maW5pc2hDb25maWd1cmF0aW9uKCk7CiAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CkBAIC0yNjExLDYgKzI5NDQsMTAgQEAKICAgICAgICAgcmV0dXJuIHJjOwogICAgIH0KIAorICAgIGlmIChtRHVtbXlTdHJlYW1JZCA9PSBOT19TVFJFQU0pIHsKKyAgICAgICAgbVJlcXVlc3RCdWZmZXJTTS5vblN0cmVhbXNDb25maWd1cmVkKCk7CisgICAgfQorCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0yNjU1LDE1ICsyOTkyLDEyIEBACiAgICAgLy8gT2ssIGhhdmUgYSBkdW1teSBzdHJlYW0gYW5kIHRoZXJlJ3MgYXQgbGVhc3Qgb25lIG90aGVyIG91dHB1dCBzdHJlYW0sCiAgICAgLy8gc28gcmVtb3ZlIHRoZSBkdW1teQogCi0gICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gZGVsZXRlZFN0cmVhbTsKLSAgICBzc2l6ZV90IG91dHB1dFN0cmVhbUlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkobUR1bW15U3RyZWFtSWQpOwotICAgIGlmIChvdXRwdXRTdHJlYW1JZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBkZWxldGVkU3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KG1EdW1teVN0cmVhbUlkKTsKKyAgICBpZiAoZGVsZXRlZFN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgIFNFVF9FUlJfTCgiRHVtbXkgc3RyZWFtICVkIGRvZXMgbm90IGFwcGVhciB0byBleGlzdCIsIG1EdW1teVN0cmVhbUlkKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLQotICAgIGRlbGV0ZWRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChvdXRwdXRTdHJlYW1JZHgpOwotICAgIG1PdXRwdXRTdHJlYW1zLnJlbW92ZUl0ZW1zQXQob3V0cHV0U3RyZWFtSWR4KTsKKyAgICBtT3V0cHV0U3RyZWFtcy5yZW1vdmUobUR1bW15U3RyZWFtSWQpOwogCiAgICAgLy8gRnJlZSB1cCB0aGUgc3RyZWFtIGVuZHBvaW50IHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYnkgc29tZSBvdGhlciBzdHJlYW0KICAgICByZXMgPSBkZWxldGVkU3RyZWFtLT5kaXNjb25uZWN0KCk7CkBAIC0yNzM3LDE4ICszMDcxLDIxIEBACiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpyZWdpc3RlckluRmxpZ2h0KHVpbnQzMl90IGZyYW1lTnVtYmVyLAogICAgICAgICBpbnQzMl90IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzLCBib29sIGhhc0lucHV0LAogICAgICAgICBib29sIGhhc0FwcENhbGxiYWNrLCBuc2Vjc190IG1heEV4cGVjdGVkRHVyYXRpb24sCi0gICAgICAgIHN0ZDo6c2V0PFN0cmluZzg+JiBwaHlzaWNhbENhbWVyYUlkcykgeworICAgICAgICBzdGQ6OnNldDxTdHJpbmc4PiYgcGh5c2ljYWxDYW1lcmFJZHMsIGJvb2wgaXNTdGlsbENhcHR1cmUsCisgICAgICAgIGJvb2wgaXNac2xDYXB0dXJlLCBjb25zdCBTdXJmYWNlTWFwJiBvdXRwdXRTdXJmYWNlcykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUluRmxpZ2h0TG9jayk7CiAKICAgICBzc2l6ZV90IHJlczsKICAgICByZXMgPSBtSW5GbGlnaHRNYXAuYWRkKGZyYW1lTnVtYmVyLCBJbkZsaWdodFJlcXVlc3QobnVtQnVmZmVycywgcmVzdWx0RXh0cmFzLCBoYXNJbnB1dCwKLSAgICAgICAgICAgIGhhc0FwcENhbGxiYWNrLCBtYXhFeHBlY3RlZER1cmF0aW9uLCBwaHlzaWNhbENhbWVyYUlkcykpOworICAgICAgICAgICAgaGFzQXBwQ2FsbGJhY2ssIG1heEV4cGVjdGVkRHVyYXRpb24sIHBoeXNpY2FsQ2FtZXJhSWRzLCBpc1N0aWxsQ2FwdHVyZSwgaXNac2xDYXB0dXJlLAorICAgICAgICAgICAgb3V0cHV0U3VyZmFjZXMpKTsKICAgICBpZiAocmVzIDwgMCkgcmV0dXJuIHJlczsKIAogICAgIGlmIChtSW5GbGlnaHRNYXAuc2l6ZSgpID09IDEpIHsKLSAgICAgICAgLy8gaG9sZCBtTG9jayB0byBwcmV2ZW50IHJhY2Ugd2l0aCBkaXNjb25uZWN0Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgLy8gSG9sZCBhIHNlcGFyYXRlIGRlZGljYXRlZCB0cmFja2VyIGxvY2sgdG8gcHJldmVudCByYWNlIHdpdGggZGlzY29ubmVjdCBhbmQgYWxzbworICAgICAgICAvLyBhdm9pZCBhIGRlYWRsb2NrIGR1cmluZyByZXByb2Nlc3MgcmVxdWVzdHMuCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1UcmFja2VyTG9jayk7CiAgICAgICAgIGlmIChtU3RhdHVzVHJhY2tlciAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICBtU3RhdHVzVHJhY2tlci0+bWFya0NvbXBvbmVudEFjdGl2ZShtSW5GbGlnaHRTdGF0dXNJZCk7CiAgICAgICAgIH0KQEAgLTI3NjAsMTcgKzMwOTcsNjUgQEAKIAogdm9pZCBDYW1lcmEzRGV2aWNlOjpyZXR1cm5PdXRwdXRCdWZmZXJzKAogICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCAqb3V0cHV0QnVmZmVycywgc2l6ZV90IG51bUJ1ZmZlcnMsCi0gICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKSB7CisgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcsCisgICAgICAgIGNvbnN0IFN1cmZhY2VNYXAmIG91dHB1dFN1cmZhY2VzLAorICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzICZpblJlc3VsdEV4dHJhcykgeworCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1CdWZmZXJzOyBpKyspCiAgICAgewotICAgICAgICBDYW1lcmEzU3RyZWFtICpzdHJlYW0gPSBDYW1lcmEzU3RyZWFtOjpjYXN0KG91dHB1dEJ1ZmZlcnNbaV0uc3RyZWFtKTsKLSAgICAgICAgc3RhdHVzX3QgcmVzID0gc3RyZWFtLT5yZXR1cm5CdWZmZXIob3V0cHV0QnVmZmVyc1tpXSwgdGltZXN0YW1wKTsKKyAgICAgICAgaWYgKG91dHB1dEJ1ZmZlcnNbaV0uYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGlmICghbVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgICAgICAgICAvLyBXaXRoIEhBTCBidWZmZXIgbWFuYWdlbWVudCBBUEksIEhBTCBzb21ldGltZXMgd2lsbCBoYXZlIHRvIHJldHVybiBidWZmZXJzIHRoYXQKKyAgICAgICAgICAgICAgICAvLyBoYXMgbm90IGdvdCBhIG91dHB1dCBidWZmZXIgaGFuZGxlIGZpbGxlZCB5ZXQuIFRoaXMgaXMgdGhvdWdoIGlsbGVnYWwgaWYgSEFMCisgICAgICAgICAgICAgICAgLy8gYnVmZmVyIG1hbmFnZW1lbnQgQVBJIGlzIG5vdCBiZWluZyB1c2VkLgorICAgICAgICAgICAgICAgIEFMT0dFKCIlczogY2Fubm90IHJldHVybiBhIG51bGwgYnVmZmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIENhbWVyYTNTdHJlYW1JbnRlcmZhY2UgKnN0cmVhbSA9IENhbWVyYTNTdHJlYW06OmNhc3Qob3V0cHV0QnVmZmVyc1tpXS5zdHJlYW0pOworICAgICAgICBpbnQgc3RyZWFtSWQgPSBzdHJlYW0tPmdldElkKCk7CisgICAgICAgIGNvbnN0IGF1dG8mIGl0ID0gb3V0cHV0U3VyZmFjZXMuZmluZChzdHJlYW1JZCk7CisgICAgICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgICAgICBpZiAoaXQgIT0gb3V0cHV0U3VyZmFjZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHN0cmVhbS0+cmV0dXJuQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJzW2ldLCB0aW1lc3RhbXAsIHRpbWVzdGFtcEluY3JlYXNpbmcsIGl0LT5zZWNvbmQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzID0gc3RyZWFtLT5yZXR1cm5CdWZmZXIoCisgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcnNbaV0sIHRpbWVzdGFtcCwgdGltZXN0YW1wSW5jcmVhc2luZyk7CisgICAgICAgIH0KKwogICAgICAgICAvLyBOb3RlOiBzdHJlYW0gbWF5IGJlIGRlYWxsb2NhdGVkIGF0IHRoaXMgcG9pbnQsIGlmIHRoaXMgYnVmZmVyIHdhcwogICAgICAgICAvLyB0aGUgbGFzdCByZWZlcmVuY2UgdG8gaXQuCiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCJDYW4ndCByZXR1cm4gYnVmZmVyIHRvIGl0cyBzdHJlYW06ICVzICglZCkiLAogICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICB9CisKKyAgICAgICAgLy8gTG9uZyBwcm9jZXNzaW5nIGNvbnN1bWVycyBjYW4gY2F1c2UgcmV0dXJuQnVmZmVyIHRpbWVvdXQgZm9yIHNoYXJlZCBzdHJlYW0KKyAgICAgICAgLy8gSWYgdGhhdCBoYXBwZW5zLCBjYW5jZWwgdGhlIGJ1ZmZlciBhbmQgc2VuZCBhIGJ1ZmZlciBlcnJvciB0byBjbGllbnQKKyAgICAgICAgaWYgKGl0ICE9IG91dHB1dFN1cmZhY2VzLmVuZCgpICYmIHJlcyA9PSBUSU1FRF9PVVQgJiYKKyAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJzW2ldLnN0YXR1cyA9PSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfT0spIHsKKyAgICAgICAgICAgIC8vIGNhbmNlbCB0aGUgYnVmZmVyCisgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCBzYiA9IG91dHB1dEJ1ZmZlcnNbaV07CisgICAgICAgICAgICBzYi5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1I7CisgICAgICAgICAgICBzdHJlYW0tPnJldHVybkJ1ZmZlcihzYiwgLyp0aW1lc3RhbXAqLzAsIHRpbWVzdGFtcEluY3JlYXNpbmcpOworCisgICAgICAgICAgICAvLyBub3RpZnkgY2xpZW50IGJ1ZmZlciBlcnJvcgorICAgICAgICAgICAgc3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1PdXRwdXRMb2NrKTsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyBleHRyYXMgPSBpblJlc3VsdEV4dHJhczsKKyAgICAgICAgICAgICAgICBleHRyYXMuZXJyb3JTdHJlYW1JZCA9IHN0cmVhbUlkOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5ub3RpZnlFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIH0KIApAQCAtMjc4MSw4ICszMTY2LDEwIEBACiAKICAgICAvLyBJbmRpY2F0ZSBpZGxlIGluRmxpZ2h0TWFwIHRvIHRoZSBzdGF0dXMgdHJhY2tlcgogICAgIGlmIChtSW5GbGlnaHRNYXAuc2l6ZSgpID09IDApIHsKLSAgICAgICAgLy8gaG9sZCBtTG9jayB0byBwcmV2ZW50IHJhY2Ugd2l0aCBkaXNjb25uZWN0Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgbVJlcXVlc3RCdWZmZXJTTS5vbkluZmxpZ2h0TWFwRW1wdHkoKTsKKyAgICAgICAgLy8gSG9sZCBhIHNlcGFyYXRlIGRlZGljYXRlZCB0cmFja2VyIGxvY2sgdG8gcHJldmVudCByYWNlIHdpdGggZGlzY29ubmVjdCBhbmQgYWxzbworICAgICAgICAvLyBhdm9pZCBhIGRlYWRsb2NrIGR1cmluZyByZXByb2Nlc3MgcmVxdWVzdHMuCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1UcmFja2VyTG9jayk7CiAgICAgICAgIGlmIChtU3RhdHVzVHJhY2tlciAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICBtU3RhdHVzVHJhY2tlci0+bWFya0NvbXBvbmVudElkbGUobUluRmxpZ2h0U3RhdHVzSWQsIEZlbmNlOjpOT19GRU5DRSk7CiAgICAgICAgIH0KQEAgLTI4MDcsNiArMzE5NCwxMCBAQAogICAgIGlmIChyZXF1ZXN0Lm51bUJ1ZmZlcnNMZWZ0ID09IDAgJiYKICAgICAgICAgICAgIChyZXF1ZXN0LnNraXBSZXN1bHRNZXRhZGF0YSB8fAogICAgICAgICAgICAgKHJlcXVlc3QuaGF2ZVJlc3VsdE1ldGFkYXRhICYmIHNodXR0ZXJUaW1lc3RhbXAgIT0gMCkpKSB7CisgICAgICAgIGlmIChyZXF1ZXN0LnN0aWxsQ2FwdHVyZSkgeworICAgICAgICAgICAgQVRSQUNFX0FTWU5DX0VORCgic3RpbGwgY2FwdHVyZSIsIGZyYW1lTnVtYmVyKTsKKyAgICAgICAgfQorCiAgICAgICAgIEFUUkFDRV9BU1lOQ19FTkQoImZyYW1lIGNhcHR1cmUiLCBmcmFtZU51bWJlcik7CiAKICAgICAgICAgLy8gU2FuaXR5IGNoZWNrIC0gaWYgc2Vuc29yIHRpbWVzdGFtcCBtYXRjaGVzIHNodXR0ZXIgdGltZXN0YW1wIGluIHRoZQpAQCAtMjgyMyw3ICszMjE0LDggQEAKICAgICAgICAgYXNzZXJ0KHJlcXVlc3QucmVxdWVzdFN0YXR1cyAhPSBPSyB8fAogICAgICAgICAgICAgICAgcmVxdWVzdC5wZW5kaW5nT3V0cHV0QnVmZmVycy5zaXplKCkgPT0gMCk7CiAgICAgICAgIHJldHVybk91dHB1dEJ1ZmZlcnMocmVxdWVzdC5wZW5kaW5nT3V0cHV0QnVmZmVycy5hcnJheSgpLAotICAgICAgICAgICAgcmVxdWVzdC5wZW5kaW5nT3V0cHV0QnVmZmVycy5zaXplKCksIDApOworICAgICAgICAgICAgcmVxdWVzdC5wZW5kaW5nT3V0cHV0QnVmZmVycy5zaXplKCksIDAsIC8qdGltZXN0YW1wSW5jcmVhc2luZyovdHJ1ZSwKKyAgICAgICAgICAgIHJlcXVlc3Qub3V0cHV0U3VyZmFjZXMsIHJlcXVlc3QucmVzdWx0RXh0cmFzKTsKIAogICAgICAgICByZW1vdmVJbkZsaWdodE1hcEVudHJ5TG9ja2VkKGlkeCk7CiAgICAgICAgIEFMT0dWVigiJXM6IHJlbW92ZWQgZnJhbWUgJWQgZnJvbSBJbkZsaWdodE1hcCIsIF9fRlVOQ1RJT05fXywgZnJhbWVOdW1iZXIpOwpAQCAtMjg0Nyw3ICszMjM5LDkgQEAKICAgICAgICAgZm9yIChzaXplX3QgaWR4ID0gMDsgaWR4IDwgbUluRmxpZ2h0TWFwLnNpemUoKTsgaWR4KyspIHsKICAgICAgICAgICAgIGNvbnN0IEluRmxpZ2h0UmVxdWVzdCAmcmVxdWVzdCA9IG1JbkZsaWdodE1hcC52YWx1ZUF0KGlkeCk7CiAgICAgICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuYXJyYXkoKSwKLSAgICAgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSwgMCk7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5wZW5kaW5nT3V0cHV0QnVmZmVycy5zaXplKCksIDAsCisgICAgICAgICAgICAgICAgLyp0aW1lc3RhbXBJbmNyZWFzaW5nKi90cnVlLCByZXF1ZXN0Lm91dHB1dFN1cmZhY2VzLAorICAgICAgICAgICAgICAgIHJlcXVlc3QucmVzdWx0RXh0cmFzKTsKICAgICAgICAgfQogICAgICAgICBtSW5GbGlnaHRNYXAuY2xlYXIoKTsKICAgICAgICAgbUV4cGVjdGVkSW5mbGlnaHREdXJhdGlvbiA9IDA7CkBAIC0yOTIyLDEyICszMzE2LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIsIHN0cmVhbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNzaXplX3QgaWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShzdHJlYW1JZCk7Ci0gICAgICAgICAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoc3RyZWFtSWQpOworICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBPdXRwdXQgc3RyZWFtIGlkICVkIG5vdCBmb3VuZCEiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0cmVhbUJ1ZmZlci5zdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy52YWx1ZUF0KGlkeCktPmFzSGFsU3RyZWFtKCk7CisgICAgICAgICAgICBzdHJlYW1CdWZmZXIuc3RyZWFtID0gc3RyZWFtLT5hc0hhbFN0cmVhbSgpOwogICAgICAgICAgICAgcmV0dXJuT3V0cHV0QnVmZmVycygmc3RyZWFtQnVmZmVyLCAvKnNpemUqLzEsIC8qdGltZXN0YW1wKi8gMCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0yOTc1LDYgKzMzNjksMTMgQEAKICAgICBjYXB0dXJlUmVzdWx0Lm1SZXN1bHRFeHRyYXMgPSByZXN1bHRFeHRyYXM7CiAgICAgY2FwdHVyZVJlc3VsdC5tTWV0YWRhdGEgPSBwYXJ0aWFsUmVzdWx0OwogCisgICAgLy8gRml4IHVwIHJlc3VsdCBtZXRhZGF0YSBmb3IgbW9ub2Nocm9tZSBjYW1lcmEuCisgICAgc3RhdHVzX3QgcmVzID0gZml4dXBNb25vY2hyb21lVGFncyhtRGV2aWNlSW5mbywgY2FwdHVyZVJlc3VsdC5tTWV0YWRhdGEpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgU0VUX0VSUigiRmFpbGVkIHRvIG92ZXJyaWRlIHJlc3VsdCBtZXRhZGF0YTogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgaW5zZXJ0UmVzdWx0TG9ja2VkKCZjYXB0dXJlUmVzdWx0LCBmcmFtZU51bWJlcik7CiB9CiAKQEAgLTMwNDYsNiArMzQ0NywyMSBAQAogICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyLCBzdHJlcnJvcihyZXMpLCByZXMpOwogICAgICAgICByZXR1cm47CiAgICAgfQorICAgIC8vIEZpeCB1cCByZXN1bHQgbWV0YWRhdGEgZm9yIG1vbm9jaHJvbWUgY2FtZXJhLgorICAgIHJlcyA9IGZpeHVwTW9ub2Nocm9tZVRhZ3MobURldmljZUluZm8sIGNhcHR1cmVSZXN1bHQubU1ldGFkYXRhKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIFNFVF9FUlIoIkZhaWxlZCB0byBvdmVycmlkZSByZXN1bHQgbWV0YWRhdGE6ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8mIHBoeXNpY2FsTWV0YWRhdGEgOiBjYXB0dXJlUmVzdWx0Lm1QaHlzaWNhbE1ldGFkYXRhcykgeworICAgICAgICBTdHJpbmc4IGNhbWVyYUlkOChwaHlzaWNhbE1ldGFkYXRhLm1QaHlzaWNhbENhbWVyYUlkKTsKKyAgICAgICAgcmVzID0gZml4dXBNb25vY2hyb21lVGFncyhtUGh5c2ljYWxEZXZpY2VJbmZvTWFwLmF0KGNhbWVyYUlkOC5jX3N0cigpKSwKKyAgICAgICAgICAgICAgICBwaHlzaWNhbE1ldGFkYXRhLm1QaHlzaWNhbENhbWVyYU1ldGFkYXRhKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgU0VUX0VSUigiRmFpbGVkIHRvIG92ZXJyaWRlIHJlc3VsdCBtZXRhZGF0YTogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQogCiAgICAgbVRhZ01vbml0b3IubW9uaXRvck1ldGFkYXRhKFRhZ01vbml0b3I6OlJFU1VMVCwKICAgICAgICAgICAgIGZyYW1lTnVtYmVyLCB0aW1lc3RhbXAuZGF0YS5pNjRbMF0sIGNhcHR1cmVSZXN1bHQubU1ldGFkYXRhKTsKQEAgLTMyMDMsOCArMzYxOSwxMCBAQAogICAgICAgICAgICAgcmVxdWVzdC5wZW5kaW5nT3V0cHV0QnVmZmVycy5hcHBlbmRBcnJheShyZXN1bHQtPm91dHB1dF9idWZmZXJzLAogICAgICAgICAgICAgICAgIHJlc3VsdC0+bnVtX291dHB1dF9idWZmZXJzKTsKICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZyA9ICEocmVxdWVzdC56c2xDYXB0dXJlIHx8IHJlcXVlc3QuaGFzSW5wdXRCdWZmZXIpOwogICAgICAgICAgICAgcmV0dXJuT3V0cHV0QnVmZmVycyhyZXN1bHQtPm91dHB1dF9idWZmZXJzLAotICAgICAgICAgICAgICAgIHJlc3VsdC0+bnVtX291dHB1dF9idWZmZXJzLCBzaHV0dGVyVGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPm51bV9vdXRwdXRfYnVmZmVycywgc2h1dHRlclRpbWVzdGFtcCwgdGltZXN0YW1wSW5jcmVhc2luZywKKyAgICAgICAgICAgICAgICByZXF1ZXN0Lm91dHB1dFN1cmZhY2VzLCByZXF1ZXN0LnJlc3VsdEV4dHJhcyk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAocmVzdWx0LT5yZXN1bHQgIT0gTlVMTCAmJiAhaXNQYXJ0aWFsUmVzdWx0KSB7CkBAIC0zMjE3LDcgKzM2MzUsNyBAQAogICAgICAgICAgICAgaWYgKHNodXR0ZXJUaW1lc3RhbXAgPT0gMCkgewogICAgICAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ01ldGFkYXRhID0gcmVzdWx0LT5yZXN1bHQ7CiAgICAgICAgICAgICAgICAgcmVxdWVzdC5jb2xsZWN0ZWRQYXJ0aWFsUmVzdWx0ID0gY29sbGVjdGVkUGFydGlhbFJlc3VsdDsKLSAgICAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0Lmhhc0NhbGxiYWNrKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3QuaGFzQ2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YTsKICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IHJlc3VsdC0+cmVzdWx0OwogICAgICAgICAgICAgICAgIHNlbmRDYXB0dXJlUmVzdWx0KG1ldGFkYXRhLCByZXF1ZXN0LnJlc3VsdEV4dHJhcywKQEAgLTMzMzcsNiArMzc1NSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIG9mIG1pc3NpbmcgcmVzdWx0IGNoZWNrIHdoZXRoZXIgdGhlIGJ1ZmZlcnMKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybmVkLiBJZiB0aGV5IHJldHVybmVkLCB0aGVuIHJlbW92ZSBpbmZsaWdodAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWVzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBjYWxsIHRoaXMgZm9yIEVSUk9SX0NBTUVSQV9SRVFVRVNUIGFzIHdlbGw/CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBvdGhlcndpc2Ugd2UgYXJlIGRlcGVuZGluZyBvbiBIQUwgdG8gc2VuZCB0aGUgYnVmZmVycyBiYWNrIGFmdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBjYWxsaW5nIG5vdGlmeUVycm9yLiBOb3Qgc3VyZSBpZiB0aGF0J3MgaW4gdGhlIHNwZWMuCiAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVJbkZsaWdodFJlcXVlc3RJZlJlYWR5TG9ja2VkKGlkeCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMzQxMCw4ICszODMxLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIHIuY29sbGVjdGVkUGFydGlhbFJlc3VsdCwgbXNnLmZyYW1lX251bWJlciwKICAgICAgICAgICAgICAgICAgICAgci5oYXNJbnB1dEJ1ZmZlciwgci5waHlzaWNhbE1ldGFkYXRhcyk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcgPSAhKHIuenNsQ2FwdHVyZSB8fCByLmhhc0lucHV0QnVmZmVyKTsKICAgICAgICAgICAgIHJldHVybk91dHB1dEJ1ZmZlcnMoci5wZW5kaW5nT3V0cHV0QnVmZmVycy5hcnJheSgpLAotICAgICAgICAgICAgICAgIHIucGVuZGluZ091dHB1dEJ1ZmZlcnMuc2l6ZSgpLCByLnNodXR0ZXJUaW1lc3RhbXApOworICAgICAgICAgICAgICAgICAgICByLnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSwgci5zaHV0dGVyVGltZXN0YW1wLCB0aW1lc3RhbXBJbmNyZWFzaW5nLAorICAgICAgICAgICAgICAgICAgICByLm91dHB1dFN1cmZhY2VzLCByLnJlc3VsdEV4dHJhcyk7CiAgICAgICAgICAgICByLnBlbmRpbmdPdXRwdXRCdWZmZXJzLmNsZWFyKCk7CiAKICAgICAgICAgICAgIHJlbW92ZUluRmxpZ2h0UmVxdWVzdElmUmVhZHlMb2NrZWQoaWR4KTsKQEAgLTM0NDcsMTEgKzM4NzAsMTcgQEAKIAogQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpIYWxJbnRlcmZhY2UoCiAgICAgICAgICAgICBzcDxJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gJnNlc3Npb24sCi0gICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlKSA6CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlLAorICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyKSA6CiAgICAgICAgIG1IaWRsU2Vzc2lvbihzZXNzaW9uKSwKLSAgICAgICAgbVJlcXVlc3RNZXRhZGF0YVF1ZXVlKHF1ZXVlKSB7CisgICAgICAgIG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZShxdWV1ZSksCisgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyKHVzZUhhbEJ1Zk1hbmFnZXIpIHsKICAgICAvLyBDaGVjayB3aXRoIGhhcmR3YXJlIHNlcnZpY2UgbWFuYWdlciBpZiB3ZSBjYW4gZG93bmNhc3QgdGhlc2UgaW50ZXJmYWNlcwogICAgIC8vIFNvbWV3aGF0IGV4cGVuc2l2ZSwgc28gY2FjaGUgdGhlIHJlc3VsdHMgYXQgc3RhcnR1cAorICAgIGF1dG8gY2FzdFJlc3VsdF8zXzUgPSBkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2VTZXNzaW9uOjpjYXN0RnJvbShtSGlkbFNlc3Npb24pOworICAgIGlmIChjYXN0UmVzdWx0XzNfNS5pc09rKCkpIHsKKyAgICAgICAgbUhpZGxTZXNzaW9uXzNfNSA9IGNhc3RSZXN1bHRfM181OworICAgIH0KICAgICBhdXRvIGNhc3RSZXN1bHRfM180ID0gZGV2aWNlOjpWM180OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbjo6Y2FzdEZyb20obUhpZGxTZXNzaW9uKTsKICAgICBpZiAoY2FzdFJlc3VsdF8zXzQuaXNPaygpKSB7CiAgICAgICAgIG1IaWRsU2Vzc2lvbl8zXzQgPSBjYXN0UmVzdWx0XzNfNDsKQEAgLTM0NjIsMTcgKzM4OTEsMTkgQEAKICAgICB9CiB9CiAKLUNhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6SGFsSW50ZXJmYWNlKCkge30KK0NhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6SGFsSW50ZXJmYWNlKCkgOiBtVXNlSGFsQnVmTWFuYWdlcihmYWxzZSkge30KIAogQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpIYWxJbnRlcmZhY2UoY29uc3QgSGFsSW50ZXJmYWNlJiBvdGhlcikgOgogICAgICAgICBtSGlkbFNlc3Npb24ob3RoZXIubUhpZGxTZXNzaW9uKSwKLSAgICAgICAgbVJlcXVlc3RNZXRhZGF0YVF1ZXVlKG90aGVyLm1SZXF1ZXN0TWV0YWRhdGFRdWV1ZSkge30KKyAgICAgICAgbVJlcXVlc3RNZXRhZGF0YVF1ZXVlKG90aGVyLm1SZXF1ZXN0TWV0YWRhdGFRdWV1ZSksCisgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyKG90aGVyLm1Vc2VIYWxCdWZNYW5hZ2VyKSB7fQogCiBib29sIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6dmFsaWQoKSB7CiAgICAgcmV0dXJuIChtSGlkbFNlc3Npb24gIT0gbnVsbHB0cik7CiB9CiAKIHZvaWQgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpjbGVhcigpIHsKKyAgICBtSGlkbFNlc3Npb25fM181LmNsZWFyKCk7CiAgICAgbUhpZGxTZXNzaW9uXzNfNC5jbGVhcigpOwogICAgIG1IaWRsU2Vzc2lvbl8zXzMuY2xlYXIoKTsKICAgICBtSGlkbFNlc3Npb24uY2xlYXIoKTsKQEAgLTM2MjgsMjYgKzQwNTksNDkgQEAKIAogICAgIC8vIEludm9rZSBjb25maWd1cmVTdHJlYW1zCiAgICAgZGV2aWNlOjpWM18zOjpIYWxTdHJlYW1Db25maWd1cmF0aW9uIGZpbmFsQ29uZmlndXJhdGlvbjsKKyAgICBkZXZpY2U6OlYzXzQ6OkhhbFN0cmVhbUNvbmZpZ3VyYXRpb24gZmluYWxDb25maWd1cmF0aW9uM180OwogICAgIGNvbW1vbjo6VjFfMDo6U3RhdHVzIHN0YXR1czsKIAotICAgIC8vIFNlZSBpZiB3ZSBoYXZlIHYzLjQgb3IgdjMuMyBIQUwKLSAgICBpZiAobUhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7Ci0gICAgICAgIC8vIFdlIGRvOyB1c2UgdjMuNCBmb3IgdGhlIGNhbGwKLSAgICAgICAgQUxPR1YoIiVzOiB2My40IGRldmljZSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIGRldmljZTo6VjNfNDo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiBmaW5hbENvbmZpZ3VyYXRpb24zXzQ7Ci0gICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfNC0+Y29uZmlndXJlU3RyZWFtc18zXzQocmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNCwKLSAgICAgICAgICAgIFsmc3RhdHVzLCAmZmluYWxDb25maWd1cmF0aW9uM180XQorICAgIGF1dG8gY29uZmlnU3RyZWFtMzRDYiA9IFsmc3RhdHVzLCAmZmluYWxDb25maWd1cmF0aW9uM180XQogICAgICAgICAgICAgKGNvbW1vbjo6VjFfMDo6U3RhdHVzIHMsIGNvbnN0IGRldmljZTo6VjNfNDo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiYgaGFsQ29uZmlndXJhdGlvbikgewogICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbjNfNCA9IGhhbENvbmZpZ3VyYXRpb247CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKLSAgICAgICAgICAgIH0pOwotICAgICAgICBpZiAoIWVyci5pc09rKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgICAgIH07CisKKyAgICBhdXRvIHBvc3Rwcm9jQ29uZmlnU3RyZWFtMzQgPSBbJmZpbmFsQ29uZmlndXJhdGlvbiwgJmZpbmFsQ29uZmlndXJhdGlvbjNfNF0KKyAgICAgICAgICAgIChoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+JiBlcnIpIC0+IHN0YXR1c190IHsKKyAgICAgICAgICAgICAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zLnJlc2l6ZShmaW5hbENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtcy5zaXplKCkpOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmluYWxDb25maWd1cmF0aW9uM180LnN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXNbaV0gPSBmaW5hbENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtc1tpXS52M18zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICB9OworCisgICAgLy8gU2VlIGlmIHdlIGhhdmUgdjMuNCBvciB2My4zIEhBTAorICAgIGlmIChtSGlkbFNlc3Npb25fM181ICE9IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1YoIiVzOiB2My41IGRldmljZSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGRldmljZTo6VjNfNTo6U3RyZWFtQ29uZmlndXJhdGlvbiByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM181OworICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM181LnYzXzQgPSByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180OworICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM181LnN0cmVhbUNvbmZpZ0NvdW50ZXIgPSBtTmV4dFN0cmVhbUNvbmZpZ0NvdW50ZXIrKzsKKyAgICAgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb25fM181LT5jb25maWd1cmVTdHJlYW1zXzNfNSgKKyAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM181LCBjb25maWdTdHJlYW0zNENiKTsKKyAgICAgICAgcmVzID0gcG9zdHByb2NDb25maWdTdHJlYW0zNChlcnIpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9Ci0gICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zLnJlc2l6ZShmaW5hbENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtcy5zaXplKCkpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZpbmFsQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtc1tpXSA9IGZpbmFsQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zW2ldLnYzXzM7CisgICAgfSBlbHNlIGlmIChtSGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKKyAgICAgICAgLy8gV2UgZG87IHVzZSB2My40IGZvciB0aGUgY2FsbAorICAgICAgICBBTE9HVigiJXM6IHYzLjQgZGV2aWNlIGZvdW5kIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgZGV2aWNlOjpWM180OjpIYWxTdHJlYW1Db25maWd1cmF0aW9uIGZpbmFsQ29uZmlndXJhdGlvbjNfNDsKKyAgICAgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb25fM180LT5jb25maWd1cmVTdHJlYW1zXzNfNCgKKyAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180LCBjb25maWdTdHJlYW0zNENiKTsKKyAgICAgICAgcmVzID0gcG9zdHByb2NDb25maWdTdHJlYW0zNChlcnIpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtSGlkbFNlc3Npb25fM18zICE9IG51bGxwdHIpIHsKICAgICAgICAgLy8gV2UgZG87IHVzZSB2My4zIGZvciB0aGUgY2FsbApAQCAtMzc1OSwxNCArNDIxMywxNCBAQAogICAgIHJldHVybiByZXM7CiB9CiAKLXZvaWQgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjp3cmFwQXNIaWRsUmVxdWVzdChjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90KiByZXF1ZXN0LAorc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjp3cmFwQXNIaWRsUmVxdWVzdChjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90KiByZXF1ZXN0LAogICAgICAgICAvKm91dCovZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVxdWVzdCogY2FwdHVyZVJlcXVlc3QsCiAgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiogaGFuZGxlc0NyZWF0ZWQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIGlmIChjYXB0dXJlUmVxdWVzdCA9PSBudWxscHRyIHx8IGhhbmRsZXNDcmVhdGVkID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIiVzOiBjYXB0dXJlUmVxdWVzdCAoJXApIGFuZCBoYW5kbGVzQ3JlYXRlZCAoJXApIG11c3Qgbm90IGJlIG51bGwiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FwdHVyZVJlcXVlc3QsIGhhbmRsZXNDcmVhdGVkKTsKLSAgICAgICAgcmV0dXJuOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIGNhcHR1cmVSZXF1ZXN0LT5mcmFtZU51bWJlciA9IHJlcXVlc3QtPmZyYW1lX251bWJlcjsKQEAgLTM4MDcsMjYgKzQyNjEsMzcgQEAKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90ICpzcmMgPSByZXF1ZXN0LT5vdXRwdXRfYnVmZmVycyArIGk7CiAgICAgICAgICAgICBTdHJlYW1CdWZmZXIgJmRzdCA9IGNhcHR1cmVSZXF1ZXN0LT5vdXRwdXRCdWZmZXJzW2ldOwogICAgICAgICAgICAgaW50MzJfdCBzdHJlYW1JZCA9IENhbWVyYTNTdHJlYW06OmNhc3Qoc3JjLT5zdHJlYW0pLT5nZXRJZCgpOwotICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90IGJ1ZiA9ICooc3JjLT5idWZmZXIpOwotICAgICAgICAgICAgYXV0byBwYWlyID0gZ2V0QnVmZmVySWQoYnVmLCBzdHJlYW1JZCk7Ci0gICAgICAgICAgICBib29sIGlzTmV3QnVmZmVyID0gcGFpci5maXJzdDsKLSAgICAgICAgICAgIGRzdC5zdHJlYW1JZCA9IHN0cmVhbUlkOwotICAgICAgICAgICAgZHN0LmJ1ZmZlcklkID0gcGFpci5zZWNvbmQ7Ci0gICAgICAgICAgICBkc3QuYnVmZmVyID0gaXNOZXdCdWZmZXIgPyBidWYgOiBudWxscHRyOwotICAgICAgICAgICAgZHN0LnN0YXR1cyA9IEJ1ZmZlclN0YXR1czo6T0s7Ci0gICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmFjcXVpcmVGZW5jZSA9IG51bGxwdHI7Ci0gICAgICAgICAgICBpZiAoc3JjLT5hY3F1aXJlX2ZlbmNlICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwwKTsKLSAgICAgICAgICAgICAgICBhY3F1aXJlRmVuY2UtPmRhdGFbMF0gPSBzcmMtPmFjcXVpcmVfZmVuY2U7Ci0gICAgICAgICAgICAgICAgaGFuZGxlc0NyZWF0ZWQtPnB1c2hfYmFjayhhY3F1aXJlRmVuY2UpOworICAgICAgICAgICAgaWYgKHNyYy0+YnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgYnVmID0gKihzcmMtPmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgYXV0byBwYWlyID0gZ2V0QnVmZmVySWQoYnVmLCBzdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgYm9vbCBpc05ld0J1ZmZlciA9IHBhaXIuZmlyc3Q7CisgICAgICAgICAgICAgICAgZHN0LmJ1ZmZlcklkID0gcGFpci5zZWNvbmQ7CisgICAgICAgICAgICAgICAgZHN0LmJ1ZmZlciA9IGlzTmV3QnVmZmVyID8gYnVmIDogbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmFjcXVpcmVGZW5jZSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgaWYgKHNyYy0+YWNxdWlyZV9mZW5jZSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBhY3F1aXJlRmVuY2UgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLDApOworICAgICAgICAgICAgICAgICAgICBhY3F1aXJlRmVuY2UtPmRhdGFbMF0gPSBzcmMtPmFjcXVpcmVfZmVuY2U7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZXNDcmVhdGVkLT5wdXNoX2JhY2soYWNxdWlyZUZlbmNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZHN0LmFjcXVpcmVGZW5jZSA9IGFjcXVpcmVGZW5jZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgICAgICAgICAvLyBIQUwgYnVmZmVyIG1hbmFnZW1lbnQgcGF0aAorICAgICAgICAgICAgICAgIGRzdC5idWZmZXJJZCA9IEJVRkZFUl9JRF9OT19CVUZGRVI7CisgICAgICAgICAgICAgICAgZHN0LmJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgZHN0LmFjcXVpcmVGZW5jZSA9IG51bGxwdHI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogY2Fubm90IHNlbmQgYSBudWxsIGJ1ZmZlciBpbiBjYXB0dXJlIHJlcXVlc3QhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZHN0LmFjcXVpcmVGZW5jZSA9IGFjcXVpcmVGZW5jZTsKKyAgICAgICAgICAgIGRzdC5zdHJlYW1JZCA9IHN0cmVhbUlkOworICAgICAgICAgICAgZHN0LnN0YXR1cyA9IEJ1ZmZlclN0YXR1czo6T0s7CiAgICAgICAgICAgICBkc3QucmVsZWFzZUZlbmNlID0gbnVsbHB0cjsKIAogICAgICAgICAgICAgcHVzaEluZmxpZ2h0QnVmZmVyTG9ja2VkKGNhcHR1cmVSZXF1ZXN0LT5mcmFtZU51bWJlciwgc3RyZWFtSWQsCiAgICAgICAgICAgICAgICAgICAgIHNyYy0+YnVmZmVyLCBzcmMtPmFjcXVpcmVfZmVuY2UpOwogICAgICAgICB9CiAgICAgfQorICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpwcm9jZXNzQmF0Y2hDYXB0dXJlUmVxdWVzdHMoCkBAIC0zODUwLDEyICs0MzE1LDE3IEBACiAgICAgfQogICAgIHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+IGhhbmRsZXNDcmVhdGVkOwogCisgICAgc3RhdHVzX3QgcmVzID0gT0s7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBiYXRjaFNpemU7IGkrKykgewogICAgICAgICBpZiAoaGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHdyYXBBc0hpZGxSZXF1ZXN0KHJlcXVlc3RzW2ldLCAvKm91dCovJmNhcHR1cmVSZXF1ZXN0c18zXzRbaV0udjNfMiwKKyAgICAgICAgICAgIHJlcyA9IHdyYXBBc0hpZGxSZXF1ZXN0KHJlcXVlc3RzW2ldLCAvKm91dCovJmNhcHR1cmVSZXF1ZXN0c18zXzRbaV0udjNfMiwKICAgICAgICAgICAgICAgICAgICAgLypvdXQqLyZoYW5kbGVzQ3JlYXRlZCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3cmFwQXNIaWRsUmVxdWVzdChyZXF1ZXN0c1tpXSwgLypvdXQqLyZjYXB0dXJlUmVxdWVzdHNbaV0sIC8qb3V0Ki8maGFuZGxlc0NyZWF0ZWQpOworICAgICAgICAgICAgcmVzID0gd3JhcEFzSGlkbFJlcXVlc3QocmVxdWVzdHNbaV0sCisgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8mY2FwdHVyZVJlcXVlc3RzW2ldLCAvKm91dCovJmhhbmRsZXNDcmVhdGVkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zOTM3LDE4ICs0NDA3LDE3IEBACiAgICAgfQogCiAgICAgaGFyZHdhcmU6OmRldGFpbHM6OnJldHVybl9zdGF0dXMgZXJyOworICAgIGF1dG8gcmVzdWx0Q2FsbGJhY2sgPQorICAgICAgICBbJnN0YXR1cywgJm51bVJlcXVlc3RQcm9jZXNzZWRdIChhdXRvIHMsIHVpbnQzMl90IG4pIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgICpudW1SZXF1ZXN0UHJvY2Vzc2VkID0gbjsKKyAgICAgICAgfTsKICAgICBpZiAoaGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKICAgICAgICAgZXJyID0gaGlkbFNlc3Npb25fM180LT5wcm9jZXNzQ2FwdHVyZVJlcXVlc3RfM180KGNhcHR1cmVSZXF1ZXN0c18zXzQsIGNhY2hlc1RvUmVtb3ZlLAotICAgICAgICAgICAgWyZzdGF0dXMsICZudW1SZXF1ZXN0UHJvY2Vzc2VkXSAoYXV0byBzLCB1aW50MzJfdCBuKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gczsKLSAgICAgICAgICAgICAgICAqbnVtUmVxdWVzdFByb2Nlc3NlZCA9IG47Ci0gICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdENhbGxiYWNrKTsKICAgICB9IGVsc2UgewogICAgICAgICBlcnIgPSBtSGlkbFNlc3Npb24tPnByb2Nlc3NDYXB0dXJlUmVxdWVzdChjYXB0dXJlUmVxdWVzdHMsIGNhY2hlc1RvUmVtb3ZlLAotICAgICAgICAgICAgWyZzdGF0dXMsICZudW1SZXF1ZXN0UHJvY2Vzc2VkXSAoYXV0byBzLCB1aW50MzJfdCBuKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gczsKLSAgICAgICAgICAgICAgICAqbnVtUmVxdWVzdFByb2Nlc3NlZCA9IG47Ci0gICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Q2FsbGJhY2spOwogICAgIH0KICAgICBpZiAoIWVyci5pc09rKCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwpAQCAtNDAxOSw2ICs0NDg4LDIwIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAordm9pZCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OnNpZ25hbFBpcGVsaW5lRHJhaW4oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgc3RyZWFtSWRzKSB7CisgICAgQVRSQUNFX05BTUUoIkNhbWVyYUhhbDo6c2lnbmFsUGlwZWxpbmVEcmFpbiIpOworICAgIGlmICghdmFsaWQoKSB8fCBtSGlkbFNlc3Npb25fM181ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzIGNhbGxlZCBvbiBpbnZhbGlkIGNhbWVyYSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb25fM181LT5zaWduYWxTdHJlYW1GbHVzaChzdHJlYW1JZHMsIG1OZXh0U3RyZWFtQ29uZmlnQ291bnRlcik7CisgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30KKwogdm9pZCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmdldEluZmxpZ2h0QnVmZmVyS2V5cygKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+Piogb3V0KSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUluZmxpZ2h0TG9jayk7CkBAIC00MDU5LDYgKzQ1NDIsMzMgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6cHVzaEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcigKKyAgICAgICAgdWludDY0X3QgYnVmZmVySWQsIGJ1ZmZlcl9oYW5kbGVfdCogYnVmKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlcXVlc3RlZEJ1ZmZlcnNMb2NrKTsKKyAgICBhdXRvIHBhaXIgPSBtUmVxdWVzdGVkQnVmZmVycy5pbnNlcnQoe2J1ZmZlcklkLCBidWZ9KTsKKyAgICBpZiAoIXBhaXIuc2Vjb25kKSB7CisgICAgICAgIEFMT0dFKCIlczogYnVmSWQgJSIgUFJJdTY0ICIgaXMgYWxyZWFkeSBpbmZsaWdodCEiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmZmVySWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIEZpbmQgYW5kIHBvcCBhIGJ1ZmZlcl9oYW5kbGVfdCBiYXNlZCBvbiBidWZmZXJJZAorc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpwb3BJbmZsaWdodFJlcXVlc3RCdWZmZXIoCisgICAgICAgIHVpbnQ2NF90IGJ1ZmZlcklkLCAvKm91dCovIGJ1ZmZlcl9oYW5kbGVfdCAqKmJ1ZmZlcikgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZXF1ZXN0ZWRCdWZmZXJzTG9jayk7CisgICAgYXV0byBpdCA9IG1SZXF1ZXN0ZWRCdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgIGlmIChpdCA9PSBtUmVxdWVzdGVkQnVmZmVycy5lbmQoKSkgeworICAgICAgICBBTE9HRSgiJXM6IGJ1ZklkICUiIFBSSXU2NCAiIGlzIG5vdCBpbmZsaWdodCEiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmZmVySWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICAqYnVmZmVyID0gaXQtPnNlY29uZDsKKyAgICBtUmVxdWVzdGVkQnVmZmVycy5lcmFzZShpdCk7CisgICAgcmV0dXJuIE9LOworfQorCiBzdGQ6OnBhaXI8Ym9vbCwgdWludDY0X3Q+IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6Z2V0QnVmZmVySWQoCiAgICAgICAgIGNvbnN0IGJ1ZmZlcl9oYW5kbGVfdCYgYnVmLCBpbnQgc3RyZWFtSWQpIHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQnVmZmVySWRNYXBMb2NrKTsKQEAgLTQxMDcsNyArNDYxNyw4IEBACiAKIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OlJlcXVlc3RUaHJlYWQod3A8Q2FtZXJhM0RldmljZT4gcGFyZW50LAogICAgICAgICBzcDxTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyLAotICAgICAgICBzcDxIYWxJbnRlcmZhY2U+IGludGVyZmFjZSwgY29uc3QgVmVjdG9yPGludDMyX3Q+JiBzZXNzaW9uUGFyYW1LZXlzKSA6CisgICAgICAgIHNwPEhhbEludGVyZmFjZT4gaW50ZXJmYWNlLCBjb25zdCBWZWN0b3I8aW50MzJfdD4mIHNlc3Npb25QYXJhbUtleXMsCisgICAgICAgIGJvb2wgdXNlSGFsQnVmTWFuYWdlcikgOgogICAgICAgICBUaHJlYWQoLypjYW5DYWxsSmF2YSovZmFsc2UpLAogICAgICAgICBtUGFyZW50KHBhcmVudCksCiAgICAgICAgIG1TdGF0dXNUcmFja2VyKHN0YXR1c1RyYWNrZXIpLApAQCAtNDExNyw2ICs0NjI4LDcgQEAKICAgICAgICAgbVJlY29uZmlndXJlZChmYWxzZSksCiAgICAgICAgIG1Eb1BhdXNlKGZhbHNlKSwKICAgICAgICAgbVBhdXNlZCh0cnVlKSwKKyAgICAgICAgbU5vdGlmeVBpcGVsaW5lRHJhaW4oZmFsc2UpLAogICAgICAgICBtRnJhbWVOdW1iZXIoMCksCiAgICAgICAgIG1MYXRlc3RSZXF1ZXN0SWQoTkFNRV9OT1RfRk9VTkQpLAogICAgICAgICBtQ3VycmVudEFmVHJpZ2dlcklkKDApLApAQCAtNDEyNyw3ICs0NjM5LDggQEAKICAgICAgICAgbUNvbnN0cmFpbmVkTW9kZShmYWxzZSksCiAgICAgICAgIG1SZXF1ZXN0TGF0ZW5jeShrUmVxdWVzdExhdGVuY3lCaW5TaXplKSwKICAgICAgICAgbVNlc3Npb25QYXJhbUtleXMoc2Vzc2lvblBhcmFtS2V5cyksCi0gICAgICAgIG1MYXRlc3RTZXNzaW9uUGFyYW1zKHNlc3Npb25QYXJhbUtleXMuc2l6ZSgpKSB7CisgICAgICAgIG1MYXRlc3RTZXNzaW9uUGFyYW1zKHNlc3Npb25QYXJhbUtleXMuc2l6ZSgpKSwKKyAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIodXNlSGFsQnVmTWFuYWdlcikgewogICAgIG1TdGF0dXNJZCA9IHN0YXR1c1RyYWNrZXItPmFkZENvbXBvbmVudCgpOwogfQogCkBAIC00NzQyLDYgKzUyNTUsMTMgQEAKICAgICBuc2Vjc190IHRSZXF1ZXN0RW5kID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwogICAgIG1SZXF1ZXN0TGF0ZW5jeS5hZGQodFJlcXVlc3RTdGFydCwgdFJlcXVlc3RFbmQpOwogCisgICAgaWYgKHN1Ym1pdFJlcXVlc3RTdWNjZXNzKSB7CisgICAgICAgIHNwPENhbWVyYTNEZXZpY2U+IHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgICAgICBpZiAocGFyZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHBhcmVudC0+bVJlcXVlc3RCdWZmZXJTTS5vblJlcXVlc3RTdWJtaXR0ZWQoKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGlmICh1c2VGbHVzaExvY2spIHsKICAgICAgICAgbUZsdXNoTG9jay51bmxvY2soKTsKICAgICB9CkBAIC00NzU4LDYgKzUyNzgsNyBAQAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6cHJlcGFyZUhhbFJlcXVlc3RzKCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKKyAgICBib29sIGJhdGNoZWRSZXF1ZXN0ID0gbU5leHRSZXF1ZXN0c1swXS5jYXB0dXJlUmVxdWVzdC0+bUJhdGNoU2l6ZSA+IDE7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTmV4dFJlcXVlc3RzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGF1dG8mIG5leHRSZXF1ZXN0ID0gbU5leHRSZXF1ZXN0cy5lZGl0SXRlbUF0KGkpOwogICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gY2FwdHVyZVJlcXVlc3QgPSBuZXh0UmVxdWVzdC5jYXB0dXJlUmVxdWVzdDsKQEAgLTQ3ODEsNyArNTMwMiwxMCBAQAogICAgICAgICBtUHJldlRyaWdnZXJzID0gdHJpZ2dlckNvdW50OwogCiAgICAgICAgIC8vIElmIHRoZSByZXF1ZXN0IGlzIHRoZSBzYW1lIGFzIGxhc3QsIG9yIHdlIGhhZCB0cmlnZ2VycyBsYXN0IHRpbWUKLSAgICAgICAgYm9vbCBuZXdSZXF1ZXN0ID0gbVByZXZSZXF1ZXN0ICE9IGNhcHR1cmVSZXF1ZXN0IHx8IHRyaWdnZXJzTWl4ZWRJbjsKKyAgICAgICAgYm9vbCBuZXdSZXF1ZXN0ID0gKG1QcmV2UmVxdWVzdCAhPSBjYXB0dXJlUmVxdWVzdCB8fCB0cmlnZ2Vyc01peGVkSW4pICYmCisgICAgICAgICAgICAgICAgLy8gUmVxdWVzdCBzZXR0aW5ncyBhcmUgYWxsIHRoZSBzYW1lIHdpdGhpbiBvbmUgYmF0Y2gsIHNvIG9ubHkgdHJlYXQgdGhlIGZpcnN0CisgICAgICAgICAgICAgICAgLy8gcmVxdWVzdCBpbiBhIGJhdGNoIGFzIG5ldworICAgICAgICAgICAgICAgICEoYmF0Y2hlZFJlcXVlc3QgJiYgaSA+IDApOwogICAgICAgICBpZiAobmV3UmVxdWVzdCkgewogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiBIQUwgd29ya2Fyb3VuZDoKQEAgLTQ4ODIsOCArNTQwNiwxMSBAQAogICAgICAgICB9CiAgICAgICAgIG5zZWNzX3Qgd2FpdER1cmF0aW9uID0ga0Jhc2VHZXRCdWZmZXJXYWl0ICsgcGFyZW50LT5nZXRFeHBlY3RlZEluRmxpZ2h0RHVyYXRpb24oKTsKIAorICAgICAgICBTdXJmYWNlTWFwIHVuaXF1ZVN1cmZhY2VJZE1hcDsKICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBjYXB0dXJlUmVxdWVzdC0+bU91dHB1dFN0cmVhbXMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IG91dHB1dFN0cmVhbSA9IGNhcHR1cmVSZXF1ZXN0LT5tT3V0cHV0U3RyZWFtcy5lZGl0SXRlbUF0KGopOworICAgICAgICAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gb3V0cHV0U3RyZWFtID0KKyAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1PdXRwdXRTdHJlYW1zLmVkaXRJdGVtQXQoaik7CisgICAgICAgICAgICBpbnQgc3RyZWFtSWQgPSBvdXRwdXRTdHJlYW0tPmdldElkKCk7CiAKICAgICAgICAgICAgIC8vIFByZXBhcmUgdmlkZW8gYnVmZmVycyBmb3IgaGlnaCBzcGVlZCByZWNvcmRpbmcgb24gdGhlIGZpcnN0IHZpZGVvIHJlcXVlc3QuCiAgICAgICAgICAgICBpZiAobVByZXBhcmVWaWRlb1N0cmVhbSAmJiBvdXRwdXRTdHJlYW0tPmlzVmlkZW9TdHJlYW0oKSkgewpAQCAtNDkwMiwxNyArNTQyOSw0NSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcmVzID0gb3V0cHV0U3RyZWFtLT5nZXRCdWZmZXIoJm91dHB1dEJ1ZmZlcnMtPmVkaXRJdGVtQXQoaiksCi0gICAgICAgICAgICAgICAgICAgIHdhaXREdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1PdXRwdXRTdXJmYWNlc1tqXSk7Ci0gICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2FuJ3QgZ2V0IG91dHB1dCBidWZmZXIgZnJvbSBncmFsbG9jIHF1ZXVlIC0gdGhpcyBjb3VsZCBiZSBkdWUgdG8KLSAgICAgICAgICAgICAgICAvLyBhYmFuZG9uZWQgcXVldWUgb3Igb3RoZXIgY29uc3VtZXIgbWlzYmVoYXZpb3IsIHNvIG5vdCBhIGZhdGFsCi0gICAgICAgICAgICAgICAgLy8gZXJyb3IKLSAgICAgICAgICAgICAgICBBTE9HRSgiUmVxdWVzdFRocmVhZDogQ2FuJ3QgZ2V0IG91dHB1dCBidWZmZXIsIHNraXBwaW5nIHJlcXVlc3Q6IgotICAgICAgICAgICAgICAgICAgICAgICAgIiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+IHVuaXF1ZVN1cmZhY2VJZHM7CisgICAgICAgICAgICByZXMgPSBvdXRwdXRTdHJlYW0tPmdldFVuaXF1ZVN1cmZhY2VJZHMoCisgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tT3V0cHV0U3VyZmFjZXNbc3RyZWFtSWRdLAorICAgICAgICAgICAgICAgICAgICAmdW5pcXVlU3VyZmFjZUlkcyk7CisgICAgICAgICAgICAvLyBJTlZBTElEX09QRVJBVElPTiBpcyBub3JtYWwgb3V0cHV0IGZvciBzdHJlYW1zIG5vdCBzdXBwb3J0aW5nIHN1cmZhY2VJZHMKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0sgJiYgcmVzICE9IElOVkFMSURfT1BFUkFUSU9OKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gcXVlcnkgc3RyZWFtICVkIHVuaXF1ZSBzdXJmYWNlIElEcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlcyA9PSBPSykgeworICAgICAgICAgICAgICAgIHVuaXF1ZVN1cmZhY2VJZE1hcC5pbnNlcnQoe3N0cmVhbUlkLCBzdGQ6Om1vdmUodW5pcXVlU3VyZmFjZUlkcyl9KTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIHJldHVybiBUSU1FRF9PVVQ7CisgICAgICAgICAgICBpZiAobVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtLT5pc0FiYW5kb25lZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogc3RyZWFtICVkIGlzIGFiYW5kb25lZC4iLCBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRJTUVEX09VVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gSEFMIHdpbGwgcmVxdWVzdCBidWZmZXIgdGhyb3VnaCByZXF1ZXN0U3RyZWFtQnVmZmVyIEFQSQorICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90JiBidWZmZXIgPSBvdXRwdXRCdWZmZXJzLT5lZGl0SXRlbUF0KGopOworICAgICAgICAgICAgICAgIGJ1ZmZlci5zdHJlYW0gPSBvdXRwdXRTdHJlYW0tPmFzSGFsU3RyZWFtKCk7CisgICAgICAgICAgICAgICAgYnVmZmVyLmJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgYnVmZmVyLnN0YXR1cyA9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19PSzsKKyAgICAgICAgICAgICAgICBidWZmZXIuYWNxdWlyZV9mZW5jZSA9IC0xOworICAgICAgICAgICAgICAgIGJ1ZmZlci5yZWxlYXNlX2ZlbmNlID0gLTE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcyA9IG91dHB1dFN0cmVhbS0+Z2V0QnVmZmVyKCZvdXRwdXRCdWZmZXJzLT5lZGl0SXRlbUF0KGopLAorICAgICAgICAgICAgICAgICAgICAgICAgd2FpdER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1PdXRwdXRTdXJmYWNlc1tzdHJlYW1JZF0pOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2FuJ3QgZ2V0IG91dHB1dCBidWZmZXIgZnJvbSBncmFsbG9jIHF1ZXVlIC0gdGhpcyBjb3VsZCBiZSBkdWUgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gYWJhbmRvbmVkIHF1ZXVlIG9yIG90aGVyIGNvbnN1bWVyIG1pc2JlaGF2aW9yLCBzbyBub3QgYSBmYXRhbAorICAgICAgICAgICAgICAgICAgICAvLyBlcnJvcgorICAgICAgICAgICAgICAgICAgICBBTE9HRSgiUmVxdWVzdFRocmVhZDogQ2FuJ3QgZ2V0IG91dHB1dCBidWZmZXIsIHNraXBwaW5nIHJlcXVlc3Q6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUSU1FRF9PVVQ7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBTdHJpbmc4IHBoeXNpY2FsQ2FtZXJhSWQgPSBvdXRwdXRTdHJlYW0tPmdldFBoeXNpY2FsQ2FtZXJhSWQoKTsKQEAgLTQ5MzQsMTUgKzU0ODksMzIgQEAKICAgICAgICAgLy8gcHJldmlldyksIGFuZCB0aGUgY3VycmVudCByZXF1ZXN0IGlzIG5vdCB0aGUgbGFzdCBvbmUgaW4gdGhlIGJhdGNoLAogICAgICAgICAvLyBkbyBub3Qgc2VuZCBjYWxsYmFjayB0byB0aGUgYXBwLgogICAgICAgICBib29sIGhhc0NhbGxiYWNrID0gdHJ1ZTsKLSAgICAgICAgaWYgKG1OZXh0UmVxdWVzdHNbMF0uY2FwdHVyZVJlcXVlc3QtPm1CYXRjaFNpemUgPiAxICYmIGkgIT0gbU5leHRSZXF1ZXN0cy5zaXplKCktMSkgeworICAgICAgICBpZiAoYmF0Y2hlZFJlcXVlc3QgJiYgaSAhPSBtTmV4dFJlcXVlc3RzLnNpemUoKS0xKSB7CiAgICAgICAgICAgICBoYXNDYWxsYmFjayA9IGZhbHNlOwogICAgICAgICB9CisgICAgICAgIGJvb2wgaXNTdGlsbENhcHR1cmUgPSBmYWxzZTsKKyAgICAgICAgYm9vbCBpc1pzbENhcHR1cmUgPSBmYWxzZTsKKyAgICAgICAgaWYgKCFtTmV4dFJlcXVlc3RzWzBdLmNhcHR1cmVSZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LmJlZ2luKCktPm1ldGFkYXRhLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZSA9IGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90KCk7CisgICAgICAgICAgICBmaW5kX2NhbWVyYV9tZXRhZGF0YV9yb19lbnRyeShoYWxSZXF1ZXN0LT5zZXR0aW5ncywgQU5EUk9JRF9DT05UUk9MX0NBUFRVUkVfSU5URU5ULCAmZSk7CisgICAgICAgICAgICBpZiAoKGUuY291bnQgPiAwKSAmJiAoZS5kYXRhLnU4WzBdID09IEFORFJPSURfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVF9TVElMTF9DQVBUVVJFKSkgeworICAgICAgICAgICAgICAgIGlzU3RpbGxDYXB0dXJlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBBVFJBQ0VfQVNZTkNfQkVHSU4oInN0aWxsIGNhcHR1cmUiLCBtTmV4dFJlcXVlc3RzW2ldLmhhbFJlcXVlc3QuZnJhbWVfbnVtYmVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluZF9jYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkoaGFsUmVxdWVzdC0+c2V0dGluZ3MsIEFORFJPSURfQ09OVFJPTF9FTkFCTEVfWlNMLCAmZSk7CisgICAgICAgICAgICBpZiAoKGUuY291bnQgPiAwKSAmJiAoZS5kYXRhLnU4WzBdID09IEFORFJPSURfQ09OVFJPTF9FTkFCTEVfWlNMX1RSVUUpKSB7CisgICAgICAgICAgICAgICAgaXNac2xDYXB0dXJlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICByZXMgPSBwYXJlbnQtPnJlZ2lzdGVySW5GbGlnaHQoaGFsUmVxdWVzdC0+ZnJhbWVfbnVtYmVyLAogICAgICAgICAgICAgICAgIHRvdGFsTnVtQnVmZmVycywgY2FwdHVyZVJlcXVlc3QtPm1SZXN1bHRFeHRyYXMsCiAgICAgICAgICAgICAgICAgLypoYXNJbnB1dCovaGFsUmVxdWVzdC0+aW5wdXRfYnVmZmVyICE9IE5VTEwsCiAgICAgICAgICAgICAgICAgaGFzQ2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgY2FsY3VsYXRlTWF4RXhwZWN0ZWREdXJhdGlvbihoYWxSZXF1ZXN0LT5zZXR0aW5ncyksCi0gICAgICAgICAgICAgICAgcmVxdWVzdGVkUGh5c2ljYWxDYW1lcmFzKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0ZWRQaHlzaWNhbENhbWVyYXMsIGlzU3RpbGxDYXB0dXJlLCBpc1pzbENhcHR1cmUsCisgICAgICAgICAgICAgICAgKG1Vc2VIYWxCdWZNYW5hZ2VyKSA/IHVuaXF1ZVN1cmZhY2VJZE1hcCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cmZhY2VNYXB7fSk7CiAgICAgICAgIEFMT0dWVigiJXM6IHJlZ2lzdGVyZWQgaW4gZmxpZ2h0IHJlcXVlc3RJZCA9ICUiIFBSSWQzMiAiLCBmcmFtZU51bWJlciA9ICUiIFBSSWQ2NAogICAgICAgICAgICAgICAgIiwgYnVyc3RJZCA9ICUiIFBSSWQzMiAiLiIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLApAQCAtNTAxOCw3ICs1NTkwLDcgQEAKICAgICAgICAgICAgIGlmIChzLmZpcnN0ID09IHN0cmVhbUlkKSB7CiAgICAgICAgICAgICAgICAgY29uc3QgYXV0byAmaXQgPSBzdGQ6OmZpbmQocy5zZWNvbmQuYmVnaW4oKSwgcy5zZWNvbmQuZW5kKCksIHN1cmZhY2VJZCk7CiAgICAgICAgICAgICAgICAgaWYgKGl0ICE9IHMuc2Vjb25kLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC01MDI5LDcgKzU2MDEsNyBAQAogICAgICAgICAgICAgaWYgKHMuZmlyc3QgPT0gc3RyZWFtSWQpIHsKICAgICAgICAgICAgICAgICBjb25zdCBhdXRvICZpdCA9IHN0ZDo6ZmluZChzLnNlY29uZC5iZWdpbigpLCBzLnNlY29uZC5lbmQoKSwgc3VyZmFjZUlkKTsKICAgICAgICAgICAgICAgICBpZiAoaXQgIT0gcy5zZWNvbmQuZW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTUwMzgsNiArNTYxMCwyMiBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAordm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpzaWduYWxQaXBlbGluZURyYWluKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHN0cmVhbUlkcykgeworICAgIGlmICghbVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgQUxPR0UoIiVzIGNhbGxlZCBmb3IgY2FtZXJhIGRldmljZSBub3Qgc3VwcG9ydGluZyBIQUwgYnVmZmVyIG1hbmFnZW1lbnQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIHBsKG1QYXVzZUxvY2spOworICAgIGlmIChtUGF1c2VkKSB7CisgICAgICAgIG1JbnRlcmZhY2UtPnNpZ25hbFBpcGVsaW5lRHJhaW4oc3RyZWFtSWRzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBJZiByZXF1ZXN0IHRocmVhZCBpcyBzdGlsbCBidXN5LCB3YWl0IHVudGlsIHBhdXNlZCB0aGVuIG5vdGlmeSBIQUwKKyAgICBtTm90aWZ5UGlwZWxpbmVEcmFpbiA9IHRydWU7CisgICAgbVN0cmVhbUlkc1RvQmVEcmFpbmVkID0gc3RyZWFtSWRzOworfQorCiBuc2Vjc190IENhbWVyYTNEZXZpY2U6OmdldEV4cGVjdGVkSW5GbGlnaHREdXJhdGlvbigpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBhbChtSW5GbGlnaHRMb2NrKTsKQEAgLTUyMTUsNiArNTgwMywxNSBAQAogICAgICAgICAgICAgICAgIGlmIChzdGF0dXNUcmFja2VyICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzVHJhY2tlci0+bWFya0NvbXBvbmVudElkbGUobVN0YXR1c0lkLCBGZW5jZTo6Tk9fRkVOQ0UpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobU5vdGlmeVBpcGVsaW5lRHJhaW4pIHsKKyAgICAgICAgICAgICAgICAgICAgbUludGVyZmFjZS0+c2lnbmFsUGlwZWxpbmVEcmFpbihtU3RyZWFtSWRzVG9CZURyYWluZWQpOworICAgICAgICAgICAgICAgICAgICBtTm90aWZ5UGlwZWxpbmVEcmFpbiA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBtU3RyZWFtSWRzVG9CZURyYWluZWQuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmVudC0+bVJlcXVlc3RCdWZmZXJTTS5vblJlcXVlc3RUaHJlYWRQYXVzZWQoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBTdG9wIHdhaXRpbmcgZm9yIG5vdyBhbmQgbGV0IHRocmVhZCBtYW5hZ2VtZW50IGhhcHBlbgogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC01Mjk5LDYgKzU4OTYsMTUgQEAKICAgICAgICAgICAgIGlmIChzdGF0dXNUcmFja2VyICE9IDApIHsKICAgICAgICAgICAgICAgICBzdGF0dXNUcmFja2VyLT5tYXJrQ29tcG9uZW50SWRsZShtU3RhdHVzSWQsIEZlbmNlOjpOT19GRU5DRSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobU5vdGlmeVBpcGVsaW5lRHJhaW4pIHsKKyAgICAgICAgICAgICAgICBtSW50ZXJmYWNlLT5zaWduYWxQaXBlbGluZURyYWluKG1TdHJlYW1JZHNUb0JlRHJhaW5lZCk7CisgICAgICAgICAgICAgICAgbU5vdGlmeVBpcGVsaW5lRHJhaW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtU3RyZWFtSWRzVG9CZURyYWluZWQuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPENhbWVyYTNEZXZpY2U+IHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcGFyZW50LT5tUmVxdWVzdEJ1ZmZlclNNLm9uUmVxdWVzdFRocmVhZFBhdXNlZCgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcmVzID0gbURvUGF1c2VTaWduYWwud2FpdFJlbGF0aXZlKG1QYXVzZUxvY2ssIGtSZXF1ZXN0VGltZW91dCk7CkBAIC01NzU0LDIzICs2MzYwLDE3MiBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi0vKioKLSAqIFN0YXRpYyBjYWxsYmFjayBmb3J3YXJkaW5nIG1ldGhvZHMgZnJvbSBIQUwgdG8gaW5zdGFuY2UKLSAqLworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZTo6aW5pdGlhbGl6ZSgKKyAgICAgICAgc3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlcikgeworICAgIGlmIChzdGF0dXNUcmFja2VyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBzdGF0dXNUcmFja2VyIGlzIG51bGwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KIAotdm9pZCBDYW1lcmEzRGV2aWNlOjpzUHJvY2Vzc0NhcHR1cmVSZXN1bHQoY29uc3QgY2FtZXJhM19jYWxsYmFja19vcHMgKmNiLAotICAgICAgICBjb25zdCBjYW1lcmEzX2NhcHR1cmVfcmVzdWx0ICpyZXN1bHQpIHsKLSAgICBDYW1lcmEzRGV2aWNlICpkID0KLSAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Q2FtZXJhM0RldmljZSo+KHN0YXRpY19jYXN0PGNvbnN0IENhbWVyYTNEZXZpY2UqPihjYikpOwotCi0gICAgZC0+cHJvY2Vzc0NhcHR1cmVSZXN1bHQocmVzdWx0KTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgbVN0YXR1c1RyYWNrZXIgPSBzdGF0dXNUcmFja2VyOworICAgIG1SZXF1ZXN0QnVmZmVyU3RhdHVzSWQgPSBzdGF0dXNUcmFja2VyLT5hZGRDb21wb25lbnQoKTsKKyAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgQ2FtZXJhM0RldmljZTo6c05vdGlmeShjb25zdCBjYW1lcmEzX2NhbGxiYWNrX29wcyAqY2IsCi0gICAgICAgIGNvbnN0IGNhbWVyYTNfbm90aWZ5X21zZyAqbXNnKSB7Ci0gICAgQ2FtZXJhM0RldmljZSAqZCA9Ci0gICAgICAgICAgICBjb25zdF9jYXN0PENhbWVyYTNEZXZpY2UqPihzdGF0aWNfY2FzdDxjb25zdCBDYW1lcmEzRGV2aWNlKj4oY2IpKTsKLSAgICBkLT5ub3RpZnkobXNnKTsKK2Jvb2wgQ2FtZXJhM0RldmljZTo6UmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZTo6c3RhcnRSZXF1ZXN0QnVmZmVyKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVN0YXR1cyA9PSBSQl9TVEFUVVNfUkVBRFkgfHwgbVN0YXR1cyA9PSBSQl9TVEFUVVNfUEVORElOR19TVE9QKSB7CisgICAgICAgIG1SZXF1ZXN0QnVmZmVyT25nb2luZyA9IHRydWU7CisgICAgICAgIG5vdGlmeVRyYWNrZXJMb2NrZWQoLyphY3RpdmUqL3RydWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6OmVuZFJlcXVlc3RCdWZmZXIoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGlmICghbVJlcXVlc3RCdWZmZXJPbmdvaW5nKSB7CisgICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgd2l0aG91dCBhIHN1Y2Nlc3NmdWwgc3RhcnRSZXF1ZXN0QnVmZmVyIGNhbGwgZmlyc3QhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtUmVxdWVzdEJ1ZmZlck9uZ29pbmcgPSBmYWxzZTsKKyAgICBpZiAobVN0YXR1cyA9PSBSQl9TVEFUVVNfUEVORElOR19TVE9QKSB7CisgICAgICAgIGNoZWNrU3dpdGNoVG9TdG9wTG9ja2VkKCk7CisgICAgfQorICAgIG5vdGlmeVRyYWNrZXJMb2NrZWQoLyphY3RpdmUqL2ZhbHNlKTsKK30KKwordm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjpvblN0cmVhbXNDb25maWd1cmVkKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBtU3RhdHVzID0gUkJfU1RBVFVTX1JFQURZOworICAgIHJldHVybjsKK30KKwordm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjpvblJlcXVlc3RTdWJtaXR0ZWQoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIG1SZXF1ZXN0VGhyZWFkUGF1c2VkID0gZmFsc2U7CisgICAgbUluZmxpZ2h0TWFwRW1wdHkgPSBmYWxzZTsKKyAgICBpZiAobVN0YXR1cyA9PSBSQl9TVEFUVVNfU1RPUFBFRCkgeworICAgICAgICBtU3RhdHVzID0gUkJfU1RBVFVTX1JFQURZOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZTo6b25SZXF1ZXN0VGhyZWFkUGF1c2VkKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBtUmVxdWVzdFRocmVhZFBhdXNlZCA9IHRydWU7CisgICAgaWYgKG1TdGF0dXMgPT0gUkJfU1RBVFVTX1BFTkRJTkdfU1RPUCkgeworICAgICAgICBjaGVja1N3aXRjaFRvU3RvcExvY2tlZCgpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZTo6b25JbmZsaWdodE1hcEVtcHR5KCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBtSW5mbGlnaHRNYXBFbXB0eSA9IHRydWU7CisgICAgaWYgKG1TdGF0dXMgPT0gUkJfU1RBVFVTX1BFTkRJTkdfU1RPUCkgeworICAgICAgICBjaGVja1N3aXRjaFRvU3RvcExvY2tlZCgpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZTo6b25XYWl0VW50aWxJZGxlKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBpZiAoIWNoZWNrU3dpdGNoVG9TdG9wTG9ja2VkKCkpIHsKKyAgICAgICAgbVN0YXR1cyA9IFJCX1NUQVRVU19QRU5ESU5HX1NUT1A7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjpub3RpZnlUcmFja2VyTG9ja2VkKGJvb2wgYWN0aXZlKSB7CisgICAgc3A8U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciA9IG1TdGF0dXNUcmFja2VyLnByb21vdGUoKTsKKyAgICBpZiAoc3RhdHVzVHJhY2tlciAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChhY3RpdmUpIHsKKyAgICAgICAgICAgIHN0YXR1c1RyYWNrZXItPm1hcmtDb21wb25lbnRBY3RpdmUobVJlcXVlc3RCdWZmZXJTdGF0dXNJZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXNUcmFja2VyLT5tYXJrQ29tcG9uZW50SWRsZShtUmVxdWVzdEJ1ZmZlclN0YXR1c0lkLCBGZW5jZTo6Tk9fRkVOQ0UpOworICAgICAgICB9CisgICAgfQorfQorCitib29sIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6OmNoZWNrU3dpdGNoVG9TdG9wTG9ja2VkKCkgeworICAgIGlmIChtSW5mbGlnaHRNYXBFbXB0eSAmJiBtUmVxdWVzdFRocmVhZFBhdXNlZCAmJiAhbVJlcXVlc3RCdWZmZXJPbmdvaW5nKSB7CisgICAgICAgIG1TdGF0dXMgPSBSQl9TVEFUVVNfU1RPUFBFRDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Zml4dXBNb25vY2hyb21lVGFncyhjb25zdCBDYW1lcmFNZXRhZGF0YSYgZGV2aWNlSW5mbywKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEmIHJlc3VsdE1ldGFkYXRhKSB7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgaWYgKCFtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MpIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvLyBSZW1vdmUgdGFncyB0aGF0IGFyZSBub3QgYXBwbGljYWJsZSB0byBtb25vY2hyb21lIGNhbWVyYS4KKyAgICBpbnQzMl90IHRhZ3NUb1JlbW92ZVtdID0geworICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9HUkVFTl9TUExJVCwKKyAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfTkVVVFJBTF9DT0xPUl9QT0lOVCwKKyAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX01PREUsCisgICAgICAgICAgIEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9UUkFOU0ZPUk0sCisgICAgICAgICAgIEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9HQUlOUywKKyAgICB9OworICAgIGZvciAoYXV0byB0YWcgOiB0YWdzVG9SZW1vdmUpIHsKKyAgICAgICAgcmVzID0gcmVzdWx0TWV0YWRhdGEuZXJhc2UodGFnKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVtb3ZlIHRhZyAlZCBmb3IgbW9ub2Nocm9tZSBjYW1lcmEiLCBfX0ZVTkNUSU9OX18sIHRhZyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQU5EUk9JRF9TRU5TT1JfRFlOQU1JQ19CTEFDS19MRVZFTAorICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBibEVudHJ5ID0gcmVzdWx0TWV0YWRhdGEuZmluZChBTkRST0lEX1NFTlNPUl9EWU5BTUlDX0JMQUNLX0xFVkVMKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IGJsRW50cnkuY291bnQ7IGkrKykgeworICAgICAgICBibEVudHJ5LmRhdGEuZltpXSA9IGJsRW50cnkuZGF0YS5mWzBdOworICAgIH0KKworICAgIC8vIEFORFJPSURfU0VOU09SX05PSVNFX1BST0ZJTEUKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgbnBFbnRyeSA9IHJlc3VsdE1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TRU5TT1JfTk9JU0VfUFJPRklMRSk7CisgICAgaWYgKG5wRW50cnkuY291bnQgPiAwICYmIG5wRW50cnkuY291bnQgJSAyID09IDApIHsKKyAgICAgICAgZG91YmxlIG5wW10gPSB7bnBFbnRyeS5kYXRhLmRbMF0sIG5wRW50cnkuZGF0YS5kWzFdfTsKKyAgICAgICAgcmVzID0gcmVzdWx0TWV0YWRhdGEudXBkYXRlKEFORFJPSURfU0VOU09SX05PSVNFX1BST0ZJTEUsIG5wLCAyKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHVwZGF0ZSBTRU5TT1JfTk9JU0VfUFJPRklMRTogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQU5EUk9JRF9TVEFUSVNUSUNTX0xFTlNfU0hBRElOR19NQVAKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgbHNTaXplRW50cnkgPSBkZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9MRU5TX0lORk9fU0hBRElOR19NQVBfU0laRSk7CisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGxzRW50cnkgPSByZXN1bHRNZXRhZGF0YS5maW5kKEFORFJPSURfU1RBVElTVElDU19MRU5TX1NIQURJTkdfTUFQKTsKKyAgICBpZiAobHNTaXplRW50cnkuY291bnQgPT0gMiAmJiBsc0VudHJ5LmNvdW50ID4gMAorICAgICAgICAgICAgJiYgKGludDMyX3QpbHNFbnRyeS5jb3VudCA9PSA0ICogbHNTaXplRW50cnkuZGF0YS5pMzJbMF0gKiBsc1NpemVFbnRyeS5kYXRhLmkzMlsxXSkgeworICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBsc1NpemVFbnRyeS5kYXRhLmkzMlswXSAqIGxzU2l6ZUVudHJ5LmRhdGEuaTMyWzFdOyBpKyspIHsKKyAgICAgICAgICAgIGxzRW50cnkuZGF0YS5mWzQqaSsxXSA9IGxzRW50cnkuZGF0YS5mWzQqaV07CisgICAgICAgICAgICBsc0VudHJ5LmRhdGEuZls0KmkrMl0gPSBsc0VudHJ5LmRhdGEuZls0KmldOworICAgICAgICAgICAgbHNFbnRyeS5kYXRhLmZbNCppKzNdID0gbHNFbnRyeS5kYXRhLmZbNCppXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEFORFJPSURfVE9ORU1BUF9DVVJWRV9CTFVFCisgICAgLy8gQU5EUk9JRF9UT05FTUFQX0NVUlZFX0dSRUVOCisgICAgLy8gQU5EUk9JRF9UT05FTUFQX0NVUlZFX1JFRAorICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSB0Y2JFbnRyeSA9IHJlc3VsdE1ldGFkYXRhLmZpbmQoQU5EUk9JRF9UT05FTUFQX0NVUlZFX0JMVUUpOworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSB0Y2dFbnRyeSA9IHJlc3VsdE1ldGFkYXRhLmZpbmQoQU5EUk9JRF9UT05FTUFQX0NVUlZFX0dSRUVOKTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgdGNyRW50cnkgPSByZXN1bHRNZXRhZGF0YS5maW5kKEFORFJPSURfVE9ORU1BUF9DVVJWRV9SRUQpOworICAgIGlmICh0Y2JFbnRyeS5jb3VudCA+IDAKKyAgICAgICAgICAgICYmIHRjYkVudHJ5LmNvdW50ID09IHRjZ0VudHJ5LmNvdW50CisgICAgICAgICAgICAmJiB0Y2JFbnRyeS5jb3VudCA9PSB0Y3JFbnRyeS5jb3VudCkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRjYkVudHJ5LmNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHRjYkVudHJ5LmRhdGEuZltpXSA9IHRjckVudHJ5LmRhdGEuZltpXTsKKyAgICAgICAgICAgIHRjZ0VudHJ5LmRhdGEuZltpXSA9IHRjckVudHJ5LmRhdGEuZltpXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXM7CiB9CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oCmluZGV4IDEzMWQ2MmYuLmU1YTM4YmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oCkBAIC0zMywxMCArMzMsMTEgQEAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy4yL0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuMy9JQ2FtZXJhRGV2aWNlU2Vzc2lvbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjQvSUNhbWVyYURldmljZVNlc3Npb24uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy41L0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy40L0lDYW1lcmFEZXZpY2VDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjUvSUNhbWVyYURldmljZUNhbGxiYWNrLmg+CiAjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYTMuaD4KIAogI2luY2x1ZGUgPGNhbWVyYS9DYXB0dXJlUmVzdWx0Lmg+CiAKQEAgLTUwLDIwICs1MSw2IEBACiAKIHVzaW5nIGFuZHJvaWQ6OmNhbWVyYTM6Ok91dHB1dFN0cmVhbUluZm87CiAKLS8qKgotICogRnVuY3Rpb24gcG9pbnRlciB0eXBlcyB3aXRoIEMgY2FsbGluZyBjb252ZW50aW9uIHRvCi0gKiB1c2UgZm9yIEhBTCBjYWxsYmFjayBmdW5jdGlvbnMuCi0gKi8KLWV4dGVybiAiQyIgewotICAgIHR5cGVkZWYgdm9pZCAoY2FsbGJhY2tzX3Byb2Nlc3NfY2FwdHVyZV9yZXN1bHRfdCkoCi0gICAgICAgIGNvbnN0IHN0cnVjdCBjYW1lcmEzX2NhbGxiYWNrX29wcyAqLAotICAgICAgICBjb25zdCBjYW1lcmEzX2NhcHR1cmVfcmVzdWx0X3QgKik7Ci0KLSAgICB0eXBlZGVmIHZvaWQgKGNhbGxiYWNrc19ub3RpZnlfdCkoCi0gICAgICAgIGNvbnN0IHN0cnVjdCBjYW1lcmEzX2NhbGxiYWNrX29wcyAqLAotICAgICAgICBjb25zdCBjYW1lcmEzX25vdGlmeV9tc2dfdCAqKTsKLX0KLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBuYW1lc3BhY2UgY2FtZXJhMyB7CkBAIC04MCw4ICs2Nyw3IEBACiAgKi8KIGNsYXNzIENhbWVyYTNEZXZpY2UgOgogICAgICAgICAgICAgcHVibGljIENhbWVyYURldmljZUJhc2UsCi0gICAgICAgICAgICB2aXJ0dWFsIHB1YmxpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OklDYW1lcmFEZXZpY2VDYWxsYmFjaywKLSAgICAgICAgICAgIHByaXZhdGUgY2FtZXJhM19jYWxsYmFja19vcHMgeworICAgICAgICAgICAgdmlydHVhbCBwdWJsaWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2sgewogICBwdWJsaWM6CiAKICAgICBleHBsaWNpdCBDYW1lcmEzRGV2aWNlKGNvbnN0IFN0cmluZzgmIGlkKTsKQEAgLTIwOCw4ICsxOTQsMzIgQEAKICAgICAgKi8KICAgICBzdGF0dXNfdCBkcm9wU3RyZWFtQnVmZmVycyhib29sIGRyb3BwaW5nLCBpbnQgc3RyZWFtSWQpIG92ZXJyaWRlOwogCisgICAgLyoqCisgICAgICogSGVscGVyIGZ1bmN0aW9ucyB0byBtYXAgYmV0d2VlbiBmcmFtZXdvcmsgYW5kIEhJREwgdmFsdWVzCisgICAgICovCisgICAgc3RhdGljIGhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdCBtYXBUb1BpeGVsRm9ybWF0KGludCBmcmFtZXdvcmtGb3JtYXQpOworICAgIHN0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkRhdGFzcGFjZUZsYWdzIG1hcFRvSGlkbERhdGFzcGFjZSgKKyAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSk7CisgICAgc3RhdGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyVXNhZ2VGbGFncyBtYXBUb0NvbnN1bWVyVXNhZ2UodWludDY0X3QgdXNhZ2UpOworICAgIHN0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbVJvdGF0aW9uIG1hcFRvU3RyZWFtUm90YXRpb24oCisgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uKTsKKyAgICAvLyBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpZiB0aGUgcGFzc2VkLWluIG9wZXJhdGlvbiBtb2RlIGlzIG5vdCB2YWxpZC4KKyAgICBzdGF0aWMgc3RhdHVzX3QgbWFwVG9TdHJlYW1Db25maWd1cmF0aW9uTW9kZShjYW1lcmEzX3N0cmVhbV9jb25maWd1cmF0aW9uX21vZGVfdCBvcGVyYXRpb25Nb2RlLAorICAgICAgICAgICAgLypvdXQqLyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlICptb2RlKTsKKyAgICBzdGF0aWMgY2FtZXJhM19idWZmZXJfc3RhdHVzX3QgbWFwSGlkbEJ1ZmZlclN0YXR1cygKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyU3RhdHVzIHN0YXR1cyk7CisgICAgc3RhdGljIGludCBtYXBUb0ZyYW1ld29ya0Zvcm1hdChoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQgcGl4ZWxGb3JtYXQpOworICAgIHN0YXRpYyBhbmRyb2lkX2RhdGFzcGFjZSBtYXBUb0ZyYW1ld29ya0RhdGFzcGFjZSgKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6RGF0YXNwYWNlRmxhZ3MpOworICAgIHN0YXRpYyB1aW50NjRfdCBtYXBDb25zdW1lclRvRnJhbWV3b3JrVXNhZ2UoCisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclVzYWdlRmxhZ3MgdXNhZ2UpOworICAgIHN0YXRpYyB1aW50NjRfdCBtYXBQcm9kdWNlclRvRnJhbWV3b3JrVXNhZ2UoCisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclVzYWdlRmxhZ3MgdXNhZ2UpOworCiAgIHByaXZhdGU6CiAKKyAgICBzdGF0dXNfdCBkaXNjb25uZWN0SW1wbCgpOworCiAgICAgLy8gaW50ZXJuYWwgdHlwZWRlZnMKICAgICB1c2luZyBSZXF1ZXN0TWV0YWRhdGFRdWV1ZSA9IGhhcmR3YXJlOjpNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OwogICAgIHVzaW5nIFJlc3VsdE1ldGFkYXRhUXVldWUgID0gaGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT47CkBAIC0yNjgsNyArMjc4LDggQEAKICAgICBjbGFzcyBIYWxJbnRlcmZhY2UgOiBwdWJsaWMgY2FtZXJhMzo6Q2FtZXJhM1N0cmVhbUJ1ZmZlckZyZWVkTGlzdGVuZXIgewogICAgICAgcHVibGljOgogICAgICAgICBIYWxJbnRlcmZhY2Uoc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gJnNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlKTsKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4gcXVldWUsCisgICAgICAgICAgICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIpOwogICAgICAgICBIYWxJbnRlcmZhY2UoY29uc3QgSGFsSW50ZXJmYWNlICZvdGhlcik7CiAgICAgICAgIEhhbEludGVyZmFjZSgpOwogCkBAIC0yOTcsMTQgKzMwOCwyNyBAQAogICAgICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCk7CiAgICAgICAgIHN0YXR1c190IGNsb3NlKCk7CiAKKyAgICAgICAgdm9pZCBzaWduYWxQaXBlbGluZURyYWluKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHN0cmVhbUlkcyk7CisKKyAgICAgICAgLy8gbWV0aG9kIHRvIGV4dHJhY3QgYnVmZmVyJ3MgdW5pcXVlIElECisgICAgICAgIC8vIHJldHVybiBwYWlyIG9mIChuZXdseVNlZW5CdWZmZXI/LCBidWZmZXJJZCkKKyAgICAgICAgc3RkOjpwYWlyPGJvb2wsIHVpbnQ2NF90PiBnZXRCdWZmZXJJZChjb25zdCBidWZmZXJfaGFuZGxlX3QmIGJ1ZiwgaW50IHN0cmVhbUlkKTsKKwogICAgICAgICAvLyBGaW5kIGEgYnVmZmVyX2hhbmRsZV90IGJhc2VkIG9uIGZyYW1lIG51bWJlciBhbmQgc3RyZWFtIElECiAgICAgICAgIHN0YXR1c190IHBvcEluZmxpZ2h0QnVmZmVyKGludDMyX3QgZnJhbWVOdW1iZXIsIGludDMyX3Qgc3RyZWFtSWQsCiAgICAgICAgICAgICAgICAgLypvdXQqLyBidWZmZXJfaGFuZGxlX3QgKipidWZmZXIpOwogCisgICAgICAgIC8vIFJlZ2lzdGVyIGEgYnVmSWQvYnVmZmVyX2hhbmRsZV90IHRvIGluZmxpZ2h0IHJlcXVlc3QgYnVmZmVyCisgICAgICAgIHN0YXR1c190IHB1c2hJbmZsaWdodFJlcXVlc3RCdWZmZXIodWludDY0X3QgYnVmZmVySWQsIGJ1ZmZlcl9oYW5kbGVfdCogYnVmKTsKKworICAgICAgICAvLyBGaW5kIGEgYnVmZmVyX2hhbmRsZV90IGJhc2VkIG9uIGJ1ZmZlcklkCisgICAgICAgIHN0YXR1c190IHBvcEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcih1aW50NjRfdCBidWZmZXJJZCwgLypvdXQqLyBidWZmZXJfaGFuZGxlX3QgKipidWZmZXIpOworCiAgICAgICAgIC8vIEdldCBhIHZlY3RvciBvZiAoZnJhbWVOdW1iZXIsIHN0cmVhbUlkKSBwYWlyIG9mIGN1cnJlbnRseSBpbmZsaWdodAogICAgICAgICAvLyBidWZmZXJzCiAgICAgICAgIHZvaWQgZ2V0SW5mbGlnaHRCdWZmZXJLZXlzKHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4qIG91dCk7CiAKKyAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IEJVRkZFUl9JRF9OT19CVUZGRVIgPSAwOwogICAgICAgcHJpdmF0ZToKICAgICAgICAgLy8gQWx3YXlzIHZhbGlkCiAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZVNlc3Npb24+IG1IaWRsU2Vzc2lvbjsKQEAgLTMxMiw2ICszMzYsOCBAQAogICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzM6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBtSGlkbFNlc3Npb25fM18zOwogICAgICAgICAvLyBWYWxpZCBpZiBJQ2FtZXJhRGV2aWNlU2Vzc2lvbiBpcyBAMy40IG9yIG5ld2VyCiAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6SUNhbWVyYURldmljZVNlc3Npb24+IG1IaWRsU2Vzc2lvbl8zXzQ7CisgICAgICAgIC8vIFZhbGlkIGlmIElDYW1lcmFEZXZpY2VTZXNzaW9uIGlzIEAzLjUgb3IgbmV3ZXIKKyAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gbUhpZGxTZXNzaW9uXzNfNTsKIAogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZTsKIApAQCAtMzE5LDcgKzM0NSw3IEBACiAKICAgICAgICAgLy8gVGhlIG91dHB1dCBISURMIHJlcXVlc3Qgc3RpbGwgZGVwZW5kcyBvbiBpbnB1dCBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90CiAgICAgICAgIC8vIERvIG5vdCBmcmVlIGlucHV0IGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QgYmVmb3JlIG91dHB1dCBISURMIHJlcXVlc3QKLSAgICAgICAgdm9pZCB3cmFwQXNIaWRsUmVxdWVzdChjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90KiBpbiwKKyAgICAgICAgc3RhdHVzX3Qgd3JhcEFzSGlkbFJlcXVlc3QoY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCogaW4sCiAgICAgICAgICAgICAgICAgLypvdXQqL2hhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlcXVlc3QqIG91dCwKICAgICAgICAgICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4qIGhhbmRsZXNDcmVhdGVkKTsKIApAQCAtMzYzLDE5ICszODksMTggQEAKICAgICAgICAgLy8gc3RyZWFtIElEIC0+IHBlciBzdHJlYW0gYnVmZmVyIElEIG1hcAogICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBCdWZmZXJJZE1hcD4gbUJ1ZmZlcklkTWFwczsKICAgICAgICAgdWludDY0X3QgbU5leHRCdWZmZXJJZCA9IDE7IC8vIDAgbWVhbnMgbm8gYnVmZmVyCi0gICAgICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBCVUZGRVJfSURfTk9fQlVGRkVSID0gMDsKLQotICAgICAgICAvLyBtZXRob2QgdG8gZXh0cmFjdCBidWZmZXIncyB1bmlxdWUgSUQKLSAgICAgICAgLy8gVE9ETzogd2Ugc2hvdWxkIHN3aXRjaCB0byB1c2UgZ3JhbGxvYyBtYXBwZXIncyBnZXRCYWNraW5nU3RvcmUgQVBJCi0gICAgICAgIC8vICAgICAgIG9uY2Ugd2UgcmFuIGluIGJpbmRlcml6ZWQgZ3JhbGxvYyBtb2RlLCBidXQgYmVmb3JlIHRoYXQgaXMgcmVhZHksCi0gICAgICAgIC8vICAgICAgIHdlIG5lZWQgdG8gcmVseSBvbiB0aGUgY29udmVudGlvbmFsIGJ1ZmZlciBxdWV1ZSBiZWhhdmlvciB3aGVyZQotICAgICAgICAvLyAgICAgICBidWZmZXJfaGFuZGxlX3QncyBGRCB3b24ndCBjaGFuZ2UuCi0gICAgICAgIC8vIHJldHVybiBwYWlyIG9mIChuZXdseVNlZW5CdWZmZXI/LCBidWZmZXJJZCkKLSAgICAgICAgc3RkOjpwYWlyPGJvb2wsIHVpbnQ2NF90PiBnZXRCdWZmZXJJZChjb25zdCBidWZmZXJfaGFuZGxlX3QmIGJ1ZiwgaW50IHN0cmVhbUlkKTsKIAogICAgICAgICB2aXJ0dWFsIHZvaWQgb25CdWZmZXJGcmVlZChpbnQgc3RyZWFtSWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlKSBvdmVycmlkZTsKIAogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50LCB1aW50NjRfdD4+IG1GcmVlZEJ1ZmZlcnM7CisKKyAgICAgICAgLy8gQnVmZmVycyBnaXZlbiB0byBIQUwgdGhyb3VnaCByZXF1ZXN0U3RyZWFtQnVmZmVyIEFQSQorICAgICAgICBzdGQ6Om11dGV4IG1SZXF1ZXN0ZWRCdWZmZXJzTG9jazsKKyAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCBidWZmZXJfaGFuZGxlX3QqPiBtUmVxdWVzdGVkQnVmZmVyczsKKworICAgICAgICB1aW50MzJfdCBtTmV4dFN0cmVhbUNvbmZpZ0NvdW50ZXIgPSAxOworCisgICAgICAgIGNvbnN0IGJvb2wgbVVzZUhhbEJ1Zk1hbmFnZXI7CiAgICAgfTsKIAogICAgIHNwPEhhbEludGVyZmFjZT4gbUludGVyZmFjZTsKQEAgLTQxMCw5ICs0MzUsMjIgQEAKICAgICAvLyBUcmFja2luZyBjYXVzZSBvZiBmYXRhbCBlcnJvcnMgd2hlbiBpbiBTVEFUVVNfRVJST1IKICAgICBTdHJpbmc4ICAgICAgICAgICAgICAgICAgICBtRXJyb3JDYXVzZTsKIAotICAgIC8vIE1hcHBpbmcgb2Ygc3RyZWFtIElEcyB0byBzdHJlYW0gaW5zdGFuY2VzCi0gICAgdHlwZWRlZiBLZXllZFZlY3RvcjxpbnQsIHNwPGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+ID4KLSAgICAgICAgICAgIFN0cmVhbVNldDsKKyAgICAvLyBTeW5jaHJvbml6ZWQgbWFwcGluZyBvZiBzdHJlYW0gSURzIHRvIHN0cmVhbSBpbnN0YW5jZXMKKyAgICBjbGFzcyBTdHJlYW1TZXQgeworICAgICAgcHVibGljOgorICAgICAgICBzdGF0dXNfdCBhZGQoaW50IHN0cmVhbUlkLCBzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPik7CisgICAgICAgIHNzaXplX3QgcmVtb3ZlKGludCBzdHJlYW1JZCk7CisgICAgICAgIHNwPGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IGdldChpbnQgc3RyZWFtSWQpOworICAgICAgICAvLyBnZXQgYnkgKHVuZGVybHlpbmcpIHZlY3RvciBpbmRleAorICAgICAgICBzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBvcGVyYXRvcltdIChzaXplX3QgaW5kZXgpOworICAgICAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0OworICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IGdldFN0cmVhbUlkcygpOworICAgICAgICB2b2lkIGNsZWFyKCk7CisKKyAgICAgIHByaXZhdGU6CisgICAgICAgIG11dGFibGUgc3RkOjptdXRleCBtTG9jazsKKyAgICAgICAgS2V5ZWRWZWN0b3I8aW50LCBzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPj4gbURhdGE7CisgICAgfTsKIAogICAgIFN0cmVhbVNldCAgICAgICAgICAgICAgICAgIG1PdXRwdXRTdHJlYW1zOwogICAgIHNwPGNhbWVyYTM6OkNhbWVyYTNTdHJlYW0+IG1JbnB1dFN0cmVhbTsKQEAgLTQ4MSw4ICs1MTksOSBAQAogCiAKICAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OklDYW1lcmFEZXZpY2VDYWxsYmFjaworICAgICAqIEltcGxlbWVudGF0aW9uIG9mIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZUNhbGxiYWNrCiAgICAgICovCisKICAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHByb2Nlc3NDYXB0dXJlUmVzdWx0XzNfNCgKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cykgb3ZlcnJpZGU7CkBAIC00OTMsNiArNTMyLDE1IEBACiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CiAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Tm90aWZ5TXNnPiYgbXNncykgb3ZlcnJpZGU7CiAKKyAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJlcXVlc3RTdHJlYW1CdWZmZXJzKAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAorICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkJ1ZmZlclJlcXVlc3Q+JiBidWZSZXFzLAorICAgICAgICAgICAgcmVxdWVzdFN0cmVhbUJ1ZmZlcnNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXR1cm5TdHJlYW1CdWZmZXJzKAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAorICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUJ1ZmZlcj4mIGJ1ZmZlcnMpIG92ZXJyaWRlOworCiAgICAgLy8gSGFuZGxlIG9uZSBjYXB0dXJlIHJlc3VsdC4gQXNzdW1lIHRoYXQgbVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jayBpcyBoZWxkLgogICAgIHZvaWQgcHJvY2Vzc09uZUNhcHR1cmVSZXN1bHRMb2NrZWQoCiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXN1bHQmIHJlc3VsdCwKQEAgLTY1MywyNyArNzAxLDYgQEAKICAgICAgKi8KICAgICBzdGF0aWMgbnNlY3NfdCBnZXRNb25vVG9Cb290dGltZU9mZnNldCgpOwogCi0gICAgLyoqCi0gICAgICogSGVscGVyIGZ1bmN0aW9ucyB0byBtYXAgYmV0d2VlbiBmcmFtZXdvcmsgYW5kIEhJREwgdmFsdWVzCi0gICAgICovCi0gICAgc3RhdGljIGhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdCBtYXBUb1BpeGVsRm9ybWF0KGludCBmcmFtZXdvcmtGb3JtYXQpOwotICAgIHN0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkRhdGFzcGFjZUZsYWdzIG1hcFRvSGlkbERhdGFzcGFjZSgKLSAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSk7Ci0gICAgc3RhdGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyVXNhZ2VGbGFncyBtYXBUb0NvbnN1bWVyVXNhZ2UodWludDY0X3QgdXNhZ2UpOwotICAgIHN0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbVJvdGF0aW9uIG1hcFRvU3RyZWFtUm90YXRpb24oCi0gICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uKTsKLSAgICAvLyBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpZiB0aGUgcGFzc2VkLWluIG9wZXJhdGlvbiBtb2RlIGlzIG5vdCB2YWxpZC4KLSAgICBzdGF0aWMgc3RhdHVzX3QgbWFwVG9TdHJlYW1Db25maWd1cmF0aW9uTW9kZShjYW1lcmEzX3N0cmVhbV9jb25maWd1cmF0aW9uX21vZGVfdCBvcGVyYXRpb25Nb2RlLAotICAgICAgICAgICAgLypvdXQqLyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlICptb2RlKTsKLSAgICBzdGF0aWMgY2FtZXJhM19idWZmZXJfc3RhdHVzX3QgbWFwSGlkbEJ1ZmZlclN0YXR1cyhoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclN0YXR1cyBzdGF0dXMpOwotICAgIHN0YXRpYyBpbnQgbWFwVG9GcmFtZXdvcmtGb3JtYXQoaGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0IHBpeGVsRm9ybWF0KTsKLSAgICBzdGF0aWMgYW5kcm9pZF9kYXRhc3BhY2UgbWFwVG9GcmFtZXdvcmtEYXRhc3BhY2UoCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkRhdGFzcGFjZUZsYWdzKTsKLSAgICBzdGF0aWMgdWludDY0X3QgbWFwQ29uc3VtZXJUb0ZyYW1ld29ya1VzYWdlKAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJVc2FnZUZsYWdzIHVzYWdlKTsKLSAgICBzdGF0aWMgdWludDY0X3QgbWFwUHJvZHVjZXJUb0ZyYW1ld29ya1VzYWdlKAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJVc2FnZUZsYWdzIHVzYWdlKTsKLQogICAgIHN0cnVjdCBSZXF1ZXN0VHJpZ2dlciB7CiAgICAgICAgIC8vIE1ldGFkYXRhIHRhZyBudW1iZXIsIGUuZy4gYW5kcm9pZC5jb250cm9sLmFlUHJlY2FwdHVyZVRyaWdnZXIKICAgICAgICAgdWludDMyX3QgbWV0YWRhdGFUYWc7CkBAIC03MDAsNyArNzI3LDkgQEAKIAogICAgICAgICBSZXF1ZXN0VGhyZWFkKHdwPENhbWVyYTNEZXZpY2U+IHBhcmVudCwKICAgICAgICAgICAgICAgICBzcDxjYW1lcmEzOjpTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyLAotICAgICAgICAgICAgICAgIHNwPEhhbEludGVyZmFjZT4gaW50ZXJmYWNlLCBjb25zdCBWZWN0b3I8aW50MzJfdD4mIHNlc3Npb25QYXJhbUtleXMpOworICAgICAgICAgICAgICAgIHNwPEhhbEludGVyZmFjZT4gaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxpbnQzMl90PiYgc2Vzc2lvblBhcmFtS2V5cywKKyAgICAgICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIpOwogICAgICAgICB+UmVxdWVzdFRocmVhZCgpOwogCiAgICAgICAgIHZvaWQgICAgIHNldE5vdGlmaWNhdGlvbkxpc3RlbmVyKHdwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcik7CkBAIC03ODgsNiArODE3LDggQEAKICAgICAgICAgICAgIG1SZXF1ZXN0TGF0ZW5jeS5kdW1wKGZkLCBuYW1lKTsKICAgICAgICAgfQogCisgICAgICAgIHZvaWQgc2lnbmFsUGlwZWxpbmVEcmFpbihjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBzdHJlYW1JZHMpOworCiAgICAgICBwcm90ZWN0ZWQ6CiAKICAgICAgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKTsKQEAgLTg5NywxMiArOTI4LDEzIEBACiAKICAgICAgICAgYm9vbCAgICAgICAgICAgICAgIG1SZWNvbmZpZ3VyZWQ7CiAKLSAgICAgICAgLy8gVXNlZCBieSB3YWl0SWZQYXVzZWQsIHdhaXRGb3JOZXh0UmVxdWVzdCwgYW5kIHdhaXRVbnRpbFBhdXNlZAorICAgICAgICAvLyBVc2VkIGJ5IHdhaXRJZlBhdXNlZCwgd2FpdEZvck5leHRSZXF1ZXN0LCB3YWl0VW50aWxQYXVzZWQsIGFuZCBzaWduYWxQaXBlbGluZURyYWluCiAgICAgICAgIE11dGV4ICAgICAgICAgICAgICBtUGF1c2VMb2NrOwogICAgICAgICBib29sICAgICAgICAgICAgICAgbURvUGF1c2U7CiAgICAgICAgIENvbmRpdGlvbiAgICAgICAgICBtRG9QYXVzZVNpZ25hbDsKICAgICAgICAgYm9vbCAgICAgICAgICAgICAgIG1QYXVzZWQ7Ci0gICAgICAgIENvbmRpdGlvbiAgICAgICAgICBtUGF1c2VkU2lnbmFsOworICAgICAgICBib29sICAgICAgICAgICAgICAgbU5vdGlmeVBpcGVsaW5lRHJhaW47CisgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gICBtU3RyZWFtSWRzVG9CZURyYWluZWQ7CiAKICAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IG1QcmV2UmVxdWVzdDsKICAgICAgICAgaW50MzJfdCAgICAgICAgICAgIG1QcmV2VHJpZ2dlcnM7CkBAIC05MzUsNiArOTY3LDggQEAKIAogICAgICAgICBWZWN0b3I8aW50MzJfdD4gICAgbVNlc3Npb25QYXJhbUtleXM7CiAgICAgICAgIENhbWVyYU1ldGFkYXRhICAgICBtTGF0ZXN0U2Vzc2lvblBhcmFtczsKKworICAgICAgICBjb25zdCBib29sICAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXI7CiAgICAgfTsKICAgICBzcDxSZXF1ZXN0VGhyZWFkPiBtUmVxdWVzdFRocmVhZDsKIApAQCAtOTk1LDYgKzEwMjksMTUgQEAKICAgICAgICAgLy8gTWFwIG9mIHBoeXNpY2FsQ2FtZXJhSWQgPC0+IE1ldGFkYXRhCiAgICAgICAgIHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+IHBoeXNpY2FsTWV0YWRhdGFzOwogCisgICAgICAgIC8vIEluZGljYXRlcyBhIHN0aWxsIGNhcHR1cmUgcmVxdWVzdC4KKyAgICAgICAgYm9vbCBzdGlsbENhcHR1cmU7CisKKyAgICAgICAgLy8gSW5kaWNhdGVzIGEgWlNMIGNhcHR1cmUgcmVxdWVzdAorICAgICAgICBib29sIHpzbENhcHR1cmU7CisKKyAgICAgICAgLy8gV2hhdCBzaGFyZWQgc3VyZmFjZXMgYW4gb3V0cHV0IHNob3VsZCBnbyB0bworICAgICAgICBTdXJmYWNlTWFwIG91dHB1dFN1cmZhY2VzOworCiAgICAgICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IgbmVlZGVkIGJ5IEtleWVkVmVjdG9yCiAgICAgICAgIEluRmxpZ2h0UmVxdWVzdCgpIDoKICAgICAgICAgICAgICAgICBzaHV0dGVyVGltZXN0YW1wKDApLApAQCAtMTAwNSwxMiArMTA0OCwxNiBAQAogICAgICAgICAgICAgICAgIGhhc0lucHV0QnVmZmVyKGZhbHNlKSwKICAgICAgICAgICAgICAgICBoYXNDYWxsYmFjayh0cnVlKSwKICAgICAgICAgICAgICAgICBtYXhFeHBlY3RlZER1cmF0aW9uKGtEZWZhdWx0RXhwZWN0ZWREdXJhdGlvbiksCi0gICAgICAgICAgICAgICAgc2tpcFJlc3VsdE1ldGFkYXRhKGZhbHNlKSB7CisgICAgICAgICAgICAgICAgc2tpcFJlc3VsdE1ldGFkYXRhKGZhbHNlKSwKKyAgICAgICAgICAgICAgICBzdGlsbENhcHR1cmUoZmFsc2UpLAorICAgICAgICAgICAgICAgIHpzbENhcHR1cmUoZmFsc2UpIHsKICAgICAgICAgfQogCiAgICAgICAgIEluRmxpZ2h0UmVxdWVzdChpbnQgbnVtQnVmZmVycywgQ2FwdHVyZVJlc3VsdEV4dHJhcyBleHRyYXMsIGJvb2wgaGFzSW5wdXQsCiAgICAgICAgICAgICAgICAgYm9vbCBoYXNBcHBDYWxsYmFjaywgbnNlY3NfdCBtYXhEdXJhdGlvbiwKLSAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxTdHJpbmc4PiYgcGh5c2ljYWxDYW1lcmFJZFNldCkgOgorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PFN0cmluZzg+JiBwaHlzaWNhbENhbWVyYUlkU2V0LCBib29sIGlzU3RpbGxDYXB0dXJlLAorICAgICAgICAgICAgICAgIGJvb2wgaXNac2xDYXB0dXJlLAorICAgICAgICAgICAgICAgIGNvbnN0IFN1cmZhY2VNYXAmIG91dFN1cmZhY2VzID0gU3VyZmFjZU1hcHt9KSA6CiAgICAgICAgICAgICAgICAgc2h1dHRlclRpbWVzdGFtcCgwKSwKICAgICAgICAgICAgICAgICBzZW5zb3JUaW1lc3RhbXAoMCksCiAgICAgICAgICAgICAgICAgcmVxdWVzdFN0YXR1cyhPSyksCkBAIC0xMDIxLDcgKzEwNjgsMTAgQEAKICAgICAgICAgICAgICAgICBoYXNDYWxsYmFjayhoYXNBcHBDYWxsYmFjayksCiAgICAgICAgICAgICAgICAgbWF4RXhwZWN0ZWREdXJhdGlvbihtYXhEdXJhdGlvbiksCiAgICAgICAgICAgICAgICAgc2tpcFJlc3VsdE1ldGFkYXRhKGZhbHNlKSwKLSAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkcyhwaHlzaWNhbENhbWVyYUlkU2V0KSB7CisgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZHMocGh5c2ljYWxDYW1lcmFJZFNldCksCisgICAgICAgICAgICAgICAgc3RpbGxDYXB0dXJlKGlzU3RpbGxDYXB0dXJlKSwKKyAgICAgICAgICAgICAgICB6c2xDYXB0dXJlKGlzWnNsQ2FwdHVyZSksCisgICAgICAgICAgICAgICAgb3V0cHV0U3VyZmFjZXMob3V0U3VyZmFjZXMpIHsKICAgICAgICAgfQogICAgIH07CiAKQEAgLTEwMzUsMTAgKzEwODUsMTEgQEAKICAgICBuc2Vjc190ICAgICAgICAgICAgICAgIG1FeHBlY3RlZEluZmxpZ2h0RHVyYXRpb24gPSAwOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgbUluRmxpZ2h0U3RhdHVzSWQ7CiAKLQogICAgIHN0YXR1c190IHJlZ2lzdGVySW5GbGlnaHQodWludDMyX3QgZnJhbWVOdW1iZXIsCiAgICAgICAgICAgICBpbnQzMl90IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzLCBib29sIGhhc0lucHV0LAotICAgICAgICAgICAgYm9vbCBjYWxsYmFjaywgbnNlY3NfdCBtYXhFeHBlY3RlZER1cmF0aW9uLCBzdGQ6OnNldDxTdHJpbmc4PiYgcGh5c2ljYWxDYW1lcmFJZHMpOworICAgICAgICAgICAgYm9vbCBjYWxsYmFjaywgbnNlY3NfdCBtYXhFeHBlY3RlZER1cmF0aW9uLCBzdGQ6OnNldDxTdHJpbmc4PiYgcGh5c2ljYWxDYW1lcmFJZHMsCisgICAgICAgICAgICBib29sIGlzU3RpbGxDYXB0dXJlLCBib29sIGlzWnNsQ2FwdHVyZSwKKyAgICAgICAgICAgIGNvbnN0IFN1cmZhY2VNYXAmIG91dHB1dFN1cmZhY2VzKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gZXhwZWN0ZWQgdGltZSBpdCdsbCB0YWtlIGZvciBhbGwgY3VycmVudGx5IGluLWZsaWdodApAQCAtMTE0OCw3ICsxMTk5LDExIEBACiAKICAgICAvLyBoZWxwZXIgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBvdXRwdXQgYnVmZmVycyB0byB0aGUgc3RyZWFtcy4KICAgICB2b2lkIHJldHVybk91dHB1dEJ1ZmZlcnMoY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QgKm91dHB1dEJ1ZmZlcnMsCi0gICAgICAgICAgICBzaXplX3QgbnVtQnVmZmVycywgbnNlY3NfdCB0aW1lc3RhbXApOworICAgICAgICAgICAgc2l6ZV90IG51bUJ1ZmZlcnMsIG5zZWNzX3QgdGltZXN0YW1wLCBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcgPSB0cnVlLAorICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBhcmd1bWVudHMgYXJlIG9ubHkgbWVhbnQgZm9yIHN1cmZhY2Ugc2hhcmluZyB1c2UgY2FzZQorICAgICAgICAgICAgY29uc3QgU3VyZmFjZU1hcCYgb3V0cHV0U3VyZmFjZXMgPSBTdXJmYWNlTWFwe30sCisgICAgICAgICAgICAvLyBVc2VkIHRvIHNlbmQgYnVmZmVyIGVycm9yIGNhbGxiYWNrIHdoZW4gZmFpbGluZyB0byByZXR1cm4gYnVmZmVyCisgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzICZyZXN1bHRFeHRyYXMgPSBDYXB0dXJlUmVzdWx0RXh0cmFze30pOwogCiAgICAgLy8gU2VuZCBhIHBhcnRpYWwgY2FwdHVyZSByZXN1bHQuCiAgICAgdm9pZCBzZW5kUGFydGlhbENhcHR1cmVSZXN1bHQoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKiBwYXJ0aWFsUmVzdWx0LApAQCAtMTIwNCwxMyArMTI1OSw4OCBAQAogICAgIC8vIENhY2hlZCBsYXN0IHJlcXVlc3RlZCB0ZW1wbGF0ZSBpZAogICAgIGludCBtTGFzdFRlbXBsYXRlSWQ7CiAKLSAgICAvKioKLSAgICAgKiBTdGF0aWMgY2FsbGJhY2sgZm9yd2FyZGluZyBtZXRob2RzIGZyb20gSEFMIHRvIGluc3RhbmNlCi0gICAgICovCi0gICAgc3RhdGljIGNhbGxiYWNrc19wcm9jZXNzX2NhcHR1cmVfcmVzdWx0X3Qgc1Byb2Nlc3NDYXB0dXJlUmVzdWx0OworICAgIC8vIFN5bmNocm9uaXplcyBhY2Nlc3MgdG8gc3RhdHVzIHRyYWNrZXIgYmV0d2VlbiBpbmZsaWdodCB1cGRhdGVzIGFuZCBkaXNjb25uZWN0LgorICAgIC8vIGIvNzk5NzI4NjUKKyAgICBNdXRleCBtVHJhY2tlckxvY2s7CiAKLSAgICBzdGF0aWMgY2FsbGJhY2tzX25vdGlmeV90IHNOb3RpZnk7CisgICAgLy8gV2hldGhlciBIQUwgcmVxdWVzdCBidWZmZXJzIHRocm91Z2ggcmVxdWVzdFN0cmVhbUJ1ZmZlcnMgQVBJCisgICAgYm9vbCBtVXNlSGFsQnVmTWFuYWdlciA9IGZhbHNlOwogCisgICAgLy8gTG9jayB0byBlbnN1cmUgcmVxdWVzdFN0cmVhbUJ1ZmZlcnMoKSBjYWxsYmFja3MgYXJlIHNlcmlhbGl6ZWQKKyAgICBzdGQ6Om11dGV4IG1SZXF1ZXN0QnVmZmVySW50ZXJmYWNlTG9jazsKKworICAgIC8vIFRoZSBzdGF0ZSBtYWNoaW5lIHRvIGNvbnRyb2wgd2hlbiByZXF1ZXN0U3RyZWFtQnVmZmVycyBzaG91bGQgYWxsb3cKKyAgICAvLyBIQUwgdG8gcmVxdWVzdCBidWZmZXJzLgorICAgIGVudW0gUmVxdWVzdEJ1ZmZlclN0YXRlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgaXMgdGhlIGluaXRpYWwgc3RhdGUuCisgICAgICAgICAqIHJlcXVlc3RTdHJlYW1CdWZmZXJzIGNhbGwgd2lsbCByZXR1cm4gRkFJTEVEX0NPTkZJR1VSSU5HIGluIHRoaXMgc3RhdGUuCisgICAgICAgICAqIFdpbGwgc3dpdGNoIHRvIFJCX1NUQVRVU19SRUFEWSBhZnRlciBhIHN1Y2Nlc3NmdWwgY29uZmlndXJlU3RyZWFtcyBvcgorICAgICAgICAgKiBwcm9jZXNzQ2FwdHVyZVJlcXVlc3QgY2FsbC4KKyAgICAgICAgICovCisgICAgICAgIFJCX1NUQVRVU19TVE9QUEVELAorCisgICAgICAgIC8qKgorICAgICAgICAgKiByZXF1ZXN0U3RyZWFtQnVmZmVycyBjYWxsIHdpbGwgcHJvY2VlZCBpbiB0aGlzIHN0YXRlLgorICAgICAgICAgKiBXaGVuIGRldmljZSBpcyBhc2tlZCB0byBzdGF5IGlkbGUgdmlhIHdhaXRVbnRpbFN0YXRlVGhlblJlbG9jaygpIGNhbGw6CisgICAgICAgICAqICAgICAtIFN3aXRjaCB0byBSQl9TVEFUVVNfU1RPUFBFRCBpZiB0aGVyZSBpcyBubyBpbmZsaWdodCByZXF1ZXN0cyBhbmQKKyAgICAgICAgICogICAgICAgcmVxdWVzdCB0aHJlYWQgaXMgcGF1c2VkLgorICAgICAgICAgKiAgICAgLSBTd2l0Y2ggdG8gUkJfU1RBVFVTX1BFTkRJTkdfU1RPUCBvdGhlcndpc2UKKyAgICAgICAgICovCisgICAgICAgIFJCX1NUQVRVU19SRUFEWSwKKworICAgICAgICAvKioKKyAgICAgICAgICogcmVxdWVzdFN0cmVhbUJ1ZmZlcnMgY2FsbCB3aWxsIHByb2NlZWQgaW4gdGhpcyBzdGF0ZS4KKyAgICAgICAgICogU3dpdGNoIHRvIFJCX1NUQVRVU19TVE9QUEVEIHdoZW4gYWxsIGluZmxpZ2h0IHJlcXVlc3RzIGFyZSBmdWxmaWxsZWQKKyAgICAgICAgICogYW5kIHJlcXVlc3QgdGhyZWFkIGlzIHBhdXNlZAorICAgICAgICAgKi8KKyAgICAgICAgUkJfU1RBVFVTX1BFTkRJTkdfU1RPUCwKKyAgICB9OworCisgICAgY2xhc3MgUmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZSB7CisgICAgICBwdWJsaWM6CisgICAgICAgIHN0YXR1c190IGluaXRpYWxpemUoc3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlcik7CisKKyAgICAgICAgLy8gUmV0dXJuIGlmIHRoZSBzdGF0ZSBtYWNoaW5lIGN1cnJlbnRseSBhbGxvd3MgZm9yIHJlcXVlc3RCdWZmZXJzCisgICAgICAgIC8vIElmIHRoZSBzdGF0ZSBhbGxvd3MgZm9yIGl0LCBtUmVxdWVzdEJ1ZmZlck9uZ29pbmcgd2lsbCBiZSBzZXQgdG8gdHJ1ZQorICAgICAgICAvLyBhbmQgY2FsbGVyIG11c3QgY2FsbCBlbmRSZXF1ZXN0QnVmZmVyKCkgbGF0ZXIgdG8gdW5zZXQgdGhlIGZsYWcKKyAgICAgICAgYm9vbCBzdGFydFJlcXVlc3RCdWZmZXIoKTsKKyAgICAgICAgdm9pZCBlbmRSZXF1ZXN0QnVmZmVyKCk7CisKKyAgICAgICAgLy8gRXZlbnRzIHRyaWdnZXJlZCBieSBhcHBsaWNhdGlvbiBBUEkgY2FsbAorICAgICAgICB2b2lkIG9uU3RyZWFtc0NvbmZpZ3VyZWQoKTsKKyAgICAgICAgdm9pZCBvbldhaXRVbnRpbElkbGUoKTsKKworICAgICAgICAvLyBFdmVudHMgdXN1YWxseSB0cmlnZ2VyZWQgYnkgaHdCaW5kZXIgcHJvY2Vzc0NhcHR1cmVSZXN1bHQgY2FsbGJhY2sgdGhyZWFkCisgICAgICAgIC8vIEJ1dCBjYW4gYWxzbyBiZSB0cmlnZ2VyZWQgb24gcmVxdWVzdCB0aHJlYWQgZm9yIGZhaWxlZCByZXF1ZXN0LCBvciBvbgorICAgICAgICAvLyBod2JpbmRlciBub3RpZnkgY2FsbGJhY2sgdGhyZWFkIGZvciBzaHV0dGVyL2Vycm9yIGNhbGxiYWNrcworICAgICAgICB2b2lkIG9uSW5mbGlnaHRNYXBFbXB0eSgpOworCisgICAgICAgIC8vIEV2ZW50cyB0cmlnZ2VyZWQgYnkgUmVxdWVzdFRocmVhZAorICAgICAgICB2b2lkIG9uUmVxdWVzdFN1Ym1pdHRlZCgpOworICAgICAgICB2b2lkIG9uUmVxdWVzdFRocmVhZFBhdXNlZCgpOworCisgICAgICBwcml2YXRlOgorICAgICAgICB2b2lkIG5vdGlmeVRyYWNrZXJMb2NrZWQoYm9vbCBhY3RpdmUpOworCisgICAgICAgIC8vIFN3aXRjaCB0byBTVE9QUEVEIHN0YXRlIGFuZCByZXR1cm4gdHJ1ZSBpZiBhbGwgY29uZGl0aW9ucyBhbGxvd3MgZm9yIGl0LgorICAgICAgICAvLyBPdGhlcndpc2UgZG8gbm90aGluZyBhbmQgcmV0dXJuIGZhbHNlLgorICAgICAgICBib29sIGNoZWNrU3dpdGNoVG9TdG9wTG9ja2VkKCk7CisKKyAgICAgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICAgICAgUmVxdWVzdEJ1ZmZlclN0YXRlIG1TdGF0dXMgPSBSQl9TVEFUVVNfU1RPUFBFRDsKKworICAgICAgICBib29sIG1SZXF1ZXN0VGhyZWFkUGF1c2VkID0gdHJ1ZTsKKyAgICAgICAgYm9vbCBtSW5mbGlnaHRNYXBFbXB0eSA9IHRydWU7CisgICAgICAgIGJvb2wgbVJlcXVlc3RCdWZmZXJPbmdvaW5nID0gZmFsc2U7CisKKyAgICAgICAgd3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gbVN0YXR1c1RyYWNrZXI7CisgICAgICAgIGludCAgbVJlcXVlc3RCdWZmZXJTdGF0dXNJZDsKKyAgICB9IG1SZXF1ZXN0QnVmZmVyU007CisKKyAgICAvLyBGaXggdXAgcmVzdWx0IG1ldGFkYXRhIGZvciBtb25vY2hyb21lIGNhbWVyYS4KKyAgICBib29sIG1OZWVkRml4dXBNb25vY2hyb21lVGFnczsKKyAgICBzdGF0dXNfdCBmaXh1cE1vbm9jaHJvbWVUYWdzKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBkZXZpY2VJbmZvLCBDYW1lcmFNZXRhZGF0YSYgcmVzdWx0TWV0YWRhdGEpOwogfTsgLy8gY2xhc3MgQ2FtZXJhM0RldmljZQogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwCmluZGV4IGZiMWZmNzcuLmI2MzcxNjAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAKQEAgLTQ4LDcgKzQ4LDcgQEAKIAogc3RhdHVzX3QgQ2FtZXJhM0R1bW15U3RyZWFtOjpyZXR1cm5CdWZmZXJMb2NrZWQoCiAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmLAotICAgICAgICBuc2Vjc190KSB7CisgICAgICAgIG5zZWNzX3QsIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRHVtbXkgc3RyZWFtIGNhbm5vdCByZXR1cm4gYnVmZmVycyEiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtNTgsNiArNTgsNyBAQAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICYsCiAgICAgICAgICAgICBuc2Vjc190LAogICAgICAgICAgICAgYm9vbCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+KikgewogICAgIEFUUkFDRV9DQUxMKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaAppbmRleCA0NjI3NTQ4Li40YjY3ZWE1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmgKQEAgLTg3LDYgKzg3LDkgQEAKICAgICAgKi8KICAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0U3VyZmFjZUlkKGNvbnN0IHNwPFN1cmZhY2U+ICYvKnN1cmZhY2UqLykgeyByZXR1cm4gMDsgfQogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRVbmlxdWVTdXJmYWNlSWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mLAorICAgICAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPHNpemVfdD4qKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfTsKKwogICAgIC8qKgogICAgICAqIFVwZGF0ZSB0aGUgc3RyZWFtIG91dHB1dCBzdXJmYWNlcy4KICAgICAgKi8KQEAgLTEwNCw2ICsxMDcsNyBAQAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKICAgICAgICAgICAgIGJvb2wgb3V0cHV0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMsCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxGZW5jZT4gKnJlbGVhc2VGZW5jZU91dCk7CiAKQEAgLTEyOCw3ICsxMzIsNyBAQAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMgPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCkpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyTG9ja2VkKAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCi0gICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCk7CisgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVRdWV1ZUxvY2tlZCgpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcAppbmRleCAzYzFlNDNkLi4yZTkwOWEwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAKQEAgLTExNiw3ICsxMTYsNyBAQAogICAgIHJldHVybiBtVG90YWxCdWZmZXJDb3VudDsKIH0KIAotc2l6ZV90IENhbWVyYTNJT1N0cmVhbUJhc2U6OmdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpIHsKK3NpemVfdCBDYW1lcmEzSU9TdHJlYW1CYXNlOjpnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1IYW5kb3V0T3V0cHV0QnVmZmVyQ291bnQ7CiB9CiAKQEAgLTIxOSw3ICsyMTksOCBAQAogc3RhdHVzX3QgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6cmV0dXJuQW55QnVmZmVyTG9ja2VkKAogICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCi0gICAgICAgIGJvb2wgb3V0cHV0KSB7CisgICAgICAgIGJvb2wgb3V0cHV0LAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcykgewogICAgIHN0YXR1c190IHJlczsKIAogICAgIC8vIHJldHVybkJ1ZmZlciBtYXkgYmUgY2FsbGVkIGZyb20gYSByYXcgcG9pbnRlciwgbm90IGEgc3A8PiwgYW5kIHdlJ2xsIGJlCkBAIC0yMzUsNyArMjM2LDcgQEAKICAgICB9CiAKICAgICBzcDxGZW5jZT4gcmVsZWFzZUZlbmNlOwotICAgIHJlcyA9IHJldHVybkJ1ZmZlckNoZWNrZWRMb2NrZWQoYnVmZmVyLCB0aW1lc3RhbXAsIG91dHB1dCwKKyAgICByZXMgPSByZXR1cm5CdWZmZXJDaGVja2VkTG9ja2VkKGJ1ZmZlciwgdGltZXN0YW1wLCBvdXRwdXQsIHN1cmZhY2VfaWRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlbGVhc2VGZW5jZSk7CiAgICAgLy8gUmVzIG1heSBiZSBhbiBlcnJvciwgYnV0IHdlIHN0aWxsIHdhbnQgdG8gZGVjcmVtZW50IG91ciBvd25lZCBjb3VudAogICAgIC8vIHRvIGVuYWJsZSBjbGVhbiBzaHV0ZG93bi4gU28gd2UnbGwganVzdCByZXR1cm4gdGhlIGVycm9yIGJ1dCBvdGhlcndpc2UKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmgKaW5kZXggMGEzMWQ0NC4uNzUwZjY0ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmgKQEAgLTY2LDEyICs2NiwxNCBAQAogICAgIHN0YXR1c190ICAgICAgICAgcmV0dXJuQW55QnVmZmVyTG9ja2VkKAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKLSAgICAgICAgICAgIGJvb2wgb3V0cHV0KTsKKyAgICAgICAgICAgIGJvb2wgb3V0cHV0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMgPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCkpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXR1cm5CdWZmZXJDaGVja2VkTG9ja2VkKAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKICAgICAgICAgICAgIGJvb2wgb3V0cHV0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMsCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxGZW5jZT4gKnJlbGVhc2VGZW5jZU91dCkgPSAwOwogCkBAIC04Miw3ICs4NCw3IEBACiAKICAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEJ1ZmZlckNvdW50TG9ja2VkKCk7CiAKLSAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpOworICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgY29uc3Q7CiAKICAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRJbnB1dEJ1ZmZlckNvdW50TG9ja2VkKCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcAppbmRleCAwMTdkN2JlLi5mYzgzNjg0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwCkBAIC05OCw2ICs5OCw3IEBACiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAogICAgICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiwKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPEZlbmNlPiAqcmVsZWFzZUZlbmNlT3V0KSB7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oCmluZGV4IDA3MzI0NjQuLjk3YTYyN2EgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaApAQCAtNjIsNiArNjIsNyBAQAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKICAgICAgICAgICAgIGJvb2wgb3V0cHV0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMsCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxGZW5jZT4gKnJlbGVhc2VGZW5jZU91dCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwCmluZGV4IDJjMDIwYTIuLjhjZDU3NWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcApAQCAtMTg3LDE2ICsxODcsMTcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM091dHB1dFN0cmVhbTo6cXVldWVCdWZmZXJUb0NvbnN1bWVyKHNwPEFOYXRpdmVXaW5kb3c+JiBjb25zdW1lciwKLSAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgaW50IGFud1JlbGVhc2VGZW5jZSkgeworICAgICAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyLCBpbnQgYW53UmVsZWFzZUZlbmNlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYpIHsKICAgICByZXR1cm4gY29uc3VtZXItPnF1ZXVlQnVmZmVyKGNvbnN1bWVyLmdldCgpLCBidWZmZXIsIGFud1JlbGVhc2VGZW5jZSk7CiB9CiAKIHN0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OnJldHVybkJ1ZmZlckxvY2tlZCgKICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCi0gICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKSB7CisgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKLSAgICBzdGF0dXNfdCByZXMgPSByZXR1cm5BbnlCdWZmZXJMb2NrZWQoYnVmZmVyLCB0aW1lc3RhbXAsIC8qb3V0cHV0Ki90cnVlKTsKKyAgICBzdGF0dXNfdCByZXMgPSByZXR1cm5BbnlCdWZmZXJMb2NrZWQoYnVmZmVyLCB0aW1lc3RhbXAsIC8qb3V0cHV0Ki90cnVlLCBzdXJmYWNlX2lkcyk7CiAKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIHJldHVybiByZXM7CkBAIC0yMTIsNiArMjEzLDcgQEAKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCiAgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpIHsKIApAQCAtMjM3LDEyICsyMzksMTQgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm4gYnVmZmVyIGJhY2sgdG8gQU5hdGl2ZVdpbmRvdwogICAgICAqLwotICAgIGlmIChidWZmZXIuc3RhdHVzID09IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUiB8fCBtRHJvcEJ1ZmZlcnMpIHsKKyAgICBpZiAoYnVmZmVyLnN0YXR1cyA9PSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1IgfHwgbURyb3BCdWZmZXJzIHx8IHRpbWVzdGFtcCA9PSAwKSB7CiAgICAgICAgIC8vIENhbmNlbCBidWZmZXIKICAgICAgICAgaWYgKG1Ecm9wQnVmZmVycykgewogICAgICAgICAgICAgQUxPR1YoIiVzOiBEcm9wcGluZyBhIGZyYW1lIGZvciBzdHJlYW0gJWQuIiwgX19GVU5DVElPTl9fLCBtSWQpOwotICAgICAgICB9IGVsc2UgeworICAgICAgICB9IGVsc2UgaWYgKGJ1ZmZlci5zdGF0dXMgPT0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SKSB7CiAgICAgICAgICAgICBBTE9HVygiJXM6IEEgZnJhbWUgaXMgZHJvcHBlZCBmb3Igc3RyZWFtICVkIGR1ZSB0byBidWZmZXIgZXJyb3IuIiwgX19GVU5DVElPTl9fLCBtSWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IHRpbWVzdGFtcCBzaG91bGRuJ3QgYmUgMCIsIF9fRlVOQ1RJT05fXywgbUlkKTsKICAgICAgICAgfQogCiAgICAgICAgIHJlcyA9IGN1cnJlbnRDb25zdW1lci0+Y2FuY2VsQnVmZmVyKGN1cnJlbnRDb25zdW1lci5nZXQoKSwKQEAgLTI3OSw3ICsyODMsNyBAQAogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogCi0gICAgICAgIHJlcyA9IHF1ZXVlQnVmZmVyVG9Db25zdW1lcihjdXJyZW50Q29uc3VtZXIsIGFud0J1ZmZlciwgYW53UmVsZWFzZUZlbmNlKTsKKyAgICAgICAgcmVzID0gcXVldWVCdWZmZXJUb0NvbnN1bWVyKGN1cnJlbnRDb25zdW1lciwgYW53QnVmZmVyLCBhbndSZWxlYXNlRmVuY2UsIHN1cmZhY2VfaWRzKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IEVycm9yIHF1ZXVlaW5nIGJ1ZmZlciB0byBuYXRpdmUgd2luZG93OiAiCiAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTY1OSwxMiArNjYzLDExIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM091dHB1dFN0cmVhbTo6Z2V0RW5kcG9pbnRVc2FnZUZvclN1cmZhY2UodWludDY0X3QgKnVzYWdlLAotICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgY29uc3QgewotICAgIHN0YXR1c190IHJlczsKLSAgICB1aW50NjRfdCB1ID0gMDsKK3ZvaWQgQ2FtZXJhM091dHB1dFN0cmVhbTo6YXBwbHlaU0xVc2FnZVF1aXJrKGludCBmb3JtYXQsIHVpbnQ2NF90ICpjb25zdW1lclVzYWdlIC8qaW5vdXQqLykgeworICAgIGlmIChjb25zdW1lclVzYWdlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAotICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfZ2V0X2NvbnN1bWVyX3VzYWdlKHN0YXRpY19jYXN0PEFOYXRpdmVXaW5kb3cqPihzdXJmYWNlLmdldCgpKSwgJnUpOwogICAgIC8vIElmIGFuIG9wYXF1ZSBvdXRwdXQgc3RyZWFtJ3MgZW5kcG9pbnQgaXMgSW1hZ2VSZWFkZXIsIGFkZAogICAgIC8vIEdSQUxMT0NfVVNBR0VfSFdfQ0FNRVJBX1pTTCB0byB0aGUgdXNhZ2Ugc28gSEFMIGtub3dzIGl0IHdpbGwgYmUgdXNlZAogICAgIC8vIGZvciB0aGUgWlNMIHVzZSBjYXNlLgpAQCAtNjczLDEyICs2NzYsMjAgQEAKICAgICAvLyAgICAgMi4gR1JBTExPQ19VU0FHRV9IV19SRU5ERVIKICAgICAvLyAgICAgMy4gR1JBTExPQ19VU0FHRV9IV19DT01QT1NFUgogICAgIC8vICAgICA0LiBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIKLSAgICBpZiAoY2FtZXJhM19zdHJlYW06OmZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQgJiYKLSAgICAgICAgICAgICh1ICYgKEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRSB8IEdSQUxMT0NfVVNBR0VfSFdfUkVOREVSIHwKKyAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCAmJgorICAgICAgICAgICAgKCpjb25zdW1lclVzYWdlICYgKEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRSB8IEdSQUxMT0NfVVNBR0VfSFdfUkVOREVSIHwKICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfSFdfQ09NUE9TRVIgfCBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIpKSA9PSAwKSB7Ci0gICAgICAgIHUgfD0gR1JBTExPQ19VU0FHRV9IV19DQU1FUkFfWlNMOworICAgICAgICAqY29uc3VtZXJVc2FnZSB8PSBHUkFMTE9DX1VTQUdFX0hXX0NBTUVSQV9aU0w7CiAgICAgfQorfQogCitzdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpnZXRFbmRwb2ludFVzYWdlRm9yU3VyZmFjZSh1aW50NjRfdCAqdXNhZ2UsCisgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKSBjb25zdCB7CisgICAgc3RhdHVzX3QgcmVzOworICAgIHVpbnQ2NF90IHUgPSAwOworCisgICAgcmVzID0gbmF0aXZlX3dpbmRvd19nZXRfY29uc3VtZXJfdXNhZ2Uoc3RhdGljX2Nhc3Q8QU5hdGl2ZVdpbmRvdyo+KHN1cmZhY2UuZ2V0KCkpLCAmdSk7CisgICAgYXBwbHlaU0xVc2FnZVF1aXJrKGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQsICZ1KTsKICAgICAqdXNhZ2UgPSB1OwogICAgIHJldHVybiByZXM7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oCmluZGV4IDZmMzZmOTIuLjIxMjhkYTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oCkBAIC0xOTAsNiArMTkwLDkgQEAKICAgICAgKi8KICAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0U3VyZmFjZUlkKGNvbnN0IHNwPFN1cmZhY2U+ICYvKnN1cmZhY2UqLykgeyByZXR1cm4gMDsgfQogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRVbmlxdWVTdXJmYWNlSWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mLAorICAgICAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPHNpemVfdD4qKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfTsKKwogICAgIC8qKgogICAgICAqIFVwZGF0ZSB0aGUgc3RyZWFtIG91dHB1dCBzdXJmYWNlcy4KICAgICAgKi8KQEAgLTE5OCw2ICsyMDEsMTEgQEAKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4gJnJlbW92ZWRTdXJmYWNlSWRzLAogICAgICAgICAgICAgS2V5ZWRWZWN0b3I8c3A8U3VyZmFjZT4sIHNpemVfdD4gKm91dHB1dE1hcC8qb3V0Ki8pOwogCisgICAgLyoqCisgICAgICogQXBwbHkgWlNMIHJlbGF0ZWQgY29uc3VtZXIgdXNhZ2UgcXVpcmsuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgYXBwbHlaU0xVc2FnZVF1aXJrKGludCBmb3JtYXQsIHVpbnQ2NF90ICpjb25zdW1lclVzYWdlIC8qaW5vdXQqLyk7CisKICAgcHJvdGVjdGVkOgogICAgIENhbWVyYTNPdXRwdXRTdHJlYW0oaW50IGlkLCBjYW1lcmEzX3N0cmVhbV90eXBlX3QgdHlwZSwKICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCkBAIC0yMTMsNiArMjIxLDcgQEAKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCiAgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpOwogCkBAIC0yODUsMTAgKzI5NCwxMSBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXR1cm5CdWZmZXJMb2NrZWQoCiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKLSAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKTsKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXVlQnVmZmVyVG9Db25zdW1lcihzcDxBTmF0aXZlV2luZG93PiYgY29uc3VtZXIsCi0gICAgICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGludCBhbndSZWxlYXNlRmVuY2UpOworICAgICAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyLCBpbnQgYW53UmVsZWFzZUZlbmNlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVRdWV1ZUxvY2tlZCgpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZS5oCmluZGV4IGE3MTFhNmQuLjJiZGU5NDkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZS5oCkBAIC02Nyw2ICs2NywxOCBAQAogICAgIHZpcnR1YWwgc3NpemVfdCBnZXRTdXJmYWNlSWQoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpID0gMDsKIAogICAgIC8qKgorICAgICAqIFF1ZXJ5IHRoZSB1bmlxdWUgc3VyZmFjZSBJRHMgb2YgY3VycmVudCBzdXJmYWNlSWRzLgorICAgICAqIFdoZW4gcGFzc2luZyB1bmlxdWUgc3VyZmFjZSBJRHMgaW4gcmV0dXJuQnVmZmVyKCksIGlmIHRoZQorICAgICAqIHN1cmZhY2VJZCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHN0cmVhbSwgdGhlIG91dHB1dCBjb3JyZXNwb25kaW5nIHRvCisgICAgICogdGhlIHVuaXF1ZSBzdXJmYWNlIElEIHdpbGwgYmUgaWdub3JlZCBhbmQgbm90IGRlbGl2ZXJlZCB0byBjbGllbnQuCisgICAgICoKKyAgICAgKiBSZXR1cm4gSU5WQUxJRF9PUEVSQVRJT04gaWYgYW5kIG9ubHkgaWYgdGhlIHN0cmVhbSBkb2VzIG5vdCBzdXBwb3J0CisgICAgICogc3VyZmFjZSBzaGFyaW5nLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VW5pcXVlU3VyZmFjZUlkcyhjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlSWRzLAorICAgICAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPHNpemVfdD4qIG91dFVuaXF1ZUlkcykgPSAwOworCisgICAgLyoqCiAgICAgICogVXBkYXRlIHRoZSBzdHJlYW0gb3V0cHV0IHN1cmZhY2VzLgogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgdXBkYXRlU3RyZWFtKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiAmb3V0cHV0U3VyZmFjZXMsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmNwcAppbmRleCBmYjNjZTRjLi5lM2I3NGQ3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5jcHAKQEAgLTE0LDYgKzE0LDEwIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYTMtU2hhcmVkT3VTdHJtIgorI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKICNpbmNsdWRlICJDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTI4LDE2ICszMiwxNyBAQAogICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlLCBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsCiAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCiAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0LCBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAotICAgICAgICBpbnQgc2V0SWQpIDoKKyAgICAgICAgaW50IHNldElkLCBib29sIHVzZUhhbEJ1Zk1hbmFnZXIpIDoKICAgICAgICAgQ2FtZXJhM091dHB1dFN0cmVhbShpZCwgQ0FNRVJBM19TVFJFQU1fT1VUUFVULCB3aWR0aCwgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiwgcGh5c2ljYWxDYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lclVzYWdlLCB0aW1lc3RhbXBPZmZzZXQsIHNldElkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZXJVc2FnZSwgdGltZXN0YW1wT2Zmc2V0LCBzZXRJZCksCisgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyKHVzZUhhbEJ1Zk1hbmFnZXIpIHsKICAgICBzaXplX3QgY29uc3VtZXJDb3VudCA9IHN0ZDo6bWluKHN1cmZhY2VzLnNpemUoKSwga01heE91dHB1dHMpOwogICAgIGlmIChzdXJmYWNlcy5zaXplKCkgPiBjb25zdW1lckNvdW50KSB7CiAgICAgICAgIEFMT0dFKCIlczogVHJ5aW5nIHRvIGFkZCBtb3JlIGNvbnN1bWVycyB0aGFuIHRoZSBtYXhpbXVtICIsIF9fZnVuY19fKTsKICAgICB9CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb25zdW1lckNvdW50OyBpKyspIHsKLSAgICAgICAgbVN1cmZhY2VzW2ldID0gc3VyZmFjZXNbaV07CisgICAgICAgIG1TdXJmYWNlVW5pcXVlSWRzW2ldID0gc3RkOjptYWtlX3BhaXIoc3VyZmFjZXNbaV0sIG1OZXh0VW5pcXVlU3VyZmFjZUlkKyspOwogICAgIH0KIH0KIApAQCAtNDgsMTUgKzUzLDE1IEBACiBzdGF0dXNfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpjb25uZWN0U3RyZWFtU3BsaXR0ZXJMb2NrZWQoKSB7CiAgICAgc3RhdHVzX3QgcmVzID0gT0s7CiAKLSAgICBtU3RyZWFtU3BsaXR0ZXIgPSBuZXcgQ2FtZXJhM1N0cmVhbVNwbGl0dGVyKCk7CisgICAgbVN0cmVhbVNwbGl0dGVyID0gbmV3IENhbWVyYTNTdHJlYW1TcGxpdHRlcihtVXNlSGFsQnVmTWFuYWdlcik7CiAKICAgICB1aW50NjRfdCB1c2FnZTsKICAgICBnZXRFbmRwb2ludFVzYWdlKCZ1c2FnZSk7CiAKICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c2l6ZV90LCBzcDxTdXJmYWNlPj4gaW5pdGlhbFN1cmZhY2VzOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heE91dHB1dHM7IGkrKykgewotICAgICAgICBpZiAobVN1cmZhY2VzW2ldICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGluaXRpYWxTdXJmYWNlcy5lbXBsYWNlKGksIG1TdXJmYWNlc1tpXSk7CisgICAgICAgIGlmIChtU3VyZmFjZVVuaXF1ZUlkc1tpXS5maXJzdCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpbml0aWFsU3VyZmFjZXMuZW1wbGFjZShpLCBtU3VyZmFjZVVuaXF1ZUlkc1tpXS5maXJzdCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTcxLDYgKzc2LDMxIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6YXR0YWNoQnVmZmVyVG9TcGxpdHRlckxvY2tlZCgKKyAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW5iLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcykgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworCisgICAgLy8gQXR0YWNoIHRoZSBidWZmZXIgdG8gdGhlIHNwbGl0dGVyIG91dHB1dCBxdWV1ZXMuIFRoaXMgY291bGQgYmxvY2sgaWYKKyAgICAvLyB0aGUgb3V0cHV0IHF1ZXVlIGRvZXNuJ3QgaGF2ZSBhbnkgZW1wdHkgc2xvdC4gU28gdW5sb2NrIGR1cmluZyB0aGUgY291cnNlCisgICAgLy8gb2YgYXR0YWNoQnVmZmVyVG9PdXRwdXRzLgorICAgIHNwPENhbWVyYTNTdHJlYW1TcGxpdHRlcj4gc3BsaXR0ZXIgPSBtU3RyZWFtU3BsaXR0ZXI7CisgICAgbUxvY2sudW5sb2NrKCk7CisgICAgcmVzID0gc3BsaXR0ZXItPmF0dGFjaEJ1ZmZlclRvT3V0cHV0cyhhbmIsIHN1cmZhY2VfaWRzKTsKKyAgICBtTG9jay5sb2NrKCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQ2Fubm90IGF0dGFjaCBzdHJlYW0gc3BsaXR0ZXIgYnVmZmVyIHRvIG91dHB1dHM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgLy8gT25seSB0cmFuc2l0aW9uIHRvIFNUQVRFX0FCQU5ET05FRCBmcm9tIFNUQVRFX0NPTkZJR1VSRUQuIChJZiBpdCBpcyBTVEFURV9QUkVQQVJJTkcsCisgICAgICAgIC8vIGxldCBwcmVwYXJlTmV4dEJ1ZmZlciBoYW5kbGUgdGhlIGVycm9yLikKKyAgICAgICAgaWYgKHJlcyA9PSBOT19JTklUICYmIG1TdGF0ZSA9PSBTVEFURV9DT05GSUdVUkVEKSB7CisgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9BQkFORE9ORUQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworCiBzdGF0dXNfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpub3RpZnlCdWZmZXJSZWxlYXNlZChBTmF0aXZlV2luZG93QnVmZmVyICphbndCdWZmZXIpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAgICAgc3RhdHVzX3QgcmVzID0gT0s7CkBAIC04OSw3ICsxMTksNyBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICByZXR1cm4gKG1TdXJmYWNlc1tzdXJmYWNlX2lkXSA9PSBudWxscHRyKTsKKyAgICByZXR1cm4gKG1TdXJmYWNlVW5pcXVlSWRzW3N1cmZhY2VfaWRdLmZpcnN0ID09IG51bGxwdHIpOwogfQogCiBzdGF0dXNfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpzZXRDb25zdW1lcnMoY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBzdXJmYWNlcykgewpAQCAtMTEyLDcgKzE0Miw3IEBACiAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgICAgICB9CiAKLSAgICAgICAgbVN1cmZhY2VzW2lkXSA9IHN1cmZhY2U7CisgICAgICAgIG1TdXJmYWNlVW5pcXVlSWRzW2lkXSA9IHN0ZDo6bWFrZV9wYWlyKHN1cmZhY2UsIG1OZXh0VW5pcXVlU3VyZmFjZUlkKyspOwogCiAgICAgICAgIC8vIE9ubHkgY2FsbCBhZGRPdXRwdXQgaWYgdGhlIHNwbGl0dGVyIGhhcyBiZWVuIGNvbm5lY3RlZC4KICAgICAgICAgaWYgKG1TdHJlYW1TcGxpdHRlciAhPSBudWxscHRyKSB7CkBAIC0xMjgsNyArMTU4LDcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6Z2V0QnVmZmVyTG9ja2VkKGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAqYnVmZmVyLAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcykgeworICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlSWRzKSB7CiAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW5iOwogICAgIGludCBmZW5jZUZkID0gLTE7CiAKQEAgLTEzOCwyMyArMTY4LDExIEBACiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCi0gICAgLy8gQXR0YWNoIHRoZSBidWZmZXIgdG8gdGhlIHNwbGl0dGVyIG91dHB1dCBxdWV1ZXMuIFRoaXMgY291bGQgYmxvY2sgaWYKLSAgICAvLyB0aGUgb3V0cHV0IHF1ZXVlIGRvZXNuJ3QgaGF2ZSBhbnkgZW1wdHkgc2xvdC4gU28gdW5sb2NrIGR1cmluZyB0aGUgY291cnNlCi0gICAgLy8gb2YgYXR0YWNoQnVmZmVyVG9PdXRwdXRzLgotICAgIHNwPENhbWVyYTNTdHJlYW1TcGxpdHRlcj4gc3BsaXR0ZXIgPSBtU3RyZWFtU3BsaXR0ZXI7Ci0gICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgcmVzID0gc3BsaXR0ZXItPmF0dGFjaEJ1ZmZlclRvT3V0cHV0cyhhbmIsIHN1cmZhY2VfaWRzKTsKLSAgICBtTG9jay5sb2NrKCk7Ci0gICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQ2Fubm90IGF0dGFjaCBzdHJlYW0gc3BsaXR0ZXIgYnVmZmVyIHRvIG91dHB1dHM6ICVzICglZCkiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgLy8gT25seSB0cmFuc2l0aW9uIHRvIFNUQVRFX0FCQU5ET05FRCBmcm9tIFNUQVRFX0NPTkZJR1VSRUQuIChJZiBpdCBpcyBTVEFURV9QUkVQQVJJTkcsCi0gICAgICAgIC8vIGxldCBwcmVwYXJlTmV4dEJ1ZmZlciBoYW5kbGUgdGhlIGVycm9yLikKLSAgICAgICAgaWYgKHJlcyA9PSBOT19JTklUICYmIG1TdGF0ZSA9PSBTVEFURV9DT05GSUdVUkVEKSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9BQkFORE9ORUQ7CisgICAgaWYgKCFtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICByZXMgPSBhdHRhY2hCdWZmZXJUb1NwbGl0dGVyTG9ja2VkKGFuYiwgc3VyZmFjZUlkcyk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTY4LDggKzE4NiwzOCBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpxdWV1ZUJ1ZmZlclRvQ29uc3VtZXIoc3A8QU5hdGl2ZVdpbmRvdz4mIGNvbnN1bWVyLAotICAgICAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyLCBpbnQgYW53UmVsZWFzZUZlbmNlKSB7Ci0gICAgc3RhdHVzX3QgcmVzID0gY29uc3VtZXItPnF1ZXVlQnVmZmVyKGNvbnN1bWVyLmdldCgpLCBidWZmZXIsIGFud1JlbGVhc2VGZW5jZSk7CisgICAgICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGludCBhbndSZWxlYXNlRmVuY2UsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiB1bmlxdWVTdXJmYWNlSWRzKSB7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgaWYgKG1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgIGlmICh1bmlxdWVTdXJmYWNlSWRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHVuaXF1ZVN1cmZhY2VJZHMgbXVzdCBub3QgYmUgZW1wdHkhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+IHN1cmZhY2VJZHM7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgdW5pcXVlSWQgOiB1bmlxdWVTdXJmYWNlSWRzKSB7CisgICAgICAgICAgICBib29sIHVuaXF1ZUlkRm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heE91dHB1dHM7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChtU3VyZmFjZVVuaXF1ZUlkc1tpXS5zZWNvbmQgPT0gdW5pcXVlSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgc3VyZmFjZUlkcy5wdXNoX2JhY2soaSk7CisgICAgICAgICAgICAgICAgICAgIHVuaXF1ZUlkRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXVuaXF1ZUlkRm91bmQpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXM6IHVua25vd24gdW5pcXVlIHN1cmZhY2UgSUQgJXp1IGZvciBzdHJlYW0gJWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXQgbWlnaHQgaGF2ZSBiZWVuIHJlbW92ZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdW5pcXVlSWQsIG1JZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmVzID0gYXR0YWNoQnVmZmVyVG9TcGxpdHRlckxvY2tlZChidWZmZXIsIHN1cmZhY2VJZHMpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzID0gY29uc3VtZXItPnF1ZXVlQnVmZmVyKGNvbnN1bWVyLmdldCgpLCBidWZmZXIsIGFud1JlbGVhc2VGZW5jZSk7CiAKICAgICAvLyBBZnRlciBxdWV1aW5nIGJ1ZmZlciB0byB0aGUgaW50ZXJuYWwgY29uc3VtZXIgcXVldWUsIGNoZWNrIHdoZXRoZXIgdGhlIGJ1ZmZlciBpcwogICAgIC8vIHN1Y2Nlc3NmdWxseSBxdWV1ZWQgdG8gdGhlIG91dHB1dCBxdWV1ZXMuCkBAIC0yMjgsOCArMjc2LDggQEAKICAgICAgICAgKnVzYWdlID0gZ2V0UHJlc2V0Q29uc3VtZXJVc2FnZSgpOwogCiAgICAgICAgIGZvciAoc2l6ZV90IGlkID0gMDsgaWQgPCBrTWF4T3V0cHV0czsgaWQrKykgewotICAgICAgICAgICAgaWYgKG1TdXJmYWNlc1tpZF0gIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIHJlcyA9IGdldEVuZHBvaW50VXNhZ2VGb3JTdXJmYWNlKCZ1LCBtU3VyZmFjZXNbaWRdKTsKKyAgICAgICAgICAgIGlmIChtU3VyZmFjZVVuaXF1ZUlkc1tpZF0uZmlyc3QgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJlcyA9IGdldEVuZHBvaW50VXNhZ2VGb3JTdXJmYWNlKCZ1LCBtU3VyZmFjZVVuaXF1ZUlkc1tpZF0uZmlyc3QpOwogICAgICAgICAgICAgICAgICp1c2FnZSB8PSB1OwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yNDUsNyArMjkzLDcgQEAKIHNzaXplX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6Z2V0TmV4dFN1cmZhY2VJZExvY2tlZCgpIHsKICAgICBzc2l6ZV90IGlkID0gLTE7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4T3V0cHV0czsgaSsrKSB7Ci0gICAgICAgIGlmIChtU3VyZmFjZXNbaV0gPT0gbnVsbHB0cikgeworICAgICAgICBpZiAobVN1cmZhY2VVbmlxdWVJZHNbaV0uZmlyc3QgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgaWQgPSBpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTI1OCw3ICszMDYsNyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKICAgICBzc2l6ZV90IGlkID0gLTE7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4T3V0cHV0czsgaSsrKSB7Ci0gICAgICAgIGlmIChtU3VyZmFjZXNbaV0gPT0gc3VyZmFjZSkgeworICAgICAgICBpZiAobVN1cmZhY2VVbmlxdWVJZHNbaV0uZmlyc3QgPT0gc3VyZmFjZSkgewogICAgICAgICAgICAgaWQgPSBpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTI2Nyw2ICszMTUsMjYgQEAKICAgICByZXR1cm4gaWQ7CiB9CiAKK3N0YXR1c190IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06OmdldFVuaXF1ZVN1cmZhY2VJZHMoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VJZHMsCisgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxzaXplX3Q+KiBvdXRVbmlxdWVJZHMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgaWYgKG91dFVuaXF1ZUlkcyA9PSBudWxscHRyIHx8IHN1cmZhY2VJZHMuc2l6ZSgpID4ga01heE91dHB1dHMpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBvdXRVbmlxdWVJZHMtPmNsZWFyKCk7CisgICAgb3V0VW5pcXVlSWRzLT5yZXNlcnZlKHN1cmZhY2VJZHMuc2l6ZSgpKTsKKworICAgIGZvciAoY29uc3QgYXV0byYgc3VyZmFjZUlkIDogc3VyZmFjZUlkcykgeworICAgICAgICBpZiAoc3VyZmFjZUlkID49IGtNYXhPdXRwdXRzKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIG91dFVuaXF1ZUlkcy0+cHVzaF9iYWNrKG1TdXJmYWNlVW5pcXVlSWRzW3N1cmZhY2VJZF0uc2Vjb25kKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpyZXZlcnRQYXJ0aWFsVXBkYXRlTG9ja2VkKAogICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxzcDxTdXJmYWNlPiwgc2l6ZV90PiAmcmVtb3ZlZFN1cmZhY2VzLAogICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxzcDxTdXJmYWNlPiwgc2l6ZV90PiAmYXR0YWNoZWRTdXJmYWNlcykgewpAQCAtMjgwLDcgKzM0OCw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgbVN1cmZhY2VzW2luZGV4XSA9IG51bGxwdHI7CisgICAgICAgIG1TdXJmYWNlVW5pcXVlSWRzW2luZGV4XSA9IHN0ZDo6bWFrZV9wYWlyKG51bGxwdHIsIG1OZXh0VW5pcXVlU3VyZmFjZUlkKyspOwogICAgIH0KIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVtb3ZlZFN1cmZhY2VzLnNpemUoKTsgaSsrKSB7CkBAIC0yOTEsNyArMzU5LDggQEAKICAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBtU3VyZmFjZXNbaW5kZXhdID0gcmVtb3ZlZFN1cmZhY2VzLmtleUF0KGkpOworICAgICAgICBtU3VyZmFjZVVuaXF1ZUlkc1tpbmRleF0gPSBzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICByZW1vdmVkU3VyZmFjZXMua2V5QXQoaSksIG1OZXh0VW5pcXVlU3VyZmFjZUlkKyspOwogICAgIH0KIAogICAgIHJldHVybiByZXQ7CkBAIC0zNDMsOCArNDEyLDggQEAKIAogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1TdXJmYWNlc1tpdF0gPSBudWxscHRyOwotICAgICAgICByZW1vdmVkU3VyZmFjZXMuYWRkKG1TdXJmYWNlc1tpdF0sIGl0KTsKKyAgICAgICAgcmVtb3ZlZFN1cmZhY2VzLmFkZChtU3VyZmFjZVVuaXF1ZUlkc1tpdF0uZmlyc3QsIGl0KTsKKyAgICAgICAgbVN1cmZhY2VVbmlxdWVJZHNbaXRdID0gc3RkOjptYWtlX3BhaXIobnVsbHB0ciwgbU5leHRVbmlxdWVTdXJmYWNlSWQrKyk7CiAgICAgfQogCiAgICAgLy9OZXh0IGFkZCB0aGUgbmV3IG91dHB1dHMKQEAgLTM2OSw3ICs0MzgsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgbVN1cmZhY2VzW3N1cmZhY2VJZF0gPSBpdDsKKyAgICAgICAgbVN1cmZhY2VVbmlxdWVJZHNbc3VyZmFjZUlkXSA9IHN0ZDo6bWFrZV9wYWlyKGl0LCBtTmV4dFVuaXF1ZVN1cmZhY2VJZCsrKTsKICAgICAgICAgb3V0cHV0TWFwLT5hZGQoaXQsIHN1cmZhY2VJZCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oCmluZGV4IDAyYjFjMDkuLmI1ZTM3YzIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oCkBAIC0xNyw2ICsxNyw3IEBACiAjaWZuZGVmIEFORFJPSURfU0VSVkVSU19DQU1FUkEzX1NIQVJFRF9PVVRQVVRfU1RSRUFNX0gKICNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQTNfU0hBUkVEX09VVFBVVF9TVFJFQU1fSAogCisjaW5jbHVkZSA8YXJyYXk+CiAjaW5jbHVkZSAiQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmgiCiAjaW5jbHVkZSAiQ2FtZXJhM091dHB1dFN0cmVhbS5oIgogCkBAIC0zNyw3ICszOCw4IEBACiAgICAgICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlLCBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsCiAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCi0gICAgICAgICAgICBpbnQgc2V0SWQgPSBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCk7CisgICAgICAgICAgICBpbnQgc2V0SWQgPSBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCwKKyAgICAgICAgICAgIGJvb2wgdXNlSGFsQnVmTWFuYWdlciA9IGZhbHNlKTsKIAogICAgIHZpcnR1YWwgfkNhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0oKTsKIApAQCAtNDksNiArNTEsMTUgQEAKIAogICAgIHZpcnR1YWwgc3NpemVfdCBnZXRTdXJmYWNlSWQoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpOwogCisgICAgLyoqCisgICAgICogUXVlcnkgdGhlIHVuaXF1ZSBzdXJmYWNlIElEcyBvZiBjdXJyZW50IHN1cmZhY2VJZHMuCisgICAgICogV2hlbiBwYXNzaW5nIHVuaXF1ZSBzdXJmYWNlIElEcyBpbiByZXR1cm5CdWZmZXIoKSwgaWYgdGhlCisgICAgICogc3VyZmFjZUlkIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3RyZWFtLCB0aGUgb3V0cHV0IGNvcnJlc3BvbmRpbmcgdG8KKyAgICAgKiB0aGUgdW5pcXVlIHN1cmZhY2UgSUQgd2lsbCBiZSBpZ25vcmVkIGFuZCBub3QgZGVsaXZlcmVkIHRvIGNsaWVudC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFVuaXF1ZVN1cmZhY2VJZHMoY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZUlkcywKKyAgICAgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxzaXplX3Q+KiBvdXRVbmlxdWVJZHMpIG92ZXJyaWRlOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCB1cGRhdGVTdHJlYW0oY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+ICZvdXRwdXRTdXJmYWNlcywKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE91dHB1dFN0cmVhbUluZm8+ICZvdXRwdXRJbmZvLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiAmcmVtb3ZlZFN1cmZhY2VJZHMsCkBAIC01OCw4ICs2OSwxNyBAQAogCiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4T3V0cHV0cyA9IDQ7CiAKLSAgICAvLyBNYXAgc3VyZmFjZUlkIC0+IG91dHB1dCBzdXJmYWNlcwotICAgIHNwPFN1cmZhY2U+IG1TdXJmYWNlc1trTWF4T3V0cHV0c107CisgICAgLy8gV2hldGhlciBIQUwgaXMgaW4gY29udHJvbCBmb3IgYnVmZmVyIG1hbmFnZW1lbnQuIFN1cmZhY2Ugc2hhcmluZyBiZWhhdmlvcgorICAgIC8vIGRlcGVuZHMgb24gdGhpcyBmbGFnLgorICAgIGNvbnN0IGJvb2wgbVVzZUhhbEJ1Zk1hbmFnZXI7CisKKyAgICAvLyBQYWlyIG9mIGFuIG91dHB1dCBTdXJmYWNlIGFuZCBpdHMgdW5pcXVlIElECisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8c3A8U3VyZmFjZT4sIHNpemVfdD4gU3VyZmFjZVVuaXF1ZUlkOworCisgICAgLy8gTWFwIHN1cmZhY2VJZCAtPiAob3V0cHV0IHN1cmZhY2UsIHVuaXF1ZSBzdXJmYWNlIElEKQorICAgIHN0ZDo6YXJyYXk8U3VyZmFjZVVuaXF1ZUlkLCBrTWF4T3V0cHV0cz4gbVN1cmZhY2VVbmlxdWVJZHM7CisKKyAgICBzaXplX3QgbU5leHRVbmlxdWVTdXJmYWNlSWQgPSAwOwogCiAgICAgc3NpemVfdCBnZXROZXh0U3VyZmFjZUlkTG9ja2VkKCk7CiAKQEAgLTc4LDEzICs5OCwyNCBAQAogICAgIHN0YXR1c190IGNvbm5lY3RTdHJlYW1TcGxpdHRlckxvY2tlZCgpOwogCiAgICAgLyoqCisgICAgICogQXR0YWNoIHRoZSBvdXRwdXQgYnVmZmVyIHRvIHN0cmVhbSBzcGxpdHRlci4KKyAgICAgKiBXaGVuIGNhbWVyYSBzZXJ2aWNlIGlzIGRvaW5nIGJ1ZmZlciBtYW5hZ2VtZW50LCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZAorICAgICAqIGJlZm9yZSB0aGUgYnVmZmVyIGlzIGhhbmRlZCBvdXQgdG8gSEFMIGluIHJlcXVlc3QgdGhyZWFkLgorICAgICAqIFdoZW4gSEFMIGlzIGRvaW5nIGJ1ZmZlciBtYW5hZ2VtZW50LCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuCisgICAgICogdGhlIGJ1ZmZlciBpcyByZXR1cm5lZCBmcm9tIEhBTCBpbiBod2JpbmRlciBjYWxsYmFjayB0aHJlYWQuCisgICAgICovCisgICAgc3RhdHVzX3QgYXR0YWNoQnVmZmVyVG9TcGxpdHRlckxvY2tlZChBTmF0aXZlV2luZG93QnVmZmVyKiBhbmIsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyk7CisKKyAgICAvKioKICAgICAgKiBJbnRlcm5hbCBDYW1lcmEzU3RyZWFtIGludGVyZmFjZQogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyTG9ja2VkKGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAqYnVmZmVyLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBxdWV1ZUJ1ZmZlclRvQ29uc3VtZXIoc3A8QU5hdGl2ZVdpbmRvdz4mIGNvbnN1bWVyLAotICAgICAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyLCBpbnQgYW53UmVsZWFzZUZlbmNlKTsKKyAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgaW50IGFud1JlbGVhc2VGZW5jZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHVuaXF1ZVN1cmZhY2VJZHMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVRdWV1ZUxvY2tlZCgpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcAppbmRleCA3ZWJjMjk5Li4yNGQxYzFiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAKQEAgLTY3LDcgKzY3LDggQEAKICAgICBtQnVmZmVyTGltaXRMYXRlbmN5KGtCdWZmZXJMaW1pdExhdGVuY3lCaW5TaXplKSwKICAgICBtRm9ybWF0T3ZlcnJpZGRlbihmYWxzZSksCiAgICAgbU9yaWdpbmFsRm9ybWF0KC0xKSwKLSAgICBtUGh5c2ljYWxDYW1lcmFJZChwaHlzaWNhbENhbWVyYUlkKSB7CisgICAgbVBoeXNpY2FsQ2FtZXJhSWQocGh5c2ljYWxDYW1lcmFJZCksCisgICAgbUxhc3RUaW1lc3RhbXAoMCkgewogCiAgICAgY2FtZXJhM19zdHJlYW06OnN0cmVhbV90eXBlID0gdHlwZTsKICAgICBjYW1lcmEzX3N0cmVhbTo6d2lkdGggPSB3aWR0aDsKQEAgLTY1NCw3ICs2NTUsOCBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpyZXR1cm5CdWZmZXIoY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCi0gICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKSB7CisgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcsCisgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCkBAIC02NjYsNiArNjY4LDE1IEBACiAKICAgICByZW1vdmVPdXRzdGFuZGluZ0J1ZmZlcihidWZmZXIpOwogCisgICAgLy8gQnVmZmVyIHN0YXR1cyBtYXkgYmUgY2hhbmdlZCwgc28gbWFrZSBhIGNvcHkgb2YgdGhlIHN0cmVhbV9idWZmZXIgc3RydWN0LgorICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlciBiID0gYnVmZmVyOworICAgIGlmICh0aW1lc3RhbXBJbmNyZWFzaW5nICYmIHRpbWVzdGFtcCAhPSAwICYmIHRpbWVzdGFtcCA8PSBtTGFzdFRpbWVzdGFtcCkgeworICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogdGltZXN0YW1wICUiIFBSSWQ2NCAiIGlzIG5vdCBpbmNyZWFzaW5nLiBQcmV2IHRpbWVzdGFtcCAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHRpbWVzdGFtcCwgbUxhc3RUaW1lc3RhbXApOworICAgICAgICBiLnN0YXR1cyA9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUjsKKyAgICB9CisgICAgbUxhc3RUaW1lc3RhbXAgPSB0aW1lc3RhbXA7CisKICAgICAvKioKICAgICAgKiBUT0RPOiBDaGVjayB0aGF0IHRoZSBzdGF0ZSBpcyB2YWxpZCBmaXJzdC4KICAgICAgKgpAQCAtNjc0LDkgKzY4NSw5IEBACiAgICAgICoKICAgICAgKiBEbyB0aGlzIGZvciBnZXRCdWZmZXIgYXMgd2VsbC4KICAgICAgKi8KLSAgICBzdGF0dXNfdCByZXMgPSByZXR1cm5CdWZmZXJMb2NrZWQoYnVmZmVyLCB0aW1lc3RhbXApOworICAgIHN0YXR1c190IHJlcyA9IHJldHVybkJ1ZmZlckxvY2tlZChiLCB0aW1lc3RhbXAsIHN1cmZhY2VfaWRzKTsKICAgICBpZiAocmVzID09IE9LKSB7Ci0gICAgICAgIGZpcmVCdWZmZXJMaXN0ZW5lcnNMb2NrZWQoYnVmZmVyLCAvKmFjcXVpcmVkKi9mYWxzZSwgLypvdXRwdXQqL3RydWUpOworICAgICAgICBmaXJlQnVmZmVyTGlzdGVuZXJzTG9ja2VkKGIsIC8qYWNxdWlyZWQqL2ZhbHNlLCAvKm91dHB1dCovdHJ1ZSk7CiAgICAgfQogCiAgICAgLy8gRXZlbiBpZiByZXR1cm5pbmcgdGhlIGJ1ZmZlciBmYWlsZWQsIHdlIHN0aWxsIHdhbnQgdG8gc2lnbmFsIHdob2V2ZXIgaXMgd2FpdGluZyBmb3IgdGhlCkBAIC03ODUsNiArNzk2LDEyIEBACiAgICAgcmV0dXJuIGhhc091dHN0YW5kaW5nQnVmZmVyc0xvY2tlZCgpOwogfQogCitzaXplX3QgQ2FtZXJhM1N0cmVhbTo6Z2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKSBjb25zdCB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgcmV0dXJuIGdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpOworfQorCiBzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpzZXRTdGF0dXNUcmFja2VyKHNwPFN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAgICAgc3A8U3RhdHVzVHJhY2tlcj4gb2xkVHJhY2tlciA9IG1TdGF0dXNUcmFja2VyLnByb21vdGUoKTsKQEAgLTgyNyw3ICs4NDQsNyBAQAogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KIHN0YXR1c190IENhbWVyYTNTdHJlYW06OnJldHVybkJ1ZmZlckxvY2tlZChjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYpIHsKICAgICBBTE9HRSgiJXM6IFRoaXMgdHlwZSBvZiBzdHJlYW0gZG9lcyBub3Qgc3VwcG9ydCBvdXRwdXQiLCBfX0ZVTkNUSU9OX18pOwogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKaW5kZXggMDM1NTk3OC4uZGRiYTlmNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKQEAgLTMyMiwxMSArMzIyLDE3IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJuIGEgYnVmZmVyIHRvIHRoZSBzdHJlYW0gYWZ0ZXIgdXNlIGJ5IHRoZSBIQUwuCiAgICAgICoKKyAgICAgKiBNdWx0aXBsZSBzdXJmYWNlcyBjb3VsZCBzaGFyZSB0aGUgc2FtZSBIQUwgc3RyZWFtLCBidXQgYSByZXF1ZXN0IG1heQorICAgICAqIGJlIG9ubHkgZm9yIGEgc3Vic2V0IG9mIHN1cmZhY2VzLiBJbiB0aGlzIGNhc2UsIHRoZQorICAgICAqIENhbWVyYTNTdHJlYW1JbnRlcmZhY2Ugb2JqZWN0IG5lZWRzIHRoZSBzdXJmYWNlIElEIGluZm9ybWF0aW9uIHRvIGF0dGFjaAorICAgICAqIGJ1ZmZlcnMgZm9yIHRob3NlIHN1cmZhY2VzLgorICAgICAqCiAgICAgICogVGhpcyBtZXRob2QgbWF5IG9ubHkgYmUgY2FsbGVkIGZvciBidWZmZXJzIHByb3ZpZGVkIGJ5IGdldEJ1ZmZlcigpLgogICAgICAqIEZvciBiaWRpcmVjdGlvbmFsIHN0cmVhbXMsIHRoaXMgbWV0aG9kIGFwcGxpZXMgdG8gdGhlIG91dHB1dC1zaWRlIGJ1ZmZlcnMKICAgICAgKi8KICAgICBzdGF0dXNfdCAgICAgICAgIHJldHVybkJ1ZmZlcihjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKLSAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKTsKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKSk7CiAKICAgICAvKioKICAgICAgKiBGaWxsIGluIHRoZSBjYW1lcmEzX3N0cmVhbV9idWZmZXIgd2l0aCB0aGUgbmV4dCB2YWxpZCBidWZmZXIgZm9yIHRoaXMKQEAgLTM2MCw2ICszNjYsMTEgQEAKICAgICAgKi8KICAgICBib29sICAgICAgICAgICAgIGhhc091dHN0YW5kaW5nQnVmZmVycygpIGNvbnN0OwogCisgICAgLyoqCisgICAgICogR2V0IG51bWJlciBvZiBidWZmZXJzIGN1cnJlbnRseSBoYW5kZWQgb3V0IHRvIEhBTAorICAgICAqLworICAgIHNpemVfdCAgICAgICAgICAgZ2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKSBjb25zdDsKKwogICAgIGVudW0gewogICAgICAgICBUSU1FT1VUX05FVkVSID0gLTEKICAgICB9OwpAQCAtNDczLDcgKzQ4NCw4IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJMb2NrZWQoY2FtZXJhM19zdHJlYW1fYnVmZmVyICpidWZmZXIsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXR1cm5CdWZmZXJMb2NrZWQoY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCi0gICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCk7CisgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyTG9ja2VkKGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAqYnVmZmVyKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybklucHV0QnVmZmVyTG9ja2VkKAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIpOwpAQCAtNDk1LDcgKzUwNyw3IEBACiAgICAgdmlydHVhbCBzaXplX3QgICBnZXRCdWZmZXJDb3VudExvY2tlZCgpID0gMDsKIAogICAgIC8vIEdldCBoYW5kb3V0IG91dHB1dCBidWZmZXIgY291bnQuCi0gICAgdmlydHVhbCBzaXplX3QgICBnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKSA9IDA7CisgICAgdmlydHVhbCBzaXplX3QgICBnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKSBjb25zdCA9IDA7CiAKICAgICAvLyBHZXQgaGFuZG91dCBpbnB1dCBidWZmZXIgY291bnQuCiAgICAgdmlydHVhbCBzaXplX3QgICBnZXRIYW5kb3V0SW5wdXRCdWZmZXJDb3VudExvY2tlZCgpID0gMDsKQEAgLTU2Niw2ICs1NzgsNyBAQAogICAgIGFuZHJvaWRfZGF0YXNwYWNlIG1PcmlnaW5hbERhdGFTcGFjZTsKIAogICAgIFN0cmluZzggbVBoeXNpY2FsQ2FtZXJhSWQ7CisgICAgbnNlY3NfdCBtTGFzdFRpbWVzdGFtcDsKIH07IC8vIGNsYXNzIENhbWVyYTNTdHJlYW0KIAogfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmgKaW5kZXggM2Q0NWM4OS4uYTg0NzIwYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmgKQEAgLTI0OCwxMSArMjQ4LDE4IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJuIGEgYnVmZmVyIHRvIHRoZSBzdHJlYW0gYWZ0ZXIgdXNlIGJ5IHRoZSBIQUwuCiAgICAgICoKKyAgICAgKiBNdWx0aXBsZSBzdXJmYWNlcyBjb3VsZCBzaGFyZSB0aGUgc2FtZSBIQUwgc3RyZWFtLCBidXQgYSByZXF1ZXN0IG1heQorICAgICAqIGJlIG9ubHkgZm9yIGEgc3Vic2V0IG9mIHN1cmZhY2VzLiBJbiB0aGlzIGNhc2UsIHRoZQorICAgICAqIENhbWVyYTNTdHJlYW1JbnRlcmZhY2Ugb2JqZWN0IG5lZWRzIHRoZSBzdXJmYWNlIElEIGluZm9ybWF0aW9uIHRvIGF0dGFjaAorICAgICAqIGJ1ZmZlcnMgZm9yIHRob3NlIHN1cmZhY2VzLiBGb3IgdGhlIGNhc2Ugb2Ygc2luZ2xlIHN1cmZhY2UgZm9yIGEgSEFMCisgICAgICogc3RyZWFtLCBzdXJmYWNlX2lkcyBwYXJhbWV0ZXIgaGFzIG5vIGVmZmVjdC4KKyAgICAgKgogICAgICAqIFRoaXMgbWV0aG9kIG1heSBvbmx5IGJlIGNhbGxlZCBmb3IgYnVmZmVycyBwcm92aWRlZCBieSBnZXRCdWZmZXIoKS4KICAgICAgKiBGb3IgYmlkaXJlY3Rpb25hbCBzdHJlYW1zLCB0aGlzIG1ldGhvZCBhcHBsaWVzIHRvIHRoZSBvdXRwdXQtc2lkZSBidWZmZXJzCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXR1cm5CdWZmZXIoY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCi0gICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCkgPSAwOworICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZyA9IHRydWUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKSkgPSAwOwogCiAgICAgLyoqCiAgICAgICogRmlsbCBpbiB0aGUgY2FtZXJhM19zdHJlYW1fYnVmZmVyIHdpdGggdGhlIG5leHQgdmFsaWQgYnVmZmVyIGZvciB0aGlzCkBAIC0yODksNiArMjk2LDExIEBACiAgICAgICovCiAgICAgdmlydHVhbCBib29sICAgICBoYXNPdXRzdGFuZGluZ0J1ZmZlcnMoKSBjb25zdCA9IDA7CiAKKyAgICAvKioKKyAgICAgKiBHZXQgbnVtYmVyIG9mIGJ1ZmZlcnMgY3VycmVudGx5IGhhbmRlZCBvdXQgdG8gSEFMCisgICAgICovCisgICAgdmlydHVhbCBzaXplX3QgICBnZXRPdXRzdGFuZGluZ0J1ZmZlcnNDb3VudCgpIGNvbnN0ID0gMDsKKwogICAgIGVudW0gewogICAgICAgICBUSU1FT1VUX05FVkVSID0gLTEKICAgICB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuY3BwCmluZGV4IGVjYjk4MGEuLjg0YzJlYzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5jcHAKQEAgLTE1Miw2ICsxNTIsOCBAQAogICAgIFNQX0xPR1YoIiVzOiBEaXNjb25uZWN0ZWQiLCBfX0ZVTkNUSU9OX18pOwogfQogCitDYW1lcmEzU3RyZWFtU3BsaXR0ZXI6OkNhbWVyYTNTdHJlYW1TcGxpdHRlcihib29sIHVzZUhhbEJ1Zk1hbmFnZXIpIDoKKyAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIodXNlSGFsQnVmTWFuYWdlcikge30KIAogQ2FtZXJhM1N0cmVhbVNwbGl0dGVyOjp+Q2FtZXJhM1N0cmVhbVNwbGl0dGVyKCkgewogICAgIGRpc2Nvbm5lY3QoKTsKQEAgLTI0MSw3ICsyNDMsOSBAQAogICAgIHVpbnQ2NF90IHVzYWdlID0gMDsKICAgICByZXMgPSBuYXRpdmVfd2luZG93X2dldF9jb25zdW1lcl91c2FnZShzdGF0aWNfY2FzdDxBTmF0aXZlV2luZG93Kj4ob3V0cHV0UXVldWUuZ2V0KCkpLCAmdXNhZ2UpOwogICAgIGlmICghKHVzYWdlICYgKEdSQUxMT0NfVVNBR0VfSFdfQ09NUE9TRVIgfCBHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUpKSkgewotICAgICAgICBvdXRwdXRRdWV1ZS0+c2V0RGVxdWV1ZVRpbWVvdXQoa0RlcXVldWVCdWZmZXJUaW1lb3V0KTsKKyAgICAgICAgbnNlY3NfdCB0aW1lb3V0ID0gbVVzZUhhbEJ1Zk1hbmFnZXIgPworICAgICAgICAgICAgICAgIGtIYWxCdWZNZ3JEZXF1ZXVlQnVmZmVyVGltZW91dCA6IGtOb3JtYWxEZXF1ZXVlQnVmZmVyVGltZW91dDsKKyAgICAgICAgb3V0cHV0UXVldWUtPnNldERlcXVldWVUaW1lb3V0KHRpbWVvdXQpOwogICAgIH0KIAogICAgIHJlcyA9IGdicC0+YWxsb3dBbGxvY2F0aW9uKGZhbHNlKTsKQEAgLTQzNiw4ICs0NDAsOSBAQAogICAgICAgICByZXMgPSBnYnAtPmF0dGFjaEJ1ZmZlcigmc2xvdCwgZ2IpOwogICAgICAgICBtTXV0ZXgubG9jaygpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBTUF9MT0dFKCIlczogQ2Fubm90IGFjcXVpcmVCdWZmZXIgZnJvbSBHcmFwaGljQnVmZmVyUHJvZHVjZXIgJXA6ICVzICglZCkiLAorICAgICAgICAgICAgU1BfTE9HRSgiJXM6IENhbm5vdCBhdHRhY2hCdWZmZXIgZnJvbSBHcmFwaGljQnVmZmVyUHJvZHVjZXIgJXA6ICVzICglZCkiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGdicC5nZXQoKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAvLyBUT0RPOiBtaWdodCBuZWVkIHRvIGRldGFjaC9jbGVhbnVwIHRoZSBhbHJlYWR5IGF0dGFjaGVkIGJ1ZmZlcnMgYmVmb3JlIHJldHVybj8KICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KICAgICAgICAgaWYgKChzbG90IDwgMCkgfHwgKHNsb3QgPiBCdWZmZXJRdWV1ZTo6TlVNX0JVRkZFUl9TTE9UUykpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5oCmluZGV4IDFlYWYyYmQuLjk2MGY3YWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuaApAQCAtNDksNyArNDksNyBAQAogcHVibGljOgogCiAgICAgLy8gQ29uc3RydWN0b3IKLSAgICBDYW1lcmEzU3RyZWFtU3BsaXR0ZXIoKSA9IGRlZmF1bHQ7CisgICAgQ2FtZXJhM1N0cmVhbVNwbGl0dGVyKGJvb2wgdXNlSGFsQnVmTWFuYWdlciA9IGZhbHNlKTsKIAogICAgIC8vIENvbm5lY3QgdG8gdGhlIHN0cmVhbSBzcGxpdHRlciBieSBjcmVhdGluZyBidWZmZXIgcXVldWUgYW5kIGNvbm5lY3RpbmcgaXQKICAgICAvLyB3aXRoIG91dHB1dCBzdXJmYWNlcy4KQEAgLTIyNiw3ICsyMjYsMTAgQEAKICAgICBhbmRyb2lkOjpQaXhlbEZvcm1hdCBtRm9ybWF0ID0gYW5kcm9pZDo6UElYRUxfRk9STUFUX05PTkU7CiAgICAgdWludDY0X3QgbVByb2R1Y2VyVXNhZ2UgPSAwOwogCi0gICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga0RlcXVldWVCdWZmZXJUaW1lb3V0ICAgPSBzMm5zKDEpOyAvLyAxIHNlYworICAgIC8vIFRoZSBhdHRhY2hCdWZmZXIgY2FsbCB3aWxsIGhhcHBlbiBvbiBkaWZmZXJlbnQgdGhyZWFkIGFjY29yZGluZyB0byBtVXNlSGFsQnVmTWFuYWdlciBhbmQgaGF2ZQorICAgIC8vIGRpZmZlcmVudCB0aW1pbmcgY29uc3RyYWludC4KKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrTm9ybWFsRGVxdWV1ZUJ1ZmZlclRpbWVvdXQgICAgPSBzMm5zKDEpOyAgLy8gMSBzZWMKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrSGFsQnVmTWdyRGVxdWV1ZUJ1ZmZlclRpbWVvdXQgPSBtczJucygxKTsgLy8gMSBtc2VjCiAKICAgICBNdXRleCBtTXV0ZXg7CiAKQEAgLTI3Myw2ICsyNzYsOCBAQAogICAgIHNpemVfdCBtQWNxdWlyZWRJbnB1dEJ1ZmZlcnM7CiAKICAgICBTdHJpbmc4IG1Db25zdW1lck5hbWU7CisKKyAgICBjb25zdCBib29sIG1Vc2VIYWxCdWZNYW5hZ2VyOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvRGlzdG9ydGlvbk1hcHBlci5jcHAKaW5kZXggNGRhZmVmZC4uYWU3YWY4ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0Rpc3RvcnRpb25NYXBwZXIuY3BwCkBAIC0zMTIsOCArMzEyLDggQEAKICAgICAgICAgaW50MzJfdCBjb29yZHNbNF0gPSB7CiAgICAgICAgICAgICByZWN0c1tpXSwKICAgICAgICAgICAgIHJlY3RzW2kgKyAxXSwKLSAgICAgICAgICAgIHJlY3RzW2ldICsgcmVjdHNbaSArIDJdLAotICAgICAgICAgICAgcmVjdHNbaSArIDFdICsgcmVjdHNbaSArIDNdCisgICAgICAgICAgICByZWN0c1tpXSArIHJlY3RzW2kgKyAyXSAtIDEsCisgICAgICAgICAgICByZWN0c1tpICsgMV0gKyByZWN0c1tpICsgM10gLSAxCiAgICAgICAgIH07CiAKICAgICAgICAgbWFwUmF3VG9Db3JyZWN0ZWQoY29vcmRzLCAyLCBjbGFtcCwgc2ltcGxlKTsKQEAgLTMyMSw4ICszMjEsOCBAQAogICAgICAgICAvLyBNYXAgYmFjayB0byAobCwgdCwgd2lkdGgsIGhlaWdodCkKICAgICAgICAgcmVjdHNbaV0gPSBjb29yZHNbMF07CiAgICAgICAgIHJlY3RzW2kgKyAxXSA9IGNvb3Jkc1sxXTsKLSAgICAgICAgcmVjdHNbaSArIDJdID0gY29vcmRzWzJdIC0gY29vcmRzWzBdOwotICAgICAgICByZWN0c1tpICsgM10gPSBjb29yZHNbM10gLSBjb29yZHNbMV07CisgICAgICAgIHJlY3RzW2kgKyAyXSA9IGNvb3Jkc1syXSAtIGNvb3Jkc1swXSArIDE7CisgICAgICAgIHJlY3RzW2kgKyAzXSA9IGNvb3Jkc1szXSAtIGNvb3Jkc1sxXSArIDE7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwpAQCAtNDAwLDggKzQwMCw4IEBACiAgICAgICAgIGludDMyX3QgY29vcmRzWzRdID0gewogICAgICAgICAgICAgcmVjdHNbaV0sCiAgICAgICAgICAgICByZWN0c1tpICsgMV0sCi0gICAgICAgICAgICByZWN0c1tpXSArIHJlY3RzW2kgKyAyXSwKLSAgICAgICAgICAgIHJlY3RzW2kgKyAxXSArIHJlY3RzW2kgKyAzXQorICAgICAgICAgICAgcmVjdHNbaV0gKyByZWN0c1tpICsgMl0gLSAxLAorICAgICAgICAgICAgcmVjdHNbaSArIDFdICsgcmVjdHNbaSArIDNdIC0gMQogICAgICAgICB9OwogCiAgICAgICAgIG1hcENvcnJlY3RlZFRvUmF3KGNvb3JkcywgMiwgY2xhbXAsIHNpbXBsZSk7CkBAIC00MDksOCArNDA5LDggQEAKICAgICAgICAgLy8gTWFwIGJhY2sgdG8gKGwsIHQsIHdpZHRoLCBoZWlnaHQpCiAgICAgICAgIHJlY3RzW2ldID0gY29vcmRzWzBdOwogICAgICAgICByZWN0c1tpICsgMV0gPSBjb29yZHNbMV07Ci0gICAgICAgIHJlY3RzW2kgKyAyXSA9IGNvb3Jkc1syXSAtIGNvb3Jkc1swXTsKLSAgICAgICAgcmVjdHNbaSArIDNdID0gY29vcmRzWzNdIC0gY29vcmRzWzFdOworICAgICAgICByZWN0c1tpICsgMl0gPSBjb29yZHNbMl0gLSBjb29yZHNbMF0gKyAxOworICAgICAgICByZWN0c1tpICsgM10gPSBjb29yZHNbM10gLSBjb29yZHNbMV0gKyAxOwogICAgIH0KIAogICAgIHJldHVybiBPSzsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNjM1MDYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuY3BwCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmEuaD4KKworI2luY2x1ZGUgPGhpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5oPgorI2luY2x1ZGUgPGhpZGwvQ29udmVydC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZnJhbWV3b3JrcyB7CituYW1lc3BhY2UgY2FtZXJhc2VydmljZSB7CituYW1lc3BhY2UgZGV2aWNlIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIEhDYXB0dXJlUmVzdWx0RXh0cmFzID0gYW5kcm9pZDo6ZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYXB0dXJlUmVzdWx0RXh0cmFzOwordXNpbmcgSFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8gPSBhbmRyb2lkOjpmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm87Cit1c2luZyBIQ2FtZXJhTWV0YWRhdGEgPSBhbmRyb2lkOjpmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhbWVyYU1ldGFkYXRhOworCitjb25zdCBjaGFyICpIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6OmtSZXN1bHRLZXkgPSAiQ2FwdHVyZVJlc3VsdCI7CisKK0gyQkNhbWVyYURldmljZUNhbGxiYWNrczo6SDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzKGNvbnN0IHNwPEhhbEludGVyZmFjZT4mIGJhc2UpIDogQ0Jhc2UoYmFzZSkgeyB9CisKK2Jvb2wgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjppbml0aWFsaXplTG9vcGVyKCkgeworICAgIG1DYkxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIG1DYkxvb3Blci0+c2V0TmFtZSgiY3MtbG9vcGVyIik7CisgICAgc3RhdHVzX3QgZXJyID0gbUNiTG9vcGVyLT5zdGFydCgvKnJ1bk9uQ2FsbGluZ1RocmVhZCovIGZhbHNlLCAvKmNhbkNhbGxKYXZhKi8gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklPUklUWV9ERUZBVUxUKTsKKyAgICBpZiAoZXJyICE9T0spIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzdGFydCBjYW1lcmEgZGV2aWNlIGNhbGxiYWNrIGxvb3BlciIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1IYW5kbGVyID0gbmV3IENhbGxiYWNrSGFuZGxlcih0aGlzKTsKKyAgICBtQ2JMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlcik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK0gyQkNhbWVyYURldmljZUNhbGxiYWNrczo6fkgyQkNhbWVyYURldmljZUNhbGxiYWNrcygpIHsKKyAgICBpZiAobUNiTG9vcGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKG1IYW5kbGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1DYkxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXItPmlkKCkpOworICAgICAgICB9CisgICAgICAgIG1DYkxvb3Blci0+c3RvcCgpOworICAgIH0KKyAgICBtQ2JMb29wZXIuY2xlYXIoKTsKKyAgICBtSGFuZGxlci5jbGVhcigpOworfQorCitiaW5kZXI6OlN0YXR1cyBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6Om9uRGV2aWNlRXJyb3IoCisgICAgaW50MzJfdCBlcnJvckNvZGUsIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgeworICAgIHVzaW5nIGhhcmR3YXJlOjpjYW1lcmFzZXJ2aWNlOjp1dGlsczo6Y29udmVyc2lvbjo6Y29udmVydFRvSGlkbDsKKyAgICBIQ2FwdHVyZVJlc3VsdEV4dHJhcyBoQ2FwdHVyZVJlc3VsdEV4dHJhcyA9IGNvbnZlcnRUb0hpZGwocmVzdWx0RXh0cmFzKTsKKyAgICBhdXRvIHJldCA9IG1CYXNlLT5vbkRldmljZUVycm9yKGNvbnZlcnRUb0hpZGwoZXJyb3JDb2RlKSwgaENhcHR1cmVSZXN1bHRFeHRyYXMpOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXMgT25EZXZpY2VFcnJvciBjYWxsYmFjayBmYWlsZWQgZHVlIHRvICVzIixfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgIH0KKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6b25EZXZpY2VJZGxlKCkgeworICAgIGF1dG8gcmV0ID0gbUJhc2UtPm9uRGV2aWNlSWRsZSgpOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgIEFMT0dFKCIlcyBPbkRldmljZUlkbGUgY2FsbGJhY2sgZmFpbGVkIGR1ZSB0byAlcyIsX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgIH0KKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6b25DYXB0dXJlU3RhcnRlZCgKKyAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsIGludDY0X3QgdGltZXN0YW1wKSB7CisgICAgdXNpbmcgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpjb252ZXJ0VG9IaWRsOworICAgIEhDYXB0dXJlUmVzdWx0RXh0cmFzIGhDYXB0dXJlUmVzdWx0RXh0cmFzID0gY29udmVydFRvSGlkbChyZXN1bHRFeHRyYXMpOworICAgIGF1dG8gcmV0ID0gbUJhc2UtPm9uQ2FwdHVyZVN0YXJ0ZWQoaENhcHR1cmVSZXN1bHRFeHRyYXMsIHRpbWVzdGFtcCk7CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlcyBPbkNhcHR1cmVDYWxsYmFjayBmYWlsZWQgZHVlIHRvICVzIixfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgIH0KKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK3ZvaWQgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpjb252ZXJ0UmVzdWx0TWV0YWRhdGFUb0hpZGwoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnJhd01ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbXFTaXplT3JNZXRhZGF0YSAqaFJlc3VsdE1ldGFkYXRhKSB7CisgICAgLy8gRmlyc3QgdHJ5IHdyaXRpbmcgdG8gZm1xLgorICAgIHNpemVfdCBtZXRhZGF0YV9zaXplID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHJhd01ldGFkYXRhKTsKKyAgICBpZiAoKG1ldGFkYXRhX3NpemUgPiAwKSAmJgorICAgICAgICAobUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPiAwKSkgeworICAgICAgICBpZiAobUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlLT53cml0ZSgodWludDhfdCAqKXJhd01ldGFkYXRhLCBtZXRhZGF0YV9zaXplKSkgeworICAgICAgICAgICAgaFJlc3VsdE1ldGFkYXRhLT5mbXFNZXRhZGF0YVNpemUobWV0YWRhdGFfc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiJXMgQ291bGRuJ3QgdXNlIGZtcSwgZmFsbGluZyBiYWNrIHRvIGh3YmluZGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIEhDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YTsKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmFzZXJ2aWNlOjp1dGlsczo6Y29udmVyc2lvbjo6Y29udmVydFRvSGlkbChyYXdNZXRhZGF0YSwgJm1ldGFkYXRhKTsKKyAgICAgICAgICAgIGhSZXN1bHRNZXRhZGF0YS0+bWV0YWRhdGEoc3RkOjptb3ZlKG1ldGFkYXRhKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYWxsYmFja0hhbmRsZXI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3A8UmVmQmFzZT4gb2JqID0gbnVsbHB0cjsKKyAgICBzcDxSZXN1bHRXcmFwcGVyPiByZXN1bHRXcmFwcGVyID0gbnVsbHB0cjsKKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0UmVzdWx0UmVjZWl2ZWQ6CisgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrUmVzdWx0S2V5LCAmb2JqKTsKKyAgICAgICAgICAgIGlmICghZm91bmQgfHwgb2JqID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IGZpbmQgcmVzdWx0IG9iamVjdCBpbiBjYWxsYmFjayBtZXNzYWdlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0V3JhcHBlciA9IHN0YXRpY19jYXN0PFJlc3VsdFdyYXBwZXIgKj4ob2JqLmdldCgpKTsKKyAgICAgICAgICAgIHByb2Nlc3NSZXN1bHRNZXNzYWdlKHJlc3VsdFdyYXBwZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiVW5rbm93biBjYWxsYmFjayBzZW50Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FsbGJhY2tIYW5kbGVyOjpwcm9jZXNzUmVzdWx0TWVzc2FnZSgKKyAgICBzcDxSZXN1bHRXcmFwcGVyPiAmcmVzdWx0V3JhcHBlcikgeworICAgIHNwPEgyQkNhbWVyYURldmljZUNhbGxiYWNrcz4gY29udmVydGVyID0gbUNvbnZlcnRlci5wcm9tb3RlKCk7CisgICAgaWYgKGNvbnZlcnRlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJDYWxsYmFjayB3cmFwcGVyIGhhcyBkaWVkLCByZXN1bHQgY2FsbGJhY2sgY2Fubm90IGJlIG1hZGUiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDYW1lcmFNZXRhZGF0YU5hdGl2ZSAmcmVzdWx0ID0gcmVzdWx0V3JhcHBlci0+bVJlc3VsdDsKKyAgICBhdXRvIHJlc3VsdEV4dHJhcyA9IHJlc3VsdFdyYXBwZXItPm1SZXN1bHRFeHRyYXM7CisgICAgSENhcHR1cmVSZXN1bHRFeHRyYXMgaFJlc3VsdEV4dHJhcyA9CisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OmNvbnZlcnRUb0hpZGwocmVzdWx0RXh0cmFzKTsKKworICAgIC8vIENvbnZlcnQgTWV0YWRhdGEgaW50byBIQ2FtZXJhTWV0YWRhdGE7CisgICAgRm1xU2l6ZU9yTWV0YWRhdGEgaFJlc3VsdDsKKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcmF3TWV0YWRhdGEgPSByZXN1bHQuZ2V0QW5kTG9jaygpOworICAgIGNvbnZlcnRlci0+Y29udmVydFJlc3VsdE1ldGFkYXRhVG9IaWRsKHJhd01ldGFkYXRhLCAmaFJlc3VsdCk7CisgICAgcmVzdWx0LnVubG9jayhyYXdNZXRhZGF0YSk7CisgICAgYXV0byAmcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MgPSByZXN1bHRXcmFwcGVyLT5tUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3M7CisgICAgaGlkbF92ZWM8SFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+IGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcyA9CisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OmNvbnZlcnRUb0hpZGwoCisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zLCBjb252ZXJ0ZXItPm1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSk7CisgICAgYXV0byByZXQgPSBjb252ZXJ0ZXItPm1CYXNlLT5vblJlc3VsdFJlY2VpdmVkKGhSZXN1bHQsIGhSZXN1bHRFeHRyYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcyk7CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgQUxPR0UoIiVzIE9uUmVzdWx0UmVjZWl2ZWQgY2FsbGJhY2sgZmFpbGVkIGR1ZSB0byAlcyIsX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgIH0KK30KKworYmluZGVyOjpTdGF0dXMgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpvblJlc3VsdFJlY2VpdmVkKAorICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhTmF0aXZlJiByZXN1bHQsCisgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAorICAgIGNvbnN0IDo6c3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4mIHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zKSB7CisgICAgLy8gV3JhcCBDYW1lcmFNZXRhZGF0YSwgcmVzdWx0RXh0cmFzIGFuZCBwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcyBpbiBvbgorICAgIC8vIHNwPFJlZkJhc2U+LWFibGUgc3RydWN0dXJlIGFuZCBwb3N0IGl0LgorICAgIHNwPFJlc3VsdFdyYXBwZXI+IHJlc3VsdFdyYXBwZXIgPSBuZXcgUmVzdWx0V3JhcHBlcihjb25zdF9jYXN0PENhbWVyYU1ldGFkYXRhTmF0aXZlICY+KHJlc3VsdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEV4dHJhcywgcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZXN1bHRSZWNlaXZlZCwgbUhhbmRsZXIpOworICAgIG1zZy0+c2V0T2JqZWN0KGtSZXN1bHRLZXksIHJlc3VsdFdyYXBwZXIpOworICAgIG1zZy0+cG9zdCgpOworICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworYmluZGVyOjpTdGF0dXMgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpvblByZXBhcmVkKGludDMyX3Qgc3RyZWFtSWQpIHsKKyAgICAvLyBub3QgaW1wbGVtZW50ZWQKKyAgICAvLyBUbyBzaWxlbmNlIFd1bnVzZWQtcGFyYW1ldGVyLgorICAgICh2b2lkKSBzdHJlYW1JZDsKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6b25SZXBlYXRpbmdSZXF1ZXN0RXJyb3IoCisgICAgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIsCisgICAgaW50MzJfdCByZXBlYXRpbmdSZXF1ZXN0SWQpIHsKKyAgICBhdXRvIHJldCA9CisgICAgICAgIG1CYXNlLT5vblJlcGVhdGluZ1JlcXVlc3RFcnJvcihsYXN0RnJhbWVOdW1iZXIsIHJlcGVhdGluZ1JlcXVlc3RJZCk7CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlcyBPblJlcGVhdGluZ1JlcXVlc3RFcm9yIGNhbGxiYWNrIGZhaWxlZCBkdWUgdG8gJXMiLF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworYmluZGVyOjpTdGF0dXMgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpvblJlcXVlc3RRdWV1ZUVtcHR5KCkgeworICAgIC8vIG5vdCBpbXBsZW1lbnRlZAorICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworfSAvLyBpbXBsZW1lbnRhdGlvbgorfSAvLyBWMl8wCit9IC8vIGRldmljZQorfSAvLyBjYW1lcmFzZXJ2aWNlCit9IC8vIGZyYW1ld29ya3MKK30gLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmY1MjBhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmgKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfRlJBTUVXT1JLU19BSURMX0NBTUVSQURFVklDRUNBTExCQUNLU19ICisjZGVmaW5lIEFORFJPSURfRlJBTUVXT1JLU19BSURMX0NBTUVSQURFVklDRUNBTExCQUNLU19ICisKKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9jb21tb24vMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL0lDYW1lcmFEZXZpY2VDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQm5DYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8Q2FtZXJhU2VydmljZS5oPgorI2luY2x1ZGUgPGhpZGwvQ2FtZXJhSHlicmlkSW50ZXJmYWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBmcmFtZXdvcmtzIHsKK25hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlIHsKK25hbWVzcGFjZSBkZXZpY2UgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgY2FtZXJhaHlicmlkOjpIMkJDb252ZXJ0ZXI7Cit1c2luZyBIQ2FtZXJhRGV2aWNlQ2FsbGJhY2sgPSBjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OklDYW1lcmFEZXZpY2VDYWxsYmFjazsKK3VzaW5nIEhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvID0gY2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvOwordXNpbmcgYW5kcm9pZDo6ZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpGbXFTaXplT3JNZXRhZGF0YTsKKwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OkJuQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6aW1wbDo6Q2FwdHVyZVJlc3VsdEV4dHJhczsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjppbXBsOjpDYW1lcmFNZXRhZGF0YU5hdGl2ZTsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjppbXBsOjpQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvOwordXNpbmcgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU7Cit1c2luZyBoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlOwordXNpbmcgQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUgPSBNZXNzYWdlUXVldWU8dWludDhfdCwga1N5bmNocm9uaXplZFJlYWRXcml0ZT47CisKK3N0cnVjdCBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3MgOgorICAgIHB1YmxpYyBIMkJDb252ZXJ0ZXI8SENhbWVyYURldmljZUNhbGxiYWNrLCBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLCBCbkNhbWVyYURldmljZUNhbGxiYWNrcz4geworICAgIEgyQkNhbWVyYURldmljZUNhbGxiYWNrcyhjb25zdCBzcDxIYWxJbnRlcmZhY2U+JiBiYXNlKTsKKworICAgIH5IMkJDYW1lcmFEZXZpY2VDYWxsYmFja3MoKTsKKworICAgIGJvb2wgaW5pdGlhbGl6ZUxvb3BlcigpOworCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvbkRldmljZUVycm9yKGludDMyX3QgZXJyb3JDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvbkRldmljZUlkbGUoKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25DYXB0dXJlU3RhcnRlZChjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25SZXN1bHRSZWNlaXZlZCgKKyAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGFOYXRpdmUmIHJlc3VsdCwgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvblByZXBhcmVkKGludDMyX3Qgc3RyZWFtSWQpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvblJlcGVhdGluZ1JlcXVlc3RFcnJvcihpbnQ2NF90IGxhc3RGcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcmVwZWF0aW5nUmVxdWVzdElkKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25SZXF1ZXN0UXVldWVFbXB0eSgpIG92ZXJyaWRlOworCisgICAgdm9pZCBzZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZShzdGQ6OnNoYXJlZF9wdHI8Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWU+IG1ldGFkYXRhUXVldWUpIHsKKyAgICAgICAgbUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlID0gbWV0YWRhdGFRdWV1ZTsKKyAgICB9CisKKyBwcml2YXRlOgorICAgIC8vIFdyYXBwZXIgc3RydWN0IHNvIHRoYXQgcGFyYW1ldGVycyB0byBvblJlc3VsdFJlY2VpdmVkIGNhbGxiYWNrIG1heSBiZQorICAgIC8vIHNlbnQgdGhyb3VnaCBhbiBBTWVzc2FnZS4KKyAgICBzdHJ1Y3QgUmVzdWx0V3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGFOYXRpdmUgbVJlc3VsdDsKKyAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyBtUmVzdWx0RXh0cmFzOworICAgICAgICBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBtUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3M7CisgICAgICAgIFJlc3VsdFdyYXBwZXIoQ2FtZXJhTWV0YWRhdGFOYXRpdmUgJnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhcywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiAmcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MpIDoKKyAgICAgIC8vIFRPRE86IG1ha2UgdGhpcyBzdGQ6Om1vdmFibGUKKyAgICAgIG1SZXN1bHQocmVzdWx0KSwgbVJlc3VsdEV4dHJhcyhyZXN1bHRFeHRyYXMpLCBtUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MocGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MpIHsgfQorICAgIH07CisKKyAgICBzdHJ1Y3QgQ2FsbGJhY2tIYW5kbGVyIDogcHVibGljIEFIYW5kbGVyIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgb3ZlcnJpZGU7CisgICAgICAgICAgICBDYWxsYmFja0hhbmRsZXIoSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzICpjb252ZXJ0ZXIpIDogbUNvbnZlcnRlcihjb252ZXJ0ZXIpIHsgfQorICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgdm9pZCBwcm9jZXNzUmVzdWx0TWVzc2FnZShzcDxSZXN1bHRXcmFwcGVyPiAmcmVzdWx0V3JhcHBlcik7CisgICAgICAgICAgICB3cDxIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M+IG1Db252ZXJ0ZXIgPSBudWxscHRyOworICAgICAgICAgICAgTXV0ZXggbU1ldGFkYXRhUXVldWVMb2NrOworICAgIH07CisKKyAgICB2b2lkIGNvbnZlcnRSZXN1bHRNZXRhZGF0YVRvSGlkbChjb25zdCBjYW1lcmFfbWV0YWRhdGEgKnJhd01ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZtcVNpemVPck1ldGFkYXRhICpyZXN1bHRNZXRhZGF0YSk7CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0UmVzdWx0UmVjZWl2ZWQsCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyICprUmVzdWx0S2V5OworCisgICAgc3RkOjpzaGFyZWRfcHRyPENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlPiBtQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUgPSBudWxscHRyOworICAgIHNwPENhbGxiYWNrSGFuZGxlcj4gbUhhbmRsZXIgPSBudWxscHRyOworICAgIHNwPEFMb29wZXI+IG1DYkxvb3BlciA9IG51bGxwdHI7Cit9OworCit9IC8vIGltcGxlbWVudGF0aW9uCit9IC8vIFYyXzAKK30gLy8gZGV2aWNlCit9IC8vIGNhbWVyYXNlcnZpY2UKK30gLy8gZnJhbWV3b3JrcworfSAvLyBhbmRyb2lkCisjZW5kaWYgLy8gQU5EUk9JRF9GUkFNRVdPUktTX0FJRExfQ0FNRVJBREVWSUNFQ0FMTEJBQ0tTX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMGVmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmg+CisjaW5jbHVkZSA8aGlkbC9Db252ZXJ0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBmcmFtZXdvcmtzIHsKK25hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlIHsKK25hbWVzcGFjZSBzZXJ2aWNlIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmFzZXJ2aWNlOjp1dGlsczo6Y29udmVyc2lvbjo6Y29udmVydFRvSGlkbENhbWVyYURldmljZVN0YXR1czsKKworYmluZGVyOjpTdGF0dXMgSDJCQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpvblN0YXR1c0NoYW5nZWQoCisgICAgaW50MzJfdCBzdGF0dXMsIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGNhbWVyYUlkKSB7CisgIEhDYW1lcmFEZXZpY2VTdGF0dXMgaENhbWVyYURldmljZVN0YXR1cyA9IGNvbnZlcnRUb0hpZGxDYW1lcmFEZXZpY2VTdGF0dXMoc3RhdHVzKTsKKyAgQ2FtZXJhU3RhdHVzQW5kSWQgY2FtZXJhU3RhdHVzQW5kSWQ7CisgIGNhbWVyYVN0YXR1c0FuZElkLmRldmljZVN0YXR1cyA9IGhDYW1lcmFEZXZpY2VTdGF0dXM7CisgIGNhbWVyYVN0YXR1c0FuZElkLmNhbWVyYUlkID0gU3RyaW5nOChjYW1lcmFJZCkuc3RyaW5nKCk7CisgIGF1dG8gcmV0ID0gbUJhc2UtPm9uU3RhdHVzQ2hhbmdlZChjYW1lcmFTdGF0dXNBbmRJZCk7CisgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgQUxPR0UoIiVzIE9uU3RhdHVzQ2hhbmdlZCBjYWxsYmFjayBmYWlsZWQgZHVlIHRvICVzIixfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgfQorICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgSDJCQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpvblRvcmNoU3RhdHVzQ2hhbmdlZCgKKyAgICBpbnQzMl90LCBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JikgeworICAvLyBXZSBkb24ndCBpbXBsZW1lbnQgb25Ub3JjaFN0YXR1c0NoYW5nZWQKKyAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCit9IC8vIGltcGxlbWVudGF0aW9uCit9IC8vIFYyXzAKK30gLy8gY29tbW9uCit9IC8vIGNhbWVyYXNlcnZpY2UKK30gLy8gZnJhbWV3b3JrcworfSAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhOTE0M2QKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHRocmVhZD4KKworI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2NvbW1vbi8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC9JQ2FtZXJhU2VydmljZUxpc3RlbmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvQm5DYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0JwQ2FtZXJhU2VydmljZUxpc3RlbmVyLmg+CisKKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPGhpZGwvQ2FtZXJhSHlicmlkSW50ZXJmYWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBmcmFtZXdvcmtzIHsKK25hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlIHsKK25hbWVzcGFjZSBzZXJ2aWNlIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIGhhcmR3YXJlOjpCbkNhbWVyYVNlcnZpY2VMaXN0ZW5lcjsKK3VzaW5nIGhhcmR3YXJlOjpCcENhbWVyYVNlcnZpY2VMaXN0ZW5lcjsKK3VzaW5nIGNhbWVyYWh5YnJpZDo6SDJCQ29udmVydGVyOwordXNpbmcgSENhbWVyYURldmljZVN0YXR1cyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OkNhbWVyYURldmljZVN0YXR1czsKK3R5cGVkZWYgZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lciBIQ2FtZXJhU2VydmljZUxpc3RlbmVyOworCitzdHJ1Y3QgSDJCQ2FtZXJhU2VydmljZUxpc3RlbmVyIDoKKyAgICBwdWJsaWMgSDJCQ29udmVydGVyPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXIsIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXIsIEJuQ2FtZXJhU2VydmljZUxpc3RlbmVyPiB7CisgICAgSDJCQ2FtZXJhU2VydmljZUxpc3RlbmVyKGNvbnN0IHNwPEhhbEludGVyZmFjZT4mIGJhc2UpIDogQ0Jhc2UoYmFzZSkgeyB9CisKKyAgICB+SDJCQ2FtZXJhU2VydmljZUxpc3RlbmVyKCkgeyB9CisKKyAgICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgb25TdGF0dXNDaGFuZ2VkKGludDMyX3Qgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgY2FtZXJhSWQpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIG9uVG9yY2hTdGF0dXNDaGFuZ2VkKAorICAgICAgICBpbnQzMl90IHN0YXR1cywgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgY2FtZXJhSWQpIG92ZXJyaWRlOworfTsKKworfSAvLyBpbXBsZW1lbnRhdGlvbgorfSAvLyBWMl8wCit9IC8vIHNlcnZpY2UKK30gLy8gY2FtZXJhc2VydmljZQorfSAvLyBmcmFtZXdvcmtzCit9IC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQ2FtZXJhSHlicmlkSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NhbWVyYUh5YnJpZEludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZjAxMTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NhbWVyYUh5YnJpZEludGVyZmFjZS5oCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0NBTUVSQV9IWUJSSURJTlRFUkZBQ0VfSAorI2RlZmluZSBBTkRST0lEX0NBTUVSQV9IWUJSSURJTlRFUkZBQ0VfSAorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG11dGV4PgorCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYWh5YnJpZCB7Cit0eXBlZGVmIDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2UgSEludGVyZmFjZTsKKwordGVtcGxhdGUgPAorICAgICAgICB0eXBlbmFtZSBISU5URVJGQUNFLAorICAgICAgICB0eXBlbmFtZSBJTlRFUkZBQ0UsCisgICAgICAgIHR5cGVuYW1lIEJOSU5URVJGQUNFID4KK2NsYXNzIEgyQkNvbnZlcnRlciA6IHB1YmxpYyBCTklOVEVSRkFDRSB7CitwdWJsaWM6CisgICAgdHlwZWRlZiBIMkJDb252ZXJ0ZXI8SElOVEVSRkFDRSwgSU5URVJGQUNFLCBCTklOVEVSRkFDRT4gQ0Jhc2U7IC8vIENvbnZlcnRlciBCYXNlCisgICAgdHlwZWRlZiBJTlRFUkZBQ0UgQmFzZUludGVyZmFjZTsKKyAgICB0eXBlZGVmIEhJTlRFUkZBQ0UgSGFsSW50ZXJmYWNlOworCisgICAgSDJCQ29udmVydGVyKGNvbnN0IHNwPEhhbEludGVyZmFjZT4mIGJhc2UpIDogbUJhc2UoYmFzZSkge30KKyAgICB2aXJ0dWFsIHNwPEhhbEludGVyZmFjZT4gZ2V0SGFsSW50ZXJmYWNlKCkgeyByZXR1cm4gbUJhc2U7IH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpbmtUb0RlYXRoKAorICAgICAgICAgICAgY29uc3Qgc3A8SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQ+JiByZWNpcGllbnQsCisgICAgICAgICAgICB2b2lkKiBjb29raWUgPSBudWxscHRyLAorICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHVubGlua1RvRGVhdGgoCisgICAgICAgICAgICBjb25zdCB3cDxJQmluZGVyOjpEZWF0aFJlY2lwaWVudD4mIHJlY2lwaWVudCwKKyAgICAgICAgICAgIHZvaWQqIGNvb2tpZSA9IG51bGxwdHIsCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDAsCisgICAgICAgICAgICB3cDxJQmluZGVyOjpEZWF0aFJlY2lwaWVudD4qIG91dFJlY2lwaWVudCA9IG51bGxwdHIpOworCitwcm90ZWN0ZWQ6CisgICAgc3A8SGFsSW50ZXJmYWNlPiBtQmFzZTsKKyAgICBzdHJ1Y3QgT2JpdHVhcnkgOiBwdWJsaWMgaGFyZHdhcmU6OmhpZGxfZGVhdGhfcmVjaXBpZW50IHsKKyAgICAgICAgd3A8SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQ+IHJlY2lwaWVudDsKKyAgICAgICAgdm9pZCogY29va2llOworICAgICAgICB1aW50MzJfdCBmbGFnczsKKyAgICAgICAgd3A8SUJpbmRlcj4gd2hvOworICAgICAgICBPYml0dWFyeSgKKyAgICAgICAgICAgICAgICBjb25zdCB3cDxJQmluZGVyOjpEZWF0aFJlY2lwaWVudD4mIHIsCisgICAgICAgICAgICAgICAgdm9pZCogYywgdWludDMyX3QgZiwKKyAgICAgICAgICAgICAgICBjb25zdCB3cDxJQmluZGVyPiYgdykgOgorICAgICAgICAgICAgcmVjaXBpZW50KHIpLCBjb29raWUoYyksIGZsYWdzKGYpLCB3aG8odykgeworICAgICAgICB9CisgICAgICAgIE9iaXR1YXJ5KGNvbnN0IE9iaXR1YXJ5JiBvKSA6CisgICAgICAgICAgICByZWNpcGllbnQoby5yZWNpcGllbnQpLAorICAgICAgICAgICAgY29va2llKG8uY29va2llKSwKKyAgICAgICAgICAgIGZsYWdzKG8uZmxhZ3MpLAorICAgICAgICAgICAgd2hvKG8ud2hvKSB7CisgICAgICAgIH0KKyAgICAgICAgT2JpdHVhcnkmIG9wZXJhdG9yPShjb25zdCBPYml0dWFyeSYgbykgeworICAgICAgICAgICAgcmVjaXBpZW50ID0gby5yZWNpcGllbnQ7CisgICAgICAgICAgICBjb29raWUgPSBvLmNvb2tpZTsKKyAgICAgICAgICAgIGZsYWdzID0gby5mbGFnczsKKyAgICAgICAgICAgIHdobyA9IG8ud2hvOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgICAgIHZvaWQgc2VydmljZURpZWQodWludDY0X3QsIGNvbnN0IHdwPEhJbnRlcmZhY2U+Jikgb3ZlcnJpZGUgeworICAgICAgICAgICAgc3A8SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQ+IGRyID0gcmVjaXBpZW50LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChkciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgZHItPmJpbmRlckRpZWQod2hvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisgICAgc3RkOjptdXRleCBtT2JpdHVhcmllc0xvY2s7CisgICAgc3RkOjp2ZWN0b3I8c3A8T2JpdHVhcnk+ID4gbU9iaXR1YXJpZXM7Cit9OworCit0ZW1wbGF0ZSA8CisgICAgICAgIHR5cGVuYW1lIEhJTlRFUkZBQ0UsCisgICAgICAgIHR5cGVuYW1lIElOVEVSRkFDRSwKKyAgICAgICAgdHlwZW5hbWUgQk5JTlRFUkZBQ0U+CitzdGF0dXNfdCBIMkJDb252ZXJ0ZXI8SElOVEVSRkFDRSwgSU5URVJGQUNFLCBCTklOVEVSRkFDRT46OgorICAgICAgICBsaW5rVG9EZWF0aCgKKyAgICAgICAgY29uc3Qgc3A8SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQ+JiByZWNpcGllbnQsCisgICAgICAgIHZvaWQqIGNvb2tpZSwgdWludDMyX3QgZmxhZ3MpIHsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHJlY2lwaWVudCA9PSBudWxscHRyLAorICAgICAgICAgICAgImxpbmtUb0RlYXRoKCk6IHJlY2lwaWVudCBtdXN0IGJlIG5vbi1udWxscHRyIik7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtT2JpdHVhcmllc0xvY2spOworICAgICAgICBtT2JpdHVhcmllcy5wdXNoX2JhY2sobmV3IE9iaXR1YXJ5KHJlY2lwaWVudCwgY29va2llLCBmbGFncywgdGhpcykpOworICAgICAgICBpZiAoIW1CYXNlLT5saW5rVG9EZWF0aChtT2JpdHVhcmllcy5iYWNrKCksIDApKSB7CisgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3RlbXBsYXRlIDwKKyAgICAgICAgdHlwZW5hbWUgSElOVEVSRkFDRSwKKyAgICAgICAgdHlwZW5hbWUgSU5URVJGQUNFLAorICAgICAgICB0eXBlbmFtZSBCTklOVEVSRkFDRT4KK3N0YXR1c190IEgyQkNvbnZlcnRlcjxISU5URVJGQUNFLCBJTlRFUkZBQ0UsIEJOSU5URVJGQUNFPjo6CisgICAgICAgIHVubGlua1RvRGVhdGgoCisgICAgICAgIGNvbnN0IHdwPElCaW5kZXI6OkRlYXRoUmVjaXBpZW50PiYgcmVjaXBpZW50LAorICAgICAgICB2b2lkKiBjb29raWUsIHVpbnQzMl90IGZsYWdzLAorICAgICAgICB3cDxJQmluZGVyOjpEZWF0aFJlY2lwaWVudD4qIG91dFJlY2lwaWVudCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1PYml0dWFyaWVzTG9jayk7CisgICAgZm9yIChhdXRvIGkgPSBtT2JpdHVhcmllcy5iZWdpbigpOyBpICE9IG1PYml0dWFyaWVzLmVuZCgpOyArK2kpIHsKKyAgICAgICAgaWYgKChmbGFncyA9ICgqaSktPmZsYWdzKSAmJiAoCisgICAgICAgICAgICAgICAgKHJlY2lwaWVudCA9PSAoKmkpLT5yZWNpcGllbnQpIHx8CisgICAgICAgICAgICAgICAgKChyZWNpcGllbnQgPT0gbnVsbHB0cikgJiYgKGNvb2tpZSA9PSAoKmkpLT5jb29raWUpKSkpIHsKKyAgICAgICAgICAgIGlmIChvdXRSZWNpcGllbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICpvdXRSZWNpcGllbnQgPSAoKmkpLT5yZWNpcGllbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBib29sIHN1Y2Nlc3MgPSBtQmFzZS0+dW5saW5rVG9EZWF0aCgqaSk7CisgICAgICAgICAgICBtT2JpdHVhcmllcy5lcmFzZShpKTsKKyAgICAgICAgICAgIHJldHVybiBzdWNjZXNzID8gTk9fRVJST1IgOiBERUFEX09CSkVDVDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNhbWVyYWh5YnJpZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9DQU1FUkFfSFlCUklESU5URVJGQUNFX0gKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9Db252ZXJ0LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQ29udmVydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg3ODEyYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQ29udmVydC5jcHAKQEAgLTAsMCArMSwyNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aGlkbC9Db252ZXJ0Lmg+CisjaW5jbHVkZSA8Z3VpL2J1ZmZlcnF1ZXVlLzEuMC9IMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvQUltYWdlUmVhZGVyVXRpbHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlIHsKK25hbWVzcGFjZSB1dGlscyB7CituYW1lc3BhY2UgY29udmVyc2lvbiB7CisKK3VzaW5nIGhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OnV0aWxzOjpIMkJHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit1c2luZyBhaW1nOjpBSW1hZ2VSZWFkZXJfZ2V0SEdCUEZyb21IYW5kbGU7CisKKy8vIE5vdGU6IGV4aXN0aW5nIGRhdGEgaW4gZHN0IHdpbGwgYmUgZ29uZS4gQ2FsbGVyIHN0aWxsIG93bnMgdGhlIG1lbW9yeSBvZiBzcmMKK3ZvaWQgY29udmVydFRvSGlkbChjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqc3JjLCBIQ2FtZXJhTWV0YWRhdGEqIGRzdCkgeworICAgIGlmIChzcmMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVygiJXM6YXR0ZW1wdCB0byBjb252ZXJ0IGVtcHR5IG1ldGFkYXRhIHRvIEhpZGwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNpemVfdCBzaXplID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHNyYyk7CisgICAgZHN0LT5zZXRUb0V4dGVybmFsKCh1aW50OF90ICopIHNyYywgc2l6ZSk7CisgICAgcmV0dXJuOworfQorCitpbnQzMl90IGNvbnZlcnRGcm9tSGlkbChIU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgc3RyZWFtQ29uZmlndXJhdGlvbk1vZGUpIHsKKyAgICBzd2l0Y2ggKHN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKSB7CisgICAgICAgIGNhc2UgSFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlOjpDT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREU6CisgICAgICAgICAgICByZXR1cm4gY2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6OkNPTlNUUkFJTkVEX0hJR0hfU1BFRURfTU9ERTsKKyAgICAgICAgY2FzZSBIU3RyZWFtQ29uZmlndXJhdGlvbk1vZGU6Ok5PUk1BTF9NT0RFOgorICAgICAgICAgICAgcmV0dXJuIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpOT1JNQUxfTU9ERTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIFRPRE86IEZpeCB0aGlzCisgICAgICAgICAgICByZXR1cm4gY2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6OlZFTkRPUl9NT0RFX1NUQVJUOworICAgIH0KK30KKworaW50MzJfdCBjb252ZXJ0RnJvbUhpZGwoSFRlbXBsYXRlSWQgdGVtcGxhdGVJZCkgeworICAgIHN3aXRjaCh0ZW1wbGF0ZUlkKSB7CisgICAgICAgIGNhc2UgSFRlbXBsYXRlSWQ6OlBSRVZJRVc6CisgICAgICAgICAgICByZXR1cm4gY2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6OlRFTVBMQVRFX1BSRVZJRVc7CisgICAgICAgIGNhc2UgSFRlbXBsYXRlSWQ6OlNUSUxMX0NBUFRVUkU6CisgICAgICAgICAgICByZXR1cm4gY2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6OlRFTVBMQVRFX1NUSUxMX0NBUFRVUkU7CisgICAgICAgIGNhc2UgSFRlbXBsYXRlSWQ6OlJFQ09SRDoKKyAgICAgICAgICAgIHJldHVybiBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6VEVNUExBVEVfUkVDT1JEOworICAgICAgICBjYXNlIEhUZW1wbGF0ZUlkOjpWSURFT19TTkFQU0hPVDoKKyAgICAgICAgICAgIHJldHVybiBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6VEVNUExBVEVfVklERU9fU05BUFNIT1Q7CisgICAgICAgIGNhc2UgSFRlbXBsYXRlSWQ6OlpFUk9fU0hVVFRFUl9MQUc6CisgICAgICAgICAgICByZXR1cm4gY2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6OlRFTVBMQVRFX1pFUk9fU0hVVFRFUl9MQUc7CisgICAgICAgIGNhc2UgSFRlbXBsYXRlSWQ6Ok1BTlVBTDoKKyAgICAgICAgICAgIHJldHVybiBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6VEVNUExBVEVfTUFOVUFMOworICAgIH0KK30KKworaW50IGNvbnZlcnRGcm9tSGlkbChIT3V0cHV0Q29uZmlndXJhdGlvbjo6Um90YXRpb24gcm90YXRpb24pIHsKKyAgICBzd2l0Y2gocm90YXRpb24pIHsKKyAgICAgICAgY2FzZSBIT3V0cHV0Q29uZmlndXJhdGlvbjo6Um90YXRpb246OlIwOgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGNhc2UgSE91dHB1dENvbmZpZ3VyYXRpb246OlJvdGF0aW9uOjpSOTA6CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSBIT3V0cHV0Q29uZmlndXJhdGlvbjo6Um90YXRpb246OlIxODA6CisgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgY2FzZSBIT3V0cHV0Q29uZmlndXJhdGlvbjo6Um90YXRpb246OlIyNzA6CisgICAgICAgICAgICByZXR1cm4gMzsKKyAgICB9Cit9CisKK2hhcmR3YXJlOjpjYW1lcmEyOjpwYXJhbXM6Ok91dHB1dENvbmZpZ3VyYXRpb24gY29udmVydEZyb21IaWRsKAorICAgIGNvbnN0IEhPdXRwdXRDb25maWd1cmF0aW9uICZoT3V0cHV0Q29uZmlndXJhdGlvbikgeworICAgIHN0ZDo6dmVjdG9yPHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+PiBpR0JQczsKKyAgICBhdXRvICZ3aW5kb3dIYW5kbGVzID0gaE91dHB1dENvbmZpZ3VyYXRpb24ud2luZG93SGFuZGxlczsKKyAgICBpR0JQcy5yZXNlcnZlKHdpbmRvd0hhbmRsZXMuc2l6ZSgpKTsKKyAgICBmb3IgKGF1dG8gJmhhbmRsZSA6IHdpbmRvd0hhbmRsZXMpIHsKKyAgICAgICAgaUdCUHMucHVzaF9iYWNrKG5ldyBIMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIoQUltYWdlUmVhZGVyX2dldEhHQlBGcm9tSGFuZGxlKGhhbmRsZSkpKTsKKyAgICB9CisgICAgU3RyaW5nMTYgcGh5c2ljYWxDYW1lcmFJZDE2KGhPdXRwdXRDb25maWd1cmF0aW9uLnBoeXNpY2FsQ2FtZXJhSWQuY19zdHIoKSk7CisgICAgaGFyZHdhcmU6OmNhbWVyYTI6OnBhcmFtczo6T3V0cHV0Q29uZmlndXJhdGlvbiBvdXRwdXRDb25maWd1cmF0aW9uKAorICAgICAgICBpR0JQcywgY29udmVydEZyb21IaWRsKGhPdXRwdXRDb25maWd1cmF0aW9uLnJvdGF0aW9uKSwgcGh5c2ljYWxDYW1lcmFJZDE2LAorICAgICAgICBoT3V0cHV0Q29uZmlndXJhdGlvbi53aW5kb3dHcm91cElkLCBPdXRwdXRDb25maWd1cmF0aW9uOjpTVVJGQUNFX1RZUEVfVU5LTk9XTiwgMCwgMCwKKyAgICAgICAgKHdpbmRvd0hhbmRsZXMuc2l6ZSgpID4gMSkpOworICAgIHJldHVybiBvdXRwdXRDb25maWd1cmF0aW9uOworfQorCisvLyBUaGUgY2FtZXJhIG1ldGFkYXRhIGhlcmUgaXMgY2xvbmVkLiBTaW5jZSB3ZSdyZSByZWFkaW5nIG1ldGFkYXRhIG92ZXIKKy8vIGh3YmluZGVyIHdlIHdvdWxkIG5lZWQgdG8gY2xvbmUgaXQgaW4gb3JkZXIgdG8gYXZvaWQgYWxpZ21lbnQgaXNzdWVzLgorYm9vbCBjb252ZXJ0RnJvbUhpZGwoY29uc3QgSENhbWVyYU1ldGFkYXRhICZzcmMsIENhbWVyYU1ldGFkYXRhICpkc3QpIHsKKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCo+KHNyYy5kYXRhKCkpOworICAgIHNpemVfdCBleHBlY3RlZFNpemUgPSBzcmMuc2l6ZSgpOworICAgIGlmIChidWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICBpbnQgcmVzID0gdmFsaWRhdGVfY2FtZXJhX21ldGFkYXRhX3N0cnVjdHVyZShidWZmZXIsICZleHBlY3RlZFNpemUpOworICAgICAgICBpZiAocmVzID09IE9LIHx8IHJlcyA9PSBDQU1FUkFfTUVUQURBVEFfVkFMSURBVElPTl9TSElGVEVEKSB7CisgICAgICAgICAgICAqZHN0ID0gYnVmZmVyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBNYWxmb3JtZWQgY2FtZXJhIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gSEFMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworSENhbWVyYURldmljZVN0YXR1cyBjb252ZXJ0VG9IaWRsQ2FtZXJhRGV2aWNlU3RhdHVzKGludDMyX3Qgc3RhdHVzKSB7CisgICAgSENhbWVyYURldmljZVN0YXR1cyBkZXZpY2VTdGF0dXMgPSBIQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfVU5LTk9XTjsKKyAgICBzd2l0Y2goc3RhdHVzKSB7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19OT1RfUFJFU0VOVDoKKyAgICAgICAgICAgIGRldmljZVN0YXR1cyA9IEhDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19OT1RfUFJFU0VOVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfUFJFU0VOVDoKKyAgICAgICAgICAgIGRldmljZVN0YXR1cyA9IEhDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19QUkVTRU5UOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19FTlVNRVJBVElORzoKKyAgICAgICAgICAgIGRldmljZVN0YXR1cyA9IEhDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19FTlVNRVJBVElORzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfTk9UX0FWQUlMQUJMRToKKyAgICAgICAgICAgIGRldmljZVN0YXR1cyA9IEhDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19OT1RfQVZBSUxBQkxFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGRldmljZVN0YXR1czsKK30KKworSENhcHR1cmVSZXN1bHRFeHRyYXMgY29udmVydFRvSGlkbChjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzICZjYXB0dXJlUmVzdWx0RXh0cmFzKSB7CisgICAgSENhcHR1cmVSZXN1bHRFeHRyYXMgaENhcHR1cmVSZXN1bHRFeHRyYXM7CisgICAgaENhcHR1cmVSZXN1bHRFeHRyYXMucmVxdWVzdElkID0gY2FwdHVyZVJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQ7CisgICAgaENhcHR1cmVSZXN1bHRFeHRyYXMuYnVyc3RJZCA9IGNhcHR1cmVSZXN1bHRFeHRyYXMuYnVyc3RJZDsKKyAgICBoQ2FwdHVyZVJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciA9IGNhcHR1cmVSZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXI7CisgICAgaENhcHR1cmVSZXN1bHRFeHRyYXMucGFydGlhbFJlc3VsdENvdW50ID0gY2FwdHVyZVJlc3VsdEV4dHJhcy5wYXJ0aWFsUmVzdWx0Q291bnQ7CisgICAgaENhcHR1cmVSZXN1bHRFeHRyYXMuZXJyb3JTdHJlYW1JZCA9IGNhcHR1cmVSZXN1bHRFeHRyYXMuZXJyb3JTdHJlYW1JZDsKKyAgICByZXR1cm4gaENhcHR1cmVSZXN1bHRFeHRyYXM7Cit9CisKK0hFcnJvckNvZGUgY29udmVydFRvSGlkbChpbnQzMl90IGVycm9yQ29kZSkgeworICAgIHN3aXRjaChlcnJvckNvZGUpIHsKKyAgICAgICAgY2FzZSBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEOgorICAgICAgICAgICAgcmV0dXJuIEhFcnJvckNvZGU6OkNBTUVSQV9ESVNDT05ORUNURUQ7CisgICAgICAgIGNhc2UgY2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0RFVklDRSA6CisgICAgICAgICAgICByZXR1cm4gSEVycm9yQ29kZTo6Q0FNRVJBX0RFVklDRTsKKyAgICAgICAgY2FzZSBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfU0VSVklDRToKKyAgICAgICAgICAgIHJldHVybiBIRXJyb3JDb2RlOjpDQU1FUkFfU0VSVklDRTsKKyAgICAgICAgY2FzZSBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVRVUVTVDoKKyAgICAgICAgICAgIHJldHVybiBIRXJyb3JDb2RlOjpDQU1FUkFfUkVRVUVTVDsKKyAgICAgICAgY2FzZSBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVTVUxUOgorICAgICAgICAgICAgcmV0dXJuIEhFcnJvckNvZGU6OkNBTUVSQV9SRVNVTFQ7CisgICAgICAgIGNhc2UgY2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0JVRkZFUjoKKyAgICAgICAgICAgIHJldHVybiBIRXJyb3JDb2RlOjpDQU1FUkFfQlVGRkVSOworICAgICAgICBjYXNlIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ESVNBQkxFRDoKKyAgICAgICAgICAgIHJldHVybiBIRXJyb3JDb2RlOjpDQU1FUkFfRElTQUJMRUQ7CisgICAgICAgIGNhc2UgY2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0lOVkFMSURfRVJST1I6CisgICAgICAgICAgICByZXR1cm4gSEVycm9yQ29kZTo6Q0FNRVJBX0lOVkFMSURfRVJST1I7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gSEVycm9yQ29kZTo6Q0FNRVJBX1VOS05PV05fRVJST1I7CisgICAgfQorfQorCit2b2lkIGNvbnZlcnRUb0hpZGwoY29uc3Qgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0YXR1cz4gJnNyYywKKyAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxIQ2FtZXJhU3RhdHVzQW5kSWQ+KiBkc3QpIHsKKyAgICBkc3QtPnJlc2l6ZShzcmMuc2l6ZSgpKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChhdXRvICZzdGF0dXNBbmRJZCA6IHNyYykgeworICAgICAgICBhdXRvICZhID0gKCpkc3QpW2krK107CisgICAgICAgIGEuY2FtZXJhSWQgPSBzdGF0dXNBbmRJZC5jYW1lcmFJZC5jX3N0cigpOworICAgICAgICBhLmRldmljZVN0YXR1cyA9IGNvbnZlcnRUb0hpZGxDYW1lcmFEZXZpY2VTdGF0dXMoc3RhdHVzQW5kSWQuc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIGNvbnZlcnRUb0hpZGwoCisgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTI6OnV0aWxzOjpTdWJtaXRJbmZvICZzdWJtaXRJbmZvLAorICAgIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6U3VibWl0SW5mbyAqaFN1Ym1pdEluZm8pIHsKKyAgICBoU3VibWl0SW5mby0+cmVxdWVzdElkID0gc3VibWl0SW5mby5tUmVxdWVzdElkOworICAgIGhTdWJtaXRJbmZvLT5sYXN0RnJhbWVOdW1iZXIgPSBzdWJtaXRJbmZvLm1MYXN0RnJhbWVOdW1iZXI7Cit9CisKK0hTdGF0dXMgQjJIU3RhdHVzKGNvbnN0IGJpbmRlcjo6U3RhdHVzICZiU3RhdHVzKSB7CisgICAgSFN0YXR1cyBzdGF0dXMgPSBIU3RhdHVzOjpOT19FUlJPUjsKKyAgICBpZiAoYlN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgLy8gTk8gRXJyb3IgaGVyZQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBzd2l0Y2goYlN0YXR1cy5zZXJ2aWNlU3BlY2lmaWNFcnJvckNvZGUoKSkgeworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6RVJST1JfRElTQ09OTkVDVEVEOgorICAgICAgICAgICAgc3RhdHVzID0gSFN0YXR1czo6RElTQ09OTkVDVEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9DQU1FUkFfSU5fVVNFOgorICAgICAgICAgICAgc3RhdHVzID0gSFN0YXR1czo6Q0FNRVJBX0lOX1VTRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6RVJST1JfTUFYX0NBTUVSQVNfSU5fVVNFOgorICAgICAgICAgICAgc3RhdHVzID0gSFN0YXR1czo6TUFYX0NBTUVSQVNfSU5fVVNFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5UOgorICAgICAgICAgICAgc3RhdHVzID0gSFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6RVJST1JfREVQUkVDQVRFRF9IQUw6CisgICAgICAgICAgICAvLyBTaG91bGQgbm90IHJlYWNoIGhlcmUgc2luY2Ugd2UgZmlsdGVyZWQgbGVnYWN5IEhBTHMgZWFybGllcgorICAgICAgICAgICAgc3RhdHVzID0gSFN0YXR1czo6REVQUkVDQVRFRF9IQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX0RJU0FCTEVEOgorICAgICAgICAgICAgc3RhdHVzID0gSFN0YXR1czo6RElTQUJMRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX1BFUk1JU1NJT05fREVOSUVEOgorICAgICAgICAgICAgc3RhdHVzID0gSFN0YXR1czo6UEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OOgorICAgICAgICAgICAgc3RhdHVzID0gSFN0YXR1czo6SU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6OlVOS05PV05fRVJST1I7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiBzdGF0dXM7Cit9CisKK0hQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvIGNvbnZlcnRUb0hpZGwoCisgICAgY29uc3QgUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyAmcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbywKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWU+ICZjYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSkgeworICAgIEhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvIGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvOworICAgIGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvLnBoeXNpY2FsQ2FtZXJhSWQgPQorICAgICAgICBTdHJpbmc4KHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8ubVBoeXNpY2FsQ2FtZXJhSWQpLnN0cmluZygpOworICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpyYXdNZXRhZGF0YSA9CisgICAgICAgIHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8ubVBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEuZ2V0QW5kTG9jaygpOworICAgIC8vIFRyeSB1c2luZyBmbXEgYXQgZmlyc3QuCisgICAgc2l6ZV90IG1ldGFkYXRhX3NpemUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUocmF3TWV0YWRhdGEpOworICAgIGlmICgobWV0YWRhdGFfc2l6ZSA+IDApICYmIChjYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpID4gMCkpIHsKKyAgICAgICAgaWYgKGNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlLT53cml0ZSgodWludDhfdCAqKXJhd01ldGFkYXRhLCBtZXRhZGF0YV9zaXplKSkgeworICAgICAgICAgICAgaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8ucGh5c2ljYWxDYW1lcmFNZXRhZGF0YS5mbXFNZXRhZGF0YVNpemUobWV0YWRhdGFfc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiJXMgQ291bGRuJ3QgdXNlIGZtcSwgZmFsbGluZyBiYWNrIHRvIGh3YmluZGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIEhDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YTsKKyAgICAgICAgICAgIGNvbnZlcnRUb0hpZGwocmF3TWV0YWRhdGEsICZtZXRhZGF0YSk7CisgICAgICAgICAgICBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mby5waHlzaWNhbENhbWVyYU1ldGFkYXRhLm1ldGFkYXRhKHN0ZDo6bW92ZShtZXRhZGF0YSkpOworICAgICAgICB9CisgICAgfQorICAgIHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8ubVBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEudW5sb2NrKHJhd01ldGFkYXRhKTsKKyAgICByZXR1cm4gaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm87Cit9CisKK2hpZGxfdmVjPEhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBjb252ZXJ0VG9IaWRsKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+ICZwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcywKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWU+ICZjYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSkgeworICAgIGhpZGxfdmVjPEhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3M7CisgICAgaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zLnJlc2l6ZShwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcy5zaXplKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKGF1dG8gJnBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8gOiBwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcykgeworICAgICAgICBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3NbaSsrXSA9IGNvbnZlcnRUb0hpZGwocGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKTsKKyAgICB9CisgICAgcmV0dXJuIGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvczsKK30KKworfSAvL2NvbnZlcnNpb24KK30gLy8gdXRpbHMKK30gLy9jYW1lcmFzZXJ2aWNlCit9IC8vIGhhcmR3YXJlCit9IC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQ29udmVydC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9Db252ZXJ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI5MzdhMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQ29udmVydC5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENBTUVSQVNFUlZFUl9DT05WRVJUX0hJREwKKyNkZWZpbmUgQ0FNRVJBU0VSVkVSX0NPTlZFUlRfSElETAorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjAvSUNhbWVyYVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL0lDYW1lcmFEZXZpY2VVc2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvY29tbW9uLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2NvbW1vbi8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2J1ZmZlcnF1ZXVlLzEuMC9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZS5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmEuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UgeworbmFtZXNwYWNlIHV0aWxzIHsKK25hbWVzcGFjZSBjb252ZXJzaW9uIHsKKwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OmltcGw6OkNhcHR1cmVSZXN1bHRFeHRyYXM7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6aW1wbDo6UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbzsKKwordXNpbmcgQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUgPSBNZXNzYWdlUXVldWU8dWludDhfdCwga1N5bmNocm9uaXplZFJlYWRXcml0ZT47Cit1c2luZyBIQ2FtZXJhTWV0YWRhdGEgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFNZXRhZGF0YTsKK3VzaW5nIEhDYW1lcmFEZXZpY2VTdGF0dXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFEZXZpY2VTdGF0dXM7Cit1c2luZyBIQ2FtZXJhU3RhdHVzQW5kSWQgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFTdGF0dXNBbmRJZDsKK3VzaW5nIEhDYW1lcmFEZXZpY2VVc2VyID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpJQ2FtZXJhRGV2aWNlVXNlcjsKK3VzaW5nIEhDYXB0dXJlUmVzdWx0RXh0cmFzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYXB0dXJlUmVzdWx0RXh0cmFzOwordXNpbmcgSENhcHR1cmVSZXF1ZXN0ID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYXB0dXJlUmVxdWVzdDsKK3VzaW5nIEhFcnJvckNvZGUgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkVycm9yQ29kZTsKK3VzaW5nIEhHcmFwaGljQnVmZmVyUHJvZHVjZXIgPSBoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwordXNpbmcgSE91dHB1dENvbmZpZ3VyYXRpb24gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6Ok91dHB1dENvbmZpZ3VyYXRpb247Cit1c2luZyBIUGh5c2ljYWxDYW1lcmFTZXR0aW5ncyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6UGh5c2ljYWxDYW1lcmFTZXR0aW5nczsKK3VzaW5nIEhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvOwordXNpbmcgSFN1Ym1pdEluZm8gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlN1Ym1pdEluZm87Cit1c2luZyBIU3RhdHVzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpTdGF0dXM7Cit1c2luZyBIU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlOwordXNpbmcgSFRlbXBsYXRlSWQgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlRlbXBsYXRlSWQ7CisKKy8vIE5vdGU6IGV4aXN0aW5nIGRhdGEgaW4gZHN0IHdpbGwgYmUgZ29uZS4gQ2FsbGVyIHN0aWxsIG93bnMgdGhlIG1lbW9yeSBvZiBzcmMKK3ZvaWQgY29udmVydFRvSGlkbChjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqc3JjLCBIQ2FtZXJhTWV0YWRhdGEqIGRzdCk7CisKK2ludDMyX3QgY29udmVydEZyb21IaWRsKEhTdHJlYW1Db25maWd1cmF0aW9uTW9kZSBzdHJlYW1Db25maWd1cmF0aW9uTW9kZSk7CisKK2ludDMyX3QgY29udmVydEZyb21IaWRsKEhUZW1wbGF0ZUlkIHRlbXBsYXRlSWQpOworCitib29sIGNvbnZlcnRGcm9tSGlkbChjb25zdCBIQ2FtZXJhTWV0YWRhdGEgJnNyYywgQ2FtZXJhTWV0YWRhdGEgKmRzdCk7CisKK2hhcmR3YXJlOjpjYW1lcmEyOjpwYXJhbXM6Ok91dHB1dENvbmZpZ3VyYXRpb24gY29udmVydEZyb21IaWRsKAorICAgIGNvbnN0IEhPdXRwdXRDb25maWd1cmF0aW9uICZoT3V0cHV0Q29uZmlndXJhdGlvbik7CisKK0hDYW1lcmFEZXZpY2VTdGF0dXMgY29udmVydFRvSGlkbENhbWVyYURldmljZVN0YXR1cyhpbnQzMl90IHN0YXR1cyk7CisKK3ZvaWQgY29udmVydFRvSGlkbChjb25zdCBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Q2FtZXJhU3RhdHVzPiAmc3JjLAorICAgICAgICAgICAgICAgICAgIGhpZGxfdmVjPEhDYW1lcmFTdGF0dXNBbmRJZD4qIGRzdCk7CisKK3ZvaWQgY29udmVydFRvSGlkbChjb25zdCBoYXJkd2FyZTo6Y2FtZXJhMjo6dXRpbHM6OlN1Ym1pdEluZm8gJnN1Ym1pdEluZm8sCisgICAgICAgICAgICAgICAgICAgSFN1Ym1pdEluZm8gKmhTdWJtaXRJbmZvKTsKKworSEVycm9yQ29kZSBjb252ZXJ0VG9IaWRsKGludDMyX3QgZXJyb3JDb2RlKTsKKworSENhcHR1cmVSZXN1bHRFeHRyYXMgY29udmVydFRvSGlkbChjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzICZjYXB0dXJlUmVzdWx0RXh0cmFzKTsKKworaGlkbF92ZWM8SFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+IGNvbnZlcnRUb0hpZGwoCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gJnBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zLAorICAgIHN0ZDo6c2hhcmVkX3B0cjxDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZT4gJmNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKTsKKworSFN0YXR1cyBCMkhTdGF0dXMoY29uc3QgYmluZGVyOjpTdGF0dXMgJmJTdGF0dXMpOworCit9IC8vIGNvbnZlcnNpb24KK30gLy8gdXRpbHMKK30gLy8gY2FtZXJhc2VydmljZQorfSAvLyBoYXJkd2FyZQorfSAvL2FuZHJvaWQKKworI2VuZGlmIC8vQ0FNRVJBU0VSVkVSX0NPTlZFUlRfVE9fSElETApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjJiYTVhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5jcHAKQEAgLTAsMCArMSwyNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuMi90eXBlcy5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDxndWkvYnVmZmVycXVldWUvMS4wL0gyQkdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorCisjaW5jbHVkZSA8aGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+CisjaW5jbHVkZSA8aGlkbC9Db252ZXJ0Lmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjIvdHlwZXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZyYW1ld29ya3MgeworbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UgeworbmFtZXNwYWNlIGRldmljZSB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OmNvbnZlcnRUb0hpZGw7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OmNvbnZlcnRGcm9tSGlkbDsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmFzZXJ2aWNlOjp1dGlsczo6Y29udmVyc2lvbjo6QjJIU3RhdHVzOworCit1c2luZyBoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjp1dGlsczo6SDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgaGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIGhhcmR3YXJlOjpWb2lkOwordXNpbmcgSFN1Ym1pdEluZm8gPSBkZXZpY2U6OlYyXzA6OlN1Ym1pdEluZm87Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6cGFyYW1zOjpPdXRwdXRDb25maWd1cmF0aW9uOworCitzdGF0aWMgY29uc3RleHByIGludDMyX3QgQ0FNRVJBX1JFUVVFU1RfTUVUQURBVEFfUVVFVUVfU0laRSA9IDEgPDwgMjAgLyogMSBNQiAqLzsKK3N0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBDQU1FUkFfUkVTVUxUX01FVEFEQVRBX1FVRVVFX1NJWkUgPSAxIDw8IDIwIC8qIDEgTUIgKi87CisKK1JldHVybjx2b2lkPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6ZGlzY29ubmVjdCgpIHsKKyAgICBtRGV2aWNlUmVtb3RlLT5kaXNjb25uZWN0KCk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworSGlkbENhbWVyYURldmljZVVzZXI6OkhpZGxDYW1lcmFEZXZpY2VVc2VyKAorICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcj4gJmRldmljZVJlbW90ZSkKKyAgOiBtRGV2aWNlUmVtb3RlKGRldmljZVJlbW90ZSkgeworICAgIG1Jbml0U3VjY2VzcyA9IGluaXREZXZpY2UoKTsKK30KKworYm9vbCBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6aW5pdERldmljZSgpIHsKKyAgICAvLyBUT0RPOiBHZXQgcmVxdWVzdCBhbmQgcmVzdWx0IG1ldGFkYXRhIHF1ZXVlIHNpemUgZnJvbSBhIHN5c3RlbSBwcm9wZXJ0eS4KKyAgICBpbnQzMl90IHJlcUZNUVNpemUgPSBDQU1FUkFfUkVRVUVTVF9NRVRBREFUQV9RVUVVRV9TSVpFOworCisgICAgbUNhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZSA9CisgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8Q2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlPihzdGF0aWNfY2FzdDxzaXplX3Q+KHJlcUZNUVNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogbm9uIGJsb2NraW5nICovKTsKKyAgICBpZiAoIW1DYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUtPmlzVmFsaWQoKSkgeworICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgcmVxdWVzdCBmbXEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50MzJfdCByZXNGTVFTaXplID0gQ0FNRVJBX1JFU1VMVF9NRVRBREFUQV9RVUVVRV9TSVpFOworICAgIG1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSA9CisgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWU+KHN0YXRpY19jYXN0PHNpemVfdD4ocmVzRk1RU2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIG5vbiBibG9ja2luZyAqLyk7CisgICAgaWYgKCFtQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUtPmlzVmFsaWQoKSkgeworICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgcmVzdWx0IGZtcSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK1JldHVybjx2b2lkPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6Z2V0Q2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlKAorICAgIGdldENhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZV9jYiBfaGlkbF9jYikgeworICAgIGlmIChtSW5pdFN1Y2Nlc3MpIHsKKyAgICAgICAgX2hpZGxfY2IoKm1DYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUtPmdldERlc2MoKSk7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6Z2V0Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUoCisgICAgZ2V0Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWVfY2IgX2hpZGxfY2IpIHsKKyAgICBpZiAobUluaXRTdWNjZXNzKSB7CisgICAgICAgIF9oaWRsX2NiKCptQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUtPmdldERlc2MoKSk7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKKy8qKgorICogVG8gYmUgdXNlZCBvbmx5IGJ5IHN1Ym1pdFJlcXVlc3RMaXN0IGltcGxlbWVudGF0aW9uLCBzaW5jZSBpdCByZXF1aXJlcworICogY2xpZW50cyB0byBjYWxsIHRoaXMgbWV0aG9kIHNlcmlhbGx5LCBpbmNhc2UgZm1xIGlzIHVzZWQgdG8gc2VuZCBtZXRhZGF0YS4KKyAqLworYm9vbCBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6Y29weVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MoCisgICAgY29uc3QgaGlkbF92ZWM8SFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M+ICZoUGh5c2ljYWxDYW1lcmFTZXR0aW5ncywKKyAgICBzdGQ6OnZlY3RvcjxDYXB0dXJlUmVxdWVzdDo6UGh5c2ljYWxDYW1lcmFTZXR0aW5ncz4gKnBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MpIHsKKyAgICBib29sIGNvbnZlcnRlZCA9IGZhbHNlOworICAgIGZvciAoYXV0byAmZSA6IGhQaHlzaWNhbENhbWVyYVNldHRpbmdzKSB7CisgICAgICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MtPmVtcGxhY2VfYmFjaygpOworICAgICAgICBDYXB0dXJlUmVxdWVzdDo6UGh5c2ljYWxDYW1lcmFTZXR0aW5ncyAmcGh5c2ljYWxDYW1lcmFTZXR0aW5nID0KKyAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MtPmJhY2soKTsKKyAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5nLmlkID0gZS5pZC5jX3N0cigpOworCisgICAgICAgIC8vIFJlYWQgdGhlIHNldHRpbmdzIGVpdGhlciBmcm9tIHRoZSBmbXEgb3Igc3RyYWlnaHRhd2F5IGZyb20gdGhlCisgICAgICAgIC8vIHJlcXVlc3QuIFdlIGRvbid0IG5lZWQgYW55IHN5bmNocm9uaXphdGlvbiwgc2luY2Ugc3VibWl0UmVxdWVzdExpc3QKKyAgICAgICAgLy8gaXMgZ3VhcmFudGVlZCB0byBiZSBjYWxsZWQgc2VyaWFsbHkgYnkgdGhlIGNsaWVudCBpZiBpdCBkZWNpZGVzIHRvCisgICAgICAgIC8vIHVzZSBmbXEuCisgICAgICAgIGlmIChlLnNldHRpbmdzLmdldERpc2NyaW1pbmF0b3IoKSA9PQorICAgICAgICAgICAgRm1xU2l6ZU9yTWV0YWRhdGE6OmhpZGxfZGlzY3JpbWluYXRvcjo6Zm1xTWV0YWRhdGFTaXplKSB7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIEdldCBzZXR0aW5ncyBmcm9tIHRoZSBmbXEuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEhDYW1lcmFNZXRhZGF0YSBzZXR0aW5nc0ZtcTsKKyAgICAgICAgICAgIHNldHRpbmdzRm1xLnJlc2l6ZShlLnNldHRpbmdzLmZtcU1ldGFkYXRhU2l6ZSgpKTsKKyAgICAgICAgICAgIGJvb2wgcmVhZCA9IG1DYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUtPnJlYWQoc2V0dGluZ3NGbXEuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnNldHRpbmdzLmZtcU1ldGFkYXRhU2l6ZSgpKTsKKyAgICAgICAgICAgIGlmICghcmVhZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlcyBjYXB0dXJlIHJlcXVlc3Qgc2V0dGluZ3MgY291bGQndCBiZSByZWFkIGZyb20gZm1xIHNpemUiLAorICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgY29udmVydGVkID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbnZlcnRlZCA9IGNvbnZlcnRGcm9tSGlkbChzZXR0aW5nc0ZtcSwgJnBoeXNpY2FsQ2FtZXJhU2V0dGluZy5zZXR0aW5ncyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFRoZSBzZXR0aW5ncyBtZXRhZGF0YSBpcyBjb250YWluZWQgaW4gcmVxdWVzdCBzZXR0aW5ncyBmaWVsZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgY29udmVydGVkID0KKyAgICAgICAgICAgICAgICBjb252ZXJ0RnJvbUhpZGwoZS5zZXR0aW5ncy5tZXRhZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5c2ljYWxDYW1lcmFTZXR0aW5nLnNldHRpbmdzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWNvbnZlcnRlZCkgeworICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbnZlcnQgcGh5c2ljYWxDYW1lcmFTZXR0aW5ncyBmcm9tIEhJREwgdG8gQUlETC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6Y29udmVydFJlcXVlc3RGcm9tSGlkbChjb25zdCBIQ2FwdHVyZVJlcXVlc3QgJmhSZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXB0dXJlUmVxdWVzdCAqcmVxdWVzdCkgeworICAgIC8vIE5vIHJlcHJvY2Vzc2luZyBzdXBwb3J0LgorICAgIHJlcXVlc3QtPm1Jc1JlcHJvY2VzcyA9IGZhbHNlOworICAgIGZvciAoY29uc3QgYXV0byAmc3RyZWFtQW5kV2luZG93SWQgOiBoUmVxdWVzdC5zdHJlYW1BbmRXaW5kb3dJZHMpIHsKKyAgICAgICAgcmVxdWVzdC0+bVN0cmVhbUlkeExpc3QucHVzaF9iYWNrKHN0cmVhbUFuZFdpbmRvd0lkLnN0cmVhbUlkKTsKKyAgICAgICAgcmVxdWVzdC0+bVN1cmZhY2VJZHhMaXN0LnB1c2hfYmFjayhzdHJlYW1BbmRXaW5kb3dJZC53aW5kb3dJZCk7CisgICAgfQorICAgIHJldHVybiBjb3B5UGh5c2ljYWxDYW1lcmFTZXR0aW5ncyhoUmVxdWVzdC5waHlzaWNhbENhbWVyYVNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHJlcXVlc3QtPm1QaHlzaWNhbENhbWVyYVNldHRpbmdzKSk7Cit9CisKK1JldHVybjx2b2lkPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6c3VibWl0UmVxdWVzdExpc3QoY29uc3QgaGlkbF92ZWM8SENhcHR1cmVSZXF1ZXN0PiYgaFJlcXVlc3RMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmVhbWluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0UmVxdWVzdExpc3RfY2IgX2hpZGxfY2IpIHsKKyAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6dXRpbHM6OlN1Ym1pdEluZm8gc3VibWl0SW5mbzsKKyAgICBIU3VibWl0SW5mbyBoU3VibWl0SW5mbzsKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgQUlETCBDYXB0dXJlUmVxdWVzdCBmcm9tIHJlcXVlc3RMaXN0IGFuZCBncmFwaGljQnVmZmVyUHJvZHVjZXJzLgorICAgICAqLworICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpjYW1lcmEyOjpDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdHM7CisgICAgZm9yIChhdXRvICZoUmVxdWVzdCA6IGhSZXF1ZXN0TGlzdCkgeworICAgICAgICByZXF1ZXN0cy5lbXBsYWNlX2JhY2soKTsKKyAgICAgICAgYXV0byAmcmVxdWVzdCA9IHJlcXVlc3RzLmJhY2soKTsKKyAgICAgICAgaWYgKCFjb252ZXJ0UmVxdWVzdEZyb21IaWRsKGhSZXF1ZXN0LCAmcmVxdWVzdCkpIHsKKyAgICAgICAgICAgIF9oaWRsX2NiKEhTdGF0dXM6OklMTEVHQUxfQVJHVU1FTlQsIGhTdWJtaXRJbmZvKTsKKyAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbURldmljZVJlbW90ZS0+c3VibWl0UmVxdWVzdExpc3QocmVxdWVzdHMsIHN0cmVhbWluZywgJnN1Ym1pdEluZm8pOworICAgIG1SZXF1ZXN0SWQgPSBzdWJtaXRJbmZvLm1SZXF1ZXN0SWQ7CisgICAgY29udmVydFRvSGlkbChzdWJtaXRJbmZvLCAmaFN1Ym1pdEluZm8pOworICAgIF9oaWRsX2NiKEhTdGF0dXM6Ok5PX0VSUk9SLCBoU3VibWl0SW5mbyk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpjYW5jZWxSZXBlYXRpbmdSZXF1ZXN0KGNhbmNlbFJlcGVhdGluZ1JlcXVlc3RfY2IgX2hpZGxfY2IpIHsKKyAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlciA9IDA7CisgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gbURldmljZVJlbW90ZS0+Y2FuY2VsUmVxdWVzdChtUmVxdWVzdElkLCAmbGFzdEZyYW1lTnVtYmVyKTsKKyAgICBfaGlkbF9jYihCMkhTdGF0dXMocmV0KSwgbGFzdEZyYW1lTnVtYmVyKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48SFN0YXR1cz4gSGlkbENhbWVyYURldmljZVVzZXI6OmJlZ2luQ29uZmlndXJlKCkgeworICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IG1EZXZpY2VSZW1vdGUtPmJlZ2luQ29uZmlndXJlKCk7CisgICAgcmV0dXJuIEIySFN0YXR1cyhyZXQpOworfQorCitSZXR1cm48SFN0YXR1cz4gSGlkbENhbWVyYURldmljZVVzZXI6OmVuZENvbmZpZ3VyZShTdHJlYW1Db25maWd1cmF0aW9uTW9kZSBvcGVyYXRpbmdNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25QYXJhbXMpIHsKKyAgICBhbmRyb2lkOjpDYW1lcmFNZXRhZGF0YSBjYW1lcmFNZXRhZGF0YTsKKyAgICBpZiAoIWNvbnZlcnRGcm9tSGlkbChzZXNzaW9uUGFyYW1zLCAmY2FtZXJhTWV0YWRhdGEpKSB7CisgICAgICAgIHJldHVybiBIU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5UOworICAgIH0KKworICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IG1EZXZpY2VSZW1vdGUtPmVuZENvbmZpZ3VyZShjb252ZXJ0RnJvbUhpZGwob3BlcmF0aW5nTW9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYU1ldGFkYXRhKTsKKyAgICByZXR1cm4gQjJIU3RhdHVzKHJldCk7Cit9CisKK1JldHVybjxIU3RhdHVzPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6ZGVsZXRlU3RyZWFtKGludDMyX3Qgc3RyZWFtSWQpIHsKKyAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBtRGV2aWNlUmVtb3RlLT5kZWxldGVTdHJlYW0oc3RyZWFtSWQpOworICAgIHJldHVybiBCMkhTdGF0dXMocmV0KTsKK30KKworUmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpjcmVhdGVTdHJlYW0oY29uc3QgSE91dHB1dENvbmZpZ3VyYXRpb24mIGhPdXRwdXRDb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlU3RyZWFtX2NiIGhpZGxfY2JfKSB7CisgICAgT3V0cHV0Q29uZmlndXJhdGlvbiBvdXRwdXRDb25maWd1cmF0aW9uID0KKyAgICAgICAgY29udmVydEZyb21IaWRsKGhPdXRwdXRDb25maWd1cmF0aW9uKTsKKyAgICBpbnQzMl90IG5ld1N0cmVhbUlkID0gMDsKKyAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBtRGV2aWNlUmVtb3RlLT5jcmVhdGVTdHJlYW0ob3V0cHV0Q29uZmlndXJhdGlvbiwgJm5ld1N0cmVhbUlkKTsKKyAgICBIU3RhdHVzIHN0YXR1cyA9IEIySFN0YXR1cyhyZXQpOworICAgIGhpZGxfY2JfKHN0YXR1cywgbmV3U3RyZWFtSWQpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6Y3JlYXRlRGVmYXVsdFJlcXVlc3QoVGVtcGxhdGVJZCB0ZW1wbGF0ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVEZWZhdWx0UmVxdWVzdF9jYiBfaGlkbF9jYikgeworICAgIGFuZHJvaWQ6OkNhbWVyYU1ldGFkYXRhIGNhbWVyYU1ldGFkYXRhOworICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IG1EZXZpY2VSZW1vdGUtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KGNvbnZlcnRGcm9tSGlkbCh0ZW1wbGF0ZUlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FtZXJhTWV0YWRhdGEpOworICAgIEhTdGF0dXMgaFN0YXR1cyA9IEIySFN0YXR1cyhyZXQpOworICAgIEhDYW1lcmFNZXRhZGF0YSBoaWRsTWV0YWRhdGE7CisgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnJhd01ldGFkYXRhID0gY2FtZXJhTWV0YWRhdGEuZ2V0QW5kTG9jaygpOworICAgIGNvbnZlcnRUb0hpZGwocmF3TWV0YWRhdGEsICZoaWRsTWV0YWRhdGEpOworICAgIF9oaWRsX2NiKGhTdGF0dXMsIGhpZGxNZXRhZGF0YSk7CisgICAgY2FtZXJhTWV0YWRhdGEudW5sb2NrKHJhd01ldGFkYXRhKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48SFN0YXR1cz4gSGlkbENhbWVyYURldmljZVVzZXI6OndhaXRVbnRpbElkbGUoKSB7CisgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gbURldmljZVJlbW90ZS0+d2FpdFVudGlsSWRsZSgpOworICAgIHJldHVybiBCMkhTdGF0dXMocmV0KTsKK30KKworUmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpmbHVzaChmbHVzaF9jYiBfaGlkbF9jYikgeworICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyID0gMDsKKyAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBtRGV2aWNlUmVtb3RlLT5mbHVzaCgmbGFzdEZyYW1lTnVtYmVyKTsKKyAgICBfaGlkbF9jYihCMkhTdGF0dXMocmV0KSxsYXN0RnJhbWVOdW1iZXIpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjxIU3RhdHVzPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6dXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbigKKyAgICBpbnQzMl90IHN0cmVhbUlkLAorICAgIGNvbnN0IEhPdXRwdXRDb25maWd1cmF0aW9uJiBoT3V0cHV0Q29uZmlndXJhdGlvbikgeworICAgIE91dHB1dENvbmZpZ3VyYXRpb24gb3V0cHV0Q29uZmlndXJhdGlvbiA9IGNvbnZlcnRGcm9tSGlkbChoT3V0cHV0Q29uZmlndXJhdGlvbik7CisgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gbURldmljZVJlbW90ZS0+dXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbihzdHJlYW1JZCwgb3V0cHV0Q29uZmlndXJhdGlvbik7CisgICAgcmV0dXJuIEIySFN0YXR1cyhyZXQpOworfQorCit9IC8vIGltcGxlbWVudGF0aW9uCit9IC8vIFYyXzAKK30gLy8gZGV2aWNlCit9IC8vIGNhbWVyYXNlcnZpY2UKK30gLy8gZnJhbWV3b3JrcworfSAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU4ZjFkNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYURldmljZVVzZXIuaApAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9GUkFNRVdPUktTX0NBTUVSQURFVklDRVVTRVJfVjJfMF9DQU1FUkFERVZJQ0VVU0VSX0gKKyNkZWZpbmUgQU5EUk9JRF9GUkFNRVdPUktTX0NBTUVSQURFVklDRVVTRVJfVjJfMF9DQU1FUkFERVZJQ0VVU0VSX0gKKworI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9jb21tb24vMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL0lDYW1lcmFEZXZpY2VVc2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKworI2luY2x1ZGUgPENhbWVyYVNlcnZpY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZyYW1ld29ya3MgeworbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UgeworbmFtZXNwYWNlIGRldmljZSB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OkNhcHR1cmVSZXF1ZXN0OwordXNpbmcgaGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU7Cit1c2luZyBoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlOwordXNpbmcgaGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM7Cit1c2luZyBoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUgPSBNZXNzYWdlUXVldWU8dWludDhfdCwga1N5bmNocm9uaXplZFJlYWRXcml0ZT47Cit1c2luZyBDYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUgPSBNZXNzYWdlUXVldWU8dWludDhfdCwga1N5bmNocm9uaXplZFJlYWRXcml0ZT47Cit1c2luZyBUZW1wbGF0ZUlkID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpUZW1wbGF0ZUlkOworCit1c2luZyBIQ2FtZXJhRGV2aWNlVXNlciA9IGRldmljZTo6VjJfMDo6SUNhbWVyYURldmljZVVzZXI7Cit1c2luZyBIQ2FtZXJhTWV0YWRhdGEgPSBjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFNZXRhZGF0YTsKK3VzaW5nIEhDYXB0dXJlUmVxdWVzdCA9IGRldmljZTo6VjJfMDo6Q2FwdHVyZVJlcXVlc3Q7Cit1c2luZyBIT3V0cHV0Q29uZmlndXJhdGlvbiA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6T3V0cHV0Q29uZmlndXJhdGlvbjsKK3VzaW5nIEhQaHlzaWNhbENhbWVyYVNldHRpbmdzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpQaHlzaWNhbENhbWVyYVNldHRpbmdzOwordXNpbmcgSFN0YXR1cyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6U3RhdHVzOworCitzdGF0aWMgY29uc3RleHByIGludDMyX3QgUkVRVUVTVF9JRF9OT05FID0gLTE7CisKK3N0cnVjdCBIaWRsQ2FtZXJhRGV2aWNlVXNlciBmaW5hbCA6IHB1YmxpYyBIQ2FtZXJhRGV2aWNlVXNlciB7CisgICAgSGlkbENhbWVyYURldmljZVVzZXIoY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyPiAmZGV2aWNlUmVtb3RlKTsKKworICAgIH5IaWRsQ2FtZXJhRGV2aWNlVXNlcigpIHsgfQorCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gZGlzY29ubmVjdCgpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gZ2V0Q2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlKAorICAgICAgICBnZXRDYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWVfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gZ2V0Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUoCisgICAgICAgIGdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IHN1Ym1pdFJlcXVlc3RMaXN0KGNvbnN0IGhpZGxfdmVjPEhDYXB0dXJlUmVxdWVzdD4mIHJlcXVlc3RMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nLCBzdWJtaXRSZXF1ZXN0TGlzdF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBjYW5jZWxSZXBlYXRpbmdSZXF1ZXN0KGNhbmNlbFJlcGVhdGluZ1JlcXVlc3RfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48SFN0YXR1cz4gYmVnaW5Db25maWd1cmUoKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPEhTdGF0dXM+IGVuZENvbmZpZ3VyZShTdHJlYW1Db25maWd1cmF0aW9uTW9kZSBvcGVyYXRpbmdNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvblBhcmFtcyk7CisKKyAgICB2aXJ0dWFsIFJldHVybjxIU3RhdHVzPiBkZWxldGVTdHJlYW0oaW50MzJfdCBzdHJlYW1JZCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBjcmVhdGVTdHJlYW0oY29uc3QgSE91dHB1dENvbmZpZ3VyYXRpb24mIG91dHB1dENvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVN0cmVhbV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48dm9pZD4gY3JlYXRlRGVmYXVsdFJlcXVlc3QoVGVtcGxhdGVJZCB0ZW1wbGF0ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVEZWZhdWx0UmVxdWVzdF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjxIU3RhdHVzPiB3YWl0VW50aWxJZGxlKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBmbHVzaChmbHVzaF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjxIU3RhdHVzPiB1cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uKAorICAgICAgICBpbnQzMl90IHN0cmVhbUlkLCBjb25zdCBIT3V0cHV0Q29uZmlndXJhdGlvbiYgb3V0cHV0Q29uZmlndXJhdGlvbikgb3ZlcnJpZGU7CisKKyAgICBib29sIGluaXRTdGF0dXMoKSB7IHJldHVybiBtSW5pdFN1Y2Nlc3M7IH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZT4gZ2V0Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUoKSB7CisgICAgICAgIHJldHVybiBtQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWU7CisgICAgfQorCisgcHJpdmF0ZToKKyAgICBib29sIGluaXREZXZpY2UoKTsKKworICAgIGJvb2wgY29udmVydFJlcXVlc3RGcm9tSGlkbChjb25zdCBIQ2FwdHVyZVJlcXVlc3QgJmhSZXF1ZXN0LCBDYXB0dXJlUmVxdWVzdCAqcmVxdWVzdCk7CisKKyAgICBib29sIGNvcHlQaHlzaWNhbENhbWVyYVNldHRpbmdzKAorICAgICAgICBjb25zdCBoaWRsX3ZlYzxIUGh5c2ljYWxDYW1lcmFTZXR0aW5ncz4gJmhQaHlzaWNhbENhbWVyYVNldHRpbmdzLAorICAgICAgICBzdGQ6OnZlY3RvcjxDYXB0dXJlUmVxdWVzdDo6UGh5c2ljYWxDYW1lcmFTZXR0aW5ncz4gKnBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MpOworCisgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyPiBtRGV2aWNlUmVtb3RlOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWU+IG1DYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUgPSBudWxscHRyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZT4gbUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlID0gbnVsbHB0cjsKKyAgICBib29sIG1Jbml0U3VjY2VzcyA9IGZhbHNlOworICAgIGludDMyX3QgbVJlcXVlc3RJZCA9IFJFUVVFU1RfSURfTk9ORTsKK307CisKK30gLy8gaW1wbGVtZW50YXRpb24KK30gLy8gVjJfMAorfSAvLyBkZXZpY2UKK30gLy8gY2FtZXJhc2VydmljZQorfSAvLyBmcmFtZXdvcmtzCit9IC8vIGFuZHJvaWQKKyNlbmRpZiAvLyBBTkRST0lEX0ZSQU1FT1dPUktTX0NBTUVSQURFVklDRVVTRVJfVjJfMF9DQU1FUkFERVZJQ0VVU0VSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhmMWQzNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuY3BwCkBAIC0wLDAgKzEsMjczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGhpZGwvQ29udmVydC5oPgorCisjaW5jbHVkZSA8aGlkbC9IaWRsQ2FtZXJhU2VydmljZS5oPgorCisjaW5jbHVkZSA8aGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5oPgorI2luY2x1ZGUgPGhpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5oPgorI2luY2x1ZGUgPGhpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5oPgorCisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZnJhbWV3b3JrcyB7CituYW1lc3BhY2UgY2FtZXJhc2VydmljZSB7CituYW1lc3BhY2Ugc2VydmljZSB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6SGlkbENhbWVyYVNlcnZpY2U7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OmNvbnZlcnRUb0hpZGw7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OkIySFN0YXR1czsKK3VzaW5nIGhhcmR3YXJlOjpWb2lkOworCit1c2luZyBkZXZpY2U6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M7Cit1c2luZyBkZXZpY2U6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpIaWRsQ2FtZXJhRGV2aWNlVXNlcjsKK3VzaW5nIHNlcnZpY2U6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpIMkJDYW1lcmFTZXJ2aWNlTGlzdGVuZXI7Cit1c2luZyBIQ2FtZXJhTWV0YWRhdGFUeXBlID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpDYW1lcmFNZXRhZGF0YVR5cGU7Cit1c2luZyBIVmVuZG9yVGFnID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpWZW5kb3JUYWc7Cit1c2luZyBIVmVuZG9yVGFnU2VjdGlvbiA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6VmVuZG9yVGFnU2VjdGlvbjsKK3VzaW5nIEhQcm92aWRlcklkQW5kVmVuZG9yVGFnU2VjdGlvbnMgPQorICAgICAgICBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlByb3ZpZGVySWRBbmRWZW5kb3JUYWdTZWN0aW9uczsKKworc3A8SGlkbENhbWVyYVNlcnZpY2U+IGdIaWRsQ2FtZXJhU2VydmljZTsKKworc3A8SGlkbENhbWVyYVNlcnZpY2U+IEhpZGxDYW1lcmFTZXJ2aWNlOjpnZXRJbnN0YW5jZShhbmRyb2lkOjpDYW1lcmFTZXJ2aWNlICpjcykgeworICAgIGdIaWRsQ2FtZXJhU2VydmljZSA9IG5ldyBIaWRsQ2FtZXJhU2VydmljZShjcyk7CisgICAgcmV0dXJuIGdIaWRsQ2FtZXJhU2VydmljZTsKK30KKworUmV0dXJuPHZvaWQ+CitIaWRsQ2FtZXJhU2VydmljZTo6Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNvbnN0IGhpZGxfc3RyaW5nJiBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzX2NiIF9oaWRsX2NiKSB7CisgICAgYW5kcm9pZDo6Q2FtZXJhTWV0YWRhdGEgY2FtZXJhTWV0YWRhdGE7CisgICAgSFN0YXR1cyBzdGF0dXMgPSBIU3RhdHVzOjpOT19FUlJPUjsKKyAgICBiaW5kZXI6OlN0YXR1cyBzZXJ2aWNlUmV0ID0KKyAgICAgICAgbUFpZGxJQ2FtZXJhU2VydmljZS0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKFN0cmluZzE2KGNhbWVyYUlkLmNfc3RyKCkpLCAmY2FtZXJhTWV0YWRhdGEpOworICAgIEhDYW1lcmFNZXRhZGF0YSBoaWRsTWV0YWRhdGE7CisgICAgaWYgKCFzZXJ2aWNlUmV0LmlzT2soKSkgeworICAgICAgICBzd2l0Y2goc2VydmljZVJldC5zZXJ2aWNlU3BlY2lmaWNFcnJvckNvZGUoKSkgeworICAgICAgICAgICAgLy8gTm8gRVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRCBzaW5jZSB3ZSdyZSBpbiB0aGUgc2FtZSBwcm9jZXNzLgorICAgICAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQ6CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgSUQgJXMgZG9lcyBub3QgZXhpc3QhIiwgX19GVU5DVElPTl9fLCBjYW1lcmFJZC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBIU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5UOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiR2V0IGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgZnJvbSBjYW1lcmEgc2VydmljZSBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlUmV0LnRvU3RyaW5nOCgpLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCMkhTdGF0dXMoc2VydmljZVJldCk7CisgICAgICAgICAgfQorICAgICAgICBfaGlkbF9jYihzdGF0dXMsIGhpZGxNZXRhZGF0YSk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpyYXdNZXRhZGF0YSA9IGNhbWVyYU1ldGFkYXRhLmdldEFuZExvY2soKTsKKyAgICBjb252ZXJ0VG9IaWRsKHJhd01ldGFkYXRhLCAmaGlkbE1ldGFkYXRhKTsKKyAgICBfaGlkbF9jYihzdGF0dXMsIGhpZGxNZXRhZGF0YSk7CisgICAgY2FtZXJhTWV0YWRhdGEudW5sb2NrKHJhd01ldGFkYXRhKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYVNlcnZpY2U6OmNvbm5lY3REZXZpY2UoY29uc3Qgc3A8SENhbWVyYURldmljZUNhbGxiYWNrPiYgaENhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0RGV2aWNlX2NiIF9oaWRsX2NiKSB7CisgICAgLy8gSGVyZSwgd2UgZmlyc3QgZ2V0IElDYW1lcmFEZXZpY2VVc2VyIGZyb20gbUFpZGxJQ2FtZXJhU2VydmljZSwgdGhlbiBzYXZlCisgICAgLy8gdGhhdCBpbnRlcmZhY2UgaW4gdGhlIG5ld2x5IGNyZWF0ZWQgSGlkbENhbWVyYURldmljZVVzZXIgaW1wbCBjbGFzcy4KKyAgICBpZiAobUFpZGxJQ2FtZXJhU2VydmljZSA9PSBudWxscHRyKSB7CisgICAgICAgIF9oaWRsX2NiKEhTdGF0dXM6OlVOS05PV05fRVJST1IsIG51bGxwdHIpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI+IGRldmljZVJlbW90ZSA9IG51bGxwdHI7CisgICAgLy8gQ3JlYXRlIGEgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFjayBvYmplY3Qgd2hpY2ggaW50ZXJuYWxseQorICAgIC8vIGNhbGxzIGNhbGxiYWNrIGZ1bmN0aW9ucyBwYXNzZWQgdGhyb3VnaCBoQ2FsbGJhY2suCisgICAgc3A8SDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBoeWJyaWRDYWxsYmFja3MgPSBuZXcgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzKGhDYWxsYmFjayk7CisgICAgaWYgKCFoeWJyaWRDYWxsYmFja3MtPmluaXRpYWxpemVMb29wZXIoKSkgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGhhbmRsZSBjYWxsYmFja3Mgb24gZGV2aWNlLCBjYW5ub3QgY29ubmVjdCIpOworICAgICAgICBfaGlkbF9jYihIU3RhdHVzOjpVTktOT1dOX0VSUk9SLCBudWxscHRyKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IGNhbGxiYWNrcyA9IGh5YnJpZENhbGxiYWNrczsKKyAgICBiaW5kZXI6OlN0YXR1cyBzZXJ2aWNlUmV0ID0gbUFpZGxJQ2FtZXJhU2VydmljZS0+Y29ubmVjdERldmljZSgKKyAgICAgICAgICAgIGNhbGxiYWNrcywgU3RyaW5nMTYoY2FtZXJhSWQuY19zdHIoKSksIFN0cmluZzE2KCIiKSwKKyAgICAgICAgICAgIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6VVNFX0NBTExJTkdfVUlELCAvKm91dCovJmRldmljZVJlbW90ZSk7CisgICAgSFN0YXR1cyBzdGF0dXMgPSBIU3RhdHVzOjpOT19FUlJPUjsKKyAgICBpZiAoIXNlcnZpY2VSZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbm5lY3QgdG8gY2FtZXJhIGRldmljZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHN0YXR1cyA9IEIySFN0YXR1cyhzZXJ2aWNlUmV0KTsKKyAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBudWxscHRyKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgLy8gTm93IHdlIGNyZWF0ZSBhIEhpZGxDYW1lcmFEZXZpY2VVc2VyIGNsYXNzLCBzdG9yZSB0aGUgZGV2aWNlUmVtb3RlIGluIGl0LAorICAgIC8vIGFuZCByZXR1cm4gdGhhdCBiYWNrLiBBbGwgY2FsbHMgb24gdGhhdCBpbnRlcmZhY2Ugd2lsbCBiZSBmb3J3YXJkZWQgdG8KKyAgICAvLyB0aGUgQUlETCBpbnRlcmZhY2UuCisgICAgc3A8SGlkbENhbWVyYURldmljZVVzZXI+IGhEZXZpY2VSZW1vdGUgPSBuZXcgSGlkbENhbWVyYURldmljZVVzZXIoZGV2aWNlUmVtb3RlKTsKKyAgICBpZiAoIWhEZXZpY2VSZW1vdGUtPmluaXRTdGF0dXMoKSkgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBpbml0aWFsaXplIGNhbWVyYSBkZXZpY2UgSElETCB3cmFwcGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgX2hpZGxfY2IoSFN0YXR1czo6VU5LTk9XTl9FUlJPUiwgbnVsbHB0cik7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIGh5YnJpZENhbGxiYWNrcy0+c2V0Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUoaERldmljZVJlbW90ZS0+Z2V0Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUoKSk7CisgICAgX2hpZGxfY2Ioc3RhdHVzLCBoRGV2aWNlUmVtb3RlKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCit2b2lkIEhpZGxDYW1lcmFTZXJ2aWNlOjphZGRUb0xpc3RlbmVyQ2FjaGVMb2NrZWQoc3A8SENhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gaExpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBjc0xpc3RlbmVyKSB7CisgICAgICAgIG1MaXN0ZW5lcnMuZW1wbGFjZV9iYWNrKHN0ZDo6bWFrZV9wYWlyKGhMaXN0ZW5lciwgY3NMaXN0ZW5lcikpOworfQorCitzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4KK0hpZGxDYW1lcmFTZXJ2aWNlOjpzZWFyY2hMaXN0ZW5lckNhY2hlTG9ja2VkKHNwPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IGhMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2hvdWxkUmVtb3ZlKSB7CisgICAgLy8gR28gdGhyb3VnaCB0aGUgbUxpc3RlbmVycyBsaXN0IGFuZCBjb21wYXJlIHRoZSBsaXN0ZW5lciB3aXRoIHRoZSBISURMCisgICAgLy8gbGlzdGVuZXIgcmVnaXN0ZXJlZC4KKyAgICBhdXRvIGl0ID0gbUxpc3RlbmVycy5iZWdpbigpOworICAgIHNwPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IGNzTGlzdGVuZXIgPSBudWxscHRyOworICAgIGZvciAoO2l0ICE9IG1MaXN0ZW5lcnMuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgaWYgKGhhcmR3YXJlOjppbnRlcmZhY2VzRXF1YWwoaXQtPmZpcnN0LCBoTGlzdGVuZXIpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaXQgIT0gbUxpc3RlbmVycy5lbmQoKSkgeworICAgICAgICBjc0xpc3RlbmVyID0gaXQtPnNlY29uZDsKKyAgICAgICAgaWYgKHNob3VsZFJlbW92ZSkgeworICAgICAgICAgIG1MaXN0ZW5lcnMuZXJhc2UoaXQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjc0xpc3RlbmVyOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYVNlcnZpY2U6OmFkZExpc3RlbmVyKGNvbnN0IHNwPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+JiBoQ3NMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTGlzdGVuZXJfY2IgX2hpZGxfY2IpIHsKKyAgICBpZiAobUFpZGxJQ2FtZXJhU2VydmljZSA9PSBudWxscHRyKSB7CisgICAgICAgIF9oaWRsX2NiKEhTdGF0dXM6OlVOS05PV05fRVJST1IsIHt9KTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgaWYgKGhDc0xpc3RlbmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzIGxpc3RlbmVyIG11c3Qgbm90IGJlIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBfaGlkbF9jYihIU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5ULCB7fSk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIHNwPGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBjc0xpc3RlbmVyID0gbnVsbHB0cjsKKyAgICAvLyBDaGVjayB0aGUgY2FjaGUgZm9yIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBjYWxsYmFja3MKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1MaXN0ZW5lckxpc3RMb2NrKTsKKyAgICAgICAgY3NMaXN0ZW5lciA9IHNlYXJjaExpc3RlbmVyQ2FjaGVMb2NrZWQoaENzTGlzdGVuZXIpOworICAgICAgICBpZiAoY3NMaXN0ZW5lciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyBXcmFwIGFuIGhDc0xpc3RlbmVyIHdpdGggQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lciBhbmQgcGFzcyBpdCB0bworICAgICAgICAgICAgLy8gQ2FtZXJhU2VydmljZS4KKyAgICAgICAgICAgIGNzTGlzdGVuZXIgPSBuZXcgSDJCQ2FtZXJhU2VydmljZUxpc3RlbmVyKGhDc0xpc3RlbmVyKTsKKyAgICAgICAgICAgIC8vIEFkZCB0byBjYWNoZQorICAgICAgICAgICAgYWRkVG9MaXN0ZW5lckNhY2hlTG9ja2VkKGhDc0xpc3RlbmVyLCBjc0xpc3RlbmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVHJ5aW5nIHRvIGFkZCBhIGxpc3RlbmVyICVwIGFscmVhZHkgcmVnaXN0ZXJlZCIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGhDc0xpc3RlbmVyLmdldCgpKTsKKyAgICAgICAgICAgIF9oaWRsX2NiKEhTdGF0dXM6OklMTEVHQUxfQVJHVU1FTlQsIHt9KTsKKyAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0YXR1cz4gY2FtZXJhU3RhdHVzQW5kSWRze307CisgICAgYmluZGVyOjpTdGF0dXMgc2VydmljZVJldCA9IG1BaWRsSUNhbWVyYVNlcnZpY2UtPmFkZExpc3RlbmVyKGNzTGlzdGVuZXIsICZjYW1lcmFTdGF0dXNBbmRJZHMpOworICAgIEhTdGF0dXMgc3RhdHVzID0gSFN0YXR1czo6Tk9fRVJST1I7CisgICAgaWYgKCFzZXJ2aWNlUmV0LmlzT2soKSkgeworICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gYWRkIGNhbWVyYSBkZXZpY2Ugc3RhdHVzIGxpc3RlbmVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHN0YXR1cyA9IEIySFN0YXR1cyhzZXJ2aWNlUmV0KTsKKyAgICAgIF9oaWRsX2NiKHN0YXR1cywge30pOworICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgaGlkbF92ZWM8SENhbWVyYVN0YXR1c0FuZElkPiBoQ2FtZXJhU3RhdHVzQW5kSWRzOworICAgIC8vQ29udmVydCBjYW1lcmFTdGF0dXNBbmRJZHMgdG8gSElETCBhbmQgY2FsbCBjYWxsYmFjaworICAgIGNvbnZlcnRUb0hpZGwoY2FtZXJhU3RhdHVzQW5kSWRzLCAmaENhbWVyYVN0YXR1c0FuZElkcyk7CisgICAgX2hpZGxfY2Ioc3RhdHVzLCBoQ2FtZXJhU3RhdHVzQW5kSWRzKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48SFN0YXR1cz4gSGlkbENhbWVyYVNlcnZpY2U6OnJlbW92ZUxpc3RlbmVyKGNvbnN0IHNwPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+JiBoQ3NMaXN0ZW5lcikgeworICAgIGlmIChoQ3NMaXN0ZW5lciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcyBsaXN0ZW5lciBtdXN0IG5vdCBiZSBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEhTdGF0dXM6OklMTEVHQUxfQVJHVU1FTlQ7CisgICAgfQorICAgIHNwPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IGNzTGlzdGVuZXIgPSBudWxscHRyOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxpc3RlbmVyTGlzdExvY2spOworICAgICAgICBjc0xpc3RlbmVyID0gc2VhcmNoTGlzdGVuZXJDYWNoZUxvY2tlZChoQ3NMaXN0ZW5lciwgLypyZW1vdmVJZkZvdW5kKi90cnVlKTsKKyAgICB9CisgICAgaWYgKGNzTGlzdGVuZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgIG1BaWRsSUNhbWVyYVNlcnZpY2UtPnJlbW92ZUxpc3RlbmVyKGNzTGlzdGVuZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlcyBSZW1vdmluZyB1bnJlZ2lzdGVyZWQgbGlzdGVuZXIgJXAiLCBfX0ZVTkNUSU9OX18sIGhDc0xpc3RlbmVyLmdldCgpKTsKKyAgICAgICAgcmV0dXJuIEhTdGF0dXM6OklMTEVHQUxfQVJHVU1FTlQ7CisgICAgfQorICAgIHJldHVybiBIU3RhdHVzOjpOT19FUlJPUjsKK30KKworUmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmFTZXJ2aWNlOjpnZXRDYW1lcmFWZW5kb3JUYWdTZWN0aW9ucyhnZXRDYW1lcmFWZW5kb3JUYWdTZWN0aW9uc19jYiBfaGlkbF9jYikgeworICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZT4gZ0NhY2hlID0gVmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlOjpnZXRHbG9iYWxWZW5kb3JUYWdDYWNoZSgpOworICAgIGlmIChnQ2FjaGUgPT0gbnVsbHB0cikgeworICAgICAgICBfaGlkbF9jYihIU3RhdHVzOjpVTktOT1dOX0VSUk9SLCB7fSk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxtZXRhZGF0YV92ZW5kb3JfaWRfdCwgc3A8YW5kcm9pZDo6VmVuZG9yVGFnRGVzY3JpcHRvcj4+CisgICAgICAgICAgICAmdmVuZG9ySWRzQW5kVGFnRGVzY3MgPSBnQ2FjaGUtPmdldFZlbmRvcklkc0FuZFRhZ0Rlc2NyaXB0b3JzKCk7CisgICAgaWYgKHZlbmRvcklkc0FuZFRhZ0Rlc2NzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIF9oaWRsX2NiKEhTdGF0dXM6OlVOS05PV05fRVJST1IsIHt9KTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBoaWRsX3ZlYzxIUHJvdmlkZXJJZEFuZFZlbmRvclRhZ1NlY3Rpb25zPiBoVGFnSWRzQW5kVmVuZG9yVGFnU2VjdGlvbnM7CisgICAgaFRhZ0lkc0FuZFZlbmRvclRhZ1NlY3Rpb25zLnJlc2l6ZSh2ZW5kb3JJZHNBbmRUYWdEZXNjcy5zaXplKCkpOworICAgIHNpemVfdCBqID0gMDsKKyAgICBmb3IgKGF1dG8gJnZlbmRvcklkQW5kVGFnRGVzY3MgOiB2ZW5kb3JJZHNBbmRUYWdEZXNjcykgeworICAgICAgICBoaWRsX3ZlYzxIVmVuZG9yVGFnU2VjdGlvbj4gaFZlbmRvclRhZ1NlY3Rpb25zOworICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiBkZXNjID0gdmVuZG9ySWRBbmRUYWdEZXNjcy5zZWNvbmQ7CisgICAgICAgIGNvbnN0IFNvcnRlZFZlY3RvcjxTdHJpbmc4Piogc2VjdGlvbk5hbWVzID0gZGVzYy0+Z2V0QWxsU2VjdGlvbk5hbWVzKCk7CisgICAgICAgIHNpemVfdCBudW1TZWN0aW9ucyA9IHNlY3Rpb25OYW1lcy0+c2l6ZSgpOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxIVmVuZG9yVGFnPj4gdGFnc0J5U2VjdGlvbihudW1TZWN0aW9ucyk7CisgICAgICAgIGludCB0YWdDb3VudCA9IGRlc2MtPmdldFRhZ0NvdW50KCk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiB0YWdzKHRhZ0NvdW50KTsKKyAgICAgICAgZGVzYy0+Z2V0VGFnQXJyYXkodGFncy5kYXRhKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhZ0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgIEhWZW5kb3JUYWcgdnQ7CisgICAgICAgICAgICB2dC50YWdJZCA9IHRhZ3NbaV07CisgICAgICAgICAgICB2dC50YWdOYW1lID0gZGVzYy0+Z2V0VGFnTmFtZSh0YWdzW2ldKTsKKyAgICAgICAgICAgIHZ0LnRhZ1R5cGUgPSAoSENhbWVyYU1ldGFkYXRhVHlwZSkgZGVzYy0+Z2V0VGFnVHlwZSh0YWdzW2ldKTsKKyAgICAgICAgICAgIHNzaXplX3Qgc2VjdGlvbklkeCA9IGRlc2MtPmdldFNlY3Rpb25JbmRleCh0YWdzW2ldKTsKKyAgICAgICAgICAgIHRhZ3NCeVNlY3Rpb25bc2VjdGlvbklkeF0ucHVzaF9iYWNrKHZ0KTsKKyAgICAgICAgfQorICAgICAgICBoVmVuZG9yVGFnU2VjdGlvbnMucmVzaXplKG51bVNlY3Rpb25zKTsKKyAgICAgICAgZm9yIChzaXplX3QgcyA9IDA7IHMgPCBudW1TZWN0aW9uczsgcysrKSB7CisgICAgICAgICAgICBoVmVuZG9yVGFnU2VjdGlvbnNbc10uc2VjdGlvbk5hbWUgPSAoKnNlY3Rpb25OYW1lcylbc10uc3RyaW5nKCk7CisgICAgICAgICAgICBoVmVuZG9yVGFnU2VjdGlvbnNbc10udGFncyA9IHRhZ3NCeVNlY3Rpb25bc107CisgICAgICAgIH0KKyAgICAgICAgSFByb3ZpZGVySWRBbmRWZW5kb3JUYWdTZWN0aW9ucyAmaFByb3ZpZGVySWRBbmRWZW5kb3JUYWdTZWN0aW9ucyA9CisgICAgICAgICAgICAgICAgaFRhZ0lkc0FuZFZlbmRvclRhZ1NlY3Rpb25zW2pdOworICAgICAgICBoUHJvdmlkZXJJZEFuZFZlbmRvclRhZ1NlY3Rpb25zLnByb3ZpZGVySWQgPSB2ZW5kb3JJZEFuZFRhZ0Rlc2NzLmZpcnN0OworICAgICAgICBoUHJvdmlkZXJJZEFuZFZlbmRvclRhZ1NlY3Rpb25zLnZlbmRvclRhZ1NlY3Rpb25zID0gc3RkOjptb3ZlKGhWZW5kb3JUYWdTZWN0aW9ucyk7CisgICAgICAgIGorKzsKKyAgICB9CisgICAgX2hpZGxfY2IoSFN0YXR1czo6Tk9fRVJST1IsIGhUYWdJZHNBbmRWZW5kb3JUYWdTZWN0aW9ucyk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworfSAvLyBpbXBsZW1lbnRhdGlvbgorfSAvLyBWMl8wCit9IC8vIHNlcnZpY2UKK30gLy8gY2FtZXJhc2VydmljZQorfSAvLyBmcmFtZXdvcmtzCit9IC8vIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYWQwYmMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9GUkFNRVdPUktTX0NBTUVSQVNFUlZJQ0VfVjJfMF9DQU1FUkFTRVJWSUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9GUkFNRVdPUktTX0NBTUVSQVNFUlZJQ0VfVjJfMF9DQU1FUkFTRVJWSUNFX0gKKworI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHRocmVhZD4KKworI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2NvbW1vbi8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC9JQ2FtZXJhU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC90eXBlcy5oPgorCisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKworI2luY2x1ZGUgPENhbWVyYVNlcnZpY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZyYW1ld29ya3MgeworbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UgeworbmFtZXNwYWNlIHNlcnZpY2UgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgaGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI7Cit1c2luZyBoYXJkd2FyZTo6UmV0dXJuOworCit1c2luZyBIQ2FtZXJhRGV2aWNlQ2FsbGJhY2sgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OklDYW1lcmFEZXZpY2VDYWxsYmFjazsKK3VzaW5nIEhDYW1lcmFNZXRhZGF0YSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OkNhbWVyYU1ldGFkYXRhOwordXNpbmcgSENhbWVyYVNlcnZpY2UgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpJQ2FtZXJhU2VydmljZTsKK3VzaW5nIEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXIgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyOwordXNpbmcgSFN0YXR1cyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6U3RhdHVzOwordXNpbmcgSENhbWVyYVN0YXR1c0FuZElkID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhU3RhdHVzQW5kSWQ7CisKK3N0cnVjdCBIaWRsQ2FtZXJhU2VydmljZSBmaW5hbCA6IHB1YmxpYyBIQ2FtZXJhU2VydmljZSB7CisKKyAgICB+SGlkbENhbWVyYVNlcnZpY2UoKSB7IH07CisKKyAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMi4wOjpJQ2FtZXJhU2VydmljZSBmb2xsb3cuCisKKyAgICBSZXR1cm48dm9pZD4gY29ubmVjdERldmljZShjb25zdCBzcDxIQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgY2FtZXJhSWQsIGNvbm5lY3REZXZpY2VfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgUmV0dXJuPHZvaWQ+IGFkZExpc3RlbmVyKGNvbnN0IHNwPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTGlzdGVuZXJfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgUmV0dXJuPEhTdGF0dXM+IHJlbW92ZUxpc3RlbmVyKGNvbnN0IHNwPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+JiBsaXN0ZW5lcikgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48dm9pZD4gZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNvbnN0IGhpZGxfc3RyaW5nJiBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENhbWVyYUNoYXJhY3RlcmlzdGljc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48dm9pZD4gZ2V0Q2FtZXJhVmVuZG9yVGFnU2VjdGlvbnMoZ2V0Q2FtZXJhVmVuZG9yVGFnU2VjdGlvbnNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgLy8gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IHRoZSBjYW1lcmFzZXJ2ZXJzIG1haW4gdGhyZWFkIHRvCisgICAgLy8gaW5zdGFudGlhdGUgdGhlIGhpZGwgY2FtZXJhc2VydmVyLgorICAgIHN0YXRpYyBzcDxIaWRsQ2FtZXJhU2VydmljZT4gZ2V0SW5zdGFuY2UoYW5kcm9pZDo6Q2FtZXJhU2VydmljZSAqY3MpOworCitwcml2YXRlOgorICAgIEhpZGxDYW1lcmFTZXJ2aWNlKGFuZHJvaWQ6OkNhbWVyYVNlcnZpY2UgKmNzKSA6IG1BaWRsSUNhbWVyYVNlcnZpY2UoY3MpIHsgfTsKKworICAgIHNwPGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBzZWFyY2hMaXN0ZW5lckNhY2hlTG9ja2VkKAorICAgICAgICBzcDxIQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBsaXN0ZW5lciwgLypyZW1vdmVJZkZvdW5kKi8gYm9vbCBzaG91bGRSZW1vdmUgPSBmYWxzZSk7CisKKyAgICB2b2lkIGFkZFRvTGlzdGVuZXJDYWNoZUxvY2tlZChzcDxIQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBoTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IGNzTGlzdGVuZXIpOworCisgICAgYW5kcm9pZDo6Q2FtZXJhU2VydmljZSAqY29uc3QgbUFpZGxJQ2FtZXJhU2VydmljZSA9IG51bGxwdHI7CisKKyAgICBNdXRleCBtTGlzdGVuZXJMaXN0TG9jazsKKworICAgIHVzaW5nIEhJTGlzdGVuZXJzID0KKyAgICAgICAgc3RkOjpwYWlyPHNwPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+LCBzcDxJQ2FtZXJhU2VydmljZUxpc3RlbmVyPj47CisgICAgc3RkOjpsaXN0PEhJTGlzdGVuZXJzPiBtTGlzdGVuZXJzOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIHNlcnZpY2UKK30gIC8vIG5hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlCit9ICAvLyBuYW1lc3BhY2UgZnJhbWV3b3JrcworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0ZSQU1FV09SS1NfQ0FNRVJBU0VSVklDRV9WMl8wX0NBTUVSQVNFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQubWsKaW5kZXggZjc3MDY5Yy4uYWQ5OTYzYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9BbmRyb2lkLm1rCkBAIC0zMCw3ICszMCw4IEBACiAgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuY29tbW9uQDEuMCBcCiAgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40IFwKICAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMS4wIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4yCisgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMiBcCisgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNAogCiBMT0NBTF9DX0lOQ0xVREVTICs9IFwKICAgICBzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZSBcCkBAIC0zOCw2ICszOSw3IEBACiBMT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdleHRyYSAtV2Vycm9yCiAKIExPQ0FMX01PRFVMRTo9IGNhbWVyYXNlcnZpY2VfdGVzdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBkZXZpY2UtdGVzdHMKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiAKIGluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0NhbWVyYVByb3ZpZGVyTWFuYWdlclRlc3QuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyVGVzdC5jcHAKaW5kZXggZWY5M2Q5YS4uMDA4NmM2YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyVGVzdC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyVGVzdC5jcHAKQEAgLTE2Myw3ICsxNjMsNyBAQAogICAgICAgICBtVGVzdENhbWVyYVByb3ZpZGVyID0gcHJvdmlkZXI7CiAgICAgfQogCi0gICAgc3RkOjpzdHJpbmcgbUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZXM7CiAKICAgICB2aXJ0dWFsIH5UZXN0SW50ZXJhY3Rpb25Qcm94eSgpIHt9CiAKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCiAgICAgdmlydHVhbCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBnZXRTZXJ2aWNlKAogICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnNlcnZpY2VOYW1lKSBvdmVycmlkZSB7Ci0gICAgICAgIG1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKKyAgICAgICAgbUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZXMucHVzaF9iYWNrKHNlcnZpY2VOYW1lKTsKICAgICAgICAgcmV0dXJuIG1UZXN0Q2FtZXJhUHJvdmlkZXI7CiAgICAgfQogCkBAIC0yMTAsOSArMjEwLDE4IEBACiAgICAgcmVzID0gcHJvdmlkZXJNYW5hZ2VyLT5pbml0aWFsaXplKHN0YXR1c0xpc3RlbmVyLCAmc2VydmljZVByb3h5KTsKICAgICBBU1NFUlRfRVEocmVzLCBPSykgPDwgIlVuYWJsZSB0byBpbml0aWFsaXplIHByb3ZpZGVyIG1hbmFnZXIiOwogCi0gICAgaGFyZHdhcmU6OmhpZGxfc3RyaW5nIGxlZ2FjeUluc3RhbmNlTmFtZSA9ICJsZWdhY3kvMCI7Ci0gICAgQVNTRVJUX0VRKHNlcnZpY2VQcm94eS5tTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lLCBsZWdhY3lJbnN0YW5jZU5hbWUpIDw8CisgICAgc3RkOjpzdHJpbmcgbGVnYWN5SW5zdGFuY2VOYW1lID0gImxlZ2FjeS8wIjsKKyAgICBzdGQ6OnN0cmluZyBleHRlcm5hbEluc3RhbmNlTmFtZSA9ICJleHRlcm5hbC8wIjsKKyAgICBib29sIGdvdExlZ2FjeSA9IGZhbHNlOworICAgIGJvb2wgZ290RXh0ZXJuYWwgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8mIHNlcnZpY2VOYW1lIDogc2VydmljZVByb3h5Lm1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWVzKSB7CisgICAgICAgIGlmIChzZXJ2aWNlTmFtZSA9PSBsZWdhY3lJbnN0YW5jZU5hbWUpIGdvdExlZ2FjeSA9IHRydWU7CisgICAgICAgIGlmIChzZXJ2aWNlTmFtZSA9PSBleHRlcm5hbEluc3RhbmNlTmFtZSkgZ290RXh0ZXJuYWwgPSB0cnVlOworICAgIH0KKyAgICBBU1NFUlRfVFJVRShnb3RMZWdhY3kpIDw8CiAgICAgICAgICAgICAiTGVnYWN5IGluc3RhbmNlIG5vdCByZXF1ZXN0ZWQgZnJvbSBzZXJ2aWNlIG1hbmFnZXIiOworICAgIEFTU0VSVF9UUlVFKGdvdEV4dGVybmFsKSA8PAorICAgICAgICAgICAgIkV4dGVybmFsIGluc3RhbmNlIG5vdCByZXF1ZXN0ZWQgZnJvbSBzZXJ2aWNlIG1hbmFnZXIiOwogCiAgICAgaGFyZHdhcmU6OmhpZGxfc3RyaW5nIHRlc3RQcm92aWRlckZxSW50ZXJmYWNlTmFtZSA9CiAgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40OjpJQ2FtZXJhUHJvdmlkZXIiOwpAQCAtMjIxLDcgKzIzMCw3IEBACiAgICAgICAgICAgICB0ZXN0UHJvdmlkZXJGcUludGVyZmFjZU5hbWUsCiAgICAgICAgICAgICB0ZXN0UHJvdmlkZXJJbnN0YW5jZU5hbWUsIGZhbHNlKTsKIAotICAgIEFTU0VSVF9FUShzZXJ2aWNlUHJveHkubUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZSwgdGVzdFByb3ZpZGVySW5zdGFuY2VOYW1lKSA8PAorICAgIEFTU0VSVF9FUShzZXJ2aWNlUHJveHkubUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZXMuYmFjaygpLCB0ZXN0UHJvdmlkZXJJbnN0YW5jZU5hbWUpIDw8CiAgICAgICAgICAgICAiSW5jb3JyZWN0IGluc3RhbmNlIHJlcXVlc3RlZCBmcm9tIHNlcnZpY2UgbWFuYWdlciI7CiB9CiAKQEAgLTI1NSw3ICsyNjQsNyBAQAogICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNDo6SUNhbWVyYVByb3ZpZGVyIjsKICAgICBzZXJ2aWNlUHJveHkubU1hbmFnZXJOb3RpZmljYXRpb25JbnRlcmZhY2UtPm9uUmVnaXN0cmF0aW9uKAogICAgICAgICAgICAgdGVzdFByb3ZpZGVyRnFJbnRlcmZhY2VOYW1lLCB0ZXN0UHJvdmlkZXJJbnN0YW5jZU5hbWUsIGZhbHNlKTsKLSAgICBBU1NFUlRfRVEoc2VydmljZVByb3h5Lm1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWUsIHRlc3RQcm92aWRlckluc3RhbmNlTmFtZSkgPDwKKyAgICBBU1NFUlRfRVEoc2VydmljZVByb3h5Lm1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWVzLmJhY2soKSwgdGVzdFByb3ZpZGVySW5zdGFuY2VOYW1lKSA8PAogICAgICAgICAgICAgIkluY29ycmVjdCBpbnN0YW5jZSByZXF1ZXN0ZWQgZnJvbSBzZXJ2aWNlIG1hbmFnZXIiOwogCiAgICAgaGFyZHdhcmU6OmhpZGxfc3RyaW5nIHNlY3Rpb25OYW1lU2Vjb25kID0gIlNlY29uZFZlbmRvclRlc3RTZWN0aW9uIjsKQEAgLTI3Myw3ICsyODIsNyBAQAogICAgIGhhcmR3YXJlOjpoaWRsX3N0cmluZyB0ZXN0UHJvdmlkZXJTZWNvbmRJbnN0YW5jZU5hbWUgPSAidGVzdDIvMCI7CiAgICAgc2VydmljZVByb3h5Lm1NYW5hZ2VyTm90aWZpY2F0aW9uSW50ZXJmYWNlLT5vblJlZ2lzdHJhdGlvbigKICAgICAgICAgICAgIHRlc3RQcm92aWRlckZxSW50ZXJmYWNlTmFtZSwgdGVzdFByb3ZpZGVyU2Vjb25kSW5zdGFuY2VOYW1lLCBmYWxzZSk7Ci0gICAgQVNTRVJUX0VRKHNlcnZpY2VQcm94eS5tTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lLAorICAgIEFTU0VSVF9FUShzZXJ2aWNlUHJveHkubUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZXMuYmFjaygpLAogICAgICAgICAgICAgICB0ZXN0UHJvdmlkZXJTZWNvbmRJbnN0YW5jZU5hbWUpIDw8CiAgICAgICAgICAgICAiSW5jb3JyZWN0IGluc3RhbmNlIHJlcXVlc3RlZCBmcm9tIHNlcnZpY2UgbWFuYWdlciI7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0Rpc3RvcnRpb25NYXBwZXJUZXN0LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0Rpc3RvcnRpb25NYXBwZXJUZXN0LmNwcAppbmRleCAyYTY4OWM2Li41NDkzNWM5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9EaXN0b3J0aW9uTWFwcGVyVGVzdC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvRGlzdG9ydGlvbk1hcHBlclRlc3QuY3BwCkBAIC0xNjcsNiArMTY3LDMwIEBACiAgICAgfQogfQogCitURVNUKERpc3RvcnRpb25NYXBwZXJUZXN0LCBDbGFtcENvbnNpc3RlbmN5KSB7CisgICAgc3RhdHVzX3QgcmVzOworCisgICAgc3RkOjphcnJheTxpbnQzMl90LCA0PiBhY3RpdmVBcnJheSA9IHswLCAwLCA0MDMyLCAzMDI0fTsKKyAgICBEaXN0b3J0aW9uTWFwcGVyIG07CisgICAgc2V0dXBUZXN0TWFwcGVyKCZtLCBpZGVudGl0eURpc3RvcnRpb24sIHRlc3RJQ2FsLCAvKmFjdGl2ZUFycmF5Ki8gYWN0aXZlQXJyYXkuZGF0YSgpLAorICAgICAgICAgICAgLypwcmVDb3JyZWN0aW9uQWN0aXZlQXJyYXkqLyBhY3RpdmVBcnJheS5kYXRhKCkpOworCisgICAgYXV0byByZWN0c09yaWcgPSBhY3RpdmVBcnJheTsKKyAgICByZXMgPSBtLm1hcENvcnJlY3RlZFJlY3RUb1JhdyhhY3RpdmVBcnJheS5kYXRhKCksIDEsIC8qY2xhbXAqL3RydWUsIC8qc2ltcGxlKi8gdHJ1ZSk7CisgICAgQVNTRVJUX0VRKHJlcywgT0spOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3RpdmVBcnJheS5zaXplKCk7IGkrKykgeworICAgICAgICBFWFBFQ1RfRVEoYWN0aXZlQXJyYXlbaV0sIHJlY3RzT3JpZ1tpXSk7CisgICAgfQorCisgICAgcmVzID0gbS5tYXBSYXdSZWN0VG9Db3JyZWN0ZWQoYWN0aXZlQXJyYXkuZGF0YSgpLCAxLCAvKmNsYW1wKi90cnVlLCAvKnNpbXBsZSovIHRydWUpOworICAgIEFTU0VSVF9FUShyZXMsIE9LKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWN0aXZlQXJyYXkuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgRVhQRUNUX0VRKGFjdGl2ZUFycmF5W2ldLCByZWN0c09yaWdbaV0pOworICAgIH0KK30KKwogVEVTVChEaXN0b3J0aW9uTWFwcGVyVGVzdCwgU2ltcGxlVHJhbnNmb3JtKSB7CiAgICAgc3RhdHVzX3QgcmVzOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjllMzQ0YgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmNwcApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkNhbWVyYVRocmVhZFN0YXRlLmgiCisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitpbnQgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKSB7CisgICAgaWYgKGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5pc1NlcnZpbmdDYWxsKCkpIHsKKyAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgfQorICAgIHJldHVybiBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7Cit9CisKK2ludCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpIHsKKyAgICBpZiAoaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmlzU2VydmluZ0NhbGwoKSkgeworICAgICAgICByZXR1cm4gaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKKyAgICB9CisgICAgcmV0dXJuIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKK30KKworaW50NjRfdCBDYW1lcmFUaHJlYWRTdGF0ZTo6Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKSB7CisgICAgaWYgKGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5pc1NlcnZpbmdDYWxsKCkpIHsKKyAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgIH0KKyAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKK30KKwordm9pZCBDYW1lcmFUaHJlYWRTdGF0ZTo6cmVzdG9yZUNhbGxpbmdJZGVudGl0eShpbnQ2NF90IHRva2VuKSB7CisgICAgaWYgKGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5pc1NlcnZpbmdDYWxsKCkpIHsKKyAgICAgICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgIH0gZWxzZSB7CisgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK30gLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFhNzBkZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmgKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworY2xhc3MgQ2FtZXJhVGhyZWFkU3RhdGUgeworcHVibGljOgorICBzdGF0aWMgaW50NjRfdCBjbGVhckNhbGxpbmdJZGVudGl0eSgpOworCisgIHN0YXRpYyB2b2lkIHJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaW50NjRfdCB0b2tlbik7CisKKyAgc3RhdGljIGludCBnZXRDYWxsaW5nVWlkKCk7CisKKyAgc3RhdGljIGludCBnZXRDYWxsaW5nUGlkKCk7Cit9OworCit9IC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1RhZ01vbml0b3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvVGFnTW9uaXRvci5jcHAKaW5kZXggYzBhMzUzZi4uZjRjNDllYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvVGFnTW9uaXRvci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvVGFnTW9uaXRvci5jcHAKQEAgLTQ5LDcgKzQ5LDggQEAKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTW9uaXRvck11dGV4KTsKIAogICAgIC8vIEV4cGFuZCBzaG9ydGhhbmRzCi0gICAgaWYgKHNzaXplX3QgaWR4ID0gdGFnTmFtZXMuZmluZCgiM2EiKSAhPSAtMSkgeworICAgIHNzaXplX3QgaWR4ID0gdGFnTmFtZXMuZmluZCgiM2EiKTsKKyAgICBpZiAoaWR4ICE9IC0xKSB7CiAgICAgICAgIHNzaXplX3QgZW5kID0gdGFnTmFtZXMuZmluZCgiLCIsIGlkeCk7CiAgICAgICAgIGNoYXIqIHN0YXJ0ID0gdGFnTmFtZXMubG9ja0J1ZmZlcih0YWdOYW1lcy5zaXplKCkpOwogICAgICAgICBzdGFydFtpZHhdID0gJ1wwJzsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwCmluZGV4IDRiMDUzOTUuLmFlODMyYmEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcApAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KICNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlIDxzdHJpbmcuaD4KQEAgLTgwLDExICs4MSwxOCBAQAogICAgIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpjb250ZW50OjpwbTsKIAogLy8gaW5kaXZpZHVhbCByZWNvcmRzIGtlcHQgaW4gbWVtb3J5OiBhZ2Ugb3IgY291bnQKLS8vIGFnZTogPD0gMzYgaG91cnMgKDEuNSBkYXlzKQorLy8gYWdlOiA8PSAyOCBob3VycyAoMSAxLzYgZGF5cykKIC8vIGNvdW50OiBoYXJkIGxpbWl0IG9mICMgcmVjb3JkcwogLy8gKDAgZm9yIGVpdGhlciBvZiB0aGVzZSBkaXNhYmxlcyB0aGF0IHRocmVzaG9sZCkKLXN0YXRpYyBjb25zdCBuc2Vjc190IGtNYXhSZWNvcmRBZ2VOcyA9ICAzNiAqIDM2MDAgKiAoMTAwMCoxMDAwKjEwMDBsbCk7Ci1zdGF0aWMgY29uc3QgaW50IGtNYXhSZWNvcmRzICAgID0gMDsKKy8vCitzdGF0aWMgY29uc3RleHByIG5zZWNzX3Qga01heFJlY29yZEFnZU5zID0gIDI4ICogMzYwMCAqICgxMDAwKjEwMDAqMTAwMGxsKTsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtNYXhSZWNvcmRzICAgID0gMDsKKworLy8gbWF4IHdlIGV4cGlyZSBpbiBhIHNpbmdsZSBjYWxsLCB0byBjb25zdHJhaW4gaG93IGxvbmcgd2UgaG9sZCB0aGUKKy8vIG11dGV4LCB3aGljaCBhbHNvIGNvbnN0cmFpbnMgaG93IGxvbmcgYSBjbGllbnQgbWlnaHQgd2FpdC4KK3N0YXRpYyBjb25zdGV4cHIgaW50IGtNYXhFeHBpcmVkQXRPbmNlID0gNTA7CisKKy8vIFRPRE86IG5lZWQgdG8gbG9vayBhdCB0dW5pbmcga01heFJlY29yZHMgYW5kIGZyaWVuZHMgZm9yIGxvdy1tZW1vcnkgZGV2aWNlcwogCiBzdGF0aWMgY29uc3QgY2hhciAqa1NlcnZpY2VOYW1lID0gIm1lZGlhLm1ldHJpY3MiOwogCkBAIC05Niw2ICsxMDQsNyBAQAogTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpNZWRpYUFuYWx5dGljc1NlcnZpY2UoKQogICAgICAgICA6IG1NYXhSZWNvcmRzKGtNYXhSZWNvcmRzKSwKICAgICAgICAgICBtTWF4UmVjb3JkQWdlTnMoa01heFJlY29yZEFnZU5zKSwKKyAgICAgICAgICBtTWF4UmVjb3Jkc0V4cGlyZWRBdE9uY2Uoa01heEV4cGlyZWRBdE9uY2UpLAogICAgICAgICAgIG1EdW1wUHJvdG8oTWVkaWFBbmFseXRpY3NJdGVtOjpQUk9UT19WMSksCiAgICAgICAgICAgbUR1bXBQcm90b0RlZmF1bHQoTWVkaWFBbmFseXRpY3NJdGVtOjpQUk9UT19WMSkgewogCkBAIC00MzIsMjMgKzQ0MSwyOSBAQAogLy8KIC8vIE91ciBDaGVhcCBpbi1jb3JlLCBub24tcGVyc2lzdGVudCByZWNvcmRzIG1hbmFnZW1lbnQuCiAKLS8vIGluc2VydCBhcHByb3ByaWF0ZWx5IGludG8gcXVldWUKLXZvaWQgTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpzYXZlSXRlbShNZWRpYUFuYWx5dGljc0l0ZW0gKiBpdGVtKQorCisvLyB3ZSBob2xkIG1Mb2NrIHdoZW4gd2UgZ2V0IGhlcmUKKy8vIGlmIGl0ZW0gIT0gTlVMTCwgaXQncyB0aGUgaXRlbSB3ZSBqdXN0IGluc2VydGVkCisvLyB0cnVlID09IG1vcmUgaXRlbXMgZWxpZ2libGUgdG8gYmUgcmVjb3ZlcmVkCitib29sIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6ZXhwaXJhdGlvbnNfbChNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0pCiB7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIC8vIG11dGV4IGJldHdlZW4gaW5zZXJ0aW9uIGFuZCBkdW1waW5nIHRoZSBjb250ZW50cwotCi0gICAgLy8gd2Ugd2FudCB0byBkdW1wICdpbiBGSUZPIG9yZGVyJywgc28gaW5zZXJ0IGF0IHRoZSBlbmQKLSAgICBtSXRlbXMucHVzaF9iYWNrKGl0ZW0pOworICAgIGJvb2wgbW9yZSA9IGZhbHNlOworICAgIGludCBoYW5kbGVkID0gMDsKIAogICAgIC8vIGtlZXAgcmVtb3Zpbmcgb2xkIHJlY29yZHMgdGhlIGZyb250IHVudGlsIHdlJ3JlIGluLWJvdW5kcyAoY291bnQpCisgICAgLy8gc2luY2Ugd2UgaW52b2tlIHRoaXMgd2l0aCBlYWNoIGluc2VydGlvbiwgaXQgc2hvdWxkIGJlIDAvMSBpdGVyYXRpb25zLgogICAgIGlmIChtTWF4UmVjb3JkcyA+IDApIHsKICAgICAgICAgd2hpbGUgKG1JdGVtcy5zaXplKCkgPiAoc2l6ZV90KSBtTWF4UmVjb3JkcykgewogICAgICAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICogb2l0ZW0gPSAqKG1JdGVtcy5iZWdpbigpKTsKICAgICAgICAgICAgIGlmIChvaXRlbSA9PSBpdGVtKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGFuZGxlZCA+PSBtTWF4UmVjb3Jkc0V4cGlyZWRBdE9uY2UpIHsKKyAgICAgICAgICAgICAgICAvLyB1bmxpa2VseSBpbiB0aGlzIGxvb3AKKyAgICAgICAgICAgICAgICBtb3JlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhhbmRsZWQrKzsKICAgICAgICAgICAgIG1JdGVtcy5lcmFzZShtSXRlbXMuYmVnaW4oKSk7CiAgICAgICAgICAgICBkZWxldGUgb2l0ZW07CiAgICAgICAgICAgICBtSXRlbXNEaXNjYXJkZWQrKzsKQEAgLTQ1Niw4ICs0NzEsOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8ga2VlcCByZW1vdmluZyBvbGQgcmVjb3JkcyB0aGUgZnJvbnQgdW50aWwgd2UncmUgaW4tYm91bmRzIChjb3VudCkKLSAgICAvLyBOQjogZXhwaXJlZCBlbnRyaWVzIGFyZW4ndCByZW1vdmVkIHVudGlsIHRoZSBuZXh0IGluc2VydGlvbiwgd2hpY2ggY291bGQgYmUgYSB3aGlsZQorICAgIC8vIGtlZXAgcmVtb3Zpbmcgb2xkIHJlY29yZHMgdGhlIGZyb250IHVudGlsIHdlJ3JlIGluLWJvdW5kcyAoYWdlKQorICAgIC8vIGxpbWl0ZWQgdG8gbU1heFJlY29yZHNFeHBpcmVkQXRPbmNlIGl0ZW1zIHBlciBpbnZvY2F0aW9uLgogICAgIGlmIChtTWF4UmVjb3JkQWdlTnMgPiAwKSB7CiAgICAgICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9SRUFMVElNRSk7CiAgICAgICAgIHdoaWxlIChtSXRlbXMuc2l6ZSgpID4gMCkgewpAQCAtNDcxLDE4ICs0ODYsNzIgQEAKICAgICAgICAgICAgICAgICAvLyB0aGlzIChhbmQgdGhlIHJlc3QpIGFyZSByZWNlbnQgZW5vdWdoIHRvIGtlZXAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoYW5kbGVkID49IG1NYXhSZWNvcmRzRXhwaXJlZEF0T25jZSkgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgcmVwcmVzZW50cyAib25lIHRvbyBtYW55IjsgdGVsbCBjYWxsZXIgdGhlcmUgYXJlCisgICAgICAgICAgICAgICAgLy8gbW9yZSB0byBiZSByZWNsYWltZWQuCisgICAgICAgICAgICAgICAgbW9yZSA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoYW5kbGVkKys7CiAgICAgICAgICAgICBtSXRlbXMuZXJhc2UobUl0ZW1zLmJlZ2luKCkpOwogICAgICAgICAgICAgZGVsZXRlIG9pdGVtOwogICAgICAgICAgICAgbUl0ZW1zRGlzY2FyZGVkKys7CiAgICAgICAgICAgICBtSXRlbXNEaXNjYXJkZWRFeHBpcmUrKzsKICAgICAgICAgfQogICAgIH0KKworICAgIC8vIHdlIG9ubHkgaW5kaWNhdGUgd2hldGhlciB0aGVyZSdzIG1vcmUgdG8gY2xlYW47CisgICAgLy8gY2FsbGVyIGNob29zZXMgd2hldGhlciB0byBzY2hlZHVsZSBmdXJ0aGVyIGNsZWFudXAuCisgICAgcmV0dXJuIG1vcmU7Cit9CisKKy8vIHByb2Nlc3MgZXhwaXJhdGlvbnMgaW4gYml0ZSBzaXplZCBjaHVua3MsIGFsbG93aW5nIG5ldyBpbnNlcnRpb25zIHRocm91Z2gKKy8vIHJ1bnMgaW4gYSBwdGhyZWFkIHNwZWNpZmljYWxseSBzdGFydGVkIGZvciB0aGlzICh3aGljaCB0aGVuIGV4aXRzKQorYm9vbCBNZWRpYUFuYWx5dGljc1NlcnZpY2U6OnByb2Nlc3NFeHBpcmF0aW9ucygpCit7CisgICAgYm9vbCBtb3JlOworICAgIGRvIHsKKyAgICAgICAgc2xlZXAoMSk7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgICAgICBtb3JlID0gZXhwaXJhdGlvbnNfbChOVUxMKTsKKyAgICAgICAgICAgIGlmICghbW9yZSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSB3aGlsZSAobW9yZSk7CisgICAgcmV0dXJuIHRydWU7ICAgICAgICAvLyB2YWx1ZSBpcyBmb3Igc3RkOjpmdXR1cmUgdGhyZWFkIHN5bmNocm9uaXphdGlvbgorfQorCisvLyBpbnNlcnQgYXBwcm9wcmlhdGVseSBpbnRvIHF1ZXVlCit2b2lkIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6c2F2ZUl0ZW0oTWVkaWFBbmFseXRpY3NJdGVtICogaXRlbSkKK3sKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgLy8gbXV0ZXggYmV0d2VlbiBpbnNlcnRpb24gYW5kIGR1bXBpbmcgdGhlIGNvbnRlbnRzCisKKyAgICAvLyB3ZSB3YW50IHRvIGR1bXAgJ2luIEZJRk8gb3JkZXInLCBzbyBpbnNlcnQgYXQgdGhlIGVuZAorICAgIG1JdGVtcy5wdXNoX2JhY2soaXRlbSk7CisKKyAgICAvLyBjbGVhbiBvbGQgc3R1ZmYgZnJvbSB0aGUgcXVldWUKKyAgICBib29sIG1vcmUgPSBleHBpcmF0aW9uc19sKGl0ZW0pOworCisgICAgLy8gY29uc2lkZXIgc2NoZWR1bGluZyBzb21lIGFzeW5jaHJvbm91cyBjbGVhbmluZywgaWYgbm90IHJ1bm5pbmcKKyAgICBpZiAobW9yZSkgeworICAgICAgICBpZiAoIW1FeHBpcmVGdXR1cmUudmFsaWQoKQorICAgICAgICAgICAgfHwgbUV4cGlyZUZ1dHVyZS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6c2Vjb25kcygwKSkgPT0gc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSkgeworCisgICAgICAgICAgICBtRXhwaXJlRnV0dXJlID0gc3RkOjphc3luYyhzdGQ6OmxhdW5jaDo6YXN5bmMsIFt0aGlzXSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIHRoaXMtPnByb2Nlc3NFeHBpcmF0aW9ucygpO30pOworICAgICAgICB9CisgICAgfQogfQogCiBzdGF0aWMgc3RkOjpzdHJpbmcgYWxsb3dlZEtleXNbXSA9CiB7CiAgICAgImF1ZGlvcG9saWN5IiwKICAgICAiYXVkaW9yZWNvcmQiLAorICAgICJhdWRpb3RocmVhZCIsCiAgICAgImF1ZGlvdHJhY2siLAogICAgICJjb2RlYyIsCiAgICAgImV4dHJhY3RvciIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5oCmluZGV4IGIzYzkwMmEuLjYzMmM2OTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5oCkBAIC0yNiw2ICsyNiw4IEBACiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KIAorI2luY2x1ZGUgPGZ1dHVyZT4KKwogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUFuYWx5dGljc1NlcnZpY2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNDQsNiArNDYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQW5hbHl0aWNzU2VydmljZSgpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5NZWRpYUFuYWx5dGljc1NlcnZpY2UoKTsKIAorICAgIGJvb2wgcHJvY2Vzc0V4cGlyYXRpb25zKCk7CisKICBwcml2YXRlOgogICAgIE1lZGlhQW5hbHl0aWNzSXRlbTo6U2Vzc2lvbklEX3QgZ2VuZXJhdGVVbmlxdWVTZXNzaW9uSUQoKTsKIApAQCAtNjUsNiArNjksOCBAQAogICAgIGludDMyX3QgbU1heFJlY29yZHM7CiAgICAgLy8gYnkgdGltZSAobm9uZSBvbGRlciB0aGFuIHRoaXMgbG9uZyBhZ2FuCiAgICAgbnNlY3NfdCBtTWF4UmVjb3JkQWdlTnM7CisgICAgLy8gbWF4IHRvIGV4cGlyZSBwZXIgZXhwaXJhdGlvbnNfbCgpIGludm9jYXRpb24KKyAgICBpbnQzMl90IG1NYXhSZWNvcmRzRXhwaXJlZEF0T25jZTsKICAgICAvLwogICAgIC8vICMgb2Ygc2V0cyBvZiBzdW1tYXJpZXMKICAgICBpbnQzMl90IG1NYXhSZWNvcmRTZXRzOwpAQCAtNzksNiArODUsOSBAQAogICAgIExpc3Q8TWVkaWFBbmFseXRpY3NJdGVtICo+IG1JdGVtczsKICAgICB2b2lkIHNhdmVJdGVtKE1lZGlhQW5hbHl0aWNzSXRlbSAqKTsKIAorICAgIGJvb2wgZXhwaXJhdGlvbnNfbChNZWRpYUFuYWx5dGljc0l0ZW0gKik7CisgICAgc3RkOjpmdXR1cmU8Ym9vbD4gbUV4cGlyZUZ1dHVyZTsKKwogICAgIC8vIHN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgb3V0cHV0CiAgICAgaW50IG1EdW1wUHJvdG87CiAgICAgaW50IG1EdW1wUHJvdG9EZWZhdWx0OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLm1rIGIvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLm1rCmluZGV4IGRiNWYwZmYuLjNiNmRjODAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQubWsKQEAgLTYzLDYgKzYzLDYwIEBACiAKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQogCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIHNlcnZpY2UgZXhlY3V0YWJsZQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisjIHNlY2NvbXAgaXMgbm90IHJlcXVpcmVkIGZvciBjb3ZlcmFnZSBidWlsZC4KK2lmbmVxICgkKE5BVElWRV9DT1ZFUkFHRSksdHJ1ZSkKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVNfYXJtIDo9IGNyYXNoX2R1bXAucG9saWN5IG1lZGlhY29kZWMucG9saWN5CitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTX3g4NiA6PSBjcmFzaF9kdW1wLnBvbGljeSBtZWRpYWNvZGVjLnBvbGljeQorZW5kaWYKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgbWFpbl9zd2NvZGVjc2VydmljZS5jcHAgXAorICAgIE1lZGlhQ29kZWNVcGRhdGVTZXJ2aWNlLmNwcCBcCisKK3Nhbml0aXplcl9ydW50aW1lX2xpYnJhcmllcyA6PSAkKGNhbGwgbm9ybWFsaXplLXBhdGgtbGlzdCwkKGFkZHN1ZmZpeCAuc28sXAorICAkKEFERFJFU1NfU0FOSVRJWkVSX1JVTlRJTUVfTElCUkFSWSkgXAorICAkKFVCU0FOX1JVTlRJTUVfTElCUkFSWSkgXAorICAkKFRTQU5fUlVOVElNRV9MSUJSQVJZKSBcCisgICQoMk5EX0FERFJFU1NfU0FOSVRJWkVSX1JVTlRJTUVfTElCUkFSWSkgXAorICAkKDJORF9VQlNBTl9SVU5USU1FX0xJQlJBUlkpIFwKKyAgJCgyTkRfVFNBTl9SVU5USU1FX0xJQlJBUlkpKSkKKworIyAkKGluZm8gU2FuaXRpemVyOiAgJChzYW5pdGl6ZXJfcnVudGltZV9saWJyYXJpZXMpKQorCitsbG5ka19saWJyYXJpZXMgOj0gJChjYWxsIG5vcm1hbGl6ZS1wYXRoLWxpc3QsJChhZGRzdWZmaXggLnNvLFwKKyAgJChMTE5ES19MSUJSQVJJRVMpKSkKKworIyAkKGluZm8gTExOREs6ICAkKGxsbmRrX2xpYnJhcmllcykpCisKK0xPQ0FMX0NGTEFHUyA6PSAtRExJTktFRF9MSUJSQVJJRVM9JyIkKHNhbml0aXplcl9ydW50aW1lX2xpYnJhcmllcyk6JChsbG5ka19saWJyYXJpZXMpIicKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGliYXZzZXJ2aWNlc19taW5pamFpbCBcCisgICAgbGliYmFzZSBcCisgICAgbGliYmluZGVyIFwKKyAgICBsaWJjdXRpbHMgXAorICAgIGxpYmhpZGx0cmFuc3BvcnQgXAorICAgIGxpYmh3YmluZGVyIFwKKyAgICBsaWJsb2cgXAorICAgIGxpYm1lZGlhIFwKKyAgICBsaWJ1dGlscyBcCisgICAgbGliemlwYXJjaGl2ZSBcCisKK0xPQ0FMX01PRFVMRSA6PSBtZWRpYXN3Y29kZWMKK0xPQ0FMX0lOSVRfUkMgOj0gbWVkaWFzd2NvZGVjLnJjCitMT0NBTF8zMl9CSVRfT05MWSA6PSB0cnVlCitMT0NBTF9TQU5JVElaRSA6PSBzY3VkbworCitzYW5pdGl6ZXJfcnVudGltZV9saWJyYXJpZXMgOj0KK2xsbmRrX2xpYnJhcmllcyA6PQorCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwogIyBzZXJ2aWNlIHNlY2NvbXAgcG9saWN5CiBpZmVxICgkKFRBUkdFVF9BUkNIKSwgJChmaWx0ZXIgJChUQVJHRVRfQVJDSCksIHg4NiB4ODZfNjQgYXJtIGFybTY0KSkKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9NZWRpYUNvZGVjVXBkYXRlU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL01lZGlhQ29kZWNVcGRhdGVTZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWU4OTBkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9NZWRpYUNvZGVjVXBkYXRlU2VydmljZS5jcHAKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFDb2RlY1VwZGF0ZVNlcnZpY2UiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxhbmRyb2lkL2RsZXh0Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8bWVkaWEvQ29kZWNTZXJ2aWNlUmVnaXN0cmFudC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHppcGFyY2hpdmUvemlwX2FyY2hpdmUuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCisjaW5jbHVkZSAiTWVkaWFDb2RlY1VwZGF0ZVNlcnZpY2UuaCIKKworLy8gQ29waWVkIGZyb20gR3JhcGhpY3NFbnYuY3BwCisvLyBUT0RPKGIvMzcwNDkzMTkpIEdldCB0aGlzIGZyb20gYSBoZWFkZXIgb25jZSBvbmUgZXhpc3RzCitleHRlcm4gIkMiIHsKKyAgYW5kcm9pZF9uYW1lc3BhY2VfdCogYW5kcm9pZF9jcmVhdGVfbmFtZXNwYWNlKGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBsZF9saWJyYXJ5X3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkZWZhdWx0X2xpYnJhcnlfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwZXJtaXR0ZWRfd2hlbl9pc29sYXRlZF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9uYW1lc3BhY2VfdCogcGFyZW50KTsKKyAgYm9vbCBhbmRyb2lkX2xpbmtfbmFtZXNwYWNlcyhhbmRyb2lkX25hbWVzcGFjZV90KiBmcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfbmFtZXNwYWNlX3QqIHRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHNoYXJlZF9saWJzX3NvbmFtZXMpOworICBlbnVtIHsKKyAgICAgQU5EUk9JRF9OQU1FU1BBQ0VfVFlQRV9JU09MQVRFRCA9IDEsCisgIH07Cit9CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CisKK2JpbmRlcjo6U3RhdHVzIE1lZGlhQ29kZWNVcGRhdGVTZXJ2aWNlOjpsb2FkUGx1Z2lucyhjb25zdCA6OnN0ZDo6c3RyaW5nJiBhcGtQYXRoKSB7CisgICAgQUxPR1YoImxvYWRQbHVnaW5zICVzIiwgYXBrUGF0aC5jX3N0cigpKTsKKworICAgIFppcEFyY2hpdmVIYW5kbGUgemlwSGFuZGxlOworICAgIHZvaWQgKnJlZ2lzdHJhbnRMaWIgPSBOVUxMOworICAgIGludDMyX3QgcmV0ID0gT3BlbkFyY2hpdmUoYXBrUGF0aC5jX3N0cigpLCAmemlwSGFuZGxlKTsKKworICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICBjaGFyIGFiaWxpc3QzMltQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgICAgICBwcm9wZXJ0eV9nZXQoInJvLnByb2R1Y3QuY3B1LmFiaWxpc3QzMiIsIGFiaWxpc3QzMiwgImFybWVhYmktdjdhIik7CisKKyAgICAgICAgYXV0byBhYmlzID0gYmFzZTo6U3BsaXQoYWJpbGlzdDMyLCAiLCIpOworICAgICAgICBpZiAoYWJpcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HVygiYWJpbGlzdCBpcyBlbXB0eSwgdHJ5aW5nIGFybWVhYmktdjdhIC4uLiIpOworICAgICAgICAgICAgYWJpcy5wdXNoX2JhY2soImFybWVhYmktdjdhIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiBPbmx5IHRyeSB0aGUgZmlyc3QgZW50cnkgaW4gYWJpbGlzdDMyIGZvciBub3cuCisgICAgICAgIC8vIFdlIHByb2JhYmx5IHNob3VsZCB0cnkgdGhlIG5leHQgaWYgaXQgZmFpbHMuCisgICAgICAgIFN0cmluZzggbGliUGF0aEluQXBrID0gU3RyaW5nOCgibGliLyIpICsgU3RyaW5nOChhYmlzWzBdLmNfc3RyKCkpOworICAgICAgICBTdHJpbmc4IGRlZmF1bHRMaWJQYXRoID0gU3RyaW5nOChhcGtQYXRoLmNfc3RyKCkpICsgIiEvIiArIGxpYlBhdGhJbkFwazsKKyAgICAgICAgU3RyaW5nOCBsaWJQYXRoID0gZGVmYXVsdExpYlBhdGggKyAiL2xpYm1lZGlhX2NvZGVjc2VydmljZXJlZ2lzdHJhbnQuc28iOworICAgICAgICBTdHJpbmc4IHppcEVudHJ5UGF0aCA9IGxpYlBhdGhJbkFwayArICIvbGlibWVkaWFfY29kZWNzZXJ2aWNlcmVnaXN0cmFudC5zbyI7CisKKyAgICAgICAgWmlwRW50cnkgZW50cnk7CisgICAgICAgIHJldCA9IEZpbmRFbnRyeSh6aXBIYW5kbGUsIFppcFN0cmluZyh6aXBFbnRyeVBhdGgpLCAmZW50cnkpOworCisgICAgICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICAgICAgYW5kcm9pZF9uYW1lc3BhY2VfdCAqY29kZWNOcyA9IGFuZHJvaWRfY3JlYXRlX25hbWVzcGFjZSgiY29kZWNzIiwKKyAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgIC8vIGxkX2xpYnJhcnlfcGF0aAorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0TGliUGF0aC5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICBBTkRST0lEX05BTUVTUEFDRV9UWVBFX0lTT0xBVEVELAorICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAgLy8gcGVybWl0dGVkX3doZW5faXNvbGF0ZWRfcGF0aAorICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsgLy8gcGFyZW50CisKKyAgICAgICAgICAgIGlmIChjb2RlY05zICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmc4IGxpbmtlZF9saWJyYXJpZXMoTElOS0VEX0xJQlJBUklFUyk7CisgICAgICAgICAgICAgICAgaWYgKGFuZHJvaWRfbGlua19uYW1lc3BhY2VzKAorICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNOcywgbnVsbHB0ciwgbGlua2VkX2xpYnJhcmllcy5jX3N0cigpKSkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkX2RsZXh0aW5mbyBkbGV4dGluZm8gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZsYWdzID0gQU5EUk9JRF9ETEVYVF9VU0VfTkFNRVNQQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5saWJyYXJ5X25hbWVzcGFjZSA9IGNvZGVjTnMsCisgICAgICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0cmFudExpYiA9IGFuZHJvaWRfZGxvcGVuX2V4dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJQYXRoLnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTERfTk9XIHwgUlRMRF9MT0NBTCwgJmRsZXh0aW5mbyk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlZ2lzdHJhbnRMaWIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBsb2FkIGxpYiBmcm9tIGFyY2hpdmU6ICVzIiwgZGxlcnJvcigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbGluayBuYW1lc3BhY2UiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIGNvZGVjIG5hbWVzcGFjZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBmaW5kIGVudHJ5IChyZXQ9JWQpIiwgcmV0KTsKKyAgICAgICAgfQorCisgICAgICAgIENsb3NlQXJjaGl2ZSh6aXBIYW5kbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb3BlbiBhcmNoaXZlIChyZXQ9JWQpIiwgcmV0KTsKKyAgICB9CisKKyAgICBpZiAocmVnaXN0cmFudExpYikgeworICAgICAgICBSZWdpc3RlckNvZGVjU2VydmljZXNGdW5jIHJlZ2lzdGVyQ29kZWNTZXJ2aWNlcyA9CisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxSZWdpc3RlckNvZGVjU2VydmljZXNGdW5jPigKKyAgICAgICAgICAgICAgICBkbHN5bShyZWdpc3RyYW50TGliLCAiUmVnaXN0ZXJDb2RlY1NlcnZpY2VzIikpOworICAgICAgICBpZiAocmVnaXN0ZXJDb2RlY1NlcnZpY2VzKSB7CisgICAgICAgICAgICByZWdpc3RlckNvZGVjU2VydmljZXMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiQ2Fubm90IHJlZ2lzdGVyIGNvZGVjIHNlcnZpY2VzICIKKyAgICAgICAgICAgICAgICAgICAgIi0tIGNvcnJ1cHRlZCBsaWJyYXJ5LiI7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgZmluZCBjb2RlYyBzZXJ2aWNlIHJlZ2lzdHJhbnQuIjsKKyAgICB9CisKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK30gICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9NZWRpYUNvZGVjVXBkYXRlU2VydmljZS5oIGIvc2VydmljZXMvbWVkaWFjb2RlYy9NZWRpYUNvZGVjVXBkYXRlU2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiN2NlZTkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL01lZGlhQ29kZWNVcGRhdGVTZXJ2aWNlLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX0NPREVDX1VQREFURV9TRVJWSUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9DT0RFQ19VUERBVEVfU0VSVklDRV9ICisKKyNpbmNsdWRlIDxiaW5kZXIvQmluZGVyU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQm5NZWRpYVVwZGF0ZVNlcnZpY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKKworY2xhc3MgTWVkaWFDb2RlY1VwZGF0ZVNlcnZpY2UKKyAgICA6IHB1YmxpYyBCaW5kZXJTZXJ2aWNlPE1lZGlhQ29kZWNVcGRhdGVTZXJ2aWNlPiwgcHVibGljIEJuTWVkaWFVcGRhdGVTZXJ2aWNlCit7CisgICAgZnJpZW5kIGNsYXNzIEJpbmRlclNlcnZpY2U8TWVkaWFDb2RlY1VwZGF0ZVNlcnZpY2U+OworcHVibGljOgorICAgIE1lZGlhQ29kZWNVcGRhdGVTZXJ2aWNlKCkgOiBCbk1lZGlhVXBkYXRlU2VydmljZSgpIHsgfQorICAgIHZpcnR1YWwgfk1lZGlhQ29kZWNVcGRhdGVTZXJ2aWNlKCkgeyB9CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGdldFNlcnZpY2VOYW1lKCkgeyByZXR1cm4gIm1lZGlhLmNvZGVjLnVwZGF0ZSI7IH0KKyAgICBiaW5kZXI6OlN0YXR1cyBsb2FkUGx1Z2lucyhjb25zdCA6OnN0ZDo6c3RyaW5nJiBhcGtQYXRoKTsKK307CisKK30gICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfQ09ERUNfVVBEQVRFX1NFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9tYWluX2NvZGVjc2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fY29kZWNzZXJ2aWNlLmNwcAppbmRleCA1MTYxOWY2Li42ZDQ3YmU2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fY29kZWNzZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fY29kZWNzZXJ2aWNlLmNwcApAQCAtNDgsMzcgKzQ4LDIxIEBACiAKICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb25maWd1cmVScGNUaHJlYWRwb29sKDY0LCBmYWxzZSk7CiAKLSAgICAvLyBSZWdpc3RyYXRpb24gb2YgY3VzdG9taXplZCBjb2RlYyBzZXJ2aWNlcwotICAgIHZvaWQgKnJlZ2lzdHJhbnRMaWIgPSBkbG9wZW4oCi0gICAgICAgICAgICAibGlibWVkaWFfY29kZWNzZXJ2aWNlcmVnaXN0cmFudC5zbyIsCi0gICAgICAgICAgICBSVExEX05PVyB8IFJUTERfTE9DQUwpOwotICAgIGlmIChyZWdpc3RyYW50TGliKSB7Ci0gICAgICAgIFJlZ2lzdGVyQ29kZWNTZXJ2aWNlc0Z1bmMgcmVnaXN0ZXJDb2RlY1NlcnZpY2VzID0KLSAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFJlZ2lzdGVyQ29kZWNTZXJ2aWNlc0Z1bmM+KAotICAgICAgICAgICAgICAgIGRsc3ltKHJlZ2lzdHJhbnRMaWIsICJSZWdpc3RlckNvZGVjU2VydmljZXMiKSk7Ci0gICAgICAgIGlmIChyZWdpc3RlckNvZGVjU2VydmljZXMpIHsKLSAgICAgICAgICAgIHJlZ2lzdGVyQ29kZWNTZXJ2aWNlcygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJDYW5ub3QgcmVnaXN0ZXIgYWRkaXRpb25hbCBzZXJ2aWNlcyAiCi0gICAgICAgICAgICAgICAgICAgICItLSBjb3JydXB0ZWQgbGlicmFyeS4iOwotICAgICAgICB9CisgICAgLy8gRGVmYXVsdCBjb2RlYyBzZXJ2aWNlcworICAgIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOworICAgIHNwPElPbXhTdG9yZT4gb214U3RvcmUgPSBuZXcgaW1wbGVtZW50YXRpb246Ok9teFN0b3JlKCk7CisgICAgaWYgKG9teFN0b3JlID09IG51bGxwdHIpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IGNyZWF0ZSBJT214U3RvcmUgSEFMIHNlcnZpY2UuIjsKKyAgICB9IGVsc2UgaWYgKG9teFN0b3JlLT5yZWdpc3RlckFzU2VydmljZSgpICE9IE9LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCByZWdpc3RlciBJT214U3RvcmUgSEFMIHNlcnZpY2UuIjsKKyAgICB9CisgICAgc3A8SU9teD4gb214ID0gbmV3IGltcGxlbWVudGF0aW9uOjpPbXgoKTsKKyAgICBpZiAob214ID09IG51bGxwdHIpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IGNyZWF0ZSBJT214IEhBTCBzZXJ2aWNlLiI7CisgICAgfSBlbHNlIGlmIChvbXgtPnJlZ2lzdGVyQXNTZXJ2aWNlKCkgIT0gT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IHJlZ2lzdGVyIElPbXggSEFMIHNlcnZpY2UuIjsKICAgICB9IGVsc2UgewotICAgICAgICAvLyBEZWZhdWx0IGNvZGVjIHNlcnZpY2VzCi0gICAgICAgIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOwotICAgICAgICBzcDxJT214U3RvcmU+IG9teFN0b3JlID0gbmV3IGltcGxlbWVudGF0aW9uOjpPbXhTdG9yZSgpOwotICAgICAgICBpZiAob214U3RvcmUgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IGNyZWF0ZSBJT214U3RvcmUgSEFMIHNlcnZpY2UuIjsKLSAgICAgICAgfSBlbHNlIGlmIChvbXhTdG9yZS0+cmVnaXN0ZXJBc1NlcnZpY2UoKSAhPSBPSykgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IHJlZ2lzdGVyIElPbXhTdG9yZSBIQUwgc2VydmljZS4iOwotICAgICAgICB9Ci0gICAgICAgIHNwPElPbXg+IG9teCA9IG5ldyBpbXBsZW1lbnRhdGlvbjo6T214KCk7Ci0gICAgICAgIGlmIChvbXggPT0gbnVsbHB0cikgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IGNyZWF0ZSBJT214IEhBTCBzZXJ2aWNlLiI7Ci0gICAgICAgIH0gZWxzZSBpZiAob214LT5yZWdpc3RlckFzU2VydmljZSgpICE9IE9LKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgcmVnaXN0ZXIgSU9teCBIQUwgc2VydmljZS4iOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HKElORk8pIDw8ICJJT214IEhBTCBzZXJ2aWNlIGNyZWF0ZWQuIjsKLSAgICAgICAgfQorICAgICAgICBMT0coSU5GTykgPDwgIklPbXggSEFMIHNlcnZpY2UgY3JlYXRlZC4iOwogICAgIH0KIAogICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmpvaW5ScGNUaHJlYWRwb29sKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fc3djb2RlY3NlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFjb2RlYy9tYWluX3N3Y29kZWNzZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWZlYTI1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9tYWluX3N3Y29kZWNzZXJ2aWNlLmNwcApAQCAtMCwwICsxLDgwIEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworLy8gZnJvbSBMT0NBTF9DX0lOQ0xVREVTCisjaW5jbHVkZSAibWluaWphaWwuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgorI2luY2x1ZGUgPG1lZGlhL0NvZGVjU2VydmljZVJlZ2lzdHJhbnQuaD4KKworI2luY2x1ZGUgIk1lZGlhQ29kZWNVcGRhdGVTZXJ2aWNlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisvLyBUT0RPOiByZXBsYWNlIHBvbGljeSB3aXRoIHNvZnR3YXJlIGNvZGVjLW9ubHkgcG9saWNpZXMKKy8vIE11c3QgbWF0Y2ggbG9jYXRpb24gaW4gQW5kcm9pZC5tay4KK3N0YXRpYyBjb25zdCBjaGFyIGtTeXN0ZW1TZWNjb21wUG9saWN5UGF0aFtdID0KKyAgICAgICAgIi9zeXN0ZW0vZXRjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMucG9saWN5IjsKK3N0YXRpYyBjb25zdCBjaGFyIGtWZW5kb3JTZWNjb21wUG9saWN5UGF0aFtdID0KKyAgICAgICAgIi92ZW5kb3IvZXRjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMucG9saWN5IjsKKworLy8gRGlzYWJsZSBTY3VkbydzIG1pc21hdGNoIGFsbG9jYXRpb24gY2hlY2ssIGFzIGl0IGlzIGJlaW5nIHRyaWdnZXJlZAorLy8gYnkgc29tZSB0aGlyZCBwYXJ0eSBjb2RlLgorZXh0ZXJuICJDIiBjb25zdCBjaGFyICpfX3NjdWRvX2RlZmF1bHRfb3B0aW9ucygpIHsKKyAgcmV0dXJuICJEZWFsbG9jYXRpb25UeXBlTWlzbWF0Y2g9ZmFsc2UiOworfQorCitpbnQgbWFpbihpbnQgYXJnYyBfX3VudXNlZCwgY2hhcioqIC8qYXJndiovKQoreworICAgIExPRyhJTkZPKSA8PCAibWVkaWEgc3djb2RlYyBzZXJ2aWNlIHN0YXJ0aW5nIjsKKyAgICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisgICAgU2V0VXBNaW5pamFpbChrU3lzdGVtU2VjY29tcFBvbGljeVBhdGgsIGtWZW5kb3JTZWNjb21wUG9saWN5UGF0aCk7CisKKyAgICBzdGQ6OnN0cmluZyB2YWx1ZSA9IGJhc2U6OkdldFByb3BlcnR5KCJyby5idWlsZC50eXBlIiwgInVua25vd24iKTsKKyAgICBpZiAodmFsdWUgPT0gInVzZXJkZWJ1ZyIgfHwgdmFsdWUgPT0gImVuZyIpIHsKKyAgICAgICAgbWVkaWE6Ok1lZGlhQ29kZWNVcGRhdGVTZXJ2aWNlOjppbnN0YW50aWF0ZSgpOworICAgIH0KKworICAgIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKKworICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2woNjQsIGZhbHNlKTsKKworICAgIC8vIFJlZ2lzdHJhdGlvbiBvZiBjdXN0b21pemVkIGNvZGVjIHNlcnZpY2VzCisgICAgdm9pZCAqcmVnaXN0cmFudExpYiA9IGRsb3BlbigKKyAgICAgICAgICAgICJsaWJtZWRpYV9jb2RlY3NlcnZpY2VyZWdpc3RyYW50LnNvIiwKKyAgICAgICAgICAgIFJUTERfTk9XIHwgUlRMRF9MT0NBTCk7CisgICAgaWYgKHJlZ2lzdHJhbnRMaWIpIHsKKyAgICAgICAgUmVnaXN0ZXJDb2RlY1NlcnZpY2VzRnVuYyByZWdpc3RlckNvZGVjU2VydmljZXMgPQorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UmVnaXN0ZXJDb2RlY1NlcnZpY2VzRnVuYz4oCisgICAgICAgICAgICAgICAgZGxzeW0ocmVnaXN0cmFudExpYiwgIlJlZ2lzdGVyQ29kZWNTZXJ2aWNlcyIpKTsKKyAgICAgICAgaWYgKHJlZ2lzdGVyQ29kZWNTZXJ2aWNlcykgeworICAgICAgICAgICAgcmVnaXN0ZXJDb2RlY1NlcnZpY2VzKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkNhbm5vdCByZWdpc3RlciBjb2RlYyBzZXJ2aWNlcyAiCisgICAgICAgICAgICAgICAgICAgICItLSBjb3JydXB0ZWQgbGlicmFyeS4iOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IGZpbmQgY29kZWMgc2VydmljZSByZWdpc3RyYW50LiI7CisgICAgfQorCisgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6am9pblJwY1RocmVhZHBvb2woKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvbWVkaWFzd2NvZGVjLnJjIGIvc2VydmljZXMvbWVkaWFjb2RlYy9tZWRpYXN3Y29kZWMucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZlMzM4MQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvbWVkaWFzd2NvZGVjLnJjCkBAIC0wLDAgKzEsNiBAQAorc2VydmljZSBtZWRpYS5zd2NvZGVjIC9zeXN0ZW0vYmluL21lZGlhc3djb2RlYworICAgIGNsYXNzIG1haW4KKyAgICB1c2VyIG1lZGlhY29kZWMKKyAgICBncm91cCBjYW1lcmEgZHJtcnBjIG1lZGlhZHJtCisgICAgaW9wcmlvIHJ0IDQKKyAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNDBhZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvQW5kcm9pZC5icApAQCAtMCwwICsxLDU1IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYm1lZGlhX2NvZGVjc2VydmljZXJlZ2lzdHJhbnQiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgc3JjczogWworICAgICAgICAiQ29kZWNTZXJ2aWNlUmVnaXN0cmFudC5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMCIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmNvZGVjMl9oaWRsQDEuMCIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIC8vIENvZGVjcworICAgIHJ1bnRpbWVfbGliczogWworICAgICAgICAibGliY29kZWMyX3NvZnRfYXZjZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2F2Y2VuYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9hYWNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfYWFjZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2Ftcm5iZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2Ftcm5iZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2FtcndiZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2FtcndiZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2hldmNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfZzcxMWFsYXdkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfZzcxMW1sYXdkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfbXBlZzJkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfaDI2M2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9oMjYzZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X21wZWc0ZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X21wZWc0ZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X21wM2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF92b3JiaXNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfb3B1c2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF92cDhkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfdnA5ZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2F2MWRlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF92cDhlbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfdnA5ZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Jhd2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9mbGFjZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2ZsYWNlbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfZ3NtZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3hhYWNkZWMiLAorICAgIF0sCisKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAorfQorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvQ29kZWNTZXJ2aWNlUmVnaXN0cmFudC5jcHAgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvQ29kZWNTZXJ2aWNlUmVnaXN0cmFudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2ZWJlZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9Db2RlY1NlcnZpY2VSZWdpc3RyYW50LmNwcApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjU2VydmljZVJlZ2lzdHJhbnQiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9Db2RlY1NlcnZpY2VSZWdpc3RyYW50Lmg+CisKK2V4dGVybiAiQyIgdm9pZCBSZWdpc3RlckNvZGVjU2VydmljZXMoKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDsKKyAgICBMT0coSU5GTykgPDwgIkNyZWF0aW5nIHNvZnR3YXJlIENvZGVjMiBzZXJ2aWNlLi4uIjsKKyAgICBhbmRyb2lkOjpzcDxJQ29tcG9uZW50U3RvcmU+IHN0b3JlID0KKyAgICAgICAgbmV3IHV0aWxzOjpDb21wb25lbnRTdG9yZSgKKyAgICAgICAgICAgICAgICBhbmRyb2lkOjpHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCkpOworICAgIGlmIChzdG9yZSA9PSBudWxscHRyKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwKKyAgICAgICAgICAgICAgICAiQ2Fubm90IGNyZWF0ZSBzb2Z0d2FyZSBDb2RlYzIgc2VydmljZS4iOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzdG9yZS0+cmVnaXN0ZXJBc1NlcnZpY2UoInNvZnR3YXJlIikgIT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwKKyAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCByZWdpc3RlciBzb2Z0d2FyZSBDb2RlYzIgc2VydmljZS4iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HKElORk8pIDw8CisgICAgICAgICAgICAgICAgICAgICJTb2Z0d2FyZSBDb2RlYzIgc2VydmljZSBjcmVhdGVkLiI7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy1hcm0ucG9saWN5IGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLWFybS5wb2xpY3kKaW5kZXggNmVjODg5NS4uZWRmNGRhYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLWFybS5wb2xpY3kKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLWFybS5wb2xpY3kKQEAgLTU1LDQgKzU1LDggQEAKIGdldGRlbnRzNjQ6IDEKIGdldHJhbmRvbTogMQogCisjIFVzZWQgYnkgVUJTYW4gZGlhZ25vc3RpYyBtZXNzYWdlcworcmVhZGxpbms6IDEKK29wZW46IDEKKwogQGluY2x1ZGUgL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC5hcm0ucG9saWN5CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMteDg2LnBvbGljeSBiL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy14ODYucG9saWN5CmluZGV4IDgyMWU2OWYuLjk2NmUyMTQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy14ODYucG9saWN5CisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy14ODYucG9saWN5CkBAIC0yNCw2ICsyNCw3IEBACiBtbWFwMjogMQogZnN0YXQ2NDogMQogc3RhdDY0OiAxCitzdGF0ZnM2NDogMQogbWFkdmlzZTogMQogZnN0YXRhdDY0OiAxCiBmdXRleDogMQpAQCAtNTcsNCArNTgsOCBAQAogZ2V0cGlkOiAxCiBnZXR0aWQ6IDEKIAorIyBVc2VkIGJ5IFVCU2FuIGRpYWdub3N0aWMgbWVzc2FnZXMKK3JlYWRsaW5rOiAxCitvcGVuOiAxCisKIEBpbmNsdWRlIC9zeXN0ZW0vZXRjL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAueDg2LnBvbGljeQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFkcm0vQW5kcm9pZC5tayBiL3NlcnZpY2VzL21lZGlhZHJtL0FuZHJvaWQubWsKaW5kZXggZTg3MDk2NS4uMjI3YTI5ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFkcm0vQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9tZWRpYWRybS9BbmRyb2lkLm1rCkBAIC0yOSw3ICsyOSw4IEBACiAgICAgbGliaGlkbG1lbW9yeSBcCiAgICAgbGliaGlkbHRyYW5zcG9ydCBcCiAgICAgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEKKyAgICBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEgXAorICAgIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMgogCiBMT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdleHRyYSAtV2Vycm9yCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9BbmRyb2lkLm1rCmluZGV4IDUzNDI4OTguLjYxMDFjOGEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvQW5kcm9pZC5tawpAQCAtOSw2ICs5LDI0IEBACiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlibWVkaWEgbGlic3RhZ2VmcmlnaHQgbGliYmluZGVyIGxpYnV0aWxzIGxpYmxvZwogTE9DQUxfTU9EVUxFOj0gbGlibWVkaWFleHRyYWN0b3JzZXJ2aWNlCisKK3Nhbml0aXplcl9ydW50aW1lX2xpYnJhcmllcyA6PSAkKGNhbGwgbm9ybWFsaXplLXBhdGgtbGlzdCwkKGFkZHN1ZmZpeCAuc28sXAorICAkKEFERFJFU1NfU0FOSVRJWkVSX1JVTlRJTUVfTElCUkFSWSkgXAorICAkKFVCU0FOX1JVTlRJTUVfTElCUkFSWSkgXAorICAkKFRTQU5fUlVOVElNRV9MSUJSQVJZKSkpCisKKyMgJChpbmZvIFNhbml0aXplcjogICQoc2FuaXRpemVyX3J1bnRpbWVfbGlicmFyaWVzKSkKKworbmRrX2xpYnJhcmllcyA6PSAkKGNhbGwgbm9ybWFsaXplLXBhdGgtbGlzdCwkKGFkZHByZWZpeCBsaWIsJChhZGRzdWZmaXggLnNvLFwKKyAgJChOREtfUFJFQlVJTFRfU0hBUkVEX0xJQlJBUklFUykpKSkKKworIyAkKGluZm8gTkRLOiAgJChuZGtfbGlicmFyaWVzKSkKKworTE9DQUxfQ0ZMQUdTICs9IC1ETElOS0VEX0xJQlJBUklFUz0nIiQoc2FuaXRpemVyX3J1bnRpbWVfbGlicmFyaWVzKTokKG5ka19saWJyYXJpZXMpIicKKworc2FuaXRpemVyX3J1bnRpbWVfbGlicmFyaWVzIDo9CituZGtfbGlicmFyaWVzIDo9CisKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKIAogCkBAIC0xOCwxOSArMzYsNyBAQAogTE9DQUxfUkVRVUlSRURfTU9EVUxFU19hcm0gOj0gY3Jhc2hfZHVtcC5wb2xpY3kgbWVkaWFleHRyYWN0b3IucG9saWN5CiBMT0NBTF9SRVFVSVJFRF9NT0RVTEVTX2FybTY0IDo9IGNyYXNoX2R1bXAucG9saWN5IG1lZGlhZXh0cmFjdG9yLnBvbGljeQogTE9DQUxfUkVRVUlSRURfTU9EVUxFU194ODYgOj0gY3Jhc2hfZHVtcC5wb2xpY3kgbWVkaWFleHRyYWN0b3IucG9saWN5Ci0KLSMgZXh0cmFjdG9yIGxpYnJhcmllcwotTE9DQUxfUkVRVUlSRURfTU9EVUxFUyArPSBcCi0gICAgbGliYWFjZXh0cmFjdG9yIFwKLSAgICBsaWJhbXJleHRyYWN0b3IgXAotICAgIGxpYmZsYWNleHRyYWN0b3IgXAotICAgIGxpYm1pZGlleHRyYWN0b3IgXAotICAgIGxpYm1rdmV4dHJhY3RvciBcCi0gICAgbGlibXAzZXh0cmFjdG9yIFwKLSAgICBsaWJtcDRleHRyYWN0b3IgXAotICAgIGxpYm1wZWcyZXh0cmFjdG9yIFwKLSAgICBsaWJvZ2dleHRyYWN0b3IgXAotICAgIGxpYndhdmV4dHJhY3RvciBcCitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTX3g4Nl82NCA6PSBjcmFzaF9kdW1wLnBvbGljeSBtZWRpYWV4dHJhY3Rvci5wb2xpY3kKIAogTE9DQUxfU1JDX0ZJTEVTIDo9IG1haW5fZXh0cmFjdG9yc2VydmljZS5jcHAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlibWVkaWEgbGlibWVkaWFleHRyYWN0b3JzZXJ2aWNlIGxpYmJpbmRlciBsaWJ1dGlscyBcCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcAppbmRleCBmMGY0NGY1Li4wNjY1OTMwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2VGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KQEAgLTMwLDYgKzI5LDExIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorTWVkaWFFeHRyYWN0b3JTZXJ2aWNlOjpNZWRpYUV4dHJhY3RvclNlcnZpY2UoKQorICAgICAgICA6IEJuTWVkaWFFeHRyYWN0b3JTZXJ2aWNlKCkgeworICAgIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6U2V0TGlua2VkTGlicmFyaWVzKHN0ZDo6c3RyaW5nKExJTktFRF9MSUJSQVJJRVMpKTsKK30KKwogc3A8SU1lZGlhRXh0cmFjdG9yPiBNZWRpYUV4dHJhY3RvclNlcnZpY2U6Om1ha2VFeHRyYWN0b3IoCiAgICAgICAgIGNvbnN0IHNwPElEYXRhU291cmNlPiAmcmVtb3RlU291cmNlLCBjb25zdCBjaGFyICptaW1lKSB7CiAgICAgQUxPR1YoIkBAQCBNZWRpYUV4dHJhY3RvclNlcnZpY2U6Om1ha2VFeHRyYWN0b3IgZm9yICVzIiwgbWltZSk7CkBAIC01NSw2ICs1OSwxMCBAQAogICAgIHJldHVybiBDcmVhdGVJRGF0YVNvdXJjZUZyb21EYXRhU291cmNlKHNvdXJjZSk7CiB9CiAKK3N0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gTWVkaWFFeHRyYWN0b3JTZXJ2aWNlOjpnZXRTdXBwb3J0ZWRUeXBlcygpIHsKKyAgICByZXR1cm4gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpnZXRTdXBwb3J0ZWRUeXBlcygpOworfQorCiBzdGF0dXNfdCBNZWRpYUV4dHJhY3RvclNlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7CiAgICAgcmV0dXJuIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6ZHVtcChmZCwgYXJncykgfHwgZHVtcEV4dHJhY3RvcnMoZmQsIGFyZ3MpOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmggYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuaAppbmRleCA5ZGYzZWNkLi5jOWNlYmNmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuaApAQCAtMjcsNyArMjcsNyBAQAogewogICAgIGZyaWVuZCBjbGFzcyBCaW5kZXJTZXJ2aWNlPE1lZGlhRXh0cmFjdG9yU2VydmljZT47ICAgIC8vIGZvciBNZWRpYUV4dHJhY3RvclNlcnZpY2UoKQogcHVibGljOgotICAgIE1lZGlhRXh0cmFjdG9yU2VydmljZSgpIDogQm5NZWRpYUV4dHJhY3RvclNlcnZpY2UoKSB7IH0KKyAgICBNZWRpYUV4dHJhY3RvclNlcnZpY2UoKTsKICAgICB2aXJ0dWFsIH5NZWRpYUV4dHJhY3RvclNlcnZpY2UoKSB7IH0KICAgICB2aXJ0dWFsIHZvaWQgb25GaXJzdFJlZigpIHsgfQogCkBAIC0zNyw2ICszNyw4IEBACiAKICAgICB2aXJ0dWFsIHNwPElEYXRhU291cmNlPiBtYWtlSURhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogCisgICAgdmlydHVhbCBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IGdldFN1cHBvcnRlZFR5cGVzKCk7CisKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5oCmluZGV4IDQxMTVmNmQuLmVhMzRjOWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5oCkBAIC0xOCwxNyArMTgsMTcgQEAKICNkZWZpbmUgQU5EUk9JRF9NRURJQV9FWFRSQUNUT1JfVVBEQVRFX1NFUlZJQ0VfSAogCiAjaW5jbHVkZSA8YmluZGVyL0JpbmRlclNlcnZpY2UuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0JuTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9Cbk1lZGlhVXBkYXRlU2VydmljZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgbWVkaWEgewogCiBjbGFzcyBNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UKLSAgICA6IHB1YmxpYyBCaW5kZXJTZXJ2aWNlPE1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZT4sIHB1YmxpYyBCbk1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZQorICAgIDogcHVibGljIEJpbmRlclNlcnZpY2U8TWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlPiwgcHVibGljIEJuTWVkaWFVcGRhdGVTZXJ2aWNlCiB7CiAgICAgZnJpZW5kIGNsYXNzIEJpbmRlclNlcnZpY2U8TWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlPjsKIHB1YmxpYzoKLSAgICBNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UoKSA6IEJuTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlKCkgeyB9CisgICAgTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlKCkgOiBCbk1lZGlhVXBkYXRlU2VydmljZSgpIHsgfQogICAgIHZpcnR1YWwgfk1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZSgpIHsgfQogICAgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXRTZXJ2aWNlTmFtZSgpIHsgcmV0dXJuICJtZWRpYS5leHRyYWN0b3IudXBkYXRlIjsgfQogICAgIGJpbmRlcjo6U3RhdHVzIGxvYWRQbHVnaW5zKGNvbnN0IDo6c3RkOjpzdHJpbmcmIGFwa1BhdGgpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3Ivc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3IteDg2XzY0LnBvbGljeSBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLXg4Nl82NC5wb2xpY3kKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA2M2M3NzgwLi4zNWFjNDU4Ci0tLSBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLXg4Nl82NC5wb2xpY3kKKysrIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3Ivc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3IteDg2XzY0LnBvbGljeQpAQCAtMjEsNiArMjEsOCBAQAogZ2V0dWlkOiAxCiBzZXRwcmlvcml0eTogMQogc2lnYWx0c3RhY2s6IDEKK2ZzdGF0OiAxCitmc3RhdGZzOiAxCiBuZXdmc3RhdGF0OiAxCiByZXN0YXJ0X3N5c2NhbGw6IDEKIGV4aXQ6IDEKQEAgLTMwLDI4ICszMiwyMSBAQAogc2NoZWRfc2V0c2NoZWR1bGVyOiAxCiBnZXRybGltaXQ6IDEKIG5hbm9zbGVlcDogMQorZ2V0cmFuZG9tOiAxCisKKyMgZm9yIGR5bmFtaWNhbGx5IGxvYWRpbmcgZXh0cmFjdG9ycworZ2V0ZGVudHM2NDogMQorcmVhZGxpbmthdDogMQorcHJlYWQ2NDogMQorbXJlbWFwOiAxCiAKICMgZm9yIEZpbGVTb3VyY2UKIHJlYWRsaW5rYXQ6IDEKIAotIyBmb3IgYXR0YWNoaW5nIHRvIGRlYnVnZ2VyZCBvbiBwcm9jZXNzIGNyYXNoCi10Z2tpbGw6IDEKLXNvY2tldDogYXJnMCA9PSAxCi1jb25uZWN0OiAxCi1mY250bDogMQotcnRfc2lncHJvY21hc2s6IDEKLXJ0X3NpZ2FjdGlvbjogMQotcnRfdGdzaWdxdWV1ZWluZm86IDEKLWdldGV1aWQ6IDEKLWdldGdpZDogMQotZ2V0ZWdpZDogMQotZ2V0Z3JvdXBzOiAxCi1nZXRkZW50czY0OiAxCi1waXBlMjogMQotcHBvbGw6IDEKLQogIyBSZXF1aXJlZCBieSBBZGRyZXNzU2FuaXRpemVyCiBnZXR0aWQ6IDEKIHNjaGVkX3lpZWxkOiAxCiBnZXRwaWQ6IDEKIGdldHRpZDogMQorCitAaW5jbHVkZSAvc3lzdGVtL2V0Yy9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLng4Nl82NC5wb2xpY3kKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLmJwCmluZGV4IDI5ZTZkZmMuLmJlZTVkMjUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5icApAQCAtMTAsNyArMTAsNyBAQAogICAgICAgICAibGliYXVkaW91dGlscyIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm5iYWlvIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAogICAgICAgICAibGlibmJsb2ciLAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmNwcAppbmRleCAxYmU1NTQ0Li45MDJhZjY2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5jcHAKQEAgLTIwLDggKzIwLDkgQEAKICNpbmNsdWRlIDxzeXMvbW1hbi5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPGJpbmRlci9QZXJtaXNzaW9uQ2FjaGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9NZXJnZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmxvZy9OQkxvZy5oPgotI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgIk1lZGlhTG9nU2VydmljZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC01MywyNyArNTQsMjggQEAKIAogdm9pZCBNZWRpYUxvZ1NlcnZpY2U6OnJlZ2lzdGVyV3JpdGVyKGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWQsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpuYW1lKQogewotICAgIGlmIChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkgIT0gQUlEX0FVRElPU0VSVkVSIHx8IHNoYXJlZCA9PSAwIHx8CisgICAgaWYgKCFpc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpIHx8IHNoYXJlZCA9PSAwIHx8CiAgICAgICAgICAgICBzaXplIDwga01pblNpemUgfHwgc2l6ZSA+IGtNYXhTaXplIHx8IG5hbWUgPT0gTlVMTCB8fAogICAgICAgICAgICAgc2hhcmVkLT5zaXplKCkgPCBOQkxvZzo6VGltZWxpbmU6OnNoYXJlZFNpemUoc2l6ZSkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBzcDxOQkxvZzo6UmVhZGVyPiByZWFkZXIobmV3IE5CTG9nOjpSZWFkZXIoc2hhcmVkLCBzaXplKSk7Ci0gICAgTkJMb2c6Ok5hbWVkUmVhZGVyIG5hbWVkUmVhZGVyKHJlYWRlciwgbmFtZSk7CisgICAgc3A8TkJMb2c6OlJlYWRlcj4gcmVhZGVyKG5ldyBOQkxvZzo6UmVhZGVyKHNoYXJlZCwgc2l6ZSwgbmFtZSkpOyAvLyBSZWFkZXIgaGFuZGxlZCBieSBtZXJnZXIKKyAgICBzcDxOQkxvZzo6RHVtcFJlYWRlcj4gZHVtcFJlYWRlcihuZXcgTkJMb2c6OkR1bXBSZWFkZXIoc2hhcmVkLCBzaXplLCBuYW1lKSk7IC8vIGZvciBkdW1wc3lzCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtTmFtZWRSZWFkZXJzLmFkZChuYW1lZFJlYWRlcik7Ci0gICAgbU1lcmdlci5hZGRSZWFkZXIobmFtZWRSZWFkZXIpOworICAgIG1EdW1wUmVhZGVycy5hZGQoZHVtcFJlYWRlcik7CisgICAgbU1lcmdlci5hZGRSZWFkZXIocmVhZGVyKTsKIH0KIAogdm9pZCBNZWRpYUxvZ1NlcnZpY2U6OnVucmVnaXN0ZXJXcml0ZXIoY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZCkKIHsKLSAgICBpZiAoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpICE9IEFJRF9BVURJT1NFUlZFUiB8fCBzaGFyZWQgPT0gMCkgeworICAgIGlmICghaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSB8fCBzaGFyZWQgPT0gMCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTmFtZWRSZWFkZXJzLnNpemUoKTsgKSB7Ci0gICAgICAgIGlmIChtTmFtZWRSZWFkZXJzW2ldLnJlYWRlcigpLT5pc0lNZW1vcnkoc2hhcmVkKSkgewotICAgICAgICAgICAgbU5hbWVkUmVhZGVycy5yZW1vdmVBdChpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1EdW1wUmVhZGVycy5zaXplKCk7ICkgeworICAgICAgICBpZiAobUR1bXBSZWFkZXJzW2ldLT5pc0lNZW1vcnkoc2hhcmVkKSkgeworICAgICAgICAgICAgbUR1bXBSZWFkZXJzLnJlbW92ZUF0KGkpOworICAgICAgICAgICAgLy8gVE9ETyBtTWVyZ2VyLnJlbW92ZVJlYWRlcnMoc2hhcmVkKQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaSsrOwogICAgICAgICB9CkBAIC05NSwxMCArOTcsOCBAQAogCiBzdGF0dXNfdCBNZWRpYUxvZ1NlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewotICAgIC8vIEZJWE1FIG1lcmdlIHdpdGggc2ltaWxhciBidXQgbm90IGlkZW50aWNhbCBjb2RlIGF0IHNlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmNwcAotICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzRHVtcCgiYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKTsKLSAgICBpZiAoIShJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkgPT0gQUlEX0FVRElPU0VSVkVSIHx8Ci0gICAgICAgICAgICBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc0R1bXApKSkgeworICAgIGlmICghKGlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkKKyAgICAgICAgICAgIHx8IGR1bXBBbGxvd2VkKCkpKSB7CiAgICAgICAgIGRwcmludGYoZmQsICJQZXJtaXNzaW9uIERlbmlhbDogY2FuJ3QgZHVtcCBtZWRpYS5sb2cgZnJvbSBwaWQ9JWQsIHVpZD0lZFxuIiwKICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCiAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKQEAgLTEwOCw3ICsxMDgsNyBAQAogICAgIGlmIChhcmdzLnNpemUoKSA+IDApIHsKICAgICAgICAgY29uc3QgU3RyaW5nOCBhcmcwKGFyZ3NbMF0pOwogICAgICAgICBpZiAoIXN0cmNtcChhcmcwLnN0cmluZygpLCAiLXIiKSkgewotICAgICAgICAgICAgLy8gbmVlZGVkIGJlY2F1c2UgbU5hbWVkUmVhZGVycyBpcyBwcm90ZWN0ZWQgYnkgbUxvY2sKKyAgICAgICAgICAgIC8vIG5lZWRlZCBiZWNhdXNlIG1SZWFkZXJzIGlzIHByb3RlY3RlZCBieSBtTG9jawogICAgICAgICAgICAgYm9vbCBsb2NrZWQgPSBkdW1wVHJ5TG9jayhtTG9jayk7CiAKICAgICAgICAgICAgIC8vIGZhaWxlZCB0byBsb2NrIC0gTWVkaWFMb2dTZXJ2aWNlIGlzIHByb2JhYmx5IGRlYWRsb2NrZWQKQEAgLTExOSwyMSArMTE5LDIyIEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiIsIHJlc3VsdC5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFRPRE8gc2hvdWxkIHdlIGluc3RlYWQgcHJvY2VlZCB0byBtTWVyZ2VSZWFkZXIuZHVtcD8gZG9lcyBpdCBuZWVkIGxvY2s/CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIG5hbWVkUmVhZGVyIDogbU5hbWVkUmVhZGVycykgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZkdW1wUmVhZGVyIDogbUR1bXBSZWFkZXJzKSB7CiAgICAgICAgICAgICAgICAgaWYgKGZkID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZHByaW50ZihmZCwgIlxuJXM6XG4iLCBuYW1lZFJlYWRlci5uYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAiXG4lczpcbiIsIGR1bXBSZWFkZXItPm5hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgZHVtcFJlYWRlci0+ZHVtcChmZCwgMCAvKmluZGVudCovKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HSSgiJXM6IiwgbmFtZWRSZWFkZXIubmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koIiVzOiIsIGR1bXBSZWFkZXItPm5hbWUoKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1NZXJnZVJlYWRlci5kdW1wKGZkLCBhcmdzKTsKICAgICAgICAgfQogICAgIH0KLSAgICBtTWVyZ2VSZWFkZXIuZHVtcChmZCk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5oCmluZGV4IGM5NDVkMWYuLjIxZGY4OTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5oCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxiaW5kZXIvQmluZGVyU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUxvZ1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9NZXJnZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmxvZy9OQkxvZy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC01NSw3ICs1Niw3IEBACiAKICAgICBNdXRleCAgICAgICAgICAgICAgIG1Mb2NrOwogCi0gICAgVmVjdG9yPE5CTG9nOjpOYW1lZFJlYWRlcj4gbU5hbWVkUmVhZGVyczsgICAvLyBwcm90ZWN0ZWQgYnkgbUxvY2sKKyAgICBWZWN0b3I8c3A8TkJMb2c6OkR1bXBSZWFkZXI+PiBtRHVtcFJlYWRlcnM7ICAgLy8gcHJvdGVjdGVkIGJ5IG1Mb2NrCiAKICAgICAvLyBGSVhNRSBOZWVkIGNvbW1lbnRzIG9uIGFsbCBvZiB0aGVzZSwgZXNwZWNpYWxseSBhYm91dCBsb2NraW5nCiAgICAgTkJMb2c6OlNoYXJlZCAqbU1lcmdlclNoYXJlZDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuY3BwCmluZGV4IGUwZGIyNjEuLmExZmMwZWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmNwcApAQCAtMTQwLDkgKzE0MCw4IEBACiB9CiAKIHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpvcGVuRW5kcG9pbnQoQUF1ZGlvU2VydmljZSAmYXVkaW9TZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUpIHsKLSAgICBpZiAoc2hhcmluZ01vZGUgPT0gQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpIHsKKyAgICBpZiAocmVxdWVzdC5nZXRDb25zdGFudENvbmZpZ3VyYXRpb24oKS5nZXRTaGFyaW5nTW9kZSgpID09IEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFKSB7CiAgICAgICAgIHJldHVybiBvcGVuRXhjbHVzaXZlRW5kcG9pbnQoYXVkaW9TZXJ2aWNlLCByZXF1ZXN0KTsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gb3BlblNoYXJlZEVuZHBvaW50KGF1ZGlvU2VydmljZSwgcmVxdWVzdCk7CkBAIC0xNzMsNyArMTcyLDcgQEAKIAogICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gZW5kcG9pbnQtPm9wZW4ocmVxdWVzdCk7CiAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICBBTE9HRSgib3BlbkV4Y2x1c2l2ZUVuZHBvaW50KCksIG9wZW4gZmFpbGVkIik7CisgICAgICAgICAgICBBTE9HVigib3BlbkV4Y2x1c2l2ZUVuZHBvaW50KCksIG9wZW4gZmFpbGVkIik7CiAgICAgICAgICAgICBlbmRwb2ludC5jbGVhcigpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbUV4Y2x1c2l2ZVN0cmVhbXMucHVzaF9iYWNrKGVuZHBvaW50TU1hcCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5oCmluZGV4IDE5M2JkZWUuLmJhMTc4NTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5oCkBAIC01Niw4ICs1Niw3IEBACiAgICAgICogQHJldHVybiBlbmRwb2ludCBvciBudWxsCiAgICAgICovCiAgICAgYW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBvcGVuRW5kcG9pbnQoYW5kcm9pZDo6QUF1ZGlvU2VydmljZSAmYXVkaW9TZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCk7CiAKICAgICB2b2lkIGNsb3NlRW5kcG9pbnQoYW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBzZXJ2aWNlRW5kcG9pbnQpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9NaXhlci5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9NaXhlci5jcHAKaW5kZXggYjAzMTg4OC4uMWMwM2I3ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvTWl4ZXIuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb01peGVyLmNwcApAQCAtOTksNyArOTksNyBAQAogICAgICAgICB9CiAgICAgICAgIHBhcnRJbmRleCsrOwogICAgIH0KLSAgICBmaWZvLT5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+YWR2YW5jZVJlYWRJbmRleChmcmFtZXNEZXNpcmVkKTsKKyAgICBmaWZvLT5hZHZhbmNlUmVhZEluZGV4KGZyYW1lc0Rlc2lyZWQpOwogCiAjaWYgQUFVRElPX01JWEVSX0FUUkFDRV9FTkFCTEVECiAgICAgQVRSQUNFX0VORCgpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmNwcAppbmRleCAwMTgyYTI3Li4yZmJhZWI0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmNwcApAQCAtMjQsNiArMjQsNyBAQAogCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogCiAjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TZXJ2aWNlTWVzc2FnZS5oIgpAQCAtMzMsNyArMzQsNiBAQAogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5oIgogI2luY2x1ZGUgImJpbmRpbmcvSUFBdWRpb1NlcnZpY2UuaCIKLSNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKQEAgLTExOCwxNyArMTE4LDIxIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBpZiBTSEFSRUQgcmVxdWVzdGVkIG9yIGlmIEVYQ0xVU0lWRSBmYWlsZWQKLSAgICBpZiAoc2hhcmluZ01vZGUgPT0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQKLSAgICAgICAgIHx8IChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIgJiYgIXNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCkpIHsKKyAgICAvLyBUcnkgU0hBUkVEIGlmIFNIQVJFRCByZXF1ZXN0ZWQgb3IgaWYgRVhDTFVTSVZFIGZhaWxlZC4KKyAgICBpZiAoc2hhcmluZ01vZGUgPT0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQpIHsKICAgICAgICAgc2VydmljZVN0cmVhbSA9ICBuZXcgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZCgqdGhpcyk7CiAgICAgICAgIHJlc3VsdCA9IHNlcnZpY2VTdHJlYW0tPm9wZW4ocmVxdWVzdCk7CisgICAgfSBlbHNlIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIgJiYgIXNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCkgeworICAgICAgICBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgbW9kaWZpZWRSZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICAgICAgLy8gT3ZlcndyaXRlIHRoZSBvcmlnaW5hbCBFWENMVVNJVkUgbW9kZSB3aXRoIFNIQVJFRC4KKyAgICAgICAgbW9kaWZpZWRSZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRTaGFyaW5nTW9kZShBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCk7CisgICAgICAgIHNlcnZpY2VTdHJlYW0gPSAgbmV3IEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQoKnRoaXMpOworICAgICAgICByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5vcGVuKG1vZGlmaWVkUmVxdWVzdCk7CiAgICAgfQogCiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgc2VydmljZVN0cmVhbS5jbGVhcigpOwotICAgICAgICBBTE9HRSgib3BlblN0cmVhbSgpOiBmYWlsZWQsIHJldHVybiAlZCA9ICVzIiwKLSAgICAgICAgICAgICAgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICAgICAgQUxPR1coIm9wZW5TdHJlYW0oKTogZmFpbGVkLCByZXR1cm4gJWQgPSAlcyIsIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfSBlbHNlIHsKICAgICAgICAgYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSA9IG1TdHJlYW1UcmFja2VyLmFkZFN0cmVhbUZvckhhbmRsZShzZXJ2aWNlU3RyZWFtLmdldCgpKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuY3BwCmluZGV4IDY5MDY4ZjUuLjRkZmI2MmEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmNwcApAQCAtMzgsMTAgKzM4LDYgQEAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOyAgLy8gVE9ETyBqdXN0IGltcG9ydCBuYW1lcyBuZWVkZWQKIHVzaW5nIG5hbWVzcGFjZSBhYXVkaW87ICAgLy8gVE9ETyBqdXN0IGltcG9ydCBuYW1lcyBuZWVkZWQKIAotQUF1ZGlvU2VydmljZUVuZHBvaW50Ojp+QUF1ZGlvU2VydmljZUVuZHBvaW50KCkgewotICAgIEFMT0dEKCIlcyglcCkgZGVzdHJveWVkIiwgX19mdW5jX18sIHRoaXMpOwotfQotCiBzdGQ6OnN0cmluZyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6OmR1bXAoKSBjb25zdCB7CiAgICAgc3RkOjpzdHJpbmdzdHJlYW0gcmVzdWx0OwogCkBAIC01OSw2ICs1NSw3IEBACiAgICAgcmVzdWx0IDw8ICIgICAgRGV2aWNlIElkOiAgICAgICAgICAgICIgPDwgZ2V0RGV2aWNlSWQoKSA8PCAiXG4iOwogICAgIHJlc3VsdCA8PCAiICAgIFNhbXBsZSBSYXRlOiAgICAgICAgICAiIDw8IGdldFNhbXBsZVJhdGUoKSA8PCAiXG4iOwogICAgIHJlc3VsdCA8PCAiICAgIENoYW5uZWwgQ291bnQ6ICAgICAgICAiIDw8IGdldFNhbXBsZXNQZXJGcmFtZSgpIDw8ICJcbiI7CisgICAgcmVzdWx0IDw8ICIgICAgRm9ybWF0OiAgICAgICAgICAgICAgICIgPDwgZ2V0Rm9ybWF0KCkgPDwgIlxuIjsKICAgICByZXN1bHQgPDwgIiAgICBGcmFtZXMgUGVyIEJ1cnN0OiAgICAgIiA8PCBtRnJhbWVzUGVyQnVyc3QgPDwgIlxuIjsKICAgICByZXN1bHQgPDwgIiAgICBVc2FnZTogICAgICAgICAgICAgICAgIiA8PCBnZXRVc2FnZSgpIDw8ICJcbiI7CiAgICAgcmVzdWx0IDw8ICIgICAgQ29udGVudFR5cGU6ICAgICAgICAgICIgPDwgZ2V0Q29udGVudFR5cGUoKSA8PCAiXG4iOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaAppbmRleCBhMTM0YTEzLi40M2IwYTM3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaApAQCAtNDEsNyArNDEsNyBAQAogICAgICAgICAsIHB1YmxpYyBBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzIHsKIHB1YmxpYzoKIAotICAgIHZpcnR1YWwgfkFBdWRpb1NlcnZpY2VFbmRwb2ludCgpOworICAgIHZpcnR1YWwgfkFBdWRpb1NlcnZpY2VFbmRwb2ludCgpID0gZGVmYXVsdDsKIAogICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZHVtcCgpIGNvbnN0OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUuY3BwCmluZGV4IGNjOTQyZjQuLjM3ZDEwNWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUuY3BwCkBAIC04Miw4ICs4Miw5IEBACiAKICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZCA8c3RkOjptdXRleD4gbG9jayhtTG9ja1N0cmVhbXMpOwogICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnRTdHJlYW0gOiBtUmVnaXN0ZXJlZFN0cmVhbXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2xpZW50U3RyZWFtLT5pc1J1bm5pbmcoKSkgeworICAgICAgICAgICAgICAgIGlmIChjbGllbnRTdHJlYW0tPmlzUnVubmluZygpICYmICFjbGllbnRTdHJlYW0tPmlzU3VzcGVuZGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjbGllbnRGcmFtZXNXcml0dGVuID0gMDsKKwogICAgICAgICAgICAgICAgICAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkPiBzdHJlYW1TaGFyZWQgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQgKj4oY2xpZW50U3RyZWFtLmdldCgpKTsKIApAQCAtMTAyLDcgKzEwMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtU2hhcmVkLT5zZXRUaW1lc3RhbXBQb3NpdGlvbk9mZnNldChwb3NpdGlvbk9mZnNldCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJcyB0aGUgYnVmZmVyIHRvbyBmdWxsIHRvIHdyaXRlIGEgYnVyc3Q/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZm8tPmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpIDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlmby0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKSA8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGcmFtZXNQZXJCdXJzdCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNoYXJlZC0+aW5jcmVtZW50WFJ1bkNvdW50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5jcHAKaW5kZXggNWE0MjljOS4uNmMyODA4MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5jcHAKQEAgLTEwMSw4ICsxMDEsNiBAQAogICAgICAgICAgICAgLmZsYWdzID0gQVVESU9fRkxBR19MT1dfTEFURU5DWSwKICAgICAgICAgICAgIC50YWdzID0gIiIKICAgICB9OwotICAgIEFMT0dEKCIlcyglcCkgTU1BUCBhdHRyaWJ1dGVzLnVzYWdlID0gJWQsIGNvbnRlbnRfdHlwZSA9ICVkLCBzb3VyY2UgPSAlZCIsCi0gICAgICAgICAgX19mdW5jX18sIHRoaXMsIGF0dHJpYnV0ZXMudXNhZ2UsIGF0dHJpYnV0ZXMuY29udGVudF90eXBlLCBhdHRyaWJ1dGVzLnNvdXJjZSk7CiAKICAgICBtTW1hcENsaWVudC5jbGllbnRVaWQgPSByZXF1ZXN0LmdldFVzZXJJZCgpOwogICAgIG1NbWFwQ2xpZW50LmNsaWVudFBpZCA9IHJlcXVlc3QuZ2V0UHJvY2Vzc0lkKCk7CkBAIC0xMTEsMTEgKzEwOSwxMSBAQAogICAgIG1SZXF1ZXN0ZWREZXZpY2VJZCA9IGRldmljZUlkID0gZ2V0RGV2aWNlSWQoKTsKIAogICAgIC8vIEZpbGwgaW4gY29uZmlnCi0gICAgYWF1ZGlvX2Zvcm1hdF90IGFhdWRpb0Zvcm1hdCA9IGdldEZvcm1hdCgpOwotICAgIGlmIChhYXVkaW9Gb3JtYXQgPT0gQUFVRElPX1VOU1BFQ0lGSUVEIHx8IGFhdWRpb0Zvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICBhYXVkaW9Gb3JtYXQgPSBBQVVESU9fRk9STUFUX1BDTV9JMTY7CisgICAgYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQgPSBnZXRGb3JtYXQoKTsKKyAgICBpZiAoYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX0RFRkFVTFQgfHwgYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICBhdWRpb0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIH0KLSAgICBjb25maWcuZm9ybWF0ID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWREYXRhRm9ybWF0KGFhdWRpb0Zvcm1hdCk7CisgICAgY29uZmlnLmZvcm1hdCA9IGF1ZGlvRm9ybWF0OwogCiAgICAgaW50MzJfdCBhYXVkaW9TYW1wbGVSYXRlID0gZ2V0U2FtcGxlUmF0ZSgpOwogICAgIGlmIChhYXVkaW9TYW1wbGVSYXRlID09IEFBVURJT19VTlNQRUNJRklFRCkgewpAQCAtMTYzLDEyICsxNjEsMTIgQEAKICAgICBBTE9HRCgiJXMoKSBtTWFwQ2xpZW50LnVpZCA9ICVkLCBwaWQgPSAlZCA9PiBwb3J0SGFuZGxlID0gJWRcbiIsCiAgICAgICAgICAgX19mdW5jX18sIG1NbWFwQ2xpZW50LmNsaWVudFVpZCwgIG1NbWFwQ2xpZW50LmNsaWVudFBpZCwgbVBvcnRIYW5kbGUpOwogICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzKCkgb3Blbk1tYXBTdHJlYW0oKSByZXR1cm5lZCBzdGF0dXMgJWQiLCAgX19mdW5jX18sIHN0YXR1cyk7CisgICAgICAgIEFMT0dFKCIlcygpIC0gb3Blbk1tYXBTdHJlYW0oKSByZXR1cm5lZCBzdGF0dXMgJWQiLCAgX19mdW5jX18sIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CiAgICAgfQogCiAgICAgaWYgKGRldmljZUlkID09IEFBVURJT19VTlNQRUNJRklFRCkgewotICAgICAgICBBTE9HVygiJXMoKSBvcGVuTW1hcFN0cmVhbSgpIGZhaWxlZCB0byBzZXQgZGV2aWNlSWQiLCBfX2Z1bmNfXyk7CisgICAgICAgIEFMT0dXKCIlcygpIC0gb3Blbk1tYXBTdHJlYW0oKSBmYWlsZWQgdG8gc2V0IGRldmljZUlkIiwgX19mdW5jX18pOwogICAgIH0KICAgICBzZXREZXZpY2VJZChkZXZpY2VJZCk7CiAKQEAgLTIxMCw5ICsyMDgsNiBAQAogICAgICAgICB1aWRfdCBhdWRpb1NlcnZpY2VVaWQgPSBnZXR1aWQoKTsKICAgICAgICAgaWYgKChtTW1hcENsaWVudC5jbGllbnRVaWQgIT0gYXVkaW9TZXJ2aWNlVWlkKSAmJgogICAgICAgICAgICAgZ2V0U2hhcmluZ01vZGUoKSA9PSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSkgewotICAgICAgICAgICAgLy8gRmFsbGJhY2sgaXMgaGFuZGxlZCBieSBjYWxsZXIgYnV0IGluZGljYXRlIHdoYXQgaXMgcG9zc2libGUgaW4gY2FzZQotICAgICAgICAgICAgLy8gdGhpcyBpcyB1c2VkIGluIHRoZSBmdXR1cmUKLSAgICAgICAgICAgIHNldFNoYXJpbmdNb2RlKEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEKTsKICAgICAgICAgICAgIEFMT0dXKCIlcygpIC0gZXhjbHVzaXZlIEZEIGNhbm5vdCBiZSB1c2VkIGJ5IGNsaWVudCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CkBAIC0yMzMsNyArMjI4LDcgQEAKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAgICAgbUZyYW1lc1BlckJ1cnN0ID0gbU1tYXBCdWZmZXJpbmZvLmJ1cnN0X3NpemVfZnJhbWVzOwotICAgIHNldEZvcm1hdChBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb0RhdGFGb3JtYXQoY29uZmlnLmZvcm1hdCkpOworICAgIHNldEZvcm1hdChjb25maWcuZm9ybWF0KTsKICAgICBzZXRTYW1wbGVSYXRlKGNvbmZpZy5zYW1wbGVfcmF0ZSk7CiAKICAgICAvLyBTY2FsZSB1cCB0aGUgYnVyc3Qgc2l6ZSB0byBtZWV0IHRoZSBtaW5pbXVtIGVxdWl2YWxlbnQgaW4gbWljcm9zZWNvbmRzLgpAQCAtMjUzLDYgKzI0OCw5IEBACiAgICAgICAgICAgIiwgZGV2aWNlSWQgPSAlZCwgY2FwYWNpdHkgPSAlZFxuIiwKICAgICAgICAgICBfX2Z1bmNfXywgZ2V0U2FtcGxlUmF0ZSgpLCBnZXRTYW1wbGVzUGVyRnJhbWUoKSwgZGV2aWNlSWQsIGdldEJ1ZmZlckNhcGFjaXR5KCkpOwogCisgICAgQUxPR0QoIiVzKCkgZm9ybWF0ID0gPXglMDh4LCBmcmFtZSBzaXplID0gJWQiLAorICAgICAgICAgIF9fZnVuY19fLCBnZXRGb3JtYXQoKSwgY2FsY3VsYXRlQnl0ZXNQZXJGcmFtZSgpKTsKKwogICAgIHJldHVybiByZXN1bHQ7CiAKIGVycm9yOgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmNwcAppbmRleCBlYmJhMzJkLi4xZTFjNTUyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmNwcApAQCAtNDcsMTAgKzQ3LDYgQEAKICAgICBtU3RyZWFtSW50ZXJuYWwgPSAmbVN0cmVhbUludGVybmFsUGxheTsKIH0KIAotQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheTo6fkFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkoKSB7Ci0gICAgQUxPR0QoIiVzKCVwKSBkZXN0cm95ZWQiLCBfX2Z1bmNfXywgdGhpcyk7Ci19Ci0KIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5OjpvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6Om9wZW4ocmVxdWVzdCk7CiAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKQEAgLTg4LDYgKzg0LDEwIEBACiAgICAgICAgICAgICAgICAgaW50NjRfdCBjbGllbnRGcmFtZXNSZWFkID0gMDsKICAgICAgICAgICAgICAgICBib29sIGFsbG93VW5kZXJmbG93ID0gdHJ1ZTsKIAorICAgICAgICAgICAgICAgIGlmIChjbGllbnRTdHJlYW0tPmlzU3VzcGVuZGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGRlYWQgc3RyZWFtCisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IHN0YXRlID0gY2xpZW50U3RyZWFtLT5nZXRTdGF0ZSgpOwogICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQSU5HKSB7CiAgICAgICAgICAgICAgICAgICAgIGFsbG93VW5kZXJmbG93ID0gZmFsc2U7IC8vIGp1c3QgcmVhZCB3aGF0IGlzIGFscmVhZHkgaW4gdGhlIEZJRk8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuaAppbmRleCBhMGEzODNjLi45ODFlNDMwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5oCkBAIC0zOSw3ICszOSw2IEBACiBjbGFzcyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5IDogcHVibGljIEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZCB7CiBwdWJsaWM6CiAgICAgZXhwbGljaXQgQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheShhbmRyb2lkOjpBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UpOwotICAgIHZpcnR1YWwgfkFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkoKTsKIAogICAgIGFhdWRpb19yZXN1bHRfdCBvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgb3ZlcnJpZGU7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuY3BwCmluZGV4IGZjOWYxNTUuLjJmMWVjN2UgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmNwcApAQCAtNzgsNiArNzgsNyBAQAogICAgIHNldFNhbXBsZXNQZXJGcmFtZShtU3RyZWFtSW50ZXJuYWwtPmdldFNhbXBsZXNQZXJGcmFtZSgpKTsKICAgICBzZXREZXZpY2VJZChtU3RyZWFtSW50ZXJuYWwtPmdldERldmljZUlkKCkpOwogICAgIHNldFNlc3Npb25JZChtU3RyZWFtSW50ZXJuYWwtPmdldFNlc3Npb25JZCgpKTsKKyAgICBzZXRGb3JtYXQoQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7IC8vIGZvcmNlIGZvciBtaXhlcgogICAgIG1GcmFtZXNQZXJCdXJzdCA9IG1TdHJlYW1JbnRlcm5hbC0+Z2V0RnJhbWVzUGVyQnVyc3QoKTsKIAogICAgIHJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oCmluZGV4IGQ2NzE3MTAuLmJmYzE3NDQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oCkBAIC01Miw4ICs1Miw3IEBACiAKICAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0VGltZXN0YW1wKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgKmNhbGxiYWNrTG9vcCgpID0gMDsKLQorICAgIHZpcnR1YWwgdm9pZCAgICpjYWxsYmFja0xvb3AoKSA9IDA7CiAKIHByb3RlY3RlZDoKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuY3BwCmluZGV4IDlhZjhhZjMuLmRlZmJiN2IgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5jcHAKQEAgLTUxLDcgKzUxLDYgQEAKIH0KIAogQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6On5BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSgpIHsKLSAgICBBTE9HRCgifkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlKCkgZGVzdHJveWluZyAlcCIsIHRoaXMpOwogICAgIC8vIElmIHRoZSBzdHJlYW0gaXMgZGVsZXRlZCB3aGVuIE9QRU4gb3IgaW4gdXNlIHRoZW4gYXVkaW8gcmVzb3VyY2VzIHdpbGwgbGVhay4KICAgICAvLyBUaGlzIHdvdWxkIGluZGljYXRlIGFuIGludGVybmFsIGVycm9yLiBTbyB3ZSB3YW50IHRvIGZpbmQgdGhpcyBBU0FQLgogICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIShnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VECkBAIC04MSw4ICs4MCw3IEBACiAgICAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUpIHsKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6b3Blbihjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpIHsKICAgICBBQXVkaW9FbmRwb2ludE1hbmFnZXIgJm1FbmRwb2ludE1hbmFnZXIgPSBBQXVkaW9FbmRwb2ludE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKIApAQCAtMTA5LDEwICsxMDcsOCBAQAogICAgICAgICAvLyByZWZlcmVuY2VkIHVudGlsIHRoZSBzZXJ2aWNlIHJldHVybnMgYSBoYW5kbGUgdG8gdGhlIGNsaWVudC4KICAgICAgICAgLy8gU28gb25seSBvbmUgdGhyZWFkIGNhbiBvcGVuIGEgc3RyZWFtLgogICAgICAgICBtU2VydmljZUVuZHBvaW50ID0gbUVuZHBvaW50TWFuYWdlci5vcGVuRW5kcG9pbnQobUF1ZGlvU2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyaW5nTW9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0KTsKICAgICAgICAgaWYgKG1TZXJ2aWNlRW5kcG9pbnQgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgQUxPR0UoIiVzKCkgb3BlbkVuZHBvaW50KCkgZmFpbGVkIiwgX19mdW5jX18pOwogICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOwogICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQpAQCAtMTgzLDYgKzE3OSw3IEBACiAgICAgfQogCiAgICAgc2V0Rmxvd2luZyhmYWxzZSk7CisgICAgc2V0U3VzcGVuZGVkKGZhbHNlKTsKIAogICAgIC8vIFN0YXJ0IHdpdGggZnJlc2ggcHJlc2VudGF0aW9uIHRpbWVzdGFtcHMuCiAgICAgbUF0b21pY1RpbWVzdGFtcC5jbGVhcigpOwpAQCAtMzQ5LDcgKzM0Niw5IEBACiAgICAgfQogICAgIGludDMyX3QgY291bnQgPSBtVXBNZXNzYWdlUXVldWUtPmdldEZpZm9CdWZmZXIoKS0+d3JpdGUoY29tbWFuZCwgMSk7CiAgICAgaWYgKGNvdW50ICE9IDEpIHsKLSAgICAgICAgQUxPR0UoIiVzKCk6IFF1ZXVlIGZ1bGwuIERpZCBjbGllbnQgZGllPyAlcyIsIF9fZnVuY19fLCBnZXRUeXBlVGV4dCgpKTsKKyAgICAgICAgQUxPR1coIiVzKCk6IFF1ZXVlIGZ1bGwuIERpZCBjbGllbnQgc3RvcD8gU3VzcGVuZGluZyBzdHJlYW0uIHdoYXQgPSAldSwgJXMiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgY29tbWFuZC0+d2hhdCwgZ2V0VHlwZVRleHQoKSk7CisgICAgICAgIHNldFN1c3BlbmRlZCh0cnVlKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9XT1VMRF9CTE9DSzsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gQUFVRElPX09LOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmgKaW5kZXggYTE4MTVkMC4uNzkwNGIyNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5oCkBAIC0yMDQsNiArMjA0LDIwIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0IGZhbHNlIHdoZW4gdGhlIHN0cmVhbSBzaG91bGQgbm90IGxvbmdlciBiZSBwcm9jZXNzZWQuCisgICAgICogVGhpcyBtYXkgYmUgY2F1c2VkIGJ5IGEgbWVzc2FnZSBxdWV1ZSBvdmVyZmxvdy4KKyAgICAgKiBTZXQgdHJ1ZSB3aGVuIHN0cmVhbSBpcyBzdGFydGVkLgorICAgICAqIEBwYXJhbSBzdXNwZW5kZWQKKyAgICAgKi8KKyAgICB2b2lkIHNldFN1c3BlbmRlZChib29sIHN1c3BlbmRlZCkgeworICAgICAgICBtU3VzcGVuZGVkID0gc3VzcGVuZGVkOworICAgIH0KKworICAgIGJvb2wgaXNTdXNwZW5kZWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU3VzcGVuZGVkOworICAgIH0KKworICAgIC8qKgogICAgICAqIEF0b21pY2FsbHkgaW5jcmVtZW50IHRoZSBudW1iZXIgb2YgYWN0aXZlIHJlZmVyZW5jZXMgdG8gdGhlIHN0cmVhbSBieSBBQXVkaW9TZXJ2aWNlLgogICAgICAqCiAgICAgICogVGhpcyBpcyBjYWxsZWQgdW5kZXIgYSBnbG9iYWwgbG9jayBpbiBBQXVkaW9TdHJlYW1UcmFja2VyLgpAQCAtMzA0LDcgKzMxOCwxMiBAQAogICAgIC8vIFRoaXMgaXMgbW9kaWZpZWQgdW5kZXIgYSBnbG9iYWwgbG9jayBpbiBBQXVkaW9TdHJlYW1UcmFja2VyLgogICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1DYWxsaW5nQ291bnQgPSAwOwogCisgICAgLy8gVGhpcyBpbmRpY2F0ZXMgdGhhdCBhIHN0cmVhbSB0aGF0IGlzIGJlaW5nIHJlZmVyZW5jZWQgYnkgYSBiaW5kZXIgY2FsbCBuZWVkcyB0byBjbG9zZWQuCiAgICAgc3RkOjphdG9taWM8Ym9vbD4gICAgICAgbUNsb3NlTmVlZGVke2ZhbHNlfTsKKworICAgIC8vIFRoaXMgaW5kaWNhdGUgdGhhdCBhIHJ1bm5pbmcgc3RyZWFtIHNob3VsZCBub3QgYmUgcHJvY2Vzc2VkIGJlY2F1c2Ugb2YgYW4gZXJyb3IsCisgICAgLy8gZm9yIGV4YW1wbGUgYSBmdWxsIG1lc3NhZ2UgcXVldWUuIE5vdGUgdGhhdCB0aGlzIGF0b21pYyBpcyB1bnJlbGF0ZWQgdG8gbUNsb3NlTmVlZGVkLgorICAgIHN0ZDo6YXRvbWljPGJvb2w+ICAgICAgIG1TdXNwZW5kZWR7ZmFsc2V9OwogfTsKIAogfSAvKiBuYW1lc3BhY2UgYWF1ZGlvICovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5jcHAKaW5kZXggYzg0NTMwOS4uOTM3Nzk0NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmNwcApAQCAtNjQsOCArNjQsMTMgQEAKIAogICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQPiBrZWVwKHRoaXMpOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvcGVuKHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFKTsKKyAgICBpZiAocmVxdWVzdC5nZXRDb25zdGFudENvbmZpZ3VyYXRpb24oKS5nZXRTaGFyaW5nTW9kZSgpICE9IEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFKSB7CisgICAgICAgIEFMT0dFKCIlcygpIHNoYXJpbmdNb2RlIG1pc21hdGNoICVkIiwgX19mdW5jX18sCisgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0Q29uc3RhbnRDb25maWd1cmF0aW9uKCkuZ2V0U2hhcmluZ01vZGUoKSk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7CisgICAgfQorCisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvcGVuKHJlcXVlc3QpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcAppbmRleCAwNWM1NzM1Li5kNTQ1MGZlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcApAQCAtMTIwLDkgKzEyMCwxNCBAQAogCiAgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZD4ga2VlcCh0aGlzKTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6b3BlbihyZXF1ZXN0LCBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCk7CisgICAgaWYgKHJlcXVlc3QuZ2V0Q29uc3RhbnRDb25maWd1cmF0aW9uKCkuZ2V0U2hhcmluZ01vZGUoKSAhPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCkgeworICAgICAgICBBTE9HRSgiJXMoKSBzaGFyaW5nTW9kZSBtaXNtYXRjaCAlZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICByZXF1ZXN0LmdldENvbnN0YW50Q29uZmlndXJhdGlvbigpLmdldFNoYXJpbmdNb2RlKCkpOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVEVSTkFMOworICAgIH0KKworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6b3BlbihyZXF1ZXN0KTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICBBTE9HRSgiJXMoKSByZXR1cm5lZCAlZCIsIF9fZnVuY19fLCByZXN1bHQpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIApAQCAtMTM2LDEwICsxNDEsMTAgQEAKIAogICAgIC8vIElzIHRoZSByZXF1ZXN0IGNvbXBhdGlibGUgd2l0aCB0aGUgc2hhcmVkIGVuZHBvaW50PwogICAgIHNldEZvcm1hdChjb25maWd1cmF0aW9uSW5wdXQuZ2V0Rm9ybWF0KCkpOwotICAgIGlmIChnZXRGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEKSB7Ci0gICAgICAgIHNldEZvcm1hdChBQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7Ci0gICAgfSBlbHNlIGlmIChnZXRGb3JtYXQoKSAhPSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICBBTE9HRCgiJXMoKSBtQXVkaW9Gb3JtYXQgPSAlZCwgbmVlZCBGTE9BVCIsIF9fZnVuY19fLCBnZXRGb3JtYXQoKSk7CisgICAgaWYgKGdldEZvcm1hdCgpID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgIHNldEZvcm1hdChBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKKyAgICB9IGVsc2UgaWYgKGdldEZvcm1hdCgpICE9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgYXVkaW9fZm9ybWF0X3QgbUF1ZGlvRm9ybWF0ID0gJWQsIG5lZWQgRkxPQVQiLCBfX2Z1bmNfXywgZ2V0Rm9ybWF0KCkpOwogICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfSU5WQUxJRF9GT1JNQVQ7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQpAQCAtMTQ4LDcgKzE1Myw3IEBACiAgICAgaWYgKGdldFNhbXBsZVJhdGUoKSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKICAgICAgICAgc2V0U2FtcGxlUmF0ZShlbmRwb2ludC0+Z2V0U2FtcGxlUmF0ZSgpKTsKICAgICB9IGVsc2UgaWYgKGdldFNhbXBsZVJhdGUoKSAhPSBlbmRwb2ludC0+Z2V0U2FtcGxlUmF0ZSgpKSB7Ci0gICAgICAgIEFMT0dEKCIlcygpIG1TYW1wbGVSYXRlID0gJWQsIG5lZWQgJWQiLAorICAgICAgICBBTE9HRSgiJXMoKSBtU2FtcGxlUmF0ZSA9ICVkLCBuZWVkICVkIiwKICAgICAgICAgICAgICAgX19mdW5jX18sIGdldFNhbXBsZVJhdGUoKSwgZW5kcG9pbnQtPmdldFNhbXBsZVJhdGUoKSk7CiAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9JTlZBTElEX1JBVEU7CiAgICAgICAgIGdvdG8gZXJyb3I7CkBAIC0xNTgsNyArMTYzLDcgQEAKICAgICBpZiAoZ2V0U2FtcGxlc1BlckZyYW1lKCkgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CiAgICAgICAgIHNldFNhbXBsZXNQZXJGcmFtZShlbmRwb2ludC0+Z2V0U2FtcGxlc1BlckZyYW1lKCkpOwogICAgIH0gZWxzZSBpZiAoZ2V0U2FtcGxlc1BlckZyYW1lKCkgIT0gZW5kcG9pbnQtPmdldFNhbXBsZXNQZXJGcmFtZSgpKSB7Ci0gICAgICAgIEFMT0dEKCIlcygpIG1TYW1wbGVzUGVyRnJhbWUgPSAlZCwgbmVlZCAlZCIsCisgICAgICAgIEFMT0dFKCIlcygpIG1TYW1wbGVzUGVyRnJhbWUgPSAlZCwgbmVlZCAlZCIsCiAgICAgICAgICAgICAgIF9fZnVuY19fLCBnZXRTYW1wbGVzUGVyRnJhbWUoKSwgZW5kcG9pbnQtPmdldFNhbXBsZXNQZXJGcmFtZSgpKTsKICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKICAgICAgICAgZ290byBlcnJvcjsKQEAgLTE4NSw4ICsxOTAsOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6Om9wZW4oKSBhY3R1YWwgcmF0ZSA9ICVkLCBjaGFubmVscyA9ICVkLCBkZXZpY2VJZCA9ICVkIiwKLSAgICAgICAgICBnZXRTYW1wbGVSYXRlKCksIGdldFNhbXBsZXNQZXJGcmFtZSgpLCBlbmRwb2ludC0+Z2V0RGV2aWNlSWQoKSk7CisgICAgQUxPR0QoIiVzKCkgYWN0dWFsIHJhdGUgPSAlZCwgY2hhbm5lbHMgPSAlZCwgZGV2aWNlSWQgPSAlZCIsCisgICAgICAgICAgX19mdW5jX18sIGdldFNhbXBsZVJhdGUoKSwgZ2V0U2FtcGxlc1BlckZyYW1lKCksIGVuZHBvaW50LT5nZXREZXZpY2VJZCgpKTsKIAogICAgIHJlc3VsdCA9IGVuZHBvaW50LT5yZWdpc3RlclN0cmVhbShrZWVwKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQW5kcm9pZC5tayBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FuZHJvaWQubWsKaW5kZXggNTg0YjJlZi4uM2Q1ZjE0MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BbmRyb2lkLm1rCkBAIC01Myw3ICs1Myw2IEBACiAgICAgbGliYmluZGVyIFwKICAgICBsaWJjdXRpbHMgXAogICAgIGxpYm1lZGlhdXRpbHMgXAotICAgIGxpYnNlcnZpY2V1dGlsaXR5IFwKICAgICBsaWJ1dGlscyBcCiAgICAgbGlibG9nCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9BbmRyb2lkLmJwIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYyMjgzYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGlic291bmR0cmlnZ2Vyc2VydmljZSIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJTb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwIiwKKyAgICAgICAgIlNvdW5kVHJpZ2dlckhhbEhpZGwuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmhhcmR3YXJlIiwKKyAgICAgICAgImxpYnNvdW5kdHJpZ2dlciIsCisgICAgICAgICJsaWJhdWRpb2NsaWVudCIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKworICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaGlkbG1lbW9yeSIsCisgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYXVkaW9oYWwiLAorICAgICAgICAibGliYXVkaW9oYWxfZGVhdGhoYW5kbGVyIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuc291bmR0cmlnZ2VyQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLnNvdW5kdHJpZ2dlckAyLjEiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5zb3VuZHRyaWdnZXJAMi4yIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhpZGwubWVtb3J5QDEuMCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWyJmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlciJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQzNjY2ZS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1pZmVxICgkKFNPVU5EX1RSSUdHRVJfVVNFX1NUVUJfTU9EVUxFKSwgMSkKLSAgICBpZm5lcSAoJChVU0VfTEVHQUNZX0xPQ0FMX0FVRElPX0hBTCksIHRydWUpCi0gICAgICAgICQoZXJyb3IgUmVxdWlyZXMgYnVpbGRpbmcgd2l0aCBVU0VfTEVHQUNZX0xPQ0FMX0FVRElPX0hBTD10cnVlKQotICAgIGVuZGlmCi0gICAgTE9DQUxfQ0ZMQUdTICs9IC1EU09VTkRfVFJJR0dFUl9VU0VfU1RVQl9NT0RVTEUKLWVuZGlmCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgXAotICAgIFNvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUzo9IFwKLSAgICBsaWJsb2cgXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJiaW5kZXIgXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGliaGFyZHdhcmUgXAotICAgIGxpYnNvdW5kdHJpZ2dlciBcCi0gICAgbGliYXVkaW9jbGllbnQgXAotICAgIGxpYnNlcnZpY2V1dGlsaXR5Ci0KLQotaWZlcSAoJChVU0VfTEVHQUNZX0xPQ0FMX0FVRElPX0hBTCksdHJ1ZSkKLSMgbGliaGFyZHdhcmUgY29uZmlndXJhdGlvbgotTE9DQUxfU1JDX0ZJTEVTICs9ICAgICAgICAgICAgICAgXAotICAgIFNvdW5kVHJpZ2dlckhhbExlZ2FjeS5jcHAKLWVsc2UKLSMgVHJlYmxlIGNvbmZpZ3VyYXRpb24KLUxPQ0FMX1NSQ19GSUxFUyArPSAgICAgICAgICAgICAgIFwKLSAgICBTb3VuZFRyaWdnZXJIYWxIaWRsLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IFwKLSAgICBsaWJod2JpbmRlciBcCi0gICAgbGliaGlkbGJhc2UgXAotICAgIGxpYmhpZGxtZW1vcnkgXAotICAgIGxpYmhpZGx0cmFuc3BvcnQgXAotICAgIGxpYmJhc2UgXAotICAgIGxpYmF1ZGlvaGFsIFwKLSAgICBsaWJhdWRpb2hhbF9kZWF0aGhhbmRsZXIgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuc291bmR0cmlnZ2VyQDIuMCBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5zb3VuZHRyaWdnZXJAMi4xIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkAyLjAgXAotICAgIGFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIFwKLSAgICBhbmRyb2lkLmhpZGwubWVtb3J5QDEuMAotZW5kaWYKLQotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlcgotCi1MT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQotCi1MT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgotCi1MT0NBTF9NT0RVTEU6PSBsaWJzb3VuZHRyaWdnZXJzZXJ2aWNlCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxIaWRsLmNwcCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxIaWRsLmNwcAppbmRleCBhZGYyNTJlLi4xZDM3YThlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSGlkbC5jcHAKKysrIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEhpZGwuY3BwCkBAIC0zNTYsNiArMzU2LDM4IEBACiAgICAgcmV0dXJuIGhpZGxSZXR1cm47CiB9CiAKK2ludCBTb3VuZFRyaWdnZXJIYWxIaWRsOjpnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBzcDxJU291bmRUcmlnZ2VySHc+IHNvdW5kdHJpZ2dlciA9IGdldFNlcnZpY2UoKTsKKyAgICBpZiAoc291bmR0cmlnZ2VyID09IDApIHsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorCisgICAgc3A8VjJfMl9JU291bmRUcmlnZ2VySHc+IHNvdW5kdHJpZ2dlcl8yXzIgPSB0b1NlcnZpY2UyXzIoc291bmR0cmlnZ2VyKTsKKyAgICBpZiAoc291bmR0cmlnZ2VyXzJfMiA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJnZXRNb2RlbFN0YXRlIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorCisgICAgc3A8U291bmRNb2RlbD4gbW9kZWwgPSBnZXRNb2RlbChoYW5kbGUpOworICAgIGlmIChtb2RlbCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJnZXRNb2RlbFN0YXRlIG1vZGVsIG5vdCBmb3VuZCBmb3IgaGFuZGxlICV1IiwgaGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaW50IHJldCA9IE5PX0VSUk9SOworICAgIFJldHVybjxpbnQzMl90PiBoaWRsUmV0dXJuKDApOworICAgIHsKKyAgICAgICAgQXV0b011dGV4IGxvY2sobUhhbExvY2spOworICAgICAgICBoaWRsUmV0dXJuID0gc291bmR0cmlnZ2VyXzJfMi0+Z2V0TW9kZWxTdGF0ZShtb2RlbC0+bUhhbEhhbmRsZSk7CisgICAgfQorICAgIGlmICghaGlkbFJldHVybi5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoImdldE1vZGVsU3RhdGUgZXJyb3IgJXMiLCBoaWRsUmV0dXJuLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKwogU291bmRUcmlnZ2VySGFsSGlkbDo6U291bmRUcmlnZ2VySGFsSGlkbChjb25zdCBjaGFyICptb2R1bGVOYW1lKQogICAgIDogbU1vZHVsZU5hbWUobW9kdWxlTmFtZSksIG1OZXh0VW5pcXVlSWQoMSkKIHsKQEAgLTM4OCw2ICs0MjAsMTIgQEAKICAgICByZXR1cm4gY2FzdFJlc3VsdF8yXzEuaXNPaygpID8gc3RhdGljX2Nhc3Q8c3A8VjJfMV9JU291bmRUcmlnZ2VySHc+PihjYXN0UmVzdWx0XzJfMSkgOiBudWxscHRyOwogfQogCitzcDxWMl8yX0lTb3VuZFRyaWdnZXJIdz4gU291bmRUcmlnZ2VySGFsSGlkbDo6dG9TZXJ2aWNlMl8yKGNvbnN0IHNwPElTb3VuZFRyaWdnZXJIdz4mIHMpCit7CisgICAgYXV0byBjYXN0UmVzdWx0XzJfMiA9IFYyXzJfSVNvdW5kVHJpZ2dlckh3OjpjYXN0RnJvbShzKTsKKyAgICByZXR1cm4gY2FzdFJlc3VsdF8yXzIuaXNPaygpID8gc3RhdGljX2Nhc3Q8c3A8VjJfMl9JU291bmRUcmlnZ2VySHc+PihjYXN0UmVzdWx0XzJfMikgOiBudWxscHRyOworfQorCiBzcDxTb3VuZFRyaWdnZXJIYWxIaWRsOjpTb3VuZE1vZGVsPiBTb3VuZFRyaWdnZXJIYWxIaWRsOjpnZXRNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEhpZGwuaCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxIaWRsLmgKaW5kZXggMGI0NGFlMC4uZmI5ZTM5ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEhpZGwuaAorKysgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSGlkbC5oCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSAiU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlLmgiCiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9zb3VuZHRyaWdnZXIvMi4wL3R5cGVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9zb3VuZHRyaWdnZXIvMi4xL0lTb3VuZFRyaWdnZXJIdy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvc291bmR0cmlnZ2VyLzIuMi9JU291bmRUcmlnZ2VySHcuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3NvdW5kdHJpZ2dlci8yLjAvSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2suaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3NvdW5kdHJpZ2dlci8yLjEvSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2suaD4KIApAQCAtNDYsNiArNDcsOCBAQAogdXNpbmcgVjJfMV9JU291bmRUcmlnZ2VySHdDYWxsYmFjayA9CiAgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnNvdW5kdHJpZ2dlcjo6VjJfMTo6SVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2s7CiB1c2luZyA6OmFuZHJvaWQ6OmhpZGw6Om1lbW9yeTo6VjFfMDo6SU1lbW9yeTsKK3VzaW5nIFYyXzJfSVNvdW5kVHJpZ2dlckh3ID0KKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6c291bmR0cmlnZ2VyOjpWMl8yOjpJU291bmRUcmlnZ2VySHc7CiAKIGNsYXNzIFNvdW5kVHJpZ2dlckhhbEhpZGwgOiBwdWJsaWMgU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2aXJ0dWFsIFYyXzFfSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2sKQEAgLTkyLDYgKzk1LDE0IEBACiAgICAgICAgICAqLwogICAgICAgICB2aXJ0dWFsIGludCBzdG9wQWxsUmVjb2duaXRpb25zKCk7CiAKKyAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgZ2l2ZW4gbW9kZWwuCisgICAgICAgICAqIFJldHVybnMgMCBvciBhbiBlcnJvciBjb2RlLiBJZiBzdWNjZXNzZnVsIHRoZSBzdGF0ZSB3aWxsIGJlIHJldHVybmVkIGFzeW5jaHJvbm91c2x5CisgICAgICAgICAqIHZpYSBhIHJlY29nbml0aW9uIGV2ZW50IGluIHRoZSBjYWxsYmFjayBtZXRob2QgdGhhdCB3YXMgcmVnaXN0ZXJlZCBpbiB0aGUKKyAgICAgICAgICogc3RhcnRSZWNvZ25pdGlvbigpIG1ldGhvZC4KKyAgICAgICAgICogT25seSBzdXBwb3J0ZWQgZm9yIGRldmljZSBhcGkgdmVyc2lvbnMgU09VTkRfVFJJR0dFUl9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8yIG9yIGFib3ZlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBpbnQgZ2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOworCiAgICAgICAgIC8vIElTb3VuZFRyaWdnZXJId0NhbGxiYWNrCiAgICAgICAgIHZpcnR1YWwgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJlY29nbml0aW9uQ2FsbGJhY2soCiAgICAgICAgICAgICAgICAgY29uc3QgVjJfMF9JU291bmRUcmlnZ2VySHdDYWxsYmFjazo6UmVjb2duaXRpb25FdmVudCYgZXZlbnQsIENhbGxiYWNrQ29va2llIGNvb2tpZSk7CkBAIC0xODIsNiArMTkzLDcgQEAKICAgICAgICAgdWludDMyX3QgbmV4dFVuaXF1ZUlkKCk7CiAgICAgICAgIHNwPElTb3VuZFRyaWdnZXJIdz4gZ2V0U2VydmljZSgpOwogICAgICAgICBzcDxWMl8xX0lTb3VuZFRyaWdnZXJIdz4gdG9TZXJ2aWNlMl8xKGNvbnN0IHNwPElTb3VuZFRyaWdnZXJIdz4mIHMpOworICAgICAgICBzcDxWMl8yX0lTb3VuZFRyaWdnZXJIdz4gdG9TZXJ2aWNlMl8yKGNvbnN0IHNwPElTb3VuZFRyaWdnZXJIdz4mIHMpOwogICAgICAgICBzcDxTb3VuZE1vZGVsPiBnZXRNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOwogICAgICAgICBzcDxTb3VuZE1vZGVsPiByZW1vdmVNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlLmgKaW5kZXggYzA4MzE5NS4uMDE4M2VjZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2UuaApAQCAtNzEsNiArNzEsMTQgQEAKICAgICAgICAgICovCiAgICAgICAgIHZpcnR1YWwgaW50IHN0b3BBbGxSZWNvZ25pdGlvbnMoKSA9IDA7CiAKKyAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgZ2l2ZW4gbW9kZWwuCisgICAgICAgICAqIFJldHVybnMgMCBvciBhbiBlcnJvciBjb2RlLiBJZiBzdWNjZXNzZnVsIHRoZSBzdGF0ZSB3aWxsIGJlIHJldHVybmVkIGFzeW5jaHJvbm91c2x5CisgICAgICAgICAqIHZpYSBhIHJlY29nbml0aW9uIGV2ZW50IGluIHRoZSBjYWxsYmFjayBtZXRob2QgdGhhdCB3YXMgcmVnaXN0ZXJlZCBpbiB0aGUKKyAgICAgICAgICogc3RhcnRSZWNvZ25pdGlvbigpIG1ldGhvZC4KKyAgICAgICAgICogT25seSBzdXBwb3J0ZWQgZm9yIGRldmljZSBhcGkgdmVyc2lvbnMgU09VTkRfVFJJR0dFUl9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8yIG9yIGFib3ZlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBpbnQgZ2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpID0gMDsKKwogcHJvdGVjdGVkOgogICAgICAgICBTb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2UoKSB7fQogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxMZWdhY3kuY3BwIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbExlZ2FjeS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNzg4MTguLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbExlZ2FjeS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlICJTb3VuZFRyaWdnZXJIYWxMZWdhY3kuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vKiBzdGF0aWMgKi8KLXNwPFNvdW5kVHJpZ2dlckhhbEludGVyZmFjZT4gU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlOjpjb25uZWN0TW9kdWxlKGNvbnN0IGNoYXIgKm1vZHVsZU5hbWUpCi17Ci0gICAgcmV0dXJuIG5ldyBTb3VuZFRyaWdnZXJIYWxMZWdhY3kobW9kdWxlTmFtZSk7Ci19Ci0KLVNvdW5kVHJpZ2dlckhhbExlZ2FjeTo6U291bmRUcmlnZ2VySGFsTGVnYWN5KGNvbnN0IGNoYXIgKm1vZHVsZU5hbWUpCi0gICAgOiBtTW9kdWxlTmFtZShtb2R1bGVOYW1lKSwgbUh3RGV2aWNlKE5VTEwpCi17Ci19Ci0KLXZvaWQgU291bmRUcmlnZ2VySGFsTGVnYWN5OjpvbkZpcnN0UmVmKCkKLXsKLSAgICBjb25zdCBod19tb2R1bGVfdCAqbW9kOwotICAgIGludCByYzsKLQotICAgIGlmIChtTW9kdWxlTmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgIG1Nb2R1bGVOYW1lID0gInByaW1hcnkiOwotICAgIH0KLQotICAgIHJjID0gaHdfZ2V0X21vZHVsZV9ieV9jbGFzcyhTT1VORF9UUklHR0VSX0hBUkRXQVJFX01PRFVMRV9JRCwgbU1vZHVsZU5hbWUsICZtb2QpOwotICAgIGlmIChyYyAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJjb3VsZG4ndCBsb2FkIHNvdW5kIHRyaWdnZXIgbW9kdWxlICVzLiVzICglcykiLAotICAgICAgICAgICAgICBTT1VORF9UUklHR0VSX0hBUkRXQVJFX01PRFVMRV9JRCwgbU1vZHVsZU5hbWUsIHN0cmVycm9yKC1yYykpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHJjID0gc291bmRfdHJpZ2dlcl9od19kZXZpY2Vfb3Blbihtb2QsICZtSHdEZXZpY2UpOwotICAgIGlmIChyYyAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJjb3VsZG4ndCBvcGVuIHNvdW5kIHRyaWdnZXIgaHcgZGV2aWNlIGluICVzLiVzICglcykiLAotICAgICAgICAgICAgICBTT1VORF9UUklHR0VSX0hBUkRXQVJFX01PRFVMRV9JRCwgbU1vZHVsZU5hbWUsIHN0cmVycm9yKC1yYykpOwotICAgICAgICBtSHdEZXZpY2UgPSBOVUxMOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChtSHdEZXZpY2UtPmNvbW1vbi52ZXJzaW9uIDwgU09VTkRfVFJJR0dFUl9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wIHx8Ci0gICAgICAgICAgICBtSHdEZXZpY2UtPmNvbW1vbi52ZXJzaW9uID4gU09VTkRfVFJJR0dFUl9ERVZJQ0VfQVBJX1ZFUlNJT05fQ1VSUkVOVCkgewotICAgICAgICBBTE9HRSgid3Jvbmcgc291bmQgdHJpZ2dlciBodyBkZXZpY2UgdmVyc2lvbiAlMDR4IiwgbUh3RGV2aWNlLT5jb21tb24udmVyc2lvbik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci19Ci0KLVNvdW5kVHJpZ2dlckhhbExlZ2FjeTo6flNvdW5kVHJpZ2dlckhhbExlZ2FjeSgpCi17Ci0gICAgaWYgKG1Id0RldmljZSAhPSBOVUxMKSB7Ci0gICAgICAgIHNvdW5kX3RyaWdnZXJfaHdfZGV2aWNlX2Nsb3NlKG1Id0RldmljZSk7Ci0gICAgfQotfQotCi1pbnQgU291bmRUcmlnZ2VySGFsTGVnYWN5OjpnZXRQcm9wZXJ0aWVzKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3Byb3BlcnRpZXMgKnByb3BlcnRpZXMpCi17Ci0gICAgaWYgKG1Id0RldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByZXR1cm4gbUh3RGV2aWNlLT5nZXRfcHJvcGVydGllcyhtSHdEZXZpY2UsIHByb3BlcnRpZXMpOwotfQotCi1pbnQgU291bmRUcmlnZ2VySGFsTGVnYWN5Ojpsb2FkU291bmRNb2RlbChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9zb3VuZF9tb2RlbCAqc291bmRfbW9kZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBzb3VuZF9tb2RlbF9jYWxsYmFja190IGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29va2llLAotICAgICAgICAgICAgICAgICAgICAgICAgc291bmRfbW9kZWxfaGFuZGxlX3QgKmhhbmRsZSkKLXsKLSAgICBpZiAobUh3RGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJldHVybiBtSHdEZXZpY2UtPmxvYWRfc291bmRfbW9kZWwobUh3RGV2aWNlLCBzb3VuZF9tb2RlbCwgY2FsbGJhY2ssIGNvb2tpZSwgaGFuZGxlKTsKLX0KLQotaW50IFNvdW5kVHJpZ2dlckhhbExlZ2FjeTo6dW5sb2FkU291bmRNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCi17Ci0gICAgaWYgKG1Id0RldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByZXR1cm4gbUh3RGV2aWNlLT51bmxvYWRfc291bmRfbW9kZWwobUh3RGV2aWNlLCBoYW5kbGUpOwotfQotCi1pbnQgU291bmRUcmlnZ2VySGFsTGVnYWN5OjpzdGFydFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICByZWNvZ25pdGlvbl9jYWxsYmFja190IGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvb2tpZSkKLXsKLSAgICBpZiAobUh3RGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJldHVybiBtSHdEZXZpY2UtPnN0YXJ0X3JlY29nbml0aW9uKG1Id0RldmljZSwgaGFuZGxlLCBjb25maWcsIGNhbGxiYWNrLCBjb29raWUpOwotfQotCi1pbnQgU291bmRUcmlnZ2VySGFsTGVnYWN5OjpzdG9wUmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQotewotICAgIGlmIChtSHdEZXZpY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcmV0dXJuIG1Id0RldmljZS0+c3RvcF9yZWNvZ25pdGlvbihtSHdEZXZpY2UsIGhhbmRsZSk7Ci19Ci0KLWludCBTb3VuZFRyaWdnZXJIYWxMZWdhY3k6OnN0b3BBbGxSZWNvZ25pdGlvbnMoKQotewotICAgIGlmIChtSHdEZXZpY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgaWYgKG1Id0RldmljZS0+Y29tbW9uLnZlcnNpb24gPj0gU09VTkRfVFJJR0dFUl9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8xICYmCi0gICAgIG1Id0RldmljZS0+c3RvcF9hbGxfcmVjb2duaXRpb25zKSB7Ci0gICAgICAgIHJldHVybiBtSHdEZXZpY2UtPnN0b3BfYWxsX3JlY29nbml0aW9ucyhtSHdEZXZpY2UpOwotICAgIH0KLSAgICByZXR1cm4gLUVOT1NZUzsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbExlZ2FjeS5oIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbExlZ2FjeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjQ4OGRlLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxMZWdhY3kuaAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU09VTkRUUklHR0VSX0hBTF9MRUdBQ1lfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NPVU5EVFJJR0dFUl9IQUxfTEVHQUNZX0gKLQotI2luY2x1ZGUgIlNvdW5kVHJpZ2dlckhhbEludGVyZmFjZS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFNvdW5kVHJpZ2dlckhhbExlZ2FjeSA6IHB1YmxpYyBTb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2UKLQotewotcHVibGljOgotICAgICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5Tb3VuZFRyaWdnZXJIYWxMZWdhY3koKTsKLQotICAgICAgICB2aXJ0dWFsIGludCBnZXRQcm9wZXJ0aWVzKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3Byb3BlcnRpZXMgKnByb3BlcnRpZXMpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIExvYWQgYSBzb3VuZCBtb2RlbC4gT25jZSBsb2FkZWQsIHJlY29nbml0aW9uIG9mIHRoaXMgbW9kZWwgY2FuIGJlIHN0YXJ0ZWQgYW5kIHN0b3BwZWQuCi0gICAgICAgICAqIE9ubHkgb25lIGFjdGl2ZSByZWNvZ25pdGlvbiBwZXIgbW9kZWwgYXQgYSB0aW1lLiBUaGUgU291bmRUcmlnZ2VyIHNlcnZpY2Ugd2lsbCBoYW5kbGUKLSAgICAgICAgICogY29uY3VycmVudCByZWNvZ25pdGlvbiByZXF1ZXN0cyBieSBkaWZmZXJlbnQgdXNlcnMvYXBwbGljYXRpb25zIG9uIHRoZSBzYW1lIG1vZGVsLgotICAgICAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gcmV0dXJucyBhIHVuaXF1ZSBoYW5kbGUgdXNlZCBieSBvdGhlciBmdW5jdGlvbnMgKHVubG9hZF9zb3VuZF9tb2RlbCgpLAotICAgICAgICAgKiBzdGFydF9yZWNvZ25pdGlvbigpLCBldGMuLi4KLSAgICAgICAgICovCi0gICAgICAgIHZpcnR1YWwgaW50IGxvYWRTb3VuZE1vZGVsKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3NvdW5kX21vZGVsICpzb3VuZF9tb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRfbW9kZWxfY2FsbGJhY2tfdCBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29va2llLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZF9tb2RlbF9oYW5kbGVfdCAqaGFuZGxlKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBVbmxvYWQgYSBzb3VuZCBtb2RlbC4gQSBzb3VuZCBtb2RlbCBjYW4gYmUgdW5sb2FkZWQgdG8gbWFrZSByb29tIGZvciBhIG5ldyBvbmUgdG8gb3ZlcmNvbWUKLSAgICAgICAgICogaW1wbGVtZW50YXRpb24gbGltaXRhdGlvbnMuCi0gICAgICAgICAqLwotICAgICAgICB2aXJ0dWFsIGludCB1bmxvYWRTb3VuZE1vZGVsKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7Ci0KLSAgICAgICAgLyogU3RhcnQgcmVjb2duaXRpb24gb24gYSBnaXZlbiBtb2RlbC4gT25seSBvbmUgcmVjb2duaXRpb24gYWN0aXZlIGF0IGEgdGltZSBwZXIgbW9kZWwuCi0gICAgICAgICAqIE9uY2UgcmVjb2duaXRpb24gc3VjY2VlZHMgb2YgZmFpbHMsIHRoZSBjYWxsYmFjayBpcyBjYWxsZWQuCi0gICAgICAgICAqIFRPRE86IGdyb3VwIHJlY29nbml0aW9uIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBpbnRvIG9uZSBzdHJ1Y3QgYW5kIGFkZCBrZXkgcGhyYXNlIG9wdGlvbnMuCi0gICAgICAgICAqLwotICAgICAgICB2aXJ0dWFsIGludCBzdGFydFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb2duaXRpb25fY2FsbGJhY2tfdCBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvb2tpZSk7Ci0KLSAgICAgICAgLyogU3RvcCByZWNvZ25pdGlvbiBvbiBhIGdpdmVuIG1vZGVsLgotICAgICAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgaGF2ZSB0byBjYWxsIHRoZSBjYWxsYmFjayB3aGVuIHN0b3BwZWQgdmlhIHRoaXMgbWV0aG9kLgotICAgICAgICAgKi8KLSAgICAgICAgdmlydHVhbCBpbnQgc3RvcFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7Ci0KLSAgICAgICAgLyogU3RvcCByZWNvZ25pdGlvbiBvbiBhbGwgbW9kZWxzLgotICAgICAgICAgKiBPbmx5IHN1cHBvcnRlZCBmb3IgZGV2aWNlIGFwaSB2ZXJzaW9ucyBTT1VORF9UUklHR0VSX0RFVklDRV9BUElfVkVSU0lPTl8xXzEgb3IgYWJvdmUuCi0gICAgICAgICAqIElmIG5vIGltcGxlbWVudGF0aW9uIGlzIHByb3ZpZGVkLCBzdG9wX3JlY29nbml0aW9uIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoIHJ1bm5pbmcgbW9kZWwuCi0gICAgICAgICAqLwotICAgICAgICBpbnQgc3RvcEFsbFJlY29nbml0aW9ucygpOwotCi0gICAgICAgIC8vIFJlZkJhc2UKLSAgICAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgb25GaXJzdFJlZigpOwotCi1wcml2YXRlOgotCi0gICAgICAgIGZyaWVuZCBjbGFzcyBTb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2U7Ci0KLSAgICAgICAgZXhwbGljaXQgU291bmRUcmlnZ2VySGFsTGVnYWN5KGNvbnN0IGNoYXIgKm1vZHVsZU5hbWUgPSBOVUxMKTsKLQotICAgICAgICBjb25zdCBjaGFyICptTW9kdWxlTmFtZTsKLSAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfaHdfZGV2aWNlKiAgICAgICAgbUh3RGV2aWNlOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TT1VORFRSSUdHRVJfSEFMX0xFR0FDWV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCmluZGV4IGE3ZDZlODMuLmZlMmNjZjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCkBAIC0yNywyMCArMjcsMTYgQEAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KICNpbmNsdWRlIDxzeXN0ZW0vc291bmRfdHJpZ2dlci5oPgotI2luY2x1ZGUgPFNlcnZpY2VVdGlsaXRpZXMuaD4KICNpbmNsdWRlICJTb3VuZFRyaWdnZXJId1NlcnZpY2UuaCIKIAotI2lmZGVmIFNPVU5EX1RSSUdHRVJfVVNFX1NUVUJfTU9EVUxFCi0jZGVmaW5lIEhXX01PRFVMRV9QUkVGSVggInN0dWIiCi0jZWxzZQogI2RlZmluZSBIV19NT0RVTEVfUFJFRklYICJwcmltYXJ5IgotI2VuZGlmCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6U291bmRUcmlnZ2VySHdTZXJ2aWNlKCkKQEAgLTU2MiwxMCArNTU4LDcgQEAKICAgICBpZiAobUhhbEludGVyZmFjZSA9PSAwKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICBpZiAobW9kZWxNZW1vcnkgPT0gMCB8fCBtb2RlbE1lbW9yeS0+cG9pbnRlcigpID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoImxvYWRTb3VuZE1vZGVsKCkgbW9kZWxNZW1vcnkgaXMgMCBvciBoYXMgTlVMTCBwb2ludGVyKCkiKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9CisKICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9zb3VuZF9tb2RlbCAqc291bmRfbW9kZWwgPQogICAgICAgICAgICAgKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3NvdW5kX21vZGVsICopbW9kZWxNZW1vcnktPnBvaW50ZXIoKTsKIApAQCAtNjU5LDExICs2NTIsNiBAQAogICAgIGlmIChtSGFsSW50ZXJmYWNlID09IDApIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIGlmIChkYXRhTWVtb3J5ID09IDAgfHwgZGF0YU1lbW9yeS0+cG9pbnRlcigpID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoInN0YXJ0UmVjb2duaXRpb24oKSBkYXRhTWVtb3J5IGlzIDAgb3IgaGFzIE5VTEwgcG9pbnRlcigpIik7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0KLSAgICB9CiAKICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9jb25maWcgKmNvbmZpZyA9CiAgICAgICAgICAgICAoc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fY29uZmlnICopZGF0YU1lbW9yeS0+cG9pbnRlcigpOwpAQCAtNzI1LDYgKzcxMywyNSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorc3RhdHVzX3QgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGU6OmdldE1vZGVsU3RhdGUoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIEFMT0dWKCJnZXRNb2RlbFN0YXRlKCkgbW9kZWwgaGFuZGxlICVkIiwgaGFuZGxlKTsKKyAgICBpZiAobUhhbEludGVyZmFjZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgc3A8TW9kZWw+IG1vZGVsID0gZ2V0TW9kZWwoaGFuZGxlKTsKKyAgICBpZiAobW9kZWwgPT0gMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChtb2RlbC0+bVN0YXRlICE9IE1vZGVsOjpTVEFURV9BQ1RJVkUpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHJldHVybiBtSGFsSW50ZXJmYWNlLT5nZXRNb2RlbFN0YXRlKGhhbmRsZSk7Cit9CisKIHZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGU6Om9uQ2FsbGJhY2tFdmVudChjb25zdCBzcDxDYWxsYmFja0V2ZW50PiYgZXZlbnQpCiB7CiAgICAgQUxPR1YoIm9uQ2FsbGJhY2tFdmVudCB0eXBlICVkIiwgZXZlbnQtPm1UeXBlKTsKQEAgLTk2Niw2ICs5NzMsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KKyAgICBpZiAoY2hlY2tJTWVtb3J5KG1vZGVsTWVtb3J5KSAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KIAogICAgIHNwPE1vZHVsZT4gbW9kdWxlID0gbU1vZHVsZS5wcm9tb3RlKCk7CiAgICAgaWYgKG1vZHVsZSA9PSAwKSB7CkBAIC05OTcsNiArMTAwNyw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQorICAgIGlmIChjaGVja0lNZW1vcnkoZGF0YU1lbW9yeSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAKICAgICBzcDxNb2R1bGU+IG1vZHVsZSA9IG1Nb2R1bGUucHJvbW90ZSgpOwogICAgIGlmIChtb2R1bGUgPT0gMCkgewpAQCAtMTAyMCw2ICsxMDMzLDIxIEBACiAgICAgcmV0dXJuIG1vZHVsZS0+c3RvcFJlY29nbml0aW9uKGhhbmRsZSk7CiB9CiAKK3N0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlQ2xpZW50OjpnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBBTE9HVigiZ2V0TW9kZWxTdGF0ZSgpIG1vZGVsIGhhbmRsZSAlZCIsIGhhbmRsZSk7CisgICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIHNwPE1vZHVsZT4gbW9kdWxlID0gbU1vZHVsZS5wcm9tb3RlKCk7CisgICAgaWYgKG1vZHVsZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbW9kdWxlLT5nZXRNb2RlbFN0YXRlKGhhbmRsZSk7Cit9CisKIHZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OnNldENhcHR1cmVTdGF0ZV9sKGJvb2wgYWN0aXZlKQogewogICAgIEFMT0dWKCJNb2R1bGVDbGllbnQ6OnNldENhcHR1cmVTdGF0ZV9sICVkIiwgYWN0aXZlKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuaCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuaAppbmRleCA3MDhmYzk4Li40MjU4ZWMwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5oCkBAIC0xMjIsNiArMTIyLDcgQEAKICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0UmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YU1lbW9yeSk7CiAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wUmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1vZGVsU3RhdGUoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKIAogICAgICAgIHNwPFNvdW5kVHJpZ2dlckhhbEludGVyZmFjZT4gaGFsSW50ZXJmYWNlKCkgY29uc3QgeyByZXR1cm4gbUhhbEludGVyZmFjZTsgfQogICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yIGRlc2NyaXB0b3IoKSB7IHJldHVybiBtRGVzY3JpcHRvcjsgfQpAQCAtMTY5LDYgKzE3MCw3IEBACiAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFNZW1vcnkpOwogICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CisgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CiAKICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIApkaWZmIC0tZ2l0IGEvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuY3BwIGIvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuY3BwCmluZGV4IDI1MzMyYTQuLmY1YjRiNTkgMTAwNjQ0Ci0tLSBhL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmNwcAorKysgYi9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5jcHAKQEAgLTMyLDYgKzMyLDcgQEAKICAgICBVTkxPQURfU09VTkRfTU9ERUwsCiAgICAgU1RBUlRfUkVDT0dOSVRJT04sCiAgICAgU1RPUF9SRUNPR05JVElPTiwKKyAgICBHRVRfTU9ERUxfU1RBVEUsCiB9OwogCiBjbGFzcyBCcFNvdW5kVHJpZ2dlcjogcHVibGljIEJwSW50ZXJmYWNlPElTb3VuZFRyaWdnZXI+CkBAIC0xMTMsNiArMTE0LDE4IEBACiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTb3VuZFRyaWdnZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGUoJmhhbmRsZSwgc2l6ZW9mKHNvdW5kX21vZGVsX2hhbmRsZV90KSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfTU9ERUxfU1RBVEUsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKwogfTsKIAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKFNvdW5kVHJpZ2dlciwgImFuZHJvaWQuaGFyZHdhcmUuSVNvdW5kVHJpZ2dlciIpOwpAQCAtMTY5LDYgKzE4MiwxNyBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQorICAgICAgICBjYXNlIEdFVF9NT0RFTF9TVEFURTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTb3VuZFRyaWdnZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IFVOS05PV05fRVJST1I7CisgICAgICAgICAgICBzdGF0dXNfdCByZXQgPSBkYXRhLnJlYWQoJmhhbmRsZSwgc2l6ZW9mKHNvdW5kX21vZGVsX2hhbmRsZV90KSk7CisgICAgICAgICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gZ2V0TW9kZWxTdGF0ZShoYW5kbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5jcHAgYi9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmNwcAppbmRleCAyODliN2IxLi5kMWViMzY3IDEwMDY0NAotLS0gYS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmNwcAorKysgYi9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmNwcApAQCAtMTg4LDYgKzE4OCwxNSBAQAogICAgIHJldHVybiBtSVNvdW5kVHJpZ2dlci0+c3RvcFJlY29nbml0aW9uKGhhbmRsZSk7CiB9CiAKK3N0YXR1c190IFNvdW5kVHJpZ2dlcjo6Z2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUlTb3VuZFRyaWdnZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1JU291bmRUcmlnZ2VyLT5nZXRNb2RlbFN0YXRlKGhhbmRsZSk7Cit9CisKIC8vIEJwU291bmRUcmlnZ2VyQ2xpZW50CiB2b2lkIFNvdW5kVHJpZ2dlcjo6b25SZWNvZ25pdGlvbkV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkKIHsK